From 8e4bff4cab0ddac6060645b0715210484d02ff40 Mon Sep 17 00:00:00 2001 From: Yuval Adam <_@yuv.al> Date: Wed, 30 Aug 2017 08:25:59 +0000 Subject: Initial file dump from open source release --- drivers/input/Kconfig | 221 + drivers/input/Makefile | 30 + drivers/input/apm-power.c | 126 + drivers/input/evbug.c | 119 + drivers/input/evdev.c | 1137 +++ drivers/input/ff-core.c | 382 + drivers/input/ff-memless.c | 547 ++ drivers/input/gameport/Kconfig | 63 + drivers/input/gameport/Makefile | 11 + drivers/input/gameport/emu10k1-gp.c | 128 + drivers/input/gameport/fm801-gp.c | 160 + drivers/input/gameport/gameport.c | 818 ++ drivers/input/gameport/lightning.c | 341 + drivers/input/gameport/ns558.c | 286 + drivers/input/input-compat.c | 136 + drivers/input/input-compat.h | 92 + drivers/input/input-mt.c | 432 + drivers/input/input-polldev.c | 253 + drivers/input/input.c | 2420 ++++++ drivers/input/joydev.c | 956 +++ drivers/input/joystick/Kconfig | 332 + drivers/input/joystick/Makefile | 35 + drivers/input/joystick/a3d.c | 416 + drivers/input/joystick/adi.c | 569 ++ drivers/input/joystick/amijoy.c | 176 + drivers/input/joystick/analog.c | 769 ++ drivers/input/joystick/as5011.c | 373 + drivers/input/joystick/cobra.c | 264 + drivers/input/joystick/db9.c | 720 ++ drivers/input/joystick/gamecon.c | 1054 +++ drivers/input/joystick/gf2k.c | 376 + drivers/input/joystick/grip.c | 427 + drivers/input/joystick/grip_mp.c | 690 ++ drivers/input/joystick/guillemot.c | 284 + drivers/input/joystick/iforce/Kconfig | 32 + drivers/input/joystick/iforce/Makefile | 11 + drivers/input/joystick/iforce/iforce-ff.c | 543 ++ drivers/input/joystick/iforce/iforce-main.c | 489 ++ drivers/input/joystick/iforce/iforce-packets.c | 309 + drivers/input/joystick/iforce/iforce-serio.c | 189 + drivers/input/joystick/iforce/iforce-usb.c | 232 + drivers/input/joystick/iforce/iforce.h | 172 + drivers/input/joystick/interact.c | 314 + drivers/input/joystick/joydump.c | 162 + drivers/input/joystick/magellan.c | 225 + drivers/input/joystick/maplecontrol.c | 193 + drivers/input/joystick/sidewinder.c | 823 ++ drivers/input/joystick/spaceball.c | 299 + drivers/input/joystick/spaceorb.c | 240 + drivers/input/joystick/stinger.c | 211 + drivers/input/joystick/tmdc.c | 439 ++ drivers/input/joystick/turbografx.c | 325 + drivers/input/joystick/twidjoy.c | 260 + drivers/input/joystick/walkera0701.c | 303 + drivers/input/joystick/warrior.c | 220 + drivers/input/joystick/xpad.c | 1085 +++ drivers/input/joystick/zhenhua.c | 228 + drivers/input/keyboard/Kconfig | 677 ++ drivers/input/keyboard/Makefile | 61 + drivers/input/keyboard/adp5520-keys.c | 210 + drivers/input/keyboard/adp5588-keys.c | 661 ++ drivers/input/keyboard/adp5589-keys.c | 1114 +++ drivers/input/keyboard/amikbd.c | 265 + drivers/input/keyboard/atakbd.c | 269 + drivers/input/keyboard/atkbd.c | 1813 +++++ drivers/input/keyboard/bf54x-keys.c | 402 + drivers/input/keyboard/cros_ec_keyb.c | 334 + drivers/input/keyboard/davinci_keyscan.c | 336 + drivers/input/keyboard/ep93xx_keypad.c | 390 + drivers/input/keyboard/goldfish_events.c | 194 + drivers/input/keyboard/gpio_keys.c | 977 +++ drivers/input/keyboard/gpio_keys_polled.c | 377 + drivers/input/keyboard/gpio_keys_sprd.c | 938 +++ drivers/input/keyboard/hil_kbd.c | 586 ++ drivers/input/keyboard/hilkbd.c | 398 + drivers/input/keyboard/hpps2atkbd.h | 110 + drivers/input/keyboard/imx_keypad.c | 601 ++ drivers/input/keyboard/input-hook.c | 139 + drivers/input/keyboard/jornada680_kbd.c | 268 + drivers/input/keyboard/jornada720_kbd.c | 178 + drivers/input/keyboard/lkkbd.c | 734 ++ drivers/input/keyboard/lm8323.c | 861 ++ drivers/input/keyboard/lm8333.c | 235 + drivers/input/keyboard/locomokbd.c | 362 + drivers/input/keyboard/lpc32xx-keys.c | 395 + drivers/input/keyboard/maple_keyb.c | 260 + drivers/input/keyboard/matrix_keypad.c | 580 ++ drivers/input/keyboard/max7359_keypad.c | 323 + drivers/input/keyboard/mcs_touchkey.c | 284 + drivers/input/keyboard/mpr121_touchkey.c | 337 + drivers/input/keyboard/newtonkbd.c | 169 + drivers/input/keyboard/nomadik-ske-keypad.c | 438 ++ drivers/input/keyboard/omap-keypad.c | 395 + drivers/input/keyboard/omap4-keypad.c | 449 ++ drivers/input/keyboard/opencores-kbd.c | 170 + drivers/input/keyboard/pmic8xxx-keypad.c | 789 ++ drivers/input/keyboard/pxa27x_keypad.c | 635 ++ drivers/input/keyboard/pxa930_rotary.c | 202 + drivers/input/keyboard/qt1070.c | 266 + drivers/input/keyboard/qt2160.c | 513 ++ drivers/input/keyboard/samsung-keypad.c | 661 ++ drivers/input/keyboard/sc_keypad.c | 802 ++ drivers/input/keyboard/sh_keysc.c | 344 + drivers/input/keyboard/spear-keyboard.c | 404 + drivers/input/keyboard/sprd_eic_keys.c | 467 ++ drivers/input/keyboard/stmpe-keypad.c | 399 + drivers/input/keyboard/stowaway.c | 173 + drivers/input/keyboard/sunkbd.c | 372 + drivers/input/keyboard/tc3589x-keypad.c | 458 ++ drivers/input/keyboard/tca6416-keypad.c | 383 + drivers/input/keyboard/tca8418_keypad.c | 421 + drivers/input/keyboard/tegra-kbc.c | 833 ++ drivers/input/keyboard/tnetv107x-keypad.c | 331 + drivers/input/keyboard/twl4030_keypad.c | 466 ++ drivers/input/keyboard/w90p910_keypad.c | 271 + drivers/input/keyboard/xtkbd.c | 172 + drivers/input/keycombo.c | 261 + drivers/input/keyreset.c | 145 + drivers/input/matrix-keymap.c | 207 + drivers/input/misc/88pm80x_onkey.c | 168 + drivers/input/misc/88pm860x_onkey.c | 170 + drivers/input/misc/Kconfig | 776 ++ drivers/input/misc/Makefile | 81 + drivers/input/misc/ab8500-ponkey.c | 155 + drivers/input/misc/ad714x-i2c.c | 123 + drivers/input/misc/ad714x-spi.c | 130 + drivers/input/misc/ad714x.c | 1261 +++ drivers/input/misc/ad714x.h | 55 + drivers/input/misc/adxl34x-i2c.c | 155 + drivers/input/misc/adxl34x-spi.c | 136 + drivers/input/misc/adxl34x.c | 914 +++ drivers/input/misc/adxl34x.h | 30 + drivers/input/misc/al3006_pls.c | 838 ++ drivers/input/misc/apanel.c | 350 + drivers/input/misc/arizona-haptics.c | 252 + drivers/input/misc/ati_remote2.c | 1016 +++ drivers/input/misc/atlas_btns.c | 159 + drivers/input/misc/bfin_rotary.c | 272 + drivers/input/misc/bma150.c | 668 ++ drivers/input/misc/bma2x2.c | 7564 ++++++++++++++++++ drivers/input/misc/bs_log.h | 167 + drivers/input/misc/bstclass.c | 234 + drivers/input/misc/bstclass.h | 74 + drivers/input/misc/cm109.c | 918 +++ drivers/input/misc/cma3000_d0x.c | 399 + drivers/input/misc/cma3000_d0x.h | 42 + drivers/input/misc/cma3000_d0x_i2c.c | 132 + drivers/input/misc/cobalt_btns.c | 166 + drivers/input/misc/da9052_onkey.c | 158 + drivers/input/misc/da9055_onkey.c | 171 + drivers/input/misc/dm355evm_keys.c | 273 + drivers/input/misc/epl2182_pls_v2.c | 1496 ++++ drivers/input/misc/epl259x.c | 4645 +++++++++++ drivers/input/misc/ewtsa.c | 2763 +++++++ drivers/input/misc/gp2ap002a00f.c | 288 + drivers/input/misc/gpio_axis.c | 192 + drivers/input/misc/gpio_event.c | 228 + drivers/input/misc/gpio_input.c | 390 + drivers/input/misc/gpio_matrix.c | 441 ++ drivers/input/misc/gpio_output.c | 97 + drivers/input/misc/gpio_tilt_polled.c | 213 + drivers/input/misc/headset.c | 462 ++ drivers/input/misc/headset_sprd.c | 2377 ++++++ drivers/input/misc/headset_sprd_sc2723.c | 1920 +++++ drivers/input/misc/hp_sdc_rtc.c | 730 ++ drivers/input/misc/ims-pcu.c | 1901 +++++ drivers/input/misc/ixp4xx-beeper.c | 172 + drivers/input/misc/keychord.c | 391 + drivers/input/misc/keyspan_remote.c | 597 ++ drivers/input/misc/kxtj9.c | 674 ++ drivers/input/misc/lis3dh.c | 1707 ++++ drivers/input/misc/lis3dh_interrupt.c | 2261 ++++++ drivers/input/misc/lis3dh_zt.c | 1729 ++++ drivers/input/misc/ltr_558als.c | 1236 +++ drivers/input/misc/m68kspkr.c | 151 + drivers/input/misc/max8925_onkey.c | 201 + drivers/input/misc/max8997_haptic.c | 407 + drivers/input/misc/mc13783-pwrbutton.c | 272 + drivers/input/misc/mma8450.c | 254 + drivers/input/misc/mpu3050.c | 482 ++ drivers/input/misc/pcap_keys.c | 133 + drivers/input/misc/pcf50633-input.c | 121 + drivers/input/misc/pcf8574_keypad.c | 223 + drivers/input/misc/pcspkr.c | 138 + drivers/input/misc/pm8xxx-vibrator.c | 285 + drivers/input/misc/pmic8xxx-pwrkey.c | 221 + drivers/input/misc/powermate.c | 453 ++ drivers/input/misc/pwm-beeper.c | 200 + drivers/input/misc/rb532_button.c | 108 + drivers/input/misc/retu-pwrbutton.c | 99 + drivers/input/misc/rotary_encoder.c | 339 + drivers/input/misc/sgi_btns.c | 169 + drivers/input/misc/sparcspkr.c | 372 + drivers/input/misc/stk3x1x.c | 4262 ++++++++++ drivers/input/misc/stk3x1x.h | 31 + drivers/input/misc/tmd2771_pls.c | 1591 ++++ drivers/input/misc/twl4030-pwrbutton.c | 125 + drivers/input/misc/twl4030-vibra.c | 263 + drivers/input/misc/twl6040-vibra.c | 431 + drivers/input/misc/uinput.c | 883 +++ drivers/input/misc/wistron_btns.c | 1389 ++++ drivers/input/misc/wm831x-on.c | 151 + drivers/input/misc/xen-kbdfront.c | 396 + drivers/input/misc/yealink.c | 1008 +++ drivers/input/misc/yealink.h | 220 + drivers/input/mouse/Kconfig | 376 + drivers/input/mouse/Makefile | 36 + drivers/input/mouse/alps.c | 1853 +++++ drivers/input/mouse/alps.h | 176 + drivers/input/mouse/amimouse.c | 151 + drivers/input/mouse/appletouch.c | 948 +++ drivers/input/mouse/atarimouse.c | 158 + drivers/input/mouse/bcm5974.c | 984 +++ drivers/input/mouse/cyapa.c | 973 +++ drivers/input/mouse/cypress_ps2.c | 718 ++ drivers/input/mouse/cypress_ps2.h | 191 + drivers/input/mouse/elantech.c | 1479 ++++ drivers/input/mouse/elantech.h | 157 + drivers/input/mouse/gpio_mouse.c | 187 + drivers/input/mouse/hgpk.c | 1067 +++ drivers/input/mouse/hgpk.h | 67 + drivers/input/mouse/inport.c | 196 + drivers/input/mouse/lifebook.c | 352 + drivers/input/mouse/lifebook.h | 32 + drivers/input/mouse/logibm.c | 185 + drivers/input/mouse/logips2pp.c | 425 + drivers/input/mouse/logips2pp.h | 23 + drivers/input/mouse/maplemouse.c | 150 + drivers/input/mouse/navpoint.c | 369 + drivers/input/mouse/pc110pad.c | 179 + drivers/input/mouse/psmouse-base.c | 1849 +++++ drivers/input/mouse/psmouse.h | 184 + drivers/input/mouse/pxa930_trkball.c | 257 + drivers/input/mouse/rpcmouse.c | 116 + drivers/input/mouse/sentelic.c | 1087 +++ drivers/input/mouse/sentelic.h | 138 + drivers/input/mouse/sermouse.c | 358 + drivers/input/mouse/synaptics.c | 1782 +++++ drivers/input/mouse/synaptics.h | 200 + drivers/input/mouse/synaptics_i2c.c | 675 ++ drivers/input/mouse/synaptics_usb.c | 557 ++ drivers/input/mouse/touchkit_ps2.c | 100 + drivers/input/mouse/touchkit_ps2.h | 25 + drivers/input/mouse/trackpoint.c | 421 + drivers/input/mouse/trackpoint.h | 156 + drivers/input/mouse/vsxxxaa.c | 551 ++ drivers/input/mousedev.c | 1128 +++ drivers/input/serio/Kconfig | 259 + drivers/input/serio/Makefile | 29 + drivers/input/serio/altera_ps2.c | 202 + drivers/input/serio/ambakmi.c | 215 + drivers/input/serio/ams_delta_serio.c | 191 + drivers/input/serio/apbps2.c | 228 + drivers/input/serio/arc_ps2.c | 285 + drivers/input/serio/at32psif.c | 366 + drivers/input/serio/ct82c710.c | 261 + drivers/input/serio/gscps2.c | 464 ++ drivers/input/serio/hil_mlc.c | 1016 +++ drivers/input/serio/hp_sdc.c | 1135 +++ drivers/input/serio/hp_sdc_mlc.c | 358 + drivers/input/serio/i8042-io.h | 95 + drivers/input/serio/i8042-ip22io.h | 76 + drivers/input/serio/i8042-jazzio.h | 69 + drivers/input/serio/i8042-ppcio.h | 61 + drivers/input/serio/i8042-snirm.h | 75 + drivers/input/serio/i8042-sparcio.h | 157 + drivers/input/serio/i8042-unicore32io.h | 73 + drivers/input/serio/i8042-x86ia64io.h | 1021 +++ drivers/input/serio/i8042.c | 1502 ++++ drivers/input/serio/i8042.h | 109 + drivers/input/serio/libps2.c | 375 + drivers/input/serio/maceps2.c | 210 + drivers/input/serio/parkbd.c | 218 + drivers/input/serio/pcips2.c | 222 + drivers/input/serio/ps2mult.c | 307 + drivers/input/serio/q40kbd.c | 196 + drivers/input/serio/rpckbd.c | 175 + drivers/input/serio/sa1111ps2.c | 378 + drivers/input/serio/serio.c | 1035 +++ drivers/input/serio/serio_raw.c | 445 ++ drivers/input/serio/serport.c | 299 + drivers/input/serio/xilinx_ps2.c | 378 + drivers/input/sparse-keymap.c | 332 + drivers/input/tablet/Kconfig | 92 + drivers/input/tablet/Makefile | 13 + drivers/input/tablet/acecad.c | 279 + drivers/input/tablet/aiptek.c | 1941 +++++ drivers/input/tablet/gtco.c | 1034 +++ drivers/input/tablet/hanwang.c | 462 ++ drivers/input/tablet/kbtab.c | 208 + drivers/input/tablet/wacom.h | 140 + drivers/input/tablet/wacom_sys.c | 1453 ++++ drivers/input/tablet/wacom_wac.c | 2266 ++++++ drivers/input/tablet/wacom_wac.h | 142 + drivers/input/touchscreen/88pm860x-ts.c | 321 + drivers/input/touchscreen/Kconfig | 1049 +++ drivers/input/touchscreen/Makefile | 87 + drivers/input/touchscreen/ad7877.c | 868 +++ drivers/input/touchscreen/ad7879-i2c.c | 109 + drivers/input/touchscreen/ad7879-spi.c | 165 + drivers/input/touchscreen/ad7879.c | 654 ++ drivers/input/touchscreen/ad7879.h | 30 + drivers/input/touchscreen/ads7846.c | 1449 ++++ drivers/input/touchscreen/atmel-wm97xx.c | 439 ++ drivers/input/touchscreen/atmel_mxt_ts.c | 1342 ++++ drivers/input/touchscreen/atmel_tsadcc.c | 359 + drivers/input/touchscreen/auo-pixcir-ts.c | 704 ++ drivers/input/touchscreen/bu21013_ts.c | 733 ++ drivers/input/touchscreen/cy8ctmg110_ts.c | 367 + drivers/input/touchscreen/cyttsp_core.c | 639 ++ drivers/input/touchscreen/cyttsp_core.h | 149 + drivers/input/touchscreen/cyttsp_i2c.c | 136 + drivers/input/touchscreen/cyttsp_spi.c | 199 + drivers/input/touchscreen/da9034-ts.c | 387 + drivers/input/touchscreen/da9052_tsi.c | 351 + drivers/input/touchscreen/dynapro.c | 191 + drivers/input/touchscreen/edt-ft5x06.c | 892 +++ drivers/input/touchscreen/eeti_ts.c | 331 + drivers/input/touchscreen/egalax_ts.c | 311 + drivers/input/touchscreen/elo.c | 408 + ...5306_Spreadtrum_tiger_TRYLY_COB_0x2c_app_3.3V.h | 1660 ++++ .../FT5306_Spreadtrum_tiger_TRYLY_COB_0x2e_app.h | 1660 ++++ .../focaltech/FT6x06_4Column_V02_20140901_app.h | 1386 ++++ .../FT6x06_4Column_Ver0x03_20141117_app.h | 1310 ++++ .../FT6x06_4Column_Ver0x11_20141206_app.h | 1339 ++++ .../FT6x06_4Column_Ver0x12_20150227_app.h | 1285 +++ .../focaltech/Ft5x16_720P_Ver0x0f_app.h | 1275 +++ .../focaltech/Ft5x16_720P_Ver0x23_test_app.h | 1485 ++++ drivers/input/touchscreen/focaltech/Makefile | 11 + drivers/input/touchscreen/focaltech/focaltech.c | 1053 +++ .../input/touchscreen/focaltech/focaltech_ctl.c | 334 + .../input/touchscreen/focaltech/focaltech_ex_fun.c | 1321 ++++ drivers/input/touchscreen/ft5x0x_ts_v1.c | 1691 ++++ drivers/input/touchscreen/fujitsu_ts.c | 178 + drivers/input/touchscreen/goodix/Makefile | 5 + drivers/input/touchscreen/goodix/goodix_tool.c | 548 ++ drivers/input/touchscreen/goodix/gt9xx.c | 2408 ++++++ drivers/input/touchscreen/goodix/gt9xx.h | 340 + drivers/input/touchscreen/goodix/gt9xx_update.c | 2716 +++++++ drivers/input/touchscreen/gunze.c | 189 + drivers/input/touchscreen/hampshire.c | 190 + drivers/input/touchscreen/hp680_ts_input.c | 127 + drivers/input/touchscreen/htcpen.c | 250 + drivers/input/touchscreen/ili210x.c | 360 + drivers/input/touchscreen/inexio.c | 192 + drivers/input/touchscreen/intel-mid-touch.c | 671 ++ drivers/input/touchscreen/ist30xx/Makefile | 7 + .../ist30xx/firmware/IST3038_FW_KANAS.h | 2572 ++++++ .../firmware/ist3038_fw_kanas_ver0001_20140225.h | 2572 ++++++ .../firmware/ist3038_fw_kanas_ver0001_20140226.h | 2572 ++++++ .../firmware/ist3038_fw_kanas_ver0002_20140301.h | 2572 ++++++ .../firmware/ist3038_fw_kanas_ver0003_20140310.h | 2572 ++++++ .../firmware/ist3038_fw_kanas_ver0005_20140323.h | 2572 ++++++ .../firmware/ist3038_fw_kanas_ver0006_20140401.h | 2572 ++++++ .../ist30xx/firmware/ist3038_fw_tshark_ver0007.h | 2572 ++++++ drivers/input/touchscreen/ist30xx/ist30xx.c | 1625 ++++ drivers/input/touchscreen/ist30xx/ist30xx.h | 340 + drivers/input/touchscreen/ist30xx/ist30xx_misc.c | 1284 +++ drivers/input/touchscreen/ist30xx/ist30xx_misc.h | 81 + drivers/input/touchscreen/ist30xx/ist30xx_sec.c | 913 +++ drivers/input/touchscreen/ist30xx/ist30xx_sec.h | 36 + drivers/input/touchscreen/ist30xx/ist30xx_sys.c | 327 + .../input/touchscreen/ist30xx/ist30xx_tracking.c | 235 + .../input/touchscreen/ist30xx/ist30xx_tracking.h | 57 + drivers/input/touchscreen/ist30xx/ist30xx_tsp.h | 52 + drivers/input/touchscreen/ist30xx/ist30xx_update.c | 1449 ++++ drivers/input/touchscreen/ist30xx/ist30xx_update.h | 133 + drivers/input/touchscreen/ist30xxa/Makefile | 7 + .../touchscreen/ist30xxa/firmware/core_prime.h | 2573 ++++++ drivers/input/touchscreen/ist30xxa/ist30xx.c | 1339 ++++ drivers/input/touchscreen/ist30xxa/ist30xx.h | 300 + .../input/touchscreen/ist30xxa/ist30xx_chkic_bin.h | 53 + drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.c | 1345 ++++ drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.h | 131 + .../input/touchscreen/ist30xxa/ist30xx_cmcs_bin.h | 284 + drivers/input/touchscreen/ist30xxa/ist30xx_misc.c | 1582 ++++ drivers/input/touchscreen/ist30xxa/ist30xx_misc.h | 93 + drivers/input/touchscreen/ist30xxa/ist30xx_sec.c | 916 +++ drivers/input/touchscreen/ist30xxa/ist30xx_sec.h | 36 + drivers/input/touchscreen/ist30xxa/ist30xx_sys.c | 308 + .../input/touchscreen/ist30xxa/ist30xx_tracking.c | 236 + .../input/touchscreen/ist30xxa/ist30xx_tracking.h | 57 + drivers/input/touchscreen/ist30xxa/ist30xx_tsp.h | 52 + .../input/touchscreen/ist30xxa/ist30xx_update.c | 1349 ++++ .../input/touchscreen/ist30xxa/ist30xx_update.h | 139 + .../ist30xxb/IST30xxB_FW_Corsica_VE_Ver0003.h | 2156 +++++ .../ist30xxb/IST30xxB_FW_Corsica_VE_Ver0007.h | 2162 +++++ .../ist30xxb/IST30xxB_FW_Star2_Ver0002.h | 2163 +++++ .../ist30xxb/IST30xxB_FW_vivalto_Ver0001_fw.h | 2163 +++++ drivers/input/touchscreen/ist30xxb/Makefile | 6 + drivers/input/touchscreen/ist30xxb/ist30xxb.c | 1261 +++ .../input/touchscreen/ist30xxb/ist30xxb_factory.c | 592 ++ .../ist30xxb/ist30xxb_fw_pikeayoung2dtv_ver0001.h | 2166 ++++++ .../ist30xxb/ist30xxb_fw_young2_ver0001.h | 2166 ++++++ drivers/input/touchscreen/ist30xxb/ist30xxb_misc.c | 1142 +++ drivers/input/touchscreen/ist30xxb/ist30xxb_misc.h | 79 + drivers/input/touchscreen/ist30xxb/ist30xxb_sec.c | 831 ++ drivers/input/touchscreen/ist30xxb/ist30xxb_sec.h | 36 + .../input/touchscreen/ist30xxb/ist30xxb_sec_test.c | 582 ++ .../input/touchscreen/ist30xxb/ist30xxb_sec_tsp.h | 36 + drivers/input/touchscreen/ist30xxb/ist30xxb_sys.c | 413 + .../input/touchscreen/ist30xxb/ist30xxb_tracking.c | 205 + .../input/touchscreen/ist30xxb/ist30xxb_tracking.h | 51 + drivers/input/touchscreen/ist30xxb/ist30xxb_tsp.h | 54 + .../input/touchscreen/ist30xxb/ist30xxb_update.c | 1363 ++++ .../input/touchscreen/ist30xxb/ist30xxb_update.h | 114 + drivers/input/touchscreen/ist30xxc/Makefile | 7 + .../ist30xxc/firmware/coreprimeve3g_fw.h | 2134 +++++ .../touchscreen/ist30xxc/firmware/ist30xxc_fw.h | 4054 ++++++++++ .../touchscreen/ist30xxc/firmware/j7mlte_fw.h | 4054 ++++++++++ .../touchscreen/ist30xxc/firmware/ss_sharklt8_fw.h | 4054 ++++++++++ drivers/input/touchscreen/ist30xxc/ist30xxc.c | 1566 ++++ drivers/input/touchscreen/ist30xxc/ist30xxc.h | 514 ++ drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.c | 1548 ++++ drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.h | 160 + .../input/touchscreen/ist30xxc/ist30xxc_cmcs_bin.h | 625 ++ drivers/input/touchscreen/ist30xxc/ist30xxc_misc.c | 1502 ++++ drivers/input/touchscreen/ist30xxc/ist30xxc_misc.h | 36 + drivers/input/touchscreen/ist30xxc/ist30xxc_sec.c | 1402 ++++ drivers/input/touchscreen/ist30xxc/ist30xxc_sec.h | 33 + drivers/input/touchscreen/ist30xxc/ist30xxc_sys.c | 481 ++ .../input/touchscreen/ist30xxc/ist30xxc_tracking.c | 231 + .../input/touchscreen/ist30xxc/ist30xxc_tracking.h | 61 + .../input/touchscreen/ist30xxc/ist30xxc_update.c | 1474 ++++ .../input/touchscreen/ist30xxc/ist30xxc_update.h | 101 + .../ito_test/open_test_ANA1_8861A_lianchuang.h | 527 ++ .../ito_test/open_test_ANA1_B_8861A_lianchuang.h | 494 ++ .../ito_test/open_test_ANA2_8861A_lianchuang.h | 506 ++ .../ito_test/open_test_ANA2_B_8861A_lianchuang.h | 494 ++ .../ito_test/open_test_ANA3_8861A_lianchuang.h | 504 ++ drivers/input/touchscreen/jornada720_ts.c | 177 + drivers/input/touchscreen/lpc32xx_ts.c | 410 + drivers/input/touchscreen/mainstone-wm97xx.c | 310 + drivers/input/touchscreen/max11801_ts.c | 262 + drivers/input/touchscreen/mc13783_ts.c | 258 + drivers/input/touchscreen/mcs5000_ts.c | 310 + drivers/input/touchscreen/migor_ts.c | 249 + drivers/input/touchscreen/mk712.c | 219 + drivers/input/touchscreen/mms100s_ts.c | 1593 ++++ drivers/input/touchscreen/mms114.c | 596 ++ drivers/input/touchscreen/mms134s/Makefile | 6 + drivers/input/touchscreen/mms134s/mms134s.c | 1134 +++ drivers/input/touchscreen/mms134s/mms134s_fw.h | 1296 +++ drivers/input/touchscreen/mms134s/mms134s_sec.c | 1000 +++ drivers/input/touchscreen/mms136_ts.c | 4039 ++++++++++ drivers/input/touchscreen/mms_ts_fw.h | 29 + drivers/input/touchscreen/msg2138.c | 4581 +++++++++++ drivers/input/touchscreen/msg2138/Makefile | 10 + .../touchscreen/msg2138/msg2xxx_xxxx_update_bin.h | 2112 +++++ .../input/touchscreen/msg2138/mstar_drv_common.c | 152 + .../input/touchscreen/msg2138/mstar_drv_common.h | 359 + .../msg2138/mstar_drv_ic_fw_porting_layer.c | 195 + .../msg2138/mstar_drv_ic_fw_porting_layer.h | 90 + drivers/input/touchscreen/msg2138/mstar_drv_main.c | 993 +++ drivers/input/touchscreen/msg2138/mstar_drv_main.h | 89 + .../msg2138/mstar_drv_platform_interface.c | 209 + .../msg2138/mstar_drv_platform_interface.h | 47 + .../msg2138/mstar_drv_platform_porting_layer.c | 553 ++ .../msg2138/mstar_drv_platform_porting_layer.h | 125 + .../msg2138/mstar_drv_self_fw_control.c | 3974 ++++++++++ .../msg2138/mstar_drv_self_fw_control.h | 154 + .../touchscreen/msg2138/mstar_drv_self_mp_test.c | 2514 ++++++ .../touchscreen/msg2138/mstar_drv_self_mp_test.h | 99 + drivers/input/touchscreen/msg2138/mstar_drv_sprd.c | 238 + .../msg2138/mstar_drv_utility_adaption.c | 405 + .../msg2138/mstar_drv_utility_adaption.h | 101 + drivers/input/touchscreen/msg2233/Makefile | 20 + .../touchscreen/msg2233/msg21xxa_xxxx_update_bin.h | 3106 ++++++++ .../touchscreen/msg2233/msg21xxa_yyyy_update_bin.h | 3106 ++++++++ .../touchscreen/msg2233/msg22xx_xxxx_update_bin.h | 3106 ++++++++ .../touchscreen/msg2233/msg22xx_yyyy_update_bin.h | 3106 ++++++++ .../input/touchscreen/msg2233/mstar_drv_common.c | 155 + .../input/touchscreen/msg2233/mstar_drv_common.h | 548 ++ .../input/touchscreen/msg2233/mstar_drv_extern.h | 46 + .../input/touchscreen/msg2233/mstar_drv_hotknot.c | 848 ++ .../input/touchscreen/msg2233/mstar_drv_hotknot.h | 332 + .../touchscreen/msg2233/mstar_drv_hotknot_queue.c | 281 + .../touchscreen/msg2233/mstar_drv_hotknot_queue.h | 63 + .../msg2233/mstar_drv_ic_fw_porting_layer.c | 313 + .../msg2233/mstar_drv_ic_fw_porting_layer.h | 119 + .../touchscreen/msg2233/mstar_drv_jni_interface.c | 287 + .../touchscreen/msg2233/mstar_drv_jni_interface.h | 91 + drivers/input/touchscreen/msg2233/mstar_drv_main.c | 3379 ++++++++ drivers/input/touchscreen/msg2233/mstar_drv_main.h | 186 + drivers/input/touchscreen/msg2233/mstar_drv_mtk.c | 275 + .../msg2233/mstar_drv_mutual_fw_control.c | 6412 +++++++++++++++ .../msg2233/mstar_drv_mutual_fw_control.h | 203 + .../touchscreen/msg2233/mstar_drv_mutual_mp_test.c | 3421 ++++++++ .../touchscreen/msg2233/mstar_drv_mutual_mp_test.h | 94 + .../msg2233/mstar_drv_platform_interface.c | 448 ++ .../msg2233/mstar_drv_platform_interface.h | 50 + .../msg2233/mstar_drv_platform_porting_layer.c | 910 +++ .../msg2233/mstar_drv_platform_porting_layer.h | 178 + drivers/input/touchscreen/msg2233/mstar_drv_qcom.c | 156 + .../msg2233/mstar_drv_self_fw_control.c | 5747 ++++++++++++++ .../msg2233/mstar_drv_self_fw_control.h | 185 + .../touchscreen/msg2233/mstar_drv_self_mp_test.c | 2805 +++++++ .../touchscreen/msg2233/mstar_drv_self_mp_test.h | 101 + drivers/input/touchscreen/msg2233/mstar_drv_sprd.c | 242 + .../msg2233/mstar_drv_utility_adaption.c | 1157 +++ .../msg2233/mstar_drv_utility_adaption.h | 109 + drivers/input/touchscreen/mtouch.c | 205 + drivers/input/touchscreen/pcap_ts.c | 260 + drivers/input/touchscreen/penmount.c | 320 + drivers/input/touchscreen/pixcir_i2c_ts.c | 229 + drivers/input/touchscreen/qt602240_ts.c | 1679 ++++ drivers/input/touchscreen/s3c2410_ts.c | 441 ++ drivers/input/touchscreen/st1232.c | 310 + drivers/input/touchscreen/stmpe-ts.c | 398 + drivers/input/touchscreen/ti_am335x_tsc.c | 398 + drivers/input/touchscreen/tnetv107x-ts.c | 386 + drivers/input/touchscreen/touchit213.c | 219 + drivers/input/touchscreen/touchright.c | 179 + drivers/input/touchscreen/touchwin.c | 186 + drivers/input/touchscreen/tp_sprd.c | 802 ++ drivers/input/touchscreen/tps6507x-ts.c | 377 + drivers/input/touchscreen/tsc2005.c | 756 ++ drivers/input/touchscreen/tsc2007.c | 406 + drivers/input/touchscreen/tsc40.c | 173 + drivers/input/touchscreen/ucb1400_ts.c | 467 ++ drivers/input/touchscreen/usbtouchscreen.c | 1759 +++++ drivers/input/touchscreen/w90p910_ts.c | 339 + drivers/input/touchscreen/wacom_i2c.c | 282 + drivers/input/touchscreen/wacom_w8001.c | 597 ++ drivers/input/touchscreen/wm831x-ts.c | 407 + drivers/input/touchscreen/wm9705.c | 350 + drivers/input/touchscreen/wm9712.c | 471 ++ drivers/input/touchscreen/wm9713.c | 481 ++ drivers/input/touchscreen/wm97xx-core.c | 859 ++ drivers/input/touchscreen/zinitix_bt541_firmware.h | 4127 ++++++++++ drivers/input/touchscreen/zinitix_bt541_ts.c | 6284 +++++++++++++++ drivers/input/touchscreen/zinitix_touch.c | 3858 +++++++++ drivers/input/touchscreen/zinitix_touch.h | 249 + drivers/input/touchscreen/zinitix_touch_bt404.c | 3525 +++++++++ drivers/input/touchscreen/zinitix_touch_bt404.h | 222 + .../touchscreen/zinitix_touch_bt4x3_firmware.h | 4126 ++++++++++ .../touchscreen/zinitix_touch_bt4x3_reg_data.h | 366 + .../touchscreen/zinitix_touch_bt4x4_firmware.h | 4126 ++++++++++ .../input/touchscreen/zinitix_touch_zxt_firmware.h | 8223 ++++++++++++++++++++ drivers/input/touchscreen/zt7554_ts.c | 3187 ++++++++ drivers/input/touchscreen/zt7554_ts.h | 516 ++ drivers/input/touchscreen/zt7554_ts_spec.h | 132 + drivers/input/touchscreen/zylonite-wm97xx.c | 232 + 543 files changed, 396124 insertions(+) create mode 100644 drivers/input/Kconfig create mode 100644 drivers/input/Makefile create mode 100644 drivers/input/apm-power.c create mode 100644 drivers/input/evbug.c create mode 100644 drivers/input/evdev.c create mode 100644 drivers/input/ff-core.c create mode 100644 drivers/input/ff-memless.c create mode 100644 drivers/input/gameport/Kconfig create mode 100644 drivers/input/gameport/Makefile create mode 100644 drivers/input/gameport/emu10k1-gp.c create mode 100644 drivers/input/gameport/fm801-gp.c create mode 100644 drivers/input/gameport/gameport.c create mode 100644 drivers/input/gameport/lightning.c create mode 100644 drivers/input/gameport/ns558.c create mode 100644 drivers/input/input-compat.c create mode 100644 drivers/input/input-compat.h create mode 100644 drivers/input/input-mt.c create mode 100644 drivers/input/input-polldev.c create mode 100644 drivers/input/input.c create mode 100644 drivers/input/joydev.c create mode 100644 drivers/input/joystick/Kconfig create mode 100644 drivers/input/joystick/Makefile create mode 100644 drivers/input/joystick/a3d.c create mode 100644 drivers/input/joystick/adi.c create mode 100644 drivers/input/joystick/amijoy.c create mode 100644 drivers/input/joystick/analog.c create mode 100644 drivers/input/joystick/as5011.c create mode 100644 drivers/input/joystick/cobra.c create mode 100644 drivers/input/joystick/db9.c create mode 100644 drivers/input/joystick/gamecon.c create mode 100644 drivers/input/joystick/gf2k.c create mode 100644 drivers/input/joystick/grip.c create mode 100644 drivers/input/joystick/grip_mp.c create mode 100644 drivers/input/joystick/guillemot.c create mode 100644 drivers/input/joystick/iforce/Kconfig create mode 100644 drivers/input/joystick/iforce/Makefile create mode 100644 drivers/input/joystick/iforce/iforce-ff.c create mode 100644 drivers/input/joystick/iforce/iforce-main.c create mode 100644 drivers/input/joystick/iforce/iforce-packets.c create mode 100644 drivers/input/joystick/iforce/iforce-serio.c create mode 100644 drivers/input/joystick/iforce/iforce-usb.c create mode 100644 drivers/input/joystick/iforce/iforce.h create mode 100644 drivers/input/joystick/interact.c create mode 100644 drivers/input/joystick/joydump.c create mode 100644 drivers/input/joystick/magellan.c create mode 100644 drivers/input/joystick/maplecontrol.c create mode 100644 drivers/input/joystick/sidewinder.c create mode 100644 drivers/input/joystick/spaceball.c create mode 100644 drivers/input/joystick/spaceorb.c create mode 100644 drivers/input/joystick/stinger.c create mode 100644 drivers/input/joystick/tmdc.c create mode 100644 drivers/input/joystick/turbografx.c create mode 100644 drivers/input/joystick/twidjoy.c create mode 100644 drivers/input/joystick/walkera0701.c create mode 100644 drivers/input/joystick/warrior.c create mode 100644 drivers/input/joystick/xpad.c create mode 100644 drivers/input/joystick/zhenhua.c create mode 100644 drivers/input/keyboard/Kconfig create mode 100644 drivers/input/keyboard/Makefile create mode 100644 drivers/input/keyboard/adp5520-keys.c create mode 100644 drivers/input/keyboard/adp5588-keys.c create mode 100644 drivers/input/keyboard/adp5589-keys.c create mode 100644 drivers/input/keyboard/amikbd.c create mode 100644 drivers/input/keyboard/atakbd.c create mode 100644 drivers/input/keyboard/atkbd.c create mode 100644 drivers/input/keyboard/bf54x-keys.c create mode 100644 drivers/input/keyboard/cros_ec_keyb.c create mode 100644 drivers/input/keyboard/davinci_keyscan.c create mode 100644 drivers/input/keyboard/ep93xx_keypad.c create mode 100644 drivers/input/keyboard/goldfish_events.c create mode 100644 drivers/input/keyboard/gpio_keys.c create mode 100644 drivers/input/keyboard/gpio_keys_polled.c create mode 100644 drivers/input/keyboard/gpio_keys_sprd.c create mode 100644 drivers/input/keyboard/hil_kbd.c create mode 100644 drivers/input/keyboard/hilkbd.c create mode 100644 drivers/input/keyboard/hpps2atkbd.h create mode 100644 drivers/input/keyboard/imx_keypad.c create mode 100644 drivers/input/keyboard/input-hook.c create mode 100644 drivers/input/keyboard/jornada680_kbd.c create mode 100644 drivers/input/keyboard/jornada720_kbd.c create mode 100644 drivers/input/keyboard/lkkbd.c create mode 100644 drivers/input/keyboard/lm8323.c create mode 100644 drivers/input/keyboard/lm8333.c create mode 100644 drivers/input/keyboard/locomokbd.c create mode 100644 drivers/input/keyboard/lpc32xx-keys.c create mode 100644 drivers/input/keyboard/maple_keyb.c create mode 100644 drivers/input/keyboard/matrix_keypad.c create mode 100644 drivers/input/keyboard/max7359_keypad.c create mode 100644 drivers/input/keyboard/mcs_touchkey.c create mode 100644 drivers/input/keyboard/mpr121_touchkey.c create mode 100644 drivers/input/keyboard/newtonkbd.c create mode 100644 drivers/input/keyboard/nomadik-ske-keypad.c create mode 100644 drivers/input/keyboard/omap-keypad.c create mode 100644 drivers/input/keyboard/omap4-keypad.c create mode 100644 drivers/input/keyboard/opencores-kbd.c create mode 100644 drivers/input/keyboard/pmic8xxx-keypad.c create mode 100644 drivers/input/keyboard/pxa27x_keypad.c create mode 100644 drivers/input/keyboard/pxa930_rotary.c create mode 100644 drivers/input/keyboard/qt1070.c create mode 100644 drivers/input/keyboard/qt2160.c create mode 100644 drivers/input/keyboard/samsung-keypad.c create mode 100644 drivers/input/keyboard/sc_keypad.c create mode 100644 drivers/input/keyboard/sh_keysc.c create mode 100644 drivers/input/keyboard/spear-keyboard.c create mode 100644 drivers/input/keyboard/sprd_eic_keys.c create mode 100644 drivers/input/keyboard/stmpe-keypad.c create mode 100644 drivers/input/keyboard/stowaway.c create mode 100644 drivers/input/keyboard/sunkbd.c create mode 100644 drivers/input/keyboard/tc3589x-keypad.c create mode 100644 drivers/input/keyboard/tca6416-keypad.c create mode 100644 drivers/input/keyboard/tca8418_keypad.c create mode 100644 drivers/input/keyboard/tegra-kbc.c create mode 100644 drivers/input/keyboard/tnetv107x-keypad.c create mode 100644 drivers/input/keyboard/twl4030_keypad.c create mode 100644 drivers/input/keyboard/w90p910_keypad.c create mode 100644 drivers/input/keyboard/xtkbd.c create mode 100644 drivers/input/keycombo.c create mode 100644 drivers/input/keyreset.c create mode 100644 drivers/input/matrix-keymap.c create mode 100644 drivers/input/misc/88pm80x_onkey.c create mode 100644 drivers/input/misc/88pm860x_onkey.c create mode 100644 drivers/input/misc/Kconfig create mode 100644 drivers/input/misc/Makefile create mode 100644 drivers/input/misc/ab8500-ponkey.c create mode 100644 drivers/input/misc/ad714x-i2c.c create mode 100644 drivers/input/misc/ad714x-spi.c create mode 100644 drivers/input/misc/ad714x.c create mode 100644 drivers/input/misc/ad714x.h create mode 100644 drivers/input/misc/adxl34x-i2c.c create mode 100644 drivers/input/misc/adxl34x-spi.c create mode 100644 drivers/input/misc/adxl34x.c create mode 100644 drivers/input/misc/adxl34x.h create mode 100644 drivers/input/misc/al3006_pls.c create mode 100644 drivers/input/misc/apanel.c create mode 100644 drivers/input/misc/arizona-haptics.c create mode 100644 drivers/input/misc/ati_remote2.c create mode 100644 drivers/input/misc/atlas_btns.c create mode 100644 drivers/input/misc/bfin_rotary.c create mode 100644 drivers/input/misc/bma150.c create mode 100644 drivers/input/misc/bma2x2.c create mode 100644 drivers/input/misc/bs_log.h create mode 100644 drivers/input/misc/bstclass.c create mode 100644 drivers/input/misc/bstclass.h create mode 100644 drivers/input/misc/cm109.c create mode 100644 drivers/input/misc/cma3000_d0x.c create mode 100644 drivers/input/misc/cma3000_d0x.h create mode 100644 drivers/input/misc/cma3000_d0x_i2c.c create mode 100644 drivers/input/misc/cobalt_btns.c create mode 100644 drivers/input/misc/da9052_onkey.c create mode 100644 drivers/input/misc/da9055_onkey.c create mode 100644 drivers/input/misc/dm355evm_keys.c create mode 100644 drivers/input/misc/epl2182_pls_v2.c create mode 100644 drivers/input/misc/epl259x.c create mode 100644 drivers/input/misc/ewtsa.c create mode 100644 drivers/input/misc/gp2ap002a00f.c create mode 100644 drivers/input/misc/gpio_axis.c create mode 100644 drivers/input/misc/gpio_event.c create mode 100644 drivers/input/misc/gpio_input.c create mode 100644 drivers/input/misc/gpio_matrix.c create mode 100644 drivers/input/misc/gpio_output.c create mode 100644 drivers/input/misc/gpio_tilt_polled.c create mode 100644 drivers/input/misc/headset.c create mode 100644 drivers/input/misc/headset_sprd.c create mode 100644 drivers/input/misc/headset_sprd_sc2723.c create mode 100644 drivers/input/misc/hp_sdc_rtc.c create mode 100644 drivers/input/misc/ims-pcu.c create mode 100644 drivers/input/misc/ixp4xx-beeper.c create mode 100644 drivers/input/misc/keychord.c create mode 100644 drivers/input/misc/keyspan_remote.c create mode 100644 drivers/input/misc/kxtj9.c create mode 100644 drivers/input/misc/lis3dh.c create mode 100644 drivers/input/misc/lis3dh_interrupt.c create mode 100644 drivers/input/misc/lis3dh_zt.c create mode 100644 drivers/input/misc/ltr_558als.c create mode 100644 drivers/input/misc/m68kspkr.c create mode 100644 drivers/input/misc/max8925_onkey.c create mode 100644 drivers/input/misc/max8997_haptic.c create mode 100644 drivers/input/misc/mc13783-pwrbutton.c create mode 100644 drivers/input/misc/mma8450.c create mode 100644 drivers/input/misc/mpu3050.c create mode 100644 drivers/input/misc/pcap_keys.c create mode 100644 drivers/input/misc/pcf50633-input.c create mode 100644 drivers/input/misc/pcf8574_keypad.c create mode 100644 drivers/input/misc/pcspkr.c create mode 100644 drivers/input/misc/pm8xxx-vibrator.c create mode 100644 drivers/input/misc/pmic8xxx-pwrkey.c create mode 100644 drivers/input/misc/powermate.c create mode 100644 drivers/input/misc/pwm-beeper.c create mode 100644 drivers/input/misc/rb532_button.c create mode 100644 drivers/input/misc/retu-pwrbutton.c create mode 100644 drivers/input/misc/rotary_encoder.c create mode 100644 drivers/input/misc/sgi_btns.c create mode 100644 drivers/input/misc/sparcspkr.c create mode 100644 drivers/input/misc/stk3x1x.c create mode 100644 drivers/input/misc/stk3x1x.h create mode 100644 drivers/input/misc/tmd2771_pls.c create mode 100644 drivers/input/misc/twl4030-pwrbutton.c create mode 100644 drivers/input/misc/twl4030-vibra.c create mode 100644 drivers/input/misc/twl6040-vibra.c create mode 100644 drivers/input/misc/uinput.c create mode 100644 drivers/input/misc/wistron_btns.c create mode 100644 drivers/input/misc/wm831x-on.c create mode 100644 drivers/input/misc/xen-kbdfront.c create mode 100644 drivers/input/misc/yealink.c create mode 100644 drivers/input/misc/yealink.h create mode 100644 drivers/input/mouse/Kconfig create mode 100644 drivers/input/mouse/Makefile create mode 100644 drivers/input/mouse/alps.c create mode 100644 drivers/input/mouse/alps.h create mode 100644 drivers/input/mouse/amimouse.c create mode 100644 drivers/input/mouse/appletouch.c create mode 100644 drivers/input/mouse/atarimouse.c create mode 100644 drivers/input/mouse/bcm5974.c create mode 100644 drivers/input/mouse/cyapa.c create mode 100644 drivers/input/mouse/cypress_ps2.c create mode 100644 drivers/input/mouse/cypress_ps2.h create mode 100644 drivers/input/mouse/elantech.c create mode 100644 drivers/input/mouse/elantech.h create mode 100644 drivers/input/mouse/gpio_mouse.c create mode 100644 drivers/input/mouse/hgpk.c create mode 100644 drivers/input/mouse/hgpk.h create mode 100644 drivers/input/mouse/inport.c create mode 100644 drivers/input/mouse/lifebook.c create mode 100644 drivers/input/mouse/lifebook.h create mode 100644 drivers/input/mouse/logibm.c create mode 100644 drivers/input/mouse/logips2pp.c create mode 100644 drivers/input/mouse/logips2pp.h create mode 100644 drivers/input/mouse/maplemouse.c create mode 100644 drivers/input/mouse/navpoint.c create mode 100644 drivers/input/mouse/pc110pad.c create mode 100644 drivers/input/mouse/psmouse-base.c create mode 100644 drivers/input/mouse/psmouse.h create mode 100644 drivers/input/mouse/pxa930_trkball.c create mode 100644 drivers/input/mouse/rpcmouse.c create mode 100644 drivers/input/mouse/sentelic.c create mode 100644 drivers/input/mouse/sentelic.h create mode 100644 drivers/input/mouse/sermouse.c create mode 100644 drivers/input/mouse/synaptics.c create mode 100644 drivers/input/mouse/synaptics.h create mode 100644 drivers/input/mouse/synaptics_i2c.c create mode 100644 drivers/input/mouse/synaptics_usb.c create mode 100644 drivers/input/mouse/touchkit_ps2.c create mode 100644 drivers/input/mouse/touchkit_ps2.h create mode 100644 drivers/input/mouse/trackpoint.c create mode 100644 drivers/input/mouse/trackpoint.h create mode 100644 drivers/input/mouse/vsxxxaa.c create mode 100644 drivers/input/mousedev.c create mode 100644 drivers/input/serio/Kconfig create mode 100644 drivers/input/serio/Makefile create mode 100644 drivers/input/serio/altera_ps2.c create mode 100644 drivers/input/serio/ambakmi.c create mode 100644 drivers/input/serio/ams_delta_serio.c create mode 100644 drivers/input/serio/apbps2.c create mode 100644 drivers/input/serio/arc_ps2.c create mode 100644 drivers/input/serio/at32psif.c create mode 100644 drivers/input/serio/ct82c710.c create mode 100644 drivers/input/serio/gscps2.c create mode 100644 drivers/input/serio/hil_mlc.c create mode 100644 drivers/input/serio/hp_sdc.c create mode 100644 drivers/input/serio/hp_sdc_mlc.c create mode 100644 drivers/input/serio/i8042-io.h create mode 100644 drivers/input/serio/i8042-ip22io.h create mode 100644 drivers/input/serio/i8042-jazzio.h create mode 100644 drivers/input/serio/i8042-ppcio.h create mode 100644 drivers/input/serio/i8042-snirm.h create mode 100644 drivers/input/serio/i8042-sparcio.h create mode 100644 drivers/input/serio/i8042-unicore32io.h create mode 100644 drivers/input/serio/i8042-x86ia64io.h create mode 100644 drivers/input/serio/i8042.c create mode 100644 drivers/input/serio/i8042.h create mode 100644 drivers/input/serio/libps2.c create mode 100644 drivers/input/serio/maceps2.c create mode 100644 drivers/input/serio/parkbd.c create mode 100644 drivers/input/serio/pcips2.c create mode 100644 drivers/input/serio/ps2mult.c create mode 100644 drivers/input/serio/q40kbd.c create mode 100644 drivers/input/serio/rpckbd.c create mode 100644 drivers/input/serio/sa1111ps2.c create mode 100644 drivers/input/serio/serio.c create mode 100644 drivers/input/serio/serio_raw.c create mode 100644 drivers/input/serio/serport.c create mode 100644 drivers/input/serio/xilinx_ps2.c create mode 100644 drivers/input/sparse-keymap.c create mode 100644 drivers/input/tablet/Kconfig create mode 100644 drivers/input/tablet/Makefile create mode 100644 drivers/input/tablet/acecad.c create mode 100644 drivers/input/tablet/aiptek.c create mode 100644 drivers/input/tablet/gtco.c create mode 100644 drivers/input/tablet/hanwang.c create mode 100644 drivers/input/tablet/kbtab.c create mode 100644 drivers/input/tablet/wacom.h create mode 100644 drivers/input/tablet/wacom_sys.c create mode 100644 drivers/input/tablet/wacom_wac.c create mode 100644 drivers/input/tablet/wacom_wac.h create mode 100644 drivers/input/touchscreen/88pm860x-ts.c create mode 100755 drivers/input/touchscreen/Kconfig create mode 100755 drivers/input/touchscreen/Makefile create mode 100644 drivers/input/touchscreen/ad7877.c create mode 100644 drivers/input/touchscreen/ad7879-i2c.c create mode 100644 drivers/input/touchscreen/ad7879-spi.c create mode 100644 drivers/input/touchscreen/ad7879.c create mode 100644 drivers/input/touchscreen/ad7879.h create mode 100644 drivers/input/touchscreen/ads7846.c create mode 100644 drivers/input/touchscreen/atmel-wm97xx.c create mode 100644 drivers/input/touchscreen/atmel_mxt_ts.c create mode 100644 drivers/input/touchscreen/atmel_tsadcc.c create mode 100644 drivers/input/touchscreen/auo-pixcir-ts.c create mode 100644 drivers/input/touchscreen/bu21013_ts.c create mode 100644 drivers/input/touchscreen/cy8ctmg110_ts.c create mode 100644 drivers/input/touchscreen/cyttsp_core.c create mode 100644 drivers/input/touchscreen/cyttsp_core.h create mode 100644 drivers/input/touchscreen/cyttsp_i2c.c create mode 100644 drivers/input/touchscreen/cyttsp_spi.c create mode 100644 drivers/input/touchscreen/da9034-ts.c create mode 100644 drivers/input/touchscreen/da9052_tsi.c create mode 100644 drivers/input/touchscreen/dynapro.c create mode 100644 drivers/input/touchscreen/edt-ft5x06.c create mode 100644 drivers/input/touchscreen/eeti_ts.c create mode 100644 drivers/input/touchscreen/egalax_ts.c create mode 100644 drivers/input/touchscreen/elo.c create mode 100644 drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2c_app_3.3V.h create mode 100644 drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2e_app.h create mode 100644 drivers/input/touchscreen/focaltech/FT6x06_4Column_V02_20140901_app.h create mode 100644 drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x03_20141117_app.h create mode 100644 drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x11_20141206_app.h create mode 100644 drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x12_20150227_app.h create mode 100644 drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x0f_app.h create mode 100644 drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x23_test_app.h create mode 100644 drivers/input/touchscreen/focaltech/Makefile create mode 100644 drivers/input/touchscreen/focaltech/focaltech.c create mode 100644 drivers/input/touchscreen/focaltech/focaltech_ctl.c create mode 100644 drivers/input/touchscreen/focaltech/focaltech_ex_fun.c create mode 100644 drivers/input/touchscreen/ft5x0x_ts_v1.c create mode 100644 drivers/input/touchscreen/fujitsu_ts.c create mode 100644 drivers/input/touchscreen/goodix/Makefile create mode 100644 drivers/input/touchscreen/goodix/goodix_tool.c create mode 100644 drivers/input/touchscreen/goodix/gt9xx.c create mode 100644 drivers/input/touchscreen/goodix/gt9xx.h create mode 100644 drivers/input/touchscreen/goodix/gt9xx_update.c create mode 100644 drivers/input/touchscreen/gunze.c create mode 100644 drivers/input/touchscreen/hampshire.c create mode 100644 drivers/input/touchscreen/hp680_ts_input.c create mode 100644 drivers/input/touchscreen/htcpen.c create mode 100644 drivers/input/touchscreen/ili210x.c create mode 100644 drivers/input/touchscreen/inexio.c create mode 100644 drivers/input/touchscreen/intel-mid-touch.c create mode 100644 drivers/input/touchscreen/ist30xx/Makefile create mode 100644 drivers/input/touchscreen/ist30xx/firmware/IST3038_FW_KANAS.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140225.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140226.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0002_20140301.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0003_20140310.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0005_20140323.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0006_20140401.h create mode 100644 drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_tshark_ver0007.h create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx.c create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx.h create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_misc.c create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_misc.h create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_sec.c create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_sec.h create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_sys.c create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_tracking.c create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_tracking.h create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_tsp.h create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_update.c create mode 100644 drivers/input/touchscreen/ist30xx/ist30xx_update.h create mode 100644 drivers/input/touchscreen/ist30xxa/Makefile create mode 100644 drivers/input/touchscreen/ist30xxa/firmware/core_prime.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_chkic_bin.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_cmcs_bin.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_misc.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_misc.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_sec.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_sec.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_sys.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_tracking.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_tracking.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_tsp.h create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_update.c create mode 100644 drivers/input/touchscreen/ist30xxa/ist30xx_update.h create mode 100755 drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0003.h create mode 100644 drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0007.h create mode 100644 drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Star2_Ver0002.h create mode 100644 drivers/input/touchscreen/ist30xxb/IST30xxB_FW_vivalto_Ver0001_fw.h create mode 100644 drivers/input/touchscreen/ist30xxb/Makefile create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_factory.c create mode 100644 drivers/input/touchscreen/ist30xxb/ist30xxb_fw_pikeayoung2dtv_ver0001.h create mode 100644 drivers/input/touchscreen/ist30xxb/ist30xxb_fw_young2_ver0001.h create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_misc.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_misc.h create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_sec.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_sec.h create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_sec_test.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_sec_tsp.h create mode 100644 drivers/input/touchscreen/ist30xxb/ist30xxb_sys.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.h create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_tsp.h create mode 100644 drivers/input/touchscreen/ist30xxb/ist30xxb_update.c create mode 100755 drivers/input/touchscreen/ist30xxb/ist30xxb_update.h create mode 100644 drivers/input/touchscreen/ist30xxc/Makefile create mode 100644 drivers/input/touchscreen/ist30xxc/firmware/coreprimeve3g_fw.h create mode 100644 drivers/input/touchscreen/ist30xxc/firmware/ist30xxc_fw.h create mode 100644 drivers/input/touchscreen/ist30xxc/firmware/j7mlte_fw.h create mode 100755 drivers/input/touchscreen/ist30xxc/firmware/ss_sharklt8_fw.h create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc.c create mode 100755 drivers/input/touchscreen/ist30xxc/ist30xxc.h create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.c create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.h create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs_bin.h create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_misc.c create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_misc.h create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_sec.c create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_sec.h create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_sys.c create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.c create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.h create mode 100755 drivers/input/touchscreen/ist30xxc/ist30xxc_update.c create mode 100644 drivers/input/touchscreen/ist30xxc/ist30xxc_update.h create mode 100644 drivers/input/touchscreen/ito_test/open_test_ANA1_8861A_lianchuang.h create mode 100644 drivers/input/touchscreen/ito_test/open_test_ANA1_B_8861A_lianchuang.h create mode 100644 drivers/input/touchscreen/ito_test/open_test_ANA2_8861A_lianchuang.h create mode 100644 drivers/input/touchscreen/ito_test/open_test_ANA2_B_8861A_lianchuang.h create mode 100644 drivers/input/touchscreen/ito_test/open_test_ANA3_8861A_lianchuang.h create mode 100644 drivers/input/touchscreen/jornada720_ts.c create mode 100644 drivers/input/touchscreen/lpc32xx_ts.c create mode 100644 drivers/input/touchscreen/mainstone-wm97xx.c create mode 100644 drivers/input/touchscreen/max11801_ts.c create mode 100644 drivers/input/touchscreen/mc13783_ts.c create mode 100644 drivers/input/touchscreen/mcs5000_ts.c create mode 100644 drivers/input/touchscreen/migor_ts.c create mode 100644 drivers/input/touchscreen/mk712.c create mode 100755 drivers/input/touchscreen/mms100s_ts.c create mode 100644 drivers/input/touchscreen/mms114.c create mode 100644 drivers/input/touchscreen/mms134s/Makefile create mode 100644 drivers/input/touchscreen/mms134s/mms134s.c create mode 100644 drivers/input/touchscreen/mms134s/mms134s_fw.h create mode 100644 drivers/input/touchscreen/mms134s/mms134s_sec.c create mode 100644 drivers/input/touchscreen/mms136_ts.c create mode 100644 drivers/input/touchscreen/mms_ts_fw.h create mode 100644 drivers/input/touchscreen/msg2138.c create mode 100644 drivers/input/touchscreen/msg2138/Makefile create mode 100644 drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_common.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_common.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_main.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_main.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_sprd.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c create mode 100644 drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h create mode 100644 drivers/input/touchscreen/msg2233/Makefile create mode 100755 drivers/input/touchscreen/msg2233/msg21xxa_xxxx_update_bin.h create mode 100755 drivers/input/touchscreen/msg2233/msg21xxa_yyyy_update_bin.h create mode 100755 drivers/input/touchscreen/msg2233/msg22xx_xxxx_update_bin.h create mode 100755 drivers/input/touchscreen/msg2233/msg22xx_yyyy_update_bin.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_common.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_common.h create mode 100755 drivers/input/touchscreen/msg2233/mstar_drv_extern.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_hotknot.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_hotknot.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_main.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_main.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_mtk.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_qcom.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.h create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_sprd.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.c create mode 100644 drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.h create mode 100644 drivers/input/touchscreen/mtouch.c create mode 100644 drivers/input/touchscreen/pcap_ts.c create mode 100644 drivers/input/touchscreen/penmount.c create mode 100644 drivers/input/touchscreen/pixcir_i2c_ts.c create mode 100644 drivers/input/touchscreen/qt602240_ts.c create mode 100644 drivers/input/touchscreen/s3c2410_ts.c create mode 100644 drivers/input/touchscreen/st1232.c create mode 100644 drivers/input/touchscreen/stmpe-ts.c create mode 100644 drivers/input/touchscreen/ti_am335x_tsc.c create mode 100644 drivers/input/touchscreen/tnetv107x-ts.c create mode 100644 drivers/input/touchscreen/touchit213.c create mode 100644 drivers/input/touchscreen/touchright.c create mode 100644 drivers/input/touchscreen/touchwin.c create mode 100644 drivers/input/touchscreen/tp_sprd.c create mode 100644 drivers/input/touchscreen/tps6507x-ts.c create mode 100644 drivers/input/touchscreen/tsc2005.c create mode 100644 drivers/input/touchscreen/tsc2007.c create mode 100644 drivers/input/touchscreen/tsc40.c create mode 100644 drivers/input/touchscreen/ucb1400_ts.c create mode 100644 drivers/input/touchscreen/usbtouchscreen.c create mode 100644 drivers/input/touchscreen/w90p910_ts.c create mode 100644 drivers/input/touchscreen/wacom_i2c.c create mode 100644 drivers/input/touchscreen/wacom_w8001.c create mode 100644 drivers/input/touchscreen/wm831x-ts.c create mode 100644 drivers/input/touchscreen/wm9705.c create mode 100644 drivers/input/touchscreen/wm9712.c create mode 100644 drivers/input/touchscreen/wm9713.c create mode 100644 drivers/input/touchscreen/wm97xx-core.c create mode 100644 drivers/input/touchscreen/zinitix_bt541_firmware.h create mode 100644 drivers/input/touchscreen/zinitix_bt541_ts.c create mode 100644 drivers/input/touchscreen/zinitix_touch.c create mode 100644 drivers/input/touchscreen/zinitix_touch.h create mode 100644 drivers/input/touchscreen/zinitix_touch_bt404.c create mode 100644 drivers/input/touchscreen/zinitix_touch_bt404.h create mode 100644 drivers/input/touchscreen/zinitix_touch_bt4x3_firmware.h create mode 100644 drivers/input/touchscreen/zinitix_touch_bt4x3_reg_data.h create mode 100644 drivers/input/touchscreen/zinitix_touch_bt4x4_firmware.h create mode 100755 drivers/input/touchscreen/zinitix_touch_zxt_firmware.h create mode 100755 drivers/input/touchscreen/zt7554_ts.c create mode 100755 drivers/input/touchscreen/zt7554_ts.h create mode 100755 drivers/input/touchscreen/zt7554_ts_spec.h create mode 100644 drivers/input/touchscreen/zylonite-wm97xx.c (limited to 'drivers/input') diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig new file mode 100644 index 00000000..518efa2a --- /dev/null +++ b/drivers/input/Kconfig @@ -0,0 +1,221 @@ +# +# Input device configuration +# + +menu "Input device support" + depends on !UML + +config INPUT + tristate "Generic input layer (needed for keyboard, mouse, ...)" if EXPERT + default y + help + Say Y here if you have any input device (mouse, keyboard, tablet, + joystick, steering wheel ...) connected to your system and want + it to be available to applications. This includes standard PS/2 + keyboard and mouse. + + Say N here if you have a headless (no monitor, no keyboard) system. + + More information is available: + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called input. + +if INPUT + +config INPUT_FF_MEMLESS + tristate "Support for memoryless force-feedback devices" + help + Say Y here if you have memoryless force-feedback input device + such as Logitech WingMan Force 3D, ThrustMaster FireStorm Dual + Power 2, or similar. You will also need to enable hardware-specific + driver. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ff-memless. + +config INPUT_POLLDEV + tristate "Polled input device skeleton" + help + Say Y here if you are using a driver for an input + device that periodically polls hardware state. This + option is only useful for out-of-tree drivers since + in-tree drivers select it automatically. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called input-polldev. + +config INPUT_SPARSEKMAP + tristate "Sparse keymap support library" + help + Say Y here if you are using a driver for an input + device that uses sparse keymap. This option is only + useful for out-of-tree drivers since in-tree drivers + select it automatically. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called sparse-keymap. + +config INPUT_MATRIXKMAP + tristate "Matrix keymap support library" + help + Say Y here if you are using a driver for an input + device that uses matrix keymap. This option is only + useful for out-of-tree drivers since in-tree drivers + select it automatically. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called matrix-keymap. + +comment "Userland interfaces" + +config INPUT_MOUSEDEV + tristate "Mouse interface" + default y + help + Say Y here if you want your mouse to be accessible as char devices + 13:32+ - /dev/input/mouseX and 13:63 - /dev/input/mice as an + emulated IntelliMouse Explorer PS/2 mouse. That way, all user space + programs (including SVGAlib, GPM and X) will be able to use your + mouse. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called mousedev. + +config INPUT_MOUSEDEV_PSAUX + bool "Provide legacy /dev/psaux device" + default y + depends on INPUT_MOUSEDEV + help + Say Y here if you want your mouse also be accessible as char device + 10:1 - /dev/psaux. The data available through /dev/psaux is exactly + the same as the data from /dev/input/mice. + + If unsure, say Y. + + +config INPUT_MOUSEDEV_SCREEN_X + int "Horizontal screen resolution" + depends on INPUT_MOUSEDEV + default "1024" + help + If you're using a digitizer, or a graphic tablet, and want to use + it as a mouse then the mousedev driver needs to know the X window + screen resolution you are using to correctly scale the data. If + you're not using a digitizer, this value is ignored. + +config INPUT_MOUSEDEV_SCREEN_Y + int "Vertical screen resolution" + depends on INPUT_MOUSEDEV + default "768" + help + If you're using a digitizer, or a graphic tablet, and want to use + it as a mouse then the mousedev driver needs to know the X window + screen resolution you are using to correctly scale the data. If + you're not using a digitizer, this value is ignored. + +config INPUT_JOYDEV + tristate "Joystick interface" + help + Say Y here if you want your joystick or gamepad to be + accessible as char device 13:0+ - /dev/input/jsX device. + + If unsure, say Y. + + More information is available: + + To compile this driver as a module, choose M here: the + module will be called joydev. + +config INPUT_EVDEV + tristate "Event interface" + help + Say Y here if you want your input device events be accessible + under char device 13:64+ - /dev/input/eventX in a generic way. + + To compile this driver as a module, choose M here: the + module will be called evdev. + +config INPUT_EVBUG + tristate "Event debugging" + help + Say Y here if you have a problem with the input subsystem and + want all events (keypresses, mouse movements), to be output to + the system log. While this is useful for debugging, it's also + a security threat - your keypresses include your passwords, of + course. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called evbug. + +config INPUT_APMPOWER + tristate "Input Power Event -> APM Bridge" if EXPERT + depends on INPUT && APM_EMULATION + help + Say Y here if you want suspend key events to trigger a user + requested suspend through APM. This is useful on embedded + systems where such behaviour is desired without userspace + interaction. If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called apm-power. + +config INPUT_KEYRESET + tristate "Reset key" + depends on INPUT + select INPUT_KEYCOMBO + ---help--- + Say Y here if you want to reboot when some keys are pressed; + + To compile this driver as a module, choose M here: the + module will be called keyreset. + +config INPUT_KEYCOMBO + tristate "Key combo" + depends on INPUT + ---help--- + Say Y here if you want to take action when some keys are pressed; + + To compile this driver as a module, choose M here: the + module will be called keycombo. + +comment "Input Device Drivers" + +source "drivers/input/keyboard/Kconfig" + +source "drivers/input/mouse/Kconfig" + +source "drivers/input/joystick/Kconfig" + +source "drivers/input/tablet/Kconfig" + +source "drivers/input/touchscreen/Kconfig" + +source "drivers/input/misc/Kconfig" + +endif + +menu "Hardware I/O ports" + +source "drivers/input/serio/Kconfig" + +source "drivers/input/gameport/Kconfig" + +endmenu + +endmenu + diff --git a/drivers/input/Makefile b/drivers/input/Makefile new file mode 100644 index 00000000..ee4c0652 --- /dev/null +++ b/drivers/input/Makefile @@ -0,0 +1,30 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_INPUT) += input-core.o +input-core-y := input.o input-compat.o input-mt.o ff-core.o + +obj-$(CONFIG_INPUT_FF_MEMLESS) += ff-memless.o +obj-$(CONFIG_INPUT_POLLDEV) += input-polldev.o +obj-$(CONFIG_INPUT_SPARSEKMAP) += sparse-keymap.o +obj-$(CONFIG_INPUT_MATRIXKMAP) += matrix-keymap.o + +obj-$(CONFIG_INPUT_MOUSEDEV) += mousedev.o +obj-$(CONFIG_INPUT_JOYDEV) += joydev.o +obj-$(CONFIG_INPUT_EVDEV) += evdev.o +obj-$(CONFIG_INPUT_EVBUG) += evbug.o + +obj-$(CONFIG_INPUT_KEYBOARD) += keyboard/ +obj-$(CONFIG_INPUT_MOUSE) += mouse/ +obj-$(CONFIG_INPUT_JOYSTICK) += joystick/ +obj-$(CONFIG_INPUT_TABLET) += tablet/ +obj-$(CONFIG_INPUT_TOUCHSCREEN) += touchscreen/ +obj-$(CONFIG_INPUT_MISC) += misc/ + +obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o +obj-$(CONFIG_INPUT_KEYRESET) += keyreset.o +obj-$(CONFIG_INPUT_KEYCOMBO) += keycombo.o + diff --git a/drivers/input/apm-power.c b/drivers/input/apm-power.c new file mode 100644 index 00000000..650177a3 --- /dev/null +++ b/drivers/input/apm-power.c @@ -0,0 +1,126 @@ +/* + * Input Power Event -> APM Bridge + * + * Copyright (c) 2007 Richard Purdie + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +static void system_power_event(unsigned int keycode) +{ + switch (keycode) { + case KEY_SUSPEND: + apm_queue_event(APM_USER_SUSPEND); + pr_info("Requesting system suspend...\n"); + break; + default: + break; + } +} + +static void apmpower_event(struct input_handle *handle, unsigned int type, + unsigned int code, int value) +{ + /* only react on key down events */ + if (value != 1) + return; + + switch (type) { + case EV_PWR: + system_power_event(code); + break; + + default: + break; + } +} + +static int apmpower_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) +{ + struct input_handle *handle; + int error; + + handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); + if (!handle) + return -ENOMEM; + + handle->dev = dev; + handle->handler = handler; + handle->name = "apm-power"; + + error = input_register_handle(handle); + if (error) { + pr_err("Failed to register input power handler, error %d\n", + error); + kfree(handle); + return error; + } + + error = input_open_device(handle); + if (error) { + pr_err("Failed to open input power device, error %d\n", error); + input_unregister_handle(handle); + kfree(handle); + return error; + } + + return 0; +} + +static void apmpower_disconnect(struct input_handle *handle) +{ + input_close_device(handle); + input_unregister_handle(handle); + kfree(handle); +} + +static const struct input_device_id apmpower_ids[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT, + .evbit = { BIT_MASK(EV_PWR) }, + }, + { }, +}; + +MODULE_DEVICE_TABLE(input, apmpower_ids); + +static struct input_handler apmpower_handler = { + .event = apmpower_event, + .connect = apmpower_connect, + .disconnect = apmpower_disconnect, + .name = "apm-power", + .id_table = apmpower_ids, +}; + +static int __init apmpower_init(void) +{ + return input_register_handler(&apmpower_handler); +} + +static void __exit apmpower_exit(void) +{ + input_unregister_handler(&apmpower_handler); +} + +module_init(apmpower_init); +module_exit(apmpower_exit); + +MODULE_AUTHOR("Richard Purdie "); +MODULE_DESCRIPTION("Input Power Event -> APM Bridge"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/evbug.c b/drivers/input/evbug.c new file mode 100644 index 00000000..cd4e6679 --- /dev/null +++ b/drivers/input/evbug.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * Input driver event debug module - dumps all events into syslog + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Input driver event debug module"); +MODULE_LICENSE("GPL"); + +static void evbug_event(struct input_handle *handle, unsigned int type, unsigned int code, int value) +{ + printk(KERN_DEBUG pr_fmt("Event. Dev: %s, Type: %d, Code: %d, Value: %d\n"), + dev_name(&handle->dev->dev), type, code, value); +} + +static int evbug_connect(struct input_handler *handler, struct input_dev *dev, + const struct input_device_id *id) +{ + struct input_handle *handle; + int error; + + handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL); + if (!handle) + return -ENOMEM; + + handle->dev = dev; + handle->handler = handler; + handle->name = "evbug"; + + error = input_register_handle(handle); + if (error) + goto err_free_handle; + + error = input_open_device(handle); + if (error) + goto err_unregister_handle; + + printk(KERN_DEBUG pr_fmt("Connected device: %s (%s at %s)\n"), + dev_name(&dev->dev), + dev->name ?: "unknown", + dev->phys ?: "unknown"); + + return 0; + + err_unregister_handle: + input_unregister_handle(handle); + err_free_handle: + kfree(handle); + return error; +} + +static void evbug_disconnect(struct input_handle *handle) +{ + printk(KERN_DEBUG pr_fmt("Disconnected device: %s\n"), + dev_name(&handle->dev->dev)); + + input_close_device(handle); + input_unregister_handle(handle); + kfree(handle); +} + +static const struct input_device_id evbug_ids[] = { + { .driver_info = 1 }, /* Matches all devices */ + { }, /* Terminating zero entry */ +}; + +MODULE_DEVICE_TABLE(input, evbug_ids); + +static struct input_handler evbug_handler = { + .event = evbug_event, + .connect = evbug_connect, + .disconnect = evbug_disconnect, + .name = "evbug", + .id_table = evbug_ids, +}; + +static int __init evbug_init(void) +{ + return input_register_handler(&evbug_handler); +} + +static void __exit evbug_exit(void) +{ + input_unregister_handler(&evbug_handler); +} + +module_init(evbug_init); +module_exit(evbug_exit); diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c new file mode 100644 index 00000000..a173d3ea --- /dev/null +++ b/drivers/input/evdev.c @@ -0,0 +1,1137 @@ +/* + * Event char devices, giving access to raw input device events. + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#define EVDEV_MINOR_BASE 64 +#define EVDEV_MINORS 32 +#define EVDEV_MIN_BUFFER_SIZE 64U +#define EVDEV_BUF_PACKETS 8 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "input-compat.h" + +struct evdev { + int open; + struct input_handle handle; + wait_queue_head_t wait; + struct evdev_client __rcu *grab; + struct list_head client_list; + spinlock_t client_lock; /* protects client_list */ + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; +}; + +struct evdev_client { + unsigned int head; + unsigned int tail; + unsigned int packet_head; /* [future] position of the first element of next packet */ + spinlock_t buffer_lock; /* protects access to buffer, head and tail */ + struct wake_lock wake_lock; + bool use_wake_lock; + char name[28]; + struct fasync_struct *fasync; + struct evdev *evdev; + struct list_head node; + int clkid; + unsigned int bufsize; + struct input_event buffer[]; +}; + +static void __pass_event(struct evdev_client *client, + const struct input_event *event) +{ + client->buffer[client->head++] = *event; + client->head &= client->bufsize - 1; + + if (unlikely(client->head == client->tail)) { + /* + * This effectively "drops" all unconsumed events, leaving + * EV_SYN/SYN_DROPPED plus the newest event in the queue. + */ + client->tail = (client->head - 2) & (client->bufsize - 1); + + client->buffer[client->tail].time = event->time; + client->buffer[client->tail].type = EV_SYN; + client->buffer[client->tail].code = SYN_DROPPED; + client->buffer[client->tail].value = 0; + + client->packet_head = client->tail; + if (client->use_wake_lock) + wake_unlock(&client->wake_lock); + } + + if (event->type == EV_SYN && event->code == SYN_REPORT) { + client->packet_head = client->head; + if (client->use_wake_lock) + wake_lock(&client->wake_lock); + kill_fasync(&client->fasync, SIGIO, POLL_IN); + } +} + +static void evdev_pass_values(struct evdev_client *client, + const struct input_value *vals, unsigned int count, + ktime_t mono, ktime_t real) +{ + struct evdev *evdev = client->evdev; + const struct input_value *v; + struct input_event event; + bool wakeup = false; + ktime_t time_monoboot; + + event.time = ktime_to_timeval(client->clkid == CLOCK_MONOTONIC ? + mono : real); + + if(client->clkid == CLOCK_BOOTTIME) + { + time_monoboot = ktime_get_boottime(); + event.time = ktime_to_timeval(time_monoboot); + } + + /* Interrupts are disabled, just acquire the lock. */ + spin_lock(&client->buffer_lock); + + for (v = vals; v != vals + count; v++) { + event.type = v->type; + event.code = v->code; + event.value = v->value; + __pass_event(client, &event); + if (v->type == EV_SYN && v->code == SYN_REPORT) + wakeup = true; + } + + spin_unlock(&client->buffer_lock); + + if (wakeup) + wake_up_interruptible(&evdev->wait); +} + +/* + * Pass incoming events to all connected clients. + */ +static void evdev_events(struct input_handle *handle, + const struct input_value *vals, unsigned int count) +{ + struct evdev *evdev = handle->private; + struct evdev_client *client; + ktime_t time_mono, time_real; + + time_mono = ktime_get(); + + time_real = ktime_sub(time_mono, ktime_get_monotonic_offset()); + + rcu_read_lock(); + + client = rcu_dereference(evdev->grab); + + if (client) + evdev_pass_values(client, vals, count, time_mono, time_real); + else + list_for_each_entry_rcu(client, &evdev->client_list, node) + evdev_pass_values(client, vals, count, + time_mono, time_real); + + rcu_read_unlock(); +} + +/* + * Pass incoming event to all connected clients. + */ +static void evdev_event(struct input_handle *handle, + unsigned int type, unsigned int code, int value) +{ + struct input_value vals[] = { { type, code, value } }; + + evdev_events(handle, vals, 1); +} + +static int evdev_fasync(int fd, struct file *file, int on) +{ + struct evdev_client *client = file->private_data; + + return fasync_helper(fd, file, on, &client->fasync); +} + +static int evdev_flush(struct file *file, fl_owner_t id) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + int retval; + + retval = mutex_lock_interruptible(&evdev->mutex); + if (retval) + return retval; + + if (!evdev->exist) + retval = -ENODEV; + else + retval = input_flush_device(&evdev->handle, file); + + mutex_unlock(&evdev->mutex); + return retval; +} + +static void evdev_free(struct device *dev) +{ + struct evdev *evdev = container_of(dev, struct evdev, dev); + + input_put_device(evdev->handle.dev); + kfree(evdev); +} + +/* + * Grabs an event device (along with underlying input device). + * This function is called with evdev->mutex taken. + */ +static int evdev_grab(struct evdev *evdev, struct evdev_client *client) +{ + int error; + + if (evdev->grab) + return -EBUSY; + + error = input_grab_device(&evdev->handle); + if (error) + return error; + + rcu_assign_pointer(evdev->grab, client); + + return 0; +} + +static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client) +{ + struct evdev_client *grab = rcu_dereference_protected(evdev->grab, + lockdep_is_held(&evdev->mutex)); + + if (grab != client) + return -EINVAL; + + rcu_assign_pointer(evdev->grab, NULL); + synchronize_rcu(); + input_release_device(&evdev->handle); + + return 0; +} + +static void evdev_attach_client(struct evdev *evdev, + struct evdev_client *client) +{ + spin_lock(&evdev->client_lock); + list_add_tail_rcu(&client->node, &evdev->client_list); + spin_unlock(&evdev->client_lock); +} + +static void evdev_detach_client(struct evdev *evdev, + struct evdev_client *client) +{ + spin_lock(&evdev->client_lock); + list_del_rcu(&client->node); + spin_unlock(&evdev->client_lock); + synchronize_rcu(); +} + +static int evdev_open_device(struct evdev *evdev) +{ + int retval; + + retval = mutex_lock_interruptible(&evdev->mutex); + if (retval) + return retval; + + if (!evdev->exist) + retval = -ENODEV; + else if (!evdev->open++) { + retval = input_open_device(&evdev->handle); + if (retval) + evdev->open--; + } + + mutex_unlock(&evdev->mutex); + return retval; +} + +static void evdev_close_device(struct evdev *evdev) +{ + mutex_lock(&evdev->mutex); + + if (evdev->exist && !--evdev->open) + input_close_device(&evdev->handle); + + mutex_unlock(&evdev->mutex); +} + +/* + * Wake up users waiting for IO so they can disconnect from + * dead device. + */ +static void evdev_hangup(struct evdev *evdev) +{ + struct evdev_client *client; + + spin_lock(&evdev->client_lock); + list_for_each_entry(client, &evdev->client_list, node) + kill_fasync(&client->fasync, SIGIO, POLL_HUP); + spin_unlock(&evdev->client_lock); + + wake_up_interruptible(&evdev->wait); +} + +static int evdev_release(struct inode *inode, struct file *file) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + + mutex_lock(&evdev->mutex); + evdev_ungrab(evdev, client); + mutex_unlock(&evdev->mutex); + + evdev_detach_client(evdev, client); + if (client->use_wake_lock) + wake_lock_destroy(&client->wake_lock); + + if (is_vmalloc_addr(client)) + vfree(client); + else + kfree(client); + + evdev_close_device(evdev); + + return 0; +} + +static unsigned int evdev_compute_buffer_size(struct input_dev *dev) +{ + unsigned int n_events = + max(dev->hint_events_per_packet * EVDEV_BUF_PACKETS, + EVDEV_MIN_BUFFER_SIZE); + + return roundup_pow_of_two(n_events); +} + +static int evdev_open(struct inode *inode, struct file *file) +{ + struct evdev *evdev = container_of(inode->i_cdev, struct evdev, cdev); + unsigned int bufsize = evdev_compute_buffer_size(evdev->handle.dev); + unsigned int size = sizeof(struct evdev_client) + + bufsize * sizeof(struct input_event); + struct evdev_client *client; + int error; + + client = kzalloc(size, GFP_KERNEL | __GFP_NOWARN); + if (!client) + client = vzalloc(size); + if (!client) + return -ENOMEM; + + client->bufsize = bufsize; + spin_lock_init(&client->buffer_lock); + snprintf(client->name, sizeof(client->name), "%s-%d", + dev_name(&evdev->dev), task_tgid_vnr(current)); + client->evdev = evdev; + evdev_attach_client(evdev, client); + + error = evdev_open_device(evdev); + if (error) + goto err_free_client; + + file->private_data = client; + nonseekable_open(inode, file); + + return 0; + + err_free_client: + evdev_detach_client(evdev, client); + kfree(client); + return error; +} + +static ssize_t evdev_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + struct input_event event; + int retval = 0; + + if (count != 0 && count < input_event_size()) + return -EINVAL; + + retval = mutex_lock_interruptible(&evdev->mutex); + if (retval) + return retval; + + if (!evdev->exist) { + retval = -ENODEV; + goto out; + } + + while (retval + input_event_size() <= count) { + + if (input_event_from_user(buffer + retval, &event)) { + retval = -EFAULT; + goto out; + } + retval += input_event_size(); + + input_inject_event(&evdev->handle, + event.type, event.code, event.value); + } + + out: + mutex_unlock(&evdev->mutex); + return retval; +} + +static int evdev_fetch_next_event(struct evdev_client *client, + struct input_event *event) +{ + int have_event; + + spin_lock_irq(&client->buffer_lock); + + have_event = client->packet_head != client->tail; + if (have_event) { + *event = client->buffer[client->tail++]; + client->tail &= client->bufsize - 1; + if (client->use_wake_lock && + client->packet_head == client->tail) + wake_unlock(&client->wake_lock); + } + + spin_unlock_irq(&client->buffer_lock); + + return have_event; +} + +static ssize_t evdev_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + struct input_event event; + size_t read = 0; + int error; + + if (count != 0 && count < input_event_size()) + return -EINVAL; + + for (;;) { + if (!evdev->exist) + return -ENODEV; + + if (client->packet_head == client->tail && + (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + /* + * count == 0 is special - no IO is done but we check + * for error conditions (see above). + */ + if (count == 0) + break; + + while (read + input_event_size() <= count && + evdev_fetch_next_event(client, &event)) { + + if (input_event_to_user(buffer + read, &event)) + return -EFAULT; + + read += input_event_size(); + } + + if (read) + break; + + if (!(file->f_flags & O_NONBLOCK)) { + error = wait_event_interruptible(evdev->wait, + client->packet_head != client->tail || + !evdev->exist); + if (error) + return error; + } + } + + return read; +} + +/* No kernel lock - fine */ +static unsigned int evdev_poll(struct file *file, poll_table *wait) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + unsigned int mask; + + poll_wait(file, &evdev->wait, wait); + + mask = evdev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR; + if (client->packet_head != client->tail) + mask |= POLLIN | POLLRDNORM; + + return mask; +} + +#ifdef CONFIG_COMPAT + +#define BITS_PER_LONG_COMPAT (sizeof(compat_long_t) * 8) +#define BITS_TO_LONGS_COMPAT(x) ((((x) - 1) / BITS_PER_LONG_COMPAT) + 1) + +#ifdef __BIG_ENDIAN +static int bits_to_user(unsigned long *bits, unsigned int maxbit, + unsigned int maxlen, void __user *p, int compat) +{ + int len, i; + + if (compat) { + len = BITS_TO_LONGS_COMPAT(maxbit) * sizeof(compat_long_t); + if (len > maxlen) + len = maxlen; + + for (i = 0; i < len / sizeof(compat_long_t); i++) + if (copy_to_user((compat_long_t __user *) p + i, + (compat_long_t *) bits + + i + 1 - ((i % 2) << 1), + sizeof(compat_long_t))) + return -EFAULT; + } else { + len = BITS_TO_LONGS(maxbit) * sizeof(long); + if (len > maxlen) + len = maxlen; + + if (copy_to_user(p, bits, len)) + return -EFAULT; + } + + return len; +} +#else +static int bits_to_user(unsigned long *bits, unsigned int maxbit, + unsigned int maxlen, void __user *p, int compat) +{ + int len = compat ? + BITS_TO_LONGS_COMPAT(maxbit) * sizeof(compat_long_t) : + BITS_TO_LONGS(maxbit) * sizeof(long); + + if (len > maxlen) + len = maxlen; + + return copy_to_user(p, bits, len) ? -EFAULT : len; +} +#endif /* __BIG_ENDIAN */ + +#else + +static int bits_to_user(unsigned long *bits, unsigned int maxbit, + unsigned int maxlen, void __user *p, int compat) +{ + int len = BITS_TO_LONGS(maxbit) * sizeof(long); + + if (len > maxlen) + len = maxlen; + + return copy_to_user(p, bits, len) ? -EFAULT : len; +} + +#endif /* CONFIG_COMPAT */ + +static int str_to_user(const char *str, unsigned int maxlen, void __user *p) +{ + int len; + + if (!str) + return -ENOENT; + + len = strlen(str) + 1; + if (len > maxlen) + len = maxlen; + + return copy_to_user(p, str, len) ? -EFAULT : len; +} + +#define OLD_KEY_MAX 0x1ff +static int handle_eviocgbit(struct input_dev *dev, + unsigned int type, unsigned int size, + void __user *p, int compat_mode) +{ + static unsigned long keymax_warn_time; + unsigned long *bits; + int len; + + switch (type) { + + case 0: bits = dev->evbit; len = EV_MAX; break; + case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; + case EV_REL: bits = dev->relbit; len = REL_MAX; break; + case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; + case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; + case EV_LED: bits = dev->ledbit; len = LED_MAX; break; + case EV_SND: bits = dev->sndbit; len = SND_MAX; break; + case EV_FF: bits = dev->ffbit; len = FF_MAX; break; + case EV_SW: bits = dev->swbit; len = SW_MAX; break; + default: return -EINVAL; + } + + /* + * Work around bugs in userspace programs that like to do + * EVIOCGBIT(EV_KEY, KEY_MAX) and not realize that 'len' + * should be in bytes, not in bits. + */ + if (type == EV_KEY && size == OLD_KEY_MAX) { + len = OLD_KEY_MAX; + if (printk_timed_ratelimit(&keymax_warn_time, 10 * 1000)) + pr_warning("(EVIOCGBIT): Suspicious buffer size %u, " + "limiting output to %zu bytes. See " + "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n", + OLD_KEY_MAX, + BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long)); + } + + return bits_to_user(bits, len, size, p, compat_mode); +} +#undef OLD_KEY_MAX + +static int evdev_handle_get_keycode(struct input_dev *dev, void __user *p) +{ + struct input_keymap_entry ke = { + .len = sizeof(unsigned int), + .flags = 0, + }; + int __user *ip = (int __user *)p; + int error; + + /* legacy case */ + if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) + return -EFAULT; + + error = input_get_keycode(dev, &ke); + if (error) + return error; + + if (put_user(ke.keycode, ip + 1)) + return -EFAULT; + + return 0; +} + +static int evdev_handle_get_keycode_v2(struct input_dev *dev, void __user *p) +{ + struct input_keymap_entry ke; + int error; + + if (copy_from_user(&ke, p, sizeof(ke))) + return -EFAULT; + + error = input_get_keycode(dev, &ke); + if (error) + return error; + + if (copy_to_user(p, &ke, sizeof(ke))) + return -EFAULT; + + return 0; +} + +static int evdev_handle_set_keycode(struct input_dev *dev, void __user *p) +{ + struct input_keymap_entry ke = { + .len = sizeof(unsigned int), + .flags = 0, + }; + int __user *ip = (int __user *)p; + + if (copy_from_user(ke.scancode, p, sizeof(unsigned int))) + return -EFAULT; + + if (get_user(ke.keycode, ip + 1)) + return -EFAULT; + + return input_set_keycode(dev, &ke); +} + +static int evdev_handle_set_keycode_v2(struct input_dev *dev, void __user *p) +{ + struct input_keymap_entry ke; + + if (copy_from_user(&ke, p, sizeof(ke))) + return -EFAULT; + + if (ke.len > sizeof(ke.scancode)) + return -EINVAL; + + return input_set_keycode(dev, &ke); +} + +static int evdev_handle_mt_request(struct input_dev *dev, + unsigned int size, + int __user *ip) +{ + const struct input_mt *mt = dev->mt; + unsigned int code; + int max_slots; + int i; + + if (get_user(code, &ip[0])) + return -EFAULT; + if (!mt || !input_is_mt_value(code)) + return -EINVAL; + + max_slots = (size - sizeof(__u32)) / sizeof(__s32); + for (i = 0; i < mt->num_slots && i < max_slots; i++) { + int value = input_mt_get_value(&mt->slots[i], code); + if (put_user(value, &ip[1 + i])) + return -EFAULT; + } + + return 0; +} + +static int evdev_enable_suspend_block(struct evdev *evdev, + struct evdev_client *client) +{ + if (client->use_wake_lock) + return 0; + + spin_lock_irq(&client->buffer_lock); + wake_lock_init(&client->wake_lock, WAKE_LOCK_SUSPEND, client->name); + client->use_wake_lock = true; + if (client->packet_head != client->tail) + wake_lock(&client->wake_lock); + spin_unlock_irq(&client->buffer_lock); + return 0; +} + +static int evdev_disable_suspend_block(struct evdev *evdev, + struct evdev_client *client) +{ + if (!client->use_wake_lock) + return 0; + + spin_lock_irq(&client->buffer_lock); + client->use_wake_lock = false; + wake_lock_destroy(&client->wake_lock); + spin_unlock_irq(&client->buffer_lock); + + return 0; +} + +static long evdev_do_ioctl(struct file *file, unsigned int cmd, + void __user *p, int compat_mode) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + struct input_dev *dev = evdev->handle.dev; + struct input_absinfo abs; + struct ff_effect effect; + int __user *ip = (int __user *)p; + unsigned int i, t, u, v; + unsigned int size; + int error; + + /* First we check for fixed-length commands */ + switch (cmd) { + + case EVIOCGVERSION: + return put_user(EV_VERSION, ip); + + case EVIOCGID: + if (copy_to_user(p, &dev->id, sizeof(struct input_id))) + return -EFAULT; + return 0; + + case EVIOCGREP: + if (!test_bit(EV_REP, dev->evbit)) + return -ENOSYS; + if (put_user(dev->rep[REP_DELAY], ip)) + return -EFAULT; + if (put_user(dev->rep[REP_PERIOD], ip + 1)) + return -EFAULT; + return 0; + + case EVIOCSREP: + if (!test_bit(EV_REP, dev->evbit)) + return -ENOSYS; + if (get_user(u, ip)) + return -EFAULT; + if (get_user(v, ip + 1)) + return -EFAULT; + + input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u); + input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v); + + return 0; + + case EVIOCRMFF: + return input_ff_erase(dev, (int)(unsigned long) p, file); + + case EVIOCGEFFECTS: + i = test_bit(EV_FF, dev->evbit) ? + dev->ff->max_effects : 0; + if (put_user(i, ip)) + return -EFAULT; + return 0; + + case EVIOCGRAB: + if (p) + return evdev_grab(evdev, client); + else + return evdev_ungrab(evdev, client); + + case EVIOCSCLOCKID: + if (copy_from_user(&i, p, sizeof(unsigned int))) + return -EFAULT; + if (i != CLOCK_MONOTONIC && i != CLOCK_REALTIME && i != CLOCK_BOOTTIME) + return -EINVAL; + client->clkid = i; + return 0; + + case EVIOCGKEYCODE: + return evdev_handle_get_keycode(dev, p); + + case EVIOCSKEYCODE: + return evdev_handle_set_keycode(dev, p); + + case EVIOCGKEYCODE_V2: + return evdev_handle_get_keycode_v2(dev, p); + + case EVIOCSKEYCODE_V2: + return evdev_handle_set_keycode_v2(dev, p); + + case EVIOCGSUSPENDBLOCK: + return put_user(client->use_wake_lock, ip); + + case EVIOCSSUSPENDBLOCK: + if (p) + return evdev_enable_suspend_block(evdev, client); + else + return evdev_disable_suspend_block(evdev, client); + } + + size = _IOC_SIZE(cmd); + + /* Now check variable-length commands */ +#define EVIOC_MASK_SIZE(nr) ((nr) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT)) + switch (EVIOC_MASK_SIZE(cmd)) { + + case EVIOCGPROP(0): + return bits_to_user(dev->propbit, INPUT_PROP_MAX, + size, p, compat_mode); + + case EVIOCGMTSLOTS(0): + return evdev_handle_mt_request(dev, size, ip); + + case EVIOCGKEY(0): + return bits_to_user(dev->key, KEY_MAX, size, p, compat_mode); + + case EVIOCGLED(0): + return bits_to_user(dev->led, LED_MAX, size, p, compat_mode); + + case EVIOCGSND(0): + return bits_to_user(dev->snd, SND_MAX, size, p, compat_mode); + + case EVIOCGSW(0): + return bits_to_user(dev->sw, SW_MAX, size, p, compat_mode); + + case EVIOCGNAME(0): + return str_to_user(dev->name, size, p); + + case EVIOCGPHYS(0): + return str_to_user(dev->phys, size, p); + + case EVIOCGUNIQ(0): + return str_to_user(dev->uniq, size, p); + + case EVIOC_MASK_SIZE(EVIOCSFF): + if (input_ff_effect_from_user(p, size, &effect)) + return -EFAULT; + + error = input_ff_upload(dev, &effect, file); + + if (put_user(effect.id, &(((struct ff_effect __user *)p)->id))) + return -EFAULT; + + return error; + } + + /* Multi-number variable-length handlers */ + if (_IOC_TYPE(cmd) != 'E') + return -EINVAL; + + if (_IOC_DIR(cmd) == _IOC_READ) { + + if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) + return handle_eviocgbit(dev, + _IOC_NR(cmd) & EV_MAX, size, + p, compat_mode); + + if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) { + + if (!dev->absinfo) + return -EINVAL; + + t = _IOC_NR(cmd) & ABS_MAX; + abs = dev->absinfo[t]; + + if (copy_to_user(p, &abs, min_t(size_t, + size, sizeof(struct input_absinfo)))) + return -EFAULT; + + return 0; + } + } + + if (_IOC_DIR(cmd) == _IOC_WRITE) { + + if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) { + + if (!dev->absinfo) + return -EINVAL; + + t = _IOC_NR(cmd) & ABS_MAX; + + if (copy_from_user(&abs, p, min_t(size_t, + size, sizeof(struct input_absinfo)))) + return -EFAULT; + + if (size < sizeof(struct input_absinfo)) + abs.resolution = 0; + + /* We can't change number of reserved MT slots */ + if (t == ABS_MT_SLOT) + return -EINVAL; + + /* + * Take event lock to ensure that we are not + * changing device parameters in the middle + * of event. + */ + spin_lock_irq(&dev->event_lock); + dev->absinfo[t] = abs; + spin_unlock_irq(&dev->event_lock); + + return 0; + } + } + + return -EINVAL; +} + +static long evdev_ioctl_handler(struct file *file, unsigned int cmd, + void __user *p, int compat_mode) +{ + struct evdev_client *client = file->private_data; + struct evdev *evdev = client->evdev; + int retval; + + retval = mutex_lock_interruptible(&evdev->mutex); + if (retval) + return retval; + + if (!evdev->exist) { + retval = -ENODEV; + goto out; + } + + retval = evdev_do_ioctl(file, cmd, p, compat_mode); + + out: + mutex_unlock(&evdev->mutex); + return retval; +} + +static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return evdev_ioctl_handler(file, cmd, (void __user *)arg, 0); +} + +#ifdef CONFIG_COMPAT +static long evdev_ioctl_compat(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return evdev_ioctl_handler(file, cmd, compat_ptr(arg), 1); +} +#endif + +static const struct file_operations evdev_fops = { + .owner = THIS_MODULE, + .read = evdev_read, + .write = evdev_write, + .poll = evdev_poll, + .open = evdev_open, + .release = evdev_release, + .unlocked_ioctl = evdev_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = evdev_ioctl_compat, +#endif + .fasync = evdev_fasync, + .flush = evdev_flush, + .llseek = no_llseek, +}; + +/* + * Mark device non-existent. This disables writes, ioctls and + * prevents new users from opening the device. Already posted + * blocking reads will stay, however new ones will fail. + */ +static void evdev_mark_dead(struct evdev *evdev) +{ + mutex_lock(&evdev->mutex); + evdev->exist = false; + mutex_unlock(&evdev->mutex); +} + +static void evdev_cleanup(struct evdev *evdev) +{ + struct input_handle *handle = &evdev->handle; + + evdev_mark_dead(evdev); + evdev_hangup(evdev); + + cdev_del(&evdev->cdev); + + /* evdev is marked dead so no one else accesses evdev->open */ + if (evdev->open) { + input_flush_device(handle, NULL); + input_close_device(handle); + } +} + +/* + * Create new evdev device. Note that input core serializes calls + * to connect and disconnect. + */ +static int evdev_connect(struct input_handler *handler, struct input_dev *dev, + const struct input_device_id *id) +{ + struct evdev *evdev; + int minor; + int dev_no; + int error; + + minor = input_get_new_minor(EVDEV_MINOR_BASE, EVDEV_MINORS, true); + if (minor < 0) { + error = minor; + pr_err("failed to reserve new minor: %d\n", error); + return error; + } + + evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL); + if (!evdev) { + error = -ENOMEM; + goto err_free_minor; + } + + INIT_LIST_HEAD(&evdev->client_list); + spin_lock_init(&evdev->client_lock); + mutex_init(&evdev->mutex); + init_waitqueue_head(&evdev->wait); + evdev->exist = true; + + dev_no = minor; + /* Normalize device number if it falls into legacy range */ + if (dev_no < EVDEV_MINOR_BASE + EVDEV_MINORS) + dev_no -= EVDEV_MINOR_BASE; + dev_set_name(&evdev->dev, "event%d", dev_no); + + evdev->handle.dev = input_get_device(dev); + evdev->handle.name = dev_name(&evdev->dev); + evdev->handle.handler = handler; + evdev->handle.private = evdev; + + evdev->dev.devt = MKDEV(INPUT_MAJOR, minor); + evdev->dev.class = &input_class; + evdev->dev.parent = &dev->dev; + evdev->dev.release = evdev_free; + device_initialize(&evdev->dev); + + error = input_register_handle(&evdev->handle); + if (error) + goto err_free_evdev; + + cdev_init(&evdev->cdev, &evdev_fops); + evdev->cdev.kobj.parent = &evdev->dev.kobj; + error = cdev_add(&evdev->cdev, evdev->dev.devt, 1); + if (error) + goto err_unregister_handle; + + error = device_add(&evdev->dev); + if (error) + goto err_cleanup_evdev; + + return 0; + + err_cleanup_evdev: + evdev_cleanup(evdev); + err_unregister_handle: + input_unregister_handle(&evdev->handle); + err_free_evdev: + put_device(&evdev->dev); + err_free_minor: + input_free_minor(minor); + return error; +} + +static void evdev_disconnect(struct input_handle *handle) +{ + struct evdev *evdev = handle->private; + + device_del(&evdev->dev); + evdev_cleanup(evdev); + input_free_minor(MINOR(evdev->dev.devt)); + input_unregister_handle(handle); + put_device(&evdev->dev); +} + +static const struct input_device_id evdev_ids[] = { + { .driver_info = 1 }, /* Matches all devices */ + { }, /* Terminating zero entry */ +}; + +MODULE_DEVICE_TABLE(input, evdev_ids); + +static struct input_handler evdev_handler = { + .event = evdev_event, + .events = evdev_events, + .connect = evdev_connect, + .disconnect = evdev_disconnect, + .legacy_minors = true, + .minor = EVDEV_MINOR_BASE, + .name = "evdev", + .id_table = evdev_ids, +}; + +static int __init evdev_init(void) +{ + return input_register_handler(&evdev_handler); +} + +static void __exit evdev_exit(void) +{ + input_unregister_handler(&evdev_handler); +} + +module_init(evdev_init); +module_exit(evdev_exit); + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Input driver event char devices"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/ff-core.c b/drivers/input/ff-core.c new file mode 100644 index 00000000..f50f6dd9 --- /dev/null +++ b/drivers/input/ff-core.c @@ -0,0 +1,382 @@ +/* + * Force feedback support for Linux input subsystem + * + * Copyright (c) 2006 Anssi Hannula + * Copyright (c) 2006 Dmitry Torokhov + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* #define DEBUG */ + +#define pr_fmt(fmt) KBUILD_BASENAME ": " fmt + +#include +#include +#include +#include +#include + +/* + * Check that the effect_id is a valid effect and whether the user + * is the owner + */ +static int check_effect_access(struct ff_device *ff, int effect_id, + struct file *file) +{ + if (effect_id < 0 || effect_id >= ff->max_effects || + !ff->effect_owners[effect_id]) + return -EINVAL; + + if (file && ff->effect_owners[effect_id] != file) + return -EACCES; + + return 0; +} + +/* + * Checks whether 2 effects can be combined together + */ +static inline int check_effects_compatible(struct ff_effect *e1, + struct ff_effect *e2) +{ + return e1->type == e2->type && + (e1->type != FF_PERIODIC || + e1->u.periodic.waveform == e2->u.periodic.waveform); +} + +/* + * Convert an effect into compatible one + */ +static int compat_effect(struct ff_device *ff, struct ff_effect *effect) +{ + int magnitude; + + switch (effect->type) { + case FF_RUMBLE: + if (!test_bit(FF_PERIODIC, ff->ffbit)) + return -EINVAL; + + /* + * calculate manginude of sine wave as average of rumble's + * 2/3 of strong magnitude and 1/3 of weak magnitude + */ + magnitude = effect->u.rumble.strong_magnitude / 3 + + effect->u.rumble.weak_magnitude / 6; + + effect->type = FF_PERIODIC; + effect->u.periodic.waveform = FF_SINE; + effect->u.periodic.period = 50; + effect->u.periodic.magnitude = max(magnitude, 0x7fff); + effect->u.periodic.offset = 0; + effect->u.periodic.phase = 0; + effect->u.periodic.envelope.attack_length = 0; + effect->u.periodic.envelope.attack_level = 0; + effect->u.periodic.envelope.fade_length = 0; + effect->u.periodic.envelope.fade_level = 0; + + return 0; + + default: + /* Let driver handle conversion */ + return 0; + } +} + +/** + * input_ff_upload() - upload effect into force-feedback device + * @dev: input device + * @effect: effect to be uploaded + * @file: owner of the effect + */ +int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, + struct file *file) +{ + struct ff_device *ff = dev->ff; + struct ff_effect *old; + int ret = 0; + int id; + + if (!test_bit(EV_FF, dev->evbit)) + return -ENOSYS; + + if (effect->type < FF_EFFECT_MIN || effect->type > FF_EFFECT_MAX || + !test_bit(effect->type, dev->ffbit)) { + pr_debug("invalid or not supported effect type in upload\n"); + return -EINVAL; + } + + if (effect->type == FF_PERIODIC && + (effect->u.periodic.waveform < FF_WAVEFORM_MIN || + effect->u.periodic.waveform > FF_WAVEFORM_MAX || + !test_bit(effect->u.periodic.waveform, dev->ffbit))) { + pr_debug("invalid or not supported wave form in upload\n"); + return -EINVAL; + } + + if (!test_bit(effect->type, ff->ffbit)) { + ret = compat_effect(ff, effect); + if (ret) + return ret; + } + + mutex_lock(&ff->mutex); + + if (effect->id == -1) { + for (id = 0; id < ff->max_effects; id++) + if (!ff->effect_owners[id]) + break; + + if (id >= ff->max_effects) { + ret = -ENOSPC; + goto out; + } + + effect->id = id; + old = NULL; + + } else { + id = effect->id; + + ret = check_effect_access(ff, id, file); + if (ret) + goto out; + + old = &ff->effects[id]; + + if (!check_effects_compatible(effect, old)) { + ret = -EINVAL; + goto out; + } + } + + ret = ff->upload(dev, effect, old); + if (ret) + goto out; + + spin_lock_irq(&dev->event_lock); + ff->effects[id] = *effect; + ff->effect_owners[id] = file; + spin_unlock_irq(&dev->event_lock); + + out: + mutex_unlock(&ff->mutex); + return ret; +} +EXPORT_SYMBOL_GPL(input_ff_upload); + +/* + * Erases the effect if the requester is also the effect owner. The mutex + * should already be locked before calling this function. + */ +static int erase_effect(struct input_dev *dev, int effect_id, + struct file *file) +{ + struct ff_device *ff = dev->ff; + int error; + + error = check_effect_access(ff, effect_id, file); + if (error) + return error; + + spin_lock_irq(&dev->event_lock); + ff->playback(dev, effect_id, 0); + ff->effect_owners[effect_id] = NULL; + spin_unlock_irq(&dev->event_lock); + + if (ff->erase) { + error = ff->erase(dev, effect_id); + if (error) { + spin_lock_irq(&dev->event_lock); + ff->effect_owners[effect_id] = file; + spin_unlock_irq(&dev->event_lock); + + return error; + } + } + + return 0; +} + +/** + * input_ff_erase - erase a force-feedback effect from device + * @dev: input device to erase effect from + * @effect_id: id of the ffect to be erased + * @file: purported owner of the request + * + * This function erases a force-feedback effect from specified device. + * The effect will only be erased if it was uploaded through the same + * file handle that is requesting erase. + */ +int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file) +{ + struct ff_device *ff = dev->ff; + int ret; + + if (!test_bit(EV_FF, dev->evbit)) + return -ENOSYS; + + mutex_lock(&ff->mutex); + ret = erase_effect(dev, effect_id, file); + mutex_unlock(&ff->mutex); + + return ret; +} +EXPORT_SYMBOL_GPL(input_ff_erase); + +/* + * flush_effects - erase all effects owned by a file handle + */ +static int flush_effects(struct input_dev *dev, struct file *file) +{ + struct ff_device *ff = dev->ff; + int i; + + pr_debug("flushing now\n"); + + mutex_lock(&ff->mutex); + + for (i = 0; i < ff->max_effects; i++) + erase_effect(dev, i, file); + + mutex_unlock(&ff->mutex); + + return 0; +} + +/** + * input_ff_event() - generic handler for force-feedback events + * @dev: input device to send the effect to + * @type: event type (anything but EV_FF is ignored) + * @code: event code + * @value: event value + */ +int input_ff_event(struct input_dev *dev, unsigned int type, + unsigned int code, int value) +{ + struct ff_device *ff = dev->ff; + + if (type != EV_FF) + return 0; + + switch (code) { + case FF_GAIN: + if (!test_bit(FF_GAIN, dev->ffbit) || value > 0xffff) + break; + + ff->set_gain(dev, value); + break; + + case FF_AUTOCENTER: + if (!test_bit(FF_AUTOCENTER, dev->ffbit) || value > 0xffff) + break; + + ff->set_autocenter(dev, value); + break; + + default: + if (check_effect_access(ff, code, NULL) == 0) + ff->playback(dev, code, value); + break; + } + + return 0; +} +EXPORT_SYMBOL_GPL(input_ff_event); + +/** + * input_ff_create() - create force-feedback device + * @dev: input device supporting force-feedback + * @max_effects: maximum number of effects supported by the device + * + * This function allocates all necessary memory for a force feedback + * portion of an input device and installs all default handlers. + * @dev->ffbit should be already set up before calling this function. + * Once ff device is created you need to setup its upload, erase, + * playback and other handlers before registering input device + */ +int input_ff_create(struct input_dev *dev, unsigned int max_effects) +{ + struct ff_device *ff; + size_t ff_dev_size; + int i; + + if (!max_effects) { + pr_err("cannot allocate device without any effects\n"); + return -EINVAL; + } + + ff_dev_size = sizeof(struct ff_device) + + max_effects * sizeof(struct file *); + if (ff_dev_size < max_effects) /* overflow */ + return -EINVAL; + + ff = kzalloc(ff_dev_size, GFP_KERNEL); + if (!ff) + return -ENOMEM; + + ff->effects = kcalloc(max_effects, sizeof(struct ff_effect), + GFP_KERNEL); + if (!ff->effects) { + kfree(ff); + return -ENOMEM; + } + + ff->max_effects = max_effects; + mutex_init(&ff->mutex); + + dev->ff = ff; + dev->flush = flush_effects; + dev->event = input_ff_event; + __set_bit(EV_FF, dev->evbit); + + /* Copy "true" bits into ff device bitmap */ + for (i = 0; i <= FF_MAX; i++) + if (test_bit(i, dev->ffbit)) + __set_bit(i, ff->ffbit); + + /* we can emulate RUMBLE with periodic effects */ + if (test_bit(FF_PERIODIC, ff->ffbit)) + __set_bit(FF_RUMBLE, dev->ffbit); + + return 0; +} +EXPORT_SYMBOL_GPL(input_ff_create); + +/** + * input_ff_destroy() - frees force feedback portion of input device + * @dev: input device supporting force feedback + * + * This function is only needed in error path as input core will + * automatically free force feedback structures when device is + * destroyed. + */ +void input_ff_destroy(struct input_dev *dev) +{ + struct ff_device *ff = dev->ff; + + __clear_bit(EV_FF, dev->evbit); + if (ff) { + if (ff->destroy) + ff->destroy(ff); + kfree(ff->private); + kfree(ff->effects); + kfree(ff); + dev->ff = NULL; + } +} +EXPORT_SYMBOL_GPL(input_ff_destroy); diff --git a/drivers/input/ff-memless.c b/drivers/input/ff-memless.c new file mode 100644 index 00000000..74c0d8c6 --- /dev/null +++ b/drivers/input/ff-memless.c @@ -0,0 +1,547 @@ +/* + * Force feedback support for memoryless devices + * + * Copyright (c) 2006 Anssi Hannula + * Copyright (c) 2006 Dmitry Torokhov + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* #define DEBUG */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Anssi Hannula "); +MODULE_DESCRIPTION("Force feedback support for memoryless devices"); + +/* Number of effects handled with memoryless devices */ +#define FF_MEMLESS_EFFECTS 16 + +/* Envelope update interval in ms */ +#define FF_ENVELOPE_INTERVAL 50 + +#define FF_EFFECT_STARTED 0 +#define FF_EFFECT_PLAYING 1 +#define FF_EFFECT_ABORTING 2 + +struct ml_effect_state { + struct ff_effect *effect; + unsigned long flags; /* effect state (STARTED, PLAYING, etc) */ + int count; /* loop count of the effect */ + unsigned long play_at; /* start time */ + unsigned long stop_at; /* stop time */ + unsigned long adj_at; /* last time the effect was sent */ +}; + +struct ml_device { + void *private; + struct ml_effect_state states[FF_MEMLESS_EFFECTS]; + int gain; + struct timer_list timer; + struct input_dev *dev; + + int (*play_effect)(struct input_dev *dev, void *data, + struct ff_effect *effect); +}; + +static const struct ff_envelope *get_envelope(const struct ff_effect *effect) +{ + static const struct ff_envelope empty_envelope; + + switch (effect->type) { + case FF_PERIODIC: + return &effect->u.periodic.envelope; + + case FF_CONSTANT: + return &effect->u.constant.envelope; + + default: + return &empty_envelope; + } +} + +/* + * Check for the next time envelope requires an update on memoryless devices + */ +static unsigned long calculate_next_time(struct ml_effect_state *state) +{ + const struct ff_envelope *envelope = get_envelope(state->effect); + unsigned long attack_stop, fade_start, next_fade; + + if (envelope->attack_length) { + attack_stop = state->play_at + + msecs_to_jiffies(envelope->attack_length); + if (time_before(state->adj_at, attack_stop)) + return state->adj_at + + msecs_to_jiffies(FF_ENVELOPE_INTERVAL); + } + + if (state->effect->replay.length) { + if (envelope->fade_length) { + /* check when fading should start */ + fade_start = state->stop_at - + msecs_to_jiffies(envelope->fade_length); + + if (time_before(state->adj_at, fade_start)) + return fade_start; + + /* already fading, advance to next checkpoint */ + next_fade = state->adj_at + + msecs_to_jiffies(FF_ENVELOPE_INTERVAL); + if (time_before(next_fade, state->stop_at)) + return next_fade; + } + + return state->stop_at; + } + + return state->play_at; +} + +static void ml_schedule_timer(struct ml_device *ml) +{ + struct ml_effect_state *state; + unsigned long now = jiffies; + unsigned long earliest = 0; + unsigned long next_at; + int events = 0; + int i; + + pr_debug("calculating next timer\n"); + + for (i = 0; i < FF_MEMLESS_EFFECTS; i++) { + + state = &ml->states[i]; + + if (!test_bit(FF_EFFECT_STARTED, &state->flags)) + continue; + + if (test_bit(FF_EFFECT_PLAYING, &state->flags)) + next_at = calculate_next_time(state); + else + next_at = state->play_at; + + if (time_before_eq(now, next_at) && + (++events == 1 || time_before(next_at, earliest))) + earliest = next_at; + } + + if (!events) { + pr_debug("no actions\n"); + del_timer(&ml->timer); + } else { + pr_debug("timer set\n"); + mod_timer(&ml->timer, earliest); + } +} + +/* + * Apply an envelope to a value + */ +static int apply_envelope(struct ml_effect_state *state, int value, + struct ff_envelope *envelope) +{ + struct ff_effect *effect = state->effect; + unsigned long now = jiffies; + int time_from_level; + int time_of_envelope; + int envelope_level; + int difference; + + if (envelope->attack_length && + time_before(now, + state->play_at + msecs_to_jiffies(envelope->attack_length))) { + pr_debug("value = 0x%x, attack_level = 0x%x\n", + value, envelope->attack_level); + time_from_level = jiffies_to_msecs(now - state->play_at); + time_of_envelope = envelope->attack_length; + envelope_level = min_t(u16, envelope->attack_level, 0x7fff); + + } else if (envelope->fade_length && effect->replay.length && + time_after(now, + state->stop_at - msecs_to_jiffies(envelope->fade_length)) && + time_before(now, state->stop_at)) { + time_from_level = jiffies_to_msecs(state->stop_at - now); + time_of_envelope = envelope->fade_length; + envelope_level = min_t(u16, envelope->fade_level, 0x7fff); + } else + return value; + + difference = abs(value) - envelope_level; + + pr_debug("difference = %d\n", difference); + pr_debug("time_from_level = 0x%x\n", time_from_level); + pr_debug("time_of_envelope = 0x%x\n", time_of_envelope); + + difference = difference * time_from_level / time_of_envelope; + + pr_debug("difference = %d\n", difference); + + return value < 0 ? + -(difference + envelope_level) : (difference + envelope_level); +} + +/* + * Return the type the effect has to be converted into (memless devices) + */ +static int get_compatible_type(struct ff_device *ff, int effect_type) +{ + + if (test_bit(effect_type, ff->ffbit)) + return effect_type; + + if (effect_type == FF_PERIODIC && test_bit(FF_RUMBLE, ff->ffbit)) + return FF_RUMBLE; + + pr_err("invalid type in get_compatible_type()\n"); + + return 0; +} + +/* + * Only left/right direction should be used (under/over 0x8000) for + * forward/reverse motor direction (to keep calculation fast & simple). + */ +static u16 ml_calculate_direction(u16 direction, u16 force, + u16 new_direction, u16 new_force) +{ + if (!force) + return new_direction; + if (!new_force) + return direction; + return (((u32)(direction >> 1) * force + + (new_direction >> 1) * new_force) / + (force + new_force)) << 1; +} + +/* + * Combine two effects and apply gain. + */ +static void ml_combine_effects(struct ff_effect *effect, + struct ml_effect_state *state, + int gain) +{ + struct ff_effect *new = state->effect; + unsigned int strong, weak, i; + int x, y; + fixp_t level; + + switch (new->type) { + case FF_CONSTANT: + i = new->direction * 360 / 0xffff; + level = fixp_new16(apply_envelope(state, + new->u.constant.level, + &new->u.constant.envelope)); + x = fixp_mult(fixp_sin(i), level) * gain / 0xffff; + y = fixp_mult(-fixp_cos(i), level) * gain / 0xffff; + /* + * here we abuse ff_ramp to hold x and y of constant force + * If in future any driver wants something else than x and y + * in s8, this should be changed to something more generic + */ + effect->u.ramp.start_level = + clamp_val(effect->u.ramp.start_level + x, -0x80, 0x7f); + effect->u.ramp.end_level = + clamp_val(effect->u.ramp.end_level + y, -0x80, 0x7f); + break; + + case FF_RUMBLE: + strong = (u32)new->u.rumble.strong_magnitude * gain / 0xffff; + weak = (u32)new->u.rumble.weak_magnitude * gain / 0xffff; + + if (effect->u.rumble.strong_magnitude + strong) + effect->direction = ml_calculate_direction( + effect->direction, + effect->u.rumble.strong_magnitude, + new->direction, strong); + else if (effect->u.rumble.weak_magnitude + weak) + effect->direction = ml_calculate_direction( + effect->direction, + effect->u.rumble.weak_magnitude, + new->direction, weak); + else + effect->direction = 0; + effect->u.rumble.strong_magnitude = + min(strong + effect->u.rumble.strong_magnitude, + 0xffffU); + effect->u.rumble.weak_magnitude = + min(weak + effect->u.rumble.weak_magnitude, 0xffffU); + break; + + case FF_PERIODIC: + i = apply_envelope(state, abs(new->u.periodic.magnitude), + &new->u.periodic.envelope); + + /* here we also scale it 0x7fff => 0xffff */ + i = i * gain / 0x7fff; + + if (effect->u.rumble.strong_magnitude + i) + effect->direction = ml_calculate_direction( + effect->direction, + effect->u.rumble.strong_magnitude, + new->direction, i); + else + effect->direction = 0; + effect->u.rumble.strong_magnitude = + min(i + effect->u.rumble.strong_magnitude, 0xffffU); + effect->u.rumble.weak_magnitude = + min(i + effect->u.rumble.weak_magnitude, 0xffffU); + break; + + default: + pr_err("invalid type in ml_combine_effects()\n"); + break; + } + +} + + +/* + * Because memoryless devices have only one effect per effect type active + * at one time we have to combine multiple effects into one + */ +static int ml_get_combo_effect(struct ml_device *ml, + unsigned long *effect_handled, + struct ff_effect *combo_effect) +{ + struct ff_effect *effect; + struct ml_effect_state *state; + int effect_type; + int i; + + memset(combo_effect, 0, sizeof(struct ff_effect)); + + for (i = 0; i < FF_MEMLESS_EFFECTS; i++) { + if (__test_and_set_bit(i, effect_handled)) + continue; + + state = &ml->states[i]; + effect = state->effect; + + if (!test_bit(FF_EFFECT_STARTED, &state->flags)) + continue; + + if (time_before(jiffies, state->play_at)) + continue; + + /* + * here we have started effects that are either + * currently playing (and may need be aborted) + * or need to start playing. + */ + effect_type = get_compatible_type(ml->dev->ff, effect->type); + if (combo_effect->type != effect_type) { + if (combo_effect->type != 0) { + __clear_bit(i, effect_handled); + continue; + } + combo_effect->type = effect_type; + } + + if (__test_and_clear_bit(FF_EFFECT_ABORTING, &state->flags)) { + __clear_bit(FF_EFFECT_PLAYING, &state->flags); + __clear_bit(FF_EFFECT_STARTED, &state->flags); + } else if (effect->replay.length && + time_after_eq(jiffies, state->stop_at)) { + + __clear_bit(FF_EFFECT_PLAYING, &state->flags); + + if (--state->count <= 0) { + __clear_bit(FF_EFFECT_STARTED, &state->flags); + } else { + state->play_at = jiffies + + msecs_to_jiffies(effect->replay.delay); + state->stop_at = state->play_at + + msecs_to_jiffies(effect->replay.length); + } + } else { + __set_bit(FF_EFFECT_PLAYING, &state->flags); + state->adj_at = jiffies; + ml_combine_effects(combo_effect, state, ml->gain); + } + } + + return combo_effect->type != 0; +} + +static void ml_play_effects(struct ml_device *ml) +{ + struct ff_effect effect; + DECLARE_BITMAP(handled_bm, FF_MEMLESS_EFFECTS); + + memset(handled_bm, 0, sizeof(handled_bm)); + + while (ml_get_combo_effect(ml, handled_bm, &effect)) + ml->play_effect(ml->dev, ml->private, &effect); + + ml_schedule_timer(ml); +} + +static void ml_effect_timer(unsigned long timer_data) +{ + struct input_dev *dev = (struct input_dev *)timer_data; + struct ml_device *ml = dev->ff->private; + unsigned long flags; + + pr_debug("timer: updating effects\n"); + + spin_lock_irqsave(&dev->event_lock, flags); + ml_play_effects(ml); + spin_unlock_irqrestore(&dev->event_lock, flags); +} + +/* + * Sets requested gain for FF effects. Called with dev->event_lock held. + */ +static void ml_ff_set_gain(struct input_dev *dev, u16 gain) +{ + struct ml_device *ml = dev->ff->private; + int i; + + ml->gain = gain; + + for (i = 0; i < FF_MEMLESS_EFFECTS; i++) + __clear_bit(FF_EFFECT_PLAYING, &ml->states[i].flags); + + ml_play_effects(ml); +} + +/* + * Start/stop specified FF effect. Called with dev->event_lock held. + */ +static int ml_ff_playback(struct input_dev *dev, int effect_id, int value) +{ + struct ml_device *ml = dev->ff->private; + struct ml_effect_state *state = &ml->states[effect_id]; + + if (value > 0) { + pr_debug("initiated play\n"); + + __set_bit(FF_EFFECT_STARTED, &state->flags); + state->count = value; + state->play_at = jiffies + + msecs_to_jiffies(state->effect->replay.delay); + state->stop_at = state->play_at + + msecs_to_jiffies(state->effect->replay.length); + state->adj_at = state->play_at; + + } else { + pr_debug("initiated stop\n"); + + if (test_bit(FF_EFFECT_PLAYING, &state->flags)) + __set_bit(FF_EFFECT_ABORTING, &state->flags); + else + __clear_bit(FF_EFFECT_STARTED, &state->flags); + } + + ml_play_effects(ml); + + return 0; +} + +static int ml_ff_upload(struct input_dev *dev, + struct ff_effect *effect, struct ff_effect *old) +{ + struct ml_device *ml = dev->ff->private; + struct ml_effect_state *state = &ml->states[effect->id]; + + spin_lock_irq(&dev->event_lock); + + if (test_bit(FF_EFFECT_STARTED, &state->flags)) { + __clear_bit(FF_EFFECT_PLAYING, &state->flags); + state->play_at = jiffies + + msecs_to_jiffies(state->effect->replay.delay); + state->stop_at = state->play_at + + msecs_to_jiffies(state->effect->replay.length); + state->adj_at = state->play_at; + ml_schedule_timer(ml); + } + + spin_unlock_irq(&dev->event_lock); + + return 0; +} + +static void ml_ff_destroy(struct ff_device *ff) +{ + struct ml_device *ml = ff->private; + + kfree(ml->private); +} + +/** + * input_ff_create_memless() - create memoryless force-feedback device + * @dev: input device supporting force-feedback + * @data: driver-specific data to be passed into @play_effect + * @play_effect: driver-specific method for playing FF effect + */ +int input_ff_create_memless(struct input_dev *dev, void *data, + int (*play_effect)(struct input_dev *, void *, struct ff_effect *)) +{ + struct ml_device *ml; + struct ff_device *ff; + int error; + int i; + + ml = kzalloc(sizeof(struct ml_device), GFP_KERNEL); + if (!ml) + return -ENOMEM; + + ml->dev = dev; + ml->private = data; + ml->play_effect = play_effect; + ml->gain = 0xffff; + setup_timer(&ml->timer, ml_effect_timer, (unsigned long)dev); + + set_bit(FF_GAIN, dev->ffbit); + + error = input_ff_create(dev, FF_MEMLESS_EFFECTS); + if (error) { + kfree(ml); + return error; + } + + ff = dev->ff; + ff->private = ml; + ff->upload = ml_ff_upload; + ff->playback = ml_ff_playback; + ff->set_gain = ml_ff_set_gain; + ff->destroy = ml_ff_destroy; + + /* we can emulate periodic effects with RUMBLE */ + if (test_bit(FF_RUMBLE, ff->ffbit)) { + set_bit(FF_PERIODIC, dev->ffbit); + set_bit(FF_SINE, dev->ffbit); + set_bit(FF_TRIANGLE, dev->ffbit); + set_bit(FF_SQUARE, dev->ffbit); + } + + for (i = 0; i < FF_MEMLESS_EFFECTS; i++) + ml->states[i].effect = &ff->effects[i]; + + return 0; +} +EXPORT_SYMBOL_GPL(input_ff_create_memless); diff --git a/drivers/input/gameport/Kconfig b/drivers/input/gameport/Kconfig new file mode 100644 index 00000000..d279454a --- /dev/null +++ b/drivers/input/gameport/Kconfig @@ -0,0 +1,63 @@ +# +# Gameport configuration +# +config GAMEPORT + tristate "Gameport support" + ---help--- + Gameport support is for the standard 15-pin PC gameport. If you + have a joystick, gamepad, gameport card, a soundcard with a gameport + or anything else that uses the gameport, say Y or M here and also to + at least one of the hardware specific drivers. + + For Ensoniq AudioPCI (ES1370), AudioPCI 97 (ES1371), ESS Solo1, + S3 SonicVibes, Trident 4DWave, SiS7018, and ALi 5451 gameport + support is provided by the sound drivers, so you won't need any + from the below listed modules. You still need to say Y here. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called gameport. + +if GAMEPORT + +config GAMEPORT_NS558 + tristate "Classic ISA and PnP gameport support" + help + Say Y here if you have an ISA or PnP gameport. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called ns558. + +config GAMEPORT_L4 + tristate "PDPI Lightning 4 gamecard support" + help + Say Y here if you have a PDPI Lightning 4 gamecard. + + To compile this driver as a module, choose M here: the + module will be called lightning. + +config GAMEPORT_EMU10K1 + tristate "SB Live and Audigy gameport support" + depends on PCI + help + Say Y here if you have a SoundBlaster Live! or SoundBlaster + Audigy card and want to use its gameport. + + To compile this driver as a module, choose M here: the + module will be called emu10k1-gp. + +config GAMEPORT_FM801 + tristate "ForteMedia FM801 gameport support" + depends on PCI + help + Say Y here if you have ForteMedia FM801 PCI audio controller + (Abit AU10, Genius Sound Maker, HP Workstation zx2000, + and others), and want to use its gameport. + + To compile this driver as a module, choose M here: the + module will be called fm801-gp. + +endif diff --git a/drivers/input/gameport/Makefile b/drivers/input/gameport/Makefile new file mode 100644 index 00000000..b6f6097b --- /dev/null +++ b/drivers/input/gameport/Makefile @@ -0,0 +1,11 @@ +# +# Makefile for the gameport drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_GAMEPORT) += gameport.o +obj-$(CONFIG_GAMEPORT_EMU10K1) += emu10k1-gp.o +obj-$(CONFIG_GAMEPORT_FM801) += fm801-gp.o +obj-$(CONFIG_GAMEPORT_L4) += lightning.o +obj-$(CONFIG_GAMEPORT_NS558) += ns558.o diff --git a/drivers/input/gameport/emu10k1-gp.c b/drivers/input/gameport/emu10k1-gp.c new file mode 100644 index 00000000..fa7a95c1 --- /dev/null +++ b/drivers/input/gameport/emu10k1-gp.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2001 Vojtech Pavlik + */ + +/* + * EMU10k1 - SB Live / Audigy - gameport driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include + +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("EMU10k1 gameport driver"); +MODULE_LICENSE("GPL"); + +struct emu { + struct pci_dev *dev; + struct gameport *gameport; + int io; + int size; +}; + +static const struct pci_device_id emu_tbl[] = { + + { 0x1102, 0x7002, PCI_ANY_ID, PCI_ANY_ID }, /* SB Live gameport */ + { 0x1102, 0x7003, PCI_ANY_ID, PCI_ANY_ID }, /* Audigy gameport */ + { 0x1102, 0x7004, PCI_ANY_ID, PCI_ANY_ID }, /* Dell SB Live */ + { 0x1102, 0x7005, PCI_ANY_ID, PCI_ANY_ID }, /* Audigy LS gameport */ + { 0, } +}; + +MODULE_DEVICE_TABLE(pci, emu_tbl); + +static int emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + struct emu *emu; + struct gameport *port; + int error; + + emu = kzalloc(sizeof(struct emu), GFP_KERNEL); + port = gameport_allocate_port(); + if (!emu || !port) { + printk(KERN_ERR "emu10k1-gp: Memory allocation failed\n"); + error = -ENOMEM; + goto err_out_free; + } + + error = pci_enable_device(pdev); + if (error) + goto err_out_free; + + emu->io = pci_resource_start(pdev, 0); + emu->size = pci_resource_len(pdev, 0); + + emu->dev = pdev; + emu->gameport = port; + + gameport_set_name(port, "EMU10K1"); + gameport_set_phys(port, "pci%s/gameport0", pci_name(pdev)); + port->dev.parent = &pdev->dev; + port->io = emu->io; + + if (!request_region(emu->io, emu->size, "emu10k1-gp")) { + printk(KERN_ERR "emu10k1-gp: unable to grab region 0x%x-0x%x\n", + emu->io, emu->io + emu->size - 1); + error = -EBUSY; + goto err_out_disable_dev; + } + + pci_set_drvdata(pdev, emu); + + gameport_register_port(port); + + return 0; + + err_out_disable_dev: + pci_disable_device(pdev); + err_out_free: + gameport_free_port(port); + kfree(emu); + return error; +} + +static void emu_remove(struct pci_dev *pdev) +{ + struct emu *emu = pci_get_drvdata(pdev); + + gameport_unregister_port(emu->gameport); + release_region(emu->io, emu->size); + kfree(emu); + + pci_disable_device(pdev); +} + +static struct pci_driver emu_driver = { + .name = "Emu10k1_gameport", + .id_table = emu_tbl, + .probe = emu_probe, + .remove = emu_remove, +}; + +module_pci_driver(emu_driver); diff --git a/drivers/input/gameport/fm801-gp.c b/drivers/input/gameport/fm801-gp.c new file mode 100644 index 00000000..ae912d3a --- /dev/null +++ b/drivers/input/gameport/fm801-gp.c @@ -0,0 +1,160 @@ +/* + * FM801 gameport driver for Linux + * + * Copyright (c) by Takashi Iwai + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PCI_VENDOR_ID_FORTEMEDIA 0x1319 +#define PCI_DEVICE_ID_FM801_GP 0x0802 + +#define HAVE_COOKED + +struct fm801_gp { + struct gameport *gameport; + struct resource *res_port; +}; + +#ifdef HAVE_COOKED +static int fm801_gp_cooked_read(struct gameport *gameport, int *axes, int *buttons) +{ + unsigned short w; + + w = inw(gameport->io + 2); + *buttons = (~w >> 14) & 0x03; + axes[0] = (w == 0xffff) ? -1 : ((w & 0x1fff) << 5); + w = inw(gameport->io + 4); + axes[1] = (w == 0xffff) ? -1 : ((w & 0x1fff) << 5); + w = inw(gameport->io + 6); + *buttons |= ((~w >> 14) & 0x03) << 2; + axes[2] = (w == 0xffff) ? -1 : ((w & 0x1fff) << 5); + w = inw(gameport->io + 8); + axes[3] = (w == 0xffff) ? -1 : ((w & 0x1fff) << 5); + outw(0xff, gameport->io); /* reset */ + + return 0; +} +#endif + +static int fm801_gp_open(struct gameport *gameport, int mode) +{ + switch (mode) { +#ifdef HAVE_COOKED + case GAMEPORT_MODE_COOKED: + return 0; +#endif + case GAMEPORT_MODE_RAW: + return 0; + default: + return -1; + } + + return 0; +} + +static int fm801_gp_probe(struct pci_dev *pci, const struct pci_device_id *id) +{ + struct fm801_gp *gp; + struct gameport *port; + int error; + + gp = kzalloc(sizeof(struct fm801_gp), GFP_KERNEL); + port = gameport_allocate_port(); + if (!gp || !port) { + printk(KERN_ERR "fm801-gp: Memory allocation failed\n"); + error = -ENOMEM; + goto err_out_free; + } + + error = pci_enable_device(pci); + if (error) + goto err_out_free; + + port->open = fm801_gp_open; +#ifdef HAVE_COOKED + port->cooked_read = fm801_gp_cooked_read; +#endif + gameport_set_name(port, "FM801"); + gameport_set_phys(port, "pci%s/gameport0", pci_name(pci)); + port->dev.parent = &pci->dev; + port->io = pci_resource_start(pci, 0); + + gp->gameport = port; + gp->res_port = request_region(port->io, 0x10, "FM801 GP"); + if (!gp->res_port) { + printk(KERN_DEBUG "fm801-gp: unable to grab region 0x%x-0x%x\n", + port->io, port->io + 0x0f); + error = -EBUSY; + goto err_out_disable_dev; + } + + pci_set_drvdata(pci, gp); + + outb(0x60, port->io + 0x0d); /* enable joystick 1 and 2 */ + gameport_register_port(port); + + return 0; + + err_out_disable_dev: + pci_disable_device(pci); + err_out_free: + gameport_free_port(port); + kfree(gp); + return error; +} + +static void fm801_gp_remove(struct pci_dev *pci) +{ + struct fm801_gp *gp = pci_get_drvdata(pci); + + gameport_unregister_port(gp->gameport); + release_resource(gp->res_port); + kfree(gp); + + pci_disable_device(pci); +} + +static const struct pci_device_id fm801_gp_id_table[] = { + { PCI_VENDOR_ID_FORTEMEDIA, PCI_DEVICE_ID_FM801_GP, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, + { 0 } +}; +MODULE_DEVICE_TABLE(pci, fm801_gp_id_table); + +static struct pci_driver fm801_gp_driver = { + .name = "FM801_gameport", + .id_table = fm801_gp_id_table, + .probe = fm801_gp_probe, + .remove = fm801_gp_remove, +}; + +module_pci_driver(fm801_gp_driver); + +MODULE_DESCRIPTION("FM801 gameport driver"); +MODULE_AUTHOR("Takashi Iwai "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c new file mode 100644 index 00000000..da739d9d --- /dev/null +++ b/drivers/input/gameport/gameport.c @@ -0,0 +1,818 @@ +/* + * Generic gameport layer + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * Copyright (c) 2005 Dmitry Torokhov + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include /* HZ */ +#include + +/*#include */ + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Generic gameport layer"); +MODULE_LICENSE("GPL"); + +/* + * gameport_mutex protects entire gameport subsystem and is taken + * every time gameport port or driver registrered or unregistered. + */ +static DEFINE_MUTEX(gameport_mutex); + +static LIST_HEAD(gameport_list); + +static struct bus_type gameport_bus; + +static void gameport_add_port(struct gameport *gameport); +static void gameport_attach_driver(struct gameport_driver *drv); +static void gameport_reconnect_port(struct gameport *gameport); +static void gameport_disconnect_port(struct gameport *gameport); + +#if defined(__i386__) + +#include + +#define DELTA(x,y) ((y)-(x)+((y)<(x)?1193182/HZ:0)) +#define GET_TIME(x) do { x = get_time_pit(); } while (0) + +static unsigned int get_time_pit(void) +{ + unsigned long flags; + unsigned int count; + + raw_spin_lock_irqsave(&i8253_lock, flags); + outb_p(0x00, 0x43); + count = inb_p(0x40); + count |= inb_p(0x40) << 8; + raw_spin_unlock_irqrestore(&i8253_lock, flags); + + return count; +} + +#endif + + + +/* + * gameport_measure_speed() measures the gameport i/o speed. + */ + +static int gameport_measure_speed(struct gameport *gameport) +{ +#if defined(__i386__) + + unsigned int i, t, t1, t2, t3, tx; + unsigned long flags; + + if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) + return 0; + + tx = 1 << 30; + + for(i = 0; i < 50; i++) { + local_irq_save(flags); + GET_TIME(t1); + for (t = 0; t < 50; t++) gameport_read(gameport); + GET_TIME(t2); + GET_TIME(t3); + local_irq_restore(flags); + udelay(i * 10); + if ((t = DELTA(t2,t1) - DELTA(t3,t2)) < tx) tx = t; + } + + gameport_close(gameport); + return 59659 / (tx < 1 ? 1 : tx); + +#elif defined (__x86_64__) + + unsigned int i, t; + unsigned long tx, t1, t2, flags; + + if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) + return 0; + + tx = 1 << 30; + + for(i = 0; i < 50; i++) { + local_irq_save(flags); + rdtscl(t1); + for (t = 0; t < 50; t++) gameport_read(gameport); + rdtscl(t2); + local_irq_restore(flags); + udelay(i * 10); + if (t2 - t1 < tx) tx = t2 - t1; + } + + gameport_close(gameport); + return (this_cpu_read(cpu_info.loops_per_jiffy) * + (unsigned long)HZ / (1000 / 50)) / (tx < 1 ? 1 : tx); + +#else + + unsigned int j, t = 0; + + if (gameport_open(gameport, NULL, GAMEPORT_MODE_RAW)) + return 0; + + j = jiffies; while (j == jiffies); + j = jiffies; while (j == jiffies) { t++; gameport_read(gameport); } + + gameport_close(gameport); + return t * HZ / 1000; + +#endif +} + +void gameport_start_polling(struct gameport *gameport) +{ + spin_lock(&gameport->timer_lock); + + if (!gameport->poll_cnt++) { + BUG_ON(!gameport->poll_handler); + BUG_ON(!gameport->poll_interval); + mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval)); + } + + spin_unlock(&gameport->timer_lock); +} +EXPORT_SYMBOL(gameport_start_polling); + +void gameport_stop_polling(struct gameport *gameport) +{ + spin_lock(&gameport->timer_lock); + + if (!--gameport->poll_cnt) + del_timer(&gameport->poll_timer); + + spin_unlock(&gameport->timer_lock); +} +EXPORT_SYMBOL(gameport_stop_polling); + +static void gameport_run_poll_handler(unsigned long d) +{ + struct gameport *gameport = (struct gameport *)d; + + gameport->poll_handler(gameport); + if (gameport->poll_cnt) + mod_timer(&gameport->poll_timer, jiffies + msecs_to_jiffies(gameport->poll_interval)); +} + +/* + * Basic gameport -> driver core mappings + */ + +static int gameport_bind_driver(struct gameport *gameport, struct gameport_driver *drv) +{ + int error; + + gameport->dev.driver = &drv->driver; + if (drv->connect(gameport, drv)) { + gameport->dev.driver = NULL; + return -ENODEV; + } + + error = device_bind_driver(&gameport->dev); + if (error) { + dev_warn(&gameport->dev, + "device_bind_driver() failed for %s (%s) and %s, error: %d\n", + gameport->phys, gameport->name, + drv->description, error); + drv->disconnect(gameport); + gameport->dev.driver = NULL; + return error; + } + + return 0; +} + +static void gameport_find_driver(struct gameport *gameport) +{ + int error; + + error = device_attach(&gameport->dev); + if (error < 0) + dev_warn(&gameport->dev, + "device_attach() failed for %s (%s), error: %d\n", + gameport->phys, gameport->name, error); +} + + +/* + * Gameport event processing. + */ + +enum gameport_event_type { + GAMEPORT_REGISTER_PORT, + GAMEPORT_ATTACH_DRIVER, +}; + +struct gameport_event { + enum gameport_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +static DEFINE_SPINLOCK(gameport_event_lock); /* protects gameport_event_list */ +static LIST_HEAD(gameport_event_list); + +static struct gameport_event *gameport_get_event(void) +{ + struct gameport_event *event = NULL; + unsigned long flags; + + spin_lock_irqsave(&gameport_event_lock, flags); + + if (!list_empty(&gameport_event_list)) { + event = list_first_entry(&gameport_event_list, + struct gameport_event, node); + list_del_init(&event->node); + } + + spin_unlock_irqrestore(&gameport_event_lock, flags); + return event; +} + +static void gameport_free_event(struct gameport_event *event) +{ + module_put(event->owner); + kfree(event); +} + +static void gameport_remove_duplicate_events(struct gameport_event *event) +{ + struct gameport_event *e, *next; + unsigned long flags; + + spin_lock_irqsave(&gameport_event_lock, flags); + + list_for_each_entry_safe(e, next, &gameport_event_list, node) { + if (event->object == e->object) { + /* + * If this event is of different type we should not + * look further - we only suppress duplicate events + * that were sent back-to-back. + */ + if (event->type != e->type) + break; + + list_del_init(&e->node); + gameport_free_event(e); + } + } + + spin_unlock_irqrestore(&gameport_event_lock, flags); +} + + +static void gameport_handle_events(struct work_struct *work) +{ + struct gameport_event *event; + + mutex_lock(&gameport_mutex); + + /* + * Note that we handle only one event here to give swsusp + * a chance to freeze kgameportd thread. Gameport events + * should be pretty rare so we are not concerned about + * taking performance hit. + */ + if ((event = gameport_get_event())) { + + switch (event->type) { + + case GAMEPORT_REGISTER_PORT: + gameport_add_port(event->object); + break; + + case GAMEPORT_ATTACH_DRIVER: + gameport_attach_driver(event->object); + break; + } + + gameport_remove_duplicate_events(event); + gameport_free_event(event); + } + + mutex_unlock(&gameport_mutex); +} + +static DECLARE_WORK(gameport_event_work, gameport_handle_events); + +static int gameport_queue_event(void *object, struct module *owner, + enum gameport_event_type event_type) +{ + unsigned long flags; + struct gameport_event *event; + int retval = 0; + + spin_lock_irqsave(&gameport_event_lock, flags); + + /* + * Scan event list for the other events for the same gameport port, + * starting with the most recent one. If event is the same we + * do not need add new one. If event is of different type we + * need to add this event and should not look further because + * we need to preserve sequence of distinct events. + */ + list_for_each_entry_reverse(event, &gameport_event_list, node) { + if (event->object == object) { + if (event->type == event_type) + goto out; + break; + } + } + + event = kmalloc(sizeof(struct gameport_event), GFP_ATOMIC); + if (!event) { + pr_err("Not enough memory to queue event %d\n", event_type); + retval = -ENOMEM; + goto out; + } + + if (!try_module_get(owner)) { + pr_warning("Can't get module reference, dropping event %d\n", + event_type); + kfree(event); + retval = -EINVAL; + goto out; + } + + event->type = event_type; + event->object = object; + event->owner = owner; + + list_add_tail(&event->node, &gameport_event_list); + queue_work(system_long_wq, &gameport_event_work); + +out: + spin_unlock_irqrestore(&gameport_event_lock, flags); + return retval; +} + +/* + * Remove all events that have been submitted for a given object, + * be it a gameport port or a driver. + */ +static void gameport_remove_pending_events(void *object) +{ + struct gameport_event *event, *next; + unsigned long flags; + + spin_lock_irqsave(&gameport_event_lock, flags); + + list_for_each_entry_safe(event, next, &gameport_event_list, node) { + if (event->object == object) { + list_del_init(&event->node); + gameport_free_event(event); + } + } + + spin_unlock_irqrestore(&gameport_event_lock, flags); +} + +/* + * Destroy child gameport port (if any) that has not been fully registered yet. + * + * Note that we rely on the fact that port can have only one child and therefore + * only one child registration request can be pending. Additionally, children + * are registered by driver's connect() handler so there can't be a grandchild + * pending registration together with a child. + */ +static struct gameport *gameport_get_pending_child(struct gameport *parent) +{ + struct gameport_event *event; + struct gameport *gameport, *child = NULL; + unsigned long flags; + + spin_lock_irqsave(&gameport_event_lock, flags); + + list_for_each_entry(event, &gameport_event_list, node) { + if (event->type == GAMEPORT_REGISTER_PORT) { + gameport = event->object; + if (gameport->parent == parent) { + child = gameport; + break; + } + } + } + + spin_unlock_irqrestore(&gameport_event_lock, flags); + return child; +} + +/* + * Gameport port operations + */ + +static ssize_t gameport_show_description(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct gameport *gameport = to_gameport_port(dev); + + return sprintf(buf, "%s\n", gameport->name); +} + +static ssize_t gameport_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct gameport *gameport = to_gameport_port(dev); + struct device_driver *drv; + int error; + + error = mutex_lock_interruptible(&gameport_mutex); + if (error) + return error; + + if (!strncmp(buf, "none", count)) { + gameport_disconnect_port(gameport); + } else if (!strncmp(buf, "reconnect", count)) { + gameport_reconnect_port(gameport); + } else if (!strncmp(buf, "rescan", count)) { + gameport_disconnect_port(gameport); + gameport_find_driver(gameport); + } else if ((drv = driver_find(buf, &gameport_bus)) != NULL) { + gameport_disconnect_port(gameport); + error = gameport_bind_driver(gameport, to_gameport_driver(drv)); + } else { + error = -EINVAL; + } + + mutex_unlock(&gameport_mutex); + + return error ? error : count; +} + +static struct device_attribute gameport_device_attrs[] = { + __ATTR(description, S_IRUGO, gameport_show_description, NULL), + __ATTR(drvctl, S_IWUSR, NULL, gameport_rebind_driver), + __ATTR_NULL +}; + +static void gameport_release_port(struct device *dev) +{ + struct gameport *gameport = to_gameport_port(dev); + + kfree(gameport); + module_put(THIS_MODULE); +} + +void gameport_set_phys(struct gameport *gameport, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vsnprintf(gameport->phys, sizeof(gameport->phys), fmt, args); + va_end(args); +} +EXPORT_SYMBOL(gameport_set_phys); + +/* + * Prepare gameport port for registration. + */ +static void gameport_init_port(struct gameport *gameport) +{ + static atomic_t gameport_no = ATOMIC_INIT(0); + + __module_get(THIS_MODULE); + + mutex_init(&gameport->drv_mutex); + device_initialize(&gameport->dev); + dev_set_name(&gameport->dev, "gameport%lu", + (unsigned long)atomic_inc_return(&gameport_no) - 1); + gameport->dev.bus = &gameport_bus; + gameport->dev.release = gameport_release_port; + if (gameport->parent) + gameport->dev.parent = &gameport->parent->dev; + + INIT_LIST_HEAD(&gameport->node); + spin_lock_init(&gameport->timer_lock); + init_timer(&gameport->poll_timer); + gameport->poll_timer.function = gameport_run_poll_handler; + gameport->poll_timer.data = (unsigned long)gameport; +} + +/* + * Complete gameport port registration. + * Driver core will attempt to find appropriate driver for the port. + */ +static void gameport_add_port(struct gameport *gameport) +{ + int error; + + if (gameport->parent) + gameport->parent->child = gameport; + + gameport->speed = gameport_measure_speed(gameport); + + list_add_tail(&gameport->node, &gameport_list); + + if (gameport->io) + dev_info(&gameport->dev, "%s is %s, io %#x, speed %dkHz\n", + gameport->name, gameport->phys, gameport->io, gameport->speed); + else + dev_info(&gameport->dev, "%s is %s, speed %dkHz\n", + gameport->name, gameport->phys, gameport->speed); + + error = device_add(&gameport->dev); + if (error) + dev_err(&gameport->dev, + "device_add() failed for %s (%s), error: %d\n", + gameport->phys, gameport->name, error); +} + +/* + * gameport_destroy_port() completes deregistration process and removes + * port from the system + */ +static void gameport_destroy_port(struct gameport *gameport) +{ + struct gameport *child; + + child = gameport_get_pending_child(gameport); + if (child) { + gameport_remove_pending_events(child); + put_device(&child->dev); + } + + if (gameport->parent) { + gameport->parent->child = NULL; + gameport->parent = NULL; + } + + if (device_is_registered(&gameport->dev)) + device_del(&gameport->dev); + + list_del_init(&gameport->node); + + gameport_remove_pending_events(gameport); + put_device(&gameport->dev); +} + +/* + * Reconnect gameport port and all its children (re-initialize attached devices) + */ +static void gameport_reconnect_port(struct gameport *gameport) +{ + do { + if (!gameport->drv || !gameport->drv->reconnect || gameport->drv->reconnect(gameport)) { + gameport_disconnect_port(gameport); + gameport_find_driver(gameport); + /* Ok, old children are now gone, we are done */ + break; + } + gameport = gameport->child; + } while (gameport); +} + +/* + * gameport_disconnect_port() unbinds a port from its driver. As a side effect + * all child ports are unbound and destroyed. + */ +static void gameport_disconnect_port(struct gameport *gameport) +{ + struct gameport *s, *parent; + + if (gameport->child) { + /* + * Children ports should be disconnected and destroyed + * first, staring with the leaf one, since we don't want + * to do recursion + */ + for (s = gameport; s->child; s = s->child) + /* empty */; + + do { + parent = s->parent; + + device_release_driver(&s->dev); + gameport_destroy_port(s); + } while ((s = parent) != gameport); + } + + /* + * Ok, no children left, now disconnect this port + */ + device_release_driver(&gameport->dev); +} + +/* + * Submits register request to kgameportd for subsequent execution. + * Note that port registration is always asynchronous. + */ +void __gameport_register_port(struct gameport *gameport, struct module *owner) +{ + gameport_init_port(gameport); + gameport_queue_event(gameport, owner, GAMEPORT_REGISTER_PORT); +} +EXPORT_SYMBOL(__gameport_register_port); + +/* + * Synchronously unregisters gameport port. + */ +void gameport_unregister_port(struct gameport *gameport) +{ + mutex_lock(&gameport_mutex); + gameport_disconnect_port(gameport); + gameport_destroy_port(gameport); + mutex_unlock(&gameport_mutex); +} +EXPORT_SYMBOL(gameport_unregister_port); + + +/* + * Gameport driver operations + */ + +static ssize_t gameport_driver_show_description(struct device_driver *drv, char *buf) +{ + struct gameport_driver *driver = to_gameport_driver(drv); + return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)"); +} + +static struct driver_attribute gameport_driver_attrs[] = { + __ATTR(description, S_IRUGO, gameport_driver_show_description, NULL), + __ATTR_NULL +}; + +static int gameport_driver_probe(struct device *dev) +{ + struct gameport *gameport = to_gameport_port(dev); + struct gameport_driver *drv = to_gameport_driver(dev->driver); + + drv->connect(gameport, drv); + return gameport->drv ? 0 : -ENODEV; +} + +static int gameport_driver_remove(struct device *dev) +{ + struct gameport *gameport = to_gameport_port(dev); + struct gameport_driver *drv = to_gameport_driver(dev->driver); + + drv->disconnect(gameport); + return 0; +} + +static void gameport_attach_driver(struct gameport_driver *drv) +{ + int error; + + error = driver_attach(&drv->driver); + if (error) + pr_err("driver_attach() failed for %s, error: %d\n", + drv->driver.name, error); +} + +int __gameport_register_driver(struct gameport_driver *drv, struct module *owner, + const char *mod_name) +{ + int error; + + drv->driver.bus = &gameport_bus; + drv->driver.owner = owner; + drv->driver.mod_name = mod_name; + + /* + * Temporarily disable automatic binding because probing + * takes long time and we are better off doing it in kgameportd + */ + drv->ignore = true; + + error = driver_register(&drv->driver); + if (error) { + pr_err("driver_register() failed for %s, error: %d\n", + drv->driver.name, error); + return error; + } + + /* + * Reset ignore flag and let kgameportd bind the driver to free ports + */ + drv->ignore = false; + error = gameport_queue_event(drv, NULL, GAMEPORT_ATTACH_DRIVER); + if (error) { + driver_unregister(&drv->driver); + return error; + } + + return 0; +} +EXPORT_SYMBOL(__gameport_register_driver); + +void gameport_unregister_driver(struct gameport_driver *drv) +{ + struct gameport *gameport; + + mutex_lock(&gameport_mutex); + + drv->ignore = true; /* so gameport_find_driver ignores it */ + gameport_remove_pending_events(drv); + +start_over: + list_for_each_entry(gameport, &gameport_list, node) { + if (gameport->drv == drv) { + gameport_disconnect_port(gameport); + gameport_find_driver(gameport); + /* we could've deleted some ports, restart */ + goto start_over; + } + } + + driver_unregister(&drv->driver); + + mutex_unlock(&gameport_mutex); +} +EXPORT_SYMBOL(gameport_unregister_driver); + +static int gameport_bus_match(struct device *dev, struct device_driver *drv) +{ + struct gameport_driver *gameport_drv = to_gameport_driver(drv); + + return !gameport_drv->ignore; +} + +static struct bus_type gameport_bus = { + .name = "gameport", + .dev_attrs = gameport_device_attrs, + .drv_attrs = gameport_driver_attrs, + .match = gameport_bus_match, + .probe = gameport_driver_probe, + .remove = gameport_driver_remove, +}; + +static void gameport_set_drv(struct gameport *gameport, struct gameport_driver *drv) +{ + mutex_lock(&gameport->drv_mutex); + gameport->drv = drv; + mutex_unlock(&gameport->drv_mutex); +} + +int gameport_open(struct gameport *gameport, struct gameport_driver *drv, int mode) +{ + if (gameport->open) { + if (gameport->open(gameport, mode)) { + return -1; + } + } else { + if (mode != GAMEPORT_MODE_RAW) + return -1; + } + + gameport_set_drv(gameport, drv); + return 0; +} +EXPORT_SYMBOL(gameport_open); + +void gameport_close(struct gameport *gameport) +{ + del_timer_sync(&gameport->poll_timer); + gameport->poll_handler = NULL; + gameport->poll_interval = 0; + gameport_set_drv(gameport, NULL); + if (gameport->close) + gameport->close(gameport); +} +EXPORT_SYMBOL(gameport_close); + +static int __init gameport_init(void) +{ + int error; + + error = bus_register(&gameport_bus); + if (error) { + pr_err("failed to register gameport bus, error: %d\n", error); + return error; + } + + + return 0; +} + +static void __exit gameport_exit(void) +{ + bus_unregister(&gameport_bus); + + /* + * There should not be any outstanding events but work may + * still be scheduled so simply cancel it. + */ + cancel_work_sync(&gameport_event_work); +} + +subsys_initcall(gameport_init); +module_exit(gameport_exit); diff --git a/drivers/input/gameport/lightning.c b/drivers/input/gameport/lightning.c new file mode 100644 index 00000000..85d6ee09 --- /dev/null +++ b/drivers/input/gameport/lightning.c @@ -0,0 +1,341 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + */ + +/* + * PDPI Lightning 4 gamecard driver for Linux. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define L4_PORT 0x201 +#define L4_SELECT_ANALOG 0xa4 +#define L4_SELECT_DIGITAL 0xa5 +#define L4_SELECT_SECONDARY 0xa6 +#define L4_CMD_ID 0x80 +#define L4_CMD_GETCAL 0x92 +#define L4_CMD_SETCAL 0x93 +#define L4_ID 0x04 +#define L4_BUSY 0x01 +#define L4_TIMEOUT 80 /* 80 us */ + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("PDPI Lightning 4 gamecard driver"); +MODULE_LICENSE("GPL"); + +struct l4 { + struct gameport *gameport; + unsigned char port; +}; + +static struct l4 l4_ports[8]; + +/* + * l4_wait_ready() waits for the L4 to become ready. + */ + +static int l4_wait_ready(void) +{ + unsigned int t = L4_TIMEOUT; + + while ((inb(L4_PORT) & L4_BUSY) && t > 0) t--; + return -(t <= 0); +} + +/* + * l4_cooked_read() reads data from the Lightning 4. + */ + +static int l4_cooked_read(struct gameport *gameport, int *axes, int *buttons) +{ + struct l4 *l4 = gameport->port_data; + unsigned char status; + int i, result = -1; + + outb(L4_SELECT_ANALOG, L4_PORT); + outb(L4_SELECT_DIGITAL + (l4->port >> 2), L4_PORT); + + if (inb(L4_PORT) & L4_BUSY) goto fail; + outb(l4->port & 3, L4_PORT); + + if (l4_wait_ready()) goto fail; + status = inb(L4_PORT); + + for (i = 0; i < 4; i++) + if (status & (1 << i)) { + if (l4_wait_ready()) goto fail; + axes[i] = inb(L4_PORT); + if (axes[i] > 252) axes[i] = -1; + } + + if (status & 0x10) { + if (l4_wait_ready()) goto fail; + *buttons = inb(L4_PORT) & 0x0f; + } + + result = 0; + +fail: outb(L4_SELECT_ANALOG, L4_PORT); + return result; +} + +static int l4_open(struct gameport *gameport, int mode) +{ + struct l4 *l4 = gameport->port_data; + + if (l4->port != 0 && mode != GAMEPORT_MODE_COOKED) + return -1; + outb(L4_SELECT_ANALOG, L4_PORT); + return 0; +} + +/* + * l4_getcal() reads the L4 with calibration values. + */ + +static int l4_getcal(int port, int *cal) +{ + int i, result = -1; + + outb(L4_SELECT_ANALOG, L4_PORT); + outb(L4_SELECT_DIGITAL + (port >> 2), L4_PORT); + if (inb(L4_PORT) & L4_BUSY) + goto out; + + outb(L4_CMD_GETCAL, L4_PORT); + if (l4_wait_ready()) + goto out; + + if (inb(L4_PORT) != L4_SELECT_DIGITAL + (port >> 2)) + goto out; + + if (l4_wait_ready()) + goto out; + outb(port & 3, L4_PORT); + + for (i = 0; i < 4; i++) { + if (l4_wait_ready()) + goto out; + cal[i] = inb(L4_PORT); + } + + result = 0; + +out: outb(L4_SELECT_ANALOG, L4_PORT); + return result; +} + +/* + * l4_setcal() programs the L4 with calibration values. + */ + +static int l4_setcal(int port, int *cal) +{ + int i, result = -1; + + outb(L4_SELECT_ANALOG, L4_PORT); + outb(L4_SELECT_DIGITAL + (port >> 2), L4_PORT); + if (inb(L4_PORT) & L4_BUSY) + goto out; + + outb(L4_CMD_SETCAL, L4_PORT); + if (l4_wait_ready()) + goto out; + + if (inb(L4_PORT) != L4_SELECT_DIGITAL + (port >> 2)) + goto out; + + if (l4_wait_ready()) + goto out; + outb(port & 3, L4_PORT); + + for (i = 0; i < 4; i++) { + if (l4_wait_ready()) + goto out; + outb(cal[i], L4_PORT); + } + + result = 0; + +out: outb(L4_SELECT_ANALOG, L4_PORT); + return result; +} + +/* + * l4_calibrate() calibrates the L4 for the attached device, so + * that the device's resistance fits into the L4's 8-bit range. + */ + +static int l4_calibrate(struct gameport *gameport, int *axes, int *max) +{ + int i, t; + int cal[4]; + struct l4 *l4 = gameport->port_data; + + if (l4_getcal(l4->port, cal)) + return -1; + + for (i = 0; i < 4; i++) { + t = (max[i] * cal[i]) / 200; + t = (t < 1) ? 1 : ((t > 255) ? 255 : t); + axes[i] = (axes[i] < 0) ? -1 : (axes[i] * cal[i]) / t; + axes[i] = (axes[i] > 252) ? 252 : axes[i]; + cal[i] = t; + } + + if (l4_setcal(l4->port, cal)) + return -1; + + return 0; +} + +static int __init l4_create_ports(int card_no) +{ + struct l4 *l4; + struct gameport *port; + int i, idx; + + for (i = 0; i < 4; i++) { + + idx = card_no * 4 + i; + l4 = &l4_ports[idx]; + + if (!(l4->gameport = port = gameport_allocate_port())) { + printk(KERN_ERR "lightning: Memory allocation failed\n"); + while (--i >= 0) { + gameport_free_port(l4->gameport); + l4->gameport = NULL; + } + return -ENOMEM; + } + l4->port = idx; + + port->port_data = l4; + port->open = l4_open; + port->cooked_read = l4_cooked_read; + port->calibrate = l4_calibrate; + + gameport_set_name(port, "PDPI Lightning 4"); + gameport_set_phys(port, "isa%04x/gameport%d", L4_PORT, idx); + + if (idx == 0) + port->io = L4_PORT; + } + + return 0; +} + +static int __init l4_add_card(int card_no) +{ + int cal[4] = { 255, 255, 255, 255 }; + int i, rev, result; + struct l4 *l4; + + outb(L4_SELECT_ANALOG, L4_PORT); + outb(L4_SELECT_DIGITAL + card_no, L4_PORT); + + if (inb(L4_PORT) & L4_BUSY) + return -1; + outb(L4_CMD_ID, L4_PORT); + + if (l4_wait_ready()) + return -1; + + if (inb(L4_PORT) != L4_SELECT_DIGITAL + card_no) + return -1; + + if (l4_wait_ready()) + return -1; + if (inb(L4_PORT) != L4_ID) + return -1; + + if (l4_wait_ready()) + return -1; + rev = inb(L4_PORT); + + if (!rev) + return -1; + + result = l4_create_ports(card_no); + if (result) + return result; + + printk(KERN_INFO "gameport: PDPI Lightning 4 %s card v%d.%d at %#x\n", + card_no ? "secondary" : "primary", rev >> 4, rev, L4_PORT); + + for (i = 0; i < 4; i++) { + l4 = &l4_ports[card_no * 4 + i]; + + if (rev > 0x28) /* on 2.9+ the setcal command works correctly */ + l4_setcal(l4->port, cal); + gameport_register_port(l4->gameport); + } + + return 0; +} + +static int __init l4_init(void) +{ + int i, cards = 0; + + if (!request_region(L4_PORT, 1, "lightning")) + return -EBUSY; + + for (i = 0; i < 2; i++) + if (l4_add_card(i) == 0) + cards++; + + outb(L4_SELECT_ANALOG, L4_PORT); + + if (!cards) { + release_region(L4_PORT, 1); + return -ENODEV; + } + + return 0; +} + +static void __exit l4_exit(void) +{ + int i; + int cal[4] = { 59, 59, 59, 59 }; + + for (i = 0; i < 8; i++) + if (l4_ports[i].gameport) { + l4_setcal(l4_ports[i].port, cal); + gameport_unregister_port(l4_ports[i].gameport); + } + + outb(L4_SELECT_ANALOG, L4_PORT); + release_region(L4_PORT, 1); +} + +module_init(l4_init); +module_exit(l4_exit); diff --git a/drivers/input/gameport/ns558.c b/drivers/input/gameport/ns558.c new file mode 100644 index 00000000..7c217848 --- /dev/null +++ b/drivers/input/gameport/ns558.c @@ -0,0 +1,286 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + * Copyright (c) 1999 Brian Gerst + */ + +/* + * NS558 based standard IBM game port driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Classic gameport (ISA/PnP) driver"); +MODULE_LICENSE("GPL"); + +static int ns558_isa_portlist[] = { 0x201, 0x200, 0x202, 0x203, 0x204, 0x205, 0x207, 0x209, + 0x20b, 0x20c, 0x20e, 0x20f, 0x211, 0x219, 0x101, 0 }; + +struct ns558 { + int type; + int io; + int size; + struct pnp_dev *dev; + struct gameport *gameport; + struct list_head node; +}; + +static LIST_HEAD(ns558_list); + +/* + * ns558_isa_probe() tries to find an isa gameport at the + * specified address, and also checks for mirrors. + * A joystick must be attached for this to work. + */ + +static int ns558_isa_probe(int io) +{ + int i, j, b; + unsigned char c, u, v; + struct ns558 *ns558; + struct gameport *port; + +/* + * No one should be using this address. + */ + + if (!request_region(io, 1, "ns558-isa")) + return -EBUSY; + +/* + * We must not be able to write arbitrary values to the port. + * The lower two axis bits must be 1 after a write. + */ + + c = inb(io); + outb(~c & ~3, io); + if (~(u = v = inb(io)) & 3) { + outb(c, io); + release_region(io, 1); + return -ENODEV; + } +/* + * After a trigger, there must be at least some bits changing. + */ + + for (i = 0; i < 1000; i++) v &= inb(io); + + if (u == v) { + outb(c, io); + release_region(io, 1); + return -ENODEV; + } + msleep(3); +/* + * After some time (4ms) the axes shouldn't change anymore. + */ + + u = inb(io); + for (i = 0; i < 1000; i++) + if ((u ^ inb(io)) & 0xf) { + outb(c, io); + release_region(io, 1); + return -ENODEV; + } +/* + * And now find the number of mirrors of the port. + */ + + for (i = 1; i < 5; i++) { + + release_region(io & (-1 << (i - 1)), (1 << (i - 1))); + + if (!request_region(io & (-1 << i), (1 << i), "ns558-isa")) + break; /* Don't disturb anyone */ + + outb(0xff, io & (-1 << i)); + for (j = b = 0; j < 1000; j++) + if (inb(io & (-1 << i)) != inb((io & (-1 << i)) + (1 << i) - 1)) b++; + msleep(3); + + if (b > 300) { /* We allow 30% difference */ + release_region(io & (-1 << i), (1 << i)); + break; + } + } + + i--; + + if (i != 4) { + if (!request_region(io & (-1 << i), (1 << i), "ns558-isa")) + return -EBUSY; + } + + ns558 = kzalloc(sizeof(struct ns558), GFP_KERNEL); + port = gameport_allocate_port(); + if (!ns558 || !port) { + printk(KERN_ERR "ns558: Memory allocation failed.\n"); + release_region(io & (-1 << i), (1 << i)); + kfree(ns558); + gameport_free_port(port); + return -ENOMEM; + } + + ns558->io = io; + ns558->size = 1 << i; + ns558->gameport = port; + + port->io = io; + gameport_set_name(port, "NS558 ISA Gameport"); + gameport_set_phys(port, "isa%04x/gameport0", io & (-1 << i)); + + gameport_register_port(port); + + list_add(&ns558->node, &ns558_list); + + return 0; +} + +#ifdef CONFIG_PNP + +static const struct pnp_device_id pnp_devids[] = { + { .id = "@P@0001", .driver_data = 0 }, /* ALS 100 */ + { .id = "@P@0020", .driver_data = 0 }, /* ALS 200 */ + { .id = "@P@1001", .driver_data = 0 }, /* ALS 100+ */ + { .id = "@P@2001", .driver_data = 0 }, /* ALS 120 */ + { .id = "ASB16fd", .driver_data = 0 }, /* AdLib NSC16 */ + { .id = "AZT3001", .driver_data = 0 }, /* AZT1008 */ + { .id = "CDC0001", .driver_data = 0 }, /* Opl3-SAx */ + { .id = "CSC0001", .driver_data = 0 }, /* CS4232 */ + { .id = "CSC000f", .driver_data = 0 }, /* CS4236 */ + { .id = "CSC0101", .driver_data = 0 }, /* CS4327 */ + { .id = "CTL7001", .driver_data = 0 }, /* SB16 */ + { .id = "CTL7002", .driver_data = 0 }, /* AWE64 */ + { .id = "CTL7005", .driver_data = 0 }, /* Vibra16 */ + { .id = "ENS2020", .driver_data = 0 }, /* SoundscapeVIVO */ + { .id = "ESS0001", .driver_data = 0 }, /* ES1869 */ + { .id = "ESS0005", .driver_data = 0 }, /* ES1878 */ + { .id = "ESS6880", .driver_data = 0 }, /* ES688 */ + { .id = "IBM0012", .driver_data = 0 }, /* CS4232 */ + { .id = "OPT0001", .driver_data = 0 }, /* OPTi Audio16 */ + { .id = "YMH0006", .driver_data = 0 }, /* Opl3-SA */ + { .id = "YMH0022", .driver_data = 0 }, /* Opl3-SAx */ + { .id = "PNPb02f", .driver_data = 0 }, /* Generic */ + { .id = "", }, +}; + +MODULE_DEVICE_TABLE(pnp, pnp_devids); + +static int ns558_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *did) +{ + int ioport, iolen; + struct ns558 *ns558; + struct gameport *port; + + if (!pnp_port_valid(dev, 0)) { + printk(KERN_WARNING "ns558: No i/o ports on a gameport? Weird\n"); + return -ENODEV; + } + + ioport = pnp_port_start(dev, 0); + iolen = pnp_port_len(dev, 0); + + if (!request_region(ioport, iolen, "ns558-pnp")) + return -EBUSY; + + ns558 = kzalloc(sizeof(struct ns558), GFP_KERNEL); + port = gameport_allocate_port(); + if (!ns558 || !port) { + printk(KERN_ERR "ns558: Memory allocation failed\n"); + kfree(ns558); + gameport_free_port(port); + return -ENOMEM; + } + + ns558->io = ioport; + ns558->size = iolen; + ns558->dev = dev; + ns558->gameport = port; + + gameport_set_name(port, "NS558 PnP Gameport"); + gameport_set_phys(port, "pnp%s/gameport0", dev_name(&dev->dev)); + port->dev.parent = &dev->dev; + port->io = ioport; + + gameport_register_port(port); + + list_add_tail(&ns558->node, &ns558_list); + return 0; +} + +static struct pnp_driver ns558_pnp_driver = { + .name = "ns558", + .id_table = pnp_devids, + .probe = ns558_pnp_probe, +}; + +#else + +static struct pnp_driver ns558_pnp_driver; + +#endif + +static int __init ns558_init(void) +{ + int i = 0; + int error; + + error = pnp_register_driver(&ns558_pnp_driver); + if (error && error != -ENODEV) /* should be ENOSYS really */ + return error; + +/* + * Probe ISA ports after PnP, so that PnP ports that are already + * enabled get detected as PnP. This may be suboptimal in multi-device + * configurations, but saves hassle with simple setups. + */ + + while (ns558_isa_portlist[i]) + ns558_isa_probe(ns558_isa_portlist[i++]); + + return list_empty(&ns558_list) && error ? -ENODEV : 0; +} + +static void __exit ns558_exit(void) +{ + struct ns558 *ns558, *safe; + + list_for_each_entry_safe(ns558, safe, &ns558_list, node) { + gameport_unregister_port(ns558->gameport); + release_region(ns558->io & ~(ns558->size - 1), ns558->size); + kfree(ns558); + } + + pnp_unregister_driver(&ns558_pnp_driver); +} + +module_init(ns558_init); +module_exit(ns558_exit); diff --git a/drivers/input/input-compat.c b/drivers/input/input-compat.c new file mode 100644 index 00000000..64ca7113 --- /dev/null +++ b/drivers/input/input-compat.c @@ -0,0 +1,136 @@ +/* + * 32bit compatibility wrappers for the input subsystem. + * + * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include "input-compat.h" + +#ifdef CONFIG_COMPAT + +int input_event_from_user(const char __user *buffer, + struct input_event *event) +{ + if (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) { + struct input_event_compat compat_event; + + if (copy_from_user(&compat_event, buffer, + sizeof(struct input_event_compat))) + return -EFAULT; + + event->time.tv_sec = compat_event.time.tv_sec; + event->time.tv_usec = compat_event.time.tv_usec; + event->type = compat_event.type; + event->code = compat_event.code; + event->value = compat_event.value; + + } else { + if (copy_from_user(event, buffer, sizeof(struct input_event))) + return -EFAULT; + } + + return 0; +} + +int input_event_to_user(char __user *buffer, + const struct input_event *event) +{ + if (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) { + struct input_event_compat compat_event; + + compat_event.time.tv_sec = event->time.tv_sec; + compat_event.time.tv_usec = event->time.tv_usec; + compat_event.type = event->type; + compat_event.code = event->code; + compat_event.value = event->value; + + if (copy_to_user(buffer, &compat_event, + sizeof(struct input_event_compat))) + return -EFAULT; + + } else { + if (copy_to_user(buffer, event, sizeof(struct input_event))) + return -EFAULT; + } + + return 0; +} + +int input_ff_effect_from_user(const char __user *buffer, size_t size, + struct ff_effect *effect) +{ + if (INPUT_COMPAT_TEST) { + struct ff_effect_compat *compat_effect; + + if (size != sizeof(struct ff_effect_compat)) + return -EINVAL; + + /* + * It so happens that the pointer which needs to be changed + * is the last field in the structure, so we can retrieve the + * whole thing and replace just the pointer. + */ + compat_effect = (struct ff_effect_compat *)effect; + + if (copy_from_user(compat_effect, buffer, + sizeof(struct ff_effect_compat))) + return -EFAULT; + + if (compat_effect->type == FF_PERIODIC && + compat_effect->u.periodic.waveform == FF_CUSTOM) + effect->u.periodic.custom_data = + compat_ptr(compat_effect->u.periodic.custom_data); + } else { + if (size != sizeof(struct ff_effect)) + return -EINVAL; + + if (copy_from_user(effect, buffer, sizeof(struct ff_effect))) + return -EFAULT; + } + + return 0; +} + +#else + +int input_event_from_user(const char __user *buffer, + struct input_event *event) +{ + if (copy_from_user(event, buffer, sizeof(struct input_event))) + return -EFAULT; + + return 0; +} + +int input_event_to_user(char __user *buffer, + const struct input_event *event) +{ + if (copy_to_user(buffer, event, sizeof(struct input_event))) + return -EFAULT; + + return 0; +} + +int input_ff_effect_from_user(const char __user *buffer, size_t size, + struct ff_effect *effect) +{ + if (size != sizeof(struct ff_effect)) + return -EINVAL; + + if (copy_from_user(effect, buffer, sizeof(struct ff_effect))) + return -EFAULT; + + return 0; +} + +#endif /* CONFIG_COMPAT */ + +EXPORT_SYMBOL_GPL(input_event_from_user); +EXPORT_SYMBOL_GPL(input_event_to_user); +EXPORT_SYMBOL_GPL(input_ff_effect_from_user); diff --git a/drivers/input/input-compat.h b/drivers/input/input-compat.h new file mode 100644 index 00000000..148f66fe --- /dev/null +++ b/drivers/input/input-compat.h @@ -0,0 +1,92 @@ +#ifndef _INPUT_COMPAT_H +#define _INPUT_COMPAT_H + +/* + * 32bit compatibility wrappers for the input subsystem. + * + * Very heavily based on evdev.c - Copyright (c) 1999-2002 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include + +#ifdef CONFIG_COMPAT + +/* Note to the author of this code: did it ever occur to + you why the ifdefs are needed? Think about it again. -AK */ +#if defined(CONFIG_X86_64) || defined(CONFIG_TILE) +# define INPUT_COMPAT_TEST is_compat_task() +#elif defined(CONFIG_S390) +# define INPUT_COMPAT_TEST test_thread_flag(TIF_31BIT) +#elif defined(CONFIG_MIPS) +# define INPUT_COMPAT_TEST test_thread_flag(TIF_32BIT_ADDR) +#else +# define INPUT_COMPAT_TEST test_thread_flag(TIF_32BIT) +#endif + +struct input_event_compat { + struct compat_timeval time; + __u16 type; + __u16 code; + __s32 value; +}; + +struct ff_periodic_effect_compat { + __u16 waveform; + __u16 period; + __s16 magnitude; + __s16 offset; + __u16 phase; + + struct ff_envelope envelope; + + __u32 custom_len; + compat_uptr_t custom_data; +}; + +struct ff_effect_compat { + __u16 type; + __s16 id; + __u16 direction; + struct ff_trigger trigger; + struct ff_replay replay; + + union { + struct ff_constant_effect constant; + struct ff_ramp_effect ramp; + struct ff_periodic_effect_compat periodic; + struct ff_condition_effect condition[2]; /* One for each axis */ + struct ff_rumble_effect rumble; + } u; +}; + +static inline size_t input_event_size(void) +{ + return (INPUT_COMPAT_TEST && !COMPAT_USE_64BIT_TIME) ? + sizeof(struct input_event_compat) : sizeof(struct input_event); +} + +#else + +static inline size_t input_event_size(void) +{ + return sizeof(struct input_event); +} + +#endif /* CONFIG_COMPAT */ + +int input_event_from_user(const char __user *buffer, + struct input_event *event); + +int input_event_to_user(char __user *buffer, + const struct input_event *event); + +int input_ff_effect_from_user(const char __user *buffer, size_t size, + struct ff_effect *effect); + +#endif /* _INPUT_COMPAT_H */ diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c new file mode 100644 index 00000000..d398f132 --- /dev/null +++ b/drivers/input/input-mt.c @@ -0,0 +1,432 @@ +/* + * Input Multitouch Library + * + * Copyright (c) 2008-2010 Henrik Rydberg + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include + +#define TRKID_SGN ((TRKID_MAX + 1) >> 1) + +static void copy_abs(struct input_dev *dev, unsigned int dst, unsigned int src) +{ + if (dev->absinfo && test_bit(src, dev->absbit)) { + dev->absinfo[dst] = dev->absinfo[src]; + dev->absinfo[dst].fuzz = 0; + dev->absbit[BIT_WORD(dst)] |= BIT_MASK(dst); + } +} + +/** + * input_mt_init_slots() - initialize MT input slots + * @dev: input device supporting MT events and finger tracking + * @num_slots: number of slots used by the device + * @flags: mt tasks to handle in core + * + * This function allocates all necessary memory for MT slot handling + * in the input device, prepares the ABS_MT_SLOT and + * ABS_MT_TRACKING_ID events for use and sets up appropriate buffers. + * Depending on the flags set, it also performs pointer emulation and + * frame synchronization. + * + * May be called repeatedly. Returns -EINVAL if attempting to + * reinitialize with a different number of slots. + */ +int input_mt_init_slots(struct input_dev *dev, unsigned int num_slots, + unsigned int flags) +{ + struct input_mt *mt = dev->mt; + int i; + + if (!num_slots) + return 0; + if (mt) + return mt->num_slots != num_slots ? -EINVAL : 0; + + mt = kzalloc(sizeof(*mt) + num_slots * sizeof(*mt->slots), GFP_KERNEL); + if (!mt) + goto err_mem; + + mt->num_slots = num_slots; + mt->flags = flags; + input_set_abs_params(dev, ABS_MT_SLOT, 0, num_slots - 1, 0, 0); + input_set_abs_params(dev, ABS_MT_TRACKING_ID, 0, TRKID_MAX, 0, 0); + + if (flags & (INPUT_MT_POINTER | INPUT_MT_DIRECT)) { + __set_bit(EV_KEY, dev->evbit); + __set_bit(BTN_TOUCH, dev->keybit); + + copy_abs(dev, ABS_X, ABS_MT_POSITION_X); + copy_abs(dev, ABS_Y, ABS_MT_POSITION_Y); + copy_abs(dev, ABS_PRESSURE, ABS_MT_PRESSURE); + } + if (flags & INPUT_MT_POINTER) { + __set_bit(BTN_TOOL_FINGER, dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); + if (num_slots >= 3) + __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit); + if (num_slots >= 4) + __set_bit(BTN_TOOL_QUADTAP, dev->keybit); + if (num_slots >= 5) + __set_bit(BTN_TOOL_QUINTTAP, dev->keybit); + __set_bit(INPUT_PROP_POINTER, dev->propbit); + } + if (flags & INPUT_MT_DIRECT) + __set_bit(INPUT_PROP_DIRECT, dev->propbit); + if (flags & INPUT_MT_SEMI_MT) + __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); + if (flags & INPUT_MT_TRACK) { + unsigned int n2 = num_slots * num_slots; + mt->red = kcalloc(n2, sizeof(*mt->red), GFP_KERNEL); + if (!mt->red) + goto err_mem; + } + + /* Mark slots as 'unused' */ + for (i = 0; i < num_slots; i++) + input_mt_set_value(&mt->slots[i], ABS_MT_TRACKING_ID, -1); + + dev->mt = mt; + return 0; +err_mem: + kfree(mt); + return -ENOMEM; +} +EXPORT_SYMBOL(input_mt_init_slots); + +/** + * input_mt_destroy_slots() - frees the MT slots of the input device + * @dev: input device with allocated MT slots + * + * This function is only needed in error path as the input core will + * automatically free the MT slots when the device is destroyed. + */ +void input_mt_destroy_slots(struct input_dev *dev) +{ + if (dev->mt) { + kfree(dev->mt->red); + kfree(dev->mt); + } + dev->mt = NULL; +} +EXPORT_SYMBOL(input_mt_destroy_slots); + +/** + * input_mt_report_slot_state() - report contact state + * @dev: input device with allocated MT slots + * @tool_type: the tool type to use in this slot + * @active: true if contact is active, false otherwise + * + * Reports a contact via ABS_MT_TRACKING_ID, and optionally + * ABS_MT_TOOL_TYPE. If active is true and the slot is currently + * inactive, or if the tool type is changed, a new tracking id is + * assigned to the slot. The tool type is only reported if the + * corresponding absbit field is set. + */ +void input_mt_report_slot_state(struct input_dev *dev, + unsigned int tool_type, bool active) +{ + struct input_mt *mt = dev->mt; + struct input_mt_slot *slot; + int id; + + if (!mt) + return; + + slot = &mt->slots[mt->slot]; + slot->frame = mt->frame; + + if (!active) { + input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1); + return; + } + + id = input_mt_get_value(slot, ABS_MT_TRACKING_ID); + if (id < 0 || input_mt_get_value(slot, ABS_MT_TOOL_TYPE) != tool_type) + id = input_mt_new_trkid(mt); + + input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, id); + input_event(dev, EV_ABS, ABS_MT_TOOL_TYPE, tool_type); +} +EXPORT_SYMBOL(input_mt_report_slot_state); + +/** + * input_mt_report_finger_count() - report contact count + * @dev: input device with allocated MT slots + * @count: the number of contacts + * + * Reports the contact count via BTN_TOOL_FINGER, BTN_TOOL_DOUBLETAP, + * BTN_TOOL_TRIPLETAP and BTN_TOOL_QUADTAP. + * + * The input core ensures only the KEY events already setup for + * this device will produce output. + */ +void input_mt_report_finger_count(struct input_dev *dev, int count) +{ + input_event(dev, EV_KEY, BTN_TOOL_FINGER, count == 1); + input_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, count == 2); + input_event(dev, EV_KEY, BTN_TOOL_TRIPLETAP, count == 3); + input_event(dev, EV_KEY, BTN_TOOL_QUADTAP, count == 4); + input_event(dev, EV_KEY, BTN_TOOL_QUINTTAP, count == 5); +} +EXPORT_SYMBOL(input_mt_report_finger_count); + +/** + * input_mt_report_pointer_emulation() - common pointer emulation + * @dev: input device with allocated MT slots + * @use_count: report number of active contacts as finger count + * + * Performs legacy pointer emulation via BTN_TOUCH, ABS_X, ABS_Y and + * ABS_PRESSURE. Touchpad finger count is emulated if use_count is true. + * + * The input core ensures only the KEY and ABS axes already setup for + * this device will produce output. + */ +void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count) +{ + struct input_mt *mt = dev->mt; + struct input_mt_slot *oldest; + int oldid, count, i; + + if (!mt) + return; + + oldest = NULL; + oldid = mt->trkid; + count = 0; + + for (i = 0; i < mt->num_slots; ++i) { + struct input_mt_slot *ps = &mt->slots[i]; + int id = input_mt_get_value(ps, ABS_MT_TRACKING_ID); + + if (id < 0) + continue; + if ((id - oldid) & TRKID_SGN) { + oldest = ps; + oldid = id; + } + count++; + } + + input_event(dev, EV_KEY, BTN_TOUCH, count > 0); + if (use_count) + input_mt_report_finger_count(dev, count); + + if (oldest) { + int x = input_mt_get_value(oldest, ABS_MT_POSITION_X); + int y = input_mt_get_value(oldest, ABS_MT_POSITION_Y); + + input_event(dev, EV_ABS, ABS_X, x); + input_event(dev, EV_ABS, ABS_Y, y); + + if (test_bit(ABS_MT_PRESSURE, dev->absbit)) { + int p = input_mt_get_value(oldest, ABS_MT_PRESSURE); + input_event(dev, EV_ABS, ABS_PRESSURE, p); + } + } else { + if (test_bit(ABS_MT_PRESSURE, dev->absbit)) + input_event(dev, EV_ABS, ABS_PRESSURE, 0); + } +} +EXPORT_SYMBOL(input_mt_report_pointer_emulation); + +/** + * input_mt_sync_frame() - synchronize mt frame + * @dev: input device with allocated MT slots + * + * Close the frame and prepare the internal state for a new one. + * Depending on the flags, marks unused slots as inactive and performs + * pointer emulation. + */ +void input_mt_sync_frame(struct input_dev *dev) +{ + struct input_mt *mt = dev->mt; + struct input_mt_slot *s; + bool use_count = false; + + if (!mt) + return; + + if (mt->flags & INPUT_MT_DROP_UNUSED) { + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { + if (input_mt_is_used(mt, s)) + continue; + input_mt_slot(dev, s - mt->slots); + input_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1); + } + } + + if ((mt->flags & INPUT_MT_POINTER) && !(mt->flags & INPUT_MT_SEMI_MT)) + use_count = true; + + input_mt_report_pointer_emulation(dev, use_count); + + mt->frame++; +} +EXPORT_SYMBOL(input_mt_sync_frame); + +static int adjust_dual(int *begin, int step, int *end, int eq) +{ + int f, *p, s, c; + + if (begin == end) + return 0; + + f = *begin; + p = begin + step; + s = p == end ? f + 1 : *p; + + for (; p != end; p += step) + if (*p < f) + s = f, f = *p; + else if (*p < s) + s = *p; + + c = (f + s + 1) / 2; + if (c == 0 || (c > 0 && !eq)) + return 0; + if (s < 0) + c *= 2; + + for (p = begin; p != end; p += step) + *p -= c; + + return (c < s && s <= 0) || (f >= 0 && f < c); +} + +static void find_reduced_matrix(int *w, int nr, int nc, int nrc) +{ + int i, k, sum; + + for (k = 0; k < nrc; k++) { + for (i = 0; i < nr; i++) + adjust_dual(w + i, nr, w + i + nrc, nr <= nc); + sum = 0; + for (i = 0; i < nrc; i += nr) + sum += adjust_dual(w + i, 1, w + i + nr, nc <= nr); + if (!sum) + break; + } +} + +static int input_mt_set_matrix(struct input_mt *mt, + const struct input_mt_pos *pos, int num_pos) +{ + const struct input_mt_pos *p; + struct input_mt_slot *s; + int *w = mt->red; + int x, y; + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { + if (!input_mt_is_active(s)) + continue; + x = input_mt_get_value(s, ABS_MT_POSITION_X); + y = input_mt_get_value(s, ABS_MT_POSITION_Y); + for (p = pos; p != pos + num_pos; p++) { + int dx = x - p->x, dy = y - p->y; + *w++ = dx * dx + dy * dy; + } + } + + return w - mt->red; +} + +static void input_mt_set_slots(struct input_mt *mt, + int *slots, int num_pos) +{ + struct input_mt_slot *s; + int *w = mt->red, *p; + + for (p = slots; p != slots + num_pos; p++) + *p = -1; + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { + if (!input_mt_is_active(s)) + continue; + for (p = slots; p != slots + num_pos; p++) + if (*w++ < 0) + *p = s - mt->slots; + } + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) { + if (input_mt_is_active(s)) + continue; + for (p = slots; p != slots + num_pos; p++) + if (*p < 0) { + *p = s - mt->slots; + break; + } + } +} + +/** + * input_mt_assign_slots() - perform a best-match assignment + * @dev: input device with allocated MT slots + * @slots: the slot assignment to be filled + * @pos: the position array to match + * @num_pos: number of positions + * + * Performs a best match against the current contacts and returns + * the slot assignment list. New contacts are assigned to unused + * slots. + * + * Returns zero on success, or negative error in case of failure. + */ +int input_mt_assign_slots(struct input_dev *dev, int *slots, + const struct input_mt_pos *pos, int num_pos) +{ + struct input_mt *mt = dev->mt; + int nrc; + + if (!mt || !mt->red) + return -ENXIO; + if (num_pos > mt->num_slots) + return -EINVAL; + if (num_pos < 1) + return 0; + + nrc = input_mt_set_matrix(mt, pos, num_pos); + find_reduced_matrix(mt->red, num_pos, nrc / num_pos, nrc); + input_mt_set_slots(mt, slots, num_pos); + + return 0; +} +EXPORT_SYMBOL(input_mt_assign_slots); + +/** + * input_mt_get_slot_by_key() - return slot matching key + * @dev: input device with allocated MT slots + * @key: the key of the sought slot + * + * Returns the slot of the given key, if it exists, otherwise + * set the key on the first unused slot and return. + * + * If no available slot can be found, -1 is returned. + */ +int input_mt_get_slot_by_key(struct input_dev *dev, int key) +{ + struct input_mt *mt = dev->mt; + struct input_mt_slot *s; + + if (!mt) + return -1; + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) + if (input_mt_is_active(s) && s->key == key) + return s - mt->slots; + + for (s = mt->slots; s != mt->slots + mt->num_slots; s++) + if (!input_mt_is_active(s)) { + s->key = key; + return s - mt->slots; + } + + return -1; +} +EXPORT_SYMBOL(input_mt_get_slot_by_key); diff --git a/drivers/input/input-polldev.c b/drivers/input/input-polldev.c new file mode 100644 index 00000000..7f161d93 --- /dev/null +++ b/drivers/input/input-polldev.c @@ -0,0 +1,253 @@ +/* + * Generic implementation of a polled input device + + * Copyright (c) 2007 Dmitry Torokhov + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Dmitry Torokhov "); +MODULE_DESCRIPTION("Generic implementation of a polled input device"); +MODULE_LICENSE("GPL v2"); +MODULE_VERSION("0.1"); + +static void input_polldev_queue_work(struct input_polled_dev *dev) +{ + unsigned long delay; + + delay = msecs_to_jiffies(dev->poll_interval); + if (delay >= HZ) + delay = round_jiffies_relative(delay); + + queue_delayed_work(system_freezable_wq, &dev->work, delay); +} + +static void input_polled_device_work(struct work_struct *work) +{ + struct input_polled_dev *dev = + container_of(work, struct input_polled_dev, work.work); + + dev->poll(dev); + input_polldev_queue_work(dev); +} + +static int input_open_polled_device(struct input_dev *input) +{ + struct input_polled_dev *dev = input_get_drvdata(input); + + if (dev->open) + dev->open(dev); + + /* Only start polling if polling is enabled */ + if (dev->poll_interval > 0) { + dev->poll(dev); + input_polldev_queue_work(dev); + } + + return 0; +} + +static void input_close_polled_device(struct input_dev *input) +{ + struct input_polled_dev *dev = input_get_drvdata(input); + + cancel_delayed_work_sync(&dev->work); + + if (dev->close) + dev->close(dev); +} + +/* SYSFS interface */ + +static ssize_t input_polldev_get_poll(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct input_polled_dev *polldev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", polldev->poll_interval); +} + +static ssize_t input_polldev_set_poll(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + struct input_polled_dev *polldev = dev_get_drvdata(dev); + struct input_dev *input = polldev->input; + unsigned int interval; + int err; + + err = kstrtouint(buf, 0, &interval); + if (err) + return err; + + if (interval < polldev->poll_interval_min) + return -EINVAL; + + if (interval > polldev->poll_interval_max) + return -EINVAL; + + mutex_lock(&input->mutex); + + polldev->poll_interval = interval; + + if (input->users) { + cancel_delayed_work_sync(&polldev->work); + if (polldev->poll_interval > 0) + input_polldev_queue_work(polldev); + } + + mutex_unlock(&input->mutex); + + return count; +} + +static DEVICE_ATTR(poll, S_IRUGO | S_IWUSR, input_polldev_get_poll, + input_polldev_set_poll); + + +static ssize_t input_polldev_get_max(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct input_polled_dev *polldev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", polldev->poll_interval_max); +} + +static DEVICE_ATTR(max, S_IRUGO, input_polldev_get_max, NULL); + +static ssize_t input_polldev_get_min(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct input_polled_dev *polldev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", polldev->poll_interval_min); +} + +static DEVICE_ATTR(min, S_IRUGO, input_polldev_get_min, NULL); + +static struct attribute *sysfs_attrs[] = { + &dev_attr_poll.attr, + &dev_attr_max.attr, + &dev_attr_min.attr, + NULL +}; + +static struct attribute_group input_polldev_attribute_group = { + .attrs = sysfs_attrs +}; + +/** + * input_allocate_polled_device - allocate memory for polled device + * + * The function allocates memory for a polled device and also + * for an input device associated with this polled device. + */ +struct input_polled_dev *input_allocate_polled_device(void) +{ + struct input_polled_dev *dev; + + dev = kzalloc(sizeof(struct input_polled_dev), GFP_KERNEL); + if (!dev) + return NULL; + + dev->input = input_allocate_device(); + if (!dev->input) { + kfree(dev); + return NULL; + } + + return dev; +} +EXPORT_SYMBOL(input_allocate_polled_device); + +/** + * input_free_polled_device - free memory allocated for polled device + * @dev: device to free + * + * The function frees memory allocated for polling device and drops + * reference to the associated input device. + */ +void input_free_polled_device(struct input_polled_dev *dev) +{ + if (dev) { + input_free_device(dev->input); + kfree(dev); + } +} +EXPORT_SYMBOL(input_free_polled_device); + +/** + * input_register_polled_device - register polled device + * @dev: device to register + * + * The function registers previously initialized polled input device + * with input layer. The device should be allocated with call to + * input_allocate_polled_device(). Callers should also set up poll() + * method and set up capabilities (id, name, phys, bits) of the + * corresponding input_dev structure. + */ +int input_register_polled_device(struct input_polled_dev *dev) +{ + struct input_dev *input = dev->input; + int error; + + input_set_drvdata(input, dev); + INIT_DELAYED_WORK(&dev->work, input_polled_device_work); + if (!dev->poll_interval) + dev->poll_interval = 500; + if (!dev->poll_interval_max) + dev->poll_interval_max = dev->poll_interval; + input->open = input_open_polled_device; + input->close = input_close_polled_device; + + error = input_register_device(input); + if (error) + return error; + + error = sysfs_create_group(&input->dev.kobj, + &input_polldev_attribute_group); + if (error) { + input_unregister_device(input); + return error; + } + + /* + * Take extra reference to the underlying input device so + * that it survives call to input_unregister_polled_device() + * and is deleted only after input_free_polled_device() + * has been invoked. This is needed to ease task of freeing + * sparse keymaps. + */ + input_get_device(input); + + return 0; +} +EXPORT_SYMBOL(input_register_polled_device); + +/** + * input_unregister_polled_device - unregister polled device + * @dev: device to unregister + * + * The function unregisters previously registered polled input + * device from input layer. Polling is stopped and device is + * ready to be freed with call to input_free_polled_device(). + */ +void input_unregister_polled_device(struct input_polled_dev *dev) +{ + sysfs_remove_group(&dev->input->dev.kobj, + &input_polldev_attribute_group); + + input_unregister_device(dev->input); +} +EXPORT_SYMBOL(input_unregister_polled_device); diff --git a/drivers/input/input.c b/drivers/input/input.c new file mode 100644 index 00000000..6c58ff0f --- /dev/null +++ b/drivers/input/input.c @@ -0,0 +1,2420 @@ +/* + * The input core + * + * Copyright (c) 1999-2002 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_BASENAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "input-compat.h" + +#if defined(CONFIG_SPRD_DEBUG) +#include +#endif + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Input core"); +MODULE_LICENSE("GPL"); + +#define INPUT_MAX_CHAR_DEVICES 1024 +#define INPUT_FIRST_DYNAMIC_DEV 256 +static DEFINE_IDA(input_ida); + +static LIST_HEAD(input_dev_list); +static LIST_HEAD(input_handler_list); + +/* + * input_mutex protects access to both input_dev_list and input_handler_list. + * This also causes input_[un]register_device and input_[un]register_handler + * be mutually exclusive which simplifies locking in drivers implementing + * input handlers. + */ +static DEFINE_MUTEX(input_mutex); + +static const struct input_value input_value_sync = { EV_SYN, SYN_REPORT, 1 }; + +static inline int is_event_supported(unsigned int code, + unsigned long *bm, unsigned int max) +{ + return code <= max && test_bit(code, bm); +} + +static int input_defuzz_abs_event(int value, int old_val, int fuzz) +{ + if (fuzz) { + if (value > old_val - fuzz / 2 && value < old_val + fuzz / 2) + return old_val; + + if (value > old_val - fuzz && value < old_val + fuzz) + return (old_val * 3 + value) / 4; + + if (value > old_val - fuzz * 2 && value < old_val + fuzz * 2) + return (old_val + value) / 2; + } + + return value; +} + +static void input_start_autorepeat(struct input_dev *dev, int code) +{ + if (test_bit(EV_REP, dev->evbit) && + dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] && + dev->timer.data) { + dev->repeat_key = code; + mod_timer(&dev->timer, + jiffies + msecs_to_jiffies(dev->rep[REP_DELAY])); + } +} + +static void input_stop_autorepeat(struct input_dev *dev) +{ + del_timer(&dev->timer); +} + +/* + * Pass event first through all filters and then, if event has not been + * filtered out, through all open handles. This function is called with + * dev->event_lock held and interrupts disabled. + */ +static unsigned int input_to_handler(struct input_handle *handle, + struct input_value *vals, unsigned int count) +{ + struct input_handler *handler = handle->handler; + struct input_value *end = vals; + struct input_value *v; + + for (v = vals; v != vals + count; v++) { + if (handler->filter && + handler->filter(handle, v->type, v->code, v->value)) + continue; + if (end != v) + *end = *v; + end++; + } + + count = end - vals; + if (!count) + return 0; + + if (handler->events) + handler->events(handle, vals, count); + else if (handler->event) + for (v = vals; v != end; v++) + handler->event(handle, v->type, v->code, v->value); + + return count; +} + +/* + * Pass values first through all filters and then, if event has not been + * filtered out, through all open handles. This function is called with + * dev->event_lock held and interrupts disabled. + */ +static void input_pass_values(struct input_dev *dev, + struct input_value *vals, unsigned int count) +{ + struct input_handle *handle; + struct input_value *v; + + if (!count) + return; + + rcu_read_lock(); + + handle = rcu_dereference(dev->grab); + if (handle) { + count = input_to_handler(handle, vals, count); + } else { + list_for_each_entry_rcu(handle, &dev->h_list, d_node) + if (handle->open) + count = input_to_handler(handle, vals, count); + } + + rcu_read_unlock(); + + add_input_randomness(vals->type, vals->code, vals->value); + + /* trigger auto repeat for key events */ + for (v = vals; v != vals + count; v++) { + if (v->type == EV_KEY && v->value != 2) { + if (v->value) + input_start_autorepeat(dev, v->code); + else + input_stop_autorepeat(dev); + } + } +} + +static void input_pass_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + struct input_value vals[] = { { type, code, value } }; + + input_pass_values(dev, vals, ARRAY_SIZE(vals)); +} + +/* + * Generate software autorepeat event. Note that we take + * dev->event_lock here to avoid racing with input_event + * which may cause keys get "stuck". + */ +static void input_repeat_key(unsigned long data) +{ + struct input_dev *dev = (void *) data; + unsigned long flags; + + spin_lock_irqsave(&dev->event_lock, flags); + + if (test_bit(dev->repeat_key, dev->key) && + is_event_supported(dev->repeat_key, dev->keybit, KEY_MAX)) { + struct input_value vals[] = { + { EV_KEY, dev->repeat_key, 2 }, + input_value_sync + }; + + input_pass_values(dev, vals, ARRAY_SIZE(vals)); + + if (dev->rep[REP_PERIOD]) + mod_timer(&dev->timer, jiffies + + msecs_to_jiffies(dev->rep[REP_PERIOD])); + } + + spin_unlock_irqrestore(&dev->event_lock, flags); +} + +#define INPUT_IGNORE_EVENT 0 +#define INPUT_PASS_TO_HANDLERS 1 +#define INPUT_PASS_TO_DEVICE 2 +#define INPUT_SLOT 4 +#define INPUT_FLUSH 8 +#define INPUT_PASS_TO_ALL (INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE) + +static int input_handle_abs_event(struct input_dev *dev, + unsigned int code, int *pval) +{ + struct input_mt *mt = dev->mt; + bool is_mt_event; + int *pold; + + if (code == ABS_MT_SLOT) { + /* + * "Stage" the event; we'll flush it later, when we + * get actual touch data. + */ + if (mt && *pval >= 0 && *pval < mt->num_slots) + mt->slot = *pval; + + return INPUT_IGNORE_EVENT; + } + + is_mt_event = input_is_mt_value(code); + + if (!is_mt_event) { + pold = &dev->absinfo[code].value; + } else if (mt) { + pold = &mt->slots[mt->slot].abs[code - ABS_MT_FIRST]; + } else { + /* + * Bypass filtering for multi-touch events when + * not employing slots. + */ + pold = NULL; + } + + if (pold) { + *pval = input_defuzz_abs_event(*pval, *pold, + dev->absinfo[code].fuzz); + if (*pold == *pval) + return INPUT_IGNORE_EVENT; + + *pold = *pval; + } + + /* Flush pending "slot" event */ + if (is_mt_event && mt && mt->slot != input_abs_get_val(dev, ABS_MT_SLOT)) { + input_abs_set_val(dev, ABS_MT_SLOT, mt->slot); + return INPUT_PASS_TO_HANDLERS | INPUT_SLOT; + } + + return INPUT_PASS_TO_HANDLERS; +} + +static int input_get_disposition(struct input_dev *dev, + unsigned int type, unsigned int code, int *pval) +{ + int disposition = INPUT_IGNORE_EVENT; + int value = *pval; + + switch (type) { + + case EV_SYN: + switch (code) { + case SYN_CONFIG: + disposition = INPUT_PASS_TO_ALL; + break; + + case SYN_REPORT: + disposition = INPUT_PASS_TO_HANDLERS | INPUT_FLUSH; + break; + case SYN_MT_REPORT: + disposition = INPUT_PASS_TO_HANDLERS; + break; + } + break; + + case EV_KEY: + if (is_event_supported(code, dev->keybit, KEY_MAX)) { + + /* auto-repeat bypasses state updates */ + if (value == 2) { + disposition = INPUT_PASS_TO_HANDLERS; + break; + } + + if (!!test_bit(code, dev->key) != !!value) { + + __change_bit(code, dev->key); + + #if defined(CONFIG_SPRD_DEBUG) + if(code != BTN_TOUCH) { + sprd_debug_check_crash_key(code,value); + } + #endif + + disposition = INPUT_PASS_TO_HANDLERS; + } + } + else { + #if defined(CONFIG_SPRD_DEBUG) + if(code != BTN_TOUCH && value == 0) { + sprd_debug_check_crash_key(code,value); + } + #endif + } + break; + + case EV_SW: + if (is_event_supported(code, dev->swbit, SW_MAX) && + !!test_bit(code, dev->sw) != !!value) { + + __change_bit(code, dev->sw); + disposition = INPUT_PASS_TO_HANDLERS; + } + break; + + case EV_ABS: + if (is_event_supported(code, dev->absbit, ABS_MAX)) + disposition = input_handle_abs_event(dev, code, &value); + + break; + + case EV_REL: + if (is_event_supported(code, dev->relbit, REL_MAX) && value) + disposition = INPUT_PASS_TO_HANDLERS; + + break; + + case EV_MSC: + if (is_event_supported(code, dev->mscbit, MSC_MAX)) + disposition = INPUT_PASS_TO_ALL; + + break; + + case EV_LED: + if (is_event_supported(code, dev->ledbit, LED_MAX) && + !!test_bit(code, dev->led) != !!value) { + + __change_bit(code, dev->led); + disposition = INPUT_PASS_TO_ALL; + } + break; + + case EV_SND: + if (is_event_supported(code, dev->sndbit, SND_MAX)) { + + if (!!test_bit(code, dev->snd) != !!value) + __change_bit(code, dev->snd); + disposition = INPUT_PASS_TO_ALL; + } + break; + + case EV_REP: + if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) { + dev->rep[code] = value; + disposition = INPUT_PASS_TO_ALL; + } + break; + + case EV_FF: + if (value >= 0) + disposition = INPUT_PASS_TO_ALL; + break; + + case EV_PWR: + disposition = INPUT_PASS_TO_ALL; + break; + } + + *pval = value; + return disposition; +} + +static void input_handle_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + int disposition; + + disposition = input_get_disposition(dev, type, code, &value); + + if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event) + dev->event(dev, type, code, value); + + if (!dev->vals) + return; + + if (disposition & INPUT_PASS_TO_HANDLERS) { + struct input_value *v; + + if (disposition & INPUT_SLOT) { + v = &dev->vals[dev->num_vals++]; + v->type = EV_ABS; + v->code = ABS_MT_SLOT; + v->value = dev->mt->slot; + } + + v = &dev->vals[dev->num_vals++]; + v->type = type; + v->code = code; + v->value = value; + } + + if (disposition & INPUT_FLUSH) { + if (dev->num_vals >= 2) + input_pass_values(dev, dev->vals, dev->num_vals); + dev->num_vals = 0; + } else if (dev->num_vals >= dev->max_vals - 2) { + dev->vals[dev->num_vals++] = input_value_sync; + input_pass_values(dev, dev->vals, dev->num_vals); + dev->num_vals = 0; + } + +} + +/** + * input_event() - report new input event + * @dev: device that generated the event + * @type: type of the event + * @code: event code + * @value: value of the event + * + * This function should be used by drivers implementing various input + * devices to report input events. See also input_inject_event(). + * + * NOTE: input_event() may be safely used right after input device was + * allocated with input_allocate_device(), even before it is registered + * with input_register_device(), but the event will not reach any of the + * input handlers. Such early invocation of input_event() may be used + * to 'seed' initial state of a switch or initial position of absolute + * axis, etc. + */ +void input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + unsigned long flags; + + if (is_event_supported(type, dev->evbit, EV_MAX)) { + + spin_lock_irqsave(&dev->event_lock, flags); + input_handle_event(dev, type, code, value); + spin_unlock_irqrestore(&dev->event_lock, flags); + } +} +EXPORT_SYMBOL(input_event); + +/** + * input_inject_event() - send input event from input handler + * @handle: input handle to send event through + * @type: type of the event + * @code: event code + * @value: value of the event + * + * Similar to input_event() but will ignore event if device is + * "grabbed" and handle injecting event is not the one that owns + * the device. + */ +void input_inject_event(struct input_handle *handle, + unsigned int type, unsigned int code, int value) +{ + struct input_dev *dev = handle->dev; + struct input_handle *grab; + unsigned long flags; + + if (is_event_supported(type, dev->evbit, EV_MAX)) { + spin_lock_irqsave(&dev->event_lock, flags); + + rcu_read_lock(); + grab = rcu_dereference(dev->grab); + if (!grab || grab == handle) + input_handle_event(dev, type, code, value); + rcu_read_unlock(); + + spin_unlock_irqrestore(&dev->event_lock, flags); + } +} +EXPORT_SYMBOL(input_inject_event); + +/** + * input_alloc_absinfo - allocates array of input_absinfo structs + * @dev: the input device emitting absolute events + * + * If the absinfo struct the caller asked for is already allocated, this + * functions will not do anything. + */ +void input_alloc_absinfo(struct input_dev *dev) +{ + if (!dev->absinfo) + dev->absinfo = kcalloc(ABS_CNT, sizeof(struct input_absinfo), + GFP_KERNEL); + + WARN(!dev->absinfo, "%s(): kcalloc() failed?\n", __func__); +} +EXPORT_SYMBOL(input_alloc_absinfo); + +void input_set_abs_params(struct input_dev *dev, unsigned int axis, + int min, int max, int fuzz, int flat) +{ + struct input_absinfo *absinfo; + + input_alloc_absinfo(dev); + if (!dev->absinfo) + return; + + absinfo = &dev->absinfo[axis]; + absinfo->minimum = min; + absinfo->maximum = max; + absinfo->fuzz = fuzz; + absinfo->flat = flat; + + dev->absbit[BIT_WORD(axis)] |= BIT_MASK(axis); +} +EXPORT_SYMBOL(input_set_abs_params); + + +/** + * input_grab_device - grabs device for exclusive use + * @handle: input handle that wants to own the device + * + * When a device is grabbed by an input handle all events generated by + * the device are delivered only to this handle. Also events injected + * by other input handles are ignored while device is grabbed. + */ +int input_grab_device(struct input_handle *handle) +{ + struct input_dev *dev = handle->dev; + int retval; + + retval = mutex_lock_interruptible(&dev->mutex); + if (retval) + return retval; + + if (dev->grab) { + retval = -EBUSY; + goto out; + } + + rcu_assign_pointer(dev->grab, handle); + + out: + mutex_unlock(&dev->mutex); + return retval; +} +EXPORT_SYMBOL(input_grab_device); + +static void __input_release_device(struct input_handle *handle) +{ + struct input_dev *dev = handle->dev; + struct input_handle *grabber; + + grabber = rcu_dereference_protected(dev->grab, + lockdep_is_held(&dev->mutex)); + if (grabber == handle) { + rcu_assign_pointer(dev->grab, NULL); + /* Make sure input_pass_event() notices that grab is gone */ + synchronize_rcu(); + + list_for_each_entry(handle, &dev->h_list, d_node) + if (handle->open && handle->handler->start) + handle->handler->start(handle); + } +} + +/** + * input_release_device - release previously grabbed device + * @handle: input handle that owns the device + * + * Releases previously grabbed device so that other input handles can + * start receiving input events. Upon release all handlers attached + * to the device have their start() method called so they have a change + * to synchronize device state with the rest of the system. + */ +void input_release_device(struct input_handle *handle) +{ + struct input_dev *dev = handle->dev; + + mutex_lock(&dev->mutex); + __input_release_device(handle); + mutex_unlock(&dev->mutex); +} +EXPORT_SYMBOL(input_release_device); + +/** + * input_open_device - open input device + * @handle: handle through which device is being accessed + * + * This function should be called by input handlers when they + * want to start receive events from given input device. + */ +int input_open_device(struct input_handle *handle) +{ + struct input_dev *dev = handle->dev; + int retval; + + retval = mutex_lock_interruptible(&dev->mutex); + if (retval) + return retval; + + if (dev->going_away) { + retval = -ENODEV; + goto out; + } + + handle->open++; + + if (!dev->users++ && dev->open) + retval = dev->open(dev); + + if (retval) { + dev->users--; + if (!--handle->open) { + /* + * Make sure we are not delivering any more events + * through this handle + */ + synchronize_rcu(); + } + } + + out: + mutex_unlock(&dev->mutex); + return retval; +} +EXPORT_SYMBOL(input_open_device); + +int input_flush_device(struct input_handle *handle, struct file *file) +{ + struct input_dev *dev = handle->dev; + int retval; + + retval = mutex_lock_interruptible(&dev->mutex); + if (retval) + return retval; + + if (dev->flush) + retval = dev->flush(dev, file); + + mutex_unlock(&dev->mutex); + return retval; +} +EXPORT_SYMBOL(input_flush_device); + +/** + * input_close_device - close input device + * @handle: handle through which device is being accessed + * + * This function should be called by input handlers when they + * want to stop receive events from given input device. + */ +void input_close_device(struct input_handle *handle) +{ + struct input_dev *dev = handle->dev; + + mutex_lock(&dev->mutex); + + __input_release_device(handle); + + if (!--dev->users && dev->close) + dev->close(dev); + + if (!--handle->open) { + /* + * synchronize_rcu() makes sure that input_pass_event() + * completed and that no more input events are delivered + * through this handle + */ + synchronize_rcu(); + } + + mutex_unlock(&dev->mutex); +} +EXPORT_SYMBOL(input_close_device); + +/* + * Simulate keyup events for all keys that are marked as pressed. + * The function must be called with dev->event_lock held. + */ +static void input_dev_release_keys(struct input_dev *dev) +{ + int code; + + if (is_event_supported(EV_KEY, dev->evbit, EV_MAX)) { + for (code = 0; code <= KEY_MAX; code++) { + if (is_event_supported(code, dev->keybit, KEY_MAX) && + __test_and_clear_bit(code, dev->key)) { + input_pass_event(dev, EV_KEY, code, 0); + } + } + input_pass_event(dev, EV_SYN, SYN_REPORT, 1); + } +} + +/* + * Prepare device for unregistering + */ +static void input_disconnect_device(struct input_dev *dev) +{ + struct input_handle *handle; + + /* + * Mark device as going away. Note that we take dev->mutex here + * not to protect access to dev->going_away but rather to ensure + * that there are no threads in the middle of input_open_device() + */ + mutex_lock(&dev->mutex); + dev->going_away = true; + mutex_unlock(&dev->mutex); + + spin_lock_irq(&dev->event_lock); + + /* + * Simulate keyup events for all pressed keys so that handlers + * are not left with "stuck" keys. The driver may continue + * generate events even after we done here but they will not + * reach any handlers. + */ + input_dev_release_keys(dev); + + list_for_each_entry(handle, &dev->h_list, d_node) + handle->open = 0; + + spin_unlock_irq(&dev->event_lock); +} + +/** + * input_scancode_to_scalar() - converts scancode in &struct input_keymap_entry + * @ke: keymap entry containing scancode to be converted. + * @scancode: pointer to the location where converted scancode should + * be stored. + * + * This function is used to convert scancode stored in &struct keymap_entry + * into scalar form understood by legacy keymap handling methods. These + * methods expect scancodes to be represented as 'unsigned int'. + */ +int input_scancode_to_scalar(const struct input_keymap_entry *ke, + unsigned int *scancode) +{ + switch (ke->len) { + case 1: + *scancode = *((u8 *)ke->scancode); + break; + + case 2: + *scancode = *((u16 *)ke->scancode); + break; + + case 4: + *scancode = *((u32 *)ke->scancode); + break; + + default: + return -EINVAL; + } + + return 0; +} +EXPORT_SYMBOL(input_scancode_to_scalar); + +/* + * Those routines handle the default case where no [gs]etkeycode() is + * defined. In this case, an array indexed by the scancode is used. + */ + +static unsigned int input_fetch_keycode(struct input_dev *dev, + unsigned int index) +{ + switch (dev->keycodesize) { + case 1: + return ((u8 *)dev->keycode)[index]; + + case 2: + return ((u16 *)dev->keycode)[index]; + + default: + return ((u32 *)dev->keycode)[index]; + } +} + +static int input_default_getkeycode(struct input_dev *dev, + struct input_keymap_entry *ke) +{ + unsigned int index; + int error; + + if (!dev->keycodesize) + return -EINVAL; + + if (ke->flags & INPUT_KEYMAP_BY_INDEX) + index = ke->index; + else { + error = input_scancode_to_scalar(ke, &index); + if (error) + return error; + } + + if (index >= dev->keycodemax) + return -EINVAL; + + ke->keycode = input_fetch_keycode(dev, index); + ke->index = index; + ke->len = sizeof(index); + memcpy(ke->scancode, &index, sizeof(index)); + + return 0; +} + +static int input_default_setkeycode(struct input_dev *dev, + const struct input_keymap_entry *ke, + unsigned int *old_keycode) +{ + unsigned int index; + int error; + int i; + + if (!dev->keycodesize) + return -EINVAL; + + if (ke->flags & INPUT_KEYMAP_BY_INDEX) { + index = ke->index; + } else { + error = input_scancode_to_scalar(ke, &index); + if (error) + return error; + } + + if (index >= dev->keycodemax) + return -EINVAL; + + if (dev->keycodesize < sizeof(ke->keycode) && + (ke->keycode >> (dev->keycodesize * 8))) + return -EINVAL; + + switch (dev->keycodesize) { + case 1: { + u8 *k = (u8 *)dev->keycode; + *old_keycode = k[index]; + k[index] = ke->keycode; + break; + } + case 2: { + u16 *k = (u16 *)dev->keycode; + *old_keycode = k[index]; + k[index] = ke->keycode; + break; + } + default: { + u32 *k = (u32 *)dev->keycode; + *old_keycode = k[index]; + k[index] = ke->keycode; + break; + } + } + + __clear_bit(*old_keycode, dev->keybit); + __set_bit(ke->keycode, dev->keybit); + + for (i = 0; i < dev->keycodemax; i++) { + if (input_fetch_keycode(dev, i) == *old_keycode) { + __set_bit(*old_keycode, dev->keybit); + break; /* Setting the bit twice is useless, so break */ + } + } + + return 0; +} + +/** + * input_get_keycode - retrieve keycode currently mapped to a given scancode + * @dev: input device which keymap is being queried + * @ke: keymap entry + * + * This function should be called by anyone interested in retrieving current + * keymap. Presently evdev handlers use it. + */ +int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke) +{ + unsigned long flags; + int retval; + + spin_lock_irqsave(&dev->event_lock, flags); + retval = dev->getkeycode(dev, ke); + spin_unlock_irqrestore(&dev->event_lock, flags); + + return retval; +} +EXPORT_SYMBOL(input_get_keycode); + +/** + * input_set_keycode - attribute a keycode to a given scancode + * @dev: input device which keymap is being updated + * @ke: new keymap entry + * + * This function should be called by anyone needing to update current + * keymap. Presently keyboard and evdev handlers use it. + */ +int input_set_keycode(struct input_dev *dev, + const struct input_keymap_entry *ke) +{ + unsigned long flags; + unsigned int old_keycode; + int retval; + + if (ke->keycode > KEY_MAX) + return -EINVAL; + + spin_lock_irqsave(&dev->event_lock, flags); + + retval = dev->setkeycode(dev, ke, &old_keycode); + if (retval) + goto out; + + /* Make sure KEY_RESERVED did not get enabled. */ + __clear_bit(KEY_RESERVED, dev->keybit); + + /* + * Simulate keyup event if keycode is not present + * in the keymap anymore + */ + if (test_bit(EV_KEY, dev->evbit) && + !is_event_supported(old_keycode, dev->keybit, KEY_MAX) && + __test_and_clear_bit(old_keycode, dev->key)) { + struct input_value vals[] = { + { EV_KEY, old_keycode, 0 }, + input_value_sync + }; + + input_pass_values(dev, vals, ARRAY_SIZE(vals)); + } + + out: + spin_unlock_irqrestore(&dev->event_lock, flags); + + return retval; +} +EXPORT_SYMBOL(input_set_keycode); + +static const struct input_device_id *input_match_device(struct input_handler *handler, + struct input_dev *dev) +{ + const struct input_device_id *id; + + for (id = handler->id_table; id->flags || id->driver_info; id++) { + + if (id->flags & INPUT_DEVICE_ID_MATCH_BUS) + if (id->bustype != dev->id.bustype) + continue; + + if (id->flags & INPUT_DEVICE_ID_MATCH_VENDOR) + if (id->vendor != dev->id.vendor) + continue; + + if (id->flags & INPUT_DEVICE_ID_MATCH_PRODUCT) + if (id->product != dev->id.product) + continue; + + if (id->flags & INPUT_DEVICE_ID_MATCH_VERSION) + if (id->version != dev->id.version) + continue; + + if (!bitmap_subset(id->evbit, dev->evbit, EV_MAX)) + continue; + + if (!bitmap_subset(id->keybit, dev->keybit, KEY_MAX)) + continue; + + if (!bitmap_subset(id->relbit, dev->relbit, REL_MAX)) + continue; + + if (!bitmap_subset(id->absbit, dev->absbit, ABS_MAX)) + continue; + + if (!bitmap_subset(id->mscbit, dev->mscbit, MSC_MAX)) + continue; + + if (!bitmap_subset(id->ledbit, dev->ledbit, LED_MAX)) + continue; + + if (!bitmap_subset(id->sndbit, dev->sndbit, SND_MAX)) + continue; + + if (!bitmap_subset(id->ffbit, dev->ffbit, FF_MAX)) + continue; + + if (!bitmap_subset(id->swbit, dev->swbit, SW_MAX)) + continue; + + if (!handler->match || handler->match(handler, dev)) + return id; + } + + return NULL; +} + +static int input_attach_handler(struct input_dev *dev, struct input_handler *handler) +{ + const struct input_device_id *id; + int error; + + id = input_match_device(handler, dev); + if (!id) + return -ENODEV; + + error = handler->connect(handler, dev, id); + if (error && error != -ENODEV) + pr_err("failed to attach handler %s to device %s, error: %d\n", + handler->name, kobject_name(&dev->dev.kobj), error); + + return error; +} + +#ifdef CONFIG_COMPAT + +static int input_bits_to_string(char *buf, int buf_size, + unsigned long bits, bool skip_empty) +{ + int len = 0; + + if (INPUT_COMPAT_TEST) { + u32 dword = bits >> 32; + if (dword || !skip_empty) + len += snprintf(buf, buf_size, "%x ", dword); + + dword = bits & 0xffffffffUL; + if (dword || !skip_empty || len) + len += snprintf(buf + len, max(buf_size - len, 0), + "%x", dword); + } else { + if (bits || !skip_empty) + len += snprintf(buf, buf_size, "%lx", bits); + } + + return len; +} + +#else /* !CONFIG_COMPAT */ + +static int input_bits_to_string(char *buf, int buf_size, + unsigned long bits, bool skip_empty) +{ + return bits || !skip_empty ? + snprintf(buf, buf_size, "%lx", bits) : 0; +} + +#endif + +#ifdef CONFIG_PROC_FS + +static struct proc_dir_entry *proc_bus_input_dir; +static DECLARE_WAIT_QUEUE_HEAD(input_devices_poll_wait); +static int input_devices_state; + +static inline void input_wakeup_procfs_readers(void) +{ + input_devices_state++; + wake_up(&input_devices_poll_wait); +} + +static unsigned int input_proc_devices_poll(struct file *file, poll_table *wait) +{ + poll_wait(file, &input_devices_poll_wait, wait); + if (file->f_version != input_devices_state) { + file->f_version = input_devices_state; + return POLLIN | POLLRDNORM; + } + + return 0; +} + +union input_seq_state { + struct { + unsigned short pos; + bool mutex_acquired; + }; + void *p; +}; + +static void *input_devices_seq_start(struct seq_file *seq, loff_t *pos) +{ + union input_seq_state *state = (union input_seq_state *)&seq->private; + int error; + + /* We need to fit into seq->private pointer */ + BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private)); + + error = mutex_lock_interruptible(&input_mutex); + if (error) { + state->mutex_acquired = false; + return ERR_PTR(error); + } + + state->mutex_acquired = true; + + return seq_list_start(&input_dev_list, *pos); +} + +static void *input_devices_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + return seq_list_next(v, &input_dev_list, pos); +} + +static void input_seq_stop(struct seq_file *seq, void *v) +{ + union input_seq_state *state = (union input_seq_state *)&seq->private; + + if (state->mutex_acquired) + mutex_unlock(&input_mutex); +} + +static void input_seq_print_bitmap(struct seq_file *seq, const char *name, + unsigned long *bitmap, int max) +{ + int i; + bool skip_empty = true; + char buf[18]; + + seq_printf(seq, "B: %s=", name); + + for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) { + if (input_bits_to_string(buf, sizeof(buf), + bitmap[i], skip_empty)) { + skip_empty = false; + seq_printf(seq, "%s%s", buf, i > 0 ? " " : ""); + } + } + + /* + * If no output was produced print a single 0. + */ + if (skip_empty) + seq_puts(seq, "0"); + + seq_putc(seq, '\n'); +} + +static int input_devices_seq_show(struct seq_file *seq, void *v) +{ + struct input_dev *dev = container_of(v, struct input_dev, node); + const char *path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); + struct input_handle *handle; + + seq_printf(seq, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n", + dev->id.bustype, dev->id.vendor, dev->id.product, dev->id.version); + + seq_printf(seq, "N: Name=\"%s\"\n", dev->name ? dev->name : ""); + seq_printf(seq, "P: Phys=%s\n", dev->phys ? dev->phys : ""); + seq_printf(seq, "S: Sysfs=%s\n", path ? path : ""); + seq_printf(seq, "U: Uniq=%s\n", dev->uniq ? dev->uniq : ""); + seq_printf(seq, "H: Handlers="); + + list_for_each_entry(handle, &dev->h_list, d_node) + seq_printf(seq, "%s ", handle->name); + seq_putc(seq, '\n'); + + input_seq_print_bitmap(seq, "PROP", dev->propbit, INPUT_PROP_MAX); + + input_seq_print_bitmap(seq, "EV", dev->evbit, EV_MAX); + if (test_bit(EV_KEY, dev->evbit)) + input_seq_print_bitmap(seq, "KEY", dev->keybit, KEY_MAX); + if (test_bit(EV_REL, dev->evbit)) + input_seq_print_bitmap(seq, "REL", dev->relbit, REL_MAX); + if (test_bit(EV_ABS, dev->evbit)) + input_seq_print_bitmap(seq, "ABS", dev->absbit, ABS_MAX); + if (test_bit(EV_MSC, dev->evbit)) + input_seq_print_bitmap(seq, "MSC", dev->mscbit, MSC_MAX); + if (test_bit(EV_LED, dev->evbit)) + input_seq_print_bitmap(seq, "LED", dev->ledbit, LED_MAX); + if (test_bit(EV_SND, dev->evbit)) + input_seq_print_bitmap(seq, "SND", dev->sndbit, SND_MAX); + if (test_bit(EV_FF, dev->evbit)) + input_seq_print_bitmap(seq, "FF", dev->ffbit, FF_MAX); + if (test_bit(EV_SW, dev->evbit)) + input_seq_print_bitmap(seq, "SW", dev->swbit, SW_MAX); + + seq_putc(seq, '\n'); + + kfree(path); + return 0; +} + +static const struct seq_operations input_devices_seq_ops = { + .start = input_devices_seq_start, + .next = input_devices_seq_next, + .stop = input_seq_stop, + .show = input_devices_seq_show, +}; + +static int input_proc_devices_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &input_devices_seq_ops); +} + +static const struct file_operations input_devices_fileops = { + .owner = THIS_MODULE, + .open = input_proc_devices_open, + .poll = input_proc_devices_poll, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos) +{ + union input_seq_state *state = (union input_seq_state *)&seq->private; + int error; + + /* We need to fit into seq->private pointer */ + BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private)); + + error = mutex_lock_interruptible(&input_mutex); + if (error) { + state->mutex_acquired = false; + return ERR_PTR(error); + } + + state->mutex_acquired = true; + state->pos = *pos; + + return seq_list_start(&input_handler_list, *pos); +} + +static void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos) +{ + union input_seq_state *state = (union input_seq_state *)&seq->private; + + state->pos = *pos + 1; + return seq_list_next(v, &input_handler_list, pos); +} + +static int input_handlers_seq_show(struct seq_file *seq, void *v) +{ + struct input_handler *handler = container_of(v, struct input_handler, node); + union input_seq_state *state = (union input_seq_state *)&seq->private; + + seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name); + if (handler->filter) + seq_puts(seq, " (filter)"); + if (handler->legacy_minors) + seq_printf(seq, " Minor=%d", handler->minor); + seq_putc(seq, '\n'); + + return 0; +} + +static const struct seq_operations input_handlers_seq_ops = { + .start = input_handlers_seq_start, + .next = input_handlers_seq_next, + .stop = input_seq_stop, + .show = input_handlers_seq_show, +}; + +static int input_proc_handlers_open(struct inode *inode, struct file *file) +{ + return seq_open(file, &input_handlers_seq_ops); +} + +static const struct file_operations input_handlers_fileops = { + .owner = THIS_MODULE, + .open = input_proc_handlers_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int __init input_proc_init(void) +{ + struct proc_dir_entry *entry; + + proc_bus_input_dir = proc_mkdir("bus/input", NULL); + if (!proc_bus_input_dir) + return -ENOMEM; + + entry = proc_create("devices", 0, proc_bus_input_dir, + &input_devices_fileops); + if (!entry) + goto fail1; + + entry = proc_create("handlers", 0, proc_bus_input_dir, + &input_handlers_fileops); + if (!entry) + goto fail2; + + return 0; + + fail2: remove_proc_entry("devices", proc_bus_input_dir); + fail1: remove_proc_entry("bus/input", NULL); + return -ENOMEM; +} + +static void input_proc_exit(void) +{ + remove_proc_entry("devices", proc_bus_input_dir); + remove_proc_entry("handlers", proc_bus_input_dir); + remove_proc_entry("bus/input", NULL); +} + +#else /* !CONFIG_PROC_FS */ +static inline void input_wakeup_procfs_readers(void) { } +static inline int input_proc_init(void) { return 0; } +static inline void input_proc_exit(void) { } +#endif + +#define INPUT_DEV_STRING_ATTR_SHOW(name) \ +static ssize_t input_dev_show_##name(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + struct input_dev *input_dev = to_input_dev(dev); \ + \ + return scnprintf(buf, PAGE_SIZE, "%s\n", \ + input_dev->name ? input_dev->name : ""); \ +} \ +static DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL) + +INPUT_DEV_STRING_ATTR_SHOW(name); +INPUT_DEV_STRING_ATTR_SHOW(phys); +INPUT_DEV_STRING_ATTR_SHOW(uniq); + +static int input_print_modalias_bits(char *buf, int size, + char name, unsigned long *bm, + unsigned int min_bit, unsigned int max_bit) +{ + int len = 0, i; + + len += snprintf(buf, max(size, 0), "%c", name); + for (i = min_bit; i < max_bit; i++) + if (bm[BIT_WORD(i)] & BIT_MASK(i)) + len += snprintf(buf + len, max(size - len, 0), "%X,", i); + return len; +} + +static int input_print_modalias(char *buf, int size, struct input_dev *id, + int add_cr) +{ + int len; + + len = snprintf(buf, max(size, 0), + "input:b%04Xv%04Xp%04Xe%04X-", + id->id.bustype, id->id.vendor, + id->id.product, id->id.version); + + len += input_print_modalias_bits(buf + len, size - len, + 'e', id->evbit, 0, EV_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'k', id->keybit, KEY_MIN_INTERESTING, KEY_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'r', id->relbit, 0, REL_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'a', id->absbit, 0, ABS_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'm', id->mscbit, 0, MSC_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'l', id->ledbit, 0, LED_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 's', id->sndbit, 0, SND_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'f', id->ffbit, 0, FF_MAX); + len += input_print_modalias_bits(buf + len, size - len, + 'w', id->swbit, 0, SW_MAX); + + if (add_cr) + len += snprintf(buf + len, max(size - len, 0), "\n"); + + return len; +} + +static ssize_t input_dev_show_modalias(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct input_dev *id = to_input_dev(dev); + ssize_t len; + + len = input_print_modalias(buf, PAGE_SIZE, id, 1); + + return min_t(int, len, PAGE_SIZE); +} +static DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL); + +static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap, + int max, int add_cr); + +static ssize_t input_dev_show_properties(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct input_dev *input_dev = to_input_dev(dev); + int len = input_print_bitmap(buf, PAGE_SIZE, input_dev->propbit, + INPUT_PROP_MAX, true); + return min_t(int, len, PAGE_SIZE); +} +static DEVICE_ATTR(properties, S_IRUGO, input_dev_show_properties, NULL); + +static struct attribute *input_dev_attrs[] = { + &dev_attr_name.attr, + &dev_attr_phys.attr, + &dev_attr_uniq.attr, + &dev_attr_modalias.attr, + &dev_attr_properties.attr, + NULL +}; + +static struct attribute_group input_dev_attr_group = { + .attrs = input_dev_attrs, +}; + +#define INPUT_DEV_ID_ATTR(name) \ +static ssize_t input_dev_show_id_##name(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + struct input_dev *input_dev = to_input_dev(dev); \ + return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name); \ +} \ +static DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL) + +INPUT_DEV_ID_ATTR(bustype); +INPUT_DEV_ID_ATTR(vendor); +INPUT_DEV_ID_ATTR(product); +INPUT_DEV_ID_ATTR(version); + +static struct attribute *input_dev_id_attrs[] = { + &dev_attr_bustype.attr, + &dev_attr_vendor.attr, + &dev_attr_product.attr, + &dev_attr_version.attr, + NULL +}; + +static struct attribute_group input_dev_id_attr_group = { + .name = "id", + .attrs = input_dev_id_attrs, +}; + +static int input_print_bitmap(char *buf, int buf_size, unsigned long *bitmap, + int max, int add_cr) +{ + int i; + int len = 0; + bool skip_empty = true; + + for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) { + len += input_bits_to_string(buf + len, max(buf_size - len, 0), + bitmap[i], skip_empty); + if (len) { + skip_empty = false; + if (i > 0) + len += snprintf(buf + len, max(buf_size - len, 0), " "); + } + } + + /* + * If no output was produced print a single 0. + */ + if (len == 0) + len = snprintf(buf, buf_size, "%d", 0); + + if (add_cr) + len += snprintf(buf + len, max(buf_size - len, 0), "\n"); + + return len; +} + +#define INPUT_DEV_CAP_ATTR(ev, bm) \ +static ssize_t input_dev_show_cap_##bm(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + struct input_dev *input_dev = to_input_dev(dev); \ + int len = input_print_bitmap(buf, PAGE_SIZE, \ + input_dev->bm##bit, ev##_MAX, \ + true); \ + return min_t(int, len, PAGE_SIZE); \ +} \ +static DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL) + +INPUT_DEV_CAP_ATTR(EV, ev); +INPUT_DEV_CAP_ATTR(KEY, key); +INPUT_DEV_CAP_ATTR(REL, rel); +INPUT_DEV_CAP_ATTR(ABS, abs); +INPUT_DEV_CAP_ATTR(MSC, msc); +INPUT_DEV_CAP_ATTR(LED, led); +INPUT_DEV_CAP_ATTR(SND, snd); +INPUT_DEV_CAP_ATTR(FF, ff); +INPUT_DEV_CAP_ATTR(SW, sw); + +static struct attribute *input_dev_caps_attrs[] = { + &dev_attr_ev.attr, + &dev_attr_key.attr, + &dev_attr_rel.attr, + &dev_attr_abs.attr, + &dev_attr_msc.attr, + &dev_attr_led.attr, + &dev_attr_snd.attr, + &dev_attr_ff.attr, + &dev_attr_sw.attr, + NULL +}; + +static struct attribute_group input_dev_caps_attr_group = { + .name = "capabilities", + .attrs = input_dev_caps_attrs, +}; + +static const struct attribute_group *input_dev_attr_groups[] = { + &input_dev_attr_group, + &input_dev_id_attr_group, + &input_dev_caps_attr_group, + NULL +}; + +static void input_dev_release(struct device *device) +{ + struct input_dev *dev = to_input_dev(device); + + input_ff_destroy(dev); + input_mt_destroy_slots(dev); + kfree(dev->absinfo); + kfree(dev->vals); + kfree(dev); + + module_put(THIS_MODULE); +} + +/* + * Input uevent interface - loading event handlers based on + * device bitfields. + */ +static int input_add_uevent_bm_var(struct kobj_uevent_env *env, + const char *name, unsigned long *bitmap, int max) +{ + int len; + + if (add_uevent_var(env, "%s", name)) + return -ENOMEM; + + len = input_print_bitmap(&env->buf[env->buflen - 1], + sizeof(env->buf) - env->buflen, + bitmap, max, false); + if (len >= (sizeof(env->buf) - env->buflen)) + return -ENOMEM; + + env->buflen += len; + return 0; +} + +static int input_add_uevent_modalias_var(struct kobj_uevent_env *env, + struct input_dev *dev) +{ + int len; + + if (add_uevent_var(env, "MODALIAS=")) + return -ENOMEM; + + len = input_print_modalias(&env->buf[env->buflen - 1], + sizeof(env->buf) - env->buflen, + dev, 0); + if (len >= (sizeof(env->buf) - env->buflen)) + return -ENOMEM; + + env->buflen += len; + return 0; +} + +#define INPUT_ADD_HOTPLUG_VAR(fmt, val...) \ + do { \ + int err = add_uevent_var(env, fmt, val); \ + if (err) \ + return err; \ + } while (0) + +#define INPUT_ADD_HOTPLUG_BM_VAR(name, bm, max) \ + do { \ + int err = input_add_uevent_bm_var(env, name, bm, max); \ + if (err) \ + return err; \ + } while (0) + +#define INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev) \ + do { \ + int err = input_add_uevent_modalias_var(env, dev); \ + if (err) \ + return err; \ + } while (0) + +static int input_dev_uevent(struct device *device, struct kobj_uevent_env *env) +{ + struct input_dev *dev = to_input_dev(device); + + INPUT_ADD_HOTPLUG_VAR("PRODUCT=%x/%x/%x/%x", + dev->id.bustype, dev->id.vendor, + dev->id.product, dev->id.version); + if (dev->name) + INPUT_ADD_HOTPLUG_VAR("NAME=\"%s\"", dev->name); + if (dev->phys) + INPUT_ADD_HOTPLUG_VAR("PHYS=\"%s\"", dev->phys); + if (dev->uniq) + INPUT_ADD_HOTPLUG_VAR("UNIQ=\"%s\"", dev->uniq); + + INPUT_ADD_HOTPLUG_BM_VAR("PROP=", dev->propbit, INPUT_PROP_MAX); + + INPUT_ADD_HOTPLUG_BM_VAR("EV=", dev->evbit, EV_MAX); + if (test_bit(EV_KEY, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("KEY=", dev->keybit, KEY_MAX); + if (test_bit(EV_REL, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("REL=", dev->relbit, REL_MAX); + if (test_bit(EV_ABS, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("ABS=", dev->absbit, ABS_MAX); + if (test_bit(EV_MSC, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("MSC=", dev->mscbit, MSC_MAX); + if (test_bit(EV_LED, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("LED=", dev->ledbit, LED_MAX); + if (test_bit(EV_SND, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("SND=", dev->sndbit, SND_MAX); + if (test_bit(EV_FF, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("FF=", dev->ffbit, FF_MAX); + if (test_bit(EV_SW, dev->evbit)) + INPUT_ADD_HOTPLUG_BM_VAR("SW=", dev->swbit, SW_MAX); + + INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev); + + return 0; +} + +#define INPUT_DO_TOGGLE(dev, type, bits, on) \ + do { \ + int i; \ + bool active; \ + \ + if (!test_bit(EV_##type, dev->evbit)) \ + break; \ + \ + for (i = 0; i < type##_MAX; i++) { \ + if (!test_bit(i, dev->bits##bit)) \ + continue; \ + \ + active = test_bit(i, dev->bits); \ + if (!active && !on) \ + continue; \ + \ + dev->event(dev, EV_##type, i, on ? active : 0); \ + } \ + } while (0) + +static void input_dev_toggle(struct input_dev *dev, bool activate) +{ + if (!dev->event) + return; + + INPUT_DO_TOGGLE(dev, LED, led, activate); + INPUT_DO_TOGGLE(dev, SND, snd, activate); + + if (activate && test_bit(EV_REP, dev->evbit)) { + dev->event(dev, EV_REP, REP_PERIOD, dev->rep[REP_PERIOD]); + dev->event(dev, EV_REP, REP_DELAY, dev->rep[REP_DELAY]); + } +} + +/** + * input_reset_device() - reset/restore the state of input device + * @dev: input device whose state needs to be reset + * + * This function tries to reset the state of an opened input device and + * bring internal state and state if the hardware in sync with each other. + * We mark all keys as released, restore LED state, repeat rate, etc. + */ +void input_reset_device(struct input_dev *dev) +{ + mutex_lock(&dev->mutex); + + if (dev->users) { + input_dev_toggle(dev, true); + + /* + * Keys that have been pressed at suspend time are unlikely + * to be still pressed when we resume. + */ + spin_lock_irq(&dev->event_lock); + input_dev_release_keys(dev); + spin_unlock_irq(&dev->event_lock); + } + + mutex_unlock(&dev->mutex); +} +EXPORT_SYMBOL(input_reset_device); + +#ifdef CONFIG_PM +static int input_dev_suspend(struct device *dev) +{ + struct input_dev *input_dev = to_input_dev(dev); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + input_dev_toggle(input_dev, false); + + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int input_dev_resume(struct device *dev) +{ + struct input_dev *input_dev = to_input_dev(dev); + + input_reset_device(input_dev); + + return 0; +} + +static const struct dev_pm_ops input_dev_pm_ops = { + .suspend = input_dev_suspend, + .resume = input_dev_resume, + .poweroff = input_dev_suspend, + .restore = input_dev_resume, +}; +#endif /* CONFIG_PM */ + +static struct device_type input_dev_type = { + .groups = input_dev_attr_groups, + .release = input_dev_release, + .uevent = input_dev_uevent, +#ifdef CONFIG_PM + .pm = &input_dev_pm_ops, +#endif +}; + +static char *input_devnode(struct device *dev, umode_t *mode) +{ + return kasprintf(GFP_KERNEL, "input/%s", dev_name(dev)); +} + +struct class input_class = { + .name = "input", + .devnode = input_devnode, +}; +EXPORT_SYMBOL_GPL(input_class); + +/** + * input_allocate_device - allocate memory for new input device + * + * Returns prepared struct input_dev or %NULL. + * + * NOTE: Use input_free_device() to free devices that have not been + * registered; input_unregister_device() should be used for already + * registered devices. + */ +struct input_dev *input_allocate_device(void) +{ + struct input_dev *dev; + + dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL); + if (dev) { + dev->dev.type = &input_dev_type; + dev->dev.class = &input_class; + device_initialize(&dev->dev); + mutex_init(&dev->mutex); + spin_lock_init(&dev->event_lock); + INIT_LIST_HEAD(&dev->h_list); + INIT_LIST_HEAD(&dev->node); + + __module_get(THIS_MODULE); + } + + return dev; +} +EXPORT_SYMBOL(input_allocate_device); + +struct input_devres { + struct input_dev *input; +}; + +static int devm_input_device_match(struct device *dev, void *res, void *data) +{ + struct input_devres *devres = res; + + return devres->input == data; +} + +static void devm_input_device_release(struct device *dev, void *res) +{ + struct input_devres *devres = res; + struct input_dev *input = devres->input; + + dev_dbg(dev, "%s: dropping reference to %s\n", + __func__, dev_name(&input->dev)); + input_put_device(input); +} + +/** + * devm_input_allocate_device - allocate managed input device + * @dev: device owning the input device being created + * + * Returns prepared struct input_dev or %NULL. + * + * Managed input devices do not need to be explicitly unregistered or + * freed as it will be done automatically when owner device unbinds from + * its driver (or binding fails). Once managed input device is allocated, + * it is ready to be set up and registered in the same fashion as regular + * input device. There are no special devm_input_device_[un]register() + * variants, regular ones work with both managed and unmanaged devices, + * should you need them. In most cases however, managed input device need + * not be explicitly unregistered or freed. + * + * NOTE: the owner device is set up as parent of input device and users + * should not override it. + */ +struct input_dev *devm_input_allocate_device(struct device *dev) +{ + struct input_dev *input; + struct input_devres *devres; + + devres = devres_alloc(devm_input_device_release, + sizeof(struct input_devres), GFP_KERNEL); + if (!devres) + return NULL; + + input = input_allocate_device(); + if (!input) { + devres_free(devres); + return NULL; + } + + input->dev.parent = dev; + input->devres_managed = true; + + devres->input = input; + devres_add(dev, devres); + + return input; +} +EXPORT_SYMBOL(devm_input_allocate_device); + +/** + * input_free_device - free memory occupied by input_dev structure + * @dev: input device to free + * + * This function should only be used if input_register_device() + * was not called yet or if it failed. Once device was registered + * use input_unregister_device() and memory will be freed once last + * reference to the device is dropped. + * + * Device should be allocated by input_allocate_device(). + * + * NOTE: If there are references to the input device then memory + * will not be freed until last reference is dropped. + */ +void input_free_device(struct input_dev *dev) +{ + if (dev) { + if (dev->devres_managed) + WARN_ON(devres_destroy(dev->dev.parent, + devm_input_device_release, + devm_input_device_match, + dev)); + input_put_device(dev); + } +} +EXPORT_SYMBOL(input_free_device); + +/** + * input_set_capability - mark device as capable of a certain event + * @dev: device that is capable of emitting or accepting event + * @type: type of the event (EV_KEY, EV_REL, etc...) + * @code: event code + * + * In addition to setting up corresponding bit in appropriate capability + * bitmap the function also adjusts dev->evbit. + */ +void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code) +{ + switch (type) { + case EV_KEY: + __set_bit(code, dev->keybit); + break; + + case EV_REL: + __set_bit(code, dev->relbit); + break; + + case EV_ABS: + input_alloc_absinfo(dev); + if (!dev->absinfo) + return; + + __set_bit(code, dev->absbit); + break; + + case EV_MSC: + __set_bit(code, dev->mscbit); + break; + + case EV_SW: + __set_bit(code, dev->swbit); + break; + + case EV_LED: + __set_bit(code, dev->ledbit); + break; + + case EV_SND: + __set_bit(code, dev->sndbit); + break; + + case EV_FF: + __set_bit(code, dev->ffbit); + break; + + case EV_PWR: + /* do nothing */ + break; + + default: + pr_err("input_set_capability: unknown type %u (code %u)\n", + type, code); + dump_stack(); + return; + } + + __set_bit(type, dev->evbit); +} +EXPORT_SYMBOL(input_set_capability); + +static unsigned int input_estimate_events_per_packet(struct input_dev *dev) +{ + int mt_slots; + int i; + unsigned int events; + + if (dev->mt) { + mt_slots = dev->mt->num_slots; + } else if (test_bit(ABS_MT_TRACKING_ID, dev->absbit)) { + mt_slots = dev->absinfo[ABS_MT_TRACKING_ID].maximum - + dev->absinfo[ABS_MT_TRACKING_ID].minimum + 1, + mt_slots = clamp(mt_slots, 2, 32); + } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { + mt_slots = 2; + } else { + mt_slots = 0; + } + + events = mt_slots + 1; /* count SYN_MT_REPORT and SYN_REPORT */ + + for (i = 0; i < ABS_CNT; i++) { + if (test_bit(i, dev->absbit)) { + if (input_is_mt_axis(i)) + events += mt_slots; + else + events++; + } + } + + for (i = 0; i < REL_CNT; i++) + if (test_bit(i, dev->relbit)) + events++; + + /* Make room for KEY and MSC events */ + events += 7; + + return events; +} + +#define INPUT_CLEANSE_BITMASK(dev, type, bits) \ + do { \ + if (!test_bit(EV_##type, dev->evbit)) \ + memset(dev->bits##bit, 0, \ + sizeof(dev->bits##bit)); \ + } while (0) + +static void input_cleanse_bitmasks(struct input_dev *dev) +{ + INPUT_CLEANSE_BITMASK(dev, KEY, key); + INPUT_CLEANSE_BITMASK(dev, REL, rel); + INPUT_CLEANSE_BITMASK(dev, ABS, abs); + INPUT_CLEANSE_BITMASK(dev, MSC, msc); + INPUT_CLEANSE_BITMASK(dev, LED, led); + INPUT_CLEANSE_BITMASK(dev, SND, snd); + INPUT_CLEANSE_BITMASK(dev, FF, ff); + INPUT_CLEANSE_BITMASK(dev, SW, sw); +} + +static void __input_unregister_device(struct input_dev *dev) +{ + struct input_handle *handle, *next; + + input_disconnect_device(dev); + + mutex_lock(&input_mutex); + + list_for_each_entry_safe(handle, next, &dev->h_list, d_node) + handle->handler->disconnect(handle); + WARN_ON(!list_empty(&dev->h_list)); + + del_timer_sync(&dev->timer); + list_del_init(&dev->node); + + input_wakeup_procfs_readers(); + + mutex_unlock(&input_mutex); + + device_del(&dev->dev); +} + +static void devm_input_device_unregister(struct device *dev, void *res) +{ + struct input_devres *devres = res; + struct input_dev *input = devres->input; + + dev_dbg(dev, "%s: unregistering device %s\n", + __func__, dev_name(&input->dev)); + __input_unregister_device(input); +} + +/** + * input_register_device - register device with input core + * @dev: device to be registered + * + * This function registers device with input core. The device must be + * allocated with input_allocate_device() and all it's capabilities + * set up before registering. + * If function fails the device must be freed with input_free_device(). + * Once device has been successfully registered it can be unregistered + * with input_unregister_device(); input_free_device() should not be + * called in this case. + * + * Note that this function is also used to register managed input devices + * (ones allocated with devm_input_allocate_device()). Such managed input + * devices need not be explicitly unregistered or freed, their tear down + * is controlled by the devres infrastructure. It is also worth noting + * that tear down of managed input devices is internally a 2-step process: + * registered managed input device is first unregistered, but stays in + * memory and can still handle input_event() calls (although events will + * not be delivered anywhere). The freeing of managed input device will + * happen later, when devres stack is unwound to the point where device + * allocation was made. + */ +int input_register_device(struct input_dev *dev) +{ + static atomic_t input_no = ATOMIC_INIT(0); + struct input_devres *devres = NULL; + struct input_handler *handler; + unsigned int packet_size; + const char *path; + int error; + + if (dev->devres_managed) { + devres = devres_alloc(devm_input_device_unregister, + sizeof(struct input_devres), GFP_KERNEL); + if (!devres) + return -ENOMEM; + + devres->input = dev; + } + + /* Every input device generates EV_SYN/SYN_REPORT events. */ + __set_bit(EV_SYN, dev->evbit); + + /* KEY_RESERVED is not supposed to be transmitted to userspace. */ + __clear_bit(KEY_RESERVED, dev->keybit); + + /* Make sure that bitmasks not mentioned in dev->evbit are clean. */ + input_cleanse_bitmasks(dev); + + packet_size = input_estimate_events_per_packet(dev); + if (dev->hint_events_per_packet < packet_size) + dev->hint_events_per_packet = packet_size; + + dev->max_vals = max(dev->hint_events_per_packet, packet_size) + 2; + dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL); + if (!dev->vals) { + error = -ENOMEM; + goto err_devres_free; + } + + /* + * If delay and period are pre-set by the driver, then autorepeating + * is handled by the driver itself and we don't do it in input.c. + */ + init_timer(&dev->timer); + if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD]) { + dev->timer.data = (long) dev; + dev->timer.function = input_repeat_key; + dev->rep[REP_DELAY] = 250; + dev->rep[REP_PERIOD] = 33; + } + + if (!dev->getkeycode) + dev->getkeycode = input_default_getkeycode; + + if (!dev->setkeycode) + dev->setkeycode = input_default_setkeycode; + + dev_set_name(&dev->dev, "input%ld", + (unsigned long) atomic_inc_return(&input_no) - 1); + + error = device_add(&dev->dev); + if (error) + goto err_free_vals; + + path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); + pr_info("%s as %s\n", + dev->name ? dev->name : "Unspecified device", + path ? path : "N/A"); + kfree(path); + + error = mutex_lock_interruptible(&input_mutex); + if (error) + goto err_device_del; + + list_add_tail(&dev->node, &input_dev_list); + + list_for_each_entry(handler, &input_handler_list, node) + input_attach_handler(dev, handler); + + input_wakeup_procfs_readers(); + + mutex_unlock(&input_mutex); + + if (dev->devres_managed) { + dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n", + __func__, dev_name(&dev->dev)); + devres_add(dev->dev.parent, devres); + } + return 0; + +err_device_del: + device_del(&dev->dev); +err_free_vals: + kfree(dev->vals); + dev->vals = NULL; +err_devres_free: + devres_free(devres); + return error; +} +EXPORT_SYMBOL(input_register_device); + +/** + * input_unregister_device - unregister previously registered device + * @dev: device to be unregistered + * + * This function unregisters an input device. Once device is unregistered + * the caller should not try to access it as it may get freed at any moment. + */ +void input_unregister_device(struct input_dev *dev) +{ + if (dev->devres_managed) { + WARN_ON(devres_destroy(dev->dev.parent, + devm_input_device_unregister, + devm_input_device_match, + dev)); + __input_unregister_device(dev); + /* + * We do not do input_put_device() here because it will be done + * when 2nd devres fires up. + */ + } else { + __input_unregister_device(dev); + input_put_device(dev); + } +} +EXPORT_SYMBOL(input_unregister_device); + +/** + * input_register_handler - register a new input handler + * @handler: handler to be registered + * + * This function registers a new input handler (interface) for input + * devices in the system and attaches it to all input devices that + * are compatible with the handler. + */ +int input_register_handler(struct input_handler *handler) +{ + struct input_dev *dev; + int error; + + error = mutex_lock_interruptible(&input_mutex); + if (error) + return error; + + INIT_LIST_HEAD(&handler->h_list); + + list_add_tail(&handler->node, &input_handler_list); + + list_for_each_entry(dev, &input_dev_list, node) + input_attach_handler(dev, handler); + + input_wakeup_procfs_readers(); + + mutex_unlock(&input_mutex); + return 0; +} +EXPORT_SYMBOL(input_register_handler); + +/** + * input_unregister_handler - unregisters an input handler + * @handler: handler to be unregistered + * + * This function disconnects a handler from its input devices and + * removes it from lists of known handlers. + */ +void input_unregister_handler(struct input_handler *handler) +{ + struct input_handle *handle, *next; + + mutex_lock(&input_mutex); + + list_for_each_entry_safe(handle, next, &handler->h_list, h_node) + handler->disconnect(handle); + WARN_ON(!list_empty(&handler->h_list)); + + list_del_init(&handler->node); + + input_wakeup_procfs_readers(); + + mutex_unlock(&input_mutex); +} +EXPORT_SYMBOL(input_unregister_handler); + +/** + * input_handler_for_each_handle - handle iterator + * @handler: input handler to iterate + * @data: data for the callback + * @fn: function to be called for each handle + * + * Iterate over @bus's list of devices, and call @fn for each, passing + * it @data and stop when @fn returns a non-zero value. The function is + * using RCU to traverse the list and therefore may be usind in atonic + * contexts. The @fn callback is invoked from RCU critical section and + * thus must not sleep. + */ +int input_handler_for_each_handle(struct input_handler *handler, void *data, + int (*fn)(struct input_handle *, void *)) +{ + struct input_handle *handle; + int retval = 0; + + rcu_read_lock(); + + list_for_each_entry_rcu(handle, &handler->h_list, h_node) { + retval = fn(handle, data); + if (retval) + break; + } + + rcu_read_unlock(); + + return retval; +} +EXPORT_SYMBOL(input_handler_for_each_handle); + +/** + * input_register_handle - register a new input handle + * @handle: handle to register + * + * This function puts a new input handle onto device's + * and handler's lists so that events can flow through + * it once it is opened using input_open_device(). + * + * This function is supposed to be called from handler's + * connect() method. + */ +int input_register_handle(struct input_handle *handle) +{ + struct input_handler *handler = handle->handler; + struct input_dev *dev = handle->dev; + int error; + + /* + * We take dev->mutex here to prevent race with + * input_release_device(). + */ + error = mutex_lock_interruptible(&dev->mutex); + if (error) + return error; + + /* + * Filters go to the head of the list, normal handlers + * to the tail. + */ + if (handler->filter) + list_add_rcu(&handle->d_node, &dev->h_list); + else + list_add_tail_rcu(&handle->d_node, &dev->h_list); + + mutex_unlock(&dev->mutex); + + /* + * Since we are supposed to be called from ->connect() + * which is mutually exclusive with ->disconnect() + * we can't be racing with input_unregister_handle() + * and so separate lock is not needed here. + */ + list_add_tail_rcu(&handle->h_node, &handler->h_list); + + if (handler->start) + handler->start(handle); + + return 0; +} +EXPORT_SYMBOL(input_register_handle); + +/** + * input_unregister_handle - unregister an input handle + * @handle: handle to unregister + * + * This function removes input handle from device's + * and handler's lists. + * + * This function is supposed to be called from handler's + * disconnect() method. + */ +void input_unregister_handle(struct input_handle *handle) +{ + struct input_dev *dev = handle->dev; + + list_del_rcu(&handle->h_node); + + /* + * Take dev->mutex to prevent race with input_release_device(). + */ + mutex_lock(&dev->mutex); + list_del_rcu(&handle->d_node); + mutex_unlock(&dev->mutex); + + synchronize_rcu(); +} +EXPORT_SYMBOL(input_unregister_handle); + +/** + * input_get_new_minor - allocates a new input minor number + * @legacy_base: beginning or the legacy range to be searched + * @legacy_num: size of legacy range + * @allow_dynamic: whether we can also take ID from the dynamic range + * + * This function allocates a new device minor for from input major namespace. + * Caller can request legacy minor by specifying @legacy_base and @legacy_num + * parameters and whether ID can be allocated from dynamic range if there are + * no free IDs in legacy range. + */ +int input_get_new_minor(int legacy_base, unsigned int legacy_num, + bool allow_dynamic) +{ + /* + * This function should be called from input handler's ->connect() + * methods, which are serialized with input_mutex, so no additional + * locking is needed here. + */ + if (legacy_base >= 0) { + int minor = ida_simple_get(&input_ida, + legacy_base, + legacy_base + legacy_num, + GFP_KERNEL); + if (minor >= 0 || !allow_dynamic) + return minor; + } + + return ida_simple_get(&input_ida, + INPUT_FIRST_DYNAMIC_DEV, INPUT_MAX_CHAR_DEVICES, + GFP_KERNEL); +} +EXPORT_SYMBOL(input_get_new_minor); + +/** + * input_free_minor - release previously allocated minor + * @minor: minor to be released + * + * This function releases previously allocated input minor so that it can be + * reused later. + */ +void input_free_minor(unsigned int minor) +{ + ida_simple_remove(&input_ida, minor); +} +EXPORT_SYMBOL(input_free_minor); + +static int __init input_init(void) +{ + int err; + + err = class_register(&input_class); + if (err) { + pr_err("unable to register input_dev class\n"); + return err; + } + + err = input_proc_init(); + if (err) + goto fail1; + + err = register_chrdev_region(MKDEV(INPUT_MAJOR, 0), + INPUT_MAX_CHAR_DEVICES, "input"); + if (err) { + pr_err("unable to register char major %d", INPUT_MAJOR); + goto fail2; + } + + return 0; + + fail2: input_proc_exit(); + fail1: class_unregister(&input_class); + return err; +} + +static void __exit input_exit(void) +{ + input_proc_exit(); + unregister_chrdev_region(MKDEV(INPUT_MAJOR, 0), + INPUT_MAX_CHAR_DEVICES); + class_unregister(&input_class); +} + +subsys_initcall(input_init); +module_exit(input_exit); diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c new file mode 100644 index 00000000..f362883c --- /dev/null +++ b/drivers/input/joydev.c @@ -0,0 +1,956 @@ +/* + * Joystick device driver for the input driver suite. + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * Copyright (c) 1999 Colin Van Dyke + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Joystick device interfaces"); +MODULE_SUPPORTED_DEVICE("input/js"); +MODULE_LICENSE("GPL"); + +#define JOYDEV_MINOR_BASE 0 +#define JOYDEV_MINORS 16 +#define JOYDEV_BUFFER_SIZE 64 + +struct joydev { + int open; + struct input_handle handle; + wait_queue_head_t wait; + struct list_head client_list; + spinlock_t client_lock; /* protects client_list */ + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; + + struct js_corr corr[ABS_CNT]; + struct JS_DATA_SAVE_TYPE glue; + int nabs; + int nkey; + __u16 keymap[KEY_MAX - BTN_MISC + 1]; + __u16 keypam[KEY_MAX - BTN_MISC + 1]; + __u8 absmap[ABS_CNT]; + __u8 abspam[ABS_CNT]; + __s16 abs[ABS_CNT]; +}; + +struct joydev_client { + struct js_event buffer[JOYDEV_BUFFER_SIZE]; + int head; + int tail; + int startup; + spinlock_t buffer_lock; /* protects access to buffer, head and tail */ + struct fasync_struct *fasync; + struct joydev *joydev; + struct list_head node; +}; + +static int joydev_correct(int value, struct js_corr *corr) +{ + switch (corr->type) { + + case JS_CORR_NONE: + break; + + case JS_CORR_BROKEN: + value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 : + ((corr->coef[3] * (value - corr->coef[1])) >> 14)) : + ((corr->coef[2] * (value - corr->coef[0])) >> 14); + break; + + default: + return 0; + } + + return value < -32767 ? -32767 : (value > 32767 ? 32767 : value); +} + +static void joydev_pass_event(struct joydev_client *client, + struct js_event *event) +{ + struct joydev *joydev = client->joydev; + + /* + * IRQs already disabled, just acquire the lock + */ + spin_lock(&client->buffer_lock); + + client->buffer[client->head] = *event; + + if (client->startup == joydev->nabs + joydev->nkey) { + client->head++; + client->head &= JOYDEV_BUFFER_SIZE - 1; + if (client->tail == client->head) + client->startup = 0; + } + + spin_unlock(&client->buffer_lock); + + kill_fasync(&client->fasync, SIGIO, POLL_IN); +} + +static void joydev_event(struct input_handle *handle, + unsigned int type, unsigned int code, int value) +{ + struct joydev *joydev = handle->private; + struct joydev_client *client; + struct js_event event; + + switch (type) { + + case EV_KEY: + if (code < BTN_MISC || value == 2) + return; + event.type = JS_EVENT_BUTTON; + event.number = joydev->keymap[code - BTN_MISC]; + event.value = value; + break; + + case EV_ABS: + event.type = JS_EVENT_AXIS; + event.number = joydev->absmap[code]; + event.value = joydev_correct(value, + &joydev->corr[event.number]); + if (event.value == joydev->abs[event.number]) + return; + joydev->abs[event.number] = event.value; + break; + + default: + return; + } + + event.time = jiffies_to_msecs(jiffies); + + rcu_read_lock(); + list_for_each_entry_rcu(client, &joydev->client_list, node) + joydev_pass_event(client, &event); + rcu_read_unlock(); + + wake_up_interruptible(&joydev->wait); +} + +static int joydev_fasync(int fd, struct file *file, int on) +{ + struct joydev_client *client = file->private_data; + + return fasync_helper(fd, file, on, &client->fasync); +} + +static void joydev_free(struct device *dev) +{ + struct joydev *joydev = container_of(dev, struct joydev, dev); + + input_put_device(joydev->handle.dev); + kfree(joydev); +} + +static void joydev_attach_client(struct joydev *joydev, + struct joydev_client *client) +{ + spin_lock(&joydev->client_lock); + list_add_tail_rcu(&client->node, &joydev->client_list); + spin_unlock(&joydev->client_lock); +} + +static void joydev_detach_client(struct joydev *joydev, + struct joydev_client *client) +{ + spin_lock(&joydev->client_lock); + list_del_rcu(&client->node); + spin_unlock(&joydev->client_lock); + synchronize_rcu(); +} + +static int joydev_open_device(struct joydev *joydev) +{ + int retval; + + retval = mutex_lock_interruptible(&joydev->mutex); + if (retval) + return retval; + + if (!joydev->exist) + retval = -ENODEV; + else if (!joydev->open++) { + retval = input_open_device(&joydev->handle); + if (retval) + joydev->open--; + } + + mutex_unlock(&joydev->mutex); + return retval; +} + +static void joydev_close_device(struct joydev *joydev) +{ + mutex_lock(&joydev->mutex); + + if (joydev->exist && !--joydev->open) + input_close_device(&joydev->handle); + + mutex_unlock(&joydev->mutex); +} + +/* + * Wake up users waiting for IO so they can disconnect from + * dead device. + */ +static void joydev_hangup(struct joydev *joydev) +{ + struct joydev_client *client; + + spin_lock(&joydev->client_lock); + list_for_each_entry(client, &joydev->client_list, node) + kill_fasync(&client->fasync, SIGIO, POLL_HUP); + spin_unlock(&joydev->client_lock); + + wake_up_interruptible(&joydev->wait); +} + +static int joydev_release(struct inode *inode, struct file *file) +{ + struct joydev_client *client = file->private_data; + struct joydev *joydev = client->joydev; + + joydev_detach_client(joydev, client); + kfree(client); + + joydev_close_device(joydev); + + return 0; +} + +static int joydev_open(struct inode *inode, struct file *file) +{ + struct joydev *joydev = + container_of(inode->i_cdev, struct joydev, cdev); + struct joydev_client *client; + int error; + + client = kzalloc(sizeof(struct joydev_client), GFP_KERNEL); + if (!client) + return -ENOMEM; + + spin_lock_init(&client->buffer_lock); + client->joydev = joydev; + joydev_attach_client(joydev, client); + + error = joydev_open_device(joydev); + if (error) + goto err_free_client; + + file->private_data = client; + nonseekable_open(inode, file); + + return 0; + + err_free_client: + joydev_detach_client(joydev, client); + kfree(client); + return error; +} + +static int joydev_generate_startup_event(struct joydev_client *client, + struct input_dev *input, + struct js_event *event) +{ + struct joydev *joydev = client->joydev; + int have_event; + + spin_lock_irq(&client->buffer_lock); + + have_event = client->startup < joydev->nabs + joydev->nkey; + + if (have_event) { + + event->time = jiffies_to_msecs(jiffies); + if (client->startup < joydev->nkey) { + event->type = JS_EVENT_BUTTON | JS_EVENT_INIT; + event->number = client->startup; + event->value = !!test_bit(joydev->keypam[event->number], + input->key); + } else { + event->type = JS_EVENT_AXIS | JS_EVENT_INIT; + event->number = client->startup - joydev->nkey; + event->value = joydev->abs[event->number]; + } + client->startup++; + } + + spin_unlock_irq(&client->buffer_lock); + + return have_event; +} + +static int joydev_fetch_next_event(struct joydev_client *client, + struct js_event *event) +{ + int have_event; + + spin_lock_irq(&client->buffer_lock); + + have_event = client->head != client->tail; + if (have_event) { + *event = client->buffer[client->tail++]; + client->tail &= JOYDEV_BUFFER_SIZE - 1; + } + + spin_unlock_irq(&client->buffer_lock); + + return have_event; +} + +/* + * Old joystick interface + */ +static ssize_t joydev_0x_read(struct joydev_client *client, + struct input_dev *input, + char __user *buf) +{ + struct joydev *joydev = client->joydev; + struct JS_DATA_TYPE data; + int i; + + spin_lock_irq(&input->event_lock); + + /* + * Get device state + */ + for (data.buttons = i = 0; i < 32 && i < joydev->nkey; i++) + data.buttons |= + test_bit(joydev->keypam[i], input->key) ? (1 << i) : 0; + data.x = (joydev->abs[0] / 256 + 128) >> joydev->glue.JS_CORR.x; + data.y = (joydev->abs[1] / 256 + 128) >> joydev->glue.JS_CORR.y; + + /* + * Reset reader's event queue + */ + spin_lock(&client->buffer_lock); + client->startup = 0; + client->tail = client->head; + spin_unlock(&client->buffer_lock); + + spin_unlock_irq(&input->event_lock); + + if (copy_to_user(buf, &data, sizeof(struct JS_DATA_TYPE))) + return -EFAULT; + + return sizeof(struct JS_DATA_TYPE); +} + +static inline int joydev_data_pending(struct joydev_client *client) +{ + struct joydev *joydev = client->joydev; + + return client->startup < joydev->nabs + joydev->nkey || + client->head != client->tail; +} + +static ssize_t joydev_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) +{ + struct joydev_client *client = file->private_data; + struct joydev *joydev = client->joydev; + struct input_dev *input = joydev->handle.dev; + struct js_event event; + int retval; + + if (!joydev->exist) + return -ENODEV; + + if (count < sizeof(struct js_event)) + return -EINVAL; + + if (count == sizeof(struct JS_DATA_TYPE)) + return joydev_0x_read(client, input, buf); + + if (!joydev_data_pending(client) && (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + retval = wait_event_interruptible(joydev->wait, + !joydev->exist || joydev_data_pending(client)); + if (retval) + return retval; + + if (!joydev->exist) + return -ENODEV; + + while (retval + sizeof(struct js_event) <= count && + joydev_generate_startup_event(client, input, &event)) { + + if (copy_to_user(buf + retval, &event, sizeof(struct js_event))) + return -EFAULT; + + retval += sizeof(struct js_event); + } + + while (retval + sizeof(struct js_event) <= count && + joydev_fetch_next_event(client, &event)) { + + if (copy_to_user(buf + retval, &event, sizeof(struct js_event))) + return -EFAULT; + + retval += sizeof(struct js_event); + } + + return retval; +} + +/* No kernel lock - fine */ +static unsigned int joydev_poll(struct file *file, poll_table *wait) +{ + struct joydev_client *client = file->private_data; + struct joydev *joydev = client->joydev; + + poll_wait(file, &joydev->wait, wait); + return (joydev_data_pending(client) ? (POLLIN | POLLRDNORM) : 0) | + (joydev->exist ? 0 : (POLLHUP | POLLERR)); +} + +static int joydev_handle_JSIOCSAXMAP(struct joydev *joydev, + void __user *argp, size_t len) +{ + __u8 *abspam; + int i; + int retval = 0; + + len = min(len, sizeof(joydev->abspam)); + + /* Validate the map. */ + abspam = kmalloc(len, GFP_KERNEL); + if (!abspam) + return -ENOMEM; + + if (copy_from_user(abspam, argp, len)) { + retval = -EFAULT; + goto out; + } + + for (i = 0; i < joydev->nabs; i++) { + if (abspam[i] > ABS_MAX) { + retval = -EINVAL; + goto out; + } + } + + memcpy(joydev->abspam, abspam, len); + + for (i = 0; i < joydev->nabs; i++) + joydev->absmap[joydev->abspam[i]] = i; + + out: + kfree(abspam); + return retval; +} + +static int joydev_handle_JSIOCSBTNMAP(struct joydev *joydev, + void __user *argp, size_t len) +{ + __u16 *keypam; + int i; + int retval = 0; + + len = min(len, sizeof(joydev->keypam)); + + /* Validate the map. */ + keypam = kmalloc(len, GFP_KERNEL); + if (!keypam) + return -ENOMEM; + + if (copy_from_user(keypam, argp, len)) { + retval = -EFAULT; + goto out; + } + + for (i = 0; i < joydev->nkey; i++) { + if (keypam[i] > KEY_MAX || keypam[i] < BTN_MISC) { + retval = -EINVAL; + goto out; + } + } + + memcpy(joydev->keypam, keypam, len); + + for (i = 0; i < joydev->nkey; i++) + joydev->keymap[keypam[i] - BTN_MISC] = i; + + out: + kfree(keypam); + return retval; +} + + +static int joydev_ioctl_common(struct joydev *joydev, + unsigned int cmd, void __user *argp) +{ + struct input_dev *dev = joydev->handle.dev; + size_t len; + int i; + const char *name; + + /* Process fixed-sized commands. */ + switch (cmd) { + + case JS_SET_CAL: + return copy_from_user(&joydev->glue.JS_CORR, argp, + sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0; + + case JS_GET_CAL: + return copy_to_user(argp, &joydev->glue.JS_CORR, + sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0; + + case JS_SET_TIMEOUT: + return get_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp); + + case JS_GET_TIMEOUT: + return put_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp); + + case JSIOCGVERSION: + return put_user(JS_VERSION, (__u32 __user *) argp); + + case JSIOCGAXES: + return put_user(joydev->nabs, (__u8 __user *) argp); + + case JSIOCGBUTTONS: + return put_user(joydev->nkey, (__u8 __user *) argp); + + case JSIOCSCORR: + if (copy_from_user(joydev->corr, argp, + sizeof(joydev->corr[0]) * joydev->nabs)) + return -EFAULT; + + for (i = 0; i < joydev->nabs; i++) { + int val = input_abs_get_val(dev, joydev->abspam[i]); + joydev->abs[i] = joydev_correct(val, &joydev->corr[i]); + } + return 0; + + case JSIOCGCORR: + return copy_to_user(argp, joydev->corr, + sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0; + + } + + /* + * Process variable-sized commands (the axis and button map commands + * are considered variable-sized to decouple them from the values of + * ABS_MAX and KEY_MAX). + */ + switch (cmd & ~IOCSIZE_MASK) { + + case (JSIOCSAXMAP & ~IOCSIZE_MASK): + return joydev_handle_JSIOCSAXMAP(joydev, argp, _IOC_SIZE(cmd)); + + case (JSIOCGAXMAP & ~IOCSIZE_MASK): + len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->abspam)); + return copy_to_user(argp, joydev->abspam, len) ? -EFAULT : len; + + case (JSIOCSBTNMAP & ~IOCSIZE_MASK): + return joydev_handle_JSIOCSBTNMAP(joydev, argp, _IOC_SIZE(cmd)); + + case (JSIOCGBTNMAP & ~IOCSIZE_MASK): + len = min_t(size_t, _IOC_SIZE(cmd), sizeof(joydev->keypam)); + return copy_to_user(argp, joydev->keypam, len) ? -EFAULT : len; + + case JSIOCGNAME(0): + name = dev->name; + if (!name) + return 0; + + len = min_t(size_t, _IOC_SIZE(cmd), strlen(name) + 1); + return copy_to_user(argp, name, len) ? -EFAULT : len; + } + + return -EINVAL; +} + +#ifdef CONFIG_COMPAT +static long joydev_compat_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct joydev_client *client = file->private_data; + struct joydev *joydev = client->joydev; + void __user *argp = (void __user *)arg; + s32 tmp32; + struct JS_DATA_SAVE_TYPE_32 ds32; + int retval; + + retval = mutex_lock_interruptible(&joydev->mutex); + if (retval) + return retval; + + if (!joydev->exist) { + retval = -ENODEV; + goto out; + } + + switch (cmd) { + + case JS_SET_TIMELIMIT: + retval = get_user(tmp32, (s32 __user *) arg); + if (retval == 0) + joydev->glue.JS_TIMELIMIT = tmp32; + break; + + case JS_GET_TIMELIMIT: + tmp32 = joydev->glue.JS_TIMELIMIT; + retval = put_user(tmp32, (s32 __user *) arg); + break; + + case JS_SET_ALL: + retval = copy_from_user(&ds32, argp, + sizeof(ds32)) ? -EFAULT : 0; + if (retval == 0) { + joydev->glue.JS_TIMEOUT = ds32.JS_TIMEOUT; + joydev->glue.BUSY = ds32.BUSY; + joydev->glue.JS_EXPIRETIME = ds32.JS_EXPIRETIME; + joydev->glue.JS_TIMELIMIT = ds32.JS_TIMELIMIT; + joydev->glue.JS_SAVE = ds32.JS_SAVE; + joydev->glue.JS_CORR = ds32.JS_CORR; + } + break; + + case JS_GET_ALL: + ds32.JS_TIMEOUT = joydev->glue.JS_TIMEOUT; + ds32.BUSY = joydev->glue.BUSY; + ds32.JS_EXPIRETIME = joydev->glue.JS_EXPIRETIME; + ds32.JS_TIMELIMIT = joydev->glue.JS_TIMELIMIT; + ds32.JS_SAVE = joydev->glue.JS_SAVE; + ds32.JS_CORR = joydev->glue.JS_CORR; + + retval = copy_to_user(argp, &ds32, sizeof(ds32)) ? -EFAULT : 0; + break; + + default: + retval = joydev_ioctl_common(joydev, cmd, argp); + break; + } + + out: + mutex_unlock(&joydev->mutex); + return retval; +} +#endif /* CONFIG_COMPAT */ + +static long joydev_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + struct joydev_client *client = file->private_data; + struct joydev *joydev = client->joydev; + void __user *argp = (void __user *)arg; + int retval; + + retval = mutex_lock_interruptible(&joydev->mutex); + if (retval) + return retval; + + if (!joydev->exist) { + retval = -ENODEV; + goto out; + } + + switch (cmd) { + + case JS_SET_TIMELIMIT: + retval = get_user(joydev->glue.JS_TIMELIMIT, + (long __user *) arg); + break; + + case JS_GET_TIMELIMIT: + retval = put_user(joydev->glue.JS_TIMELIMIT, + (long __user *) arg); + break; + + case JS_SET_ALL: + retval = copy_from_user(&joydev->glue, argp, + sizeof(joydev->glue)) ? -EFAULT : 0; + break; + + case JS_GET_ALL: + retval = copy_to_user(argp, &joydev->glue, + sizeof(joydev->glue)) ? -EFAULT : 0; + break; + + default: + retval = joydev_ioctl_common(joydev, cmd, argp); + break; + } + out: + mutex_unlock(&joydev->mutex); + return retval; +} + +static const struct file_operations joydev_fops = { + .owner = THIS_MODULE, + .read = joydev_read, + .poll = joydev_poll, + .open = joydev_open, + .release = joydev_release, + .unlocked_ioctl = joydev_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = joydev_compat_ioctl, +#endif + .fasync = joydev_fasync, + .llseek = no_llseek, +}; + +/* + * Mark device non-existent. This disables writes, ioctls and + * prevents new users from opening the device. Already posted + * blocking reads will stay, however new ones will fail. + */ +static void joydev_mark_dead(struct joydev *joydev) +{ + mutex_lock(&joydev->mutex); + joydev->exist = false; + mutex_unlock(&joydev->mutex); +} + +static void joydev_cleanup(struct joydev *joydev) +{ + struct input_handle *handle = &joydev->handle; + + joydev_mark_dead(joydev); + joydev_hangup(joydev); + + cdev_del(&joydev->cdev); + + /* joydev is marked dead so no one else accesses joydev->open */ + if (joydev->open) + input_close_device(handle); +} + + +static bool joydev_match(struct input_handler *handler, struct input_dev *dev) +{ + /* Avoid touchpads and touchscreens */ + if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit)) + return false; + + /* Avoid tablets, digitisers and similar devices */ + if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_DIGI, dev->keybit)) + return false; + + return true; +} + +static int joydev_connect(struct input_handler *handler, struct input_dev *dev, + const struct input_device_id *id) +{ + struct joydev *joydev; + int i, j, t, minor, dev_no; + int error; + + minor = input_get_new_minor(JOYDEV_MINOR_BASE, JOYDEV_MINORS, true); + if (minor < 0) { + error = minor; + pr_err("failed to reserve new minor: %d\n", error); + return error; + } + + joydev = kzalloc(sizeof(struct joydev), GFP_KERNEL); + if (!joydev) { + error = -ENOMEM; + goto err_free_minor; + } + + INIT_LIST_HEAD(&joydev->client_list); + spin_lock_init(&joydev->client_lock); + mutex_init(&joydev->mutex); + init_waitqueue_head(&joydev->wait); + joydev->exist = true; + + dev_no = minor; + /* Normalize device number if it falls into legacy range */ + if (dev_no < JOYDEV_MINOR_BASE + JOYDEV_MINORS) + dev_no -= JOYDEV_MINOR_BASE; + dev_set_name(&joydev->dev, "js%d", dev_no); + + joydev->handle.dev = input_get_device(dev); + joydev->handle.name = dev_name(&joydev->dev); + joydev->handle.handler = handler; + joydev->handle.private = joydev; + + for (i = 0; i < ABS_CNT; i++) + if (test_bit(i, dev->absbit)) { + joydev->absmap[i] = joydev->nabs; + joydev->abspam[joydev->nabs] = i; + joydev->nabs++; + } + + for (i = BTN_JOYSTICK - BTN_MISC; i < KEY_MAX - BTN_MISC + 1; i++) + if (test_bit(i + BTN_MISC, dev->keybit)) { + joydev->keymap[i] = joydev->nkey; + joydev->keypam[joydev->nkey] = i + BTN_MISC; + joydev->nkey++; + } + + for (i = 0; i < BTN_JOYSTICK - BTN_MISC; i++) + if (test_bit(i + BTN_MISC, dev->keybit)) { + joydev->keymap[i] = joydev->nkey; + joydev->keypam[joydev->nkey] = i + BTN_MISC; + joydev->nkey++; + } + + for (i = 0; i < joydev->nabs; i++) { + j = joydev->abspam[i]; + if (input_abs_get_max(dev, j) == input_abs_get_min(dev, j)) { + joydev->corr[i].type = JS_CORR_NONE; + joydev->abs[i] = input_abs_get_val(dev, j); + continue; + } + joydev->corr[i].type = JS_CORR_BROKEN; + joydev->corr[i].prec = input_abs_get_fuzz(dev, j); + + t = (input_abs_get_max(dev, j) + input_abs_get_min(dev, j)) / 2; + joydev->corr[i].coef[0] = t - input_abs_get_flat(dev, j); + joydev->corr[i].coef[1] = t + input_abs_get_flat(dev, j); + + t = (input_abs_get_max(dev, j) - input_abs_get_min(dev, j)) / 2 + - 2 * input_abs_get_flat(dev, j); + if (t) { + joydev->corr[i].coef[2] = (1 << 29) / t; + joydev->corr[i].coef[3] = (1 << 29) / t; + + joydev->abs[i] = + joydev_correct(input_abs_get_val(dev, j), + joydev->corr + i); + } + } + + joydev->dev.devt = MKDEV(INPUT_MAJOR, minor); + joydev->dev.class = &input_class; + joydev->dev.parent = &dev->dev; + joydev->dev.release = joydev_free; + device_initialize(&joydev->dev); + + error = input_register_handle(&joydev->handle); + if (error) + goto err_free_joydev; + + cdev_init(&joydev->cdev, &joydev_fops); + joydev->cdev.kobj.parent = &joydev->dev.kobj; + error = cdev_add(&joydev->cdev, joydev->dev.devt, 1); + if (error) + goto err_unregister_handle; + + error = device_add(&joydev->dev); + if (error) + goto err_cleanup_joydev; + + return 0; + + err_cleanup_joydev: + joydev_cleanup(joydev); + err_unregister_handle: + input_unregister_handle(&joydev->handle); + err_free_joydev: + put_device(&joydev->dev); + err_free_minor: + input_free_minor(minor); + return error; +} + +static void joydev_disconnect(struct input_handle *handle) +{ + struct joydev *joydev = handle->private; + + device_del(&joydev->dev); + joydev_cleanup(joydev); + input_free_minor(MINOR(joydev->dev.devt)); + input_unregister_handle(handle); + put_device(&joydev->dev); +} + +static const struct input_device_id joydev_ids[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_ABSBIT, + .evbit = { BIT_MASK(EV_ABS) }, + .absbit = { BIT_MASK(ABS_X) }, + }, + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_ABSBIT, + .evbit = { BIT_MASK(EV_ABS) }, + .absbit = { BIT_MASK(ABS_WHEEL) }, + }, + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_ABSBIT, + .evbit = { BIT_MASK(EV_ABS) }, + .absbit = { BIT_MASK(ABS_THROTTLE) }, + }, + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT, + .evbit = { BIT_MASK(EV_KEY) }, + .keybit = {[BIT_WORD(BTN_JOYSTICK)] = BIT_MASK(BTN_JOYSTICK) }, + }, + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT, + .evbit = { BIT_MASK(EV_KEY) }, + .keybit = { [BIT_WORD(BTN_GAMEPAD)] = BIT_MASK(BTN_GAMEPAD) }, + }, + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT, + .evbit = { BIT_MASK(EV_KEY) }, + .keybit = { [BIT_WORD(BTN_TRIGGER_HAPPY)] = BIT_MASK(BTN_TRIGGER_HAPPY) }, + }, + { } /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE(input, joydev_ids); + +static struct input_handler joydev_handler = { + .event = joydev_event, + .match = joydev_match, + .connect = joydev_connect, + .disconnect = joydev_disconnect, + .legacy_minors = true, + .minor = JOYDEV_MINOR_BASE, + .name = "joydev", + .id_table = joydev_ids, +}; + +static int __init joydev_init(void) +{ + return input_register_handler(&joydev_handler); +} + +static void __exit joydev_exit(void) +{ + input_unregister_handler(&joydev_handler); +} + +module_init(joydev_init); +module_exit(joydev_exit); diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig new file mode 100644 index 00000000..56eb471b --- /dev/null +++ b/drivers/input/joystick/Kconfig @@ -0,0 +1,332 @@ +# +# Joystick driver configuration +# +menuconfig INPUT_JOYSTICK + bool "Joysticks/Gamepads" + help + If you have a joystick, 6dof controller, gamepad, steering wheel, + weapon control system or something like that you can say Y here + and the list of supported devices will be displayed. This option + doesn't affect the kernel. + + Please read the file which + contains more information. + +if INPUT_JOYSTICK + +config JOYSTICK_ANALOG + tristate "Classic PC analog joysticks and gamepads" + select GAMEPORT + ---help--- + Say Y here if you have a joystick that connects to the PC + gameport. In addition to the usual PC analog joystick, this driver + supports many extensions, including joysticks with throttle control, + with rudders, additional hats and buttons compatible with CH + Flightstick Pro, ThrustMaster FCS, 6 and 8 button gamepads, or + Saitek Cyborg joysticks. + + Please read the file which + contains more information. + + To compile this driver as a module, choose M here: the + module will be called analog. + +config JOYSTICK_A3D + tristate "Assassin 3D and MadCatz Panther devices" + select GAMEPORT + help + Say Y here if you have an FPGaming or MadCatz controller using the + A3D protocol over the PC gameport. + + To compile this driver as a module, choose M here: the + module will be called a3d. + +config JOYSTICK_ADI + tristate "Logitech ADI digital joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have a Logitech controller using the ADI + protocol over the PC gameport. + + To compile this driver as a module, choose M here: the + module will be called adi. + +config JOYSTICK_COBRA + tristate "Creative Labs Blaster Cobra gamepad" + select GAMEPORT + help + Say Y here if you have a Creative Labs Blaster Cobra gamepad. + + To compile this driver as a module, choose M here: the + module will be called cobra. + +config JOYSTICK_GF2K + tristate "Genius Flight2000 Digital joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have a Genius Flight2000 or MaxFighter digitally + communicating joystick or gamepad. + + To compile this driver as a module, choose M here: the + module will be called gf2k. + +config JOYSTICK_GRIP + tristate "Gravis GrIP joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have a Gravis controller using the GrIP protocol + over the PC gameport. + + To compile this driver as a module, choose M here: the + module will be called grip. + +config JOYSTICK_GRIP_MP + tristate "Gravis GrIP MultiPort" + select GAMEPORT + help + Say Y here if you have the original Gravis GrIP MultiPort, a hub + that connects to the gameport and you connect gamepads to it. + + To compile this driver as a module, choose M here: the + module will be called grip_mp. + +config JOYSTICK_GUILLEMOT + tristate "Guillemot joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have a Guillemot joystick using a digital + protocol over the PC gameport. + + To compile this driver as a module, choose M here: the + module will be called guillemot. + +config JOYSTICK_INTERACT + tristate "InterAct digital joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have an InterAct gameport or joystick + communicating digitally over the gameport. + + To compile this driver as a module, choose M here: the + module will be called interact. + +config JOYSTICK_SIDEWINDER + tristate "Microsoft SideWinder digital joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have a Microsoft controller using the Digital + Overdrive protocol over PC gameport. + + To compile this driver as a module, choose M here: the + module will be called sidewinder. + +config JOYSTICK_TMDC + tristate "ThrustMaster DirectConnect joysticks and gamepads" + select GAMEPORT + help + Say Y here if you have a ThrustMaster controller using the + DirectConnect (BSP) protocol over the PC gameport. + + To compile this driver as a module, choose M here: the + module will be called tmdc. + +source "drivers/input/joystick/iforce/Kconfig" + +config JOYSTICK_WARRIOR + tristate "Logitech WingMan Warrior joystick" + select SERIO + help + Say Y here if you have a Logitech WingMan Warrior joystick connected + to your computer's serial port. + + To compile this driver as a module, choose M here: the + module will be called warrior. + +config JOYSTICK_MAGELLAN + tristate "LogiCad3d Magellan/SpaceMouse 6dof controllers" + select SERIO + help + Say Y here if you have a Magellan or Space Mouse 6DOF controller + connected to your computer's serial port. + + To compile this driver as a module, choose M here: the + module will be called magellan. + +config JOYSTICK_SPACEORB + tristate "SpaceTec SpaceOrb/Avenger 6dof controllers" + select SERIO + help + Say Y here if you have a SpaceOrb 360 or SpaceBall Avenger 6DOF + controller connected to your computer's serial port. + + To compile this driver as a module, choose M here: the + module will be called spaceorb. + +config JOYSTICK_SPACEBALL + tristate "SpaceTec SpaceBall 6dof controllers" + select SERIO + help + Say Y here if you have a SpaceTec SpaceBall 2003/3003/4000 FLX + controller connected to your computer's serial port. For the + SpaceBall 4000 USB model, use the USB HID driver. + + To compile this driver as a module, choose M here: the + module will be called spaceball. + +config JOYSTICK_STINGER + tristate "Gravis Stinger gamepad" + select SERIO + help + Say Y here if you have a Gravis Stinger connected to one of your + serial ports. + + To compile this driver as a module, choose M here: the + module will be called stinger. + +config JOYSTICK_TWIDJOY + tristate "Twiddler as a joystick" + select SERIO + help + Say Y here if you have a Handykey Twiddler connected to your + computer's serial port and want to use it as a joystick. + + To compile this driver as a module, choose M here: the + module will be called twidjoy. + +config JOYSTICK_ZHENHUA + tristate "5-byte Zhenhua RC transmitter" + select SERIO + help + Say Y here if you have a Zhen Hua PPM-4CH transmitter which is + supplied with a ready to fly micro electric indoor helicopters + such as EasyCopter, Lama, MiniCopter, DragonFly or Jabo and want + to use it via serial cable as a joystick. + + To compile this driver as a module, choose M here: the + module will be called zhenhua. + +config JOYSTICK_DB9 + tristate "Multisystem, Sega Genesis, Saturn joysticks and gamepads" + depends on PARPORT + help + Say Y here if you have a Sega Master System gamepad, Sega Genesis + gamepad, Sega Saturn gamepad, or a Multisystem -- Atari, Amiga, + Commodore, Amstrad CPC joystick connected to your parallel port. + For more information on how to use the driver please read + . + + To compile this driver as a module, choose M here: the + module will be called db9. + +config JOYSTICK_GAMECON + tristate "Multisystem, NES, SNES, N64, PSX joysticks and gamepads" + depends on PARPORT + select INPUT_FF_MEMLESS + ---help--- + Say Y here if you have a Nintendo Entertainment System gamepad, + Super Nintendo Entertainment System gamepad, Nintendo 64 gamepad, + Sony PlayStation gamepad or a Multisystem -- Atari, Amiga, + Commodore, Amstrad CPC joystick connected to your parallel port. + For more information on how to use the driver please read + . + + To compile this driver as a module, choose M here: the + module will be called gamecon. + +config JOYSTICK_TURBOGRAFX + tristate "Multisystem joysticks via TurboGraFX device" + depends on PARPORT + help + Say Y here if you have the TurboGraFX interface by Steffen Schwenke, + and want to use it with Multisystem -- Atari, Amiga, Commodore, + Amstrad CPC joystick. For more information on how to use the driver + please read . + + To compile this driver as a module, choose M here: the + module will be called turbografx. + +config JOYSTICK_AMIGA + tristate "Amiga joysticks" + depends on AMIGA + help + Say Y here if you have an Amiga with a digital joystick connected + to it. + + To compile this driver as a module, choose M here: the + module will be called amijoy. + +config JOYSTICK_AS5011 + tristate "Austria Microsystem AS5011 joystick" + depends on I2C + help + Say Y here if you have an AS5011 digital joystick connected to your + system. + + To compile this driver as a module, choose M here: the + module will be called as5011. + +config JOYSTICK_JOYDUMP + tristate "Gameport data dumper" + select GAMEPORT + help + Say Y here if you want to dump data from your joystick into the system + log for debugging purposes. Say N if you are making a production + configuration or aren't sure. + + To compile this driver as a module, choose M here: the + module will be called joydump. + +config JOYSTICK_XPAD + tristate "X-Box gamepad support" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use the X-Box pad with your computer. + Make sure to say Y to "Joystick support" (CONFIG_INPUT_JOYDEV) + and/or "Event interface support" (CONFIG_INPUT_EVDEV) as well. + + For information about how to connect the X-Box pad to USB, see + . + + To compile this driver as a module, choose M here: the + module will be called xpad. + +config JOYSTICK_XPAD_FF + bool "X-Box gamepad rumble support" + depends on JOYSTICK_XPAD && INPUT + select INPUT_FF_MEMLESS + ---help--- + Say Y here if you want to take advantage of xbox 360 rumble features. + +config JOYSTICK_XPAD_LEDS + bool "LED Support for Xbox360 controller 'BigX' LED" + depends on JOYSTICK_XPAD && (LEDS_CLASS=y || LEDS_CLASS=JOYSTICK_XPAD) + ---help--- + This option enables support for the LED which surrounds the Big X on + XBox 360 controller. + +config JOYSTICK_WALKERA0701 + tristate "Walkera WK-0701 RC transmitter" + depends on HIGH_RES_TIMERS && PARPORT + help + Say Y or M here if you have a Walkera WK-0701 transmitter which is + supplied with a ready to fly Walkera helicopters such as HM36, + HM37, HM60 and want to use it via parport as a joystick. More + information is available: + + To compile this driver as a module, choose M here: the + module will be called walkera0701. + +config JOYSTICK_MAPLE + tristate "Dreamcast control pad" + depends on MAPLE + help + Say Y here if you have a SEGA Dreamcast and want to use your + controller as a joystick. + + Most Dreamcast users will say Y. + + To compile this as a module choose M here: the module will be called + maplecontrol. + +endif diff --git a/drivers/input/joystick/Makefile b/drivers/input/joystick/Makefile new file mode 100644 index 00000000..92dc0de9 --- /dev/null +++ b/drivers/input/joystick/Makefile @@ -0,0 +1,35 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_JOYSTICK_A3D) += a3d.o +obj-$(CONFIG_JOYSTICK_ADI) += adi.o +obj-$(CONFIG_JOYSTICK_AMIGA) += amijoy.o +obj-$(CONFIG_JOYSTICK_AS5011) += as5011.o +obj-$(CONFIG_JOYSTICK_ANALOG) += analog.o +obj-$(CONFIG_JOYSTICK_COBRA) += cobra.o +obj-$(CONFIG_JOYSTICK_DB9) += db9.o +obj-$(CONFIG_JOYSTICK_GAMECON) += gamecon.o +obj-$(CONFIG_JOYSTICK_GF2K) += gf2k.o +obj-$(CONFIG_JOYSTICK_GRIP) += grip.o +obj-$(CONFIG_JOYSTICK_GRIP_MP) += grip_mp.o +obj-$(CONFIG_JOYSTICK_GUILLEMOT) += guillemot.o +obj-$(CONFIG_JOYSTICK_IFORCE) += iforce/ +obj-$(CONFIG_JOYSTICK_INTERACT) += interact.o +obj-$(CONFIG_JOYSTICK_JOYDUMP) += joydump.o +obj-$(CONFIG_JOYSTICK_MAGELLAN) += magellan.o +obj-$(CONFIG_JOYSTICK_MAPLE) += maplecontrol.o +obj-$(CONFIG_JOYSTICK_SIDEWINDER) += sidewinder.o +obj-$(CONFIG_JOYSTICK_SPACEBALL) += spaceball.o +obj-$(CONFIG_JOYSTICK_SPACEORB) += spaceorb.o +obj-$(CONFIG_JOYSTICK_STINGER) += stinger.o +obj-$(CONFIG_JOYSTICK_TMDC) += tmdc.o +obj-$(CONFIG_JOYSTICK_TURBOGRAFX) += turbografx.o +obj-$(CONFIG_JOYSTICK_TWIDJOY) += twidjoy.o +obj-$(CONFIG_JOYSTICK_WARRIOR) += warrior.o +obj-$(CONFIG_JOYSTICK_XPAD) += xpad.o +obj-$(CONFIG_JOYSTICK_ZHENHUA) += zhenhua.o +obj-$(CONFIG_JOYSTICK_WALKERA0701) += walkera0701.o + diff --git a/drivers/input/joystick/a3d.c b/drivers/input/joystick/a3d.c new file mode 100644 index 00000000..85bc8dc0 --- /dev/null +++ b/drivers/input/joystick/a3d.c @@ -0,0 +1,416 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + */ + +/* + * FP-Gaming Assassin 3D joystick driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "FP-Gaming Assassin 3D joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define A3D_MAX_START 600 /* 600 us */ +#define A3D_MAX_STROBE 80 /* 80 us */ +#define A3D_MAX_LENGTH 40 /* 40*3 bits */ + +#define A3D_MODE_A3D 1 /* Assassin 3D */ +#define A3D_MODE_PAN 2 /* Panther */ +#define A3D_MODE_OEM 3 /* Panther OEM version */ +#define A3D_MODE_PXL 4 /* Panther XL */ + +static char *a3d_names[] = { NULL, "FP-Gaming Assassin 3D", "MadCatz Panther", "OEM Panther", + "MadCatz Panther XL", "MadCatz Panther XL w/ rudder" }; + +struct a3d { + struct gameport *gameport; + struct gameport *adc; + struct input_dev *dev; + int axes[4]; + int buttons; + int mode; + int length; + int reads; + int bads; + char phys[32]; +}; + +/* + * a3d_read_packet() reads an Assassin 3D packet. + */ + +static int a3d_read_packet(struct gameport *gameport, int length, char *data) +{ + unsigned long flags; + unsigned char u, v; + unsigned int t, s; + int i; + + i = 0; + t = gameport_time(gameport, A3D_MAX_START); + s = gameport_time(gameport, A3D_MAX_STROBE); + + local_irq_save(flags); + gameport_trigger(gameport); + v = gameport_read(gameport); + + while (t > 0 && i < length) { + t--; + u = v; v = gameport_read(gameport); + if (~v & u & 0x10) { + data[i++] = v >> 5; + t = s; + } + } + + local_irq_restore(flags); + + return i; +} + +/* + * a3d_csum() computes checksum of triplet packet + */ + +static int a3d_csum(char *data, int count) +{ + int i, csum = 0; + + for (i = 0; i < count - 2; i++) + csum += data[i]; + return (csum & 0x3f) != ((data[count - 2] << 3) | data[count - 1]); +} + +static void a3d_read(struct a3d *a3d, unsigned char *data) +{ + struct input_dev *dev = a3d->dev; + + switch (a3d->mode) { + + case A3D_MODE_A3D: + case A3D_MODE_OEM: + case A3D_MODE_PAN: + + input_report_rel(dev, REL_X, ((data[5] << 6) | (data[6] << 3) | data[ 7]) - ((data[5] & 4) << 7)); + input_report_rel(dev, REL_Y, ((data[8] << 6) | (data[9] << 3) | data[10]) - ((data[8] & 4) << 7)); + + input_report_key(dev, BTN_RIGHT, data[2] & 1); + input_report_key(dev, BTN_LEFT, data[3] & 2); + input_report_key(dev, BTN_MIDDLE, data[3] & 4); + + input_sync(dev); + + a3d->axes[0] = ((signed char)((data[11] << 6) | (data[12] << 3) | (data[13]))) + 128; + a3d->axes[1] = ((signed char)((data[14] << 6) | (data[15] << 3) | (data[16]))) + 128; + a3d->axes[2] = ((signed char)((data[17] << 6) | (data[18] << 3) | (data[19]))) + 128; + a3d->axes[3] = ((signed char)((data[20] << 6) | (data[21] << 3) | (data[22]))) + 128; + + a3d->buttons = ((data[3] << 3) | data[4]) & 0xf; + + break; + + case A3D_MODE_PXL: + + input_report_rel(dev, REL_X, ((data[ 9] << 6) | (data[10] << 3) | data[11]) - ((data[ 9] & 4) << 7)); + input_report_rel(dev, REL_Y, ((data[12] << 6) | (data[13] << 3) | data[14]) - ((data[12] & 4) << 7)); + + input_report_key(dev, BTN_RIGHT, data[2] & 1); + input_report_key(dev, BTN_LEFT, data[3] & 2); + input_report_key(dev, BTN_MIDDLE, data[3] & 4); + input_report_key(dev, BTN_SIDE, data[7] & 2); + input_report_key(dev, BTN_EXTRA, data[7] & 4); + + input_report_abs(dev, ABS_X, ((signed char)((data[15] << 6) | (data[16] << 3) | (data[17]))) + 128); + input_report_abs(dev, ABS_Y, ((signed char)((data[18] << 6) | (data[19] << 3) | (data[20]))) + 128); + input_report_abs(dev, ABS_RUDDER, ((signed char)((data[21] << 6) | (data[22] << 3) | (data[23]))) + 128); + input_report_abs(dev, ABS_THROTTLE, ((signed char)((data[24] << 6) | (data[25] << 3) | (data[26]))) + 128); + + input_report_abs(dev, ABS_HAT0X, ( data[5] & 1) - ((data[5] >> 2) & 1)); + input_report_abs(dev, ABS_HAT0Y, ((data[5] >> 1) & 1) - ((data[6] >> 2) & 1)); + input_report_abs(dev, ABS_HAT1X, ((data[4] >> 1) & 1) - ( data[3] & 1)); + input_report_abs(dev, ABS_HAT1Y, ((data[4] >> 2) & 1) - ( data[4] & 1)); + + input_report_key(dev, BTN_TRIGGER, data[8] & 1); + input_report_key(dev, BTN_THUMB, data[8] & 2); + input_report_key(dev, BTN_TOP, data[8] & 4); + input_report_key(dev, BTN_PINKIE, data[7] & 1); + + input_sync(dev); + + break; + } +} + + +/* + * a3d_poll() reads and analyzes A3D joystick data. + */ + +static void a3d_poll(struct gameport *gameport) +{ + struct a3d *a3d = gameport_get_drvdata(gameport); + unsigned char data[A3D_MAX_LENGTH]; + + a3d->reads++; + if (a3d_read_packet(a3d->gameport, a3d->length, data) != a3d->length || + data[0] != a3d->mode || a3d_csum(data, a3d->length)) + a3d->bads++; + else + a3d_read(a3d, data); +} + +/* + * a3d_adc_cooked_read() copies the acis and button data to the + * callers arrays. It could do the read itself, but the caller could + * call this more than 50 times a second, which would use too much CPU. + */ + +static int a3d_adc_cooked_read(struct gameport *gameport, int *axes, int *buttons) +{ + struct a3d *a3d = gameport->port_data; + int i; + + for (i = 0; i < 4; i++) + axes[i] = (a3d->axes[i] < 254) ? a3d->axes[i] : -1; + *buttons = a3d->buttons; + return 0; +} + +/* + * a3d_adc_open() is the gameport open routine. It refuses to serve + * any but cooked data. + */ + +static int a3d_adc_open(struct gameport *gameport, int mode) +{ + struct a3d *a3d = gameport->port_data; + + if (mode != GAMEPORT_MODE_COOKED) + return -1; + + gameport_start_polling(a3d->gameport); + return 0; +} + +/* + * a3d_adc_close() is a callback from the input close routine. + */ + +static void a3d_adc_close(struct gameport *gameport) +{ + struct a3d *a3d = gameport->port_data; + + gameport_stop_polling(a3d->gameport); +} + +/* + * a3d_open() is a callback from the input open routine. + */ + +static int a3d_open(struct input_dev *dev) +{ + struct a3d *a3d = input_get_drvdata(dev); + + gameport_start_polling(a3d->gameport); + return 0; +} + +/* + * a3d_close() is a callback from the input close routine. + */ + +static void a3d_close(struct input_dev *dev) +{ + struct a3d *a3d = input_get_drvdata(dev); + + gameport_stop_polling(a3d->gameport); +} + +/* + * a3d_connect() probes for A3D joysticks. + */ + +static int a3d_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct a3d *a3d; + struct input_dev *input_dev; + struct gameport *adc; + unsigned char data[A3D_MAX_LENGTH]; + int i; + int err; + + a3d = kzalloc(sizeof(struct a3d), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!a3d || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + a3d->dev = input_dev; + a3d->gameport = gameport; + + gameport_set_drvdata(gameport, a3d); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + i = a3d_read_packet(gameport, A3D_MAX_LENGTH, data); + + if (!i || a3d_csum(data, i)) { + err = -ENODEV; + goto fail2; + } + + a3d->mode = data[0]; + + if (!a3d->mode || a3d->mode > 5) { + printk(KERN_WARNING "a3d.c: Unknown A3D device detected " + "(%s, id=%d), contact \n", gameport->phys, a3d->mode); + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, a3d_poll); + gameport_set_poll_interval(gameport, 20); + + snprintf(a3d->phys, sizeof(a3d->phys), "%s/input0", gameport->phys); + + input_dev->name = a3d_names[a3d->mode]; + input_dev->phys = a3d->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_MADCATZ; + input_dev->id.product = a3d->mode; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &gameport->dev; + input_dev->open = a3d_open; + input_dev->close = a3d_close; + + input_set_drvdata(input_dev, a3d); + + if (a3d->mode == A3D_MODE_PXL) { + + int axes[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER }; + + a3d->length = 33; + + input_dev->evbit[0] |= BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY) | + BIT_MASK(EV_REL); + input_dev->relbit[0] |= BIT_MASK(REL_X) | BIT_MASK(REL_Y); + input_dev->absbit[0] |= BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | + BIT_MASK(ABS_THROTTLE) | BIT_MASK(ABS_RUDDER) | + BIT_MASK(ABS_HAT0X) | BIT_MASK(ABS_HAT0Y) | + BIT_MASK(ABS_HAT1X) | BIT_MASK(ABS_HAT1Y); + input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_RIGHT) | + BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_MIDDLE) | + BIT_MASK(BTN_SIDE) | BIT_MASK(BTN_EXTRA); + input_dev->keybit[BIT_WORD(BTN_JOYSTICK)] |= + BIT_MASK(BTN_TRIGGER) | BIT_MASK(BTN_THUMB) | + BIT_MASK(BTN_TOP) | BIT_MASK(BTN_PINKIE); + + a3d_read(a3d, data); + + for (i = 0; i < 4; i++) { + if (i < 2) + input_set_abs_params(input_dev, axes[i], + 48, input_abs_get_val(input_dev, axes[i]) * 2 - 48, 0, 8); + else + input_set_abs_params(input_dev, axes[i], 2, 253, 0, 0); + input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); + } + + } else { + a3d->length = 29; + + input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + input_dev->relbit[0] |= BIT_MASK(REL_X) | BIT_MASK(REL_Y); + input_dev->keybit[BIT_WORD(BTN_MOUSE)] |= BIT_MASK(BTN_RIGHT) | + BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_MIDDLE); + + a3d_read(a3d, data); + + if (!(a3d->adc = adc = gameport_allocate_port())) + printk(KERN_ERR "a3d: Not enough memory for ADC port\n"); + else { + adc->port_data = a3d; + adc->open = a3d_adc_open; + adc->close = a3d_adc_close; + adc->cooked_read = a3d_adc_cooked_read; + adc->fuzz = 1; + + gameport_set_name(adc, a3d_names[a3d->mode]); + gameport_set_phys(adc, "%s/gameport0", gameport->phys); + adc->dev.parent = &gameport->dev; + + gameport_register_port(adc); + } + } + + err = input_register_device(a3d->dev); + if (err) + goto fail3; + + return 0; + + fail3: if (a3d->adc) + gameport_unregister_port(a3d->adc); + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + input_free_device(input_dev); + kfree(a3d); + return err; +} + +static void a3d_disconnect(struct gameport *gameport) +{ + struct a3d *a3d = gameport_get_drvdata(gameport); + + input_unregister_device(a3d->dev); + if (a3d->adc) + gameport_unregister_port(a3d->adc); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(a3d); +} + +static struct gameport_driver a3d_drv = { + .driver = { + .name = "adc", + .owner = THIS_MODULE, + }, + .description = DRIVER_DESC, + .connect = a3d_connect, + .disconnect = a3d_disconnect, +}; + +module_gameport_driver(a3d_drv); diff --git a/drivers/input/joystick/adi.c b/drivers/input/joystick/adi.c new file mode 100644 index 00000000..0cbfd2df --- /dev/null +++ b/drivers/input/joystick/adi.c @@ -0,0 +1,569 @@ +/* + * Copyright (c) 1998-2005 Vojtech Pavlik + */ + +/* + * Logitech ADI joystick family driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Logitech ADI joystick family driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Times, array sizes, flags, ids. + */ + +#define ADI_MAX_START 200 /* Trigger to packet timeout [200us] */ +#define ADI_MAX_STROBE 40 /* Single bit timeout [40us] */ +#define ADI_INIT_DELAY 10 /* Delay after init packet [10ms] */ +#define ADI_DATA_DELAY 4 /* Delay after data packet [4ms] */ + +#define ADI_MAX_LENGTH 256 +#define ADI_MIN_LENGTH 8 +#define ADI_MIN_LEN_LENGTH 10 +#define ADI_MIN_ID_LENGTH 66 +#define ADI_MAX_NAME_LENGTH 64 +#define ADI_MAX_CNAME_LENGTH 16 +#define ADI_MAX_PHYS_LENGTH 64 + +#define ADI_FLAG_HAT 0x04 +#define ADI_FLAG_10BIT 0x08 + +#define ADI_ID_TPD 0x01 +#define ADI_ID_WGP 0x06 +#define ADI_ID_WGPE 0x08 +#define ADI_ID_MAX 0x0a + +/* + * Names, buttons, axes ... + */ + +static char *adi_names[] = { "WingMan Extreme Digital", "ThunderPad Digital", "SideCar", "CyberMan 2", + "WingMan Interceptor", "WingMan Formula", "WingMan GamePad", + "WingMan Extreme Digital 3D", "WingMan GamePad Extreme", + "WingMan GamePad USB", "Unknown Device %#x" }; + +static char adi_wmgpe_abs[] = { ABS_X, ABS_Y, ABS_HAT0X, ABS_HAT0Y }; +static char adi_wmi_abs[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y, ABS_HAT2X, ABS_HAT2Y }; +static char adi_wmed3d_abs[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RZ, ABS_HAT0X, ABS_HAT0Y }; +static char adi_cm2_abs[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; +static char adi_wmf_abs[] = { ABS_WHEEL, ABS_GAS, ABS_BRAKE, ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y, ABS_HAT2X, ABS_HAT2Y }; + +static short adi_wmgpe_key[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_START, BTN_MODE, BTN_SELECT }; +static short adi_wmi_key[] = { BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_EXTRA }; +static short adi_wmed3d_key[] = { BTN_TRIGGER, BTN_THUMB, BTN_THUMB2, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2 }; +static short adi_cm2_key[] = { BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8 }; + +static char* adi_abs[] = { adi_wmi_abs, adi_wmgpe_abs, adi_wmf_abs, adi_cm2_abs, adi_wmi_abs, adi_wmf_abs, + adi_wmgpe_abs, adi_wmed3d_abs, adi_wmgpe_abs, adi_wmgpe_abs, adi_wmi_abs }; + +static short* adi_key[] = { adi_wmi_key, adi_wmgpe_key, adi_cm2_key, adi_cm2_key, adi_wmi_key, adi_cm2_key, + adi_wmgpe_key, adi_wmed3d_key, adi_wmgpe_key, adi_wmgpe_key, adi_wmi_key }; + +/* + * Hat to axis conversion arrays. + */ + +static struct { + int x; + int y; +} adi_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; + +/* + * Per-port information. + */ + +struct adi { + struct input_dev *dev; + int length; + int ret; + int idx; + unsigned char id; + char buttons; + char axes10; + char axes8; + signed char pad; + char hats; + char *abs; + short *key; + char name[ADI_MAX_NAME_LENGTH]; + char cname[ADI_MAX_CNAME_LENGTH]; + char phys[ADI_MAX_PHYS_LENGTH]; + unsigned char data[ADI_MAX_LENGTH]; +}; + +struct adi_port { + struct gameport *gameport; + struct adi adi[2]; + int bad; + int reads; +}; + +/* + * adi_read_packet() reads a Logitech ADI packet. + */ + +static void adi_read_packet(struct adi_port *port) +{ + struct adi *adi = port->adi; + struct gameport *gameport = port->gameport; + unsigned char u, v, w, x, z; + int t[2], s[2], i; + unsigned long flags; + + for (i = 0; i < 2; i++) { + adi[i].ret = -1; + t[i] = gameport_time(gameport, ADI_MAX_START); + s[i] = 0; + } + + local_irq_save(flags); + + gameport_trigger(gameport); + v = z = gameport_read(gameport); + + do { + u = v; + w = u ^ (v = x = gameport_read(gameport)); + for (i = 0; i < 2; i++, w >>= 2, x >>= 2) { + t[i]--; + if ((w & 0x30) && s[i]) { + if ((w & 0x30) < 0x30 && adi[i].ret < ADI_MAX_LENGTH && t[i] > 0) { + adi[i].data[++adi[i].ret] = w; + t[i] = gameport_time(gameport, ADI_MAX_STROBE); + } else t[i] = 0; + } else if (!(x & 0x30)) s[i] = 1; + } + } while (t[0] > 0 || t[1] > 0); + + local_irq_restore(flags); + + return; +} + +/* + * adi_move_bits() detects a possible 2-stream mode, and moves + * the bits accordingly. + */ + +static void adi_move_bits(struct adi_port *port, int length) +{ + int i; + struct adi *adi = port->adi; + + adi[0].idx = adi[1].idx = 0; + + if (adi[0].ret <= 0 || adi[1].ret <= 0) return; + if (adi[0].data[0] & 0x20 || ~adi[1].data[0] & 0x20) return; + + for (i = 1; i <= adi[1].ret; i++) + adi[0].data[((length - 1) >> 1) + i + 1] = adi[1].data[i]; + + adi[0].ret += adi[1].ret; + adi[1].ret = -1; +} + +/* + * adi_get_bits() gathers bits from the data packet. + */ + +static inline int adi_get_bits(struct adi *adi, int count) +{ + int bits = 0; + int i; + if ((adi->idx += count) > adi->ret) return 0; + for (i = 0; i < count; i++) + bits |= ((adi->data[adi->idx - i] >> 5) & 1) << i; + return bits; +} + +/* + * adi_decode() decodes Logitech joystick data into input events. + */ + +static int adi_decode(struct adi *adi) +{ + struct input_dev *dev = adi->dev; + char *abs = adi->abs; + short *key = adi->key; + int i, t; + + if (adi->ret < adi->length || adi->id != (adi_get_bits(adi, 4) | (adi_get_bits(adi, 4) << 4))) + return -1; + + for (i = 0; i < adi->axes10; i++) + input_report_abs(dev, *abs++, adi_get_bits(adi, 10)); + + for (i = 0; i < adi->axes8; i++) + input_report_abs(dev, *abs++, adi_get_bits(adi, 8)); + + for (i = 0; i < adi->buttons && i < 63; i++) { + if (i == adi->pad) { + t = adi_get_bits(adi, 4); + input_report_abs(dev, *abs++, ((t >> 2) & 1) - ( t & 1)); + input_report_abs(dev, *abs++, ((t >> 1) & 1) - ((t >> 3) & 1)); + } + input_report_key(dev, *key++, adi_get_bits(adi, 1)); + } + + for (i = 0; i < adi->hats; i++) { + if ((t = adi_get_bits(adi, 4)) > 8) t = 0; + input_report_abs(dev, *abs++, adi_hat_to_axis[t].x); + input_report_abs(dev, *abs++, adi_hat_to_axis[t].y); + } + + for (i = 63; i < adi->buttons; i++) + input_report_key(dev, *key++, adi_get_bits(adi, 1)); + + input_sync(dev); + + return 0; +} + +/* + * adi_read() reads the data packet and decodes it. + */ + +static int adi_read(struct adi_port *port) +{ + int i; + int result = 0; + + adi_read_packet(port); + adi_move_bits(port, port->adi[0].length); + + for (i = 0; i < 2; i++) + if (port->adi[i].length) + result |= adi_decode(port->adi + i); + + return result; +} + +/* + * adi_poll() repeatedly polls the Logitech joysticks. + */ + +static void adi_poll(struct gameport *gameport) +{ + struct adi_port *port = gameport_get_drvdata(gameport); + + port->bad -= adi_read(port); + port->reads++; +} + +/* + * adi_open() is a callback from the input open routine. + */ + +static int adi_open(struct input_dev *dev) +{ + struct adi_port *port = input_get_drvdata(dev); + + gameport_start_polling(port->gameport); + return 0; +} + +/* + * adi_close() is a callback from the input close routine. + */ + +static void adi_close(struct input_dev *dev) +{ + struct adi_port *port = input_get_drvdata(dev); + + gameport_stop_polling(port->gameport); +} + +/* + * adi_init_digital() sends a trigger & delay sequence + * to reset and initialize a Logitech joystick into digital mode. + */ + +static void adi_init_digital(struct gameport *gameport) +{ + int seq[] = { 4, -2, -3, 10, -6, -11, -7, -9, 11, 0 }; + int i; + + for (i = 0; seq[i]; i++) { + gameport_trigger(gameport); + if (seq[i] > 0) + msleep(seq[i]); + if (seq[i] < 0) { + mdelay(-seq[i]); + udelay(-seq[i]*14); /* It looks like mdelay() is off by approx 1.4% */ + } + } +} + +static void adi_id_decode(struct adi *adi, struct adi_port *port) +{ + int i, t; + + if (adi->ret < ADI_MIN_ID_LENGTH) /* Minimum ID packet length */ + return; + + if (adi->ret < (t = adi_get_bits(adi, 10))) { + printk(KERN_WARNING "adi: Short ID packet: reported: %d != read: %d\n", t, adi->ret); + return; + } + + adi->id = adi_get_bits(adi, 4) | (adi_get_bits(adi, 4) << 4); + + if ((t = adi_get_bits(adi, 4)) & ADI_FLAG_HAT) adi->hats++; + + adi->length = adi_get_bits(adi, 10); + + if (adi->length >= ADI_MAX_LENGTH || adi->length < ADI_MIN_LENGTH) { + printk(KERN_WARNING "adi: Bad data packet length (%d).\n", adi->length); + adi->length = 0; + return; + } + + adi->axes8 = adi_get_bits(adi, 4); + adi->buttons = adi_get_bits(adi, 6); + + if (adi_get_bits(adi, 6) != 8 && adi->hats) { + printk(KERN_WARNING "adi: Other than 8-dir POVs not supported yet.\n"); + adi->length = 0; + return; + } + + adi->buttons += adi_get_bits(adi, 6); + adi->hats += adi_get_bits(adi, 4); + + i = adi_get_bits(adi, 4); + + if (t & ADI_FLAG_10BIT) { + adi->axes10 = adi->axes8 - i; + adi->axes8 = i; + } + + t = adi_get_bits(adi, 4); + + for (i = 0; i < t; i++) + adi->cname[i] = adi_get_bits(adi, 8); + adi->cname[i] = 0; + + t = 8 + adi->buttons + adi->axes10 * 10 + adi->axes8 * 8 + adi->hats * 4; + if (adi->length != t && adi->length != t + (t & 1)) { + printk(KERN_WARNING "adi: Expected length %d != data length %d\n", t, adi->length); + adi->length = 0; + return; + } + + switch (adi->id) { + case ADI_ID_TPD: + adi->pad = 4; + adi->buttons -= 4; + break; + case ADI_ID_WGP: + adi->pad = 0; + adi->buttons -= 4; + break; + default: + adi->pad = -1; + break; + } +} + +static int adi_init_input(struct adi *adi, struct adi_port *port, int half) +{ + struct input_dev *input_dev; + char buf[ADI_MAX_NAME_LENGTH]; + int i, t; + + adi->dev = input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + t = adi->id < ADI_ID_MAX ? adi->id : ADI_ID_MAX; + + snprintf(buf, ADI_MAX_PHYS_LENGTH, adi_names[t], adi->id); + snprintf(adi->name, ADI_MAX_NAME_LENGTH, "Logitech %s [%s]", buf, adi->cname); + snprintf(adi->phys, ADI_MAX_PHYS_LENGTH, "%s/input%d", port->gameport->phys, half); + + adi->abs = adi_abs[t]; + adi->key = adi_key[t]; + + input_dev->name = adi->name; + input_dev->phys = adi->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_LOGITECH; + input_dev->id.product = adi->id; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &port->gameport->dev; + + input_set_drvdata(input_dev, port); + + input_dev->open = adi_open; + input_dev->close = adi_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad != -1)) * 2; i++) + set_bit(adi->abs[i], input_dev->absbit); + + for (i = 0; i < adi->buttons; i++) + set_bit(adi->key[i], input_dev->keybit); + + return 0; +} + +static void adi_init_center(struct adi *adi) +{ + int i, t, x; + + if (!adi->length) + return; + + for (i = 0; i < adi->axes10 + adi->axes8 + (adi->hats + (adi->pad != -1)) * 2; i++) { + + t = adi->abs[i]; + x = input_abs_get_val(adi->dev, t); + + if (t == ABS_THROTTLE || t == ABS_RUDDER || adi->id == ADI_ID_WGPE) + x = i < adi->axes10 ? 512 : 128; + + if (i < adi->axes10) + input_set_abs_params(adi->dev, t, 64, x * 2 - 64, 2, 16); + else if (i < adi->axes10 + adi->axes8) + input_set_abs_params(adi->dev, t, 48, x * 2 - 48, 1, 16); + else + input_set_abs_params(adi->dev, t, -1, 1, 0, 0); + } +} + +/* + * adi_connect() probes for Logitech ADI joysticks. + */ + +static int adi_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct adi_port *port; + int i; + int err; + + port = kzalloc(sizeof(struct adi_port), GFP_KERNEL); + if (!port) + return -ENOMEM; + + port->gameport = gameport; + + gameport_set_drvdata(gameport, port); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + adi_init_digital(gameport); + adi_read_packet(port); + + if (port->adi[0].ret >= ADI_MIN_LEN_LENGTH) + adi_move_bits(port, adi_get_bits(port->adi, 10)); + + for (i = 0; i < 2; i++) { + adi_id_decode(port->adi + i, port); + + if (!port->adi[i].length) + continue; + + err = adi_init_input(port->adi + i, port, i); + if (err) + goto fail2; + } + + if (!port->adi[0].length && !port->adi[1].length) { + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, adi_poll); + gameport_set_poll_interval(gameport, 20); + + msleep(ADI_INIT_DELAY); + if (adi_read(port)) { + msleep(ADI_DATA_DELAY); + adi_read(port); + } + + for (i = 0; i < 2; i++) + if (port->adi[i].length > 0) { + adi_init_center(port->adi + i); + err = input_register_device(port->adi[i].dev); + if (err) + goto fail3; + } + + return 0; + + fail3: while (--i >= 0) { + if (port->adi[i].length > 0) { + input_unregister_device(port->adi[i].dev); + port->adi[i].dev = NULL; + } + } + fail2: for (i = 0; i < 2; i++) + if (port->adi[i].dev) + input_free_device(port->adi[i].dev); + gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + kfree(port); + return err; +} + +static void adi_disconnect(struct gameport *gameport) +{ + int i; + struct adi_port *port = gameport_get_drvdata(gameport); + + for (i = 0; i < 2; i++) + if (port->adi[i].length > 0) + input_unregister_device(port->adi[i].dev); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(port); +} + +static struct gameport_driver adi_drv = { + .driver = { + .name = "adi", + }, + .description = DRIVER_DESC, + .connect = adi_connect, + .disconnect = adi_disconnect, +}; + +module_gameport_driver(adi_drv); diff --git a/drivers/input/joystick/amijoy.c b/drivers/input/joystick/amijoy.c new file mode 100644 index 00000000..c65b5fa6 --- /dev/null +++ b/drivers/input/joystick/amijoy.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + */ + +/* + * Driver for Amiga joysticks for Linux/m68k + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Driver for Amiga joysticks"); +MODULE_LICENSE("GPL"); + +static int amijoy[2] = { 0, 1 }; +module_param_array_named(map, amijoy, uint, NULL, 0); +MODULE_PARM_DESC(map, "Map of attached joysticks in form of , (default is 0,1)"); + +static int amijoy_used; +static DEFINE_MUTEX(amijoy_mutex); +static struct input_dev *amijoy_dev[2]; +static char *amijoy_phys[2] = { "amijoy/input0", "amijoy/input1" }; + +static irqreturn_t amijoy_interrupt(int irq, void *dummy) +{ + int i, data = 0, button = 0; + + for (i = 0; i < 2; i++) + if (amijoy[i]) { + + switch (i) { + case 0: data = ~amiga_custom.joy0dat; button = (~ciaa.pra >> 6) & 1; break; + case 1: data = ~amiga_custom.joy1dat; button = (~ciaa.pra >> 7) & 1; break; + } + + input_report_key(amijoy_dev[i], BTN_TRIGGER, button); + + input_report_abs(amijoy_dev[i], ABS_X, ((data >> 1) & 1) - ((data >> 9) & 1)); + data = ~(data ^ (data << 1)); + input_report_abs(amijoy_dev[i], ABS_Y, ((data >> 1) & 1) - ((data >> 9) & 1)); + + input_sync(amijoy_dev[i]); + } + return IRQ_HANDLED; +} + +static int amijoy_open(struct input_dev *dev) +{ + int err; + + err = mutex_lock_interruptible(&amijoy_mutex); + if (err) + return err; + + if (!amijoy_used && request_irq(IRQ_AMIGA_VERTB, amijoy_interrupt, 0, "amijoy", amijoy_interrupt)) { + printk(KERN_ERR "amijoy.c: Can't allocate irq %d\n", IRQ_AMIGA_VERTB); + err = -EBUSY; + goto out; + } + + amijoy_used++; +out: + mutex_unlock(&amijoy_mutex); + return err; +} + +static void amijoy_close(struct input_dev *dev) +{ + mutex_lock(&amijoy_mutex); + if (!--amijoy_used) + free_irq(IRQ_AMIGA_VERTB, amijoy_interrupt); + mutex_unlock(&amijoy_mutex); +} + +static int __init amijoy_init(void) +{ + int i, j; + int err; + + if (!MACH_IS_AMIGA) + return -ENODEV; + + for (i = 0; i < 2; i++) { + if (!amijoy[i]) + continue; + + amijoy_dev[i] = input_allocate_device(); + if (!amijoy_dev[i]) { + err = -ENOMEM; + goto fail; + } + + if (!request_mem_region(CUSTOM_PHYSADDR + 10 + i * 2, 2, "amijoy [Denise]")) { + input_free_device(amijoy_dev[i]); + err = -EBUSY; + goto fail; + } + + amijoy_dev[i]->name = "Amiga joystick"; + amijoy_dev[i]->phys = amijoy_phys[i]; + amijoy_dev[i]->id.bustype = BUS_AMIGA; + amijoy_dev[i]->id.vendor = 0x0001; + amijoy_dev[i]->id.product = 0x0003; + amijoy_dev[i]->id.version = 0x0100; + + amijoy_dev[i]->open = amijoy_open; + amijoy_dev[i]->close = amijoy_close; + + amijoy_dev[i]->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + amijoy_dev[i]->absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y); + amijoy_dev[i]->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + for (j = 0; j < 2; j++) { + input_set_abs_params(amijoy_dev[i], ABS_X + j, + -1, 1, 0, 0); + } + + err = input_register_device(amijoy_dev[i]); + if (err) { + input_free_device(amijoy_dev[i]); + goto fail; + } + } + return 0; + + fail: while (--i >= 0) + if (amijoy[i]) { + input_unregister_device(amijoy_dev[i]); + release_mem_region(CUSTOM_PHYSADDR + 10 + i * 2, 2); + } + return err; +} + +static void __exit amijoy_exit(void) +{ + int i; + + for (i = 0; i < 2; i++) + if (amijoy[i]) { + input_unregister_device(amijoy_dev[i]); + release_mem_region(CUSTOM_PHYSADDR + 10 + i * 2, 2); + } +} + +module_init(amijoy_init); +module_exit(amijoy_exit); diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c new file mode 100644 index 00000000..9135606c --- /dev/null +++ b/drivers/input/joystick/analog.c @@ -0,0 +1,769 @@ +/* + * Copyright (c) 1996-2001 Vojtech Pavlik + */ + +/* + * Analog joystick and gamepad driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Analog joystick and gamepad driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Option parsing. + */ + +#define ANALOG_PORTS 16 + +static char *js[ANALOG_PORTS]; +static unsigned int js_nargs; +static int analog_options[ANALOG_PORTS]; +module_param_array_named(map, js, charp, &js_nargs, 0); +MODULE_PARM_DESC(map, "Describes analog joysticks type/capabilities"); + +/* + * Times, feature definitions. + */ + +#define ANALOG_RUDDER 0x00004 +#define ANALOG_THROTTLE 0x00008 +#define ANALOG_AXES_STD 0x0000f +#define ANALOG_BTNS_STD 0x000f0 + +#define ANALOG_BTNS_CHF 0x00100 +#define ANALOG_HAT1_CHF 0x00200 +#define ANALOG_HAT2_CHF 0x00400 +#define ANALOG_HAT_FCS 0x00800 +#define ANALOG_HATS_ALL 0x00e00 +#define ANALOG_BTN_TL 0x01000 +#define ANALOG_BTN_TR 0x02000 +#define ANALOG_BTN_TL2 0x04000 +#define ANALOG_BTN_TR2 0x08000 +#define ANALOG_BTNS_TLR 0x03000 +#define ANALOG_BTNS_TLR2 0x0c000 +#define ANALOG_BTNS_GAMEPAD 0x0f000 + +#define ANALOG_HBTN_CHF 0x10000 +#define ANALOG_ANY_CHF 0x10700 +#define ANALOG_SAITEK 0x20000 +#define ANALOG_EXTENSIONS 0x7ff00 +#define ANALOG_GAMEPAD 0x80000 + +#define ANALOG_MAX_TIME 3 /* 3 ms */ +#define ANALOG_LOOP_TIME 2000 /* 2 * loop */ +#define ANALOG_SAITEK_DELAY 200 /* 200 us */ +#define ANALOG_SAITEK_TIME 2000 /* 2000 us */ +#define ANALOG_AXIS_TIME 2 /* 2 * refresh */ +#define ANALOG_INIT_RETRIES 8 /* 8 times */ +#define ANALOG_FUZZ_BITS 2 /* 2 bit more */ +#define ANALOG_FUZZ_MAGIC 36 /* 36 u*ms/loop */ + +#define ANALOG_MAX_NAME_LENGTH 128 +#define ANALOG_MAX_PHYS_LENGTH 32 + +static short analog_axes[] = { ABS_X, ABS_Y, ABS_RUDDER, ABS_THROTTLE }; +static short analog_hats[] = { ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y, ABS_HAT2X, ABS_HAT2Y }; +static short analog_pads[] = { BTN_Y, BTN_Z, BTN_TL, BTN_TR }; +static short analog_exts[] = { ANALOG_HAT1_CHF, ANALOG_HAT2_CHF, ANALOG_HAT_FCS }; +static short analog_pad_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_TL2, BTN_TR2, BTN_SELECT, BTN_START, BTN_MODE, BTN_BASE }; +static short analog_joy_btn[] = { BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2, + BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_BASE6 }; + +static unsigned char analog_chf[] = { 0xf, 0x0, 0x1, 0x9, 0x2, 0x4, 0xc, 0x8, 0x3, 0x5, 0xb, 0x7, 0xd, 0xe, 0xa, 0x6 }; + +struct analog { + struct input_dev *dev; + int mask; + short *buttons; + char name[ANALOG_MAX_NAME_LENGTH]; + char phys[ANALOG_MAX_PHYS_LENGTH]; +}; + +struct analog_port { + struct gameport *gameport; + struct analog analog[2]; + unsigned char mask; + char saitek; + char cooked; + int bads; + int reads; + int speed; + int loop; + int fuzz; + int axes[4]; + int buttons; + int initial[4]; + int axtime; +}; + +/* + * Time macros. + */ + +#ifdef __i386__ + +#include + +#define GET_TIME(x) do { if (cpu_has_tsc) rdtscl(x); else x = get_time_pit(); } while (0) +#define DELTA(x,y) (cpu_has_tsc ? ((y) - (x)) : ((x) - (y) + ((x) < (y) ? PIT_TICK_RATE / HZ : 0))) +#define TIME_NAME (cpu_has_tsc?"TSC":"PIT") +static unsigned int get_time_pit(void) +{ + unsigned long flags; + unsigned int count; + + raw_spin_lock_irqsave(&i8253_lock, flags); + outb_p(0x00, 0x43); + count = inb_p(0x40); + count |= inb_p(0x40) << 8; + raw_spin_unlock_irqrestore(&i8253_lock, flags); + + return count; +} +#elif defined(__x86_64__) +#define GET_TIME(x) rdtscl(x) +#define DELTA(x,y) ((y)-(x)) +#define TIME_NAME "TSC" +#elif defined(__alpha__) || defined(CONFIG_MN10300) || defined(CONFIG_ARM) || defined(CONFIG_TILE) +#define GET_TIME(x) do { x = get_cycles(); } while (0) +#define DELTA(x,y) ((y)-(x)) +#define TIME_NAME "get_cycles" +#else +#define FAKE_TIME +static unsigned long analog_faketime = 0; +#define GET_TIME(x) do { x = analog_faketime++; } while(0) +#define DELTA(x,y) ((y)-(x)) +#define TIME_NAME "Unreliable" +#warning Precise timer not defined for this architecture. +#endif + +/* + * analog_decode() decodes analog joystick data and reports input events. + */ + +static void analog_decode(struct analog *analog, int *axes, int *initial, int buttons) +{ + struct input_dev *dev = analog->dev; + int i, j; + + if (analog->mask & ANALOG_HAT_FCS) + for (i = 0; i < 4; i++) + if (axes[3] < ((initial[3] * ((i << 1) + 1)) >> 3)) { + buttons |= 1 << (i + 14); + break; + } + + for (i = j = 0; i < 6; i++) + if (analog->mask & (0x10 << i)) + input_report_key(dev, analog->buttons[j++], (buttons >> i) & 1); + + if (analog->mask & ANALOG_HBTN_CHF) + for (i = 0; i < 4; i++) + input_report_key(dev, analog->buttons[j++], (buttons >> (i + 10)) & 1); + + if (analog->mask & ANALOG_BTN_TL) + input_report_key(dev, analog_pads[0], axes[2] < (initial[2] >> 1)); + if (analog->mask & ANALOG_BTN_TR) + input_report_key(dev, analog_pads[1], axes[3] < (initial[3] >> 1)); + if (analog->mask & ANALOG_BTN_TL2) + input_report_key(dev, analog_pads[2], axes[2] > (initial[2] + (initial[2] >> 1))); + if (analog->mask & ANALOG_BTN_TR2) + input_report_key(dev, analog_pads[3], axes[3] > (initial[3] + (initial[3] >> 1))); + + for (i = j = 0; i < 4; i++) + if (analog->mask & (1 << i)) + input_report_abs(dev, analog_axes[j++], axes[i]); + + for (i = j = 0; i < 3; i++) + if (analog->mask & analog_exts[i]) { + input_report_abs(dev, analog_hats[j++], + ((buttons >> ((i << 2) + 7)) & 1) - ((buttons >> ((i << 2) + 9)) & 1)); + input_report_abs(dev, analog_hats[j++], + ((buttons >> ((i << 2) + 8)) & 1) - ((buttons >> ((i << 2) + 6)) & 1)); + } + + input_sync(dev); +} + +/* + * analog_cooked_read() reads analog joystick data. + */ + +static int analog_cooked_read(struct analog_port *port) +{ + struct gameport *gameport = port->gameport; + unsigned int time[4], start, loop, now, loopout, timeout; + unsigned char data[4], this, last; + unsigned long flags; + int i, j; + + loopout = (ANALOG_LOOP_TIME * port->loop) / 1000; + timeout = ANALOG_MAX_TIME * port->speed; + + local_irq_save(flags); + gameport_trigger(gameport); + GET_TIME(now); + local_irq_restore(flags); + + start = now; + this = port->mask; + i = 0; + + do { + loop = now; + last = this; + + local_irq_disable(); + this = gameport_read(gameport) & port->mask; + GET_TIME(now); + local_irq_restore(flags); + + if ((last ^ this) && (DELTA(loop, now) < loopout)) { + data[i] = last ^ this; + time[i] = now; + i++; + } + + } while (this && (i < 4) && (DELTA(start, now) < timeout)); + + this <<= 4; + + for (--i; i >= 0; i--) { + this |= data[i]; + for (j = 0; j < 4; j++) + if (data[i] & (1 << j)) + port->axes[j] = (DELTA(start, time[i]) << ANALOG_FUZZ_BITS) / port->loop; + } + + return -(this != port->mask); +} + +static int analog_button_read(struct analog_port *port, char saitek, char chf) +{ + unsigned char u; + int t = 1, i = 0; + int strobe = gameport_time(port->gameport, ANALOG_SAITEK_TIME); + + u = gameport_read(port->gameport); + + if (!chf) { + port->buttons = (~u >> 4) & 0xf; + return 0; + } + + port->buttons = 0; + + while ((~u & 0xf0) && (i < 16) && t) { + port->buttons |= 1 << analog_chf[(~u >> 4) & 0xf]; + if (!saitek) return 0; + udelay(ANALOG_SAITEK_DELAY); + t = strobe; + gameport_trigger(port->gameport); + while (((u = gameport_read(port->gameport)) & port->mask) && t) t--; + i++; + } + + return -(!t || (i == 16)); +} + +/* + * analog_poll() repeatedly polls the Analog joysticks. + */ + +static void analog_poll(struct gameport *gameport) +{ + struct analog_port *port = gameport_get_drvdata(gameport); + int i; + + char saitek = !!(port->analog[0].mask & ANALOG_SAITEK); + char chf = !!(port->analog[0].mask & ANALOG_ANY_CHF); + + if (port->cooked) { + port->bads -= gameport_cooked_read(port->gameport, port->axes, &port->buttons); + if (chf) + port->buttons = port->buttons ? (1 << analog_chf[port->buttons]) : 0; + port->reads++; + } else { + if (!port->axtime--) { + port->bads -= analog_cooked_read(port); + port->bads -= analog_button_read(port, saitek, chf); + port->reads++; + port->axtime = ANALOG_AXIS_TIME - 1; + } else { + if (!saitek) + analog_button_read(port, saitek, chf); + } + } + + for (i = 0; i < 2; i++) + if (port->analog[i].mask) + analog_decode(port->analog + i, port->axes, port->initial, port->buttons); +} + +/* + * analog_open() is a callback from the input open routine. + */ + +static int analog_open(struct input_dev *dev) +{ + struct analog_port *port = input_get_drvdata(dev); + + gameport_start_polling(port->gameport); + return 0; +} + +/* + * analog_close() is a callback from the input close routine. + */ + +static void analog_close(struct input_dev *dev) +{ + struct analog_port *port = input_get_drvdata(dev); + + gameport_stop_polling(port->gameport); +} + +/* + * analog_calibrate_timer() calibrates the timer and computes loop + * and timeout values for a joystick port. + */ + +static void analog_calibrate_timer(struct analog_port *port) +{ + struct gameport *gameport = port->gameport; + unsigned int i, t, tx, t1, t2, t3; + unsigned long flags; + + local_irq_save(flags); + GET_TIME(t1); +#ifdef FAKE_TIME + analog_faketime += 830; +#endif + mdelay(1); + GET_TIME(t2); + GET_TIME(t3); + local_irq_restore(flags); + + port->speed = DELTA(t1, t2) - DELTA(t2, t3); + + tx = ~0; + + for (i = 0; i < 50; i++) { + local_irq_save(flags); + GET_TIME(t1); + for (t = 0; t < 50; t++) { gameport_read(gameport); GET_TIME(t2); } + GET_TIME(t3); + local_irq_restore(flags); + udelay(i); + t = DELTA(t1, t2) - DELTA(t2, t3); + if (t < tx) tx = t; + } + + port->loop = tx / 50; +} + +/* + * analog_name() constructs a name for an analog joystick. + */ + +static void analog_name(struct analog *analog) +{ + snprintf(analog->name, sizeof(analog->name), "Analog %d-axis %d-button", + hweight8(analog->mask & ANALOG_AXES_STD), + hweight8(analog->mask & ANALOG_BTNS_STD) + !!(analog->mask & ANALOG_BTNS_CHF) * 2 + + hweight16(analog->mask & ANALOG_BTNS_GAMEPAD) + !!(analog->mask & ANALOG_HBTN_CHF) * 4); + + if (analog->mask & ANALOG_HATS_ALL) + snprintf(analog->name, sizeof(analog->name), "%s %d-hat", + analog->name, hweight16(analog->mask & ANALOG_HATS_ALL)); + + if (analog->mask & ANALOG_HAT_FCS) + strlcat(analog->name, " FCS", sizeof(analog->name)); + if (analog->mask & ANALOG_ANY_CHF) + strlcat(analog->name, (analog->mask & ANALOG_SAITEK) ? " Saitek" : " CHF", + sizeof(analog->name)); + + strlcat(analog->name, (analog->mask & ANALOG_GAMEPAD) ? " gamepad": " joystick", + sizeof(analog->name)); +} + +/* + * analog_init_device() + */ + +static int analog_init_device(struct analog_port *port, struct analog *analog, int index) +{ + struct input_dev *input_dev; + int i, j, t, v, w, x, y, z; + int error; + + analog_name(analog); + snprintf(analog->phys, sizeof(analog->phys), + "%s/input%d", port->gameport->phys, index); + analog->buttons = (analog->mask & ANALOG_GAMEPAD) ? analog_pad_btn : analog_joy_btn; + + analog->dev = input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + input_dev->name = analog->name; + input_dev->phys = analog->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_ANALOG; + input_dev->id.product = analog->mask >> 4; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &port->gameport->dev; + + input_set_drvdata(input_dev, port); + + input_dev->open = analog_open; + input_dev->close = analog_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = j = 0; i < 4; i++) + if (analog->mask & (1 << i)) { + + t = analog_axes[j]; + x = port->axes[i]; + y = (port->axes[0] + port->axes[1]) >> 1; + z = y - port->axes[i]; + z = z > 0 ? z : -z; + v = (x >> 3); + w = (x >> 3); + + if ((i == 2 || i == 3) && (j == 2 || j == 3) && (z > (y >> 3))) + x = y; + + if (analog->mask & ANALOG_SAITEK) { + if (i == 2) x = port->axes[i]; + v = x - (x >> 2); + w = (x >> 4); + } + + input_set_abs_params(input_dev, t, v, (x << 1) - v, port->fuzz, w); + j++; + } + + for (i = j = 0; i < 3; i++) + if (analog->mask & analog_exts[i]) + for (x = 0; x < 2; x++) { + t = analog_hats[j++]; + input_set_abs_params(input_dev, t, -1, 1, 0, 0); + } + + for (i = j = 0; i < 4; i++) + if (analog->mask & (0x10 << i)) + set_bit(analog->buttons[j++], input_dev->keybit); + + if (analog->mask & ANALOG_BTNS_CHF) + for (i = 0; i < 2; i++) + set_bit(analog->buttons[j++], input_dev->keybit); + + if (analog->mask & ANALOG_HBTN_CHF) + for (i = 0; i < 4; i++) + set_bit(analog->buttons[j++], input_dev->keybit); + + for (i = 0; i < 4; i++) + if (analog->mask & (ANALOG_BTN_TL << i)) + set_bit(analog_pads[i], input_dev->keybit); + + analog_decode(analog, port->axes, port->initial, port->buttons); + + error = input_register_device(analog->dev); + if (error) { + input_free_device(analog->dev); + return error; + } + + return 0; +} + +/* + * analog_init_devices() sets up device-specific values and registers the input devices. + */ + +static int analog_init_masks(struct analog_port *port) +{ + int i; + struct analog *analog = port->analog; + int max[4]; + + if (!port->mask) + return -1; + + if ((port->mask & 3) != 3 && port->mask != 0xc) { + printk(KERN_WARNING "analog.c: Unknown joystick device found " + "(data=%#x, %s), probably not analog joystick.\n", + port->mask, port->gameport->phys); + return -1; + } + + + i = analog_options[0]; /* FIXME !!! - need to specify options for different ports */ + + analog[0].mask = i & 0xfffff; + + analog[0].mask &= ~(ANALOG_AXES_STD | ANALOG_HAT_FCS | ANALOG_BTNS_GAMEPAD) + | port->mask | ((port->mask << 8) & ANALOG_HAT_FCS) + | ((port->mask << 10) & ANALOG_BTNS_TLR) | ((port->mask << 12) & ANALOG_BTNS_TLR2); + + analog[0].mask &= ~(ANALOG_HAT2_CHF) + | ((analog[0].mask & ANALOG_HBTN_CHF) ? 0 : ANALOG_HAT2_CHF); + + analog[0].mask &= ~(ANALOG_THROTTLE | ANALOG_BTN_TR | ANALOG_BTN_TR2) + | ((~analog[0].mask & ANALOG_HAT_FCS) >> 8) + | ((~analog[0].mask & ANALOG_HAT_FCS) << 2) + | ((~analog[0].mask & ANALOG_HAT_FCS) << 4); + + analog[0].mask &= ~(ANALOG_THROTTLE | ANALOG_RUDDER) + | (((~analog[0].mask & ANALOG_BTNS_TLR ) >> 10) + & ((~analog[0].mask & ANALOG_BTNS_TLR2) >> 12)); + + analog[1].mask = ((i >> 20) & 0xff) | ((i >> 12) & 0xf0000); + + analog[1].mask &= (analog[0].mask & ANALOG_EXTENSIONS) ? ANALOG_GAMEPAD + : (((ANALOG_BTNS_STD | port->mask) & ~analog[0].mask) | ANALOG_GAMEPAD); + + if (port->cooked) { + + for (i = 0; i < 4; i++) max[i] = port->axes[i] << 1; + + if ((analog[0].mask & 0x7) == 0x7) max[2] = (max[0] + max[1]) >> 1; + if ((analog[0].mask & 0xb) == 0xb) max[3] = (max[0] + max[1]) >> 1; + if ((analog[0].mask & ANALOG_BTN_TL) && !(analog[0].mask & ANALOG_BTN_TL2)) max[2] >>= 1; + if ((analog[0].mask & ANALOG_BTN_TR) && !(analog[0].mask & ANALOG_BTN_TR2)) max[3] >>= 1; + if ((analog[0].mask & ANALOG_HAT_FCS)) max[3] >>= 1; + + gameport_calibrate(port->gameport, port->axes, max); + } + + for (i = 0; i < 4; i++) + port->initial[i] = port->axes[i]; + + return -!(analog[0].mask || analog[1].mask); +} + +static int analog_init_port(struct gameport *gameport, struct gameport_driver *drv, struct analog_port *port) +{ + int i, t, u, v; + + port->gameport = gameport; + + gameport_set_drvdata(gameport, port); + + if (!gameport_open(gameport, drv, GAMEPORT_MODE_RAW)) { + + analog_calibrate_timer(port); + + gameport_trigger(gameport); + t = gameport_read(gameport); + msleep(ANALOG_MAX_TIME); + port->mask = (gameport_read(gameport) ^ t) & t & 0xf; + port->fuzz = (port->speed * ANALOG_FUZZ_MAGIC) / port->loop / 1000 + ANALOG_FUZZ_BITS; + + for (i = 0; i < ANALOG_INIT_RETRIES; i++) { + if (!analog_cooked_read(port)) + break; + msleep(ANALOG_MAX_TIME); + } + + u = v = 0; + + msleep(ANALOG_MAX_TIME); + t = gameport_time(gameport, ANALOG_MAX_TIME * 1000); + gameport_trigger(gameport); + while ((gameport_read(port->gameport) & port->mask) && (u < t)) + u++; + udelay(ANALOG_SAITEK_DELAY); + t = gameport_time(gameport, ANALOG_SAITEK_TIME); + gameport_trigger(gameport); + while ((gameport_read(port->gameport) & port->mask) && (v < t)) + v++; + + if (v < (u >> 1)) { /* FIXME - more than one port */ + analog_options[0] |= /* FIXME - more than one port */ + ANALOG_SAITEK | ANALOG_BTNS_CHF | ANALOG_HBTN_CHF | ANALOG_HAT1_CHF; + return 0; + } + + gameport_close(gameport); + } + + if (!gameport_open(gameport, drv, GAMEPORT_MODE_COOKED)) { + + for (i = 0; i < ANALOG_INIT_RETRIES; i++) + if (!gameport_cooked_read(gameport, port->axes, &port->buttons)) + break; + for (i = 0; i < 4; i++) + if (port->axes[i] != -1) + port->mask |= 1 << i; + + port->fuzz = gameport->fuzz; + port->cooked = 1; + return 0; + } + + return gameport_open(gameport, drv, GAMEPORT_MODE_RAW); +} + +static int analog_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct analog_port *port; + int i; + int err; + + if (!(port = kzalloc(sizeof(struct analog_port), GFP_KERNEL))) + return - ENOMEM; + + err = analog_init_port(gameport, drv, port); + if (err) + goto fail1; + + err = analog_init_masks(port); + if (err) + goto fail2; + + gameport_set_poll_handler(gameport, analog_poll); + gameport_set_poll_interval(gameport, 10); + + for (i = 0; i < 2; i++) + if (port->analog[i].mask) { + err = analog_init_device(port, port->analog + i, i); + if (err) + goto fail3; + } + + return 0; + + fail3: while (--i >= 0) + if (port->analog[i].mask) + input_unregister_device(port->analog[i].dev); + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + kfree(port); + return err; +} + +static void analog_disconnect(struct gameport *gameport) +{ + struct analog_port *port = gameport_get_drvdata(gameport); + int i; + + for (i = 0; i < 2; i++) + if (port->analog[i].mask) + input_unregister_device(port->analog[i].dev); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + printk(KERN_INFO "analog.c: %d out of %d reads (%d%%) on %s failed\n", + port->bads, port->reads, port->reads ? (port->bads * 100 / port->reads) : 0, + port->gameport->phys); + kfree(port); +} + +struct analog_types { + char *name; + int value; +}; + +static struct analog_types analog_types[] = { + { "none", 0x00000000 }, + { "auto", 0x000000ff }, + { "2btn", 0x0000003f }, + { "y-joy", 0x0cc00033 }, + { "y-pad", 0x8cc80033 }, + { "fcs", 0x000008f7 }, + { "chf", 0x000002ff }, + { "fullchf", 0x000007ff }, + { "gamepad", 0x000830f3 }, + { "gamepad8", 0x0008f0f3 }, + { NULL, 0 } +}; + +static void analog_parse_options(void) +{ + int i, j; + char *end; + + for (i = 0; i < js_nargs; i++) { + + for (j = 0; analog_types[j].name; j++) + if (!strcmp(analog_types[j].name, js[i])) { + analog_options[i] = analog_types[j].value; + break; + } + if (analog_types[j].name) continue; + + analog_options[i] = simple_strtoul(js[i], &end, 0); + if (end != js[i]) continue; + + analog_options[i] = 0xff; + if (!strlen(js[i])) continue; + + printk(KERN_WARNING "analog.c: Bad config for port %d - \"%s\"\n", i, js[i]); + } + + for (; i < ANALOG_PORTS; i++) + analog_options[i] = 0xff; +} + +/* + * The gameport device structure. + */ + +static struct gameport_driver analog_drv = { + .driver = { + .name = "analog", + }, + .description = DRIVER_DESC, + .connect = analog_connect, + .disconnect = analog_disconnect, +}; + +static int __init analog_init(void) +{ + analog_parse_options(); + return gameport_register_driver(&analog_drv); +} + +static void __exit analog_exit(void) +{ + gameport_unregister_driver(&analog_drv); +} + +module_init(analog_init); +module_exit(analog_exit); diff --git a/drivers/input/joystick/as5011.c b/drivers/input/joystick/as5011.c new file mode 100644 index 00000000..121cd63d --- /dev/null +++ b/drivers/input/joystick/as5011.c @@ -0,0 +1,373 @@ +/* + * Copyright (c) 2010, 2011 Fabien Marteau + * Sponsored by ARMadeus Systems + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Driver for Austria Microsystems joysticks AS5011 + * + * TODO: + * - Power on the chip when open() and power down when close() + * - Manage power mode + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Driver for Austria Microsystems AS5011 joystick" +#define MODULE_DEVICE_ALIAS "as5011" + +MODULE_AUTHOR("Fabien Marteau "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* registers */ +#define AS5011_CTRL1 0x76 +#define AS5011_CTRL2 0x75 +#define AS5011_XP 0x43 +#define AS5011_XN 0x44 +#define AS5011_YP 0x53 +#define AS5011_YN 0x54 +#define AS5011_X_REG 0x41 +#define AS5011_Y_REG 0x42 +#define AS5011_X_RES_INT 0x51 +#define AS5011_Y_RES_INT 0x52 + +/* CTRL1 bits */ +#define AS5011_CTRL1_LP_PULSED 0x80 +#define AS5011_CTRL1_LP_ACTIVE 0x40 +#define AS5011_CTRL1_LP_CONTINUE 0x20 +#define AS5011_CTRL1_INT_WUP_EN 0x10 +#define AS5011_CTRL1_INT_ACT_EN 0x08 +#define AS5011_CTRL1_EXT_CLK_EN 0x04 +#define AS5011_CTRL1_SOFT_RST 0x02 +#define AS5011_CTRL1_DATA_VALID 0x01 + +/* CTRL2 bits */ +#define AS5011_CTRL2_EXT_SAMPLE_EN 0x08 +#define AS5011_CTRL2_RC_BIAS_ON 0x04 +#define AS5011_CTRL2_INV_SPINNING 0x02 + +#define AS5011_MAX_AXIS 80 +#define AS5011_MIN_AXIS (-80) +#define AS5011_FUZZ 8 +#define AS5011_FLAT 40 + +struct as5011_device { + struct input_dev *input_dev; + struct i2c_client *i2c_client; + unsigned int button_gpio; + unsigned int button_irq; + unsigned int axis_irq; +}; + +static int as5011_i2c_write(struct i2c_client *client, + uint8_t aregaddr, + uint8_t avalue) +{ + uint8_t data[2] = { aregaddr, avalue }; + struct i2c_msg msg = { + .addr = client->addr, + .flags = I2C_M_IGNORE_NAK, + .len = 2, + .buf = (uint8_t *)data + }; + int error; + + error = i2c_transfer(client->adapter, &msg, 1); + return error < 0 ? error : 0; +} + +static int as5011_i2c_read(struct i2c_client *client, + uint8_t aregaddr, signed char *value) +{ + uint8_t data[2] = { aregaddr }; + struct i2c_msg msg_set[2] = { + { + .addr = client->addr, + .flags = I2C_M_REV_DIR_ADDR, + .len = 1, + .buf = (uint8_t *)data + }, + { + .addr = client->addr, + .flags = I2C_M_RD | I2C_M_NOSTART, + .len = 1, + .buf = (uint8_t *)data + } + }; + int error; + + error = i2c_transfer(client->adapter, msg_set, 2); + if (error < 0) + return error; + + *value = data[0] & 0x80 ? -1 * (1 + ~data[0]) : data[0]; + return 0; +} + +static irqreturn_t as5011_button_interrupt(int irq, void *dev_id) +{ + struct as5011_device *as5011 = dev_id; + int val = gpio_get_value_cansleep(as5011->button_gpio); + + input_report_key(as5011->input_dev, BTN_JOYSTICK, !val); + input_sync(as5011->input_dev); + + return IRQ_HANDLED; +} + +static irqreturn_t as5011_axis_interrupt(int irq, void *dev_id) +{ + struct as5011_device *as5011 = dev_id; + int error; + signed char x, y; + + error = as5011_i2c_read(as5011->i2c_client, AS5011_X_RES_INT, &x); + if (error < 0) + goto out; + + error = as5011_i2c_read(as5011->i2c_client, AS5011_Y_RES_INT, &y); + if (error < 0) + goto out; + + input_report_abs(as5011->input_dev, ABS_X, x); + input_report_abs(as5011->input_dev, ABS_Y, y); + input_sync(as5011->input_dev); + +out: + return IRQ_HANDLED; +} + +static int as5011_configure_chip(struct as5011_device *as5011, + const struct as5011_platform_data *plat_dat) +{ + struct i2c_client *client = as5011->i2c_client; + int error; + signed char value; + + /* chip soft reset */ + error = as5011_i2c_write(client, AS5011_CTRL1, + AS5011_CTRL1_SOFT_RST); + if (error < 0) { + dev_err(&client->dev, "Soft reset failed\n"); + return error; + } + + mdelay(10); + + error = as5011_i2c_write(client, AS5011_CTRL1, + AS5011_CTRL1_LP_PULSED | + AS5011_CTRL1_LP_ACTIVE | + AS5011_CTRL1_INT_ACT_EN); + if (error < 0) { + dev_err(&client->dev, "Power config failed\n"); + return error; + } + + error = as5011_i2c_write(client, AS5011_CTRL2, + AS5011_CTRL2_INV_SPINNING); + if (error < 0) { + dev_err(&client->dev, "Can't invert spinning\n"); + return error; + } + + /* write threshold */ + error = as5011_i2c_write(client, AS5011_XP, plat_dat->xp); + if (error < 0) { + dev_err(&client->dev, "Can't write threshold\n"); + return error; + } + + error = as5011_i2c_write(client, AS5011_XN, plat_dat->xn); + if (error < 0) { + dev_err(&client->dev, "Can't write threshold\n"); + return error; + } + + error = as5011_i2c_write(client, AS5011_YP, plat_dat->yp); + if (error < 0) { + dev_err(&client->dev, "Can't write threshold\n"); + return error; + } + + error = as5011_i2c_write(client, AS5011_YN, plat_dat->yn); + if (error < 0) { + dev_err(&client->dev, "Can't write threshold\n"); + return error; + } + + /* to free irq gpio in chip */ + error = as5011_i2c_read(client, AS5011_X_RES_INT, &value); + if (error < 0) { + dev_err(&client->dev, "Can't read i2c X resolution value\n"); + return error; + } + + return 0; +} + +static int as5011_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct as5011_platform_data *plat_data; + struct as5011_device *as5011; + struct input_dev *input_dev; + int irq; + int error; + + plat_data = client->dev.platform_data; + if (!plat_data) + return -EINVAL; + + if (!plat_data->axis_irq) { + dev_err(&client->dev, "No axis IRQ?\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_NOSTART | + I2C_FUNC_PROTOCOL_MANGLING)) { + dev_err(&client->dev, + "need i2c bus that supports protocol mangling\n"); + return -ENODEV; + } + + as5011 = kmalloc(sizeof(struct as5011_device), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!as5011 || !input_dev) { + dev_err(&client->dev, + "Can't allocate memory for device structure\n"); + error = -ENOMEM; + goto err_free_mem; + } + + as5011->i2c_client = client; + as5011->input_dev = input_dev; + as5011->button_gpio = plat_data->button_gpio; + as5011->axis_irq = plat_data->axis_irq; + + input_dev->name = "Austria Microsystem as5011 joystick"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_JOYSTICK, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_X, + AS5011_MIN_AXIS, AS5011_MAX_AXIS, AS5011_FUZZ, AS5011_FLAT); + input_set_abs_params(as5011->input_dev, ABS_Y, + AS5011_MIN_AXIS, AS5011_MAX_AXIS, AS5011_FUZZ, AS5011_FLAT); + + error = gpio_request(as5011->button_gpio, "AS5011 button"); + if (error < 0) { + dev_err(&client->dev, "Failed to request button gpio\n"); + goto err_free_mem; + } + + irq = gpio_to_irq(as5011->button_gpio); + if (irq < 0) { + dev_err(&client->dev, + "Failed to get irq number for button gpio\n"); + goto err_free_button_gpio; + } + + as5011->button_irq = irq; + + error = request_threaded_irq(as5011->button_irq, + NULL, as5011_button_interrupt, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "as5011_button", as5011); + if (error < 0) { + dev_err(&client->dev, + "Can't allocate button irq %d\n", as5011->button_irq); + goto err_free_button_gpio; + } + + error = as5011_configure_chip(as5011, plat_data); + if (error) + goto err_free_button_irq; + + error = request_threaded_irq(as5011->axis_irq, NULL, + as5011_axis_interrupt, + plat_data->axis_irqflags | IRQF_ONESHOT, + "as5011_joystick", as5011); + if (error) { + dev_err(&client->dev, + "Can't allocate axis irq %d\n", plat_data->axis_irq); + goto err_free_button_irq; + } + + error = input_register_device(as5011->input_dev); + if (error) { + dev_err(&client->dev, "Failed to register input device\n"); + goto err_free_axis_irq; + } + + i2c_set_clientdata(client, as5011); + + return 0; + +err_free_axis_irq: + free_irq(as5011->axis_irq, as5011); +err_free_button_irq: + free_irq(as5011->button_irq, as5011); +err_free_button_gpio: + gpio_free(as5011->button_gpio); +err_free_mem: + input_free_device(input_dev); + kfree(as5011); + + return error; +} + +static int as5011_remove(struct i2c_client *client) +{ + struct as5011_device *as5011 = i2c_get_clientdata(client); + + free_irq(as5011->axis_irq, as5011); + free_irq(as5011->button_irq, as5011); + gpio_free(as5011->button_gpio); + + input_unregister_device(as5011->input_dev); + kfree(as5011); + + return 0; +} + +static const struct i2c_device_id as5011_id[] = { + { MODULE_DEVICE_ALIAS, 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, as5011_id); + +static struct i2c_driver as5011_driver = { + .driver = { + .name = "as5011", + }, + .probe = as5011_probe, + .remove = as5011_remove, + .id_table = as5011_id, +}; + +module_i2c_driver(as5011_driver); diff --git a/drivers/input/joystick/cobra.c b/drivers/input/joystick/cobra.c new file mode 100644 index 00000000..65367e44 --- /dev/null +++ b/drivers/input/joystick/cobra.c @@ -0,0 +1,264 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * Creative Labs Blaster GamePad Cobra driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Creative Labs Blaster GamePad Cobra driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define COBRA_MAX_STROBE 45 /* 45 us max wait for first strobe */ +#define COBRA_LENGTH 36 + +static int cobra_btn[] = { BTN_START, BTN_SELECT, BTN_TL, BTN_TR, BTN_X, BTN_Y, BTN_Z, BTN_A, BTN_B, BTN_C, BTN_TL2, BTN_TR2, 0 }; + +struct cobra { + struct gameport *gameport; + struct input_dev *dev[2]; + int reads; + int bads; + unsigned char exists; + char phys[2][32]; +}; + +static unsigned char cobra_read_packet(struct gameport *gameport, unsigned int *data) +{ + unsigned long flags; + unsigned char u, v, w; + __u64 buf[2]; + int r[2], t[2]; + int i, j, ret; + + int strobe = gameport_time(gameport, COBRA_MAX_STROBE); + + for (i = 0; i < 2; i++) { + r[i] = buf[i] = 0; + t[i] = COBRA_MAX_STROBE; + } + + local_irq_save(flags); + + u = gameport_read(gameport); + + do { + t[0]--; t[1]--; + v = gameport_read(gameport); + for (i = 0, w = u ^ v; i < 2 && w; i++, w >>= 2) + if (w & 0x30) { + if ((w & 0x30) < 0x30 && r[i] < COBRA_LENGTH && t[i] > 0) { + buf[i] |= (__u64)((w >> 5) & 1) << r[i]++; + t[i] = strobe; + u = v; + } else t[i] = 0; + } + } while (t[0] > 0 || t[1] > 0); + + local_irq_restore(flags); + + ret = 0; + + for (i = 0; i < 2; i++) { + + if (r[i] != COBRA_LENGTH) continue; + + for (j = 0; j < COBRA_LENGTH && (buf[i] & 0x04104107f) ^ 0x041041040; j++) + buf[i] = (buf[i] >> 1) | ((__u64)(buf[i] & 1) << (COBRA_LENGTH - 1)); + + if (j < COBRA_LENGTH) ret |= (1 << i); + + data[i] = ((buf[i] >> 7) & 0x000001f) | ((buf[i] >> 8) & 0x00003e0) + | ((buf[i] >> 9) & 0x0007c00) | ((buf[i] >> 10) & 0x00f8000) + | ((buf[i] >> 11) & 0x1f00000); + + } + + return ret; +} + +static void cobra_poll(struct gameport *gameport) +{ + struct cobra *cobra = gameport_get_drvdata(gameport); + struct input_dev *dev; + unsigned int data[2]; + int i, j, r; + + cobra->reads++; + + if ((r = cobra_read_packet(gameport, data)) != cobra->exists) { + cobra->bads++; + return; + } + + for (i = 0; i < 2; i++) + if (cobra->exists & r & (1 << i)) { + + dev = cobra->dev[i]; + + input_report_abs(dev, ABS_X, ((data[i] >> 4) & 1) - ((data[i] >> 3) & 1)); + input_report_abs(dev, ABS_Y, ((data[i] >> 2) & 1) - ((data[i] >> 1) & 1)); + + for (j = 0; cobra_btn[j]; j++) + input_report_key(dev, cobra_btn[j], data[i] & (0x20 << j)); + + input_sync(dev); + + } +} + +static int cobra_open(struct input_dev *dev) +{ + struct cobra *cobra = input_get_drvdata(dev); + + gameport_start_polling(cobra->gameport); + return 0; +} + +static void cobra_close(struct input_dev *dev) +{ + struct cobra *cobra = input_get_drvdata(dev); + + gameport_stop_polling(cobra->gameport); +} + +static int cobra_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct cobra *cobra; + struct input_dev *input_dev; + unsigned int data[2]; + int i, j; + int err; + + cobra = kzalloc(sizeof(struct cobra), GFP_KERNEL); + if (!cobra) + return -ENOMEM; + + cobra->gameport = gameport; + + gameport_set_drvdata(gameport, cobra); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + cobra->exists = cobra_read_packet(gameport, data); + + for (i = 0; i < 2; i++) + if ((cobra->exists >> i) & data[i] & 1) { + printk(KERN_WARNING "cobra.c: Device %d on %s has the Ext bit set. ID is: %d" + " Contact vojtech@ucw.cz\n", i, gameport->phys, (data[i] >> 2) & 7); + cobra->exists &= ~(1 << i); + } + + if (!cobra->exists) { + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, cobra_poll); + gameport_set_poll_interval(gameport, 20); + + for (i = 0; i < 2; i++) { + if (~(cobra->exists >> i) & 1) + continue; + + cobra->dev[i] = input_dev = input_allocate_device(); + if (!input_dev) { + err = -ENOMEM; + goto fail3; + } + + snprintf(cobra->phys[i], sizeof(cobra->phys[i]), + "%s/input%d", gameport->phys, i); + + input_dev->name = "Creative Labs Blaster GamePad Cobra"; + input_dev->phys = cobra->phys[i]; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_CREATIVE; + input_dev->id.product = 0x0008; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &gameport->dev; + + input_set_drvdata(input_dev, cobra); + + input_dev->open = cobra_open; + input_dev->close = cobra_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_set_abs_params(input_dev, ABS_X, -1, 1, 0, 0); + input_set_abs_params(input_dev, ABS_Y, -1, 1, 0, 0); + for (j = 0; cobra_btn[j]; j++) + set_bit(cobra_btn[j], input_dev->keybit); + + err = input_register_device(cobra->dev[i]); + if (err) + goto fail4; + } + + return 0; + + fail4: input_free_device(cobra->dev[i]); + fail3: while (--i >= 0) + if (cobra->dev[i]) + input_unregister_device(cobra->dev[i]); + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + kfree(cobra); + return err; +} + +static void cobra_disconnect(struct gameport *gameport) +{ + struct cobra *cobra = gameport_get_drvdata(gameport); + int i; + + for (i = 0; i < 2; i++) + if ((cobra->exists >> i) & 1) + input_unregister_device(cobra->dev[i]); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(cobra); +} + +static struct gameport_driver cobra_drv = { + .driver = { + .name = "cobra", + }, + .description = DRIVER_DESC, + .connect = cobra_connect, + .disconnect = cobra_disconnect, +}; + +module_gameport_driver(cobra_drv); diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c new file mode 100644 index 00000000..8e7de5c7 --- /dev/null +++ b/drivers/input/joystick/db9.c @@ -0,0 +1,720 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + * + * Based on the work of: + * Andree Borrmann Mats Sjövall + */ + +/* + * Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Atari, Amstrad, Commodore, Amiga, Sega, etc. joystick driver"); +MODULE_LICENSE("GPL"); + +struct db9_config { + int args[2]; + unsigned int nargs; +}; + +#define DB9_MAX_PORTS 3 +static struct db9_config db9_cfg[DB9_MAX_PORTS] __initdata; + +module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0); +MODULE_PARM_DESC(dev, "Describes first attached device (,)"); +module_param_array_named(dev2, db9_cfg[1].args, int, &db9_cfg[1].nargs, 0); +MODULE_PARM_DESC(dev2, "Describes second attached device (,)"); +module_param_array_named(dev3, db9_cfg[2].args, int, &db9_cfg[2].nargs, 0); +MODULE_PARM_DESC(dev3, "Describes third attached device (,)"); + +#define DB9_ARG_PARPORT 0 +#define DB9_ARG_MODE 1 + +#define DB9_MULTI_STICK 0x01 +#define DB9_MULTI2_STICK 0x02 +#define DB9_GENESIS_PAD 0x03 +#define DB9_GENESIS5_PAD 0x05 +#define DB9_GENESIS6_PAD 0x06 +#define DB9_SATURN_PAD 0x07 +#define DB9_MULTI_0802 0x08 +#define DB9_MULTI_0802_2 0x09 +#define DB9_CD32_PAD 0x0A +#define DB9_SATURN_DPP 0x0B +#define DB9_SATURN_DPP_2 0x0C +#define DB9_MAX_PAD 0x0D + +#define DB9_UP 0x01 +#define DB9_DOWN 0x02 +#define DB9_LEFT 0x04 +#define DB9_RIGHT 0x08 +#define DB9_FIRE1 0x10 +#define DB9_FIRE2 0x20 +#define DB9_FIRE3 0x40 +#define DB9_FIRE4 0x80 + +#define DB9_NORMAL 0x0a +#define DB9_NOSELECT 0x08 + +#define DB9_GENESIS6_DELAY 14 +#define DB9_REFRESH_TIME HZ/100 + +#define DB9_MAX_DEVICES 2 + +struct db9_mode_data { + const char *name; + const short *buttons; + int n_buttons; + int n_pads; + int n_axis; + int bidirectional; + int reverse; +}; + +struct db9 { + struct input_dev *dev[DB9_MAX_DEVICES]; + struct timer_list timer; + struct pardevice *pd; + int mode; + int used; + struct mutex mutex; + char phys[DB9_MAX_DEVICES][32]; +}; + +static struct db9 *db9_base[3]; + +static const short db9_multi_btn[] = { BTN_TRIGGER, BTN_THUMB }; +static const short db9_genesis_btn[] = { BTN_START, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_MODE }; +static const short db9_cd32_btn[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_START }; +static const short db9_abs[] = { ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_RZ, ABS_Z, ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y }; + +static const struct db9_mode_data db9_modes[] = { + { NULL, NULL, 0, 0, 0, 0, 0 }, + { "Multisystem joystick", db9_multi_btn, 1, 1, 2, 1, 1 }, + { "Multisystem joystick (2 fire)", db9_multi_btn, 2, 1, 2, 1, 1 }, + { "Genesis pad", db9_genesis_btn, 4, 1, 2, 1, 1 }, + { NULL, NULL, 0, 0, 0, 0, 0 }, + { "Genesis 5 pad", db9_genesis_btn, 6, 1, 2, 1, 1 }, + { "Genesis 6 pad", db9_genesis_btn, 8, 1, 2, 1, 1 }, + { "Saturn pad", db9_cd32_btn, 9, 6, 7, 0, 1 }, + { "Multisystem (0.8.0.2) joystick", db9_multi_btn, 1, 1, 2, 1, 1 }, + { "Multisystem (0.8.0.2-dual) joystick", db9_multi_btn, 1, 2, 2, 1, 1 }, + { "Amiga CD-32 pad", db9_cd32_btn, 7, 1, 2, 1, 1 }, + { "Saturn dpp", db9_cd32_btn, 9, 6, 7, 0, 0 }, + { "Saturn dpp dual", db9_cd32_btn, 9, 12, 7, 0, 0 }, +}; + +/* + * Saturn controllers + */ +#define DB9_SATURN_DELAY 300 +static const int db9_saturn_byte[] = { 1, 1, 1, 2, 2, 2, 2, 2, 1 }; +static const unsigned char db9_saturn_mask[] = { 0x04, 0x01, 0x02, 0x40, 0x20, 0x10, 0x08, 0x80, 0x08 }; + +/* + * db9_saturn_write_sub() writes 2 bit data. + */ +static void db9_saturn_write_sub(struct parport *port, int type, unsigned char data, int powered, int pwr_sub) +{ + unsigned char c; + + switch (type) { + case 1: /* DPP1 */ + c = 0x80 | 0x30 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | data; + parport_write_data(port, c); + break; + case 2: /* DPP2 */ + c = 0x40 | data << 4 | (powered ? 0x08 : 0) | (pwr_sub ? 0x04 : 0) | 0x03; + parport_write_data(port, c); + break; + case 0: /* DB9 */ + c = ((((data & 2) ? 2 : 0) | ((data & 1) ? 4 : 0)) ^ 0x02) | !powered; + parport_write_control(port, c); + break; + } +} + +/* + * gc_saturn_read_sub() reads 4 bit data. + */ +static unsigned char db9_saturn_read_sub(struct parport *port, int type) +{ + unsigned char data; + + if (type) { + /* DPP */ + data = parport_read_status(port) ^ 0x80; + return (data & 0x80 ? 1 : 0) | (data & 0x40 ? 2 : 0) + | (data & 0x20 ? 4 : 0) | (data & 0x10 ? 8 : 0); + } else { + /* DB9 */ + data = parport_read_data(port) & 0x0f; + return (data & 0x8 ? 1 : 0) | (data & 0x4 ? 2 : 0) + | (data & 0x2 ? 4 : 0) | (data & 0x1 ? 8 : 0); + } +} + +/* + * db9_saturn_read_analog() sends clock and reads 8 bit data. + */ +static unsigned char db9_saturn_read_analog(struct parport *port, int type, int powered) +{ + unsigned char data; + + db9_saturn_write_sub(port, type, 0, powered, 0); + udelay(DB9_SATURN_DELAY); + data = db9_saturn_read_sub(port, type) << 4; + db9_saturn_write_sub(port, type, 2, powered, 0); + udelay(DB9_SATURN_DELAY); + data |= db9_saturn_read_sub(port, type); + return data; +} + +/* + * db9_saturn_read_packet() reads whole saturn packet at connector + * and returns device identifier code. + */ +static unsigned char db9_saturn_read_packet(struct parport *port, unsigned char *data, int type, int powered) +{ + int i, j; + unsigned char tmp; + + db9_saturn_write_sub(port, type, 3, powered, 0); + data[0] = db9_saturn_read_sub(port, type); + switch (data[0] & 0x0f) { + case 0xf: + /* 1111 no pad */ + return data[0] = 0xff; + case 0x4: case 0x4 | 0x8: + /* ?100 : digital controller */ + db9_saturn_write_sub(port, type, 0, powered, 1); + data[2] = db9_saturn_read_sub(port, type) << 4; + db9_saturn_write_sub(port, type, 2, powered, 1); + data[1] = db9_saturn_read_sub(port, type) << 4; + db9_saturn_write_sub(port, type, 1, powered, 1); + data[1] |= db9_saturn_read_sub(port, type); + db9_saturn_write_sub(port, type, 3, powered, 1); + /* data[2] |= db9_saturn_read_sub(port, type); */ + data[2] |= data[0]; + return data[0] = 0x02; + case 0x1: + /* 0001 : analog controller or multitap */ + db9_saturn_write_sub(port, type, 2, powered, 0); + udelay(DB9_SATURN_DELAY); + data[0] = db9_saturn_read_analog(port, type, powered); + if (data[0] != 0x41) { + /* read analog controller */ + for (i = 0; i < (data[0] & 0x0f); i++) + data[i + 1] = db9_saturn_read_analog(port, type, powered); + db9_saturn_write_sub(port, type, 3, powered, 0); + return data[0]; + } else { + /* read multitap */ + if (db9_saturn_read_analog(port, type, powered) != 0x60) + return data[0] = 0xff; + for (i = 0; i < 60; i += 10) { + data[i] = db9_saturn_read_analog(port, type, powered); + if (data[i] != 0xff) + /* read each pad */ + for (j = 0; j < (data[i] & 0x0f); j++) + data[i + j + 1] = db9_saturn_read_analog(port, type, powered); + } + db9_saturn_write_sub(port, type, 3, powered, 0); + return 0x41; + } + case 0x0: + /* 0000 : mouse */ + db9_saturn_write_sub(port, type, 2, powered, 0); + udelay(DB9_SATURN_DELAY); + tmp = db9_saturn_read_analog(port, type, powered); + if (tmp == 0xff) { + for (i = 0; i < 3; i++) + data[i + 1] = db9_saturn_read_analog(port, type, powered); + db9_saturn_write_sub(port, type, 3, powered, 0); + return data[0] = 0xe3; + } + default: + return data[0]; + } +} + +/* + * db9_saturn_report() analyzes packet and reports. + */ +static int db9_saturn_report(unsigned char id, unsigned char data[60], struct input_dev *devs[], int n, int max_pads) +{ + struct input_dev *dev; + int tmp, i, j; + + tmp = (id == 0x41) ? 60 : 10; + for (j = 0; j < tmp && n < max_pads; j += 10, n++) { + dev = devs[n]; + switch (data[j]) { + case 0x16: /* multi controller (analog 4 axis) */ + input_report_abs(dev, db9_abs[5], data[j + 6]); + case 0x15: /* mission stick (analog 3 axis) */ + input_report_abs(dev, db9_abs[3], data[j + 4]); + input_report_abs(dev, db9_abs[4], data[j + 5]); + case 0x13: /* racing controller (analog 1 axis) */ + input_report_abs(dev, db9_abs[2], data[j + 3]); + case 0x34: /* saturn keyboard (udlr ZXC ASD QE Esc) */ + case 0x02: /* digital pad (digital 2 axis + buttons) */ + input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); + input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); + for (i = 0; i < 9; i++) + input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); + break; + case 0x19: /* mission stick x2 (analog 6 axis + buttons) */ + input_report_abs(dev, db9_abs[0], !(data[j + 1] & 128) - !(data[j + 1] & 64)); + input_report_abs(dev, db9_abs[1], !(data[j + 1] & 32) - !(data[j + 1] & 16)); + for (i = 0; i < 9; i++) + input_report_key(dev, db9_cd32_btn[i], ~data[j + db9_saturn_byte[i]] & db9_saturn_mask[i]); + input_report_abs(dev, db9_abs[2], data[j + 3]); + input_report_abs(dev, db9_abs[3], data[j + 4]); + input_report_abs(dev, db9_abs[4], data[j + 5]); + /* + input_report_abs(dev, db9_abs[8], (data[j + 6] & 128 ? 0 : 1) - (data[j + 6] & 64 ? 0 : 1)); + input_report_abs(dev, db9_abs[9], (data[j + 6] & 32 ? 0 : 1) - (data[j + 6] & 16 ? 0 : 1)); + */ + input_report_abs(dev, db9_abs[6], data[j + 7]); + input_report_abs(dev, db9_abs[7], data[j + 8]); + input_report_abs(dev, db9_abs[5], data[j + 9]); + break; + case 0xd3: /* sankyo ff (analog 1 axis + stop btn) */ + input_report_key(dev, BTN_A, data[j + 3] & 0x80); + input_report_abs(dev, db9_abs[2], data[j + 3] & 0x7f); + break; + case 0xe3: /* shuttle mouse (analog 2 axis + buttons. signed value) */ + input_report_key(dev, BTN_START, data[j + 1] & 0x08); + input_report_key(dev, BTN_A, data[j + 1] & 0x04); + input_report_key(dev, BTN_C, data[j + 1] & 0x02); + input_report_key(dev, BTN_B, data[j + 1] & 0x01); + input_report_abs(dev, db9_abs[2], data[j + 2] ^ 0x80); + input_report_abs(dev, db9_abs[3], (0xff-(data[j + 3] ^ 0x80))+1); /* */ + break; + case 0xff: + default: /* no pad */ + input_report_abs(dev, db9_abs[0], 0); + input_report_abs(dev, db9_abs[1], 0); + for (i = 0; i < 9; i++) + input_report_key(dev, db9_cd32_btn[i], 0); + break; + } + } + return n; +} + +static int db9_saturn(int mode, struct parport *port, struct input_dev *devs[]) +{ + unsigned char id, data[60]; + int type, n, max_pads; + int tmp, i; + + switch (mode) { + case DB9_SATURN_PAD: + type = 0; + n = 1; + break; + case DB9_SATURN_DPP: + type = 1; + n = 1; + break; + case DB9_SATURN_DPP_2: + type = 1; + n = 2; + break; + default: + return -1; + } + max_pads = min(db9_modes[mode].n_pads, DB9_MAX_DEVICES); + for (tmp = 0, i = 0; i < n; i++) { + id = db9_saturn_read_packet(port, data, type + i, 1); + tmp = db9_saturn_report(id, data, devs, tmp, max_pads); + } + return 0; +} + +static void db9_timer(unsigned long private) +{ + struct db9 *db9 = (void *) private; + struct parport *port = db9->pd->port; + struct input_dev *dev = db9->dev[0]; + struct input_dev *dev2 = db9->dev[1]; + int data, i; + + switch (db9->mode) { + case DB9_MULTI_0802_2: + + data = parport_read_data(port) >> 3; + + input_report_abs(dev2, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev2, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev2, BTN_TRIGGER, ~data & DB9_FIRE1); + + case DB9_MULTI_0802: + + data = parport_read_status(port) >> 3; + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev, BTN_TRIGGER, data & DB9_FIRE1); + break; + + case DB9_MULTI_STICK: + + data = parport_read_data(port); + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev, BTN_TRIGGER, ~data & DB9_FIRE1); + break; + + case DB9_MULTI2_STICK: + + data = parport_read_data(port); + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev, BTN_TRIGGER, ~data & DB9_FIRE1); + input_report_key(dev, BTN_THUMB, ~data & DB9_FIRE2); + break; + + case DB9_GENESIS_PAD: + + parport_write_control(port, DB9_NOSELECT); + data = parport_read_data(port); + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev, BTN_B, ~data & DB9_FIRE1); + input_report_key(dev, BTN_C, ~data & DB9_FIRE2); + + parport_write_control(port, DB9_NORMAL); + data = parport_read_data(port); + + input_report_key(dev, BTN_A, ~data & DB9_FIRE1); + input_report_key(dev, BTN_START, ~data & DB9_FIRE2); + break; + + case DB9_GENESIS5_PAD: + + parport_write_control(port, DB9_NOSELECT); + data = parport_read_data(port); + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev, BTN_B, ~data & DB9_FIRE1); + input_report_key(dev, BTN_C, ~data & DB9_FIRE2); + + parport_write_control(port, DB9_NORMAL); + data = parport_read_data(port); + + input_report_key(dev, BTN_A, ~data & DB9_FIRE1); + input_report_key(dev, BTN_X, ~data & DB9_FIRE2); + input_report_key(dev, BTN_Y, ~data & DB9_LEFT); + input_report_key(dev, BTN_START, ~data & DB9_RIGHT); + break; + + case DB9_GENESIS6_PAD: + + parport_write_control(port, DB9_NOSELECT); /* 1 */ + udelay(DB9_GENESIS6_DELAY); + data = parport_read_data(port); + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + input_report_key(dev, BTN_B, ~data & DB9_FIRE1); + input_report_key(dev, BTN_C, ~data & DB9_FIRE2); + + parport_write_control(port, DB9_NORMAL); + udelay(DB9_GENESIS6_DELAY); + data = parport_read_data(port); + + input_report_key(dev, BTN_A, ~data & DB9_FIRE1); + input_report_key(dev, BTN_START, ~data & DB9_FIRE2); + + parport_write_control(port, DB9_NOSELECT); /* 2 */ + udelay(DB9_GENESIS6_DELAY); + parport_write_control(port, DB9_NORMAL); + udelay(DB9_GENESIS6_DELAY); + parport_write_control(port, DB9_NOSELECT); /* 3 */ + udelay(DB9_GENESIS6_DELAY); + data=parport_read_data(port); + + input_report_key(dev, BTN_X, ~data & DB9_LEFT); + input_report_key(dev, BTN_Y, ~data & DB9_DOWN); + input_report_key(dev, BTN_Z, ~data & DB9_UP); + input_report_key(dev, BTN_MODE, ~data & DB9_RIGHT); + + parport_write_control(port, DB9_NORMAL); + udelay(DB9_GENESIS6_DELAY); + parport_write_control(port, DB9_NOSELECT); /* 4 */ + udelay(DB9_GENESIS6_DELAY); + parport_write_control(port, DB9_NORMAL); + break; + + case DB9_SATURN_PAD: + case DB9_SATURN_DPP: + case DB9_SATURN_DPP_2: + + db9_saturn(db9->mode, port, db9->dev); + break; + + case DB9_CD32_PAD: + + data = parport_read_data(port); + + input_report_abs(dev, ABS_X, (data & DB9_RIGHT ? 0 : 1) - (data & DB9_LEFT ? 0 : 1)); + input_report_abs(dev, ABS_Y, (data & DB9_DOWN ? 0 : 1) - (data & DB9_UP ? 0 : 1)); + + parport_write_control(port, 0x0a); + + for (i = 0; i < 7; i++) { + data = parport_read_data(port); + parport_write_control(port, 0x02); + parport_write_control(port, 0x0a); + input_report_key(dev, db9_cd32_btn[i], ~data & DB9_FIRE2); + } + + parport_write_control(port, 0x00); + break; + } + + input_sync(dev); + + mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME); +} + +static int db9_open(struct input_dev *dev) +{ + struct db9 *db9 = input_get_drvdata(dev); + struct parport *port = db9->pd->port; + int err; + + err = mutex_lock_interruptible(&db9->mutex); + if (err) + return err; + + if (!db9->used++) { + parport_claim(db9->pd); + parport_write_data(port, 0xff); + if (db9_modes[db9->mode].reverse) { + parport_data_reverse(port); + parport_write_control(port, DB9_NORMAL); + } + mod_timer(&db9->timer, jiffies + DB9_REFRESH_TIME); + } + + mutex_unlock(&db9->mutex); + return 0; +} + +static void db9_close(struct input_dev *dev) +{ + struct db9 *db9 = input_get_drvdata(dev); + struct parport *port = db9->pd->port; + + mutex_lock(&db9->mutex); + if (!--db9->used) { + del_timer_sync(&db9->timer); + parport_write_control(port, 0x00); + parport_data_forward(port); + parport_release(db9->pd); + } + mutex_unlock(&db9->mutex); +} + +static struct db9 __init *db9_probe(int parport, int mode) +{ + struct db9 *db9; + const struct db9_mode_data *db9_mode; + struct parport *pp; + struct pardevice *pd; + struct input_dev *input_dev; + int i, j; + int err; + + if (mode < 1 || mode >= DB9_MAX_PAD || !db9_modes[mode].n_buttons) { + printk(KERN_ERR "db9.c: Bad device type %d\n", mode); + err = -EINVAL; + goto err_out; + } + + db9_mode = &db9_modes[mode]; + + pp = parport_find_number(parport); + if (!pp) { + printk(KERN_ERR "db9.c: no such parport\n"); + err = -ENODEV; + goto err_out; + } + + if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) { + printk(KERN_ERR "db9.c: specified parport is not bidirectional\n"); + err = -EINVAL; + goto err_put_pp; + } + + pd = parport_register_device(pp, "db9", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); + if (!pd) { + printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n"); + err = -EBUSY; + goto err_put_pp; + } + + db9 = kzalloc(sizeof(struct db9), GFP_KERNEL); + if (!db9) { + printk(KERN_ERR "db9.c: Not enough memory\n"); + err = -ENOMEM; + goto err_unreg_pardev; + } + + mutex_init(&db9->mutex); + db9->pd = pd; + db9->mode = mode; + init_timer(&db9->timer); + db9->timer.data = (long) db9; + db9->timer.function = db9_timer; + + for (i = 0; i < (min(db9_mode->n_pads, DB9_MAX_DEVICES)); i++) { + + db9->dev[i] = input_dev = input_allocate_device(); + if (!input_dev) { + printk(KERN_ERR "db9.c: Not enough memory for input device\n"); + err = -ENOMEM; + goto err_unreg_devs; + } + + snprintf(db9->phys[i], sizeof(db9->phys[i]), + "%s/input%d", db9->pd->port->name, i); + + input_dev->name = db9_mode->name; + input_dev->phys = db9->phys[i]; + input_dev->id.bustype = BUS_PARPORT; + input_dev->id.vendor = 0x0002; + input_dev->id.product = mode; + input_dev->id.version = 0x0100; + + input_set_drvdata(input_dev, db9); + + input_dev->open = db9_open; + input_dev->close = db9_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + for (j = 0; j < db9_mode->n_buttons; j++) + set_bit(db9_mode->buttons[j], input_dev->keybit); + for (j = 0; j < db9_mode->n_axis; j++) { + if (j < 2) + input_set_abs_params(input_dev, db9_abs[j], -1, 1, 0, 0); + else + input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0); + } + + err = input_register_device(input_dev); + if (err) + goto err_free_dev; + } + + parport_put_port(pp); + return db9; + + err_free_dev: + input_free_device(db9->dev[i]); + err_unreg_devs: + while (--i >= 0) + input_unregister_device(db9->dev[i]); + kfree(db9); + err_unreg_pardev: + parport_unregister_device(pd); + err_put_pp: + parport_put_port(pp); + err_out: + return ERR_PTR(err); +} + +static void db9_remove(struct db9 *db9) +{ + int i; + + for (i = 0; i < min(db9_modes[db9->mode].n_pads, DB9_MAX_DEVICES); i++) + input_unregister_device(db9->dev[i]); + parport_unregister_device(db9->pd); + kfree(db9); +} + +static int __init db9_init(void) +{ + int i; + int have_dev = 0; + int err = 0; + + for (i = 0; i < DB9_MAX_PORTS; i++) { + if (db9_cfg[i].nargs == 0 || db9_cfg[i].args[DB9_ARG_PARPORT] < 0) + continue; + + if (db9_cfg[i].nargs < 2) { + printk(KERN_ERR "db9.c: Device type must be specified.\n"); + err = -EINVAL; + break; + } + + db9_base[i] = db9_probe(db9_cfg[i].args[DB9_ARG_PARPORT], + db9_cfg[i].args[DB9_ARG_MODE]); + if (IS_ERR(db9_base[i])) { + err = PTR_ERR(db9_base[i]); + break; + } + + have_dev = 1; + } + + if (err) { + while (--i >= 0) + if (db9_base[i]) + db9_remove(db9_base[i]); + return err; + } + + return have_dev ? 0 : -ENODEV; +} + +static void __exit db9_exit(void) +{ + int i; + + for (i = 0; i < DB9_MAX_PORTS; i++) + if (db9_base[i]) + db9_remove(db9_base[i]); +} + +module_init(db9_init); +module_exit(db9_exit); diff --git a/drivers/input/joystick/gamecon.c b/drivers/input/joystick/gamecon.c new file mode 100644 index 00000000..e68e4978 --- /dev/null +++ b/drivers/input/joystick/gamecon.c @@ -0,0 +1,1054 @@ +/* + * NES, SNES, N64, MultiSystem, PSX gamepad driver for Linux + * + * Copyright (c) 1999-2004 Vojtech Pavlik + * Copyright (c) 2004 Peter Nelson + * + * Based on the work of: + * Andree Borrmann John Dahlstrom + * David Kuder Nathan Hand + * Raphael Assenat + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("NES, SNES, N64, MultiSystem, PSX gamepad driver"); +MODULE_LICENSE("GPL"); + +#define GC_MAX_PORTS 3 +#define GC_MAX_DEVICES 5 + +struct gc_config { + int args[GC_MAX_DEVICES + 1]; + unsigned int nargs; +}; + +static struct gc_config gc_cfg[GC_MAX_PORTS] __initdata; + +module_param_array_named(map, gc_cfg[0].args, int, &gc_cfg[0].nargs, 0); +MODULE_PARM_DESC(map, "Describes first set of devices (,,,..)"); +module_param_array_named(map2, gc_cfg[1].args, int, &gc_cfg[1].nargs, 0); +MODULE_PARM_DESC(map2, "Describes second set of devices"); +module_param_array_named(map3, gc_cfg[2].args, int, &gc_cfg[2].nargs, 0); +MODULE_PARM_DESC(map3, "Describes third set of devices"); + +/* see also gs_psx_delay parameter in PSX support section */ + +enum gc_type { + GC_NONE = 0, + GC_SNES, + GC_NES, + GC_NES4, + GC_MULTI, + GC_MULTI2, + GC_N64, + GC_PSX, + GC_DDR, + GC_SNESMOUSE, + GC_MAX +}; + +#define GC_REFRESH_TIME HZ/100 + +struct gc_pad { + struct input_dev *dev; + enum gc_type type; + char phys[32]; +}; + +struct gc { + struct pardevice *pd; + struct gc_pad pads[GC_MAX_DEVICES]; + struct timer_list timer; + int pad_count[GC_MAX]; + int used; + struct mutex mutex; +}; + +struct gc_subdev { + unsigned int idx; +}; + +static struct gc *gc_base[3]; + +static const int gc_status_bit[] = { 0x40, 0x80, 0x20, 0x10, 0x08 }; + +static const char *gc_names[] = { + NULL, "SNES pad", "NES pad", "NES FourPort", "Multisystem joystick", + "Multisystem 2-button joystick", "N64 controller", "PSX controller", + "PSX DDR controller", "SNES mouse" +}; + +/* + * N64 support. + */ + +static const unsigned char gc_n64_bytes[] = { 0, 1, 13, 15, 14, 12, 10, 11, 2, 3 }; +static const short gc_n64_btn[] = { + BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, + BTN_TL, BTN_TR, BTN_TRIGGER, BTN_START +}; + +#define GC_N64_LENGTH 32 /* N64 bit length, not including stop bit */ +#define GC_N64_STOP_LENGTH 5 /* Length of encoded stop bit */ +#define GC_N64_CMD_00 0x11111111UL +#define GC_N64_CMD_01 0xd1111111UL +#define GC_N64_CMD_03 0xdd111111UL +#define GC_N64_CMD_1b 0xdd1dd111UL +#define GC_N64_CMD_c0 0x111111ddUL +#define GC_N64_CMD_80 0x1111111dUL +#define GC_N64_STOP_BIT 0x1d /* Encoded stop bit */ +#define GC_N64_REQUEST_DATA GC_N64_CMD_01 /* the request data command */ +#define GC_N64_DELAY 133 /* delay between transmit request, and response ready (us) */ +#define GC_N64_DWS 3 /* delay between write segments (required for sound playback because of ISA DMA) */ + /* GC_N64_DWS > 24 is known to fail */ +#define GC_N64_POWER_W 0xe2 /* power during write (transmit request) */ +#define GC_N64_POWER_R 0xfd /* power during read */ +#define GC_N64_OUT 0x1d /* output bits to the 4 pads */ + /* Reading the main axes of any N64 pad is known to fail if the corresponding bit */ + /* in GC_N64_OUT is pulled low on the output port (by any routine) for more */ + /* than 123 us */ +#define GC_N64_CLOCK 0x02 /* clock bits for read */ + +/* + * Used for rumble code. + */ + +/* Send encoded command */ +static void gc_n64_send_command(struct gc *gc, unsigned long cmd, + unsigned char target) +{ + struct parport *port = gc->pd->port; + int i; + + for (i = 0; i < GC_N64_LENGTH; i++) { + unsigned char data = (cmd >> i) & 1 ? target : 0; + parport_write_data(port, GC_N64_POWER_W | data); + udelay(GC_N64_DWS); + } +} + +/* Send stop bit */ +static void gc_n64_send_stop_bit(struct gc *gc, unsigned char target) +{ + struct parport *port = gc->pd->port; + int i; + + for (i = 0; i < GC_N64_STOP_LENGTH; i++) { + unsigned char data = (GC_N64_STOP_BIT >> i) & 1 ? target : 0; + parport_write_data(port, GC_N64_POWER_W | data); + udelay(GC_N64_DWS); + } +} + +/* + * gc_n64_read_packet() reads an N64 packet. + * Each pad uses one bit per byte. So all pads connected to this port + * are read in parallel. + */ + +static void gc_n64_read_packet(struct gc *gc, unsigned char *data) +{ + int i; + unsigned long flags; + +/* + * Request the pad to transmit data + */ + + local_irq_save(flags); + gc_n64_send_command(gc, GC_N64_REQUEST_DATA, GC_N64_OUT); + gc_n64_send_stop_bit(gc, GC_N64_OUT); + local_irq_restore(flags); + +/* + * Wait for the pad response to be loaded into the 33-bit register + * of the adapter. + */ + + udelay(GC_N64_DELAY); + +/* + * Grab data (ignoring the last bit, which is a stop bit) + */ + + for (i = 0; i < GC_N64_LENGTH; i++) { + parport_write_data(gc->pd->port, GC_N64_POWER_R); + udelay(2); + data[i] = parport_read_status(gc->pd->port); + parport_write_data(gc->pd->port, GC_N64_POWER_R | GC_N64_CLOCK); + } + +/* + * We must wait 200 ms here for the controller to reinitialize before + * the next read request. No worries as long as gc_read is polled less + * frequently than this. + */ + +} + +static void gc_n64_process_packet(struct gc *gc) +{ + unsigned char data[GC_N64_LENGTH]; + struct input_dev *dev; + int i, j, s; + signed char x, y; + + gc_n64_read_packet(gc, data); + + for (i = 0; i < GC_MAX_DEVICES; i++) { + + if (gc->pads[i].type != GC_N64) + continue; + + dev = gc->pads[i].dev; + s = gc_status_bit[i]; + + if (s & ~(data[8] | data[9])) { + + x = y = 0; + + for (j = 0; j < 8; j++) { + if (data[23 - j] & s) + x |= 1 << j; + if (data[31 - j] & s) + y |= 1 << j; + } + + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, -y); + + input_report_abs(dev, ABS_HAT0X, + !(s & data[6]) - !(s & data[7])); + input_report_abs(dev, ABS_HAT0Y, + !(s & data[4]) - !(s & data[5])); + + for (j = 0; j < 10; j++) + input_report_key(dev, gc_n64_btn[j], + s & data[gc_n64_bytes[j]]); + + input_sync(dev); + } + } +} + +static int gc_n64_play_effect(struct input_dev *dev, void *data, + struct ff_effect *effect) +{ + int i; + unsigned long flags; + struct gc *gc = input_get_drvdata(dev); + struct gc_subdev *sdev = data; + unsigned char target = 1 << sdev->idx; /* select desired pin */ + + if (effect->type == FF_RUMBLE) { + struct ff_rumble_effect *rumble = &effect->u.rumble; + unsigned int cmd = + rumble->strong_magnitude || rumble->weak_magnitude ? + GC_N64_CMD_01 : GC_N64_CMD_00; + + local_irq_save(flags); + + /* Init Rumble - 0x03, 0x80, 0x01, (34)0x80 */ + gc_n64_send_command(gc, GC_N64_CMD_03, target); + gc_n64_send_command(gc, GC_N64_CMD_80, target); + gc_n64_send_command(gc, GC_N64_CMD_01, target); + for (i = 0; i < 32; i++) + gc_n64_send_command(gc, GC_N64_CMD_80, target); + gc_n64_send_stop_bit(gc, target); + + udelay(GC_N64_DELAY); + + /* Now start or stop it - 0x03, 0xc0, 0zx1b, (32)0x01/0x00 */ + gc_n64_send_command(gc, GC_N64_CMD_03, target); + gc_n64_send_command(gc, GC_N64_CMD_c0, target); + gc_n64_send_command(gc, GC_N64_CMD_1b, target); + for (i = 0; i < 32; i++) + gc_n64_send_command(gc, cmd, target); + gc_n64_send_stop_bit(gc, target); + + local_irq_restore(flags); + + } + + return 0; +} + +static int __init gc_n64_init_ff(struct input_dev *dev, int i) +{ + struct gc_subdev *sdev; + int err; + + sdev = kmalloc(sizeof(*sdev), GFP_KERNEL); + if (!sdev) + return -ENOMEM; + + sdev->idx = i; + + input_set_capability(dev, EV_FF, FF_RUMBLE); + + err = input_ff_create_memless(dev, sdev, gc_n64_play_effect); + if (err) { + kfree(sdev); + return err; + } + + return 0; +} + +/* + * NES/SNES support. + */ + +#define GC_NES_DELAY 6 /* Delay between bits - 6us */ +#define GC_NES_LENGTH 8 /* The NES pads use 8 bits of data */ +#define GC_SNES_LENGTH 12 /* The SNES true length is 16, but the + last 4 bits are unused */ +#define GC_SNESMOUSE_LENGTH 32 /* The SNES mouse uses 32 bits, the first + 16 bits are equivalent to a gamepad */ + +#define GC_NES_POWER 0xfc +#define GC_NES_CLOCK 0x01 +#define GC_NES_LATCH 0x02 + +static const unsigned char gc_nes_bytes[] = { 0, 1, 2, 3 }; +static const unsigned char gc_snes_bytes[] = { 8, 0, 2, 3, 9, 1, 10, 11 }; +static const short gc_snes_btn[] = { + BTN_A, BTN_B, BTN_SELECT, BTN_START, BTN_X, BTN_Y, BTN_TL, BTN_TR +}; + +/* + * gc_nes_read_packet() reads a NES/SNES packet. + * Each pad uses one bit per byte. So all pads connected to + * this port are read in parallel. + */ + +static void gc_nes_read_packet(struct gc *gc, int length, unsigned char *data) +{ + int i; + + parport_write_data(gc->pd->port, GC_NES_POWER | GC_NES_CLOCK | GC_NES_LATCH); + udelay(GC_NES_DELAY * 2); + parport_write_data(gc->pd->port, GC_NES_POWER | GC_NES_CLOCK); + + for (i = 0; i < length; i++) { + udelay(GC_NES_DELAY); + parport_write_data(gc->pd->port, GC_NES_POWER); + data[i] = parport_read_status(gc->pd->port) ^ 0x7f; + udelay(GC_NES_DELAY); + parport_write_data(gc->pd->port, GC_NES_POWER | GC_NES_CLOCK); + } +} + +static void gc_nes_process_packet(struct gc *gc) +{ + unsigned char data[GC_SNESMOUSE_LENGTH]; + struct gc_pad *pad; + struct input_dev *dev; + int i, j, s, len; + char x_rel, y_rel; + + len = gc->pad_count[GC_SNESMOUSE] ? GC_SNESMOUSE_LENGTH : + (gc->pad_count[GC_SNES] ? GC_SNES_LENGTH : GC_NES_LENGTH); + + gc_nes_read_packet(gc, len, data); + + for (i = 0; i < GC_MAX_DEVICES; i++) { + + pad = &gc->pads[i]; + dev = pad->dev; + s = gc_status_bit[i]; + + switch (pad->type) { + + case GC_NES: + + input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); + input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); + + for (j = 0; j < 4; j++) + input_report_key(dev, gc_snes_btn[j], + s & data[gc_nes_bytes[j]]); + input_sync(dev); + break; + + case GC_SNES: + + input_report_abs(dev, ABS_X, !(s & data[6]) - !(s & data[7])); + input_report_abs(dev, ABS_Y, !(s & data[4]) - !(s & data[5])); + + for (j = 0; j < 8; j++) + input_report_key(dev, gc_snes_btn[j], + s & data[gc_snes_bytes[j]]); + input_sync(dev); + break; + + case GC_SNESMOUSE: + /* + * The 4 unused bits from SNES controllers appear + * to be ID bits so use them to make sure we are + * dealing with a mouse. + * gamepad is connected. This is important since + * my SNES gamepad sends 1's for bits 16-31, which + * cause the mouse pointer to quickly move to the + * upper left corner of the screen. + */ + if (!(s & data[12]) && !(s & data[13]) && + !(s & data[14]) && (s & data[15])) { + input_report_key(dev, BTN_LEFT, s & data[9]); + input_report_key(dev, BTN_RIGHT, s & data[8]); + + x_rel = y_rel = 0; + for (j = 0; j < 7; j++) { + x_rel <<= 1; + if (data[25 + j] & s) + x_rel |= 1; + + y_rel <<= 1; + if (data[17 + j] & s) + y_rel |= 1; + } + + if (x_rel) { + if (data[24] & s) + x_rel = -x_rel; + input_report_rel(dev, REL_X, x_rel); + } + + if (y_rel) { + if (data[16] & s) + y_rel = -y_rel; + input_report_rel(dev, REL_Y, y_rel); + } + + input_sync(dev); + } + break; + + default: + break; + } + } +} + +/* + * Multisystem joystick support + */ + +#define GC_MULTI_LENGTH 5 /* Multi system joystick packet length is 5 */ +#define GC_MULTI2_LENGTH 6 /* One more bit for one more button */ + +/* + * gc_multi_read_packet() reads a Multisystem joystick packet. + */ + +static void gc_multi_read_packet(struct gc *gc, int length, unsigned char *data) +{ + int i; + + for (i = 0; i < length; i++) { + parport_write_data(gc->pd->port, ~(1 << i)); + data[i] = parport_read_status(gc->pd->port) ^ 0x7f; + } +} + +static void gc_multi_process_packet(struct gc *gc) +{ + unsigned char data[GC_MULTI2_LENGTH]; + int data_len = gc->pad_count[GC_MULTI2] ? GC_MULTI2_LENGTH : GC_MULTI_LENGTH; + struct gc_pad *pad; + struct input_dev *dev; + int i, s; + + gc_multi_read_packet(gc, data_len, data); + + for (i = 0; i < GC_MAX_DEVICES; i++) { + pad = &gc->pads[i]; + dev = pad->dev; + s = gc_status_bit[i]; + + switch (pad->type) { + case GC_MULTI2: + input_report_key(dev, BTN_THUMB, s & data[5]); + /* fall through */ + + case GC_MULTI: + input_report_abs(dev, ABS_X, + !(s & data[2]) - !(s & data[3])); + input_report_abs(dev, ABS_Y, + !(s & data[0]) - !(s & data[1])); + input_report_key(dev, BTN_TRIGGER, s & data[4]); + input_sync(dev); + break; + + default: + break; + } + } +} + +/* + * PSX support + * + * See documentation at: + * http://www.geocities.co.jp/Playtown/2004/psx/ps_eng.txt + * http://www.gamesx.com/controldata/psxcont/psxcont.htm + * + */ + +#define GC_PSX_DELAY 25 /* 25 usec */ +#define GC_PSX_LENGTH 8 /* talk to the controller in bits */ +#define GC_PSX_BYTES 6 /* the maximum number of bytes to read off the controller */ + +#define GC_PSX_MOUSE 1 /* Mouse */ +#define GC_PSX_NEGCON 2 /* NegCon */ +#define GC_PSX_NORMAL 4 /* Digital / Analog or Rumble in Digital mode */ +#define GC_PSX_ANALOG 5 /* Analog in Analog mode / Rumble in Green mode */ +#define GC_PSX_RUMBLE 7 /* Rumble in Red mode */ + +#define GC_PSX_CLOCK 0x04 /* Pin 4 */ +#define GC_PSX_COMMAND 0x01 /* Pin 2 */ +#define GC_PSX_POWER 0xf8 /* Pins 5-9 */ +#define GC_PSX_SELECT 0x02 /* Pin 3 */ + +#define GC_PSX_ID(x) ((x) >> 4) /* High nibble is device type */ +#define GC_PSX_LEN(x) (((x) & 0xf) << 1) /* Low nibble is length in bytes/2 */ + +static int gc_psx_delay = GC_PSX_DELAY; +module_param_named(psx_delay, gc_psx_delay, uint, 0); +MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)"); + +static const short gc_psx_abs[] = { + ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_HAT0X, ABS_HAT0Y +}; +static const short gc_psx_btn[] = { + BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_A, BTN_B, BTN_X, BTN_Y, + BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR +}; +static const short gc_psx_ddr_btn[] = { BTN_0, BTN_1, BTN_2, BTN_3 }; + +/* + * gc_psx_command() writes 8bit command and reads 8bit data from + * the psx pad. + */ + +static void gc_psx_command(struct gc *gc, int b, unsigned char *data) +{ + struct parport *port = gc->pd->port; + int i, j, cmd, read; + + memset(data, 0, GC_MAX_DEVICES); + + for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) { + cmd = (b & 1) ? GC_PSX_COMMAND : 0; + parport_write_data(port, cmd | GC_PSX_POWER); + udelay(gc_psx_delay); + + read = parport_read_status(port) ^ 0x80; + + for (j = 0; j < GC_MAX_DEVICES; j++) { + struct gc_pad *pad = &gc->pads[j]; + + if (pad->type == GC_PSX || pad->type == GC_DDR) + data[j] |= (read & gc_status_bit[j]) ? (1 << i) : 0; + } + + parport_write_data(gc->pd->port, cmd | GC_PSX_CLOCK | GC_PSX_POWER); + udelay(gc_psx_delay); + } +} + +/* + * gc_psx_read_packet() reads a whole psx packet and returns + * device identifier code. + */ + +static void gc_psx_read_packet(struct gc *gc, + unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES], + unsigned char id[GC_MAX_DEVICES]) +{ + int i, j, max_len = 0; + unsigned long flags; + unsigned char data2[GC_MAX_DEVICES]; + + /* Select pad */ + parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); + udelay(gc_psx_delay); + /* Deselect, begin command */ + parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_POWER); + udelay(gc_psx_delay); + + local_irq_save(flags); + + gc_psx_command(gc, 0x01, data2); /* Access pad */ + gc_psx_command(gc, 0x42, id); /* Get device ids */ + gc_psx_command(gc, 0, data2); /* Dump status */ + + /* Find the longest pad */ + for (i = 0; i < GC_MAX_DEVICES; i++) { + struct gc_pad *pad = &gc->pads[i]; + + if ((pad->type == GC_PSX || pad->type == GC_DDR) && + GC_PSX_LEN(id[i]) > max_len && + GC_PSX_LEN(id[i]) <= GC_PSX_BYTES) { + max_len = GC_PSX_LEN(id[i]); + } + } + + /* Read in all the data */ + for (i = 0; i < max_len; i++) { + gc_psx_command(gc, 0, data2); + for (j = 0; j < GC_MAX_DEVICES; j++) + data[j][i] = data2[j]; + } + + local_irq_restore(flags); + + parport_write_data(gc->pd->port, GC_PSX_CLOCK | GC_PSX_SELECT | GC_PSX_POWER); + + /* Set id's to the real value */ + for (i = 0; i < GC_MAX_DEVICES; i++) + id[i] = GC_PSX_ID(id[i]); +} + +static void gc_psx_report_one(struct gc_pad *pad, unsigned char psx_type, + unsigned char *data) +{ + struct input_dev *dev = pad->dev; + int i; + + switch (psx_type) { + + case GC_PSX_RUMBLE: + + input_report_key(dev, BTN_THUMBL, ~data[0] & 0x04); + input_report_key(dev, BTN_THUMBR, ~data[0] & 0x02); + + case GC_PSX_NEGCON: + case GC_PSX_ANALOG: + + if (pad->type == GC_DDR) { + for (i = 0; i < 4; i++) + input_report_key(dev, gc_psx_ddr_btn[i], + ~data[0] & (0x10 << i)); + } else { + for (i = 0; i < 4; i++) + input_report_abs(dev, gc_psx_abs[i + 2], + data[i + 2]); + + input_report_abs(dev, ABS_X, + !!(data[0] & 0x80) * 128 + !(data[0] & 0x20) * 127); + input_report_abs(dev, ABS_Y, + !!(data[0] & 0x10) * 128 + !(data[0] & 0x40) * 127); + } + + for (i = 0; i < 8; i++) + input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i)); + + input_report_key(dev, BTN_START, ~data[0] & 0x08); + input_report_key(dev, BTN_SELECT, ~data[0] & 0x01); + + input_sync(dev); + + break; + + case GC_PSX_NORMAL: + + if (pad->type == GC_DDR) { + for (i = 0; i < 4; i++) + input_report_key(dev, gc_psx_ddr_btn[i], + ~data[0] & (0x10 << i)); + } else { + input_report_abs(dev, ABS_X, + !!(data[0] & 0x80) * 128 + !(data[0] & 0x20) * 127); + input_report_abs(dev, ABS_Y, + !!(data[0] & 0x10) * 128 + !(data[0] & 0x40) * 127); + + /* + * For some reason if the extra axes are left unset + * they drift. + * for (i = 0; i < 4; i++) + input_report_abs(dev, gc_psx_abs[i + 2], 128); + * This needs to be debugged properly, + * maybe fuzz processing needs to be done + * in input_sync() + * --vojtech + */ + } + + for (i = 0; i < 8; i++) + input_report_key(dev, gc_psx_btn[i], ~data[1] & (1 << i)); + + input_report_key(dev, BTN_START, ~data[0] & 0x08); + input_report_key(dev, BTN_SELECT, ~data[0] & 0x01); + + input_sync(dev); + + break; + + default: /* not a pad, ignore */ + break; + } +} + +static void gc_psx_process_packet(struct gc *gc) +{ + unsigned char data[GC_MAX_DEVICES][GC_PSX_BYTES]; + unsigned char id[GC_MAX_DEVICES]; + struct gc_pad *pad; + int i; + + gc_psx_read_packet(gc, data, id); + + for (i = 0; i < GC_MAX_DEVICES; i++) { + pad = &gc->pads[i]; + if (pad->type == GC_PSX || pad->type == GC_DDR) + gc_psx_report_one(pad, id[i], data[i]); + } +} + +/* + * gc_timer() initiates reads of console pads data. + */ + +static void gc_timer(unsigned long private) +{ + struct gc *gc = (void *) private; + +/* + * N64 pads - must be read first, any read confuses them for 200 us + */ + + if (gc->pad_count[GC_N64]) + gc_n64_process_packet(gc); + +/* + * NES and SNES pads or mouse + */ + + if (gc->pad_count[GC_NES] || + gc->pad_count[GC_SNES] || + gc->pad_count[GC_SNESMOUSE]) { + gc_nes_process_packet(gc); + } + +/* + * Multi and Multi2 joysticks + */ + + if (gc->pad_count[GC_MULTI] || gc->pad_count[GC_MULTI2]) + gc_multi_process_packet(gc); + +/* + * PSX controllers + */ + + if (gc->pad_count[GC_PSX] || gc->pad_count[GC_DDR]) + gc_psx_process_packet(gc); + + mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); +} + +static int gc_open(struct input_dev *dev) +{ + struct gc *gc = input_get_drvdata(dev); + int err; + + err = mutex_lock_interruptible(&gc->mutex); + if (err) + return err; + + if (!gc->used++) { + parport_claim(gc->pd); + parport_write_control(gc->pd->port, 0x04); + mod_timer(&gc->timer, jiffies + GC_REFRESH_TIME); + } + + mutex_unlock(&gc->mutex); + return 0; +} + +static void gc_close(struct input_dev *dev) +{ + struct gc *gc = input_get_drvdata(dev); + + mutex_lock(&gc->mutex); + if (!--gc->used) { + del_timer_sync(&gc->timer); + parport_write_control(gc->pd->port, 0x00); + parport_release(gc->pd); + } + mutex_unlock(&gc->mutex); +} + +static int __init gc_setup_pad(struct gc *gc, int idx, int pad_type) +{ + struct gc_pad *pad = &gc->pads[idx]; + struct input_dev *input_dev; + int i; + int err; + + if (pad_type < 1 || pad_type >= GC_MAX) { + pr_err("Pad type %d unknown\n", pad_type); + return -EINVAL; + } + + pad->dev = input_dev = input_allocate_device(); + if (!input_dev) { + pr_err("Not enough memory for input device\n"); + return -ENOMEM; + } + + pad->type = pad_type; + + snprintf(pad->phys, sizeof(pad->phys), + "%s/input%d", gc->pd->port->name, idx); + + input_dev->name = gc_names[pad_type]; + input_dev->phys = pad->phys; + input_dev->id.bustype = BUS_PARPORT; + input_dev->id.vendor = 0x0001; + input_dev->id.product = pad_type; + input_dev->id.version = 0x0100; + + input_set_drvdata(input_dev, gc); + + input_dev->open = gc_open; + input_dev->close = gc_close; + + if (pad_type != GC_SNESMOUSE) { + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; i < 2; i++) + input_set_abs_params(input_dev, ABS_X + i, -1, 1, 0, 0); + } else + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + + gc->pad_count[pad_type]++; + + switch (pad_type) { + + case GC_N64: + for (i = 0; i < 10; i++) + __set_bit(gc_n64_btn[i], input_dev->keybit); + + for (i = 0; i < 2; i++) { + input_set_abs_params(input_dev, ABS_X + i, -127, 126, 0, 2); + input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); + } + + err = gc_n64_init_ff(input_dev, idx); + if (err) { + pr_warning("Failed to initiate rumble for N64 device %d\n", idx); + goto err_free_dev; + } + + break; + + case GC_SNESMOUSE: + __set_bit(BTN_LEFT, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + __set_bit(REL_X, input_dev->relbit); + __set_bit(REL_Y, input_dev->relbit); + break; + + case GC_SNES: + for (i = 4; i < 8; i++) + __set_bit(gc_snes_btn[i], input_dev->keybit); + case GC_NES: + for (i = 0; i < 4; i++) + __set_bit(gc_snes_btn[i], input_dev->keybit); + break; + + case GC_MULTI2: + __set_bit(BTN_THUMB, input_dev->keybit); + case GC_MULTI: + __set_bit(BTN_TRIGGER, input_dev->keybit); + break; + + case GC_PSX: + for (i = 0; i < 6; i++) + input_set_abs_params(input_dev, + gc_psx_abs[i], 4, 252, 0, 2); + for (i = 0; i < 12; i++) + __set_bit(gc_psx_btn[i], input_dev->keybit); + + break; + + case GC_DDR: + for (i = 0; i < 4; i++) + __set_bit(gc_psx_ddr_btn[i], input_dev->keybit); + for (i = 0; i < 12; i++) + __set_bit(gc_psx_btn[i], input_dev->keybit); + + break; + } + + err = input_register_device(pad->dev); + if (err) + goto err_free_dev; + + return 0; + +err_free_dev: + input_free_device(pad->dev); + pad->dev = NULL; + return err; +} + +static struct gc __init *gc_probe(int parport, int *pads, int n_pads) +{ + struct gc *gc; + struct parport *pp; + struct pardevice *pd; + int i; + int count = 0; + int err; + + pp = parport_find_number(parport); + if (!pp) { + pr_err("no such parport %d\n", parport); + err = -EINVAL; + goto err_out; + } + + pd = parport_register_device(pp, "gamecon", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); + if (!pd) { + pr_err("parport busy already - lp.o loaded?\n"); + err = -EBUSY; + goto err_put_pp; + } + + gc = kzalloc(sizeof(struct gc), GFP_KERNEL); + if (!gc) { + pr_err("Not enough memory\n"); + err = -ENOMEM; + goto err_unreg_pardev; + } + + mutex_init(&gc->mutex); + gc->pd = pd; + setup_timer(&gc->timer, gc_timer, (long) gc); + + for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) { + if (!pads[i]) + continue; + + err = gc_setup_pad(gc, i, pads[i]); + if (err) + goto err_unreg_devs; + + count++; + } + + if (count == 0) { + pr_err("No valid devices specified\n"); + err = -EINVAL; + goto err_free_gc; + } + + parport_put_port(pp); + return gc; + + err_unreg_devs: + while (--i >= 0) + if (gc->pads[i].dev) + input_unregister_device(gc->pads[i].dev); + err_free_gc: + kfree(gc); + err_unreg_pardev: + parport_unregister_device(pd); + err_put_pp: + parport_put_port(pp); + err_out: + return ERR_PTR(err); +} + +static void gc_remove(struct gc *gc) +{ + int i; + + for (i = 0; i < GC_MAX_DEVICES; i++) + if (gc->pads[i].dev) + input_unregister_device(gc->pads[i].dev); + parport_unregister_device(gc->pd); + kfree(gc); +} + +static int __init gc_init(void) +{ + int i; + int have_dev = 0; + int err = 0; + + for (i = 0; i < GC_MAX_PORTS; i++) { + if (gc_cfg[i].nargs == 0 || gc_cfg[i].args[0] < 0) + continue; + + if (gc_cfg[i].nargs < 2) { + pr_err("at least one device must be specified\n"); + err = -EINVAL; + break; + } + + gc_base[i] = gc_probe(gc_cfg[i].args[0], + gc_cfg[i].args + 1, gc_cfg[i].nargs - 1); + if (IS_ERR(gc_base[i])) { + err = PTR_ERR(gc_base[i]); + break; + } + + have_dev = 1; + } + + if (err) { + while (--i >= 0) + if (gc_base[i]) + gc_remove(gc_base[i]); + return err; + } + + return have_dev ? 0 : -ENODEV; +} + +static void __exit gc_exit(void) +{ + int i; + + for (i = 0; i < GC_MAX_PORTS; i++) + if (gc_base[i]) + gc_remove(gc_base[i]); +} + +module_init(gc_init); +module_exit(gc_exit); diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c new file mode 100644 index 00000000..ab1cf288 --- /dev/null +++ b/drivers/input/joystick/gf2k.c @@ -0,0 +1,376 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + */ + +/* + * Genius Flight 2000 joystick driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Genius Flight 2000 joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define GF2K_START 400 /* The time we wait for the first bit [400 us] */ +#define GF2K_STROBE 40 /* The time we wait for the first bit [40 us] */ +#define GF2K_TIMEOUT 4 /* Wait for everything to settle [4 ms] */ +#define GF2K_LENGTH 80 /* Max number of triplets in a packet */ + +/* + * Genius joystick ids ... + */ + +#define GF2K_ID_G09 1 +#define GF2K_ID_F30D 2 +#define GF2K_ID_F30 3 +#define GF2K_ID_F31D 4 +#define GF2K_ID_F305 5 +#define GF2K_ID_F23P 6 +#define GF2K_ID_F31 7 +#define GF2K_ID_MAX 7 + +static char gf2k_length[] = { 40, 40, 40, 40, 40, 40, 40, 40 }; +static char gf2k_hat_to_axis[][2] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; + +static char *gf2k_names[] = {"", "Genius G-09D", "Genius F-30D", "Genius F-30", "Genius MaxFighter F-31D", + "Genius F-30-5", "Genius Flight2000 F-23", "Genius F-31"}; +static unsigned char gf2k_hats[] = { 0, 2, 0, 0, 2, 0, 2, 0 }; +static unsigned char gf2k_axes[] = { 0, 2, 0, 0, 4, 0, 4, 0 }; +static unsigned char gf2k_joys[] = { 0, 0, 0, 0,10, 0, 8, 0 }; +static unsigned char gf2k_pads[] = { 0, 6, 0, 0, 0, 0, 0, 0 }; +static unsigned char gf2k_lens[] = { 0,18, 0, 0,18, 0,18, 0 }; + +static unsigned char gf2k_abs[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_GAS, ABS_BRAKE }; +static short gf2k_btn_joy[] = { BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4 }; +static short gf2k_btn_pad[] = { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_TL2, BTN_TR2, BTN_START, BTN_SELECT }; + + +static short gf2k_seq_reset[] = { 240, 340, 0 }; +static short gf2k_seq_digital[] = { 590, 320, 860, 0 }; + +struct gf2k { + struct gameport *gameport; + struct input_dev *dev; + int reads; + int bads; + unsigned char id; + unsigned char length; + char phys[32]; +}; + +/* + * gf2k_read_packet() reads a Genius Flight2000 packet. + */ + +static int gf2k_read_packet(struct gameport *gameport, int length, char *data) +{ + unsigned char u, v; + int i; + unsigned int t, p; + unsigned long flags; + + t = gameport_time(gameport, GF2K_START); + p = gameport_time(gameport, GF2K_STROBE); + + i = 0; + + local_irq_save(flags); + + gameport_trigger(gameport); + v = gameport_read(gameport); + + while (t > 0 && i < length) { + t--; u = v; + v = gameport_read(gameport); + if (v & ~u & 0x10) { + data[i++] = v >> 5; + t = p; + } + } + + local_irq_restore(flags); + + return i; +} + +/* + * gf2k_trigger_seq() initializes a Genius Flight2000 joystick + * into digital mode. + */ + +static void gf2k_trigger_seq(struct gameport *gameport, short *seq) +{ + + unsigned long flags; + int i, t; + + local_irq_save(flags); + + i = 0; + do { + gameport_trigger(gameport); + t = gameport_time(gameport, GF2K_TIMEOUT * 1000); + while ((gameport_read(gameport) & 1) && t) t--; + udelay(seq[i]); + } while (seq[++i]); + + gameport_trigger(gameport); + + local_irq_restore(flags); +} + +/* + * js_sw_get_bits() composes bits from the triplet buffer into a __u64. + * Parameter 'pos' is bit number inside packet where to start at, 'num' is number + * of bits to be read, 'shift' is offset in the resulting __u64 to start at, bits + * is number of bits per triplet. + */ + +#define GB(p,n,s) gf2k_get_bits(data, p, n, s) + +static int gf2k_get_bits(unsigned char *buf, int pos, int num, int shift) +{ + __u64 data = 0; + int i; + + for (i = 0; i < num / 3 + 2; i++) + data |= buf[pos / 3 + i] << (i * 3); + data >>= pos % 3; + data &= (1 << num) - 1; + data <<= shift; + + return data; +} + +static void gf2k_read(struct gf2k *gf2k, unsigned char *data) +{ + struct input_dev *dev = gf2k->dev; + int i, t; + + for (i = 0; i < 4 && i < gf2k_axes[gf2k->id]; i++) + input_report_abs(dev, gf2k_abs[i], GB(i<<3,8,0) | GB(i+46,1,8) | GB(i+50,1,9)); + + for (i = 0; i < 2 && i < gf2k_axes[gf2k->id] - 4; i++) + input_report_abs(dev, gf2k_abs[i], GB(i*9+60,8,0) | GB(i+54,1,9)); + + t = GB(40,4,0); + + for (i = 0; i < gf2k_hats[gf2k->id]; i++) + input_report_abs(dev, ABS_HAT0X + i, gf2k_hat_to_axis[t][i]); + + t = GB(44,2,0) | GB(32,8,2) | GB(78,2,10); + + for (i = 0; i < gf2k_joys[gf2k->id]; i++) + input_report_key(dev, gf2k_btn_joy[i], (t >> i) & 1); + + for (i = 0; i < gf2k_pads[gf2k->id]; i++) + input_report_key(dev, gf2k_btn_pad[i], (t >> i) & 1); + + input_sync(dev); +} + +/* + * gf2k_poll() reads and analyzes Genius joystick data. + */ + +static void gf2k_poll(struct gameport *gameport) +{ + struct gf2k *gf2k = gameport_get_drvdata(gameport); + unsigned char data[GF2K_LENGTH]; + + gf2k->reads++; + + if (gf2k_read_packet(gf2k->gameport, gf2k_length[gf2k->id], data) < gf2k_length[gf2k->id]) + gf2k->bads++; + else + gf2k_read(gf2k, data); +} + +static int gf2k_open(struct input_dev *dev) +{ + struct gf2k *gf2k = input_get_drvdata(dev); + + gameport_start_polling(gf2k->gameport); + return 0; +} + +static void gf2k_close(struct input_dev *dev) +{ + struct gf2k *gf2k = input_get_drvdata(dev); + + gameport_stop_polling(gf2k->gameport); +} + +/* + * gf2k_connect() probes for Genius id joysticks. + */ + +static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct gf2k *gf2k; + struct input_dev *input_dev; + unsigned char data[GF2K_LENGTH]; + int i, err; + + gf2k = kzalloc(sizeof(struct gf2k), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!gf2k || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + gf2k->gameport = gameport; + gf2k->dev = input_dev; + + gameport_set_drvdata(gameport, gf2k); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + gf2k_trigger_seq(gameport, gf2k_seq_reset); + + msleep(GF2K_TIMEOUT); + + gf2k_trigger_seq(gameport, gf2k_seq_digital); + + msleep(GF2K_TIMEOUT); + + if (gf2k_read_packet(gameport, GF2K_LENGTH, data) < 12) { + err = -ENODEV; + goto fail2; + } + + if (!(gf2k->id = GB(7,2,0) | GB(3,3,2) | GB(0,3,5))) { + err = -ENODEV; + goto fail2; + } + +#ifdef RESET_WORKS + if ((gf2k->id != (GB(19,2,0) | GB(15,3,2) | GB(12,3,5))) && + (gf2k->id != (GB(31,2,0) | GB(27,3,2) | GB(24,3,5)))) { + err = -ENODEV; + goto fail2; + } +#else + gf2k->id = 6; +#endif + + if (gf2k->id > GF2K_ID_MAX || !gf2k_axes[gf2k->id]) { + printk(KERN_WARNING "gf2k.c: Not yet supported joystick on %s. [id: %d type:%s]\n", + gameport->phys, gf2k->id, gf2k->id > GF2K_ID_MAX ? "Unknown" : gf2k_names[gf2k->id]); + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, gf2k_poll); + gameport_set_poll_interval(gameport, 20); + + snprintf(gf2k->phys, sizeof(gf2k->phys), "%s/input0", gameport->phys); + + gf2k->length = gf2k_lens[gf2k->id]; + + input_dev->name = gf2k_names[gf2k->id]; + input_dev->phys = gf2k->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_GENIUS; + input_dev->id.product = gf2k->id; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &gameport->dev; + + input_set_drvdata(input_dev, gf2k); + + input_dev->open = gf2k_open; + input_dev->close = gf2k_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; i < gf2k_axes[gf2k->id]; i++) + set_bit(gf2k_abs[i], input_dev->absbit); + + for (i = 0; i < gf2k_hats[gf2k->id]; i++) + input_set_abs_params(input_dev, ABS_HAT0X + i, -1, 1, 0, 0); + + for (i = 0; i < gf2k_joys[gf2k->id]; i++) + set_bit(gf2k_btn_joy[i], input_dev->keybit); + + for (i = 0; i < gf2k_pads[gf2k->id]; i++) + set_bit(gf2k_btn_pad[i], input_dev->keybit); + + gf2k_read_packet(gameport, gf2k->length, data); + gf2k_read(gf2k, data); + + for (i = 0; i < gf2k_axes[gf2k->id]; i++) { + int max = i < 2 ? + input_abs_get_val(input_dev, gf2k_abs[i]) * 2 : + input_abs_get_val(input_dev, gf2k_abs[0]) + + input_abs_get_val(input_dev, gf2k_abs[1]); + int flat = i < 2 ? 24 : 0; + + input_set_abs_params(input_dev, gf2k_abs[i], + 32, max - 32, 8, flat); + } + + err = input_register_device(gf2k->dev); + if (err) + goto fail2; + + return 0; + + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + input_free_device(input_dev); + kfree(gf2k); + return err; +} + +static void gf2k_disconnect(struct gameport *gameport) +{ + struct gf2k *gf2k = gameport_get_drvdata(gameport); + + input_unregister_device(gf2k->dev); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(gf2k); +} + +static struct gameport_driver gf2k_drv = { + .driver = { + .name = "gf2k", + }, + .description = DRIVER_DESC, + .connect = gf2k_connect, + .disconnect = gf2k_disconnect, +}; + +module_gameport_driver(gf2k_drv); diff --git a/drivers/input/joystick/grip.c b/drivers/input/joystick/grip.c new file mode 100644 index 00000000..9e1beff5 --- /dev/null +++ b/drivers/input/joystick/grip.c @@ -0,0 +1,427 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + */ + +/* + * Gravis/Kensington GrIP protocol joystick and gamepad driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Gravis GrIP protocol joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define GRIP_MODE_GPP 1 +#define GRIP_MODE_BD 2 +#define GRIP_MODE_XT 3 +#define GRIP_MODE_DC 4 + +#define GRIP_LENGTH_GPP 24 +#define GRIP_STROBE_GPP 200 /* 200 us */ +#define GRIP_LENGTH_XT 4 +#define GRIP_STROBE_XT 64 /* 64 us */ +#define GRIP_MAX_CHUNKS_XT 10 +#define GRIP_MAX_BITS_XT 30 + +struct grip { + struct gameport *gameport; + struct input_dev *dev[2]; + unsigned char mode[2]; + int reads; + int bads; + char phys[2][32]; +}; + +static int grip_btn_gpp[] = { BTN_START, BTN_SELECT, BTN_TR2, BTN_Y, 0, BTN_TL2, BTN_A, BTN_B, BTN_X, 0, BTN_TL, BTN_TR, -1 }; +static int grip_btn_bd[] = { BTN_THUMB, BTN_THUMB2, BTN_TRIGGER, BTN_TOP, BTN_BASE, -1 }; +static int grip_btn_xt[] = { BTN_TRIGGER, BTN_THUMB, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_SELECT, BTN_START, BTN_MODE, -1 }; +static int grip_btn_dc[] = { BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, -1 }; + +static int grip_abs_gpp[] = { ABS_X, ABS_Y, -1 }; +static int grip_abs_bd[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; +static int grip_abs_xt[] = { ABS_X, ABS_Y, ABS_BRAKE, ABS_GAS, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y, -1 }; +static int grip_abs_dc[] = { ABS_X, ABS_Y, ABS_RX, ABS_RY, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; + +static char *grip_name[] = { NULL, "Gravis GamePad Pro", "Gravis Blackhawk Digital", + "Gravis Xterminator Digital", "Gravis Xterminator DualControl" }; +static int *grip_abs[] = { NULL, grip_abs_gpp, grip_abs_bd, grip_abs_xt, grip_abs_dc }; +static int *grip_btn[] = { NULL, grip_btn_gpp, grip_btn_bd, grip_btn_xt, grip_btn_dc }; +static char grip_anx[] = { 0, 0, 3, 5, 5 }; +static char grip_cen[] = { 0, 0, 2, 2, 4 }; + +/* + * grip_gpp_read_packet() reads a Gravis GamePad Pro packet. + */ + +static int grip_gpp_read_packet(struct gameport *gameport, int shift, unsigned int *data) +{ + unsigned long flags; + unsigned char u, v; + unsigned int t; + int i; + + int strobe = gameport_time(gameport, GRIP_STROBE_GPP); + + data[0] = 0; + t = strobe; + i = 0; + + local_irq_save(flags); + + v = gameport_read(gameport) >> shift; + + do { + t--; + u = v; v = (gameport_read(gameport) >> shift) & 3; + if (~v & u & 1) { + data[0] |= (v >> 1) << i++; + t = strobe; + } + } while (i < GRIP_LENGTH_GPP && t > 0); + + local_irq_restore(flags); + + if (i < GRIP_LENGTH_GPP) return -1; + + for (i = 0; i < GRIP_LENGTH_GPP && (data[0] & 0xfe4210) ^ 0x7c0000; i++) + data[0] = data[0] >> 1 | (data[0] & 1) << (GRIP_LENGTH_GPP - 1); + + return -(i == GRIP_LENGTH_GPP); +} + +/* + * grip_xt_read_packet() reads a Gravis Xterminator packet. + */ + +static int grip_xt_read_packet(struct gameport *gameport, int shift, unsigned int *data) +{ + unsigned int i, j, buf, crc; + unsigned char u, v, w; + unsigned long flags; + unsigned int t; + char status; + + int strobe = gameport_time(gameport, GRIP_STROBE_XT); + + data[0] = data[1] = data[2] = data[3] = 0; + status = buf = i = j = 0; + t = strobe; + + local_irq_save(flags); + + v = w = (gameport_read(gameport) >> shift) & 3; + + do { + t--; + u = (gameport_read(gameport) >> shift) & 3; + + if (u ^ v) { + + if ((u ^ v) & 1) { + buf = (buf << 1) | (u >> 1); + t = strobe; + i++; + } else + + if ((((u ^ v) & (v ^ w)) >> 1) & ~(u | v | w) & 1) { + if (i == 20) { + crc = buf ^ (buf >> 7) ^ (buf >> 14); + if (!((crc ^ (0x25cb9e70 >> ((crc >> 2) & 0x1c))) & 0xf)) { + data[buf >> 18] = buf >> 4; + status |= 1 << (buf >> 18); + } + j++; + } + t = strobe; + buf = 0; + i = 0; + } + w = v; + v = u; + } + + } while (status != 0xf && i < GRIP_MAX_BITS_XT && j < GRIP_MAX_CHUNKS_XT && t > 0); + + local_irq_restore(flags); + + return -(status != 0xf); +} + +/* + * grip_timer() repeatedly polls the joysticks and generates events. + */ + +static void grip_poll(struct gameport *gameport) +{ + struct grip *grip = gameport_get_drvdata(gameport); + unsigned int data[GRIP_LENGTH_XT]; + struct input_dev *dev; + int i, j; + + for (i = 0; i < 2; i++) { + + dev = grip->dev[i]; + if (!dev) + continue; + + grip->reads++; + + switch (grip->mode[i]) { + + case GRIP_MODE_GPP: + + if (grip_gpp_read_packet(grip->gameport, (i << 1) + 4, data)) { + grip->bads++; + break; + } + + input_report_abs(dev, ABS_X, ((*data >> 15) & 1) - ((*data >> 16) & 1)); + input_report_abs(dev, ABS_Y, ((*data >> 13) & 1) - ((*data >> 12) & 1)); + + for (j = 0; j < 12; j++) + if (grip_btn_gpp[j]) + input_report_key(dev, grip_btn_gpp[j], (*data >> j) & 1); + + break; + + case GRIP_MODE_BD: + + if (grip_xt_read_packet(grip->gameport, (i << 1) + 4, data)) { + grip->bads++; + break; + } + + input_report_abs(dev, ABS_X, (data[0] >> 2) & 0x3f); + input_report_abs(dev, ABS_Y, 63 - ((data[0] >> 8) & 0x3f)); + input_report_abs(dev, ABS_THROTTLE, (data[2] >> 8) & 0x3f); + + input_report_abs(dev, ABS_HAT0X, ((data[2] >> 1) & 1) - ( data[2] & 1)); + input_report_abs(dev, ABS_HAT0Y, ((data[2] >> 2) & 1) - ((data[2] >> 3) & 1)); + + for (j = 0; j < 5; j++) + input_report_key(dev, grip_btn_bd[j], (data[3] >> (j + 4)) & 1); + + break; + + case GRIP_MODE_XT: + + if (grip_xt_read_packet(grip->gameport, (i << 1) + 4, data)) { + grip->bads++; + break; + } + + input_report_abs(dev, ABS_X, (data[0] >> 2) & 0x3f); + input_report_abs(dev, ABS_Y, 63 - ((data[0] >> 8) & 0x3f)); + input_report_abs(dev, ABS_BRAKE, (data[1] >> 2) & 0x3f); + input_report_abs(dev, ABS_GAS, (data[1] >> 8) & 0x3f); + input_report_abs(dev, ABS_THROTTLE, (data[2] >> 8) & 0x3f); + + input_report_abs(dev, ABS_HAT0X, ((data[2] >> 1) & 1) - ( data[2] & 1)); + input_report_abs(dev, ABS_HAT0Y, ((data[2] >> 2) & 1) - ((data[2] >> 3) & 1)); + input_report_abs(dev, ABS_HAT1X, ((data[2] >> 5) & 1) - ((data[2] >> 4) & 1)); + input_report_abs(dev, ABS_HAT1Y, ((data[2] >> 6) & 1) - ((data[2] >> 7) & 1)); + + for (j = 0; j < 11; j++) + input_report_key(dev, grip_btn_xt[j], (data[3] >> (j + 3)) & 1); + break; + + case GRIP_MODE_DC: + + if (grip_xt_read_packet(grip->gameport, (i << 1) + 4, data)) { + grip->bads++; + break; + } + + input_report_abs(dev, ABS_X, (data[0] >> 2) & 0x3f); + input_report_abs(dev, ABS_Y, (data[0] >> 8) & 0x3f); + input_report_abs(dev, ABS_RX, (data[1] >> 2) & 0x3f); + input_report_abs(dev, ABS_RY, (data[1] >> 8) & 0x3f); + input_report_abs(dev, ABS_THROTTLE, (data[2] >> 8) & 0x3f); + + input_report_abs(dev, ABS_HAT0X, ((data[2] >> 1) & 1) - ( data[2] & 1)); + input_report_abs(dev, ABS_HAT0Y, ((data[2] >> 2) & 1) - ((data[2] >> 3) & 1)); + + for (j = 0; j < 9; j++) + input_report_key(dev, grip_btn_dc[j], (data[3] >> (j + 3)) & 1); + break; + + + } + + input_sync(dev); + } +} + +static int grip_open(struct input_dev *dev) +{ + struct grip *grip = input_get_drvdata(dev); + + gameport_start_polling(grip->gameport); + return 0; +} + +static void grip_close(struct input_dev *dev) +{ + struct grip *grip = input_get_drvdata(dev); + + gameport_stop_polling(grip->gameport); +} + +static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct grip *grip; + struct input_dev *input_dev; + unsigned int data[GRIP_LENGTH_XT]; + int i, j, t; + int err; + + if (!(grip = kzalloc(sizeof(struct grip), GFP_KERNEL))) + return -ENOMEM; + + grip->gameport = gameport; + + gameport_set_drvdata(gameport, grip); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + for (i = 0; i < 2; i++) { + if (!grip_gpp_read_packet(gameport, (i << 1) + 4, data)) { + grip->mode[i] = GRIP_MODE_GPP; + continue; + } + if (!grip_xt_read_packet(gameport, (i << 1) + 4, data)) { + if (!(data[3] & 7)) { + grip->mode[i] = GRIP_MODE_BD; + continue; + } + if (!(data[2] & 0xf0)) { + grip->mode[i] = GRIP_MODE_XT; + continue; + } + grip->mode[i] = GRIP_MODE_DC; + continue; + } + } + + if (!grip->mode[0] && !grip->mode[1]) { + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, grip_poll); + gameport_set_poll_interval(gameport, 20); + + for (i = 0; i < 2; i++) { + if (!grip->mode[i]) + continue; + + grip->dev[i] = input_dev = input_allocate_device(); + if (!input_dev) { + err = -ENOMEM; + goto fail3; + } + + snprintf(grip->phys[i], sizeof(grip->phys[i]), + "%s/input%d", gameport->phys, i); + + input_dev->name = grip_name[grip->mode[i]]; + input_dev->phys = grip->phys[i]; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS; + input_dev->id.product = grip->mode[i]; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &gameport->dev; + + input_set_drvdata(input_dev, grip); + + input_dev->open = grip_open; + input_dev->close = grip_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (j = 0; (t = grip_abs[grip->mode[i]][j]) >= 0; j++) { + + if (j < grip_cen[grip->mode[i]]) + input_set_abs_params(input_dev, t, 14, 52, 1, 2); + else if (j < grip_anx[grip->mode[i]]) + input_set_abs_params(input_dev, t, 3, 57, 1, 0); + else + input_set_abs_params(input_dev, t, -1, 1, 0, 0); + } + + for (j = 0; (t = grip_btn[grip->mode[i]][j]) >= 0; j++) + if (t > 0) + set_bit(t, input_dev->keybit); + + err = input_register_device(grip->dev[i]); + if (err) + goto fail4; + } + + return 0; + + fail4: input_free_device(grip->dev[i]); + fail3: while (--i >= 0) + if (grip->dev[i]) + input_unregister_device(grip->dev[i]); + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + kfree(grip); + return err; +} + +static void grip_disconnect(struct gameport *gameport) +{ + struct grip *grip = gameport_get_drvdata(gameport); + int i; + + for (i = 0; i < 2; i++) + if (grip->dev[i]) + input_unregister_device(grip->dev[i]); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(grip); +} + +static struct gameport_driver grip_drv = { + .driver = { + .name = "grip", + .owner = THIS_MODULE, + }, + .description = DRIVER_DESC, + .connect = grip_connect, + .disconnect = grip_disconnect, +}; + +module_gameport_driver(grip_drv); diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c new file mode 100644 index 00000000..c0f9c7b7 --- /dev/null +++ b/drivers/input/joystick/grip_mp.c @@ -0,0 +1,690 @@ +/* + * Driver for the Gravis Grip Multiport, a gamepad "hub" that + * connects up to four 9-pin digital gamepads/joysticks. + * Driver tested on SMP and UP kernel versions 2.4.18-4 and 2.4.18-5. + * + * Thanks to Chris Gassib for helpful advice. + * + * Copyright (c) 2002 Brian Bonnlander, Bill Soudan + * Copyright (c) 1998-2000 Vojtech Pavlik + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Gravis Grip Multiport driver" + +MODULE_AUTHOR("Brian Bonnlander"); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#ifdef GRIP_DEBUG +#define dbg(format, arg...) printk(KERN_ERR __FILE__ ": " format "\n" , ## arg) +#else +#define dbg(format, arg...) do {} while (0) +#endif + +#define GRIP_MAX_PORTS 4 +/* + * Grip multiport state + */ + +struct grip_port { + struct input_dev *dev; + int mode; + int registered; + + /* individual gamepad states */ + int buttons; + int xaxes; + int yaxes; + int dirty; /* has the state been updated? */ +}; + +struct grip_mp { + struct gameport *gameport; + struct grip_port *port[GRIP_MAX_PORTS]; + int reads; + int bads; +}; + +/* + * Multiport packet interpretation + */ + +#define PACKET_FULL 0x80000000 /* packet is full */ +#define PACKET_IO_FAST 0x40000000 /* 3 bits per gameport read */ +#define PACKET_IO_SLOW 0x20000000 /* 1 bit per gameport read */ +#define PACKET_MP_MORE 0x04000000 /* multiport wants to send more */ +#define PACKET_MP_DONE 0x02000000 /* multiport done sending */ + +/* + * Packet status code interpretation + */ + +#define IO_GOT_PACKET 0x0100 /* Got a packet */ +#define IO_MODE_FAST 0x0200 /* Used 3 data bits per gameport read */ +#define IO_SLOT_CHANGE 0x0800 /* Multiport physical slot status changed */ +#define IO_DONE 0x1000 /* Multiport is done sending packets */ +#define IO_RETRY 0x4000 /* Try again later to get packet */ +#define IO_RESET 0x8000 /* Force multiport to resend all packets */ + +/* + * Gamepad configuration data. Other 9-pin digital joystick devices + * may work with the multiport, so this may not be an exhaustive list! + * Commodore 64 joystick remains untested. + */ + +#define GRIP_INIT_DELAY 2000 /* 2 ms */ + +#define GRIP_MODE_NONE 0 +#define GRIP_MODE_RESET 1 +#define GRIP_MODE_GP 2 +#define GRIP_MODE_C64 3 + +static const int grip_btn_gp[] = { BTN_TR, BTN_TL, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, -1 }; +static const int grip_btn_c64[] = { BTN_JOYSTICK, -1 }; + +static const int grip_abs_gp[] = { ABS_X, ABS_Y, -1 }; +static const int grip_abs_c64[] = { ABS_X, ABS_Y, -1 }; + +static const int *grip_abs[] = { NULL, NULL, grip_abs_gp, grip_abs_c64 }; +static const int *grip_btn[] = { NULL, NULL, grip_btn_gp, grip_btn_c64 }; + +static const char *grip_name[] = { NULL, NULL, "Gravis Grip Pad", "Commodore 64 Joystick" }; + +static const int init_seq[] = { + 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1 }; + +/* Maps multiport directional values to X,Y axis values (each axis encoded in 3 bits) */ + +static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5 }; + +static int register_slot(int i, struct grip_mp *grip); + +/* + * Returns whether an odd or even number of bits are on in pkt. + */ + +static int bit_parity(u32 pkt) +{ + int x = pkt ^ (pkt >> 16); + x ^= x >> 8; + x ^= x >> 4; + x ^= x >> 2; + x ^= x >> 1; + return x & 1; +} + +/* + * Poll gameport; return true if all bits set in 'onbits' are on and + * all bits set in 'offbits' are off. + */ + +static inline int poll_until(u8 onbits, u8 offbits, int u_sec, struct gameport* gp, u8 *data) +{ + int i, nloops; + + nloops = gameport_time(gp, u_sec); + for (i = 0; i < nloops; i++) { + *data = gameport_read(gp); + if ((*data & onbits) == onbits && + (~(*data) & offbits) == offbits) + return 1; + } + dbg("gameport timed out after %d microseconds.\n", u_sec); + return 0; +} + +/* + * Gets a 28-bit packet from the multiport. + * + * After getting a packet successfully, commands encoded by sendcode may + * be sent to the multiport. + * + * The multiport clock value is reflected in gameport bit B4. + * + * Returns a packet status code indicating whether packet is valid, the transfer + * mode, and any error conditions. + * + * sendflags: current I/O status + * sendcode: data to send to the multiport if sendflags is nonzero + */ + +static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet) +{ + u8 raw_data; /* raw data from gameport */ + u8 data_mask; /* packet data bits from raw_data */ + u32 pkt; /* packet temporary storage */ + int bits_per_read; /* num packet bits per gameport read */ + int portvals = 0; /* used for port value sanity check */ + int i; + + /* Gameport bits B0, B4, B5 should first be off, then B4 should come on. */ + + *packet = 0; + raw_data = gameport_read(gameport); + if (raw_data & 1) + return IO_RETRY; + + for (i = 0; i < 64; i++) { + raw_data = gameport_read(gameport); + portvals |= 1 << ((raw_data >> 4) & 3); /* Demux B4, B5 */ + } + + if (portvals == 1) { /* B4, B5 off */ + raw_data = gameport_read(gameport); + portvals = raw_data & 0xf0; + + if (raw_data & 0x31) + return IO_RESET; + gameport_trigger(gameport); + + if (!poll_until(0x10, 0, 308, gameport, &raw_data)) + return IO_RESET; + } else + return IO_RETRY; + + /* Determine packet transfer mode and prepare for packet construction. */ + + if (raw_data & 0x20) { /* 3 data bits/read */ + portvals |= raw_data >> 4; /* Compare B4-B7 before & after trigger */ + + if (portvals != 0xb) + return 0; + data_mask = 7; + bits_per_read = 3; + pkt = (PACKET_FULL | PACKET_IO_FAST) >> 28; + } else { /* 1 data bit/read */ + data_mask = 1; + bits_per_read = 1; + pkt = (PACKET_FULL | PACKET_IO_SLOW) >> 28; + } + + /* Construct a packet. Final data bits must be zero. */ + + while (1) { + if (!poll_until(0, 0x10, 77, gameport, &raw_data)) + return IO_RESET; + raw_data = (raw_data >> 5) & data_mask; + + if (pkt & PACKET_FULL) + break; + pkt = (pkt << bits_per_read) | raw_data; + + if (!poll_until(0x10, 0, 77, gameport, &raw_data)) + return IO_RESET; + } + + if (raw_data) + return IO_RESET; + + /* If 3 bits/read used, drop from 30 bits to 28. */ + + if (bits_per_read == 3) { + pkt = (pkt & 0xffff0000) | ((pkt << 1) & 0xffff); + pkt = (pkt >> 2) | 0xf0000000; + } + + if (bit_parity(pkt) == 1) + return IO_RESET; + + /* Acknowledge packet receipt */ + + if (!poll_until(0x30, 0, 77, gameport, &raw_data)) + return IO_RESET; + + raw_data = gameport_read(gameport); + + if (raw_data & 1) + return IO_RESET; + + gameport_trigger(gameport); + + if (!poll_until(0, 0x20, 77, gameport, &raw_data)) + return IO_RESET; + + /* Return if we just wanted the packet or multiport wants to send more */ + + *packet = pkt; + if ((sendflags == 0) || ((sendflags & IO_RETRY) && !(pkt & PACKET_MP_DONE))) + return IO_GOT_PACKET; + + if (pkt & PACKET_MP_MORE) + return IO_GOT_PACKET | IO_RETRY; + + /* Multiport is done sending packets and is ready to receive data */ + + if (!poll_until(0x20, 0, 77, gameport, &raw_data)) + return IO_GOT_PACKET | IO_RESET; + + raw_data = gameport_read(gameport); + if (raw_data & 1) + return IO_GOT_PACKET | IO_RESET; + + /* Trigger gameport based on bits in sendcode */ + + gameport_trigger(gameport); + do { + if (!poll_until(0x20, 0x10, 116, gameport, &raw_data)) + return IO_GOT_PACKET | IO_RESET; + + if (!poll_until(0x30, 0, 193, gameport, &raw_data)) + return IO_GOT_PACKET | IO_RESET; + + if (raw_data & 1) + return IO_GOT_PACKET | IO_RESET; + + if (sendcode & 1) + gameport_trigger(gameport); + + sendcode >>= 1; + } while (sendcode); + + return IO_GOT_PACKET | IO_MODE_FAST; +} + +/* + * Disables and restores interrupts for mp_io(), which does the actual I/O. + */ + +static int multiport_io(struct gameport* gameport, int sendflags, int sendcode, u32 *packet) +{ + int status; + unsigned long flags; + + local_irq_save(flags); + status = mp_io(gameport, sendflags, sendcode, packet); + local_irq_restore(flags); + + return status; +} + +/* + * Puts multiport into digital mode. Multiport LED turns green. + * + * Returns true if a valid digital packet was received, false otherwise. + */ + +static int dig_mode_start(struct gameport *gameport, u32 *packet) +{ + int i; + int flags, tries = 0, bads = 0; + + for (i = 0; i < ARRAY_SIZE(init_seq); i++) { /* Send magic sequence */ + if (init_seq[i]) + gameport_trigger(gameport); + udelay(GRIP_INIT_DELAY); + } + + for (i = 0; i < 16; i++) /* Wait for multiport to settle */ + udelay(GRIP_INIT_DELAY); + + while (tries < 64 && bads < 8) { /* Reset multiport and try getting a packet */ + + flags = multiport_io(gameport, IO_RESET, 0x27, packet); + + if (flags & IO_MODE_FAST) + return 1; + + if (flags & IO_RETRY) + tries++; + else + bads++; + } + return 0; +} + +/* + * Packet structure: B0-B15 => gamepad state + * B16-B20 => gamepad device type + * B21-B24 => multiport slot index (1-4) + * + * Known device types: 0x1f (grip pad), 0x0 (no device). Others may exist. + * + * Returns the packet status. + */ + +static int get_and_decode_packet(struct grip_mp *grip, int flags) +{ + struct grip_port *port; + u32 packet; + int joytype = 0; + int slot; + + /* Get a packet and check for validity */ + + flags &= IO_RESET | IO_RETRY; + flags = multiport_io(grip->gameport, flags, 0, &packet); + grip->reads++; + + if (packet & PACKET_MP_DONE) + flags |= IO_DONE; + + if (flags && !(flags & IO_GOT_PACKET)) { + grip->bads++; + return flags; + } + + /* Ignore non-gamepad packets, e.g. multiport hardware version */ + + slot = ((packet >> 21) & 0xf) - 1; + if ((slot < 0) || (slot > 3)) + return flags; + + port = grip->port[slot]; + + /* + * Handle "reset" packets, which occur at startup, and when gamepads + * are removed or plugged in. May contain configuration of a new gamepad. + */ + + joytype = (packet >> 16) & 0x1f; + if (!joytype) { + + if (port->registered) { + printk(KERN_INFO "grip_mp: removing %s, slot %d\n", + grip_name[port->mode], slot); + input_unregister_device(port->dev); + port->registered = 0; + } + dbg("Reset: grip multiport slot %d\n", slot); + port->mode = GRIP_MODE_RESET; + flags |= IO_SLOT_CHANGE; + return flags; + } + + /* Interpret a grip pad packet */ + + if (joytype == 0x1f) { + + int dir = (packet >> 8) & 0xf; /* eight way directional value */ + port->buttons = (~packet) & 0xff; + port->yaxes = ((axis_map[dir] >> 2) & 3) - 1; + port->xaxes = (axis_map[dir] & 3) - 1; + port->dirty = 1; + + if (port->mode == GRIP_MODE_RESET) + flags |= IO_SLOT_CHANGE; + + port->mode = GRIP_MODE_GP; + + if (!port->registered) { + dbg("New Grip pad in multiport slot %d.\n", slot); + if (register_slot(slot, grip)) { + port->mode = GRIP_MODE_RESET; + port->dirty = 0; + } + } + return flags; + } + + /* Handle non-grip device codes. For now, just print diagnostics. */ + + { + static int strange_code = 0; + if (strange_code != joytype) { + printk(KERN_INFO "Possible non-grip pad/joystick detected.\n"); + printk(KERN_INFO "Got joy type 0x%x and packet 0x%x.\n", joytype, packet); + strange_code = joytype; + } + } + return flags; +} + +/* + * Returns true if all multiport slot states appear valid. + */ + +static int slots_valid(struct grip_mp *grip) +{ + int flags, slot, invalid = 0, active = 0; + + flags = get_and_decode_packet(grip, 0); + if (!(flags & IO_GOT_PACKET)) + return 0; + + for (slot = 0; slot < 4; slot++) { + if (grip->port[slot]->mode == GRIP_MODE_RESET) + invalid = 1; + if (grip->port[slot]->mode != GRIP_MODE_NONE) + active = 1; + } + + /* Return true if no active slot but multiport sent all its data */ + if (!active) + return (flags & IO_DONE) ? 1 : 0; + + /* Return false if invalid device code received */ + return invalid ? 0 : 1; +} + +/* + * Returns whether the multiport was placed into digital mode and + * able to communicate its state successfully. + */ + +static int multiport_init(struct grip_mp *grip) +{ + int dig_mode, initialized = 0, tries = 0; + u32 packet; + + dig_mode = dig_mode_start(grip->gameport, &packet); + while (!dig_mode && tries < 4) { + dig_mode = dig_mode_start(grip->gameport, &packet); + tries++; + } + + if (dig_mode) + dbg("multiport_init(): digital mode activated.\n"); + else { + dbg("multiport_init(): unable to activate digital mode.\n"); + return 0; + } + + /* Get packets, store multiport state, and check state's validity */ + for (tries = 0; tries < 4096; tries++) { + if (slots_valid(grip)) { + initialized = 1; + break; + } + } + dbg("multiport_init(): initialized == %d\n", initialized); + return initialized; +} + +/* + * Reports joystick state to the linux input layer. + */ + +static void report_slot(struct grip_mp *grip, int slot) +{ + struct grip_port *port = grip->port[slot]; + int i; + + /* Store button states with linux input driver */ + + for (i = 0; i < 8; i++) + input_report_key(port->dev, grip_btn_gp[i], (port->buttons >> i) & 1); + + /* Store axis states with linux driver */ + + input_report_abs(port->dev, ABS_X, port->xaxes); + input_report_abs(port->dev, ABS_Y, port->yaxes); + + /* Tell the receiver of the events to process them */ + + input_sync(port->dev); + + port->dirty = 0; +} + +/* + * Get the multiport state. + */ + +static void grip_poll(struct gameport *gameport) +{ + struct grip_mp *grip = gameport_get_drvdata(gameport); + int i, npkts, flags; + + for (npkts = 0; npkts < 4; npkts++) { + flags = IO_RETRY; + for (i = 0; i < 32; i++) { + flags = get_and_decode_packet(grip, flags); + if ((flags & IO_GOT_PACKET) || !(flags & IO_RETRY)) + break; + } + if (flags & IO_DONE) + break; + } + + for (i = 0; i < 4; i++) + if (grip->port[i]->dirty) + report_slot(grip, i); +} + +/* + * Called when a joystick device file is opened + */ + +static int grip_open(struct input_dev *dev) +{ + struct grip_mp *grip = input_get_drvdata(dev); + + gameport_start_polling(grip->gameport); + return 0; +} + +/* + * Called when a joystick device file is closed + */ + +static void grip_close(struct input_dev *dev) +{ + struct grip_mp *grip = input_get_drvdata(dev); + + gameport_stop_polling(grip->gameport); +} + +/* + * Tell the linux input layer about a newly plugged-in gamepad. + */ + +static int register_slot(int slot, struct grip_mp *grip) +{ + struct grip_port *port = grip->port[slot]; + struct input_dev *input_dev; + int j, t; + int err; + + port->dev = input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + input_dev->name = grip_name[port->mode]; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_GRAVIS; + input_dev->id.product = 0x0100 + port->mode; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &grip->gameport->dev; + + input_set_drvdata(input_dev, grip); + + input_dev->open = grip_open; + input_dev->close = grip_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (j = 0; (t = grip_abs[port->mode][j]) >= 0; j++) + input_set_abs_params(input_dev, t, -1, 1, 0, 0); + + for (j = 0; (t = grip_btn[port->mode][j]) >= 0; j++) + if (t > 0) + set_bit(t, input_dev->keybit); + + err = input_register_device(port->dev); + if (err) { + input_free_device(port->dev); + return err; + } + + port->registered = 1; + + if (port->dirty) /* report initial state, if any */ + report_slot(grip, slot); + + return 0; +} + +static int grip_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct grip_mp *grip; + int err; + + if (!(grip = kzalloc(sizeof(struct grip_mp), GFP_KERNEL))) + return -ENOMEM; + + grip->gameport = gameport; + + gameport_set_drvdata(gameport, grip); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + gameport_set_poll_handler(gameport, grip_poll); + gameport_set_poll_interval(gameport, 20); + + if (!multiport_init(grip)) { + err = -ENODEV; + goto fail2; + } + + if (!grip->port[0]->mode && !grip->port[1]->mode && !grip->port[2]->mode && !grip->port[3]->mode) { + /* nothing plugged in */ + err = -ENODEV; + goto fail2; + } + + return 0; + +fail2: gameport_close(gameport); +fail1: gameport_set_drvdata(gameport, NULL); + kfree(grip); + return err; +} + +static void grip_disconnect(struct gameport *gameport) +{ + struct grip_mp *grip = gameport_get_drvdata(gameport); + int i; + + for (i = 0; i < 4; i++) + if (grip->port[i]->registered) + input_unregister_device(grip->port[i]->dev); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(grip); +} + +static struct gameport_driver grip_drv = { + .driver = { + .name = "grip_mp", + }, + .description = DRIVER_DESC, + .connect = grip_connect, + .disconnect = grip_disconnect, +}; + +module_gameport_driver(grip_drv); diff --git a/drivers/input/joystick/guillemot.c b/drivers/input/joystick/guillemot.c new file mode 100644 index 00000000..55196f73 --- /dev/null +++ b/drivers/input/joystick/guillemot.c @@ -0,0 +1,284 @@ +/* + * Copyright (c) 2001 Vojtech Pavlik + */ + +/* + * Guillemot Digital Interface Protocol driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Guillemot Digital joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define GUILLEMOT_MAX_START 600 /* 600 us */ +#define GUILLEMOT_MAX_STROBE 60 /* 60 us */ +#define GUILLEMOT_MAX_LENGTH 17 /* 17 bytes */ + +static short guillemot_abs_pad[] = + { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, -1 }; + +static short guillemot_btn_pad[] = + { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_MODE, BTN_SELECT, -1 }; + +static struct { + int x; + int y; +} guillemot_hat_to_axis[16] = {{ 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; + +struct guillemot_type { + unsigned char id; + short *abs; + short *btn; + int hat; + char *name; +}; + +struct guillemot { + struct gameport *gameport; + struct input_dev *dev; + int bads; + int reads; + struct guillemot_type *type; + unsigned char length; + char phys[32]; +}; + +static struct guillemot_type guillemot_type[] = { + { 0x00, guillemot_abs_pad, guillemot_btn_pad, 1, "Guillemot Pad" }, + { 0 }}; + +/* + * guillemot_read_packet() reads Guillemot joystick data. + */ + +static int guillemot_read_packet(struct gameport *gameport, u8 *data) +{ + unsigned long flags; + unsigned char u, v; + unsigned int t, s; + int i; + + for (i = 0; i < GUILLEMOT_MAX_LENGTH; i++) + data[i] = 0; + + i = 0; + t = gameport_time(gameport, GUILLEMOT_MAX_START); + s = gameport_time(gameport, GUILLEMOT_MAX_STROBE); + + local_irq_save(flags); + gameport_trigger(gameport); + v = gameport_read(gameport); + + while (t > 0 && i < GUILLEMOT_MAX_LENGTH * 8) { + t--; + u = v; v = gameport_read(gameport); + if (v & ~u & 0x10) { + data[i >> 3] |= ((v >> 5) & 1) << (i & 7); + i++; + t = s; + } + } + + local_irq_restore(flags); + + return i; +} + +/* + * guillemot_poll() reads and analyzes Guillemot joystick data. + */ + +static void guillemot_poll(struct gameport *gameport) +{ + struct guillemot *guillemot = gameport_get_drvdata(gameport); + struct input_dev *dev = guillemot->dev; + u8 data[GUILLEMOT_MAX_LENGTH]; + int i; + + guillemot->reads++; + + if (guillemot_read_packet(guillemot->gameport, data) != GUILLEMOT_MAX_LENGTH * 8 || + data[0] != 0x55 || data[16] != 0xaa) { + guillemot->bads++; + } else { + + for (i = 0; i < 6 && guillemot->type->abs[i] >= 0; i++) + input_report_abs(dev, guillemot->type->abs[i], data[i + 5]); + + if (guillemot->type->hat) { + input_report_abs(dev, ABS_HAT0X, guillemot_hat_to_axis[data[4] >> 4].x); + input_report_abs(dev, ABS_HAT0Y, guillemot_hat_to_axis[data[4] >> 4].y); + } + + for (i = 0; i < 16 && guillemot->type->btn[i] >= 0; i++) + input_report_key(dev, guillemot->type->btn[i], (data[2 + (i >> 3)] >> (i & 7)) & 1); + } + + input_sync(dev); +} + +/* + * guillemot_open() is a callback from the input open routine. + */ + +static int guillemot_open(struct input_dev *dev) +{ + struct guillemot *guillemot = input_get_drvdata(dev); + + gameport_start_polling(guillemot->gameport); + return 0; +} + +/* + * guillemot_close() is a callback from the input close routine. + */ + +static void guillemot_close(struct input_dev *dev) +{ + struct guillemot *guillemot = input_get_drvdata(dev); + + gameport_stop_polling(guillemot->gameport); +} + +/* + * guillemot_connect() probes for Guillemot joysticks. + */ + +static int guillemot_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct guillemot *guillemot; + struct input_dev *input_dev; + u8 data[GUILLEMOT_MAX_LENGTH]; + int i, t; + int err; + + guillemot = kzalloc(sizeof(struct guillemot), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!guillemot || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + guillemot->gameport = gameport; + guillemot->dev = input_dev; + + gameport_set_drvdata(gameport, guillemot); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + i = guillemot_read_packet(gameport, data); + + if (i != GUILLEMOT_MAX_LENGTH * 8 || data[0] != 0x55 || data[16] != 0xaa) { + err = -ENODEV; + goto fail2; + } + + for (i = 0; guillemot_type[i].name; i++) + if (guillemot_type[i].id == data[11]) + break; + + if (!guillemot_type[i].name) { + printk(KERN_WARNING "guillemot.c: Unknown joystick on %s. [ %02x%02x:%04x, ver %d.%02d ]\n", + gameport->phys, data[12], data[13], data[11], data[14], data[15]); + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, guillemot_poll); + gameport_set_poll_interval(gameport, 20); + + snprintf(guillemot->phys, sizeof(guillemot->phys), "%s/input0", gameport->phys); + guillemot->type = guillemot_type + i; + + input_dev->name = guillemot_type[i].name; + input_dev->phys = guillemot->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_GUILLEMOT; + input_dev->id.product = guillemot_type[i].id; + input_dev->id.version = (int)data[14] << 8 | data[15]; + input_dev->dev.parent = &gameport->dev; + + input_set_drvdata(input_dev, guillemot); + + input_dev->open = guillemot_open; + input_dev->close = guillemot_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; (t = guillemot->type->abs[i]) >= 0; i++) + input_set_abs_params(input_dev, t, 0, 255, 0, 0); + + if (guillemot->type->hat) { + input_set_abs_params(input_dev, ABS_HAT0X, -1, 1, 0, 0); + input_set_abs_params(input_dev, ABS_HAT0Y, -1, 1, 0, 0); + } + + for (i = 0; (t = guillemot->type->btn[i]) >= 0; i++) + set_bit(t, input_dev->keybit); + + err = input_register_device(guillemot->dev); + if (err) + goto fail2; + + return 0; + +fail2: gameport_close(gameport); +fail1: gameport_set_drvdata(gameport, NULL); + input_free_device(input_dev); + kfree(guillemot); + return err; +} + +static void guillemot_disconnect(struct gameport *gameport) +{ + struct guillemot *guillemot = gameport_get_drvdata(gameport); + + printk(KERN_INFO "guillemot.c: Failed %d reads out of %d on %s\n", guillemot->reads, guillemot->bads, guillemot->phys); + input_unregister_device(guillemot->dev); + gameport_close(gameport); + kfree(guillemot); +} + +static struct gameport_driver guillemot_drv = { + .driver = { + .name = "guillemot", + }, + .description = DRIVER_DESC, + .connect = guillemot_connect, + .disconnect = guillemot_disconnect, +}; + +module_gameport_driver(guillemot_drv); diff --git a/drivers/input/joystick/iforce/Kconfig b/drivers/input/joystick/iforce/Kconfig new file mode 100644 index 00000000..8fde22a0 --- /dev/null +++ b/drivers/input/joystick/iforce/Kconfig @@ -0,0 +1,32 @@ +# +# I-Force driver configuration +# +config JOYSTICK_IFORCE + tristate "I-Force devices" + depends on INPUT && INPUT_JOYSTICK + help + Say Y here if you have an I-Force joystick or steering wheel + + You also must choose at least one of the two options below. + + To compile this driver as a module, choose M here: the + module will be called iforce. + +config JOYSTICK_IFORCE_USB + bool "I-Force USB joysticks and wheels" + depends on JOYSTICK_IFORCE && (JOYSTICK_IFORCE=m || USB=y) && USB + help + Say Y here if you have an I-Force joystick or steering wheel + connected to your USB port. + +config JOYSTICK_IFORCE_232 + bool "I-Force Serial joysticks and wheels" + depends on JOYSTICK_IFORCE && (JOYSTICK_IFORCE=m || SERIO=y) && SERIO + help + Say Y here if you have an I-Force joystick or steering wheel + connected to your serial (COM) port. + + You will need an additional utility called inputattach, see + + and . + diff --git a/drivers/input/joystick/iforce/Makefile b/drivers/input/joystick/iforce/Makefile new file mode 100644 index 00000000..bc5bda22 --- /dev/null +++ b/drivers/input/joystick/iforce/Makefile @@ -0,0 +1,11 @@ +# +# Makefile for the I-Force driver +# +# By Johann Deneux +# + +obj-$(CONFIG_JOYSTICK_IFORCE) += iforce.o + +iforce-y := iforce-ff.o iforce-main.o iforce-packets.o +iforce-$(CONFIG_JOYSTICK_IFORCE_232) += iforce-serio.o +iforce-$(CONFIG_JOYSTICK_IFORCE_USB) += iforce-usb.o diff --git a/drivers/input/joystick/iforce/iforce-ff.c b/drivers/input/joystick/iforce/iforce-ff.c new file mode 100644 index 00000000..0de9a094 --- /dev/null +++ b/drivers/input/joystick/iforce/iforce-ff.c @@ -0,0 +1,543 @@ +/* + * Copyright (c) 2000-2002 Vojtech Pavlik + * Copyright (c) 2001-2002, 2007 Johann Deneux + * + * USB/RS232 I-Force joysticks and wheels. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include "iforce.h" + +/* + * Set the magnitude of a constant force effect + * Return error code + * + * Note: caller must ensure exclusive access to device + */ + +static int make_magnitude_modifier(struct iforce* iforce, + struct resource* mod_chunk, int no_alloc, __s16 level) +{ + unsigned char data[3]; + + if (!no_alloc) { + mutex_lock(&iforce->mem_mutex); + if (allocate_resource(&(iforce->device_memory), mod_chunk, 2, + iforce->device_memory.start, iforce->device_memory.end, 2L, + NULL, NULL)) { + mutex_unlock(&iforce->mem_mutex); + return -ENOSPC; + } + mutex_unlock(&iforce->mem_mutex); + } + + data[0] = LO(mod_chunk->start); + data[1] = HI(mod_chunk->start); + data[2] = HIFIX80(level); + + iforce_send_packet(iforce, FF_CMD_MAGNITUDE, data); + + iforce_dump_packet("magnitude: ", FF_CMD_MAGNITUDE, data); + return 0; +} + +/* + * Upload the component of an effect dealing with the period, phase and magnitude + */ + +static int make_period_modifier(struct iforce* iforce, + struct resource* mod_chunk, int no_alloc, + __s16 magnitude, __s16 offset, u16 period, u16 phase) +{ + unsigned char data[7]; + + period = TIME_SCALE(period); + + if (!no_alloc) { + mutex_lock(&iforce->mem_mutex); + if (allocate_resource(&(iforce->device_memory), mod_chunk, 0x0c, + iforce->device_memory.start, iforce->device_memory.end, 2L, + NULL, NULL)) { + mutex_unlock(&iforce->mem_mutex); + return -ENOSPC; + } + mutex_unlock(&iforce->mem_mutex); + } + + data[0] = LO(mod_chunk->start); + data[1] = HI(mod_chunk->start); + + data[2] = HIFIX80(magnitude); + data[3] = HIFIX80(offset); + data[4] = HI(phase); + + data[5] = LO(period); + data[6] = HI(period); + + iforce_send_packet(iforce, FF_CMD_PERIOD, data); + + return 0; +} + +/* + * Uploads the part of an effect setting the envelope of the force + */ + +static int make_envelope_modifier(struct iforce* iforce, + struct resource* mod_chunk, int no_alloc, + u16 attack_duration, __s16 initial_level, + u16 fade_duration, __s16 final_level) +{ + unsigned char data[8]; + + attack_duration = TIME_SCALE(attack_duration); + fade_duration = TIME_SCALE(fade_duration); + + if (!no_alloc) { + mutex_lock(&iforce->mem_mutex); + if (allocate_resource(&(iforce->device_memory), mod_chunk, 0x0e, + iforce->device_memory.start, iforce->device_memory.end, 2L, + NULL, NULL)) { + mutex_unlock(&iforce->mem_mutex); + return -ENOSPC; + } + mutex_unlock(&iforce->mem_mutex); + } + + data[0] = LO(mod_chunk->start); + data[1] = HI(mod_chunk->start); + + data[2] = LO(attack_duration); + data[3] = HI(attack_duration); + data[4] = HI(initial_level); + + data[5] = LO(fade_duration); + data[6] = HI(fade_duration); + data[7] = HI(final_level); + + iforce_send_packet(iforce, FF_CMD_ENVELOPE, data); + + return 0; +} + +/* + * Component of spring, friction, inertia... effects + */ + +static int make_condition_modifier(struct iforce* iforce, + struct resource* mod_chunk, int no_alloc, + __u16 rsat, __u16 lsat, __s16 rk, __s16 lk, u16 db, __s16 center) +{ + unsigned char data[10]; + + if (!no_alloc) { + mutex_lock(&iforce->mem_mutex); + if (allocate_resource(&(iforce->device_memory), mod_chunk, 8, + iforce->device_memory.start, iforce->device_memory.end, 2L, + NULL, NULL)) { + mutex_unlock(&iforce->mem_mutex); + return -ENOSPC; + } + mutex_unlock(&iforce->mem_mutex); + } + + data[0] = LO(mod_chunk->start); + data[1] = HI(mod_chunk->start); + + data[2] = (100 * rk) >> 15; /* Dangerous: the sign is extended by gcc on plateforms providing an arith shift */ + data[3] = (100 * lk) >> 15; /* This code is incorrect on cpus lacking arith shift */ + + center = (500 * center) >> 15; + data[4] = LO(center); + data[5] = HI(center); + + db = (1000 * db) >> 16; + data[6] = LO(db); + data[7] = HI(db); + + data[8] = (100 * rsat) >> 16; + data[9] = (100 * lsat) >> 16; + + iforce_send_packet(iforce, FF_CMD_CONDITION, data); + iforce_dump_packet("condition", FF_CMD_CONDITION, data); + + return 0; +} + +static unsigned char find_button(struct iforce *iforce, signed short button) +{ + int i; + + for (i = 1; iforce->type->btn[i] >= 0; i++) + if (iforce->type->btn[i] == button) + return i + 1; + return 0; +} + +/* + * Analyse the changes in an effect, and tell if we need to send an condition + * parameter packet + */ +static int need_condition_modifier(struct iforce *iforce, + struct ff_effect *old, + struct ff_effect *new) +{ + int ret = 0; + int i; + + if (new->type != FF_SPRING && new->type != FF_FRICTION) { + dev_warn(&iforce->dev->dev, "bad effect type in %s\n", + __func__); + return 0; + } + + for (i = 0; i < 2; i++) { + ret |= old->u.condition[i].right_saturation != new->u.condition[i].right_saturation + || old->u.condition[i].left_saturation != new->u.condition[i].left_saturation + || old->u.condition[i].right_coeff != new->u.condition[i].right_coeff + || old->u.condition[i].left_coeff != new->u.condition[i].left_coeff + || old->u.condition[i].deadband != new->u.condition[i].deadband + || old->u.condition[i].center != new->u.condition[i].center; + } + return ret; +} + +/* + * Analyse the changes in an effect, and tell if we need to send a magnitude + * parameter packet + */ +static int need_magnitude_modifier(struct iforce *iforce, + struct ff_effect *old, + struct ff_effect *effect) +{ + if (effect->type != FF_CONSTANT) { + dev_warn(&iforce->dev->dev, "bad effect type in %s\n", + __func__); + return 0; + } + + return old->u.constant.level != effect->u.constant.level; +} + +/* + * Analyse the changes in an effect, and tell if we need to send an envelope + * parameter packet + */ +static int need_envelope_modifier(struct iforce *iforce, struct ff_effect *old, + struct ff_effect *effect) +{ + switch (effect->type) { + case FF_CONSTANT: + if (old->u.constant.envelope.attack_length != effect->u.constant.envelope.attack_length + || old->u.constant.envelope.attack_level != effect->u.constant.envelope.attack_level + || old->u.constant.envelope.fade_length != effect->u.constant.envelope.fade_length + || old->u.constant.envelope.fade_level != effect->u.constant.envelope.fade_level) + return 1; + break; + + case FF_PERIODIC: + if (old->u.periodic.envelope.attack_length != effect->u.periodic.envelope.attack_length + || old->u.periodic.envelope.attack_level != effect->u.periodic.envelope.attack_level + || old->u.periodic.envelope.fade_length != effect->u.periodic.envelope.fade_length + || old->u.periodic.envelope.fade_level != effect->u.periodic.envelope.fade_level) + return 1; + break; + + default: + dev_warn(&iforce->dev->dev, "bad effect type in %s\n", + __func__); + } + + return 0; +} + +/* + * Analyse the changes in an effect, and tell if we need to send a periodic + * parameter effect + */ +static int need_period_modifier(struct iforce *iforce, struct ff_effect *old, + struct ff_effect *new) +{ + if (new->type != FF_PERIODIC) { + dev_warn(&iforce->dev->dev, "bad effect type in %s\n", + __func__); + return 0; + } + return (old->u.periodic.period != new->u.periodic.period + || old->u.periodic.magnitude != new->u.periodic.magnitude + || old->u.periodic.offset != new->u.periodic.offset + || old->u.periodic.phase != new->u.periodic.phase); +} + +/* + * Analyse the changes in an effect, and tell if we need to send an effect + * packet + */ +static int need_core(struct ff_effect *old, struct ff_effect *new) +{ + if (old->direction != new->direction + || old->trigger.button != new->trigger.button + || old->trigger.interval != new->trigger.interval + || old->replay.length != new->replay.length + || old->replay.delay != new->replay.delay) + return 1; + + return 0; +} +/* + * Send the part common to all effects to the device + */ +static int make_core(struct iforce* iforce, u16 id, u16 mod_id1, u16 mod_id2, + u8 effect_type, u8 axes, u16 duration, u16 delay, u16 button, + u16 interval, u16 direction) +{ + unsigned char data[14]; + + duration = TIME_SCALE(duration); + delay = TIME_SCALE(delay); + interval = TIME_SCALE(interval); + + data[0] = LO(id); + data[1] = effect_type; + data[2] = LO(axes) | find_button(iforce, button); + + data[3] = LO(duration); + data[4] = HI(duration); + + data[5] = HI(direction); + + data[6] = LO(interval); + data[7] = HI(interval); + + data[8] = LO(mod_id1); + data[9] = HI(mod_id1); + data[10] = LO(mod_id2); + data[11] = HI(mod_id2); + + data[12] = LO(delay); + data[13] = HI(delay); + + /* Stop effect */ +/* iforce_control_playback(iforce, id, 0);*/ + + iforce_send_packet(iforce, FF_CMD_EFFECT, data); + + /* If needed, restart effect */ + if (test_bit(FF_CORE_SHOULD_PLAY, iforce->core_effects[id].flags)) { + /* BUG: perhaps we should replay n times, instead of 1. But we do not know n */ + iforce_control_playback(iforce, id, 1); + } + + return 0; +} + +/* + * Upload a periodic effect to the device + * See also iforce_upload_constant. + */ +int iforce_upload_periodic(struct iforce *iforce, struct ff_effect *effect, struct ff_effect *old) +{ + u8 wave_code; + int core_id = effect->id; + struct iforce_core_effect* core_effect = iforce->core_effects + core_id; + struct resource* mod1_chunk = &(iforce->core_effects[core_id].mod1_chunk); + struct resource* mod2_chunk = &(iforce->core_effects[core_id].mod2_chunk); + int param1_err = 1; + int param2_err = 1; + int core_err = 0; + + if (!old || need_period_modifier(iforce, old, effect)) { + param1_err = make_period_modifier(iforce, mod1_chunk, + old != NULL, + effect->u.periodic.magnitude, effect->u.periodic.offset, + effect->u.periodic.period, effect->u.periodic.phase); + if (param1_err) + return param1_err; + set_bit(FF_MOD1_IS_USED, core_effect->flags); + } + + if (!old || need_envelope_modifier(iforce, old, effect)) { + param2_err = make_envelope_modifier(iforce, mod2_chunk, + old !=NULL, + effect->u.periodic.envelope.attack_length, + effect->u.periodic.envelope.attack_level, + effect->u.periodic.envelope.fade_length, + effect->u.periodic.envelope.fade_level); + if (param2_err) + return param2_err; + set_bit(FF_MOD2_IS_USED, core_effect->flags); + } + + switch (effect->u.periodic.waveform) { + case FF_SQUARE: wave_code = 0x20; break; + case FF_TRIANGLE: wave_code = 0x21; break; + case FF_SINE: wave_code = 0x22; break; + case FF_SAW_UP: wave_code = 0x23; break; + case FF_SAW_DOWN: wave_code = 0x24; break; + default: wave_code = 0x20; break; + } + + if (!old || need_core(old, effect)) { + core_err = make_core(iforce, effect->id, + mod1_chunk->start, + mod2_chunk->start, + wave_code, + 0x20, + effect->replay.length, + effect->replay.delay, + effect->trigger.button, + effect->trigger.interval, + effect->direction); + } + + /* If one of the parameter creation failed, we already returned an + * error code. + * If the core creation failed, we return its error code. + * Else: if one parameter at least was created, we return 0 + * else we return 1; + */ + return core_err < 0 ? core_err : (param1_err && param2_err); +} + +/* + * Upload a constant force effect + * Return value: + * <0 Error code + * 0 Ok, effect created or updated + * 1 effect did not change since last upload, and no packet was therefore sent + */ +int iforce_upload_constant(struct iforce *iforce, struct ff_effect *effect, struct ff_effect *old) +{ + int core_id = effect->id; + struct iforce_core_effect* core_effect = iforce->core_effects + core_id; + struct resource* mod1_chunk = &(iforce->core_effects[core_id].mod1_chunk); + struct resource* mod2_chunk = &(iforce->core_effects[core_id].mod2_chunk); + int param1_err = 1; + int param2_err = 1; + int core_err = 0; + + if (!old || need_magnitude_modifier(iforce, old, effect)) { + param1_err = make_magnitude_modifier(iforce, mod1_chunk, + old != NULL, + effect->u.constant.level); + if (param1_err) + return param1_err; + set_bit(FF_MOD1_IS_USED, core_effect->flags); + } + + if (!old || need_envelope_modifier(iforce, old, effect)) { + param2_err = make_envelope_modifier(iforce, mod2_chunk, + old != NULL, + effect->u.constant.envelope.attack_length, + effect->u.constant.envelope.attack_level, + effect->u.constant.envelope.fade_length, + effect->u.constant.envelope.fade_level); + if (param2_err) + return param2_err; + set_bit(FF_MOD2_IS_USED, core_effect->flags); + } + + if (!old || need_core(old, effect)) { + core_err = make_core(iforce, effect->id, + mod1_chunk->start, + mod2_chunk->start, + 0x00, + 0x20, + effect->replay.length, + effect->replay.delay, + effect->trigger.button, + effect->trigger.interval, + effect->direction); + } + + /* If one of the parameter creation failed, we already returned an + * error code. + * If the core creation failed, we return its error code. + * Else: if one parameter at least was created, we return 0 + * else we return 1; + */ + return core_err < 0 ? core_err : (param1_err && param2_err); +} + +/* + * Upload an condition effect. Those are for example friction, inertia, springs... + */ +int iforce_upload_condition(struct iforce *iforce, struct ff_effect *effect, struct ff_effect *old) +{ + int core_id = effect->id; + struct iforce_core_effect* core_effect = iforce->core_effects + core_id; + struct resource* mod1_chunk = &(core_effect->mod1_chunk); + struct resource* mod2_chunk = &(core_effect->mod2_chunk); + u8 type; + int param_err = 1; + int core_err = 0; + + switch (effect->type) { + case FF_SPRING: type = 0x40; break; + case FF_DAMPER: type = 0x41; break; + default: return -1; + } + + if (!old || need_condition_modifier(iforce, old, effect)) { + param_err = make_condition_modifier(iforce, mod1_chunk, + old != NULL, + effect->u.condition[0].right_saturation, + effect->u.condition[0].left_saturation, + effect->u.condition[0].right_coeff, + effect->u.condition[0].left_coeff, + effect->u.condition[0].deadband, + effect->u.condition[0].center); + if (param_err) + return param_err; + set_bit(FF_MOD1_IS_USED, core_effect->flags); + + param_err = make_condition_modifier(iforce, mod2_chunk, + old != NULL, + effect->u.condition[1].right_saturation, + effect->u.condition[1].left_saturation, + effect->u.condition[1].right_coeff, + effect->u.condition[1].left_coeff, + effect->u.condition[1].deadband, + effect->u.condition[1].center); + if (param_err) + return param_err; + set_bit(FF_MOD2_IS_USED, core_effect->flags); + + } + + if (!old || need_core(old, effect)) { + core_err = make_core(iforce, effect->id, + mod1_chunk->start, mod2_chunk->start, + type, 0xc0, + effect->replay.length, effect->replay.delay, + effect->trigger.button, effect->trigger.interval, + effect->direction); + } + + /* If the parameter creation failed, we already returned an + * error code. + * If the core creation failed, we return its error code. + * Else: if a parameter was created, we return 0 + * else we return 1; + */ + return core_err < 0 ? core_err : param_err; +} diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c new file mode 100644 index 00000000..daeeb4c7 --- /dev/null +++ b/drivers/input/joystick/iforce/iforce-main.c @@ -0,0 +1,489 @@ +/* + * Copyright (c) 2000-2002 Vojtech Pavlik + * Copyright (c) 2001-2002, 2007 Johann Deneux + * + * USB/RS232 I-Force joysticks and wheels. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include "iforce.h" + +MODULE_AUTHOR("Vojtech Pavlik , Johann Deneux "); +MODULE_DESCRIPTION("USB/RS232 I-Force joysticks and wheels driver"); +MODULE_LICENSE("GPL"); + +static signed short btn_joystick[] = +{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE, + BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_A, BTN_B, BTN_C, -1 }; + +static signed short btn_avb_pegasus[] = +{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE, + BTN_BASE2, BTN_BASE3, BTN_BASE4, -1 }; + +static signed short btn_wheel[] = +{ BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_TOP2, BTN_BASE, + BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_BASE5, BTN_A, BTN_B, BTN_C, -1 }; + +static signed short btn_avb_tw[] = +{ BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, + BTN_BASE2, BTN_BASE3, BTN_BASE4, -1 }; + +static signed short btn_avb_wheel[] = +{ BTN_GEAR_DOWN, BTN_GEAR_UP, BTN_BASE, BTN_BASE2, BTN_BASE3, + BTN_BASE4, BTN_BASE5, BTN_BASE6, -1 }; + +static signed short abs_joystick[] = +{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y, -1 }; + +static signed short abs_joystick_rudder[] = +{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, -1 }; + +static signed short abs_avb_pegasus[] = +{ ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER, ABS_HAT0X, ABS_HAT0Y, + ABS_HAT1X, ABS_HAT1Y, -1 }; + +static signed short abs_wheel[] = +{ ABS_WHEEL, ABS_GAS, ABS_BRAKE, ABS_HAT0X, ABS_HAT0Y, -1 }; + +static signed short ff_iforce[] = +{ FF_PERIODIC, FF_CONSTANT, FF_SPRING, FF_DAMPER, + FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP, FF_SAW_DOWN, FF_GAIN, + FF_AUTOCENTER, -1 }; + +static struct iforce_device iforce_device[] = { + { 0x044f, 0xa01c, "Thrustmaster Motor Sport GT", btn_wheel, abs_wheel, ff_iforce }, + { 0x046d, 0xc281, "Logitech WingMan Force", btn_joystick, abs_joystick, ff_iforce }, + { 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce }, + { 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_avb_pegasus, abs_avb_pegasus, ff_iforce }, + { 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_avb_wheel, abs_wheel, ff_iforce }, + { 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_avb_tw, abs_wheel, ff_iforce }, //? + { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? + { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, + { 0x06f8, 0x0001, "Guillemot Race Leader Force Feedback", btn_wheel, abs_wheel, ff_iforce }, //? + { 0x06f8, 0x0001, "Guillemot Jet Leader Force Feedback", btn_joystick, abs_joystick_rudder, ff_iforce }, + { 0x06f8, 0x0004, "Guillemot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? + { 0x06f8, 0xa302, "Guillemot Jet Leader 3D", btn_joystick, abs_joystick, ff_iforce }, //? + { 0x06d6, 0x29bc, "Trust Force Feedback Race Master", btn_wheel, abs_wheel, ff_iforce }, + { 0x0000, 0x0000, "Unknown I-Force Device [%04x:%04x]", btn_joystick, abs_joystick, ff_iforce } +}; + +static int iforce_playback(struct input_dev *dev, int effect_id, int value) +{ + struct iforce *iforce = input_get_drvdata(dev); + struct iforce_core_effect *core_effect = &iforce->core_effects[effect_id]; + + if (value > 0) + set_bit(FF_CORE_SHOULD_PLAY, core_effect->flags); + else + clear_bit(FF_CORE_SHOULD_PLAY, core_effect->flags); + + iforce_control_playback(iforce, effect_id, value); + return 0; +} + +static void iforce_set_gain(struct input_dev *dev, u16 gain) +{ + struct iforce *iforce = input_get_drvdata(dev); + unsigned char data[3]; + + data[0] = gain >> 9; + iforce_send_packet(iforce, FF_CMD_GAIN, data); +} + +static void iforce_set_autocenter(struct input_dev *dev, u16 magnitude) +{ + struct iforce *iforce = input_get_drvdata(dev); + unsigned char data[3]; + + data[0] = 0x03; + data[1] = magnitude >> 9; + iforce_send_packet(iforce, FF_CMD_AUTOCENTER, data); + + data[0] = 0x04; + data[1] = 0x01; + iforce_send_packet(iforce, FF_CMD_AUTOCENTER, data); +} + +/* + * Function called when an ioctl is performed on the event dev entry. + * It uploads an effect to the device + */ +static int iforce_upload_effect(struct input_dev *dev, struct ff_effect *effect, struct ff_effect *old) +{ + struct iforce *iforce = input_get_drvdata(dev); + struct iforce_core_effect *core_effect = &iforce->core_effects[effect->id]; + int ret; + + if (__test_and_set_bit(FF_CORE_IS_USED, core_effect->flags)) { + /* Check the effect is not already being updated */ + if (test_bit(FF_CORE_UPDATE, core_effect->flags)) + return -EAGAIN; + } + +/* + * Upload the effect + */ + switch (effect->type) { + + case FF_PERIODIC: + ret = iforce_upload_periodic(iforce, effect, old); + break; + + case FF_CONSTANT: + ret = iforce_upload_constant(iforce, effect, old); + break; + + case FF_SPRING: + case FF_DAMPER: + ret = iforce_upload_condition(iforce, effect, old); + break; + + default: + return -EINVAL; + } + + if (ret == 0) { + /* A packet was sent, forbid new updates until we are notified + * that the packet was updated + */ + set_bit(FF_CORE_UPDATE, core_effect->flags); + } + return ret; +} + +/* + * Erases an effect: it frees the effect id and mark as unused the memory + * allocated for the parameters + */ +static int iforce_erase_effect(struct input_dev *dev, int effect_id) +{ + struct iforce *iforce = input_get_drvdata(dev); + struct iforce_core_effect *core_effect = &iforce->core_effects[effect_id]; + int err = 0; + + if (test_bit(FF_MOD1_IS_USED, core_effect->flags)) + err = release_resource(&core_effect->mod1_chunk); + + if (!err && test_bit(FF_MOD2_IS_USED, core_effect->flags)) + err = release_resource(&core_effect->mod2_chunk); + + /* TODO: remember to change that if more FF_MOD* bits are added */ + core_effect->flags[0] = 0; + + return err; +} + +static int iforce_open(struct input_dev *dev) +{ + struct iforce *iforce = input_get_drvdata(dev); + + switch (iforce->bus) { +#ifdef CONFIG_JOYSTICK_IFORCE_USB + case IFORCE_USB: + iforce->irq->dev = iforce->usbdev; + if (usb_submit_urb(iforce->irq, GFP_KERNEL)) + return -EIO; + break; +#endif + } + + if (test_bit(EV_FF, dev->evbit)) { + /* Enable force feedback */ + iforce_send_packet(iforce, FF_CMD_ENABLE, "\004"); + } + + return 0; +} + +static void iforce_close(struct input_dev *dev) +{ + struct iforce *iforce = input_get_drvdata(dev); + int i; + + if (test_bit(EV_FF, dev->evbit)) { + /* Check: no effects should be present in memory */ + for (i = 0; i < dev->ff->max_effects; i++) { + if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags)) { + dev_warn(&dev->dev, + "%s: Device still owns effects\n", + __func__); + break; + } + } + + /* Disable force feedback playback */ + iforce_send_packet(iforce, FF_CMD_ENABLE, "\001"); + /* Wait for the command to complete */ + wait_event_interruptible(iforce->wait, + !test_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags)); + } + + switch (iforce->bus) { +#ifdef CONFIG_JOYSTICK_IFORCE_USB + case IFORCE_USB: + usb_kill_urb(iforce->irq); + usb_kill_urb(iforce->out); + usb_kill_urb(iforce->ctrl); + break; +#endif +#ifdef CONFIG_JOYSTICK_IFORCE_232 + case IFORCE_232: + //TODO: Wait for the last packets to be sent + break; +#endif + } +} + +int iforce_init_device(struct iforce *iforce) +{ + struct input_dev *input_dev; + struct ff_device *ff; + unsigned char c[] = "CEOV"; + int i, error; + int ff_effects = 0; + + input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + init_waitqueue_head(&iforce->wait); + spin_lock_init(&iforce->xmit_lock); + mutex_init(&iforce->mem_mutex); + iforce->xmit.buf = iforce->xmit_data; + iforce->dev = input_dev; + +/* + * Input device fields. + */ + + switch (iforce->bus) { +#ifdef CONFIG_JOYSTICK_IFORCE_USB + case IFORCE_USB: + input_dev->id.bustype = BUS_USB; + input_dev->dev.parent = &iforce->usbdev->dev; + break; +#endif +#ifdef CONFIG_JOYSTICK_IFORCE_232 + case IFORCE_232: + input_dev->id.bustype = BUS_RS232; + input_dev->dev.parent = &iforce->serio->dev; + break; +#endif + } + + input_set_drvdata(input_dev, iforce); + + input_dev->name = "Unknown I-Force device"; + input_dev->open = iforce_open; + input_dev->close = iforce_close; + +/* + * On-device memory allocation. + */ + + iforce->device_memory.name = "I-Force device effect memory"; + iforce->device_memory.start = 0; + iforce->device_memory.end = 200; + iforce->device_memory.flags = IORESOURCE_MEM; + iforce->device_memory.parent = NULL; + iforce->device_memory.child = NULL; + iforce->device_memory.sibling = NULL; + +/* + * Wait until device ready - until it sends its first response. + */ + + for (i = 0; i < 20; i++) + if (!iforce_get_id_packet(iforce, "O")) + break; + + if (i == 20) { /* 5 seconds */ + dev_err(&input_dev->dev, + "Timeout waiting for response from device.\n"); + error = -ENODEV; + goto fail; + } + +/* + * Get device info. + */ + + if (!iforce_get_id_packet(iforce, "M")) + input_dev->id.vendor = (iforce->edata[2] << 8) | iforce->edata[1]; + else + dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n"); + + if (!iforce_get_id_packet(iforce, "P")) + input_dev->id.product = (iforce->edata[2] << 8) | iforce->edata[1]; + else + dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n"); + + if (!iforce_get_id_packet(iforce, "B")) + iforce->device_memory.end = (iforce->edata[2] << 8) | iforce->edata[1]; + else + dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n"); + + if (!iforce_get_id_packet(iforce, "N")) + ff_effects = iforce->edata[1]; + else + dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n"); + + /* Check if the device can store more effects than the driver can really handle */ + if (ff_effects > IFORCE_EFFECTS_MAX) { + dev_warn(&iforce->dev->dev, "Limiting number of effects to %d (device reports %d)\n", + IFORCE_EFFECTS_MAX, ff_effects); + ff_effects = IFORCE_EFFECTS_MAX; + } + +/* + * Display additional info. + */ + + for (i = 0; c[i]; i++) + if (!iforce_get_id_packet(iforce, c + i)) + iforce_dump_packet("info", iforce->ecmd, iforce->edata); + +/* + * Disable spring, enable force feedback. + */ + iforce_set_autocenter(input_dev, 0); + +/* + * Find appropriate device entry + */ + + for (i = 0; iforce_device[i].idvendor; i++) + if (iforce_device[i].idvendor == input_dev->id.vendor && + iforce_device[i].idproduct == input_dev->id.product) + break; + + iforce->type = iforce_device + i; + input_dev->name = iforce->type->name; + +/* + * Set input device bitfields and ranges. + */ + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | + BIT_MASK(EV_FF_STATUS); + + for (i = 0; iforce->type->btn[i] >= 0; i++) + set_bit(iforce->type->btn[i], input_dev->keybit); + set_bit(BTN_DEAD, input_dev->keybit); + + for (i = 0; iforce->type->abs[i] >= 0; i++) { + + signed short t = iforce->type->abs[i]; + + switch (t) { + + case ABS_X: + case ABS_Y: + case ABS_WHEEL: + + input_set_abs_params(input_dev, t, -1920, 1920, 16, 128); + set_bit(t, input_dev->ffbit); + break; + + case ABS_THROTTLE: + case ABS_GAS: + case ABS_BRAKE: + + input_set_abs_params(input_dev, t, 0, 255, 0, 0); + break; + + case ABS_RUDDER: + + input_set_abs_params(input_dev, t, -128, 127, 0, 0); + break; + + case ABS_HAT0X: + case ABS_HAT0Y: + case ABS_HAT1X: + case ABS_HAT1Y: + + input_set_abs_params(input_dev, t, -1, 1, 0, 0); + break; + } + } + + if (ff_effects) { + + for (i = 0; iforce->type->ff[i] >= 0; i++) + set_bit(iforce->type->ff[i], input_dev->ffbit); + + error = input_ff_create(input_dev, ff_effects); + if (error) + goto fail; + + ff = input_dev->ff; + ff->upload = iforce_upload_effect; + ff->erase = iforce_erase_effect; + ff->set_gain = iforce_set_gain; + ff->set_autocenter = iforce_set_autocenter; + ff->playback = iforce_playback; + } +/* + * Register input device. + */ + + error = input_register_device(iforce->dev); + if (error) + goto fail; + + return 0; + + fail: input_free_device(input_dev); + return error; +} + +static int __init iforce_init(void) +{ + int err = 0; + +#ifdef CONFIG_JOYSTICK_IFORCE_USB + err = usb_register(&iforce_usb_driver); + if (err) + return err; +#endif +#ifdef CONFIG_JOYSTICK_IFORCE_232 + err = serio_register_driver(&iforce_serio_drv); +#ifdef CONFIG_JOYSTICK_IFORCE_USB + if (err) + usb_deregister(&iforce_usb_driver); +#endif +#endif + return err; +} + +static void __exit iforce_exit(void) +{ +#ifdef CONFIG_JOYSTICK_IFORCE_USB + usb_deregister(&iforce_usb_driver); +#endif +#ifdef CONFIG_JOYSTICK_IFORCE_232 + serio_unregister_driver(&iforce_serio_drv); +#endif +} + +module_init(iforce_init); +module_exit(iforce_exit); diff --git a/drivers/input/joystick/iforce/iforce-packets.c b/drivers/input/joystick/iforce/iforce-packets.c new file mode 100644 index 00000000..08f98f2e --- /dev/null +++ b/drivers/input/joystick/iforce/iforce-packets.c @@ -0,0 +1,309 @@ +/* + * Copyright (c) 2000-2002 Vojtech Pavlik + * Copyright (c) 2001-2002, 2007 Johann Deneux + * + * USB/RS232 I-Force joysticks and wheels. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include "iforce.h" + +static struct { + __s32 x; + __s32 y; +} iforce_hat_to_axis[16] = {{ 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; + + +void iforce_dump_packet(char *msg, u16 cmd, unsigned char *data) +{ + int i; + + printk(KERN_DEBUG __FILE__ ": %s cmd = %04x, data = ", msg, cmd); + for (i = 0; i < LO(cmd); i++) + printk("%02x ", data[i]); + printk("\n"); +} + +/* + * Send a packet of bytes to the device + */ +int iforce_send_packet(struct iforce *iforce, u16 cmd, unsigned char* data) +{ + /* Copy data to buffer */ + int n = LO(cmd); + int c; + int empty; + int head, tail; + unsigned long flags; + +/* + * Update head and tail of xmit buffer + */ + spin_lock_irqsave(&iforce->xmit_lock, flags); + + head = iforce->xmit.head; + tail = iforce->xmit.tail; + + + if (CIRC_SPACE(head, tail, XMIT_SIZE) < n+2) { + dev_warn(&iforce->dev->dev, + "not enough space in xmit buffer to send new packet\n"); + spin_unlock_irqrestore(&iforce->xmit_lock, flags); + return -1; + } + + empty = head == tail; + XMIT_INC(iforce->xmit.head, n+2); + +/* + * Store packet in xmit buffer + */ + iforce->xmit.buf[head] = HI(cmd); + XMIT_INC(head, 1); + iforce->xmit.buf[head] = LO(cmd); + XMIT_INC(head, 1); + + c = CIRC_SPACE_TO_END(head, tail, XMIT_SIZE); + if (n < c) c=n; + + memcpy(&iforce->xmit.buf[head], + data, + c); + if (n != c) { + memcpy(&iforce->xmit.buf[0], + data + c, + n - c); + } + XMIT_INC(head, n); + + spin_unlock_irqrestore(&iforce->xmit_lock, flags); +/* + * If necessary, start the transmission + */ + switch (iforce->bus) { + +#ifdef CONFIG_JOYSTICK_IFORCE_232 + case IFORCE_232: + if (empty) + iforce_serial_xmit(iforce); + break; +#endif +#ifdef CONFIG_JOYSTICK_IFORCE_USB + case IFORCE_USB: + + if (iforce->usbdev && empty && + !test_and_set_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags)) { + + iforce_usb_xmit(iforce); + } + break; +#endif + } + return 0; +} + +/* Start or stop an effect */ +int iforce_control_playback(struct iforce* iforce, u16 id, unsigned int value) +{ + unsigned char data[3]; + + data[0] = LO(id); + data[1] = (value > 0) ? ((value > 1) ? 0x41 : 0x01) : 0; + data[2] = LO(value); + return iforce_send_packet(iforce, FF_CMD_PLAY, data); +} + +/* Mark an effect that was being updated as ready. That means it can be updated + * again */ +static int mark_core_as_ready(struct iforce *iforce, unsigned short addr) +{ + int i; + + if (!iforce->dev->ff) + return 0; + + for (i = 0; i < iforce->dev->ff->max_effects; ++i) { + if (test_bit(FF_CORE_IS_USED, iforce->core_effects[i].flags) && + (iforce->core_effects[i].mod1_chunk.start == addr || + iforce->core_effects[i].mod2_chunk.start == addr)) { + clear_bit(FF_CORE_UPDATE, iforce->core_effects[i].flags); + return 0; + } + } + dev_warn(&iforce->dev->dev, "unused effect %04x updated !!!\n", addr); + return -1; +} + +void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data) +{ + struct input_dev *dev = iforce->dev; + int i; + static int being_used = 0; + + if (being_used) + dev_warn(&iforce->dev->dev, + "re-entrant call to iforce_process %d\n", being_used); + being_used++; + +#ifdef CONFIG_JOYSTICK_IFORCE_232 + if (HI(iforce->expect_packet) == HI(cmd)) { + iforce->expect_packet = 0; + iforce->ecmd = cmd; + memcpy(iforce->edata, data, IFORCE_MAX_LENGTH); + } +#endif + wake_up(&iforce->wait); + + if (!iforce->type) { + being_used--; + return; + } + + switch (HI(cmd)) { + + case 0x01: /* joystick position data */ + case 0x03: /* wheel position data */ + if (HI(cmd) == 1) { + input_report_abs(dev, ABS_X, (__s16) (((__s16)data[1] << 8) | data[0])); + input_report_abs(dev, ABS_Y, (__s16) (((__s16)data[3] << 8) | data[2])); + input_report_abs(dev, ABS_THROTTLE, 255 - data[4]); + if (LO(cmd) >= 8 && test_bit(ABS_RUDDER ,dev->absbit)) + input_report_abs(dev, ABS_RUDDER, (__s8)data[7]); + } else { + input_report_abs(dev, ABS_WHEEL, (__s16) (((__s16)data[1] << 8) | data[0])); + input_report_abs(dev, ABS_GAS, 255 - data[2]); + input_report_abs(dev, ABS_BRAKE, 255 - data[3]); + } + + input_report_abs(dev, ABS_HAT0X, iforce_hat_to_axis[data[6] >> 4].x); + input_report_abs(dev, ABS_HAT0Y, iforce_hat_to_axis[data[6] >> 4].y); + + for (i = 0; iforce->type->btn[i] >= 0; i++) + input_report_key(dev, iforce->type->btn[i], data[(i >> 3) + 5] & (1 << (i & 7))); + + /* If there are untouched bits left, interpret them as the second hat */ + if (i <= 8) { + int btns = data[6]; + if (test_bit(ABS_HAT1X, dev->absbit)) { + if (btns & 8) input_report_abs(dev, ABS_HAT1X, -1); + else if (btns & 2) input_report_abs(dev, ABS_HAT1X, 1); + else input_report_abs(dev, ABS_HAT1X, 0); + } + if (test_bit(ABS_HAT1Y, dev->absbit)) { + if (btns & 1) input_report_abs(dev, ABS_HAT1Y, -1); + else if (btns & 4) input_report_abs(dev, ABS_HAT1Y, 1); + else input_report_abs(dev, ABS_HAT1Y, 0); + } + } + + input_sync(dev); + + break; + + case 0x02: /* status report */ + input_report_key(dev, BTN_DEAD, data[0] & 0x02); + input_sync(dev); + + /* Check if an effect was just started or stopped */ + i = data[1] & 0x7f; + if (data[1] & 0x80) { + if (!test_and_set_bit(FF_CORE_IS_PLAYED, iforce->core_effects[i].flags)) { + /* Report play event */ + input_report_ff_status(dev, i, FF_STATUS_PLAYING); + } + } else if (test_and_clear_bit(FF_CORE_IS_PLAYED, iforce->core_effects[i].flags)) { + /* Report stop event */ + input_report_ff_status(dev, i, FF_STATUS_STOPPED); + } + if (LO(cmd) > 3) { + int j; + for (j = 3; j < LO(cmd); j += 2) + mark_core_as_ready(iforce, data[j] | (data[j+1]<<8)); + } + break; + } + being_used--; +} + +int iforce_get_id_packet(struct iforce *iforce, char *packet) +{ + switch (iforce->bus) { + + case IFORCE_USB: { +#ifdef CONFIG_JOYSTICK_IFORCE_USB + int status; + + iforce->cr.bRequest = packet[0]; + iforce->ctrl->dev = iforce->usbdev; + + status = usb_submit_urb(iforce->ctrl, GFP_ATOMIC); + if (status) { + dev_err(&iforce->intf->dev, + "usb_submit_urb failed %d\n", status); + return -1; + } + + wait_event_interruptible_timeout(iforce->wait, + iforce->ctrl->status != -EINPROGRESS, HZ); + + if (iforce->ctrl->status) { + dev_dbg(&iforce->intf->dev, + "iforce->ctrl->status = %d\n", + iforce->ctrl->status); + usb_unlink_urb(iforce->ctrl); + return -1; + } +#else + printk(KERN_DEBUG "iforce_get_id_packet: iforce->bus = USB!\n"); +#endif + } + break; + + case IFORCE_232: + +#ifdef CONFIG_JOYSTICK_IFORCE_232 + iforce->expect_packet = FF_CMD_QUERY; + iforce_send_packet(iforce, FF_CMD_QUERY, packet); + + wait_event_interruptible_timeout(iforce->wait, + !iforce->expect_packet, HZ); + + if (iforce->expect_packet) { + iforce->expect_packet = 0; + return -1; + } +#else + dev_err(&iforce->dev->dev, + "iforce_get_id_packet: iforce->bus = SERIO!\n"); +#endif + break; + + default: + dev_err(&iforce->dev->dev, + "iforce_get_id_packet: iforce->bus = %d\n", + iforce->bus); + break; + } + + return -(iforce->edata[0] != packet[0]); +} + diff --git a/drivers/input/joystick/iforce/iforce-serio.c b/drivers/input/joystick/iforce/iforce-serio.c new file mode 100644 index 00000000..46d5041d --- /dev/null +++ b/drivers/input/joystick/iforce/iforce-serio.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + * Copyright (c) 2001, 2007 Johann Deneux + * + * USB/RS232 I-Force joysticks and wheels. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include "iforce.h" + +void iforce_serial_xmit(struct iforce *iforce) +{ + unsigned char cs; + int i; + unsigned long flags; + + if (test_and_set_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags)) { + set_bit(IFORCE_XMIT_AGAIN, iforce->xmit_flags); + return; + } + + spin_lock_irqsave(&iforce->xmit_lock, flags); + +again: + if (iforce->xmit.head == iforce->xmit.tail) { + clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); + spin_unlock_irqrestore(&iforce->xmit_lock, flags); + return; + } + + cs = 0x2b; + + serio_write(iforce->serio, 0x2b); + + serio_write(iforce->serio, iforce->xmit.buf[iforce->xmit.tail]); + cs ^= iforce->xmit.buf[iforce->xmit.tail]; + XMIT_INC(iforce->xmit.tail, 1); + + for (i=iforce->xmit.buf[iforce->xmit.tail]; i >= 0; --i) { + serio_write(iforce->serio, iforce->xmit.buf[iforce->xmit.tail]); + cs ^= iforce->xmit.buf[iforce->xmit.tail]; + XMIT_INC(iforce->xmit.tail, 1); + } + + serio_write(iforce->serio, cs); + + if (test_and_clear_bit(IFORCE_XMIT_AGAIN, iforce->xmit_flags)) + goto again; + + clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); + + spin_unlock_irqrestore(&iforce->xmit_lock, flags); +} + +static void iforce_serio_write_wakeup(struct serio *serio) +{ + struct iforce *iforce = serio_get_drvdata(serio); + + iforce_serial_xmit(iforce); +} + +static irqreturn_t iforce_serio_irq(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct iforce *iforce = serio_get_drvdata(serio); + + if (!iforce->pkt) { + if (data == 0x2b) + iforce->pkt = 1; + goto out; + } + + if (!iforce->id) { + if (data > 3 && data != 0xff) + iforce->pkt = 0; + else + iforce->id = data; + goto out; + } + + if (!iforce->len) { + if (data > IFORCE_MAX_LENGTH) { + iforce->pkt = 0; + iforce->id = 0; + } else { + iforce->len = data; + } + goto out; + } + + if (iforce->idx < iforce->len) { + iforce->csum += iforce->data[iforce->idx++] = data; + goto out; + } + + if (iforce->idx == iforce->len) { + iforce_process_packet(iforce, (iforce->id << 8) | iforce->idx, iforce->data); + iforce->pkt = 0; + iforce->id = 0; + iforce->len = 0; + iforce->idx = 0; + iforce->csum = 0; + } +out: + return IRQ_HANDLED; +} + +static int iforce_serio_connect(struct serio *serio, struct serio_driver *drv) +{ + struct iforce *iforce; + int err; + + iforce = kzalloc(sizeof(struct iforce), GFP_KERNEL); + if (!iforce) + return -ENOMEM; + + iforce->bus = IFORCE_232; + iforce->serio = serio; + + serio_set_drvdata(serio, iforce); + + err = serio_open(serio, drv); + if (err) + goto fail1; + + err = iforce_init_device(iforce); + if (err) + goto fail2; + + return 0; + + fail2: serio_close(serio); + fail1: serio_set_drvdata(serio, NULL); + kfree(iforce); + return err; +} + +static void iforce_serio_disconnect(struct serio *serio) +{ + struct iforce *iforce = serio_get_drvdata(serio); + + input_unregister_device(iforce->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + kfree(iforce); +} + +static struct serio_device_id iforce_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_IFORCE, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, iforce_serio_ids); + +struct serio_driver iforce_serio_drv = { + .driver = { + .name = "iforce", + }, + .description = "RS232 I-Force joysticks and wheels driver", + .id_table = iforce_serio_ids, + .write_wakeup = iforce_serio_write_wakeup, + .interrupt = iforce_serio_irq, + .connect = iforce_serio_connect, + .disconnect = iforce_serio_disconnect, +}; diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c new file mode 100644 index 00000000..d96aa27d --- /dev/null +++ b/drivers/input/joystick/iforce/iforce-usb.c @@ -0,0 +1,232 @@ + /* + * Copyright (c) 2000-2002 Vojtech Pavlik + * Copyright (c) 2001-2002, 2007 Johann Deneux + * + * USB/RS232 I-Force joysticks and wheels. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include "iforce.h" + +void iforce_usb_xmit(struct iforce *iforce) +{ + int n, c; + unsigned long flags; + + spin_lock_irqsave(&iforce->xmit_lock, flags); + + if (iforce->xmit.head == iforce->xmit.tail) { + clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); + spin_unlock_irqrestore(&iforce->xmit_lock, flags); + return; + } + + ((char *)iforce->out->transfer_buffer)[0] = iforce->xmit.buf[iforce->xmit.tail]; + XMIT_INC(iforce->xmit.tail, 1); + n = iforce->xmit.buf[iforce->xmit.tail]; + XMIT_INC(iforce->xmit.tail, 1); + + iforce->out->transfer_buffer_length = n + 1; + iforce->out->dev = iforce->usbdev; + + /* Copy rest of data then */ + c = CIRC_CNT_TO_END(iforce->xmit.head, iforce->xmit.tail, XMIT_SIZE); + if (n < c) c=n; + + memcpy(iforce->out->transfer_buffer + 1, + &iforce->xmit.buf[iforce->xmit.tail], + c); + if (n != c) { + memcpy(iforce->out->transfer_buffer + 1 + c, + &iforce->xmit.buf[0], + n-c); + } + XMIT_INC(iforce->xmit.tail, n); + + if ( (n=usb_submit_urb(iforce->out, GFP_ATOMIC)) ) { + clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); + dev_warn(&iforce->intf->dev, "usb_submit_urb failed %d\n", n); + } + + /* The IFORCE_XMIT_RUNNING bit is not cleared here. That's intended. + * As long as the urb completion handler is not called, the transmiting + * is considered to be running */ + spin_unlock_irqrestore(&iforce->xmit_lock, flags); +} + +static void iforce_usb_irq(struct urb *urb) +{ + struct iforce *iforce = urb->context; + struct device *dev = &iforce->intf->dev; + int status; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + default: + dev_dbg(dev, "%s - urb has status of: %d\n", + __func__, urb->status); + goto exit; + } + + iforce_process_packet(iforce, + (iforce->data[0] << 8) | (urb->actual_length - 1), iforce->data + 1); + +exit: + status = usb_submit_urb (urb, GFP_ATOMIC); + if (status) + dev_err(dev, "%s - usb_submit_urb failed with result %d\n", + __func__, status); +} + +static void iforce_usb_out(struct urb *urb) +{ + struct iforce *iforce = urb->context; + + if (urb->status) { + clear_bit(IFORCE_XMIT_RUNNING, iforce->xmit_flags); + dev_dbg(&iforce->intf->dev, "urb->status %d, exiting\n", + urb->status); + return; + } + + iforce_usb_xmit(iforce); + + wake_up(&iforce->wait); +} + +static void iforce_usb_ctrl(struct urb *urb) +{ + struct iforce *iforce = urb->context; + if (urb->status) return; + iforce->ecmd = 0xff00 | urb->actual_length; + wake_up(&iforce->wait); +} + +static int iforce_usb_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + struct usb_device *dev = interface_to_usbdev(intf); + struct usb_host_interface *interface; + struct usb_endpoint_descriptor *epirq, *epout; + struct iforce *iforce; + int err = -ENOMEM; + + interface = intf->cur_altsetting; + + epirq = &interface->endpoint[0].desc; + epout = &interface->endpoint[1].desc; + + if (!(iforce = kzalloc(sizeof(struct iforce) + 32, GFP_KERNEL))) + goto fail; + + if (!(iforce->irq = usb_alloc_urb(0, GFP_KERNEL))) + goto fail; + + if (!(iforce->out = usb_alloc_urb(0, GFP_KERNEL))) + goto fail; + + if (!(iforce->ctrl = usb_alloc_urb(0, GFP_KERNEL))) + goto fail; + + iforce->bus = IFORCE_USB; + iforce->usbdev = dev; + iforce->intf = intf; + + iforce->cr.bRequestType = USB_TYPE_VENDOR | USB_DIR_IN | USB_RECIP_INTERFACE; + iforce->cr.wIndex = 0; + iforce->cr.wLength = cpu_to_le16(16); + + usb_fill_int_urb(iforce->irq, dev, usb_rcvintpipe(dev, epirq->bEndpointAddress), + iforce->data, 16, iforce_usb_irq, iforce, epirq->bInterval); + + usb_fill_int_urb(iforce->out, dev, usb_sndintpipe(dev, epout->bEndpointAddress), + iforce + 1, 32, iforce_usb_out, iforce, epout->bInterval); + + usb_fill_control_urb(iforce->ctrl, dev, usb_rcvctrlpipe(dev, 0), + (void*) &iforce->cr, iforce->edata, 16, iforce_usb_ctrl, iforce); + + err = iforce_init_device(iforce); + if (err) + goto fail; + + usb_set_intfdata(intf, iforce); + return 0; + +fail: + if (iforce) { + usb_free_urb(iforce->irq); + usb_free_urb(iforce->out); + usb_free_urb(iforce->ctrl); + kfree(iforce); + } + + return err; +} + +static void iforce_usb_disconnect(struct usb_interface *intf) +{ + struct iforce *iforce = usb_get_intfdata(intf); + + usb_set_intfdata(intf, NULL); + + input_unregister_device(iforce->dev); + + usb_free_urb(iforce->irq); + usb_free_urb(iforce->out); + usb_free_urb(iforce->ctrl); + + kfree(iforce); +} + +static struct usb_device_id iforce_usb_ids [] = { + { USB_DEVICE(0x044f, 0xa01c) }, /* Thrustmaster Motor Sport GT */ + { USB_DEVICE(0x046d, 0xc281) }, /* Logitech WingMan Force */ + { USB_DEVICE(0x046d, 0xc291) }, /* Logitech WingMan Formula Force */ + { USB_DEVICE(0x05ef, 0x020a) }, /* AVB Top Shot Pegasus */ + { USB_DEVICE(0x05ef, 0x8884) }, /* AVB Mag Turbo Force */ + { USB_DEVICE(0x05ef, 0x8888) }, /* AVB Top Shot FFB Racing Wheel */ + { USB_DEVICE(0x061c, 0xc0a4) }, /* ACT LABS Force RS */ + { USB_DEVICE(0x061c, 0xc084) }, /* ACT LABS Force RS */ + { USB_DEVICE(0x06f8, 0x0001) }, /* Guillemot Race Leader Force Feedback */ + { USB_DEVICE(0x06f8, 0x0003) }, /* Guillemot Jet Leader Force Feedback */ + { USB_DEVICE(0x06f8, 0x0004) }, /* Guillemot Force Feedback Racing Wheel */ + { USB_DEVICE(0x06f8, 0xa302) }, /* Guillemot Jet Leader 3D */ + { } /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE (usb, iforce_usb_ids); + +struct usb_driver iforce_usb_driver = { + .name = "iforce", + .probe = iforce_usb_probe, + .disconnect = iforce_usb_disconnect, + .id_table = iforce_usb_ids, +}; diff --git a/drivers/input/joystick/iforce/iforce.h b/drivers/input/joystick/iforce/iforce.h new file mode 100644 index 00000000..b1d7d9b0 --- /dev/null +++ b/drivers/input/joystick/iforce/iforce.h @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2000-2002 Vojtech Pavlik + * Copyright (c) 2001-2002, 2007 Johann Deneux + * + * USB/RS232 I-Force joysticks and wheels. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* This module provides arbitrary resource management routines. + * I use it to manage the device's memory. + * Despite the name of this module, I am *not* going to access the ioports. + */ +#include + + +#define IFORCE_MAX_LENGTH 16 + +/* iforce::bus */ +#define IFORCE_232 1 +#define IFORCE_USB 2 + +#define IFORCE_EFFECTS_MAX 32 + +/* Each force feedback effect is made of one core effect, which can be + * associated to at most to effect modifiers + */ +#define FF_MOD1_IS_USED 0 +#define FF_MOD2_IS_USED 1 +#define FF_CORE_IS_USED 2 +#define FF_CORE_IS_PLAYED 3 /* Effect is currently being played */ +#define FF_CORE_SHOULD_PLAY 4 /* User wants the effect to be played */ +#define FF_CORE_UPDATE 5 /* Effect is being updated */ +#define FF_MODCORE_CNT 6 + +struct iforce_core_effect { + /* Information about where modifiers are stored in the device's memory */ + struct resource mod1_chunk; + struct resource mod2_chunk; + unsigned long flags[BITS_TO_LONGS(FF_MODCORE_CNT)]; +}; + +#define FF_CMD_EFFECT 0x010e +#define FF_CMD_ENVELOPE 0x0208 +#define FF_CMD_MAGNITUDE 0x0303 +#define FF_CMD_PERIOD 0x0407 +#define FF_CMD_CONDITION 0x050a + +#define FF_CMD_AUTOCENTER 0x4002 +#define FF_CMD_PLAY 0x4103 +#define FF_CMD_ENABLE 0x4201 +#define FF_CMD_GAIN 0x4301 + +#define FF_CMD_QUERY 0xff01 + +/* Buffer for async write */ +#define XMIT_SIZE 256 +#define XMIT_INC(var, n) (var)+=n; (var)&= XMIT_SIZE -1 +/* iforce::xmit_flags */ +#define IFORCE_XMIT_RUNNING 0 +#define IFORCE_XMIT_AGAIN 1 + +struct iforce_device { + u16 idvendor; + u16 idproduct; + char *name; + signed short *btn; + signed short *abs; + signed short *ff; +}; + +struct iforce { + struct input_dev *dev; /* Input device interface */ + struct iforce_device *type; + int bus; + + unsigned char data[IFORCE_MAX_LENGTH]; + unsigned char edata[IFORCE_MAX_LENGTH]; + u16 ecmd; + u16 expect_packet; + +#ifdef CONFIG_JOYSTICK_IFORCE_232 + struct serio *serio; /* RS232 transfer */ + int idx, pkt, len, id; + unsigned char csum; +#endif +#ifdef CONFIG_JOYSTICK_IFORCE_USB + struct usb_device *usbdev; /* USB transfer */ + struct usb_interface *intf; + struct urb *irq, *out, *ctrl; + struct usb_ctrlrequest cr; +#endif + spinlock_t xmit_lock; + /* Buffer used for asynchronous sending of bytes to the device */ + struct circ_buf xmit; + unsigned char xmit_data[XMIT_SIZE]; + unsigned long xmit_flags[1]; + + /* Force Feedback */ + wait_queue_head_t wait; + struct resource device_memory; + struct iforce_core_effect core_effects[IFORCE_EFFECTS_MAX]; + struct mutex mem_mutex; +}; + +/* Get hi and low bytes of a 16-bits int */ +#define HI(a) ((unsigned char)((a) >> 8)) +#define LO(a) ((unsigned char)((a) & 0xff)) + +/* For many parameters, it seems that 0x80 is a special value that should + * be avoided. Instead, we replace this value by 0x7f + */ +#define HIFIX80(a) ((unsigned char)(((a)<0? (a)+255 : (a))>>8)) + +/* Encode a time value */ +#define TIME_SCALE(a) (a) + + +/* Public functions */ +/* iforce-serio.c */ +void iforce_serial_xmit(struct iforce *iforce); + +/* iforce-usb.c */ +void iforce_usb_xmit(struct iforce *iforce); + +/* iforce-main.c */ +int iforce_init_device(struct iforce *iforce); + +/* iforce-packets.c */ +int iforce_control_playback(struct iforce*, u16 id, unsigned int); +void iforce_process_packet(struct iforce *iforce, u16 cmd, unsigned char *data); +int iforce_send_packet(struct iforce *iforce, u16 cmd, unsigned char* data); +void iforce_dump_packet(char *msg, u16 cmd, unsigned char *data) ; +int iforce_get_id_packet(struct iforce *iforce, char *packet); + +/* iforce-ff.c */ +int iforce_upload_periodic(struct iforce *, struct ff_effect *, struct ff_effect *); +int iforce_upload_constant(struct iforce *, struct ff_effect *, struct ff_effect *); +int iforce_upload_condition(struct iforce *, struct ff_effect *, struct ff_effect *); + +/* Public variables */ +extern struct serio_driver iforce_serio_drv; +extern struct usb_driver iforce_usb_driver; diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c new file mode 100644 index 00000000..88c22623 --- /dev/null +++ b/drivers/input/joystick/interact.c @@ -0,0 +1,314 @@ +/* + * Copyright (c) 2001 Vojtech Pavlik + * + * Based on the work of: + * Toby Deshane + */ + +/* + * InterAct digital gamepad/joystick driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "InterAct digital joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define INTERACT_MAX_START 600 /* 400 us */ +#define INTERACT_MAX_STROBE 60 /* 40 us */ +#define INTERACT_MAX_LENGTH 32 /* 32 bits */ + +#define INTERACT_TYPE_HHFX 0 /* HammerHead/FX */ +#define INTERACT_TYPE_PP8D 1 /* ProPad 8 */ + +struct interact { + struct gameport *gameport; + struct input_dev *dev; + int bads; + int reads; + unsigned char type; + unsigned char length; + char phys[32]; +}; + +static short interact_abs_hhfx[] = + { ABS_RX, ABS_RY, ABS_X, ABS_Y, ABS_HAT0X, ABS_HAT0Y, -1 }; +static short interact_abs_pp8d[] = + { ABS_X, ABS_Y, -1 }; + +static short interact_btn_hhfx[] = + { BTN_TR, BTN_X, BTN_Y, BTN_Z, BTN_A, BTN_B, BTN_C, BTN_TL, BTN_TL2, BTN_TR2, BTN_MODE, BTN_SELECT, -1 }; +static short interact_btn_pp8d[] = + { BTN_C, BTN_TL, BTN_TR, BTN_A, BTN_B, BTN_Y, BTN_Z, BTN_X, -1 }; + +struct interact_type { + int id; + short *abs; + short *btn; + char *name; + unsigned char length; + unsigned char b8; +}; + +static struct interact_type interact_type[] = { + { 0x6202, interact_abs_hhfx, interact_btn_hhfx, "InterAct HammerHead/FX", 32, 4 }, + { 0x53f8, interact_abs_pp8d, interact_btn_pp8d, "InterAct ProPad 8 Digital", 16, 0 }, + { 0 }}; + +/* + * interact_read_packet() reads and InterAct joystick data. + */ + +static int interact_read_packet(struct gameport *gameport, int length, u32 *data) +{ + unsigned long flags; + unsigned char u, v; + unsigned int t, s; + int i; + + i = 0; + data[0] = data[1] = data[2] = 0; + t = gameport_time(gameport, INTERACT_MAX_START); + s = gameport_time(gameport, INTERACT_MAX_STROBE); + + local_irq_save(flags); + gameport_trigger(gameport); + v = gameport_read(gameport); + + while (t > 0 && i < length) { + t--; + u = v; v = gameport_read(gameport); + if (v & ~u & 0x40) { + data[0] = (data[0] << 1) | ((v >> 4) & 1); + data[1] = (data[1] << 1) | ((v >> 5) & 1); + data[2] = (data[2] << 1) | ((v >> 7) & 1); + i++; + t = s; + } + } + + local_irq_restore(flags); + + return i; +} + +/* + * interact_poll() reads and analyzes InterAct joystick data. + */ + +static void interact_poll(struct gameport *gameport) +{ + struct interact *interact = gameport_get_drvdata(gameport); + struct input_dev *dev = interact->dev; + u32 data[3]; + int i; + + interact->reads++; + + if (interact_read_packet(interact->gameport, interact->length, data) < interact->length) { + interact->bads++; + } else { + + for (i = 0; i < 3; i++) + data[i] <<= INTERACT_MAX_LENGTH - interact->length; + + switch (interact->type) { + + case INTERACT_TYPE_HHFX: + + for (i = 0; i < 4; i++) + input_report_abs(dev, interact_abs_hhfx[i], (data[i & 1] >> ((i >> 1) << 3)) & 0xff); + + for (i = 0; i < 2; i++) + input_report_abs(dev, ABS_HAT0Y - i, + ((data[1] >> ((i << 1) + 17)) & 1) - ((data[1] >> ((i << 1) + 16)) & 1)); + + for (i = 0; i < 8; i++) + input_report_key(dev, interact_btn_hhfx[i], (data[0] >> (i + 16)) & 1); + + for (i = 0; i < 4; i++) + input_report_key(dev, interact_btn_hhfx[i + 8], (data[1] >> (i + 20)) & 1); + + break; + + case INTERACT_TYPE_PP8D: + + for (i = 0; i < 2; i++) + input_report_abs(dev, interact_abs_pp8d[i], + ((data[0] >> ((i << 1) + 20)) & 1) - ((data[0] >> ((i << 1) + 21)) & 1)); + + for (i = 0; i < 8; i++) + input_report_key(dev, interact_btn_pp8d[i], (data[1] >> (i + 16)) & 1); + + break; + } + } + + input_sync(dev); +} + +/* + * interact_open() is a callback from the input open routine. + */ + +static int interact_open(struct input_dev *dev) +{ + struct interact *interact = input_get_drvdata(dev); + + gameport_start_polling(interact->gameport); + return 0; +} + +/* + * interact_close() is a callback from the input close routine. + */ + +static void interact_close(struct input_dev *dev) +{ + struct interact *interact = input_get_drvdata(dev); + + gameport_stop_polling(interact->gameport); +} + +/* + * interact_connect() probes for InterAct joysticks. + */ + +static int interact_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct interact *interact; + struct input_dev *input_dev; + __u32 data[3]; + int i, t; + int err; + + interact = kzalloc(sizeof(struct interact), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!interact || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + interact->gameport = gameport; + interact->dev = input_dev; + + gameport_set_drvdata(gameport, interact); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + i = interact_read_packet(gameport, INTERACT_MAX_LENGTH * 2, data); + + if (i != 32 || (data[0] >> 24) != 0x0c || (data[1] >> 24) != 0x02) { + err = -ENODEV; + goto fail2; + } + + for (i = 0; interact_type[i].length; i++) + if (interact_type[i].id == (data[2] >> 16)) + break; + + if (!interact_type[i].length) { + printk(KERN_WARNING "interact.c: Unknown joystick on %s. [len %d d0 %08x d1 %08x i2 %08x]\n", + gameport->phys, i, data[0], data[1], data[2]); + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, interact_poll); + gameport_set_poll_interval(gameport, 20); + + snprintf(interact->phys, sizeof(interact->phys), "%s/input0", gameport->phys); + + interact->type = i; + interact->length = interact_type[i].length; + + input_dev->name = interact_type[i].name; + input_dev->phys = interact->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_INTERACT; + input_dev->id.product = interact_type[i].id; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &gameport->dev; + + input_set_drvdata(input_dev, interact); + + input_dev->open = interact_open; + input_dev->close = interact_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; (t = interact_type[interact->type].abs[i]) >= 0; i++) { + if (i < interact_type[interact->type].b8) + input_set_abs_params(input_dev, t, 0, 255, 0, 0); + else + input_set_abs_params(input_dev, t, -1, 1, 0, 0); + } + + for (i = 0; (t = interact_type[interact->type].btn[i]) >= 0; i++) + __set_bit(t, input_dev->keybit); + + err = input_register_device(interact->dev); + if (err) + goto fail2; + + return 0; + +fail2: gameport_close(gameport); +fail1: gameport_set_drvdata(gameport, NULL); + input_free_device(input_dev); + kfree(interact); + return err; +} + +static void interact_disconnect(struct gameport *gameport) +{ + struct interact *interact = gameport_get_drvdata(gameport); + + input_unregister_device(interact->dev); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(interact); +} + +static struct gameport_driver interact_drv = { + .driver = { + .name = "interact", + }, + .description = DRIVER_DESC, + .connect = interact_connect, + .disconnect = interact_disconnect, +}; + +module_gameport_driver(interact_drv); diff --git a/drivers/input/joystick/joydump.c b/drivers/input/joystick/joydump.c new file mode 100644 index 00000000..7eb878ba --- /dev/null +++ b/drivers/input/joystick/joydump.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 1996-2001 Vojtech Pavlik + */ + +/* + * This is just a very simple driver that can dump the data + * out of the joystick port into the syslog ... + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Gameport data dumper module" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define BUF_SIZE 256 + +struct joydump { + unsigned int time; + unsigned char data; +}; + +static int joydump_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct joydump *buf; /* all entries */ + struct joydump *dump, *prev; /* one entry each */ + int axes[4], buttons; + int i, j, t, timeout; + unsigned long flags; + unsigned char u; + + printk(KERN_INFO "joydump: ,------------------ START ----------------.\n"); + printk(KERN_INFO "joydump: | Dumping: %30s |\n", gameport->phys); + printk(KERN_INFO "joydump: | Speed: %28d kHz |\n", gameport->speed); + + if (gameport_open(gameport, drv, GAMEPORT_MODE_RAW)) { + + printk(KERN_INFO "joydump: | Raw mode not available - trying cooked. |\n"); + + if (gameport_open(gameport, drv, GAMEPORT_MODE_COOKED)) { + + printk(KERN_INFO "joydump: | Cooked not available either. Failing. |\n"); + printk(KERN_INFO "joydump: `------------------- END -----------------'\n"); + return -ENODEV; + } + + gameport_cooked_read(gameport, axes, &buttons); + + for (i = 0; i < 4; i++) + printk(KERN_INFO "joydump: | Axis %d: %4d. |\n", i, axes[i]); + printk(KERN_INFO "joydump: | Buttons %02x. |\n", buttons); + printk(KERN_INFO "joydump: `------------------- END -----------------'\n"); + } + + timeout = gameport_time(gameport, 10000); /* 10 ms */ + + buf = kmalloc(BUF_SIZE * sizeof(struct joydump), GFP_KERNEL); + if (!buf) { + printk(KERN_INFO "joydump: no memory for testing\n"); + goto jd_end; + } + dump = buf; + t = 0; + i = 1; + + local_irq_save(flags); + + u = gameport_read(gameport); + + dump->data = u; + dump->time = t; + dump++; + + gameport_trigger(gameport); + + while (i < BUF_SIZE && t < timeout) { + + dump->data = gameport_read(gameport); + + if (dump->data ^ u) { + u = dump->data; + dump->time = t; + i++; + dump++; + } + t++; + } + + local_irq_restore(flags); + +/* + * Dump data. + */ + + t = i; + dump = buf; + prev = dump; + + printk(KERN_INFO "joydump: >------------------ DATA -----------------<\n"); + printk(KERN_INFO "joydump: | index: %3d delta: %3d us data: ", 0, 0); + for (j = 7; j >= 0; j--) + printk("%d", (dump->data >> j) & 1); + printk(" |\n"); + dump++; + + for (i = 1; i < t; i++, dump++, prev++) { + printk(KERN_INFO "joydump: | index: %3d delta: %3d us data: ", + i, dump->time - prev->time); + for (j = 7; j >= 0; j--) + printk("%d", (dump->data >> j) & 1); + printk(" |\n"); + } + kfree(buf); + +jd_end: + printk(KERN_INFO "joydump: `------------------- END -----------------'\n"); + + return 0; +} + +static void joydump_disconnect(struct gameport *gameport) +{ + gameport_close(gameport); +} + +static struct gameport_driver joydump_drv = { + .driver = { + .name = "joydump", + }, + .description = DRIVER_DESC, + .connect = joydump_connect, + .disconnect = joydump_disconnect, +}; + +module_gameport_driver(joydump_drv); diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c new file mode 100644 index 00000000..9fb153ee --- /dev/null +++ b/drivers/input/joystick/magellan.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * Magellan and Space Mouse 6dof controller driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Magellan and SpaceMouse 6dof controller driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define MAGELLAN_MAX_LENGTH 32 + +static int magellan_buttons[] = { BTN_0, BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8 }; +static int magellan_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; + +/* + * Per-Magellan data. + */ + +struct magellan { + struct input_dev *dev; + int idx; + unsigned char data[MAGELLAN_MAX_LENGTH]; + char phys[32]; +}; + +/* + * magellan_crunch_nibbles() verifies that the bytes sent from the Magellan + * have correct upper nibbles for the lower ones, if not, the packet will + * be thrown away. It also strips these upper halves to simplify further + * processing. + */ + +static int magellan_crunch_nibbles(unsigned char *data, int count) +{ + static unsigned char nibbles[16] = "0AB3D56GH9:Kdev; + unsigned char *data = magellan->data; + int i, t; + + if (!magellan->idx) return; + + switch (magellan->data[0]) { + + case 'd': /* Axis data */ + if (magellan->idx != 25) return; + if (magellan_crunch_nibbles(data, 24)) return; + for (i = 0; i < 6; i++) + input_report_abs(dev, magellan_axes[i], + (data[(i << 2) + 1] << 12 | data[(i << 2) + 2] << 8 | + data[(i << 2) + 3] << 4 | data[(i << 2) + 4]) - 32768); + break; + + case 'k': /* Button data */ + if (magellan->idx != 4) return; + if (magellan_crunch_nibbles(data, 3)) return; + t = (data[1] << 1) | (data[2] << 5) | data[3]; + for (i = 0; i < 9; i++) input_report_key(dev, magellan_buttons[i], (t >> i) & 1); + break; + } + + input_sync(dev); +} + +static irqreturn_t magellan_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct magellan* magellan = serio_get_drvdata(serio); + + if (data == '\r') { + magellan_process_packet(magellan); + magellan->idx = 0; + } else { + if (magellan->idx < MAGELLAN_MAX_LENGTH) + magellan->data[magellan->idx++] = data; + } + return IRQ_HANDLED; +} + +/* + * magellan_disconnect() is the opposite of magellan_connect() + */ + +static void magellan_disconnect(struct serio *serio) +{ + struct magellan* magellan = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(magellan->dev); + kfree(magellan); +} + +/* + * magellan_connect() is the routine that is called when someone adds a + * new serio device that supports Magellan protocol and registers it as + * an input device. + */ + +static int magellan_connect(struct serio *serio, struct serio_driver *drv) +{ + struct magellan *magellan; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + magellan = kzalloc(sizeof(struct magellan), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!magellan || !input_dev) + goto fail1; + + magellan->dev = input_dev; + snprintf(magellan->phys, sizeof(magellan->phys), "%s/input0", serio->phys); + + input_dev->name = "LogiCad3D Magellan / SpaceMouse"; + input_dev->phys = magellan->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_MAGELLAN; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; i < 9; i++) + set_bit(magellan_buttons[i], input_dev->keybit); + + for (i = 0; i < 6; i++) + input_set_abs_params(input_dev, magellan_axes[i], -360, 360, 0, 0); + + serio_set_drvdata(serio, magellan); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(magellan->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(magellan); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id magellan_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_MAGELLAN, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, magellan_serio_ids); + +static struct serio_driver magellan_drv = { + .driver = { + .name = "magellan", + }, + .description = DRIVER_DESC, + .id_table = magellan_serio_ids, + .interrupt = magellan_interrupt, + .connect = magellan_connect, + .disconnect = magellan_disconnect, +}; + +module_serio_driver(magellan_drv); diff --git a/drivers/input/joystick/maplecontrol.c b/drivers/input/joystick/maplecontrol.c new file mode 100644 index 00000000..59c10ec5 --- /dev/null +++ b/drivers/input/joystick/maplecontrol.c @@ -0,0 +1,193 @@ +/* + * SEGA Dreamcast controller driver + * Based on drivers/usb/iforce.c + * + * Copyright Yaegashi Takeshi, 2001 + * Adrian McMenamin, 2008 - 2009 + */ + +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Adrian McMenamin "); +MODULE_DESCRIPTION("SEGA Dreamcast controller driver"); +MODULE_LICENSE("GPL"); + +struct dc_pad { + struct input_dev *dev; + struct maple_device *mdev; +}; + +static void dc_pad_callback(struct mapleq *mq) +{ + unsigned short buttons; + struct maple_device *mapledev = mq->dev; + struct dc_pad *pad = maple_get_drvdata(mapledev); + struct input_dev *dev = pad->dev; + unsigned char *res = mq->recvbuf->buf; + + buttons = ~le16_to_cpup((__le16 *)(res + 8)); + + input_report_abs(dev, ABS_HAT0Y, + (buttons & 0x0010 ? -1 : 0) + (buttons & 0x0020 ? 1 : 0)); + input_report_abs(dev, ABS_HAT0X, + (buttons & 0x0040 ? -1 : 0) + (buttons & 0x0080 ? 1 : 0)); + input_report_abs(dev, ABS_HAT1Y, + (buttons & 0x1000 ? -1 : 0) + (buttons & 0x2000 ? 1 : 0)); + input_report_abs(dev, ABS_HAT1X, + (buttons & 0x4000 ? -1 : 0) + (buttons & 0x8000 ? 1 : 0)); + + input_report_key(dev, BTN_C, buttons & 0x0001); + input_report_key(dev, BTN_B, buttons & 0x0002); + input_report_key(dev, BTN_A, buttons & 0x0004); + input_report_key(dev, BTN_START, buttons & 0x0008); + input_report_key(dev, BTN_Z, buttons & 0x0100); + input_report_key(dev, BTN_Y, buttons & 0x0200); + input_report_key(dev, BTN_X, buttons & 0x0400); + input_report_key(dev, BTN_SELECT, buttons & 0x0800); + + input_report_abs(dev, ABS_GAS, res[10]); + input_report_abs(dev, ABS_BRAKE, res[11]); + input_report_abs(dev, ABS_X, res[12]); + input_report_abs(dev, ABS_Y, res[13]); + input_report_abs(dev, ABS_RX, res[14]); + input_report_abs(dev, ABS_RY, res[15]); +} + +static int dc_pad_open(struct input_dev *dev) +{ + struct dc_pad *pad = dev->dev.platform_data; + + maple_getcond_callback(pad->mdev, dc_pad_callback, HZ/20, + MAPLE_FUNC_CONTROLLER); + + return 0; +} + +static void dc_pad_close(struct input_dev *dev) +{ + struct dc_pad *pad = dev->dev.platform_data; + + maple_getcond_callback(pad->mdev, dc_pad_callback, 0, + MAPLE_FUNC_CONTROLLER); +} + +/* allow the controller to be used */ +static int probe_maple_controller(struct device *dev) +{ + static const short btn_bit[32] = { + BTN_C, BTN_B, BTN_A, BTN_START, -1, -1, -1, -1, + BTN_Z, BTN_Y, BTN_X, BTN_SELECT, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + }; + + static const short abs_bit[32] = { + -1, -1, -1, -1, ABS_HAT0Y, ABS_HAT0Y, ABS_HAT0X, ABS_HAT0X, + -1, -1, -1, -1, ABS_HAT1Y, ABS_HAT1Y, ABS_HAT1X, ABS_HAT1X, + ABS_GAS, ABS_BRAKE, ABS_X, ABS_Y, ABS_RX, ABS_RY, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + }; + + struct maple_device *mdev = to_maple_dev(dev); + struct maple_driver *mdrv = to_maple_driver(dev->driver); + int i, error; + struct dc_pad *pad; + struct input_dev *idev; + unsigned long data = be32_to_cpu(mdev->devinfo.function_data[0]); + + pad = kzalloc(sizeof(struct dc_pad), GFP_KERNEL); + idev = input_allocate_device(); + if (!pad || !idev) { + error = -ENOMEM; + goto fail; + } + + pad->dev = idev; + pad->mdev = mdev; + + idev->open = dc_pad_open; + idev->close = dc_pad_close; + + for (i = 0; i < 32; i++) { + if (data & (1 << i)) { + if (btn_bit[i] >= 0) + __set_bit(btn_bit[i], idev->keybit); + else if (abs_bit[i] >= 0) + __set_bit(abs_bit[i], idev->absbit); + } + } + + if (idev->keybit[BIT_WORD(BTN_JOYSTICK)]) + idev->evbit[0] |= BIT_MASK(EV_KEY); + + if (idev->absbit[0]) + idev->evbit[0] |= BIT_MASK(EV_ABS); + + for (i = ABS_X; i <= ABS_BRAKE; i++) + input_set_abs_params(idev, i, 0, 255, 0, 0); + + for (i = ABS_HAT0X; i <= ABS_HAT3Y; i++) + input_set_abs_params(idev, i, 1, -1, 0, 0); + + idev->dev.platform_data = pad; + idev->dev.parent = &mdev->dev; + idev->name = mdev->product_name; + idev->id.bustype = BUS_HOST; + input_set_drvdata(idev, pad); + + error = input_register_device(idev); + if (error) + goto fail; + + mdev->driver = mdrv; + maple_set_drvdata(mdev, pad); + + return 0; + +fail: + input_free_device(idev); + kfree(pad); + maple_set_drvdata(mdev, NULL); + return error; +} + +static int remove_maple_controller(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct dc_pad *pad = maple_get_drvdata(mdev); + + mdev->callback = NULL; + input_unregister_device(pad->dev); + maple_set_drvdata(mdev, NULL); + kfree(pad); + + return 0; +} + +static struct maple_driver dc_pad_driver = { + .function = MAPLE_FUNC_CONTROLLER, + .drv = { + .name = "Dreamcast_controller", + .probe = probe_maple_controller, + .remove = remove_maple_controller, + }, +}; + +static int __init dc_pad_init(void) +{ + return maple_driver_register(&dc_pad_driver); +} + +static void __exit dc_pad_exit(void) +{ + maple_driver_unregister(&dc_pad_driver); +} + +module_init(dc_pad_init); +module_exit(dc_pad_exit); diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c new file mode 100644 index 00000000..04c69af3 --- /dev/null +++ b/drivers/input/joystick/sidewinder.c @@ -0,0 +1,823 @@ +/* + * Copyright (c) 1998-2005 Vojtech Pavlik + */ + +/* + * Microsoft SideWinder joystick family driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Microsoft SideWinder joystick family driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * These are really magic values. Changing them can make a problem go away, + * as well as break everything. + */ + +#undef SW_DEBUG +#undef SW_DEBUG_DATA + +#define SW_START 600 /* The time we wait for the first bit [600 us] */ +#define SW_STROBE 60 /* Max time per bit [60 us] */ +#define SW_TIMEOUT 6 /* Wait for everything to settle [6 ms] */ +#define SW_KICK 45 /* Wait after A0 fall till kick [45 us] */ +#define SW_END 8 /* Number of bits before end of packet to kick */ +#define SW_FAIL 16 /* Number of packet read errors to fail and reinitialize */ +#define SW_BAD 2 /* Number of packet read errors to switch off 3d Pro optimization */ +#define SW_OK 64 /* Number of packet read successes to switch optimization back on */ +#define SW_LENGTH 512 /* Max number of bits in a packet */ + +#ifdef SW_DEBUG +#define dbg(format, arg...) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg) +#else +#define dbg(format, arg...) do {} while (0) +#endif + +/* + * SideWinder joystick types ... + */ + +#define SW_ID_3DP 0 +#define SW_ID_GP 1 +#define SW_ID_PP 2 +#define SW_ID_FFP 3 +#define SW_ID_FSP 4 +#define SW_ID_FFW 5 + +/* + * Names, buttons, axes ... + */ + +static char *sw_name[] = { "3D Pro", "GamePad", "Precision Pro", "Force Feedback Pro", "FreeStyle Pro", + "Force Feedback Wheel" }; + +static char sw_abs[][7] = { + { ABS_X, ABS_Y, ABS_RZ, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y }, + { ABS_X, ABS_Y }, + { ABS_X, ABS_Y, ABS_RZ, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y }, + { ABS_X, ABS_Y, ABS_RZ, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y }, + { ABS_X, ABS_Y, ABS_THROTTLE, ABS_HAT0X, ABS_HAT0Y }, + { ABS_RX, ABS_RUDDER, ABS_THROTTLE }}; + +static char sw_bit[][7] = { + { 10, 10, 9, 10, 1, 1 }, + { 1, 1 }, + { 10, 10, 6, 7, 1, 1 }, + { 10, 10, 6, 7, 1, 1 }, + { 10, 10, 6, 1, 1 }, + { 10, 7, 7, 1, 1 }}; + +static short sw_btn[][12] = { + { BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_THUMB2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_MODE }, + { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_START, BTN_MODE }, + { BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_SELECT }, + { BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4, BTN_SELECT }, + { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_TL, BTN_TR, BTN_START, BTN_MODE, BTN_SELECT }, + { BTN_TRIGGER, BTN_TOP, BTN_THUMB, BTN_THUMB2, BTN_BASE, BTN_BASE2, BTN_BASE3, BTN_BASE4 }}; + +static struct { + int x; + int y; +} sw_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; + +struct sw { + struct gameport *gameport; + struct input_dev *dev[4]; + char name[64]; + char phys[4][32]; + int length; + int type; + int bits; + int number; + int fail; + int ok; + int reads; + int bads; +}; + +/* + * sw_read_packet() is a function which reads either a data packet, or an + * identification packet from a SideWinder joystick. The protocol is very, + * very, very braindamaged. Microsoft patented it in US patent #5628686. + */ + +static int sw_read_packet(struct gameport *gameport, unsigned char *buf, int length, int id) +{ + unsigned long flags; + int timeout, bitout, sched, i, kick, start, strobe; + unsigned char pending, u, v; + + i = -id; /* Don't care about data, only want ID */ + timeout = id ? gameport_time(gameport, SW_TIMEOUT * 1000) : 0; /* Set up global timeout for ID packet */ + kick = id ? gameport_time(gameport, SW_KICK) : 0; /* Set up kick timeout for ID packet */ + start = gameport_time(gameport, SW_START); + strobe = gameport_time(gameport, SW_STROBE); + bitout = start; + pending = 0; + sched = 0; + + local_irq_save(flags); /* Quiet, please */ + + gameport_trigger(gameport); /* Trigger */ + v = gameport_read(gameport); + + do { + bitout--; + u = v; + v = gameport_read(gameport); + } while (!(~v & u & 0x10) && (bitout > 0)); /* Wait for first falling edge on clock */ + + if (bitout > 0) + bitout = strobe; /* Extend time if not timed out */ + + while ((timeout > 0 || bitout > 0) && (i < length)) { + + timeout--; + bitout--; /* Decrement timers */ + sched--; + + u = v; + v = gameport_read(gameport); + + if ((~u & v & 0x10) && (bitout > 0)) { /* Rising edge on clock - data bit */ + if (i >= 0) /* Want this data */ + buf[i] = v >> 5; /* Store it */ + i++; /* Advance index */ + bitout = strobe; /* Extend timeout for next bit */ + } + + if (kick && (~v & u & 0x01)) { /* Falling edge on axis 0 */ + sched = kick; /* Schedule second trigger */ + kick = 0; /* Don't schedule next time on falling edge */ + pending = 1; /* Mark schedule */ + } + + if (pending && sched < 0 && (i > -SW_END)) { /* Second trigger time */ + gameport_trigger(gameport); /* Trigger */ + bitout = start; /* Long bit timeout */ + pending = 0; /* Unmark schedule */ + timeout = 0; /* Switch from global to bit timeouts */ + } + } + + local_irq_restore(flags); /* Done - relax */ + +#ifdef SW_DEBUG_DATA + { + int j; + printk(KERN_DEBUG "sidewinder.c: Read %d triplets. [", i); + for (j = 0; j < i; j++) printk("%d", buf[j]); + printk("]\n"); + } +#endif + + return i; +} + +/* + * sw_get_bits() and GB() compose bits from the triplet buffer into a __u64. + * Parameter 'pos' is bit number inside packet where to start at, 'num' is number + * of bits to be read, 'shift' is offset in the resulting __u64 to start at, bits + * is number of bits per triplet. + */ + +#define GB(pos,num) sw_get_bits(buf, pos, num, sw->bits) + +static __u64 sw_get_bits(unsigned char *buf, int pos, int num, char bits) +{ + __u64 data = 0; + int tri = pos % bits; /* Start position */ + int i = pos / bits; + int bit = 0; + + while (num--) { + data |= (__u64)((buf[i] >> tri++) & 1) << bit++; /* Transfer bit */ + if (tri == bits) { + i++; /* Next triplet */ + tri = 0; + } + } + + return data; +} + +/* + * sw_init_digital() initializes a SideWinder 3D Pro joystick + * into digital mode. + */ + +static void sw_init_digital(struct gameport *gameport) +{ + int seq[] = { 140, 140+725, 140+300, 0 }; + unsigned long flags; + int i, t; + + local_irq_save(flags); + + i = 0; + do { + gameport_trigger(gameport); /* Trigger */ + t = gameport_time(gameport, SW_TIMEOUT * 1000); + while ((gameport_read(gameport) & 1) && t) t--; /* Wait for axis to fall back to 0 */ + udelay(seq[i]); /* Delay magic time */ + } while (seq[++i]); + + gameport_trigger(gameport); /* Last trigger */ + + local_irq_restore(flags); +} + +/* + * sw_parity() computes parity of __u64 + */ + +static int sw_parity(__u64 t) +{ + int x = t ^ (t >> 32); + + x ^= x >> 16; + x ^= x >> 8; + x ^= x >> 4; + x ^= x >> 2; + x ^= x >> 1; + return x & 1; +} + +/* + * sw_ccheck() checks synchronization bits and computes checksum of nibbles. + */ + +static int sw_check(__u64 t) +{ + unsigned char sum = 0; + + if ((t & 0x8080808080808080ULL) ^ 0x80) /* Sync */ + return -1; + + while (t) { /* Sum */ + sum += t & 0xf; + t >>= 4; + } + + return sum & 0xf; +} + +/* + * sw_parse() analyzes SideWinder joystick data, and writes the results into + * the axes and buttons arrays. + */ + +static int sw_parse(unsigned char *buf, struct sw *sw) +{ + int hat, i, j; + struct input_dev *dev; + + switch (sw->type) { + + case SW_ID_3DP: + + if (sw_check(GB(0,64)) || (hat = (GB(6,1) << 3) | GB(60,3)) > 8) + return -1; + + dev = sw->dev[0]; + + input_report_abs(dev, ABS_X, (GB( 3,3) << 7) | GB(16,7)); + input_report_abs(dev, ABS_Y, (GB( 0,3) << 7) | GB(24,7)); + input_report_abs(dev, ABS_RZ, (GB(35,2) << 7) | GB(40,7)); + input_report_abs(dev, ABS_THROTTLE, (GB(32,3) << 7) | GB(48,7)); + + input_report_abs(dev, ABS_HAT0X, sw_hat_to_axis[hat].x); + input_report_abs(dev, ABS_HAT0Y, sw_hat_to_axis[hat].y); + + for (j = 0; j < 7; j++) + input_report_key(dev, sw_btn[SW_ID_3DP][j], !GB(j+8,1)); + + input_report_key(dev, BTN_BASE4, !GB(38,1)); + input_report_key(dev, BTN_BASE5, !GB(37,1)); + + input_sync(dev); + + return 0; + + case SW_ID_GP: + + for (i = 0; i < sw->number; i ++) { + + if (sw_parity(GB(i*15,15))) + return -1; + + input_report_abs(sw->dev[i], ABS_X, GB(i*15+3,1) - GB(i*15+2,1)); + input_report_abs(sw->dev[i], ABS_Y, GB(i*15+0,1) - GB(i*15+1,1)); + + for (j = 0; j < 10; j++) + input_report_key(sw->dev[i], sw_btn[SW_ID_GP][j], !GB(i*15+j+4,1)); + + input_sync(sw->dev[i]); + } + + return 0; + + case SW_ID_PP: + case SW_ID_FFP: + + if (!sw_parity(GB(0,48)) || (hat = GB(42,4)) > 8) + return -1; + + dev = sw->dev[0]; + input_report_abs(dev, ABS_X, GB( 9,10)); + input_report_abs(dev, ABS_Y, GB(19,10)); + input_report_abs(dev, ABS_RZ, GB(36, 6)); + input_report_abs(dev, ABS_THROTTLE, GB(29, 7)); + + input_report_abs(dev, ABS_HAT0X, sw_hat_to_axis[hat].x); + input_report_abs(dev, ABS_HAT0Y, sw_hat_to_axis[hat].y); + + for (j = 0; j < 9; j++) + input_report_key(dev, sw_btn[SW_ID_PP][j], !GB(j,1)); + + input_sync(dev); + + return 0; + + case SW_ID_FSP: + + if (!sw_parity(GB(0,43)) || (hat = GB(28,4)) > 8) + return -1; + + dev = sw->dev[0]; + input_report_abs(dev, ABS_X, GB( 0,10)); + input_report_abs(dev, ABS_Y, GB(16,10)); + input_report_abs(dev, ABS_THROTTLE, GB(32, 6)); + + input_report_abs(dev, ABS_HAT0X, sw_hat_to_axis[hat].x); + input_report_abs(dev, ABS_HAT0Y, sw_hat_to_axis[hat].y); + + for (j = 0; j < 6; j++) + input_report_key(dev, sw_btn[SW_ID_FSP][j], !GB(j+10,1)); + + input_report_key(dev, BTN_TR, !GB(26,1)); + input_report_key(dev, BTN_START, !GB(27,1)); + input_report_key(dev, BTN_MODE, !GB(38,1)); + input_report_key(dev, BTN_SELECT, !GB(39,1)); + + input_sync(dev); + + return 0; + + case SW_ID_FFW: + + if (!sw_parity(GB(0,33))) + return -1; + + dev = sw->dev[0]; + input_report_abs(dev, ABS_RX, GB( 0,10)); + input_report_abs(dev, ABS_RUDDER, GB(10, 6)); + input_report_abs(dev, ABS_THROTTLE, GB(16, 6)); + + for (j = 0; j < 8; j++) + input_report_key(dev, sw_btn[SW_ID_FFW][j], !GB(j+22,1)); + + input_sync(dev); + + return 0; + } + + return -1; +} + +/* + * sw_read() reads SideWinder joystick data, and reinitializes + * the joystick in case of persistent problems. This is the function that is + * called from the generic code to poll the joystick. + */ + +static int sw_read(struct sw *sw) +{ + unsigned char buf[SW_LENGTH]; + int i; + + i = sw_read_packet(sw->gameport, buf, sw->length, 0); + + if (sw->type == SW_ID_3DP && sw->length == 66 && i != 66) { /* Broken packet, try to fix */ + + if (i == 64 && !sw_check(sw_get_bits(buf,0,64,1))) { /* Last init failed, 1 bit mode */ + printk(KERN_WARNING "sidewinder.c: Joystick in wrong mode on %s" + " - going to reinitialize.\n", sw->gameport->phys); + sw->fail = SW_FAIL; /* Reinitialize */ + i = 128; /* Bogus value */ + } + + if (i < 66 && GB(0,64) == GB(i*3-66,64)) /* 1 == 3 */ + i = 66; /* Everything is fine */ + + if (i < 66 && GB(0,64) == GB(66,64)) /* 1 == 2 */ + i = 66; /* Everything is fine */ + + if (i < 66 && GB(i*3-132,64) == GB(i*3-66,64)) { /* 2 == 3 */ + memmove(buf, buf + i - 22, 22); /* Move data */ + i = 66; /* Carry on */ + } + } + + if (i == sw->length && !sw_parse(buf, sw)) { /* Parse data */ + + sw->fail = 0; + sw->ok++; + + if (sw->type == SW_ID_3DP && sw->length == 66 /* Many packets OK */ + && sw->ok > SW_OK) { + + printk(KERN_INFO "sidewinder.c: No more trouble on %s" + " - enabling optimization again.\n", sw->gameport->phys); + sw->length = 22; + } + + return 0; + } + + sw->ok = 0; + sw->fail++; + + if (sw->type == SW_ID_3DP && sw->length == 22 && sw->fail > SW_BAD) { /* Consecutive bad packets */ + + printk(KERN_INFO "sidewinder.c: Many bit errors on %s" + " - disabling optimization.\n", sw->gameport->phys); + sw->length = 66; + } + + if (sw->fail < SW_FAIL) + return -1; /* Not enough, don't reinitialize yet */ + + printk(KERN_WARNING "sidewinder.c: Too many bit errors on %s" + " - reinitializing joystick.\n", sw->gameport->phys); + + if (!i && sw->type == SW_ID_3DP) { /* 3D Pro can be in analog mode */ + mdelay(3 * SW_TIMEOUT); + sw_init_digital(sw->gameport); + } + + mdelay(SW_TIMEOUT); + i = sw_read_packet(sw->gameport, buf, SW_LENGTH, 0); /* Read normal data packet */ + mdelay(SW_TIMEOUT); + sw_read_packet(sw->gameport, buf, SW_LENGTH, i); /* Read ID packet, this initializes the stick */ + + sw->fail = SW_FAIL; + + return -1; +} + +static void sw_poll(struct gameport *gameport) +{ + struct sw *sw = gameport_get_drvdata(gameport); + + sw->reads++; + if (sw_read(sw)) + sw->bads++; +} + +static int sw_open(struct input_dev *dev) +{ + struct sw *sw = input_get_drvdata(dev); + + gameport_start_polling(sw->gameport); + return 0; +} + +static void sw_close(struct input_dev *dev) +{ + struct sw *sw = input_get_drvdata(dev); + + gameport_stop_polling(sw->gameport); +} + +/* + * sw_print_packet() prints the contents of a SideWinder packet. + */ + +static void sw_print_packet(char *name, int length, unsigned char *buf, char bits) +{ + int i; + + printk(KERN_INFO "sidewinder.c: %s packet, %d bits. [", name, length); + for (i = (((length + 3) >> 2) - 1); i >= 0; i--) + printk("%x", (int)sw_get_bits(buf, i << 2, 4, bits)); + printk("]\n"); +} + +/* + * sw_3dp_id() translates the 3DP id into a human legible string. + * Unfortunately I don't know how to do this for the other SW types. + */ + +static void sw_3dp_id(unsigned char *buf, char *comment, size_t size) +{ + int i; + char pnp[8], rev[9]; + + for (i = 0; i < 7; i++) /* ASCII PnP ID */ + pnp[i] = sw_get_bits(buf, 24+8*i, 8, 1); + + for (i = 0; i < 8; i++) /* ASCII firmware revision */ + rev[i] = sw_get_bits(buf, 88+8*i, 8, 1); + + pnp[7] = rev[8] = 0; + + snprintf(comment, size, " [PnP %d.%02d id %s rev %s]", + (int) ((sw_get_bits(buf, 8, 6, 1) << 6) | /* Two 6-bit values */ + sw_get_bits(buf, 16, 6, 1)) / 100, + (int) ((sw_get_bits(buf, 8, 6, 1) << 6) | + sw_get_bits(buf, 16, 6, 1)) % 100, + pnp, rev); +} + +/* + * sw_guess_mode() checks the upper two button bits for toggling - + * indication of that the joystick is in 3-bit mode. This is documented + * behavior for 3DP ID packet, and for example the FSP does this in + * normal packets instead. Fun ... + */ + +static int sw_guess_mode(unsigned char *buf, int len) +{ + int i; + unsigned char xor = 0; + + for (i = 1; i < len; i++) + xor |= (buf[i - 1] ^ buf[i]) & 6; + + return !!xor * 2 + 1; +} + +/* + * sw_connect() probes for SideWinder type joysticks. + */ + +static int sw_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + struct sw *sw; + struct input_dev *input_dev; + int i, j, k, l; + int err = 0; + unsigned char *buf = NULL; /* [SW_LENGTH] */ + unsigned char *idbuf = NULL; /* [SW_LENGTH] */ + unsigned char m = 1; + char comment[40]; + + comment[0] = 0; + + sw = kzalloc(sizeof(struct sw), GFP_KERNEL); + buf = kmalloc(SW_LENGTH, GFP_KERNEL); + idbuf = kmalloc(SW_LENGTH, GFP_KERNEL); + if (!sw || !buf || !idbuf) { + err = -ENOMEM; + goto fail1; + } + + sw->gameport = gameport; + + gameport_set_drvdata(gameport, sw); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + dbg("Init 0: Opened %s, io %#x, speed %d", + gameport->phys, gameport->io, gameport->speed); + + i = sw_read_packet(gameport, buf, SW_LENGTH, 0); /* Read normal packet */ + msleep(SW_TIMEOUT); + dbg("Init 1: Mode %d. Length %d.", m , i); + + if (!i) { /* No data. 3d Pro analog mode? */ + sw_init_digital(gameport); /* Switch to digital */ + msleep(SW_TIMEOUT); + i = sw_read_packet(gameport, buf, SW_LENGTH, 0); /* Retry reading packet */ + msleep(SW_TIMEOUT); + dbg("Init 1b: Length %d.", i); + if (!i) { /* No data -> FAIL */ + err = -ENODEV; + goto fail2; + } + } + + j = sw_read_packet(gameport, idbuf, SW_LENGTH, i); /* Read ID. This initializes the stick */ + m |= sw_guess_mode(idbuf, j); /* ID packet should carry mode info [3DP] */ + dbg("Init 2: Mode %d. ID Length %d.", m, j); + + if (j <= 0) { /* Read ID failed. Happens in 1-bit mode on PP */ + msleep(SW_TIMEOUT); + i = sw_read_packet(gameport, buf, SW_LENGTH, 0); /* Retry reading packet */ + m |= sw_guess_mode(buf, i); + dbg("Init 2b: Mode %d. Length %d.", m, i); + if (!i) { + err = -ENODEV; + goto fail2; + } + msleep(SW_TIMEOUT); + j = sw_read_packet(gameport, idbuf, SW_LENGTH, i); /* Retry reading ID */ + dbg("Init 2c: ID Length %d.", j); + } + + sw->type = -1; + k = SW_FAIL; /* Try SW_FAIL times */ + l = 0; + + do { + k--; + msleep(SW_TIMEOUT); + i = sw_read_packet(gameport, buf, SW_LENGTH, 0); /* Read data packet */ + dbg("Init 3: Mode %d. Length %d. Last %d. Tries %d.", m, i, l, k); + + if (i > l) { /* Longer? As we can only lose bits, it makes */ + /* no sense to try detection for a packet shorter */ + l = i; /* than the previous one */ + + sw->number = 1; + sw->gameport = gameport; + sw->length = i; + sw->bits = m; + + dbg("Init 3a: Case %d.\n", i * m); + + switch (i * m) { + case 60: + sw->number++; + case 45: /* Ambiguous packet length */ + if (j <= 40) { /* ID length less or eq 40 -> FSP */ + case 43: + sw->type = SW_ID_FSP; + break; + } + sw->number++; + case 30: + sw->number++; + case 15: + sw->type = SW_ID_GP; + break; + case 33: + case 31: + sw->type = SW_ID_FFW; + break; + case 48: /* Ambiguous */ + if (j == 14) { /* ID length 14*3 -> FFP */ + sw->type = SW_ID_FFP; + sprintf(comment, " [AC %s]", sw_get_bits(idbuf,38,1,3) ? "off" : "on"); + } else + sw->type = SW_ID_PP; + break; + case 66: + sw->bits = 3; + case 198: + sw->length = 22; + case 64: + sw->type = SW_ID_3DP; + if (j == 160) + sw_3dp_id(idbuf, comment, sizeof(comment)); + break; + } + } + + } while (k && sw->type == -1); + + if (sw->type == -1) { + printk(KERN_WARNING "sidewinder.c: unknown joystick device detected " + "on %s, contact \n", gameport->phys); + sw_print_packet("ID", j * 3, idbuf, 3); + sw_print_packet("Data", i * m, buf, m); + err = -ENODEV; + goto fail2; + } + +#ifdef SW_DEBUG + sw_print_packet("ID", j * 3, idbuf, 3); + sw_print_packet("Data", i * m, buf, m); +#endif + + gameport_set_poll_handler(gameport, sw_poll); + gameport_set_poll_interval(gameport, 20); + + k = i; + l = j; + + for (i = 0; i < sw->number; i++) { + int bits, code; + + snprintf(sw->name, sizeof(sw->name), + "Microsoft SideWinder %s", sw_name[sw->type]); + snprintf(sw->phys[i], sizeof(sw->phys[i]), + "%s/input%d", gameport->phys, i); + + sw->dev[i] = input_dev = input_allocate_device(); + if (!input_dev) { + err = -ENOMEM; + goto fail3; + } + + input_dev->name = sw->name; + input_dev->phys = sw->phys[i]; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_MICROSOFT; + input_dev->id.product = sw->type; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &gameport->dev; + + input_set_drvdata(input_dev, sw); + + input_dev->open = sw_open; + input_dev->close = sw_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (j = 0; (bits = sw_bit[sw->type][j]); j++) { + int min, max, fuzz, flat; + + code = sw_abs[sw->type][j]; + min = bits == 1 ? -1 : 0; + max = (1 << bits) - 1; + fuzz = (bits >> 1) >= 2 ? 1 << ((bits >> 1) - 2) : 0; + flat = code == ABS_THROTTLE || bits < 5 ? + 0 : 1 << (bits - 5); + + input_set_abs_params(input_dev, code, + min, max, fuzz, flat); + } + + for (j = 0; (code = sw_btn[sw->type][j]); j++) + __set_bit(code, input_dev->keybit); + + dbg("%s%s [%d-bit id %d data %d]\n", sw->name, comment, m, l, k); + + err = input_register_device(sw->dev[i]); + if (err) + goto fail4; + } + + out: kfree(buf); + kfree(idbuf); + + return err; + + fail4: input_free_device(sw->dev[i]); + fail3: while (--i >= 0) + input_unregister_device(sw->dev[i]); + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + kfree(sw); + goto out; +} + +static void sw_disconnect(struct gameport *gameport) +{ + struct sw *sw = gameport_get_drvdata(gameport); + int i; + + for (i = 0; i < sw->number; i++) + input_unregister_device(sw->dev[i]); + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(sw); +} + +static struct gameport_driver sw_drv = { + .driver = { + .name = "sidewinder", + .owner = THIS_MODULE, + }, + .description = DRIVER_DESC, + .connect = sw_connect, + .disconnect = sw_disconnect, +}; + +module_gameport_driver(sw_drv); diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c new file mode 100644 index 00000000..80a7b27a --- /dev/null +++ b/drivers/input/joystick/spaceball.c @@ -0,0 +1,299 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + * + * Based on the work of: + * David Thompson + * Joseph Krahn + */ + +/* + * SpaceTec SpaceBall 2003/3003/4000 FLX driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "SpaceTec SpaceBall 2003/3003/4000 FLX driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Constants. + */ + +#define SPACEBALL_MAX_LENGTH 128 +#define SPACEBALL_MAX_ID 9 + +#define SPACEBALL_1003 1 +#define SPACEBALL_2003B 3 +#define SPACEBALL_2003C 4 +#define SPACEBALL_3003C 7 +#define SPACEBALL_4000FLX 8 +#define SPACEBALL_4000FLX_L 9 + +static int spaceball_axes[] = { ABS_X, ABS_Z, ABS_Y, ABS_RX, ABS_RZ, ABS_RY }; +static char *spaceball_names[] = { + "?", "SpaceTec SpaceBall 1003", "SpaceTec SpaceBall 2003", "SpaceTec SpaceBall 2003B", + "SpaceTec SpaceBall 2003C", "SpaceTec SpaceBall 3003", "SpaceTec SpaceBall SpaceController", + "SpaceTec SpaceBall 3003C", "SpaceTec SpaceBall 4000FLX", "SpaceTec SpaceBall 4000FLX Lefty" }; + +/* + * Per-Ball data. + */ + +struct spaceball { + struct input_dev *dev; + int idx; + int escape; + unsigned char data[SPACEBALL_MAX_LENGTH]; + char phys[32]; +}; + +/* + * spaceball_process_packet() decodes packets the driver receives from the + * SpaceBall. + */ + +static void spaceball_process_packet(struct spaceball* spaceball) +{ + struct input_dev *dev = spaceball->dev; + unsigned char *data = spaceball->data; + int i; + + if (spaceball->idx < 2) return; + + switch (spaceball->data[0]) { + + case 'D': /* Ball data */ + if (spaceball->idx != 15) return; + for (i = 0; i < 6; i++) + input_report_abs(dev, spaceball_axes[i], + (__s16)((data[2 * i + 3] << 8) | data[2 * i + 2])); + break; + + case 'K': /* Button data */ + if (spaceball->idx != 3) return; + input_report_key(dev, BTN_1, (data[2] & 0x01) || (data[2] & 0x20)); + input_report_key(dev, BTN_2, data[2] & 0x02); + input_report_key(dev, BTN_3, data[2] & 0x04); + input_report_key(dev, BTN_4, data[2] & 0x08); + input_report_key(dev, BTN_5, data[1] & 0x01); + input_report_key(dev, BTN_6, data[1] & 0x02); + input_report_key(dev, BTN_7, data[1] & 0x04); + input_report_key(dev, BTN_8, data[1] & 0x10); + break; + + case '.': /* Advanced button data */ + if (spaceball->idx != 3) return; + input_report_key(dev, BTN_1, data[2] & 0x01); + input_report_key(dev, BTN_2, data[2] & 0x02); + input_report_key(dev, BTN_3, data[2] & 0x04); + input_report_key(dev, BTN_4, data[2] & 0x08); + input_report_key(dev, BTN_5, data[2] & 0x10); + input_report_key(dev, BTN_6, data[2] & 0x20); + input_report_key(dev, BTN_7, data[2] & 0x80); + input_report_key(dev, BTN_8, data[1] & 0x01); + input_report_key(dev, BTN_9, data[1] & 0x02); + input_report_key(dev, BTN_A, data[1] & 0x04); + input_report_key(dev, BTN_B, data[1] & 0x08); + input_report_key(dev, BTN_C, data[1] & 0x10); + input_report_key(dev, BTN_MODE, data[1] & 0x20); + break; + + case 'E': /* Device error */ + spaceball->data[spaceball->idx - 1] = 0; + printk(KERN_ERR "spaceball: Device error. [%s]\n", spaceball->data + 1); + break; + + case '?': /* Bad command packet */ + spaceball->data[spaceball->idx - 1] = 0; + printk(KERN_ERR "spaceball: Bad command. [%s]\n", spaceball->data + 1); + break; + } + + input_sync(dev); +} + +/* + * Spaceball 4000 FLX packets all start with a one letter packet-type decriptor, + * and end in 0x0d. It uses '^' as an escape for CR, XOFF and XON characters which + * can occur in the axis values. + */ + +static irqreturn_t spaceball_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct spaceball *spaceball = serio_get_drvdata(serio); + + switch (data) { + case 0xd: + spaceball_process_packet(spaceball); + spaceball->idx = 0; + spaceball->escape = 0; + break; + case '^': + if (!spaceball->escape) { + spaceball->escape = 1; + break; + } + spaceball->escape = 0; + case 'M': + case 'Q': + case 'S': + if (spaceball->escape) { + spaceball->escape = 0; + data &= 0x1f; + } + default: + if (spaceball->escape) + spaceball->escape = 0; + if (spaceball->idx < SPACEBALL_MAX_LENGTH) + spaceball->data[spaceball->idx++] = data; + break; + } + return IRQ_HANDLED; +} + +/* + * spaceball_disconnect() is the opposite of spaceball_connect() + */ + +static void spaceball_disconnect(struct serio *serio) +{ + struct spaceball* spaceball = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(spaceball->dev); + kfree(spaceball); +} + +/* + * spaceball_connect() is the routine that is called when someone adds a + * new serio device that supports Spaceball protocol and registers it as + * an input device. + */ + +static int spaceball_connect(struct serio *serio, struct serio_driver *drv) +{ + struct spaceball *spaceball; + struct input_dev *input_dev; + int err = -ENOMEM; + int i, id; + + if ((id = serio->id.id) > SPACEBALL_MAX_ID) + return -ENODEV; + + spaceball = kmalloc(sizeof(struct spaceball), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!spaceball || !input_dev) + goto fail1; + + spaceball->dev = input_dev; + snprintf(spaceball->phys, sizeof(spaceball->phys), "%s/input0", serio->phys); + + input_dev->name = spaceball_names[id]; + input_dev->phys = spaceball->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_SPACEBALL; + input_dev->id.product = id; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + switch (id) { + case SPACEBALL_4000FLX: + case SPACEBALL_4000FLX_L: + input_dev->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_9); + input_dev->keybit[BIT_WORD(BTN_A)] |= BIT_MASK(BTN_A) | + BIT_MASK(BTN_B) | BIT_MASK(BTN_C) | + BIT_MASK(BTN_MODE); + default: + input_dev->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_2) | + BIT_MASK(BTN_3) | BIT_MASK(BTN_4) | + BIT_MASK(BTN_5) | BIT_MASK(BTN_6) | + BIT_MASK(BTN_7) | BIT_MASK(BTN_8); + case SPACEBALL_3003C: + input_dev->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_1) | + BIT_MASK(BTN_8); + } + + for (i = 0; i < 3; i++) { + input_set_abs_params(input_dev, ABS_X + i, -8000, 8000, 8, 40); + input_set_abs_params(input_dev, ABS_RX + i, -1600, 1600, 2, 8); + } + + serio_set_drvdata(serio, spaceball); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(spaceball->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(spaceball); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id spaceball_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_SPACEBALL, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, spaceball_serio_ids); + +static struct serio_driver spaceball_drv = { + .driver = { + .name = "spaceball", + }, + .description = DRIVER_DESC, + .id_table = spaceball_serio_ids, + .interrupt = spaceball_interrupt, + .connect = spaceball_connect, + .disconnect = spaceball_disconnect, +}; + +module_serio_driver(spaceball_drv); diff --git a/drivers/input/joystick/spaceorb.c b/drivers/input/joystick/spaceorb.c new file mode 100644 index 00000000..a41f2916 --- /dev/null +++ b/drivers/input/joystick/spaceorb.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + * + * Based on the work of: + * David Thompson + */ + +/* + * SpaceTec SpaceOrb 360 and Avenger 6dof controller driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "SpaceTec SpaceOrb 360 and Avenger 6dof controller driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Constants. + */ + +#define SPACEORB_MAX_LENGTH 64 + +static int spaceorb_buttons[] = { BTN_TL, BTN_TR, BTN_Y, BTN_X, BTN_B, BTN_A }; +static int spaceorb_axes[] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; + +/* + * Per-Orb data. + */ + +struct spaceorb { + struct input_dev *dev; + int idx; + unsigned char data[SPACEORB_MAX_LENGTH]; + char phys[32]; +}; + +static unsigned char spaceorb_xor[] = "SpaceWare"; + +static unsigned char *spaceorb_errors[] = { "EEPROM storing 0 failed", "Receive queue overflow", "Transmit queue timeout", + "Bad packet", "Power brown-out", "EEPROM checksum error", "Hardware fault" }; + +/* + * spaceorb_process_packet() decodes packets the driver receives from the + * SpaceOrb. + */ + +static void spaceorb_process_packet(struct spaceorb *spaceorb) +{ + struct input_dev *dev = spaceorb->dev; + unsigned char *data = spaceorb->data; + unsigned char c = 0; + int axes[6]; + int i; + + if (spaceorb->idx < 2) return; + for (i = 0; i < spaceorb->idx; i++) c ^= data[i]; + if (c) return; + + switch (data[0]) { + + case 'R': /* Reset packet */ + spaceorb->data[spaceorb->idx - 1] = 0; + for (i = 1; i < spaceorb->idx && spaceorb->data[i] == ' '; i++); + printk(KERN_INFO "input: %s [%s] is %s\n", + dev->name, spaceorb->data + i, spaceorb->phys); + break; + + case 'D': /* Ball + button data */ + if (spaceorb->idx != 12) return; + for (i = 0; i < 9; i++) spaceorb->data[i+2] ^= spaceorb_xor[i]; + axes[0] = ( data[2] << 3) | (data[ 3] >> 4); + axes[1] = ((data[3] & 0x0f) << 6) | (data[ 4] >> 1); + axes[2] = ((data[4] & 0x01) << 9) | (data[ 5] << 2) | (data[4] >> 5); + axes[3] = ((data[6] & 0x1f) << 5) | (data[ 7] >> 2); + axes[4] = ((data[7] & 0x03) << 8) | (data[ 8] << 1) | (data[7] >> 6); + axes[5] = ((data[9] & 0x3f) << 4) | (data[10] >> 3); + for (i = 0; i < 6; i++) + input_report_abs(dev, spaceorb_axes[i], axes[i] - ((axes[i] & 0x200) ? 1024 : 0)); + for (i = 0; i < 6; i++) + input_report_key(dev, spaceorb_buttons[i], (data[1] >> i) & 1); + break; + + case 'K': /* Button data */ + if (spaceorb->idx != 5) return; + for (i = 0; i < 6; i++) + input_report_key(dev, spaceorb_buttons[i], (data[2] >> i) & 1); + + break; + + case 'E': /* Error packet */ + if (spaceorb->idx != 4) return; + printk(KERN_ERR "spaceorb: Device error. [ "); + for (i = 0; i < 7; i++) if (data[1] & (1 << i)) printk("%s ", spaceorb_errors[i]); + printk("]\n"); + break; + } + + input_sync(dev); +} + +static irqreturn_t spaceorb_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct spaceorb* spaceorb = serio_get_drvdata(serio); + + if (~data & 0x80) { + if (spaceorb->idx) spaceorb_process_packet(spaceorb); + spaceorb->idx = 0; + } + if (spaceorb->idx < SPACEORB_MAX_LENGTH) + spaceorb->data[spaceorb->idx++] = data & 0x7f; + return IRQ_HANDLED; +} + +/* + * spaceorb_disconnect() is the opposite of spaceorb_connect() + */ + +static void spaceorb_disconnect(struct serio *serio) +{ + struct spaceorb* spaceorb = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(spaceorb->dev); + kfree(spaceorb); +} + +/* + * spaceorb_connect() is the routine that is called when someone adds a + * new serio device that supports SpaceOrb/Avenger protocol and registers + * it as an input device. + */ + +static int spaceorb_connect(struct serio *serio, struct serio_driver *drv) +{ + struct spaceorb *spaceorb; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + spaceorb = kzalloc(sizeof(struct spaceorb), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!spaceorb || !input_dev) + goto fail1; + + spaceorb->dev = input_dev; + snprintf(spaceorb->phys, sizeof(spaceorb->phys), "%s/input0", serio->phys); + + input_dev->name = "SpaceTec SpaceOrb 360 / Avenger"; + input_dev->phys = spaceorb->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_SPACEORB; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; i < 6; i++) + set_bit(spaceorb_buttons[i], input_dev->keybit); + + for (i = 0; i < 6; i++) + input_set_abs_params(input_dev, spaceorb_axes[i], -508, 508, 0, 0); + + serio_set_drvdata(serio, spaceorb); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(spaceorb->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(spaceorb); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id spaceorb_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_SPACEORB, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, spaceorb_serio_ids); + +static struct serio_driver spaceorb_drv = { + .driver = { + .name = "spaceorb", + }, + .description = DRIVER_DESC, + .id_table = spaceorb_serio_ids, + .interrupt = spaceorb_interrupt, + .connect = spaceorb_connect, + .disconnect = spaceorb_disconnect, +}; + +module_serio_driver(spaceorb_drv); diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c new file mode 100644 index 00000000..0f51a60e --- /dev/null +++ b/drivers/input/joystick/stinger.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + * Copyright (c) 2000 Mark Fletcher + */ + +/* + * Gravis Stinger gamepad driver for Linux + */ + +/* + * This program is free warftware; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Gravis Stinger gamepad driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Constants. + */ + +#define STINGER_MAX_LENGTH 8 + +/* + * Per-Stinger data. + */ + +struct stinger { + struct input_dev *dev; + int idx; + unsigned char data[STINGER_MAX_LENGTH]; + char phys[32]; +}; + +/* + * stinger_process_packet() decodes packets the driver receives from the + * Stinger. It updates the data accordingly. + */ + +static void stinger_process_packet(struct stinger *stinger) +{ + struct input_dev *dev = stinger->dev; + unsigned char *data = stinger->data; + + if (!stinger->idx) return; + + input_report_key(dev, BTN_A, ((data[0] & 0x20) >> 5)); + input_report_key(dev, BTN_B, ((data[0] & 0x10) >> 4)); + input_report_key(dev, BTN_C, ((data[0] & 0x08) >> 3)); + input_report_key(dev, BTN_X, ((data[0] & 0x04) >> 2)); + input_report_key(dev, BTN_Y, ((data[3] & 0x20) >> 5)); + input_report_key(dev, BTN_Z, ((data[3] & 0x10) >> 4)); + input_report_key(dev, BTN_TL, ((data[3] & 0x08) >> 3)); + input_report_key(dev, BTN_TR, ((data[3] & 0x04) >> 2)); + input_report_key(dev, BTN_SELECT, ((data[3] & 0x02) >> 1)); + input_report_key(dev, BTN_START, (data[3] & 0x01)); + + input_report_abs(dev, ABS_X, (data[1] & 0x3F) - ((data[0] & 0x01) << 6)); + input_report_abs(dev, ABS_Y, ((data[0] & 0x02) << 5) - (data[2] & 0x3F)); + + input_sync(dev); + + return; +} + +/* + * stinger_interrupt() is called by the low level driver when characters + * are ready for us. We then buffer them for further processing, or call the + * packet processing routine. + */ + +static irqreturn_t stinger_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct stinger *stinger = serio_get_drvdata(serio); + + /* All Stinger packets are 4 bytes */ + + if (stinger->idx < STINGER_MAX_LENGTH) + stinger->data[stinger->idx++] = data; + + if (stinger->idx == 4) { + stinger_process_packet(stinger); + stinger->idx = 0; + } + + return IRQ_HANDLED; +} + +/* + * stinger_disconnect() is the opposite of stinger_connect() + */ + +static void stinger_disconnect(struct serio *serio) +{ + struct stinger *stinger = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(stinger->dev); + kfree(stinger); +} + +/* + * stinger_connect() is the routine that is called when someone adds a + * new serio device that supports Stinger protocol and registers it as + * an input device. + */ + +static int stinger_connect(struct serio *serio, struct serio_driver *drv) +{ + struct stinger *stinger; + struct input_dev *input_dev; + int err = -ENOMEM; + + stinger = kmalloc(sizeof(struct stinger), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!stinger || !input_dev) + goto fail1; + + stinger->dev = input_dev; + snprintf(stinger->phys, sizeof(stinger->phys), "%s/serio0", serio->phys); + + input_dev->name = "Gravis Stinger"; + input_dev->phys = stinger->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_STINGER; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_A)] = BIT_MASK(BTN_A) | BIT_MASK(BTN_B) | + BIT_MASK(BTN_C) | BIT_MASK(BTN_X) | BIT_MASK(BTN_Y) | + BIT_MASK(BTN_Z) | BIT_MASK(BTN_TL) | BIT_MASK(BTN_TR) | + BIT_MASK(BTN_START) | BIT_MASK(BTN_SELECT); + input_set_abs_params(input_dev, ABS_X, -64, 64, 0, 4); + input_set_abs_params(input_dev, ABS_Y, -64, 64, 0, 4); + + serio_set_drvdata(serio, stinger); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(stinger->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(stinger); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id stinger_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_STINGER, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, stinger_serio_ids); + +static struct serio_driver stinger_drv = { + .driver = { + .name = "stinger", + }, + .description = DRIVER_DESC, + .id_table = stinger_serio_ids, + .interrupt = stinger_interrupt, + .connect = stinger_connect, + .disconnect = stinger_disconnect, +}; + +module_serio_driver(stinger_drv); diff --git a/drivers/input/joystick/tmdc.c b/drivers/input/joystick/tmdc.c new file mode 100644 index 00000000..5ef9bcdb --- /dev/null +++ b/drivers/input/joystick/tmdc.c @@ -0,0 +1,439 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + * + * Based on the work of: + * Trystan Larey-Williams + */ + +/* + * ThrustMaster DirectConnect (BSP) joystick family driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "ThrustMaster DirectConnect joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define TMDC_MAX_START 600 /* 600 us */ +#define TMDC_MAX_STROBE 60 /* 60 us */ +#define TMDC_MAX_LENGTH 13 + +#define TMDC_MODE_M3DI 1 +#define TMDC_MODE_3DRP 3 +#define TMDC_MODE_AT 4 +#define TMDC_MODE_FM 8 +#define TMDC_MODE_FGP 163 + +#define TMDC_BYTE_ID 10 +#define TMDC_BYTE_REV 11 +#define TMDC_BYTE_DEF 12 + +#define TMDC_ABS 7 +#define TMDC_ABS_HAT 4 +#define TMDC_BTN 16 + +static const unsigned char tmdc_byte_a[16] = { 0, 1, 3, 4, 6, 7 }; +static const unsigned char tmdc_byte_d[16] = { 2, 5, 8, 9 }; + +static const signed char tmdc_abs[TMDC_ABS] = + { ABS_X, ABS_Y, ABS_RUDDER, ABS_THROTTLE, ABS_RX, ABS_RY, ABS_RZ }; +static const signed char tmdc_abs_hat[TMDC_ABS_HAT] = + { ABS_HAT0X, ABS_HAT0Y, ABS_HAT1X, ABS_HAT1Y }; +static const signed char tmdc_abs_at[TMDC_ABS] = + { ABS_X, ABS_Y, ABS_RUDDER, -1, ABS_THROTTLE }; +static const signed char tmdc_abs_fm[TMDC_ABS] = + { ABS_RX, ABS_RY, ABS_X, ABS_Y }; + +static const short tmdc_btn_pad[TMDC_BTN] = + { BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z, BTN_START, BTN_SELECT, BTN_TL, BTN_TR }; +static const short tmdc_btn_joy[TMDC_BTN] = + { BTN_TRIGGER, BTN_THUMB, BTN_TOP, BTN_TOP2, BTN_BASE, BTN_BASE2, BTN_THUMB2, BTN_PINKIE, + BTN_BASE3, BTN_BASE4, BTN_A, BTN_B, BTN_C, BTN_X, BTN_Y, BTN_Z }; +static const short tmdc_btn_fm[TMDC_BTN] = + { BTN_TRIGGER, BTN_C, BTN_B, BTN_A, BTN_THUMB, BTN_X, BTN_Y, BTN_Z, BTN_TOP, BTN_TOP2 }; +static const short tmdc_btn_at[TMDC_BTN] = + { BTN_TRIGGER, BTN_THUMB2, BTN_PINKIE, BTN_THUMB, BTN_BASE6, BTN_BASE5, BTN_BASE4, + BTN_BASE3, BTN_BASE2, BTN_BASE }; + +static const struct { + int x; + int y; +} tmdc_hat_to_axis[] = {{ 0, 0}, { 1, 0}, { 0,-1}, {-1, 0}, { 0, 1}}; + +static const struct tmdc_model { + unsigned char id; + const char *name; + char abs; + char hats; + char btnc[4]; + char btno[4]; + const signed char *axes; + const short *buttons; +} tmdc_models[] = { + { 1, "ThrustMaster Millenium 3D Inceptor", 6, 2, { 4, 2 }, { 4, 6 }, tmdc_abs, tmdc_btn_joy }, + { 3, "ThrustMaster Rage 3D Gamepad", 2, 0, { 8, 2 }, { 0, 0 }, tmdc_abs, tmdc_btn_pad }, + { 4, "ThrustMaster Attack Throttle", 5, 2, { 4, 6 }, { 4, 2 }, tmdc_abs_at, tmdc_btn_at }, + { 8, "ThrustMaster FragMaster", 4, 0, { 8, 2 }, { 0, 0 }, tmdc_abs_fm, tmdc_btn_fm }, + { 163, "Thrustmaster Fusion GamePad", 2, 0, { 8, 2 }, { 0, 0 }, tmdc_abs, tmdc_btn_pad }, + { 0, "Unknown %d-axis, %d-button TM device %d", 0, 0, { 0, 0 }, { 0, 0 }, tmdc_abs, tmdc_btn_joy } +}; + + +struct tmdc_port { + struct input_dev *dev; + char name[64]; + char phys[32]; + int mode; + const signed char *abs; + const short *btn; + unsigned char absc; + unsigned char btnc[4]; + unsigned char btno[4]; +}; + +struct tmdc { + struct gameport *gameport; + struct tmdc_port *port[2]; +#if 0 + struct input_dev *dev[2]; + char name[2][64]; + char phys[2][32]; + int mode[2]; + signed char *abs[2]; + short *btn[2]; + unsigned char absc[2]; + unsigned char btnc[2][4]; + unsigned char btno[2][4]; +#endif + int reads; + int bads; + unsigned char exists; +}; + +/* + * tmdc_read_packet() reads a ThrustMaster packet. + */ + +static int tmdc_read_packet(struct gameport *gameport, unsigned char data[2][TMDC_MAX_LENGTH]) +{ + unsigned char u, v, w, x; + unsigned long flags; + int i[2], j[2], t[2], p, k; + + p = gameport_time(gameport, TMDC_MAX_STROBE); + + for (k = 0; k < 2; k++) { + t[k] = gameport_time(gameport, TMDC_MAX_START); + i[k] = j[k] = 0; + } + + local_irq_save(flags); + gameport_trigger(gameport); + + w = gameport_read(gameport) >> 4; + + do { + x = w; + w = gameport_read(gameport) >> 4; + + for (k = 0, v = w, u = x; k < 2; k++, v >>= 2, u >>= 2) { + if (~v & u & 2) { + if (t[k] <= 0 || i[k] >= TMDC_MAX_LENGTH) continue; + t[k] = p; + if (j[k] == 0) { /* Start bit */ + if (~v & 1) t[k] = 0; + data[k][i[k]] = 0; j[k]++; continue; + } + if (j[k] == 9) { /* Stop bit */ + if (v & 1) t[k] = 0; + j[k] = 0; i[k]++; continue; + } + data[k][i[k]] |= (~v & 1) << (j[k]++ - 1); /* Data bit */ + } + t[k]--; + } + } while (t[0] > 0 || t[1] > 0); + + local_irq_restore(flags); + + return (i[0] == TMDC_MAX_LENGTH) | ((i[1] == TMDC_MAX_LENGTH) << 1); +} + +static int tmdc_parse_packet(struct tmdc_port *port, unsigned char *data) +{ + int i, k, l; + + if (data[TMDC_BYTE_ID] != port->mode) + return -1; + + for (i = 0; i < port->absc; i++) { + if (port->abs[i] < 0) + return 0; + + input_report_abs(port->dev, port->abs[i], data[tmdc_byte_a[i]]); + } + + switch (port->mode) { + + case TMDC_MODE_M3DI: + + i = tmdc_byte_d[0]; + input_report_abs(port->dev, ABS_HAT0X, ((data[i] >> 3) & 1) - ((data[i] >> 1) & 1)); + input_report_abs(port->dev, ABS_HAT0Y, ((data[i] >> 2) & 1) - ( data[i] & 1)); + break; + + case TMDC_MODE_AT: + + i = tmdc_byte_a[3]; + input_report_abs(port->dev, ABS_HAT0X, tmdc_hat_to_axis[(data[i] - 141) / 25].x); + input_report_abs(port->dev, ABS_HAT0Y, tmdc_hat_to_axis[(data[i] - 141) / 25].y); + break; + + } + + for (k = l = 0; k < 4; k++) { + for (i = 0; i < port->btnc[k]; i++) + input_report_key(port->dev, port->btn[i + l], + ((data[tmdc_byte_d[k]] >> (i + port->btno[k])) & 1)); + l += port->btnc[k]; + } + + input_sync(port->dev); + + return 0; +} + +/* + * tmdc_poll() reads and analyzes ThrustMaster joystick data. + */ + +static void tmdc_poll(struct gameport *gameport) +{ + unsigned char data[2][TMDC_MAX_LENGTH]; + struct tmdc *tmdc = gameport_get_drvdata(gameport); + unsigned char r, bad = 0; + int i; + + tmdc->reads++; + + if ((r = tmdc_read_packet(tmdc->gameport, data)) != tmdc->exists) + bad = 1; + else { + for (i = 0; i < 2; i++) { + if (r & (1 << i) & tmdc->exists) { + + if (tmdc_parse_packet(tmdc->port[i], data[i])) + bad = 1; + } + } + } + + tmdc->bads += bad; +} + +static int tmdc_open(struct input_dev *dev) +{ + struct tmdc *tmdc = input_get_drvdata(dev); + + gameport_start_polling(tmdc->gameport); + return 0; +} + +static void tmdc_close(struct input_dev *dev) +{ + struct tmdc *tmdc = input_get_drvdata(dev); + + gameport_stop_polling(tmdc->gameport); +} + +static int tmdc_setup_port(struct tmdc *tmdc, int idx, unsigned char *data) +{ + const struct tmdc_model *model; + struct tmdc_port *port; + struct input_dev *input_dev; + int i, j, b = 0; + int err; + + tmdc->port[idx] = port = kzalloc(sizeof (struct tmdc_port), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!port || !input_dev) { + err = -ENOMEM; + goto fail; + } + + port->mode = data[TMDC_BYTE_ID]; + + for (model = tmdc_models; model->id && model->id != port->mode; model++) + /* empty */; + + port->abs = model->axes; + port->btn = model->buttons; + + if (!model->id) { + port->absc = data[TMDC_BYTE_DEF] >> 4; + for (i = 0; i < 4; i++) + port->btnc[i] = i < (data[TMDC_BYTE_DEF] & 0xf) ? 8 : 0; + } else { + port->absc = model->abs; + for (i = 0; i < 4; i++) + port->btnc[i] = model->btnc[i]; + } + + for (i = 0; i < 4; i++) + port->btno[i] = model->btno[i]; + + snprintf(port->name, sizeof(port->name), model->name, + port->absc, (data[TMDC_BYTE_DEF] & 0xf) << 3, port->mode); + snprintf(port->phys, sizeof(port->phys), "%s/input%d", tmdc->gameport->phys, i); + + port->dev = input_dev; + + input_dev->name = port->name; + input_dev->phys = port->phys; + input_dev->id.bustype = BUS_GAMEPORT; + input_dev->id.vendor = GAMEPORT_ID_VENDOR_THRUSTMASTER; + input_dev->id.product = model->id; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &tmdc->gameport->dev; + + input_set_drvdata(input_dev, tmdc); + + input_dev->open = tmdc_open; + input_dev->close = tmdc_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + for (i = 0; i < port->absc && i < TMDC_ABS; i++) + if (port->abs[i] >= 0) + input_set_abs_params(input_dev, port->abs[i], 8, 248, 2, 4); + + for (i = 0; i < model->hats && i < TMDC_ABS_HAT; i++) + input_set_abs_params(input_dev, tmdc_abs_hat[i], -1, 1, 0, 0); + + for (i = 0; i < 4; i++) { + for (j = 0; j < port->btnc[i] && j < TMDC_BTN; j++) + set_bit(port->btn[j + b], input_dev->keybit); + b += port->btnc[i]; + } + + err = input_register_device(port->dev); + if (err) + goto fail; + + return 0; + + fail: input_free_device(input_dev); + kfree(port); + return err; +} + +/* + * tmdc_probe() probes for ThrustMaster type joysticks. + */ + +static int tmdc_connect(struct gameport *gameport, struct gameport_driver *drv) +{ + unsigned char data[2][TMDC_MAX_LENGTH]; + struct tmdc *tmdc; + int i; + int err; + + if (!(tmdc = kzalloc(sizeof(struct tmdc), GFP_KERNEL))) + return -ENOMEM; + + tmdc->gameport = gameport; + + gameport_set_drvdata(gameport, tmdc); + + err = gameport_open(gameport, drv, GAMEPORT_MODE_RAW); + if (err) + goto fail1; + + if (!(tmdc->exists = tmdc_read_packet(gameport, data))) { + err = -ENODEV; + goto fail2; + } + + gameport_set_poll_handler(gameport, tmdc_poll); + gameport_set_poll_interval(gameport, 20); + + for (i = 0; i < 2; i++) { + if (tmdc->exists & (1 << i)) { + + err = tmdc_setup_port(tmdc, i, data[i]); + if (err) + goto fail3; + } + } + + return 0; + + fail3: while (--i >= 0) { + if (tmdc->port[i]) { + input_unregister_device(tmdc->port[i]->dev); + kfree(tmdc->port[i]); + } + } + fail2: gameport_close(gameport); + fail1: gameport_set_drvdata(gameport, NULL); + kfree(tmdc); + return err; +} + +static void tmdc_disconnect(struct gameport *gameport) +{ + struct tmdc *tmdc = gameport_get_drvdata(gameport); + int i; + + for (i = 0; i < 2; i++) { + if (tmdc->port[i]) { + input_unregister_device(tmdc->port[i]->dev); + kfree(tmdc->port[i]); + } + } + gameport_close(gameport); + gameport_set_drvdata(gameport, NULL); + kfree(tmdc); +} + +static struct gameport_driver tmdc_drv = { + .driver = { + .name = "tmdc", + .owner = THIS_MODULE, + }, + .description = DRIVER_DESC, + .connect = tmdc_connect, + .disconnect = tmdc_disconnect, +}; + +module_gameport_driver(tmdc_drv); diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c new file mode 100644 index 00000000..27b6a3ce --- /dev/null +++ b/drivers/input/joystick/turbografx.c @@ -0,0 +1,325 @@ +/* + * Copyright (c) 1998-2001 Vojtech Pavlik + * + * Based on the work of: + * Steffen Schwenke + */ + +/* + * TurboGraFX parallel port interface driver for Linux. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("TurboGraFX parallel port interface driver"); +MODULE_LICENSE("GPL"); + +#define TGFX_MAX_PORTS 3 +#define TGFX_MAX_DEVICES 7 + +struct tgfx_config { + int args[TGFX_MAX_DEVICES + 1]; + unsigned int nargs; +}; + +static struct tgfx_config tgfx_cfg[TGFX_MAX_PORTS] __initdata; + +module_param_array_named(map, tgfx_cfg[0].args, int, &tgfx_cfg[0].nargs, 0); +MODULE_PARM_DESC(map, "Describes first set of devices (,,,.."); +module_param_array_named(map2, tgfx_cfg[1].args, int, &tgfx_cfg[1].nargs, 0); +MODULE_PARM_DESC(map2, "Describes second set of devices"); +module_param_array_named(map3, tgfx_cfg[2].args, int, &tgfx_cfg[2].nargs, 0); +MODULE_PARM_DESC(map3, "Describes third set of devices"); + +#define TGFX_REFRESH_TIME HZ/100 /* 10 ms */ + +#define TGFX_TRIGGER 0x08 +#define TGFX_UP 0x10 +#define TGFX_DOWN 0x20 +#define TGFX_LEFT 0x40 +#define TGFX_RIGHT 0x80 + +#define TGFX_THUMB 0x02 +#define TGFX_THUMB2 0x04 +#define TGFX_TOP 0x01 +#define TGFX_TOP2 0x08 + +static int tgfx_buttons[] = { BTN_TRIGGER, BTN_THUMB, BTN_THUMB2, BTN_TOP, BTN_TOP2 }; + +static struct tgfx { + struct pardevice *pd; + struct timer_list timer; + struct input_dev *dev[TGFX_MAX_DEVICES]; + char name[TGFX_MAX_DEVICES][64]; + char phys[TGFX_MAX_DEVICES][32]; + int sticks; + int used; + struct mutex sem; +} *tgfx_base[TGFX_MAX_PORTS]; + +/* + * tgfx_timer() reads and analyzes TurboGraFX joystick data. + */ + +static void tgfx_timer(unsigned long private) +{ + struct tgfx *tgfx = (void *) private; + struct input_dev *dev; + int data1, data2, i; + + for (i = 0; i < 7; i++) + if (tgfx->sticks & (1 << i)) { + + dev = tgfx->dev[i]; + + parport_write_data(tgfx->pd->port, ~(1 << i)); + data1 = parport_read_status(tgfx->pd->port) ^ 0x7f; + data2 = parport_read_control(tgfx->pd->port) ^ 0x04; /* CAVEAT parport */ + + input_report_abs(dev, ABS_X, !!(data1 & TGFX_RIGHT) - !!(data1 & TGFX_LEFT)); + input_report_abs(dev, ABS_Y, !!(data1 & TGFX_DOWN ) - !!(data1 & TGFX_UP )); + + input_report_key(dev, BTN_TRIGGER, (data1 & TGFX_TRIGGER)); + input_report_key(dev, BTN_THUMB, (data2 & TGFX_THUMB )); + input_report_key(dev, BTN_THUMB2, (data2 & TGFX_THUMB2 )); + input_report_key(dev, BTN_TOP, (data2 & TGFX_TOP )); + input_report_key(dev, BTN_TOP2, (data2 & TGFX_TOP2 )); + + input_sync(dev); + } + + mod_timer(&tgfx->timer, jiffies + TGFX_REFRESH_TIME); +} + +static int tgfx_open(struct input_dev *dev) +{ + struct tgfx *tgfx = input_get_drvdata(dev); + int err; + + err = mutex_lock_interruptible(&tgfx->sem); + if (err) + return err; + + if (!tgfx->used++) { + parport_claim(tgfx->pd); + parport_write_control(tgfx->pd->port, 0x04); + mod_timer(&tgfx->timer, jiffies + TGFX_REFRESH_TIME); + } + + mutex_unlock(&tgfx->sem); + return 0; +} + +static void tgfx_close(struct input_dev *dev) +{ + struct tgfx *tgfx = input_get_drvdata(dev); + + mutex_lock(&tgfx->sem); + if (!--tgfx->used) { + del_timer_sync(&tgfx->timer); + parport_write_control(tgfx->pd->port, 0x00); + parport_release(tgfx->pd); + } + mutex_unlock(&tgfx->sem); +} + + + +/* + * tgfx_probe() probes for tg gamepads. + */ + +static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) +{ + struct tgfx *tgfx; + struct input_dev *input_dev; + struct parport *pp; + struct pardevice *pd; + int i, j; + int err; + + pp = parport_find_number(parport); + if (!pp) { + printk(KERN_ERR "turbografx.c: no such parport\n"); + err = -EINVAL; + goto err_out; + } + + pd = parport_register_device(pp, "turbografx", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); + if (!pd) { + printk(KERN_ERR "turbografx.c: parport busy already - lp.o loaded?\n"); + err = -EBUSY; + goto err_put_pp; + } + + tgfx = kzalloc(sizeof(struct tgfx), GFP_KERNEL); + if (!tgfx) { + printk(KERN_ERR "turbografx.c: Not enough memory\n"); + err = -ENOMEM; + goto err_unreg_pardev; + } + + mutex_init(&tgfx->sem); + tgfx->pd = pd; + init_timer(&tgfx->timer); + tgfx->timer.data = (long) tgfx; + tgfx->timer.function = tgfx_timer; + + for (i = 0; i < n_devs; i++) { + if (n_buttons[i] < 1) + continue; + + if (n_buttons[i] > 6) { + printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); + err = -EINVAL; + goto err_unreg_devs; + } + + tgfx->dev[i] = input_dev = input_allocate_device(); + if (!input_dev) { + printk(KERN_ERR "turbografx.c: Not enough memory for input device\n"); + err = -ENOMEM; + goto err_unreg_devs; + } + + tgfx->sticks |= (1 << i); + snprintf(tgfx->name[i], sizeof(tgfx->name[i]), + "TurboGraFX %d-button Multisystem joystick", n_buttons[i]); + snprintf(tgfx->phys[i], sizeof(tgfx->phys[i]), + "%s/input%d", tgfx->pd->port->name, i); + + input_dev->name = tgfx->name[i]; + input_dev->phys = tgfx->phys[i]; + input_dev->id.bustype = BUS_PARPORT; + input_dev->id.vendor = 0x0003; + input_dev->id.product = n_buttons[i]; + input_dev->id.version = 0x0100; + + input_set_drvdata(input_dev, tgfx); + + input_dev->open = tgfx_open; + input_dev->close = tgfx_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_set_abs_params(input_dev, ABS_X, -1, 1, 0, 0); + input_set_abs_params(input_dev, ABS_Y, -1, 1, 0, 0); + + for (j = 0; j < n_buttons[i]; j++) + set_bit(tgfx_buttons[j], input_dev->keybit); + + err = input_register_device(tgfx->dev[i]); + if (err) + goto err_free_dev; + } + + if (!tgfx->sticks) { + printk(KERN_ERR "turbografx.c: No valid devices specified\n"); + err = -EINVAL; + goto err_free_tgfx; + } + + parport_put_port(pp); + return tgfx; + + err_free_dev: + input_free_device(tgfx->dev[i]); + err_unreg_devs: + while (--i >= 0) + if (tgfx->dev[i]) + input_unregister_device(tgfx->dev[i]); + err_free_tgfx: + kfree(tgfx); + err_unreg_pardev: + parport_unregister_device(pd); + err_put_pp: + parport_put_port(pp); + err_out: + return ERR_PTR(err); +} + +static void tgfx_remove(struct tgfx *tgfx) +{ + int i; + + for (i = 0; i < TGFX_MAX_DEVICES; i++) + if (tgfx->dev[i]) + input_unregister_device(tgfx->dev[i]); + parport_unregister_device(tgfx->pd); + kfree(tgfx); +} + +static int __init tgfx_init(void) +{ + int i; + int have_dev = 0; + int err = 0; + + for (i = 0; i < TGFX_MAX_PORTS; i++) { + if (tgfx_cfg[i].nargs == 0 || tgfx_cfg[i].args[0] < 0) + continue; + + if (tgfx_cfg[i].nargs < 2) { + printk(KERN_ERR "turbografx.c: at least one joystick must be specified\n"); + err = -EINVAL; + break; + } + + tgfx_base[i] = tgfx_probe(tgfx_cfg[i].args[0], + tgfx_cfg[i].args + 1, + tgfx_cfg[i].nargs - 1); + if (IS_ERR(tgfx_base[i])) { + err = PTR_ERR(tgfx_base[i]); + break; + } + + have_dev = 1; + } + + if (err) { + while (--i >= 0) + if (tgfx_base[i]) + tgfx_remove(tgfx_base[i]); + return err; + } + + return have_dev ? 0 : -ENODEV; +} + +static void __exit tgfx_exit(void) +{ + int i; + + for (i = 0; i < TGFX_MAX_PORTS; i++) + if (tgfx_base[i]) + tgfx_remove(tgfx_base[i]); +} + +module_init(tgfx_init); +module_exit(tgfx_exit); diff --git a/drivers/input/joystick/twidjoy.c b/drivers/input/joystick/twidjoy.c new file mode 100644 index 00000000..2556a819 --- /dev/null +++ b/drivers/input/joystick/twidjoy.c @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2001 Arndt Schoenewald + * Copyright (c) 2000-2001 Vojtech Pavlik + * Copyright (c) 2000 Mark Fletcher + * + * Sponsored by Quelltext AG (http://www.quelltext-ag.de), Dortmund, Germany + */ + +/* + * Driver to use Handykey's Twiddler (the first edition, i.e. the one with + * the RS232 interface) as a joystick under Linux + * + * The Twiddler is a one-handed chording keyboard featuring twelve buttons on + * the front, six buttons on the top, and a built-in tilt sensor. The buttons + * on the front, which are grouped as four rows of three buttons, are pressed + * by the four fingers (this implies only one button per row can be held down + * at the same time) and the buttons on the top are for the thumb. The tilt + * sensor delivers X and Y axis data depending on how the Twiddler is held. + * Additional information can be found at http://www.handykey.com. + * + * This driver does not use the Twiddler for its intended purpose, i.e. as + * a chording keyboard, but as a joystick: pressing and releasing a button + * immediately sends a corresponding button event, and tilting it generates + * corresponding ABS_X and ABS_Y events. This turns the Twiddler into a game + * controller with amazing 18 buttons :-) + * + * Note: The Twiddler2 (the successor of the Twiddler that connects directly + * to the PS/2 keyboard and mouse ports) is NOT supported by this driver! + * + * For questions or feedback regarding this driver module please contact: + * Arndt Schoenewald + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Handykey Twiddler keyboard as a joystick driver" + +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Constants. + */ + +#define TWIDJOY_MAX_LENGTH 5 + +static struct twidjoy_button_spec { + int bitshift; + int bitmask; + int buttons[3]; +} +twidjoy_buttons[] = { + { 0, 3, { BTN_A, BTN_B, BTN_C } }, + { 2, 3, { BTN_X, BTN_Y, BTN_Z } }, + { 4, 3, { BTN_TL, BTN_TR, BTN_TR2 } }, + { 6, 3, { BTN_SELECT, BTN_START, BTN_MODE } }, + { 8, 1, { BTN_BASE5 } }, + { 9, 1, { BTN_BASE } }, + { 10, 1, { BTN_BASE3 } }, + { 11, 1, { BTN_BASE4 } }, + { 12, 1, { BTN_BASE2 } }, + { 13, 1, { BTN_BASE6 } }, + { 0, 0, { 0 } } +}; + +/* + * Per-Twiddler data. + */ + +struct twidjoy { + struct input_dev *dev; + int idx; + unsigned char data[TWIDJOY_MAX_LENGTH]; + char phys[32]; +}; + +/* + * twidjoy_process_packet() decodes packets the driver receives from the + * Twiddler. It updates the data accordingly. + */ + +static void twidjoy_process_packet(struct twidjoy *twidjoy) +{ + struct input_dev *dev = twidjoy->dev; + unsigned char *data = twidjoy->data; + struct twidjoy_button_spec *bp; + int button_bits, abs_x, abs_y; + + button_bits = ((data[1] & 0x7f) << 7) | (data[0] & 0x7f); + + for (bp = twidjoy_buttons; bp->bitmask; bp++) { + int value = (button_bits & (bp->bitmask << bp->bitshift)) >> bp->bitshift; + int i; + + for (i = 0; i < bp->bitmask; i++) + input_report_key(dev, bp->buttons[i], i+1 == value); + } + + abs_x = ((data[4] & 0x07) << 5) | ((data[3] & 0x7C) >> 2); + if (data[4] & 0x08) abs_x -= 256; + + abs_y = ((data[3] & 0x01) << 7) | ((data[2] & 0x7F) >> 0); + if (data[3] & 0x02) abs_y -= 256; + + input_report_abs(dev, ABS_X, -abs_x); + input_report_abs(dev, ABS_Y, +abs_y); + + input_sync(dev); +} + +/* + * twidjoy_interrupt() is called by the low level driver when characters + * are ready for us. We then buffer them for further processing, or call the + * packet processing routine. + */ + +static irqreturn_t twidjoy_interrupt(struct serio *serio, unsigned char data, unsigned int flags) +{ + struct twidjoy *twidjoy = serio_get_drvdata(serio); + + /* All Twiddler packets are 5 bytes. The fact that the first byte + * has a MSB of 0 and all other bytes have a MSB of 1 can be used + * to check and regain sync. */ + + if ((data & 0x80) == 0) + twidjoy->idx = 0; /* this byte starts a new packet */ + else if (twidjoy->idx == 0) + return IRQ_HANDLED; /* wrong MSB -- ignore this byte */ + + if (twidjoy->idx < TWIDJOY_MAX_LENGTH) + twidjoy->data[twidjoy->idx++] = data; + + if (twidjoy->idx == TWIDJOY_MAX_LENGTH) { + twidjoy_process_packet(twidjoy); + twidjoy->idx = 0; + } + + return IRQ_HANDLED; +} + +/* + * twidjoy_disconnect() is the opposite of twidjoy_connect() + */ + +static void twidjoy_disconnect(struct serio *serio) +{ + struct twidjoy *twidjoy = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(twidjoy->dev); + kfree(twidjoy); +} + +/* + * twidjoy_connect() is the routine that is called when someone adds a + * new serio device. It looks for the Twiddler, and if found, registers + * it as an input device. + */ + +static int twidjoy_connect(struct serio *serio, struct serio_driver *drv) +{ + struct twidjoy_button_spec *bp; + struct twidjoy *twidjoy; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + twidjoy = kzalloc(sizeof(struct twidjoy), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!twidjoy || !input_dev) + goto fail1; + + twidjoy->dev = input_dev; + snprintf(twidjoy->phys, sizeof(twidjoy->phys), "%s/input0", serio->phys); + + input_dev->name = "Handykey Twiddler"; + input_dev->phys = twidjoy->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_TWIDJOY; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_set_abs_params(input_dev, ABS_X, -50, 50, 4, 4); + input_set_abs_params(input_dev, ABS_Y, -50, 50, 4, 4); + + for (bp = twidjoy_buttons; bp->bitmask; bp++) + for (i = 0; i < bp->bitmask; i++) + set_bit(bp->buttons[i], input_dev->keybit); + + serio_set_drvdata(serio, twidjoy); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(twidjoy->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(twidjoy); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id twidjoy_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_TWIDJOY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, twidjoy_serio_ids); + +static struct serio_driver twidjoy_drv = { + .driver = { + .name = "twidjoy", + }, + .description = DRIVER_DESC, + .id_table = twidjoy_serio_ids, + .interrupt = twidjoy_interrupt, + .connect = twidjoy_connect, + .disconnect = twidjoy_disconnect, +}; + +module_serio_driver(twidjoy_drv); diff --git a/drivers/input/joystick/walkera0701.c b/drivers/input/joystick/walkera0701.c new file mode 100644 index 00000000..b76ac580 --- /dev/null +++ b/drivers/input/joystick/walkera0701.c @@ -0,0 +1,303 @@ +/* + * Parallel port to Walkera WK-0701 TX joystick + * + * Copyright (c) 2008 Peter Popovec + * + * More about driver: + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. +*/ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#define RESERVE 20000 +#define SYNC_PULSE 1306000 +#define BIN0_PULSE 288000 +#define BIN1_PULSE 438000 + +#define ANALOG_MIN_PULSE 318000 +#define ANALOG_MAX_PULSE 878000 +#define ANALOG_DELTA 80000 + +#define BIN_SAMPLE ((BIN0_PULSE + BIN1_PULSE) / 2) + +#define NO_SYNC 25 + +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Peter Popovec "); +MODULE_DESCRIPTION("Walkera WK-0701 TX as joystick"); +MODULE_LICENSE("GPL"); + +static unsigned int walkera0701_pp_no; +module_param_named(port, walkera0701_pp_no, int, 0); +MODULE_PARM_DESC(port, + "Parallel port adapter for Walkera WK-0701 TX (default is 0)"); + +/* + * For now, only one device is supported, if somebody need more devices, code + * can be expanded, one struct walkera_dev per device must be allocated and + * set up by walkera0701_connect (release of device by walkera0701_disconnect) + */ + +struct walkera_dev { + unsigned char buf[25]; + u64 irq_time, irq_lasttime; + int counter; + int ack; + + struct input_dev *input_dev; + struct hrtimer timer; + + struct parport *parport; + struct pardevice *pardevice; +}; + +static struct walkera_dev w_dev; + +static inline void walkera0701_parse_frame(struct walkera_dev *w) +{ + int i; + int val1, val2, val3, val4, val5, val6, val7, val8; + int magic, magic_bit; + int crc1, crc2; + + for (crc1 = crc2 = i = 0; i < 10; i++) { + crc1 += w->buf[i] & 7; + crc2 += (w->buf[i] & 8) >> 3; + } + if ((w->buf[10] & 7) != (crc1 & 7)) + return; + if (((w->buf[10] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1)) + return; + for (crc1 = crc2 = 0, i = 11; i < 23; i++) { + crc1 += w->buf[i] & 7; + crc2 += (w->buf[i] & 8) >> 3; + } + if ((w->buf[23] & 7) != (crc1 & 7)) + return; + if (((w->buf[23] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1)) + return; + val1 = ((w->buf[0] & 7) * 256 + w->buf[1] * 16 + w->buf[2]) >> 2; + val1 *= ((w->buf[0] >> 2) & 2) - 1; /* sign */ + val2 = (w->buf[2] & 1) << 8 | (w->buf[3] << 4) | w->buf[4]; + val2 *= (w->buf[2] & 2) - 1; /* sign */ + val3 = ((w->buf[5] & 7) * 256 + w->buf[6] * 16 + w->buf[7]) >> 2; + val3 *= ((w->buf[5] >> 2) & 2) - 1; /* sign */ + val4 = (w->buf[7] & 1) << 8 | (w->buf[8] << 4) | w->buf[9]; + val4 *= (w->buf[7] & 2) - 1; /* sign */ + val5 = ((w->buf[11] & 7) * 256 + w->buf[12] * 16 + w->buf[13]) >> 2; + val5 *= ((w->buf[11] >> 2) & 2) - 1; /* sign */ + val6 = (w->buf[13] & 1) << 8 | (w->buf[14] << 4) | w->buf[15]; + val6 *= (w->buf[13] & 2) - 1; /* sign */ + val7 = ((w->buf[16] & 7) * 256 + w->buf[17] * 16 + w->buf[18]) >> 2; + val7 *= ((w->buf[16] >> 2) & 2) - 1; /*sign */ + val8 = (w->buf[18] & 1) << 8 | (w->buf[19] << 4) | w->buf[20]; + val8 *= (w->buf[18] & 2) - 1; /*sign */ + + magic = (w->buf[21] << 4) | w->buf[22]; + magic_bit = (w->buf[24] & 8) >> 3; + pr_debug("%4d %4d %4d %4d %4d %4d %4d %4d (magic %2x %d)\n", + val1, val2, val3, val4, val5, val6, val7, val8, + magic, magic_bit); + + input_report_abs(w->input_dev, ABS_X, val2); + input_report_abs(w->input_dev, ABS_Y, val1); + input_report_abs(w->input_dev, ABS_Z, val6); + input_report_abs(w->input_dev, ABS_THROTTLE, val3); + input_report_abs(w->input_dev, ABS_RUDDER, val4); + input_report_abs(w->input_dev, ABS_MISC, val7); + input_report_key(w->input_dev, BTN_GEAR_DOWN, val5 > 0); +} + +static inline int read_ack(struct pardevice *p) +{ + return parport_read_status(p->port) & 0x40; +} + +/* falling edge, prepare to BIN value calculation */ +static void walkera0701_irq_handler(void *handler_data) +{ + u64 pulse_time; + struct walkera_dev *w = handler_data; + + w->irq_time = ktime_to_ns(ktime_get()); + pulse_time = w->irq_time - w->irq_lasttime; + w->irq_lasttime = w->irq_time; + + /* cancel timer, if in handler or active do resync */ + if (unlikely(0 != hrtimer_try_to_cancel(&w->timer))) { + w->counter = NO_SYNC; + return; + } + + if (w->counter < NO_SYNC) { + if (w->ack) { + pulse_time -= BIN1_PULSE; + w->buf[w->counter] = 8; + } else { + pulse_time -= BIN0_PULSE; + w->buf[w->counter] = 0; + } + if (w->counter == 24) { /* full frame */ + walkera0701_parse_frame(w); + w->counter = NO_SYNC; + if (abs(pulse_time - SYNC_PULSE) < RESERVE) /* new frame sync */ + w->counter = 0; + } else { + if ((pulse_time > (ANALOG_MIN_PULSE - RESERVE) + && (pulse_time < (ANALOG_MAX_PULSE + RESERVE)))) { + pulse_time -= (ANALOG_MIN_PULSE - RESERVE); + pulse_time = (u32) pulse_time / ANALOG_DELTA; /* overtiping is safe, pulsetime < s32.. */ + w->buf[w->counter++] |= (pulse_time & 7); + } else + w->counter = NO_SYNC; + } + } else if (abs(pulse_time - SYNC_PULSE - BIN0_PULSE) < + RESERVE + BIN1_PULSE - BIN0_PULSE) /* frame sync .. */ + w->counter = 0; + + hrtimer_start(&w->timer, ktime_set(0, BIN_SAMPLE), HRTIMER_MODE_REL); +} + +static enum hrtimer_restart timer_handler(struct hrtimer + *handle) +{ + struct walkera_dev *w; + + w = container_of(handle, struct walkera_dev, timer); + w->ack = read_ack(w->pardevice); + + return HRTIMER_NORESTART; +} + +static int walkera0701_open(struct input_dev *dev) +{ + struct walkera_dev *w = input_get_drvdata(dev); + + if (parport_claim(w->pardevice)) + return -EBUSY; + + parport_enable_irq(w->parport); + return 0; +} + +static void walkera0701_close(struct input_dev *dev) +{ + struct walkera_dev *w = input_get_drvdata(dev); + + parport_disable_irq(w->parport); + hrtimer_cancel(&w->timer); + + parport_release(w->pardevice); +} + +static int walkera0701_connect(struct walkera_dev *w, int parport) +{ + int error; + + w->parport = parport_find_number(parport); + if (!w->parport) { + pr_err("parport %d does not exist\n", parport); + return -ENODEV; + } + + if (w->parport->irq == -1) { + pr_err("parport %d does not have interrupt assigned\n", + parport); + error = -EINVAL; + goto err_put_parport; + } + + w->pardevice = parport_register_device(w->parport, "walkera0701", + NULL, NULL, walkera0701_irq_handler, + PARPORT_DEV_EXCL, w); + if (!w->pardevice) { + pr_err("failed to register parport device\n"); + error = -EIO; + goto err_put_parport; + } + + if (parport_negotiate(w->pardevice->port, IEEE1284_MODE_COMPAT)) { + pr_err("failed to negotiate parport mode\n"); + error = -EIO; + goto err_unregister_device; + } + + hrtimer_init(&w->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + w->timer.function = timer_handler; + + w->input_dev = input_allocate_device(); + if (!w->input_dev) { + pr_err("failed to allocate input device\n"); + error = -ENOMEM; + goto err_unregister_device; + } + + input_set_drvdata(w->input_dev, w); + w->input_dev->name = "Walkera WK-0701 TX"; + w->input_dev->phys = w->parport->name; + w->input_dev->id.bustype = BUS_PARPORT; + + /* TODO what id vendor/product/version ? */ + w->input_dev->id.vendor = 0x0001; + w->input_dev->id.product = 0x0001; + w->input_dev->id.version = 0x0100; + w->input_dev->dev.parent = w->parport->dev; + w->input_dev->open = walkera0701_open; + w->input_dev->close = walkera0701_close; + + w->input_dev->evbit[0] = BIT(EV_ABS) | BIT_MASK(EV_KEY); + w->input_dev->keybit[BIT_WORD(BTN_GEAR_DOWN)] = BIT_MASK(BTN_GEAR_DOWN); + + input_set_abs_params(w->input_dev, ABS_X, -512, 512, 0, 0); + input_set_abs_params(w->input_dev, ABS_Y, -512, 512, 0, 0); + input_set_abs_params(w->input_dev, ABS_Z, -512, 512, 0, 0); + input_set_abs_params(w->input_dev, ABS_THROTTLE, -512, 512, 0, 0); + input_set_abs_params(w->input_dev, ABS_RUDDER, -512, 512, 0, 0); + input_set_abs_params(w->input_dev, ABS_MISC, -512, 512, 0, 0); + + error = input_register_device(w->input_dev); + if (error) { + pr_err("failed to register input device\n"); + goto err_free_input_dev; + } + + return 0; + +err_free_input_dev: + input_free_device(w->input_dev); +err_unregister_device: + parport_unregister_device(w->pardevice); +err_put_parport: + parport_put_port(w->parport); + return error; +} + +static void walkera0701_disconnect(struct walkera_dev *w) +{ + input_unregister_device(w->input_dev); + parport_unregister_device(w->pardevice); + parport_put_port(w->parport); +} + +static int __init walkera0701_init(void) +{ + return walkera0701_connect(&w_dev, walkera0701_pp_no); +} + +static void __exit walkera0701_exit(void) +{ + walkera0701_disconnect(&w_dev); +} + +module_init(walkera0701_init); +module_exit(walkera0701_exit); diff --git a/drivers/input/joystick/warrior.c b/drivers/input/joystick/warrior.c new file mode 100644 index 00000000..23b3071a --- /dev/null +++ b/drivers/input/joystick/warrior.c @@ -0,0 +1,220 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * Logitech WingMan Warrior joystick driver for Linux + */ + +/* + * This program is free warftware; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Logitech WingMan Warrior joystick driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Constants. + */ + +#define WARRIOR_MAX_LENGTH 16 +static char warrior_lengths[] = { 0, 4, 12, 3, 4, 4, 0, 0 }; + +/* + * Per-Warrior data. + */ + +struct warrior { + struct input_dev *dev; + int idx, len; + unsigned char data[WARRIOR_MAX_LENGTH]; + char phys[32]; +}; + +/* + * warrior_process_packet() decodes packets the driver receives from the + * Warrior. It updates the data accordingly. + */ + +static void warrior_process_packet(struct warrior *warrior) +{ + struct input_dev *dev = warrior->dev; + unsigned char *data = warrior->data; + + if (!warrior->idx) return; + + switch ((data[0] >> 4) & 7) { + case 1: /* Button data */ + input_report_key(dev, BTN_TRIGGER, data[3] & 1); + input_report_key(dev, BTN_THUMB, (data[3] >> 1) & 1); + input_report_key(dev, BTN_TOP, (data[3] >> 2) & 1); + input_report_key(dev, BTN_TOP2, (data[3] >> 3) & 1); + break; + case 3: /* XY-axis info->data */ + input_report_abs(dev, ABS_X, ((data[0] & 8) << 5) - (data[2] | ((data[0] & 4) << 5))); + input_report_abs(dev, ABS_Y, (data[1] | ((data[0] & 1) << 7)) - ((data[0] & 2) << 7)); + break; + case 5: /* Throttle, spinner, hat info->data */ + input_report_abs(dev, ABS_THROTTLE, (data[1] | ((data[0] & 1) << 7)) - ((data[0] & 2) << 7)); + input_report_abs(dev, ABS_HAT0X, (data[3] & 2 ? 1 : 0) - (data[3] & 1 ? 1 : 0)); + input_report_abs(dev, ABS_HAT0Y, (data[3] & 8 ? 1 : 0) - (data[3] & 4 ? 1 : 0)); + input_report_rel(dev, REL_DIAL, (data[2] | ((data[0] & 4) << 5)) - ((data[0] & 8) << 5)); + break; + } + input_sync(dev); +} + +/* + * warrior_interrupt() is called by the low level driver when characters + * are ready for us. We then buffer them for further processing, or call the + * packet processing routine. + */ + +static irqreturn_t warrior_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct warrior *warrior = serio_get_drvdata(serio); + + if (data & 0x80) { + if (warrior->idx) warrior_process_packet(warrior); + warrior->idx = 0; + warrior->len = warrior_lengths[(data >> 4) & 7]; + } + + if (warrior->idx < warrior->len) + warrior->data[warrior->idx++] = data; + + if (warrior->idx == warrior->len) { + if (warrior->idx) warrior_process_packet(warrior); + warrior->idx = 0; + warrior->len = 0; + } + return IRQ_HANDLED; +} + +/* + * warrior_disconnect() is the opposite of warrior_connect() + */ + +static void warrior_disconnect(struct serio *serio) +{ + struct warrior *warrior = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(warrior->dev); + kfree(warrior); +} + +/* + * warrior_connect() is the routine that is called when someone adds a + * new serio device. It looks for the Warrior, and if found, registers + * it as an input device. + */ + +static int warrior_connect(struct serio *serio, struct serio_driver *drv) +{ + struct warrior *warrior; + struct input_dev *input_dev; + int err = -ENOMEM; + + warrior = kzalloc(sizeof(struct warrior), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!warrior || !input_dev) + goto fail1; + + warrior->dev = input_dev; + snprintf(warrior->phys, sizeof(warrior->phys), "%s/input0", serio->phys); + + input_dev->name = "Logitech WingMan Warrior"; + input_dev->phys = warrior->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_WARRIOR; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) | + BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TRIGGER)] = BIT_MASK(BTN_TRIGGER) | + BIT_MASK(BTN_THUMB) | BIT_MASK(BTN_TOP) | BIT_MASK(BTN_TOP2); + input_dev->relbit[0] = BIT_MASK(REL_DIAL); + input_set_abs_params(input_dev, ABS_X, -64, 64, 0, 8); + input_set_abs_params(input_dev, ABS_Y, -64, 64, 0, 8); + input_set_abs_params(input_dev, ABS_THROTTLE, -112, 112, 0, 0); + input_set_abs_params(input_dev, ABS_HAT0X, -1, 1, 0, 0); + input_set_abs_params(input_dev, ABS_HAT0Y, -1, 1, 0, 0); + + serio_set_drvdata(serio, warrior); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(warrior->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(warrior); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id warrior_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_WARRIOR, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, warrior_serio_ids); + +static struct serio_driver warrior_drv = { + .driver = { + .name = "warrior", + }, + .description = DRIVER_DESC, + .id_table = warrior_serio_ids, + .interrupt = warrior_interrupt, + .connect = warrior_connect, + .disconnect = warrior_disconnect, +}; + +module_serio_driver(warrior_drv); diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c new file mode 100644 index 00000000..856c1b03 --- /dev/null +++ b/drivers/input/joystick/xpad.c @@ -0,0 +1,1085 @@ +/* + * X-Box gamepad driver + * + * Copyright (c) 2002 Marko Friedemann + * 2004 Oliver Schwartz , + * Steven Toth , + * Franz Lehner , + * Ivan Hawkes + * 2005 Dominic Cerquetti + * 2006 Adam Buchbinder + * 2007 Jan Kratochvil + * 2010 Christoph Fritz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * This driver is based on: + * - information from http://euc.jp/periphs/xbox-controller.ja.html + * - the iForce driver drivers/char/joystick/iforce.c + * - the skeleton-driver drivers/usb/usb-skeleton.c + * - Xbox 360 information http://www.free60.org/wiki/Gamepad + * + * Thanks to: + * - ITO Takayuki for providing essential xpad information on his website + * - Vojtech Pavlik - iforce driver / input subsystem + * - Greg Kroah-Hartman - usb-skeleton driver + * - XBOX Linux project - extra USB id's + * + * TODO: + * - fine tune axes (especially trigger axes) + * - fix "analog" buttons (reported as digital now) + * - get rumble working + * - need USB IDs for other dance pads + * + * History: + * + * 2002-06-27 - 0.0.1 : first version, just said "XBOX HID controller" + * + * 2002-07-02 - 0.0.2 : basic working version + * - all axes and 9 of the 10 buttons work (german InterAct device) + * - the black button does not work + * + * 2002-07-14 - 0.0.3 : rework by Vojtech Pavlik + * - indentation fixes + * - usb + input init sequence fixes + * + * 2002-07-16 - 0.0.4 : minor changes, merge with Vojtech's v0.0.3 + * - verified the lack of HID and report descriptors + * - verified that ALL buttons WORK + * - fixed d-pad to axes mapping + * + * 2002-07-17 - 0.0.5 : simplified d-pad handling + * + * 2004-10-02 - 0.0.6 : DDR pad support + * - borrowed from the XBOX linux kernel + * - USB id's for commonly used dance pads are present + * - dance pads will map D-PAD to buttons, not axes + * - pass the module paramater 'dpad_to_buttons' to force + * the D-PAD to map to buttons if your pad is not detected + * + * Later changes can be tracked in SCM. + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_AUTHOR "Marko Friedemann " +#define DRIVER_DESC "X-Box pad driver" + +#define XPAD_PKT_LEN 32 + +/* xbox d-pads should map to buttons, as is required for DDR pads + but we map them to axes when possible to simplify things */ +#define MAP_DPAD_TO_BUTTONS (1 << 0) +#define MAP_TRIGGERS_TO_BUTTONS (1 << 1) +#define MAP_STICKS_TO_NULL (1 << 2) +#define DANCEPAD_MAP_CONFIG (MAP_DPAD_TO_BUTTONS | \ + MAP_TRIGGERS_TO_BUTTONS | MAP_STICKS_TO_NULL) + +#define XTYPE_XBOX 0 +#define XTYPE_XBOX360 1 +#define XTYPE_XBOX360W 2 +#define XTYPE_UNKNOWN 3 + +static bool dpad_to_buttons; +module_param(dpad_to_buttons, bool, S_IRUGO); +MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads"); + +static bool triggers_to_buttons; +module_param(triggers_to_buttons, bool, S_IRUGO); +MODULE_PARM_DESC(triggers_to_buttons, "Map triggers to buttons rather than axes for unknown pads"); + +static bool sticks_to_null; +module_param(sticks_to_null, bool, S_IRUGO); +MODULE_PARM_DESC(sticks_to_null, "Do not map sticks at all for unknown pads"); + +static const struct xpad_device { + u16 idVendor; + u16 idProduct; + char *name; + u8 mapping; + u8 xtype; +} xpad_device[] = { + { 0x045e, 0x0202, "Microsoft X-Box pad v1 (US)", 0, XTYPE_XBOX }, + { 0x045e, 0x0285, "Microsoft X-Box pad (Japan)", 0, XTYPE_XBOX }, + { 0x045e, 0x0287, "Microsoft Xbox Controller S", 0, XTYPE_XBOX }, + { 0x045e, 0x0289, "Microsoft X-Box pad v2 (US)", 0, XTYPE_XBOX }, + { 0x045e, 0x028e, "Microsoft X-Box 360 pad", 0, XTYPE_XBOX360 }, + { 0x045e, 0x0291, "Xbox 360 Wireless Receiver (XBOX)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, + { 0x045e, 0x0719, "Xbox 360 Wireless Receiver", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360W }, + { 0x044f, 0x0f07, "Thrustmaster, Inc. Controller", 0, XTYPE_XBOX }, + { 0x046d, 0xc242, "Logitech Chillstream Controller", 0, XTYPE_XBOX360 }, + { 0x046d, 0xca84, "Logitech Xbox Cordless Controller", 0, XTYPE_XBOX }, + { 0x046d, 0xca88, "Logitech Compact Controller for Xbox", 0, XTYPE_XBOX }, + { 0x05fd, 0x1007, "Mad Catz Controller (unverified)", 0, XTYPE_XBOX }, + { 0x05fd, 0x107a, "InterAct 'PowerPad Pro' X-Box pad (Germany)", 0, XTYPE_XBOX }, + { 0x0738, 0x4516, "Mad Catz Control Pad", 0, XTYPE_XBOX }, + { 0x0738, 0x4522, "Mad Catz LumiCON", 0, XTYPE_XBOX }, + { 0x0738, 0x4526, "Mad Catz Control Pad Pro", 0, XTYPE_XBOX }, + { 0x0738, 0x4536, "Mad Catz MicroCON", 0, XTYPE_XBOX }, + { 0x0738, 0x4540, "Mad Catz Beat Pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x0738, 0x4556, "Mad Catz Lynx Wireless Controller", 0, XTYPE_XBOX }, + { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, + { 0x0738, 0x4728, "Mad Catz Street Fighter IV FightPad", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0738, 0x4738, "Mad Catz Wired Xbox 360 Controller (SFIV)", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x0738, 0xbeef, "Mad Catz JOYTECH NEO SE Advanced GamePad", XTYPE_XBOX360 }, + { 0x0c12, 0x8802, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, + { 0x0c12, 0x8809, "RedOctane Xbox Dance Pad", DANCEPAD_MAP_CONFIG, XTYPE_XBOX }, + { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", 0, XTYPE_XBOX }, + { 0x0c12, 0x8810, "Zeroplus Xbox Controller", 0, XTYPE_XBOX }, + { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", 0, XTYPE_XBOX }, + { 0x0d2f, 0x0002, "Andamiro Pump It Up pad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x0e4c, 0x1097, "Radica Gamester Controller", 0, XTYPE_XBOX }, + { 0x0e4c, 0x2390, "Radica Games Jtech Controller", 0, XTYPE_XBOX }, + { 0x0e6f, 0x0003, "Logic3 Freebird wireless Controller", 0, XTYPE_XBOX }, + { 0x0e6f, 0x0005, "Eclipse wireless Controller", 0, XTYPE_XBOX }, + { 0x0e6f, 0x0006, "Edge wireless Controller", 0, XTYPE_XBOX }, + { 0x0e6f, 0x0105, "HSM3 Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0e6f, 0x0201, "Pelican PL-3601 'TSZ' Wired Xbox 360 Controller", 0, XTYPE_XBOX360 }, + { 0x0e6f, 0x0213, "Afterglow Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, + { 0x0e8f, 0x0201, "SmartJoy Frag Xpad/PS2 adaptor", 0, XTYPE_XBOX }, + { 0x0f0d, 0x000d, "Hori Fighting Stick EX2", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0f0d, 0x0016, "Hori Real Arcade Pro.EX", MAP_TRIGGERS_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x0f30, 0x0202, "Joytech Advanced Controller", 0, XTYPE_XBOX }, + { 0x0f30, 0x8888, "BigBen XBMiniPad Controller", 0, XTYPE_XBOX }, + { 0x102c, 0xff0c, "Joytech Wireless Advanced Controller", 0, XTYPE_XBOX }, + { 0x12ab, 0x0004, "Honey Bee Xbox360 dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x12ab, 0x8809, "Xbox DDR dancepad", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x1430, 0x4748, "RedOctane Guitar Hero X-plorer", 0, XTYPE_XBOX360 }, + { 0x1430, 0x8888, "TX6500+ Dance Pad (first generation)", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, + { 0x146b, 0x0601, "BigBen Interactive XBOX 360 Controller", 0, XTYPE_XBOX360 }, + { 0x1689, 0xfd00, "Razer Onza Tournament Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x1689, 0xfd01, "Razer Onza Classic Edition", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x1bad, 0x0002, "Harmonix Rock Band Guitar", 0, XTYPE_XBOX360 }, + { 0x1bad, 0x0003, "Harmonix Rock Band Drumkit", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX360 }, + { 0x1bad, 0xf016, "Mad Catz Xbox 360 Controller", 0, XTYPE_XBOX360 }, + { 0x1bad, 0xf028, "Street Fighter IV FightPad", 0, XTYPE_XBOX360 }, + { 0x1bad, 0xf901, "Gamestop Xbox 360 Controller", 0, XTYPE_XBOX360 }, + { 0x1bad, 0xf903, "Tron Xbox 360 controller", 0, XTYPE_XBOX360 }, + { 0x24c6, 0x5300, "PowerA MINI PROEX Controller", 0, XTYPE_XBOX360 }, + { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, + { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } +}; + +/* buttons shared with xbox and xbox360 */ +static const signed short xpad_common_btn[] = { + BTN_A, BTN_B, BTN_X, BTN_Y, /* "analog" buttons */ + BTN_START, BTN_SELECT, BTN_THUMBL, BTN_THUMBR, /* start/back/sticks */ + -1 /* terminating entry */ +}; + +/* original xbox controllers only */ +static const signed short xpad_btn[] = { + BTN_C, BTN_Z, /* "analog" buttons */ + -1 /* terminating entry */ +}; + +/* used when dpad is mapped to buttons */ +static const signed short xpad_btn_pad[] = { + BTN_TRIGGER_HAPPY1, BTN_TRIGGER_HAPPY2, /* d-pad left, right */ + BTN_TRIGGER_HAPPY3, BTN_TRIGGER_HAPPY4, /* d-pad up, down */ + -1 /* terminating entry */ +}; + +/* used when triggers are mapped to buttons */ +static const signed short xpad_btn_triggers[] = { + BTN_TL2, BTN_TR2, /* triggers left/right */ + -1 +}; + + +static const signed short xpad360_btn[] = { /* buttons for x360 controller */ + BTN_TL, BTN_TR, /* Button LB/RB */ + BTN_MODE, /* The big X button */ + -1 +}; + +static const signed short xpad_abs[] = { + ABS_X, ABS_Y, /* left stick */ + ABS_RX, ABS_RY, /* right stick */ + -1 /* terminating entry */ +}; + +/* used when dpad is mapped to axes */ +static const signed short xpad_abs_pad[] = { + ABS_HAT0X, ABS_HAT0Y, /* d-pad axes */ + -1 /* terminating entry */ +}; + +/* used when triggers are mapped to axes */ +static const signed short xpad_abs_triggers[] = { + ABS_Z, ABS_RZ, /* triggers left/right */ + -1 +}; + +/* Xbox 360 has a vendor-specific class, so we cannot match it with only + * USB_INTERFACE_INFO (also specifically refused by USB subsystem), so we + * match against vendor id as well. Wired Xbox 360 devices have protocol 1, + * wireless controllers have protocol 129. */ +#define XPAD_XBOX360_VENDOR_PROTOCOL(vend,pr) \ + .match_flags = USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_INT_INFO, \ + .idVendor = (vend), \ + .bInterfaceClass = USB_CLASS_VENDOR_SPEC, \ + .bInterfaceSubClass = 93, \ + .bInterfaceProtocol = (pr) +#define XPAD_XBOX360_VENDOR(vend) \ + { XPAD_XBOX360_VENDOR_PROTOCOL(vend,1) }, \ + { XPAD_XBOX360_VENDOR_PROTOCOL(vend,129) } + +static struct usb_device_id xpad_table[] = { + { USB_INTERFACE_INFO('X', 'B', 0) }, /* X-Box USB-IF not approved class */ + XPAD_XBOX360_VENDOR(0x045e), /* Microsoft X-Box 360 controllers */ + XPAD_XBOX360_VENDOR(0x046d), /* Logitech X-Box 360 style controllers */ + XPAD_XBOX360_VENDOR(0x0738), /* Mad Catz X-Box 360 controllers */ + { USB_DEVICE(0x0738, 0x4540) }, /* Mad Catz Beat Pad */ + XPAD_XBOX360_VENDOR(0x0e6f), /* 0x0e6f X-Box 360 controllers */ + XPAD_XBOX360_VENDOR(0x12ab), /* X-Box 360 dance pads */ + XPAD_XBOX360_VENDOR(0x1430), /* RedOctane X-Box 360 controllers */ + XPAD_XBOX360_VENDOR(0x146b), /* BigBen Interactive Controllers */ + XPAD_XBOX360_VENDOR(0x1bad), /* Harminix Rock Band Guitar and Drums */ + XPAD_XBOX360_VENDOR(0x0f0d), /* Hori Controllers */ + XPAD_XBOX360_VENDOR(0x1689), /* Razer Onza */ + XPAD_XBOX360_VENDOR(0x24c6), /* PowerA Controllers */ + { } +}; + +MODULE_DEVICE_TABLE(usb, xpad_table); + +struct usb_xpad { + struct input_dev *dev; /* input device interface */ + struct usb_device *udev; /* usb device */ + struct usb_interface *intf; /* usb interface */ + + int pad_present; + + struct urb *irq_in; /* urb for interrupt in report */ + unsigned char *idata; /* input data */ + dma_addr_t idata_dma; + + struct urb *bulk_out; + unsigned char *bdata; + +#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) + struct urb *irq_out; /* urb for interrupt out report */ + unsigned char *odata; /* output data */ + dma_addr_t odata_dma; + struct mutex odata_mutex; +#endif + +#if defined(CONFIG_JOYSTICK_XPAD_LEDS) + struct xpad_led *led; +#endif + + char phys[64]; /* physical device path */ + + int mapping; /* map d-pad to buttons or to axes */ + int xtype; /* type of xbox device */ +}; + +/* + * xpad_process_packet + * + * Completes a request by converting the data into events for the + * input subsystem. + * + * The used report descriptor was taken from ITO Takayukis website: + * http://euc.jp/periphs/xbox-controller.ja.html + */ + +static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) +{ + struct input_dev *dev = xpad->dev; + + if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { + /* left stick */ + input_report_abs(dev, ABS_X, + (__s16) le16_to_cpup((__le16 *)(data + 12))); + input_report_abs(dev, ABS_Y, + ~(__s16) le16_to_cpup((__le16 *)(data + 14))); + + /* right stick */ + input_report_abs(dev, ABS_RX, + (__s16) le16_to_cpup((__le16 *)(data + 16))); + input_report_abs(dev, ABS_RY, + ~(__s16) le16_to_cpup((__le16 *)(data + 18))); + } + + /* triggers left/right */ + if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { + input_report_key(dev, BTN_TL2, data[10]); + input_report_key(dev, BTN_TR2, data[11]); + } else { + input_report_abs(dev, ABS_Z, data[10]); + input_report_abs(dev, ABS_RZ, data[11]); + } + + /* digital pad */ + if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { + /* dpad as buttons (left, right, up, down) */ + input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04); + input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08); + input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01); + input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02); + } else { + input_report_abs(dev, ABS_HAT0X, + !!(data[2] & 0x08) - !!(data[2] & 0x04)); + input_report_abs(dev, ABS_HAT0Y, + !!(data[2] & 0x02) - !!(data[2] & 0x01)); + } + + /* start/back buttons and stick press left/right */ + input_report_key(dev, BTN_START, data[2] & 0x10); + input_report_key(dev, BTN_SELECT, data[2] & 0x20); + input_report_key(dev, BTN_THUMBL, data[2] & 0x40); + input_report_key(dev, BTN_THUMBR, data[2] & 0x80); + + /* "analog" buttons A, B, X, Y */ + input_report_key(dev, BTN_A, data[4]); + input_report_key(dev, BTN_B, data[5]); + input_report_key(dev, BTN_X, data[6]); + input_report_key(dev, BTN_Y, data[7]); + + /* "analog" buttons black, white */ + input_report_key(dev, BTN_C, data[8]); + input_report_key(dev, BTN_Z, data[9]); + + input_sync(dev); +} + +/* + * xpad360_process_packet + * + * Completes a request by converting the data into events for the + * input subsystem. It is version for xbox 360 controller + * + * The used report descriptor was taken from: + * http://www.free60.org/wiki/Gamepad + */ + +static void xpad360_process_packet(struct usb_xpad *xpad, + u16 cmd, unsigned char *data) +{ + struct input_dev *dev = xpad->dev; + + /* digital pad */ + if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { + /* dpad as buttons (left, right, up, down) */ + input_report_key(dev, BTN_TRIGGER_HAPPY1, data[2] & 0x04); + input_report_key(dev, BTN_TRIGGER_HAPPY2, data[2] & 0x08); + input_report_key(dev, BTN_TRIGGER_HAPPY3, data[2] & 0x01); + input_report_key(dev, BTN_TRIGGER_HAPPY4, data[2] & 0x02); + } else { + input_report_abs(dev, ABS_HAT0X, + !!(data[2] & 0x08) - !!(data[2] & 0x04)); + input_report_abs(dev, ABS_HAT0Y, + !!(data[2] & 0x02) - !!(data[2] & 0x01)); + } + + /* start/back buttons */ + input_report_key(dev, BTN_START, data[2] & 0x10); + input_report_key(dev, BTN_SELECT, data[2] & 0x20); + + /* stick press left/right */ + input_report_key(dev, BTN_THUMBL, data[2] & 0x40); + input_report_key(dev, BTN_THUMBR, data[2] & 0x80); + + /* buttons A,B,X,Y,TL,TR and MODE */ + input_report_key(dev, BTN_A, data[3] & 0x10); + input_report_key(dev, BTN_B, data[3] & 0x20); + input_report_key(dev, BTN_X, data[3] & 0x40); + input_report_key(dev, BTN_Y, data[3] & 0x80); + input_report_key(dev, BTN_TL, data[3] & 0x01); + input_report_key(dev, BTN_TR, data[3] & 0x02); + input_report_key(dev, BTN_MODE, data[3] & 0x04); + + if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { + /* left stick */ + input_report_abs(dev, ABS_X, + (__s16) le16_to_cpup((__le16 *)(data + 6))); + input_report_abs(dev, ABS_Y, + ~(__s16) le16_to_cpup((__le16 *)(data + 8))); + + /* right stick */ + input_report_abs(dev, ABS_RX, + (__s16) le16_to_cpup((__le16 *)(data + 10))); + input_report_abs(dev, ABS_RY, + ~(__s16) le16_to_cpup((__le16 *)(data + 12))); + } + + /* triggers left/right */ + if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { + input_report_key(dev, BTN_TL2, data[4]); + input_report_key(dev, BTN_TR2, data[5]); + } else { + input_report_abs(dev, ABS_Z, data[4]); + input_report_abs(dev, ABS_RZ, data[5]); + } + + input_sync(dev); +} + +/* + * xpad360w_process_packet + * + * Completes a request by converting the data into events for the + * input subsystem. It is version for xbox 360 wireless controller. + * + * Byte.Bit + * 00.1 - Status change: The controller or headset has connected/disconnected + * Bits 01.7 and 01.6 are valid + * 01.7 - Controller present + * 01.6 - Headset present + * 01.1 - Pad state (Bytes 4+) valid + * + */ + +static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) +{ + /* Presence change */ + if (data[0] & 0x08) { + if (data[1] & 0x80) { + xpad->pad_present = 1; + usb_submit_urb(xpad->bulk_out, GFP_ATOMIC); + } else + xpad->pad_present = 0; + } + + /* Valid pad data */ + if (!(data[1] & 0x1)) + return; + + xpad360_process_packet(xpad, cmd, &data[4]); +} + +static void xpad_irq_in(struct urb *urb) +{ + struct usb_xpad *xpad = urb->context; + struct device *dev = &xpad->intf->dev; + int retval, status; + + status = urb->status; + + switch (status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, status); + return; + default: + dev_dbg(dev, "%s - nonzero urb status received: %d\n", + __func__, status); + goto exit; + } + + switch (xpad->xtype) { + case XTYPE_XBOX360: + xpad360_process_packet(xpad, 0, xpad->idata); + break; + case XTYPE_XBOX360W: + xpad360w_process_packet(xpad, 0, xpad->idata); + break; + default: + xpad_process_packet(xpad, 0, xpad->idata); + } + +exit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(dev, "%s - usb_submit_urb failed with result %d\n", + __func__, retval); +} + +static void xpad_bulk_out(struct urb *urb) +{ + struct usb_xpad *xpad = urb->context; + struct device *dev = &xpad->intf->dev; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + break; + default: + dev_dbg(dev, "%s - nonzero urb status received: %d\n", + __func__, urb->status); + } +} + +#if defined(CONFIG_JOYSTICK_XPAD_FF) || defined(CONFIG_JOYSTICK_XPAD_LEDS) +static void xpad_irq_out(struct urb *urb) +{ + struct usb_xpad *xpad = urb->context; + struct device *dev = &xpad->intf->dev; + int retval, status; + + status = urb->status; + + switch (status) { + case 0: + /* success */ + return; + + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, status); + return; + + default: + dev_dbg(dev, "%s - nonzero urb status received: %d\n", + __func__, status); + goto exit; + } + +exit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(dev, "%s - usb_submit_urb failed with result %d\n", + __func__, retval); +} + +static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) +{ + struct usb_endpoint_descriptor *ep_irq_out; + int error; + + if (xpad->xtype == XTYPE_UNKNOWN) + return 0; + + xpad->odata = usb_alloc_coherent(xpad->udev, XPAD_PKT_LEN, + GFP_KERNEL, &xpad->odata_dma); + if (!xpad->odata) { + error = -ENOMEM; + goto fail1; + } + + mutex_init(&xpad->odata_mutex); + + xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL); + if (!xpad->irq_out) { + error = -ENOMEM; + goto fail2; + } + + ep_irq_out = &intf->cur_altsetting->endpoint[1].desc; + usb_fill_int_urb(xpad->irq_out, xpad->udev, + usb_sndintpipe(xpad->udev, ep_irq_out->bEndpointAddress), + xpad->odata, XPAD_PKT_LEN, + xpad_irq_out, xpad, ep_irq_out->bInterval); + xpad->irq_out->transfer_dma = xpad->odata_dma; + xpad->irq_out->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + return 0; + + fail2: usb_free_coherent(xpad->udev, XPAD_PKT_LEN, xpad->odata, xpad->odata_dma); + fail1: return error; +} + +static void xpad_stop_output(struct usb_xpad *xpad) +{ + if (xpad->xtype != XTYPE_UNKNOWN) + usb_kill_urb(xpad->irq_out); +} + +static void xpad_deinit_output(struct usb_xpad *xpad) +{ + if (xpad->xtype != XTYPE_UNKNOWN) { + usb_free_urb(xpad->irq_out); + usb_free_coherent(xpad->udev, XPAD_PKT_LEN, + xpad->odata, xpad->odata_dma); + } +} +#else +static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad) { return 0; } +static void xpad_deinit_output(struct usb_xpad *xpad) {} +static void xpad_stop_output(struct usb_xpad *xpad) {} +#endif + +#ifdef CONFIG_JOYSTICK_XPAD_FF +static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect) +{ + struct usb_xpad *xpad = input_get_drvdata(dev); + + if (effect->type == FF_RUMBLE) { + __u16 strong = effect->u.rumble.strong_magnitude; + __u16 weak = effect->u.rumble.weak_magnitude; + + switch (xpad->xtype) { + + case XTYPE_XBOX: + xpad->odata[0] = 0x00; + xpad->odata[1] = 0x06; + xpad->odata[2] = 0x00; + xpad->odata[3] = strong / 256; /* left actuator */ + xpad->odata[4] = 0x00; + xpad->odata[5] = weak / 256; /* right actuator */ + xpad->irq_out->transfer_buffer_length = 6; + + return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); + + case XTYPE_XBOX360: + xpad->odata[0] = 0x00; + xpad->odata[1] = 0x08; + xpad->odata[2] = 0x00; + xpad->odata[3] = strong / 256; /* left actuator? */ + xpad->odata[4] = weak / 256; /* right actuator? */ + xpad->odata[5] = 0x00; + xpad->odata[6] = 0x00; + xpad->odata[7] = 0x00; + xpad->irq_out->transfer_buffer_length = 8; + + return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); + + case XTYPE_XBOX360W: + xpad->odata[0] = 0x00; + xpad->odata[1] = 0x01; + xpad->odata[2] = 0x0F; + xpad->odata[3] = 0xC0; + xpad->odata[4] = 0x00; + xpad->odata[5] = strong / 256; + xpad->odata[6] = weak / 256; + xpad->odata[7] = 0x00; + xpad->odata[8] = 0x00; + xpad->odata[9] = 0x00; + xpad->odata[10] = 0x00; + xpad->odata[11] = 0x00; + xpad->irq_out->transfer_buffer_length = 12; + + return usb_submit_urb(xpad->irq_out, GFP_ATOMIC); + + default: + dev_dbg(&xpad->dev->dev, + "%s - rumble command sent to unsupported xpad type: %d\n", + __func__, xpad->xtype); + return -1; + } + } + + return 0; +} + +static int xpad_init_ff(struct usb_xpad *xpad) +{ + if (xpad->xtype == XTYPE_UNKNOWN) + return 0; + + input_set_capability(xpad->dev, EV_FF, FF_RUMBLE); + + return input_ff_create_memless(xpad->dev, NULL, xpad_play_effect); +} + +#else +static int xpad_init_ff(struct usb_xpad *xpad) { return 0; } +#endif + +#if defined(CONFIG_JOYSTICK_XPAD_LEDS) +#include + +struct xpad_led { + char name[16]; + struct led_classdev led_cdev; + struct usb_xpad *xpad; +}; + +static void xpad_send_led_command(struct usb_xpad *xpad, int command) +{ + if (command >= 0 && command < 14) { + mutex_lock(&xpad->odata_mutex); + xpad->odata[0] = 0x01; + xpad->odata[1] = 0x03; + xpad->odata[2] = command; + xpad->irq_out->transfer_buffer_length = 3; + usb_submit_urb(xpad->irq_out, GFP_KERNEL); + mutex_unlock(&xpad->odata_mutex); + } +} + +static void xpad_led_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + struct xpad_led *xpad_led = container_of(led_cdev, + struct xpad_led, led_cdev); + + xpad_send_led_command(xpad_led->xpad, value); +} + +static int xpad_led_probe(struct usb_xpad *xpad) +{ + static atomic_t led_seq = ATOMIC_INIT(0); + long led_no; + struct xpad_led *led; + struct led_classdev *led_cdev; + int error; + + if (xpad->xtype != XTYPE_XBOX360) + return 0; + + xpad->led = led = kzalloc(sizeof(struct xpad_led), GFP_KERNEL); + if (!led) + return -ENOMEM; + + led_no = (long)atomic_inc_return(&led_seq) - 1; + + snprintf(led->name, sizeof(led->name), "xpad%ld", led_no); + led->xpad = xpad; + + led_cdev = &led->led_cdev; + led_cdev->name = led->name; + led_cdev->brightness_set = xpad_led_set; + + error = led_classdev_register(&xpad->udev->dev, led_cdev); + if (error) { + kfree(led); + xpad->led = NULL; + return error; + } + + /* + * Light up the segment corresponding to controller number + */ + xpad_send_led_command(xpad, (led_no % 4) + 2); + + return 0; +} + +static void xpad_led_disconnect(struct usb_xpad *xpad) +{ + struct xpad_led *xpad_led = xpad->led; + + if (xpad_led) { + led_classdev_unregister(&xpad_led->led_cdev); + kfree(xpad_led); + } +} +#else +static int xpad_led_probe(struct usb_xpad *xpad) { return 0; } +static void xpad_led_disconnect(struct usb_xpad *xpad) { } +#endif + + +static int xpad_open(struct input_dev *dev) +{ + struct usb_xpad *xpad = input_get_drvdata(dev); + + /* URB was submitted in probe */ + if (xpad->xtype == XTYPE_XBOX360W) + return 0; + + xpad->irq_in->dev = xpad->udev; + if (usb_submit_urb(xpad->irq_in, GFP_KERNEL)) + return -EIO; + + return 0; +} + +static void xpad_close(struct input_dev *dev) +{ + struct usb_xpad *xpad = input_get_drvdata(dev); + + if (xpad->xtype != XTYPE_XBOX360W) + usb_kill_urb(xpad->irq_in); + + xpad_stop_output(xpad); +} + +static void xpad_set_up_abs(struct input_dev *input_dev, signed short abs) +{ + set_bit(abs, input_dev->absbit); + + switch (abs) { + case ABS_X: + case ABS_Y: + case ABS_RX: + case ABS_RY: /* the two sticks */ + input_set_abs_params(input_dev, abs, -32768, 32767, 16, 128); + break; + case ABS_Z: + case ABS_RZ: /* the triggers (if mapped to axes) */ + input_set_abs_params(input_dev, abs, 0, 255, 0, 0); + break; + case ABS_HAT0X: + case ABS_HAT0Y: /* the d-pad (only if dpad is mapped to axes */ + input_set_abs_params(input_dev, abs, -1, 1, 0, 0); + break; + } +} + +static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(intf); + struct usb_xpad *xpad; + struct input_dev *input_dev; + struct usb_endpoint_descriptor *ep_irq_in; + int i, error; + + for (i = 0; xpad_device[i].idVendor; i++) { + if ((le16_to_cpu(udev->descriptor.idVendor) == xpad_device[i].idVendor) && + (le16_to_cpu(udev->descriptor.idProduct) == xpad_device[i].idProduct)) + break; + } + + xpad = kzalloc(sizeof(struct usb_xpad), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!xpad || !input_dev) { + error = -ENOMEM; + goto fail1; + } + + xpad->idata = usb_alloc_coherent(udev, XPAD_PKT_LEN, + GFP_KERNEL, &xpad->idata_dma); + if (!xpad->idata) { + error = -ENOMEM; + goto fail1; + } + + xpad->irq_in = usb_alloc_urb(0, GFP_KERNEL); + if (!xpad->irq_in) { + error = -ENOMEM; + goto fail2; + } + + xpad->udev = udev; + xpad->intf = intf; + xpad->mapping = xpad_device[i].mapping; + xpad->xtype = xpad_device[i].xtype; + + if (xpad->xtype == XTYPE_UNKNOWN) { + if (intf->cur_altsetting->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) { + if (intf->cur_altsetting->desc.bInterfaceProtocol == 129) + xpad->xtype = XTYPE_XBOX360W; + else + xpad->xtype = XTYPE_XBOX360; + } else + xpad->xtype = XTYPE_XBOX; + + if (dpad_to_buttons) + xpad->mapping |= MAP_DPAD_TO_BUTTONS; + if (triggers_to_buttons) + xpad->mapping |= MAP_TRIGGERS_TO_BUTTONS; + if (sticks_to_null) + xpad->mapping |= MAP_STICKS_TO_NULL; + } + + xpad->dev = input_dev; + usb_make_path(udev, xpad->phys, sizeof(xpad->phys)); + strlcat(xpad->phys, "/input0", sizeof(xpad->phys)); + + input_dev->name = xpad_device[i].name; + input_dev->phys = xpad->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, xpad); + + input_dev->open = xpad_open; + input_dev->close = xpad_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY); + + if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { + input_dev->evbit[0] |= BIT_MASK(EV_ABS); + /* set up axes */ + for (i = 0; xpad_abs[i] >= 0; i++) + xpad_set_up_abs(input_dev, xpad_abs[i]); + } + + /* set up standard buttons */ + for (i = 0; xpad_common_btn[i] >= 0; i++) + __set_bit(xpad_common_btn[i], input_dev->keybit); + + /* set up model-specific ones */ + if (xpad->xtype == XTYPE_XBOX360 || xpad->xtype == XTYPE_XBOX360W) { + for (i = 0; xpad360_btn[i] >= 0; i++) + __set_bit(xpad360_btn[i], input_dev->keybit); + } else { + for (i = 0; xpad_btn[i] >= 0; i++) + __set_bit(xpad_btn[i], input_dev->keybit); + } + + if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { + for (i = 0; xpad_btn_pad[i] >= 0; i++) + __set_bit(xpad_btn_pad[i], input_dev->keybit); + } else { + for (i = 0; xpad_abs_pad[i] >= 0; i++) + xpad_set_up_abs(input_dev, xpad_abs_pad[i]); + } + + if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { + for (i = 0; xpad_btn_triggers[i] >= 0; i++) + __set_bit(xpad_btn_triggers[i], input_dev->keybit); + } else { + for (i = 0; xpad_abs_triggers[i] >= 0; i++) + xpad_set_up_abs(input_dev, xpad_abs_triggers[i]); + } + + error = xpad_init_output(intf, xpad); + if (error) + goto fail3; + + error = xpad_init_ff(xpad); + if (error) + goto fail4; + + error = xpad_led_probe(xpad); + if (error) + goto fail5; + + ep_irq_in = &intf->cur_altsetting->endpoint[0].desc; + usb_fill_int_urb(xpad->irq_in, udev, + usb_rcvintpipe(udev, ep_irq_in->bEndpointAddress), + xpad->idata, XPAD_PKT_LEN, xpad_irq_in, + xpad, ep_irq_in->bInterval); + xpad->irq_in->transfer_dma = xpad->idata_dma; + xpad->irq_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + error = input_register_device(xpad->dev); + if (error) + goto fail6; + + usb_set_intfdata(intf, xpad); + + if (xpad->xtype == XTYPE_XBOX360W) { + /* + * Setup the message to set the LEDs on the + * controller when it shows up + */ + xpad->bulk_out = usb_alloc_urb(0, GFP_KERNEL); + if (!xpad->bulk_out) { + error = -ENOMEM; + goto fail7; + } + + xpad->bdata = kzalloc(XPAD_PKT_LEN, GFP_KERNEL); + if (!xpad->bdata) { + error = -ENOMEM; + goto fail8; + } + + xpad->bdata[2] = 0x08; + switch (intf->cur_altsetting->desc.bInterfaceNumber) { + case 0: + xpad->bdata[3] = 0x42; + break; + case 2: + xpad->bdata[3] = 0x43; + break; + case 4: + xpad->bdata[3] = 0x44; + break; + case 6: + xpad->bdata[3] = 0x45; + } + + ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; + if (usb_endpoint_is_bulk_out(ep_irq_in)) { + usb_fill_bulk_urb(xpad->bulk_out, udev, + usb_sndbulkpipe(udev, + ep_irq_in->bEndpointAddress), + xpad->bdata, XPAD_PKT_LEN, + xpad_bulk_out, xpad); + } else { + usb_fill_int_urb(xpad->bulk_out, udev, + usb_sndintpipe(udev, + ep_irq_in->bEndpointAddress), + xpad->bdata, XPAD_PKT_LEN, + xpad_bulk_out, xpad, 0); + } + + /* + * Submit the int URB immediately rather than waiting for open + * because we get status messages from the device whether + * or not any controllers are attached. In fact, it's + * exactly the message that a controller has arrived that + * we're waiting for. + */ + xpad->irq_in->dev = xpad->udev; + error = usb_submit_urb(xpad->irq_in, GFP_KERNEL); + if (error) + goto fail9; + } + + return 0; + + fail9: kfree(xpad->bdata); + fail8: usb_free_urb(xpad->bulk_out); + fail7: input_unregister_device(input_dev); + input_dev = NULL; + fail6: xpad_led_disconnect(xpad); + fail5: if (input_dev) + input_ff_destroy(input_dev); + fail4: xpad_deinit_output(xpad); + fail3: usb_free_urb(xpad->irq_in); + fail2: usb_free_coherent(udev, XPAD_PKT_LEN, xpad->idata, xpad->idata_dma); + fail1: input_free_device(input_dev); + kfree(xpad); + return error; + +} + +static void xpad_disconnect(struct usb_interface *intf) +{ + struct usb_xpad *xpad = usb_get_intfdata (intf); + + xpad_led_disconnect(xpad); + input_unregister_device(xpad->dev); + xpad_deinit_output(xpad); + + if (xpad->xtype == XTYPE_XBOX360W) { + usb_kill_urb(xpad->bulk_out); + usb_free_urb(xpad->bulk_out); + usb_kill_urb(xpad->irq_in); + } + + usb_free_urb(xpad->irq_in); + usb_free_coherent(xpad->udev, XPAD_PKT_LEN, + xpad->idata, xpad->idata_dma); + + kfree(xpad->bdata); + kfree(xpad); + + usb_set_intfdata(intf, NULL); +} + +static struct usb_driver xpad_driver = { + .name = "xpad", + .probe = xpad_probe, + .disconnect = xpad_disconnect, + .id_table = xpad_table, +}; + +module_usb_driver(xpad_driver); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/joystick/zhenhua.c b/drivers/input/joystick/zhenhua.c new file mode 100644 index 00000000..c4de4388 --- /dev/null +++ b/drivers/input/joystick/zhenhua.c @@ -0,0 +1,228 @@ +/* + * derived from "twidjoy.c" + * + * Copyright (c) 2008 Martin Kebert + * Copyright (c) 2001 Arndt Schoenewald + * Copyright (c) 2000-2001 Vojtech Pavlik + * Copyright (c) 2000 Mark Fletcher + * + */ + +/* + * Driver to use 4CH RC transmitter using Zhen Hua 5-byte protocol (Walkera Lama, + * EasyCopter etc.) as a joystick under Linux. + * + * RC transmitters using Zhen Hua 5-byte protocol are cheap four channels + * transmitters for control a RC planes or RC helicopters with possibility to + * connect on a serial port. + * Data coming from transmitter is in this order: + * 1. byte = synchronisation byte + * 2. byte = X axis + * 3. byte = Y axis + * 4. byte = RZ axis + * 5. byte = Z axis + * (and this is repeated) + * + * For questions or feedback regarding this driver module please contact: + * Martin Kebert - but I am not a C-programmer nor kernel + * coder :-( + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "RC transmitter with 5-byte Zhen Hua protocol joystick driver" + +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Constants. + */ + +#define ZHENHUA_MAX_LENGTH 5 + +/* + * Zhen Hua data. + */ + +struct zhenhua { + struct input_dev *dev; + int idx; + unsigned char data[ZHENHUA_MAX_LENGTH]; + char phys[32]; +}; + + +/* bits in all incoming bytes needs to be "reversed" */ +static int zhenhua_bitreverse(int x) +{ + x = ((x & 0xaa) >> 1) | ((x & 0x55) << 1); + x = ((x & 0xcc) >> 2) | ((x & 0x33) << 2); + x = ((x & 0xf0) >> 4) | ((x & 0x0f) << 4); + return x; +} + +/* + * zhenhua_process_packet() decodes packets the driver receives from the + * RC transmitter. It updates the data accordingly. + */ + +static void zhenhua_process_packet(struct zhenhua *zhenhua) +{ + struct input_dev *dev = zhenhua->dev; + unsigned char *data = zhenhua->data; + + input_report_abs(dev, ABS_Y, data[1]); + input_report_abs(dev, ABS_X, data[2]); + input_report_abs(dev, ABS_RZ, data[3]); + input_report_abs(dev, ABS_Z, data[4]); + + input_sync(dev); +} + +/* + * zhenhua_interrupt() is called by the low level driver when characters + * are ready for us. We then buffer them for further processing, or call the + * packet processing routine. + */ + +static irqreturn_t zhenhua_interrupt(struct serio *serio, unsigned char data, unsigned int flags) +{ + struct zhenhua *zhenhua = serio_get_drvdata(serio); + + /* All Zhen Hua packets are 5 bytes. The fact that the first byte + * is allways 0xf7 and all others are in range 0x32 - 0xc8 (50-200) + * can be used to check and regain sync. */ + + if (data == 0xef) + zhenhua->idx = 0; /* this byte starts a new packet */ + else if (zhenhua->idx == 0) + return IRQ_HANDLED; /* wrong MSB -- ignore this byte */ + + if (zhenhua->idx < ZHENHUA_MAX_LENGTH) + zhenhua->data[zhenhua->idx++] = zhenhua_bitreverse(data); + + if (zhenhua->idx == ZHENHUA_MAX_LENGTH) { + zhenhua_process_packet(zhenhua); + zhenhua->idx = 0; + } + + return IRQ_HANDLED; +} + +/* + * zhenhua_disconnect() is the opposite of zhenhua_connect() + */ + +static void zhenhua_disconnect(struct serio *serio) +{ + struct zhenhua *zhenhua = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(zhenhua->dev); + kfree(zhenhua); +} + +/* + * zhenhua_connect() is the routine that is called when someone adds a + * new serio device. It looks for the Twiddler, and if found, registers + * it as an input device. + */ + +static int zhenhua_connect(struct serio *serio, struct serio_driver *drv) +{ + struct zhenhua *zhenhua; + struct input_dev *input_dev; + int err = -ENOMEM; + + zhenhua = kzalloc(sizeof(struct zhenhua), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!zhenhua || !input_dev) + goto fail1; + + zhenhua->dev = input_dev; + snprintf(zhenhua->phys, sizeof(zhenhua->phys), "%s/input0", serio->phys); + + input_dev->name = "Zhen Hua 5-byte device"; + input_dev->phys = zhenhua->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_ZHENHUA; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT(EV_ABS); + input_set_abs_params(input_dev, ABS_X, 50, 200, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 50, 200, 0, 0); + input_set_abs_params(input_dev, ABS_Z, 50, 200, 0, 0); + input_set_abs_params(input_dev, ABS_RZ, 50, 200, 0, 0); + + serio_set_drvdata(serio, zhenhua); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(zhenhua->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(zhenhua); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id zhenhua_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_ZHENHUA, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, zhenhua_serio_ids); + +static struct serio_driver zhenhua_drv = { + .driver = { + .name = "zhenhua", + }, + .description = DRIVER_DESC, + .id_table = zhenhua_serio_ids, + .interrupt = zhenhua_interrupt, + .connect = zhenhua_connect, + .disconnect = zhenhua_disconnect, +}; + +module_serio_driver(zhenhua_drv); diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig new file mode 100644 index 00000000..b48677f8 --- /dev/null +++ b/drivers/input/keyboard/Kconfig @@ -0,0 +1,677 @@ +# +# Input core configuration +# +menuconfig INPUT_KEYBOARD + bool "Keyboards" + default y + help + Say Y here, and a list of supported keyboards will be displayed. + This option doesn't affect the kernel. + + If unsure, say Y. + +if INPUT_KEYBOARD + +config KEYBOARD_ADP5520 + tristate "Keypad Support for ADP5520 PMIC" + depends on PMIC_ADP5520 + help + This option enables support for the keypad scan matrix + on Analog Devices ADP5520 PMICs. + + To compile this driver as a module, choose M here: the module will + be called adp5520-keys. + +config KEYBOARD_ADP5588 + tristate "ADP5588/87 I2C QWERTY Keypad and IO Expander" + depends on I2C + help + Say Y here if you want to use a ADP5588/87 attached to your + system I2C bus. + + To compile this driver as a module, choose M here: the + module will be called adp5588-keys. + +config KEYBOARD_ADP5589 + tristate "ADP5585/ADP5589 I2C QWERTY Keypad and IO Expander" + depends on I2C + help + Say Y here if you want to use a ADP5585/ADP5589 attached to your + system I2C bus. + + To compile this driver as a module, choose M here: the + module will be called adp5589-keys. + +config KEYBOARD_AMIGA + tristate "Amiga keyboard" + depends on AMIGA + help + Say Y here if you are running Linux on any AMIGA and have a keyboard + attached. + + To compile this driver as a module, choose M here: the + module will be called amikbd. + +config ATARI_KBD_CORE + bool + +config KEYBOARD_ATARI + tristate "Atari keyboard" + depends on ATARI + select ATARI_KBD_CORE + help + Say Y here if you are running Linux on any Atari and have a keyboard + attached. + + To compile this driver as a module, choose M here: the + module will be called atakbd. + +config KEYBOARD_ATKBD + tristate "AT keyboard" + default y + select SERIO + select SERIO_LIBPS2 + select SERIO_I8042 if X86 + select SERIO_GSCPS2 if GSC + help + Say Y here if you want to use a standard AT or PS/2 keyboard. Usually + you'll need this, unless you have a different type keyboard (USB, ADB + or other). This also works for AT and PS/2 keyboards connected over a + PS/2 to serial converter. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called atkbd. + +config KEYBOARD_ATKBD_HP_KEYCODES + bool "Use HP keyboard scancodes" + depends on PARISC && KEYBOARD_ATKBD + default y + help + Say Y here if you have a PA-RISC machine and want to use an AT or + PS/2 keyboard, and your keyboard uses keycodes that are specific to + PA-RISC keyboards. + + Say N if you use a standard keyboard. + +config KEYBOARD_ATKBD_RDI_KEYCODES + bool "Use PrecisionBook keyboard scancodes" + depends on KEYBOARD_ATKBD_HP_KEYCODES + default n + help + If you have an RDI PrecisionBook, say Y here if you want to use its + built-in keyboard (as opposed to an external keyboard). + + The PrecisionBook has five keys that conflict with those used by most + AT and PS/2 keyboards. These are as follows: + + PrecisionBook Standard AT or PS/2 + + F1 F12 + Left Ctrl Left Alt + Caps Lock Left Ctrl + Right Ctrl Caps Lock + Left 102nd key (the key to the right of Left Shift) + + If you say N here, and use the PrecisionBook keyboard, then each key + in the left-hand column will be interpreted as the corresponding key + in the right-hand column. + + If you say Y here, and use an external keyboard, then each key in the + right-hand column will be interpreted as the key shown in the + left-hand column. + +config KEYBOARD_QT1070 + tristate "Atmel AT42QT1070 Touch Sensor Chip" + depends on I2C + help + Say Y here if you want to use Atmel AT42QT1070 QTouch + Sensor chip as input device. + + To compile this driver as a module, choose M here: + the module will be called qt1070 + +config KEYBOARD_QT2160 + tristate "Atmel AT42QT2160 Touch Sensor Chip" + depends on I2C + help + If you say yes here you get support for Atmel AT42QT2160 Touch + Sensor chip as a keyboard input. + + This driver can also be built as a module. If so, the module + will be called qt2160. + +config KEYBOARD_BFIN + tristate "Blackfin BF54x keypad support" + depends on (BF54x && !BF544) + help + Say Y here if you want to use the BF54x keypad. + + To compile this driver as a module, choose M here: the + module will be called bf54x-keys. + +config KEYBOARD_LKKBD + tristate "DECstation/VAXstation LK201/LK401 keyboard" + select SERIO + help + Say Y here if you want to use a LK201 or LK401 style serial + keyboard. This keyboard is also useable on PCs if you attach + it with the inputattach program. The connector pinout is + described within lkkbd.c. + + To compile this driver as a module, choose M here: the + module will be called lkkbd. + +config KEYBOARD_EP93XX + tristate "EP93xx Matrix Keypad support" + depends on ARCH_EP93XX + select INPUT_MATRIXKMAP + help + Say Y here to enable the matrix keypad on the Cirrus EP93XX. + + To compile this driver as a module, choose M here: the + module will be called ep93xx_keypad. + +config KEYBOARD_GPIO + tristate "GPIO Buttons" + depends on GPIOLIB + help + This driver implements support for buttons connected + to GPIO pins of various CPUs (and some other chips). + + Say Y here if your device has buttons connected + directly to such GPIO pins. Your board-specific + setup logic must also provide a platform device, + with configuration data saying which GPIOs are used. + + To compile this driver as a module, choose M here: the + module will be called gpio_keys. + +config KEYBOARD_GPIO_SPRD + tristate "GPIO Buttons SPREADTRUM" + depends on GPIOLIB + help + This driver implements support for buttons connected + to GPIO pins of various CPUs (and some other chips). + + Say Y here if your device has buttons connected + directly to such GPIO pins. Your board-specific + setup logic must also provide a platform device, + with configuration data saying which GPIOs are used. + + To compile this driver as a module, choose M here: the + module will be called gpio_keys_sprd. + +config KEYBOARD_GPIO_POLLED + tristate "Polled GPIO buttons" + depends on GPIOLIB + select INPUT_POLLDEV + help + This driver implements support for buttons connected + to GPIO pins that are not capable of generating interrupts. + + Say Y here if your device has buttons connected + directly to such GPIO pins. Your board-specific + setup logic must also provide a platform device, + with configuration data saying which GPIOs are used. + + To compile this driver as a module, choose M here: the + module will be called gpio_keys_polled. + +config KEYBOARD_TCA6416 + tristate "TCA6416/TCA6408A Keypad Support" + depends on I2C + help + This driver implements basic keypad functionality + for keys connected through TCA6416/TCA6408A IO expanders. + + Say Y here if your device has keys connected to + TCA6416/TCA6408A IO expander. Your board-specific setup logic + must also provide pin-mask details(of which TCA6416 pins + are used for keypad). + + If enabled the entire TCA6416 device will be managed through + this driver. + + To compile this driver as a module, choose M here: the + module will be called tca6416_keypad. + +config KEYBOARD_TCA8418 + tristate "TCA8418 Keypad Support" + depends on I2C && GENERIC_HARDIRQS + select INPUT_MATRIXKMAP + help + This driver implements basic keypad functionality + for keys connected through TCA8418 keypad decoder. + + Say Y here if your device has keys connected to + TCA8418 keypad decoder. + + If enabled the complete TCA8418 device will be managed through + this driver. + + To compile this driver as a module, choose M here: the + module will be called tca8418_keypad. + +config KEYBOARD_MATRIX + tristate "GPIO driven matrix keypad support" + depends on GPIOLIB + select INPUT_MATRIXKMAP + help + Enable support for GPIO driven matrix keypad. + + To compile this driver as a module, choose M here: the + module will be called matrix_keypad. + +config KEYBOARD_HIL_OLD + tristate "HP HIL keyboard support (simple driver)" + depends on GSC || HP300 + default y + help + The "Human Interface Loop" is a older, 8-channel USB-like + controller used in several Hewlett Packard models. This driver + was adapted from the one written for m68k/hp300, and implements + support for a keyboard attached to the HIL port, but not for + any other types of HIL input devices like mice or tablets. + However, it has been thoroughly tested and is stable. + + If you want full HIL support including support for multiple + keyboards, mice, and tablets, you have to enable the + "HP System Device Controller i8042 Support" in the input/serio + submenu. + +config KEYBOARD_HIL + tristate "HP HIL keyboard/pointer support" + depends on GSC || HP300 + default y + select HP_SDC + select HIL_MLC + select SERIO + help + The "Human Interface Loop" is a older, 8-channel USB-like + controller used in several Hewlett Packard models. + This driver implements support for HIL-keyboards and pointing + devices (mice, tablets, touchscreens) attached + to your machine, so normally you should say Y here. + +config KEYBOARD_HP6XX + tristate "HP Jornada 6xx keyboard" + depends on SH_HP6XX + select INPUT_POLLDEV + help + Say Y here if you have a HP Jornada 620/660/680/690 and want to + support the built-in keyboard. + + To compile this driver as a module, choose M here: the + module will be called jornada680_kbd. + +config KEYBOARD_HP7XX + tristate "HP Jornada 7xx keyboard" + depends on SA1100_JORNADA720_SSP && SA1100_SSP + help + Say Y here if you have a HP Jornada 710/720/728 and want to + support the built-in keyboard. + + To compile this driver as a module, choose M here: the + module will be called jornada720_kbd. + +config KEYBOARD_LM8323 + tristate "LM8323 keypad chip" + depends on I2C && GENERIC_HARDIRQS + depends on LEDS_CLASS + help + If you say yes here you get support for the National Semiconductor + LM8323 keypad controller. + + To compile this driver as a module, choose M here: the + module will be called lm8323. + +config KEYBOARD_LM8333 + tristate "LM8333 keypad chip" + depends on I2C + select INPUT_MATRIXKMAP + help + If you say yes here you get support for the National Semiconductor + LM8333 keypad controller. + + To compile this driver as a module, choose M here: the + module will be called lm8333. + +config KEYBOARD_LOCOMO + tristate "LoCoMo Keyboard Support" + depends on SHARP_LOCOMO + help + Say Y here if you are running Linux on a Sharp Zaurus Collie or Poodle based PDA + + To compile this driver as a module, choose M here: the + module will be called locomokbd. + +config KEYBOARD_LPC32XX + tristate "LPC32XX matrix key scanner support" + depends on ARCH_LPC32XX && OF + select INPUT_MATRIXKMAP + help + Say Y here if you want to use NXP LPC32XX SoC key scanner interface, + connected to a key matrix. + + To compile this driver as a module, choose M here: the + module will be called lpc32xx-keys. + +config KEYBOARD_MAPLE + tristate "Maple bus keyboard" + depends on SH_DREAMCAST && MAPLE + help + Say Y here if you have a Dreamcast console running Linux and have + a keyboard attached to its Maple bus. + + To compile this driver as a module, choose M here: the + module will be called maple_keyb. + +config KEYBOARD_MAX7359 + tristate "Maxim MAX7359 Key Switch Controller" + depends on I2C + help + If you say yes here you get support for the Maxim MAX7359 Key + Switch Controller chip. This providers microprocessors with + management of up to 64 key switches + + To compile this driver as a module, choose M here: the + module will be called max7359_keypad. + +config KEYBOARD_MCS + tristate "MELFAS MCS Touchkey" + depends on I2C + help + Say Y here if you have the MELFAS MCS5000/5080 touchkey controller + chip in your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mcs_touchkey. + +config KEYBOARD_MPR121 + tristate "Freescale MPR121 Touchkey" + depends on I2C + help + Say Y here if you have Freescale MPR121 touchkey controller + chip in your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mpr121_touchkey. + +config KEYBOARD_IMX + tristate "IMX keypad support" + depends on ARCH_MXC + select INPUT_MATRIXKMAP + help + Enable support for IMX keypad port. + + To compile this driver as a module, choose M here: the + module will be called imx_keypad. + +config KEYBOARD_NEWTON + tristate "Newton keyboard" + select SERIO + help + Say Y here if you have a Newton keyboard on a serial port. + + To compile this driver as a module, choose M here: the + module will be called newtonkbd. + +config KEYBOARD_NOMADIK + tristate "ST-Ericsson Nomadik SKE keyboard" + depends on (ARCH_NOMADIK || ARCH_U8500) + select INPUT_MATRIXKMAP + help + Say Y here if you want to use a keypad provided on the SKE controller + used on the Ux500 and Nomadik platforms + + To compile this driver as a module, choose M here: the + module will be called nmk-ske-keypad. + +config KEYBOARD_TEGRA + tristate "NVIDIA Tegra internal matrix keyboard controller support" + depends on ARCH_TEGRA && OF + select INPUT_MATRIXKMAP + help + Say Y here if you want to use a matrix keyboard connected directly + to the internal keyboard controller on Tegra SoCs. + + To compile this driver as a module, choose M here: the + module will be called tegra-kbc. + +config KEYBOARD_OPENCORES + tristate "OpenCores Keyboard Controller" + depends on HAS_IOMEM + help + Say Y here if you want to use the OpenCores Keyboard Controller + http://www.opencores.org/project,keyboardcontroller + + To compile this driver as a module, choose M here; the + module will be called opencores-kbd. + +config KEYBOARD_PXA27x + tristate "PXA27x/PXA3xx keypad support" + depends on PXA27x || PXA3xx || ARCH_MMP + help + Enable support for PXA27x/PXA3xx keypad controller. + + To compile this driver as a module, choose M here: the + module will be called pxa27x_keypad. + +config KEYBOARD_PXA930_ROTARY + tristate "PXA930/PXA935 Enhanced Rotary Controller Support" + depends on CPU_PXA930 || CPU_PXA935 + help + Enable support for PXA930/PXA935 Enhanced Rotary Controller. + + To compile this driver as a module, choose M here: the + module will be called pxa930_rotary. + +config KEYBOARD_PMIC8XXX + tristate "Qualcomm PMIC8XXX keypad support" + depends on MFD_PM8XXX + select INPUT_MATRIXKMAP + help + Say Y here if you want to enable the driver for the PMIC8XXX + keypad provided as a reference design from Qualcomm. This is intended + to support upto 18x8 matrix based keypad design. + + To compile this driver as a module, choose M here: the module will + be called pmic8xxx-keypad. + +config KEYBOARD_SAMSUNG + tristate "Samsung keypad support" + depends on HAVE_CLK + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the keypad on your Samsung mobile + device. + + To compile this driver as a module, choose M here: the + module will be called samsung-keypad. + +config KEYBOARD_GOLDFISH_EVENTS + depends on GOLDFISH + tristate "Generic Input Event device for Goldfish" + help + Say Y here to get an input event device for the Goldfish virtual + device emulator. + + To compile this driver as a module, choose M here: the + module will be called goldfish-events. + +config KEYBOARD_STOWAWAY + tristate "Stowaway keyboard" + select SERIO + help + Say Y here if you have a Stowaway keyboard on a serial port. + Stowaway compatible keyboards like Dicota Input-PDA keyboard + are also supported by this driver. + + To compile this driver as a module, choose M here: the + module will be called stowaway. + +config KEYBOARD_SUNKBD + tristate "Sun Type 4 and Type 5 keyboard" + select SERIO + help + Say Y here if you want to use a Sun Type 4 or Type 5 keyboard, + connected either to the Sun keyboard connector or to an serial + (RS-232) port via a simple adapter. + + To compile this driver as a module, choose M here: the + module will be called sunkbd. + +config KEYBOARD_SH_KEYSC + tristate "SuperH KEYSC keypad support" + depends on SUPERH || ARCH_SHMOBILE + help + Say Y here if you want to use a keypad attached to the KEYSC block + on SuperH processors such as sh7722 and sh7343. + + To compile this driver as a module, choose M here: the + module will be called sh_keysc. + +config KEYBOARD_STMPE + tristate "STMPE keypad support" + depends on MFD_STMPE + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the keypad controller on STMPE I/O + expanders. + + To compile this driver as a module, choose M here: the module will be + called stmpe-keypad. + +config KEYBOARD_DAVINCI + tristate "TI DaVinci Key Scan" + depends on ARCH_DAVINCI_DM365 + help + Say Y to enable keypad module support for the TI DaVinci + platforms (DM365). + + To compile this driver as a module, choose M here: the + module will be called davinci_keyscan. + +config KEYBOARD_OMAP + tristate "TI OMAP keypad support" + depends on ARCH_OMAP1 + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the OMAP keypad. + + To compile this driver as a module, choose M here: the + module will be called omap-keypad. + +config KEYBOARD_OMAP4 + tristate "TI OMAP4+ keypad support" + depends on ARCH_OMAP2PLUS + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the OMAP4+ keypad. + + To compile this driver as a module, choose M here: the + module will be called omap4-keypad. + +config KEYBOARD_SPEAR + tristate "ST SPEAR keyboard support" + depends on PLAT_SPEAR + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the SPEAR keyboard. + + To compile this driver as a module, choose M here: the + module will be called spear-keboard. + +config KEYBOARD_TC3589X + tristate "TC3589X Keypad support" + depends on MFD_TC3589X + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the keypad controller on + TC35892/3 I/O expander. + + To compile this driver as a module, choose M here: the + module will be called tc3589x-keypad. + +config KEYBOARD_TNETV107X + tristate "TI TNETV107X keypad support" + depends on ARCH_DAVINCI_TNETV107X + select INPUT_MATRIXKMAP + help + Say Y here if you want to use the TNETV107X keypad. + + To compile this driver as a module, choose M here: the + module will be called tnetv107x-keypad. + +config KEYBOARD_TWL4030 + tristate "TI TWL4030/TWL5030/TPS659x0 keypad support" + depends on TWL4030_CORE + select INPUT_MATRIXKMAP + help + Say Y here if your board use the keypad controller on + TWL4030 family chips. It's safe to say enable this + even on boards that don't use the keypad controller. + + To compile this driver as a module, choose M here: the + module will be called twl4030_keypad. + +config KEYBOARD_XTKBD + tristate "XT keyboard" + select SERIO + help + Say Y here if you want to use the old IBM PC/XT keyboard (or + compatible) on your system. This is only possible with a + parallel port keyboard adapter, you cannot connect it to the + keyboard port on a PC that runs Linux. + + To compile this driver as a module, choose M here: the + module will be called xtkbd. + +config KEYBOARD_W90P910 + tristate "W90P910 Matrix Keypad support" + depends on ARCH_W90X900 + select INPUT_MATRIXKMAP + help + Say Y here to enable the matrix keypad on evaluation board + based on W90P910. + + To compile this driver as a module, choose M here: the + module will be called w90p910_keypad. + +config KEYBOARD_CROS_EC + tristate "ChromeOS EC keyboard" + select INPUT_MATRIXKMAP + depends on MFD_CROS_EC + help + Say Y here to enable the matrix keyboard used by ChromeOS devices + and implemented on the ChromeOS EC. You must enable one bus option + (MFD_CROS_EC_I2C or MFD_CROS_EC_SPI) to use this. + + To compile this driver as a module, choose M here: the + module will be called cros_ec_keyb. + +config KEYBOARD_SC + tristate "Spreadtrum keypad support" + depends on ARCH_SC8825 || ARCH_SCX35 + help + Say Y here if you want to use the sprd keypad. + + To compile this driver as a module, choose M here: the + module will be called tiger_keypad. + +config KEYBOARD_SPRD_EIC + tristate "Spreadtrum eic keyboard support" + default n + help + Say Y here if you want to use the sprd eic keyboard. + + To compile this driver as a module, choose M here: the + module will be called sprd_eic_keys. + +endif diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile new file mode 100644 index 00000000..1bfd8fe9 --- /dev/null +++ b/drivers/input/keyboard/Makefile @@ -0,0 +1,61 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_KEYBOARD_ADP5520) += adp5520-keys.o +obj-$(CONFIG_KEYBOARD_ADP5588) += adp5588-keys.o +obj-$(CONFIG_KEYBOARD_ADP5589) += adp5589-keys.o +obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o +obj-$(CONFIG_KEYBOARD_ATARI) += atakbd.o +obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o +obj-$(CONFIG_KEYBOARD_BFIN) += bf54x-keys.o +obj-$(CONFIG_KEYBOARD_CROS_EC) += cros_ec_keyb.o +obj-$(CONFIG_KEYBOARD_DAVINCI) += davinci_keyscan.o +obj-$(CONFIG_KEYBOARD_EP93XX) += ep93xx_keypad.o +obj-$(CONFIG_KEYBOARD_GOLDFISH_EVENTS) += goldfish_events.o +obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o +obj-$(CONFIG_KEYBOARD_GPIO_SPRD) += gpio_keys_sprd.o +obj-$(CONFIG_KEYBOARD_GPIO_POLLED) += gpio_keys_polled.o +obj-$(CONFIG_KEYBOARD_TCA6416) += tca6416-keypad.o +obj-$(CONFIG_KEYBOARD_TCA8418) += tca8418_keypad.o +obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o +obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o +obj-$(CONFIG_KEYBOARD_IMX) += imx_keypad.o +obj-$(CONFIG_KEYBOARD_HP6XX) += jornada680_kbd.o +obj-$(CONFIG_KEYBOARD_HP7XX) += jornada720_kbd.o +obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o +obj-$(CONFIG_KEYBOARD_LM8323) += lm8323.o +obj-$(CONFIG_KEYBOARD_LM8333) += lm8333.o +obj-$(CONFIG_KEYBOARD_LOCOMO) += locomokbd.o +obj-$(CONFIG_KEYBOARD_LPC32XX) += lpc32xx-keys.o +obj-$(CONFIG_KEYBOARD_MAPLE) += maple_keyb.o +obj-$(CONFIG_KEYBOARD_MATRIX) += matrix_keypad.o +obj-$(CONFIG_KEYBOARD_MAX7359) += max7359_keypad.o +obj-$(CONFIG_KEYBOARD_MCS) += mcs_touchkey.o +obj-$(CONFIG_KEYBOARD_MPR121) += mpr121_touchkey.o +obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o +obj-$(CONFIG_KEYBOARD_NOMADIK) += nomadik-ske-keypad.o +obj-$(CONFIG_KEYBOARD_OMAP) += omap-keypad.o +obj-$(CONFIG_KEYBOARD_OMAP4) += omap4-keypad.o +obj-$(CONFIG_KEYBOARD_OPENCORES) += opencores-kbd.o +obj-$(CONFIG_KEYBOARD_PMIC8XXX) += pmic8xxx-keypad.o +obj-$(CONFIG_KEYBOARD_PXA27x) += pxa27x_keypad.o +obj-$(CONFIG_KEYBOARD_PXA930_ROTARY) += pxa930_rotary.o +obj-$(CONFIG_KEYBOARD_QT1070) += qt1070.o +obj-$(CONFIG_KEYBOARD_QT2160) += qt2160.o +obj-$(CONFIG_KEYBOARD_SAMSUNG) += samsung-keypad.o +obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o +obj-$(CONFIG_KEYBOARD_SPEAR) += spear-keyboard.o +obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o +obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o +obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o +obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o +obj-$(CONFIG_KEYBOARD_TEGRA) += tegra-kbc.o +obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o +obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o +obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o +obj-$(CONFIG_KEYBOARD_W90P910) += w90p910_keypad.o +obj-$(CONFIG_KEYBOARD_SC) += sc_keypad.o +obj-$(CONFIG_KEYBOARD_SPRD_EIC) += sprd_eic_keys.o diff --git a/drivers/input/keyboard/adp5520-keys.c b/drivers/input/keyboard/adp5520-keys.c new file mode 100644 index 00000000..ef26b17f --- /dev/null +++ b/drivers/input/keyboard/adp5520-keys.c @@ -0,0 +1,210 @@ +/* + * Keypad driver for Analog Devices ADP5520 MFD PMICs + * + * Copyright 2009 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include + +struct adp5520_keys { + struct input_dev *input; + struct notifier_block notifier; + struct device *master; + unsigned short keycode[ADP5520_KEYMAPSIZE]; +}; + +static void adp5520_keys_report_event(struct adp5520_keys *dev, + unsigned short keymask, int value) +{ + int i; + + for (i = 0; i < ADP5520_MAXKEYS; i++) + if (keymask & (1 << i)) + input_report_key(dev->input, dev->keycode[i], value); + + input_sync(dev->input); +} + +static int adp5520_keys_notifier(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct adp5520_keys *dev; + uint8_t reg_val_lo, reg_val_hi; + unsigned short keymask; + + dev = container_of(nb, struct adp5520_keys, notifier); + + if (event & ADP5520_KP_INT) { + adp5520_read(dev->master, ADP5520_KP_INT_STAT_1, ®_val_lo); + adp5520_read(dev->master, ADP5520_KP_INT_STAT_2, ®_val_hi); + + keymask = (reg_val_hi << 8) | reg_val_lo; + /* Read twice to clear */ + adp5520_read(dev->master, ADP5520_KP_INT_STAT_1, ®_val_lo); + adp5520_read(dev->master, ADP5520_KP_INT_STAT_2, ®_val_hi); + keymask |= (reg_val_hi << 8) | reg_val_lo; + adp5520_keys_report_event(dev, keymask, 1); + } + + if (event & ADP5520_KR_INT) { + adp5520_read(dev->master, ADP5520_KR_INT_STAT_1, ®_val_lo); + adp5520_read(dev->master, ADP5520_KR_INT_STAT_2, ®_val_hi); + + keymask = (reg_val_hi << 8) | reg_val_lo; + /* Read twice to clear */ + adp5520_read(dev->master, ADP5520_KR_INT_STAT_1, ®_val_lo); + adp5520_read(dev->master, ADP5520_KR_INT_STAT_2, ®_val_hi); + keymask |= (reg_val_hi << 8) | reg_val_lo; + adp5520_keys_report_event(dev, keymask, 0); + } + + return 0; +} + +static int adp5520_keys_probe(struct platform_device *pdev) +{ + struct adp5520_keys_platform_data *pdata = pdev->dev.platform_data; + struct input_dev *input; + struct adp5520_keys *dev; + int ret, i; + unsigned char en_mask, ctl_mask = 0; + + if (pdev->id != ID_ADP5520) { + dev_err(&pdev->dev, "only ADP5520 supports Keypad\n"); + return -EINVAL; + } + + if (pdata == NULL) { + dev_err(&pdev->dev, "missing platform data\n"); + return -EINVAL; + } + + if (!(pdata->rows_en_mask && pdata->cols_en_mask)) + return -EINVAL; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (dev == NULL) { + dev_err(&pdev->dev, "failed to alloc memory\n"); + return -ENOMEM; + } + + input = input_allocate_device(); + if (!input) { + ret = -ENOMEM; + goto err; + } + + dev->master = pdev->dev.parent; + dev->input = input; + + input->name = pdev->name; + input->phys = "adp5520-keys/input0"; + input->dev.parent = &pdev->dev; + + input_set_drvdata(input, dev); + + input->id.bustype = BUS_I2C; + input->id.vendor = 0x0001; + input->id.product = 0x5520; + input->id.version = 0x0001; + + input->keycodesize = sizeof(dev->keycode[0]); + input->keycodemax = pdata->keymapsize; + input->keycode = dev->keycode; + + memcpy(dev->keycode, pdata->keymap, + pdata->keymapsize * input->keycodesize); + + /* setup input device */ + __set_bit(EV_KEY, input->evbit); + + if (pdata->repeat) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < input->keycodemax; i++) + __set_bit(dev->keycode[i], input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + ret = input_register_device(input); + if (ret) { + dev_err(&pdev->dev, "unable to register input device\n"); + goto err; + } + + en_mask = pdata->rows_en_mask | pdata->cols_en_mask; + + ret = adp5520_set_bits(dev->master, ADP5520_GPIO_CFG_1, en_mask); + + if (en_mask & ADP5520_COL_C3) + ctl_mask |= ADP5520_C3_MODE; + + if (en_mask & ADP5520_ROW_R3) + ctl_mask |= ADP5520_R3_MODE; + + if (ctl_mask) + ret |= adp5520_set_bits(dev->master, ADP5520_LED_CONTROL, + ctl_mask); + + ret |= adp5520_set_bits(dev->master, ADP5520_GPIO_PULLUP, + pdata->rows_en_mask); + + if (ret) { + dev_err(&pdev->dev, "failed to write\n"); + ret = -EIO; + goto err1; + } + + dev->notifier.notifier_call = adp5520_keys_notifier; + ret = adp5520_register_notifier(dev->master, &dev->notifier, + ADP5520_KP_IEN | ADP5520_KR_IEN); + if (ret) { + dev_err(&pdev->dev, "failed to register notifier\n"); + goto err1; + } + + platform_set_drvdata(pdev, dev); + return 0; + +err1: + input_unregister_device(input); + input = NULL; +err: + input_free_device(input); + kfree(dev); + return ret; +} + +static int adp5520_keys_remove(struct platform_device *pdev) +{ + struct adp5520_keys *dev = platform_get_drvdata(pdev); + + adp5520_unregister_notifier(dev->master, &dev->notifier, + ADP5520_KP_IEN | ADP5520_KR_IEN); + + input_unregister_device(dev->input); + kfree(dev); + return 0; +} + +static struct platform_driver adp5520_keys_driver = { + .driver = { + .name = "adp5520-keys", + .owner = THIS_MODULE, + }, + .probe = adp5520_keys_probe, + .remove = adp5520_keys_remove, +}; +module_platform_driver(adp5520_keys_driver); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("Keys ADP5520 Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:adp5520-keys"); diff --git a/drivers/input/keyboard/adp5588-keys.c b/drivers/input/keyboard/adp5588-keys.c new file mode 100644 index 00000000..dbd2047f --- /dev/null +++ b/drivers/input/keyboard/adp5588-keys.c @@ -0,0 +1,661 @@ +/* + * File: drivers/input/keyboard/adp5588_keys.c + * Description: keypad driver for ADP5588 and ADP5587 + * I2C QWERTY Keypad and IO Expander + * Bugs: Enter bugs at http://blackfin.uclinux.org/ + * + * Copyright (C) 2008-2010 Analog Devices Inc. + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* Key Event Register xy */ +#define KEY_EV_PRESSED (1 << 7) +#define KEY_EV_MASK (0x7F) + +#define KP_SEL(x) (0xFFFF >> (16 - x)) /* 2^x-1 */ + +#define KEYP_MAX_EVENT 10 + +/* + * Early pre 4.0 Silicon required to delay readout by at least 25ms, + * since the Event Counter Register updated 25ms after the interrupt + * asserted. + */ +#define WA_DELAYED_READOUT_REVID(rev) ((rev) < 4) + +struct adp5588_kpad { + struct i2c_client *client; + struct input_dev *input; + struct delayed_work work; + unsigned long delay; + unsigned short keycode[ADP5588_KEYMAPSIZE]; + const struct adp5588_gpi_map *gpimap; + unsigned short gpimapsize; +#ifdef CONFIG_GPIOLIB + unsigned char gpiomap[ADP5588_MAXGPIO]; + bool export_gpio; + struct gpio_chip gc; + struct mutex gpio_lock; /* Protect cached dir, dat_out */ + u8 dat_out[3]; + u8 dir[3]; +#endif +}; + +static int adp5588_read(struct i2c_client *client, u8 reg) +{ + int ret = i2c_smbus_read_byte_data(client, reg); + + if (ret < 0) + dev_err(&client->dev, "Read Error\n"); + + return ret; +} + +static int adp5588_write(struct i2c_client *client, u8 reg, u8 val) +{ + return i2c_smbus_write_byte_data(client, reg, val); +} + +#ifdef CONFIG_GPIOLIB +static int adp5588_gpio_get_value(struct gpio_chip *chip, unsigned off) +{ + struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); + unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); + unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); + + return !!(adp5588_read(kpad->client, GPIO_DAT_STAT1 + bank) & bit); +} + +static void adp5588_gpio_set_value(struct gpio_chip *chip, + unsigned off, int val) +{ + struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); + unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); + unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); + + mutex_lock(&kpad->gpio_lock); + + if (val) + kpad->dat_out[bank] |= bit; + else + kpad->dat_out[bank] &= ~bit; + + adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, + kpad->dat_out[bank]); + + mutex_unlock(&kpad->gpio_lock); +} + +static int adp5588_gpio_direction_input(struct gpio_chip *chip, unsigned off) +{ + struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); + unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); + unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); + int ret; + + mutex_lock(&kpad->gpio_lock); + + kpad->dir[bank] &= ~bit; + ret = adp5588_write(kpad->client, GPIO_DIR1 + bank, kpad->dir[bank]); + + mutex_unlock(&kpad->gpio_lock); + + return ret; +} + +static int adp5588_gpio_direction_output(struct gpio_chip *chip, + unsigned off, int val) +{ + struct adp5588_kpad *kpad = container_of(chip, struct adp5588_kpad, gc); + unsigned int bank = ADP5588_BANK(kpad->gpiomap[off]); + unsigned int bit = ADP5588_BIT(kpad->gpiomap[off]); + int ret; + + mutex_lock(&kpad->gpio_lock); + + kpad->dir[bank] |= bit; + + if (val) + kpad->dat_out[bank] |= bit; + else + kpad->dat_out[bank] &= ~bit; + + ret = adp5588_write(kpad->client, GPIO_DAT_OUT1 + bank, + kpad->dat_out[bank]); + ret |= adp5588_write(kpad->client, GPIO_DIR1 + bank, + kpad->dir[bank]); + + mutex_unlock(&kpad->gpio_lock); + + return ret; +} + +static int adp5588_build_gpiomap(struct adp5588_kpad *kpad, + const struct adp5588_kpad_platform_data *pdata) +{ + bool pin_used[ADP5588_MAXGPIO]; + int n_unused = 0; + int i; + + memset(pin_used, 0, sizeof(pin_used)); + + for (i = 0; i < pdata->rows; i++) + pin_used[i] = true; + + for (i = 0; i < pdata->cols; i++) + pin_used[i + GPI_PIN_COL_BASE - GPI_PIN_BASE] = true; + + for (i = 0; i < kpad->gpimapsize; i++) + pin_used[kpad->gpimap[i].pin - GPI_PIN_BASE] = true; + + for (i = 0; i < ADP5588_MAXGPIO; i++) + if (!pin_used[i]) + kpad->gpiomap[n_unused++] = i; + + return n_unused; +} + +static int adp5588_gpio_add(struct adp5588_kpad *kpad) +{ + struct device *dev = &kpad->client->dev; + const struct adp5588_kpad_platform_data *pdata = dev->platform_data; + const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; + int i, error; + + if (!gpio_data) + return 0; + + kpad->gc.ngpio = adp5588_build_gpiomap(kpad, pdata); + if (kpad->gc.ngpio == 0) { + dev_info(dev, "No unused gpios left to export\n"); + return 0; + } + + kpad->export_gpio = true; + + kpad->gc.direction_input = adp5588_gpio_direction_input; + kpad->gc.direction_output = adp5588_gpio_direction_output; + kpad->gc.get = adp5588_gpio_get_value; + kpad->gc.set = adp5588_gpio_set_value; + kpad->gc.can_sleep = 1; + + kpad->gc.base = gpio_data->gpio_start; + kpad->gc.label = kpad->client->name; + kpad->gc.owner = THIS_MODULE; + kpad->gc.names = gpio_data->names; + + mutex_init(&kpad->gpio_lock); + + error = gpiochip_add(&kpad->gc); + if (error) { + dev_err(dev, "gpiochip_add failed, err: %d\n", error); + return error; + } + + for (i = 0; i <= ADP5588_BANK(ADP5588_MAXGPIO); i++) { + kpad->dat_out[i] = adp5588_read(kpad->client, + GPIO_DAT_OUT1 + i); + kpad->dir[i] = adp5588_read(kpad->client, GPIO_DIR1 + i); + } + + if (gpio_data->setup) { + error = gpio_data->setup(kpad->client, + kpad->gc.base, kpad->gc.ngpio, + gpio_data->context); + if (error) + dev_warn(dev, "setup failed, %d\n", error); + } + + return 0; +} + +static void adp5588_gpio_remove(struct adp5588_kpad *kpad) +{ + struct device *dev = &kpad->client->dev; + const struct adp5588_kpad_platform_data *pdata = dev->platform_data; + const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; + int error; + + if (!kpad->export_gpio) + return; + + if (gpio_data->teardown) { + error = gpio_data->teardown(kpad->client, + kpad->gc.base, kpad->gc.ngpio, + gpio_data->context); + if (error) + dev_warn(dev, "teardown failed %d\n", error); + } + + error = gpiochip_remove(&kpad->gc); + if (error) + dev_warn(dev, "gpiochip_remove failed %d\n", error); +} +#else +static inline int adp5588_gpio_add(struct adp5588_kpad *kpad) +{ + return 0; +} + +static inline void adp5588_gpio_remove(struct adp5588_kpad *kpad) +{ +} +#endif + +static void adp5588_report_events(struct adp5588_kpad *kpad, int ev_cnt) +{ + int i, j; + + for (i = 0; i < ev_cnt; i++) { + int key = adp5588_read(kpad->client, Key_EVENTA + i); + int key_val = key & KEY_EV_MASK; + + if (key_val >= GPI_PIN_BASE && key_val <= GPI_PIN_END) { + for (j = 0; j < kpad->gpimapsize; j++) { + if (key_val == kpad->gpimap[j].pin) { + input_report_switch(kpad->input, + kpad->gpimap[j].sw_evt, + key & KEY_EV_PRESSED); + break; + } + } + } else { + input_report_key(kpad->input, + kpad->keycode[key_val - 1], + key & KEY_EV_PRESSED); + } + } +} + +static void adp5588_work(struct work_struct *work) +{ + struct adp5588_kpad *kpad = container_of(work, + struct adp5588_kpad, work.work); + struct i2c_client *client = kpad->client; + int status, ev_cnt; + + status = adp5588_read(client, INT_STAT); + + if (status & ADP5588_OVR_FLOW_INT) /* Unlikely and should never happen */ + dev_err(&client->dev, "Event Overflow Error\n"); + + if (status & ADP5588_KE_INT) { + ev_cnt = adp5588_read(client, KEY_LCK_EC_STAT) & ADP5588_KEC; + if (ev_cnt) { + adp5588_report_events(kpad, ev_cnt); + input_sync(kpad->input); + } + } + adp5588_write(client, INT_STAT, status); /* Status is W1C */ +} + +static irqreturn_t adp5588_irq(int irq, void *handle) +{ + struct adp5588_kpad *kpad = handle; + + /* + * use keventd context to read the event fifo registers + * Schedule readout at least 25ms after notification for + * REVID < 4 + */ + + schedule_delayed_work(&kpad->work, kpad->delay); + + return IRQ_HANDLED; +} + +static int adp5588_setup(struct i2c_client *client) +{ + const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; + const struct adp5588_gpio_platform_data *gpio_data = pdata->gpio_data; + int i, ret; + unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0; + + ret = adp5588_write(client, KP_GPIO1, KP_SEL(pdata->rows)); + ret |= adp5588_write(client, KP_GPIO2, KP_SEL(pdata->cols) & 0xFF); + ret |= adp5588_write(client, KP_GPIO3, KP_SEL(pdata->cols) >> 8); + + if (pdata->en_keylock) { + ret |= adp5588_write(client, UNLOCK1, pdata->unlock_key1); + ret |= adp5588_write(client, UNLOCK2, pdata->unlock_key2); + ret |= adp5588_write(client, KEY_LCK_EC_STAT, ADP5588_K_LCK_EN); + } + + for (i = 0; i < KEYP_MAX_EVENT; i++) + ret |= adp5588_read(client, Key_EVENTA); + + for (i = 0; i < pdata->gpimapsize; i++) { + unsigned short pin = pdata->gpimap[i].pin; + + if (pin <= GPI_PIN_ROW_END) { + evt_mode1 |= (1 << (pin - GPI_PIN_ROW_BASE)); + } else { + evt_mode2 |= ((1 << (pin - GPI_PIN_COL_BASE)) & 0xFF); + evt_mode3 |= ((1 << (pin - GPI_PIN_COL_BASE)) >> 8); + } + } + + if (pdata->gpimapsize) { + ret |= adp5588_write(client, GPI_EM1, evt_mode1); + ret |= adp5588_write(client, GPI_EM2, evt_mode2); + ret |= adp5588_write(client, GPI_EM3, evt_mode3); + } + + if (gpio_data) { + for (i = 0; i <= ADP5588_BANK(ADP5588_MAXGPIO); i++) { + int pull_mask = gpio_data->pullup_dis_mask; + + ret |= adp5588_write(client, GPIO_PULL1 + i, + (pull_mask >> (8 * i)) & 0xFF); + } + } + + ret |= adp5588_write(client, INT_STAT, + ADP5588_CMP2_INT | ADP5588_CMP1_INT | + ADP5588_OVR_FLOW_INT | ADP5588_K_LCK_INT | + ADP5588_GPI_INT | ADP5588_KE_INT); /* Status is W1C */ + + ret |= adp5588_write(client, CFG, ADP5588_INT_CFG | + ADP5588_OVR_FLOW_IEN | + ADP5588_KE_IEN); + + if (ret < 0) { + dev_err(&client->dev, "Write Error\n"); + return ret; + } + + return 0; +} + +static void adp5588_report_switch_state(struct adp5588_kpad *kpad) +{ + int gpi_stat1 = adp5588_read(kpad->client, GPIO_DAT_STAT1); + int gpi_stat2 = adp5588_read(kpad->client, GPIO_DAT_STAT2); + int gpi_stat3 = adp5588_read(kpad->client, GPIO_DAT_STAT3); + int gpi_stat_tmp, pin_loc; + int i; + + for (i = 0; i < kpad->gpimapsize; i++) { + unsigned short pin = kpad->gpimap[i].pin; + + if (pin <= GPI_PIN_ROW_END) { + gpi_stat_tmp = gpi_stat1; + pin_loc = pin - GPI_PIN_ROW_BASE; + } else if ((pin - GPI_PIN_COL_BASE) < 8) { + gpi_stat_tmp = gpi_stat2; + pin_loc = pin - GPI_PIN_COL_BASE; + } else { + gpi_stat_tmp = gpi_stat3; + pin_loc = pin - GPI_PIN_COL_BASE - 8; + } + + if (gpi_stat_tmp < 0) { + dev_err(&kpad->client->dev, + "Can't read GPIO_DAT_STAT switch %d default to OFF\n", + pin); + gpi_stat_tmp = 0; + } + + input_report_switch(kpad->input, + kpad->gpimap[i].sw_evt, + !(gpi_stat_tmp & (1 << pin_loc))); + } + + input_sync(kpad->input); +} + + +static int adp5588_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct adp5588_kpad *kpad; + const struct adp5588_kpad_platform_data *pdata = client->dev.platform_data; + struct input_dev *input; + unsigned int revid; + int ret, i; + int error; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); + return -EIO; + } + + if (!pdata) { + dev_err(&client->dev, "no platform data?\n"); + return -EINVAL; + } + + if (!pdata->rows || !pdata->cols || !pdata->keymap) { + dev_err(&client->dev, "no rows, cols or keymap from pdata\n"); + return -EINVAL; + } + + if (pdata->keymapsize != ADP5588_KEYMAPSIZE) { + dev_err(&client->dev, "invalid keymapsize\n"); + return -EINVAL; + } + + if (!pdata->gpimap && pdata->gpimapsize) { + dev_err(&client->dev, "invalid gpimap from pdata\n"); + return -EINVAL; + } + + if (pdata->gpimapsize > ADP5588_GPIMAPSIZE_MAX) { + dev_err(&client->dev, "invalid gpimapsize\n"); + return -EINVAL; + } + + for (i = 0; i < pdata->gpimapsize; i++) { + unsigned short pin = pdata->gpimap[i].pin; + + if (pin < GPI_PIN_BASE || pin > GPI_PIN_END) { + dev_err(&client->dev, "invalid gpi pin data\n"); + return -EINVAL; + } + + if (pin <= GPI_PIN_ROW_END) { + if (pin - GPI_PIN_ROW_BASE + 1 <= pdata->rows) { + dev_err(&client->dev, "invalid gpi row data\n"); + return -EINVAL; + } + } else { + if (pin - GPI_PIN_COL_BASE + 1 <= pdata->cols) { + dev_err(&client->dev, "invalid gpi col data\n"); + return -EINVAL; + } + } + } + + if (!client->irq) { + dev_err(&client->dev, "no IRQ?\n"); + return -EINVAL; + } + + kpad = kzalloc(sizeof(*kpad), GFP_KERNEL); + input = input_allocate_device(); + if (!kpad || !input) { + error = -ENOMEM; + goto err_free_mem; + } + + kpad->client = client; + kpad->input = input; + INIT_DELAYED_WORK(&kpad->work, adp5588_work); + + ret = adp5588_read(client, DEV_ID); + if (ret < 0) { + error = ret; + goto err_free_mem; + } + + revid = (u8) ret & ADP5588_DEVICE_ID_MASK; + if (WA_DELAYED_READOUT_REVID(revid)) + kpad->delay = msecs_to_jiffies(30); + + input->name = client->name; + input->phys = "adp5588-keys/input0"; + input->dev.parent = &client->dev; + + input_set_drvdata(input, kpad); + + input->id.bustype = BUS_I2C; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = revid; + + input->keycodesize = sizeof(kpad->keycode[0]); + input->keycodemax = pdata->keymapsize; + input->keycode = kpad->keycode; + + memcpy(kpad->keycode, pdata->keymap, + pdata->keymapsize * input->keycodesize); + + kpad->gpimap = pdata->gpimap; + kpad->gpimapsize = pdata->gpimapsize; + + /* setup input device */ + __set_bit(EV_KEY, input->evbit); + + if (pdata->repeat) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < input->keycodemax; i++) + __set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + if (kpad->gpimapsize) + __set_bit(EV_SW, input->evbit); + for (i = 0; i < kpad->gpimapsize; i++) + __set_bit(kpad->gpimap[i].sw_evt, input->swbit); + + error = input_register_device(input); + if (error) { + dev_err(&client->dev, "unable to register input device\n"); + goto err_free_mem; + } + + error = request_irq(client->irq, adp5588_irq, + IRQF_TRIGGER_FALLING, + client->dev.driver->name, kpad); + if (error) { + dev_err(&client->dev, "irq %d busy?\n", client->irq); + goto err_unreg_dev; + } + + error = adp5588_setup(client); + if (error) + goto err_free_irq; + + if (kpad->gpimapsize) + adp5588_report_switch_state(kpad); + + error = adp5588_gpio_add(kpad); + if (error) + goto err_free_irq; + + device_init_wakeup(&client->dev, 1); + i2c_set_clientdata(client, kpad); + + dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq); + return 0; + + err_free_irq: + free_irq(client->irq, kpad); + err_unreg_dev: + input_unregister_device(input); + input = NULL; + err_free_mem: + input_free_device(input); + kfree(kpad); + + return error; +} + +static int adp5588_remove(struct i2c_client *client) +{ + struct adp5588_kpad *kpad = i2c_get_clientdata(client); + + adp5588_write(client, CFG, 0); + free_irq(client->irq, kpad); + cancel_delayed_work_sync(&kpad->work); + input_unregister_device(kpad->input); + adp5588_gpio_remove(kpad); + kfree(kpad); + + return 0; +} + +#ifdef CONFIG_PM +static int adp5588_suspend(struct device *dev) +{ + struct adp5588_kpad *kpad = dev_get_drvdata(dev); + struct i2c_client *client = kpad->client; + + disable_irq(client->irq); + cancel_delayed_work_sync(&kpad->work); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int adp5588_resume(struct device *dev) +{ + struct adp5588_kpad *kpad = dev_get_drvdata(dev); + struct i2c_client *client = kpad->client; + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + enable_irq(client->irq); + + return 0; +} + +static const struct dev_pm_ops adp5588_dev_pm_ops = { + .suspend = adp5588_suspend, + .resume = adp5588_resume, +}; +#endif + +static const struct i2c_device_id adp5588_id[] = { + { "adp5588-keys", 0 }, + { "adp5587-keys", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, adp5588_id); + +static struct i2c_driver adp5588_driver = { + .driver = { + .name = KBUILD_MODNAME, +#ifdef CONFIG_PM + .pm = &adp5588_dev_pm_ops, +#endif + }, + .probe = adp5588_probe, + .remove = adp5588_remove, + .id_table = adp5588_id, +}; + +module_i2c_driver(adp5588_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("ADP5588/87 Keypad driver"); diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c new file mode 100644 index 00000000..67d12b34 --- /dev/null +++ b/drivers/input/keyboard/adp5589-keys.c @@ -0,0 +1,1114 @@ +/* + * Description: keypad driver for ADP5589, ADP5585 + * I2C QWERTY Keypad and IO Expander + * Bugs: Enter bugs at http://blackfin.uclinux.org/ + * + * Copyright (C) 2010-2011 Analog Devices Inc. + * Licensed under the GPL-2. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* ADP5589/ADP5585 Common Registers */ +#define ADP5589_5_ID 0x00 +#define ADP5589_5_INT_STATUS 0x01 +#define ADP5589_5_STATUS 0x02 +#define ADP5589_5_FIFO_1 0x03 +#define ADP5589_5_FIFO_2 0x04 +#define ADP5589_5_FIFO_3 0x05 +#define ADP5589_5_FIFO_4 0x06 +#define ADP5589_5_FIFO_5 0x07 +#define ADP5589_5_FIFO_6 0x08 +#define ADP5589_5_FIFO_7 0x09 +#define ADP5589_5_FIFO_8 0x0A +#define ADP5589_5_FIFO_9 0x0B +#define ADP5589_5_FIFO_10 0x0C +#define ADP5589_5_FIFO_11 0x0D +#define ADP5589_5_FIFO_12 0x0E +#define ADP5589_5_FIFO_13 0x0F +#define ADP5589_5_FIFO_14 0x10 +#define ADP5589_5_FIFO_15 0x11 +#define ADP5589_5_FIFO_16 0x12 +#define ADP5589_5_GPI_INT_STAT_A 0x13 +#define ADP5589_5_GPI_INT_STAT_B 0x14 + +/* ADP5589 Registers */ +#define ADP5589_GPI_INT_STAT_C 0x15 +#define ADP5589_GPI_STATUS_A 0x16 +#define ADP5589_GPI_STATUS_B 0x17 +#define ADP5589_GPI_STATUS_C 0x18 +#define ADP5589_RPULL_CONFIG_A 0x19 +#define ADP5589_RPULL_CONFIG_B 0x1A +#define ADP5589_RPULL_CONFIG_C 0x1B +#define ADP5589_RPULL_CONFIG_D 0x1C +#define ADP5589_RPULL_CONFIG_E 0x1D +#define ADP5589_GPI_INT_LEVEL_A 0x1E +#define ADP5589_GPI_INT_LEVEL_B 0x1F +#define ADP5589_GPI_INT_LEVEL_C 0x20 +#define ADP5589_GPI_EVENT_EN_A 0x21 +#define ADP5589_GPI_EVENT_EN_B 0x22 +#define ADP5589_GPI_EVENT_EN_C 0x23 +#define ADP5589_GPI_INTERRUPT_EN_A 0x24 +#define ADP5589_GPI_INTERRUPT_EN_B 0x25 +#define ADP5589_GPI_INTERRUPT_EN_C 0x26 +#define ADP5589_DEBOUNCE_DIS_A 0x27 +#define ADP5589_DEBOUNCE_DIS_B 0x28 +#define ADP5589_DEBOUNCE_DIS_C 0x29 +#define ADP5589_GPO_DATA_OUT_A 0x2A +#define ADP5589_GPO_DATA_OUT_B 0x2B +#define ADP5589_GPO_DATA_OUT_C 0x2C +#define ADP5589_GPO_OUT_MODE_A 0x2D +#define ADP5589_GPO_OUT_MODE_B 0x2E +#define ADP5589_GPO_OUT_MODE_C 0x2F +#define ADP5589_GPIO_DIRECTION_A 0x30 +#define ADP5589_GPIO_DIRECTION_B 0x31 +#define ADP5589_GPIO_DIRECTION_C 0x32 +#define ADP5589_UNLOCK1 0x33 +#define ADP5589_UNLOCK2 0x34 +#define ADP5589_EXT_LOCK_EVENT 0x35 +#define ADP5589_UNLOCK_TIMERS 0x36 +#define ADP5589_LOCK_CFG 0x37 +#define ADP5589_RESET1_EVENT_A 0x38 +#define ADP5589_RESET1_EVENT_B 0x39 +#define ADP5589_RESET1_EVENT_C 0x3A +#define ADP5589_RESET2_EVENT_A 0x3B +#define ADP5589_RESET2_EVENT_B 0x3C +#define ADP5589_RESET_CFG 0x3D +#define ADP5589_PWM_OFFT_LOW 0x3E +#define ADP5589_PWM_OFFT_HIGH 0x3F +#define ADP5589_PWM_ONT_LOW 0x40 +#define ADP5589_PWM_ONT_HIGH 0x41 +#define ADP5589_PWM_CFG 0x42 +#define ADP5589_CLOCK_DIV_CFG 0x43 +#define ADP5589_LOGIC_1_CFG 0x44 +#define ADP5589_LOGIC_2_CFG 0x45 +#define ADP5589_LOGIC_FF_CFG 0x46 +#define ADP5589_LOGIC_INT_EVENT_EN 0x47 +#define ADP5589_POLL_PTIME_CFG 0x48 +#define ADP5589_PIN_CONFIG_A 0x49 +#define ADP5589_PIN_CONFIG_B 0x4A +#define ADP5589_PIN_CONFIG_C 0x4B +#define ADP5589_PIN_CONFIG_D 0x4C +#define ADP5589_GENERAL_CFG 0x4D +#define ADP5589_INT_EN 0x4E + +/* ADP5585 Registers */ +#define ADP5585_GPI_STATUS_A 0x15 +#define ADP5585_GPI_STATUS_B 0x16 +#define ADP5585_RPULL_CONFIG_A 0x17 +#define ADP5585_RPULL_CONFIG_B 0x18 +#define ADP5585_RPULL_CONFIG_C 0x19 +#define ADP5585_RPULL_CONFIG_D 0x1A +#define ADP5585_GPI_INT_LEVEL_A 0x1B +#define ADP5585_GPI_INT_LEVEL_B 0x1C +#define ADP5585_GPI_EVENT_EN_A 0x1D +#define ADP5585_GPI_EVENT_EN_B 0x1E +#define ADP5585_GPI_INTERRUPT_EN_A 0x1F +#define ADP5585_GPI_INTERRUPT_EN_B 0x20 +#define ADP5585_DEBOUNCE_DIS_A 0x21 +#define ADP5585_DEBOUNCE_DIS_B 0x22 +#define ADP5585_GPO_DATA_OUT_A 0x23 +#define ADP5585_GPO_DATA_OUT_B 0x24 +#define ADP5585_GPO_OUT_MODE_A 0x25 +#define ADP5585_GPO_OUT_MODE_B 0x26 +#define ADP5585_GPIO_DIRECTION_A 0x27 +#define ADP5585_GPIO_DIRECTION_B 0x28 +#define ADP5585_RESET1_EVENT_A 0x29 +#define ADP5585_RESET1_EVENT_B 0x2A +#define ADP5585_RESET1_EVENT_C 0x2B +#define ADP5585_RESET2_EVENT_A 0x2C +#define ADP5585_RESET2_EVENT_B 0x2D +#define ADP5585_RESET_CFG 0x2E +#define ADP5585_PWM_OFFT_LOW 0x2F +#define ADP5585_PWM_OFFT_HIGH 0x30 +#define ADP5585_PWM_ONT_LOW 0x31 +#define ADP5585_PWM_ONT_HIGH 0x32 +#define ADP5585_PWM_CFG 0x33 +#define ADP5585_LOGIC_CFG 0x34 +#define ADP5585_LOGIC_FF_CFG 0x35 +#define ADP5585_LOGIC_INT_EVENT_EN 0x36 +#define ADP5585_POLL_PTIME_CFG 0x37 +#define ADP5585_PIN_CONFIG_A 0x38 +#define ADP5585_PIN_CONFIG_B 0x39 +#define ADP5585_PIN_CONFIG_D 0x3A +#define ADP5585_GENERAL_CFG 0x3B +#define ADP5585_INT_EN 0x3C + +/* ID Register */ +#define ADP5589_5_DEVICE_ID_MASK 0xF +#define ADP5589_5_MAN_ID_MASK 0xF +#define ADP5589_5_MAN_ID_SHIFT 4 +#define ADP5589_5_MAN_ID 0x02 + +/* GENERAL_CFG Register */ +#define OSC_EN (1 << 7) +#define CORE_CLK(x) (((x) & 0x3) << 5) +#define LCK_TRK_LOGIC (1 << 4) /* ADP5589 only */ +#define LCK_TRK_GPI (1 << 3) /* ADP5589 only */ +#define INT_CFG (1 << 1) +#define RST_CFG (1 << 0) + +/* INT_EN Register */ +#define LOGIC2_IEN (1 << 5) /* ADP5589 only */ +#define LOGIC1_IEN (1 << 4) +#define LOCK_IEN (1 << 3) /* ADP5589 only */ +#define OVRFLOW_IEN (1 << 2) +#define GPI_IEN (1 << 1) +#define EVENT_IEN (1 << 0) + +/* Interrupt Status Register */ +#define LOGIC2_INT (1 << 5) /* ADP5589 only */ +#define LOGIC1_INT (1 << 4) +#define LOCK_INT (1 << 3) /* ADP5589 only */ +#define OVRFLOW_INT (1 << 2) +#define GPI_INT (1 << 1) +#define EVENT_INT (1 << 0) + +/* STATUS Register */ +#define LOGIC2_STAT (1 << 7) /* ADP5589 only */ +#define LOGIC1_STAT (1 << 6) +#define LOCK_STAT (1 << 5) /* ADP5589 only */ +#define KEC 0xF + +/* PIN_CONFIG_D Register */ +#define C4_EXTEND_CFG (1 << 6) /* RESET2 */ +#define R4_EXTEND_CFG (1 << 5) /* RESET1 */ + +/* LOCK_CFG */ +#define LOCK_EN (1 << 0) + +#define PTIME_MASK 0x3 +#define LTIME_MASK 0x3 /* ADP5589 only */ + +/* Key Event Register xy */ +#define KEY_EV_PRESSED (1 << 7) +#define KEY_EV_MASK (0x7F) + +#define KEYP_MAX_EVENT 16 +#define ADP5589_MAXGPIO 19 +#define ADP5585_MAXGPIO 11 /* 10 on the ADP5585-01, 11 on ADP5585-02 */ + +enum { + ADP5589, + ADP5585_01, + ADP5585_02 +}; + +struct adp_constants { + u8 maxgpio; + u8 keymapsize; + u8 gpi_pin_row_base; + u8 gpi_pin_row_end; + u8 gpi_pin_col_base; + u8 gpi_pin_base; + u8 gpi_pin_end; + u8 gpimapsize_max; + u8 max_row_num; + u8 max_col_num; + u8 row_mask; + u8 col_mask; + u8 col_shift; + u8 c4_extend_cfg; + u8 (*bank) (u8 offset); + u8 (*bit) (u8 offset); + u8 (*reg) (u8 reg); +}; + +struct adp5589_kpad { + struct i2c_client *client; + struct input_dev *input; + const struct adp_constants *var; + unsigned short keycode[ADP5589_KEYMAPSIZE]; + const struct adp5589_gpi_map *gpimap; + unsigned short gpimapsize; + unsigned extend_cfg; + bool is_adp5585; + bool adp5585_support_row5; +#ifdef CONFIG_GPIOLIB + unsigned char gpiomap[ADP5589_MAXGPIO]; + bool export_gpio; + struct gpio_chip gc; + struct mutex gpio_lock; /* Protect cached dir, dat_out */ + u8 dat_out[3]; + u8 dir[3]; +#endif +}; + +/* + * ADP5589 / ADP5585 derivative / variant handling + */ + + +/* ADP5589 */ + +static unsigned char adp5589_bank(unsigned char offset) +{ + return offset >> 3; +} + +static unsigned char adp5589_bit(unsigned char offset) +{ + return 1u << (offset & 0x7); +} + +static unsigned char adp5589_reg(unsigned char reg) +{ + return reg; +} + +static const struct adp_constants const_adp5589 = { + .maxgpio = ADP5589_MAXGPIO, + .keymapsize = ADP5589_KEYMAPSIZE, + .gpi_pin_row_base = ADP5589_GPI_PIN_ROW_BASE, + .gpi_pin_row_end = ADP5589_GPI_PIN_ROW_END, + .gpi_pin_col_base = ADP5589_GPI_PIN_COL_BASE, + .gpi_pin_base = ADP5589_GPI_PIN_BASE, + .gpi_pin_end = ADP5589_GPI_PIN_END, + .gpimapsize_max = ADP5589_GPIMAPSIZE_MAX, + .c4_extend_cfg = 12, + .max_row_num = ADP5589_MAX_ROW_NUM, + .max_col_num = ADP5589_MAX_COL_NUM, + .row_mask = ADP5589_ROW_MASK, + .col_mask = ADP5589_COL_MASK, + .col_shift = ADP5589_COL_SHIFT, + .bank = adp5589_bank, + .bit = adp5589_bit, + .reg = adp5589_reg, +}; + +/* ADP5585 */ + +static unsigned char adp5585_bank(unsigned char offset) +{ + return offset > ADP5585_MAX_ROW_NUM; +} + +static unsigned char adp5585_bit(unsigned char offset) +{ + return (offset > ADP5585_MAX_ROW_NUM) ? + 1u << (offset - ADP5585_COL_SHIFT) : 1u << offset; +} + +static const unsigned char adp5585_reg_lut[] = { + [ADP5589_GPI_STATUS_A] = ADP5585_GPI_STATUS_A, + [ADP5589_GPI_STATUS_B] = ADP5585_GPI_STATUS_B, + [ADP5589_RPULL_CONFIG_A] = ADP5585_RPULL_CONFIG_A, + [ADP5589_RPULL_CONFIG_B] = ADP5585_RPULL_CONFIG_B, + [ADP5589_RPULL_CONFIG_C] = ADP5585_RPULL_CONFIG_C, + [ADP5589_RPULL_CONFIG_D] = ADP5585_RPULL_CONFIG_D, + [ADP5589_GPI_INT_LEVEL_A] = ADP5585_GPI_INT_LEVEL_A, + [ADP5589_GPI_INT_LEVEL_B] = ADP5585_GPI_INT_LEVEL_B, + [ADP5589_GPI_EVENT_EN_A] = ADP5585_GPI_EVENT_EN_A, + [ADP5589_GPI_EVENT_EN_B] = ADP5585_GPI_EVENT_EN_B, + [ADP5589_GPI_INTERRUPT_EN_A] = ADP5585_GPI_INTERRUPT_EN_A, + [ADP5589_GPI_INTERRUPT_EN_B] = ADP5585_GPI_INTERRUPT_EN_B, + [ADP5589_DEBOUNCE_DIS_A] = ADP5585_DEBOUNCE_DIS_A, + [ADP5589_DEBOUNCE_DIS_B] = ADP5585_DEBOUNCE_DIS_B, + [ADP5589_GPO_DATA_OUT_A] = ADP5585_GPO_DATA_OUT_A, + [ADP5589_GPO_DATA_OUT_B] = ADP5585_GPO_DATA_OUT_B, + [ADP5589_GPO_OUT_MODE_A] = ADP5585_GPO_OUT_MODE_A, + [ADP5589_GPO_OUT_MODE_B] = ADP5585_GPO_OUT_MODE_B, + [ADP5589_GPIO_DIRECTION_A] = ADP5585_GPIO_DIRECTION_A, + [ADP5589_GPIO_DIRECTION_B] = ADP5585_GPIO_DIRECTION_B, + [ADP5589_RESET1_EVENT_A] = ADP5585_RESET1_EVENT_A, + [ADP5589_RESET1_EVENT_B] = ADP5585_RESET1_EVENT_B, + [ADP5589_RESET1_EVENT_C] = ADP5585_RESET1_EVENT_C, + [ADP5589_RESET2_EVENT_A] = ADP5585_RESET2_EVENT_A, + [ADP5589_RESET2_EVENT_B] = ADP5585_RESET2_EVENT_B, + [ADP5589_RESET_CFG] = ADP5585_RESET_CFG, + [ADP5589_PWM_OFFT_LOW] = ADP5585_PWM_OFFT_LOW, + [ADP5589_PWM_OFFT_HIGH] = ADP5585_PWM_OFFT_HIGH, + [ADP5589_PWM_ONT_LOW] = ADP5585_PWM_ONT_LOW, + [ADP5589_PWM_ONT_HIGH] = ADP5585_PWM_ONT_HIGH, + [ADP5589_PWM_CFG] = ADP5585_PWM_CFG, + [ADP5589_LOGIC_1_CFG] = ADP5585_LOGIC_CFG, + [ADP5589_LOGIC_FF_CFG] = ADP5585_LOGIC_FF_CFG, + [ADP5589_LOGIC_INT_EVENT_EN] = ADP5585_LOGIC_INT_EVENT_EN, + [ADP5589_POLL_PTIME_CFG] = ADP5585_POLL_PTIME_CFG, + [ADP5589_PIN_CONFIG_A] = ADP5585_PIN_CONFIG_A, + [ADP5589_PIN_CONFIG_B] = ADP5585_PIN_CONFIG_B, + [ADP5589_PIN_CONFIG_D] = ADP5585_PIN_CONFIG_D, + [ADP5589_GENERAL_CFG] = ADP5585_GENERAL_CFG, + [ADP5589_INT_EN] = ADP5585_INT_EN, +}; + +static unsigned char adp5585_reg(unsigned char reg) +{ + return adp5585_reg_lut[reg]; +} + +static const struct adp_constants const_adp5585 = { + .maxgpio = ADP5585_MAXGPIO, + .keymapsize = ADP5585_KEYMAPSIZE, + .gpi_pin_row_base = ADP5585_GPI_PIN_ROW_BASE, + .gpi_pin_row_end = ADP5585_GPI_PIN_ROW_END, + .gpi_pin_col_base = ADP5585_GPI_PIN_COL_BASE, + .gpi_pin_base = ADP5585_GPI_PIN_BASE, + .gpi_pin_end = ADP5585_GPI_PIN_END, + .gpimapsize_max = ADP5585_GPIMAPSIZE_MAX, + .c4_extend_cfg = 10, + .max_row_num = ADP5585_MAX_ROW_NUM, + .max_col_num = ADP5585_MAX_COL_NUM, + .row_mask = ADP5585_ROW_MASK, + .col_mask = ADP5585_COL_MASK, + .col_shift = ADP5585_COL_SHIFT, + .bank = adp5585_bank, + .bit = adp5585_bit, + .reg = adp5585_reg, +}; + +static int adp5589_read(struct i2c_client *client, u8 reg) +{ + int ret = i2c_smbus_read_byte_data(client, reg); + + if (ret < 0) + dev_err(&client->dev, "Read Error\n"); + + return ret; +} + +static int adp5589_write(struct i2c_client *client, u8 reg, u8 val) +{ + return i2c_smbus_write_byte_data(client, reg, val); +} + +#ifdef CONFIG_GPIOLIB +static int adp5589_gpio_get_value(struct gpio_chip *chip, unsigned off) +{ + struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); + unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); + unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); + + return !!(adp5589_read(kpad->client, + kpad->var->reg(ADP5589_GPI_STATUS_A) + bank) & + bit); +} + +static void adp5589_gpio_set_value(struct gpio_chip *chip, + unsigned off, int val) +{ + struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); + unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); + unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); + + mutex_lock(&kpad->gpio_lock); + + if (val) + kpad->dat_out[bank] |= bit; + else + kpad->dat_out[bank] &= ~bit; + + adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) + + bank, kpad->dat_out[bank]); + + mutex_unlock(&kpad->gpio_lock); +} + +static int adp5589_gpio_direction_input(struct gpio_chip *chip, unsigned off) +{ + struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); + unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); + unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); + int ret; + + mutex_lock(&kpad->gpio_lock); + + kpad->dir[bank] &= ~bit; + ret = adp5589_write(kpad->client, + kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank, + kpad->dir[bank]); + + mutex_unlock(&kpad->gpio_lock); + + return ret; +} + +static int adp5589_gpio_direction_output(struct gpio_chip *chip, + unsigned off, int val) +{ + struct adp5589_kpad *kpad = container_of(chip, struct adp5589_kpad, gc); + unsigned int bank = kpad->var->bank(kpad->gpiomap[off]); + unsigned int bit = kpad->var->bit(kpad->gpiomap[off]); + int ret; + + mutex_lock(&kpad->gpio_lock); + + kpad->dir[bank] |= bit; + + if (val) + kpad->dat_out[bank] |= bit; + else + kpad->dat_out[bank] &= ~bit; + + ret = adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A) + + bank, kpad->dat_out[bank]); + ret |= adp5589_write(kpad->client, + kpad->var->reg(ADP5589_GPIO_DIRECTION_A) + bank, + kpad->dir[bank]); + + mutex_unlock(&kpad->gpio_lock); + + return ret; +} + +static int adp5589_build_gpiomap(struct adp5589_kpad *kpad, + const struct adp5589_kpad_platform_data *pdata) +{ + bool pin_used[ADP5589_MAXGPIO]; + int n_unused = 0; + int i; + + memset(pin_used, false, sizeof(pin_used)); + + for (i = 0; i < kpad->var->maxgpio; i++) + if (pdata->keypad_en_mask & (1 << i)) + pin_used[i] = true; + + for (i = 0; i < kpad->gpimapsize; i++) + pin_used[kpad->gpimap[i].pin - kpad->var->gpi_pin_base] = true; + + if (kpad->extend_cfg & R4_EXTEND_CFG) + pin_used[4] = true; + + if (kpad->extend_cfg & C4_EXTEND_CFG) + pin_used[kpad->var->c4_extend_cfg] = true; + + if (!kpad->adp5585_support_row5) + pin_used[5] = true; + + for (i = 0; i < kpad->var->maxgpio; i++) + if (!pin_used[i]) + kpad->gpiomap[n_unused++] = i; + + return n_unused; +} + +static int adp5589_gpio_add(struct adp5589_kpad *kpad) +{ + struct device *dev = &kpad->client->dev; + const struct adp5589_kpad_platform_data *pdata = dev->platform_data; + const struct adp5589_gpio_platform_data *gpio_data = pdata->gpio_data; + int i, error; + + if (!gpio_data) + return 0; + + kpad->gc.ngpio = adp5589_build_gpiomap(kpad, pdata); + if (kpad->gc.ngpio == 0) { + dev_info(dev, "No unused gpios left to export\n"); + return 0; + } + + kpad->export_gpio = true; + + kpad->gc.direction_input = adp5589_gpio_direction_input; + kpad->gc.direction_output = adp5589_gpio_direction_output; + kpad->gc.get = adp5589_gpio_get_value; + kpad->gc.set = adp5589_gpio_set_value; + kpad->gc.can_sleep = 1; + + kpad->gc.base = gpio_data->gpio_start; + kpad->gc.label = kpad->client->name; + kpad->gc.owner = THIS_MODULE; + + mutex_init(&kpad->gpio_lock); + + error = gpiochip_add(&kpad->gc); + if (error) { + dev_err(dev, "gpiochip_add failed, err: %d\n", error); + return error; + } + + for (i = 0; i <= kpad->var->bank(kpad->var->maxgpio); i++) { + kpad->dat_out[i] = adp5589_read(kpad->client, kpad->var->reg( + ADP5589_GPO_DATA_OUT_A) + i); + kpad->dir[i] = adp5589_read(kpad->client, kpad->var->reg( + ADP5589_GPIO_DIRECTION_A) + i); + } + + if (gpio_data->setup) { + error = gpio_data->setup(kpad->client, + kpad->gc.base, kpad->gc.ngpio, + gpio_data->context); + if (error) + dev_warn(dev, "setup failed, %d\n", error); + } + + return 0; +} + +static void adp5589_gpio_remove(struct adp5589_kpad *kpad) +{ + struct device *dev = &kpad->client->dev; + const struct adp5589_kpad_platform_data *pdata = dev->platform_data; + const struct adp5589_gpio_platform_data *gpio_data = pdata->gpio_data; + int error; + + if (!kpad->export_gpio) + return; + + if (gpio_data->teardown) { + error = gpio_data->teardown(kpad->client, + kpad->gc.base, kpad->gc.ngpio, + gpio_data->context); + if (error) + dev_warn(dev, "teardown failed %d\n", error); + } + + error = gpiochip_remove(&kpad->gc); + if (error) + dev_warn(dev, "gpiochip_remove failed %d\n", error); +} +#else +static inline int adp5589_gpio_add(struct adp5589_kpad *kpad) +{ + return 0; +} + +static inline void adp5589_gpio_remove(struct adp5589_kpad *kpad) +{ +} +#endif + +static void adp5589_report_switches(struct adp5589_kpad *kpad, + int key, int key_val) +{ + int i; + + for (i = 0; i < kpad->gpimapsize; i++) { + if (key_val == kpad->gpimap[i].pin) { + input_report_switch(kpad->input, + kpad->gpimap[i].sw_evt, + key & KEY_EV_PRESSED); + break; + } + } +} + +static void adp5589_report_events(struct adp5589_kpad *kpad, int ev_cnt) +{ + int i; + + for (i = 0; i < ev_cnt; i++) { + int key = adp5589_read(kpad->client, ADP5589_5_FIFO_1 + i); + int key_val = key & KEY_EV_MASK; + + if (key_val >= kpad->var->gpi_pin_base && + key_val <= kpad->var->gpi_pin_end) { + adp5589_report_switches(kpad, key, key_val); + } else { + input_report_key(kpad->input, + kpad->keycode[key_val - 1], + key & KEY_EV_PRESSED); + } + } +} + +static irqreturn_t adp5589_irq(int irq, void *handle) +{ + struct adp5589_kpad *kpad = handle; + struct i2c_client *client = kpad->client; + int status, ev_cnt; + + status = adp5589_read(client, ADP5589_5_INT_STATUS); + + if (status & OVRFLOW_INT) /* Unlikely and should never happen */ + dev_err(&client->dev, "Event Overflow Error\n"); + + if (status & EVENT_INT) { + ev_cnt = adp5589_read(client, ADP5589_5_STATUS) & KEC; + if (ev_cnt) { + adp5589_report_events(kpad, ev_cnt); + input_sync(kpad->input); + } + } + + adp5589_write(client, ADP5589_5_INT_STATUS, status); /* Status is W1C */ + + return IRQ_HANDLED; +} + +static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short key) +{ + int i; + + for (i = 0; i < kpad->var->keymapsize; i++) + if (key == kpad->keycode[i]) + return (i + 1) | KEY_EV_PRESSED; + + dev_err(&kpad->client->dev, "RESET/UNLOCK key not in keycode map\n"); + + return -EINVAL; +} + +static int adp5589_setup(struct adp5589_kpad *kpad) +{ + struct i2c_client *client = kpad->client; + const struct adp5589_kpad_platform_data *pdata = + client->dev.platform_data; + u8 (*reg) (u8) = kpad->var->reg; + unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0; + unsigned char pull_mask = 0; + int i, ret; + + ret = adp5589_write(client, reg(ADP5589_PIN_CONFIG_A), + pdata->keypad_en_mask & kpad->var->row_mask); + ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_B), + (pdata->keypad_en_mask >> kpad->var->col_shift) & + kpad->var->col_mask); + + if (!kpad->is_adp5585) + ret |= adp5589_write(client, ADP5589_PIN_CONFIG_C, + (pdata->keypad_en_mask >> 16) & 0xFF); + + if (!kpad->is_adp5585 && pdata->en_keylock) { + ret |= adp5589_write(client, ADP5589_UNLOCK1, + pdata->unlock_key1); + ret |= adp5589_write(client, ADP5589_UNLOCK2, + pdata->unlock_key2); + ret |= adp5589_write(client, ADP5589_UNLOCK_TIMERS, + pdata->unlock_timer & LTIME_MASK); + ret |= adp5589_write(client, ADP5589_LOCK_CFG, LOCK_EN); + } + + for (i = 0; i < KEYP_MAX_EVENT; i++) + ret |= adp5589_read(client, ADP5589_5_FIFO_1 + i); + + for (i = 0; i < pdata->gpimapsize; i++) { + unsigned short pin = pdata->gpimap[i].pin; + + if (pin <= kpad->var->gpi_pin_row_end) { + evt_mode1 |= (1 << (pin - kpad->var->gpi_pin_row_base)); + } else { + evt_mode2 |= + ((1 << (pin - kpad->var->gpi_pin_col_base)) & 0xFF); + if (!kpad->is_adp5585) + evt_mode3 |= ((1 << (pin - + kpad->var->gpi_pin_col_base)) >> 8); + } + } + + if (pdata->gpimapsize) { + ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_A), + evt_mode1); + ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_B), + evt_mode2); + if (!kpad->is_adp5585) + ret |= adp5589_write(client, + reg(ADP5589_GPI_EVENT_EN_C), + evt_mode3); + } + + if (pdata->pull_dis_mask & pdata->pullup_en_100k & + pdata->pullup_en_300k & pdata->pulldown_en_300k) + dev_warn(&client->dev, "Conflicting pull resistor config\n"); + + for (i = 0; i <= kpad->var->max_row_num; i++) { + unsigned val = 0, bit = (1 << i); + if (pdata->pullup_en_300k & bit) + val = 0; + else if (pdata->pulldown_en_300k & bit) + val = 1; + else if (pdata->pullup_en_100k & bit) + val = 2; + else if (pdata->pull_dis_mask & bit) + val = 3; + + pull_mask |= val << (2 * (i & 0x3)); + + if (i == 3 || i == kpad->var->max_row_num) { + ret |= adp5589_write(client, reg(ADP5585_RPULL_CONFIG_A) + + (i >> 2), pull_mask); + pull_mask = 0; + } + } + + for (i = 0; i <= kpad->var->max_col_num; i++) { + unsigned val = 0, bit = 1 << (i + kpad->var->col_shift); + if (pdata->pullup_en_300k & bit) + val = 0; + else if (pdata->pulldown_en_300k & bit) + val = 1; + else if (pdata->pullup_en_100k & bit) + val = 2; + else if (pdata->pull_dis_mask & bit) + val = 3; + + pull_mask |= val << (2 * (i & 0x3)); + + if (i == 3 || i == kpad->var->max_col_num) { + ret |= adp5589_write(client, + reg(ADP5585_RPULL_CONFIG_C) + + (i >> 2), pull_mask); + pull_mask = 0; + } + } + + if (pdata->reset1_key_1 && pdata->reset1_key_2 && pdata->reset1_key_3) { + ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_A), + adp5589_get_evcode(kpad, + pdata->reset1_key_1)); + ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_B), + adp5589_get_evcode(kpad, + pdata->reset1_key_2)); + ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_C), + adp5589_get_evcode(kpad, + pdata->reset1_key_3)); + kpad->extend_cfg |= R4_EXTEND_CFG; + } + + if (pdata->reset2_key_1 && pdata->reset2_key_2) { + ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_A), + adp5589_get_evcode(kpad, + pdata->reset2_key_1)); + ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_B), + adp5589_get_evcode(kpad, + pdata->reset2_key_2)); + kpad->extend_cfg |= C4_EXTEND_CFG; + } + + if (kpad->extend_cfg) { + ret |= adp5589_write(client, reg(ADP5589_RESET_CFG), + pdata->reset_cfg); + ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_D), + kpad->extend_cfg); + } + + ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_A), + pdata->debounce_dis_mask & kpad->var->row_mask); + + ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_B), + (pdata->debounce_dis_mask >> kpad->var->col_shift) + & kpad->var->col_mask); + + if (!kpad->is_adp5585) + ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_C), + (pdata->debounce_dis_mask >> 16) & 0xFF); + + ret |= adp5589_write(client, reg(ADP5589_POLL_PTIME_CFG), + pdata->scan_cycle_time & PTIME_MASK); + ret |= adp5589_write(client, ADP5589_5_INT_STATUS, + (kpad->is_adp5585 ? 0 : LOGIC2_INT) | + LOGIC1_INT | OVRFLOW_INT | + (kpad->is_adp5585 ? 0 : LOCK_INT) | + GPI_INT | EVENT_INT); /* Status is W1C */ + + ret |= adp5589_write(client, reg(ADP5589_GENERAL_CFG), + INT_CFG | OSC_EN | CORE_CLK(3)); + ret |= adp5589_write(client, reg(ADP5589_INT_EN), + OVRFLOW_IEN | GPI_IEN | EVENT_IEN); + + if (ret < 0) { + dev_err(&client->dev, "Write Error\n"); + return ret; + } + + return 0; +} + +static void adp5589_report_switch_state(struct adp5589_kpad *kpad) +{ + int gpi_stat_tmp, pin_loc; + int i; + int gpi_stat1 = adp5589_read(kpad->client, + kpad->var->reg(ADP5589_GPI_STATUS_A)); + int gpi_stat2 = adp5589_read(kpad->client, + kpad->var->reg(ADP5589_GPI_STATUS_B)); + int gpi_stat3 = !kpad->is_adp5585 ? + adp5589_read(kpad->client, ADP5589_GPI_STATUS_C) : 0; + + for (i = 0; i < kpad->gpimapsize; i++) { + unsigned short pin = kpad->gpimap[i].pin; + + if (pin <= kpad->var->gpi_pin_row_end) { + gpi_stat_tmp = gpi_stat1; + pin_loc = pin - kpad->var->gpi_pin_row_base; + } else if ((pin - kpad->var->gpi_pin_col_base) < 8) { + gpi_stat_tmp = gpi_stat2; + pin_loc = pin - kpad->var->gpi_pin_col_base; + } else { + gpi_stat_tmp = gpi_stat3; + pin_loc = pin - kpad->var->gpi_pin_col_base - 8; + } + + if (gpi_stat_tmp < 0) { + dev_err(&kpad->client->dev, + "Can't read GPIO_DAT_STAT switch %d, default to OFF\n", + pin); + gpi_stat_tmp = 0; + } + + input_report_switch(kpad->input, + kpad->gpimap[i].sw_evt, + !(gpi_stat_tmp & (1 << pin_loc))); + } + + input_sync(kpad->input); +} + +static int adp5589_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct adp5589_kpad *kpad; + const struct adp5589_kpad_platform_data *pdata = + client->dev.platform_data; + struct input_dev *input; + unsigned int revid; + int ret, i; + int error; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); + return -EIO; + } + + if (!pdata) { + dev_err(&client->dev, "no platform data?\n"); + return -EINVAL; + } + + kpad = kzalloc(sizeof(*kpad), GFP_KERNEL); + if (!kpad) + return -ENOMEM; + + switch (id->driver_data) { + case ADP5585_02: + kpad->adp5585_support_row5 = true; + case ADP5585_01: + kpad->is_adp5585 = true; + kpad->var = &const_adp5585; + break; + case ADP5589: + kpad->var = &const_adp5589; + break; + } + + if (!((pdata->keypad_en_mask & kpad->var->row_mask) && + (pdata->keypad_en_mask >> kpad->var->col_shift)) || + !pdata->keymap) { + dev_err(&client->dev, "no rows, cols or keymap from pdata\n"); + error = -EINVAL; + goto err_free_mem; + } + + if (pdata->keymapsize != kpad->var->keymapsize) { + dev_err(&client->dev, "invalid keymapsize\n"); + error = -EINVAL; + goto err_free_mem; + } + + if (!pdata->gpimap && pdata->gpimapsize) { + dev_err(&client->dev, "invalid gpimap from pdata\n"); + error = -EINVAL; + goto err_free_mem; + } + + if (pdata->gpimapsize > kpad->var->gpimapsize_max) { + dev_err(&client->dev, "invalid gpimapsize\n"); + error = -EINVAL; + goto err_free_mem; + } + + for (i = 0; i < pdata->gpimapsize; i++) { + unsigned short pin = pdata->gpimap[i].pin; + + if (pin < kpad->var->gpi_pin_base || + pin > kpad->var->gpi_pin_end) { + dev_err(&client->dev, "invalid gpi pin data\n"); + error = -EINVAL; + goto err_free_mem; + } + + if ((1 << (pin - kpad->var->gpi_pin_row_base)) & + pdata->keypad_en_mask) { + dev_err(&client->dev, "invalid gpi row/col data\n"); + error = -EINVAL; + goto err_free_mem; + } + } + + if (!client->irq) { + dev_err(&client->dev, "no IRQ?\n"); + error = -EINVAL; + goto err_free_mem; + } + + input = input_allocate_device(); + if (!input) { + error = -ENOMEM; + goto err_free_mem; + } + + kpad->client = client; + kpad->input = input; + + ret = adp5589_read(client, ADP5589_5_ID); + if (ret < 0) { + error = ret; + goto err_free_input; + } + + revid = (u8) ret & ADP5589_5_DEVICE_ID_MASK; + + input->name = client->name; + input->phys = "adp5589-keys/input0"; + input->dev.parent = &client->dev; + + input_set_drvdata(input, kpad); + + input->id.bustype = BUS_I2C; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = revid; + + input->keycodesize = sizeof(kpad->keycode[0]); + input->keycodemax = pdata->keymapsize; + input->keycode = kpad->keycode; + + memcpy(kpad->keycode, pdata->keymap, + pdata->keymapsize * input->keycodesize); + + kpad->gpimap = pdata->gpimap; + kpad->gpimapsize = pdata->gpimapsize; + + /* setup input device */ + __set_bit(EV_KEY, input->evbit); + + if (pdata->repeat) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < input->keycodemax; i++) + __set_bit(kpad->keycode[i] & KEY_MAX, input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + if (kpad->gpimapsize) + __set_bit(EV_SW, input->evbit); + for (i = 0; i < kpad->gpimapsize; i++) + __set_bit(kpad->gpimap[i].sw_evt, input->swbit); + + error = input_register_device(input); + if (error) { + dev_err(&client->dev, "unable to register input device\n"); + goto err_free_input; + } + + error = request_threaded_irq(client->irq, NULL, adp5589_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, kpad); + if (error) { + dev_err(&client->dev, "irq %d busy?\n", client->irq); + goto err_unreg_dev; + } + + error = adp5589_setup(kpad); + if (error) + goto err_free_irq; + + if (kpad->gpimapsize) + adp5589_report_switch_state(kpad); + + error = adp5589_gpio_add(kpad); + if (error) + goto err_free_irq; + + device_init_wakeup(&client->dev, 1); + i2c_set_clientdata(client, kpad); + + dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client->irq); + return 0; + +err_free_irq: + free_irq(client->irq, kpad); +err_unreg_dev: + input_unregister_device(input); + input = NULL; +err_free_input: + input_free_device(input); +err_free_mem: + kfree(kpad); + + return error; +} + +static int adp5589_remove(struct i2c_client *client) +{ + struct adp5589_kpad *kpad = i2c_get_clientdata(client); + + adp5589_write(client, kpad->var->reg(ADP5589_GENERAL_CFG), 0); + free_irq(client->irq, kpad); + input_unregister_device(kpad->input); + adp5589_gpio_remove(kpad); + kfree(kpad); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int adp5589_suspend(struct device *dev) +{ + struct adp5589_kpad *kpad = dev_get_drvdata(dev); + struct i2c_client *client = kpad->client; + + disable_irq(client->irq); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int adp5589_resume(struct device *dev) +{ + struct adp5589_kpad *kpad = dev_get_drvdata(dev); + struct i2c_client *client = kpad->client; + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + enable_irq(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(adp5589_dev_pm_ops, adp5589_suspend, adp5589_resume); + +static const struct i2c_device_id adp5589_id[] = { + {"adp5589-keys", ADP5589}, + {"adp5585-keys", ADP5585_01}, + {"adp5585-02-keys", ADP5585_02}, /* Adds ROW5 to ADP5585 */ + {} +}; + +MODULE_DEVICE_TABLE(i2c, adp5589_id); + +static struct i2c_driver adp5589_driver = { + .driver = { + .name = KBUILD_MODNAME, + .owner = THIS_MODULE, + .pm = &adp5589_dev_pm_ops, + }, + .probe = adp5589_probe, + .remove = adp5589_remove, + .id_table = adp5589_id, +}; + +module_i2c_driver(adp5589_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("ADP5589/ADP5585 Keypad driver"); diff --git a/drivers/input/keyboard/amikbd.c b/drivers/input/keyboard/amikbd.c new file mode 100644 index 00000000..ba0b36f7 --- /dev/null +++ b/drivers/input/keyboard/amikbd.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + * + * Based on the work of: + * Hamish Macdonald + */ + +/* + * Amiga keyboard driver for Linux/m68k + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Amiga keyboard driver"); +MODULE_LICENSE("GPL"); + +static unsigned char amikbd_keycode[0x78] __initdata = { + [0] = KEY_GRAVE, + [1] = KEY_1, + [2] = KEY_2, + [3] = KEY_3, + [4] = KEY_4, + [5] = KEY_5, + [6] = KEY_6, + [7] = KEY_7, + [8] = KEY_8, + [9] = KEY_9, + [10] = KEY_0, + [11] = KEY_MINUS, + [12] = KEY_EQUAL, + [13] = KEY_BACKSLASH, + [15] = KEY_KP0, + [16] = KEY_Q, + [17] = KEY_W, + [18] = KEY_E, + [19] = KEY_R, + [20] = KEY_T, + [21] = KEY_Y, + [22] = KEY_U, + [23] = KEY_I, + [24] = KEY_O, + [25] = KEY_P, + [26] = KEY_LEFTBRACE, + [27] = KEY_RIGHTBRACE, + [29] = KEY_KP1, + [30] = KEY_KP2, + [31] = KEY_KP3, + [32] = KEY_A, + [33] = KEY_S, + [34] = KEY_D, + [35] = KEY_F, + [36] = KEY_G, + [37] = KEY_H, + [38] = KEY_J, + [39] = KEY_K, + [40] = KEY_L, + [41] = KEY_SEMICOLON, + [42] = KEY_APOSTROPHE, + [43] = KEY_BACKSLASH, + [45] = KEY_KP4, + [46] = KEY_KP5, + [47] = KEY_KP6, + [48] = KEY_102ND, + [49] = KEY_Z, + [50] = KEY_X, + [51] = KEY_C, + [52] = KEY_V, + [53] = KEY_B, + [54] = KEY_N, + [55] = KEY_M, + [56] = KEY_COMMA, + [57] = KEY_DOT, + [58] = KEY_SLASH, + [60] = KEY_KPDOT, + [61] = KEY_KP7, + [62] = KEY_KP8, + [63] = KEY_KP9, + [64] = KEY_SPACE, + [65] = KEY_BACKSPACE, + [66] = KEY_TAB, + [67] = KEY_KPENTER, + [68] = KEY_ENTER, + [69] = KEY_ESC, + [70] = KEY_DELETE, + [74] = KEY_KPMINUS, + [76] = KEY_UP, + [77] = KEY_DOWN, + [78] = KEY_RIGHT, + [79] = KEY_LEFT, + [80] = KEY_F1, + [81] = KEY_F2, + [82] = KEY_F3, + [83] = KEY_F4, + [84] = KEY_F5, + [85] = KEY_F6, + [86] = KEY_F7, + [87] = KEY_F8, + [88] = KEY_F9, + [89] = KEY_F10, + [90] = KEY_KPLEFTPAREN, + [91] = KEY_KPRIGHTPAREN, + [92] = KEY_KPSLASH, + [93] = KEY_KPASTERISK, + [94] = KEY_KPPLUS, + [95] = KEY_HELP, + [96] = KEY_LEFTSHIFT, + [97] = KEY_RIGHTSHIFT, + [98] = KEY_CAPSLOCK, + [99] = KEY_LEFTCTRL, + [100] = KEY_LEFTALT, + [101] = KEY_RIGHTALT, + [102] = KEY_LEFTMETA, + [103] = KEY_RIGHTMETA +}; + +static const char *amikbd_messages[8] = { + [0] = KERN_ALERT "amikbd: Ctrl-Amiga-Amiga reset warning!!\n", + [1] = KERN_WARNING "amikbd: keyboard lost sync\n", + [2] = KERN_WARNING "amikbd: keyboard buffer overflow\n", + [3] = KERN_WARNING "amikbd: keyboard controller failure\n", + [4] = KERN_ERR "amikbd: keyboard selftest failure\n", + [5] = KERN_INFO "amikbd: initiate power-up key stream\n", + [6] = KERN_INFO "amikbd: terminate power-up key stream\n", + [7] = KERN_WARNING "amikbd: keyboard interrupt\n" +}; + +static irqreturn_t amikbd_interrupt(int irq, void *data) +{ + struct input_dev *dev = data; + unsigned char scancode, down; + + scancode = ~ciaa.sdr; /* get and invert scancode (keyboard is active low) */ + ciaa.cra |= 0x40; /* switch SP pin to output for handshake */ + udelay(85); /* wait until 85 us have expired */ + ciaa.cra &= ~0x40; /* switch CIA serial port to input mode */ + + down = !(scancode & 1); /* lowest bit is release bit */ + scancode >>= 1; + + if (scancode < 0x78) { /* scancodes < 0x78 are keys */ + if (scancode == 98) { /* CapsLock is a toggle switch key on Amiga */ + input_report_key(dev, scancode, 1); + input_report_key(dev, scancode, 0); + } else { + input_report_key(dev, scancode, down); + } + + input_sync(dev); + } else /* scancodes >= 0x78 are error codes */ + printk(amikbd_messages[scancode - 0x78]); + + return IRQ_HANDLED; +} + +static int __init amikbd_probe(struct platform_device *pdev) +{ + struct input_dev *dev; + int i, j, err; + + dev = input_allocate_device(); + if (!dev) { + dev_err(&pdev->dev, "Not enough memory for input device\n"); + return -ENOMEM; + } + + dev->name = pdev->name; + dev->phys = "amikbd/input0"; + dev->id.bustype = BUS_AMIGA; + dev->id.vendor = 0x0001; + dev->id.product = 0x0001; + dev->id.version = 0x0100; + dev->dev.parent = &pdev->dev; + + dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + + for (i = 0; i < 0x78; i++) + set_bit(i, dev->keybit); + + for (i = 0; i < MAX_NR_KEYMAPS; i++) { + static u_short temp_map[NR_KEYS] __initdata; + if (!key_maps[i]) + continue; + memset(temp_map, 0, sizeof(temp_map)); + for (j = 0; j < 0x78; j++) { + if (!amikbd_keycode[j]) + continue; + temp_map[j] = key_maps[i][amikbd_keycode[j]]; + } + for (j = 0; j < NR_KEYS; j++) { + if (!temp_map[j]) + temp_map[j] = 0xf200; + } + memcpy(key_maps[i], temp_map, sizeof(temp_map)); + } + ciaa.cra &= ~0x41; /* serial data in, turn off TA */ + err = request_irq(IRQ_AMIGA_CIAA_SP, amikbd_interrupt, 0, "amikbd", + dev); + if (err) + goto fail2; + + err = input_register_device(dev); + if (err) + goto fail3; + + platform_set_drvdata(pdev, dev); + + return 0; + + fail3: free_irq(IRQ_AMIGA_CIAA_SP, dev); + fail2: input_free_device(dev); + return err; +} + +static int __exit amikbd_remove(struct platform_device *pdev) +{ + struct input_dev *dev = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + free_irq(IRQ_AMIGA_CIAA_SP, dev); + input_unregister_device(dev); + return 0; +} + +static struct platform_driver amikbd_driver = { + .remove = __exit_p(amikbd_remove), + .driver = { + .name = "amiga-keyboard", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver_probe(amikbd_driver, amikbd_probe); + +MODULE_ALIAS("platform:amiga-keyboard"); diff --git a/drivers/input/keyboard/atakbd.c b/drivers/input/keyboard/atakbd.c new file mode 100644 index 00000000..10bcd4ae --- /dev/null +++ b/drivers/input/keyboard/atakbd.c @@ -0,0 +1,269 @@ +/* + * atakbd.c + * + * Copyright (c) 2005 Michael Schmitz + * + * Based on amikbd.c, which is + * + * Copyright (c) 2000-2001 Vojtech Pavlik + * + * Based on the work of: + * Hamish Macdonald + */ + +/* + * Atari keyboard driver for Linux/m68k + * + * The low level init and interrupt stuff is handled in arch/mm68k/atari/atakeyb.c + * (the keyboard ACIA also handles the mouse and joystick data, and the keyboard + * interrupt is shared with the MIDI ACIA so MIDI data also get handled there). + * This driver only deals with handing key events off to the input layer. + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +MODULE_AUTHOR("Michael Schmitz "); +MODULE_DESCRIPTION("Atari keyboard driver"); +MODULE_LICENSE("GPL"); + +/* + 0x47: KP_7 71 + 0x48: KP_8 72 + 0x49: KP_9 73 + 0x62: KP_/ 98 + 0x4b: KP_4 75 + 0x4c: KP_5 76 + 0x4d: KP_6 77 + 0x37: KP_* 55 + 0x4f: KP_1 79 + 0x50: KP_2 80 + 0x51: KP_3 81 + 0x4a: KP_- 74 + 0x52: KP_0 82 + 0x53: KP_. 83 + 0x4e: KP_+ 78 + + 0x67: Up 103 + 0x6c: Down 108 + 0x69: Left 105 + 0x6a: Right 106 + */ + + +static unsigned char atakbd_keycode[0x72] = { /* American layout */ + [0] = KEY_GRAVE, + [1] = KEY_ESC, + [2] = KEY_1, + [3] = KEY_2, + [4] = KEY_3, + [5] = KEY_4, + [6] = KEY_5, + [7] = KEY_6, + [8] = KEY_7, + [9] = KEY_8, + [10] = KEY_9, + [11] = KEY_0, + [12] = KEY_MINUS, + [13] = KEY_EQUAL, + [14] = KEY_BACKSPACE, + [15] = KEY_TAB, + [16] = KEY_Q, + [17] = KEY_W, + [18] = KEY_E, + [19] = KEY_R, + [20] = KEY_T, + [21] = KEY_Y, + [22] = KEY_U, + [23] = KEY_I, + [24] = KEY_O, + [25] = KEY_P, + [26] = KEY_LEFTBRACE, + [27] = KEY_RIGHTBRACE, + [28] = KEY_ENTER, + [29] = KEY_LEFTCTRL, + [30] = KEY_A, + [31] = KEY_S, + [32] = KEY_D, + [33] = KEY_F, + [34] = KEY_G, + [35] = KEY_H, + [36] = KEY_J, + [37] = KEY_K, + [38] = KEY_L, + [39] = KEY_SEMICOLON, + [40] = KEY_APOSTROPHE, + [41] = KEY_BACKSLASH, /* FIXME, '#' */ + [42] = KEY_LEFTSHIFT, + [43] = KEY_GRAVE, /* FIXME: '~' */ + [44] = KEY_Z, + [45] = KEY_X, + [46] = KEY_C, + [47] = KEY_V, + [48] = KEY_B, + [49] = KEY_N, + [50] = KEY_M, + [51] = KEY_COMMA, + [52] = KEY_DOT, + [53] = KEY_SLASH, + [54] = KEY_RIGHTSHIFT, + [55] = KEY_KPASTERISK, + [56] = KEY_LEFTALT, + [57] = KEY_SPACE, + [58] = KEY_CAPSLOCK, + [59] = KEY_F1, + [60] = KEY_F2, + [61] = KEY_F3, + [62] = KEY_F4, + [63] = KEY_F5, + [64] = KEY_F6, + [65] = KEY_F7, + [66] = KEY_F8, + [67] = KEY_F9, + [68] = KEY_F10, + [69] = KEY_ESC, + [70] = KEY_DELETE, + [71] = KEY_KP7, + [72] = KEY_KP8, + [73] = KEY_KP9, + [74] = KEY_KPMINUS, + [75] = KEY_KP4, + [76] = KEY_KP5, + [77] = KEY_KP6, + [78] = KEY_KPPLUS, + [79] = KEY_KP1, + [80] = KEY_KP2, + [81] = KEY_KP3, + [82] = KEY_KP0, + [83] = KEY_KPDOT, + [90] = KEY_KPLEFTPAREN, + [91] = KEY_KPRIGHTPAREN, + [92] = KEY_KPASTERISK, /* FIXME */ + [93] = KEY_KPASTERISK, + [94] = KEY_KPPLUS, + [95] = KEY_HELP, + [96] = KEY_BACKSLASH, /* FIXME: '<' */ + [97] = KEY_KPASTERISK, /* FIXME */ + [98] = KEY_KPSLASH, + [99] = KEY_KPLEFTPAREN, + [100] = KEY_KPRIGHTPAREN, + [101] = KEY_KPSLASH, + [102] = KEY_KPASTERISK, + [103] = KEY_UP, + [104] = KEY_KPASTERISK, /* FIXME */ + [105] = KEY_LEFT, + [106] = KEY_RIGHT, + [107] = KEY_KPASTERISK, /* FIXME */ + [108] = KEY_DOWN, + [109] = KEY_KPASTERISK, /* FIXME */ + [110] = KEY_KPASTERISK, /* FIXME */ + [111] = KEY_KPASTERISK, /* FIXME */ + [112] = KEY_KPASTERISK, /* FIXME */ + [113] = KEY_KPASTERISK /* FIXME */ +}; + +static struct input_dev *atakbd_dev; + +static void atakbd_interrupt(unsigned char scancode, char down) +{ + + if (scancode < 0x72) { /* scancodes < 0xf2 are keys */ + + // report raw events here? + + scancode = atakbd_keycode[scancode]; + + if (scancode == KEY_CAPSLOCK) { /* CapsLock is a toggle switch key on Amiga */ + input_report_key(atakbd_dev, scancode, 1); + input_report_key(atakbd_dev, scancode, 0); + input_sync(atakbd_dev); + } else { + input_report_key(atakbd_dev, scancode, down); + input_sync(atakbd_dev); + } + } else /* scancodes >= 0xf2 are mouse data, most likely */ + printk(KERN_INFO "atakbd: unhandled scancode %x\n", scancode); + + return; +} + +static int __init atakbd_init(void) +{ + int i, error; + + if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) + return -ENODEV; + + // need to init core driver if not already done so + error = atari_keyb_init(); + if (error) + return error; + + atakbd_dev = input_allocate_device(); + if (!atakbd_dev) + return -ENOMEM; + + atakbd_dev->name = "Atari Keyboard"; + atakbd_dev->phys = "atakbd/input0"; + atakbd_dev->id.bustype = BUS_HOST; + atakbd_dev->id.vendor = 0x0001; + atakbd_dev->id.product = 0x0001; + atakbd_dev->id.version = 0x0100; + + atakbd_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + atakbd_dev->keycode = atakbd_keycode; + atakbd_dev->keycodesize = sizeof(unsigned char); + atakbd_dev->keycodemax = ARRAY_SIZE(atakbd_keycode); + + for (i = 1; i < 0x72; i++) { + set_bit(atakbd_keycode[i], atakbd_dev->keybit); + } + + /* error check */ + error = input_register_device(atakbd_dev); + if (error) { + input_free_device(atakbd_dev); + return error; + } + + atari_input_keyboard_interrupt_hook = atakbd_interrupt; + + return 0; +} + +static void __exit atakbd_exit(void) +{ + atari_input_keyboard_interrupt_hook = NULL; + input_unregister_device(atakbd_dev); +} + +module_init(atakbd_init); +module_exit(atakbd_exit); diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c new file mode 100644 index 00000000..6f5d7956 --- /dev/null +++ b/drivers/input/keyboard/atkbd.c @@ -0,0 +1,1813 @@ +/* + * AT and PS/2 keyboard driver + * + * Copyright (c) 1999-2002 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * This driver can handle standard AT keyboards and PS/2 keyboards in + * Translated and Raw Set 2 and Set 3, as well as AT keyboards on dumb + * input-only controllers and AT keyboards connected over a one way RS232 + * converter. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "AT and PS/2 keyboard driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +static int atkbd_set = 2; +module_param_named(set, atkbd_set, int, 0); +MODULE_PARM_DESC(set, "Select keyboard code set (2 = default, 3 = PS/2 native)"); + +#if defined(__i386__) || defined(__x86_64__) || defined(__hppa__) +static bool atkbd_reset; +#else +static bool atkbd_reset = true; +#endif +module_param_named(reset, atkbd_reset, bool, 0); +MODULE_PARM_DESC(reset, "Reset keyboard during initialization"); + +static bool atkbd_softrepeat; +module_param_named(softrepeat, atkbd_softrepeat, bool, 0); +MODULE_PARM_DESC(softrepeat, "Use software keyboard repeat"); + +static bool atkbd_softraw = true; +module_param_named(softraw, atkbd_softraw, bool, 0); +MODULE_PARM_DESC(softraw, "Use software generated rawmode"); + +static bool atkbd_scroll; +module_param_named(scroll, atkbd_scroll, bool, 0); +MODULE_PARM_DESC(scroll, "Enable scroll-wheel on MS Office and similar keyboards"); + +static bool atkbd_extra; +module_param_named(extra, atkbd_extra, bool, 0); +MODULE_PARM_DESC(extra, "Enable extra LEDs and keys on IBM RapidAcces, EzKey and similar keyboards"); + +static bool atkbd_terminal; +module_param_named(terminal, atkbd_terminal, bool, 0); +MODULE_PARM_DESC(terminal, "Enable break codes on an IBM Terminal keyboard connected via AT/PS2"); + +/* + * Scancode to keycode tables. These are just the default setting, and + * are loadable via a userland utility. + */ + +#define ATKBD_KEYMAP_SIZE 512 + +static const unsigned short atkbd_set2_keycode[ATKBD_KEYMAP_SIZE] = { + +#ifdef CONFIG_KEYBOARD_ATKBD_HP_KEYCODES + +/* XXX: need a more general approach */ + +#include "hpps2atkbd.h" /* include the keyboard scancodes */ + +#else + 0, 67, 65, 63, 61, 59, 60, 88, 0, 68, 66, 64, 62, 15, 41,117, + 0, 56, 42, 93, 29, 16, 2, 0, 0, 0, 44, 31, 30, 17, 3, 0, + 0, 46, 45, 32, 18, 5, 4, 95, 0, 57, 47, 33, 20, 19, 6,183, + 0, 49, 48, 35, 34, 21, 7,184, 0, 0, 50, 36, 22, 8, 9,185, + 0, 51, 37, 23, 24, 11, 10, 0, 0, 52, 53, 38, 39, 25, 12, 0, + 0, 89, 40, 0, 26, 13, 0, 0, 58, 54, 28, 27, 0, 43, 0, 85, + 0, 86, 91, 90, 92, 0, 14, 94, 0, 79,124, 75, 71,121, 0, 0, + 82, 83, 80, 76, 77, 72, 1, 69, 87, 78, 81, 74, 55, 73, 70, 99, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 217,100,255, 0, 97,165, 0, 0,156, 0, 0, 0, 0, 0, 0,125, + 173,114, 0,113, 0, 0, 0,126,128, 0, 0,140, 0, 0, 0,127, + 159, 0,115, 0,164, 0, 0,116,158, 0,172,166, 0, 0, 0,142, + 157, 0, 0, 0, 0, 0, 0, 0,155, 0, 98, 0, 0,163, 0, 0, + 226, 0, 0, 0, 0, 0, 0, 0, 0,255, 96, 0, 0, 0,143, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,107, 0,105,102, 0, 0,112, + 110,111,108,112,106,103, 0,119, 0,118,109, 0, 99,104,119, 0, + + 0, 0, 0, 65, 99, +#endif +}; + +static const unsigned short atkbd_set3_keycode[ATKBD_KEYMAP_SIZE] = { + + 0, 0, 0, 0, 0, 0, 0, 59, 1,138,128,129,130, 15, 41, 60, + 131, 29, 42, 86, 58, 16, 2, 61,133, 56, 44, 31, 30, 17, 3, 62, + 134, 46, 45, 32, 18, 5, 4, 63,135, 57, 47, 33, 20, 19, 6, 64, + 136, 49, 48, 35, 34, 21, 7, 65,137,100, 50, 36, 22, 8, 9, 66, + 125, 51, 37, 23, 24, 11, 10, 67,126, 52, 53, 38, 39, 25, 12, 68, + 113,114, 40, 43, 26, 13, 87, 99, 97, 54, 28, 27, 43, 43, 88, 70, + 108,105,119,103,111,107, 14,110, 0, 79,106, 75, 71,109,102,104, + 82, 83, 80, 76, 77, 72, 69, 98, 0, 96, 81, 0, 78, 73, 55,183, + + 184,185,186,187, 74, 94, 92, 93, 0, 0, 0,125,126,127,112, 0, + 0,139,172,163,165,115,152,172,166,140,160,154,113,114,167,168, + 148,149,147,140 +}; + +static const unsigned short atkbd_unxlate_table[128] = { + 0,118, 22, 30, 38, 37, 46, 54, 61, 62, 70, 69, 78, 85,102, 13, + 21, 29, 36, 45, 44, 53, 60, 67, 68, 77, 84, 91, 90, 20, 28, 27, + 35, 43, 52, 51, 59, 66, 75, 76, 82, 14, 18, 93, 26, 34, 33, 42, + 50, 49, 58, 65, 73, 74, 89,124, 17, 41, 88, 5, 6, 4, 12, 3, + 11, 2, 10, 1, 9,119,126,108,117,125,123,107,115,116,121,105, + 114,122,112,113,127, 96, 97,120, 7, 15, 23, 31, 39, 47, 55, 63, + 71, 79, 86, 94, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 87,111, + 19, 25, 57, 81, 83, 92, 95, 98, 99,100,101,103,104,106,109,110 +}; + +#define ATKBD_CMD_SETLEDS 0x10ed +#define ATKBD_CMD_GSCANSET 0x11f0 +#define ATKBD_CMD_SSCANSET 0x10f0 +#define ATKBD_CMD_GETID 0x02f2 +#define ATKBD_CMD_SETREP 0x10f3 +#define ATKBD_CMD_ENABLE 0x00f4 +#define ATKBD_CMD_RESET_DIS 0x00f5 /* Reset to defaults and disable */ +#define ATKBD_CMD_RESET_DEF 0x00f6 /* Reset to defaults */ +#define ATKBD_CMD_SETALL_MB 0x00f8 /* Set all keys to give break codes */ +#define ATKBD_CMD_SETALL_MBR 0x00fa /* ... and repeat */ +#define ATKBD_CMD_RESET_BAT 0x02ff +#define ATKBD_CMD_RESEND 0x00fe +#define ATKBD_CMD_EX_ENABLE 0x10ea +#define ATKBD_CMD_EX_SETLEDS 0x20eb +#define ATKBD_CMD_OK_GETID 0x02e8 + +#define ATKBD_RET_ACK 0xfa +#define ATKBD_RET_NAK 0xfe +#define ATKBD_RET_BAT 0xaa +#define ATKBD_RET_EMUL0 0xe0 +#define ATKBD_RET_EMUL1 0xe1 +#define ATKBD_RET_RELEASE 0xf0 +#define ATKBD_RET_HANJA 0xf1 +#define ATKBD_RET_HANGEUL 0xf2 +#define ATKBD_RET_ERR 0xff + +#define ATKBD_KEY_UNKNOWN 0 +#define ATKBD_KEY_NULL 255 + +#define ATKBD_SCR_1 0xfffe +#define ATKBD_SCR_2 0xfffd +#define ATKBD_SCR_4 0xfffc +#define ATKBD_SCR_8 0xfffb +#define ATKBD_SCR_CLICK 0xfffa +#define ATKBD_SCR_LEFT 0xfff9 +#define ATKBD_SCR_RIGHT 0xfff8 + +#define ATKBD_SPECIAL ATKBD_SCR_RIGHT + +#define ATKBD_LED_EVENT_BIT 0 +#define ATKBD_REP_EVENT_BIT 1 + +#define ATKBD_XL_ERR 0x01 +#define ATKBD_XL_BAT 0x02 +#define ATKBD_XL_ACK 0x04 +#define ATKBD_XL_NAK 0x08 +#define ATKBD_XL_HANGEUL 0x10 +#define ATKBD_XL_HANJA 0x20 + +static const struct { + unsigned short keycode; + unsigned char set2; +} atkbd_scroll_keys[] = { + { ATKBD_SCR_1, 0xc5 }, + { ATKBD_SCR_2, 0x9d }, + { ATKBD_SCR_4, 0xa4 }, + { ATKBD_SCR_8, 0x9b }, + { ATKBD_SCR_CLICK, 0xe0 }, + { ATKBD_SCR_LEFT, 0xcb }, + { ATKBD_SCR_RIGHT, 0xd2 }, +}; + +/* + * The atkbd control structure + */ + +struct atkbd { + + struct ps2dev ps2dev; + struct input_dev *dev; + + /* Written only during init */ + char name[64]; + char phys[32]; + + unsigned short id; + unsigned short keycode[ATKBD_KEYMAP_SIZE]; + DECLARE_BITMAP(force_release_mask, ATKBD_KEYMAP_SIZE); + unsigned char set; + bool translated; + bool extra; + bool write; + bool softrepeat; + bool softraw; + bool scroll; + bool enabled; + + /* Accessed only from interrupt */ + unsigned char emul; + bool resend; + bool release; + unsigned long xl_bit; + unsigned int last; + unsigned long time; + unsigned long err_count; + + struct delayed_work event_work; + unsigned long event_jiffies; + unsigned long event_mask; + + /* Serializes reconnect(), attr->set() and event work */ + struct mutex mutex; +}; + +/* + * System-specific keymap fixup routine + */ +static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); +static void *atkbd_platform_fixup_data; +static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); + +/* + * Certain keyboards to not like ATKBD_CMD_RESET_DIS and stop responding + * to many commands until full reset (ATKBD_CMD_RESET_BAT) is performed. + */ +static bool atkbd_skip_deactivate; + +static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, + ssize_t (*handler)(struct atkbd *, char *)); +static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, + ssize_t (*handler)(struct atkbd *, const char *, size_t)); +#define ATKBD_DEFINE_ATTR(_name) \ +static ssize_t atkbd_show_##_name(struct atkbd *, char *); \ +static ssize_t atkbd_set_##_name(struct atkbd *, const char *, size_t); \ +static ssize_t atkbd_do_show_##_name(struct device *d, \ + struct device_attribute *attr, char *b) \ +{ \ + return atkbd_attr_show_helper(d, b, atkbd_show_##_name); \ +} \ +static ssize_t atkbd_do_set_##_name(struct device *d, \ + struct device_attribute *attr, const char *b, size_t s) \ +{ \ + return atkbd_attr_set_helper(d, b, s, atkbd_set_##_name); \ +} \ +static struct device_attribute atkbd_attr_##_name = \ + __ATTR(_name, S_IWUSR | S_IRUGO, atkbd_do_show_##_name, atkbd_do_set_##_name); + +ATKBD_DEFINE_ATTR(extra); +ATKBD_DEFINE_ATTR(force_release); +ATKBD_DEFINE_ATTR(scroll); +ATKBD_DEFINE_ATTR(set); +ATKBD_DEFINE_ATTR(softrepeat); +ATKBD_DEFINE_ATTR(softraw); + +#define ATKBD_DEFINE_RO_ATTR(_name) \ +static ssize_t atkbd_show_##_name(struct atkbd *, char *); \ +static ssize_t atkbd_do_show_##_name(struct device *d, \ + struct device_attribute *attr, char *b) \ +{ \ + return atkbd_attr_show_helper(d, b, atkbd_show_##_name); \ +} \ +static struct device_attribute atkbd_attr_##_name = \ + __ATTR(_name, S_IRUGO, atkbd_do_show_##_name, NULL); + +ATKBD_DEFINE_RO_ATTR(err_count); + +static struct attribute *atkbd_attributes[] = { + &atkbd_attr_extra.attr, + &atkbd_attr_force_release.attr, + &atkbd_attr_scroll.attr, + &atkbd_attr_set.attr, + &atkbd_attr_softrepeat.attr, + &atkbd_attr_softraw.attr, + &atkbd_attr_err_count.attr, + NULL +}; + +static struct attribute_group atkbd_attribute_group = { + .attrs = atkbd_attributes, +}; + +static const unsigned int xl_table[] = { + ATKBD_RET_BAT, ATKBD_RET_ERR, ATKBD_RET_ACK, + ATKBD_RET_NAK, ATKBD_RET_HANJA, ATKBD_RET_HANGEUL, +}; + +/* + * Checks if we should mangle the scancode to extract 'release' bit + * in translated mode. + */ +static bool atkbd_need_xlate(unsigned long xl_bit, unsigned char code) +{ + int i; + + if (code == ATKBD_RET_EMUL0 || code == ATKBD_RET_EMUL1) + return false; + + for (i = 0; i < ARRAY_SIZE(xl_table); i++) + if (code == xl_table[i]) + return test_bit(i, &xl_bit); + + return true; +} + +/* + * Calculates new value of xl_bit so the driver can distinguish + * between make/break pair of scancodes for select keys and PS/2 + * protocol responses. + */ +static void atkbd_calculate_xl_bit(struct atkbd *atkbd, unsigned char code) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(xl_table); i++) { + if (!((code ^ xl_table[i]) & 0x7f)) { + if (code & 0x80) + __clear_bit(i, &atkbd->xl_bit); + else + __set_bit(i, &atkbd->xl_bit); + break; + } + } +} + +/* + * Encode the scancode, 0xe0 prefix, and high bit into a single integer, + * keeping kernel 2.4 compatibility for set 2 + */ +static unsigned int atkbd_compat_scancode(struct atkbd *atkbd, unsigned int code) +{ + if (atkbd->set == 3) { + if (atkbd->emul == 1) + code |= 0x100; + } else { + code = (code & 0x7f) | ((code & 0x80) << 1); + if (atkbd->emul == 1) + code |= 0x80; + } + + return code; +} + +/* + * atkbd_interrupt(). Here takes place processing of data received from + * the keyboard into events. + */ + +static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, + unsigned int flags) +{ + struct atkbd *atkbd = serio_get_drvdata(serio); + struct input_dev *dev = atkbd->dev; + unsigned int code = data; + int scroll = 0, hscroll = 0, click = -1; + int value; + unsigned short keycode; + + dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, flags); + +#if !defined(__i386__) && !defined (__x86_64__) + if ((flags & (SERIO_FRAME | SERIO_PARITY)) && (~flags & SERIO_TIMEOUT) && !atkbd->resend && atkbd->write) { + dev_warn(&serio->dev, "Frame/parity error: %02x\n", flags); + serio_write(serio, ATKBD_CMD_RESEND); + atkbd->resend = true; + goto out; + } + + if (!flags && data == ATKBD_RET_ACK) + atkbd->resend = false; +#endif + + if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_ACK)) + if (ps2_handle_ack(&atkbd->ps2dev, data)) + goto out; + + if (unlikely(atkbd->ps2dev.flags & PS2_FLAG_CMD)) + if (ps2_handle_response(&atkbd->ps2dev, data)) + goto out; + + if (!atkbd->enabled) + goto out; + + input_event(dev, EV_MSC, MSC_RAW, code); + + if (atkbd_platform_scancode_fixup) + code = atkbd_platform_scancode_fixup(atkbd, code); + + if (atkbd->translated) { + + if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) { + atkbd->release = code >> 7; + code &= 0x7f; + } + + if (!atkbd->emul) + atkbd_calculate_xl_bit(atkbd, data); + } + + switch (code) { + case ATKBD_RET_BAT: + atkbd->enabled = false; + serio_reconnect(atkbd->ps2dev.serio); + goto out; + case ATKBD_RET_EMUL0: + atkbd->emul = 1; + goto out; + case ATKBD_RET_EMUL1: + atkbd->emul = 2; + goto out; + case ATKBD_RET_RELEASE: + atkbd->release = true; + goto out; + case ATKBD_RET_ACK: + case ATKBD_RET_NAK: + if (printk_ratelimit()) + dev_warn(&serio->dev, + "Spurious %s on %s. " + "Some program might be trying to access hardware directly.\n", + data == ATKBD_RET_ACK ? "ACK" : "NAK", serio->phys); + goto out; + case ATKBD_RET_ERR: + atkbd->err_count++; + dev_dbg(&serio->dev, "Keyboard on %s reports too many keys pressed.\n", + serio->phys); + goto out; + } + + code = atkbd_compat_scancode(atkbd, code); + + if (atkbd->emul && --atkbd->emul) + goto out; + + keycode = atkbd->keycode[code]; + + if (keycode != ATKBD_KEY_NULL) + input_event(dev, EV_MSC, MSC_SCAN, code); + + switch (keycode) { + case ATKBD_KEY_NULL: + break; + case ATKBD_KEY_UNKNOWN: + dev_warn(&serio->dev, + "Unknown key %s (%s set %d, code %#x on %s).\n", + atkbd->release ? "released" : "pressed", + atkbd->translated ? "translated" : "raw", + atkbd->set, code, serio->phys); + dev_warn(&serio->dev, + "Use 'setkeycodes %s%02x ' to make it known.\n", + code & 0x80 ? "e0" : "", code & 0x7f); + input_sync(dev); + break; + case ATKBD_SCR_1: + scroll = 1; + break; + case ATKBD_SCR_2: + scroll = 2; + break; + case ATKBD_SCR_4: + scroll = 4; + break; + case ATKBD_SCR_8: + scroll = 8; + break; + case ATKBD_SCR_CLICK: + click = !atkbd->release; + break; + case ATKBD_SCR_LEFT: + hscroll = -1; + break; + case ATKBD_SCR_RIGHT: + hscroll = 1; + break; + default: + if (atkbd->release) { + value = 0; + atkbd->last = 0; + } else if (!atkbd->softrepeat && test_bit(keycode, dev->key)) { + /* Workaround Toshiba laptop multiple keypress */ + value = time_before(jiffies, atkbd->time) && atkbd->last == code ? 1 : 2; + } else { + value = 1; + atkbd->last = code; + atkbd->time = jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]) / 2; + } + + input_event(dev, EV_KEY, keycode, value); + input_sync(dev); + + if (value && test_bit(code, atkbd->force_release_mask)) { + input_report_key(dev, keycode, 0); + input_sync(dev); + } + } + + if (atkbd->scroll) { + if (click != -1) + input_report_key(dev, BTN_MIDDLE, click); + input_report_rel(dev, REL_WHEEL, + atkbd->release ? -scroll : scroll); + input_report_rel(dev, REL_HWHEEL, hscroll); + input_sync(dev); + } + + atkbd->release = false; +out: + return IRQ_HANDLED; +} + +static int atkbd_set_repeat_rate(struct atkbd *atkbd) +{ + const short period[32] = + { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, + 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 }; + const short delay[4] = + { 250, 500, 750, 1000 }; + + struct input_dev *dev = atkbd->dev; + unsigned char param; + int i = 0, j = 0; + + while (i < ARRAY_SIZE(period) - 1 && period[i] < dev->rep[REP_PERIOD]) + i++; + dev->rep[REP_PERIOD] = period[i]; + + while (j < ARRAY_SIZE(delay) - 1 && delay[j] < dev->rep[REP_DELAY]) + j++; + dev->rep[REP_DELAY] = delay[j]; + + param = i | (j << 5); + return ps2_command(&atkbd->ps2dev, ¶m, ATKBD_CMD_SETREP); +} + +static int atkbd_set_leds(struct atkbd *atkbd) +{ + struct input_dev *dev = atkbd->dev; + unsigned char param[2]; + + param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) + | (test_bit(LED_NUML, dev->led) ? 2 : 0) + | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); + if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS)) + return -1; + + if (atkbd->extra) { + param[0] = 0; + param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) + | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) + | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) + | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) + | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); + if (ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS)) + return -1; + } + + return 0; +} + +/* + * atkbd_event_work() is used to complete processing of events that + * can not be processed by input_event() which is often called from + * interrupt context. + */ + +static void atkbd_event_work(struct work_struct *work) +{ + struct atkbd *atkbd = container_of(work, struct atkbd, event_work.work); + + mutex_lock(&atkbd->mutex); + + if (!atkbd->enabled) { + /* + * Serio ports are resumed asynchronously so while driver core + * thinks that device is already fully operational in reality + * it may not be ready yet. In this case we need to keep + * rescheduling till reconnect completes. + */ + schedule_delayed_work(&atkbd->event_work, + msecs_to_jiffies(100)); + } else { + if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) + atkbd_set_leds(atkbd); + + if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) + atkbd_set_repeat_rate(atkbd); + } + + mutex_unlock(&atkbd->mutex); +} + +/* + * Schedule switch for execution. We need to throttle requests, + * otherwise keyboard may become unresponsive. + */ +static void atkbd_schedule_event_work(struct atkbd *atkbd, int event_bit) +{ + unsigned long delay = msecs_to_jiffies(50); + + if (time_after(jiffies, atkbd->event_jiffies + delay)) + delay = 0; + + atkbd->event_jiffies = jiffies; + set_bit(event_bit, &atkbd->event_mask); + mb(); + schedule_delayed_work(&atkbd->event_work, delay); +} + +/* + * Event callback from the input module. Events that change the state of + * the hardware are processed here. If action can not be performed in + * interrupt context it is offloaded to atkbd_event_work. + */ + +static int atkbd_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + struct atkbd *atkbd = input_get_drvdata(dev); + + if (!atkbd->write) + return -1; + + switch (type) { + + case EV_LED: + atkbd_schedule_event_work(atkbd, ATKBD_LED_EVENT_BIT); + return 0; + + case EV_REP: + if (!atkbd->softrepeat) + atkbd_schedule_event_work(atkbd, ATKBD_REP_EVENT_BIT); + return 0; + + default: + return -1; + } +} + +/* + * atkbd_enable() signals that interrupt handler is allowed to + * generate input events. + */ + +static inline void atkbd_enable(struct atkbd *atkbd) +{ + serio_pause_rx(atkbd->ps2dev.serio); + atkbd->enabled = true; + serio_continue_rx(atkbd->ps2dev.serio); +} + +/* + * atkbd_disable() tells input handler that all incoming data except + * for ACKs and command response should be dropped. + */ + +static inline void atkbd_disable(struct atkbd *atkbd) +{ + serio_pause_rx(atkbd->ps2dev.serio); + atkbd->enabled = false; + serio_continue_rx(atkbd->ps2dev.serio); +} + +static int atkbd_activate(struct atkbd *atkbd) +{ + struct ps2dev *ps2dev = &atkbd->ps2dev; + +/* + * Enable the keyboard to receive keystrokes. + */ + + if (ps2_command(ps2dev, NULL, ATKBD_CMD_ENABLE)) { + dev_err(&ps2dev->serio->dev, + "Failed to enable keyboard on %s\n", + ps2dev->serio->phys); + return -1; + } + + return 0; +} + +/* + * atkbd_deactivate() resets and disables the keyboard from sending + * keystrokes. + */ + +static void atkbd_deactivate(struct atkbd *atkbd) +{ + struct ps2dev *ps2dev = &atkbd->ps2dev; + + if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_DIS)) + dev_err(&ps2dev->serio->dev, + "Failed to deactivate keyboard on %s\n", + ps2dev->serio->phys); +} + +/* + * atkbd_probe() probes for an AT keyboard on a serio port. + */ + +static int atkbd_probe(struct atkbd *atkbd) +{ + struct ps2dev *ps2dev = &atkbd->ps2dev; + unsigned char param[2]; + +/* + * Some systems, where the bit-twiddling when testing the io-lines of the + * controller may confuse the keyboard need a full reset of the keyboard. On + * these systems the BIOS also usually doesn't do it for us. + */ + + if (atkbd_reset) + if (ps2_command(ps2dev, NULL, ATKBD_CMD_RESET_BAT)) + dev_warn(&ps2dev->serio->dev, + "keyboard reset failed on %s\n", + ps2dev->serio->phys); + +/* + * Then we check the keyboard ID. We should get 0xab83 under normal conditions. + * Some keyboards report different values, but the first byte is always 0xab or + * 0xac. Some old AT keyboards don't report anything. If a mouse is connected, this + * should make sure we don't try to set the LEDs on it. + */ + + param[0] = param[1] = 0xa5; /* initialize with invalid values */ + if (ps2_command(ps2dev, param, ATKBD_CMD_GETID)) { + +/* + * If the get ID command failed, we check if we can at least set the LEDs on + * the keyboard. This should work on every keyboard out there. It also turns + * the LEDs off, which we want anyway. + */ + param[0] = 0; + if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) + return -1; + atkbd->id = 0xabba; + return 0; + } + + if (!ps2_is_keyboard_id(param[0])) + return -1; + + atkbd->id = (param[0] << 8) | param[1]; + + if (atkbd->id == 0xaca1 && atkbd->translated) { + dev_err(&ps2dev->serio->dev, + "NCD terminal keyboards are only supported on non-translating controllers. " + "Use i8042.direct=1 to disable translation.\n"); + return -1; + } + +/* + * Make sure nothing is coming from the keyboard and disturbs our + * internal state. + */ + if (!atkbd_skip_deactivate) + atkbd_deactivate(atkbd); + + return 0; +} + +/* + * atkbd_select_set checks if a keyboard has a working Set 3 support, and + * sets it into that. Unfortunately there are keyboards that can be switched + * to Set 3, but don't work well in that (BTC Multimedia ...) + */ + +static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra) +{ + struct ps2dev *ps2dev = &atkbd->ps2dev; + unsigned char param[2]; + + atkbd->extra = false; +/* + * For known special keyboards we can go ahead and set the correct set. + * We check for NCD PS/2 Sun, NorthGate OmniKey 101 and + * IBM RapidAccess / IBM EzButton / Chicony KBP-8993 keyboards. + */ + + if (atkbd->translated) + return 2; + + if (atkbd->id == 0xaca1) { + param[0] = 3; + ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET); + return 3; + } + + if (allow_extra) { + param[0] = 0x71; + if (!ps2_command(ps2dev, param, ATKBD_CMD_EX_ENABLE)) { + atkbd->extra = true; + return 2; + } + } + + if (atkbd_terminal) { + ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MB); + return 3; + } + + if (target_set != 3) + return 2; + + if (!ps2_command(ps2dev, param, ATKBD_CMD_OK_GETID)) { + atkbd->id = param[0] << 8 | param[1]; + return 2; + } + + param[0] = 3; + if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET)) + return 2; + + param[0] = 0; + if (ps2_command(ps2dev, param, ATKBD_CMD_GSCANSET)) + return 2; + + if (param[0] != 3) { + param[0] = 2; + if (ps2_command(ps2dev, param, ATKBD_CMD_SSCANSET)) + return 2; + } + + ps2_command(ps2dev, param, ATKBD_CMD_SETALL_MBR); + + return 3; +} + +static int atkbd_reset_state(struct atkbd *atkbd) +{ + struct ps2dev *ps2dev = &atkbd->ps2dev; + unsigned char param[1]; + +/* + * Set the LEDs to a predefined state (all off). + */ + + param[0] = 0; + if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) + return -1; + +/* + * Set autorepeat to fastest possible. + */ + + param[0] = 0; + if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP)) + return -1; + + return 0; +} + +/* + * atkbd_cleanup() restores the keyboard state so that BIOS is happy after a + * reboot. + */ + +static void atkbd_cleanup(struct serio *serio) +{ + struct atkbd *atkbd = serio_get_drvdata(serio); + + atkbd_disable(atkbd); + ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_DEF); +} + + +/* + * atkbd_disconnect() closes and frees. + */ + +static void atkbd_disconnect(struct serio *serio) +{ + struct atkbd *atkbd = serio_get_drvdata(serio); + + sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); + + atkbd_disable(atkbd); + + input_unregister_device(atkbd->dev); + + /* + * Make sure we don't have a command in flight. + * Note that since atkbd->enabled is false event work will keep + * rescheduling itself until it gets canceled and will not try + * accessing freed input device or serio port. + */ + cancel_delayed_work_sync(&atkbd->event_work); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + kfree(atkbd); +} + +/* + * generate release events for the keycodes given in data + */ +static void atkbd_apply_forced_release_keylist(struct atkbd* atkbd, + const void *data) +{ + const unsigned int *keys = data; + unsigned int i; + + if (atkbd->set == 2) + for (i = 0; keys[i] != -1U; i++) + __set_bit(keys[i], atkbd->force_release_mask); +} + +/* + * Most special keys (Fn+F?) on Dell laptops do not generate release + * events so we have to do it ourselves. + */ +static unsigned int atkbd_dell_laptop_forced_release_keys[] = { + 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93, -1U +}; + +/* + * Perform fixup for HP system that doesn't generate release + * for its video switch + */ +static unsigned int atkbd_hp_forced_release_keys[] = { + 0x94, -1U +}; + +/* + * Samsung NC10,NC20 with Fn+F? key release not working + */ +static unsigned int atkbd_samsung_forced_release_keys[] = { + 0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9, -1U +}; + +/* + * Amilo Pi 3525 key release for Fn+Volume keys not working + */ +static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = { + 0x20, 0xa0, 0x2e, 0xae, 0x30, 0xb0, -1U +}; + +/* + * Amilo Xi 3650 key release for light touch bar not working + */ +static unsigned int atkbd_amilo_xi3650_forced_release_keys[] = { + 0x67, 0xed, 0x90, 0xa2, 0x99, 0xa4, 0xae, 0xb0, -1U +}; + +/* + * Soltech TA12 system with broken key release on volume keys and mute key + */ +static unsigned int atkdb_soltech_ta12_forced_release_keys[] = { + 0xa0, 0xae, 0xb0, -1U +}; + +/* + * Many notebooks don't send key release event for volume up/down + * keys, with key list below common among them + */ +static unsigned int atkbd_volume_forced_release_keys[] = { + 0xae, 0xb0, -1U +}; + +/* + * OQO 01+ multimedia keys (64--66) generate e0 6x upon release whereas + * they should be generating e4-e6 (0x80 | code). + */ +static unsigned int atkbd_oqo_01plus_scancode_fixup(struct atkbd *atkbd, + unsigned int code) +{ + if (atkbd->translated && atkbd->emul == 1 && + (code == 0x64 || code == 0x65 || code == 0x66)) { + atkbd->emul = 0; + code |= 0x80; + } + + return code; +} + +/* + * atkbd_set_keycode_table() initializes keyboard's keycode table + * according to the selected scancode set + */ + +static void atkbd_set_keycode_table(struct atkbd *atkbd) +{ + unsigned int scancode; + int i, j; + + memset(atkbd->keycode, 0, sizeof(atkbd->keycode)); + bitmap_zero(atkbd->force_release_mask, ATKBD_KEYMAP_SIZE); + + if (atkbd->translated) { + for (i = 0; i < 128; i++) { + scancode = atkbd_unxlate_table[i]; + atkbd->keycode[i] = atkbd_set2_keycode[scancode]; + atkbd->keycode[i | 0x80] = atkbd_set2_keycode[scancode | 0x80]; + if (atkbd->scroll) + for (j = 0; j < ARRAY_SIZE(atkbd_scroll_keys); j++) + if ((scancode | 0x80) == atkbd_scroll_keys[j].set2) + atkbd->keycode[i | 0x80] = atkbd_scroll_keys[j].keycode; + } + } else if (atkbd->set == 3) { + memcpy(atkbd->keycode, atkbd_set3_keycode, sizeof(atkbd->keycode)); + } else { + memcpy(atkbd->keycode, atkbd_set2_keycode, sizeof(atkbd->keycode)); + + if (atkbd->scroll) + for (i = 0; i < ARRAY_SIZE(atkbd_scroll_keys); i++) { + scancode = atkbd_scroll_keys[i].set2; + atkbd->keycode[scancode] = atkbd_scroll_keys[i].keycode; + } + } + +/* + * HANGEUL and HANJA keys do not send release events so we need to + * generate such events ourselves + */ + scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANGEUL); + atkbd->keycode[scancode] = KEY_HANGEUL; + __set_bit(scancode, atkbd->force_release_mask); + + scancode = atkbd_compat_scancode(atkbd, ATKBD_RET_HANJA); + atkbd->keycode[scancode] = KEY_HANJA; + __set_bit(scancode, atkbd->force_release_mask); + +/* + * Perform additional fixups + */ + if (atkbd_platform_fixup) + atkbd_platform_fixup(atkbd, atkbd_platform_fixup_data); +} + +/* + * atkbd_set_device_attrs() sets up keyboard's input device structure + */ + +static void atkbd_set_device_attrs(struct atkbd *atkbd) +{ + struct input_dev *input_dev = atkbd->dev; + int i; + + if (atkbd->extra) + snprintf(atkbd->name, sizeof(atkbd->name), + "AT Set 2 Extra keyboard"); + else + snprintf(atkbd->name, sizeof(atkbd->name), + "AT %s Set %d keyboard", + atkbd->translated ? "Translated" : "Raw", atkbd->set); + + snprintf(atkbd->phys, sizeof(atkbd->phys), + "%s/input0", atkbd->ps2dev.serio->phys); + + input_dev->name = atkbd->name; + input_dev->phys = atkbd->phys; + input_dev->id.bustype = BUS_I8042; + input_dev->id.vendor = 0x0001; + input_dev->id.product = atkbd->translated ? 1 : atkbd->set; + input_dev->id.version = atkbd->id; + input_dev->event = atkbd_event; + input_dev->dev.parent = &atkbd->ps2dev.serio->dev; + + input_set_drvdata(input_dev, atkbd); + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | + BIT_MASK(EV_MSC); + + if (atkbd->write) { + input_dev->evbit[0] |= BIT_MASK(EV_LED); + input_dev->ledbit[0] = BIT_MASK(LED_NUML) | + BIT_MASK(LED_CAPSL) | BIT_MASK(LED_SCROLLL); + } + + if (atkbd->extra) + input_dev->ledbit[0] |= BIT_MASK(LED_COMPOSE) | + BIT_MASK(LED_SUSPEND) | BIT_MASK(LED_SLEEP) | + BIT_MASK(LED_MUTE) | BIT_MASK(LED_MISC); + + if (!atkbd->softrepeat) { + input_dev->rep[REP_DELAY] = 250; + input_dev->rep[REP_PERIOD] = 33; + } + + input_dev->mscbit[0] = atkbd->softraw ? BIT_MASK(MSC_SCAN) : + BIT_MASK(MSC_RAW) | BIT_MASK(MSC_SCAN); + + if (atkbd->scroll) { + input_dev->evbit[0] |= BIT_MASK(EV_REL); + input_dev->relbit[0] = BIT_MASK(REL_WHEEL) | + BIT_MASK(REL_HWHEEL); + __set_bit(BTN_MIDDLE, input_dev->keybit); + } + + input_dev->keycode = atkbd->keycode; + input_dev->keycodesize = sizeof(unsigned short); + input_dev->keycodemax = ARRAY_SIZE(atkbd_set2_keycode); + + for (i = 0; i < ATKBD_KEYMAP_SIZE; i++) { + if (atkbd->keycode[i] != KEY_RESERVED && + atkbd->keycode[i] != ATKBD_KEY_NULL && + atkbd->keycode[i] < ATKBD_SPECIAL) { + __set_bit(atkbd->keycode[i], input_dev->keybit); + } + } +} + +/* + * atkbd_connect() is called when the serio module finds an interface + * that isn't handled yet by an appropriate device driver. We check if + * there is an AT keyboard out there and if yes, we register ourselves + * to the input module. + */ + +static int atkbd_connect(struct serio *serio, struct serio_driver *drv) +{ + struct atkbd *atkbd; + struct input_dev *dev; + int err = -ENOMEM; + + atkbd = kzalloc(sizeof(struct atkbd), GFP_KERNEL); + dev = input_allocate_device(); + if (!atkbd || !dev) + goto fail1; + + atkbd->dev = dev; + ps2_init(&atkbd->ps2dev, serio); + INIT_DELAYED_WORK(&atkbd->event_work, atkbd_event_work); + mutex_init(&atkbd->mutex); + + switch (serio->id.type) { + + case SERIO_8042_XL: + atkbd->translated = true; + /* Fall through */ + + case SERIO_8042: + if (serio->write) + atkbd->write = true; + break; + } + + atkbd->softraw = atkbd_softraw; + atkbd->softrepeat = atkbd_softrepeat; + atkbd->scroll = atkbd_scroll; + + if (atkbd->softrepeat) + atkbd->softraw = true; + + serio_set_drvdata(serio, atkbd); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + if (atkbd->write) { + + if (atkbd_probe(atkbd)) { + err = -ENODEV; + goto fail3; + } + + atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra); + atkbd_reset_state(atkbd); + + } else { + atkbd->set = 2; + atkbd->id = 0xab00; + } + + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + err = sysfs_create_group(&serio->dev.kobj, &atkbd_attribute_group); + if (err) + goto fail3; + + atkbd_enable(atkbd); + if (serio->write) + atkbd_activate(atkbd); + + err = input_register_device(atkbd->dev); + if (err) + goto fail4; + + return 0; + + fail4: sysfs_remove_group(&serio->dev.kobj, &atkbd_attribute_group); + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(dev); + kfree(atkbd); + return err; +} + +/* + * atkbd_reconnect() tries to restore keyboard into a sane state and is + * most likely called on resume. + */ + +static int atkbd_reconnect(struct serio *serio) +{ + struct atkbd *atkbd = serio_get_drvdata(serio); + struct serio_driver *drv = serio->drv; + int retval = -1; + + if (!atkbd || !drv) { + dev_dbg(&serio->dev, + "reconnect request, but serio is disconnected, ignoring...\n"); + return -1; + } + + mutex_lock(&atkbd->mutex); + + atkbd_disable(atkbd); + + if (atkbd->write) { + if (atkbd_probe(atkbd)) + goto out; + + if (atkbd->set != atkbd_select_set(atkbd, atkbd->set, atkbd->extra)) + goto out; + + /* + * Restore LED state and repeat rate. While input core + * will do this for us at resume time reconnect may happen + * because user requested it via sysfs or simply because + * keyboard was unplugged and plugged in again so we need + * to do it ourselves here. + */ + atkbd_set_leds(atkbd); + if (!atkbd->softrepeat) + atkbd_set_repeat_rate(atkbd); + + } + + /* + * Reset our state machine in case reconnect happened in the middle + * of multi-byte scancode. + */ + atkbd->xl_bit = 0; + atkbd->emul = 0; + + atkbd_enable(atkbd); + if (atkbd->write) + atkbd_activate(atkbd); + + retval = 0; + + out: + mutex_unlock(&atkbd->mutex); + return retval; +} + +static struct serio_device_id atkbd_serio_ids[] = { + { + .type = SERIO_8042, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_8042_XL, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_PS2SER, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, atkbd_serio_ids); + +static struct serio_driver atkbd_drv = { + .driver = { + .name = "atkbd", + }, + .description = DRIVER_DESC, + .id_table = atkbd_serio_ids, + .interrupt = atkbd_interrupt, + .connect = atkbd_connect, + .reconnect = atkbd_reconnect, + .disconnect = atkbd_disconnect, + .cleanup = atkbd_cleanup, +}; + +static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, + ssize_t (*handler)(struct atkbd *, char *)) +{ + struct serio *serio = to_serio_port(dev); + struct atkbd *atkbd = serio_get_drvdata(serio); + + return handler(atkbd, buf); +} + +static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, + ssize_t (*handler)(struct atkbd *, const char *, size_t)) +{ + struct serio *serio = to_serio_port(dev); + struct atkbd *atkbd = serio_get_drvdata(serio); + int retval; + + retval = mutex_lock_interruptible(&atkbd->mutex); + if (retval) + return retval; + + atkbd_disable(atkbd); + retval = handler(atkbd, buf, count); + atkbd_enable(atkbd); + + mutex_unlock(&atkbd->mutex); + + return retval; +} + +static ssize_t atkbd_show_extra(struct atkbd *atkbd, char *buf) +{ + return sprintf(buf, "%d\n", atkbd->extra ? 1 : 0); +} + +static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t count) +{ + struct input_dev *old_dev, *new_dev; + unsigned int value; + int err; + bool old_extra; + unsigned char old_set; + + if (!atkbd->write) + return -EIO; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (atkbd->extra != value) { + /* + * Since device's properties will change we need to + * unregister old device. But allocate and register + * new one first to make sure we have it. + */ + old_dev = atkbd->dev; + old_extra = atkbd->extra; + old_set = atkbd->set; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + atkbd->dev = new_dev; + atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); + atkbd_reset_state(atkbd); + atkbd_activate(atkbd); + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + err = input_register_device(atkbd->dev); + if (err) { + input_free_device(new_dev); + + atkbd->dev = old_dev; + atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + return err; + } + input_unregister_device(old_dev); + + } + return count; +} + +static ssize_t atkbd_show_force_release(struct atkbd *atkbd, char *buf) +{ + size_t len = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, + atkbd->force_release_mask, ATKBD_KEYMAP_SIZE); + + buf[len++] = '\n'; + buf[len] = '\0'; + + return len; +} + +static ssize_t atkbd_set_force_release(struct atkbd *atkbd, + const char *buf, size_t count) +{ + /* 64 bytes on stack should be acceptable */ + DECLARE_BITMAP(new_mask, ATKBD_KEYMAP_SIZE); + int err; + + err = bitmap_parselist(buf, new_mask, ATKBD_KEYMAP_SIZE); + if (err) + return err; + + memcpy(atkbd->force_release_mask, new_mask, sizeof(atkbd->force_release_mask)); + return count; +} + + +static ssize_t atkbd_show_scroll(struct atkbd *atkbd, char *buf) +{ + return sprintf(buf, "%d\n", atkbd->scroll ? 1 : 0); +} + +static ssize_t atkbd_set_scroll(struct atkbd *atkbd, const char *buf, size_t count) +{ + struct input_dev *old_dev, *new_dev; + unsigned int value; + int err; + bool old_scroll; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (atkbd->scroll != value) { + old_dev = atkbd->dev; + old_scroll = atkbd->scroll; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + atkbd->dev = new_dev; + atkbd->scroll = value; + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + err = input_register_device(atkbd->dev); + if (err) { + input_free_device(new_dev); + + atkbd->scroll = old_scroll; + atkbd->dev = old_dev; + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + return err; + } + input_unregister_device(old_dev); + } + return count; +} + +static ssize_t atkbd_show_set(struct atkbd *atkbd, char *buf) +{ + return sprintf(buf, "%d\n", atkbd->set); +} + +static ssize_t atkbd_set_set(struct atkbd *atkbd, const char *buf, size_t count) +{ + struct input_dev *old_dev, *new_dev; + unsigned int value; + int err; + unsigned char old_set; + bool old_extra; + + if (!atkbd->write) + return -EIO; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value != 2 && value != 3) + return -EINVAL; + + if (atkbd->set != value) { + old_dev = atkbd->dev; + old_extra = atkbd->extra; + old_set = atkbd->set; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + atkbd->dev = new_dev; + atkbd->set = atkbd_select_set(atkbd, value, atkbd->extra); + atkbd_reset_state(atkbd); + atkbd_activate(atkbd); + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + err = input_register_device(atkbd->dev); + if (err) { + input_free_device(new_dev); + + atkbd->dev = old_dev; + atkbd->set = atkbd_select_set(atkbd, old_set, old_extra); + atkbd_set_keycode_table(atkbd); + atkbd_set_device_attrs(atkbd); + + return err; + } + input_unregister_device(old_dev); + } + return count; +} + +static ssize_t atkbd_show_softrepeat(struct atkbd *atkbd, char *buf) +{ + return sprintf(buf, "%d\n", atkbd->softrepeat ? 1 : 0); +} + +static ssize_t atkbd_set_softrepeat(struct atkbd *atkbd, const char *buf, size_t count) +{ + struct input_dev *old_dev, *new_dev; + unsigned int value; + int err; + bool old_softrepeat, old_softraw; + + if (!atkbd->write) + return -EIO; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (atkbd->softrepeat != value) { + old_dev = atkbd->dev; + old_softrepeat = atkbd->softrepeat; + old_softraw = atkbd->softraw; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + atkbd->dev = new_dev; + atkbd->softrepeat = value; + if (atkbd->softrepeat) + atkbd->softraw = true; + atkbd_set_device_attrs(atkbd); + + err = input_register_device(atkbd->dev); + if (err) { + input_free_device(new_dev); + + atkbd->dev = old_dev; + atkbd->softrepeat = old_softrepeat; + atkbd->softraw = old_softraw; + atkbd_set_device_attrs(atkbd); + + return err; + } + input_unregister_device(old_dev); + } + return count; +} + + +static ssize_t atkbd_show_softraw(struct atkbd *atkbd, char *buf) +{ + return sprintf(buf, "%d\n", atkbd->softraw ? 1 : 0); +} + +static ssize_t atkbd_set_softraw(struct atkbd *atkbd, const char *buf, size_t count) +{ + struct input_dev *old_dev, *new_dev; + unsigned int value; + int err; + bool old_softraw; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (atkbd->softraw != value) { + old_dev = atkbd->dev; + old_softraw = atkbd->softraw; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + atkbd->dev = new_dev; + atkbd->softraw = value; + atkbd_set_device_attrs(atkbd); + + err = input_register_device(atkbd->dev); + if (err) { + input_free_device(new_dev); + + atkbd->dev = old_dev; + atkbd->softraw = old_softraw; + atkbd_set_device_attrs(atkbd); + + return err; + } + input_unregister_device(old_dev); + } + return count; +} + +static ssize_t atkbd_show_err_count(struct atkbd *atkbd, char *buf) +{ + return sprintf(buf, "%lu\n", atkbd->err_count); +} + +static int __init atkbd_setup_forced_release(const struct dmi_system_id *id) +{ + atkbd_platform_fixup = atkbd_apply_forced_release_keylist; + atkbd_platform_fixup_data = id->driver_data; + + return 1; +} + +static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id) +{ + atkbd_platform_scancode_fixup = id->driver_data; + + return 1; +} + +static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id) +{ + atkbd_skip_deactivate = true; + return 1; +} + +static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_dell_laptop_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"), + DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_dell_laptop_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP 2133"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_hp_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_volume_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_volume_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_volume_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_volume_forced_release_keys, + }, + { + /* Inventec Symphony */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"), + DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_volume_forced_release_keys, + }, + { + /* Samsung NC10 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), + DMI_MATCH(DMI_PRODUCT_NAME, "NC10"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_samsung_forced_release_keys, + }, + { + /* Samsung NC20 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), + DMI_MATCH(DMI_PRODUCT_NAME, "NC20"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_samsung_forced_release_keys, + }, + { + /* Samsung SQ45S70S */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), + DMI_MATCH(DMI_PRODUCT_NAME, "SQ45S70S"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_samsung_forced_release_keys, + }, + { + /* Fujitsu Amilo PA 1510 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_volume_forced_release_keys, + }, + { + /* Fujitsu Amilo Pi 3525 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 3525"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_amilo_pi3525_forced_release_keys, + }, + { + /* Fujitsu Amilo Xi 3650 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 3650"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkbd_amilo_xi3650_forced_release_keys, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Soltech Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "TA12"), + }, + .callback = atkbd_setup_forced_release, + .driver_data = atkdb_soltech_ta12_forced_release_keys, + }, + { + /* OQO Model 01+ */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "OQO"), + DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), + }, + .callback = atkbd_setup_scancode_fixup, + .driver_data = atkbd_oqo_01plus_scancode_fixup, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), + }, + .callback = atkbd_deactivate_fixup, + }, + { } +}; + +static int __init atkbd_init(void) +{ + dmi_check_system(atkbd_dmi_quirk_table); + + return serio_register_driver(&atkbd_drv); +} + +static void __exit atkbd_exit(void) +{ + serio_unregister_driver(&atkbd_drv); +} + +module_init(atkbd_init); +module_exit(atkbd_exit); diff --git a/drivers/input/keyboard/bf54x-keys.c b/drivers/input/keyboard/bf54x-keys.c new file mode 100644 index 00000000..20b9fa91 --- /dev/null +++ b/drivers/input/keyboard/bf54x-keys.c @@ -0,0 +1,402 @@ +/* + * File: drivers/input/keyboard/bf54x-keys.c + * Based on: + * Author: Michael Hennerich + * + * Created: + * Description: keypad driver for Analog Devices Blackfin BF54x Processors + * + * + * Modified: + * Copyright 2007-2008 Analog Devices Inc. + * + * Bugs: Enter bugs at http://blackfin.uclinux.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see the file COPYING, or write + * to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define DRV_NAME "bf54x-keys" +#define TIME_SCALE 100 /* 100 ns */ +#define MAX_MULT (0xFF * TIME_SCALE) +#define MAX_RC 8 /* Max Row/Col */ + +static const u16 per_rows[] = { + P_KEY_ROW7, + P_KEY_ROW6, + P_KEY_ROW5, + P_KEY_ROW4, + P_KEY_ROW3, + P_KEY_ROW2, + P_KEY_ROW1, + P_KEY_ROW0, + 0 +}; + +static const u16 per_cols[] = { + P_KEY_COL7, + P_KEY_COL6, + P_KEY_COL5, + P_KEY_COL4, + P_KEY_COL3, + P_KEY_COL2, + P_KEY_COL1, + P_KEY_COL0, + 0 +}; + +struct bf54x_kpad { + struct input_dev *input; + int irq; + unsigned short lastkey; + unsigned short *keycode; + struct timer_list timer; + unsigned int keyup_test_jiffies; + unsigned short kpad_msel; + unsigned short kpad_prescale; + unsigned short kpad_ctl; +}; + +static inline int bfin_kpad_find_key(struct bf54x_kpad *bf54x_kpad, + struct input_dev *input, u16 keyident) +{ + u16 i; + + for (i = 0; i < input->keycodemax; i++) + if (bf54x_kpad->keycode[i + input->keycodemax] == keyident) + return bf54x_kpad->keycode[i]; + return -1; +} + +static inline void bfin_keycodecpy(unsigned short *keycode, + const unsigned int *pdata_kc, + unsigned short keymapsize) +{ + unsigned int i; + + for (i = 0; i < keymapsize; i++) { + keycode[i] = pdata_kc[i] & 0xffff; + keycode[i + keymapsize] = pdata_kc[i] >> 16; + } +} + +static inline u16 bfin_kpad_get_prescale(u32 timescale) +{ + u32 sclk = get_sclk(); + + return ((((sclk / 1000) * timescale) / 1024) - 1); +} + +static inline u16 bfin_kpad_get_keypressed(struct bf54x_kpad *bf54x_kpad) +{ + return (bfin_read_KPAD_STAT() & KPAD_PRESSED); +} + +static inline void bfin_kpad_clear_irq(void) +{ + bfin_write_KPAD_STAT(0xFFFF); + bfin_write_KPAD_ROWCOL(0xFFFF); +} + +static void bfin_kpad_timer(unsigned long data) +{ + struct platform_device *pdev = (struct platform_device *) data; + struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); + + if (bfin_kpad_get_keypressed(bf54x_kpad)) { + /* Try again later */ + mod_timer(&bf54x_kpad->timer, + jiffies + bf54x_kpad->keyup_test_jiffies); + return; + } + + input_report_key(bf54x_kpad->input, bf54x_kpad->lastkey, 0); + input_sync(bf54x_kpad->input); + + /* Clear IRQ Status */ + + bfin_kpad_clear_irq(); + enable_irq(bf54x_kpad->irq); +} + +static irqreturn_t bfin_kpad_isr(int irq, void *dev_id) +{ + struct platform_device *pdev = dev_id; + struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); + struct input_dev *input = bf54x_kpad->input; + int key; + u16 rowcol = bfin_read_KPAD_ROWCOL(); + + key = bfin_kpad_find_key(bf54x_kpad, input, rowcol); + + input_report_key(input, key, 1); + input_sync(input); + + if (bfin_kpad_get_keypressed(bf54x_kpad)) { + disable_irq_nosync(bf54x_kpad->irq); + bf54x_kpad->lastkey = key; + mod_timer(&bf54x_kpad->timer, + jiffies + bf54x_kpad->keyup_test_jiffies); + } else { + input_report_key(input, key, 0); + input_sync(input); + + bfin_kpad_clear_irq(); + } + + return IRQ_HANDLED; +} + +static int bfin_kpad_probe(struct platform_device *pdev) +{ + struct bf54x_kpad *bf54x_kpad; + struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; + struct input_dev *input; + int i, error; + + if (!pdata->rows || !pdata->cols || !pdata->keymap) { + dev_err(&pdev->dev, "no rows, cols or keymap from pdata\n"); + return -EINVAL; + } + + if (!pdata->keymapsize || + pdata->keymapsize > (pdata->rows * pdata->cols)) { + dev_err(&pdev->dev, "invalid keymapsize\n"); + return -EINVAL; + } + + bf54x_kpad = kzalloc(sizeof(struct bf54x_kpad), GFP_KERNEL); + if (!bf54x_kpad) + return -ENOMEM; + + platform_set_drvdata(pdev, bf54x_kpad); + + /* Allocate memory for keymap followed by private LUT */ + bf54x_kpad->keycode = kmalloc(pdata->keymapsize * + sizeof(unsigned short) * 2, GFP_KERNEL); + if (!bf54x_kpad->keycode) { + error = -ENOMEM; + goto out; + } + + if (!pdata->debounce_time || pdata->debounce_time > MAX_MULT || + !pdata->coldrive_time || pdata->coldrive_time > MAX_MULT) { + dev_warn(&pdev->dev, + "invalid platform debounce/columndrive time\n"); + bfin_write_KPAD_MSEL(0xFF0); /* Default MSEL */ + } else { + bfin_write_KPAD_MSEL( + ((pdata->debounce_time / TIME_SCALE) + & DBON_SCALE) | + (((pdata->coldrive_time / TIME_SCALE) << 8) + & COLDRV_SCALE)); + + } + + if (!pdata->keyup_test_interval) + bf54x_kpad->keyup_test_jiffies = msecs_to_jiffies(50); + else + bf54x_kpad->keyup_test_jiffies = + msecs_to_jiffies(pdata->keyup_test_interval); + + if (peripheral_request_list((u16 *)&per_rows[MAX_RC - pdata->rows], + DRV_NAME)) { + dev_err(&pdev->dev, "requesting peripherals failed\n"); + error = -EFAULT; + goto out0; + } + + if (peripheral_request_list((u16 *)&per_cols[MAX_RC - pdata->cols], + DRV_NAME)) { + dev_err(&pdev->dev, "requesting peripherals failed\n"); + error = -EFAULT; + goto out1; + } + + bf54x_kpad->irq = platform_get_irq(pdev, 0); + if (bf54x_kpad->irq < 0) { + error = -ENODEV; + goto out2; + } + + error = request_irq(bf54x_kpad->irq, bfin_kpad_isr, + 0, DRV_NAME, pdev); + if (error) { + dev_err(&pdev->dev, "unable to claim irq %d\n", + bf54x_kpad->irq); + goto out2; + } + + input = input_allocate_device(); + if (!input) { + error = -ENOMEM; + goto out3; + } + + bf54x_kpad->input = input; + + input->name = pdev->name; + input->phys = "bf54x-keys/input0"; + input->dev.parent = &pdev->dev; + + input_set_drvdata(input, bf54x_kpad); + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + input->keycodesize = sizeof(unsigned short); + input->keycodemax = pdata->keymapsize; + input->keycode = bf54x_kpad->keycode; + + bfin_keycodecpy(bf54x_kpad->keycode, pdata->keymap, pdata->keymapsize); + + /* setup input device */ + __set_bit(EV_KEY, input->evbit); + + if (pdata->repeat) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < input->keycodemax; i++) + __set_bit(bf54x_kpad->keycode[i] & KEY_MAX, input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, "unable to register input device\n"); + goto out4; + } + + /* Init Keypad Key Up/Release test timer */ + + setup_timer(&bf54x_kpad->timer, bfin_kpad_timer, (unsigned long) pdev); + + bfin_write_KPAD_PRESCALE(bfin_kpad_get_prescale(TIME_SCALE)); + + bfin_write_KPAD_CTL((((pdata->cols - 1) << 13) & KPAD_COLEN) | + (((pdata->rows - 1) << 10) & KPAD_ROWEN) | + (2 & KPAD_IRQMODE)); + + bfin_write_KPAD_CTL(bfin_read_KPAD_CTL() | KPAD_EN); + + device_init_wakeup(&pdev->dev, 1); + + return 0; + +out4: + input_free_device(input); +out3: + free_irq(bf54x_kpad->irq, pdev); +out2: + peripheral_free_list((u16 *)&per_cols[MAX_RC - pdata->cols]); +out1: + peripheral_free_list((u16 *)&per_rows[MAX_RC - pdata->rows]); +out0: + kfree(bf54x_kpad->keycode); +out: + kfree(bf54x_kpad); + platform_set_drvdata(pdev, NULL); + + return error; +} + +static int bfin_kpad_remove(struct platform_device *pdev) +{ + struct bfin_kpad_platform_data *pdata = pdev->dev.platform_data; + struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); + + del_timer_sync(&bf54x_kpad->timer); + free_irq(bf54x_kpad->irq, pdev); + + input_unregister_device(bf54x_kpad->input); + + peripheral_free_list((u16 *)&per_rows[MAX_RC - pdata->rows]); + peripheral_free_list((u16 *)&per_cols[MAX_RC - pdata->cols]); + + kfree(bf54x_kpad->keycode); + kfree(bf54x_kpad); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM +static int bfin_kpad_suspend(struct platform_device *pdev, pm_message_t state) +{ + struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); + + bf54x_kpad->kpad_msel = bfin_read_KPAD_MSEL(); + bf54x_kpad->kpad_prescale = bfin_read_KPAD_PRESCALE(); + bf54x_kpad->kpad_ctl = bfin_read_KPAD_CTL(); + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(bf54x_kpad->irq); + + return 0; +} + +static int bfin_kpad_resume(struct platform_device *pdev) +{ + struct bf54x_kpad *bf54x_kpad = platform_get_drvdata(pdev); + + bfin_write_KPAD_MSEL(bf54x_kpad->kpad_msel); + bfin_write_KPAD_PRESCALE(bf54x_kpad->kpad_prescale); + bfin_write_KPAD_CTL(bf54x_kpad->kpad_ctl); + + if (device_may_wakeup(&pdev->dev)) + disable_irq_wake(bf54x_kpad->irq); + + return 0; +} +#else +# define bfin_kpad_suspend NULL +# define bfin_kpad_resume NULL +#endif + +static struct platform_driver bfin_kpad_device_driver = { + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + }, + .probe = bfin_kpad_probe, + .remove = bfin_kpad_remove, + .suspend = bfin_kpad_suspend, + .resume = bfin_kpad_resume, +}; +module_platform_driver(bfin_kpad_device_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("Keypad driver for BF54x Processors"); +MODULE_ALIAS("platform:bf54x-keys"); diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c new file mode 100644 index 00000000..49557f27 --- /dev/null +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -0,0 +1,334 @@ +/* + * ChromeOS EC keyboard driver + * + * Copyright (C) 2012 Google, Inc + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This driver uses the Chrome OS EC byte-level message-based protocol for + * communicating the keyboard state (which keys are pressed) from a keyboard EC + * to the AP over some bus (such as i2c, lpc, spi). The EC does debouncing, + * but everything else (including deghosting) is done here. The main + * motivation for this is to keep the EC firmware as simple as possible, since + * it cannot be easily upgraded and EC flash/IRAM space is relatively + * expensive. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * @rows: Number of rows in the keypad + * @cols: Number of columns in the keypad + * @row_shift: log2 or number of rows, rounded up + * @keymap_data: Matrix keymap data used to convert to keyscan values + * @ghost_filter: true to enable the matrix key-ghosting filter + * @dev: Device pointer + * @idev: Input device + * @ec: Top level ChromeOS device to use to talk to EC + * @event_notifier: interrupt event notifier for transport devices + */ +struct cros_ec_keyb { + unsigned int rows; + unsigned int cols; + int row_shift; + const struct matrix_keymap_data *keymap_data; + bool ghost_filter; + + struct device *dev; + struct input_dev *idev; + struct cros_ec_device *ec; + struct notifier_block notifier; +}; + + +static bool cros_ec_keyb_row_has_ghosting(struct cros_ec_keyb *ckdev, + uint8_t *buf, int row) +{ + int pressed_in_row = 0; + int row_has_teeth = 0; + int col, mask; + + mask = 1 << row; + for (col = 0; col < ckdev->cols; col++) { + if (buf[col] & mask) { + pressed_in_row++; + row_has_teeth |= buf[col] & ~mask; + if (pressed_in_row > 1 && row_has_teeth) { + /* ghosting */ + dev_dbg(ckdev->dev, + "ghost found at: r%d c%d, pressed %d, teeth 0x%x\n", + row, col, pressed_in_row, + row_has_teeth); + return true; + } + } + } + + return false; +} + +/* + * Returns true when there is at least one combination of pressed keys that + * results in ghosting. + */ +static bool cros_ec_keyb_has_ghosting(struct cros_ec_keyb *ckdev, uint8_t *buf) +{ + int row; + + /* + * Ghosting happens if for any pressed key X there are other keys + * pressed both in the same row and column of X as, for instance, + * in the following diagram: + * + * . . Y . g . + * . . . . . . + * . . . . . . + * . . X . Z . + * + * In this case only X, Y, and Z are pressed, but g appears to be + * pressed too (see Wikipedia). + * + * We can detect ghosting in a single pass (*) over the keyboard state + * by maintaining two arrays. pressed_in_row counts how many pressed + * keys we have found in a row. row_has_teeth is true if any of the + * pressed keys for this row has other pressed keys in its column. If + * at any point of the scan we find that a row has multiple pressed + * keys, and at least one of them is at the intersection with a column + * with multiple pressed keys, we're sure there is ghosting. + * Conversely, if there is ghosting, we will detect such situation for + * at least one key during the pass. + * + * (*) This looks linear in the number of keys, but it's not. We can + * cheat because the number of rows is small. + */ + for (row = 0; row < ckdev->rows; row++) + if (cros_ec_keyb_row_has_ghosting(ckdev, buf, row)) + return true; + + return false; +} + +/* + * Compares the new keyboard state to the old one and produces key + * press/release events accordingly. The keyboard state is 13 bytes (one byte + * per column) + */ +static void cros_ec_keyb_process(struct cros_ec_keyb *ckdev, + uint8_t *kb_state, int len) +{ + struct input_dev *idev = ckdev->idev; + int col, row; + int new_state; + int num_cols; + + num_cols = len; + + if (ckdev->ghost_filter && cros_ec_keyb_has_ghosting(ckdev, kb_state)) { + /* + * Simple-minded solution: ignore this state. The obvious + * improvement is to only ignore changes to keys involved in + * the ghosting, but process the other changes. + */ + dev_dbg(ckdev->dev, "ghosting found\n"); + return; + } + + for (col = 0; col < ckdev->cols; col++) { + for (row = 0; row < ckdev->rows; row++) { + int pos = MATRIX_SCAN_CODE(row, col, ckdev->row_shift); + const unsigned short *keycodes = idev->keycode; + int code; + + code = keycodes[pos]; + new_state = kb_state[col] & (1 << row); + if (!!new_state != test_bit(code, idev->key)) { + dev_dbg(ckdev->dev, + "changed: [r%d c%d]: byte %02x\n", + row, col, new_state); + + input_report_key(idev, code, new_state); + } + } + } + input_sync(ckdev->idev); +} + +static int cros_ec_keyb_open(struct input_dev *dev) +{ + struct cros_ec_keyb *ckdev = input_get_drvdata(dev); + + return blocking_notifier_chain_register(&ckdev->ec->event_notifier, + &ckdev->notifier); +} + +static void cros_ec_keyb_close(struct input_dev *dev) +{ + struct cros_ec_keyb *ckdev = input_get_drvdata(dev); + + blocking_notifier_chain_unregister(&ckdev->ec->event_notifier, + &ckdev->notifier); +} + +static int cros_ec_keyb_get_state(struct cros_ec_keyb *ckdev, uint8_t *kb_state) +{ + return ckdev->ec->command_recv(ckdev->ec, EC_CMD_MKBP_STATE, + kb_state, ckdev->cols); +} + +static int cros_ec_keyb_work(struct notifier_block *nb, + unsigned long state, void *_notify) +{ + int ret; + struct cros_ec_keyb *ckdev = container_of(nb, struct cros_ec_keyb, + notifier); + uint8_t kb_state[ckdev->cols]; + + ret = cros_ec_keyb_get_state(ckdev, kb_state); + if (ret >= 0) + cros_ec_keyb_process(ckdev, kb_state, ret); + + return NOTIFY_DONE; +} + +/* Clear any keys in the buffer */ +static void cros_ec_keyb_clear_keyboard(struct cros_ec_keyb *ckdev) +{ + uint8_t old_state[ckdev->cols]; + uint8_t new_state[ckdev->cols]; + unsigned long duration; + int i, ret; + + /* + * Keep reading until we see that the scan state does not change. + * That indicates that we are done. + * + * Assume that the EC keyscan buffer is at most 32 deep. + */ + duration = jiffies; + ret = cros_ec_keyb_get_state(ckdev, new_state); + for (i = 1; !ret && i < 32; i++) { + memcpy(old_state, new_state, sizeof(old_state)); + ret = cros_ec_keyb_get_state(ckdev, new_state); + if (0 == memcmp(old_state, new_state, sizeof(old_state))) + break; + } + duration = jiffies - duration; + dev_info(ckdev->dev, "Discarded %d keyscan(s) in %dus\n", i, + jiffies_to_usecs(duration)); +} + +static int cros_ec_keyb_probe(struct platform_device *pdev) +{ + struct cros_ec_device *ec = dev_get_drvdata(pdev->dev.parent); + struct device *dev = ec->dev; + struct cros_ec_keyb *ckdev; + struct input_dev *idev; + struct device_node *np; + int err; + + np = pdev->dev.of_node; + if (!np) + return -ENODEV; + + ckdev = devm_kzalloc(&pdev->dev, sizeof(*ckdev), GFP_KERNEL); + if (!ckdev) + return -ENOMEM; + err = matrix_keypad_parse_of_params(&pdev->dev, &ckdev->rows, + &ckdev->cols); + if (err) + return err; + + idev = devm_input_allocate_device(&pdev->dev); + if (!idev) + return -ENOMEM; + + ckdev->ec = ec; + ckdev->notifier.notifier_call = cros_ec_keyb_work; + ckdev->dev = dev; + dev_set_drvdata(&pdev->dev, ckdev); + + idev->name = ec->ec_name; + idev->phys = ec->phys_name; + __set_bit(EV_REP, idev->evbit); + + idev->id.bustype = BUS_VIRTUAL; + idev->id.version = 1; + idev->id.product = 0; + idev->dev.parent = &pdev->dev; + idev->open = cros_ec_keyb_open; + idev->close = cros_ec_keyb_close; + + ckdev->ghost_filter = of_property_read_bool(np, + "google,needs-ghost-filter"); + + err = matrix_keypad_build_keymap(NULL, NULL, ckdev->rows, ckdev->cols, + NULL, idev); + if (err) { + dev_err(dev, "cannot build key matrix\n"); + return err; + } + + ckdev->row_shift = get_count_order(ckdev->cols); + + input_set_capability(idev, EV_MSC, MSC_SCAN); + input_set_drvdata(idev, ckdev); + ckdev->idev = idev; + err = input_register_device(ckdev->idev); + if (err) { + dev_err(dev, "cannot register input device\n"); + return err; + } + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int cros_ec_keyb_resume(struct device *dev) +{ + struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); + + /* + * When the EC is not a wake source, then it could not have caused the + * resume, so we clear the EC's key scan buffer. If the EC was a + * wake source (e.g. the lid is open and the user might press a key to + * wake) then the key scan buffer should be preserved. + */ + if (ckdev->ec->was_wake_device) + cros_ec_keyb_clear_keyboard(ckdev); + + return 0; +} + +#endif + +static SIMPLE_DEV_PM_OPS(cros_ec_keyb_pm_ops, NULL, cros_ec_keyb_resume); + +static struct platform_driver cros_ec_keyb_driver = { + .probe = cros_ec_keyb_probe, + .driver = { + .name = "cros-ec-keyb", + .pm = &cros_ec_keyb_pm_ops, + }, +}; + +module_platform_driver(cros_ec_keyb_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("ChromeOS EC keyboard driver"); +MODULE_ALIAS("platform:cros-ec-keyb"); diff --git a/drivers/input/keyboard/davinci_keyscan.c b/drivers/input/keyboard/davinci_keyscan.c new file mode 100644 index 00000000..82975370 --- /dev/null +++ b/drivers/input/keyboard/davinci_keyscan.c @@ -0,0 +1,336 @@ +/* + * DaVinci Key Scan Driver for TI platforms + * + * Copyright (C) 2009 Texas Instruments, Inc + * + * Author: Miguel Aguilar + * + * Initial Code: Sandeep Paulraj + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +/* Key scan registers */ +#define DAVINCI_KEYSCAN_KEYCTRL 0x0000 +#define DAVINCI_KEYSCAN_INTENA 0x0004 +#define DAVINCI_KEYSCAN_INTFLAG 0x0008 +#define DAVINCI_KEYSCAN_INTCLR 0x000c +#define DAVINCI_KEYSCAN_STRBWIDTH 0x0010 +#define DAVINCI_KEYSCAN_INTERVAL 0x0014 +#define DAVINCI_KEYSCAN_CONTTIME 0x0018 +#define DAVINCI_KEYSCAN_CURRENTST 0x001c +#define DAVINCI_KEYSCAN_PREVSTATE 0x0020 +#define DAVINCI_KEYSCAN_EMUCTRL 0x0024 +#define DAVINCI_KEYSCAN_IODFTCTRL 0x002c + +/* Key Control Register (KEYCTRL) */ +#define DAVINCI_KEYSCAN_KEYEN 0x00000001 +#define DAVINCI_KEYSCAN_PREVMODE 0x00000002 +#define DAVINCI_KEYSCAN_CHATOFF 0x00000004 +#define DAVINCI_KEYSCAN_AUTODET 0x00000008 +#define DAVINCI_KEYSCAN_SCANMODE 0x00000010 +#define DAVINCI_KEYSCAN_OUTTYPE 0x00000020 + +/* Masks for the interrupts */ +#define DAVINCI_KEYSCAN_INT_CONT 0x00000008 +#define DAVINCI_KEYSCAN_INT_OFF 0x00000004 +#define DAVINCI_KEYSCAN_INT_ON 0x00000002 +#define DAVINCI_KEYSCAN_INT_CHANGE 0x00000001 +#define DAVINCI_KEYSCAN_INT_ALL 0x0000000f + +struct davinci_ks { + struct input_dev *input; + struct davinci_ks_platform_data *pdata; + int irq; + void __iomem *base; + resource_size_t pbase; + size_t base_size; + unsigned short keymap[]; +}; + +/* Initializing the kp Module */ +static int __init davinci_ks_initialize(struct davinci_ks *davinci_ks) +{ + struct device *dev = &davinci_ks->input->dev; + struct davinci_ks_platform_data *pdata = davinci_ks->pdata; + u32 matrix_ctrl; + + /* Enable all interrupts */ + __raw_writel(DAVINCI_KEYSCAN_INT_ALL, + davinci_ks->base + DAVINCI_KEYSCAN_INTENA); + + /* Clear interrupts if any */ + __raw_writel(DAVINCI_KEYSCAN_INT_ALL, + davinci_ks->base + DAVINCI_KEYSCAN_INTCLR); + + /* Setup the scan period = strobe + interval */ + __raw_writel(pdata->strobe, + davinci_ks->base + DAVINCI_KEYSCAN_STRBWIDTH); + __raw_writel(pdata->interval, + davinci_ks->base + DAVINCI_KEYSCAN_INTERVAL); + __raw_writel(0x01, + davinci_ks->base + DAVINCI_KEYSCAN_CONTTIME); + + /* Define matrix type */ + switch (pdata->matrix_type) { + case DAVINCI_KEYSCAN_MATRIX_4X4: + matrix_ctrl = 0; + break; + case DAVINCI_KEYSCAN_MATRIX_5X3: + matrix_ctrl = (1 << 6); + break; + default: + dev_err(dev->parent, "wrong matrix type\n"); + return -EINVAL; + } + + /* Enable key scan module and set matrix type */ + __raw_writel(DAVINCI_KEYSCAN_AUTODET | DAVINCI_KEYSCAN_KEYEN | + matrix_ctrl, davinci_ks->base + DAVINCI_KEYSCAN_KEYCTRL); + + return 0; +} + +static irqreturn_t davinci_ks_interrupt(int irq, void *dev_id) +{ + struct davinci_ks *davinci_ks = dev_id; + struct device *dev = &davinci_ks->input->dev; + unsigned short *keymap = davinci_ks->keymap; + int keymapsize = davinci_ks->pdata->keymapsize; + u32 prev_status, new_status, changed; + bool release; + int keycode = KEY_UNKNOWN; + int i; + + /* Disable interrupt */ + __raw_writel(0x0, davinci_ks->base + DAVINCI_KEYSCAN_INTENA); + + /* Reading previous and new status of the key scan */ + prev_status = __raw_readl(davinci_ks->base + DAVINCI_KEYSCAN_PREVSTATE); + new_status = __raw_readl(davinci_ks->base + DAVINCI_KEYSCAN_CURRENTST); + + changed = prev_status ^ new_status; + + if (changed) { + /* + * It goes through all bits in 'changed' to ensure + * that no key changes are being missed + */ + for (i = 0 ; i < keymapsize; i++) { + if ((changed>>i) & 0x1) { + keycode = keymap[i]; + release = (new_status >> i) & 0x1; + dev_dbg(dev->parent, "key %d %s\n", keycode, + release ? "released" : "pressed"); + input_report_key(davinci_ks->input, keycode, + !release); + input_sync(davinci_ks->input); + } + } + /* Clearing interrupt */ + __raw_writel(DAVINCI_KEYSCAN_INT_ALL, + davinci_ks->base + DAVINCI_KEYSCAN_INTCLR); + } + + /* Enable interrupts */ + __raw_writel(0x1, davinci_ks->base + DAVINCI_KEYSCAN_INTENA); + + return IRQ_HANDLED; +} + +static int __init davinci_ks_probe(struct platform_device *pdev) +{ + struct davinci_ks *davinci_ks; + struct input_dev *key_dev; + struct resource *res, *mem; + struct device *dev = &pdev->dev; + struct davinci_ks_platform_data *pdata = pdev->dev.platform_data; + int error, i; + + if (pdata->device_enable) { + error = pdata->device_enable(dev); + if (error < 0) { + dev_dbg(dev, "device enable function failed\n"); + return error; + } + } + + if (!pdata->keymap) { + dev_dbg(dev, "no keymap from pdata\n"); + return -EINVAL; + } + + davinci_ks = kzalloc(sizeof(struct davinci_ks) + + sizeof(unsigned short) * pdata->keymapsize, GFP_KERNEL); + if (!davinci_ks) { + dev_dbg(dev, "could not allocate memory for private data\n"); + return -ENOMEM; + } + + memcpy(davinci_ks->keymap, pdata->keymap, + sizeof(unsigned short) * pdata->keymapsize); + + key_dev = input_allocate_device(); + if (!key_dev) { + dev_dbg(dev, "could not allocate input device\n"); + error = -ENOMEM; + goto fail1; + } + + davinci_ks->input = key_dev; + + davinci_ks->irq = platform_get_irq(pdev, 0); + if (davinci_ks->irq < 0) { + dev_err(dev, "no key scan irq\n"); + error = davinci_ks->irq; + goto fail2; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(dev, "no mem resource\n"); + error = -EINVAL; + goto fail2; + } + + davinci_ks->pbase = res->start; + davinci_ks->base_size = resource_size(res); + + mem = request_mem_region(davinci_ks->pbase, davinci_ks->base_size, + pdev->name); + if (!mem) { + dev_err(dev, "key scan registers at %08x are not free\n", + davinci_ks->pbase); + error = -EBUSY; + goto fail2; + } + + davinci_ks->base = ioremap(davinci_ks->pbase, davinci_ks->base_size); + if (!davinci_ks->base) { + dev_err(dev, "can't ioremap MEM resource.\n"); + error = -ENOMEM; + goto fail3; + } + + /* Enable auto repeat feature of Linux input subsystem */ + if (pdata->rep) + __set_bit(EV_REP, key_dev->evbit); + + /* Setup input device */ + __set_bit(EV_KEY, key_dev->evbit); + + /* Setup the platform data */ + davinci_ks->pdata = pdata; + + for (i = 0; i < davinci_ks->pdata->keymapsize; i++) + __set_bit(davinci_ks->pdata->keymap[i], key_dev->keybit); + + key_dev->name = "davinci_keyscan"; + key_dev->phys = "davinci_keyscan/input0"; + key_dev->dev.parent = &pdev->dev; + key_dev->id.bustype = BUS_HOST; + key_dev->id.vendor = 0x0001; + key_dev->id.product = 0x0001; + key_dev->id.version = 0x0001; + key_dev->keycode = davinci_ks->keymap; + key_dev->keycodesize = sizeof(davinci_ks->keymap[0]); + key_dev->keycodemax = davinci_ks->pdata->keymapsize; + + error = input_register_device(davinci_ks->input); + if (error < 0) { + dev_err(dev, "unable to register davinci key scan device\n"); + goto fail4; + } + + error = request_irq(davinci_ks->irq, davinci_ks_interrupt, + 0, pdev->name, davinci_ks); + if (error < 0) { + dev_err(dev, "unable to register davinci key scan interrupt\n"); + goto fail5; + } + + error = davinci_ks_initialize(davinci_ks); + if (error < 0) { + dev_err(dev, "unable to initialize davinci key scan device\n"); + goto fail6; + } + + platform_set_drvdata(pdev, davinci_ks); + return 0; + +fail6: + free_irq(davinci_ks->irq, davinci_ks); +fail5: + input_unregister_device(davinci_ks->input); + key_dev = NULL; +fail4: + iounmap(davinci_ks->base); +fail3: + release_mem_region(davinci_ks->pbase, davinci_ks->base_size); +fail2: + input_free_device(key_dev); +fail1: + kfree(davinci_ks); + + return error; +} + +static int davinci_ks_remove(struct platform_device *pdev) +{ + struct davinci_ks *davinci_ks = platform_get_drvdata(pdev); + + free_irq(davinci_ks->irq, davinci_ks); + + input_unregister_device(davinci_ks->input); + + iounmap(davinci_ks->base); + release_mem_region(davinci_ks->pbase, davinci_ks->base_size); + + platform_set_drvdata(pdev, NULL); + + kfree(davinci_ks); + + return 0; +} + +static struct platform_driver davinci_ks_driver = { + .driver = { + .name = "davinci_keyscan", + .owner = THIS_MODULE, + }, + .remove = davinci_ks_remove, +}; + +module_platform_driver_probe(davinci_ks_driver, davinci_ks_probe); + +MODULE_AUTHOR("Miguel Aguilar"); +MODULE_DESCRIPTION("Texas Instruments DaVinci Key Scan Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/ep93xx_keypad.c b/drivers/input/keyboard/ep93xx_keypad.c new file mode 100644 index 00000000..9857e8fd --- /dev/null +++ b/drivers/input/keyboard/ep93xx_keypad.c @@ -0,0 +1,390 @@ +/* + * Driver for the Cirrus EP93xx matrix keypad controller. + * + * Copyright (c) 2008 H Hartley Sweeten + * + * Based on the pxa27x matrix keypad controller by Rodolfo Giometti. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * NOTE: + * + * The 3-key reset is triggered by pressing the 3 keys in + * Row 0, Columns 2, 4, and 7 at the same time. This action can + * be disabled by setting the EP93XX_KEYPAD_DISABLE_3_KEY flag. + * + * Normal operation for the matrix does not autorepeat the key press. + * This action can be enabled by setting the EP93XX_KEYPAD_AUTOREPEAT + * flag. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* + * Keypad Interface Register offsets + */ +#define KEY_INIT 0x00 /* Key Scan Initialization register */ +#define KEY_DIAG 0x04 /* Key Scan Diagnostic register */ +#define KEY_REG 0x08 /* Key Value Capture register */ + +/* Key Scan Initialization Register bit defines */ +#define KEY_INIT_DBNC_MASK (0x00ff0000) +#define KEY_INIT_DBNC_SHIFT (16) +#define KEY_INIT_DIS3KY (1<<15) +#define KEY_INIT_DIAG (1<<14) +#define KEY_INIT_BACK (1<<13) +#define KEY_INIT_T2 (1<<12) +#define KEY_INIT_PRSCL_MASK (0x000003ff) +#define KEY_INIT_PRSCL_SHIFT (0) + +/* Key Scan Diagnostic Register bit defines */ +#define KEY_DIAG_MASK (0x0000003f) +#define KEY_DIAG_SHIFT (0) + +/* Key Value Capture Register bit defines */ +#define KEY_REG_K (1<<15) +#define KEY_REG_INT (1<<14) +#define KEY_REG_2KEYS (1<<13) +#define KEY_REG_1KEY (1<<12) +#define KEY_REG_KEY2_MASK (0x00000fc0) +#define KEY_REG_KEY2_SHIFT (6) +#define KEY_REG_KEY1_MASK (0x0000003f) +#define KEY_REG_KEY1_SHIFT (0) + +#define EP93XX_MATRIX_SIZE (EP93XX_MATRIX_ROWS * EP93XX_MATRIX_COLS) + +struct ep93xx_keypad { + struct ep93xx_keypad_platform_data *pdata; + struct input_dev *input_dev; + struct clk *clk; + + void __iomem *mmio_base; + + unsigned short keycodes[EP93XX_MATRIX_SIZE]; + + int key1; + int key2; + + int irq; + + bool enabled; +}; + +static irqreturn_t ep93xx_keypad_irq_handler(int irq, void *dev_id) +{ + struct ep93xx_keypad *keypad = dev_id; + struct input_dev *input_dev = keypad->input_dev; + unsigned int status; + int keycode, key1, key2; + + status = __raw_readl(keypad->mmio_base + KEY_REG); + + keycode = (status & KEY_REG_KEY1_MASK) >> KEY_REG_KEY1_SHIFT; + key1 = keypad->keycodes[keycode]; + + keycode = (status & KEY_REG_KEY2_MASK) >> KEY_REG_KEY2_SHIFT; + key2 = keypad->keycodes[keycode]; + + if (status & KEY_REG_2KEYS) { + if (keypad->key1 && key1 != keypad->key1 && key2 != keypad->key1) + input_report_key(input_dev, keypad->key1, 0); + + if (keypad->key2 && key1 != keypad->key2 && key2 != keypad->key2) + input_report_key(input_dev, keypad->key2, 0); + + input_report_key(input_dev, key1, 1); + input_report_key(input_dev, key2, 1); + + keypad->key1 = key1; + keypad->key2 = key2; + + } else if (status & KEY_REG_1KEY) { + if (keypad->key1 && key1 != keypad->key1) + input_report_key(input_dev, keypad->key1, 0); + + if (keypad->key2 && key1 != keypad->key2) + input_report_key(input_dev, keypad->key2, 0); + + input_report_key(input_dev, key1, 1); + + keypad->key1 = key1; + keypad->key2 = 0; + + } else { + input_report_key(input_dev, keypad->key1, 0); + input_report_key(input_dev, keypad->key2, 0); + + keypad->key1 = keypad->key2 = 0; + } + input_sync(input_dev); + + return IRQ_HANDLED; +} + +static void ep93xx_keypad_config(struct ep93xx_keypad *keypad) +{ + struct ep93xx_keypad_platform_data *pdata = keypad->pdata; + unsigned int val = 0; + + if (pdata->flags & EP93XX_KEYPAD_KDIV) + clk_set_rate(keypad->clk, EP93XX_KEYTCHCLK_DIV4); + else + clk_set_rate(keypad->clk, EP93XX_KEYTCHCLK_DIV16); + + if (pdata->flags & EP93XX_KEYPAD_DISABLE_3_KEY) + val |= KEY_INIT_DIS3KY; + if (pdata->flags & EP93XX_KEYPAD_DIAG_MODE) + val |= KEY_INIT_DIAG; + if (pdata->flags & EP93XX_KEYPAD_BACK_DRIVE) + val |= KEY_INIT_BACK; + if (pdata->flags & EP93XX_KEYPAD_TEST_MODE) + val |= KEY_INIT_T2; + + val |= ((pdata->debounce << KEY_INIT_DBNC_SHIFT) & KEY_INIT_DBNC_MASK); + + val |= ((pdata->prescale << KEY_INIT_PRSCL_SHIFT) & KEY_INIT_PRSCL_MASK); + + __raw_writel(val, keypad->mmio_base + KEY_INIT); +} + +static int ep93xx_keypad_open(struct input_dev *pdev) +{ + struct ep93xx_keypad *keypad = input_get_drvdata(pdev); + + if (!keypad->enabled) { + ep93xx_keypad_config(keypad); + clk_enable(keypad->clk); + keypad->enabled = true; + } + + return 0; +} + +static void ep93xx_keypad_close(struct input_dev *pdev) +{ + struct ep93xx_keypad *keypad = input_get_drvdata(pdev); + + if (keypad->enabled) { + clk_disable(keypad->clk); + keypad->enabled = false; + } +} + + +#ifdef CONFIG_PM_SLEEP +static int ep93xx_keypad_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); + struct input_dev *input_dev = keypad->input_dev; + + mutex_lock(&input_dev->mutex); + + if (keypad->enabled) { + clk_disable(keypad->clk); + keypad->enabled = false; + } + + mutex_unlock(&input_dev->mutex); + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(keypad->irq); + + return 0; +} + +static int ep93xx_keypad_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); + struct input_dev *input_dev = keypad->input_dev; + + if (device_may_wakeup(&pdev->dev)) + disable_irq_wake(keypad->irq); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) { + if (!keypad->enabled) { + ep93xx_keypad_config(keypad); + clk_enable(keypad->clk); + keypad->enabled = true; + } + } + + mutex_unlock(&input_dev->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ep93xx_keypad_pm_ops, + ep93xx_keypad_suspend, ep93xx_keypad_resume); + +static int ep93xx_keypad_probe(struct platform_device *pdev) +{ + struct ep93xx_keypad *keypad; + const struct matrix_keymap_data *keymap_data; + struct input_dev *input_dev; + struct resource *res; + int err; + + keypad = kzalloc(sizeof(struct ep93xx_keypad), GFP_KERNEL); + if (!keypad) + return -ENOMEM; + + keypad->pdata = pdev->dev.platform_data; + if (!keypad->pdata) { + err = -EINVAL; + goto failed_free; + } + + keymap_data = keypad->pdata->keymap_data; + if (!keymap_data) { + err = -EINVAL; + goto failed_free; + } + + keypad->irq = platform_get_irq(pdev, 0); + if (!keypad->irq) { + err = -ENXIO; + goto failed_free; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + err = -ENXIO; + goto failed_free; + } + + res = request_mem_region(res->start, resource_size(res), pdev->name); + if (!res) { + err = -EBUSY; + goto failed_free; + } + + keypad->mmio_base = ioremap(res->start, resource_size(res)); + if (keypad->mmio_base == NULL) { + err = -ENXIO; + goto failed_free_mem; + } + + err = ep93xx_keypad_acquire_gpio(pdev); + if (err) + goto failed_free_io; + + keypad->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(keypad->clk)) { + err = PTR_ERR(keypad->clk); + goto failed_free_gpio; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + err = -ENOMEM; + goto failed_put_clk; + } + + keypad->input_dev = input_dev; + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->open = ep93xx_keypad_open; + input_dev->close = ep93xx_keypad_close; + input_dev->dev.parent = &pdev->dev; + + err = matrix_keypad_build_keymap(keymap_data, NULL, + EP93XX_MATRIX_ROWS, EP93XX_MATRIX_COLS, + keypad->keycodes, input_dev); + if (err) + goto failed_free_dev; + + if (keypad->pdata->flags & EP93XX_KEYPAD_AUTOREPEAT) + __set_bit(EV_REP, input_dev->evbit); + input_set_drvdata(input_dev, keypad); + + err = request_irq(keypad->irq, ep93xx_keypad_irq_handler, + 0, pdev->name, keypad); + if (err) + goto failed_free_dev; + + err = input_register_device(input_dev); + if (err) + goto failed_free_irq; + + platform_set_drvdata(pdev, keypad); + device_init_wakeup(&pdev->dev, 1); + + return 0; + +failed_free_irq: + free_irq(keypad->irq, pdev); + platform_set_drvdata(pdev, NULL); +failed_free_dev: + input_free_device(input_dev); +failed_put_clk: + clk_put(keypad->clk); +failed_free_gpio: + ep93xx_keypad_release_gpio(pdev); +failed_free_io: + iounmap(keypad->mmio_base); +failed_free_mem: + release_mem_region(res->start, resource_size(res)); +failed_free: + kfree(keypad); + return err; +} + +static int ep93xx_keypad_remove(struct platform_device *pdev) +{ + struct ep93xx_keypad *keypad = platform_get_drvdata(pdev); + struct resource *res; + + free_irq(keypad->irq, pdev); + + platform_set_drvdata(pdev, NULL); + + if (keypad->enabled) + clk_disable(keypad->clk); + clk_put(keypad->clk); + + input_unregister_device(keypad->input_dev); + + ep93xx_keypad_release_gpio(pdev); + + iounmap(keypad->mmio_base); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); + + kfree(keypad); + + return 0; +} + +static struct platform_driver ep93xx_keypad_driver = { + .driver = { + .name = "ep93xx-keypad", + .owner = THIS_MODULE, + .pm = &ep93xx_keypad_pm_ops, + }, + .probe = ep93xx_keypad_probe, + .remove = ep93xx_keypad_remove, +}; +module_platform_driver(ep93xx_keypad_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("H Hartley Sweeten "); +MODULE_DESCRIPTION("EP93xx Matrix Keypad Controller"); +MODULE_ALIAS("platform:ep93xx-keypad"); diff --git a/drivers/input/keyboard/goldfish_events.c b/drivers/input/keyboard/goldfish_events.c new file mode 100644 index 00000000..9f60a2ec --- /dev/null +++ b/drivers/input/keyboard/goldfish_events.c @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2007 Google, Inc. + * Copyright (C) 2012 Intel, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + REG_READ = 0x00, + REG_SET_PAGE = 0x00, + REG_LEN = 0x04, + REG_DATA = 0x08, + + PAGE_NAME = 0x00000, + PAGE_EVBITS = 0x10000, + PAGE_ABSDATA = 0x20000 | EV_ABS, +}; + +struct event_dev { + struct input_dev *input; + int irq; + void __iomem *addr; + char name[0]; +}; + +static irqreturn_t events_interrupt(int irq, void *dev_id) +{ + struct event_dev *edev = dev_id; + unsigned type, code, value; + + type = __raw_readl(edev->addr + REG_READ); + code = __raw_readl(edev->addr + REG_READ); + value = __raw_readl(edev->addr + REG_READ); + + input_event(edev->input, type, code, value); + input_sync(edev->input); + return IRQ_HANDLED; +} + +static void events_import_bits(struct event_dev *edev, + unsigned long bits[], unsigned type, size_t count) +{ + void __iomem *addr = edev->addr; + int i, j; + size_t size; + uint8_t val; + + __raw_writel(PAGE_EVBITS | type, addr + REG_SET_PAGE); + + size = __raw_readl(addr + REG_LEN) * 8; + if (size < count) + count = size; + + addr += REG_DATA; + for (i = 0; i < count; i += 8) { + val = __raw_readb(addr++); + for (j = 0; j < 8; j++) + if (val & 1 << j) + set_bit(i + j, bits); + } +} + +static void events_import_abs_params(struct event_dev *edev) +{ + struct input_dev *input_dev = edev->input; + void __iomem *addr = edev->addr; + u32 val[4]; + int count; + int i, j; + + __raw_writel(PAGE_ABSDATA, addr + REG_SET_PAGE); + + count = __raw_readl(addr + REG_LEN) / sizeof(val); + if (count > ABS_MAX) + count = ABS_MAX; + + for (i = 0; i < count; i++) { + if (!test_bit(i, input_dev->absbit)) + continue; + + for (j = 0; j < ARRAY_SIZE(val); j++) { + int offset = (i * ARRAY_SIZE(val) + j) * sizeof(u32); + val[j] = __raw_readl(edev->addr + REG_DATA + offset); + } + + input_set_abs_params(input_dev, i, + val[0], val[1], val[2], val[3]); + } +} + +static int events_probe(struct platform_device *pdev) +{ + struct input_dev *input_dev; + struct event_dev *edev; + struct resource *res; + unsigned keymapnamelen; + void __iomem *addr; + int irq; + int i; + int error; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return -EINVAL; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -EINVAL; + + addr = devm_ioremap(&pdev->dev, res->start, 4096); + if (!addr) + return -ENOMEM; + + __raw_writel(PAGE_NAME, addr + REG_SET_PAGE); + keymapnamelen = __raw_readl(addr + REG_LEN); + + edev = devm_kzalloc(&pdev->dev, + sizeof(struct event_dev) + keymapnamelen + 1, + GFP_KERNEL); + if (!edev) + return -ENOMEM; + + input_dev = devm_input_allocate_device(&pdev->dev); + if (!input_dev) + return -ENOMEM; + + edev->input = input_dev; + edev->addr = addr; + edev->irq = irq; + + for (i = 0; i < keymapnamelen; i++) + edev->name[i] = __raw_readb(edev->addr + REG_DATA + i); + + pr_debug("events_probe() keymap=%s\n", edev->name); + + input_dev->name = edev->name; + input_dev->id.bustype = BUS_HOST; + + events_import_bits(edev, input_dev->evbit, EV_SYN, EV_MAX); + events_import_bits(edev, input_dev->keybit, EV_KEY, KEY_MAX); + events_import_bits(edev, input_dev->relbit, EV_REL, REL_MAX); + events_import_bits(edev, input_dev->absbit, EV_ABS, ABS_MAX); + events_import_bits(edev, input_dev->mscbit, EV_MSC, MSC_MAX); + events_import_bits(edev, input_dev->ledbit, EV_LED, LED_MAX); + events_import_bits(edev, input_dev->sndbit, EV_SND, SND_MAX); + events_import_bits(edev, input_dev->ffbit, EV_FF, FF_MAX); + events_import_bits(edev, input_dev->swbit, EV_SW, SW_MAX); + + events_import_abs_params(edev); + + error = devm_request_irq(&pdev->dev, edev->irq, events_interrupt, 0, + "goldfish-events-keypad", edev); + if (error) + return error; + + error = input_register_device(input_dev); + if (error) + return error; + + return 0; +} + +static struct platform_driver events_driver = { + .probe = events_probe, + .driver = { + .owner = THIS_MODULE, + .name = "goldfish_events", + }, +}; + +module_platform_driver(events_driver); + +MODULE_AUTHOR("Brian Swetland"); +MODULE_DESCRIPTION("Goldfish Event Device"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c new file mode 100644 index 00000000..655b54fe --- /dev/null +++ b/drivers/input/keyboard/gpio_keys.c @@ -0,0 +1,977 @@ +/* + * Driver for keys on GPIO lines capable of generating interrupts. + * + * Copyright 2005 Phil Blundell + * Copyright 2010, 2011 David Jander + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//==================== debug ==================== +static int debug_level = 1; +#define ENTER \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_GPIO_KEYS_DBG] func: %s line: %04d\n", __func__, __LINE__); }while(0) + +#define PRINT_DBG(format,x...) \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_GPIO_KEYS_DBG] " format, ## x); }while(0) + +#define PRINT_INFO(format,x...) \ +do{ printk(KERN_INFO "[SPRD_GPIO_KEYS_INFO] " format, ## x); }while(0) + +#define PRINT_WARN(format,x...) \ +do{ printk(KERN_INFO "[SPRD_GPIO_KEYS_WARN] " format, ## x); }while(0) + +#define PRINT_ERR(format,x...) \ +do{ printk(KERN_ERR "[SPRD_GPIO_KEYS_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x); }while(0) +//==================== debug ==================== + +struct gpio_button_data { + const struct gpio_keys_button *button; + struct input_dev *input; + struct timer_list timer; + struct work_struct work; + unsigned int timer_debounce; /* in msecs */ + unsigned int irq; + unsigned long irqflags; + spinlock_t lock; + bool disabled; + bool key_pressed; + bool is_deepsleep; +}; + +struct gpio_keys_drvdata { + const struct gpio_keys_platform_data *pdata; + struct input_dev *input; + struct mutex disable_lock; + struct gpio_button_data data[0]; +}; + +/* + * SYSFS interface for enabling/disabling keys and switches: + * + * There are 4 attributes under /sys/devices/platform/gpio-keys/ + * keys [ro] - bitmap of keys (EV_KEY) which can be + * disabled + * switches [ro] - bitmap of switches (EV_SW) which can be + * disabled + * disabled_keys [rw] - bitmap of keys currently disabled + * disabled_switches [rw] - bitmap of switches currently disabled + * + * Userland can change these values and hence disable event generation + * for each key (or switch). Disabling a key means its interrupt line + * is disabled. + * + * For example, if we have following switches set up as gpio-keys: + * SW_DOCK = 5 + * SW_CAMERA_LENS_COVER = 9 + * SW_KEYPAD_SLIDE = 10 + * SW_FRONT_PROXIMITY = 11 + * This is read from switches: + * 11-9,5 + * Next we want to disable proximity (11) and dock (5), we write: + * 11,5 + * to file disabled_switches. Now proximity and dock IRQs are disabled. + * This can be verified by reading the file disabled_switches: + * 11,5 + * If we now want to enable proximity (11) switch we write: + * 5 + * to disabled_switches. + * + * We can disable only those keys which don't allow sharing the irq. + */ + +/** + * get_n_events_by_type() - returns maximum number of events per @type + * @type: type of button (%EV_KEY, %EV_SW) + * + * Return value of this function can be used to allocate bitmap + * large enough to hold all bits for given type. + */ +static inline int get_n_events_by_type(int type) +{ + BUG_ON(type != EV_SW && type != EV_KEY); + + return (type == EV_KEY) ? KEY_CNT : SW_CNT; +} + +/** + * gpio_keys_disable_button() - disables given GPIO button + * @bdata: button data for button to be disabled + * + * Disables button pointed by @bdata. This is done by masking + * IRQ line. After this function is called, button won't generate + * input events anymore. Note that one can only disable buttons + * that don't share IRQs. + * + * Make sure that @bdata->disable_lock is locked when entering + * this function to avoid races when concurrent threads are + * disabling buttons at the same time. + */ +static void gpio_keys_disable_button(struct gpio_button_data *bdata) +{ + if (!bdata->disabled) { + /* + * Disable IRQ and possible debouncing timer. + */ + disable_irq(bdata->irq); + if (bdata->timer_debounce) + del_timer_sync(&bdata->timer); + + bdata->disabled = true; + } +} + +/** + * gpio_keys_enable_button() - enables given GPIO button + * @bdata: button data for button to be disabled + * + * Enables given button pointed by @bdata. + * + * Make sure that @bdata->disable_lock is locked when entering + * this function to avoid races with concurrent threads trying + * to enable the same button at the same time. + */ +static void gpio_keys_enable_button(struct gpio_button_data *bdata) +{ + if (bdata->disabled) { + enable_irq(bdata->irq); + bdata->disabled = false; + } +} + +/** + * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons + * @ddata: pointer to drvdata + * @buf: buffer where stringified bitmap is written + * @type: button type (%EV_KEY, %EV_SW) + * @only_disabled: does caller want only those buttons that are + * currently disabled or all buttons that can be + * disabled + * + * This function writes buttons that can be disabled to @buf. If + * @only_disabled is true, then @buf contains only those buttons + * that are currently disabled. Returns 0 on success or negative + * errno on failure. + */ +static ssize_t gpio_keys_attr_show_helper(struct gpio_keys_drvdata *ddata, + char *buf, unsigned int type, + bool only_disabled) +{ + int n_events = get_n_events_by_type(type); + unsigned long *bits; + ssize_t ret; + int i; + + bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); + if (!bits) + return -ENOMEM; + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + + if (bdata->button->type != type) + continue; + + if (only_disabled && !bdata->disabled) + continue; + + __set_bit(bdata->button->code, bits); + } + + ret = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, bits, n_events); + buf[ret++] = '\n'; + buf[ret] = '\0'; + + kfree(bits); + + return ret; +} + +/** + * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap + * @ddata: pointer to drvdata + * @buf: buffer from userspace that contains stringified bitmap + * @type: button type (%EV_KEY, %EV_SW) + * + * This function parses stringified bitmap from @buf and disables/enables + * GPIO buttons accordingly. Returns 0 on success and negative error + * on failure. + */ +static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata, + const char *buf, unsigned int type) +{ + int n_events = get_n_events_by_type(type); + unsigned long *bits; + ssize_t error; + int i; + + bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); + if (!bits) + return -ENOMEM; + + error = bitmap_parselist(buf, bits, n_events); + if (error) + goto out; + + /* First validate */ + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + + if (bdata->button->type != type) + continue; + + if (test_bit(bdata->button->code, bits) && + !bdata->button->can_disable) { + error = -EINVAL; + goto out; + } + } + + mutex_lock(&ddata->disable_lock); + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + + if (bdata->button->type != type) + continue; + + if (test_bit(bdata->button->code, bits)) + gpio_keys_disable_button(bdata); + else + gpio_keys_enable_button(bdata); + } + + mutex_unlock(&ddata->disable_lock); + +out: + kfree(bits); + return error; +} + +#define ATTR_SHOW_FN(name, type, only_disabled) \ +static ssize_t gpio_keys_show_##name(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + struct platform_device *pdev = to_platform_device(dev); \ + struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ + \ + return gpio_keys_attr_show_helper(ddata, buf, \ + type, only_disabled); \ +} + +ATTR_SHOW_FN(keys, EV_KEY, false); +ATTR_SHOW_FN(switches, EV_SW, false); +ATTR_SHOW_FN(disabled_keys, EV_KEY, true); +ATTR_SHOW_FN(disabled_switches, EV_SW, true); + +/* + * ATTRIBUTES: + * + * /sys/devices/platform/gpio-keys/keys [ro] + * /sys/devices/platform/gpio-keys/switches [ro] + */ +static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL); +static DEVICE_ATTR(switches, S_IRUGO, gpio_keys_show_switches, NULL); + +#define ATTR_STORE_FN(name, type) \ +static ssize_t gpio_keys_store_##name(struct device *dev, \ + struct device_attribute *attr, \ + const char *buf, \ + size_t count) \ +{ \ + struct platform_device *pdev = to_platform_device(dev); \ + struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ + ssize_t error; \ + \ + error = gpio_keys_attr_store_helper(ddata, buf, type); \ + if (error) \ + return error; \ + \ + return count; \ +} + +ATTR_STORE_FN(disabled_keys, EV_KEY); +ATTR_STORE_FN(disabled_switches, EV_SW); + +/* + * ATTRIBUTES: + * + * /sys/devices/platform/gpio-keys/disabled_keys [rw] + * /sys/devices/platform/gpio-keys/disables_switches [rw] + */ +static DEVICE_ATTR(disabled_keys, S_IWUSR | S_IRUGO, + gpio_keys_show_disabled_keys, + gpio_keys_store_disabled_keys); +static DEVICE_ATTR(disabled_switches, S_IWUSR | S_IRUGO, + gpio_keys_show_disabled_switches, + gpio_keys_store_disabled_switches); + +static struct attribute *gpio_keys_attrs[] = { + &dev_attr_keys.attr, + &dev_attr_switches.attr, + &dev_attr_disabled_keys.attr, + &dev_attr_disabled_switches.attr, + NULL, +}; + +static struct attribute_group gpio_keys_attr_group = { + .attrs = gpio_keys_attrs, +}; + +static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) +{ + const struct gpio_keys_button *button = bdata->button; + struct input_dev *input = bdata->input; + static int last_state = 0; + unsigned int type = button->type ?: EV_KEY; + int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low; + + if (type == EV_ABS) { + if (state) + input_event(input, type, button->code, button->value); + } else { + /* raise the missing key event */ + if (last_state == state) { + input_event(input, type, button->code, !state); + PRINT_INFO("Key:%s ScanCode:%d value:%d\n", button->desc, button->code, !state); + } + + input_event(input, type, button->code, !!state); + PRINT_INFO("Key:%s ScanCode:%d value:%d\n", button->desc, button->code, !!state); + + last_state = state; + } + input_sync(input); +} + +static void gpio_keys_gpio_work_func(struct work_struct *work) +{ + struct gpio_button_data *bdata = + container_of(work, struct gpio_button_data, work); + + gpio_keys_gpio_report_event(bdata); + + if (bdata->button->wakeup) + pm_relax(bdata->input->dev.parent); +} + +static void gpio_keys_gpio_timer(unsigned long _data) +{ + struct gpio_button_data *bdata = (struct gpio_button_data *)_data; + + schedule_work(&bdata->work); +} + +static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) +{ + struct gpio_button_data *bdata = dev_id; + + BUG_ON(irq != bdata->irq); + + if (irqd_get_trigger_type(irq_get_irq_data(irq)) != bdata->irqflags) { + pr_info("wake up cpu from deepsleep by gpio edge interrupt!"); + irq_set_irq_type(bdata->irq, bdata->irqflags); + } + + if (bdata->is_deepsleep) { + bdata->is_deepsleep = false; + } + if (bdata->button->wakeup) + pm_stay_awake(bdata->input->dev.parent); + if (bdata->timer_debounce) + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(bdata->timer_debounce)); + else + schedule_work(&bdata->work); + + return IRQ_HANDLED; +} + +static void gpio_keys_irq_timer(unsigned long _data) +{ + struct gpio_button_data *bdata = (struct gpio_button_data *)_data; + struct input_dev *input = bdata->input; + unsigned long flags; + + spin_lock_irqsave(&bdata->lock, flags); + if (bdata->key_pressed) { + input_event(input, EV_KEY, bdata->button->code, 0); + input_sync(input); + bdata->key_pressed = false; + } + spin_unlock_irqrestore(&bdata->lock, flags); +} + +static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id) +{ + struct gpio_button_data *bdata = dev_id; + const struct gpio_keys_button *button = bdata->button; + struct input_dev *input = bdata->input; + unsigned long flags; + + BUG_ON(irq != bdata->irq); + + spin_lock_irqsave(&bdata->lock, flags); + + if (!bdata->key_pressed) { + if (bdata->button->wakeup) + pm_wakeup_event(bdata->input->dev.parent, 0); + + input_event(input, EV_KEY, button->code, 1); + input_sync(input); + + if (!bdata->timer_debounce) { + input_event(input, EV_KEY, button->code, 0); + input_sync(input); + goto out; + } + + bdata->key_pressed = true; + } + + if (bdata->timer_debounce) + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(bdata->timer_debounce)); +out: + spin_unlock_irqrestore(&bdata->lock, flags); + return IRQ_HANDLED; +} + +static int gpio_keys_setup_key(struct platform_device *pdev, + struct input_dev *input, + struct gpio_button_data *bdata, + const struct gpio_keys_button *button) +{ + const char *desc = button->desc ? button->desc : "gpio_keys"; + struct device *dev = &pdev->dev; + irq_handler_t isr; + unsigned long irqflags; + int irq, error; + + bdata->input = input; + bdata->button = button; + spin_lock_init(&bdata->lock); + + if (gpio_is_valid(button->gpio)) { + error = gpio_request_one(button->gpio, GPIOF_IN, desc); + if (error < 0) { + dev_err(dev, "Failed to request GPIO %d, error %d\n", + button->gpio, error); + return error; + } + + if (button->debounce_interval) { + error = gpio_set_debounce(button->gpio, + button->debounce_interval * 1000); + /* use timer if gpiolib doesn't provide debounce */ + if (error < 0) + bdata->timer_debounce = + button->debounce_interval; + } + + irq = gpio_to_irq(button->gpio); + if (irq < 0) { + error = irq; + dev_err(dev, + "Unable to get irq number for GPIO %d, error %d\n", + button->gpio, error); + goto fail; + } + bdata->irq = irq; + + INIT_WORK(&bdata->work, gpio_keys_gpio_work_func); + setup_timer(&bdata->timer, + gpio_keys_gpio_timer, (unsigned long)bdata); + + isr = gpio_keys_gpio_isr; + irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; + bdata->irqflags = irqflags; + } else { + if (!button->irq) { + dev_err(dev, "No IRQ specified\n"); + return -EINVAL; + } + bdata->irq = button->irq; + + if (button->type && button->type != EV_KEY) { + dev_err(dev, "Only EV_KEY allowed for IRQ buttons.\n"); + return -EINVAL; + } + + bdata->timer_debounce = button->debounce_interval; + setup_timer(&bdata->timer, + gpio_keys_irq_timer, (unsigned long)bdata); + + isr = gpio_keys_irq_isr; + irqflags = 0; + } + + input_set_capability(input, button->type ?: EV_KEY, button->code); + + /* + * If platform has specified that the button can be disabled, + * we don't want it to share the interrupt line. + */ + if (!button->can_disable) + irqflags |= IRQF_SHARED; + + irqflags |= IRQF_NO_SUSPEND; + + error = request_any_context_irq(bdata->irq, isr, irqflags, desc, bdata); + if (error < 0) { + dev_err(dev, "Unable to claim irq %d; error %d\n", + bdata->irq, error); + goto fail; + } + + return 0; + +fail: + if (gpio_is_valid(button->gpio)) + gpio_free(button->gpio); + + return error; +} + +static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata) +{ + struct input_dev *input = ddata->input; + int i; + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (!bdata->is_deepsleep && gpio_is_valid(bdata->button->gpio)) { + gpio_keys_gpio_report_event(bdata); + } + } + input_sync(input); +} + +static int gpio_keys_open(struct input_dev *input) +{ + struct gpio_keys_drvdata *ddata = input_get_drvdata(input); + const struct gpio_keys_platform_data *pdata = ddata->pdata; + int error; + + if (pdata->enable) { + error = pdata->enable(input->dev.parent); + if (error) + return error; + } + + /* Report current state of buttons that are connected to GPIOs */ + gpio_keys_report_state(ddata); + + return 0; +} + +static void gpio_keys_close(struct input_dev *input) +{ + struct gpio_keys_drvdata *ddata = input_get_drvdata(input); + const struct gpio_keys_platform_data *pdata = ddata->pdata; + + if (pdata->disable) + pdata->disable(input->dev.parent); +} + +/* + * Handlers for alternative sources of platform_data + */ + +#ifdef CONFIG_OF +/* + * Translate OpenFirmware node properties into platform_data + */ +static struct gpio_keys_platform_data * +gpio_keys_get_devtree_pdata(struct device *dev) +{ + struct device_node *node, *pp; + struct gpio_keys_platform_data *pdata; + struct gpio_keys_button *button; + int error; + int nbuttons; + int i; + char *input_name = NULL; + int ret = -1; + + node = dev->of_node; + if (!node) { + error = -ENODEV; + goto err_out; + } + + nbuttons = of_get_child_count(node); + if (nbuttons == 0) { + error = -ENODEV; + goto err_out; + } + + pdata = kzalloc(sizeof(*pdata) + nbuttons * (sizeof *button), + GFP_KERNEL); + if (!pdata) { + error = -ENOMEM; + goto err_out; + } + + pdata->buttons = (struct gpio_keys_button *)(pdata + 1); + pdata->nbuttons = nbuttons; + + pdata->rep = !!of_get_property(node, "autorepeat", NULL); + + ret = of_property_read_string(node, "input-name", &input_name); + if (0 == ret) { + pdata->name = input_name; + PRINT_INFO("input-name=\"%s\"\n", input_name); + } + else + PRINT_WARN("failed to get input-name\n"); + + i = 0; + for_each_child_of_node(node, pp) { + int gpio; + enum of_gpio_flags flags; + + if (!of_find_property(pp, "gpios", NULL)) { + pdata->nbuttons--; + dev_warn(dev, "Found button without gpios\n"); + continue; + } + + gpio = of_get_gpio_flags(pp, 0, &flags); + if (gpio < 0) { + error = gpio; + if (error != -EPROBE_DEFER) + dev_err(dev, + "Failed to get gpio flags, error: %d\n", + error); + goto err_free_pdata; + } + + button = &pdata->buttons[i++]; + + button->gpio = gpio; + button->active_low = flags & OF_GPIO_ACTIVE_LOW; + + if (of_property_read_u32(pp, "linux,code", &button->code)) { + dev_err(dev, "Button without keycode: 0x%x\n", + button->gpio); + error = -EINVAL; + goto err_free_pdata; + } + + button->desc = of_get_property(pp, "label", NULL); + + if (of_property_read_u32(pp, "linux,input-type", &button->type)) + button->type = EV_KEY; + + button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL); + + if (of_property_read_u32(pp, "debounce-interval", + &button->debounce_interval)) + button->debounce_interval = 5; + } + + if (pdata->nbuttons == 0) { + error = -EINVAL; + goto err_free_pdata; + } + + return pdata; + +err_free_pdata: + kfree(pdata); +err_out: + return ERR_PTR(error); +} + +static struct of_device_id gpio_keys_of_match[] = { + { .compatible = "gpio-keys", }, + { }, +}; +MODULE_DEVICE_TABLE(of, gpio_keys_of_match); + +#else + +static inline struct gpio_keys_platform_data * +gpio_keys_get_devtree_pdata(struct device *dev) +{ + return ERR_PTR(-ENODEV); +} + +#endif + +static void gpio_remove_key(struct gpio_button_data *bdata) +{ + free_irq(bdata->irq, bdata); + if (bdata->timer_debounce) + del_timer_sync(&bdata->timer); + cancel_work_sync(&bdata->work); + if (gpio_is_valid(bdata->button->gpio)) + gpio_free(bdata->button->gpio); +} + +static int gpio_keys_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); + struct gpio_keys_drvdata *ddata; + struct input_dev *input; + int i, error; + int wakeup = 0; + + ENTER; + if (!pdata) { + pdata = gpio_keys_get_devtree_pdata(dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + } + + ddata = kzalloc(sizeof(struct gpio_keys_drvdata) + + pdata->nbuttons * sizeof(struct gpio_button_data), + GFP_KERNEL); + input = input_allocate_device(); + if (!ddata || !input) { + dev_err(dev, "failed to allocate state\n"); + error = -ENOMEM; + goto fail1; + } + + ddata->pdata = pdata; + ddata->input = input; + mutex_init(&ddata->disable_lock); + + platform_set_drvdata(pdev, ddata); + input_set_drvdata(input, ddata); +#ifndef CONFIG_OF + input->name = pdata->name ? pdata->name : pdev->name; +#else + input->name = pdata->name ? pdata->name : "gpio-keys"; +#endif + input->phys = "gpio-keys/input0"; + input->dev.parent = &pdev->dev; + input->open = gpio_keys_open; + input->close = gpio_keys_close; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + /* Enable auto repeat feature of Linux input subsystem */ + if (pdata->rep) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < pdata->nbuttons; i++) { + const struct gpio_keys_button *button = &pdata->buttons[i]; + struct gpio_button_data *bdata = &ddata->data[i]; + + error = gpio_keys_setup_key(pdev, input, bdata, button); + if (error) + goto fail2; + + if (button->wakeup) + wakeup = 1; + } + + error = sysfs_create_group(&pdev->dev.kobj, &gpio_keys_attr_group); + if (error) { + dev_err(dev, "Unable to export keys/switches, error: %d\n", + error); + goto fail2; + } + + error = input_register_device(input); + if (error) { + dev_err(dev, "Unable to register input device, error: %d\n", + error); + goto fail3; + } + + device_init_wakeup(&pdev->dev, wakeup); + + PRINT_INFO("probe success!\n"); + return 0; + + fail3: + sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); + fail2: + while (--i >= 0) + gpio_remove_key(&ddata->data[i]); + + platform_set_drvdata(pdev, NULL); + fail1: + input_free_device(input); + kfree(ddata); + /* If we have no platform data, we allocated pdata dynamically. */ + if (!dev_get_platdata(&pdev->dev)) + kfree(pdata); + + PRINT_ERR("probe failed!\n"); + return error; +} + +static int gpio_keys_remove(struct platform_device *pdev) +{ + struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); + struct input_dev *input = ddata->input; + int i; + + sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); + + device_init_wakeup(&pdev->dev, 0); + + for (i = 0; i < ddata->pdata->nbuttons; i++) + gpio_remove_key(&ddata->data[i]); + + input_unregister_device(input); + + /* If we have no platform data, we allocated pdata dynamically. */ + if (!dev_get_platdata(&pdev->dev)) + kfree(ddata->pdata); + + kfree(ddata); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int gpio_keys_suspend(struct device *dev) +{ + struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); + struct input_dev *input = ddata->input; + struct gpio_button_data *bdata = &ddata->data[0]; + int i; + + if (bdata->button->ds_irqflags) + irq_set_irq_type(bdata->irq, bdata->button->ds_irqflags); + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + bdata->is_deepsleep = true; + } + + if (device_may_wakeup(dev)) { + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (bdata->button->wakeup) + enable_irq_wake(bdata->irq); + } + } else { + mutex_lock(&input->mutex); + if (input->users) + gpio_keys_close(input); + mutex_unlock(&input->mutex); + } + + return 0; +} + +static int gpio_keys_resume(struct device *dev) +{ + struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); + struct input_dev *input = ddata->input; + struct gpio_button_data *bdata = &ddata->data[0]; + int error = 0; + int i; + + if (bdata->button->ds_irqflags) + irq_set_irq_type(bdata->irq, bdata->irqflags); + + if (device_may_wakeup(dev)) { + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (bdata->button->wakeup) + disable_irq_wake(bdata->irq); + } + } else { + mutex_lock(&input->mutex); + if (input->users) + error = gpio_keys_open(input); + mutex_unlock(&input->mutex); + } + + if (error) + return error; + + gpio_keys_report_state(ddata); + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + bdata->is_deepsleep = false; + } + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); + +static struct platform_driver gpio_keys_device_driver = { + .probe = gpio_keys_probe, + .remove = gpio_keys_remove, + .driver = { + .name = "gpio-keys", + .owner = THIS_MODULE, + .pm = &gpio_keys_pm_ops, + .of_match_table = of_match_ptr(gpio_keys_of_match), + } +}; + +static int __init gpio_keys_init(void) +{ + ENTER; + +/***************************************************************/ + struct device_node *node = of_find_compatible_node(NULL, NULL, "gpio-keys"); + if(node) { + PRINT_INFO("Find the node name:%s\n",node->name); + + struct platform_device *dev = of_find_device_by_node(node); + if(dev) + PRINT_INFO("Find the device name:%s\n",dev->name); + else + PRINT_INFO("Not Find the device\n"); + } + else + PRINT_INFO("Not Find the node\n"); +/***************************************************************/ + + return platform_driver_register(&gpio_keys_device_driver); +} + +static void __exit gpio_keys_exit(void) +{ + platform_driver_unregister(&gpio_keys_device_driver); +} + +late_initcall(gpio_keys_init); +module_exit(gpio_keys_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Phil Blundell "); +MODULE_DESCRIPTION("Keyboard driver for GPIOs"); +MODULE_ALIAS("platform:gpio-keys"); diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c new file mode 100644 index 00000000..21147164 --- /dev/null +++ b/drivers/input/keyboard/gpio_keys_polled.c @@ -0,0 +1,377 @@ +/* + * Driver for buttons on GPIO lines not capable of generating interrupts + * + * Copyright (C) 2007-2010 Gabor Juhos + * Copyright (C) 2010 Nuno Goncalves + * + * This file was based on: /drivers/input/misc/cobalt_btns.c + * Copyright (C) 2007 Yoichi Yuasa + * + * also was based on: /drivers/input/keyboard/gpio_keys.c + * Copyright 2005 Phil Blundell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "gpio-keys-polled" + +struct gpio_keys_button_data { + int last_state; + int count; + int threshold; + int can_sleep; +}; + +struct gpio_keys_polled_dev { + struct input_polled_dev *poll_dev; + struct device *dev; + const struct gpio_keys_platform_data *pdata; + struct gpio_keys_button_data data[0]; +}; + +static void gpio_keys_polled_check_state(struct input_dev *input, + struct gpio_keys_button *button, + struct gpio_keys_button_data *bdata) +{ + int state; + + if (bdata->can_sleep) + state = !!gpio_get_value_cansleep(button->gpio); + else + state = !!gpio_get_value(button->gpio); + + if (state != bdata->last_state) { + unsigned int type = button->type ?: EV_KEY; + + input_event(input, type, button->code, + !!(state ^ button->active_low)); + input_sync(input); + bdata->count = 0; + bdata->last_state = state; + } +} + +static void gpio_keys_polled_poll(struct input_polled_dev *dev) +{ + struct gpio_keys_polled_dev *bdev = dev->private; + const struct gpio_keys_platform_data *pdata = bdev->pdata; + struct input_dev *input = dev->input; + int i; + + for (i = 0; i < pdata->nbuttons; i++) { + struct gpio_keys_button_data *bdata = &bdev->data[i]; + + if (bdata->count < bdata->threshold) + bdata->count++; + else + gpio_keys_polled_check_state(input, &pdata->buttons[i], + bdata); + } +} + +static void gpio_keys_polled_open(struct input_polled_dev *dev) +{ + struct gpio_keys_polled_dev *bdev = dev->private; + const struct gpio_keys_platform_data *pdata = bdev->pdata; + + if (pdata->enable) + pdata->enable(bdev->dev); +} + +static void gpio_keys_polled_close(struct input_polled_dev *dev) +{ + struct gpio_keys_polled_dev *bdev = dev->private; + const struct gpio_keys_platform_data *pdata = bdev->pdata; + + if (pdata->disable) + pdata->disable(bdev->dev); +} + +#ifdef CONFIG_OF +static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev) +{ + struct device_node *node, *pp; + struct gpio_keys_platform_data *pdata; + struct gpio_keys_button *button; + int error; + int nbuttons; + int i; + + node = dev->of_node; + if (!node) + return NULL; + + nbuttons = of_get_child_count(node); + if (nbuttons == 0) + return NULL; + + pdata = kzalloc(sizeof(*pdata) + nbuttons * (sizeof *button), + GFP_KERNEL); + if (!pdata) { + error = -ENOMEM; + goto err_out; + } + + pdata->buttons = (struct gpio_keys_button *)(pdata + 1); + pdata->nbuttons = nbuttons; + + pdata->rep = !!of_get_property(node, "autorepeat", NULL); + of_property_read_u32(node, "poll-interval", &pdata->poll_interval); + + i = 0; + for_each_child_of_node(node, pp) { + int gpio; + enum of_gpio_flags flags; + + if (!of_find_property(pp, "gpios", NULL)) { + pdata->nbuttons--; + dev_warn(dev, "Found button without gpios\n"); + continue; + } + + gpio = of_get_gpio_flags(pp, 0, &flags); + if (gpio < 0) { + error = gpio; + if (error != -EPROBE_DEFER) + dev_err(dev, + "Failed to get gpio flags, error: %d\n", + error); + goto err_free_pdata; + } + + button = &pdata->buttons[i++]; + + button->gpio = gpio; + button->active_low = flags & OF_GPIO_ACTIVE_LOW; + + if (of_property_read_u32(pp, "linux,code", &button->code)) { + dev_err(dev, "Button without keycode: 0x%x\n", + button->gpio); + error = -EINVAL; + goto err_free_pdata; + } + + button->desc = of_get_property(pp, "label", NULL); + + if (of_property_read_u32(pp, "linux,input-type", &button->type)) + button->type = EV_KEY; + + button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL); + + if (of_property_read_u32(pp, "debounce-interval", + &button->debounce_interval)) + button->debounce_interval = 5; + } + + if (pdata->nbuttons == 0) { + error = -EINVAL; + goto err_free_pdata; + } + + return pdata; + +err_free_pdata: + kfree(pdata); +err_out: + return ERR_PTR(error); +} + +static struct of_device_id gpio_keys_polled_of_match[] = { + { .compatible = "gpio-keys-polled", }, + { }, +}; +MODULE_DEVICE_TABLE(of, gpio_keys_polled_of_match); + +#else + +static inline struct gpio_keys_platform_data * +gpio_keys_polled_get_devtree_pdata(struct device *dev) +{ + return NULL; +} +#endif + +static int gpio_keys_polled_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); + struct gpio_keys_polled_dev *bdev; + struct input_polled_dev *poll_dev; + struct input_dev *input; + int error; + int i; + + if (!pdata) { + pdata = gpio_keys_polled_get_devtree_pdata(dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + if (!pdata) { + dev_err(dev, "missing platform data\n"); + return -EINVAL; + } + } + + if (!pdata->poll_interval) { + dev_err(dev, "missing poll_interval value\n"); + error = -EINVAL; + goto err_free_pdata; + } + + bdev = kzalloc(sizeof(struct gpio_keys_polled_dev) + + pdata->nbuttons * sizeof(struct gpio_keys_button_data), + GFP_KERNEL); + if (!bdev) { + dev_err(dev, "no memory for private data\n"); + error = -ENOMEM; + goto err_free_pdata; + } + + poll_dev = input_allocate_polled_device(); + if (!poll_dev) { + dev_err(dev, "no memory for polled device\n"); + error = -ENOMEM; + goto err_free_bdev; + } + + poll_dev->private = bdev; + poll_dev->poll = gpio_keys_polled_poll; + poll_dev->poll_interval = pdata->poll_interval; + poll_dev->open = gpio_keys_polled_open; + poll_dev->close = gpio_keys_polled_close; + + input = poll_dev->input; + + input->name = pdev->name; + input->phys = DRV_NAME"/input0"; + input->dev.parent = &pdev->dev; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + __set_bit(EV_KEY, input->evbit); + if (pdata->rep) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < pdata->nbuttons; i++) { + struct gpio_keys_button *button = &pdata->buttons[i]; + struct gpio_keys_button_data *bdata = &bdev->data[i]; + unsigned int gpio = button->gpio; + unsigned int type = button->type ?: EV_KEY; + + if (button->wakeup) { + dev_err(dev, DRV_NAME " does not support wakeup\n"); + error = -EINVAL; + goto err_free_gpio; + } + + error = gpio_request_one(gpio, GPIOF_IN, + button->desc ?: DRV_NAME); + if (error) { + dev_err(dev, "unable to claim gpio %u, err=%d\n", + gpio, error); + goto err_free_gpio; + } + + bdata->can_sleep = gpio_cansleep(gpio); + bdata->last_state = -1; + bdata->threshold = DIV_ROUND_UP(button->debounce_interval, + pdata->poll_interval); + + input_set_capability(input, type, button->code); + } + + bdev->poll_dev = poll_dev; + bdev->dev = dev; + bdev->pdata = pdata; + platform_set_drvdata(pdev, bdev); + + error = input_register_polled_device(poll_dev); + if (error) { + dev_err(dev, "unable to register polled device, err=%d\n", + error); + goto err_free_gpio; + } + + /* report initial state of the buttons */ + for (i = 0; i < pdata->nbuttons; i++) + gpio_keys_polled_check_state(input, &pdata->buttons[i], + &bdev->data[i]); + + return 0; + +err_free_gpio: + while (--i >= 0) + gpio_free(pdata->buttons[i].gpio); + + input_free_polled_device(poll_dev); + +err_free_bdev: + kfree(bdev); + platform_set_drvdata(pdev, NULL); + +err_free_pdata: + /* If we have no platform_data, we allocated pdata dynamically. */ + if (!dev_get_platdata(&pdev->dev)) + kfree(pdata); + + return error; +} + +static int gpio_keys_polled_remove(struct platform_device *pdev) +{ + struct gpio_keys_polled_dev *bdev = platform_get_drvdata(pdev); + const struct gpio_keys_platform_data *pdata = bdev->pdata; + int i; + + input_unregister_polled_device(bdev->poll_dev); + + for (i = 0; i < pdata->nbuttons; i++) + gpio_free(pdata->buttons[i].gpio); + + input_free_polled_device(bdev->poll_dev); + + /* + * If we had no platform_data, we allocated pdata dynamically and + * must free it here. + */ + if (!dev_get_platdata(&pdev->dev)) + kfree(pdata); + + kfree(bdev); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver gpio_keys_polled_driver = { + .probe = gpio_keys_polled_probe, + .remove = gpio_keys_polled_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(gpio_keys_polled_of_match), + }, +}; +module_platform_driver(gpio_keys_polled_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Gabor Juhos "); +MODULE_DESCRIPTION("Polled GPIO Buttons driver"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/drivers/input/keyboard/gpio_keys_sprd.c b/drivers/input/keyboard/gpio_keys_sprd.c new file mode 100644 index 00000000..e6c16510 --- /dev/null +++ b/drivers/input/keyboard/gpio_keys_sprd.c @@ -0,0 +1,938 @@ +/* + * Driver for keys on GPIO lines capable of generating interrupts. + * + * Copyright 2005 Phil Blundell + * Copyright 2010, 2011 David Jander + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//==================== debug ==================== +static int debug_level = 1; +#define ENTER \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_GPIO_KEYS_DBG] func: %s line: %04d\n", __func__, __LINE__); }while(0) + +#define PRINT_DBG(format,x...) \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_GPIO_KEYS_DBG] " format, ## x); }while(0) + +#define PRINT_INFO(format,x...) \ +do{ printk(KERN_INFO "[SPRD_GPIO_KEYS_INFO] " format, ## x); }while(0) + +#define PRINT_WARN(format,x...) \ +do{ printk(KERN_INFO "[SPRD_GPIO_KEYS_WARN] " format, ## x); }while(0) + +#define PRINT_ERR(format,x...) \ +do{ printk(KERN_ERR "[SPRD_GPIO_KEYS_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x); }while(0) +//==================== debug ==================== + +struct gpio_button_data { + const struct gpio_keys_button *button; + struct input_dev *input; + struct timer_list timer; + struct work_struct work; + unsigned int timer_debounce; /* in msecs */ + unsigned int irq; + spinlock_t lock; + bool disabled; + bool key_pressed; +}; + +struct gpio_keys_drvdata { + const struct gpio_keys_platform_data *pdata; + struct input_dev *input; + struct mutex disable_lock; + struct gpio_button_data data[0]; +}; + +/* + * SYSFS interface for enabling/disabling keys and switches: + * + * There are 4 attributes under /sys/devices/platform/gpio-keys/ + * keys [ro] - bitmap of keys (EV_KEY) which can be + * disabled + * switches [ro] - bitmap of switches (EV_SW) which can be + * disabled + * disabled_keys [rw] - bitmap of keys currently disabled + * disabled_switches [rw] - bitmap of switches currently disabled + * + * Userland can change these values and hence disable event generation + * for each key (or switch). Disabling a key means its interrupt line + * is disabled. + * + * For example, if we have following switches set up as gpio-keys: + * SW_DOCK = 5 + * SW_CAMERA_LENS_COVER = 9 + * SW_KEYPAD_SLIDE = 10 + * SW_FRONT_PROXIMITY = 11 + * This is read from switches: + * 11-9,5 + * Next we want to disable proximity (11) and dock (5), we write: + * 11,5 + * to file disabled_switches. Now proximity and dock IRQs are disabled. + * This can be verified by reading the file disabled_switches: + * 11,5 + * If we now want to enable proximity (11) switch we write: + * 5 + * to disabled_switches. + * + * We can disable only those keys which don't allow sharing the irq. + */ + +/** + * get_n_events_by_type() - returns maximum number of events per @type + * @type: type of button (%EV_KEY, %EV_SW) + * + * Return value of this function can be used to allocate bitmap + * large enough to hold all bits for given type. + */ +static inline int get_n_events_by_type(int type) +{ + BUG_ON(type != EV_SW && type != EV_KEY); + + return (type == EV_KEY) ? KEY_CNT : SW_CNT; +} + +/** + * gpio_keys_disable_button() - disables given GPIO button + * @bdata: button data for button to be disabled + * + * Disables button pointed by @bdata. This is done by masking + * IRQ line. After this function is called, button won't generate + * input events anymore. Note that one can only disable buttons + * that don't share IRQs. + * + * Make sure that @bdata->disable_lock is locked when entering + * this function to avoid races when concurrent threads are + * disabling buttons at the same time. + */ +static void gpio_keys_disable_button(struct gpio_button_data *bdata) +{ + if (!bdata->disabled) { + /* + * Disable IRQ and possible debouncing timer. + */ + disable_irq(bdata->irq); + if (bdata->timer_debounce) + del_timer_sync(&bdata->timer); + + bdata->disabled = true; + } +} + +/** + * gpio_keys_enable_button() - enables given GPIO button + * @bdata: button data for button to be disabled + * + * Enables given button pointed by @bdata. + * + * Make sure that @bdata->disable_lock is locked when entering + * this function to avoid races with concurrent threads trying + * to enable the same button at the same time. + */ +static void gpio_keys_enable_button(struct gpio_button_data *bdata) +{ + if (bdata->disabled) { + enable_irq(bdata->irq); + bdata->disabled = false; + } +} + +/** + * gpio_keys_attr_show_helper() - fill in stringified bitmap of buttons + * @ddata: pointer to drvdata + * @buf: buffer where stringified bitmap is written + * @type: button type (%EV_KEY, %EV_SW) + * @only_disabled: does caller want only those buttons that are + * currently disabled or all buttons that can be + * disabled + * + * This function writes buttons that can be disabled to @buf. If + * @only_disabled is true, then @buf contains only those buttons + * that are currently disabled. Returns 0 on success or negative + * errno on failure. + */ +static ssize_t gpio_keys_attr_show_helper(struct gpio_keys_drvdata *ddata, + char *buf, unsigned int type, + bool only_disabled) +{ + int n_events = get_n_events_by_type(type); + unsigned long *bits; + ssize_t ret; + int i; + + bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); + if (!bits) + return -ENOMEM; + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + + if (bdata->button->type != type) + continue; + + if (only_disabled && !bdata->disabled) + continue; + + __set_bit(bdata->button->code, bits); + } + + ret = bitmap_scnlistprintf(buf, PAGE_SIZE - 2, bits, n_events); + buf[ret++] = '\n'; + buf[ret] = '\0'; + + kfree(bits); + + return ret; +} + +/** + * gpio_keys_attr_store_helper() - enable/disable buttons based on given bitmap + * @ddata: pointer to drvdata + * @buf: buffer from userspace that contains stringified bitmap + * @type: button type (%EV_KEY, %EV_SW) + * + * This function parses stringified bitmap from @buf and disables/enables + * GPIO buttons accordingly. Returns 0 on success and negative error + * on failure. + */ +static ssize_t gpio_keys_attr_store_helper(struct gpio_keys_drvdata *ddata, + const char *buf, unsigned int type) +{ + int n_events = get_n_events_by_type(type); + unsigned long *bits; + ssize_t error; + int i; + + bits = kcalloc(BITS_TO_LONGS(n_events), sizeof(*bits), GFP_KERNEL); + if (!bits) + return -ENOMEM; + + error = bitmap_parselist(buf, bits, n_events); + if (error) + goto out; + + /* First validate */ + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + + if (bdata->button->type != type) + continue; + + if (test_bit(bdata->button->code, bits) && + !bdata->button->can_disable) { + error = -EINVAL; + goto out; + } + } + + mutex_lock(&ddata->disable_lock); + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + + if (bdata->button->type != type) + continue; + + if (test_bit(bdata->button->code, bits)) + gpio_keys_disable_button(bdata); + else + gpio_keys_enable_button(bdata); + } + + mutex_unlock(&ddata->disable_lock); + +out: + kfree(bits); + return error; +} + +#define ATTR_SHOW_FN(name, type, only_disabled) \ +static ssize_t gpio_keys_show_##name(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + struct platform_device *pdev = to_platform_device(dev); \ + struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ + \ + return gpio_keys_attr_show_helper(ddata, buf, \ + type, only_disabled); \ +} + +ATTR_SHOW_FN(keys, EV_KEY, false); +ATTR_SHOW_FN(switches, EV_SW, false); +ATTR_SHOW_FN(disabled_keys, EV_KEY, true); +ATTR_SHOW_FN(disabled_switches, EV_SW, true); + +/* + * ATTRIBUTES: + * + * /sys/devices/platform/gpio-keys/keys [ro] + * /sys/devices/platform/gpio-keys/switches [ro] + */ +static DEVICE_ATTR(keys, S_IRUGO, gpio_keys_show_keys, NULL); +static DEVICE_ATTR(switches, S_IRUGO, gpio_keys_show_switches, NULL); + +#define ATTR_STORE_FN(name, type) \ +static ssize_t gpio_keys_store_##name(struct device *dev, \ + struct device_attribute *attr, \ + const char *buf, \ + size_t count) \ +{ \ + struct platform_device *pdev = to_platform_device(dev); \ + struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); \ + ssize_t error; \ + \ + error = gpio_keys_attr_store_helper(ddata, buf, type); \ + if (error) \ + return error; \ + \ + return count; \ +} + +ATTR_STORE_FN(disabled_keys, EV_KEY); +ATTR_STORE_FN(disabled_switches, EV_SW); + +/* + * ATTRIBUTES: + * + * /sys/devices/platform/gpio-keys/disabled_keys [rw] + * /sys/devices/platform/gpio-keys/disables_switches [rw] + */ +static DEVICE_ATTR(disabled_keys, S_IWUSR | S_IRUGO, + gpio_keys_show_disabled_keys, + gpio_keys_store_disabled_keys); +static DEVICE_ATTR(disabled_switches, S_IWUSR | S_IRUGO, + gpio_keys_show_disabled_switches, + gpio_keys_store_disabled_switches); + +static struct attribute *gpio_keys_attrs[] = { + &dev_attr_keys.attr, + &dev_attr_switches.attr, + &dev_attr_disabled_keys.attr, + &dev_attr_disabled_switches.attr, + NULL, +}; + +static struct attribute_group gpio_keys_attr_group = { + .attrs = gpio_keys_attrs, +}; + +static void gpio_keys_gpio_report_event(struct gpio_button_data *bdata) +{ + const struct gpio_keys_button *button = bdata->button; + struct input_dev *input = bdata->input; + unsigned int type = button->type ?: EV_KEY; + int state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low; + + if (type == EV_ABS) { + if (state) + input_event(input, type, button->code, button->value); + } else { + input_event(input, type, button->code, !!state); + PRINT_INFO("Key:%s ScanCode:%d value:%d\n", button->desc, button->code, !!state); + } + input_sync(input); +} + +static void gpio_keys_gpio_work_func(struct work_struct *work) +{ + struct gpio_button_data *bdata = + container_of(work, struct gpio_button_data, work); + + gpio_keys_gpio_report_event(bdata); + + if (bdata->button->wakeup) + pm_relax(bdata->input->dev.parent); +} + +static void gpio_keys_gpio_timer(unsigned long _data) +{ + struct gpio_button_data *bdata = (struct gpio_button_data *)_data; + + schedule_work(&bdata->work); +} + +static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id) +{ + struct gpio_button_data *bdata = dev_id; + + BUG_ON(irq != bdata->irq); + + if (bdata->button->wakeup) + pm_stay_awake(bdata->input->dev.parent); + if (bdata->timer_debounce) + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(bdata->timer_debounce)); + else + schedule_work(&bdata->work); + + return IRQ_HANDLED; +} + +static void gpio_keys_irq_timer(unsigned long _data) +{ + struct gpio_button_data *bdata = (struct gpio_button_data *)_data; + struct input_dev *input = bdata->input; + unsigned long flags; + + spin_lock_irqsave(&bdata->lock, flags); + if (bdata->key_pressed) { + input_event(input, EV_KEY, bdata->button->code, 0); + input_sync(input); + bdata->key_pressed = false; + } + spin_unlock_irqrestore(&bdata->lock, flags); +} + +static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id) +{ + struct gpio_button_data *bdata = dev_id; + const struct gpio_keys_button *button = bdata->button; + struct input_dev *input = bdata->input; + unsigned long flags; + + BUG_ON(irq != bdata->irq); + + spin_lock_irqsave(&bdata->lock, flags); + + if (!bdata->key_pressed) { + if (bdata->button->wakeup) + pm_wakeup_event(bdata->input->dev.parent, 0); + + input_event(input, EV_KEY, button->code, 1); + input_sync(input); + + if (!bdata->timer_debounce) { + input_event(input, EV_KEY, button->code, 0); + input_sync(input); + goto out; + } + + bdata->key_pressed = true; + } + + if (bdata->timer_debounce) + mod_timer(&bdata->timer, + jiffies + msecs_to_jiffies(bdata->timer_debounce)); +out: + spin_unlock_irqrestore(&bdata->lock, flags); + return IRQ_HANDLED; +} + +static int gpio_keys_setup_key(struct platform_device *pdev, + struct input_dev *input, + struct gpio_button_data *bdata, + const struct gpio_keys_button *button) +{ + const char *desc = button->desc ? button->desc : "gpio_keys"; + struct device *dev = &pdev->dev; + irq_handler_t isr; + unsigned long irqflags; + int irq, error; + + bdata->input = input; + bdata->button = button; + spin_lock_init(&bdata->lock); + + if (gpio_is_valid(button->gpio)) { + error = gpio_request_one(button->gpio, GPIOF_IN, desc); + if (error < 0) { + dev_err(dev, "Failed to request GPIO %d, error %d\n", + button->gpio, error); + return error; + } + + if (button->debounce_interval) { + error = gpio_set_debounce(button->gpio, + button->debounce_interval * 1000); + /* use timer if gpiolib doesn't provide debounce */ + if (error < 0) + bdata->timer_debounce = + button->debounce_interval; + } + + irq = gpio_to_irq(button->gpio); + if (irq < 0) { + error = irq; + dev_err(dev, + "Unable to get irq number for GPIO %d, error %d\n", + button->gpio, error); + goto fail; + } + bdata->irq = irq; + + INIT_WORK(&bdata->work, gpio_keys_gpio_work_func); + setup_timer(&bdata->timer, + gpio_keys_gpio_timer, (unsigned long)bdata); + + isr = gpio_keys_gpio_isr; + irqflags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; + + } else { + if (!button->irq) { + dev_err(dev, "No IRQ specified\n"); + return -EINVAL; + } + bdata->irq = button->irq; + + if (button->type && button->type != EV_KEY) { + dev_err(dev, "Only EV_KEY allowed for IRQ buttons.\n"); + return -EINVAL; + } + + bdata->timer_debounce = button->debounce_interval; + setup_timer(&bdata->timer, + gpio_keys_irq_timer, (unsigned long)bdata); + + isr = gpio_keys_irq_isr; + irqflags = 0; + } + + input_set_capability(input, button->type ?: EV_KEY, button->code); + + /* + * If platform has specified that the button can be disabled, + * we don't want it to share the interrupt line. + */ + if (!button->can_disable) + irqflags |= IRQF_SHARED; + + irqflags |= IRQF_NO_SUSPEND; + + error = request_any_context_irq(bdata->irq, isr, irqflags, desc, bdata); + if (error < 0) { + dev_err(dev, "Unable to claim irq %d; error %d\n", + bdata->irq, error); + goto fail; + } + + return 0; + +fail: + if (gpio_is_valid(button->gpio)) + gpio_free(button->gpio); + + return error; +} + +static void gpio_keys_report_state(struct gpio_keys_drvdata *ddata) +{ + struct input_dev *input = ddata->input; + int i; + + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (gpio_is_valid(bdata->button->gpio)) + gpio_keys_gpio_report_event(bdata); + } + input_sync(input); +} + +static int gpio_keys_open(struct input_dev *input) +{ + struct gpio_keys_drvdata *ddata = input_get_drvdata(input); + const struct gpio_keys_platform_data *pdata = ddata->pdata; + int error; + + if (pdata->enable) { + error = pdata->enable(input->dev.parent); + if (error) + return error; + } + + /* Report current state of buttons that are connected to GPIOs */ + gpio_keys_report_state(ddata); + + return 0; +} + +static void gpio_keys_close(struct input_dev *input) +{ + struct gpio_keys_drvdata *ddata = input_get_drvdata(input); + const struct gpio_keys_platform_data *pdata = ddata->pdata; + + if (pdata->disable) + pdata->disable(input->dev.parent); +} + +/* + * Handlers for alternative sources of platform_data + */ + +#ifdef CONFIG_OF +/* + * Translate OpenFirmware node properties into platform_data + */ +static struct gpio_keys_platform_data * +gpio_keys_get_devtree_pdata(struct device *dev) +{ + struct device_node *node, *pp; + struct gpio_keys_platform_data *pdata; + struct gpio_keys_button *button; + int error; + int nbuttons; + int i; + char *input_name = NULL; + int ret = -1; + + node = dev->of_node; + if (!node) { + error = -ENODEV; + goto err_out; + } + + nbuttons = of_get_child_count(node); + if (nbuttons == 0) { + error = -ENODEV; + goto err_out; + } + + pdata = kzalloc(sizeof(*pdata) + nbuttons * (sizeof *button), + GFP_KERNEL); + if (!pdata) { + error = -ENOMEM; + goto err_out; + } + + pdata->buttons = (struct gpio_keys_button *)(pdata + 1); + pdata->nbuttons = nbuttons; + + pdata->rep = !!of_get_property(node, "autorepeat", NULL); + + ret = of_property_read_string(node, "input-name", &input_name); + if (0 == ret) { + pdata->name = input_name; + PRINT_INFO("input-name=\"%s\"\n", input_name); + } + else + PRINT_WARN("failed to get input-name\n"); + + i = 0; + for_each_child_of_node(node, pp) { + int gpio; + enum of_gpio_flags flags; + + if (!of_find_property(pp, "gpios", NULL)) { + pdata->nbuttons--; + dev_warn(dev, "Found button without gpios\n"); + continue; + } + + gpio = of_get_gpio_flags(pp, 0, &flags); + if (gpio < 0) { + error = gpio; + if (error != -EPROBE_DEFER) + dev_err(dev, + "Failed to get gpio flags, error: %d\n", + error); + goto err_free_pdata; + } + + button = &pdata->buttons[i++]; + + button->gpio = gpio; + button->active_low = flags & OF_GPIO_ACTIVE_LOW; + + if (of_property_read_u32(pp, "linux,code", &button->code)) { + dev_err(dev, "Button without keycode: 0x%x\n", + button->gpio); + error = -EINVAL; + goto err_free_pdata; + } + + button->desc = of_get_property(pp, "label", NULL); + + if (of_property_read_u32(pp, "linux,input-type", &button->type)) + button->type = EV_KEY; + + button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL); + + if (of_property_read_u32(pp, "debounce-interval", + &button->debounce_interval)) + button->debounce_interval = 5; + } + + if (pdata->nbuttons == 0) { + error = -EINVAL; + goto err_free_pdata; + } + + return pdata; + +err_free_pdata: + kfree(pdata); +err_out: + return ERR_PTR(error); +} + +static struct of_device_id gpio_keys_of_match[] = { + { .compatible = "gpio-keys", }, + { }, +}; +MODULE_DEVICE_TABLE(of, gpio_keys_of_match); + +#else + +static inline struct gpio_keys_platform_data * +gpio_keys_get_devtree_pdata(struct device *dev) +{ + return ERR_PTR(-ENODEV); +} + +#endif + +static void gpio_remove_key(struct gpio_button_data *bdata) +{ + free_irq(bdata->irq, bdata); + if (bdata->timer_debounce) + del_timer_sync(&bdata->timer); + cancel_work_sync(&bdata->work); + if (gpio_is_valid(bdata->button->gpio)) + gpio_free(bdata->button->gpio); +} + +static int gpio_keys_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + const struct gpio_keys_platform_data *pdata = dev_get_platdata(dev); + struct gpio_keys_drvdata *ddata; + struct input_dev *input; + int i, error; + int wakeup = 0; + + ENTER; + if (!pdata) { + pdata = gpio_keys_get_devtree_pdata(dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + } + + ddata = kzalloc(sizeof(struct gpio_keys_drvdata) + + pdata->nbuttons * sizeof(struct gpio_button_data), + GFP_KERNEL); + input = input_allocate_device(); + if (!ddata || !input) { + dev_err(dev, "failed to allocate state\n"); + error = -ENOMEM; + goto fail1; + } + + ddata->pdata = pdata; + ddata->input = input; + mutex_init(&ddata->disable_lock); + + platform_set_drvdata(pdev, ddata); + input_set_drvdata(input, ddata); +#ifndef CONFIG_OF + input->name = pdata->name ? pdata->name : pdev->name; +#else + input->name = pdata->name ? pdata->name : "gpio-keys"; +#endif + input->phys = "gpio-keys/input0"; + input->dev.parent = &pdev->dev; + input->open = gpio_keys_open; + input->close = gpio_keys_close; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + /* Enable auto repeat feature of Linux input subsystem */ + if (pdata->rep) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < pdata->nbuttons; i++) { + const struct gpio_keys_button *button = &pdata->buttons[i]; + struct gpio_button_data *bdata = &ddata->data[i]; + + error = gpio_keys_setup_key(pdev, input, bdata, button); + if (error) + goto fail2; + + if (button->wakeup) + wakeup = 1; + } + + error = sysfs_create_group(&pdev->dev.kobj, &gpio_keys_attr_group); + if (error) { + dev_err(dev, "Unable to export keys/switches, error: %d\n", + error); + goto fail2; + } + + error = input_register_device(input); + if (error) { + dev_err(dev, "Unable to register input device, error: %d\n", + error); + goto fail3; + } + + device_init_wakeup(&pdev->dev, wakeup); + + PRINT_INFO("probe success!\n"); + return 0; + + fail3: + sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); + fail2: + while (--i >= 0) + gpio_remove_key(&ddata->data[i]); + + platform_set_drvdata(pdev, NULL); + fail1: + input_free_device(input); + kfree(ddata); + /* If we have no platform data, we allocated pdata dynamically. */ + if (!dev_get_platdata(&pdev->dev)) + kfree(pdata); + + PRINT_ERR("probe failed!\n"); + return error; +} + +static int gpio_keys_remove(struct platform_device *pdev) +{ + struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev); + struct input_dev *input = ddata->input; + int i; + + sysfs_remove_group(&pdev->dev.kobj, &gpio_keys_attr_group); + + device_init_wakeup(&pdev->dev, 0); + + for (i = 0; i < ddata->pdata->nbuttons; i++) + gpio_remove_key(&ddata->data[i]); + + input_unregister_device(input); + + /* If we have no platform data, we allocated pdata dynamically. */ + if (!dev_get_platdata(&pdev->dev)) + kfree(ddata->pdata); + + kfree(ddata); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int gpio_keys_suspend(struct device *dev) +{ + struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); + struct input_dev *input = ddata->input; + int i; + + if (device_may_wakeup(dev)) { + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (bdata->button->wakeup) + enable_irq_wake(bdata->irq); + } + } else { + mutex_lock(&input->mutex); + if (input->users) + gpio_keys_close(input); + mutex_unlock(&input->mutex); + } + + return 0; +} + +static int gpio_keys_resume(struct device *dev) +{ + struct gpio_keys_drvdata *ddata = dev_get_drvdata(dev); + struct input_dev *input = ddata->input; + int error = 0; + int i; + + if (device_may_wakeup(dev)) { + for (i = 0; i < ddata->pdata->nbuttons; i++) { + struct gpio_button_data *bdata = &ddata->data[i]; + if (bdata->button->wakeup) + disable_irq_wake(bdata->irq); + } + } else { + mutex_lock(&input->mutex); + if (input->users) + error = gpio_keys_open(input); + mutex_unlock(&input->mutex); + } + + if (error) + return error; + + gpio_keys_report_state(ddata); + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(gpio_keys_pm_ops, gpio_keys_suspend, gpio_keys_resume); + +static struct platform_driver gpio_keys_device_driver = { + .probe = gpio_keys_probe, + .remove = gpio_keys_remove, + .driver = { + .name = "gpio-keys", + .owner = THIS_MODULE, + .pm = &gpio_keys_pm_ops, + .of_match_table = of_match_ptr(gpio_keys_of_match), + } +}; + +static int __init gpio_keys_init(void) +{ + ENTER; + +/***************************************************************/ + struct device_node *node = of_find_compatible_node(NULL, NULL, "gpio-keys"); + if(node) { + PRINT_INFO("Find the node name:%s\n",node->name); + + struct platform_device *dev = of_find_device_by_node(node); + if(dev) + PRINT_INFO("Find the device name:%s\n",dev->name); + else + PRINT_INFO("Not Find the device\n"); + } + else + PRINT_INFO("Not Find the node\n"); +/***************************************************************/ + + return platform_driver_register(&gpio_keys_device_driver); +} + +static void __exit gpio_keys_exit(void) +{ + platform_driver_unregister(&gpio_keys_device_driver); +} + +late_initcall(gpio_keys_init); +module_exit(gpio_keys_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Phil Blundell "); +MODULE_DESCRIPTION("Keyboard driver for GPIOs"); +MODULE_ALIAS("platform:gpio-keys"); diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c new file mode 100644 index 00000000..589e3c25 --- /dev/null +++ b/drivers/input/keyboard/hil_kbd.c @@ -0,0 +1,586 @@ +/* + * Generic linux-input device driver for keyboard devices + * + * Copyright (c) 2001 Brian S. Julin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * + * References: + * HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PREFIX "HIL: " + +MODULE_AUTHOR("Brian S. Julin "); +MODULE_DESCRIPTION("HIL keyboard/mouse driver"); +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_ALIAS("serio:ty03pr25id00ex*"); /* HIL keyboard */ +MODULE_ALIAS("serio:ty03pr25id0Fex*"); /* HIL mouse */ + +#define HIL_PACKET_MAX_LENGTH 16 + +#define HIL_KBD_SET1_UPBIT 0x01 +#define HIL_KBD_SET1_SHIFT 1 +static unsigned int hil_kbd_set1[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly = + { HIL_KEYCODES_SET1 }; + +#define HIL_KBD_SET2_UPBIT 0x01 +#define HIL_KBD_SET2_SHIFT 1 +/* Set2 is user defined */ + +#define HIL_KBD_SET3_UPBIT 0x80 +#define HIL_KBD_SET3_SHIFT 0 +static unsigned int hil_kbd_set3[HIL_KEYCODES_SET3_TBLSIZE] __read_mostly = + { HIL_KEYCODES_SET3 }; + +static const char hil_language[][16] = { HIL_LOCALE_MAP }; + +struct hil_dev { + struct input_dev *dev; + struct serio *serio; + + /* Input buffer and index for packets from HIL bus. */ + hil_packet data[HIL_PACKET_MAX_LENGTH]; + int idx4; /* four counts per packet */ + + /* Raw device info records from HIL bus, see hil.h for fields. */ + char idd[HIL_PACKET_MAX_LENGTH]; /* DID byte and IDD record */ + char rsc[HIL_PACKET_MAX_LENGTH]; /* RSC record */ + char exd[HIL_PACKET_MAX_LENGTH]; /* EXD record */ + char rnm[HIL_PACKET_MAX_LENGTH + 1]; /* RNM record + NULL term. */ + + struct completion cmd_done; + + bool is_pointer; + /* Extra device details needed for pointing devices. */ + unsigned int nbtn, naxes; + unsigned int btnmap[7]; +}; + +static bool hil_dev_is_command_response(hil_packet p) +{ + if ((p & ~HIL_CMDCT_POL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) + return false; + + if ((p & ~HIL_CMDCT_RPL) == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_RPL)) + return false; + + return true; +} + +static void hil_dev_handle_command_response(struct hil_dev *dev) +{ + hil_packet p; + char *buf; + int i, idx; + + idx = dev->idx4 / 4; + p = dev->data[idx - 1]; + + switch (p & HIL_PKT_DATA_MASK) { + case HIL_CMD_IDD: + buf = dev->idd; + break; + + case HIL_CMD_RSC: + buf = dev->rsc; + break; + + case HIL_CMD_EXD: + buf = dev->exd; + break; + + case HIL_CMD_RNM: + dev->rnm[HIL_PACKET_MAX_LENGTH] = 0; + buf = dev->rnm; + break; + + default: + /* These occur when device isn't present */ + if (p != (HIL_ERR_INT | HIL_PKT_CMD)) { + /* Anything else we'd like to know about. */ + printk(KERN_WARNING PREFIX "Device sent unknown record %x\n", p); + } + goto out; + } + + for (i = 0; i < idx; i++) + buf[i] = dev->data[i] & HIL_PKT_DATA_MASK; + for (; i < HIL_PACKET_MAX_LENGTH; i++) + buf[i] = 0; + out: + complete(&dev->cmd_done); +} + +static void hil_dev_handle_kbd_events(struct hil_dev *kbd) +{ + struct input_dev *dev = kbd->dev; + int idx = kbd->idx4 / 4; + int i; + + switch (kbd->data[0] & HIL_POL_CHARTYPE_MASK) { + case HIL_POL_CHARTYPE_NONE: + return; + + case HIL_POL_CHARTYPE_ASCII: + for (i = 1; i < idx - 1; i++) + input_report_key(dev, kbd->data[i] & 0x7f, 1); + break; + + case HIL_POL_CHARTYPE_RSVD1: + case HIL_POL_CHARTYPE_RSVD2: + case HIL_POL_CHARTYPE_BINARY: + for (i = 1; i < idx - 1; i++) + input_report_key(dev, kbd->data[i], 1); + break; + + case HIL_POL_CHARTYPE_SET1: + for (i = 1; i < idx - 1; i++) { + unsigned int key = kbd->data[i]; + int up = key & HIL_KBD_SET1_UPBIT; + + key &= (~HIL_KBD_SET1_UPBIT & 0xff); + key = hil_kbd_set1[key >> HIL_KBD_SET1_SHIFT]; + input_report_key(dev, key, !up); + } + break; + + case HIL_POL_CHARTYPE_SET2: + for (i = 1; i < idx - 1; i++) { + unsigned int key = kbd->data[i]; + int up = key & HIL_KBD_SET2_UPBIT; + + key &= (~HIL_KBD_SET1_UPBIT & 0xff); + key = key >> HIL_KBD_SET2_SHIFT; + input_report_key(dev, key, !up); + } + break; + + case HIL_POL_CHARTYPE_SET3: + for (i = 1; i < idx - 1; i++) { + unsigned int key = kbd->data[i]; + int up = key & HIL_KBD_SET3_UPBIT; + + key &= (~HIL_KBD_SET1_UPBIT & 0xff); + key = hil_kbd_set3[key >> HIL_KBD_SET3_SHIFT]; + input_report_key(dev, key, !up); + } + break; + } + + input_sync(dev); +} + +static void hil_dev_handle_ptr_events(struct hil_dev *ptr) +{ + struct input_dev *dev = ptr->dev; + int idx = ptr->idx4 / 4; + hil_packet p = ptr->data[idx - 1]; + int i, cnt, laxis; + bool absdev, ax16; + + if ((p & HIL_CMDCT_POL) != idx - 1) { + printk(KERN_WARNING PREFIX + "Malformed poll packet %x (idx = %i)\n", p, idx); + return; + } + + i = (p & HIL_POL_AXIS_ALT) ? 3 : 0; + laxis = (p & HIL_POL_NUM_AXES_MASK) + i; + + ax16 = ptr->idd[1] & HIL_IDD_HEADER_16BIT; /* 8 or 16bit resolution */ + absdev = ptr->idd[1] & HIL_IDD_HEADER_ABS; + + for (cnt = 1; i < laxis; i++) { + unsigned int lo, hi, val; + + lo = ptr->data[cnt++] & HIL_PKT_DATA_MASK; + hi = ax16 ? (ptr->data[cnt++] & HIL_PKT_DATA_MASK) : 0; + + if (absdev) { + val = lo + (hi << 8); +#ifdef TABLET_AUTOADJUST + if (val < input_abs_get_min(dev, ABS_X + i)) + input_abs_set_min(dev, ABS_X + i, val); + if (val > input_abs_get_max(dev, ABS_X + i)) + input_abs_set_max(dev, ABS_X + i, val); +#endif + if (i % 3) + val = input_abs_get_max(dev, ABS_X + i) - val; + input_report_abs(dev, ABS_X + i, val); + } else { + val = (int) (((int8_t) lo) | ((int8_t) hi << 8)); + if (i % 3) + val *= -1; + input_report_rel(dev, REL_X + i, val); + } + } + + while (cnt < idx - 1) { + unsigned int btn = ptr->data[cnt++]; + int up = btn & 1; + + btn &= 0xfe; + if (btn == 0x8e) + continue; /* TODO: proximity == touch? */ + if (btn > 0x8c || btn < 0x80) + continue; + btn = (btn - 0x80) >> 1; + btn = ptr->btnmap[btn]; + input_report_key(dev, btn, !up); + } + + input_sync(dev); +} + +static void hil_dev_process_err(struct hil_dev *dev) +{ + printk(KERN_WARNING PREFIX "errored HIL packet\n"); + dev->idx4 = 0; + complete(&dev->cmd_done); /* just in case somebody is waiting */ +} + +static irqreturn_t hil_dev_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct hil_dev *dev; + hil_packet packet; + int idx; + + dev = serio_get_drvdata(serio); + BUG_ON(dev == NULL); + + if (dev->idx4 >= HIL_PACKET_MAX_LENGTH * sizeof(hil_packet)) { + hil_dev_process_err(dev); + goto out; + } + + idx = dev->idx4 / 4; + if (!(dev->idx4 % 4)) + dev->data[idx] = 0; + packet = dev->data[idx]; + packet |= ((hil_packet)data) << ((3 - (dev->idx4 % 4)) * 8); + dev->data[idx] = packet; + + /* Records of N 4-byte hil_packets must terminate with a command. */ + if ((++dev->idx4 % 4) == 0) { + if ((packet & 0xffff0000) != HIL_ERR_INT) { + hil_dev_process_err(dev); + } else if (packet & HIL_PKT_CMD) { + if (hil_dev_is_command_response(packet)) + hil_dev_handle_command_response(dev); + else if (dev->is_pointer) + hil_dev_handle_ptr_events(dev); + else + hil_dev_handle_kbd_events(dev); + dev->idx4 = 0; + } + } + out: + return IRQ_HANDLED; +} + +static void hil_dev_disconnect(struct serio *serio) +{ + struct hil_dev *dev = serio_get_drvdata(serio); + + BUG_ON(dev == NULL); + + serio_close(serio); + input_unregister_device(dev->dev); + serio_set_drvdata(serio, NULL); + kfree(dev); +} + +static void hil_dev_keyboard_setup(struct hil_dev *kbd) +{ + struct input_dev *input_dev = kbd->dev; + uint8_t did = kbd->idd[0]; + int i; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_dev->ledbit[0] = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) | + BIT_MASK(LED_SCROLLL); + + for (i = 0; i < 128; i++) { + __set_bit(hil_kbd_set1[i], input_dev->keybit); + __set_bit(hil_kbd_set3[i], input_dev->keybit); + } + __clear_bit(KEY_RESERVED, input_dev->keybit); + + input_dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE; + input_dev->keycodesize = sizeof(hil_kbd_set1[0]); + input_dev->keycode = hil_kbd_set1; + + input_dev->name = strlen(kbd->rnm) ? kbd->rnm : "HIL keyboard"; + input_dev->phys = "hpkbd/input0"; + + printk(KERN_INFO PREFIX "HIL keyboard found (did = 0x%02x, lang = %s)\n", + did, hil_language[did & HIL_IDD_DID_TYPE_KB_LANG_MASK]); +} + +static void hil_dev_pointer_setup(struct hil_dev *ptr) +{ + struct input_dev *input_dev = ptr->dev; + uint8_t did = ptr->idd[0]; + uint8_t *idd = ptr->idd + 1; + unsigned int naxsets = HIL_IDD_NUM_AXSETS(*idd); + unsigned int i, btntype; + const char *txt; + + ptr->naxes = HIL_IDD_NUM_AXES_PER_SET(*idd); + + switch (did & HIL_IDD_DID_TYPE_MASK) { + case HIL_IDD_DID_TYPE_REL: + input_dev->evbit[0] = BIT_MASK(EV_REL); + + for (i = 0; i < ptr->naxes; i++) + __set_bit(REL_X + i, input_dev->relbit); + + for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++) + __set_bit(REL_X + i, input_dev->relbit); + + txt = "relative"; + break; + + case HIL_IDD_DID_TYPE_ABS: + input_dev->evbit[0] = BIT_MASK(EV_ABS); + + for (i = 0; i < ptr->naxes; i++) + input_set_abs_params(input_dev, ABS_X + i, + 0, HIL_IDD_AXIS_MAX(idd, i), 0, 0); + + for (i = 3; naxsets > 1 && i < ptr->naxes + 3; i++) + input_set_abs_params(input_dev, ABS_X + i, + 0, HIL_IDD_AXIS_MAX(idd, i - 3), 0, 0); + +#ifdef TABLET_AUTOADJUST + for (i = 0; i < ABS_MAX; i++) { + int diff = input_abs_get_max(input_dev, ABS_X + i) / 10; + input_abs_set_min(input_dev, ABS_X + i, + input_abs_get_min(input_dev, ABS_X + i) + diff); + input_abs_set_max(input_dev, ABS_X + i, + input_abs_get_max(input_dev, ABS_X + i) - diff); + } +#endif + + txt = "absolute"; + break; + + default: + BUG(); + } + + ptr->nbtn = HIL_IDD_NUM_BUTTONS(idd); + if (ptr->nbtn) + input_dev->evbit[0] |= BIT_MASK(EV_KEY); + + btntype = BTN_MISC; + if ((did & HIL_IDD_DID_ABS_TABLET_MASK) == HIL_IDD_DID_ABS_TABLET) +#ifdef TABLET_SIMULATES_MOUSE + btntype = BTN_TOUCH; +#else + btntype = BTN_DIGI; +#endif + if ((did & HIL_IDD_DID_ABS_TSCREEN_MASK) == HIL_IDD_DID_ABS_TSCREEN) + btntype = BTN_TOUCH; + + if ((did & HIL_IDD_DID_REL_MOUSE_MASK) == HIL_IDD_DID_REL_MOUSE) + btntype = BTN_MOUSE; + + for (i = 0; i < ptr->nbtn; i++) { + __set_bit(btntype | i, input_dev->keybit); + ptr->btnmap[i] = btntype | i; + } + + if (btntype == BTN_MOUSE) { + /* Swap buttons 2 and 3 */ + ptr->btnmap[1] = BTN_MIDDLE; + ptr->btnmap[2] = BTN_RIGHT; + } + + input_dev->name = strlen(ptr->rnm) ? ptr->rnm : "HIL pointer device"; + + printk(KERN_INFO PREFIX + "HIL pointer device found (did: 0x%02x, axis: %s)\n", + did, txt); + printk(KERN_INFO PREFIX + "HIL pointer has %i buttons and %i sets of %i axes\n", + ptr->nbtn, naxsets, ptr->naxes); +} + +static int hil_dev_connect(struct serio *serio, struct serio_driver *drv) +{ + struct hil_dev *dev; + struct input_dev *input_dev; + uint8_t did, *idd; + int error; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!dev || !input_dev) { + error = -ENOMEM; + goto bail0; + } + + dev->serio = serio; + dev->dev = input_dev; + + error = serio_open(serio, drv); + if (error) + goto bail0; + + serio_set_drvdata(serio, dev); + + /* Get device info. MLC driver supplies devid/status/etc. */ + init_completion(&dev->cmd_done); + serio_write(serio, 0); + serio_write(serio, 0); + serio_write(serio, HIL_PKT_CMD >> 8); + serio_write(serio, HIL_CMD_IDD); + error = wait_for_completion_killable(&dev->cmd_done); + if (error) + goto bail1; + + init_completion(&dev->cmd_done); + serio_write(serio, 0); + serio_write(serio, 0); + serio_write(serio, HIL_PKT_CMD >> 8); + serio_write(serio, HIL_CMD_RSC); + error = wait_for_completion_killable(&dev->cmd_done); + if (error) + goto bail1; + + init_completion(&dev->cmd_done); + serio_write(serio, 0); + serio_write(serio, 0); + serio_write(serio, HIL_PKT_CMD >> 8); + serio_write(serio, HIL_CMD_RNM); + error = wait_for_completion_killable(&dev->cmd_done); + if (error) + goto bail1; + + init_completion(&dev->cmd_done); + serio_write(serio, 0); + serio_write(serio, 0); + serio_write(serio, HIL_PKT_CMD >> 8); + serio_write(serio, HIL_CMD_EXD); + error = wait_for_completion_killable(&dev->cmd_done); + if (error) + goto bail1; + + did = dev->idd[0]; + idd = dev->idd + 1; + + switch (did & HIL_IDD_DID_TYPE_MASK) { + case HIL_IDD_DID_TYPE_KB_INTEGRAL: + case HIL_IDD_DID_TYPE_KB_ITF: + case HIL_IDD_DID_TYPE_KB_RSVD: + case HIL_IDD_DID_TYPE_CHAR: + if (HIL_IDD_NUM_BUTTONS(idd) || + HIL_IDD_NUM_AXES_PER_SET(*idd)) { + printk(KERN_INFO PREFIX + "combo devices are not supported.\n"); + goto bail1; + } + + dev->is_pointer = false; + hil_dev_keyboard_setup(dev); + break; + + case HIL_IDD_DID_TYPE_REL: + case HIL_IDD_DID_TYPE_ABS: + dev->is_pointer = true; + hil_dev_pointer_setup(dev); + break; + + default: + goto bail1; + } + + input_dev->id.bustype = BUS_HIL; + input_dev->id.vendor = PCI_VENDOR_ID_HP; + input_dev->id.product = 0x0001; /* TODO: get from kbd->rsc */ + input_dev->id.version = 0x0100; /* TODO: get from kbd->rsc */ + input_dev->dev.parent = &serio->dev; + + if (!dev->is_pointer) { + serio_write(serio, 0); + serio_write(serio, 0); + serio_write(serio, HIL_PKT_CMD >> 8); + /* Enable Keyswitch Autorepeat 1 */ + serio_write(serio, HIL_CMD_EK1); + /* No need to wait for completion */ + } + + error = input_register_device(input_dev); + if (error) + goto bail1; + + return 0; + + bail1: + serio_close(serio); + serio_set_drvdata(serio, NULL); + bail0: + input_free_device(input_dev); + kfree(dev); + return error; +} + +static struct serio_device_id hil_dev_ids[] = { + { + .type = SERIO_HIL_MLC, + .proto = SERIO_HIL, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, hil_dev_ids); + +static struct serio_driver hil_serio_drv = { + .driver = { + .name = "hil_dev", + }, + .description = "HP HIL keyboard/mouse/tablet driver", + .id_table = hil_dev_ids, + .connect = hil_dev_connect, + .disconnect = hil_dev_disconnect, + .interrupt = hil_dev_interrupt +}; + +module_serio_driver(hil_serio_drv); diff --git a/drivers/input/keyboard/hilkbd.c b/drivers/input/keyboard/hilkbd.c new file mode 100644 index 00000000..198dc07a --- /dev/null +++ b/drivers/input/keyboard/hilkbd.c @@ -0,0 +1,398 @@ +/* + * linux/drivers/hil/hilkbd.c + * + * Copyright (C) 1998 Philip Blundell + * Copyright (C) 1999 Matthew Wilcox + * Copyright (C) 1999-2007 Helge Deller + * + * Very basic HP Human Interface Loop (HIL) driver. + * This driver handles the keyboard on HP300 (m68k) and on some + * HP700 (parisc) series machines. + * + * + * This file is subject to the terms and conditions of the GNU General Public + * License version 2. See the file COPYING in the main directory of this + * archive for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_HP300 +#include +#endif + + +MODULE_AUTHOR("Philip Blundell, Matthew Wilcox, Helge Deller"); +MODULE_DESCRIPTION("HIL keyboard driver (basic functionality)"); +MODULE_LICENSE("GPL v2"); + + +#if defined(CONFIG_PARISC) + + #include + #include + #include + static unsigned long hil_base; /* HPA for the HIL device */ + static unsigned int hil_irq; + #define HILBASE hil_base /* HPPA (parisc) port address */ + #define HIL_DATA 0x800 + #define HIL_CMD 0x801 + #define HIL_IRQ hil_irq + #define hil_readb(p) gsc_readb(p) + #define hil_writeb(v,p) gsc_writeb((v),(p)) + +#elif defined(CONFIG_HP300) + + #define HILBASE 0xf0428000UL /* HP300 (m68k) port address */ + #define HIL_DATA 0x1 + #define HIL_CMD 0x3 + #define HIL_IRQ 2 + #define hil_readb(p) readb(p) + #define hil_writeb(v,p) writeb((v),(p)) + +#else +#error "HIL is not supported on this platform" +#endif + + + +/* HIL helper functions */ + +#define hil_busy() (hil_readb(HILBASE + HIL_CMD) & HIL_BUSY) +#define hil_data_available() (hil_readb(HILBASE + HIL_CMD) & HIL_DATA_RDY) +#define hil_status() (hil_readb(HILBASE + HIL_CMD)) +#define hil_command(x) do { hil_writeb((x), HILBASE + HIL_CMD); } while (0) +#define hil_read_data() (hil_readb(HILBASE + HIL_DATA)) +#define hil_write_data(x) do { hil_writeb((x), HILBASE + HIL_DATA); } while (0) + +/* HIL constants */ + +#define HIL_BUSY 0x02 +#define HIL_DATA_RDY 0x01 + +#define HIL_SETARD 0xA0 /* set auto-repeat delay */ +#define HIL_SETARR 0xA2 /* set auto-repeat rate */ +#define HIL_SETTONE 0xA3 /* set tone generator */ +#define HIL_CNMT 0xB2 /* clear nmi */ +#define HIL_INTON 0x5C /* Turn on interrupts. */ +#define HIL_INTOFF 0x5D /* Turn off interrupts. */ + +#define HIL_READKBDSADR 0xF9 +#define HIL_WRITEKBDSADR 0xE9 + +static unsigned int hphilkeyb_keycode[HIL_KEYCODES_SET1_TBLSIZE] __read_mostly = + { HIL_KEYCODES_SET1 }; + +/* HIL structure */ +static struct { + struct input_dev *dev; + + unsigned int curdev; + + unsigned char s; + unsigned char c; + int valid; + + unsigned char data[16]; + unsigned int ptr; + spinlock_t lock; + + void *dev_id; /* native bus device */ +} hil_dev; + + +static void poll_finished(void) +{ + int down; + int key; + unsigned char scode; + + switch (hil_dev.data[0]) { + case 0x40: + down = (hil_dev.data[1] & 1) == 0; + scode = hil_dev.data[1] >> 1; + key = hphilkeyb_keycode[scode]; + input_report_key(hil_dev.dev, key, down); + break; + } + hil_dev.curdev = 0; +} + + +static inline void handle_status(unsigned char s, unsigned char c) +{ + if (c & 0x8) { + /* End of block */ + if (c & 0x10) + poll_finished(); + } else { + if (c & 0x10) { + if (hil_dev.curdev) + poll_finished(); /* just in case */ + hil_dev.curdev = c & 7; + hil_dev.ptr = 0; + } + } +} + + +static inline void handle_data(unsigned char s, unsigned char c) +{ + if (hil_dev.curdev) { + hil_dev.data[hil_dev.ptr++] = c; + hil_dev.ptr &= 15; + } +} + + +/* handle HIL interrupts */ +static irqreturn_t hil_interrupt(int irq, void *handle) +{ + unsigned char s, c; + + s = hil_status(); + c = hil_read_data(); + + switch (s >> 4) { + case 0x5: + handle_status(s, c); + break; + case 0x6: + handle_data(s, c); + break; + case 0x4: + hil_dev.s = s; + hil_dev.c = c; + mb(); + hil_dev.valid = 1; + break; + } + return IRQ_HANDLED; +} + + +/* send a command to the HIL */ +static void hil_do(unsigned char cmd, unsigned char *data, unsigned int len) +{ + unsigned long flags; + + spin_lock_irqsave(&hil_dev.lock, flags); + while (hil_busy()) + /* wait */; + hil_command(cmd); + while (len--) { + while (hil_busy()) + /* wait */; + hil_write_data(*(data++)); + } + spin_unlock_irqrestore(&hil_dev.lock, flags); +} + + +/* initialize HIL */ +static int hil_keyb_init(void) +{ + unsigned char c; + unsigned int i, kbid; + wait_queue_head_t hil_wait; + int err; + + if (hil_dev.dev) + return -ENODEV; /* already initialized */ + + init_waitqueue_head(&hil_wait); + spin_lock_init(&hil_dev.lock); + + hil_dev.dev = input_allocate_device(); + if (!hil_dev.dev) + return -ENOMEM; + + err = request_irq(HIL_IRQ, hil_interrupt, 0, "hil", hil_dev.dev_id); + if (err) { + printk(KERN_ERR "HIL: Can't get IRQ\n"); + goto err1; + } + + /* Turn on interrupts */ + hil_do(HIL_INTON, NULL, 0); + + /* Look for keyboards */ + hil_dev.valid = 0; /* clear any pending data */ + hil_do(HIL_READKBDSADR, NULL, 0); + + wait_event_interruptible_timeout(hil_wait, hil_dev.valid, 3 * HZ); + if (!hil_dev.valid) + printk(KERN_WARNING "HIL: timed out, assuming no keyboard present\n"); + + c = hil_dev.c; + hil_dev.valid = 0; + if (c == 0) { + kbid = -1; + printk(KERN_WARNING "HIL: no keyboard present\n"); + } else { + kbid = ffz(~c); + printk(KERN_INFO "HIL: keyboard found at id %d\n", kbid); + } + + /* set it to raw mode */ + c = 0; + hil_do(HIL_WRITEKBDSADR, &c, 1); + + for (i = 0; i < HIL_KEYCODES_SET1_TBLSIZE; i++) + if (hphilkeyb_keycode[i] != KEY_RESERVED) + __set_bit(hphilkeyb_keycode[i], hil_dev.dev->keybit); + + hil_dev.dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + hil_dev.dev->ledbit[0] = BIT_MASK(LED_NUML) | BIT_MASK(LED_CAPSL) | + BIT_MASK(LED_SCROLLL); + hil_dev.dev->keycodemax = HIL_KEYCODES_SET1_TBLSIZE; + hil_dev.dev->keycodesize= sizeof(hphilkeyb_keycode[0]); + hil_dev.dev->keycode = hphilkeyb_keycode; + hil_dev.dev->name = "HIL keyboard"; + hil_dev.dev->phys = "hpkbd/input0"; + + hil_dev.dev->id.bustype = BUS_HIL; + hil_dev.dev->id.vendor = PCI_VENDOR_ID_HP; + hil_dev.dev->id.product = 0x0001; + hil_dev.dev->id.version = 0x0010; + + err = input_register_device(hil_dev.dev); + if (err) { + printk(KERN_ERR "HIL: Can't register device\n"); + goto err2; + } + + printk(KERN_INFO "input: %s, ID %d at 0x%08lx (irq %d) found and attached\n", + hil_dev.dev->name, kbid, HILBASE, HIL_IRQ); + + return 0; + +err2: + hil_do(HIL_INTOFF, NULL, 0); + free_irq(HIL_IRQ, hil_dev.dev_id); +err1: + input_free_device(hil_dev.dev); + hil_dev.dev = NULL; + return err; +} + +static void hil_keyb_exit(void) +{ + if (HIL_IRQ) + free_irq(HIL_IRQ, hil_dev.dev_id); + + /* Turn off interrupts */ + hil_do(HIL_INTOFF, NULL, 0); + + input_unregister_device(hil_dev.dev); + hil_dev.dev = NULL; +} + +#if defined(CONFIG_PARISC) +static int hil_probe_chip(struct parisc_device *dev) +{ + /* Only allow one HIL keyboard */ + if (hil_dev.dev) + return -ENODEV; + + if (!dev->irq) { + printk(KERN_WARNING "HIL: IRQ not found for HIL bus at 0x%p\n", + (void *)dev->hpa.start); + return -ENODEV; + } + + hil_base = dev->hpa.start; + hil_irq = dev->irq; + hil_dev.dev_id = dev; + + printk(KERN_INFO "Found HIL bus at 0x%08lx, IRQ %d\n", hil_base, hil_irq); + + return hil_keyb_init(); +} + +static int hil_remove_chip(struct parisc_device *dev) +{ + hil_keyb_exit(); + + return 0; +} + +static struct parisc_device_id hil_tbl[] = { + { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00073 }, + { 0, } +}; + +#if 0 +/* Disabled to avoid conflicts with the HP SDC HIL drivers */ +MODULE_DEVICE_TABLE(parisc, hil_tbl); +#endif + +static struct parisc_driver hil_driver = { + .name = "hil", + .id_table = hil_tbl, + .probe = hil_probe_chip, + .remove = hil_remove_chip, +}; + +static int __init hil_init(void) +{ + return register_parisc_driver(&hil_driver); +} + +static void __exit hil_exit(void) +{ + unregister_parisc_driver(&hil_driver); +} + +#else /* !CONFIG_PARISC */ + +static int __init hil_init(void) +{ + int error; + + /* Only allow one HIL keyboard */ + if (hil_dev.dev) + return -EBUSY; + + if (!MACH_IS_HP300) + return -ENODEV; + + if (!hwreg_present((void *)(HILBASE + HIL_DATA))) { + printk(KERN_ERR "HIL: hardware register was not found\n"); + return -ENODEV; + } + + if (!request_region(HILBASE + HIL_DATA, 2, "hil")) { + printk(KERN_ERR "HIL: IOPORT region already used\n"); + return -EIO; + } + + error = hil_keyb_init(); + if (error) { + release_region(HILBASE + HIL_DATA, 2); + return error; + } + + return 0; +} + +static void __exit hil_exit(void) +{ + hil_keyb_exit(); + release_region(HILBASE + HIL_DATA, 2); +} + +#endif /* CONFIG_PARISC */ + +module_init(hil_init); +module_exit(hil_exit); diff --git a/drivers/input/keyboard/hpps2atkbd.h b/drivers/input/keyboard/hpps2atkbd.h new file mode 100644 index 00000000..dc33f694 --- /dev/null +++ b/drivers/input/keyboard/hpps2atkbd.h @@ -0,0 +1,110 @@ +/* + * drivers/input/keyboard/hpps2atkbd.h + * + * Copyright (c) 2004 Helge Deller + * Copyright (c) 2002 Laurent Canet + * Copyright (c) 2002 Thibaut Varene + * Copyright (c) 2000 Xavier Debacker + * + * HP PS/2 AT-compatible Keyboard, found in PA/RISC Workstations & Laptops + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + */ + + +/* Is the keyboard an RDI PrecisionBook? */ +#ifndef CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES +# define CONFLICT(x,y) x +#else +# define CONFLICT(x,y) y +#endif + +/* sadly RDI (Tadpole) decided to ship a different keyboard layout + than HP for their PS/2 laptop keyboard which leads to conflicting + keycodes between a normal HP PS/2 keyboard and a RDI Precisionbook. + HP: RDI: */ +#define C_07 CONFLICT( KEY_F12, KEY_F1 ) +#define C_11 CONFLICT( KEY_LEFTALT, KEY_LEFTCTRL ) +#define C_14 CONFLICT( KEY_LEFTCTRL, KEY_CAPSLOCK ) +#define C_58 CONFLICT( KEY_CAPSLOCK, KEY_RIGHTCTRL ) +#define C_61 CONFLICT( KEY_102ND, KEY_LEFT ) + +/* Raw SET 2 scancode table */ + +/* 00 */ KEY_RESERVED, KEY_F9, KEY_RESERVED, KEY_F5, KEY_F3, KEY_F1, KEY_F2, C_07, +/* 08 */ KEY_ESC, KEY_F10, KEY_F8, KEY_F6, KEY_F4, KEY_TAB, KEY_GRAVE, KEY_F2, +/* 10 */ KEY_RESERVED, C_11, KEY_LEFTSHIFT, KEY_RESERVED, C_14, KEY_Q, KEY_1, KEY_F3, +/* 18 */ KEY_RESERVED, KEY_LEFTALT, KEY_Z, KEY_S, KEY_A, KEY_W, KEY_2, KEY_F4, +/* 20 */ KEY_RESERVED, KEY_C, KEY_X, KEY_D, KEY_E, KEY_4, KEY_3, KEY_F5, +/* 28 */ KEY_RESERVED, KEY_SPACE, KEY_V, KEY_F, KEY_T, KEY_R, KEY_5, KEY_F6, +/* 30 */ KEY_RESERVED, KEY_N, KEY_B, KEY_H, KEY_G, KEY_Y, KEY_6, KEY_F7, +/* 38 */ KEY_RESERVED, KEY_RIGHTALT, KEY_M, KEY_J, KEY_U, KEY_7, KEY_8, KEY_F8, +/* 40 */ KEY_RESERVED, KEY_COMMA, KEY_K, KEY_I, KEY_O, KEY_0, KEY_9, KEY_F9, +/* 48 */ KEY_RESERVED, KEY_DOT, KEY_SLASH, KEY_L, KEY_SEMICOLON, KEY_P, KEY_MINUS, KEY_F10, +/* 50 */ KEY_RESERVED, KEY_RESERVED, KEY_APOSTROPHE,KEY_RESERVED, KEY_LEFTBRACE, KEY_EQUAL, KEY_F11, KEY_SYSRQ, +/* 58 */ C_58, KEY_RIGHTSHIFT,KEY_ENTER, KEY_RIGHTBRACE,KEY_BACKSLASH, KEY_BACKSLASH,KEY_F12, KEY_SCROLLLOCK, +/* 60 */ KEY_DOWN, C_61, KEY_PAUSE, KEY_UP, KEY_DELETE, KEY_END, KEY_BACKSPACE, KEY_INSERT, +/* 68 */ KEY_RESERVED, KEY_KP1, KEY_RIGHT, KEY_KP4, KEY_KP7, KEY_PAGEDOWN, KEY_HOME, KEY_PAGEUP, +/* 70 */ KEY_KP0, KEY_KPDOT, KEY_KP2, KEY_KP5, KEY_KP6, KEY_KP8, KEY_ESC, KEY_NUMLOCK, +/* 78 */ KEY_F11, KEY_KPPLUS, KEY_KP3, KEY_KPMINUS, KEY_KPASTERISK,KEY_KP9, KEY_SCROLLLOCK,KEY_102ND, +/* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 90 */ KEY_RESERVED, KEY_RIGHTALT, 255, KEY_RESERVED, KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_CAPSLOCK, KEY_RESERVED, KEY_LEFTMETA, +/* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RIGHTMETA, +/* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_COMPOSE, +/* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_KPSLASH, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_KPENTER, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* e8 */ KEY_RESERVED, KEY_END, KEY_RESERVED, KEY_LEFT, KEY_HOME, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* f0 */ KEY_INSERT, KEY_DELETE, KEY_DOWN, KEY_RESERVED, KEY_RIGHT, KEY_UP, KEY_RESERVED, KEY_PAUSE, +/* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_PAGEDOWN, KEY_RESERVED, KEY_SYSRQ, KEY_PAGEUP, KEY_RESERVED, KEY_RESERVED, + +/* These are offset for escaped keycodes: */ + +/* 00 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_F7, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 08 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_LEFTMETA, KEY_RIGHTMETA, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 10 */ KEY_RESERVED, KEY_RIGHTALT, KEY_RESERVED, KEY_RESERVED, KEY_RIGHTCTRL, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 18 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 20 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 28 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 30 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 38 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 40 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 48 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 50 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 58 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 60 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 68 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 70 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 78 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 80 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 88 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 90 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* 98 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* a0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* a8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* b0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* b8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* c0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* c8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* d0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* d8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* e0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* e8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* f0 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, +/* f8 */ KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED, KEY_RESERVED + +#undef CONFLICT +#undef C_07 +#undef C_11 +#undef C_14 +#undef C_58 +#undef C_61 + diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c new file mode 100644 index 00000000..03c8cc5c --- /dev/null +++ b/drivers/input/keyboard/imx_keypad.c @@ -0,0 +1,601 @@ +/* + * Driver for the IMX keypad port. + * Copyright (C) 2009 Alberto Panizzo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * <>. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Keypad Controller registers (halfword) + */ +#define KPCR 0x00 /* Keypad Control Register */ + +#define KPSR 0x02 /* Keypad Status Register */ +#define KBD_STAT_KPKD (0x1 << 0) /* Key Press Interrupt Status bit (w1c) */ +#define KBD_STAT_KPKR (0x1 << 1) /* Key Release Interrupt Status bit (w1c) */ +#define KBD_STAT_KDSC (0x1 << 2) /* Key Depress Synch Chain Status bit (w1c)*/ +#define KBD_STAT_KRSS (0x1 << 3) /* Key Release Synch Status bit (w1c)*/ +#define KBD_STAT_KDIE (0x1 << 8) /* Key Depress Interrupt Enable Status bit */ +#define KBD_STAT_KRIE (0x1 << 9) /* Key Release Interrupt Enable */ +#define KBD_STAT_KPPEN (0x1 << 10) /* Keypad Clock Enable */ + +#define KDDR 0x04 /* Keypad Data Direction Register */ +#define KPDR 0x06 /* Keypad Data Register */ + +#define MAX_MATRIX_KEY_ROWS 8 +#define MAX_MATRIX_KEY_COLS 8 +#define MATRIX_ROW_SHIFT 3 + +#define MAX_MATRIX_KEY_NUM (MAX_MATRIX_KEY_ROWS * MAX_MATRIX_KEY_COLS) + +struct imx_keypad { + + struct clk *clk; + struct input_dev *input_dev; + void __iomem *mmio_base; + + int irq; + struct timer_list check_matrix_timer; + + /* + * The matrix is stable only if no changes are detected after + * IMX_KEYPAD_SCANS_FOR_STABILITY scans + */ +#define IMX_KEYPAD_SCANS_FOR_STABILITY 3 + int stable_count; + + bool enabled; + + /* Masks for enabled rows/cols */ + unsigned short rows_en_mask; + unsigned short cols_en_mask; + + unsigned short keycodes[MAX_MATRIX_KEY_NUM]; + + /* + * Matrix states: + * -stable: achieved after a complete debounce process. + * -unstable: used in the debouncing process. + */ + unsigned short matrix_stable_state[MAX_MATRIX_KEY_COLS]; + unsigned short matrix_unstable_state[MAX_MATRIX_KEY_COLS]; +}; + +/* Scan the matrix and return the new state in *matrix_volatile_state. */ +static void imx_keypad_scan_matrix(struct imx_keypad *keypad, + unsigned short *matrix_volatile_state) +{ + int col; + unsigned short reg_val; + + for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { + if ((keypad->cols_en_mask & (1 << col)) == 0) + continue; + /* + * Discharge keypad capacitance: + * 2. write 1s on column data. + * 3. configure columns as totem-pole to discharge capacitance. + * 4. configure columns as open-drain. + */ + reg_val = readw(keypad->mmio_base + KPDR); + reg_val |= 0xff00; + writew(reg_val, keypad->mmio_base + KPDR); + + reg_val = readw(keypad->mmio_base + KPCR); + reg_val &= ~((keypad->cols_en_mask & 0xff) << 8); + writew(reg_val, keypad->mmio_base + KPCR); + + udelay(2); + + reg_val = readw(keypad->mmio_base + KPCR); + reg_val |= (keypad->cols_en_mask & 0xff) << 8; + writew(reg_val, keypad->mmio_base + KPCR); + + /* + * 5. Write a single column to 0, others to 1. + * 6. Sample row inputs and save data. + * 7. Repeat steps 2 - 6 for remaining columns. + */ + reg_val = readw(keypad->mmio_base + KPDR); + reg_val &= ~(1 << (8 + col)); + writew(reg_val, keypad->mmio_base + KPDR); + + /* + * Delay added to avoid propagating the 0 from column to row + * when scanning. + */ + udelay(5); + + /* + * 1s in matrix_volatile_state[col] means key pressures + * throw data from non enabled rows. + */ + reg_val = readw(keypad->mmio_base + KPDR); + matrix_volatile_state[col] = (~reg_val) & keypad->rows_en_mask; + } + + /* + * Return in standby mode: + * 9. write 0s to columns + */ + reg_val = readw(keypad->mmio_base + KPDR); + reg_val &= 0x00ff; + writew(reg_val, keypad->mmio_base + KPDR); +} + +/* + * Compare the new matrix state (volatile) with the stable one stored in + * keypad->matrix_stable_state and fire events if changes are detected. + */ +static void imx_keypad_fire_events(struct imx_keypad *keypad, + unsigned short *matrix_volatile_state) +{ + struct input_dev *input_dev = keypad->input_dev; + int row, col; + + for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { + unsigned short bits_changed; + int code; + + if ((keypad->cols_en_mask & (1 << col)) == 0) + continue; /* Column is not enabled */ + + bits_changed = keypad->matrix_stable_state[col] ^ + matrix_volatile_state[col]; + + if (bits_changed == 0) + continue; /* Column does not contain changes */ + + for (row = 0; row < MAX_MATRIX_KEY_ROWS; row++) { + if ((keypad->rows_en_mask & (1 << row)) == 0) + continue; /* Row is not enabled */ + if ((bits_changed & (1 << row)) == 0) + continue; /* Row does not contain changes */ + + code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, keypad->keycodes[code], + matrix_volatile_state[col] & (1 << row)); + dev_dbg(&input_dev->dev, "Event code: %d, val: %d", + keypad->keycodes[code], + matrix_volatile_state[col] & (1 << row)); + } + } + input_sync(input_dev); +} + +/* + * imx_keypad_check_for_events is the timer handler. + */ +static void imx_keypad_check_for_events(unsigned long data) +{ + struct imx_keypad *keypad = (struct imx_keypad *) data; + unsigned short matrix_volatile_state[MAX_MATRIX_KEY_COLS]; + unsigned short reg_val; + bool state_changed, is_zero_matrix; + int i; + + memset(matrix_volatile_state, 0, sizeof(matrix_volatile_state)); + + imx_keypad_scan_matrix(keypad, matrix_volatile_state); + + state_changed = false; + for (i = 0; i < MAX_MATRIX_KEY_COLS; i++) { + if ((keypad->cols_en_mask & (1 << i)) == 0) + continue; + + if (keypad->matrix_unstable_state[i] ^ matrix_volatile_state[i]) { + state_changed = true; + break; + } + } + + /* + * If the matrix state is changed from the previous scan + * (Re)Begin the debouncing process, saving the new state in + * keypad->matrix_unstable_state. + * else + * Increase the count of number of scans with a stable state. + */ + if (state_changed) { + memcpy(keypad->matrix_unstable_state, matrix_volatile_state, + sizeof(matrix_volatile_state)); + keypad->stable_count = 0; + } else + keypad->stable_count++; + + /* + * If the matrix is not as stable as we want reschedule scan + * in the near future. + */ + if (keypad->stable_count < IMX_KEYPAD_SCANS_FOR_STABILITY) { + mod_timer(&keypad->check_matrix_timer, + jiffies + msecs_to_jiffies(10)); + return; + } + + /* + * If the matrix state is stable, fire the events and save the new + * stable state. Note, if the matrix is kept stable for longer + * (keypad->stable_count > IMX_KEYPAD_SCANS_FOR_STABILITY) all + * events have already been generated. + */ + if (keypad->stable_count == IMX_KEYPAD_SCANS_FOR_STABILITY) { + imx_keypad_fire_events(keypad, matrix_volatile_state); + + memcpy(keypad->matrix_stable_state, matrix_volatile_state, + sizeof(matrix_volatile_state)); + } + + is_zero_matrix = true; + for (i = 0; i < MAX_MATRIX_KEY_COLS; i++) { + if (matrix_volatile_state[i] != 0) { + is_zero_matrix = false; + break; + } + } + + + if (is_zero_matrix) { + /* + * All keys have been released. Enable only the KDI + * interrupt for future key presses (clear the KDI + * status bit and its sync chain before that). + */ + reg_val = readw(keypad->mmio_base + KPSR); + reg_val |= KBD_STAT_KPKD | KBD_STAT_KDSC; + writew(reg_val, keypad->mmio_base + KPSR); + + reg_val = readw(keypad->mmio_base + KPSR); + reg_val |= KBD_STAT_KDIE; + reg_val &= ~KBD_STAT_KRIE; + writew(reg_val, keypad->mmio_base + KPSR); + } else { + /* + * Some keys are still pressed. Schedule a rescan in + * attempt to detect multiple key presses and enable + * the KRI interrupt to react quickly to key release + * event. + */ + mod_timer(&keypad->check_matrix_timer, + jiffies + msecs_to_jiffies(60)); + + reg_val = readw(keypad->mmio_base + KPSR); + reg_val |= KBD_STAT_KPKR | KBD_STAT_KRSS; + writew(reg_val, keypad->mmio_base + KPSR); + + reg_val = readw(keypad->mmio_base + KPSR); + reg_val |= KBD_STAT_KRIE; + reg_val &= ~KBD_STAT_KDIE; + writew(reg_val, keypad->mmio_base + KPSR); + } +} + +static irqreturn_t imx_keypad_irq_handler(int irq, void *dev_id) +{ + struct imx_keypad *keypad = dev_id; + unsigned short reg_val; + + reg_val = readw(keypad->mmio_base + KPSR); + + /* Disable both interrupt types */ + reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); + /* Clear interrupts status bits */ + reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD; + writew(reg_val, keypad->mmio_base + KPSR); + + if (keypad->enabled) { + /* The matrix is supposed to be changed */ + keypad->stable_count = 0; + + /* Schedule the scanning procedure near in the future */ + mod_timer(&keypad->check_matrix_timer, + jiffies + msecs_to_jiffies(2)); + } + + return IRQ_HANDLED; +} + +static void imx_keypad_config(struct imx_keypad *keypad) +{ + unsigned short reg_val; + + /* + * Include enabled rows in interrupt generation (KPCR[7:0]) + * Configure keypad columns as open-drain (KPCR[15:8]) + */ + reg_val = readw(keypad->mmio_base + KPCR); + reg_val |= keypad->rows_en_mask & 0xff; /* rows */ + reg_val |= (keypad->cols_en_mask & 0xff) << 8; /* cols */ + writew(reg_val, keypad->mmio_base + KPCR); + + /* Write 0's to KPDR[15:8] (Colums) */ + reg_val = readw(keypad->mmio_base + KPDR); + reg_val &= 0x00ff; + writew(reg_val, keypad->mmio_base + KPDR); + + /* Configure columns as output, rows as input (KDDR[15:0]) */ + writew(0xff00, keypad->mmio_base + KDDR); + + /* + * Clear Key Depress and Key Release status bit. + * Clear both synchronizer chain. + */ + reg_val = readw(keypad->mmio_base + KPSR); + reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD | + KBD_STAT_KDSC | KBD_STAT_KRSS; + writew(reg_val, keypad->mmio_base + KPSR); + + /* Enable KDI and disable KRI (avoid false release events). */ + reg_val |= KBD_STAT_KDIE; + reg_val &= ~KBD_STAT_KRIE; + writew(reg_val, keypad->mmio_base + KPSR); +} + +static void imx_keypad_inhibit(struct imx_keypad *keypad) +{ + unsigned short reg_val; + + /* Inhibit KDI and KRI interrupts. */ + reg_val = readw(keypad->mmio_base + KPSR); + reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); + reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD; + writew(reg_val, keypad->mmio_base + KPSR); + + /* Colums as open drain and disable all rows */ + reg_val = (keypad->cols_en_mask & 0xff) << 8; + writew(reg_val, keypad->mmio_base + KPCR); +} + +static void imx_keypad_close(struct input_dev *dev) +{ + struct imx_keypad *keypad = input_get_drvdata(dev); + + dev_dbg(&dev->dev, ">%s\n", __func__); + + /* Mark keypad as being inactive */ + keypad->enabled = false; + synchronize_irq(keypad->irq); + del_timer_sync(&keypad->check_matrix_timer); + + imx_keypad_inhibit(keypad); + + /* Disable clock unit */ + clk_disable_unprepare(keypad->clk); +} + +static int imx_keypad_open(struct input_dev *dev) +{ + struct imx_keypad *keypad = input_get_drvdata(dev); + int error; + + dev_dbg(&dev->dev, ">%s\n", __func__); + + /* Enable the kpp clock */ + error = clk_prepare_enable(keypad->clk); + if (error) + return error; + + /* We became active from now */ + keypad->enabled = true; + + imx_keypad_config(keypad); + + /* Sanity control, not all the rows must be actived now. */ + if ((readw(keypad->mmio_base + KPDR) & keypad->rows_en_mask) == 0) { + dev_err(&dev->dev, + "too many keys pressed, control pins initialisation\n"); + goto open_err; + } + + return 0; + +open_err: + imx_keypad_close(dev); + return -EIO; +} + +#ifdef CONFIG_OF +static struct of_device_id imx_keypad_of_match[] = { + { .compatible = "fsl,imx21-kpp", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, imx_keypad_of_match); +#endif + +static int imx_keypad_probe(struct platform_device *pdev) +{ + const struct matrix_keymap_data *keymap_data = pdev->dev.platform_data; + struct imx_keypad *keypad; + struct input_dev *input_dev; + struct resource *res; + int irq, error, i, row, col; + + if (!keymap_data && !pdev->dev.of_node) { + dev_err(&pdev->dev, "no keymap defined\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "no irq defined in platform data\n"); + return -EINVAL; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (res == NULL) { + dev_err(&pdev->dev, "no I/O memory defined in platform data\n"); + return -EINVAL; + } + + input_dev = devm_input_allocate_device(&pdev->dev); + if (!input_dev) { + dev_err(&pdev->dev, "failed to allocate the input device\n"); + return -ENOMEM; + } + + keypad = devm_kzalloc(&pdev->dev, sizeof(struct imx_keypad), + GFP_KERNEL); + if (!keypad) { + dev_err(&pdev->dev, "not enough memory for driver data\n"); + return -ENOMEM; + } + + keypad->input_dev = input_dev; + keypad->irq = irq; + keypad->stable_count = 0; + + setup_timer(&keypad->check_matrix_timer, + imx_keypad_check_for_events, (unsigned long) keypad); + + keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(keypad->mmio_base)) + return PTR_ERR(keypad->mmio_base); + + keypad->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(keypad->clk)) { + dev_err(&pdev->dev, "failed to get keypad clock\n"); + return PTR_ERR(keypad->clk); + } + + /* Init the Input device */ + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + input_dev->open = imx_keypad_open; + input_dev->close = imx_keypad_close; + + error = matrix_keypad_build_keymap(keymap_data, NULL, + MAX_MATRIX_KEY_ROWS, + MAX_MATRIX_KEY_COLS, + keypad->keycodes, input_dev); + if (error) { + dev_err(&pdev->dev, "failed to build keymap\n"); + return error; + } + + /* Search for rows and cols enabled */ + for (row = 0; row < MAX_MATRIX_KEY_ROWS; row++) { + for (col = 0; col < MAX_MATRIX_KEY_COLS; col++) { + i = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); + if (keypad->keycodes[i] != KEY_RESERVED) { + keypad->rows_en_mask |= 1 << row; + keypad->cols_en_mask |= 1 << col; + } + } + } + dev_dbg(&pdev->dev, "enabled rows mask: %x\n", keypad->rows_en_mask); + dev_dbg(&pdev->dev, "enabled cols mask: %x\n", keypad->cols_en_mask); + + __set_bit(EV_REP, input_dev->evbit); + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + input_set_drvdata(input_dev, keypad); + + /* Ensure that the keypad will stay dormant until opened */ + clk_prepare_enable(keypad->clk); + imx_keypad_inhibit(keypad); + clk_disable_unprepare(keypad->clk); + + error = devm_request_irq(&pdev->dev, irq, imx_keypad_irq_handler, 0, + pdev->name, keypad); + if (error) { + dev_err(&pdev->dev, "failed to request IRQ\n"); + return error; + } + + /* Register the input device */ + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, "failed to register input device\n"); + return error; + } + + platform_set_drvdata(pdev, keypad); + device_init_wakeup(&pdev->dev, 1); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int imx_kbd_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct imx_keypad *kbd = platform_get_drvdata(pdev); + struct input_dev *input_dev = kbd->input_dev; + + /* imx kbd can wake up system even clock is disabled */ + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + clk_disable_unprepare(kbd->clk); + + mutex_unlock(&input_dev->mutex); + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(kbd->irq); + + return 0; +} + +static int imx_kbd_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct imx_keypad *kbd = platform_get_drvdata(pdev); + struct input_dev *input_dev = kbd->input_dev; + int ret = 0; + + if (device_may_wakeup(&pdev->dev)) + disable_irq_wake(kbd->irq); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) { + ret = clk_prepare_enable(kbd->clk); + if (ret) + goto err_clk; + } + +err_clk: + mutex_unlock(&input_dev->mutex); + + return ret; +} +#endif + +static SIMPLE_DEV_PM_OPS(imx_kbd_pm_ops, imx_kbd_suspend, imx_kbd_resume); + +static struct platform_driver imx_keypad_driver = { + .driver = { + .name = "imx-keypad", + .owner = THIS_MODULE, + .pm = &imx_kbd_pm_ops, + .of_match_table = of_match_ptr(imx_keypad_of_match), + }, + .probe = imx_keypad_probe, +}; +module_platform_driver(imx_keypad_driver); + +MODULE_AUTHOR("Alberto Panizzo "); +MODULE_DESCRIPTION("IMX Keypad Port Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:imx-keypad"); diff --git a/drivers/input/keyboard/input-hook.c b/drivers/input/keyboard/input-hook.c new file mode 100644 index 00000000..cf55c3b0 --- /dev/null +++ b/drivers/input/keyboard/input-hook.c @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2013 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ +#include + +static enum hrtimer_restart trigger_watch_event_timer_cb(struct hrtimer *timer) +{ + struct trigger_watch_event *event = container_of(timer, struct trigger_watch_event, timer); + enum hrtimer_restart restart = HRTIMER_NORESTART; + pr_info("< %s > trigger-watch event timer timeout %dms\n", event->name, event->period); + if (event->trigger_watch_event_cb) + event->trigger_watch_event_cb(event->private); + if (event->repeated) { /* repeat timer */ + hrtimer_forward_now(timer, ktime_set(event->period / 1000, (event->period % 1000) * 1000000)); + restart = HRTIMER_RESTART; + } + return restart; +} + +int trigger_watch_event_stop(struct trigger_watch_event *event) +{ + if (!event->disable_timer) { + hrtimer_cancel(&event->timer); + } + if (!event->disable_clk_source) { + u64 delta = (local_clock() - event->last_ts); + if (delta > ((u64)event->period) * 1000000) { + pr_info("< %s > trigger-watch event clock timeout %d / %lld\n", event->name, event->period, delta); + if (event->trigger_watch_event_cb) + event->trigger_watch_event_cb(event->private); + } + } + return 0; +} +EXPORT_SYMBOL(trigger_watch_event_stop); + +void trigger_watch_event_start(struct trigger_watch_event *event, int ms) +{ + if (!event->initialized) { + event->initialized = 1; + if (!event->disable_timer) { + hrtimer_init(&event->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + event->timer.function = trigger_watch_event_timer_cb; + } + } + event->repeated = !!(ms & TRIGGER_WATCH_EVENT_REPEATED); + event->period = (ms & ~TRIGGER_WATCH_EVENT_REPEATED); + event->last_ts = local_clock(); + trigger_watch_event_stop(event); + if (!event->disable_timer) { + hrtimer_start(&event->timer, ktime_set(event->period / 1000, (event->period % 1000) * 1000000), HRTIMER_MODE_REL); + } +} +EXPORT_SYMBOL(trigger_watch_event_start); + +static int hook_power = 1; + +static struct ctl_table_header *hook_power_sysctl_hdr = NULL; +void input_hook_init(void) +{ + static ctl_table hook_power_sysctl_table[] = { + { + .procname = "hook_power_enable", + .data = &hook_power, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, + {} + }; + + static ctl_table hook_power_sysctl_root[] = { + { + .procname = "kernel", + .mode = 0555, + .child = hook_power_sysctl_table, + }, + {} + }; + + hook_power_sysctl_hdr = register_sysctl_table(hook_power_sysctl_root); + if (!hook_power_sysctl_hdr) { + pr_err("unable to create input_power entry\n"); + return -ENOMEM; + } + return 0; +} + +void input_hook_exit(void) +{ + if (hook_power_sysctl_hdr) + unregister_sysctl_table(hook_power_sysctl_hdr); +} + +extern void sprd_pbint_7s_reset_disable(void); +static void trigger_watch_powerkey(void *private) +{ + unsigned long flags; + local_irq_save(flags); +#ifdef CONFIG_MAGIC_SYSRQ + handle_sysrq('m'); + handle_sysrq('w'); +#endif + sprd_pbint_7s_reset_disable(); + pr_warn("!!!! trigger_powerkey !!!! do panic\n"); + panic("!!!! trigger_powerkey !!!! do panic"); + pr_err("%s should never reach here!\n", __func__); +} + +void input_report_key_hook(struct input_dev *dev, unsigned int code, int value) +{ + + if (hook_power && code == KEY_POWER) { + static struct trigger_watch_event twe = { + .name = "power key", + .private = NULL, /* like dev */ + .trigger_watch_event_cb = trigger_watch_powerkey, + }; + static int pre_value = 0; + if (value != pre_value) { + if (value) + trigger_watch_event_start(&twe, 6 * 1000); + else + trigger_watch_event_stop(&twe); + } else { + pr_warn("Key %d%c is dithering.", code, value ? 'D' : 'U'); + } + pre_value = value; + } +} diff --git a/drivers/input/keyboard/jornada680_kbd.c b/drivers/input/keyboard/jornada680_kbd.c new file mode 100644 index 00000000..74e75a6e --- /dev/null +++ b/drivers/input/keyboard/jornada680_kbd.c @@ -0,0 +1,268 @@ +/* + * drivers/input/keyboard/jornada680_kbd.c + * + * HP Jornada 620/660/680/690 scan keyboard platform driver + * Copyright (C) 2007 Kristoffer Ericson + * + * Based on hp680_keyb.c + * Copyright (C) 2006 Paul Mundt + * Copyright (C) 2005 Andriy Skulysh + * Split from drivers/input/keyboard/hp600_keyb.c + * Copyright (C) 2000 Yaegashi Takeshi (hp6xx kbd scan routine and translation table) + * Copyright (C) 2000 Niibe Yutaka (HP620 Keyb translation table) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define PCCR 0xa4000104 +#define PDCR 0xa4000106 +#define PECR 0xa4000108 +#define PFCR 0xa400010a +#define PCDR 0xa4000124 +#define PDDR 0xa4000126 +#define PEDR 0xa4000128 +#define PFDR 0xa400012a +#define PGDR 0xa400012c +#define PHDR 0xa400012e +#define PJDR 0xa4000130 +#define PKDR 0xa4000132 +#define PLDR 0xa4000134 + +static const unsigned short jornada_scancodes[] = { +/* PTD1 */ KEY_CAPSLOCK, KEY_MACRO, KEY_LEFTCTRL, 0, KEY_ESC, KEY_KP5, 0, 0, /* 1 -> 8 */ + KEY_F1, KEY_F2, KEY_F3, KEY_F8, KEY_F7, KEY_F6, KEY_F4, KEY_F5, /* 9 -> 16 */ +/* PTD5 */ KEY_SLASH, KEY_APOSTROPHE, KEY_ENTER, 0, KEY_Z, 0, 0, 0, /* 17 -> 24 */ + KEY_X, KEY_C, KEY_V, KEY_DOT, KEY_COMMA, KEY_M, KEY_B, KEY_N, /* 25 -> 32 */ +/* PTD7 */ KEY_KP2, KEY_KP6, KEY_KP3, 0, 0, 0, 0, 0, /* 33 -> 40 */ + KEY_F10, KEY_RO, KEY_F9, KEY_KP4, KEY_NUMLOCK, KEY_SCROLLLOCK, KEY_LEFTALT, KEY_HANJA, /* 41 -> 48 */ +/* PTE0 */ KEY_KATAKANA, KEY_KP0, KEY_GRAVE, 0, KEY_FINANCE, 0, 0, 0, /* 49 -> 56 */ + KEY_KPMINUS, KEY_HIRAGANA, KEY_SPACE, KEY_KPDOT, KEY_VOLUMEUP, 249, 0, 0, /* 57 -> 64 */ +/* PTE1 */ KEY_SEMICOLON, KEY_RIGHTBRACE, KEY_BACKSLASH, 0, KEY_A, 0, 0, 0, /* 65 -> 72 */ + KEY_S, KEY_D, KEY_F, KEY_L, KEY_K, KEY_J, KEY_G, KEY_H, /* 73 -> 80 */ +/* PTE3 */ KEY_KP8, KEY_LEFTMETA, KEY_RIGHTSHIFT, 0, KEY_TAB, 0, 0, 0, /* 81 -> 88 */ + 0, KEY_LEFTSHIFT, KEY_KP7, KEY_KP9, KEY_KP1, KEY_F11, KEY_KPPLUS, KEY_KPASTERISK, /* 89 -> 96 */ +/* PTE6 */ KEY_P, KEY_LEFTBRACE, KEY_BACKSPACE, 0, KEY_Q, 0, 0, 0, /* 97 -> 104 */ + KEY_W, KEY_E, KEY_R, KEY_O, KEY_I, KEY_U, KEY_T, KEY_Y, /* 105 -> 112 */ +/* PTE7 */ KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_1, 0, 0, 0, /* 113 -> 120 */ + KEY_2, KEY_3, KEY_4, KEY_9, KEY_8, KEY_7, KEY_5, KEY_6, /* 121 -> 128 */ +/* **** */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + +#define JORNADA_SCAN_SIZE 18 + +struct jornadakbd { + struct input_polled_dev *poll_dev; + unsigned short keymap[ARRAY_SIZE(jornada_scancodes)]; + unsigned char length; + unsigned char old_scan[JORNADA_SCAN_SIZE]; + unsigned char new_scan[JORNADA_SCAN_SIZE]; +}; + +static void jornada_parse_kbd(struct jornadakbd *jornadakbd) +{ + struct input_dev *input_dev = jornadakbd->poll_dev->input; + unsigned short *keymap = jornadakbd->keymap; + unsigned int sync_me = 0; + unsigned int i, j; + + for (i = 0; i < JORNADA_SCAN_SIZE; i++) { + unsigned char new = jornadakbd->new_scan[i]; + unsigned char old = jornadakbd->old_scan[i]; + unsigned int xor = new ^ old; + + if (xor == 0) + continue; + + for (j = 0; j < 8; j++) { + unsigned int bit = 1 << j; + if (xor & bit) { + unsigned int scancode = (i << 3) + j; + input_event(input_dev, + EV_MSC, MSC_SCAN, scancode); + input_report_key(input_dev, + keymap[scancode], + !(new & bit)); + sync_me = 1; + } + } + } + + if (sync_me) + input_sync(input_dev); +} + +static void jornada_scan_keyb(unsigned char *s) +{ + int i; + unsigned short ec_static, dc_static; /* = UINT16_t */ + unsigned char matrix_switch[] = { + 0xfd, 0xff, /* PTD1 PD(1) */ + 0xdf, 0xff, /* PTD5 PD(5) */ + 0x7f, 0xff, /* PTD7 PD(7) */ + 0xff, 0xfe, /* PTE0 PE(0) */ + 0xff, 0xfd, /* PTE1 PE(1) */ + 0xff, 0xf7, /* PTE3 PE(3) */ + 0xff, 0xbf, /* PTE6 PE(6) */ + 0xff, 0x7f, /* PTE7 PE(7) */ + }, *t = matrix_switch; + /* PD(x) : + 1. 0xcc0c & (1~(1 << (2*(x)+1))))) + 2. (0xf0cf & 0xfffff) */ + /* PE(x) : + 1. 0xcc0c & 0xffff + 2. 0xf0cf & (1~(1 << (2*(x)+1))))) */ + unsigned short matrix_PDE[] = { + 0xcc04, 0xf0cf, /* PD(1) */ + 0xc40c, 0xf0cf, /* PD(5) */ + 0x4c0c, 0xf0cf, /* PD(7) */ + 0xcc0c, 0xf0cd, /* PE(0) */ + 0xcc0c, 0xf0c7, /* PE(1) */ + 0xcc0c, 0xf04f, /* PE(3) */ + 0xcc0c, 0xd0cf, /* PE(6) */ + 0xcc0c, 0x70cf, /* PE(7) */ + }, *y = matrix_PDE; + + /* Save these control reg bits */ + dc_static = (__raw_readw(PDCR) & (~0xcc0c)); + ec_static = (__raw_readw(PECR) & (~0xf0cf)); + + for (i = 0; i < 8; i++) { + /* disable output for all but the one we want to scan */ + __raw_writew((dc_static | *y++), PDCR); + __raw_writew((ec_static | *y++), PECR); + udelay(5); + + /* Get scanline row */ + __raw_writeb(*t++, PDDR); + __raw_writeb(*t++, PEDR); + udelay(50); + + /* Read data */ + *s++ = __raw_readb(PCDR); + *s++ = __raw_readb(PFDR); + } + /* Scan no lines */ + __raw_writeb(0xff, PDDR); + __raw_writeb(0xff, PEDR); + + /* Enable all scanlines */ + __raw_writew((dc_static | (0x5555 & 0xcc0c)),PDCR); + __raw_writew((ec_static | (0x5555 & 0xf0cf)),PECR); + + /* Ignore extra keys and events */ + *s++ = __raw_readb(PGDR); + *s++ = __raw_readb(PHDR); +} + +static void jornadakbd680_poll(struct input_polled_dev *dev) +{ + struct jornadakbd *jornadakbd = dev->private; + + jornada_scan_keyb(jornadakbd->new_scan); + jornada_parse_kbd(jornadakbd); + memcpy(jornadakbd->old_scan, jornadakbd->new_scan, JORNADA_SCAN_SIZE); +} + +static int jornada680kbd_probe(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd; + struct input_polled_dev *poll_dev; + struct input_dev *input_dev; + int i, error; + + jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); + if (!jornadakbd) + return -ENOMEM; + + poll_dev = input_allocate_polled_device(); + if (!poll_dev) { + error = -ENOMEM; + goto failed; + } + + platform_set_drvdata(pdev, jornadakbd); + + jornadakbd->poll_dev = poll_dev; + + memcpy(jornadakbd->keymap, jornada_scancodes, + sizeof(jornadakbd->keymap)); + + poll_dev->private = jornadakbd; + poll_dev->poll = jornadakbd680_poll; + poll_dev->poll_interval = 50; /* msec */ + + input_dev = poll_dev->input; + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + input_dev->name = "HP Jornada 680 keyboard"; + input_dev->phys = "jornadakbd/input0"; + input_dev->keycode = jornadakbd->keymap; + input_dev->keycodesize = sizeof(unsigned short); + input_dev->keycodemax = ARRAY_SIZE(jornada_scancodes); + input_dev->dev.parent = &pdev->dev; + input_dev->id.bustype = BUS_HOST; + + for (i = 0; i < 128; i++) + if (jornadakbd->keymap[i]) + __set_bit(jornadakbd->keymap[i], input_dev->keybit); + __clear_bit(KEY_RESERVED, input_dev->keybit); + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + + error = input_register_polled_device(jornadakbd->poll_dev); + if (error) + goto failed; + + return 0; + + failed: + printk(KERN_ERR "Jornadakbd: failed to register driver, error: %d\n", + error); + platform_set_drvdata(pdev, NULL); + input_free_polled_device(poll_dev); + kfree(jornadakbd); + return error; + +} + +static int jornada680kbd_remove(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + input_unregister_polled_device(jornadakbd->poll_dev); + input_free_polled_device(jornadakbd->poll_dev); + kfree(jornadakbd); + + return 0; +} + +static struct platform_driver jornada680kbd_driver = { + .driver = { + .name = "jornada680_kbd", + .owner = THIS_MODULE, + }, + .probe = jornada680kbd_probe, + .remove = jornada680kbd_remove, +}; +module_platform_driver(jornada680kbd_driver); + +MODULE_AUTHOR("Kristoffer Ericson "); +MODULE_DESCRIPTION("HP Jornada 620/660/680/690 Keyboard Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:jornada680_kbd"); diff --git a/drivers/input/keyboard/jornada720_kbd.c b/drivers/input/keyboard/jornada720_kbd.c new file mode 100644 index 00000000..5ceef636 --- /dev/null +++ b/drivers/input/keyboard/jornada720_kbd.c @@ -0,0 +1,178 @@ +/* + * drivers/input/keyboard/jornada720_kbd.c + * + * HP Jornada 720 keyboard platform driver + * + * Copyright (C) 2006/2007 Kristoffer Ericson + * + * Copyright (C) 2006 jornada 720 kbd driver by + Filip Zyzniewsk + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +MODULE_AUTHOR("Kristoffer Ericson "); +MODULE_DESCRIPTION("HP Jornada 710/720/728 keyboard driver"); +MODULE_LICENSE("GPL v2"); + +static unsigned short jornada_std_keymap[128] = { /* ROW */ + 0, KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, /* #1 */ + KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_VOLUMEUP, KEY_VOLUMEDOWN, KEY_MUTE, /* -> */ + 0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, /* #2 */ + KEY_0, KEY_MINUS, KEY_EQUAL,0, 0, 0, /* -> */ + 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, /* #3 */ + KEY_P, KEY_BACKSLASH, KEY_BACKSPACE, 0, 0, 0, /* -> */ + 0, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, /* #4 */ + KEY_SEMICOLON, KEY_LEFTBRACE, KEY_RIGHTBRACE, 0, 0, 0, /* -> */ + 0, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, /* #5 */ + KEY_DOT, KEY_KPMINUS, KEY_APOSTROPHE, KEY_ENTER, 0, 0,0, /* -> */ + 0, KEY_TAB, 0, KEY_LEFTSHIFT, 0, KEY_APOSTROPHE, 0, 0, 0, 0, /* #6 */ + KEY_UP, 0, KEY_RIGHTSHIFT, 0, 0, 0,0, 0, 0, 0, 0, KEY_LEFTALT, KEY_GRAVE, /* -> */ + 0, 0, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, 0,0, KEY_KPASTERISK, /* -> */ + KEY_LEFTCTRL, 0, KEY_SPACE, 0, 0, 0, KEY_SLASH, KEY_DELETE, 0, 0, /* -> */ + 0, 0, 0, KEY_POWER, /* -> */ +}; + +struct jornadakbd { + unsigned short keymap[ARRAY_SIZE(jornada_std_keymap)]; + struct input_dev *input; +}; + +static irqreturn_t jornada720_kbd_interrupt(int irq, void *dev_id) +{ + struct platform_device *pdev = dev_id; + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + struct input_dev *input = jornadakbd->input; + u8 count, kbd_data, scan_code; + + /* startup ssp with spinlock */ + jornada_ssp_start(); + + if (jornada_ssp_inout(GETSCANKEYCODE) != TXDUMMY) { + printk(KERN_DEBUG + "jornada720_kbd: " + "GetKeycode command failed with ETIMEDOUT, " + "flushed bus\n"); + } else { + /* How many keycodes are waiting for us? */ + count = jornada_ssp_byte(TXDUMMY); + + /* Lets drag them out one at a time */ + while (count--) { + /* Exchange TxDummy for location (keymap[kbddata]) */ + kbd_data = jornada_ssp_byte(TXDUMMY); + scan_code = kbd_data & 0x7f; + + input_event(input, EV_MSC, MSC_SCAN, scan_code); + input_report_key(input, jornadakbd->keymap[scan_code], + !(kbd_data & 0x80)); + input_sync(input); + } + } + + /* release spinlock and turn off ssp */ + jornada_ssp_end(); + + return IRQ_HANDLED; +}; + +static int jornada720_kbd_probe(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd; + struct input_dev *input_dev; + int i, err; + + jornadakbd = kzalloc(sizeof(struct jornadakbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!jornadakbd || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + platform_set_drvdata(pdev, jornadakbd); + + memcpy(jornadakbd->keymap, jornada_std_keymap, + sizeof(jornada_std_keymap)); + jornadakbd->input = input_dev; + + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + input_dev->name = "HP Jornada 720 keyboard"; + input_dev->phys = "jornadakbd/input0"; + input_dev->keycode = jornadakbd->keymap; + input_dev->keycodesize = sizeof(unsigned short); + input_dev->keycodemax = ARRAY_SIZE(jornada_std_keymap); + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + + for (i = 0; i < ARRAY_SIZE(jornadakbd->keymap); i++) + __set_bit(jornadakbd->keymap[i], input_dev->keybit); + __clear_bit(KEY_RESERVED, input_dev->keybit); + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + + err = request_irq(IRQ_GPIO0, + jornada720_kbd_interrupt, + IRQF_TRIGGER_FALLING, + "jornadakbd", pdev); + if (err) { + printk(KERN_INFO "jornadakbd720_kbd: Unable to grab IRQ\n"); + goto fail1; + } + + err = input_register_device(jornadakbd->input); + if (err) + goto fail2; + + return 0; + + fail2: /* IRQ, DEVICE, MEMORY */ + free_irq(IRQ_GPIO0, pdev); + fail1: /* DEVICE, MEMORY */ + platform_set_drvdata(pdev, NULL); + input_free_device(input_dev); + kfree(jornadakbd); + return err; +}; + +static int jornada720_kbd_remove(struct platform_device *pdev) +{ + struct jornadakbd *jornadakbd = platform_get_drvdata(pdev); + + free_irq(IRQ_GPIO0, pdev); + platform_set_drvdata(pdev, NULL); + input_unregister_device(jornadakbd->input); + kfree(jornadakbd); + + return 0; +} + +/* work with hotplug and coldplug */ +MODULE_ALIAS("platform:jornada720_kbd"); + +static struct platform_driver jornada720_kbd_driver = { + .driver = { + .name = "jornada720_kbd", + .owner = THIS_MODULE, + }, + .probe = jornada720_kbd_probe, + .remove = jornada720_kbd_remove, +}; +module_platform_driver(jornada720_kbd_driver); diff --git a/drivers/input/keyboard/lkkbd.c b/drivers/input/keyboard/lkkbd.c new file mode 100644 index 00000000..fc0a63c2 --- /dev/null +++ b/drivers/input/keyboard/lkkbd.c @@ -0,0 +1,734 @@ +/* + * Copyright (C) 2004 by Jan-Benedict Glaw + */ + +/* + * LK keyboard driver for Linux, based on sunkbd.c (C) by Vojtech Pavlik + */ + +/* + * DEC LK201 and LK401 keyboard driver for Linux (primary for DECstations + * and VAXstations, but can also be used on any standard RS232 with an + * adaptor). + * + * DISCLAIMER: This works for _me_. If you break anything by using the + * information given below, I will _not_ be liable! + * + * RJ10 pinout: To DE9: Or DB25: + * 1 - RxD <----> Pin 3 (TxD) <-> Pin 2 (TxD) + * 2 - GND <----> Pin 5 (GND) <-> Pin 7 (GND) + * 4 - TxD <----> Pin 2 (RxD) <-> Pin 3 (RxD) + * 3 - +12V (from HDD drive connector), DON'T connect to DE9 or DB25!!! + * + * Pin numbers for DE9 and DB25 are noted on the plug (quite small:). For + * RJ10, it's like this: + * + * __=__ Hold the plug in front of you, cable downwards, + * /___/| nose is hidden behind the plug. Now, pin 1 is at + * |1234|| the left side, pin 4 at the right and 2 and 3 are + * |IIII|| in between, of course:) + * | || + * |____|/ + * || So the adaptor consists of three connected cables + * || for data transmission (RxD and TxD) and signal ground. + * Additionally, you have to get +12V from somewhere. + * Most easily, you'll get that from a floppy or HDD power connector. + * It's the yellow cable there (black is ground and red is +5V). + * + * The keyboard and all the commands it understands are documented in + * "VCB02 Video Subsystem - Technical Manual", EK-104AA-TM-001. This + * document is LK201 specific, but LK401 is mostly compatible. It comes + * up in LK201 mode and doesn't report any of the additional keys it + * has. These need to be switched on with the LK_CMD_ENABLE_LK401 + * command. You'll find this document (scanned .pdf file) on MANX, + * a search engine specific to DEC documentation. Try + * http://www.vt100.net/manx/details?pn=EK-104AA-TM-001;id=21;cp=1 + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "LK keyboard driver" + +MODULE_AUTHOR("Jan-Benedict Glaw "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Known parameters: + * bell_volume + * keyclick_volume + * ctrlclick_volume + * + * Please notice that there's not yet an API to set these at runtime. + */ +static int bell_volume = 100; /* % */ +module_param(bell_volume, int, 0); +MODULE_PARM_DESC(bell_volume, "Bell volume (in %). default is 100%"); + +static int keyclick_volume = 100; /* % */ +module_param(keyclick_volume, int, 0); +MODULE_PARM_DESC(keyclick_volume, "Keyclick volume (in %), default is 100%"); + +static int ctrlclick_volume = 100; /* % */ +module_param(ctrlclick_volume, int, 0); +MODULE_PARM_DESC(ctrlclick_volume, "Ctrlclick volume (in %), default is 100%"); + +static int lk201_compose_is_alt; +module_param(lk201_compose_is_alt, int, 0); +MODULE_PARM_DESC(lk201_compose_is_alt, + "If set non-zero, LK201' Compose key will act as an Alt key"); + + + +#undef LKKBD_DEBUG +#ifdef LKKBD_DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) do {} while (0) +#endif + +/* LED control */ +#define LK_LED_WAIT 0x81 +#define LK_LED_COMPOSE 0x82 +#define LK_LED_SHIFTLOCK 0x84 +#define LK_LED_SCROLLLOCK 0x88 +#define LK_CMD_LED_ON 0x13 +#define LK_CMD_LED_OFF 0x11 + +/* Mode control */ +#define LK_MODE_DOWN 0x80 +#define LK_MODE_AUTODOWN 0x82 +#define LK_MODE_UPDOWN 0x86 +#define LK_CMD_SET_MODE(mode, div) ((mode) | ((div) << 3)) + +/* Misc commands */ +#define LK_CMD_ENABLE_KEYCLICK 0x1b +#define LK_CMD_DISABLE_KEYCLICK 0x99 +#define LK_CMD_DISABLE_BELL 0xa1 +#define LK_CMD_SOUND_BELL 0xa7 +#define LK_CMD_ENABLE_BELL 0x23 +#define LK_CMD_DISABLE_CTRCLICK 0xb9 +#define LK_CMD_ENABLE_CTRCLICK 0xbb +#define LK_CMD_SET_DEFAULTS 0xd3 +#define LK_CMD_POWERCYCLE_RESET 0xfd +#define LK_CMD_ENABLE_LK401 0xe9 +#define LK_CMD_REQUEST_ID 0xab + +/* Misc responses from keyboard */ +#define LK_STUCK_KEY 0x3d +#define LK_SELFTEST_FAILED 0x3e +#define LK_ALL_KEYS_UP 0xb3 +#define LK_METRONOME 0xb4 +#define LK_OUTPUT_ERROR 0xb5 +#define LK_INPUT_ERROR 0xb6 +#define LK_KBD_LOCKED 0xb7 +#define LK_KBD_TEST_MODE_ACK 0xb8 +#define LK_PREFIX_KEY_DOWN 0xb9 +#define LK_MODE_CHANGE_ACK 0xba +#define LK_RESPONSE_RESERVED 0xbb + +#define LK_NUM_KEYCODES 256 +#define LK_NUM_IGNORE_BYTES 6 + +static unsigned short lkkbd_keycode[LK_NUM_KEYCODES] = { + [0x56] = KEY_F1, + [0x57] = KEY_F2, + [0x58] = KEY_F3, + [0x59] = KEY_F4, + [0x5a] = KEY_F5, + [0x64] = KEY_F6, + [0x65] = KEY_F7, + [0x66] = KEY_F8, + [0x67] = KEY_F9, + [0x68] = KEY_F10, + [0x71] = KEY_F11, + [0x72] = KEY_F12, + [0x73] = KEY_F13, + [0x74] = KEY_F14, + [0x7c] = KEY_F15, + [0x7d] = KEY_F16, + [0x80] = KEY_F17, + [0x81] = KEY_F18, + [0x82] = KEY_F19, + [0x83] = KEY_F20, + [0x8a] = KEY_FIND, + [0x8b] = KEY_INSERT, + [0x8c] = KEY_DELETE, + [0x8d] = KEY_SELECT, + [0x8e] = KEY_PAGEUP, + [0x8f] = KEY_PAGEDOWN, + [0x92] = KEY_KP0, + [0x94] = KEY_KPDOT, + [0x95] = KEY_KPENTER, + [0x96] = KEY_KP1, + [0x97] = KEY_KP2, + [0x98] = KEY_KP3, + [0x99] = KEY_KP4, + [0x9a] = KEY_KP5, + [0x9b] = KEY_KP6, + [0x9c] = KEY_KPCOMMA, + [0x9d] = KEY_KP7, + [0x9e] = KEY_KP8, + [0x9f] = KEY_KP9, + [0xa0] = KEY_KPMINUS, + [0xa1] = KEY_PROG1, + [0xa2] = KEY_PROG2, + [0xa3] = KEY_PROG3, + [0xa4] = KEY_PROG4, + [0xa7] = KEY_LEFT, + [0xa8] = KEY_RIGHT, + [0xa9] = KEY_DOWN, + [0xaa] = KEY_UP, + [0xab] = KEY_RIGHTSHIFT, + [0xac] = KEY_LEFTALT, + [0xad] = KEY_COMPOSE, /* Right Compose, that is. */ + [0xae] = KEY_LEFTSHIFT, /* Same as KEY_RIGHTSHIFT on LK201 */ + [0xaf] = KEY_LEFTCTRL, + [0xb0] = KEY_CAPSLOCK, + [0xb1] = KEY_COMPOSE, /* Left Compose, that is. */ + [0xb2] = KEY_RIGHTALT, + [0xbc] = KEY_BACKSPACE, + [0xbd] = KEY_ENTER, + [0xbe] = KEY_TAB, + [0xbf] = KEY_ESC, + [0xc0] = KEY_1, + [0xc1] = KEY_Q, + [0xc2] = KEY_A, + [0xc3] = KEY_Z, + [0xc5] = KEY_2, + [0xc6] = KEY_W, + [0xc7] = KEY_S, + [0xc8] = KEY_X, + [0xc9] = KEY_102ND, + [0xcb] = KEY_3, + [0xcc] = KEY_E, + [0xcd] = KEY_D, + [0xce] = KEY_C, + [0xd0] = KEY_4, + [0xd1] = KEY_R, + [0xd2] = KEY_F, + [0xd3] = KEY_V, + [0xd4] = KEY_SPACE, + [0xd6] = KEY_5, + [0xd7] = KEY_T, + [0xd8] = KEY_G, + [0xd9] = KEY_B, + [0xdb] = KEY_6, + [0xdc] = KEY_Y, + [0xdd] = KEY_H, + [0xde] = KEY_N, + [0xe0] = KEY_7, + [0xe1] = KEY_U, + [0xe2] = KEY_J, + [0xe3] = KEY_M, + [0xe5] = KEY_8, + [0xe6] = KEY_I, + [0xe7] = KEY_K, + [0xe8] = KEY_COMMA, + [0xea] = KEY_9, + [0xeb] = KEY_O, + [0xec] = KEY_L, + [0xed] = KEY_DOT, + [0xef] = KEY_0, + [0xf0] = KEY_P, + [0xf2] = KEY_SEMICOLON, + [0xf3] = KEY_SLASH, + [0xf5] = KEY_EQUAL, + [0xf6] = KEY_RIGHTBRACE, + [0xf7] = KEY_BACKSLASH, + [0xf9] = KEY_MINUS, + [0xfa] = KEY_LEFTBRACE, + [0xfb] = KEY_APOSTROPHE, +}; + +#define CHECK_LED(LK, VAR_ON, VAR_OFF, LED, BITS) do { \ + if (test_bit(LED, (LK)->dev->led)) \ + VAR_ON |= BITS; \ + else \ + VAR_OFF |= BITS; \ + } while (0) + +/* + * Per-keyboard data + */ +struct lkkbd { + unsigned short keycode[LK_NUM_KEYCODES]; + int ignore_bytes; + unsigned char id[LK_NUM_IGNORE_BYTES]; + struct input_dev *dev; + struct serio *serio; + struct work_struct tq; + char name[64]; + char phys[32]; + char type; + int bell_volume; + int keyclick_volume; + int ctrlclick_volume; +}; + +#ifdef LKKBD_DEBUG +/* + * Responses from the keyboard and mapping back to their names. + */ +static struct { + unsigned char value; + unsigned char *name; +} lk_response[] = { +#define RESPONSE(x) { .value = (x), .name = #x, } + RESPONSE(LK_STUCK_KEY), + RESPONSE(LK_SELFTEST_FAILED), + RESPONSE(LK_ALL_KEYS_UP), + RESPONSE(LK_METRONOME), + RESPONSE(LK_OUTPUT_ERROR), + RESPONSE(LK_INPUT_ERROR), + RESPONSE(LK_KBD_LOCKED), + RESPONSE(LK_KBD_TEST_MODE_ACK), + RESPONSE(LK_PREFIX_KEY_DOWN), + RESPONSE(LK_MODE_CHANGE_ACK), + RESPONSE(LK_RESPONSE_RESERVED), +#undef RESPONSE +}; + +static unsigned char *response_name(unsigned char value) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(lk_response); i++) + if (lk_response[i].value == value) + return lk_response[i].name; + + return ""; +} +#endif /* LKKBD_DEBUG */ + +/* + * Calculate volume parameter byte for a given volume. + */ +static unsigned char volume_to_hw(int volume_percent) +{ + unsigned char ret = 0; + + if (volume_percent < 0) + volume_percent = 0; + if (volume_percent > 100) + volume_percent = 100; + + if (volume_percent >= 0) + ret = 7; + if (volume_percent >= 13) /* 12.5 */ + ret = 6; + if (volume_percent >= 25) + ret = 5; + if (volume_percent >= 38) /* 37.5 */ + ret = 4; + if (volume_percent >= 50) + ret = 3; + if (volume_percent >= 63) /* 62.5 */ + ret = 2; /* This is the default volume */ + if (volume_percent >= 75) + ret = 1; + if (volume_percent >= 88) /* 87.5 */ + ret = 0; + + ret |= 0x80; + + return ret; +} + +static void lkkbd_detection_done(struct lkkbd *lk) +{ + int i; + + /* + * Reset setting for Compose key. Let Compose be KEY_COMPOSE. + */ + lk->keycode[0xb1] = KEY_COMPOSE; + + /* + * Print keyboard name and modify Compose=Alt on user's request. + */ + switch (lk->id[4]) { + case 1: + strlcpy(lk->name, "DEC LK201 keyboard", sizeof(lk->name)); + + if (lk201_compose_is_alt) + lk->keycode[0xb1] = KEY_LEFTALT; + break; + + case 2: + strlcpy(lk->name, "DEC LK401 keyboard", sizeof(lk->name)); + break; + + default: + strlcpy(lk->name, "Unknown DEC keyboard", sizeof(lk->name)); + printk(KERN_ERR + "lkkbd: keyboard on %s is unknown, please report to " + "Jan-Benedict Glaw \n", lk->phys); + printk(KERN_ERR "lkkbd: keyboard ID'ed as:"); + for (i = 0; i < LK_NUM_IGNORE_BYTES; i++) + printk(" 0x%02x", lk->id[i]); + printk("\n"); + break; + } + + printk(KERN_INFO "lkkbd: keyboard on %s identified as: %s\n", + lk->phys, lk->name); + + /* + * Report errors during keyboard boot-up. + */ + switch (lk->id[2]) { + case 0x00: + /* All okay */ + break; + + case LK_STUCK_KEY: + printk(KERN_ERR "lkkbd: Stuck key on keyboard at %s\n", + lk->phys); + break; + + case LK_SELFTEST_FAILED: + printk(KERN_ERR + "lkkbd: Selftest failed on keyboard at %s, " + "keyboard may not work properly\n", lk->phys); + break; + + default: + printk(KERN_ERR + "lkkbd: Unknown error %02x on keyboard at %s\n", + lk->id[2], lk->phys); + break; + } + + /* + * Try to hint user if there's a stuck key. + */ + if (lk->id[2] == LK_STUCK_KEY && lk->id[3] != 0) + printk(KERN_ERR + "Scancode of stuck key is 0x%02x, keycode is 0x%04x\n", + lk->id[3], lk->keycode[lk->id[3]]); +} + +/* + * lkkbd_interrupt() is called by the low level driver when a character + * is received. + */ +static irqreturn_t lkkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct lkkbd *lk = serio_get_drvdata(serio); + struct input_dev *input_dev = lk->dev; + unsigned int keycode; + int i; + + DBG(KERN_INFO "Got byte 0x%02x\n", data); + + if (lk->ignore_bytes > 0) { + DBG(KERN_INFO "Ignoring a byte on %s\n", lk->name); + lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; + + if (lk->ignore_bytes == 0) + lkkbd_detection_done(lk); + + return IRQ_HANDLED; + } + + switch (data) { + case LK_ALL_KEYS_UP: + for (i = 0; i < ARRAY_SIZE(lkkbd_keycode); i++) + input_report_key(input_dev, lk->keycode[i], 0); + input_sync(input_dev); + break; + + case 0x01: + DBG(KERN_INFO "Got 0x01, scheduling re-initialization\n"); + lk->ignore_bytes = LK_NUM_IGNORE_BYTES; + lk->id[LK_NUM_IGNORE_BYTES - lk->ignore_bytes--] = data; + schedule_work(&lk->tq); + break; + + case LK_METRONOME: + case LK_OUTPUT_ERROR: + case LK_INPUT_ERROR: + case LK_KBD_LOCKED: + case LK_KBD_TEST_MODE_ACK: + case LK_PREFIX_KEY_DOWN: + case LK_MODE_CHANGE_ACK: + case LK_RESPONSE_RESERVED: + DBG(KERN_INFO "Got %s and don't know how to handle...\n", + response_name(data)); + break; + + default: + keycode = lk->keycode[data]; + if (keycode != KEY_RESERVED) { + input_report_key(input_dev, keycode, + !test_bit(keycode, input_dev->key)); + input_sync(input_dev); + } else { + printk(KERN_WARNING + "%s: Unknown key with scancode 0x%02x on %s.\n", + __FILE__, data, lk->name); + } + } + + return IRQ_HANDLED; +} + +static void lkkbd_toggle_leds(struct lkkbd *lk) +{ + struct serio *serio = lk->serio; + unsigned char leds_on = 0; + unsigned char leds_off = 0; + + CHECK_LED(lk, leds_on, leds_off, LED_CAPSL, LK_LED_SHIFTLOCK); + CHECK_LED(lk, leds_on, leds_off, LED_COMPOSE, LK_LED_COMPOSE); + CHECK_LED(lk, leds_on, leds_off, LED_SCROLLL, LK_LED_SCROLLLOCK); + CHECK_LED(lk, leds_on, leds_off, LED_SLEEP, LK_LED_WAIT); + if (leds_on != 0) { + serio_write(serio, LK_CMD_LED_ON); + serio_write(serio, leds_on); + } + if (leds_off != 0) { + serio_write(serio, LK_CMD_LED_OFF); + serio_write(serio, leds_off); + } +} + +static void lkkbd_toggle_keyclick(struct lkkbd *lk, bool on) +{ + struct serio *serio = lk->serio; + + if (on) { + DBG("%s: Activating key clicks\n", __func__); + serio_write(serio, LK_CMD_ENABLE_KEYCLICK); + serio_write(serio, volume_to_hw(lk->keyclick_volume)); + serio_write(serio, LK_CMD_ENABLE_CTRCLICK); + serio_write(serio, volume_to_hw(lk->ctrlclick_volume)); + } else { + DBG("%s: Deactivating key clicks\n", __func__); + serio_write(serio, LK_CMD_DISABLE_KEYCLICK); + serio_write(serio, LK_CMD_DISABLE_CTRCLICK); + } + +} + +/* + * lkkbd_event() handles events from the input module. + */ +static int lkkbd_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + struct lkkbd *lk = input_get_drvdata(dev); + + switch (type) { + case EV_LED: + lkkbd_toggle_leds(lk); + return 0; + + case EV_SND: + switch (code) { + case SND_CLICK: + lkkbd_toggle_keyclick(lk, value); + return 0; + + case SND_BELL: + if (value != 0) + serio_write(lk->serio, LK_CMD_SOUND_BELL); + + return 0; + } + + break; + + default: + printk(KERN_ERR "%s(): Got unknown type %d, code %d, value %d\n", + __func__, type, code, value); + } + + return -1; +} + +/* + * lkkbd_reinit() sets leds and beeps to a state the computer remembers they + * were in. + */ +static void lkkbd_reinit(struct work_struct *work) +{ + struct lkkbd *lk = container_of(work, struct lkkbd, tq); + int division; + + /* Ask for ID */ + serio_write(lk->serio, LK_CMD_REQUEST_ID); + + /* Reset parameters */ + serio_write(lk->serio, LK_CMD_SET_DEFAULTS); + + /* Set LEDs */ + lkkbd_toggle_leds(lk); + + /* + * Try to activate extended LK401 mode. This command will + * only work with a LK401 keyboard and grants access to + * LAlt, RAlt, RCompose and RShift. + */ + serio_write(lk->serio, LK_CMD_ENABLE_LK401); + + /* Set all keys to UPDOWN mode */ + for (division = 1; division <= 14; division++) + serio_write(lk->serio, + LK_CMD_SET_MODE(LK_MODE_UPDOWN, division)); + + /* Enable bell and set volume */ + serio_write(lk->serio, LK_CMD_ENABLE_BELL); + serio_write(lk->serio, volume_to_hw(lk->bell_volume)); + + /* Enable/disable keyclick (and possibly set volume) */ + lkkbd_toggle_keyclick(lk, test_bit(SND_CLICK, lk->dev->snd)); + + /* Sound the bell if needed */ + if (test_bit(SND_BELL, lk->dev->snd)) + serio_write(lk->serio, LK_CMD_SOUND_BELL); +} + +/* + * lkkbd_connect() probes for a LK keyboard and fills the necessary structures. + */ +static int lkkbd_connect(struct serio *serio, struct serio_driver *drv) +{ + struct lkkbd *lk; + struct input_dev *input_dev; + int i; + int err; + + lk = kzalloc(sizeof(struct lkkbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!lk || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + lk->serio = serio; + lk->dev = input_dev; + INIT_WORK(&lk->tq, lkkbd_reinit); + lk->bell_volume = bell_volume; + lk->keyclick_volume = keyclick_volume; + lk->ctrlclick_volume = ctrlclick_volume; + memcpy(lk->keycode, lkkbd_keycode, sizeof(lk->keycode)); + + strlcpy(lk->name, "DEC LK keyboard", sizeof(lk->name)); + snprintf(lk->phys, sizeof(lk->phys), "%s/input0", serio->phys); + + input_dev->name = lk->name; + input_dev->phys = lk->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_LKKBD; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + input_dev->event = lkkbd_event; + + input_set_drvdata(input_dev, lk); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_LED, input_dev->evbit); + __set_bit(EV_SND, input_dev->evbit); + __set_bit(EV_REP, input_dev->evbit); + __set_bit(LED_CAPSL, input_dev->ledbit); + __set_bit(LED_SLEEP, input_dev->ledbit); + __set_bit(LED_COMPOSE, input_dev->ledbit); + __set_bit(LED_SCROLLL, input_dev->ledbit); + __set_bit(SND_BELL, input_dev->sndbit); + __set_bit(SND_CLICK, input_dev->sndbit); + + input_dev->keycode = lk->keycode; + input_dev->keycodesize = sizeof(lk->keycode[0]); + input_dev->keycodemax = ARRAY_SIZE(lk->keycode); + + for (i = 0; i < LK_NUM_KEYCODES; i++) + __set_bit(lk->keycode[i], input_dev->keybit); + __clear_bit(KEY_RESERVED, input_dev->keybit); + + serio_set_drvdata(serio, lk); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(lk->dev); + if (err) + goto fail3; + + serio_write(lk->serio, LK_CMD_POWERCYCLE_RESET); + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(lk); + return err; +} + +/* + * lkkbd_disconnect() unregisters and closes behind us. + */ +static void lkkbd_disconnect(struct serio *serio) +{ + struct lkkbd *lk = serio_get_drvdata(serio); + + input_get_device(lk->dev); + input_unregister_device(lk->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(lk->dev); + kfree(lk); +} + +static struct serio_device_id lkkbd_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_LKKBD, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, lkkbd_serio_ids); + +static struct serio_driver lkkbd_drv = { + .driver = { + .name = "lkkbd", + }, + .description = DRIVER_DESC, + .id_table = lkkbd_serio_ids, + .connect = lkkbd_connect, + .disconnect = lkkbd_disconnect, + .interrupt = lkkbd_interrupt, +}; + +module_serio_driver(lkkbd_drv); diff --git a/drivers/input/keyboard/lm8323.c b/drivers/input/keyboard/lm8323.c new file mode 100644 index 00000000..0de23f41 --- /dev/null +++ b/drivers/input/keyboard/lm8323.c @@ -0,0 +1,861 @@ +/* + * drivers/i2c/chips/lm8323.c + * + * Copyright (C) 2007-2009 Nokia Corporation + * + * Written by Daniel Stone + * Timo O. Karjalainen + * + * Updated by Felipe Balbi + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation (version 2 of the License only). + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Commands to send to the chip. */ +#define LM8323_CMD_READ_ID 0x80 /* Read chip ID. */ +#define LM8323_CMD_WRITE_CFG 0x81 /* Set configuration item. */ +#define LM8323_CMD_READ_INT 0x82 /* Get interrupt status. */ +#define LM8323_CMD_RESET 0x83 /* Reset, same as external one */ +#define LM8323_CMD_WRITE_PORT_SEL 0x85 /* Set GPIO in/out. */ +#define LM8323_CMD_WRITE_PORT_STATE 0x86 /* Set GPIO pullup. */ +#define LM8323_CMD_READ_PORT_SEL 0x87 /* Get GPIO in/out. */ +#define LM8323_CMD_READ_PORT_STATE 0x88 /* Get GPIO pullup. */ +#define LM8323_CMD_READ_FIFO 0x89 /* Read byte from FIFO. */ +#define LM8323_CMD_RPT_READ_FIFO 0x8a /* Read FIFO (no increment). */ +#define LM8323_CMD_SET_ACTIVE 0x8b /* Set active time. */ +#define LM8323_CMD_READ_ERR 0x8c /* Get error status. */ +#define LM8323_CMD_READ_ROTATOR 0x8e /* Read rotator status. */ +#define LM8323_CMD_SET_DEBOUNCE 0x8f /* Set debouncing time. */ +#define LM8323_CMD_SET_KEY_SIZE 0x90 /* Set keypad size. */ +#define LM8323_CMD_READ_KEY_SIZE 0x91 /* Get keypad size. */ +#define LM8323_CMD_READ_CFG 0x92 /* Get configuration item. */ +#define LM8323_CMD_WRITE_CLOCK 0x93 /* Set clock config. */ +#define LM8323_CMD_READ_CLOCK 0x94 /* Get clock config. */ +#define LM8323_CMD_PWM_WRITE 0x95 /* Write PWM script. */ +#define LM8323_CMD_START_PWM 0x96 /* Start PWM engine. */ +#define LM8323_CMD_STOP_PWM 0x97 /* Stop PWM engine. */ + +/* Interrupt status. */ +#define INT_KEYPAD 0x01 /* Key event. */ +#define INT_ROTATOR 0x02 /* Rotator event. */ +#define INT_ERROR 0x08 /* Error: use CMD_READ_ERR. */ +#define INT_NOINIT 0x10 /* Lost configuration. */ +#define INT_PWM1 0x20 /* PWM1 stopped. */ +#define INT_PWM2 0x40 /* PWM2 stopped. */ +#define INT_PWM3 0x80 /* PWM3 stopped. */ + +/* Errors (signalled by INT_ERROR, read with CMD_READ_ERR). */ +#define ERR_BADPAR 0x01 /* Bad parameter. */ +#define ERR_CMDUNK 0x02 /* Unknown command. */ +#define ERR_KEYOVR 0x04 /* Too many keys pressed. */ +#define ERR_FIFOOVER 0x40 /* FIFO overflow. */ + +/* Configuration keys (CMD_{WRITE,READ}_CFG). */ +#define CFG_MUX1SEL 0x01 /* Select MUX1_OUT input. */ +#define CFG_MUX1EN 0x02 /* Enable MUX1_OUT. */ +#define CFG_MUX2SEL 0x04 /* Select MUX2_OUT input. */ +#define CFG_MUX2EN 0x08 /* Enable MUX2_OUT. */ +#define CFG_PSIZE 0x20 /* Package size (must be 0). */ +#define CFG_ROTEN 0x40 /* Enable rotator. */ + +/* Clock settings (CMD_{WRITE,READ}_CLOCK). */ +#define CLK_RCPWM_INTERNAL 0x00 +#define CLK_RCPWM_EXTERNAL 0x03 +#define CLK_SLOWCLKEN 0x08 /* Enable 32.768kHz clock. */ +#define CLK_SLOWCLKOUT 0x40 /* Enable slow pulse output. */ + +/* The possible addresses corresponding to CONFIG1 and CONFIG2 pin wirings. */ +#define LM8323_I2C_ADDR00 (0x84 >> 1) /* 1000 010x */ +#define LM8323_I2C_ADDR01 (0x86 >> 1) /* 1000 011x */ +#define LM8323_I2C_ADDR10 (0x88 >> 1) /* 1000 100x */ +#define LM8323_I2C_ADDR11 (0x8A >> 1) /* 1000 101x */ + +/* Key event fifo length */ +#define LM8323_FIFO_LEN 15 + +/* Commands for PWM engine; feed in with PWM_WRITE. */ +/* Load ramp counter from duty cycle field (range 0 - 0xff). */ +#define PWM_SET(v) (0x4000 | ((v) & 0xff)) +/* Go to start of script. */ +#define PWM_GOTOSTART 0x0000 +/* + * Stop engine (generates interrupt). If reset is 1, clear the program + * counter, else leave it. + */ +#define PWM_END(reset) (0xc000 | (!!(reset) << 11)) +/* + * Ramp. If s is 1, divide clock by 512, else divide clock by 16. + * Take t clock scales (up to 63) per step, for n steps (up to 126). + * If u is set, ramp up, else ramp down. + */ +#define PWM_RAMP(s, t, n, u) ((!!(s) << 14) | ((t) & 0x3f) << 8 | \ + ((n) & 0x7f) | ((u) ? 0 : 0x80)) +/* + * Loop (i.e. jump back to pos) for a given number of iterations (up to 63). + * If cnt is zero, execute until PWM_END is encountered. + */ +#define PWM_LOOP(cnt, pos) (0xa000 | (((cnt) & 0x3f) << 7) | \ + ((pos) & 0x3f)) +/* + * Wait for trigger. Argument is a mask of channels, shifted by the channel + * number, e.g. 0xa for channels 3 and 1. Note that channels are numbered + * from 1, not 0. + */ +#define PWM_WAIT_TRIG(chans) (0xe000 | (((chans) & 0x7) << 6)) +/* Send trigger. Argument is same as PWM_WAIT_TRIG. */ +#define PWM_SEND_TRIG(chans) (0xe000 | ((chans) & 0x7)) + +struct lm8323_pwm { + int id; + int fade_time; + int brightness; + int desired_brightness; + bool enabled; + bool running; + /* pwm lock */ + struct mutex lock; + struct work_struct work; + struct led_classdev cdev; + struct lm8323_chip *chip; +}; + +struct lm8323_chip { + /* device lock */ + struct mutex lock; + struct i2c_client *client; + struct input_dev *idev; + bool kp_enabled; + bool pm_suspend; + unsigned keys_down; + char phys[32]; + unsigned short keymap[LM8323_KEYMAP_SIZE]; + int size_x; + int size_y; + int debounce_time; + int active_time; + struct lm8323_pwm pwm[LM8323_NUM_PWMS]; +}; + +#define client_to_lm8323(c) container_of(c, struct lm8323_chip, client) +#define dev_to_lm8323(d) container_of(d, struct lm8323_chip, client->dev) +#define cdev_to_pwm(c) container_of(c, struct lm8323_pwm, cdev) +#define work_to_pwm(w) container_of(w, struct lm8323_pwm, work) + +#define LM8323_MAX_DATA 8 + +/* + * To write, we just access the chip's address in write mode, and dump the + * command and data out on the bus. The command byte and data are taken as + * sequential u8s out of varargs, to a maximum of LM8323_MAX_DATA. + */ +static int lm8323_write(struct lm8323_chip *lm, int len, ...) +{ + int ret, i; + va_list ap; + u8 data[LM8323_MAX_DATA]; + + va_start(ap, len); + + if (unlikely(len > LM8323_MAX_DATA)) { + dev_err(&lm->client->dev, "tried to send %d bytes\n", len); + va_end(ap); + return 0; + } + + for (i = 0; i < len; i++) + data[i] = va_arg(ap, int); + + va_end(ap); + + /* + * If the host is asleep while we send the data, we can get a NACK + * back while it wakes up, so try again, once. + */ + ret = i2c_master_send(lm->client, data, len); + if (unlikely(ret == -EREMOTEIO)) + ret = i2c_master_send(lm->client, data, len); + if (unlikely(ret != len)) + dev_err(&lm->client->dev, "sent %d bytes of %d total\n", + len, ret); + + return ret; +} + +/* + * To read, we first send the command byte to the chip and end the transaction, + * then access the chip in read mode, at which point it will send the data. + */ +static int lm8323_read(struct lm8323_chip *lm, u8 cmd, u8 *buf, int len) +{ + int ret; + + /* + * If the host is asleep while we send the byte, we can get a NACK + * back while it wakes up, so try again, once. + */ + ret = i2c_master_send(lm->client, &cmd, 1); + if (unlikely(ret == -EREMOTEIO)) + ret = i2c_master_send(lm->client, &cmd, 1); + if (unlikely(ret != 1)) { + dev_err(&lm->client->dev, "sending read cmd 0x%02x failed\n", + cmd); + return 0; + } + + ret = i2c_master_recv(lm->client, buf, len); + if (unlikely(ret != len)) + dev_err(&lm->client->dev, "wanted %d bytes, got %d\n", + len, ret); + + return ret; +} + +/* + * Set the chip active time (idle time before it enters halt). + */ +static void lm8323_set_active_time(struct lm8323_chip *lm, int time) +{ + lm8323_write(lm, 2, LM8323_CMD_SET_ACTIVE, time >> 2); +} + +/* + * The signals are AT-style: the low 7 bits are the keycode, and the top + * bit indicates the state (1 for down, 0 for up). + */ +static inline u8 lm8323_whichkey(u8 event) +{ + return event & 0x7f; +} + +static inline int lm8323_ispress(u8 event) +{ + return (event & 0x80) ? 1 : 0; +} + +static void process_keys(struct lm8323_chip *lm) +{ + u8 event; + u8 key_fifo[LM8323_FIFO_LEN + 1]; + int old_keys_down = lm->keys_down; + int ret; + int i = 0; + + /* + * Read all key events from the FIFO at once. Next READ_FIFO clears the + * FIFO even if we didn't read all events previously. + */ + ret = lm8323_read(lm, LM8323_CMD_READ_FIFO, key_fifo, LM8323_FIFO_LEN); + + if (ret < 0) { + dev_err(&lm->client->dev, "Failed reading fifo \n"); + return; + } + key_fifo[ret] = 0; + + while ((event = key_fifo[i++])) { + u8 key = lm8323_whichkey(event); + int isdown = lm8323_ispress(event); + unsigned short keycode = lm->keymap[key]; + + dev_vdbg(&lm->client->dev, "key 0x%02x %s\n", + key, isdown ? "down" : "up"); + + if (lm->kp_enabled) { + input_event(lm->idev, EV_MSC, MSC_SCAN, key); + input_report_key(lm->idev, keycode, isdown); + input_sync(lm->idev); + } + + if (isdown) + lm->keys_down++; + else + lm->keys_down--; + } + + /* + * Errata: We need to ensure that the chip never enters halt mode + * during a keypress, so set active time to 0. When it's released, + * we can enter halt again, so set the active time back to normal. + */ + if (!old_keys_down && lm->keys_down) + lm8323_set_active_time(lm, 0); + if (old_keys_down && !lm->keys_down) + lm8323_set_active_time(lm, lm->active_time); +} + +static void lm8323_process_error(struct lm8323_chip *lm) +{ + u8 error; + + if (lm8323_read(lm, LM8323_CMD_READ_ERR, &error, 1) == 1) { + if (error & ERR_FIFOOVER) + dev_vdbg(&lm->client->dev, "fifo overflow!\n"); + if (error & ERR_KEYOVR) + dev_vdbg(&lm->client->dev, + "more than two keys pressed\n"); + if (error & ERR_CMDUNK) + dev_vdbg(&lm->client->dev, + "unknown command submitted\n"); + if (error & ERR_BADPAR) + dev_vdbg(&lm->client->dev, "bad command parameter\n"); + } +} + +static void lm8323_reset(struct lm8323_chip *lm) +{ + /* The docs say we must pass 0xAA as the data byte. */ + lm8323_write(lm, 2, LM8323_CMD_RESET, 0xAA); +} + +static int lm8323_configure(struct lm8323_chip *lm) +{ + int keysize = (lm->size_x << 4) | lm->size_y; + int clock = (CLK_SLOWCLKEN | CLK_RCPWM_EXTERNAL); + int debounce = lm->debounce_time >> 2; + int active = lm->active_time >> 2; + + /* + * Active time must be greater than the debounce time: if it's + * a close-run thing, give ourselves a 12ms buffer. + */ + if (debounce >= active) + active = debounce + 3; + + lm8323_write(lm, 2, LM8323_CMD_WRITE_CFG, 0); + lm8323_write(lm, 2, LM8323_CMD_WRITE_CLOCK, clock); + lm8323_write(lm, 2, LM8323_CMD_SET_KEY_SIZE, keysize); + lm8323_set_active_time(lm, lm->active_time); + lm8323_write(lm, 2, LM8323_CMD_SET_DEBOUNCE, debounce); + lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_STATE, 0xff, 0xff); + lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_SEL, 0, 0); + + /* + * Not much we can do about errors at this point, so just hope + * for the best. + */ + + return 0; +} + +static void pwm_done(struct lm8323_pwm *pwm) +{ + mutex_lock(&pwm->lock); + pwm->running = false; + if (pwm->desired_brightness != pwm->brightness) + schedule_work(&pwm->work); + mutex_unlock(&pwm->lock); +} + +/* + * Bottom half: handle the interrupt by posting key events, or dealing with + * errors appropriately. + */ +static irqreturn_t lm8323_irq(int irq, void *_lm) +{ + struct lm8323_chip *lm = _lm; + u8 ints; + int i; + + mutex_lock(&lm->lock); + + while ((lm8323_read(lm, LM8323_CMD_READ_INT, &ints, 1) == 1) && ints) { + if (likely(ints & INT_KEYPAD)) + process_keys(lm); + if (ints & INT_ROTATOR) { + /* We don't currently support the rotator. */ + dev_vdbg(&lm->client->dev, "rotator fired\n"); + } + if (ints & INT_ERROR) { + dev_vdbg(&lm->client->dev, "error!\n"); + lm8323_process_error(lm); + } + if (ints & INT_NOINIT) { + dev_err(&lm->client->dev, "chip lost config; " + "reinitialising\n"); + lm8323_configure(lm); + } + for (i = 0; i < LM8323_NUM_PWMS; i++) { + if (ints & (INT_PWM1 << i)) { + dev_vdbg(&lm->client->dev, + "pwm%d engine completed\n", i); + pwm_done(&lm->pwm[i]); + } + } + } + + mutex_unlock(&lm->lock); + + return IRQ_HANDLED; +} + +/* + * Read the chip ID. + */ +static int lm8323_read_id(struct lm8323_chip *lm, u8 *buf) +{ + int bytes; + + bytes = lm8323_read(lm, LM8323_CMD_READ_ID, buf, 2); + if (unlikely(bytes != 2)) + return -EIO; + + return 0; +} + +static void lm8323_write_pwm_one(struct lm8323_pwm *pwm, int pos, u16 cmd) +{ + lm8323_write(pwm->chip, 4, LM8323_CMD_PWM_WRITE, (pos << 2) | pwm->id, + (cmd & 0xff00) >> 8, cmd & 0x00ff); +} + +/* + * Write a script into a given PWM engine, concluding with PWM_END. + * If 'kill' is nonzero, the engine will be shut down at the end + * of the script, producing a zero output. Otherwise the engine + * will be kept running at the final PWM level indefinitely. + */ +static void lm8323_write_pwm(struct lm8323_pwm *pwm, int kill, + int len, const u16 *cmds) +{ + int i; + + for (i = 0; i < len; i++) + lm8323_write_pwm_one(pwm, i, cmds[i]); + + lm8323_write_pwm_one(pwm, i++, PWM_END(kill)); + lm8323_write(pwm->chip, 2, LM8323_CMD_START_PWM, pwm->id); + pwm->running = true; +} + +static void lm8323_pwm_work(struct work_struct *work) +{ + struct lm8323_pwm *pwm = work_to_pwm(work); + int div512, perstep, steps, hz, up, kill; + u16 pwm_cmds[3]; + int num_cmds = 0; + + mutex_lock(&pwm->lock); + + /* + * Do nothing if we're already at the requested level, + * or previous setting is not yet complete. In the latter + * case we will be called again when the previous PWM script + * finishes. + */ + if (pwm->running || pwm->desired_brightness == pwm->brightness) + goto out; + + kill = (pwm->desired_brightness == 0); + up = (pwm->desired_brightness > pwm->brightness); + steps = abs(pwm->desired_brightness - pwm->brightness); + + /* + * Convert time (in ms) into a divisor (512 or 16 on a refclk of + * 32768Hz), and number of ticks per step. + */ + if ((pwm->fade_time / steps) > (32768 / 512)) { + div512 = 1; + hz = 32768 / 512; + } else { + div512 = 0; + hz = 32768 / 16; + } + + perstep = (hz * pwm->fade_time) / (steps * 1000); + + if (perstep == 0) + perstep = 1; + else if (perstep > 63) + perstep = 63; + + while (steps) { + int s; + + s = min(126, steps); + pwm_cmds[num_cmds++] = PWM_RAMP(div512, perstep, s, up); + steps -= s; + } + + lm8323_write_pwm(pwm, kill, num_cmds, pwm_cmds); + pwm->brightness = pwm->desired_brightness; + + out: + mutex_unlock(&pwm->lock); +} + +static void lm8323_pwm_set_brightness(struct led_classdev *led_cdev, + enum led_brightness brightness) +{ + struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); + struct lm8323_chip *lm = pwm->chip; + + mutex_lock(&pwm->lock); + pwm->desired_brightness = brightness; + mutex_unlock(&pwm->lock); + + if (in_interrupt()) { + schedule_work(&pwm->work); + } else { + /* + * Schedule PWM work as usual unless we are going into suspend + */ + mutex_lock(&lm->lock); + if (likely(!lm->pm_suspend)) + schedule_work(&pwm->work); + else + lm8323_pwm_work(&pwm->work); + mutex_unlock(&lm->lock); + } +} + +static ssize_t lm8323_pwm_show_time(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); + + return sprintf(buf, "%d\n", pwm->fade_time); +} + +static ssize_t lm8323_pwm_store_time(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev); + int ret, time; + + ret = kstrtoint(buf, 10, &time); + /* Numbers only, please. */ + if (ret) + return ret; + + pwm->fade_time = time; + + return strlen(buf); +} +static DEVICE_ATTR(time, 0644, lm8323_pwm_show_time, lm8323_pwm_store_time); + +static int init_pwm(struct lm8323_chip *lm, int id, struct device *dev, + const char *name) +{ + struct lm8323_pwm *pwm; + + BUG_ON(id > 3); + + pwm = &lm->pwm[id - 1]; + + pwm->id = id; + pwm->fade_time = 0; + pwm->brightness = 0; + pwm->desired_brightness = 0; + pwm->running = false; + pwm->enabled = false; + INIT_WORK(&pwm->work, lm8323_pwm_work); + mutex_init(&pwm->lock); + pwm->chip = lm; + + if (name) { + pwm->cdev.name = name; + pwm->cdev.brightness_set = lm8323_pwm_set_brightness; + if (led_classdev_register(dev, &pwm->cdev) < 0) { + dev_err(dev, "couldn't register PWM %d\n", id); + return -1; + } + if (device_create_file(pwm->cdev.dev, + &dev_attr_time) < 0) { + dev_err(dev, "couldn't register time attribute\n"); + led_classdev_unregister(&pwm->cdev); + return -1; + } + pwm->enabled = true; + } + + return 0; +} + +static struct i2c_driver lm8323_i2c_driver; + +static ssize_t lm8323_show_disable(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct lm8323_chip *lm = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", !lm->kp_enabled); +} + +static ssize_t lm8323_set_disable(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct lm8323_chip *lm = dev_get_drvdata(dev); + int ret; + unsigned int i; + + ret = kstrtouint(buf, 10, &i); + + mutex_lock(&lm->lock); + lm->kp_enabled = !i; + mutex_unlock(&lm->lock); + + return count; +} +static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable); + +static int lm8323_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct lm8323_platform_data *pdata = client->dev.platform_data; + struct input_dev *idev; + struct lm8323_chip *lm; + int pwm; + int i, err; + unsigned long tmo; + u8 data[2]; + + if (!pdata || !pdata->size_x || !pdata->size_y) { + dev_err(&client->dev, "missing platform_data\n"); + return -EINVAL; + } + + if (pdata->size_x > 8) { + dev_err(&client->dev, "invalid x size %d specified\n", + pdata->size_x); + return -EINVAL; + } + + if (pdata->size_y > 12) { + dev_err(&client->dev, "invalid y size %d specified\n", + pdata->size_y); + return -EINVAL; + } + + lm = kzalloc(sizeof *lm, GFP_KERNEL); + idev = input_allocate_device(); + if (!lm || !idev) { + err = -ENOMEM; + goto fail1; + } + + lm->client = client; + lm->idev = idev; + mutex_init(&lm->lock); + + lm->size_x = pdata->size_x; + lm->size_y = pdata->size_y; + dev_vdbg(&client->dev, "Keypad size: %d x %d\n", + lm->size_x, lm->size_y); + + lm->debounce_time = pdata->debounce_time; + lm->active_time = pdata->active_time; + + lm8323_reset(lm); + + /* Nothing's set up to service the IRQ yet, so just spin for max. + * 100ms until we can configure. */ + tmo = jiffies + msecs_to_jiffies(100); + while (lm8323_read(lm, LM8323_CMD_READ_INT, data, 1) == 1) { + if (data[0] & INT_NOINIT) + break; + + if (time_after(jiffies, tmo)) { + dev_err(&client->dev, + "timeout waiting for initialisation\n"); + break; + } + + msleep(1); + } + + lm8323_configure(lm); + + /* If a true probe check the device */ + if (lm8323_read_id(lm, data) != 0) { + dev_err(&client->dev, "device not found\n"); + err = -ENODEV; + goto fail1; + } + + for (pwm = 0; pwm < LM8323_NUM_PWMS; pwm++) { + err = init_pwm(lm, pwm + 1, &client->dev, + pdata->pwm_names[pwm]); + if (err < 0) + goto fail2; + } + + lm->kp_enabled = true; + err = device_create_file(&client->dev, &dev_attr_disable_kp); + if (err < 0) + goto fail2; + + idev->name = pdata->name ? : "LM8323 keypad"; + snprintf(lm->phys, sizeof(lm->phys), + "%s/input-kp", dev_name(&client->dev)); + idev->phys = lm->phys; + + idev->evbit[0] = BIT(EV_KEY) | BIT(EV_MSC); + __set_bit(MSC_SCAN, idev->mscbit); + for (i = 0; i < LM8323_KEYMAP_SIZE; i++) { + __set_bit(pdata->keymap[i], idev->keybit); + lm->keymap[i] = pdata->keymap[i]; + } + __clear_bit(KEY_RESERVED, idev->keybit); + + if (pdata->repeat) + __set_bit(EV_REP, idev->evbit); + + err = input_register_device(idev); + if (err) { + dev_dbg(&client->dev, "error registering input device\n"); + goto fail3; + } + + err = request_threaded_irq(client->irq, NULL, lm8323_irq, + IRQF_TRIGGER_LOW|IRQF_ONESHOT, "lm8323", lm); + if (err) { + dev_err(&client->dev, "could not get IRQ %d\n", client->irq); + goto fail4; + } + + i2c_set_clientdata(client, lm); + + device_init_wakeup(&client->dev, 1); + enable_irq_wake(client->irq); + + return 0; + +fail4: + input_unregister_device(idev); + idev = NULL; +fail3: + device_remove_file(&client->dev, &dev_attr_disable_kp); +fail2: + while (--pwm >= 0) + if (lm->pwm[pwm].enabled) { + device_remove_file(lm->pwm[pwm].cdev.dev, + &dev_attr_time); + led_classdev_unregister(&lm->pwm[pwm].cdev); + } +fail1: + input_free_device(idev); + kfree(lm); + return err; +} + +static int lm8323_remove(struct i2c_client *client) +{ + struct lm8323_chip *lm = i2c_get_clientdata(client); + int i; + + disable_irq_wake(client->irq); + free_irq(client->irq, lm); + + input_unregister_device(lm->idev); + + device_remove_file(&lm->client->dev, &dev_attr_disable_kp); + + for (i = 0; i < 3; i++) + if (lm->pwm[i].enabled) { + device_remove_file(lm->pwm[i].cdev.dev, &dev_attr_time); + led_classdev_unregister(&lm->pwm[i].cdev); + } + + kfree(lm); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +/* + * We don't need to explicitly suspend the chip, as it already switches off + * when there's no activity. + */ +static int lm8323_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct lm8323_chip *lm = i2c_get_clientdata(client); + int i; + + irq_set_irq_wake(client->irq, 0); + disable_irq(client->irq); + + mutex_lock(&lm->lock); + lm->pm_suspend = true; + mutex_unlock(&lm->lock); + + for (i = 0; i < 3; i++) + if (lm->pwm[i].enabled) + led_classdev_suspend(&lm->pwm[i].cdev); + + return 0; +} + +static int lm8323_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct lm8323_chip *lm = i2c_get_clientdata(client); + int i; + + mutex_lock(&lm->lock); + lm->pm_suspend = false; + mutex_unlock(&lm->lock); + + for (i = 0; i < 3; i++) + if (lm->pwm[i].enabled) + led_classdev_resume(&lm->pwm[i].cdev); + + enable_irq(client->irq); + irq_set_irq_wake(client->irq, 1); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(lm8323_pm_ops, lm8323_suspend, lm8323_resume); + +static const struct i2c_device_id lm8323_id[] = { + { "lm8323", 0 }, + { } +}; + +static struct i2c_driver lm8323_i2c_driver = { + .driver = { + .name = "lm8323", + .pm = &lm8323_pm_ops, + }, + .probe = lm8323_probe, + .remove = lm8323_remove, + .id_table = lm8323_id, +}; +MODULE_DEVICE_TABLE(i2c, lm8323_id); + +module_i2c_driver(lm8323_i2c_driver); + +MODULE_AUTHOR("Timo O. Karjalainen "); +MODULE_AUTHOR("Daniel Stone"); +MODULE_AUTHOR("Felipe Balbi "); +MODULE_DESCRIPTION("LM8323 keypad driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/keyboard/lm8333.c b/drivers/input/keyboard/lm8333.c new file mode 100644 index 00000000..5a8ca35d --- /dev/null +++ b/drivers/input/keyboard/lm8333.c @@ -0,0 +1,235 @@ +/* + * LM8333 keypad driver + * Copyright (C) 2012 Wolfram Sang, Pengutronix + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define LM8333_FIFO_READ 0x20 +#define LM8333_DEBOUNCE 0x22 +#define LM8333_READ_INT 0xD0 +#define LM8333_ACTIVE 0xE4 +#define LM8333_READ_ERROR 0xF0 + +#define LM8333_KEYPAD_IRQ (1 << 0) +#define LM8333_ERROR_IRQ (1 << 3) + +#define LM8333_ERROR_KEYOVR 0x04 +#define LM8333_ERROR_FIFOOVR 0x40 + +#define LM8333_FIFO_TRANSFER_SIZE 16 + +#define LM8333_NUM_ROWS 8 +#define LM8333_NUM_COLS 16 +#define LM8333_ROW_SHIFT 4 + +struct lm8333 { + struct i2c_client *client; + struct input_dev *input; + unsigned short keycodes[LM8333_NUM_ROWS << LM8333_ROW_SHIFT]; +}; + +/* The accessors try twice because the first access may be needed for wakeup */ +#define LM8333_READ_RETRIES 2 + +int lm8333_read8(struct lm8333 *lm8333, u8 cmd) +{ + int retries = 0, ret; + + do { + ret = i2c_smbus_read_byte_data(lm8333->client, cmd); + } while (ret < 0 && retries++ < LM8333_READ_RETRIES); + + return ret; +} + +int lm8333_write8(struct lm8333 *lm8333, u8 cmd, u8 val) +{ + int retries = 0, ret; + + do { + ret = i2c_smbus_write_byte_data(lm8333->client, cmd, val); + } while (ret < 0 && retries++ < LM8333_READ_RETRIES); + + return ret; +} + +int lm8333_read_block(struct lm8333 *lm8333, u8 cmd, u8 len, u8 *buf) +{ + int retries = 0, ret; + + do { + ret = i2c_smbus_read_i2c_block_data(lm8333->client, + cmd, len, buf); + } while (ret < 0 && retries++ < LM8333_READ_RETRIES); + + return ret; +} + +static void lm8333_key_handler(struct lm8333 *lm8333) +{ + struct input_dev *input = lm8333->input; + u8 keys[LM8333_FIFO_TRANSFER_SIZE]; + u8 code, pressed; + int i, ret; + + ret = lm8333_read_block(lm8333, LM8333_FIFO_READ, + LM8333_FIFO_TRANSFER_SIZE, keys); + if (ret != LM8333_FIFO_TRANSFER_SIZE) { + dev_err(&lm8333->client->dev, + "Error %d while reading FIFO\n", ret); + return; + } + + for (i = 0; i < LM8333_FIFO_TRANSFER_SIZE && keys[i]; i++) { + pressed = keys[i] & 0x80; + code = keys[i] & 0x7f; + + input_event(input, EV_MSC, MSC_SCAN, code); + input_report_key(input, lm8333->keycodes[code], pressed); + } + + input_sync(input); +} + +static irqreturn_t lm8333_irq_thread(int irq, void *data) +{ + struct lm8333 *lm8333 = data; + u8 status = lm8333_read8(lm8333, LM8333_READ_INT); + + if (!status) + return IRQ_NONE; + + if (status & LM8333_ERROR_IRQ) { + u8 err = lm8333_read8(lm8333, LM8333_READ_ERROR); + + if (err & (LM8333_ERROR_KEYOVR | LM8333_ERROR_FIFOOVR)) { + u8 dummy[LM8333_FIFO_TRANSFER_SIZE]; + + lm8333_read_block(lm8333, LM8333_FIFO_READ, + LM8333_FIFO_TRANSFER_SIZE, dummy); + } + dev_err(&lm8333->client->dev, "Got error %02x\n", err); + } + + if (status & LM8333_KEYPAD_IRQ) + lm8333_key_handler(lm8333); + + return IRQ_HANDLED; +} + +static int lm8333_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct lm8333_platform_data *pdata = client->dev.platform_data; + struct lm8333 *lm8333; + struct input_dev *input; + int err, active_time; + + if (!pdata) + return -EINVAL; + + active_time = pdata->active_time ?: 500; + if (active_time / 3 <= pdata->debounce_time / 3) { + dev_err(&client->dev, "Active time not big enough!\n"); + return -EINVAL; + } + + lm8333 = kzalloc(sizeof(*lm8333), GFP_KERNEL); + input = input_allocate_device(); + if (!lm8333 || !input) { + err = -ENOMEM; + goto free_mem; + } + + lm8333->client = client; + lm8333->input = input; + + input->name = client->name; + input->dev.parent = &client->dev; + input->id.bustype = BUS_I2C; + + input_set_capability(input, EV_MSC, MSC_SCAN); + + err = matrix_keypad_build_keymap(pdata->matrix_data, NULL, + LM8333_NUM_ROWS, LM8333_NUM_COLS, + lm8333->keycodes, input); + if (err) + goto free_mem; + + if (pdata->debounce_time) { + err = lm8333_write8(lm8333, LM8333_DEBOUNCE, + pdata->debounce_time / 3); + if (err) + dev_warn(&client->dev, "Unable to set debounce time\n"); + } + + if (pdata->active_time) { + err = lm8333_write8(lm8333, LM8333_ACTIVE, + pdata->active_time / 3); + if (err) + dev_warn(&client->dev, "Unable to set active time\n"); + } + + err = request_threaded_irq(client->irq, NULL, lm8333_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "lm8333", lm8333); + if (err) + goto free_mem; + + err = input_register_device(input); + if (err) + goto free_irq; + + i2c_set_clientdata(client, lm8333); + return 0; + + free_irq: + free_irq(client->irq, lm8333); + free_mem: + input_free_device(input); + kfree(lm8333); + return err; +} + +static int lm8333_remove(struct i2c_client *client) +{ + struct lm8333 *lm8333 = i2c_get_clientdata(client); + + free_irq(client->irq, lm8333); + input_unregister_device(lm8333->input); + kfree(lm8333); + + return 0; +} + +static const struct i2c_device_id lm8333_id[] = { + { "lm8333", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, lm8333_id); + +static struct i2c_driver lm8333_driver = { + .driver = { + .name = "lm8333", + .owner = THIS_MODULE, + }, + .probe = lm8333_probe, + .remove = lm8333_remove, + .id_table = lm8333_id, +}; +module_i2c_driver(lm8333_driver); + +MODULE_AUTHOR("Wolfram Sang "); +MODULE_DESCRIPTION("LM8333 keyboard driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c new file mode 100644 index 00000000..c94d610b --- /dev/null +++ b/drivers/input/keyboard/locomokbd.c @@ -0,0 +1,362 @@ +/* + * LoCoMo keyboard driver for Linux-based ARM PDAs: + * - SHARP Zaurus Collie (SL-5500) + * - SHARP Zaurus Poodle (SL-5600) + * + * Copyright (c) 2005 John Lenz + * Based on from xtkbd.c + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +MODULE_AUTHOR("John Lenz "); +MODULE_DESCRIPTION("LoCoMo keyboard driver"); +MODULE_LICENSE("GPL"); + +#define LOCOMOKBD_NUMKEYS 128 + +#define KEY_ACTIVITY KEY_F16 +#define KEY_CONTACT KEY_F18 +#define KEY_CENTER KEY_F15 + +static const unsigned char +locomokbd_keycode[LOCOMOKBD_NUMKEYS] = { + 0, KEY_ESC, KEY_ACTIVITY, 0, 0, 0, 0, 0, 0, 0, /* 0 - 9 */ + 0, 0, 0, 0, 0, 0, 0, KEY_MENU, KEY_HOME, KEY_CONTACT, /* 10 - 19 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 20 - 29 */ + 0, 0, 0, KEY_CENTER, 0, KEY_MAIL, 0, 0, 0, 0, /* 30 - 39 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_RIGHT, /* 40 - 49 */ + KEY_UP, KEY_LEFT, 0, 0, KEY_P, 0, KEY_O, KEY_I, KEY_Y, KEY_T, /* 50 - 59 */ + KEY_E, KEY_W, 0, 0, 0, 0, KEY_DOWN, KEY_ENTER, 0, 0, /* 60 - 69 */ + KEY_BACKSPACE, 0, KEY_L, KEY_U, KEY_H, KEY_R, KEY_D, KEY_Q, 0, 0, /* 70 - 79 */ + 0, 0, 0, 0, 0, 0, KEY_ENTER, KEY_RIGHTSHIFT, KEY_K, KEY_J, /* 80 - 89 */ + KEY_G, KEY_F, KEY_X, KEY_S, 0, 0, 0, 0, 0, 0, /* 90 - 99 */ + 0, 0, KEY_DOT, 0, KEY_COMMA, KEY_N, KEY_B, KEY_C, KEY_Z, KEY_A, /* 100 - 109 */ + KEY_LEFTSHIFT, KEY_TAB, KEY_LEFTCTRL, 0, 0, 0, 0, 0, 0, 0, /* 110 - 119 */ + KEY_M, KEY_SPACE, KEY_V, KEY_APOSTROPHE, KEY_SLASH, 0, 0, 0 /* 120 - 128 */ +}; + +#define KB_ROWS 16 +#define KB_COLS 8 +#define KB_ROWMASK(r) (1 << (r)) +#define SCANCODE(c,r) ( ((c)<<4) + (r) + 1 ) + +#define KB_DELAY 8 +#define SCAN_INTERVAL (HZ/10) + +struct locomokbd { + unsigned char keycode[LOCOMOKBD_NUMKEYS]; + struct input_dev *input; + char phys[32]; + + unsigned long base; + spinlock_t lock; + + struct timer_list timer; + unsigned long suspend_jiffies; + unsigned int count_cancel; +}; + +/* helper functions for reading the keyboard matrix */ +static inline void locomokbd_charge_all(unsigned long membase) +{ + locomo_writel(0x00FF, membase + LOCOMO_KSC); +} + +static inline void locomokbd_activate_all(unsigned long membase) +{ + unsigned long r; + + locomo_writel(0, membase + LOCOMO_KSC); + r = locomo_readl(membase + LOCOMO_KIC); + r &= 0xFEFF; + locomo_writel(r, membase + LOCOMO_KIC); +} + +static inline void locomokbd_activate_col(unsigned long membase, int col) +{ + unsigned short nset; + unsigned short nbset; + + nset = 0xFF & ~(1 << col); + nbset = (nset << 8) + nset; + locomo_writel(nbset, membase + LOCOMO_KSC); +} + +static inline void locomokbd_reset_col(unsigned long membase, int col) +{ + unsigned short nbset; + + nbset = ((0xFF & ~(1 << col)) << 8) + 0xFF; + locomo_writel(nbset, membase + LOCOMO_KSC); +} + +/* + * The LoCoMo keyboard only generates interrupts when a key is pressed. + * So when a key is pressed, we enable a timer. This timer scans the + * keyboard, and this is how we detect when the key is released. + */ + +/* Scan the hardware keyboard and push any changes up through the input layer */ +static void locomokbd_scankeyboard(struct locomokbd *locomokbd) +{ + unsigned int row, col, rowd; + unsigned long flags; + unsigned int num_pressed; + unsigned long membase = locomokbd->base; + + spin_lock_irqsave(&locomokbd->lock, flags); + + locomokbd_charge_all(membase); + + num_pressed = 0; + for (col = 0; col < KB_COLS; col++) { + + locomokbd_activate_col(membase, col); + udelay(KB_DELAY); + + rowd = ~locomo_readl(membase + LOCOMO_KIB); + for (row = 0; row < KB_ROWS; row++) { + unsigned int scancode, pressed, key; + + scancode = SCANCODE(col, row); + pressed = rowd & KB_ROWMASK(row); + key = locomokbd->keycode[scancode]; + + input_report_key(locomokbd->input, key, pressed); + if (likely(!pressed)) + continue; + + num_pressed++; + + /* The "Cancel/ESC" key is labeled "On/Off" on + * Collie and Poodle and should suspend the device + * if it was pressed for more than a second. */ + if (unlikely(key == KEY_ESC)) { + if (!time_after(jiffies, + locomokbd->suspend_jiffies + HZ)) + continue; + if (locomokbd->count_cancel++ + != (HZ/SCAN_INTERVAL + 1)) + continue; + input_event(locomokbd->input, EV_PWR, + KEY_SUSPEND, 1); + locomokbd->suspend_jiffies = jiffies; + } else + locomokbd->count_cancel = 0; + } + locomokbd_reset_col(membase, col); + } + locomokbd_activate_all(membase); + + input_sync(locomokbd->input); + + /* if any keys are pressed, enable the timer */ + if (num_pressed) + mod_timer(&locomokbd->timer, jiffies + SCAN_INTERVAL); + else + locomokbd->count_cancel = 0; + + spin_unlock_irqrestore(&locomokbd->lock, flags); +} + +/* + * LoCoMo keyboard interrupt handler. + */ +static irqreturn_t locomokbd_interrupt(int irq, void *dev_id) +{ + struct locomokbd *locomokbd = dev_id; + u16 r; + + r = locomo_readl(locomokbd->base + LOCOMO_KIC); + if ((r & 0x0001) == 0) + return IRQ_HANDLED; + + locomo_writel(r & ~0x0100, locomokbd->base + LOCOMO_KIC); /* Ack */ + + /** wait chattering delay **/ + udelay(100); + + locomokbd_scankeyboard(locomokbd); + return IRQ_HANDLED; +} + +/* + * LoCoMo timer checking for released keys + */ +static void locomokbd_timer_callback(unsigned long data) +{ + struct locomokbd *locomokbd = (struct locomokbd *) data; + + locomokbd_scankeyboard(locomokbd); +} + +static int locomokbd_open(struct input_dev *dev) +{ + struct locomokbd *locomokbd = input_get_drvdata(dev); + u16 r; + + r = locomo_readl(locomokbd->base + LOCOMO_KIC) | 0x0010; + locomo_writel(r, locomokbd->base + LOCOMO_KIC); + return 0; +} + +static void locomokbd_close(struct input_dev *dev) +{ + struct locomokbd *locomokbd = input_get_drvdata(dev); + u16 r; + + r = locomo_readl(locomokbd->base + LOCOMO_KIC) & ~0x0010; + locomo_writel(r, locomokbd->base + LOCOMO_KIC); +} + +static int locomokbd_probe(struct locomo_dev *dev) +{ + struct locomokbd *locomokbd; + struct input_dev *input_dev; + int i, err; + + locomokbd = kzalloc(sizeof(struct locomokbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!locomokbd || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + /* try and claim memory region */ + if (!request_mem_region((unsigned long) dev->mapbase, + dev->length, + LOCOMO_DRIVER_NAME(dev))) { + err = -EBUSY; + printk(KERN_ERR "locomokbd: Can't acquire access to io memory for keyboard\n"); + goto err_free_mem; + } + + locomo_set_drvdata(dev, locomokbd); + + locomokbd->base = (unsigned long) dev->mapbase; + + spin_lock_init(&locomokbd->lock); + + init_timer(&locomokbd->timer); + locomokbd->timer.function = locomokbd_timer_callback; + locomokbd->timer.data = (unsigned long) locomokbd; + + locomokbd->suspend_jiffies = jiffies; + + locomokbd->input = input_dev; + strcpy(locomokbd->phys, "locomokbd/input0"); + + input_dev->name = "LoCoMo keyboard"; + input_dev->phys = locomokbd->phys; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->open = locomokbd_open; + input_dev->close = locomokbd_close; + input_dev->dev.parent = &dev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | + BIT_MASK(EV_PWR); + input_dev->keycode = locomokbd->keycode; + input_dev->keycodesize = sizeof(locomokbd_keycode[0]); + input_dev->keycodemax = ARRAY_SIZE(locomokbd_keycode); + + input_set_drvdata(input_dev, locomokbd); + + memcpy(locomokbd->keycode, locomokbd_keycode, sizeof(locomokbd->keycode)); + for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) + set_bit(locomokbd->keycode[i], input_dev->keybit); + clear_bit(0, input_dev->keybit); + + /* attempt to get the interrupt */ + err = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd); + if (err) { + printk(KERN_ERR "locomokbd: Can't get irq for keyboard\n"); + goto err_release_region; + } + + err = input_register_device(locomokbd->input); + if (err) + goto err_free_irq; + + return 0; + + err_free_irq: + free_irq(dev->irq[0], locomokbd); + err_release_region: + release_mem_region((unsigned long) dev->mapbase, dev->length); + locomo_set_drvdata(dev, NULL); + err_free_mem: + input_free_device(input_dev); + kfree(locomokbd); + + return err; +} + +static int locomokbd_remove(struct locomo_dev *dev) +{ + struct locomokbd *locomokbd = locomo_get_drvdata(dev); + + free_irq(dev->irq[0], locomokbd); + + del_timer_sync(&locomokbd->timer); + + input_unregister_device(locomokbd->input); + locomo_set_drvdata(dev, NULL); + + release_mem_region((unsigned long) dev->mapbase, dev->length); + + kfree(locomokbd); + + return 0; +} + +static struct locomo_driver keyboard_driver = { + .drv = { + .name = "locomokbd" + }, + .devid = LOCOMO_DEVID_KEYBOARD, + .probe = locomokbd_probe, + .remove = locomokbd_remove, +}; + +static int __init locomokbd_init(void) +{ + return locomo_driver_register(&keyboard_driver); +} + +static void __exit locomokbd_exit(void) +{ + locomo_driver_unregister(&keyboard_driver); +} + +module_init(locomokbd_init); +module_exit(locomokbd_exit); diff --git a/drivers/input/keyboard/lpc32xx-keys.c b/drivers/input/keyboard/lpc32xx-keys.c new file mode 100644 index 00000000..42181435 --- /dev/null +++ b/drivers/input/keyboard/lpc32xx-keys.c @@ -0,0 +1,395 @@ +/* + * NXP LPC32xx SoC Key Scan Interface + * + * Authors: + * Kevin Wells + * Roland Stigge + * + * Copyright (C) 2010 NXP Semiconductors + * Copyright (C) 2012 Roland Stigge + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * This controller supports square key matrices from 1x1 up to 8x8 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "lpc32xx_keys" + +/* + * Key scanner register offsets + */ +#define LPC32XX_KS_DEB(x) ((x) + 0x00) +#define LPC32XX_KS_STATE_COND(x) ((x) + 0x04) +#define LPC32XX_KS_IRQ(x) ((x) + 0x08) +#define LPC32XX_KS_SCAN_CTL(x) ((x) + 0x0C) +#define LPC32XX_KS_FAST_TST(x) ((x) + 0x10) +#define LPC32XX_KS_MATRIX_DIM(x) ((x) + 0x14) /* 1..8 */ +#define LPC32XX_KS_DATA(x, y) ((x) + 0x40 + ((y) << 2)) + +#define LPC32XX_KSCAN_DEB_NUM_DEB_PASS(n) ((n) & 0xFF) + +#define LPC32XX_KSCAN_SCOND_IN_IDLE 0x0 +#define LPC32XX_KSCAN_SCOND_IN_SCANONCE 0x1 +#define LPC32XX_KSCAN_SCOND_IN_IRQGEN 0x2 +#define LPC32XX_KSCAN_SCOND_IN_SCAN_MATRIX 0x3 + +#define LPC32XX_KSCAN_IRQ_PENDING_CLR 0x1 + +#define LPC32XX_KSCAN_SCTRL_SCAN_DELAY(n) ((n) & 0xFF) + +#define LPC32XX_KSCAN_FTST_FORCESCANONCE 0x1 +#define LPC32XX_KSCAN_FTST_USE32K_CLK 0x2 + +#define LPC32XX_KSCAN_MSEL_SELECT(n) ((n) & 0xF) + +struct lpc32xx_kscan_drv { + struct input_dev *input; + struct clk *clk; + struct resource *iores; + void __iomem *kscan_base; + unsigned int irq; + + u32 matrix_sz; /* Size of matrix in XxY, ie. 3 = 3x3 */ + u32 deb_clks; /* Debounce clocks (based on 32KHz clock) */ + u32 scan_delay; /* Scan delay (based on 32KHz clock) */ + + unsigned short *keymap; /* Pointer to key map for the scan matrix */ + unsigned int row_shift; + + u8 lastkeystates[8]; +}; + +static void lpc32xx_mod_states(struct lpc32xx_kscan_drv *kscandat, int col) +{ + struct input_dev *input = kscandat->input; + unsigned row, changed, scancode, keycode; + u8 key; + + key = readl(LPC32XX_KS_DATA(kscandat->kscan_base, col)); + changed = key ^ kscandat->lastkeystates[col]; + kscandat->lastkeystates[col] = key; + + for (row = 0; changed; row++, changed >>= 1) { + if (changed & 1) { + /* Key state changed, signal an event */ + scancode = MATRIX_SCAN_CODE(row, col, + kscandat->row_shift); + keycode = kscandat->keymap[scancode]; + input_event(input, EV_MSC, MSC_SCAN, scancode); + input_report_key(input, keycode, key & (1 << row)); + } + } +} + +static irqreturn_t lpc32xx_kscan_irq(int irq, void *dev_id) +{ + struct lpc32xx_kscan_drv *kscandat = dev_id; + int i; + + for (i = 0; i < kscandat->matrix_sz; i++) + lpc32xx_mod_states(kscandat, i); + + writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); + + input_sync(kscandat->input); + + return IRQ_HANDLED; +} + +static int lpc32xx_kscan_open(struct input_dev *dev) +{ + struct lpc32xx_kscan_drv *kscandat = input_get_drvdata(dev); + int error; + + error = clk_prepare_enable(kscandat->clk); + if (error) + return error; + + writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); + + return 0; +} + +static void lpc32xx_kscan_close(struct input_dev *dev) +{ + struct lpc32xx_kscan_drv *kscandat = input_get_drvdata(dev); + + writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); + clk_disable_unprepare(kscandat->clk); +} + +static int lpc32xx_parse_dt(struct device *dev, + struct lpc32xx_kscan_drv *kscandat) +{ + struct device_node *np = dev->of_node; + u32 rows = 0, columns = 0; + int err; + + err = matrix_keypad_parse_of_params(dev, &rows, &columns); + if (err) + return err; + if (rows != columns) { + dev_err(dev, "rows and columns must be equal!\n"); + return -EINVAL; + } + + kscandat->matrix_sz = rows; + kscandat->row_shift = get_count_order(columns); + + of_property_read_u32(np, "nxp,debounce-delay-ms", &kscandat->deb_clks); + of_property_read_u32(np, "nxp,scan-delay-ms", &kscandat->scan_delay); + if (!kscandat->deb_clks || !kscandat->scan_delay) { + dev_err(dev, "debounce or scan delay not specified\n"); + return -EINVAL; + } + + return 0; +} + +static int lpc32xx_kscan_probe(struct platform_device *pdev) +{ + struct lpc32xx_kscan_drv *kscandat; + struct input_dev *input; + struct resource *res; + size_t keymap_size; + int error; + int irq; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "failed to get platform I/O memory\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0 || irq >= NR_IRQS) { + dev_err(&pdev->dev, "failed to get platform irq\n"); + return -EINVAL; + } + + kscandat = kzalloc(sizeof(struct lpc32xx_kscan_drv), GFP_KERNEL); + if (!kscandat) { + dev_err(&pdev->dev, "failed to allocate memory\n"); + return -ENOMEM; + } + + error = lpc32xx_parse_dt(&pdev->dev, kscandat); + if (error) { + dev_err(&pdev->dev, "failed to parse device tree\n"); + goto err_free_mem; + } + + keymap_size = sizeof(kscandat->keymap[0]) * + (kscandat->matrix_sz << kscandat->row_shift); + kscandat->keymap = kzalloc(keymap_size, GFP_KERNEL); + if (!kscandat->keymap) { + dev_err(&pdev->dev, "could not allocate memory for keymap\n"); + error = -ENOMEM; + goto err_free_mem; + } + + kscandat->input = input = input_allocate_device(); + if (!input) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + error = -ENOMEM; + goto err_free_keymap; + } + + /* Setup key input */ + input->name = pdev->name; + input->phys = "lpc32xx/input0"; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + input->open = lpc32xx_kscan_open; + input->close = lpc32xx_kscan_close; + input->dev.parent = &pdev->dev; + + input_set_capability(input, EV_MSC, MSC_SCAN); + + error = matrix_keypad_build_keymap(NULL, NULL, + kscandat->matrix_sz, + kscandat->matrix_sz, + kscandat->keymap, kscandat->input); + if (error) { + dev_err(&pdev->dev, "failed to build keymap\n"); + goto err_free_input; + } + + input_set_drvdata(kscandat->input, kscandat); + + kscandat->iores = request_mem_region(res->start, resource_size(res), + pdev->name); + if (!kscandat->iores) { + dev_err(&pdev->dev, "failed to request I/O memory\n"); + error = -EBUSY; + goto err_free_input; + } + + kscandat->kscan_base = ioremap(kscandat->iores->start, + resource_size(kscandat->iores)); + if (!kscandat->kscan_base) { + dev_err(&pdev->dev, "failed to remap I/O memory\n"); + error = -EBUSY; + goto err_release_memregion; + } + + /* Get the key scanner clock */ + kscandat->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(kscandat->clk)) { + dev_err(&pdev->dev, "failed to get clock\n"); + error = PTR_ERR(kscandat->clk); + goto err_unmap; + } + + /* Configure the key scanner */ + error = clk_prepare_enable(kscandat->clk); + if (error) + goto err_clk_put; + + writel(kscandat->deb_clks, LPC32XX_KS_DEB(kscandat->kscan_base)); + writel(kscandat->scan_delay, LPC32XX_KS_SCAN_CTL(kscandat->kscan_base)); + writel(LPC32XX_KSCAN_FTST_USE32K_CLK, + LPC32XX_KS_FAST_TST(kscandat->kscan_base)); + writel(kscandat->matrix_sz, + LPC32XX_KS_MATRIX_DIM(kscandat->kscan_base)); + writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); + clk_disable_unprepare(kscandat->clk); + + error = request_irq(irq, lpc32xx_kscan_irq, 0, pdev->name, kscandat); + if (error) { + dev_err(&pdev->dev, "failed to request irq\n"); + goto err_clk_put; + } + + error = input_register_device(kscandat->input); + if (error) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto err_free_irq; + } + + platform_set_drvdata(pdev, kscandat); + return 0; + +err_free_irq: + free_irq(irq, kscandat); +err_clk_put: + clk_put(kscandat->clk); +err_unmap: + iounmap(kscandat->kscan_base); +err_release_memregion: + release_mem_region(kscandat->iores->start, + resource_size(kscandat->iores)); +err_free_input: + input_free_device(kscandat->input); +err_free_keymap: + kfree(kscandat->keymap); +err_free_mem: + kfree(kscandat); + + return error; +} + +static int lpc32xx_kscan_remove(struct platform_device *pdev) +{ + struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); + + free_irq(platform_get_irq(pdev, 0), kscandat); + clk_put(kscandat->clk); + iounmap(kscandat->kscan_base); + release_mem_region(kscandat->iores->start, + resource_size(kscandat->iores)); + input_unregister_device(kscandat->input); + kfree(kscandat->keymap); + kfree(kscandat); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int lpc32xx_kscan_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); + struct input_dev *input = kscandat->input; + + mutex_lock(&input->mutex); + + if (input->users) { + /* Clear IRQ and disable clock */ + writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); + clk_disable_unprepare(kscandat->clk); + } + + mutex_unlock(&input->mutex); + return 0; +} + +static int lpc32xx_kscan_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct lpc32xx_kscan_drv *kscandat = platform_get_drvdata(pdev); + struct input_dev *input = kscandat->input; + int retval = 0; + + mutex_lock(&input->mutex); + + if (input->users) { + /* Enable clock and clear IRQ */ + retval = clk_prepare_enable(kscandat->clk); + if (retval == 0) + writel(1, LPC32XX_KS_IRQ(kscandat->kscan_base)); + } + + mutex_unlock(&input->mutex); + return retval; +} +#endif + +static SIMPLE_DEV_PM_OPS(lpc32xx_kscan_pm_ops, lpc32xx_kscan_suspend, + lpc32xx_kscan_resume); + +static const struct of_device_id lpc32xx_kscan_match[] = { + { .compatible = "nxp,lpc3220-key" }, + {}, +}; +MODULE_DEVICE_TABLE(of, lpc32xx_kscan_match); + +static struct platform_driver lpc32xx_kscan_driver = { + .probe = lpc32xx_kscan_probe, + .remove = lpc32xx_kscan_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + .pm = &lpc32xx_kscan_pm_ops, + .of_match_table = of_match_ptr(lpc32xx_kscan_match), + } +}; + +module_platform_driver(lpc32xx_kscan_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Kevin Wells "); +MODULE_AUTHOR("Roland Stigge "); +MODULE_DESCRIPTION("Key scanner driver for LPC32XX devices"); diff --git a/drivers/input/keyboard/maple_keyb.c b/drivers/input/keyboard/maple_keyb.c new file mode 100644 index 00000000..5aa2361a --- /dev/null +++ b/drivers/input/keyboard/maple_keyb.c @@ -0,0 +1,260 @@ +/* + * SEGA Dreamcast keyboard driver + * Based on drivers/usb/usbkbd.c + * Copyright (c) YAEGASHI Takeshi, 2001 + * Porting to 2.6 Copyright (c) Adrian McMenamin, 2007 - 2009 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see the file COPYING, or write + * to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +/* Very simple mutex to ensure proper cleanup */ +static DEFINE_MUTEX(maple_keyb_mutex); + +#define NR_SCANCODES 256 + +MODULE_AUTHOR("Adrian McMenamin dev; + void *ptr; + int code, keycode; + int i; + + for (i = 0; i < 8; i++) { + code = i + 224; + keycode = kbd->keycode[code]; + input_event(dev, EV_MSC, MSC_SCAN, code); + input_report_key(dev, keycode, (kbd->new[0] >> i) & 1); + } + + for (i = 2; i < 8; i++) { + ptr = memchr(kbd->new + 2, kbd->old[i], 6); + code = kbd->old[i]; + if (code > 3 && ptr == NULL) { + keycode = kbd->keycode[code]; + if (keycode) { + input_event(dev, EV_MSC, MSC_SCAN, code); + input_report_key(dev, keycode, 0); + } else + dev_dbg(&dev->dev, + "Unknown key (scancode %#x) released.", + code); + } + ptr = memchr(kbd->old + 2, kbd->new[i], 6); + code = kbd->new[i]; + if (code > 3 && ptr) { + keycode = kbd->keycode[code]; + if (keycode) { + input_event(dev, EV_MSC, MSC_SCAN, code); + input_report_key(dev, keycode, 1); + } else + dev_dbg(&dev->dev, + "Unknown key (scancode %#x) pressed.", + code); + } + } + input_sync(dev); + memcpy(kbd->old, kbd->new, 8); +} + +static void dc_kbd_callback(struct mapleq *mq) +{ + struct maple_device *mapledev = mq->dev; + struct dc_kbd *kbd = maple_get_drvdata(mapledev); + unsigned long *buf = (unsigned long *)(mq->recvbuf->buf); + + /* + * We should always get the lock because the only + * time it may be locked is if the driver is in the cleanup phase. + */ + if (likely(mutex_trylock(&maple_keyb_mutex))) { + + if (buf[1] == mapledev->function) { + memcpy(kbd->new, buf + 2, 8); + dc_scan_kbd(kbd); + } + + mutex_unlock(&maple_keyb_mutex); + } +} + +static int probe_maple_kbd(struct device *dev) +{ + struct maple_device *mdev; + struct maple_driver *mdrv; + int i, error; + struct dc_kbd *kbd; + struct input_dev *idev; + + mdev = to_maple_dev(dev); + mdrv = to_maple_driver(dev->driver); + + kbd = kzalloc(sizeof(struct dc_kbd), GFP_KERNEL); + if (!kbd) { + error = -ENOMEM; + goto fail; + } + + idev = input_allocate_device(); + if (!idev) { + error = -ENOMEM; + goto fail_idev_alloc; + } + + kbd->dev = idev; + memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode)); + + idev->name = mdev->product_name; + idev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + idev->keycode = kbd->keycode; + idev->keycodesize = sizeof(unsigned short); + idev->keycodemax = ARRAY_SIZE(kbd->keycode); + idev->id.bustype = BUS_HOST; + idev->dev.parent = &mdev->dev; + + for (i = 0; i < NR_SCANCODES; i++) + __set_bit(dc_kbd_keycode[i], idev->keybit); + __clear_bit(KEY_RESERVED, idev->keybit); + + input_set_capability(idev, EV_MSC, MSC_SCAN); + input_set_drvdata(idev, kbd); + + error = input_register_device(idev); + if (error) + goto fail_register; + + /* Maple polling is locked to VBLANK - which may be just 50/s */ + maple_getcond_callback(mdev, dc_kbd_callback, HZ/50, + MAPLE_FUNC_KEYBOARD); + + mdev->driver = mdrv; + + maple_set_drvdata(mdev, kbd); + + return error; + +fail_register: + maple_set_drvdata(mdev, NULL); + input_free_device(idev); +fail_idev_alloc: + kfree(kbd); +fail: + return error; +} + +static int remove_maple_kbd(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct dc_kbd *kbd = maple_get_drvdata(mdev); + + mutex_lock(&maple_keyb_mutex); + + input_unregister_device(kbd->dev); + kfree(kbd); + + maple_set_drvdata(mdev, NULL); + + mutex_unlock(&maple_keyb_mutex); + return 0; +} + +static struct maple_driver dc_kbd_driver = { + .function = MAPLE_FUNC_KEYBOARD, + .drv = { + .name = "Dreamcast_keyboard", + .probe = probe_maple_kbd, + .remove = remove_maple_kbd, + }, +}; + +static int __init dc_kbd_init(void) +{ + return maple_driver_register(&dc_kbd_driver); +} + +static void __exit dc_kbd_exit(void) +{ + maple_driver_unregister(&dc_kbd_driver); +} + +module_init(dc_kbd_init); +module_exit(dc_kbd_exit); diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c new file mode 100644 index 00000000..71d77192 --- /dev/null +++ b/drivers/input/keyboard/matrix_keypad.c @@ -0,0 +1,580 @@ +/* + * GPIO driven matrix keyboard driver + * + * Copyright (c) 2008 Marek Vasut + * + * Based on corgikbd.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct matrix_keypad { + const struct matrix_keypad_platform_data *pdata; + struct input_dev *input_dev; + unsigned int row_shift; + + DECLARE_BITMAP(disabled_gpios, MATRIX_MAX_ROWS); + + uint32_t last_key_state[MATRIX_MAX_COLS]; + struct delayed_work work; + spinlock_t lock; + bool scan_pending; + bool stopped; + bool gpio_all_disabled; +}; + +/* + * NOTE: normally the GPIO has to be put into HiZ when de-activated to cause + * minmal side effect when scanning other columns, here it is configured to + * be input, and it should work on most platforms. + */ +static void __activate_col(const struct matrix_keypad_platform_data *pdata, + int col, bool on) +{ + bool level_on = !pdata->active_low; + + if (on) { + gpio_direction_output(pdata->col_gpios[col], level_on); + } else { + gpio_set_value_cansleep(pdata->col_gpios[col], !level_on); + gpio_direction_input(pdata->col_gpios[col]); + } +} + +static void activate_col(const struct matrix_keypad_platform_data *pdata, + int col, bool on) +{ + __activate_col(pdata, col, on); + + if (on && pdata->col_scan_delay_us) + udelay(pdata->col_scan_delay_us); +} + +static void activate_all_cols(const struct matrix_keypad_platform_data *pdata, + bool on) +{ + int col; + + for (col = 0; col < pdata->num_col_gpios; col++) + __activate_col(pdata, col, on); +} + +static bool row_asserted(const struct matrix_keypad_platform_data *pdata, + int row) +{ + return gpio_get_value_cansleep(pdata->row_gpios[row]) ? + !pdata->active_low : pdata->active_low; +} + +static void enable_row_irqs(struct matrix_keypad *keypad) +{ + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + if (pdata->clustered_irq > 0) + enable_irq(pdata->clustered_irq); + else { + for (i = 0; i < pdata->num_row_gpios; i++) + enable_irq(gpio_to_irq(pdata->row_gpios[i])); + } +} + +static void disable_row_irqs(struct matrix_keypad *keypad) +{ + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + if (pdata->clustered_irq > 0) + disable_irq_nosync(pdata->clustered_irq); + else { + for (i = 0; i < pdata->num_row_gpios; i++) + disable_irq_nosync(gpio_to_irq(pdata->row_gpios[i])); + } +} + +/* + * This gets the keys from keyboard and reports it to input subsystem + */ +static void matrix_keypad_scan(struct work_struct *work) +{ + struct matrix_keypad *keypad = + container_of(work, struct matrix_keypad, work.work); + struct input_dev *input_dev = keypad->input_dev; + const unsigned short *keycodes = input_dev->keycode; + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + uint32_t new_state[MATRIX_MAX_COLS]; + int row, col, code; + + /* de-activate all columns for scanning */ + activate_all_cols(pdata, false); + + memset(new_state, 0, sizeof(new_state)); + + /* assert each column and read the row status out */ + for (col = 0; col < pdata->num_col_gpios; col++) { + + activate_col(pdata, col, true); + + for (row = 0; row < pdata->num_row_gpios; row++) + new_state[col] |= + row_asserted(pdata, row) ? (1 << row) : 0; + + activate_col(pdata, col, false); + } + + for (col = 0; col < pdata->num_col_gpios; col++) { + uint32_t bits_changed; + + bits_changed = keypad->last_key_state[col] ^ new_state[col]; + if (bits_changed == 0) + continue; + + for (row = 0; row < pdata->num_row_gpios; row++) { + if ((bits_changed & (1 << row)) == 0) + continue; + + code = MATRIX_SCAN_CODE(row, col, keypad->row_shift); + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, + keycodes[code], + new_state[col] & (1 << row)); + } + } + input_sync(input_dev); + + memcpy(keypad->last_key_state, new_state, sizeof(new_state)); + + activate_all_cols(pdata, true); + + /* Enable IRQs again */ + spin_lock_irq(&keypad->lock); + keypad->scan_pending = false; + enable_row_irqs(keypad); + spin_unlock_irq(&keypad->lock); +} + +static irqreturn_t matrix_keypad_interrupt(int irq, void *id) +{ + struct matrix_keypad *keypad = id; + unsigned long flags; + + spin_lock_irqsave(&keypad->lock, flags); + + /* + * See if another IRQ beaten us to it and scheduled the + * scan already. In that case we should not try to + * disable IRQs again. + */ + if (unlikely(keypad->scan_pending || keypad->stopped)) + goto out; + + disable_row_irqs(keypad); + keypad->scan_pending = true; + schedule_delayed_work(&keypad->work, + msecs_to_jiffies(keypad->pdata->debounce_ms)); + +out: + spin_unlock_irqrestore(&keypad->lock, flags); + return IRQ_HANDLED; +} + +static int matrix_keypad_start(struct input_dev *dev) +{ + struct matrix_keypad *keypad = input_get_drvdata(dev); + + keypad->stopped = false; + mb(); + + /* + * Schedule an immediate key scan to capture current key state; + * columns will be activated and IRQs be enabled after the scan. + */ + schedule_delayed_work(&keypad->work, 0); + + return 0; +} + +static void matrix_keypad_stop(struct input_dev *dev) +{ + struct matrix_keypad *keypad = input_get_drvdata(dev); + + keypad->stopped = true; + mb(); + flush_work(&keypad->work.work); + /* + * matrix_keypad_scan() will leave IRQs enabled; + * we should disable them now. + */ + disable_row_irqs(keypad); +} + +#ifdef CONFIG_PM_SLEEP +static void matrix_keypad_enable_wakeup(struct matrix_keypad *keypad) +{ + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + unsigned int gpio; + int i; + + if (pdata->clustered_irq > 0) { + if (enable_irq_wake(pdata->clustered_irq) == 0) + keypad->gpio_all_disabled = true; + } else { + + for (i = 0; i < pdata->num_row_gpios; i++) { + if (!test_bit(i, keypad->disabled_gpios)) { + gpio = pdata->row_gpios[i]; + + if (enable_irq_wake(gpio_to_irq(gpio)) == 0) + __set_bit(i, keypad->disabled_gpios); + } + } + } +} + +static void matrix_keypad_disable_wakeup(struct matrix_keypad *keypad) +{ + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + unsigned int gpio; + int i; + + if (pdata->clustered_irq > 0) { + if (keypad->gpio_all_disabled) { + disable_irq_wake(pdata->clustered_irq); + keypad->gpio_all_disabled = false; + } + } else { + for (i = 0; i < pdata->num_row_gpios; i++) { + if (test_and_clear_bit(i, keypad->disabled_gpios)) { + gpio = pdata->row_gpios[i]; + disable_irq_wake(gpio_to_irq(gpio)); + } + } + } +} + +static int matrix_keypad_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct matrix_keypad *keypad = platform_get_drvdata(pdev); + + matrix_keypad_stop(keypad->input_dev); + + if (device_may_wakeup(&pdev->dev)) + matrix_keypad_enable_wakeup(keypad); + + return 0; +} + +static int matrix_keypad_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct matrix_keypad *keypad = platform_get_drvdata(pdev); + + if (device_may_wakeup(&pdev->dev)) + matrix_keypad_disable_wakeup(keypad); + + matrix_keypad_start(keypad->input_dev); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(matrix_keypad_pm_ops, + matrix_keypad_suspend, matrix_keypad_resume); + +static int matrix_keypad_init_gpio(struct platform_device *pdev, + struct matrix_keypad *keypad) +{ + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i, err; + + /* initialized strobe lines as outputs, activated */ + for (i = 0; i < pdata->num_col_gpios; i++) { + err = gpio_request(pdata->col_gpios[i], "matrix_kbd_col"); + if (err) { + dev_err(&pdev->dev, + "failed to request GPIO%d for COL%d\n", + pdata->col_gpios[i], i); + goto err_free_cols; + } + + gpio_direction_output(pdata->col_gpios[i], !pdata->active_low); + } + + for (i = 0; i < pdata->num_row_gpios; i++) { + err = gpio_request(pdata->row_gpios[i], "matrix_kbd_row"); + if (err) { + dev_err(&pdev->dev, + "failed to request GPIO%d for ROW%d\n", + pdata->row_gpios[i], i); + goto err_free_rows; + } + + gpio_direction_input(pdata->row_gpios[i]); + } + + if (pdata->clustered_irq > 0) { + err = request_irq(pdata->clustered_irq, + matrix_keypad_interrupt, + pdata->clustered_irq_flags, + "matrix-keypad", keypad); + if (err) { + dev_err(&pdev->dev, + "Unable to acquire clustered interrupt\n"); + goto err_free_rows; + } + } else { + for (i = 0; i < pdata->num_row_gpios; i++) { + err = request_irq(gpio_to_irq(pdata->row_gpios[i]), + matrix_keypad_interrupt, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING, + "matrix-keypad", keypad); + if (err) { + dev_err(&pdev->dev, + "Unable to acquire interrupt for GPIO line %i\n", + pdata->row_gpios[i]); + goto err_free_irqs; + } + } + } + + /* initialized as disabled - enabled by input->open */ + disable_row_irqs(keypad); + return 0; + +err_free_irqs: + while (--i >= 0) + free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); + i = pdata->num_row_gpios; +err_free_rows: + while (--i >= 0) + gpio_free(pdata->row_gpios[i]); + i = pdata->num_col_gpios; +err_free_cols: + while (--i >= 0) + gpio_free(pdata->col_gpios[i]); + + return err; +} + +static void matrix_keypad_free_gpio(struct matrix_keypad *keypad) +{ + const struct matrix_keypad_platform_data *pdata = keypad->pdata; + int i; + + if (pdata->clustered_irq > 0) { + free_irq(pdata->clustered_irq, keypad); + } else { + for (i = 0; i < pdata->num_row_gpios; i++) + free_irq(gpio_to_irq(pdata->row_gpios[i]), keypad); + } + + for (i = 0; i < pdata->num_row_gpios; i++) + gpio_free(pdata->row_gpios[i]); + + for (i = 0; i < pdata->num_col_gpios; i++) + gpio_free(pdata->col_gpios[i]); +} + +#ifdef CONFIG_OF +static struct matrix_keypad_platform_data * +matrix_keypad_parse_dt(struct device *dev) +{ + struct matrix_keypad_platform_data *pdata; + struct device_node *np = dev->of_node; + unsigned int *gpios; + int i, nrow, ncol; + + if (!np) { + dev_err(dev, "device lacks DT data\n"); + return ERR_PTR(-ENODEV); + } + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "could not allocate memory for platform data\n"); + return ERR_PTR(-ENOMEM); + } + + pdata->num_row_gpios = nrow = of_gpio_named_count(np, "row-gpios"); + pdata->num_col_gpios = ncol = of_gpio_named_count(np, "col-gpios"); + if (nrow <= 0 || ncol <= 0) { + dev_err(dev, "number of keypad rows/columns not specified\n"); + return ERR_PTR(-EINVAL); + } + + if (of_get_property(np, "linux,no-autorepeat", NULL)) + pdata->no_autorepeat = true; + if (of_get_property(np, "linux,wakeup", NULL)) + pdata->wakeup = true; + if (of_get_property(np, "gpio-activelow", NULL)) + pdata->active_low = true; + + of_property_read_u32(np, "debounce-delay-ms", &pdata->debounce_ms); + of_property_read_u32(np, "col-scan-delay-us", + &pdata->col_scan_delay_us); + + gpios = devm_kzalloc(dev, + sizeof(unsigned int) * + (pdata->num_row_gpios + pdata->num_col_gpios), + GFP_KERNEL); + if (!gpios) { + dev_err(dev, "could not allocate memory for gpios\n"); + return ERR_PTR(-ENOMEM); + } + + for (i = 0; i < pdata->num_row_gpios; i++) + gpios[i] = of_get_named_gpio(np, "row-gpios", i); + + for (i = 0; i < pdata->num_col_gpios; i++) + gpios[pdata->num_row_gpios + i] = + of_get_named_gpio(np, "col-gpios", i); + + pdata->row_gpios = gpios; + pdata->col_gpios = &gpios[pdata->num_row_gpios]; + + return pdata; +} +#else +static inline struct matrix_keypad_platform_data * +matrix_keypad_parse_dt(struct device *dev) +{ + dev_err(dev, "no platform data defined\n"); + + return ERR_PTR(-EINVAL); +} +#endif + +static int matrix_keypad_probe(struct platform_device *pdev) +{ + const struct matrix_keypad_platform_data *pdata; + struct matrix_keypad *keypad; + struct input_dev *input_dev; + int err; + + pdata = dev_get_platdata(&pdev->dev); + if (!pdata) { + pdata = matrix_keypad_parse_dt(&pdev->dev); + if (IS_ERR(pdata)) { + dev_err(&pdev->dev, "no platform data defined\n"); + return PTR_ERR(pdata); + } + } else if (!pdata->keymap_data) { + dev_err(&pdev->dev, "no keymap data defined\n"); + return -EINVAL; + } + + keypad = kzalloc(sizeof(struct matrix_keypad), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!keypad || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + keypad->input_dev = input_dev; + keypad->pdata = pdata; + keypad->row_shift = get_count_order(pdata->num_col_gpios); + keypad->stopped = true; + INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan); + spin_lock_init(&keypad->lock); + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + input_dev->open = matrix_keypad_start; + input_dev->close = matrix_keypad_stop; + + err = matrix_keypad_build_keymap(pdata->keymap_data, NULL, + pdata->num_row_gpios, + pdata->num_col_gpios, + NULL, input_dev); + if (err) { + dev_err(&pdev->dev, "failed to build keymap\n"); + goto err_free_mem; + } + + if (!pdata->no_autorepeat) + __set_bit(EV_REP, input_dev->evbit); + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + input_set_drvdata(input_dev, keypad); + + err = matrix_keypad_init_gpio(pdev, keypad); + if (err) + goto err_free_mem; + + err = input_register_device(keypad->input_dev); + if (err) + goto err_free_gpio; + + device_init_wakeup(&pdev->dev, pdata->wakeup); + platform_set_drvdata(pdev, keypad); + + return 0; + +err_free_gpio: + matrix_keypad_free_gpio(keypad); +err_free_mem: + input_free_device(input_dev); + kfree(keypad); + return err; +} + +static int matrix_keypad_remove(struct platform_device *pdev) +{ + struct matrix_keypad *keypad = platform_get_drvdata(pdev); + + device_init_wakeup(&pdev->dev, 0); + + matrix_keypad_free_gpio(keypad); + input_unregister_device(keypad->input_dev); + kfree(keypad); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id matrix_keypad_dt_match[] = { + { .compatible = "gpio-matrix-keypad" }, + { } +}; +MODULE_DEVICE_TABLE(of, matrix_keypad_dt_match); +#endif + +static struct platform_driver matrix_keypad_driver = { + .probe = matrix_keypad_probe, + .remove = matrix_keypad_remove, + .driver = { + .name = "matrix-keypad", + .owner = THIS_MODULE, + .pm = &matrix_keypad_pm_ops, + .of_match_table = of_match_ptr(matrix_keypad_dt_match), + }, +}; +module_platform_driver(matrix_keypad_driver); + +MODULE_AUTHOR("Marek Vasut "); +MODULE_DESCRIPTION("GPIO Driven Matrix Keypad Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:matrix-keypad"); diff --git a/drivers/input/keyboard/max7359_keypad.c b/drivers/input/keyboard/max7359_keypad.c new file mode 100644 index 00000000..7c7af2b0 --- /dev/null +++ b/drivers/input/keyboard/max7359_keypad.c @@ -0,0 +1,323 @@ +/* + * max7359_keypad.c - MAX7359 Key Switch Controller Driver + * + * Copyright (C) 2009 Samsung Electronics + * Kim Kyuwon + * + * Based on pxa27x_keypad.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Datasheet: http://www.maxim-ic.com/quick_view2.cfm/qv_pk/5456 + */ + +#include +#include +#include +#include +#include +#include +#include + +#define MAX7359_MAX_KEY_ROWS 8 +#define MAX7359_MAX_KEY_COLS 8 +#define MAX7359_MAX_KEY_NUM (MAX7359_MAX_KEY_ROWS * MAX7359_MAX_KEY_COLS) +#define MAX7359_ROW_SHIFT 3 + +/* + * MAX7359 registers + */ +#define MAX7359_REG_KEYFIFO 0x00 +#define MAX7359_REG_CONFIG 0x01 +#define MAX7359_REG_DEBOUNCE 0x02 +#define MAX7359_REG_INTERRUPT 0x03 +#define MAX7359_REG_PORTS 0x04 +#define MAX7359_REG_KEYREP 0x05 +#define MAX7359_REG_SLEEP 0x06 + +/* + * Configuration register bits + */ +#define MAX7359_CFG_SLEEP (1 << 7) +#define MAX7359_CFG_INTERRUPT (1 << 5) +#define MAX7359_CFG_KEY_RELEASE (1 << 3) +#define MAX7359_CFG_WAKEUP (1 << 1) +#define MAX7359_CFG_TIMEOUT (1 << 0) + +/* + * Autosleep register values (ms) + */ +#define MAX7359_AUTOSLEEP_8192 0x01 +#define MAX7359_AUTOSLEEP_4096 0x02 +#define MAX7359_AUTOSLEEP_2048 0x03 +#define MAX7359_AUTOSLEEP_1024 0x04 +#define MAX7359_AUTOSLEEP_512 0x05 +#define MAX7359_AUTOSLEEP_256 0x06 + +struct max7359_keypad { + /* matrix key code map */ + unsigned short keycodes[MAX7359_MAX_KEY_NUM]; + + struct input_dev *input_dev; + struct i2c_client *client; +}; + +static int max7359_write_reg(struct i2c_client *client, u8 reg, u8 val) +{ + int ret = i2c_smbus_write_byte_data(client, reg, val); + + if (ret < 0) + dev_err(&client->dev, "%s: reg 0x%x, val 0x%x, err %d\n", + __func__, reg, val, ret); + return ret; +} + +static int max7359_read_reg(struct i2c_client *client, int reg) +{ + int ret = i2c_smbus_read_byte_data(client, reg); + + if (ret < 0) + dev_err(&client->dev, "%s: reg 0x%x, err %d\n", + __func__, reg, ret); + return ret; +} + +static void max7359_build_keycode(struct max7359_keypad *keypad, + const struct matrix_keymap_data *keymap_data) +{ + struct input_dev *input_dev = keypad->input_dev; + int i; + + for (i = 0; i < keymap_data->keymap_size; i++) { + unsigned int key = keymap_data->keymap[i]; + unsigned int row = KEY_ROW(key); + unsigned int col = KEY_COL(key); + unsigned int scancode = MATRIX_SCAN_CODE(row, col, + MAX7359_ROW_SHIFT); + unsigned short keycode = KEY_VAL(key); + + keypad->keycodes[scancode] = keycode; + __set_bit(keycode, input_dev->keybit); + } + __clear_bit(KEY_RESERVED, input_dev->keybit); +} + +/* runs in an IRQ thread -- can (and will!) sleep */ +static irqreturn_t max7359_interrupt(int irq, void *dev_id) +{ + struct max7359_keypad *keypad = dev_id; + struct input_dev *input_dev = keypad->input_dev; + int val, row, col, release, code; + + val = max7359_read_reg(keypad->client, MAX7359_REG_KEYFIFO); + row = val & 0x7; + col = (val >> 3) & 0x7; + release = val & 0x40; + + code = MATRIX_SCAN_CODE(row, col, MAX7359_ROW_SHIFT); + + dev_dbg(&keypad->client->dev, + "key[%d:%d] %s\n", row, col, release ? "release" : "press"); + + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, keypad->keycodes[code], !release); + input_sync(input_dev); + + return IRQ_HANDLED; +} + +/* + * Let MAX7359 fall into a deep sleep: + * If no keys are pressed, enter sleep mode for 8192 ms. And if any + * key is pressed, the MAX7359 returns to normal operating mode. + */ +static inline void max7359_fall_deepsleep(struct i2c_client *client) +{ + max7359_write_reg(client, MAX7359_REG_SLEEP, MAX7359_AUTOSLEEP_8192); +} + +/* + * Let MAX7359 take a catnap: + * Autosleep just for 256 ms. + */ +static inline void max7359_take_catnap(struct i2c_client *client) +{ + max7359_write_reg(client, MAX7359_REG_SLEEP, MAX7359_AUTOSLEEP_256); +} + +static int max7359_open(struct input_dev *dev) +{ + struct max7359_keypad *keypad = input_get_drvdata(dev); + + max7359_take_catnap(keypad->client); + + return 0; +} + +static void max7359_close(struct input_dev *dev) +{ + struct max7359_keypad *keypad = input_get_drvdata(dev); + + max7359_fall_deepsleep(keypad->client); +} + +static void max7359_initialize(struct i2c_client *client) +{ + max7359_write_reg(client, MAX7359_REG_CONFIG, + MAX7359_CFG_INTERRUPT | /* Irq clears after host read */ + MAX7359_CFG_KEY_RELEASE | /* Key release enable */ + MAX7359_CFG_WAKEUP); /* Key press wakeup enable */ + + /* Full key-scan functionality */ + max7359_write_reg(client, MAX7359_REG_DEBOUNCE, 0x1F); + + /* nINT asserts every debounce cycles */ + max7359_write_reg(client, MAX7359_REG_INTERRUPT, 0x01); + + max7359_fall_deepsleep(client); +} + +static int max7359_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct matrix_keymap_data *keymap_data = client->dev.platform_data; + struct max7359_keypad *keypad; + struct input_dev *input_dev; + int ret; + int error; + + if (!client->irq) { + dev_err(&client->dev, "The irq number should not be zero\n"); + return -EINVAL; + } + + /* Detect MAX7359: The initial Keys FIFO value is '0x3F' */ + ret = max7359_read_reg(client, MAX7359_REG_KEYFIFO); + if (ret < 0) { + dev_err(&client->dev, "failed to detect device\n"); + return -ENODEV; + } + + dev_dbg(&client->dev, "keys FIFO is 0x%02x\n", ret); + + keypad = kzalloc(sizeof(struct max7359_keypad), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!keypad || !input_dev) { + dev_err(&client->dev, "failed to allocate memory\n"); + error = -ENOMEM; + goto failed_free_mem; + } + + keypad->client = client; + keypad->input_dev = input_dev; + + input_dev->name = client->name; + input_dev->id.bustype = BUS_I2C; + input_dev->open = max7359_open; + input_dev->close = max7359_close; + input_dev->dev.parent = &client->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_dev->keycodesize = sizeof(keypad->keycodes[0]); + input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); + input_dev->keycode = keypad->keycodes; + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + input_set_drvdata(input_dev, keypad); + + max7359_build_keycode(keypad, keymap_data); + + error = request_threaded_irq(client->irq, NULL, max7359_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + client->name, keypad); + if (error) { + dev_err(&client->dev, "failed to register interrupt\n"); + goto failed_free_mem; + } + + /* Register the input device */ + error = input_register_device(input_dev); + if (error) { + dev_err(&client->dev, "failed to register input device\n"); + goto failed_free_irq; + } + + /* Initialize MAX7359 */ + max7359_initialize(client); + + i2c_set_clientdata(client, keypad); + device_init_wakeup(&client->dev, 1); + + return 0; + +failed_free_irq: + free_irq(client->irq, keypad); +failed_free_mem: + input_free_device(input_dev); + kfree(keypad); + return error; +} + +static int max7359_remove(struct i2c_client *client) +{ + struct max7359_keypad *keypad = i2c_get_clientdata(client); + + free_irq(client->irq, keypad); + input_unregister_device(keypad->input_dev); + kfree(keypad); + + return 0; +} + +#ifdef CONFIG_PM +static int max7359_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + max7359_fall_deepsleep(client); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int max7359_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + /* Restore the default setting */ + max7359_take_catnap(client); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(max7359_pm, max7359_suspend, max7359_resume); + +static const struct i2c_device_id max7359_ids[] = { + { "max7359", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, max7359_ids); + +static struct i2c_driver max7359_i2c_driver = { + .driver = { + .name = "max7359", + .pm = &max7359_pm, + }, + .probe = max7359_probe, + .remove = max7359_remove, + .id_table = max7359_ids, +}; + +module_i2c_driver(max7359_i2c_driver); + +MODULE_AUTHOR("Kim Kyuwon "); +MODULE_DESCRIPTION("MAX7359 Key Switch Controller Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/keyboard/mcs_touchkey.c b/drivers/input/keyboard/mcs_touchkey.c new file mode 100644 index 00000000..7c236f9c --- /dev/null +++ b/drivers/input/keyboard/mcs_touchkey.c @@ -0,0 +1,284 @@ +/* + * Touchkey driver for MELFAS MCS5000/5080 controller + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: HeungJun Kim + * Author: Joonyoung Shim + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* MCS5000 Touchkey */ +#define MCS5000_TOUCHKEY_STATUS 0x04 +#define MCS5000_TOUCHKEY_STATUS_PRESS 7 +#define MCS5000_TOUCHKEY_FW 0x0a +#define MCS5000_TOUCHKEY_BASE_VAL 0x61 + +/* MCS5080 Touchkey */ +#define MCS5080_TOUCHKEY_STATUS 0x00 +#define MCS5080_TOUCHKEY_STATUS_PRESS 3 +#define MCS5080_TOUCHKEY_FW 0x01 +#define MCS5080_TOUCHKEY_BASE_VAL 0x1 + +enum mcs_touchkey_type { + MCS5000_TOUCHKEY, + MCS5080_TOUCHKEY, +}; + +struct mcs_touchkey_chip { + unsigned int status_reg; + unsigned int pressbit; + unsigned int press_invert; + unsigned int baseval; +}; + +struct mcs_touchkey_data { + void (*poweron)(bool); + + struct i2c_client *client; + struct input_dev *input_dev; + struct mcs_touchkey_chip chip; + unsigned int key_code; + unsigned int key_val; + unsigned short keycodes[]; +}; + +static irqreturn_t mcs_touchkey_interrupt(int irq, void *dev_id) +{ + struct mcs_touchkey_data *data = dev_id; + struct mcs_touchkey_chip *chip = &data->chip; + struct i2c_client *client = data->client; + struct input_dev *input = data->input_dev; + unsigned int key_val; + unsigned int pressed; + int val; + + val = i2c_smbus_read_byte_data(client, chip->status_reg); + if (val < 0) { + dev_err(&client->dev, "i2c read error [%d]\n", val); + goto out; + } + + pressed = (val & (1 << chip->pressbit)) >> chip->pressbit; + if (chip->press_invert) + pressed ^= chip->press_invert; + + /* key_val is 0 when released, so we should use key_val of press. */ + if (pressed) { + key_val = val & (0xff >> (8 - chip->pressbit)); + if (!key_val) + goto out; + key_val -= chip->baseval; + data->key_code = data->keycodes[key_val]; + data->key_val = key_val; + } + + input_event(input, EV_MSC, MSC_SCAN, data->key_val); + input_report_key(input, data->key_code, pressed); + input_sync(input); + + dev_dbg(&client->dev, "key %d %d %s\n", data->key_val, data->key_code, + pressed ? "pressed" : "released"); + + out: + return IRQ_HANDLED; +} + +static int mcs_touchkey_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct mcs_platform_data *pdata; + struct mcs_touchkey_data *data; + struct input_dev *input_dev; + unsigned int fw_reg; + int fw_ver; + int error; + int i; + + pdata = client->dev.platform_data; + if (!pdata) { + dev_err(&client->dev, "no platform data defined\n"); + return -EINVAL; + } + + data = kzalloc(sizeof(struct mcs_touchkey_data) + + sizeof(data->keycodes[0]) * (pdata->key_maxval + 1), + GFP_KERNEL); + input_dev = input_allocate_device(); + if (!data || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + data->client = client; + data->input_dev = input_dev; + + if (id->driver_data == MCS5000_TOUCHKEY) { + data->chip.status_reg = MCS5000_TOUCHKEY_STATUS; + data->chip.pressbit = MCS5000_TOUCHKEY_STATUS_PRESS; + data->chip.baseval = MCS5000_TOUCHKEY_BASE_VAL; + fw_reg = MCS5000_TOUCHKEY_FW; + } else { + data->chip.status_reg = MCS5080_TOUCHKEY_STATUS; + data->chip.pressbit = MCS5080_TOUCHKEY_STATUS_PRESS; + data->chip.press_invert = 1; + data->chip.baseval = MCS5080_TOUCHKEY_BASE_VAL; + fw_reg = MCS5080_TOUCHKEY_FW; + } + + fw_ver = i2c_smbus_read_byte_data(client, fw_reg); + if (fw_ver < 0) { + error = fw_ver; + dev_err(&client->dev, "i2c read error[%d]\n", error); + goto err_free_mem; + } + dev_info(&client->dev, "Firmware version: %d\n", fw_ver); + + input_dev->name = "MELPAS MCS Touchkey"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY); + if (!pdata->no_autorepeat) + input_dev->evbit[0] |= BIT_MASK(EV_REP); + input_dev->keycode = data->keycodes; + input_dev->keycodesize = sizeof(data->keycodes[0]); + input_dev->keycodemax = pdata->key_maxval + 1; + + for (i = 0; i < pdata->keymap_size; i++) { + unsigned int val = MCS_KEY_VAL(pdata->keymap[i]); + unsigned int code = MCS_KEY_CODE(pdata->keymap[i]); + + data->keycodes[val] = code; + __set_bit(code, input_dev->keybit); + } + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + input_set_drvdata(input_dev, data); + + if (pdata->cfg_pin) + pdata->cfg_pin(); + + if (pdata->poweron) { + data->poweron = pdata->poweron; + data->poweron(true); + } + + error = request_threaded_irq(client->irq, NULL, mcs_touchkey_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, data); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_mem; + } + + error = input_register_device(input_dev); + if (error) + goto err_free_irq; + + i2c_set_clientdata(client, data); + return 0; + +err_free_irq: + free_irq(client->irq, data); +err_free_mem: + input_free_device(input_dev); + kfree(data); + return error; +} + +static int mcs_touchkey_remove(struct i2c_client *client) +{ + struct mcs_touchkey_data *data = i2c_get_clientdata(client); + + free_irq(client->irq, data); + if (data->poweron) + data->poweron(false); + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + +static void mcs_touchkey_shutdown(struct i2c_client *client) +{ + struct mcs_touchkey_data *data = i2c_get_clientdata(client); + + if (data->poweron) + data->poweron(false); +} + +#ifdef CONFIG_PM_SLEEP +static int mcs_touchkey_suspend(struct device *dev) +{ + struct mcs_touchkey_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + + /* Disable the work */ + disable_irq(client->irq); + + /* Finally turn off the power */ + if (data->poweron) + data->poweron(false); + + return 0; +} + +static int mcs_touchkey_resume(struct device *dev) +{ + struct mcs_touchkey_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + + /* Enable the device first */ + if (data->poweron) + data->poweron(true); + + /* Enable irq again */ + enable_irq(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(mcs_touchkey_pm_ops, + mcs_touchkey_suspend, mcs_touchkey_resume); + +static const struct i2c_device_id mcs_touchkey_id[] = { + { "mcs5000_touchkey", MCS5000_TOUCHKEY }, + { "mcs5080_touchkey", MCS5080_TOUCHKEY }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mcs_touchkey_id); + +static struct i2c_driver mcs_touchkey_driver = { + .driver = { + .name = "mcs_touchkey", + .owner = THIS_MODULE, + .pm = &mcs_touchkey_pm_ops, + }, + .probe = mcs_touchkey_probe, + .remove = mcs_touchkey_remove, + .shutdown = mcs_touchkey_shutdown, + .id_table = mcs_touchkey_id, +}; + +module_i2c_driver(mcs_touchkey_driver); + +/* Module information */ +MODULE_AUTHOR("Joonyoung Shim "); +MODULE_AUTHOR("HeungJun Kim "); +MODULE_DESCRIPTION("Touchkey driver for MELFAS MCS5000/5080 controller"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/mpr121_touchkey.c b/drivers/input/keyboard/mpr121_touchkey.c new file mode 100644 index 00000000..f7f3e9a9 --- /dev/null +++ b/drivers/input/keyboard/mpr121_touchkey.c @@ -0,0 +1,337 @@ +/* + * Touchkey driver for Freescale MPR121 Controllor + * + * Copyright (C) 2011 Freescale Semiconductor, Inc. + * Author: Zhang Jiejing + * + * Based on mcs_touchkey.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Register definitions */ +#define ELE_TOUCH_STATUS_0_ADDR 0x0 +#define ELE_TOUCH_STATUS_1_ADDR 0X1 +#define MHD_RISING_ADDR 0x2b +#define NHD_RISING_ADDR 0x2c +#define NCL_RISING_ADDR 0x2d +#define FDL_RISING_ADDR 0x2e +#define MHD_FALLING_ADDR 0x2f +#define NHD_FALLING_ADDR 0x30 +#define NCL_FALLING_ADDR 0x31 +#define FDL_FALLING_ADDR 0x32 +#define ELE0_TOUCH_THRESHOLD_ADDR 0x41 +#define ELE0_RELEASE_THRESHOLD_ADDR 0x42 +#define AFE_CONF_ADDR 0x5c +#define FILTER_CONF_ADDR 0x5d + +/* + * ELECTRODE_CONF_ADDR: This register configures the number of + * enabled capacitance sensing inputs and its run/suspend mode. + */ +#define ELECTRODE_CONF_ADDR 0x5e +#define ELECTRODE_CONF_QUICK_CHARGE 0x80 +#define AUTO_CONFIG_CTRL_ADDR 0x7b +#define AUTO_CONFIG_USL_ADDR 0x7d +#define AUTO_CONFIG_LSL_ADDR 0x7e +#define AUTO_CONFIG_TL_ADDR 0x7f + +/* Threshold of touch/release trigger */ +#define TOUCH_THRESHOLD 0x08 +#define RELEASE_THRESHOLD 0x05 +/* Masks for touch and release triggers */ +#define TOUCH_STATUS_MASK 0xfff +/* MPR121 has 12 keys */ +#define MPR121_MAX_KEY_COUNT 12 + +struct mpr121_touchkey { + struct i2c_client *client; + struct input_dev *input_dev; + unsigned int key_val; + unsigned int statusbits; + unsigned int keycount; + u16 keycodes[MPR121_MAX_KEY_COUNT]; +}; + +struct mpr121_init_register { + int addr; + u8 val; +}; + +static const struct mpr121_init_register init_reg_table[] = { + { MHD_RISING_ADDR, 0x1 }, + { NHD_RISING_ADDR, 0x1 }, + { MHD_FALLING_ADDR, 0x1 }, + { NHD_FALLING_ADDR, 0x1 }, + { NCL_FALLING_ADDR, 0xff }, + { FDL_FALLING_ADDR, 0x02 }, + { FILTER_CONF_ADDR, 0x04 }, + { AFE_CONF_ADDR, 0x0b }, + { AUTO_CONFIG_CTRL_ADDR, 0x0b }, +}; + +static irqreturn_t mpr_touchkey_interrupt(int irq, void *dev_id) +{ + struct mpr121_touchkey *mpr121 = dev_id; + struct i2c_client *client = mpr121->client; + struct input_dev *input = mpr121->input_dev; + unsigned int key_num, key_val, pressed; + int reg; + + reg = i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_1_ADDR); + if (reg < 0) { + dev_err(&client->dev, "i2c read error [%d]\n", reg); + goto out; + } + + reg <<= 8; + reg |= i2c_smbus_read_byte_data(client, ELE_TOUCH_STATUS_0_ADDR); + if (reg < 0) { + dev_err(&client->dev, "i2c read error [%d]\n", reg); + goto out; + } + + reg &= TOUCH_STATUS_MASK; + /* use old press bit to figure out which bit changed */ + key_num = ffs(reg ^ mpr121->statusbits) - 1; + pressed = reg & (1 << key_num); + mpr121->statusbits = reg; + + key_val = mpr121->keycodes[key_num]; + + input_event(input, EV_MSC, MSC_SCAN, key_num); + input_report_key(input, key_val, pressed); + input_sync(input); + + dev_dbg(&client->dev, "key %d %d %s\n", key_num, key_val, + pressed ? "pressed" : "released"); + +out: + return IRQ_HANDLED; +} + +static int mpr121_phys_init(const struct mpr121_platform_data *pdata, + struct mpr121_touchkey *mpr121, + struct i2c_client *client) +{ + const struct mpr121_init_register *reg; + unsigned char usl, lsl, tl, eleconf; + int i, t, vdd, ret; + + /* Set up touch/release threshold for ele0-ele11 */ + for (i = 0; i <= MPR121_MAX_KEY_COUNT; i++) { + t = ELE0_TOUCH_THRESHOLD_ADDR + (i * 2); + ret = i2c_smbus_write_byte_data(client, t, TOUCH_THRESHOLD); + if (ret < 0) + goto err_i2c_write; + ret = i2c_smbus_write_byte_data(client, t + 1, + RELEASE_THRESHOLD); + if (ret < 0) + goto err_i2c_write; + } + + /* Set up init register */ + for (i = 0; i < ARRAY_SIZE(init_reg_table); i++) { + reg = &init_reg_table[i]; + ret = i2c_smbus_write_byte_data(client, reg->addr, reg->val); + if (ret < 0) + goto err_i2c_write; + } + + + /* + * Capacitance on sensing input varies and needs to be compensated. + * The internal MPR121-auto-configuration can do this if it's + * registers are set properly (based on pdata->vdd_uv). + */ + vdd = pdata->vdd_uv / 1000; + usl = ((vdd - 700) * 256) / vdd; + lsl = (usl * 65) / 100; + tl = (usl * 90) / 100; + ret = i2c_smbus_write_byte_data(client, AUTO_CONFIG_USL_ADDR, usl); + ret |= i2c_smbus_write_byte_data(client, AUTO_CONFIG_LSL_ADDR, lsl); + ret |= i2c_smbus_write_byte_data(client, AUTO_CONFIG_TL_ADDR, tl); + + /* + * Quick charge bit will let the capacitive charge to ready + * state quickly, or the buttons may not function after system + * boot. + */ + eleconf = mpr121->keycount | ELECTRODE_CONF_QUICK_CHARGE; + ret |= i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, + eleconf); + if (ret != 0) + goto err_i2c_write; + + dev_dbg(&client->dev, "set up with %x keys.\n", mpr121->keycount); + + return 0; + +err_i2c_write: + dev_err(&client->dev, "i2c write error: %d\n", ret); + return ret; +} + +static int mpr_touchkey_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct mpr121_platform_data *pdata = client->dev.platform_data; + struct mpr121_touchkey *mpr121; + struct input_dev *input_dev; + int error; + int i; + + if (!pdata) { + dev_err(&client->dev, "no platform data defined\n"); + return -EINVAL; + } + + if (!pdata->keymap || !pdata->keymap_size) { + dev_err(&client->dev, "missing keymap data\n"); + return -EINVAL; + } + + if (pdata->keymap_size > MPR121_MAX_KEY_COUNT) { + dev_err(&client->dev, "too many keys defined\n"); + return -EINVAL; + } + + if (!client->irq) { + dev_err(&client->dev, "irq number should not be zero\n"); + return -EINVAL; + } + + mpr121 = kzalloc(sizeof(struct mpr121_touchkey), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!mpr121 || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + mpr121->client = client; + mpr121->input_dev = input_dev; + mpr121->keycount = pdata->keymap_size; + + input_dev->name = "Freescale MPR121 Touchkey"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + + input_dev->keycode = mpr121->keycodes; + input_dev->keycodesize = sizeof(mpr121->keycodes[0]); + input_dev->keycodemax = mpr121->keycount; + + for (i = 0; i < pdata->keymap_size; i++) { + input_set_capability(input_dev, EV_KEY, pdata->keymap[i]); + mpr121->keycodes[i] = pdata->keymap[i]; + } + + error = mpr121_phys_init(pdata, mpr121, client); + if (error) { + dev_err(&client->dev, "Failed to init register\n"); + goto err_free_mem; + } + + error = request_threaded_irq(client->irq, NULL, + mpr_touchkey_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, mpr121); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_mem; + } + + error = input_register_device(input_dev); + if (error) + goto err_free_irq; + + i2c_set_clientdata(client, mpr121); + device_init_wakeup(&client->dev, pdata->wakeup); + + return 0; + +err_free_irq: + free_irq(client->irq, mpr121); +err_free_mem: + input_free_device(input_dev); + kfree(mpr121); + return error; +} + +static int mpr_touchkey_remove(struct i2c_client *client) +{ + struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); + + free_irq(client->irq, mpr121); + input_unregister_device(mpr121->input_dev); + kfree(mpr121); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int mpr_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, 0x00); + + return 0; +} + +static int mpr_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mpr121_touchkey *mpr121 = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + i2c_smbus_write_byte_data(client, ELECTRODE_CONF_ADDR, + mpr121->keycount); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(mpr121_touchkey_pm_ops, mpr_suspend, mpr_resume); + +static const struct i2c_device_id mpr121_id[] = { + { "mpr121_touchkey", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mpr121_id); + +static struct i2c_driver mpr_touchkey_driver = { + .driver = { + .name = "mpr121", + .owner = THIS_MODULE, + .pm = &mpr121_touchkey_pm_ops, + }, + .id_table = mpr121_id, + .probe = mpr_touchkey_probe, + .remove = mpr_touchkey_remove, +}; + +module_i2c_driver(mpr_touchkey_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Zhang Jiejing "); +MODULE_DESCRIPTION("Touch Key driver for Freescale MPR121 Chip"); diff --git a/drivers/input/keyboard/newtonkbd.c b/drivers/input/keyboard/newtonkbd.c new file mode 100644 index 00000000..f971898a --- /dev/null +++ b/drivers/input/keyboard/newtonkbd.c @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2000 Justin Cormack + */ + +/* + * Newton keyboard driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Justin Cormack, 68 Dartmouth Park Road, London NW5 1SN, UK. + */ + +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Newton keyboard driver" + +MODULE_AUTHOR("Justin Cormack "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define NKBD_KEY 0x7f +#define NKBD_PRESS 0x80 + +static unsigned char nkbd_keycode[128] = { + KEY_A, KEY_S, KEY_D, KEY_F, KEY_H, KEY_G, KEY_Z, KEY_X, + KEY_C, KEY_V, 0, KEY_B, KEY_Q, KEY_W, KEY_E, KEY_R, + KEY_Y, KEY_T, KEY_1, KEY_2, KEY_3, KEY_4, KEY_6, KEY_5, + KEY_EQUAL, KEY_9, KEY_7, KEY_MINUS, KEY_8, KEY_0, KEY_RIGHTBRACE, KEY_O, + KEY_U, KEY_LEFTBRACE, KEY_I, KEY_P, KEY_ENTER, KEY_L, KEY_J, KEY_APOSTROPHE, + KEY_K, KEY_SEMICOLON, KEY_BACKSLASH, KEY_COMMA, KEY_SLASH, KEY_N, KEY_M, KEY_DOT, + KEY_TAB, KEY_SPACE, KEY_GRAVE, KEY_DELETE, 0, 0, 0, KEY_LEFTMETA, + KEY_LEFTSHIFT, KEY_CAPSLOCK, KEY_LEFTALT, KEY_LEFTCTRL, KEY_RIGHTSHIFT, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_UP, 0 +}; + +struct nkbd { + unsigned char keycode[128]; + struct input_dev *dev; + struct serio *serio; + char phys[32]; +}; + +static irqreturn_t nkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct nkbd *nkbd = serio_get_drvdata(serio); + + /* invalid scan codes are probably the init sequence, so we ignore them */ + if (nkbd->keycode[data & NKBD_KEY]) { + input_report_key(nkbd->dev, nkbd->keycode[data & NKBD_KEY], data & NKBD_PRESS); + input_sync(nkbd->dev); + } + + else if (data == 0xe7) /* end of init sequence */ + printk(KERN_INFO "input: %s on %s\n", nkbd->dev->name, serio->phys); + return IRQ_HANDLED; + +} + +static int nkbd_connect(struct serio *serio, struct serio_driver *drv) +{ + struct nkbd *nkbd; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + nkbd = kzalloc(sizeof(struct nkbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!nkbd || !input_dev) + goto fail1; + + nkbd->serio = serio; + nkbd->dev = input_dev; + snprintf(nkbd->phys, sizeof(nkbd->phys), "%s/input0", serio->phys); + memcpy(nkbd->keycode, nkbd_keycode, sizeof(nkbd->keycode)); + + input_dev->name = "Newton Keyboard"; + input_dev->phys = nkbd->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_NEWTON; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_dev->keycode = nkbd->keycode; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(nkbd_keycode); + for (i = 0; i < 128; i++) + set_bit(nkbd->keycode[i], input_dev->keybit); + clear_bit(0, input_dev->keybit); + + serio_set_drvdata(serio, nkbd); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(nkbd->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(nkbd); + return err; +} + +static void nkbd_disconnect(struct serio *serio) +{ + struct nkbd *nkbd = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(nkbd->dev); + kfree(nkbd); +} + +static struct serio_device_id nkbd_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_NEWTON, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, nkbd_serio_ids); + +static struct serio_driver nkbd_drv = { + .driver = { + .name = "newtonkbd", + }, + .description = DRIVER_DESC, + .id_table = nkbd_serio_ids, + .interrupt = nkbd_interrupt, + .connect = nkbd_connect, + .disconnect = nkbd_disconnect, +}; + +module_serio_driver(nkbd_drv); diff --git a/drivers/input/keyboard/nomadik-ske-keypad.c b/drivers/input/keyboard/nomadik-ske-keypad.c new file mode 100644 index 00000000..c7d505cc --- /dev/null +++ b/drivers/input/keyboard/nomadik-ske-keypad.c @@ -0,0 +1,438 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * Author: Naveen Kumar G for ST-Ericsson + * Author: Sundar Iyer for ST-Ericsson + * + * License terms:GNU General Public License (GPL) version 2 + * + * Keypad controller driver for the SKE (Scroll Key Encoder) module used in + * the Nomadik 8815 and Ux500 platforms. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* SKE_CR bits */ +#define SKE_KPMLT (0x1 << 6) +#define SKE_KPCN (0x7 << 3) +#define SKE_KPASEN (0x1 << 2) +#define SKE_KPASON (0x1 << 7) + +/* SKE_IMSC bits */ +#define SKE_KPIMA (0x1 << 2) + +/* SKE_ICR bits */ +#define SKE_KPICS (0x1 << 3) +#define SKE_KPICA (0x1 << 2) + +/* SKE_RIS bits */ +#define SKE_KPRISA (0x1 << 2) + +#define SKE_KEYPAD_ROW_SHIFT 3 +#define SKE_KPD_NUM_ROWS 8 +#define SKE_KPD_NUM_COLS 8 + +/* keypad auto scan registers */ +#define SKE_ASR0 0x20 +#define SKE_ASR1 0x24 +#define SKE_ASR2 0x28 +#define SKE_ASR3 0x2C + +#define SKE_NUM_ASRX_REGISTERS (4) +#define KEY_PRESSED_DELAY 10 + +/** + * struct ske_keypad - data structure used by keypad driver + * @irq: irq no + * @reg_base: ske regsiters base address + * @input: pointer to input device object + * @board: keypad platform device + * @keymap: matrix scan code table for keycodes + * @clk: clock structure pointer + */ +struct ske_keypad { + int irq; + void __iomem *reg_base; + struct input_dev *input; + const struct ske_keypad_platform_data *board; + unsigned short keymap[SKE_KPD_NUM_ROWS * SKE_KPD_NUM_COLS]; + struct clk *clk; + struct clk *pclk; + spinlock_t ske_keypad_lock; +}; + +static void ske_keypad_set_bits(struct ske_keypad *keypad, u16 addr, + u8 mask, u8 data) +{ + u32 ret; + + spin_lock(&keypad->ske_keypad_lock); + + ret = readl(keypad->reg_base + addr); + ret &= ~mask; + ret |= data; + writel(ret, keypad->reg_base + addr); + + spin_unlock(&keypad->ske_keypad_lock); +} + +/* + * ske_keypad_chip_init: init keypad controller configuration + * + * Enable Multi key press detection, auto scan mode + */ +static int __init ske_keypad_chip_init(struct ske_keypad *keypad) +{ + u32 value; + int timeout = keypad->board->debounce_ms; + + /* check SKE_RIS to be 0 */ + while ((readl(keypad->reg_base + SKE_RIS) != 0x00000000) && timeout--) + cpu_relax(); + + if (!timeout) + return -EINVAL; + + /* + * set debounce value + * keypad dbounce is configured in DBCR[15:8] + * dbounce value in steps of 32/32.768 ms + */ + spin_lock(&keypad->ske_keypad_lock); + value = readl(keypad->reg_base + SKE_DBCR); + value = value & 0xff; + value |= ((keypad->board->debounce_ms * 32000)/32768) << 8; + writel(value, keypad->reg_base + SKE_DBCR); + spin_unlock(&keypad->ske_keypad_lock); + + /* enable multi key detection */ + ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPMLT); + + /* + * set up the number of columns + * KPCN[5:3] defines no. of keypad columns to be auto scanned + */ + value = (keypad->board->kcol - 1) << 3; + ske_keypad_set_bits(keypad, SKE_CR, SKE_KPCN, value); + + /* clear keypad interrupt for auto(and pending SW) scans */ + ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA | SKE_KPICS); + + /* un-mask keypad interrupts */ + ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); + + /* enable automatic scan */ + ske_keypad_set_bits(keypad, SKE_CR, 0x0, SKE_KPASEN); + + return 0; +} + +static void ske_keypad_report(struct ske_keypad *keypad, u8 status, int col) +{ + int row = 0, code, pos; + struct input_dev *input = keypad->input; + u32 ske_ris; + int key_pressed; + int num_of_rows; + + /* find out the row */ + num_of_rows = hweight8(status); + do { + pos = __ffs(status); + row = pos; + status &= ~(1 << pos); + + code = MATRIX_SCAN_CODE(row, col, SKE_KEYPAD_ROW_SHIFT); + ske_ris = readl(keypad->reg_base + SKE_RIS); + key_pressed = ske_ris & SKE_KPRISA; + + input_event(input, EV_MSC, MSC_SCAN, code); + input_report_key(input, keypad->keymap[code], key_pressed); + input_sync(input); + num_of_rows--; + } while (num_of_rows); +} + +static void ske_keypad_read_data(struct ske_keypad *keypad) +{ + u8 status; + int col = 0; + int ske_asr, i; + + /* + * Read the auto scan registers + * + * Each SKE_ASRx (x=0 to x=3) contains two row values. + * lower byte contains row value for column 2*x, + * upper byte contains row value for column 2*x + 1 + */ + for (i = 0; i < SKE_NUM_ASRX_REGISTERS; i++) { + ske_asr = readl(keypad->reg_base + SKE_ASR0 + (4 * i)); + if (!ske_asr) + continue; + + /* now that ASRx is zero, find out the coloumn x and row y */ + status = ske_asr & 0xff; + if (status) { + col = i * 2; + ske_keypad_report(keypad, status, col); + } + status = (ske_asr & 0xff00) >> 8; + if (status) { + col = (i * 2) + 1; + ske_keypad_report(keypad, status, col); + } + } +} + +static irqreturn_t ske_keypad_irq(int irq, void *dev_id) +{ + struct ske_keypad *keypad = dev_id; + int timeout = keypad->board->debounce_ms; + + /* disable auto scan interrupt; mask the interrupt generated */ + ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); + ske_keypad_set_bits(keypad, SKE_ICR, 0x0, SKE_KPICA); + + while ((readl(keypad->reg_base + SKE_CR) & SKE_KPASON) && --timeout) + cpu_relax(); + + /* SKEx registers are stable and can be read */ + ske_keypad_read_data(keypad); + + /* wait until raw interrupt is clear */ + while ((readl(keypad->reg_base + SKE_RIS)) && --timeout) + msleep(KEY_PRESSED_DELAY); + + /* enable auto scan interrupts */ + ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); + + return IRQ_HANDLED; +} + +static int __init ske_keypad_probe(struct platform_device *pdev) +{ + const struct ske_keypad_platform_data *plat = pdev->dev.platform_data; + struct ske_keypad *keypad; + struct input_dev *input; + struct resource *res; + int irq; + int error; + + if (!plat) { + dev_err(&pdev->dev, "invalid keypad platform data\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get keypad irq\n"); + return -EINVAL; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "missing platform resources\n"); + return -EINVAL; + } + + keypad = kzalloc(sizeof(struct ske_keypad), GFP_KERNEL); + input = input_allocate_device(); + if (!keypad || !input) { + dev_err(&pdev->dev, "failed to allocate keypad memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + keypad->irq = irq; + keypad->board = plat; + keypad->input = input; + spin_lock_init(&keypad->ske_keypad_lock); + + if (!request_mem_region(res->start, resource_size(res), pdev->name)) { + dev_err(&pdev->dev, "failed to request I/O memory\n"); + error = -EBUSY; + goto err_free_mem; + } + + keypad->reg_base = ioremap(res->start, resource_size(res)); + if (!keypad->reg_base) { + dev_err(&pdev->dev, "failed to remap I/O memory\n"); + error = -ENXIO; + goto err_free_mem_region; + } + + keypad->pclk = clk_get(&pdev->dev, "apb_pclk"); + if (IS_ERR(keypad->pclk)) { + dev_err(&pdev->dev, "failed to get pclk\n"); + error = PTR_ERR(keypad->pclk); + goto err_iounmap; + } + + keypad->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(keypad->clk)) { + dev_err(&pdev->dev, "failed to get clk\n"); + error = PTR_ERR(keypad->clk); + goto err_pclk; + } + + input->id.bustype = BUS_HOST; + input->name = "ux500-ske-keypad"; + input->dev.parent = &pdev->dev; + + error = matrix_keypad_build_keymap(plat->keymap_data, NULL, + SKE_KPD_NUM_ROWS, SKE_KPD_NUM_COLS, + keypad->keymap, input); + if (error) { + dev_err(&pdev->dev, "Failed to build keymap\n"); + goto err_clk; + } + + input_set_capability(input, EV_MSC, MSC_SCAN); + if (!plat->no_autorepeat) + __set_bit(EV_REP, input->evbit); + + error = clk_prepare_enable(keypad->pclk); + if (error) { + dev_err(&pdev->dev, "Failed to prepare/enable pclk\n"); + goto err_clk; + } + + error = clk_prepare_enable(keypad->clk); + if (error) { + dev_err(&pdev->dev, "Failed to prepare/enable clk\n"); + goto err_pclk_disable; + } + + + /* go through board initialization helpers */ + if (keypad->board->init) + keypad->board->init(); + + error = ske_keypad_chip_init(keypad); + if (error) { + dev_err(&pdev->dev, "unable to init keypad hardware\n"); + goto err_clk_disable; + } + + error = request_threaded_irq(keypad->irq, NULL, ske_keypad_irq, + IRQF_ONESHOT, "ske-keypad", keypad); + if (error) { + dev_err(&pdev->dev, "allocate irq %d failed\n", keypad->irq); + goto err_clk_disable; + } + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, + "unable to register input device: %d\n", error); + goto err_free_irq; + } + + if (plat->wakeup_enable) + device_init_wakeup(&pdev->dev, true); + + platform_set_drvdata(pdev, keypad); + + return 0; + +err_free_irq: + free_irq(keypad->irq, keypad); +err_clk_disable: + clk_disable_unprepare(keypad->clk); +err_pclk_disable: + clk_disable_unprepare(keypad->pclk); +err_clk: + clk_put(keypad->clk); +err_pclk: + clk_put(keypad->pclk); +err_iounmap: + iounmap(keypad->reg_base); +err_free_mem_region: + release_mem_region(res->start, resource_size(res)); +err_free_mem: + input_free_device(input); + kfree(keypad); + return error; +} + +static int ske_keypad_remove(struct platform_device *pdev) +{ + struct ske_keypad *keypad = platform_get_drvdata(pdev); + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + + free_irq(keypad->irq, keypad); + + input_unregister_device(keypad->input); + + clk_disable_unprepare(keypad->clk); + clk_put(keypad->clk); + + if (keypad->board->exit) + keypad->board->exit(); + + iounmap(keypad->reg_base); + release_mem_region(res->start, resource_size(res)); + kfree(keypad); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int ske_keypad_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct ske_keypad *keypad = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + if (device_may_wakeup(dev)) + enable_irq_wake(irq); + else + ske_keypad_set_bits(keypad, SKE_IMSC, ~SKE_KPIMA, 0x0); + + return 0; +} + +static int ske_keypad_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct ske_keypad *keypad = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + if (device_may_wakeup(dev)) + disable_irq_wake(irq); + else + ske_keypad_set_bits(keypad, SKE_IMSC, 0x0, SKE_KPIMA); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ske_keypad_dev_pm_ops, + ske_keypad_suspend, ske_keypad_resume); + +static struct platform_driver ske_keypad_driver = { + .driver = { + .name = "nmk-ske-keypad", + .owner = THIS_MODULE, + .pm = &ske_keypad_dev_pm_ops, + }, + .remove = ske_keypad_remove, +}; + +module_platform_driver_probe(ske_keypad_driver, ske_keypad_probe); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Naveen Kumar / Sundar Iyer "); +MODULE_DESCRIPTION("Nomadik Scroll-Key-Encoder Keypad Driver"); +MODULE_ALIAS("platform:nomadik-ske-keypad"); diff --git a/drivers/input/keyboard/omap-keypad.c b/drivers/input/keyboard/omap-keypad.c new file mode 100644 index 00000000..d0d5226d --- /dev/null +++ b/drivers/input/keyboard/omap-keypad.c @@ -0,0 +1,395 @@ +/* + * linux/drivers/input/keyboard/omap-keypad.c + * + * OMAP Keypad Driver + * + * Copyright (C) 2003 Nokia Corporation + * Written by Timo Teräs + * + * Added support for H2 & H3 Keypad + * Copyright (C) 2004 Texas Instruments + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef NEW_BOARD_LEARNING_MODE + +static void omap_kp_tasklet(unsigned long); +static void omap_kp_timer(unsigned long); + +static unsigned char keypad_state[8]; +static DEFINE_MUTEX(kp_enable_mutex); +static int kp_enable = 1; +static int kp_cur_group = -1; + +struct omap_kp { + struct input_dev *input; + struct timer_list timer; + int irq; + unsigned int rows; + unsigned int cols; + unsigned long delay; + unsigned int debounce; + unsigned short keymap[]; +}; + +static DECLARE_TASKLET_DISABLED(kp_tasklet, omap_kp_tasklet, 0); + +static unsigned int *row_gpios; +static unsigned int *col_gpios; + +#ifdef CONFIG_ARCH_OMAP2 +static void set_col_gpio_val(struct omap_kp *omap_kp, u8 value) +{ + int col; + + for (col = 0; col < omap_kp->cols; col++) + gpio_set_value(col_gpios[col], value & (1 << col)); +} + +static u8 get_row_gpio_val(struct omap_kp *omap_kp) +{ + int row; + u8 value = 0; + + for (row = 0; row < omap_kp->rows; row++) { + if (gpio_get_value(row_gpios[row])) + value |= (1 << row); + } + return value; +} +#else +#define set_col_gpio_val(x, y) do {} while (0) +#define get_row_gpio_val(x) 0 +#endif + +static irqreturn_t omap_kp_interrupt(int irq, void *dev_id) +{ + /* disable keyboard interrupt and schedule for handling */ + omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); + + tasklet_schedule(&kp_tasklet); + + return IRQ_HANDLED; +} + +static void omap_kp_timer(unsigned long data) +{ + tasklet_schedule(&kp_tasklet); +} + +static void omap_kp_scan_keypad(struct omap_kp *omap_kp, unsigned char *state) +{ + int col = 0; + + /* disable keyboard interrupt and schedule for handling */ + omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); + + /* read the keypad status */ + omap_writew(0xff, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC); + for (col = 0; col < omap_kp->cols; col++) { + omap_writew(~(1 << col) & 0xff, + OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC); + + udelay(omap_kp->delay); + + state[col] = ~omap_readw(OMAP1_MPUIO_BASE + + OMAP_MPUIO_KBR_LATCH) & 0xff; + } + omap_writew(0x00, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC); + udelay(2); +} + +static void omap_kp_tasklet(unsigned long data) +{ + struct omap_kp *omap_kp_data = (struct omap_kp *) data; + unsigned short *keycodes = omap_kp_data->input->keycode; + unsigned int row_shift = get_count_order(omap_kp_data->cols); + unsigned char new_state[8], changed, key_down = 0; + int col, row; + int spurious = 0; + + /* check for any changes */ + omap_kp_scan_keypad(omap_kp_data, new_state); + + /* check for changes and print those */ + for (col = 0; col < omap_kp_data->cols; col++) { + changed = new_state[col] ^ keypad_state[col]; + key_down |= new_state[col]; + if (changed == 0) + continue; + + for (row = 0; row < omap_kp_data->rows; row++) { + int key; + if (!(changed & (1 << row))) + continue; +#ifdef NEW_BOARD_LEARNING_MODE + printk(KERN_INFO "omap-keypad: key %d-%d %s\n", col, + row, (new_state[col] & (1 << row)) ? + "pressed" : "released"); +#else + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + if (key < 0) { + printk(KERN_WARNING + "omap-keypad: Spurious key event %d-%d\n", + col, row); + /* We scan again after a couple of seconds */ + spurious = 1; + continue; + } + + if (!(kp_cur_group == (key & GROUP_MASK) || + kp_cur_group == -1)) + continue; + + kp_cur_group = key & GROUP_MASK; + input_report_key(omap_kp_data->input, key & ~GROUP_MASK, + new_state[col] & (1 << row)); +#endif + } + } + input_sync(omap_kp_data->input); + memcpy(keypad_state, new_state, sizeof(keypad_state)); + + if (key_down) { + int delay = HZ / 20; + /* some key is pressed - keep irq disabled and use timer + * to poll the keypad */ + if (spurious) + delay = 2 * HZ; + mod_timer(&omap_kp_data->timer, jiffies + delay); + } else { + /* enable interrupts */ + omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); + kp_cur_group = -1; + } +} + +static ssize_t omap_kp_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%u\n", kp_enable); +} + +static ssize_t omap_kp_enable_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct omap_kp *omap_kp = dev_get_drvdata(dev); + int state; + + if (sscanf(buf, "%u", &state) != 1) + return -EINVAL; + + if ((state != 1) && (state != 0)) + return -EINVAL; + + mutex_lock(&kp_enable_mutex); + if (state != kp_enable) { + if (state) + enable_irq(omap_kp->irq); + else + disable_irq(omap_kp->irq); + kp_enable = state; + } + mutex_unlock(&kp_enable_mutex); + + return strnlen(buf, count); +} + +static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, omap_kp_enable_show, omap_kp_enable_store); + +#ifdef CONFIG_PM +static int omap_kp_suspend(struct platform_device *dev, pm_message_t state) +{ + /* Nothing yet */ + + return 0; +} + +static int omap_kp_resume(struct platform_device *dev) +{ + /* Nothing yet */ + + return 0; +} +#else +#define omap_kp_suspend NULL +#define omap_kp_resume NULL +#endif + +static int omap_kp_probe(struct platform_device *pdev) +{ + struct omap_kp *omap_kp; + struct input_dev *input_dev; + struct omap_kp_platform_data *pdata = pdev->dev.platform_data; + int i, col_idx, row_idx, ret; + unsigned int row_shift, keycodemax; + + if (!pdata->rows || !pdata->cols || !pdata->keymap_data) { + printk(KERN_ERR "No rows, cols or keymap_data from pdata\n"); + return -EINVAL; + } + + row_shift = get_count_order(pdata->cols); + keycodemax = pdata->rows << row_shift; + + omap_kp = kzalloc(sizeof(struct omap_kp) + + keycodemax * sizeof(unsigned short), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!omap_kp || !input_dev) { + kfree(omap_kp); + input_free_device(input_dev); + return -ENOMEM; + } + + platform_set_drvdata(pdev, omap_kp); + + omap_kp->input = input_dev; + + /* Disable the interrupt for the MPUIO keyboard */ + omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); + + if (pdata->delay) + omap_kp->delay = pdata->delay; + + if (pdata->row_gpios && pdata->col_gpios) { + row_gpios = pdata->row_gpios; + col_gpios = pdata->col_gpios; + } + + omap_kp->rows = pdata->rows; + omap_kp->cols = pdata->cols; + + col_idx = 0; + row_idx = 0; + + setup_timer(&omap_kp->timer, omap_kp_timer, (unsigned long)omap_kp); + + /* get the irq and init timer*/ + tasklet_enable(&kp_tasklet); + kp_tasklet.data = (unsigned long) omap_kp; + + ret = device_create_file(&pdev->dev, &dev_attr_enable); + if (ret < 0) + goto err2; + + /* setup input device */ + input_dev->name = "omap-keypad"; + input_dev->phys = "omap-keypad/input0"; + input_dev->dev.parent = &pdev->dev; + + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + + if (pdata->rep) + __set_bit(EV_REP, input_dev->evbit); + + ret = matrix_keypad_build_keymap(pdata->keymap_data, NULL, + pdata->rows, pdata->cols, + omap_kp->keymap, input_dev); + if (ret < 0) + goto err3; + + ret = input_register_device(omap_kp->input); + if (ret < 0) { + printk(KERN_ERR "Unable to register omap-keypad input device\n"); + goto err3; + } + + if (pdata->dbounce) + omap_writew(0xff, OMAP1_MPUIO_BASE + OMAP_MPUIO_GPIO_DEBOUNCING); + + /* scan current status and enable interrupt */ + omap_kp_scan_keypad(omap_kp, keypad_state); + omap_kp->irq = platform_get_irq(pdev, 0); + if (omap_kp->irq >= 0) { + if (request_irq(omap_kp->irq, omap_kp_interrupt, 0, + "omap-keypad", omap_kp) < 0) + goto err4; + } + omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); + + return 0; + +err4: + input_unregister_device(omap_kp->input); + input_dev = NULL; +err3: + device_remove_file(&pdev->dev, &dev_attr_enable); +err2: + for (i = row_idx - 1; i >= 0; i--) + gpio_free(row_gpios[i]); + for (i = col_idx - 1; i >= 0; i--) + gpio_free(col_gpios[i]); + + kfree(omap_kp); + input_free_device(input_dev); + + return -EINVAL; +} + +static int omap_kp_remove(struct platform_device *pdev) +{ + struct omap_kp *omap_kp = platform_get_drvdata(pdev); + + /* disable keypad interrupt handling */ + tasklet_disable(&kp_tasklet); + omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT); + free_irq(omap_kp->irq, omap_kp); + + del_timer_sync(&omap_kp->timer); + tasklet_kill(&kp_tasklet); + + /* unregister everything */ + input_unregister_device(omap_kp->input); + + kfree(omap_kp); + + return 0; +} + +static struct platform_driver omap_kp_driver = { + .probe = omap_kp_probe, + .remove = omap_kp_remove, + .suspend = omap_kp_suspend, + .resume = omap_kp_resume, + .driver = { + .name = "omap-keypad", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(omap_kp_driver); + +MODULE_AUTHOR("Timo Teräs"); +MODULE_DESCRIPTION("OMAP Keypad Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:omap-keypad"); diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c new file mode 100644 index 00000000..1b289092 --- /dev/null +++ b/drivers/input/keyboard/omap4-keypad.c @@ -0,0 +1,449 @@ +/* + * OMAP4 Keypad Driver + * + * Copyright (C) 2010 Texas Instruments + * + * Author: Abraham Arce + * Initial Code: Syed Rafiuddin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* OMAP4 registers */ +#define OMAP4_KBD_REVISION 0x00 +#define OMAP4_KBD_SYSCONFIG 0x10 +#define OMAP4_KBD_SYSSTATUS 0x14 +#define OMAP4_KBD_IRQSTATUS 0x18 +#define OMAP4_KBD_IRQENABLE 0x1C +#define OMAP4_KBD_WAKEUPENABLE 0x20 +#define OMAP4_KBD_PENDING 0x24 +#define OMAP4_KBD_CTRL 0x28 +#define OMAP4_KBD_DEBOUNCINGTIME 0x2C +#define OMAP4_KBD_LONGKEYTIME 0x30 +#define OMAP4_KBD_TIMEOUT 0x34 +#define OMAP4_KBD_STATEMACHINE 0x38 +#define OMAP4_KBD_ROWINPUTS 0x3C +#define OMAP4_KBD_COLUMNOUTPUTS 0x40 +#define OMAP4_KBD_FULLCODE31_0 0x44 +#define OMAP4_KBD_FULLCODE63_32 0x48 + +/* OMAP4 bit definitions */ +#define OMAP4_DEF_IRQENABLE_EVENTEN (1 << 0) +#define OMAP4_DEF_IRQENABLE_LONGKEY (1 << 1) +#define OMAP4_DEF_IRQENABLE_TIMEOUTEN (1 << 2) +#define OMAP4_DEF_WUP_EVENT_ENA (1 << 0) +#define OMAP4_DEF_WUP_LONG_KEY_ENA (1 << 1) +#define OMAP4_DEF_CTRL_NOSOFTMODE (1 << 1) +#define OMAP4_DEF_CTRLPTVVALUE (1 << 2) +#define OMAP4_DEF_CTRLPTV (1 << 1) + +/* OMAP4 values */ +#define OMAP4_VAL_IRQDISABLE 0x00 +#define OMAP4_VAL_DEBOUNCINGTIME 0x07 +#define OMAP4_VAL_FUNCTIONALCFG 0x1E + +#define OMAP4_MASK_IRQSTATUSDISABLE 0xFFFF + +enum { + KBD_REVISION_OMAP4 = 0, + KBD_REVISION_OMAP5, +}; + +struct omap4_keypad { + struct input_dev *input; + + void __iomem *base; + unsigned int irq; + + unsigned int rows; + unsigned int cols; + u32 reg_offset; + u32 irqreg_offset; + unsigned int row_shift; + bool no_autorepeat; + unsigned char key_state[8]; + unsigned short *keymap; +}; + +static int kbd_readl(struct omap4_keypad *keypad_data, u32 offset) +{ + return __raw_readl(keypad_data->base + + keypad_data->reg_offset + offset); +} + +static void kbd_writel(struct omap4_keypad *keypad_data, u32 offset, u32 value) +{ + __raw_writel(value, + keypad_data->base + keypad_data->reg_offset + offset); +} + +static int kbd_read_irqreg(struct omap4_keypad *keypad_data, u32 offset) +{ + return __raw_readl(keypad_data->base + + keypad_data->irqreg_offset + offset); +} + +static void kbd_write_irqreg(struct omap4_keypad *keypad_data, + u32 offset, u32 value) +{ + __raw_writel(value, + keypad_data->base + keypad_data->irqreg_offset + offset); +} + + +/* Interrupt handler */ +static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id) +{ + struct omap4_keypad *keypad_data = dev_id; + struct input_dev *input_dev = keypad_data->input; + unsigned char key_state[ARRAY_SIZE(keypad_data->key_state)]; + unsigned int col, row, code, changed; + u32 *new_state = (u32 *) key_state; + + /* Disable interrupts */ + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, + OMAP4_VAL_IRQDISABLE); + + *new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0); + *(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32); + + for (row = 0; row < keypad_data->rows; row++) { + changed = key_state[row] ^ keypad_data->key_state[row]; + if (!changed) + continue; + + for (col = 0; col < keypad_data->cols; col++) { + if (changed & (1 << col)) { + code = MATRIX_SCAN_CODE(row, col, + keypad_data->row_shift); + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, + keypad_data->keymap[code], + key_state[row] & (1 << col)); + } + } + } + + input_sync(input_dev); + + memcpy(keypad_data->key_state, key_state, + sizeof(keypad_data->key_state)); + + /* clear pending interrupts */ + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, + kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)); + + /* enable interrupts */ + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, + OMAP4_DEF_IRQENABLE_EVENTEN | + OMAP4_DEF_IRQENABLE_LONGKEY); + + return IRQ_HANDLED; +} + +static int omap4_keypad_open(struct input_dev *input) +{ + struct omap4_keypad *keypad_data = input_get_drvdata(input); + + pm_runtime_get_sync(input->dev.parent); + + disable_irq(keypad_data->irq); + + kbd_writel(keypad_data, OMAP4_KBD_CTRL, + OMAP4_VAL_FUNCTIONALCFG); + kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME, + OMAP4_VAL_DEBOUNCINGTIME); + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, + OMAP4_VAL_IRQDISABLE); + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, + OMAP4_DEF_IRQENABLE_EVENTEN | + OMAP4_DEF_IRQENABLE_LONGKEY); + kbd_writel(keypad_data, OMAP4_KBD_WAKEUPENABLE, + OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA); + + enable_irq(keypad_data->irq); + + return 0; +} + +static void omap4_keypad_close(struct input_dev *input) +{ + struct omap4_keypad *keypad_data = input_get_drvdata(input); + + disable_irq(keypad_data->irq); + + /* Disable interrupts */ + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE, + OMAP4_VAL_IRQDISABLE); + + /* clear pending interrupts */ + kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS, + kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS)); + + enable_irq(keypad_data->irq); + + pm_runtime_put_sync(input->dev.parent); +} + +#ifdef CONFIG_OF +static int omap4_keypad_parse_dt(struct device *dev, + struct omap4_keypad *keypad_data) +{ + struct device_node *np = dev->of_node; + int err; + + err = matrix_keypad_parse_of_params(dev, &keypad_data->rows, + &keypad_data->cols); + if (err) + return err; + + if (of_get_property(np, "linux,input-no-autorepeat", NULL)) + keypad_data->no_autorepeat = true; + + return 0; +} +#else +static inline int omap4_keypad_parse_dt(struct device *dev, + struct omap4_keypad *keypad_data) +{ + return -ENOSYS; +} +#endif + +static int omap4_keypad_probe(struct platform_device *pdev) +{ + const struct omap4_keypad_platform_data *pdata = + dev_get_platdata(&pdev->dev); + const struct matrix_keymap_data *keymap_data = + pdata ? pdata->keymap_data : NULL; + struct omap4_keypad *keypad_data; + struct input_dev *input_dev; + struct resource *res; + unsigned int max_keys; + int rev; + int irq; + int error; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "no base address specified\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (!irq) { + dev_err(&pdev->dev, "no keyboard irq assigned\n"); + return -EINVAL; + } + + keypad_data = kzalloc(sizeof(struct omap4_keypad), GFP_KERNEL); + if (!keypad_data) { + dev_err(&pdev->dev, "keypad_data memory allocation failed\n"); + return -ENOMEM; + } + + keypad_data->irq = irq; + + if (pdata) { + keypad_data->rows = pdata->rows; + keypad_data->cols = pdata->cols; + } else { + error = omap4_keypad_parse_dt(&pdev->dev, keypad_data); + if (error) + return error; + } + + res = request_mem_region(res->start, resource_size(res), pdev->name); + if (!res) { + dev_err(&pdev->dev, "can't request mem region\n"); + error = -EBUSY; + goto err_free_keypad; + } + + keypad_data->base = ioremap(res->start, resource_size(res)); + if (!keypad_data->base) { + dev_err(&pdev->dev, "can't ioremap mem resource\n"); + error = -ENOMEM; + goto err_release_mem; + } + + + /* + * Enable clocks for the keypad module so that we can read + * revision register. + */ + pm_runtime_enable(&pdev->dev); + error = pm_runtime_get_sync(&pdev->dev); + if (error) { + dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n"); + goto err_unmap; + } + rev = __raw_readl(keypad_data->base + OMAP4_KBD_REVISION); + rev &= 0x03 << 30; + rev >>= 30; + switch (rev) { + case KBD_REVISION_OMAP4: + keypad_data->reg_offset = 0x00; + keypad_data->irqreg_offset = 0x00; + break; + case KBD_REVISION_OMAP5: + keypad_data->reg_offset = 0x10; + keypad_data->irqreg_offset = 0x0c; + break; + default: + dev_err(&pdev->dev, + "Keypad reports unsupported revision %d", rev); + error = -EINVAL; + goto err_pm_put_sync; + } + + /* input device allocation */ + keypad_data->input = input_dev = input_allocate_device(); + if (!input_dev) { + error = -ENOMEM; + goto err_pm_put_sync; + } + + input_dev->name = pdev->name; + input_dev->dev.parent = &pdev->dev; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0001; + + input_dev->open = omap4_keypad_open; + input_dev->close = omap4_keypad_close; + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + if (!keypad_data->no_autorepeat) + __set_bit(EV_REP, input_dev->evbit); + + input_set_drvdata(input_dev, keypad_data); + + keypad_data->row_shift = get_count_order(keypad_data->cols); + max_keys = keypad_data->rows << keypad_data->row_shift; + keypad_data->keymap = kzalloc(max_keys * sizeof(keypad_data->keymap[0]), + GFP_KERNEL); + if (!keypad_data->keymap) { + dev_err(&pdev->dev, "Not enough memory for keymap\n"); + error = -ENOMEM; + goto err_free_input; + } + + error = matrix_keypad_build_keymap(keymap_data, NULL, + keypad_data->rows, keypad_data->cols, + keypad_data->keymap, input_dev); + if (error) { + dev_err(&pdev->dev, "failed to build keymap\n"); + goto err_free_keymap; + } + + error = request_irq(keypad_data->irq, omap4_keypad_interrupt, + IRQF_TRIGGER_RISING, + "omap4-keypad", keypad_data); + if (error) { + dev_err(&pdev->dev, "failed to register interrupt\n"); + goto err_free_input; + } + + pm_runtime_put_sync(&pdev->dev); + + error = input_register_device(keypad_data->input); + if (error < 0) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto err_pm_disable; + } + + platform_set_drvdata(pdev, keypad_data); + return 0; + +err_pm_disable: + pm_runtime_disable(&pdev->dev); + free_irq(keypad_data->irq, keypad_data); +err_free_keymap: + kfree(keypad_data->keymap); +err_free_input: + input_free_device(input_dev); +err_pm_put_sync: + pm_runtime_put_sync(&pdev->dev); +err_unmap: + iounmap(keypad_data->base); +err_release_mem: + release_mem_region(res->start, resource_size(res)); +err_free_keypad: + kfree(keypad_data); + return error; +} + +static int omap4_keypad_remove(struct platform_device *pdev) +{ + struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); + struct resource *res; + + free_irq(keypad_data->irq, keypad_data); + + pm_runtime_disable(&pdev->dev); + + input_unregister_device(keypad_data->input); + + iounmap(keypad_data->base); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); + + kfree(keypad_data->keymap); + kfree(keypad_data); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id omap_keypad_dt_match[] = { + { .compatible = "ti,omap4-keypad" }, + {}, +}; +MODULE_DEVICE_TABLE(of, omap_keypad_dt_match); +#endif + +static struct platform_driver omap4_keypad_driver = { + .probe = omap4_keypad_probe, + .remove = omap4_keypad_remove, + .driver = { + .name = "omap4-keypad", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(omap_keypad_dt_match), + }, +}; +module_platform_driver(omap4_keypad_driver); + +MODULE_AUTHOR("Texas Instruments"); +MODULE_DESCRIPTION("OMAP4 Keypad Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:omap4-keypad"); diff --git a/drivers/input/keyboard/opencores-kbd.c b/drivers/input/keyboard/opencores-kbd.c new file mode 100644 index 00000000..7ac5f174 --- /dev/null +++ b/drivers/input/keyboard/opencores-kbd.c @@ -0,0 +1,170 @@ +/* + * OpenCores Keyboard Controller Driver + * http://www.opencores.org/project,keyboardcontroller + * + * Copyright 2007-2009 HV Sistemas S.L. + * + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +struct opencores_kbd { + struct input_dev *input; + struct resource *addr_res; + void __iomem *addr; + int irq; + unsigned short keycodes[128]; +}; + +static irqreturn_t opencores_kbd_isr(int irq, void *dev_id) +{ + struct opencores_kbd *opencores_kbd = dev_id; + struct input_dev *input = opencores_kbd->input; + unsigned char c; + + c = readb(opencores_kbd->addr); + input_report_key(input, c & 0x7f, c & 0x80 ? 0 : 1); + input_sync(input); + + return IRQ_HANDLED; +} + +static int opencores_kbd_probe(struct platform_device *pdev) +{ + struct input_dev *input; + struct opencores_kbd *opencores_kbd; + struct resource *res; + int irq, i, error; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "missing board memory resource\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "missing board IRQ resource\n"); + return -EINVAL; + } + + opencores_kbd = kzalloc(sizeof(*opencores_kbd), GFP_KERNEL); + input = input_allocate_device(); + if (!opencores_kbd || !input) { + dev_err(&pdev->dev, "failed to allocate device structures\n"); + error = -ENOMEM; + goto err_free_mem; + } + + opencores_kbd->addr_res = res; + res = request_mem_region(res->start, resource_size(res), pdev->name); + if (!res) { + dev_err(&pdev->dev, "failed to request I/O memory\n"); + error = -EBUSY; + goto err_free_mem; + } + + opencores_kbd->addr = ioremap(res->start, resource_size(res)); + if (!opencores_kbd->addr) { + dev_err(&pdev->dev, "failed to remap I/O memory\n"); + error = -ENXIO; + goto err_rel_mem; + } + + opencores_kbd->input = input; + opencores_kbd->irq = irq; + + input->name = pdev->name; + input->phys = "opencores-kbd/input0"; + input->dev.parent = &pdev->dev; + + input_set_drvdata(input, opencores_kbd); + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + input->keycode = opencores_kbd->keycodes; + input->keycodesize = sizeof(opencores_kbd->keycodes[0]); + input->keycodemax = ARRAY_SIZE(opencores_kbd->keycodes); + + __set_bit(EV_KEY, input->evbit); + + for (i = 0; i < ARRAY_SIZE(opencores_kbd->keycodes); i++) { + /* + * OpenCores controller happens to have scancodes match + * our KEY_* definitions. + */ + opencores_kbd->keycodes[i] = i; + __set_bit(opencores_kbd->keycodes[i], input->keybit); + } + __clear_bit(KEY_RESERVED, input->keybit); + + error = request_irq(irq, &opencores_kbd_isr, + IRQF_TRIGGER_RISING, pdev->name, opencores_kbd); + if (error) { + dev_err(&pdev->dev, "unable to claim irq %d\n", irq); + goto err_unmap_mem; + } + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, "unable to register input device\n"); + goto err_free_irq; + } + + platform_set_drvdata(pdev, opencores_kbd); + + return 0; + + err_free_irq: + free_irq(irq, opencores_kbd); + err_unmap_mem: + iounmap(opencores_kbd->addr); + err_rel_mem: + release_mem_region(res->start, resource_size(res)); + err_free_mem: + input_free_device(input); + kfree(opencores_kbd); + + return error; +} + +static int opencores_kbd_remove(struct platform_device *pdev) +{ + struct opencores_kbd *opencores_kbd = platform_get_drvdata(pdev); + + free_irq(opencores_kbd->irq, opencores_kbd); + + iounmap(opencores_kbd->addr); + release_mem_region(opencores_kbd->addr_res->start, + resource_size(opencores_kbd->addr_res)); + input_unregister_device(opencores_kbd->input); + kfree(opencores_kbd); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver opencores_kbd_device_driver = { + .probe = opencores_kbd_probe, + .remove = opencores_kbd_remove, + .driver = { + .name = "opencores-kbd", + }, +}; +module_platform_driver(opencores_kbd_device_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Javier Herrero "); +MODULE_DESCRIPTION("Keyboard driver for OpenCores Keyboard Controller"); diff --git a/drivers/input/keyboard/pmic8xxx-keypad.c b/drivers/input/keyboard/pmic8xxx-keypad.c new file mode 100644 index 00000000..74339e13 --- /dev/null +++ b/drivers/input/keyboard/pmic8xxx-keypad.c @@ -0,0 +1,789 @@ +/* Copyright (c) 2009-2011, Code Aurora Forum. 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define PM8XXX_MAX_ROWS 18 +#define PM8XXX_MAX_COLS 8 +#define PM8XXX_ROW_SHIFT 3 +#define PM8XXX_MATRIX_MAX_SIZE (PM8XXX_MAX_ROWS * PM8XXX_MAX_COLS) + +#define PM8XXX_MIN_ROWS 5 +#define PM8XXX_MIN_COLS 5 + +#define MAX_SCAN_DELAY 128 +#define MIN_SCAN_DELAY 1 + +/* in nanoseconds */ +#define MAX_ROW_HOLD_DELAY 122000 +#define MIN_ROW_HOLD_DELAY 30500 + +#define MAX_DEBOUNCE_TIME 20 +#define MIN_DEBOUNCE_TIME 5 + +#define KEYP_CTRL 0x148 + +#define KEYP_CTRL_EVNTS BIT(0) +#define KEYP_CTRL_EVNTS_MASK 0x3 + +#define KEYP_CTRL_SCAN_COLS_SHIFT 5 +#define KEYP_CTRL_SCAN_COLS_MIN 5 +#define KEYP_CTRL_SCAN_COLS_BITS 0x3 + +#define KEYP_CTRL_SCAN_ROWS_SHIFT 2 +#define KEYP_CTRL_SCAN_ROWS_MIN 5 +#define KEYP_CTRL_SCAN_ROWS_BITS 0x7 + +#define KEYP_CTRL_KEYP_EN BIT(7) + +#define KEYP_SCAN 0x149 + +#define KEYP_SCAN_READ_STATE BIT(0) +#define KEYP_SCAN_DBOUNCE_SHIFT 1 +#define KEYP_SCAN_PAUSE_SHIFT 3 +#define KEYP_SCAN_ROW_HOLD_SHIFT 6 + +#define KEYP_TEST 0x14A + +#define KEYP_TEST_CLEAR_RECENT_SCAN BIT(6) +#define KEYP_TEST_CLEAR_OLD_SCAN BIT(5) +#define KEYP_TEST_READ_RESET BIT(4) +#define KEYP_TEST_DTEST_EN BIT(3) +#define KEYP_TEST_ABORT_READ BIT(0) + +#define KEYP_TEST_DBG_SELECT_SHIFT 1 + +/* bits of these registers represent + * '0' for key press + * '1' for key release + */ +#define KEYP_RECENT_DATA 0x14B +#define KEYP_OLD_DATA 0x14C + +#define KEYP_CLOCK_FREQ 32768 + +/** + * struct pmic8xxx_kp - internal keypad data structure + * @pdata - keypad platform data pointer + * @input - input device pointer for keypad + * @key_sense_irq - key press/release irq number + * @key_stuck_irq - key stuck notification irq number + * @keycodes - array to hold the key codes + * @dev - parent device pointer + * @keystate - present key press/release state + * @stuckstate - present state when key stuck irq + * @ctrl_reg - control register value + */ +struct pmic8xxx_kp { + const struct pm8xxx_keypad_platform_data *pdata; + struct input_dev *input; + int key_sense_irq; + int key_stuck_irq; + + unsigned short keycodes[PM8XXX_MATRIX_MAX_SIZE]; + + struct device *dev; + u16 keystate[PM8XXX_MAX_ROWS]; + u16 stuckstate[PM8XXX_MAX_ROWS]; + + u8 ctrl_reg; +}; + +static int pmic8xxx_kp_write_u8(struct pmic8xxx_kp *kp, + u8 data, u16 reg) +{ + int rc; + + rc = pm8xxx_writeb(kp->dev->parent, reg, data); + return rc; +} + +static int pmic8xxx_kp_read(struct pmic8xxx_kp *kp, + u8 *data, u16 reg, unsigned num_bytes) +{ + int rc; + + rc = pm8xxx_read_buf(kp->dev->parent, reg, data, num_bytes); + return rc; +} + +static int pmic8xxx_kp_read_u8(struct pmic8xxx_kp *kp, + u8 *data, u16 reg) +{ + int rc; + + rc = pmic8xxx_kp_read(kp, data, reg, 1); + return rc; +} + +static u8 pmic8xxx_col_state(struct pmic8xxx_kp *kp, u8 col) +{ + /* all keys pressed on that particular row? */ + if (col == 0x00) + return 1 << kp->pdata->num_cols; + else + return col & ((1 << kp->pdata->num_cols) - 1); +} + +/* + * Synchronous read protocol for RevB0 onwards: + * + * 1. Write '1' to ReadState bit in KEYP_SCAN register + * 2. Wait 2*32KHz clocks, so that HW can successfully enter read mode + * synchronously + * 3. Read rows in old array first if events are more than one + * 4. Read rows in recent array + * 5. Wait 4*32KHz clocks + * 6. Write '0' to ReadState bit of KEYP_SCAN register so that hw can + * synchronously exit read mode. + */ +static int pmic8xxx_chk_sync_read(struct pmic8xxx_kp *kp) +{ + int rc; + u8 scan_val; + + rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); + if (rc < 0) { + dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); + return rc; + } + + scan_val |= 0x1; + + rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); + if (rc < 0) { + dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); + return rc; + } + + /* 2 * 32KHz clocks */ + udelay((2 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); + + return rc; +} + +static int pmic8xxx_kp_read_data(struct pmic8xxx_kp *kp, u16 *state, + u16 data_reg, int read_rows) +{ + int rc, row; + u8 new_data[PM8XXX_MAX_ROWS]; + + rc = pmic8xxx_kp_read(kp, new_data, data_reg, read_rows); + if (rc) + return rc; + + for (row = 0; row < kp->pdata->num_rows; row++) { + dev_dbg(kp->dev, "new_data[%d] = %d\n", row, + new_data[row]); + state[row] = pmic8xxx_col_state(kp, new_data[row]); + } + + return rc; +} + +static int pmic8xxx_kp_read_matrix(struct pmic8xxx_kp *kp, u16 *new_state, + u16 *old_state) +{ + int rc, read_rows; + u8 scan_val; + + if (kp->pdata->num_rows < PM8XXX_MIN_ROWS) + read_rows = PM8XXX_MIN_ROWS; + else + read_rows = kp->pdata->num_rows; + + pmic8xxx_chk_sync_read(kp); + + if (old_state) { + rc = pmic8xxx_kp_read_data(kp, old_state, KEYP_OLD_DATA, + read_rows); + if (rc < 0) { + dev_err(kp->dev, + "Error reading KEYP_OLD_DATA, rc=%d\n", rc); + return rc; + } + } + + rc = pmic8xxx_kp_read_data(kp, new_state, KEYP_RECENT_DATA, + read_rows); + if (rc < 0) { + dev_err(kp->dev, + "Error reading KEYP_RECENT_DATA, rc=%d\n", rc); + return rc; + } + + /* 4 * 32KHz clocks */ + udelay((4 * DIV_ROUND_UP(USEC_PER_SEC, KEYP_CLOCK_FREQ)) + 1); + + rc = pmic8xxx_kp_read_u8(kp, &scan_val, KEYP_SCAN); + if (rc < 0) { + dev_err(kp->dev, "Error reading KEYP_SCAN reg, rc=%d\n", rc); + return rc; + } + + scan_val &= 0xFE; + rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); + if (rc < 0) + dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); + + return rc; +} + +static void __pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, u16 *new_state, + u16 *old_state) +{ + int row, col, code; + + for (row = 0; row < kp->pdata->num_rows; row++) { + int bits_changed = new_state[row] ^ old_state[row]; + + if (!bits_changed) + continue; + + for (col = 0; col < kp->pdata->num_cols; col++) { + if (!(bits_changed & (1 << col))) + continue; + + dev_dbg(kp->dev, "key [%d:%d] %s\n", row, col, + !(new_state[row] & (1 << col)) ? + "pressed" : "released"); + + code = MATRIX_SCAN_CODE(row, col, PM8XXX_ROW_SHIFT); + + input_event(kp->input, EV_MSC, MSC_SCAN, code); + input_report_key(kp->input, + kp->keycodes[code], + !(new_state[row] & (1 << col))); + + input_sync(kp->input); + } + } +} + +static bool pmic8xxx_detect_ghost_keys(struct pmic8xxx_kp *kp, u16 *new_state) +{ + int row, found_first = -1; + u16 check, row_state; + + check = 0; + for (row = 0; row < kp->pdata->num_rows; row++) { + row_state = (~new_state[row]) & + ((1 << kp->pdata->num_cols) - 1); + + if (hweight16(row_state) > 1) { + if (found_first == -1) + found_first = row; + if (check & row_state) { + dev_dbg(kp->dev, "detected ghost key on row[%d]" + " and row[%d]\n", found_first, row); + return true; + } + } + check |= row_state; + } + return false; +} + +static int pmic8xxx_kp_scan_matrix(struct pmic8xxx_kp *kp, unsigned int events) +{ + u16 new_state[PM8XXX_MAX_ROWS]; + u16 old_state[PM8XXX_MAX_ROWS]; + int rc; + + switch (events) { + case 0x1: + rc = pmic8xxx_kp_read_matrix(kp, new_state, NULL); + if (rc < 0) + return rc; + + /* detecting ghost key is not an error */ + if (pmic8xxx_detect_ghost_keys(kp, new_state)) + return 0; + __pmic8xxx_kp_scan_matrix(kp, new_state, kp->keystate); + memcpy(kp->keystate, new_state, sizeof(new_state)); + break; + case 0x3: /* two events - eventcounter is gray-coded */ + rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); + if (rc < 0) + return rc; + + __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); + __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); + memcpy(kp->keystate, new_state, sizeof(new_state)); + break; + case 0x2: + dev_dbg(kp->dev, "Some key events were lost\n"); + rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); + if (rc < 0) + return rc; + __pmic8xxx_kp_scan_matrix(kp, old_state, kp->keystate); + __pmic8xxx_kp_scan_matrix(kp, new_state, old_state); + memcpy(kp->keystate, new_state, sizeof(new_state)); + break; + default: + rc = -EINVAL; + } + return rc; +} + +/* + * NOTE: We are reading recent and old data registers blindly + * whenever key-stuck interrupt happens, because events counter doesn't + * get updated when this interrupt happens due to key stuck doesn't get + * considered as key state change. + * + * We are not using old data register contents after they are being read + * because it might report the key which was pressed before the key being stuck + * as stuck key because it's pressed status is stored in the old data + * register. + */ +static irqreturn_t pmic8xxx_kp_stuck_irq(int irq, void *data) +{ + u16 new_state[PM8XXX_MAX_ROWS]; + u16 old_state[PM8XXX_MAX_ROWS]; + int rc; + struct pmic8xxx_kp *kp = data; + + rc = pmic8xxx_kp_read_matrix(kp, new_state, old_state); + if (rc < 0) { + dev_err(kp->dev, "failed to read keypad matrix\n"); + return IRQ_HANDLED; + } + + __pmic8xxx_kp_scan_matrix(kp, new_state, kp->stuckstate); + + return IRQ_HANDLED; +} + +static irqreturn_t pmic8xxx_kp_irq(int irq, void *data) +{ + struct pmic8xxx_kp *kp = data; + u8 ctrl_val, events; + int rc; + + rc = pmic8xxx_kp_read(kp, &ctrl_val, KEYP_CTRL, 1); + if (rc < 0) { + dev_err(kp->dev, "failed to read keyp_ctrl register\n"); + return IRQ_HANDLED; + } + + events = ctrl_val & KEYP_CTRL_EVNTS_MASK; + + rc = pmic8xxx_kp_scan_matrix(kp, events); + if (rc < 0) + dev_err(kp->dev, "failed to scan matrix\n"); + + return IRQ_HANDLED; +} + +static int pmic8xxx_kpd_init(struct pmic8xxx_kp *kp) +{ + int bits, rc, cycles; + u8 scan_val = 0, ctrl_val = 0; + static const u8 row_bits[] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, + }; + + /* Find column bits */ + if (kp->pdata->num_cols < KEYP_CTRL_SCAN_COLS_MIN) + bits = 0; + else + bits = kp->pdata->num_cols - KEYP_CTRL_SCAN_COLS_MIN; + ctrl_val = (bits & KEYP_CTRL_SCAN_COLS_BITS) << + KEYP_CTRL_SCAN_COLS_SHIFT; + + /* Find row bits */ + if (kp->pdata->num_rows < KEYP_CTRL_SCAN_ROWS_MIN) + bits = 0; + else + bits = row_bits[kp->pdata->num_rows - KEYP_CTRL_SCAN_ROWS_MIN]; + + ctrl_val |= (bits << KEYP_CTRL_SCAN_ROWS_SHIFT); + + rc = pmic8xxx_kp_write_u8(kp, ctrl_val, KEYP_CTRL); + if (rc < 0) { + dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc); + return rc; + } + + bits = (kp->pdata->debounce_ms / 5) - 1; + + scan_val |= (bits << KEYP_SCAN_DBOUNCE_SHIFT); + + bits = fls(kp->pdata->scan_delay_ms) - 1; + scan_val |= (bits << KEYP_SCAN_PAUSE_SHIFT); + + /* Row hold time is a multiple of 32KHz cycles. */ + cycles = (kp->pdata->row_hold_ns * KEYP_CLOCK_FREQ) / NSEC_PER_SEC; + + scan_val |= (cycles << KEYP_SCAN_ROW_HOLD_SHIFT); + + rc = pmic8xxx_kp_write_u8(kp, scan_val, KEYP_SCAN); + if (rc) + dev_err(kp->dev, "Error writing KEYP_SCAN reg, rc=%d\n", rc); + + return rc; + +} + +static int pmic8xxx_kp_config_gpio(int gpio_start, int num_gpios, + struct pmic8xxx_kp *kp, struct pm_gpio *gpio_config) +{ + int rc, i; + + if (gpio_start < 0 || num_gpios < 0) + return -EINVAL; + + for (i = 0; i < num_gpios; i++) { + rc = pm8xxx_gpio_config(gpio_start + i, gpio_config); + if (rc) { + dev_err(kp->dev, "%s: FAIL pm8xxx_gpio_config():" + "for PM GPIO [%d] rc=%d.\n", + __func__, gpio_start + i, rc); + return rc; + } + } + + return 0; +} + +static int pmic8xxx_kp_enable(struct pmic8xxx_kp *kp) +{ + int rc; + + kp->ctrl_reg |= KEYP_CTRL_KEYP_EN; + + rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL); + if (rc < 0) + dev_err(kp->dev, "Error writing KEYP_CTRL reg, rc=%d\n", rc); + + return rc; +} + +static int pmic8xxx_kp_disable(struct pmic8xxx_kp *kp) +{ + int rc; + + kp->ctrl_reg &= ~KEYP_CTRL_KEYP_EN; + + rc = pmic8xxx_kp_write_u8(kp, kp->ctrl_reg, KEYP_CTRL); + if (rc < 0) + return rc; + + return rc; +} + +static int pmic8xxx_kp_open(struct input_dev *dev) +{ + struct pmic8xxx_kp *kp = input_get_drvdata(dev); + + return pmic8xxx_kp_enable(kp); +} + +static void pmic8xxx_kp_close(struct input_dev *dev) +{ + struct pmic8xxx_kp *kp = input_get_drvdata(dev); + + pmic8xxx_kp_disable(kp); +} + +/* + * keypad controller should be initialized in the following sequence + * only, otherwise it might get into FSM stuck state. + * + * - Initialize keypad control parameters, like no. of rows, columns, + * timing values etc., + * - configure rows and column gpios pull up/down. + * - set irq edge type. + * - enable the keypad controller. + */ +static int pmic8xxx_kp_probe(struct platform_device *pdev) +{ + const struct pm8xxx_keypad_platform_data *pdata = + dev_get_platdata(&pdev->dev); + const struct matrix_keymap_data *keymap_data; + struct pmic8xxx_kp *kp; + int rc; + u8 ctrl_val; + + struct pm_gpio kypd_drv = { + .direction = PM_GPIO_DIR_OUT, + .output_buffer = PM_GPIO_OUT_BUF_OPEN_DRAIN, + .output_value = 0, + .pull = PM_GPIO_PULL_NO, + .vin_sel = PM_GPIO_VIN_S3, + .out_strength = PM_GPIO_STRENGTH_LOW, + .function = PM_GPIO_FUNC_1, + .inv_int_pol = 1, + }; + + struct pm_gpio kypd_sns = { + .direction = PM_GPIO_DIR_IN, + .pull = PM_GPIO_PULL_UP_31P5, + .vin_sel = PM_GPIO_VIN_S3, + .out_strength = PM_GPIO_STRENGTH_NO, + .function = PM_GPIO_FUNC_NORMAL, + .inv_int_pol = 1, + }; + + + if (!pdata || !pdata->num_cols || !pdata->num_rows || + pdata->num_cols > PM8XXX_MAX_COLS || + pdata->num_rows > PM8XXX_MAX_ROWS || + pdata->num_cols < PM8XXX_MIN_COLS) { + dev_err(&pdev->dev, "invalid platform data\n"); + return -EINVAL; + } + + if (!pdata->scan_delay_ms || + pdata->scan_delay_ms > MAX_SCAN_DELAY || + pdata->scan_delay_ms < MIN_SCAN_DELAY || + !is_power_of_2(pdata->scan_delay_ms)) { + dev_err(&pdev->dev, "invalid keypad scan time supplied\n"); + return -EINVAL; + } + + if (!pdata->row_hold_ns || + pdata->row_hold_ns > MAX_ROW_HOLD_DELAY || + pdata->row_hold_ns < MIN_ROW_HOLD_DELAY || + ((pdata->row_hold_ns % MIN_ROW_HOLD_DELAY) != 0)) { + dev_err(&pdev->dev, "invalid keypad row hold time supplied\n"); + return -EINVAL; + } + + if (!pdata->debounce_ms || + ((pdata->debounce_ms % 5) != 0) || + pdata->debounce_ms > MAX_DEBOUNCE_TIME || + pdata->debounce_ms < MIN_DEBOUNCE_TIME) { + dev_err(&pdev->dev, "invalid debounce time supplied\n"); + return -EINVAL; + } + + keymap_data = pdata->keymap_data; + if (!keymap_data) { + dev_err(&pdev->dev, "no keymap data supplied\n"); + return -EINVAL; + } + + kp = kzalloc(sizeof(*kp), GFP_KERNEL); + if (!kp) + return -ENOMEM; + + platform_set_drvdata(pdev, kp); + + kp->pdata = pdata; + kp->dev = &pdev->dev; + + kp->input = input_allocate_device(); + if (!kp->input) { + dev_err(&pdev->dev, "unable to allocate input device\n"); + rc = -ENOMEM; + goto err_alloc_device; + } + + kp->key_sense_irq = platform_get_irq(pdev, 0); + if (kp->key_sense_irq < 0) { + dev_err(&pdev->dev, "unable to get keypad sense irq\n"); + rc = -ENXIO; + goto err_get_irq; + } + + kp->key_stuck_irq = platform_get_irq(pdev, 1); + if (kp->key_stuck_irq < 0) { + dev_err(&pdev->dev, "unable to get keypad stuck irq\n"); + rc = -ENXIO; + goto err_get_irq; + } + + kp->input->name = pdata->input_name ? : "PMIC8XXX keypad"; + kp->input->phys = pdata->input_phys_device ? : "pmic8xxx_keypad/input0"; + + kp->input->dev.parent = &pdev->dev; + + kp->input->id.bustype = BUS_I2C; + kp->input->id.version = 0x0001; + kp->input->id.product = 0x0001; + kp->input->id.vendor = 0x0001; + + kp->input->open = pmic8xxx_kp_open; + kp->input->close = pmic8xxx_kp_close; + + rc = matrix_keypad_build_keymap(keymap_data, NULL, + PM8XXX_MAX_ROWS, PM8XXX_MAX_COLS, + kp->keycodes, kp->input); + if (rc) { + dev_err(&pdev->dev, "failed to build keymap\n"); + goto err_get_irq; + } + + if (pdata->rep) + __set_bit(EV_REP, kp->input->evbit); + input_set_capability(kp->input, EV_MSC, MSC_SCAN); + + input_set_drvdata(kp->input, kp); + + /* initialize keypad state */ + memset(kp->keystate, 0xff, sizeof(kp->keystate)); + memset(kp->stuckstate, 0xff, sizeof(kp->stuckstate)); + + rc = pmic8xxx_kpd_init(kp); + if (rc < 0) { + dev_err(&pdev->dev, "unable to initialize keypad controller\n"); + goto err_get_irq; + } + + rc = pmic8xxx_kp_config_gpio(pdata->cols_gpio_start, + pdata->num_cols, kp, &kypd_sns); + if (rc < 0) { + dev_err(&pdev->dev, "unable to configure keypad sense lines\n"); + goto err_gpio_config; + } + + rc = pmic8xxx_kp_config_gpio(pdata->rows_gpio_start, + pdata->num_rows, kp, &kypd_drv); + if (rc < 0) { + dev_err(&pdev->dev, "unable to configure keypad drive lines\n"); + goto err_gpio_config; + } + + rc = request_any_context_irq(kp->key_sense_irq, pmic8xxx_kp_irq, + IRQF_TRIGGER_RISING, "pmic-keypad", kp); + if (rc < 0) { + dev_err(&pdev->dev, "failed to request keypad sense irq\n"); + goto err_get_irq; + } + + rc = request_any_context_irq(kp->key_stuck_irq, pmic8xxx_kp_stuck_irq, + IRQF_TRIGGER_RISING, "pmic-keypad-stuck", kp); + if (rc < 0) { + dev_err(&pdev->dev, "failed to request keypad stuck irq\n"); + goto err_req_stuck_irq; + } + + rc = pmic8xxx_kp_read_u8(kp, &ctrl_val, KEYP_CTRL); + if (rc < 0) { + dev_err(&pdev->dev, "failed to read KEYP_CTRL register\n"); + goto err_pmic_reg_read; + } + + kp->ctrl_reg = ctrl_val; + + rc = input_register_device(kp->input); + if (rc < 0) { + dev_err(&pdev->dev, "unable to register keypad input device\n"); + goto err_pmic_reg_read; + } + + device_init_wakeup(&pdev->dev, pdata->wakeup); + + return 0; + +err_pmic_reg_read: + free_irq(kp->key_stuck_irq, kp); +err_req_stuck_irq: + free_irq(kp->key_sense_irq, kp); +err_gpio_config: +err_get_irq: + input_free_device(kp->input); +err_alloc_device: + platform_set_drvdata(pdev, NULL); + kfree(kp); + return rc; +} + +static int pmic8xxx_kp_remove(struct platform_device *pdev) +{ + struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); + + device_init_wakeup(&pdev->dev, 0); + free_irq(kp->key_stuck_irq, kp); + free_irq(kp->key_sense_irq, kp); + input_unregister_device(kp->input); + kfree(kp); + + platform_set_drvdata(pdev, NULL); + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int pmic8xxx_kp_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); + struct input_dev *input_dev = kp->input; + + if (device_may_wakeup(dev)) { + enable_irq_wake(kp->key_sense_irq); + } else { + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + pmic8xxx_kp_disable(kp); + + mutex_unlock(&input_dev->mutex); + } + + return 0; +} + +static int pmic8xxx_kp_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct pmic8xxx_kp *kp = platform_get_drvdata(pdev); + struct input_dev *input_dev = kp->input; + + if (device_may_wakeup(dev)) { + disable_irq_wake(kp->key_sense_irq); + } else { + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + pmic8xxx_kp_enable(kp); + + mutex_unlock(&input_dev->mutex); + } + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(pm8xxx_kp_pm_ops, + pmic8xxx_kp_suspend, pmic8xxx_kp_resume); + +static struct platform_driver pmic8xxx_kp_driver = { + .probe = pmic8xxx_kp_probe, + .remove = pmic8xxx_kp_remove, + .driver = { + .name = PM8XXX_KEYPAD_DEV_NAME, + .owner = THIS_MODULE, + .pm = &pm8xxx_kp_pm_ops, + }, +}; +module_platform_driver(pmic8xxx_kp_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("PMIC8XXX keypad driver"); +MODULE_VERSION("1.0"); +MODULE_ALIAS("platform:pmic8xxx_keypad"); +MODULE_AUTHOR("Trilok Soni "); diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c new file mode 100644 index 00000000..5330d8fb --- /dev/null +++ b/drivers/input/keyboard/pxa27x_keypad.c @@ -0,0 +1,635 @@ +/* + * linux/drivers/input/keyboard/pxa27x_keypad.c + * + * Driver for the pxa27x matrix keyboard controller. + * + * Created: Feb 22, 2007 + * Author: Rodolfo Giometti + * + * Based on a previous implementations by Kevin O'Connor + * and Alex Osborne and + * on some suggestions by Nicolas Pitre . + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +/* + * Keypad Controller registers + */ +#define KPC 0x0000 /* Keypad Control register */ +#define KPDK 0x0008 /* Keypad Direct Key register */ +#define KPREC 0x0010 /* Keypad Rotary Encoder register */ +#define KPMK 0x0018 /* Keypad Matrix Key register */ +#define KPAS 0x0020 /* Keypad Automatic Scan register */ + +/* Keypad Automatic Scan Multiple Key Presser register 0-3 */ +#define KPASMKP0 0x0028 +#define KPASMKP1 0x0030 +#define KPASMKP2 0x0038 +#define KPASMKP3 0x0040 +#define KPKDI 0x0048 + +/* bit definitions */ +#define KPC_MKRN(n) ((((n) - 1) & 0x7) << 26) /* matrix key row number */ +#define KPC_MKCN(n) ((((n) - 1) & 0x7) << 23) /* matrix key column number */ +#define KPC_DKN(n) ((((n) - 1) & 0x7) << 6) /* direct key number */ + +#define KPC_AS (0x1 << 30) /* Automatic Scan bit */ +#define KPC_ASACT (0x1 << 29) /* Automatic Scan on Activity */ +#define KPC_MI (0x1 << 22) /* Matrix interrupt bit */ +#define KPC_IMKP (0x1 << 21) /* Ignore Multiple Key Press */ + +#define KPC_MS(n) (0x1 << (13 + (n))) /* Matrix scan line 'n' */ +#define KPC_MS_ALL (0xff << 13) + +#define KPC_ME (0x1 << 12) /* Matrix Keypad Enable */ +#define KPC_MIE (0x1 << 11) /* Matrix Interrupt Enable */ +#define KPC_DK_DEB_SEL (0x1 << 9) /* Direct Keypad Debounce Select */ +#define KPC_DI (0x1 << 5) /* Direct key interrupt bit */ +#define KPC_RE_ZERO_DEB (0x1 << 4) /* Rotary Encoder Zero Debounce */ +#define KPC_REE1 (0x1 << 3) /* Rotary Encoder1 Enable */ +#define KPC_REE0 (0x1 << 2) /* Rotary Encoder0 Enable */ +#define KPC_DE (0x1 << 1) /* Direct Keypad Enable */ +#define KPC_DIE (0x1 << 0) /* Direct Keypad interrupt Enable */ + +#define KPDK_DKP (0x1 << 31) +#define KPDK_DK(n) ((n) & 0xff) + +#define KPREC_OF1 (0x1 << 31) +#define kPREC_UF1 (0x1 << 30) +#define KPREC_OF0 (0x1 << 15) +#define KPREC_UF0 (0x1 << 14) + +#define KPREC_RECOUNT0(n) ((n) & 0xff) +#define KPREC_RECOUNT1(n) (((n) >> 16) & 0xff) + +#define KPMK_MKP (0x1 << 31) +#define KPAS_SO (0x1 << 31) +#define KPASMKPx_SO (0x1 << 31) + +#define KPAS_MUKP(n) (((n) >> 26) & 0x1f) +#define KPAS_RP(n) (((n) >> 4) & 0xf) +#define KPAS_CP(n) ((n) & 0xf) + +#define KPASMKP_MKC_MASK (0xff) + +#define keypad_readl(off) __raw_readl(keypad->mmio_base + (off)) +#define keypad_writel(off, v) __raw_writel((v), keypad->mmio_base + (off)) + +#define MAX_MATRIX_KEY_NUM (MAX_MATRIX_KEY_ROWS * MAX_MATRIX_KEY_COLS) +#define MAX_KEYPAD_KEYS (MAX_MATRIX_KEY_NUM + MAX_DIRECT_KEY_NUM) + +struct pxa27x_keypad { + struct pxa27x_keypad_platform_data *pdata; + + struct clk *clk; + struct input_dev *input_dev; + void __iomem *mmio_base; + + int irq; + + unsigned short keycodes[MAX_KEYPAD_KEYS]; + int rotary_rel_code[2]; + + /* state row bits of each column scan */ + uint32_t matrix_key_state[MAX_MATRIX_KEY_COLS]; + uint32_t direct_key_state; + + unsigned int direct_key_mask; +}; + +static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad) +{ + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + struct input_dev *input_dev = keypad->input_dev; + unsigned short keycode; + int i; + + for (i = 0; i < pdata->matrix_key_map_size; i++) { + unsigned int key = pdata->matrix_key_map[i]; + unsigned int row = KEY_ROW(key); + unsigned int col = KEY_COL(key); + unsigned int scancode = MATRIX_SCAN_CODE(row, col, + MATRIX_ROW_SHIFT); + + keycode = KEY_VAL(key); + keypad->keycodes[scancode] = keycode; + __set_bit(keycode, input_dev->keybit); + } + + for (i = 0; i < pdata->direct_key_num; i++) { + keycode = pdata->direct_key_map[i]; + keypad->keycodes[MAX_MATRIX_KEY_NUM + i] = keycode; + __set_bit(keycode, input_dev->keybit); + } + + if (pdata->enable_rotary0) { + if (pdata->rotary0_up_key && pdata->rotary0_down_key) { + keycode = pdata->rotary0_up_key; + keypad->keycodes[MAX_MATRIX_KEY_NUM + 0] = keycode; + __set_bit(keycode, input_dev->keybit); + + keycode = pdata->rotary0_down_key; + keypad->keycodes[MAX_MATRIX_KEY_NUM + 1] = keycode; + __set_bit(keycode, input_dev->keybit); + + keypad->rotary_rel_code[0] = -1; + } else { + keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; + __set_bit(pdata->rotary0_rel_code, input_dev->relbit); + } + } + + if (pdata->enable_rotary1) { + if (pdata->rotary1_up_key && pdata->rotary1_down_key) { + keycode = pdata->rotary1_up_key; + keypad->keycodes[MAX_MATRIX_KEY_NUM + 2] = keycode; + __set_bit(keycode, input_dev->keybit); + + keycode = pdata->rotary1_down_key; + keypad->keycodes[MAX_MATRIX_KEY_NUM + 3] = keycode; + __set_bit(keycode, input_dev->keybit); + + keypad->rotary_rel_code[1] = -1; + } else { + keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; + __set_bit(pdata->rotary1_rel_code, input_dev->relbit); + } + } + + __clear_bit(KEY_RESERVED, input_dev->keybit); +} + +static void pxa27x_keypad_scan_matrix(struct pxa27x_keypad *keypad) +{ + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + struct input_dev *input_dev = keypad->input_dev; + int row, col, num_keys_pressed = 0; + uint32_t new_state[MAX_MATRIX_KEY_COLS]; + uint32_t kpas = keypad_readl(KPAS); + + num_keys_pressed = KPAS_MUKP(kpas); + + memset(new_state, 0, sizeof(new_state)); + + if (num_keys_pressed == 0) + goto scan; + + if (num_keys_pressed == 1) { + col = KPAS_CP(kpas); + row = KPAS_RP(kpas); + + /* if invalid row/col, treat as no key pressed */ + if (col >= pdata->matrix_key_cols || + row >= pdata->matrix_key_rows) + goto scan; + + new_state[col] = (1 << row); + goto scan; + } + + if (num_keys_pressed > 1) { + uint32_t kpasmkp0 = keypad_readl(KPASMKP0); + uint32_t kpasmkp1 = keypad_readl(KPASMKP1); + uint32_t kpasmkp2 = keypad_readl(KPASMKP2); + uint32_t kpasmkp3 = keypad_readl(KPASMKP3); + + new_state[0] = kpasmkp0 & KPASMKP_MKC_MASK; + new_state[1] = (kpasmkp0 >> 16) & KPASMKP_MKC_MASK; + new_state[2] = kpasmkp1 & KPASMKP_MKC_MASK; + new_state[3] = (kpasmkp1 >> 16) & KPASMKP_MKC_MASK; + new_state[4] = kpasmkp2 & KPASMKP_MKC_MASK; + new_state[5] = (kpasmkp2 >> 16) & KPASMKP_MKC_MASK; + new_state[6] = kpasmkp3 & KPASMKP_MKC_MASK; + new_state[7] = (kpasmkp3 >> 16) & KPASMKP_MKC_MASK; + } +scan: + for (col = 0; col < pdata->matrix_key_cols; col++) { + uint32_t bits_changed; + int code; + + bits_changed = keypad->matrix_key_state[col] ^ new_state[col]; + if (bits_changed == 0) + continue; + + for (row = 0; row < pdata->matrix_key_rows; row++) { + if ((bits_changed & (1 << row)) == 0) + continue; + + code = MATRIX_SCAN_CODE(row, col, MATRIX_ROW_SHIFT); + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, keypad->keycodes[code], + new_state[col] & (1 << row)); + } + } + input_sync(input_dev); + memcpy(keypad->matrix_key_state, new_state, sizeof(new_state)); +} + +#define DEFAULT_KPREC (0x007f007f) + +static inline int rotary_delta(uint32_t kprec) +{ + if (kprec & KPREC_OF0) + return (kprec & 0xff) + 0x7f; + else if (kprec & KPREC_UF0) + return (kprec & 0xff) - 0x7f - 0xff; + else + return (kprec & 0xff) - 0x7f; +} + +static void report_rotary_event(struct pxa27x_keypad *keypad, int r, int delta) +{ + struct input_dev *dev = keypad->input_dev; + + if (delta == 0) + return; + + if (keypad->rotary_rel_code[r] == -1) { + int code = MAX_MATRIX_KEY_NUM + 2 * r + (delta > 0 ? 0 : 1); + unsigned char keycode = keypad->keycodes[code]; + + /* simulate a press-n-release */ + input_event(dev, EV_MSC, MSC_SCAN, code); + input_report_key(dev, keycode, 1); + input_sync(dev); + input_event(dev, EV_MSC, MSC_SCAN, code); + input_report_key(dev, keycode, 0); + input_sync(dev); + } else { + input_report_rel(dev, keypad->rotary_rel_code[r], delta); + input_sync(dev); + } +} + +static void pxa27x_keypad_scan_rotary(struct pxa27x_keypad *keypad) +{ + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + uint32_t kprec; + + /* read and reset to default count value */ + kprec = keypad_readl(KPREC); + keypad_writel(KPREC, DEFAULT_KPREC); + + if (pdata->enable_rotary0) + report_rotary_event(keypad, 0, rotary_delta(kprec)); + + if (pdata->enable_rotary1) + report_rotary_event(keypad, 1, rotary_delta(kprec >> 16)); +} + +static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad) +{ + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + struct input_dev *input_dev = keypad->input_dev; + unsigned int new_state; + uint32_t kpdk, bits_changed; + int i; + + kpdk = keypad_readl(KPDK); + + if (pdata->enable_rotary0 || pdata->enable_rotary1) + pxa27x_keypad_scan_rotary(keypad); + + /* + * The KPDR_DK only output the key pin level, so it relates to board, + * and low level may be active. + */ + if (pdata->direct_key_low_active) + new_state = ~KPDK_DK(kpdk) & keypad->direct_key_mask; + else + new_state = KPDK_DK(kpdk) & keypad->direct_key_mask; + + bits_changed = keypad->direct_key_state ^ new_state; + + if (bits_changed == 0) + return; + + for (i = 0; i < pdata->direct_key_num; i++) { + if (bits_changed & (1 << i)) { + int code = MAX_MATRIX_KEY_NUM + i; + + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, keypad->keycodes[code], + new_state & (1 << i)); + } + } + input_sync(input_dev); + keypad->direct_key_state = new_state; +} + +static void clear_wakeup_event(struct pxa27x_keypad *keypad) +{ + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + + if (pdata->clear_wakeup_event) + (pdata->clear_wakeup_event)(); +} + +static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id) +{ + struct pxa27x_keypad *keypad = dev_id; + unsigned long kpc = keypad_readl(KPC); + + clear_wakeup_event(keypad); + + if (kpc & KPC_DI) + pxa27x_keypad_scan_direct(keypad); + + if (kpc & KPC_MI) + pxa27x_keypad_scan_matrix(keypad); + + return IRQ_HANDLED; +} + +static void pxa27x_keypad_config(struct pxa27x_keypad *keypad) +{ + struct pxa27x_keypad_platform_data *pdata = keypad->pdata; + unsigned int mask = 0, direct_key_num = 0; + unsigned long kpc = 0; + + /* clear pending interrupt bit */ + keypad_readl(KPC); + + /* enable matrix keys with automatic scan */ + if (pdata->matrix_key_rows && pdata->matrix_key_cols) { + kpc |= KPC_ASACT | KPC_MIE | KPC_ME | KPC_MS_ALL; + kpc |= KPC_MKRN(pdata->matrix_key_rows) | + KPC_MKCN(pdata->matrix_key_cols); + } + + /* enable rotary key, debounce interval same as direct keys */ + if (pdata->enable_rotary0) { + mask |= 0x03; + direct_key_num = 2; + kpc |= KPC_REE0; + } + + if (pdata->enable_rotary1) { + mask |= 0x0c; + direct_key_num = 4; + kpc |= KPC_REE1; + } + + if (pdata->direct_key_num > direct_key_num) + direct_key_num = pdata->direct_key_num; + + /* + * Direct keys usage may not start from KP_DKIN0, check the platfrom + * mask data to config the specific. + */ + if (pdata->direct_key_mask) + keypad->direct_key_mask = pdata->direct_key_mask; + else + keypad->direct_key_mask = ((1 << direct_key_num) - 1) & ~mask; + + /* enable direct key */ + if (direct_key_num) + kpc |= KPC_DE | KPC_DIE | KPC_DKN(direct_key_num); + + keypad_writel(KPC, kpc | KPC_RE_ZERO_DEB); + keypad_writel(KPREC, DEFAULT_KPREC); + keypad_writel(KPKDI, pdata->debounce_interval); +} + +static int pxa27x_keypad_open(struct input_dev *dev) +{ + struct pxa27x_keypad *keypad = input_get_drvdata(dev); + + /* Enable unit clock */ + clk_prepare_enable(keypad->clk); + pxa27x_keypad_config(keypad); + + return 0; +} + +static void pxa27x_keypad_close(struct input_dev *dev) +{ + struct pxa27x_keypad *keypad = input_get_drvdata(dev); + + /* Disable clock unit */ + clk_disable_unprepare(keypad->clk); +} + +#ifdef CONFIG_PM +static int pxa27x_keypad_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); + + /* + * If the keypad is used a wake up source, clock can not be disabled. + * Or it can not detect the key pressing. + */ + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(keypad->irq); + else + clk_disable_unprepare(keypad->clk); + + return 0; +} + +static int pxa27x_keypad_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); + struct input_dev *input_dev = keypad->input_dev; + + /* + * If the keypad is used as wake up source, the clock is not turned + * off. So do not need configure it again. + */ + if (device_may_wakeup(&pdev->dev)) { + disable_irq_wake(keypad->irq); + } else { + mutex_lock(&input_dev->mutex); + + if (input_dev->users) { + /* Enable unit clock */ + clk_prepare_enable(keypad->clk); + pxa27x_keypad_config(keypad); + } + + mutex_unlock(&input_dev->mutex); + } + + return 0; +} + +static const struct dev_pm_ops pxa27x_keypad_pm_ops = { + .suspend = pxa27x_keypad_suspend, + .resume = pxa27x_keypad_resume, +}; +#endif + +static int pxa27x_keypad_probe(struct platform_device *pdev) +{ + struct pxa27x_keypad_platform_data *pdata = pdev->dev.platform_data; + struct pxa27x_keypad *keypad; + struct input_dev *input_dev; + struct resource *res; + int irq, error; + + if (pdata == NULL) { + dev_err(&pdev->dev, "no platform data defined\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get keypad irq\n"); + return -ENXIO; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (res == NULL) { + dev_err(&pdev->dev, "failed to get I/O memory\n"); + return -ENXIO; + } + + keypad = kzalloc(sizeof(struct pxa27x_keypad), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!keypad || !input_dev) { + dev_err(&pdev->dev, "failed to allocate memory\n"); + error = -ENOMEM; + goto failed_free; + } + + keypad->pdata = pdata; + keypad->input_dev = input_dev; + keypad->irq = irq; + + res = request_mem_region(res->start, resource_size(res), pdev->name); + if (res == NULL) { + dev_err(&pdev->dev, "failed to request I/O memory\n"); + error = -EBUSY; + goto failed_free; + } + + keypad->mmio_base = ioremap(res->start, resource_size(res)); + if (keypad->mmio_base == NULL) { + dev_err(&pdev->dev, "failed to remap I/O memory\n"); + error = -ENXIO; + goto failed_free_mem; + } + + keypad->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(keypad->clk)) { + dev_err(&pdev->dev, "failed to get keypad clock\n"); + error = PTR_ERR(keypad->clk); + goto failed_free_io; + } + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->open = pxa27x_keypad_open; + input_dev->close = pxa27x_keypad_close; + input_dev->dev.parent = &pdev->dev; + + input_dev->keycode = keypad->keycodes; + input_dev->keycodesize = sizeof(keypad->keycodes[0]); + input_dev->keycodemax = ARRAY_SIZE(keypad->keycodes); + + input_set_drvdata(input_dev, keypad); + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + + pxa27x_keypad_build_keycode(keypad); + + if ((pdata->enable_rotary0 && keypad->rotary_rel_code[0] != -1) || + (pdata->enable_rotary1 && keypad->rotary_rel_code[1] != -1)) { + input_dev->evbit[0] |= BIT_MASK(EV_REL); + } + + error = request_irq(irq, pxa27x_keypad_irq_handler, 0, + pdev->name, keypad); + if (error) { + dev_err(&pdev->dev, "failed to request IRQ\n"); + goto failed_put_clk; + } + + /* Register the input device */ + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto failed_free_irq; + } + + platform_set_drvdata(pdev, keypad); + device_init_wakeup(&pdev->dev, 1); + + return 0; + +failed_free_irq: + free_irq(irq, pdev); +failed_put_clk: + clk_put(keypad->clk); +failed_free_io: + iounmap(keypad->mmio_base); +failed_free_mem: + release_mem_region(res->start, resource_size(res)); +failed_free: + input_free_device(input_dev); + kfree(keypad); + return error; +} + +static int pxa27x_keypad_remove(struct platform_device *pdev) +{ + struct pxa27x_keypad *keypad = platform_get_drvdata(pdev); + struct resource *res; + + free_irq(keypad->irq, pdev); + clk_put(keypad->clk); + + input_unregister_device(keypad->input_dev); + iounmap(keypad->mmio_base); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); + + platform_set_drvdata(pdev, NULL); + kfree(keypad); + + return 0; +} + +/* work with hotplug and coldplug */ +MODULE_ALIAS("platform:pxa27x-keypad"); + +static struct platform_driver pxa27x_keypad_driver = { + .probe = pxa27x_keypad_probe, + .remove = pxa27x_keypad_remove, + .driver = { + .name = "pxa27x-keypad", + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &pxa27x_keypad_pm_ops, +#endif + }, +}; +module_platform_driver(pxa27x_keypad_driver); + +MODULE_DESCRIPTION("PXA27x Keypad Controller Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/pxa930_rotary.c b/drivers/input/keyboard/pxa930_rotary.c new file mode 100644 index 00000000..bcad95be --- /dev/null +++ b/drivers/input/keyboard/pxa930_rotary.c @@ -0,0 +1,202 @@ +/* + * Driver for the enhanced rotary controller on pxa930 and pxa935 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define SBCR (0x04) +#define ERCR (0x0c) + +#define SBCR_ERSB (1 << 5) + +struct pxa930_rotary { + struct input_dev *input_dev; + void __iomem *mmio_base; + int last_ercr; + + struct pxa930_rotary_platform_data *pdata; +}; + +static void clear_sbcr(struct pxa930_rotary *r) +{ + uint32_t sbcr = __raw_readl(r->mmio_base + SBCR); + + __raw_writel(sbcr | SBCR_ERSB, r->mmio_base + SBCR); + __raw_writel(sbcr & ~SBCR_ERSB, r->mmio_base + SBCR); +} + +static irqreturn_t rotary_irq(int irq, void *dev_id) +{ + struct pxa930_rotary *r = dev_id; + struct pxa930_rotary_platform_data *pdata = r->pdata; + int ercr, delta, key; + + ercr = __raw_readl(r->mmio_base + ERCR) & 0xf; + clear_sbcr(r); + + delta = ercr - r->last_ercr; + if (delta == 0) + return IRQ_HANDLED; + + r->last_ercr = ercr; + + if (pdata->up_key && pdata->down_key) { + key = (delta > 0) ? pdata->up_key : pdata->down_key; + input_report_key(r->input_dev, key, 1); + input_sync(r->input_dev); + input_report_key(r->input_dev, key, 0); + } else + input_report_rel(r->input_dev, pdata->rel_code, delta); + + input_sync(r->input_dev); + + return IRQ_HANDLED; +} + +static int pxa930_rotary_open(struct input_dev *dev) +{ + struct pxa930_rotary *r = input_get_drvdata(dev); + + clear_sbcr(r); + + return 0; +} + +static void pxa930_rotary_close(struct input_dev *dev) +{ + struct pxa930_rotary *r = input_get_drvdata(dev); + + clear_sbcr(r); +} + +static int pxa930_rotary_probe(struct platform_device *pdev) +{ + struct pxa930_rotary_platform_data *pdata = pdev->dev.platform_data; + struct pxa930_rotary *r; + struct input_dev *input_dev; + struct resource *res; + int irq; + int err; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "no irq for rotary controller\n"); + return -ENXIO; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "no I/O memory defined\n"); + return -ENXIO; + } + + if (!pdata) { + dev_err(&pdev->dev, "no platform data defined\n"); + return -EINVAL; + } + + r = kzalloc(sizeof(struct pxa930_rotary), GFP_KERNEL); + if (!r) + return -ENOMEM; + + r->mmio_base = ioremap_nocache(res->start, resource_size(res)); + if (r->mmio_base == NULL) { + dev_err(&pdev->dev, "failed to remap IO memory\n"); + err = -ENXIO; + goto failed_free; + } + + r->pdata = pdata; + platform_set_drvdata(pdev, r); + + /* allocate and register the input device */ + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + err = -ENOMEM; + goto failed_free_io; + } + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->open = pxa930_rotary_open; + input_dev->close = pxa930_rotary_close; + input_dev->dev.parent = &pdev->dev; + + if (pdata->up_key && pdata->down_key) { + __set_bit(pdata->up_key, input_dev->keybit); + __set_bit(pdata->down_key, input_dev->keybit); + __set_bit(EV_KEY, input_dev->evbit); + } else { + __set_bit(pdata->rel_code, input_dev->relbit); + __set_bit(EV_REL, input_dev->evbit); + } + + r->input_dev = input_dev; + input_set_drvdata(input_dev, r); + + err = request_irq(irq, rotary_irq, 0, + "enhanced rotary", r); + if (err) { + dev_err(&pdev->dev, "failed to request IRQ\n"); + goto failed_free_input; + } + + err = input_register_device(input_dev); + if (err) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto failed_free_irq; + } + + return 0; + +failed_free_irq: + free_irq(irq, r); +failed_free_input: + input_free_device(input_dev); +failed_free_io: + iounmap(r->mmio_base); +failed_free: + kfree(r); + return err; +} + +static int pxa930_rotary_remove(struct platform_device *pdev) +{ + struct pxa930_rotary *r = platform_get_drvdata(pdev); + + free_irq(platform_get_irq(pdev, 0), r); + input_unregister_device(r->input_dev); + iounmap(r->mmio_base); + platform_set_drvdata(pdev, NULL); + kfree(r); + + return 0; +} + +static struct platform_driver pxa930_rotary_driver = { + .driver = { + .name = "pxa930-rotary", + .owner = THIS_MODULE, + }, + .probe = pxa930_rotary_probe, + .remove = pxa930_rotary_remove, +}; +module_platform_driver(pxa930_rotary_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Driver for PXA93x Enhanced Rotary Controller"); +MODULE_AUTHOR("Yao Yong "); diff --git a/drivers/input/keyboard/qt1070.c b/drivers/input/keyboard/qt1070.c new file mode 100644 index 00000000..42b773b3 --- /dev/null +++ b/drivers/input/keyboard/qt1070.c @@ -0,0 +1,266 @@ +/* + * Atmel AT42QT1070 QTouch Sensor Controller + * + * Copyright (C) 2011 Atmel + * + * Authors: Bo Shen + * + * Base on AT42QT2160 driver by: + * Raphael Derosso Pereira + * Copyright (C) 2009 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Address for each register */ +#define CHIP_ID 0x00 +#define QT1070_CHIP_ID 0x2E + +#define FW_VERSION 0x01 +#define QT1070_FW_VERSION 0x15 + +#define DET_STATUS 0x02 + +#define KEY_STATUS 0x03 + +/* Calibrate */ +#define CALIBRATE_CMD 0x38 +#define QT1070_CAL_TIME 200 + +/* Reset */ +#define RESET 0x39 +#define QT1070_RESET_TIME 255 + +/* AT42QT1070 support up to 7 keys */ +static const unsigned short qt1070_key2code[] = { + KEY_0, KEY_1, KEY_2, KEY_3, + KEY_4, KEY_5, KEY_6, +}; + +struct qt1070_data { + struct i2c_client *client; + struct input_dev *input; + unsigned int irq; + unsigned short keycodes[ARRAY_SIZE(qt1070_key2code)]; + u8 last_keys; +}; + +static int qt1070_read(struct i2c_client *client, u8 reg) +{ + int ret; + + ret = i2c_smbus_read_byte_data(client, reg); + if (ret < 0) + dev_err(&client->dev, + "can not read register, returned %d\n", ret); + + return ret; +} + +static int qt1070_write(struct i2c_client *client, u8 reg, u8 data) +{ + int ret; + + ret = i2c_smbus_write_byte_data(client, reg, data); + if (ret < 0) + dev_err(&client->dev, + "can not write register, returned %d\n", ret); + + return ret; +} + +static bool qt1070_identify(struct i2c_client *client) +{ + int id, ver; + + /* Read Chip ID */ + id = qt1070_read(client, CHIP_ID); + if (id != QT1070_CHIP_ID) { + dev_err(&client->dev, "ID %d not supported\n", id); + return false; + } + + /* Read firmware version */ + ver = qt1070_read(client, FW_VERSION); + if (ver < 0) { + dev_err(&client->dev, "could not read the firmware version\n"); + return false; + } + + dev_info(&client->dev, "AT42QT1070 firmware version %x\n", ver); + + return true; +} + +static irqreturn_t qt1070_interrupt(int irq, void *dev_id) +{ + struct qt1070_data *data = dev_id; + struct i2c_client *client = data->client; + struct input_dev *input = data->input; + int i; + u8 new_keys, keyval, mask = 0x01; + + /* Read the detected status register, thus clearing interrupt */ + qt1070_read(client, DET_STATUS); + + /* Read which key changed */ + new_keys = qt1070_read(client, KEY_STATUS); + + for (i = 0; i < ARRAY_SIZE(qt1070_key2code); i++) { + keyval = new_keys & mask; + if ((data->last_keys & mask) != keyval) + input_report_key(input, data->keycodes[i], keyval); + mask <<= 1; + } + input_sync(input); + + data->last_keys = new_keys; + return IRQ_HANDLED; +} + +static int qt1070_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct qt1070_data *data; + struct input_dev *input; + int i; + int err; + + err = i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE); + if (!err) { + dev_err(&client->dev, "%s adapter not supported\n", + dev_driver_string(&client->adapter->dev)); + return -ENODEV; + } + + if (!client->irq) { + dev_err(&client->dev, "please assign the irq to this device\n"); + return -EINVAL; + } + + /* Identify the qt1070 chip */ + if (!qt1070_identify(client)) + return -ENODEV; + + data = kzalloc(sizeof(struct qt1070_data), GFP_KERNEL); + input = input_allocate_device(); + if (!data || !input) { + dev_err(&client->dev, "insufficient memory\n"); + err = -ENOMEM; + goto err_free_mem; + } + + data->client = client; + data->input = input; + data->irq = client->irq; + + input->name = "AT42QT1070 QTouch Sensor"; + input->dev.parent = &client->dev; + input->id.bustype = BUS_I2C; + + /* Add the keycode */ + input->keycode = data->keycodes; + input->keycodesize = sizeof(data->keycodes[0]); + input->keycodemax = ARRAY_SIZE(qt1070_key2code); + + __set_bit(EV_KEY, input->evbit); + + for (i = 0; i < ARRAY_SIZE(qt1070_key2code); i++) { + data->keycodes[i] = qt1070_key2code[i]; + __set_bit(qt1070_key2code[i], input->keybit); + } + + /* Calibrate device */ + qt1070_write(client, CALIBRATE_CMD, 1); + msleep(QT1070_CAL_TIME); + + /* Soft reset */ + qt1070_write(client, RESET, 1); + msleep(QT1070_RESET_TIME); + + err = request_threaded_irq(client->irq, NULL, qt1070_interrupt, + IRQF_TRIGGER_NONE | IRQF_ONESHOT, + client->dev.driver->name, data); + if (err) { + dev_err(&client->dev, "fail to request irq\n"); + goto err_free_mem; + } + + /* Register the input device */ + err = input_register_device(data->input); + if (err) { + dev_err(&client->dev, "Failed to register input device\n"); + goto err_free_irq; + } + + i2c_set_clientdata(client, data); + + /* Read to clear the chang line */ + qt1070_read(client, DET_STATUS); + + return 0; + +err_free_irq: + free_irq(client->irq, data); +err_free_mem: + input_free_device(input); + kfree(data); + return err; +} + +static int qt1070_remove(struct i2c_client *client) +{ + struct qt1070_data *data = i2c_get_clientdata(client); + + /* Release IRQ */ + free_irq(client->irq, data); + + input_unregister_device(data->input); + kfree(data); + + return 0; +} + +static const struct i2c_device_id qt1070_id[] = { + { "qt1070", 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, qt1070_id); + +static struct i2c_driver qt1070_driver = { + .driver = { + .name = "qt1070", + .owner = THIS_MODULE, + }, + .id_table = qt1070_id, + .probe = qt1070_probe, + .remove = qt1070_remove, +}; + +module_i2c_driver(qt1070_driver); + +MODULE_AUTHOR("Bo Shen "); +MODULE_DESCRIPTION("Driver for AT42QT1070 QTouch sensor"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/qt2160.c b/drivers/input/keyboard/qt2160.c new file mode 100644 index 00000000..1c0ddad0 --- /dev/null +++ b/drivers/input/keyboard/qt2160.c @@ -0,0 +1,513 @@ +/* + * qt2160.c - Atmel AT42QT2160 Touch Sense Controller + * + * Copyright (C) 2009 Raphael Derosso Pereira + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define QT2160_VALID_CHIPID 0x11 + +#define QT2160_CMD_CHIPID 0 +#define QT2160_CMD_CODEVER 1 +#define QT2160_CMD_GSTAT 2 +#define QT2160_CMD_KEYS3 3 +#define QT2160_CMD_KEYS4 4 +#define QT2160_CMD_SLIDE 5 +#define QT2160_CMD_GPIOS 6 +#define QT2160_CMD_SUBVER 7 +#define QT2160_CMD_CALIBRATE 10 +#define QT2160_CMD_DRIVE_X 70 +#define QT2160_CMD_PWMEN_X 74 +#define QT2160_CMD_PWM_DUTY 76 + +#define QT2160_NUM_LEDS_X 8 + +#define QT2160_CYCLE_INTERVAL (2*HZ) + +static unsigned char qt2160_key2code[] = { + KEY_0, KEY_1, KEY_2, KEY_3, + KEY_4, KEY_5, KEY_6, KEY_7, + KEY_8, KEY_9, KEY_A, KEY_B, + KEY_C, KEY_D, KEY_E, KEY_F, +}; + +#ifdef CONFIG_LEDS_CLASS +struct qt2160_led { + struct qt2160_data *qt2160; + struct led_classdev cdev; + struct work_struct work; + char name[32]; + int id; + enum led_brightness new_brightness; +}; +#endif + +struct qt2160_data { + struct i2c_client *client; + struct input_dev *input; + struct delayed_work dwork; + spinlock_t lock; /* Protects canceling/rescheduling of dwork */ + unsigned short keycodes[ARRAY_SIZE(qt2160_key2code)]; + u16 key_matrix; +#ifdef CONFIG_LEDS_CLASS + struct qt2160_led leds[QT2160_NUM_LEDS_X]; + struct mutex led_lock; +#endif +}; + +static int qt2160_read(struct i2c_client *client, u8 reg); +static int qt2160_write(struct i2c_client *client, u8 reg, u8 data); + +#ifdef CONFIG_LEDS_CLASS + +static void qt2160_led_work(struct work_struct *work) +{ + struct qt2160_led *led = container_of(work, struct qt2160_led, work); + struct qt2160_data *qt2160 = led->qt2160; + struct i2c_client *client = qt2160->client; + int value = led->new_brightness; + u32 drive, pwmen; + + mutex_lock(&qt2160->led_lock); + + drive = qt2160_read(client, QT2160_CMD_DRIVE_X); + pwmen = qt2160_read(client, QT2160_CMD_PWMEN_X); + if (value != LED_OFF) { + drive |= (1 << led->id); + pwmen |= (1 << led->id); + + } else { + drive &= ~(1 << led->id); + pwmen &= ~(1 << led->id); + } + qt2160_write(client, QT2160_CMD_DRIVE_X, drive); + qt2160_write(client, QT2160_CMD_PWMEN_X, pwmen); + + /* + * Changing this register will change the brightness + * of every LED in the qt2160. It's a HW limitation. + */ + if (value != LED_OFF) + qt2160_write(client, QT2160_CMD_PWM_DUTY, value); + + mutex_unlock(&qt2160->led_lock); +} + +static void qt2160_led_set(struct led_classdev *cdev, + enum led_brightness value) +{ + struct qt2160_led *led = container_of(cdev, struct qt2160_led, cdev); + + led->new_brightness = value; + schedule_work(&led->work); +} + +#endif /* CONFIG_LEDS_CLASS */ + +static int qt2160_read_block(struct i2c_client *client, + u8 inireg, u8 *buffer, unsigned int count) +{ + int error, idx = 0; + + /* + * Can't use SMBus block data read. Check for I2C functionality to speed + * things up whenever possible. Otherwise we will be forced to read + * sequentially. + */ + if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + + error = i2c_smbus_write_byte(client, inireg + idx); + if (error) { + dev_err(&client->dev, + "couldn't send request. Returned %d\n", error); + return error; + } + + error = i2c_master_recv(client, buffer, count); + if (error != count) { + dev_err(&client->dev, + "couldn't read registers. Returned %d bytes\n", error); + return error; + } + } else { + + while (count--) { + int data; + + error = i2c_smbus_write_byte(client, inireg + idx); + if (error) { + dev_err(&client->dev, + "couldn't send request. Returned %d\n", error); + return error; + } + + data = i2c_smbus_read_byte(client); + if (data < 0) { + dev_err(&client->dev, + "couldn't read register. Returned %d\n", data); + return data; + } + + buffer[idx++] = data; + } + } + + return 0; +} + +static int qt2160_get_key_matrix(struct qt2160_data *qt2160) +{ + struct i2c_client *client = qt2160->client; + struct input_dev *input = qt2160->input; + u8 regs[6]; + u16 old_matrix, new_matrix; + int ret, i, mask; + + dev_dbg(&client->dev, "requesting keys...\n"); + + /* + * Read all registers from General Status Register + * to GPIOs register + */ + ret = qt2160_read_block(client, QT2160_CMD_GSTAT, regs, 6); + if (ret) { + dev_err(&client->dev, + "could not perform chip read.\n"); + return ret; + } + + old_matrix = qt2160->key_matrix; + qt2160->key_matrix = new_matrix = (regs[2] << 8) | regs[1]; + + mask = 0x01; + for (i = 0; i < 16; ++i, mask <<= 1) { + int keyval = new_matrix & mask; + + if ((old_matrix & mask) != keyval) { + input_report_key(input, qt2160->keycodes[i], keyval); + dev_dbg(&client->dev, "key %d %s\n", + i, keyval ? "pressed" : "released"); + } + } + + input_sync(input); + + return 0; +} + +static irqreturn_t qt2160_irq(int irq, void *_qt2160) +{ + struct qt2160_data *qt2160 = _qt2160; + unsigned long flags; + + spin_lock_irqsave(&qt2160->lock, flags); + + mod_delayed_work(system_wq, &qt2160->dwork, 0); + + spin_unlock_irqrestore(&qt2160->lock, flags); + + return IRQ_HANDLED; +} + +static void qt2160_schedule_read(struct qt2160_data *qt2160) +{ + spin_lock_irq(&qt2160->lock); + schedule_delayed_work(&qt2160->dwork, QT2160_CYCLE_INTERVAL); + spin_unlock_irq(&qt2160->lock); +} + +static void qt2160_worker(struct work_struct *work) +{ + struct qt2160_data *qt2160 = + container_of(work, struct qt2160_data, dwork.work); + + dev_dbg(&qt2160->client->dev, "worker\n"); + + qt2160_get_key_matrix(qt2160); + + /* Avoid device lock up by checking every so often */ + qt2160_schedule_read(qt2160); +} + +static int qt2160_read(struct i2c_client *client, u8 reg) +{ + int ret; + + ret = i2c_smbus_write_byte(client, reg); + if (ret) { + dev_err(&client->dev, + "couldn't send request. Returned %d\n", ret); + return ret; + } + + ret = i2c_smbus_read_byte(client); + if (ret < 0) { + dev_err(&client->dev, + "couldn't read register. Returned %d\n", ret); + return ret; + } + + return ret; +} + +static int qt2160_write(struct i2c_client *client, u8 reg, u8 data) +{ + int ret; + + ret = i2c_smbus_write_byte_data(client, reg, data); + if (ret < 0) + dev_err(&client->dev, + "couldn't write data. Returned %d\n", ret); + + return ret; +} + +#ifdef CONFIG_LEDS_CLASS + +static int qt2160_register_leds(struct qt2160_data *qt2160) +{ + struct i2c_client *client = qt2160->client; + int ret; + int i; + + mutex_init(&qt2160->led_lock); + + for (i = 0; i < QT2160_NUM_LEDS_X; i++) { + struct qt2160_led *led = &qt2160->leds[i]; + + snprintf(led->name, sizeof(led->name), "qt2160:x%d", i); + led->cdev.name = led->name; + led->cdev.brightness_set = qt2160_led_set; + led->cdev.brightness = LED_OFF; + led->id = i; + led->qt2160 = qt2160; + + INIT_WORK(&led->work, qt2160_led_work); + + ret = led_classdev_register(&client->dev, &led->cdev); + if (ret < 0) + return ret; + } + + /* Tur off LEDs */ + qt2160_write(client, QT2160_CMD_DRIVE_X, 0); + qt2160_write(client, QT2160_CMD_PWMEN_X, 0); + qt2160_write(client, QT2160_CMD_PWM_DUTY, 0); + + return 0; +} + +static void qt2160_unregister_leds(struct qt2160_data *qt2160) +{ + int i; + + for (i = 0; i < QT2160_NUM_LEDS_X; i++) { + led_classdev_unregister(&qt2160->leds[i].cdev); + cancel_work_sync(&qt2160->leds[i].work); + } +} + +#else + +static inline int qt2160_register_leds(struct qt2160_data *qt2160) +{ + return 0; +} + +static inline void qt2160_unregister_leds(struct qt2160_data *qt2160) +{ +} + +#endif + +static bool qt2160_identify(struct i2c_client *client) +{ + int id, ver, rev; + + /* Read Chid ID to check if chip is valid */ + id = qt2160_read(client, QT2160_CMD_CHIPID); + if (id != QT2160_VALID_CHIPID) { + dev_err(&client->dev, "ID %d not supported\n", id); + return false; + } + + /* Read chip firmware version */ + ver = qt2160_read(client, QT2160_CMD_CODEVER); + if (ver < 0) { + dev_err(&client->dev, "could not get firmware version\n"); + return false; + } + + /* Read chip firmware revision */ + rev = qt2160_read(client, QT2160_CMD_SUBVER); + if (rev < 0) { + dev_err(&client->dev, "could not get firmware revision\n"); + return false; + } + + dev_info(&client->dev, "AT42QT2160 firmware version %d.%d.%d\n", + ver >> 4, ver & 0xf, rev); + + return true; +} + +static int qt2160_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct qt2160_data *qt2160; + struct input_dev *input; + int i; + int error; + + /* Check functionality */ + error = i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE); + if (!error) { + dev_err(&client->dev, "%s adapter not supported\n", + dev_driver_string(&client->adapter->dev)); + return -ENODEV; + } + + if (!qt2160_identify(client)) + return -ENODEV; + + /* Chip is valid and active. Allocate structure */ + qt2160 = kzalloc(sizeof(struct qt2160_data), GFP_KERNEL); + input = input_allocate_device(); + if (!qt2160 || !input) { + dev_err(&client->dev, "insufficient memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + qt2160->client = client; + qt2160->input = input; + INIT_DELAYED_WORK(&qt2160->dwork, qt2160_worker); + spin_lock_init(&qt2160->lock); + + input->name = "AT42QT2160 Touch Sense Keyboard"; + input->id.bustype = BUS_I2C; + + input->keycode = qt2160->keycodes; + input->keycodesize = sizeof(qt2160->keycodes[0]); + input->keycodemax = ARRAY_SIZE(qt2160_key2code); + + __set_bit(EV_KEY, input->evbit); + __clear_bit(EV_REP, input->evbit); + for (i = 0; i < ARRAY_SIZE(qt2160_key2code); i++) { + qt2160->keycodes[i] = qt2160_key2code[i]; + __set_bit(qt2160_key2code[i], input->keybit); + } + __clear_bit(KEY_RESERVED, input->keybit); + + /* Calibrate device */ + error = qt2160_write(client, QT2160_CMD_CALIBRATE, 1); + if (error) { + dev_err(&client->dev, "failed to calibrate device\n"); + goto err_free_mem; + } + + if (client->irq) { + error = request_irq(client->irq, qt2160_irq, + IRQF_TRIGGER_FALLING, "qt2160", qt2160); + if (error) { + dev_err(&client->dev, + "failed to allocate irq %d\n", client->irq); + goto err_free_mem; + } + } + + error = qt2160_register_leds(qt2160); + if (error) { + dev_err(&client->dev, "Failed to register leds\n"); + goto err_free_irq; + } + + error = input_register_device(qt2160->input); + if (error) { + dev_err(&client->dev, + "Failed to register input device\n"); + goto err_unregister_leds; + } + + i2c_set_clientdata(client, qt2160); + qt2160_schedule_read(qt2160); + + return 0; + +err_unregister_leds: + qt2160_unregister_leds(qt2160); +err_free_irq: + if (client->irq) + free_irq(client->irq, qt2160); +err_free_mem: + input_free_device(input); + kfree(qt2160); + return error; +} + +static int qt2160_remove(struct i2c_client *client) +{ + struct qt2160_data *qt2160 = i2c_get_clientdata(client); + + qt2160_unregister_leds(qt2160); + + /* Release IRQ so no queue will be scheduled */ + if (client->irq) + free_irq(client->irq, qt2160); + + cancel_delayed_work_sync(&qt2160->dwork); + + input_unregister_device(qt2160->input); + kfree(qt2160); + + return 0; +} + +static const struct i2c_device_id qt2160_idtable[] = { + { "qt2160", 0, }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, qt2160_idtable); + +static struct i2c_driver qt2160_driver = { + .driver = { + .name = "qt2160", + .owner = THIS_MODULE, + }, + + .id_table = qt2160_idtable, + .probe = qt2160_probe, + .remove = qt2160_remove, +}; + +module_i2c_driver(qt2160_driver); + +MODULE_AUTHOR("Raphael Derosso Pereira "); +MODULE_DESCRIPTION("Driver for AT42QT2160 Touch Sensor"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/samsung-keypad.c b/drivers/input/keyboard/samsung-keypad.c new file mode 100644 index 00000000..22e357b5 --- /dev/null +++ b/drivers/input/keyboard/samsung-keypad.c @@ -0,0 +1,661 @@ +/* + * Samsung keypad driver + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: Joonyoung Shim + * Author: Donghwa Lee + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SAMSUNG_KEYIFCON 0x00 +#define SAMSUNG_KEYIFSTSCLR 0x04 +#define SAMSUNG_KEYIFCOL 0x08 +#define SAMSUNG_KEYIFROW 0x0c +#define SAMSUNG_KEYIFFC 0x10 + +/* SAMSUNG_KEYIFCON */ +#define SAMSUNG_KEYIFCON_INT_F_EN (1 << 0) +#define SAMSUNG_KEYIFCON_INT_R_EN (1 << 1) +#define SAMSUNG_KEYIFCON_DF_EN (1 << 2) +#define SAMSUNG_KEYIFCON_FC_EN (1 << 3) +#define SAMSUNG_KEYIFCON_WAKEUPEN (1 << 4) + +/* SAMSUNG_KEYIFSTSCLR */ +#define SAMSUNG_KEYIFSTSCLR_P_INT_MASK (0xff << 0) +#define SAMSUNG_KEYIFSTSCLR_R_INT_MASK (0xff << 8) +#define SAMSUNG_KEYIFSTSCLR_R_INT_OFFSET 8 +#define S5PV210_KEYIFSTSCLR_P_INT_MASK (0x3fff << 0) +#define S5PV210_KEYIFSTSCLR_R_INT_MASK (0x3fff << 16) +#define S5PV210_KEYIFSTSCLR_R_INT_OFFSET 16 + +/* SAMSUNG_KEYIFCOL */ +#define SAMSUNG_KEYIFCOL_MASK (0xff << 0) +#define S5PV210_KEYIFCOLEN_MASK (0xff << 8) + +/* SAMSUNG_KEYIFROW */ +#define SAMSUNG_KEYIFROW_MASK (0xff << 0) +#define S5PV210_KEYIFROW_MASK (0x3fff << 0) + +/* SAMSUNG_KEYIFFC */ +#define SAMSUNG_KEYIFFC_MASK (0x3ff << 0) + +enum samsung_keypad_type { + KEYPAD_TYPE_SAMSUNG, + KEYPAD_TYPE_S5PV210, +}; + +struct samsung_keypad { + struct input_dev *input_dev; + struct platform_device *pdev; + struct clk *clk; + void __iomem *base; + wait_queue_head_t wait; + bool stopped; + bool wake_enabled; + int irq; + enum samsung_keypad_type type; + unsigned int row_shift; + unsigned int rows; + unsigned int cols; + unsigned int row_state[SAMSUNG_MAX_COLS]; +#ifdef CONFIG_OF + int row_gpios[SAMSUNG_MAX_ROWS]; + int col_gpios[SAMSUNG_MAX_COLS]; +#endif + unsigned short keycodes[]; +}; + +static void samsung_keypad_scan(struct samsung_keypad *keypad, + unsigned int *row_state) +{ + unsigned int col; + unsigned int val; + + for (col = 0; col < keypad->cols; col++) { + if (keypad->type == KEYPAD_TYPE_S5PV210) { + val = S5PV210_KEYIFCOLEN_MASK; + val &= ~(1 << col) << 8; + } else { + val = SAMSUNG_KEYIFCOL_MASK; + val &= ~(1 << col); + } + + writel(val, keypad->base + SAMSUNG_KEYIFCOL); + mdelay(1); + + val = readl(keypad->base + SAMSUNG_KEYIFROW); + row_state[col] = ~val & ((1 << keypad->rows) - 1); + } + + /* KEYIFCOL reg clear */ + writel(0, keypad->base + SAMSUNG_KEYIFCOL); +} + +static bool samsung_keypad_report(struct samsung_keypad *keypad, + unsigned int *row_state) +{ + struct input_dev *input_dev = keypad->input_dev; + unsigned int changed; + unsigned int pressed; + unsigned int key_down = 0; + unsigned int val; + unsigned int col, row; + + for (col = 0; col < keypad->cols; col++) { + changed = row_state[col] ^ keypad->row_state[col]; + key_down |= row_state[col]; + if (!changed) + continue; + + for (row = 0; row < keypad->rows; row++) { + if (!(changed & (1 << row))) + continue; + + pressed = row_state[col] & (1 << row); + + dev_dbg(&keypad->input_dev->dev, + "key %s, row: %d, col: %d\n", + pressed ? "pressed" : "released", row, col); + + val = MATRIX_SCAN_CODE(row, col, keypad->row_shift); + + input_event(input_dev, EV_MSC, MSC_SCAN, val); + input_report_key(input_dev, + keypad->keycodes[val], pressed); + } + input_sync(keypad->input_dev); + } + + memcpy(keypad->row_state, row_state, sizeof(keypad->row_state)); + + return key_down; +} + +static irqreturn_t samsung_keypad_irq(int irq, void *dev_id) +{ + struct samsung_keypad *keypad = dev_id; + unsigned int row_state[SAMSUNG_MAX_COLS]; + unsigned int val; + bool key_down; + + pm_runtime_get_sync(&keypad->pdev->dev); + + do { + val = readl(keypad->base + SAMSUNG_KEYIFSTSCLR); + /* Clear interrupt. */ + writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR); + + samsung_keypad_scan(keypad, row_state); + + key_down = samsung_keypad_report(keypad, row_state); + if (key_down) + wait_event_timeout(keypad->wait, keypad->stopped, + msecs_to_jiffies(50)); + + } while (key_down && !keypad->stopped); + + pm_runtime_put(&keypad->pdev->dev); + + return IRQ_HANDLED; +} + +static void samsung_keypad_start(struct samsung_keypad *keypad) +{ + unsigned int val; + + pm_runtime_get_sync(&keypad->pdev->dev); + + /* Tell IRQ thread that it may poll the device. */ + keypad->stopped = false; + + clk_enable(keypad->clk); + + /* Enable interrupt bits. */ + val = readl(keypad->base + SAMSUNG_KEYIFCON); + val |= SAMSUNG_KEYIFCON_INT_F_EN | SAMSUNG_KEYIFCON_INT_R_EN; + writel(val, keypad->base + SAMSUNG_KEYIFCON); + + /* KEYIFCOL reg clear. */ + writel(0, keypad->base + SAMSUNG_KEYIFCOL); + + pm_runtime_put(&keypad->pdev->dev); +} + +static void samsung_keypad_stop(struct samsung_keypad *keypad) +{ + unsigned int val; + + pm_runtime_get_sync(&keypad->pdev->dev); + + /* Signal IRQ thread to stop polling and disable the handler. */ + keypad->stopped = true; + wake_up(&keypad->wait); + disable_irq(keypad->irq); + + /* Clear interrupt. */ + writel(~0x0, keypad->base + SAMSUNG_KEYIFSTSCLR); + + /* Disable interrupt bits. */ + val = readl(keypad->base + SAMSUNG_KEYIFCON); + val &= ~(SAMSUNG_KEYIFCON_INT_F_EN | SAMSUNG_KEYIFCON_INT_R_EN); + writel(val, keypad->base + SAMSUNG_KEYIFCON); + + clk_disable(keypad->clk); + + /* + * Now that chip should not generate interrupts we can safely + * re-enable the handler. + */ + enable_irq(keypad->irq); + + pm_runtime_put(&keypad->pdev->dev); +} + +static int samsung_keypad_open(struct input_dev *input_dev) +{ + struct samsung_keypad *keypad = input_get_drvdata(input_dev); + + samsung_keypad_start(keypad); + + return 0; +} + +static void samsung_keypad_close(struct input_dev *input_dev) +{ + struct samsung_keypad *keypad = input_get_drvdata(input_dev); + + samsung_keypad_stop(keypad); +} + +#ifdef CONFIG_OF +static struct samsung_keypad_platdata *samsung_keypad_parse_dt( + struct device *dev) +{ + struct samsung_keypad_platdata *pdata; + struct matrix_keymap_data *keymap_data; + uint32_t *keymap, num_rows = 0, num_cols = 0; + struct device_node *np = dev->of_node, *key_np; + unsigned int key_count; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "could not allocate memory for platform data\n"); + return NULL; + } + + of_property_read_u32(np, "samsung,keypad-num-rows", &num_rows); + of_property_read_u32(np, "samsung,keypad-num-columns", &num_cols); + if (!num_rows || !num_cols) { + dev_err(dev, "number of keypad rows/columns not specified\n"); + return NULL; + } + pdata->rows = num_rows; + pdata->cols = num_cols; + + keymap_data = devm_kzalloc(dev, sizeof(*keymap_data), GFP_KERNEL); + if (!keymap_data) { + dev_err(dev, "could not allocate memory for keymap data\n"); + return NULL; + } + pdata->keymap_data = keymap_data; + + key_count = of_get_child_count(np); + keymap_data->keymap_size = key_count; + keymap = devm_kzalloc(dev, sizeof(uint32_t) * key_count, GFP_KERNEL); + if (!keymap) { + dev_err(dev, "could not allocate memory for keymap\n"); + return NULL; + } + keymap_data->keymap = keymap; + + for_each_child_of_node(np, key_np) { + u32 row, col, key_code; + of_property_read_u32(key_np, "keypad,row", &row); + of_property_read_u32(key_np, "keypad,column", &col); + of_property_read_u32(key_np, "linux,code", &key_code); + *keymap++ = KEY(row, col, key_code); + } + + if (of_get_property(np, "linux,input-no-autorepeat", NULL)) + pdata->no_autorepeat = true; + if (of_get_property(np, "linux,input-wakeup", NULL)) + pdata->wakeup = true; + + return pdata; +} + +static void samsung_keypad_parse_dt_gpio(struct device *dev, + struct samsung_keypad *keypad) +{ + struct device_node *np = dev->of_node; + int gpio, error, row, col; + + for (row = 0; row < keypad->rows; row++) { + gpio = of_get_named_gpio(np, "row-gpios", row); + keypad->row_gpios[row] = gpio; + if (!gpio_is_valid(gpio)) { + dev_err(dev, "keypad row[%d]: invalid gpio %d\n", + row, gpio); + continue; + } + + error = devm_gpio_request(dev, gpio, "keypad-row"); + if (error) + dev_err(dev, + "keypad row[%d] gpio request failed: %d\n", + row, error); + } + + for (col = 0; col < keypad->cols; col++) { + gpio = of_get_named_gpio(np, "col-gpios", col); + keypad->col_gpios[col] = gpio; + if (!gpio_is_valid(gpio)) { + dev_err(dev, "keypad column[%d]: invalid gpio %d\n", + col, gpio); + continue; + } + + error = devm_gpio_request(dev, gpio, "keypad-col"); + if (error) + dev_err(dev, + "keypad column[%d] gpio request failed: %d\n", + col, error); + } +} +#else +static +struct samsung_keypad_platdata *samsung_keypad_parse_dt(struct device *dev) +{ + return NULL; +} +#endif + +static int samsung_keypad_probe(struct platform_device *pdev) +{ + const struct samsung_keypad_platdata *pdata; + const struct matrix_keymap_data *keymap_data; + struct samsung_keypad *keypad; + struct resource *res; + struct input_dev *input_dev; + unsigned int row_shift; + unsigned int keymap_size; + int error; + + if (pdev->dev.of_node) + pdata = samsung_keypad_parse_dt(&pdev->dev); + else + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(&pdev->dev, "no platform data defined\n"); + return -EINVAL; + } + + keymap_data = pdata->keymap_data; + if (!keymap_data) { + dev_err(&pdev->dev, "no keymap data defined\n"); + return -EINVAL; + } + + if (!pdata->rows || pdata->rows > SAMSUNG_MAX_ROWS) + return -EINVAL; + + if (!pdata->cols || pdata->cols > SAMSUNG_MAX_COLS) + return -EINVAL; + + /* initialize the gpio */ + if (pdata->cfg_gpio) + pdata->cfg_gpio(pdata->rows, pdata->cols); + + row_shift = get_count_order(pdata->cols); + keymap_size = (pdata->rows << row_shift) * sizeof(keypad->keycodes[0]); + + keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad) + keymap_size, + GFP_KERNEL); + input_dev = devm_input_allocate_device(&pdev->dev); + if (!keypad || !input_dev) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENODEV; + + keypad->base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); + if (!keypad->base) + return -EBUSY; + + keypad->clk = devm_clk_get(&pdev->dev, "keypad"); + if (IS_ERR(keypad->clk)) { + dev_err(&pdev->dev, "failed to get keypad clk\n"); + return PTR_ERR(keypad->clk); + } + + error = clk_prepare(keypad->clk); + if (error) { + dev_err(&pdev->dev, "keypad clock prepare failed\n"); + return error; + } + + keypad->input_dev = input_dev; + keypad->pdev = pdev; + keypad->row_shift = row_shift; + keypad->rows = pdata->rows; + keypad->cols = pdata->cols; + keypad->stopped = true; + init_waitqueue_head(&keypad->wait); + + if (pdev->dev.of_node) { +#ifdef CONFIG_OF + samsung_keypad_parse_dt_gpio(&pdev->dev, keypad); + keypad->type = of_device_is_compatible(pdev->dev.of_node, + "samsung,s5pv210-keypad"); +#endif + } else { + keypad->type = platform_get_device_id(pdev)->driver_data; + } + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + + input_dev->open = samsung_keypad_open; + input_dev->close = samsung_keypad_close; + + error = matrix_keypad_build_keymap(keymap_data, NULL, + pdata->rows, pdata->cols, + keypad->keycodes, input_dev); + if (error) { + dev_err(&pdev->dev, "failed to build keymap\n"); + goto err_unprepare_clk; + } + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + if (!pdata->no_autorepeat) + __set_bit(EV_REP, input_dev->evbit); + + input_set_drvdata(input_dev, keypad); + + keypad->irq = platform_get_irq(pdev, 0); + if (keypad->irq < 0) { + error = keypad->irq; + goto err_unprepare_clk; + } + + error = devm_request_threaded_irq(&pdev->dev, keypad->irq, NULL, + samsung_keypad_irq, IRQF_ONESHOT, + dev_name(&pdev->dev), keypad); + if (error) { + dev_err(&pdev->dev, "failed to register keypad interrupt\n"); + goto err_unprepare_clk; + } + + device_init_wakeup(&pdev->dev, pdata->wakeup); + platform_set_drvdata(pdev, keypad); + pm_runtime_enable(&pdev->dev); + + error = input_register_device(keypad->input_dev); + if (error) + goto err_disable_runtime_pm; + + if (pdev->dev.of_node) { + devm_kfree(&pdev->dev, (void *)pdata->keymap_data->keymap); + devm_kfree(&pdev->dev, (void *)pdata->keymap_data); + devm_kfree(&pdev->dev, (void *)pdata); + } + return 0; + +err_disable_runtime_pm: + pm_runtime_disable(&pdev->dev); + device_init_wakeup(&pdev->dev, 0); + platform_set_drvdata(pdev, NULL); +err_unprepare_clk: + clk_unprepare(keypad->clk); + return error; +} + +static int samsung_keypad_remove(struct platform_device *pdev) +{ + struct samsung_keypad *keypad = platform_get_drvdata(pdev); + + pm_runtime_disable(&pdev->dev); + device_init_wakeup(&pdev->dev, 0); + platform_set_drvdata(pdev, NULL); + + input_unregister_device(keypad->input_dev); + + clk_unprepare(keypad->clk); + + return 0; +} + +#ifdef CONFIG_PM_RUNTIME +static int samsung_keypad_runtime_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct samsung_keypad *keypad = platform_get_drvdata(pdev); + unsigned int val; + int error; + + if (keypad->stopped) + return 0; + + /* This may fail on some SoCs due to lack of controller support */ + error = enable_irq_wake(keypad->irq); + if (!error) + keypad->wake_enabled = true; + + val = readl(keypad->base + SAMSUNG_KEYIFCON); + val |= SAMSUNG_KEYIFCON_WAKEUPEN; + writel(val, keypad->base + SAMSUNG_KEYIFCON); + + clk_disable(keypad->clk); + + return 0; +} + +static int samsung_keypad_runtime_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct samsung_keypad *keypad = platform_get_drvdata(pdev); + unsigned int val; + + if (keypad->stopped) + return 0; + + clk_enable(keypad->clk); + + val = readl(keypad->base + SAMSUNG_KEYIFCON); + val &= ~SAMSUNG_KEYIFCON_WAKEUPEN; + writel(val, keypad->base + SAMSUNG_KEYIFCON); + + if (keypad->wake_enabled) + disable_irq_wake(keypad->irq); + + return 0; +} +#endif + +#ifdef CONFIG_PM_SLEEP +static void samsung_keypad_toggle_wakeup(struct samsung_keypad *keypad, + bool enable) +{ + unsigned int val; + + clk_enable(keypad->clk); + + val = readl(keypad->base + SAMSUNG_KEYIFCON); + if (enable) { + val |= SAMSUNG_KEYIFCON_WAKEUPEN; + if (device_may_wakeup(&keypad->pdev->dev)) + enable_irq_wake(keypad->irq); + } else { + val &= ~SAMSUNG_KEYIFCON_WAKEUPEN; + if (device_may_wakeup(&keypad->pdev->dev)) + disable_irq_wake(keypad->irq); + } + writel(val, keypad->base + SAMSUNG_KEYIFCON); + + clk_disable(keypad->clk); +} + +static int samsung_keypad_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct samsung_keypad *keypad = platform_get_drvdata(pdev); + struct input_dev *input_dev = keypad->input_dev; + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + samsung_keypad_stop(keypad); + + samsung_keypad_toggle_wakeup(keypad, true); + + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int samsung_keypad_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct samsung_keypad *keypad = platform_get_drvdata(pdev); + struct input_dev *input_dev = keypad->input_dev; + + mutex_lock(&input_dev->mutex); + + samsung_keypad_toggle_wakeup(keypad, false); + + if (input_dev->users) + samsung_keypad_start(keypad); + + mutex_unlock(&input_dev->mutex); + + return 0; +} +#endif + +static const struct dev_pm_ops samsung_keypad_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(samsung_keypad_suspend, samsung_keypad_resume) + SET_RUNTIME_PM_OPS(samsung_keypad_runtime_suspend, + samsung_keypad_runtime_resume, NULL) +}; + +#ifdef CONFIG_OF +static const struct of_device_id samsung_keypad_dt_match[] = { + { .compatible = "samsung,s3c6410-keypad" }, + { .compatible = "samsung,s5pv210-keypad" }, + {}, +}; +MODULE_DEVICE_TABLE(of, samsung_keypad_dt_match); +#endif + +static struct platform_device_id samsung_keypad_driver_ids[] = { + { + .name = "samsung-keypad", + .driver_data = KEYPAD_TYPE_SAMSUNG, + }, { + .name = "s5pv210-keypad", + .driver_data = KEYPAD_TYPE_S5PV210, + }, + { }, +}; +MODULE_DEVICE_TABLE(platform, samsung_keypad_driver_ids); + +static struct platform_driver samsung_keypad_driver = { + .probe = samsung_keypad_probe, + .remove = samsung_keypad_remove, + .driver = { + .name = "samsung-keypad", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(samsung_keypad_dt_match), + .pm = &samsung_keypad_pm_ops, + }, + .id_table = samsung_keypad_driver_ids, +}; +module_platform_driver(samsung_keypad_driver); + +MODULE_DESCRIPTION("Samsung keypad driver"); +MODULE_AUTHOR("Joonyoung Shim "); +MODULE_AUTHOR("Donghwa Lee "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/sc_keypad.c b/drivers/input/keyboard/sc_keypad.c new file mode 100644 index 00000000..abe32e81 --- /dev/null +++ b/drivers/input/keyboard/sc_keypad.c @@ -0,0 +1,802 @@ +/* + * Copyright (C) 2012 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define DEBUG_KEYPAD 0 + +#ifndef CONFIG_OF +#define KPD_REG_BASE (SPRD_KPD_BASE) +#else +static unsigned long KPD_REG_BASE; +#endif + +#define KPD_CTRL (KPD_REG_BASE + 0x00) +#define KPD_EN (0x01 << 0) +#define KPD_SLEEP_EN (0x01 << 1) +#define KPD_LONG_KEY_EN (0x01 << 2) + +//v0 +#define KPDCTL_ROW_MSK_V0 (0x3f << 18) /* enable rows 2 - 7 */ +#define KPDCTL_COL_MSK_V0 (0x3f << 10) /* enable cols 2 - 7 */ + +//v1 +#define KPDCTL_ROW_MSK_V1 (0xff << 16) /* enable rows 0 - 7 */ +#define KPDCTL_COL_MSK_V1 (0xff << 8) /* enable cols 0 - 7 */ + +#define KPD_INT_EN (KPD_REG_BASE + 0x04) +#define KPD_INT_RAW_STATUS (KPD_REG_BASE + 0x08) +#define KPD_INT_MASK_STATUS (KPD_REG_BASE + 0x0C) +#define KPD_INT_ALL (0xfff) +#define KPD_INT_DOWNUP (0x0ff) +#define KPD_INT_LONG (0xf00) +#define KPD_PRESS_INT0 (1 << 0) +#define KPD_PRESS_INT1 (1 << 1) +#define KPD_PRESS_INT2 (1 << 2) +#define KPD_PRESS_INT3 (1 << 3) +#define KPD_RELEASE_INT0 (1 << 4) +#define KPD_RELEASE_INT1 (1 << 5) +#define KPD_RELEASE_INT2 (1 << 6) +#define KPD_RELEASE_INT3 (1 << 7) +#define KPD_LONG_KEY_INT0 (1 << 8) +#define KPD_LONG_KEY_INT1 (1 << 9) +#define KPD_LONG_KEY_INT2 (1 << 10) +#define KPD_LONG_KEY_INT3 (1 << 11) + +#define KPD_INT_CLR (KPD_REG_BASE + 0x10) +#define KPD_POLARITY (KPD_REG_BASE + 0x18) +#define KPD_CFG_ROW_POLARITY (0xff) +#define KPD_CFG_COL_POLARITY (0xFF00) +#define CFG_ROW_POLARITY (KPD_CFG_ROW_POLARITY & 0x00FF) +#define CFG_COL_POLARITY (KPD_CFG_COL_POLARITY & 0xFF00) + +#define KPD_DEBOUNCE_CNT (KPD_REG_BASE + 0x1C) +#define KPD_LONG_KEY_CNT (KPD_REG_BASE + 0x20) + +#define KPD_SLEEP_CNT (KPD_REG_BASE + 0x24) +#define KPD_SLEEP_CNT_VALUE(_X_MS_) (_X_MS_ * 32.768 -1) +#define KPD_CLK_DIV_CNT (KPD_REG_BASE + 0x28) + +#define KPD_KEY_STATUS (KPD_REG_BASE + 0x2C) +#define KPD_INT0_COL(_X_) (((_X_)>> 0) & 0x7) +#define KPD_INT0_ROW(_X_) (((_X_)>> 4) & 0x7) +#define KPD_INT0_DOWN(_X_) (((_X_)>> 7) & 0x1) +#define KPD_INT1_COL(_X_) (((_X_)>> 8) & 0x7) +#define KPD_INT1_ROW(_X_) (((_X_)>> 12) & 0x7) +#define KPD_INT1_DOWN(_X_) (((_X_)>> 15) & 0x1) +#define KPD_INT2_COL(_X_) (((_X_)>> 16) & 0x7) +#define KPD_INT2_ROW(_X_) (((_X_)>> 20) & 0x7) +#define KPD_INT2_DOWN(_X_) (((_X_)>> 23) & 0x1) +#define KPD_INT3_COL(_X_) (((_X_)>> 24) & 0x7) +#define KPD_INT3_ROW(_X_) (((_X_)>> 28) & 0x7) +#define KPD_INT3_DOWN(_X_) (((_X_)>> 31) & 0x1) + +#define KPD_SLEEP_STATUS (KPD_REG_BASE + 0x0030) +#define KPD_DEBUG_STATUS1 (KPD_REG_BASE + 0x0034) +#define KPD_DEBUG_STATUS2 (KPD_REG_BASE + 0x0038) + +#ifndef CONFIG_OF +#define PB_INT EIC_KEY_POWER +#else +static int PB_INT; +#endif + +#if defined(CONFIG_ARCH_SC8825) +static __devinit void __keypad_enable(void) +{ + sci_glb_set(REG_GLB_SOFT_RST, BIT_KPD_RST); + mdelay(2); + sci_glb_clr(REG_GLB_SOFT_RST, BIT_KPD_RST); + sci_glb_set(REG_GLB_GEN0, BIT_KPD_EB | BIT_RTC_KPD_EB); +} +static __devexit void __keypad_disable(void) +{ + sci_glb_clr(REG_GLB_GEN0, BIT_KPD_EB | BIT_RTC_KPD_EB); +} + +static int __keypad_controller_ver(void) +{ + return 0; +} + +#elif defined(CONFIG_ARCH_SCX35) +static void __keypad_enable(void) +{ + sci_glb_set(REG_AON_APB_APB_RST0, BIT_KPD_SOFT_RST); + mdelay(2); + sci_glb_clr(REG_AON_APB_APB_RST0, BIT_KPD_SOFT_RST); + sci_glb_set(REG_AON_APB_APB_EB0, BIT_KPD_EB); + sci_glb_set(REG_AON_APB_APB_RTC_EB, BIT_KPD_RTC_EB); +} + +static void __keypad_disable(void) +{ + sci_glb_clr(REG_AON_APB_APB_EB0, BIT_KPD_EB); + sci_glb_clr(REG_AON_APB_APB_RTC_EB, BIT_KPD_RTC_EB); +} +static int __keypad_controller_ver(void) +{ + return 1; +} + +#else +#error "Pls fill the low level enable function" +#endif + +struct sci_keypad_t { + struct input_dev *input_dev; + int irq; + int rows; + int cols; + unsigned int keyup_test_jiffies; +}; + + +#if DEBUG_KEYPAD +static void dump_keypad_register(void) +{ +#define INT_MASK_STS (SPRD_INTC1_BASE + 0x0000) +#define INT_RAW_STS (SPRD_INTC1_BASE + 0x0004) +#define INT_EN (SPRD_INTC1_BASE + 0x0008) +#define INT_DIS (SPRD_INTC1_BASE + 0x000C) + + printk("\nREG_INT_MASK_STS = 0x%08x\n", __raw_readl(INT_MASK_STS)); + printk("REG_INT_RAW_STS = 0x%08x\n", __raw_readl(INT_RAW_STS)); + printk("REG_INT_EN = 0x%08x\n", __raw_readl(INT_EN)); + printk("REG_INT_DIS = 0x%08x\n", __raw_readl(INT_DIS)); + printk("REG_KPD_CTRL = 0x%08x\n", __raw_readl(KPD_CTRL)); + printk("REG_KPD_INT_EN = 0x%08x\n", __raw_readl(KPD_INT_EN)); + printk("REG_KPD_INT_RAW_STATUS = 0x%08x\n", + __raw_readl(KPD_INT_RAW_STATUS)); + printk("REG_KPD_INT_MASK_STATUS = 0x%08x\n", + __raw_readl(KPD_INT_MASK_STATUS)); + printk("REG_KPD_INT_CLR = 0x%08x\n", __raw_readl(KPD_INT_CLR)); + printk("REG_KPD_POLARITY = 0x%08x\n", __raw_readl(KPD_POLARITY)); + printk("REG_KPD_DEBOUNCE_CNT = 0x%08x\n", + __raw_readl(KPD_DEBOUNCE_CNT)); + printk("REG_KPD_LONG_KEY_CNT = 0x%08x\n", + __raw_readl(KPD_LONG_KEY_CNT)); + printk("REG_KPD_SLEEP_CNT = 0x%08x\n", __raw_readl(KPD_SLEEP_CNT)); + printk("REG_KPD_CLK_DIV_CNT = 0x%08x\n", __raw_readl(KPD_CLK_DIV_CNT)); + printk("REG_KPD_KEY_STATUS = 0x%08x\n", __raw_readl(KPD_KEY_STATUS)); + printk("REG_KPD_SLEEP_STATUS = 0x%08x\n", + __raw_readl(KPD_SLEEP_STATUS)); +} +#else +static void dump_keypad_register(void) +{ +} +#endif + + + +static irqreturn_t sci_keypad_isr(int irq, void *dev_id) +{ + unsigned short key = 0; + unsigned long value; + struct sci_keypad_t *sci_kpd = dev_id; + unsigned long int_status = __raw_readl(KPD_INT_MASK_STATUS); + unsigned long key_status = __raw_readl(KPD_KEY_STATUS); + unsigned short *keycodes = sci_kpd->input_dev->keycode; + unsigned int row_shift = get_count_order(sci_kpd->cols); + int col, row; + /* add by lgd */ + static unsigned int press_flag = 1; + + value = __raw_readl(KPD_INT_CLR); + value |= KPD_INT_ALL; + __raw_writel(value, KPD_INT_CLR); + /* < changed by lgd */ + if ((int_status & KPD_PRESS_INT0)) { + if (press_flag) { + col = KPD_INT0_COL(key_status); + row = KPD_INT0_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + input_report_key(sci_kpd->input_dev, key, 1); + input_sync(sci_kpd->input_dev); + printk("%03dD, press_flag = %d, set press_flag = 0\n", + key, press_flag); + press_flag = 0; + } else { + printk("%03dD-OHH, button double press\n", key); + } + } + if (int_status & KPD_RELEASE_INT0) { + col = KPD_INT0_COL(key_status); + row = KPD_INT0_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 0); + input_sync(sci_kpd->input_dev); + press_flag = 1; + printk("%03dU, force set press_flag = 1\n", key); + } + /* changed by lgd > */ + + if ((int_status & KPD_PRESS_INT1)) { + col = KPD_INT1_COL(key_status); + row = KPD_INT1_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 1); + input_sync(sci_kpd->input_dev); + printk("%03dD\n", key); + } + if (int_status & KPD_RELEASE_INT1) { + col = KPD_INT1_COL(key_status); + row = KPD_INT1_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 0); + input_sync(sci_kpd->input_dev); + printk("%03dU\n", key); + } + + if ((int_status & KPD_PRESS_INT2)) { + col = KPD_INT2_COL(key_status); + row = KPD_INT2_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 1); + input_sync(sci_kpd->input_dev); + printk("%03d\n", key); + } + if (int_status & KPD_RELEASE_INT2) { + col = KPD_INT2_COL(key_status); + row = KPD_INT2_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 0); + input_sync(sci_kpd->input_dev); + printk("%03d\n", key); + } + + if (int_status & KPD_PRESS_INT3) { + col = KPD_INT3_COL(key_status); + row = KPD_INT3_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 1); + input_sync(sci_kpd->input_dev); + printk("%03d\n", key); + } + if (int_status & KPD_RELEASE_INT3) { + col = KPD_INT3_COL(key_status); + row = KPD_INT3_ROW(key_status); + key = keycodes[MATRIX_SCAN_CODE(row, col, row_shift)]; + + input_report_key(sci_kpd->input_dev, key, 0); + input_sync(sci_kpd->input_dev); + printk("%03d\n", key); + } + + return IRQ_HANDLED; +} + +static irqreturn_t sci_powerkey_isr(int irq, void *dev_id) +{ //TODO: if usign gpio(eic), need add row , cols to platform data. + static unsigned long last_value = 1; + unsigned short key = KEY_POWER; + unsigned long value = !(gpio_get_value(PB_INT)); + struct sci_keypad_t *sci_kpd = dev_id; + + if (last_value == value) { + /* seems an event is missing, just report it */ + input_report_key(sci_kpd->input_dev, key, last_value); + input_sync(sci_kpd->input_dev); + + printk("%dX\n", key); + } + + if (value) { + /* Release : low level */ +#ifdef HOOK_POWER_KEY + input_report_key_hook(sci_kpd->input_dev, key, 0); +#endif + input_report_key(sci_kpd->input_dev, key, 0); + input_sync(sci_kpd->input_dev); + printk("Powerkey:%dU\n", key); + irq_set_irq_type(irq, IRQF_TRIGGER_HIGH); + } else { + /* Press : high level */ +#ifdef HOOK_POWER_KEY + input_report_key_hook(sci_kpd->input_dev, key, 1); +#endif + input_report_key(sci_kpd->input_dev, key, 1); + input_sync(sci_kpd->input_dev); + printk("Powerkey:%dD\n", key); + irq_set_irq_type(irq, IRQF_TRIGGER_LOW); + } + + last_value = value; + + return IRQ_HANDLED; +} +#ifdef CONFIG_OF +static struct sci_keypad_platdata *sci_keypad_parse_dt( + struct device *dev) +{ + struct sci_keypad_platform_data *pdata; + struct device_node *np = dev->of_node, *key_np; + uint32_t num_rows, num_cols; + uint32_t rows_choose_hw, cols_choose_hw; + uint32_t debounce_time; + struct matrix_keymap_data *keymap_data; + uint32_t *keymap, key_count; + struct resource res; + int ret; + + ret = of_address_to_resource(np, 0, &res); + if(ret < 0){ + dev_err(dev, "no reg of property specified\n"); + return NULL; + } + KPD_REG_BASE = (unsigned long)ioremap_nocache(res.start, + resource_size(&res)); + if(!KPD_REG_BASE) + BUG(); + PB_INT = of_get_gpio(np, 0); + if(PB_INT < 0){ + dev_err(dev, "no gpios of property specified\n"); + return NULL; + } + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "could not allocate memory for platform data\n"); + return NULL; + } + ret = of_property_read_u32(np, "sprd,keypad-num-rows", &num_rows); + if(ret){ + dev_err(dev, "no sprd,keypad-num-rows of property specified\n"); + goto fail; + } + pdata->rows_number = num_rows; + + ret = of_property_read_u32(np, "sprd,keypad-num-columns", &num_cols); + if(ret){ + dev_err(dev, "no sprd,keypad-num-columns of property specified\n"); + goto fail; + } + pdata->cols_number = num_cols; + + ret = of_property_read_u32(np, "sprd,debounce_time", &debounce_time); + if(ret){ + debounce_time = 0; + } + pdata->debounce_time = debounce_time; + + if (of_get_property(np, "linux,input-no-autorepeat", NULL)) + pdata->repeat = false; + if(of_get_property(np, "sprd,support_long_key", NULL)) + pdata->support_long_key = false; + if (of_get_property(np, "linux,input-wakeup", NULL)) + pdata->wakeup = true; + + + ret = of_property_read_u32(np, "sprd,keypad-rows-choose-hw", &rows_choose_hw); + if(ret){ + dev_err(dev, "no sprd,keypad-rows-choose-hw of property specified\n"); + goto fail; + } + pdata->rows_choose_hw = rows_choose_hw; + + ret = of_property_read_u32(np, "sprd,keypad-cols-choose-hw", &cols_choose_hw); + if(ret){ + dev_err(dev, "no sprd,keypad-cols-choose-hw of property specified\n"); + goto fail; + } + pdata->cols_choose_hw = cols_choose_hw; + + keymap_data = kzalloc(sizeof(*keymap_data), GFP_KERNEL); + if (!keymap_data) { + dev_err(dev, "could not allocate memory for keymap_data\n"); + goto fail; + } + pdata->keymap_data = keymap_data; + + key_count = of_get_child_count(np); + keymap_data->keymap_size = key_count; + keymap = kzalloc(sizeof(uint32_t) * key_count, GFP_KERNEL); + if (!keymap) { + dev_err(dev, "could not allocate memory for keymap\n"); + goto fail_keymap; + } + keymap_data->keymap = keymap; + + for_each_child_of_node(np, key_np) { + u32 row, col, key_code; + ret = of_property_read_u32(key_np, "keypad,row", &row); + if(ret) + goto fail_parse_keymap; + ret = of_property_read_u32(key_np, "keypad,column", &col); + if(ret) + goto fail_parse_keymap; + ret = of_property_read_u32(key_np, "linux,code", &key_code); + if(ret) + goto fail_parse_keymap; + *keymap++ = KEY(row, col, key_code); + pr_info("sci_keypad_parse_dt: %d, %d, %d\n",row, col, key_code); + } + + + return pdata; + +fail_parse_keymap: + dev_err(dev, "failed parsing keymap\n"); + kfree(keymap); + keymap_data->keymap = NULL; +fail_keymap: + kfree(keymap_data); + pdata->keymap_data = NULL; +fail: + kfree(pdata); + return NULL; +} +#else +static struct sci_keypad_platdata *sci_keypad_parse_dt( + struct device *dev) +{ + return NULL; +} +#endif + +/*****************/ +static int sprd_eic_button_state(void) +{ + int button_state = 0; + int gpio_value = 0; + + gpio_value = !!gpio_get_value(PB_INT); + + //if(1 == button->active_low) { + if(0) { + if(0 == gpio_value) + button_state = 1; + else + button_state = 0; + } else { + if(1 == gpio_value) + button_state = 1; + else + button_state = 0; + } + + printk("GPIO_%d=%d, button_state=%d\n", PB_INT, gpio_value, button_state); + + return button_state; //0==released, 1==pressed +} + +static ssize_t sprd_eic_button_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + int status = 0; + + status = sprd_eic_button_state(); + printk("button status = %d (0 == released, 1 == pressed)\n", status); + return sprintf(buff, "%d\n", status); +} + +static struct kobject *sprd_eic_button_kobj = NULL; +static struct kobj_attribute sprd_eic_button_attr = + __ATTR(status, 0644, sprd_eic_button_show, NULL); + +static int sprd_eic_button_sysfs_init(void) +{ + int ret = -1; + + sprd_eic_button_kobj = kobject_create_and_add("sprd_eic_button", kernel_kobj); + if (sprd_eic_button_kobj == NULL) { + ret = -ENOMEM; + printk("register sysfs failed. ret = %d\n", ret); + return ret; + } + + ret = sysfs_create_file(sprd_eic_button_kobj, &sprd_eic_button_attr.attr); + if (ret) { + printk("create sysfs failed. ret = %d\n", ret); + return ret; + } + + printk("sprd_eic_button_sysfs_init success\n"); + return ret; +} +/*****************/ + +static int sci_keypad_probe(struct platform_device *pdev) +{ + struct sci_keypad_t *sci_kpd; + struct input_dev *input_dev; + struct sci_keypad_platform_data *pdata = pdev->dev.platform_data; + int error; + unsigned long value; + unsigned int row_shift, keycodemax; + struct device_node *np = pdev->dev.of_node; + + if (pdev->dev.of_node && !pdata){ + pdata = sci_keypad_parse_dt(&pdev->dev); + if(pdata) + pdev->dev.platform_data = pdata; + } + + if (!pdata) { + printk(KERN_WARNING "sci_keypad_probe get platform_data NULL\n"); + error = -EINVAL; + goto out0; + } + row_shift = get_count_order(pdata->cols_number); + keycodemax = pdata->rows_number << row_shift; + + sci_kpd = kzalloc(sizeof(struct sci_keypad_t) + + keycodemax * sizeof(unsigned short), GFP_KERNEL); + input_dev = input_allocate_device(); + + if (!sci_kpd || !input_dev) { + error = -ENOMEM; + goto out1; + } + platform_set_drvdata(pdev, sci_kpd); + + sci_kpd->input_dev = input_dev; + sci_kpd->rows = pdata->rows_number; + sci_kpd->cols = pdata->cols_number; + + __keypad_enable(); + + __raw_writel(KPD_INT_ALL, KPD_INT_CLR); + __raw_writel(CFG_ROW_POLARITY | CFG_COL_POLARITY, KPD_POLARITY); + __raw_writel(1, KPD_CLK_DIV_CNT); + __raw_writel(0xc, KPD_LONG_KEY_CNT); + __raw_writel(0x5, KPD_DEBOUNCE_CNT); + + sci_kpd->irq = platform_get_irq(pdev, 0); + if (sci_kpd->irq < 0) { + error = -ENODEV; + dev_err(&pdev->dev, "Get irq number error,Keypad Module\n"); + goto out2; + } + error = + request_irq(sci_kpd->irq, sci_keypad_isr, IRQF_NO_SUSPEND, "sci-keypad", sci_kpd); + if (error) { + dev_err(&pdev->dev, "unable to claim irq %d\n", sci_kpd->irq); + goto out2; + } +#ifndef CONFIG_OF + input_dev->name = pdev->name; +#else + input_dev->name = "sci-keypad"; +#endif + input_dev->phys = "sci-key/input0"; + input_dev->dev.parent = &pdev->dev; + input_set_drvdata(input_dev, sci_kpd); + + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + + input_dev->keycode = &sci_kpd[1]; + input_dev->keycodesize = sizeof(unsigned short); + input_dev->keycodemax = keycodemax; + + matrix_keypad_build_keymap(pdata->keymap_data, NULL, pdata->rows_number, pdata->cols_number, + input_dev->keycode, input_dev); + + /* there are keys from hw other than keypad controller */ + __set_bit(KEY_POWER, input_dev->keybit); + __set_bit(EV_KEY, input_dev->evbit); + if (pdata->repeat) + __set_bit(EV_REP, input_dev->evbit); + + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, "unable to register input device\n"); + goto out3; + } + device_init_wakeup(&pdev->dev, 1); + + value = KPD_INT_DOWNUP; + if (pdata->support_long_key) + value |= KPD_INT_LONG; + __raw_writel(value, KPD_INT_EN); + value = KPD_SLEEP_CNT_VALUE(1000); + __raw_writel(value, KPD_SLEEP_CNT); + + if (__keypad_controller_ver() == 0) { + if ((pdata->rows_choose_hw & ~KPDCTL_ROW_MSK_V0) + || (pdata->cols_choose_hw & ~KPDCTL_COL_MSK_V0)) { + pr_warn("Error rows_choose_hw Or cols_choose_hw\n"); + } else { + pdata->rows_choose_hw &= KPDCTL_ROW_MSK_V0; + pdata->cols_choose_hw &= KPDCTL_COL_MSK_V0; + } + } else if (__keypad_controller_ver() == 1) { + if ((pdata->rows_choose_hw & ~KPDCTL_ROW_MSK_V1) + || (pdata->cols_choose_hw & ~KPDCTL_COL_MSK_V1)) { + pr_warn("Error rows_choose_hw\n"); + } else { + pdata->rows_choose_hw &= KPDCTL_ROW_MSK_V1; + pdata->cols_choose_hw &= KPDCTL_COL_MSK_V1; + } + } else { + pr_warn + ("This driver don't support this keypad controller version Now\n"); + } + value = + KPD_EN | KPD_SLEEP_EN | pdata-> + rows_choose_hw | pdata->cols_choose_hw; + if (pdata->support_long_key) + value |= KPD_LONG_KEY_EN; + __raw_writel(value, KPD_CTRL); + + gpio_request(PB_INT, "powerkey"); + gpio_direction_input(PB_INT); + error = request_irq(gpio_to_irq(PB_INT), sci_powerkey_isr, + IRQF_TRIGGER_HIGH | IRQF_NO_SUSPEND, + "powerkey", sci_kpd); + if (error) { + dev_err(&pdev->dev, "unable to claim irq %d\n", + gpio_to_irq(PB_INT)); + goto out3; + } + + dump_keypad_register(); + sprd_eic_button_sysfs_init(); + return 0; + + free_irq(gpio_to_irq(PB_INT), pdev); +out3: + input_free_device(input_dev); + free_irq(sci_kpd->irq, pdev); +out2: + platform_set_drvdata(pdev, NULL); +out1: + kfree(sci_kpd); +out0: + return error; +} + +static int sci_keypad_remove(struct + platform_device + *pdev) +{ + unsigned long value; + struct sci_keypad_t *sci_kpd = platform_get_drvdata(pdev); + struct sci_keypad_platform_data *pdata = pdev->dev.platform_data; + /* disable sci keypad controller */ + __raw_writel(KPD_INT_ALL, KPD_INT_CLR); + value = __raw_readl(KPD_CTRL); + value &= ~(1 << 0); + __raw_writel(value, KPD_CTRL); + + __keypad_disable(); + + free_irq(sci_kpd->irq, pdev); + input_unregister_device(sci_kpd->input_dev); + kfree(sci_kpd); + platform_set_drvdata(pdev, NULL); + if(pdev->dev.of_node){ + kfree(pdata->keymap_data->keymap); + kfree(pdata->keymap_data); + kfree(pdata); + } + return 0; +} + +#ifdef CONFIG_PM +static int sci_keypad_suspend(struct platform_device *dev, pm_message_t state) +{ + return 0; +} + +static int sci_keypad_resume(struct platform_device *dev) +{ + struct sci_keypad_platform_data *pdata = dev->dev.platform_data; + unsigned long value; + + __keypad_enable(); + __raw_writel(KPD_INT_ALL, KPD_INT_CLR); + __raw_writel(CFG_ROW_POLARITY | CFG_COL_POLARITY, KPD_POLARITY); + __raw_writel(1, KPD_CLK_DIV_CNT); + __raw_writel(0xc, KPD_LONG_KEY_CNT); + __raw_writel(0x5, KPD_DEBOUNCE_CNT); + + value = KPD_INT_DOWNUP; + if (pdata->support_long_key) + value |= KPD_INT_LONG; + __raw_writel(value, KPD_INT_EN); + value = KPD_SLEEP_CNT_VALUE(1000); + __raw_writel(value, KPD_SLEEP_CNT); + + value = + KPD_EN | KPD_SLEEP_EN | pdata-> + rows_choose_hw | pdata->cols_choose_hw; + if (pdata->support_long_key) + value |= KPD_LONG_KEY_EN; + __raw_writel(value, KPD_CTRL); + + return 0; +} +#else +#define sci_keypad_suspend NULL +#define sci_keypad_resume NULL +#endif + +static struct of_device_id keypad_match_table[] = { + { .compatible = "sprd,sci-keypad", }, + { }, +}; +struct platform_driver sci_keypad_driver = { + .probe = sci_keypad_probe, + .remove = sci_keypad_remove, + .suspend = sci_keypad_suspend, + .resume = sci_keypad_resume, + .driver = { + .name = "sci-keypad",.owner = THIS_MODULE, + .of_match_table = keypad_match_table, + }, +}; + +static int __init sci_keypad_init(void) +{ +#ifdef HOOK_POWER_KEY + input_hook_init(); +#endif + return platform_driver_register(&sci_keypad_driver); +} + +static void __exit sci_keypad_exit(void) +{ +#ifdef HOOK_POWER_KEY + input_hook_exit(); +#endif + platform_driver_unregister(&sci_keypad_driver); +} + +module_init(sci_keypad_init); +module_exit(sci_keypad_exit); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("spreadtrum.com"); +MODULE_DESCRIPTION("Keypad driver for spreadtrum:questions contact steve zhan"); +MODULE_ALIAS("platform:sci-keypad"); diff --git a/drivers/input/keyboard/sh_keysc.c b/drivers/input/keyboard/sh_keysc.c new file mode 100644 index 00000000..fdb9eb2d --- /dev/null +++ b/drivers/input/keyboard/sh_keysc.c @@ -0,0 +1,344 @@ +/* + * SuperH KEYSC Keypad Driver + * + * Copyright (C) 2008 Magnus Damm + * + * Based on gpio_keys.c, Copyright 2005 Phil Blundell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const struct { + unsigned char kymd, keyout, keyin; +} sh_keysc_mode[] = { + [SH_KEYSC_MODE_1] = { 0, 6, 5 }, + [SH_KEYSC_MODE_2] = { 1, 5, 6 }, + [SH_KEYSC_MODE_3] = { 2, 4, 7 }, + [SH_KEYSC_MODE_4] = { 3, 6, 6 }, + [SH_KEYSC_MODE_5] = { 4, 6, 7 }, + [SH_KEYSC_MODE_6] = { 5, 8, 8 }, +}; + +struct sh_keysc_priv { + void __iomem *iomem_base; + DECLARE_BITMAP(last_keys, SH_KEYSC_MAXKEYS); + struct input_dev *input; + struct sh_keysc_info pdata; +}; + +#define KYCR1 0 +#define KYCR2 1 +#define KYINDR 2 +#define KYOUTDR 3 + +#define KYCR2_IRQ_LEVEL 0x10 +#define KYCR2_IRQ_DISABLED 0x00 + +static unsigned long sh_keysc_read(struct sh_keysc_priv *p, int reg_nr) +{ + return ioread16(p->iomem_base + (reg_nr << 2)); +} + +static void sh_keysc_write(struct sh_keysc_priv *p, int reg_nr, + unsigned long value) +{ + iowrite16(value, p->iomem_base + (reg_nr << 2)); +} + +static void sh_keysc_level_mode(struct sh_keysc_priv *p, + unsigned long keys_set) +{ + struct sh_keysc_info *pdata = &p->pdata; + + sh_keysc_write(p, KYOUTDR, 0); + sh_keysc_write(p, KYCR2, KYCR2_IRQ_LEVEL | (keys_set << 8)); + + if (pdata->kycr2_delay) + udelay(pdata->kycr2_delay); +} + +static void sh_keysc_map_dbg(struct device *dev, unsigned long *map, + const char *str) +{ + int k; + + for (k = 0; k < BITS_TO_LONGS(SH_KEYSC_MAXKEYS); k++) + dev_dbg(dev, "%s[%d] 0x%lx\n", str, k, map[k]); +} + +static irqreturn_t sh_keysc_isr(int irq, void *dev_id) +{ + struct platform_device *pdev = dev_id; + struct sh_keysc_priv *priv = platform_get_drvdata(pdev); + struct sh_keysc_info *pdata = &priv->pdata; + int keyout_nr = sh_keysc_mode[pdata->mode].keyout; + int keyin_nr = sh_keysc_mode[pdata->mode].keyin; + DECLARE_BITMAP(keys, SH_KEYSC_MAXKEYS); + DECLARE_BITMAP(keys0, SH_KEYSC_MAXKEYS); + DECLARE_BITMAP(keys1, SH_KEYSC_MAXKEYS); + unsigned char keyin_set, tmp; + int i, k, n; + + dev_dbg(&pdev->dev, "isr!\n"); + + bitmap_fill(keys1, SH_KEYSC_MAXKEYS); + bitmap_zero(keys0, SH_KEYSC_MAXKEYS); + + do { + bitmap_zero(keys, SH_KEYSC_MAXKEYS); + keyin_set = 0; + + sh_keysc_write(priv, KYCR2, KYCR2_IRQ_DISABLED); + + for (i = 0; i < keyout_nr; i++) { + n = keyin_nr * i; + + /* drive one KEYOUT pin low, read KEYIN pins */ + sh_keysc_write(priv, KYOUTDR, 0xffff ^ (3 << (i * 2))); + udelay(pdata->delay); + tmp = sh_keysc_read(priv, KYINDR); + + /* set bit if key press has been detected */ + for (k = 0; k < keyin_nr; k++) { + if (tmp & (1 << k)) + __set_bit(n + k, keys); + } + + /* keep track of which KEYIN bits that have been set */ + keyin_set |= tmp ^ ((1 << keyin_nr) - 1); + } + + sh_keysc_level_mode(priv, keyin_set); + + bitmap_complement(keys, keys, SH_KEYSC_MAXKEYS); + bitmap_and(keys1, keys1, keys, SH_KEYSC_MAXKEYS); + bitmap_or(keys0, keys0, keys, SH_KEYSC_MAXKEYS); + + sh_keysc_map_dbg(&pdev->dev, keys, "keys"); + + } while (sh_keysc_read(priv, KYCR2) & 0x01); + + sh_keysc_map_dbg(&pdev->dev, priv->last_keys, "last_keys"); + sh_keysc_map_dbg(&pdev->dev, keys0, "keys0"); + sh_keysc_map_dbg(&pdev->dev, keys1, "keys1"); + + for (i = 0; i < SH_KEYSC_MAXKEYS; i++) { + k = pdata->keycodes[i]; + if (!k) + continue; + + if (test_bit(i, keys0) == test_bit(i, priv->last_keys)) + continue; + + if (test_bit(i, keys1) || test_bit(i, keys0)) { + input_event(priv->input, EV_KEY, k, 1); + __set_bit(i, priv->last_keys); + } + + if (!test_bit(i, keys1)) { + input_event(priv->input, EV_KEY, k, 0); + __clear_bit(i, priv->last_keys); + } + + } + input_sync(priv->input); + + return IRQ_HANDLED; +} + +static int sh_keysc_probe(struct platform_device *pdev) +{ + struct sh_keysc_priv *priv; + struct sh_keysc_info *pdata; + struct resource *res; + struct input_dev *input; + int i; + int irq, error; + + if (!pdev->dev.platform_data) { + dev_err(&pdev->dev, "no platform data defined\n"); + error = -EINVAL; + goto err0; + } + + error = -ENXIO; + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (res == NULL) { + dev_err(&pdev->dev, "failed to get I/O memory\n"); + goto err0; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get irq\n"); + goto err0; + } + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (priv == NULL) { + dev_err(&pdev->dev, "failed to allocate driver data\n"); + error = -ENOMEM; + goto err0; + } + + platform_set_drvdata(pdev, priv); + memcpy(&priv->pdata, pdev->dev.platform_data, sizeof(priv->pdata)); + pdata = &priv->pdata; + + priv->iomem_base = ioremap_nocache(res->start, resource_size(res)); + if (priv->iomem_base == NULL) { + dev_err(&pdev->dev, "failed to remap I/O memory\n"); + error = -ENXIO; + goto err1; + } + + priv->input = input_allocate_device(); + if (!priv->input) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + error = -ENOMEM; + goto err2; + } + + input = priv->input; + input->evbit[0] = BIT_MASK(EV_KEY); + + input->name = pdev->name; + input->phys = "sh-keysc-keys/input0"; + input->dev.parent = &pdev->dev; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + input->keycode = pdata->keycodes; + input->keycodesize = sizeof(pdata->keycodes[0]); + input->keycodemax = ARRAY_SIZE(pdata->keycodes); + + error = request_threaded_irq(irq, NULL, sh_keysc_isr, IRQF_ONESHOT, + dev_name(&pdev->dev), pdev); + if (error) { + dev_err(&pdev->dev, "failed to request IRQ\n"); + goto err3; + } + + for (i = 0; i < SH_KEYSC_MAXKEYS; i++) + __set_bit(pdata->keycodes[i], input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto err4; + } + + pm_runtime_enable(&pdev->dev); + pm_runtime_get_sync(&pdev->dev); + + sh_keysc_write(priv, KYCR1, (sh_keysc_mode[pdata->mode].kymd << 8) | + pdata->scan_timing); + sh_keysc_level_mode(priv, 0); + + device_init_wakeup(&pdev->dev, 1); + + return 0; + + err4: + free_irq(irq, pdev); + err3: + input_free_device(input); + err2: + iounmap(priv->iomem_base); + err1: + platform_set_drvdata(pdev, NULL); + kfree(priv); + err0: + return error; +} + +static int sh_keysc_remove(struct platform_device *pdev) +{ + struct sh_keysc_priv *priv = platform_get_drvdata(pdev); + + sh_keysc_write(priv, KYCR2, KYCR2_IRQ_DISABLED); + + input_unregister_device(priv->input); + free_irq(platform_get_irq(pdev, 0), pdev); + iounmap(priv->iomem_base); + + pm_runtime_put_sync(&pdev->dev); + pm_runtime_disable(&pdev->dev); + + platform_set_drvdata(pdev, NULL); + kfree(priv); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int sh_keysc_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct sh_keysc_priv *priv = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + unsigned short value; + + value = sh_keysc_read(priv, KYCR1); + + if (device_may_wakeup(dev)) { + sh_keysc_write(priv, KYCR1, value | 0x80); + enable_irq_wake(irq); + } else { + sh_keysc_write(priv, KYCR1, value & ~0x80); + pm_runtime_put_sync(dev); + } + + return 0; +} + +static int sh_keysc_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + int irq = platform_get_irq(pdev, 0); + + if (device_may_wakeup(dev)) + disable_irq_wake(irq); + else + pm_runtime_get_sync(dev); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(sh_keysc_dev_pm_ops, + sh_keysc_suspend, sh_keysc_resume); + +static struct platform_driver sh_keysc_device_driver = { + .probe = sh_keysc_probe, + .remove = sh_keysc_remove, + .driver = { + .name = "sh_keysc", + .pm = &sh_keysc_dev_pm_ops, + } +}; +module_platform_driver(sh_keysc_device_driver); + +MODULE_AUTHOR("Magnus Damm"); +MODULE_DESCRIPTION("SuperH KEYSC Keypad Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/spear-keyboard.c b/drivers/input/keyboard/spear-keyboard.c new file mode 100644 index 00000000..cb1e8f61 --- /dev/null +++ b/drivers/input/keyboard/spear-keyboard.c @@ -0,0 +1,404 @@ +/* + * SPEAr Keyboard Driver + * Based on omap-keypad driver + * + * Copyright (C) 2010 ST Microelectronics + * Rajeev Kumar + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Keyboard Registers */ +#define MODE_CTL_REG 0x00 +#define STATUS_REG 0x0C +#define DATA_REG 0x10 +#define INTR_MASK 0x54 + +/* Register Values */ +#define NUM_ROWS 16 +#define NUM_COLS 16 +#define MODE_CTL_PCLK_FREQ_SHIFT 9 +#define MODE_CTL_PCLK_FREQ_MSK 0x7F + +#define MODE_CTL_KEYBOARD (0x2 << 0) +#define MODE_CTL_SCAN_RATE_10 (0x0 << 2) +#define MODE_CTL_SCAN_RATE_20 (0x1 << 2) +#define MODE_CTL_SCAN_RATE_40 (0x2 << 2) +#define MODE_CTL_SCAN_RATE_80 (0x3 << 2) +#define MODE_CTL_KEYNUM_SHIFT 6 +#define MODE_CTL_START_SCAN (0x1 << 8) + +#define STATUS_DATA_AVAIL (0x1 << 1) + +#define DATA_ROW_MASK 0xF0 +#define DATA_COLUMN_MASK 0x0F + +#define ROW_SHIFT 4 + +struct spear_kbd { + struct input_dev *input; + void __iomem *io_base; + struct clk *clk; + unsigned int irq; + unsigned int mode; + unsigned int suspended_rate; + unsigned short last_key; + unsigned short keycodes[NUM_ROWS * NUM_COLS]; + bool rep; + bool irq_wake_enabled; + u32 mode_ctl_reg; +}; + +static irqreturn_t spear_kbd_interrupt(int irq, void *dev_id) +{ + struct spear_kbd *kbd = dev_id; + struct input_dev *input = kbd->input; + unsigned int key; + u32 sts, val; + + sts = readl_relaxed(kbd->io_base + STATUS_REG); + if (!(sts & STATUS_DATA_AVAIL)) + return IRQ_NONE; + + if (kbd->last_key != KEY_RESERVED) { + input_report_key(input, kbd->last_key, 0); + kbd->last_key = KEY_RESERVED; + } + + /* following reads active (row, col) pair */ + val = readl_relaxed(kbd->io_base + DATA_REG) & + (DATA_ROW_MASK | DATA_COLUMN_MASK); + key = kbd->keycodes[val]; + + input_event(input, EV_MSC, MSC_SCAN, val); + input_report_key(input, key, 1); + input_sync(input); + + kbd->last_key = key; + + /* clear interrupt */ + writel_relaxed(0, kbd->io_base + STATUS_REG); + + return IRQ_HANDLED; +} + +static int spear_kbd_open(struct input_dev *dev) +{ + struct spear_kbd *kbd = input_get_drvdata(dev); + int error; + u32 val; + + kbd->last_key = KEY_RESERVED; + + error = clk_enable(kbd->clk); + if (error) + return error; + + /* keyboard rate to be programmed is input clock (in MHz) - 1 */ + val = clk_get_rate(kbd->clk) / 1000000 - 1; + val = (val & MODE_CTL_PCLK_FREQ_MSK) << MODE_CTL_PCLK_FREQ_SHIFT; + + /* program keyboard */ + val = MODE_CTL_SCAN_RATE_80 | MODE_CTL_KEYBOARD | val | + (kbd->mode << MODE_CTL_KEYNUM_SHIFT); + writel_relaxed(val, kbd->io_base + MODE_CTL_REG); + writel_relaxed(1, kbd->io_base + STATUS_REG); + + /* start key scan */ + val = readl_relaxed(kbd->io_base + MODE_CTL_REG); + val |= MODE_CTL_START_SCAN; + writel_relaxed(val, kbd->io_base + MODE_CTL_REG); + + return 0; +} + +static void spear_kbd_close(struct input_dev *dev) +{ + struct spear_kbd *kbd = input_get_drvdata(dev); + u32 val; + + /* stop key scan */ + val = readl_relaxed(kbd->io_base + MODE_CTL_REG); + val &= ~MODE_CTL_START_SCAN; + writel_relaxed(val, kbd->io_base + MODE_CTL_REG); + + clk_disable(kbd->clk); + + kbd->last_key = KEY_RESERVED; +} + +#ifdef CONFIG_OF +static int spear_kbd_parse_dt(struct platform_device *pdev, + struct spear_kbd *kbd) +{ + struct device_node *np = pdev->dev.of_node; + int error; + u32 val, suspended_rate; + + if (!np) { + dev_err(&pdev->dev, "Missing DT data\n"); + return -EINVAL; + } + + if (of_property_read_bool(np, "autorepeat")) + kbd->rep = true; + + if (of_property_read_u32(np, "suspended_rate", &suspended_rate)) + kbd->suspended_rate = suspended_rate; + + error = of_property_read_u32(np, "st,mode", &val); + if (error) { + dev_err(&pdev->dev, "DT: Invalid or missing mode\n"); + return error; + } + + kbd->mode = val; + return 0; +} +#else +static inline int spear_kbd_parse_dt(struct platform_device *pdev, + struct spear_kbd *kbd) +{ + return -ENOSYS; +} +#endif + +static int spear_kbd_probe(struct platform_device *pdev) +{ + struct kbd_platform_data *pdata = dev_get_platdata(&pdev->dev); + const struct matrix_keymap_data *keymap = pdata ? pdata->keymap : NULL; + struct spear_kbd *kbd; + struct input_dev *input_dev; + struct resource *res; + int irq; + int error; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "no keyboard resource defined\n"); + return -EBUSY; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "not able to get irq for the device\n"); + return irq; + } + + kbd = devm_kzalloc(&pdev->dev, sizeof(*kbd), GFP_KERNEL); + if (!kbd) { + dev_err(&pdev->dev, "not enough memory for driver data\n"); + return -ENOMEM; + } + + input_dev = devm_input_allocate_device(&pdev->dev); + if (!input_dev) { + dev_err(&pdev->dev, "unable to allocate input device\n"); + return -ENOMEM; + } + + kbd->input = input_dev; + kbd->irq = irq; + + if (!pdata) { + error = spear_kbd_parse_dt(pdev, kbd); + if (error) + return error; + } else { + kbd->mode = pdata->mode; + kbd->rep = pdata->rep; + kbd->suspended_rate = pdata->suspended_rate; + } + + kbd->io_base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(kbd->io_base)) + return PTR_ERR(kbd->io_base); + + kbd->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(kbd->clk)) + return PTR_ERR(kbd->clk); + + input_dev->name = "Spear Keyboard"; + input_dev->phys = "keyboard/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->open = spear_kbd_open; + input_dev->close = spear_kbd_close; + + error = matrix_keypad_build_keymap(keymap, NULL, NUM_ROWS, NUM_COLS, + kbd->keycodes, input_dev); + if (error) { + dev_err(&pdev->dev, "Failed to build keymap\n"); + return error; + } + + if (kbd->rep) + __set_bit(EV_REP, input_dev->evbit); + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + + input_set_drvdata(input_dev, kbd); + + error = devm_request_irq(&pdev->dev, irq, spear_kbd_interrupt, 0, + "keyboard", kbd); + if (error) { + dev_err(&pdev->dev, "request_irq failed\n"); + return error; + } + + error = clk_prepare(kbd->clk); + if (error) + return error; + + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, "Unable to register keyboard device\n"); + clk_unprepare(kbd->clk); + return error; + } + + device_init_wakeup(&pdev->dev, 1); + platform_set_drvdata(pdev, kbd); + + return 0; +} + +static int spear_kbd_remove(struct platform_device *pdev) +{ + struct spear_kbd *kbd = platform_get_drvdata(pdev); + + input_unregister_device(kbd->input); + clk_unprepare(kbd->clk); + + device_init_wakeup(&pdev->dev, 0); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM +static int spear_kbd_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct spear_kbd *kbd = platform_get_drvdata(pdev); + struct input_dev *input_dev = kbd->input; + unsigned int rate = 0, mode_ctl_reg, val; + + mutex_lock(&input_dev->mutex); + + /* explicitly enable clock as we may program device */ + clk_enable(kbd->clk); + + mode_ctl_reg = readl_relaxed(kbd->io_base + MODE_CTL_REG); + + if (device_may_wakeup(&pdev->dev)) { + if (!enable_irq_wake(kbd->irq)) + kbd->irq_wake_enabled = true; + + /* + * reprogram the keyboard operating frequency as on some + * platform it may change during system suspended + */ + if (kbd->suspended_rate) + rate = kbd->suspended_rate / 1000000 - 1; + else + rate = clk_get_rate(kbd->clk) / 1000000 - 1; + + val = mode_ctl_reg & + ~(MODE_CTL_PCLK_FREQ_MSK << MODE_CTL_PCLK_FREQ_SHIFT); + val |= (rate & MODE_CTL_PCLK_FREQ_MSK) + << MODE_CTL_PCLK_FREQ_SHIFT; + writel_relaxed(val, kbd->io_base + MODE_CTL_REG); + + } else { + if (input_dev->users) { + writel_relaxed(mode_ctl_reg & ~MODE_CTL_START_SCAN, + kbd->io_base + MODE_CTL_REG); + clk_disable(kbd->clk); + } + } + + /* store current configuration */ + if (input_dev->users) + kbd->mode_ctl_reg = mode_ctl_reg; + + /* restore previous clk state */ + clk_disable(kbd->clk); + + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int spear_kbd_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct spear_kbd *kbd = platform_get_drvdata(pdev); + struct input_dev *input_dev = kbd->input; + + mutex_lock(&input_dev->mutex); + + if (device_may_wakeup(&pdev->dev)) { + if (kbd->irq_wake_enabled) { + kbd->irq_wake_enabled = false; + disable_irq_wake(kbd->irq); + } + } else { + if (input_dev->users) + clk_enable(kbd->clk); + } + + /* restore current configuration */ + if (input_dev->users) + writel_relaxed(kbd->mode_ctl_reg, kbd->io_base + MODE_CTL_REG); + + mutex_unlock(&input_dev->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(spear_kbd_pm_ops, spear_kbd_suspend, spear_kbd_resume); + +#ifdef CONFIG_OF +static const struct of_device_id spear_kbd_id_table[] = { + { .compatible = "st,spear300-kbd" }, + {} +}; +MODULE_DEVICE_TABLE(of, spear_kbd_id_table); +#endif + +static struct platform_driver spear_kbd_driver = { + .probe = spear_kbd_probe, + .remove = spear_kbd_remove, + .driver = { + .name = "keyboard", + .owner = THIS_MODULE, + .pm = &spear_kbd_pm_ops, + .of_match_table = of_match_ptr(spear_kbd_id_table), + }, +}; +module_platform_driver(spear_kbd_driver); + +MODULE_AUTHOR("Rajeev Kumar"); +MODULE_DESCRIPTION("SPEAr Keyboard Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/sprd_eic_keys.c b/drivers/input/keyboard/sprd_eic_keys.c new file mode 100644 index 00000000..886eed3b --- /dev/null +++ b/drivers/input/keyboard/sprd_eic_keys.c @@ -0,0 +1,467 @@ +/* + * Copyright (C) 2014 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HOOK_POWER_KEY +#include +#endif + +//==================== debug ==================== +#define ENTER \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_EIC_KEYS_DBG] func: %s line: %04d\n", __func__, __LINE__); }while(0) + +#define PRINT_DBG(format,x...) \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_EIC_KEYS_DBG] " format, ## x); }while(0) + +#define PRINT_INFO(format,x...) \ +do{ printk(KERN_INFO "[SPRD_EIC_KEYS_INFO] " format, ## x); }while(0) + +#define PRINT_WARN(format,x...) \ +do{ printk(KERN_INFO "[SPRD_EIC_KEYS_WARN] " format, ## x); }while(0) + +#define PRINT_ERR(format,x...) \ +do{ printk(KERN_ERR "[SPRD_EIC_KEYS_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x); }while(0) +//==================== debug ==================== + +static int debug_level = 1; +static struct sprd_eic_keys_platform_data *this_pdata = NULL; + +static int sprd_eic_button_state(struct sprd_eic_keys_button *button) +{ + int button_state = 0; + int gpio_value = 0; + + gpio_value = !!gpio_get_value(button->gpio); + + if(1 == button->active_low) { + if(0 == gpio_value) + button_state = 1; + else + button_state = 0; + } else { + if(1 == gpio_value) + button_state = 1; + else + button_state = 0; + } + + PRINT_DBG("GPIO_%d=%d, button_state=%d\n", button->gpio, gpio_value, button_state); + + return button_state; //0==released, 1==pressed +} + +static irqreturn_t sprd_eic_irq_handle(int irq, void *dev_id) +{ + struct sprd_eic_keys_button *button = (struct sprd_eic_keys_button *)dev_id; + static int button_state_last = 0; + int button_state_current = 0; + + ENTER; + disable_irq_nosync(button->irq); + button_state_current = sprd_eic_button_state(button); + + if (1 == button_state_current) {//pressed +#ifdef HOOK_POWER_KEY + #ifdef ( CONFIG_ARCH_SCX20 || CONFIG_ARCH_SCX35LT8 ) + if(116 == button->code) + #endif + input_report_key_hook(this_pdata->input_dev, button->code, button_state_current); +#endif + input_report_key(this_pdata->input_dev, button->code, button_state_current); + input_sync(this_pdata->input_dev); + PRINT_INFO("Pressed! Key:%s ScanCode:%d value:%d\n", button->desc, button->code, button_state_current); + + if(1 == button->active_low) + irq_set_irq_type(button->irq, IRQF_TRIGGER_HIGH); + else + irq_set_irq_type(button->irq, IRQF_TRIGGER_LOW); + + } else {//released +#ifdef HOOK_POWER_KEY + #ifdef ( CONFIG_ARCH_SCX20 || CONFIG_ARCH_SCX35LT8 ) + if(116 == button->code) + #endif + input_report_key_hook(this_pdata->input_dev, button->code, button_state_current); +#endif + input_report_key(this_pdata->input_dev, button->code, button_state_current); + input_sync(this_pdata->input_dev); + PRINT_INFO("Released! Key:%s ScanCode:%d value:%d\n", button->desc, button->code, button_state_current); + + if(1 == button->active_low) + irq_set_irq_type(button->irq, IRQF_TRIGGER_LOW); + else + irq_set_irq_type(button->irq, IRQF_TRIGGER_HIGH); + + } + + button_state_last = button_state_current; + enable_irq(button->irq); + return IRQ_HANDLED; +} + +static int sprd_eic_keys_setup_key(struct sprd_eic_keys_button *button) +{ + const char *desc = button->desc ? button->desc : "sprd_eic_keys"; + unsigned long irqflags = 0; + int error = -1; + + ENTER; + if (gpio_is_valid(button->gpio)) { + + error = gpio_request_one(button->gpio, GPIOF_IN, desc); + if (error < 0) { + PRINT_ERR("Failed to request GPIO %d, error %d\n", button->gpio, error); + return error; + } + + if (button->debounce_interval) { + error = gpio_set_debounce(button->gpio, button->debounce_interval * 1000); + if (error < 0) + PRINT_INFO("Failed to set debounce for GPIO %d\n", button->gpio); + } + + button->irq = gpio_to_irq(button->gpio); + if (button->irq < 0) { + error = button->irq; + PRINT_ERR("Unable to get irq number for GPIO %d, error %d\n", button->gpio, error); + goto fail; + } + } else { + PRINT_ERR("No GPIO specified\n"); + return -EINVAL; + } + + if (button->type && button->type != EV_KEY) { + PRINT_ERR("Only EV_KEY allowed for IRQ buttons\n"); + return -EINVAL; + } + + input_set_capability(this_pdata->input_dev, button->type ?: EV_KEY, button->code); + + irqflags = (1 == button->active_low) ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH; + irqflags |= IRQF_NO_SUSPEND; + + error = request_any_context_irq(button->irq, sprd_eic_irq_handle, irqflags, desc, button); + if (error < 0) { + PRINT_ERR("Unable to claim irq %d; error %d\n", button->irq, error); + goto fail; + } + + return 0; + +fail: + if (gpio_is_valid(button->gpio)) + gpio_free(button->gpio); + + return error; +} + +#ifdef CONFIG_OF +static struct sprd_eic_keys_platform_data *sprd_eic_keys_get_devtree_pdata(struct device *dev) +{ + struct device_node *node, *pp; + struct sprd_eic_keys_platform_data *pdata; + struct sprd_eic_keys_button *button; + int error; + int nbuttons; + int i; + char *input_name = NULL; + int ret = -1; + + node = dev->of_node; + if (!node) { + error = -ENODEV; + goto err_out; + } + + nbuttons = of_get_child_count(node); + if (nbuttons == 0) { + error = -ENODEV; + goto err_out; + } + + pdata = kzalloc(sizeof(*pdata) + nbuttons * (sizeof *button), + GFP_KERNEL); + if (!pdata) { + error = -ENOMEM; + goto err_out; + } + + pdata->buttons = (struct sprd_eic_keys_button *)(pdata + 1); + pdata->nbuttons = nbuttons; + + pdata->rep = !!of_get_property(node, "autorepeat", NULL); + + ret = of_property_read_string(node, "input-name", &input_name); + if (0 == ret) { + pdata->name = input_name; + PRINT_INFO("input-name=\"%s\"\n", input_name); + } + else + PRINT_WARN("failed to get input-name\n"); + + i = 0; + for_each_child_of_node(node, pp) { + int gpio; + enum of_gpio_flags flags; + + if (!of_find_property(pp, "gpios", NULL)) { + pdata->nbuttons--; + dev_warn(dev, "Found button without gpios\n"); + continue; + } + + gpio = of_get_gpio_flags(pp, 0, &flags); + if (gpio < 0) { + error = gpio; + if (error != -EPROBE_DEFER) + dev_err(dev, + "Failed to get gpio flags, error: %d\n", + error); + goto err_free_pdata; + } + + button = &pdata->buttons[i++]; + + button->gpio = gpio; + button->active_low = flags & OF_GPIO_ACTIVE_LOW; + + if (of_property_read_u32(pp, "linux,code", &button->code)) { + dev_err(dev, "Button without keycode: 0x%x\n", + button->gpio); + error = -EINVAL; + goto err_free_pdata; + } + + button->desc = of_get_property(pp, "label", NULL); + + if (of_property_read_u32(pp, "linux,input-type", &button->type)) + button->type = EV_KEY; + + button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL); + + if (of_property_read_u32(pp, "debounce-interval", + &button->debounce_interval)) + button->debounce_interval = 5; + } + + if (pdata->nbuttons == 0) { + error = -EINVAL; + goto err_free_pdata; + } + + return pdata; + +err_free_pdata: + kfree(pdata); +err_out: + return ERR_PTR(error); +} + +static struct of_device_id sprd_eic_keys_of_match[] = { + { .compatible = "sprd,sprd-eic-keys", }, + { }, +}; +MODULE_DEVICE_TABLE(of, sprd_eic_keys_of_match); + +#else + +static inline struct sprd_eic_keys_platform_data *sprd_eic_keys_get_devtree_pdata(struct device *dev) +{ + return ERR_PTR(-ENODEV); +} + +#endif +static ssize_t sprd_eic_button_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + int status = 0; + + status = sprd_eic_button_state(&this_pdata->buttons[0]); + PRINT_INFO("button status = %d (0 == released, 1 == pressed)\n", status); + return sprintf(buff, "%d\n", status); +} + +static struct kobject *sprd_eic_button_kobj = NULL; +static struct kobj_attribute sprd_eic_button_attr = + __ATTR(status, 0644, sprd_eic_button_show, NULL); + +static int sprd_eic_button_sysfs_init(void) +{ + int ret = -1; + + sprd_eic_button_kobj = kobject_create_and_add("sprd_eic_button", kernel_kobj); + if (sprd_eic_button_kobj == NULL) { + ret = -ENOMEM; + PRINT_ERR("register sysfs failed. ret = %d\n", ret); + return ret; + } + + ret = sysfs_create_file(sprd_eic_button_kobj, &sprd_eic_button_attr.attr); + if (ret) { + PRINT_ERR("create sysfs failed. ret = %d\n", ret); + return ret; + } + + PRINT_INFO("sprd_eic_button_sysfs_init success\n"); + return ret; +} +static int sprd_eic_keys_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct sprd_eic_keys_button *button = NULL; + struct input_dev *input = NULL; + int i = 0; + int error = -1; + + ENTER; + this_pdata = dev_get_platdata(dev); + + if (!this_pdata) { + this_pdata = sprd_eic_keys_get_devtree_pdata(dev); + if (IS_ERR(this_pdata)) { + PRINT_ERR("failed to get platform data!\n"); + return PTR_ERR(this_pdata); + } + } + + input = input_allocate_device(); + if (!input) { + PRINT_ERR("failed to allocate input device!\n"); + error = -ENOMEM; + goto fail1; + } + + input->name = this_pdata->name ? this_pdata->name : pdev->name; + input->id.bustype = BUS_HOST; + this_pdata->input_dev = input; + + if (this_pdata->rep) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < this_pdata->nbuttons; i++) { + button = &this_pdata->buttons[i]; + error = sprd_eic_keys_setup_key( button); + if (error) + goto fail2; + } + + error = input_register_device(input); + if (error) { + PRINT_ERR("Unable to register input device!\n"); + goto fail3; + } + sprd_eic_button_sysfs_init(); + PRINT_INFO("probe success!\n"); + return 0; + +fail3: +fail2: + while (--i >= 0) { + button = &this_pdata->buttons[i]; + free_irq(button->irq, button); + if (gpio_is_valid(button->gpio)) { + gpio_free(button->gpio); + } + } + + input_free_device(input); +fail1: + PRINT_ERR("probe failed!\n"); + return error; +} + +#ifdef CONFIG_PM +static int sprd_eic_keys_suspend(struct platform_device *dev, pm_message_t state) +{ + return 0; +} + +static int sprd_eic_keys_resume(struct platform_device *dev) +{ + return 0; +} +#else +#define sprd_eic_keys_suspend NULL +#define sprd_eic_keys_resume NULL +#endif + +static struct platform_driver sprd_eic_keys_device_driver = { + .probe = sprd_eic_keys_probe, + .suspend = NULL, + .resume = NULL, + .driver = { + .name = "sprd-eic-keys", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(sprd_eic_keys_of_match), + } +}; + +static int __init sprd_eic_keys_init(void) +{ + ENTER; +#ifdef HOOK_POWER_KEY + input_hook_init(); +#endif + +/***************************************************************/ + struct device_node *node = of_find_compatible_node(NULL, NULL, "sprd,sprd-eic-keys"); + if(node) { + PRINT_INFO("Find the node name:%s\n",node->name); + + struct platform_device *dev = of_find_device_by_node(node); + if(dev) + PRINT_INFO("Find the device name:%s\n",dev->name); + else + PRINT_INFO("Not Find the device\n"); + } + else + PRINT_INFO("Not Find the node\n"); +/***************************************************************/ + + return platform_driver_register(&sprd_eic_keys_device_driver); +} + +static void __exit sprd_eic_keys_exit(void) +{ +#ifdef HOOK_POWER_KEY + input_hook_exit(); +#endif + platform_driver_unregister(&sprd_eic_keys_device_driver); +} + +late_initcall(sprd_eic_keys_init); +module_exit(sprd_eic_keys_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Yaochuan Li "); +MODULE_DESCRIPTION("Keyboard driver for spreadtrum eic keys"); +MODULE_ALIAS("platform:sprd-eic-keys"); diff --git a/drivers/input/keyboard/stmpe-keypad.c b/drivers/input/keyboard/stmpe-keypad.c new file mode 100644 index 00000000..5cbec56f --- /dev/null +++ b/drivers/input/keyboard/stmpe-keypad.c @@ -0,0 +1,399 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * License Terms: GNU General Public License, version 2 + * Author: Rabin Vincent for ST-Ericsson + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* These are at the same addresses in all STMPE variants */ +#define STMPE_KPC_COL 0x60 +#define STMPE_KPC_ROW_MSB 0x61 +#define STMPE_KPC_ROW_LSB 0x62 +#define STMPE_KPC_CTRL_MSB 0x63 +#define STMPE_KPC_CTRL_LSB 0x64 +#define STMPE_KPC_COMBI_KEY_0 0x65 +#define STMPE_KPC_COMBI_KEY_1 0x66 +#define STMPE_KPC_COMBI_KEY_2 0x67 +#define STMPE_KPC_DATA_BYTE0 0x68 +#define STMPE_KPC_DATA_BYTE1 0x69 +#define STMPE_KPC_DATA_BYTE2 0x6a +#define STMPE_KPC_DATA_BYTE3 0x6b +#define STMPE_KPC_DATA_BYTE4 0x6c + +#define STMPE_KPC_CTRL_LSB_SCAN (0x1 << 0) +#define STMPE_KPC_CTRL_LSB_DEBOUNCE (0x7f << 1) +#define STMPE_KPC_CTRL_MSB_SCAN_COUNT (0xf << 4) + +#define STMPE_KPC_ROW_MSB_ROWS 0xff + +#define STMPE_KPC_DATA_UP (0x1 << 7) +#define STMPE_KPC_DATA_ROW (0xf << 3) +#define STMPE_KPC_DATA_COL (0x7 << 0) +#define STMPE_KPC_DATA_NOKEY_MASK 0x78 + +#define STMPE_KEYPAD_MAX_DEBOUNCE 127 +#define STMPE_KEYPAD_MAX_SCAN_COUNT 15 + +#define STMPE_KEYPAD_MAX_ROWS 8 +#define STMPE_KEYPAD_MAX_COLS 8 +#define STMPE_KEYPAD_ROW_SHIFT 3 +#define STMPE_KEYPAD_KEYMAP_SIZE \ + (STMPE_KEYPAD_MAX_ROWS * STMPE_KEYPAD_MAX_COLS) + +/** + * struct stmpe_keypad_variant - model-specific attributes + * @auto_increment: whether the KPC_DATA_BYTE register address + * auto-increments on multiple read + * @num_data: number of data bytes + * @num_normal_data: number of normal keys' data bytes + * @max_cols: maximum number of columns supported + * @max_rows: maximum number of rows supported + * @col_gpios: bitmask of gpios which can be used for columns + * @row_gpios: bitmask of gpios which can be used for rows + */ +struct stmpe_keypad_variant { + bool auto_increment; + int num_data; + int num_normal_data; + int max_cols; + int max_rows; + unsigned int col_gpios; + unsigned int row_gpios; +}; + +static const struct stmpe_keypad_variant stmpe_keypad_variants[] = { + [STMPE1601] = { + .auto_increment = true, + .num_data = 5, + .num_normal_data = 3, + .max_cols = 8, + .max_rows = 8, + .col_gpios = 0x000ff, /* GPIO 0 - 7 */ + .row_gpios = 0x0ff00, /* GPIO 8 - 15 */ + }, + [STMPE2401] = { + .auto_increment = false, + .num_data = 3, + .num_normal_data = 2, + .max_cols = 8, + .max_rows = 12, + .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ + .row_gpios = 0x1fef00, /* GPIO 8-14, 16-20 */ + }, + [STMPE2403] = { + .auto_increment = true, + .num_data = 5, + .num_normal_data = 3, + .max_cols = 8, + .max_rows = 12, + .col_gpios = 0x0000ff, /* GPIO 0 - 7*/ + .row_gpios = 0x1fef00, /* GPIO 8-14, 16-20 */ + }, +}; + +struct stmpe_keypad { + struct stmpe *stmpe; + struct input_dev *input; + const struct stmpe_keypad_variant *variant; + const struct stmpe_keypad_platform_data *plat; + + unsigned int rows; + unsigned int cols; + + unsigned short keymap[STMPE_KEYPAD_KEYMAP_SIZE]; +}; + +static int stmpe_keypad_read_data(struct stmpe_keypad *keypad, u8 *data) +{ + const struct stmpe_keypad_variant *variant = keypad->variant; + struct stmpe *stmpe = keypad->stmpe; + int ret; + int i; + + if (variant->auto_increment) + return stmpe_block_read(stmpe, STMPE_KPC_DATA_BYTE0, + variant->num_data, data); + + for (i = 0; i < variant->num_data; i++) { + ret = stmpe_reg_read(stmpe, STMPE_KPC_DATA_BYTE0 + i); + if (ret < 0) + return ret; + + data[i] = ret; + } + + return 0; +} + +static irqreturn_t stmpe_keypad_irq(int irq, void *dev) +{ + struct stmpe_keypad *keypad = dev; + struct input_dev *input = keypad->input; + const struct stmpe_keypad_variant *variant = keypad->variant; + u8 fifo[variant->num_data]; + int ret; + int i; + + ret = stmpe_keypad_read_data(keypad, fifo); + if (ret < 0) + return IRQ_NONE; + + for (i = 0; i < variant->num_normal_data; i++) { + u8 data = fifo[i]; + int row = (data & STMPE_KPC_DATA_ROW) >> 3; + int col = data & STMPE_KPC_DATA_COL; + int code = MATRIX_SCAN_CODE(row, col, STMPE_KEYPAD_ROW_SHIFT); + bool up = data & STMPE_KPC_DATA_UP; + + if ((data & STMPE_KPC_DATA_NOKEY_MASK) + == STMPE_KPC_DATA_NOKEY_MASK) + continue; + + input_event(input, EV_MSC, MSC_SCAN, code); + input_report_key(input, keypad->keymap[code], !up); + input_sync(input); + } + + return IRQ_HANDLED; +} + +static int stmpe_keypad_altfunc_init(struct stmpe_keypad *keypad) +{ + const struct stmpe_keypad_variant *variant = keypad->variant; + unsigned int col_gpios = variant->col_gpios; + unsigned int row_gpios = variant->row_gpios; + struct stmpe *stmpe = keypad->stmpe; + unsigned int pins = 0; + int i; + + /* + * Figure out which pins need to be set to the keypad alternate + * function. + * + * {cols,rows}_gpios are bitmasks of which pins on the chip can be used + * for the keypad. + * + * keypad->{cols,rows} are a bitmask of which pins (of the ones useable + * for the keypad) are used on the board. + */ + + for (i = 0; i < variant->max_cols; i++) { + int num = __ffs(col_gpios); + + if (keypad->cols & (1 << i)) + pins |= 1 << num; + + col_gpios &= ~(1 << num); + } + + for (i = 0; i < variant->max_rows; i++) { + int num = __ffs(row_gpios); + + if (keypad->rows & (1 << i)) + pins |= 1 << num; + + row_gpios &= ~(1 << num); + } + + return stmpe_set_altfunc(stmpe, pins, STMPE_BLOCK_KEYPAD); +} + +static int stmpe_keypad_chip_init(struct stmpe_keypad *keypad) +{ + const struct stmpe_keypad_platform_data *plat = keypad->plat; + const struct stmpe_keypad_variant *variant = keypad->variant; + struct stmpe *stmpe = keypad->stmpe; + int ret; + + if (plat->debounce_ms > STMPE_KEYPAD_MAX_DEBOUNCE) + return -EINVAL; + + if (plat->scan_count > STMPE_KEYPAD_MAX_SCAN_COUNT) + return -EINVAL; + + ret = stmpe_enable(stmpe, STMPE_BLOCK_KEYPAD); + if (ret < 0) + return ret; + + ret = stmpe_keypad_altfunc_init(keypad); + if (ret < 0) + return ret; + + ret = stmpe_reg_write(stmpe, STMPE_KPC_COL, keypad->cols); + if (ret < 0) + return ret; + + ret = stmpe_reg_write(stmpe, STMPE_KPC_ROW_LSB, keypad->rows); + if (ret < 0) + return ret; + + if (variant->max_rows > 8) { + ret = stmpe_set_bits(stmpe, STMPE_KPC_ROW_MSB, + STMPE_KPC_ROW_MSB_ROWS, + keypad->rows >> 8); + if (ret < 0) + return ret; + } + + ret = stmpe_set_bits(stmpe, STMPE_KPC_CTRL_MSB, + STMPE_KPC_CTRL_MSB_SCAN_COUNT, + plat->scan_count << 4); + if (ret < 0) + return ret; + + return stmpe_set_bits(stmpe, STMPE_KPC_CTRL_LSB, + STMPE_KPC_CTRL_LSB_SCAN | + STMPE_KPC_CTRL_LSB_DEBOUNCE, + STMPE_KPC_CTRL_LSB_SCAN | + (plat->debounce_ms << 1)); +} + +static void stmpe_keypad_fill_used_pins(struct stmpe_keypad *keypad) +{ + int row, col; + + for (row = 0; row < STMPE_KEYPAD_MAX_ROWS; row++) { + for (col = 0; col < STMPE_KEYPAD_MAX_COLS; col++) { + int code = MATRIX_SCAN_CODE(row, col, + STMPE_KEYPAD_ROW_SHIFT); + if (keypad->keymap[code] != KEY_RESERVED) { + keypad->rows |= 1 << row; + keypad->cols |= 1 << col; + } + } + } +} + +#ifdef CONFIG_OF +static const struct stmpe_keypad_platform_data * +stmpe_keypad_of_probe(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct stmpe_keypad_platform_data *plat; + + if (!np) + return ERR_PTR(-ENODEV); + + plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); + if (!plat) + return ERR_PTR(-ENOMEM); + + of_property_read_u32(np, "debounce-interval", &plat->debounce_ms); + of_property_read_u32(np, "st,scan-count", &plat->scan_count); + + plat->no_autorepeat = of_property_read_bool(np, "st,no-autorepeat"); + + return plat; +} +#else +static inline const struct stmpe_keypad_platform_data * +stmpe_keypad_of_probe(struct device *dev) +{ + return ERR_PTR(-EINVAL); +} +#endif + +static int stmpe_keypad_probe(struct platform_device *pdev) +{ + struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); + const struct stmpe_keypad_platform_data *plat; + struct stmpe_keypad *keypad; + struct input_dev *input; + int error; + int irq; + + plat = stmpe->pdata->keypad; + if (!plat) { + plat = stmpe_keypad_of_probe(&pdev->dev); + if (IS_ERR(plat)) + return PTR_ERR(plat); + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + keypad = devm_kzalloc(&pdev->dev, sizeof(struct stmpe_keypad), + GFP_KERNEL); + if (!keypad) + return -ENOMEM; + + input = devm_input_allocate_device(&pdev->dev); + if (!input) + return -ENOMEM; + + input->name = "STMPE keypad"; + input->id.bustype = BUS_I2C; + input->dev.parent = &pdev->dev; + + error = matrix_keypad_build_keymap(plat->keymap_data, NULL, + STMPE_KEYPAD_MAX_ROWS, + STMPE_KEYPAD_MAX_COLS, + keypad->keymap, input); + if (error) + return error; + + input_set_capability(input, EV_MSC, MSC_SCAN); + if (!plat->no_autorepeat) + __set_bit(EV_REP, input->evbit); + + stmpe_keypad_fill_used_pins(keypad); + + keypad->stmpe = stmpe; + keypad->plat = plat; + keypad->input = input; + keypad->variant = &stmpe_keypad_variants[stmpe->partnum]; + + error = stmpe_keypad_chip_init(keypad); + if (error < 0) + return error; + + error = devm_request_threaded_irq(&pdev->dev, irq, + NULL, stmpe_keypad_irq, + IRQF_ONESHOT, "stmpe-keypad", keypad); + if (error) { + dev_err(&pdev->dev, "unable to get irq: %d\n", error); + return error; + } + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, + "unable to register input device: %d\n", error); + return error; + } + + platform_set_drvdata(pdev, keypad); + + return 0; +} + +static int stmpe_keypad_remove(struct platform_device *pdev) +{ + struct stmpe_keypad *keypad = platform_get_drvdata(pdev); + + stmpe_disable(keypad->stmpe, STMPE_BLOCK_KEYPAD); + + return 0; +} + +static struct platform_driver stmpe_keypad_driver = { + .driver.name = "stmpe-keypad", + .driver.owner = THIS_MODULE, + .probe = stmpe_keypad_probe, + .remove = stmpe_keypad_remove, +}; +module_platform_driver(stmpe_keypad_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("STMPExxxx keypad driver"); +MODULE_AUTHOR("Rabin Vincent "); diff --git a/drivers/input/keyboard/stowaway.c b/drivers/input/keyboard/stowaway.c new file mode 100644 index 00000000..cc612c5d --- /dev/null +++ b/drivers/input/keyboard/stowaway.c @@ -0,0 +1,173 @@ +/* + * Stowaway keyboard driver for Linux + */ + +/* + * Copyright (c) 2006 Marek Vasut + * + * Based on Newton keyboard driver for Linux + * by Justin Cormack + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Marek Vasut, Liskovecka 559, Frydek-Mistek, 738 01 Czech Republic + */ + +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Stowaway keyboard driver" + +MODULE_AUTHOR("Marek Vasut "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define SKBD_KEY_MASK 0x7f +#define SKBD_RELEASE 0x80 + +static unsigned char skbd_keycode[128] = { + KEY_1, KEY_2, KEY_3, KEY_Z, KEY_4, KEY_5, KEY_6, KEY_7, + 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_GRAVE, + KEY_X, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_SPACE, + KEY_CAPSLOCK, KEY_TAB, KEY_LEFTCTRL, 0, 0, 0, 0, 0, + 0, 0, 0, KEY_LEFTALT, 0, 0, 0, 0, + 0, 0, 0, 0, KEY_C, KEY_V, KEY_B, KEY_N, + KEY_MINUS, KEY_EQUAL, KEY_BACKSPACE, KEY_HOME, KEY_8, KEY_9, KEY_0, KEY_ESC, + KEY_LEFTBRACE, KEY_RIGHTBRACE, KEY_BACKSLASH, KEY_END, KEY_U, KEY_I, KEY_O, KEY_P, + KEY_APOSTROPHE, KEY_ENTER, KEY_PAGEUP,0, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, + KEY_SLASH, KEY_UP, KEY_PAGEDOWN, 0,KEY_M, KEY_COMMA, KEY_DOT, KEY_INSERT, + KEY_DELETE, KEY_LEFT, KEY_DOWN, KEY_RIGHT, 0, 0, 0, + KEY_LEFTSHIFT, KEY_RIGHTSHIFT, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, + KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, 0, 0, 0 +}; + +struct skbd { + unsigned char keycode[128]; + struct input_dev *dev; + struct serio *serio; + char phys[32]; +}; + +static irqreturn_t skbd_interrupt(struct serio *serio, unsigned char data, + unsigned int flags) +{ + struct skbd *skbd = serio_get_drvdata(serio); + struct input_dev *dev = skbd->dev; + + if (skbd->keycode[data & SKBD_KEY_MASK]) { + input_report_key(dev, skbd->keycode[data & SKBD_KEY_MASK], + !(data & SKBD_RELEASE)); + input_sync(dev); + } + + return IRQ_HANDLED; +} + +static int skbd_connect(struct serio *serio, struct serio_driver *drv) +{ + struct skbd *skbd; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + skbd = kzalloc(sizeof(struct skbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!skbd || !input_dev) + goto fail1; + + skbd->serio = serio; + skbd->dev = input_dev; + snprintf(skbd->phys, sizeof(skbd->phys), "%s/input0", serio->phys); + memcpy(skbd->keycode, skbd_keycode, sizeof(skbd->keycode)); + + input_dev->name = "Stowaway Keyboard"; + input_dev->phys = skbd->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_STOWAWAY; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_dev->keycode = skbd->keycode; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(skbd_keycode); + for (i = 0; i < ARRAY_SIZE(skbd_keycode); i++) + set_bit(skbd_keycode[i], input_dev->keybit); + clear_bit(0, input_dev->keybit); + + serio_set_drvdata(serio, skbd); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(skbd->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(skbd); + return err; +} + +static void skbd_disconnect(struct serio *serio) +{ + struct skbd *skbd = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(skbd->dev); + kfree(skbd); +} + +static struct serio_device_id skbd_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_STOWAWAY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, skbd_serio_ids); + +static struct serio_driver skbd_drv = { + .driver = { + .name = "stowaway", + }, + .description = DRIVER_DESC, + .id_table = skbd_serio_ids, + .interrupt = skbd_interrupt, + .connect = skbd_connect, + .disconnect = skbd_disconnect, +}; + +module_serio_driver(skbd_drv); diff --git a/drivers/input/keyboard/sunkbd.c b/drivers/input/keyboard/sunkbd.c new file mode 100644 index 00000000..5f836b16 --- /dev/null +++ b/drivers/input/keyboard/sunkbd.c @@ -0,0 +1,372 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * Sun keyboard driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Sun keyboard driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +static unsigned char sunkbd_keycode[128] = { + 0,128,114,129,115, 59, 60, 68, 61, 87, 62, 88, 63,100, 64,112, + 65, 66, 67, 56,103,119, 99, 70,105,130,131,108,106, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 41, 14,110,113, 98, 55, + 116,132, 83,133,102, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27,111,127, 71, 72, 73, 74,134,135,107, 0, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 43, 28, 96, 75, 76, 77, 82,136, + 104,137, 69, 42, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,101, + 79, 80, 81, 0, 0, 0,138, 58,125, 57,126,109, 86, 78 +}; + +#define SUNKBD_CMD_RESET 0x1 +#define SUNKBD_CMD_BELLON 0x2 +#define SUNKBD_CMD_BELLOFF 0x3 +#define SUNKBD_CMD_CLICK 0xa +#define SUNKBD_CMD_NOCLICK 0xb +#define SUNKBD_CMD_SETLED 0xe +#define SUNKBD_CMD_LAYOUT 0xf + +#define SUNKBD_RET_RESET 0xff +#define SUNKBD_RET_ALLUP 0x7f +#define SUNKBD_RET_LAYOUT 0xfe + +#define SUNKBD_LAYOUT_5_MASK 0x20 +#define SUNKBD_RELEASE 0x80 +#define SUNKBD_KEY 0x7f + +/* + * Per-keyboard data. + */ + +struct sunkbd { + unsigned char keycode[ARRAY_SIZE(sunkbd_keycode)]; + struct input_dev *dev; + struct serio *serio; + struct work_struct tq; + wait_queue_head_t wait; + char name[64]; + char phys[32]; + char type; + bool enabled; + volatile s8 reset; + volatile s8 layout; +}; + +/* + * sunkbd_interrupt() is called by the low level driver when a character + * is received. + */ + +static irqreturn_t sunkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct sunkbd *sunkbd = serio_get_drvdata(serio); + + if (sunkbd->reset <= -1) { + /* + * If cp[i] is 0xff, sunkbd->reset will stay -1. + * The keyboard sends 0xff 0xff 0xID on powerup. + */ + sunkbd->reset = data; + wake_up_interruptible(&sunkbd->wait); + goto out; + } + + if (sunkbd->layout == -1) { + sunkbd->layout = data; + wake_up_interruptible(&sunkbd->wait); + goto out; + } + + switch (data) { + + case SUNKBD_RET_RESET: + schedule_work(&sunkbd->tq); + sunkbd->reset = -1; + break; + + case SUNKBD_RET_LAYOUT: + sunkbd->layout = -1; + break; + + case SUNKBD_RET_ALLUP: /* All keys released */ + break; + + default: + if (!sunkbd->enabled) + break; + + if (sunkbd->keycode[data & SUNKBD_KEY]) { + input_report_key(sunkbd->dev, + sunkbd->keycode[data & SUNKBD_KEY], + !(data & SUNKBD_RELEASE)); + input_sync(sunkbd->dev); + } else { + printk(KERN_WARNING + "sunkbd.c: Unknown key (scancode %#x) %s.\n", + data & SUNKBD_KEY, + data & SUNKBD_RELEASE ? "released" : "pressed"); + } + } +out: + return IRQ_HANDLED; +} + +/* + * sunkbd_event() handles events from the input module. + */ + +static int sunkbd_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + struct sunkbd *sunkbd = input_get_drvdata(dev); + + switch (type) { + + case EV_LED: + + serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); + serio_write(sunkbd->serio, + (!!test_bit(LED_CAPSL, dev->led) << 3) | + (!!test_bit(LED_SCROLLL, dev->led) << 2) | + (!!test_bit(LED_COMPOSE, dev->led) << 1) | + !!test_bit(LED_NUML, dev->led)); + return 0; + + case EV_SND: + + switch (code) { + + case SND_CLICK: + serio_write(sunkbd->serio, SUNKBD_CMD_NOCLICK - value); + return 0; + + case SND_BELL: + serio_write(sunkbd->serio, SUNKBD_CMD_BELLOFF - value); + return 0; + } + + break; + } + + return -1; +} + +/* + * sunkbd_initialize() checks for a Sun keyboard attached, and determines + * its type. + */ + +static int sunkbd_initialize(struct sunkbd *sunkbd) +{ + sunkbd->reset = -2; + serio_write(sunkbd->serio, SUNKBD_CMD_RESET); + wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); + if (sunkbd->reset < 0) + return -1; + + sunkbd->type = sunkbd->reset; + + if (sunkbd->type == 4) { /* Type 4 keyboard */ + sunkbd->layout = -2; + serio_write(sunkbd->serio, SUNKBD_CMD_LAYOUT); + wait_event_interruptible_timeout(sunkbd->wait, + sunkbd->layout >= 0, HZ / 4); + if (sunkbd->layout < 0) + return -1; + if (sunkbd->layout & SUNKBD_LAYOUT_5_MASK) + sunkbd->type = 5; + } + + return 0; +} + +/* + * sunkbd_reinit() sets leds and beeps to a state the computer remembers they + * were in. + */ + +static void sunkbd_reinit(struct work_struct *work) +{ + struct sunkbd *sunkbd = container_of(work, struct sunkbd, tq); + + wait_event_interruptible_timeout(sunkbd->wait, sunkbd->reset >= 0, HZ); + + serio_write(sunkbd->serio, SUNKBD_CMD_SETLED); + serio_write(sunkbd->serio, + (!!test_bit(LED_CAPSL, sunkbd->dev->led) << 3) | + (!!test_bit(LED_SCROLLL, sunkbd->dev->led) << 2) | + (!!test_bit(LED_COMPOSE, sunkbd->dev->led) << 1) | + !!test_bit(LED_NUML, sunkbd->dev->led)); + serio_write(sunkbd->serio, + SUNKBD_CMD_NOCLICK - !!test_bit(SND_CLICK, sunkbd->dev->snd)); + serio_write(sunkbd->serio, + SUNKBD_CMD_BELLOFF - !!test_bit(SND_BELL, sunkbd->dev->snd)); +} + +static void sunkbd_enable(struct sunkbd *sunkbd, bool enable) +{ + serio_pause_rx(sunkbd->serio); + sunkbd->enabled = enable; + serio_continue_rx(sunkbd->serio); +} + +/* + * sunkbd_connect() probes for a Sun keyboard and fills the necessary + * structures. + */ + +static int sunkbd_connect(struct serio *serio, struct serio_driver *drv) +{ + struct sunkbd *sunkbd; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + sunkbd = kzalloc(sizeof(struct sunkbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!sunkbd || !input_dev) + goto fail1; + + sunkbd->serio = serio; + sunkbd->dev = input_dev; + init_waitqueue_head(&sunkbd->wait); + INIT_WORK(&sunkbd->tq, sunkbd_reinit); + snprintf(sunkbd->phys, sizeof(sunkbd->phys), "%s/input0", serio->phys); + + serio_set_drvdata(serio, sunkbd); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + if (sunkbd_initialize(sunkbd) < 0) { + err = -ENODEV; + goto fail3; + } + + snprintf(sunkbd->name, sizeof(sunkbd->name), + "Sun Type %d keyboard", sunkbd->type); + memcpy(sunkbd->keycode, sunkbd_keycode, sizeof(sunkbd->keycode)); + + input_dev->name = sunkbd->name; + input_dev->phys = sunkbd->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_SUNKBD; + input_dev->id.product = sunkbd->type; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_set_drvdata(input_dev, sunkbd); + + input_dev->event = sunkbd_event; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_LED) | + BIT_MASK(EV_SND) | BIT_MASK(EV_REP); + input_dev->ledbit[0] = BIT_MASK(LED_CAPSL) | BIT_MASK(LED_COMPOSE) | + BIT_MASK(LED_SCROLLL) | BIT_MASK(LED_NUML); + input_dev->sndbit[0] = BIT_MASK(SND_CLICK) | BIT_MASK(SND_BELL); + + input_dev->keycode = sunkbd->keycode; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(sunkbd_keycode); + for (i = 0; i < ARRAY_SIZE(sunkbd_keycode); i++) + __set_bit(sunkbd->keycode[i], input_dev->keybit); + __clear_bit(KEY_RESERVED, input_dev->keybit); + + sunkbd_enable(sunkbd, true); + + err = input_register_device(sunkbd->dev); + if (err) + goto fail4; + + return 0; + + fail4: sunkbd_enable(sunkbd, false); + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(sunkbd); + return err; +} + +/* + * sunkbd_disconnect() unregisters and closes behind us. + */ + +static void sunkbd_disconnect(struct serio *serio) +{ + struct sunkbd *sunkbd = serio_get_drvdata(serio); + + sunkbd_enable(sunkbd, false); + input_unregister_device(sunkbd->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + kfree(sunkbd); +} + +static struct serio_device_id sunkbd_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_SUNKBD, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_UNKNOWN, /* sunkbd does probe */ + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, sunkbd_serio_ids); + +static struct serio_driver sunkbd_drv = { + .driver = { + .name = "sunkbd", + }, + .description = DRIVER_DESC, + .id_table = sunkbd_serio_ids, + .interrupt = sunkbd_interrupt, + .connect = sunkbd_connect, + .disconnect = sunkbd_disconnect, +}; + +module_serio_driver(sunkbd_drv); diff --git a/drivers/input/keyboard/tc3589x-keypad.c b/drivers/input/keyboard/tc3589x-keypad.c new file mode 100644 index 00000000..208de7cb --- /dev/null +++ b/drivers/input/keyboard/tc3589x-keypad.c @@ -0,0 +1,458 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * Author: Jayeeta Banerjee + * Author: Sundar Iyer + * + * License Terms: GNU General Public License, version 2 + * + * TC35893 MFD Keypad Controller driver + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Maximum supported keypad matrix row/columns size */ +#define TC3589x_MAX_KPROW 8 +#define TC3589x_MAX_KPCOL 12 + +/* keypad related Constants */ +#define TC3589x_MAX_DEBOUNCE_SETTLE 0xFF +#define DEDICATED_KEY_VAL 0xFF + +/* Pull up/down masks */ +#define TC3589x_NO_PULL_MASK 0x0 +#define TC3589x_PULL_DOWN_MASK 0x1 +#define TC3589x_PULL_UP_MASK 0x2 +#define TC3589x_PULLUP_ALL_MASK 0xAA +#define TC3589x_IO_PULL_VAL(index, mask) ((mask)<<((index)%4)*2)) + +/* Bit masks for IOCFG register */ +#define IOCFG_BALLCFG 0x01 +#define IOCFG_IG 0x08 + +#define KP_EVCODE_COL_MASK 0x0F +#define KP_EVCODE_ROW_MASK 0x70 +#define KP_RELEASE_EVT_MASK 0x80 + +#define KP_ROW_SHIFT 4 + +#define KP_NO_VALID_KEY_MASK 0x7F + +/* bit masks for RESTCTRL register */ +#define TC3589x_KBDRST 0x2 +#define TC3589x_IRQRST 0x10 +#define TC3589x_RESET_ALL 0x1B + +/* KBDMFS register bit mask */ +#define TC3589x_KBDMFS_EN 0x1 + +/* CLKEN register bitmask */ +#define KPD_CLK_EN 0x1 + +/* RSTINTCLR register bit mask */ +#define IRQ_CLEAR 0x1 + +/* bit masks for keyboard interrupts*/ +#define TC3589x_EVT_LOSS_INT 0x8 +#define TC3589x_EVT_INT 0x4 +#define TC3589x_KBD_LOSS_INT 0x2 +#define TC3589x_KBD_INT 0x1 + +/* bit masks for keyboard interrupt clear*/ +#define TC3589x_EVT_INT_CLR 0x2 +#define TC3589x_KBD_INT_CLR 0x1 + +/** + * struct tc_keypad - data structure used by keypad driver + * @tc3589x: pointer to tc35893 + * @input: pointer to input device object + * @board: keypad platform device + * @krow: number of rows + * @kcol: number of columns + * @keymap: matrix scan code table for keycodes + * @keypad_stopped: holds keypad status + */ +struct tc_keypad { + struct tc3589x *tc3589x; + struct input_dev *input; + const struct tc3589x_keypad_platform_data *board; + unsigned int krow; + unsigned int kcol; + unsigned short *keymap; + bool keypad_stopped; +}; + +static int tc3589x_keypad_init_key_hardware(struct tc_keypad *keypad) +{ + int ret; + struct tc3589x *tc3589x = keypad->tc3589x; + const struct tc3589x_keypad_platform_data *board = keypad->board; + + /* validate platform configuration */ + if (board->kcol > TC3589x_MAX_KPCOL || board->krow > TC3589x_MAX_KPROW) + return -EINVAL; + + /* configure KBDSIZE 4 LSbits for cols and 4 MSbits for rows */ + ret = tc3589x_reg_write(tc3589x, TC3589x_KBDSIZE, + (board->krow << KP_ROW_SHIFT) | board->kcol); + if (ret < 0) + return ret; + + /* configure dedicated key config, no dedicated key selected */ + ret = tc3589x_reg_write(tc3589x, TC3589x_KBCFG_LSB, DEDICATED_KEY_VAL); + if (ret < 0) + return ret; + + ret = tc3589x_reg_write(tc3589x, TC3589x_KBCFG_MSB, DEDICATED_KEY_VAL); + if (ret < 0) + return ret; + + /* Configure settle time */ + ret = tc3589x_reg_write(tc3589x, TC3589x_KBDSETTLE_REG, + board->settle_time); + if (ret < 0) + return ret; + + /* Configure debounce time */ + ret = tc3589x_reg_write(tc3589x, TC3589x_KBDBOUNCE, + board->debounce_period); + if (ret < 0) + return ret; + + /* Start of initialise keypad GPIOs */ + ret = tc3589x_set_bits(tc3589x, TC3589x_IOCFG, 0x0, IOCFG_IG); + if (ret < 0) + return ret; + + /* Configure pull-up resistors for all row GPIOs */ + ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG0_LSB, + TC3589x_PULLUP_ALL_MASK); + if (ret < 0) + return ret; + + ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG0_MSB, + TC3589x_PULLUP_ALL_MASK); + if (ret < 0) + return ret; + + /* Configure pull-up resistors for all column GPIOs */ + ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG1_LSB, + TC3589x_PULLUP_ALL_MASK); + if (ret < 0) + return ret; + + ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG1_MSB, + TC3589x_PULLUP_ALL_MASK); + if (ret < 0) + return ret; + + ret = tc3589x_reg_write(tc3589x, TC3589x_IOPULLCFG2_LSB, + TC3589x_PULLUP_ALL_MASK); + + return ret; +} + +#define TC35893_DATA_REGS 4 +#define TC35893_KEYCODE_FIFO_EMPTY 0x7f +#define TC35893_KEYCODE_FIFO_CLEAR 0xff +#define TC35893_KEYPAD_ROW_SHIFT 0x3 + +static irqreturn_t tc3589x_keypad_irq(int irq, void *dev) +{ + struct tc_keypad *keypad = dev; + struct tc3589x *tc3589x = keypad->tc3589x; + u8 i, row_index, col_index, kbd_code, up; + u8 code; + + for (i = 0; i < TC35893_DATA_REGS * 2; i++) { + kbd_code = tc3589x_reg_read(tc3589x, TC3589x_EVTCODE_FIFO); + + /* loop till fifo is empty and no more keys are pressed */ + if (kbd_code == TC35893_KEYCODE_FIFO_EMPTY || + kbd_code == TC35893_KEYCODE_FIFO_CLEAR) + continue; + + /* valid key is found */ + col_index = kbd_code & KP_EVCODE_COL_MASK; + row_index = (kbd_code & KP_EVCODE_ROW_MASK) >> KP_ROW_SHIFT; + code = MATRIX_SCAN_CODE(row_index, col_index, + TC35893_KEYPAD_ROW_SHIFT); + up = kbd_code & KP_RELEASE_EVT_MASK; + + input_event(keypad->input, EV_MSC, MSC_SCAN, code); + input_report_key(keypad->input, keypad->keymap[code], !up); + input_sync(keypad->input); + } + + /* clear IRQ */ + tc3589x_set_bits(tc3589x, TC3589x_KBDIC, + 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR); + /* enable IRQ */ + tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, + 0x0, TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT); + + return IRQ_HANDLED; +} + +static int tc3589x_keypad_enable(struct tc_keypad *keypad) +{ + struct tc3589x *tc3589x = keypad->tc3589x; + int ret; + + /* pull the keypad module out of reset */ + ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x0); + if (ret < 0) + return ret; + + /* configure KBDMFS */ + ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMFS, 0x0, TC3589x_KBDMFS_EN); + if (ret < 0) + return ret; + + /* enable the keypad clock */ + ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x0, KPD_CLK_EN); + if (ret < 0) + return ret; + + /* clear pending IRQs */ + ret = tc3589x_set_bits(tc3589x, TC3589x_RSTINTCLR, 0x0, 0x1); + if (ret < 0) + return ret; + + /* enable the IRQs */ + ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, 0x0, + TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT); + if (ret < 0) + return ret; + + keypad->keypad_stopped = false; + + return ret; +} + +static int tc3589x_keypad_disable(struct tc_keypad *keypad) +{ + struct tc3589x *tc3589x = keypad->tc3589x; + int ret; + + /* clear IRQ */ + ret = tc3589x_set_bits(tc3589x, TC3589x_KBDIC, + 0x0, TC3589x_EVT_INT_CLR | TC3589x_KBD_INT_CLR); + if (ret < 0) + return ret; + + /* disable all interrupts */ + ret = tc3589x_set_bits(tc3589x, TC3589x_KBDMSK, + ~(TC3589x_EVT_LOSS_INT | TC3589x_EVT_INT), 0x0); + if (ret < 0) + return ret; + + /* disable the keypad module */ + ret = tc3589x_set_bits(tc3589x, TC3589x_CLKEN, 0x1, 0x0); + if (ret < 0) + return ret; + + /* put the keypad module into reset */ + ret = tc3589x_set_bits(tc3589x, TC3589x_RSTCTRL, TC3589x_KBDRST, 0x1); + + keypad->keypad_stopped = true; + + return ret; +} + +static int tc3589x_keypad_open(struct input_dev *input) +{ + int error; + struct tc_keypad *keypad = input_get_drvdata(input); + + /* enable the keypad module */ + error = tc3589x_keypad_enable(keypad); + if (error < 0) { + dev_err(&input->dev, "failed to enable keypad module\n"); + return error; + } + + error = tc3589x_keypad_init_key_hardware(keypad); + if (error < 0) { + dev_err(&input->dev, "failed to configure keypad module\n"); + return error; + } + + return 0; +} + +static void tc3589x_keypad_close(struct input_dev *input) +{ + struct tc_keypad *keypad = input_get_drvdata(input); + + /* disable the keypad module */ + tc3589x_keypad_disable(keypad); +} + +static int tc3589x_keypad_probe(struct platform_device *pdev) +{ + struct tc3589x *tc3589x = dev_get_drvdata(pdev->dev.parent); + struct tc_keypad *keypad; + struct input_dev *input; + const struct tc3589x_keypad_platform_data *plat; + int error, irq; + + plat = tc3589x->pdata->keypad; + if (!plat) { + dev_err(&pdev->dev, "invalid keypad platform data\n"); + return -EINVAL; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + keypad = kzalloc(sizeof(struct tc_keypad), GFP_KERNEL); + input = input_allocate_device(); + if (!keypad || !input) { + dev_err(&pdev->dev, "failed to allocate keypad memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + keypad->board = plat; + keypad->input = input; + keypad->tc3589x = tc3589x; + + input->id.bustype = BUS_I2C; + input->name = pdev->name; + input->dev.parent = &pdev->dev; + + input->open = tc3589x_keypad_open; + input->close = tc3589x_keypad_close; + + error = matrix_keypad_build_keymap(plat->keymap_data, NULL, + TC3589x_MAX_KPROW, TC3589x_MAX_KPCOL, + NULL, input); + if (error) { + dev_err(&pdev->dev, "Failed to build keymap\n"); + goto err_free_mem; + } + + keypad->keymap = input->keycode; + + input_set_capability(input, EV_MSC, MSC_SCAN); + if (!plat->no_autorepeat) + __set_bit(EV_REP, input->evbit); + + input_set_drvdata(input, keypad); + + error = request_threaded_irq(irq, NULL, + tc3589x_keypad_irq, plat->irqtype, + "tc3589x-keypad", keypad); + if (error < 0) { + dev_err(&pdev->dev, + "Could not allocate irq %d,error %d\n", + irq, error); + goto err_free_mem; + } + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, "Could not register input device\n"); + goto err_free_irq; + } + + /* let platform decide if keypad is a wakeup source or not */ + device_init_wakeup(&pdev->dev, plat->enable_wakeup); + device_set_wakeup_capable(&pdev->dev, plat->enable_wakeup); + + platform_set_drvdata(pdev, keypad); + + return 0; + +err_free_irq: + free_irq(irq, keypad); +err_free_mem: + input_free_device(input); + kfree(keypad); + return error; +} + +static int tc3589x_keypad_remove(struct platform_device *pdev) +{ + struct tc_keypad *keypad = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + if (!keypad->keypad_stopped) + tc3589x_keypad_disable(keypad); + + free_irq(irq, keypad); + + input_unregister_device(keypad->input); + + kfree(keypad); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int tc3589x_keypad_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct tc_keypad *keypad = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + /* keypad is already off; we do nothing */ + if (keypad->keypad_stopped) + return 0; + + /* if device is not a wakeup source, disable it for powersave */ + if (!device_may_wakeup(&pdev->dev)) + tc3589x_keypad_disable(keypad); + else + enable_irq_wake(irq); + + return 0; +} + +static int tc3589x_keypad_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct tc_keypad *keypad = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + if (!keypad->keypad_stopped) + return 0; + + /* enable the device to resume normal operations */ + if (!device_may_wakeup(&pdev->dev)) + tc3589x_keypad_enable(keypad); + else + disable_irq_wake(irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(tc3589x_keypad_dev_pm_ops, + tc3589x_keypad_suspend, tc3589x_keypad_resume); + +static struct platform_driver tc3589x_keypad_driver = { + .driver = { + .name = "tc3589x-keypad", + .owner = THIS_MODULE, + .pm = &tc3589x_keypad_dev_pm_ops, + }, + .probe = tc3589x_keypad_probe, + .remove = tc3589x_keypad_remove, +}; +module_platform_driver(tc3589x_keypad_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Jayeeta Banerjee/Sundar Iyer"); +MODULE_DESCRIPTION("TC35893 Keypad Driver"); +MODULE_ALIAS("platform:tc3589x-keypad"); diff --git a/drivers/input/keyboard/tca6416-keypad.c b/drivers/input/keyboard/tca6416-keypad.c new file mode 100644 index 00000000..bfc832c3 --- /dev/null +++ b/drivers/input/keyboard/tca6416-keypad.c @@ -0,0 +1,383 @@ +/* + * Driver for keys on TCA6416 I2C IO expander + * + * Copyright (C) 2010 Texas Instruments + * + * Author : Sriramakrishnan.A.G. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TCA6416_INPUT 0 +#define TCA6416_OUTPUT 1 +#define TCA6416_INVERT 2 +#define TCA6416_DIRECTION 3 + +static const struct i2c_device_id tca6416_id[] = { + { "tca6416-keys", 16, }, + { "tca6408-keys", 8, }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tca6416_id); + +struct tca6416_drv_data { + struct input_dev *input; + struct tca6416_button data[0]; +}; + +struct tca6416_keypad_chip { + uint16_t reg_output; + uint16_t reg_direction; + uint16_t reg_input; + + struct i2c_client *client; + struct input_dev *input; + struct delayed_work dwork; + int io_size; + int irqnum; + u16 pinmask; + bool use_polling; + struct tca6416_button buttons[0]; +}; + +static int tca6416_write_reg(struct tca6416_keypad_chip *chip, int reg, u16 val) +{ + int error; + + error = chip->io_size > 8 ? + i2c_smbus_write_word_data(chip->client, reg << 1, val) : + i2c_smbus_write_byte_data(chip->client, reg, val); + if (error < 0) { + dev_err(&chip->client->dev, + "%s failed, reg: %d, val: %d, error: %d\n", + __func__, reg, val, error); + return error; + } + + return 0; +} + +static int tca6416_read_reg(struct tca6416_keypad_chip *chip, int reg, u16 *val) +{ + int retval; + + retval = chip->io_size > 8 ? + i2c_smbus_read_word_data(chip->client, reg << 1) : + i2c_smbus_read_byte_data(chip->client, reg); + if (retval < 0) { + dev_err(&chip->client->dev, "%s failed, reg: %d, error: %d\n", + __func__, reg, retval); + return retval; + } + + *val = (u16)retval; + return 0; +} + +static void tca6416_keys_scan(struct tca6416_keypad_chip *chip) +{ + struct input_dev *input = chip->input; + u16 reg_val, val; + int error, i, pin_index; + + error = tca6416_read_reg(chip, TCA6416_INPUT, ®_val); + if (error) + return; + + reg_val &= chip->pinmask; + + /* Figure out which lines have changed */ + val = reg_val ^ chip->reg_input; + chip->reg_input = reg_val; + + for (i = 0, pin_index = 0; i < 16; i++) { + if (val & (1 << i)) { + struct tca6416_button *button = &chip->buttons[pin_index]; + unsigned int type = button->type ?: EV_KEY; + int state = ((reg_val & (1 << i)) ? 1 : 0) + ^ button->active_low; + + input_event(input, type, button->code, !!state); + input_sync(input); + } + + if (chip->pinmask & (1 << i)) + pin_index++; + } +} + +/* + * This is threaded IRQ handler and this can (and will) sleep. + */ +static irqreturn_t tca6416_keys_isr(int irq, void *dev_id) +{ + struct tca6416_keypad_chip *chip = dev_id; + + tca6416_keys_scan(chip); + + return IRQ_HANDLED; +} + +static void tca6416_keys_work_func(struct work_struct *work) +{ + struct tca6416_keypad_chip *chip = + container_of(work, struct tca6416_keypad_chip, dwork.work); + + tca6416_keys_scan(chip); + schedule_delayed_work(&chip->dwork, msecs_to_jiffies(100)); +} + +static int tca6416_keys_open(struct input_dev *dev) +{ + struct tca6416_keypad_chip *chip = input_get_drvdata(dev); + + /* Get initial device state in case it has switches */ + tca6416_keys_scan(chip); + + if (chip->use_polling) + schedule_delayed_work(&chip->dwork, msecs_to_jiffies(100)); + else + enable_irq(chip->irqnum); + + return 0; +} + +static void tca6416_keys_close(struct input_dev *dev) +{ + struct tca6416_keypad_chip *chip = input_get_drvdata(dev); + + if (chip->use_polling) + cancel_delayed_work_sync(&chip->dwork); + else + disable_irq(chip->irqnum); +} + +static int tca6416_setup_registers(struct tca6416_keypad_chip *chip) +{ + int error; + + error = tca6416_read_reg(chip, TCA6416_OUTPUT, &chip->reg_output); + if (error) + return error; + + error = tca6416_read_reg(chip, TCA6416_DIRECTION, &chip->reg_direction); + if (error) + return error; + + /* ensure that keypad pins are set to input */ + error = tca6416_write_reg(chip, TCA6416_DIRECTION, + chip->reg_direction | chip->pinmask); + if (error) + return error; + + error = tca6416_read_reg(chip, TCA6416_DIRECTION, &chip->reg_direction); + if (error) + return error; + + error = tca6416_read_reg(chip, TCA6416_INPUT, &chip->reg_input); + if (error) + return error; + + chip->reg_input &= chip->pinmask; + + return 0; +} + +static int tca6416_keypad_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct tca6416_keys_platform_data *pdata; + struct tca6416_keypad_chip *chip; + struct input_dev *input; + int error; + int i; + + /* Check functionality */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { + dev_err(&client->dev, "%s adapter not supported\n", + dev_driver_string(&client->adapter->dev)); + return -ENODEV; + } + + pdata = client->dev.platform_data; + if (!pdata) { + dev_dbg(&client->dev, "no platform data\n"); + return -EINVAL; + } + + chip = kzalloc(sizeof(struct tca6416_keypad_chip) + + pdata->nbuttons * sizeof(struct tca6416_button), + GFP_KERNEL); + input = input_allocate_device(); + if (!chip || !input) { + error = -ENOMEM; + goto fail1; + } + + chip->client = client; + chip->input = input; + chip->io_size = id->driver_data; + chip->pinmask = pdata->pinmask; + chip->use_polling = pdata->use_polling; + + INIT_DELAYED_WORK(&chip->dwork, tca6416_keys_work_func); + + input->phys = "tca6416-keys/input0"; + input->name = client->name; + input->dev.parent = &client->dev; + + input->open = tca6416_keys_open; + input->close = tca6416_keys_close; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + /* Enable auto repeat feature of Linux input subsystem */ + if (pdata->rep) + __set_bit(EV_REP, input->evbit); + + for (i = 0; i < pdata->nbuttons; i++) { + unsigned int type; + + chip->buttons[i] = pdata->buttons[i]; + type = (pdata->buttons[i].type) ?: EV_KEY; + input_set_capability(input, type, pdata->buttons[i].code); + } + + input_set_drvdata(input, chip); + + /* + * Initialize cached registers from their original values. + * we can't share this chip with another i2c master. + */ + error = tca6416_setup_registers(chip); + if (error) + goto fail1; + + if (!chip->use_polling) { + if (pdata->irq_is_gpio) + chip->irqnum = gpio_to_irq(client->irq); + else + chip->irqnum = client->irq; + + error = request_threaded_irq(chip->irqnum, NULL, + tca6416_keys_isr, + IRQF_TRIGGER_FALLING | + IRQF_ONESHOT, + "tca6416-keypad", chip); + if (error) { + dev_dbg(&client->dev, + "Unable to claim irq %d; error %d\n", + chip->irqnum, error); + goto fail1; + } + disable_irq(chip->irqnum); + } + + error = input_register_device(input); + if (error) { + dev_dbg(&client->dev, + "Unable to register input device, error: %d\n", error); + goto fail2; + } + + i2c_set_clientdata(client, chip); + device_init_wakeup(&client->dev, 1); + + return 0; + +fail2: + if (!chip->use_polling) { + free_irq(chip->irqnum, chip); + enable_irq(chip->irqnum); + } +fail1: + input_free_device(input); + kfree(chip); + return error; +} + +static int tca6416_keypad_remove(struct i2c_client *client) +{ + struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); + + if (!chip->use_polling) { + free_irq(chip->irqnum, chip); + enable_irq(chip->irqnum); + } + + input_unregister_device(chip->input); + kfree(chip); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int tca6416_keypad_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); + + if (device_may_wakeup(dev)) + enable_irq_wake(chip->irqnum); + + return 0; +} + +static int tca6416_keypad_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tca6416_keypad_chip *chip = i2c_get_clientdata(client); + + if (device_may_wakeup(dev)) + disable_irq_wake(chip->irqnum); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(tca6416_keypad_dev_pm_ops, + tca6416_keypad_suspend, tca6416_keypad_resume); + +static struct i2c_driver tca6416_keypad_driver = { + .driver = { + .name = "tca6416-keypad", + .pm = &tca6416_keypad_dev_pm_ops, + }, + .probe = tca6416_keypad_probe, + .remove = tca6416_keypad_remove, + .id_table = tca6416_id, +}; + +static int __init tca6416_keypad_init(void) +{ + return i2c_add_driver(&tca6416_keypad_driver); +} + +subsys_initcall(tca6416_keypad_init); + +static void __exit tca6416_keypad_exit(void) +{ + i2c_del_driver(&tca6416_keypad_driver); +} +module_exit(tca6416_keypad_exit); + +MODULE_AUTHOR("Sriramakrishnan "); +MODULE_DESCRIPTION("Keypad driver over tca6146 IO expander"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/tca8418_keypad.c b/drivers/input/keyboard/tca8418_keypad.c new file mode 100644 index 00000000..55c15304 --- /dev/null +++ b/drivers/input/keyboard/tca8418_keypad.c @@ -0,0 +1,421 @@ +/* + * Driver for TCA8418 I2C keyboard + * + * Copyright (C) 2011 Fuel7, Inc. All rights reserved. + * + * Author: Kyle Manna + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + * + * If you can't comply with GPLv2, alternative licensing terms may be + * arranged. Please contact Fuel7, Inc. (http://fuel7.com/) for proprietary + * alternative licensing inquiries. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* TCA8418 hardware limits */ +#define TCA8418_MAX_ROWS 8 +#define TCA8418_MAX_COLS 10 + +/* TCA8418 register offsets */ +#define REG_CFG 0x01 +#define REG_INT_STAT 0x02 +#define REG_KEY_LCK_EC 0x03 +#define REG_KEY_EVENT_A 0x04 +#define REG_KEY_EVENT_B 0x05 +#define REG_KEY_EVENT_C 0x06 +#define REG_KEY_EVENT_D 0x07 +#define REG_KEY_EVENT_E 0x08 +#define REG_KEY_EVENT_F 0x09 +#define REG_KEY_EVENT_G 0x0A +#define REG_KEY_EVENT_H 0x0B +#define REG_KEY_EVENT_I 0x0C +#define REG_KEY_EVENT_J 0x0D +#define REG_KP_LCK_TIMER 0x0E +#define REG_UNLOCK1 0x0F +#define REG_UNLOCK2 0x10 +#define REG_GPIO_INT_STAT1 0x11 +#define REG_GPIO_INT_STAT2 0x12 +#define REG_GPIO_INT_STAT3 0x13 +#define REG_GPIO_DAT_STAT1 0x14 +#define REG_GPIO_DAT_STAT2 0x15 +#define REG_GPIO_DAT_STAT3 0x16 +#define REG_GPIO_DAT_OUT1 0x17 +#define REG_GPIO_DAT_OUT2 0x18 +#define REG_GPIO_DAT_OUT3 0x19 +#define REG_GPIO_INT_EN1 0x1A +#define REG_GPIO_INT_EN2 0x1B +#define REG_GPIO_INT_EN3 0x1C +#define REG_KP_GPIO1 0x1D +#define REG_KP_GPIO2 0x1E +#define REG_KP_GPIO3 0x1F +#define REG_GPI_EM1 0x20 +#define REG_GPI_EM2 0x21 +#define REG_GPI_EM3 0x22 +#define REG_GPIO_DIR1 0x23 +#define REG_GPIO_DIR2 0x24 +#define REG_GPIO_DIR3 0x25 +#define REG_GPIO_INT_LVL1 0x26 +#define REG_GPIO_INT_LVL2 0x27 +#define REG_GPIO_INT_LVL3 0x28 +#define REG_DEBOUNCE_DIS1 0x29 +#define REG_DEBOUNCE_DIS2 0x2A +#define REG_DEBOUNCE_DIS3 0x2B +#define REG_GPIO_PULL1 0x2C +#define REG_GPIO_PULL2 0x2D +#define REG_GPIO_PULL3 0x2E + +/* TCA8418 bit definitions */ +#define CFG_AI BIT(7) +#define CFG_GPI_E_CFG BIT(6) +#define CFG_OVR_FLOW_M BIT(5) +#define CFG_INT_CFG BIT(4) +#define CFG_OVR_FLOW_IEN BIT(3) +#define CFG_K_LCK_IEN BIT(2) +#define CFG_GPI_IEN BIT(1) +#define CFG_KE_IEN BIT(0) + +#define INT_STAT_CAD_INT BIT(4) +#define INT_STAT_OVR_FLOW_INT BIT(3) +#define INT_STAT_K_LCK_INT BIT(2) +#define INT_STAT_GPI_INT BIT(1) +#define INT_STAT_K_INT BIT(0) + +/* TCA8418 register masks */ +#define KEY_LCK_EC_KEC 0x7 +#define KEY_EVENT_CODE 0x7f +#define KEY_EVENT_VALUE 0x80 + +struct tca8418_keypad { + struct i2c_client *client; + struct input_dev *input; + + unsigned int row_shift; +}; + +/* + * Write a byte to the TCA8418 + */ +static int tca8418_write_byte(struct tca8418_keypad *keypad_data, + int reg, u8 val) +{ + int error; + + error = i2c_smbus_write_byte_data(keypad_data->client, reg, val); + if (error < 0) { + dev_err(&keypad_data->client->dev, + "%s failed, reg: %d, val: %d, error: %d\n", + __func__, reg, val, error); + return error; + } + + return 0; +} + +/* + * Read a byte from the TCA8418 + */ +static int tca8418_read_byte(struct tca8418_keypad *keypad_data, + int reg, u8 *val) +{ + int error; + + error = i2c_smbus_read_byte_data(keypad_data->client, reg); + if (error < 0) { + dev_err(&keypad_data->client->dev, + "%s failed, reg: %d, error: %d\n", + __func__, reg, error); + return error; + } + + *val = (u8)error; + + return 0; +} + +static void tca8418_read_keypad(struct tca8418_keypad *keypad_data) +{ + struct input_dev *input = keypad_data->input; + unsigned short *keymap = input->keycode; + int error, col, row; + u8 reg, state, code; + + /* Initial read of the key event FIFO */ + error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®); + + /* Assume that key code 0 signifies empty FIFO */ + while (error >= 0 && reg > 0) { + state = reg & KEY_EVENT_VALUE; + code = reg & KEY_EVENT_CODE; + + row = code / TCA8418_MAX_COLS; + col = code % TCA8418_MAX_COLS; + + row = (col) ? row : row - 1; + col = (col) ? col - 1 : TCA8418_MAX_COLS - 1; + + code = MATRIX_SCAN_CODE(row, col, keypad_data->row_shift); + input_event(input, EV_MSC, MSC_SCAN, code); + input_report_key(input, keymap[code], state); + + /* Read for next loop */ + error = tca8418_read_byte(keypad_data, REG_KEY_EVENT_A, ®); + } + + if (error < 0) + dev_err(&keypad_data->client->dev, + "unable to read REG_KEY_EVENT_A\n"); + + input_sync(input); +} + +/* + * Threaded IRQ handler and this can (and will) sleep. + */ +static irqreturn_t tca8418_irq_handler(int irq, void *dev_id) +{ + struct tca8418_keypad *keypad_data = dev_id; + u8 reg; + int error; + + error = tca8418_read_byte(keypad_data, REG_INT_STAT, ®); + if (error) { + dev_err(&keypad_data->client->dev, + "unable to read REG_INT_STAT\n"); + return IRQ_NONE; + } + + if (!reg) + return IRQ_NONE; + + if (reg & INT_STAT_OVR_FLOW_INT) + dev_warn(&keypad_data->client->dev, "overflow occurred\n"); + + if (reg & INT_STAT_K_INT) + tca8418_read_keypad(keypad_data); + + /* Clear all interrupts, even IRQs we didn't check (GPI, CAD, LCK) */ + reg = 0xff; + error = tca8418_write_byte(keypad_data, REG_INT_STAT, reg); + if (error) + dev_err(&keypad_data->client->dev, + "unable to clear REG_INT_STAT\n"); + + return IRQ_HANDLED; +} + +/* + * Configure the TCA8418 for keypad operation + */ +static int tca8418_configure(struct tca8418_keypad *keypad_data, + u32 rows, u32 cols) +{ + int reg, error; + + /* Write config register, if this fails assume device not present */ + error = tca8418_write_byte(keypad_data, REG_CFG, + CFG_INT_CFG | CFG_OVR_FLOW_IEN | CFG_KE_IEN); + if (error < 0) + return -ENODEV; + + + /* Assemble a mask for row and column registers */ + reg = ~(~0 << rows); + reg += (~(~0 << cols)) << 8; + + /* Set registers to keypad mode */ + error |= tca8418_write_byte(keypad_data, REG_KP_GPIO1, reg); + error |= tca8418_write_byte(keypad_data, REG_KP_GPIO2, reg >> 8); + error |= tca8418_write_byte(keypad_data, REG_KP_GPIO3, reg >> 16); + + /* Enable column debouncing */ + error |= tca8418_write_byte(keypad_data, REG_DEBOUNCE_DIS1, reg); + error |= tca8418_write_byte(keypad_data, REG_DEBOUNCE_DIS2, reg >> 8); + error |= tca8418_write_byte(keypad_data, REG_DEBOUNCE_DIS3, reg >> 16); + + return error; +} + +static int tca8418_keypad_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct device *dev = &client->dev; + const struct tca8418_keypad_platform_data *pdata = + dev_get_platdata(dev); + struct tca8418_keypad *keypad_data; + struct input_dev *input; + const struct matrix_keymap_data *keymap_data = NULL; + u32 rows = 0, cols = 0; + bool rep = false; + bool irq_is_gpio = false; + int irq; + int error, row_shift, max_keys; + + /* Copy the platform data */ + if (pdata) { + if (!pdata->keymap_data) { + dev_err(dev, "no keymap data defined\n"); + return -EINVAL; + } + keymap_data = pdata->keymap_data; + rows = pdata->rows; + cols = pdata->cols; + rep = pdata->rep; + irq_is_gpio = pdata->irq_is_gpio; + } else { + struct device_node *np = dev->of_node; + int err; + + err = matrix_keypad_parse_of_params(dev, &rows, &cols); + if (err) + return err; + rep = of_property_read_bool(np, "keypad,autorepeat"); + } + + if (!rows || rows > TCA8418_MAX_ROWS) { + dev_err(dev, "invalid rows\n"); + return -EINVAL; + } + + if (!cols || cols > TCA8418_MAX_COLS) { + dev_err(dev, "invalid columns\n"); + return -EINVAL; + } + + /* Check i2c driver capabilities */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) { + dev_err(dev, "%s adapter not supported\n", + dev_driver_string(&client->adapter->dev)); + return -ENODEV; + } + + row_shift = get_count_order(cols); + max_keys = rows << row_shift; + + /* Allocate memory for keypad_data and input device */ + keypad_data = devm_kzalloc(dev, sizeof(*keypad_data), GFP_KERNEL); + if (!keypad_data) + return -ENOMEM; + + keypad_data->client = client; + keypad_data->row_shift = row_shift; + + /* Initialize the chip or fail if chip isn't present */ + error = tca8418_configure(keypad_data, rows, cols); + if (error < 0) + return error; + + /* Configure input device */ + input = devm_input_allocate_device(dev); + if (!input) + return -ENOMEM; + + keypad_data->input = input; + + input->name = client->name; + input->id.bustype = BUS_I2C; + input->id.vendor = 0x0001; + input->id.product = 0x001; + input->id.version = 0x0001; + + error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols, + NULL, input); + if (error) { + dev_err(dev, "Failed to build keymap\n"); + return error; + } + + if (rep) + __set_bit(EV_REP, input->evbit); + input_set_capability(input, EV_MSC, MSC_SCAN); + + input_set_drvdata(input, keypad_data); + + irq = client->irq; + if (irq_is_gpio) + irq = gpio_to_irq(irq); + + error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler, + IRQF_TRIGGER_FALLING | + IRQF_SHARED | + IRQF_ONESHOT, + client->name, keypad_data); + if (error) { + dev_err(dev, "Unable to claim irq %d; error %d\n", + client->irq, error); + return error; + } + + error = input_register_device(input); + if (error) { + dev_err(dev, "Unable to register input device, error: %d\n", + error); + return error; + } + + return 0; +} + +static const struct i2c_device_id tca8418_id[] = { + { TCA8418_NAME, 8418, }, + { } +}; +MODULE_DEVICE_TABLE(i2c, tca8418_id); + +#ifdef CONFIG_OF +static const struct of_device_id tca8418_dt_ids[] = { + { .compatible = "ti,tca8418", }, + { } +}; +MODULE_DEVICE_TABLE(of, tca8418_dt_ids); +#endif + +static struct i2c_driver tca8418_keypad_driver = { + .driver = { + .name = TCA8418_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(tca8418_dt_ids), + }, + .probe = tca8418_keypad_probe, + .id_table = tca8418_id, +}; + +static int __init tca8418_keypad_init(void) +{ + return i2c_add_driver(&tca8418_keypad_driver); +} +subsys_initcall(tca8418_keypad_init); + +static void __exit tca8418_keypad_exit(void) +{ + i2c_del_driver(&tca8418_keypad_driver); +} +module_exit(tca8418_keypad_exit); + +MODULE_AUTHOR("Kyle Manna "); +MODULE_DESCRIPTION("Keypad driver for TCA8418"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/tegra-kbc.c b/drivers/input/keyboard/tegra-kbc.c new file mode 100644 index 00000000..b46142f7 --- /dev/null +++ b/drivers/input/keyboard/tegra-kbc.c @@ -0,0 +1,833 @@ +/* + * Keyboard class input driver for the NVIDIA Tegra SoC internal matrix + * keyboard controller + * + * Copyright (c) 2009-2011, NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KBC_MAX_KPENT 8 + +/* Maximum row/column supported by Tegra KBC yet is 16x8 */ +#define KBC_MAX_GPIO 24 +/* Maximum keys supported by Tegra KBC yet is 16 x 8*/ +#define KBC_MAX_KEY (16 * 8) + +#define KBC_MAX_DEBOUNCE_CNT 0x3ffu + +/* KBC row scan time and delay for beginning the row scan. */ +#define KBC_ROW_SCAN_TIME 16 +#define KBC_ROW_SCAN_DLY 5 + +/* KBC uses a 32KHz clock so a cycle = 1/32Khz */ +#define KBC_CYCLE_MS 32 + +/* KBC Registers */ + +/* KBC Control Register */ +#define KBC_CONTROL_0 0x0 +#define KBC_FIFO_TH_CNT_SHIFT(cnt) (cnt << 14) +#define KBC_DEBOUNCE_CNT_SHIFT(cnt) (cnt << 4) +#define KBC_CONTROL_FIFO_CNT_INT_EN (1 << 3) +#define KBC_CONTROL_KEYPRESS_INT_EN (1 << 1) +#define KBC_CONTROL_KBC_EN (1 << 0) + +/* KBC Interrupt Register */ +#define KBC_INT_0 0x4 +#define KBC_INT_FIFO_CNT_INT_STATUS (1 << 2) +#define KBC_INT_KEYPRESS_INT_STATUS (1 << 0) + +#define KBC_ROW_CFG0_0 0x8 +#define KBC_COL_CFG0_0 0x18 +#define KBC_TO_CNT_0 0x24 +#define KBC_INIT_DLY_0 0x28 +#define KBC_RPT_DLY_0 0x2c +#define KBC_KP_ENT0_0 0x30 +#define KBC_KP_ENT1_0 0x34 +#define KBC_ROW0_MASK_0 0x38 + +#define KBC_ROW_SHIFT 3 + +enum tegra_pin_type { + PIN_CFG_IGNORE, + PIN_CFG_COL, + PIN_CFG_ROW, +}; + +/* Tegra KBC hw support */ +struct tegra_kbc_hw_support { + int max_rows; + int max_columns; +}; + +struct tegra_kbc_pin_cfg { + enum tegra_pin_type type; + unsigned char num; +}; + +struct tegra_kbc { + struct device *dev; + unsigned int debounce_cnt; + unsigned int repeat_cnt; + struct tegra_kbc_pin_cfg pin_cfg[KBC_MAX_GPIO]; + const struct matrix_keymap_data *keymap_data; + bool wakeup; + void __iomem *mmio; + struct input_dev *idev; + int irq; + spinlock_t lock; + unsigned int repoll_dly; + unsigned long cp_dly_jiffies; + unsigned int cp_to_wkup_dly; + bool use_fn_map; + bool use_ghost_filter; + bool keypress_caused_wake; + unsigned short keycode[KBC_MAX_KEY * 2]; + unsigned short current_keys[KBC_MAX_KPENT]; + unsigned int num_pressed_keys; + u32 wakeup_key; + struct timer_list timer; + struct clk *clk; + const struct tegra_kbc_hw_support *hw_support; + int max_keys; + int num_rows_and_columns; +}; + +static void tegra_kbc_report_released_keys(struct input_dev *input, + unsigned short old_keycodes[], + unsigned int old_num_keys, + unsigned short new_keycodes[], + unsigned int new_num_keys) +{ + unsigned int i, j; + + for (i = 0; i < old_num_keys; i++) { + for (j = 0; j < new_num_keys; j++) + if (old_keycodes[i] == new_keycodes[j]) + break; + + if (j == new_num_keys) + input_report_key(input, old_keycodes[i], 0); + } +} + +static void tegra_kbc_report_pressed_keys(struct input_dev *input, + unsigned char scancodes[], + unsigned short keycodes[], + unsigned int num_pressed_keys) +{ + unsigned int i; + + for (i = 0; i < num_pressed_keys; i++) { + input_event(input, EV_MSC, MSC_SCAN, scancodes[i]); + input_report_key(input, keycodes[i], 1); + } +} + +static void tegra_kbc_report_keys(struct tegra_kbc *kbc) +{ + unsigned char scancodes[KBC_MAX_KPENT]; + unsigned short keycodes[KBC_MAX_KPENT]; + u32 val = 0; + unsigned int i; + unsigned int num_down = 0; + bool fn_keypress = false; + bool key_in_same_row = false; + bool key_in_same_col = false; + + for (i = 0; i < KBC_MAX_KPENT; i++) { + if ((i % 4) == 0) + val = readl(kbc->mmio + KBC_KP_ENT0_0 + i); + + if (val & 0x80) { + unsigned int col = val & 0x07; + unsigned int row = (val >> 3) & 0x0f; + unsigned char scancode = + MATRIX_SCAN_CODE(row, col, KBC_ROW_SHIFT); + + scancodes[num_down] = scancode; + keycodes[num_down] = kbc->keycode[scancode]; + /* If driver uses Fn map, do not report the Fn key. */ + if ((keycodes[num_down] == KEY_FN) && kbc->use_fn_map) + fn_keypress = true; + else + num_down++; + } + + val >>= 8; + } + + /* + * Matrix keyboard designs are prone to keyboard ghosting. + * Ghosting occurs if there are 3 keys such that - + * any 2 of the 3 keys share a row, and any 2 of them share a column. + * If so ignore the key presses for this iteration. + */ + if (kbc->use_ghost_filter && num_down >= 3) { + for (i = 0; i < num_down; i++) { + unsigned int j; + u8 curr_col = scancodes[i] & 0x07; + u8 curr_row = scancodes[i] >> KBC_ROW_SHIFT; + + /* + * Find 2 keys such that one key is in the same row + * and the other is in the same column as the i-th key. + */ + for (j = i + 1; j < num_down; j++) { + u8 col = scancodes[j] & 0x07; + u8 row = scancodes[j] >> KBC_ROW_SHIFT; + + if (col == curr_col) + key_in_same_col = true; + if (row == curr_row) + key_in_same_row = true; + } + } + } + + /* + * If the platform uses Fn keymaps, translate keys on a Fn keypress. + * Function keycodes are max_keys apart from the plain keycodes. + */ + if (fn_keypress) { + for (i = 0; i < num_down; i++) { + scancodes[i] += kbc->max_keys; + keycodes[i] = kbc->keycode[scancodes[i]]; + } + } + + /* Ignore the key presses for this iteration? */ + if (key_in_same_col && key_in_same_row) + return; + + tegra_kbc_report_released_keys(kbc->idev, + kbc->current_keys, kbc->num_pressed_keys, + keycodes, num_down); + tegra_kbc_report_pressed_keys(kbc->idev, scancodes, keycodes, num_down); + input_sync(kbc->idev); + + memcpy(kbc->current_keys, keycodes, sizeof(kbc->current_keys)); + kbc->num_pressed_keys = num_down; +} + +static void tegra_kbc_set_fifo_interrupt(struct tegra_kbc *kbc, bool enable) +{ + u32 val; + + val = readl(kbc->mmio + KBC_CONTROL_0); + if (enable) + val |= KBC_CONTROL_FIFO_CNT_INT_EN; + else + val &= ~KBC_CONTROL_FIFO_CNT_INT_EN; + writel(val, kbc->mmio + KBC_CONTROL_0); +} + +static void tegra_kbc_keypress_timer(unsigned long data) +{ + struct tegra_kbc *kbc = (struct tegra_kbc *)data; + unsigned long flags; + u32 val; + unsigned int i; + + spin_lock_irqsave(&kbc->lock, flags); + + val = (readl(kbc->mmio + KBC_INT_0) >> 4) & 0xf; + if (val) { + unsigned long dly; + + tegra_kbc_report_keys(kbc); + + /* + * If more than one keys are pressed we need not wait + * for the repoll delay. + */ + dly = (val == 1) ? kbc->repoll_dly : 1; + mod_timer(&kbc->timer, jiffies + msecs_to_jiffies(dly)); + } else { + /* Release any pressed keys and exit the polling loop */ + for (i = 0; i < kbc->num_pressed_keys; i++) + input_report_key(kbc->idev, kbc->current_keys[i], 0); + input_sync(kbc->idev); + + kbc->num_pressed_keys = 0; + + /* All keys are released so enable the keypress interrupt */ + tegra_kbc_set_fifo_interrupt(kbc, true); + } + + spin_unlock_irqrestore(&kbc->lock, flags); +} + +static irqreturn_t tegra_kbc_isr(int irq, void *args) +{ + struct tegra_kbc *kbc = args; + unsigned long flags; + u32 val; + + spin_lock_irqsave(&kbc->lock, flags); + + /* + * Quickly bail out & reenable interrupts if the fifo threshold + * count interrupt wasn't the interrupt source + */ + val = readl(kbc->mmio + KBC_INT_0); + writel(val, kbc->mmio + KBC_INT_0); + + if (val & KBC_INT_FIFO_CNT_INT_STATUS) { + /* + * Until all keys are released, defer further processing to + * the polling loop in tegra_kbc_keypress_timer. + */ + tegra_kbc_set_fifo_interrupt(kbc, false); + mod_timer(&kbc->timer, jiffies + kbc->cp_dly_jiffies); + } else if (val & KBC_INT_KEYPRESS_INT_STATUS) { + /* We can be here only through system resume path */ + kbc->keypress_caused_wake = true; + } + + spin_unlock_irqrestore(&kbc->lock, flags); + + return IRQ_HANDLED; +} + +static void tegra_kbc_setup_wakekeys(struct tegra_kbc *kbc, bool filter) +{ + int i; + unsigned int rst_val; + + /* Either mask all keys or none. */ + rst_val = (filter && !kbc->wakeup) ? ~0 : 0; + + for (i = 0; i < kbc->hw_support->max_rows; i++) + writel(rst_val, kbc->mmio + KBC_ROW0_MASK_0 + i * 4); +} + +static void tegra_kbc_config_pins(struct tegra_kbc *kbc) +{ + int i; + + for (i = 0; i < KBC_MAX_GPIO; i++) { + u32 r_shft = 5 * (i % 6); + u32 c_shft = 4 * (i % 8); + u32 r_mask = 0x1f << r_shft; + u32 c_mask = 0x0f << c_shft; + u32 r_offs = (i / 6) * 4 + KBC_ROW_CFG0_0; + u32 c_offs = (i / 8) * 4 + KBC_COL_CFG0_0; + u32 row_cfg = readl(kbc->mmio + r_offs); + u32 col_cfg = readl(kbc->mmio + c_offs); + + row_cfg &= ~r_mask; + col_cfg &= ~c_mask; + + switch (kbc->pin_cfg[i].type) { + case PIN_CFG_ROW: + row_cfg |= ((kbc->pin_cfg[i].num << 1) | 1) << r_shft; + break; + + case PIN_CFG_COL: + col_cfg |= ((kbc->pin_cfg[i].num << 1) | 1) << c_shft; + break; + + case PIN_CFG_IGNORE: + break; + } + + writel(row_cfg, kbc->mmio + r_offs); + writel(col_cfg, kbc->mmio + c_offs); + } +} + +static int tegra_kbc_start(struct tegra_kbc *kbc) +{ + unsigned int debounce_cnt; + u32 val = 0; + + clk_prepare_enable(kbc->clk); + + /* Reset the KBC controller to clear all previous status.*/ + tegra_periph_reset_assert(kbc->clk); + udelay(100); + tegra_periph_reset_deassert(kbc->clk); + udelay(100); + + tegra_kbc_config_pins(kbc); + tegra_kbc_setup_wakekeys(kbc, false); + + writel(kbc->repeat_cnt, kbc->mmio + KBC_RPT_DLY_0); + + /* Keyboard debounce count is maximum of 12 bits. */ + debounce_cnt = min(kbc->debounce_cnt, KBC_MAX_DEBOUNCE_CNT); + val = KBC_DEBOUNCE_CNT_SHIFT(debounce_cnt); + val |= KBC_FIFO_TH_CNT_SHIFT(1); /* set fifo interrupt threshold to 1 */ + val |= KBC_CONTROL_FIFO_CNT_INT_EN; /* interrupt on FIFO threshold */ + val |= KBC_CONTROL_KBC_EN; /* enable */ + writel(val, kbc->mmio + KBC_CONTROL_0); + + /* + * Compute the delay(ns) from interrupt mode to continuous polling + * mode so the timer routine is scheduled appropriately. + */ + val = readl(kbc->mmio + KBC_INIT_DLY_0); + kbc->cp_dly_jiffies = usecs_to_jiffies((val & 0xfffff) * 32); + + kbc->num_pressed_keys = 0; + + /* + * Atomically clear out any remaining entries in the key FIFO + * and enable keyboard interrupts. + */ + while (1) { + val = readl(kbc->mmio + KBC_INT_0); + val >>= 4; + if (!val) + break; + + val = readl(kbc->mmio + KBC_KP_ENT0_0); + val = readl(kbc->mmio + KBC_KP_ENT1_0); + } + writel(0x7, kbc->mmio + KBC_INT_0); + + enable_irq(kbc->irq); + + return 0; +} + +static void tegra_kbc_stop(struct tegra_kbc *kbc) +{ + unsigned long flags; + u32 val; + + spin_lock_irqsave(&kbc->lock, flags); + val = readl(kbc->mmio + KBC_CONTROL_0); + val &= ~1; + writel(val, kbc->mmio + KBC_CONTROL_0); + spin_unlock_irqrestore(&kbc->lock, flags); + + disable_irq(kbc->irq); + del_timer_sync(&kbc->timer); + + clk_disable_unprepare(kbc->clk); +} + +static int tegra_kbc_open(struct input_dev *dev) +{ + struct tegra_kbc *kbc = input_get_drvdata(dev); + + return tegra_kbc_start(kbc); +} + +static void tegra_kbc_close(struct input_dev *dev) +{ + struct tegra_kbc *kbc = input_get_drvdata(dev); + + return tegra_kbc_stop(kbc); +} + +static bool tegra_kbc_check_pin_cfg(const struct tegra_kbc *kbc, + unsigned int *num_rows) +{ + int i; + + *num_rows = 0; + + for (i = 0; i < KBC_MAX_GPIO; i++) { + const struct tegra_kbc_pin_cfg *pin_cfg = &kbc->pin_cfg[i]; + + switch (pin_cfg->type) { + case PIN_CFG_ROW: + if (pin_cfg->num >= kbc->hw_support->max_rows) { + dev_err(kbc->dev, + "pin_cfg[%d]: invalid row number %d\n", + i, pin_cfg->num); + return false; + } + (*num_rows)++; + break; + + case PIN_CFG_COL: + if (pin_cfg->num >= kbc->hw_support->max_columns) { + dev_err(kbc->dev, + "pin_cfg[%d]: invalid column number %d\n", + i, pin_cfg->num); + return false; + } + break; + + case PIN_CFG_IGNORE: + break; + + default: + dev_err(kbc->dev, + "pin_cfg[%d]: invalid entry type %d\n", + pin_cfg->type, pin_cfg->num); + return false; + } + } + + return true; +} + +static int tegra_kbc_parse_dt(struct tegra_kbc *kbc) +{ + struct device_node *np = kbc->dev->of_node; + u32 prop; + int i; + u32 num_rows = 0; + u32 num_cols = 0; + u32 cols_cfg[KBC_MAX_GPIO]; + u32 rows_cfg[KBC_MAX_GPIO]; + int proplen; + int ret; + + if (!of_property_read_u32(np, "nvidia,debounce-delay-ms", &prop)) + kbc->debounce_cnt = prop; + + if (!of_property_read_u32(np, "nvidia,repeat-delay-ms", &prop)) + kbc->repeat_cnt = prop; + + if (of_find_property(np, "nvidia,needs-ghost-filter", NULL)) + kbc->use_ghost_filter = true; + + if (of_find_property(np, "nvidia,wakeup-source", NULL)) + kbc->wakeup = true; + + if (!of_get_property(np, "nvidia,kbc-row-pins", &proplen)) { + dev_err(kbc->dev, "property nvidia,kbc-row-pins not found\n"); + return -ENOENT; + } + num_rows = proplen / sizeof(u32); + + if (!of_get_property(np, "nvidia,kbc-col-pins", &proplen)) { + dev_err(kbc->dev, "property nvidia,kbc-col-pins not found\n"); + return -ENOENT; + } + num_cols = proplen / sizeof(u32); + + if (num_rows > kbc->hw_support->max_rows) { + dev_err(kbc->dev, + "Number of rows is more than supported by hardware\n"); + return -EINVAL; + } + + if (num_cols > kbc->hw_support->max_columns) { + dev_err(kbc->dev, + "Number of cols is more than supported by hardware\n"); + return -EINVAL; + } + + if (!of_get_property(np, "linux,keymap", &proplen)) { + dev_err(kbc->dev, "property linux,keymap not found\n"); + return -ENOENT; + } + + if (!num_rows || !num_cols || ((num_rows + num_cols) > KBC_MAX_GPIO)) { + dev_err(kbc->dev, + "keypad rows/columns not porperly specified\n"); + return -EINVAL; + } + + /* Set all pins as non-configured */ + for (i = 0; i < kbc->num_rows_and_columns; i++) + kbc->pin_cfg[i].type = PIN_CFG_IGNORE; + + ret = of_property_read_u32_array(np, "nvidia,kbc-row-pins", + rows_cfg, num_rows); + if (ret < 0) { + dev_err(kbc->dev, "Rows configurations are not proper\n"); + return -EINVAL; + } + + ret = of_property_read_u32_array(np, "nvidia,kbc-col-pins", + cols_cfg, num_cols); + if (ret < 0) { + dev_err(kbc->dev, "Cols configurations are not proper\n"); + return -EINVAL; + } + + for (i = 0; i < num_rows; i++) { + kbc->pin_cfg[rows_cfg[i]].type = PIN_CFG_ROW; + kbc->pin_cfg[rows_cfg[i]].num = i; + } + + for (i = 0; i < num_cols; i++) { + kbc->pin_cfg[cols_cfg[i]].type = PIN_CFG_COL; + kbc->pin_cfg[cols_cfg[i]].num = i; + } + + return 0; +} + +static const struct tegra_kbc_hw_support tegra20_kbc_hw_support = { + .max_rows = 16, + .max_columns = 8, +}; + +static const struct tegra_kbc_hw_support tegra11_kbc_hw_support = { + .max_rows = 11, + .max_columns = 8, +}; + +static const struct of_device_id tegra_kbc_of_match[] = { + { .compatible = "nvidia,tegra114-kbc", .data = &tegra11_kbc_hw_support}, + { .compatible = "nvidia,tegra30-kbc", .data = &tegra20_kbc_hw_support}, + { .compatible = "nvidia,tegra20-kbc", .data = &tegra20_kbc_hw_support}, + { }, +}; +MODULE_DEVICE_TABLE(of, tegra_kbc_of_match); + +static int tegra_kbc_probe(struct platform_device *pdev) +{ + struct tegra_kbc *kbc; + struct resource *res; + int err; + int num_rows = 0; + unsigned int debounce_cnt; + unsigned int scan_time_rows; + unsigned int keymap_rows; + const struct of_device_id *match; + + match = of_match_device(of_match_ptr(tegra_kbc_of_match), &pdev->dev); + + kbc = devm_kzalloc(&pdev->dev, sizeof(*kbc), GFP_KERNEL); + if (!kbc) { + dev_err(&pdev->dev, "failed to alloc memory for kbc\n"); + return -ENOMEM; + } + + kbc->dev = &pdev->dev; + kbc->hw_support = match->data; + kbc->max_keys = kbc->hw_support->max_rows * + kbc->hw_support->max_columns; + kbc->num_rows_and_columns = kbc->hw_support->max_rows + + kbc->hw_support->max_columns; + keymap_rows = kbc->max_keys; + spin_lock_init(&kbc->lock); + + err = tegra_kbc_parse_dt(kbc); + if (err) + return err; + + if (!tegra_kbc_check_pin_cfg(kbc, &num_rows)) + return -EINVAL; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "failed to get I/O memory\n"); + return -ENXIO; + } + + kbc->irq = platform_get_irq(pdev, 0); + if (kbc->irq < 0) { + dev_err(&pdev->dev, "failed to get keyboard IRQ\n"); + return -ENXIO; + } + + kbc->idev = devm_input_allocate_device(&pdev->dev); + if (!kbc->idev) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + return -ENOMEM; + } + + setup_timer(&kbc->timer, tegra_kbc_keypress_timer, (unsigned long)kbc); + + kbc->mmio = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(kbc->mmio)) + return PTR_ERR(kbc->mmio); + + kbc->clk = devm_clk_get(&pdev->dev, NULL); + if (IS_ERR(kbc->clk)) { + dev_err(&pdev->dev, "failed to get keyboard clock\n"); + return PTR_ERR(kbc->clk); + } + + /* + * The time delay between two consecutive reads of the FIFO is + * the sum of the repeat time and the time taken for scanning + * the rows. There is an additional delay before the row scanning + * starts. The repoll delay is computed in milliseconds. + */ + debounce_cnt = min(kbc->debounce_cnt, KBC_MAX_DEBOUNCE_CNT); + scan_time_rows = (KBC_ROW_SCAN_TIME + debounce_cnt) * num_rows; + kbc->repoll_dly = KBC_ROW_SCAN_DLY + scan_time_rows + kbc->repeat_cnt; + kbc->repoll_dly = DIV_ROUND_UP(kbc->repoll_dly, KBC_CYCLE_MS); + + kbc->idev->name = pdev->name; + kbc->idev->id.bustype = BUS_HOST; + kbc->idev->dev.parent = &pdev->dev; + kbc->idev->open = tegra_kbc_open; + kbc->idev->close = tegra_kbc_close; + + if (kbc->keymap_data && kbc->use_fn_map) + keymap_rows *= 2; + + err = matrix_keypad_build_keymap(kbc->keymap_data, NULL, + keymap_rows, + kbc->hw_support->max_columns, + kbc->keycode, kbc->idev); + if (err) { + dev_err(&pdev->dev, "failed to setup keymap\n"); + return err; + } + + __set_bit(EV_REP, kbc->idev->evbit); + input_set_capability(kbc->idev, EV_MSC, MSC_SCAN); + + input_set_drvdata(kbc->idev, kbc); + + err = devm_request_irq(&pdev->dev, kbc->irq, tegra_kbc_isr, + IRQF_NO_SUSPEND | IRQF_TRIGGER_HIGH, pdev->name, kbc); + if (err) { + dev_err(&pdev->dev, "failed to request keyboard IRQ\n"); + return err; + } + + disable_irq(kbc->irq); + + err = input_register_device(kbc->idev); + if (err) { + dev_err(&pdev->dev, "failed to register input device\n"); + return err; + } + + platform_set_drvdata(pdev, kbc); + device_init_wakeup(&pdev->dev, kbc->wakeup); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static void tegra_kbc_set_keypress_interrupt(struct tegra_kbc *kbc, bool enable) +{ + u32 val; + + val = readl(kbc->mmio + KBC_CONTROL_0); + if (enable) + val |= KBC_CONTROL_KEYPRESS_INT_EN; + else + val &= ~KBC_CONTROL_KEYPRESS_INT_EN; + writel(val, kbc->mmio + KBC_CONTROL_0); +} + +static int tegra_kbc_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct tegra_kbc *kbc = platform_get_drvdata(pdev); + + mutex_lock(&kbc->idev->mutex); + if (device_may_wakeup(&pdev->dev)) { + disable_irq(kbc->irq); + del_timer_sync(&kbc->timer); + tegra_kbc_set_fifo_interrupt(kbc, false); + + /* Forcefully clear the interrupt status */ + writel(0x7, kbc->mmio + KBC_INT_0); + /* + * Store the previous resident time of continuous polling mode. + * Force the keyboard into interrupt mode. + */ + kbc->cp_to_wkup_dly = readl(kbc->mmio + KBC_TO_CNT_0); + writel(0, kbc->mmio + KBC_TO_CNT_0); + + tegra_kbc_setup_wakekeys(kbc, true); + msleep(30); + + kbc->keypress_caused_wake = false; + /* Enable keypress interrupt before going into suspend. */ + tegra_kbc_set_keypress_interrupt(kbc, true); + enable_irq(kbc->irq); + enable_irq_wake(kbc->irq); + } else { + if (kbc->idev->users) + tegra_kbc_stop(kbc); + } + mutex_unlock(&kbc->idev->mutex); + + return 0; +} + +static int tegra_kbc_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct tegra_kbc *kbc = platform_get_drvdata(pdev); + int err = 0; + + mutex_lock(&kbc->idev->mutex); + if (device_may_wakeup(&pdev->dev)) { + disable_irq_wake(kbc->irq); + tegra_kbc_setup_wakekeys(kbc, false); + /* We will use fifo interrupts for key detection. */ + tegra_kbc_set_keypress_interrupt(kbc, false); + + /* Restore the resident time of continuous polling mode. */ + writel(kbc->cp_to_wkup_dly, kbc->mmio + KBC_TO_CNT_0); + + tegra_kbc_set_fifo_interrupt(kbc, true); + + if (kbc->keypress_caused_wake && kbc->wakeup_key) { + /* + * We can't report events directly from the ISR + * because timekeeping is stopped when processing + * wakeup request and we get a nasty warning when + * we try to call do_gettimeofday() in evdev + * handler. + */ + input_report_key(kbc->idev, kbc->wakeup_key, 1); + input_sync(kbc->idev); + input_report_key(kbc->idev, kbc->wakeup_key, 0); + input_sync(kbc->idev); + } + } else { + if (kbc->idev->users) + err = tegra_kbc_start(kbc); + } + mutex_unlock(&kbc->idev->mutex); + + return err; +} +#endif + +static SIMPLE_DEV_PM_OPS(tegra_kbc_pm_ops, tegra_kbc_suspend, tegra_kbc_resume); + +static struct platform_driver tegra_kbc_driver = { + .probe = tegra_kbc_probe, + .driver = { + .name = "tegra-kbc", + .owner = THIS_MODULE, + .pm = &tegra_kbc_pm_ops, + .of_match_table = tegra_kbc_of_match, + }, +}; +module_platform_driver(tegra_kbc_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Rakesh Iyer "); +MODULE_DESCRIPTION("Tegra matrix keyboard controller driver"); +MODULE_ALIAS("platform:tegra-kbc"); diff --git a/drivers/input/keyboard/tnetv107x-keypad.c b/drivers/input/keyboard/tnetv107x-keypad.c new file mode 100644 index 00000000..ee163501 --- /dev/null +++ b/drivers/input/keyboard/tnetv107x-keypad.c @@ -0,0 +1,331 @@ +/* + * Texas Instruments TNETV107X Keypad Driver + * + * Copyright (C) 2010 Texas Instruments + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BITS(x) (BIT(x) - 1) + +#define KEYPAD_ROWS 9 +#define KEYPAD_COLS 9 + +#define DEBOUNCE_MIN 0x400ul +#define DEBOUNCE_MAX 0x3ffffffful + +struct keypad_regs { + u32 rev; + u32 mode; + u32 mask; + u32 pol; + u32 dclock; + u32 rclock; + u32 stable_cnt; + u32 in_en; + u32 out; + u32 out_en; + u32 in; + u32 lock; + u32 pres[3]; +}; + +#define keypad_read(kp, reg) __raw_readl(&(kp)->regs->reg) +#define keypad_write(kp, reg, val) __raw_writel(val, &(kp)->regs->reg) + +struct keypad_data { + struct input_dev *input_dev; + struct resource *res; + struct keypad_regs __iomem *regs; + struct clk *clk; + struct device *dev; + spinlock_t lock; + u32 irq_press; + u32 irq_release; + int rows, cols, row_shift; + int debounce_ms, active_low; + u32 prev_keys[3]; + unsigned short keycodes[]; +}; + +static irqreturn_t keypad_irq(int irq, void *data) +{ + struct keypad_data *kp = data; + int i, bit, val, row, col, code; + unsigned long flags; + u32 curr_keys[3]; + u32 change; + + spin_lock_irqsave(&kp->lock, flags); + + memset(curr_keys, 0, sizeof(curr_keys)); + if (irq == kp->irq_press) + for (i = 0; i < 3; i++) + curr_keys[i] = keypad_read(kp, pres[i]); + + for (i = 0; i < 3; i++) { + change = curr_keys[i] ^ kp->prev_keys[i]; + + while (change) { + bit = fls(change) - 1; + change ^= BIT(bit); + val = curr_keys[i] & BIT(bit); + bit += i * 32; + row = bit / KEYPAD_COLS; + col = bit % KEYPAD_COLS; + + code = MATRIX_SCAN_CODE(row, col, kp->row_shift); + input_event(kp->input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(kp->input_dev, kp->keycodes[code], + val); + } + } + input_sync(kp->input_dev); + memcpy(kp->prev_keys, curr_keys, sizeof(curr_keys)); + + if (irq == kp->irq_press) + keypad_write(kp, lock, 0); /* Allow hardware updates */ + + spin_unlock_irqrestore(&kp->lock, flags); + + return IRQ_HANDLED; +} + +static int keypad_start(struct input_dev *dev) +{ + struct keypad_data *kp = input_get_drvdata(dev); + unsigned long mask, debounce, clk_rate_khz; + unsigned long flags; + + clk_enable(kp->clk); + clk_rate_khz = clk_get_rate(kp->clk) / 1000; + + spin_lock_irqsave(&kp->lock, flags); + + /* Initialize device registers */ + keypad_write(kp, mode, 0); + + mask = BITS(kp->rows) << KEYPAD_COLS; + mask |= BITS(kp->cols); + keypad_write(kp, mask, ~mask); + + keypad_write(kp, pol, kp->active_low ? 0 : 0x3ffff); + keypad_write(kp, stable_cnt, 3); + + debounce = kp->debounce_ms * clk_rate_khz; + debounce = clamp(debounce, DEBOUNCE_MIN, DEBOUNCE_MAX); + keypad_write(kp, dclock, debounce); + keypad_write(kp, rclock, 4 * debounce); + + keypad_write(kp, in_en, 1); + + spin_unlock_irqrestore(&kp->lock, flags); + + return 0; +} + +static void keypad_stop(struct input_dev *dev) +{ + struct keypad_data *kp = input_get_drvdata(dev); + + synchronize_irq(kp->irq_press); + synchronize_irq(kp->irq_release); + clk_disable(kp->clk); +} + +static int keypad_probe(struct platform_device *pdev) +{ + const struct matrix_keypad_platform_data *pdata; + const struct matrix_keymap_data *keymap_data; + struct device *dev = &pdev->dev; + struct keypad_data *kp; + int error = 0, sz, row_shift; + u32 rev = 0; + + pdata = pdev->dev.platform_data; + if (!pdata) { + dev_err(dev, "cannot find device data\n"); + return -EINVAL; + } + + keymap_data = pdata->keymap_data; + if (!keymap_data) { + dev_err(dev, "cannot find keymap data\n"); + return -EINVAL; + } + + row_shift = get_count_order(pdata->num_col_gpios); + sz = offsetof(struct keypad_data, keycodes); + sz += (pdata->num_row_gpios << row_shift) * sizeof(kp->keycodes[0]); + kp = kzalloc(sz, GFP_KERNEL); + if (!kp) { + dev_err(dev, "cannot allocate device info\n"); + return -ENOMEM; + } + + kp->dev = dev; + kp->rows = pdata->num_row_gpios; + kp->cols = pdata->num_col_gpios; + kp->row_shift = row_shift; + platform_set_drvdata(pdev, kp); + spin_lock_init(&kp->lock); + + kp->irq_press = platform_get_irq_byname(pdev, "press"); + kp->irq_release = platform_get_irq_byname(pdev, "release"); + if (kp->irq_press < 0 || kp->irq_release < 0) { + dev_err(dev, "cannot determine device interrupts\n"); + error = -ENODEV; + goto error_res; + } + + kp->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!kp->res) { + dev_err(dev, "cannot determine register area\n"); + error = -ENODEV; + goto error_res; + } + + if (!request_mem_region(kp->res->start, resource_size(kp->res), + pdev->name)) { + dev_err(dev, "cannot claim register memory\n"); + kp->res = NULL; + error = -EINVAL; + goto error_res; + } + + kp->regs = ioremap(kp->res->start, resource_size(kp->res)); + if (!kp->regs) { + dev_err(dev, "cannot map register memory\n"); + error = -ENOMEM; + goto error_map; + } + + kp->clk = clk_get(dev, NULL); + if (IS_ERR(kp->clk)) { + dev_err(dev, "cannot claim device clock\n"); + error = PTR_ERR(kp->clk); + goto error_clk; + } + + error = request_threaded_irq(kp->irq_press, NULL, keypad_irq, + IRQF_ONESHOT, dev_name(dev), kp); + if (error < 0) { + dev_err(kp->dev, "Could not allocate keypad press key irq\n"); + goto error_irq_press; + } + + error = request_threaded_irq(kp->irq_release, NULL, keypad_irq, + IRQF_ONESHOT, dev_name(dev), kp); + if (error < 0) { + dev_err(kp->dev, "Could not allocate keypad release key irq\n"); + goto error_irq_release; + } + + kp->input_dev = input_allocate_device(); + if (!kp->input_dev) { + dev_err(dev, "cannot allocate input device\n"); + error = -ENOMEM; + goto error_input; + } + + kp->input_dev->name = pdev->name; + kp->input_dev->dev.parent = &pdev->dev; + kp->input_dev->open = keypad_start; + kp->input_dev->close = keypad_stop; + + clk_enable(kp->clk); + rev = keypad_read(kp, rev); + kp->input_dev->id.bustype = BUS_HOST; + kp->input_dev->id.product = ((rev >> 8) & 0x07); + kp->input_dev->id.version = ((rev >> 16) & 0xfff); + clk_disable(kp->clk); + + error = matrix_keypad_build_keymap(keymap_data, NULL, + kp->rows, kp->cols, + kp->keycodes, kp->input_dev); + if (error) { + dev_err(dev, "Failed to build keymap\n"); + goto error_reg; + } + + if (!pdata->no_autorepeat) + kp->input_dev->evbit[0] |= BIT_MASK(EV_REP); + input_set_capability(kp->input_dev, EV_MSC, MSC_SCAN); + + input_set_drvdata(kp->input_dev, kp); + + error = input_register_device(kp->input_dev); + if (error < 0) { + dev_err(dev, "Could not register input device\n"); + goto error_reg; + } + + return 0; + + +error_reg: + input_free_device(kp->input_dev); +error_input: + free_irq(kp->irq_release, kp); +error_irq_release: + free_irq(kp->irq_press, kp); +error_irq_press: + clk_put(kp->clk); +error_clk: + iounmap(kp->regs); +error_map: + release_mem_region(kp->res->start, resource_size(kp->res)); +error_res: + platform_set_drvdata(pdev, NULL); + kfree(kp); + return error; +} + +static int keypad_remove(struct platform_device *pdev) +{ + struct keypad_data *kp = platform_get_drvdata(pdev); + + free_irq(kp->irq_press, kp); + free_irq(kp->irq_release, kp); + input_unregister_device(kp->input_dev); + clk_put(kp->clk); + iounmap(kp->regs); + release_mem_region(kp->res->start, resource_size(kp->res)); + platform_set_drvdata(pdev, NULL); + kfree(kp); + + return 0; +} + +static struct platform_driver keypad_driver = { + .probe = keypad_probe, + .remove = keypad_remove, + .driver.name = "tnetv107x-keypad", + .driver.owner = THIS_MODULE, +}; +module_platform_driver(keypad_driver); + +MODULE_AUTHOR("Cyril Chemparathy"); +MODULE_DESCRIPTION("TNETV107X Keypad Driver"); +MODULE_ALIAS("platform:tnetv107x-keypad"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c new file mode 100644 index 00000000..04f84fd5 --- /dev/null +++ b/drivers/input/keyboard/twl4030_keypad.c @@ -0,0 +1,466 @@ +/* + * twl4030_keypad.c - driver for 8x8 keypad controller in twl4030 chips + * + * Copyright (C) 2007 Texas Instruments, Inc. + * Copyright (C) 2008 Nokia Corporation + * + * Code re-written for 2430SDP by: + * Syed Mohammed Khasim + * + * Initial Code: + * Manjunatha G K + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * The TWL4030 family chips include a keypad controller that supports + * up to an 8x8 switch matrix. The controller can issue system wakeup + * events, since it uses only the always-on 32KiHz oscillator, and has + * an internal state machine that decodes pressed keys, including + * multi-key combinations. + * + * This driver lets boards define what keycodes they wish to report for + * which scancodes, as part of the "struct twl4030_keypad_data" used in + * the probe() routine. + * + * See the TPS65950 documentation; that's the general availability + * version of the TWL5030 second generation part. + */ +#define TWL4030_MAX_ROWS 8 /* TWL4030 hard limit */ +#define TWL4030_MAX_COLS 8 +/* + * Note that we add space for an extra column so that we can handle + * row lines connected to the gnd (see twl4030_col_xlate()). + */ +#define TWL4030_ROW_SHIFT 4 +#define TWL4030_KEYMAP_SIZE (TWL4030_MAX_ROWS << TWL4030_ROW_SHIFT) + +struct twl4030_keypad { + unsigned short keymap[TWL4030_KEYMAP_SIZE]; + u16 kp_state[TWL4030_MAX_ROWS]; + unsigned n_rows; + unsigned n_cols; + unsigned irq; + + struct device *dbg_dev; + struct input_dev *input; +}; + +/*----------------------------------------------------------------------*/ + +/* arbitrary prescaler value 0..7 */ +#define PTV_PRESCALER 4 + +/* Register Offsets */ +#define KEYP_CTRL 0x00 +#define KEYP_DEB 0x01 +#define KEYP_LONG_KEY 0x02 +#define KEYP_LK_PTV 0x03 +#define KEYP_TIMEOUT_L 0x04 +#define KEYP_TIMEOUT_H 0x05 +#define KEYP_KBC 0x06 +#define KEYP_KBR 0x07 +#define KEYP_SMS 0x08 +#define KEYP_FULL_CODE_7_0 0x09 /* row 0 column status */ +#define KEYP_FULL_CODE_15_8 0x0a /* ... row 1 ... */ +#define KEYP_FULL_CODE_23_16 0x0b +#define KEYP_FULL_CODE_31_24 0x0c +#define KEYP_FULL_CODE_39_32 0x0d +#define KEYP_FULL_CODE_47_40 0x0e +#define KEYP_FULL_CODE_55_48 0x0f +#define KEYP_FULL_CODE_63_56 0x10 +#define KEYP_ISR1 0x11 +#define KEYP_IMR1 0x12 +#define KEYP_ISR2 0x13 +#define KEYP_IMR2 0x14 +#define KEYP_SIR 0x15 +#define KEYP_EDR 0x16 /* edge triggers */ +#define KEYP_SIH_CTRL 0x17 + +/* KEYP_CTRL_REG Fields */ +#define KEYP_CTRL_SOFT_NRST BIT(0) +#define KEYP_CTRL_SOFTMODEN BIT(1) +#define KEYP_CTRL_LK_EN BIT(2) +#define KEYP_CTRL_TOE_EN BIT(3) +#define KEYP_CTRL_TOLE_EN BIT(4) +#define KEYP_CTRL_RP_EN BIT(5) +#define KEYP_CTRL_KBD_ON BIT(6) + +/* KEYP_DEB, KEYP_LONG_KEY, KEYP_TIMEOUT_x*/ +#define KEYP_PERIOD_US(t, prescale) ((t) / (31 << (prescale + 1)) - 1) + +/* KEYP_LK_PTV_REG Fields */ +#define KEYP_LK_PTV_PTV_SHIFT 5 + +/* KEYP_{IMR,ISR,SIR} Fields */ +#define KEYP_IMR1_MIS BIT(3) +#define KEYP_IMR1_TO BIT(2) +#define KEYP_IMR1_LK BIT(1) +#define KEYP_IMR1_KP BIT(0) + +/* KEYP_EDR Fields */ +#define KEYP_EDR_KP_FALLING 0x01 +#define KEYP_EDR_KP_RISING 0x02 +#define KEYP_EDR_KP_BOTH 0x03 +#define KEYP_EDR_LK_FALLING 0x04 +#define KEYP_EDR_LK_RISING 0x08 +#define KEYP_EDR_TO_FALLING 0x10 +#define KEYP_EDR_TO_RISING 0x20 +#define KEYP_EDR_MIS_FALLING 0x40 +#define KEYP_EDR_MIS_RISING 0x80 + + +/*----------------------------------------------------------------------*/ + +static int twl4030_kpread(struct twl4030_keypad *kp, + u8 *data, u32 reg, u8 num_bytes) +{ + int ret = twl_i2c_read(TWL4030_MODULE_KEYPAD, data, reg, num_bytes); + + if (ret < 0) + dev_warn(kp->dbg_dev, + "Couldn't read TWL4030: %X - ret %d[%x]\n", + reg, ret, ret); + + return ret; +} + +static int twl4030_kpwrite_u8(struct twl4030_keypad *kp, u8 data, u32 reg) +{ + int ret = twl_i2c_write_u8(TWL4030_MODULE_KEYPAD, data, reg); + + if (ret < 0) + dev_warn(kp->dbg_dev, + "Could not write TWL4030: %X - ret %d[%x]\n", + reg, ret, ret); + + return ret; +} + +static inline u16 twl4030_col_xlate(struct twl4030_keypad *kp, u8 col) +{ + /* If all bits in a row are active for all coloumns then + * we have that row line connected to gnd. Mark this + * key on as if it was on matrix position n_cols (ie + * one higher than the size of the matrix). + */ + if (col == 0xFF) + return 1 << kp->n_cols; + else + return col & ((1 << kp->n_cols) - 1); +} + +static int twl4030_read_kp_matrix_state(struct twl4030_keypad *kp, u16 *state) +{ + u8 new_state[TWL4030_MAX_ROWS]; + int row; + int ret = twl4030_kpread(kp, new_state, + KEYP_FULL_CODE_7_0, kp->n_rows); + if (ret >= 0) + for (row = 0; row < kp->n_rows; row++) + state[row] = twl4030_col_xlate(kp, new_state[row]); + + return ret; +} + +static bool twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) +{ + int i; + u16 check = 0; + + for (i = 0; i < kp->n_rows; i++) { + u16 col = key_state[i]; + + if ((col & check) && hweight16(col) > 1) + return true; + + check |= col; + } + + return false; +} + +static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) +{ + struct input_dev *input = kp->input; + u16 new_state[TWL4030_MAX_ROWS]; + int col, row; + + if (release_all) + memset(new_state, 0, sizeof(new_state)); + else { + /* check for any changes */ + int ret = twl4030_read_kp_matrix_state(kp, new_state); + + if (ret < 0) /* panic ... */ + return; + + if (twl4030_is_in_ghost_state(kp, new_state)) + return; + } + + /* check for changes and print those */ + for (row = 0; row < kp->n_rows; row++) { + int changed = new_state[row] ^ kp->kp_state[row]; + + if (!changed) + continue; + + /* Extra column handles "all gnd" rows */ + for (col = 0; col < kp->n_cols + 1; col++) { + int code; + + if (!(changed & (1 << col))) + continue; + + dev_dbg(kp->dbg_dev, "key [%d:%d] %s\n", row, col, + (new_state[row] & (1 << col)) ? + "press" : "release"); + + code = MATRIX_SCAN_CODE(row, col, TWL4030_ROW_SHIFT); + input_event(input, EV_MSC, MSC_SCAN, code); + input_report_key(input, kp->keymap[code], + new_state[row] & (1 << col)); + } + kp->kp_state[row] = new_state[row]; + } + input_sync(input); +} + +/* + * Keypad interrupt handler + */ +static irqreturn_t do_kp_irq(int irq, void *_kp) +{ + struct twl4030_keypad *kp = _kp; + u8 reg; + int ret; + + /* Read & Clear TWL4030 pending interrupt */ + ret = twl4030_kpread(kp, ®, KEYP_ISR1, 1); + + /* Release all keys if I2C has gone bad or + * the KEYP has gone to idle state */ + if (ret >= 0 && (reg & KEYP_IMR1_KP)) + twl4030_kp_scan(kp, false); + else + twl4030_kp_scan(kp, true); + + return IRQ_HANDLED; +} + +static int twl4030_kp_program(struct twl4030_keypad *kp) +{ + u8 reg; + int i; + + /* Enable controller, with hardware decoding but not autorepeat */ + reg = KEYP_CTRL_SOFT_NRST | KEYP_CTRL_SOFTMODEN + | KEYP_CTRL_TOE_EN | KEYP_CTRL_KBD_ON; + if (twl4030_kpwrite_u8(kp, reg, KEYP_CTRL) < 0) + return -EIO; + + /* NOTE: we could use sih_setup() here to package keypad + * event sources as four different IRQs ... but we don't. + */ + + /* Enable TO rising and KP rising and falling edge detection */ + reg = KEYP_EDR_KP_BOTH | KEYP_EDR_TO_RISING; + if (twl4030_kpwrite_u8(kp, reg, KEYP_EDR) < 0) + return -EIO; + + /* Set PTV prescaler Field */ + reg = (PTV_PRESCALER << KEYP_LK_PTV_PTV_SHIFT); + if (twl4030_kpwrite_u8(kp, reg, KEYP_LK_PTV) < 0) + return -EIO; + + /* Set key debounce time to 20 ms */ + i = KEYP_PERIOD_US(20000, PTV_PRESCALER); + if (twl4030_kpwrite_u8(kp, i, KEYP_DEB) < 0) + return -EIO; + + /* Set timeout period to 200 ms */ + i = KEYP_PERIOD_US(200000, PTV_PRESCALER); + if (twl4030_kpwrite_u8(kp, (i & 0xFF), KEYP_TIMEOUT_L) < 0) + return -EIO; + + if (twl4030_kpwrite_u8(kp, (i >> 8), KEYP_TIMEOUT_H) < 0) + return -EIO; + + /* + * Enable Clear-on-Read; disable remembering events that fire + * after the IRQ but before our handler acks (reads) them, + */ + reg = TWL4030_SIH_CTRL_COR_MASK | TWL4030_SIH_CTRL_PENDDIS_MASK; + if (twl4030_kpwrite_u8(kp, reg, KEYP_SIH_CTRL) < 0) + return -EIO; + + /* initialize key state; irqs update it from here on */ + if (twl4030_read_kp_matrix_state(kp, kp->kp_state) < 0) + return -EIO; + + return 0; +} + +/* + * Registers keypad device with input subsystem + * and configures TWL4030 keypad registers + */ +static int twl4030_kp_probe(struct platform_device *pdev) +{ + struct twl4030_keypad_data *pdata = pdev->dev.platform_data; + const struct matrix_keymap_data *keymap_data; + struct twl4030_keypad *kp; + struct input_dev *input; + u8 reg; + int error; + + if (!pdata || !pdata->rows || !pdata->cols || !pdata->keymap_data || + pdata->rows > TWL4030_MAX_ROWS || pdata->cols > TWL4030_MAX_COLS) { + dev_err(&pdev->dev, "Invalid platform_data\n"); + return -EINVAL; + } + + keymap_data = pdata->keymap_data; + + kp = kzalloc(sizeof(*kp), GFP_KERNEL); + input = input_allocate_device(); + if (!kp || !input) { + error = -ENOMEM; + goto err1; + } + + /* Get the debug Device */ + kp->dbg_dev = &pdev->dev; + kp->input = input; + + kp->n_rows = pdata->rows; + kp->n_cols = pdata->cols; + kp->irq = platform_get_irq(pdev, 0); + + /* setup input device */ + input->name = "TWL4030 Keypad"; + input->phys = "twl4030_keypad/input0"; + input->dev.parent = &pdev->dev; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0003; + + error = matrix_keypad_build_keymap(keymap_data, NULL, + TWL4030_MAX_ROWS, + 1 << TWL4030_ROW_SHIFT, + kp->keymap, input); + if (error) { + dev_err(kp->dbg_dev, "Failed to build keymap\n"); + goto err1; + } + + input_set_capability(input, EV_MSC, MSC_SCAN); + /* Enable auto repeat feature of Linux input subsystem */ + if (pdata->rep) + __set_bit(EV_REP, input->evbit); + + error = input_register_device(input); + if (error) { + dev_err(kp->dbg_dev, + "Unable to register twl4030 keypad device\n"); + goto err1; + } + + error = twl4030_kp_program(kp); + if (error) + goto err2; + + /* + * This ISR will always execute in kernel thread context because of + * the need to access the TWL4030 over the I2C bus. + * + * NOTE: we assume this host is wired to TWL4040 INT1, not INT2 ... + */ + error = request_threaded_irq(kp->irq, NULL, do_kp_irq, + 0, pdev->name, kp); + if (error) { + dev_info(kp->dbg_dev, "request_irq failed for irq no=%d\n", + kp->irq); + goto err2; + } + + /* Enable KP and TO interrupts now. */ + reg = (u8) ~(KEYP_IMR1_KP | KEYP_IMR1_TO); + if (twl4030_kpwrite_u8(kp, reg, KEYP_IMR1)) { + error = -EIO; + goto err3; + } + + platform_set_drvdata(pdev, kp); + return 0; + +err3: + /* mask all events - we don't care about the result */ + (void) twl4030_kpwrite_u8(kp, 0xff, KEYP_IMR1); + free_irq(kp->irq, NULL); +err2: + input_unregister_device(input); + input = NULL; +err1: + input_free_device(input); + kfree(kp); + return error; +} + +static int twl4030_kp_remove(struct platform_device *pdev) +{ + struct twl4030_keypad *kp = platform_get_drvdata(pdev); + + free_irq(kp->irq, kp); + input_unregister_device(kp->input); + platform_set_drvdata(pdev, NULL); + kfree(kp); + + return 0; +} + +/* + * NOTE: twl4030 are multi-function devices connected via I2C. + * So this device is a child of an I2C parent, thus it needs to + * support unplug/replug (which most platform devices don't). + */ + +static struct platform_driver twl4030_kp_driver = { + .probe = twl4030_kp_probe, + .remove = twl4030_kp_remove, + .driver = { + .name = "twl4030_keypad", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(twl4030_kp_driver); + +MODULE_AUTHOR("Texas Instruments"); +MODULE_DESCRIPTION("TWL4030 Keypad Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:twl4030_keypad"); diff --git a/drivers/input/keyboard/w90p910_keypad.c b/drivers/input/keyboard/w90p910_keypad.c new file mode 100644 index 00000000..ee163bee --- /dev/null +++ b/drivers/input/keyboard/w90p910_keypad.c @@ -0,0 +1,271 @@ +/* + * Copyright (c) 2008-2009 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* Keypad Interface Control Registers */ +#define KPI_CONF 0x00 +#define KPI_3KCONF 0x04 +#define KPI_LPCONF 0x08 +#define KPI_STATUS 0x0C + +#define IS1KEY (0x01 << 16) +#define INTTR (0x01 << 21) +#define KEY0R (0x0f << 3) +#define KEY0C 0x07 +#define DEBOUNCE_BIT 0x08 +#define KSIZE0 (0x01 << 16) +#define KSIZE1 (0x01 << 17) +#define KPSEL (0x01 << 19) +#define ENKP (0x01 << 18) + +#define KGET_RAW(n) (((n) & KEY0R) >> 3) +#define KGET_COLUMN(n) ((n) & KEY0C) + +#define W90P910_NUM_ROWS 8 +#define W90P910_NUM_COLS 8 +#define W90P910_ROW_SHIFT 3 + +struct w90p910_keypad { + const struct w90p910_keypad_platform_data *pdata; + struct clk *clk; + struct input_dev *input_dev; + void __iomem *mmio_base; + int irq; + unsigned short keymap[W90P910_NUM_ROWS * W90P910_NUM_COLS]; +}; + +static void w90p910_keypad_scan_matrix(struct w90p910_keypad *keypad, + unsigned int status) +{ + struct input_dev *input_dev = keypad->input_dev; + unsigned int row = KGET_RAW(status); + unsigned int col = KGET_COLUMN(status); + unsigned int code = MATRIX_SCAN_CODE(row, col, W90P910_ROW_SHIFT); + unsigned int key = keypad->keymap[code]; + + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, key, 1); + input_sync(input_dev); + + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, key, 0); + input_sync(input_dev); +} + +static irqreturn_t w90p910_keypad_irq_handler(int irq, void *dev_id) +{ + struct w90p910_keypad *keypad = dev_id; + unsigned int kstatus, val; + + kstatus = __raw_readl(keypad->mmio_base + KPI_STATUS); + + val = INTTR | IS1KEY; + + if (kstatus & val) + w90p910_keypad_scan_matrix(keypad, kstatus); + + return IRQ_HANDLED; +} + +static int w90p910_keypad_open(struct input_dev *dev) +{ + struct w90p910_keypad *keypad = input_get_drvdata(dev); + const struct w90p910_keypad_platform_data *pdata = keypad->pdata; + unsigned int val, config; + + /* Enable unit clock */ + clk_enable(keypad->clk); + + val = __raw_readl(keypad->mmio_base + KPI_CONF); + val |= (KPSEL | ENKP); + val &= ~(KSIZE0 | KSIZE1); + + config = pdata->prescale | (pdata->debounce << DEBOUNCE_BIT); + + val |= config; + + __raw_writel(val, keypad->mmio_base + KPI_CONF); + + return 0; +} + +static void w90p910_keypad_close(struct input_dev *dev) +{ + struct w90p910_keypad *keypad = input_get_drvdata(dev); + + /* Disable clock unit */ + clk_disable(keypad->clk); +} + +static int w90p910_keypad_probe(struct platform_device *pdev) +{ + const struct w90p910_keypad_platform_data *pdata = + pdev->dev.platform_data; + const struct matrix_keymap_data *keymap_data; + struct w90p910_keypad *keypad; + struct input_dev *input_dev; + struct resource *res; + int irq; + int error; + + if (!pdata) { + dev_err(&pdev->dev, "no platform data defined\n"); + return -EINVAL; + } + + keymap_data = pdata->keymap_data; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get keypad irq\n"); + return -ENXIO; + } + + keypad = kzalloc(sizeof(struct w90p910_keypad), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!keypad || !input_dev) { + dev_err(&pdev->dev, "failed to allocate driver data\n"); + error = -ENOMEM; + goto failed_free; + } + + keypad->pdata = pdata; + keypad->input_dev = input_dev; + keypad->irq = irq; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (res == NULL) { + dev_err(&pdev->dev, "failed to get I/O memory\n"); + error = -ENXIO; + goto failed_free; + } + + res = request_mem_region(res->start, resource_size(res), pdev->name); + if (res == NULL) { + dev_err(&pdev->dev, "failed to request I/O memory\n"); + error = -EBUSY; + goto failed_free; + } + + keypad->mmio_base = ioremap(res->start, resource_size(res)); + if (keypad->mmio_base == NULL) { + dev_err(&pdev->dev, "failed to remap I/O memory\n"); + error = -ENXIO; + goto failed_free_res; + } + + keypad->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(keypad->clk)) { + dev_err(&pdev->dev, "failed to get keypad clock\n"); + error = PTR_ERR(keypad->clk); + goto failed_free_io; + } + + /* set multi-function pin for w90p910 kpi. */ + mfp_set_groupi(&pdev->dev); + + input_dev->name = pdev->name; + input_dev->id.bustype = BUS_HOST; + input_dev->open = w90p910_keypad_open; + input_dev->close = w90p910_keypad_close; + input_dev->dev.parent = &pdev->dev; + + error = matrix_keypad_build_keymap(keymap_data, NULL, + W90P910_NUM_ROWS, W90P910_NUM_COLS, + keypad->keymap, input_dev); + if (error) { + dev_err(&pdev->dev, "failed to build keymap\n"); + goto failed_put_clk; + } + + error = request_irq(keypad->irq, w90p910_keypad_irq_handler, + 0, pdev->name, keypad); + if (error) { + dev_err(&pdev->dev, "failed to request IRQ\n"); + goto failed_put_clk; + } + + __set_bit(EV_REP, input_dev->evbit); + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + input_set_drvdata(input_dev, keypad); + + /* Register the input device */ + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, "failed to register input device\n"); + goto failed_free_irq; + } + + platform_set_drvdata(pdev, keypad); + return 0; + +failed_free_irq: + free_irq(irq, pdev); +failed_put_clk: + clk_put(keypad->clk); +failed_free_io: + iounmap(keypad->mmio_base); +failed_free_res: + release_mem_region(res->start, resource_size(res)); +failed_free: + input_free_device(input_dev); + kfree(keypad); + return error; +} + +static int w90p910_keypad_remove(struct platform_device *pdev) +{ + struct w90p910_keypad *keypad = platform_get_drvdata(pdev); + struct resource *res; + + free_irq(keypad->irq, pdev); + + clk_put(keypad->clk); + + input_unregister_device(keypad->input_dev); + + iounmap(keypad->mmio_base); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); + + platform_set_drvdata(pdev, NULL); + kfree(keypad); + + return 0; +} + +static struct platform_driver w90p910_keypad_driver = { + .probe = w90p910_keypad_probe, + .remove = w90p910_keypad_remove, + .driver = { + .name = "nuc900-kpi", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(w90p910_keypad_driver); + +MODULE_AUTHOR("Wan ZongShun "); +MODULE_DESCRIPTION("w90p910 keypad driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:nuc900-keypad"); diff --git a/drivers/input/keyboard/xtkbd.c b/drivers/input/keyboard/xtkbd.c new file mode 100644 index 00000000..d050d9d0 --- /dev/null +++ b/drivers/input/keyboard/xtkbd.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * XT keyboard driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include + +#define DRIVER_DESC "XT keyboard driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define XTKBD_EMUL0 0xe0 +#define XTKBD_EMUL1 0xe1 +#define XTKBD_KEY 0x7f +#define XTKBD_RELEASE 0x80 + +static unsigned char xtkbd_keycode[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 0, 0, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 87, 88, 0, 0, 0, 0,110,111,103,108,105, + 106 +}; + +struct xtkbd { + unsigned char keycode[256]; + struct input_dev *dev; + struct serio *serio; + char phys[32]; +}; + +static irqreturn_t xtkbd_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct xtkbd *xtkbd = serio_get_drvdata(serio); + + switch (data) { + case XTKBD_EMUL0: + case XTKBD_EMUL1: + break; + default: + + if (xtkbd->keycode[data & XTKBD_KEY]) { + input_report_key(xtkbd->dev, xtkbd->keycode[data & XTKBD_KEY], !(data & XTKBD_RELEASE)); + input_sync(xtkbd->dev); + } else { + printk(KERN_WARNING "xtkbd.c: Unknown key (scancode %#x) %s.\n", + data & XTKBD_KEY, data & XTKBD_RELEASE ? "released" : "pressed"); + } + } + return IRQ_HANDLED; +} + +static int xtkbd_connect(struct serio *serio, struct serio_driver *drv) +{ + struct xtkbd *xtkbd; + struct input_dev *input_dev; + int err = -ENOMEM; + int i; + + xtkbd = kmalloc(sizeof(struct xtkbd), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!xtkbd || !input_dev) + goto fail1; + + xtkbd->serio = serio; + xtkbd->dev = input_dev; + snprintf(xtkbd->phys, sizeof(xtkbd->phys), "%s/input0", serio->phys); + memcpy(xtkbd->keycode, xtkbd_keycode, sizeof(xtkbd->keycode)); + + input_dev->name = "XT Keyboard"; + input_dev->phys = xtkbd->phys; + input_dev->id.bustype = BUS_XTKBD; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); + input_dev->keycode = xtkbd->keycode; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(xtkbd_keycode); + + for (i = 0; i < 255; i++) + set_bit(xtkbd->keycode[i], input_dev->keybit); + clear_bit(0, input_dev->keybit); + + serio_set_drvdata(serio, xtkbd); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(xtkbd->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(xtkbd); + return err; +} + +static void xtkbd_disconnect(struct serio *serio) +{ + struct xtkbd *xtkbd = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(xtkbd->dev); + kfree(xtkbd); +} + +static struct serio_device_id xtkbd_serio_ids[] = { + { + .type = SERIO_XT, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, xtkbd_serio_ids); + +static struct serio_driver xtkbd_drv = { + .driver = { + .name = "xtkbd", + }, + .description = DRIVER_DESC, + .id_table = xtkbd_serio_ids, + .interrupt = xtkbd_interrupt, + .connect = xtkbd_connect, + .disconnect = xtkbd_disconnect, +}; + +module_serio_driver(xtkbd_drv); diff --git a/drivers/input/keycombo.c b/drivers/input/keycombo.c new file mode 100644 index 00000000..2fba451b --- /dev/null +++ b/drivers/input/keycombo.c @@ -0,0 +1,261 @@ +/* drivers/input/keycombo.c + * + * Copyright (C) 2014 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +struct keycombo_state { + struct input_handler input_handler; + unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; + unsigned long upbit[BITS_TO_LONGS(KEY_CNT)]; + unsigned long key[BITS_TO_LONGS(KEY_CNT)]; + spinlock_t lock; + struct workqueue_struct *wq; + int key_down_target; + int key_down; + int key_up; + struct delayed_work key_down_work; + int delay; + struct work_struct key_up_work; + void (*key_up_fn)(void *); + void (*key_down_fn)(void *); + void *priv; + int key_is_down; + struct wakeup_source combo_held_wake_source; + struct wakeup_source combo_up_wake_source; +}; + +static void do_key_down(struct work_struct *work) +{ + struct delayed_work *dwork = container_of(work, struct delayed_work, + work); + struct keycombo_state *state = container_of(dwork, + struct keycombo_state, key_down_work); + if (state->key_down_fn) + state->key_down_fn(state->priv); +} + +static void do_key_up(struct work_struct *work) +{ + struct keycombo_state *state = container_of(work, struct keycombo_state, + key_up_work); + if (state->key_up_fn) + state->key_up_fn(state->priv); + __pm_relax(&state->combo_up_wake_source); +} + +static void keycombo_event(struct input_handle *handle, unsigned int type, + unsigned int code, int value) +{ + unsigned long flags; + struct keycombo_state *state = handle->private; + + if (type != EV_KEY) + return; + + if (code >= KEY_MAX) + return; + + if (!test_bit(code, state->keybit)) + return; + + spin_lock_irqsave(&state->lock, flags); + if (!test_bit(code, state->key) == !value) + goto done; + __change_bit(code, state->key); + if (test_bit(code, state->upbit)) { + if (value) + state->key_up++; + else + state->key_up--; + } else { + if (value) + state->key_down++; + else + state->key_down--; + } + if (state->key_down == state->key_down_target && state->key_up == 0) { + __pm_stay_awake(&state->combo_held_wake_source); + state->key_is_down = 1; + if (queue_delayed_work(state->wq, &state->key_down_work, + state->delay)) + pr_debug("Key down work already queued!"); + } else if (state->key_is_down) { + if (!cancel_delayed_work(&state->key_down_work)) { + __pm_stay_awake(&state->combo_up_wake_source); + queue_work(state->wq, &state->key_up_work); + } + __pm_relax(&state->combo_held_wake_source); + state->key_is_down = 0; + } +done: + spin_unlock_irqrestore(&state->lock, flags); +} + +static int keycombo_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) +{ + int i; + int ret; + struct input_handle *handle; + struct keycombo_state *state = + container_of(handler, struct keycombo_state, input_handler); + for (i = 0; i < KEY_MAX; i++) { + if (test_bit(i, state->keybit) && test_bit(i, dev->keybit)) + break; + } + if (i == KEY_MAX) + return -ENODEV; + + handle = kzalloc(sizeof(*handle), GFP_KERNEL); + if (!handle) + return -ENOMEM; + + handle->dev = dev; + handle->handler = handler; + handle->name = KEYCOMBO_NAME; + handle->private = state; + + ret = input_register_handle(handle); + if (ret) + goto err_input_register_handle; + + ret = input_open_device(handle); + if (ret) + goto err_input_open_device; + + return 0; + +err_input_open_device: + input_unregister_handle(handle); +err_input_register_handle: + kfree(handle); + return ret; +} + +static void keycombo_disconnect(struct input_handle *handle) +{ + input_close_device(handle); + input_unregister_handle(handle); + kfree(handle); +} + +static const struct input_device_id keycombo_ids[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT, + .evbit = { BIT_MASK(EV_KEY) }, + }, + { }, +}; +MODULE_DEVICE_TABLE(input, keycombo_ids); + +static int keycombo_probe(struct platform_device *pdev) +{ + int ret; + int key, *keyp; + struct keycombo_state *state; + struct keycombo_platform_data *pdata = pdev->dev.platform_data; + + if (!pdata) + return -EINVAL; + + state = kzalloc(sizeof(*state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + spin_lock_init(&state->lock); + keyp = pdata->keys_down; + while ((key = *keyp++)) { + if (key >= KEY_MAX) + continue; + state->key_down_target++; + __set_bit(key, state->keybit); + } + if (pdata->keys_up) { + keyp = pdata->keys_up; + while ((key = *keyp++)) { + if (key >= KEY_MAX) + continue; + __set_bit(key, state->keybit); + __set_bit(key, state->upbit); + } + } + + state->wq = alloc_ordered_workqueue("keycombo", 0); + if (!state->wq) + return -ENOMEM; + + state->priv = pdata->priv; + + if (pdata->key_down_fn) + state->key_down_fn = pdata->key_down_fn; + INIT_DELAYED_WORK(&state->key_down_work, do_key_down); + + if (pdata->key_up_fn) + state->key_up_fn = pdata->key_up_fn; + INIT_WORK(&state->key_up_work, do_key_up); + + wakeup_source_init(&state->combo_held_wake_source, "key combo"); + wakeup_source_init(&state->combo_up_wake_source, "key combo up"); + state->delay = msecs_to_jiffies(pdata->key_down_delay); + + state->input_handler.event = keycombo_event; + state->input_handler.connect = keycombo_connect; + state->input_handler.disconnect = keycombo_disconnect; + state->input_handler.name = KEYCOMBO_NAME; + state->input_handler.id_table = keycombo_ids; + ret = input_register_handler(&state->input_handler); + if (ret) { + kfree(state); + return ret; + } + platform_set_drvdata(pdev, state); + return 0; +} + +int keycombo_remove(struct platform_device *pdev) +{ + struct keycombo_state *state = platform_get_drvdata(pdev); + input_unregister_handler(&state->input_handler); + destroy_workqueue(state->wq); + kfree(state); + return 0; +} + + +struct platform_driver keycombo_driver = { + .driver.name = KEYCOMBO_NAME, + .probe = keycombo_probe, + .remove = keycombo_remove, +}; + +static int __init keycombo_init(void) +{ + return platform_driver_register(&keycombo_driver); +} + +static void __exit keycombo_exit(void) +{ + return platform_driver_unregister(&keycombo_driver); +} + +module_init(keycombo_init); +module_exit(keycombo_exit); diff --git a/drivers/input/keyreset.c b/drivers/input/keyreset.c new file mode 100644 index 00000000..7fbf7247 --- /dev/null +++ b/drivers/input/keyreset.c @@ -0,0 +1,145 @@ +/* drivers/input/keyreset.c + * + * Copyright (C) 2014 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct keyreset_state { + int restart_requested; + int (*reset_fn)(void); + struct platform_device *pdev_child; + struct work_struct restart_work; +}; + +static void do_restart(struct work_struct *unused) +{ + sys_sync(); + kernel_restart(NULL); +} + +static void do_reset_fn(void *priv) +{ + struct keyreset_state *state = priv; + if (state->restart_requested) + panic("keyboard reset failed, %d", state->restart_requested); + if (state->reset_fn) { + state->restart_requested = state->reset_fn(); + } else { + pr_info("keyboard reset\n"); + schedule_work(&state->restart_work); + state->restart_requested = 1; + } +} + +static int keyreset_probe(struct platform_device *pdev) +{ + int ret = -ENOMEM; + struct keycombo_platform_data *pdata_child; + struct keyreset_platform_data *pdata = pdev->dev.platform_data; + int up_size = 0, down_size = 0, size; + int key, *keyp; + struct keyreset_state *state; + + if (!pdata) + return -EINVAL; + state = devm_kzalloc(&pdev->dev, sizeof(*state), GFP_KERNEL); + if (!state) + return -ENOMEM; + + state->pdev_child = platform_device_alloc(KEYCOMBO_NAME, + PLATFORM_DEVID_AUTO); + if (!state->pdev_child) + return -ENOMEM; + state->pdev_child->dev.parent = &pdev->dev; + INIT_WORK(&state->restart_work, do_restart); + + keyp = pdata->keys_down; + while ((key = *keyp++)) { + if (key >= KEY_MAX) + continue; + down_size++; + } + if (pdata->keys_up) { + keyp = pdata->keys_up; + while ((key = *keyp++)) { + if (key >= KEY_MAX) + continue; + up_size++; + } + } + size = sizeof(struct keycombo_platform_data) + + sizeof(int) * (down_size + 1); + pdata_child = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); + if (!pdata_child) + goto error; + memcpy(pdata_child->keys_down, pdata->keys_down, + sizeof(int) * down_size); + if (up_size > 0) { + pdata_child->keys_up = devm_kzalloc(&pdev->dev, up_size + 1, + GFP_KERNEL); + if (!pdata_child->keys_up) + goto error; + memcpy(pdata_child->keys_up, pdata->keys_up, + sizeof(int) * up_size); + if (!pdata_child->keys_up) + goto error; + } + state->reset_fn = pdata->reset_fn; + pdata_child->key_down_fn = do_reset_fn; + pdata_child->priv = state; + pdata_child->key_down_delay = pdata->key_down_delay; + ret = platform_device_add_data(state->pdev_child, pdata_child, size); + if (ret) + goto error; + platform_set_drvdata(pdev, state); + return platform_device_add(state->pdev_child); +error: + platform_device_put(state->pdev_child); + return ret; +} + +int keyreset_remove(struct platform_device *pdev) +{ + struct keyreset_state *state = platform_get_drvdata(pdev); + platform_device_put(state->pdev_child); + return 0; +} + + +struct platform_driver keyreset_driver = { + .driver.name = KEYRESET_NAME, + .probe = keyreset_probe, + .remove = keyreset_remove, +}; + +static int __init keyreset_init(void) +{ + return platform_driver_register(&keyreset_driver); +} + +static void __exit keyreset_exit(void) +{ + return platform_driver_unregister(&keyreset_driver); +} + +module_init(keyreset_init); +module_exit(keyreset_exit); diff --git a/drivers/input/matrix-keymap.c b/drivers/input/matrix-keymap.c new file mode 100644 index 00000000..08b61f50 --- /dev/null +++ b/drivers/input/matrix-keymap.c @@ -0,0 +1,207 @@ +/* + * Helpers for matrix keyboard bindings + * + * Copyright (C) 2012 Google, Inc + * + * Author: + * Olof Johansson + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static bool matrix_keypad_map_key(struct input_dev *input_dev, + unsigned int rows, unsigned int cols, + unsigned int row_shift, unsigned int key) +{ + unsigned short *keymap = input_dev->keycode; + unsigned int row = KEY_ROW(key); + unsigned int col = KEY_COL(key); + unsigned short code = KEY_VAL(key); + + if (row >= rows || col >= cols) { + dev_err(input_dev->dev.parent, + "%s: invalid keymap entry 0x%x (row: %d, col: %d, rows: %d, cols: %d)\n", + __func__, key, row, col, rows, cols); + return false; + } + + keymap[MATRIX_SCAN_CODE(row, col, row_shift)] = code; + __set_bit(code, input_dev->keybit); + + return true; +} + +#ifdef CONFIG_OF +int matrix_keypad_parse_of_params(struct device *dev, + unsigned int *rows, unsigned int *cols) +{ + struct device_node *np = dev->of_node; + + if (!np) { + dev_err(dev, "missing DT data"); + return -EINVAL; + } + of_property_read_u32(np, "keypad,num-rows", rows); + of_property_read_u32(np, "keypad,num-columns", cols); + if (!*rows || !*cols) { + dev_err(dev, "number of keypad rows/columns not specified\n"); + return -EINVAL; + } + + return 0; +} +EXPORT_SYMBOL_GPL(matrix_keypad_parse_of_params); + +static int matrix_keypad_parse_of_keymap(const char *propname, + unsigned int rows, unsigned int cols, + struct input_dev *input_dev) +{ + struct device *dev = input_dev->dev.parent; + struct device_node *np = dev->of_node; + unsigned int row_shift = get_count_order(cols); + unsigned int max_keys = rows << row_shift; + unsigned int proplen, i, size; + const __be32 *prop; + + if (!np) + return -ENOENT; + + if (!propname) + propname = "linux,keymap"; + + prop = of_get_property(np, propname, &proplen); + if (!prop) { + dev_err(dev, "OF: %s property not defined in %s\n", + propname, np->full_name); + return -ENOENT; + } + + if (proplen % sizeof(u32)) { + dev_err(dev, "OF: Malformed keycode property %s in %s\n", + propname, np->full_name); + return -EINVAL; + } + + size = proplen / sizeof(u32); + if (size > max_keys) { + dev_err(dev, "OF: %s size overflow\n", propname); + return -EINVAL; + } + + for (i = 0; i < size; i++) { + unsigned int key = be32_to_cpup(prop + i); + + if (!matrix_keypad_map_key(input_dev, rows, cols, + row_shift, key)) + return -EINVAL; + } + + return 0; +} +#else +static int matrix_keypad_parse_of_keymap(const char *propname, + unsigned int rows, unsigned int cols, + struct input_dev *input_dev) +{ + return -ENOSYS; +} +#endif + +/** + * matrix_keypad_build_keymap - convert platform keymap into matrix keymap + * @keymap_data: keymap supplied by the platform code + * @keymap_name: name of device tree property containing keymap (if device + * tree support is enabled). + * @rows: number of rows in target keymap array + * @cols: number of cols in target keymap array + * @keymap: expanded version of keymap that is suitable for use by + * matrix keyboard driver + * @input_dev: input devices for which we are setting up the keymap + * + * This function converts platform keymap (encoded with KEY() macro) into + * an array of keycodes that is suitable for using in a standard matrix + * keyboard driver that uses row and col as indices. + * + * If @keymap_data is not supplied and device tree support is enabled + * it will attempt load the keymap from property specified by @keymap_name + * argument (or "linux,keymap" if @keymap_name is %NULL). + * + * If @keymap is %NULL the function will automatically allocate managed + * block of memory to store the keymap. This memory will be associated with + * the parent device and automatically freed when device unbinds from the + * driver. + * + * Callers are expected to set up input_dev->dev.parent before calling this + * function. + */ +int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, + const char *keymap_name, + unsigned int rows, unsigned int cols, + unsigned short *keymap, + struct input_dev *input_dev) +{ + unsigned int row_shift = get_count_order(cols); + size_t max_keys = rows << row_shift; + int i; + int error; + + if (WARN_ON(!input_dev->dev.parent)) + return -EINVAL; + + if (!keymap) { + keymap = devm_kzalloc(input_dev->dev.parent, + max_keys * sizeof(*keymap), + GFP_KERNEL); + if (!keymap) { + dev_err(input_dev->dev.parent, + "Unable to allocate memory for keymap"); + return -ENOMEM; + } + } + + input_dev->keycode = keymap; + input_dev->keycodesize = sizeof(*keymap); + input_dev->keycodemax = max_keys; + + __set_bit(EV_KEY, input_dev->evbit); + + if (keymap_data) { + for (i = 0; i < keymap_data->keymap_size; i++) { + unsigned int key = keymap_data->keymap[i]; + + if (!matrix_keypad_map_key(input_dev, rows, cols, + row_shift, key)) + return -EINVAL; + } + } else { + error = matrix_keypad_parse_of_keymap(keymap_name, rows, cols, + input_dev); + if (error) + return error; + } + + __clear_bit(KEY_RESERVED, input_dev->keybit); + + return 0; +} +EXPORT_SYMBOL(matrix_keypad_build_keymap); + +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/88pm80x_onkey.c b/drivers/input/misc/88pm80x_onkey.c new file mode 100644 index 00000000..ee43e5b7 --- /dev/null +++ b/drivers/input/misc/88pm80x_onkey.c @@ -0,0 +1,168 @@ +/* + * Marvell 88PM80x ONKEY driver + * + * Copyright (C) 2012 Marvell International Ltd. + * Haojian Zhuang + * Qiao Zhou + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include + +#define PM800_LONG_ONKEY_EN (1 << 0) +#define PM800_LONG_KEY_DELAY (8) /* 1 .. 16 seconds */ +#define PM800_LONKEY_PRESS_TIME ((PM800_LONG_KEY_DELAY-1) << 4) +#define PM800_LONKEY_PRESS_TIME_MASK (0xF0) +#define PM800_SW_PDOWN (1 << 5) + +struct pm80x_onkey_info { + struct input_dev *idev; + struct pm80x_chip *pm80x; + struct regmap *map; + int irq; +}; + +/* 88PM80x gives us an interrupt when ONKEY is held */ +static irqreturn_t pm80x_onkey_handler(int irq, void *data) +{ + struct pm80x_onkey_info *info = data; + int ret = 0; + unsigned int val; + + ret = regmap_read(info->map, PM800_STATUS_1, &val); + if (ret < 0) { + dev_err(info->idev->dev.parent, "failed to read status: %d\n", ret); + return IRQ_NONE; + } + val &= PM800_ONKEY_STS1; + + input_report_key(info->idev, KEY_POWER, val); + input_sync(info->idev); + + return IRQ_HANDLED; +} + +static SIMPLE_DEV_PM_OPS(pm80x_onkey_pm_ops, pm80x_dev_suspend, + pm80x_dev_resume); + +static int pm80x_onkey_probe(struct platform_device *pdev) +{ + + struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent); + struct pm80x_onkey_info *info; + int err; + + info = kzalloc(sizeof(struct pm80x_onkey_info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + info->pm80x = chip; + + info->irq = platform_get_irq(pdev, 0); + if (info->irq < 0) { + dev_err(&pdev->dev, "No IRQ resource!\n"); + err = -EINVAL; + goto out; + } + + info->map = info->pm80x->regmap; + if (!info->map) { + dev_err(&pdev->dev, "no regmap!\n"); + err = -EINVAL; + goto out; + } + + info->idev = input_allocate_device(); + if (!info->idev) { + dev_err(&pdev->dev, "Failed to allocate input dev\n"); + err = -ENOMEM; + goto out; + } + + info->idev->name = "88pm80x_on"; + info->idev->phys = "88pm80x_on/input0"; + info->idev->id.bustype = BUS_I2C; + info->idev->dev.parent = &pdev->dev; + info->idev->evbit[0] = BIT_MASK(EV_KEY); + __set_bit(KEY_POWER, info->idev->keybit); + + err = pm80x_request_irq(info->pm80x, info->irq, pm80x_onkey_handler, + IRQF_ONESHOT, "onkey", info); + if (err < 0) { + dev_err(&pdev->dev, "Failed to request IRQ: #%d: %d\n", + info->irq, err); + goto out_reg; + } + + err = input_register_device(info->idev); + if (err) { + dev_err(&pdev->dev, "Can't register input device: %d\n", err); + goto out_irq; + } + + platform_set_drvdata(pdev, info); + + /* Enable long onkey detection */ + regmap_update_bits(info->map, PM800_RTC_MISC4, PM800_LONG_ONKEY_EN, + PM800_LONG_ONKEY_EN); + /* Set 8-second interval */ + regmap_update_bits(info->map, PM800_RTC_MISC3, + PM800_LONKEY_PRESS_TIME_MASK, + PM800_LONKEY_PRESS_TIME); + + device_init_wakeup(&pdev->dev, 1); + return 0; + +out_irq: + pm80x_free_irq(info->pm80x, info->irq, info); +out_reg: + input_free_device(info->idev); +out: + kfree(info); + return err; +} + +static int pm80x_onkey_remove(struct platform_device *pdev) +{ + struct pm80x_onkey_info *info = platform_get_drvdata(pdev); + + device_init_wakeup(&pdev->dev, 0); + pm80x_free_irq(info->pm80x, info->irq, info); + input_unregister_device(info->idev); + kfree(info); + return 0; +} + +static struct platform_driver pm80x_onkey_driver = { + .driver = { + .name = "88pm80x-onkey", + .owner = THIS_MODULE, + .pm = &pm80x_onkey_pm_ops, + }, + .probe = pm80x_onkey_probe, + .remove = pm80x_onkey_remove, +}; + +module_platform_driver(pm80x_onkey_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Marvell 88PM80x ONKEY driver"); +MODULE_AUTHOR("Qiao Zhou "); +MODULE_ALIAS("platform:88pm80x-onkey"); diff --git a/drivers/input/misc/88pm860x_onkey.c b/drivers/input/misc/88pm860x_onkey.c new file mode 100644 index 00000000..abd8453e --- /dev/null +++ b/drivers/input/misc/88pm860x_onkey.c @@ -0,0 +1,170 @@ +/* + * 88pm860x_onkey.c - Marvell 88PM860x ONKEY driver + * + * Copyright (C) 2009-2010 Marvell International Ltd. + * Haojian Zhuang + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PM8607_WAKEUP 0x0b + +#define LONG_ONKEY_EN (1 << 1) +#define ONKEY_STATUS (1 << 0) + +struct pm860x_onkey_info { + struct input_dev *idev; + struct pm860x_chip *chip; + struct i2c_client *i2c; + struct device *dev; + int irq; +}; + +/* 88PM860x gives us an interrupt when ONKEY is held */ +static irqreturn_t pm860x_onkey_handler(int irq, void *data) +{ + struct pm860x_onkey_info *info = data; + int ret; + + ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2); + ret &= ONKEY_STATUS; + input_report_key(info->idev, KEY_POWER, ret); + input_sync(info->idev); + + /* Enable 8-second long onkey detection */ + pm860x_set_bits(info->i2c, PM8607_WAKEUP, 3, LONG_ONKEY_EN); + return IRQ_HANDLED; +} + +static int pm860x_onkey_probe(struct platform_device *pdev) +{ + struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); + struct pm860x_onkey_info *info; + int irq, ret; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "No IRQ resource!\n"); + return -EINVAL; + } + + info = kzalloc(sizeof(struct pm860x_onkey_info), GFP_KERNEL); + if (!info) + return -ENOMEM; + info->chip = chip; + info->i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion; + info->dev = &pdev->dev; + info->irq = irq; + + info->idev = input_allocate_device(); + if (!info->idev) { + dev_err(chip->dev, "Failed to allocate input dev\n"); + ret = -ENOMEM; + goto out; + } + + info->idev->name = "88pm860x_on"; + info->idev->phys = "88pm860x_on/input0"; + info->idev->id.bustype = BUS_I2C; + info->idev->dev.parent = &pdev->dev; + info->idev->evbit[0] = BIT_MASK(EV_KEY); + info->idev->keybit[BIT_WORD(KEY_POWER)] = BIT_MASK(KEY_POWER); + + ret = input_register_device(info->idev); + if (ret) { + dev_err(chip->dev, "Can't register input device: %d\n", ret); + goto out_reg; + } + + ret = request_threaded_irq(info->irq, NULL, pm860x_onkey_handler, + IRQF_ONESHOT, "onkey", info); + if (ret < 0) { + dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n", + info->irq, ret); + goto out_irq; + } + + platform_set_drvdata(pdev, info); + device_init_wakeup(&pdev->dev, 1); + + return 0; + +out_irq: + input_unregister_device(info->idev); + kfree(info); + return ret; + +out_reg: + input_free_device(info->idev); +out: + kfree(info); + return ret; +} + +static int pm860x_onkey_remove(struct platform_device *pdev) +{ + struct pm860x_onkey_info *info = platform_get_drvdata(pdev); + + free_irq(info->irq, info); + input_unregister_device(info->idev); + kfree(info); + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int pm860x_onkey_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); + + if (device_may_wakeup(dev)) + chip->wakeup_flag |= 1 << PM8607_IRQ_ONKEY; + return 0; +} +static int pm860x_onkey_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); + + if (device_may_wakeup(dev)) + chip->wakeup_flag &= ~(1 << PM8607_IRQ_ONKEY); + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(pm860x_onkey_pm_ops, pm860x_onkey_suspend, pm860x_onkey_resume); + +static struct platform_driver pm860x_onkey_driver = { + .driver = { + .name = "88pm860x-onkey", + .owner = THIS_MODULE, + .pm = &pm860x_onkey_pm_ops, + }, + .probe = pm860x_onkey_probe, + .remove = pm860x_onkey_remove, +}; +module_platform_driver(pm860x_onkey_driver); + +MODULE_DESCRIPTION("Marvell 88PM860x ONKEY driver"); +MODULE_AUTHOR("Haojian Zhuang "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig new file mode 100644 index 00000000..08e1faf2 --- /dev/null +++ b/drivers/input/misc/Kconfig @@ -0,0 +1,776 @@ +# +# Input misc drivers configuration +# +menuconfig INPUT_MISC + bool "Miscellaneous devices" + help + Say Y here, and a list of miscellaneous input drivers will be displayed. + Everything that didn't fit into the other categories is here. This option + doesn't affect the kernel. + + If unsure, say Y. + +if INPUT_MISC + +config INPUT_88PM860X_ONKEY + tristate "88PM860x ONKEY support" + depends on MFD_88PM860X + help + Support the ONKEY of Marvell 88PM860x PMICs as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the module + will be called 88pm860x_onkey. + +config INPUT_88PM80X_ONKEY + tristate "88PM80x ONKEY support" + depends on MFD_88PM800 + help + Support the ONKEY of Marvell 88PM80x PMICs as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the module + will be called 88pm80x_onkey. + +config INPUT_AB8500_PONKEY + tristate "AB8500 Pon (PowerOn) Key" + depends on AB8500_CORE + help + Say Y here to use the PowerOn Key for ST-Ericsson's AB8500 + Mix-Sig PMIC. + + To compile this driver as a module, choose M here: the module + will be called ab8500-ponkey. + +config INPUT_AD714X + tristate "Analog Devices AD714x Capacitance Touch Sensor" + help + Say Y here if you want to support an AD7142/3/7/8/7A touch sensor. + + You should select a bus connection too. + + To compile this driver as a module, choose M here: the + module will be called ad714x. + +config INPUT_AD714X_I2C + tristate "support I2C bus connection" + depends on INPUT_AD714X && I2C + default y + help + Say Y here if you have AD7142/AD7147 hooked to an I2C bus. + + To compile this driver as a module, choose M here: the + module will be called ad714x-i2c. + +config INPUT_AD714X_SPI + tristate "support SPI bus connection" + depends on INPUT_AD714X && SPI + default y + help + Say Y here if you have AD7142/AD7147 hooked to a SPI bus. + + To compile this driver as a module, choose M here: the + module will be called ad714x-spi. + +config INPUT_ARIZONA_HAPTICS + tristate "Arizona haptics support" + depends on MFD_ARIZONA && SND_SOC + select INPUT_FF_MEMLESS + help + Say Y to enable support for the haptics module in Arizona CODECs. + + To compile this driver as a module, choose M here: the + module will be called arizona-haptics. + +config INPUT_BMA150 + tristate "BMA150/SMB380 acceleration sensor support" + depends on I2C + select INPUT_POLLDEV + help + Say Y here if you have Bosch Sensortec's BMA150 or SMB380 + acceleration sensor hooked to an I2C bus. + + To compile this driver as a module, choose M here: the + module will be called bma150. + +config INPUT_PCSPKR + tristate "PC Speaker support" + depends on PCSPKR_PLATFORM + help + Say Y here if you want the standard PC Speaker to be used for + bells and whistles. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called pcspkr. + +config INPUT_PM8XXX_VIBRATOR + tristate "Qualcomm PM8XXX vibrator support" + depends on MFD_PM8XXX + select INPUT_FF_MEMLESS + help + This option enables device driver support for the vibrator + on Qualcomm PM8xxx chip. This driver supports ff-memless interface + from input framework. + + To compile this driver as module, choose M here: the + module will be called pm8xxx-vibrator. + +config INPUT_PMIC8XXX_PWRKEY + tristate "PMIC8XXX power key support" + depends on MFD_PM8XXX + help + Say Y here if you want support for the PMIC8XXX power key. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called pmic8xxx-pwrkey. + +config INPUT_SPARCSPKR + tristate "SPARC Speaker support" + depends on PCI && SPARC64 + help + Say Y here if you want the standard Speaker on Sparc PCI systems + to be used for bells and whistles. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called sparcspkr. + +config INPUT_M68K_BEEP + tristate "M68k Beeper support" + depends on M68K + +config INPUT_MAX8925_ONKEY + tristate "MAX8925 ONKEY support" + depends on MFD_MAX8925 + help + Support the ONKEY of MAX8925 PMICs as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the module + will be called max8925_onkey. + +config INPUT_MAX8997_HAPTIC + tristate "MAXIM MAX8997 haptic controller support" + depends on HAVE_PWM && MFD_MAX8997 + select INPUT_FF_MEMLESS + help + This option enables device driver support for the haptic controller + on MAXIM MAX8997 chip. This driver supports ff-memless interface + from input framework. + + To compile this driver as module, choose M here: the + module will be called max8997-haptic. + +config INPUT_MC13783_PWRBUTTON + tristate "MC13783 ON buttons" + depends on MFD_MC13783 + help + Support the ON buttons of MC13783 PMIC as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the module + will be called mc13783-pwrbutton. + +config INPUT_MMA8450 + tristate "MMA8450 - Freescale's 3-Axis, 8/12-bit Digital Accelerometer" + depends on I2C + select INPUT_POLLDEV + help + Say Y here if you want to support Freescale's MMA8450 Accelerometer + through I2C interface. + + To compile this driver as a module, choose M here: the + module will be called mma8450. + +config INPUT_MPU3050 + tristate "MPU3050 Triaxial gyroscope sensor" + depends on I2C + help + Say Y here if you want to support InvenSense MPU3050 + connected via an I2C bus. + + To compile this driver as a module, choose M here: the + module will be called mpu3050. + +config INPUT_APANEL + tristate "Fujitsu Lifebook Application Panel buttons" + depends on X86 && I2C && LEDS_CLASS + select INPUT_POLLDEV + select CHECK_SIGNATURE + help + Say Y here for support of the Application Panel buttons, used on + Fujitsu Lifebook. These are attached to the mainboard through + an SMBus interface managed by the I2C Intel ICH (i801) driver, + which you should also build for this kernel. + + To compile this driver as a module, choose M here: the module will + be called apanel. + +config INPUT_GP2A + tristate "Sharp GP2AP002A00F I2C Proximity/Opto sensor driver" + depends on I2C + depends on GPIOLIB + help + Say Y here if you have a Sharp GP2AP002A00F proximity/als combo-chip + hooked to an I2C bus. + + To compile this driver as a module, choose M here: the + module will be called gp2ap002a00f. + +config INPUT_GPIO_TILT_POLLED + tristate "Polled GPIO tilt switch" + depends on GPIOLIB + select INPUT_POLLDEV + help + This driver implements support for tilt switches connected + to GPIO pins that are not capable of generating interrupts. + + The list of gpios to use and the mapping of their states + to specific angles is done via platform data. + + To compile this driver as a module, choose M here: the + module will be called gpio_tilt_polled. + +config INPUT_IXP4XX_BEEPER + tristate "IXP4XX Beeper support" + depends on ARCH_IXP4XX + help + If you say yes here, you can connect a beeper to the + ixp4xx gpio pins. This is used by the LinkSys NSLU2. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called ixp4xx-beeper. + +config INPUT_COBALT_BTNS + tristate "Cobalt button interface" + depends on MIPS_COBALT + select INPUT_POLLDEV + help + Say Y here if you want to support MIPS Cobalt button interface. + + To compile this driver as a module, choose M here: the + module will be called cobalt_btns. + +config INPUT_WISTRON_BTNS + tristate "x86 Wistron laptop button interface" + depends on X86 && !X86_64 + select INPUT_POLLDEV + select INPUT_SPARSEKMAP + select NEW_LEDS + select LEDS_CLASS + select CHECK_SIGNATURE + help + Say Y here for support of Wistron laptop button interfaces, used on + laptops of various brands, including Acer and Fujitsu-Siemens. If + available, mail and wifi LEDs will be controllable via /sys/class/leds. + + To compile this driver as a module, choose M here: the module will + be called wistron_btns. + +config INPUT_ATLAS_BTNS + tristate "x86 Atlas button interface" + depends on X86 && ACPI + help + Say Y here for support of Atlas wallmount touchscreen buttons. + The events will show up as scancodes F1 through F9 via evdev. + + To compile this driver as a module, choose M here: the module will + be called atlas_btns. + +config INPUT_ATI_REMOTE2 + tristate "ATI / Philips USB RF remote control" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use an ATI or Philips USB RF remote control. + These are RF remotes with USB receivers. + ATI Remote Wonder II comes with some ATI's All-In-Wonder video cards + and is also available as a separate product. + This driver provides mouse pointer, left and right mouse buttons, + and maps all the other remote buttons to keypress events. + + To compile this driver as a module, choose M here: the module will be + called ati_remote2. + +config INPUT_KEYCHORD + tristate "Key chord input driver support" + help + Say Y here if you want to enable the key chord driver + accessible at /dev/keychord. This driver can be used + for receiving notifications when client specified key + combinations are pressed. + + To compile this driver as a module, choose M here: the + module will be called keychord. + +config INPUT_KEYSPAN_REMOTE + tristate "Keyspan DMR USB remote control" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use a Keyspan DMR USB remote control. + Currently only the UIA-11 type of receiver has been tested. The tag + on the receiver that connects to the USB port should have a P/N that + will tell you what type of DMR you have. The UIA-10 type is not + supported at this time. This driver maps all buttons to keypress + events. + + To compile this driver as a module, choose M here: the module will + be called keyspan_remote. + +config INPUT_KXTJ9 + tristate "Kionix KXTJ9 tri-axis digital accelerometer" + depends on I2C + help + Say Y here to enable support for the Kionix KXTJ9 digital tri-axis + accelerometer. + + To compile this driver as a module, choose M here: the module will + be called kxtj9. + +config INPUT_KXTJ9_POLLED_MODE + bool "Enable polling mode support" + depends on INPUT_KXTJ9 + select INPUT_POLLDEV + help + Say Y here if you need accelerometer to work in polling mode. + +config INPUT_POWERMATE + tristate "Griffin PowerMate and Contour Jog support" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use Griffin PowerMate or Contour Jog devices. + These are aluminum dials which can measure clockwise and anticlockwise + rotation. The dial also acts as a pushbutton. The base contains an LED + which can be instructed to pulse or to switch to a particular intensity. + + You can download userspace tools from + . + + To compile this driver as a module, choose M here: the + module will be called powermate. + +config INPUT_YEALINK + tristate "Yealink usb-p1k voip phone" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to enable keyboard and LCD functions of the + Yealink usb-p1k usb phones. The audio part is enabled by the generic + usb sound driver, so you might want to enable that as well. + + For information about how to use these additional functions, see + . + + To compile this driver as a module, choose M here: the module will be + called yealink. + +config INPUT_CM109 + tristate "C-Media CM109 USB I/O Controller" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to enable keyboard and buzzer functions of the + C-Media CM109 usb phones. The audio part is enabled by the generic + usb sound driver, so you might want to enable that as well. + + To compile this driver as a module, choose M here: the module will be + called cm109. + +config INPUT_RETU_PWRBUTTON + tristate "Retu Power button Driver" + depends on MFD_RETU + help + Say Y here if you want to enable power key reporting via the + Retu chips found in Nokia Internet Tablets (770, N800, N810). + + To compile this driver as a module, choose M here. The module will + be called retu-pwrbutton. + +config INPUT_TWL4030_PWRBUTTON + tristate "TWL4030 Power button Driver" + depends on TWL4030_CORE + help + Say Y here if you want to enable power key reporting via the + TWL4030 family of chips. + + To compile this driver as a module, choose M here. The module will + be called twl4030_pwrbutton. + +config INPUT_TWL4030_VIBRA + tristate "Support for TWL4030 Vibrator" + depends on TWL4030_CORE + select MFD_TWL4030_AUDIO + select INPUT_FF_MEMLESS + help + This option enables support for TWL4030 Vibrator Driver. + + To compile this driver as a module, choose M here. The module will + be called twl4030_vibra. + +config INPUT_TWL6040_VIBRA + tristate "Support for TWL6040 Vibrator" + depends on TWL6040_CORE + select INPUT_FF_MEMLESS + help + This option enables support for TWL6040 Vibrator Driver. + + To compile this driver as a module, choose M here. The module will + be called twl6040_vibra. + +config INPUT_UINPUT + tristate "User level driver support" + help + Say Y here if you want to support user level drivers for input + subsystem accessible under char device 10:223 - /dev/input/uinput. + + To compile this driver as a module, choose M here: the + module will be called uinput. + +config INPUT_SGI_BTNS + tristate "SGI Indy/O2 volume button interface" + depends on SGI_IP22 || SGI_IP32 + select INPUT_POLLDEV + help + Say Y here if you want to support SGI Indy/O2 volume button interface. + + To compile this driver as a module, choose M here: the + module will be called sgi_btns. + +config INPUT_GPIO + tristate "GPIO driver support" + help + Say Y here if you want to support gpio based keys, wheels etc... + +config HP_SDC_RTC + tristate "HP SDC Real Time Clock" + depends on (GSC || HP300) && SERIO + select HP_SDC + help + Say Y here if you want to support the built-in real time clock + of the HP SDC controller. + +config INPUT_PCF50633_PMU + tristate "PCF50633 PMU events" + depends on MFD_PCF50633 + help + Say Y to include support for delivering PMU events via input + layer on NXP PCF50633. + +config INPUT_PCF8574 + tristate "PCF8574 Keypad input device" + depends on I2C + help + Say Y here if you want to support a keypad connected via I2C + with a PCF8574. + + To compile this driver as a module, choose M here: the + module will be called pcf8574_keypad. + +config INPUT_PWM_BEEPER + tristate "PWM beeper support" + depends on HAVE_PWM || PWM + help + Say Y here to get support for PWM based beeper devices. + + If unsure, say N. + + To compile this driver as a module, choose M here: the module will be + called pwm-beeper. + +config INPUT_GPIO_ROTARY_ENCODER + tristate "Rotary encoders connected to GPIO pins" + depends on GPIOLIB + help + Say Y here to add support for rotary encoders connected to GPIO lines. + Check file:Documentation/input/rotary-encoder.txt for more + information. + + To compile this driver as a module, choose M here: the + module will be called rotary_encoder. + +config INPUT_RB532_BUTTON + tristate "Mikrotik Routerboard 532 button interface" + depends on MIKROTIK_RB532 + depends on GPIOLIB + select INPUT_POLLDEV + help + Say Y here if you want support for the S1 button built into + Mikrotik's Routerboard 532. + + To compile this driver as a module, choose M here: the + module will be called rb532_button. + +config INPUT_DA9052_ONKEY + tristate "Dialog DA9052/DA9053 Onkey" + depends on PMIC_DA9052 + help + Support the ONKEY of Dialog DA9052 PMICs as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the + module will be called da9052_onkey. + +config INPUT_DA9055_ONKEY + tristate "Dialog Semiconductor DA9055 ONKEY" + depends on MFD_DA9055 + help + Support the ONKEY of DA9055 PMICs as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the module + will be called da9055_onkey. + +config INPUT_DM355EVM + tristate "TI DaVinci DM355 EVM Keypad and IR Remote" + depends on MFD_DM355EVM_MSP + select INPUT_SPARSEKMAP + help + Supports the pushbuttons and IR remote used with + the DM355 EVM board. + + To compile this driver as a module, choose M here: the + module will be called dm355evm_keys. + +config INPUT_BFIN_ROTARY + tristate "Blackfin Rotary support" + depends on BF54x || BF52x + help + Say Y here if you want to use the Blackfin Rotary. + + To compile this driver as a module, choose M here: the + module will be called bfin-rotary. + +config INPUT_WM831X_ON + tristate "WM831X ON pin" + depends on MFD_WM831X + help + Support the ON pin of WM831X PMICs as an input device + reporting power button status. + + To compile this driver as a module, choose M here: the module + will be called wm831x_on. + +config INPUT_PCAP + tristate "Motorola EZX PCAP misc input events" + depends on EZX_PCAP + help + Say Y here if you want to use Power key and Headphone button + on Motorola EZX phones. + + To compile this driver as a module, choose M here: the + module will be called pcap_keys. + +config INPUT_ADXL34X + tristate "Analog Devices ADXL34x Three-Axis Digital Accelerometer" + default n + help + Say Y here if you have a Accelerometer interface using the + ADXL345/6 controller, and your board-specific initialization + code includes that in its table of devices. + + This driver can use either I2C or SPI communication to the + ADXL345/6 controller. Select the appropriate method for + your system. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called adxl34x. + +config INPUT_ADXL34X_I2C + tristate "support I2C bus connection" + depends on INPUT_ADXL34X && I2C + default y + help + Say Y here if you have ADXL345/6 hooked to an I2C bus. + + To compile this driver as a module, choose M here: the + module will be called adxl34x-i2c. + +config INPUT_ADXL34X_SPI + tristate "support SPI bus connection" + depends on INPUT_ADXL34X && SPI + default y + help + Say Y here if you have ADXL345/6 hooked to a SPI bus. + + To compile this driver as a module, choose M here: the + module will be called adxl34x-spi. + +config INPUT_IMS_PCU + tristate "IMS Passenger Control Unit driver" + depends on USB + depends on LEDS_CLASS + help + Say Y here if you have system with IMS Rave Passenger Control Unit. + + To compile this driver as a module, choose M here: the module will be + called ims_pcu. + +config INPUT_CMA3000 + tristate "VTI CMA3000 Tri-axis accelerometer" + help + Say Y here if you want to use VTI CMA3000_D0x Accelerometer + driver + + This driver currently only supports I2C interface to the + controller. Also select the I2C method. + + If unsure, say N + + To compile this driver as a module, choose M here: the + module will be called cma3000_d0x. + +config INPUT_CMA3000_I2C + tristate "Support I2C bus connection" + depends on INPUT_CMA3000 && I2C + help + Say Y here if you want to use VTI CMA3000_D0x Accelerometer + through I2C interface. + + To compile this driver as a module, choose M here: the + module will be called cma3000_d0x_i2c. + +config INPUT_XEN_KBDDEV_FRONTEND + tristate "Xen virtual keyboard and mouse support" + depends on XEN + default y + select XEN_XENBUS_FRONTEND + help + This driver implements the front-end of the Xen virtual + keyboard and mouse device driver. It communicates with a back-end + in another domain. + + To compile this driver as a module, choose M here: the + module will be called xen-kbdfront. + +config INPUT_HEADSET_SPRD_SC2723 + tristate "SPRD SC2723 builtin headset & button detect driver" + default n + help + Say Y here if you are using SPRD platform. + + To compile this driver as a module, choose M here: the + module will be called headset. + +config INPUT_SPRD_HEADSET_SHARK + tristate "SPRD platform builtin headset & button detect driver" + help + Say Y here if you are using SPRD platform. + + To compile this driver as a module, choose M here: the + module will be called headset. + +config HEADSET_KEY_VOLUME_SUPPORTED + bool "HEADSET_KEY_VOLUME_SUPPORTED" + depends on INPUT_SPRD_HEADSET_SHARK + help + Say Y to enable HEADSET_KEY_VOLUME_SUPPORT. + +config HEADSET_EXTERNAL_HEADMICBIAS_POWER_SUPPORTED + bool "HEADSET_EXTERNAL_HEADMICBIAS_POWER_SUPPORTED" + depends on INPUT_SPRD_HEADSET_SHARK + help + Say Y to enable HEADSET_EXTERNAL_HEADMICBIAS_POWER_SUPPORT. + +config HEADSET_STS_POLLING_DISABLED + bool "HEADSET_STS_POLLING_DISABLED" + depends on INPUT_SPRD_HEADSET_SHARK + help + Say Y to disable HEADSET_STS_POLLING. + +config HEADSET_AUXADC_CAL_SUPPORTED + bool "HEADSET_AUXADC_CAL_SUPPORTED" + depends on INPUT_SPRD_HEADSET_SHARK + help + Say Y to enable HEADSET_AUXADC_CAL_SUPPORTED. + +#add by lgd +config CAMERA_POLE_SUPPORT + bool "CAMERA_POLE_SUPPORT" + depends on INPUT_SPRD_HEADSET_SHARK + help + Say Y to enable camera pole support. + +config INPUT_LIS3DH_I2C + tristate "ST lid3dh 3-Axid accelerometer device with I2C bus" + depends on I2C + default n + help + Say Y here if you have a lis3dh device on the board and use I2C + communication, else say N. + + To compile this driver as a module, choose M here. + +config INPUT_LIS3DH_I2C_INTERRUPT + tristate "ST lid3dh 3-Axid accelerometer device with I2C bus for interrupt mode" + depends on I2C + default n + help + Say Y here if you have a lis3dh device on the board and use I2C + communication, else say N. + + To compile this driver as a module, choose M here. + +config INPUT_LIS3DH_ZT_I2C + tristate "ST lid3dh_zt 3-Axid accelerometer device with I2C bus" + depends on I2C + default n + help + Say Y here if you have a lis3dh_zt device on the board and use I2C + communication, else say N. + + To compile this driver as a module, choose M here. + +config INPUT_LTR558_I2C + tristate "LTR558 proximity and light sensor device with I2C bus" + depends on I2C + default n + help + Say Y here if you have a LTR558 device on the board and use I2C + communication, else say N. + +config INPUT_STK3X1X_I2C + tristate "STK3X1X proximity and light sensor device with I2C bus" + depends on I2C + default n + help + Say Y here if you have a LTR558 device on the board and use I2C + communication, else say N. + + To compile this driver as a module, choose M here. +config INPUT_SENSORS_BMA2X2 + tristate "BMA2x2 acceleration sensor support" + depends on I2C + help + To compile this driver as a module, choose M here. + +config INPUT_EPL2182_I2C + tristate "epl2182 proximity and light sensor device with I2C bus" + depends on I2C + default n + help + Say Y here if you have a epl2182 device on the board and use I2C + communication, else say N. + + To compile this driver as a module, choose M here. + +config INPUT_EPL259X_I2C + tristate "epl259x proximity and light sensor device with I2C bus" + depends on I2C + default n + help + Say Y here if you have a epl259x device on the board and use I2C + communication, else say N. + + To compile this driver as a module, choose M here. +endif diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile new file mode 100644 index 00000000..201efeac --- /dev/null +++ b/drivers/input/misc/Makefile @@ -0,0 +1,81 @@ +# +# Makefile for the input misc drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_INPUT_88PM860X_ONKEY) += 88pm860x_onkey.o +obj-$(CONFIG_INPUT_88PM80X_ONKEY) += 88pm80x_onkey.o +obj-$(CONFIG_INPUT_AB8500_PONKEY) += ab8500-ponkey.o +obj-$(CONFIG_INPUT_AD714X) += ad714x.o +obj-$(CONFIG_INPUT_AD714X_I2C) += ad714x-i2c.o +obj-$(CONFIG_INPUT_AD714X_SPI) += ad714x-spi.o +obj-$(CONFIG_INPUT_ADXL34X) += adxl34x.o +obj-$(CONFIG_INPUT_ADXL34X_I2C) += adxl34x-i2c.o +obj-$(CONFIG_INPUT_ADXL34X_SPI) += adxl34x-spi.o +obj-$(CONFIG_INPUT_APANEL) += apanel.o +obj-$(CONFIG_INPUT_ARIZONA_HAPTICS) += arizona-haptics.o +obj-$(CONFIG_INPUT_ATI_REMOTE2) += ati_remote2.o +obj-$(CONFIG_INPUT_ATLAS_BTNS) += atlas_btns.o +obj-$(CONFIG_INPUT_BFIN_ROTARY) += bfin_rotary.o +obj-$(CONFIG_INPUT_BMA150) += bma150.o +obj-$(CONFIG_INPUT_CM109) += cm109.o +obj-$(CONFIG_INPUT_CMA3000) += cma3000_d0x.o +obj-$(CONFIG_INPUT_CMA3000_I2C) += cma3000_d0x_i2c.o +obj-$(CONFIG_INPUT_COBALT_BTNS) += cobalt_btns.o +obj-$(CONFIG_INPUT_DA9052_ONKEY) += da9052_onkey.o +obj-$(CONFIG_INPUT_DA9055_ONKEY) += da9055_onkey.o +obj-$(CONFIG_INPUT_DM355EVM) += dm355evm_keys.o +obj-$(CONFIG_INPUT_GP2A) += gp2ap002a00f.o +obj-$(CONFIG_INPUT_GPIO_TILT_POLLED) += gpio_tilt_polled.o +obj-$(CONFIG_INPUT_GPIO) += gpio_event.o gpio_matrix.o gpio_input.o gpio_output.o gpio_axis.o +obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o +obj-$(CONFIG_INPUT_IMS_PCU) += ims-pcu.o +obj-$(CONFIG_INPUT_IXP4XX_BEEPER) += ixp4xx-beeper.o +obj-$(CONFIG_INPUT_KEYCHORD) += keychord.o +obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) += keyspan_remote.o +obj-$(CONFIG_INPUT_KXTJ9) += kxtj9.o +obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o +obj-$(CONFIG_INPUT_MAX8925_ONKEY) += max8925_onkey.o +obj-$(CONFIG_INPUT_MAX8997_HAPTIC) += max8997_haptic.o +obj-$(CONFIG_INPUT_MC13783_PWRBUTTON) += mc13783-pwrbutton.o +obj-$(CONFIG_INPUT_MMA8450) += mma8450.o +obj-$(CONFIG_INPUT_MPU3050) += mpu3050.o +obj-$(CONFIG_INPUT_PCAP) += pcap_keys.o +obj-$(CONFIG_INPUT_PCF50633_PMU) += pcf50633-input.o +obj-$(CONFIG_INPUT_PCF8574) += pcf8574_keypad.o +obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o +obj-$(CONFIG_INPUT_PM8XXX_VIBRATOR) += pm8xxx-vibrator.o +obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) += pmic8xxx-pwrkey.o +obj-$(CONFIG_INPUT_POWERMATE) += powermate.o +obj-$(CONFIG_INPUT_PWM_BEEPER) += pwm-beeper.o +obj-$(CONFIG_INPUT_RB532_BUTTON) += rb532_button.o +obj-$(CONFIG_INPUT_RETU_PWRBUTTON) += retu-pwrbutton.o +obj-$(CONFIG_INPUT_GPIO_ROTARY_ENCODER) += rotary_encoder.o +obj-$(CONFIG_INPUT_SGI_BTNS) += sgi_btns.o +obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o +obj-$(CONFIG_INPUT_TWL4030_PWRBUTTON) += twl4030-pwrbutton.o +obj-$(CONFIG_INPUT_TWL4030_VIBRA) += twl4030-vibra.o +obj-$(CONFIG_INPUT_TWL6040_VIBRA) += twl6040-vibra.o +obj-$(CONFIG_INPUT_UINPUT) += uinput.o +obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o +obj-$(CONFIG_INPUT_WM831X_ON) += wm831x-on.o +obj-$(CONFIG_INPUT_XEN_KBDDEV_FRONTEND) += xen-kbdfront.o +obj-$(CONFIG_INPUT_YEALINK) += yealink.o +obj-$(CONFIG_INPUT_LTR558_I2C) += ltr_558als.o +obj-$(CONFIG_INPUT_EPL2182_I2C) += epl2182_pls_v2.o +obj-$(CONFIG_INPUT_EPL259X_I2C) += epl259x.o +obj-$(CONFIG_INPUT_LIS3DH_I2C) += lis3dh.o +obj-$(CONFIG_INPUT_LIS3DH_I2C_INTERRUPT)+= lis3dh_interrupt.o +obj-$(CONFIG_INPUT_LIS3DH_ZT_I2C) += lis3dh_zt.o +obj-$(CONFIG_INPUT_SPRD_HEADSET_SHARK) += headset_sprd.o +obj-$(CONFIG_INPUT_HEADSET_SPRD_SC2723) += headset_sprd_sc2723.o +obj-$(CONFIG_INPUT_STK3X1X_I2C) += stk3x1x.o +obj-$(CONFIG_INPUT_SENSORS_BMA2X2) += bstclass.o bma2x2.o +ifeq ($(CONFIG_SENSORS_BMA2X2_ENABLE_INT1),y) + EXTRA_CFLAGS += -DBMA2X2_ENABLE_INT1 +endif + +ifeq ($(CONFIG_BOSCH_BMA2X2_ENABLE_INT2),y) + EXTRA_CFLAGS += -DBMA2X2_ENABLE_INT2 +endif diff --git a/drivers/input/misc/ab8500-ponkey.c b/drivers/input/misc/ab8500-ponkey.c new file mode 100644 index 00000000..2f090b46 --- /dev/null +++ b/drivers/input/misc/ab8500-ponkey.c @@ -0,0 +1,155 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * + * License Terms: GNU General Public License v2 + * Author: Sundar Iyer for ST-Ericsson + * + * AB8500 Power-On Key handler + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * struct ab8500_ponkey - ab8500 ponkey information + * @input_dev: pointer to input device + * @ab8500: ab8500 parent + * @irq_dbf: irq number for falling transition + * @irq_dbr: irq number for rising transition + */ +struct ab8500_ponkey { + struct input_dev *idev; + struct ab8500 *ab8500; + int irq_dbf; + int irq_dbr; +}; + +/* AB8500 gives us an interrupt when ONKEY is held */ +static irqreturn_t ab8500_ponkey_handler(int irq, void *data) +{ + struct ab8500_ponkey *ponkey = data; + + if (irq == ponkey->irq_dbf) + input_report_key(ponkey->idev, KEY_POWER, true); + else if (irq == ponkey->irq_dbr) + input_report_key(ponkey->idev, KEY_POWER, false); + + input_sync(ponkey->idev); + + return IRQ_HANDLED; +} + +static int ab8500_ponkey_probe(struct platform_device *pdev) +{ + struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent); + struct ab8500_ponkey *ponkey; + struct input_dev *input; + int irq_dbf, irq_dbr; + int error; + + irq_dbf = platform_get_irq_byname(pdev, "ONKEY_DBF"); + if (irq_dbf < 0) { + dev_err(&pdev->dev, "No IRQ for ONKEY_DBF, error=%d\n", irq_dbf); + return irq_dbf; + } + + irq_dbr = platform_get_irq_byname(pdev, "ONKEY_DBR"); + if (irq_dbr < 0) { + dev_err(&pdev->dev, "No IRQ for ONKEY_DBR, error=%d\n", irq_dbr); + return irq_dbr; + } + + ponkey = kzalloc(sizeof(struct ab8500_ponkey), GFP_KERNEL); + input = input_allocate_device(); + if (!ponkey || !input) { + error = -ENOMEM; + goto err_free_mem; + } + + ponkey->idev = input; + ponkey->ab8500 = ab8500; + ponkey->irq_dbf = irq_dbf; + ponkey->irq_dbr = irq_dbr; + + input->name = "AB8500 POn(PowerOn) Key"; + input->dev.parent = &pdev->dev; + + input_set_capability(input, EV_KEY, KEY_POWER); + + error = request_any_context_irq(ponkey->irq_dbf, ab8500_ponkey_handler, + 0, "ab8500-ponkey-dbf", ponkey); + if (error < 0) { + dev_err(ab8500->dev, "Failed to request dbf IRQ#%d: %d\n", + ponkey->irq_dbf, error); + goto err_free_mem; + } + + error = request_any_context_irq(ponkey->irq_dbr, ab8500_ponkey_handler, + 0, "ab8500-ponkey-dbr", ponkey); + if (error < 0) { + dev_err(ab8500->dev, "Failed to request dbr IRQ#%d: %d\n", + ponkey->irq_dbr, error); + goto err_free_dbf_irq; + } + + error = input_register_device(ponkey->idev); + if (error) { + dev_err(ab8500->dev, "Can't register input device: %d\n", error); + goto err_free_dbr_irq; + } + + platform_set_drvdata(pdev, ponkey); + return 0; + +err_free_dbr_irq: + free_irq(ponkey->irq_dbr, ponkey); +err_free_dbf_irq: + free_irq(ponkey->irq_dbf, ponkey); +err_free_mem: + input_free_device(input); + kfree(ponkey); + + return error; +} + +static int ab8500_ponkey_remove(struct platform_device *pdev) +{ + struct ab8500_ponkey *ponkey = platform_get_drvdata(pdev); + + free_irq(ponkey->irq_dbf, ponkey); + free_irq(ponkey->irq_dbr, ponkey); + input_unregister_device(ponkey->idev); + kfree(ponkey); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id ab8500_ponkey_match[] = { + { .compatible = "stericsson,ab8500-ponkey", }, + {} +}; +#endif + +static struct platform_driver ab8500_ponkey_driver = { + .driver = { + .name = "ab8500-poweron-key", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(ab8500_ponkey_match), + }, + .probe = ab8500_ponkey_probe, + .remove = ab8500_ponkey_remove, +}; +module_platform_driver(ab8500_ponkey_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Sundar Iyer "); +MODULE_DESCRIPTION("ST-Ericsson AB8500 Power-ON(Pon) Key driver"); diff --git a/drivers/input/misc/ad714x-i2c.c b/drivers/input/misc/ad714x-i2c.c new file mode 100644 index 00000000..e0f52251 --- /dev/null +++ b/drivers/input/misc/ad714x-i2c.c @@ -0,0 +1,123 @@ +/* + * AD714X CapTouch Programmable Controller driver (I2C bus) + * + * Copyright 2009-2011 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include /* BUS_I2C */ +#include +#include +#include +#include +#include "ad714x.h" + +#ifdef CONFIG_PM_SLEEP +static int ad714x_i2c_suspend(struct device *dev) +{ + return ad714x_disable(i2c_get_clientdata(to_i2c_client(dev))); +} + +static int ad714x_i2c_resume(struct device *dev) +{ + return ad714x_enable(i2c_get_clientdata(to_i2c_client(dev))); +} +#endif + +static SIMPLE_DEV_PM_OPS(ad714x_i2c_pm, ad714x_i2c_suspend, ad714x_i2c_resume); + +static int ad714x_i2c_write(struct ad714x_chip *chip, + unsigned short reg, unsigned short data) +{ + struct i2c_client *client = to_i2c_client(chip->dev); + int error; + + chip->xfer_buf[0] = cpu_to_be16(reg); + chip->xfer_buf[1] = cpu_to_be16(data); + + error = i2c_master_send(client, (u8 *)chip->xfer_buf, + 2 * sizeof(*chip->xfer_buf)); + if (unlikely(error < 0)) { + dev_err(&client->dev, "I2C write error: %d\n", error); + return error; + } + + return 0; +} + +static int ad714x_i2c_read(struct ad714x_chip *chip, + unsigned short reg, unsigned short *data, size_t len) +{ + struct i2c_client *client = to_i2c_client(chip->dev); + int i; + int error; + + chip->xfer_buf[0] = cpu_to_be16(reg); + + error = i2c_master_send(client, (u8 *)chip->xfer_buf, + sizeof(*chip->xfer_buf)); + if (error >= 0) + error = i2c_master_recv(client, (u8 *)chip->xfer_buf, + len * sizeof(*chip->xfer_buf)); + + if (unlikely(error < 0)) { + dev_err(&client->dev, "I2C read error: %d\n", error); + return error; + } + + for (i = 0; i < len; i++) + data[i] = be16_to_cpu(chip->xfer_buf[i]); + + return 0; +} + +static int ad714x_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct ad714x_chip *chip; + + chip = ad714x_probe(&client->dev, BUS_I2C, client->irq, + ad714x_i2c_read, ad714x_i2c_write); + if (IS_ERR(chip)) + return PTR_ERR(chip); + + i2c_set_clientdata(client, chip); + + return 0; +} + +static int ad714x_i2c_remove(struct i2c_client *client) +{ + struct ad714x_chip *chip = i2c_get_clientdata(client); + + ad714x_remove(chip); + + return 0; +} + +static const struct i2c_device_id ad714x_id[] = { + { "ad7142_captouch", 0 }, + { "ad7143_captouch", 0 }, + { "ad7147_captouch", 0 }, + { "ad7147a_captouch", 0 }, + { "ad7148_captouch", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, ad714x_id); + +static struct i2c_driver ad714x_i2c_driver = { + .driver = { + .name = "ad714x_captouch", + .pm = &ad714x_i2c_pm, + }, + .probe = ad714x_i2c_probe, + .remove = ad714x_i2c_remove, + .id_table = ad714x_id, +}; + +module_i2c_driver(ad714x_i2c_driver); + +MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor I2C Bus Driver"); +MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/ad714x-spi.c b/drivers/input/misc/ad714x-spi.c new file mode 100644 index 00000000..61891486 --- /dev/null +++ b/drivers/input/misc/ad714x-spi.c @@ -0,0 +1,130 @@ +/* + * AD714X CapTouch Programmable Controller driver (SPI bus) + * + * Copyright 2009-2011 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include /* BUS_SPI */ +#include +#include +#include +#include +#include "ad714x.h" + +#define AD714x_SPI_CMD_PREFIX 0xE000 /* bits 15:11 */ +#define AD714x_SPI_READ BIT(10) + +#ifdef CONFIG_PM_SLEEP +static int ad714x_spi_suspend(struct device *dev) +{ + return ad714x_disable(spi_get_drvdata(to_spi_device(dev))); +} + +static int ad714x_spi_resume(struct device *dev) +{ + return ad714x_enable(spi_get_drvdata(to_spi_device(dev))); +} +#endif + +static SIMPLE_DEV_PM_OPS(ad714x_spi_pm, ad714x_spi_suspend, ad714x_spi_resume); + +static int ad714x_spi_read(struct ad714x_chip *chip, + unsigned short reg, unsigned short *data, size_t len) +{ + struct spi_device *spi = to_spi_device(chip->dev); + struct spi_message message; + struct spi_transfer xfer[2]; + int i; + int error; + + spi_message_init(&message); + memset(xfer, 0, sizeof(xfer)); + + chip->xfer_buf[0] = cpu_to_be16(AD714x_SPI_CMD_PREFIX | + AD714x_SPI_READ | reg); + xfer[0].tx_buf = &chip->xfer_buf[0]; + xfer[0].len = sizeof(chip->xfer_buf[0]); + spi_message_add_tail(&xfer[0], &message); + + xfer[1].rx_buf = &chip->xfer_buf[1]; + xfer[1].len = sizeof(chip->xfer_buf[1]) * len; + spi_message_add_tail(&xfer[1], &message); + + error = spi_sync(spi, &message); + if (unlikely(error)) { + dev_err(chip->dev, "SPI read error: %d\n", error); + return error; + } + + for (i = 0; i < len; i++) + data[i] = be16_to_cpu(chip->xfer_buf[i + 1]); + + return 0; +} + +static int ad714x_spi_write(struct ad714x_chip *chip, + unsigned short reg, unsigned short data) +{ + struct spi_device *spi = to_spi_device(chip->dev); + int error; + + chip->xfer_buf[0] = cpu_to_be16(AD714x_SPI_CMD_PREFIX | reg); + chip->xfer_buf[1] = cpu_to_be16(data); + + error = spi_write(spi, (u8 *)chip->xfer_buf, + 2 * sizeof(*chip->xfer_buf)); + if (unlikely(error)) { + dev_err(chip->dev, "SPI write error: %d\n", error); + return error; + } + + return 0; +} + +static int ad714x_spi_probe(struct spi_device *spi) +{ + struct ad714x_chip *chip; + int err; + + spi->bits_per_word = 8; + err = spi_setup(spi); + if (err < 0) + return err; + + chip = ad714x_probe(&spi->dev, BUS_SPI, spi->irq, + ad714x_spi_read, ad714x_spi_write); + if (IS_ERR(chip)) + return PTR_ERR(chip); + + spi_set_drvdata(spi, chip); + + return 0; +} + +static int ad714x_spi_remove(struct spi_device *spi) +{ + struct ad714x_chip *chip = spi_get_drvdata(spi); + + ad714x_remove(chip); + spi_set_drvdata(spi, NULL); + + return 0; +} + +static struct spi_driver ad714x_spi_driver = { + .driver = { + .name = "ad714x_captouch", + .owner = THIS_MODULE, + .pm = &ad714x_spi_pm, + }, + .probe = ad714x_spi_probe, + .remove = ad714x_spi_remove, +}; + +module_spi_driver(ad714x_spi_driver); + +MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor SPI Bus Driver"); +MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/ad714x.c b/drivers/input/misc/ad714x.c new file mode 100644 index 00000000..2e5d5e1d --- /dev/null +++ b/drivers/input/misc/ad714x.c @@ -0,0 +1,1261 @@ +/* + * AD714X CapTouch Programmable Controller driver supporting AD7142/3/7/8/7A + * + * Copyright 2009-2011 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "ad714x.h" + +#define AD714X_PWR_CTRL 0x0 +#define AD714X_STG_CAL_EN_REG 0x1 +#define AD714X_AMB_COMP_CTRL0_REG 0x2 +#define AD714X_PARTID_REG 0x17 +#define AD7142_PARTID 0xE620 +#define AD7143_PARTID 0xE630 +#define AD7147_PARTID 0x1470 +#define AD7148_PARTID 0x1480 +#define AD714X_STAGECFG_REG 0x80 +#define AD714X_SYSCFG_REG 0x0 + +#define STG_LOW_INT_EN_REG 0x5 +#define STG_HIGH_INT_EN_REG 0x6 +#define STG_COM_INT_EN_REG 0x7 +#define STG_LOW_INT_STA_REG 0x8 +#define STG_HIGH_INT_STA_REG 0x9 +#define STG_COM_INT_STA_REG 0xA + +#define CDC_RESULT_S0 0xB +#define CDC_RESULT_S1 0xC +#define CDC_RESULT_S2 0xD +#define CDC_RESULT_S3 0xE +#define CDC_RESULT_S4 0xF +#define CDC_RESULT_S5 0x10 +#define CDC_RESULT_S6 0x11 +#define CDC_RESULT_S7 0x12 +#define CDC_RESULT_S8 0x13 +#define CDC_RESULT_S9 0x14 +#define CDC_RESULT_S10 0x15 +#define CDC_RESULT_S11 0x16 + +#define STAGE0_AMBIENT 0xF1 +#define STAGE1_AMBIENT 0x115 +#define STAGE2_AMBIENT 0x139 +#define STAGE3_AMBIENT 0x15D +#define STAGE4_AMBIENT 0x181 +#define STAGE5_AMBIENT 0x1A5 +#define STAGE6_AMBIENT 0x1C9 +#define STAGE7_AMBIENT 0x1ED +#define STAGE8_AMBIENT 0x211 +#define STAGE9_AMBIENT 0x234 +#define STAGE10_AMBIENT 0x259 +#define STAGE11_AMBIENT 0x27D + +#define PER_STAGE_REG_NUM 36 +#define STAGE_CFGREG_NUM 8 +#define SYS_CFGREG_NUM 8 + +/* + * driver information which will be used to maintain the software flow + */ +enum ad714x_device_state { IDLE, JITTER, ACTIVE, SPACE }; + +struct ad714x_slider_drv { + int highest_stage; + int abs_pos; + int flt_pos; + enum ad714x_device_state state; + struct input_dev *input; +}; + +struct ad714x_wheel_drv { + int abs_pos; + int flt_pos; + int pre_highest_stage; + int highest_stage; + enum ad714x_device_state state; + struct input_dev *input; +}; + +struct ad714x_touchpad_drv { + int x_highest_stage; + int x_flt_pos; + int x_abs_pos; + int y_highest_stage; + int y_flt_pos; + int y_abs_pos; + int left_ep; + int left_ep_val; + int right_ep; + int right_ep_val; + int top_ep; + int top_ep_val; + int bottom_ep; + int bottom_ep_val; + enum ad714x_device_state state; + struct input_dev *input; +}; + +struct ad714x_button_drv { + enum ad714x_device_state state; + /* + * Unlike slider/wheel/touchpad, all buttons point to + * same input_dev instance + */ + struct input_dev *input; +}; + +struct ad714x_driver_data { + struct ad714x_slider_drv *slider; + struct ad714x_wheel_drv *wheel; + struct ad714x_touchpad_drv *touchpad; + struct ad714x_button_drv *button; +}; + +/* + * information to integrate all things which will be private data + * of spi/i2c device + */ + +static void ad714x_use_com_int(struct ad714x_chip *ad714x, + int start_stage, int end_stage) +{ + unsigned short data; + unsigned short mask; + + mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1); + + ad714x->read(ad714x, STG_COM_INT_EN_REG, &data, 1); + data |= 1 << end_stage; + ad714x->write(ad714x, STG_COM_INT_EN_REG, data); + + ad714x->read(ad714x, STG_HIGH_INT_EN_REG, &data, 1); + data &= ~mask; + ad714x->write(ad714x, STG_HIGH_INT_EN_REG, data); +} + +static void ad714x_use_thr_int(struct ad714x_chip *ad714x, + int start_stage, int end_stage) +{ + unsigned short data; + unsigned short mask; + + mask = ((1 << (end_stage + 1)) - 1) - ((1 << start_stage) - 1); + + ad714x->read(ad714x, STG_COM_INT_EN_REG, &data, 1); + data &= ~(1 << end_stage); + ad714x->write(ad714x, STG_COM_INT_EN_REG, data); + + ad714x->read(ad714x, STG_HIGH_INT_EN_REG, &data, 1); + data |= mask; + ad714x->write(ad714x, STG_HIGH_INT_EN_REG, data); +} + +static int ad714x_cal_highest_stage(struct ad714x_chip *ad714x, + int start_stage, int end_stage) +{ + int max_res = 0; + int max_idx = 0; + int i; + + for (i = start_stage; i <= end_stage; i++) { + if (ad714x->sensor_val[i] > max_res) { + max_res = ad714x->sensor_val[i]; + max_idx = i; + } + } + + return max_idx; +} + +static int ad714x_cal_abs_pos(struct ad714x_chip *ad714x, + int start_stage, int end_stage, + int highest_stage, int max_coord) +{ + int a_param, b_param; + + if (highest_stage == start_stage) { + a_param = ad714x->sensor_val[start_stage + 1]; + b_param = ad714x->sensor_val[start_stage] + + ad714x->sensor_val[start_stage + 1]; + } else if (highest_stage == end_stage) { + a_param = ad714x->sensor_val[end_stage] * + (end_stage - start_stage) + + ad714x->sensor_val[end_stage - 1] * + (end_stage - start_stage - 1); + b_param = ad714x->sensor_val[end_stage] + + ad714x->sensor_val[end_stage - 1]; + } else { + a_param = ad714x->sensor_val[highest_stage] * + (highest_stage - start_stage) + + ad714x->sensor_val[highest_stage - 1] * + (highest_stage - start_stage - 1) + + ad714x->sensor_val[highest_stage + 1] * + (highest_stage - start_stage + 1); + b_param = ad714x->sensor_val[highest_stage] + + ad714x->sensor_val[highest_stage - 1] + + ad714x->sensor_val[highest_stage + 1]; + } + + return (max_coord / (end_stage - start_stage)) * a_param / b_param; +} + +/* + * One button can connect to multi positive and negative of CDCs + * Multi-buttons can connect to same positive/negative of one CDC + */ +static void ad714x_button_state_machine(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_button_plat *hw = &ad714x->hw->button[idx]; + struct ad714x_button_drv *sw = &ad714x->sw->button[idx]; + + switch (sw->state) { + case IDLE: + if (((ad714x->h_state & hw->h_mask) == hw->h_mask) && + ((ad714x->l_state & hw->l_mask) == hw->l_mask)) { + dev_dbg(ad714x->dev, "button %d touched\n", idx); + input_report_key(sw->input, hw->keycode, 1); + input_sync(sw->input); + sw->state = ACTIVE; + } + break; + + case ACTIVE: + if (((ad714x->h_state & hw->h_mask) != hw->h_mask) || + ((ad714x->l_state & hw->l_mask) != hw->l_mask)) { + dev_dbg(ad714x->dev, "button %d released\n", idx); + input_report_key(sw->input, hw->keycode, 0); + input_sync(sw->input); + sw->state = IDLE; + } + break; + + default: + break; + } +} + +/* + * The response of a sensor is defined by the absolute number of codes + * between the current CDC value and the ambient value. + */ +static void ad714x_slider_cal_sensor_val(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; + int i; + + ad714x->read(ad714x, CDC_RESULT_S0 + hw->start_stage, + &ad714x->adc_reg[hw->start_stage], + hw->end_stage - hw->start_stage + 1); + + for (i = hw->start_stage; i <= hw->end_stage; i++) { + ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM, + &ad714x->amb_reg[i], 1); + + ad714x->sensor_val[i] = + abs(ad714x->adc_reg[i] - ad714x->amb_reg[i]); + } +} + +static void ad714x_slider_cal_highest_stage(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; + struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx]; + + sw->highest_stage = ad714x_cal_highest_stage(ad714x, hw->start_stage, + hw->end_stage); + + dev_dbg(ad714x->dev, "slider %d highest_stage:%d\n", idx, + sw->highest_stage); +} + +/* + * The formulae are very straight forward. It uses the sensor with the + * highest response and the 2 adjacent ones. + * When Sensor 0 has the highest response, only sensor 0 and sensor 1 + * are used in the calculations. Similarly when the last sensor has the + * highest response, only the last sensor and the second last sensors + * are used in the calculations. + * + * For i= idx_of_peak_Sensor-1 to i= idx_of_peak_Sensor+1 + * v += Sensor response(i)*i + * w += Sensor response(i) + * POS=(Number_of_Positions_Wanted/(Number_of_Sensors_Used-1)) *(v/w) + */ +static void ad714x_slider_cal_abs_pos(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; + struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx]; + + sw->abs_pos = ad714x_cal_abs_pos(ad714x, hw->start_stage, hw->end_stage, + sw->highest_stage, hw->max_coord); + + dev_dbg(ad714x->dev, "slider %d absolute position:%d\n", idx, + sw->abs_pos); +} + +/* + * To minimise the Impact of the noise on the algorithm, ADI developed a + * routine that filters the CDC results after they have been read by the + * host processor. + * The filter used is an Infinite Input Response(IIR) filter implemented + * in firmware and attenuates the noise on the CDC results after they've + * been read by the host processor. + * Filtered_CDC_result = (Filtered_CDC_result * (10 - Coefficient) + + * Latest_CDC_result * Coefficient)/10 + */ +static void ad714x_slider_cal_flt_pos(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx]; + + sw->flt_pos = (sw->flt_pos * (10 - 4) + + sw->abs_pos * 4)/10; + + dev_dbg(ad714x->dev, "slider %d filter position:%d\n", idx, + sw->flt_pos); +} + +static void ad714x_slider_use_com_int(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; + + ad714x_use_com_int(ad714x, hw->start_stage, hw->end_stage); +} + +static void ad714x_slider_use_thr_int(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; + + ad714x_use_thr_int(ad714x, hw->start_stage, hw->end_stage); +} + +static void ad714x_slider_state_machine(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_slider_plat *hw = &ad714x->hw->slider[idx]; + struct ad714x_slider_drv *sw = &ad714x->sw->slider[idx]; + unsigned short h_state, c_state; + unsigned short mask; + + mask = ((1 << (hw->end_stage + 1)) - 1) - ((1 << hw->start_stage) - 1); + + h_state = ad714x->h_state & mask; + c_state = ad714x->c_state & mask; + + switch (sw->state) { + case IDLE: + if (h_state) { + sw->state = JITTER; + /* In End of Conversion interrupt mode, the AD714X + * continuously generates hardware interrupts. + */ + ad714x_slider_use_com_int(ad714x, idx); + dev_dbg(ad714x->dev, "slider %d touched\n", idx); + } + break; + + case JITTER: + if (c_state == mask) { + ad714x_slider_cal_sensor_val(ad714x, idx); + ad714x_slider_cal_highest_stage(ad714x, idx); + ad714x_slider_cal_abs_pos(ad714x, idx); + sw->flt_pos = sw->abs_pos; + sw->state = ACTIVE; + } + break; + + case ACTIVE: + if (c_state == mask) { + if (h_state) { + ad714x_slider_cal_sensor_val(ad714x, idx); + ad714x_slider_cal_highest_stage(ad714x, idx); + ad714x_slider_cal_abs_pos(ad714x, idx); + ad714x_slider_cal_flt_pos(ad714x, idx); + input_report_abs(sw->input, ABS_X, sw->flt_pos); + input_report_key(sw->input, BTN_TOUCH, 1); + } else { + /* When the user lifts off the sensor, configure + * the AD714X back to threshold interrupt mode. + */ + ad714x_slider_use_thr_int(ad714x, idx); + sw->state = IDLE; + input_report_key(sw->input, BTN_TOUCH, 0); + dev_dbg(ad714x->dev, "slider %d released\n", + idx); + } + input_sync(sw->input); + } + break; + + default: + break; + } +} + +/* + * When the scroll wheel is activated, we compute the absolute position based + * on the sensor values. To calculate the position, we first determine the + * sensor that has the greatest response among the 8 sensors that constitutes + * the scrollwheel. Then we determined the 2 sensors on either sides of the + * sensor with the highest response and we apply weights to these sensors. + */ +static void ad714x_wheel_cal_highest_stage(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx]; + + sw->pre_highest_stage = sw->highest_stage; + sw->highest_stage = ad714x_cal_highest_stage(ad714x, hw->start_stage, + hw->end_stage); + + dev_dbg(ad714x->dev, "wheel %d highest_stage:%d\n", idx, + sw->highest_stage); +} + +static void ad714x_wheel_cal_sensor_val(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + int i; + + ad714x->read(ad714x, CDC_RESULT_S0 + hw->start_stage, + &ad714x->adc_reg[hw->start_stage], + hw->end_stage - hw->start_stage + 1); + + for (i = hw->start_stage; i <= hw->end_stage; i++) { + ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM, + &ad714x->amb_reg[i], 1); + if (ad714x->adc_reg[i] > ad714x->amb_reg[i]) + ad714x->sensor_val[i] = + ad714x->adc_reg[i] - ad714x->amb_reg[i]; + else + ad714x->sensor_val[i] = 0; + } +} + +/* + * When the scroll wheel is activated, we compute the absolute position based + * on the sensor values. To calculate the position, we first determine the + * sensor that has the greatest response among the sensors that constitutes + * the scrollwheel. Then we determined the sensors on either sides of the + * sensor with the highest response and we apply weights to these sensors. The + * result of this computation gives us the mean value. + */ + +static void ad714x_wheel_cal_abs_pos(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx]; + int stage_num = hw->end_stage - hw->start_stage + 1; + int first_before, highest, first_after; + int a_param, b_param; + + first_before = (sw->highest_stage + stage_num - 1) % stage_num; + highest = sw->highest_stage; + first_after = (sw->highest_stage + stage_num + 1) % stage_num; + + a_param = ad714x->sensor_val[highest] * + (highest - hw->start_stage) + + ad714x->sensor_val[first_before] * + (highest - hw->start_stage - 1) + + ad714x->sensor_val[first_after] * + (highest - hw->start_stage + 1); + b_param = ad714x->sensor_val[highest] + + ad714x->sensor_val[first_before] + + ad714x->sensor_val[first_after]; + + sw->abs_pos = ((hw->max_coord / (hw->end_stage - hw->start_stage)) * + a_param) / b_param; + + if (sw->abs_pos > hw->max_coord) + sw->abs_pos = hw->max_coord; + else if (sw->abs_pos < 0) + sw->abs_pos = 0; +} + +static void ad714x_wheel_cal_flt_pos(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx]; + if (((sw->pre_highest_stage == hw->end_stage) && + (sw->highest_stage == hw->start_stage)) || + ((sw->pre_highest_stage == hw->start_stage) && + (sw->highest_stage == hw->end_stage))) + sw->flt_pos = sw->abs_pos; + else + sw->flt_pos = ((sw->flt_pos * 30) + (sw->abs_pos * 71)) / 100; + + if (sw->flt_pos > hw->max_coord) + sw->flt_pos = hw->max_coord; +} + +static void ad714x_wheel_use_com_int(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + + ad714x_use_com_int(ad714x, hw->start_stage, hw->end_stage); +} + +static void ad714x_wheel_use_thr_int(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + + ad714x_use_thr_int(ad714x, hw->start_stage, hw->end_stage); +} + +static void ad714x_wheel_state_machine(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_wheel_plat *hw = &ad714x->hw->wheel[idx]; + struct ad714x_wheel_drv *sw = &ad714x->sw->wheel[idx]; + unsigned short h_state, c_state; + unsigned short mask; + + mask = ((1 << (hw->end_stage + 1)) - 1) - ((1 << hw->start_stage) - 1); + + h_state = ad714x->h_state & mask; + c_state = ad714x->c_state & mask; + + switch (sw->state) { + case IDLE: + if (h_state) { + sw->state = JITTER; + /* In End of Conversion interrupt mode, the AD714X + * continuously generates hardware interrupts. + */ + ad714x_wheel_use_com_int(ad714x, idx); + dev_dbg(ad714x->dev, "wheel %d touched\n", idx); + } + break; + + case JITTER: + if (c_state == mask) { + ad714x_wheel_cal_sensor_val(ad714x, idx); + ad714x_wheel_cal_highest_stage(ad714x, idx); + ad714x_wheel_cal_abs_pos(ad714x, idx); + sw->flt_pos = sw->abs_pos; + sw->state = ACTIVE; + } + break; + + case ACTIVE: + if (c_state == mask) { + if (h_state) { + ad714x_wheel_cal_sensor_val(ad714x, idx); + ad714x_wheel_cal_highest_stage(ad714x, idx); + ad714x_wheel_cal_abs_pos(ad714x, idx); + ad714x_wheel_cal_flt_pos(ad714x, idx); + input_report_abs(sw->input, ABS_WHEEL, + sw->flt_pos); + input_report_key(sw->input, BTN_TOUCH, 1); + } else { + /* When the user lifts off the sensor, configure + * the AD714X back to threshold interrupt mode. + */ + ad714x_wheel_use_thr_int(ad714x, idx); + sw->state = IDLE; + input_report_key(sw->input, BTN_TOUCH, 0); + + dev_dbg(ad714x->dev, "wheel %d released\n", + idx); + } + input_sync(sw->input); + } + break; + + default: + break; + } +} + +static void touchpad_cal_sensor_val(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + int i; + + ad714x->read(ad714x, CDC_RESULT_S0 + hw->x_start_stage, + &ad714x->adc_reg[hw->x_start_stage], + hw->x_end_stage - hw->x_start_stage + 1); + + for (i = hw->x_start_stage; i <= hw->x_end_stage; i++) { + ad714x->read(ad714x, STAGE0_AMBIENT + i * PER_STAGE_REG_NUM, + &ad714x->amb_reg[i], 1); + if (ad714x->adc_reg[i] > ad714x->amb_reg[i]) + ad714x->sensor_val[i] = + ad714x->adc_reg[i] - ad714x->amb_reg[i]; + else + ad714x->sensor_val[i] = 0; + } +} + +static void touchpad_cal_highest_stage(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx]; + + sw->x_highest_stage = ad714x_cal_highest_stage(ad714x, + hw->x_start_stage, hw->x_end_stage); + sw->y_highest_stage = ad714x_cal_highest_stage(ad714x, + hw->y_start_stage, hw->y_end_stage); + + dev_dbg(ad714x->dev, + "touchpad %d x_highest_stage:%d, y_highest_stage:%d\n", + idx, sw->x_highest_stage, sw->y_highest_stage); +} + +/* + * If 2 fingers are touching the sensor then 2 peaks can be observed in the + * distribution. + * The arithmetic doesn't support to get absolute coordinates for multi-touch + * yet. + */ +static int touchpad_check_second_peak(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx]; + int i; + + for (i = hw->x_start_stage; i < sw->x_highest_stage; i++) { + if ((ad714x->sensor_val[i] - ad714x->sensor_val[i + 1]) + > (ad714x->sensor_val[i + 1] / 10)) + return 1; + } + + for (i = sw->x_highest_stage; i < hw->x_end_stage; i++) { + if ((ad714x->sensor_val[i + 1] - ad714x->sensor_val[i]) + > (ad714x->sensor_val[i] / 10)) + return 1; + } + + for (i = hw->y_start_stage; i < sw->y_highest_stage; i++) { + if ((ad714x->sensor_val[i] - ad714x->sensor_val[i + 1]) + > (ad714x->sensor_val[i + 1] / 10)) + return 1; + } + + for (i = sw->y_highest_stage; i < hw->y_end_stage; i++) { + if ((ad714x->sensor_val[i + 1] - ad714x->sensor_val[i]) + > (ad714x->sensor_val[i] / 10)) + return 1; + } + + return 0; +} + +/* + * If only one finger is used to activate the touch pad then only 1 peak will be + * registered in the distribution. This peak and the 2 adjacent sensors will be + * used in the calculation of the absolute position. This will prevent hand + * shadows to affect the absolute position calculation. + */ +static void touchpad_cal_abs_pos(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx]; + + sw->x_abs_pos = ad714x_cal_abs_pos(ad714x, hw->x_start_stage, + hw->x_end_stage, sw->x_highest_stage, hw->x_max_coord); + sw->y_abs_pos = ad714x_cal_abs_pos(ad714x, hw->y_start_stage, + hw->y_end_stage, sw->y_highest_stage, hw->y_max_coord); + + dev_dbg(ad714x->dev, "touchpad %d absolute position:(%d, %d)\n", idx, + sw->x_abs_pos, sw->y_abs_pos); +} + +static void touchpad_cal_flt_pos(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx]; + + sw->x_flt_pos = (sw->x_flt_pos * (10 - 4) + + sw->x_abs_pos * 4)/10; + sw->y_flt_pos = (sw->y_flt_pos * (10 - 4) + + sw->y_abs_pos * 4)/10; + + dev_dbg(ad714x->dev, "touchpad %d filter position:(%d, %d)\n", + idx, sw->x_flt_pos, sw->y_flt_pos); +} + +/* + * To prevent distortion from showing in the absolute position, it is + * necessary to detect the end points. When endpoints are detected, the + * driver stops updating the status variables with absolute positions. + * End points are detected on the 4 edges of the touchpad sensor. The + * method to detect them is the same for all 4. + * To detect the end points, the firmware computes the difference in + * percent between the sensor on the edge and the adjacent one. The + * difference is calculated in percent in order to make the end point + * detection independent of the pressure. + */ + +#define LEFT_END_POINT_DETECTION_LEVEL 550 +#define RIGHT_END_POINT_DETECTION_LEVEL 750 +#define LEFT_RIGHT_END_POINT_DEAVTIVALION_LEVEL 850 +#define TOP_END_POINT_DETECTION_LEVEL 550 +#define BOTTOM_END_POINT_DETECTION_LEVEL 950 +#define TOP_BOTTOM_END_POINT_DEAVTIVALION_LEVEL 700 +static int touchpad_check_endpoint(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx]; + int percent_sensor_diff; + + /* left endpoint detect */ + percent_sensor_diff = (ad714x->sensor_val[hw->x_start_stage] - + ad714x->sensor_val[hw->x_start_stage + 1]) * 100 / + ad714x->sensor_val[hw->x_start_stage + 1]; + if (!sw->left_ep) { + if (percent_sensor_diff >= LEFT_END_POINT_DETECTION_LEVEL) { + sw->left_ep = 1; + sw->left_ep_val = + ad714x->sensor_val[hw->x_start_stage + 1]; + } + } else { + if ((percent_sensor_diff < LEFT_END_POINT_DETECTION_LEVEL) && + (ad714x->sensor_val[hw->x_start_stage + 1] > + LEFT_RIGHT_END_POINT_DEAVTIVALION_LEVEL + sw->left_ep_val)) + sw->left_ep = 0; + } + + /* right endpoint detect */ + percent_sensor_diff = (ad714x->sensor_val[hw->x_end_stage] - + ad714x->sensor_val[hw->x_end_stage - 1]) * 100 / + ad714x->sensor_val[hw->x_end_stage - 1]; + if (!sw->right_ep) { + if (percent_sensor_diff >= RIGHT_END_POINT_DETECTION_LEVEL) { + sw->right_ep = 1; + sw->right_ep_val = + ad714x->sensor_val[hw->x_end_stage - 1]; + } + } else { + if ((percent_sensor_diff < RIGHT_END_POINT_DETECTION_LEVEL) && + (ad714x->sensor_val[hw->x_end_stage - 1] > + LEFT_RIGHT_END_POINT_DEAVTIVALION_LEVEL + sw->right_ep_val)) + sw->right_ep = 0; + } + + /* top endpoint detect */ + percent_sensor_diff = (ad714x->sensor_val[hw->y_start_stage] - + ad714x->sensor_val[hw->y_start_stage + 1]) * 100 / + ad714x->sensor_val[hw->y_start_stage + 1]; + if (!sw->top_ep) { + if (percent_sensor_diff >= TOP_END_POINT_DETECTION_LEVEL) { + sw->top_ep = 1; + sw->top_ep_val = + ad714x->sensor_val[hw->y_start_stage + 1]; + } + } else { + if ((percent_sensor_diff < TOP_END_POINT_DETECTION_LEVEL) && + (ad714x->sensor_val[hw->y_start_stage + 1] > + TOP_BOTTOM_END_POINT_DEAVTIVALION_LEVEL + sw->top_ep_val)) + sw->top_ep = 0; + } + + /* bottom endpoint detect */ + percent_sensor_diff = (ad714x->sensor_val[hw->y_end_stage] - + ad714x->sensor_val[hw->y_end_stage - 1]) * 100 / + ad714x->sensor_val[hw->y_end_stage - 1]; + if (!sw->bottom_ep) { + if (percent_sensor_diff >= BOTTOM_END_POINT_DETECTION_LEVEL) { + sw->bottom_ep = 1; + sw->bottom_ep_val = + ad714x->sensor_val[hw->y_end_stage - 1]; + } + } else { + if ((percent_sensor_diff < BOTTOM_END_POINT_DETECTION_LEVEL) && + (ad714x->sensor_val[hw->y_end_stage - 1] > + TOP_BOTTOM_END_POINT_DEAVTIVALION_LEVEL + sw->bottom_ep_val)) + sw->bottom_ep = 0; + } + + return sw->left_ep || sw->right_ep || sw->top_ep || sw->bottom_ep; +} + +static void touchpad_use_com_int(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + + ad714x_use_com_int(ad714x, hw->x_start_stage, hw->x_end_stage); +} + +static void touchpad_use_thr_int(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + + ad714x_use_thr_int(ad714x, hw->x_start_stage, hw->x_end_stage); + ad714x_use_thr_int(ad714x, hw->y_start_stage, hw->y_end_stage); +} + +static void ad714x_touchpad_state_machine(struct ad714x_chip *ad714x, int idx) +{ + struct ad714x_touchpad_plat *hw = &ad714x->hw->touchpad[idx]; + struct ad714x_touchpad_drv *sw = &ad714x->sw->touchpad[idx]; + unsigned short h_state, c_state; + unsigned short mask; + + mask = (((1 << (hw->x_end_stage + 1)) - 1) - + ((1 << hw->x_start_stage) - 1)) + + (((1 << (hw->y_end_stage + 1)) - 1) - + ((1 << hw->y_start_stage) - 1)); + + h_state = ad714x->h_state & mask; + c_state = ad714x->c_state & mask; + + switch (sw->state) { + case IDLE: + if (h_state) { + sw->state = JITTER; + /* In End of Conversion interrupt mode, the AD714X + * continuously generates hardware interrupts. + */ + touchpad_use_com_int(ad714x, idx); + dev_dbg(ad714x->dev, "touchpad %d touched\n", idx); + } + break; + + case JITTER: + if (c_state == mask) { + touchpad_cal_sensor_val(ad714x, idx); + touchpad_cal_highest_stage(ad714x, idx); + if ((!touchpad_check_second_peak(ad714x, idx)) && + (!touchpad_check_endpoint(ad714x, idx))) { + dev_dbg(ad714x->dev, + "touchpad%d, 2 fingers or endpoint\n", + idx); + touchpad_cal_abs_pos(ad714x, idx); + sw->x_flt_pos = sw->x_abs_pos; + sw->y_flt_pos = sw->y_abs_pos; + sw->state = ACTIVE; + } + } + break; + + case ACTIVE: + if (c_state == mask) { + if (h_state) { + touchpad_cal_sensor_val(ad714x, idx); + touchpad_cal_highest_stage(ad714x, idx); + if ((!touchpad_check_second_peak(ad714x, idx)) + && (!touchpad_check_endpoint(ad714x, idx))) { + touchpad_cal_abs_pos(ad714x, idx); + touchpad_cal_flt_pos(ad714x, idx); + input_report_abs(sw->input, ABS_X, + sw->x_flt_pos); + input_report_abs(sw->input, ABS_Y, + sw->y_flt_pos); + input_report_key(sw->input, BTN_TOUCH, + 1); + } + } else { + /* When the user lifts off the sensor, configure + * the AD714X back to threshold interrupt mode. + */ + touchpad_use_thr_int(ad714x, idx); + sw->state = IDLE; + input_report_key(sw->input, BTN_TOUCH, 0); + dev_dbg(ad714x->dev, "touchpad %d released\n", + idx); + } + input_sync(sw->input); + } + break; + + default: + break; + } +} + +static int ad714x_hw_detect(struct ad714x_chip *ad714x) +{ + unsigned short data; + + ad714x->read(ad714x, AD714X_PARTID_REG, &data, 1); + switch (data & 0xFFF0) { + case AD7142_PARTID: + ad714x->product = 0x7142; + ad714x->version = data & 0xF; + dev_info(ad714x->dev, "found AD7142 captouch, rev:%d\n", + ad714x->version); + return 0; + + case AD7143_PARTID: + ad714x->product = 0x7143; + ad714x->version = data & 0xF; + dev_info(ad714x->dev, "found AD7143 captouch, rev:%d\n", + ad714x->version); + return 0; + + case AD7147_PARTID: + ad714x->product = 0x7147; + ad714x->version = data & 0xF; + dev_info(ad714x->dev, "found AD7147(A) captouch, rev:%d\n", + ad714x->version); + return 0; + + case AD7148_PARTID: + ad714x->product = 0x7148; + ad714x->version = data & 0xF; + dev_info(ad714x->dev, "found AD7148 captouch, rev:%d\n", + ad714x->version); + return 0; + + default: + dev_err(ad714x->dev, + "fail to detect AD714X captouch, read ID is %04x\n", + data); + return -ENODEV; + } +} + +static void ad714x_hw_init(struct ad714x_chip *ad714x) +{ + int i, j; + unsigned short reg_base; + unsigned short data; + + /* configuration CDC and interrupts */ + + for (i = 0; i < STAGE_NUM; i++) { + reg_base = AD714X_STAGECFG_REG + i * STAGE_CFGREG_NUM; + for (j = 0; j < STAGE_CFGREG_NUM; j++) + ad714x->write(ad714x, reg_base + j, + ad714x->hw->stage_cfg_reg[i][j]); + } + + for (i = 0; i < SYS_CFGREG_NUM; i++) + ad714x->write(ad714x, AD714X_SYSCFG_REG + i, + ad714x->hw->sys_cfg_reg[i]); + for (i = 0; i < SYS_CFGREG_NUM; i++) + ad714x->read(ad714x, AD714X_SYSCFG_REG + i, &data, 1); + + ad714x->write(ad714x, AD714X_STG_CAL_EN_REG, 0xFFF); + + /* clear all interrupts */ + ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3); +} + +static irqreturn_t ad714x_interrupt_thread(int irq, void *data) +{ + struct ad714x_chip *ad714x = data; + int i; + + mutex_lock(&ad714x->mutex); + + ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3); + + for (i = 0; i < ad714x->hw->button_num; i++) + ad714x_button_state_machine(ad714x, i); + for (i = 0; i < ad714x->hw->slider_num; i++) + ad714x_slider_state_machine(ad714x, i); + for (i = 0; i < ad714x->hw->wheel_num; i++) + ad714x_wheel_state_machine(ad714x, i); + for (i = 0; i < ad714x->hw->touchpad_num; i++) + ad714x_touchpad_state_machine(ad714x, i); + + mutex_unlock(&ad714x->mutex); + + return IRQ_HANDLED; +} + +#define MAX_DEVICE_NUM 8 +struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, + ad714x_read_t read, ad714x_write_t write) +{ + int i, alloc_idx; + int error; + struct input_dev *input[MAX_DEVICE_NUM]; + + struct ad714x_platform_data *plat_data = dev->platform_data; + struct ad714x_chip *ad714x; + void *drv_mem; + unsigned long irqflags; + + struct ad714x_button_drv *bt_drv; + struct ad714x_slider_drv *sd_drv; + struct ad714x_wheel_drv *wl_drv; + struct ad714x_touchpad_drv *tp_drv; + + + if (irq <= 0) { + dev_err(dev, "IRQ not configured!\n"); + error = -EINVAL; + goto err_out; + } + + if (dev->platform_data == NULL) { + dev_err(dev, "platform data for ad714x doesn't exist\n"); + error = -EINVAL; + goto err_out; + } + + ad714x = kzalloc(sizeof(*ad714x) + sizeof(*ad714x->sw) + + sizeof(*sd_drv) * plat_data->slider_num + + sizeof(*wl_drv) * plat_data->wheel_num + + sizeof(*tp_drv) * plat_data->touchpad_num + + sizeof(*bt_drv) * plat_data->button_num, GFP_KERNEL); + if (!ad714x) { + error = -ENOMEM; + goto err_out; + } + + ad714x->hw = plat_data; + + drv_mem = ad714x + 1; + ad714x->sw = drv_mem; + drv_mem += sizeof(*ad714x->sw); + ad714x->sw->slider = sd_drv = drv_mem; + drv_mem += sizeof(*sd_drv) * ad714x->hw->slider_num; + ad714x->sw->wheel = wl_drv = drv_mem; + drv_mem += sizeof(*wl_drv) * ad714x->hw->wheel_num; + ad714x->sw->touchpad = tp_drv = drv_mem; + drv_mem += sizeof(*tp_drv) * ad714x->hw->touchpad_num; + ad714x->sw->button = bt_drv = drv_mem; + drv_mem += sizeof(*bt_drv) * ad714x->hw->button_num; + + ad714x->read = read; + ad714x->write = write; + ad714x->irq = irq; + ad714x->dev = dev; + + error = ad714x_hw_detect(ad714x); + if (error) + goto err_free_mem; + + /* initialize and request sw/hw resources */ + + ad714x_hw_init(ad714x); + mutex_init(&ad714x->mutex); + + /* + * Allocate and register AD714X input device + */ + alloc_idx = 0; + + /* a slider uses one input_dev instance */ + if (ad714x->hw->slider_num > 0) { + struct ad714x_slider_plat *sd_plat = ad714x->hw->slider; + + for (i = 0; i < ad714x->hw->slider_num; i++) { + sd_drv[i].input = input[alloc_idx] = input_allocate_device(); + if (!input[alloc_idx]) { + error = -ENOMEM; + goto err_free_dev; + } + + __set_bit(EV_ABS, input[alloc_idx]->evbit); + __set_bit(EV_KEY, input[alloc_idx]->evbit); + __set_bit(ABS_X, input[alloc_idx]->absbit); + __set_bit(BTN_TOUCH, input[alloc_idx]->keybit); + input_set_abs_params(input[alloc_idx], + ABS_X, 0, sd_plat->max_coord, 0, 0); + + input[alloc_idx]->id.bustype = bus_type; + input[alloc_idx]->id.product = ad714x->product; + input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_slider"; + input[alloc_idx]->dev.parent = dev; + + error = input_register_device(input[alloc_idx]); + if (error) + goto err_free_dev; + + alloc_idx++; + } + } + + /* a wheel uses one input_dev instance */ + if (ad714x->hw->wheel_num > 0) { + struct ad714x_wheel_plat *wl_plat = ad714x->hw->wheel; + + for (i = 0; i < ad714x->hw->wheel_num; i++) { + wl_drv[i].input = input[alloc_idx] = input_allocate_device(); + if (!input[alloc_idx]) { + error = -ENOMEM; + goto err_free_dev; + } + + __set_bit(EV_KEY, input[alloc_idx]->evbit); + __set_bit(EV_ABS, input[alloc_idx]->evbit); + __set_bit(ABS_WHEEL, input[alloc_idx]->absbit); + __set_bit(BTN_TOUCH, input[alloc_idx]->keybit); + input_set_abs_params(input[alloc_idx], + ABS_WHEEL, 0, wl_plat->max_coord, 0, 0); + + input[alloc_idx]->id.bustype = bus_type; + input[alloc_idx]->id.product = ad714x->product; + input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_wheel"; + input[alloc_idx]->dev.parent = dev; + + error = input_register_device(input[alloc_idx]); + if (error) + goto err_free_dev; + + alloc_idx++; + } + } + + /* a touchpad uses one input_dev instance */ + if (ad714x->hw->touchpad_num > 0) { + struct ad714x_touchpad_plat *tp_plat = ad714x->hw->touchpad; + + for (i = 0; i < ad714x->hw->touchpad_num; i++) { + tp_drv[i].input = input[alloc_idx] = input_allocate_device(); + if (!input[alloc_idx]) { + error = -ENOMEM; + goto err_free_dev; + } + + __set_bit(EV_ABS, input[alloc_idx]->evbit); + __set_bit(EV_KEY, input[alloc_idx]->evbit); + __set_bit(ABS_X, input[alloc_idx]->absbit); + __set_bit(ABS_Y, input[alloc_idx]->absbit); + __set_bit(BTN_TOUCH, input[alloc_idx]->keybit); + input_set_abs_params(input[alloc_idx], + ABS_X, 0, tp_plat->x_max_coord, 0, 0); + input_set_abs_params(input[alloc_idx], + ABS_Y, 0, tp_plat->y_max_coord, 0, 0); + + input[alloc_idx]->id.bustype = bus_type; + input[alloc_idx]->id.product = ad714x->product; + input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_pad"; + input[alloc_idx]->dev.parent = dev; + + error = input_register_device(input[alloc_idx]); + if (error) + goto err_free_dev; + + alloc_idx++; + } + } + + /* all buttons use one input node */ + if (ad714x->hw->button_num > 0) { + struct ad714x_button_plat *bt_plat = ad714x->hw->button; + + input[alloc_idx] = input_allocate_device(); + if (!input[alloc_idx]) { + error = -ENOMEM; + goto err_free_dev; + } + + __set_bit(EV_KEY, input[alloc_idx]->evbit); + for (i = 0; i < ad714x->hw->button_num; i++) { + bt_drv[i].input = input[alloc_idx]; + __set_bit(bt_plat[i].keycode, input[alloc_idx]->keybit); + } + + input[alloc_idx]->id.bustype = bus_type; + input[alloc_idx]->id.product = ad714x->product; + input[alloc_idx]->id.version = ad714x->version; + input[alloc_idx]->name = "ad714x_captouch_button"; + input[alloc_idx]->dev.parent = dev; + + error = input_register_device(input[alloc_idx]); + if (error) + goto err_free_dev; + + alloc_idx++; + } + + irqflags = plat_data->irqflags ?: IRQF_TRIGGER_FALLING; + irqflags |= IRQF_ONESHOT; + + error = request_threaded_irq(ad714x->irq, NULL, ad714x_interrupt_thread, + irqflags, "ad714x_captouch", ad714x); + if (error) { + dev_err(dev, "can't allocate irq %d\n", ad714x->irq); + goto err_unreg_dev; + } + + return ad714x; + + err_free_dev: + dev_err(dev, "failed to setup AD714x input device %i\n", alloc_idx); + input_free_device(input[alloc_idx]); + err_unreg_dev: + while (--alloc_idx >= 0) + input_unregister_device(input[alloc_idx]); + err_free_mem: + kfree(ad714x); + err_out: + return ERR_PTR(error); +} +EXPORT_SYMBOL(ad714x_probe); + +void ad714x_remove(struct ad714x_chip *ad714x) +{ + struct ad714x_platform_data *hw = ad714x->hw; + struct ad714x_driver_data *sw = ad714x->sw; + int i; + + free_irq(ad714x->irq, ad714x); + + /* unregister and free all input devices */ + + for (i = 0; i < hw->slider_num; i++) + input_unregister_device(sw->slider[i].input); + + for (i = 0; i < hw->wheel_num; i++) + input_unregister_device(sw->wheel[i].input); + + for (i = 0; i < hw->touchpad_num; i++) + input_unregister_device(sw->touchpad[i].input); + + if (hw->button_num) + input_unregister_device(sw->button[0].input); + + kfree(ad714x); +} +EXPORT_SYMBOL(ad714x_remove); + +#ifdef CONFIG_PM +int ad714x_disable(struct ad714x_chip *ad714x) +{ + unsigned short data; + + dev_dbg(ad714x->dev, "%s enter\n", __func__); + + mutex_lock(&ad714x->mutex); + + data = ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL] | 0x3; + ad714x->write(ad714x, AD714X_PWR_CTRL, data); + + mutex_unlock(&ad714x->mutex); + + return 0; +} +EXPORT_SYMBOL(ad714x_disable); + +int ad714x_enable(struct ad714x_chip *ad714x) +{ + dev_dbg(ad714x->dev, "%s enter\n", __func__); + + mutex_lock(&ad714x->mutex); + + /* resume to non-shutdown mode */ + + ad714x->write(ad714x, AD714X_PWR_CTRL, + ad714x->hw->sys_cfg_reg[AD714X_PWR_CTRL]); + + /* make sure the interrupt output line is not low level after resume, + * otherwise we will get no chance to enter falling-edge irq again + */ + + ad714x->read(ad714x, STG_LOW_INT_STA_REG, &ad714x->l_state, 3); + + mutex_unlock(&ad714x->mutex); + + return 0; +} +EXPORT_SYMBOL(ad714x_enable); +#endif + +MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor Driver"); +MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/ad714x.h b/drivers/input/misc/ad714x.h new file mode 100644 index 00000000..3c85455a --- /dev/null +++ b/drivers/input/misc/ad714x.h @@ -0,0 +1,55 @@ +/* + * AD714X CapTouch Programmable Controller driver (bus interfaces) + * + * Copyright 2009-2011 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#ifndef _AD714X_H_ +#define _AD714X_H_ + +#include + +#define STAGE_NUM 12 + +struct device; +struct ad714x_platform_data; +struct ad714x_driver_data; +struct ad714x_chip; + +typedef int (*ad714x_read_t)(struct ad714x_chip *, unsigned short, unsigned short *, size_t); +typedef int (*ad714x_write_t)(struct ad714x_chip *, unsigned short, unsigned short); + +struct ad714x_chip { + unsigned short l_state; + unsigned short h_state; + unsigned short c_state; + unsigned short adc_reg[STAGE_NUM]; + unsigned short amb_reg[STAGE_NUM]; + unsigned short sensor_val[STAGE_NUM]; + + struct ad714x_platform_data *hw; + struct ad714x_driver_data *sw; + + int irq; + struct device *dev; + ad714x_read_t read; + ad714x_write_t write; + + struct mutex mutex; + + unsigned product; + unsigned version; + + __be16 xfer_buf[16] ____cacheline_aligned; + +}; + +int ad714x_disable(struct ad714x_chip *ad714x); +int ad714x_enable(struct ad714x_chip *ad714x); +struct ad714x_chip *ad714x_probe(struct device *dev, u16 bus_type, int irq, + ad714x_read_t read, ad714x_write_t write); +void ad714x_remove(struct ad714x_chip *ad714x); + +#endif diff --git a/drivers/input/misc/adxl34x-i2c.c b/drivers/input/misc/adxl34x-i2c.c new file mode 100644 index 00000000..416f47dd --- /dev/null +++ b/drivers/input/misc/adxl34x-i2c.c @@ -0,0 +1,155 @@ +/* + * ADLX345/346 Three-Axis Digital Accelerometers (I2C Interface) + * + * Enter bugs at http://blackfin.uclinux.org/ + * + * Copyright (C) 2009 Michael Hennerich, Analog Devices Inc. + * Licensed under the GPL-2 or later. + */ + +#include /* BUS_I2C */ +#include +#include +#include +#include +#include "adxl34x.h" + +static int adxl34x_smbus_read(struct device *dev, unsigned char reg) +{ + struct i2c_client *client = to_i2c_client(dev); + + return i2c_smbus_read_byte_data(client, reg); +} + +static int adxl34x_smbus_write(struct device *dev, + unsigned char reg, unsigned char val) +{ + struct i2c_client *client = to_i2c_client(dev); + + return i2c_smbus_write_byte_data(client, reg, val); +} + +static int adxl34x_smbus_read_block(struct device *dev, + unsigned char reg, int count, + void *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + + return i2c_smbus_read_i2c_block_data(client, reg, count, buf); +} + +static int adxl34x_i2c_read_block(struct device *dev, + unsigned char reg, int count, + void *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + int ret; + + ret = i2c_master_send(client, ®, 1); + if (ret < 0) + return ret; + + ret = i2c_master_recv(client, buf, count); + if (ret < 0) + return ret; + + if (ret != count) + return -EIO; + + return 0; +} + +static const struct adxl34x_bus_ops adxl34x_smbus_bops = { + .bustype = BUS_I2C, + .write = adxl34x_smbus_write, + .read = adxl34x_smbus_read, + .read_block = adxl34x_smbus_read_block, +}; + +static const struct adxl34x_bus_ops adxl34x_i2c_bops = { + .bustype = BUS_I2C, + .write = adxl34x_smbus_write, + .read = adxl34x_smbus_read, + .read_block = adxl34x_i2c_read_block, +}; + +static int adxl34x_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct adxl34x *ac; + int error; + + error = i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA); + if (!error) { + dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); + return -EIO; + } + + ac = adxl34x_probe(&client->dev, client->irq, false, + i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_I2C_BLOCK) ? + &adxl34x_smbus_bops : &adxl34x_i2c_bops); + if (IS_ERR(ac)) + return PTR_ERR(ac); + + i2c_set_clientdata(client, ac); + + return 0; +} + +static int adxl34x_i2c_remove(struct i2c_client *client) +{ + struct adxl34x *ac = i2c_get_clientdata(client); + + return adxl34x_remove(ac); +} + +#ifdef CONFIG_PM_SLEEP +static int adxl34x_i2c_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct adxl34x *ac = i2c_get_clientdata(client); + + adxl34x_suspend(ac); + + return 0; +} + +static int adxl34x_i2c_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct adxl34x *ac = i2c_get_clientdata(client); + + adxl34x_resume(ac); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(adxl34x_i2c_pm, adxl34x_i2c_suspend, + adxl34x_i2c_resume); + +static const struct i2c_device_id adxl34x_id[] = { + { "adxl34x", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, adxl34x_id); + +static struct i2c_driver adxl34x_driver = { + .driver = { + .name = "adxl34x", + .owner = THIS_MODULE, + .pm = &adxl34x_i2c_pm, + }, + .probe = adxl34x_i2c_probe, + .remove = adxl34x_i2c_remove, + .id_table = adxl34x_id, +}; + +module_i2c_driver(adxl34x_driver); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("ADXL345/346 Three-Axis Digital Accelerometer I2C Bus Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/adxl34x-spi.c b/drivers/input/misc/adxl34x-spi.c new file mode 100644 index 00000000..76dc0679 --- /dev/null +++ b/drivers/input/misc/adxl34x-spi.c @@ -0,0 +1,136 @@ +/* + * ADLX345/346 Three-Axis Digital Accelerometers (SPI Interface) + * + * Enter bugs at http://blackfin.uclinux.org/ + * + * Copyright (C) 2009 Michael Hennerich, Analog Devices Inc. + * Licensed under the GPL-2 or later. + */ + +#include /* BUS_SPI */ +#include +#include +#include +#include +#include "adxl34x.h" + +#define MAX_SPI_FREQ_HZ 5000000 +#define MAX_FREQ_NO_FIFODELAY 1500000 +#define ADXL34X_CMD_MULTB (1 << 6) +#define ADXL34X_CMD_READ (1 << 7) +#define ADXL34X_WRITECMD(reg) (reg & 0x3F) +#define ADXL34X_READCMD(reg) (ADXL34X_CMD_READ | (reg & 0x3F)) +#define ADXL34X_READMB_CMD(reg) (ADXL34X_CMD_READ | ADXL34X_CMD_MULTB \ + | (reg & 0x3F)) + +static int adxl34x_spi_read(struct device *dev, unsigned char reg) +{ + struct spi_device *spi = to_spi_device(dev); + unsigned char cmd; + + cmd = ADXL34X_READCMD(reg); + + return spi_w8r8(spi, cmd); +} + +static int adxl34x_spi_write(struct device *dev, + unsigned char reg, unsigned char val) +{ + struct spi_device *spi = to_spi_device(dev); + unsigned char buf[2]; + + buf[0] = ADXL34X_WRITECMD(reg); + buf[1] = val; + + return spi_write(spi, buf, sizeof(buf)); +} + +static int adxl34x_spi_read_block(struct device *dev, + unsigned char reg, int count, + void *buf) +{ + struct spi_device *spi = to_spi_device(dev); + ssize_t status; + + reg = ADXL34X_READMB_CMD(reg); + status = spi_write_then_read(spi, ®, 1, buf, count); + + return (status < 0) ? status : 0; +} + +static const struct adxl34x_bus_ops adxl34x_spi_bops = { + .bustype = BUS_SPI, + .write = adxl34x_spi_write, + .read = adxl34x_spi_read, + .read_block = adxl34x_spi_read_block, +}; + +static int adxl34x_spi_probe(struct spi_device *spi) +{ + struct adxl34x *ac; + + /* don't exceed max specified SPI CLK frequency */ + if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { + dev_err(&spi->dev, "SPI CLK %d Hz too fast\n", spi->max_speed_hz); + return -EINVAL; + } + + ac = adxl34x_probe(&spi->dev, spi->irq, + spi->max_speed_hz > MAX_FREQ_NO_FIFODELAY, + &adxl34x_spi_bops); + + if (IS_ERR(ac)) + return PTR_ERR(ac); + + spi_set_drvdata(spi, ac); + + return 0; +} + +static int adxl34x_spi_remove(struct spi_device *spi) +{ + struct adxl34x *ac = spi_get_drvdata(spi); + + return adxl34x_remove(ac); +} + +#ifdef CONFIG_PM_SLEEP +static int adxl34x_spi_suspend(struct device *dev) +{ + struct spi_device *spi = to_spi_device(dev); + struct adxl34x *ac = spi_get_drvdata(spi); + + adxl34x_suspend(ac); + + return 0; +} + +static int adxl34x_spi_resume(struct device *dev) +{ + struct spi_device *spi = to_spi_device(dev); + struct adxl34x *ac = spi_get_drvdata(spi); + + adxl34x_resume(ac); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(adxl34x_spi_pm, adxl34x_spi_suspend, + adxl34x_spi_resume); + +static struct spi_driver adxl34x_driver = { + .driver = { + .name = "adxl34x", + .owner = THIS_MODULE, + .pm = &adxl34x_spi_pm, + }, + .probe = adxl34x_spi_probe, + .remove = adxl34x_spi_remove, +}; + +module_spi_driver(adxl34x_driver); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("ADXL345/346 Three-Axis Digital Accelerometer SPI Bus Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/adxl34x.c b/drivers/input/misc/adxl34x.c new file mode 100644 index 00000000..0735de3a --- /dev/null +++ b/drivers/input/misc/adxl34x.c @@ -0,0 +1,914 @@ +/* + * ADXL345/346 Three-Axis Digital Accelerometers + * + * Enter bugs at http://blackfin.uclinux.org/ + * + * Copyright (C) 2009 Michael Hennerich, Analog Devices Inc. + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "adxl34x.h" + +/* ADXL345/6 Register Map */ +#define DEVID 0x00 /* R Device ID */ +#define THRESH_TAP 0x1D /* R/W Tap threshold */ +#define OFSX 0x1E /* R/W X-axis offset */ +#define OFSY 0x1F /* R/W Y-axis offset */ +#define OFSZ 0x20 /* R/W Z-axis offset */ +#define DUR 0x21 /* R/W Tap duration */ +#define LATENT 0x22 /* R/W Tap latency */ +#define WINDOW 0x23 /* R/W Tap window */ +#define THRESH_ACT 0x24 /* R/W Activity threshold */ +#define THRESH_INACT 0x25 /* R/W Inactivity threshold */ +#define TIME_INACT 0x26 /* R/W Inactivity time */ +#define ACT_INACT_CTL 0x27 /* R/W Axis enable control for activity and */ + /* inactivity detection */ +#define THRESH_FF 0x28 /* R/W Free-fall threshold */ +#define TIME_FF 0x29 /* R/W Free-fall time */ +#define TAP_AXES 0x2A /* R/W Axis control for tap/double tap */ +#define ACT_TAP_STATUS 0x2B /* R Source of tap/double tap */ +#define BW_RATE 0x2C /* R/W Data rate and power mode control */ +#define POWER_CTL 0x2D /* R/W Power saving features control */ +#define INT_ENABLE 0x2E /* R/W Interrupt enable control */ +#define INT_MAP 0x2F /* R/W Interrupt mapping control */ +#define INT_SOURCE 0x30 /* R Source of interrupts */ +#define DATA_FORMAT 0x31 /* R/W Data format control */ +#define DATAX0 0x32 /* R X-Axis Data 0 */ +#define DATAX1 0x33 /* R X-Axis Data 1 */ +#define DATAY0 0x34 /* R Y-Axis Data 0 */ +#define DATAY1 0x35 /* R Y-Axis Data 1 */ +#define DATAZ0 0x36 /* R Z-Axis Data 0 */ +#define DATAZ1 0x37 /* R Z-Axis Data 1 */ +#define FIFO_CTL 0x38 /* R/W FIFO control */ +#define FIFO_STATUS 0x39 /* R FIFO status */ +#define TAP_SIGN 0x3A /* R Sign and source for tap/double tap */ +/* Orientation ADXL346 only */ +#define ORIENT_CONF 0x3B /* R/W Orientation configuration */ +#define ORIENT 0x3C /* R Orientation status */ + +/* DEVIDs */ +#define ID_ADXL345 0xE5 +#define ID_ADXL346 0xE6 + +/* INT_ENABLE/INT_MAP/INT_SOURCE Bits */ +#define DATA_READY (1 << 7) +#define SINGLE_TAP (1 << 6) +#define DOUBLE_TAP (1 << 5) +#define ACTIVITY (1 << 4) +#define INACTIVITY (1 << 3) +#define FREE_FALL (1 << 2) +#define WATERMARK (1 << 1) +#define OVERRUN (1 << 0) + +/* ACT_INACT_CONTROL Bits */ +#define ACT_ACDC (1 << 7) +#define ACT_X_EN (1 << 6) +#define ACT_Y_EN (1 << 5) +#define ACT_Z_EN (1 << 4) +#define INACT_ACDC (1 << 3) +#define INACT_X_EN (1 << 2) +#define INACT_Y_EN (1 << 1) +#define INACT_Z_EN (1 << 0) + +/* TAP_AXES Bits */ +#define SUPPRESS (1 << 3) +#define TAP_X_EN (1 << 2) +#define TAP_Y_EN (1 << 1) +#define TAP_Z_EN (1 << 0) + +/* ACT_TAP_STATUS Bits */ +#define ACT_X_SRC (1 << 6) +#define ACT_Y_SRC (1 << 5) +#define ACT_Z_SRC (1 << 4) +#define ASLEEP (1 << 3) +#define TAP_X_SRC (1 << 2) +#define TAP_Y_SRC (1 << 1) +#define TAP_Z_SRC (1 << 0) + +/* BW_RATE Bits */ +#define LOW_POWER (1 << 4) +#define RATE(x) ((x) & 0xF) + +/* POWER_CTL Bits */ +#define PCTL_LINK (1 << 5) +#define PCTL_AUTO_SLEEP (1 << 4) +#define PCTL_MEASURE (1 << 3) +#define PCTL_SLEEP (1 << 2) +#define PCTL_WAKEUP(x) ((x) & 0x3) + +/* DATA_FORMAT Bits */ +#define SELF_TEST (1 << 7) +#define SPI (1 << 6) +#define INT_INVERT (1 << 5) +#define FULL_RES (1 << 3) +#define JUSTIFY (1 << 2) +#define RANGE(x) ((x) & 0x3) +#define RANGE_PM_2g 0 +#define RANGE_PM_4g 1 +#define RANGE_PM_8g 2 +#define RANGE_PM_16g 3 + +/* + * Maximum value our axis may get in full res mode for the input device + * (signed 13 bits) + */ +#define ADXL_FULLRES_MAX_VAL 4096 + +/* + * Maximum value our axis may get in fixed res mode for the input device + * (signed 10 bits) + */ +#define ADXL_FIXEDRES_MAX_VAL 512 + +/* FIFO_CTL Bits */ +#define FIFO_MODE(x) (((x) & 0x3) << 6) +#define FIFO_BYPASS 0 +#define FIFO_FIFO 1 +#define FIFO_STREAM 2 +#define FIFO_TRIGGER 3 +#define TRIGGER (1 << 5) +#define SAMPLES(x) ((x) & 0x1F) + +/* FIFO_STATUS Bits */ +#define FIFO_TRIG (1 << 7) +#define ENTRIES(x) ((x) & 0x3F) + +/* TAP_SIGN Bits ADXL346 only */ +#define XSIGN (1 << 6) +#define YSIGN (1 << 5) +#define ZSIGN (1 << 4) +#define XTAP (1 << 3) +#define YTAP (1 << 2) +#define ZTAP (1 << 1) + +/* ORIENT_CONF ADXL346 only */ +#define ORIENT_DEADZONE(x) (((x) & 0x7) << 4) +#define ORIENT_DIVISOR(x) ((x) & 0x7) + +/* ORIENT ADXL346 only */ +#define ADXL346_2D_VALID (1 << 6) +#define ADXL346_2D_ORIENT(x) (((x) & 0x3) >> 4) +#define ADXL346_3D_VALID (1 << 3) +#define ADXL346_3D_ORIENT(x) ((x) & 0x7) +#define ADXL346_2D_PORTRAIT_POS 0 /* +X */ +#define ADXL346_2D_PORTRAIT_NEG 1 /* -X */ +#define ADXL346_2D_LANDSCAPE_POS 2 /* +Y */ +#define ADXL346_2D_LANDSCAPE_NEG 3 /* -Y */ + +#define ADXL346_3D_FRONT 3 /* +X */ +#define ADXL346_3D_BACK 4 /* -X */ +#define ADXL346_3D_RIGHT 2 /* +Y */ +#define ADXL346_3D_LEFT 5 /* -Y */ +#define ADXL346_3D_TOP 1 /* +Z */ +#define ADXL346_3D_BOTTOM 6 /* -Z */ + +#undef ADXL_DEBUG + +#define ADXL_X_AXIS 0 +#define ADXL_Y_AXIS 1 +#define ADXL_Z_AXIS 2 + +#define AC_READ(ac, reg) ((ac)->bops->read((ac)->dev, reg)) +#define AC_WRITE(ac, reg, val) ((ac)->bops->write((ac)->dev, reg, val)) + +struct axis_triple { + int x; + int y; + int z; +}; + +struct adxl34x { + struct device *dev; + struct input_dev *input; + struct mutex mutex; /* reentrant protection for struct */ + struct adxl34x_platform_data pdata; + struct axis_triple swcal; + struct axis_triple hwcal; + struct axis_triple saved; + char phys[32]; + unsigned orient2d_saved; + unsigned orient3d_saved; + bool disabled; /* P: mutex */ + bool opened; /* P: mutex */ + bool suspended; /* P: mutex */ + bool fifo_delay; + int irq; + unsigned model; + unsigned int_mask; + + const struct adxl34x_bus_ops *bops; +}; + +static const struct adxl34x_platform_data adxl34x_default_init = { + .tap_threshold = 35, + .tap_duration = 3, + .tap_latency = 20, + .tap_window = 20, + .tap_axis_control = ADXL_TAP_X_EN | ADXL_TAP_Y_EN | ADXL_TAP_Z_EN, + .act_axis_control = 0xFF, + .activity_threshold = 6, + .inactivity_threshold = 4, + .inactivity_time = 3, + .free_fall_threshold = 8, + .free_fall_time = 0x20, + .data_rate = 8, + .data_range = ADXL_FULL_RES, + + .ev_type = EV_ABS, + .ev_code_x = ABS_X, /* EV_REL */ + .ev_code_y = ABS_Y, /* EV_REL */ + .ev_code_z = ABS_Z, /* EV_REL */ + + .ev_code_tap = {BTN_TOUCH, BTN_TOUCH, BTN_TOUCH}, /* EV_KEY {x,y,z} */ + .power_mode = ADXL_AUTO_SLEEP | ADXL_LINK, + .fifo_mode = ADXL_FIFO_STREAM, + .watermark = 0, +}; + +static void adxl34x_get_triple(struct adxl34x *ac, struct axis_triple *axis) +{ + short buf[3]; + + ac->bops->read_block(ac->dev, DATAX0, DATAZ1 - DATAX0 + 1, buf); + + mutex_lock(&ac->mutex); + ac->saved.x = (s16) le16_to_cpu(buf[0]); + axis->x = ac->saved.x; + + ac->saved.y = (s16) le16_to_cpu(buf[1]); + axis->y = ac->saved.y; + + ac->saved.z = (s16) le16_to_cpu(buf[2]); + axis->z = ac->saved.z; + mutex_unlock(&ac->mutex); +} + +static void adxl34x_service_ev_fifo(struct adxl34x *ac) +{ + struct adxl34x_platform_data *pdata = &ac->pdata; + struct axis_triple axis; + + adxl34x_get_triple(ac, &axis); + + input_event(ac->input, pdata->ev_type, pdata->ev_code_x, + axis.x - ac->swcal.x); + input_event(ac->input, pdata->ev_type, pdata->ev_code_y, + axis.y - ac->swcal.y); + input_event(ac->input, pdata->ev_type, pdata->ev_code_z, + axis.z - ac->swcal.z); +} + +static void adxl34x_report_key_single(struct input_dev *input, int key) +{ + input_report_key(input, key, true); + input_sync(input); + input_report_key(input, key, false); +} + +static void adxl34x_send_key_events(struct adxl34x *ac, + struct adxl34x_platform_data *pdata, int status, int press) +{ + int i; + + for (i = ADXL_X_AXIS; i <= ADXL_Z_AXIS; i++) { + if (status & (1 << (ADXL_Z_AXIS - i))) + input_report_key(ac->input, + pdata->ev_code_tap[i], press); + } +} + +static void adxl34x_do_tap(struct adxl34x *ac, + struct adxl34x_platform_data *pdata, int status) +{ + adxl34x_send_key_events(ac, pdata, status, true); + input_sync(ac->input); + adxl34x_send_key_events(ac, pdata, status, false); +} + +static irqreturn_t adxl34x_irq(int irq, void *handle) +{ + struct adxl34x *ac = handle; + struct adxl34x_platform_data *pdata = &ac->pdata; + int int_stat, tap_stat, samples, orient, orient_code; + + /* + * ACT_TAP_STATUS should be read before clearing the interrupt + * Avoid reading ACT_TAP_STATUS in case TAP detection is disabled + */ + + if (pdata->tap_axis_control & (TAP_X_EN | TAP_Y_EN | TAP_Z_EN)) + tap_stat = AC_READ(ac, ACT_TAP_STATUS); + else + tap_stat = 0; + + int_stat = AC_READ(ac, INT_SOURCE); + + if (int_stat & FREE_FALL) + adxl34x_report_key_single(ac->input, pdata->ev_code_ff); + + if (int_stat & OVERRUN) + dev_dbg(ac->dev, "OVERRUN\n"); + + if (int_stat & (SINGLE_TAP | DOUBLE_TAP)) { + adxl34x_do_tap(ac, pdata, tap_stat); + + if (int_stat & DOUBLE_TAP) + adxl34x_do_tap(ac, pdata, tap_stat); + } + + if (pdata->ev_code_act_inactivity) { + if (int_stat & ACTIVITY) + input_report_key(ac->input, + pdata->ev_code_act_inactivity, 1); + if (int_stat & INACTIVITY) + input_report_key(ac->input, + pdata->ev_code_act_inactivity, 0); + } + + /* + * ORIENTATION SENSING ADXL346 only + */ + if (pdata->orientation_enable) { + orient = AC_READ(ac, ORIENT); + if ((pdata->orientation_enable & ADXL_EN_ORIENTATION_2D) && + (orient & ADXL346_2D_VALID)) { + + orient_code = ADXL346_2D_ORIENT(orient); + /* Report orientation only when it changes */ + if (ac->orient2d_saved != orient_code) { + ac->orient2d_saved = orient_code; + adxl34x_report_key_single(ac->input, + pdata->ev_codes_orient_2d[orient_code]); + } + } + + if ((pdata->orientation_enable & ADXL_EN_ORIENTATION_3D) && + (orient & ADXL346_3D_VALID)) { + + orient_code = ADXL346_3D_ORIENT(orient) - 1; + /* Report orientation only when it changes */ + if (ac->orient3d_saved != orient_code) { + ac->orient3d_saved = orient_code; + adxl34x_report_key_single(ac->input, + pdata->ev_codes_orient_3d[orient_code]); + } + } + } + + if (int_stat & (DATA_READY | WATERMARK)) { + + if (pdata->fifo_mode) + samples = ENTRIES(AC_READ(ac, FIFO_STATUS)) + 1; + else + samples = 1; + + for (; samples > 0; samples--) { + adxl34x_service_ev_fifo(ac); + /* + * To ensure that the FIFO has + * completely popped, there must be at least 5 us between + * the end of reading the data registers, signified by the + * transition to register 0x38 from 0x37 or the CS pin + * going high, and the start of new reads of the FIFO or + * reading the FIFO_STATUS register. For SPI operation at + * 1.5 MHz or lower, the register addressing portion of the + * transmission is sufficient delay to ensure the FIFO has + * completely popped. It is necessary for SPI operation + * greater than 1.5 MHz to de-assert the CS pin to ensure a + * total of 5 us, which is at most 3.4 us at 5 MHz + * operation. + */ + if (ac->fifo_delay && (samples > 1)) + udelay(3); + } + } + + input_sync(ac->input); + + return IRQ_HANDLED; +} + +static void __adxl34x_disable(struct adxl34x *ac) +{ + /* + * A '0' places the ADXL34x into standby mode + * with minimum power consumption. + */ + AC_WRITE(ac, POWER_CTL, 0); +} + +static void __adxl34x_enable(struct adxl34x *ac) +{ + AC_WRITE(ac, POWER_CTL, ac->pdata.power_mode | PCTL_MEASURE); +} + +void adxl34x_suspend(struct adxl34x *ac) +{ + mutex_lock(&ac->mutex); + + if (!ac->suspended && !ac->disabled && ac->opened) + __adxl34x_disable(ac); + + ac->suspended = true; + + mutex_unlock(&ac->mutex); +} +EXPORT_SYMBOL_GPL(adxl34x_suspend); + +void adxl34x_resume(struct adxl34x *ac) +{ + mutex_lock(&ac->mutex); + + if (ac->suspended && !ac->disabled && ac->opened) + __adxl34x_enable(ac); + + ac->suspended = false; + + mutex_unlock(&ac->mutex); +} +EXPORT_SYMBOL_GPL(adxl34x_resume); + +static ssize_t adxl34x_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ac->disabled); +} + +static ssize_t adxl34x_disable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ac->mutex); + + if (!ac->suspended && ac->opened) { + if (val) { + if (!ac->disabled) + __adxl34x_disable(ac); + } else { + if (ac->disabled) + __adxl34x_enable(ac); + } + } + + ac->disabled = !!val; + + mutex_unlock(&ac->mutex); + + return count; +} + +static DEVICE_ATTR(disable, 0664, adxl34x_disable_show, adxl34x_disable_store); + +static ssize_t adxl34x_calibrate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + ssize_t count; + + mutex_lock(&ac->mutex); + count = sprintf(buf, "%d,%d,%d\n", + ac->hwcal.x * 4 + ac->swcal.x, + ac->hwcal.y * 4 + ac->swcal.y, + ac->hwcal.z * 4 + ac->swcal.z); + mutex_unlock(&ac->mutex); + + return count; +} + +static ssize_t adxl34x_calibrate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + + /* + * Hardware offset calibration has a resolution of 15.6 mg/LSB. + * We use HW calibration and handle the remaining bits in SW. (4mg/LSB) + */ + + mutex_lock(&ac->mutex); + ac->hwcal.x -= (ac->saved.x / 4); + ac->swcal.x = ac->saved.x % 4; + + ac->hwcal.y -= (ac->saved.y / 4); + ac->swcal.y = ac->saved.y % 4; + + ac->hwcal.z -= (ac->saved.z / 4); + ac->swcal.z = ac->saved.z % 4; + + AC_WRITE(ac, OFSX, (s8) ac->hwcal.x); + AC_WRITE(ac, OFSY, (s8) ac->hwcal.y); + AC_WRITE(ac, OFSZ, (s8) ac->hwcal.z); + mutex_unlock(&ac->mutex); + + return count; +} + +static DEVICE_ATTR(calibrate, 0664, + adxl34x_calibrate_show, adxl34x_calibrate_store); + +static ssize_t adxl34x_rate_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", RATE(ac->pdata.data_rate)); +} + +static ssize_t adxl34x_rate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + unsigned char val; + int error; + + error = kstrtou8(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ac->mutex); + + ac->pdata.data_rate = RATE(val); + AC_WRITE(ac, BW_RATE, + ac->pdata.data_rate | + (ac->pdata.low_power_mode ? LOW_POWER : 0)); + + mutex_unlock(&ac->mutex); + + return count; +} + +static DEVICE_ATTR(rate, 0664, adxl34x_rate_show, adxl34x_rate_store); + +static ssize_t adxl34x_autosleep_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", + ac->pdata.power_mode & (PCTL_AUTO_SLEEP | PCTL_LINK) ? 1 : 0); +} + +static ssize_t adxl34x_autosleep_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ac->mutex); + + if (val) + ac->pdata.power_mode |= (PCTL_AUTO_SLEEP | PCTL_LINK); + else + ac->pdata.power_mode &= ~(PCTL_AUTO_SLEEP | PCTL_LINK); + + if (!ac->disabled && !ac->suspended && ac->opened) + AC_WRITE(ac, POWER_CTL, ac->pdata.power_mode | PCTL_MEASURE); + + mutex_unlock(&ac->mutex); + + return count; +} + +static DEVICE_ATTR(autosleep, 0664, + adxl34x_autosleep_show, adxl34x_autosleep_store); + +static ssize_t adxl34x_position_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + ssize_t count; + + mutex_lock(&ac->mutex); + count = sprintf(buf, "(%d, %d, %d)\n", + ac->saved.x, ac->saved.y, ac->saved.z); + mutex_unlock(&ac->mutex); + + return count; +} + +static DEVICE_ATTR(position, S_IRUGO, adxl34x_position_show, NULL); + +#ifdef ADXL_DEBUG +static ssize_t adxl34x_write_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct adxl34x *ac = dev_get_drvdata(dev); + unsigned int val; + int error; + + /* + * This allows basic ADXL register write access for debug purposes. + */ + error = kstrtouint(buf, 16, &val); + if (error) + return error; + + mutex_lock(&ac->mutex); + AC_WRITE(ac, val >> 8, val & 0xFF); + mutex_unlock(&ac->mutex); + + return count; +} + +static DEVICE_ATTR(write, 0664, NULL, adxl34x_write_store); +#endif + +static struct attribute *adxl34x_attributes[] = { + &dev_attr_disable.attr, + &dev_attr_calibrate.attr, + &dev_attr_rate.attr, + &dev_attr_autosleep.attr, + &dev_attr_position.attr, +#ifdef ADXL_DEBUG + &dev_attr_write.attr, +#endif + NULL +}; + +static const struct attribute_group adxl34x_attr_group = { + .attrs = adxl34x_attributes, +}; + +static int adxl34x_input_open(struct input_dev *input) +{ + struct adxl34x *ac = input_get_drvdata(input); + + mutex_lock(&ac->mutex); + + if (!ac->suspended && !ac->disabled) + __adxl34x_enable(ac); + + ac->opened = true; + + mutex_unlock(&ac->mutex); + + return 0; +} + +static void adxl34x_input_close(struct input_dev *input) +{ + struct adxl34x *ac = input_get_drvdata(input); + + mutex_lock(&ac->mutex); + + if (!ac->suspended && !ac->disabled) + __adxl34x_disable(ac); + + ac->opened = false; + + mutex_unlock(&ac->mutex); +} + +struct adxl34x *adxl34x_probe(struct device *dev, int irq, + bool fifo_delay_default, + const struct adxl34x_bus_ops *bops) +{ + struct adxl34x *ac; + struct input_dev *input_dev; + const struct adxl34x_platform_data *pdata; + int err, range, i; + unsigned char revid; + + if (!irq) { + dev_err(dev, "no IRQ?\n"); + err = -ENODEV; + goto err_out; + } + + ac = kzalloc(sizeof(*ac), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ac || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + ac->fifo_delay = fifo_delay_default; + + pdata = dev->platform_data; + if (!pdata) { + dev_dbg(dev, + "No platform data: Using default initialization\n"); + pdata = &adxl34x_default_init; + } + + ac->pdata = *pdata; + pdata = &ac->pdata; + + ac->input = input_dev; + ac->dev = dev; + ac->irq = irq; + ac->bops = bops; + + mutex_init(&ac->mutex); + + input_dev->name = "ADXL34x accelerometer"; + revid = AC_READ(ac, DEVID); + + switch (revid) { + case ID_ADXL345: + ac->model = 345; + break; + case ID_ADXL346: + ac->model = 346; + break; + default: + dev_err(dev, "Failed to probe %s\n", input_dev->name); + err = -ENODEV; + goto err_free_mem; + } + + snprintf(ac->phys, sizeof(ac->phys), "%s/input0", dev_name(dev)); + + input_dev->phys = ac->phys; + input_dev->dev.parent = dev; + input_dev->id.product = ac->model; + input_dev->id.bustype = bops->bustype; + input_dev->open = adxl34x_input_open; + input_dev->close = adxl34x_input_close; + + input_set_drvdata(input_dev, ac); + + __set_bit(ac->pdata.ev_type, input_dev->evbit); + + if (ac->pdata.ev_type == EV_REL) { + __set_bit(REL_X, input_dev->relbit); + __set_bit(REL_Y, input_dev->relbit); + __set_bit(REL_Z, input_dev->relbit); + } else { + /* EV_ABS */ + __set_bit(ABS_X, input_dev->absbit); + __set_bit(ABS_Y, input_dev->absbit); + __set_bit(ABS_Z, input_dev->absbit); + + if (pdata->data_range & FULL_RES) + range = ADXL_FULLRES_MAX_VAL; /* Signed 13-bit */ + else + range = ADXL_FIXEDRES_MAX_VAL; /* Signed 10-bit */ + + input_set_abs_params(input_dev, ABS_X, -range, range, 3, 3); + input_set_abs_params(input_dev, ABS_Y, -range, range, 3, 3); + input_set_abs_params(input_dev, ABS_Z, -range, range, 3, 3); + } + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(pdata->ev_code_tap[ADXL_X_AXIS], input_dev->keybit); + __set_bit(pdata->ev_code_tap[ADXL_Y_AXIS], input_dev->keybit); + __set_bit(pdata->ev_code_tap[ADXL_Z_AXIS], input_dev->keybit); + + if (pdata->ev_code_ff) { + ac->int_mask = FREE_FALL; + __set_bit(pdata->ev_code_ff, input_dev->keybit); + } + + if (pdata->ev_code_act_inactivity) + __set_bit(pdata->ev_code_act_inactivity, input_dev->keybit); + + ac->int_mask |= ACTIVITY | INACTIVITY; + + if (pdata->watermark) { + ac->int_mask |= WATERMARK; + if (!FIFO_MODE(pdata->fifo_mode)) + ac->pdata.fifo_mode |= FIFO_STREAM; + } else { + ac->int_mask |= DATA_READY; + } + + if (pdata->tap_axis_control & (TAP_X_EN | TAP_Y_EN | TAP_Z_EN)) + ac->int_mask |= SINGLE_TAP | DOUBLE_TAP; + + if (FIFO_MODE(pdata->fifo_mode) == FIFO_BYPASS) + ac->fifo_delay = false; + + AC_WRITE(ac, POWER_CTL, 0); + + err = request_threaded_irq(ac->irq, NULL, adxl34x_irq, + IRQF_TRIGGER_HIGH | IRQF_ONESHOT, + dev_name(dev), ac); + if (err) { + dev_err(dev, "irq %d busy?\n", ac->irq); + goto err_free_mem; + } + + err = sysfs_create_group(&dev->kobj, &adxl34x_attr_group); + if (err) + goto err_free_irq; + + err = input_register_device(input_dev); + if (err) + goto err_remove_attr; + + AC_WRITE(ac, OFSX, pdata->x_axis_offset); + ac->hwcal.x = pdata->x_axis_offset; + AC_WRITE(ac, OFSY, pdata->y_axis_offset); + ac->hwcal.y = pdata->y_axis_offset; + AC_WRITE(ac, OFSZ, pdata->z_axis_offset); + ac->hwcal.z = pdata->z_axis_offset; + AC_WRITE(ac, THRESH_TAP, pdata->tap_threshold); + AC_WRITE(ac, DUR, pdata->tap_duration); + AC_WRITE(ac, LATENT, pdata->tap_latency); + AC_WRITE(ac, WINDOW, pdata->tap_window); + AC_WRITE(ac, THRESH_ACT, pdata->activity_threshold); + AC_WRITE(ac, THRESH_INACT, pdata->inactivity_threshold); + AC_WRITE(ac, TIME_INACT, pdata->inactivity_time); + AC_WRITE(ac, THRESH_FF, pdata->free_fall_threshold); + AC_WRITE(ac, TIME_FF, pdata->free_fall_time); + AC_WRITE(ac, TAP_AXES, pdata->tap_axis_control); + AC_WRITE(ac, ACT_INACT_CTL, pdata->act_axis_control); + AC_WRITE(ac, BW_RATE, RATE(ac->pdata.data_rate) | + (pdata->low_power_mode ? LOW_POWER : 0)); + AC_WRITE(ac, DATA_FORMAT, pdata->data_range); + AC_WRITE(ac, FIFO_CTL, FIFO_MODE(pdata->fifo_mode) | + SAMPLES(pdata->watermark)); + + if (pdata->use_int2) { + /* Map all INTs to INT2 */ + AC_WRITE(ac, INT_MAP, ac->int_mask | OVERRUN); + } else { + /* Map all INTs to INT1 */ + AC_WRITE(ac, INT_MAP, 0); + } + + if (ac->model == 346 && ac->pdata.orientation_enable) { + AC_WRITE(ac, ORIENT_CONF, + ORIENT_DEADZONE(ac->pdata.deadzone_angle) | + ORIENT_DIVISOR(ac->pdata.divisor_length)); + + ac->orient2d_saved = 1234; + ac->orient3d_saved = 1234; + + if (pdata->orientation_enable & ADXL_EN_ORIENTATION_3D) + for (i = 0; i < ARRAY_SIZE(pdata->ev_codes_orient_3d); i++) + __set_bit(pdata->ev_codes_orient_3d[i], + input_dev->keybit); + + if (pdata->orientation_enable & ADXL_EN_ORIENTATION_2D) + for (i = 0; i < ARRAY_SIZE(pdata->ev_codes_orient_2d); i++) + __set_bit(pdata->ev_codes_orient_2d[i], + input_dev->keybit); + } else { + ac->pdata.orientation_enable = 0; + } + + AC_WRITE(ac, INT_ENABLE, ac->int_mask | OVERRUN); + + ac->pdata.power_mode &= (PCTL_AUTO_SLEEP | PCTL_LINK); + + return ac; + + err_remove_attr: + sysfs_remove_group(&dev->kobj, &adxl34x_attr_group); + err_free_irq: + free_irq(ac->irq, ac); + err_free_mem: + input_free_device(input_dev); + kfree(ac); + err_out: + return ERR_PTR(err); +} +EXPORT_SYMBOL_GPL(adxl34x_probe); + +int adxl34x_remove(struct adxl34x *ac) +{ + sysfs_remove_group(&ac->dev->kobj, &adxl34x_attr_group); + free_irq(ac->irq, ac); + input_unregister_device(ac->input); + dev_dbg(ac->dev, "unregistered accelerometer\n"); + kfree(ac); + + return 0; +} +EXPORT_SYMBOL_GPL(adxl34x_remove); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("ADXL345/346 Three-Axis Digital Accelerometer Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/adxl34x.h b/drivers/input/misc/adxl34x.h new file mode 100644 index 00000000..bbbc80fd --- /dev/null +++ b/drivers/input/misc/adxl34x.h @@ -0,0 +1,30 @@ +/* + * ADXL345/346 Three-Axis Digital Accelerometers (I2C/SPI Interface) + * + * Enter bugs at http://blackfin.uclinux.org/ + * + * Copyright (C) 2009 Michael Hennerich, Analog Devices Inc. + * Licensed under the GPL-2 or later. + */ + +#ifndef _ADXL34X_H_ +#define _ADXL34X_H_ + +struct device; +struct adxl34x; + +struct adxl34x_bus_ops { + u16 bustype; + int (*read)(struct device *, unsigned char); + int (*read_block)(struct device *, unsigned char, int, void *); + int (*write)(struct device *, unsigned char, unsigned char); +}; + +void adxl34x_suspend(struct adxl34x *ac); +void adxl34x_resume(struct adxl34x *ac); +struct adxl34x *adxl34x_probe(struct device *dev, int irq, + bool fifo_delay_default, + const struct adxl34x_bus_ops *bops); +int adxl34x_remove(struct adxl34x *ac); + +#endif diff --git a/drivers/input/misc/al3006_pls.c b/drivers/input/misc/al3006_pls.c new file mode 100644 index 00000000..8d72a055 --- /dev/null +++ b/drivers/input/misc/al3006_pls.c @@ -0,0 +1,838 @@ +/* + * File: al3006_pls.c + * Based on: + * Author: Yunlong Wang + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#include +#include +#include +#include + +static struct i2c_client *this_client; +static atomic_t p_flag; +static atomic_t l_flag; +static int al3006_pls_opened=0; + +/*0: sleep out; 1: sleep in*/ +static unsigned char suspend_flag=0; + + +static ssize_t al3006_pls_show_suspend(struct device* cd,struct device_attribute *attr, char* buf); +static ssize_t al3006_pls_store_suspend(struct device* cd, struct device_attribute *attr,const char* buf, size_t len); +static ssize_t al3006_pls_show_version(struct device* cd,struct device_attribute *attr, char* buf); +#ifdef CONFIG_HAS_EARLYSUSPEND +static void al3006_pls_early_suspend(struct early_suspend *handler); +static void al3006_pls_early_resume(struct early_suspend *handler); +#endif +static int al3006_pls_write_data(unsigned char addr, unsigned char data); +static int al3006_pls_read_data(unsigned char addr, unsigned char *data); +static int al3006_pls_enable(SENSOR_TYPE type); +static int al3006_pls_disable(SENSOR_TYPE type); +static void al3006_pls_report_init(void); + +static int al3006_pls_adc2lux[64]={ + 1, 1, 1, 2, 2, 2, 3, 4, + 4, 5, 6, 7, 9, 11, 13, 16, + 19, 22, 27, 32, 39, 46, 56, 67, + 80, 96, 116, 139, 167, 200, 240, 289, + 346, 416, 499, 599, 720, 864, 1037, 1245, + 1495, 1795, 2154, 2586, 3105, 3728, 4475, 5372, + 6449, 7743, 9295, 11159, 13396, 16082, 19307, 23178, + 27862, 33405, 40103, 48144, 57797, 69386, 83298, 100000 +}; + + +static DEVICE_ATTR(suspend, S_IRUGO | S_IWUSR, al3006_pls_show_suspend, al3006_pls_store_suspend); +static DEVICE_ATTR(version, S_IRUGO | S_IWUSR, al3006_pls_show_version, NULL); + +static ssize_t al3006_pls_show_suspend(struct device* cd, + struct device_attribute *attr, char* buf) +{ + ssize_t ret = 0; + + if(suspend_flag==1) + sprintf(buf, "AL3006 Resume\n"); + else + sprintf(buf, "AL3006 Suspend\n"); + + ret = strlen(buf) + 1; + + return ret; +} + +static ssize_t al3006_pls_store_suspend(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + suspend_flag = on_off; + + if(on_off==1) + { + printk(KERN_INFO "AL3006 Entry Resume\n"); + al3006_pls_enable(AL3006_PLS_BOTH); + } + else + { + printk(KERN_INFO "AL3006 Entry Suspend\n"); + al3006_pls_disable(AL3006_PLS_BOTH); + } + + return len; +} + +static ssize_t al3006_pls_show_version(struct device* cd, + struct device_attribute *attr, char* buf) +{ + ssize_t ret = 0; + + sprintf(buf, "AL3006"); + ret = strlen(buf) + 1; + + return ret; +} + +static int al3006_pls_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + PLS_DBG("%s", __func__); + + err = device_create_file(dev, &dev_attr_suspend); + err = device_create_file(dev, &dev_attr_version); + + return err; +} + +/******************************************************************************* +* Function : al3006_pls_enable +* Description : type: proximity / light +*******************************************************************************/ +static int al3006_pls_enable(SENSOR_TYPE type) +{ + unsigned char config; + + al3006_pls_read_data(AL3006_PLS_REG_CONFIG, &config); + + PLS_DBG("%s: type=%d; config=0x%x", __func__, type, config); + + switch(type) { + case AL3006_PLS_ALPS: + if(config == AL3006_PLS_PXY_ACTIVE) + type = AL3006_PLS_BOTH; + break; + case AL3006_PLS_PXY: + if(config == AL3006_PLS_ALPS_ACTIVE) + type = AL3006_PLS_BOTH; + break; + case AL3006_PLS_BOTH: + break; + } + + PLS_DBG("%s: after type=%d\n",__func__, type); + + switch(type) { + case AL3006_PLS_ALPS: + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_ALPS_ACTIVE); + break; + case AL3006_PLS_PXY: + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_PXY_ACTIVE); + al3006_pls_report_init(); + break; + case AL3006_PLS_BOTH: + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_BOTH_ACTIVE); + al3006_pls_report_init(); + break; + default: + break; + } + + return 0; +} + +/******************************************************************************* +* Function : al3006_pls_disable +* Description : type: proximity / light +*******************************************************************************/ +static int al3006_pls_disable(SENSOR_TYPE type) +{ + int pxy_flag, apls_flag; + + PLS_DBG("%s: type=%d", __func__, type); + + switch(type) { + case AL3006_PLS_ALPS: + pxy_flag = atomic_read(&p_flag); + /*check proximiy sensor status*/ + if(pxy_flag == 0) { + PLS_DBG("%s: Disable both sensor for pxy_flag=%d", __func__, pxy_flag); + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_BOTH_DEACTIVE); + } else { + PLS_DBG("%s: Only Proximity Sensor alive", __func__); + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_PXY_ACTIVE); + } + + break; + case AL3006_PLS_PXY: + apls_flag = atomic_read(&l_flag); + /*check light sensor status*/ + if(apls_flag == 0) { + PLS_DBG("%s: Disable both sensor for apls_flag=%d", __func__, apls_flag); + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_BOTH_DEACTIVE); + } else { + PLS_DBG("%s: Only Light Sensor alive", __func__); + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_ALPS_ACTIVE); + } + break; + case AL3006_PLS_BOTH: + PLS_DBG("%s: Disable both sensors", __func__); + al3006_pls_write_data(AL3006_PLS_REG_CONFIG, AL3006_PLS_BOTH_DEACTIVE); + break; + default: + break; + } + + return 0; +} + +static int al3006_pls_open(struct inode *inode, struct file *file) +{ + PLS_DBG("%s\n", __func__); + if (al3006_pls_opened) + return -EBUSY; + al3006_pls_opened = 1; + return 0; +} + +static int al3006_pls_release(struct inode *inode, struct file *file) +{ + PLS_DBG("%s", __func__); + al3006_pls_opened = 0; + return al3006_pls_disable(AL3006_PLS_BOTH); +} + + +/******************************************************************************* +* Function : al3006_pls_ioctl +* Description : ioctl interface to control the sensor +*******************************************************************************/ +static long al3006_pls_ioctl(struct file *file, unsigned int cmd,unsigned long arg) +{ + void __user *argp = (void __user *)arg; + int flag; + unsigned char data; + + PLS_DBG("%s: cmd %d", __func__, _IOC_NR(cmd)); + + /*get ioctl parameter*/ + switch (cmd) { + case LTR_IOCTL_SET_PFLAG: + case LTR_IOCTL_SET_LFLAG: + if (copy_from_user(&flag, argp, sizeof(flag))) { + return -EFAULT; + } + if (flag < 0 || flag > 1) { + return -EINVAL; + } + PLS_DBG("%s: set flag=%d", __func__, flag); + break; + default: + break; + } + + /*handle ioctl*/ + switch (cmd) { + case LTR_IOCTL_GET_PFLAG: + flag = atomic_read(&p_flag); + break; + + case LTR_IOCTL_GET_LFLAG: + flag = atomic_read(&l_flag); + break; + + case LTR_IOCTL_GET_DATA: + break; + + case LTR_IOCTL_SET_PFLAG: + atomic_set(&p_flag, flag); + if(flag==1){ + al3006_pls_enable(AL3006_PLS_PXY); + } + else if(flag==0) { + al3006_pls_disable(AL3006_PLS_PXY); + } + break; + + case LTR_IOCTL_SET_LFLAG: + atomic_set(&l_flag, flag); + if(flag==1){ + al3006_pls_enable(AL3006_PLS_ALPS); + } + else if(flag==0) { + al3006_pls_disable(AL3006_PLS_ALPS); + } + break; + + default: + pr_err("%s: invalid cmd %d\n", __func__, _IOC_NR(cmd)); + return -EINVAL; + } + + /*report ioctl*/ + switch (cmd) { + case LTR_IOCTL_GET_PFLAG: + case LTR_IOCTL_GET_LFLAG: + if (copy_to_user(argp, &flag, sizeof(flag))) { + return -EFAULT; + } + PLS_DBG("%s: get flag=%d", __func__, flag); + break; + + case LTR_IOCTL_GET_DATA: + al3006_pls_read_data(AL3006_PLS_REG_DATA,&data); + if (copy_to_user(argp, &data, sizeof(data))) { + return -EFAULT; + } + PLS_DBG("%s: get data=%d", __func__, flag); + break; + + default: + break; + } + + return 0; + +} + + +static struct file_operations al3006_pls_fops = { + .owner = THIS_MODULE, + .open = al3006_pls_open, + .release = al3006_pls_release, + .unlocked_ioctl = al3006_pls_ioctl, +}; + +static struct miscdevice al3006_pls_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = AL3006_PLS_DEVICE, + .fops = &al3006_pls_fops, +}; + +/******************************************************************************* +* Function : al3006_pls_rx_data +* Description : read data from i2c +* Parameters : buf: content, len: length +*******************************************************************************/ +static int al3006_pls_rx_data(char *buf, int len) +{ + int ret; + + struct i2c_msg msgs[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = 1, + .buf = buf, + }, + { + .addr = this_client->addr, + .flags = I2C_M_RD, + .len = len, + .buf = buf, + } + }; + + ret = i2c_transfer(this_client->adapter, msgs, 2); + if (ret < 0) + printk(KERN_ERR "%s i2c read error: %d\n", __func__, ret); + + + return ret; +} + +/******************************************************************************* +* Function : al3006_pls_tx_data +* Description : send data to i2c +* Parameters : buf: content, len: length +*******************************************************************************/ +static int al3006_pls_tx_data(char *buf, int len) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = len, + .buf = buf, + } + }; + + ret = i2c_transfer(this_client->adapter, msg, 1); + if (ret < 0) + printk(KERN_ERR "%s i2c write error: %d\n", __func__, ret); + + return ret; +} + +/******************************************************************************* +* Function : al3006_pls_write_data +* Description : write data to IC +* Parameters : addr: register address, data: register data +*******************************************************************************/ +static int al3006_pls_write_data(unsigned char addr, unsigned char data) +{ + unsigned char buf[2]; + buf[0]=addr; + buf[1]=data; + return al3006_pls_tx_data(buf, 2); +} + +/******************************************************************************* +* Function : al3006_pls_read_data +* Description : read data from IC +* Parameters : addr: register address, data: read data +*******************************************************************************/ +static int al3006_pls_read_data(unsigned char addr, unsigned char *data) +{ + int ret; + unsigned char buf; + + buf=addr; + ret = al3006_pls_rx_data(&buf, 1); + *data = buf; + + return ret;; +} + +#if PLS_DEBUG +static void al3006_pls_reg_dump(void) +{ + unsigned char config,time_ctrl,dls_ctrl,int_status,dps_ctrl,data,dls_win; + al3006_pls_read_data(AL3006_PLS_REG_CONFIG,&config); + al3006_pls_read_data(AL3006_PLS_REG_TIME_CTRL,&time_ctrl); + al3006_pls_read_data(AL3006_PLS_REG_DLS_CTRL,&dls_ctrl); + al3006_pls_read_data(AL3006_PLS_REG_INT_STATUS,&int_status); + al3006_pls_read_data(AL3006_PLS_REG_DPS_CTRL,&dps_ctrl); + al3006_pls_read_data(AL3006_PLS_REG_DATA,&data); + al3006_pls_read_data(AL3006_PLS_REG_DLS_WIN,&dls_win); + + PLS_DBG("%s: config=0x%x,time_ctrl=0x%x,dls_ctrl=0x%x,int_status=0x%x,dps_ctrl=0x%x,data=0x%x,dls_win=0x%x", \ + __func__, config,time_ctrl,dls_ctrl,int_status,dps_ctrl,data,dls_win); +} +#endif + +/******************************************************************************* +* Function : al3006_pls_reg_init +* Description : set al3006 registers +* Parameters : none +* Return : void +*******************************************************************************/ +static int al3006_pls_reg_init(void) +{ + int ret=0; + + /*set window loss*/ + if(al3006_pls_write_data(AL3006_PLS_REG_DLS_WIN,0x0D)<0) { + printk(KERN_ERR "%s: I2C Write Reg %x Failed\n", __func__, AL3006_PLS_REG_DLS_WIN); + ret = -1; + } + + /*set time control*/ + if(al3006_pls_write_data(AL3006_PLS_REG_TIME_CTRL,0x1)<0) { + printk(KERN_ERR "%s: I2C Write Reg %x Failed\n", __func__, AL3006_PLS_REG_TIME_CTRL); + ret = -1; + } + + /*set alps level*/ +#if defined(AL3006_PLS_ADC_LEVEL64) + al3006_pls_write_data(AL3006_PLS_REG_DLS_CTRL,0xA0); +#elif defined(AL3006_PLS_ADC_LEVEL9) + al3006_pls_write_data(AL3006_PLS_REG_DLS_CTRL,0x40); +#elif defined(AL3006_PLS_ADC_LEVEL5) + al3006_pls_write_data(AL3006_PLS_REG_DLS_CTRL,0x20); +#endif + + /*set dps distance*/ + if(al3006_pls_write_data(AL3006_PLS_REG_DPS_CTRL,0x10)<0) { + printk(KERN_ERR "%s: I2C Write Reg %x Failed\n", __func__, AL3006_PLS_REG_DPS_CTRL); + ret = -1; + } + + /*enter power down mode*/ + if(al3006_pls_write_data(AL3006_PLS_REG_CONFIG,AL3006_PLS_BOTH_DEACTIVE)<0) { + printk(KERN_ERR "%s: I2C Write Reg %x Failed\n", __func__, AL3006_PLS_BOTH_DEACTIVE); + ret = -1; + } + +#if PLS_DEBUG + al3006_pls_reg_dump(); +#endif + + return ret; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +/******************************************************************************* +* Function : al3006_pls_early_suspend +* Description : cancel the delayed work and put ts to shutdown mode +* Parameters : handler +* Return : none +*******************************************************************************/ +static void al3006_pls_early_suspend(struct early_suspend *handler) +{ + PLS_DBG("%s\n", __func__); +#if 0 + al3006_pls_disable(AL3006_PLS_BOTH); +#endif +} + +/******************************************************************************* +* Function : al3006_pls_early_resume +* Description : ts re-entry the normal mode and schedule the work, there need to be a litte time + for ts ready +* Parameters : handler +* Return : none +*******************************************************************************/ +static void al3006_pls_early_resume(struct early_suspend *handler) +{ + PLS_DBG("%s\n", __func__); +#if 0 + al3006_pls_enable(AL3006_PLS_BOTH); +#endif +} +#endif + +static void al3006_pls_report_init(void) +{ + al3006_pls_struct *al3006_pls = (al3006_pls_struct *)i2c_get_clientdata(this_client); + PLS_DBG("%s\n",__func__); + /*report far*/ + input_report_abs(al3006_pls->input, ABS_DISTANCE, 1); + input_sync(al3006_pls->input); +} + +/******************************************************************************* +* Function : al3006_pls_report_dps +* Description : reg data,input dev +* Parameters : report proximity sensor data to input system +* Return : none +*******************************************************************************/ +static void al3006_pls_report_dps(unsigned char data, struct input_dev *input) +{ + unsigned char dps_data = (data&0x80)>>7; + + dps_data = (dps_data==1) ? 0: 1; + PLS_DBG("%s: proximity=%d", __func__, dps_data); + + input_report_abs(input, ABS_DISTANCE, dps_data); + input_sync(input); +} + +/******************************************************************************* +* Function : al3006_pls_report_dls +* Description : reg data,input dev +* Parameters : report light sensor data to input system +* Return : none +*******************************************************************************/ +static void al3006_pls_report_dls(unsigned char data, struct input_dev *input) +{ + int lux; + unsigned char adc = data&0x3f; + +#if defined(AL3006_PLS_ADC_LEVEL9) + adc = adc<<3; +#elif defined(AL3006_PLS_ADC_LEVEL5) + adc = adc<<4; +#endif + + lux = al3006_pls_adc2lux[adc]; + PLS_DBG("%s: adc=%d, lux=%d", __func__, adc, lux); + input_report_abs(input, ABS_MISC, lux); + input_sync(input); +} + +/******************************************************************************* +* Function : al3006_pls_work +* Description : handler current data and report coordinate +* Parameters : work +* Return : none +*******************************************************************************/ + +static void al3006_pls_work(struct work_struct *work) +{ + unsigned char int_status, data, enable; + al3006_pls_struct *pls = container_of(work, al3006_pls_struct, work); + + al3006_pls_read_data(AL3006_PLS_REG_CONFIG,&enable); + al3006_pls_read_data(AL3006_PLS_REG_INT_STATUS,&int_status); + al3006_pls_read_data(AL3006_PLS_REG_DATA,&data); + + PLS_DBG("\033[33;1m %s: enable=0x%x; int_status=0x%x; data=0x%x \033[m",\ + __func__, enable, int_status, data); + + switch(int_status & AL3006_PLS_INT_MASK) { + case AL3006_PLS_DPS_INT: + al3006_pls_report_dps(data, pls->input); + break; + + case AL3006_PLS_DLS_INT: + al3006_pls_report_dls(data, pls->input); + break; + + case AL3006_PLS_INT_MASK: + al3006_pls_report_dps(data, pls->input); + al3006_pls_report_dls(data, pls->input); + break; + + default: + break; + } + + enable_irq(pls->client->irq); + +} + + +/******************************************************************************* +* Function : al3006_pls_irq_handler +* Description : handle ts irq +* Parameters : handler +* Return : none +*******************************************************************************/ +static irqreturn_t al3006_pls_irq_handler(int irq, void *dev_id) +{ + al3006_pls_struct *pls = (al3006_pls_struct *)dev_id; + + disable_irq_nosync(pls->client->irq); + queue_work(pls->ltr_work_queue,&pls->work); + return IRQ_HANDLED; +} + +static void al3006_pls_pininit(int irq_pin) +{ + printk(KERN_INFO "%s [irq=%d]\n",__func__,irq_pin); + gpio_request(irq_pin, AL3006_PLS_IRQ_PIN); +} + + +static int al3006_pls_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + + int err = 0; + struct al3006_pls_platform_data *pdata = client->dev.platform_data; + struct input_dev *input_dev; + al3006_pls_struct *al3006_pls; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk("%s: functionality check failed\n", __func__); + err = -ENODEV; + goto exit_check_functionality_failed; + } + + al3006_pls = kzalloc(sizeof(al3006_pls_struct), GFP_KERNEL); + if (!al3006_pls) + { + printk("%s: request memory failed\n", __func__); + err= -ENOMEM; + goto exit_request_memory_failed; + } + + this_client = client; + al3006_pls->client = client; + i2c_set_clientdata(client, al3006_pls); + + /*pin init*/ + al3006_pls_pininit(pdata->irq_gpio_number); + + /*get irq*/ + client->irq = gpio_to_irq(pdata->irq_gpio_number); + al3006_pls->irq = client->irq; + + PLS_DBG("I2C name=%s, addr=0x%x, gpio=%d, irq=%d",client->name,client->addr, \ + pdata->irq_gpio_number, client->irq); + + /*init AL3006_PLS*/ + if(al3006_pls_reg_init()<0) + { + printk(KERN_ERR "%s: device init failed\n", __func__); + err=-1; + goto exit_device_init_failed; + } + + /*register device*/ + err = misc_register(&al3006_pls_device); + if (err) { + printk(KERN_ERR "%s: al3006_pls_device register failed\n", __func__); + goto exit_device_register_failed; + } + + + /* register input device*/ + input_dev = input_allocate_device(); + if (!input_dev) + { + printk(KERN_ERR "%s: input allocate device failed\n", __func__); + err = -ENOMEM; + goto exit_input_dev_allocate_failed; + } + + al3006_pls->input = input_dev; + + input_dev->name = AL3006_PLS_INPUT_DEV; + input_dev->phys = AL3006_PLS_INPUT_DEV; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0010; + + __set_bit(EV_ABS, input_dev->evbit); + /*for proximity*/ + input_set_abs_params(input_dev, ABS_DISTANCE, 0, 1, 0, 0); + /*for lightsensor*/ + input_set_abs_params(input_dev, ABS_MISC, 0, 100001, 0, 0); + + err = input_register_device(input_dev); + if (err < 0) + { + printk(KERN_ERR "%s: input device regist failed\n", __func__); + goto exit_input_register_failed; + } + + /*create work queue*/ + INIT_WORK(&al3006_pls->work, al3006_pls_work); + al3006_pls->ltr_work_queue= create_singlethread_workqueue(AL3006_PLS_DEVICE); + +#ifdef CONFIG_HAS_EARLYSUSPEND + /*register early suspend*/ + al3006_pls->ltr_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + al3006_pls->ltr_early_suspend.suspend = al3006_pls_early_suspend; + al3006_pls->ltr_early_suspend.resume = al3006_pls_early_resume; + register_early_suspend(&al3006_pls->ltr_early_suspend); +#endif + + if(client->irq > 0) + { + err = request_irq(client->irq, al3006_pls_irq_handler, IRQ_TYPE_LEVEL_LOW, client->name,al3006_pls); + if (err <0) + { + printk(KERN_ERR "%s: IRQ setup failed %d\n", __func__, err); + goto irq_request_err; + } + } + + /*create attribute files*/ + al3006_pls_create_sysfs(client); + + + printk(KERN_INFO "%s: Probe Success!\n",__func__); + + return 0; + +irq_request_err: +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&al3006_pls->ltr_early_suspend); +#endif + destroy_workqueue(al3006_pls->ltr_work_queue); +exit_input_register_failed: + input_free_device(input_dev); + misc_deregister(&al3006_pls_device); +exit_device_register_failed: +exit_input_dev_allocate_failed: +exit_device_init_failed: + kfree(al3006_pls); +exit_request_memory_failed: +exit_check_functionality_failed: + printk(KERN_ERR "%s: Probe Fail!\n",__func__); + return err; + +} + +static int al3006_pls_remove(struct i2c_client *client) +{ + al3006_pls_struct *al3006_pls = i2c_get_clientdata(client); + + PLS_DBG("%s", __func__); + + /*remove queue*/ + flush_workqueue(al3006_pls->ltr_work_queue); + destroy_workqueue(al3006_pls->ltr_work_queue); + +#ifdef CONFIG_HAS_EARLYSUSPEND + /*free suspend*/ + unregister_early_suspend(&al3006_pls->ltr_early_suspend); +#endif + misc_deregister(&al3006_pls_device); + /*free input*/ + input_unregister_device(al3006_pls->input); + input_free_device(al3006_pls->input); + /*free irq*/ + free_irq(al3006_pls->client->irq, al3006_pls); + /*free malloc*/ + kfree(al3006_pls); + + return 0; +} + +static const struct i2c_device_id al3006_pls_id[] = { + { AL3006_PLS_DEVICE, 0 }, + { } +}; +/*----------------------------------------------------------------------------*/ +static struct i2c_driver al3006_pls_driver = { + .driver = { + .owner = THIS_MODULE, + .name = AL3006_PLS_DEVICE, + }, + .probe = al3006_pls_probe, + .remove = al3006_pls_remove, + .id_table = al3006_pls_id, +}; +/*----------------------------------------------------------------------------*/ + +static int __init al3006_pls_init(void) +{ + PLS_DBG("%s", __func__); + return i2c_add_driver(&al3006_pls_driver); +} + +static void __exit al3006_pls_exit(void) +{ + PLS_DBG("%s", __func__); + i2c_del_driver(&al3006_pls_driver); +} + +module_init(al3006_pls_init); +module_exit(al3006_pls_exit); + + +MODULE_AUTHOR("Yunlong Wang "); +MODULE_DESCRIPTION("Proximity&Light Sensor AL3006 DRIVER"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/misc/apanel.c b/drivers/input/misc/apanel.c new file mode 100644 index 00000000..a8d2b8db --- /dev/null +++ b/drivers/input/misc/apanel.c @@ -0,0 +1,350 @@ +/* + * Fujitsu Lifebook Application Panel button drive + * + * Copyright (C) 2007 Stephen Hemminger + * Copyright (C) 2001-2003 Jochen Eisinger + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * Many Fujitsu Lifebook laptops have a small panel of buttons that are + * accessible via the i2c/smbus interface. This driver polls those + * buttons and generates input events. + * + * For more details see: + * http://apanel.sourceforge.net/tech.php + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define APANEL_NAME "Fujitsu Application Panel" +#define APANEL_VERSION "1.3.1" +#define APANEL "apanel" + +/* How often we poll keys - msecs */ +#define POLL_INTERVAL_DEFAULT 1000 + +/* Magic constants in BIOS that tell about buttons */ +enum apanel_devid { + APANEL_DEV_NONE = 0, + APANEL_DEV_APPBTN = 1, + APANEL_DEV_CDBTN = 2, + APANEL_DEV_LCD = 3, + APANEL_DEV_LED = 4, + + APANEL_DEV_MAX, +}; + +enum apanel_chip { + CHIP_NONE = 0, + CHIP_OZ992C = 1, + CHIP_OZ163T = 2, + CHIP_OZ711M3 = 4, +}; + +/* Result of BIOS snooping/probing -- what features are supported */ +static enum apanel_chip device_chip[APANEL_DEV_MAX]; + +#define MAX_PANEL_KEYS 12 + +struct apanel { + struct input_polled_dev *ipdev; + struct i2c_client *client; + unsigned short keymap[MAX_PANEL_KEYS]; + u16 nkeys; + u16 led_bits; + struct work_struct led_work; + struct led_classdev mail_led; +}; + + +static int apanel_probe(struct i2c_client *, const struct i2c_device_id *); + +static void report_key(struct input_dev *input, unsigned keycode) +{ + pr_debug(APANEL ": report key %#x\n", keycode); + input_report_key(input, keycode, 1); + input_sync(input); + + input_report_key(input, keycode, 0); + input_sync(input); +} + +/* Poll for key changes + * + * Read Application keys via SMI + * A (0x4), B (0x8), Internet (0x2), Email (0x1). + * + * CD keys: + * Forward (0x100), Rewind (0x200), Stop (0x400), Pause (0x800) + */ +static void apanel_poll(struct input_polled_dev *ipdev) +{ + struct apanel *ap = ipdev->private; + struct input_dev *idev = ipdev->input; + u8 cmd = device_chip[APANEL_DEV_APPBTN] == CHIP_OZ992C ? 0 : 8; + s32 data; + int i; + + data = i2c_smbus_read_word_data(ap->client, cmd); + if (data < 0) + return; /* ignore errors (due to ACPI??) */ + + /* write back to clear latch */ + i2c_smbus_write_word_data(ap->client, cmd, 0); + + if (!data) + return; + + dev_dbg(&idev->dev, APANEL ": data %#x\n", data); + for (i = 0; i < idev->keycodemax; i++) + if ((1u << i) & data) + report_key(idev, ap->keymap[i]); +} + +/* Track state changes of LED */ +static void led_update(struct work_struct *work) +{ + struct apanel *ap = container_of(work, struct apanel, led_work); + + i2c_smbus_write_word_data(ap->client, 0x10, ap->led_bits); +} + +static void mail_led_set(struct led_classdev *led, + enum led_brightness value) +{ + struct apanel *ap = container_of(led, struct apanel, mail_led); + + if (value != LED_OFF) + ap->led_bits |= 0x8000; + else + ap->led_bits &= ~0x8000; + + schedule_work(&ap->led_work); +} + +static int apanel_remove(struct i2c_client *client) +{ + struct apanel *ap = i2c_get_clientdata(client); + + if (device_chip[APANEL_DEV_LED] != CHIP_NONE) + led_classdev_unregister(&ap->mail_led); + + input_unregister_polled_device(ap->ipdev); + input_free_polled_device(ap->ipdev); + + return 0; +} + +static void apanel_shutdown(struct i2c_client *client) +{ + apanel_remove(client); +} + +static const struct i2c_device_id apanel_id[] = { + { "fujitsu_apanel", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, apanel_id); + +static struct i2c_driver apanel_driver = { + .driver = { + .name = APANEL, + }, + .probe = &apanel_probe, + .remove = &apanel_remove, + .shutdown = &apanel_shutdown, + .id_table = apanel_id, +}; + +static struct apanel apanel = { + .keymap = { + [0] = KEY_MAIL, + [1] = KEY_WWW, + [2] = KEY_PROG2, + [3] = KEY_PROG1, + + [8] = KEY_FORWARD, + [9] = KEY_REWIND, + [10] = KEY_STOPCD, + [11] = KEY_PLAYPAUSE, + + }, + .mail_led = { + .name = "mail:blue", + .brightness_set = mail_led_set, + }, +}; + +/* NB: Only one panel on the i2c. */ +static int apanel_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct apanel *ap; + struct input_polled_dev *ipdev; + struct input_dev *idev; + u8 cmd = device_chip[APANEL_DEV_APPBTN] == CHIP_OZ992C ? 0 : 8; + int i, err = -ENOMEM; + + ap = &apanel; + + ipdev = input_allocate_polled_device(); + if (!ipdev) + goto out1; + + ap->ipdev = ipdev; + ap->client = client; + + i2c_set_clientdata(client, ap); + + err = i2c_smbus_write_word_data(client, cmd, 0); + if (err) { + dev_warn(&client->dev, APANEL ": smbus write error %d\n", + err); + goto out3; + } + + ipdev->poll = apanel_poll; + ipdev->poll_interval = POLL_INTERVAL_DEFAULT; + ipdev->private = ap; + + idev = ipdev->input; + idev->name = APANEL_NAME " buttons"; + idev->phys = "apanel/input0"; + idev->id.bustype = BUS_HOST; + idev->dev.parent = &client->dev; + + set_bit(EV_KEY, idev->evbit); + + idev->keycode = ap->keymap; + idev->keycodesize = sizeof(ap->keymap[0]); + idev->keycodemax = (device_chip[APANEL_DEV_CDBTN] != CHIP_NONE) ? 12 : 4; + + for (i = 0; i < idev->keycodemax; i++) + if (ap->keymap[i]) + set_bit(ap->keymap[i], idev->keybit); + + err = input_register_polled_device(ipdev); + if (err) + goto out3; + + INIT_WORK(&ap->led_work, led_update); + if (device_chip[APANEL_DEV_LED] != CHIP_NONE) { + err = led_classdev_register(&client->dev, &ap->mail_led); + if (err) + goto out4; + } + + return 0; +out4: + input_unregister_polled_device(ipdev); +out3: + input_free_polled_device(ipdev); +out1: + return err; +} + +/* Scan the system ROM for the signature "FJKEYINF" */ +static __init const void __iomem *bios_signature(const void __iomem *bios) +{ + ssize_t offset; + const unsigned char signature[] = "FJKEYINF"; + + for (offset = 0; offset < 0x10000; offset += 0x10) { + if (check_signature(bios + offset, signature, + sizeof(signature)-1)) + return bios + offset; + } + pr_notice(APANEL ": Fujitsu BIOS signature '%s' not found...\n", + signature); + return NULL; +} + +static int __init apanel_init(void) +{ + void __iomem *bios; + const void __iomem *p; + u8 devno; + unsigned char i2c_addr; + int found = 0; + + bios = ioremap(0xF0000, 0x10000); /* Can't fail */ + + p = bios_signature(bios); + if (!p) { + iounmap(bios); + return -ENODEV; + } + + /* just use the first address */ + p += 8; + i2c_addr = readb(p + 3) >> 1; + + for ( ; (devno = readb(p)) & 0x7f; p += 4) { + unsigned char method, slave, chip; + + method = readb(p + 1); + chip = readb(p + 2); + slave = readb(p + 3) >> 1; + + if (slave != i2c_addr) { + pr_notice(APANEL ": only one SMBus slave " + "address supported, skiping device...\n"); + continue; + } + + /* translate alternative device numbers */ + switch (devno) { + case 6: + devno = APANEL_DEV_APPBTN; + break; + case 7: + devno = APANEL_DEV_LED; + break; + } + + if (devno >= APANEL_DEV_MAX) + pr_notice(APANEL ": unknown device %u found\n", devno); + else if (device_chip[devno] != CHIP_NONE) + pr_warning(APANEL ": duplicate entry for devno %u\n", devno); + + else if (method != 1 && method != 2 && method != 4) { + pr_notice(APANEL ": unknown method %u for devno %u\n", + method, devno); + } else { + device_chip[devno] = (enum apanel_chip) chip; + ++found; + } + } + iounmap(bios); + + if (found == 0) { + pr_info(APANEL ": no input devices reported by BIOS\n"); + return -EIO; + } + + return i2c_add_driver(&apanel_driver); +} +module_init(apanel_init); + +static void __exit apanel_cleanup(void) +{ + i2c_del_driver(&apanel_driver); +} +module_exit(apanel_cleanup); + +MODULE_AUTHOR("Stephen Hemminger "); +MODULE_DESCRIPTION(APANEL_NAME " driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(APANEL_VERSION); + +MODULE_ALIAS("dmi:*:svnFUJITSU:pnLifeBook*:pvr*:rvnFUJITSU:*"); +MODULE_ALIAS("dmi:*:svnFUJITSU:pnLifebook*:pvr*:rvnFUJITSU:*"); diff --git a/drivers/input/misc/arizona-haptics.c b/drivers/input/misc/arizona-haptics.c new file mode 100644 index 00000000..e7e12a5f --- /dev/null +++ b/drivers/input/misc/arizona-haptics.c @@ -0,0 +1,252 @@ +/* + * Arizona haptics driver + * + * Copyright 2012 Wolfson Microelectronics plc + * + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +struct arizona_haptics { + struct arizona *arizona; + struct input_dev *input_dev; + struct work_struct work; + + struct mutex mutex; + u8 intensity; +}; + +static void arizona_haptics_work(struct work_struct *work) +{ + struct arizona_haptics *haptics = container_of(work, + struct arizona_haptics, + work); + struct arizona *arizona = haptics->arizona; + struct mutex *dapm_mutex = &arizona->dapm->card->dapm_mutex; + int ret; + + if (!haptics->arizona->dapm) { + dev_err(arizona->dev, "No DAPM context\n"); + return; + } + + if (haptics->intensity) { + ret = regmap_update_bits(arizona->regmap, + ARIZONA_HAPTICS_PHASE_2_INTENSITY, + ARIZONA_PHASE2_INTENSITY_MASK, + haptics->intensity); + if (ret != 0) { + dev_err(arizona->dev, "Failed to set intensity: %d\n", + ret); + return; + } + + /* This enable sequence will be a noop if already enabled */ + ret = regmap_update_bits(arizona->regmap, + ARIZONA_HAPTICS_CONTROL_1, + ARIZONA_HAP_CTRL_MASK, + 1 << ARIZONA_HAP_CTRL_SHIFT); + if (ret != 0) { + dev_err(arizona->dev, "Failed to start haptics: %d\n", + ret); + return; + } + + mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); + + ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS"); + if (ret != 0) { + dev_err(arizona->dev, "Failed to start HAPTICS: %d\n", + ret); + mutex_unlock(dapm_mutex); + return; + } + + mutex_unlock(dapm_mutex); + + ret = snd_soc_dapm_sync(arizona->dapm); + if (ret != 0) { + dev_err(arizona->dev, "Failed to sync DAPM: %d\n", + ret); + return; + } + } else { + /* This disable sequence will be a noop if already enabled */ + mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); + + ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS"); + if (ret != 0) { + dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n", + ret); + mutex_unlock(dapm_mutex); + return; + } + + mutex_unlock(dapm_mutex); + + ret = snd_soc_dapm_sync(arizona->dapm); + if (ret != 0) { + dev_err(arizona->dev, "Failed to sync DAPM: %d\n", + ret); + return; + } + + ret = regmap_update_bits(arizona->regmap, + ARIZONA_HAPTICS_CONTROL_1, + ARIZONA_HAP_CTRL_MASK, + 1 << ARIZONA_HAP_CTRL_SHIFT); + if (ret != 0) { + dev_err(arizona->dev, "Failed to stop haptics: %d\n", + ret); + return; + } + } +} + +static int arizona_haptics_play(struct input_dev *input, void *data, + struct ff_effect *effect) +{ + struct arizona_haptics *haptics = input_get_drvdata(input); + struct arizona *arizona = haptics->arizona; + + if (!arizona->dapm) { + dev_err(arizona->dev, "No DAPM context\n"); + return -EBUSY; + } + + if (effect->u.rumble.strong_magnitude) { + /* Scale the magnitude into the range the device supports */ + if (arizona->pdata.hap_act) { + haptics->intensity = + effect->u.rumble.strong_magnitude >> 9; + if (effect->direction < 0x8000) + haptics->intensity += 0x7f; + } else { + haptics->intensity = + effect->u.rumble.strong_magnitude >> 8; + } + } else { + haptics->intensity = 0; + } + + schedule_work(&haptics->work); + + return 0; +} + +static void arizona_haptics_close(struct input_dev *input) +{ + struct arizona_haptics *haptics = input_get_drvdata(input); + struct mutex *dapm_mutex = &haptics->arizona->dapm->card->dapm_mutex; + + cancel_work_sync(&haptics->work); + + mutex_lock_nested(dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); + + if (haptics->arizona->dapm) + snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS"); + + mutex_unlock(dapm_mutex); +} + +static int arizona_haptics_probe(struct platform_device *pdev) +{ + struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); + struct arizona_haptics *haptics; + int ret; + + haptics = devm_kzalloc(&pdev->dev, sizeof(*haptics), GFP_KERNEL); + if (!haptics) + return -ENOMEM; + + haptics->arizona = arizona; + + ret = regmap_update_bits(arizona->regmap, ARIZONA_HAPTICS_CONTROL_1, + ARIZONA_HAP_ACT, arizona->pdata.hap_act); + if (ret != 0) { + dev_err(arizona->dev, "Failed to set haptics actuator: %d\n", + ret); + return ret; + } + + INIT_WORK(&haptics->work, arizona_haptics_work); + + haptics->input_dev = input_allocate_device(); + if (haptics->input_dev == NULL) { + dev_err(arizona->dev, "Failed to allocate input device\n"); + return -ENOMEM; + } + + input_set_drvdata(haptics->input_dev, haptics); + + haptics->input_dev->name = "arizona:haptics"; + haptics->input_dev->dev.parent = pdev->dev.parent; + haptics->input_dev->close = arizona_haptics_close; + __set_bit(FF_RUMBLE, haptics->input_dev->ffbit); + + ret = input_ff_create_memless(haptics->input_dev, NULL, + arizona_haptics_play); + if (ret < 0) { + dev_err(arizona->dev, "input_ff_create_memless() failed: %d\n", + ret); + goto err_ialloc; + } + + ret = input_register_device(haptics->input_dev); + if (ret < 0) { + dev_err(arizona->dev, "couldn't register input device: %d\n", + ret); + goto err_iff; + } + + platform_set_drvdata(pdev, haptics); + + return 0; + +err_iff: + if (haptics->input_dev) + input_ff_destroy(haptics->input_dev); +err_ialloc: + input_free_device(haptics->input_dev); + + return ret; +} + +static int arizona_haptics_remove(struct platform_device *pdev) +{ + struct arizona_haptics *haptics = platform_get_drvdata(pdev); + + input_unregister_device(haptics->input_dev); + + return 0; +} + +static struct platform_driver arizona_haptics_driver = { + .probe = arizona_haptics_probe, + .remove = arizona_haptics_remove, + .driver = { + .name = "arizona-haptics", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(arizona_haptics_driver); + +MODULE_ALIAS("platform:arizona-haptics"); +MODULE_DESCRIPTION("Arizona haptics driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mark Brown "); diff --git a/drivers/input/misc/ati_remote2.c b/drivers/input/misc/ati_remote2.c new file mode 100644 index 00000000..f63341f2 --- /dev/null +++ b/drivers/input/misc/ati_remote2.c @@ -0,0 +1,1016 @@ +/* + * ati_remote2 - ATI/Philips USB RF remote driver + * + * Copyright (C) 2005-2008 Ville Syrjala + * Copyright (C) 2007-2008 Peter Stokes + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include + +#define DRIVER_DESC "ATI/Philips USB RF remote driver" +#define DRIVER_VERSION "0.3" + +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_VERSION(DRIVER_VERSION); +MODULE_AUTHOR("Ville Syrjala "); +MODULE_LICENSE("GPL"); + +/* + * ATI Remote Wonder II Channel Configuration + * + * The remote control can by assigned one of sixteen "channels" in order to facilitate + * the use of multiple remote controls within range of each other. + * A remote's "channel" may be altered by pressing and holding the "PC" button for + * approximately 3 seconds, after which the button will slowly flash the count of the + * currently configured "channel", using the numeric keypad enter a number between 1 and + * 16 and then press the "PC" button again, the button will slowly flash the count of the + * newly configured "channel". + */ + +enum { + ATI_REMOTE2_MAX_CHANNEL_MASK = 0xFFFF, + ATI_REMOTE2_MAX_MODE_MASK = 0x1F, +}; + +static int ati_remote2_set_mask(const char *val, + const struct kernel_param *kp, + unsigned int max) +{ + unsigned int mask; + int ret; + + if (!val) + return -EINVAL; + + ret = kstrtouint(val, 0, &mask); + if (ret) + return ret; + + if (mask & ~max) + return -EINVAL; + + *(unsigned int *)kp->arg = mask; + + return 0; +} + +static int ati_remote2_set_channel_mask(const char *val, + const struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return ati_remote2_set_mask(val, kp, ATI_REMOTE2_MAX_CHANNEL_MASK); +} + +static int ati_remote2_get_channel_mask(char *buffer, + const struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return sprintf(buffer, "0x%04x", *(unsigned int *)kp->arg); +} + +static int ati_remote2_set_mode_mask(const char *val, + const struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return ati_remote2_set_mask(val, kp, ATI_REMOTE2_MAX_MODE_MASK); +} + +static int ati_remote2_get_mode_mask(char *buffer, + const struct kernel_param *kp) +{ + pr_debug("%s()\n", __func__); + + return sprintf(buffer, "0x%02x", *(unsigned int *)kp->arg); +} + +static unsigned int channel_mask = ATI_REMOTE2_MAX_CHANNEL_MASK; +#define param_check_channel_mask(name, p) __param_check(name, p, unsigned int) +static struct kernel_param_ops param_ops_channel_mask = { + .set = ati_remote2_set_channel_mask, + .get = ati_remote2_get_channel_mask, +}; +module_param(channel_mask, channel_mask, 0644); +MODULE_PARM_DESC(channel_mask, "Bitmask of channels to accept <15:Channel16>...<1:Channel2><0:Channel1>"); + +static unsigned int mode_mask = ATI_REMOTE2_MAX_MODE_MASK; +#define param_check_mode_mask(name, p) __param_check(name, p, unsigned int) +static struct kernel_param_ops param_ops_mode_mask = { + .set = ati_remote2_set_mode_mask, + .get = ati_remote2_get_mode_mask, +}; +module_param(mode_mask, mode_mask, 0644); +MODULE_PARM_DESC(mode_mask, "Bitmask of modes to accept <4:PC><3:AUX4><2:AUX3><1:AUX2><0:AUX1>"); + +static struct usb_device_id ati_remote2_id_table[] = { + { USB_DEVICE(0x0471, 0x0602) }, /* ATI Remote Wonder II */ + { } +}; +MODULE_DEVICE_TABLE(usb, ati_remote2_id_table); + +static DEFINE_MUTEX(ati_remote2_mutex); + +enum { + ATI_REMOTE2_OPENED = 0x1, + ATI_REMOTE2_SUSPENDED = 0x2, +}; + +enum { + ATI_REMOTE2_AUX1, + ATI_REMOTE2_AUX2, + ATI_REMOTE2_AUX3, + ATI_REMOTE2_AUX4, + ATI_REMOTE2_PC, + ATI_REMOTE2_MODES, +}; + +static const struct { + u8 hw_code; + u16 keycode; +} ati_remote2_key_table[] = { + { 0x00, KEY_0 }, + { 0x01, KEY_1 }, + { 0x02, KEY_2 }, + { 0x03, KEY_3 }, + { 0x04, KEY_4 }, + { 0x05, KEY_5 }, + { 0x06, KEY_6 }, + { 0x07, KEY_7 }, + { 0x08, KEY_8 }, + { 0x09, KEY_9 }, + { 0x0c, KEY_POWER }, + { 0x0d, KEY_MUTE }, + { 0x10, KEY_VOLUMEUP }, + { 0x11, KEY_VOLUMEDOWN }, + { 0x20, KEY_CHANNELUP }, + { 0x21, KEY_CHANNELDOWN }, + { 0x28, KEY_FORWARD }, + { 0x29, KEY_REWIND }, + { 0x2c, KEY_PLAY }, + { 0x30, KEY_PAUSE }, + { 0x31, KEY_STOP }, + { 0x37, KEY_RECORD }, + { 0x38, KEY_DVD }, + { 0x39, KEY_TV }, + { 0x3f, KEY_PROG1 }, /* AUX1-AUX4 and PC */ + { 0x54, KEY_MENU }, + { 0x58, KEY_UP }, + { 0x59, KEY_DOWN }, + { 0x5a, KEY_LEFT }, + { 0x5b, KEY_RIGHT }, + { 0x5c, KEY_OK }, + { 0x78, KEY_A }, + { 0x79, KEY_B }, + { 0x7a, KEY_C }, + { 0x7b, KEY_D }, + { 0x7c, KEY_E }, + { 0x7d, KEY_F }, + { 0x82, KEY_ENTER }, + { 0x8e, KEY_VENDOR }, + { 0x96, KEY_COFFEE }, + { 0xa9, BTN_LEFT }, + { 0xaa, BTN_RIGHT }, + { 0xbe, KEY_QUESTION }, + { 0xd0, KEY_EDIT }, + { 0xd5, KEY_FRONT }, + { 0xf9, KEY_INFO }, +}; + +struct ati_remote2 { + struct input_dev *idev; + struct usb_device *udev; + + struct usb_interface *intf[2]; + struct usb_endpoint_descriptor *ep[2]; + struct urb *urb[2]; + void *buf[2]; + dma_addr_t buf_dma[2]; + + unsigned long jiffies; + int mode; + + char name[64]; + char phys[64]; + + /* Each mode (AUX1-AUX4 and PC) can have an independent keymap. */ + u16 keycode[ATI_REMOTE2_MODES][ARRAY_SIZE(ati_remote2_key_table)]; + + unsigned int flags; + + unsigned int channel_mask; + unsigned int mode_mask; +}; + +static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id); +static void ati_remote2_disconnect(struct usb_interface *interface); +static int ati_remote2_suspend(struct usb_interface *interface, pm_message_t message); +static int ati_remote2_resume(struct usb_interface *interface); +static int ati_remote2_reset_resume(struct usb_interface *interface); +static int ati_remote2_pre_reset(struct usb_interface *interface); +static int ati_remote2_post_reset(struct usb_interface *interface); + +static struct usb_driver ati_remote2_driver = { + .name = "ati_remote2", + .probe = ati_remote2_probe, + .disconnect = ati_remote2_disconnect, + .id_table = ati_remote2_id_table, + .suspend = ati_remote2_suspend, + .resume = ati_remote2_resume, + .reset_resume = ati_remote2_reset_resume, + .pre_reset = ati_remote2_pre_reset, + .post_reset = ati_remote2_post_reset, + .supports_autosuspend = 1, +}; + +static int ati_remote2_submit_urbs(struct ati_remote2 *ar2) +{ + int r; + + r = usb_submit_urb(ar2->urb[0], GFP_KERNEL); + if (r) { + dev_err(&ar2->intf[0]->dev, + "%s(): usb_submit_urb() = %d\n", __func__, r); + return r; + } + r = usb_submit_urb(ar2->urb[1], GFP_KERNEL); + if (r) { + usb_kill_urb(ar2->urb[0]); + dev_err(&ar2->intf[1]->dev, + "%s(): usb_submit_urb() = %d\n", __func__, r); + return r; + } + + return 0; +} + +static void ati_remote2_kill_urbs(struct ati_remote2 *ar2) +{ + usb_kill_urb(ar2->urb[1]); + usb_kill_urb(ar2->urb[0]); +} + +static int ati_remote2_open(struct input_dev *idev) +{ + struct ati_remote2 *ar2 = input_get_drvdata(idev); + int r; + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + r = usb_autopm_get_interface(ar2->intf[0]); + if (r) { + dev_err(&ar2->intf[0]->dev, + "%s(): usb_autopm_get_interface() = %d\n", __func__, r); + goto fail1; + } + + mutex_lock(&ati_remote2_mutex); + + if (!(ar2->flags & ATI_REMOTE2_SUSPENDED)) { + r = ati_remote2_submit_urbs(ar2); + if (r) + goto fail2; + } + + ar2->flags |= ATI_REMOTE2_OPENED; + + mutex_unlock(&ati_remote2_mutex); + + usb_autopm_put_interface(ar2->intf[0]); + + return 0; + + fail2: + mutex_unlock(&ati_remote2_mutex); + usb_autopm_put_interface(ar2->intf[0]); + fail1: + return r; +} + +static void ati_remote2_close(struct input_dev *idev) +{ + struct ati_remote2 *ar2 = input_get_drvdata(idev); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + if (!(ar2->flags & ATI_REMOTE2_SUSPENDED)) + ati_remote2_kill_urbs(ar2); + + ar2->flags &= ~ATI_REMOTE2_OPENED; + + mutex_unlock(&ati_remote2_mutex); +} + +static void ati_remote2_input_mouse(struct ati_remote2 *ar2) +{ + struct input_dev *idev = ar2->idev; + u8 *data = ar2->buf[0]; + int channel, mode; + + channel = data[0] >> 4; + + if (!((1 << channel) & ar2->channel_mask)) + return; + + mode = data[0] & 0x0F; + + if (mode > ATI_REMOTE2_PC) { + dev_err(&ar2->intf[0]->dev, + "Unknown mode byte (%02x %02x %02x %02x)\n", + data[3], data[2], data[1], data[0]); + return; + } + + if (!((1 << mode) & ar2->mode_mask)) + return; + + input_event(idev, EV_REL, REL_X, (s8) data[1]); + input_event(idev, EV_REL, REL_Y, (s8) data[2]); + input_sync(idev); +} + +static int ati_remote2_lookup(unsigned int hw_code) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(ati_remote2_key_table); i++) + if (ati_remote2_key_table[i].hw_code == hw_code) + return i; + + return -1; +} + +static void ati_remote2_input_key(struct ati_remote2 *ar2) +{ + struct input_dev *idev = ar2->idev; + u8 *data = ar2->buf[1]; + int channel, mode, hw_code, index; + + channel = data[0] >> 4; + + if (!((1 << channel) & ar2->channel_mask)) + return; + + mode = data[0] & 0x0F; + + if (mode > ATI_REMOTE2_PC) { + dev_err(&ar2->intf[1]->dev, + "Unknown mode byte (%02x %02x %02x %02x)\n", + data[3], data[2], data[1], data[0]); + return; + } + + hw_code = data[2]; + if (hw_code == 0x3f) { + /* + * For some incomprehensible reason the mouse pad generates + * events which look identical to the events from the last + * pressed mode key. Naturally we don't want to generate key + * events for the mouse pad so we filter out any subsequent + * events from the same mode key. + */ + if (ar2->mode == mode) + return; + + if (data[1] == 0) + ar2->mode = mode; + } + + if (!((1 << mode) & ar2->mode_mask)) + return; + + index = ati_remote2_lookup(hw_code); + if (index < 0) { + dev_err(&ar2->intf[1]->dev, + "Unknown code byte (%02x %02x %02x %02x)\n", + data[3], data[2], data[1], data[0]); + return; + } + + switch (data[1]) { + case 0: /* release */ + break; + case 1: /* press */ + ar2->jiffies = jiffies + msecs_to_jiffies(idev->rep[REP_DELAY]); + break; + case 2: /* repeat */ + + /* No repeat for mouse buttons. */ + if (ar2->keycode[mode][index] == BTN_LEFT || + ar2->keycode[mode][index] == BTN_RIGHT) + return; + + if (!time_after_eq(jiffies, ar2->jiffies)) + return; + + ar2->jiffies = jiffies + msecs_to_jiffies(idev->rep[REP_PERIOD]); + break; + default: + dev_err(&ar2->intf[1]->dev, + "Unknown state byte (%02x %02x %02x %02x)\n", + data[3], data[2], data[1], data[0]); + return; + } + + input_event(idev, EV_KEY, ar2->keycode[mode][index], data[1]); + input_sync(idev); +} + +static void ati_remote2_complete_mouse(struct urb *urb) +{ + struct ati_remote2 *ar2 = urb->context; + int r; + + switch (urb->status) { + case 0: + usb_mark_last_busy(ar2->udev); + ati_remote2_input_mouse(ar2); + break; + case -ENOENT: + case -EILSEQ: + case -ECONNRESET: + case -ESHUTDOWN: + dev_dbg(&ar2->intf[0]->dev, + "%s(): urb status = %d\n", __func__, urb->status); + return; + default: + usb_mark_last_busy(ar2->udev); + dev_err(&ar2->intf[0]->dev, + "%s(): urb status = %d\n", __func__, urb->status); + } + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + dev_err(&ar2->intf[0]->dev, + "%s(): usb_submit_urb() = %d\n", __func__, r); +} + +static void ati_remote2_complete_key(struct urb *urb) +{ + struct ati_remote2 *ar2 = urb->context; + int r; + + switch (urb->status) { + case 0: + usb_mark_last_busy(ar2->udev); + ati_remote2_input_key(ar2); + break; + case -ENOENT: + case -EILSEQ: + case -ECONNRESET: + case -ESHUTDOWN: + dev_dbg(&ar2->intf[1]->dev, + "%s(): urb status = %d\n", __func__, urb->status); + return; + default: + usb_mark_last_busy(ar2->udev); + dev_err(&ar2->intf[1]->dev, + "%s(): urb status = %d\n", __func__, urb->status); + } + + r = usb_submit_urb(urb, GFP_ATOMIC); + if (r) + dev_err(&ar2->intf[1]->dev, + "%s(): usb_submit_urb() = %d\n", __func__, r); +} + +static int ati_remote2_getkeycode(struct input_dev *idev, + struct input_keymap_entry *ke) +{ + struct ati_remote2 *ar2 = input_get_drvdata(idev); + unsigned int mode; + int offset; + unsigned int index; + unsigned int scancode; + + if (ke->flags & INPUT_KEYMAP_BY_INDEX) { + index = ke->index; + if (index >= ATI_REMOTE2_MODES * + ARRAY_SIZE(ati_remote2_key_table)) + return -EINVAL; + + mode = ke->index / ARRAY_SIZE(ati_remote2_key_table); + offset = ke->index % ARRAY_SIZE(ati_remote2_key_table); + scancode = (mode << 8) + ati_remote2_key_table[offset].hw_code; + } else { + if (input_scancode_to_scalar(ke, &scancode)) + return -EINVAL; + + mode = scancode >> 8; + if (mode > ATI_REMOTE2_PC) + return -EINVAL; + + offset = ati_remote2_lookup(scancode & 0xff); + if (offset < 0) + return -EINVAL; + + index = mode * ARRAY_SIZE(ati_remote2_key_table) + offset; + } + + ke->keycode = ar2->keycode[mode][offset]; + ke->len = sizeof(scancode); + memcpy(&ke->scancode, &scancode, sizeof(scancode)); + ke->index = index; + + return 0; +} + +static int ati_remote2_setkeycode(struct input_dev *idev, + const struct input_keymap_entry *ke, + unsigned int *old_keycode) +{ + struct ati_remote2 *ar2 = input_get_drvdata(idev); + unsigned int mode; + int offset; + unsigned int index; + unsigned int scancode; + + if (ke->flags & INPUT_KEYMAP_BY_INDEX) { + if (ke->index >= ATI_REMOTE2_MODES * + ARRAY_SIZE(ati_remote2_key_table)) + return -EINVAL; + + mode = ke->index / ARRAY_SIZE(ati_remote2_key_table); + offset = ke->index % ARRAY_SIZE(ati_remote2_key_table); + } else { + if (input_scancode_to_scalar(ke, &scancode)) + return -EINVAL; + + mode = scancode >> 8; + if (mode > ATI_REMOTE2_PC) + return -EINVAL; + + offset = ati_remote2_lookup(scancode & 0xff); + if (offset < 0) + return -EINVAL; + } + + *old_keycode = ar2->keycode[mode][offset]; + ar2->keycode[mode][offset] = ke->keycode; + __set_bit(ke->keycode, idev->keybit); + + for (mode = 0; mode < ATI_REMOTE2_MODES; mode++) { + for (index = 0; index < ARRAY_SIZE(ati_remote2_key_table); index++) { + if (ar2->keycode[mode][index] == *old_keycode) + return 0; + } + } + + __clear_bit(*old_keycode, idev->keybit); + + return 0; +} + +static int ati_remote2_input_init(struct ati_remote2 *ar2) +{ + struct input_dev *idev; + int index, mode, retval; + + idev = input_allocate_device(); + if (!idev) + return -ENOMEM; + + ar2->idev = idev; + input_set_drvdata(idev, ar2); + + idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | BIT_MASK(EV_REL); + idev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_RIGHT); + idev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + + for (mode = 0; mode < ATI_REMOTE2_MODES; mode++) { + for (index = 0; index < ARRAY_SIZE(ati_remote2_key_table); index++) { + ar2->keycode[mode][index] = ati_remote2_key_table[index].keycode; + __set_bit(ar2->keycode[mode][index], idev->keybit); + } + } + + /* AUX1-AUX4 and PC generate the same scancode. */ + index = ati_remote2_lookup(0x3f); + ar2->keycode[ATI_REMOTE2_AUX1][index] = KEY_PROG1; + ar2->keycode[ATI_REMOTE2_AUX2][index] = KEY_PROG2; + ar2->keycode[ATI_REMOTE2_AUX3][index] = KEY_PROG3; + ar2->keycode[ATI_REMOTE2_AUX4][index] = KEY_PROG4; + ar2->keycode[ATI_REMOTE2_PC][index] = KEY_PC; + __set_bit(KEY_PROG1, idev->keybit); + __set_bit(KEY_PROG2, idev->keybit); + __set_bit(KEY_PROG3, idev->keybit); + __set_bit(KEY_PROG4, idev->keybit); + __set_bit(KEY_PC, idev->keybit); + + idev->rep[REP_DELAY] = 250; + idev->rep[REP_PERIOD] = 33; + + idev->open = ati_remote2_open; + idev->close = ati_remote2_close; + + idev->getkeycode = ati_remote2_getkeycode; + idev->setkeycode = ati_remote2_setkeycode; + + idev->name = ar2->name; + idev->phys = ar2->phys; + + usb_to_input_id(ar2->udev, &idev->id); + idev->dev.parent = &ar2->udev->dev; + + retval = input_register_device(idev); + if (retval) + input_free_device(idev); + + return retval; +} + +static int ati_remote2_urb_init(struct ati_remote2 *ar2) +{ + struct usb_device *udev = ar2->udev; + int i, pipe, maxp; + + for (i = 0; i < 2; i++) { + ar2->buf[i] = usb_alloc_coherent(udev, 4, GFP_KERNEL, &ar2->buf_dma[i]); + if (!ar2->buf[i]) + return -ENOMEM; + + ar2->urb[i] = usb_alloc_urb(0, GFP_KERNEL); + if (!ar2->urb[i]) + return -ENOMEM; + + pipe = usb_rcvintpipe(udev, ar2->ep[i]->bEndpointAddress); + maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + maxp = maxp > 4 ? 4 : maxp; + + usb_fill_int_urb(ar2->urb[i], udev, pipe, ar2->buf[i], maxp, + i ? ati_remote2_complete_key : ati_remote2_complete_mouse, + ar2, ar2->ep[i]->bInterval); + ar2->urb[i]->transfer_dma = ar2->buf_dma[i]; + ar2->urb[i]->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + } + + return 0; +} + +static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2) +{ + int i; + + for (i = 0; i < 2; i++) { + usb_free_urb(ar2->urb[i]); + usb_free_coherent(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]); + } +} + +static int ati_remote2_setup(struct ati_remote2 *ar2, unsigned int ch_mask) +{ + int r, i, channel; + + /* + * Configure receiver to only accept input from remote "channel" + * channel == 0 -> Accept input from any remote channel + * channel == 1 -> Only accept input from remote channel 1 + * channel == 2 -> Only accept input from remote channel 2 + * ... + * channel == 16 -> Only accept input from remote channel 16 + */ + + channel = 0; + for (i = 0; i < 16; i++) { + if ((1 << i) & ch_mask) { + if (!(~(1 << i) & ch_mask)) + channel = i + 1; + break; + } + } + + r = usb_control_msg(ar2->udev, usb_sndctrlpipe(ar2->udev, 0), + 0x20, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, + channel, 0x0, NULL, 0, USB_CTRL_SET_TIMEOUT); + if (r) { + dev_err(&ar2->udev->dev, "%s - failed to set channel due to error: %d\n", + __func__, r); + return r; + } + + return 0; +} + +static ssize_t ati_remote2_show_channel_mask(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + + return sprintf(buf, "0x%04x\n", ar2->channel_mask); +} + +static ssize_t ati_remote2_store_channel_mask(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + unsigned int mask; + int r; + + r = kstrtouint(buf, 0, &mask); + if (r) + return r; + + if (mask & ~ATI_REMOTE2_MAX_CHANNEL_MASK) + return -EINVAL; + + r = usb_autopm_get_interface(ar2->intf[0]); + if (r) { + dev_err(&ar2->intf[0]->dev, + "%s(): usb_autopm_get_interface() = %d\n", __func__, r); + return r; + } + + mutex_lock(&ati_remote2_mutex); + + if (mask != ar2->channel_mask) { + r = ati_remote2_setup(ar2, mask); + if (!r) + ar2->channel_mask = mask; + } + + mutex_unlock(&ati_remote2_mutex); + + usb_autopm_put_interface(ar2->intf[0]); + + return r ? r : count; +} + +static ssize_t ati_remote2_show_mode_mask(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + + return sprintf(buf, "0x%02x\n", ar2->mode_mask); +} + +static ssize_t ati_remote2_store_mode_mask(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct usb_device *udev = to_usb_device(dev); + struct usb_interface *intf = usb_ifnum_to_if(udev, 0); + struct ati_remote2 *ar2 = usb_get_intfdata(intf); + unsigned int mask; + int err; + + err = kstrtouint(buf, 0, &mask); + if (err) + return err; + + if (mask & ~ATI_REMOTE2_MAX_MODE_MASK) + return -EINVAL; + + ar2->mode_mask = mask; + + return count; +} + +static DEVICE_ATTR(channel_mask, 0644, ati_remote2_show_channel_mask, + ati_remote2_store_channel_mask); + +static DEVICE_ATTR(mode_mask, 0644, ati_remote2_show_mode_mask, + ati_remote2_store_mode_mask); + +static struct attribute *ati_remote2_attrs[] = { + &dev_attr_channel_mask.attr, + &dev_attr_mode_mask.attr, + NULL, +}; + +static struct attribute_group ati_remote2_attr_group = { + .attrs = ati_remote2_attrs, +}; + +static int ati_remote2_probe(struct usb_interface *interface, const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(interface); + struct usb_host_interface *alt = interface->cur_altsetting; + struct ati_remote2 *ar2; + int r; + + if (alt->desc.bInterfaceNumber) + return -ENODEV; + + ar2 = kzalloc(sizeof (struct ati_remote2), GFP_KERNEL); + if (!ar2) + return -ENOMEM; + + ar2->udev = udev; + + ar2->intf[0] = interface; + ar2->ep[0] = &alt->endpoint[0].desc; + + ar2->intf[1] = usb_ifnum_to_if(udev, 1); + r = usb_driver_claim_interface(&ati_remote2_driver, ar2->intf[1], ar2); + if (r) + goto fail1; + alt = ar2->intf[1]->cur_altsetting; + ar2->ep[1] = &alt->endpoint[0].desc; + + r = ati_remote2_urb_init(ar2); + if (r) + goto fail2; + + ar2->channel_mask = channel_mask; + ar2->mode_mask = mode_mask; + + r = ati_remote2_setup(ar2, ar2->channel_mask); + if (r) + goto fail2; + + usb_make_path(udev, ar2->phys, sizeof(ar2->phys)); + strlcat(ar2->phys, "/input0", sizeof(ar2->phys)); + + strlcat(ar2->name, "ATI Remote Wonder II", sizeof(ar2->name)); + + r = sysfs_create_group(&udev->dev.kobj, &ati_remote2_attr_group); + if (r) + goto fail2; + + r = ati_remote2_input_init(ar2); + if (r) + goto fail3; + + usb_set_intfdata(interface, ar2); + + interface->needs_remote_wakeup = 1; + + return 0; + + fail3: + sysfs_remove_group(&udev->dev.kobj, &ati_remote2_attr_group); + fail2: + ati_remote2_urb_cleanup(ar2); + usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]); + fail1: + kfree(ar2); + + return r; +} + +static void ati_remote2_disconnect(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + + if (alt->desc.bInterfaceNumber) + return; + + ar2 = usb_get_intfdata(interface); + usb_set_intfdata(interface, NULL); + + input_unregister_device(ar2->idev); + + sysfs_remove_group(&ar2->udev->dev.kobj, &ati_remote2_attr_group); + + ati_remote2_urb_cleanup(ar2); + + usb_driver_release_interface(&ati_remote2_driver, ar2->intf[1]); + + kfree(ar2); +} + +static int ati_remote2_suspend(struct usb_interface *interface, + pm_message_t message) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + if (ar2->flags & ATI_REMOTE2_OPENED) + ati_remote2_kill_urbs(ar2); + + ar2->flags |= ATI_REMOTE2_SUSPENDED; + + mutex_unlock(&ati_remote2_mutex); + + return 0; +} + +static int ati_remote2_resume(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + int r = 0; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + if (ar2->flags & ATI_REMOTE2_OPENED) + r = ati_remote2_submit_urbs(ar2); + + if (!r) + ar2->flags &= ~ATI_REMOTE2_SUSPENDED; + + mutex_unlock(&ati_remote2_mutex); + + return r; +} + +static int ati_remote2_reset_resume(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + int r = 0; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + r = ati_remote2_setup(ar2, ar2->channel_mask); + if (r) + goto out; + + if (ar2->flags & ATI_REMOTE2_OPENED) + r = ati_remote2_submit_urbs(ar2); + + if (!r) + ar2->flags &= ~ATI_REMOTE2_SUSPENDED; + + out: + mutex_unlock(&ati_remote2_mutex); + + return r; +} + +static int ati_remote2_pre_reset(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + mutex_lock(&ati_remote2_mutex); + + if (ar2->flags == ATI_REMOTE2_OPENED) + ati_remote2_kill_urbs(ar2); + + return 0; +} + +static int ati_remote2_post_reset(struct usb_interface *interface) +{ + struct ati_remote2 *ar2; + struct usb_host_interface *alt = interface->cur_altsetting; + int r = 0; + + if (alt->desc.bInterfaceNumber) + return 0; + + ar2 = usb_get_intfdata(interface); + + dev_dbg(&ar2->intf[0]->dev, "%s()\n", __func__); + + if (ar2->flags == ATI_REMOTE2_OPENED) + r = ati_remote2_submit_urbs(ar2); + + mutex_unlock(&ati_remote2_mutex); + + return r; +} + +module_usb_driver(ati_remote2_driver); diff --git a/drivers/input/misc/atlas_btns.c b/drivers/input/misc/atlas_btns.c new file mode 100644 index 00000000..5d440236 --- /dev/null +++ b/drivers/input/misc/atlas_btns.c @@ -0,0 +1,159 @@ +/* + * atlas_btns.c - Atlas Wallmount Touchscreen ACPI Extras + * + * Copyright (C) 2006 Jaya Kumar + * Based on Toshiba ACPI by John Belmonte and ASUS ACPI + * This work was sponsored by CIS(M) Sdn Bhd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include + +#define ACPI_ATLAS_NAME "Atlas ACPI" +#define ACPI_ATLAS_CLASS "Atlas" + +static unsigned short atlas_keymap[16]; +static struct input_dev *input_dev; + +/* button handling code */ +static acpi_status acpi_atlas_button_setup(acpi_handle region_handle, + u32 function, void *handler_context, void **return_context) +{ + *return_context = + (function != ACPI_REGION_DEACTIVATE) ? handler_context : NULL; + + return AE_OK; +} + +static acpi_status acpi_atlas_button_handler(u32 function, + acpi_physical_address address, + u32 bit_width, u64 *value, + void *handler_context, void *region_context) +{ + acpi_status status; + + if (function == ACPI_WRITE) { + int code = address & 0x0f; + int key_down = !(address & 0x10); + + input_event(input_dev, EV_MSC, MSC_SCAN, code); + input_report_key(input_dev, atlas_keymap[code], key_down); + input_sync(input_dev); + + status = AE_OK; + } else { + pr_warn("shrugged on unexpected function: function=%x,address=%lx,value=%x\n", + function, (unsigned long)address, (u32)*value); + status = AE_BAD_PARAMETER; + } + + return status; +} + +static int atlas_acpi_button_add(struct acpi_device *device) +{ + acpi_status status; + int i; + int err; + + input_dev = input_allocate_device(); + if (!input_dev) { + pr_err("unable to allocate input device\n"); + return -ENOMEM; + } + + input_dev->name = "Atlas ACPI button driver"; + input_dev->phys = "ASIM0000/atlas/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->keycode = atlas_keymap; + input_dev->keycodesize = sizeof(unsigned short); + input_dev->keycodemax = ARRAY_SIZE(atlas_keymap); + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + __set_bit(EV_KEY, input_dev->evbit); + for (i = 0; i < ARRAY_SIZE(atlas_keymap); i++) { + if (i < 9) { + atlas_keymap[i] = KEY_F1 + i; + __set_bit(KEY_F1 + i, input_dev->keybit); + } else + atlas_keymap[i] = KEY_RESERVED; + } + + err = input_register_device(input_dev); + if (err) { + pr_err("couldn't register input device\n"); + input_free_device(input_dev); + return err; + } + + /* hookup button handler */ + status = acpi_install_address_space_handler(device->handle, + 0x81, &acpi_atlas_button_handler, + &acpi_atlas_button_setup, device); + if (ACPI_FAILURE(status)) { + pr_err("error installing addr spc handler\n"); + input_unregister_device(input_dev); + err = -EINVAL; + } + + return err; +} + +static int atlas_acpi_button_remove(struct acpi_device *device) +{ + acpi_status status; + + status = acpi_remove_address_space_handler(device->handle, + 0x81, &acpi_atlas_button_handler); + if (ACPI_FAILURE(status)) + pr_err("error removing addr spc handler\n"); + + input_unregister_device(input_dev); + + return 0; +} + +static const struct acpi_device_id atlas_device_ids[] = { + {"ASIM0000", 0}, + {"", 0}, +}; +MODULE_DEVICE_TABLE(acpi, atlas_device_ids); + +static struct acpi_driver atlas_acpi_driver = { + .name = ACPI_ATLAS_NAME, + .class = ACPI_ATLAS_CLASS, + .owner = THIS_MODULE, + .ids = atlas_device_ids, + .ops = { + .add = atlas_acpi_button_add, + .remove = atlas_acpi_button_remove, + }, +}; +module_acpi_driver(atlas_acpi_driver); + +MODULE_AUTHOR("Jaya Kumar"); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Atlas button driver"); + diff --git a/drivers/input/misc/bfin_rotary.c b/drivers/input/misc/bfin_rotary.c new file mode 100644 index 00000000..a6666e14 --- /dev/null +++ b/drivers/input/misc/bfin_rotary.c @@ -0,0 +1,272 @@ +/* + * Rotary counter driver for Analog Devices Blackfin Processors + * + * Copyright 2008-2009 Analog Devices Inc. + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +static const u16 per_cnt[] = { + P_CNT_CUD, + P_CNT_CDG, + P_CNT_CZM, + 0 +}; + +struct bfin_rot { + struct input_dev *input; + int irq; + unsigned int up_key; + unsigned int down_key; + unsigned int button_key; + unsigned int rel_code; + unsigned short cnt_config; + unsigned short cnt_imask; + unsigned short cnt_debounce; +}; + +static void report_key_event(struct input_dev *input, int keycode) +{ + /* simulate a press-n-release */ + input_report_key(input, keycode, 1); + input_sync(input); + input_report_key(input, keycode, 0); + input_sync(input); +} + +static void report_rotary_event(struct bfin_rot *rotary, int delta) +{ + struct input_dev *input = rotary->input; + + if (rotary->up_key) { + report_key_event(input, + delta > 0 ? rotary->up_key : rotary->down_key); + } else { + input_report_rel(input, rotary->rel_code, delta); + input_sync(input); + } +} + +static irqreturn_t bfin_rotary_isr(int irq, void *dev_id) +{ + struct platform_device *pdev = dev_id; + struct bfin_rot *rotary = platform_get_drvdata(pdev); + int delta; + + switch (bfin_read_CNT_STATUS()) { + + case ICII: + break; + + case UCII: + case DCII: + delta = bfin_read_CNT_COUNTER(); + if (delta) + report_rotary_event(rotary, delta); + break; + + case CZMII: + report_key_event(rotary->input, rotary->button_key); + break; + + default: + break; + } + + bfin_write_CNT_COMMAND(W1LCNT_ZERO); /* Clear COUNTER */ + bfin_write_CNT_STATUS(-1); /* Clear STATUS */ + + return IRQ_HANDLED; +} + +static int bfin_rotary_probe(struct platform_device *pdev) +{ + struct bfin_rotary_platform_data *pdata = pdev->dev.platform_data; + struct bfin_rot *rotary; + struct input_dev *input; + int error; + + /* Basic validation */ + if ((pdata->rotary_up_key && !pdata->rotary_down_key) || + (!pdata->rotary_up_key && pdata->rotary_down_key)) { + return -EINVAL; + } + + error = peripheral_request_list(per_cnt, dev_name(&pdev->dev)); + if (error) { + dev_err(&pdev->dev, "requesting peripherals failed\n"); + return error; + } + + rotary = kzalloc(sizeof(struct bfin_rot), GFP_KERNEL); + input = input_allocate_device(); + if (!rotary || !input) { + error = -ENOMEM; + goto out1; + } + + rotary->input = input; + + rotary->up_key = pdata->rotary_up_key; + rotary->down_key = pdata->rotary_down_key; + rotary->button_key = pdata->rotary_button_key; + rotary->rel_code = pdata->rotary_rel_code; + + error = rotary->irq = platform_get_irq(pdev, 0); + if (error < 0) + goto out1; + + input->name = pdev->name; + input->phys = "bfin-rotary/input0"; + input->dev.parent = &pdev->dev; + + input_set_drvdata(input, rotary); + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + if (rotary->up_key) { + __set_bit(EV_KEY, input->evbit); + __set_bit(rotary->up_key, input->keybit); + __set_bit(rotary->down_key, input->keybit); + } else { + __set_bit(EV_REL, input->evbit); + __set_bit(rotary->rel_code, input->relbit); + } + + if (rotary->button_key) { + __set_bit(EV_KEY, input->evbit); + __set_bit(rotary->button_key, input->keybit); + } + + error = request_irq(rotary->irq, bfin_rotary_isr, + 0, dev_name(&pdev->dev), pdev); + if (error) { + dev_err(&pdev->dev, + "unable to claim irq %d; error %d\n", + rotary->irq, error); + goto out1; + } + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, + "unable to register input device (%d)\n", error); + goto out2; + } + + if (pdata->rotary_button_key) + bfin_write_CNT_IMASK(CZMIE); + + if (pdata->mode & ROT_DEBE) + bfin_write_CNT_DEBOUNCE(pdata->debounce & DPRESCALE); + + if (pdata->mode) + bfin_write_CNT_CONFIG(bfin_read_CNT_CONFIG() | + (pdata->mode & ~CNTE)); + + bfin_write_CNT_IMASK(bfin_read_CNT_IMASK() | UCIE | DCIE); + bfin_write_CNT_CONFIG(bfin_read_CNT_CONFIG() | CNTE); + + platform_set_drvdata(pdev, rotary); + device_init_wakeup(&pdev->dev, 1); + + return 0; + +out2: + free_irq(rotary->irq, pdev); +out1: + input_free_device(input); + kfree(rotary); + peripheral_free_list(per_cnt); + + return error; +} + +static int bfin_rotary_remove(struct platform_device *pdev) +{ + struct bfin_rot *rotary = platform_get_drvdata(pdev); + + bfin_write_CNT_CONFIG(0); + bfin_write_CNT_IMASK(0); + + free_irq(rotary->irq, pdev); + input_unregister_device(rotary->input); + peripheral_free_list(per_cnt); + + kfree(rotary); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM +static int bfin_rotary_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct bfin_rot *rotary = platform_get_drvdata(pdev); + + rotary->cnt_config = bfin_read_CNT_CONFIG(); + rotary->cnt_imask = bfin_read_CNT_IMASK(); + rotary->cnt_debounce = bfin_read_CNT_DEBOUNCE(); + + if (device_may_wakeup(&pdev->dev)) + enable_irq_wake(rotary->irq); + + return 0; +} + +static int bfin_rotary_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct bfin_rot *rotary = platform_get_drvdata(pdev); + + bfin_write_CNT_DEBOUNCE(rotary->cnt_debounce); + bfin_write_CNT_IMASK(rotary->cnt_imask); + bfin_write_CNT_CONFIG(rotary->cnt_config & ~CNTE); + + if (device_may_wakeup(&pdev->dev)) + disable_irq_wake(rotary->irq); + + if (rotary->cnt_config & CNTE) + bfin_write_CNT_CONFIG(rotary->cnt_config); + + return 0; +} + +static const struct dev_pm_ops bfin_rotary_pm_ops = { + .suspend = bfin_rotary_suspend, + .resume = bfin_rotary_resume, +}; +#endif + +static struct platform_driver bfin_rotary_device_driver = { + .probe = bfin_rotary_probe, + .remove = bfin_rotary_remove, + .driver = { + .name = "bfin-rotary", + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &bfin_rotary_pm_ops, +#endif + }, +}; +module_platform_driver(bfin_rotary_device_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("Rotary Counter driver for Blackfin Processors"); +MODULE_ALIAS("platform:bfin-rotary"); diff --git a/drivers/input/misc/bma150.c b/drivers/input/misc/bma150.c new file mode 100644 index 00000000..865c2f9d --- /dev/null +++ b/drivers/input/misc/bma150.c @@ -0,0 +1,668 @@ +/* + * Copyright (c) 2011 Bosch Sensortec GmbH + * Copyright (c) 2011 Unixphere + * + * This driver adds support for Bosch Sensortec's digital acceleration + * sensors BMA150 and SMB380. + * The SMB380 is fully compatible with BMA150 and only differs in packaging. + * + * The datasheet for the BMA150 chip can be found here: + * http://www.bosch-sensortec.com/content/language1/downloads/BST-BMA150-DS000-07.pdf + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ABSMAX_ACC_VAL 0x01FF +#define ABSMIN_ACC_VAL -(ABSMAX_ACC_VAL) + +/* Each axis is represented by a 2-byte data word */ +#define BMA150_XYZ_DATA_SIZE 6 + +/* Input poll interval in milliseconds */ +#define BMA150_POLL_INTERVAL 10 +#define BMA150_POLL_MAX 200 +#define BMA150_POLL_MIN 0 + +#define BMA150_MODE_NORMAL 0 +#define BMA150_MODE_SLEEP 2 +#define BMA150_MODE_WAKE_UP 3 + +/* Data register addresses */ +#define BMA150_DATA_0_REG 0x00 +#define BMA150_DATA_1_REG 0x01 +#define BMA150_DATA_2_REG 0x02 + +/* Control register addresses */ +#define BMA150_CTRL_0_REG 0x0A +#define BMA150_CTRL_1_REG 0x0B +#define BMA150_CTRL_2_REG 0x14 +#define BMA150_CTRL_3_REG 0x15 + +/* Configuration/Setting register addresses */ +#define BMA150_CFG_0_REG 0x0C +#define BMA150_CFG_1_REG 0x0D +#define BMA150_CFG_2_REG 0x0E +#define BMA150_CFG_3_REG 0x0F +#define BMA150_CFG_4_REG 0x10 +#define BMA150_CFG_5_REG 0x11 + +#define BMA150_CHIP_ID 2 +#define BMA150_CHIP_ID_REG BMA150_DATA_0_REG + +#define BMA150_ACC_X_LSB_REG BMA150_DATA_2_REG + +#define BMA150_SLEEP_POS 0 +#define BMA150_SLEEP_MSK 0x01 +#define BMA150_SLEEP_REG BMA150_CTRL_0_REG + +#define BMA150_BANDWIDTH_POS 0 +#define BMA150_BANDWIDTH_MSK 0x07 +#define BMA150_BANDWIDTH_REG BMA150_CTRL_2_REG + +#define BMA150_RANGE_POS 3 +#define BMA150_RANGE_MSK 0x18 +#define BMA150_RANGE_REG BMA150_CTRL_2_REG + +#define BMA150_WAKE_UP_POS 0 +#define BMA150_WAKE_UP_MSK 0x01 +#define BMA150_WAKE_UP_REG BMA150_CTRL_3_REG + +#define BMA150_SW_RES_POS 1 +#define BMA150_SW_RES_MSK 0x02 +#define BMA150_SW_RES_REG BMA150_CTRL_0_REG + +/* Any-motion interrupt register fields */ +#define BMA150_ANY_MOTION_EN_POS 6 +#define BMA150_ANY_MOTION_EN_MSK 0x40 +#define BMA150_ANY_MOTION_EN_REG BMA150_CTRL_1_REG + +#define BMA150_ANY_MOTION_DUR_POS 6 +#define BMA150_ANY_MOTION_DUR_MSK 0xC0 +#define BMA150_ANY_MOTION_DUR_REG BMA150_CFG_5_REG + +#define BMA150_ANY_MOTION_THRES_REG BMA150_CFG_4_REG + +/* Advanced interrupt register fields */ +#define BMA150_ADV_INT_EN_POS 6 +#define BMA150_ADV_INT_EN_MSK 0x40 +#define BMA150_ADV_INT_EN_REG BMA150_CTRL_3_REG + +/* High-G interrupt register fields */ +#define BMA150_HIGH_G_EN_POS 1 +#define BMA150_HIGH_G_EN_MSK 0x02 +#define BMA150_HIGH_G_EN_REG BMA150_CTRL_1_REG + +#define BMA150_HIGH_G_HYST_POS 3 +#define BMA150_HIGH_G_HYST_MSK 0x38 +#define BMA150_HIGH_G_HYST_REG BMA150_CFG_5_REG + +#define BMA150_HIGH_G_DUR_REG BMA150_CFG_3_REG +#define BMA150_HIGH_G_THRES_REG BMA150_CFG_2_REG + +/* Low-G interrupt register fields */ +#define BMA150_LOW_G_EN_POS 0 +#define BMA150_LOW_G_EN_MSK 0x01 +#define BMA150_LOW_G_EN_REG BMA150_CTRL_1_REG + +#define BMA150_LOW_G_HYST_POS 0 +#define BMA150_LOW_G_HYST_MSK 0x07 +#define BMA150_LOW_G_HYST_REG BMA150_CFG_5_REG + +#define BMA150_LOW_G_DUR_REG BMA150_CFG_1_REG +#define BMA150_LOW_G_THRES_REG BMA150_CFG_0_REG + +struct bma150_data { + struct i2c_client *client; + struct input_polled_dev *input_polled; + struct input_dev *input; + u8 mode; +}; + +/* + * The settings for the given range, bandwidth and interrupt features + * are stated and verified by Bosch Sensortec where they are configured + * to provide a generic sensitivity performance. + */ +static struct bma150_cfg default_cfg = { + .any_motion_int = 1, + .hg_int = 1, + .lg_int = 1, + .any_motion_dur = 0, + .any_motion_thres = 0, + .hg_hyst = 0, + .hg_dur = 150, + .hg_thres = 160, + .lg_hyst = 0, + .lg_dur = 150, + .lg_thres = 20, + .range = BMA150_RANGE_2G, + .bandwidth = BMA150_BW_50HZ +}; + +static int bma150_write_byte(struct i2c_client *client, u8 reg, u8 val) +{ + s32 ret; + + /* As per specification, disable irq in between register writes */ + if (client->irq) + disable_irq_nosync(client->irq); + + ret = i2c_smbus_write_byte_data(client, reg, val); + + if (client->irq) + enable_irq(client->irq); + + return ret; +} + +static int bma150_set_reg_bits(struct i2c_client *client, + int val, int shift, u8 mask, u8 reg) +{ + int data; + + data = i2c_smbus_read_byte_data(client, reg); + if (data < 0) + return data; + + data = (data & ~mask) | ((val << shift) & mask); + return bma150_write_byte(client, reg, data); +} + +static int bma150_set_mode(struct bma150_data *bma150, u8 mode) +{ + int error; + + error = bma150_set_reg_bits(bma150->client, mode, BMA150_WAKE_UP_POS, + BMA150_WAKE_UP_MSK, BMA150_WAKE_UP_REG); + if (error) + return error; + + error = bma150_set_reg_bits(bma150->client, mode, BMA150_SLEEP_POS, + BMA150_SLEEP_MSK, BMA150_SLEEP_REG); + if (error) + return error; + + if (mode == BMA150_MODE_NORMAL) + msleep(2); + + bma150->mode = mode; + return 0; +} + +static int bma150_soft_reset(struct bma150_data *bma150) +{ + int error; + + error = bma150_set_reg_bits(bma150->client, 1, BMA150_SW_RES_POS, + BMA150_SW_RES_MSK, BMA150_SW_RES_REG); + if (error) + return error; + + msleep(2); + return 0; +} + +static int bma150_set_range(struct bma150_data *bma150, u8 range) +{ + return bma150_set_reg_bits(bma150->client, range, BMA150_RANGE_POS, + BMA150_RANGE_MSK, BMA150_RANGE_REG); +} + +static int bma150_set_bandwidth(struct bma150_data *bma150, u8 bw) +{ + return bma150_set_reg_bits(bma150->client, bw, BMA150_BANDWIDTH_POS, + BMA150_BANDWIDTH_MSK, BMA150_BANDWIDTH_REG); +} + +static int bma150_set_low_g_interrupt(struct bma150_data *bma150, + u8 enable, u8 hyst, u8 dur, u8 thres) +{ + int error; + + error = bma150_set_reg_bits(bma150->client, hyst, + BMA150_LOW_G_HYST_POS, BMA150_LOW_G_HYST_MSK, + BMA150_LOW_G_HYST_REG); + if (error) + return error; + + error = bma150_write_byte(bma150->client, BMA150_LOW_G_DUR_REG, dur); + if (error) + return error; + + error = bma150_write_byte(bma150->client, BMA150_LOW_G_THRES_REG, thres); + if (error) + return error; + + return bma150_set_reg_bits(bma150->client, !!enable, + BMA150_LOW_G_EN_POS, BMA150_LOW_G_EN_MSK, + BMA150_LOW_G_EN_REG); +} + +static int bma150_set_high_g_interrupt(struct bma150_data *bma150, + u8 enable, u8 hyst, u8 dur, u8 thres) +{ + int error; + + error = bma150_set_reg_bits(bma150->client, hyst, + BMA150_HIGH_G_HYST_POS, BMA150_HIGH_G_HYST_MSK, + BMA150_HIGH_G_HYST_REG); + if (error) + return error; + + error = bma150_write_byte(bma150->client, + BMA150_HIGH_G_DUR_REG, dur); + if (error) + return error; + + error = bma150_write_byte(bma150->client, + BMA150_HIGH_G_THRES_REG, thres); + if (error) + return error; + + return bma150_set_reg_bits(bma150->client, !!enable, + BMA150_HIGH_G_EN_POS, BMA150_HIGH_G_EN_MSK, + BMA150_HIGH_G_EN_REG); +} + + +static int bma150_set_any_motion_interrupt(struct bma150_data *bma150, + u8 enable, u8 dur, u8 thres) +{ + int error; + + error = bma150_set_reg_bits(bma150->client, dur, + BMA150_ANY_MOTION_DUR_POS, + BMA150_ANY_MOTION_DUR_MSK, + BMA150_ANY_MOTION_DUR_REG); + if (error) + return error; + + error = bma150_write_byte(bma150->client, + BMA150_ANY_MOTION_THRES_REG, thres); + if (error) + return error; + + error = bma150_set_reg_bits(bma150->client, !!enable, + BMA150_ADV_INT_EN_POS, BMA150_ADV_INT_EN_MSK, + BMA150_ADV_INT_EN_REG); + if (error) + return error; + + return bma150_set_reg_bits(bma150->client, !!enable, + BMA150_ANY_MOTION_EN_POS, + BMA150_ANY_MOTION_EN_MSK, + BMA150_ANY_MOTION_EN_REG); +} + +static void bma150_report_xyz(struct bma150_data *bma150) +{ + u8 data[BMA150_XYZ_DATA_SIZE]; + s16 x, y, z; + s32 ret; + + ret = i2c_smbus_read_i2c_block_data(bma150->client, + BMA150_ACC_X_LSB_REG, BMA150_XYZ_DATA_SIZE, data); + if (ret != BMA150_XYZ_DATA_SIZE) + return; + + x = ((0xc0 & data[0]) >> 6) | (data[1] << 2); + y = ((0xc0 & data[2]) >> 6) | (data[3] << 2); + z = ((0xc0 & data[4]) >> 6) | (data[5] << 2); + + /* sign extension */ + x = (s16) (x << 6) >> 6; + y = (s16) (y << 6) >> 6; + z = (s16) (z << 6) >> 6; + + input_report_abs(bma150->input, ABS_X, x); + input_report_abs(bma150->input, ABS_Y, y); + input_report_abs(bma150->input, ABS_Z, z); + input_sync(bma150->input); +} + +static irqreturn_t bma150_irq_thread(int irq, void *dev) +{ + bma150_report_xyz(dev); + + return IRQ_HANDLED; +} + +static void bma150_poll(struct input_polled_dev *dev) +{ + bma150_report_xyz(dev->private); +} + +static int bma150_open(struct bma150_data *bma150) +{ + int error; + + error = pm_runtime_get_sync(&bma150->client->dev); + if (error < 0 && error != -ENOSYS) + return error; + + /* + * See if runtime PM woke up the device. If runtime PM + * is disabled we need to do it ourselves. + */ + if (bma150->mode != BMA150_MODE_NORMAL) { + error = bma150_set_mode(bma150, BMA150_MODE_NORMAL); + if (error) + return error; + } + + return 0; +} + +static void bma150_close(struct bma150_data *bma150) +{ + pm_runtime_put_sync(&bma150->client->dev); + + if (bma150->mode != BMA150_MODE_SLEEP) + bma150_set_mode(bma150, BMA150_MODE_SLEEP); +} + +static int bma150_irq_open(struct input_dev *input) +{ + struct bma150_data *bma150 = input_get_drvdata(input); + + return bma150_open(bma150); +} + +static void bma150_irq_close(struct input_dev *input) +{ + struct bma150_data *bma150 = input_get_drvdata(input); + + bma150_close(bma150); +} + +static void bma150_poll_open(struct input_polled_dev *ipoll_dev) +{ + struct bma150_data *bma150 = ipoll_dev->private; + + bma150_open(bma150); +} + +static void bma150_poll_close(struct input_polled_dev *ipoll_dev) +{ + struct bma150_data *bma150 = ipoll_dev->private; + + bma150_close(bma150); +} + +static int bma150_initialize(struct bma150_data *bma150, + const struct bma150_cfg *cfg) +{ + int error; + + error = bma150_soft_reset(bma150); + if (error) + return error; + + error = bma150_set_bandwidth(bma150, cfg->bandwidth); + if (error) + return error; + + error = bma150_set_range(bma150, cfg->range); + if (error) + return error; + + if (bma150->client->irq) { + error = bma150_set_any_motion_interrupt(bma150, + cfg->any_motion_int, + cfg->any_motion_dur, + cfg->any_motion_thres); + if (error) + return error; + + error = bma150_set_high_g_interrupt(bma150, + cfg->hg_int, cfg->hg_hyst, + cfg->hg_dur, cfg->hg_thres); + if (error) + return error; + + error = bma150_set_low_g_interrupt(bma150, + cfg->lg_int, cfg->lg_hyst, + cfg->lg_dur, cfg->lg_thres); + if (error) + return error; + } + + return bma150_set_mode(bma150, BMA150_MODE_SLEEP); +} + +static void bma150_init_input_device(struct bma150_data *bma150, + struct input_dev *idev) +{ + idev->name = BMA150_DRIVER; + idev->phys = BMA150_DRIVER "/input0"; + idev->id.bustype = BUS_I2C; + idev->dev.parent = &bma150->client->dev; + + idev->evbit[0] = BIT_MASK(EV_ABS); + input_set_abs_params(idev, ABS_X, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0); + input_set_abs_params(idev, ABS_Y, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0); + input_set_abs_params(idev, ABS_Z, ABSMIN_ACC_VAL, ABSMAX_ACC_VAL, 0, 0); +} + +static int bma150_register_input_device(struct bma150_data *bma150) +{ + struct input_dev *idev; + int error; + + idev = input_allocate_device(); + if (!idev) + return -ENOMEM; + + bma150_init_input_device(bma150, idev); + + idev->open = bma150_irq_open; + idev->close = bma150_irq_close; + input_set_drvdata(idev, bma150); + + error = input_register_device(idev); + if (error) { + input_free_device(idev); + return error; + } + + bma150->input = idev; + return 0; +} + +static int bma150_register_polled_device(struct bma150_data *bma150) +{ + struct input_polled_dev *ipoll_dev; + int error; + + ipoll_dev = input_allocate_polled_device(); + if (!ipoll_dev) + return -ENOMEM; + + ipoll_dev->private = bma150; + ipoll_dev->open = bma150_poll_open; + ipoll_dev->close = bma150_poll_close; + ipoll_dev->poll = bma150_poll; + ipoll_dev->poll_interval = BMA150_POLL_INTERVAL; + ipoll_dev->poll_interval_min = BMA150_POLL_MIN; + ipoll_dev->poll_interval_max = BMA150_POLL_MAX; + + bma150_init_input_device(bma150, ipoll_dev->input); + + error = input_register_polled_device(ipoll_dev); + if (error) { + input_free_polled_device(ipoll_dev); + return error; + } + + bma150->input_polled = ipoll_dev; + bma150->input = ipoll_dev->input; + + return 0; +} + +static int bma150_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct bma150_platform_data *pdata = client->dev.platform_data; + const struct bma150_cfg *cfg; + struct bma150_data *bma150; + int chip_id; + int error; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "i2c_check_functionality error\n"); + return -EIO; + } + + chip_id = i2c_smbus_read_byte_data(client, BMA150_CHIP_ID_REG); + if (chip_id != BMA150_CHIP_ID) { + dev_err(&client->dev, "BMA150 chip id error: %d\n", chip_id); + return -EINVAL; + } + + bma150 = kzalloc(sizeof(struct bma150_data), GFP_KERNEL); + if (!bma150) + return -ENOMEM; + + bma150->client = client; + + if (pdata) { + if (pdata->irq_gpio_cfg) { + error = pdata->irq_gpio_cfg(); + if (error) { + dev_err(&client->dev, + "IRQ GPIO conf. error %d, error %d\n", + client->irq, error); + goto err_free_mem; + } + } + cfg = &pdata->cfg; + } else { + cfg = &default_cfg; + } + + error = bma150_initialize(bma150, cfg); + if (error) + goto err_free_mem; + + if (client->irq > 0) { + error = bma150_register_input_device(bma150); + if (error) + goto err_free_mem; + + error = request_threaded_irq(client->irq, + NULL, bma150_irq_thread, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + BMA150_DRIVER, bma150); + if (error) { + dev_err(&client->dev, + "irq request failed %d, error %d\n", + client->irq, error); + input_unregister_device(bma150->input); + goto err_free_mem; + } + } else { + error = bma150_register_polled_device(bma150); + if (error) + goto err_free_mem; + } + + i2c_set_clientdata(client, bma150); + + pm_runtime_enable(&client->dev); + + return 0; + +err_free_mem: + kfree(bma150); + return error; +} + +static int bma150_remove(struct i2c_client *client) +{ + struct bma150_data *bma150 = i2c_get_clientdata(client); + + pm_runtime_disable(&client->dev); + + if (client->irq > 0) { + free_irq(client->irq, bma150); + input_unregister_device(bma150->input); + } else { + input_unregister_polled_device(bma150->input_polled); + input_free_polled_device(bma150->input_polled); + } + + kfree(bma150); + + return 0; +} + +#ifdef CONFIG_PM +static int bma150_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma150_data *bma150 = i2c_get_clientdata(client); + + return bma150_set_mode(bma150, BMA150_MODE_SLEEP); +} + +static int bma150_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma150_data *bma150 = i2c_get_clientdata(client); + + return bma150_set_mode(bma150, BMA150_MODE_NORMAL); +} +#endif + +static UNIVERSAL_DEV_PM_OPS(bma150_pm, bma150_suspend, bma150_resume, NULL); + +static const struct i2c_device_id bma150_id[] = { + { "bma150", 0 }, + { "smb380", 0 }, + { "bma023", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, bma150_id); + +static struct i2c_driver bma150_driver = { + .driver = { + .owner = THIS_MODULE, + .name = BMA150_DRIVER, + .pm = &bma150_pm, + }, + .class = I2C_CLASS_HWMON, + .id_table = bma150_id, + .probe = bma150_probe, + .remove = bma150_remove, +}; + +module_i2c_driver(bma150_driver); + +MODULE_AUTHOR("Albert Zhang "); +MODULE_DESCRIPTION("BMA150 driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/bma2x2.c b/drivers/input/misc/bma2x2.c new file mode 100644 index 00000000..28ead0b5 --- /dev/null +++ b/drivers/input/misc/bma2x2.c @@ -0,0 +1,7564 @@ +/*! + * @section LICENSE + * $license$ + * + * @filename $filename$ + * @date 2015/07/13 15:32 + * @id $id$ + * @version 2.1.3 + * + * @brief + * This file contains all function implementations for the BMA2X2 in linux +*/ + +#ifdef CONFIG_SIG_MOTION +#undef CONFIG_HAS_EARLYSUSPEND +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#ifdef __KERNEL__ +#include +#include +#include +#include +#include +#else +#include +#include +#include +#endif + + +#include +#include +#include +#include +#include +#include + + +#include "bstclass.h" +#include "bs_log.h" + +#define ACC_NAME "ACC" +/*#define CONFIG_BMA_ENABLE_NEWDATA_INT 1*/ + +#define SENSOR_NAME "bma2x2" +#define ABSMIN -512 +#define ABSMAX 512 +#define SLOPE_THRESHOLD_VALUE 32 +#define SLOPE_DURATION_VALUE 1 +#define INTERRUPT_LATCH_MODE 13 +#define INTERRUPT_ENABLE 1 +#define INTERRUPT_DISABLE 0 +#define MAP_SLOPE_INTERRUPT 2 +#define SLOPE_X_INDEX 5 +#define SLOPE_Y_INDEX 6 +#define SLOPE_Z_INDEX 7 +#define BMA2X2_MAX_DELAY 200 +#define BMA2X2_RANGE_SET 3 /* +/- 2G */ +#define BMA2X2_BW_SET 12 /* 125HZ */ + +#define LOW_G_INTERRUPT REL_Z +#define HIGH_G_INTERRUPT REL_HWHEEL +#define SLOP_INTERRUPT REL_DIAL +#define DOUBLE_TAP_INTERRUPT REL_WHEEL +#define SINGLE_TAP_INTERRUPT REL_MISC +#define ORIENT_INTERRUPT ABS_PRESSURE +#define FLAT_INTERRUPT ABS_DISTANCE +#define SLOW_NO_MOTION_INTERRUPT REL_Y + +#define HIGH_G_INTERRUPT_X_HAPPENED 1 +#define HIGH_G_INTERRUPT_Y_HAPPENED 2 +#define HIGH_G_INTERRUPT_Z_HAPPENED 3 +#define HIGH_G_INTERRUPT_X_NEGATIVE_HAPPENED 4 +#define HIGH_G_INTERRUPT_Y_NEGATIVE_HAPPENED 5 +#define HIGH_G_INTERRUPT_Z_NEGATIVE_HAPPENED 6 +#define SLOPE_INTERRUPT_X_HAPPENED 7 +#define SLOPE_INTERRUPT_Y_HAPPENED 8 +#define SLOPE_INTERRUPT_Z_HAPPENED 9 +#define SLOPE_INTERRUPT_X_NEGATIVE_HAPPENED 10 +#define SLOPE_INTERRUPT_Y_NEGATIVE_HAPPENED 11 +#define SLOPE_INTERRUPT_Z_NEGATIVE_HAPPENED 12 +#define DOUBLE_TAP_INTERRUPT_HAPPENED 13 +#define SINGLE_TAP_INTERRUPT_HAPPENED 14 +#define UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED 15 +#define UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED 16 +#define UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED 17 +#define UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED 18 +#define DOWNWARD_PORTRAIT_UP_INTERRUPT_HAPPENED 19 +#define DOWNWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED 20 +#define DOWNWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED 21 +#define DOWNWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED 22 +#define FLAT_INTERRUPT_TURE_HAPPENED 23 +#define FLAT_INTERRUPT_FALSE_HAPPENED 24 +#define LOW_G_INTERRUPT_HAPPENED 25 +#define SLOW_NO_MOTION_INTERRUPT_HAPPENED 26 + +#define PAD_LOWG 0 +#define PAD_HIGHG 1 +#define PAD_SLOP 2 +#define PAD_DOUBLE_TAP 3 +#define PAD_SINGLE_TAP 4 +#define PAD_ORIENT 5 +#define PAD_FLAT 6 +#define PAD_SLOW_NO_MOTION 7 + +#define BMA2X2_EEP_OFFSET 0x16 +#define BMA2X2_IMAGE_BASE 0x38 +#define BMA2X2_IMAGE_LEN 22 + +#define BMA2X2_CHIP_ID_REG 0x00 +#define BMA2X2_VERSION_REG 0x01 +#define BMA2X2_X_AXIS_LSB_REG 0x02 +#define BMA2X2_X_AXIS_MSB_REG 0x03 +#define BMA2X2_Y_AXIS_LSB_REG 0x04 +#define BMA2X2_Y_AXIS_MSB_REG 0x05 +#define BMA2X2_Z_AXIS_LSB_REG 0x06 +#define BMA2X2_Z_AXIS_MSB_REG 0x07 +#define BMA2X2_TEMPERATURE_REG 0x08 +#define BMA2X2_STATUS1_REG 0x09 +#define BMA2X2_STATUS2_REG 0x0A +#define BMA2X2_STATUS_TAP_SLOPE_REG 0x0B +#define BMA2X2_STATUS_ORIENT_HIGH_REG 0x0C +#define BMA2X2_STATUS_FIFO_REG 0x0E +#define BMA2X2_RANGE_SEL_REG 0x0F +#define BMA2X2_BW_SEL_REG 0x10 +#define BMA2X2_MODE_CTRL_REG 0x11 +#define BMA2X2_LOW_NOISE_CTRL_REG 0x12 +#define BMA2X2_DATA_CTRL_REG 0x13 +#define BMA2X2_RESET_REG 0x14 +#define BMA2X2_INT_ENABLE1_REG 0x16 +#define BMA2X2_INT_ENABLE2_REG 0x17 +#define BMA2X2_INT_SLO_NO_MOT_REG 0x18 +#define BMA2X2_INT1_PAD_SEL_REG 0x19 +#define BMA2X2_INT_DATA_SEL_REG 0x1A +#define BMA2X2_INT2_PAD_SEL_REG 0x1B +#define BMA2X2_INT_SRC_REG 0x1E +#define BMA2X2_INT_SET_REG 0x20 +#define BMA2X2_INT_CTRL_REG 0x21 +#define BMA2X2_LOW_DURN_REG 0x22 +#define BMA2X2_LOW_THRES_REG 0x23 +#define BMA2X2_LOW_HIGH_HYST_REG 0x24 +#define BMA2X2_HIGH_DURN_REG 0x25 +#define BMA2X2_HIGH_THRES_REG 0x26 +#define BMA2X2_SLOPE_DURN_REG 0x27 +#define BMA2X2_SLOPE_THRES_REG 0x28 +#define BMA2X2_SLO_NO_MOT_THRES_REG 0x29 +#define BMA2X2_TAP_PARAM_REG 0x2A +#define BMA2X2_TAP_THRES_REG 0x2B +#define BMA2X2_ORIENT_PARAM_REG 0x2C +#define BMA2X2_THETA_BLOCK_REG 0x2D +#define BMA2X2_THETA_FLAT_REG 0x2E +#define BMA2X2_FLAT_HOLD_TIME_REG 0x2F +#define BMA2X2_FIFO_WML_TRIG 0x30 +#define BMA2X2_SELF_TEST_REG 0x32 +#define BMA2X2_EEPROM_CTRL_REG 0x33 +#define BMA2X2_SERIAL_CTRL_REG 0x34 +#define BMA2X2_EXTMODE_CTRL_REG 0x35 +#define BMA2X2_OFFSET_CTRL_REG 0x36 +#define BMA2X2_OFFSET_PARAMS_REG 0x37 +#define BMA2X2_OFFSET_X_AXIS_REG 0x38 +#define BMA2X2_OFFSET_Y_AXIS_REG 0x39 +#define BMA2X2_OFFSET_Z_AXIS_REG 0x3A +#define BMA2X2_GP0_REG 0x3B +#define BMA2X2_GP1_REG 0x3C +#define BMA2X2_FIFO_MODE_REG 0x3E +#define BMA2X2_FIFO_DATA_OUTPUT_REG 0x3F + +#define BMA2X2_CHIP_ID__POS 0 +#define BMA2X2_CHIP_ID__MSK 0xFF +#define BMA2X2_CHIP_ID__LEN 8 +#define BMA2X2_CHIP_ID__REG BMA2X2_CHIP_ID_REG + +#define BMA2X2_VERSION__POS 0 +#define BMA2X2_VERSION__LEN 8 +#define BMA2X2_VERSION__MSK 0xFF +#define BMA2X2_VERSION__REG BMA2X2_VERSION_REG + +#define BMA2x2_SLO_NO_MOT_DUR__POS 2 +#define BMA2x2_SLO_NO_MOT_DUR__LEN 6 +#define BMA2x2_SLO_NO_MOT_DUR__MSK 0xFC +#define BMA2x2_SLO_NO_MOT_DUR__REG BMA2X2_SLOPE_DURN_REG + +#define BMA2X2_NEW_DATA_X__POS 0 +#define BMA2X2_NEW_DATA_X__LEN 1 +#define BMA2X2_NEW_DATA_X__MSK 0x01 +#define BMA2X2_NEW_DATA_X__REG BMA2X2_X_AXIS_LSB_REG + +#define BMA2X2_ACC_X14_LSB__POS 2 +#define BMA2X2_ACC_X14_LSB__LEN 6 +#define BMA2X2_ACC_X14_LSB__MSK 0xFC +#define BMA2X2_ACC_X14_LSB__REG BMA2X2_X_AXIS_LSB_REG + +#define BMA2X2_ACC_X12_LSB__POS 4 +#define BMA2X2_ACC_X12_LSB__LEN 4 +#define BMA2X2_ACC_X12_LSB__MSK 0xF0 +#define BMA2X2_ACC_X12_LSB__REG BMA2X2_X_AXIS_LSB_REG + +#define BMA2X2_ACC_X10_LSB__POS 6 +#define BMA2X2_ACC_X10_LSB__LEN 2 +#define BMA2X2_ACC_X10_LSB__MSK 0xC0 +#define BMA2X2_ACC_X10_LSB__REG BMA2X2_X_AXIS_LSB_REG + +#define BMA2X2_ACC_X8_LSB__POS 0 +#define BMA2X2_ACC_X8_LSB__LEN 0 +#define BMA2X2_ACC_X8_LSB__MSK 0x00 +#define BMA2X2_ACC_X8_LSB__REG BMA2X2_X_AXIS_LSB_REG + +#define BMA2X2_ACC_X_MSB__POS 0 +#define BMA2X2_ACC_X_MSB__LEN 8 +#define BMA2X2_ACC_X_MSB__MSK 0xFF +#define BMA2X2_ACC_X_MSB__REG BMA2X2_X_AXIS_MSB_REG + +#define BMA2X2_NEW_DATA_Y__POS 0 +#define BMA2X2_NEW_DATA_Y__LEN 1 +#define BMA2X2_NEW_DATA_Y__MSK 0x01 +#define BMA2X2_NEW_DATA_Y__REG BMA2X2_Y_AXIS_LSB_REG + +#define BMA2X2_ACC_Y14_LSB__POS 2 +#define BMA2X2_ACC_Y14_LSB__LEN 6 +#define BMA2X2_ACC_Y14_LSB__MSK 0xFC +#define BMA2X2_ACC_Y14_LSB__REG BMA2X2_Y_AXIS_LSB_REG + +#define BMA2X2_ACC_Y12_LSB__POS 4 +#define BMA2X2_ACC_Y12_LSB__LEN 4 +#define BMA2X2_ACC_Y12_LSB__MSK 0xF0 +#define BMA2X2_ACC_Y12_LSB__REG BMA2X2_Y_AXIS_LSB_REG + +#define BMA2X2_ACC_Y10_LSB__POS 6 +#define BMA2X2_ACC_Y10_LSB__LEN 2 +#define BMA2X2_ACC_Y10_LSB__MSK 0xC0 +#define BMA2X2_ACC_Y10_LSB__REG BMA2X2_Y_AXIS_LSB_REG + +#define BMA2X2_ACC_Y8_LSB__POS 0 +#define BMA2X2_ACC_Y8_LSB__LEN 0 +#define BMA2X2_ACC_Y8_LSB__MSK 0x00 +#define BMA2X2_ACC_Y8_LSB__REG BMA2X2_Y_AXIS_LSB_REG + +#define BMA2X2_ACC_Y_MSB__POS 0 +#define BMA2X2_ACC_Y_MSB__LEN 8 +#define BMA2X2_ACC_Y_MSB__MSK 0xFF +#define BMA2X2_ACC_Y_MSB__REG BMA2X2_Y_AXIS_MSB_REG + +#define BMA2X2_NEW_DATA_Z__POS 0 +#define BMA2X2_NEW_DATA_Z__LEN 1 +#define BMA2X2_NEW_DATA_Z__MSK 0x01 +#define BMA2X2_NEW_DATA_Z__REG BMA2X2_Z_AXIS_LSB_REG + +#define BMA2X2_ACC_Z14_LSB__POS 2 +#define BMA2X2_ACC_Z14_LSB__LEN 6 +#define BMA2X2_ACC_Z14_LSB__MSK 0xFC +#define BMA2X2_ACC_Z14_LSB__REG BMA2X2_Z_AXIS_LSB_REG + +#define BMA2X2_ACC_Z12_LSB__POS 4 +#define BMA2X2_ACC_Z12_LSB__LEN 4 +#define BMA2X2_ACC_Z12_LSB__MSK 0xF0 +#define BMA2X2_ACC_Z12_LSB__REG BMA2X2_Z_AXIS_LSB_REG + +#define BMA2X2_ACC_Z10_LSB__POS 6 +#define BMA2X2_ACC_Z10_LSB__LEN 2 +#define BMA2X2_ACC_Z10_LSB__MSK 0xC0 +#define BMA2X2_ACC_Z10_LSB__REG BMA2X2_Z_AXIS_LSB_REG + +#define BMA2X2_ACC_Z8_LSB__POS 0 +#define BMA2X2_ACC_Z8_LSB__LEN 0 +#define BMA2X2_ACC_Z8_LSB__MSK 0x00 +#define BMA2X2_ACC_Z8_LSB__REG BMA2X2_Z_AXIS_LSB_REG + +#define BMA2X2_ACC_Z_MSB__POS 0 +#define BMA2X2_ACC_Z_MSB__LEN 8 +#define BMA2X2_ACC_Z_MSB__MSK 0xFF +#define BMA2X2_ACC_Z_MSB__REG BMA2X2_Z_AXIS_MSB_REG + +#define BMA2X2_TEMPERATURE__POS 0 +#define BMA2X2_TEMPERATURE__LEN 8 +#define BMA2X2_TEMPERATURE__MSK 0xFF +#define BMA2X2_TEMPERATURE__REG BMA2X2_TEMP_RD_REG + +#define BMA2X2_LOWG_INT_S__POS 0 +#define BMA2X2_LOWG_INT_S__LEN 1 +#define BMA2X2_LOWG_INT_S__MSK 0x01 +#define BMA2X2_LOWG_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_HIGHG_INT_S__POS 1 +#define BMA2X2_HIGHG_INT_S__LEN 1 +#define BMA2X2_HIGHG_INT_S__MSK 0x02 +#define BMA2X2_HIGHG_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_SLOPE_INT_S__POS 2 +#define BMA2X2_SLOPE_INT_S__LEN 1 +#define BMA2X2_SLOPE_INT_S__MSK 0x04 +#define BMA2X2_SLOPE_INT_S__REG BMA2X2_STATUS1_REG + + +#define BMA2X2_SLO_NO_MOT_INT_S__POS 3 +#define BMA2X2_SLO_NO_MOT_INT_S__LEN 1 +#define BMA2X2_SLO_NO_MOT_INT_S__MSK 0x08 +#define BMA2X2_SLO_NO_MOT_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_DOUBLE_TAP_INT_S__POS 4 +#define BMA2X2_DOUBLE_TAP_INT_S__LEN 1 +#define BMA2X2_DOUBLE_TAP_INT_S__MSK 0x10 +#define BMA2X2_DOUBLE_TAP_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_SINGLE_TAP_INT_S__POS 5 +#define BMA2X2_SINGLE_TAP_INT_S__LEN 1 +#define BMA2X2_SINGLE_TAP_INT_S__MSK 0x20 +#define BMA2X2_SINGLE_TAP_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_ORIENT_INT_S__POS 6 +#define BMA2X2_ORIENT_INT_S__LEN 1 +#define BMA2X2_ORIENT_INT_S__MSK 0x40 +#define BMA2X2_ORIENT_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_FLAT_INT_S__POS 7 +#define BMA2X2_FLAT_INT_S__LEN 1 +#define BMA2X2_FLAT_INT_S__MSK 0x80 +#define BMA2X2_FLAT_INT_S__REG BMA2X2_STATUS1_REG + +#define BMA2X2_FIFO_FULL_INT_S__POS 5 +#define BMA2X2_FIFO_FULL_INT_S__LEN 1 +#define BMA2X2_FIFO_FULL_INT_S__MSK 0x20 +#define BMA2X2_FIFO_FULL_INT_S__REG BMA2X2_STATUS2_REG + +#define BMA2X2_FIFO_WM_INT_S__POS 6 +#define BMA2X2_FIFO_WM_INT_S__LEN 1 +#define BMA2X2_FIFO_WM_INT_S__MSK 0x40 +#define BMA2X2_FIFO_WM_INT_S__REG BMA2X2_STATUS2_REG + +#define BMA2X2_DATA_INT_S__POS 7 +#define BMA2X2_DATA_INT_S__LEN 1 +#define BMA2X2_DATA_INT_S__MSK 0x80 +#define BMA2X2_DATA_INT_S__REG BMA2X2_STATUS2_REG + +#define BMA2X2_SLOPE_FIRST_X__POS 0 +#define BMA2X2_SLOPE_FIRST_X__LEN 1 +#define BMA2X2_SLOPE_FIRST_X__MSK 0x01 +#define BMA2X2_SLOPE_FIRST_X__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_SLOPE_FIRST_Y__POS 1 +#define BMA2X2_SLOPE_FIRST_Y__LEN 1 +#define BMA2X2_SLOPE_FIRST_Y__MSK 0x02 +#define BMA2X2_SLOPE_FIRST_Y__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_SLOPE_FIRST_Z__POS 2 +#define BMA2X2_SLOPE_FIRST_Z__LEN 1 +#define BMA2X2_SLOPE_FIRST_Z__MSK 0x04 +#define BMA2X2_SLOPE_FIRST_Z__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_SLOPE_SIGN_S__POS 3 +#define BMA2X2_SLOPE_SIGN_S__LEN 1 +#define BMA2X2_SLOPE_SIGN_S__MSK 0x08 +#define BMA2X2_SLOPE_SIGN_S__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_TAP_FIRST_X__POS 4 +#define BMA2X2_TAP_FIRST_X__LEN 1 +#define BMA2X2_TAP_FIRST_X__MSK 0x10 +#define BMA2X2_TAP_FIRST_X__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_TAP_FIRST_Y__POS 5 +#define BMA2X2_TAP_FIRST_Y__LEN 1 +#define BMA2X2_TAP_FIRST_Y__MSK 0x20 +#define BMA2X2_TAP_FIRST_Y__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_TAP_FIRST_Z__POS 6 +#define BMA2X2_TAP_FIRST_Z__LEN 1 +#define BMA2X2_TAP_FIRST_Z__MSK 0x40 +#define BMA2X2_TAP_FIRST_Z__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_TAP_SIGN_S__POS 7 +#define BMA2X2_TAP_SIGN_S__LEN 1 +#define BMA2X2_TAP_SIGN_S__MSK 0x80 +#define BMA2X2_TAP_SIGN_S__REG BMA2X2_STATUS_TAP_SLOPE_REG + +#define BMA2X2_HIGHG_FIRST_X__POS 0 +#define BMA2X2_HIGHG_FIRST_X__LEN 1 +#define BMA2X2_HIGHG_FIRST_X__MSK 0x01 +#define BMA2X2_HIGHG_FIRST_X__REG BMA2X2_STATUS_ORIENT_HIGH_REG + +#define BMA2X2_HIGHG_FIRST_Y__POS 1 +#define BMA2X2_HIGHG_FIRST_Y__LEN 1 +#define BMA2X2_HIGHG_FIRST_Y__MSK 0x02 +#define BMA2X2_HIGHG_FIRST_Y__REG BMA2X2_STATUS_ORIENT_HIGH_REG + +#define BMA2X2_HIGHG_FIRST_Z__POS 2 +#define BMA2X2_HIGHG_FIRST_Z__LEN 1 +#define BMA2X2_HIGHG_FIRST_Z__MSK 0x04 +#define BMA2X2_HIGHG_FIRST_Z__REG BMA2X2_STATUS_ORIENT_HIGH_REG + +#define BMA2X2_HIGHG_SIGN_S__POS 3 +#define BMA2X2_HIGHG_SIGN_S__LEN 1 +#define BMA2X2_HIGHG_SIGN_S__MSK 0x08 +#define BMA2X2_HIGHG_SIGN_S__REG BMA2X2_STATUS_ORIENT_HIGH_REG + +#define BMA2X2_ORIENT_S__POS 4 +#define BMA2X2_ORIENT_S__LEN 3 +#define BMA2X2_ORIENT_S__MSK 0x70 +#define BMA2X2_ORIENT_S__REG BMA2X2_STATUS_ORIENT_HIGH_REG + +#define BMA2X2_FLAT_S__POS 7 +#define BMA2X2_FLAT_S__LEN 1 +#define BMA2X2_FLAT_S__MSK 0x80 +#define BMA2X2_FLAT_S__REG BMA2X2_STATUS_ORIENT_HIGH_REG + +#define BMA2X2_FIFO_FRAME_COUNTER_S__POS 0 +#define BMA2X2_FIFO_FRAME_COUNTER_S__LEN 7 +#define BMA2X2_FIFO_FRAME_COUNTER_S__MSK 0x7F +#define BMA2X2_FIFO_FRAME_COUNTER_S__REG BMA2X2_STATUS_FIFO_REG +#define BMA2X2_FIFO_OVERRUN_S__POS 7 +#define BMA2X2_FIFO_OVERRUN_S__LEN 1 +#define BMA2X2_FIFO_OVERRUN_S__MSK 0x80 +#define BMA2X2_FIFO_OVERRUN_S__REG BMA2X2_STATUS_FIFO_REG + +#define BMA2X2_RANGE_SEL__POS 0 +#define BMA2X2_RANGE_SEL__LEN 4 +#define BMA2X2_RANGE_SEL__MSK 0x0F +#define BMA2X2_RANGE_SEL__REG BMA2X2_RANGE_SEL_REG + +#define BMA2X2_BANDWIDTH__POS 0 +#define BMA2X2_BANDWIDTH__LEN 5 +#define BMA2X2_BANDWIDTH__MSK 0x1F +#define BMA2X2_BANDWIDTH__REG BMA2X2_BW_SEL_REG + +#define BMA2X2_SLEEP_DUR__POS 1 +#define BMA2X2_SLEEP_DUR__LEN 4 +#define BMA2X2_SLEEP_DUR__MSK 0x1E +#define BMA2X2_SLEEP_DUR__REG BMA2X2_MODE_CTRL_REG + +#define BMA2X2_MODE_CTRL__POS 5 +#define BMA2X2_MODE_CTRL__LEN 3 +#define BMA2X2_MODE_CTRL__MSK 0xE0 +#define BMA2X2_MODE_CTRL__REG BMA2X2_MODE_CTRL_REG + +#define BMA2X2_DEEP_SUSPEND__POS 5 +#define BMA2X2_DEEP_SUSPEND__LEN 1 +#define BMA2X2_DEEP_SUSPEND__MSK 0x20 +#define BMA2X2_DEEP_SUSPEND__REG BMA2X2_MODE_CTRL_REG + +#define BMA2X2_EN_LOW_POWER__POS 6 +#define BMA2X2_EN_LOW_POWER__LEN 1 +#define BMA2X2_EN_LOW_POWER__MSK 0x40 +#define BMA2X2_EN_LOW_POWER__REG BMA2X2_MODE_CTRL_REG + +#define BMA2X2_EN_SUSPEND__POS 7 +#define BMA2X2_EN_SUSPEND__LEN 1 +#define BMA2X2_EN_SUSPEND__MSK 0x80 +#define BMA2X2_EN_SUSPEND__REG BMA2X2_MODE_CTRL_REG + +#define BMA2X2_SLEEP_TIMER__POS 5 +#define BMA2X2_SLEEP_TIMER__LEN 1 +#define BMA2X2_SLEEP_TIMER__MSK 0x20 +#define BMA2X2_SLEEP_TIMER__REG BMA2X2_LOW_NOISE_CTRL_REG + +#define BMA2X2_LOW_POWER_MODE__POS 6 +#define BMA2X2_LOW_POWER_MODE__LEN 1 +#define BMA2X2_LOW_POWER_MODE__MSK 0x40 +#define BMA2X2_LOW_POWER_MODE__REG BMA2X2_LOW_NOISE_CTRL_REG + +#define BMA2X2_EN_LOW_NOISE__POS 7 +#define BMA2X2_EN_LOW_NOISE__LEN 1 +#define BMA2X2_EN_LOW_NOISE__MSK 0x80 +#define BMA2X2_EN_LOW_NOISE__REG BMA2X2_LOW_NOISE_CTRL_REG + +#define BMA2X2_DIS_SHADOW_PROC__POS 6 +#define BMA2X2_DIS_SHADOW_PROC__LEN 1 +#define BMA2X2_DIS_SHADOW_PROC__MSK 0x40 +#define BMA2X2_DIS_SHADOW_PROC__REG BMA2X2_DATA_CTRL_REG + +#define BMA2X2_EN_DATA_HIGH_BW__POS 7 +#define BMA2X2_EN_DATA_HIGH_BW__LEN 1 +#define BMA2X2_EN_DATA_HIGH_BW__MSK 0x80 +#define BMA2X2_EN_DATA_HIGH_BW__REG BMA2X2_DATA_CTRL_REG + +#define BMA2X2_EN_SOFT_RESET__POS 0 +#define BMA2X2_EN_SOFT_RESET__LEN 8 +#define BMA2X2_EN_SOFT_RESET__MSK 0xFF +#define BMA2X2_EN_SOFT_RESET__REG BMA2X2_RESET_REG + +#define BMA2X2_EN_SOFT_RESET_VALUE 0xB6 + +#define BMA2X2_EN_SLOPE_X_INT__POS 0 +#define BMA2X2_EN_SLOPE_X_INT__LEN 1 +#define BMA2X2_EN_SLOPE_X_INT__MSK 0x01 +#define BMA2X2_EN_SLOPE_X_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_SLOPE_Y_INT__POS 1 +#define BMA2X2_EN_SLOPE_Y_INT__LEN 1 +#define BMA2X2_EN_SLOPE_Y_INT__MSK 0x02 +#define BMA2X2_EN_SLOPE_Y_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_SLOPE_Z_INT__POS 2 +#define BMA2X2_EN_SLOPE_Z_INT__LEN 1 +#define BMA2X2_EN_SLOPE_Z_INT__MSK 0x04 +#define BMA2X2_EN_SLOPE_Z_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_DOUBLE_TAP_INT__POS 4 +#define BMA2X2_EN_DOUBLE_TAP_INT__LEN 1 +#define BMA2X2_EN_DOUBLE_TAP_INT__MSK 0x10 +#define BMA2X2_EN_DOUBLE_TAP_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_SINGLE_TAP_INT__POS 5 +#define BMA2X2_EN_SINGLE_TAP_INT__LEN 1 +#define BMA2X2_EN_SINGLE_TAP_INT__MSK 0x20 +#define BMA2X2_EN_SINGLE_TAP_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_ORIENT_INT__POS 6 +#define BMA2X2_EN_ORIENT_INT__LEN 1 +#define BMA2X2_EN_ORIENT_INT__MSK 0x40 +#define BMA2X2_EN_ORIENT_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_FLAT_INT__POS 7 +#define BMA2X2_EN_FLAT_INT__LEN 1 +#define BMA2X2_EN_FLAT_INT__MSK 0x80 +#define BMA2X2_EN_FLAT_INT__REG BMA2X2_INT_ENABLE1_REG + +#define BMA2X2_EN_HIGHG_X_INT__POS 0 +#define BMA2X2_EN_HIGHG_X_INT__LEN 1 +#define BMA2X2_EN_HIGHG_X_INT__MSK 0x01 +#define BMA2X2_EN_HIGHG_X_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_EN_HIGHG_Y_INT__POS 1 +#define BMA2X2_EN_HIGHG_Y_INT__LEN 1 +#define BMA2X2_EN_HIGHG_Y_INT__MSK 0x02 +#define BMA2X2_EN_HIGHG_Y_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_EN_HIGHG_Z_INT__POS 2 +#define BMA2X2_EN_HIGHG_Z_INT__LEN 1 +#define BMA2X2_EN_HIGHG_Z_INT__MSK 0x04 +#define BMA2X2_EN_HIGHG_Z_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_EN_LOWG_INT__POS 3 +#define BMA2X2_EN_LOWG_INT__LEN 1 +#define BMA2X2_EN_LOWG_INT__MSK 0x08 +#define BMA2X2_EN_LOWG_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_EN_NEW_DATA_INT__POS 4 +#define BMA2X2_EN_NEW_DATA_INT__LEN 1 +#define BMA2X2_EN_NEW_DATA_INT__MSK 0x10 +#define BMA2X2_EN_NEW_DATA_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_INT_FFULL_EN_INT__POS 5 +#define BMA2X2_INT_FFULL_EN_INT__LEN 1 +#define BMA2X2_INT_FFULL_EN_INT__MSK 0x20 +#define BMA2X2_INT_FFULL_EN_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_INT_FWM_EN_INT__POS 6 +#define BMA2X2_INT_FWM_EN_INT__LEN 1 +#define BMA2X2_INT_FWM_EN_INT__MSK 0x40 +#define BMA2X2_INT_FWM_EN_INT__REG BMA2X2_INT_ENABLE2_REG + +#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__POS 0 +#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__LEN 1 +#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__MSK 0x01 +#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__REG BMA2X2_INT_SLO_NO_MOT_REG + +#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__POS 1 +#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__LEN 1 +#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__MSK 0x02 +#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__REG BMA2X2_INT_SLO_NO_MOT_REG + +#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__POS 2 +#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__LEN 1 +#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__MSK 0x04 +#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__REG BMA2X2_INT_SLO_NO_MOT_REG + +#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__POS 3 +#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__LEN 1 +#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__MSK 0x08 +#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__REG BMA2X2_INT_SLO_NO_MOT_REG + +#define BMA2X2_EN_INT1_PAD_LOWG__POS 0 +#define BMA2X2_EN_INT1_PAD_LOWG__LEN 1 +#define BMA2X2_EN_INT1_PAD_LOWG__MSK 0x01 +#define BMA2X2_EN_INT1_PAD_LOWG__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_HIGHG__POS 1 +#define BMA2X2_EN_INT1_PAD_HIGHG__LEN 1 +#define BMA2X2_EN_INT1_PAD_HIGHG__MSK 0x02 +#define BMA2X2_EN_INT1_PAD_HIGHG__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_SLOPE__POS 2 +#define BMA2X2_EN_INT1_PAD_SLOPE__LEN 1 +#define BMA2X2_EN_INT1_PAD_SLOPE__MSK 0x04 +#define BMA2X2_EN_INT1_PAD_SLOPE__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__POS 3 +#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__LEN 1 +#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__MSK 0x08 +#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_DB_TAP__POS 4 +#define BMA2X2_EN_INT1_PAD_DB_TAP__LEN 1 +#define BMA2X2_EN_INT1_PAD_DB_TAP__MSK 0x10 +#define BMA2X2_EN_INT1_PAD_DB_TAP__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_SNG_TAP__POS 5 +#define BMA2X2_EN_INT1_PAD_SNG_TAP__LEN 1 +#define BMA2X2_EN_INT1_PAD_SNG_TAP__MSK 0x20 +#define BMA2X2_EN_INT1_PAD_SNG_TAP__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_ORIENT__POS 6 +#define BMA2X2_EN_INT1_PAD_ORIENT__LEN 1 +#define BMA2X2_EN_INT1_PAD_ORIENT__MSK 0x40 +#define BMA2X2_EN_INT1_PAD_ORIENT__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_FLAT__POS 7 +#define BMA2X2_EN_INT1_PAD_FLAT__LEN 1 +#define BMA2X2_EN_INT1_PAD_FLAT__MSK 0x80 +#define BMA2X2_EN_INT1_PAD_FLAT__REG BMA2X2_INT1_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_LOWG__POS 0 +#define BMA2X2_EN_INT2_PAD_LOWG__LEN 1 +#define BMA2X2_EN_INT2_PAD_LOWG__MSK 0x01 +#define BMA2X2_EN_INT2_PAD_LOWG__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_HIGHG__POS 1 +#define BMA2X2_EN_INT2_PAD_HIGHG__LEN 1 +#define BMA2X2_EN_INT2_PAD_HIGHG__MSK 0x02 +#define BMA2X2_EN_INT2_PAD_HIGHG__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_SLOPE__POS 2 +#define BMA2X2_EN_INT2_PAD_SLOPE__LEN 1 +#define BMA2X2_EN_INT2_PAD_SLOPE__MSK 0x04 +#define BMA2X2_EN_INT2_PAD_SLOPE__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__POS 3 +#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__LEN 1 +#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__MSK 0x08 +#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_DB_TAP__POS 4 +#define BMA2X2_EN_INT2_PAD_DB_TAP__LEN 1 +#define BMA2X2_EN_INT2_PAD_DB_TAP__MSK 0x10 +#define BMA2X2_EN_INT2_PAD_DB_TAP__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_SNG_TAP__POS 5 +#define BMA2X2_EN_INT2_PAD_SNG_TAP__LEN 1 +#define BMA2X2_EN_INT2_PAD_SNG_TAP__MSK 0x20 +#define BMA2X2_EN_INT2_PAD_SNG_TAP__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_ORIENT__POS 6 +#define BMA2X2_EN_INT2_PAD_ORIENT__LEN 1 +#define BMA2X2_EN_INT2_PAD_ORIENT__MSK 0x40 +#define BMA2X2_EN_INT2_PAD_ORIENT__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT2_PAD_FLAT__POS 7 +#define BMA2X2_EN_INT2_PAD_FLAT__LEN 1 +#define BMA2X2_EN_INT2_PAD_FLAT__MSK 0x80 +#define BMA2X2_EN_INT2_PAD_FLAT__REG BMA2X2_INT2_PAD_SEL_REG + +#define BMA2X2_EN_INT1_PAD_NEWDATA__POS 0 +#define BMA2X2_EN_INT1_PAD_NEWDATA__LEN 1 +#define BMA2X2_EN_INT1_PAD_NEWDATA__MSK 0x01 +#define BMA2X2_EN_INT1_PAD_NEWDATA__REG BMA2X2_INT_DATA_SEL_REG + +#define BMA2X2_EN_INT1_PAD_FWM__POS 1 +#define BMA2X2_EN_INT1_PAD_FWM__LEN 1 +#define BMA2X2_EN_INT1_PAD_FWM__MSK 0x02 +#define BMA2X2_EN_INT1_PAD_FWM__REG BMA2X2_INT_DATA_SEL_REG + +#define BMA2X2_EN_INT1_PAD_FFULL__POS 2 +#define BMA2X2_EN_INT1_PAD_FFULL__LEN 1 +#define BMA2X2_EN_INT1_PAD_FFULL__MSK 0x04 +#define BMA2X2_EN_INT1_PAD_FFULL__REG BMA2X2_INT_DATA_SEL_REG + +#define BMA2X2_EN_INT2_PAD_FFULL__POS 5 +#define BMA2X2_EN_INT2_PAD_FFULL__LEN 1 +#define BMA2X2_EN_INT2_PAD_FFULL__MSK 0x20 +#define BMA2X2_EN_INT2_PAD_FFULL__REG BMA2X2_INT_DATA_SEL_REG + +#define BMA2X2_EN_INT2_PAD_FWM__POS 6 +#define BMA2X2_EN_INT2_PAD_FWM__LEN 1 +#define BMA2X2_EN_INT2_PAD_FWM__MSK 0x40 +#define BMA2X2_EN_INT2_PAD_FWM__REG BMA2X2_INT_DATA_SEL_REG + +#define BMA2X2_EN_INT2_PAD_NEWDATA__POS 7 +#define BMA2X2_EN_INT2_PAD_NEWDATA__LEN 1 +#define BMA2X2_EN_INT2_PAD_NEWDATA__MSK 0x80 +#define BMA2X2_EN_INT2_PAD_NEWDATA__REG BMA2X2_INT_DATA_SEL_REG + +#define BMA2X2_UNFILT_INT_SRC_LOWG__POS 0 +#define BMA2X2_UNFILT_INT_SRC_LOWG__LEN 1 +#define BMA2X2_UNFILT_INT_SRC_LOWG__MSK 0x01 +#define BMA2X2_UNFILT_INT_SRC_LOWG__REG BMA2X2_INT_SRC_REG + +#define BMA2X2_UNFILT_INT_SRC_HIGHG__POS 1 +#define BMA2X2_UNFILT_INT_SRC_HIGHG__LEN 1 +#define BMA2X2_UNFILT_INT_SRC_HIGHG__MSK 0x02 +#define BMA2X2_UNFILT_INT_SRC_HIGHG__REG BMA2X2_INT_SRC_REG + +#define BMA2X2_UNFILT_INT_SRC_SLOPE__POS 2 +#define BMA2X2_UNFILT_INT_SRC_SLOPE__LEN 1 +#define BMA2X2_UNFILT_INT_SRC_SLOPE__MSK 0x04 +#define BMA2X2_UNFILT_INT_SRC_SLOPE__REG BMA2X2_INT_SRC_REG + +#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__POS 3 +#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__LEN 1 +#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__MSK 0x08 +#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__REG BMA2X2_INT_SRC_REG + +#define BMA2X2_UNFILT_INT_SRC_TAP__POS 4 +#define BMA2X2_UNFILT_INT_SRC_TAP__LEN 1 +#define BMA2X2_UNFILT_INT_SRC_TAP__MSK 0x10 +#define BMA2X2_UNFILT_INT_SRC_TAP__REG BMA2X2_INT_SRC_REG + +#define BMA2X2_UNFILT_INT_SRC_DATA__POS 5 +#define BMA2X2_UNFILT_INT_SRC_DATA__LEN 1 +#define BMA2X2_UNFILT_INT_SRC_DATA__MSK 0x20 +#define BMA2X2_UNFILT_INT_SRC_DATA__REG BMA2X2_INT_SRC_REG + +#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__POS 0 +#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__LEN 1 +#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__MSK 0x01 +#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__REG BMA2X2_INT_SET_REG + +#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__POS 2 +#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__LEN 1 +#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__MSK 0x04 +#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__REG BMA2X2_INT_SET_REG + +#define BMA2X2_INT1_PAD_OUTPUT_TYPE__POS 1 +#define BMA2X2_INT1_PAD_OUTPUT_TYPE__LEN 1 +#define BMA2X2_INT1_PAD_OUTPUT_TYPE__MSK 0x02 +#define BMA2X2_INT1_PAD_OUTPUT_TYPE__REG BMA2X2_INT_SET_REG + +#define BMA2X2_INT2_PAD_OUTPUT_TYPE__POS 3 +#define BMA2X2_INT2_PAD_OUTPUT_TYPE__LEN 1 +#define BMA2X2_INT2_PAD_OUTPUT_TYPE__MSK 0x08 +#define BMA2X2_INT2_PAD_OUTPUT_TYPE__REG BMA2X2_INT_SET_REG + +#define BMA2X2_INT_MODE_SEL__POS 0 +#define BMA2X2_INT_MODE_SEL__LEN 4 +#define BMA2X2_INT_MODE_SEL__MSK 0x0F +#define BMA2X2_INT_MODE_SEL__REG BMA2X2_INT_CTRL_REG + +#define BMA2X2_RESET_INT__POS 7 +#define BMA2X2_RESET_INT__LEN 1 +#define BMA2X2_RESET_INT__MSK 0x80 +#define BMA2X2_RESET_INT__REG BMA2X2_INT_CTRL_REG + +#define BMA2X2_LOWG_DUR__POS 0 +#define BMA2X2_LOWG_DUR__LEN 8 +#define BMA2X2_LOWG_DUR__MSK 0xFF +#define BMA2X2_LOWG_DUR__REG BMA2X2_LOW_DURN_REG + +#define BMA2X2_LOWG_THRES__POS 0 +#define BMA2X2_LOWG_THRES__LEN 8 +#define BMA2X2_LOWG_THRES__MSK 0xFF +#define BMA2X2_LOWG_THRES__REG BMA2X2_LOW_THRES_REG + +#define BMA2X2_LOWG_HYST__POS 0 +#define BMA2X2_LOWG_HYST__LEN 2 +#define BMA2X2_LOWG_HYST__MSK 0x03 +#define BMA2X2_LOWG_HYST__REG BMA2X2_LOW_HIGH_HYST_REG + +#define BMA2X2_LOWG_INT_MODE__POS 2 +#define BMA2X2_LOWG_INT_MODE__LEN 1 +#define BMA2X2_LOWG_INT_MODE__MSK 0x04 +#define BMA2X2_LOWG_INT_MODE__REG BMA2X2_LOW_HIGH_HYST_REG + +#define BMA2X2_HIGHG_DUR__POS 0 +#define BMA2X2_HIGHG_DUR__LEN 8 +#define BMA2X2_HIGHG_DUR__MSK 0xFF +#define BMA2X2_HIGHG_DUR__REG BMA2X2_HIGH_DURN_REG + +#define BMA2X2_HIGHG_THRES__POS 0 +#define BMA2X2_HIGHG_THRES__LEN 8 +#define BMA2X2_HIGHG_THRES__MSK 0xFF +#define BMA2X2_HIGHG_THRES__REG BMA2X2_HIGH_THRES_REG + +#define BMA2X2_HIGHG_HYST__POS 6 +#define BMA2X2_HIGHG_HYST__LEN 2 +#define BMA2X2_HIGHG_HYST__MSK 0xC0 +#define BMA2X2_HIGHG_HYST__REG BMA2X2_LOW_HIGH_HYST_REG + +#define BMA2X2_SLOPE_DUR__POS 0 +#define BMA2X2_SLOPE_DUR__LEN 2 +#define BMA2X2_SLOPE_DUR__MSK 0x03 +#define BMA2X2_SLOPE_DUR__REG BMA2X2_SLOPE_DURN_REG + +#define BMA2X2_SLO_NO_MOT_DUR__POS 2 +#define BMA2X2_SLO_NO_MOT_DUR__LEN 6 +#define BMA2X2_SLO_NO_MOT_DUR__MSK 0xFC +#define BMA2X2_SLO_NO_MOT_DUR__REG BMA2X2_SLOPE_DURN_REG + +#define BMA2X2_SLOPE_THRES__POS 0 +#define BMA2X2_SLOPE_THRES__LEN 8 +#define BMA2X2_SLOPE_THRES__MSK 0xFF +#define BMA2X2_SLOPE_THRES__REG BMA2X2_SLOPE_THRES_REG + +#define BMA2X2_SLO_NO_MOT_THRES__POS 0 +#define BMA2X2_SLO_NO_MOT_THRES__LEN 8 +#define BMA2X2_SLO_NO_MOT_THRES__MSK 0xFF +#define BMA2X2_SLO_NO_MOT_THRES__REG BMA2X2_SLO_NO_MOT_THRES_REG + +#define BMA2X2_TAP_DUR__POS 0 +#define BMA2X2_TAP_DUR__LEN 3 +#define BMA2X2_TAP_DUR__MSK 0x07 +#define BMA2X2_TAP_DUR__REG BMA2X2_TAP_PARAM_REG + +#define BMA2X2_TAP_SHOCK_DURN__POS 6 +#define BMA2X2_TAP_SHOCK_DURN__LEN 1 +#define BMA2X2_TAP_SHOCK_DURN__MSK 0x40 +#define BMA2X2_TAP_SHOCK_DURN__REG BMA2X2_TAP_PARAM_REG + +#define BMA2X2_ADV_TAP_INT__POS 5 +#define BMA2X2_ADV_TAP_INT__LEN 1 +#define BMA2X2_ADV_TAP_INT__MSK 0x20 +#define BMA2X2_ADV_TAP_INT__REG BMA2X2_TAP_PARAM_REG + +#define BMA2X2_TAP_QUIET_DURN__POS 7 +#define BMA2X2_TAP_QUIET_DURN__LEN 1 +#define BMA2X2_TAP_QUIET_DURN__MSK 0x80 +#define BMA2X2_TAP_QUIET_DURN__REG BMA2X2_TAP_PARAM_REG + +#define BMA2X2_TAP_THRES__POS 0 +#define BMA2X2_TAP_THRES__LEN 5 +#define BMA2X2_TAP_THRES__MSK 0x1F +#define BMA2X2_TAP_THRES__REG BMA2X2_TAP_THRES_REG + +#define BMA2X2_TAP_SAMPLES__POS 6 +#define BMA2X2_TAP_SAMPLES__LEN 2 +#define BMA2X2_TAP_SAMPLES__MSK 0xC0 +#define BMA2X2_TAP_SAMPLES__REG BMA2X2_TAP_THRES_REG + +#define BMA2X2_ORIENT_MODE__POS 0 +#define BMA2X2_ORIENT_MODE__LEN 2 +#define BMA2X2_ORIENT_MODE__MSK 0x03 +#define BMA2X2_ORIENT_MODE__REG BMA2X2_ORIENT_PARAM_REG + +#define BMA2X2_ORIENT_BLOCK__POS 2 +#define BMA2X2_ORIENT_BLOCK__LEN 2 +#define BMA2X2_ORIENT_BLOCK__MSK 0x0C +#define BMA2X2_ORIENT_BLOCK__REG BMA2X2_ORIENT_PARAM_REG + +#define BMA2X2_ORIENT_HYST__POS 4 +#define BMA2X2_ORIENT_HYST__LEN 3 +#define BMA2X2_ORIENT_HYST__MSK 0x70 +#define BMA2X2_ORIENT_HYST__REG BMA2X2_ORIENT_PARAM_REG + +#define BMA2X2_ORIENT_AXIS__POS 7 +#define BMA2X2_ORIENT_AXIS__LEN 1 +#define BMA2X2_ORIENT_AXIS__MSK 0x80 +#define BMA2X2_ORIENT_AXIS__REG BMA2X2_THETA_BLOCK_REG + +#define BMA2X2_ORIENT_UD_EN__POS 6 +#define BMA2X2_ORIENT_UD_EN__LEN 1 +#define BMA2X2_ORIENT_UD_EN__MSK 0x40 +#define BMA2X2_ORIENT_UD_EN__REG BMA2X2_THETA_BLOCK_REG + +#define BMA2X2_THETA_BLOCK__POS 0 +#define BMA2X2_THETA_BLOCK__LEN 6 +#define BMA2X2_THETA_BLOCK__MSK 0x3F +#define BMA2X2_THETA_BLOCK__REG BMA2X2_THETA_BLOCK_REG + +#define BMA2X2_THETA_FLAT__POS 0 +#define BMA2X2_THETA_FLAT__LEN 6 +#define BMA2X2_THETA_FLAT__MSK 0x3F +#define BMA2X2_THETA_FLAT__REG BMA2X2_THETA_FLAT_REG + +#define BMA2X2_FLAT_HOLD_TIME__POS 4 +#define BMA2X2_FLAT_HOLD_TIME__LEN 2 +#define BMA2X2_FLAT_HOLD_TIME__MSK 0x30 +#define BMA2X2_FLAT_HOLD_TIME__REG BMA2X2_FLAT_HOLD_TIME_REG + +#define BMA2X2_FLAT_HYS__POS 0 +#define BMA2X2_FLAT_HYS__LEN 3 +#define BMA2X2_FLAT_HYS__MSK 0x07 +#define BMA2X2_FLAT_HYS__REG BMA2X2_FLAT_HOLD_TIME_REG + +#define BMA2X2_FIFO_WML_TRIG_RETAIN__POS 0 +#define BMA2X2_FIFO_WML_TRIG_RETAIN__LEN 6 +#define BMA2X2_FIFO_WML_TRIG_RETAIN__MSK 0x3F +#define BMA2X2_FIFO_WML_TRIG_RETAIN__REG BMA2X2_FIFO_WML_TRIG + +#define BMA2X2_EN_SELF_TEST__POS 0 +#define BMA2X2_EN_SELF_TEST__LEN 2 +#define BMA2X2_EN_SELF_TEST__MSK 0x03 +#define BMA2X2_EN_SELF_TEST__REG BMA2X2_SELF_TEST_REG + +#define BMA2X2_NEG_SELF_TEST__POS 2 +#define BMA2X2_NEG_SELF_TEST__LEN 1 +#define BMA2X2_NEG_SELF_TEST__MSK 0x04 +#define BMA2X2_NEG_SELF_TEST__REG BMA2X2_SELF_TEST_REG + +#define BMA2X2_SELF_TEST_AMP__POS 4 +#define BMA2X2_SELF_TEST_AMP__LEN 1 +#define BMA2X2_SELF_TEST_AMP__MSK 0x10 +#define BMA2X2_SELF_TEST_AMP__REG BMA2X2_SELF_TEST_REG + + +#define BMA2X2_UNLOCK_EE_PROG_MODE__POS 0 +#define BMA2X2_UNLOCK_EE_PROG_MODE__LEN 1 +#define BMA2X2_UNLOCK_EE_PROG_MODE__MSK 0x01 +#define BMA2X2_UNLOCK_EE_PROG_MODE__REG BMA2X2_EEPROM_CTRL_REG + +#define BMA2X2_START_EE_PROG_TRIG__POS 1 +#define BMA2X2_START_EE_PROG_TRIG__LEN 1 +#define BMA2X2_START_EE_PROG_TRIG__MSK 0x02 +#define BMA2X2_START_EE_PROG_TRIG__REG BMA2X2_EEPROM_CTRL_REG + +#define BMA2X2_EE_PROG_READY__POS 2 +#define BMA2X2_EE_PROG_READY__LEN 1 +#define BMA2X2_EE_PROG_READY__MSK 0x04 +#define BMA2X2_EE_PROG_READY__REG BMA2X2_EEPROM_CTRL_REG + +#define BMA2X2_UPDATE_IMAGE__POS 3 +#define BMA2X2_UPDATE_IMAGE__LEN 1 +#define BMA2X2_UPDATE_IMAGE__MSK 0x08 +#define BMA2X2_UPDATE_IMAGE__REG BMA2X2_EEPROM_CTRL_REG + +#define BMA2X2_EE_REMAIN__POS 4 +#define BMA2X2_EE_REMAIN__LEN 4 +#define BMA2X2_EE_REMAIN__MSK 0xF0 +#define BMA2X2_EE_REMAIN__REG BMA2X2_EEPROM_CTRL_REG + +#define BMA2X2_EN_SPI_MODE_3__POS 0 +#define BMA2X2_EN_SPI_MODE_3__LEN 1 +#define BMA2X2_EN_SPI_MODE_3__MSK 0x01 +#define BMA2X2_EN_SPI_MODE_3__REG BMA2X2_SERIAL_CTRL_REG + +#define BMA2X2_I2C_WATCHDOG_PERIOD__POS 1 +#define BMA2X2_I2C_WATCHDOG_PERIOD__LEN 1 +#define BMA2X2_I2C_WATCHDOG_PERIOD__MSK 0x02 +#define BMA2X2_I2C_WATCHDOG_PERIOD__REG BMA2X2_SERIAL_CTRL_REG + +#define BMA2X2_EN_I2C_WATCHDOG__POS 2 +#define BMA2X2_EN_I2C_WATCHDOG__LEN 1 +#define BMA2X2_EN_I2C_WATCHDOG__MSK 0x04 +#define BMA2X2_EN_I2C_WATCHDOG__REG BMA2X2_SERIAL_CTRL_REG + +#define BMA2X2_EXT_MODE__POS 7 +#define BMA2X2_EXT_MODE__LEN 1 +#define BMA2X2_EXT_MODE__MSK 0x80 +#define BMA2X2_EXT_MODE__REG BMA2X2_EXTMODE_CTRL_REG + +#define BMA2X2_ALLOW_UPPER__POS 6 +#define BMA2X2_ALLOW_UPPER__LEN 1 +#define BMA2X2_ALLOW_UPPER__MSK 0x40 +#define BMA2X2_ALLOW_UPPER__REG BMA2X2_EXTMODE_CTRL_REG + +#define BMA2X2_MAP_2_LOWER__POS 5 +#define BMA2X2_MAP_2_LOWER__LEN 1 +#define BMA2X2_MAP_2_LOWER__MSK 0x20 +#define BMA2X2_MAP_2_LOWER__REG BMA2X2_EXTMODE_CTRL_REG + +#define BMA2X2_MAGIC_NUMBER__POS 0 +#define BMA2X2_MAGIC_NUMBER__LEN 5 +#define BMA2X2_MAGIC_NUMBER__MSK 0x1F +#define BMA2X2_MAGIC_NUMBER__REG BMA2X2_EXTMODE_CTRL_REG + +#define BMA2X2_UNLOCK_EE_WRITE_TRIM__POS 4 +#define BMA2X2_UNLOCK_EE_WRITE_TRIM__LEN 4 +#define BMA2X2_UNLOCK_EE_WRITE_TRIM__MSK 0xF0 +#define BMA2X2_UNLOCK_EE_WRITE_TRIM__REG BMA2X2_CTRL_UNLOCK_REG + +#define BMA2X2_EN_SLOW_COMP_X__POS 0 +#define BMA2X2_EN_SLOW_COMP_X__LEN 1 +#define BMA2X2_EN_SLOW_COMP_X__MSK 0x01 +#define BMA2X2_EN_SLOW_COMP_X__REG BMA2X2_OFFSET_CTRL_REG + +#define BMA2X2_EN_SLOW_COMP_Y__POS 1 +#define BMA2X2_EN_SLOW_COMP_Y__LEN 1 +#define BMA2X2_EN_SLOW_COMP_Y__MSK 0x02 +#define BMA2X2_EN_SLOW_COMP_Y__REG BMA2X2_OFFSET_CTRL_REG + +#define BMA2X2_EN_SLOW_COMP_Z__POS 2 +#define BMA2X2_EN_SLOW_COMP_Z__LEN 1 +#define BMA2X2_EN_SLOW_COMP_Z__MSK 0x04 +#define BMA2X2_EN_SLOW_COMP_Z__REG BMA2X2_OFFSET_CTRL_REG + +#define BMA2X2_FAST_CAL_RDY_S__POS 4 +#define BMA2X2_FAST_CAL_RDY_S__LEN 1 +#define BMA2X2_FAST_CAL_RDY_S__MSK 0x10 +#define BMA2X2_FAST_CAL_RDY_S__REG BMA2X2_OFFSET_CTRL_REG + +#define BMA2X2_CAL_TRIGGER__POS 5 +#define BMA2X2_CAL_TRIGGER__LEN 2 +#define BMA2X2_CAL_TRIGGER__MSK 0x60 +#define BMA2X2_CAL_TRIGGER__REG BMA2X2_OFFSET_CTRL_REG + +#define BMA2X2_RESET_OFFSET_REGS__POS 7 +#define BMA2X2_RESET_OFFSET_REGS__LEN 1 +#define BMA2X2_RESET_OFFSET_REGS__MSK 0x80 +#define BMA2X2_RESET_OFFSET_REGS__REG BMA2X2_OFFSET_CTRL_REG + +#define BMA2X2_COMP_CUTOFF__POS 0 +#define BMA2X2_COMP_CUTOFF__LEN 1 +#define BMA2X2_COMP_CUTOFF__MSK 0x01 +#define BMA2X2_COMP_CUTOFF__REG BMA2X2_OFFSET_PARAMS_REG + +#define BMA2X2_COMP_TARGET_OFFSET_X__POS 1 +#define BMA2X2_COMP_TARGET_OFFSET_X__LEN 2 +#define BMA2X2_COMP_TARGET_OFFSET_X__MSK 0x06 +#define BMA2X2_COMP_TARGET_OFFSET_X__REG BMA2X2_OFFSET_PARAMS_REG + +#define BMA2X2_COMP_TARGET_OFFSET_Y__POS 3 +#define BMA2X2_COMP_TARGET_OFFSET_Y__LEN 2 +#define BMA2X2_COMP_TARGET_OFFSET_Y__MSK 0x18 +#define BMA2X2_COMP_TARGET_OFFSET_Y__REG BMA2X2_OFFSET_PARAMS_REG + +#define BMA2X2_COMP_TARGET_OFFSET_Z__POS 5 +#define BMA2X2_COMP_TARGET_OFFSET_Z__LEN 2 +#define BMA2X2_COMP_TARGET_OFFSET_Z__MSK 0x60 +#define BMA2X2_COMP_TARGET_OFFSET_Z__REG BMA2X2_OFFSET_PARAMS_REG + +#define BMA2X2_FIFO_DATA_SELECT__POS 0 +#define BMA2X2_FIFO_DATA_SELECT__LEN 2 +#define BMA2X2_FIFO_DATA_SELECT__MSK 0x03 +#define BMA2X2_FIFO_DATA_SELECT__REG BMA2X2_FIFO_MODE_REG + +#define BMA2X2_FIFO_TRIGGER_SOURCE__POS 2 +#define BMA2X2_FIFO_TRIGGER_SOURCE__LEN 2 +#define BMA2X2_FIFO_TRIGGER_SOURCE__MSK 0x0C +#define BMA2X2_FIFO_TRIGGER_SOURCE__REG BMA2X2_FIFO_MODE_REG + +#define BMA2X2_FIFO_TRIGGER_ACTION__POS 4 +#define BMA2X2_FIFO_TRIGGER_ACTION__LEN 2 +#define BMA2X2_FIFO_TRIGGER_ACTION__MSK 0x30 +#define BMA2X2_FIFO_TRIGGER_ACTION__REG BMA2X2_FIFO_MODE_REG + +#define BMA2X2_FIFO_MODE__POS 6 +#define BMA2X2_FIFO_MODE__LEN 2 +#define BMA2X2_FIFO_MODE__MSK 0xC0 +#define BMA2X2_FIFO_MODE__REG BMA2X2_FIFO_MODE_REG + + +#define BMA2X2_STATUS1 0 +#define BMA2X2_STATUS2 1 +#define BMA2X2_STATUS3 2 +#define BMA2X2_STATUS4 3 +#define BMA2X2_STATUS5 4 + + +#define BMA2X2_RANGE_2G 3 +#define BMA2X2_RANGE_4G 5 +#define BMA2X2_RANGE_8G 8 +#define BMA2X2_RANGE_16G 12 + + +#define BMA2X2_BW_7_81HZ 0x08 +#define BMA2X2_BW_15_63HZ 0x09 +#define BMA2X2_BW_31_25HZ 0x0A +#define BMA2X2_BW_62_50HZ 0x0B +#define BMA2X2_BW_125HZ 0x0C +#define BMA2X2_BW_250HZ 0x0D +#define BMA2X2_BW_500HZ 0x0E +#define BMA2X2_BW_1000HZ 0x0F + +#define BMA2X2_SLEEP_DUR_0_5MS 0x05 +#define BMA2X2_SLEEP_DUR_1MS 0x06 +#define BMA2X2_SLEEP_DUR_2MS 0x07 +#define BMA2X2_SLEEP_DUR_4MS 0x08 +#define BMA2X2_SLEEP_DUR_6MS 0x09 +#define BMA2X2_SLEEP_DUR_10MS 0x0A +#define BMA2X2_SLEEP_DUR_25MS 0x0B +#define BMA2X2_SLEEP_DUR_50MS 0x0C +#define BMA2X2_SLEEP_DUR_100MS 0x0D +#define BMA2X2_SLEEP_DUR_500MS 0x0E +#define BMA2X2_SLEEP_DUR_1S 0x0F + +#define BMA2X2_LATCH_DUR_NON_LATCH 0x00 +#define BMA2X2_LATCH_DUR_250MS 0x01 +#define BMA2X2_LATCH_DUR_500MS 0x02 +#define BMA2X2_LATCH_DUR_1S 0x03 +#define BMA2X2_LATCH_DUR_2S 0x04 +#define BMA2X2_LATCH_DUR_4S 0x05 +#define BMA2X2_LATCH_DUR_8S 0x06 +#define BMA2X2_LATCH_DUR_LATCH 0x07 +#define BMA2X2_LATCH_DUR_NON_LATCH1 0x08 +#define BMA2X2_LATCH_DUR_250US 0x09 +#define BMA2X2_LATCH_DUR_500US 0x0A +#define BMA2X2_LATCH_DUR_1MS 0x0B +#define BMA2X2_LATCH_DUR_12_5MS 0x0C +#define BMA2X2_LATCH_DUR_25MS 0x0D +#define BMA2X2_LATCH_DUR_50MS 0x0E +#define BMA2X2_LATCH_DUR_LATCH1 0x0F + +#define BMA2X2_MODE_NORMAL 0 +#define BMA2X2_MODE_LOWPOWER1 1 +#define BMA2X2_MODE_SUSPEND 2 +#define BMA2X2_MODE_DEEP_SUSPEND 3 +#define BMA2X2_MODE_LOWPOWER2 4 +#define BMA2X2_MODE_STANDBY 5 + +#define BMA2X2_X_AXIS 0 +#define BMA2X2_Y_AXIS 1 +#define BMA2X2_Z_AXIS 2 + +#define BMA2X2_Low_G_Interrupt 0 +#define BMA2X2_High_G_X_Interrupt 1 +#define BMA2X2_High_G_Y_Interrupt 2 +#define BMA2X2_High_G_Z_Interrupt 3 +#define BMA2X2_DATA_EN 4 +#define BMA2X2_Slope_X_Interrupt 5 +#define BMA2X2_Slope_Y_Interrupt 6 +#define BMA2X2_Slope_Z_Interrupt 7 +#define BMA2X2_Single_Tap_Interrupt 8 +#define BMA2X2_Double_Tap_Interrupt 9 +#define BMA2X2_Orient_Interrupt 10 +#define BMA2X2_Flat_Interrupt 11 +#define BMA2X2_FFULL_INTERRUPT 12 +#define BMA2X2_FWM_INTERRUPT 13 + +#define BMA2X2_INT1_LOWG 0 +#define BMA2X2_INT2_LOWG 1 +#define BMA2X2_INT1_HIGHG 0 +#define BMA2X2_INT2_HIGHG 1 +#define BMA2X2_INT1_SLOPE 0 +#define BMA2X2_INT2_SLOPE 1 +#define BMA2X2_INT1_SLO_NO_MOT 0 +#define BMA2X2_INT2_SLO_NO_MOT 1 +#define BMA2X2_INT1_DTAP 0 +#define BMA2X2_INT2_DTAP 1 +#define BMA2X2_INT1_STAP 0 +#define BMA2X2_INT2_STAP 1 +#define BMA2X2_INT1_ORIENT 0 +#define BMA2X2_INT2_ORIENT 1 +#define BMA2X2_INT1_FLAT 0 +#define BMA2X2_INT2_FLAT 1 +#define BMA2X2_INT1_NDATA 0 +#define BMA2X2_INT2_NDATA 1 +#define BMA2X2_INT1_FWM 0 +#define BMA2X2_INT2_FWM 1 +#define BMA2X2_INT1_FFULL 0 +#define BMA2X2_INT2_FFULL 1 + +#define BMA2X2_SRC_LOWG 0 +#define BMA2X2_SRC_HIGHG 1 +#define BMA2X2_SRC_SLOPE 2 +#define BMA2X2_SRC_SLO_NO_MOT 3 +#define BMA2X2_SRC_TAP 4 +#define BMA2X2_SRC_DATA 5 + +#define BMA2X2_INT1_OUTPUT 0 +#define BMA2X2_INT2_OUTPUT 1 +#define BMA2X2_INT1_LEVEL 0 +#define BMA2X2_INT2_LEVEL 1 + +#define BMA2X2_LOW_DURATION 0 +#define BMA2X2_HIGH_DURATION 1 +#define BMA2X2_SLOPE_DURATION 2 +#define BMA2X2_SLO_NO_MOT_DURATION 3 + +#define BMA2X2_LOW_THRESHOLD 0 +#define BMA2X2_HIGH_THRESHOLD 1 +#define BMA2X2_SLOPE_THRESHOLD 2 +#define BMA2X2_SLO_NO_MOT_THRESHOLD 3 + + +#define BMA2X2_LOWG_HYST 0 +#define BMA2X2_HIGHG_HYST 1 + +#define BMA2X2_ORIENT_THETA 0 +#define BMA2X2_FLAT_THETA 1 + +#define BMA2X2_I2C_SELECT 0 +#define BMA2X2_I2C_EN 1 + +#define BMA2X2_SLOW_COMP_X 0 +#define BMA2X2_SLOW_COMP_Y 1 +#define BMA2X2_SLOW_COMP_Z 2 + +#define BMA2X2_CUT_OFF 0 +#define BMA2X2_OFFSET_TRIGGER_X 1 +#define BMA2X2_OFFSET_TRIGGER_Y 2 +#define BMA2X2_OFFSET_TRIGGER_Z 3 + +#define BMA2X2_GP0 0 +#define BMA2X2_GP1 1 + +#define BMA2X2_SLO_NO_MOT_EN_X 0 +#define BMA2X2_SLO_NO_MOT_EN_Y 1 +#define BMA2X2_SLO_NO_MOT_EN_Z 2 +#define BMA2X2_SLO_NO_MOT_EN_SEL 3 + +#define BMA2X2_WAKE_UP_DUR_20MS 0 +#define BMA2X2_WAKE_UP_DUR_80MS 1 +#define BMA2X2_WAKE_UP_DUR_320MS 2 +#define BMA2X2_WAKE_UP_DUR_2560MS 3 + +#define BMA2X2_SELF_TEST0_ON 1 +#define BMA2X2_SELF_TEST1_ON 2 + +#define BMA2X2_EE_W_OFF 0 +#define BMA2X2_EE_W_ON 1 + +#define BMA2X2_LOW_TH_IN_G(gthres, range) ((256 * gthres) / range) + + +#define BMA2X2_HIGH_TH_IN_G(gthres, range) ((256 * gthres) / range) + + +#define BMA2X2_LOW_HY_IN_G(ghyst, range) ((32 * ghyst) / range) + + +#define BMA2X2_HIGH_HY_IN_G(ghyst, range) ((32 * ghyst) / range) + + +#define BMA2X2_SLOPE_TH_IN_G(gthres, range) ((128 * gthres) / range) + + +#define BMA2X2_GET_BITSLICE(regvar, bitname)\ + ((regvar & bitname##__MSK) >> bitname##__POS) + + +#define BMA2X2_SET_BITSLICE(regvar, bitname, val)\ + ((regvar & ~bitname##__MSK) | ((val<f_pos = %d\n", (int)filp->f_pos); + // vfs_write(filp, bufs, strlen(bufs), &filp->f_pos); + // printk("filp->f_pos = %d\n", (int)filp->f_pos); + + /* read example */ + printk(KERN_DEBUG); + + // int pos = (int)filp->f_pos; + printk(KERN_ERR"filp->f_pos=%d \n: ", (int)filp->f_pos); + memset(bufs,'\n',60); + ret = vfs_read(filp, bufs, 60, &filp->f_pos); + printk(KERN_ERR"char_cnt =%d \n: ", ret); + + if (ret != 0) { + printk(KERN_ERR"filp->f_pos=%d\n", (int)filp->f_pos); + } + printk("\n"); + + ret= sscanf(bufs,"%10d\n",&data_val); + printk(KERN_ERR"data_val=%d\n", data_val); + filp_close(filp, NULL); /* filp_close(filp, current->files) ? */ + /* restore kernel memory setting */ + + set_fs(old_fs); + return data_val; +} + +static void bst_remap_sensor_data(struct bosch_sensor_data *data, + const struct bosch_sensor_axis_remap *remap) +{ + struct bosch_sensor_data tmp; + + tmp.x = data->v[remap->src_x] * remap->sign_x; + tmp.y = data->v[remap->src_y] * remap->sign_y; + tmp.z = data->v[remap->src_z] * remap->sign_z; + + memcpy(data, &tmp, sizeof(*data)); +} + +static void bst_remap_sensor_data_dft_tab(struct bosch_sensor_data *data, + int place) +{ + /* sensor with place 0 needs not to be remapped */ + if ((place <= 0) || (place >= MAX_AXIS_REMAP_TAB_SZ)) + return; + + bst_remap_sensor_data(data, &bst_axis_remap_tab_dft[place]); +} + +static void bma2x2_remap_sensor_data(struct bma2x2acc *val, + struct bma2x2_data *client_data) +{ + struct bosch_sensor_data bsd; + int place; + + if ((NULL == client_data->bst_pd) || (BOSCH_SENSOR_PLACE_UNKNOWN + == client_data->bst_pd->place)) + place = BOSCH_SENSOR_PLACE_UNKNOWN; + else + place = client_data->bst_pd->place; + +#ifdef CONFIG_SENSORS_BMI058 +/*x,y need to be invesed becase of HW Register for BMI058*/ + bsd.y = val->x; + bsd.x = val->y; + bsd.z = val->z; +#else + bsd.x = val->x; + bsd.y = val->y; + bsd.z = val->z; +#endif + + bst_remap_sensor_data_dft_tab(&bsd, place); + + val->x = bsd.x; + val->y = bsd.y; + val->z = bsd.z; + +} + + +static int bma2x2_smbus_read_byte(struct i2c_client *client, + unsigned char reg_addr, unsigned char *data) +{ + s32 dummy; + dummy = i2c_smbus_read_byte_data(client, reg_addr); + if (dummy < 0) + return -1; + *data = dummy & 0x000000ff; + + return 0; +} + +static int bma2x2_smbus_write_byte(struct i2c_client *client, + unsigned char reg_addr, unsigned char *data) +{ + s32 dummy; + + dummy = i2c_smbus_write_byte_data(client, reg_addr, *data); + if (dummy < 0) + return -1; + udelay(2); + return 0; +} + +static int bma2x2_smbus_read_byte_block(struct i2c_client *client, + unsigned char reg_addr, unsigned char *data, unsigned char len) +{ + s32 dummy; + dummy = i2c_smbus_read_i2c_block_data(client, reg_addr, len, data); + if (dummy < 0) + return -1; + return 0; +} + +static int bma_i2c_burst_read(struct i2c_client *client, u8 reg_addr, + u8 *data, u16 len) +{ + int retry; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = ®_addr, + }, + + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len, + .buf = data, + }, + }; + + for (retry = 0; retry < BMA_MAX_RETRY_I2C_XFER; retry++) { + if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) > 0) + break; + else + mdelay(1); + } + + if (BMA_MAX_RETRY_I2C_XFER <= retry) { + PINFO("I2C xfer error"); + return -EIO; + } + + return 0; +} + +static int bma2x2_check_chip_id(struct i2c_client *client, + struct bma2x2_data *data) +{ + int i = 0; + int err = 0; + unsigned char chip_id = 0; + unsigned char read_count = 0; + unsigned char bma2x2_sensor_type_count = 0; + + bma2x2_sensor_type_count = + sizeof(sensor_type_map) / sizeof(struct bma2x2_type_map_t); + + while (read_count++ < CHECK_CHIP_ID_TIME_MAX) { + if (bma2x2_smbus_read_byte(client, BMA2X2_CHIP_ID_REG, + &chip_id) < 0) { + PERR("Bosch Sensortec Device not found" + "i2c bus read error, read chip_id:%d\n", chip_id); + continue; + } else { + for (i = 0; i < bma2x2_sensor_type_count; i++) { + if (sensor_type_map[i].chip_id == chip_id) { + data->sensor_type = + sensor_type_map[i].sensor_type; + data->chip_id = chip_id; + PINFO("Bosch Sensortec Device detected," + " HW IC name: %s\n", + sensor_type_map[i].sensor_name); + return err; + } + } + if (i < bma2x2_sensor_type_count) + return err; + else { + if (read_count == CHECK_CHIP_ID_TIME_MAX) { + PERR("Failed! Bosch Sensortec Device" + " not found, mismatch chip_id:%d\n", + chip_id); + err = -ENODEV; + return err; + } + } + mdelay(1); + } + } + return err; +} + +#ifdef CONFIG_BMA_ENABLE_NEWDATA_INT +static int bma2x2_set_newdata(struct i2c_client *client, + unsigned char channel, unsigned char int_newdata) +{ + + unsigned char data = 0; + int comres = 0; + + switch (channel) { + case BMA2X2_INT1_NDATA: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_NEWDATA__REG, &data); + data = BMA2X2_SET_BITSLICE(data, + BMA2X2_EN_INT1_PAD_NEWDATA, int_newdata); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_NEWDATA__REG, &data); + break; + case BMA2X2_INT2_NDATA: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_NEWDATA__REG, &data); + data = BMA2X2_SET_BITSLICE(data, + BMA2X2_EN_INT2_PAD_NEWDATA, int_newdata); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_NEWDATA__REG, &data); + break; + default: + comres = -1; + break; + } + + return comres; + +} +#endif /* CONFIG_BMA_ENABLE_NEWDATA_INT */ + +#ifdef BMA2X2_ENABLE_INT1 +static int bma2x2_set_int1_pad_sel(struct i2c_client *client, unsigned char + int1sel) +{ + int comres = 0; + unsigned char data = 0; + unsigned char state; + state = 0x01; + + switch (int1sel) { + case 0: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_LOWG__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_LOWG, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_LOWG__REG, &data); + break; + case 1: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_HIGHG__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_HIGHG, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_HIGHG__REG, &data); + break; + case 2: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_SLOPE__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SLOPE, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_SLOPE__REG, &data); + break; + case 3: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_DB_TAP__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_DB_TAP, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_DB_TAP__REG, &data); + break; + case 4: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_SNG_TAP__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SNG_TAP, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_SNG_TAP__REG, &data); + break; + case 5: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_ORIENT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_ORIENT, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_ORIENT__REG, &data); + break; + case 6: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_FLAT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_FLAT, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_FLAT__REG, &data); + break; + case 7: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SLO_NO_MOT, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG, &data); + break; + + default: + break; + } + + return comres; +} +#endif /* BMA2X2_ENABLE_INT1 */ + +#ifdef BMA2X2_ENABLE_INT2 +static int bma2x2_set_int2_pad_sel(struct i2c_client *client, unsigned char + int2sel) +{ + int comres = 0; + unsigned char data = 0; + unsigned char state; + state = 0x01; + + + switch (int2sel) { + case 0: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_LOWG__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_LOWG, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_LOWG__REG, &data); + break; + case 1: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_HIGHG__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_HIGHG, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_HIGHG__REG, &data); + break; + case 2: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_SLOPE__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SLOPE, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_SLOPE__REG, &data); + break; + case 3: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_DB_TAP__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_DB_TAP, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_DB_TAP__REG, &data); + break; + case 4: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_SNG_TAP__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SNG_TAP, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_SNG_TAP__REG, &data); + break; + case 5: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_ORIENT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_ORIENT, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_ORIENT__REG, &data); + break; + case 6: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_FLAT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_FLAT, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_FLAT__REG, &data); + break; + case 7: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SLO_NO_MOT, + state); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG, &data); + break; + default: + break; + } + + return comres; +} +#endif /* BMA2X2_ENABLE_INT2 */ + +static int bma2x2_set_Int_Enable(struct i2c_client *client, unsigned char + InterruptType , unsigned char value) +{ + int comres = 0; + unsigned char data1 = 0; + unsigned char data2 = 0; + + if ((11 < InterruptType) && (InterruptType < 16)) { + switch (InterruptType) { + case 12: + /* slow/no motion X Interrupt */ + comres = bma2x2_smbus_read_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_X_INT__REG, &data1); + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_INT_SLO_NO_MOT_EN_X_INT, value); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_X_INT__REG, &data1); + break; + case 13: + /* slow/no motion Y Interrupt */ + comres = bma2x2_smbus_read_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__REG, &data1); + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_INT_SLO_NO_MOT_EN_Y_INT, value); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__REG, &data1); + break; + case 14: + /* slow/no motion Z Interrupt */ + comres = bma2x2_smbus_read_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__REG, &data1); + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_INT_SLO_NO_MOT_EN_Z_INT, value); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__REG, &data1); + break; + case 15: + /* slow / no motion Interrupt select */ + comres = bma2x2_smbus_read_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__REG, &data1); + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT, value); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__REG, &data1); + } + + return comres; + } + + + comres = bma2x2_smbus_read_byte(client, BMA2X2_INT_ENABLE1_REG, &data1); + comres = bma2x2_smbus_read_byte(client, BMA2X2_INT_ENABLE2_REG, &data2); + + value = value & 1; + switch (InterruptType) { + case 0: + /* Low G Interrupt */ + data2 = BMA2X2_SET_BITSLICE(data2, BMA2X2_EN_LOWG_INT, value); + break; + + case 1: + /* High G X Interrupt */ + data2 = BMA2X2_SET_BITSLICE(data2, BMA2X2_EN_HIGHG_X_INT, + value); + break; + + case 2: + /* High G Y Interrupt */ + data2 = BMA2X2_SET_BITSLICE(data2, BMA2X2_EN_HIGHG_Y_INT, + value); + break; + + case 3: + /* High G Z Interrupt */ + data2 = BMA2X2_SET_BITSLICE(data2, BMA2X2_EN_HIGHG_Z_INT, + value); + break; + + case 4: + /* New Data Interrupt */ + data2 = BMA2X2_SET_BITSLICE(data2, BMA2X2_EN_NEW_DATA_INT, + value); + break; + + case 5: + /* Slope X Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_SLOPE_X_INT, + value); + break; + + case 6: + /* Slope Y Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_SLOPE_Y_INT, + value); + break; + + case 7: + /* Slope Z Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_SLOPE_Z_INT, + value); + break; + + case 8: + /* Single Tap Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_SINGLE_TAP_INT, + value); + break; + + case 9: + /* Double Tap Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_DOUBLE_TAP_INT, + value); + break; + + case 10: + /* Orient Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_ORIENT_INT, value); + break; + + case 11: + /* Flat Interrupt */ + data1 = BMA2X2_SET_BITSLICE(data1, BMA2X2_EN_FLAT_INT, value); + break; + + default: + break; + } + comres = bma2x2_smbus_write_byte(client, BMA2X2_INT_ENABLE1_REG, + &data1); + comres = bma2x2_smbus_write_byte(client, BMA2X2_INT_ENABLE2_REG, + &data2); + + return comres; +} + + +#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2) +static int bma2x2_get_interruptstatus1(struct i2c_client *client, unsigned char + *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_STATUS1_REG, &data); + *intstatus = data; + + return comres; +} + +#ifdef CONFIG_BMA_ENABLE_NEWDATA_INT +static int bma2x2_get_interruptstatus2(struct i2c_client *client, unsigned char + *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_STATUS2_REG, &data); + *intstatus = data; + + return comres; +} +#endif + +static int bma2x2_get_HIGH_first(struct i2c_client *client, unsigned char + param, unsigned char *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + switch (param) { + case 0: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_STATUS_ORIENT_HIGH_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_X); + *intstatus = data; + break; + case 1: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_STATUS_ORIENT_HIGH_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_Y); + *intstatus = data; + break; + case 2: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_STATUS_ORIENT_HIGH_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_Z); + *intstatus = data; + break; + default: + break; + } + + return comres; +} + +static int bma2x2_get_HIGH_sign(struct i2c_client *client, unsigned char + *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_STATUS_ORIENT_HIGH_REG, + &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_SIGN_S); + *intstatus = data; + + return comres; +} + +#ifndef CONFIG_SIG_MOTION +static int bma2x2_get_slope_first(struct i2c_client *client, unsigned char + param, unsigned char *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + switch (param) { + case 0: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_STATUS_TAP_SLOPE_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_X); + *intstatus = data; + break; + case 1: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_STATUS_TAP_SLOPE_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_Y); + *intstatus = data; + break; + case 2: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_STATUS_TAP_SLOPE_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_Z); + *intstatus = data; + break; + default: + break; + } + + return comres; +} + +static int bma2x2_get_slope_sign(struct i2c_client *client, unsigned char + *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_STATUS_TAP_SLOPE_REG, + &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_SIGN_S); + *intstatus = data; + + return comres; +} +#endif + +static int bma2x2_get_orient_status(struct i2c_client *client, unsigned char + *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_STATUS_ORIENT_HIGH_REG, + &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_ORIENT_S); + *intstatus = data; + + return comres; +} + +static int bma2x2_get_orient_flat_status(struct i2c_client *client, unsigned + char *intstatus) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_STATUS_ORIENT_HIGH_REG, + &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_FLAT_S); + *intstatus = data; + + return comres; +} +#endif /* defined(BMA2X2_ENABLE_INT1)||defined(BMA2X2_ENABLE_INT2) */ + +static int bma2x2_set_Int_Mode(struct i2c_client *client, unsigned char Mode) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_INT_MODE_SEL__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_INT_MODE_SEL, Mode); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_INT_MODE_SEL__REG, &data); + + + return comres; +} + +static int bma2x2_get_Int_Mode(struct i2c_client *client, unsigned char *Mode) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_INT_MODE_SEL__REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_INT_MODE_SEL); + *Mode = data; + + + return comres; +} +static int bma2x2_set_slope_duration(struct i2c_client *client, unsigned char + duration) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_SLOPE_DUR__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_SLOPE_DUR, duration); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_SLOPE_DUR__REG, &data); + + return comres; +} + +static int bma2x2_get_slope_duration(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_SLOPE_DURN_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_DUR); + *status = data; + + + return comres; +} + +static int bma2x2_set_slope_no_mot_duration(struct i2c_client *client, + unsigned char duration) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2x2_SLO_NO_MOT_DUR__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2x2_SLO_NO_MOT_DUR, duration); + comres = bma2x2_smbus_write_byte(client, + BMA2x2_SLO_NO_MOT_DUR__REG, &data); + + + return comres; +} + +static int bma2x2_get_slope_no_mot_duration(struct i2c_client *client, + unsigned char *status) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2x2_SLO_NO_MOT_DUR__REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2x2_SLO_NO_MOT_DUR); + *status = data; + + + return comres; +} + +static int bma2x2_set_slope_threshold(struct i2c_client *client, + unsigned char threshold) +{ + int comres = 0; + unsigned char data = 0; + + data = threshold; + comres = bma2x2_smbus_write_byte(client, + BMA2X2_SLOPE_THRES__REG, &data); + + return comres; +} + +static int bma2x2_get_slope_threshold(struct i2c_client *client, + unsigned char *status) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_SLOPE_THRES_REG, &data); + *status = data; + + return comres; +} + +static int bma2x2_set_slope_no_mot_threshold(struct i2c_client *client, + unsigned char threshold) +{ + int comres = 0; + unsigned char data = 0; + + data = threshold; + comres = bma2x2_smbus_write_byte(client, + BMA2X2_SLO_NO_MOT_THRES_REG, &data); + + return comres; +} + +static int bma2x2_get_slope_no_mot_threshold(struct i2c_client *client, + unsigned char *status) +{ + int comres = 0; + unsigned char data = 0; + + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_SLO_NO_MOT_THRES_REG, &data); + *status = data; + + return comres; +} + + +static int bma2x2_set_low_g_duration(struct i2c_client *client, unsigned char + duration) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_LOWG_DUR__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_LOWG_DUR, duration); + comres = bma2x2_smbus_write_byte(client, BMA2X2_LOWG_DUR__REG, &data); + + return comres; +} + +static int bma2x2_get_low_g_duration(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_LOW_DURN_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_LOWG_DUR); + *status = data; + + return comres; +} + +static int bma2x2_set_low_g_threshold(struct i2c_client *client, unsigned char + threshold) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_LOWG_THRES__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_LOWG_THRES, threshold); + comres = bma2x2_smbus_write_byte(client, BMA2X2_LOWG_THRES__REG, &data); + + return comres; +} + +static int bma2x2_get_low_g_threshold(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_LOW_THRES_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_LOWG_THRES); + *status = data; + + return comres; +} + +static int bma2x2_set_high_g_duration(struct i2c_client *client, unsigned char + duration) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_HIGHG_DUR__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_HIGHG_DUR, duration); + comres = bma2x2_smbus_write_byte(client, BMA2X2_HIGHG_DUR__REG, &data); + + return comres; +} + +static int bma2x2_get_high_g_duration(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_HIGH_DURN_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_DUR); + *status = data; + + return comres; +} + +static int bma2x2_set_high_g_threshold(struct i2c_client *client, unsigned char + threshold) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_HIGHG_THRES__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_HIGHG_THRES, threshold); + comres = bma2x2_smbus_write_byte(client, BMA2X2_HIGHG_THRES__REG, + &data); + + return comres; +} + +static int bma2x2_get_high_g_threshold(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_HIGH_THRES_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_THRES); + *status = data; + + return comres; +} + + +static int bma2x2_set_tap_duration(struct i2c_client *client, unsigned char + duration) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_DUR__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_TAP_DUR, duration); + comres = bma2x2_smbus_write_byte(client, BMA2X2_TAP_DUR__REG, &data); + + return comres; +} + +static int bma2x2_get_tap_duration(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_PARAM_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_TAP_DUR); + *status = data; + + return comres; +} + +static int bma2x2_set_tap_shock(struct i2c_client *client, unsigned char setval) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_SHOCK_DURN__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_TAP_SHOCK_DURN, setval); + comres = bma2x2_smbus_write_byte(client, BMA2X2_TAP_SHOCK_DURN__REG, + &data); + + return comres; +} + +static int bma2x2_get_tap_shock(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_PARAM_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_TAP_SHOCK_DURN); + *status = data; + + return comres; +} + +static int bma2x2_set_tap_quiet(struct i2c_client *client, unsigned char + duration) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_QUIET_DURN__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_TAP_QUIET_DURN, duration); + comres = bma2x2_smbus_write_byte(client, BMA2X2_TAP_QUIET_DURN__REG, + &data); + + return comres; +} + +static int bma2x2_get_tap_quiet(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_PARAM_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_TAP_QUIET_DURN); + *status = data; + + return comres; +} + +static int bma2x2_set_tap_threshold(struct i2c_client *client, unsigned char + threshold) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_THRES__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_TAP_THRES, threshold); + comres = bma2x2_smbus_write_byte(client, BMA2X2_TAP_THRES__REG, &data); + + return comres; +} + +static int bma2x2_get_tap_threshold(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_THRES_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_TAP_THRES); + *status = data; + + return comres; +} + +static int bma2x2_set_tap_samp(struct i2c_client *client, unsigned char samp) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_SAMPLES__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_TAP_SAMPLES, samp); + comres = bma2x2_smbus_write_byte(client, BMA2X2_TAP_SAMPLES__REG, + &data); + + return comres; +} + +static int bma2x2_get_tap_samp(struct i2c_client *client, unsigned char *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TAP_THRES_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_TAP_SAMPLES); + *status = data; + + return comres; +} + +static int bma2x2_set_orient_mode(struct i2c_client *client, unsigned char mode) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_ORIENT_MODE__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_ORIENT_MODE, mode); + comres = bma2x2_smbus_write_byte(client, BMA2X2_ORIENT_MODE__REG, + &data); + + return comres; +} + +static int bma2x2_get_orient_mode(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_ORIENT_PARAM_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_ORIENT_MODE); + *status = data; + + return comres; +} + +static int bma2x2_set_orient_blocking(struct i2c_client *client, unsigned char + samp) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_ORIENT_BLOCK__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_ORIENT_BLOCK, samp); + comres = bma2x2_smbus_write_byte(client, BMA2X2_ORIENT_BLOCK__REG, + &data); + + return comres; +} + +static int bma2x2_get_orient_blocking(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_ORIENT_PARAM_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_ORIENT_BLOCK); + *status = data; + + return comres; +} + +static int bma2x2_set_orient_hyst(struct i2c_client *client, unsigned char + orienthyst) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_ORIENT_HYST__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_ORIENT_HYST, orienthyst); + comres = bma2x2_smbus_write_byte(client, BMA2X2_ORIENT_HYST__REG, + &data); + + return comres; +} + +static int bma2x2_get_orient_hyst(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_ORIENT_PARAM_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_ORIENT_HYST); + *status = data; + + return comres; +} +static int bma2x2_set_theta_blocking(struct i2c_client *client, unsigned char + thetablk) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_THETA_BLOCK__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_THETA_BLOCK, thetablk); + comres = bma2x2_smbus_write_byte(client, BMA2X2_THETA_BLOCK__REG, + &data); + + return comres; +} + +static int bma2x2_get_theta_blocking(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_THETA_BLOCK_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_THETA_BLOCK); + *status = data; + + return comres; +} + +static int bma2x2_set_theta_flat(struct i2c_client *client, unsigned char + thetaflat) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_THETA_FLAT__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_THETA_FLAT, thetaflat); + comres = bma2x2_smbus_write_byte(client, BMA2X2_THETA_FLAT__REG, &data); + + return comres; +} + +static int bma2x2_get_theta_flat(struct i2c_client *client, unsigned char + *status) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_THETA_FLAT_REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_THETA_FLAT); + *status = data; + + return comres; +} + +static int bma2x2_set_flat_hold_time(struct i2c_client *client, unsigned char + holdtime) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_FLAT_HOLD_TIME__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_FLAT_HOLD_TIME, holdtime); + comres = bma2x2_smbus_write_byte(client, BMA2X2_FLAT_HOLD_TIME__REG, + &data); + + return comres; +} + +static int bma2x2_get_flat_hold_time(struct i2c_client *client, unsigned char + *holdtime) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_FLAT_HOLD_TIME_REG, + &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_FLAT_HOLD_TIME); + *holdtime = data; + + return comres; +} + +/*! + * brief: bma2x2 switch from normal to suspend mode + * @param[i] bma2x2 + * @param[i] data1, write to PMU_LPW + * @param[i] data2, write to PMU_LOW_NOSIE + * + * @return zero success, none-zero failed + */ +static int bma2x2_normal_to_suspend(struct bma2x2_data *bma2x2, + unsigned char data1, unsigned char data2) +{ + unsigned char current_fifo_mode; + unsigned char current_op_mode; + if (bma2x2 == NULL) + return -1; + /* get current op mode from mode register */ + if (bma2x2_get_mode(bma2x2->bma2x2_client, ¤t_op_mode) < 0) + return -1; + /* only aimed at operatiom mode chang from normal/lpw1 mode + * to suspend state. + */ + if (current_op_mode == BMA2X2_MODE_NORMAL || + current_op_mode == BMA2X2_MODE_LOWPOWER1) { + /* get current fifo mode from fifo config register */ + if (bma2x2_get_fifo_mode(bma2x2->bma2x2_client, + ¤t_fifo_mode) < 0) + return -1; + else { + bma2x2_smbus_write_byte(bma2x2->bma2x2_client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + bma2x2_smbus_write_byte(bma2x2->bma2x2_client, + BMA2X2_MODE_CTRL_REG, &data1); + bma2x2_smbus_write_byte(bma2x2->bma2x2_client, + BMA2X2_FIFO_MODE__REG, ¤t_fifo_mode); + mdelay(3); + return 0; + } + } else { + bma2x2_smbus_write_byte(bma2x2->bma2x2_client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + bma2x2_smbus_write_byte(bma2x2->bma2x2_client, + BMA2X2_MODE_CTRL_REG, &data1); + mdelay(3); + return 0; + } + +} + +static int bma2x2_set_mode(struct i2c_client *client, unsigned char mode, + unsigned char enabled_mode) +{ + int comres = 0; + unsigned char data1 = 0; + unsigned char data2 = 0; + int ret = 0; + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + mutex_lock(&bma2x2->mode_mutex); + if (BMA2X2_MODE_SUSPEND == mode) { + if (enabled_mode != BMA_ENABLED_ALL) { + if ((bma2x2->bma_mode_enabled & + (1<mode_mutex); + return 0; + } else { + bma2x2->bma_mode_enabled &= ~(1<bma_mode_enabled = 0; + } + } else if (BMA2X2_MODE_NORMAL == mode) { + if ((bma2x2->bma_mode_enabled & (1<mode_mutex); + return 0; + } else { + bma2x2->bma_mode_enabled |= (1<bma_mode_enabled = 0; + } + mutex_unlock(&bma2x2->mode_mutex); + + if (mode < 6) { + comres = bma2x2_smbus_read_byte(client, BMA2X2_MODE_CTRL_REG, + &data1); + comres = bma2x2_smbus_read_byte(client, + BMA2X2_LOW_NOISE_CTRL_REG, + &data2); + switch (mode) { + case BMA2X2_MODE_NORMAL: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_MODE_CTRL, 0); + data2 = BMA2X2_SET_BITSLICE(data2, + BMA2X2_LOW_POWER_MODE, 0); + bma2x2_smbus_write_byte(client, + BMA2X2_MODE_CTRL_REG, &data1); + mdelay(3); + bma2x2_smbus_write_byte(client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + break; + case BMA2X2_MODE_LOWPOWER1: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_MODE_CTRL, 2); + data2 = BMA2X2_SET_BITSLICE(data2, + BMA2X2_LOW_POWER_MODE, 0); + bma2x2_smbus_write_byte(client, + BMA2X2_MODE_CTRL_REG, &data1); + mdelay(3); + bma2x2_smbus_write_byte(client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + break; + case BMA2X2_MODE_SUSPEND: + if (bma2x2->bma_mode_enabled != 0) { + PERR("bma still working"); + return 0; + } + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_MODE_CTRL, 4); + data2 = BMA2X2_SET_BITSLICE(data2, + BMA2X2_LOW_POWER_MODE, 0); + /*aimed at anomaly resolution when switch to suspend*/ + ret = bma2x2_normal_to_suspend(bma2x2, data1, data2); + if (ret < 0) + PERR("Error switching to suspend"); + break; + case BMA2X2_MODE_DEEP_SUSPEND: + if (bma2x2->bma_mode_enabled != 0) { + PERR("bma still working"); + return 0; + } + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_MODE_CTRL, 1); + data2 = BMA2X2_SET_BITSLICE(data2, + BMA2X2_LOW_POWER_MODE, 1); + bma2x2_smbus_write_byte(client, + BMA2X2_MODE_CTRL_REG, &data1); + mdelay(3); + bma2x2_smbus_write_byte(client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + break; + case BMA2X2_MODE_LOWPOWER2: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_MODE_CTRL, 2); + data2 = BMA2X2_SET_BITSLICE(data2, + BMA2X2_LOW_POWER_MODE, 1); + bma2x2_smbus_write_byte(client, + BMA2X2_MODE_CTRL_REG, &data1); + mdelay(3); + bma2x2_smbus_write_byte(client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + break; + case BMA2X2_MODE_STANDBY: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_MODE_CTRL, 4); + data2 = BMA2X2_SET_BITSLICE(data2, + BMA2X2_LOW_POWER_MODE, 1); + bma2x2_smbus_write_byte(client, + BMA2X2_LOW_NOISE_CTRL_REG, &data2); + mdelay(3); + bma2x2_smbus_write_byte(client, + BMA2X2_MODE_CTRL_REG, &data1); + break; + } + } else { + comres = -1; + } + + return comres; +} + + +static int bma2x2_get_mode(struct i2c_client *client, unsigned char *mode) +{ + int comres = 0; + unsigned char data1 = 0; + unsigned char data2 = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_MODE_CTRL_REG, &data1); + comres = bma2x2_smbus_read_byte(client, BMA2X2_LOW_NOISE_CTRL_REG, + &data2); + + data1 = (data1 & 0xE0) >> 5; + data2 = (data2 & 0x40) >> 6; + + + if ((data1 == 0x00) && (data2 == 0x00)) { + *mode = BMA2X2_MODE_NORMAL; + } else { + if ((data1 == 0x02) && (data2 == 0x00)) { + *mode = BMA2X2_MODE_LOWPOWER1; + } else { + if ((data1 == 0x04 || data1 == 0x06) && + (data2 == 0x00)) { + *mode = BMA2X2_MODE_SUSPEND; + } else { + if (((data1 & 0x01) == 0x01)) { + *mode = BMA2X2_MODE_DEEP_SUSPEND; + } else { + if ((data1 == 0x02) && + (data2 == 0x01)) { + *mode = BMA2X2_MODE_LOWPOWER2; + } else { + if ((data1 == 0x04) && (data2 == + 0x01)) { + *mode = + BMA2X2_MODE_STANDBY; + } else { + *mode = + BMA2X2_MODE_DEEP_SUSPEND; + } + } + } + } + } + } + + return comres; +} + +static int bma2x2_set_range(struct i2c_client *client, unsigned char Range) +{ + int comres = 0; + unsigned char data1 = 0; + + if ((Range == 3) || (Range == 5) || (Range == 8) || (Range == 12)) { + comres = bma2x2_smbus_read_byte(client, BMA2X2_RANGE_SEL_REG, + &data1); + switch (Range) { + case BMA2X2_RANGE_2G: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_RANGE_SEL, 3); + break; + case BMA2X2_RANGE_4G: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_RANGE_SEL, 5); + break; + case BMA2X2_RANGE_8G: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_RANGE_SEL, 8); + break; + case BMA2X2_RANGE_16G: + data1 = BMA2X2_SET_BITSLICE(data1, + BMA2X2_RANGE_SEL, 12); + break; + default: + break; + } + comres += bma2x2_smbus_write_byte(client, BMA2X2_RANGE_SEL_REG, + &data1); + } else { + comres = -1; + } + + return comres; +} + +static int bma2x2_get_range(struct i2c_client *client, unsigned char *Range) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_RANGE_SEL__REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_RANGE_SEL); + *Range = data; + + return comres; +} + + +static int bma2x2_set_bandwidth(struct i2c_client *client, unsigned char BW) +{ + int comres = 0; + unsigned char data = 0; + int Bandwidth = 0; + + if (BW > 7 && BW < 16) { + switch (BW) { + case BMA2X2_BW_7_81HZ: + Bandwidth = BMA2X2_BW_7_81HZ; + + /* 7.81 Hz 64000 uS */ + break; + case BMA2X2_BW_15_63HZ: + Bandwidth = BMA2X2_BW_15_63HZ; + + /* 15.63 Hz 32000 uS */ + break; + case BMA2X2_BW_31_25HZ: + Bandwidth = BMA2X2_BW_31_25HZ; + + /* 31.25 Hz 16000 uS */ + break; + case BMA2X2_BW_62_50HZ: + Bandwidth = BMA2X2_BW_62_50HZ; + + /* 62.50 Hz 8000 uS */ + break; + case BMA2X2_BW_125HZ: + Bandwidth = BMA2X2_BW_125HZ; + + /* 125 Hz 4000 uS */ + break; + case BMA2X2_BW_250HZ: + Bandwidth = BMA2X2_BW_250HZ; + + /* 250 Hz 2000 uS */ + break; + case BMA2X2_BW_500HZ: + Bandwidth = BMA2X2_BW_500HZ; + + /* 500 Hz 1000 uS */ + break; + case BMA2X2_BW_1000HZ: + Bandwidth = BMA2X2_BW_1000HZ; + + /* 1000 Hz 500 uS */ + break; + default: + break; + } + comres = bma2x2_smbus_read_byte(client, BMA2X2_BANDWIDTH__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_BANDWIDTH, Bandwidth); + comres += bma2x2_smbus_write_byte(client, BMA2X2_BANDWIDTH__REG, + &data); + } else { + comres = -1; + } + + return comres; +} + +static int bma2x2_get_bandwidth(struct i2c_client *client, unsigned char *BW) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_BANDWIDTH__REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_BANDWIDTH); + *BW = data; + + return comres; +} + +int bma2x2_get_sleep_duration(struct i2c_client *client, unsigned char + *sleep_dur) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_SLEEP_DUR__REG, &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLEEP_DUR); + *sleep_dur = data; + + return comres; +} + +int bma2x2_set_sleep_duration(struct i2c_client *client, unsigned char + sleep_dur) +{ + int comres = 0; + unsigned char data = 0; + int sleep_duration = 0; + + if (sleep_dur > 4 && sleep_dur < 16) { + switch (sleep_dur) { + case BMA2X2_SLEEP_DUR_0_5MS: + sleep_duration = BMA2X2_SLEEP_DUR_0_5MS; + + /* 0.5 MS */ + break; + case BMA2X2_SLEEP_DUR_1MS: + sleep_duration = BMA2X2_SLEEP_DUR_1MS; + + /* 1 MS */ + break; + case BMA2X2_SLEEP_DUR_2MS: + sleep_duration = BMA2X2_SLEEP_DUR_2MS; + + /* 2 MS */ + break; + case BMA2X2_SLEEP_DUR_4MS: + sleep_duration = BMA2X2_SLEEP_DUR_4MS; + + /* 4 MS */ + break; + case BMA2X2_SLEEP_DUR_6MS: + sleep_duration = BMA2X2_SLEEP_DUR_6MS; + + /* 6 MS */ + break; + case BMA2X2_SLEEP_DUR_10MS: + sleep_duration = BMA2X2_SLEEP_DUR_10MS; + + /* 10 MS */ + break; + case BMA2X2_SLEEP_DUR_25MS: + sleep_duration = BMA2X2_SLEEP_DUR_25MS; + + /* 25 MS */ + break; + case BMA2X2_SLEEP_DUR_50MS: + sleep_duration = BMA2X2_SLEEP_DUR_50MS; + + /* 50 MS */ + break; + case BMA2X2_SLEEP_DUR_100MS: + sleep_duration = BMA2X2_SLEEP_DUR_100MS; + + /* 100 MS */ + break; + case BMA2X2_SLEEP_DUR_500MS: + sleep_duration = BMA2X2_SLEEP_DUR_500MS; + + /* 500 MS */ + break; + case BMA2X2_SLEEP_DUR_1S: + sleep_duration = BMA2X2_SLEEP_DUR_1S; + + /* 1 SECS */ + break; + default: + break; + } + comres = bma2x2_smbus_read_byte(client, BMA2X2_SLEEP_DUR__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_SLEEP_DUR, + sleep_duration); + comres = bma2x2_smbus_write_byte(client, BMA2X2_SLEEP_DUR__REG, + &data); + } else { + comres = -1; + } + + + return comres; +} + +static int bma2x2_get_fifo_mode(struct i2c_client *client, unsigned char + *fifo_mode) +{ + int comres; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_FIFO_MODE__REG, &data); + *fifo_mode = BMA2X2_GET_BITSLICE(data, BMA2X2_FIFO_MODE); + + return comres; +} + +static int bma2x2_set_fifo_mode(struct i2c_client *client, unsigned char + fifo_mode) +{ + unsigned char data = 0; + int comres = 0; + + if (fifo_mode < 4) { + comres = bma2x2_smbus_read_byte(client, BMA2X2_FIFO_MODE__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_FIFO_MODE, fifo_mode); + comres = bma2x2_smbus_write_byte(client, BMA2X2_FIFO_MODE__REG, + &data); + } else { + comres = -1; + } + + return comres; +} + +static int bma2x2_get_fifo_trig(struct i2c_client *client, unsigned char + *fifo_trig) +{ + int comres; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_TRIGGER_ACTION__REG, &data); + *fifo_trig = BMA2X2_GET_BITSLICE(data, BMA2X2_FIFO_TRIGGER_ACTION); + + return comres; +} + +static int bma2x2_set_fifo_trig(struct i2c_client *client, unsigned char + fifo_trig) +{ + unsigned char data = 0; + int comres = 0; + + if (fifo_trig < 4) { + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_TRIGGER_ACTION__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_FIFO_TRIGGER_ACTION, + fifo_trig); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_FIFO_TRIGGER_ACTION__REG, &data); + } else { + comres = -1; + } + + return comres; +} + +static int bma2x2_get_fifo_trig_src(struct i2c_client *client, unsigned char + *trig_src) +{ + int comres; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_TRIGGER_SOURCE__REG, &data); + *trig_src = BMA2X2_GET_BITSLICE(data, BMA2X2_FIFO_TRIGGER_SOURCE); + + return comres; +} + +static int bma2x2_set_fifo_trig_src(struct i2c_client *client, unsigned char + trig_src) +{ + unsigned char data = 0; + int comres = 0; + + if (trig_src < 4) { + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_TRIGGER_SOURCE__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_FIFO_TRIGGER_SOURCE, + trig_src); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_FIFO_TRIGGER_SOURCE__REG, &data); + } else { + comres = -1; + } + + return comres; +} + +static int bma2x2_get_fifo_framecount(struct i2c_client *client, unsigned char + *framecount) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_FRAME_COUNTER_S__REG, &data); + *framecount = BMA2X2_GET_BITSLICE(data, BMA2X2_FIFO_FRAME_COUNTER_S); + + return comres; +} + +static int bma2x2_get_fifo_data_sel(struct i2c_client *client, unsigned char + *data_sel) +{ + int comres; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_DATA_SELECT__REG, &data); + *data_sel = BMA2X2_GET_BITSLICE(data, BMA2X2_FIFO_DATA_SELECT); + + return comres; +} + +static int bma2x2_set_fifo_data_sel(struct i2c_client *client, unsigned char + data_sel) +{ + unsigned char data = 0; + int comres = 0; + + if (data_sel < 4) { + comres = bma2x2_smbus_read_byte(client, + BMA2X2_FIFO_DATA_SELECT__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_FIFO_DATA_SELECT, + data_sel); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_FIFO_DATA_SELECT__REG, + &data); + } else { + comres = -1; + } + + return comres; +} + + +static int bma2x2_get_offset_target(struct i2c_client *client, unsigned char + channel, unsigned char *offset) +{ + unsigned char data = 0; + int comres = 0; + + switch (channel) { + case BMA2X2_CUT_OFF: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_CUTOFF__REG, &data); + *offset = BMA2X2_GET_BITSLICE(data, BMA2X2_COMP_CUTOFF); + break; + case BMA2X2_OFFSET_TRIGGER_X: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_TARGET_OFFSET_X__REG, &data); + *offset = BMA2X2_GET_BITSLICE(data, + BMA2X2_COMP_TARGET_OFFSET_X); + break; + case BMA2X2_OFFSET_TRIGGER_Y: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_TARGET_OFFSET_Y__REG, &data); + *offset = BMA2X2_GET_BITSLICE(data, + BMA2X2_COMP_TARGET_OFFSET_Y); + break; + case BMA2X2_OFFSET_TRIGGER_Z: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_TARGET_OFFSET_Z__REG, &data); + *offset = BMA2X2_GET_BITSLICE(data, + BMA2X2_COMP_TARGET_OFFSET_Z); + break; + default: + comres = -1; + break; + } + + return comres; +} + +static int bma2x2_set_offset_target(struct i2c_client *client, unsigned char + channel, unsigned char offset) +{ + unsigned char data = 0; + int comres = 0; + + switch (channel) { + case BMA2X2_CUT_OFF: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_CUTOFF__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_COMP_CUTOFF, + offset); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_COMP_CUTOFF__REG, &data); + break; + case BMA2X2_OFFSET_TRIGGER_X: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_TARGET_OFFSET_X__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, + BMA2X2_COMP_TARGET_OFFSET_X, + offset); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_COMP_TARGET_OFFSET_X__REG, + &data); + break; + case BMA2X2_OFFSET_TRIGGER_Y: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_TARGET_OFFSET_Y__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, + BMA2X2_COMP_TARGET_OFFSET_Y, + offset); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_COMP_TARGET_OFFSET_Y__REG, + &data); + break; + case BMA2X2_OFFSET_TRIGGER_Z: + comres = bma2x2_smbus_read_byte(client, + BMA2X2_COMP_TARGET_OFFSET_Z__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, + BMA2X2_COMP_TARGET_OFFSET_Z, + offset); + comres = bma2x2_smbus_write_byte(client, + BMA2X2_COMP_TARGET_OFFSET_Z__REG, + &data); + break; + default: + comres = -1; + break; + } + + return comres; +} + +static int bma2x2_get_cal_ready(struct i2c_client *client, + unsigned char *calrdy) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_FAST_CAL_RDY_S__REG, + &data); + data = BMA2X2_GET_BITSLICE(data, BMA2X2_FAST_CAL_RDY_S); + *calrdy = data; + + return comres; +} + +static int bma2x2_set_cal_trigger(struct i2c_client *client, unsigned char + caltrigger) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_CAL_TRIGGER__REG, &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_CAL_TRIGGER, caltrigger); + comres = bma2x2_smbus_write_byte(client, BMA2X2_CAL_TRIGGER__REG, + &data); + + return comres; +} + +static int bma2x2_write_reg(struct i2c_client *client, unsigned char addr, + unsigned char *data) +{ + int comres = 0; + comres = bma2x2_smbus_write_byte(client, addr, data); + + return comres; +} + + +static int bma2x2_set_offset_x(struct i2c_client *client, unsigned char + offsetfilt) +{ + int comres = 0; + unsigned char data = 0; + + data = offsetfilt; + +#ifdef CONFIG_SENSORS_BMI058 + comres = bma2x2_smbus_write_byte(client, BMI058_OFFSET_X_AXIS_REG, + &data); +#else + comres = bma2x2_smbus_write_byte(client, BMA2X2_OFFSET_X_AXIS_REG, + &data); +#endif + + return comres; +} + + +static int bma2x2_get_offset_x(struct i2c_client *client, unsigned char + *offsetfilt) +{ + int comres = 0; + unsigned char data = 0; + +#ifdef CONFIG_SENSORS_BMI058 + comres = bma2x2_smbus_read_byte(client, BMI058_OFFSET_X_AXIS_REG, + &data); +#else + comres = bma2x2_smbus_read_byte(client, BMA2X2_OFFSET_X_AXIS_REG, + &data); +#endif + *offsetfilt = data; + + return comres; +} + +static int bma2x2_set_offset_y(struct i2c_client *client, unsigned char + offsetfilt) +{ + int comres = 0; + unsigned char data = 0; + + data = offsetfilt; + +#ifdef CONFIG_SENSORS_BMI058 + comres = bma2x2_smbus_write_byte(client, BMI058_OFFSET_Y_AXIS_REG, + &data); +#else + comres = bma2x2_smbus_write_byte(client, BMA2X2_OFFSET_Y_AXIS_REG, + &data); +#endif + return comres; +} + +static int bma2x2_get_offset_y(struct i2c_client *client, unsigned char + *offsetfilt) +{ + int comres = 0; + unsigned char data = 0; + +#ifdef CONFIG_SENSORS_BMI058 + comres = bma2x2_smbus_read_byte(client, BMI058_OFFSET_Y_AXIS_REG, + &data); +#else + comres = bma2x2_smbus_read_byte(client, BMA2X2_OFFSET_Y_AXIS_REG, + &data); +#endif + *offsetfilt = data; + + return comres; +} + +static int bma2x2_set_offset_z(struct i2c_client *client, unsigned char + offsetfilt) +{ + int comres = 0; + unsigned char data = 0; + + data = offsetfilt; + comres = bma2x2_smbus_write_byte(client, BMA2X2_OFFSET_Z_AXIS_REG, + &data); + + return comres; +} + +static int bma2x2_get_offset_z(struct i2c_client *client, unsigned char + *offsetfilt) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_OFFSET_Z_AXIS_REG, + &data); + *offsetfilt = data; + + return comres; +} + + +static int bma2x2_set_selftest_st(struct i2c_client *client, unsigned char + selftest) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_EN_SELF_TEST__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_SELF_TEST, selftest); + comres = bma2x2_smbus_write_byte(client, BMA2X2_EN_SELF_TEST__REG, + &data); + + return comres; +} + +static int bma2x2_set_selftest_stn(struct i2c_client *client, unsigned char stn) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_NEG_SELF_TEST__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_NEG_SELF_TEST, stn); + comres = bma2x2_smbus_write_byte(client, BMA2X2_NEG_SELF_TEST__REG, + &data); + + return comres; +} + +static int bma2x2_set_selftest_amp(struct i2c_client *client, unsigned char amp) +{ + int comres = 0; + unsigned char data = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_SELF_TEST_AMP__REG, + &data); + data = BMA2X2_SET_BITSLICE(data, BMA2X2_SELF_TEST_AMP, amp); + comres = bma2x2_smbus_write_byte(client, BMA2X2_SELF_TEST_AMP__REG, + &data); + + return comres; +} + +static int bma2x2_read_accel_x(struct i2c_client *client, + signed char sensor_type, short *a_x) +{ + int comres = 0; + unsigned char data[2]; + + switch (sensor_type) { + case 0: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_X12_LSB__REG, data, 2); + *a_x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X12_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_X_MSB)<<(BMA2X2_ACC_X12_LSB__LEN)); + *a_x = *a_x << (sizeof(short)*8-(BMA2X2_ACC_X12_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + *a_x = *a_x >> (sizeof(short)*8-(BMA2X2_ACC_X12_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + break; + case 1: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_X10_LSB__REG, data, 2); + *a_x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X10_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_X_MSB)<<(BMA2X2_ACC_X10_LSB__LEN)); + *a_x = *a_x << (sizeof(short)*8-(BMA2X2_ACC_X10_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + *a_x = *a_x >> (sizeof(short)*8-(BMA2X2_ACC_X10_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + break; + case 2: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_X8_LSB__REG, data, 2); + *a_x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X8_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_X_MSB)<<(BMA2X2_ACC_X8_LSB__LEN)); + *a_x = *a_x << (sizeof(short)*8-(BMA2X2_ACC_X8_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + *a_x = *a_x >> (sizeof(short)*8-(BMA2X2_ACC_X8_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + break; + case 3: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_X14_LSB__REG, data, 2); + *a_x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X14_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_X_MSB)<<(BMA2X2_ACC_X14_LSB__LEN)); + *a_x = *a_x << (sizeof(short)*8-(BMA2X2_ACC_X14_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + *a_x = *a_x >> (sizeof(short)*8-(BMA2X2_ACC_X14_LSB__LEN + + BMA2X2_ACC_X_MSB__LEN)); + break; + default: + break; + } + + return comres; +} + +static int bma2x2_soft_reset(struct i2c_client *client) +{ + int comres = 0; + unsigned char data = BMA2X2_EN_SOFT_RESET_VALUE; + + comres = bma2x2_smbus_write_byte(client, BMA2X2_EN_SOFT_RESET__REG, + &data); + + return comres; +} + +static int bma2x2_read_accel_y(struct i2c_client *client, + signed char sensor_type, short *a_y) +{ + int comres = 0; + unsigned char data[2]; + + switch (sensor_type) { + case 0: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Y12_LSB__REG, data, 2); + *a_y = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Y12_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Y_MSB)<<(BMA2X2_ACC_Y12_LSB__LEN)); + *a_y = *a_y << (sizeof(short)*8-(BMA2X2_ACC_Y12_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + *a_y = *a_y >> (sizeof(short)*8-(BMA2X2_ACC_Y12_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + break; + case 1: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Y10_LSB__REG, data, 2); + *a_y = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Y10_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Y_MSB)<<(BMA2X2_ACC_Y10_LSB__LEN)); + *a_y = *a_y << (sizeof(short)*8-(BMA2X2_ACC_Y10_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + *a_y = *a_y >> (sizeof(short)*8-(BMA2X2_ACC_Y10_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + break; + case 2: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Y8_LSB__REG, data, 2); + *a_y = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Y8_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Y_MSB)<<(BMA2X2_ACC_Y8_LSB__LEN)); + *a_y = *a_y << (sizeof(short)*8-(BMA2X2_ACC_Y8_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + *a_y = *a_y >> (sizeof(short)*8-(BMA2X2_ACC_Y8_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + break; + case 3: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Y14_LSB__REG, data, 2); + *a_y = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Y14_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Y_MSB)<<(BMA2X2_ACC_Y14_LSB__LEN)); + *a_y = *a_y << (sizeof(short)*8-(BMA2X2_ACC_Y14_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + *a_y = *a_y >> (sizeof(short)*8-(BMA2X2_ACC_Y14_LSB__LEN + + BMA2X2_ACC_Y_MSB__LEN)); + break; + default: + break; + } + + return comres; +} + +static int bma2x2_read_accel_z(struct i2c_client *client, + signed char sensor_type, short *a_z) +{ + int comres = 0; + unsigned char data[2]; + + switch (sensor_type) { + case 0: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Z12_LSB__REG, data, 2); + *a_z = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Z12_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Z_MSB)<<(BMA2X2_ACC_Z12_LSB__LEN)); + *a_z = *a_z << (sizeof(short)*8-(BMA2X2_ACC_Z12_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + *a_z = *a_z >> (sizeof(short)*8-(BMA2X2_ACC_Z12_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + break; + case 1: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Z10_LSB__REG, data, 2); + *a_z = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Z10_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Z_MSB)<<(BMA2X2_ACC_Z10_LSB__LEN)); + *a_z = *a_z << (sizeof(short)*8-(BMA2X2_ACC_Z10_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + *a_z = *a_z >> (sizeof(short)*8-(BMA2X2_ACC_Z10_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + break; + case 2: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Z8_LSB__REG, data, 2); + *a_z = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Z8_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Z_MSB)<<(BMA2X2_ACC_Z8_LSB__LEN)); + *a_z = *a_z << (sizeof(short)*8-(BMA2X2_ACC_Z8_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + *a_z = *a_z >> (sizeof(short)*8-(BMA2X2_ACC_Z8_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + break; + case 3: + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_Z14_LSB__REG, data, 2); + *a_z = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_Z14_LSB)| + (BMA2X2_GET_BITSLICE(data[1], + BMA2X2_ACC_Z_MSB)<<(BMA2X2_ACC_Z14_LSB__LEN)); + *a_z = *a_z << (sizeof(short)*8-(BMA2X2_ACC_Z14_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + *a_z = *a_z >> (sizeof(short)*8-(BMA2X2_ACC_Z14_LSB__LEN + + BMA2X2_ACC_Z_MSB__LEN)); + break; + default: + break; + } + + return comres; +} + + +static int bma2x2_read_temperature(struct i2c_client *client, + signed char *temperature) +{ + unsigned char data = 0; + int comres = 0; + + comres = bma2x2_smbus_read_byte(client, BMA2X2_TEMPERATURE_REG, &data); + *temperature = (signed char)data; + + return comres; +} + +static ssize_t bma2x2_enable_int_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int type, value; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); +#ifdef CONFIG_SENSORS_BMI058 + int i; +#endif + + sscanf(buf, "%3d %3d", &type, &value); + +#ifdef CONFIG_SENSORS_BMI058 + for (i = 0; i < sizeof(int_map) / sizeof(struct interrupt_map_t); i++) { + if (int_map[i].x == type) { + type = int_map[i].y; + break; + } + if (int_map[i].y == type) { + type = int_map[i].x; + break; + } + } +#endif + + if (bma2x2_set_Int_Enable(bma2x2->bma2x2_client, type, value) < 0) + return -EINVAL; + + return count; +} + + +static ssize_t bma2x2_int_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_Int_Mode(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t bma2x2_int_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_Int_Mode(bma2x2->bma2x2_client, (unsigned char)data) < 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_slope_duration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_slope_duration(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_slope_duration_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_slope_duration(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_slope_no_mot_duration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_slope_no_mot_duration(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_slope_no_mot_duration_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_slope_no_mot_duration(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + + +static ssize_t bma2x2_slope_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_slope_threshold(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_slope_threshold_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_slope_threshold(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_slope_no_mot_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_slope_no_mot_threshold(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_slope_no_mot_threshold_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_slope_no_mot_threshold(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_high_g_duration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_high_g_duration(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_high_g_duration_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_high_g_duration(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_high_g_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_high_g_threshold(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_high_g_threshold_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_high_g_threshold(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_low_g_duration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_low_g_duration(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_low_g_duration_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_low_g_duration(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_low_g_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_low_g_threshold(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_low_g_threshold_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_low_g_threshold(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_tap_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_tap_threshold(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_tap_threshold_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_tap_threshold(bma2x2->bma2x2_client, (unsigned char)data) + < 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_tap_duration_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_tap_duration(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_tap_duration_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_tap_duration(bma2x2->bma2x2_client, (unsigned char)data) + < 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_tap_quiet_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_tap_quiet(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_tap_quiet_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_tap_quiet(bma2x2->bma2x2_client, (unsigned char)data) < + 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_tap_shock_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_tap_shock(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_tap_shock_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_tap_shock(bma2x2->bma2x2_client, (unsigned char)data) < + 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_tap_samp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_tap_samp(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_tap_samp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_tap_samp(bma2x2->bma2x2_client, (unsigned char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_orient_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_orient_mode(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_orient_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_orient_mode(bma2x2->bma2x2_client, (unsigned char)data) < + 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_orient_blocking_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_orient_blocking(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_orient_blocking_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_orient_blocking(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_orient_hyst_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_orient_hyst(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_orient_hyst_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_orient_hyst(bma2x2->bma2x2_client, (unsigned char)data) < + 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_orient_theta_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_theta_blocking(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_orient_theta_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_theta_blocking(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_flat_theta_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_theta_flat(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_flat_theta_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_theta_flat(bma2x2->bma2x2_client, (unsigned char)data) < + 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_flat_hold_time_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_get_flat_hold_time(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} +static ssize_t bma2x2_selftest_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + return sprintf(buf, "%d\n", atomic_read(&bma2x2->selftest_result)); + +} + +static ssize_t bma2x2_softreset_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if (bma2x2_soft_reset(bma2x2->bma2x2_client) < 0) + return -EINVAL; + + return count; +} +static ssize_t bma2x2_selftest_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + + unsigned long data; + unsigned char clear_value = 0; + int error; + short value1 = 0; + short value2 = 0; + short diff = 0; + unsigned long result = 0; + unsigned char test_result_branch = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + bma2x2_soft_reset(bma2x2->bma2x2_client); + mdelay(5); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (data != 1) + return -EINVAL; + + bma2x2_write_reg(bma2x2->bma2x2_client, 0x32, &clear_value); + + if ((bma2x2->sensor_type == BMA280_TYPE) || + (bma2x2->sensor_type == BMA255_TYPE)) { +#ifdef CONFIG_SENSORS_BMI058 + /*set self test amp */ + if (bma2x2_set_selftest_amp(bma2x2->bma2x2_client, 1) < 0) + return -EINVAL; + /* set to 8 G range */ + if (bma2x2_set_range(bma2x2->bma2x2_client, + BMA2X2_RANGE_8G) < 0) + return -EINVAL; +#else + /* set to 4 G range */ + if (bma2x2_set_range(bma2x2->bma2x2_client, + BMA2X2_RANGE_4G) < 0) + return -EINVAL; +#endif + } + + if ((bma2x2->sensor_type == BMA250E_TYPE) || + (bma2x2->sensor_type == BMA222E_TYPE)) { + /* set to 8 G range */ + if (bma2x2_set_range(bma2x2->bma2x2_client, 8) < 0) + return -EINVAL; + if (bma2x2_set_selftest_amp(bma2x2->bma2x2_client, 1) < 0) + return -EINVAL; + } + + /* 1 for x-axis(but BMI058 is 1 for y-axis )*/ + bma2x2_set_selftest_st(bma2x2->bma2x2_client, 1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 0); + mdelay(10); + bma2x2_read_accel_x(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 1); + mdelay(10); + bma2x2_read_accel_x(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value2); + diff = value1-value2; + +#ifdef CONFIG_SENSORS_BMI058 + PINFO("diff y is %d,value1 is %d, value2 is %d\n", diff, + value1, value2); + test_result_branch = 2; +#else + PINFO("diff x is %d,value1 is %d, value2 is %d\n", diff, + value1, value2); + test_result_branch = 1; +#endif + + if (bma2x2->sensor_type == BMA280_TYPE) { +#ifdef CONFIG_SENSORS_BMI058 + if (abs(diff) < 819) + result |= test_result_branch; +#else + if (abs(diff) < 1638) + result |= test_result_branch; +#endif + } + if (bma2x2->sensor_type == BMA255_TYPE) { + if (abs(diff) < 409) + result |= 1; + } + if (bma2x2->sensor_type == BMA250E_TYPE) { + if (abs(diff) < 51) + result |= 1; + } + if (bma2x2->sensor_type == BMA222E_TYPE) { + if (abs(diff) < 12) + result |= 1; + } + + /* 2 for y-axis but BMI058 is 1*/ + bma2x2_set_selftest_st(bma2x2->bma2x2_client, 2); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 0); + mdelay(10); + bma2x2_read_accel_y(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 1); + mdelay(10); + bma2x2_read_accel_y(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value2); + diff = value1-value2; + +#ifdef CONFIG_SENSORS_BMI058 + PINFO("diff x is %d,value1 is %d, value2 is %d\n", diff, + value1, value2); + test_result_branch = 1; +#else + PINFO("diff y is %d,value1 is %d, value2 is %d\n", diff, + value1, value2); + test_result_branch = 2; +#endif + + if (bma2x2->sensor_type == BMA280_TYPE) { +#ifdef CONFIG_SENSORS_BMI058 + if (abs(diff) < 819) + result |= test_result_branch; +#else + if (abs(diff) < 1638) + result |= test_result_branch; +#endif + } + if (bma2x2->sensor_type == BMA255_TYPE) { + if (abs(diff) < 409) + result |= test_result_branch; + } + if (bma2x2->sensor_type == BMA250E_TYPE) { + if (abs(diff) < 51) + result |= test_result_branch; + } + if (bma2x2->sensor_type == BMA222E_TYPE) { + if (abs(diff) < 12) + result |= test_result_branch; + } + + + bma2x2_set_selftest_st(bma2x2->bma2x2_client, 3); /* 3 for z-axis*/ + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 0); + mdelay(10); + bma2x2_read_accel_z(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 1); + mdelay(10); + bma2x2_read_accel_z(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value2); + diff = value1-value2; + + PINFO("diff z is %d,value1 is %d, value2 is %d\n", diff, + value1, value2); + + if (bma2x2->sensor_type == BMA280_TYPE) { +#ifdef CONFIG_SENSORS_BMI058 + if (abs(diff) < 409) + result |= 4; +#else + if (abs(diff) < 819) + result |= 4; +#endif + } + if (bma2x2->sensor_type == BMA255_TYPE) { + if (abs(diff) < 204) + result |= 4; + } + if (bma2x2->sensor_type == BMA250E_TYPE) { + if (abs(diff) < 25) + result |= 4; + } + if (bma2x2->sensor_type == BMA222E_TYPE) { + if (abs(diff) < 6) + result |= 4; + } + + /* self test for bma254 */ + if ((bma2x2->sensor_type == BMA255_TYPE) && (result > 0)) { + result = 0; + bma2x2_soft_reset(bma2x2->bma2x2_client); + mdelay(5); + bma2x2_write_reg(bma2x2->bma2x2_client, 0x32, &clear_value); + /* set to 8 G range */ + if (bma2x2_set_range(bma2x2->bma2x2_client, 8) < 0) + return -EINVAL; + if (bma2x2_set_selftest_amp(bma2x2->bma2x2_client, 1) < 0) + return -EINVAL; + + bma2x2_set_selftest_st(bma2x2->bma2x2_client, 1); /* 1 + for x-axis*/ + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 0); /* + positive direction*/ + mdelay(10); + bma2x2_read_accel_x(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 1); /* + negative direction*/ + mdelay(10); + bma2x2_read_accel_x(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value2); + diff = value1-value2; + + PINFO("diff x is %d,value1 is %d, value2 is %d\n", + diff, value1, value2); + if (abs(diff) < 204) + result |= 1; + + bma2x2_set_selftest_st(bma2x2->bma2x2_client, 2); /* 2 + for y-axis*/ + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 0); /* + positive direction*/ + mdelay(10); + bma2x2_read_accel_y(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 1); /* + negative direction*/ + mdelay(10); + bma2x2_read_accel_y(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value2); + diff = value1-value2; + PINFO("diff y is %d,value1 is %d, value2 is %d\n", + diff, value1, value2); + + if (abs(diff) < 204) + result |= 2; + + bma2x2_set_selftest_st(bma2x2->bma2x2_client, 3); /* 3 + for z-axis*/ + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 0); /* + positive direction*/ + mdelay(10); + bma2x2_read_accel_z(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value1); + bma2x2_set_selftest_stn(bma2x2->bma2x2_client, 1); /* + negative direction*/ + mdelay(10); + bma2x2_read_accel_z(bma2x2->bma2x2_client, + bma2x2->sensor_type, &value2); + diff = value1-value2; + + PINFO("diff z is %d,value1 is %d, value2 is %d\n", + diff, value1, value2); + if (abs(diff) < 102) + result |= 4; + } + + atomic_set(&bma2x2->selftest_result, (unsigned int)result); + + bma2x2_soft_reset(bma2x2->bma2x2_client); + mdelay(5); + PINFO("self test finished\n"); + + return count; +} + + + +static ssize_t bma2x2_flat_hold_time_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_flat_hold_time(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +const int bma2x2_sensor_bitwidth[] = { + 12, 10, 8, 14 +}; + +static int bma2x2_read_accel_xyz(struct i2c_client *client, + signed char sensor_type, struct bma2x2acc *acc) +{ + int comres = 0; + unsigned char data[6]; + struct bma2x2_data *client_data = i2c_get_clientdata(client); +#ifndef BMA2X2_SENSOR_IDENTIFICATION_ENABLE + int bitwidth; +#endif + + if(!client_data){ + return BOSCH_SENSOR_BAD_ADDR; + } + + comres = bma2x2_smbus_read_byte_block(client, + BMA2X2_ACC_X12_LSB__REG, data, 6); + if (sensor_type >= 4) + return -EINVAL; + + acc->x = (data[1]<<8)|data[0]; + acc->y = (data[3]<<8)|data[2]; + acc->z = (data[5]<<8)|data[4]; + +#ifndef BMA2X2_SENSOR_IDENTIFICATION_ENABLE + bitwidth = bma2x2_sensor_bitwidth[sensor_type]; + + acc->x = (acc->x >> (16 - bitwidth)); + acc->y = (acc->y >> (16 - bitwidth)); + acc->z = (acc->z >> (16 - bitwidth)); +#endif + + bma2x2_remap_sensor_data(acc, client_data); + return comres; +} + + +static int bma_cali_flag=0; + +int bma2x2_real_cali(struct bma2x2_data *bma2x2); + + +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT + +static void bma2x2_work_func(struct work_struct *work) +{ +// struct bma2x2_data *bma2x2 = container_of((struct delayed_work *)work, + struct bma2x2_data *bma2x2 = container_of((struct work_struct *)work, + struct bma2x2_data, work); + static struct bma2x2acc acc; + int ret=0; +// unsigned long delay = msecs_to_jiffies(atomic_read(&bma2x2->delay)); + + if(bma_cali_flag==0) + { + ret = bma2x2_real_cali(bma2x2); + if(ret >= 0) + { + bma_cali_flag = 1; + } + } + bma2x2_read_accel_xyz(bma2x2->bma2x2_client, bma2x2->sensor_type, &acc); +#if 0 + input_report_abs(bma2x2->input, ABS_X, acc.x); + input_report_abs(bma2x2->input, ABS_Y, acc.y); + input_report_abs(bma2x2->input, ABS_Z, acc.z); +#else + input_event(bma2x2->input, EV_MSC, MSC_RAW, acc.x); + input_event(bma2x2->input, EV_MSC, MSC_SCAN, acc.y); + input_event(bma2x2->input, EV_MSC, MSC_GESTURE, acc.z); +#endif + input_sync(bma2x2->input); + mutex_lock(&bma2x2->value_mutex); + bma2x2->value = acc; + mutex_unlock(&bma2x2->value_mutex); +// schedule_delayed_work(&bma2x2->work, delay); +} +#endif + +static ssize_t bma2x2_register_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int address, value; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + sscanf(buf, "%3d %3d", &address, &value); + if (bma2x2_write_reg(bma2x2->bma2x2_client, (unsigned char)address, + (unsigned char *)&value) < 0) + return -EINVAL; + return count; +} +static ssize_t bma2x2_register_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + size_t count = 0; + u8 reg[0x40]; + int i; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + for (i = 0; i < 0x40; i++) { + bma2x2_smbus_read_byte(bma2x2->bma2x2_client, i, reg+i); + + count += sprintf(&buf[count], "0x%x: %d\n", i, reg[i]); + } + return count; + + +} + +static ssize_t bma2x2_range_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_range(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t bma2x2_range_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_range(bma2x2->bma2x2_client, (unsigned char) data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_bandwidth_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + if (bma2x2_get_bandwidth(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_bandwidth_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2->sensor_type == BMA280_TYPE) + if ((unsigned char) data > 14) + return -EINVAL; + + if (bma2x2_set_bandwidth(bma2x2->bma2x2_client, + (unsigned char) data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_mode(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d %d\n", data, bma2x2->bma_mode_enabled); +} + +static ssize_t bma2x2_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_mode(bma2x2->bma2x2_client, + (unsigned char) data, BMA_ENABLED_BSX) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_value_cache_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct input_dev *input = to_input_dev(dev); + struct bma2x2_data *bma2x2 = input_get_drvdata(input); + struct bma2x2acc acc_value; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + mutex_lock(&bma2x2->value_mutex); + acc_value = bma2x2->value; + mutex_unlock(&bma2x2->value_mutex); + + return sprintf(buf, "%d %d %d\n", acc_value.x, acc_value.y, + acc_value.z); +} + +static ssize_t bma2x2_value_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct input_dev *input = to_input_dev(dev); + struct bma2x2_data *bma2x2 = input_get_drvdata(input); + struct bma2x2acc acc_value; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + bma2x2_read_accel_xyz(bma2x2->bma2x2_client, bma2x2->sensor_type, + &acc_value); + + return sprintf(buf, "%d %d %d\n", acc_value.x, acc_value.y, + acc_value.z); +} + +static ssize_t bma2x2_delay_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + return sprintf(buf, "%d\n", atomic_read(&bma2x2->delay)); + +} + +static ssize_t bma2x2_chip_id_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + return sprintf(buf, "%u\n", bma2x2->chip_id); + +} + + +static ssize_t bma2x2_place_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + int place = BOSCH_SENSOR_PLACE_UNKNOWN; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (NULL != bma2x2->bst_pd) + place = bma2x2->bst_pd->place; + + return sprintf(buf, "%d\n", place); +} + + +static ssize_t bma2x2_delay_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (data > BMA2X2_MAX_DELAY) + data = BMA2X2_MAX_DELAY; + atomic_set(&bma2x2->delay, (unsigned int) data); + + return count; +} + +int bma2x2_real_cali(struct bma2x2_data *bma2x2) +{ + int cali_xyz=0; + unsigned int flag=0; + unsigned char bst_offset_x=0; + unsigned char bst_offset_y=0; + unsigned char bst_offset_z=0; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + cali_xyz = read_file("/productinfo/gsensor_calibration.ini"); + + if(cali_xyz<0){ + return -EINVAL; + } + + flag=(cali_xyz>>24)&0xff; + + if(flag==0x2) + { + bst_offset_x = cali_xyz & 0xff; + bst_offset_y = (cali_xyz>>8)&0xff; + bst_offset_z = (cali_xyz>>16)&0xff; + } + else + { + bst_offset_x = 0; + bst_offset_y = 0; + bst_offset_z = 0; + } + + if (bma2x2_set_offset_x(bma2x2->bma2x2_client, bst_offset_x) < 0) + return -EINVAL; + + if (bma2x2_set_offset_y(bma2x2->bma2x2_client, bst_offset_y) < 0) + return -EINVAL; + + if (bma2x2_set_offset_z(bma2x2->bma2x2_client, bst_offset_z) < 0) + return -EINVAL; + + return 0; +} + +static ssize_t bma2x2_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + return sprintf(buf, "%d\n", atomic_read(&bma2x2->enable)); + +} + +static void bma2x2_set_enable(struct device *dev, int enable) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + int pre_enable; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + pre_enable = atomic_read(&bma2x2->enable); + + mutex_lock(&bma2x2->enable_mutex); + + if (enable) { + + if (pre_enable == 0) { + bma2x2_set_mode(bma2x2->bma2x2_client, + BMA2X2_MODE_NORMAL, BMA_ENABLED_INPUT); + +#if 0 +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT + schedule_delayed_work(&bma2x2->work, + msecs_to_jiffies(atomic_read(&bma2x2->delay))); +#endif +#endif + hrtimer_start(&bma2x2->timer, ktime_set(0, + atomic_read(&bma2x2->delay) * 1000000), HRTIMER_MODE_REL); + atomic_set(&bma2x2->enable, 1); + } + + } else { + if (pre_enable == 1) { + bma2x2_set_mode(bma2x2->bma2x2_client, + BMA2X2_MODE_SUSPEND, BMA_ENABLED_INPUT); +#if 0 +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT + cancel_delayed_work_sync(&bma2x2->work); +#endif +#endif + hrtimer_cancel(&bma2x2->timer); + atomic_set(&bma2x2->enable, 0); + } + } + mutex_unlock(&bma2x2->enable_mutex); + +} + +static ssize_t bma2x2_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if ((data == 0) || (data == 1)) + bma2x2_set_enable(dev, data); + + return count; +} +static ssize_t bma2x2_fast_calibration_x_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + +#ifdef CONFIG_SENSORS_BMI058 + if (bma2x2_get_offset_target(bma2x2->bma2x2_client, + BMI058_OFFSET_TRIGGER_X, &data) < 0) + return -EINVAL; +#else + if (bma2x2_get_offset_target(bma2x2->bma2x2_client, + BMA2X2_OFFSET_TRIGGER_X, &data) < 0) + return -EINVAL; +#endif + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fast_calibration_x_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + signed char tmp; + unsigned char timeout = 0; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + +#ifdef CONFIG_SENSORS_BMI058 + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMI058_OFFSET_TRIGGER_X, (unsigned char)data) < 0) + return -EINVAL; +#else + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMA2X2_OFFSET_TRIGGER_X, (unsigned char)data) < 0) + return -EINVAL; +#endif + + if (bma2x2_set_cal_trigger(bma2x2->bma2x2_client, 1) < 0) + return -EINVAL; + + do { + mdelay(2); + bma2x2_get_cal_ready(bma2x2->bma2x2_client, &tmp); + + /*PINFO("wait 2ms cal ready flag is %d\n", tmp); */ + timeout++; + if (timeout == 50) { + PINFO("get fast calibration ready error\n"); + return -EINVAL; + }; + + } while (tmp == 0); + + PINFO("x axis fast calibration finished\n"); + return count; +} + + +static int bma2x2_fast_calibration_x(struct device *dev, unsigned char data) +{ + signed char tmp; + unsigned char timeout = 0; + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + +#ifdef CONFIG_SENSORS_BMI058 + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMI058_OFFSET_TRIGGER_X, (unsigned char)data) < 0) + return -EINVAL; +#else + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMA2X2_OFFSET_TRIGGER_X, (unsigned char)data) < 0) + return -EINVAL; +#endif + + if (bma2x2_set_cal_trigger(bma2x2->bma2x2_client, 1) < 0) + return -EINVAL; + + do { + mdelay(2); + bma2x2_get_cal_ready(bma2x2->bma2x2_client, &tmp); + + /*PINFO("wait 2ms cal ready flag is %d\n", tmp); */ + timeout++; + if (timeout == 50) { + PINFO("get fast calibration ready error\n"); + return -EINVAL; + }; + + } while (tmp == 0); + + PINFO("x axis fast calibration finished\n"); + return 0; +} + + +static ssize_t bma2x2_fast_calibration_y_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + + + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + +#ifdef CONFIG_SENSORS_BMI058 + if (bma2x2_get_offset_target(bma2x2->bma2x2_client, + BMI058_OFFSET_TRIGGER_Y, &data) < 0) + return -EINVAL; +#else + if (bma2x2_get_offset_target(bma2x2->bma2x2_client, + BMA2X2_OFFSET_TRIGGER_Y, &data) < 0) + return -EINVAL; +#endif + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fast_calibration_y_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + signed char tmp; + unsigned char timeout = 0; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + +#ifdef CONFIG_SENSORS_BMI058 + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMI058_OFFSET_TRIGGER_Y, (unsigned char)data) < 0) + return -EINVAL; +#else + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMA2X2_OFFSET_TRIGGER_Y, (unsigned char)data) < 0) + return -EINVAL; +#endif + + if (bma2x2_set_cal_trigger(bma2x2->bma2x2_client, 2) < 0) + return -EINVAL; + + do { + mdelay(2); + bma2x2_get_cal_ready(bma2x2->bma2x2_client, &tmp); + + /*PINFO("wait 2ms cal ready flag is %d\n", tmp);*/ + timeout++; + if (timeout == 50) { + PINFO("get fast calibration ready error\n"); + return -EINVAL; + }; + + } while (tmp == 0); + + PINFO("y axis fast calibration finished\n"); + return count; +} + + +static int bma2x2_fast_calibration_y(struct device *dev, unsigned char data) +{ + signed char tmp; + unsigned char timeout = 0; + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + +#ifdef CONFIG_SENSORS_BMI058 + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMI058_OFFSET_TRIGGER_Y, (unsigned char)data) < 0) + return -EINVAL; +#else + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, + BMA2X2_OFFSET_TRIGGER_Y, (unsigned char)data) < 0) + return -EINVAL; +#endif + + if (bma2x2_set_cal_trigger(bma2x2->bma2x2_client, 2) < 0) + return -EINVAL; + + do { + mdelay(2); + bma2x2_get_cal_ready(bma2x2->bma2x2_client, &tmp); + + /*PINFO("wait 2ms cal ready flag is %d\n", tmp);*/ + timeout++; + if (timeout == 50) { + PINFO("get fast calibration ready error\n"); + return -EINVAL; + }; + + } while (tmp == 0); + + PINFO("y axis fast calibration finished\n"); + return 0; +} + + +static ssize_t bma2x2_fast_calibration_z_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_offset_target(bma2x2->bma2x2_client, 3, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fast_calibration_z_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + signed char tmp; + unsigned char timeout = 0; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, 3, (unsigned + char)data) < 0) + return -EINVAL; + + if (bma2x2_set_cal_trigger(bma2x2->bma2x2_client, 3) < 0) + return -EINVAL; + + do { + mdelay(2); + bma2x2_get_cal_ready(bma2x2->bma2x2_client, &tmp); + + /*PINFO("wait 2ms cal ready flag is %d\n", tmp);*/ + timeout++; + if (timeout == 50) { + PINFO("get fast calibration ready error\n"); + return -EINVAL; + }; + + } while (tmp == 0); + + PINFO("z axis fast calibration finished\n"); + return count; +} + + +static ssize_t bma2x2_fast_calibration_z(struct device *dev,unsigned char data) +{ + signed char tmp; + unsigned char timeout = 0; + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_set_offset_target(bma2x2->bma2x2_client, 3, (unsigned + char)data) < 0) + return -EINVAL; + + if (bma2x2_set_cal_trigger(bma2x2->bma2x2_client, 3) < 0) + return -EINVAL; + + do { + mdelay(2); + bma2x2_get_cal_ready(bma2x2->bma2x2_client, &tmp); + + /*PINFO("wait 2ms cal ready flag is %d\n", tmp);*/ + timeout++; + if (timeout == 50) { + PINFO("get fast calibration ready error\n"); + return -EINVAL; + }; + + } while (tmp == 0); + + PINFO("z axis fast calibration finished\n"); + return 0; +} + + +static ssize_t bma2x2_enable_cali_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char datax = 0; + unsigned char datay = 0; + unsigned char dataz = 0; + unsigned int data=0; + + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + bma2x2_fast_calibration_x(dev,3); + bma2x2_fast_calibration_y(dev,3); + bma2x2_fast_calibration_z(dev,2); + + if (bma2x2_get_offset_x(bma2x2->bma2x2_client, &datax) < 0) + return -1; + if (bma2x2_get_offset_y(bma2x2->bma2x2_client, &datay) < 0) + return -1; + if (bma2x2_get_offset_z(bma2x2->bma2x2_client, &dataz) < 0) + return -1; + + data = dataz; + data = (data<<8)|datay; + data = (data<<8)|datax; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t bma2x2_SleepDur_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_sleep_duration(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); +} + +static ssize_t bma2x2_SleepDur_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_sleep_duration(bma2x2->bma2x2_client, + (unsigned char) data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_fifo_mode_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_fifo_mode(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fifo_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_fifo_mode(bma2x2->bma2x2_client, + (unsigned char) data) < 0) + return -EINVAL; + return count; +} + +static ssize_t bma2x2_fifo_trig_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_fifo_trig(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fifo_trig_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_fifo_trig(bma2x2->bma2x2_client, + (unsigned char) data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_fifo_trig_src_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_fifo_trig_src(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fifo_trig_src_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + if (bma2x2_set_fifo_trig_src(bma2x2->bma2x2_client, + (unsigned char) data) < 0) + return -EINVAL; + + return count; +} + + +/*! + * @brief show fifo_data_sel axis definition(Android definition, not sensor HW reg). + * 0--> x, y, z axis fifo data for every frame + * 1--> only x axis fifo data for every frame + * 2--> only y axis fifo data for every frame + * 3--> only z axis fifo data for every frame + */ +static ssize_t bma2x2_fifo_data_sel_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + signed char place = BOSCH_SENSOR_PLACE_UNKNOWN; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_fifo_data_sel(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + +#ifdef CONFIG_SENSORS_BMI058 +/*Update BMI058 fifo_data_sel to the BMA2x2 common definition*/ + if (BMI058_FIFO_DAT_SEL_X == data) + data = BMA2X2_FIFO_DAT_SEL_X; + else if (BMI058_FIFO_DAT_SEL_Y == data) + data = BMA2X2_FIFO_DAT_SEL_Y; +#endif + + /*remaping fifo_dat_sel if define virtual place in BSP files*/ + if ((NULL != bma2x2->bst_pd) && + (BOSCH_SENSOR_PLACE_UNKNOWN != bma2x2->bst_pd->place)) { + place = bma2x2->bst_pd->place; + /* sensor with place 0 needs not to be remapped */ + if ((place > 0) && (place < MAX_AXIS_REMAP_TAB_SZ)) { + /* BMA2X2_FIFO_DAT_SEL_X: 1, Y:2, Z:3; + * but bst_axis_remap_tab_dft[i].src_x:0, y:1, z:2 + * so we need to +1*/ + if (BMA2X2_FIFO_DAT_SEL_X == data) + data = bst_axis_remap_tab_dft[place].src_x + 1; + else if (BMA2X2_FIFO_DAT_SEL_Y == data) + data = bst_axis_remap_tab_dft[place].src_y + 1; + } + } + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_fifo_framecount_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + unsigned char mode; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_fifo_framecount(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + if (data > MAX_FIFO_F_LEVEL) { + + if (bma2x2_get_mode(bma2x2->bma2x2_client, &mode) < 0) + return -EINVAL; + + if (BMA2X2_MODE_NORMAL == mode) { + PERR("bma2x2 fifo_count: %d abnormal, op_mode: %d", + data, mode); + data = MAX_FIFO_F_LEVEL; + } else { + /*chip already suspend or shutdown*/ + data = 0; + } + } + + return sprintf(buf, "%d\n", data); +} + +static ssize_t bma2x2_fifo_framecount_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + bma2x2->fifo_count = (unsigned int) data; + + return count; +} + +static ssize_t bma2x2_temperature_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_read_temperature(bma2x2->bma2x2_client, &data) < 0) + return -EINVAL; + + return sprintf(buf, "%d\n", data); + +} + +/*! + * @brief store fifo_data_sel axis definition(Android definition, not sensor HW reg). + * 0--> x, y, z axis fifo data for every frame + * 1--> only x axis fifo data for every frame + * 2--> only y axis fifo data for every frame + * 3--> only z axis fifo data for every frame + */ +static ssize_t bma2x2_fifo_data_sel_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + signed char place; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + /*save fifo_data_sel(android definition)*/ + bma2x2->fifo_datasel = (unsigned char) data; + + /*remaping fifo_dat_sel if define virtual place*/ + if ((NULL != bma2x2->bst_pd) && + (BOSCH_SENSOR_PLACE_UNKNOWN != bma2x2->bst_pd->place)) { + place = bma2x2->bst_pd->place; + /* sensor with place 0 needs not to be remapped */ + if ((place > 0) && (place < MAX_AXIS_REMAP_TAB_SZ)) { + /*Need X Y axis revesal sensor place: P1, P3, P5, P7 */ + /* BMA2X2_FIFO_DAT_SEL_X: 1, Y:2, Z:3; + * but bst_axis_remap_tab_dft[i].src_x:0, y:1, z:2 + * so we need to +1*/ + if (BMA2X2_FIFO_DAT_SEL_X == data) + data = bst_axis_remap_tab_dft[place].src_x + 1; + else if (BMA2X2_FIFO_DAT_SEL_Y == data) + data = bst_axis_remap_tab_dft[place].src_y + 1; + } + } +#ifdef CONFIG_SENSORS_BMI058 + /*Update BMI058 fifo_data_sel to the BMA2x2 common definition*/ + if (BMA2X2_FIFO_DAT_SEL_X == data) + data = BMI058_FIFO_DAT_SEL_X; + else if (BMA2X2_FIFO_DAT_SEL_Y == data) + data = BMI058_FIFO_DAT_SEL_Y; + +#endif + if (bma2x2_set_fifo_data_sel(bma2x2->bma2x2_client, + (unsigned char) data) < 0) + return -EINVAL; + + return count; +} + + +/*! + * brief: bma2x2 single axis data remaping + * @param[i] fifo_datasel fifo axis data select setting + * @param[i/o] remap_dir remapping direction + * @param[i] client_data to transfer sensor place + * + * @return none + */ +static void bma2x2_single_axis_remaping(unsigned char fifo_datasel, + unsigned char *remap_dir, struct bma2x2_data *client_data) +{ + if ((NULL == client_data->bst_pd) || + (BOSCH_SENSOR_PLACE_UNKNOWN + == client_data->bst_pd->place)) + return; + else { + signed char place = client_data->bst_pd->place; + /* sensor with place 0 needs not to be remapped */ + if ((place <= 0) || (place >= MAX_AXIS_REMAP_TAB_SZ)) + return; + + if (fifo_datasel < 1 || fifo_datasel > 3) + return; + else { + switch (fifo_datasel) { + /*P2, P3, P4, P5 X axis(andorid) need to reverse*/ + case BMA2X2_FIFO_DAT_SEL_X: + if (-1 == bst_axis_remap_tab_dft[place].sign_x) + *remap_dir = 1; + else + *remap_dir = 0; + break; + /*P1, P2, P5, P6 Y axis(andorid) need to reverse*/ + case BMA2X2_FIFO_DAT_SEL_Y: + if (-1 == bst_axis_remap_tab_dft[place].sign_y) + *remap_dir = 1; + else + *remap_dir = 0; + break; + case BMA2X2_FIFO_DAT_SEL_Z: + /*P4, P5, P6, P7 Z axis(andorid) need to reverse*/ + if (-1 == bst_axis_remap_tab_dft[place].sign_z) + *remap_dir = 1; + else + *remap_dir = 0; + break; + default: + break; + } + } + } + + return; +} + +static ssize_t bma2x2_fifo_data_out_frame_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int err, i, len; + signed char fifo_data_out[MAX_FIFO_F_LEVEL * MAX_FIFO_F_BYTES] = {0}; + unsigned char f_len = 0; + s16 value; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + struct bma2x2acc acc_lsb; + unsigned char axis_dir_remap = 0; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2->fifo_datasel) { + /*Select one axis data output for every fifo frame*/ + f_len = 2; + } else { + /*Select X Y Z axis data output for every fifo frame*/ + f_len = 6; + } + + if (bma2x2->fifo_count == 0) + return -EINVAL; + + if (bma2x2->bma_mode_enabled == 0) { + PERR("bma2x2_fifo_data, bma_mode_enabled 0"); + /*return -EINVAL;*/ + } + + if (bma_i2c_burst_read(bma2x2->bma2x2_client, + BMA2X2_FIFO_DATA_OUTPUT_REG, fifo_data_out, + bma2x2->fifo_count * f_len) < 0) + return -EINVAL; + + err = 0; + +/* please give attation for the fifo output data format*/ + if (f_len == 6) { + /* Select X Y Z axis data output for every frame */ + for (i = 0; i < bma2x2->fifo_count; i++) { + acc_lsb.x = + ((unsigned char)fifo_data_out[i * f_len + 1] << 8 | + (unsigned char)fifo_data_out[i * f_len + 0]); + acc_lsb.y = + ((unsigned char)fifo_data_out[i * f_len + 3] << 8 | + (unsigned char)fifo_data_out[i * f_len + 2]); + acc_lsb.z = + ((unsigned char)fifo_data_out[i * f_len + 5] << 8 | + (unsigned char)fifo_data_out[i * f_len + 4]); +#ifndef BMA2X2_SENSOR_IDENTIFICATION_ENABLE + acc_lsb.x >>= + (16 - bma2x2_sensor_bitwidth[bma2x2->sensor_type]); + acc_lsb.y >>= + (16 - bma2x2_sensor_bitwidth[bma2x2->sensor_type]); + acc_lsb.z >>= + (16 - bma2x2_sensor_bitwidth[bma2x2->sensor_type]); +#endif + bma2x2_remap_sensor_data(&acc_lsb, bma2x2); + len = sprintf(buf, "%d %d %d ", + acc_lsb.x, acc_lsb.y, acc_lsb.z); + buf += len; + err += len; + } + } else { + /* single axis data output for every frame */ + bma2x2_single_axis_remaping(bma2x2->fifo_datasel, + &axis_dir_remap, bma2x2); + for (i = 0; i < bma2x2->fifo_count * f_len / 2; i++) { + value = ((unsigned char)fifo_data_out[2 * i + 1] << 8 | + (unsigned char)fifo_data_out[2 * i]); +#ifndef BMA2X2_SENSOR_IDENTIFICATION_ENABLE + value >>= + (16 - bma2x2_sensor_bitwidth[bma2x2->sensor_type]); +#endif + if (axis_dir_remap) + value = 0 - value; + len = sprintf(buf, "%d ", value); + buf += len; + err += len; + } + } + + return err; +} + +static ssize_t bma2x2_offset_x_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_offset_x(bma2x2->bma2x2_client, &data) < 0) + return sprintf(buf, "Read error\n"); + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_offset_x_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_offset_x(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_offset_y_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_offset_y(bma2x2->bma2x2_client, &data) < 0) + return sprintf(buf, "Read error\n"); + + return sprintf(buf, "%d\n", data); +} + +static ssize_t bma2x2_offset_y_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_offset_y(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +static ssize_t bma2x2_offset_z_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + unsigned char data = 0; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (bma2x2_get_offset_z(bma2x2->bma2x2_client, &data) < 0) + return sprintf(buf, "Read error\n"); + + return sprintf(buf, "%d\n", data); + +} + +static ssize_t bma2x2_offset_z_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if (bma2x2_set_offset_z(bma2x2->bma2x2_client, (unsigned + char)data) < 0) + return -EINVAL; + + return count; +} + +#ifdef CONFIG_SIG_MOTION +static int bma2x2_set_en_slope_int(struct bma2x2_data *bma2x2, + int en) +{ + int err; + struct i2c_client *client = bma2x2->bma2x2_client; + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (en) { + /* Set the related parameters which needs to be fine tuned by + * interfaces: slope_threshold and slope_duration + */ + /*dur: 192 samples ~= 3s*/ + err = bma2x2_set_slope_duration(client, 0x0); + err += bma2x2_set_slope_threshold(client, 0x16); + + /*Enable the interrupts*/ + err += bma2x2_set_Int_Enable(client, 5, 1);/*Slope X*/ + err += bma2x2_set_Int_Enable(client, 6, 1);/*Slope Y*/ + err += bma2x2_set_Int_Enable(client, 7, 1);/*Slope Z*/ + #ifdef BMA2X2_ENABLE_INT1 + /* TODO: SLOPE can now only be routed to INT1 pin*/ + err += bma2x2_set_int1_pad_sel(client, PAD_SLOP); + #else + /* err += bma2x2_set_int2_pad_sel(client, PAD_SLOP); */ + #endif + } else { + err = bma2x2_set_Int_Enable(client, 5, 0);/*Slope X*/ + err += bma2x2_set_Int_Enable(client, 6, 0);/*Slope Y*/ + err += bma2x2_set_Int_Enable(client, 7, 0);/*Slope Z*/ + } + return err; +} + +static ssize_t bma2x2_en_sig_motion_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + return sprintf(buf, "%d\n", atomic_read(&bma2x2->en_sig_motion)); +} + +static int bma2x2_set_en_sig_motion(struct bma2x2_data *bma2x2, + int en) +{ + int err = 0; + + en = (en >= 1) ? 1 : 0; /* set sig motion sensor status */ + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + if (atomic_read(&bma2x2->en_sig_motion) != en) { + if (en) { + err = bma2x2_set_mode(bma2x2->bma2x2_client, + BMA2X2_MODE_NORMAL, BMA_ENABLED_SGM); + err = bma2x2_set_en_slope_int(bma2x2, en); + enable_irq_wake(bma2x2->IRQ); + } else { + disable_irq_wake(bma2x2->IRQ); + err = bma2x2_set_en_slope_int(bma2x2, en); + err = bma2x2_set_mode(bma2x2->bma2x2_client, + BMA2X2_MODE_SUSPEND, BMA_ENABLED_SGM); + } + atomic_set(&bma2x2->en_sig_motion, en); + } + return err; +} + +static ssize_t bma2x2_en_sig_motion_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + if(!bma2x2){ + return BOSCH_SENSOR_BAD_ADDR; + } + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if ((data == 0) || (data == 1)) + bma2x2_set_en_sig_motion(bma2x2, data); + + return count; +} +#endif + +#ifdef CONFIG_DOUBLE_TAP +static int bma2x2_set_en_single_tap_int(struct bma2x2_data *bma2x2, int en) +{ + int err; + struct i2c_client *client = bma2x2->bma2x2_client; + + if (en) { + /* set tap interruption parameter here if needed. + bma2x2_set_tap_duration(client, 0xc0); + bma2x2_set_tap_threshold(client, 0x16); + */ + + /*Enable the single tap interrupts*/ + err = bma2x2_set_Int_Enable(client, 8, 1); + #ifdef BMA2X2_ENABLE_INT1 + err += bma2x2_set_int1_pad_sel(client, PAD_SINGLE_TAP); + #else + err += bma2x2_set_int2_pad_sel(client, PAD_SINGLE_TAP); + #endif + } else { + err = bma2x2_set_Int_Enable(client, 8, 0); + } + return err; +} + +static ssize_t bma2x2_tap_time_period_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + return sprintf(buf, "%d\n", bma2x2->tap_time_period); +} + +static ssize_t bma2x2_tap_time_period_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + bma2x2->tap_time_period = data; + + return count; +} + +static ssize_t bma2x2_en_double_tap_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + return sprintf(buf, "%d\n", atomic_read(&bma2x2->en_double_tap)); +} + +static int bma2x2_set_en_double_tap(struct bma2x2_data *bma2x2, + int en) +{ + int err = 0; + + en = (en >= 1) ? 1 : 0; + + if (atomic_read(&bma2x2->en_double_tap) != en) { + if (en) { + err = bma2x2_set_mode(bma2x2->bma2x2_client, + BMA2X2_MODE_NORMAL, BMA_ENABLED_DTAP); + err = bma2x2_set_en_single_tap_int(bma2x2, en); + } else { + err = bma2x2_set_en_single_tap_int(bma2x2, en); + err = bma2x2_set_mode(bma2x2->bma2x2_client, + BMA2X2_MODE_SUSPEND, BMA_ENABLED_DTAP); + } + atomic_set(&bma2x2->en_double_tap, en); + } + return err; +} + +static ssize_t bma2x2_en_double_tap_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long data; + int error; + struct i2c_client *client = to_i2c_client(dev); + struct bma2x2_data *bma2x2 = i2c_get_clientdata(client); + + error = kstrtoul(buf, 10, &data); + if (error) + return error; + + if ((data == 0) || (data == 1)) + bma2x2_set_en_double_tap(bma2x2, data); + + return count; +} + +static void bma2x2_tap_timeout_handle(unsigned long data) +{ + struct bma2x2_data *bma2x2 = (struct bma2x2_data *)data; + + PINFO("tap interrupt handle, timeout\n"); + mutex_lock(&bma2x2->tap_mutex); + bma2x2->tap_times = 0; + mutex_unlock(&bma2x2->tap_mutex); + + /* if a single tap need to report, open the define */ +#ifdef REPORT_SINGLE_TAP_WHEN_DOUBLE_TAP_SENSOR_ENABLED + input_report_rel(bma2x2->dev_interrupt, + SINGLE_TAP_INTERRUPT, + SINGLE_TAP_INTERRUPT_HAPPENED); + input_sync(bma2x2->dev_interrupt); +#endif + +} +#endif + +static DEVICE_ATTR(range, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_range_show, bma2x2_range_store); +static DEVICE_ATTR(bandwidth, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_bandwidth_show, bma2x2_bandwidth_store); +static DEVICE_ATTR(op_mode, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_mode_show, bma2x2_mode_store); +static DEVICE_ATTR(value, S_IRUGO, + bma2x2_value_show, NULL); +static DEVICE_ATTR(value_cache, S_IRUGO, + bma2x2_value_cache_show, NULL); +static DEVICE_ATTR(delay, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_delay_show, bma2x2_delay_store); +static DEVICE_ATTR(enable, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_enable_show, bma2x2_enable_store); +static DEVICE_ATTR(SleepDur, S_IRUGO|S_IWUSR|S_IWGRP, + bma2x2_SleepDur_show, bma2x2_SleepDur_store); +static DEVICE_ATTR(fast_calibration_x, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fast_calibration_x_show, + bma2x2_fast_calibration_x_store); +static DEVICE_ATTR(fast_calibration_y, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fast_calibration_y_show, + bma2x2_fast_calibration_y_store); +static DEVICE_ATTR(fast_calibration_z, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fast_calibration_z_show, + bma2x2_fast_calibration_z_store); +static DEVICE_ATTR(enable_cali, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_enable_cali_show, + NULL); +static DEVICE_ATTR(fifo_mode, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fifo_mode_show, bma2x2_fifo_mode_store); +static DEVICE_ATTR(fifo_framecount, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fifo_framecount_show, bma2x2_fifo_framecount_store); +static DEVICE_ATTR(fifo_trig, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fifo_trig_show, bma2x2_fifo_trig_store); +static DEVICE_ATTR(fifo_trig_src, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fifo_trig_src_show, bma2x2_fifo_trig_src_store); +static DEVICE_ATTR(fifo_data_sel, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_fifo_data_sel_show, bma2x2_fifo_data_sel_store); +static DEVICE_ATTR(fifo_data_frame, S_IRUGO, + bma2x2_fifo_data_out_frame_show, NULL); +static DEVICE_ATTR(reg, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_register_show, bma2x2_register_store); +static DEVICE_ATTR(chip_id, S_IRUGO, + bma2x2_chip_id_show, NULL); +static DEVICE_ATTR(offset_x, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_offset_x_show, + bma2x2_offset_x_store); +static DEVICE_ATTR(offset_y, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_offset_y_show, + bma2x2_offset_y_store); +static DEVICE_ATTR(offset_z, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_offset_z_show, + bma2x2_offset_z_store); +static DEVICE_ATTR(enable_int, S_IWUSR|S_IWGRP|S_IWOTH, + NULL, bma2x2_enable_int_store); +static DEVICE_ATTR(int_mode, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_int_mode_show, bma2x2_int_mode_store); +static DEVICE_ATTR(slope_duration, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_slope_duration_show, bma2x2_slope_duration_store); +static DEVICE_ATTR(slope_threshold, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_slope_threshold_show, bma2x2_slope_threshold_store); +static DEVICE_ATTR(slope_no_mot_duration, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_slope_no_mot_duration_show, + bma2x2_slope_no_mot_duration_store); +static DEVICE_ATTR(slope_no_mot_threshold, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_slope_no_mot_threshold_show, + bma2x2_slope_no_mot_threshold_store); +static DEVICE_ATTR(high_g_duration, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_high_g_duration_show, bma2x2_high_g_duration_store); +static DEVICE_ATTR(high_g_threshold, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_high_g_threshold_show, bma2x2_high_g_threshold_store); +static DEVICE_ATTR(low_g_duration, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_low_g_duration_show, bma2x2_low_g_duration_store); +static DEVICE_ATTR(low_g_threshold, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_low_g_threshold_show, bma2x2_low_g_threshold_store); +static DEVICE_ATTR(tap_duration, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_tap_duration_show, bma2x2_tap_duration_store); +static DEVICE_ATTR(tap_threshold, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_tap_threshold_show, bma2x2_tap_threshold_store); +static DEVICE_ATTR(tap_quiet, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_tap_quiet_show, bma2x2_tap_quiet_store); +static DEVICE_ATTR(tap_shock, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_tap_shock_show, bma2x2_tap_shock_store); +static DEVICE_ATTR(tap_samp, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_tap_samp_show, bma2x2_tap_samp_store); +static DEVICE_ATTR(orient_mode, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_orient_mode_show, bma2x2_orient_mode_store); +static DEVICE_ATTR(orient_blocking, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_orient_blocking_show, bma2x2_orient_blocking_store); +static DEVICE_ATTR(orient_hyst, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_orient_hyst_show, bma2x2_orient_hyst_store); +static DEVICE_ATTR(orient_theta, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_orient_theta_show, bma2x2_orient_theta_store); +static DEVICE_ATTR(flat_theta, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_flat_theta_show, bma2x2_flat_theta_store); +static DEVICE_ATTR(flat_hold_time, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_flat_hold_time_show, bma2x2_flat_hold_time_store); +static DEVICE_ATTR(selftest, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_selftest_show, bma2x2_selftest_store); +static DEVICE_ATTR(softreset, S_IWUSR|S_IWGRP|S_IWOTH, + NULL, bma2x2_softreset_store); +static DEVICE_ATTR(temperature, S_IRUGO, + bma2x2_temperature_show, NULL); +static DEVICE_ATTR(place, S_IRUGO, + bma2x2_place_show, NULL); +#ifdef CONFIG_SIG_MOTION +static DEVICE_ATTR(en_sig_motion, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_en_sig_motion_show, bma2x2_en_sig_motion_store); +#endif +#ifdef CONFIG_DOUBLE_TAP +static DEVICE_ATTR(tap_time_period, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_tap_time_period_show, bma2x2_tap_time_period_store); +static DEVICE_ATTR(en_double_tap, S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH, + bma2x2_en_double_tap_show, bma2x2_en_double_tap_store); +#endif + +static struct attribute *bma2x2_attributes[] = { + &dev_attr_range.attr, + &dev_attr_bandwidth.attr, + &dev_attr_op_mode.attr, + &dev_attr_value.attr, + &dev_attr_value_cache.attr, + &dev_attr_delay.attr, + &dev_attr_enable.attr, + &dev_attr_SleepDur.attr, + &dev_attr_reg.attr, + &dev_attr_fast_calibration_x.attr, + &dev_attr_fast_calibration_y.attr, + &dev_attr_fast_calibration_z.attr, + &dev_attr_enable_cali.attr, + &dev_attr_fifo_mode.attr, + &dev_attr_fifo_framecount.attr, + &dev_attr_fifo_trig.attr, + &dev_attr_fifo_trig_src.attr, + &dev_attr_fifo_data_sel.attr, + &dev_attr_fifo_data_frame.attr, + &dev_attr_chip_id.attr, + &dev_attr_offset_x.attr, + &dev_attr_offset_y.attr, + &dev_attr_offset_z.attr, + &dev_attr_enable_int.attr, + &dev_attr_int_mode.attr, + &dev_attr_slope_duration.attr, + &dev_attr_slope_threshold.attr, + &dev_attr_slope_no_mot_duration.attr, + &dev_attr_slope_no_mot_threshold.attr, + &dev_attr_high_g_duration.attr, + &dev_attr_high_g_threshold.attr, + &dev_attr_low_g_duration.attr, + &dev_attr_low_g_threshold.attr, + &dev_attr_tap_threshold.attr, + &dev_attr_tap_duration.attr, + &dev_attr_tap_quiet.attr, + &dev_attr_tap_shock.attr, + &dev_attr_tap_samp.attr, + &dev_attr_orient_mode.attr, + &dev_attr_orient_blocking.attr, + &dev_attr_orient_hyst.attr, + &dev_attr_orient_theta.attr, + &dev_attr_flat_theta.attr, + &dev_attr_flat_hold_time.attr, + &dev_attr_selftest.attr, + &dev_attr_softreset.attr, + &dev_attr_temperature.attr, + &dev_attr_place.attr, +#ifdef CONFIG_SIG_MOTION + &dev_attr_en_sig_motion.attr, +#endif +#ifdef CONFIG_DOUBLE_TAP + &dev_attr_en_double_tap.attr, +#endif + + NULL +}; + +static struct attribute_group bma2x2_attribute_group = { + .attrs = bma2x2_attributes +}; + +#ifdef CONFIG_SIG_MOTION +static struct attribute *bma2x2_sig_motion_attributes[] = { + &dev_attr_slope_duration.attr, + &dev_attr_slope_threshold.attr, + &dev_attr_en_sig_motion.attr, + NULL +}; +static struct attribute_group bma2x2_sig_motion_attribute_group = { + .attrs = bma2x2_sig_motion_attributes +}; +#endif + +#ifdef CONFIG_DOUBLE_TAP +static struct attribute *bma2x2_double_tap_attributes[] = { + &dev_attr_tap_threshold.attr, + &dev_attr_tap_duration.attr, + &dev_attr_tap_quiet.attr, + &dev_attr_tap_shock.attr, + &dev_attr_tap_samp.attr, + &dev_attr_tap_time_period.attr, + &dev_attr_en_double_tap.attr, + NULL +}; +static struct attribute_group bma2x2_double_tap_attribute_group = { + .attrs = bma2x2_double_tap_attributes +}; +#endif + + +#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2) +unsigned char *orient[] = {"upward looking portrait upright", + "upward looking portrait upside-down", + "upward looking landscape left", + "upward looking landscape right", + "downward looking portrait upright", + "downward looking portrait upside-down", + "downward looking landscape left", + "downward looking landscape right"}; + + +static void bma2x2_high_g_interrupt_handle(struct bma2x2_data *bma2x2) +{ + unsigned char first_value = 0; + unsigned char sign_value = 0; + int i; + + for (i = 0; i < 3; i++) { + bma2x2_get_HIGH_first(bma2x2->bma2x2_client, i, &first_value); + if (first_value == 1) { + bma2x2_get_HIGH_sign(bma2x2->bma2x2_client, + &sign_value); + if (sign_value == 1) { + if (i == 0) + input_report_rel(bma2x2->dev_interrupt, + HIGH_G_INTERRUPT, + HIGH_G_INTERRUPT_X_N); + if (i == 1) + input_report_rel(bma2x2->dev_interrupt, + HIGH_G_INTERRUPT, + HIGH_G_INTERRUPT_Y_N); + if (i == 2) + input_report_rel(bma2x2->dev_interrupt, + HIGH_G_INTERRUPT, + HIGH_G_INTERRUPT_Z_N); + } else { + if (i == 0) + input_report_rel(bma2x2->dev_interrupt, + HIGH_G_INTERRUPT, + HIGH_G_INTERRUPT_X); + if (i == 1) + input_report_rel(bma2x2->dev_interrupt, + HIGH_G_INTERRUPT, + HIGH_G_INTERRUPT_Y); + if (i == 2) + input_report_rel(bma2x2->dev_interrupt, + HIGH_G_INTERRUPT, + HIGH_G_INTERRUPT_Z); + } + } + + PINFO("High G interrupt happened,exis is %d," + "first is %d,sign is %d\n", i, + first_value, sign_value); + } + + +} + +#ifndef CONFIG_SIG_MOTION +static void bma2x2_slope_interrupt_handle(struct bma2x2_data *bma2x2) +{ + unsigned char first_value = 0; + unsigned char sign_value = 0; + int i; + for (i = 0; i < 3; i++) { + bma2x2_get_slope_first(bma2x2->bma2x2_client, i, &first_value); + if (first_value == 1) { + bma2x2_get_slope_sign(bma2x2->bma2x2_client, + &sign_value); + if (sign_value == 1) { + if (i == 0) + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, + SLOPE_INTERRUPT_X_N); + if (i == 1) + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, + SLOPE_INTERRUPT_Y_N); + if (i == 2) + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, + SLOPE_INTERRUPT_Z_N); + } else { + if (i == 0) + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, + SLOPE_INTERRUPT_X); + if (i == 1) + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, + SLOPE_INTERRUPT_Y); + if (i == 2) + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, + SLOPE_INTERRUPT_Z); + + } + } + + PINFO("Slop interrupt happened,exis is %d," + "first is %d,sign is %d\n", i, + first_value, sign_value); + } +} +#endif + +static void bma2x2_irq_work_func(struct work_struct *work) +{ + struct bma2x2_data *bma2x2 = container_of((struct work_struct *)work, + struct bma2x2_data, irq_work); +#ifdef CONFIG_DOUBLE_TAP + struct i2c_client *client = bma2x2->bma2x2_client; +#endif + + unsigned char status = 0; + unsigned char first_value = 0; + unsigned char sign_value = 0; + +#ifdef CONFIG_BMA_ENABLE_NEWDATA_INT + static struct bma2x2acc acc; + + bma2x2_get_interruptstatus2(bma2x2->bma2x2_client, &status); + + if ((status&0x80) == 0x80) { + /* PINFO("New data interrupt happened\n");*/ + bma2x2_read_accel_xyz(bma2x2->bma2x2_client, + bma2x2->sensor_type, &acc); + input_report_abs(bma2x2->input, ABS_X, acc.x); + input_report_abs(bma2x2->input, ABS_Y, acc.y); + input_report_abs(bma2x2->input, ABS_Z, acc.z); + input_sync(bma2x2->input); + mutex_lock(&bma2x2->value_mutex); + bma2x2->value = acc; + mutex_unlock(&bma2x2->value_mutex); + return; + } +#endif + + bma2x2_get_interruptstatus1(bma2x2->bma2x2_client, &status); + PINFO("bma2x2_irq_work_func, status = 0x%x\n", status); + +#ifdef CONFIG_SIG_MOTION + if (status & 0x04) { + if (atomic_read(&bma2x2->en_sig_motion) == 1) { + PINFO("Significant motion interrupt happened\n"); + /* close sig sensor, + it will be open again if APP wants */ + bma2x2_set_en_sig_motion(bma2x2, 0); + + input_report_rel(bma2x2->dev_interrupt, + SLOP_INTERRUPT, 1); + input_sync(bma2x2->dev_interrupt); + } + } +#endif + +#ifdef CONFIG_DOUBLE_TAP + if (status & 0x20) { + if (atomic_read(&bma2x2->en_double_tap) == 1) { + PINFO("single tap interrupt happened\n"); + bma2x2_set_Int_Enable(client, 8, 0); + if (bma2x2->tap_times == 0) { + mod_timer(&bma2x2->tap_timer, jiffies + + msecs_to_jiffies(bma2x2->tap_time_period)); + bma2x2->tap_times = 1; + } else { + /* only double tap is judged */ + PINFO("double tap\n"); + mutex_lock(&bma2x2->tap_mutex); + bma2x2->tap_times = 0; + del_timer(&bma2x2->tap_timer); + mutex_unlock(&bma2x2->tap_mutex); + input_report_rel(bma2x2->dev_interrupt, + DOUBLE_TAP_INTERRUPT, + DOUBLE_TAP_INTERRUPT_HAPPENED); + input_sync(bma2x2->dev_interrupt); + } + bma2x2_set_Int_Enable(client, 8, 1); + } + } +#endif + + switch (status) { + + case 0x01: + PINFO("Low G interrupt happened\n"); + input_report_rel(bma2x2->dev_interrupt, LOW_G_INTERRUPT, + LOW_G_INTERRUPT_HAPPENED); + break; + + case 0x02: + bma2x2_high_g_interrupt_handle(bma2x2); + break; + +#ifndef CONFIG_SIG_MOTION + case 0x04: + bma2x2_slope_interrupt_handle(bma2x2); + break; +#endif + + case 0x08: + PINFO("slow/ no motion interrupt happened\n"); + input_report_rel(bma2x2->dev_interrupt, + SLOW_NO_MOTION_INTERRUPT, + SLOW_NO_MOTION_INTERRUPT_HAPPENED); + break; + +#ifndef CONFIG_DOUBLE_TAP + case 0x10: + PINFO("double tap interrupt happened\n"); + input_report_rel(bma2x2->dev_interrupt, + DOUBLE_TAP_INTERRUPT, + DOUBLE_TAP_INTERRUPT_HAPPENED); + break; + case 0x20: + PINFO("single tap interrupt happened\n"); + input_report_rel(bma2x2->dev_interrupt, + SINGLE_TAP_INTERRUPT, + SINGLE_TAP_INTERRUPT_HAPPENED); + break; +#endif + + case 0x40: + bma2x2_get_orient_status(bma2x2->bma2x2_client, + &first_value); + PINFO("orient interrupt happened,%s\n", + orient[first_value]); + if (first_value == 0) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED); + else if (first_value == 1) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED); + else if (first_value == 2) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED); + else if (first_value == 3) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED); + else if (first_value == 4) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + DOWNWARD_PORTRAIT_UP_INTERRUPT_HAPPENED); + else if (first_value == 5) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + DOWNWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED); + else if (first_value == 6) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + DOWNWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED); + else if (first_value == 7) + input_report_abs(bma2x2->dev_interrupt, + ORIENT_INTERRUPT, + DOWNWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED); + break; + case 0x80: + bma2x2_get_orient_flat_status(bma2x2->bma2x2_client, + &sign_value); + PINFO("flat interrupt happened,flat status is %d\n", + sign_value); + if (sign_value == 1) { + input_report_abs(bma2x2->dev_interrupt, + FLAT_INTERRUPT, + FLAT_INTERRUPT_TURE_HAPPENED); + } else { + input_report_abs(bma2x2->dev_interrupt, + FLAT_INTERRUPT, + FLAT_INTERRUPT_FALSE_HAPPENED); + } + break; + + default: + break; + } +} + +static irqreturn_t bma2x2_irq_handler(int irq, void *handle) +{ + struct bma2x2_data *data = handle; + + if (data == NULL) + return IRQ_HANDLED; + if (data->bma2x2_client == NULL) + return IRQ_HANDLED; + + schedule_work(&data->irq_work); + + return IRQ_HANDLED; +} +#endif /* defined(BMA2X2_ENABLE_INT1)||defined(BMA2X2_ENABLE_INT2) */ + +static enum hrtimer_restart timer_handler(struct hrtimer *handle) +{ + struct bma2x2_data *client_data; + + client_data = container_of(handle, struct bma2x2_data, timer); + queue_work(client_data->wq, &client_data->work); + + hrtimer_forward_now(&client_data->timer, ktime_set(0, atomic_read(&client_data->delay) * 1000000)); + + return HRTIMER_RESTART; +} + +static int bma2x2_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int err = 0; + struct bma2x2_data *data; + struct input_dev *dev; + struct bst_dev *dev_acc; +#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2) + struct bosch_sensor_specific *pdata; +#endif + struct input_dev *dev_interrupt; + + PINFO("bma2x2_probe start\n"); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + PERR("i2c_check_functionality error\n"); + err = -EIO; + goto exit; + } + data = kzalloc(sizeof(struct bma2x2_data), GFP_KERNEL); + if (!data) { + err = -ENOMEM; + goto exit; + } + + /* do soft reset */ + mdelay(5); + if (bma2x2_soft_reset(client) < 0) { + PERR("i2c bus write error, pls check HW connection\n"); + err = -EINVAL; + goto kfree_exit; + } + mdelay(5); + /* read and check chip id */ + if (bma2x2_check_chip_id(client, data) < 0) { + err = -EINVAL; + goto kfree_exit; + } + + i2c_set_clientdata(client, data); + data->bma2x2_client = client; + mutex_init(&data->value_mutex); + mutex_init(&data->mode_mutex); + mutex_init(&data->enable_mutex); + bma2x2_set_bandwidth(client, BMA2X2_BW_SET); + bma2x2_set_range(client, BMA2X2_RANGE_SET); + + +#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2) + + pdata = client->dev.platform_data; + if (pdata) { + if (pdata->irq_gpio_cfg && (pdata->irq_gpio_cfg() < 0)) { + PERR("IRQ GPIO conf. error %d\n", + client->irq); + } + } + +#ifdef BMA2X2_ENABLE_INT1 + /* maps interrupt to INT1 pin */ + bma2x2_set_int1_pad_sel(client, PAD_LOWG); + bma2x2_set_int1_pad_sel(client, PAD_HIGHG); + bma2x2_set_int1_pad_sel(client, PAD_SLOP); + bma2x2_set_int1_pad_sel(client, PAD_DOUBLE_TAP); + bma2x2_set_int1_pad_sel(client, PAD_SINGLE_TAP); + bma2x2_set_int1_pad_sel(client, PAD_ORIENT); + bma2x2_set_int1_pad_sel(client, PAD_FLAT); + bma2x2_set_int1_pad_sel(client, PAD_SLOW_NO_MOTION); +#ifdef CONFIG_BMA_ENABLE_NEWDATA_INT + bma2x2_set_newdata(client, BMA2X2_INT1_NDATA, 1); + bma2x2_set_newdata(client, BMA2X2_INT2_NDATA, 0); +#endif +#endif + +#ifdef BMA2X2_ENABLE_INT2 + /* maps interrupt to INT2 pin */ + bma2x2_set_int2_pad_sel(client, PAD_LOWG); + bma2x2_set_int2_pad_sel(client, PAD_HIGHG); + bma2x2_set_int2_pad_sel(client, PAD_SLOP); + bma2x2_set_int2_pad_sel(client, PAD_DOUBLE_TAP); + bma2x2_set_int2_pad_sel(client, PAD_SINGLE_TAP); + bma2x2_set_int2_pad_sel(client, PAD_ORIENT); + bma2x2_set_int2_pad_sel(client, PAD_FLAT); + bma2x2_set_int2_pad_sel(client, PAD_SLOW_NO_MOTION); +#ifdef CONFIG_BMA_ENABLE_NEWDATA_INT + bma2x2_set_newdata(client, BMA2X2_INT1_NDATA, 0); + bma2x2_set_newdata(client, BMA2X2_INT2_NDATA, 1); +#endif +#endif + + bma2x2_set_Int_Mode(client, 1);/*latch interrupt 250ms*/ + + /* do not open any interrupt here */ + /*10,orient + 11,flat*/ + /* bma2x2_set_Int_Enable(client, 10, 1); */ + /* bma2x2_set_Int_Enable(client, 11, 1); */ + +#ifdef CONFIG_BMA_ENABLE_NEWDATA_INT + /* enable new data interrupt */ + bma2x2_set_Int_Enable(client, 4, 1); +#endif + + + data->IRQ = client->irq; + err = request_irq(data->IRQ, bma2x2_irq_handler, IRQF_TRIGGER_RISING, + "bma2x2", data); +#ifdef CONFIG_SIG_MOTION + enable_irq_wake(data->IRQ); +#endif + if (err) + PERR("could not request irq\n"); + + INIT_WORK(&data->irq_work, bma2x2_irq_work_func); +#endif + +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT + //INIT_DELAYED_WORK(&data->work, bma2x2_work_func); + INIT_WORK(&data->work, bma2x2_work_func); + data->wq = create_workqueue("bma_wq"); + hrtimer_init(&data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + data->timer.function = timer_handler; +#endif + atomic_set(&data->delay, BMA2X2_MAX_DELAY); + atomic_set(&data->enable, 0); + + dev = input_allocate_device(); + if (!dev) + return -ENOMEM; + + dev_interrupt = input_allocate_device(); + if (!dev_interrupt) { + kfree(data); + input_free_device(dev); /*free the successful dev and return*/ + return -ENOMEM; + } + + /* only value events reported */ + dev->name = SENSOR_NAME; + dev->id.bustype = BUS_I2C; +#if 0 + input_set_capability(dev, EV_ABS, ABS_MISC); + input_set_abs_params(dev, ABS_X, ABSMIN, ABSMAX, 0, 0); + input_set_abs_params(dev, ABS_Y, ABSMIN, ABSMAX, 0, 0); + input_set_abs_params(dev, ABS_Z, ABSMIN, ABSMAX, 0, 0); +#else + input_set_capability(dev, EV_MSC, MSC_RAW); + input_set_capability(dev, EV_MSC, MSC_SCAN); + input_set_capability(dev, EV_MSC, MSC_GESTURE); +#endif + + input_set_drvdata(dev, data); + err = input_register_device(dev); + if (err < 0) + goto err_register_input_device; + + /* all interrupt generated events are moved to interrupt input devices*/ + dev_interrupt->name = "bma_interrupt"; + dev_interrupt->id.bustype = BUS_I2C; + input_set_capability(dev_interrupt, EV_REL, + SLOW_NO_MOTION_INTERRUPT); + input_set_capability(dev_interrupt, EV_REL, + LOW_G_INTERRUPT); + input_set_capability(dev_interrupt, EV_REL, + HIGH_G_INTERRUPT); + input_set_capability(dev_interrupt, EV_REL, + SLOP_INTERRUPT); + input_set_capability(dev_interrupt, EV_REL, + DOUBLE_TAP_INTERRUPT); + input_set_capability(dev_interrupt, EV_REL, + SINGLE_TAP_INTERRUPT); + input_set_capability(dev_interrupt, EV_ABS, + ORIENT_INTERRUPT); + input_set_capability(dev_interrupt, EV_ABS, + FLAT_INTERRUPT); + input_set_drvdata(dev_interrupt, data); + + err = input_register_device(dev_interrupt); + if (err < 0) + goto err_register_input_device_interrupt; + + data->dev_interrupt = dev_interrupt; + data->input = dev; + +#ifdef CONFIG_SIG_MOTION + data->g_sensor_class = class_create(THIS_MODULE, "sig_sensor"); + if (IS_ERR(data->g_sensor_class)) { + err = PTR_ERR(data->g_sensor_class); + data->g_sensor_class = NULL; + PERR("could not allocate g_sensor_class\n"); + goto err_create_class; + } + + data->g_sensor_dev = device_create(data->g_sensor_class, + NULL, 0, "%s", "g_sensor"); + if (unlikely(IS_ERR(data->g_sensor_dev))) { + err = PTR_ERR(data->g_sensor_dev); + data->g_sensor_dev = NULL; + + PERR("could not allocate g_sensor_dev\n"); + goto err_create_g_sensor_device; + } + + dev_set_drvdata(data->g_sensor_dev, data); + + err = sysfs_create_group(&data->g_sensor_dev->kobj, + &bma2x2_sig_motion_attribute_group); + if (err < 0) + goto error_sysfs; +#endif + + +#ifdef CONFIG_DOUBLE_TAP + data->g_sensor_class_doubletap = + class_create(THIS_MODULE, "dtap_sensor"); + if (IS_ERR(data->g_sensor_class_doubletap)) { + err = PTR_ERR(data->g_sensor_class_doubletap); + data->g_sensor_class_doubletap = NULL; + PERR("could not allocate g_sensor_class_doubletap\n"); + goto err_create_class; + } + + + data->g_sensor_dev_doubletap = device_create( + data->g_sensor_class_doubletap, + NULL, 0, "%s", "g_sensor"); + if (unlikely(IS_ERR(data->g_sensor_dev_doubletap))) { + err = PTR_ERR(data->g_sensor_dev_doubletap); + data->g_sensor_dev_doubletap = NULL; + + PERR("could not allocate g_sensor_dev_doubletap\n"); + goto err_create_g_sensor_device_double_tap; + } + + + dev_set_drvdata(data->g_sensor_dev_doubletap, data); + + err = sysfs_create_group(&data->g_sensor_dev_doubletap->kobj, + &bma2x2_double_tap_attribute_group); + if (err < 0) + goto error_sysfs; +#endif + + + err = sysfs_create_group(&data->input->dev.kobj, + &bma2x2_attribute_group); + if (err < 0) + goto error_sysfs; + + dev_acc = bst_allocate_device(); + if (!dev_acc) { + err = -ENOMEM; + goto error_sysfs; + } + dev_acc->name = ACC_NAME; + + bst_set_drvdata(dev_acc, data); + + err = bst_register_device(dev_acc); + if (err < 0) + goto bst_free_acc_exit; + + data->bst_acc = dev_acc; + err = sysfs_create_group(&data->bst_acc->dev.kobj, + &bma2x2_attribute_group); + + if (err < 0) + goto bst_free_exit; + +#if 0 + if (NULL != client->dev.platform_data) { + data->bst_pd = kzalloc(sizeof(*data->bst_pd), + GFP_KERNEL); + + if (NULL != data->bst_pd) { + memcpy(data->bst_pd, client->dev.platform_data, + sizeof(*data->bst_pd)); + PINFO("%s sensor driver set place: p%d", + data->bst_pd->name, data->bst_pd->place); + } + } +#endif + + data->bst_pd = kzalloc(sizeof(*data->bst_pd), + GFP_KERNEL); + + if (NULL != data->bst_pd) { + data->bst_pd->place=BOSCH_SENSOR_PLACE; + } + + +#ifdef CONFIG_HAS_EARLYSUSPEND + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + data->early_suspend.suspend = bma2x2_early_suspend; + data->early_suspend.resume = bma2x2_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + data->bma_mode_enabled = 0; + data->fifo_datasel = 0; + data->fifo_count = 0; + + +#ifdef CONFIG_SIG_MOTION + atomic_set(&data->en_sig_motion, 0); +#endif +#ifdef CONFIG_DOUBLE_TAP + atomic_set(&data->en_double_tap, 0); + data->tap_times = 0; + data->tap_time_period = DEFAULT_TAP_JUDGE_PERIOD; + mutex_init(&data->tap_mutex); + setup_timer(&data->tap_timer, bma2x2_tap_timeout_handle, + (unsigned long)data); +#endif + + if (bma2x2_set_mode(client, BMA2X2_MODE_SUSPEND, BMA_ENABLED_ALL) < 0) + return -EINVAL; + PINFO("BMA2x2 driver probe successfully"); + + return 0; + +bst_free_exit: + bst_unregister_device(dev_acc); + +bst_free_acc_exit: + bst_free_device(dev_acc); + +error_sysfs: + input_unregister_device(data->input); + +#ifdef CONFIG_DOUBLE_TAP +err_create_g_sensor_device_double_tap: + class_destroy(data->g_sensor_class_doubletap); +#endif + +#ifdef CONFIG_SIG_MOTION +err_create_g_sensor_device: + class_destroy(data->g_sensor_class); +#endif + +#if defined(CONFIG_SIG_MOTION) || defined(CONFIG_DOUBLE_TAP) +err_create_class: + input_unregister_device(data->dev_interrupt); +#endif + +err_register_input_device_interrupt: + input_free_device(dev_interrupt); + input_unregister_device(data->input); + +err_register_input_device: + input_free_device(dev); + +kfree_exit: + if ((NULL != data) && (NULL != data->bst_pd)) { + kfree(data->bst_pd); + data->bst_pd = NULL; + } + kfree(data); +exit: + return err; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void bma2x2_early_suspend(struct early_suspend *h) +{ + struct bma2x2_data *data = + container_of(h, struct bma2x2_data, early_suspend); + + mutex_lock(&data->enable_mutex); + if (atomic_read(&data->enable) == 1) { + bma2x2_set_mode(data->bma2x2_client, + BMA2X2_MODE_SUSPEND, BMA_ENABLED_INPUT); +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT +// cancel_delayed_work_sync(&data->work); + cancel_work_sync(&data->work); +#endif + } + mutex_unlock(&data->enable_mutex); +} + +static void bma2x2_late_resume(struct early_suspend *h) +{ + struct bma2x2_data *data = + container_of(h, struct bma2x2_data, early_suspend); + if (NULL == data) + return; + + mutex_lock(&data->enable_mutex); + if (atomic_read(&data->enable) == 1) { + bma2x2_set_mode(data->bma2x2_client, + BMA2X2_MODE_NORMAL, BMA_ENABLED_INPUT); +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT +// schedule_delayed_work(&data->work, +// msecs_to_jiffies(atomic_read(&data->delay))); + schedule_work(&data->work); +#endif + } + mutex_unlock(&data->enable_mutex); +} +#endif + +static int bma2x2_remove(struct i2c_client *client) +{ + struct bma2x2_data *data = i2c_get_clientdata(client); + + if (NULL == data) + return 0; + + bma2x2_set_enable(&client->dev, 0); +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + sysfs_remove_group(&data->input->dev.kobj, &bma2x2_attribute_group); + input_unregister_device(data->input); + + if (NULL != data->bst_pd) { + kfree(data->bst_pd); + data->bst_pd = NULL; + } + + kfree(data); + return 0; +} + +void bma2x2_shutdown(struct i2c_client *client) +{ + struct bma2x2_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->enable_mutex); + bma2x2_set_mode(data->bma2x2_client, + BMA2X2_MODE_DEEP_SUSPEND, BMA_ENABLED_ALL); + mutex_unlock(&data->enable_mutex); +} + +#ifdef CONFIG_PM +static int bma2x2_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct bma2x2_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->enable_mutex); + if (atomic_read(&data->enable) == 1) { + bma2x2_set_mode(data->bma2x2_client, + BMA2X2_MODE_SUSPEND, BMA_ENABLED_INPUT); +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT +// cancel_delayed_work_sync(&data->work); + cancel_work_sync(&data->work); + +#endif + } + mutex_unlock(&data->enable_mutex); + + return 0; +} + +static int bma2x2_resume(struct i2c_client *client) +{ + struct bma2x2_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->enable_mutex); + if (atomic_read(&data->enable) == 1) { + bma2x2_set_mode(data->bma2x2_client, + BMA2X2_MODE_NORMAL, BMA_ENABLED_INPUT); +#ifndef CONFIG_BMA_ENABLE_NEWDATA_INT +// schedule_delayed_work(&data->work, +// msecs_to_jiffies(atomic_read(&data->delay))); + schedule_work(&data->work); +#endif + } + mutex_unlock(&data->enable_mutex); + + return 0; +} + +#else + +#define bma2x2_suspend NULL +#define bma2x2_resume NULL + +#endif /* CONFIG_PM */ + +static const struct i2c_device_id bma2x2_id[] = { + { SENSOR_NAME, 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, bma2x2_id); + + +static struct of_device_id bst_match_table[] = { + { .compatible = "bst,bma2x2", }, + { }, +}; + +static struct i2c_driver bma2x2_driver = { + .driver = { + .owner = THIS_MODULE, + .name = SENSOR_NAME, +#ifdef CONFIG_OF + .of_match_table = bst_match_table, +#endif + }, + .suspend = bma2x2_suspend, + .resume = bma2x2_resume, + .id_table = bma2x2_id, + .probe = bma2x2_probe, + .remove = bma2x2_remove, + .shutdown = bma2x2_shutdown, +}; + +static struct bosch_sensor_specific __initdata bma2x2_pdata = { + .name = "bma2x2", + .place = 0, +}; + +static struct i2c_board_info __initdata sprd_i2c_bst = { + I2C_BOARD_INFO("bma2x2", 0x18), + .platform_data = &bma2x2_pdata, +}; + +static int __init BMA2X2_init(void) +{ + return i2c_add_driver(&bma2x2_driver); +} + +static void __exit BMA2X2_exit(void) +{ + i2c_del_driver(&bma2x2_driver); +} + +MODULE_AUTHOR("contact@bosch-sensortec.com"); +MODULE_DESCRIPTION("BMA2X2 ACCELEROMETER SENSOR DRIVER"); +MODULE_LICENSE("GPL v2"); + +//module_init(BMA2X2_init); +late_initcall(BMA2X2_init); +module_exit(BMA2X2_exit); + diff --git a/drivers/input/misc/bs_log.h b/drivers/input/misc/bs_log.h new file mode 100644 index 00000000..0d3af001 --- /dev/null +++ b/drivers/input/misc/bs_log.h @@ -0,0 +1,167 @@ +/*! + * @section LICENSE + * $license$ + * + * @filename $filename$ + * @date $date$ + * @id $id$ + * + * @brief + * The head file of BOSCH SENSOR LOG +*/ + +#ifndef __BS_LOG_H +#define __BS_LOG_H + +#include + +/*! @ trace functions + @{*/ +/*! ERROR LOG LEVEL */ +#define LOG_LEVEL_E 3 +/*! NOTICE LOG LEVEL */ +#define LOG_LEVEL_N 5 +/*! INFORMATION LOG LEVEL */ +#define LOG_LEVEL_I 6 +/*! DEBUG LOG LEVEL */ +#define LOG_LEVEL_D 7 +/*! DEBUG_FWDL LOG LEVEL */ +#define LOG_LEVEL_DF 10 +/*! DEBUG_DATA LOG LEVEL */ +#define LOG_LEVEL_DA 15 +/*! ALL LOG LEVEL */ +#define LOG_LEVEL_A 20 + +#ifndef MODULE_TAG +/*! MODULE TAG DEFINATION */ +#define MODULE_TAG "" +#endif + +#ifndef LOG_LEVEL +/*! LOG LEVEL DEFINATION */ +#define LOG_LEVEL LOG_LEVEL_I +#endif + +#ifdef BOSCH_DRIVER_LOG_FUNC + #ifdef BSLOG_VAR_DEF + uint8_t debug_log_level = LOG_LEVEL; + #else + extern uint8_t debug_log_level; + #endif + + /*! print error message */ + #define PERR(fmt, args...) do\ + {\ + if (debug_log_level >= LOG_LEVEL_E)\ + printk(KERN_INFO "\n" "[E]" KERN_ERR MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args);\ + } while (0) + + /*! print notice message */ + #define PNOTICE(fmt, args...) do\ + {\ + if (debug_log_level >= LOG_LEVEL_N)\ + printk(KERN_INFO "\n" "[N]" KERN_NOTICE MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args);\ + } while (0) + + /*! print information message */ + #define PINFO(fmt, args...) do\ + {\ + if (debug_log_level >= LOG_LEVEL_I)\ + printk(KERN_INFO "\n" "[I]" KERN_INFO MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args);\ + } while (0) + + /*! print debug message */ + #define PDEBUG(fmt, args...) do\ + {\ + if (debug_log_level >= LOG_LEVEL_D)\ + printk(KERN_INFO "\n" "[D]" KERN_DEBUG MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args);\ + } while (0) + + /*! print debug fw download message */ + #define PDEBUG_FWDL(fmt, args...) do\ + {\ + if (debug_log_level >= LOG_LEVEL_DF)\ + printk(KERN_INFO "\n" "[DF]" KERN_DEBUG MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args);\ + } while (0) + + /*! print debug data log message */ + #define PDEBUG_DLOG(fmt, args...) do\ + {\ + if (debug_log_level >= LOG_LEVEL_DA)\ + printk(KERN_INFO "\n" "[DA]" KERN_DEBUG MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args);\ + } while (0) + + void set_debug_log_level(uint8_t level); + uint8_t get_debug_log_level(void); + +#else + + #if (LOG_LEVEL >= LOG_LEVEL_E) + /*! print error message */ + #define PERR(fmt, args...) \ + printk(KERN_INFO "\n" "[E]" KERN_ERR MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args) + #else + /*! invalid message */ + #define PERR(fmt, args...) + #endif + + #if (LOG_LEVEL >= LOG_LEVEL_N) + /*! print notice message */ + #define PNOTICE(fmt, args...) \ + printk(KERN_INFO "\n" "[N]" KERN_NOTICE MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args) + #else + /*! invalid message */ + #define PNOTICE(fmt, args...) + #endif + + #if (LOG_LEVEL >= LOG_LEVEL_I) + /*! print information message */ + #define PINFO(fmt, args...) printk(KERN_INFO "\n" "[I]" KERN_INFO MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args) + #else + /*! invalid message */ + #define PINFO(fmt, args...) + #endif + + #if (LOG_LEVEL >= LOG_LEVEL_D) + /*! print debug message */ + #define PDEBUG(fmt, args...) printk(KERN_INFO "\n" "[D]" KERN_DEBUG MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args) + #else + /*! invalid message */ + #define PDEBUG(fmt, args...) + #endif + + #if (LOG_LEVEL >= LOG_LEVEL_DF) + /*! print debug fw download message */ + #define PDEBUG_FWDL(fmt, args...) printk(KERN_INFO "\n" "[DF]" KERN_DEBUG MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args) + #else + /*! invalid message */ + #define PDEBUG_FWDL(fmt, args...) + #endif + + #if (LOG_LEVEL >= LOG_LEVEL_DA) + /*! print debug data log message */ + #define PDEBUG_DLOG(fmt, args...) printk(KERN_INFO "\n" "[DA]" KERN_DEBUG MODULE_TAG \ + "<%s><%d>" fmt "\n", __func__, __LINE__, ##args) + #else + /*! invalid message */ + #define PDEBUG_DLOG(fmt, args...) + #endif + + #define set_debug_log_level(level) {} + #define get_debug_log_level() (LOG_LEVEL) + +#endif + +#endif/*__BS_LOG_H*/ +/*@}*/ diff --git a/drivers/input/misc/bstclass.c b/drivers/input/misc/bstclass.c new file mode 100644 index 00000000..11c3c39d --- /dev/null +++ b/drivers/input/misc/bstclass.c @@ -0,0 +1,234 @@ +/*! + * @section LICENSE + * $license$ + * + * @filename $filename$ + * @date $date$ + * @id $id$ + * + * @brief + * The core code of bst device driver +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bstclass.h" +#include "bs_log.h" + +static LIST_HEAD(bst_dev_list); + +/* + * bst_mutex protects access to both bst_dev_list and input_handler_list. + * This also causes bst_[un]register_device and bst_[un]register_handler + * be mutually exclusive which simplifies locking in drivers implementing + * input handlers. + */ +static DEFINE_MUTEX(bst_mutex); + + +static void bst_dev_release(struct device *device) +{ + struct bst_dev *dev = to_bst_dev(device); + if (NULL != dev) + kfree(dev); + module_put(THIS_MODULE); +} + + +#ifdef CONFIG_PM +static int bst_dev_suspend(struct device *dev) +{ + return 0; +} + +static int bst_dev_resume(struct device *dev) +{ + return 0; +} + +static const struct dev_pm_ops bst_dev_pm_ops = { + .suspend = bst_dev_suspend, + .resume = bst_dev_resume, + .poweroff = bst_dev_suspend, + .restore = bst_dev_resume, +}; +#endif /* CONFIG_PM */ + +static const struct attribute_group *bst_dev_attr_groups[] = { + NULL +}; + +static struct device_type bst_dev_type = { + .groups = bst_dev_attr_groups, + .release = bst_dev_release, +#ifdef CONFIG_PM + .pm = &bst_dev_pm_ops, +#endif +}; + + + +static char *bst_devnode(struct device *dev, mode_t *mode) +{ + return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); +} + +struct class bst_class = { + .name = "bst", + .owner = THIS_MODULE, + .devnode = bst_devnode, + .dev_release = bst_dev_release, +}; +EXPORT_SYMBOL_GPL(bst_class); + +/** + * bst_allocate_device - allocate memory for new input device + * + * Returns prepared struct bst_dev or NULL. + * + * NOTE: Use bst_free_device() to free devices that have not been + * registered; bst_unregister_device() should be used for already + * registered devices. + */ +struct bst_dev *bst_allocate_device(void) +{ + struct bst_dev *dev; + + dev = kzalloc(sizeof(struct bst_dev), GFP_KERNEL); + if (dev) { + dev->dev.type = &bst_dev_type; + dev->dev.class = &bst_class; + device_initialize(&dev->dev); + mutex_init(&dev->mutex); + INIT_LIST_HEAD(&dev->node); + __module_get(THIS_MODULE); + } + return dev; +} +EXPORT_SYMBOL(bst_allocate_device); + + + +/** + * bst_free_device - free memory occupied by bst_dev structure + * @dev: input device to free + * + * This function should only be used if bst_register_device() + * was not called yet or if it failed. Once device was registered + * use bst_unregister_device() and memory will be freed once last + * reference to the device is dropped. + * + * Device should be allocated by bst_allocate_device(). + * + * NOTE: If there are references to the input device then memory + * will not be freed until last reference is dropped. + */ +void bst_free_device(struct bst_dev *dev) +{ + if (dev) + bst_put_device(dev); +} +EXPORT_SYMBOL(bst_free_device); + +/** + * bst_register_device - register device with input core + * @dev: device to be registered + * + * This function registers device with input core. The device must be + * allocated with bst_allocate_device() and all it's capabilities + * set up before registering. + * If function fails the device must be freed with bst_free_device(). + * Once device has been successfully registered it can be unregistered + * with bst_unregister_device(); bst_free_device() should not be + * called in this case. + */ +int bst_register_device(struct bst_dev *dev) +{ + const char *path; + int error; + + + /* + * If delay and period are pre-set by the driver, then autorepeating + * is handled by the driver itself and we don't do it in input.c. + */ + dev_set_name(&dev->dev, dev->name); + + error = device_add(&dev->dev); + if (error) + return error; + + path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL); + PINFO("%s as %s\n", + dev->name ? dev->name : "Unspecified device", + path ? path : "N/A"); + kfree(path); + error = mutex_lock_interruptible(&bst_mutex); + if (error) { + device_del(&dev->dev); + return error; + } + + list_add_tail(&dev->node, &bst_dev_list); + + mutex_unlock(&bst_mutex); + return 0; +} +EXPORT_SYMBOL(bst_register_device); + +/** + * bst_unregister_device - unregister previously registered device + * @dev: device to be unregistered + * + * This function unregisters an input device. Once device is unregistered + * the caller should not try to access it as it may get freed at any moment. + */ +void bst_unregister_device(struct bst_dev *dev) +{ + int ret = 0; + ret = mutex_lock_interruptible(&bst_mutex); + if(ret){ + return; + } + + list_del_init(&dev->node); + mutex_unlock(&bst_mutex); + device_unregister(&dev->dev); +} +EXPORT_SYMBOL(bst_unregister_device); + +static int __init bst_init(void) +{ + int err; + /*bst class register*/ + err = class_register(&bst_class); + if (err) { + pr_err("unable to register bst_dev class\n"); + return err; + } + return err; +} + +static void __exit bst_exit(void) +{ + /*bst class*/ + class_unregister(&bst_class); +} + +/*subsys_initcall(bst_init);*/ + +MODULE_AUTHOR("contact@bosch-sensortec.com"); +MODULE_DESCRIPTION("BST CLASS CORE"); +MODULE_LICENSE("GPL V2"); + +module_init(bst_init); +module_exit(bst_exit); diff --git a/drivers/input/misc/bstclass.h b/drivers/input/misc/bstclass.h new file mode 100644 index 00000000..2291cca0 --- /dev/null +++ b/drivers/input/misc/bstclass.h @@ -0,0 +1,74 @@ +/*! + * @section LICENSE + * $license$ + * + * @filename $filename$ + * @date $date$ + * @id $id$ + * + * @brief + * The core code of bst device driver +*/ + +#ifndef _BSTCLASS_H +#define _BSTCLASS_H + +#ifdef __KERNEL__ +#include +#include +#else +#include +#include +#include +#include +#endif + +#include +#include +#include + +struct bst_dev { + const char *name; + + int (*open)(struct bst_dev *dev); + void (*close)(struct bst_dev *dev); + struct mutex mutex; + struct device dev; + struct list_head node; +}; + +#define to_bst_dev(d) container_of(d, struct bst_dev, dev) + +struct bst_dev *bst_allocate_device(void); +void bst_free_device(struct bst_dev *dev); + +static inline struct bst_dev *bst_get_device(struct bst_dev *dev) +{ + return dev ? to_bst_dev(get_device(&dev->dev)) : NULL; +} + +static inline void bst_put_device(struct bst_dev *dev) +{ + if (dev) + put_device(&dev->dev); +} + +static inline void *bst_get_drvdata(struct bst_dev *dev) +{ + return dev_get_drvdata(&dev->dev); +} + +static inline void bst_set_drvdata(struct bst_dev *dev, void *data) +{ + dev_set_drvdata(&dev->dev, data); +} + +int __must_check bst_register_device(struct bst_dev *); +void bst_unregister_device(struct bst_dev *); + +void bst_reset_device(struct bst_dev *); + + +extern struct class bst_class; + +#endif diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c new file mode 100644 index 00000000..082684e7 --- /dev/null +++ b/drivers/input/misc/cm109.c @@ -0,0 +1,918 @@ +/* + * Driver for the VoIP USB phones with CM109 chipsets. + * + * Copyright (C) 2007 - 2008 Alfred E. Heggestad + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2. + */ + +/* + * Tested devices: + * - Komunikate KIP1000 + * - Genius G-talk + * - Allied-Telesis Corega USBPH01 + * - ... + * + * This driver is based on the yealink.c driver + * + * Thanks to: + * - Authors of yealink.c + * - Thomas Reitmayr + * - Oliver Neukum for good review comments and code + * - Shaun Jackman for Genius G-talk keymap + * - Dmitry Torokhov for valuable input and review + * + * Todo: + * - Read/write EEPROM + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_VERSION "20080805" +#define DRIVER_AUTHOR "Alfred E. Heggestad" +#define DRIVER_DESC "CM109 phone driver" + +static char *phone = "kip1000"; +module_param(phone, charp, S_IRUSR); +MODULE_PARM_DESC(phone, "Phone name {kip1000, gtalk, usbph01, atcom}"); + +enum { + /* HID Registers */ + HID_IR0 = 0x00, /* Record/Playback-mute button, Volume up/down */ + HID_IR1 = 0x01, /* GPI, generic registers or EEPROM_DATA0 */ + HID_IR2 = 0x02, /* Generic registers or EEPROM_DATA1 */ + HID_IR3 = 0x03, /* Generic registers or EEPROM_CTRL */ + HID_OR0 = 0x00, /* Mapping control, buzzer, SPDIF (offset 0x04) */ + HID_OR1 = 0x01, /* GPO - General Purpose Output */ + HID_OR2 = 0x02, /* Set GPIO to input/output mode */ + HID_OR3 = 0x03, /* SPDIF status channel or EEPROM_CTRL */ + + /* HID_IR0 */ + RECORD_MUTE = 1 << 3, + PLAYBACK_MUTE = 1 << 2, + VOLUME_DOWN = 1 << 1, + VOLUME_UP = 1 << 0, + + /* HID_OR0 */ + /* bits 7-6 + 0: HID_OR1-2 are used for GPO; HID_OR0, 3 are used for buzzer + and SPDIF + 1: HID_OR0-3 are used as generic HID registers + 2: Values written to HID_OR0-3 are also mapped to MCU_CTRL, + EEPROM_DATA0-1, EEPROM_CTRL (see Note) + 3: Reserved + */ + HID_OR_GPO_BUZ_SPDIF = 0 << 6, + HID_OR_GENERIC_HID_REG = 1 << 6, + HID_OR_MAP_MCU_EEPROM = 2 << 6, + + BUZZER_ON = 1 << 5, + + /* up to 256 normal keys, up to 16 special keys */ + KEYMAP_SIZE = 256 + 16, +}; + +/* CM109 protocol packet */ +struct cm109_ctl_packet { + u8 byte[4]; +} __attribute__ ((packed)); + +enum { USB_PKT_LEN = sizeof(struct cm109_ctl_packet) }; + +/* CM109 device structure */ +struct cm109_dev { + struct input_dev *idev; /* input device */ + struct usb_device *udev; /* usb device */ + struct usb_interface *intf; + + /* irq input channel */ + struct cm109_ctl_packet *irq_data; + dma_addr_t irq_dma; + struct urb *urb_irq; + + /* control output channel */ + struct cm109_ctl_packet *ctl_data; + dma_addr_t ctl_dma; + struct usb_ctrlrequest *ctl_req; + struct urb *urb_ctl; + /* + * The 3 bitfields below are protected by ctl_submit_lock. + * They have to be separate since they are accessed from IRQ + * context. + */ + unsigned irq_urb_pending:1; /* irq_urb is in flight */ + unsigned ctl_urb_pending:1; /* ctl_urb is in flight */ + unsigned buzzer_pending:1; /* need to issue buzz command */ + spinlock_t ctl_submit_lock; + + unsigned char buzzer_state; /* on/off */ + + /* flags */ + unsigned open:1; + unsigned resetting:1; + unsigned shutdown:1; + + /* This mutex protects writes to the above flags */ + struct mutex pm_mutex; + + unsigned short keymap[KEYMAP_SIZE]; + + char phys[64]; /* physical device path */ + int key_code; /* last reported key */ + int keybit; /* 0=new scan 1,2,4,8=scan columns */ + u8 gpi; /* Cached value of GPI (high nibble) */ +}; + +/****************************************************************************** + * CM109 key interface + *****************************************************************************/ + +static unsigned short special_keymap(int code) +{ + if (code > 0xff) { + switch (code - 0xff) { + case RECORD_MUTE: return KEY_MUTE; + case PLAYBACK_MUTE: return KEY_MUTE; + case VOLUME_DOWN: return KEY_VOLUMEDOWN; + case VOLUME_UP: return KEY_VOLUMEUP; + } + } + return KEY_RESERVED; +} + +/* Map device buttons to internal key events. + * + * The "up" and "down" keys, are symbolised by arrows on the button. + * The "pickup" and "hangup" keys are symbolised by a green and red phone + * on the button. + + Komunikate KIP1000 Keyboard Matrix + + -> -- 1 -- 2 -- 3 --> GPI pin 4 (0x10) + | | | | + <- -- 4 -- 5 -- 6 --> GPI pin 5 (0x20) + | | | | + END - 7 -- 8 -- 9 --> GPI pin 6 (0x40) + | | | | + OK -- * -- 0 -- # --> GPI pin 7 (0x80) + | | | | + + /|\ /|\ /|\ /|\ + | | | | +GPO +pin: 3 2 1 0 + 0x8 0x4 0x2 0x1 + + */ +static unsigned short keymap_kip1000(int scancode) +{ + switch (scancode) { /* phone key: */ + case 0x82: return KEY_NUMERIC_0; /* 0 */ + case 0x14: return KEY_NUMERIC_1; /* 1 */ + case 0x12: return KEY_NUMERIC_2; /* 2 */ + case 0x11: return KEY_NUMERIC_3; /* 3 */ + case 0x24: return KEY_NUMERIC_4; /* 4 */ + case 0x22: return KEY_NUMERIC_5; /* 5 */ + case 0x21: return KEY_NUMERIC_6; /* 6 */ + case 0x44: return KEY_NUMERIC_7; /* 7 */ + case 0x42: return KEY_NUMERIC_8; /* 8 */ + case 0x41: return KEY_NUMERIC_9; /* 9 */ + case 0x81: return KEY_NUMERIC_POUND; /* # */ + case 0x84: return KEY_NUMERIC_STAR; /* * */ + case 0x88: return KEY_ENTER; /* pickup */ + case 0x48: return KEY_ESC; /* hangup */ + case 0x28: return KEY_LEFT; /* IN */ + case 0x18: return KEY_RIGHT; /* OUT */ + default: return special_keymap(scancode); + } +} + +/* + Contributed by Shaun Jackman + + Genius G-Talk keyboard matrix + 0 1 2 3 + 4: 0 4 8 Talk + 5: 1 5 9 End + 6: 2 6 # Up + 7: 3 7 * Down +*/ +static unsigned short keymap_gtalk(int scancode) +{ + switch (scancode) { + case 0x11: return KEY_NUMERIC_0; + case 0x21: return KEY_NUMERIC_1; + case 0x41: return KEY_NUMERIC_2; + case 0x81: return KEY_NUMERIC_3; + case 0x12: return KEY_NUMERIC_4; + case 0x22: return KEY_NUMERIC_5; + case 0x42: return KEY_NUMERIC_6; + case 0x82: return KEY_NUMERIC_7; + case 0x14: return KEY_NUMERIC_8; + case 0x24: return KEY_NUMERIC_9; + case 0x44: return KEY_NUMERIC_POUND; /* # */ + case 0x84: return KEY_NUMERIC_STAR; /* * */ + case 0x18: return KEY_ENTER; /* Talk (green handset) */ + case 0x28: return KEY_ESC; /* End (red handset) */ + case 0x48: return KEY_UP; /* Menu up (rocker switch) */ + case 0x88: return KEY_DOWN; /* Menu down (rocker switch) */ + default: return special_keymap(scancode); + } +} + +/* + * Keymap for Allied-Telesis Corega USBPH01 + * http://www.alliedtelesis-corega.com/2/1344/1437/1360/chprd.html + * + * Contributed by july@nat.bg + */ +static unsigned short keymap_usbph01(int scancode) +{ + switch (scancode) { + case 0x11: return KEY_NUMERIC_0; /* 0 */ + case 0x21: return KEY_NUMERIC_1; /* 1 */ + case 0x41: return KEY_NUMERIC_2; /* 2 */ + case 0x81: return KEY_NUMERIC_3; /* 3 */ + case 0x12: return KEY_NUMERIC_4; /* 4 */ + case 0x22: return KEY_NUMERIC_5; /* 5 */ + case 0x42: return KEY_NUMERIC_6; /* 6 */ + case 0x82: return KEY_NUMERIC_7; /* 7 */ + case 0x14: return KEY_NUMERIC_8; /* 8 */ + case 0x24: return KEY_NUMERIC_9; /* 9 */ + case 0x44: return KEY_NUMERIC_POUND; /* # */ + case 0x84: return KEY_NUMERIC_STAR; /* * */ + case 0x18: return KEY_ENTER; /* pickup */ + case 0x28: return KEY_ESC; /* hangup */ + case 0x48: return KEY_LEFT; /* IN */ + case 0x88: return KEY_RIGHT; /* OUT */ + default: return special_keymap(scancode); + } +} + +/* + * Keymap for ATCom AU-100 + * http://www.atcom.cn/products.html + * http://www.packetizer.com/products/au100/ + * http://www.voip-info.org/wiki/view/AU-100 + * + * Contributed by daniel@gimpelevich.san-francisco.ca.us + */ +static unsigned short keymap_atcom(int scancode) +{ + switch (scancode) { /* phone key: */ + case 0x82: return KEY_NUMERIC_0; /* 0 */ + case 0x11: return KEY_NUMERIC_1; /* 1 */ + case 0x12: return KEY_NUMERIC_2; /* 2 */ + case 0x14: return KEY_NUMERIC_3; /* 3 */ + case 0x21: return KEY_NUMERIC_4; /* 4 */ + case 0x22: return KEY_NUMERIC_5; /* 5 */ + case 0x24: return KEY_NUMERIC_6; /* 6 */ + case 0x41: return KEY_NUMERIC_7; /* 7 */ + case 0x42: return KEY_NUMERIC_8; /* 8 */ + case 0x44: return KEY_NUMERIC_9; /* 9 */ + case 0x84: return KEY_NUMERIC_POUND; /* # */ + case 0x81: return KEY_NUMERIC_STAR; /* * */ + case 0x18: return KEY_ENTER; /* pickup */ + case 0x28: return KEY_ESC; /* hangup */ + case 0x48: return KEY_LEFT; /* left arrow */ + case 0x88: return KEY_RIGHT; /* right arrow */ + default: return special_keymap(scancode); + } +} + +static unsigned short (*keymap)(int) = keymap_kip1000; + +/* + * Completes a request by converting the data into events for the + * input subsystem. + */ +static void report_key(struct cm109_dev *dev, int key) +{ + struct input_dev *idev = dev->idev; + + if (dev->key_code >= 0) { + /* old key up */ + input_report_key(idev, dev->key_code, 0); + } + + dev->key_code = key; + if (key >= 0) { + /* new valid key */ + input_report_key(idev, key, 1); + } + + input_sync(idev); +} + +/****************************************************************************** + * CM109 usb communication interface + *****************************************************************************/ + +static void cm109_submit_buzz_toggle(struct cm109_dev *dev) +{ + int error; + + if (dev->buzzer_state) + dev->ctl_data->byte[HID_OR0] |= BUZZER_ON; + else + dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; + + error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); + if (error) + dev_err(&dev->intf->dev, + "%s: usb_submit_urb (urb_ctl) failed %d\n", + __func__, error); +} + +/* + * IRQ handler + */ +static void cm109_urb_irq_callback(struct urb *urb) +{ + struct cm109_dev *dev = urb->context; + const int status = urb->status; + int error; + + dev_dbg(&dev->intf->dev, "### URB IRQ: [0x%02x 0x%02x 0x%02x 0x%02x] keybit=0x%02x\n", + dev->irq_data->byte[0], + dev->irq_data->byte[1], + dev->irq_data->byte[2], + dev->irq_data->byte[3], + dev->keybit); + + if (status) { + if (status == -ESHUTDOWN) + return; + dev_err(&dev->intf->dev, "%s: urb status %d\n", __func__, status); + } + + /* Special keys */ + if (dev->irq_data->byte[HID_IR0] & 0x0f) { + const int code = (dev->irq_data->byte[HID_IR0] & 0x0f); + report_key(dev, dev->keymap[0xff + code]); + } + + /* Scan key column */ + if (dev->keybit == 0xf) { + + /* Any changes ? */ + if ((dev->gpi & 0xf0) == (dev->irq_data->byte[HID_IR1] & 0xf0)) + goto out; + + dev->gpi = dev->irq_data->byte[HID_IR1] & 0xf0; + dev->keybit = 0x1; + } else { + report_key(dev, dev->keymap[dev->irq_data->byte[HID_IR1]]); + + dev->keybit <<= 1; + if (dev->keybit > 0x8) + dev->keybit = 0xf; + } + + out: + + spin_lock(&dev->ctl_submit_lock); + + dev->irq_urb_pending = 0; + + if (likely(!dev->shutdown)) { + + if (dev->buzzer_state) + dev->ctl_data->byte[HID_OR0] |= BUZZER_ON; + else + dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; + + dev->ctl_data->byte[HID_OR1] = dev->keybit; + dev->ctl_data->byte[HID_OR2] = dev->keybit; + + dev->buzzer_pending = 0; + dev->ctl_urb_pending = 1; + + error = usb_submit_urb(dev->urb_ctl, GFP_ATOMIC); + if (error) + dev_err(&dev->intf->dev, + "%s: usb_submit_urb (urb_ctl) failed %d\n", + __func__, error); + } + + spin_unlock(&dev->ctl_submit_lock); +} + +static void cm109_urb_ctl_callback(struct urb *urb) +{ + struct cm109_dev *dev = urb->context; + const int status = urb->status; + int error; + + dev_dbg(&dev->intf->dev, "### URB CTL: [0x%02x 0x%02x 0x%02x 0x%02x]\n", + dev->ctl_data->byte[0], + dev->ctl_data->byte[1], + dev->ctl_data->byte[2], + dev->ctl_data->byte[3]); + + if (status) + dev_err(&dev->intf->dev, "%s: urb status %d\n", __func__, status); + + spin_lock(&dev->ctl_submit_lock); + + dev->ctl_urb_pending = 0; + + if (likely(!dev->shutdown)) { + + if (dev->buzzer_pending) { + dev->buzzer_pending = 0; + dev->ctl_urb_pending = 1; + cm109_submit_buzz_toggle(dev); + } else if (likely(!dev->irq_urb_pending)) { + /* ask for key data */ + dev->irq_urb_pending = 1; + error = usb_submit_urb(dev->urb_irq, GFP_ATOMIC); + if (error) + dev_err(&dev->intf->dev, + "%s: usb_submit_urb (urb_irq) failed %d\n", + __func__, error); + } + } + + spin_unlock(&dev->ctl_submit_lock); +} + +static void cm109_toggle_buzzer_async(struct cm109_dev *dev) +{ + unsigned long flags; + + spin_lock_irqsave(&dev->ctl_submit_lock, flags); + + if (dev->ctl_urb_pending) { + /* URB completion will resubmit */ + dev->buzzer_pending = 1; + } else { + dev->ctl_urb_pending = 1; + cm109_submit_buzz_toggle(dev); + } + + spin_unlock_irqrestore(&dev->ctl_submit_lock, flags); +} + +static void cm109_toggle_buzzer_sync(struct cm109_dev *dev, int on) +{ + int error; + + if (on) + dev->ctl_data->byte[HID_OR0] |= BUZZER_ON; + else + dev->ctl_data->byte[HID_OR0] &= ~BUZZER_ON; + + error = usb_control_msg(dev->udev, + usb_sndctrlpipe(dev->udev, 0), + dev->ctl_req->bRequest, + dev->ctl_req->bRequestType, + le16_to_cpu(dev->ctl_req->wValue), + le16_to_cpu(dev->ctl_req->wIndex), + dev->ctl_data, + USB_PKT_LEN, USB_CTRL_SET_TIMEOUT); + if (error < 0 && error != -EINTR) + dev_err(&dev->intf->dev, "%s: usb_control_msg() failed %d\n", + __func__, error); +} + +static void cm109_stop_traffic(struct cm109_dev *dev) +{ + dev->shutdown = 1; + /* + * Make sure other CPUs see this + */ + smp_wmb(); + + usb_kill_urb(dev->urb_ctl); + usb_kill_urb(dev->urb_irq); + + cm109_toggle_buzzer_sync(dev, 0); + + dev->shutdown = 0; + smp_wmb(); +} + +static void cm109_restore_state(struct cm109_dev *dev) +{ + if (dev->open) { + /* + * Restore buzzer state. + * This will also kick regular URB submission + */ + cm109_toggle_buzzer_async(dev); + } +} + +/****************************************************************************** + * input event interface + *****************************************************************************/ + +static int cm109_input_open(struct input_dev *idev) +{ + struct cm109_dev *dev = input_get_drvdata(idev); + int error; + + error = usb_autopm_get_interface(dev->intf); + if (error < 0) { + dev_err(&idev->dev, "%s - cannot autoresume, result %d\n", + __func__, error); + return error; + } + + mutex_lock(&dev->pm_mutex); + + dev->buzzer_state = 0; + dev->key_code = -1; /* no keys pressed */ + dev->keybit = 0xf; + + /* issue INIT */ + dev->ctl_data->byte[HID_OR0] = HID_OR_GPO_BUZ_SPDIF; + dev->ctl_data->byte[HID_OR1] = dev->keybit; + dev->ctl_data->byte[HID_OR2] = dev->keybit; + dev->ctl_data->byte[HID_OR3] = 0x00; + + error = usb_submit_urb(dev->urb_ctl, GFP_KERNEL); + if (error) + dev_err(&dev->intf->dev, "%s: usb_submit_urb (urb_ctl) failed %d\n", + __func__, error); + else + dev->open = 1; + + mutex_unlock(&dev->pm_mutex); + + if (error) + usb_autopm_put_interface(dev->intf); + + return error; +} + +static void cm109_input_close(struct input_dev *idev) +{ + struct cm109_dev *dev = input_get_drvdata(idev); + + mutex_lock(&dev->pm_mutex); + + /* + * Once we are here event delivery is stopped so we + * don't need to worry about someone starting buzzer + * again + */ + cm109_stop_traffic(dev); + dev->open = 0; + + mutex_unlock(&dev->pm_mutex); + + usb_autopm_put_interface(dev->intf); +} + +static int cm109_input_ev(struct input_dev *idev, unsigned int type, + unsigned int code, int value) +{ + struct cm109_dev *dev = input_get_drvdata(idev); + + dev_dbg(&dev->intf->dev, + "input_ev: type=%u code=%u value=%d\n", type, code, value); + + if (type != EV_SND) + return -EINVAL; + + switch (code) { + case SND_TONE: + case SND_BELL: + dev->buzzer_state = !!value; + if (!dev->resetting) + cm109_toggle_buzzer_async(dev); + return 0; + + default: + return -EINVAL; + } +} + + +/****************************************************************************** + * Linux interface and usb initialisation + *****************************************************************************/ + +struct driver_info { + char *name; +}; + +static const struct driver_info info_cm109 = { + .name = "CM109 USB driver", +}; + +enum { + VENDOR_ID = 0x0d8c, /* C-Media Electronics */ + PRODUCT_ID_CM109 = 0x000e, /* CM109 defines range 0x0008 - 0x000f */ +}; + +/* table of devices that work with this driver */ +static const struct usb_device_id cm109_usb_table[] = { + { + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | + USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = VENDOR_ID, + .idProduct = PRODUCT_ID_CM109, + .bInterfaceClass = USB_CLASS_HID, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .driver_info = (kernel_ulong_t) &info_cm109 + }, + /* you can add more devices here with product ID 0x0008 - 0x000f */ + { } +}; + +static void cm109_usb_cleanup(struct cm109_dev *dev) +{ + kfree(dev->ctl_req); + if (dev->ctl_data) + usb_free_coherent(dev->udev, USB_PKT_LEN, + dev->ctl_data, dev->ctl_dma); + if (dev->irq_data) + usb_free_coherent(dev->udev, USB_PKT_LEN, + dev->irq_data, dev->irq_dma); + + usb_free_urb(dev->urb_irq); /* parameter validation in core/urb */ + usb_free_urb(dev->urb_ctl); /* parameter validation in core/urb */ + kfree(dev); +} + +static void cm109_usb_disconnect(struct usb_interface *interface) +{ + struct cm109_dev *dev = usb_get_intfdata(interface); + + usb_set_intfdata(interface, NULL); + input_unregister_device(dev->idev); + cm109_usb_cleanup(dev); +} + +static int cm109_usb_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(intf); + struct driver_info *nfo = (struct driver_info *)id->driver_info; + struct usb_host_interface *interface; + struct usb_endpoint_descriptor *endpoint; + struct cm109_dev *dev; + struct input_dev *input_dev = NULL; + int ret, pipe, i; + int error = -ENOMEM; + + interface = intf->cur_altsetting; + endpoint = &interface->endpoint[0].desc; + + if (!usb_endpoint_is_int_in(endpoint)) + return -ENODEV; + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) + return -ENOMEM; + + spin_lock_init(&dev->ctl_submit_lock); + mutex_init(&dev->pm_mutex); + + dev->udev = udev; + dev->intf = intf; + + dev->idev = input_dev = input_allocate_device(); + if (!input_dev) + goto err_out; + + /* allocate usb buffers */ + dev->irq_data = usb_alloc_coherent(udev, USB_PKT_LEN, + GFP_KERNEL, &dev->irq_dma); + if (!dev->irq_data) + goto err_out; + + dev->ctl_data = usb_alloc_coherent(udev, USB_PKT_LEN, + GFP_KERNEL, &dev->ctl_dma); + if (!dev->ctl_data) + goto err_out; + + dev->ctl_req = kmalloc(sizeof(*(dev->ctl_req)), GFP_KERNEL); + if (!dev->ctl_req) + goto err_out; + + /* allocate urb structures */ + dev->urb_irq = usb_alloc_urb(0, GFP_KERNEL); + if (!dev->urb_irq) + goto err_out; + + dev->urb_ctl = usb_alloc_urb(0, GFP_KERNEL); + if (!dev->urb_ctl) + goto err_out; + + /* get a handle to the interrupt data pipe */ + pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); + ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + if (ret != USB_PKT_LEN) + dev_err(&intf->dev, "invalid payload size %d, expected %d\n", + ret, USB_PKT_LEN); + + /* initialise irq urb */ + usb_fill_int_urb(dev->urb_irq, udev, pipe, dev->irq_data, + USB_PKT_LEN, + cm109_urb_irq_callback, dev, endpoint->bInterval); + dev->urb_irq->transfer_dma = dev->irq_dma; + dev->urb_irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + dev->urb_irq->dev = udev; + + /* initialise ctl urb */ + dev->ctl_req->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | + USB_DIR_OUT; + dev->ctl_req->bRequest = USB_REQ_SET_CONFIGURATION; + dev->ctl_req->wValue = cpu_to_le16(0x200); + dev->ctl_req->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); + dev->ctl_req->wLength = cpu_to_le16(USB_PKT_LEN); + + usb_fill_control_urb(dev->urb_ctl, udev, usb_sndctrlpipe(udev, 0), + (void *)dev->ctl_req, dev->ctl_data, USB_PKT_LEN, + cm109_urb_ctl_callback, dev); + dev->urb_ctl->transfer_dma = dev->ctl_dma; + dev->urb_ctl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + dev->urb_ctl->dev = udev; + + /* find out the physical bus location */ + usb_make_path(udev, dev->phys, sizeof(dev->phys)); + strlcat(dev->phys, "/input0", sizeof(dev->phys)); + + /* register settings for the input device */ + input_dev->name = nfo->name; + input_dev->phys = dev->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, dev); + input_dev->open = cm109_input_open; + input_dev->close = cm109_input_close; + input_dev->event = cm109_input_ev; + + input_dev->keycode = dev->keymap; + input_dev->keycodesize = sizeof(unsigned char); + input_dev->keycodemax = ARRAY_SIZE(dev->keymap); + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_SND); + input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); + + /* register available key events */ + for (i = 0; i < KEYMAP_SIZE; i++) { + unsigned short k = keymap(i); + dev->keymap[i] = k; + __set_bit(k, input_dev->keybit); + } + __clear_bit(KEY_RESERVED, input_dev->keybit); + + error = input_register_device(dev->idev); + if (error) + goto err_out; + + usb_set_intfdata(intf, dev); + + return 0; + + err_out: + input_free_device(input_dev); + cm109_usb_cleanup(dev); + return error; +} + +static int cm109_usb_suspend(struct usb_interface *intf, pm_message_t message) +{ + struct cm109_dev *dev = usb_get_intfdata(intf); + + dev_info(&intf->dev, "cm109: usb_suspend (event=%d)\n", message.event); + + mutex_lock(&dev->pm_mutex); + cm109_stop_traffic(dev); + mutex_unlock(&dev->pm_mutex); + + return 0; +} + +static int cm109_usb_resume(struct usb_interface *intf) +{ + struct cm109_dev *dev = usb_get_intfdata(intf); + + dev_info(&intf->dev, "cm109: usb_resume\n"); + + mutex_lock(&dev->pm_mutex); + cm109_restore_state(dev); + mutex_unlock(&dev->pm_mutex); + + return 0; +} + +static int cm109_usb_pre_reset(struct usb_interface *intf) +{ + struct cm109_dev *dev = usb_get_intfdata(intf); + + mutex_lock(&dev->pm_mutex); + + /* + * Make sure input events don't try to toggle buzzer + * while we are resetting + */ + dev->resetting = 1; + smp_wmb(); + + cm109_stop_traffic(dev); + + return 0; +} + +static int cm109_usb_post_reset(struct usb_interface *intf) +{ + struct cm109_dev *dev = usb_get_intfdata(intf); + + dev->resetting = 0; + smp_wmb(); + + cm109_restore_state(dev); + + mutex_unlock(&dev->pm_mutex); + + return 0; +} + +static struct usb_driver cm109_driver = { + .name = "cm109", + .probe = cm109_usb_probe, + .disconnect = cm109_usb_disconnect, + .suspend = cm109_usb_suspend, + .resume = cm109_usb_resume, + .reset_resume = cm109_usb_resume, + .pre_reset = cm109_usb_pre_reset, + .post_reset = cm109_usb_post_reset, + .id_table = cm109_usb_table, + .supports_autosuspend = 1, +}; + +static int __init cm109_select_keymap(void) +{ + /* Load the phone keymap */ + if (!strcasecmp(phone, "kip1000")) { + keymap = keymap_kip1000; + printk(KERN_INFO KBUILD_MODNAME ": " + "Keymap for Komunikate KIP1000 phone loaded\n"); + } else if (!strcasecmp(phone, "gtalk")) { + keymap = keymap_gtalk; + printk(KERN_INFO KBUILD_MODNAME ": " + "Keymap for Genius G-talk phone loaded\n"); + } else if (!strcasecmp(phone, "usbph01")) { + keymap = keymap_usbph01; + printk(KERN_INFO KBUILD_MODNAME ": " + "Keymap for Allied-Telesis Corega USBPH01 phone loaded\n"); + } else if (!strcasecmp(phone, "atcom")) { + keymap = keymap_atcom; + printk(KERN_INFO KBUILD_MODNAME ": " + "Keymap for ATCom AU-100 phone loaded\n"); + } else { + printk(KERN_ERR KBUILD_MODNAME ": " + "Unsupported phone: %s\n", phone); + return -EINVAL; + } + + return 0; +} + +static int __init cm109_init(void) +{ + int err; + + err = cm109_select_keymap(); + if (err) + return err; + + err = usb_register(&cm109_driver); + if (err) + return err; + + printk(KERN_INFO KBUILD_MODNAME ": " + DRIVER_DESC ": " DRIVER_VERSION " (C) " DRIVER_AUTHOR "\n"); + + return 0; +} + +static void __exit cm109_exit(void) +{ + usb_deregister(&cm109_driver); +} + +module_init(cm109_init); +module_exit(cm109_exit); + +MODULE_DEVICE_TABLE(usb, cm109_usb_table); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/cma3000_d0x.c b/drivers/input/misc/cma3000_d0x.c new file mode 100644 index 00000000..df9b7565 --- /dev/null +++ b/drivers/input/misc/cma3000_d0x.c @@ -0,0 +1,399 @@ +/* + * VTI CMA3000_D0x Accelerometer driver + * + * Copyright (C) 2010 Texas Instruments + * Author: Hemanth V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "cma3000_d0x.h" + +#define CMA3000_WHOAMI 0x00 +#define CMA3000_REVID 0x01 +#define CMA3000_CTRL 0x02 +#define CMA3000_STATUS 0x03 +#define CMA3000_RSTR 0x04 +#define CMA3000_INTSTATUS 0x05 +#define CMA3000_DOUTX 0x06 +#define CMA3000_DOUTY 0x07 +#define CMA3000_DOUTZ 0x08 +#define CMA3000_MDTHR 0x09 +#define CMA3000_MDFFTMR 0x0A +#define CMA3000_FFTHR 0x0B + +#define CMA3000_RANGE2G (1 << 7) +#define CMA3000_RANGE8G (0 << 7) +#define CMA3000_BUSI2C (0 << 4) +#define CMA3000_MODEMASK (7 << 1) +#define CMA3000_GRANGEMASK (1 << 7) + +#define CMA3000_STATUS_PERR 1 +#define CMA3000_INTSTATUS_FFDET (1 << 2) + +/* Settling time delay in ms */ +#define CMA3000_SETDELAY 30 + +/* Delay for clearing interrupt in us */ +#define CMA3000_INTDELAY 44 + + +/* + * Bit weights in mg for bit 0, other bits need + * multiply factor 2^n. Eight bit is the sign bit. + */ +#define BIT_TO_2G 18 +#define BIT_TO_8G 71 + +struct cma3000_accl_data { + const struct cma3000_bus_ops *bus_ops; + const struct cma3000_platform_data *pdata; + + struct device *dev; + struct input_dev *input_dev; + + int bit_to_mg; + int irq; + + int g_range; + u8 mode; + + struct mutex mutex; + bool opened; + bool suspended; +}; + +#define CMA3000_READ(data, reg, msg) \ + (data->bus_ops->read(data->dev, reg, msg)) +#define CMA3000_SET(data, reg, val, msg) \ + ((data)->bus_ops->write(data->dev, reg, val, msg)) + +/* + * Conversion for each of the eight modes to g, depending + * on G range i.e 2G or 8G. Some modes always operate in + * 8G. + */ + +static int mode_to_mg[8][2] = { + { 0, 0 }, + { BIT_TO_8G, BIT_TO_2G }, + { BIT_TO_8G, BIT_TO_2G }, + { BIT_TO_8G, BIT_TO_8G }, + { BIT_TO_8G, BIT_TO_8G }, + { BIT_TO_8G, BIT_TO_2G }, + { BIT_TO_8G, BIT_TO_2G }, + { 0, 0}, +}; + +static void decode_mg(struct cma3000_accl_data *data, int *datax, + int *datay, int *dataz) +{ + /* Data in 2's complement, convert to mg */ + *datax = ((s8)*datax) * data->bit_to_mg; + *datay = ((s8)*datay) * data->bit_to_mg; + *dataz = ((s8)*dataz) * data->bit_to_mg; +} + +static irqreturn_t cma3000_thread_irq(int irq, void *dev_id) +{ + struct cma3000_accl_data *data = dev_id; + int datax, datay, dataz, intr_status; + u8 ctrl, mode, range; + + intr_status = CMA3000_READ(data, CMA3000_INTSTATUS, "interrupt status"); + if (intr_status < 0) + return IRQ_NONE; + + /* Check if free fall is detected, report immediately */ + if (intr_status & CMA3000_INTSTATUS_FFDET) { + input_report_abs(data->input_dev, ABS_MISC, 1); + input_sync(data->input_dev); + } else { + input_report_abs(data->input_dev, ABS_MISC, 0); + } + + datax = CMA3000_READ(data, CMA3000_DOUTX, "X"); + datay = CMA3000_READ(data, CMA3000_DOUTY, "Y"); + dataz = CMA3000_READ(data, CMA3000_DOUTZ, "Z"); + + ctrl = CMA3000_READ(data, CMA3000_CTRL, "ctrl"); + mode = (ctrl & CMA3000_MODEMASK) >> 1; + range = (ctrl & CMA3000_GRANGEMASK) >> 7; + + data->bit_to_mg = mode_to_mg[mode][range]; + + /* Interrupt not for this device */ + if (data->bit_to_mg == 0) + return IRQ_NONE; + + /* Decode register values to milli g */ + decode_mg(data, &datax, &datay, &dataz); + + input_report_abs(data->input_dev, ABS_X, datax); + input_report_abs(data->input_dev, ABS_Y, datay); + input_report_abs(data->input_dev, ABS_Z, dataz); + input_sync(data->input_dev); + + return IRQ_HANDLED; +} + +static int cma3000_reset(struct cma3000_accl_data *data) +{ + int val; + + /* Reset sequence */ + CMA3000_SET(data, CMA3000_RSTR, 0x02, "Reset"); + CMA3000_SET(data, CMA3000_RSTR, 0x0A, "Reset"); + CMA3000_SET(data, CMA3000_RSTR, 0x04, "Reset"); + + /* Settling time delay */ + mdelay(10); + + val = CMA3000_READ(data, CMA3000_STATUS, "Status"); + if (val < 0) { + dev_err(data->dev, "Reset failed\n"); + return val; + } + + if (val & CMA3000_STATUS_PERR) { + dev_err(data->dev, "Parity Error\n"); + return -EIO; + } + + return 0; +} + +static int cma3000_poweron(struct cma3000_accl_data *data) +{ + const struct cma3000_platform_data *pdata = data->pdata; + u8 ctrl = 0; + int ret; + + if (data->g_range == CMARANGE_2G) { + ctrl = (data->mode << 1) | CMA3000_RANGE2G; + } else if (data->g_range == CMARANGE_8G) { + ctrl = (data->mode << 1) | CMA3000_RANGE8G; + } else { + dev_info(data->dev, + "Invalid G range specified, assuming 8G\n"); + ctrl = (data->mode << 1) | CMA3000_RANGE8G; + } + + ctrl |= data->bus_ops->ctrl_mod; + + CMA3000_SET(data, CMA3000_MDTHR, pdata->mdthr, + "Motion Detect Threshold"); + CMA3000_SET(data, CMA3000_MDFFTMR, pdata->mdfftmr, + "Time register"); + CMA3000_SET(data, CMA3000_FFTHR, pdata->ffthr, + "Free fall threshold"); + ret = CMA3000_SET(data, CMA3000_CTRL, ctrl, "Mode setting"); + if (ret < 0) + return -EIO; + + msleep(CMA3000_SETDELAY); + + return 0; +} + +static int cma3000_poweroff(struct cma3000_accl_data *data) +{ + int ret; + + ret = CMA3000_SET(data, CMA3000_CTRL, CMAMODE_POFF, "Mode setting"); + msleep(CMA3000_SETDELAY); + + return ret; +} + +static int cma3000_open(struct input_dev *input_dev) +{ + struct cma3000_accl_data *data = input_get_drvdata(input_dev); + + mutex_lock(&data->mutex); + + if (!data->suspended) + cma3000_poweron(data); + + data->opened = true; + + mutex_unlock(&data->mutex); + + return 0; +} + +static void cma3000_close(struct input_dev *input_dev) +{ + struct cma3000_accl_data *data = input_get_drvdata(input_dev); + + mutex_lock(&data->mutex); + + if (!data->suspended) + cma3000_poweroff(data); + + data->opened = false; + + mutex_unlock(&data->mutex); +} + +void cma3000_suspend(struct cma3000_accl_data *data) +{ + mutex_lock(&data->mutex); + + if (!data->suspended && data->opened) + cma3000_poweroff(data); + + data->suspended = true; + + mutex_unlock(&data->mutex); +} +EXPORT_SYMBOL(cma3000_suspend); + + +void cma3000_resume(struct cma3000_accl_data *data) +{ + mutex_lock(&data->mutex); + + if (data->suspended && data->opened) + cma3000_poweron(data); + + data->suspended = false; + + mutex_unlock(&data->mutex); +} +EXPORT_SYMBOL(cma3000_resume); + +struct cma3000_accl_data *cma3000_init(struct device *dev, int irq, + const struct cma3000_bus_ops *bops) +{ + const struct cma3000_platform_data *pdata = dev->platform_data; + struct cma3000_accl_data *data; + struct input_dev *input_dev; + int rev; + int error; + + if (!pdata) { + dev_err(dev, "platform data not found\n"); + error = -EINVAL; + goto err_out; + } + + + /* if no IRQ return error */ + if (irq == 0) { + error = -EINVAL; + goto err_out; + } + + data = kzalloc(sizeof(struct cma3000_accl_data), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!data || !input_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + data->dev = dev; + data->input_dev = input_dev; + data->bus_ops = bops; + data->pdata = pdata; + data->irq = irq; + mutex_init(&data->mutex); + + data->mode = pdata->mode; + if (data->mode > CMAMODE_POFF) { + data->mode = CMAMODE_MOTDET; + dev_warn(dev, + "Invalid mode specified, assuming Motion Detect\n"); + } + + data->g_range = pdata->g_range; + if (data->g_range != CMARANGE_2G && data->g_range != CMARANGE_8G) { + dev_info(dev, + "Invalid G range specified, assuming 8G\n"); + data->g_range = CMARANGE_8G; + } + + input_dev->name = "cma3000-accelerometer"; + input_dev->id.bustype = bops->bustype; + input_dev->open = cma3000_open; + input_dev->close = cma3000_close; + + __set_bit(EV_ABS, input_dev->evbit); + + input_set_abs_params(input_dev, ABS_X, + -data->g_range, data->g_range, pdata->fuzz_x, 0); + input_set_abs_params(input_dev, ABS_Y, + -data->g_range, data->g_range, pdata->fuzz_y, 0); + input_set_abs_params(input_dev, ABS_Z, + -data->g_range, data->g_range, pdata->fuzz_z, 0); + input_set_abs_params(input_dev, ABS_MISC, 0, 1, 0, 0); + + input_set_drvdata(input_dev, data); + + error = cma3000_reset(data); + if (error) + goto err_free_mem; + + rev = CMA3000_READ(data, CMA3000_REVID, "Revid"); + if (rev < 0) { + error = rev; + goto err_free_mem; + } + + pr_info("CMA3000 Accelerometer: Revision %x\n", rev); + + error = request_threaded_irq(irq, NULL, cma3000_thread_irq, + pdata->irqflags | IRQF_ONESHOT, + "cma3000_d0x", data); + if (error) { + dev_err(dev, "request_threaded_irq failed\n"); + goto err_free_mem; + } + + error = input_register_device(data->input_dev); + if (error) { + dev_err(dev, "Unable to register input device\n"); + goto err_free_irq; + } + + return data; + +err_free_irq: + free_irq(irq, data); +err_free_mem: + input_free_device(input_dev); + kfree(data); +err_out: + return ERR_PTR(error); +} +EXPORT_SYMBOL(cma3000_init); + +void cma3000_exit(struct cma3000_accl_data *data) +{ + free_irq(data->irq, data); + input_unregister_device(data->input_dev); + kfree(data); +} +EXPORT_SYMBOL(cma3000_exit); + +MODULE_DESCRIPTION("CMA3000-D0x Accelerometer Driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Hemanth V "); diff --git a/drivers/input/misc/cma3000_d0x.h b/drivers/input/misc/cma3000_d0x.h new file mode 100644 index 00000000..2304ce30 --- /dev/null +++ b/drivers/input/misc/cma3000_d0x.h @@ -0,0 +1,42 @@ +/* + * VTI CMA3000_D0x Accelerometer driver + * + * Copyright (C) 2010 Texas Instruments + * Author: Hemanth V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#ifndef _INPUT_CMA3000_H +#define _INPUT_CMA3000_H + +#include +#include + +struct device; +struct cma3000_accl_data; + +struct cma3000_bus_ops { + u16 bustype; + u8 ctrl_mod; + int (*read)(struct device *, u8, char *); + int (*write)(struct device *, u8, u8, char *); +}; + +struct cma3000_accl_data *cma3000_init(struct device *dev, int irq, + const struct cma3000_bus_ops *bops); +void cma3000_exit(struct cma3000_accl_data *); +void cma3000_suspend(struct cma3000_accl_data *); +void cma3000_resume(struct cma3000_accl_data *); + +#endif diff --git a/drivers/input/misc/cma3000_d0x_i2c.c b/drivers/input/misc/cma3000_d0x_i2c.c new file mode 100644 index 00000000..4fdef98c --- /dev/null +++ b/drivers/input/misc/cma3000_d0x_i2c.c @@ -0,0 +1,132 @@ +/* + * Implements I2C interface for VTI CMA300_D0x Accelerometer driver + * + * Copyright (C) 2010 Texas Instruments + * Author: Hemanth V + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include +#include +#include +#include "cma3000_d0x.h" + +static int cma3000_i2c_set(struct device *dev, + u8 reg, u8 val, char *msg) +{ + struct i2c_client *client = to_i2c_client(dev); + int ret; + + ret = i2c_smbus_write_byte_data(client, reg, val); + if (ret < 0) + dev_err(&client->dev, + "%s failed (%s, %d)\n", __func__, msg, ret); + return ret; +} + +static int cma3000_i2c_read(struct device *dev, u8 reg, char *msg) +{ + struct i2c_client *client = to_i2c_client(dev); + int ret; + + ret = i2c_smbus_read_byte_data(client, reg); + if (ret < 0) + dev_err(&client->dev, + "%s failed (%s, %d)\n", __func__, msg, ret); + return ret; +} + +static const struct cma3000_bus_ops cma3000_i2c_bops = { + .bustype = BUS_I2C, +#define CMA3000_BUSI2C (0 << 4) + .ctrl_mod = CMA3000_BUSI2C, + .read = cma3000_i2c_read, + .write = cma3000_i2c_set, +}; + +static int cma3000_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct cma3000_accl_data *data; + + data = cma3000_init(&client->dev, client->irq, &cma3000_i2c_bops); + if (IS_ERR(data)) + return PTR_ERR(data); + + i2c_set_clientdata(client, data); + + return 0; +} + +static int cma3000_i2c_remove(struct i2c_client *client) +{ + struct cma3000_accl_data *data = i2c_get_clientdata(client); + + cma3000_exit(data); + + return 0; +} + +#ifdef CONFIG_PM +static int cma3000_i2c_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cma3000_accl_data *data = i2c_get_clientdata(client); + + cma3000_suspend(data); + + return 0; +} + +static int cma3000_i2c_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cma3000_accl_data *data = i2c_get_clientdata(client); + + cma3000_resume(data); + + return 0; +} + +static const struct dev_pm_ops cma3000_i2c_pm_ops = { + .suspend = cma3000_i2c_suspend, + .resume = cma3000_i2c_resume, +}; +#endif + +static const struct i2c_device_id cma3000_i2c_id[] = { + { "cma3000_d01", 0 }, + { }, +}; + +MODULE_DEVICE_TABLE(i2c, cma3000_i2c_id); + +static struct i2c_driver cma3000_i2c_driver = { + .probe = cma3000_i2c_probe, + .remove = cma3000_i2c_remove, + .id_table = cma3000_i2c_id, + .driver = { + .name = "cma3000_i2c_accl", + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &cma3000_i2c_pm_ops, +#endif + }, +}; + +module_i2c_driver(cma3000_i2c_driver); + +MODULE_DESCRIPTION("CMA3000-D0x Accelerometer I2C Driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Hemanth V "); diff --git a/drivers/input/misc/cobalt_btns.c b/drivers/input/misc/cobalt_btns.c new file mode 100644 index 00000000..4f77f878 --- /dev/null +++ b/drivers/input/misc/cobalt_btns.c @@ -0,0 +1,166 @@ +/* + * Cobalt button interface driver. + * + * Copyright (C) 2007-2008 Yoichi Yuasa + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include +#include +#include +#include + +#define BUTTONS_POLL_INTERVAL 30 /* msec */ +#define BUTTONS_COUNT_THRESHOLD 3 +#define BUTTONS_STATUS_MASK 0xfe000000 + +static const unsigned short cobalt_map[] = { + KEY_RESERVED, + KEY_RESTART, + KEY_LEFT, + KEY_UP, + KEY_DOWN, + KEY_RIGHT, + KEY_ENTER, + KEY_SELECT +}; + +struct buttons_dev { + struct input_polled_dev *poll_dev; + unsigned short keymap[ARRAY_SIZE(cobalt_map)]; + int count[ARRAY_SIZE(cobalt_map)]; + void __iomem *reg; +}; + +static void handle_buttons(struct input_polled_dev *dev) +{ + struct buttons_dev *bdev = dev->private; + struct input_dev *input = dev->input; + uint32_t status; + int i; + + status = ~readl(bdev->reg) >> 24; + + for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) { + if (status & (1U << i)) { + if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) { + input_event(input, EV_MSC, MSC_SCAN, i); + input_report_key(input, bdev->keymap[i], 1); + input_sync(input); + } + } else { + if (bdev->count[i] >= BUTTONS_COUNT_THRESHOLD) { + input_event(input, EV_MSC, MSC_SCAN, i); + input_report_key(input, bdev->keymap[i], 0); + input_sync(input); + } + bdev->count[i] = 0; + } + } +} + +static int cobalt_buttons_probe(struct platform_device *pdev) +{ + struct buttons_dev *bdev; + struct input_polled_dev *poll_dev; + struct input_dev *input; + struct resource *res; + int error, i; + + bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL); + poll_dev = input_allocate_polled_device(); + if (!bdev || !poll_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + memcpy(bdev->keymap, cobalt_map, sizeof(bdev->keymap)); + + poll_dev->private = bdev; + poll_dev->poll = handle_buttons; + poll_dev->poll_interval = BUTTONS_POLL_INTERVAL; + + input = poll_dev->input; + input->name = "Cobalt buttons"; + input->phys = "cobalt/input0"; + input->id.bustype = BUS_HOST; + input->dev.parent = &pdev->dev; + + input->keycode = bdev->keymap; + input->keycodemax = ARRAY_SIZE(bdev->keymap); + input->keycodesize = sizeof(unsigned short); + + input_set_capability(input, EV_MSC, MSC_SCAN); + __set_bit(EV_KEY, input->evbit); + for (i = 0; i < ARRAY_SIZE(cobalt_map); i++) + __set_bit(bdev->keymap[i], input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + error = -EBUSY; + goto err_free_mem; + } + + bdev->poll_dev = poll_dev; + bdev->reg = ioremap(res->start, resource_size(res)); + dev_set_drvdata(&pdev->dev, bdev); + + error = input_register_polled_device(poll_dev); + if (error) + goto err_iounmap; + + return 0; + + err_iounmap: + iounmap(bdev->reg); + err_free_mem: + input_free_polled_device(poll_dev); + kfree(bdev); + dev_set_drvdata(&pdev->dev, NULL); + return error; +} + +static int cobalt_buttons_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct buttons_dev *bdev = dev_get_drvdata(dev); + + input_unregister_polled_device(bdev->poll_dev); + input_free_polled_device(bdev->poll_dev); + iounmap(bdev->reg); + kfree(bdev); + dev_set_drvdata(dev, NULL); + + return 0; +} + +MODULE_AUTHOR("Yoichi Yuasa "); +MODULE_DESCRIPTION("Cobalt button interface driver"); +MODULE_LICENSE("GPL"); +/* work with hotplug and coldplug */ +MODULE_ALIAS("platform:Cobalt buttons"); + +static struct platform_driver cobalt_buttons_driver = { + .probe = cobalt_buttons_probe, + .remove = cobalt_buttons_remove, + .driver = { + .name = "Cobalt buttons", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(cobalt_buttons_driver); diff --git a/drivers/input/misc/da9052_onkey.c b/drivers/input/misc/da9052_onkey.c new file mode 100644 index 00000000..020569a4 --- /dev/null +++ b/drivers/input/misc/da9052_onkey.c @@ -0,0 +1,158 @@ +/* + * ON pin driver for Dialog DA9052 PMICs + * + * Copyright(c) 2012 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include + +#include +#include + +struct da9052_onkey { + struct da9052 *da9052; + struct input_dev *input; + struct delayed_work work; +}; + +static void da9052_onkey_query(struct da9052_onkey *onkey) +{ + int key_stat; + + key_stat = da9052_reg_read(onkey->da9052, DA9052_EVENT_B_REG); + if (key_stat < 0) { + dev_err(onkey->da9052->dev, + "Failed to read onkey event %d\n", key_stat); + } else { + /* + * Since interrupt for deassertion of ONKEY pin is not + * generated, onkey event state determines the onkey + * button state. + */ + key_stat &= DA9052_EVENTB_ENONKEY; + input_report_key(onkey->input, KEY_POWER, key_stat); + input_sync(onkey->input); + } + + /* + * Interrupt is generated only when the ONKEY pin is asserted. + * Hence the deassertion of the pin is simulated through work queue. + */ + if (key_stat) + schedule_delayed_work(&onkey->work, msecs_to_jiffies(50)); +} + +static void da9052_onkey_work(struct work_struct *work) +{ + struct da9052_onkey *onkey = container_of(work, struct da9052_onkey, + work.work); + + da9052_onkey_query(onkey); +} + +static irqreturn_t da9052_onkey_irq(int irq, void *data) +{ + struct da9052_onkey *onkey = data; + + da9052_onkey_query(onkey); + + return IRQ_HANDLED; +} + +static int da9052_onkey_probe(struct platform_device *pdev) +{ + struct da9052 *da9052 = dev_get_drvdata(pdev->dev.parent); + struct da9052_onkey *onkey; + struct input_dev *input_dev; + int error; + + if (!da9052) { + dev_err(&pdev->dev, "Failed to get the driver's data\n"); + return -EINVAL; + } + + onkey = kzalloc(sizeof(*onkey), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!onkey || !input_dev) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + onkey->input = input_dev; + onkey->da9052 = da9052; + INIT_DELAYED_WORK(&onkey->work, da9052_onkey_work); + + input_dev->name = "da9052-onkey"; + input_dev->phys = "da9052-onkey/input0"; + input_dev->dev.parent = &pdev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY); + __set_bit(KEY_POWER, input_dev->keybit); + + error = da9052_request_irq(onkey->da9052, DA9052_IRQ_NONKEY, "ONKEY", + da9052_onkey_irq, onkey); + if (error < 0) { + dev_err(onkey->da9052->dev, + "Failed to register ONKEY IRQ: %d\n", error); + goto err_free_mem; + } + + error = input_register_device(onkey->input); + if (error) { + dev_err(&pdev->dev, "Unable to register input device, %d\n", + error); + goto err_free_irq; + } + + platform_set_drvdata(pdev, onkey); + return 0; + +err_free_irq: + da9052_free_irq(onkey->da9052, DA9052_IRQ_NONKEY, onkey); + cancel_delayed_work_sync(&onkey->work); +err_free_mem: + input_free_device(input_dev); + kfree(onkey); + + return error; +} + +static int da9052_onkey_remove(struct platform_device *pdev) +{ + struct da9052_onkey *onkey = platform_get_drvdata(pdev); + + da9052_free_irq(onkey->da9052, DA9052_IRQ_NONKEY, onkey); + cancel_delayed_work_sync(&onkey->work); + + input_unregister_device(onkey->input); + kfree(onkey); + + return 0; +} + +static struct platform_driver da9052_onkey_driver = { + .probe = da9052_onkey_probe, + .remove = da9052_onkey_remove, + .driver = { + .name = "da9052-onkey", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(da9052_onkey_driver); + +MODULE_AUTHOR("David Dajun Chen "); +MODULE_DESCRIPTION("Onkey driver for DA9052"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:da9052-onkey"); diff --git a/drivers/input/misc/da9055_onkey.c b/drivers/input/misc/da9055_onkey.c new file mode 100644 index 00000000..ee6ae3a0 --- /dev/null +++ b/drivers/input/misc/da9055_onkey.c @@ -0,0 +1,171 @@ +/* + * ON pin driver for Dialog DA9055 PMICs + * + * Copyright(c) 2012 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include + +#include +#include + +struct da9055_onkey { + struct da9055 *da9055; + struct input_dev *input; + struct delayed_work work; +}; + +static void da9055_onkey_query(struct da9055_onkey *onkey) +{ + int key_stat; + + key_stat = da9055_reg_read(onkey->da9055, DA9055_REG_STATUS_A); + if (key_stat < 0) { + dev_err(onkey->da9055->dev, + "Failed to read onkey event %d\n", key_stat); + } else { + key_stat &= DA9055_NOKEY_STS; + /* + * Onkey status bit is cleared when onkey button is relased. + */ + if (!key_stat) { + input_report_key(onkey->input, KEY_POWER, 0); + input_sync(onkey->input); + } + } + + /* + * Interrupt is generated only when the ONKEY pin is asserted. + * Hence the deassertion of the pin is simulated through work queue. + */ + if (key_stat) + schedule_delayed_work(&onkey->work, msecs_to_jiffies(10)); + +} + +static void da9055_onkey_work(struct work_struct *work) +{ + struct da9055_onkey *onkey = container_of(work, struct da9055_onkey, + work.work); + + da9055_onkey_query(onkey); +} + +static irqreturn_t da9055_onkey_irq(int irq, void *data) +{ + struct da9055_onkey *onkey = data; + + input_report_key(onkey->input, KEY_POWER, 1); + input_sync(onkey->input); + + da9055_onkey_query(onkey); + + return IRQ_HANDLED; +} + +static int da9055_onkey_probe(struct platform_device *pdev) +{ + struct da9055 *da9055 = dev_get_drvdata(pdev->dev.parent); + struct da9055_onkey *onkey; + struct input_dev *input_dev; + int irq, err; + + irq = platform_get_irq_byname(pdev, "ONKEY"); + if (irq < 0) { + dev_err(&pdev->dev, + "Failed to get an IRQ for input device, %d\n", irq); + return -EINVAL; + } + + onkey = devm_kzalloc(&pdev->dev, sizeof(*onkey), GFP_KERNEL); + if (!onkey) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + onkey->input = input_dev; + onkey->da9055 = da9055; + input_dev->name = "da9055-onkey"; + input_dev->phys = "da9055-onkey/input0"; + input_dev->dev.parent = &pdev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY); + __set_bit(KEY_POWER, input_dev->keybit); + + INIT_DELAYED_WORK(&onkey->work, da9055_onkey_work); + + irq = regmap_irq_get_virq(da9055->irq_data, irq); + err = request_threaded_irq(irq, NULL, da9055_onkey_irq, + IRQF_TRIGGER_HIGH | IRQF_ONESHOT, + "ONKEY", onkey); + if (err < 0) { + dev_err(&pdev->dev, + "Failed to register ONKEY IRQ %d, error = %d\n", + irq, err); + goto err_free_input; + } + + err = input_register_device(input_dev); + if (err) { + dev_err(&pdev->dev, "Unable to register input device, %d\n", + err); + goto err_free_irq; + } + + platform_set_drvdata(pdev, onkey); + + return 0; + +err_free_irq: + free_irq(irq, onkey); + cancel_delayed_work_sync(&onkey->work); +err_free_input: + input_free_device(input_dev); + + return err; +} + +static int da9055_onkey_remove(struct platform_device *pdev) +{ + struct da9055_onkey *onkey = platform_get_drvdata(pdev); + int irq = platform_get_irq_byname(pdev, "ONKEY"); + + irq = regmap_irq_get_virq(onkey->da9055->irq_data, irq); + free_irq(irq, onkey); + cancel_delayed_work_sync(&onkey->work); + input_unregister_device(onkey->input); + + return 0; +} + +static struct platform_driver da9055_onkey_driver = { + .probe = da9055_onkey_probe, + .remove = da9055_onkey_remove, + .driver = { + .name = "da9055-onkey", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver(da9055_onkey_driver); + +MODULE_AUTHOR("David Dajun Chen "); +MODULE_DESCRIPTION("Onkey driver for DA9055"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:da9055-onkey"); diff --git a/drivers/input/misc/dm355evm_keys.c b/drivers/input/misc/dm355evm_keys.c new file mode 100644 index 00000000..a309a5c0 --- /dev/null +++ b/drivers/input/misc/dm355evm_keys.c @@ -0,0 +1,273 @@ +/* + * dm355evm_keys.c - support buttons and IR remote on DM355 EVM board + * + * Copyright (c) 2008 by David Brownell + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +/* + * The MSP430 firmware on the DM355 EVM monitors on-board pushbuttons + * and an IR receptor used for the remote control. When any key is + * pressed, or its autorepeat kicks in, an event is sent. This driver + * read those events from the small (32 event) queue and reports them. + * + * Note that physically there can only be one of these devices. + * + * This driver was tested with firmware revision A4. + */ +struct dm355evm_keys { + struct input_dev *input; + struct device *dev; + int irq; +}; + +/* These initial keycodes can be remapped */ +static const struct key_entry dm355evm_keys[] = { + /* + * Pushbuttons on the EVM board ... note that the labels for these + * are SW10/SW11/etc on the PC board. The left/right orientation + * comes only from the firmware's documentation, and presumes the + * power connector is immediately in front of you and the IR sensor + * is to the right. (That is, rotate the board counter-clockwise + * by 90 degrees from the SW10/etc and "DM355 EVM" labels.) + */ + { KE_KEY, 0x00d8, { KEY_OK } }, /* SW12 */ + { KE_KEY, 0x00b8, { KEY_UP } }, /* SW13 */ + { KE_KEY, 0x00e8, { KEY_DOWN } }, /* SW11 */ + { KE_KEY, 0x0078, { KEY_LEFT } }, /* SW14 */ + { KE_KEY, 0x00f0, { KEY_RIGHT } }, /* SW10 */ + + /* + * IR buttons ... codes assigned to match the universal remote + * provided with the EVM (Philips PM4S) using DVD code 0020. + * + * These event codes match firmware documentation, but other + * remote controls could easily send more RC5-encoded events. + * The PM4S manual was used in several cases to help select + * a keycode reflecting the intended usage. + * + * RC5 codes are 14 bits, with two start bits (0x3 prefix) + * and a toggle bit (masked out below). + */ + { KE_KEY, 0x300c, { KEY_POWER } }, /* NOTE: docs omit this */ + { KE_KEY, 0x3000, { KEY_NUMERIC_0 } }, + { KE_KEY, 0x3001, { KEY_NUMERIC_1 } }, + { KE_KEY, 0x3002, { KEY_NUMERIC_2 } }, + { KE_KEY, 0x3003, { KEY_NUMERIC_3 } }, + { KE_KEY, 0x3004, { KEY_NUMERIC_4 } }, + { KE_KEY, 0x3005, { KEY_NUMERIC_5 } }, + { KE_KEY, 0x3006, { KEY_NUMERIC_6 } }, + { KE_KEY, 0x3007, { KEY_NUMERIC_7 } }, + { KE_KEY, 0x3008, { KEY_NUMERIC_8 } }, + { KE_KEY, 0x3009, { KEY_NUMERIC_9 } }, + { KE_KEY, 0x3022, { KEY_ENTER } }, + { KE_KEY, 0x30ec, { KEY_MODE } }, /* "tv/vcr/..." */ + { KE_KEY, 0x300f, { KEY_SELECT } }, /* "info" */ + { KE_KEY, 0x3020, { KEY_CHANNELUP } }, /* "up" */ + { KE_KEY, 0x302e, { KEY_MENU } }, /* "in/out" */ + { KE_KEY, 0x3011, { KEY_VOLUMEDOWN } }, /* "left" */ + { KE_KEY, 0x300d, { KEY_MUTE } }, /* "ok" */ + { KE_KEY, 0x3010, { KEY_VOLUMEUP } }, /* "right" */ + { KE_KEY, 0x301e, { KEY_SUBTITLE } }, /* "cc" */ + { KE_KEY, 0x3021, { KEY_CHANNELDOWN } },/* "down" */ + { KE_KEY, 0x3022, { KEY_PREVIOUS } }, + { KE_KEY, 0x3026, { KEY_SLEEP } }, + { KE_KEY, 0x3172, { KEY_REWIND } }, /* NOTE: docs wrongly say 0x30ca */ + { KE_KEY, 0x3175, { KEY_PLAY } }, + { KE_KEY, 0x3174, { KEY_FASTFORWARD } }, + { KE_KEY, 0x3177, { KEY_RECORD } }, + { KE_KEY, 0x3176, { KEY_STOP } }, + { KE_KEY, 0x3169, { KEY_PAUSE } }, +}; + +/* + * Because we communicate with the MSP430 using I2C, and all I2C calls + * in Linux sleep, we use a threaded IRQ handler. The IRQ itself is + * active low, but we go through the GPIO controller so we can trigger + * on falling edges and not worry about enabling/disabling the IRQ in + * the keypress handling path. + */ +static irqreturn_t dm355evm_keys_irq(int irq, void *_keys) +{ + static u16 last_event; + struct dm355evm_keys *keys = _keys; + const struct key_entry *ke; + unsigned int keycode; + int status; + u16 event; + + /* For simplicity we ignore INPUT_COUNT and just read + * events until we get the "queue empty" indicator. + * Reading INPUT_LOW decrements the count. + */ + for (;;) { + status = dm355evm_msp_read(DM355EVM_MSP_INPUT_HIGH); + if (status < 0) { + dev_dbg(keys->dev, "input high err %d\n", + status); + break; + } + event = status << 8; + + status = dm355evm_msp_read(DM355EVM_MSP_INPUT_LOW); + if (status < 0) { + dev_dbg(keys->dev, "input low err %d\n", + status); + break; + } + event |= status; + if (event == 0xdead) + break; + + /* Press and release a button: two events, same code. + * Press and hold (autorepeat), then release: N events + * (N > 2), same code. For RC5 buttons the toggle bits + * distinguish (for example) "1-autorepeat" from "1 1"; + * but PCB buttons don't support that bit. + * + * So we must synthesize release events. We do that by + * mapping events to a press/release event pair; then + * to avoid adding extra events, skip the second event + * of each pair. + */ + if (event == last_event) { + last_event = 0; + continue; + } + last_event = event; + + /* ignore the RC5 toggle bit */ + event &= ~0x0800; + + /* find the key, or report it as unknown */ + ke = sparse_keymap_entry_from_scancode(keys->input, event); + keycode = ke ? ke->keycode : KEY_UNKNOWN; + dev_dbg(keys->dev, + "input event 0x%04x--> keycode %d\n", + event, keycode); + + /* report press + release */ + input_report_key(keys->input, keycode, 1); + input_sync(keys->input); + input_report_key(keys->input, keycode, 0); + input_sync(keys->input); + } + + return IRQ_HANDLED; +} + +/*----------------------------------------------------------------------*/ + +static int dm355evm_keys_probe(struct platform_device *pdev) +{ + struct dm355evm_keys *keys; + struct input_dev *input; + int status; + + /* allocate instance struct and input dev */ + keys = kzalloc(sizeof *keys, GFP_KERNEL); + input = input_allocate_device(); + if (!keys || !input) { + status = -ENOMEM; + goto fail1; + } + + keys->dev = &pdev->dev; + keys->input = input; + + /* set up "threaded IRQ handler" */ + status = platform_get_irq(pdev, 0); + if (status < 0) + goto fail1; + keys->irq = status; + + input_set_drvdata(input, keys); + + input->name = "DM355 EVM Controls"; + input->phys = "dm355evm/input0"; + input->dev.parent = &pdev->dev; + + input->id.bustype = BUS_I2C; + input->id.product = 0x0355; + input->id.version = dm355evm_msp_read(DM355EVM_MSP_FIRMREV); + + status = sparse_keymap_setup(input, dm355evm_keys, NULL); + if (status) + goto fail1; + + /* REVISIT: flush the event queue? */ + + status = request_threaded_irq(keys->irq, NULL, dm355evm_keys_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + dev_name(&pdev->dev), keys); + if (status < 0) + goto fail2; + + /* register */ + status = input_register_device(input); + if (status < 0) + goto fail3; + + platform_set_drvdata(pdev, keys); + + return 0; + +fail3: + free_irq(keys->irq, keys); +fail2: + sparse_keymap_free(input); +fail1: + input_free_device(input); + kfree(keys); + dev_err(&pdev->dev, "can't register, err %d\n", status); + + return status; +} + +static int dm355evm_keys_remove(struct platform_device *pdev) +{ + struct dm355evm_keys *keys = platform_get_drvdata(pdev); + + free_irq(keys->irq, keys); + sparse_keymap_free(keys->input); + input_unregister_device(keys->input); + kfree(keys); + + return 0; +} + +/* REVISIT: add suspend/resume when DaVinci supports it. The IRQ should + * be able to wake up the system. When device_may_wakeup(&pdev->dev), call + * enable_irq_wake() on suspend, and disable_irq_wake() on resume. + */ + +/* + * I2C is used to talk to the MSP430, but this platform device is + * exposed by an MFD driver that manages I2C communications. + */ +static struct platform_driver dm355evm_keys_driver = { + .probe = dm355evm_keys_probe, + .remove = dm355evm_keys_remove, + .driver = { + .owner = THIS_MODULE, + .name = "dm355evm_keys", + }, +}; +module_platform_driver(dm355evm_keys_driver); + +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/epl2182_pls_v2.c b/drivers/input/misc/epl2182_pls_v2.c new file mode 100644 index 00000000..6d14770c --- /dev/null +++ b/drivers/input/misc/epl2182_pls_v2.c @@ -0,0 +1,1496 @@ +/* drivers/i2c/chips/epl2182.c - light and proxmity sensors driver + * Copyright (C) 2011 ELAN Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/****************************************************************************** + * configuration +*******************************************************************************/ +#define PS_INTERRUPT_MODE 1 // 0 is polling mode, 1 is interrupt mode +#define PLSENSOR_ADAPTIVE +#ifdef PLSENSOR_ADAPTIVE +/*ensure the initial value can enable Psensor interrupt,the ps_state of the initial value will be 0*/ +static u16 P_SENSOR_LTHD = 0x7fff; //init +static u16 P_SENSOR_HTHD = 0x0; //init +#else +#define P_SENSOR_LTHD 1900//120 //100 +#define P_SENSOR_HTHD 2000//170 //500 +#endif + +#define PS_POLLING_RATE 100 +#define ALS_POLLING_RATE 1000 + +#define LUX_PER_COUNT 440 // 660 = 1.1*0.6*1000 +#ifdef PLSENSOR_ADAPTIVE +#define DEBOUNCE 30 +#define MIN_SPACING 250 +#define DIVEDE 4 +static bool first_do_irq = true; +static u16 ps_min = 0; +static u16 ps_max = 0; +static u16 ps_threshold = 0; +#endif +/****************************************************************************** + * configuration +*******************************************************************************/ + +typedef enum +{ + CMC_MODE_ALS = 0x00, + CMC_MODE_PS = 0x10, +} CMC_MODE; + +#define TXBYTES 2 +#define RXBYTES 2 + +#define PS_DELAY 50 +#define ALS_DELAY 55 + +#define PACKAGE_SIZE 2 +#define I2C_RETRY_COUNT 10 +#define P_INTT 1 + +#define PS_INTT 4 +#define ALS_INTT 6 //5-8 + +static int set_psensor_intr_threshold(uint16_t low_thd, uint16_t high_thd); + +#if PS_INTERRUPT_MODE +static void epl_sensor_irq_do_work(struct work_struct *work); +static DECLARE_WORK(epl_sensor_irq_work, epl_sensor_irq_do_work); +#endif + +static void report_polling_do_work(struct work_struct *work); +static DECLARE_DELAYED_WORK(report_polling_work, report_polling_do_work); +static void polling_do_work(struct work_struct *work); +static DECLARE_DELAYED_WORK(polling_work, polling_do_work); + +/* primitive raw data from I2C */ +typedef struct _epl_raw_data +{ + u8 raw_bytes[PACKAGE_SIZE]; + u16 ps_state; + u16 ps_int_state; + u16 ps_ch1_raw; + u16 als_ch1_raw; +} epl_raw_data; + +struct elan_epl_data +{ + struct i2c_client *client; + //struct input_dev *als_input_dev; + struct input_dev *ps_input_dev; + struct workqueue_struct *epl_wq; + struct early_suspend early_suspend; + + int intr_pin; + //int (*power)(int on); + + int ps_opened; + int als_opened; + + int enable_pflag; + int enable_lflag; + int read_flag; + int irq; +} ; + +static DECLARE_WAIT_QUEUE_HEAD(ps_waitqueue); +static DECLARE_WAIT_QUEUE_HEAD(ls_waitqueue); + + +static int ps_data_changed; +static int ls_data_changed; +static struct i2c_client *this_client = NULL; + +//static struct wake_lock g_ps_wlock; +struct elan_epl_data *epl_data; +static epl_raw_data gRawData; +static int dual_count; + +static const char ElanPsensorName[] = "proximity"; +static const char ElanALsensorName[] = "lightsensor-level"; + +static int psensor_mode_suspend = 0; + +#define LOG_TAG "[EPL2182] " +#define LOG_FUN(f) printk(KERN_INFO LOG_TAG"%s\n", __FUNCTION__) +#define LOG_INFO(fmt, args...) printk(KERN_INFO LOG_TAG fmt, ##args) +#define LOG_ERR(fmt, args...) printk(KERN_ERR LOG_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) + +/* +//====================I2C write operation===============// +//regaddr: ELAN Register Address. +//bytecount: How many bytes to be written to register via i2c bus. +//txbyte: I2C bus transmit byte(s). Single byte(0X01) transmit only slave address. +//data: setting value. +// +// Example: If you want to write single byte to 0x1D register address, show below +// elan_sensor_I2C_Write(client,0x1D,0x01,0X02,0xff); +// +*/ +static int elan_sensor_I2C_Write(struct i2c_client *client, uint8_t regaddr, uint8_t bytecount, uint8_t txbyte, uint8_t data) +{ + uint8_t buffer[2]; + int ret = 0; + int retry,val; + struct elan_epl_data *epld = epl_data; + + buffer[0] = (regaddr<<3) | bytecount ; + buffer[1] = data; + + for(retry = 0; retry < I2C_RETRY_COUNT; retry++) + { + ret = i2c_master_send(client, buffer, txbyte); + + if (ret == txbyte) + { + break; + } + + val = gpio_get_value(epld->intr_pin); + + LOG_INFO("INTERRUPT GPIO val = %d\n", val); + + msleep(10); + } + + if(retry>=I2C_RETRY_COUNT) + { + LOG_ERR(KERN_ERR "i2c write retry over %d\n", I2C_RETRY_COUNT); + return -EINVAL; + } + + return ret; +} + +static int elan_sensor_I2C_Read(struct i2c_client *client) +{ + uint8_t buffer[RXBYTES]; + int ret = 0, i =0; + int retry,val; + struct elan_epl_data *epld = epl_data; + + for(retry = 0; retry < I2C_RETRY_COUNT; retry++) + { + ret = i2c_master_recv(client, buffer, RXBYTES); + + if (ret == RXBYTES) + break; + + val = gpio_get_value(epld->intr_pin); + + LOG_INFO("INTERRUPT GPIO val = %d\n", val); + + msleep(10); + } + + if(retry>=I2C_RETRY_COUNT) + { + LOG_ERR("i2c read retry over %d\n", I2C_RETRY_COUNT); + return -EINVAL; + } + + for(i=0; iepl_wq, &polling_work,msecs_to_jiffies(10)); +} + +static int elan_sensor_psensor_enable(struct elan_epl_data *epld) +{ + int ret; + uint8_t regdata = 0; + struct i2c_client *client = epld->client; + + LOG_INFO("--- Proximity sensor Enable --- \n"); + + //disable_irq(epld->irq); + ret = elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_DISABLE); + + regdata = EPL_SENSING_8_TIME | EPL_PS_MODE | EPL_L_GAIN ; + regdata = regdata | (PS_INTERRUPT_MODE ? EPL_C_SENSING_MODE : EPL_S_SENSING_MODE); + ret = elan_sensor_I2C_Write(client,REG_0,W_SINGLE_BYTE,0X02,regdata); + + regdata = PS_INTT<<4 | EPL_PST_1_TIME | EPL_10BIT_ADC; + ret = elan_sensor_I2C_Write(client,REG_1,W_SINGLE_BYTE,0X02,regdata); + + set_psensor_intr_threshold(P_SENSOR_LTHD ,P_SENSOR_HTHD); +#ifdef PLSENSOR_ADAPTIVE + if (true == first_do_irq) { + msleep(PS_DELAY); + elan_sensor_I2C_Write(client,REG_13,R_SINGLE_BYTE,0x01,0); + elan_sensor_I2C_Read(client); + gRawData.ps_state= !((gRawData.raw_bytes[0]&0x04)>>2); + elan_sensor_I2C_Write(client,REG_16,R_TWO_BYTE,0x01,0x00); + elan_sensor_I2C_Read(client); + gRawData.ps_ch1_raw = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + P_SENSOR_LTHD = gRawData.ps_ch1_raw + MIN_SPACING - DEBOUNCE; + P_SENSOR_HTHD = gRawData.ps_ch1_raw + MIN_SPACING - DEBOUNCE; + set_psensor_intr_threshold(P_SENSOR_LTHD ,P_SENSOR_HTHD); + } +#endif + + ret = elan_sensor_I2C_Write(client,REG_7,W_SINGLE_BYTE,0X02,EPL_C_RESET); + ret = elan_sensor_I2C_Write(client,REG_7,W_SINGLE_BYTE,0x02,EPL_C_START_RUN); + +#if PS_INTERRUPT_MODE + if(epld->enable_lflag) + { + msleep(PS_DELAY); + elan_sensor_I2C_Write(client,REG_13,R_SINGLE_BYTE,0x01,0); + elan_sensor_I2C_Read(client); + gRawData.ps_state= !((gRawData.raw_bytes[0]&0x04)>>2); + + if(gRawData.ps_state!= gRawData.ps_int_state) + { + elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_FRAME_ENABLE); + } + else + { + elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_ACTIVE_LOW); + } + + } + else + { + elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_ACTIVE_LOW); + } + //enable_irq(epld->irq); +#endif + + if (ret != 0x02) + { + LOG_INFO("P-sensor i2c err\n"); + } + + return ret; +} + +static int elan_sensor_lsensor_enable(struct elan_epl_data *epld) +{ + int ret; + uint8_t regdata = 0; + struct i2c_client *client = epld->client; + + LOG_INFO("--- ALS sensor Enable --- \n"); + + //disable_irq(epld->irq); + regdata = EPL_INT_DISABLE; + ret = elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02, regdata); + + regdata = EPL_S_SENSING_MODE | EPL_SENSING_8_TIME | EPL_ALS_MODE | EPL_AUTO_GAIN; + ret = elan_sensor_I2C_Write(client,REG_0,W_SINGLE_BYTE,0X02,regdata); + + regdata = ALS_INTT<<4 | EPL_PST_1_TIME | EPL_10BIT_ADC; + ret = elan_sensor_I2C_Write(client,REG_1,W_SINGLE_BYTE,0X02,regdata); + + ret = elan_sensor_I2C_Write(client,REG_10,W_SINGLE_BYTE,0x02, EPL_GO_MID); + ret = elan_sensor_I2C_Write(client,REG_11,W_SINGLE_BYTE,0x02, EPL_GO_LOW); + + ret = elan_sensor_I2C_Write(client,REG_7,W_SINGLE_BYTE,0X02,EPL_C_RESET); + ret = elan_sensor_I2C_Write(client,REG_7,W_SINGLE_BYTE,0x02,EPL_C_START_RUN); + + if(ret != 0x02) + { + LOG_INFO(" ALS-sensor i2c err\n"); + } + + return ret; + +} + +/* +//====================elan_epl_ps_poll_rawdata===============// +//polling method for proximity sensor detect. Report proximity sensor raw data. +//Report "ABS_DISTANCE" event to HAL layer. +//Variable "value" 0 and 1 to represent which distance from psensor to target(human's face..etc). +//value: 0 represent near. +//value: 1 represent far. +*/ +static int elan_epl_ps_poll_rawdata(void) +{ + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + u16 value = 0; + + elan_sensor_I2C_Write(epld->client,REG_7,W_SINGLE_BYTE,0x02,EPL_DATA_LOCK); + + elan_sensor_I2C_Write(client,REG_13,R_SINGLE_BYTE,0x01,0); + elan_sensor_I2C_Read(client); + gRawData.ps_state= !((gRawData.raw_bytes[0]&0x04)>>2); + + elan_sensor_I2C_Write(client,REG_16,R_TWO_BYTE,0x01,0x00); + elan_sensor_I2C_Read(client); + gRawData.ps_ch1_raw = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + +#ifdef PLSENSOR_ADAPTIVE + value = gRawData.ps_ch1_raw; + /*threshold detect process*/ + if(0 == ps_max || 0 == ps_min) { + ps_min = value; + ps_max = value; + ps_threshold = ps_min + MIN_SPACING; + } + if(value > ps_max) { + ps_max = value; + ps_threshold = ((ps_max - ps_min) / DIVEDE) + ps_min; + if(ps_threshold - ps_min < MIN_SPACING) + ps_threshold = ps_min + MIN_SPACING; + } else if(value < ps_min) { + ps_min = value; + ps_threshold = ((ps_max - ps_min) / DIVEDE) + ps_min; + if(ps_threshold - ps_min < MIN_SPACING) + ps_threshold = ps_min + MIN_SPACING; + } + P_SENSOR_LTHD = ps_threshold - DEBOUNCE; + P_SENSOR_HTHD = ps_threshold + DEBOUNCE; + set_psensor_intr_threshold(P_SENSOR_LTHD ,P_SENSOR_HTHD); + /*threshold detect process end*/ + LOG_INFO("ps_min (%4d), ps_max (%4d), ps_threshold (%4d)\n", ps_min, ps_max, ps_threshold); + if (true == first_do_irq) + first_do_irq = false; +#endif + elan_sensor_I2C_Write(epld->client,REG_7,W_SINGLE_BYTE,0x02,EPL_DATA_UNLOCK); + LOG_INFO("### ps_ch1_raw_data (%d), value(%d) ###\n", gRawData.ps_ch1_raw, gRawData.ps_state); + ps_data_changed = 1; + + input_report_abs(epld->ps_input_dev, ABS_DISTANCE, gRawData.ps_state); + input_sync(epld->ps_input_dev); + return 0; +} + +static void elan_epl_als_rawdata(void) +{ + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + uint32_t lux; + + elan_sensor_I2C_Write(client,REG_16,R_TWO_BYTE,0x01,0x00); + elan_sensor_I2C_Read(client); + gRawData.als_ch1_raw = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + + lux = (gRawData.als_ch1_raw* LUX_PER_COUNT) / 1000 * 15 / 100; + if(lux>20000) + lux=20000; + + LOG_INFO("------------------- ALS raw = %d, lux = %d\n\n", gRawData.als_ch1_raw, lux); + ls_data_changed = 1; +#if 1 + input_report_abs(epld->ps_input_dev, ABS_MISC, lux); + input_sync(epld->ps_input_dev); +#else + input_report_abs(epld->als_input_dev, ABS_MISC, lux); + input_sync(epld->als_input_dev); +#endif +} + +/* +//====================set_psensor_intr_threshold===============// +//low_thd: The value is psensor interrupt low threshold. +//high_thd: The value is psensor interrupt hihg threshold. +//When psensor rawdata > hihg_threshold, interrupt pin will be pulled low. +//After interrupt occur, psensor rawdata < low_threshold, interrupt pin will be pulled high. +*/ +static int set_psensor_intr_threshold(uint16_t low_thd, uint16_t high_thd) +{ + int ret = 0; + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + + uint8_t high_msb ,high_lsb, low_msb, low_lsb; + + high_msb = (uint8_t) (high_thd >> 8); + high_lsb = (uint8_t) (high_thd & 0x00ff); + low_msb = (uint8_t) (low_thd >> 8); + low_lsb = (uint8_t) (low_thd & 0x00ff); + + elan_sensor_I2C_Write(client,REG_2,W_SINGLE_BYTE,0x02,high_lsb); + elan_sensor_I2C_Write(client,REG_3,W_SINGLE_BYTE,0x02,high_msb); + elan_sensor_I2C_Write(client,REG_4,W_SINGLE_BYTE,0x02,low_lsb); + elan_sensor_I2C_Write(client,REG_5,W_SINGLE_BYTE,0x02,low_msb); + + return ret; +} + +#if PS_INTERRUPT_MODE +static void epl_sensor_irq_do_work(struct work_struct *work) +{ + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + int mode = 0; + LOG_FUN(); + + elan_sensor_I2C_Write(epld->client,REG_7,W_SINGLE_BYTE,0x02,EPL_DATA_LOCK); + + elan_sensor_I2C_Write(client,REG_13,R_SINGLE_BYTE,0x01,0); + elan_sensor_I2C_Read(client); + mode = gRawData.raw_bytes[0]&(3<<4); + + // 0x10 is ps mode + if(mode==CMC_MODE_PS && epld->enable_pflag) + { + gRawData.ps_int_state= !((gRawData.raw_bytes[0]&0x04)>>2); + elan_epl_ps_poll_rawdata(); + } + else + { + LOG_INFO("interrupt in als\n"); + } + elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_ACTIVE_LOW); + elan_sensor_I2C_Write(client,REG_7,W_SINGLE_BYTE,0x02,EPL_DATA_UNLOCK); + enable_irq(epld->irq); +} + +static irqreturn_t elan_sensor_irq_handler(int irqNo, void *handle) +{ + struct elan_epl_data *epld = (struct elan_epl_data*)handle; + + disable_irq_nosync(epld->irq); + queue_work(epld->epl_wq, &epl_sensor_irq_work); + + return IRQ_HANDLED; +} +#endif + +static void report_polling_do_work(struct work_struct *work) +{ + struct elan_epl_data *epld = epl_data; + + if(dual_count==CMC_MODE_PS) + { + elan_epl_ps_poll_rawdata(); + } + else if(dual_count==CMC_MODE_ALS) + { + elan_epl_als_rawdata(); + } + + if(epld->enable_pflag) + { + elan_sensor_psensor_enable(epld); + + if(PS_INTERRUPT_MODE==0) + { + dual_count=CMC_MODE_PS; // ps mode + queue_delayed_work(epld->epl_wq, &report_polling_work,msecs_to_jiffies(PS_POLLING_RATE)); + } + } +} + +static void polling_do_work(struct work_struct *work) +{ + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + + bool isInterleaving = epld->enable_pflag==1 && epld->enable_lflag==1; + bool isAlsOnly = epld->enable_pflag==0 && epld->enable_lflag==1; + bool isPsOnly = epld->enable_pflag==1 && epld->enable_lflag==0; + + cancel_delayed_work(&polling_work); + cancel_delayed_work(&report_polling_work); + + LOG_INFO("enable_pflag = %d, enable_lflag = %d\n", epld->enable_pflag, epld->enable_lflag); + + if(isAlsOnly || isInterleaving) + { + elan_sensor_lsensor_enable(epld); + dual_count = CMC_MODE_ALS; + + queue_delayed_work(epld->epl_wq, &report_polling_work,msecs_to_jiffies(ALS_DELAY)); + queue_delayed_work(epld->epl_wq, &polling_work,msecs_to_jiffies(ALS_POLLING_RATE)); + } + else if(isPsOnly) + { + elan_sensor_psensor_enable(epld); + dual_count = CMC_MODE_PS; + + if(PS_INTERRUPT_MODE) + { + // do nothing + } + else + { + queue_delayed_work(epld->epl_wq, &report_polling_work,msecs_to_jiffies(PS_DELAY)); + queue_delayed_work(epld->epl_wq, &polling_work,msecs_to_jiffies(PS_POLLING_RATE)); + } + } + else + { + elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_DISABLE); + elan_sensor_I2C_Write(client,REG_0,W_SINGLE_BYTE,0X02,EPL_S_SENSING_MODE); + } +} + +#if 0 +static ssize_t elan_ls_operationmode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + uint16_t mode=0; + struct elan_epl_data *epld = epl_data; + LOG_FUN(); + + sscanf(buf, "%hu",&mode); + LOG_INFO("==>[operation mode]=%d\n", mode); + + if(mode == 0) + { + epld->enable_lflag = 0; + epld->enable_pflag = 0; + } + else if(mode == 1) + { + epld->enable_lflag = 1; + epld->enable_pflag = 0; + } + else if(mode == 2) + { + epld->enable_lflag = 0; + epld->enable_pflag = 1; + } + else if(mode == 3) + { + epld->enable_lflag = 1; + epld->enable_pflag = 1; + } + else + { + LOG_INFO("0: none\n1: als only\n2: ps only\n3: interleaving"); + } + + elan_sensor_restart_work(); + return count; +} + +static ssize_t elan_ls_operationmode_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct elan_epl_data *epld = epl_data; + long *tmp = (long*)buf; + uint16_t mode =0; + LOG_FUN(); + + if( epld->enable_pflag==0 && epld->enable_lflag==0) + { + mode = 0; + } + else if( epld->enable_pflag==0 && epld->enable_lflag==1) + { + mode = 1; + } + else if( epld->enable_pflag==1 && epld->enable_lflag==0) + { + mode = 2; + } + else if( epld->enable_pflag==1 && epld->enable_lflag==1) + { + mode = 3; + } + tmp[0] = mode; + return sprintf(buf, "%d \n", mode); +} + +static ssize_t elan_ls_status_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct elan_epl_data *epld = epl_data; + u16 ch1; + + if(!epl_data) + { + LOG_INFO("epl_data is null!!\n"); + return 0; + } + elan_sensor_I2C_Write(epld->client,REG_7,W_SINGLE_BYTE,0x02,EPL_DATA_LOCK); + + elan_sensor_I2C_Write(epld->client,REG_16,R_TWO_BYTE,0x01,0x00); + elan_sensor_I2C_Read(epld->client); + ch1 = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + LOG_INFO("ch1 raw_data = %d\n", ch1); + + elan_sensor_I2C_Write(epld->client,REG_7,W_SINGLE_BYTE,0x02,EPL_DATA_UNLOCK); + + return sprintf(buf, "%d\n", ch1); +} + +static DEVICE_ATTR(elan_ls_operationmode, S_IROTH|S_IWOTH, elan_ls_operationmode_show,elan_ls_operationmode_store); +static DEVICE_ATTR(elan_ls_status, S_IROTH|S_IWOTH, elan_ls_status_show,NULL); + +static struct attribute *ets_attributes[] = +{ + &dev_attr_elan_ls_operationmode.attr, + &dev_attr_elan_ls_status.attr, + NULL, +}; + +static struct attribute_group ets_attr_group = +{ + .attrs = ets_attributes, +}; +#endif + +#if 0 //ices add +static int elan_als_open(struct inode *inode, struct file *file) +{ + struct elan_epl_data *epld = epl_data; + + LOG_FUN(); + + if (epld->als_opened) + { + return -EBUSY; + } + epld->als_opened = 1; + + return 0; +} + +static int elan_als_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + struct elan_epl_data *epld = epl_data; + int buf[1]; + if(epld->read_flag ==1) + { + buf[0] = gRawData.als_ch1_raw; + if(copy_to_user(buffer, &buf , sizeof(buf))) + return 0; + epld->read_flag = 0; + return 12; + } + else + { + return 0; + } +} + +static int elan_als_release(struct inode *inode, struct file *file) +{ + struct elan_epl_data *epld = epl_data; + + LOG_FUN(); + + epld->als_opened = 0; + + return 0; +} +#if 1 +static long elan_als_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int flag; + unsigned long buf[1]; + struct elan_epl_data *epld = epl_data; + + void __user *argp = (void __user *)arg; + + LOG_INFO("als io ctrl cmd %d\n", _IOC_NR(cmd)); + + switch(cmd) + { + case ELAN_EPL6800_IOCTL_GET_LFLAG: + + LOG_INFO("elan ambient-light IOCTL Sensor get lflag \n"); + flag = epld->enable_lflag; + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + + LOG_INFO("elan ambient-light Sensor get lflag %d\n",flag); + break; + + case ELAN_EPL6800_IOCTL_ENABLE_LFLAG: + + LOG_INFO("elan ambient-light IOCTL Sensor set lflag \n"); + if (copy_from_user(&flag, argp, 1)) + return -EFAULT; + LOG_INFO("elan ambient-light Sensor set lflag %d\n",flag); + if(flag) { + flag = 1; + }else { + flag = 0; + } + //if (flag < 0 || flag > 1) + // return -EINVAL; + + epld->enable_lflag = flag; + elan_sensor_restart_work(); + + //LOG_INFO("elan ambient-light Sensor set lflag %d\n",flag); + break; + + case ELAN_EPL6800_IOCTL_GETDATA: + buf[0] = (unsigned long)gRawData.als_ch1_raw; + if(copy_to_user(argp, &buf , 2)) + return -EFAULT; + + break; + + default: + LOG_ERR("invalid cmd %d\n", _IOC_NR(cmd)); + return -EINVAL; + } + + return 0; + +} +#endif +static unsigned int elan_als_poll(struct file *fp, poll_table * wait) +{ + if(ls_data_changed){ + //pr_info("%s, ls_data_changed 1st, ls_data = 0x%x\n", __func__, ls_data); + ls_data_changed = 0; + //mutex_unlock(&stk3x1x_mutex); + return POLLIN | POLLRDNORM; + } + poll_wait(fp, &ls_waitqueue, wait); + //mutex_unlock(&stk3x1x_mutex); + return 0; +} + +static struct file_operations elan_als_fops = +{ + .owner = THIS_MODULE, + .open = elan_als_open, + .read = elan_als_read, + .release = elan_als_release, + .unlocked_ioctl = elan_als_ioctl, + .poll = elan_als_poll, +}; + +static struct miscdevice elan_als_device = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "elan_als", + .fops = &elan_als_fops +}; +#endif //ices end + +static int elan_ps_open(struct inode *inode, struct file *file) +{ + struct elan_epl_data *epld = epl_data; + + LOG_FUN(); + + if (epld->ps_opened) + return -EBUSY; + + epld->ps_opened = 1; + + return 0; +} + +static int elan_ps_release(struct inode *inode, struct file *file) +{ + struct elan_epl_data *epld = epl_data; + + LOG_FUN(); + + epld->ps_opened = 0; + + psensor_mode_suspend = 0; + + return 0; +} + +static int epl2182_read_chip_info(struct i2c_client *client, char *buf) +{ + if(NULL == buf) { + return -1; + } + if(NULL == client) { + *buf = 0; + return -2; + } + + sprintf(buf, "EPL2182"); + printk("[EPL2182] epl2182_read_chip_info %s\n",buf); + return 0; +} + +static long elan_ps_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int flag, err; + unsigned long buf; + char strbuf[256]; + struct elan_epl_data *epld = epl_data; + void __user *argp = (void __user *)arg; + + LOG_INFO("ps io ctrl cmd %d\n", _IOC_NR(cmd)); + //ioctl message handle must define by android sensor library (case by case) + switch(cmd) + { + case ELAN_EPL6800_IOCTL_GET_PFLAG: + flag = epld->enable_pflag; + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + LOG_INFO("elan Proximity Sensor get pflag %d\n",flag); + break; + + case ELAN_EPL6800_IOCTL_ENABLE_PFLAG: + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + LOG_INFO("elan Proximity Sensor set pflag %d\n",flag); + if(flag) { + flag = 1; + }else { + flag = 0; + } + epld->enable_pflag = flag; + elan_sensor_restart_work(); + break; + + case ELAN_EPL6800_IOCTL_GET_CHIPINFO: + err = epl2182_read_chip_info(this_client, strbuf); + if(err < 0) + return -EFAULT; + if(copy_to_user(argp, strbuf, strlen(strbuf)+1)) + return -EFAULT; + break; + + case ELAN_EPL6800_IOCTL_GET_LFLAG: + flag = epld->enable_lflag; + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + LOG_INFO("elan ambient-light Sensor get lflag %d\n",flag); + break; + + case ELAN_EPL6800_IOCTL_ENABLE_LFLAG: + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + LOG_INFO("elan ambient-light Sensor set lflag %d\n",flag); + if(flag) { + flag = 1; + }else { + flag = 0; + } + epld->enable_lflag = flag; + elan_sensor_restart_work(); + break; + + case ELAN_EPL6800_IOCTL_GETDATA: + buf = (unsigned long)gRawData.als_ch1_raw; + if(copy_to_user(argp, &buf , sizeof(buf))) + return -EFAULT; + LOG_INFO("elan als Sensor get data (%lu)\n",buf); + break; + + default: + LOG_ERR("invalid cmd %d\n", _IOC_NR(cmd)); + return -EINVAL; + } + + return 0; +} + +static unsigned int elan_ps_poll(struct file *fp, poll_table * wait) +{ + if(ps_data_changed) { + ps_data_changed = 0; + return POLLIN | POLLRDNORM; + } + poll_wait(fp, &ps_waitqueue, wait); + return 0; +} + + +static struct file_operations elan_ps_fops = +{ + .owner = THIS_MODULE, + .open = elan_ps_open, + .release = elan_ps_release, + .unlocked_ioctl = elan_ps_ioctl, + .poll = elan_ps_poll, +}; + +static struct miscdevice elan_ps_device = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = EPL2182_PLS_DEVICE, + .fops = &elan_ps_fops +}; + +static int initial_sensor(struct elan_epl_data *epld) +{ + struct i2c_client *client = epld->client; + + int ret = 0; + + LOG_INFO("initial_sensor enter!\n"); + + ret = elan_sensor_I2C_Read(client); + + if(ret < 0) + return -EINVAL; + + elan_sensor_I2C_Write(client,REG_0,W_SINGLE_BYTE,0x02, EPL_S_SENSING_MODE); + elan_sensor_I2C_Write(client,REG_9,W_SINGLE_BYTE,0x02,EPL_INT_DISABLE); + set_psensor_intr_threshold(P_SENSOR_LTHD , P_SENSOR_HTHD); + + msleep(2); + + epld->enable_lflag = 0; + epld->enable_pflag = 0; + + return ret; +} +#if 0 //ices add +/*----------------------------------------------------------------------------*/ +static ssize_t light_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct elan_epl_data *epld = epl_data; + printk("%s: ALS_status=%d\n", __func__, epld->enable_lflag); + return sprintf(buf, "%d\n", epld->enable_lflag); +} + +static ssize_t light_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct elan_epl_data *epld = epl_data; + + LOG_INFO("light_enable_store: enable=%s \n", buf); + + if (sysfs_streq(buf, "1")) + epld->enable_lflag= 1; + else if (sysfs_streq(buf, "0")) + epld->enable_lflag= 0; + else { + pr_err("%s: invalid value %d\n", __func__, *buf); + return 0; + } + + elan_sensor_restart_work(); + return size; +} + +/*----------------------------------------------------------------------------*/ +static struct device_attribute dev_attr_light_enable = +__ATTR(enable, S_IRWXUGO, + light_enable_show, light_enable_store); + +static struct attribute *light_sysfs_attrs[] = { + &dev_attr_light_enable.attr, + NULL +}; + +static struct attribute_group light_attribute_group = { + .attrs = light_sysfs_attrs, +}; +/*----------------------------------------------------------------------------*/ + +static int lightsensor_setup(struct elan_epl_data *epld) +{ + int err = 0; + LOG_INFO("lightsensor_setup enter.\n"); + + epld->als_input_dev = input_allocate_device(); + if (!epld->als_input_dev) + { + LOG_ERR( "could not allocate ls input device\n"); + return -ENOMEM; + } + epld->als_input_dev->name = ElanALsensorName; + set_bit(EV_ABS, epld->als_input_dev->evbit); + input_set_abs_params(epld->als_input_dev, ABS_MISC, 0, 9, 0, 0); + + err = input_register_device(epld->als_input_dev); + if (err < 0) + { + LOG_ERR("can not register ls input device\n"); + goto err_free_ls_input_device; + } +#if 0 //ices add + err = misc_register(&elan_als_device); + if (err < 0) + { + LOG_ERR("can not register ls misc device\n"); + goto err_unregister_ls_input_device; + } +#endif //ices end + err = sysfs_create_group(&epld->als_input_dev->dev.kobj, &light_attribute_group); + + if (err) { + pr_err("%s: could not create sysfs group\n", __func__); + goto err_free_ls_input_device; + } + + return err; + +err_unregister_ls_input_device: + input_unregister_device(epld->als_input_dev); +err_free_ls_input_device: + input_free_device(epld->als_input_dev); + return err; +} +#endif +/*----------------------------------------------------------------------------*/ +static ssize_t proximity_enable_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct elan_epl_data *epld = epl_data; + printk("%s: PS status=%d\n", __func__, epld->enable_pflag); + LOG_INFO("epl2182_setup_psensor enter.\n"); + return sprintf(buf, "%d\n", epld->enable_pflag); +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static ssize_t proximity_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct elan_epl_data *epld = epl_data; + + LOG_INFO("proximity_enable_store: enable=%s \n", buf); + if (sysfs_streq(buf, "1")) + epld->enable_pflag =1; + else if (sysfs_streq(buf, "0")) + epld->enable_pflag =0; + else { + pr_err("%s: invalid value %d\n", __func__, *buf); + return 0; + } + + elan_sensor_restart_work(); + return size; +} +/*----------------------------------------------------------------------------*/ +static struct device_attribute dev_attr_ps_enable = +__ATTR(enable, S_IRWXUGO, + proximity_enable_show, proximity_enable_store); + +static struct attribute *proximity_sysfs_attrs[] = { + &dev_attr_ps_enable.attr, + NULL +}; + +static struct attribute_group proximity_attribute_group = { + .attrs = proximity_sysfs_attrs, +}; +/*----------------------------------------------------------------------------*/ + +static int psensor_setup(struct elan_epl_data *epld) +{ + int err = 0; + LOG_INFO("psensor_setup enter.\n"); + + epld->ps_input_dev = input_allocate_device(); + if (!epld->ps_input_dev) + { + LOG_ERR("could not allocate ps input device\n"); + return -ENOMEM; + } + epld->ps_input_dev->name = ElanPsensorName; + + set_bit(EV_ABS, epld->ps_input_dev->evbit); + input_set_abs_params(epld->ps_input_dev, ABS_DISTANCE, 0, 1, 0, 0); +#if 1 + set_bit(EV_ABS, epld->ps_input_dev->evbit); + input_set_abs_params(epld->ps_input_dev, ABS_MISC, 0, 9, 0, 0); +#endif + + err = input_register_device(epld->ps_input_dev); + if (err < 0) + { + LOG_ERR("could not register ps input device\n"); + goto err_free_ps_input_device; + } + + err = misc_register(&elan_ps_device); + if (err < 0) + { + LOG_ERR("could not register ps misc device\n"); + goto err_unregister_ps_input_device; + } + + err = sysfs_create_group(&epld->ps_input_dev->dev.kobj, &proximity_attribute_group); + if (err) { + pr_err("%s: PS could not create sysfs group\n", __func__); + goto err_free_ps_input_device; + } + + return err; + +err_unregister_ps_input_device: + input_unregister_device(epld->ps_input_dev); +err_free_ps_input_device: + input_free_device(epld->ps_input_dev); + return err; +} + +#if PS_INTERRUPT_MODE +static int setup_interrupt(struct elan_epl_data *epld) +{ + struct i2c_client *client = epld->client; + struct elan_epl_platform_data *pdata = client->dev.platform_data; + + int err = 0; + msleep(5); +#if 1 + err = gpio_request(pdata->irq_gpio_number, "Elan EPL IRQ"); + if (err) + { + LOG_ERR("gpio pin request fail (%d)\n", err); + goto initial_fail; + } + else + { + + gpio_direction_input(pdata->irq_gpio_number); + + /*get irq*/ + client->irq = gpio_to_irq(pdata->irq_gpio_number); + epld->irq = client->irq; + + printk("IRQ number is %d\n", client->irq); + + } +#endif + err = request_irq(epld->irq,elan_sensor_irq_handler, IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND , + client->dev.driver->name, epld); + if(err <0) + { + LOG_ERR("request irq pin %d fail for gpio\n",err); + goto fail_free_intr_pin; + } + + return err; + +initial_fail: +fail_free_intr_pin: + gpio_free(epld->intr_pin); + return err; +} +#endif + +#ifdef CONFIG_SUSPEND +static int elan_sensor_suspend(struct i2c_client *client, pm_message_t mesg) +{ + LOG_FUN(); + + if(epl_data->enable_pflag==0 ) + { + elan_sensor_I2C_Write(client,REG_7, W_SINGLE_BYTE, 0x02, EPL_C_P_DOWN); + cancel_delayed_work(&polling_work); + } + return 0; +} + +static int elan_sensor_resume(struct i2c_client *client) +{ + struct elan_epl_data *epld = epl_data; + LOG_FUN(); + + if(epld->enable_pflag | epld->enable_lflag) + { + elan_sensor_I2C_Write(client,REG_7, W_SINGLE_BYTE, 0x02, EPL_C_P_UP); + } + + if(epld->enable_pflag) + { + elan_sensor_restart_work(); + } + return 0; +} +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void elan_sensor_early_suspend(struct early_suspend *h) +{ + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + LOG_FUN(); + + if( epld->enable_pflag==0) + { + elan_sensor_I2C_Write(client,REG_7, W_SINGLE_BYTE, 0x02, EPL_C_P_DOWN); + cancel_delayed_work(&polling_work); + } + + psensor_mode_suspend = 1; +} + +static void elan_sensor_late_resume(struct early_suspend *h) +{ + struct elan_epl_data *epld = epl_data; + struct i2c_client *client = epld->client; + + LOG_FUN(); + + if(epld->enable_pflag | epld->enable_lflag) + { + elan_sensor_I2C_Write(client,REG_7, W_SINGLE_BYTE, 0x02, EPL_C_P_UP); + } + + if(epld->enable_pflag || epld->enable_lflag) + { + elan_sensor_restart_work(); + } + psensor_mode_suspend = 0; +} +#endif + +static int elan_sensor_probe(struct i2c_client *client,const struct i2c_device_id *id) +{ + int err = 0; + int chip_id = 0; + struct elan_epl_data *epld ; + struct elan_epl_platform_data *pdata = client->dev.platform_data; + //static struct platform_device *sensor_dev; + struct device_node *np = client->dev.of_node; + LOG_INFO("elan sensor probe enter.\n"); +#ifdef CONFIG_OF + if (np && !pdata){ + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Could not allocate struct elan_epl_platform_data"); + goto exit_allocate_pdata_failed; + } + pdata->irq_gpio_number = of_get_gpio(np, 0); + if(pdata->irq_gpio_number < 0){ + dev_err(&client->dev, "fail to get irq_gpio_number\n"); + kfree(pdata); + goto exit_irq_gpio_read_fail; + } + client->dev.platform_data = pdata; + } +#endif + + epld = kzalloc(sizeof(struct elan_epl_data), GFP_KERNEL); + if (!epld) { + err = -ENOMEM; + LOG_ERR("kzalloc elan_epl_data failed!\n"); + goto exit_kzalloc_epld_failed; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + { + dev_err(&client->dev,"No supported i2c func what we need?!!\n"); + err = -ENOTSUPP; + goto i2c_fail; + } + chip_id = i2c_smbus_read_byte_data(client, 0x00); + if (chip_id < 0) + { + dev_err(&client->dev,"read chip id REG 0x00 failed\n"); + err = -ENODEV; + goto exit_read_chipid_failed; + } + LOG_INFO("chip id REG 0x00 value = %8x\n", i2c_smbus_read_byte_data(client, 0x00)); + LOG_INFO("chip id REG 0x01 value = %8x\n", i2c_smbus_read_byte_data(client, 0x08)); + LOG_INFO("chip id REG 0x02 value = %8x\n", i2c_smbus_read_byte_data(client, 0x10)); + LOG_INFO("chip id REG 0x03 value = %8x\n", i2c_smbus_read_byte_data(client, 0x18)); + LOG_INFO("chip id REG 0x04 value = %8x\n", i2c_smbus_read_byte_data(client, 0x20)); + LOG_INFO("chip id REG 0x05 value = %8x\n", i2c_smbus_read_byte_data(client, 0x28)); + LOG_INFO("chip id REG 0x06 value = %8x\n", i2c_smbus_read_byte_data(client, 0x30)); + LOG_INFO("chip id REG 0x07 value = %8x\n", i2c_smbus_read_byte_data(client, 0x38)); + LOG_INFO("chip id REG 0x09 value = %8x\n", i2c_smbus_read_byte_data(client, 0x48)); + LOG_INFO("chip id REG 0x0D value = %8x\n", i2c_smbus_read_byte_data(client, 0x68)); + LOG_INFO("chip id REG 0x0E value = %8x\n", i2c_smbus_read_byte_data(client, 0x70)); + LOG_INFO("chip id REG 0x0F value = %8x\n", i2c_smbus_read_byte_data(client, 0x71)); + LOG_INFO("chip id REG 0x10 value = %8x\n", i2c_smbus_read_byte_data(client, 0x80)); + LOG_INFO("chip id REG 0x11 value = %8x\n", i2c_smbus_read_byte_data(client, 0x88)); + LOG_INFO("chip id REG 0x13 value = %8x\n", i2c_smbus_read_byte_data(client, 0x98)); + + epld->client = client; + this_client = client; + epld->irq = client->irq; + i2c_set_clientdata(client, epld); + + epl_data = epld; + + epld->epl_wq = create_singlethread_workqueue(EPL2182_PLS_DEVICE); + if (!epld->epl_wq) + { + LOG_ERR("can't create workqueue\n"); + err = -ENOMEM; + goto err_create_singlethread_workqueue; + } +#if 0 //ices add + err = lightsensor_setup(epld); + if (err < 0) + { + LOG_ERR("lightsensor_setup error!!\n"); + goto err_lightsensor_setup; + } +#endif + err = psensor_setup(epld); + if (err < 0) + { + LOG_ERR("psensor_setup error!!\n"); + goto err_psensor_setup; + } + + err = initial_sensor(epld); + if (err < 0) + { + LOG_ERR("fail to initial sensor (%d)\n", err); + goto err_sensor_setup; + } + +#if PS_INTERRUPT_MODE + err = setup_interrupt(epld); + if (err < 0) + { + LOG_ERR("setup error!\n"); + goto err_sensor_setup; + } +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + epld->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + epld->early_suspend.suspend = elan_sensor_early_suspend; + epld->early_suspend.resume = elan_sensor_late_resume; + register_early_suspend(&epld->early_suspend); +#endif + +#if 0 + wake_lock_init(&g_ps_wlock, WAKE_LOCK_SUSPEND, "ps_wakelock"); + + sensor_dev = platform_device_register_simple("elan_alsps", -1, NULL, 0); + if (IS_ERR(sensor_dev)) + { + printk ("sensor_dev_init: error\n"); + goto err_fail; + } + + err = sysfs_create_group(&sensor_dev->dev.kobj, &ets_attr_group); + if (err !=0) + { + dev_err(&client->dev,"%s:create sysfs group error", __func__); + goto err_fail; + } +#endif + + LOG_INFO("sensor probe success.\n"); + + return err; + +err_fail: + //input_unregister_device(epld->als_input_dev); + input_unregister_device(epld->ps_input_dev); + //input_free_device(epld->als_input_dev); + input_free_device(epld->ps_input_dev); +//err_lightsensor_setup: +err_psensor_setup: +err_sensor_setup: + destroy_workqueue(epld->epl_wq); + misc_deregister(&elan_ps_device); +// misc_deregister(&elan_als_device); //ices add +err_create_singlethread_workqueue: +exit_read_chipid_failed: +i2c_fail: +//err_platform_data_null: + kfree(epld); +exit_kzalloc_epld_failed: +#ifdef CONFIG_OF +exit_irq_gpio_read_fail: +exit_allocate_pdata_failed: +#endif + return err; +} + +static int elan_sensor_remove(struct i2c_client *client) +{ + struct elan_epl_data *epld = i2c_get_clientdata(client); + + dev_dbg(&client->dev, "%s: enter.\n", __func__); + + unregister_early_suspend(&epld->early_suspend); + //input_unregister_device(epld->als_input_dev); + input_unregister_device(epld->ps_input_dev); + //input_free_device(epld->als_input_dev); + input_free_device(epld->ps_input_dev); + misc_deregister(&elan_ps_device); +// misc_deregister(&elan_als_device); //ices add + free_irq(epld->irq,epld); + destroy_workqueue(epld->epl_wq); + kfree(epld); + return 0; +} + +static const struct i2c_device_id elan_sensor_id[] = +{ + { EPL2182_PLS_DEVICE, 0 }, + { } +}; + +static const struct of_device_id epl2182_of_match[] = { + { .compatible = "ELAN,epl2182_pls", }, + {} +}; +MODULE_DEVICE_TABLE(of, epl2182_of_match); + +static struct i2c_driver elan_sensor_driver = +{ + .probe = elan_sensor_probe, + .remove = elan_sensor_remove, + .id_table = elan_sensor_id, + .driver = { + .name = EPL2182_PLS_DEVICE, + .owner = THIS_MODULE, + .of_match_table = epl2182_of_match, + }, +#ifdef CONFIG_SUSPEND + .suspend = elan_sensor_suspend, + .resume = elan_sensor_resume, +#endif +}; + +static int __init elan_sensor_init(void) +{ + return i2c_add_driver(&elan_sensor_driver); +} + +static void __exit elan_sensor_exit(void) +{ + i2c_del_driver(&elan_sensor_driver); +} + +module_init(elan_sensor_init); +module_exit(elan_sensor_exit); + +MODULE_AUTHOR("Renato Pan "); +MODULE_DESCRIPTION("ELAN epl2182 driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/misc/epl259x.c b/drivers/input/misc/epl259x.c new file mode 100644 index 00000000..81bcd79a --- /dev/null +++ b/drivers/input/misc/epl259x.c @@ -0,0 +1,4645 @@ +/* drivers/i2c/chips/epl259x.c - light and proxmity sensors driver + * Copyright (C) 2014 ELAN Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#include +#include +#include +#if defined(CONFIG_HAS_EARLYSUSPEND) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +/****************************************************************************** +* configuration +*******************************************************************************/ +#define ALS_POLLING_MODE 1 // 1 is polling mode, 0 is interrupt mode +#define PS_POLLING_MODE 0 // 1 is polling mode, 0 is interrupt mode + +#define ALS_LOW_THRESHOLD 1000 +#define ALS_HIGH_THRESHOLD 3000 + +#define PS_LOW_THRESHOLD 3000 +#define PS_HIGH_THRESHOLD 4000 + +#define LUX_PER_COUNT 700 + +//platform select +#define S5PV210 0 +#define SPREAD 1 +#define QCOM 0 +#define LEADCORE 0 +#define MARVELL 0 + +//#define ELAN_INT_PIN 140 /*Interrupt pin setting*/ + +//debug message +#define COMMON_DEBUG 0 +#define ALS_DEBUG 0 +#define PS_DEBUG 1 +#define SHOW_DBG 0 + +#define ALS_DYN_INTT 0 +#define PS_DYN_K 0 +#define PS_DYN_K_STR 0 +#define HS_ENABLE 0 +#define PS_GES 0 + +#define ALS_LEVEL 16 +static int polling_time = 200; +static struct i2c_client *this_client = NULL; +static int als_level[] = {20, 45, 70, 90, 150, 300, 500, 700, 1150, 2250, 4500, 8000, 15000, 30000, 50000}; +static int als_value[] = {10, 30, 60, 80, 100, 200, 400, 600, 800, 1500, 3000, 6000, 10000, 20000, 40000, 60000}; + +#if ALS_DYN_INTT +//Dynamic INTT +int dynamic_intt_idx; +int dynamic_intt_init_idx = 1; //initial dynamic_intt_idx +int c_gain; +int dynamic_intt_lux = 0; + +uint16_t dynamic_intt_high_thr; +uint16_t dynamic_intt_low_thr; +uint32_t dynamic_intt_max_lux = 12000; +uint32_t dynamic_intt_min_lux = 0; +uint32_t dynamic_intt_min_unit = 1000; + +static int als_dynamic_intt_intt[] = {EPL_ALS_INTT_8192, EPL_ALS_INTT_64}; +static int als_dynamic_intt_value[] = {8192, 64}; +static int als_dynamic_intt_gain[] = {EPL_GAIN_MID, EPL_GAIN_MID}; +static int als_dynamic_intt_high_thr[] = {60000, 53000}; +static int als_dynamic_intt_low_thr[] = {200, 300}; +static int als_dynamic_intt_intt_num = sizeof(als_dynamic_intt_value)/sizeof(int); +#endif + +#if ALS_DYN_INTT +typedef enum +{ + CMC_BIT_LSRC_NON = 0x0, + CMC_BIT_LSRC_SCALE = 0x1, + CMC_BIT_LSRC_SLOPE = 0x2, + CMC_BIT_LSRC_BOTH = 0x3, +} CMC_LSRC_REPORT_TYPE; +#endif + +#if PS_DYN_K +static int dynk_polling_delay = 200; +int dynk_min_ps_raw_data; +int dynk_max_ir_data; + +u32 dynk_thd_low = 0; +u32 dynk_thd_high = 0; + +int dynk_low_offset; +int dynk_high_offset; + +bool dynk_change_flag = false; +u16 dynk_change_thd_max; +u16 dynk_thd_offset; + +u8 dynk_last_status = 0; + +#if PS_DYN_K_STR +bool dynk_enhance_flag = true; +u8 dynk_enhance_integration_time; +u8 dynk_enhance_gain; +u8 dynk_enhance_adc; +u16 dynk_enhance_ch0; +u16 dynk_enhance_ch1; +u16 dynk_enhance_max_ch0; +#endif + +#endif + +#if HS_ENABLE +static struct mutex hs_sensor_mutex; +static bool hs_enable_flag = false; +#endif + +#if PS_GES +static bool ps_ges_enable_flag = false; +u16 ges_threshold_low = 1000; +u16 ges_threshold_high = 1500; +#define KEYCODE_LEFT KEY_LEFTALT +bool ps_ges_suspend_flag = false; +#endif + +bool polling_flag = true; +bool eint_flag = true; + +//ps calibration file location +static const char ps_cal_file[]="/data/data/com.eminent.ps.calibration/ps.dat"; + +//als calibration file location +static const char als_cal_file[]="/data/data/com.eminent.ps.calibration/als.dat"; + +static int PS_h_offset = 2000; +static int PS_l_offset = 1000; +static int PS_MAX_XTALK = 30000; + +int als_frame_time = 0; +int ps_frame_time = 0; +/****************************************************************************** +*******************************************************************************/ + +#define TXBYTES 2 +#define RXBYTES 2 + +#define PACKAGE_SIZE 8 +#define I2C_RETRY_COUNT 10 +#define EPL_DEV_NAME "epl2182_pls" +#define DRIVER_VERSION "1.0.3" +//struct timeval ges_enable_time; + +//int ges_frame_count; + +typedef enum +{ + CMC_BIT_RAW = 0x0, + CMC_BIT_PRE_COUNT = 0x1, + CMC_BIT_DYN_INT = 0x2, + CMC_BIT_DEF_LIGHT = 0x4, + CMC_BIT_TABLE = 0x8, +} CMC_ALS_REPORT_TYPE; + +typedef struct _epl_raw_data +{ + u8 raw_bytes[PACKAGE_SIZE]; + u16 renvo; +} epl_raw_data; + +struct epl_sensor_priv +{ + struct i2c_client *client; + struct input_dev *als_input_dev; + struct input_dev *ps_input_dev; + struct workqueue_struct *epl_wq; + struct delayed_work eint_work; +#if defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + int intr_pin; + int (*power)(int on); + + int ps_opened; + int als_opened; + + int als_suspend; + int ps_suspend; + + int lux_per_count; + + int enable_pflag; + int enable_lflag; +#if HS_ENABLE + int enable_hflag; + int hs_suspend; +#endif +#if PS_GES + struct input_dev *gs_input_dev; + int enable_gflag; + int ges_suspend; +#endif + int read_flag; + int irq; + spinlock_t lock; + +#if ALS_DYN_INTT + uint32_t ratio; + uint32_t last_ratio; + int c_gain_h; // fluorescent (C1) + int c_gain_l; // incandescent (C2) + uint32_t lsource_thd_high; //different light source boundary (N) fluorescent (C1) + uint32_t lsource_thd_low; //different light source boundary (N) incandescent (C2) +#endif + + /*data*/ + u16 als_level_num; + u16 als_value_num; + u32 als_level[ALS_LEVEL-1]; + u32 als_value[ALS_LEVEL]; +} ; + +static struct platform_device *sensor_dev; +struct epl_sensor_priv *epl_sensor_obj; +static epl_optical_sensor epl_sensor; +int i2c_max_count=8; + +static epl_raw_data gRawData; + +static struct wake_lock ps_lock; +static struct mutex sensor_mutex; + +#if S5PV210 +static const char ElanPsensorName[]="proximity"; +static const char ElanALsensorName[]="lightsensor-level"; +#elif SPREAD +static const char ElanPsensorName[] = "proximity"; +#elif QCOM || LEADCORE +static const char ElanPsensorName[] = "proximity"; +static const char ElanALsensorName[] = "light"; +#elif MARVELL +static const char ElanPsensorName[] = "alps_pxy"; +#endif + +#define LOG_TAG "[EPL259x] " +#define LOG_FUN(f) printk(KERN_INFO LOG_TAG"%s\n", __FUNCTION__) +#define LOG_INFO(fmt, args...) printk(KERN_INFO LOG_TAG fmt, ##args) +#define LOG_ERR(fmt, args...) printk(KERN_ERR LOG_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) + + +void epl_sensor_update_mode(struct i2c_client *client); +int epl_sensor_read_als_status(struct i2c_client *client); +static int epl_sensor_setup_interrupt(struct epl_sensor_priv *epld); +static int ps_sensing_time(int intt, int adc, int cycle); +static int als_sensing_time(int intt, int adc, int cycle); + +static void epl_sensor_eint_work(struct work_struct *work); +//static DECLARE_WORK(epl_sensor_irq_work, epl_sensor_eint_work); + +static void epl_sensor_polling_work(struct work_struct *work); +static DECLARE_DELAYED_WORK(polling_work, epl_sensor_polling_work); + +#if PS_DYN_K +void epl_sensor_dynk_thd_polling_work(struct work_struct *work); +void epl_sensor_restart_dynk_polling(void); +static DECLARE_DELAYED_WORK(dynk_thd_polling_work, epl_sensor_dynk_thd_polling_work); +#endif + + + + +/* +//====================I2C write operation===============// +*/ +static int epl_sensor_I2C_Write_Cmd(struct i2c_client *client, uint8_t regaddr, uint8_t data, uint8_t txbyte) +{ + uint8_t buffer[2]; + int ret = 0; + int retry; + + buffer[0] = regaddr ; + buffer[1] = data; + + for(retry = 0; retry < I2C_RETRY_COUNT; retry++) + { + ret = i2c_master_send(client, buffer, txbyte); + + if (ret == txbyte) + { + break; + } + + LOG_ERR("i2c write error,TXBYTES %d\n",ret); + mdelay(10); + } + + + if(retry>=I2C_RETRY_COUNT) + { + LOG_ERR("i2c write retry over %d\n", I2C_RETRY_COUNT); + return -EINVAL; + } + + return ret; +} + +static int epl_sensor_I2C_Write(struct i2c_client *client, uint8_t regaddr, uint8_t data) +{ + int ret = 0; + ret = epl_sensor_I2C_Write_Cmd(client, regaddr, data, 0x02); + return ret; + return 0; +} +/*----------------------------------------------------------------------------*/ +static int epl_sensor_I2C_Read(struct i2c_client *client, uint8_t regaddr, uint8_t bytecount) +{ + + int ret = 0; + + + int retry; + int read_count=0, rx_count=0; + + while(bytecount>0) + { + epl_sensor_I2C_Write_Cmd(client, regaddr+read_count, 0x00, 0x01); + + for(retry = 0; retry < I2C_RETRY_COUNT; retry++) + { + rx_count = bytecount>i2c_max_count?i2c_max_count:bytecount; + ret = i2c_master_recv(client, &gRawData.raw_bytes[read_count], rx_count); + + if (ret == rx_count) + break; + + LOG_ERR("i2c read error,RXBYTES %d\r\n",ret); + mdelay(10); + } + + if(retry>=I2C_RETRY_COUNT) + { + LOG_ERR("i2c read retry over %d\n", I2C_RETRY_COUNT); + return -EINVAL; + } + bytecount-=rx_count; + read_count+=rx_count; + } + + return ret; +} + +/*----------------------------------------------------------------------------*/ +static void epl_sensor_restart_polling(void) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + cancel_delayed_work(&polling_work); + queue_delayed_work(epld->epl_wq, &polling_work,msecs_to_jiffies(polling_time)); + +} +/*----------------------------------------------------------------------------*/ + +#if PS_GES +static void epl_sensor_notify_event(void) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + struct input_dev *idev = epld->gs_input_dev; + + LOG_INFO(" --> LEFT\n\n"); + input_report_key(idev, KEYCODE_LEFT, 1); + input_report_key(idev, KEYCODE_LEFT, 0); + input_sync(idev); +} +#endif + +/*----------------------------------------------------------------------------*/ +static void epl_sensor_report_lux(int repott_lux) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_INFO("------------------- ALS raw = %d, lux = %d\n\n",epl_sensor.als.data.channels[1], repott_lux); +#if SPREAD || MARVELL + input_report_abs(epld->ps_input_dev, ABS_MISC, repott_lux); + input_sync(epld->ps_input_dev); +#else + input_report_abs(epld->als_input_dev, ABS_MISC, repott_lux); + input_sync(epld->als_input_dev); +#endif +} +/*----------------------------------------------------------------------------*/ +#if ALS_DYN_INTT +long raw_convert_to_lux(u16 raw_data) +{ + long lux = 0; + + lux = raw_data * (c_gain / als_dynamic_intt_value[dynamic_intt_idx]); +#if ALS_DEBUG + LOG_INFO("[%s]:raw_data=%d, lux=%ld\r\n", __func__, raw_data, lux); +#endif + + if(lux >= (dynamic_intt_max_lux * dynamic_intt_min_unit)){ +#if ALS_DEBUG + LOG_INFO("[%s]:raw_convert_to_lux: change max lux\r\n", __func__); +#endif + lux = dynamic_intt_max_lux * dynamic_intt_min_unit; + } + else if(lux <= (dynamic_intt_min_lux*dynamic_intt_min_unit)){ +#if ALS_DEBUG + LOG_INFO("[%s]:raw_convert_to_lux: change min lux\r\n", __func__); +#endif + lux = dynamic_intt_min_lux * dynamic_intt_min_unit; + } + + return lux; +} +#endif +/*----------------------------------------------------------------------------*/ +static int epl_sensor_get_als_value(struct epl_sensor_priv *obj, u16 als) +{ + int idx; + int invalid = 0; +#if ALS_DYN_INTT + long now_lux=0, lux_tmp=0; + bool change_flag = false; +#endif + switch(epl_sensor.als.report_type) + { + case CMC_BIT_RAW: + return als; + break; + + case CMC_BIT_PRE_COUNT: + return (als * epl_sensor.als.factory.lux_per_count)/1000; + break; + + case CMC_BIT_TABLE: + for(idx = 0; idx < obj->als_level_num; idx++) + { + if(als < als_level[idx]) + { + break; + } + } + + if(idx >= obj->als_value_num) + { + LOG_ERR("exceed range\n"); + idx = obj->als_value_num - 1; + } + + if(!invalid) + { + LOG_INFO("ALS: %05d => %05d\n", als, als_value[idx]); + return als_value[idx]; + } + else + { + LOG_ERR("ALS: %05d => %05d (-1)\n", als, als_value[idx]); + return als; + } + break; +#if ALS_DYN_INTT + case CMC_BIT_DYN_INT: + + if(epl_sensor.als.lsrc_type != CMC_BIT_LSRC_NON) + { + long luxratio = 0; + epl_sensor_read_als_status(obj->client); + + if (epl_sensor.als.data.channels[0] == 0) + { + epl_sensor.als.data.channels[0] = 1; + LOG_ERR("[%s]:read ch0 data is 0 \r\n", __func__); + } + + luxratio = (long)((als*dynamic_intt_min_unit) / epl_sensor.als.data.channels[0]); //lux ratio (A=CH1/CH0) + + obj->ratio = luxratio; + if((epl_sensor.als.saturation >> 5) == 0) + { + if(epl_sensor.als.lsrc_type == CMC_BIT_LSRC_SCALE || epl_sensor.als.lsrc_type == CMC_BIT_LSRC_BOTH) + { + if(obj->ratio == 0){ + obj->last_ratio = luxratio; + } + else{ + obj->last_ratio = (luxratio + obj->last_ratio*9) / 10; + } + + if (obj->last_ratio >= obj->lsource_thd_high) //fluorescent (C1) + { + c_gain = obj->c_gain_h; + } + else if (obj->last_ratio <= obj->lsource_thd_low) //incandescent (C2) + { + c_gain = obj->c_gain_l; + } + else if(epl_sensor.als.lsrc_type == CMC_BIT_LSRC_BOTH) + { + int a = 0, b = 0, c = 0; + a = (obj->c_gain_h - obj->c_gain_l) * dynamic_intt_min_unit / (obj->lsource_thd_high - obj->lsource_thd_low); + b = (obj->c_gain_h) - ((a * obj->lsource_thd_high)/dynamic_intt_min_unit ); + c = ((a * obj->last_ratio)/dynamic_intt_min_unit) + b; + if(c > obj->c_gain_h) + c_gain = obj->c_gain_h; + else if (c < obj->c_gain_l) + c_gain = obj->c_gain_l; + else + c_gain = c; + } + } + else if(epl_sensor.als.lsrc_type == CMC_BIT_LSRC_SLOPE) + { + if (luxratio >= obj->lsource_thd_high) //fluorescent (C1) + { + c_gain = obj->c_gain_h; + } + else if (luxratio <= obj->lsource_thd_low) //incandescent (C2) + { + c_gain = obj->c_gain_l; + } + else{ /*mix*/ + int a = 0, b = 0, c = 0; + a = (obj->c_gain_h - obj->c_gain_l) * dynamic_intt_min_unit / (obj->lsource_thd_high - obj->lsource_thd_low); + b = (obj->c_gain_h) - ((a * obj->lsource_thd_high)/dynamic_intt_min_unit ); + c = ((a * luxratio)/dynamic_intt_min_unit) + b; + if(c > obj->c_gain_h) + c_gain = obj->c_gain_h; + else if (c < obj->c_gain_l) + c_gain = obj->c_gain_l; + else + c_gain = c; + } + } + LOG_INFO("[%s]:ch0=%d, ch1=%d, c_gain=%d, obj->ratio=%d, obj->last_ratio=%d \r\n\n", + __func__,epl_sensor.als.data.channels[0], als, c_gain, obj->ratio, obj->last_ratio); + } + else + { + LOG_INFO("[%s]: ALS saturation(%d) \r\n", __func__, (epl_sensor.als.saturation >> 5)); + } + } + +#if ALS_DEBUG + LOG_INFO("[%s]: dynamic_intt_idx=%d, als_dynamic_intt_value=%d, dynamic_intt_gain=%d, als=%d \r\n", + __func__, dynamic_intt_idx, als_dynamic_intt_value[dynamic_intt_idx], als_dynamic_intt_gain[dynamic_intt_idx], als); +#endif + + if(als > dynamic_intt_high_thr) + { + if(dynamic_intt_idx == (als_dynamic_intt_intt_num - 1)){ + als = dynamic_intt_high_thr; + lux_tmp = raw_convert_to_lux(als); +#if ALS_DEBUG + LOG_INFO(">>>>>>>>>>>>>>>>>>>>>>>> INTT_MAX_LUX\r\n"); +#endif + } + else{ + change_flag = true; + als = dynamic_intt_high_thr; + lux_tmp = raw_convert_to_lux(als); + dynamic_intt_idx++; +#if ALS_DEBUG + LOG_INFO(">>>>>>>>>>>>>>>>>>>>>>>>change INTT high: %d, raw: %d \r\n", dynamic_intt_idx, als); +#endif + } + } + else if(als < dynamic_intt_low_thr) + { + if(dynamic_intt_idx == 0){ + //als = dynamic_intt_low_thr; + lux_tmp = raw_convert_to_lux(als); +#if ALS_DEBUG + LOG_INFO(">>>>>>>>>>>>>>>>>>>>>>>> INTT_MIN_LUX\r\n"); +#endif + } + else{ + change_flag = true; + als = dynamic_intt_low_thr; + lux_tmp = raw_convert_to_lux(als); + dynamic_intt_idx--; +#if ALS_DEBUG + LOG_INFO(">>>>>>>>>>>>>>>>>>>>>>>>change INTT low: %d, raw: %d \r\n", dynamic_intt_idx, als); +#endif + } + } + else + { + lux_tmp = raw_convert_to_lux(als); + } + + now_lux = lux_tmp; + dynamic_intt_lux = now_lux/dynamic_intt_min_unit; + + epl_sensor_report_lux(dynamic_intt_lux); + + if(change_flag == true) + { + epl_sensor.als.integration_time = als_dynamic_intt_intt[dynamic_intt_idx]; + epl_sensor.als.gain = als_dynamic_intt_gain[dynamic_intt_idx]; + dynamic_intt_high_thr = als_dynamic_intt_high_thr[dynamic_intt_idx]; + dynamic_intt_low_thr = als_dynamic_intt_low_thr[dynamic_intt_idx]; + epl_sensor_update_mode(obj->client); + change_flag = false; + } + return dynamic_intt_lux; + + break; +#endif + + } + return 0; +} +/*----------------------------------------------------------------------------*/ + +int epl_sensor_read_als(struct i2c_client *client) +{ + struct epl_sensor_priv *epld = i2c_get_clientdata(client); + + if(client == NULL) + { + LOG_ERR("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + epl_sensor_I2C_Read(epld->client, 0x13, 4); +#if PS_DYN_K && PS_DYN_K_STR + if(dynk_enhance_flag == false) + { + dynk_enhance_ch0 = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + dynk_enhance_ch1 = (gRawData.raw_bytes[3]<<8) | gRawData.raw_bytes[2]; + + LOG_INFO("read dynk_enhance_ch0 = %d\n", dynk_enhance_ch0); + LOG_INFO("read dynk_enhance_ch1 = %d\n", dynk_enhance_ch1); + } + else +#endif + { + epl_sensor.als.data.channels[0] = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + epl_sensor.als.data.channels[1] = (gRawData.raw_bytes[3]<<8) | gRawData.raw_bytes[2]; + +#if ALS_DEBUG + LOG_INFO("read als channel 0 = %d\n", epl_sensor.als.data.channels[0]); + LOG_INFO("read als channel 1 = %d\n", epl_sensor.als.data.channels[1]); +#endif + } + + + if(epl_sensor.wait == EPL_WAIT_SINGLE) + epl_sensor_I2C_Write(epld->client,0x11, epl_sensor.power | epl_sensor.reset); + return 0; +} + +/*----------------------------------------------------------------------------*/ + +static void epl_sensor_report_ps_status(void) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + + LOG_INFO("------------------- epl_sensor.ps.data.data=%d, value=%d \n\n", epl_sensor.ps.data.data, epl_sensor.ps.compare_low >> 3); + + input_report_abs(epld->ps_input_dev, ABS_DISTANCE, epl_sensor.ps.compare_low >> 3); + input_sync(epld->ps_input_dev); +} + +int epl_sensor_read_ps(struct i2c_client *client) +{ + struct epl_sensor_priv *epld = i2c_get_clientdata(client); + if(client == NULL) + { + LOG_ERR("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + epl_sensor_I2C_Read(epld->client,0x1c, 4); + + epl_sensor.ps.data.ir_data = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + epl_sensor.ps.data.data = (gRawData.raw_bytes[3]<<8) | gRawData.raw_bytes[2]; + + LOG_INFO("[%s] data = %d\n", __FUNCTION__, epl_sensor.ps.data.data); + LOG_INFO("[%s] ir data = %d\n", __FUNCTION__, epl_sensor.ps.data.ir_data); + + if(epl_sensor.wait == EPL_WAIT_SINGLE) + epl_sensor_I2C_Write(epld->client, 0x11, epl_sensor.power | epl_sensor.reset); + + return 0; +} + +int epl_sensor_read_ps_status(struct i2c_client *client) +{ + u8 buf; +#if PS_GES + struct epl_sensor_priv *obj = epl_sensor_obj; + u8 new_ps_state; + u8 ges_saturation; + bool enable_ges = obj->enable_gflag==1 && obj->ges_suspend==0; +#endif + if(client == NULL) + { + LOG_ERR("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + epl_sensor_I2C_Read(client, 0x1b, 1); + + buf = gRawData.raw_bytes[0]; + +#if PS_GES + ges_saturation = (buf & 0x20); + new_ps_state = (buf & 0x08) >> 3; + LOG_INFO("[%s]:new_ps_state=%d, ps_ges_suspend_flag=%d \r\n", __func__, new_ps_state, ps_ges_suspend_flag); + if(enable_ges == 1 && epl_sensor.ges.polling_mode == 1) + { + if( new_ps_state == 0 && (epl_sensor.ps.compare_low>>3 == 1) && ps_ges_suspend_flag == false && ges_saturation == 0) + epl_sensor_notify_event(); + } + else if(enable_ges == 1 && epl_sensor.ges.polling_mode == 0 && ps_ges_suspend_flag == false && ges_saturation == 0) + { + if(new_ps_state == 0) + epl_sensor_notify_event(); + } +#endif + + epl_sensor.ps.saturation = (buf & 0x20); + epl_sensor.ps.compare_high = (buf & 0x10); + epl_sensor.ps.compare_low = (buf & 0x08); + epl_sensor.ps.interrupt_flag = (buf & 0x04); + epl_sensor.ps.compare_reset = (buf & 0x02); + epl_sensor.ps.lock= (buf & 0x01); +#if PS_DEBUG + LOG_INFO("ps: ~~~~ PS ~~~~~ \n"); + LOG_INFO("ps: buf = 0x%x\n", buf); + LOG_INFO("ps: sat = 0x%x\n", epl_sensor.ps.saturation); + LOG_INFO("ps: cmp h = 0x%x, l = 0x%x\n", epl_sensor.ps.compare_high, epl_sensor.ps.compare_low); + LOG_INFO("ps: int_flag = 0x%x\n",epl_sensor.ps.interrupt_flag); + LOG_INFO("ps: cmp_rstn = 0x%x, lock = %x\n", epl_sensor.ps.compare_reset, epl_sensor.ps.lock); +#endif + return 0; +} + +/*----------------------------------------------------------------------------*/ + +static int set_psensor_intr_threshold(uint16_t low_thd, uint16_t high_thd) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + struct i2c_client *client = epld->client; + uint8_t high_msb ,high_lsb, low_msb, low_lsb; + + + high_msb = (uint8_t) (high_thd >> 8); + high_lsb = (uint8_t) (high_thd & 0x00ff); + low_msb = (uint8_t) (low_thd >> 8); + low_lsb = (uint8_t) (low_thd & 0x00ff); + + LOG_INFO("%s: low_thd = %d, high_thd = %d \n",__FUNCTION__, low_thd, high_thd); + + epl_sensor_I2C_Write(client,0x0c,low_lsb); + epl_sensor_I2C_Write(client,0x0d,low_msb); + epl_sensor_I2C_Write(client,0x0e,high_lsb); + epl_sensor_I2C_Write(client,0x0f,high_msb); + + return 0; +} + +static int set_lsensor_intr_threshold(uint16_t low_thd, uint16_t high_thd) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + struct i2c_client *client = epld->client; + uint8_t high_msb ,high_lsb, low_msb, low_lsb; + + high_msb = (uint8_t) (high_thd >> 8); + high_lsb = (uint8_t) (high_thd & 0x00ff); + low_msb = (uint8_t) (low_thd >> 8); + low_lsb = (uint8_t) (low_thd & 0x00ff); + + epl_sensor_I2C_Write(client,0x08,low_lsb); + epl_sensor_I2C_Write(client,0x09,low_msb); + epl_sensor_I2C_Write(client,0x0a,high_lsb); + epl_sensor_I2C_Write(client,0x0b,high_msb); + + LOG_INFO("%s: low_thd = %d, high_thd = %d \n",__FUNCTION__, low_thd, high_thd); + + return 0; +} + +int epl_sensor_read_als_status(struct i2c_client *client) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + u8 buf; + + if(client == NULL) + { + LOG_ERR("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + epl_sensor_I2C_Read(epld->client, 0x12, 1); + + buf = gRawData.raw_bytes[0]; + + epl_sensor.als.saturation = (buf & 0x20); + epl_sensor.als.compare_high = (buf & 0x10); + epl_sensor.als.compare_low = (buf & 0x08); + epl_sensor.als.interrupt_flag = (buf & 0x04); + epl_sensor.als.compare_reset = (buf & 0x02); + epl_sensor.als.lock= (buf & 0x01); +#if ALS_DEBUG + LOG_INFO("als: ~~~~ ALS ~~~~~ \n"); + LOG_INFO("als: buf = 0x%x\n", buf); + LOG_INFO("als: sat = 0x%x\n", epl_sensor.als.saturation); + LOG_INFO("als: cmp h = 0x%x, l = 0x%x\n", epl_sensor.als.compare_high, epl_sensor.als.compare_low); + LOG_INFO("als: int_flag = 0x%x\n",epl_sensor.als.interrupt_flag); + LOG_INFO("als: cmp_rstn = 0x%x, lock = 0x%x\n", epl_sensor.als.compare_reset, epl_sensor.als.lock); +#endif + return 0; +} + +static int write_factory_calibration(struct epl_sensor_priv *epl_data, char* ps_data, int ps_cal_len) +{ + struct file *fp_cal; + + mm_segment_t fs; + loff_t pos; + + LOG_FUN(); + pos = 0; + + fp_cal = filp_open(ps_cal_file, O_CREAT|O_RDWR|O_TRUNC, 0755/*S_IRWXU*/); + if (IS_ERR(fp_cal)) + { + LOG_ERR("[ELAN]create file_h error\n"); + return -1; + } + + fs = get_fs(); + set_fs(KERNEL_DS); + + vfs_write(fp_cal, ps_data, ps_cal_len, &pos); + + filp_close(fp_cal, NULL); + + set_fs(fs); + + return 0; +} + +static bool read_factory_calibration(void) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + struct file *fp; + mm_segment_t fs; + loff_t pos; + char buffer[100]= {0}; + if(epl_sensor.ps.factory.calibration_enable && !epl_sensor.ps.factory.calibrated) + { + fp = filp_open(ps_cal_file, O_RDWR, S_IRUSR); + + if (IS_ERR(fp)) + { + LOG_ERR("NO PS calibration file(%d)\n", (int)IS_ERR(fp)); + epl_sensor.ps.factory.calibration_enable = false; + } + else + { + int ps_cancelation = 0, ps_hthr = 0, ps_lthr = 0; + pos = 0; + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_read(fp, buffer, sizeof(buffer), &pos); + filp_close(fp, NULL); + + sscanf(buffer, "%d,%d,%d", &ps_cancelation, &ps_hthr, &ps_lthr); + epl_sensor.ps.factory.cancelation = ps_cancelation; + epl_sensor.ps.factory.high_threshold = ps_hthr; + epl_sensor.ps.factory.low_threshold = ps_lthr; + set_fs(fs); + + epl_sensor.ps.high_threshold = epl_sensor.ps.factory.high_threshold; + epl_sensor.ps.low_threshold = epl_sensor.ps.factory.low_threshold; + epl_sensor.ps.cancelation = epl_sensor.ps.factory.cancelation; + } + + epl_sensor_I2C_Write(epld->client,0x22, (u8)(epl_sensor.ps.cancelation& 0xff)); + epl_sensor_I2C_Write(epld->client,0x23, (u8)((epl_sensor.ps.cancelation & 0xff00) >> 8)); + set_psensor_intr_threshold(epl_sensor.ps.low_threshold, epl_sensor.ps.high_threshold); + + epl_sensor.ps.factory.calibrated = true; + } + + if(epl_sensor.als.factory.calibration_enable && !epl_sensor.als.factory.calibrated) + { + fp = filp_open(als_cal_file, O_RDONLY, S_IRUSR); + if (IS_ERR(fp)) + { + LOG_ERR("NO ALS calibration file(%d)\n", (int)IS_ERR(fp)); + epl_sensor.als.factory.calibration_enable = false; + } + else + { + int als_lux_per_count = 0; + pos = 0; + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_read(fp, buffer, sizeof(buffer), &pos); + filp_close(fp, NULL); + + sscanf(buffer, "%d", &als_lux_per_count); + epl_sensor.als.factory.lux_per_count = als_lux_per_count; + set_fs(fs); + } + epl_sensor.als.factory.calibrated = true; + } + return true; +} + +static int epl_run_ps_calibration(struct epl_sensor_priv *epl_data) +{ + struct epl_sensor_priv *epld = epl_data; + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; + u16 ch1=0; + u32 ch1_all=0; + int count =5, i; + int ps_hthr=0, ps_lthr=0, ps_cancelation=0, ps_cal_len = 0; + char ps_calibration[20]; + + + if(PS_MAX_XTALK < 0) + { + LOG_ERR("[%s]:Failed: PS_MAX_XTALK < 0 \r\n", __func__); + return -EINVAL; + } + + if(enable_ps == 0) + { + epld->enable_pflag = 1; + epl_sensor_update_mode(epld->client); + } + + polling_flag = false; + + for(i=0; iclient); + ch1 = epl_sensor.ps.data.data; + break; + } + + ch1_all = ch1_all + ch1; + if(epl_sensor.wait == EPL_WAIT_SINGLE) + epl_sensor_I2C_Write(epld->client,0x11, epl_sensor.power | epl_sensor.reset); + } + + + ch1 = (u16)(ch1_all/count); + + if(ch1 > PS_MAX_XTALK) + { + LOG_ERR("[%s]:Failed: ch1 > max_xtalk(%d) \r\n", __func__, ch1); + return -EINVAL; + } + else if(ch1 <= 0) + { + LOG_ERR("[%s]:Failed: ch1 = 0\r\n", __func__); + return -EINVAL; + } + + ps_hthr = ch1 + PS_h_offset; + ps_lthr = ch1 + PS_l_offset; + + ps_cal_len = sprintf(ps_calibration, "%d,%d,%d", ps_cancelation, ps_hthr, ps_lthr); + + if(write_factory_calibration(epld, ps_calibration, ps_cal_len) < 0) + { + LOG_ERR("[%s] create file error \n", __func__); + return -EINVAL; + } + + epl_sensor.ps.low_threshold = ps_lthr; + epl_sensor.ps.high_threshold = ps_hthr; + set_psensor_intr_threshold(epl_sensor.ps.low_threshold, epl_sensor.ps.high_threshold); + + LOG_INFO("[%s]: ch1 = %d\n", __func__, ch1); + + polling_flag = true; + epl_sensor_restart_polling(); + return ch1; +} + +/* +//====================write global variable===============// +*/ +static void write_global_variable(struct i2c_client *client) +{ + u8 buf; +#if HS_ENABLE + struct epl_sensor_priv *obj = epl_sensor_obj; + bool enable_hs = obj->enable_hflag==1 && obj->hs_suspend==0; +#endif +#if PS_GES + bool enable_ges = obj->enable_gflag==1 && obj->ges_suspend==0; +#endif + //wake up chip + buf = epl_sensor.reset | epl_sensor.power; + epl_sensor_I2C_Write(client,0x11, buf); + + /* read revno*/ + epl_sensor_I2C_Read(client, 0x20, 2); + epl_sensor.revno = gRawData.raw_bytes[0] | gRawData.raw_bytes[1] << 8; + + /*chip refrash*/ + epl_sensor_I2C_Write(client, 0xfd, 0x8e); + epl_sensor_I2C_Write(client, 0xfe, 0x22); + epl_sensor_I2C_Write(client, 0xfe, 0x02); + epl_sensor_I2C_Write(client, 0xfd, 0x00); + + epl_sensor_I2C_Write(client, 0xfc, EPL_A_D | EPL_NORMAL| EPL_GFIN_ENABLE | EPL_VOS_ENABLE | EPL_DOC_ON); + +#if HS_ENABLE + if(enable_hs) + { + epl_sensor.mode = EPL_MODE_PS; + epl_sensor_I2C_Write(obj->client, 0x00, epl_sensor.wait | EPL_MODE_IDLE); + + /*hs setting*/ + buf = epl_sensor.hs.integration_time | epl_sensor.hs.gain; + epl_sensor_I2C_Write(client, 0x03, buf); + + buf = epl_sensor.hs.adc | epl_sensor.hs.cycle; + epl_sensor_I2C_Write(client, 0x04, buf); + + buf = epl_sensor.hs.ir_on_control | epl_sensor.hs.ir_mode | epl_sensor.hs.ir_driver; + epl_sensor_I2C_Write(client, 0x05, buf); + + buf = epl_sensor.hs.compare_reset | epl_sensor.hs.lock; + + epl_sensor_I2C_Write(client, 0x1b, buf); + } +#if !PS_GES /*PS_GES*/ + else +#elif PS_GES + else if(enable_ges) +#endif /*PS_GES*/ +#endif + +#if PS_GES + +#if !HS_ENABLE /*HS_ENABLE*/ + if(enable_ges) +#endif /*HS_ENABLE*/ + { + /*ges setting*/ + buf = epl_sensor.ges.integration_time | epl_sensor.ges.gain; + epl_sensor_I2C_Write(client, 0x03, buf); + + buf = epl_sensor.ges.adc | epl_sensor.ges.cycle; + epl_sensor_I2C_Write(client, 0x04, buf); + + buf = epl_sensor.ges.ir_on_control | epl_sensor.ges.ir_mode | epl_sensor.ges.ir_drive; + epl_sensor_I2C_Write(client, 0x05, buf); + + buf = epl_sensor.interrupt_control | epl_sensor.ges.persist |epl_sensor.ges.interrupt_type; + epl_sensor_I2C_Write(client, 0x06, buf); + + buf = epl_sensor.ges.compare_reset | epl_sensor.ges.lock; + epl_sensor_I2C_Write(client, 0x1b, buf); + + epl_sensor_I2C_Write(client, 0x22, (u8)(epl_sensor.ges.cancelation& 0xff)); + epl_sensor_I2C_Write(client, 0x23, (u8)((epl_sensor.ges.cancelation & 0xff00) >> 8)); + set_psensor_intr_threshold(epl_sensor.ges.low_threshold, epl_sensor.ges.high_threshold); + } + else +#endif + { + /*ps setting*/ + buf = epl_sensor.ps.integration_time | epl_sensor.ps.gain; + epl_sensor_I2C_Write(client,0x03, buf); + + buf = epl_sensor.ps.adc | epl_sensor.ps.cycle; + epl_sensor_I2C_Write(client,0x04, buf); + + buf = epl_sensor.ps.ir_on_control | epl_sensor.ps.ir_mode | epl_sensor.ps.ir_drive; + epl_sensor_I2C_Write(client,0x05, buf); + + buf = epl_sensor.interrupt_control | epl_sensor.ps.persist |epl_sensor.ps.interrupt_type; + epl_sensor_I2C_Write(client,0x06, buf); + + buf = epl_sensor.ps.compare_reset | epl_sensor.ps.lock; + epl_sensor_I2C_Write(client,0x1b, buf); + + epl_sensor_I2C_Write(client,0x22, (u8)(epl_sensor.ps.cancelation& 0xff)); + epl_sensor_I2C_Write(client,0x23, (u8)((epl_sensor.ps.cancelation & 0xff0) >> 8)); + set_psensor_intr_threshold(epl_sensor.ps.low_threshold, epl_sensor.ps.high_threshold); + + /*als setting*/ + buf = epl_sensor.als.integration_time | epl_sensor.als.gain; + epl_sensor_I2C_Write(client,0x01, buf); + + buf = epl_sensor.als.adc | epl_sensor.als.cycle; + epl_sensor_I2C_Write(client,0x02, buf); + + buf = epl_sensor.als.interrupt_channel_select | epl_sensor.als.persist | epl_sensor.als.interrupt_type; + epl_sensor_I2C_Write(client,0x07, buf); + + buf = epl_sensor.als.compare_reset | epl_sensor.als.lock; + epl_sensor_I2C_Write(client,0x12, buf); + + set_lsensor_intr_threshold(epl_sensor.als.low_threshold, epl_sensor.als.high_threshold); + } + //set mode and wait + buf = epl_sensor.wait | epl_sensor.mode; + epl_sensor_I2C_Write(client,0x00, buf); +} + +static void set_als_ps_intr_type(struct i2c_client *client, bool ps_polling, bool als_polling) +{ + + //set als / ps interrupt control mode and trigger type + switch((ps_polling << 1) | als_polling) + { + case 0: // ps and als interrupt + epl_sensor.interrupt_control = EPL_INT_CTRL_ALS_OR_PS; + epl_sensor.als.interrupt_type = EPL_INTTY_ACTIVE; + epl_sensor.ps.interrupt_type = EPL_INTTY_ACTIVE; + break; + + case 1: //ps interrupt and als polling + epl_sensor.interrupt_control = EPL_INT_CTRL_PS; + epl_sensor.als.interrupt_type = EPL_INTTY_DISABLE; + epl_sensor.ps.interrupt_type = EPL_INTTY_ACTIVE; + break; + + case 2: // ps polling and als interrupt + epl_sensor.interrupt_control = EPL_INT_CTRL_ALS; + epl_sensor.als.interrupt_type = EPL_INTTY_ACTIVE; + epl_sensor.ps.interrupt_type = EPL_INTTY_DISABLE; + break; + + case 3: //ps and als polling + epl_sensor.interrupt_control = EPL_INT_CTRL_ALS_OR_PS; + epl_sensor.als.interrupt_type = EPL_INTTY_DISABLE; + epl_sensor.ps.interrupt_type = EPL_INTTY_DISABLE; + break; + } +} + +//====================initial global variable===============// +static void initial_global_variable(struct i2c_client *client, struct epl_sensor_priv *obj) +{ + + //general setting + epl_sensor.power = EPL_POWER_ON; + epl_sensor.reset = EPL_RESETN_RUN; + epl_sensor.mode = EPL_MODE_IDLE; + epl_sensor.wait = EPL_WAIT_20_MS; + epl_sensor.osc_sel = EPL_OSC_SEL_1MHZ; + + //als setting + epl_sensor.als.polling_mode = ALS_POLLING_MODE; + epl_sensor.als.integration_time = EPL_ALS_INTT_64; + epl_sensor.als.gain = EPL_GAIN_MID; + epl_sensor.als.adc = EPL_PSALS_ADC_13; + epl_sensor.als.cycle = EPL_CYCLE_16; + epl_sensor.als.interrupt_channel_select = EPL_ALS_INT_CHSEL_1; + epl_sensor.als.persist = EPL_PERIST_1; + epl_sensor.als.compare_reset = EPL_CMP_RESET; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor.als.report_type = CMC_BIT_RAW; //CMC_BIT_DYN_INT + epl_sensor.als.high_threshold = ALS_HIGH_THRESHOLD; + epl_sensor.als.low_threshold = ALS_LOW_THRESHOLD; + //als factory + epl_sensor.als.factory.calibration_enable = false; + epl_sensor.als.factory.calibrated = false; + epl_sensor.als.factory.lux_per_count = LUX_PER_COUNT; + +#if ALS_DYN_INTT + + epl_sensor.als.lsrc_type = CMC_BIT_LSRC_NON; + + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + dynamic_intt_idx = dynamic_intt_init_idx; + epl_sensor.als.integration_time = als_dynamic_intt_intt[dynamic_intt_idx]; + epl_sensor.als.gain = als_dynamic_intt_gain[dynamic_intt_idx]; + dynamic_intt_high_thr = als_dynamic_intt_high_thr[dynamic_intt_idx]; + dynamic_intt_low_thr = als_dynamic_intt_low_thr[dynamic_intt_idx]; + } + + c_gain = 21000; // 21000/1000=21 + + obj->lsource_thd_high = 1900; //different light source boundary (N) (1.9) + obj->lsource_thd_low = 1500; //1.5 + obj->c_gain_h = 21000; //fluorescent (C1) (21) + obj->c_gain_l = 15000; //incandescent (C2) (15) + +#endif + //ps setting + epl_sensor.ps.polling_mode = PS_POLLING_MODE; + epl_sensor.ps.integration_time = EPL_PS_INTT_80; + epl_sensor.ps.gain = EPL_GAIN_MID; +#if PS_DYN_K + dynk_min_ps_raw_data = 0xffff; //min raw data + dynk_max_ir_data = 50000; //max ch0 + dynk_low_offset = 500; //low thd offset + dynk_high_offset = 800; //high thd offset + dynk_change_thd_max = 30000; //change thd condition + dynk_thd_offset = 500; //change thd offset +#if PS_DYN_K_STR + dynk_enhance_max_ch0 = 50000; //enhance max ch0 + dynk_enhance_integration_time = EPL_ALS_INTT_64; + dynk_enhance_gain = EPL_GAIN_LOW; + dynk_enhance_adc = EPL_PSALS_ADC_12; +#endif +#endif + epl_sensor.ps.adc = EPL_PSALS_ADC_12; + epl_sensor.ps.cycle = EPL_CYCLE_32; + epl_sensor.ps.persist = EPL_PERIST_1; + epl_sensor.ps.ir_on_control = EPL_IR_ON_CTRL_ON; + epl_sensor.ps.ir_mode = EPL_IR_MODE_CURRENT; + epl_sensor.ps.ir_drive = EPL_IR_DRIVE_100; + epl_sensor.ps.compare_reset = EPL_CMP_RESET; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor.ps.high_threshold = PS_HIGH_THRESHOLD; + epl_sensor.ps.low_threshold = PS_LOW_THRESHOLD; + //ps factory + epl_sensor.ps.factory.calibration_enable = false; + epl_sensor.ps.factory.calibrated = false; + epl_sensor.ps.factory.cancelation= 0; + +#if HS_ENABLE + //hs setting + epl_sensor.hs.integration_time = EPL_PS_INTT_80; + epl_sensor.hs.integration_time_max = EPL_PS_INTT_272; + epl_sensor.hs.integration_time_min = EPL_PS_INTT_32; + epl_sensor.hs.gain = EPL_GAIN_LOW; + epl_sensor.hs.adc = EPL_PSALS_ADC_11; + epl_sensor.hs.cycle = EPL_CYCLE_4; + epl_sensor.hs.ir_on_control = EPL_IR_ON_CTRL_ON; + epl_sensor.hs.ir_mode = EPL_IR_MODE_CURRENT; + epl_sensor.hs.ir_driver = EPL_IR_DRIVE_200; + epl_sensor.hs.compare_reset = EPL_CMP_RESET; + epl_sensor.hs.lock = EPL_UN_LOCK; + epl_sensor.hs.low_threshold = 6400; + epl_sensor.hs.mid_threshold = 25600; + epl_sensor.hs.high_threshold = 60800; +#endif + +#if PS_GES + //ps setting + epl_sensor.ges.polling_mode = PS_POLLING_MODE; + epl_sensor.ges.integration_time = EPL_PS_INTT_80; + epl_sensor.ges.gain = EPL_GAIN_LOW; + epl_sensor.ges.adc = EPL_PSALS_ADC_12; + epl_sensor.ges.cycle = EPL_CYCLE_2; + epl_sensor.ges.persist = EPL_PERIST_1; + epl_sensor.ges.ir_on_control = EPL_IR_ON_CTRL_ON; + epl_sensor.ges.ir_mode = EPL_IR_MODE_CURRENT; + epl_sensor.ges.ir_drive = EPL_IR_DRIVE_200; + epl_sensor.ges.compare_reset = EPL_CMP_RESET; + epl_sensor.ges.lock = EPL_UN_LOCK; + epl_sensor.ges.high_threshold = ges_threshold_high; + epl_sensor.ges.low_threshold = ges_threshold_low; +#endif + + set_als_ps_intr_type(client, epl_sensor.ps.polling_mode, epl_sensor.als.polling_mode); + //write setting to sensor + write_global_variable(client); +} + +#if HS_ENABLE +int epl_sensor_read_hs(struct i2c_client *client) +{ + u8 buf; + + if(client == NULL) + { + LOG_ERR("CLIENT CANN'T EQUL NULL\n"); + return -1; + } + + mutex_lock(&hs_sensor_mutex); + epl_sensor_I2C_Read(client,0x1e, 2); + epl_sensor.hs.raw = (gRawData.raw_bytes[1]<<8) | gRawData.raw_bytes[0]; + LOG_INFO("epl_sensor.hs.raw=%d \r\n", epl_sensor.hs.raw); + if(epl_sensor.hs.dynamic_intt == true && epl_sensor.hs.raw>epl_sensor.hs.high_threshold && epl_sensor.hs.integration_time > epl_sensor.hs.integration_time_min) + { + epl_sensor.hs.integration_time -= 4; + buf = epl_sensor.hs.integration_time | epl_sensor.hs.gain; + epl_sensor_I2C_Write(client, 0x03, buf); + } + else if(epl_sensor.hs.dynamic_intt == true && epl_sensor.hs.raw>epl_sensor.hs.low_threshold && epl_sensor.hs.raw 65534) + dynk_thd_low = 65534; + if(dynk_thd_high>65535) + dynk_thd_high = 65535; +#if PS_DEBUG + LOG_INFO("[%s]:restart dynk ps raw = %d, min = %d, ir_data = %d\n", __func__, epl_sensor.ps.data.data, dynk_min_ps_raw_data, epl_sensor.ps.data.ir_data); + LOG_INFO("[%s]:restart dynk thre_l = %ld, thre_h = %ld\n", __func__, (long)dynk_thd_low, (long)dynk_thd_high); +#endif + eint_flag = false; + set_psensor_intr_threshold((u16)dynk_thd_low, (u16)dynk_thd_high); + eint_flag = true; + } + else if(last_status==1 && now_status==0) + { + dynk_change_flag = true; + } +} +#if PS_DYN_K_STR +void epl_sensor_enhance_enable(struct i2c_client *client, bool enable) +{ + bool cmp_flag = false; + u8 buf, now_cmp_l; + int enh_time=0, ps_time=0, total_time=0; + ps_time = ps_sensing_time(epl_sensor.ps.integration_time, epl_sensor.ps.adc, epl_sensor.ps.cycle); + + + //mutex_lock(&sensor_mutex); + polling_flag = false; + + + epl_sensor_I2C_Read(client, 0x1b, 1); + buf = gRawData.raw_bytes[0]; + epl_sensor.ps.compare_high = (buf & 0x10); + now_cmp_l = (buf & 0x08); + + if(now_cmp_l != epl_sensor.ps.compare_low) + { + LOG_INFO("[%s]: buf=0x%x, now_cmp_l=0x%x, epl_sensor.ps.compare_low=0x%x \r\n", __func__, buf, now_cmp_l, epl_sensor.ps.compare_low); + //PS unlock and reset + epl_sensor.ps.compare_reset = EPL_CMP_RESET; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(client, 0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + + cmp_flag = true; + } + + epl_sensor.ps.interrupt_flag = EPL_INT_CLEAR; + epl_sensor.als.interrupt_flag = EPL_INT_CLEAR; + + epl_sensor_I2C_Write(client, 0x00, epl_sensor.wait | EPL_MODE_IDLE); + + if(enable == true){ + enh_time = als_sensing_time(dynk_enhance_integration_time, dynk_enhance_adc, epl_sensor.als.cycle) / 2; + epl_sensor_I2C_Write(client, 0x01, dynk_enhance_integration_time | dynk_enhance_gain); + epl_sensor_I2C_Write(client, 0x02, dynk_enhance_adc | epl_sensor.als.cycle); + epl_sensor_I2C_Write(client, 0xfc, EPL_A_D | EPL_NORMAL| EPL_GFIN_ENABLE | EPL_VOS_ENABLE | EPL_DOC_OFF); + } + else + { + enh_time = als_sensing_time(epl_sensor.als.integration_time, epl_sensor.als.adc, epl_sensor.als.cycle); + epl_sensor_I2C_Write(client, 0x01, epl_sensor.als.integration_time | epl_sensor.als.gain); + epl_sensor_I2C_Write(client, 0x02, epl_sensor.als.adc | epl_sensor.als.cycle); + epl_sensor_I2C_Write(client, 0xfc, EPL_A_D | EPL_NORMAL| EPL_GFIN_ENABLE | EPL_VOS_ENABLE | EPL_DOC_ON); + } + + als_frame_time = enh_time; + ps_frame_time = ps_time; + + epl_sensor_I2C_Write(client, 0x00, epl_sensor.wait | epl_sensor.mode); + if(cmp_flag == true) + { + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(client, 0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + + cmp_flag = false; + } + //mutex_unlock(&sensor_mutex); + + total_time = ps_time+enh_time+wait_value[epl_sensor.wait>>4]; + if((2*total_time) >= dynk_polling_delay) + { + dynk_polling_delay = 2*total_time+50; + LOG_INFO("[%s]: dynk_polling_delay=%d \r\n", __func__, dynk_polling_delay); + } + + msleep(total_time); + LOG_INFO("[%s] PS+ALS(%dms)\r\n", __func__, total_time); + + //mutex_lock(&sensor_mutex); + if(enable == true) + { + epl_sensor_read_als(client); + } + + if(epl_sensor.ps.interrupt_flag == EPL_INT_TRIGGER) + { + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(client, 0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + } + polling_flag = true; + //mutex_unlock(&sensor_mutex); + +} +#endif + +void epl_sensor_restart_dynk_polling(void) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + cancel_delayed_work(&dynk_thd_polling_work); + queue_delayed_work(epld->epl_wq, &dynk_thd_polling_work,msecs_to_jiffies(dynk_polling_delay)); +} + +void epl_sensor_dynk_thd_polling_work(struct work_struct *work) +{ + struct epl_sensor_priv *obj = epl_sensor_obj; + + bool enable_ps = obj->enable_pflag==1 && obj->ps_suspend==0; +#if PS_DEBUG + bool enable_als = obj->enable_lflag==1 && obj->als_suspend==0; + LOG_INFO("[%s]:als / ps enable: %d / %d\n", __func__,enable_als, enable_ps); +#endif + + if(enable_ps == true) + { +#if PS_DYN_K_STR + dynk_enhance_flag = false; + if(polling_flag == true && eint_flag == true) + { + epl_sensor_enhance_enable(obj->client, true); + } +#endif + if(polling_flag == true && eint_flag == true && epl_sensor.ps.polling_mode == 0) + { + mutex_lock(&sensor_mutex); + epl_sensor_read_ps_status(obj->client); + epl_sensor_read_ps(obj->client); + mutex_unlock(&sensor_mutex); + } +#if PS_DYN_K_STR + if( (dynk_min_ps_raw_data > epl_sensor.ps.data.data) + && (epl_sensor.ps.saturation == 0) + && (epl_sensor.ps.data.ir_data < dynk_max_ir_data) + && (dynk_enhance_ch0 < dynk_enhance_max_ch0) ) +#else + if( (dynk_min_ps_raw_data > epl_sensor.ps.data.data) + && (epl_sensor.ps.saturation == 0) + && (epl_sensor.ps.data.ir_data < dynk_max_ir_data) ) +#endif + { + dynk_min_ps_raw_data = epl_sensor.ps.data.data; + dynk_thd_low = dynk_min_ps_raw_data + dynk_low_offset; + dynk_thd_high = dynk_min_ps_raw_data + dynk_high_offset; + + if(dynk_thd_low>65534) + dynk_thd_low = 65534; + if(dynk_thd_high>65535) + dynk_thd_high = 65535; +#if PS_DEBUG + LOG_INFO("[%s]:dyn ps raw = %d, min = %d, ir_data = %d\n", __func__, epl_sensor.ps.data.data, dynk_min_ps_raw_data, epl_sensor.ps.data.ir_data); +#endif + eint_flag = false; + mutex_lock(&sensor_mutex); + set_psensor_intr_threshold((u16)dynk_thd_low, (u16)dynk_thd_high); + mutex_unlock(&sensor_mutex); + eint_flag = true; +#if PS_DEBUG + LOG_INFO("[%s]:dyn k thre_l = %ld, thre_h = %ld\n", __func__, (long)dynk_thd_low, (long)dynk_thd_high); +#endif + } + else if(dynk_change_flag==true && (epl_sensor.ps.data.data>dynk_change_thd_max) && ( (epl_sensor.ps.compare_low >> 3)==0 )) + { + dynk_change_flag = false; + dynk_thd_low += dynk_thd_offset; + dynk_thd_high += dynk_thd_offset; + + if(dynk_thd_low>65534) + dynk_thd_low = 65534; + if(dynk_thd_high>65535) + dynk_thd_high = 65535; + + eint_flag = false; + mutex_lock(&sensor_mutex); + set_psensor_intr_threshold((u16)dynk_thd_low, (u16)dynk_thd_high); + mutex_unlock(&sensor_mutex); + eint_flag = true; +#if PS_DEBUG + LOG_INFO("[%s]: epl_sensor.ps.data.data=%d, L/H=%ld/%ld \r\n", __func__, epl_sensor.ps.data.data, (long)dynk_thd_low, (long)dynk_thd_high); +#endif + } +#if PS_DYN_K_STR + if(polling_flag == true && eint_flag == true) + { + epl_sensor_enhance_enable(obj->client, false); + } + dynk_enhance_flag = true; +#endif + queue_delayed_work(obj->epl_wq, &dynk_thd_polling_work,msecs_to_jiffies(dynk_polling_delay)); + } +} +#endif + +/************************************************************************/ +//for 3637 +static int als_sensing_time(int intt, int adc, int cycle) +{ + long sensing_us_time; + int sensing_ms_time; + int als_intt, als_adc, als_cycle; + + als_intt = als_intt_value[intt>>2]; + als_adc = adc_value[adc>>3]; + als_cycle = cycle_value[cycle]; +#if COMMON_DEBUG + LOG_INFO("ALS: INTT=%d, ADC=%d, Cycle=%d \r\n", als_intt, als_adc, als_cycle); +#endif + + sensing_us_time = (als_intt + als_adc*2*2) * 2 * als_cycle; + sensing_ms_time = sensing_us_time / 1000; + +#if COMMON_DEBUG + LOG_INFO("[%s]: sensing=%d ms \r\n", __func__, sensing_ms_time); +#endif + return (sensing_ms_time + 5); +} + +static int ps_sensing_time(int intt, int adc, int cycle) +{ + long sensing_us_time; + int sensing_ms_time; + int ps_intt, ps_adc, ps_cycle; + + ps_intt = ps_intt_value[intt>>2]; + ps_adc = adc_value[adc>>3]; + ps_cycle = cycle_value[cycle]; +#if COMMON_DEBUG + LOG_INFO("PS: INTT=%d, ADC=%d, Cycle=%d \r\n", ps_intt, ps_adc, ps_cycle); +#endif + + sensing_us_time = (ps_intt*3 + ps_adc*2*3) * ps_cycle; + sensing_ms_time = sensing_us_time / 1000; +#if COMMON_DEBUG + LOG_INFO("[%s]: sensing=%d ms\r\n", __func__, sensing_ms_time); +#endif + + + return (sensing_ms_time + 5); +} + +static int epl_sensor_get_wait_time(int ps_time, int als_time) +{ + int wait_idx = 0; + int wait_time = 0; + + wait_time = als_time - ps_time; + if(wait_time < 0){ + wait_time = 0; + } +#if COMMON_DEBUG + LOG_INFO("[%s]: wait_len = %d \r\n", __func__, wait_len); +#endif + for(wait_idx = 0; wait_idx < wait_len; wait_idx++) + { + if(wait_time < wait_value[wait_idx]) + { + break; + } + } + if(wait_idx >= wait_len){ + wait_idx = wait_len - 1; + } + +#if COMMON_DEBUG + LOG_INFO("[%s]: wait_idx = %d, wait = %dms \r\n", __func__, wait_idx, wait_value[wait_idx]); +#endif + return (wait_idx << 4); +} +/************************************************************************/ + +void epl_sensor_update_mode(struct i2c_client *client) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int als_time = 0, ps_time = 0; + + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; + bool enable_als = epld->enable_lflag==1 && epld->als_suspend==0; +#if HS_ENABLE + bool enable_hs = epld->enable_hflag==1 && epld->hs_suspend==0; +#endif +#if PS_GES + bool enable_ges = epld->enable_gflag==1 && epld->ges_suspend==0; +#endif + polling_flag = false; + als_time = als_sensing_time(epl_sensor.als.integration_time, epl_sensor.als.adc, epl_sensor.als.cycle); + ps_time = ps_sensing_time(epl_sensor.ps.integration_time, epl_sensor.ps.adc, epl_sensor.ps.cycle); + + als_frame_time = als_time; + ps_frame_time = ps_time; + +#if HS_ENABLE + if(enable_hs) + { + LOG_INFO("[%s]: HS mode \r\n", __func__); + epl_sensor_restart_polling(); + } + else +#endif + { + //PS unlock and reset + epl_sensor.ps.compare_reset = EPL_CMP_RESET; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client, 0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + + //ALS unlock and reset + epl_sensor.als.compare_reset = EPL_CMP_RESET; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client, 0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + + + //epl_sensor_I2C_Write(epld->client, 0x11, EPL_RESETN_RESET | EPL_POWER_OFF); + epl_sensor.ps.interrupt_flag = EPL_INT_CLEAR; + epl_sensor.als.interrupt_flag = EPL_INT_CLEAR; + +#if PS_GES + LOG_INFO("mode selection =0x%x\n", (enable_ps|enable_ges) | (enable_als << 1)); +#else + LOG_INFO("mode selection =0x%x\n", enable_ps | (enable_als << 1)); +#endif + +#if PS_GES + //**** mode selection **** + switch((enable_als << 1) | (enable_ps|enable_ges)) +#else + //**** mode selection **** + switch((enable_als << 1) | enable_ps) +#endif + { + case 0: //disable all + epl_sensor.mode = EPL_MODE_IDLE; + break; + + case 1: //als = 0, ps = 1 +#if PS_DYN_K && PS_DYN_K_STR + epl_sensor.mode = EPL_MODE_ALS_PS; +#else + epl_sensor.mode = EPL_MODE_PS; +#endif + break; + + case 2: //als = 1, ps = 0 + epl_sensor.mode = EPL_MODE_ALS; + break; + + case 3: //als = 1, ps = 1 + epl_sensor.mode = EPL_MODE_ALS_PS; + break; + } + + //**** write setting **** + // step 1. set sensor at idle mode + // step 2. set sensor at operation mode + // step 3. delay sensing time + // step 4. unlock and run als / ps status + epl_sensor_I2C_Write(epld->client, 0x00, epl_sensor.wait | EPL_MODE_IDLE); + // initial factory calibration variable + read_factory_calibration(); + + epl_sensor_I2C_Write(epld->client, 0x02, epl_sensor.als.adc | epl_sensor.als.cycle); + set_als_ps_intr_type(epld->client, epl_sensor.ps.polling_mode, epl_sensor.als.polling_mode); + + epl_sensor_I2C_Write(epld->client, 0x06, epl_sensor.interrupt_control | epl_sensor.ps.persist |epl_sensor.ps.interrupt_type); + + epl_sensor_I2C_Write(epld->client, 0x07, epl_sensor.als.interrupt_channel_select | epl_sensor.als.persist | epl_sensor.als.interrupt_type); + +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT){ + epl_sensor_I2C_Write(client, 0x01, epl_sensor.als.integration_time | epl_sensor.als.gain); + } +#endif + + if(epl_sensor.mode == EPL_MODE_ALS_PS && epl_sensor.als.polling_mode == 0 && epl_sensor.ps.polling_mode == 0){ + int wait = 0; + wait = epl_sensor_get_wait_time(ps_time, als_time); + epl_sensor_I2C_Write(epld->client, 0x00, wait | epl_sensor.mode); + } + else{ +#if PS_GES + if(enable_ges == 1 && enable_ps == 0) + { + set_psensor_intr_threshold(epl_sensor.ges.low_threshold, epl_sensor.ges.high_threshold); + epl_sensor_I2C_Write(client, 0x00, EPL_WAIT_2_MS | epl_sensor.mode); + } + else +#endif + epl_sensor_I2C_Write(epld->client, 0x00, epl_sensor.wait | epl_sensor.mode); + } + + //ALS unlock and run + epl_sensor.als.compare_reset = EPL_CMP_RUN; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client, 0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client, 0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + + //epl_sensor_I2C_Write(epld->client, 0x11, epl_sensor.reset | epl_sensor.power); + +#if COMMON_DEBUG + //**** check setting **** + if(enable_ps == 1) + { + LOG_INFO("[%s] PS:low_thd = %d, high_thd = %d \n",__func__, epl_sensor.ps.low_threshold, epl_sensor.ps.high_threshold); + } + + if(enable_als == 1 && epl_sensor.als.polling_mode == 0) + { + LOG_INFO("[%s] ALS:low_thd = %d, high_thd = %d \n",__func__, epl_sensor.als.low_threshold, epl_sensor.als.high_threshold); + } +#if PS_GES + if(enable_ges) + { + LOG_INFO("[%s] GES:low_thd = %d, high_thd = %d \n",__func__, epl_sensor.ges.low_threshold, epl_sensor.ges.high_threshold); + + } +#endif + + LOG_INFO("[%s] reg0x00= 0x%x \n", __func__, epl_sensor.wait | epl_sensor.mode); + LOG_INFO("[%s] reg0x07= 0x%x \n", __func__, epl_sensor.als.interrupt_channel_select | epl_sensor.als.persist | epl_sensor.als.interrupt_type); + LOG_INFO("[%s] reg0x06= 0x%x \n", __func__, epl_sensor.interrupt_control | epl_sensor.ps.persist |epl_sensor.ps.interrupt_type); + LOG_INFO("[%s] reg0x11= 0x%x \n", __func__, epl_sensor.power | epl_sensor.reset); + LOG_INFO("[%s] reg0x12= 0x%x \n", __func__, epl_sensor.als.compare_reset | epl_sensor.als.lock); + LOG_INFO("[%s] reg0x1b= 0x%x \n", __func__, epl_sensor.ps.compare_reset | epl_sensor.ps.lock); +#endif + + if(epl_sensor.mode == EPL_MODE_PS) + { + msleep(ps_time); + LOG_INFO("[%s] PS only(%dms)\r\n", __func__, ps_time); + } + else if (epl_sensor.mode == EPL_MODE_ALS) + { + msleep(als_time); + LOG_INFO("[%s] ALS only(%dms)\r\n", __func__, als_time); + } + else if (epl_sensor.mode == EPL_MODE_ALS_PS) + { + msleep(ps_time+als_time+wait_value[epl_sensor.wait>>4]); + LOG_INFO("[%s] PS+ALS(%dms)\r\n", __func__, ps_time+als_time+wait_value[epl_sensor.wait>>4]); + } + + if(epl_sensor.ps.interrupt_flag == EPL_INT_TRIGGER) + { + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client, 0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + } + + if(epl_sensor.als.interrupt_flag == EPL_INT_TRIGGER) + { + //ALS unlock and run + epl_sensor.als.compare_reset = EPL_CMP_RUN; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client, 0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + } + +#if PS_GES + if((enable_als==1 && epl_sensor.als.polling_mode==1) || (enable_ps==1 && epl_sensor.ps.polling_mode==1) || (enable_ges == 1 && epl_sensor.ges.polling_mode==1)) +#else + if((enable_als==1 && epl_sensor.als.polling_mode==1) || (enable_ps==1 && epl_sensor.ps.polling_mode==1)) +#endif + { + epl_sensor_restart_polling(); + } + +#if PS_DYN_K + if(enable_ps == 1) + { + epl_sensor_restart_dynk_polling(); + } +#endif + } + polling_flag = true; + +} + +/*----------------------------------------------------------------------------*/ +static void epl_sensor_polling_work(struct work_struct *work) +{ + + struct epl_sensor_priv *epld = epl_sensor_obj; + struct i2c_client *client = epld->client; + + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; + bool enable_als = epld->enable_lflag==1 && epld->als_suspend==0; +#if HS_ENABLE + bool enable_hs = epld->enable_hflag==1 && epld->hs_suspend==0; + +#endif +#if PS_GES + bool enable_ges = epld->enable_gflag==1 && epld->ges_suspend==0; +#endif + +#if COMMON_DEBUG +#if HS_ENABLE && PS_GES + LOG_INFO("enable_pflag=%d, enable_lflag=%d, enable_hs=%d, enable_ges=%d \n", enable_ps, enable_als, enable_hs, enable_ges); +#elif HS_ENABLE + LOG_INFO("enable_pflag=%d, enable_lflag=%d, enable_hs=%d\n", enable_ps, enable_als, enable_hs); +#elif PS_GES + LOG_INFO("enable_pflag=%d, enable_lflag=%d, enable_ges=%d\n", enable_ps, enable_als, enable_ges); +#else + LOG_INFO("enable_pflag = %d, enable_lflag = %d \n", enable_ps, enable_als); +#endif +#endif + +#if PS_DYN_K && PS_DYN_K_STR + if(polling_flag == false && eint_flag == false && dynk_enhance_flag == false) +#else + if(polling_flag == false && eint_flag == false) +#endif + { +#if PS_DYN_K && PS_DYN_K_STR + LOG_INFO("[%s]: epl_sensor_update_mode(%d) or eint_work(%d) is running, dynk_enhance_flag=%d !\r\n", __func__, polling_flag, eint_flag, dynk_enhance_flag); +#else + LOG_INFO("[%s]: epl_sensor_update_mode(%d) or eint_work(%d) is running !\r\n", __func__, polling_flag, eint_flag); +#endif + return; + } + + cancel_delayed_work(&polling_work); + + if( (enable_als && epl_sensor.als.polling_mode == 1) || (enable_ps && epl_sensor.ps.polling_mode == 1) ) + { + queue_delayed_work(epld->epl_wq, &polling_work,msecs_to_jiffies(polling_time)); + } + +#if HS_ENABLE + if (enable_hs) + { + queue_delayed_work(epld->epl_wq, &polling_work,msecs_to_jiffies(20)); + epl_sensor_read_hs(client); + } +#if PS_GES /*PS_GES*/ + else if (enable_ges && epl_sensor.ges.polling_mode==1) +#endif /*PS_GES*/ +#endif + +#if PS_GES +#if !HS_ENABLE /*HS_ENABLE*/ + if (enable_ges && epl_sensor.ges.polling_mode==1) +#endif /*HS_ENABLE*/ + { + queue_delayed_work(epld->epl_wq, &polling_work, msecs_to_jiffies(polling_time)); + epl_sensor_read_ps(epld->client); + epl_sensor_read_ps_status(epld->client); + } +#endif + + if(enable_als && epl_sensor.als.polling_mode == 1) + { + int report_lux = 0; +#if PS_DYN_K && PS_DYN_K_STR + if(polling_flag == true && eint_flag == true && dynk_enhance_flag == true) +#else + if(polling_flag == true && eint_flag == true) +#endif + { + mutex_lock(&sensor_mutex); + //epl_sensor_read_als_status(client); // for test + epl_sensor_read_als(client); + mutex_unlock(&sensor_mutex); + report_lux = epl_sensor_get_als_value(epld, epl_sensor.als.data.channels[1]); + if(epl_sensor.als.report_type != CMC_BIT_DYN_INT){ + epl_sensor_report_lux(report_lux); + } + } + } + + if(enable_ps && epl_sensor.ps.polling_mode == 1) + { +#if PS_DYN_K && PS_DYN_K_STR + if(polling_flag == true && eint_flag == true && dynk_enhance_flag == true) +#else + if(polling_flag == true && eint_flag == true) +#endif + { + mutex_lock(&sensor_mutex); + epl_sensor_read_ps_status(client); + epl_sensor_read_ps(client); + mutex_unlock(&sensor_mutex); +#if PS_DYN_K + epl_sensor_reset_dynk_thd(dynk_last_status, (epl_sensor.ps.compare_low >> 3)); + dynk_last_status = (epl_sensor.ps.compare_low >> 3); +#endif + epl_sensor_report_ps_status(); + } + } +#if HS_ENABLE && PS_GES + if(enable_als==false && enable_ps==false && enable_hs==false && enable_ges==false) +#elif HS_ENABLE + if(enable_als==false && enable_ps==false && enable_hs==false) +#elif PS_GES + if(enable_als==false && enable_ps==false && enable_ges==false) +#else + if(enable_als==false && enable_ps==false) +#endif + { + cancel_delayed_work(&polling_work); + LOG_INFO("disable sensor\n"); + } + +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static irqreturn_t epl_sensor_eint_func(int irqNo, void *handle) +{ + struct epl_sensor_priv *epld = (struct epl_sensor_priv*)handle; + disable_irq_nosync(epld->irq); + //queue_work(epld->epl_wq, &epl_sensor_irq_work); + schedule_delayed_work(&epld->eint_work, 0); + + return IRQ_HANDLED; +} +/*----------------------------------------------------------------------------*/ +static void epl_sensor_intr_als_report_lux(void) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + + int report_lux = 0; + epl_sensor_read_als(epld->client); + + report_lux = epl_sensor_get_als_value(epld, epl_sensor.als.data.channels[1]); + epl_sensor_report_lux(report_lux); + + epl_sensor.als.compare_reset = EPL_CMP_RESET; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + + //set dynamic threshold + if(epl_sensor.als.compare_high >> 4) + { + epl_sensor.als.high_threshold = epl_sensor.als.high_threshold + 250; + epl_sensor.als.low_threshold = epl_sensor.als.low_threshold + 250; + + if (epl_sensor.als.high_threshold > 60000) + { + epl_sensor.als.high_threshold = epl_sensor.als.high_threshold -250; + epl_sensor.als.low_threshold = epl_sensor.als.low_threshold - 250; + } + } + if(epl_sensor.als.compare_low>> 3) + { + epl_sensor.als.high_threshold = epl_sensor.als.high_threshold -250; + epl_sensor.als.low_threshold = epl_sensor.als.low_threshold - 250; + + if (epl_sensor.als.high_threshold < 250) + { + epl_sensor.als.high_threshold = epl_sensor.als.high_threshold + 250; + epl_sensor.als.low_threshold = epl_sensor.als.low_threshold + 250; + } + } + + if(epl_sensor.als.high_threshold < epl_sensor.als.low_threshold) + { + LOG_INFO("[%s]:recover default setting \r\n", __FUNCTION__); + epl_sensor.als.high_threshold = ALS_HIGH_THRESHOLD; + epl_sensor.als.low_threshold = ALS_LOW_THRESHOLD; + } + + //write new threshold + set_lsensor_intr_threshold(epl_sensor.als.low_threshold, epl_sensor.als.high_threshold); +} +/*----------------------------------------------------------------------------*/ +static void epl_sensor_eint_work(struct work_struct *work) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; + bool enable_als = epld->enable_lflag==1 && epld->als_suspend==0; +#if PS_GES + bool enable_ges = epld->enable_gflag==1 && epld->ges_suspend==0; +#endif + eint_flag = false; + mutex_lock(&sensor_mutex); + +#if PS_GES + if(enable_ges && epl_sensor.ges.polling_mode == 0) + { + epl_sensor_read_ps_status(epld->client); + if(polling_flag == true) + { + //GES unlock and run + epl_sensor.ges.compare_reset = EPL_CMP_RUN; + epl_sensor.ges.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x1b, epl_sensor.ges.compare_reset | epl_sensor.ges.lock); + } + } +#endif + if(enable_ps && epl_sensor.ps.polling_mode == 0) + { + epl_sensor_read_ps_status(epld->client); + if(epl_sensor.ps.interrupt_flag == EPL_INT_TRIGGER) + { +#if PS_DEBUG || PS_DYN_K + epl_sensor_read_ps(epld->client); +#endif + +#if PS_DYN_K + epl_sensor_reset_dynk_thd(dynk_last_status, (epl_sensor.ps.compare_low >> 3)); + dynk_last_status = (epl_sensor.ps.compare_low >> 3); +#endif + epl_sensor_report_ps_status(); + + if(polling_flag == true) + { + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + } + + } + } + if(enable_als && epl_sensor.als.polling_mode == 0) + { + epl_sensor_read_als_status(epld->client); + if(epl_sensor.als.interrupt_flag == EPL_INT_TRIGGER) + { + epl_sensor_intr_als_report_lux(); + if(polling_flag == true) + { + //ALS unlock and run + epl_sensor.als.compare_reset = EPL_CMP_RUN; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + } + } + } + + //enable_irq(epld->irq); + mutex_unlock(&sensor_mutex); + eint_flag = true; + enable_irq(epld->irq); +} +/*----------------------------------------------------------------------------*/ +static int epl_sensor_setup_interrupt(struct epl_sensor_priv *epld) +{ + struct i2c_client *client = epld->client; + int err = 0; +#if QCOM + unsigned int irq_gpio; + unsigned int irq_gpio_flags; + struct device_node *np = client->dev.of_node; +#endif + msleep(5); +#if S5PV210 + err = gpio_request(S5PV210_GPH0(1), "Elan EPL IRQ"); + if (err) + { + LOG_ERR("gpio pin request fail (%d)\n", err); + goto initial_fail; + } + else + { + LOG_INFO("----- Samsung gpio config success -----\n"); + s3c_gpio_cfgpin(S5PV210_GPH0(1),S3C_GPIO_SFN(0x0F)/*(S5PV210_GPH0_1_EXT_INT30_1) */); + s3c_gpio_setpull(S5PV210_GPH0(1),S3C_GPIO_PULL_UP); + + } +#elif SPREAD + //epld->intr_pin = ELAN_INT_PIN; /*need setting*/ + err = gpio_request(epld->intr_pin, "Elan EPL IRQ"); + if (err) + { + LOG_ERR("gpio pin request fail (%d)\n", err); + goto initial_fail; + }else{ + gpio_direction_input(epld->intr_pin); + /*get irq*/ + client->irq = gpio_to_irq(epld->intr_pin); + epld->irq = client->irq; + LOG_INFO("IRQ number is %d\n", client->irq); + } +#elif QCOM + irq_gpio = of_get_named_gpio_flags(np, "epl,irq-gpio", 0, &irq_gpio_flags); + //irq_gpio = ELAN_INT_PIN; + epld->intr_pin = irq_gpio; + if (epld->intr_pin < 0) { + goto initial_fail; + } + + if (gpio_is_valid(epld->intr_pin)) { + err = gpio_request(epld->intr_pin, "epl_irq_gpio"); + if (err) { + LOG_ERR( "irq gpio request failed"); + goto initial_fail; + } + + err = gpio_direction_input(epld->intr_pin); + if (err) { + LOG_ERR("set_direction for irq gpio failed\n"); + goto initial_fail; + } + } +#elif LEADCORE + //epld->intr_pin = ELAN_INT_PIN; /*need setting*/ + epld->intr_pin = irq_to_gpio(client->irq); /*need confirm*/ + + err = gpio_request(epld->intr_pin, "epl irq"); /*ep12182 irq*/ + //err = gpio_request(epld->intr_pin, "ep12182 irq"); + if (err < 0){ + LOG_ERR("%s:Gpio request failed! \r\n", __func__); + goto initial_fail; + } + gpio_direction_input(epld->intr_pin); + client->irq = gpio_to_irq(epld->intr_pin); +#elif MARVELL + + epld->intr_pin = ELAN_INT_PIN; /*need setting*/ + if(client->irq <= 0) + { + LOG_ERR("client->irq(%d) Failed \r\n", client->irq); + goto initial_fail; + } +#endif + err = request_irq(epld->irq,epl_sensor_eint_func, IRQF_TRIGGER_FALLING, + "epl2182_pls", epld); + if(err <0) + { + LOG_ERR("request irq pin %d fail for gpio\n",err); + goto fail_free_intr_pin; + } + + return err; + +initial_fail: +fail_free_intr_pin: + gpio_free(epld->intr_pin); + //free_irq(epld->irq, epld); + return err; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ + +static ssize_t epl_sensor_show_reg(struct device *dev, struct device_attribute *attr, char *buf) +{ + + ssize_t len = 0; + struct i2c_client *client = epl_sensor_obj->client; + + if(!epl_sensor_obj) + { + LOG_ERR("epl_obj is null!!\n"); + return 0; + } + + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x00 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x00)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x01 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x01)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x02 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x02)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x03 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x03)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x04 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x04)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x05 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x05)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x06 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x06)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x07 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x07)); + if(epl_sensor.als.polling_mode == 0) + { + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x08 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x08)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x09 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x09)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x0A value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x0A)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x0B value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x0B)); + } + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x0C value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x0C)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x0D value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x0D)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x0E value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x0E)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x0F value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x0F)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x11 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x11)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x12 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x12)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x1B value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x1B)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x22 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x22)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x23 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x23)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x24 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x24)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0x25 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x25)); + len += snprintf(buf+len, PAGE_SIZE-len, "chip id REG 0xFC value = 0x%x\n", i2c_smbus_read_byte_data(client, 0xFC)); + + return len; + +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_show_status(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + struct epl_sensor_priv *epld = epl_sensor_obj; + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; + bool enable_als = epld->enable_lflag==1 && epld->als_suspend==0; +#if HS_ENABLE + bool enable_hs = epld->enable_hflag==1 && epld->hs_suspend==0; +#endif + + if(!epl_sensor_obj) + { + LOG_ERR("epl_sensor_obj is null!!\n"); + return 0; + } + + len += snprintf(buf+len, PAGE_SIZE-len, "chip is %s, ver is %s \n", EPL_DEV_NAME, DRIVER_VERSION); + len += snprintf(buf+len, PAGE_SIZE-len, "als/ps polling is %d-%d\n", epl_sensor.als.polling_mode, epl_sensor.ps.polling_mode); + len += snprintf(buf+len, PAGE_SIZE-len, "wait = %d, mode = %d\n",epl_sensor.wait >> 4, epl_sensor.mode); + len += snprintf(buf+len, PAGE_SIZE-len, "interrupt control = %d\n", epl_sensor.interrupt_control >> 4); + len += snprintf(buf+len, PAGE_SIZE-len, "frame time ps=%dms, als=%dms\n", ps_frame_time, als_frame_time); +#if HS_ENABLE + if(enable_hs) + { + len += snprintf(buf+len, PAGE_SIZE-len, "hs adc= %d\n", epl_sensor.hs.adc>>3); + len += snprintf(buf+len, PAGE_SIZE-len, "hs int_time= %d\n", epl_sensor.hs.integration_time>>2); + len += snprintf(buf+len, PAGE_SIZE-len, "hs cycle= %d\n", epl_sensor.hs.cycle); + len += snprintf(buf+len, PAGE_SIZE-len, "hs gain= %d\n", epl_sensor.hs.gain); + len += snprintf(buf+len, PAGE_SIZE-len, "hs ch1 raw= %d\n", epl_sensor.hs.raw); + } +#endif + if(enable_ps) + { + len += snprintf(buf+len, PAGE_SIZE-len, "PS: \n"); + len += snprintf(buf+len, PAGE_SIZE-len, "INTEG = %d, gain = %d\n", epl_sensor.ps.integration_time >> 2, epl_sensor.ps.gain); + len += snprintf(buf+len, PAGE_SIZE-len, "ADC = %d, cycle = %d, ir drive = %d\n", epl_sensor.ps.adc >> 3, epl_sensor.ps.cycle, epl_sensor.ps.ir_drive); + len += snprintf(buf+len, PAGE_SIZE-len, "saturation = %d, int flag = %d\n", epl_sensor.ps.saturation >> 5, epl_sensor.ps.interrupt_flag >> 2); + len += snprintf(buf+len, PAGE_SIZE-len, "Thr(L/H) = (%d/%d)\n", epl_sensor.ps.low_threshold, epl_sensor.ps.high_threshold); +#if PS_DYN_K +#if PS_DYN_K_STR + len += snprintf(buf+len, PAGE_SIZE-len, "Dyn enhance ch0 = %d \n", dynk_enhance_ch0); +#endif + len += snprintf(buf+len, PAGE_SIZE-len, "Dyn thr(L/H) = (%ld/%ld)\n", (long)dynk_thd_low, (long)dynk_thd_high); +#endif + len += snprintf(buf+len, PAGE_SIZE-len, "pals data = %d, data = %d\n", epl_sensor.ps.data.ir_data, epl_sensor.ps.data.data); + } + if(enable_als) + { + len += snprintf(buf+len, PAGE_SIZE-len, "ALS: \n"); + len += snprintf(buf+len, PAGE_SIZE-len, "INTEG = %d, gain = %d\n", epl_sensor.als.integration_time >> 2, epl_sensor.als.gain); + len += snprintf(buf+len, PAGE_SIZE-len, "ADC = %d, cycle = %d\n", epl_sensor.als.adc >> 3, epl_sensor.als.cycle); +#if ALS_DYN_INTT + if(epl_sensor.als.lsrc_type != CMC_BIT_LSRC_NON) + { + len += snprintf(buf+len, PAGE_SIZE-len, "lsource_thd_low=%d, lsource_thd_high=%d \n", epld->lsource_thd_low, epld->lsource_thd_high); + len += snprintf(buf+len, PAGE_SIZE-len, "saturation = %d\n", epl_sensor.als.saturation >> 5); + + if(epl_sensor.als.lsrc_type == CMC_BIT_LSRC_SCALE || epl_sensor.als.lsrc_type == CMC_BIT_LSRC_BOTH) + { + len += snprintf(buf+len, PAGE_SIZE-len, "real_ratio = %d\n", epld->ratio); + len += snprintf(buf+len, PAGE_SIZE-len, "use_ratio = %d\n", epld->last_ratio); + } + else if(epl_sensor.als.lsrc_type == CMC_BIT_LSRC_SLOPE) + { + len += snprintf(buf+len, PAGE_SIZE-len, "ratio = %d\n", epld->ratio); + } + } + + len += snprintf(buf+len, PAGE_SIZE-len, "c_gain = %d\n", c_gain); + len += snprintf(buf+len, PAGE_SIZE-len, "dynamic_intt_lux = %d\n", dynamic_intt_lux); +#endif + if(epl_sensor.als.polling_mode == 0) + len += snprintf(buf+len, PAGE_SIZE-len, "Thr(L/H) = (%d/%d)\n", epl_sensor.als.low_threshold, epl_sensor.als.high_threshold); + len += snprintf(buf+len, PAGE_SIZE-len, "ch0 = %d, ch1 = %d\n", epl_sensor.als.data.channels[0], epl_sensor.als.data.channels[1]); + } + + return len; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_als_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + uint16_t mode=0; + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + + sscanf(buf, "%hu",&mode); + if(epld->enable_lflag != mode) + { +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + dynamic_intt_idx = dynamic_intt_init_idx; + epl_sensor.als.integration_time = als_dynamic_intt_intt[dynamic_intt_idx]; + epl_sensor.als.gain = als_dynamic_intt_gain[dynamic_intt_idx]; + dynamic_intt_high_thr = als_dynamic_intt_high_thr[dynamic_intt_idx]; + dynamic_intt_low_thr = als_dynamic_intt_low_thr[dynamic_intt_idx]; + } +#endif + epld->enable_lflag = mode; + + epl_sensor_update_mode(epld->client); + } + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_ps_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + uint16_t mode=0; + struct epl_sensor_priv *epld = epl_sensor_obj; +#if HS_ENABLE + bool enable_hs = epld->enable_hflag==1 && epld->hs_suspend==0; +#endif +#if PS_GES + bool enable_ges = epld->enable_gflag==1 && epld->ges_suspend==0; +#endif + LOG_FUN(); + + sscanf(buf, "%hu",&mode); +#if HS_ENABLE + if(enable_hs == 1 && mode == 1) + { + epld->enable_hflag = 0; + if(hs_enable_flag == true) + { + epld->enable_lflag = 1; + hs_enable_flag = false; + } + write_global_variable(epld->client); + LOG_INFO("[%s] Disable HS and recover ps setting \r\n", __func__); + } +#endif +#if PS_GES + if(enable_ges == 1 && mode == 1) + { + epld->enable_gflag = 0; + write_global_variable(epld->client); + ps_ges_enable_flag = true; + LOG_INFO("[%s] Disable GES and recover ps setting \r\n", __func__); + } + else if (ps_ges_enable_flag == true && mode == 0) + { + epld->enable_gflag = 1; + write_global_variable(epld->client); + ps_ges_enable_flag = false; + LOG_INFO("[%s] enable GES and recover ges setting \r\n", __func__); + } +#endif + if(epld->enable_pflag != mode) + { + epld->enable_pflag = mode; + if(mode) + { + wake_lock(&ps_lock); +#if PS_DYN_K + dynk_min_ps_raw_data = 0xffff; + dynk_change_flag = false; +#if PS_DYN_K_STR + dynk_enhance_flag = false; +#endif +#endif + } + else + { +#if PS_DYN_K + cancel_delayed_work(&dynk_thd_polling_work); +#endif + wake_unlock(&ps_lock); + } + + epl_sensor_update_mode(epld->client); + } + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_show_cal_raw(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + u16 ch1 = 0; + u32 ch1_all=0; + int count =5; + int i; + ssize_t len = 0; +#if !PS_DYN_K + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; +#endif + + if(!epl_sensor_obj) + { + LOG_ERR("epl_sensor_obj is null!!\n"); + return 0; + } + + + + for(i=0; iclient); +#endif + ch1 = epl_sensor.ps.data.data; + break; + + case EPL_MODE_ALS: + if(epl_sensor.als.polling_mode == 0) + epl_sensor_read_als(epld->client); + ch1 = epl_sensor.als.data.channels[1]; + break; + } + + ch1_all = ch1_all + ch1; + if(epl_sensor.wait == EPL_WAIT_SINGLE) + epl_sensor_I2C_Write(epld->client,0x11, epl_sensor.power | epl_sensor.reset); + } + + ch1 = (u16)(ch1_all/count); + + LOG_INFO("cal_raw = %d \r\n" , ch1); + + len += snprintf(buf + len, PAGE_SIZE - len, "%d \r\n", ch1); + + return len; +} + + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_threshold(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int hthr = 0, lthr = 0; + if(!epld) + { + LOG_ERR("epl_sensor_obj is null!!\n"); + return 0; + } + + switch(epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: +#endif + sscanf(buf, "%d,%d", <hr, &hthr); + epl_sensor.ps.low_threshold = lthr; + epl_sensor.ps.high_threshold = hthr; + set_psensor_intr_threshold(epl_sensor.ps.low_threshold, epl_sensor.ps.high_threshold); + break; + + case EPL_MODE_ALS: + sscanf(buf, "%d,%d", <hr, &hthr); + epl_sensor.als.low_threshold = lthr; + epl_sensor.als.high_threshold = hthr; + set_lsensor_intr_threshold(epl_sensor.als.low_threshold, epl_sensor.als.high_threshold); + break; + + } + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_wait_time(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int val; + sscanf(buf, "%d",&val); + + epl_sensor.wait = (val & 0xf) << 4; + + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_gain(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int value = 0; + LOG_FUN(); + + sscanf(buf, "%d", &value); + + value = value & 0x03; + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + epl_sensor.ps.gain = value; + epl_sensor_I2C_Write(epld->client, 0x03, epl_sensor.ps.integration_time | epl_sensor.ps.gain); + break; + + case EPL_MODE_ALS: //als + epl_sensor.als.gain = value; + epl_sensor_I2C_Write(epld->client, 0x01, epl_sensor.als.integration_time | epl_sensor.als.gain); + break; + } + + epl_sensor_update_mode(epld->client); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int value=0; + + LOG_FUN(); + + epld->enable_pflag = 0; + epld->enable_lflag = 0; + + sscanf(buf, "%d",&value); + + switch (value) + { + case 0: + epl_sensor.mode = EPL_MODE_IDLE; + break; + + case 1: + epld->enable_lflag = 1; + epl_sensor.mode = EPL_MODE_ALS; + break; + + case 2: + epld->enable_pflag = 1; + epl_sensor.mode = EPL_MODE_PS; + break; + + case 3: + epld->enable_lflag = 1; + epld->enable_pflag = 1; + epl_sensor.mode = EPL_MODE_ALS_PS; + break; + } + + epl_sensor_update_mode(epld->client); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_ir_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d", &value); + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + switch(value) + { + case 0: + epl_sensor.ps.ir_mode = EPL_IR_MODE_CURRENT; + break; + + case 1: + epl_sensor.ps.ir_mode = EPL_IR_MODE_VOLTAGE; + break; + } + + epl_sensor_I2C_Write(epld->client,0x05, epl_sensor.ps.ir_on_control | epl_sensor.ps.ir_mode | epl_sensor.ps.ir_drive); + break; + } + + epl_sensor_I2C_Write(epld->client,0x00,epl_sensor.wait | epl_sensor.mode); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_ir_contrl(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + uint8_t data; + + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d",&value); + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + switch(value) + { + case 0: + epl_sensor.ps.ir_on_control = EPL_IR_ON_CTRL_OFF; + break; + + case 1: + epl_sensor.ps.ir_on_control = EPL_IR_ON_CTRL_ON; + break; + } + + data = epl_sensor.ps.ir_on_control | epl_sensor.ps.ir_mode | epl_sensor.ps.ir_drive; + LOG_INFO("[%s]: 0x05 = 0x%x\n", __FUNCTION__, data); + + epl_sensor_I2C_Write(epld->client,0x05, epl_sensor.ps.ir_on_control | epl_sensor.ps.ir_mode | epl_sensor.ps.ir_drive); + break; + } + + epl_sensor_I2C_Write(epld->client,0x00,epl_sensor.wait | epl_sensor.mode); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_ir_drive(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d", &value); + + switch(epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: +#endif + epl_sensor.ps.ir_drive = (value & 0x03); + epl_sensor_I2C_Write(epld->client,0x05, epl_sensor.ps.ir_on_control | epl_sensor.ps.ir_mode | epl_sensor.ps.ir_drive); + break; + } + + epl_sensor_I2C_Write(epld->client,0x00,epl_sensor.wait | epl_sensor.mode); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_interrupt_type(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d",&value); + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + if(!epl_sensor.ps.polling_mode) + { + epl_sensor.ps.interrupt_type = value & 0x03; + epl_sensor_I2C_Write(epld->client,0x06, epl_sensor.interrupt_control | epl_sensor.ps.persist |epl_sensor.ps.interrupt_type); + LOG_INFO("[%s]: 0x06 = 0x%x\n", __FUNCTION__, epl_sensor.interrupt_control | epl_sensor.ps.persist |epl_sensor.ps.interrupt_type); + } + break; + + case EPL_MODE_ALS: //als + if(!epl_sensor.als.polling_mode) + { + epl_sensor.als.interrupt_type = value & 0x03; + epl_sensor_I2C_Write(epld->client,0x07, epl_sensor.als.interrupt_channel_select | epl_sensor.als.persist | epl_sensor.als.interrupt_type); + LOG_INFO("[%s]: 0x07 = 0x%x\n", __FUNCTION__, epl_sensor.als.interrupt_channel_select | epl_sensor.als.persist | epl_sensor.als.interrupt_type); + } + break; + } + + return count; +} + +/*----------------------------------------------------------------------------*/ + +static ssize_t epl_sensor_store_ps_polling_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int polling_mode = 0; + + + sscanf(buf, "%d",&polling_mode); + epl_sensor.ps.polling_mode = polling_mode; +#if PS_GES + epl_sensor.ges.polling_mode = polling_mode; +#endif + + epl_sensor_update_mode(epld->client); + + return count; +} + +static ssize_t epl_sensor_store_als_polling_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int polling_mode = 0; + + sscanf(buf, "%d",&polling_mode); + epl_sensor.als.polling_mode = polling_mode; + + epl_sensor_update_mode(epld->client); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_integration(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d",&value); + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + epl_sensor.ps.integration_time = (value & 0xf) << 2; + epl_sensor_I2C_Write(epld->client,0x03, epl_sensor.ps.integration_time | epl_sensor.ps.gain); + epl_sensor_I2C_Read(epld->client, 0x03, 1); + LOG_INFO("[%s]: 0x03 = 0x%x (0x%x)\n", __FUNCTION__, epl_sensor.ps.integration_time | epl_sensor.ps.gain, gRawData.raw_bytes[0]); + break; + + case EPL_MODE_ALS: //als + epl_sensor.als.integration_time = (value & 0xf) << 2; + epl_sensor_I2C_Write(epld->client,0x01, epl_sensor.als.integration_time | epl_sensor.als.gain); + epl_sensor_I2C_Read(epld->client, 0x01, 1); + LOG_INFO("[%s]: 0x01 = 0x%x (0x%x)\n", __FUNCTION__, epl_sensor.als.integration_time | epl_sensor.als.gain, gRawData.raw_bytes[0]); + break; + } + + epl_sensor_update_mode(epld->client); + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_adc(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d",&value); + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + epl_sensor.ps.adc = (value & 0x3) << 3; + epl_sensor_I2C_Write(epld->client,0x04, epl_sensor.ps.adc | epl_sensor.ps.cycle); + epl_sensor_I2C_Read(epld->client, 0x04, 1); + LOG_INFO("[%s]:0x04 = 0x%x (0x%x)\n", __FUNCTION__, epl_sensor.ps.adc | epl_sensor.ps.cycle, gRawData.raw_bytes[0]); + break; + + case EPL_MODE_ALS: //als + epl_sensor.als.adc = (value & 0x3) << 3; + epl_sensor_I2C_Write(epld->client,0x02, epl_sensor.als.adc | epl_sensor.als.cycle); + epl_sensor_I2C_Read(epld->client, 0x02, 1); + LOG_INFO("[%s]:0x02 = 0x%x (0x%x)\n", __FUNCTION__, epl_sensor.als.adc | epl_sensor.als.cycle, gRawData.raw_bytes[0]); + break; + } + + epl_sensor_update_mode(epld->client); + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_cycle(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + sscanf(buf, "%d",&value); + + switch (epl_sensor.mode) + { +#if PS_DYN_K_STR + case EPL_MODE_ALS_PS: +#else + case EPL_MODE_PS: //ps +#endif + epl_sensor.ps.cycle = (value & 0x7); + epl_sensor_I2C_Write(epld->client,0x04, epl_sensor.ps.adc | epl_sensor.ps.cycle); + LOG_INFO("[%s]:0x04 = 0x%x (0x%x)\n", __FUNCTION__, epl_sensor.ps.adc | epl_sensor.ps.cycle, gRawData.raw_bytes[0]); + break; + + case EPL_MODE_ALS: //als + epl_sensor.als.cycle = (value & 0x7); + epl_sensor_I2C_Write(epld->client,0x02, epl_sensor.als.adc | epl_sensor.als.cycle); + LOG_INFO("[%s]:0x02 = 0x%x (0x%x)\n", __FUNCTION__, epl_sensor.als.adc | epl_sensor.als.cycle, gRawData.raw_bytes[0]); + break; + } + + epl_sensor_update_mode(epld->client); + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_als_report_type(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int value=0; + + LOG_FUN(); + + sscanf(buf, "%d", &value); + epl_sensor.als.report_type = value & 0xf; + + return count; +} +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_store_ps_w_calfile(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int ps_hthr=0, ps_lthr=0, ps_cancelation=0; + int ps_cal_len = 0; + char ps_calibration[20]; + LOG_FUN(); + + if(!epl_sensor_obj) + { + LOG_ERR("epl_obj is null!!\n"); + return 0; + } + sscanf(buf, "%d,%d,%d",&ps_cancelation, &ps_hthr, &ps_lthr); + + ps_cal_len = sprintf(ps_calibration, "%d,%d,%d", ps_cancelation, ps_hthr, ps_lthr); + + write_factory_calibration(epld, ps_calibration, ps_cal_len); + return count; +} +/*----------------------------------------------------------------------------*/ + +static ssize_t epl_sensor_store_reg_write(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int reg; + int data; + LOG_FUN(); + + sscanf(buf, "%x,%x",®, &data); + + LOG_INFO("[%s]: reg=0x%x, data=0x%x", __func__, reg, data); + epl_sensor_I2C_Write(epld->client, reg, data); + + return count; +} + +static ssize_t epl_sensor_store_unlock(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int mode; + LOG_FUN(); + + sscanf(buf, "%d",&mode); + + LOG_INFO("mode = %d \r\n", mode); + switch (mode) + { + case 0: //ps + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + break; + + case 1: //als + //ALS unlock and run + epl_sensor.als.compare_reset = EPL_CMP_RUN; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + break; + + case 2: //als unlock and reset + epl_sensor.als.compare_reset = EPL_CMP_RESET; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + break; + + case 3: //ps+als + //PS unlock and run + epl_sensor.ps.compare_reset = EPL_CMP_RUN; + epl_sensor.ps.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x1b, epl_sensor.ps.compare_reset |epl_sensor.ps.lock); + + //ALS unlock and run + epl_sensor.als.compare_reset = EPL_CMP_RUN; + epl_sensor.als.lock = EPL_UN_LOCK; + epl_sensor_I2C_Write(epld->client,0x12, epl_sensor.als.compare_reset | epl_sensor.als.lock); + break; + } + /*double check PS or ALS lock*/ + + + return count; +} + +static ssize_t epl_sensor_store_als_ch_sel(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int ch_sel; + LOG_FUN(); + + sscanf(buf, "%d",&ch_sel); + + LOG_INFO("channel selection = %d \r\n", ch_sel); + switch (ch_sel) + { + case 0: //ch0 + epl_sensor.als.interrupt_channel_select = EPL_ALS_INT_CHSEL_0; + break; + + case 1: //ch1 + epl_sensor.als.interrupt_channel_select = EPL_ALS_INT_CHSEL_1; + break; + } + epl_sensor_I2C_Write(epld->client,0x07, epl_sensor.als.interrupt_channel_select | epl_sensor.als.persist | epl_sensor.als.interrupt_type); + + epl_sensor_update_mode(epld->client); + + return count; +} + +static ssize_t epl_sensor_store_ps_cancelation(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int cancelation; + LOG_FUN(); + + sscanf(buf, "%d",&cancelation); + + epl_sensor.ps.cancelation = cancelation; + + LOG_INFO("epl_sensor.ps.cancelation = %d \r\n", epl_sensor.ps.cancelation); + + epl_sensor_I2C_Write(epld->client,0x22, (u8)(epl_sensor.ps.cancelation& 0xff)); + epl_sensor_I2C_Write(epld->client,0x23, (u8)((epl_sensor.ps.cancelation & 0xff00) >> 8)); + + return count; +} + +static ssize_t epl_sensor_show_ps_polling(struct device *dev, struct device_attribute *attr, char *buf) +{ + u16 *tmp = (u16*)buf; + tmp[0]= epl_sensor.ps.polling_mode; + return 2; +} + +static ssize_t epl_sensor_show_als_polling(struct device *dev, struct device_attribute *attr, char *buf) +{ + u16 *tmp = (u16*)buf; + tmp[0]= epl_sensor.als.polling_mode; + return 2; +} + +static ssize_t epl_sensor_show_ps_run_cali(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + ssize_t len = 0; + int ret; + + LOG_FUN(); + + ret = epl_run_ps_calibration(epld); + + len += snprintf(buf+len, PAGE_SIZE-len, "ret = %d\r\n", ret); + + return len; +} + +static ssize_t epl_sensor_show_pdata(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + ssize_t len = 0; + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; + LOG_FUN(); + + if(enable_ps == true && polling_flag == true && eint_flag == true && epl_sensor.ps.polling_mode == 0) + { + mutex_lock(&sensor_mutex); + epl_sensor_read_ps(epld->client); + mutex_unlock(&sensor_mutex); + } + LOG_INFO("[%s]: epl_sensor.ps.data.data = %d \r\n", __func__, epl_sensor.ps.data.data); + len += snprintf(buf + len, PAGE_SIZE - len, "%d", epl_sensor.ps.data.data); + return len; + +} + +static ssize_t epl_sensor_show_als_data(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + ssize_t len = 0; + bool enable_als = epld->enable_lflag==1 && epld->als_suspend==0; + LOG_FUN(); + +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + LOG_INFO("[%s]: dynamic_intt_lux = %d \r\n", __func__, dynamic_intt_lux); + len += snprintf(buf + len, PAGE_SIZE - len, "%d", dynamic_intt_lux); + } + else +#endif + { + if(enable_als == true && polling_flag == true && eint_flag == true && epl_sensor.als.polling_mode == 0) + { + mutex_lock(&sensor_mutex); + epl_sensor_read_als(epld->client); + mutex_unlock(&sensor_mutex); + } + len += snprintf(buf + len, PAGE_SIZE - len, "%d", epl_sensor.als.data.channels[1]); + } + + return len; +} + +#if ALS_DYN_INTT +static ssize_t epl_sensor_store_c_gain(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int c_h,c_l; + LOG_FUN(); + + if(epl_sensor.als.lsrc_type == CMC_BIT_LSRC_NON) + { + sscanf(buf, "%d",&c_h); + c_gain = c_h; + LOG_INFO("c_gain = %d \r\n", c_gain); + } + else + { + sscanf(buf, "%d,%d",&c_l, &c_h); + epld->c_gain_h = c_h; + epld->c_gain_l = c_l; + } + + return count; +} + +static ssize_t epl_sensor_store_lsrc_type(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int type; + LOG_FUN(); + + sscanf(buf, "%d",&type); + + epl_sensor.als.lsrc_type = type; + + LOG_INFO("epl_sensor.als.lsrc_type = %d \r\n", epl_sensor.als.lsrc_type); + + return count; +} + +static ssize_t epl_sensor_store_lsrc_thd(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int lsrc_thrl, lsrc_thrh; + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + sscanf(buf, "%d,%d",&lsrc_thrl, &lsrc_thrh); + + epld->lsource_thd_low = lsrc_thrl; + epld->lsource_thd_high = lsrc_thrh; + + LOG_INFO("lsource_thd=(%d,%d) \r\n", epld->lsource_thd_low, epld->lsource_thd_high); + + return count; +} + +#endif + +#if PS_DYN_K +static ssize_t epl_sensor_store_dyn_offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int dyn_h,dyn_l; + LOG_FUN(); + + sscanf(buf, "%d,%d",&dyn_l, &dyn_h); + + dynk_low_offset = dyn_l; + dynk_high_offset = dyn_h; + + return count; +} + +static ssize_t epl_sensor_store_dyn_thd_offset(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int thd_offset; + LOG_FUN(); + + sscanf(buf, "%d",&thd_offset); + dynk_thd_offset = thd_offset; + + return count; +} + +static ssize_t epl_sensor_store_dyn_change_thd_max(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int thd_max; + LOG_FUN(); + + sscanf(buf, "%d",&thd_max); + dynk_change_thd_max = thd_max; + + return count; +} + +static ssize_t epl_sensor_store_dyn_max_ir_data(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int max_ir_data; + LOG_FUN(); + + sscanf(buf, "%d",&max_ir_data); + dynk_max_ir_data = max_ir_data; + + return count; +} + +#if PS_DYN_K_STR +static ssize_t epl_sensor_store_dyn_enhance_max_ch0(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + //struct epl_sensor_priv *epld = epl_sensor_obj; + int max_ch0; + LOG_FUN(); + + sscanf(buf, "%d",&max_ch0); + dynk_enhance_max_ch0 = max_ch0; + + return count; +} + +static ssize_t epl_sensor_store_dyn_enhance_gain_intt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + //struct epl_sensor_priv *epld = epl_sensor_obj; + int gain, intt; + LOG_FUN(); + + sscanf(buf, "%d,%d",&gain, &intt); + + dynk_enhance_integration_time = intt; + dynk_enhance_gain = gain; + + return count; +} +#endif + +#endif + +#if HS_ENABLE +static ssize_t epl_sensor_show_renvo(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + + LOG_FUN(); + LOG_INFO("gRawData.renvo=0x%x \r\n", epl_sensor.revno); + + len += snprintf(buf+len, PAGE_SIZE-len, "%x", epl_sensor.revno); + + return len; +} + +static ssize_t epl_sensor_store_hs_enable(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + uint16_t mode=0; + struct epl_sensor_priv *obj = epl_sensor_obj; + bool enable_ps = obj->enable_pflag==1 && obj->ps_suspend==0; + bool enable_als = obj->enable_lflag==1 && obj->als_suspend==0; + LOG_FUN(); + + sscanf(buf, "%hu",&mode); + + if(enable_ps == 0) + { + if(mode > 0) + { + if(enable_als == 1) + { + obj->enable_lflag = 0; + hs_enable_flag = true; + } + epl_sensor.hs.integration_time = epl_sensor.hs.integration_time_max; + epl_sensor.hs.raws_count=0; + obj->enable_hflag = 1; + + if(mode == 2) + { + epl_sensor.hs.dynamic_intt = false; + } + else + { + epl_sensor.hs.dynamic_intt = true; + } + } + else + { + obj->enable_hflag = 0; + if(hs_enable_flag == true) + { + obj->enable_lflag = 1; + hs_enable_flag = false; + } + + } + write_global_variable(obj->client); + epl_sensor_update_mode(obj->client); + } + + return count; +} + +static ssize_t epl_sensor_store_hs_int_time(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct epl_sensor_priv *obj = epl_sensor_obj; + int value; + u8 intt_buf; + + sscanf(buf, "%d",&value); + + mutex_lock(&hs_sensor_mutex); + epl_sensor.hs.integration_time = value<<2; + intt_buf = epl_sensor.hs.integration_time | epl_sensor.hs.gain; + epl_sensor_I2C_Write(obj->client, 0x03, intt_buf); + mutex_unlock(&hs_sensor_mutex); + + return count; +} + +/*----------------------------------------------------------------------------*/ +static ssize_t epl_sensor_show_hs_raws(struct device *dev, struct device_attribute *attr, char *buf) +{ + u16 *tmp = (u16*)buf; + int byte_count=2+epl_sensor.hs.raws_count*2; + int i=0; + LOG_FUN(); + mutex_lock(&hs_sensor_mutex); + tmp[0]= epl_sensor.hs.raws_count; + + for(i=0; iclient; + bool enable_ps = obj->enable_pflag==1 && obj->ps_suspend==0; + LOG_FUN(); + + sscanf(buf, "%d",&ges_enable); + LOG_INFO("[%s]: enable_ps=%d, ges_enable=%d \r\n", __func__, enable_ps, ges_enable); + + if(enable_ps == 0) + { + if(ges_enable == 1) + { + obj->enable_gflag = 1; + } + else + { + obj->enable_gflag = 0; + } + } + + write_global_variable(obj->client); + epl_sensor_update_mode(client); + return count; +} + +static ssize_t epl_sensor_store_ges_polling_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ges_mode=0; + struct epl_sensor_priv *obj = epl_sensor_obj; + struct i2c_client *client = obj->client; + + LOG_FUN(); + sscanf(buf, "%d",&ges_mode); + LOG_INFO("[%s]: ges_mode=%d \r\n", __func__, ges_mode); + + epl_sensor.ges.polling_mode = ges_mode; + epl_sensor.ps.polling_mode = ges_mode; + + epl_sensor_update_mode(client); + return count; +} + +static ssize_t epl_sensor_store_ges_thd(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ges_l=0, ges_h=0; + struct epl_sensor_priv *obj = epl_sensor_obj; + struct i2c_client *client = obj->client; + + LOG_FUN(); + sscanf(buf, "%d,%d",&ges_l, &ges_h); + epl_sensor.ges.low_threshold = ges_l; + epl_sensor.ges.high_threshold = ges_h; + LOG_INFO("[%s]: ges_thd=%d,%d \r\n", __func__, epl_sensor.ges.low_threshold, epl_sensor.ges.high_threshold); + + write_global_variable(obj->client); + epl_sensor_update_mode(client); + return count; +} + +#endif +/*----------------------------------------------------------------------------*/ + +static DEVICE_ATTR(elan_status, S_IROTH | S_IWOTH, epl_sensor_show_status, NULL ); +static DEVICE_ATTR(elan_reg, S_IROTH | S_IWOTH, epl_sensor_show_reg, NULL ); +static DEVICE_ATTR(mode, S_IROTH | S_IWOTH, NULL, epl_sensor_store_mode ); +static DEVICE_ATTR(wait_time, S_IROTH | S_IWOTH, NULL, epl_sensor_store_wait_time ); +static DEVICE_ATTR(set_threshold, S_IROTH | S_IWOTH, NULL, epl_sensor_store_threshold ); +static DEVICE_ATTR(cal_raw, S_IROTH | S_IWOTH, epl_sensor_show_cal_raw, NULL ); +static DEVICE_ATTR(als_enable, S_IROTH | S_IWOTH, NULL, epl_sensor_store_als_enable ); +static DEVICE_ATTR(als_report_type, S_IROTH | S_IWOTH, NULL, epl_sensor_store_als_report_type ); +static DEVICE_ATTR(ps_enable, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ps_enable ); +static DEVICE_ATTR(ps_polling_mode, S_IROTH | S_IWOTH, epl_sensor_show_ps_polling, epl_sensor_store_ps_polling_mode ); +static DEVICE_ATTR(als_polling_mode, S_IROTH | S_IWOTH, epl_sensor_show_als_polling, epl_sensor_store_als_polling_mode ); +static DEVICE_ATTR(gain, S_IROTH | S_IWOTH, NULL, epl_sensor_store_gain ); +static DEVICE_ATTR(ir_mode, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ir_mode ); +static DEVICE_ATTR(ir_drive, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ir_drive ); +static DEVICE_ATTR(ir_on, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ir_contrl ); +static DEVICE_ATTR(interrupt_type, S_IROTH | S_IWOTH, NULL, epl_sensor_store_interrupt_type ); +static DEVICE_ATTR(integration, S_IROTH | S_IWOTH, NULL, epl_sensor_store_integration ); +static DEVICE_ATTR(adc, S_IROTH | S_IWOTH, NULL, epl_sensor_store_adc ); +static DEVICE_ATTR(cycle, S_IROTH | S_IWOTH, NULL, epl_sensor_store_cycle ); +static DEVICE_ATTR(ps_w_calfile, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ps_w_calfile ); +static DEVICE_ATTR(i2c_w, S_IROTH | S_IWOTH, NULL, epl_sensor_store_reg_write ); +static DEVICE_ATTR(unlock, S_IROTH | S_IWOTH, NULL, epl_sensor_store_unlock ); +static DEVICE_ATTR(als_ch, S_IROTH | S_IWOTH, NULL, epl_sensor_store_als_ch_sel ); +static DEVICE_ATTR(ps_cancel, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ps_cancelation ); +static DEVICE_ATTR(run_ps_cali, S_IROTH | S_IWOTH, epl_sensor_show_ps_run_cali, NULL ); +static DEVICE_ATTR(pdata, S_IROTH | S_IWOTH, epl_sensor_show_pdata, NULL ); +static DEVICE_ATTR(als_data, S_IROTH | S_IWOTH, epl_sensor_show_als_data, NULL ); +#if ALS_DYN_INTT +static DEVICE_ATTR(als_dyn_c_gain, S_IROTH | S_IWOTH, NULL, epl_sensor_store_c_gain); +static DEVICE_ATTR(als_dyn_lsrc_type, S_IROTH | S_IWOTH, NULL, epl_sensor_store_lsrc_type); +static DEVICE_ATTR(als_dyn_lsrc_thd, S_IROTH | S_IWOTH, NULL, epl_sensor_store_lsrc_thd); +#endif +#if PS_DYN_K +static DEVICE_ATTR(dyn_offset, S_IROTH | S_IWOTH, NULL, epl_sensor_store_dyn_offset); +static DEVICE_ATTR(dyn_thd_offset, S_IROTH | S_IWOTH, NULL, epl_sensor_store_dyn_thd_offset); +static DEVICE_ATTR(dyn_change_max, S_IROTH | S_IWOTH, NULL, epl_sensor_store_dyn_change_thd_max); +static DEVICE_ATTR(dyn_max_ir_data, S_IROTH | S_IWOTH, NULL, epl_sensor_store_dyn_max_ir_data ); +#if PS_DYN_K_STR +static DEVICE_ATTR(dyn_enh_max_ch0, S_IROTH | S_IWOTH, NULL, epl_sensor_store_dyn_enhance_max_ch0 ); +static DEVICE_ATTR(dyn_enh_gain_intt, S_IROTH | S_IWOTH, NULL, epl_sensor_store_dyn_enhance_gain_intt ); +#endif +#endif +#if HS_ENABLE +static DEVICE_ATTR(elan_renvo, S_IROTH | S_IWOTH, epl_sensor_show_renvo, NULL ); +static DEVICE_ATTR(hs_enable, S_IROTH | S_IWOTH, NULL, epl_sensor_store_hs_enable ); +static DEVICE_ATTR(hs_int_time, S_IROTH | S_IWOTH, NULL, epl_sensor_store_hs_int_time ); +static DEVICE_ATTR(hs_raws, S_IROTH | S_IWOTH, epl_sensor_show_hs_raws, NULL ); +#endif +#if PS_GES +static DEVICE_ATTR(ges_enable, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ges_enable ); +static DEVICE_ATTR(ges_polling_mode, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ges_polling_mode ); +static DEVICE_ATTR(ges_thd, S_IROTH | S_IWOTH, NULL, epl_sensor_store_ges_thd ); +#endif +/*----------------------------------------------------------------------------*/ +static struct attribute *epl_sensor_attr_list[] = +{ + &dev_attr_elan_status.attr, + &dev_attr_elan_reg.attr, + &dev_attr_als_enable.attr, + &dev_attr_ps_enable.attr, + &dev_attr_cal_raw.attr, + &dev_attr_set_threshold.attr, + &dev_attr_wait_time.attr, + &dev_attr_gain.attr, + &dev_attr_mode.attr, + &dev_attr_ir_mode.attr, + &dev_attr_ir_drive.attr, + &dev_attr_ir_on.attr, + &dev_attr_interrupt_type.attr, + &dev_attr_integration.attr, + &dev_attr_adc.attr, + &dev_attr_cycle.attr, + &dev_attr_als_report_type.attr, + &dev_attr_ps_polling_mode.attr, + &dev_attr_als_polling_mode.attr, + &dev_attr_ps_w_calfile.attr, + &dev_attr_i2c_w.attr, + &dev_attr_unlock.attr, + &dev_attr_als_ch.attr, + &dev_attr_ps_cancel.attr, + &dev_attr_run_ps_cali.attr, + &dev_attr_pdata.attr, + &dev_attr_als_data.attr, +#if ALS_DYN_INTT + &dev_attr_als_dyn_c_gain.attr, + &dev_attr_als_dyn_lsrc_type.attr, + &dev_attr_als_dyn_lsrc_thd.attr, +#endif +#if PS_DYN_K + &dev_attr_dyn_offset.attr, + &dev_attr_dyn_thd_offset.attr, + &dev_attr_dyn_change_max.attr, + &dev_attr_dyn_max_ir_data.attr, +#if PS_DYN_K_STR + &dev_attr_dyn_enh_max_ch0.attr, + &dev_attr_dyn_enh_gain_intt.attr, +#endif +#endif +#if HS_ENABLE + &dev_attr_elan_renvo.attr, + &dev_attr_hs_enable.attr, + &dev_attr_hs_int_time.attr, + &dev_attr_hs_raws.attr, +#endif +#if PS_GES + &dev_attr_ges_enable.attr, + &dev_attr_ges_polling_mode.attr, + &dev_attr_ges_thd.attr, +#endif +}; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static struct attribute_group epl_sensor_attr_group = +{ + .attrs = epl_sensor_attr_list, +}; +/*----------------------------------------------------------------------------*/ +#if !(SPREAD || MARVELL)/*SPREAD MARVELL start.....*/ +/*----------------------------------------------------------------------------*/ +static int epl_sensor_als_open(struct inode *inode, struct file *file) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + if (epld->als_opened) + { + return -EBUSY; + } + epld->als_opened = 1; + + return 0; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_als_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + int buf[1]; + if(epld->read_flag ==1) + { + buf[0] = epl_sensor.als.data.channels[1]; + if(copy_to_user(buffer, &buf , sizeof(buf))) + return 0; + epld->read_flag = 0; + return 12; + } + else + { + return 0; + } +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_als_release(struct inode *inode, struct file *file) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + epld->als_opened = 0; + + return 0; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static long epl_sensor_als_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int flag; + unsigned long buf[1]; + struct epl_sensor_priv *epld = epl_sensor_obj; + bool enable_als = epld->enable_lflag==1 && epld->als_suspend==0; + void __user *argp = (void __user *)arg; + + LOG_INFO("als io ctrl cmd %d\n", _IOC_NR(cmd)); + + switch(cmd) + { + case ELAN_EPL8800_IOCTL_GET_LFLAG: + + LOG_INFO("elan ambient-light IOCTL Sensor get lflag \n"); + flag = epld->enable_lflag; + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + + LOG_INFO("elan ambient-light Sensor get lflag %d\n",flag); + break; + + case ELAN_EPL8800_IOCTL_ENABLE_LFLAG: +#if LEADCORE + case LIGHT_SET_ENALBE: +#endif + LOG_INFO("elan ambient-light IOCTL Sensor set lflag \n"); + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + if (flag < 0 || flag > 1) + return -EINVAL; + + if(epld->enable_lflag != flag) + { +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + dynamic_intt_idx = dynamic_intt_init_idx; + epl_sensor.als.integration_time = als_dynamic_intt_intt[dynamic_intt_idx]; + epl_sensor.als.gain = als_dynamic_intt_gain[dynamic_intt_idx]; + dynamic_intt_high_thr = als_dynamic_intt_high_thr[dynamic_intt_idx]; + dynamic_intt_low_thr = als_dynamic_intt_low_thr[dynamic_intt_idx]; + } +#endif + epld->enable_lflag = flag; + + epl_sensor_update_mode(epld->client); + } + + LOG_INFO("elan ambient-light Sensor set lflag %d\n",flag); + break; + + case ELAN_EPL8800_IOCTL_GETDATA: + if(enable_als == 0) + { + epld->enable_lflag = 1; + epl_sensor_update_mode(epld->client); + msleep(30); + } + + if(enable_als == true && polling_flag == true && eint_flag == true && epl_sensor.als.polling_mode == 0) + { + mutex_lock(&sensor_mutex); + epl_sensor_read_als(epld->client); + mutex_unlock(&sensor_mutex); + } +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + buf[0] = dynamic_intt_lux; + LOG_INFO("[%s]: als dynamic_intt_lux = %d \r\n", __func__, dynamic_intt_lux); + } + else +#else + { + buf[0] = epl_sensor.als.data.channels[1]; + LOG_INFO("[%s]: epl_sensor.als.data.channels[1] = %d \r\n", __func__, epl_sensor.als.data.channels[1]); + } +#endif + + if(copy_to_user(argp, &buf , sizeof(buf))) + return -EFAULT; + + break; +#if LEADCORE + case LIGHT_SET_DELAY: + + if (arg > LIGHT_MAX_DELAY) + arg = LIGHT_MAX_DELAY; + else if (arg < LIGHT_MIN_DELAY) + arg = LIGHT_MIN_DELAY; + LOG_INFO("LIGHT_SET_DELAY--%d\r\n",(int)arg); + polling_time = arg; + break; +#endif + default: + LOG_ERR("invalid cmd %d\n", _IOC_NR(cmd)); + return -EINVAL; + } + + return 0; + + +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static struct file_operations epl_sensor_als_fops = +{ + .owner = THIS_MODULE, + .open = epl_sensor_als_open, + .read = epl_sensor_als_read, + .release = epl_sensor_als_release, + .unlocked_ioctl = epl_sensor_als_ioctl +}; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static struct miscdevice epl_sensor_als_device = +{ + .minor = MISC_DYNAMIC_MINOR, +#if LEADCORE + .name = "light", +#else + .name = "elan_als", +#endif + .fops = &epl_sensor_als_fops +}; +/*----------------------------------------------------------------------------*/ +#endif /*SPREAD MARVELL end.........*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_ps_open(struct inode *inode, struct file *file) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + if (epld->ps_opened) + return -EBUSY; + + epld->ps_opened = 1; + + return 0; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_ps_release(struct inode *inode, struct file *file) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + + LOG_FUN(); + + epld->ps_opened = 0; + + return 0; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ + +static int epl259x_read_chip_info(struct i2c_client *client, char *buf) +{ + if(NULL == buf) { + return -1; + } + if(NULL == client) { + *buf = 0; + return -2; + } + + sprintf(buf, "EPL2182"); + printk("[EPL259x] epl259x_read_chip_info %s\n",buf); + return 0; +} + +static long epl_sensor_ps_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int value; + int flag,err =0; + char strbuf[100]; + struct epl_sensor_priv *epld = epl_sensor_obj; + bool enable_ps = epld->enable_pflag==1 && epld->ps_suspend==0; +#if HS_ENABLE + bool enable_hs = epld->enable_hflag==1 && epld->hs_suspend==0; +#endif +#if PS_GES + bool enable_ges = epld->enable_gflag==1 && epld->ges_suspend==0; +#endif + void __user *argp = (void __user *)arg; + + LOG_INFO("ps io ctrl cmd %d\n", _IOC_NR(cmd)); + + //ioctl message handle must define by android sensor library (case by case) + switch(cmd) + { + case ELAN_EPL8800_IOCTL_GET_PFLAG: +#if MARVELL + case LTR_IOCTL_GET_PFLAG: +#endif + LOG_INFO("elan Proximity Sensor IOCTL get pflag \n"); + flag = epld->enable_pflag; + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + + LOG_INFO("elan Proximity Sensor get pflag %d\n",flag); + break; + + case ELAN_EPL8800_IOCTL_ENABLE_PFLAG: +#if LEADCORE + case PROXIMITY_SET_ENALBE: +#elif MARVELL + case LTR_IOCTL_SET_PFLAG: +#endif + LOG_INFO("elan Proximity IOCTL Sensor set pflag \n"); + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + if (flag < 0 || flag > 1) + return -EINVAL; +#if HS_ENABLE + if(enable_hs == 1 && flag == 1) + { + epld->enable_hflag = 0; + if(hs_enable_flag == true) + { + epld->enable_lflag = 1; + hs_enable_flag = false; + } + write_global_variable(epld->client); + LOG_INFO("[%s] Disable HS and recover ps setting \r\n", __func__); + } +#endif +#if PS_GES + if(enable_ges == 1 && flag == 1) + { + epld->enable_gflag = 0; + write_global_variable(epld->client); + ps_ges_enable_flag = true; + LOG_INFO("[%s] Disable GES and recover ps setting \r\n", __func__); + } + else if (ps_ges_enable_flag == true && flag == 0) + { + epld->enable_gflag = 1; + write_global_variable(epld->client); + ps_ges_enable_flag = false; + LOG_INFO("[%s] enable GES and recover ges setting \r\n", __func__); + } +#endif + if(epld->enable_pflag != flag) + { + epld->enable_pflag = flag; + if(flag) + { + wake_lock(&ps_lock); +#if PS_DYN_K + dynk_min_ps_raw_data = 0xffff; + dynk_change_flag = false; +#if PS_DYN_K_STR + dynk_enhance_flag = false; +#endif +#endif + }else{ +#if PS_DYN_K + cancel_delayed_work(&dynk_thd_polling_work); +#endif + wake_unlock(&ps_lock); + } + epl_sensor_update_mode(epld->client); + } + + LOG_INFO("elan Proximity Sensor set pflag %d\n",flag); + break; + + case ELAN_EPL8800_IOCTL_GETDATA: + if(enable_ps == 0) + { + epld->enable_pflag = 1; + epl_sensor_update_mode(epld->client); + msleep(30); + } + + if(enable_ps == true && polling_flag == true && eint_flag == true && epl_sensor.ps.polling_mode == 0) + { + mutex_lock(&sensor_mutex); + epl_sensor_read_ps(epld->client); + mutex_unlock(&sensor_mutex); + } + + LOG_INFO("[%s]: epl_sensor.ps.data.data = %d \r\n", __func__, epl_sensor.ps.data.data); + + value = epl_sensor.ps.data.data; + if(copy_to_user(argp, &value , sizeof(value))) + return -EFAULT; + + LOG_INFO("elan proximity Sensor get data (%d) \n",value); + break; +#if LEADCORE + case PROXIMITY_SET_DELAY: + if (arg > PROXIMITY_MAX_DELAY) + arg = PROXIMITY_MAX_DELAY; + else if (arg < PROXIMITY_MIN_DELAY) + arg = PROXIMITY_MIN_DELAY; + LOG_INFO("PROXIMITY_SET_DELAY--%d\r\n",(int)arg); + polling_time = arg; + break; +#endif + +#if SPREAD || MARVELL /*SPREAD MARVELL start.....*/ + case ELAN_EPL8800_IOCTL_GET_LFLAG: +#if MARVELL + case LTR_IOCTL_GET_LFLAG: +#endif + LOG_INFO("elan ambient-light IOCTL Sensor get lflag \n"); + flag = epld->enable_lflag; + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + + LOG_INFO("elan ambient-light Sensor get lflag %d\n",flag); + break; + + case ELAN_EPL8800_IOCTL_GET_CHIPINFO: + err = epl259x_read_chip_info(this_client, strbuf); + if(err < 0) + return -EFAULT; + if(copy_to_user(argp, strbuf, strlen(strbuf)+1)) + return -EFAULT; + break; + + case ELAN_EPL8800_IOCTL_ENABLE_LFLAG: +#if MARVELL + case LTR_IOCTL_SET_LFLAG: +#endif + LOG_INFO("elan ambient-light IOCTL Sensor set lflag \n"); + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + if (flag < 0 || flag > 1) + return -EINVAL; + + if(epld->enable_lflag != flag) + { +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + dynamic_intt_idx = dynamic_intt_init_idx; + epl_sensor.als.integration_time = als_dynamic_intt_intt[dynamic_intt_idx]; + epl_sensor.als.gain = als_dynamic_intt_gain[dynamic_intt_idx]; + dynamic_intt_high_thr = als_dynamic_intt_high_thr[dynamic_intt_idx]; + dynamic_intt_low_thr = als_dynamic_intt_low_thr[dynamic_intt_idx]; + } +#endif + epld->enable_lflag = flag; + + epl_sensor_update_mode(epld->client); + } + + LOG_INFO("elan ambient-light Sensor set lflag %d\n",flag); + break; +#if 0 + case ELAN_EPL8800_IOCTL_GETDATA: + if(enable_als == 0) + { + epld->enable_lflag = 1; + epl_sensor_update_mode(epld->client); + msleep(30); + } + + if(enable_als == true && polling_flag == true && eint_flag == true && epl_sensor.als.polling_mode == 0) + { + mutex_lock(&sensor_mutex); + epl_sensor_read_als(epld->client); + mutex_unlock(&sensor_mutex); + } +#if ALS_DYN_INTT + if(epl_sensor.als.report_type == CMC_BIT_DYN_INT) + { + buf[0] = dynamic_intt_lux; + LOG_INFO("[%s]: als dynamic_intt_lux = %d \r\n", __func__, dynamic_intt_lux); + } + else +#else + { + buf[0] = epl_sensor.als.data.channels[1]; + LOG_INFO("[%s]: epl_sensor.als.data.channels[1] = %d \r\n", __func__, epl_sensor.als.data.channels[1]); + } +#endif + + if(copy_to_user(argp, &buf , sizeof(buf))) + return -EFAULT; + + break; +#endif +#endif /*SPREAD MARVELL end......*/ + default: + LOG_ERR("invalid cmd %d\n", _IOC_NR(cmd)); + return -EINVAL; + } + + return 0; + +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static struct file_operations epl_sensor_ps_fops = +{ + .owner = THIS_MODULE, + .open = epl_sensor_ps_open, + .release = epl_sensor_ps_release, + .unlocked_ioctl = epl_sensor_ps_ioctl +}; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static struct miscdevice epl_sensor_ps_device = +{ + .minor = MISC_DYNAMIC_MINOR, +#if LEADCORE + .name = "proximity", +#elif MARVELL + .name = "alps_pxy", +#elif SPREAD + .name = "epl2182_pls", +#endif + .fops = &epl_sensor_ps_fops +}; + +#if !(SPREAD || MARVELL) /*SPREAD MARVELL start.....*/ +/*----------------------------------------------------------------------------*/ +static ssize_t light_enable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_INFO("%s: ALS_status=%d\n", __func__, epld->enable_lflag); + return sprintf(buf, "%d\n", epld->enable_lflag); +} + +static ssize_t light_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + uint16_t als_enable = 0; + LOG_INFO("light_enable_store: enable=%s \n", buf); + + sscanf(buf, "%hu",&als_enable); + + if(epld->enable_lflag != als_enable) + { + epld->enable_lflag = als_enable; + + epl_sensor_update_mode(epld->client); + } + + return size; +} +/*----------------------------------------------------------------------------*/ +static struct device_attribute dev_attr_light_enable = +__ATTR(enable, S_IRWXUGO, + light_enable_show, light_enable_store); + +static struct attribute *light_sysfs_attrs[] = { + &dev_attr_light_enable.attr, + NULL +}; + +static struct attribute_group light_attribute_group = { + .attrs = light_sysfs_attrs, +}; +/*----------------------------------------------------------------------------*/ +static int epl_sensor_setup_lsensor(struct epl_sensor_priv *epld) +{ + int err = 0; + LOG_INFO("epl_sensor_setup_lsensor enter.\n"); + + epld->als_input_dev = input_allocate_device(); + if (!epld->als_input_dev) + { + LOG_ERR( "could not allocate ls input device\n"); + return -ENOMEM; + } + epld->als_input_dev->name = ElanALsensorName; + set_bit(EV_ABS, epld->als_input_dev->evbit); + input_set_abs_params(epld->als_input_dev, ABS_MISC, 0, 9, 0, 0); + + err = input_register_device(epld->als_input_dev); + if (err < 0) + { + LOG_ERR("can not register ls input device\n"); + goto err_free_ls_input_device; + } + + err = misc_register(&epl_sensor_als_device); + if (err < 0) + { + LOG_ERR("can not register ls misc device\n"); + goto err_unregister_ls_input_device; + } + + err = sysfs_create_group(&epld->als_input_dev->dev.kobj, &light_attribute_group); + + if (err) { + pr_err("%s: could not create sysfs group\n", __func__); + goto err_free_ls_input_device; + } + return err; + + +err_unregister_ls_input_device: + input_unregister_device(epld->als_input_dev); +err_free_ls_input_device: + input_free_device(epld->als_input_dev); + return err; +} +#endif /*SPREAD MARVELL end.....*/ +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static ssize_t proximity_enable_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_INFO("%s: PS status=%d\n", __func__, epld->enable_pflag); + return sprintf(buf, "%d\n", epld->enable_pflag); +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static ssize_t proximity_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + uint16_t ps_enable = 0; +#if HS_ENABLE + bool enable_hs = epld->enable_hflag==1 && epld->hs_suspend==0; +#endif +#if PS_GES + bool enable_ges = epld->enable_gflag==1 && epld->ges_suspend==0; +#endif + LOG_INFO("proximity_enable_store: enable=%s \n", buf); + + sscanf(buf, "%hu",&ps_enable); + +#if HS_ENABLE + if(enable_hs == 1 && ps_enable == 1) + { + epld->enable_hflag = 0; + if(hs_enable_flag == true) + { + epld->enable_lflag = 1; + hs_enable_flag = false; + } + write_global_variable(epld->client); + LOG_INFO("[%s] Disable HS and recover ps setting \r\n", __func__); + } +#endif +#if PS_GES + if(enable_ges == 1 && ps_enable == 1) + { + epld->enable_gflag = 0; + write_global_variable(epld->client); + ps_ges_enable_flag = true; + LOG_INFO("[%s] Disable GES and recover ps setting \r\n", __func__); + } + else if (ps_ges_enable_flag == true && ps_enable == 0) + { + epld->enable_gflag = 1; + write_global_variable(epld->client); + ps_ges_enable_flag = false; + LOG_INFO("[%s] enable GES and recover ges setting \r\n", __func__); + } +#endif + if(epld->enable_pflag != ps_enable) + { + epld->enable_pflag = ps_enable; + if(ps_enable) + { + wake_lock(&ps_lock); +#if PS_DYN_K + dynk_min_ps_raw_data = 0xffff; + dynk_change_flag = false; +#if PS_DYN_K_STR + dynk_enhance_flag = false; +#endif +#endif + } + else + { +#if PS_DYN_K + cancel_delayed_work(&dynk_thd_polling_work); +#endif + wake_unlock(&ps_lock); + } + + epl_sensor_update_mode(epld->client); + } + + return size; +} +/*----------------------------------------------------------------------------*/ +static struct device_attribute dev_attr_psensor_enable = +__ATTR(enable, S_IRWXUGO, + proximity_enable_show, proximity_enable_store); + +static struct attribute *proximity_sysfs_attrs[] = { + &dev_attr_psensor_enable.attr, + NULL +}; + +static struct attribute_group proximity_attribute_group = { + .attrs = proximity_sysfs_attrs, +}; +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_setup_psensor(struct epl_sensor_priv *epld) +{ + int err = 0; + LOG_INFO("epl_sensor_setup_psensor enter.\n"); + + + epld->ps_input_dev = input_allocate_device(); + if (!epld->ps_input_dev) + { + LOG_ERR("could not allocate ps input device\n"); + return -ENOMEM; + } + epld->ps_input_dev->name = ElanPsensorName; + + set_bit(EV_ABS, epld->ps_input_dev->evbit); + input_set_abs_params(epld->ps_input_dev, ABS_DISTANCE, 0, 1, 0, 0); +#if 1 + set_bit(EV_ABS, epld->ps_input_dev->evbit); + input_set_abs_params(epld->ps_input_dev, ABS_MISC, 0, 9, 0, 0); +#endif + + err = input_register_device(epld->ps_input_dev); + if (err < 0) + { + LOG_ERR("could not register ps input device\n"); + goto err_free_ps_input_device; + } + + err = misc_register(&epl_sensor_ps_device); + if (err < 0) + { + LOG_ERR("could not register ps misc device\n"); + goto err_unregister_ps_input_device; + } + + err = sysfs_create_group(&epld->ps_input_dev->dev.kobj, &proximity_attribute_group); + + if (err) { + pr_err("%s: PS could not create sysfs group\n", __func__); + goto err_free_ps_input_device; + } + + return err; + +err_unregister_ps_input_device: + input_unregister_device(epld->ps_input_dev); +err_free_ps_input_device: + input_free_device(epld->ps_input_dev); + return err; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +#ifdef CONFIG_SUSPEND +static int epl_sensor_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + epld->als_suspend=1; +#if HS_ENABLE + epld->hs_suspend=1; +#endif +#if PS_GES + epld->ges_suspend = 1; + ps_ges_suspend_flag = true; +#endif + if(epld->enable_pflag == 1){ + //epld->ps_suspend=0; + LOG_INFO("[%s]: ps enable \r\n", __func__); + } + else{ + //epld->ps_suspend=1; + LOG_INFO("[%s]: ps disable \r\n", __func__); + epl_sensor_update_mode(epld->client); + } + + return 0; +} + +static int epl_sensor_resume(struct i2c_client *client) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + epld->als_suspend=0; + epld->ps_suspend=0; +#if HS_ENABLE + epld->hs_suspend=0; +#endif +#if PS_GES + epld->ges_suspend = 0; +#endif + if(epld->enable_pflag == 1){ + //epld->ps_suspend=0; + LOG_INFO("[%s]: ps enable \r\n", __func__); + epl_sensor_restart_polling(); + } + else{ + //epld->ps_suspend=1; + LOG_INFO("[%s]: ps disable \r\n", __func__); + epl_sensor_update_mode(epld->client); + } + +#if !defined(CONFIG_HAS_EARLYSUSPEND) && PS_GES + ps_ges_suspend_flag = false; +#endif + return 0; +} +#endif + +/*----------------------------------------------------------------------------*/ +#if defined(CONFIG_HAS_EARLYSUSPEND) +static void epl_sensor_early_suspend(struct early_suspend *h) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + epld->als_suspend=1; +#if HS_ENABLE + epld->hs_suspend=1; +#endif +#if PS_GES + epld->ges_suspend = 1; + ps_ges_suspend_flag = true; +#endif + if(epld->enable_pflag == 1) + { + //epld->ps_suspend=0; + LOG_INFO("[%s]: ps enable \r\n", __func__); + } + else + { + //epld->ps_suspend=1; + LOG_INFO("[%s]: ps disable \r\n", __func__); + epl_sensor_update_mode(epld->client); + } + +} + +static void epl_sensor_late_resume(struct early_suspend *h) +{ + struct epl_sensor_priv *epld = epl_sensor_obj; + LOG_FUN(); + + epld->als_suspend=0; + epld->ps_suspend=0; +#if HS_ENABLE + epld->hs_suspend=0; +#endif +#if PS_GES + epld->ges_suspend = 0; +#endif + if(epld->enable_pflag == 1){ + //epld->ps_suspend=0; + LOG_INFO("[%s]: ps enable \r\n", __func__); + epl_sensor_restart_polling(); + } + else{ + //epld->ps_suspend=1; + LOG_INFO("[%s]: ps disable \r\n", __func__); + epl_sensor_update_mode(epld->client); + } +#if PS_GES + ps_ges_suspend_flag = false; +#endif +} +#endif +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_probe(struct i2c_client *client,const struct i2c_device_id *id) +{ + int err = 0; + struct epl_sensor_priv *epld ; + struct elan_epl_platform_data *pdata = client->dev.platform_data; + struct device_node *np = client->dev.of_node; + LOG_INFO("elan sensor probe enter.\n"); + +#ifdef CONFIG_OF + if (np && !pdata){ + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Could not allocate struct elan_epl_platform_data"); + goto exit_allocate_pdata_failed; + } + pdata->irq_gpio_number = of_get_gpio(np, 0); + if(pdata->irq_gpio_number < 0){ + dev_err(&client->dev, "fail to get irq_gpio_number\n"); + kfree(pdata); + goto exit_irq_gpio_read_fail; + } + client->dev.platform_data = pdata; + } +#endif + + epld = kzalloc(sizeof(struct epl_sensor_priv), GFP_KERNEL); + if (!epld) + return -ENOMEM; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + { + dev_err(&client->dev,"No supported i2c func what we need?!!\n"); + err = -ENOTSUPP; + goto i2c_fail; + } + LOG_INFO("chip id REG 0x00 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x00)); + LOG_INFO("chip id REG 0x01 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x01)); + LOG_INFO("chip id REG 0x02 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x02)); + LOG_INFO("chip id REG 0x03 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x03)); + LOG_INFO("chip id REG 0x04 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x04)); + LOG_INFO("chip id REG 0x05 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x05)); + LOG_INFO("chip id REG 0x06 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x06)); + LOG_INFO("chip id REG 0x07 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x07)); + LOG_INFO("chip id REG 0x11 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x11)); + LOG_INFO("chip id REG 0x12 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x12)); + LOG_INFO("chip id REG 0x1B value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x1B)); + LOG_INFO("chip id REG 0x20 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x20)); + LOG_INFO("chip id REG 0x21 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x21)); + LOG_INFO("chip id REG 0x24 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x24)); + LOG_INFO("chip id REG 0x25 value = 0x%x\n", i2c_smbus_read_byte_data(client, 0x25)); + + if((i2c_smbus_read_byte_data(client, 0x21)) != 0x81){ + LOG_INFO("elan ALS/PS sensor is failed. \n"); + goto i2c_fail; + } + + epld->als_level_num = sizeof(epld->als_level)/sizeof(epld->als_level[0]); + epld->als_value_num = sizeof(epld->als_value)/sizeof(epld->als_value[0]); + BUG_ON(sizeof(epld->als_level) != sizeof(als_level)); + memcpy(epld->als_level, als_level, sizeof(epld->als_level)); + BUG_ON(sizeof(epld->als_value) != sizeof(als_value)); + memcpy(epld->als_value, als_value, sizeof(epld->als_value)); + + epld->client = client; + this_client = client; + epld->intr_pin= pdata->irq_gpio_number; + +#if HS_ENABLE + epld->hs_suspend = 0; + mutex_init(&hs_sensor_mutex); +#endif +#if PS_GES + epld->ges_suspend = 0; + epld->gs_input_dev = input_allocate_device(); + set_bit(EV_KEY, epld->gs_input_dev->evbit); + set_bit(EV_REL, epld->gs_input_dev->evbit); + set_bit(EV_ABS, epld->gs_input_dev->evbit); + epld->gs_input_dev->evbit[0] |= BIT_MASK(EV_REP); + epld->gs_input_dev->keycodemax = 500; + epld->gs_input_dev->name ="elan_gesture"; + epld->gs_input_dev->keybit[BIT_WORD(KEYCODE_LEFT)] |= BIT_MASK(KEYCODE_LEFT); + if (input_register_device(epld->gs_input_dev)) + LOG_ERR("register input error\n"); +#endif + i2c_set_clientdata(client, epld); + + epl_sensor_obj = epld; + + INIT_DELAYED_WORK(&epld->eint_work, epl_sensor_eint_work); + + epld->epl_wq = create_workqueue("epl2182_pls"); //create_singlethread_workqueue + if (!epld->epl_wq) + { + LOG_ERR("can't create workqueue\n"); + err = -ENOMEM; + goto err_create_singlethread_workqueue; + } + + mutex_init(&sensor_mutex); + + //initial global variable and write to senosr + initial_global_variable(client, epld); +#if !(SPREAD || MARVELL) + err = epl_sensor_setup_lsensor(epld); + if (err < 0) + { + LOG_ERR("epl_sensor_setup_lsensor error!!\n"); + goto err_lightsensor_setup; + } +#endif + + err = epl_sensor_setup_psensor(epld); + if (err < 0) + { + LOG_ERR("epl_sensor_setup_psensor error!!\n"); + goto err_psensor_setup; + } + + + if (epl_sensor.als.polling_mode==0 || epl_sensor.ps.polling_mode==0) + { + err = epl_sensor_setup_interrupt(epld); + if (err < 0) + { + LOG_ERR("setup error!\n"); + goto err_sensor_setup; + } + } + //disable_irq(epld->irq); //ices add + +#ifdef CONFIG_SUSPEND + +#if defined(CONFIG_HAS_EARLYSUSPEND) + epld->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + epld->early_suspend.suspend = epl_sensor_early_suspend; + epld->early_suspend.resume = epl_sensor_late_resume; + register_early_suspend(&epld->early_suspend); +#endif + +#endif + + wake_lock_init(&ps_lock, WAKE_LOCK_SUSPEND, "ps wakelock"); +#if 0 + sensor_dev = platform_device_register_simple("elan_alsps", -1, NULL, 0); + if (IS_ERR(sensor_dev)) + { + printk ("sensor_dev_init: error\n"); + goto err_fail; + } + + + err = sysfs_create_group(&sensor_dev->dev.kobj, &epl_sensor_attr_group); + if (err !=0) + { + dev_err(&client->dev,"%s:create sysfs group error", __func__); + goto err_fail; + } +#endif + LOG_INFO("sensor probe success.\n"); + return err; + +err_fail: + input_unregister_device(epld->als_input_dev); + input_unregister_device(epld->ps_input_dev); + input_free_device(epld->als_input_dev); + input_free_device(epld->ps_input_dev); +#if !(SPREAD || MARVELL) +err_lightsensor_setup: +#endif +err_psensor_setup: +err_sensor_setup: + destroy_workqueue(epld->epl_wq); + misc_deregister(&epl_sensor_ps_device); +#if !(SPREAD || MARVELL) + misc_deregister(&epl_sensor_als_device); +#endif +err_create_singlethread_workqueue: +i2c_fail: + kfree(epld); +#ifdef CONFIG_OF +exit_irq_gpio_read_fail: +exit_allocate_pdata_failed: +#endif + + return err; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static int epl_sensor_remove(struct i2c_client *client) +{ + struct epl_sensor_priv *epld = i2c_get_clientdata(client); + + dev_dbg(&client->dev, "%s: enter.\n", __func__); +#if defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&epld->early_suspend); +#endif + sysfs_remove_group(&sensor_dev->dev.kobj, &epl_sensor_attr_group); + platform_device_unregister(sensor_dev); + input_unregister_device(epld->als_input_dev); + input_unregister_device(epld->ps_input_dev); +#if !(SPREAD || MARVELL) + input_free_device(epld->als_input_dev); +#endif + input_free_device(epld->ps_input_dev); + misc_deregister(&epl_sensor_ps_device); +#if !(SPREAD || MARVELL) + misc_deregister(&epl_sensor_als_device); +#endif + free_irq(epld->irq,epld); + destroy_workqueue(epld->epl_wq); + kfree(epld); + return 0; +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static const struct i2c_device_id epl_sensor_id[] = +{ + { EPL_DEV_NAME, 0 }, + {} +}; + +#if SPREAD +static struct of_device_id epl_match_table[] = { + { .compatible = "ELAN,epl259x_pls", }, + {} +}; +#endif +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +static struct i2c_driver epl_sensor_driver = +{ + .probe = epl_sensor_probe, + .remove = epl_sensor_remove, + .id_table = epl_sensor_id, + .driver = { + .name = EPL_DEV_NAME, + .owner = THIS_MODULE, +#if SPREAD + .of_match_table =epl_match_table, +#endif + }, +#ifdef CONFIG_SUSPEND + //.suspend = epl_sensor_suspend, + //.resume = epl_sensor_resume, +#endif +}; + +static int __init epl_sensor_init(void) +{ + return i2c_add_driver(&epl_sensor_driver); +} + +static void __exit epl_sensor_exit(void) +{ + i2c_del_driver(&epl_sensor_driver); +} +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +module_init(epl_sensor_init); +module_exit(epl_sensor_exit); +/*----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------*/ +MODULE_AUTHOR("Renato Pan "); +MODULE_DESCRIPTION("ELAN epl259x driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/ewtsa.c b/drivers/input/misc/ewtsa.c new file mode 100644 index 00000000..bdb0b973 --- /dev/null +++ b/drivers/input/misc/ewtsa.c @@ -0,0 +1,2763 @@ +/* + * linux/drivers/input/misc/ewtsa.c + * + * Copyright 2010-2011 Panasonic Electronic Devices. All Rights Reserved. + */ + +/* + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +/*include files*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* configurable */ +#define GYRO_MOUNT_SWAP_XY 0 /* swap X, Y */ +#define GYRO_MOUNT_REVERSE_X 0 /* reverse X */ +#define GYRO_MOUNT_REVERSE_Y 0 /* reverse Y */ +#define GYRO_MOUNT_REVERSE_Z 0 /* reverse Z */ +#define GYRO_VER3_ES1 0 +#define GYRO_VER3_ES3 0 +#define GYRO_VER3_ES4 1 +#define GYRO_REGISTER_MAP2 0 +#define GYRO_SPI_INTERFACE 0 + +#define USE_GPIO_DRDY_PIN 0 +#define USE_GPIO_DIAG_PIN 0 +#define USE_GPIO_WINDOW_PIN 0 + +/* macro defines */ +#define CHIP_ID 0x68 +#define DEVICE_NAME "ewtsa" +#define EWTSA_ON 1 +#define EWTSA_OFF 0 +#define WINDOW_PIN 14 +#define DRDY_PIN 12 +#define DIAG_PIN 11 +#define DIAG_ENABLE 0 +#define DIAG_DISABLE 1 +#define MAX_VALUE 32768 + +/* ewtsa_delay parameter */ +#define DELAY_THRES_MIN 1 +#define DELAY_THRES_1 4 +#define DELAY_THRES_2 9 /* msec x 90% */ +#define DELAY_THRES_3 18 +#define DELAY_THRES_4 45 +#define DELAY_THRES_5 90 +#define DELAY_THRES_6 128 +#define DELAY_THRES_MAX 255 +#define DELAY_DLPF_0 0 +#define DELAY_DLPF_1 1 +#define DELAY_DLPF_2 2 +#define DELAY_DLPF_3 3 +#define DELAY_DLPF_4 4 +#define DELAY_DLPF_5 5 +#define DELAY_DLPF_6 6 +#define DELAY_INTMIN_THRES 9 +#define DELAY_INT8K_THRES 79 +#define DELAY_THRES_FIFO 150 + +/* ewtsa_range parameter */ +#define DYNRANGE_250 0x00 +#define DYNRANGE_500 0x01 +#define DYNRANGE_1000 0x02 +#define DYNRANGE_2000 0x03 + +#define DATA_RATE_1 0x01 +#define DATA_RATE_5 0x05 +#define DATA_RATE_8 0x08 +#define DATA_RATE_10 0x0A + +/* ewtsa_sleep parameter */ +#define SLEEP_OFF 0 +#define SLEEP_ON 1 +#define SLEEP_ALLRESET 2 + +/* ewtsa_calib parameter */ +#define BOOST_TIME_500MS 0 +#define BOOST_TIME_300MS 1 +#define BOOST_TIME_200MS 2 +#define BOOST_TIME_100MS 3 +#define BOOST_FS_48KHZ 0 +#define BOOST_FS_16KHZ 1 +#define HPF_001HZ 0 +#define HPF_002HZ 1 +#define MASK_CLIP 0 +#define MASK_NON_CLIP 1 +#define THRESHOLD_ON 0 +#define THRESHOLD_OFF 1 +#define LAG_NON 0 +#define LAG_5SMP 1 +#define LAG_10SMP 2 +#define LAG_20SMP 3 +#define W1_THRES_LEVEL_2DPS 0 +#define W1_THRES_LEVEL_5DPS 1 +#define W1_THRES_LEVEL_10DPS 2 +#define W1_THRES_LEVEL_15DPS 3 +#define REFERENCE_WAIT 16 +#define W1_THRES_CENTER_COEF 25000 +#define CALIB_FS_62_5HZ 0 +#define CALIB_FS_31_25HZ 1 + +/* ewtsa_configuration parameter */ +#define BYPASS_MODE 0 +#define FIFO_MODE 1 +#define FIFO_MAX 32 +#define FIFO_MIN_DELAY 5 +#define MAP_NAME_SIZE 4 +#define INTERFACE_NAME_SIZE 3 +#define CMD_SIZE_3 3 +#define CMD_SIZE_4 4 +#define THRES_CENTER_MIN 0 +#define THRES_CENTER_MAX 359 +#define THRES_CENTER_INIT_X 160 +#define THRES_CENTER_INIT_Y 160 +#define THRES_CENTER_INIT_Z 160 + +/* EWTSA_system_restart parameter */ +#define RST_REG_INIT_OFF 0x00 +#define RST_REG_INIT_RANGE 0x01 +#define RST_REG_INIT_DELAY 0x02 +#define RST_REG_INIT_ALL 0xFF + +/* event mode */ +#define EWTSA_POLLING_MODE 0 +#define EWTSA_INTERUPT_MODE 1 + +/* ewtsa register address */ +#define REG_SLAD 0x00 +#define REG_FIFO_DRDY 0x10 +#define REG_FIFO_CTRL1 0x13 +#define REG_FIFO_CTRL2 0x14 +#define REG_DATA_RATE 0x15 +#define REG_FS_DLPF_CTRL 0x16 +#define REG_INT_CTRL 0x17 +#define REG_CTRL_REG2 0x18 +#define REG_CTRL_REG3 0x19 +#define REG_INT_STAT 0x1A +#define REG_TEMP_H 0x1B +#define REG_TEMP_L 0x1C +#define REG_OUTX_H 0x1D +#define REG_OUTX_L 0x1E +#define REG_OUTY_H 0x1F +#define REG_OUTY_L 0x20 +#define REG_OUTZ_H 0x21 +#define REG_OUTZ_L 0x22 +#define REG_CTRL_REG5 0x24 +#define REG_REFERENCE 0x25 +#define REG_STATUS_REG 0x27 +#define REG_DIGITAL_CAL 0x29 +#define REG_DIAG_CTRL 0x2B +#define REG_FIFO_DM 0x2F +#define REG_DIAG_MONI 0x39 +#define REG_SLEEP_CTRL 0x3E +#define REG_W1THX_H 0x46 +#define REG_W1THX_L 0x47 +#define REG_W1THY_H 0x48 +#define REG_W1THY_L 0x49 +#define REG_W1THZ_H 0x4A +#define REG_W1THZ_L 0x4B +#define REG_SOC_CNT1 0x4C +#define REG_SOC_CNT2 0x4D +#define REG_SLFSLP_CNT 0x4F +#define REG_SPITYPE 0x60 +#define REG_MBURST_ALL 0xFF + +/* ewtsa register map2 address */ +#define REG2_CTRL_REG1 0x20 + +/* ewtsa register param */ +#define INT_CTRL_WTMON_ENABLE 0x0D +#define INT_CTRL_WTMON_DISABLE 0x00 +#define DIGITAL_CAL_ENABLE 0x00 +#define DIGITAL_CAL_DISABLE 0x01 +#define SLEEP_CTRL_ACTIVATE 0x44 +#define SLEEP_CTRL_SLEEP 0x04 +#define SLEEP_CTRL_ALLRSTSLEEP 0x00 +#define SLEEP_CTRL_LOGIC_RST 0x80 +#define SOC_CNT1_BOOST_ON 0x01 +#define SOC_CNT1_WIN_DIS 0x70 +#define SOC_CNT2_SOCCLK_ON 0x40 +#define SOC_CNT2_SOCCLK_OFF 0x00 +#define INT_CTRL_INT_ENABLE 0x01 +#define INT_CTRL_INT_DISABLE 0x00 +#define INT_CTRL_INT_WTMON_EN 0x08 +#define CTRL_REG2_REF_MODE 0x10 +#define CTRL_REG2_NOR_MODE 0x60 +#define CTRL_REG2_HPCF 0x09 +#define CTRL_REG5_FIFO_EN 0x53 +#define CTRL_REG5_INIT 0x13 +#define FIFO_DRDY_DITH_EN 0x02 +#define FIFO_DRDY_INIT 0x17 +#define CTRL_REG3_WTM_DIS 0x00 +#define CTRL_REG3_WTM_EN 0x04 +#define STATUS_REG_OVERRUN 0xF0 +#define FIFO_CTRL1_CLEAR 0x02 + +/* ewtsa register map2 param */ +#define CTRL_REG1_SLEEP 0x07 +#define CTRL_REG1_ACTIVATE 0x0F + +/* ewtsa interrupt control */ +#define EWSTA_INT_CLEAR 0x00 +#define EWSTA_INT_SKIP 0x01 + +/* EWTSA_set_calibration param */ +#define EWTSA_RANGE_0 250 +#define EWTSA_RANGE_1 500 +#define EWTSA_RANGE_2 1000 +#define EWTSA_RANGE_3 2000 +#define EWTSA_BOOST_TIME_0 500 +#define EWTSA_BOOST_TIME_1 300 +#define EWTSA_BOOST_TIME_2 200 +#define EWTSA_BOOST_TIME_3 100 +#define EWTSA_W1_THRES_LV_0 2 +#define EWTSA_W1_THRES_LV_1 5 +#define EWTSA_W1_THRES_LV_2 10 +#define EWTSA_W1_THRES_LV_3 15 + +/* init param */ +#define SLEEP_INIT_VAL SLEEP_ALLRESET +#define FIFO_TYPE_INIT_VAL BYPASS_MODE +#define DELAY_INIT_VAL DELAY_THRES_1 +#define RANGE_INIT_VAL DYNRANGE_1000 +#define DLPF_INIT_VAL DELAY_DLPF_2 +#define CALIB_FUNC_INIT_VAL EWTSA_ON +#if GYRO_VER3_ES4 +#define CALIB_BTIM_INIT_VAL BOOST_TIME_100MS +#else +#define CALIB_BTIM_INIT_VAL BOOST_TIME_500MS +#endif +#define CALIB_FS_INIT_VAL CALIB_FS_62_5HZ +#define CALIB_RST_INIT_VAL EWTSA_ON +#define CALIB_BFS_INIT_VAL BOOST_FS_48KHZ +#define CALIB_CLK_INIT_VAL EWTSA_ON +#define CALIB_HPF_INIT_VAL HPF_002HZ +#if GYRO_VER3_ES4 +#define CALIB_LAG_INIT_VAL LAG_5SMP +#else +#define CALIB_LAG_INIT_VAL LAG_10SMP +#endif +#define W1_FUNC_INIT_VAL THRESHOLD_ON +#define W2_FUNC_INIT_VAL THRESHOLD_OFF +#if GYRO_VER3_ES4 +#define W1_LV_INIT_VAL W1_THRES_LEVEL_5DPS +#define W1_MASK_INIT_VAL MASK_CLIP +#else +#define W1_LV_INIT_VAL W1_THRES_LEVEL_15DPS +#define W1_MASK_INIT_VAL MASK_NON_CLIP +#endif + +/* declarations */ +struct ewtsa_t { + struct i2c_client *client; + struct input_dev *input_dev; + struct workqueue_struct *workqueue; + struct delayed_work input_work; + struct mutex mlock; + spinlock_t slock; + unsigned long delay; + signed short fifo_lastdata[4]; + unsigned short w1_thres_x; + unsigned short w1_thres_y; + unsigned short w1_thres_z; + unsigned char event; + unsigned char range; + unsigned char sleep; + unsigned char dlpf; + unsigned char calib; + unsigned char calib_fs; + unsigned char calib_rst; + unsigned char calib_boost_tm; + unsigned char calib_boost_fs; + unsigned char fifo_mode; + unsigned char fifo_num; + unsigned char fifo_data_flag; + unsigned char reset_param; + unsigned char int_skip; + unsigned char calib_alway; + unsigned char hpf; + unsigned char w1_datamask; + unsigned char w1_thres_en; + unsigned char w2_thres_en; + unsigned char offset_lag; + unsigned char w1_thres_level; + unsigned char reserved; +}; + +static int __init init_ewtsa(void); +static void __exit exit_ewtsa(void); +static ssize_t ewtsa_sleep_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t ewtsa_sleep_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t ewtsa_delay_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t ewtsa_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t ewtsa_range_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t ewtsa_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t ewtsa_calib_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t ewtsa_calib_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t ewtsa_config_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t ewtsa_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static int EWTSA_probe(struct i2c_client *client, const struct i2c_device_id *id); +static int EWTSA_remove(struct i2c_client *client); +static int EWTSA_suspend(struct i2c_client *client, pm_message_t mesg); +static int EWTSA_resume(struct i2c_client *client); +static void EWTSA_report_abs(struct ewtsa_t *ewt); +static void EWTSA_dev_poll(struct work_struct *work); +static void EWTSA_input_work_func(struct work_struct *work); +#if USE_GPIO_DRDY_PIN +static irqreturn_t EWTSA_interrupt(int irq, void *dev_id); +#endif +static void EWTSA_system_restart(struct ewtsa_t *ewtsa); +static void EWTSA_set_calibration(struct ewtsa_t *ewtsa); + +static struct device_attribute ewtsa_sleep_attr = { + .attr = { + .name = "ewtsa_sleep", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ewtsa_sleep_show, + .store = ewtsa_sleep_store, +}; + +static struct device_attribute ewtsa_delay_attr = { + .attr = { + .name = "ewtsa_delay", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ewtsa_delay_show, + .store = ewtsa_delay_store, +}; + +static struct device_attribute ewtsa_range_attr = { + .attr = { + .name = "ewtsa_range", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ewtsa_range_show, + .store = ewtsa_range_store, +}; + +static struct device_attribute ewtsa_calib_attr = { + .attr = { + .name = "ewtsa_calib", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ewtsa_calib_show, + .store = ewtsa_calib_store, +}; + +static struct device_attribute ewtsa_config_attr = { + .attr = { + .name = "ewtsa_configuration", + .mode = S_IRUGO | S_IWUSR, + }, + .show = ewtsa_config_show, + .store = ewtsa_config_store, +}; + +static const struct i2c_device_id ewtsa_id[] = { + {"ewtsa", 0}, + {{0}, 0} +}; + +MODULE_DEVICE_TABLE(i2c, ewtsa_id); + +static struct i2c_driver i2c_ewtsa_driver = { + .driver = { + .name = "ewtsa", + }, + .probe = EWTSA_probe, + .remove = EWTSA_remove, + .suspend = EWTSA_suspend, + .resume = EWTSA_resume, + .id_table = ewtsa_id, +}; + +/* show the sleep mode */ +static ssize_t ewtsa_sleep_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa; +#if !GYRO_VER3_ES1 + int ret; + unsigned char val; +#endif /* GYRO_VER3_ES1 */ + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* output buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + +#if GYRO_VER3_ES1 + return sprintf(buf, "%d\n", ewtsa->sleep); +#else /* GYRO_VER3_ES1 */ + ret = i2c_smbus_read_byte_data(ewtsa->client, REG_SLEEP_CTRL); + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL read err(ret = %d)\n", ret); + return ret; + } + val = (unsigned char)ret; + + /* REG_SLEEP_CTRL register value check */ + if ((val & SLEEP_CTRL_ACTIVATE) == SLEEP_CTRL_ACTIVATE) { + val = SLEEP_OFF; + } + else if ((val & SLEEP_CTRL_SLEEP) == SLEEP_CTRL_SLEEP) { + val = SLEEP_ON; + } + else { + val = SLEEP_ALLRESET; + } + + return sprintf(buf, "%d\n", val); +#endif /* GYRO_VER3_ES1 */ +} + +/* Set the sleep mode */ +static ssize_t ewtsa_sleep_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + u8 reg; + struct i2c_client *client; + struct ewtsa_t *ewtsa; + unsigned char val; + unsigned char before_sleep; + s32 ret; +#if GYRO_VER3_ES1 || USE_GPIO_DRDY_PIN + int err; +#endif /* GYRO_VER3_ES1 */ + long chk_param; + unsigned long l_flags = 0; +#if GYRO_VER3_ES1 + unsigned char map2_flag = EWTSA_OFF; +#endif /* GYRO_VER3_ES1 */ + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* input buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + + chk_param = simple_strtol(buf, NULL, 10); + if ((chk_param < SLEEP_OFF) || (chk_param >SLEEP_ALLRESET)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", chk_param); + return -EINVAL; + } + val = (unsigned char)chk_param; + + dev_info(&ewtsa->client->dev, "set SLEEP = %d\n", val); + +#if GYRO_VER3_ES1 + /* if current status is same */ + if (ewtsa->sleep == val) { + return count; + } +#else /* GYRO_VER3_ES1 */ + ret = i2c_smbus_read_byte_data(ewtsa->client, REG_SLEEP_CTRL); + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL read err(ret = %d)\n", ret); + return ret; + } + reg = (u8)ret; + + /* REG_SLEEP_CTRL register value check */ + if ((reg & SLEEP_CTRL_ACTIVATE) == SLEEP_CTRL_ACTIVATE) { + reg = SLEEP_OFF; + } + else if ((reg & SLEEP_CTRL_SLEEP) == SLEEP_CTRL_SLEEP) { + reg = SLEEP_ON; + } + else { + reg = SLEEP_ALLRESET; + } + + /* if current status is same */ + if (reg == val) { + return count; + } +#endif /* GYRO_VER3_ES1 */ + + before_sleep = ewtsa->sleep; + switch(val) + { + case SLEEP_OFF: +#if GYRO_VER3_ES1 + if (ewtsa->sleep == SLEEP_ON) { + reg = CTRL_REG1_ACTIVATE; + map2_flag = EWTSA_ON; + } + else { + reg = SLEEP_CTRL_ACTIVATE; + } +#else /* GYRO_VER3_ES1 */ + reg = SLEEP_CTRL_ACTIVATE; +#endif /* GYRO_VER3_ES1 */ + break; + case SLEEP_ON: + if (ewtsa->sleep == SLEEP_ALLRESET) { + return count; + } + reg = SLEEP_CTRL_SLEEP; + ewtsa->calib_rst = EWTSA_ON; + break; + default: /* SLEEP_ALLRESET */ + reg = SLEEP_CTRL_ALLRSTSLEEP; + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param = RST_REG_INIT_ALL; + break; + } + + if (ewtsa->event != EWTSA_POLLING_MODE) { + /* disable interrupt */ + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, INT_CTRL_INT_DISABLE); + if (ret < 0) + { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", INT_CTRL_INT_DISABLE, ret); + return ret; + } + } + + dev_info(&ewtsa->client->dev, "set reg = 0x%02x\n", reg); +#if GYRO_VER3_ES1 + if (map2_flag == EWTSA_ON) { + ret = i2c_smbus_write_byte_data(ewtsa->client, REG2_CTRL_REG1, reg); + } + else { + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, reg); + } +#else /* GYRO_VER3_ES1 */ + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, reg); +#endif /* GYRO_VER3_ES1 */ + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL write err(data = 0x%02x, ret = %d)\n", reg, ret); + return ret; + } + ewtsa->sleep = val; + + if (val != SLEEP_OFF) { + if (ewtsa->event == EWTSA_POLLING_MODE) { + cancel_delayed_work(&ewtsa->input_work); + } + } + else { + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_DIAG_CTRL, DIAG_ENABLE); + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_DIAG_CTRL write err(data = 0x%02x, ret = %d)\n", DIAG_ENABLE, ret); + return ret; + } + if (ewtsa->event == EWTSA_POLLING_MODE) { + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, INT_CTRL_WTMON_DISABLE); /* No INT */ + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", INT_CTRL_WTMON_DISABLE, ret); + return ret; + } + } + + if (ewtsa->calib_rst == EWTSA_ON) { + EWTSA_system_restart(ewtsa); + } + if (ewtsa->event == EWTSA_POLLING_MODE) { + /* polling timer start */ + queue_delayed_work(ewtsa->workqueue, + &ewtsa->input_work, + msecs_to_jiffies(ewtsa->delay)); + } + } + + if (ewtsa->event == EWTSA_POLLING_MODE) { + mutex_lock(&ewtsa->mlock); + input_report_abs(ewtsa->input_dev, ABS_RY, -1); + input_sync(ewtsa->input_dev); + mutex_unlock(&ewtsa->mlock); + } + else { + spin_lock_irqsave(&ewtsa->slock, l_flags); + input_report_abs(ewtsa->input_dev, ABS_RY, -1); + input_sync(ewtsa->input_dev); + spin_unlock_irqrestore(&ewtsa->slock, l_flags); + + if (val == SLEEP_OFF) { + /* enable interrupt */ +#if USE_GPIO_DRDY_PIN + err = gpio_request(DRDY_PIN, "DRDY"); + err += gpio_direction_input(DRDY_PIN); + err += request_threaded_irq(gpio_to_irq(DRDY_PIN), NULL, EWTSA_interrupt, IRQF_TRIGGER_RISING, DEVICE_NAME, ewtsa); + if (err != 0) { + dev_err(&ewtsa->client->dev, "request_irq err(%d)\n", err); + return err; + } +#endif + + ewtsa->fifo_data_flag = EWTSA_OFF; + memset(ewtsa->fifo_lastdata, 0x00, sizeof(ewtsa->fifo_lastdata)); + ewtsa->int_skip = EWSTA_INT_SKIP; + if (ewtsa->fifo_mode == BYPASS_MODE) { + reg = (u8)INT_CTRL_INT_ENABLE; + } + else { + reg = (u8)(INT_CTRL_INT_ENABLE | INT_CTRL_INT_WTMON_EN); + } + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, reg); + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", reg, ret); + return ret; + } + } + else + { + if (before_sleep == SLEEP_OFF) { +#if USE_GPIO_DRDY_PIN + free_irq(gpio_to_irq(DRDY_PIN), ewtsa); + gpio_free(DRDY_PIN); +#endif + } + } + } + + return count; +} + +/* Show the LPF settings */ +static ssize_t ewtsa_delay_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* output buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + + return sprintf(buf, "%ld\n", ewtsa->delay); +} + +/* Set the LPF settings*/ +static ssize_t ewtsa_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa; + unsigned long delay; + unsigned char val; + unsigned char number; + u8 smpl; + int err; + unsigned char reg; + unsigned char fifo_type; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* input buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + err = strict_strtoul(buf, 0, &delay); + if (err != 0) { + dev_err(&ewtsa->client->dev, "strict_strtoul err(ret = %d)\n", err); + return err; + } + + if (delay == ewtsa->delay) { + return count; + } + + if ((delay < DELAY_THRES_MIN) || (delay > DELAY_THRES_MAX)) { + dev_err(&ewtsa->client->dev, "param err(ret = %ld)\n", delay); + return -EINVAL; + } + + dev_info(&ewtsa->client->dev, "Delay = %ld\n", delay); + + if (ewtsa->sleep == SLEEP_OFF) { + if (ewtsa->event == EWTSA_POLLING_MODE) { + cancel_delayed_work(&ewtsa->input_work); + } + else { + /* disable interrupt */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, INT_CTRL_INT_DISABLE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", INT_CTRL_INT_DISABLE, err); + return err; + } + } + + if (ewtsa->event == EWTSA_POLLING_MODE) { + fifo_type = BYPASS_MODE; + } + else { + fifo_type = ewtsa->fifo_mode; + } + + if (fifo_type == BYPASS_MODE) { + if (delay < DELAY_THRES_4) { + if (delay >= DELAY_THRES_3) { + val = DELAY_DLPF_3; + } else { + val = DELAY_DLPF_2; + } + } else { + if (delay >= DELAY_THRES_6) { + val = DELAY_DLPF_6; + } else if (delay >= DELAY_THRES_5) { + val = DELAY_DLPF_5; + } else { + val = DELAY_DLPF_4; + } + } + } + else { + if (delay <= DELAY_THRES_FIFO) { + val = DELAY_DLPF_1; + } + else { + val = DELAY_DLPF_2; + } + } + + reg = (unsigned char)((unsigned char)(ewtsa->range << 3) | val ); + dev_info(&ewtsa->client->dev, "FS_DLPF = %2X\n", (unsigned int)reg); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FS_DLPF_CTRL, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FS_DLPF_CTRL write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + ewtsa->dlpf = val; + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG5, CTRL_REG5_INIT); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG5 write err(data = 0x%02x, ret = %d)\n", CTRL_REG5_INIT, err); + return err; + } + + if (fifo_type != BYPASS_MODE) { + reg = FIFO_DRDY_DITH_EN; + } + else { + dev_info(&ewtsa->client->dev, "FIFO_CTR = %2X\n", fifo_type); + reg = (unsigned char)(fifo_type << 5); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_CTRL2, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_CTRL2 write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + reg = FIFO_DRDY_INIT; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_DRDY, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_DRDY write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + + if (ewtsa->event == EWTSA_POLLING_MODE) { + smpl = DATA_RATE_1 - 1; /* SMPL = 0 */ + dev_info(&ewtsa->client->dev, "SMPL+1 = %2X\n", smpl); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_DATA_RATE, smpl); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_DATA_RATE write err(data = 0x%02x, ret = %d)\n", smpl, err); + return err; + } + ewtsa->delay = delay; + ewtsa->reset_param &= (unsigned char)~RST_REG_INIT_DELAY; + EWTSA_system_restart(ewtsa); + + queue_delayed_work(ewtsa->workqueue, + &ewtsa->input_work, + msecs_to_jiffies(ewtsa->delay)); + } + else { + if (fifo_type == BYPASS_MODE) { + if (delay <= DELAY_THRES_2) { + smpl = DELAY_INTMIN_THRES; + } + else { + smpl = (unsigned char)(delay - 1); + } + ewtsa->fifo_num = 1; + } + else { + if (delay <= DELAY_THRES_FIFO) { + if (delay > FIFO_MIN_DELAY) { + number = (unsigned char)(delay / DATA_RATE_5); + if ((delay % DATA_RATE_5) != 0) { + number++; + } + } + else { + number = 2; + } + smpl = DATA_RATE_5 - 1; /* SMPL = 4 */ + } + else { + number = (unsigned char)(delay / DATA_RATE_10); + if ((delay % DATA_RATE_10) != 0) { + number++; + } + smpl = DATA_RATE_10 - 1; /* SMPL = 9 */ + } + + reg = (unsigned char)(fifo_type << 5); + reg |= number; + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_CTRL2, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_CTRL2 write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + ewtsa->fifo_num = number; + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG3, CTRL_REG3_WTM_EN); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG3 write err(data = 0x%02x, ret = %d)\n", CTRL_REG3_WTM_EN, err); + return err; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG5, CTRL_REG5_FIFO_EN); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG5 write err(data = 0x%02x, ret = %d)\n", CTRL_REG5_FIFO_EN, err); + return err; + } + } + dev_info(&ewtsa->client->dev, "SMPL+1 = %2X\n", smpl); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_DATA_RATE, smpl); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_DATA_RATE write err(data = 0x%02x, ret = %d)\n", smpl, err); + return err; + } + ewtsa->delay = delay; + ewtsa->reset_param &= (unsigned char)~RST_REG_INIT_DELAY; + EWTSA_system_restart(ewtsa); + + /* enable interrupt */ + ewtsa->fifo_data_flag = EWTSA_OFF; + memset(ewtsa->fifo_lastdata, 0x00, sizeof(ewtsa->fifo_lastdata)); + ewtsa->int_skip = EWSTA_INT_SKIP; + if (fifo_type == BYPASS_MODE) { + reg = (u8)INT_CTRL_INT_ENABLE; + } + else { + reg = (u8)(INT_CTRL_INT_ENABLE | INT_CTRL_INT_WTMON_EN); + } + err = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + } + } + else { + ewtsa->delay = delay; + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param |= RST_REG_INIT_DELAY; + } + + return count; +} + +/* Show the FS settings */ +static ssize_t ewtsa_range_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa ; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* output buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + + return sprintf(buf, "%d\n", ewtsa->range); +} + +/* Set the FS settings*/ +static ssize_t ewtsa_range_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa; + unsigned char val; + s32 err; + unsigned char rng; + u8 reg; + long chk_param; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* input buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + chk_param = simple_strtol(buf, NULL, 10); + if ((chk_param < DYNRANGE_250) || (chk_param > DYNRANGE_2000)) { + dev_info(&ewtsa->client->dev, "invalid value = %ld\n", chk_param); + return -EINVAL; + } + val = (unsigned char)chk_param; + + if (val == ewtsa->range) { + return count; + } + + dev_info(&ewtsa->client->dev, "FS = %d\n", (int)val); + if (ewtsa->sleep == SLEEP_OFF) { + if (ewtsa->event != EWTSA_POLLING_MODE) { + /* disable interrupt */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, INT_CTRL_INT_DISABLE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", INT_CTRL_INT_DISABLE, err); + return err; + } + } + rng = (unsigned char)((unsigned char)(val << 3) | ewtsa->dlpf); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FS_DLPF_CTRL, rng); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FS_DLPF_CTRL write err(data = 0x%02x, ret = %d)\n", rng, err); + return err; + } + ewtsa->range = val; + ewtsa->reset_param &= (unsigned char)~RST_REG_INIT_RANGE; + if (ewtsa->event == EWTSA_POLLING_MODE) { + cancel_delayed_work(&ewtsa->input_work); + EWTSA_system_restart(ewtsa); + queue_delayed_work(ewtsa->workqueue, + &ewtsa->input_work, + msecs_to_jiffies(ewtsa->delay)); + } + else { + EWTSA_system_restart(ewtsa); + + /* enable interrupt */ + ewtsa->fifo_data_flag = EWTSA_OFF; + memset(ewtsa->fifo_lastdata, 0x00, sizeof(ewtsa->fifo_lastdata)); + ewtsa->int_skip = EWSTA_INT_SKIP; + if (ewtsa->fifo_mode == BYPASS_MODE) { + reg = (u8)INT_CTRL_INT_ENABLE; + } + else { + reg = (u8)(INT_CTRL_INT_ENABLE | INT_CTRL_INT_WTMON_EN); + } + err = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + } + } + else { + ewtsa->range = val; + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param |= RST_REG_INIT_RANGE; + } + + return count; +} + +/* Show the SELF O C settings */ +static ssize_t ewtsa_calib_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* output buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + + return sprintf(buf, "%d\n", ewtsa->calib); +} + +/* Set the SELF O C settings*/ +static ssize_t ewtsa_calib_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client; + struct ewtsa_t *ewtsa; + unsigned char val; + s32 err; + u8 reg; + long chk_param; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + client = to_i2c_client(dev); + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + /* input buffer check */ + if (buf == NULL) { + dev_err(&client->dev, "buf pointer null!\n"); + return -EIO; + } + chk_param = simple_strtol(buf, NULL, 10); + if ((chk_param != EWTSA_ON) && (chk_param != EWTSA_OFF)) { + dev_info(&ewtsa->client->dev, "invalid value = %ld\n", chk_param); + return -EINVAL; + } + val = (unsigned char)chk_param; + + dev_info(&ewtsa->client->dev, "SELF_O_C = %d(now = %d)\n", (int)val, ewtsa->calib); + + if (ewtsa->calib == val) { + return count; + } + + ewtsa->calib = val; + if (ewtsa->sleep == SLEEP_OFF) { + if (ewtsa->event == EWTSA_POLLING_MODE) { + cancel_delayed_work(&ewtsa->input_work); + EWTSA_system_restart(ewtsa); + queue_delayed_work(ewtsa->workqueue, + &ewtsa->input_work, + msecs_to_jiffies(ewtsa->delay)); + } + else { + /* disable interrupt */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, INT_CTRL_INT_DISABLE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", INT_CTRL_INT_DISABLE, err); + return err; + } + + EWTSA_system_restart(ewtsa); + + /* enable interrupt */ + ewtsa->fifo_data_flag = EWTSA_OFF; + memset(ewtsa->fifo_lastdata, 0x00, sizeof(ewtsa->fifo_lastdata)); + ewtsa->int_skip = EWSTA_INT_SKIP; + if (ewtsa->fifo_mode == BYPASS_MODE) { + reg = (u8)INT_CTRL_INT_ENABLE; + } + else { + reg = (u8)(INT_CTRL_INT_ENABLE | INT_CTRL_INT_WTMON_EN); + } + err = i2c_smbus_write_byte_data(ewtsa->client, REG_INT_CTRL, reg); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_INT_CTRL write err(data = 0x%02x, ret = %d)\n", reg, err); + return err; + } + } + } + else { + ewtsa->calib_rst = EWTSA_ON; + } + + return count; +} + +/* Show the gyro configurations */ +static ssize_t ewtsa_config_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct i2c_client *l_client; + struct ewtsa_t *ewtsa; + int ret; + ssize_t ret_len = 0; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + l_client = to_i2c_client(dev); + + if (l_client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(l_client); + + /* output buffer check */ + if (buf == NULL) { + dev_err(&ewtsa->client->dev, "buf pointer null!\n"); + return -EIO; + } + +#if GYRO_REGISTER_MAP2 + ret = sprintf(buf+ret_len, "MAP2;"); +#else /* GYRO_REGISTER_MAP2 */ + ret = sprintf(buf+ret_len, "MAP1;"); +#endif /* GYRO_REGISTER_MAP2 */ + if (ret >= 0) { + ret_len += ret; + } + +#if GYRO_SPI_INTERFACE + ret = sprintf(buf+ret_len, "SPI;"); +#else /* GYRO_SPI_INTERFACE */ + ret = sprintf(buf+ret_len, "I2C;"); +#endif /* GYRO_SPI_INTERFACE */ + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "SLP=%d;", ewtsa->sleep); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "DLY=%ld;", ewtsa->delay); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "RNG=%d;", ewtsa->range); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "SOC=%d;", ewtsa->calib); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "SBT=%d;", ewtsa->calib_boost_tm); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "HPF=%d;", ewtsa->hpf); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "SFR=%d;", ewtsa->calib_fs); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "EVE=%d;", ewtsa->event); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "FIFO=%d;", ewtsa->fifo_mode); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "SAA=%d;", ewtsa->calib_alway); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "W1CX=%d;", ewtsa->w1_thres_x); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "W1CY=%d;", ewtsa->w1_thres_y); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "W1CZ=%d;", ewtsa->w1_thres_z); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "BFR=%d;", ewtsa->calib_boost_fs); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "OTL=%d;", ewtsa->offset_lag); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "W1L=%d;", ewtsa->w1_thres_level); + if (ret >= 0) { + ret_len += ret; + } + + ret = sprintf(buf+ret_len, "W1DM=%d;", ewtsa->w1_datamask); + if (ret >= 0) { + ret_len += ret; + } + + return ret_len; +} + +/* Set the gyro configurations */ +static ssize_t ewtsa_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *l_client; + struct ewtsa_t *ewtsa; + char val_char[4] = {0}; + char sleep_val[4] = {0}; + unsigned char cmd[5] = {0}; + unsigned char cmd_size = 0; + unsigned char val_size = 0; + unsigned char sleep_flag = EWTSA_OFF; + unsigned char sleep_mode = SLEEP_ALLRESET; + unsigned char fifo_tmp; + unsigned char event_tmp; + int loop; + int size_err; + unsigned long val = 0; + size_t chk_cnt = 0; + ssize_t sleep_ret; + + if (dev == NULL) { + printk(KERN_INFO "struct device null pointer\n"); + return -EIO; + } + l_client = to_i2c_client(dev); + + if (l_client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(l_client); + + /* input buffer check */ + if (buf == NULL) { + dev_err(&ewtsa->client->dev, "buf pointer null!\n"); + return -EIO; + } + + fifo_tmp = ewtsa->fifo_mode; + event_tmp = ewtsa->event; + + if (strncmp(buf, "MAP", 3) == 0) { + /* get register map information */ +#if GYRO_REGISTER_MAP2 + if (strncmp(buf, "MAP2", MAP_NAME_SIZE) != 0) { + dev_err(&ewtsa->client->dev, "register map unmatch!\n"); + return -EINVAL; + } +#else /* GYRO_REGISTER_MAP2 */ + if (strncmp(buf, "MAP1", MAP_NAME_SIZE) != 0) { + dev_err(&ewtsa->client->dev, "register map unmatch!\n"); + return -EINVAL; + } +#endif /* GYRO_REGISTER_MAP2 */ + buf += MAP_NAME_SIZE + 1; + chk_cnt += MAP_NAME_SIZE + 1; + + /* get communication interface */ +#if GYRO_SPI_INTERFACE + if (strncmp(buf, "SPI", INTERFACE_NAME_SIZE) != 0) { + dev_err(&ewtsa->client->dev, "communication interface unmatch!\n"); + return -EINVAL; + } +#else /* GYRO_SPI_INTERFACE */ + if (strncmp(buf, "I2C", INTERFACE_NAME_SIZE) != 0) { + dev_err(&ewtsa->client->dev, "communication interface unmatch!\n"); + return -EINVAL; + } +#endif /* GYRO_SPI_INTERFACE */ + buf += INTERFACE_NAME_SIZE + 1; + chk_cnt += INTERFACE_NAME_SIZE + 1; + } + + while (chk_cnt < count) { + memset(cmd, 0x00, sizeof(cmd)); + memset(val_char, 0x00, sizeof(val_char)); + size_err = 0; + + for (loop = 0; (chk_cnt + loop) < count; loop++) { + if (*(buf + loop) == '=') { + break; + } + + if (*(buf + loop) == ';') { + dev_err(&ewtsa->client->dev, "command format err\n"); + return -EINVAL; + } + } + + if ((chk_cnt + loop) >= count) { + break; + } + + cmd_size = (unsigned char)loop; + if (cmd_size == 0) { + dev_err(&ewtsa->client->dev, "command nothing\n"); + return -EINVAL; + } + + /* command size over? */ + if (loop > (sizeof(cmd) - 1)) { + size_err = EWTSA_ON; + } + else { + memcpy(cmd, buf, cmd_size); + } + buf += cmd_size + 1; + chk_cnt += cmd_size + 1; + + for (loop = 0; (chk_cnt + loop) < count; loop++) { + if (*(buf + loop) == ';') { + break; + } + } + + if ((chk_cnt + loop) >= count) { + break; + } + + val_size = (unsigned char)loop; + if (val_size == 0) { + dev_err(&ewtsa->client->dev, "value nothing(cmd = %s)\n", cmd); + return -EINVAL; + } + + if (size_err != 0) { + /* if command size is over, value ignore and next command check. */ + buf += val_size + 1; + chk_cnt += val_size + 1; + continue; + } + else if (loop > (sizeof(val_char) - 1)) { + /* if value size is over, return format err. */ + size_err = EWTSA_ON; + } + else { + memcpy(val_char, buf, val_size); + size_err = strict_strtoul(val_char, 10, &val); + } + + if (size_err != 0) { + dev_err(&ewtsa->client->dev, "value format err(cmd = %s)\n", cmd); + return -EINVAL; + } + buf += val_size + 1; + chk_cnt += val_size + 1; + + if (cmd_size == CMD_SIZE_3) { + if (strncmp((char*)cmd, "SLP", CMD_SIZE_3) == 0) { + sleep_flag = EWTSA_ON; + memcpy(sleep_val, val_char, sizeof(sleep_val)); + if (val == 0) { + sleep_mode = SLEEP_OFF; + } + } + else if (strncmp((char*)cmd, "DLY", CMD_SIZE_3) == 0) { + if ((val < DELAY_THRES_MIN) || (val > DELAY_THRES_MAX)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + + ewtsa->delay = val; + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param |= RST_REG_INIT_DELAY; + } + else if (strncmp((char*)cmd, "RNG", CMD_SIZE_3) == 0) { + if (val > DYNRANGE_2000) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->range = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param |= RST_REG_INIT_RANGE; + } + else if (strncmp((char*)cmd, "SOC", CMD_SIZE_3) == 0) { + if ((val != EWTSA_ON) && (val != EWTSA_OFF)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->calib = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "SBT", CMD_SIZE_3) == 0) { + if (val > BOOST_TIME_100MS) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->calib_boost_tm = (unsigned char)val; + } + else if (strncmp((char*)cmd, "HPF", CMD_SIZE_3) == 0) { + if ((val != HPF_001HZ) && (val != HPF_002HZ)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->hpf = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "SFR", CMD_SIZE_3) == 0) { + if ((val != CALIB_FS_62_5HZ) && (val != CALIB_FS_31_25HZ)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->calib_fs = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "EVE", CMD_SIZE_3) == 0) { + if ((val != EWTSA_POLLING_MODE) && (val != EWTSA_INTERUPT_MODE)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } +#if USE_GPIO_DRDY_PIN + event_tmp = (unsigned char)val; +#else + event_tmp = (unsigned char)EWTSA_POLLING_MODE; +#endif + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param = RST_REG_INIT_ALL; + } + else if (strncmp((char*)cmd, "SAA", CMD_SIZE_3) == 0) { + if ((val != EWTSA_ON) && (val != EWTSA_OFF)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->calib_alway = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "BFR", CMD_SIZE_3) == 0) { + if ((val != BOOST_FS_48KHZ) && (val != BOOST_FS_16KHZ)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->calib_boost_fs = (unsigned char)val; + } + else if (strncmp((char*)cmd, "OTL", CMD_SIZE_3) == 0) { + if (val > LAG_20SMP) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->offset_lag = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "W1L", CMD_SIZE_3) == 0) { + if (val > W1_THRES_LEVEL_15DPS) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->w1_thres_level = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else { + dev_info(&ewtsa->client->dev, "unknown command(%s)\n", cmd); + } + } + else if (cmd_size == CMD_SIZE_4) { + if (strncmp((char*)cmd, "FIFO", CMD_SIZE_4) == 0) { + if ((val != BYPASS_MODE) && (val != FIFO_MODE)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + fifo_tmp = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + ewtsa->reset_param = RST_REG_INIT_ALL; + } + else if (strncmp((char*)cmd, "W1CX", CMD_SIZE_4) == 0) { + if (val > THRES_CENTER_MAX) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->w1_thres_x = (unsigned short)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "W1CY", CMD_SIZE_4) == 0) { + if (val > THRES_CENTER_MAX) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->w1_thres_y = (unsigned short)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "W1CZ", CMD_SIZE_4) == 0) { + if (val > THRES_CENTER_MAX) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->w1_thres_z = (unsigned short)val; + ewtsa->calib_rst = EWTSA_ON; + } + else if (strncmp((char*)cmd, "W1DM", CMD_SIZE_4) == 0) { + if ((val != MASK_CLIP) && (val != MASK_NON_CLIP)) { + dev_err(&ewtsa->client->dev, "invalid value = %ld\n", val); + return -EINVAL; + } + ewtsa->w1_datamask = (unsigned char)val; + ewtsa->calib_rst = EWTSA_ON; + } + else { + dev_info(&ewtsa->client->dev, "unknown command(%s)\n", cmd); + } + } + else { + dev_info(&ewtsa->client->dev, "unknown command(%s)\n", cmd); + } + } + + if (sleep_flag == EWTSA_ON) { + if (sleep_mode == SLEEP_OFF) { + /* all reset sleep mode */ + val_char[0] = '2'; + val_char[1] = '\0'; + sleep_ret = ewtsa_sleep_store(dev, attr, val_char, 1); + if (sleep_ret != 1) { + dev_err(&ewtsa->client->dev, "ewtsa_sleep_store err(%d)\n", sleep_ret); + return sleep_ret; + } + ewtsa->event = event_tmp; + ewtsa->fifo_mode = fifo_tmp; + } + sleep_ret = ewtsa_sleep_store(dev, attr, sleep_val, sizeof(sleep_val)); + if (sleep_ret != sizeof(sleep_val)) { + dev_err(&ewtsa->client->dev, "ewtsa_sleep_store err(%d)\n", sleep_ret); + return sleep_ret; + } + ewtsa->event = event_tmp; + ewtsa->fifo_mode = fifo_tmp; + } + else { + if (ewtsa->calib_rst == EWTSA_ON) { + sleep_mode = ewtsa->sleep; + + /* all reset sleep mode */ + val_char[0] = '2'; + val_char[1] = '\0'; + sleep_ret = ewtsa_sleep_store(dev, attr, val_char, 1); + if (sleep_ret != 1) { + dev_err(&ewtsa->client->dev, "ewtsa_sleep_store err(%d)\n", sleep_ret); + return sleep_ret; + } + + ewtsa->event = event_tmp; + ewtsa->fifo_mode = fifo_tmp; + + if (sleep_mode == SLEEP_OFF) { + /* sleep off mode */ + val_char[0] = '0'; + val_char[1] = '\0'; + sleep_ret = ewtsa_sleep_store(dev, attr, val_char, 1); + if (sleep_ret != 1) { + dev_err(&ewtsa->client->dev, "ewtsa_sleep_store err(%d)\n", sleep_ret); + return sleep_ret; + } + } + } + } + + return count; +} + +/* calibration & register settings */ +static void EWTSA_system_restart(struct ewtsa_t *ewtsa) +{ + unsigned char val; + unsigned char smpl; + unsigned char number; + unsigned char fifo_type; + s32 err; +#if GYRO_VER3_ES1 + signed long ret; + signed long timeout; +#endif + + if (ewtsa == NULL) { + printk(KERN_INFO "EWTSA_system_restart:ewtsa null pointer\n"); + return; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_DIGITAL_CAL, DIGITAL_CAL_DISABLE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_DIGITAL_CAL write err(data = 0x%02x, ret = %d)\n", DIGITAL_CAL_DISABLE, err); + return; + } + +#if GYRO_VER3_ES1 + err = i2c_smbus_write_byte_data(ewtsa->client, REG_REFERENCE, 0x00); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_REFERENCE write err(data = 0x00, ret = %d)\n", err); + return; + } + + val = (unsigned char)(CTRL_REG2_REF_MODE | CTRL_REG2_HPCF); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + err = i2c_smbus_read_byte_data(ewtsa->client, REG_REFERENCE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_REFERENCE read err(ret = %d)\n", err); + return; + } + + val = SOC_CNT2_SOCCLK_ON; + val |= (unsigned char)(CALIB_FS_62_5HZ << 7); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + /* Wait reference mode setting */ + ret = (signed long)((REFERENCE_WAIT * HZ)/1000); + ret += (signed long)(1000 / HZ); + while (ret > 0) { + timeout = ret; + set_current_state(TASK_UNINTERRUPTIBLE); + ret = schedule_timeout(timeout); + } + + val = SOC_CNT2_SOCCLK_OFF; + val |= (unsigned char)(CALIB_FS_62_5HZ << 7); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(CTRL_REG2_NOR_MODE | CTRL_REG2_HPCF); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } +#endif /* GYRO_VER3_ES1 */ + + if (ewtsa->event == EWTSA_POLLING_MODE) { + fifo_type = BYPASS_MODE; + } + else { + fifo_type = ewtsa->fifo_mode; + } + + if ((ewtsa->reset_param & RST_REG_INIT_ALL) != RST_REG_INIT_OFF) { + if (fifo_type == BYPASS_MODE) { + if (ewtsa->delay < DELAY_THRES_4) { + if (ewtsa->delay >= DELAY_THRES_3) { + ewtsa->dlpf = DELAY_DLPF_3; + } else { + ewtsa->dlpf = DELAY_DLPF_2; + } + } else { + if (ewtsa->delay >= DELAY_THRES_6) { + ewtsa->dlpf = DELAY_DLPF_6; + } else if (ewtsa->delay >= DELAY_THRES_5) { + ewtsa->dlpf = DELAY_DLPF_5; + } else { + ewtsa->dlpf = DELAY_DLPF_4; + } + } + } + else { + if (ewtsa->delay <= DELAY_THRES_FIFO) { + ewtsa->dlpf = DELAY_DLPF_1; + } + else { + ewtsa->dlpf = DELAY_DLPF_2; + } + } + val = (unsigned char)((unsigned char)(ewtsa->range << 3) | ewtsa->dlpf); + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FS_DLPF_CTRL, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FS_DLPF_CTRL write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + } + + if ((ewtsa->reset_param & RST_REG_INIT_DELAY) != RST_REG_INIT_OFF) { + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG5, CTRL_REG5_INIT); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG5 write err(data = 0x%02x, ret = %d)\n", CTRL_REG5_INIT, err); + return; + } + + if (fifo_type != BYPASS_MODE) { + val = FIFO_DRDY_DITH_EN; + } + else { + val = (unsigned char)(fifo_type << 5); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_CTRL2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_CTRL2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + val = FIFO_DRDY_INIT; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_DRDY, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_DRDY write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + if (fifo_type == BYPASS_MODE) { + if (ewtsa->event == EWTSA_POLLING_MODE) { + smpl = DATA_RATE_1 - 1; /* SMPL = 0 */ + } + else { + if (ewtsa->delay <= DELAY_THRES_2) { + smpl = DELAY_INTMIN_THRES; + } + else { + smpl = (unsigned char)(ewtsa->delay - 1); + } + } + ewtsa->fifo_num = 1; + } + else { + if (ewtsa->delay <= DELAY_THRES_FIFO) { + if (ewtsa->delay > FIFO_MIN_DELAY) { + number = (unsigned char)(ewtsa->delay / DATA_RATE_5); + if ((ewtsa->delay % DATA_RATE_5) != 0) { + number++; + } + } + else { + number = 2; + } + smpl = DATA_RATE_5 - 1; /* SMPL = 4 */ + } + else { + number = (unsigned char)(ewtsa->delay / DATA_RATE_10); + if ((ewtsa->delay % DATA_RATE_10) != 0) { + number++; + } + smpl = DATA_RATE_10 - 1; /* SMPL = 9 */ + } + + val = (unsigned char)(fifo_type << 5); + val |= number; + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_CTRL2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_CTRL2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + ewtsa->fifo_num = number; + + val = CTRL_REG3_WTM_EN; + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG3, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG3 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG5, CTRL_REG5_FIFO_EN); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG5 write err(data = 0x%02x, ret = %d)\n", CTRL_REG5_FIFO_EN, err); + return; + } + } + err = i2c_smbus_write_byte_data(ewtsa->client, REG_DATA_RATE, smpl); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_DATA_RATE write err(data = 0x%02x, ret = %d)\n", smpl, err); + return; + } + } + ewtsa->reset_param = RST_REG_INIT_OFF; + + if (ewtsa->calib == EWTSA_ON) { + EWTSA_set_calibration(ewtsa); + } + else { + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, SLEEP_CTRL_SLEEP); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL write err(data = 0x%02x, ret = %d)\n", SLEEP_CTRL_SLEEP, err); + return; + } + +#if GYRO_VER3_ES1 + err = i2c_smbus_write_byte_data(ewtsa->client, REG2_CTRL_REG1, CTRL_REG1_ACTIVATE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG2_CTRL_REG1 write err(data = 0x%02x, ret = %d)\n", CTRL_REG1_ACTIVATE, err); + return; + } +#else /* GYRO_VER3_ES1 */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, SLEEP_CTRL_ACTIVATE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL write err(data = 0x%02x, ret = %d)\n", SLEEP_CTRL_ACTIVATE, err); + return; + } +#endif /* GYRO_VER3_ES1 */ + + /* FIFO clear */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_CTRL1, FIFO_CTRL1_CLEAR); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_CTRL1 write err(data = 0x02, ret = %d)\n", err); + return; + } + } + + ewtsa->calib_rst = EWTSA_OFF; +} + +static void EWTSA_set_calibration(struct ewtsa_t *ewtsa) +{ + unsigned char val; + s32 err; + signed long ret; + signed long l_timeout; + unsigned long center; + static const unsigned short ewtsa_boost_time[4] = { + EWTSA_BOOST_TIME_0, EWTSA_BOOST_TIME_1, EWTSA_BOOST_TIME_2, EWTSA_BOOST_TIME_3 + }; + static const unsigned char ewtsa_w1_threshold_level[4] = { + EWTSA_W1_THRES_LV_0, EWTSA_W1_THRES_LV_1, EWTSA_W1_THRES_LV_2, EWTSA_W1_THRES_LV_3 + }; + static const unsigned short ewtsa_dynamic_range[4] = { + EWTSA_RANGE_0, EWTSA_RANGE_1, EWTSA_RANGE_2, EWTSA_RANGE_3 + }; + + if (ewtsa == NULL) { + printk(KERN_INFO "EWTSA_system_restart:ewtsa null pointer\n"); + return; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT1, SOC_CNT1_WIN_DIS | SOC_CNT1_BOOST_ON); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT1 write err(data = 0x%02x, ret = %d)\n", SOC_CNT1_WIN_DIS | SOC_CNT1_BOOST_ON, err); + return; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, SLEEP_CTRL_SLEEP); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL write err(data = 0x%02x, ret = %d)\n", SLEEP_CTRL_SLEEP, err); + return; + } + +#if GYRO_VER3_ES1 + err = i2c_smbus_write_byte_data(ewtsa->client, REG2_CTRL_REG1, CTRL_REG1_ACTIVATE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG2_CTRL_REG1 write err(data = 0x%02x, ret = %d)\n", CTRL_REG1_ACTIVATE, err); + return; + } +#else /* GYRO_VER3_ES1 */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, SLEEP_CTRL_ACTIVATE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL write err(data = 0x%02x, ret = %d)\n", SLEEP_CTRL_ACTIVATE, err); + return; + } +#endif /* GYRO_VER3_ES1 */ + + if (ewtsa_w1_threshold_level[ewtsa->w1_thres_level] > ewtsa->w1_thres_x) { + center = ewtsa_w1_threshold_level[ewtsa->w1_thres_level] + 1; + } + else { + center = ewtsa->w1_thres_x; + } + center *= W1_THRES_CENTER_COEF; + center /= ewtsa_dynamic_range[ewtsa->range]; + val = (unsigned char)((0xFF00 & center) >> 8); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_REFERENCE, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_REFERENCE write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(CTRL_REG2_REF_MODE | CTRL_REG2_HPCF); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = SOC_CNT2_SOCCLK_ON; + val |= (unsigned char)(CALIB_FS_62_5HZ << 7); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + /* Wait reference mode setting */ + ret = (signed long)((REFERENCE_WAIT * HZ)/1000); + ret += (signed long)(1000 / HZ); + while (ret > 0) { + l_timeout = ret; + set_current_state(TASK_UNINTERRUPTIBLE); + ret = schedule_timeout(l_timeout); + } + + val = SOC_CNT2_SOCCLK_OFF; + val |= (unsigned char)(CALIB_FS_62_5HZ << 7); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(CTRL_REG2_NOR_MODE | CTRL_REG2_HPCF); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_CTRL_REG2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_CTRL_REG2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } +#if GYRO_VER3_ES3 || GYRO_VER3_ES4 //2012.01.25 for ES3 & ES4 + val = (unsigned char)(0x40 | SOC_CNT1_BOOST_ON); +#else + val = (unsigned char)((unsigned char)(ewtsa->w1_datamask << 6) | SOC_CNT1_BOOST_ON); +#endif + val |= (unsigned char)(ewtsa->w2_thres_en << 5); + val |= (unsigned char)(ewtsa->w1_thres_en << 4); + val |= (unsigned char)(ewtsa->calib_boost_tm << 2); + val |= (unsigned char)(ewtsa->calib_boost_fs << 1); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT1, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT1 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(SOC_CNT2_SOCCLK_ON | ewtsa->w1_thres_level); + val |= (unsigned char)(ewtsa->calib_fs << 7); + val |= (unsigned char)(ewtsa->offset_lag << 4); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(ewtsa->hpf << 7); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SLFSLP_CNT, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SLFSLP_CNT write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + if (ewtsa_w1_threshold_level[ewtsa->w1_thres_level] > ewtsa->w1_thres_x) { + center = ewtsa_w1_threshold_level[ewtsa->w1_thres_level] + 1; + } + else { + center = ewtsa->w1_thres_x; + } + center *= W1_THRES_CENTER_COEF; + center /= ewtsa_dynamic_range[ewtsa->range]; + val = (unsigned char)((0xFF00 & center) >> 8); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_W1THX_H, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_W1THX_H write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(0xFF & center); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_W1THX_L, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_W1THX_L write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + if (ewtsa_w1_threshold_level[ewtsa->w1_thres_level] > ewtsa->w1_thres_y) { + center = ewtsa_w1_threshold_level[ewtsa->w1_thres_level] + 1; + } + else { + center = ewtsa->w1_thres_y; + } + center *= W1_THRES_CENTER_COEF; + center /= ewtsa_dynamic_range[ewtsa->range]; + val = (unsigned char)((0xFF00 & center) >> 8); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_W1THY_H, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_W1THY_H write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(0xFF & center); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_W1THY_L, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_W1THY_L write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + if (ewtsa_w1_threshold_level[ewtsa->w1_thres_level] > ewtsa->w1_thres_z) { + center = ewtsa_w1_threshold_level[ewtsa->w1_thres_level] + 1; + } + else { + center = ewtsa->w1_thres_z; + } + center *= W1_THRES_CENTER_COEF; + center /= ewtsa_dynamic_range[ewtsa->range]; + val = (unsigned char)((0xFF00 & center) >> 8); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_W1THZ_H, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_W1THZ_H write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + val = (unsigned char)(0xFF & center); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_W1THZ_L, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_W1THZ_L write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + err = i2c_smbus_write_byte_data(ewtsa->client, REG_DIGITAL_CAL, DIGITAL_CAL_ENABLE); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_DIGITAL_CAL write err(data = 0x%02x, ret = %d)\n", DIGITAL_CAL_ENABLE, err); + return; + } + + /* Wait calibration boost */ + ret = (signed long)((ewtsa_boost_time[ewtsa->calib_boost_tm] * HZ)/1000); + ret += (signed long)(1000 / HZ); + while (ret > 0) { + l_timeout = ret; + set_current_state(TASK_UNINTERRUPTIBLE); + ret = schedule_timeout(l_timeout); + } + + /* boost stop */ + val = (unsigned char)(ewtsa->w1_datamask << 6); + val |= (unsigned char)(ewtsa->w2_thres_en << 5); + val |= (unsigned char)(ewtsa->w1_thres_en << 4); + val |= (unsigned char)(ewtsa->calib_boost_tm << 2); + val |= (unsigned char)(ewtsa->calib_boost_fs << 1); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT1, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT1 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + + if ((ewtsa->calib_alway != EWTSA_ON) || + ((ewtsa->w1_thres_en == THRESHOLD_OFF) && (ewtsa->w2_thres_en == THRESHOLD_OFF))) { + val = (unsigned char)(SOC_CNT2_SOCCLK_OFF | ewtsa->w1_thres_level); + err = i2c_smbus_write_byte_data(ewtsa->client, REG_SOC_CNT2, val); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_SOC_CNT2 write err(data = 0x%02x, ret = %d)\n", val, err); + return; + } + } + + /* FIFO clear */ + err = i2c_smbus_write_byte_data(ewtsa->client, REG_FIFO_CTRL1, FIFO_CTRL1_CLEAR); + if (err < 0) { + dev_err(&ewtsa->client->dev, "REG_FIFO_CTRL1 write err(data = 0x02, ret = %d)\n", err); + return; + } + return; +} + +/* Read the angular data from the registers */ +static void EWTSA_report_abs(struct ewtsa_t *ewt) +{ + unsigned short x = 0, y = 0, z = 0, temp = 0; + s16 send_x, send_y, send_z, send_temp; + unsigned char reg = REG_MBURST_ALL; + unsigned char reg2[32][8]; + int err; + struct i2c_msg msg[2]; +#if GYRO_MOUNT_SWAP_XY + s16 tmp; +#endif /* GYRO_MOUNT_SWAP_XY */ + unsigned char diag_stat = 0; + unsigned char loop; + unsigned long l_flags = 0; + signed long cal_tmp[4] = {0}; + unsigned char get_num = 0; + unsigned char read_num = 0; + + if (ewt == NULL) { + printk(KERN_INFO "struct ewtsa_t null pointer\n"); + return; + } + + if (ewt->event == EWTSA_POLLING_MODE) { + mutex_lock(&ewt->mlock); + } + else { + if (ewt->fifo_mode == FIFO_MODE) { + err = i2c_smbus_read_byte_data(ewt->client, REG_FIFO_DM); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_FIFO_DM read err(%d)\n", err); + err = 0; + } + read_num = (unsigned char)err; + if (((unsigned char)(read_num & 0x20) >> 5) == 1) { + /* data nothing */ + err = i2c_smbus_read_byte_data(ewt->client, REG_INT_STAT); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_INT_STAT read err(%d)\n", err); + } + return; + } + read_num &= 0x1F; + + if (ewt->fifo_num > read_num) { + err = i2c_smbus_read_byte_data(ewt->client, REG_INT_STAT); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_INT_STAT read err(%d)\n", err); + } + return; + } + } + } + + msg[0].addr = ewt->client->addr; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = ® + + msg[1].addr = ewt->client->addr; + msg[1].flags = I2C_M_RD; + msg[1].len = (unsigned short)(8 * ewt->fifo_num); + msg[1].buf = ®2[0][0]; + + err = i2c_transfer(ewt->client->adapter, msg, 2); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_MBURST_ALL read err(%d)\n", err); + memset(reg2, 0x00, sizeof(reg2)); + } + + for (loop = 0; loop < ewt->fifo_num; loop++) { + x = (unsigned short)(0xFF & reg2[loop][3]); + x |= (unsigned short)(0xFF00 & (unsigned short)(reg2[loop][2] << 8)); + y = (unsigned short)(0xFF & reg2[loop][5]); + y |= (unsigned short)(0xFF00 & (unsigned short)(reg2[loop][4] << 8)); + z = (unsigned short)(0xFF & reg2[loop][7]); + z |= (unsigned short)(0xFF00 & (unsigned short)(reg2[loop][6] << 8)); + temp = (unsigned short)(0xFF & reg2[loop][1]); + temp |= (unsigned short)(0xFF00 & (unsigned short)(reg2[loop][0] << 8)); + + cal_tmp[0] += (signed short)x; + cal_tmp[1] += (signed short)y; + cal_tmp[2] += (signed short)z; + cal_tmp[3] += (signed short)temp; + get_num++; + } + + err = i2c_smbus_read_byte_data(ewt->client, REG_STATUS_REG); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_STATUS_REG read err(%d)\n", err); + err = 0; + } + reg = (unsigned char)err; + if ((reg & STATUS_REG_OVERRUN) != 0) { + err = i2c_smbus_write_byte_data(ewt->client, REG_FIFO_CTRL1, FIFO_CTRL1_CLEAR); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_FIFO_CTRL1 read err(%d)\n", err); + } + } + + if (ewt->int_skip == EWSTA_INT_SKIP) { + ewt->int_skip = EWSTA_INT_CLEAR; + err = i2c_smbus_read_byte_data(ewt->client, REG_INT_STAT); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_INT_STAT read err(%d)\n", err); + } + return; + } + + if (get_num != 0) { + if (ewt->fifo_data_flag == EWTSA_ON) { + cal_tmp[0] += ewt->fifo_lastdata[0]; + cal_tmp[1] += ewt->fifo_lastdata[1]; + cal_tmp[2] += ewt->fifo_lastdata[2]; + cal_tmp[3] += ewt->fifo_lastdata[3]; + get_num++; + } + + /* fifo mode only */ + if (get_num > 1) { + ewt->fifo_lastdata[0] = (signed short)x; + ewt->fifo_lastdata[1] = (signed short)y; + ewt->fifo_lastdata[2] = (signed short)z; + ewt->fifo_lastdata[3] = (signed short)temp; + ewt->fifo_data_flag = EWTSA_ON; + } + + send_x = (signed short)(cal_tmp[0] / get_num); + send_y = (signed short)(cal_tmp[1] / get_num); + send_z = (signed short)(cal_tmp[2] / get_num); + send_temp = (signed short)(cal_tmp[3] / get_num); + } + else { + ewt->fifo_lastdata[0] = 0; + ewt->fifo_lastdata[1] = 0; + ewt->fifo_lastdata[2] = 0; + ewt->fifo_lastdata[3] = 0; + ewt->fifo_data_flag = EWTSA_OFF; + + send_x = 0; + send_y = 0; + send_z = 0; + send_temp = 0; + err = i2c_smbus_write_byte_data(ewt->client, REG_FIFO_CTRL1, FIFO_CTRL1_CLEAR); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_FIFO_CTRL1 read err(%d)\n", err); + } + } + +#if GYRO_MOUNT_SWAP_XY + tmp = send_x; + send_x = send_y; + send_y = tmp; +#endif /* GYRO_MOUNT_SWAP_XY */ +#if GYRO_MOUNT_REVERSE_X + send_x *= -1; +#endif /* GYRO_MOUNT_REVERSE_X */ +#if GYRO_MOUNT_REVERSE_Y + send_y *= -1; +#endif /* GYRO_MOUNT_REVERSE_Y */ +#if GYRO_MOUNT_REVERSE_Z + send_z *= -1; +#endif /* GYRO_MOUNT_REVERSE_Z */ + + if (ewt->event != EWTSA_POLLING_MODE) { + err = i2c_smbus_read_byte_data(ewt->client, REG_INT_STAT); + if (err < 0) { + dev_err(&ewt->client->dev, "REG_INT_STAT read err(%d)\n", err); + err = 0; + } + diag_stat = (unsigned char)err; + spin_lock_irqsave(&ewt->slock, l_flags); + } + + input_report_abs(ewt->input_dev, ABS_X, send_x); + input_report_abs(ewt->input_dev, ABS_Y, send_y); + input_report_abs(ewt->input_dev, ABS_Z, send_z); + input_report_abs(ewt->input_dev, ABS_RX, send_temp); + +#if USE_GPIO_DIAG_PIN + if (ewt->event == EWTSA_POLLING_MODE) { + input_report_abs(ewt->input_dev, ABS_RY, gpio_get_value(DIAG_PIN)); + } + else { + diag_stat = (unsigned char)((unsigned char)(diag_stat & 0x04) >> 2); + input_report_abs(ewt->input_dev, ABS_RY, diag_stat); + } +#else + diag_stat = (unsigned char)((unsigned char)(diag_stat & 0x04) >> 2); + input_report_abs(ewt->input_dev, ABS_RY, diag_stat); +#endif + input_sync(ewt->input_dev); + + if (ewt->event == EWTSA_POLLING_MODE) { + mutex_unlock(&ewt->mlock); + } + else { + spin_unlock_irqrestore(&ewt->slock, l_flags); + } +} + +static void EWTSA_dev_poll(struct work_struct *work) +{ + struct ewtsa_t *ewt; + + if (work == NULL) { + printk(KERN_INFO "struct work_struct null pointer\n"); + return; + } + ewt = container_of(work, struct ewtsa_t, input_work.work); + + if (ewt->sleep == SLEEP_OFF) { + EWTSA_report_abs(ewt); + } +} + +/* Interrupt handler */ +#if USE_GPIO_DRDY_PIN +static irqreturn_t EWTSA_interrupt(int irq, void *dev_id) +{ + struct ewtsa_t *ewtsa = dev_id; + + if (ewtsa == NULL) { + printk(KERN_INFO "struct ewtsa_t null pointer\n"); + return IRQ_RETVAL(1); + } + + if (irq == gpio_to_irq(DRDY_PIN)) { + if (ewtsa->sleep != SLEEP_OFF) { + return IRQ_RETVAL(1); + } + EWTSA_report_abs(ewtsa); + } + return IRQ_RETVAL(1); +} +#endif + +static void EWTSA_input_work_func(struct work_struct *work) +{ + struct ewtsa_t *ewt; + volatile unsigned long start_jiff = jiffies, delay_jiff, next_jiff; + + if (work == NULL) { + printk(KERN_INFO "struct work_struct null pointer\n"); + return; + } + ewt = container_of(work, struct ewtsa_t, input_work.work); + + if (ewt->sleep == SLEEP_OFF) { + EWTSA_dev_poll(work); + + /* adjust polling interval */ + delay_jiff = jiffies; + if (start_jiff > delay_jiff) { /* jiffies overflow */ + delay_jiff += 0xFFFFFFFFUL - start_jiff; + } + else { + delay_jiff -= start_jiff; + } + next_jiff = msecs_to_jiffies(ewt->delay); + /* for delay_jiff > next_jiff */ + delay_jiff %= next_jiff; + next_jiff -= delay_jiff; + + queue_delayed_work(ewt->workqueue, + &ewt->input_work, + next_jiff); + } +} + +/* Suspend function to register device */ +static int EWTSA_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct ewtsa_t *ewt; + s32 ret; + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewt = i2c_get_clientdata(client); + + if (ewt->event == EWTSA_POLLING_MODE) { + cancel_delayed_work(&ewt->input_work); + } + else { + /* disable interrupt */ + ret = i2c_smbus_write_byte_data(ewt->client, REG_INT_CTRL, INT_CTRL_INT_DISABLE); + if (ret < 0) { + dev_err(&ewt->client->dev, "REG_INT_CTRL write err(ret = %d)\n", ret); + } + + if (ewt->sleep == SLEEP_OFF) { +#if USE_GPIO_DRDY_PIN + free_irq(gpio_to_irq(DRDY_PIN), ewt); + /* keep sleep status for resume */ +#endif + } + else { + ewt->sleep = SLEEP_ALLRESET; + } + } +#if USE_GPIO_WINDOW_PIN + gpio_free(WINDOW_PIN); +#endif +#if USE_GPIO_DRDY_PIN + gpio_free(DRDY_PIN); +#endif +#if USE_GPIO_DIAG_PIN + gpio_free(DIAG_PIN); +#endif + ewt->calib_rst = EWTSA_ON; + ewt->reset_param = RST_REG_INIT_ALL; + ret = i2c_smbus_write_byte_data(ewt->client, REG_SLEEP_CTRL, SLEEP_CTRL_ALLRSTSLEEP); + if (ret < 0) { + dev_err(&ewt->client->dev, "REG_SLEEP_CTRL write err(ret = %d)\n", ret); + } + return 0; +} + +/* Resume function to register device */ +static int EWTSA_resume(struct i2c_client *client) +{ + struct ewtsa_t *ewt; + int ret; + + if (client == NULL) { + printk(KERN_INFO "struct i2c_client null pointer\n"); + return -EIO; + } + ewt = i2c_get_clientdata(client); + +#if USE_GPIO_WINDOW_PIN + ret = gpio_request(WINDOW_PIN, "WINDOW"); + ret += gpio_direction_input(WINDOW_PIN); +#else + ret = 0; +#endif +#if USE_GPIO_DIAG_PIN + ret += gpio_request(DIAG_PIN, "DIAG"); + ret += gpio_direction_input(DIAG_PIN); +#endif + if ((ewt->sleep != SLEEP_OFF) || (ret != 0)) { + return 0; + } + +#if GYRO_VER3_ES1 + ret = i2c_smbus_write_byte_data(ewt->client, REG2_CTRL_REG1, CTRL_REG1_ACTIVATE); +#else /* GYRO_VER3_ES1 */ + ret = i2c_smbus_write_byte_data(ewt->client, REG_SLEEP_CTRL, SLEEP_CTRL_ACTIVATE); +#endif /* GYRO_VER3_ES1 */ + + if (ret >= 0) { + EWTSA_system_restart(ewt); + + if (ewt->event == EWTSA_POLLING_MODE) { + queue_delayed_work(ewt->workqueue, + &ewt->input_work, + msecs_to_jiffies(ewt->delay)); + } + else { + /* enable interrupt */ +#if USE_GPIO_DRDY_PIN + ret = gpio_request(DRDY_PIN, "DRDY"); + ret += gpio_direction_input(DRDY_PIN); + ret += request_threaded_irq(gpio_to_irq(DRDY_PIN), NULL, EWTSA_interrupt, IRQF_TRIGGER_RISING, DEVICE_NAME, ewt); + + if (ret == 0) { + ewt->int_skip = EWSTA_INT_SKIP; + if (ewt->fifo_mode == BYPASS_MODE) { + ret = i2c_smbus_write_byte_data(ewt->client, REG_INT_CTRL, INT_CTRL_INT_ENABLE); + } + else { + ret = i2c_smbus_write_byte_data(ewt->client, REG_INT_CTRL, INT_CTRL_INT_ENABLE | INT_CTRL_INT_WTMON_EN); + } + if (ret < 0) { + dev_err(&ewt->client->dev, "REG_INT_CTRL write err(ret = %d)\n", ret); + } + } +#endif + } + } + else { + dev_err(&ewt->client->dev, "REG_SLEEP_CTRL write err(ret = %d)\n", ret); + } + + return 0; +} + +/* Probe function to register device */ +static int EWTSA_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret; + struct ewtsa_t *ewtsa; + + if (client == NULL) { + printk(KERN_INFO "EWTSA_probe:client null pointer\n"); + return -EIO; + } + + ewtsa = kzalloc(sizeof(*ewtsa), GFP_KERNEL); + if (ewtsa == NULL) { + dev_err(&client->dev, "unable to allocate memory!\n"); + return -ENOMEM; + } + + ewtsa->workqueue = create_workqueue("ewtsa_workqueue"); + if (ewtsa->workqueue == NULL) { + dev_err(&client->dev, "Unable to create workqueue!\n"); + kfree(ewtsa); + return -ENOMEM; + } + + ewtsa->client = client; + i2c_set_clientdata(client, ewtsa); + + ewtsa->sleep = SLEEP_INIT_VAL; /* sleep mode */ + ewtsa->delay = DELAY_INIT_VAL; /* information interval */ + ewtsa->range = RANGE_INIT_VAL; /* dynamic range */ + ewtsa->dlpf = DLPF_INIT_VAL; /* dlpf */ + ewtsa->calib = CALIB_FUNC_INIT_VAL; /* calibration function */ + ewtsa->calib_boost_tm = CALIB_BTIM_INIT_VAL; /* boost time[ms] */ + ewtsa->calib_fs = CALIB_FS_INIT_VAL; /* offset renewal rate */ + ewtsa->calib_rst = CALIB_RST_INIT_VAL; /* calib restart flag */ + ewtsa->fifo_mode = FIFO_TYPE_INIT_VAL; /* fifo type */ + ewtsa->reset_param = RST_REG_INIT_ALL; /* register setting flag */ +#if USE_GPIO_DRDY_PIN + ewtsa->event = EWTSA_INTERUPT_MODE; /* data detect method */ +#else + ewtsa->event = EWTSA_POLLING_MODE; /* data detect method */ +#endif + ewtsa->calib_boost_fs = CALIB_BFS_INIT_VAL; /* calibration boost fs */ + ewtsa->int_skip = EWSTA_INT_CLEAR; /* first data flag */ + ewtsa->calib_alway = CALIB_CLK_INIT_VAL; /* socclk flag */ + ewtsa->hpf = CALIB_HPF_INIT_VAL; /* hpf */ + ewtsa->w1_thres_x = THRES_CENTER_INIT_X; /* threshold center val */ + ewtsa->w1_thres_y = THRES_CENTER_INIT_Y; /* threshold center val */ + ewtsa->w1_thres_z = THRES_CENTER_INIT_Z; /* threshold center val */ + ewtsa->w1_datamask = W1_MASK_INIT_VAL; /* window1 datamask set */ + ewtsa->w1_thres_en = W1_FUNC_INIT_VAL; /* window1 function flag */ + ewtsa->w2_thres_en = W2_FUNC_INIT_VAL; /* window2 function flag */ + ewtsa->offset_lag = CALIB_LAG_INIT_VAL; /* offset renewal lag */ + ewtsa->w1_thres_level = W1_LV_INIT_VAL; /* window1 threshold lv */ + ewtsa->fifo_data_flag = EWTSA_OFF; /* last data flag */ + ewtsa->fifo_num = 0; /* fifo number */ + memset(ewtsa->fifo_lastdata, 0x00, sizeof(ewtsa->fifo_lastdata)); + + /*create device file in sysfs as user interface */ + ret = device_create_file(&client->dev, &ewtsa_sleep_attr); + if (ret != 0) { + dev_err(&client->dev, "create device(sleep_attr) file failed!\n"); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + ret = device_create_file(&client->dev, &ewtsa_delay_attr); + if (ret != 0) { + dev_err(&client->dev, "create device(delay_attr) file failed!\n"); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + ret = device_create_file(&client->dev, &ewtsa_range_attr); + if (ret != 0) { + dev_err(&client->dev, "create device(range_attr) file failed!\n"); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + ret = device_create_file(&client->dev, &ewtsa_calib_attr); + if (ret != 0) { + dev_err(&client->dev, "create device(calib_attr) file failed!\n"); + device_remove_file(&client->dev, &ewtsa_range_attr); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + ret = device_create_file(&client->dev, &ewtsa_config_attr); + if (ret != 0) { + dev_err(&client->dev, "create device(calib_attr) file failed!\n"); + device_remove_file(&client->dev, &ewtsa_calib_attr); + device_remove_file(&client->dev, &ewtsa_range_attr); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + + /*input poll device register */ + ewtsa->input_dev = input_allocate_device(); + if (ewtsa->input_dev == NULL) { + dev_err(&client->dev, "alloc input device failed!\n"); + device_remove_file(&client->dev, &ewtsa_config_attr); + device_remove_file(&client->dev, &ewtsa_calib_attr); + device_remove_file(&client->dev, &ewtsa_range_attr); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return -ENOMEM; + } + ewtsa->input_dev->name = DEVICE_NAME; + ewtsa->input_dev->id.bustype = BUS_I2C; + ewtsa->input_dev->evbit[0] = BIT_MASK(EV_ABS); + + mutex_init(&ewtsa->mlock); + spin_lock_init(&ewtsa->slock); + + input_set_abs_params(ewtsa->input_dev, ABS_X, -MAX_VALUE, MAX_VALUE, 0, 0); + input_set_abs_params(ewtsa->input_dev, ABS_Y, -MAX_VALUE, MAX_VALUE, 0, 0); + input_set_abs_params(ewtsa->input_dev, ABS_Z, -MAX_VALUE, MAX_VALUE, 0, 0); + input_set_abs_params(ewtsa->input_dev, ABS_RX, -200, 200, 0, 0); + input_set_abs_params(ewtsa->input_dev, ABS_RY, -200, 200, 0, 0); + + ret = input_register_device(ewtsa->input_dev); + if (ret != 0) { + dev_err(&client->dev, "register poll device failed!\n"); + input_free_device(ewtsa->input_dev); + device_remove_file(&client->dev, &ewtsa_config_attr); + device_remove_file(&client->dev, &ewtsa_calib_attr); + device_remove_file(&client->dev, &ewtsa_range_attr); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + + /* GPIO configuration */ + ret = i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, SLEEP_CTRL_ALLRSTSLEEP); + if (ret < 0) { + dev_err(&ewtsa->client->dev, "REG_SLEEP_CTRL write err(data = 0x00, ret = %d)\n", ret); + } +#if USE_GPIO_WINDOW_PIN + ret = gpio_request(WINDOW_PIN, "WINDOW"); + ret += gpio_direction_input(WINDOW_PIN); +#else + ret = 0; +#endif +#if USE_GPIO_DIAG_PIN + ret += gpio_request(DIAG_PIN, "DIAG"); + ret += gpio_direction_input(DIAG_PIN); +#endif + if (ret != 0) { + dev_err(&client->dev, "gpio_request failed!\n"); +#if USE_GPIO_WINDOW_PIN + gpio_free(WINDOW_PIN); +#endif +#if USE_GPIO_DIAG_PIN + gpio_free(DIAG_PIN); +#endif + input_unregister_device(ewtsa->input_dev); + input_free_device(ewtsa->input_dev); + device_remove_file(&client->dev, &ewtsa_config_attr); + device_remove_file(&client->dev, &ewtsa_calib_attr); + device_remove_file(&client->dev, &ewtsa_range_attr); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + destroy_workqueue(ewtsa->workqueue); + kfree(ewtsa); + return ret; + } + + INIT_DELAYED_WORK(&ewtsa->input_work, EWTSA_input_work_func); + + dev_info(&client->dev, "ewtsa device is probed successfully.\n"); + return 0; +} + +/* Remove function to unregister the device */ +static int EWTSA_remove(struct i2c_client *client) +{ + struct ewtsa_t *ewtsa; + + if (client == NULL) { + printk(KERN_INFO "client pointer null!\n"); + return -EIO; + } + ewtsa = i2c_get_clientdata(client); + + i2c_smbus_write_byte_data(ewtsa->client, REG_SLEEP_CTRL, SLEEP_CTRL_ALLRSTSLEEP); +#if USE_GPIO_DRDY_PIN + if (ewtsa->sleep == SLEEP_OFF) { + free_irq(gpio_to_irq(DRDY_PIN), ewtsa); + gpio_free(DRDY_PIN); + } +#endif +#if USE_GPIO_WINDOW_PIN + gpio_free(WINDOW_PIN); +#endif +#if USE_GPIO_DIAG_PIN + gpio_free(DIAG_PIN); +#endif + + input_unregister_device(ewtsa->input_dev); + input_free_device(ewtsa->input_dev); + destroy_workqueue(ewtsa->workqueue); + device_remove_file(&client->dev, &ewtsa_sleep_attr); + device_remove_file(&client->dev, &ewtsa_delay_attr); + device_remove_file(&client->dev, &ewtsa_range_attr); + device_remove_file(&client->dev, &ewtsa_calib_attr); + device_remove_file(&client->dev, &ewtsa_config_attr); + kfree(ewtsa); + dev_info(&client->dev, "ewtsa device is removed successfully.\n"); + return 0; +} + + +static int __init init_ewtsa(void) +{ + return i2c_add_driver(&i2c_ewtsa_driver); +} + +static void __exit exit_ewtsa(void) +{ + i2c_del_driver(&i2c_ewtsa_driver); +} + +module_init(init_ewtsa); +module_exit(exit_ewtsa); + +MODULE_AUTHOR("Panasonic Electronic Devices"); +MODULE_DESCRIPTION("Gyro sensor driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/gp2ap002a00f.c b/drivers/input/misc/gp2ap002a00f.c new file mode 100644 index 00000000..fe30bd0f --- /dev/null +++ b/drivers/input/misc/gp2ap002a00f.c @@ -0,0 +1,288 @@ +/* + * Copyright (C) 2011 Sony Ericsson Mobile Communications Inc. + * + * Author: Courtney Cavin + * Prepared for up-stream by: Oskar Andero + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct gp2a_data { + struct input_dev *input; + const struct gp2a_platform_data *pdata; + struct i2c_client *i2c_client; +}; + +enum gp2a_addr { + GP2A_ADDR_PROX = 0x0, + GP2A_ADDR_GAIN = 0x1, + GP2A_ADDR_HYS = 0x2, + GP2A_ADDR_CYCLE = 0x3, + GP2A_ADDR_OPMOD = 0x4, + GP2A_ADDR_CON = 0x6 +}; + +enum gp2a_controls { + /* Software Shutdown control: 0 = shutdown, 1 = normal operation */ + GP2A_CTRL_SSD = 0x01 +}; + +static int gp2a_report(struct gp2a_data *dt) +{ + int vo = gpio_get_value(dt->pdata->vout_gpio); + + input_report_switch(dt->input, SW_FRONT_PROXIMITY, !vo); + input_sync(dt->input); + + return 0; +} + +static irqreturn_t gp2a_irq(int irq, void *handle) +{ + struct gp2a_data *dt = handle; + + gp2a_report(dt); + + return IRQ_HANDLED; +} + +static int gp2a_enable(struct gp2a_data *dt) +{ + return i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_OPMOD, + GP2A_CTRL_SSD); +} + +static int gp2a_disable(struct gp2a_data *dt) +{ + return i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_OPMOD, + 0x00); +} + +static int gp2a_device_open(struct input_dev *dev) +{ + struct gp2a_data *dt = input_get_drvdata(dev); + int error; + + error = gp2a_enable(dt); + if (error < 0) { + dev_err(&dt->i2c_client->dev, + "unable to activate, err %d\n", error); + return error; + } + + gp2a_report(dt); + + return 0; +} + +static void gp2a_device_close(struct input_dev *dev) +{ + struct gp2a_data *dt = input_get_drvdata(dev); + int error; + + error = gp2a_disable(dt); + if (error < 0) + dev_err(&dt->i2c_client->dev, + "unable to deactivate, err %d\n", error); +} + +static int gp2a_initialize(struct gp2a_data *dt) +{ + int error; + + error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_GAIN, + 0x08); + if (error < 0) + return error; + + error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_HYS, + 0xc2); + if (error < 0) + return error; + + error = i2c_smbus_write_byte_data(dt->i2c_client, GP2A_ADDR_CYCLE, + 0x04); + if (error < 0) + return error; + + error = gp2a_disable(dt); + + return error; +} + +static int gp2a_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct gp2a_platform_data *pdata = client->dev.platform_data; + struct gp2a_data *dt; + int error; + + if (!pdata) + return -EINVAL; + + if (pdata->hw_setup) { + error = pdata->hw_setup(client); + if (error < 0) + return error; + } + + error = gpio_request_one(pdata->vout_gpio, GPIOF_IN, GP2A_I2C_NAME); + if (error) + goto err_hw_shutdown; + + dt = kzalloc(sizeof(struct gp2a_data), GFP_KERNEL); + if (!dt) { + error = -ENOMEM; + goto err_free_gpio; + } + + dt->pdata = pdata; + dt->i2c_client = client; + + error = gp2a_initialize(dt); + if (error < 0) + goto err_free_mem; + + dt->input = input_allocate_device(); + if (!dt->input) { + error = -ENOMEM; + goto err_free_mem; + } + + input_set_drvdata(dt->input, dt); + + dt->input->open = gp2a_device_open; + dt->input->close = gp2a_device_close; + dt->input->name = GP2A_I2C_NAME; + dt->input->id.bustype = BUS_I2C; + dt->input->dev.parent = &client->dev; + + input_set_capability(dt->input, EV_SW, SW_FRONT_PROXIMITY); + + error = request_threaded_irq(client->irq, NULL, gp2a_irq, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | + IRQF_ONESHOT, + GP2A_I2C_NAME, dt); + if (error) { + dev_err(&client->dev, "irq request failed\n"); + goto err_free_input_dev; + } + + error = input_register_device(dt->input); + if (error) { + dev_err(&client->dev, "device registration failed\n"); + goto err_free_irq; + } + + device_init_wakeup(&client->dev, pdata->wakeup); + i2c_set_clientdata(client, dt); + + return 0; + +err_free_irq: + free_irq(client->irq, dt); +err_free_input_dev: + input_free_device(dt->input); +err_free_mem: + kfree(dt); +err_free_gpio: + gpio_free(pdata->vout_gpio); +err_hw_shutdown: + if (pdata->hw_shutdown) + pdata->hw_shutdown(client); + return error; +} + +static int gp2a_remove(struct i2c_client *client) +{ + struct gp2a_data *dt = i2c_get_clientdata(client); + const struct gp2a_platform_data *pdata = dt->pdata; + + device_init_wakeup(&client->dev, false); + + free_irq(client->irq, dt); + + input_unregister_device(dt->input); + kfree(dt); + + gpio_free(pdata->vout_gpio); + + if (pdata->hw_shutdown) + pdata->hw_shutdown(client); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int gp2a_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct gp2a_data *dt = i2c_get_clientdata(client); + int retval = 0; + + if (device_may_wakeup(&client->dev)) { + enable_irq_wake(client->irq); + } else { + mutex_lock(&dt->input->mutex); + if (dt->input->users) + retval = gp2a_disable(dt); + mutex_unlock(&dt->input->mutex); + } + + return retval; +} + +static int gp2a_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct gp2a_data *dt = i2c_get_clientdata(client); + int retval = 0; + + if (device_may_wakeup(&client->dev)) { + disable_irq_wake(client->irq); + } else { + mutex_lock(&dt->input->mutex); + if (dt->input->users) + retval = gp2a_enable(dt); + mutex_unlock(&dt->input->mutex); + } + + return retval; +} +#endif + +static SIMPLE_DEV_PM_OPS(gp2a_pm, gp2a_suspend, gp2a_resume); + +static const struct i2c_device_id gp2a_i2c_id[] = { + { GP2A_I2C_NAME, 0 }, + { } +}; + +static struct i2c_driver gp2a_i2c_driver = { + .driver = { + .name = GP2A_I2C_NAME, + .owner = THIS_MODULE, + .pm = &gp2a_pm, + }, + .probe = gp2a_probe, + .remove = gp2a_remove, + .id_table = gp2a_i2c_id, +}; + +module_i2c_driver(gp2a_i2c_driver); + +MODULE_AUTHOR("Courtney Cavin "); +MODULE_DESCRIPTION("Sharp GP2AP002A00F I2C Proximity/Opto sensor driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/misc/gpio_axis.c b/drivers/input/misc/gpio_axis.c new file mode 100644 index 00000000..0acf4a57 --- /dev/null +++ b/drivers/input/misc/gpio_axis.c @@ -0,0 +1,192 @@ +/* drivers/input/misc/gpio_axis.c + * + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +struct gpio_axis_state { + struct gpio_event_input_devs *input_devs; + struct gpio_event_axis_info *info; + uint32_t pos; +}; + +uint16_t gpio_axis_4bit_gray_map_table[] = { + [0x0] = 0x0, [0x1] = 0x1, /* 0000 0001 */ + [0x3] = 0x2, [0x2] = 0x3, /* 0011 0010 */ + [0x6] = 0x4, [0x7] = 0x5, /* 0110 0111 */ + [0x5] = 0x6, [0x4] = 0x7, /* 0101 0100 */ + [0xc] = 0x8, [0xd] = 0x9, /* 1100 1101 */ + [0xf] = 0xa, [0xe] = 0xb, /* 1111 1110 */ + [0xa] = 0xc, [0xb] = 0xd, /* 1010 1011 */ + [0x9] = 0xe, [0x8] = 0xf, /* 1001 1000 */ +}; +uint16_t gpio_axis_4bit_gray_map(struct gpio_event_axis_info *info, uint16_t in) +{ + return gpio_axis_4bit_gray_map_table[in]; +} + +uint16_t gpio_axis_5bit_singletrack_map_table[] = { + [0x10] = 0x00, [0x14] = 0x01, [0x1c] = 0x02, /* 10000 10100 11100 */ + [0x1e] = 0x03, [0x1a] = 0x04, [0x18] = 0x05, /* 11110 11010 11000 */ + [0x08] = 0x06, [0x0a] = 0x07, [0x0e] = 0x08, /* 01000 01010 01110 */ + [0x0f] = 0x09, [0x0d] = 0x0a, [0x0c] = 0x0b, /* 01111 01101 01100 */ + [0x04] = 0x0c, [0x05] = 0x0d, [0x07] = 0x0e, /* 00100 00101 00111 */ + [0x17] = 0x0f, [0x16] = 0x10, [0x06] = 0x11, /* 10111 10110 00110 */ + [0x02] = 0x12, [0x12] = 0x13, [0x13] = 0x14, /* 00010 10010 10011 */ + [0x1b] = 0x15, [0x0b] = 0x16, [0x03] = 0x17, /* 11011 01011 00011 */ + [0x01] = 0x18, [0x09] = 0x19, [0x19] = 0x1a, /* 00001 01001 11001 */ + [0x1d] = 0x1b, [0x15] = 0x1c, [0x11] = 0x1d, /* 11101 10101 10001 */ +}; +uint16_t gpio_axis_5bit_singletrack_map( + struct gpio_event_axis_info *info, uint16_t in) +{ + return gpio_axis_5bit_singletrack_map_table[in]; +} + +static void gpio_event_update_axis(struct gpio_axis_state *as, int report) +{ + struct gpio_event_axis_info *ai = as->info; + int i; + int change; + uint16_t state = 0; + uint16_t pos; + uint16_t old_pos = as->pos; + for (i = ai->count - 1; i >= 0; i--) + state = (state << 1) | gpio_get_value(ai->gpio[i]); + pos = ai->map(ai, state); + if (ai->flags & GPIOEAF_PRINT_RAW) + pr_info("axis %d-%d raw %x, pos %d -> %d\n", + ai->type, ai->code, state, old_pos, pos); + if (report && pos != old_pos) { + if (ai->type == EV_REL) { + change = (ai->decoded_size + pos - old_pos) % + ai->decoded_size; + if (change > ai->decoded_size / 2) + change -= ai->decoded_size; + if (change == ai->decoded_size / 2) { + if (ai->flags & GPIOEAF_PRINT_EVENT) + pr_info("axis %d-%d unknown direction, " + "pos %d -> %d\n", ai->type, + ai->code, old_pos, pos); + change = 0; /* no closest direction */ + } + if (ai->flags & GPIOEAF_PRINT_EVENT) + pr_info("axis %d-%d change %d\n", + ai->type, ai->code, change); + input_report_rel(as->input_devs->dev[ai->dev], + ai->code, change); + } else { + if (ai->flags & GPIOEAF_PRINT_EVENT) + pr_info("axis %d-%d now %d\n", + ai->type, ai->code, pos); + input_event(as->input_devs->dev[ai->dev], + ai->type, ai->code, pos); + } + input_sync(as->input_devs->dev[ai->dev]); + } + as->pos = pos; +} + +static irqreturn_t gpio_axis_irq_handler(int irq, void *dev_id) +{ + struct gpio_axis_state *as = dev_id; + gpio_event_update_axis(as, 1); + return IRQ_HANDLED; +} + +int gpio_event_axis_func(struct gpio_event_input_devs *input_devs, + struct gpio_event_info *info, void **data, int func) +{ + int ret; + int i; + int irq; + struct gpio_event_axis_info *ai; + struct gpio_axis_state *as; + + ai = container_of(info, struct gpio_event_axis_info, info); + if (func == GPIO_EVENT_FUNC_SUSPEND) { + for (i = 0; i < ai->count; i++) + disable_irq(gpio_to_irq(ai->gpio[i])); + return 0; + } + if (func == GPIO_EVENT_FUNC_RESUME) { + for (i = 0; i < ai->count; i++) + enable_irq(gpio_to_irq(ai->gpio[i])); + return 0; + } + + if (func == GPIO_EVENT_FUNC_INIT) { + *data = as = kmalloc(sizeof(*as), GFP_KERNEL); + if (as == NULL) { + ret = -ENOMEM; + goto err_alloc_axis_state_failed; + } + as->input_devs = input_devs; + as->info = ai; + if (ai->dev >= input_devs->count) { + pr_err("gpio_event_axis: bad device index %d >= %d " + "for %d:%d\n", ai->dev, input_devs->count, + ai->type, ai->code); + ret = -EINVAL; + goto err_bad_device_index; + } + + input_set_capability(input_devs->dev[ai->dev], + ai->type, ai->code); + if (ai->type == EV_ABS) { + input_set_abs_params(input_devs->dev[ai->dev], ai->code, + 0, ai->decoded_size - 1, 0, 0); + } + for (i = 0; i < ai->count; i++) { + ret = gpio_request(ai->gpio[i], "gpio_event_axis"); + if (ret < 0) + goto err_request_gpio_failed; + ret = gpio_direction_input(ai->gpio[i]); + if (ret < 0) + goto err_gpio_direction_input_failed; + ret = irq = gpio_to_irq(ai->gpio[i]); + if (ret < 0) + goto err_get_irq_num_failed; + ret = request_irq(irq, gpio_axis_irq_handler, + IRQF_TRIGGER_RISING | + IRQF_TRIGGER_FALLING, + "gpio_event_axis", as); + if (ret < 0) + goto err_request_irq_failed; + } + gpio_event_update_axis(as, 0); + return 0; + } + + ret = 0; + as = *data; + for (i = ai->count - 1; i >= 0; i--) { + free_irq(gpio_to_irq(ai->gpio[i]), as); +err_request_irq_failed: +err_get_irq_num_failed: +err_gpio_direction_input_failed: + gpio_free(ai->gpio[i]); +err_request_gpio_failed: + ; + } +err_bad_device_index: + kfree(as); + *data = NULL; +err_alloc_axis_state_failed: + return ret; +} diff --git a/drivers/input/misc/gpio_event.c b/drivers/input/misc/gpio_event.c new file mode 100644 index 00000000..90f07eba --- /dev/null +++ b/drivers/input/misc/gpio_event.c @@ -0,0 +1,228 @@ +/* drivers/input/misc/gpio_event.c + * + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include + +struct gpio_event { + struct gpio_event_input_devs *input_devs; + const struct gpio_event_platform_data *info; + void *state[0]; +}; + +static int gpio_input_event( + struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + int i; + int devnr; + int ret = 0; + int tmp_ret; + struct gpio_event_info **ii; + struct gpio_event *ip = input_get_drvdata(dev); + + for (devnr = 0; devnr < ip->input_devs->count; devnr++) + if (ip->input_devs->dev[devnr] == dev) + break; + if (devnr == ip->input_devs->count) { + pr_err("gpio_input_event: unknown device %p\n", dev); + return -EIO; + } + + for (i = 0, ii = ip->info->info; i < ip->info->info_count; i++, ii++) { + if ((*ii)->event) { + tmp_ret = (*ii)->event(ip->input_devs, *ii, + &ip->state[i], + devnr, type, code, value); + if (tmp_ret) + ret = tmp_ret; + } + } + return ret; +} + +static int gpio_event_call_all_func(struct gpio_event *ip, int func) +{ + int i; + int ret; + struct gpio_event_info **ii; + + if (func == GPIO_EVENT_FUNC_INIT || func == GPIO_EVENT_FUNC_RESUME) { + ii = ip->info->info; + for (i = 0; i < ip->info->info_count; i++, ii++) { + if ((*ii)->func == NULL) { + ret = -ENODEV; + pr_err("gpio_event_probe: Incomplete pdata, " + "no function\n"); + goto err_no_func; + } + if (func == GPIO_EVENT_FUNC_RESUME && (*ii)->no_suspend) + continue; + ret = (*ii)->func(ip->input_devs, *ii, &ip->state[i], + func); + if (ret) { + pr_err("gpio_event_probe: function failed\n"); + goto err_func_failed; + } + } + return 0; + } + + ret = 0; + i = ip->info->info_count; + ii = ip->info->info + i; + while (i > 0) { + i--; + ii--; + if ((func & ~1) == GPIO_EVENT_FUNC_SUSPEND && (*ii)->no_suspend) + continue; + (*ii)->func(ip->input_devs, *ii, &ip->state[i], func & ~1); +err_func_failed: +err_no_func: + ; + } + return ret; +} + +static void __maybe_unused gpio_event_suspend(struct gpio_event *ip) +{ + gpio_event_call_all_func(ip, GPIO_EVENT_FUNC_SUSPEND); + if (ip->info->power) + ip->info->power(ip->info, 0); +} + +static void __maybe_unused gpio_event_resume(struct gpio_event *ip) +{ + if (ip->info->power) + ip->info->power(ip->info, 1); + gpio_event_call_all_func(ip, GPIO_EVENT_FUNC_RESUME); +} + +static int gpio_event_probe(struct platform_device *pdev) +{ + int err; + struct gpio_event *ip; + struct gpio_event_platform_data *event_info; + int dev_count = 1; + int i; + int registered = 0; + + event_info = pdev->dev.platform_data; + if (event_info == NULL) { + pr_err("gpio_event_probe: No pdata\n"); + return -ENODEV; + } + if ((!event_info->name && !event_info->names[0]) || + !event_info->info || !event_info->info_count) { + pr_err("gpio_event_probe: Incomplete pdata\n"); + return -ENODEV; + } + if (!event_info->name) + while (event_info->names[dev_count]) + dev_count++; + ip = kzalloc(sizeof(*ip) + + sizeof(ip->state[0]) * event_info->info_count + + sizeof(*ip->input_devs) + + sizeof(ip->input_devs->dev[0]) * dev_count, GFP_KERNEL); + if (ip == NULL) { + err = -ENOMEM; + pr_err("gpio_event_probe: Failed to allocate private data\n"); + goto err_kp_alloc_failed; + } + ip->input_devs = (void*)&ip->state[event_info->info_count]; + platform_set_drvdata(pdev, ip); + + for (i = 0; i < dev_count; i++) { + struct input_dev *input_dev = input_allocate_device(); + if (input_dev == NULL) { + err = -ENOMEM; + pr_err("gpio_event_probe: " + "Failed to allocate input device\n"); + goto err_input_dev_alloc_failed; + } + input_set_drvdata(input_dev, ip); + input_dev->name = event_info->name ? + event_info->name : event_info->names[i]; + input_dev->event = gpio_input_event; + ip->input_devs->dev[i] = input_dev; + } + ip->input_devs->count = dev_count; + ip->info = event_info; + if (event_info->power) + ip->info->power(ip->info, 1); + + err = gpio_event_call_all_func(ip, GPIO_EVENT_FUNC_INIT); + if (err) + goto err_call_all_func_failed; + + for (i = 0; i < dev_count; i++) { + err = input_register_device(ip->input_devs->dev[i]); + if (err) { + pr_err("gpio_event_probe: Unable to register %s " + "input device\n", ip->input_devs->dev[i]->name); + goto err_input_register_device_failed; + } + registered++; + } + + return 0; + +err_input_register_device_failed: + gpio_event_call_all_func(ip, GPIO_EVENT_FUNC_UNINIT); +err_call_all_func_failed: + if (event_info->power) + ip->info->power(ip->info, 0); + for (i = 0; i < registered; i++) + input_unregister_device(ip->input_devs->dev[i]); + for (i = dev_count - 1; i >= registered; i--) { + input_free_device(ip->input_devs->dev[i]); +err_input_dev_alloc_failed: + ; + } + kfree(ip); +err_kp_alloc_failed: + return err; +} + +static int gpio_event_remove(struct platform_device *pdev) +{ + struct gpio_event *ip = platform_get_drvdata(pdev); + int i; + + gpio_event_call_all_func(ip, GPIO_EVENT_FUNC_UNINIT); + if (ip->info->power) + ip->info->power(ip->info, 0); + for (i = 0; i < ip->input_devs->count; i++) + input_unregister_device(ip->input_devs->dev[i]); + kfree(ip); + return 0; +} + +static struct platform_driver gpio_event_driver = { + .probe = gpio_event_probe, + .remove = gpio_event_remove, + .driver = { + .name = GPIO_EVENT_DEV_NAME, + }, +}; + +module_platform_driver(gpio_event_driver); + +MODULE_DESCRIPTION("GPIO Event Driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/misc/gpio_input.c b/drivers/input/misc/gpio_input.c new file mode 100644 index 00000000..eefd0272 --- /dev/null +++ b/drivers/input/misc/gpio_input.c @@ -0,0 +1,390 @@ +/* drivers/input/misc/gpio_input.c + * + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +enum { + DEBOUNCE_UNSTABLE = BIT(0), /* Got irq, while debouncing */ + DEBOUNCE_PRESSED = BIT(1), + DEBOUNCE_NOTPRESSED = BIT(2), + DEBOUNCE_WAIT_IRQ = BIT(3), /* Stable irq state */ + DEBOUNCE_POLL = BIT(4), /* Stable polling state */ + + DEBOUNCE_UNKNOWN = + DEBOUNCE_PRESSED | DEBOUNCE_NOTPRESSED, +}; + +struct gpio_key_state { + struct gpio_input_state *ds; + uint8_t debounce; +}; + +struct gpio_input_state { + struct gpio_event_input_devs *input_devs; + const struct gpio_event_input_info *info; + struct hrtimer timer; + int use_irq; + int debounce_count; + spinlock_t irq_lock; + struct wakeup_source *ws; + struct gpio_key_state key_state[0]; +}; + +static enum hrtimer_restart gpio_event_input_timer_func(struct hrtimer *timer) +{ + int i; + int pressed; + struct gpio_input_state *ds = + container_of(timer, struct gpio_input_state, timer); + unsigned gpio_flags = ds->info->flags; + unsigned npolarity; + int nkeys = ds->info->keymap_size; + const struct gpio_event_direct_entry *key_entry; + struct gpio_key_state *key_state; + unsigned long irqflags; + uint8_t debounce; + bool sync_needed; + +#if 0 + key_entry = kp->keys_info->keymap; + key_state = kp->key_state; + for (i = 0; i < nkeys; i++, key_entry++, key_state++) + pr_info("gpio_read_detect_status %d %d\n", key_entry->gpio, + gpio_read_detect_status(key_entry->gpio)); +#endif + key_entry = ds->info->keymap; + key_state = ds->key_state; + sync_needed = false; + spin_lock_irqsave(&ds->irq_lock, irqflags); + for (i = 0; i < nkeys; i++, key_entry++, key_state++) { + debounce = key_state->debounce; + if (debounce & DEBOUNCE_WAIT_IRQ) + continue; + if (key_state->debounce & DEBOUNCE_UNSTABLE) { + debounce = key_state->debounce = DEBOUNCE_UNKNOWN; + enable_irq(gpio_to_irq(key_entry->gpio)); + if (gpio_flags & GPIOEDF_PRINT_KEY_UNSTABLE) + pr_info("gpio_keys_scan_keys: key %x-%x, %d " + "(%d) continue debounce\n", + ds->info->type, key_entry->code, + i, key_entry->gpio); + } + npolarity = !(gpio_flags & GPIOEDF_ACTIVE_HIGH); + pressed = gpio_get_value(key_entry->gpio) ^ npolarity; + if (debounce & DEBOUNCE_POLL) { + if (pressed == !(debounce & DEBOUNCE_PRESSED)) { + ds->debounce_count++; + key_state->debounce = DEBOUNCE_UNKNOWN; + if (gpio_flags & GPIOEDF_PRINT_KEY_DEBOUNCE) + pr_info("gpio_keys_scan_keys: key %x-" + "%x, %d (%d) start debounce\n", + ds->info->type, key_entry->code, + i, key_entry->gpio); + } + continue; + } + if (pressed && (debounce & DEBOUNCE_NOTPRESSED)) { + if (gpio_flags & GPIOEDF_PRINT_KEY_DEBOUNCE) + pr_info("gpio_keys_scan_keys: key %x-%x, %d " + "(%d) debounce pressed 1\n", + ds->info->type, key_entry->code, + i, key_entry->gpio); + key_state->debounce = DEBOUNCE_PRESSED; + continue; + } + if (!pressed && (debounce & DEBOUNCE_PRESSED)) { + if (gpio_flags & GPIOEDF_PRINT_KEY_DEBOUNCE) + pr_info("gpio_keys_scan_keys: key %x-%x, %d " + "(%d) debounce pressed 0\n", + ds->info->type, key_entry->code, + i, key_entry->gpio); + key_state->debounce = DEBOUNCE_NOTPRESSED; + continue; + } + /* key is stable */ + ds->debounce_count--; + if (ds->use_irq) + key_state->debounce |= DEBOUNCE_WAIT_IRQ; + else + key_state->debounce |= DEBOUNCE_POLL; + if (gpio_flags & GPIOEDF_PRINT_KEYS) + pr_info("gpio_keys_scan_keys: key %x-%x, %d (%d) " + "changed to %d\n", ds->info->type, + key_entry->code, i, key_entry->gpio, pressed); + input_event(ds->input_devs->dev[key_entry->dev], ds->info->type, + key_entry->code, pressed); + sync_needed = true; + } + if (sync_needed) { + for (i = 0; i < ds->input_devs->count; i++) + input_sync(ds->input_devs->dev[i]); + } + +#if 0 + key_entry = kp->keys_info->keymap; + key_state = kp->key_state; + for (i = 0; i < nkeys; i++, key_entry++, key_state++) { + pr_info("gpio_read_detect_status %d %d\n", key_entry->gpio, + gpio_read_detect_status(key_entry->gpio)); + } +#endif + + if (ds->debounce_count) + hrtimer_start(timer, ds->info->debounce_time, HRTIMER_MODE_REL); + else if (!ds->use_irq) + hrtimer_start(timer, ds->info->poll_time, HRTIMER_MODE_REL); + else + __pm_relax(ds->ws); + + spin_unlock_irqrestore(&ds->irq_lock, irqflags); + + return HRTIMER_NORESTART; +} + +static irqreturn_t gpio_event_input_irq_handler(int irq, void *dev_id) +{ + struct gpio_key_state *ks = dev_id; + struct gpio_input_state *ds = ks->ds; + int keymap_index = ks - ds->key_state; + const struct gpio_event_direct_entry *key_entry; + unsigned long irqflags; + int pressed; + + if (!ds->use_irq) + return IRQ_HANDLED; + + key_entry = &ds->info->keymap[keymap_index]; + + if (ds->info->debounce_time.tv64) { + spin_lock_irqsave(&ds->irq_lock, irqflags); + if (ks->debounce & DEBOUNCE_WAIT_IRQ) { + ks->debounce = DEBOUNCE_UNKNOWN; + if (ds->debounce_count++ == 0) { + __pm_stay_awake(ds->ws); + hrtimer_start( + &ds->timer, ds->info->debounce_time, + HRTIMER_MODE_REL); + } + if (ds->info->flags & GPIOEDF_PRINT_KEY_DEBOUNCE) + pr_info("gpio_event_input_irq_handler: " + "key %x-%x, %d (%d) start debounce\n", + ds->info->type, key_entry->code, + keymap_index, key_entry->gpio); + } else { + disable_irq_nosync(irq); + ks->debounce = DEBOUNCE_UNSTABLE; + } + spin_unlock_irqrestore(&ds->irq_lock, irqflags); + } else { + pressed = gpio_get_value(key_entry->gpio) ^ + !(ds->info->flags & GPIOEDF_ACTIVE_HIGH); + if (ds->info->flags & GPIOEDF_PRINT_KEYS) + pr_info("gpio_event_input_irq_handler: key %x-%x, %d " + "(%d) changed to %d\n", + ds->info->type, key_entry->code, keymap_index, + key_entry->gpio, pressed); + input_event(ds->input_devs->dev[key_entry->dev], ds->info->type, + key_entry->code, pressed); + input_sync(ds->input_devs->dev[key_entry->dev]); + } + return IRQ_HANDLED; +} + +static int gpio_event_input_request_irqs(struct gpio_input_state *ds) +{ + int i; + int err; + unsigned int irq; + unsigned long req_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING; + + for (i = 0; i < ds->info->keymap_size; i++) { + err = irq = gpio_to_irq(ds->info->keymap[i].gpio); + if (err < 0) + goto err_gpio_get_irq_num_failed; + err = request_irq(irq, gpio_event_input_irq_handler, + req_flags, "gpio_keys", &ds->key_state[i]); + if (err) { + pr_err("gpio_event_input_request_irqs: request_irq " + "failed for input %d, irq %d\n", + ds->info->keymap[i].gpio, irq); + goto err_request_irq_failed; + } + if (ds->info->info.no_suspend) { + err = enable_irq_wake(irq); + if (err) { + pr_err("gpio_event_input_request_irqs: " + "enable_irq_wake failed for input %d, " + "irq %d\n", + ds->info->keymap[i].gpio, irq); + goto err_enable_irq_wake_failed; + } + } + } + return 0; + + for (i = ds->info->keymap_size - 1; i >= 0; i--) { + irq = gpio_to_irq(ds->info->keymap[i].gpio); + if (ds->info->info.no_suspend) + disable_irq_wake(irq); +err_enable_irq_wake_failed: + free_irq(irq, &ds->key_state[i]); +err_request_irq_failed: +err_gpio_get_irq_num_failed: + ; + } + return err; +} + +int gpio_event_input_func(struct gpio_event_input_devs *input_devs, + struct gpio_event_info *info, void **data, int func) +{ + int ret; + int i; + unsigned long irqflags; + struct gpio_event_input_info *di; + struct gpio_input_state *ds = *data; + char *wlname; + + di = container_of(info, struct gpio_event_input_info, info); + + if (func == GPIO_EVENT_FUNC_SUSPEND) { + if (ds->use_irq) + for (i = 0; i < di->keymap_size; i++) + disable_irq(gpio_to_irq(di->keymap[i].gpio)); + hrtimer_cancel(&ds->timer); + return 0; + } + if (func == GPIO_EVENT_FUNC_RESUME) { + spin_lock_irqsave(&ds->irq_lock, irqflags); + if (ds->use_irq) + for (i = 0; i < di->keymap_size; i++) + enable_irq(gpio_to_irq(di->keymap[i].gpio)); + hrtimer_start(&ds->timer, ktime_set(0, 0), HRTIMER_MODE_REL); + spin_unlock_irqrestore(&ds->irq_lock, irqflags); + return 0; + } + + if (func == GPIO_EVENT_FUNC_INIT) { + if (ktime_to_ns(di->poll_time) <= 0) + di->poll_time = ktime_set(0, 20 * NSEC_PER_MSEC); + + *data = ds = kzalloc(sizeof(*ds) + sizeof(ds->key_state[0]) * + di->keymap_size, GFP_KERNEL); + if (ds == NULL) { + ret = -ENOMEM; + pr_err("gpio_event_input_func: " + "Failed to allocate private data\n"); + goto err_ds_alloc_failed; + } + ds->debounce_count = di->keymap_size; + ds->input_devs = input_devs; + ds->info = di; + wlname = kasprintf(GFP_KERNEL, "gpio_input:%s%s", + input_devs->dev[0]->name, + (input_devs->count > 1) ? "..." : ""); + + ds->ws = wakeup_source_register(wlname); + kfree(wlname); + if (!ds->ws) { + ret = -ENOMEM; + pr_err("gpio_event_input_func: " + "Failed to allocate wakeup source\n"); + goto err_ws_failed; + } + + spin_lock_init(&ds->irq_lock); + + for (i = 0; i < di->keymap_size; i++) { + int dev = di->keymap[i].dev; + if (dev >= input_devs->count) { + pr_err("gpio_event_input_func: bad device " + "index %d >= %d for key code %d\n", + dev, input_devs->count, + di->keymap[i].code); + ret = -EINVAL; + goto err_bad_keymap; + } + input_set_capability(input_devs->dev[dev], di->type, + di->keymap[i].code); + ds->key_state[i].ds = ds; + ds->key_state[i].debounce = DEBOUNCE_UNKNOWN; + } + + for (i = 0; i < di->keymap_size; i++) { + ret = gpio_request(di->keymap[i].gpio, "gpio_kp_in"); + if (ret) { + pr_err("gpio_event_input_func: gpio_request " + "failed for %d\n", di->keymap[i].gpio); + goto err_gpio_request_failed; + } + ret = gpio_direction_input(di->keymap[i].gpio); + if (ret) { + pr_err("gpio_event_input_func: " + "gpio_direction_input failed for %d\n", + di->keymap[i].gpio); + goto err_gpio_configure_failed; + } + } + + ret = gpio_event_input_request_irqs(ds); + + spin_lock_irqsave(&ds->irq_lock, irqflags); + ds->use_irq = ret == 0; + + pr_info("GPIO Input Driver: Start gpio inputs for %s%s in %s " + "mode\n", input_devs->dev[0]->name, + (input_devs->count > 1) ? "..." : "", + ret == 0 ? "interrupt" : "polling"); + + hrtimer_init(&ds->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ds->timer.function = gpio_event_input_timer_func; + hrtimer_start(&ds->timer, ktime_set(0, 0), HRTIMER_MODE_REL); + spin_unlock_irqrestore(&ds->irq_lock, irqflags); + return 0; + } + + ret = 0; + spin_lock_irqsave(&ds->irq_lock, irqflags); + hrtimer_cancel(&ds->timer); + if (ds->use_irq) { + for (i = di->keymap_size - 1; i >= 0; i--) { + int irq = gpio_to_irq(di->keymap[i].gpio); + if (ds->info->info.no_suspend) + disable_irq_wake(irq); + free_irq(irq, &ds->key_state[i]); + } + } + spin_unlock_irqrestore(&ds->irq_lock, irqflags); + + for (i = di->keymap_size - 1; i >= 0; i--) { +err_gpio_configure_failed: + gpio_free(di->keymap[i].gpio); +err_gpio_request_failed: + ; + } +err_bad_keymap: + wakeup_source_unregister(ds->ws); +err_ws_failed: + kfree(ds); +err_ds_alloc_failed: + return ret; +} diff --git a/drivers/input/misc/gpio_matrix.c b/drivers/input/misc/gpio_matrix.c new file mode 100644 index 00000000..eaa9e89d --- /dev/null +++ b/drivers/input/misc/gpio_matrix.c @@ -0,0 +1,441 @@ +/* drivers/input/misc/gpio_matrix.c + * + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +struct gpio_kp { + struct gpio_event_input_devs *input_devs; + struct gpio_event_matrix_info *keypad_info; + struct hrtimer timer; + struct wake_lock wake_lock; + int current_output; + unsigned int use_irq:1; + unsigned int key_state_changed:1; + unsigned int last_key_state_changed:1; + unsigned int some_keys_pressed:2; + unsigned int disabled_irq:1; + unsigned long keys_pressed[0]; +}; + +static void clear_phantom_key(struct gpio_kp *kp, int out, int in) +{ + struct gpio_event_matrix_info *mi = kp->keypad_info; + int key_index = out * mi->ninputs + in; + unsigned short keyentry = mi->keymap[key_index]; + unsigned short keycode = keyentry & MATRIX_KEY_MASK; + unsigned short dev = keyentry >> MATRIX_CODE_BITS; + + if (!test_bit(keycode, kp->input_devs->dev[dev]->key)) { + if (mi->flags & GPIOKPF_PRINT_PHANTOM_KEYS) + pr_info("gpiomatrix: phantom key %x, %d-%d (%d-%d) " + "cleared\n", keycode, out, in, + mi->output_gpios[out], mi->input_gpios[in]); + __clear_bit(key_index, kp->keys_pressed); + } else { + if (mi->flags & GPIOKPF_PRINT_PHANTOM_KEYS) + pr_info("gpiomatrix: phantom key %x, %d-%d (%d-%d) " + "not cleared\n", keycode, out, in, + mi->output_gpios[out], mi->input_gpios[in]); + } +} + +static int restore_keys_for_input(struct gpio_kp *kp, int out, int in) +{ + int rv = 0; + int key_index; + + key_index = out * kp->keypad_info->ninputs + in; + while (out < kp->keypad_info->noutputs) { + if (test_bit(key_index, kp->keys_pressed)) { + rv = 1; + clear_phantom_key(kp, out, in); + } + key_index += kp->keypad_info->ninputs; + out++; + } + return rv; +} + +static void remove_phantom_keys(struct gpio_kp *kp) +{ + int out, in, inp; + int key_index; + + if (kp->some_keys_pressed < 3) + return; + + for (out = 0; out < kp->keypad_info->noutputs; out++) { + inp = -1; + key_index = out * kp->keypad_info->ninputs; + for (in = 0; in < kp->keypad_info->ninputs; in++, key_index++) { + if (test_bit(key_index, kp->keys_pressed)) { + if (inp == -1) { + inp = in; + continue; + } + if (inp >= 0) { + if (!restore_keys_for_input(kp, out + 1, + inp)) + break; + clear_phantom_key(kp, out, inp); + inp = -2; + } + restore_keys_for_input(kp, out, in); + } + } + } +} + +static void report_key(struct gpio_kp *kp, int key_index, int out, int in) +{ + struct gpio_event_matrix_info *mi = kp->keypad_info; + int pressed = test_bit(key_index, kp->keys_pressed); + unsigned short keyentry = mi->keymap[key_index]; + unsigned short keycode = keyentry & MATRIX_KEY_MASK; + unsigned short dev = keyentry >> MATRIX_CODE_BITS; + + if (pressed != test_bit(keycode, kp->input_devs->dev[dev]->key)) { + if (keycode == KEY_RESERVED) { + if (mi->flags & GPIOKPF_PRINT_UNMAPPED_KEYS) + pr_info("gpiomatrix: unmapped key, %d-%d " + "(%d-%d) changed to %d\n", + out, in, mi->output_gpios[out], + mi->input_gpios[in], pressed); + } else { + if (mi->flags & GPIOKPF_PRINT_MAPPED_KEYS) + pr_info("gpiomatrix: key %x, %d-%d (%d-%d) " + "changed to %d\n", keycode, + out, in, mi->output_gpios[out], + mi->input_gpios[in], pressed); + input_report_key(kp->input_devs->dev[dev], keycode, pressed); + } + } +} + +static void report_sync(struct gpio_kp *kp) +{ + int i; + + for (i = 0; i < kp->input_devs->count; i++) + input_sync(kp->input_devs->dev[i]); +} + +static enum hrtimer_restart gpio_keypad_timer_func(struct hrtimer *timer) +{ + int out, in; + int key_index; + int gpio; + struct gpio_kp *kp = container_of(timer, struct gpio_kp, timer); + struct gpio_event_matrix_info *mi = kp->keypad_info; + unsigned gpio_keypad_flags = mi->flags; + unsigned polarity = !!(gpio_keypad_flags & GPIOKPF_ACTIVE_HIGH); + + out = kp->current_output; + if (out == mi->noutputs) { + out = 0; + kp->last_key_state_changed = kp->key_state_changed; + kp->key_state_changed = 0; + kp->some_keys_pressed = 0; + } else { + key_index = out * mi->ninputs; + for (in = 0; in < mi->ninputs; in++, key_index++) { + gpio = mi->input_gpios[in]; + if (gpio_get_value(gpio) ^ !polarity) { + if (kp->some_keys_pressed < 3) + kp->some_keys_pressed++; + kp->key_state_changed |= !__test_and_set_bit( + key_index, kp->keys_pressed); + } else + kp->key_state_changed |= __test_and_clear_bit( + key_index, kp->keys_pressed); + } + gpio = mi->output_gpios[out]; + if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE) + gpio_set_value(gpio, !polarity); + else + gpio_direction_input(gpio); + out++; + } + kp->current_output = out; + if (out < mi->noutputs) { + gpio = mi->output_gpios[out]; + if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE) + gpio_set_value(gpio, polarity); + else + gpio_direction_output(gpio, polarity); + hrtimer_start(timer, mi->settle_time, HRTIMER_MODE_REL); + return HRTIMER_NORESTART; + } + if (gpio_keypad_flags & GPIOKPF_DEBOUNCE) { + if (kp->key_state_changed) { + hrtimer_start(&kp->timer, mi->debounce_delay, + HRTIMER_MODE_REL); + return HRTIMER_NORESTART; + } + kp->key_state_changed = kp->last_key_state_changed; + } + if (kp->key_state_changed) { + if (gpio_keypad_flags & GPIOKPF_REMOVE_SOME_PHANTOM_KEYS) + remove_phantom_keys(kp); + key_index = 0; + for (out = 0; out < mi->noutputs; out++) + for (in = 0; in < mi->ninputs; in++, key_index++) + report_key(kp, key_index, out, in); + report_sync(kp); + } + if (!kp->use_irq || kp->some_keys_pressed) { + hrtimer_start(timer, mi->poll_time, HRTIMER_MODE_REL); + return HRTIMER_NORESTART; + } + + /* No keys are pressed, reenable interrupt */ + for (out = 0; out < mi->noutputs; out++) { + if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE) + gpio_set_value(mi->output_gpios[out], polarity); + else + gpio_direction_output(mi->output_gpios[out], polarity); + } + for (in = 0; in < mi->ninputs; in++) + enable_irq(gpio_to_irq(mi->input_gpios[in])); + wake_unlock(&kp->wake_lock); + return HRTIMER_NORESTART; +} + +static irqreturn_t gpio_keypad_irq_handler(int irq_in, void *dev_id) +{ + int i; + struct gpio_kp *kp = dev_id; + struct gpio_event_matrix_info *mi = kp->keypad_info; + unsigned gpio_keypad_flags = mi->flags; + + if (!kp->use_irq) { + /* ignore interrupt while registering the handler */ + kp->disabled_irq = 1; + disable_irq_nosync(irq_in); + return IRQ_HANDLED; + } + + for (i = 0; i < mi->ninputs; i++) + disable_irq_nosync(gpio_to_irq(mi->input_gpios[i])); + for (i = 0; i < mi->noutputs; i++) { + if (gpio_keypad_flags & GPIOKPF_DRIVE_INACTIVE) + gpio_set_value(mi->output_gpios[i], + !(gpio_keypad_flags & GPIOKPF_ACTIVE_HIGH)); + else + gpio_direction_input(mi->output_gpios[i]); + } + wake_lock(&kp->wake_lock); + hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL); + return IRQ_HANDLED; +} + +static int gpio_keypad_request_irqs(struct gpio_kp *kp) +{ + int i; + int err; + unsigned int irq; + unsigned long request_flags; + struct gpio_event_matrix_info *mi = kp->keypad_info; + + switch (mi->flags & (GPIOKPF_ACTIVE_HIGH|GPIOKPF_LEVEL_TRIGGERED_IRQ)) { + default: + request_flags = IRQF_TRIGGER_FALLING; + break; + case GPIOKPF_ACTIVE_HIGH: + request_flags = IRQF_TRIGGER_RISING; + break; + case GPIOKPF_LEVEL_TRIGGERED_IRQ: + request_flags = IRQF_TRIGGER_LOW; + break; + case GPIOKPF_LEVEL_TRIGGERED_IRQ | GPIOKPF_ACTIVE_HIGH: + request_flags = IRQF_TRIGGER_HIGH; + break; + } + + for (i = 0; i < mi->ninputs; i++) { + err = irq = gpio_to_irq(mi->input_gpios[i]); + if (err < 0) + goto err_gpio_get_irq_num_failed; + err = request_irq(irq, gpio_keypad_irq_handler, request_flags, + "gpio_kp", kp); + if (err) { + pr_err("gpiomatrix: request_irq failed for input %d, " + "irq %d\n", mi->input_gpios[i], irq); + goto err_request_irq_failed; + } + err = enable_irq_wake(irq); + if (err) { + pr_err("gpiomatrix: set_irq_wake failed for input %d, " + "irq %d\n", mi->input_gpios[i], irq); + } + disable_irq(irq); + if (kp->disabled_irq) { + kp->disabled_irq = 0; + enable_irq(irq); + } + } + return 0; + + for (i = mi->noutputs - 1; i >= 0; i--) { + free_irq(gpio_to_irq(mi->input_gpios[i]), kp); +err_request_irq_failed: +err_gpio_get_irq_num_failed: + ; + } + return err; +} + +int gpio_event_matrix_func(struct gpio_event_input_devs *input_devs, + struct gpio_event_info *info, void **data, int func) +{ + int i; + int err; + int key_count; + struct gpio_kp *kp; + struct gpio_event_matrix_info *mi; + + mi = container_of(info, struct gpio_event_matrix_info, info); + if (func == GPIO_EVENT_FUNC_SUSPEND || func == GPIO_EVENT_FUNC_RESUME) { + /* TODO: disable scanning */ + return 0; + } + + if (func == GPIO_EVENT_FUNC_INIT) { + if (mi->keymap == NULL || + mi->input_gpios == NULL || + mi->output_gpios == NULL) { + err = -ENODEV; + pr_err("gpiomatrix: Incomplete pdata\n"); + goto err_invalid_platform_data; + } + key_count = mi->ninputs * mi->noutputs; + + *data = kp = kzalloc(sizeof(*kp) + sizeof(kp->keys_pressed[0]) * + BITS_TO_LONGS(key_count), GFP_KERNEL); + if (kp == NULL) { + err = -ENOMEM; + pr_err("gpiomatrix: Failed to allocate private data\n"); + goto err_kp_alloc_failed; + } + kp->input_devs = input_devs; + kp->keypad_info = mi; + for (i = 0; i < key_count; i++) { + unsigned short keyentry = mi->keymap[i]; + unsigned short keycode = keyentry & MATRIX_KEY_MASK; + unsigned short dev = keyentry >> MATRIX_CODE_BITS; + if (dev >= input_devs->count) { + pr_err("gpiomatrix: bad device index %d >= " + "%d for key code %d\n", + dev, input_devs->count, keycode); + err = -EINVAL; + goto err_bad_keymap; + } + if (keycode && keycode <= KEY_MAX) + input_set_capability(input_devs->dev[dev], + EV_KEY, keycode); + } + + for (i = 0; i < mi->noutputs; i++) { + err = gpio_request(mi->output_gpios[i], "gpio_kp_out"); + if (err) { + pr_err("gpiomatrix: gpio_request failed for " + "output %d\n", mi->output_gpios[i]); + goto err_request_output_gpio_failed; + } + if (gpio_cansleep(mi->output_gpios[i])) { + pr_err("gpiomatrix: unsupported output gpio %d," + " can sleep\n", mi->output_gpios[i]); + err = -EINVAL; + goto err_output_gpio_configure_failed; + } + if (mi->flags & GPIOKPF_DRIVE_INACTIVE) + err = gpio_direction_output(mi->output_gpios[i], + !(mi->flags & GPIOKPF_ACTIVE_HIGH)); + else + err = gpio_direction_input(mi->output_gpios[i]); + if (err) { + pr_err("gpiomatrix: gpio_configure failed for " + "output %d\n", mi->output_gpios[i]); + goto err_output_gpio_configure_failed; + } + } + for (i = 0; i < mi->ninputs; i++) { + err = gpio_request(mi->input_gpios[i], "gpio_kp_in"); + if (err) { + pr_err("gpiomatrix: gpio_request failed for " + "input %d\n", mi->input_gpios[i]); + goto err_request_input_gpio_failed; + } + err = gpio_direction_input(mi->input_gpios[i]); + if (err) { + pr_err("gpiomatrix: gpio_direction_input failed" + " for input %d\n", mi->input_gpios[i]); + goto err_gpio_direction_input_failed; + } + } + kp->current_output = mi->noutputs; + kp->key_state_changed = 1; + + hrtimer_init(&kp->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + kp->timer.function = gpio_keypad_timer_func; + wake_lock_init(&kp->wake_lock, WAKE_LOCK_SUSPEND, "gpio_kp"); + err = gpio_keypad_request_irqs(kp); + kp->use_irq = err == 0; + + pr_info("GPIO Matrix Keypad Driver: Start keypad matrix for " + "%s%s in %s mode\n", input_devs->dev[0]->name, + (input_devs->count > 1) ? "..." : "", + kp->use_irq ? "interrupt" : "polling"); + + if (kp->use_irq) + wake_lock(&kp->wake_lock); + hrtimer_start(&kp->timer, ktime_set(0, 0), HRTIMER_MODE_REL); + + return 0; + } + + err = 0; + kp = *data; + + if (kp->use_irq) + for (i = mi->noutputs - 1; i >= 0; i--) + free_irq(gpio_to_irq(mi->input_gpios[i]), kp); + + hrtimer_cancel(&kp->timer); + wake_lock_destroy(&kp->wake_lock); + for (i = mi->noutputs - 1; i >= 0; i--) { +err_gpio_direction_input_failed: + gpio_free(mi->input_gpios[i]); +err_request_input_gpio_failed: + ; + } + for (i = mi->noutputs - 1; i >= 0; i--) { +err_output_gpio_configure_failed: + gpio_free(mi->output_gpios[i]); +err_request_output_gpio_failed: + ; + } +err_bad_keymap: + kfree(kp); +err_kp_alloc_failed: +err_invalid_platform_data: + return err; +} diff --git a/drivers/input/misc/gpio_output.c b/drivers/input/misc/gpio_output.c new file mode 100644 index 00000000..2aac2fad --- /dev/null +++ b/drivers/input/misc/gpio_output.c @@ -0,0 +1,97 @@ +/* drivers/input/misc/gpio_output.c + * + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include + +int gpio_event_output_event( + struct gpio_event_input_devs *input_devs, struct gpio_event_info *info, + void **data, unsigned int dev, unsigned int type, + unsigned int code, int value) +{ + int i; + struct gpio_event_output_info *oi; + oi = container_of(info, struct gpio_event_output_info, info); + if (type != oi->type) + return 0; + if (!(oi->flags & GPIOEDF_ACTIVE_HIGH)) + value = !value; + for (i = 0; i < oi->keymap_size; i++) + if (dev == oi->keymap[i].dev && code == oi->keymap[i].code) + gpio_set_value(oi->keymap[i].gpio, value); + return 0; +} + +int gpio_event_output_func( + struct gpio_event_input_devs *input_devs, struct gpio_event_info *info, + void **data, int func) +{ + int ret; + int i; + struct gpio_event_output_info *oi; + oi = container_of(info, struct gpio_event_output_info, info); + + if (func == GPIO_EVENT_FUNC_SUSPEND || func == GPIO_EVENT_FUNC_RESUME) + return 0; + + if (func == GPIO_EVENT_FUNC_INIT) { + int output_level = !(oi->flags & GPIOEDF_ACTIVE_HIGH); + + for (i = 0; i < oi->keymap_size; i++) { + int dev = oi->keymap[i].dev; + if (dev >= input_devs->count) { + pr_err("gpio_event_output_func: bad device " + "index %d >= %d for key code %d\n", + dev, input_devs->count, + oi->keymap[i].code); + ret = -EINVAL; + goto err_bad_keymap; + } + input_set_capability(input_devs->dev[dev], oi->type, + oi->keymap[i].code); + } + + for (i = 0; i < oi->keymap_size; i++) { + ret = gpio_request(oi->keymap[i].gpio, + "gpio_event_output"); + if (ret) { + pr_err("gpio_event_output_func: gpio_request " + "failed for %d\n", oi->keymap[i].gpio); + goto err_gpio_request_failed; + } + ret = gpio_direction_output(oi->keymap[i].gpio, + output_level); + if (ret) { + pr_err("gpio_event_output_func: " + "gpio_direction_output failed for %d\n", + oi->keymap[i].gpio); + goto err_gpio_direction_output_failed; + } + } + return 0; + } + + ret = 0; + for (i = oi->keymap_size - 1; i >= 0; i--) { +err_gpio_direction_output_failed: + gpio_free(oi->keymap[i].gpio); +err_gpio_request_failed: + ; + } +err_bad_keymap: + return ret; +} + diff --git a/drivers/input/misc/gpio_tilt_polled.c b/drivers/input/misc/gpio_tilt_polled.c new file mode 100644 index 00000000..da05cca8 --- /dev/null +++ b/drivers/input/misc/gpio_tilt_polled.c @@ -0,0 +1,213 @@ +/* + * Driver for tilt switches connected via GPIO lines + * not capable of generating interrupts + * + * Copyright (C) 2011 Heiko Stuebner + * + * based on: drivers/input/keyboard/gpio_keys_polled.c + * + * Copyright (C) 2007-2010 Gabor Juhos + * Copyright (C) 2010 Nuno Goncalves + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "gpio-tilt-polled" + +struct gpio_tilt_polled_dev { + struct input_polled_dev *poll_dev; + struct device *dev; + const struct gpio_tilt_platform_data *pdata; + + int last_state; + + int threshold; + int count; +}; + +static void gpio_tilt_polled_poll(struct input_polled_dev *dev) +{ + struct gpio_tilt_polled_dev *tdev = dev->private; + const struct gpio_tilt_platform_data *pdata = tdev->pdata; + struct input_dev *input = dev->input; + struct gpio_tilt_state *tilt_state = NULL; + int state, i; + + if (tdev->count < tdev->threshold) { + tdev->count++; + } else { + state = 0; + for (i = 0; i < pdata->nr_gpios; i++) + state |= (!!gpio_get_value(pdata->gpios[i].gpio) << i); + + if (state != tdev->last_state) { + for (i = 0; i < pdata->nr_states; i++) + if (pdata->states[i].gpios == state) + tilt_state = &pdata->states[i]; + + if (tilt_state) { + for (i = 0; i < pdata->nr_axes; i++) + input_report_abs(input, + pdata->axes[i].axis, + tilt_state->axes[i]); + + input_sync(input); + } + + tdev->count = 0; + tdev->last_state = state; + } + } +} + +static void gpio_tilt_polled_open(struct input_polled_dev *dev) +{ + struct gpio_tilt_polled_dev *tdev = dev->private; + const struct gpio_tilt_platform_data *pdata = tdev->pdata; + + if (pdata->enable) + pdata->enable(tdev->dev); + + /* report initial state of the axes */ + tdev->last_state = -1; + tdev->count = tdev->threshold; + gpio_tilt_polled_poll(tdev->poll_dev); +} + +static void gpio_tilt_polled_close(struct input_polled_dev *dev) +{ + struct gpio_tilt_polled_dev *tdev = dev->private; + const struct gpio_tilt_platform_data *pdata = tdev->pdata; + + if (pdata->disable) + pdata->disable(tdev->dev); +} + +static int gpio_tilt_polled_probe(struct platform_device *pdev) +{ + const struct gpio_tilt_platform_data *pdata = pdev->dev.platform_data; + struct device *dev = &pdev->dev; + struct gpio_tilt_polled_dev *tdev; + struct input_polled_dev *poll_dev; + struct input_dev *input; + int error, i; + + if (!pdata || !pdata->poll_interval) + return -EINVAL; + + tdev = kzalloc(sizeof(struct gpio_tilt_polled_dev), GFP_KERNEL); + if (!tdev) { + dev_err(dev, "no memory for private data\n"); + return -ENOMEM; + } + + error = gpio_request_array(pdata->gpios, pdata->nr_gpios); + if (error) { + dev_err(dev, + "Could not request tilt GPIOs: %d\n", error); + goto err_free_tdev; + } + + poll_dev = input_allocate_polled_device(); + if (!poll_dev) { + dev_err(dev, "no memory for polled device\n"); + error = -ENOMEM; + goto err_free_gpios; + } + + poll_dev->private = tdev; + poll_dev->poll = gpio_tilt_polled_poll; + poll_dev->poll_interval = pdata->poll_interval; + poll_dev->open = gpio_tilt_polled_open; + poll_dev->close = gpio_tilt_polled_close; + + input = poll_dev->input; + + input->name = pdev->name; + input->phys = DRV_NAME"/input0"; + input->dev.parent = &pdev->dev; + + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0001; + input->id.version = 0x0100; + + __set_bit(EV_ABS, input->evbit); + for (i = 0; i < pdata->nr_axes; i++) + input_set_abs_params(input, pdata->axes[i].axis, + pdata->axes[i].min, pdata->axes[i].max, + pdata->axes[i].fuzz, pdata->axes[i].flat); + + tdev->threshold = DIV_ROUND_UP(pdata->debounce_interval, + pdata->poll_interval); + + tdev->poll_dev = poll_dev; + tdev->dev = dev; + tdev->pdata = pdata; + + error = input_register_polled_device(poll_dev); + if (error) { + dev_err(dev, "unable to register polled device, err=%d\n", + error); + goto err_free_polldev; + } + + platform_set_drvdata(pdev, tdev); + + return 0; + +err_free_polldev: + input_free_polled_device(poll_dev); +err_free_gpios: + gpio_free_array(pdata->gpios, pdata->nr_gpios); +err_free_tdev: + kfree(tdev); + + return error; +} + +static int gpio_tilt_polled_remove(struct platform_device *pdev) +{ + struct gpio_tilt_polled_dev *tdev = platform_get_drvdata(pdev); + const struct gpio_tilt_platform_data *pdata = tdev->pdata; + + platform_set_drvdata(pdev, NULL); + + input_unregister_polled_device(tdev->poll_dev); + input_free_polled_device(tdev->poll_dev); + + gpio_free_array(pdata->gpios, pdata->nr_gpios); + + kfree(tdev); + + return 0; +} + +static struct platform_driver gpio_tilt_polled_driver = { + .probe = gpio_tilt_polled_probe, + .remove = gpio_tilt_polled_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + }, +}; + +module_platform_driver(gpio_tilt_polled_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Heiko Stuebner "); +MODULE_DESCRIPTION("Polled GPIO tilt driver"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/drivers/input/misc/headset.c b/drivers/input/misc/headset.c new file mode 100644 index 00000000..9a46670e --- /dev/null +++ b/drivers/input/misc/headset.c @@ -0,0 +1,462 @@ +/* + * Copyright (C) 2012 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifndef HEADSET_DETECT_GPIO +#define HEADSET_DETECT_GPIO 165 +#endif +#ifndef HEADSET_BUTTON_GPIO +#define HEADSET_BUTTON_GPIO 164 +#endif + +#ifndef HEADSET_DETECT_GPIO_ACTIVE_LOW +#define HEADSET_DETECT_GPIO_ACTIVE_LOW 1 +#endif +#ifndef HEADSET_BUTTON_GPIO_ACTIVE_LOW +#define HEADSET_BUTTON_GPIO_ACTIVE_LOW 0 +#endif + +#ifndef HEADSET_DETECT_GPIO_DEBOUNCE_SW +#define HEADSET_DETECT_GPIO_DEBOUNCE_SW 1000 +#endif +#ifndef HEADSET_BUTTON_GPIO_DEBOUNCE_SW +#define HEADSET_BUTTON_GPIO_DEBOUNCE_SW 100 +#endif + +static enum hrtimer_restart report_headset_button_status(int active, struct _headset_gpio *hgp); +static enum hrtimer_restart report_headset_detect_status(int active, struct _headset_gpio *hgp); +static struct _headset headset = { + .sdev = { + .name = "h2w", + }, + .detect = { + .desc = "headset detect", + .active_low = HEADSET_DETECT_GPIO_ACTIVE_LOW, + .gpio = HEADSET_DETECT_GPIO, + .debounce = 0, + .debounce_sw = HEADSET_DETECT_GPIO_DEBOUNCE_SW, + .irq_enabled = 1, + .callback = report_headset_detect_status, + }, + .button = { + .desc = "headset button", + .active_low = HEADSET_BUTTON_GPIO_ACTIVE_LOW, + .gpio = HEADSET_BUTTON_GPIO, + .debounce = 0, + .debounce_sw = HEADSET_BUTTON_GPIO_DEBOUNCE_SW, + .irq_enabled = 1, + .callback = report_headset_button_status, + .timeout_ms = 800, /* 800ms for long button down */ + }, +}; + + +#ifndef headset_gpio_init +#define headset_gpio_init(gpio, desc) \ + do { \ + gpio_request(gpio, desc); \ + gpio_direction_input(gpio); \ + } while (0) +#endif + +#ifndef headset_gpio_free +#define headset_gpio_free(gpio) \ + gpio_free(gpio) +#endif + +#ifndef headset_gpio2irq_free +#define headset_gpio2irq_free(irq, args) { } +#endif + +#ifndef headset_gpio2irq +#define headset_gpio2irq(gpio) \ + gpio_to_irq(gpio) +#endif + +#ifndef headset_gpio_set_irq_type +#define headset_gpio_set_irq_type(irq, type) \ + irq_set_irq_type(irq, type) +#endif + +#ifndef headset_gpio_get_value +#define headset_gpio_get_value(gpio) \ + gpio_get_value(gpio) +#endif + +#ifndef headset_gpio_debounce +#define headset_gpio_debounce(gpio, ms) \ + gpio_set_debounce(gpio, ms) +#endif + +#ifndef headset_hook_detect +#define headset_hook_detect(status) { } +#endif + +#define HEADSET_DEBOUNCE_ROUND_UP(dw) \ + dw = (((dw ? dw : 1) + HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD - 1) / \ + HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD) * HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD; + +static struct _headset_keycap headset_key_capability[20] = { + { EV_KEY, KEY_MEDIA }, + { EV_KEY, KEY_END }, + { EV_KEY, KEY_RESERVED }, +}; + +static unsigned int (*headset_get_button_code_board_method)(int v); +static unsigned int (*headset_map_code2push_code_board_method)(unsigned int code, int push_type); +static __devinit int headset_button_probe(struct platform_device *pdev) +{ + struct _headset_button *headset_button = platform_get_drvdata(pdev); + headset_get_button_code_board_method = headset_button->headset_get_button_code_board_method; + headset_map_code2push_code_board_method = headset_button->headset_map_code2push_code_board_method; + memcpy(headset_key_capability, headset_button->cap, sizeof headset_button->cap); + return 0; +} + +static struct platform_driver headset_button_driver = { + .driver = { + .name = "headset-button", + .owner = THIS_MODULE, + }, + .probe = headset_button_probe, +}; + +static unsigned int headset_get_button_code(int v) +{ + unsigned int code; + if (headset_get_button_code_board_method) + code = headset_get_button_code_board_method(v); + else + code = KEY_MEDIA; + return code; +} + +static unsigned int headset_map_code2key_type(unsigned int code) +{ + unsigned int key_type = EV_KEY; + int i; + for(i = 0; headset_key_capability[i].key != KEY_RESERVED && + headset_key_capability[i].key != code && i < ARRY_SIZE(headset_key_capability); i++); + if (i < ARRY_SIZE(headset_key_capability) && + headset_key_capability[i].key == code) + key_type = headset_key_capability[i].type; + else + pr_err("headset not find code [0x%x]'s maping type\n", code); + return key_type; +} + +static unsigned int headset_map_code2push_code(unsigned int code, int push_type) +{ + if (headset_map_code2push_code_board_method) + return headset_map_code2push_code_board_method(code, push_type); + + switch (push_type) { + case HEADSET_BUTTON_DOWN_SHORT: + code = KEY_MEDIA; + break; + case HEADSET_BUTTON_DOWN_LONG: + code = KEY_END; + break; + } + + return code; +} + +static void headset_gpio_irq_enable(int enable, struct _headset_gpio *hgp); +#define HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD 50 /* 10 */ +static enum hrtimer_restart report_headset_button_status(int active, struct _headset_gpio *hgp) +{ + enum hrtimer_restart restart; + int button_push_type = HEADSET_BUTTON_DOWN_INVALID; + unsigned int key_type; + static int pre_code = KEY_RESERVED; + static int step = 0; + + if (active < 0) { + step = 0; + pre_code = KEY_RESERVED; + return HRTIMER_NORESTART; + } + if (active) { + restart = HRTIMER_RESTART; + if (++step > 3) + step = 0; + switch (step) { + case 1: + pre_code = headset_get_button_code(0); + break; + case 2: + button_push_type = HEADSET_BUTTON_DOWN_LONG; + break; + } + } else { + restart = HRTIMER_NORESTART; + if (step == 1) + button_push_type = HEADSET_BUTTON_DOWN_SHORT; + step = 0; + } + + if (button_push_type != HEADSET_BUTTON_DOWN_INVALID) { + unsigned int code = headset_map_code2push_code(pre_code, button_push_type); + key_type = headset_map_code2key_type(code); + switch (key_type) { + case EV_KEY: + input_event(hgp->parent->input, key_type, code, 1); + input_sync(hgp->parent->input); + input_event(hgp->parent->input, key_type, code, 0); + input_sync(hgp->parent->input); + pr_info("headset button-%d[%dms]\n", code, hgp->holded); + break; + default: + pr_err("headset not support key type [%d]\n", key_type); + } + } + return restart; +} + +static enum hrtimer_restart report_headset_detect_status(int active, struct _headset_gpio *hgp) +{ + struct _headset * ht = hgp->parent; + + if (active) { + headset_hook_detect(1); + ht->headphone = 0; + /* ht->headphone = ht->button.active_low ^ headset_gpio_get_value(ht->button.gpio); */ + if (ht->headphone) { + ht->type = BIT_HEADSET_NO_MIC; + queue_work(ht->switch_workqueue, &ht->switch_work); + pr_info("headphone plug in\n"); + } else { + ht->type = BIT_HEADSET_MIC; + queue_work(ht->switch_workqueue, &ht->switch_work); + pr_info("headset plug in\n"); + headset_gpio_set_irq_type(ht->button.irq, ht->button.irq_type_active); + headset_gpio_irq_enable(1, &ht->button); + } + } else { + headset_gpio_irq_enable(0, &ht->button); + ht->button.callback(-1, &ht->button); + headset_hook_detect(0); + if (ht->headphone) + pr_info("headphone plug out\n"); + else { + pr_info("headset plug out\n"); + } + ht->type = BIT_HEADSET_OUT; + queue_work(ht->switch_workqueue, &ht->switch_work); + } + /* use below code only when gpio irq misses state, because of the dithering */ + headset_gpio_set_irq_type(hgp->irq, active ? hgp->irq_type_inactive : hgp->irq_type_active); + return HRTIMER_NORESTART; +} + +static enum hrtimer_restart headset_gpio_timer_func(struct hrtimer *timer) +{ + enum hrtimer_restart restart = HRTIMER_RESTART; + struct _headset_gpio *hgp = + container_of(timer, struct _headset_gpio, timer); + int active = hgp->active_low ^ headset_gpio_get_value(hgp->gpio); /* hgp->active */ + int green_ch = (!active && &hgp->parent->detect == hgp); + if (active != hgp->active) { + pr_info("The value %s mismatch [%d:%d] at %dms!\n", + hgp->desc, active, hgp->active, hgp->holded); + hgp->holded = 0; + } + pr_debug("%s : %s %s green_ch[%d], holed=%d, debounce_sw=%d\n", __func__, + hgp->desc, active ? "active" : "inactive", green_ch, hgp->holded, hgp->debounce_sw); + hgp->holded += HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD; + if (hgp->holded >= hgp->debounce_sw || green_ch) { + if (hgp->holded == hgp->debounce_sw || \ + hgp->holded == hgp->timeout_ms || \ + green_ch) { + pr_debug("call headset gpio handler\n"); + restart = hgp->callback(active, hgp); + } else + pr_debug("gpio <%d> has kept active for %d ms\n", hgp->gpio, hgp->holded); + } + if (restart == HRTIMER_RESTART) + hrtimer_forward_now(timer, + ktime_set(HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD / 1000, + (HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD % 1000) * 1000000)); /* repeat timer */ + return restart; +} + +static irqreturn_t headset_gpio_irq_handler(int irq, void *dev) +{ + struct _headset_gpio *hgp = dev; + hrtimer_cancel(&hgp->timer); + hgp->active = hgp->active_low ^ headset_gpio_get_value(hgp->gpio); + headset_gpio_set_irq_type(hgp->irq, hgp->active ? hgp->irq_type_inactive : hgp->irq_type_active); + pr_debug("%s : %s %s\n", __func__, hgp->desc, hgp->active ? "active" : "inactive"); + hgp->holded = 0; + hrtimer_start(&hgp->timer, + ktime_set(HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD / 1000, + (HEADSET_GPIO_DEBOUNCE_SW_SAMPLE_PERIOD % 1000) * 1000000), + HRTIMER_MODE_REL); + return IRQ_HANDLED; +} + +static void headset_gpio_irq_enable(int enable, struct _headset_gpio *hgp) +{ + int action = 0; + if (enable) { + if (!hgp->irq_enabled) { + hrtimer_cancel(&hgp->timer); + hgp->irq_enabled = 1; + action = 1; + hgp->holded = 0; + enable_irq(hgp->irq); + } + } else { + if (hgp->irq_enabled) { + disable_irq(hgp->irq); + hrtimer_cancel(&hgp->timer); + hgp->irq_enabled = 0; + action = 1; + hgp->holded = 0; + } + } + pr_info("%s [ irq=%d ] --- %saction %s\n", __func__, hgp->irq_enabled, action ? "do " : "no ", hgp->desc); +} + +static void headset_switch_state(struct work_struct *work) +{ + struct _headset *ht; + int type; + + ht = container_of(work, struct _headset, switch_work); + type = ht->type; + switch_set_state(&headset.sdev, type); + pr_info("set headset state to %d\n", type); +} + +static int __init headset_init(void) +{ + int ret, i; + struct _headset *ht = &headset; + + ret = switch_dev_register(&ht->sdev); + if (ret < 0) { + pr_err("switch_dev_register failed!\n"); + return ret; + } + platform_driver_register(&headset_button_driver); + ht->input = input_allocate_device(); + if (ht->input == NULL) { + pr_err("switch_dev_register failed!\n"); + goto _switch_dev_register; + } + ht->input->name = "headset-keyboard"; + ht->input->id.bustype = BUS_HOST; + ht->input->id.vendor = 0x0001; + ht->input->id.product = 0x0001; + ht->input->id.version = 0x0100; + + for(i = 0; headset_key_capability[i].key != KEY_RESERVED; i++) { + __set_bit(headset_key_capability[i].type, ht->input->evbit); + input_set_capability(ht->input, headset_key_capability[i].type, headset_key_capability[i].key); + } + + if (input_register_device(ht->input)) + goto _switch_dev_register; + + headset_gpio_init(ht->detect.gpio, ht->detect.desc); + headset_gpio_init(ht->button.gpio, ht->button.desc); + + headset_gpio_debounce(ht->detect.gpio, ht->detect.debounce * 1000); + headset_gpio_debounce(ht->button.gpio, ht->button.debounce * 1000); + + hrtimer_init(&ht->button.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ht->button.timer.function = headset_gpio_timer_func; + HEADSET_DEBOUNCE_ROUND_UP(ht->button.debounce_sw); + HEADSET_DEBOUNCE_ROUND_UP(ht->button.timeout_ms); + ht->button.parent = ht; + ht->button.irq = headset_gpio2irq(ht->button.gpio); + ht->button.irq_type_active = ht->button.active_low ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH; + ht->button.irq_type_inactive = ht->button.active_low ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->button.irq, headset_gpio_irq_handler, + ht->button.irq_type_active, ht->button.desc, &ht->button); + if (ret) { + pr_err("request_irq gpio %d's irq failed!\n", ht->button.gpio); + goto _gpio_request; + } + headset_gpio_irq_enable(0, &ht->button); + + hrtimer_init(&ht->detect.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ht->detect.timer.function = headset_gpio_timer_func; + HEADSET_DEBOUNCE_ROUND_UP(ht->detect.debounce_sw); + ht->detect.parent = ht; + ht->detect.irq = headset_gpio2irq(ht->detect.gpio); + ht->detect.irq_type_active = ht->detect.active_low ? IRQF_TRIGGER_LOW : IRQF_TRIGGER_HIGH; + ht->detect.irq_type_inactive = ht->detect.active_low ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->detect.irq, headset_gpio_irq_handler, + ht->detect.irq_type_active, ht->detect.desc, &ht->detect); + if (ret) { + pr_err("request_irq gpio %d's irq failed!\n", ht->detect.gpio); + goto _headset_button_gpio_irq_handler; + } + + INIT_WORK(&ht->switch_work, headset_switch_state); + ht->switch_workqueue = create_singlethread_workqueue("headset_switch"); + + if (ht->switch_workqueue == NULL) { + pr_err("can't create headset switch workqueue\n"); + ret = -ENOMEM; + goto _headset_button_gpio_irq_handler; + } + + return 0; + + destroy_workqueue(ht->switch_workqueue); +_headset_button_gpio_irq_handler: + free_irq(ht->button.irq, &ht->button); + headset_gpio2irq_free(ht->button.irq, &ht->button); +_gpio_request: + headset_gpio_free(ht->detect.gpio); + headset_gpio_free(ht->button.gpio); + input_free_device(ht->input); +_switch_dev_register: + platform_driver_unregister(&headset_button_driver); + switch_dev_unregister(&ht->sdev); + return ret; +} +module_init(headset_init); + +static void __exit headset_exit(void) +{ + struct _headset *ht = &headset; + destroy_workqueue(ht->switch_workqueue); + headset_gpio_irq_enable(0, &ht->button); + headset_gpio_irq_enable(0, &ht->detect); + free_irq(ht->detect.irq, &ht->detect); + headset_gpio2irq_free(ht->detect.irq, &ht->detect); + free_irq(ht->button.irq, &ht->button); + headset_gpio2irq_free(ht->button.irq, &ht->button); + headset_gpio_free(ht->detect.gpio); + headset_gpio_free(ht->button.gpio); + input_free_device(ht->input); + platform_driver_unregister(&headset_button_driver); + switch_dev_unregister(&ht->sdev); +} +module_exit(headset_exit); + +MODULE_DESCRIPTION("headset & button detect driver"); +MODULE_AUTHOR("Luther Ge "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/headset_sprd.c b/drivers/input/misc/headset_sprd.c new file mode 100644 index 00000000..db6d1f7d --- /dev/null +++ b/drivers/input/misc/headset_sprd.c @@ -0,0 +1,2377 @@ +/* + * Copyright (C) 2013 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#ifdef CONFIG_OF +#include +#include +#endif + +//==================== debug ==================== +#define ENTER \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_HEADSET_DBG][%d] func: %s line: %04d\n", adie_type, __func__, __LINE__); }while(0) + +#define PRINT_DBG(format,x...) \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_HEADSET_DBG][%d] " format, adie_type, ## x); }while(0) + +#define PRINT_INFO(format,x...) \ +do{ printk(KERN_INFO "[SPRD_HEADSET_INFO][%d] " format, adie_type, ## x); }while(0) + +#define PRINT_WARN(format,x...) \ +do{ printk(KERN_INFO "[SPRD_HEADSET_WARN][%d] " format, adie_type, ## x); }while(0) + +#define PRINT_ERR(format,x...) \ +do{ printk(KERN_ERR "[SPRD_HEADSET_ERR][%d] func: %s line: %04d info: " format, adie_type, __func__, __LINE__, ## x); }while(0) +//==================== debug ==================== + +/********************************************** + * The micro ADPGAR_BYP_SELECT is used for avoiding the Bug#298417, + * please refer to Bug#298417 to confirm your configuration. + **********************************************/ +#define ADPGAR_BYP_SELECT + +#ifdef CONFIG_HEADSET_STS_POLLING_DISABLED +#undef SPRD_STS_POLLING_EN +#else +#define SPRD_STS_POLLING_EN +#endif + +#define PLUG_CONFIRM_COUNT (2) +#define NO_MIC_RETRY_COUNT (0) +#define ADC_READ_COUNT (5) +#define ADC_READ_LOOP (2) +#define ADC_GND (100) +#define SCI_ADC_GET_VALUE_COUNT (50) + +#define ARM_MF_REG (0x0110) +#define HEAD_INSERT2_EIC_EN (BIT(15)) +#define HEAD_INSERT_EIC_EN (BIT(14)) + +#define EIC3_DBNC_CTRL (0x4C) +#define DBNC_CNT3_VALUE (30) +#define DBNC_CNT3_SHIFT (0) +#define DBNC_CNT3_MASK (0xFFF << DBNC_CNT3_SHIFT) + +#define EIC5_DBNC_CTRL (0x54) +#define DBNC_CNT5_VALUE (100) +#define DBNC_CNT5_SHIFT (0) +#define DBNC_CNT5_MASK (0xFFF << DBNC_CNT5_SHIFT) + +#if (defined(CONFIG_ARCH_SCX15)) + #define ADIE_CHID_LOW 0x0134 + #define ADIE_CHID_HIGH 0x0138 +#else + #if (defined(CONFIG_ARCH_SCX35)) + #define ADIE_CHID_LOW 0x0108 + #define ADIE_CHID_HIGH 0x010C + #endif +#endif + +#if (defined(CONFIG_ARCH_SCX15)) + #define CLK_AUD_HID_EN (BIT(4)) + #define CLK_AUD_HBD_EN (BIT(3)) +#else + #if (defined(CONFIG_ARCH_SCX35)) + #define CLK_AUD_HID_EN (BIT(5)) + #define CLK_AUD_HBD_EN (BIT(4)) + #endif +#endif + +#define HEADMIC_DETECT_BASE (ANA_AUDCFGA_INT_BASE) +#define HEADMIC_DETECT_REG(X) (HEADMIC_DETECT_BASE + (X)) + +#define HDT_EN (BIT(5)) +#define AUD_EN (BIT(4)) + +#define HEADMIC_BUTTON_BASE (ANA_HDT_INT_BASE) +#define HEADMIC_BUTTON_REG(X) (HEADMIC_BUTTON_BASE + (X)) +#define HID_CFG0 (0x0080) +#define HID_CFG2 (0x0088) +#define HID_CFG3 (0x008C) +#define HID_CFG4 (0x0090) + +#define ANA_CFG0 (0x0040) +#define ANA_CFG1 (0x0044) +#define ANA_CFG2 (0x0048) +#define ANA_CFG5 (0x0064) +#define ANA_CFG20 (0x00A0) +#define ANA_STS0 (0x00C0) + +#define HEADMIC_DETECT_GLB_REG(X) (ANA_REGS_GLB_BASE + (X)) + +#define HID_TMR_T1T2_STEP_SHIFT (5) +#define HID_TMR_T0_SHIFT (0) +#define HID_TMR_T1_SHIFT (0) +#define HID_TMR_T2_SHIFT (0) + +#define HID_TMR_T1T2_STEP_MASK (0x1F << HID_TMR_T1T2_STEP_SHIFT) +#define HID_TMR_T0_MASK (0x1F << HID_TMR_T0_SHIFT) +#define HID_TMR_T1_MASK (0xFFFF << HID_TMR_T1_SHIFT) +#define HID_TMR_T2_MASK (0xFFFF << HID_TMR_T2_SHIFT) + +#define HID_TMR_T1T2_STEP_VAL (0x1) +#define HID_TMR_T0_VAL (0xF) +#define HID_TMR_T1_VAL (0xF) +#define HID_TMR_T2_VAL (0xF) + +#define AUDIO_ICM_PLUS_EN (BIT(2)) + +#define AUDIO_HEADMIC_SLEEP_EN (BIT(1)) +#define AUDIO_MICBIAS_HV_EN (BIT(2)) +#define AUDIO_MICBIAS_V_SHIFT (3) +#define AUDIO_MICBIAS_V_MASK (0x3 << AUDIO_MICBIAS_V_SHIFT) +#define AUDIO_MICBIAS_V_1P7_OR_2P2 (0) +#define AUDIO_MICBIAS_V_1P9_OR_2P4 (1) +#define AUDIO_MICBIAS_V_2P1_OR_2P7 (2) +#define AUDIO_MICBIAS_V_2P3_OR_3P0 (3) + +#define AUDIO_ADPGAR_BYP_SHIFT (10) +#define AUDIO_ADPGAR_BYP_MASK (0x3 << AUDIO_ADPGAR_BYP_SHIFT) +#define AUDIO_ADPGAR_BYP_NORMAL (0) +#define AUDIO_ADPGAR_BYP_ADC_PGAR1_2_ADCR (1) +#define AUDIO_ADPGAR_BYP_HEADMIC_2_ADCR (2) +#define AUDIO_ADPGAR_BYP_ALL_DISCONNECTED (3) + +#if (defined(CONFIG_ARCH_SCX15)) + #define AUDIO_HEAD_SDET_SHIFT (4) +#else + #if (defined(CONFIG_ARCH_SCX35)) + #define AUDIO_HEAD_SDET_SHIFT (5) + #endif +#endif +#define AUDIO_HEAD_SDET_MASK (0x3 << AUDIO_HEAD_SDET_SHIFT) +#define AUDIO_HEAD_SDET_2P1_OR_1P4 (3) +#define AUDIO_HEAD_SDET_2P3_OR_1P5 (2) +#define AUDIO_HEAD_SDET_2P5_OR_1P6 (1) +#define AUDIO_HEAD_SDET_2P7_OR_1P7 (0) + +#if (defined(CONFIG_ARCH_SCX15)) + #define AUDIO_HEAD_INS_VREF_SHIFT (7) +#else + #if (defined(CONFIG_ARCH_SCX35)) + #define AUDIO_HEAD_INS_VREF_SHIFT (8) + #endif +#endif +#define AUDIO_HEAD_INS_VREF_MASK (0x3 << AUDIO_HEAD_INS_VREF_SHIFT) +#define AUDIO_HEAD_INS_VREF_2P1_OR_1P4 (3) +#define AUDIO_HEAD_INS_VREF_2P3_OR_1P5 (2) +#define AUDIO_HEAD_INS_VREF_2P5_OR_1P6 (1) +#define AUDIO_HEAD_INS_VREF_2P7_OR_1P7 (0) + +#if (defined(CONFIG_ARCH_SCX15)) + #define AUDIO_HEAD_SBUT_SHIFT (0) +#else + #if (defined(CONFIG_ARCH_SCX35)) + #define AUDIO_HEAD_SBUT_SHIFT (1) + #endif +#endif +#define AUDIO_HEAD_SBUT_MASK (0xF << AUDIO_HEAD_SBUT_SHIFT) + +#define AUDIO_HEADMIC_ADC_SEL (BIT(13)) +#define AUDIO_HEAD_INS_HMBIAS_EN (BIT(11)) + +#if (defined(CONFIG_ARCH_SCX15)) + #define AUDIO_V2ADC_EN (BIT(15)) + #define AUDIO_HEAD_BUF_EN (BIT(14)) + #define AUDIO_HEAD2ADC_SEL_SHIFT (12) + #define AUDIO_HEAD2ADC_SEL_MASK (0x3 << AUDIO_HEAD2ADC_SEL_SHIFT) + #define AUDIO_HEAD2ADC_SEL_DISABLE (0) + #define AUDIO_HEAD2ADC_SEL_MIC_IN (1) + #define AUDIO_HEAD2ADC_SEL_L_INT (2) + #define AUDIO_HEAD2ADC_SEL_DRO_L (3) +#else + #if (defined(CONFIG_ARCH_SCX35)) + #define AUDIO_V2ADC_EN (BIT(14)) + #define AUDIO_HEAD_BUF_EN (BIT(15)) + #define AUDIO_HEAD2ADC_SEL_SHIFT (13) + #define AUDIO_HEAD2ADC_SEL_MASK (0x1 << AUDIO_HEAD2ADC_SEL_SHIFT) + #define AUDIO_HEAD2ADC_SEL_DISABLE (0) + #define AUDIO_HEAD2ADC_SEL_MIC_IN (1) + #define AUDIO_HEAD2ADC_SEL_L_INT (0) + #define AUDIO_HEAD2ADC_SEL_DRO_L (0) + #endif +#endif + +#define AUDIO_HEAD_BUTTON (BIT(7)) +#define AUDIO_HEAD_INSERT (BIT(6)) +#define AUDIO_HEAD_INSERT_2 (BIT(5)) + +#define ABS(x) (((x) < (0)) ? (-(x)) : (x)) +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) + +#define headset_reg_read(addr) \ + do { \ + sci_adi_read(addr); \ +} while(0) + +#define headset_reg_set_val(addr, val, mask, shift) \ + do { \ + uint32_t temp; \ + temp = sci_adi_read(addr); \ + temp = (temp & (~mask)) | ((val) << (shift)); \ + sci_adi_raw_write(addr, temp); \ + } while(0) + +#define headset_reg_clr_bit(addr, bit) \ + do { \ + uint32_t temp; \ + temp = sci_adi_read(addr); \ + temp = temp & (~bit); \ + sci_adi_raw_write(addr, temp); \ + } while(0) + +#define headset_reg_set_bit(addr, bit) \ + do { \ + uint32_t temp; \ + temp = sci_adi_read(addr); \ + temp = temp | bit; \ + sci_adi_raw_write(addr, temp); \ + } while(0) + +static inline uint32_t headset_reg_get_bit(uint32_t addr, uint32_t bit) +{ + uint32_t temp; + temp = sci_adi_read(addr); + temp = temp & bit; + return temp; +} + +typedef enum sprd_headset_type { + HEADSET_NORMAL, + HEADSET_NO_MIC, + HEADSET_NORTH_AMERICA, + HEADSET_APPLE, + HEADSET_CAMERA_POLE, //add by lgd + HEADSET_TYPE_ERR = -1, +} SPRD_HEADSET_TYPE; + +static struct delayed_work reg_dump_work; +static struct workqueue_struct *reg_dump_work_queue; + +/* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT +static struct delayed_work camera_pole_work; +static struct workqueue_struct *camera_pole_work_queue; +static int headset_ctl = 0; +#define CAMERA_POLE_CODE KEY_CAMERA +#endif +/* add by lgd > */ + +/***polling ana_sts0 to avoid the hardware defect***/ +#ifdef SPRD_STS_POLLING_EN +static struct delayed_work sts_check_work; +static struct workqueue_struct *sts_check_work_queue; +static int plug_state_class_g_on = 0; +static int sts_check_work_need_to_cancel = 1; +#endif +/***polling ana_sts0 to avoid the hardware defect***/ + +#ifdef ADPGAR_BYP_SELECT +static struct delayed_work adpgar_byp_select_work; +static struct workqueue_struct *adpgar_byp_select_work_queue; +#endif + +static DEFINE_SPINLOCK(irq_button_lock); +static DEFINE_SPINLOCK(irq_detect_lock); +static int detect_err_count = 0; +static int debug_level = 0; +static int adie_type = 100; +static int gpio_detect_value_last = 0; +static int gpio_button_value_last = 0; +static volatile int button_state_last = 0; //0==released, 1==pressed +static int current_key_code = KEY_RESERVED; +static int plug_state_last = 0; //if the hardware detected the headset is plug in, set plug_state_last = 1 +static struct wake_lock headset_detect_wakelock; +static struct wake_lock headset_button_wakelock; +static struct semaphore headset_sem; + + +static struct sprd_headset headset = { + .sdev = { + .name = "h2w", + }, +}; + +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED +static int adc_get_ideal(int adc_mic); +#endif +//======================== audio codec ======================== +static struct sprd_headset_power { + struct regulator *head_mic; + struct regulator *vcom_buf; + struct regulator *vbo; +} sprd_hts_power; + +static int sprd_headset_power_get(struct device *dev, + struct regulator **regu, const char *id) +{ + if (!*regu) { + *regu = regulator_get(dev, id); + if (IS_ERR(*regu)) { + pr_err("ERR:Failed to request %ld: %s\n", + PTR_ERR(*regu), id); + *regu = 0; + return PTR_ERR(*regu); + } + } + return 0; +} + +static int sprd_headset_power_init(struct device *dev) +{ + int ret = 0; + ret = + sprd_headset_power_get(dev, &sprd_hts_power.head_mic, + "HEADMICBIAS"); + if (ret || (sprd_hts_power.head_mic == NULL)) { + sprd_hts_power.head_mic = 0; + return ret; + } + regulator_set_voltage(sprd_hts_power.head_mic, 950000, 950000); + + ret = sprd_headset_power_get(dev, &sprd_hts_power.vcom_buf, "VCOM_BUF"); + if (ret) { + sprd_hts_power.vcom_buf = 0; + goto __err1; + } + + ret = sprd_headset_power_get(dev, &sprd_hts_power.vbo, "VBO"); + if (ret) { + sprd_hts_power.vbo = 0; + goto __err2; + } + if (sprd_hts_power.vbo != NULL) + regulator_enable(sprd_hts_power.vbo); + goto __ok; +__err2: + regulator_put(sprd_hts_power.vcom_buf); +__err1: + regulator_put(sprd_hts_power.head_mic); +__ok: + return ret; +} + +static void sprd_headset_power_deinit(void) +{ + regulator_put(sprd_hts_power.head_mic); + regulator_put(sprd_hts_power.vcom_buf); + regulator_put(sprd_hts_power.vbo); +} + +static int sprd_headset_audio_block_is_running(struct device *dev) +{ + return regulator_is_enabled(sprd_hts_power.vcom_buf) + || regulator_is_enabled(sprd_hts_power.vbo); +} + +static int sprd_headset_audio_headmic_sleep_disable(struct device *dev, int on) +{ + int ret = 0; + if (!sprd_hts_power.head_mic) { + return -1; + } + + if (on) { + ret = regulator_enable(sprd_hts_power.vbo); + ret = + regulator_set_mode(sprd_hts_power.head_mic, + REGULATOR_MODE_NORMAL); + } else { + ret = regulator_disable(sprd_hts_power.vbo); + if (sprd_headset_audio_block_is_running(dev)) { + ret = + regulator_set_mode(sprd_hts_power.head_mic, + REGULATOR_MODE_NORMAL); + } else { + ret = + regulator_set_mode(sprd_hts_power.head_mic, + REGULATOR_MODE_STANDBY); + } + } + return ret; +} + +static int sprd_headset_headmic_bias_control(struct device *dev, int on) +{ + int ret = 0; + if (!sprd_hts_power.head_mic) { + return -1; + } + if (on) { + ret = regulator_enable(sprd_hts_power.head_mic); + } else { + ret = regulator_disable(sprd_hts_power.head_mic); + } + if (!ret) { + /* Set HEADMIC_SLEEP when audio block closed */ + if (sprd_headset_audio_block_is_running(dev)) { + ret = + regulator_set_mode(sprd_hts_power.head_mic, + REGULATOR_MODE_NORMAL); + } else { + ret = + regulator_set_mode(sprd_hts_power.head_mic, + REGULATOR_MODE_STANDBY); + } + } + return ret; +} + +static BLOCKING_NOTIFIER_HEAD(hp_chain_list); +int hp_register_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&hp_chain_list, nb); +} +EXPORT_SYMBOL(hp_register_notifier); + +int hp_unregister_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&hp_chain_list, nb); +} +EXPORT_SYMBOL(hp_unregister_notifier); + +static int hp_notifier_call_chain(unsigned long val) +{ + return (blocking_notifier_call_chain(&hp_chain_list, val, NULL) + == NOTIFY_BAD) ? -EINVAL : 0; +} + +int get_hp_plug_state(void) +{ + return !!plug_state_last; +} +EXPORT_SYMBOL(get_hp_plug_state); +//======================== audio codec ======================== + +static int wrap_sci_adc_get_value(unsigned int channel, int scale) +{ + int count = 0; + int average = 0; + + while(count < SCI_ADC_GET_VALUE_COUNT) { + average += sci_adc_get_value(channel, scale); + count++; + } + average /= SCI_ADC_GET_VALUE_COUNT; + + return average; +} + +/* on = 0: open headmic detect circuit */ +static void headset_detect_circuit(unsigned on) +{ + if (on) { + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD_INS_HMBIAS_EN); + } else { + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD_INS_HMBIAS_EN); + } +} + +static void headset_detect_clk_en(void) +{ + //address:0x4003_8800+0x00 + headset_reg_set_bit(HEADMIC_DETECT_GLB_REG(0x00), (HDT_EN | AUD_EN)); + //address:0x4003_8800+0x04 + headset_reg_set_bit(HEADMIC_DETECT_GLB_REG(0x04), (CLK_AUD_HID_EN | CLK_AUD_HBD_EN)); +} + +static void headset_detect_init(void) +{ + headset_detect_clk_en(); + /* set headset detect voltage */ + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD_SDET_2P5_OR_1P6, AUDIO_HEAD_SDET_MASK, AUDIO_HEAD_SDET_SHIFT); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD_INS_VREF_2P1_OR_1P4, AUDIO_HEAD_INS_VREF_MASK, AUDIO_HEAD_INS_VREF_SHIFT); + /*set headmicbias voltage*/ + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG0), AUDIO_MICBIAS_V_2P3_OR_3P0, AUDIO_MICBIAS_V_MASK, AUDIO_MICBIAS_V_SHIFT); + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG0), AUDIO_MICBIAS_HV_EN); +} + +static void headmic_sleep_disable(struct device *dev, int on); + +static void headset_adc_en(int en) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + + if (en) { + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD_BUF_EN); + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_V2ADC_EN); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD2ADC_SEL_MIC_IN, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG1), AUDIO_ICM_PLUS_EN); + headmic_sleep_disable(&ht->this_pdev, 1); + } else { + if(debug_level <= 2) { + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD_BUF_EN); + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_V2ADC_EN); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD2ADC_SEL_DISABLE, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + } + headmic_sleep_disable(&ht->this_pdev, 0); + } +} + +/* is_set = 1, headset_mic to AUXADC */ +static void set_adc_to_headmic(unsigned is_set) +{ + headset_adc_en(1); + + if (is_set) { + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD2ADC_SEL_MIC_IN, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + } else { + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), AUDIO_HEAD2ADC_SEL_L_INT, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + } +} + +static void headset_button_irq_threshold(int enable) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int audio_head_sbut = 0; + + audio_head_sbut = pdata->irq_threshold_buttont; + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(enable) { + if(HEADSET_CAMERA_POLE == ht->raw_type) + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), 11, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); + else + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), audio_head_sbut, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); + } + else + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), 0xF, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); + #else + + if (enable) + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), audio_head_sbut, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); + else + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG20), 0xF, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); + #endif + /* add by lgd > */ +} + +static void headset_micbias_polling_en(int en) +{ + if(en) { + //step 1: enable clk for register accessable + headset_detect_clk_en(); + //step 2: start polling & set timer + headset_reg_set_val(HEADMIC_BUTTON_REG(HID_CFG2), HID_TMR_T1T2_STEP_VAL, HID_TMR_T1T2_STEP_MASK, HID_TMR_T1T2_STEP_SHIFT);//step for T1 & T2 [9:5] + headset_reg_set_val(HEADMIC_BUTTON_REG(HID_CFG2), HID_TMR_T0_VAL, HID_TMR_T0_MASK, HID_TMR_T0_SHIFT);//T0 timer count [4:0] + headset_reg_set_val(HEADMIC_BUTTON_REG(HID_CFG3), HID_TMR_T1_VAL, HID_TMR_T1_MASK, HID_TMR_T1_SHIFT);//T1 timer count [15:0] + headset_reg_set_val(HEADMIC_BUTTON_REG(HID_CFG4), HID_TMR_T2_VAL, HID_TMR_T2_MASK, HID_TMR_T2_SHIFT);//T2 timer count [15:0] + //step 3: disable headmicbias + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_CFG0), BIT(5)); + //headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG0), BIT(1)); + PRINT_INFO("headmicbias polling enable\n"); + PRINT_DBG("ANA_CFG0(0x%08X) HID_CFG0(0x%08X) HID_CFG2(0x%08X) HID_CFG3(0x%08X) HID_CFG4(0x%08X)\n", + sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG0)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG0)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG2)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG3)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG4))); + } else { + //step 1: enable headmicbias + //headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_CFG0), BIT(1)); + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_CFG0), BIT(5)); + //step 2: stop polling + PRINT_INFO("headmicbias polling disable\n"); + PRINT_DBG("ANA_CFG0(0x%08X) HID_CFG0(0x%08X) HID_CFG2(0x%08X) HID_CFG3(0x%08X) HID_CFG4(0x%08X)\n", + sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG0)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG0)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG2)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG3)), + sci_adi_read(HEADMIC_BUTTON_REG(HID_CFG4))); + } +} + +static void headset_irq_button_enable(int enable, unsigned int irq) +{ + PRINT_INFO("headset_irq_button_enable irq = %d\n",irq); + unsigned long spin_lock_flags; + static int current_irq_state = 1;//irq is enabled after request_irq() + spin_lock_irqsave(&irq_button_lock, spin_lock_flags); + if (1 == enable) { + if (0 == current_irq_state) { + enable_irq(irq); + current_irq_state = 1; + } + } else { + if (1 == current_irq_state) { + disable_irq_nosync(irq); + current_irq_state = 0; + } + } + spin_unlock_irqrestore(&irq_button_lock, spin_lock_flags); + return; +} + +static void headset_irq_detect_enable(int enable, unsigned int irq) +{ + PRINT_INFO("headset_irq_detect_enable irq = %d\n",irq); + unsigned long spin_lock_flags; + static int current_irq_state = 1;//irq is enabled after request_irq() + spin_lock_irqsave(&irq_detect_lock, spin_lock_flags); + if (1 == enable) { + if (0 == current_irq_state) { + enable_irq(irq); + current_irq_state = 1; + } + } else { + if (1 == current_irq_state) { + disable_irq_nosync(irq); + current_irq_state = 0; + } + } + spin_unlock_irqrestore(&irq_detect_lock, spin_lock_flags); + return; +} + +static void headmic_sleep_disable(struct device *dev, int on) +{ + static int current_power_state = 0; + + if (1 == on) { + if (0 == current_power_state) { + sprd_headset_audio_headmic_sleep_disable(dev, 1); + current_power_state = 1; + } + } else { + if (1 == current_power_state) { + sprd_headset_audio_headmic_sleep_disable(dev, 0); + current_power_state = 0; + } + } + + return; +} + +static void headmicbias_power_on(struct device *dev, int on) +{ + static int current_power_state = 0; + struct sprd_headset *ht = &headset; + + if (1 == on) { + if (0 == current_power_state) { + if(NULL != ht->platform_data->external_headmicbias_power_on) + ht->platform_data->external_headmicbias_power_on(1); + sprd_headset_headmic_bias_control(dev, 1); + current_power_state = 1; + } + } else { + if (1 == current_power_state) { + if(NULL != ht->platform_data->external_headmicbias_power_on) + ht->platform_data->external_headmicbias_power_on(0); + sprd_headset_headmic_bias_control(dev, 0); + current_power_state = 0; + } + } + + return; +} + +static int ana_sts0_confirm(void) +{ + if(0 == headset_reg_get_bit(HEADMIC_DETECT_REG(ANA_STS0), AUDIO_HEAD_INSERT)) + return 0; + else + return 1; +} + +static int adc_compare(int x1, int x2) +{ + int delta = 0; + int max = 0; + + if((x1<100) && (x2<100)) + return 1; + + x1 = ((0==x1) ? 1 : (x1*100)); + x2 = ((0==x2) ? 1 : (x2*100)); + + delta = ABS(x1-x2); + max = MAX(x1, x2); + + if(delta < ((max*10)/100)) + return 1; + else + return 0; +} + +static int adc_get_average(int gpio_num, int gpio_value) +{ + int i = 0; + int j = 0; + int k = 0; + int adc_average = 0; + int success = 1; + int adc[ADC_READ_COUNT] = {0}; + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + + //================= debug ===================== + if(debug_level >= 3) { + int count = 0; + int adc_val = 0; + int gpio_button = 0; + int ana_cfg0 = 0; + int ana_cfg1 = 0; + int ana_cfg20 = 0; + int ana_sts0 = 0; + + while(count < 20) + { + count++; + adc_val = wrap_sci_adc_get_value(ADC_CHANNEL_HEADMIC, 0); + gpio_button = gpio_get_value(pdata->gpio_button); + ana_cfg0 = sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG0)); + ana_cfg1 = sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG1)); + ana_cfg20 = sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG20)); + ana_sts0 = sci_adi_read(HEADMIC_DETECT_REG(ANA_STS0)); + + PRINT_INFO("%2d: gpio_button=%d adc=%4d ana_cfg0=0x%08X ana_cfg1=0x%08X ana_cfg20=0x%08X ana_sts0=0x%08X\n", + count, gpio_button, adc_val, ana_cfg0, ana_cfg1, ana_cfg20, ana_sts0); + msleep(1); + } + } + //================= debug ===================== + + msleep(1); + if(0 == headset_reg_get_bit(HEADMIC_DETECT_REG(ANA_CFG0), AUDIO_HEADMIC_SLEEP_EN)) + PRINT_INFO("AUDIO_HEADMIC_SLEEP_EN is disabled\n"); + + for(i=0; i< ADC_READ_LOOP; i++) { + if(gpio_get_value(gpio_num) != gpio_value) { + PRINT_INFO("gpio value changed!!! the adc read operation aborted (step1)\n"); + return -1; + } + if(0 == ana_sts0_confirm()) { + PRINT_INFO("ana_sts0_confirm failed!!! the adc read operation aborted (step2)\n"); + return -1; + } + adc[0] = wrap_sci_adc_get_value(ADC_CHANNEL_HEADMIC, 0); + for(j=0; jaction->flags; + + if(irq == ht->irq_button) { + if(IRQF_TRIGGER_HIGH == type) { + PRINT_DBG("IRQF_TRIGGER_HIGH is set for irq_button(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_button, irq_flags, ret); + } + else if(IRQF_TRIGGER_LOW == type) { + PRINT_DBG("IRQF_TRIGGER_LOW is set for irq_button(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_button, irq_flags, ret); + } + } + else if(irq == ht->irq_detect) { + if(IRQF_TRIGGER_HIGH == type) { + PRINT_DBG("IRQF_TRIGGER_HIGH is set for irq_detect(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_detect, irq_flags, ret); + } + else if(IRQF_TRIGGER_LOW == type) { + PRINT_DBG("IRQF_TRIGGER_LOW is set for irq_detect(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_detect, irq_flags, ret); + } + } + return 0; +} + +static int headset_button_valid(int gpio_detect_value_current) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int button_is_valid = 0; + + if(1 == pdata->irq_trigger_level_detect) { + if(1 == gpio_detect_value_current) + button_is_valid = 1; + else + button_is_valid = 0; + } else { + if(0 == gpio_detect_value_current) + button_is_valid = 1; + else + button_is_valid = 0; + } + + return button_is_valid; +} + +static int headset_gpio_2_button_state(int gpio_button_value_current) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int button_state_current = 0; + + if(1 == pdata->irq_trigger_level_button) { + if(1 == gpio_button_value_current) + button_state_current = 1; + else + button_state_current = 0; + } else { + if(0 == gpio_button_value_current) + button_state_current = 1; + else + button_state_current = 0; + } + + return button_state_current; //0==released, 1==pressed +} + +static int headset_plug_confirm_by_adc(int last_gpio_detect_value) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int adc_last = 0; + int adc_current = 0; + int count = 0; + int adc_read_interval = 10; + + msleep(adc_read_interval); + adc_last = adc_get_average(pdata->gpio_detect, last_gpio_detect_value); + if(-1 == adc_last) { + PRINT_INFO("headset_plug_confirm_by_adc failed!!!\n"); + return -1; + } + + while(count < PLUG_CONFIRM_COUNT) { + adc_current = adc_get_average(pdata->gpio_detect, last_gpio_detect_value); + if(-1 == adc_current) { + PRINT_INFO("headset_plug_confirm_by_adc failed!!!\n"); + return -1; + } + if(0 == adc_compare(adc_last, adc_current)) { + PRINT_INFO("headset_plug_confirm_by_adc failed!!!\n"); + return -1; + } + adc_last = adc_current; + count++; + msleep(adc_read_interval); + } + PRINT_INFO("headset_plug_confirm_by_adc success!!!\n"); + return adc_current; +} + +static SPRD_HEADSET_TYPE headset_type_detect(int last_gpio_detect_value) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int adc_mic_average = 0; + int adc_left_average = 0; +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED + int adc_mic_ideal = 0; + int adc_left_ideal = 0; +#endif + int no_mic_retry_count = NO_MIC_RETRY_COUNT; + unsigned int head_insert_2; + + ENTER; + + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + else + PRINT_INFO("automatic type switch is unsupported\n"); + + headset_button_irq_threshold(1); + headset_detect_init(); + headset_detect_circuit(1); + +no_mic_retry: + + //get adc value of left + if(EIC_AUD_HEAD_INST2 == pdata->gpio_detect) { + PRINT_INFO("HEADSET_DETECT_GPIO=%d, matched the reference phone, now getting adc value of left\n", pdata->gpio_detect); + set_adc_to_headmic(0); + msleep(50); + adc_left_average = headset_plug_confirm_by_adc(last_gpio_detect_value); + if(-1 == adc_left_average) + return HEADSET_TYPE_ERR; + } else { + PRINT_INFO("HEADSET_DETECT_GPIO=%d, NOT matched the reference phone(GPIO_%d), set adc_left_average to 0\n", + pdata->gpio_detect, EIC_AUD_HEAD_INST2); + adc_left_average = 0; + } + + //get adc value of mic + set_adc_to_headmic(1); + msleep(50); + adc_mic_average = headset_plug_confirm_by_adc(last_gpio_detect_value); + if(-1 == adc_mic_average) + return HEADSET_TYPE_ERR; +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED + adc_mic_ideal = adc_get_ideal(adc_mic_average); + adc_left_ideal = adc_get_ideal(adc_left_average); + + PRINT_INFO("adc_mic_average=%d, adc_mic_ideal=%d\n", adc_mic_average, adc_mic_ideal); + PRINT_INFO("adc_left_average=%d, adc_left_ideal=%d\n", adc_left_average, adc_left_ideal); + + if(adc_mic_ideal >= 0 && adc_left_ideal >= 0) { + adc_mic_average = adc_mic_ideal; + adc_left_average = adc_left_ideal; + } +#else + PRINT_INFO("adc_mic_average = %d\n", adc_mic_average); + PRINT_INFO("adc_left_average = %d\n", adc_left_average); +#endif + if((gpio_get_value(pdata->gpio_detect)) != last_gpio_detect_value) { + PRINT_INFO("software debance (gpio check)!!!(headset_type_detect)\n"); + return HEADSET_TYPE_ERR; + } + + if(0 == ana_sts0_confirm()) { + PRINT_INFO("software debance (ana_sts0_confirm)!!!(headset_type_detect)\n"); + return HEADSET_TYPE_ERR; + } + + head_insert_2 = headset_reg_get_bit(HEADMIC_DETECT_REG(ANA_STS0), AUDIO_HEAD_INSERT_2); + if((adc_mic_average < pdata->adc_threshold_3pole_detect)) { + if(0 != no_mic_retry_count) { + PRINT_INFO("no_mic_retry\n"); + no_mic_retry_count--; + goto no_mic_retry; + } + return HEADSET_NO_MIC; + } + else if((adc_left_average < ADC_GND) && (adc_mic_average > ADC_GND)) + return HEADSET_NORMAL; +/* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT + else if((adc_left_average > ADC_GND) && (adc_mic_average > ADC_GND)) { + if (ABS(adc_mic_average - adc_left_average) < ADC_GND && adc_left_average < 2300) + return HEADSET_NORTH_AMERICA; + else + return HEADSET_CAMERA_POLE; + } +#else + else if((adc_left_average > ADC_GND) && (adc_mic_average > ADC_GND) + && (ABS(adc_mic_average - adc_left_average) < ADC_GND)) + return HEADSET_NORTH_AMERICA; +#endif +/* add by lgd > */ + else { + PRINT_INFO("head_insert_2 = %d\n", head_insert_2); + return HEADSET_TYPE_ERR; + } + +} + +static void button_release_verify(void) +{ + struct sprd_headset *ht = &headset; + + if(1 == button_state_last) { + input_event(ht->input_dev, EV_KEY, current_key_code, 0); + input_sync(ht->input_dev); + button_state_last = 0; + PRINT_INFO("headset button released by force!!! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + } +} + +static void headset_button_work_func(struct work_struct *work) +{ + PRINT_INFO("headset_button_work_func enter into\n"); + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int gpio_button_value_current = 0; + int button_state_current = 0; + int adc_mic_average = 0; +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED + int adc_ideal = 0; +#endif + int i = 0; + + down(&headset_sem); + set_adc_to_headmic(1); + + ENTER; + + gpio_button_value_current = gpio_get_value(pdata->gpio_button); + if(gpio_button_value_current != gpio_button_value_last) { + PRINT_INFO("software debance (step 1: gpio check)!!!(headset_button_work_func)\n"); + #ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); + #endif + goto out; + } + + button_state_current = headset_gpio_2_button_state(gpio_button_value_current); + + if(1 == button_state_current) {//pressed! + if(ht->platform_data->nbuttons > 0) { + adc_mic_average = adc_get_average(pdata->gpio_button, gpio_button_value_last); + if(-1 == adc_mic_average) { + PRINT_INFO("software debance (step 3: adc check)!!!(headset_button_work_func)(pressed)\n"); + #ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); + #endif + goto out; + } +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED + adc_ideal = adc_get_ideal(adc_mic_average); + PRINT_INFO("adc_mic_average=%d, adc_ideal=%d\n", adc_mic_average, adc_ideal); + + if (adc_ideal >= 0) + adc_mic_average = adc_ideal; +#else + PRINT_INFO("adc_mic_average = %d\n", adc_mic_average); +#endif + for (i = 0; i < ht->platform_data->nbuttons; i++) { + PRINT_DBG("adc_min=%d, adc_max=%d, code = %d\n", + ht->platform_data->headset_buttons[i].adc_min, + ht->platform_data->headset_buttons[i].adc_max, + ht->platform_data->headset_buttons[i].code); + if (adc_mic_average >= ht->platform_data->headset_buttons[i].adc_min && + adc_mic_average < ht->platform_data->headset_buttons[i].adc_max) { + current_key_code = ht->platform_data->headset_buttons[i].code; + break; + } + current_key_code = KEY_RESERVED; + } + } + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(HEADSET_CAMERA_POLE == ht->raw_type) { + current_key_code = CAMERA_POLE_CODE; + } + #endif + /* add by lgd > */ + if(0 == button_state_last) { + input_event(ht->input_dev, EV_KEY, current_key_code, 1); + input_sync(ht->input_dev); + button_state_last = 1; + PRINT_INFO("headset button pressed! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + } else { + PRINT_ERR("headset button pressed already! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + #ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); + #endif + } + + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + + headset_irq_button_enable(1, ht->irq_button); + } else { //released! + if(1 == button_state_last) { + input_event(ht->input_dev, EV_KEY, current_key_code, 0); + input_sync(ht->input_dev); + button_state_last = 0; + PRINT_INFO("headset button released! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + } else + PRINT_ERR("headset button released already! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + + headset_irq_button_enable(1, ht->irq_button); + } +out: + headset_adc_en(0); + headset_irq_button_enable(1, ht->irq_button); + //wake_unlock(&headset_button_wakelock); + up(&headset_sem); + PRINT_INFO("headset_button_work_func go out\n"); + return; +} +static void headset_detect_work_func(struct work_struct *work) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + SPRD_HEADSET_TYPE headset_type; + int plug_state_current = 0; + int gpio_detect_value_current = 0; + + down(&headset_sem); + ENTER; + if (sprd_hts_power.head_mic == NULL) { + sprd_headset_power_init(&ht->this_pdev); + } + if (sprd_hts_power.head_mic == NULL ) { + PRINT_INFO("sprd_headset_power_init fail \n"); + goto out; + } + + if(0 == plug_state_last) { + if(adie_type >= 3) { + headmicbias_power_on(&ht->this_pdev, 1); + } + } + if(0 == plug_state_last) { + gpio_detect_value_current = gpio_get_value(pdata->gpio_detect); + PRINT_INFO("gpio_detect_value_current = %d, gpio_detect_value_last = %d, plug_state_last = %d\n", + gpio_detect_value_current, gpio_detect_value_last, plug_state_last); + + if(gpio_detect_value_current != gpio_detect_value_last) { + PRINT_INFO("software debance (step 1)!!!(headset_detect_work_func)\n"); + goto out; + } + + if(1 == pdata->irq_trigger_level_detect) { + if(1 == gpio_detect_value_current) + plug_state_current = 1; + else + plug_state_current = 0; + } else { + if(0 == gpio_detect_value_current) + plug_state_current = 1; + else + plug_state_current = 0; + } + } + else + plug_state_current = 0;//no debounce for plug out!!! + + if(1 == plug_state_current && 0 == plug_state_last) { + headset_type = headset_type_detect(gpio_detect_value_last); + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + ht->raw_type = headset_type; + #endif + /* add by lgd > */ + headset_adc_en(0); + switch (headset_type) { + case HEADSET_TYPE_ERR: + detect_err_count ++; + PRINT_INFO("headset_type = %d detect_err_count = %d(HEADSET_TYPE_ERR)\n", headset_type,detect_err_count); + goto out; + case HEADSET_NORTH_AMERICA: + PRINT_INFO("headset_type = %d (HEADSET_NORTH_AMERICA)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 1); + break; + case HEADSET_NORMAL: + PRINT_INFO("headset_type = %d (HEADSET_NORMAL)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + break; + case HEADSET_NO_MIC: + PRINT_INFO("headset_type = %d (HEADSET_NO_MIC)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + break; + case HEADSET_APPLE: + PRINT_INFO("headset_type = %d (HEADSET_APPLE)\n", headset_type); + PRINT_INFO("we have not yet implemented this in the code\n"); + break; + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + case HEADSET_CAMERA_POLE: + PRINT_INFO("headset_type = %d (HEADSET_CAMERA_POLE)\n", headset_type); + break; + #endif + /* add by lgd > */ + default: + PRINT_INFO("headset_type = %d (HEADSET_UNKNOWN)\n", headset_type); + break; + } + detect_err_count = 0; + if(headset_type == HEADSET_NO_MIC) + ht->headphone = 1; + else + ht->headphone = 0; + + if (ht->headphone) { + headset_button_irq_threshold(0); + headset_irq_button_enable(0, ht->irq_button); + + ht->type = BIT_HEADSET_NO_MIC; + hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + PRINT_INFO("headphone plug in (headset_detect_work_func)\n"); + } else { + headset_button_irq_threshold(1); + + if((HEADSET_NORTH_AMERICA == headset_type) && (0 == pdata->gpio_switch)) { + headset_irq_button_enable(0, ht->irq_button); + PRINT_INFO("HEADSET_NORTH_AMERICA is not supported by your hardware! so disable the button irq!\n"); + } else { + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + + headset_irq_button_enable(1, ht->irq_button); + } + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(HEADSET_CAMERA_POLE != ht->raw_type) { + #endif + /* add by lgd > */ + ht->type = BIT_HEADSET_MIC; + hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + } + #endif + /* add by lgd > */ + PRINT_INFO("headset plug in (headset_detect_work_func)\n"); + #ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(500)); + #endif + } + + /***polling ana_sts0 to avoid the hardware defect***/ +#ifdef SPRD_STS_POLLING_EN + if ((1 != adie_type) && (adie_type < 5)) { + plug_state_class_g_on = 1; + sts_check_work_need_to_cancel = 0; + queue_delayed_work(sts_check_work_queue, &sts_check_work, msecs_to_jiffies(1000)); + PRINT_INFO("start sts_check_work_queue\n"); + } + else + PRINT_INFO("sts_check_work_queue is no need to start\n"); +#else + PRINT_INFO("sts_check_work_queue is not used\n"); +#endif + /***polling ana_sts0 to avoid the hardware defect***/ + + plug_state_last = 1; + + if(1 == pdata->irq_trigger_level_detect) + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_LOW); + else + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_HIGH); + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(HEADSET_CAMERA_POLE != ht->raw_type) + #endif + /* add by lgd > */ + if (adie_type >= 5) { + headset_reg_set_bit(ANA_CTL_GLB_BASE + ARM_MF_REG, HEAD_INSERT_EIC_EN); + headset_reg_clr_bit(ANA_CTL_GLB_BASE + ARM_MF_REG, HEAD_INSERT2_EIC_EN); + PRINT_INFO("disable HEAD_INSERT2_EIC_EN, enable HEAD_INSERT_EIC_EN\n"); + } + + headset_irq_detect_enable(1, ht->irq_detect); + } else if(0 == plug_state_current && 1 == plug_state_last) { + + headset_irq_button_enable(0, ht->irq_button); + button_release_verify(); + + /***polling ana_sts0 to avoid the hardware defect***/ +#ifdef SPRD_STS_POLLING_EN + if ((1 != adie_type) && (adie_type < 5)) { + sts_check_work_need_to_cancel = 1; + if(0 == plug_state_class_g_on) { + PRINT_INFO("plug out already!!!\n"); + goto plug_out_already; + } + plug_state_class_g_on = 0; + } +#endif + /***polling ana_sts0 to avoid the hardware defect***/ + + if (ht->headphone) { + PRINT_INFO("headphone plug out (headset_detect_work_func)\n"); + } else { + PRINT_INFO("headset plug out (headset_detect_work_func)\n"); + } + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(HEADSET_CAMERA_POLE != ht->raw_type) { + #endif + /* add by lgd > */ + ht->type = BIT_HEADSET_OUT; + hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + } + #endif + /* add by lgd > */ +plug_out_already: + plug_state_last = 0; + + if(1 == pdata->irq_trigger_level_detect) + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_LOW); + + if (adie_type >= 5) { + headset_reg_set_bit(ANA_CTL_GLB_BASE + ARM_MF_REG, HEAD_INSERT2_EIC_EN); + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(0 == headset_ctl) { + #endif + /* add by lgd > */ + headset_reg_clr_bit(ANA_CTL_GLB_BASE + ARM_MF_REG, HEAD_INSERT_EIC_EN); + PRINT_INFO("disable HEAD_INSERT_EIC_EN, enable HEAD_INSERT2_EIC_EN\n"); + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + } + #endif + /* add by lgd > */ + } + + headset_irq_detect_enable(1, ht->irq_detect); + } else { + PRINT_INFO("irq_detect must be enabled anyway!!!\n"); + goto out; + } +out: + + if(0 == plug_state_last) { + if(adie_type >= 3) { + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(0 == headset_ctl) + #endif + /* add by lgd > */ + headmicbias_power_on(&ht->this_pdev, 0); + } + } + if(detect_err_count < 500) { + headset_irq_detect_enable(1, ht->irq_detect); + } + //wake_unlock(&headset_detect_wakelock); + up(&headset_sem); + return; +} + +/***polling ana_sts0 to avoid the hardware defect***/ +#ifdef SPRD_STS_POLLING_EN +static void headset_sts_check_func(struct work_struct *work) +{ + int ana_sts0 = 0; + int ana_sts0_debance = 0; + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + SPRD_HEADSET_TYPE headset_type; + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(HEADSET_CAMERA_POLE == ht->raw_type) { + PRINT_INFO("headset_sts_check_func is not implemented for camera pole\n"); + return; + } + #endif + /* add by lgd > */ + down(&headset_sem); + + ENTER; + + if(1 == sts_check_work_need_to_cancel) + goto out; + + ana_sts0_debance = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0);//arm base address:0x40038600 + msleep(100); + ana_sts0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0);//arm base address:0x40038600 + if((0x00000060 & ana_sts0) != (0x00000060 & ana_sts0_debance)) { + PRINT_INFO("software debance!!!(headset_sts_check_func)\n"); + goto out; + } + + if(((0x00000060 & ana_sts0) != 0x00000060) && (1 == plug_state_class_g_on)) { + + headset_irq_button_enable(0, ht->irq_button); + button_release_verify(); + + if (ht->headphone) { + PRINT_INFO("headphone plug out (headset_sts_check_func)\n"); + } else { + PRINT_INFO("headset plug out (headset_sts_check_func)\n"); + } + ht->type = BIT_HEADSET_OUT; + hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + plug_state_class_g_on = 0; + } + if(((0x00000060 & ana_sts0) == 0x00000060) && (0 == plug_state_class_g_on)) { + headset_type = headset_type_detect(gpio_get_value(pdata->gpio_detect)); + headset_adc_en(0); + switch (headset_type) { + case HEADSET_TYPE_ERR: + PRINT_INFO("headset_type = %d (HEADSET_TYPE_ERR)\n", headset_type); + goto out; + case HEADSET_NORTH_AMERICA: + PRINT_INFO("headset_type = %d (HEADSET_NORTH_AMERICA)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 1); + break; + case HEADSET_NORMAL: + PRINT_INFO("headset_type = %d (HEADSET_NORMAL)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + break; + case HEADSET_NO_MIC: + PRINT_INFO("headset_type = %d (HEADSET_NO_MIC)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + break; + case HEADSET_APPLE: + PRINT_INFO("headset_type = %d (HEADSET_APPLE)\n", headset_type); + PRINT_INFO("we have not yet implemented this in the code\n"); + break; + default: + PRINT_INFO("headset_type = %d (HEADSET_UNKNOWN)\n", headset_type); + break; + } + + if(headset_type == HEADSET_NO_MIC) + ht->headphone = 1; + else + ht->headphone = 0; + + if (ht->headphone) { + headset_button_irq_threshold(0); + headset_irq_button_enable(0, ht->irq_button); + + ht->type = BIT_HEADSET_NO_MIC; + hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + PRINT_INFO("headphone plug in (headset_sts_check_func)\n"); + } else { + headset_button_irq_threshold(1); + + if((HEADSET_NORTH_AMERICA == headset_type) && (0 == pdata->gpio_switch)) { + headset_irq_button_enable(0, ht->irq_button); + PRINT_INFO("HEADSET_NORTH_AMERICA is not supported by your hardware! so disable the button irq!\n"); + } else { + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + + headset_irq_button_enable(1, ht->irq_button); + } + + ht->type = BIT_HEADSET_MIC; + hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + PRINT_INFO("headset plug in (headset_sts_check_func)\n"); + } + plug_state_class_g_on = 1; + } +out: + if(0 == sts_check_work_need_to_cancel) + queue_delayed_work(sts_check_work_queue, &sts_check_work, msecs_to_jiffies(1000)); + else + PRINT_INFO("sts_check_work cancelled\n"); + + up(&headset_sem); + return; +} +#endif +/***polling ana_sts0 to avoid the hardware defect***/ + +#ifdef ADPGAR_BYP_SELECT +static void adpgar_byp_select_func(struct work_struct *work) +{ + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG5), AUDIO_ADPGAR_BYP_HEADMIC_2_ADCR, AUDIO_ADPGAR_BYP_MASK, AUDIO_ADPGAR_BYP_SHIFT); + PRINT_INFO("ANA_CFG5 = 0x%08X\n", sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG5))); + msleep(100); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CFG5), AUDIO_ADPGAR_BYP_NORMAL, AUDIO_ADPGAR_BYP_MASK, AUDIO_ADPGAR_BYP_SHIFT); + PRINT_INFO("ANA_CFG5 = 0x%08X\n", sci_adi_read(HEADMIC_DETECT_REG(ANA_CFG5))); + PRINT_INFO("adpgar_byp_select_func\n"); +} +#endif + +static void reg_dump_func(struct work_struct *work) +{ + int adc_mic = 0; + + int gpio_detect = 0; + int gpio_button = 0; + + int ana_sts0 = 0; + int ana_cfg0 = 0; + int ana_cfg1 = 0; + int ana_cfg20 = 0; + + int hid_cfg0 = 0; + int hid_cfg2 = 0; + int hid_cfg3 = 0; + int hid_cfg4 = 0; + + int arm_module_en = 0; + int arm_clk_en = 0; + + adc_mic = wrap_sci_adc_get_value(ADC_CHANNEL_HEADMIC, 0); + + gpio_detect = gpio_get_value(headset.platform_data->gpio_detect); + gpio_button = gpio_get_value(headset.platform_data->gpio_button); + + sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_AUD_EN, BIT_ANA_AUD_EN);//arm base address:0x40038800 for register accessable + ana_cfg0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_CFG0);//arm base address:0x40038600 + ana_cfg1 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_CFG1);//arm base address:0x40038600 + ana_cfg20 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_CFG20);//arm base address:0x40038600 + ana_sts0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0);//arm base address:0x40038600 + + sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_HDT_EN, BIT_ANA_HDT_EN);//arm base address:0x40038800 for register accessable + sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, BIT_CLK_AUD_HID_EN, BIT_CLK_AUD_HID_EN);//arm base address:0x40038800 for register accessable + + hid_cfg2 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG2);//arm base address:0x40038700 + hid_cfg3 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG3);//arm base address:0x40038700 + hid_cfg4 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG4);//arm base address:0x40038700 + hid_cfg0 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG0);//arm base address:0x40038700 + + arm_module_en = sci_adi_read(ANA_REG_GLB_ARM_MODULE_EN); + arm_clk_en = sci_adi_read(ANA_REG_GLB_ARM_CLK_EN); + + PRINT_INFO("GPIO_%03d(det)=%d GPIO_%03d(but)=%d adc_mic=%d\n", + headset.platform_data->gpio_detect, gpio_detect, + headset.platform_data->gpio_button, gpio_button, + adc_mic); + PRINT_INFO("arm_module_en|arm_clk_en|ana_cfg0 |ana_cfg1 |ana_cfg20 |ana_sts0 |hid_cfg2 |hid_cfg3 |hid_cfg4 |hid_cfg0\n"); + PRINT_INFO("0x%08X |0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X\n", + arm_module_en, arm_clk_en, ana_cfg0, ana_cfg1, ana_cfg20, ana_sts0, hid_cfg2, hid_cfg3, hid_cfg4, hid_cfg0); +#if 0 + int i = 0; + int hbd[20] = {0}; + + for(i=0; i<20; i++) + hbd[i] = sci_adi_read(ANA_HDT_INT_BASE + (i*4)); + + PRINT_INFO(" hbd_cfg0 | hbd_cfg1 | hbd_cfg2 | hbd_cfg3 | hbd_cfg4 | hbd_cfg5 | hbd_cfg6 | hbd_cfg7 | hbd_cfg8 | hbd_cfg9\n"); + PRINT_INFO("0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X\n", + hbd[0], hbd[1], hbd[2], hbd[3], hbd[4], hbd[5], hbd[6], hbd[7], hbd[8], hbd[9]); + + PRINT_INFO("hbd_cfg10 |hbd_cfg11 |hbd_cfg12 |hbd_cfg13 |hbd_cfg14 |hbd_cfg15 |hbd_cfg16 | hbd_sts0 | hbd_sts1 | hbd_sts2\n"); + PRINT_INFO("0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X\n", + hbd[10], hbd[11], hbd[12], hbd[13], hbd[14], hbd[15], hbd[16], hbd[17], hbd[18], hbd[19]); +#endif + + if (debug_level >= 2) + queue_delayed_work(reg_dump_work_queue, ®_dump_work, msecs_to_jiffies(500)); + return; +} + +/* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT +static void camera_pole_func(struct work_struct *work) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + + down(&headset_sem); + + if(1 == headset_ctl) { + headmicbias_power_on(&ht->this_pdev, 1); + msleep(5); + headset_detect_circuit(1); + msleep(5); + headset_reg_set_bit(ANA_CTL_GLB_BASE + ARM_MF_REG, HEAD_INSERT_EIC_EN); + PRINT_INFO("enable headmic_in insert detect\n"); + } else { + if((HEADSET_CAMERA_POLE == ht->raw_type) || (0 == plug_state_last)) { + headset_reg_clr_bit(ANA_CTL_GLB_BASE + ARM_MF_REG, HEAD_INSERT_EIC_EN); + headmicbias_power_on(&ht->this_pdev, 0); + msleep(5); + headset_detect_circuit(0); + msleep(5); + PRINT_INFO("disable headmic_in insert detect\n"); + } + } + + up(&headset_sem); +} +#endif +/* add by lgd > */ + +/** + * some phone boards, when no headset plugin, the button headset_button_valid() + * will always return 0, so we need to disable headset_button irq in here + * otherwise button irq will always happen. + */ +volatile int headset_button_hardware_bug_fix_stage = 1; +static void headset_button_hardware_bug_fix(struct sprd_headset *ht) +{ + if (headset_button_hardware_bug_fix_stage) { + headset_irq_button_enable(0, ht->irq_button); // disable button irq before headset detected + pr_err("This phone board headset button circuit has bug, please fix the hardware\n"); + } +} + +static irqreturn_t headset_button_irq_handler(int irq, void *dev) +{ + PRINT_INFO("headset_button_irq_handler enter into\n"); + struct sprd_headset *ht = dev; + int button_state_current = 0; + int gpio_button_value_current = 0; + + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + if(HEADSET_CAMERA_POLE != ht->raw_type) + #endif + /* add by lgd > */ + + if(0 == headset_button_valid(gpio_get_value(ht->platform_data->gpio_detect))) { + PRINT_INFO("headset_button_irq_handler: button is invalid!!! IRQ_%d(GPIO_%d) = %d, ANA_STS0 = 0x%08X\n", + ht->irq_button, ht->platform_data->gpio_button, gpio_button_value_last, + sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0)); + headset_button_hardware_bug_fix(ht); + + if(0 == plug_state_last) + headset_irq_button_enable(0, ht->irq_button); + + return IRQ_HANDLED; + } + + gpio_button_value_current = gpio_get_value(ht->platform_data->gpio_button); + button_state_current = headset_gpio_2_button_state(gpio_button_value_current); + #ifdef ADPGAR_BYP_SELECT + if(0 == button_state_current) { + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); + } + #endif + if(button_state_current == button_state_last) { + PRINT_INFO("button state check failed!!! maybe the release is too quick. button_state_current=%d, button_state_last=%d\n", + button_state_current, button_state_last); + return IRQ_HANDLED; + } + + headset_irq_button_enable(0, ht->irq_button); + wake_lock_timeout(&headset_button_wakelock, msecs_to_jiffies(2000)); + gpio_button_value_last = gpio_button_value_current; + PRINT_DBG("headset_button_irq_handler: IRQ_%d(GPIO_%d) = %d, ANA_STS0 = 0x%08X\n", + ht->irq_button, ht->platform_data->gpio_button, gpio_button_value_last, + sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0)); + queue_work(ht->button_work_queue, &ht->work_button); + PRINT_INFO("headset_button_irq_handler go out\n"); + return IRQ_HANDLED; +} + +static irqreturn_t headset_detect_irq_handler(int irq, void *dev) +{ + struct sprd_headset *ht = dev; + headset_irq_button_enable(0, ht->irq_button); + headset_irq_detect_enable(0, ht->irq_detect); + wake_lock_timeout(&headset_detect_wakelock, msecs_to_jiffies(2000)); + gpio_detect_value_last = gpio_get_value(ht->platform_data->gpio_detect); + PRINT_DBG("headset_detect_irq_handler: IRQ_%d(GPIO_%d) = %d, ANA_STS0 = 0x%08X\n", + ht->irq_detect, ht->platform_data->gpio_detect, gpio_detect_value_last, + sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0)); + queue_delayed_work(ht->detect_work_queue, &ht->work_detect, msecs_to_jiffies(0)); + return IRQ_HANDLED; +} + +//================= create sys fs for debug =================== +//============= /sys/kernel/headset/debug_level =============== + +static ssize_t headset_debug_level_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + PRINT_INFO("debug_level = %d\n", debug_level); + return sprintf(buff, "%d\n", debug_level); +} + +static ssize_t headset_debug_level_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t len) +{ + unsigned long level = simple_strtoul(buff, NULL, 10); + debug_level = level; + PRINT_INFO("debug_level = %d\n", debug_level); + if(debug_level >= 2) + queue_delayed_work(reg_dump_work_queue, ®_dump_work, msecs_to_jiffies(500)); + return len; +} + +static struct kobject *headset_debug_kobj = NULL; +static struct kobj_attribute headset_debug_attr = + __ATTR(debug_level, 0644, headset_debug_level_show, headset_debug_level_store); + + +/* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT +static ssize_t headset_ctl_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + PRINT_INFO("headset_ctl = %d\n", headset_ctl); + return sprintf(buff, "%d\n", headset_ctl); +} + +static ssize_t headset_ctl_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t len) +{ + unsigned long ctl = simple_strtoul(buff, NULL, 10); + if (headset_ctl == ctl) + return len; + headset_ctl = ctl; + PRINT_INFO("headset_ctl = %d\n", headset_ctl); + queue_delayed_work(camera_pole_work_queue, &camera_pole_work, msecs_to_jiffies(100)); + return len; +} + +static struct kobj_attribute headset_ctl_attr = + __ATTR(headset_ctl, 0666, headset_ctl_show, headset_ctl_store); +#endif +/* add by lgd > */ + +static int headset_debug_sysfs_init(void) +{ + int ret = -1; + + headset_debug_kobj = kobject_create_and_add("headset", kernel_kobj); + if (headset_debug_kobj == NULL) { + ret = -ENOMEM; + PRINT_ERR("register sysfs failed. ret = %d\n", ret); + return ret; + } + + ret = sysfs_create_file(headset_debug_kobj, &headset_debug_attr.attr); + if (ret) { + PRINT_ERR("create sysfs failed. ret = %d\n", ret); + return ret; + } + /* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT + ret = sysfs_create_file(headset_debug_kobj, &headset_ctl_attr.attr); + if (ret) { + PRINT_ERR("create sysfs failed 2. ret = %d\n", ret); + return ret; + } +#endif + /* add by lgd > */ + + PRINT_INFO("headset_debug_sysfs_init success\n"); + return ret; +} +//================= create sys fs for debug =================== + +#ifdef CONFIG_OF +static struct sprd_headset_platform_data *headset_detect_parse_dt( + struct device *dev) +{ + struct sprd_headset_platform_data *pdata; + struct device_node *np = dev->of_node,*buttons_np = NULL; + int ret; + struct headset_buttons *buttons_data; + + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "could not allocate memory for platform data\n"); + return NULL; + } + ret = of_property_read_u32(np, "gpio_switch", &pdata->gpio_switch); + if(ret){ + dev_err(dev, "fail to get gpio_switch\n"); + goto fail; + } + ret = of_property_read_u32(np, "gpio_detect", &pdata->gpio_detect); + if(ret){ + dev_err(dev, "fail to get gpio_detect\n"); + goto fail; + } + ret = of_property_read_u32(np, "gpio_button", &pdata->gpio_button); + if(ret){ + dev_err(dev, "fail to get gpio_button\n"); + goto fail; + } + ret = of_property_read_u32(np, "irq_trigger_level_detect", &pdata->irq_trigger_level_detect); + if(ret){ + dev_err(dev, "fail to get irq_trigger_level_detect\n"); + goto fail; + } + ret = of_property_read_u32(np, "irq_trigger_level_button", &pdata->irq_trigger_level_button); + if(ret){ + dev_err(dev, "fail to get irq_trigger_level_button\n"); + goto fail; + } + ret = of_property_read_u32(np, "adc_threshold_3pole_detect", &pdata->adc_threshold_3pole_detect); + if(ret){ + dev_err(dev, "fail to get adc_threshold_3pole_detect\n"); + goto fail; + } + + ret = of_property_read_u32(np, "adc_threshold_4pole_detect", &pdata->adc_threshold_4pole_detect); + if(ret){ + dev_err(dev, "fail to get adc_threshold_4pole_detect\n"); + goto fail; + } + + ret = of_property_read_u32(np, "irq_threshold_buttont", &pdata->irq_threshold_buttont); + if(ret){ + dev_err(dev, "fail to get irq_threshold_buttont\n"); + goto fail; + } + + ret = of_property_read_u32(np, "voltage_headmicbias", &pdata->voltage_headmicbias); + if(ret){ + dev_err(dev, "fail to get voltage_headmicbias\n"); + goto fail; + } + ret = of_property_read_u32(np, "nbuttons", &pdata->nbuttons); + if(ret){ + dev_err(dev, "fail to get nbuttons\n"); + goto fail; + } + + buttons_data = kzalloc(pdata->nbuttons*sizeof(*buttons_data),GFP_KERNEL); + if (!buttons_data) { + dev_err(dev, "could not allocate memory for headset_buttons\n"); + goto fail; + } + pdata->headset_buttons = buttons_data; + + for_each_child_of_node(np,buttons_np){ + + ret = of_property_read_u32(buttons_np, "adc_min", &buttons_data->adc_min); + if (ret) { + dev_err(dev, "fail to get adc_min\n"); + goto fail_buttons_data; + } + ret = of_property_read_u32(buttons_np, "adc_max", &buttons_data->adc_max); + if (ret) { + dev_err(dev, "fail to get adc_max\n"); + goto fail_buttons_data; + } + ret = of_property_read_u32(buttons_np, "code", &buttons_data->code); + if (ret) { + dev_err(dev, "fail to get code\n"); + goto fail_buttons_data; + } + ret = of_property_read_u32(buttons_np, "type", &buttons_data->type); + if (ret) { + dev_err(dev, "fail to get type\n"); + goto fail_buttons_data; + } + printk("device tree data: adc_min = %d adc_max = %d code = %d type = %d \n", buttons_data->adc_min, + buttons_data->adc_max, buttons_data->code, buttons_data->type); + buttons_data++; + }; + + return pdata; + +fail_buttons_data: + kfree(buttons_data); + pdata->headset_buttons = NULL; +fail: + kfree(pdata); + return NULL; +} +#endif + +static int headset_detect_probe(struct platform_device *pdev) +{ + struct sprd_headset_platform_data *pdata = pdev->dev.platform_data; + struct sprd_headset *ht = &headset; + unsigned long irqflags = 0; + struct input_dev *input_dev = NULL; + int i = 0; + int ret = -1; + int ana_sts0 = 0; + int adie_chip_id_low = 0; + int adie_chip_id_high = 0; + +#ifdef CONFIG_OF + struct device_node *np = pdev->dev.of_node; + if (pdev->dev.of_node && !pdata){ + pdata = headset_detect_parse_dt(&pdev->dev); + if(pdata) + pdev->dev.platform_data = pdata; + } + if (!pdata) { + printk(KERN_WARNING "headset_detect_probe get platform_data NULL\n"); + ret = -EINVAL; + goto fail_to_get_platform_data; + } +#endif + + adie_chip_id_low = sci_adi_read(ANA_CTL_GLB_BASE+ADIE_CHID_LOW);//A-die chip id LOW + adie_chip_id_high = sci_adi_read(ANA_CTL_GLB_BASE+ADIE_CHID_HIGH);//A-die chip id HIGH + + sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_AUD_EN, BIT_ANA_AUD_EN);//arm base address:0x40038800 for register accessable + ana_sts0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0);//arm base address:0x40038600 + + switch (adie_chip_id_high) { + case 0x2713: {//chip is 2713 + switch (adie_chip_id_low) { + case 0xA000: { + adie_type = 1; //AC + break; + } + case 0xA001: { + if ((0x00000040 & ana_sts0) == 0x00000040) { + adie_type = 2; //BA + break; + } else { + adie_type = 3; //BB + break; + } + break; + } + case 0xCA00: { + adie_type = 5; //CA + break; + } + default: { + adie_type = 100; //unknow + PRINT_ERR("unknow 2713 chip ID!!!\n"); + break; + } + } + PRINT_INFO("adie chip is 2713, type = %d\n", adie_type); + break;//break from 2713 + } + + case 0x2711: {//chip is 2711 + adie_type = 4; //Dolphin + PRINT_INFO("adie chip is 2711, type = %d\n", adie_type); + break; //break from 2711 + } + + default: { + adie_type = 100; //unknow + PRINT_ERR("unknow adie chip !!!\n"); + break; + } + } + + ht->platform_data = pdata; + ht->this_pdev = pdev; + headset_detect_init(); + + ret = sprd_headset_power_init(&pdev->dev); + if (ret) + goto fail_to_sprd_headset_power_init; + + if(adie_type < 3) { + headmicbias_power_on(&pdev->dev, 1); + msleep(5);//this time delay is necessary here + } + + PRINT_INFO("====================================================================\n"); + PRINT_INFO(" write 0~3 to \"/sys/kernel/headset/debug_level\" for headset debug\n"); + PRINT_INFO("====================================================================\n"); + PRINT_INFO("D-die chip id = 0x%08X\n", __raw_readl(REG_AON_APB_CHIP_ID)); + PRINT_INFO("A-die chip id HIGH = 0x%08X\n", adie_chip_id_high); + PRINT_INFO("A-die chip id LOW = 0x%08X\n", adie_chip_id_low); + + if (1 == adie_type) { + pdata->gpio_detect -= 1; + PRINT_WARN("use EIC_AUD_HEAD_INST (EIC4, GPIO_%d) for insert detecting\n", pdata->gpio_detect); + } else { + PRINT_INFO("use GPIO_%d for insert detecting\n", pdata->gpio_detect); + } + + if(0 != pdata->gpio_switch) { + ret = gpio_request(pdata->gpio_switch, "headset_switch"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_switch)\n", pdata->gpio_switch); + goto failed_to_request_gpio_switch; + } + } + else + PRINT_INFO("automatic type switch is unsupported\n"); + + ret = gpio_request(pdata->gpio_detect, "headset_detect"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_detect)\n", pdata->gpio_detect); + goto failed_to_request_gpio_detect; + } + + ret = gpio_request(pdata->gpio_button, "headset_button"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_button)\n", pdata->gpio_button); + goto failed_to_request_gpio_button; + } + + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + gpio_direction_input(pdata->gpio_detect); + gpio_direction_input(pdata->gpio_button); + ht->irq_detect = gpio_to_irq(pdata->gpio_detect); + ht->irq_button = gpio_to_irq(pdata->gpio_button); + + ret = switch_dev_register(&ht->sdev); + if (ret < 0) { + PRINT_ERR("switch_dev_register failed!\n"); + goto failed_to_register_switch_dev; + } + + input_dev = input_allocate_device(); + if ( !input_dev) { + PRINT_ERR("input_allocate_device for headset_button failed!\n"); + ret = -ENOMEM; + goto failed_to_allocate_input_device; + } + + input_dev->name = "headset-keyboard"; + input_dev->id.bustype = BUS_HOST; + ht->input_dev = input_dev; + + for (i = 0; i < pdata->nbuttons; i++) { + struct headset_buttons *buttons = &pdata->headset_buttons[i]; + unsigned int type = buttons->type ?: EV_KEY; + input_set_capability(input_dev, type, buttons->code); + } + /* < add by lgd */ + #ifdef CONFIG_CAMERA_POLE_SUPPORT + input_set_capability(input_dev, EV_KEY, CAMERA_POLE_CODE); + #endif + /* add by lgd > */ + ret = input_register_device(input_dev); + if (ret) { + PRINT_ERR("input_register_device for headset_button failed!\n"); + goto failed_to_register_input_device; + } + + sema_init(&headset_sem, 1); + + INIT_WORK(&ht->work_button, headset_button_work_func); + ht->button_work_queue = create_singlethread_workqueue("headset_button"); + if(ht->button_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_button failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_button; + } + + INIT_DELAYED_WORK(&ht->work_detect, headset_detect_work_func); + ht->detect_work_queue = create_singlethread_workqueue("headset_detect"); + if(ht->detect_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_detect failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_detect; + } + + /***polling ana_sts0 to avoid the hardware defect***/ +#ifdef SPRD_STS_POLLING_EN + INIT_DELAYED_WORK(&sts_check_work, headset_sts_check_func); + sts_check_work_queue = create_singlethread_workqueue("headset_sts_check"); + if(sts_check_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_sts_check failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_sts_check; + } +#endif + /***polling ana_sts0 to avoid the hardware defect***/ + + INIT_DELAYED_WORK(®_dump_work, reg_dump_func); + reg_dump_work_queue = create_singlethread_workqueue("headset_reg_dump"); + if(reg_dump_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_reg_dump failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_reg_dump; + } + if (debug_level >= 2) + queue_delayed_work(reg_dump_work_queue, ®_dump_work, msecs_to_jiffies(500)); + /* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT + INIT_DELAYED_WORK(&camera_pole_work, camera_pole_func); + camera_pole_work_queue = create_singlethread_workqueue("camera_pole"); + if(NULL == camera_pole_work_queue) { + PRINT_ERR("create_singlethread_workqueue for camera_pole failed!\n"); + goto failed_to_create_singlethread_workqueue_for_camera_pole; + } +#endif + /* add by lgd > */ +#ifdef ADPGAR_BYP_SELECT + //work queue for Bug#298417 + INIT_DELAYED_WORK(&adpgar_byp_select_work, adpgar_byp_select_func); + adpgar_byp_select_work_queue = create_singlethread_workqueue("adpgar_byp_select"); + if(adpgar_byp_select_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for adpgar_byp_select failed!\n"); + goto failed_to_create_singlethread_workqueue_for_adpgar_byp_select; + } + PRINT_INFO("ADPGAR_BYP_SELECT is enabled!\n"); +#endif + + wake_lock_init(&headset_detect_wakelock, WAKE_LOCK_SUSPEND, "headset_detect_wakelock"); + wake_lock_init(&headset_button_wakelock, WAKE_LOCK_SUSPEND, "headset_button_wakelock"); + + //set EIC3 de-bounce time for button irq + headset_reg_set_val((ANA_EIC_BASE+EIC3_DBNC_CTRL), DBNC_CNT3_VALUE, DBNC_CNT3_MASK, DBNC_CNT3_SHIFT); + //set EIC5 de-bounce time for inser irq + headset_reg_set_val((ANA_EIC_BASE+EIC5_DBNC_CTRL), DBNC_CNT5_VALUE, DBNC_CNT5_MASK, DBNC_CNT5_SHIFT); + + irqflags = pdata->irq_trigger_level_button ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->irq_button, headset_button_irq_handler, irqflags | IRQF_NO_SUSPEND, "headset_button", ht); + if (ret) { + PRINT_ERR("failed to request IRQ_%d(GPIO_%d)\n", ht->irq_button, pdata->gpio_button); + goto failed_to_request_irq_headset_button; + } + headset_irq_button_enable(0, ht->irq_button);//disable button irq before headset detected + headset_button_hardware_bug_fix_stage = 0; + + irqflags = pdata->irq_trigger_level_detect ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->irq_detect, headset_detect_irq_handler, irqflags | IRQF_NO_SUSPEND, "headset_detect", ht); + if (ret < 0) { + PRINT_ERR("failed to request IRQ_%d(GPIO_%d)\n", ht->irq_detect, pdata->gpio_detect); + goto failed_to_request_irq_headset_detect; + } + + ret = headset_debug_sysfs_init(); + + PRINT_INFO("headset_detect_probe success\n"); + return ret; + +failed_to_request_irq_headset_detect: + free_irq(ht->irq_button, ht); +failed_to_request_irq_headset_button: + +#ifdef ADPGAR_BYP_SELECT + cancel_delayed_work_sync(&adpgar_byp_select_work); + destroy_workqueue(adpgar_byp_select_work_queue); +failed_to_create_singlethread_workqueue_for_adpgar_byp_select: +#endif + +/* < add by lgd */ +#ifdef CONFIG_CAMERA_POLE_SUPPORT + cancel_delayed_work_sync(&camera_pole_work); + destroy_workqueue(camera_pole_work_queue); +failed_to_create_singlethread_workqueue_for_camera_pole: +#endif +/* add by lgd > */ + + cancel_delayed_work_sync(®_dump_work); + destroy_workqueue(reg_dump_work_queue); +failed_to_create_singlethread_workqueue_for_headset_reg_dump: + +#ifdef SPRD_STS_POLLING_EN + destroy_workqueue(sts_check_work_queue); +failed_to_create_singlethread_workqueue_for_headset_sts_check: +#endif + + destroy_workqueue(ht->detect_work_queue); +failed_to_create_singlethread_workqueue_for_headset_detect: + destroy_workqueue(ht->button_work_queue); +failed_to_create_singlethread_workqueue_for_headset_button: + input_unregister_device(input_dev); +failed_to_register_input_device: + input_free_device(input_dev); +failed_to_allocate_input_device: + switch_dev_unregister(&ht->sdev); +failed_to_register_switch_dev: + gpio_free(pdata->gpio_button); +failed_to_request_gpio_button: + gpio_free(pdata->gpio_detect); +failed_to_request_gpio_detect: + if(0 != pdata->gpio_switch) + gpio_free(pdata->gpio_switch); +failed_to_request_gpio_switch: + headmicbias_power_on(&pdev->dev, 0); +fail_to_sprd_headset_power_init: +fail_to_get_platform_data: + PRINT_ERR("headset_detect_probe failed\n"); + return ret; +} + +#ifdef CONFIG_PM +static int headset_suspend(struct platform_device *dev, pm_message_t state) +{ + PRINT_INFO("suspend (det_irq = %d, but_irq = %d, plug_state_last = %d)\n", + headset.irq_detect, headset.irq_button, plug_state_last); + return 0; +} + +static int headset_resume(struct platform_device *dev) +{ + PRINT_INFO("resume (det_irq = %d, but_irq = %d, plug_state_last = %d)\n", + headset.irq_detect, headset.irq_button, plug_state_last); + return 0; +} +#else +#define headset_suspend NULL +#define headset_resume NULL +#endif + +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED +#define SPRD_HEADSET_AUXADC_CAL_NO 0 +#define SPRD_HEADSET_AUXADC_CAL_NV 1 +#define SPRD_HEADSET_AUXADC_CAL_CHIP 2 + +struct sprd_headset_auxadc_cal { + uint16_t p0_vol; //900mV + uint16_t p0_adc; + uint16_t p1_vol; //300mV + uint16_t p1_adc; + uint16_t cal_type; +}; + +static struct sprd_headset_auxadc_cal adc_cal = { + 0, 0, + 0, 0, + SPRD_HEADSET_AUXADC_CAL_NO, +}; + +static void adc_cal_from_efuse(void); +extern int sci_efuse_get_cal_v3(unsigned int * pdata, int num); + +static int adc_get_ideal(int adc_mic) +{ + int32_t A = 0; + int32_t B = 0; + int32_t temp1 = 0; + int32_t temp2 = 0; + int32_t temp3 = 0; + int32_t adc_ideal = -1; + PRINT_INFO("adc_get_ideal headset enter into \n"); + if (SPRD_HEADSET_AUXADC_CAL_CHIP == adc_cal.cal_type) { + A = adc_cal.p1_adc; + B = adc_cal.p0_adc; + + temp1 = 18 * adc_mic - 27 * A + 9 * B; + temp2 = B - A; + temp3 = 109 * temp1; + adc_ideal = temp3 / temp2; + + adc_ideal = (adc_ideal <= 0) ? 0 : adc_ideal; + + PRINT_INFO("Calibration data from efuse, adc_mic=%d, adc_ideal=%d\n", adc_mic, adc_ideal); + } else { + PRINT_ERR("The chip and NV do not calibrate ADC!\n"); + } + + return adc_ideal; +} + +static void adc_cal_from_efuse(void) +{ + int ret; + unsigned int efuse_cal_data[2] = {0}; + + PRINT_INFO("getting calibration data from efuse ...\n"); + + if (adc_cal.cal_type != SPRD_HEADSET_AUXADC_CAL_CHIP) { + if (!(sci_efuse_get_cal_v3(efuse_cal_data,2))) { + if(((efuse_cal_data[0] >> 16) & 0xffff - (efuse_cal_data[1] >> 16) & 0xffff == 0)) { + PRINT_ERR("ADC is equal to two points, So calibrate from efuse error!\n"); + return; + } + + adc_cal.p0_vol = efuse_cal_data[0] & 0xffff; + adc_cal.p0_adc = (efuse_cal_data[0] >> 16) & 0xffff; + adc_cal.p1_vol = efuse_cal_data[1] & 0xffff; + adc_cal.p1_adc = (efuse_cal_data[1] >> 16) & 0xffff; + + adc_cal.cal_type = SPRD_HEADSET_AUXADC_CAL_CHIP; + + PRINT_INFO("efuse_cal_data[0]=0x%08x\n", efuse_cal_data[0]); + PRINT_INFO("efuse_cal_data[1]=0x%08x\n", efuse_cal_data[1]); + + PRINT_INFO("========auxadc cal from efuse=========\n"); + PRINT_INFO(" ADC VOL\n"); + PRINT_INFO("p0: %4d %4d\n", adc_cal.p0_adc, adc_cal.p0_vol); + PRINT_INFO("p1: %4d %4d\n", adc_cal.p1_adc, adc_cal.p1_vol); + PRINT_INFO("========auxadc cal from efuse=========\n"); + + PRINT_INFO("calibrate from efuse success!\n"); + } else { + PRINT_ERR("calibrate from efuse failed!\n"); + } + } else { + PRINT_INFO("no need to calibrate from efuse!\n"); + } +} + +#endif + +static const struct of_device_id headset_detect_of_match[] = { + {.compatible = "sprd,headset-detect",}, + { } +}; +static struct platform_driver headset_detect_driver = { + .driver = { + .name = "headset-detect", + .owner = THIS_MODULE, + .of_match_table = headset_detect_of_match, + }, + .probe = headset_detect_probe, + .suspend = headset_suspend, + .resume = headset_resume, +}; + +static int __init headset_init(void) +{ + int ret; +#ifdef CONFIG_HEADSET_AUXADC_CAL_SUPPORTED + adc_cal_from_efuse(); +#endif + ret = platform_driver_register(&headset_detect_driver); + return ret; +} + +static void __exit headset_exit(void) +{ + sprd_headset_power_deinit(); + platform_driver_unregister(&headset_detect_driver); +} + +late_initcall(headset_init); +module_exit(headset_exit); + +MODULE_DESCRIPTION("headset & button detect driver"); +MODULE_AUTHOR("Yaochuan Li "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/headset_sprd_sc2723.c b/drivers/input/misc/headset_sprd_sc2723.c new file mode 100644 index 00000000..3c210d31 --- /dev/null +++ b/drivers/input/misc/headset_sprd_sc2723.c @@ -0,0 +1,1920 @@ +/* + * Copyright (C) 2013 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#ifdef CONFIG_OF +#include +#include +#endif +#include +#include +#include + +//==================== debug ==================== +#define ENTER \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_HEADSET_DBG][%d] func: %s line: %04d\n", adie_type, __func__, __LINE__); }while(0) + +#define PRINT_DBG(format,x...) \ +do{ if(debug_level >= 1) printk(KERN_INFO "[SPRD_HEADSET_DBG][%d] " format, adie_type, ## x); }while(0) + +#define PRINT_INFO(format,x...) \ +do{ printk(KERN_INFO "[SPRD_HEADSET_INFO][%d] " format, adie_type, ## x); }while(0) + +#define PRINT_WARN(format,x...) \ +do{ printk(KERN_INFO "[SPRD_HEADSET_WARN][%d] " format, adie_type, ## x); }while(0) + +#define PRINT_ERR(format,x...) \ +do{ printk(KERN_ERR "[SPRD_HEADSET_ERR][%d] func: %s line: %04d info: " format, adie_type, __func__, __LINE__, ## x); }while(0) +//==================== debug ==================== + +/********************************************** + * The micro ADPGAR_BYP_SELECT is used for avoiding the Bug#298417, + * please refer to Bug#298417 to confirm your configuration. + **********************************************/ +#define ADPGAR_BYP_SELECT + +#define PLUG_CONFIRM_COUNT (1) +#define NO_MIC_RETRY_COUNT (0) +#define ADC_READ_COUNT (5) +#define ADC_READ_LOOP (2) +#define ADC_GND (300) +#define SCI_ADC_GET_VALUE_COUNT (50) + +#define EIC3_DBNC_CTRL (0x4C) +#define SW_DBNC_VALUE (10) +#define DBNC_CNT3_VALUE (30) +#define DBNC_CNT3_SHIFT (0) +#define DBNC_CNT3_MASK (0xFFF << DBNC_CNT3_SHIFT) + +#define EIC5_DBNC_CTRL (0x54) +#define DBNC_CNT5_VALUE (25) +#define DBNC_CNT5_SHIFT (0) +#define DBNC_CNT5_MASK (0xFFF << DBNC_CNT5_SHIFT) + + +#define EIC8_DBNC_CTRL (0x60) +#define DBNC_CNT8_VALUE (25) +#define DBNC_CNT8_SHIFT (0) +#define DBNC_CNT8_MASK (0xFFF << DBNC_CNT8_SHIFT) + +#define CLK_AUD_HID_EN (BIT(4)) +#define CLK_AUD_HBD_EN (BIT(3)) + +#define HEADMIC_DETECT_BASE (ANA_AUDCFGA_INT_BASE) +#define HEADMIC_DETECT_REG(X) (HEADMIC_DETECT_BASE + (X)) + +#define HEADMIC_DETECT_GLB_REG(X) (ANA_REGS_GLB_BASE + (X)) +#define HDT_EN (BIT(5)) +#define AUD_EN (BIT(4)) + +//no use +#define HEADMIC_BUTTON_BASE (ANA_HDT_INT_BASE) +#define HEADMIC_BUTTON_REG(X) (HEADMIC_BUTTON_BASE + (X)) +#define HID_CFG0 (0x0080) +#define HID_CFG2 (0x0088) +#define HID_CFG3 (0x008C) +#define HID_CFG4 (0x0090) +//no use + +#define ANA_PMU0 (0x0000) +#define ANA_CDC1 (0x0020) +#define ANA_HDT0 (0x0068) +#define ANA_STS0 (0x0074) + +#define AUDIO_HEADMIC_SLEEP_EN (BIT(6)) + +#define AUDIO_ADPGAR_BYP_SHIFT (10) +#define AUDIO_ADPGAR_BYP_MASK (0x3 << AUDIO_ADPGAR_BYP_SHIFT) +#define AUDIO_ADPGAR_BYP_NORMAL (0) +#define AUDIO_ADPGAR_BYP_ADC_PGAR1_2_ADCR (1) +#define AUDIO_ADPGAR_BYP_HEADMIC_2_ADCR (2) +#define AUDIO_ADPGAR_BYP_ALL_DISCONNECTED (3) + +#define AUDIO_HEAD_SDET_SHIFT (5) +#define AUDIO_HEAD_SDET_MASK (0x3 << AUDIO_HEAD_SDET_SHIFT) +#define AUDIO_HEAD_SDET_2P1 (3) +#define AUDIO_HEAD_SDET_2P3 (2) +#define AUDIO_HEAD_SDET_2P5 (1) +#define AUDIO_HEAD_SDET_2P7 (0) + +#define AUDIO_HEAD_INS_VREF_SHIFT (8) +#define AUDIO_HEAD_INS_VREF_MASK (0x3 << AUDIO_HEAD_INS_VREF_SHIFT) +#define AUDIO_HEAD_INS_VREF_2P1 (3) +#define AUDIO_HEAD_INS_VREF_2P3 (2) +#define AUDIO_HEAD_INS_VREF_2P5 (1) +#define AUDIO_HEAD_INS_VREF_2P7 (0) + +#define AUDIO_HEAD_SBUT_SHIFT (1) +#define AUDIO_HEAD_SBUT_MASK (0xF << AUDIO_HEAD_SBUT_SHIFT) + +#define AUDIO_HEAD_INS_PD (BIT(10)) +#define AUDIO_HEADDETECT_PD (BIT(7)) + +#define AUDIO_V2ADC_EN (BIT(15)) +#define AUDIO_HEAD2ADC_SEL_SHIFT (11) +#define AUDIO_HEAD2ADC_SEL_MASK (0xF << AUDIO_HEAD2ADC_SEL_SHIFT) +#define AUDIO_HEAD2ADC_SEL_DISABLE (0) +#define AUDIO_HEAD2ADC_SEL_HEADMIC_IN (1) +#define AUDIO_HEAD2ADC_SEL_HEADSET_L_INT (3) +#define AUDIO_HEAD2ADC_SEL_HEAD_DRO_L (4) + +#define AUDIO_HEAD_BUTTON (BIT(11)) +#define AUDIO_HEAD_INSERT (BIT(10)) +#define AUDIO_HEAD_INSERT_2 (BIT(9)) + +#define AUDIO_PMUR1 (BIT(0)) +#define ANA_PMU1 (0x0004) + +#define ABS(x) (((x) < (0)) ? (-(x)) : (x)) +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) + +#define headset_reg_read(addr) \ + do { \ + sci_adi_read(addr); \ +} while(0) + +#define headset_reg_set_val(addr, val, mask, shift) \ + do { \ + uint32_t temp; \ + temp = sci_adi_read(addr); \ + temp = (temp & (~mask)) | ((val) << (shift)); \ + sci_adi_raw_write(addr, temp); \ + } while(0) + +#define headset_reg_clr_bit(addr, bit) \ + do { \ + uint32_t temp; \ + temp = sci_adi_read(addr); \ + temp = temp & (~bit); \ + sci_adi_raw_write(addr, temp); \ + } while(0) + +#define headset_reg_set_bit(addr, bit) \ + do { \ + uint32_t temp; \ + temp = sci_adi_read(addr); \ + temp = temp | bit; \ + sci_adi_raw_write(addr, temp); \ + } while(0) + +static inline uint32_t headset_reg_get_bit(uint32_t addr, uint32_t bit) +{ + uint32_t temp; + temp = sci_adi_read(addr); + temp = temp & bit; + return temp; +} + +typedef enum sprd_headset_type { + HEADSET_4POLE_NORMAL, + HEADSET_NO_MIC, + HEADSET_4POLE_NOT_NORMAL, + HEADSET_APPLE, + HEADSET_TYPE_ERR = -1, +} SPRD_HEADSET_TYPE; + +static struct delayed_work reg_dump_work; +static struct workqueue_struct *reg_dump_work_queue; + +#ifdef ADPGAR_BYP_SELECT +static struct delayed_work adpgar_byp_select_work; +static struct workqueue_struct *adpgar_byp_select_work_queue; +#endif + +struct sprd_headset_auxadc_cal_l { + u32 A; + u32 B; + u32 E; + u32 cal_type; +}; + +#define SPRD_HEADSET_AUXADC_CAL_NO 0 +#define SPRD_HEADSET_AUXADC_CAL_DO 1 + +static struct sprd_headset_auxadc_cal_l adc_cal_headset = { + 0, 0,0,SPRD_HEADSET_AUXADC_CAL_NO, +}; + + + +static DEFINE_SPINLOCK(irq_button_lock); +static DEFINE_SPINLOCK(irq_detect_lock); +static DEFINE_SPINLOCK(irq_detect_mic_lock); + +static int detect_err_count = 0; +static int debug_level = 0; +static int adie_type = -1; +static int gpio_detect_value_last = 0; +static int gpio_button_value_last = 0; +static volatile int button_state_last = 0; //0==released, 1==pressed +static int current_key_code = KEY_RESERVED; +static int plug_state_last = 0; //if the hardware detected the headset is plug in, set plug_state_last = 1 +static struct wake_lock headset_detect_wakelock; +static struct wake_lock headset_button_wakelock; +static struct semaphore headset_sem; +static struct platform_device *this_pdev = NULL; +static struct sprd_headset headset = { + .sdev = { + .name = "h2w", + }, +}; + +//======================== audio codec ======================== +static struct sprd_headset_power { + struct regulator *head_mic; + struct regulator *vcom_buf; + struct regulator *vbo; +} sprd_hts_power; + +static int sprd_headset_power_get(struct device *dev, + struct regulator **regu, const char *id) +{ + if (!*regu) { + *regu = regulator_get(dev, id); + if (IS_ERR(*regu)) { + pr_err("ERR:Failed to request %ld: %s\n", PTR_ERR(*regu), id); + *regu = 0; + return PTR_ERR(*regu); + } + } + return 0; +} + +static int sprd_headset_power_init(struct device *dev) +{ + int ret = 0; + ret = sprd_headset_power_get(dev, &sprd_hts_power.head_mic, "HEADMICBIAS"); + if (ret || (sprd_hts_power.head_mic == NULL)) { + sprd_hts_power.head_mic = 0; + return ret; + } + regulator_set_voltage(sprd_hts_power.head_mic, 950000, 950000); + + ret = sprd_headset_power_get(dev, &sprd_hts_power.vcom_buf, "VCOM_BUF"); + if (ret) { + sprd_hts_power.vcom_buf = 0; + goto __err1; + } + + ret = sprd_headset_power_get(dev, &sprd_hts_power.vbo, "VBO"); + if (ret) { + sprd_hts_power.vbo = 0; + goto __err2; + } + + goto __ok; +__err2: + regulator_put(sprd_hts_power.vcom_buf); +__err1: + regulator_put(sprd_hts_power.head_mic); +__ok: + return ret; +} + +static void sprd_headset_power_deinit(void) +{ + regulator_put(sprd_hts_power.head_mic); + regulator_put(sprd_hts_power.vcom_buf); + regulator_put(sprd_hts_power.vbo); +} + +static int sprd_headset_audio_block_is_running(struct device *dev) +{ + return regulator_is_enabled(sprd_hts_power.vcom_buf) + || regulator_is_enabled(sprd_hts_power.vbo); +} + +static int sprd_headset_audio_headmic_sleep_disable(struct device *dev, int on) +{ + int ret = 0; + if (!sprd_hts_power.head_mic) { + return -1; + } + + if (on) { + ret = regulator_enable(sprd_hts_power.vbo); + ret = regulator_set_mode(sprd_hts_power.head_mic, REGULATOR_MODE_NORMAL); + } else { + ret = regulator_disable(sprd_hts_power.vbo); + if (sprd_headset_audio_block_is_running(dev)) { + ret = regulator_set_mode(sprd_hts_power.head_mic, REGULATOR_MODE_NORMAL); + } else { + ret = regulator_set_mode(sprd_hts_power.head_mic, REGULATOR_MODE_STANDBY); + } + } + return ret; +} + +static int sprd_headset_headmic_bias_control(struct device *dev, int on) +{ + int ret = 0; + if (!sprd_hts_power.head_mic) { + return -1; + } + if (on) { + ret = regulator_enable(sprd_hts_power.head_mic); + } else { + ret = regulator_disable(sprd_hts_power.head_mic); + } + if (!ret) { + /* Set HEADMIC_SLEEP when audio block closed */ + if (sprd_headset_audio_block_is_running(dev)) { + ret = regulator_set_mode(sprd_hts_power.head_mic, REGULATOR_MODE_NORMAL); + } else { + ret = regulator_set_mode(sprd_hts_power.head_mic, REGULATOR_MODE_STANDBY); + } + } + return ret; +} + +static BLOCKING_NOTIFIER_HEAD(hp_chain_list); +int hp_register_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&hp_chain_list, nb); +} +EXPORT_SYMBOL(hp_register_notifier); + +int hp_unregister_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&hp_chain_list, nb); +} +EXPORT_SYMBOL(hp_unregister_notifier); + +#if 0 +static int hp_notifier_call_chain(unsigned long val) +{ + return (blocking_notifier_call_chain(&hp_chain_list, val, NULL) + == NOTIFY_BAD) ? -EINVAL : 0; +} +#endif + +int get_hp_plug_state(void) +{ + return !!plug_state_last; +} +EXPORT_SYMBOL(get_hp_plug_state); +//======================== audio codec ======================== + +static int wrap_sci_adc_get_value(unsigned int channel, int scale) +{ + int count = 0; + int average = 0; + + while(count < SCI_ADC_GET_VALUE_COUNT) { + average += sci_adc_get_value(channel, scale); + count++; + } + average /= SCI_ADC_GET_VALUE_COUNT; + + return average; +} + +/* on = 0: open headmic detect circuit */ +static void headset_detect_circuit(unsigned on) +{ + if (on) { + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD_INS_PD); + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEADDETECT_PD); + } else { + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD_INS_PD); + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEADDETECT_PD); + } +} + +static void headset_detect_clk_en(void) +{ + //address:0x4003_8800+0x00 + headset_reg_set_bit(HEADMIC_DETECT_GLB_REG(0x00), (HDT_EN | AUD_EN)); + //address:0x4003_8800+0x04 + headset_reg_set_bit(HEADMIC_DETECT_GLB_REG(0x04), (CLK_AUD_HID_EN | CLK_AUD_HBD_EN)); +} + +static void headset_detect_init(void) +{ + headset_detect_clk_en(); + /* set headset detect voltage */ + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_PMU1), AUDIO_PMUR1); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD_SDET_2P5, AUDIO_HEAD_SDET_MASK, AUDIO_HEAD_SDET_SHIFT); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD_INS_VREF_2P1, AUDIO_HEAD_INS_VREF_MASK, AUDIO_HEAD_INS_VREF_SHIFT); +} + +static void headmic_sleep_disable(struct device *dev, int on); + +static void headset_adc_en(int en) +{ + if (en) { + headset_reg_set_bit(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_V2ADC_EN); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD2ADC_SEL_HEADMIC_IN, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + headmic_sleep_disable(&this_pdev->dev, 1); + } else { + if(debug_level <= 2) { + headset_reg_clr_bit(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_V2ADC_EN); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD2ADC_SEL_DISABLE, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + } + headmic_sleep_disable(&this_pdev->dev, 0); + } +} + +/* is_set = 1, headset_mic to AUXADC */ +static void set_adc_to_headmic(unsigned is_set) +{ + headset_adc_en(1); + + if (is_set) { + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD2ADC_SEL_HEADMIC_IN, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + } else { + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), AUDIO_HEAD2ADC_SEL_HEADSET_L_INT, AUDIO_HEAD2ADC_SEL_MASK, AUDIO_HEAD2ADC_SEL_SHIFT); + } +} + +static void headset_button_irq_threshold(int enable) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int audio_head_sbut = 0; + + audio_head_sbut = pdata->irq_threshold_buttont; + + if (enable) + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), audio_head_sbut, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); + else + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_HDT0), 0xF, AUDIO_HEAD_SBUT_MASK, AUDIO_HEAD_SBUT_SHIFT); +} + +static void headset_irq_button_enable(int enable, unsigned int irq) +{ + unsigned long spin_lock_flags; + static int current_irq_state = 1;//irq is enabled after request_irq() + spin_lock_irqsave(&irq_button_lock, spin_lock_flags); + if (1 == enable) { + if (0 == current_irq_state) { + enable_irq(irq); + current_irq_state = 1; + } + } else { + if (1 == current_irq_state) { + disable_irq_nosync(irq); + current_irq_state = 0; + } + } + spin_unlock_irqrestore(&irq_button_lock, spin_lock_flags); + return; +} + +static void headset_irq_detect_enable(int enable, unsigned int irq) +{ + unsigned long spin_lock_flags; + static int current_irq_state = 1;//irq is enabled after request_irq() + spin_lock_irqsave(&irq_detect_lock, spin_lock_flags); + if (1 == enable) { + if (0 == current_irq_state) { + enable_irq(irq); + current_irq_state = 1; + } + } else { + if (1 == current_irq_state) { + disable_irq_nosync(irq); + current_irq_state = 0; + } + } + spin_unlock_irqrestore(&irq_detect_lock, spin_lock_flags); + return; +} + +static void headset_irq_detect_mic_enable(int enable, unsigned int irq) +{ + unsigned long spin_lock_flags; + static int current_irq_state = 1; + spin_lock_irqsave(&irq_detect_mic_lock, spin_lock_flags); + if (1 == enable) { + if (0 == current_irq_state) { + enable_irq(irq); + current_irq_state = 1; + } + } else { + if (1 == current_irq_state) { + disable_irq_nosync(irq); + current_irq_state = 0; + } + } + spin_unlock_irqrestore(&irq_detect_mic_lock, spin_lock_flags); + return; +} + +static void headmic_sleep_disable(struct device *dev, int on) +{ + static int current_power_state = 0; + + if (1 == on) { + if (0 == current_power_state) { + sprd_headset_audio_headmic_sleep_disable(dev, 1); + current_power_state = 1; + } + } else { + if (1 == current_power_state) { + sprd_headset_audio_headmic_sleep_disable(dev, 0); + current_power_state = 0; + } + } + + return; +} + +static void headmicbias_power_on(struct device *dev, int on) +{ + static int current_power_state = 0; + struct sprd_headset *ht = &headset; + + if (1 == on) { + if (0 == current_power_state) { + if(NULL != ht->platform_data->external_headmicbias_power_on) + ht->platform_data->external_headmicbias_power_on(1); + sprd_headset_headmic_bias_control(dev, 1); + current_power_state = 1; + } + } else { + if (1 == current_power_state) { + if(NULL != ht->platform_data->external_headmicbias_power_on) + ht->platform_data->external_headmicbias_power_on(0); + sprd_headset_headmic_bias_control(dev, 0); + current_power_state = 0; + } + } + + return; +} + +static int ana_sts0_confirm(void) +{ + if (0 == headset_reg_get_bit(HEADMIC_DETECT_REG(ANA_STS0), AUDIO_HEAD_INSERT)) +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + return 0; +#else + return 1; +#endif + else + return 1; +} + +static int adc_compare(int x1, int x2) +{ + int delta = 0; + int max = 0; + + if((x1<300) && (x2<300)) + return 1; + + x1 = ((0==x1) ? 1 : (x1*100)); + x2 = ((0==x2) ? 1 : (x2*100)); + + delta = ABS(x1-x2); + max = MAX(x1, x2); + + if(delta < ((max*10)/100)) + return 1; + else + return 0; +} + +static int adc_get_average(int gpio_num, int gpio_value) +{ + int i = 0; + int j = 0; + int k = 0; + int adc_average = 0; + int success = 1; + int adc[ADC_READ_COUNT] = {0}; + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + + //================= debug ===================== + if(debug_level >= 3) { + int count = 0; + int adc_val = 0; + int gpio_button = 0; + int ana_pmu0 = 0; + int ana_cfg1 = 0; + int ana_hdt0 = 0; + int ana_sts0 = 0; + + while(count < 20) { + count++; + adc_val = wrap_sci_adc_get_value(ADC_CHANNEL_HEADMIC, 0); + gpio_button = gpio_get_value(pdata->gpio_button); + ana_pmu0 = sci_adi_read(HEADMIC_DETECT_REG(ANA_PMU0)); + ana_hdt0 = sci_adi_read(HEADMIC_DETECT_REG(ANA_HDT0)); + ana_sts0 = sci_adi_read(HEADMIC_DETECT_REG(ANA_STS0)); + + PRINT_INFO("%2d: gpio_button=%d adc=%4d ana_pmu0=0x%08X ana_cfg1=0x%08X ana_hdt0=0x%08X ana_sts0=0x%08X\n", + count, gpio_button, adc_val, ana_pmu0, ana_cfg1, ana_hdt0, ana_sts0); + msleep(1); + } + } + //================= debug ===================== + + msleep(1); + if(0 == headset_reg_get_bit(HEADMIC_DETECT_REG(ANA_PMU0), AUDIO_HEADMIC_SLEEP_EN)) + PRINT_INFO("AUDIO_HEADMIC_SLEEP_EN is disabled\n"); + + for(i=0; i< ADC_READ_LOOP; i++) { + if(gpio_get_value(gpio_num) != gpio_value) { + PRINT_INFO("gpio value changed!!! the adc read operation aborted (step1)\n"); + return -1; + } + if(0 == ana_sts0_confirm()) { + PRINT_INFO("ana_sts0_confirm failed!!! the adc read operation aborted (step2)\n"); + return -1; + } + adc[0] = wrap_sci_adc_get_value(ADC_CHANNEL_HEADMIC, 0); + + for(j=0; jaction->flags; + + if(irq == ht->irq_button) { + if(IRQF_TRIGGER_HIGH == type) { + PRINT_DBG("IRQF_TRIGGER_HIGH is set for irq_button(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_button, irq_flags, ret); + } else if(IRQF_TRIGGER_LOW == type) { + PRINT_DBG("IRQF_TRIGGER_LOW is set for irq_button(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_button, irq_flags, ret); + } + } else if(irq == ht->irq_detect) { + if(IRQF_TRIGGER_HIGH == type) { + PRINT_DBG("IRQF_TRIGGER_HIGH is set for irq_detect(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_detect, irq_flags, ret); + } else if(IRQF_TRIGGER_LOW == type) { + PRINT_DBG("IRQF_TRIGGER_LOW is set for irq_detect(%d). irq_flags = 0x%08X, ret = %d\n", + ht->irq_detect, irq_flags, ret); + } + } + return 0; +} + +static int headset_button_valid(int gpio_detect_value_current) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int button_is_valid = 0; + + if(1 == pdata->irq_trigger_level_detect) { + if(1 == gpio_detect_value_current) + button_is_valid = 1; + else + button_is_valid = 0; + } else { + if(0 == gpio_detect_value_current) + button_is_valid = 1; + else + button_is_valid = 0; + } + + return button_is_valid; +} + +static int headset_gpio_2_button_state(int gpio_button_value_current) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int button_state_current = 0; + + if(1 == pdata->irq_trigger_level_button) { + if(1 == gpio_button_value_current) + button_state_current = 1; + else + button_state_current = 0; + } else { + if(0 == gpio_button_value_current) + button_state_current = 1; + else + button_state_current = 0; + } + + return button_state_current; //0==released, 1==pressed +} + +static int headset_plug_confirm_by_adc(int last_gpio_detect_value) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int adc_last = 0; + int adc_current = 0; + int count = 0; + int adc_read_interval = 10; + + adc_last = adc_get_average(pdata->gpio_detect, last_gpio_detect_value); + if(-1 == adc_last) { + PRINT_INFO("headset_plug_confirm_by_adc failed!!!\n"); + return -1; + } + + while(count < PLUG_CONFIRM_COUNT) { + msleep(adc_read_interval); + adc_current = adc_get_average(pdata->gpio_detect, last_gpio_detect_value); + if(-1 == adc_current) { + PRINT_INFO("headset_plug_confirm_by_adc failed!!!\n"); + return -1; + } + if(0 == adc_compare(adc_last, adc_current)) { + PRINT_INFO("headset_plug_confirm_by_adc failed!!!\n"); + return -1; + } + adc_last = adc_current; + count++; + } + PRINT_INFO("headset_plug_confirm_by_adc success!!!\n"); + return adc_current; +} +static int adc_get_ideal(u32 adc_mic); + +static SPRD_HEADSET_TYPE headset_type_detect(int last_gpio_detect_value) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int adc_mic_average = 0; + int adc_left_average = 0; + int adc_mic_ideal = 0; + int no_mic_retry_count = NO_MIC_RETRY_COUNT; + + ENTER; + + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + else + PRINT_INFO("automatic type switch is unsupported\n"); + + headset_button_irq_threshold(1); + headset_detect_init(); + headset_detect_circuit(1); + +no_mic_retry: + + //get adc value of left + if(EIC_AUD_HEAD_INST2 == pdata->gpio_detect) { + PRINT_INFO("HEADSET_DETECT_GPIO=%d, matched the reference phone, now getting adc value of left\n", pdata->gpio_detect); + set_adc_to_headmic(0); + msleep(100); + adc_left_average = headset_plug_confirm_by_adc(last_gpio_detect_value); + if(-1 == adc_left_average) + return HEADSET_TYPE_ERR; + } else { + PRINT_INFO("HEADSET_DETECT_GPIO=%d, NOT matched the reference phone(GPIO_%d), set adc_left_average to 0\n", + pdata->gpio_detect, EIC_AUD_HEAD_INST2); + adc_left_average = 0; + } + + //get adc value of mic + set_adc_to_headmic(1); + msleep(50); + adc_mic_average = headset_plug_confirm_by_adc(last_gpio_detect_value); + if(-1 == adc_mic_average) + return HEADSET_TYPE_ERR; + adc_mic_ideal = adc_get_ideal(adc_mic_average); + PRINT_INFO("adc_mic_average=%d, adc_mic_ideal=%d\n", adc_mic_average, adc_mic_ideal); + if(adc_mic_ideal >= 0) { + adc_mic_average = adc_mic_ideal; + } + PRINT_INFO("adc_mic_average = %d\n", adc_mic_average); + PRINT_INFO("adc_left_average = %d\n", adc_left_average); + + if((gpio_get_value(pdata->gpio_detect)) != last_gpio_detect_value) { + PRINT_INFO("software debance (gpio check)!!!(headset_type_detect)\n"); + return HEADSET_TYPE_ERR; + } + + if(0 == ana_sts0_confirm()) { + PRINT_INFO("software debance (ana_sts0_confirm)!!!(headset_type_detect)\n"); + return HEADSET_TYPE_ERR; + } + + if((adc_mic_average < pdata->adc_threshold_3pole_detect)) { + if(0 != no_mic_retry_count) { + PRINT_INFO("no_mic_retry\n"); + no_mic_retry_count--; + goto no_mic_retry; + } + return HEADSET_NO_MIC; + } else if((adc_left_average < ADC_GND) && (adc_mic_average > ADC_GND)) + return HEADSET_4POLE_NORMAL; + else if((adc_left_average > ADC_GND) && (adc_mic_average > ADC_GND) + && (ABS(adc_mic_average - adc_left_average) < ADC_GND)) + return HEADSET_4POLE_NOT_NORMAL; + else + return HEADSET_TYPE_ERR; + + return HEADSET_TYPE_ERR; +} + +static void button_release_verify(void) +{ + struct sprd_headset *ht = &headset; + + if(1 == button_state_last) { + input_event(ht->input_dev, EV_KEY, current_key_code, 0); + input_sync(ht->input_dev); + button_state_last = 0; + PRINT_INFO("headset button released by force!!! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + } +} + +static void headset_button_work_func(struct work_struct *work) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + int gpio_button_value_current = 0; + int button_state_current = 0; + int adc_mic_average = 0; + int i = 0; + int adc_ideal = 0; + + down(&headset_sem); + set_adc_to_headmic(1); + + ENTER; + + gpio_button_value_current = gpio_get_value(pdata->gpio_button); + if(gpio_button_value_current != gpio_button_value_last) { + PRINT_INFO("software debance (step 1: gpio check)!!!(headset_button_work_func)\n"); +#ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); +#endif + goto out; + } + + button_state_current = headset_gpio_2_button_state(gpio_button_value_current); + + if(1 == button_state_current) {//pressed! + if(ht->platform_data->nbuttons > 0) { + adc_mic_average = adc_get_average(pdata->gpio_button, gpio_button_value_last); + if(-1 == adc_mic_average) { + PRINT_INFO("software debance (step 3: adc check)!!!(headset_button_work_func)(pressed)\n"); +#ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); +#endif + goto out; + } + adc_ideal = adc_get_ideal(adc_mic_average); + PRINT_INFO("adc_mic_average=%d, adc_ideal=%d\n", adc_mic_average, adc_ideal); + if (adc_ideal >= 0) + adc_mic_average = adc_ideal; + PRINT_INFO("adc_mic_average = %d\n", adc_mic_average); + for (i = 0; i < ht->platform_data->nbuttons; i++) { + if (adc_mic_average >= ht->platform_data->headset_buttons[i].adc_min && + adc_mic_average < ht->platform_data->headset_buttons[i].adc_max) { + current_key_code = ht->platform_data->headset_buttons[i].code; + break; + } + current_key_code = KEY_RESERVED; + } + } + + if(0 == button_state_last) { + input_event(ht->input_dev, EV_KEY, current_key_code, 1); + input_sync(ht->input_dev); + button_state_last = 1; + PRINT_INFO("headset button pressed! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + } else { + PRINT_ERR("headset button pressed already! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); +#ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); +#endif + } + + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + + headset_irq_button_enable(1, ht->irq_button); + } else { //released! + if(1 == button_state_last) { + input_event(ht->input_dev, EV_KEY, current_key_code, 0); + input_sync(ht->input_dev); + button_state_last = 0; + PRINT_INFO("headset button released! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + } else + PRINT_ERR("headset button released already! current_key_code = %d(0x%04X)\n", current_key_code, current_key_code); + + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + + headset_irq_button_enable(1, ht->irq_button); + } +out: + headset_adc_en(0); + headset_irq_button_enable(1, ht->irq_button); + //wake_unlock(&headset_button_wakelock); + up(&headset_sem); + return; +} + +static void headset_detect_work_func(struct work_struct *work) +{ + struct sprd_headset *ht = &headset; + struct sprd_headset_platform_data *pdata = ht->platform_data; + SPRD_HEADSET_TYPE headset_type; + int plug_state_current = 0; + int gpio_detect_value_current = 0; + down(&headset_sem); + + ENTER; + if (sprd_hts_power.head_mic == NULL) { + sprd_headset_power_init(&this_pdev->dev); + } + if (sprd_hts_power.head_mic == NULL ) { + PRINT_INFO("sprd_headset_power_init fail 0 \n"); + goto out; + } + + if(0 == plug_state_last) { + //schedule_timeout_uninterruptible(msecs_to_jiffies(10)); + headmicbias_power_on(&this_pdev->dev, 1); + } + + if(0 == plug_state_last) { + gpio_detect_value_current = gpio_get_value(pdata->gpio_detect); + PRINT_INFO("gpio_detect_value_current = %d, gpio_detect_value_last = %d, plug_state_last = %d\n", + gpio_detect_value_current, gpio_detect_value_last, plug_state_last); + + if(gpio_detect_value_current != gpio_detect_value_last) { + PRINT_INFO("software debance (step 1)!!!(headset_detect_work_func)\n"); + goto out; + } + + if(1 == pdata->irq_trigger_level_detect) { + if(1 == gpio_detect_value_current) + plug_state_current = 1; + else + plug_state_current = 0; + } else { + if(0 == gpio_detect_value_current) + plug_state_current = 1; + else + plug_state_current = 0; + } + } else + plug_state_current = 0;//no debounce for plug out!!! + + if(1 == plug_state_current && 0 == plug_state_last) { + headset_type = headset_type_detect(gpio_detect_value_last); + headset_adc_en(0); + switch (headset_type) { + case HEADSET_TYPE_ERR: + detect_err_count ++; + PRINT_INFO("headset_type = %d detect_err_count = %d(HEADSET_TYPE_ERR)\n", headset_type,detect_err_count); + goto out; + case HEADSET_4POLE_NOT_NORMAL: + PRINT_INFO("headset_type = %d (HEADSET_4POLE_NOT_NORMAL)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 1); + break; + case HEADSET_4POLE_NORMAL: + PRINT_INFO("headset_type = %d (HEADSET_4POLE_NORMAL)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + break; + case HEADSET_NO_MIC: + PRINT_INFO("headset_type = %d (HEADSET_NO_MIC)\n", headset_type); + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + break; + case HEADSET_APPLE: + PRINT_INFO("headset_type = %d (HEADSET_APPLE)\n", headset_type); + PRINT_INFO("we have not yet implemented this in the code\n"); + break; + default: + PRINT_INFO("headset_type = %d (HEADSET_UNKNOWN)\n", headset_type); + break; + } + + detect_err_count = 0; + if(headset_type == HEADSET_NO_MIC) + ht->headphone = 1; + else + ht->headphone = 0; + + if (ht->headphone) { + headset_button_irq_threshold(0); + headset_irq_button_enable(0, ht->irq_button); + + ht->type = BIT_HEADSET_NO_MIC; + //hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + PRINT_INFO("headphone plug in (headset_detect_work_func)\n"); + } else { + headset_button_irq_threshold(1); + + if((HEADSET_4POLE_NOT_NORMAL == headset_type) && (0 == pdata->gpio_switch)) { + headset_irq_button_enable(0, ht->irq_button); + PRINT_INFO("HEADSET_4POLE_NOT_NORMAL is not supported by your hardware! so disable the button irq!\n"); + } else { + if (1 == ht->platform_data->irq_trigger_level_button) + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_button, IRQF_TRIGGER_LOW); + + headset_irq_button_enable(1, ht->irq_button); + } + + ht->type = BIT_HEADSET_MIC; + //hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + PRINT_INFO("headset plug in (headset_detect_work_func)\n"); +#ifdef ADPGAR_BYP_SELECT + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(500)); +#endif + } + + plug_state_last = 1; +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + headset_irq_detect_enable(0, ht->irq_detect); + headset_irq_detect_mic_enable(1, ht->irq_detect_mic); +#else + if(1 == pdata->irq_trigger_level_detect) + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_LOW); + else + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_HIGH); + + headset_irq_detect_enable(1, ht->irq_detect); +#endif + } else if(0 == plug_state_current && 1 == plug_state_last) { + + headset_irq_button_enable(0, ht->irq_button); + button_release_verify(); + + if (ht->headphone) { + PRINT_INFO("headphone plug out (headset_detect_work_func)\n"); + } else { + PRINT_INFO("headset plug out (headset_detect_work_func)\n"); + } + ht->type = BIT_HEADSET_OUT; + //hp_notifier_call_chain(ht->type); + switch_set_state(&ht->sdev, ht->type); + plug_state_last = 0; +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + headset_irq_detect_mic_enable(0, ht->irq_detect_mic); +#else + if(1 == pdata->irq_trigger_level_detect) + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_HIGH); + else + headset_irq_set_irq_type(ht->irq_detect, IRQF_TRIGGER_LOW); +#endif + headset_irq_detect_enable(1, ht->irq_detect); + } else { + PRINT_INFO("irq_detect must be enabled anyway!!!\n"); + goto out; + } +out: + + if(0 == plug_state_last) { +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + headset_irq_detect_mic_enable(0, ht->irq_detect_mic); + if (detect_err_count < 500) { + headset_irq_detect_enable(1, ht->irq_detect); + } +#endif + headmicbias_power_on(&this_pdev->dev, 0); + //headset_detect_clk_en(); + //if (sprd_hts_power.head_mic) { + //regulator_set_mode(sprd_hts_power.head_mic, REGULATOR_MODE_NORMAL); + //} + } +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + if (1 == plug_state_last) { + headset_irq_detect_mic_enable(1, ht->irq_detect_mic); + headset_irq_detect_enable(0, ht->irq_detect); + } +#else + headset_irq_detect_enable(1, ht->irq_detect); +#endif + //wake_unlock(&headset_detect_wakelock); + up(&headset_sem); + return; +} + +#ifdef ADPGAR_BYP_SELECT +static void adpgar_byp_select_func(struct work_struct *work) +{ + if ((0x2723 == (sci_get_ana_chip_id() >> 16)) + && (SC2723ES == sci_get_ana_chip_ver() + || SC2723TS == sci_get_ana_chip_ver())) { + return; + } + + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CDC1), AUDIO_ADPGAR_BYP_HEADMIC_2_ADCR, AUDIO_ADPGAR_BYP_MASK, AUDIO_ADPGAR_BYP_SHIFT); + PRINT_INFO("ANA_CDC1 = 0x%08X\n", sci_adi_read(HEADMIC_DETECT_REG(ANA_CDC1))); + msleep(100); + headset_reg_set_val(HEADMIC_DETECT_REG(ANA_CDC1), AUDIO_ADPGAR_BYP_NORMAL, AUDIO_ADPGAR_BYP_MASK, AUDIO_ADPGAR_BYP_SHIFT); + PRINT_INFO("ANA_CDC1 = 0x%08X\n", sci_adi_read(HEADMIC_DETECT_REG(ANA_CDC1))); + PRINT_INFO("adpgar_byp_select_func\n"); +} +#endif + +static void reg_dump_func(struct work_struct *work) +{ + int adc_mic = 0; + + int gpio_detect = 0; + int gpio_button = 0; + int gpio_detect_mic = 0; + + int ana_sts0 = 0; + int ana_pmu0 = 0; + int ana_cfg1 = 0; + int ana_hdt0 = 0; + + int hid_cfg0 = 0; + int hid_cfg2 = 0; + int hid_cfg3 = 0; + int hid_cfg4 = 0; + + int arm_module_en = 0; + int arm_clk_en = 0; + + adc_mic = wrap_sci_adc_get_value(ADC_CHANNEL_HEADMIC, 1); + + gpio_detect = gpio_get_value(headset.platform_data->gpio_detect); + gpio_button = gpio_get_value(headset.platform_data->gpio_button); +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + gpio_detect_mic = gpio_get_value(headset.platform_data->gpio_detect_mic); +#endif + + sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_AUD_EN, BIT_ANA_AUD_EN);//arm base address:0x40038800 for register accessable + ana_pmu0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_PMU0);//arm base address:0x40038600 + ana_hdt0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_HDT0);//arm base address:0x40038600 + ana_sts0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0);//arm base address:0x40038600 + + sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_HDT_EN, BIT_ANA_HDT_EN);//arm base address:0x40038800 for register accessable + sci_adi_write(ANA_REG_GLB_ARM_CLK_EN, BIT_CLK_AUD_HID_EN, BIT_CLK_AUD_HID_EN);//arm base address:0x40038800 for register accessable + + hid_cfg2 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG2);//arm base address:0x40038700 + hid_cfg3 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG3);//arm base address:0x40038700 + hid_cfg4 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG4);//arm base address:0x40038700 + hid_cfg0 = sci_adi_read(ANA_HDT_INT_BASE+HID_CFG0);//arm base address:0x40038700 + + arm_module_en = sci_adi_read(ANA_REG_GLB_ARM_MODULE_EN); + arm_clk_en = sci_adi_read(ANA_REG_GLB_ARM_CLK_EN); + + PRINT_INFO("GPIO_%03d(det)=%d GPIO_%03d(but)=%d GPIO_%03d(det_mic)=%d adc_mic=%d\n", + headset.platform_data->gpio_detect, gpio_detect, + headset.platform_data->gpio_button, gpio_button, + headset.platform_data->gpio_detect_mic, gpio_detect_mic, + adc_mic); + PRINT_INFO("arm_module_en|arm_clk_en|ana_pmu0 |ana_cfg1 |ana_hdt0 |ana_sts0 |hid_cfg2 |hid_cfg3 |hid_cfg4 |hid_cfg0\n"); + PRINT_INFO("0x%08X |0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X\n", + arm_module_en, arm_clk_en, ana_pmu0, ana_cfg1, ana_hdt0, ana_sts0, hid_cfg2, hid_cfg3, hid_cfg4, hid_cfg0); +#if 0 + int i = 0; + int hbd[20] = {0}; + + for(i=0; i<20; i++) + hbd[i] = sci_adi_read(ANA_HDT_INT_BASE + (i*4)); + + PRINT_INFO(" hbd_cfg0 | hbd_cfg1 | hbd_cfg2 | hbd_cfg3 | hbd_cfg4 | hbd_cfg5 | hbd_cfg6 | hbd_cfg7 | hbd_cfg8 | hbd_cfg9\n"); + PRINT_INFO("0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X\n", + hbd[0], hbd[1], hbd[2], hbd[3], hbd[4], hbd[5], hbd[6], hbd[7], hbd[8], hbd[9]); + + PRINT_INFO("hbd_cfg10 |hbd_cfg11 |hbd_cfg12 |hbd_cfg13 |hbd_cfg14 |hbd_cfg15 |hbd_cfg16 | hbd_sts0 | hbd_sts1 | hbd_sts2\n"); + PRINT_INFO("0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X|0x%08X\n", + hbd[10], hbd[11], hbd[12], hbd[13], hbd[14], hbd[15], hbd[16], hbd[17], hbd[18], hbd[19]); +#endif + + if (debug_level >= 2) + queue_delayed_work(reg_dump_work_queue, ®_dump_work, msecs_to_jiffies(500)); + return; +} + +/** + * some phone boards, when no headset plugin, the button headset_button_valid() + * will always return 0, so we need to disable headset_button irq in here + * otherwise button irq will always happen. + */ +volatile int headset_button_hardware_bug_fix_stage = 1; +static void headset_button_hardware_bug_fix(struct sprd_headset *ht) +{ + if (headset_button_hardware_bug_fix_stage) { + headset_irq_button_enable(0, ht->irq_button); // disable button irq before headset detected + pr_err("This phone board headset button circuit has bug, please fix the hardware\n"); + } +} + +static irqreturn_t headset_button_irq_handler(int irq, void *dev) +{ + struct sprd_headset *ht = dev; + int button_state_current = 0; + int gpio_button_value_current = 0; + + if(0 == headset_button_valid(gpio_get_value(ht->platform_data->gpio_detect))) { + PRINT_INFO("headset_button_irq_handler: button is invalid!!! IRQ_%d(GPIO_%d) = %d, ANA_STS0 = 0x%08X\n", + ht->irq_button, ht->platform_data->gpio_button, gpio_button_value_last, + sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0)); + headset_button_hardware_bug_fix(ht); + + if(0 == plug_state_last) + headset_irq_button_enable(0, ht->irq_button); + + return IRQ_HANDLED; + } + + gpio_button_value_current = gpio_get_value(ht->platform_data->gpio_button); + button_state_current = headset_gpio_2_button_state(gpio_button_value_current); +#ifdef ADPGAR_BYP_SELECT + if(0 == button_state_current) { + queue_delayed_work(adpgar_byp_select_work_queue, &adpgar_byp_select_work, msecs_to_jiffies(0)); + } +#endif + if(button_state_current == button_state_last) { + PRINT_INFO("button state check failed!!! maybe the release is too quick. button_state_current=%d, button_state_last=%d\n", + button_state_current, button_state_last); + return IRQ_HANDLED; + } + + headset_irq_button_enable(0, ht->irq_button); + wake_lock_timeout(&headset_button_wakelock, msecs_to_jiffies(2000)); + gpio_button_value_last = gpio_button_value_current; + PRINT_DBG("headset_button_irq_handler: IRQ_%d(GPIO_%d) = %d, ANA_STS0 = 0x%08X\n", + ht->irq_button, ht->platform_data->gpio_button, gpio_button_value_last, + sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0)); + queue_work(ht->button_work_queue, &ht->work_button); + return IRQ_HANDLED; +} + +static irqreturn_t headset_detect_irq_handler(int irq, void *dev) +{ + struct sprd_headset *ht = dev; + PRINT_INFO("headset_detect_irq_handler in \n"); + headset_irq_button_enable(0, ht->irq_button); + headset_irq_detect_enable(0, ht->irq_detect); +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + headset_irq_detect_mic_enable(0, ht->irq_detect_mic); +#endif + wake_lock_timeout(&headset_detect_wakelock, msecs_to_jiffies(2000)); + gpio_detect_value_last = gpio_get_value(ht->platform_data->gpio_detect); + PRINT_DBG("headset_detect_irq_handler: IRQ_%d(GPIO_%d) = %d, ANA_STS0 = 0x%08X\n", + ht->irq_detect, ht->platform_data->gpio_detect, gpio_detect_value_last, + sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0)); + queue_delayed_work(ht->detect_work_queue, &ht->work_detect, msecs_to_jiffies(0)); + PRINT_INFO("headset_detect_irq_handler out \n"); + return IRQ_HANDLED; +} + +static irqreturn_t headset_detect_mic_irq_handler(int irq, void *dev) +{ + struct sprd_headset *ht = dev; + PRINT_INFO("headset_detect_mic_irq_handler in \n"); + if (plug_state_last != 1) { + headset_irq_detect_mic_enable(0, ht->irq_detect_mic); + PRINT_INFO("headset_detect_mic_irq_handler out0 \n"); + return IRQ_HANDLED; + } + headset_irq_detect_mic_enable(0, ht->irq_detect_mic); + headset_irq_detect_enable(0, ht->irq_detect); + wake_lock_timeout(&headset_detect_wakelock, msecs_to_jiffies(2000)); + queue_delayed_work(ht->detect_work_queue, &ht->work_detect, msecs_to_jiffies(0)); + PRINT_INFO("headset_detect_mic_irq_handler out1 \n"); + return IRQ_HANDLED; +} + +//================= create sys fs for debug =================== +//============= /sys/kernel/headset/debug_level =============== + +static ssize_t headset_debug_level_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + PRINT_INFO("debug_level = %d\n", debug_level); + return sprintf(buff, "%d\n", debug_level); +} + +static ssize_t headset_debug_level_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t len) +{ + unsigned long level = simple_strtoul(buff, NULL, 10); + debug_level = level; + PRINT_INFO("debug_level = %d\n", debug_level); + if(debug_level >= 2) + queue_delayed_work(reg_dump_work_queue, ®_dump_work, msecs_to_jiffies(500)); + return len; +} + +static struct kobject *headset_debug_kobj = NULL; +static struct kobj_attribute headset_debug_attr = + __ATTR(debug_level, 0644, headset_debug_level_show, headset_debug_level_store); + +static int headset_debug_sysfs_init(void) +{ + int ret = -1; + + headset_debug_kobj = kobject_create_and_add("headset", kernel_kobj); + if (headset_debug_kobj == NULL) { + ret = -ENOMEM; + PRINT_ERR("register sysfs failed. ret = %d\n", ret); + return ret; + } + + ret = sysfs_create_file(headset_debug_kobj, &headset_debug_attr.attr); + if (ret) { + PRINT_ERR("create sysfs failed. ret = %d\n", ret); + return ret; + } + + PRINT_INFO("headset_debug_sysfs_init success\n"); + return ret; +} +//================= create sys fs for debug =================== + +#ifdef CONFIG_OF +static struct sprd_headset_platform_data *headset_detect_parse_dt(struct device *dev) +{ + struct sprd_headset_platform_data *pdata; + struct device_node *np = dev->of_node,*buttons_np = NULL; + int ret; + struct headset_buttons *buttons_data; + + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "could not allocate memory for platform data\n"); + return NULL; + } + ret = of_property_read_u32(np, "gpio_switch", &pdata->gpio_switch); + if(ret) { + dev_err(dev, "fail to get gpio_switch\n"); + goto fail; + } + ret = of_property_read_u32(np, "gpio_detect", &pdata->gpio_detect); + if(ret) { + dev_err(dev, "fail to get gpio_detect\n"); + goto fail; + } +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + ret = of_property_read_u32(np, "gpio_detect_mic", &pdata->gpio_detect_mic); + if (ret) { + dev_err(dev, "fail to get gpio_detect_mic\n"); + goto fail; + } +#endif + ret = of_property_read_u32(np, "gpio_button", &pdata->gpio_button); + if(ret) { + dev_err(dev, "fail to get gpio_button\n"); + goto fail; + } + ret = of_property_read_u32(np, "irq_trigger_level_detect", &pdata->irq_trigger_level_detect); + if(ret) { + dev_err(dev, "fail to get irq_trigger_level_detect\n"); + goto fail; + } +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + ret = of_property_read_u32(np, "irq_trigger_level_detect_mic", &pdata->irq_trigger_level_detect_mic); + if (ret) { + dev_err(dev, "fail to get irq_trigger_level_detect_mic\n"); + goto fail; + } +#endif + ret = of_property_read_u32(np, "irq_trigger_level_button", &pdata->irq_trigger_level_button); + if(ret) { + dev_err(dev, "fail to get irq_trigger_level_button\n"); + goto fail; + } + ret = of_property_read_u32(np, "adc_threshold_3pole_detect", &pdata->adc_threshold_3pole_detect); + if(ret) { + dev_err(dev, "fail to get adc_threshold_3pole_detect\n"); + goto fail; + } + + ret = of_property_read_u32(np, "adc_threshold_4pole_detect", &pdata->adc_threshold_4pole_detect); + if(ret) { + dev_err(dev, "fail to get adc_threshold_4pole_detect\n"); + goto fail; + } + + ret = of_property_read_u32(np, "irq_threshold_buttont", &pdata->irq_threshold_buttont); + if(ret) { + dev_err(dev, "fail to get irq_threshold_buttont\n"); + goto fail; + } + + ret = of_property_read_u32(np, "voltage_headmicbias", &pdata->voltage_headmicbias); + if(ret) { + dev_err(dev, "fail to get voltage_headmicbias\n"); + goto fail; + } + ret = of_property_read_u32(np, "nbuttons", &pdata->nbuttons); + if(ret) { + dev_err(dev, "fail to get nbuttons\n"); + goto fail; + } + + buttons_data = kzalloc(pdata->nbuttons*sizeof(*buttons_data),GFP_KERNEL); + if (!buttons_data) { + dev_err(dev, "could not allocate memory for headset_buttons\n"); + goto fail; + } + pdata->headset_buttons = buttons_data; + + for_each_child_of_node(np,buttons_np) { + + ret = of_property_read_u32(buttons_np, "adc_min", &buttons_data->adc_min); + if (ret) { + dev_err(dev, "fail to get adc_min\n"); + goto fail_buttons_data; + } + ret = of_property_read_u32(buttons_np, "adc_max", &buttons_data->adc_max); + if (ret) { + dev_err(dev, "fail to get adc_max\n"); + goto fail_buttons_data; + } + ret = of_property_read_u32(buttons_np, "code", &buttons_data->code); + if (ret) { + dev_err(dev, "fail to get code\n"); + goto fail_buttons_data; + } + ret = of_property_read_u32(buttons_np, "type", &buttons_data->type); + if (ret) { + dev_err(dev, "fail to get type\n"); + goto fail_buttons_data; + } + PRINT_INFO("device tree data: adc_min = %d adc_max = %d code = %d type = %d \n", buttons_data->adc_min, + buttons_data->adc_max, buttons_data->code, buttons_data->type); + buttons_data++; + }; + + return pdata; + +fail_buttons_data: + kfree(buttons_data); + pdata->headset_buttons = NULL; +fail: + kfree(pdata); + return NULL; +} +#endif +static void adc_cal_from_efuse(void); + +static int headset_detect_probe(struct platform_device *pdev) +{ + struct sprd_headset_platform_data *pdata = pdev->dev.platform_data; + struct sprd_headset *ht = &headset; + unsigned long irqflags = 0; + struct input_dev *input_dev = NULL; + int i = 0; + int ret = -1; + int ana_sts0 = 0; + int adie_chip_id_low = 0; + int adie_chip_id_high = 0; + unsigned int adie_chip_id = 0; + unsigned int ddie_chip_id = 0; + +#ifdef CONFIG_OF + struct device_node *np = NULL; + np = pdev->dev.of_node; + + if (pdev->dev.of_node && !pdata) { + pdata = headset_detect_parse_dt(&pdev->dev); + if(pdata) + pdev->dev.platform_data = pdata; + } + if (!pdata) { + PRINT_ERR("headset_detect_probe get platform_data NULL\n"); + ret = -EINVAL; + goto fail_to_get_platform_data; + } +#endif + + this_pdev = pdev; + + sci_adi_write(ANA_REG_GLB_ARM_MODULE_EN, BIT_ANA_AUD_EN, BIT_ANA_AUD_EN);//arm base address:0x40038800 for register accessable + ana_sts0 = sci_adi_read(ANA_AUDCFGA_INT_BASE+ANA_STS0);//arm base address:0x40038600 + + ddie_chip_id = sci_get_chip_id(); + PRINT_INFO("ddie_chip_id=0x%08X\n", ddie_chip_id); + adie_chip_id = sci_get_ana_chip_id(); + PRINT_INFO("adie_chip_id=0x%08X\n", adie_chip_id); + + adie_chip_id_high = (adie_chip_id >> 16) & 0xFFFF; + adie_chip_id_low = adie_chip_id & 0xFFFF; + + switch (adie_chip_id_high) { + case 0x2723: {//chip is 2723 + adie_type = 2723; + PRINT_INFO("adie chip is 2723, type = %d\n", adie_type); + break; //break from 2723 + } + + default: { + adie_type = -1; //unknow + PRINT_ERR("unknow adie chip !!!\n"); + break; + } + } + + ht->platform_data = pdata; + headset_detect_init(); + + ret = sprd_headset_power_init(&pdev->dev); + if (ret) + goto fail_to_sprd_headset_power_init; + + PRINT_INFO("====================== SPRD HEADSET DETECT v2 ======================\n"); + PRINT_INFO(" write 0~3 to \"/sys/kernel/headset/debug_level\" for headset debug\n"); + PRINT_INFO("====================================================================\n"); + PRINT_INFO("use GPIO_%d for insert detecting\n", pdata->gpio_detect); + + if(0 != pdata->gpio_switch) { + ret = gpio_request(pdata->gpio_switch, "headset_switch"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_switch)\n", pdata->gpio_switch); + goto failed_to_request_gpio_switch; + } + } else + PRINT_INFO("automatic type switch is unsupported\n"); + + ret = gpio_request(pdata->gpio_detect, "headset_detect"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_detect)\n", pdata->gpio_detect); + goto failed_to_request_gpio_detect; + } +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + ret = gpio_request(pdata->gpio_detect_mic, "headset_detect_mic"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_detect_mic)\n", pdata->gpio_detect_mic); + goto failed_to_request_gpio_detect_mic; + } +#endif + ret = gpio_request(pdata->gpio_button, "headset_button"); + if (ret < 0) { + PRINT_ERR("failed to request GPIO_%d(headset_button)\n", pdata->gpio_button); + goto failed_to_request_gpio_button; + } + + if(0 != pdata->gpio_switch) + gpio_direction_output(pdata->gpio_switch, 0); + gpio_direction_input(pdata->gpio_detect); +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + gpio_direction_input(pdata->gpio_detect_mic); +#endif + gpio_direction_input(pdata->gpio_button); + ht->irq_detect = gpio_to_irq(pdata->gpio_detect); + ht->irq_button = gpio_to_irq(pdata->gpio_button); +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + ht->irq_detect_mic = gpio_to_irq(pdata->gpio_detect_mic); +#endif + ret = switch_dev_register(&ht->sdev); + if (ret < 0) { + PRINT_ERR("switch_dev_register failed!\n"); + goto failed_to_register_switch_dev; + } + + input_dev = input_allocate_device(); + if ( !input_dev) { + PRINT_ERR("input_allocate_device for headset_button failed!\n"); + ret = -ENOMEM; + goto failed_to_allocate_input_device; + } + + input_dev->name = "headset-keyboard"; + input_dev->id.bustype = BUS_HOST; + ht->input_dev = input_dev; + + for (i = 0; i < pdata->nbuttons; i++) { + struct headset_buttons *buttons = &pdata->headset_buttons[i]; + unsigned int type = buttons->type ?: EV_KEY; + input_set_capability(input_dev, type, buttons->code); + } + + ret = input_register_device(input_dev); + if (ret) { + PRINT_ERR("input_register_device for headset_button failed!\n"); + goto failed_to_register_input_device; + } + + sema_init(&headset_sem, 1); + + INIT_WORK(&ht->work_button, headset_button_work_func); + ht->button_work_queue = create_singlethread_workqueue("headset_button"); + if(ht->button_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_button failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_button; + } + + INIT_DELAYED_WORK(&ht->work_detect, headset_detect_work_func); + ht->detect_work_queue = create_singlethread_workqueue("headset_detect"); + if(ht->detect_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_detect failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_detect; + } + + INIT_DELAYED_WORK(®_dump_work, reg_dump_func); + reg_dump_work_queue = create_singlethread_workqueue("headset_reg_dump"); + if(reg_dump_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for headset_reg_dump failed!\n"); + goto failed_to_create_singlethread_workqueue_for_headset_reg_dump; + } + if (debug_level >= 2) + queue_delayed_work(reg_dump_work_queue, ®_dump_work, msecs_to_jiffies(500)); + +#ifdef ADPGAR_BYP_SELECT + //work queue for Bug#298417 + INIT_DELAYED_WORK(&adpgar_byp_select_work, adpgar_byp_select_func); + adpgar_byp_select_work_queue = create_singlethread_workqueue("adpgar_byp_select"); + if(adpgar_byp_select_work_queue == NULL) { + PRINT_ERR("create_singlethread_workqueue for adpgar_byp_select failed!\n"); + goto failed_to_create_singlethread_workqueue_for_adpgar_byp_select; + } + PRINT_INFO("ADPGAR_BYP_SELECT is enabled!\n"); +#endif + + wake_lock_init(&headset_detect_wakelock, WAKE_LOCK_SUSPEND, "headset_detect_wakelock"); + wake_lock_init(&headset_button_wakelock, WAKE_LOCK_SUSPEND, "headset_button_wakelock"); + + //set EIC3 de-bounce time for button irq + headset_reg_set_val((ANA_EIC_BASE+EIC3_DBNC_CTRL), DBNC_CNT3_VALUE, DBNC_CNT3_MASK, DBNC_CNT3_SHIFT); + //set EIC5 de-bounce time for inser irq + headset_reg_set_val((ANA_EIC_BASE+EIC8_DBNC_CTRL), DBNC_CNT8_VALUE, DBNC_CNT8_MASK, DBNC_CNT8_SHIFT); + +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + /* set EIC5 de-bounce time for ins_mic irq */ + headset_reg_set_val((ANA_EIC_BASE+EIC5_DBNC_CTRL), DBNC_CNT5_VALUE, DBNC_CNT5_MASK, DBNC_CNT5_SHIFT); +#endif + irqflags = pdata->irq_trigger_level_button ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->irq_button, headset_button_irq_handler, irqflags | IRQF_NO_SUSPEND, "headset_button", ht); + if (ret) { + PRINT_ERR("failed to request IRQ_%d(GPIO_%d)\n", ht->irq_button, pdata->gpio_button); + goto failed_to_request_irq_headset_button; + } + headset_irq_button_enable(0, ht->irq_button);//disable button irq before headset detected + headset_button_hardware_bug_fix_stage = 0; + + irqflags = pdata->irq_trigger_level_detect ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->irq_detect, headset_detect_irq_handler, irqflags | IRQF_NO_SUSPEND, "headset_detect", ht); + if (ret < 0) { + PRINT_ERR("failed to request IRQ_%d(GPIO_%d)\n", ht->irq_detect, pdata->gpio_detect); + goto failed_to_request_irq_headset_detect; + } +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 + irqflags = pdata->irq_trigger_level_detect_mic ? IRQF_TRIGGER_HIGH : IRQF_TRIGGER_LOW; + ret = request_irq(ht->irq_detect_mic, headset_detect_mic_irq_handler, irqflags | IRQF_NO_SUSPEND, "headset_detect_mic", ht); + if (ret < 0) { + PRINT_ERR("failed to request IRQ_%d(GPIO_%d)\n", ht->irq_detect_mic, pdata->gpio_detect_mic); + goto failed_to_request_irq_mic_headset_detect; + } +#endif + ret = headset_debug_sysfs_init(); + adc_cal_from_efuse(); + PRINT_INFO("headset_detect_probe success\n"); + return ret; +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 +failed_to_request_irq_mic_headset_detect: + free_irq(ht->irq_detect_mic, ht); +#endif +failed_to_request_irq_headset_detect: + free_irq(ht->irq_button, ht); +failed_to_request_irq_headset_button: + +#ifdef ADPGAR_BYP_SELECT + cancel_delayed_work_sync(&adpgar_byp_select_work); + destroy_workqueue(adpgar_byp_select_work_queue); +failed_to_create_singlethread_workqueue_for_adpgar_byp_select: +#endif + + cancel_delayed_work_sync(®_dump_work); + destroy_workqueue(reg_dump_work_queue); +failed_to_create_singlethread_workqueue_for_headset_reg_dump: + destroy_workqueue(ht->detect_work_queue); +failed_to_create_singlethread_workqueue_for_headset_detect: + destroy_workqueue(ht->button_work_queue); +failed_to_create_singlethread_workqueue_for_headset_button: + input_unregister_device(input_dev); +failed_to_register_input_device: + input_free_device(input_dev); +failed_to_allocate_input_device: + switch_dev_unregister(&ht->sdev); +failed_to_register_switch_dev: + gpio_free(pdata->gpio_button); +failed_to_request_gpio_button: + gpio_free(pdata->gpio_detect); +#ifdef CONFIG_SND_SOC_SPRD_USE_EAR_JACK_TYPE13 +failed_to_request_gpio_detect_mic: + gpio_free(pdata->gpio_detect_mic); +#endif +failed_to_request_gpio_detect: + if(0 != pdata->gpio_switch) + gpio_free(pdata->gpio_switch); +failed_to_request_gpio_switch: + headmicbias_power_on(&pdev->dev, 0); +fail_to_sprd_headset_power_init: +fail_to_get_platform_data: + PRINT_ERR("headset_detect_probe failed\n"); + return ret; +} + +#ifdef CONFIG_PM +static int headset_suspend(struct platform_device *dev, pm_message_t state) +{ + PRINT_INFO("suspend (det_irq = %d, but_irq = %d, plug_state_last = %d)\n", + headset.irq_detect, headset.irq_button, plug_state_last); + return 0; +} + +static int headset_resume(struct platform_device *dev) +{ + PRINT_INFO("resume (det_irq = %d, but_irq = %d, plug_state_last = %d)\n", + headset.irq_detect, headset.irq_button, plug_state_last); + return 0; +} +#else +#define headset_suspend NULL +#define headset_resume NULL +#endif + +static int adc_get_ideal(u32 adc_mic) +{ + u64 numerator = 0; + u32 denominator = 0; + u32 adc_ideal = 0; + if (adc_cal_headset.cal_type == SPRD_HEADSET_AUXADC_CAL_DO){ + PRINT_INFO("wangzuo adc_get_ideal in\n"); + u32 a = adc_cal_headset.A; + u32 b = adc_cal_headset.B; + u32 e = adc_cal_headset.E; + + if (9*adc_mic + b < 10*a){ + return adc_mic; + } + denominator = e*(b-a); + numerator = 917280*(9*(u64)adc_mic+(u64)b-10*(u64)a); + PRINT_INFO("denominator=%u, numerator=%llu\n", denominator, numerator); + do_div(numerator,denominator); + adc_ideal = (u32)numerator; + PRINT_INFO("adc_mic=%d, adc_ideal=%d\n", adc_mic, adc_ideal); + return adc_ideal; + } else { + return adc_mic; + } +} +extern u32 __adie_efuse_read_bits(int bit_index, int length); + +#define DELTA1_BLOCK9 9 +#define DELTA2_BLOCK10 10 +#define DELTA3_BLOCK11 11 +#define BITCOUNT 8 +#define BLK_WIDTH 8 +static void adc_cal_from_efuse(void) +{ + u32 delta[3] = {0}; + u32 block0_bit7 = 128; + u8 test[3] = {0}; + PRINT_INFO("to get calibration data from efuse ...\n"); + + if (adc_cal_headset.cal_type == SPRD_HEADSET_AUXADC_CAL_NO) { + + delta[0] = __adie_efuse_read_bits(DELTA1_BLOCK9*BLK_WIDTH,BITCOUNT); + delta[1] = __adie_efuse_read_bits(DELTA2_BLOCK10*BLK_WIDTH,BITCOUNT); + delta[2] = __adie_efuse_read_bits(DELTA3_BLOCK11*BLK_WIDTH,BITCOUNT); + + test[0] = delta[0]&0xff; + test[1] = delta[1]&0xff; + test[2] = delta[2]&0xff; + PRINT_INFO("test[0] 0x%x %d, test[1] 0x%x %d, test[2] 0x%x %d \n",test[0],test[0],test[1],test[1],test[2],test[2]); + + block0_bit7 = __adie_efuse_read_bits(0,BITCOUNT); + PRINT_INFO("block_7 0x%08x \n",block0_bit7); + if(block0_bit7&(1<<7)){ + PRINT_INFO("block 0 bit 7 set 1 no efuse data\n"); + return; + } else { + adc_cal_headset.cal_type = SPRD_HEADSET_AUXADC_CAL_DO; + PRINT_INFO("block 0 bit 7 set 0 have efuse data\n"); + } + + PRINT_INFO("test[0] %d, test[1] %d, test[2] %d \n",test[0],test[1],test[2]); + + adc_cal_headset.A = (test[0]*4)-184; + adc_cal_headset.B = (test[1]*4)+2764; + adc_cal_headset.E = (test[2]*2)+2500; + PRINT_INFO("adc_cal_headset.A %d, adc_cal_headset.B %d, adc_cal_headset.E %d \n",adc_cal_headset.A,adc_cal_headset.B,adc_cal_headset.E); + } else { + PRINT_INFO("efuse A,B,E has been calculated! \n"); + } + +} + +static const struct of_device_id headset_detect_of_match[] = { + {.compatible = "sprd,headset_sprd_sc2723",}, + { } +}; +static struct platform_driver headset_detect_driver = { + .driver = { + .name = "headset_sprd_sc2723", + .owner = THIS_MODULE, + .of_match_table = headset_detect_of_match, + }, + .probe = headset_detect_probe, + //.suspend = headset_suspend, + //.resume = headset_resume, +}; + +static int __init headset_init(void) +{ + int ret; + ret = platform_driver_register(&headset_detect_driver); + return ret; +} + +static void __exit headset_exit(void) +{ + sprd_headset_power_deinit(); + platform_driver_unregister(&headset_detect_driver); +} + +late_initcall(headset_init); +module_exit(headset_exit); + +MODULE_DESCRIPTION("headset & button detect driver v2"); +MODULE_AUTHOR("Yaochuan Li "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/hp_sdc_rtc.c b/drivers/input/misc/hp_sdc_rtc.c new file mode 100644 index 00000000..86b82280 --- /dev/null +++ b/drivers/input/misc/hp_sdc_rtc.c @@ -0,0 +1,730 @@ +/* + * HP i8042 SDC + MSM-58321 BBRTC driver. + * + * Copyright (c) 2001 Brian S. Julin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * + * References: + * System Device Controller Microprocessor Firmware Theory of Operation + * for Part Number 1820-4784 Revision B. Dwg No. A-1820-4784-2 + * efirtc.c by Stephane Eranian/Hewlett Packard + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Brian S. Julin "); +MODULE_DESCRIPTION("HP i8042 SDC + MSM-58321 RTC Driver"); +MODULE_LICENSE("Dual BSD/GPL"); + +#define RTC_VERSION "1.10d" + +static DEFINE_MUTEX(hp_sdc_rtc_mutex); +static unsigned long epoch = 2000; + +static struct semaphore i8042tregs; + +static hp_sdc_irqhook hp_sdc_rtc_isr; + +static struct fasync_struct *hp_sdc_rtc_async_queue; + +static DECLARE_WAIT_QUEUE_HEAD(hp_sdc_rtc_wait); + +static ssize_t hp_sdc_rtc_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos); + +static long hp_sdc_rtc_unlocked_ioctl(struct file *file, + unsigned int cmd, unsigned long arg); + +static unsigned int hp_sdc_rtc_poll(struct file *file, poll_table *wait); + +static int hp_sdc_rtc_open(struct inode *inode, struct file *file); +static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on); + +static void hp_sdc_rtc_isr (int irq, void *dev_id, + uint8_t status, uint8_t data) +{ + return; +} + +static int hp_sdc_rtc_do_read_bbrtc (struct rtc_time *rtctm) +{ + struct semaphore tsem; + hp_sdc_transaction t; + uint8_t tseq[91]; + int i; + + i = 0; + while (i < 91) { + tseq[i++] = HP_SDC_ACT_DATAREG | + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN; + tseq[i++] = 0x01; /* write i8042[0x70] */ + tseq[i] = i / 7; /* BBRTC reg address */ + i++; + tseq[i++] = HP_SDC_CMD_DO_RTCR; /* Trigger command */ + tseq[i++] = 2; /* expect 1 stat/dat pair back. */ + i++; i++; /* buffer for stat/dat pair */ + } + tseq[84] |= HP_SDC_ACT_SEMAPHORE; + t.endidx = 91; + t.seq = tseq; + t.act.semaphore = &tsem; + sema_init(&tsem, 0); + + if (hp_sdc_enqueue_transaction(&t)) return -1; + + /* Put ourselves to sleep for results. */ + if (WARN_ON(down_interruptible(&tsem))) + return -1; + + /* Check for nonpresence of BBRTC */ + if (!((tseq[83] | tseq[90] | tseq[69] | tseq[76] | + tseq[55] | tseq[62] | tseq[34] | tseq[41] | + tseq[20] | tseq[27] | tseq[6] | tseq[13]) & 0x0f)) + return -1; + + memset(rtctm, 0, sizeof(struct rtc_time)); + rtctm->tm_year = (tseq[83] & 0x0f) + (tseq[90] & 0x0f) * 10; + rtctm->tm_mon = (tseq[69] & 0x0f) + (tseq[76] & 0x0f) * 10; + rtctm->tm_mday = (tseq[55] & 0x0f) + (tseq[62] & 0x0f) * 10; + rtctm->tm_wday = (tseq[48] & 0x0f); + rtctm->tm_hour = (tseq[34] & 0x0f) + (tseq[41] & 0x0f) * 10; + rtctm->tm_min = (tseq[20] & 0x0f) + (tseq[27] & 0x0f) * 10; + rtctm->tm_sec = (tseq[6] & 0x0f) + (tseq[13] & 0x0f) * 10; + + return 0; +} + +static int hp_sdc_rtc_read_bbrtc (struct rtc_time *rtctm) +{ + struct rtc_time tm, tm_last; + int i = 0; + + /* MSM-58321 has no read latch, so must read twice and compare. */ + + if (hp_sdc_rtc_do_read_bbrtc(&tm_last)) return -1; + if (hp_sdc_rtc_do_read_bbrtc(&tm)) return -1; + + while (memcmp(&tm, &tm_last, sizeof(struct rtc_time))) { + if (i++ > 4) return -1; + memcpy(&tm_last, &tm, sizeof(struct rtc_time)); + if (hp_sdc_rtc_do_read_bbrtc(&tm)) return -1; + } + + memcpy(rtctm, &tm, sizeof(struct rtc_time)); + + return 0; +} + + +static int64_t hp_sdc_rtc_read_i8042timer (uint8_t loadcmd, int numreg) +{ + hp_sdc_transaction t; + uint8_t tseq[26] = { + HP_SDC_ACT_PRECMD | HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, + 0, + HP_SDC_CMD_READ_T1, 2, 0, 0, + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, + HP_SDC_CMD_READ_T2, 2, 0, 0, + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, + HP_SDC_CMD_READ_T3, 2, 0, 0, + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, + HP_SDC_CMD_READ_T4, 2, 0, 0, + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN, + HP_SDC_CMD_READ_T5, 2, 0, 0 + }; + + t.endidx = numreg * 5; + + tseq[1] = loadcmd; + tseq[t.endidx - 4] |= HP_SDC_ACT_SEMAPHORE; /* numreg assumed > 1 */ + + t.seq = tseq; + t.act.semaphore = &i8042tregs; + + /* Sleep if output regs in use. */ + if (WARN_ON(down_interruptible(&i8042tregs))) + return -1; + + if (hp_sdc_enqueue_transaction(&t)) return -1; + + /* Sleep until results come back. */ + if (WARN_ON(down_interruptible(&i8042tregs))) + return -1; + + up(&i8042tregs); + + return (tseq[5] | + ((uint64_t)(tseq[10]) << 8) | ((uint64_t)(tseq[15]) << 16) | + ((uint64_t)(tseq[20]) << 24) | ((uint64_t)(tseq[25]) << 32)); +} + + +/* Read the i8042 real-time clock */ +static inline int hp_sdc_rtc_read_rt(struct timeval *res) { + int64_t raw; + uint32_t tenms; + unsigned int days; + + raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_RT, 5); + if (raw < 0) return -1; + + tenms = (uint32_t)raw & 0xffffff; + days = (unsigned int)(raw >> 24) & 0xffff; + + res->tv_usec = (suseconds_t)(tenms % 100) * 10000; + res->tv_sec = (time_t)(tenms / 100) + days * 86400; + + return 0; +} + + +/* Read the i8042 fast handshake timer */ +static inline int hp_sdc_rtc_read_fhs(struct timeval *res) { + int64_t raw; + unsigned int tenms; + + raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_FHS, 2); + if (raw < 0) return -1; + + tenms = (unsigned int)raw & 0xffff; + + res->tv_usec = (suseconds_t)(tenms % 100) * 10000; + res->tv_sec = (time_t)(tenms / 100); + + return 0; +} + + +/* Read the i8042 match timer (a.k.a. alarm) */ +static inline int hp_sdc_rtc_read_mt(struct timeval *res) { + int64_t raw; + uint32_t tenms; + + raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_MT, 3); + if (raw < 0) return -1; + + tenms = (uint32_t)raw & 0xffffff; + + res->tv_usec = (suseconds_t)(tenms % 100) * 10000; + res->tv_sec = (time_t)(tenms / 100); + + return 0; +} + + +/* Read the i8042 delay timer */ +static inline int hp_sdc_rtc_read_dt(struct timeval *res) { + int64_t raw; + uint32_t tenms; + + raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_DT, 3); + if (raw < 0) return -1; + + tenms = (uint32_t)raw & 0xffffff; + + res->tv_usec = (suseconds_t)(tenms % 100) * 10000; + res->tv_sec = (time_t)(tenms / 100); + + return 0; +} + + +/* Read the i8042 cycle timer (a.k.a. periodic) */ +static inline int hp_sdc_rtc_read_ct(struct timeval *res) { + int64_t raw; + uint32_t tenms; + + raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_CT, 3); + if (raw < 0) return -1; + + tenms = (uint32_t)raw & 0xffffff; + + res->tv_usec = (suseconds_t)(tenms % 100) * 10000; + res->tv_sec = (time_t)(tenms / 100); + + return 0; +} + + +#if 0 /* not used yet */ +/* Set the i8042 real-time clock */ +static int hp_sdc_rtc_set_rt (struct timeval *setto) +{ + uint32_t tenms; + unsigned int days; + hp_sdc_transaction t; + uint8_t tseq[11] = { + HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT, + HP_SDC_CMD_SET_RTMS, 3, 0, 0, 0, + HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT, + HP_SDC_CMD_SET_RTD, 2, 0, 0 + }; + + t.endidx = 10; + + if (0xffff < setto->tv_sec / 86400) return -1; + days = setto->tv_sec / 86400; + if (0xffff < setto->tv_usec / 1000000 / 86400) return -1; + days += ((setto->tv_sec % 86400) + setto->tv_usec / 1000000) / 86400; + if (days > 0xffff) return -1; + + if (0xffffff < setto->tv_sec) return -1; + tenms = setto->tv_sec * 100; + if (0xffffff < setto->tv_usec / 10000) return -1; + tenms += setto->tv_usec / 10000; + if (tenms > 0xffffff) return -1; + + tseq[3] = (uint8_t)(tenms & 0xff); + tseq[4] = (uint8_t)((tenms >> 8) & 0xff); + tseq[5] = (uint8_t)((tenms >> 16) & 0xff); + + tseq[9] = (uint8_t)(days & 0xff); + tseq[10] = (uint8_t)((days >> 8) & 0xff); + + t.seq = tseq; + + if (hp_sdc_enqueue_transaction(&t)) return -1; + return 0; +} + +/* Set the i8042 fast handshake timer */ +static int hp_sdc_rtc_set_fhs (struct timeval *setto) +{ + uint32_t tenms; + hp_sdc_transaction t; + uint8_t tseq[5] = { + HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT, + HP_SDC_CMD_SET_FHS, 2, 0, 0 + }; + + t.endidx = 4; + + if (0xffff < setto->tv_sec) return -1; + tenms = setto->tv_sec * 100; + if (0xffff < setto->tv_usec / 10000) return -1; + tenms += setto->tv_usec / 10000; + if (tenms > 0xffff) return -1; + + tseq[3] = (uint8_t)(tenms & 0xff); + tseq[4] = (uint8_t)((tenms >> 8) & 0xff); + + t.seq = tseq; + + if (hp_sdc_enqueue_transaction(&t)) return -1; + return 0; +} + + +/* Set the i8042 match timer (a.k.a. alarm) */ +#define hp_sdc_rtc_set_mt (setto) \ + hp_sdc_rtc_set_i8042timer(setto, HP_SDC_CMD_SET_MT) + +/* Set the i8042 delay timer */ +#define hp_sdc_rtc_set_dt (setto) \ + hp_sdc_rtc_set_i8042timer(setto, HP_SDC_CMD_SET_DT) + +/* Set the i8042 cycle timer (a.k.a. periodic) */ +#define hp_sdc_rtc_set_ct (setto) \ + hp_sdc_rtc_set_i8042timer(setto, HP_SDC_CMD_SET_CT) + +/* Set one of the i8042 3-byte wide timers */ +static int hp_sdc_rtc_set_i8042timer (struct timeval *setto, uint8_t setcmd) +{ + uint32_t tenms; + hp_sdc_transaction t; + uint8_t tseq[6] = { + HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT, + 0, 3, 0, 0, 0 + }; + + t.endidx = 6; + + if (0xffffff < setto->tv_sec) return -1; + tenms = setto->tv_sec * 100; + if (0xffffff < setto->tv_usec / 10000) return -1; + tenms += setto->tv_usec / 10000; + if (tenms > 0xffffff) return -1; + + tseq[1] = setcmd; + tseq[3] = (uint8_t)(tenms & 0xff); + tseq[4] = (uint8_t)((tenms >> 8) & 0xff); + tseq[5] = (uint8_t)((tenms >> 16) & 0xff); + + t.seq = tseq; + + if (hp_sdc_enqueue_transaction(&t)) { + return -1; + } + return 0; +} +#endif + +static ssize_t hp_sdc_rtc_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) { + ssize_t retval; + + if (count < sizeof(unsigned long)) + return -EINVAL; + + retval = put_user(68, (unsigned long __user *)buf); + return retval; +} + +static unsigned int hp_sdc_rtc_poll(struct file *file, poll_table *wait) +{ + unsigned long l; + + l = 0; + if (l != 0) + return POLLIN | POLLRDNORM; + return 0; +} + +static int hp_sdc_rtc_open(struct inode *inode, struct file *file) +{ + return 0; +} + +static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on) +{ + return fasync_helper (fd, filp, on, &hp_sdc_rtc_async_queue); +} + +static int hp_sdc_rtc_proc_show(struct seq_file *m, void *v) +{ +#define YN(bit) ("no") +#define NY(bit) ("yes") + struct rtc_time tm; + struct timeval tv; + + memset(&tm, 0, sizeof(struct rtc_time)); + + if (hp_sdc_rtc_read_bbrtc(&tm)) { + seq_puts(m, "BBRTC\t\t: READ FAILED!\n"); + } else { + seq_printf(m, + "rtc_time\t: %02d:%02d:%02d\n" + "rtc_date\t: %04d-%02d-%02d\n" + "rtc_epoch\t: %04lu\n", + tm.tm_hour, tm.tm_min, tm.tm_sec, + tm.tm_year + 1900, tm.tm_mon + 1, + tm.tm_mday, epoch); + } + + if (hp_sdc_rtc_read_rt(&tv)) { + seq_puts(m, "i8042 rtc\t: READ FAILED!\n"); + } else { + seq_printf(m, "i8042 rtc\t: %ld.%02d seconds\n", + tv.tv_sec, (int)tv.tv_usec/1000); + } + + if (hp_sdc_rtc_read_fhs(&tv)) { + seq_puts(m, "handshake\t: READ FAILED!\n"); + } else { + seq_printf(m, "handshake\t: %ld.%02d seconds\n", + tv.tv_sec, (int)tv.tv_usec/1000); + } + + if (hp_sdc_rtc_read_mt(&tv)) { + seq_puts(m, "alarm\t\t: READ FAILED!\n"); + } else { + seq_printf(m, "alarm\t\t: %ld.%02d seconds\n", + tv.tv_sec, (int)tv.tv_usec/1000); + } + + if (hp_sdc_rtc_read_dt(&tv)) { + seq_puts(m, "delay\t\t: READ FAILED!\n"); + } else { + seq_printf(m, "delay\t\t: %ld.%02d seconds\n", + tv.tv_sec, (int)tv.tv_usec/1000); + } + + if (hp_sdc_rtc_read_ct(&tv)) { + seq_puts(m, "periodic\t: READ FAILED!\n"); + } else { + seq_printf(m, "periodic\t: %ld.%02d seconds\n", + tv.tv_sec, (int)tv.tv_usec/1000); + } + + seq_printf(m, + "DST_enable\t: %s\n" + "BCD\t\t: %s\n" + "24hr\t\t: %s\n" + "square_wave\t: %s\n" + "alarm_IRQ\t: %s\n" + "update_IRQ\t: %s\n" + "periodic_IRQ\t: %s\n" + "periodic_freq\t: %ld\n" + "batt_status\t: %s\n", + YN(RTC_DST_EN), + NY(RTC_DM_BINARY), + YN(RTC_24H), + YN(RTC_SQWE), + YN(RTC_AIE), + YN(RTC_UIE), + YN(RTC_PIE), + 1UL, + 1 ? "okay" : "dead"); + + return 0; +#undef YN +#undef NY +} + +static int hp_sdc_rtc_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, hp_sdc_rtc_proc_show, NULL); +} + +static const struct file_operations hp_sdc_rtc_proc_fops = { + .open = hp_sdc_rtc_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int hp_sdc_rtc_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ +#if 1 + return -EINVAL; +#else + + struct rtc_time wtime; + struct timeval ttime; + int use_wtime = 0; + + /* This needs major work. */ + + switch (cmd) { + + case RTC_AIE_OFF: /* Mask alarm int. enab. bit */ + case RTC_AIE_ON: /* Allow alarm interrupts. */ + case RTC_PIE_OFF: /* Mask periodic int. enab. bit */ + case RTC_PIE_ON: /* Allow periodic ints */ + case RTC_UIE_ON: /* Allow ints for RTC updates. */ + case RTC_UIE_OFF: /* Allow ints for RTC updates. */ + { + /* We cannot mask individual user timers and we + cannot tell them apart when they occur, so it + would be disingenuous to succeed these IOCTLs */ + return -EINVAL; + } + case RTC_ALM_READ: /* Read the present alarm time */ + { + if (hp_sdc_rtc_read_mt(&ttime)) return -EFAULT; + if (hp_sdc_rtc_read_bbrtc(&wtime)) return -EFAULT; + + wtime.tm_hour = ttime.tv_sec / 3600; ttime.tv_sec %= 3600; + wtime.tm_min = ttime.tv_sec / 60; ttime.tv_sec %= 60; + wtime.tm_sec = ttime.tv_sec; + + break; + } + case RTC_IRQP_READ: /* Read the periodic IRQ rate. */ + { + return put_user(hp_sdc_rtc_freq, (unsigned long *)arg); + } + case RTC_IRQP_SET: /* Set periodic IRQ rate. */ + { + /* + * The max we can do is 100Hz. + */ + + if ((arg < 1) || (arg > 100)) return -EINVAL; + ttime.tv_sec = 0; + ttime.tv_usec = 1000000 / arg; + if (hp_sdc_rtc_set_ct(&ttime)) return -EFAULT; + hp_sdc_rtc_freq = arg; + return 0; + } + case RTC_ALM_SET: /* Store a time into the alarm */ + { + /* + * This expects a struct hp_sdc_rtc_time. Writing 0xff means + * "don't care" or "match all" for PC timers. The HP SDC + * does not support that perk, but it could be emulated fairly + * easily. Only the tm_hour, tm_min and tm_sec are used. + * We could do it with 10ms accuracy with the HP SDC, if the + * rtc interface left us a way to do that. + */ + struct hp_sdc_rtc_time alm_tm; + + if (copy_from_user(&alm_tm, (struct hp_sdc_rtc_time*)arg, + sizeof(struct hp_sdc_rtc_time))) + return -EFAULT; + + if (alm_tm.tm_hour > 23) return -EINVAL; + if (alm_tm.tm_min > 59) return -EINVAL; + if (alm_tm.tm_sec > 59) return -EINVAL; + + ttime.sec = alm_tm.tm_hour * 3600 + + alm_tm.tm_min * 60 + alm_tm.tm_sec; + ttime.usec = 0; + if (hp_sdc_rtc_set_mt(&ttime)) return -EFAULT; + return 0; + } + case RTC_RD_TIME: /* Read the time/date from RTC */ + { + if (hp_sdc_rtc_read_bbrtc(&wtime)) return -EFAULT; + break; + } + case RTC_SET_TIME: /* Set the RTC */ + { + struct rtc_time hp_sdc_rtc_tm; + unsigned char mon, day, hrs, min, sec, leap_yr; + unsigned int yrs; + + if (!capable(CAP_SYS_TIME)) + return -EACCES; + if (copy_from_user(&hp_sdc_rtc_tm, (struct rtc_time *)arg, + sizeof(struct rtc_time))) + return -EFAULT; + + yrs = hp_sdc_rtc_tm.tm_year + 1900; + mon = hp_sdc_rtc_tm.tm_mon + 1; /* tm_mon starts at zero */ + day = hp_sdc_rtc_tm.tm_mday; + hrs = hp_sdc_rtc_tm.tm_hour; + min = hp_sdc_rtc_tm.tm_min; + sec = hp_sdc_rtc_tm.tm_sec; + + if (yrs < 1970) + return -EINVAL; + + leap_yr = ((!(yrs % 4) && (yrs % 100)) || !(yrs % 400)); + + if ((mon > 12) || (day == 0)) + return -EINVAL; + if (day > (days_in_mo[mon] + ((mon == 2) && leap_yr))) + return -EINVAL; + if ((hrs >= 24) || (min >= 60) || (sec >= 60)) + return -EINVAL; + + if ((yrs -= eH) > 255) /* They are unsigned */ + return -EINVAL; + + + return 0; + } + case RTC_EPOCH_READ: /* Read the epoch. */ + { + return put_user (epoch, (unsigned long *)arg); + } + case RTC_EPOCH_SET: /* Set the epoch. */ + { + /* + * There were no RTC clocks before 1900. + */ + if (arg < 1900) + return -EINVAL; + if (!capable(CAP_SYS_TIME)) + return -EACCES; + + epoch = arg; + return 0; + } + default: + return -EINVAL; + } + return copy_to_user((void *)arg, &wtime, sizeof wtime) ? -EFAULT : 0; +#endif +} + +static long hp_sdc_rtc_unlocked_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + int ret; + + mutex_lock(&hp_sdc_rtc_mutex); + ret = hp_sdc_rtc_ioctl(file, cmd, arg); + mutex_unlock(&hp_sdc_rtc_mutex); + + return ret; +} + + +static const struct file_operations hp_sdc_rtc_fops = { + .owner = THIS_MODULE, + .llseek = no_llseek, + .read = hp_sdc_rtc_read, + .poll = hp_sdc_rtc_poll, + .unlocked_ioctl = hp_sdc_rtc_unlocked_ioctl, + .open = hp_sdc_rtc_open, + .fasync = hp_sdc_rtc_fasync, +}; + +static struct miscdevice hp_sdc_rtc_dev = { + .minor = RTC_MINOR, + .name = "rtc_HIL", + .fops = &hp_sdc_rtc_fops +}; + +static int __init hp_sdc_rtc_init(void) +{ + int ret; + +#ifdef __mc68000__ + if (!MACH_IS_HP300) + return -ENODEV; +#endif + + sema_init(&i8042tregs, 1); + + if ((ret = hp_sdc_request_timer_irq(&hp_sdc_rtc_isr))) + return ret; + if (misc_register(&hp_sdc_rtc_dev) != 0) + printk(KERN_INFO "Could not register misc. dev for i8042 rtc\n"); + + proc_create("driver/rtc", 0, NULL, &hp_sdc_rtc_proc_fops); + + printk(KERN_INFO "HP i8042 SDC + MSM-58321 RTC support loaded " + "(RTC v " RTC_VERSION ")\n"); + + return 0; +} + +static void __exit hp_sdc_rtc_exit(void) +{ + remove_proc_entry ("driver/rtc", NULL); + misc_deregister(&hp_sdc_rtc_dev); + hp_sdc_release_timer_irq(hp_sdc_rtc_isr); + printk(KERN_INFO "HP i8042 SDC + MSM-58321 RTC support unloaded\n"); +} + +module_init(hp_sdc_rtc_init); +module_exit(hp_sdc_rtc_exit); diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c new file mode 100644 index 00000000..e204f26b --- /dev/null +++ b/drivers/input/misc/ims-pcu.c @@ -0,0 +1,1901 @@ +/* + * Driver for IMS Passenger Control Unit Devices + * + * Copyright (C) 2013 The IMS Company + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define IMS_PCU_KEYMAP_LEN 32 + +struct ims_pcu_buttons { + struct input_dev *input; + char name[32]; + char phys[32]; + unsigned short keymap[IMS_PCU_KEYMAP_LEN]; +}; + +struct ims_pcu_gamepad { + struct input_dev *input; + char name[32]; + char phys[32]; +}; + +struct ims_pcu_backlight { + struct led_classdev cdev; + struct work_struct work; + enum led_brightness desired_brightness; + char name[32]; +}; + +#define IMS_PCU_PART_NUMBER_LEN 15 +#define IMS_PCU_SERIAL_NUMBER_LEN 8 +#define IMS_PCU_DOM_LEN 8 +#define IMS_PCU_FW_VERSION_LEN (9 + 1) +#define IMS_PCU_BL_VERSION_LEN (9 + 1) +#define IMS_PCU_BL_RESET_REASON_LEN (2 + 1) + +#define IMS_PCU_BUF_SIZE 128 + +struct ims_pcu { + struct usb_device *udev; + struct device *dev; /* control interface's device, used for logging */ + + unsigned int device_no; + + bool bootloader_mode; + + char part_number[IMS_PCU_PART_NUMBER_LEN]; + char serial_number[IMS_PCU_SERIAL_NUMBER_LEN]; + char date_of_manufacturing[IMS_PCU_DOM_LEN]; + char fw_version[IMS_PCU_FW_VERSION_LEN]; + char bl_version[IMS_PCU_BL_VERSION_LEN]; + char reset_reason[IMS_PCU_BL_RESET_REASON_LEN]; + int update_firmware_status; + + struct usb_interface *ctrl_intf; + + struct usb_endpoint_descriptor *ep_ctrl; + struct urb *urb_ctrl; + u8 *urb_ctrl_buf; + dma_addr_t ctrl_dma; + size_t max_ctrl_size; + + struct usb_interface *data_intf; + + struct usb_endpoint_descriptor *ep_in; + struct urb *urb_in; + u8 *urb_in_buf; + dma_addr_t read_dma; + size_t max_in_size; + + struct usb_endpoint_descriptor *ep_out; + u8 *urb_out_buf; + size_t max_out_size; + + u8 read_buf[IMS_PCU_BUF_SIZE]; + u8 read_pos; + u8 check_sum; + bool have_stx; + bool have_dle; + + u8 cmd_buf[IMS_PCU_BUF_SIZE]; + u8 ack_id; + u8 expected_response; + u8 cmd_buf_len; + struct completion cmd_done; + struct mutex cmd_mutex; + + u32 fw_start_addr; + u32 fw_end_addr; + struct completion async_firmware_done; + + struct ims_pcu_buttons buttons; + struct ims_pcu_gamepad *gamepad; + struct ims_pcu_backlight backlight; + + bool setup_complete; /* Input and LED devices have been created */ +}; + + +/********************************************************************* + * Buttons Input device support * + *********************************************************************/ + +static const unsigned short ims_pcu_keymap_1[] = { + [1] = KEY_ATTENDANT_OFF, + [2] = KEY_ATTENDANT_ON, + [3] = KEY_LIGHTS_TOGGLE, + [4] = KEY_VOLUMEUP, + [5] = KEY_VOLUMEDOWN, + [6] = KEY_INFO, +}; + +static const unsigned short ims_pcu_keymap_2[] = { + [4] = KEY_VOLUMEUP, + [5] = KEY_VOLUMEDOWN, + [6] = KEY_INFO, +}; + +static const unsigned short ims_pcu_keymap_3[] = { + [1] = KEY_HOMEPAGE, + [2] = KEY_ATTENDANT_TOGGLE, + [3] = KEY_LIGHTS_TOGGLE, + [4] = KEY_VOLUMEUP, + [5] = KEY_VOLUMEDOWN, + [6] = KEY_DISPLAYTOGGLE, + [18] = KEY_PLAYPAUSE, +}; + +static const unsigned short ims_pcu_keymap_4[] = { + [1] = KEY_ATTENDANT_OFF, + [2] = KEY_ATTENDANT_ON, + [3] = KEY_LIGHTS_TOGGLE, + [4] = KEY_VOLUMEUP, + [5] = KEY_VOLUMEDOWN, + [6] = KEY_INFO, + [18] = KEY_PLAYPAUSE, +}; + +static const unsigned short ims_pcu_keymap_5[] = { + [1] = KEY_ATTENDANT_OFF, + [2] = KEY_ATTENDANT_ON, + [3] = KEY_LIGHTS_TOGGLE, +}; + +struct ims_pcu_device_info { + const unsigned short *keymap; + size_t keymap_len; + bool has_gamepad; +}; + +#define IMS_PCU_DEVINFO(_n, _gamepad) \ + [_n] = { \ + .keymap = ims_pcu_keymap_##_n, \ + .keymap_len = ARRAY_SIZE(ims_pcu_keymap_##_n), \ + .has_gamepad = _gamepad, \ + } + +static const struct ims_pcu_device_info ims_pcu_device_info[] = { + IMS_PCU_DEVINFO(1, true), + IMS_PCU_DEVINFO(2, true), + IMS_PCU_DEVINFO(3, true), + IMS_PCU_DEVINFO(4, true), + IMS_PCU_DEVINFO(5, false), +}; + +static void ims_pcu_buttons_report(struct ims_pcu *pcu, u32 data) +{ + struct ims_pcu_buttons *buttons = &pcu->buttons; + struct input_dev *input = buttons->input; + int i; + + for (i = 0; i < 32; i++) { + unsigned short keycode = buttons->keymap[i]; + + if (keycode != KEY_RESERVED) + input_report_key(input, keycode, data & (1UL << i)); + } + + input_sync(input); +} + +static int ims_pcu_setup_buttons(struct ims_pcu *pcu, + const unsigned short *keymap, + size_t keymap_len) +{ + struct ims_pcu_buttons *buttons = &pcu->buttons; + struct input_dev *input; + int i; + int error; + + input = input_allocate_device(); + if (!input) { + dev_err(pcu->dev, + "Not enough memory for input input device\n"); + return -ENOMEM; + } + + snprintf(buttons->name, sizeof(buttons->name), + "IMS PCU#%d Button Interface", pcu->device_no); + + usb_make_path(pcu->udev, buttons->phys, sizeof(buttons->phys)); + strlcat(buttons->phys, "/input0", sizeof(buttons->phys)); + + memcpy(buttons->keymap, keymap, sizeof(*keymap) * keymap_len); + + input->name = buttons->name; + input->phys = buttons->phys; + usb_to_input_id(pcu->udev, &input->id); + input->dev.parent = &pcu->ctrl_intf->dev; + + input->keycode = buttons->keymap; + input->keycodemax = ARRAY_SIZE(buttons->keymap); + input->keycodesize = sizeof(buttons->keymap[0]); + + __set_bit(EV_KEY, input->evbit); + for (i = 0; i < IMS_PCU_KEYMAP_LEN; i++) + __set_bit(buttons->keymap[i], input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + error = input_register_device(input); + if (error) { + dev_err(pcu->dev, + "Failed to register buttons input device: %d\n", + error); + input_free_device(input); + return error; + } + + buttons->input = input; + return 0; +} + +static void ims_pcu_destroy_buttons(struct ims_pcu *pcu) +{ + struct ims_pcu_buttons *buttons = &pcu->buttons; + + input_unregister_device(buttons->input); +} + + +/********************************************************************* + * Gamepad Input device support * + *********************************************************************/ + +static void ims_pcu_gamepad_report(struct ims_pcu *pcu, u32 data) +{ + struct ims_pcu_gamepad *gamepad = pcu->gamepad; + struct input_dev *input = gamepad->input; + int x, y; + + x = !!(data & (1 << 14)) - !!(data & (1 << 13)); + y = !!(data & (1 << 12)) - !!(data & (1 << 11)); + + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + + input_report_key(input, BTN_A, data & (1 << 7)); + input_report_key(input, BTN_B, data & (1 << 8)); + input_report_key(input, BTN_X, data & (1 << 9)); + input_report_key(input, BTN_Y, data & (1 << 10)); + input_report_key(input, BTN_START, data & (1 << 15)); + input_report_key(input, BTN_SELECT, data & (1 << 16)); + + input_sync(input); +} + +static int ims_pcu_setup_gamepad(struct ims_pcu *pcu) +{ + struct ims_pcu_gamepad *gamepad; + struct input_dev *input; + int error; + + gamepad = kzalloc(sizeof(struct ims_pcu_gamepad), GFP_KERNEL); + input = input_allocate_device(); + if (!gamepad || !input) { + dev_err(pcu->dev, + "Not enough memory for gamepad device\n"); + error = -ENOMEM; + goto err_free_mem; + } + + gamepad->input = input; + + snprintf(gamepad->name, sizeof(gamepad->name), + "IMS PCU#%d Gamepad Interface", pcu->device_no); + + usb_make_path(pcu->udev, gamepad->phys, sizeof(gamepad->phys)); + strlcat(gamepad->phys, "/input1", sizeof(gamepad->phys)); + + input->name = gamepad->name; + input->phys = gamepad->phys; + usb_to_input_id(pcu->udev, &input->id); + input->dev.parent = &pcu->ctrl_intf->dev; + + __set_bit(EV_KEY, input->evbit); + __set_bit(BTN_A, input->keybit); + __set_bit(BTN_B, input->keybit); + __set_bit(BTN_X, input->keybit); + __set_bit(BTN_Y, input->keybit); + __set_bit(BTN_START, input->keybit); + __set_bit(BTN_SELECT, input->keybit); + + __set_bit(EV_ABS, input->evbit); + input_set_abs_params(input, ABS_X, -1, 1, 0, 0); + input_set_abs_params(input, ABS_Y, -1, 1, 0, 0); + + error = input_register_device(input); + if (error) { + dev_err(pcu->dev, + "Failed to register gamepad input device: %d\n", + error); + goto err_free_mem; + } + + pcu->gamepad = gamepad; + return 0; + +err_free_mem: + input_free_device(input); + kfree(gamepad); + return -ENOMEM; +} + +static void ims_pcu_destroy_gamepad(struct ims_pcu *pcu) +{ + struct ims_pcu_gamepad *gamepad = pcu->gamepad; + + input_unregister_device(gamepad->input); + kfree(gamepad); +} + + +/********************************************************************* + * PCU Communication protocol handling * + *********************************************************************/ + +#define IMS_PCU_PROTOCOL_STX 0x02 +#define IMS_PCU_PROTOCOL_ETX 0x03 +#define IMS_PCU_PROTOCOL_DLE 0x10 + +/* PCU commands */ +#define IMS_PCU_CMD_STATUS 0xa0 +#define IMS_PCU_CMD_PCU_RESET 0xa1 +#define IMS_PCU_CMD_RESET_REASON 0xa2 +#define IMS_PCU_CMD_SEND_BUTTONS 0xa3 +#define IMS_PCU_CMD_JUMP_TO_BTLDR 0xa4 +#define IMS_PCU_CMD_GET_INFO 0xa5 +#define IMS_PCU_CMD_SET_BRIGHTNESS 0xa6 +#define IMS_PCU_CMD_EEPROM 0xa7 +#define IMS_PCU_CMD_GET_FW_VERSION 0xa8 +#define IMS_PCU_CMD_GET_BL_VERSION 0xa9 +#define IMS_PCU_CMD_SET_INFO 0xab +#define IMS_PCU_CMD_GET_BRIGHTNESS 0xac +#define IMS_PCU_CMD_GET_DEVICE_ID 0xae +#define IMS_PCU_CMD_SPECIAL_INFO 0xb0 +#define IMS_PCU_CMD_BOOTLOADER 0xb1 /* Pass data to bootloader */ + +/* PCU responses */ +#define IMS_PCU_RSP_STATUS 0xc0 +#define IMS_PCU_RSP_PCU_RESET 0 /* Originally 0xc1 */ +#define IMS_PCU_RSP_RESET_REASON 0xc2 +#define IMS_PCU_RSP_SEND_BUTTONS 0xc3 +#define IMS_PCU_RSP_JUMP_TO_BTLDR 0 /* Originally 0xc4 */ +#define IMS_PCU_RSP_GET_INFO 0xc5 +#define IMS_PCU_RSP_SET_BRIGHTNESS 0xc6 +#define IMS_PCU_RSP_EEPROM 0xc7 +#define IMS_PCU_RSP_GET_FW_VERSION 0xc8 +#define IMS_PCU_RSP_GET_BL_VERSION 0xc9 +#define IMS_PCU_RSP_SET_INFO 0xcb +#define IMS_PCU_RSP_GET_BRIGHTNESS 0xcc +#define IMS_PCU_RSP_CMD_INVALID 0xcd +#define IMS_PCU_RSP_GET_DEVICE_ID 0xce +#define IMS_PCU_RSP_SPECIAL_INFO 0xd0 +#define IMS_PCU_RSP_BOOTLOADER 0xd1 /* Bootloader response */ + +#define IMS_PCU_RSP_EVNT_BUTTONS 0xe0 /* Unsolicited, button state */ +#define IMS_PCU_GAMEPAD_MASK 0x0001ff80UL /* Bits 7 through 16 */ + + +#define IMS_PCU_MIN_PACKET_LEN 3 +#define IMS_PCU_DATA_OFFSET 2 + +#define IMS_PCU_CMD_WRITE_TIMEOUT 100 /* msec */ +#define IMS_PCU_CMD_RESPONSE_TIMEOUT 500 /* msec */ + +static void ims_pcu_report_events(struct ims_pcu *pcu) +{ + u32 data = get_unaligned_be32(&pcu->read_buf[3]); + + ims_pcu_buttons_report(pcu, data & ~IMS_PCU_GAMEPAD_MASK); + if (pcu->gamepad) + ims_pcu_gamepad_report(pcu, data); +} + +static void ims_pcu_handle_response(struct ims_pcu *pcu) +{ + switch (pcu->read_buf[0]) { + case IMS_PCU_RSP_EVNT_BUTTONS: + if (likely(pcu->setup_complete)) + ims_pcu_report_events(pcu); + break; + + default: + /* + * See if we got command completion. + * If both the sequence and response code match save + * the data and signal completion. + */ + if (pcu->read_buf[0] == pcu->expected_response && + pcu->read_buf[1] == pcu->ack_id - 1) { + + memcpy(pcu->cmd_buf, pcu->read_buf, pcu->read_pos); + pcu->cmd_buf_len = pcu->read_pos; + complete(&pcu->cmd_done); + } + break; + } +} + +static void ims_pcu_process_data(struct ims_pcu *pcu, struct urb *urb) +{ + int i; + + for (i = 0; i < urb->actual_length; i++) { + u8 data = pcu->urb_in_buf[i]; + + /* Skip everything until we get Start Xmit */ + if (!pcu->have_stx && data != IMS_PCU_PROTOCOL_STX) + continue; + + if (pcu->have_dle) { + pcu->have_dle = false; + pcu->read_buf[pcu->read_pos++] = data; + pcu->check_sum += data; + continue; + } + + switch (data) { + case IMS_PCU_PROTOCOL_STX: + if (pcu->have_stx) + dev_warn(pcu->dev, + "Unexpected STX at byte %d, discarding old data\n", + pcu->read_pos); + pcu->have_stx = true; + pcu->have_dle = false; + pcu->read_pos = 0; + pcu->check_sum = 0; + break; + + case IMS_PCU_PROTOCOL_DLE: + pcu->have_dle = true; + break; + + case IMS_PCU_PROTOCOL_ETX: + if (pcu->read_pos < IMS_PCU_MIN_PACKET_LEN) { + dev_warn(pcu->dev, + "Short packet received (%d bytes), ignoring\n", + pcu->read_pos); + } else if (pcu->check_sum != 0) { + dev_warn(pcu->dev, + "Invalid checksum in packet (%d bytes), ignoring\n", + pcu->read_pos); + } else { + ims_pcu_handle_response(pcu); + } + + pcu->have_stx = false; + pcu->have_dle = false; + pcu->read_pos = 0; + break; + + default: + pcu->read_buf[pcu->read_pos++] = data; + pcu->check_sum += data; + break; + } + } +} + +static bool ims_pcu_byte_needs_escape(u8 byte) +{ + return byte == IMS_PCU_PROTOCOL_STX || + byte == IMS_PCU_PROTOCOL_ETX || + byte == IMS_PCU_PROTOCOL_DLE; +} + +static int ims_pcu_send_cmd_chunk(struct ims_pcu *pcu, + u8 command, int chunk, int len) +{ + int error; + + error = usb_bulk_msg(pcu->udev, + usb_sndbulkpipe(pcu->udev, + pcu->ep_out->bEndpointAddress), + pcu->urb_out_buf, len, + NULL, IMS_PCU_CMD_WRITE_TIMEOUT); + if (error < 0) { + dev_dbg(pcu->dev, + "Sending 0x%02x command failed at chunk %d: %d\n", + command, chunk, error); + return error; + } + + return 0; +} + +static int ims_pcu_send_command(struct ims_pcu *pcu, + u8 command, const u8 *data, int len) +{ + int count = 0; + int chunk = 0; + int delta; + int i; + int error; + u8 csum = 0; + u8 ack_id; + + pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_STX; + + /* We know the command need not be escaped */ + pcu->urb_out_buf[count++] = command; + csum += command; + + ack_id = pcu->ack_id++; + if (ack_id == 0xff) + ack_id = pcu->ack_id++; + + if (ims_pcu_byte_needs_escape(ack_id)) + pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; + + pcu->urb_out_buf[count++] = ack_id; + csum += ack_id; + + for (i = 0; i < len; i++) { + + delta = ims_pcu_byte_needs_escape(data[i]) ? 2 : 1; + if (count + delta >= pcu->max_out_size) { + error = ims_pcu_send_cmd_chunk(pcu, command, + ++chunk, count); + if (error) + return error; + + count = 0; + } + + if (delta == 2) + pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; + + pcu->urb_out_buf[count++] = data[i]; + csum += data[i]; + } + + csum = 1 + ~csum; + + delta = ims_pcu_byte_needs_escape(csum) ? 3 : 2; + if (count + delta >= pcu->max_out_size) { + error = ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); + if (error) + return error; + + count = 0; + } + + if (delta == 3) + pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_DLE; + + pcu->urb_out_buf[count++] = csum; + pcu->urb_out_buf[count++] = IMS_PCU_PROTOCOL_ETX; + + return ims_pcu_send_cmd_chunk(pcu, command, ++chunk, count); +} + +static int __ims_pcu_execute_command(struct ims_pcu *pcu, + u8 command, const void *data, size_t len, + u8 expected_response, int response_time) +{ + int error; + + pcu->expected_response = expected_response; + init_completion(&pcu->cmd_done); + + error = ims_pcu_send_command(pcu, command, data, len); + if (error) + return error; + + if (expected_response && + !wait_for_completion_timeout(&pcu->cmd_done, + msecs_to_jiffies(response_time))) { + dev_dbg(pcu->dev, "Command 0x%02x timed out\n", command); + return -ETIMEDOUT; + } + + return 0; +} + +#define ims_pcu_execute_command(pcu, code, data, len) \ + __ims_pcu_execute_command(pcu, \ + IMS_PCU_CMD_##code, data, len, \ + IMS_PCU_RSP_##code, \ + IMS_PCU_CMD_RESPONSE_TIMEOUT) + +#define ims_pcu_execute_query(pcu, code) \ + ims_pcu_execute_command(pcu, code, NULL, 0) + +/* Bootloader commands */ +#define IMS_PCU_BL_CMD_QUERY_DEVICE 0xa1 +#define IMS_PCU_BL_CMD_UNLOCK_CONFIG 0xa2 +#define IMS_PCU_BL_CMD_ERASE_APP 0xa3 +#define IMS_PCU_BL_CMD_PROGRAM_DEVICE 0xa4 +#define IMS_PCU_BL_CMD_PROGRAM_COMPLETE 0xa5 +#define IMS_PCU_BL_CMD_READ_APP 0xa6 +#define IMS_PCU_BL_CMD_RESET_DEVICE 0xa7 +#define IMS_PCU_BL_CMD_LAUNCH_APP 0xa8 + +/* Bootloader commands */ +#define IMS_PCU_BL_RSP_QUERY_DEVICE 0xc1 +#define IMS_PCU_BL_RSP_UNLOCK_CONFIG 0xc2 +#define IMS_PCU_BL_RSP_ERASE_APP 0xc3 +#define IMS_PCU_BL_RSP_PROGRAM_DEVICE 0xc4 +#define IMS_PCU_BL_RSP_PROGRAM_COMPLETE 0xc5 +#define IMS_PCU_BL_RSP_READ_APP 0xc6 +#define IMS_PCU_BL_RSP_RESET_DEVICE 0 /* originally 0xa7 */ +#define IMS_PCU_BL_RSP_LAUNCH_APP 0 /* originally 0xa8 */ + +#define IMS_PCU_BL_DATA_OFFSET 3 + +static int __ims_pcu_execute_bl_command(struct ims_pcu *pcu, + u8 command, const void *data, size_t len, + u8 expected_response, int response_time) +{ + int error; + + pcu->cmd_buf[0] = command; + if (data) + memcpy(&pcu->cmd_buf[1], data, len); + + error = __ims_pcu_execute_command(pcu, + IMS_PCU_CMD_BOOTLOADER, pcu->cmd_buf, len + 1, + expected_response ? IMS_PCU_RSP_BOOTLOADER : 0, + response_time); + if (error) { + dev_err(pcu->dev, + "Failure when sending 0x%02x command to bootloader, error: %d\n", + pcu->cmd_buf[0], error); + return error; + } + + if (expected_response && pcu->cmd_buf[2] != expected_response) { + dev_err(pcu->dev, + "Unexpected response from bootloader: 0x%02x, wanted 0x%02x\n", + pcu->cmd_buf[2], expected_response); + return -EINVAL; + } + + return 0; +} + +#define ims_pcu_execute_bl_command(pcu, code, data, len, timeout) \ + __ims_pcu_execute_bl_command(pcu, \ + IMS_PCU_BL_CMD_##code, data, len, \ + IMS_PCU_BL_RSP_##code, timeout) \ + +#define IMS_PCU_INFO_PART_OFFSET 2 +#define IMS_PCU_INFO_DOM_OFFSET 17 +#define IMS_PCU_INFO_SERIAL_OFFSET 25 + +#define IMS_PCU_SET_INFO_SIZE 31 + +static int ims_pcu_get_info(struct ims_pcu *pcu) +{ + int error; + + error = ims_pcu_execute_query(pcu, GET_INFO); + if (error) { + dev_err(pcu->dev, + "GET_INFO command failed, error: %d\n", error); + return error; + } + + memcpy(pcu->part_number, + &pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], + sizeof(pcu->part_number)); + memcpy(pcu->date_of_manufacturing, + &pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], + sizeof(pcu->date_of_manufacturing)); + memcpy(pcu->serial_number, + &pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], + sizeof(pcu->serial_number)); + + return 0; +} + +static int ims_pcu_set_info(struct ims_pcu *pcu) +{ + int error; + + memcpy(&pcu->cmd_buf[IMS_PCU_INFO_PART_OFFSET], + pcu->part_number, sizeof(pcu->part_number)); + memcpy(&pcu->cmd_buf[IMS_PCU_INFO_DOM_OFFSET], + pcu->date_of_manufacturing, sizeof(pcu->date_of_manufacturing)); + memcpy(&pcu->cmd_buf[IMS_PCU_INFO_SERIAL_OFFSET], + pcu->serial_number, sizeof(pcu->serial_number)); + + error = ims_pcu_execute_command(pcu, SET_INFO, + &pcu->cmd_buf[IMS_PCU_DATA_OFFSET], + IMS_PCU_SET_INFO_SIZE); + if (error) { + dev_err(pcu->dev, + "Failed to update device information, error: %d\n", + error); + return error; + } + + return 0; +} + +static int ims_pcu_switch_to_bootloader(struct ims_pcu *pcu) +{ + int error; + + /* Execute jump to the bootoloader */ + error = ims_pcu_execute_command(pcu, JUMP_TO_BTLDR, NULL, 0); + if (error) { + dev_err(pcu->dev, + "Failure when sending JUMP TO BOOLTLOADER command, error: %d\n", + error); + return error; + } + + return 0; +} + +/********************************************************************* + * Firmware Update handling * + *********************************************************************/ + +#define IMS_PCU_FIRMWARE_NAME "imspcu.fw" + +struct ims_pcu_flash_fmt { + __le32 addr; + u8 len; + u8 data[]; +}; + +static unsigned int ims_pcu_count_fw_records(const struct firmware *fw) +{ + const struct ihex_binrec *rec = (const struct ihex_binrec *)fw->data; + unsigned int count = 0; + + while (rec) { + count++; + rec = ihex_next_binrec(rec); + } + + return count; +} + +static int ims_pcu_verify_block(struct ims_pcu *pcu, + u32 addr, u8 len, const u8 *data) +{ + struct ims_pcu_flash_fmt *fragment; + int error; + + fragment = (void *)&pcu->cmd_buf[1]; + put_unaligned_le32(addr, &fragment->addr); + fragment->len = len; + + error = ims_pcu_execute_bl_command(pcu, READ_APP, NULL, 5, + IMS_PCU_CMD_RESPONSE_TIMEOUT); + if (error) { + dev_err(pcu->dev, + "Failed to retrieve block at 0x%08x, len %d, error: %d\n", + addr, len, error); + return error; + } + + fragment = (void *)&pcu->cmd_buf[IMS_PCU_BL_DATA_OFFSET]; + if (get_unaligned_le32(&fragment->addr) != addr || + fragment->len != len) { + dev_err(pcu->dev, + "Wrong block when retrieving 0x%08x (0x%08x), len %d (%d)\n", + addr, get_unaligned_le32(&fragment->addr), + len, fragment->len); + return -EINVAL; + } + + if (memcmp(fragment->data, data, len)) { + dev_err(pcu->dev, + "Mismatch in block at 0x%08x, len %d\n", + addr, len); + return -EINVAL; + } + + return 0; +} + +static int ims_pcu_flash_firmware(struct ims_pcu *pcu, + const struct firmware *fw, + unsigned int n_fw_records) +{ + const struct ihex_binrec *rec = (const struct ihex_binrec *)fw->data; + struct ims_pcu_flash_fmt *fragment; + unsigned int count = 0; + u32 addr; + u8 len; + int error; + + error = ims_pcu_execute_bl_command(pcu, ERASE_APP, NULL, 0, 2000); + if (error) { + dev_err(pcu->dev, + "Failed to erase application image, error: %d\n", + error); + return error; + } + + while (rec) { + /* + * The firmware format is messed up for some reason. + * The address twice that of what is needed for some + * reason and we end up overwriting half of the data + * with the next record. + */ + addr = be32_to_cpu(rec->addr) / 2; + len = be16_to_cpu(rec->len); + + fragment = (void *)&pcu->cmd_buf[1]; + put_unaligned_le32(addr, &fragment->addr); + fragment->len = len; + memcpy(fragment->data, rec->data, len); + + error = ims_pcu_execute_bl_command(pcu, PROGRAM_DEVICE, + NULL, len + 5, + IMS_PCU_CMD_RESPONSE_TIMEOUT); + if (error) { + dev_err(pcu->dev, + "Failed to write block at 0x%08x, len %d, error: %d\n", + addr, len, error); + return error; + } + + if (addr >= pcu->fw_start_addr && addr < pcu->fw_end_addr) { + error = ims_pcu_verify_block(pcu, addr, len, rec->data); + if (error) + return error; + } + + count++; + pcu->update_firmware_status = (count * 100) / n_fw_records; + + rec = ihex_next_binrec(rec); + } + + error = ims_pcu_execute_bl_command(pcu, PROGRAM_COMPLETE, + NULL, 0, 2000); + if (error) + dev_err(pcu->dev, + "Failed to send PROGRAM_COMPLETE, error: %d\n", + error); + + return 0; +} + +static int ims_pcu_handle_firmware_update(struct ims_pcu *pcu, + const struct firmware *fw) +{ + unsigned int n_fw_records; + int retval; + + dev_info(pcu->dev, "Updating firmware %s, size: %zu\n", + IMS_PCU_FIRMWARE_NAME, fw->size); + + n_fw_records = ims_pcu_count_fw_records(fw); + + retval = ims_pcu_flash_firmware(pcu, fw, n_fw_records); + if (retval) + goto out; + + retval = ims_pcu_execute_bl_command(pcu, LAUNCH_APP, NULL, 0, 0); + if (retval) + dev_err(pcu->dev, + "Failed to start application image, error: %d\n", + retval); + +out: + pcu->update_firmware_status = retval; + sysfs_notify(&pcu->dev->kobj, NULL, "update_firmware_status"); + return retval; +} + +static void ims_pcu_process_async_firmware(const struct firmware *fw, + void *context) +{ + struct ims_pcu *pcu = context; + int error; + + if (!fw) { + dev_err(pcu->dev, "Failed to get firmware %s\n", + IMS_PCU_FIRMWARE_NAME); + goto out; + } + + error = ihex_validate_fw(fw); + if (error) { + dev_err(pcu->dev, "Firmware %s is invalid\n", + IMS_PCU_FIRMWARE_NAME); + goto out; + } + + mutex_lock(&pcu->cmd_mutex); + ims_pcu_handle_firmware_update(pcu, fw); + mutex_unlock(&pcu->cmd_mutex); + + release_firmware(fw); + +out: + complete(&pcu->async_firmware_done); +} + +/********************************************************************* + * Backlight LED device support * + *********************************************************************/ + +#define IMS_PCU_MAX_BRIGHTNESS 31998 + +static void ims_pcu_backlight_work(struct work_struct *work) +{ + struct ims_pcu_backlight *backlight = + container_of(work, struct ims_pcu_backlight, work); + struct ims_pcu *pcu = + container_of(backlight, struct ims_pcu, backlight); + int desired_brightness = backlight->desired_brightness; + __le16 br_val = cpu_to_le16(desired_brightness); + int error; + + mutex_lock(&pcu->cmd_mutex); + + error = ims_pcu_execute_command(pcu, SET_BRIGHTNESS, + &br_val, sizeof(br_val)); + if (error && error != -ENODEV) + dev_warn(pcu->dev, + "Failed to set desired brightness %u, error: %d\n", + desired_brightness, error); + + mutex_unlock(&pcu->cmd_mutex); +} + +static void ims_pcu_backlight_set_brightness(struct led_classdev *cdev, + enum led_brightness value) +{ + struct ims_pcu_backlight *backlight = + container_of(cdev, struct ims_pcu_backlight, cdev); + + backlight->desired_brightness = value; + schedule_work(&backlight->work); +} + +static enum led_brightness +ims_pcu_backlight_get_brightness(struct led_classdev *cdev) +{ + struct ims_pcu_backlight *backlight = + container_of(cdev, struct ims_pcu_backlight, cdev); + struct ims_pcu *pcu = + container_of(backlight, struct ims_pcu, backlight); + int brightness; + int error; + + mutex_lock(&pcu->cmd_mutex); + + error = ims_pcu_execute_query(pcu, GET_BRIGHTNESS); + if (error) { + dev_warn(pcu->dev, + "Failed to get current brightness, error: %d\n", + error); + /* Assume the LED is OFF */ + brightness = LED_OFF; + } else { + brightness = + get_unaligned_le16(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); + } + + mutex_unlock(&pcu->cmd_mutex); + + return brightness; +} + +static int ims_pcu_setup_backlight(struct ims_pcu *pcu) +{ + struct ims_pcu_backlight *backlight = &pcu->backlight; + int error; + + INIT_WORK(&backlight->work, ims_pcu_backlight_work); + snprintf(backlight->name, sizeof(backlight->name), + "pcu%d::kbd_backlight", pcu->device_no); + + backlight->cdev.name = backlight->name; + backlight->cdev.max_brightness = IMS_PCU_MAX_BRIGHTNESS; + backlight->cdev.brightness_get = ims_pcu_backlight_get_brightness; + backlight->cdev.brightness_set = ims_pcu_backlight_set_brightness; + + error = led_classdev_register(pcu->dev, &backlight->cdev); + if (error) { + dev_err(pcu->dev, + "Failed to register backlight LED device, error: %d\n", + error); + return error; + } + + return 0; +} + +static void ims_pcu_destroy_backlight(struct ims_pcu *pcu) +{ + struct ims_pcu_backlight *backlight = &pcu->backlight; + + led_classdev_unregister(&backlight->cdev); + cancel_work_sync(&backlight->work); +} + + +/********************************************************************* + * Sysfs attributes handling * + *********************************************************************/ + +struct ims_pcu_attribute { + struct device_attribute dattr; + size_t field_offset; + int field_length; +}; + +static ssize_t ims_pcu_attribute_show(struct device *dev, + struct device_attribute *dattr, + char *buf) +{ + struct usb_interface *intf = to_usb_interface(dev); + struct ims_pcu *pcu = usb_get_intfdata(intf); + struct ims_pcu_attribute *attr = + container_of(dattr, struct ims_pcu_attribute, dattr); + char *field = (char *)pcu + attr->field_offset; + + return scnprintf(buf, PAGE_SIZE, "%.*s\n", attr->field_length, field); +} + +static ssize_t ims_pcu_attribute_store(struct device *dev, + struct device_attribute *dattr, + const char *buf, size_t count) +{ + + struct usb_interface *intf = to_usb_interface(dev); + struct ims_pcu *pcu = usb_get_intfdata(intf); + struct ims_pcu_attribute *attr = + container_of(dattr, struct ims_pcu_attribute, dattr); + char *field = (char *)pcu + attr->field_offset; + size_t data_len; + int error; + + if (count > attr->field_length) + return -EINVAL; + + data_len = strnlen(buf, attr->field_length); + if (data_len > attr->field_length) + return -EINVAL; + + error = mutex_lock_interruptible(&pcu->cmd_mutex); + if (error) + return error; + + memset(field, 0, attr->field_length); + memcpy(field, buf, data_len); + + error = ims_pcu_set_info(pcu); + + /* + * Even if update failed, let's fetch the info again as we just + * clobbered one of the fields. + */ + ims_pcu_get_info(pcu); + + mutex_unlock(&pcu->cmd_mutex); + + return error < 0 ? error : count; +} + +#define IMS_PCU_ATTR(_field, _mode) \ +struct ims_pcu_attribute ims_pcu_attr_##_field = { \ + .dattr = __ATTR(_field, _mode, \ + ims_pcu_attribute_show, \ + ims_pcu_attribute_store), \ + .field_offset = offsetof(struct ims_pcu, _field), \ + .field_length = sizeof(((struct ims_pcu *)NULL)->_field), \ +} + +#define IMS_PCU_RO_ATTR(_field) \ + IMS_PCU_ATTR(_field, S_IRUGO) +#define IMS_PCU_RW_ATTR(_field) \ + IMS_PCU_ATTR(_field, S_IRUGO | S_IWUSR) + +static IMS_PCU_RW_ATTR(part_number); +static IMS_PCU_RW_ATTR(serial_number); +static IMS_PCU_RW_ATTR(date_of_manufacturing); + +static IMS_PCU_RO_ATTR(fw_version); +static IMS_PCU_RO_ATTR(bl_version); +static IMS_PCU_RO_ATTR(reset_reason); + +static ssize_t ims_pcu_reset_device(struct device *dev, + struct device_attribute *dattr, + const char *buf, size_t count) +{ + static const u8 reset_byte = 1; + struct usb_interface *intf = to_usb_interface(dev); + struct ims_pcu *pcu = usb_get_intfdata(intf); + int value; + int error; + + error = kstrtoint(buf, 0, &value); + if (error) + return error; + + if (value != 1) + return -EINVAL; + + dev_info(pcu->dev, "Attempting to reset device\n"); + + error = ims_pcu_execute_command(pcu, PCU_RESET, &reset_byte, 1); + if (error) { + dev_info(pcu->dev, + "Failed to reset device, error: %d\n", + error); + return error; + } + + return count; +} + +static DEVICE_ATTR(reset_device, S_IWUSR, NULL, ims_pcu_reset_device); + +static ssize_t ims_pcu_update_firmware_store(struct device *dev, + struct device_attribute *dattr, + const char *buf, size_t count) +{ + struct usb_interface *intf = to_usb_interface(dev); + struct ims_pcu *pcu = usb_get_intfdata(intf); + const struct firmware *fw = NULL; + int value; + int error; + + error = kstrtoint(buf, 0, &value); + if (error) + return error; + + if (value != 1) + return -EINVAL; + + error = mutex_lock_interruptible(&pcu->cmd_mutex); + if (error) + return error; + + error = request_ihex_firmware(&fw, IMS_PCU_FIRMWARE_NAME, pcu->dev); + if (error) { + dev_err(pcu->dev, "Failed to request firmware %s, error: %d\n", + IMS_PCU_FIRMWARE_NAME, error); + goto out; + } + + /* + * If we are already in bootloader mode we can proceed with + * flashing the firmware. + * + * If we are in application mode, then we need to switch into + * bootloader mode, which will cause the device to disconnect + * and reconnect as different device. + */ + if (pcu->bootloader_mode) + error = ims_pcu_handle_firmware_update(pcu, fw); + else + error = ims_pcu_switch_to_bootloader(pcu); + + release_firmware(fw); + +out: + mutex_unlock(&pcu->cmd_mutex); + return error ?: count; +} + +static DEVICE_ATTR(update_firmware, S_IWUSR, + NULL, ims_pcu_update_firmware_store); + +static ssize_t +ims_pcu_update_firmware_status_show(struct device *dev, + struct device_attribute *dattr, + char *buf) +{ + struct usb_interface *intf = to_usb_interface(dev); + struct ims_pcu *pcu = usb_get_intfdata(intf); + + return scnprintf(buf, PAGE_SIZE, "%d\n", pcu->update_firmware_status); +} + +static DEVICE_ATTR(update_firmware_status, S_IRUGO, + ims_pcu_update_firmware_status_show, NULL); + +static struct attribute *ims_pcu_attrs[] = { + &ims_pcu_attr_part_number.dattr.attr, + &ims_pcu_attr_serial_number.dattr.attr, + &ims_pcu_attr_date_of_manufacturing.dattr.attr, + &ims_pcu_attr_fw_version.dattr.attr, + &ims_pcu_attr_bl_version.dattr.attr, + &ims_pcu_attr_reset_reason.dattr.attr, + &dev_attr_reset_device.attr, + &dev_attr_update_firmware.attr, + &dev_attr_update_firmware_status.attr, + NULL +}; + +static umode_t ims_pcu_is_attr_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct usb_interface *intf = to_usb_interface(dev); + struct ims_pcu *pcu = usb_get_intfdata(intf); + umode_t mode = attr->mode; + + if (pcu->bootloader_mode) { + if (attr != &dev_attr_update_firmware_status.attr && + attr != &dev_attr_update_firmware.attr && + attr != &dev_attr_reset_device.attr) { + mode = 0; + } + } else { + if (attr == &dev_attr_update_firmware_status.attr) + mode = 0; + } + + return mode; +} + +static struct attribute_group ims_pcu_attr_group = { + .is_visible = ims_pcu_is_attr_visible, + .attrs = ims_pcu_attrs, +}; + +static void ims_pcu_irq(struct urb *urb) +{ + struct ims_pcu *pcu = urb->context; + int retval, status; + + status = urb->status; + + switch (status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(pcu->dev, "%s - urb shutting down with status: %d\n", + __func__, status); + return; + default: + dev_dbg(pcu->dev, "%s - nonzero urb status received: %d\n", + __func__, status); + goto exit; + } + + dev_dbg(pcu->dev, "%s: received %d: %*ph\n", __func__, + urb->actual_length, urb->actual_length, pcu->urb_in_buf); + + if (urb == pcu->urb_in) + ims_pcu_process_data(pcu, urb); + +exit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval && retval != -ENODEV) + dev_err(pcu->dev, "%s - usb_submit_urb failed with result %d\n", + __func__, retval); +} + +static int ims_pcu_buffers_alloc(struct ims_pcu *pcu) +{ + int error; + + pcu->urb_in_buf = usb_alloc_coherent(pcu->udev, pcu->max_in_size, + GFP_KERNEL, &pcu->read_dma); + if (!pcu->urb_in_buf) { + dev_err(pcu->dev, + "Failed to allocate memory for read buffer\n"); + return -ENOMEM; + } + + pcu->urb_in = usb_alloc_urb(0, GFP_KERNEL); + if (!pcu->urb_in) { + dev_err(pcu->dev, "Failed to allocate input URB\n"); + error = -ENOMEM; + goto err_free_urb_in_buf; + } + + pcu->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + pcu->urb_in->transfer_dma = pcu->read_dma; + + usb_fill_bulk_urb(pcu->urb_in, pcu->udev, + usb_rcvbulkpipe(pcu->udev, + pcu->ep_in->bEndpointAddress), + pcu->urb_in_buf, pcu->max_in_size, + ims_pcu_irq, pcu); + + /* + * We are using usb_bulk_msg() for sending so there is no point + * in allocating memory with usb_alloc_coherent(). + */ + pcu->urb_out_buf = kmalloc(pcu->max_out_size, GFP_KERNEL); + if (!pcu->urb_out_buf) { + dev_err(pcu->dev, "Failed to allocate memory for write buffer\n"); + error = -ENOMEM; + goto err_free_in_urb; + } + + pcu->urb_ctrl_buf = usb_alloc_coherent(pcu->udev, pcu->max_ctrl_size, + GFP_KERNEL, &pcu->ctrl_dma); + if (!pcu->urb_ctrl_buf) { + dev_err(pcu->dev, + "Failed to allocate memory for read buffer\n"); + goto err_free_urb_out_buf; + } + + pcu->urb_ctrl = usb_alloc_urb(0, GFP_KERNEL); + if (!pcu->urb_ctrl) { + dev_err(pcu->dev, "Failed to allocate input URB\n"); + error = -ENOMEM; + goto err_free_urb_ctrl_buf; + } + + pcu->urb_ctrl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + pcu->urb_ctrl->transfer_dma = pcu->ctrl_dma; + + usb_fill_int_urb(pcu->urb_ctrl, pcu->udev, + usb_rcvintpipe(pcu->udev, + pcu->ep_ctrl->bEndpointAddress), + pcu->urb_ctrl_buf, pcu->max_ctrl_size, + ims_pcu_irq, pcu, pcu->ep_ctrl->bInterval); + + return 0; + +err_free_urb_ctrl_buf: + usb_free_coherent(pcu->udev, pcu->max_ctrl_size, + pcu->urb_ctrl_buf, pcu->ctrl_dma); +err_free_urb_out_buf: + kfree(pcu->urb_out_buf); +err_free_in_urb: + usb_free_urb(pcu->urb_in); +err_free_urb_in_buf: + usb_free_coherent(pcu->udev, pcu->max_in_size, + pcu->urb_in_buf, pcu->read_dma); + return error; +} + +static void ims_pcu_buffers_free(struct ims_pcu *pcu) +{ + usb_kill_urb(pcu->urb_in); + usb_free_urb(pcu->urb_in); + + usb_free_coherent(pcu->udev, pcu->max_out_size, + pcu->urb_in_buf, pcu->read_dma); + + kfree(pcu->urb_out_buf); + + usb_kill_urb(pcu->urb_ctrl); + usb_free_urb(pcu->urb_ctrl); + + usb_free_coherent(pcu->udev, pcu->max_ctrl_size, + pcu->urb_ctrl_buf, pcu->ctrl_dma); +} + +static const struct usb_cdc_union_desc * +ims_pcu_get_cdc_union_desc(struct usb_interface *intf) +{ + const void *buf = intf->altsetting->extra; + size_t buflen = intf->altsetting->extralen; + struct usb_cdc_union_desc *union_desc; + + if (!buf) { + dev_err(&intf->dev, "Missing descriptor data\n"); + return NULL; + } + + if (!buflen) { + dev_err(&intf->dev, "Zero length descriptor\n"); + return NULL; + } + + while (buflen > 0) { + union_desc = (struct usb_cdc_union_desc *)buf; + + if (union_desc->bDescriptorType == USB_DT_CS_INTERFACE && + union_desc->bDescriptorSubType == USB_CDC_UNION_TYPE) { + dev_dbg(&intf->dev, "Found union header\n"); + return union_desc; + } + + buflen -= union_desc->bLength; + buf += union_desc->bLength; + } + + dev_err(&intf->dev, "Missing CDC union descriptor\n"); + return NULL; +} + +static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pcu) +{ + const struct usb_cdc_union_desc *union_desc; + struct usb_host_interface *alt; + + union_desc = ims_pcu_get_cdc_union_desc(intf); + if (!union_desc) + return -EINVAL; + + pcu->ctrl_intf = usb_ifnum_to_if(pcu->udev, + union_desc->bMasterInterface0); + + alt = pcu->ctrl_intf->cur_altsetting; + pcu->ep_ctrl = &alt->endpoint[0].desc; + pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl); + + pcu->data_intf = usb_ifnum_to_if(pcu->udev, + union_desc->bSlaveInterface0); + + alt = pcu->data_intf->cur_altsetting; + if (alt->desc.bNumEndpoints != 2) { + dev_err(pcu->dev, + "Incorrect number of endpoints on data interface (%d)\n", + alt->desc.bNumEndpoints); + return -EINVAL; + } + + pcu->ep_out = &alt->endpoint[0].desc; + if (!usb_endpoint_is_bulk_out(pcu->ep_out)) { + dev_err(pcu->dev, + "First endpoint on data interface is not BULK OUT\n"); + return -EINVAL; + } + + pcu->max_out_size = usb_endpoint_maxp(pcu->ep_out); + if (pcu->max_out_size < 8) { + dev_err(pcu->dev, + "Max OUT packet size is too small (%zd)\n", + pcu->max_out_size); + return -EINVAL; + } + + pcu->ep_in = &alt->endpoint[1].desc; + if (!usb_endpoint_is_bulk_in(pcu->ep_in)) { + dev_err(pcu->dev, + "Second endpoint on data interface is not BULK IN\n"); + return -EINVAL; + } + + pcu->max_in_size = usb_endpoint_maxp(pcu->ep_in); + if (pcu->max_in_size < 8) { + dev_err(pcu->dev, + "Max IN packet size is too small (%zd)\n", + pcu->max_in_size); + return -EINVAL; + } + + return 0; +} + +static int ims_pcu_start_io(struct ims_pcu *pcu) +{ + int error; + + error = usb_submit_urb(pcu->urb_ctrl, GFP_KERNEL); + if (error) { + dev_err(pcu->dev, + "Failed to start control IO - usb_submit_urb failed with result: %d\n", + error); + return -EIO; + } + + error = usb_submit_urb(pcu->urb_in, GFP_KERNEL); + if (error) { + dev_err(pcu->dev, + "Failed to start IO - usb_submit_urb failed with result: %d\n", + error); + usb_kill_urb(pcu->urb_ctrl); + return -EIO; + } + + return 0; +} + +static void ims_pcu_stop_io(struct ims_pcu *pcu) +{ + usb_kill_urb(pcu->urb_in); + usb_kill_urb(pcu->urb_ctrl); +} + +static int ims_pcu_line_setup(struct ims_pcu *pcu) +{ + struct usb_host_interface *interface = pcu->ctrl_intf->cur_altsetting; + struct usb_cdc_line_coding *line = (void *)pcu->cmd_buf; + int error; + + memset(line, 0, sizeof(*line)); + line->dwDTERate = cpu_to_le32(57600); + line->bDataBits = 8; + + error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), + USB_CDC_REQ_SET_LINE_CODING, + USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, interface->desc.bInterfaceNumber, + line, sizeof(struct usb_cdc_line_coding), + 5000); + if (error < 0) { + dev_err(pcu->dev, "Failed to set line coding, error: %d\n", + error); + return error; + } + + error = usb_control_msg(pcu->udev, usb_sndctrlpipe(pcu->udev, 0), + USB_CDC_REQ_SET_CONTROL_LINE_STATE, + USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0x03, interface->desc.bInterfaceNumber, + NULL, 0, 5000); + if (error < 0) { + dev_err(pcu->dev, "Failed to set line state, error: %d\n", + error); + return error; + } + + return 0; +} + +static int ims_pcu_get_device_info(struct ims_pcu *pcu) +{ + int error; + + error = ims_pcu_get_info(pcu); + if (error) + return error; + + error = ims_pcu_execute_query(pcu, GET_FW_VERSION); + if (error) { + dev_err(pcu->dev, + "GET_FW_VERSION command failed, error: %d\n", error); + return error; + } + + snprintf(pcu->fw_version, sizeof(pcu->fw_version), + "%02d%02d%02d%02d.%c%c", + pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], + pcu->cmd_buf[6], pcu->cmd_buf[7]); + + error = ims_pcu_execute_query(pcu, GET_BL_VERSION); + if (error) { + dev_err(pcu->dev, + "GET_BL_VERSION command failed, error: %d\n", error); + return error; + } + + snprintf(pcu->bl_version, sizeof(pcu->bl_version), + "%02d%02d%02d%02d.%c%c", + pcu->cmd_buf[2], pcu->cmd_buf[3], pcu->cmd_buf[4], pcu->cmd_buf[5], + pcu->cmd_buf[6], pcu->cmd_buf[7]); + + error = ims_pcu_execute_query(pcu, RESET_REASON); + if (error) { + dev_err(pcu->dev, + "RESET_REASON command failed, error: %d\n", error); + return error; + } + + snprintf(pcu->reset_reason, sizeof(pcu->reset_reason), + "%02x", pcu->cmd_buf[IMS_PCU_DATA_OFFSET]); + + dev_dbg(pcu->dev, + "P/N: %s, MD: %s, S/N: %s, FW: %s, BL: %s, RR: %s\n", + pcu->part_number, + pcu->date_of_manufacturing, + pcu->serial_number, + pcu->fw_version, + pcu->bl_version, + pcu->reset_reason); + + return 0; +} + +static int ims_pcu_identify_type(struct ims_pcu *pcu, u8 *device_id) +{ + int error; + + error = ims_pcu_execute_query(pcu, GET_DEVICE_ID); + if (error) { + dev_err(pcu->dev, + "GET_DEVICE_ID command failed, error: %d\n", error); + return error; + } + + *device_id = pcu->cmd_buf[IMS_PCU_DATA_OFFSET]; + dev_dbg(pcu->dev, "Detected device ID: %d\n", *device_id); + + return 0; +} + +static int ims_pcu_init_application_mode(struct ims_pcu *pcu) +{ + static atomic_t device_no = ATOMIC_INIT(0); + + const struct ims_pcu_device_info *info; + u8 device_id; + int error; + + error = ims_pcu_get_device_info(pcu); + if (error) { + /* Device does not respond to basic queries, hopeless */ + return error; + } + + error = ims_pcu_identify_type(pcu, &device_id); + if (error) { + dev_err(pcu->dev, + "Failed to identify device, error: %d\n", error); + /* + * Do not signal error, but do not create input nor + * backlight devices either, let userspace figure this + * out (flash a new firmware?). + */ + return 0; + } + + if (device_id >= ARRAY_SIZE(ims_pcu_device_info) || + !ims_pcu_device_info[device_id].keymap) { + dev_err(pcu->dev, "Device ID %d is not valid\n", device_id); + /* Same as above, punt to userspace */ + return 0; + } + + /* Device appears to be operable, complete initialization */ + pcu->device_no = atomic_inc_return(&device_no) - 1; + + error = ims_pcu_setup_backlight(pcu); + if (error) + return error; + + info = &ims_pcu_device_info[device_id]; + error = ims_pcu_setup_buttons(pcu, info->keymap, info->keymap_len); + if (error) + goto err_destroy_backlight; + + if (info->has_gamepad) { + error = ims_pcu_setup_gamepad(pcu); + if (error) + goto err_destroy_buttons; + } + + pcu->setup_complete = true; + + return 0; + +err_destroy_backlight: + ims_pcu_destroy_backlight(pcu); +err_destroy_buttons: + ims_pcu_destroy_buttons(pcu); + return error; +} + +static void ims_pcu_destroy_application_mode(struct ims_pcu *pcu) +{ + if (pcu->setup_complete) { + pcu->setup_complete = false; + mb(); /* make sure flag setting is not reordered */ + + if (pcu->gamepad) + ims_pcu_destroy_gamepad(pcu); + ims_pcu_destroy_buttons(pcu); + ims_pcu_destroy_backlight(pcu); + } +} + +static int ims_pcu_init_bootloader_mode(struct ims_pcu *pcu) +{ + int error; + + error = ims_pcu_execute_bl_command(pcu, QUERY_DEVICE, NULL, 0, + IMS_PCU_CMD_RESPONSE_TIMEOUT); + if (error) { + dev_err(pcu->dev, "Bootloader does not respond, aborting\n"); + return error; + } + + pcu->fw_start_addr = + get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 11]); + pcu->fw_end_addr = + get_unaligned_le32(&pcu->cmd_buf[IMS_PCU_DATA_OFFSET + 15]); + + dev_info(pcu->dev, + "Device is in bootloader mode (addr 0x%08x-0x%08x), requesting firmware\n", + pcu->fw_start_addr, pcu->fw_end_addr); + + error = request_firmware_nowait(THIS_MODULE, true, + IMS_PCU_FIRMWARE_NAME, + pcu->dev, GFP_KERNEL, pcu, + ims_pcu_process_async_firmware); + if (error) { + /* This error is not fatal, let userspace have another chance */ + complete(&pcu->async_firmware_done); + } + + return 0; +} + +static void ims_pcu_destroy_bootloader_mode(struct ims_pcu *pcu) +{ + /* Make sure our initial firmware request has completed */ + wait_for_completion(&pcu->async_firmware_done); +} + +#define IMS_PCU_APPLICATION_MODE 0 +#define IMS_PCU_BOOTLOADER_MODE 1 + +static struct usb_driver ims_pcu_driver; + +static int ims_pcu_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(intf); + struct ims_pcu *pcu; + int error; + + pcu = kzalloc(sizeof(struct ims_pcu), GFP_KERNEL); + if (!pcu) + return -ENOMEM; + + pcu->dev = &intf->dev; + pcu->udev = udev; + pcu->bootloader_mode = id->driver_info == IMS_PCU_BOOTLOADER_MODE; + mutex_init(&pcu->cmd_mutex); + init_completion(&pcu->cmd_done); + init_completion(&pcu->async_firmware_done); + + error = ims_pcu_parse_cdc_data(intf, pcu); + if (error) + goto err_free_mem; + + error = usb_driver_claim_interface(&ims_pcu_driver, + pcu->data_intf, pcu); + if (error) { + dev_err(&intf->dev, + "Unable to claim corresponding data interface: %d\n", + error); + goto err_free_mem; + } + + usb_set_intfdata(pcu->ctrl_intf, pcu); + usb_set_intfdata(pcu->data_intf, pcu); + + error = ims_pcu_buffers_alloc(pcu); + if (error) + goto err_unclaim_intf; + + error = ims_pcu_start_io(pcu); + if (error) + goto err_free_buffers; + + error = ims_pcu_line_setup(pcu); + if (error) + goto err_stop_io; + + error = sysfs_create_group(&intf->dev.kobj, &ims_pcu_attr_group); + if (error) + goto err_stop_io; + + error = pcu->bootloader_mode ? + ims_pcu_init_bootloader_mode(pcu) : + ims_pcu_init_application_mode(pcu); + if (error) + goto err_remove_sysfs; + + return 0; + +err_remove_sysfs: + sysfs_remove_group(&intf->dev.kobj, &ims_pcu_attr_group); +err_stop_io: + ims_pcu_stop_io(pcu); +err_free_buffers: + ims_pcu_buffers_free(pcu); +err_unclaim_intf: + usb_driver_release_interface(&ims_pcu_driver, pcu->data_intf); +err_free_mem: + kfree(pcu); + return error; +} + +static void ims_pcu_disconnect(struct usb_interface *intf) +{ + struct ims_pcu *pcu = usb_get_intfdata(intf); + struct usb_host_interface *alt = intf->cur_altsetting; + + usb_set_intfdata(intf, NULL); + + /* + * See if we are dealing with control or data interface. The cleanup + * happens when we unbind primary (control) interface. + */ + if (alt->desc.bInterfaceClass != USB_CLASS_COMM) + return; + + sysfs_remove_group(&intf->dev.kobj, &ims_pcu_attr_group); + + ims_pcu_stop_io(pcu); + + if (pcu->bootloader_mode) + ims_pcu_destroy_bootloader_mode(pcu); + else + ims_pcu_destroy_application_mode(pcu); + + ims_pcu_buffers_free(pcu); + kfree(pcu); +} + +#ifdef CONFIG_PM +static int ims_pcu_suspend(struct usb_interface *intf, + pm_message_t message) +{ + struct ims_pcu *pcu = usb_get_intfdata(intf); + struct usb_host_interface *alt = intf->cur_altsetting; + + if (alt->desc.bInterfaceClass == USB_CLASS_COMM) + ims_pcu_stop_io(pcu); + + return 0; +} + +static int ims_pcu_resume(struct usb_interface *intf) +{ + struct ims_pcu *pcu = usb_get_intfdata(intf); + struct usb_host_interface *alt = intf->cur_altsetting; + int retval = 0; + + if (alt->desc.bInterfaceClass == USB_CLASS_COMM) { + retval = ims_pcu_start_io(pcu); + if (retval == 0) + retval = ims_pcu_line_setup(pcu); + } + + return retval; +} +#endif + +static const struct usb_device_id ims_pcu_id_table[] = { + { + USB_DEVICE_AND_INTERFACE_INFO(0x04d8, 0x0082, + USB_CLASS_COMM, + USB_CDC_SUBCLASS_ACM, + USB_CDC_ACM_PROTO_AT_V25TER), + .driver_info = IMS_PCU_APPLICATION_MODE, + }, + { + USB_DEVICE_AND_INTERFACE_INFO(0x04d8, 0x0083, + USB_CLASS_COMM, + USB_CDC_SUBCLASS_ACM, + USB_CDC_ACM_PROTO_AT_V25TER), + .driver_info = IMS_PCU_BOOTLOADER_MODE, + }, + { } +}; + +static struct usb_driver ims_pcu_driver = { + .name = "ims_pcu", + .id_table = ims_pcu_id_table, + .probe = ims_pcu_probe, + .disconnect = ims_pcu_disconnect, +#ifdef CONFIG_PM + .suspend = ims_pcu_suspend, + .resume = ims_pcu_resume, + .reset_resume = ims_pcu_resume, +#endif +}; + +module_usb_driver(ims_pcu_driver); + +MODULE_DESCRIPTION("IMS Passenger Control Unit driver"); +MODULE_AUTHOR("Dmitry Torokhov "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/ixp4xx-beeper.c b/drivers/input/misc/ixp4xx-beeper.c new file mode 100644 index 00000000..6ab3decc --- /dev/null +++ b/drivers/input/misc/ixp4xx-beeper.c @@ -0,0 +1,172 @@ +/* + * Generic IXP4xx beeper driver + * + * Copyright (C) 2005 Tower Technologies + * + * based on nslu2-io.c + * Copyright (C) 2004 Karen Spearel + * + * Author: Alessandro Zummo + * Maintainers: http://www.nslu2-linux.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Alessandro Zummo "); +MODULE_DESCRIPTION("ixp4xx beeper driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ixp4xx-beeper"); + +static DEFINE_SPINLOCK(beep_lock); + +static void ixp4xx_spkr_control(unsigned int pin, unsigned int count) +{ + unsigned long flags; + + spin_lock_irqsave(&beep_lock, flags); + + if (count) { + gpio_line_config(pin, IXP4XX_GPIO_OUT); + gpio_line_set(pin, IXP4XX_GPIO_LOW); + + *IXP4XX_OSRT2 = (count & ~IXP4XX_OST_RELOAD_MASK) | IXP4XX_OST_ENABLE; + } else { + gpio_line_config(pin, IXP4XX_GPIO_IN); + gpio_line_set(pin, IXP4XX_GPIO_HIGH); + + *IXP4XX_OSRT2 = 0; + } + + spin_unlock_irqrestore(&beep_lock, flags); +} + +static int ixp4xx_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + unsigned int pin = (unsigned int) input_get_drvdata(dev); + unsigned int count = 0; + + if (type != EV_SND) + return -1; + + switch (code) { + case SND_BELL: + if (value) + value = 1000; + case SND_TONE: + break; + default: + return -1; + } + + if (value > 20 && value < 32767) + count = (IXP4XX_TIMER_FREQ / (value * 4)) - 1; + + ixp4xx_spkr_control(pin, count); + + return 0; +} + +static irqreturn_t ixp4xx_spkr_interrupt(int irq, void *dev_id) +{ + /* clear interrupt */ + *IXP4XX_OSST = IXP4XX_OSST_TIMER_2_PEND; + + /* flip the beeper output */ + *IXP4XX_GPIO_GPOUTR ^= (1 << (unsigned int) dev_id); + + return IRQ_HANDLED; +} + +static int ixp4xx_spkr_probe(struct platform_device *dev) +{ + struct input_dev *input_dev; + int err; + + input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + input_set_drvdata(input_dev, (void *) dev->id); + + input_dev->name = "ixp4xx beeper", + input_dev->phys = "ixp4xx/gpio"; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x001f; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &dev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_SND); + input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); + input_dev->event = ixp4xx_spkr_event; + + err = request_irq(IRQ_IXP4XX_TIMER2, &ixp4xx_spkr_interrupt, + IRQF_NO_SUSPEND, "ixp4xx-beeper", + (void *) dev->id); + if (err) + goto err_free_device; + + err = input_register_device(input_dev); + if (err) + goto err_free_irq; + + platform_set_drvdata(dev, input_dev); + + return 0; + + err_free_irq: + free_irq(IRQ_IXP4XX_TIMER2, dev); + err_free_device: + input_free_device(input_dev); + + return err; +} + +static int ixp4xx_spkr_remove(struct platform_device *dev) +{ + struct input_dev *input_dev = platform_get_drvdata(dev); + unsigned int pin = (unsigned int) input_get_drvdata(input_dev); + + input_unregister_device(input_dev); + platform_set_drvdata(dev, NULL); + + /* turn the speaker off */ + disable_irq(IRQ_IXP4XX_TIMER2); + ixp4xx_spkr_control(pin, 0); + + free_irq(IRQ_IXP4XX_TIMER2, dev); + + return 0; +} + +static void ixp4xx_spkr_shutdown(struct platform_device *dev) +{ + struct input_dev *input_dev = platform_get_drvdata(dev); + unsigned int pin = (unsigned int) input_get_drvdata(input_dev); + + /* turn off the speaker */ + disable_irq(IRQ_IXP4XX_TIMER2); + ixp4xx_spkr_control(pin, 0); +} + +static struct platform_driver ixp4xx_spkr_platform_driver = { + .driver = { + .name = "ixp4xx-beeper", + .owner = THIS_MODULE, + }, + .probe = ixp4xx_spkr_probe, + .remove = ixp4xx_spkr_remove, + .shutdown = ixp4xx_spkr_shutdown, +}; +module_platform_driver(ixp4xx_spkr_platform_driver); + diff --git a/drivers/input/misc/keychord.c b/drivers/input/misc/keychord.c new file mode 100644 index 00000000..a5ea27ad --- /dev/null +++ b/drivers/input/misc/keychord.c @@ -0,0 +1,391 @@ +/* + * drivers/input/misc/keychord.c + * + * Copyright (C) 2008 Google, Inc. + * Author: Mike Lockwood + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define KEYCHORD_NAME "keychord" +#define BUFFER_SIZE 16 + +MODULE_AUTHOR("Mike Lockwood "); +MODULE_DESCRIPTION("Key chord input driver"); +MODULE_SUPPORTED_DEVICE("keychord"); +MODULE_LICENSE("GPL"); + +#define NEXT_KEYCHORD(kc) ((struct input_keychord *) \ + ((char *)kc + sizeof(struct input_keychord) + \ + kc->count * sizeof(kc->keycodes[0]))) + +struct keychord_device { + struct input_handler input_handler; + int registered; + + /* list of keychords to monitor */ + struct input_keychord *keychords; + int keychord_count; + + /* bitmask of keys contained in our keychords */ + unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; + /* current state of the keys */ + unsigned long keystate[BITS_TO_LONGS(KEY_CNT)]; + /* number of keys that are currently pressed */ + int key_down; + + /* second input_device_id is needed for null termination */ + struct input_device_id device_ids[2]; + + spinlock_t lock; + wait_queue_head_t waitq; + unsigned char head; + unsigned char tail; + __u16 buff[BUFFER_SIZE]; +}; + +static int check_keychord(struct keychord_device *kdev, + struct input_keychord *keychord) +{ + int i; + + if (keychord->count != kdev->key_down) + return 0; + + for (i = 0; i < keychord->count; i++) { + if (!test_bit(keychord->keycodes[i], kdev->keystate)) + return 0; + } + + /* we have a match */ + return 1; +} + +static void keychord_event(struct input_handle *handle, unsigned int type, + unsigned int code, int value) +{ + struct keychord_device *kdev = handle->private; + struct input_keychord *keychord; + unsigned long flags; + int i, got_chord = 0; + + if (type != EV_KEY || code >= KEY_MAX) + return; + + spin_lock_irqsave(&kdev->lock, flags); + /* do nothing if key state did not change */ + if (!test_bit(code, kdev->keystate) == !value) + goto done; + __change_bit(code, kdev->keystate); + if (value) + kdev->key_down++; + else + kdev->key_down--; + + /* don't notify on key up */ + if (!value) + goto done; + /* ignore this event if it is not one of the keys we are monitoring */ + if (!test_bit(code, kdev->keybit)) + goto done; + + keychord = kdev->keychords; + if (!keychord) + goto done; + + /* check to see if the keyboard state matches any keychords */ + for (i = 0; i < kdev->keychord_count; i++) { + if (check_keychord(kdev, keychord)) { + kdev->buff[kdev->head] = keychord->id; + kdev->head = (kdev->head + 1) % BUFFER_SIZE; + got_chord = 1; + break; + } + /* skip to next keychord */ + keychord = NEXT_KEYCHORD(keychord); + } + +done: + spin_unlock_irqrestore(&kdev->lock, flags); + + if (got_chord) { + pr_info("keychord: got keychord id %d. Any tasks: %d\n", + keychord->id, + !list_empty_careful(&kdev->waitq.task_list)); + wake_up_interruptible(&kdev->waitq); + } +} + +static int keychord_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) +{ + int i, ret; + struct input_handle *handle; + struct keychord_device *kdev = + container_of(handler, struct keychord_device, input_handler); + + /* + * ignore this input device if it does not contain any keycodes + * that we are monitoring + */ + for (i = 0; i < KEY_MAX; i++) { + if (test_bit(i, kdev->keybit) && test_bit(i, dev->keybit)) + break; + } + if (i == KEY_MAX) + return -ENODEV; + + handle = kzalloc(sizeof(*handle), GFP_KERNEL); + if (!handle) + return -ENOMEM; + + handle->dev = dev; + handle->handler = handler; + handle->name = KEYCHORD_NAME; + handle->private = kdev; + + ret = input_register_handle(handle); + if (ret) + goto err_input_register_handle; + + ret = input_open_device(handle); + if (ret) + goto err_input_open_device; + + pr_info("keychord: using input dev %s for fevent\n", dev->name); + + return 0; + +err_input_open_device: + input_unregister_handle(handle); +err_input_register_handle: + kfree(handle); + return ret; +} + +static void keychord_disconnect(struct input_handle *handle) +{ + input_close_device(handle); + input_unregister_handle(handle); + kfree(handle); +} + +/* + * keychord_read is used to read keychord events from the driver + */ +static ssize_t keychord_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct keychord_device *kdev = file->private_data; + __u16 id; + int retval; + unsigned long flags; + + if (count < sizeof(id)) + return -EINVAL; + count = sizeof(id); + + if (kdev->head == kdev->tail && (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + retval = wait_event_interruptible(kdev->waitq, + kdev->head != kdev->tail); + if (retval) + return retval; + + spin_lock_irqsave(&kdev->lock, flags); + /* pop a keychord ID off the queue */ + id = kdev->buff[kdev->tail]; + kdev->tail = (kdev->tail + 1) % BUFFER_SIZE; + spin_unlock_irqrestore(&kdev->lock, flags); + + if (copy_to_user(buffer, &id, count)) + return -EFAULT; + + return count; +} + +/* + * keychord_write is used to configure the driver + */ +static ssize_t keychord_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + struct keychord_device *kdev = file->private_data; + struct input_keychord *keychords = 0; + struct input_keychord *keychord, *next, *end; + int ret, i, key; + unsigned long flags; + + if (count < sizeof(struct input_keychord)) + return -EINVAL; + keychords = kzalloc(count, GFP_KERNEL); + if (!keychords) + return -ENOMEM; + + /* read list of keychords from userspace */ + if (copy_from_user(keychords, buffer, count)) { + kfree(keychords); + return -EFAULT; + } + + /* unregister handler before changing configuration */ + if (kdev->registered) { + input_unregister_handler(&kdev->input_handler); + kdev->registered = 0; + } + + spin_lock_irqsave(&kdev->lock, flags); + /* clear any existing configuration */ + kfree(kdev->keychords); + kdev->keychords = 0; + kdev->keychord_count = 0; + kdev->key_down = 0; + memset(kdev->keybit, 0, sizeof(kdev->keybit)); + memset(kdev->keystate, 0, sizeof(kdev->keystate)); + kdev->head = kdev->tail = 0; + + keychord = keychords; + end = (struct input_keychord *)((char *)keychord + count); + + while (keychord < end) { + next = NEXT_KEYCHORD(keychord); + if (keychord->count <= 0 || next > end) { + pr_err("keychord: invalid keycode count %d\n", + keychord->count); + goto err_unlock_return; + } + if (keychord->version != KEYCHORD_VERSION) { + pr_err("keychord: unsupported version %d\n", + keychord->version); + goto err_unlock_return; + } + + /* keep track of the keys we are monitoring in keybit */ + for (i = 0; i < keychord->count; i++) { + key = keychord->keycodes[i]; + if (key < 0 || key >= KEY_CNT) { + pr_err("keychord: keycode %d out of range\n", + key); + goto err_unlock_return; + } + __set_bit(key, kdev->keybit); + } + + kdev->keychord_count++; + keychord = next; + } + + kdev->keychords = keychords; + spin_unlock_irqrestore(&kdev->lock, flags); + + ret = input_register_handler(&kdev->input_handler); + if (ret) { + kfree(keychords); + kdev->keychords = 0; + return ret; + } + kdev->registered = 1; + + return count; + +err_unlock_return: + spin_unlock_irqrestore(&kdev->lock, flags); + kfree(keychords); + return -EINVAL; +} + +static unsigned int keychord_poll(struct file *file, poll_table *wait) +{ + struct keychord_device *kdev = file->private_data; + + poll_wait(file, &kdev->waitq, wait); + + if (kdev->head != kdev->tail) + return POLLIN | POLLRDNORM; + + return 0; +} + +static int keychord_open(struct inode *inode, struct file *file) +{ + struct keychord_device *kdev; + + kdev = kzalloc(sizeof(struct keychord_device), GFP_KERNEL); + if (!kdev) + return -ENOMEM; + + spin_lock_init(&kdev->lock); + init_waitqueue_head(&kdev->waitq); + + kdev->input_handler.event = keychord_event; + kdev->input_handler.connect = keychord_connect; + kdev->input_handler.disconnect = keychord_disconnect; + kdev->input_handler.name = KEYCHORD_NAME; + kdev->input_handler.id_table = kdev->device_ids; + + kdev->device_ids[0].flags = INPUT_DEVICE_ID_MATCH_EVBIT; + __set_bit(EV_KEY, kdev->device_ids[0].evbit); + + file->private_data = kdev; + + return 0; +} + +static int keychord_release(struct inode *inode, struct file *file) +{ + struct keychord_device *kdev = file->private_data; + + if (kdev->registered) + input_unregister_handler(&kdev->input_handler); + kfree(kdev); + + return 0; +} + +static const struct file_operations keychord_fops = { + .owner = THIS_MODULE, + .open = keychord_open, + .release = keychord_release, + .read = keychord_read, + .write = keychord_write, + .poll = keychord_poll, +}; + +static struct miscdevice keychord_misc = { + .fops = &keychord_fops, + .name = KEYCHORD_NAME, + .minor = MISC_DYNAMIC_MINOR, +}; + +static int __init keychord_init(void) +{ + return misc_register(&keychord_misc); +} + +static void __exit keychord_exit(void) +{ + misc_deregister(&keychord_misc); +} + +module_init(keychord_init); +module_exit(keychord_exit); diff --git a/drivers/input/misc/keyspan_remote.c b/drivers/input/misc/keyspan_remote.c new file mode 100644 index 00000000..290fa5f9 --- /dev/null +++ b/drivers/input/misc/keyspan_remote.c @@ -0,0 +1,597 @@ +/* + * keyspan_remote: USB driver for the Keyspan DMR + * + * Copyright (C) 2005 Zymeta Corporation - Michael Downey (downey@zymeta.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation, version 2. + * + * This driver has been put together with the support of Innosys, Inc. + * and Keyspan, Inc the manufacturers of the Keyspan USB DMR product. + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_VERSION "v0.1" +#define DRIVER_AUTHOR "Michael Downey " +#define DRIVER_DESC "Driver for the USB Keyspan remote control." +#define DRIVER_LICENSE "GPL" + +/* Parameters that can be passed to the driver. */ +static int debug; +module_param(debug, int, 0444); +MODULE_PARM_DESC(debug, "Enable extra debug messages and information"); + +/* Vendor and product ids */ +#define USB_KEYSPAN_VENDOR_ID 0x06CD +#define USB_KEYSPAN_PRODUCT_UIA11 0x0202 + +/* Defines for converting the data from the remote. */ +#define ZERO 0x18 +#define ZERO_MASK 0x1F /* 5 bits for a 0 */ +#define ONE 0x3C +#define ONE_MASK 0x3F /* 6 bits for a 1 */ +#define SYNC 0x3F80 +#define SYNC_MASK 0x3FFF /* 14 bits for a SYNC sequence */ +#define STOP 0x00 +#define STOP_MASK 0x1F /* 5 bits for the STOP sequence */ +#define GAP 0xFF + +#define RECV_SIZE 8 /* The UIA-11 type have a 8 byte limit. */ + +/* + * Table that maps the 31 possible keycodes to input keys. + * Currently there are 15 and 17 button models so RESERVED codes + * are blank areas in the mapping. + */ +static const unsigned short keyspan_key_table[] = { + KEY_RESERVED, /* 0 is just a place holder. */ + KEY_RESERVED, + KEY_STOP, + KEY_PLAYCD, + KEY_RESERVED, + KEY_PREVIOUSSONG, + KEY_REWIND, + KEY_FORWARD, + KEY_NEXTSONG, + KEY_RESERVED, + KEY_RESERVED, + KEY_RESERVED, + KEY_PAUSE, + KEY_VOLUMEUP, + KEY_RESERVED, + KEY_RESERVED, + KEY_RESERVED, + KEY_VOLUMEDOWN, + KEY_RESERVED, + KEY_UP, + KEY_RESERVED, + KEY_MUTE, + KEY_LEFT, + KEY_ENTER, + KEY_RIGHT, + KEY_RESERVED, + KEY_RESERVED, + KEY_DOWN, + KEY_RESERVED, + KEY_KPASTERISK, + KEY_RESERVED, + KEY_MENU +}; + +/* table of devices that work with this driver */ +static struct usb_device_id keyspan_table[] = { + { USB_DEVICE(USB_KEYSPAN_VENDOR_ID, USB_KEYSPAN_PRODUCT_UIA11) }, + { } /* Terminating entry */ +}; + +/* Structure to store all the real stuff that a remote sends to us. */ +struct keyspan_message { + u16 system; + u8 button; + u8 toggle; +}; + +/* Structure used for all the bit testing magic needed to be done. */ +struct bit_tester { + u32 tester; + int len; + int pos; + int bits_left; + u8 buffer[32]; +}; + +/* Structure to hold all of our driver specific stuff */ +struct usb_keyspan { + char name[128]; + char phys[64]; + unsigned short keymap[ARRAY_SIZE(keyspan_key_table)]; + struct usb_device *udev; + struct input_dev *input; + struct usb_interface *interface; + struct usb_endpoint_descriptor *in_endpoint; + struct urb* irq_urb; + int open; + dma_addr_t in_dma; + unsigned char *in_buffer; + + /* variables used to parse messages from remote. */ + struct bit_tester data; + int stage; + int toggle; +}; + +static struct usb_driver keyspan_driver; + +/* + * Debug routine that prints out what we've received from the remote. + */ +static void keyspan_print(struct usb_keyspan* dev) /*unsigned char* data)*/ +{ + char codes[4 * RECV_SIZE]; + int i; + + for (i = 0; i < RECV_SIZE; i++) + snprintf(codes + i * 3, 4, "%02x ", dev->in_buffer[i]); + + dev_info(&dev->udev->dev, "%s\n", codes); +} + +/* + * Routine that manages the bit_tester structure. It makes sure that there are + * at least bits_needed bits loaded into the tester. + */ +static int keyspan_load_tester(struct usb_keyspan* dev, int bits_needed) +{ + if (dev->data.bits_left >= bits_needed) + return 0; + + /* + * Somehow we've missed the last message. The message will be repeated + * though so it's not too big a deal + */ + if (dev->data.pos >= dev->data.len) { + dev_dbg(&dev->interface->dev, + "%s - Error ran out of data. pos: %d, len: %d\n", + __func__, dev->data.pos, dev->data.len); + return -1; + } + + /* Load as much as we can into the tester. */ + while ((dev->data.bits_left + 7 < (sizeof(dev->data.tester) * 8)) && + (dev->data.pos < dev->data.len)) { + dev->data.tester += (dev->data.buffer[dev->data.pos++] << dev->data.bits_left); + dev->data.bits_left += 8; + } + + return 0; +} + +static void keyspan_report_button(struct usb_keyspan *remote, int button, int press) +{ + struct input_dev *input = remote->input; + + input_event(input, EV_MSC, MSC_SCAN, button); + input_report_key(input, remote->keymap[button], press); + input_sync(input); +} + +/* + * Routine that handles all the logic needed to parse out the message from the remote. + */ +static void keyspan_check_data(struct usb_keyspan *remote) +{ + int i; + int found = 0; + struct keyspan_message message; + + switch(remote->stage) { + case 0: + /* + * In stage 0 we want to find the start of a message. The remote sends a 0xFF as filler. + * So the first byte that isn't a FF should be the start of a new message. + */ + for (i = 0; i < RECV_SIZE && remote->in_buffer[i] == GAP; ++i); + + if (i < RECV_SIZE) { + memcpy(remote->data.buffer, remote->in_buffer, RECV_SIZE); + remote->data.len = RECV_SIZE; + remote->data.pos = 0; + remote->data.tester = 0; + remote->data.bits_left = 0; + remote->stage = 1; + } + break; + + case 1: + /* + * Stage 1 we should have 16 bytes and should be able to detect a + * SYNC. The SYNC is 14 bits, 7 0's and then 7 1's. + */ + memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE); + remote->data.len += RECV_SIZE; + + found = 0; + while ((remote->data.bits_left >= 14 || remote->data.pos < remote->data.len) && !found) { + for (i = 0; i < 8; ++i) { + if (keyspan_load_tester(remote, 14) != 0) { + remote->stage = 0; + return; + } + + if ((remote->data.tester & SYNC_MASK) == SYNC) { + remote->data.tester = remote->data.tester >> 14; + remote->data.bits_left -= 14; + found = 1; + break; + } else { + remote->data.tester = remote->data.tester >> 1; + --remote->data.bits_left; + } + } + } + + if (!found) { + remote->stage = 0; + remote->data.len = 0; + } else { + remote->stage = 2; + } + break; + + case 2: + /* + * Stage 2 we should have 24 bytes which will be enough for a full + * message. We need to parse out the system code, button code, + * toggle code, and stop. + */ + memcpy(remote->data.buffer + remote->data.len, remote->in_buffer, RECV_SIZE); + remote->data.len += RECV_SIZE; + + message.system = 0; + for (i = 0; i < 9; i++) { + keyspan_load_tester(remote, 6); + + if ((remote->data.tester & ZERO_MASK) == ZERO) { + message.system = message.system << 1; + remote->data.tester = remote->data.tester >> 5; + remote->data.bits_left -= 5; + } else if ((remote->data.tester & ONE_MASK) == ONE) { + message.system = (message.system << 1) + 1; + remote->data.tester = remote->data.tester >> 6; + remote->data.bits_left -= 6; + } else { + dev_err(&remote->interface->dev, + "%s - Unknown sequence found in system data.\n", + __func__); + remote->stage = 0; + return; + } + } + + message.button = 0; + for (i = 0; i < 5; i++) { + keyspan_load_tester(remote, 6); + + if ((remote->data.tester & ZERO_MASK) == ZERO) { + message.button = message.button << 1; + remote->data.tester = remote->data.tester >> 5; + remote->data.bits_left -= 5; + } else if ((remote->data.tester & ONE_MASK) == ONE) { + message.button = (message.button << 1) + 1; + remote->data.tester = remote->data.tester >> 6; + remote->data.bits_left -= 6; + } else { + dev_err(&remote->interface->dev, + "%s - Unknown sequence found in button data.\n", + __func__); + remote->stage = 0; + return; + } + } + + keyspan_load_tester(remote, 6); + if ((remote->data.tester & ZERO_MASK) == ZERO) { + message.toggle = 0; + remote->data.tester = remote->data.tester >> 5; + remote->data.bits_left -= 5; + } else if ((remote->data.tester & ONE_MASK) == ONE) { + message.toggle = 1; + remote->data.tester = remote->data.tester >> 6; + remote->data.bits_left -= 6; + } else { + dev_err(&remote->interface->dev, + "%s - Error in message, invalid toggle.\n", + __func__); + remote->stage = 0; + return; + } + + keyspan_load_tester(remote, 5); + if ((remote->data.tester & STOP_MASK) == STOP) { + remote->data.tester = remote->data.tester >> 5; + remote->data.bits_left -= 5; + } else { + dev_err(&remote->interface->dev, + "Bad message received, no stop bit found.\n"); + } + + dev_dbg(&remote->interface->dev, + "%s found valid message: system: %d, button: %d, toggle: %d\n", + __func__, message.system, message.button, message.toggle); + + if (message.toggle != remote->toggle) { + keyspan_report_button(remote, message.button, 1); + keyspan_report_button(remote, message.button, 0); + remote->toggle = message.toggle; + } + + remote->stage = 0; + break; + } +} + +/* + * Routine for sending all the initialization messages to the remote. + */ +static int keyspan_setup(struct usb_device* dev) +{ + int retval = 0; + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + 0x11, 0x40, 0x5601, 0x0, NULL, 0, 0); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set bit rate due to error: %d\n", + __func__, retval); + return(retval); + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + 0x44, 0x40, 0x0, 0x0, NULL, 0, 0); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to set resume sensitivity due to error: %d\n", + __func__, retval); + return(retval); + } + + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + 0x22, 0x40, 0x0, 0x0, NULL, 0, 0); + if (retval) { + dev_dbg(&dev->dev, "%s - failed to turn receive on due to error: %d\n", + __func__, retval); + return(retval); + } + + dev_dbg(&dev->dev, "%s - Setup complete.\n", __func__); + return(retval); +} + +/* + * Routine used to handle a new message that has come in. + */ +static void keyspan_irq_recv(struct urb *urb) +{ + struct usb_keyspan *dev = urb->context; + int retval; + + /* Check our status in case we need to bail out early. */ + switch (urb->status) { + case 0: + break; + + /* Device went away so don't keep trying to read from it. */ + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + return; + + default: + goto resubmit; + break; + } + + if (debug) + keyspan_print(dev); + + keyspan_check_data(dev); + +resubmit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(&dev->interface->dev, + "%s - usb_submit_urb failed with result: %d\n", + __func__, retval); +} + +static int keyspan_open(struct input_dev *dev) +{ + struct usb_keyspan *remote = input_get_drvdata(dev); + + remote->irq_urb->dev = remote->udev; + if (usb_submit_urb(remote->irq_urb, GFP_KERNEL)) + return -EIO; + + return 0; +} + +static void keyspan_close(struct input_dev *dev) +{ + struct usb_keyspan *remote = input_get_drvdata(dev); + + usb_kill_urb(remote->irq_urb); +} + +static struct usb_endpoint_descriptor *keyspan_get_in_endpoint(struct usb_host_interface *iface) +{ + + struct usb_endpoint_descriptor *endpoint; + int i; + + for (i = 0; i < iface->desc.bNumEndpoints; ++i) { + endpoint = &iface->endpoint[i].desc; + + if (usb_endpoint_is_int_in(endpoint)) { + /* we found our interrupt in endpoint */ + return endpoint; + } + } + + return NULL; +} + +/* + * Routine that sets up the driver to handle a specific USB device detected on the bus. + */ +static int keyspan_probe(struct usb_interface *interface, const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(interface); + struct usb_endpoint_descriptor *endpoint; + struct usb_keyspan *remote; + struct input_dev *input_dev; + int i, error; + + endpoint = keyspan_get_in_endpoint(interface->cur_altsetting); + if (!endpoint) + return -ENODEV; + + remote = kzalloc(sizeof(*remote), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!remote || !input_dev) { + error = -ENOMEM; + goto fail1; + } + + remote->udev = udev; + remote->input = input_dev; + remote->interface = interface; + remote->in_endpoint = endpoint; + remote->toggle = -1; /* Set to -1 so we will always not match the toggle from the first remote message. */ + + remote->in_buffer = usb_alloc_coherent(udev, RECV_SIZE, GFP_ATOMIC, &remote->in_dma); + if (!remote->in_buffer) { + error = -ENOMEM; + goto fail1; + } + + remote->irq_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!remote->irq_urb) { + error = -ENOMEM; + goto fail2; + } + + error = keyspan_setup(udev); + if (error) { + error = -ENODEV; + goto fail3; + } + + if (udev->manufacturer) + strlcpy(remote->name, udev->manufacturer, sizeof(remote->name)); + + if (udev->product) { + if (udev->manufacturer) + strlcat(remote->name, " ", sizeof(remote->name)); + strlcat(remote->name, udev->product, sizeof(remote->name)); + } + + if (!strlen(remote->name)) + snprintf(remote->name, sizeof(remote->name), + "USB Keyspan Remote %04x:%04x", + le16_to_cpu(udev->descriptor.idVendor), + le16_to_cpu(udev->descriptor.idProduct)); + + usb_make_path(udev, remote->phys, sizeof(remote->phys)); + strlcat(remote->phys, "/input0", sizeof(remote->phys)); + memcpy(remote->keymap, keyspan_key_table, sizeof(remote->keymap)); + + input_dev->name = remote->name; + input_dev->phys = remote->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &interface->dev; + input_dev->keycode = remote->keymap; + input_dev->keycodesize = sizeof(unsigned short); + input_dev->keycodemax = ARRAY_SIZE(remote->keymap); + + input_set_capability(input_dev, EV_MSC, MSC_SCAN); + __set_bit(EV_KEY, input_dev->evbit); + for (i = 0; i < ARRAY_SIZE(keyspan_key_table); i++) + __set_bit(keyspan_key_table[i], input_dev->keybit); + __clear_bit(KEY_RESERVED, input_dev->keybit); + + input_set_drvdata(input_dev, remote); + + input_dev->open = keyspan_open; + input_dev->close = keyspan_close; + + /* + * Initialize the URB to access the device. + * The urb gets sent to the device in keyspan_open() + */ + usb_fill_int_urb(remote->irq_urb, + remote->udev, + usb_rcvintpipe(remote->udev, endpoint->bEndpointAddress), + remote->in_buffer, RECV_SIZE, keyspan_irq_recv, remote, + endpoint->bInterval); + remote->irq_urb->transfer_dma = remote->in_dma; + remote->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + /* we can register the device now, as it is ready */ + error = input_register_device(remote->input); + if (error) + goto fail3; + + /* save our data pointer in this interface device */ + usb_set_intfdata(interface, remote); + + return 0; + + fail3: usb_free_urb(remote->irq_urb); + fail2: usb_free_coherent(udev, RECV_SIZE, remote->in_buffer, remote->in_dma); + fail1: kfree(remote); + input_free_device(input_dev); + + return error; +} + +/* + * Routine called when a device is disconnected from the USB. + */ +static void keyspan_disconnect(struct usb_interface *interface) +{ + struct usb_keyspan *remote; + + remote = usb_get_intfdata(interface); + usb_set_intfdata(interface, NULL); + + if (remote) { /* We have a valid driver structure so clean up everything we allocated. */ + input_unregister_device(remote->input); + usb_kill_urb(remote->irq_urb); + usb_free_urb(remote->irq_urb); + usb_free_coherent(remote->udev, RECV_SIZE, remote->in_buffer, remote->in_dma); + kfree(remote); + } +} + +/* + * Standard driver set up sections + */ +static struct usb_driver keyspan_driver = +{ + .name = "keyspan_remote", + .probe = keyspan_probe, + .disconnect = keyspan_disconnect, + .id_table = keyspan_table +}; + +module_usb_driver(keyspan_driver); + +MODULE_DEVICE_TABLE(usb, keyspan_table); +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE(DRIVER_LICENSE); diff --git a/drivers/input/misc/kxtj9.c b/drivers/input/misc/kxtj9.c new file mode 100644 index 00000000..a993b67a --- /dev/null +++ b/drivers/input/misc/kxtj9.c @@ -0,0 +1,674 @@ +/* + * Copyright (C) 2011 Kionix, Inc. + * Written by Chris Hudson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define NAME "kxtj9" +#define G_MAX 8000 +/* OUTPUT REGISTERS */ +#define XOUT_L 0x06 +#define WHO_AM_I 0x0F +/* CONTROL REGISTERS */ +#define INT_REL 0x1A +#define CTRL_REG1 0x1B +#define INT_CTRL1 0x1E +#define DATA_CTRL 0x21 +/* CONTROL REGISTER 1 BITS */ +#define PC1_OFF 0x7F +#define PC1_ON (1 << 7) +/* Data ready funtion enable bit: set during probe if using irq mode */ +#define DRDYE (1 << 5) +/* DATA CONTROL REGISTER BITS */ +#define ODR12_5F 0 +#define ODR25F 1 +#define ODR50F 2 +#define ODR100F 3 +#define ODR200F 4 +#define ODR400F 5 +#define ODR800F 6 +/* INTERRUPT CONTROL REGISTER 1 BITS */ +/* Set these during probe if using irq mode */ +#define KXTJ9_IEL (1 << 3) +#define KXTJ9_IEA (1 << 4) +#define KXTJ9_IEN (1 << 5) +/* INPUT_ABS CONSTANTS */ +#define FUZZ 3 +#define FLAT 3 +/* RESUME STATE INDICES */ +#define RES_DATA_CTRL 0 +#define RES_CTRL_REG1 1 +#define RES_INT_CTRL1 2 +#define RESUME_ENTRIES 3 + +/* + * The following table lists the maximum appropriate poll interval for each + * available output data rate. + */ +static const struct { + unsigned int cutoff; + u8 mask; +} kxtj9_odr_table[] = { + { 3, ODR800F }, + { 5, ODR400F }, + { 10, ODR200F }, + { 20, ODR100F }, + { 40, ODR50F }, + { 80, ODR25F }, + { 0, ODR12_5F}, +}; + +struct kxtj9_data { + struct i2c_client *client; + struct kxtj9_platform_data pdata; + struct input_dev *input_dev; +#ifdef CONFIG_INPUT_KXTJ9_POLLED_MODE + struct input_polled_dev *poll_dev; +#endif + unsigned int last_poll_interval; + u8 shift; + u8 ctrl_reg1; + u8 data_ctrl; + u8 int_ctrl; +}; + +static int kxtj9_i2c_read(struct kxtj9_data *tj9, u8 addr, u8 *data, int len) +{ + struct i2c_msg msgs[] = { + { + .addr = tj9->client->addr, + .flags = tj9->client->flags, + .len = 1, + .buf = &addr, + }, + { + .addr = tj9->client->addr, + .flags = tj9->client->flags | I2C_M_RD, + .len = len, + .buf = data, + }, + }; + + return i2c_transfer(tj9->client->adapter, msgs, 2); +} + +static void kxtj9_report_acceleration_data(struct kxtj9_data *tj9) +{ + s16 acc_data[3]; /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + s16 x, y, z; + int err; + + err = kxtj9_i2c_read(tj9, XOUT_L, (u8 *)acc_data, 6); + if (err < 0) + dev_err(&tj9->client->dev, "accelerometer data read failed\n"); + + x = le16_to_cpu(acc_data[tj9->pdata.axis_map_x]); + y = le16_to_cpu(acc_data[tj9->pdata.axis_map_y]); + z = le16_to_cpu(acc_data[tj9->pdata.axis_map_z]); + + x >>= tj9->shift; + y >>= tj9->shift; + z >>= tj9->shift; + + input_report_abs(tj9->input_dev, ABS_X, tj9->pdata.negate_x ? -x : x); + input_report_abs(tj9->input_dev, ABS_Y, tj9->pdata.negate_y ? -y : y); + input_report_abs(tj9->input_dev, ABS_Z, tj9->pdata.negate_z ? -z : z); + input_sync(tj9->input_dev); +} + +static irqreturn_t kxtj9_isr(int irq, void *dev) +{ + struct kxtj9_data *tj9 = dev; + int err; + + /* data ready is the only possible interrupt type */ + kxtj9_report_acceleration_data(tj9); + + err = i2c_smbus_read_byte_data(tj9->client, INT_REL); + if (err < 0) + dev_err(&tj9->client->dev, + "error clearing interrupt status: %d\n", err); + + return IRQ_HANDLED; +} + +static int kxtj9_update_g_range(struct kxtj9_data *tj9, u8 new_g_range) +{ + switch (new_g_range) { + case KXTJ9_G_2G: + tj9->shift = 4; + break; + case KXTJ9_G_4G: + tj9->shift = 3; + break; + case KXTJ9_G_8G: + tj9->shift = 2; + break; + default: + return -EINVAL; + } + + tj9->ctrl_reg1 &= 0xe7; + tj9->ctrl_reg1 |= new_g_range; + + return 0; +} + +static int kxtj9_update_odr(struct kxtj9_data *tj9, unsigned int poll_interval) +{ + int err; + int i; + + /* Use the lowest ODR that can support the requested poll interval */ + for (i = 0; i < ARRAY_SIZE(kxtj9_odr_table); i++) { + tj9->data_ctrl = kxtj9_odr_table[i].mask; + if (poll_interval < kxtj9_odr_table[i].cutoff) + break; + } + + err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, 0); + if (err < 0) + return err; + + err = i2c_smbus_write_byte_data(tj9->client, DATA_CTRL, tj9->data_ctrl); + if (err < 0) + return err; + + err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); + if (err < 0) + return err; + + return 0; +} + +static int kxtj9_device_power_on(struct kxtj9_data *tj9) +{ + if (tj9->pdata.power_on) + return tj9->pdata.power_on(); + + return 0; +} + +static void kxtj9_device_power_off(struct kxtj9_data *tj9) +{ + int err; + + tj9->ctrl_reg1 &= PC1_OFF; + err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); + if (err < 0) + dev_err(&tj9->client->dev, "soft power off failed\n"); + + if (tj9->pdata.power_off) + tj9->pdata.power_off(); +} + +static int kxtj9_enable(struct kxtj9_data *tj9) +{ + int err; + + err = kxtj9_device_power_on(tj9); + if (err < 0) + return err; + + /* ensure that PC1 is cleared before updating control registers */ + err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, 0); + if (err < 0) + return err; + + /* only write INT_CTRL_REG1 if in irq mode */ + if (tj9->client->irq) { + err = i2c_smbus_write_byte_data(tj9->client, + INT_CTRL1, tj9->int_ctrl); + if (err < 0) + return err; + } + + err = kxtj9_update_g_range(tj9, tj9->pdata.g_range); + if (err < 0) + return err; + + /* turn on outputs */ + tj9->ctrl_reg1 |= PC1_ON; + err = i2c_smbus_write_byte_data(tj9->client, CTRL_REG1, tj9->ctrl_reg1); + if (err < 0) + return err; + + err = kxtj9_update_odr(tj9, tj9->last_poll_interval); + if (err < 0) + return err; + + /* clear initial interrupt if in irq mode */ + if (tj9->client->irq) { + err = i2c_smbus_read_byte_data(tj9->client, INT_REL); + if (err < 0) { + dev_err(&tj9->client->dev, + "error clearing interrupt: %d\n", err); + goto fail; + } + } + + return 0; + +fail: + kxtj9_device_power_off(tj9); + return err; +} + +static void kxtj9_disable(struct kxtj9_data *tj9) +{ + kxtj9_device_power_off(tj9); +} + +static int kxtj9_input_open(struct input_dev *input) +{ + struct kxtj9_data *tj9 = input_get_drvdata(input); + + return kxtj9_enable(tj9); +} + +static void kxtj9_input_close(struct input_dev *dev) +{ + struct kxtj9_data *tj9 = input_get_drvdata(dev); + + kxtj9_disable(tj9); +} + +static void kxtj9_init_input_device(struct kxtj9_data *tj9, + struct input_dev *input_dev) +{ + __set_bit(EV_ABS, input_dev->evbit); + input_set_abs_params(input_dev, ABS_X, -G_MAX, G_MAX, FUZZ, FLAT); + input_set_abs_params(input_dev, ABS_Y, -G_MAX, G_MAX, FUZZ, FLAT); + input_set_abs_params(input_dev, ABS_Z, -G_MAX, G_MAX, FUZZ, FLAT); + + input_dev->name = "kxtj9_accel"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &tj9->client->dev; +} + +static int kxtj9_setup_input_device(struct kxtj9_data *tj9) +{ + struct input_dev *input_dev; + int err; + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&tj9->client->dev, "input device allocate failed\n"); + return -ENOMEM; + } + + tj9->input_dev = input_dev; + + input_dev->open = kxtj9_input_open; + input_dev->close = kxtj9_input_close; + input_set_drvdata(input_dev, tj9); + + kxtj9_init_input_device(tj9, input_dev); + + err = input_register_device(tj9->input_dev); + if (err) { + dev_err(&tj9->client->dev, + "unable to register input polled device %s: %d\n", + tj9->input_dev->name, err); + input_free_device(tj9->input_dev); + return err; + } + + return 0; +} + +/* + * When IRQ mode is selected, we need to provide an interface to allow the user + * to change the output data rate of the part. For consistency, we are using + * the set_poll method, which accepts a poll interval in milliseconds, and then + * calls update_odr() while passing this value as an argument. In IRQ mode, the + * data outputs will not be read AT the requested poll interval, rather, the + * lowest ODR that can support the requested interval. The client application + * will be responsible for retrieving data from the input node at the desired + * interval. + */ + +/* Returns currently selected poll interval (in ms) */ +static ssize_t kxtj9_get_poll(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct kxtj9_data *tj9 = i2c_get_clientdata(client); + + return sprintf(buf, "%d\n", tj9->last_poll_interval); +} + +/* Allow users to select a new poll interval (in ms) */ +static ssize_t kxtj9_set_poll(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct kxtj9_data *tj9 = i2c_get_clientdata(client); + struct input_dev *input_dev = tj9->input_dev; + unsigned int interval; + int error; + + error = kstrtouint(buf, 10, &interval); + if (error < 0) + return error; + + /* Lock the device to prevent races with open/close (and itself) */ + mutex_lock(&input_dev->mutex); + + disable_irq(client->irq); + + /* + * Set current interval to the greater of the minimum interval or + * the requested interval + */ + tj9->last_poll_interval = max(interval, tj9->pdata.min_interval); + + kxtj9_update_odr(tj9, tj9->last_poll_interval); + + enable_irq(client->irq); + mutex_unlock(&input_dev->mutex); + + return count; +} + +static DEVICE_ATTR(poll, S_IRUGO|S_IWUSR, kxtj9_get_poll, kxtj9_set_poll); + +static struct attribute *kxtj9_attributes[] = { + &dev_attr_poll.attr, + NULL +}; + +static struct attribute_group kxtj9_attribute_group = { + .attrs = kxtj9_attributes +}; + + +#ifdef CONFIG_INPUT_KXTJ9_POLLED_MODE +static void kxtj9_poll(struct input_polled_dev *dev) +{ + struct kxtj9_data *tj9 = dev->private; + unsigned int poll_interval = dev->poll_interval; + + kxtj9_report_acceleration_data(tj9); + + if (poll_interval != tj9->last_poll_interval) { + kxtj9_update_odr(tj9, poll_interval); + tj9->last_poll_interval = poll_interval; + } +} + +static void kxtj9_polled_input_open(struct input_polled_dev *dev) +{ + struct kxtj9_data *tj9 = dev->private; + + kxtj9_enable(tj9); +} + +static void kxtj9_polled_input_close(struct input_polled_dev *dev) +{ + struct kxtj9_data *tj9 = dev->private; + + kxtj9_disable(tj9); +} + +static int kxtj9_setup_polled_device(struct kxtj9_data *tj9) +{ + int err; + struct input_polled_dev *poll_dev; + poll_dev = input_allocate_polled_device(); + + if (!poll_dev) { + dev_err(&tj9->client->dev, + "Failed to allocate polled device\n"); + return -ENOMEM; + } + + tj9->poll_dev = poll_dev; + tj9->input_dev = poll_dev->input; + + poll_dev->private = tj9; + poll_dev->poll = kxtj9_poll; + poll_dev->open = kxtj9_polled_input_open; + poll_dev->close = kxtj9_polled_input_close; + + kxtj9_init_input_device(tj9, poll_dev->input); + + err = input_register_polled_device(poll_dev); + if (err) { + dev_err(&tj9->client->dev, + "Unable to register polled device, err=%d\n", err); + input_free_polled_device(poll_dev); + return err; + } + + return 0; +} + +static void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) +{ + input_unregister_polled_device(tj9->poll_dev); + input_free_polled_device(tj9->poll_dev); +} + +#else + +static inline int kxtj9_setup_polled_device(struct kxtj9_data *tj9) +{ + return -ENOSYS; +} + +static inline void kxtj9_teardown_polled_device(struct kxtj9_data *tj9) +{ +} + +#endif + +static int kxtj9_verify(struct kxtj9_data *tj9) +{ + int retval; + + retval = kxtj9_device_power_on(tj9); + if (retval < 0) + return retval; + + retval = i2c_smbus_read_byte_data(tj9->client, WHO_AM_I); + if (retval < 0) { + dev_err(&tj9->client->dev, "read err int source\n"); + goto out; + } + + retval = (retval != 0x07 && retval != 0x08) ? -EIO : 0; + +out: + kxtj9_device_power_off(tj9); + return retval; +} + +static int kxtj9_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct kxtj9_platform_data *pdata = client->dev.platform_data; + struct kxtj9_data *tj9; + int err; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_err(&client->dev, "client is not i2c capable\n"); + return -ENXIO; + } + + if (!pdata) { + dev_err(&client->dev, "platform data is NULL; exiting\n"); + return -EINVAL; + } + + tj9 = kzalloc(sizeof(*tj9), GFP_KERNEL); + if (!tj9) { + dev_err(&client->dev, + "failed to allocate memory for module data\n"); + return -ENOMEM; + } + + tj9->client = client; + tj9->pdata = *pdata; + + if (pdata->init) { + err = pdata->init(); + if (err < 0) + goto err_free_mem; + } + + err = kxtj9_verify(tj9); + if (err < 0) { + dev_err(&client->dev, "device not recognized\n"); + goto err_pdata_exit; + } + + i2c_set_clientdata(client, tj9); + + tj9->ctrl_reg1 = tj9->pdata.res_12bit | tj9->pdata.g_range; + tj9->last_poll_interval = tj9->pdata.init_interval; + + if (client->irq) { + /* If in irq mode, populate INT_CTRL_REG1 and enable DRDY. */ + tj9->int_ctrl |= KXTJ9_IEN | KXTJ9_IEA | KXTJ9_IEL; + tj9->ctrl_reg1 |= DRDYE; + + err = kxtj9_setup_input_device(tj9); + if (err) + goto err_pdata_exit; + + err = request_threaded_irq(client->irq, NULL, kxtj9_isr, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "kxtj9-irq", tj9); + if (err) { + dev_err(&client->dev, "request irq failed: %d\n", err); + goto err_destroy_input; + } + + err = sysfs_create_group(&client->dev.kobj, &kxtj9_attribute_group); + if (err) { + dev_err(&client->dev, "sysfs create failed: %d\n", err); + goto err_free_irq; + } + + } else { + err = kxtj9_setup_polled_device(tj9); + if (err) + goto err_pdata_exit; + } + + return 0; + +err_free_irq: + free_irq(client->irq, tj9); +err_destroy_input: + input_unregister_device(tj9->input_dev); +err_pdata_exit: + if (tj9->pdata.exit) + tj9->pdata.exit(); +err_free_mem: + kfree(tj9); + return err; +} + +static int kxtj9_remove(struct i2c_client *client) +{ + struct kxtj9_data *tj9 = i2c_get_clientdata(client); + + if (client->irq) { + sysfs_remove_group(&client->dev.kobj, &kxtj9_attribute_group); + free_irq(client->irq, tj9); + input_unregister_device(tj9->input_dev); + } else { + kxtj9_teardown_polled_device(tj9); + } + + if (tj9->pdata.exit) + tj9->pdata.exit(); + + kfree(tj9); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int kxtj9_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct kxtj9_data *tj9 = i2c_get_clientdata(client); + struct input_dev *input_dev = tj9->input_dev; + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + kxtj9_disable(tj9); + + mutex_unlock(&input_dev->mutex); + return 0; +} + +static int kxtj9_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct kxtj9_data *tj9 = i2c_get_clientdata(client); + struct input_dev *input_dev = tj9->input_dev; + int retval = 0; + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + kxtj9_enable(tj9); + + mutex_unlock(&input_dev->mutex); + return retval; +} +#endif + +static SIMPLE_DEV_PM_OPS(kxtj9_pm_ops, kxtj9_suspend, kxtj9_resume); + +static const struct i2c_device_id kxtj9_id[] = { + { NAME, 0 }, + { }, +}; + +MODULE_DEVICE_TABLE(i2c, kxtj9_id); + +static struct i2c_driver kxtj9_driver = { + .driver = { + .name = NAME, + .owner = THIS_MODULE, + .pm = &kxtj9_pm_ops, + }, + .probe = kxtj9_probe, + .remove = kxtj9_remove, + .id_table = kxtj9_id, +}; + +module_i2c_driver(kxtj9_driver); + +MODULE_DESCRIPTION("KXTJ9 accelerometer driver"); +MODULE_AUTHOR("Chris Hudson "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/lis3dh.c b/drivers/input/misc/lis3dh.c new file mode 100644 index 00000000..947c3bbb --- /dev/null +++ b/drivers/input/misc/lis3dh.c @@ -0,0 +1,1707 @@ +/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** + * + * File Name : lis3dh_acc.c + * Authors : MSH - Motion Mems BU - Application Team + * : Carmine Iascone (carmine.iascone@st.com) + * : Matteo Dameno (matteo.dameno@st.com) + * Version : V.1.0.5 + * Date : 16/08/2010 + * Description : LIS3DH accelerometer sensor API + * + ******************************************************************************* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE + * PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT. + * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, + * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE + * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING + * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS. + * + ****************************************************************************** + Revision 1.0.0 05/11/09 + First Release + Revision 1.0.3 22/01/2010 + Linux K&R Compliant Release; + Revision 1.0.5 16/08/2010 + modified _get_acceleration_data function + modified _update_odr function + manages 2 interrupts + + ******************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#include +#include +#include +#include + +#define INTERRUPT_MANAGEMENT 1 + +#define G_MAX 16000 /** Maximum polled-device-reported g value */ + +/* +#define SHIFT_ADJ_2G 4 +#define SHIFT_ADJ_4G 3 +#define SHIFT_ADJ_8G 2 +#define SHIFT_ADJ_16G 1 +*/ + +#define SENSITIVITY_2G 1 /** mg/LSB */ +#define SENSITIVITY_4G 2 /** mg/LSB */ +#define SENSITIVITY_8G 4 /** mg/LSB */ +#define SENSITIVITY_16G 12 /** mg/LSB */ + +#define HIGH_RESOLUTION 0x08 + +#define AXISDATA_REG 0x28 +#define WHOAMI_LIS3DH_ACC 0x33 /* Expctd content for WAI */ + +/* CONTROL REGISTERS */ +#define WHO_AM_I 0x0F /* WhoAmI register */ +#define TEMP_CFG_REG 0x1F /* temper sens control reg */ +/* ctrl 1: ODR3 ODR2 ODR ODR0 LPen Zenable Yenable Zenable */ +#define CTRL_REG1 0x20 /* control reg 1 */ +#define CTRL_REG2 0x21 /* control reg 2 */ +#define CTRL_REG3 0x22 /* control reg 3 */ +#define CTRL_REG4 0x23 /* control reg 4 */ +#define CTRL_REG5 0x24 /* control reg 5 */ +#define CTRL_REG6 0x25 /* control reg 6 */ + +#define FIFO_CTRL_REG 0x2E /* FiFo control reg */ + +#define INT_CFG1 0x30 /* interrupt 1 config */ +#define INT_SRC1 0x31 /* interrupt 1 source */ +#define INT_THS1 0x32 /* interrupt 1 threshold */ +#define INT_DUR1 0x33 /* interrupt 1 duration */ + +#define INT_CFG2 0x34 /* interrupt 2 config */ +#define INT_SRC2 0x35 /* interrupt 2 source */ +#define INT_THS2 0x36 /* interrupt 2 threshold */ +#define INT_DUR2 0x37 /* interrupt 2 duration */ + +#define TT_CFG 0x38 /* tap config */ +#define TT_SRC 0x39 /* tap source */ +#define TT_THS 0x3A /* tap threshold */ +#define TT_LIM 0x3B /* tap time limit */ +#define TT_TLAT 0x3C /* tap time latency */ +#define TT_TW 0x3D /* tap time window */ +/* end CONTROL REGISTRES */ + +#define ENABLE_HIGH_RESOLUTION 1 + +#define LIS3DH_ACC_PM_OFF 0x00 +#define LIS3DH_ACC_ENABLE_ALL_AXES 0x07 + +#define PMODE_MASK 0x08 +#define ODR_MASK 0XF0 + +#define ODR1 0x10 /* 1Hz output data rate */ +#define ODR10 0x20 /* 10Hz output data rate */ +#define ODR25 0x30 /* 25Hz output data rate */ +#define ODR50 0x40 /* 50Hz output data rate */ +#define ODR100 0x50 /* 100Hz output data rate */ +#define ODR200 0x60 /* 200Hz output data rate */ +#define ODR400 0x70 /* 400Hz output data rate */ +#define ODR1250 0x90 /* 1250Hz output data rate */ + +#define IA 0x40 +#define ZH 0x20 +#define ZL 0x10 +#define YH 0x08 +#define YL 0x04 +#define XH 0x02 +#define XL 0x01 +/* */ +/* CTRL REG BITS*/ +#define CTRL_REG3_I1_AOI1 0x40 +#define CTRL_REG6_I2_TAPEN 0x80 +#define CTRL_REG6_HLACTIVE 0x02 +/* */ + +/* TAP_SOURCE_REG BIT */ +#define DTAP 0x20 +#define STAP 0x10 +#define SIGNTAP 0x08 +#define ZTAP 0x04 +#define YTAP 0x02 +#define XTAZ 0x01 + +#define FUZZ 32 +#define FLAT 32 +#define I2C_RETRY_DELAY 5 +#define I2C_RETRIES 5 +#define I2C_AUTO_INCREMENT 0x80 + +/* RESUME STATE INDICES */ +#define RES_CTRL_REG1 0 +#define RES_CTRL_REG2 1 +#define RES_CTRL_REG3 2 +#define RES_CTRL_REG4 3 +#define RES_CTRL_REG5 4 +#define RES_CTRL_REG6 5 + +#define RES_INT_CFG1 6 +#define RES_INT_THS1 7 +#define RES_INT_DUR1 8 +#define RES_INT_CFG2 9 +#define RES_INT_THS2 10 +#define RES_INT_DUR2 11 + +#define RES_TT_CFG 12 +#define RES_TT_THS 13 +#define RES_TT_LIM 14 +#define RES_TT_TLAT 15 +#define RES_TT_TW 16 + +#define RES_TEMP_CFG_REG 17 +#define RES_REFERENCE_REG 18 +#define RES_FIFO_CTRL_REG 19 + +#define RESUME_ENTRIES 20 +#define DEVICE_INFO "ST, LIS3DH" +#define DEVICE_INFO_LEN 32 +/* end RESUME STATE INDICES */ + +#define GSENSOR_GINT1_GPI 0 +#define GSENSOR_GINT2_GPI 1 + +struct { + unsigned int cutoff_ms; + unsigned int mask; +} lis3dh_acc_odr_table[] = { + { + 1, ODR1250}, { + 3, ODR400}, { + 5, ODR200}, { + 10, ODR100}, { + 20, ODR50}, { + 40, ODR25}, { + 100, ODR10}, { +1000, ODR1},}; + +struct lis3dh_acc_data { + struct i2c_client *client; + struct lis3dh_acc_platform_data *pdata; + + struct mutex lock; + struct delayed_work input_work; + + struct input_dev *input_dev; + + int hw_initialized; + /* hw_working=-1 means not tested yet */ + int hw_working; + atomic_t enabled; + int on_before_suspend; + + u8 sensitivity; + + u8 resume_state[RESUME_ENTRIES]; + + int irq1; + struct work_struct irq1_work; + struct workqueue_struct *irq1_work_queue; + int irq2; + struct work_struct irq2_work; + struct workqueue_struct *irq2_work_queue; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif +}; + +/* + * Because misc devices can not carry a pointer from driver register to + * open, we keep this global. This limits the driver to a single instance. + */ +struct lis3dh_acc_data *lis3dh_acc_misc_data; +struct i2c_client *lis3dh_i2c_client; + +static int lis3dh_acc_i2c_read(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { + { + .addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = 1, + .buf = buf,}, + { + .addr = acc->client->addr, + .flags = (acc->client->flags & I2C_M_TEN) | I2C_M_RD, + .len = len, + .buf = buf,}, + }; + + do { + err = i2c_transfer(acc->client->adapter, msgs, 2); + if (err != 2) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 2) && (++tries < I2C_RETRIES)); + + if (err != 2) { + dev_err(&acc->client->dev, "read transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_i2c_write(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { {.addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = len + 1,.buf = buf,}, + }; + do { + err = i2c_transfer(acc->client->adapter, msgs, 1); + if (err != 1) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 1) && (++tries < I2C_RETRIES)); + + if (err != 1) { + dev_err(&acc->client->dev, "write transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_hw_init(struct lis3dh_acc_data *acc) +{ + int err = -1; + u8 buf[7]; + + pr_debug("%s: hw init start\n", LIS3DH_ACC_DEV_NAME); + + buf[0] = WHO_AM_I; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error_firstread; + else + acc->hw_working = 1; + if (buf[0] != WHOAMI_LIS3DH_ACC) { + err = -1; /* choose the right coded error */ + goto error_unknown_device; + } + + buf[0] = CTRL_REG1; + buf[1] = acc->resume_state[RES_CTRL_REG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = TEMP_CFG_REG; + buf[1] = acc->resume_state[RES_TEMP_CFG_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = FIFO_CTRL_REG; + buf[1] = acc->resume_state[RES_FIFO_CTRL_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | TT_THS); + buf[1] = acc->resume_state[RES_TT_THS]; + buf[2] = acc->resume_state[RES_TT_LIM]; + buf[3] = acc->resume_state[RES_TT_TLAT]; + buf[4] = acc->resume_state[RES_TT_TW]; + err = lis3dh_acc_i2c_write(acc, buf, 4); + if (err < 0) + goto error1; + buf[0] = TT_CFG; + buf[1] = acc->resume_state[RES_TT_CFG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS1); + buf[1] = acc->resume_state[RES_INT_THS1]; + buf[2] = acc->resume_state[RES_INT_DUR1]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG1; + buf[1] = acc->resume_state[RES_INT_CFG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS2); + buf[1] = acc->resume_state[RES_INT_THS2]; + buf[2] = acc->resume_state[RES_INT_DUR2]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG2; + buf[1] = acc->resume_state[RES_INT_CFG2]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | CTRL_REG2); + buf[1] = acc->resume_state[RES_CTRL_REG2]; + buf[2] = acc->resume_state[RES_CTRL_REG3]; + buf[3] = acc->resume_state[RES_CTRL_REG4]; + buf[4] = acc->resume_state[RES_CTRL_REG5]; + buf[5] = acc->resume_state[RES_CTRL_REG6]; + err = lis3dh_acc_i2c_write(acc, buf, 5); + if (err < 0) + goto error1; + + acc->hw_initialized = 1; + pr_debug("%s: hw init done\n", LIS3DH_ACC_DEV_NAME); + return 0; + +error_firstread: + acc->hw_working = 0; + dev_warn(&acc->client->dev, "Error reading WHO_AM_I: is device " + "available/working?\n"); + goto error1; +error_unknown_device: + dev_err(&acc->client->dev, + "device unknown. Expected: 0x%x," + " Replies: 0x%x\n", WHOAMI_LIS3DH_ACC, buf[0]); +error1: + acc->hw_initialized = 0; + dev_err(&acc->client->dev, "hw init error 0x%x,0x%x: %d\n", buf[0], + buf[1], err); + return err; +} + +static void lis3dh_acc_device_power_off(struct lis3dh_acc_data *acc) +{ + int err; + u8 buf[2] = { CTRL_REG1, LIS3DH_ACC_PM_OFF }; + + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + dev_err(&acc->client->dev, "soft power off failed: %d\n", err); + + if (acc->pdata->power_off) { + if (acc->irq1 != 0) + disable_irq_nosync(acc->irq1); + if (acc->irq2 != 0) + disable_irq_nosync(acc->irq2); + acc->pdata->power_off(); + acc->hw_initialized = 0; + } + if (acc->hw_initialized) { + if (acc->irq1 != 0) + disable_irq_nosync(acc->irq1); + if (acc->irq2 != 0) + disable_irq_nosync(acc->irq2); + acc->hw_initialized = 0; + } +} + +static int lis3dh_acc_device_power_on(struct lis3dh_acc_data *acc) +{ + int err = -1; + + if (acc->pdata->power_on) { + err = acc->pdata->power_on(); + if (err < 0) { + dev_err(&acc->client->dev, + "power_on failed: %d\n", err); + return err; + } + } + + if (!acc->hw_initialized) { + err = lis3dh_acc_hw_init(acc); + if (acc->hw_working == 1 && err < 0) { + lis3dh_acc_device_power_off(acc); + return err; + } + } + return 0; +} + +static irqreturn_t lis3dh_acc_isr1(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + + disable_irq_nosync(irq); + queue_work(acc->irq1_work_queue, &acc->irq1_work); + + pr_debug("%s: isr1 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} + +static irqreturn_t lis3dh_acc_isr2(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + + disable_irq_nosync(irq); + queue_work(acc->irq2_work_queue, &acc->irq2_work); + + pr_debug("%s: isr2 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} + +static void lis3dh_acc_irq1_work_func(struct work_struct *work) +{ + + /*struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq1_work); + */ + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_int1_source(acc); */ + ; + /* */ + pr_debug("%s: IRQ1 triggered\n", LIS3DH_ACC_DEV_NAME); +} + +static void lis3dh_acc_irq2_work_func(struct work_struct *work) +{ + + /*struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq2_work); + */ + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_tap_source(acc); */ + ; + /* */ + + pr_debug("%s: IRQ2 triggered\n", LIS3DH_ACC_DEV_NAME); +} + +int lis3dh_acc_update_g_range(struct lis3dh_acc_data *acc, u8 new_g_range) +{ + int err; + + u8 sensitivity; + u8 buf[2]; + u8 updated_val; + u8 init_val; + u8 new_val; + u8 mask = LIS3DH_ACC_FS_MASK | HIGH_RESOLUTION; + + pr_debug("%s\n", __func__); + + switch (new_g_range) { + case LIS3DH_ACC_G_2G: + + sensitivity = SENSITIVITY_2G; + break; + case LIS3DH_ACC_G_4G: + + sensitivity = SENSITIVITY_4G; + break; + case LIS3DH_ACC_G_8G: + + sensitivity = SENSITIVITY_8G; + break; + case LIS3DH_ACC_G_16G: + + sensitivity = SENSITIVITY_16G; + break; + default: + dev_err(&acc->client->dev, "invalid g range requested: %u\n", + new_g_range); + return -EINVAL; + } + + if (atomic_read(&acc->enabled)) { + /* Set configuration register 4, which contains g range setting + * NOTE: this is a straight overwrite because this driver does + * not use any of the other configuration bits in this + * register. Should this become untrue, we will have to read + * out the value and only change the relevant bits --XX---- + * (marked by X) */ + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error; + init_val = buf[0]; + acc->resume_state[RES_CTRL_REG4] = init_val; + new_val = new_g_range | HIGH_RESOLUTION; + updated_val = ((mask & new_val) | ((~mask) & init_val)); + buf[1] = updated_val; + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG4] = updated_val; + acc->sensitivity = sensitivity; + + pr_debug("%s sensitivity %d g-range %d\n", __func__, sensitivity,new_g_range); + } + + return 0; +error: + dev_err(&acc->client->dev, "update g range failed 0x%x,0x%x: %d\n", + buf[0], buf[1], err); + + return err; +} + +int lis3dh_acc_update_odr(struct lis3dh_acc_data *acc, int poll_interval_ms) +{ + int err = -1; + int i; + u8 config[2]; + + /* Convert the poll interval into an output data rate configuration + * that is as low as possible. The ordering of these checks must be + * maintained due to the cascading cut off values - poll intervals are + * checked from shortest to longest. At each check, if the next lower + * ODR cannot support the current poll interval, we stop searching */ + for (i = ARRAY_SIZE(lis3dh_acc_odr_table) - 1; i >= 0; i--) { + if (lis3dh_acc_odr_table[i].cutoff_ms <= poll_interval_ms) + break; + } + config[1] = lis3dh_acc_odr_table[i].mask; + + config[1] |= LIS3DH_ACC_ENABLE_ALL_AXES; + + /* If device is currently enabled, we need to write new + * configuration out to it */ + if (atomic_read(&acc->enabled)) { + config[0] = CTRL_REG1; + err = lis3dh_acc_i2c_write(acc, config, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG1] = config[1]; + } + + return 0; + +error: + dev_err(&acc->client->dev, "update odr failed 0x%x,0x%x: %d\n", + config[0], config[1], err); + + return err; +} + +/* */ + +static int lis3dh_acc_register_write(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address, u8 new_value) +{ + int err = -1; + + if (atomic_read(&acc->enabled)) { + /* Sets configuration register at reg_address + * NOTE: this is a straight overwrite */ + buf[0] = reg_address; + buf[1] = new_value; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + return err; + } + return err; +} + +static int lis3dh_acc_register_read(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address) +{ + + int err = -1; + buf[0] = (reg_address); + err = lis3dh_acc_i2c_read(acc, buf, 1); + return err; +} + +static int lis3dh_acc_register_update(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address, u8 mask, + u8 new_bit_values) +{ + int err = -1; + u8 init_val; + u8 updated_val; + err = lis3dh_acc_register_read(acc, buf, reg_address); + if (!(err < 0)) { + init_val = buf[1]; + updated_val = ((mask & new_bit_values) | ((~mask) & init_val)); + err = lis3dh_acc_register_write(acc, buf, reg_address, + updated_val); + } + return err; +} + +/* */ + +static int lis3dh_acc_get_acceleration_data(struct lis3dh_acc_data *acc, + int *xyz) +{ + int err = -1; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[6]; + /* x,y,z hardware data */ + s16 hw_d[3] = { 0 }; + + acc_data[0] = (I2C_AUTO_INCREMENT | AXISDATA_REG); + err = lis3dh_acc_i2c_read(acc, acc_data, 6); + + if (err < 0) { + pr_debug("%s I2C read error %d\n", LIS3DH_ACC_I2C_NAME, + err); + return err; + } + + hw_d[0] = (((s16) ((acc_data[1] << 8) | acc_data[0])) >> 4); + hw_d[1] = (((s16) ((acc_data[3] << 8) | acc_data[2])) >> 4); + hw_d[2] = (((s16) ((acc_data[5] << 8) | acc_data[4])) >> 4); + + hw_d[0] = hw_d[0] * acc->sensitivity; + hw_d[1] = hw_d[1] * acc->sensitivity; + hw_d[2] = hw_d[2] * acc->sensitivity; + + xyz[0] = ((acc->pdata->negate_x) ? (-hw_d[acc->pdata->axis_map_x]) + : (hw_d[acc->pdata->axis_map_x])); + xyz[1] = ((acc->pdata->negate_y) ? (-hw_d[acc->pdata->axis_map_y]) + : (hw_d[acc->pdata->axis_map_y])); + xyz[2] = ((acc->pdata->negate_z) ? (-hw_d[acc->pdata->axis_map_z]) + : (hw_d[acc->pdata->axis_map_z])); + + pr_debug("%s read x=%d, y=%d, z=%d\n", + LIS3DH_ACC_DEV_NAME, xyz[0], xyz[1], xyz[2]); + + return err; +} + +static void lis3dh_acc_report_values(struct lis3dh_acc_data *acc, int *xyz) +{ + input_report_abs(acc->input_dev, ABS_X, xyz[0]); + input_report_abs(acc->input_dev, ABS_Y, xyz[1]); + input_report_abs(acc->input_dev, ABS_Z, xyz[2]); + input_sync(acc->input_dev); +} + +static int lis3dh_acc_enable(struct lis3dh_acc_data *acc) +{ + int err; + printk("sprd-gsensor: -- %s -- !\n",__func__); + if (!atomic_cmpxchg(&acc->enabled, 0, 1)) { + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + atomic_set(&acc->enabled, 0); + return err; + } + + if (acc->hw_initialized) { + if (acc->irq1 != 0) + enable_irq(acc->irq1); + if (acc->irq2 != 0) + enable_irq(acc->irq2); + pr_debug("%s: power on: irq enabled\n", + LIS3DH_ACC_DEV_NAME); + } + + schedule_delayed_work(&acc->input_work, + msecs_to_jiffies(acc->pdata-> + poll_interval)); + } + printk("sprd-gsensor: -- %s -- success!\n",__func__); + return 0; +} + +static int lis3dh_acc_disable(struct lis3dh_acc_data *acc) +{ + printk("sprd-gsensor: -- %s -- \n",__func__); + if (atomic_cmpxchg(&acc->enabled, 1, 0)) { + cancel_delayed_work_sync(&acc->input_work); + lis3dh_acc_device_power_off(acc); + } + + return 0; +} + +static int lis3dh_acc_misc_open(struct inode *inode, struct file *file) +{ + int err; + err = nonseekable_open(inode, file); + if (err < 0) + return err; + + file->private_data = lis3dh_acc_misc_data; + + return 0; +} + +static long lis3dh_acc_misc_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + void __user *argp = (void __user *)arg; + u8 buf[4]; + u8 mask; + u8 reg_address; + u8 bit_values; + int err; + int interval; + int xyz[3] = { 0 }; + struct lis3dh_acc_data *acc = file->private_data; + + switch (cmd) { + case LIS3DH_ACC_IOCTL_GET_DELAY: + interval = acc->pdata->poll_interval; + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EFAULT; + break; + + case LIS3DH_ACC_IOCTL_SET_DELAY: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval < 0 || interval > 1000) + return -EINVAL; + + acc->pdata->poll_interval = max(interval, + acc->pdata->min_interval); +err = lis3dh_acc_update_odr(acc, 2); + /* TODO: if update fails poll is still set */ + if (err < 0) + return err; + break; + + case LIS3DH_ACC_IOCTL_SET_ENABLE: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval > 1) + return -EINVAL; + if (interval) + err = lis3dh_acc_enable(acc); + else + err = lis3dh_acc_disable(acc); + return err; + break; + + case LIS3DH_ACC_IOCTL_GET_ENABLE: + interval = atomic_read(&acc->enabled); + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_G_RANGE: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + bit_values = buf[0]; + err = lis3dh_acc_update_g_range(acc, bit_values); + if (err < 0) + return err; + break; + +#ifdef INTERRUPT_MANAGEMENT + case LIS3DH_ACC_IOCTL_SET_CTRL_REG3: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG3; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG3] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_CTRL_REG3])); + break; + + case LIS3DH_ACC_IOCTL_SET_CTRL_REG6: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG6; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG6] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_CTRL_REG6])); + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_DUR1])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_THS1])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG1: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG1; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_CFG1])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE1: + err = lis3dh_acc_register_read(acc, buf, INT_SRC1); + if (err < 0) + return err; + + pr_debug("INT1_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_DUR2])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_THS2])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG2: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG2; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_CFG2])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE2: + err = lis3dh_acc_register_read(acc, buf, INT_SRC2); + if (err < 0) + return err; + + pr_debug("INT2_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_GET_TAP_SOURCE: + err = lis3dh_acc_register_read(acc, buf, TT_SRC); + if (err < 0) + return err; + pr_debug("TT_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) { + pr_err("%s: %s error in copy_to_user \n", + LIS3DH_ACC_DEV_NAME, __func__); + return -EINVAL; + } + break; + case LIS3DH_ACC_IOCTL_GET_COOR_XYZ: + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + return err; + + if (copy_to_user(argp, xyz, sizeof(xyz))) { + pr_err(" %s %d error in copy_to_user \n", + __func__, __LINE__); + return -EINVAL; + } + break; + case LIS3DH_ACC_IOCTL_SET_TAP_CFG: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_CFG; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_CFG] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_CFG])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLIM: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_LIM; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_LIM] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_LIM])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_THS: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_THS; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_THS] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_THS])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLAT: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TLAT; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TLAT] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_TLAT])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TW: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TW; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TW] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_TW])); + break; + +#endif /* INTERRUPT_MANAGEMENT */ + case LIS3DH_ACC_IOCTL_GET_CHIP_ID: + { + u8 devid = 0; + u8 devinfo[DEVICE_INFO_LEN] = {0}; + err = lis3dh_acc_register_read(acc, &devid, WHO_AM_I); + if (err < 0) { + printk("__func__, error read register WHO_AM_I\n", __func__); + return -EAGAIN; + } + sprintf(devinfo, "%s, %#x", DEVICE_INFO, devid); + + if (copy_to_user(argp, devinfo, sizeof(devinfo))) { + printk("%s error in copy_to_user(IOCTL_GET_CHIP_ID)\n", __func__); + return -EINVAL; + } + } + break; + default: + return -EINVAL; + } + + return 0; +} + +static const struct file_operations lis3dh_acc_misc_fops = { + .owner = THIS_MODULE, + .open = lis3dh_acc_misc_open, + .unlocked_ioctl = lis3dh_acc_misc_ioctl, +}; + +static struct miscdevice lis3dh_acc_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = LIS3DH_ACC_DEV_NAME, + .fops = &lis3dh_acc_misc_fops, +}; + +static void lis3dh_acc_input_work_func(struct work_struct *work) +{ + struct lis3dh_acc_data *acc; + + int xyz[3] = { 0 }; + int err; + + acc = container_of((struct delayed_work *)work, + struct lis3dh_acc_data, input_work); + + mutex_lock(&acc->lock); + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + dev_err(&acc->client->dev, "get_acceleration_data failed\n"); + else + lis3dh_acc_report_values(acc, xyz); + + schedule_delayed_work(&acc->input_work, + msecs_to_jiffies(acc->pdata->poll_interval)); + mutex_unlock(&acc->lock); +} + +#ifdef LIS3DH_OPEN_ENABLE +int lis3dh_acc_input_open(struct input_dev *input) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(input); + + return lis3dh_acc_enable(acc); +} + +void lis3dh_acc_input_close(struct input_dev *dev) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(dev); + + lis3dh_acc_disable(acc); +} +#endif + +static int lis3dh_acc_validate_pdata(struct lis3dh_acc_data *acc) +{ + acc->pdata->poll_interval = max(acc->pdata->poll_interval, + acc->pdata->min_interval); + + if (acc->pdata->axis_map_x > 2 || acc->pdata->axis_map_y > 2 + || acc->pdata->axis_map_z > 2) { + dev_err(&acc->client->dev, "invalid axis_map value " + "x:%u y:%u z%u\n", acc->pdata->axis_map_x, + acc->pdata->axis_map_y, acc->pdata->axis_map_z); + return -EINVAL; + } + + /* Only allow 0 and 1 for negation boolean flag */ + if (acc->pdata->negate_x > 1 || acc->pdata->negate_y > 1 + || acc->pdata->negate_z > 1) { + dev_err(&acc->client->dev, "invalid negate value " + "x:%u y:%u z:%u\n", acc->pdata->negate_x, + acc->pdata->negate_y, acc->pdata->negate_z); + return -EINVAL; + } + + /* Enforce minimum polling interval */ + if (acc->pdata->poll_interval < acc->pdata->min_interval) { + dev_err(&acc->client->dev, "minimum poll interval violated\n"); + return -EINVAL; + } + + return 0; +} + +static int lis3dh_acc_input_init(struct lis3dh_acc_data *acc) +{ + int err; + /* Polling rx data when the interrupt is not used.*/ + if (1 /*acc->irq1 == 0 && acc->irq1 == 0 */ ) { + INIT_DELAYED_WORK(&acc->input_work, lis3dh_acc_input_work_func); + } + + acc->input_dev = input_allocate_device(); + if (!acc->input_dev) { + err = -ENOMEM; + dev_err(&acc->client->dev, "input device allocate failed\n"); + goto err0; + } +#ifdef LIS3DH_ACC_OPEN_ENABLE + acc->input_dev->open = lis3dh_acc_input_open; + acc->input_dev->close = lis3dh_acc_input_close; +#endif + + input_set_drvdata(acc->input_dev, acc); + + set_bit(EV_ABS, acc->input_dev->evbit); + /* next is used for interruptA sources data if the case */ + set_bit(ABS_MISC, acc->input_dev->absbit); + /* next is used for interruptB sources data if the case */ + set_bit(ABS_WHEEL, acc->input_dev->absbit); + + input_set_abs_params(acc->input_dev, ABS_X, -G_MAX, G_MAX, 0, 0); + input_set_abs_params(acc->input_dev, ABS_Y, -G_MAX, G_MAX, 0, 0); + input_set_abs_params(acc->input_dev, ABS_Z, -G_MAX, G_MAX, 0, 0); + /* next is used for interruptA sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_MISC, INT_MIN, INT_MAX, 0, 0); + /* next is used for interruptB sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_WHEEL, INT_MIN, INT_MAX, 0, 0); + + acc->input_dev->name = "accelerometer"; + + err = input_register_device(acc->input_dev); + if (err) { + dev_err(&acc->client->dev, + "unable to register input polled device %s\n", + acc->input_dev->name); + goto err1; + } + + return 0; + +err1: + input_free_device(acc->input_dev); +err0: + return err; +} + +static void lis3dh_acc_input_cleanup(struct lis3dh_acc_data *acc) +{ + input_unregister_device(acc->input_dev); + input_free_device(acc->input_dev); +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void lis3dh_early_suspend(struct early_suspend *es); +static void lis3dh_early_resume(struct early_suspend *es); +#endif + +#ifdef CONFIG_OF +static struct lis3dh_acc_platform_data *lis3dh_acc_parse_dt(struct device *dev) +{ + struct lis3dh_acc_platform_data *pdata; + struct device_node *np = dev->of_node; + int ret; + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct lis3dh_acc_platform_data"); + return NULL; + } + ret = of_property_read_u32(np, "poll_interval", &pdata->poll_interval); + if(ret){ + dev_err(dev, "fail to get poll_interval\n"); + goto fail; + } + ret = of_property_read_u32(np, "min_interval", &pdata->min_interval); + if(ret){ + dev_err(dev, "fail to get min_interval\n"); + goto fail; + } + ret = of_property_read_u32(np, "g_range", &pdata->g_range); + if(ret){ + dev_err(dev, "fail to get g_range\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_x", &pdata->axis_map_x); + if(ret){ + dev_err(dev, "fail to get axis_map_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_y", &pdata->axis_map_y); + if(ret){ + dev_err(dev, "fail to get axis_map_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_z", &pdata->axis_map_z); + if(ret){ + dev_err(dev, "fail to get axis_map_z\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_x", &pdata->negate_x); + if(ret){ + dev_err(dev, "fail to get negate_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_y", &pdata->negate_y); + if(ret){ + dev_err(dev, "fail to get negate_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_z", &pdata->negate_z); + if(ret){ + dev_err(dev, "fail to get negate_z\n"); + goto fail; + } + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif +static int lis3dh_acc_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + + struct lis3dh_acc_data *acc; + struct lis3dh_acc_platform_data *pdata = client->dev.platform_data; + + int err = -1; + int tempvalue; + printk("sprd-gsensor: -- %s -- start !\n",__func__); + pr_debug("%s: probe start.\n", LIS3DH_ACC_DEV_NAME); + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = lis3dh_acc_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } + if(!pdata){ + err = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } +#endif + /* + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "platform data is NULL. exiting.\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "client not i2c capable\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "client not smb-i2c capable:2\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { + dev_err(&client->dev, "client not smb-i2c capable:3\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + /* + * OK. From now, we presume we have a valid client. We now create the + * client structure, even though we cannot fill it completely yet. + */ + + acc = kzalloc(sizeof(struct lis3dh_acc_data), GFP_KERNEL); + if (acc == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for module data: " + "%d\n", err); + goto exit_alloc_data_failed; + } + + mutex_init(&acc->lock); + mutex_lock(&acc->lock); + + acc->client = client; + lis3dh_i2c_client = client; + i2c_set_clientdata(client, acc); + + pr_debug("%s: %s has set irq1 to irq: %d\n", + LIS3DH_ACC_DEV_NAME, __func__, acc->irq1); + pr_debug("%s: %s has set irq2 to irq: %d\n", + LIS3DH_ACC_DEV_NAME, __func__, acc->irq2); + + gpio_request(GSENSOR_GINT1_GPI, "GSENSOR_INT1"); + gpio_request(GSENSOR_GINT2_GPI, "GSENSOR_INT2"); + acc->irq1 = 0; /* gpio_to_irq(GSENSOR_GINT1_GPI); */ + acc->irq2 = 0; /* gpio_to_irq(GSENSOR_GINT2_GPI); */ + + if (acc->irq1 != 0) { + pr_debug("%s request irq1\n", __func__); + err = + request_irq(acc->irq1, lis3dh_acc_isr1, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq1", acc); + if (err < 0) { + dev_err(&client->dev, "request irq1 failed: %d\n", err); + goto err_mutexunlockfreedata; + } + disable_irq_nosync(acc->irq1); + + INIT_WORK(&acc->irq1_work, lis3dh_acc_irq1_work_func); + acc->irq1_work_queue = + create_singlethread_workqueue("lis3dh_acc_wq1"); + if (!acc->irq1_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue1: %d\n", + err); + goto err_free_irq1; + } + } + + if (acc->irq2 != 0) { + err = + request_irq(acc->irq2, lis3dh_acc_isr2, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq2", acc); + if (err < 0) { + dev_err(&client->dev, "request irq2 failed: %d\n", err); + goto err_destoyworkqueue1; + } + disable_irq_nosync(acc->irq2); + +/* Create workqueue for IRQ.*/ + + INIT_WORK(&acc->irq2_work, lis3dh_acc_irq2_work_func); + acc->irq2_work_queue = + create_singlethread_workqueue("lis3dh_acc_wq2"); + if (!acc->irq2_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue2: %d\n", + err); + goto err_free_irq2; + } + } + + acc->pdata = kmalloc(sizeof(*acc->pdata), GFP_KERNEL); + if (acc->pdata == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for pdata: %d\n", err); + goto err_destoyworkqueue2; + } + + memcpy(acc->pdata, client->dev.platform_data, sizeof(*acc->pdata)); + + err = lis3dh_acc_validate_pdata(acc); + if (err < 0) { + dev_err(&client->dev, "failed to validate platform data\n"); + goto exit_kfree_pdata; + } + + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + dev_err(&client->dev, "power on failed: %d\n", err); + goto err2; + } + +#if 1 + if (i2c_smbus_read_byte(client) < 0) { + pr_err("i2c_smbus_read_byte error!!\n"); + goto err_destoyworkqueue2; + } else { + pr_debug("%s Device detected!\n", LIS3DH_ACC_DEV_NAME); + } +#endif + /* read chip id */ + + tempvalue = i2c_smbus_read_word_data(client, WHO_AM_I); + + if ((tempvalue & 0x00FF) == WHOAMI_LIS3DH_ACC) { + pr_debug("%s I2C driver registered!\n", + LIS3DH_ACC_DEV_NAME); + } else { + acc->client = NULL; + pr_debug("I2C driver not registered!" + " Device unknown 0x%x\n", tempvalue); + goto err_destoyworkqueue2; + } + + i2c_set_clientdata(client, acc); + + if (acc->pdata->init) { + err = acc->pdata->init(); + if (err < 0) { + dev_err(&client->dev, "init failed: %d\n", err); + goto err2; + } + } + + memset(acc->resume_state, 0, ARRAY_SIZE(acc->resume_state)); + + acc->resume_state[RES_CTRL_REG1] = LIS3DH_ACC_ENABLE_ALL_AXES; + acc->resume_state[RES_CTRL_REG2] = 0x00; + acc->resume_state[RES_CTRL_REG3] = 0x00; + acc->resume_state[RES_CTRL_REG4] = 0x00; + acc->resume_state[RES_CTRL_REG5] = 0x00; + acc->resume_state[RES_CTRL_REG6] = 0x00; + + acc->resume_state[RES_TEMP_CFG_REG] = 0x00; + acc->resume_state[RES_FIFO_CTRL_REG] = 0x00; + acc->resume_state[RES_INT_CFG1] = 0x00; + acc->resume_state[RES_INT_THS1] = 0x00; + acc->resume_state[RES_INT_DUR1] = 0x00; + acc->resume_state[RES_INT_CFG2] = 0x00; + acc->resume_state[RES_INT_THS2] = 0x00; + acc->resume_state[RES_INT_DUR2] = 0x00; + + acc->resume_state[RES_TT_CFG] = 0x00; + acc->resume_state[RES_TT_THS] = 0x00; + acc->resume_state[RES_TT_LIM] = 0x00; + acc->resume_state[RES_TT_TLAT] = 0x00; + acc->resume_state[RES_TT_TW] = 0x00; + + + atomic_set(&acc->enabled, 1); + + err = lis3dh_acc_update_g_range(acc, acc->pdata->g_range); + if (err < 0) { + dev_err(&client->dev, "update_g_range failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + if (err < 0) { + dev_err(&client->dev, "update_odr failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_input_init(acc); + if (err < 0) { + dev_err(&client->dev, "input init failed\n"); + goto err_power_off; + } + lis3dh_acc_misc_data = acc; + + err = misc_register(&lis3dh_acc_misc_device); + if (err < 0) { + dev_err(&client->dev, + "misc LIS3DH_ACC_DEV_NAME register failed\n"); + goto err_input_cleanup; + } + + lis3dh_acc_device_power_off(acc); + + /* As default, do not report information */ + atomic_set(&acc->enabled, 0); +/* +#ifdef CONFIG_HAS_EARLYSUSPEND + acc->early_suspend.suspend = lis3dh_early_suspend; + acc->early_suspend.resume = lis3dh_early_resume; + acc->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + register_early_suspend(&acc->early_suspend); +#endif +*/ + mutex_unlock(&acc->lock); + dev_info(&client->dev, "###%s###\n", __func__); + printk("sprd-gsensor: -- %s -- success !\n",__func__); + return 0; + +err_input_cleanup: + lis3dh_acc_input_cleanup(acc); +err_power_off: + lis3dh_acc_device_power_off(acc); +err2: + if (acc->pdata->exit) + acc->pdata->exit(); +exit_kfree_pdata: + kfree(acc->pdata); +err_destoyworkqueue2: + if (acc->irq2_work_queue) + destroy_workqueue(acc->irq2_work_queue); +err_free_irq2: + if (acc->irq2) { + free_irq(acc->irq2, acc); + gpio_free(GSENSOR_GINT2_GPI); + } +err_destoyworkqueue1: + if (acc->irq1_work_queue) + destroy_workqueue(acc->irq1_work_queue); +err_free_irq1: + if (acc->irq1) { + free_irq(acc->irq1, acc); + gpio_free(GSENSOR_GINT1_GPI); + } +err_mutexunlockfreedata: + i2c_set_clientdata(client, NULL); + mutex_unlock(&acc->lock); + kfree(acc); + lis3dh_acc_misc_data = NULL; +exit_alloc_data_failed: +exit_check_functionality_failed: + pr_err("%s: Driver Init failed\n", LIS3DH_ACC_DEV_NAME); +exit_alloc_platform_data_failed: + return err; +} + +static int lis3dh_acc_remove(struct i2c_client *client) +{ + /* TODO: revisit ordering here once _probe order is finalized */ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + if (acc != NULL) { + if (acc->irq1) { + free_irq(acc->irq1, acc); + gpio_free(GSENSOR_GINT1_GPI); + } + if (acc->irq2) { + free_irq(acc->irq2, acc); + gpio_free(GSENSOR_GINT2_GPI); + } + + if (acc->irq1_work_queue) + destroy_workqueue(acc->irq1_work_queue); + if (acc->irq2_work_queue) + destroy_workqueue(acc->irq2_work_queue); + misc_deregister(&lis3dh_acc_misc_device); + lis3dh_acc_input_cleanup(acc); + lis3dh_acc_device_power_off(acc); + if (acc->pdata->exit) + acc->pdata->exit(); + kfree(acc->pdata); + kfree(acc); + } + + return 0; +} + +static int lis3dh_acc_resume(struct i2c_client *client) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + printk("sprd-gsensor: -- %s -- !\n",__func__); + dev_dbg(&client->dev, "###%s###\n", __func__); + + if (acc != NULL && acc->on_before_suspend) + return lis3dh_acc_enable(acc); + + return 0; +} + +static int lis3dh_acc_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + printk("sprd-gsensor: -- %s -- !\n",__func__); + dev_dbg(&client->dev, "###%s###\n", __func__); + + if (acc != NULL) { + acc->on_before_suspend = atomic_read(&acc->enabled); + return lis3dh_acc_disable(acc); + } + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND + +static void lis3dh_early_suspend(struct early_suspend *es) +{ + lis3dh_acc_suspend(lis3dh_i2c_client, (pm_message_t) { + .event = 0}); +} + +static void lis3dh_early_resume(struct early_suspend *es) +{ + lis3dh_acc_resume(lis3dh_i2c_client); +} + +#endif /* CONFIG_HAS_EARLYSUSPEND */ + +static const struct i2c_device_id lis3dh_acc_id[] += { {LIS3DH_ACC_DEV_NAME, 0}, {}, }; + +MODULE_DEVICE_TABLE(i2c, lis3dh_acc_id); + +static const struct of_device_id lis3dh_acc_of_match[] = { + { .compatible = "ST,lis3dh_acc", }, + { } +}; +MODULE_DEVICE_TABLE(of, lis3dh_acc_of_match); +static struct i2c_driver lis3dh_acc_driver = { + .driver = { + .name = LIS3DH_ACC_I2C_NAME, + .of_match_table = lis3dh_acc_of_match, + }, + .probe = lis3dh_acc_probe, + .remove = lis3dh_acc_remove, + .resume = lis3dh_acc_resume, + .suspend = lis3dh_acc_suspend, + .id_table = lis3dh_acc_id, +}; + + +static int __init lis3dh_acc_init(void) +{ + pr_debug("%s accelerometer driver: init\n", LIS3DH_ACC_I2C_NAME); + + return i2c_add_driver(&lis3dh_acc_driver); +} + +static void __exit lis3dh_acc_exit(void) +{ + pr_debug("%s accelerometer driver exit\n", LIS3DH_ACC_DEV_NAME); + + i2c_del_driver(&lis3dh_acc_driver); + return; +} + +module_init(lis3dh_acc_init); +module_exit(lis3dh_acc_exit); + +MODULE_DESCRIPTION("lis3dh accelerometer misc driver"); +MODULE_AUTHOR("STMicroelectronics"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/lis3dh_interrupt.c b/drivers/input/misc/lis3dh_interrupt.c new file mode 100644 index 00000000..ba801834 --- /dev/null +++ b/drivers/input/misc/lis3dh_interrupt.c @@ -0,0 +1,2261 @@ +/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** + * + * File Name : lis3dh_acc.c + * Authors : MSH - Motion Mems BU - Application Team + * : Carmine Iascone (carmine.iascone@st.com) + * : Matteo Dameno (matteo.dameno@st.com) + * Version : V.1.0.5 + * Date : 16/08/2010 + * Description : LIS3DH accelerometer sensor API + * + ******************************************************************************* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE + * PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT. + * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, + * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE + * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING + * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS. + * + ****************************************************************************** + Revision 1.0.0 05/11/09 + First Release + Revision 1.0.3 22/01/2010 + Linux K&R Compliant Release; + Revision 1.0.5 16/08/2010 + modified _get_acceleration_data function + modified _update_odr function + manages 2 interrupts + + ******************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#define INTERRUPT_MANAGEMENT 1 + +#define G_MAX 16000 /** Maximum polled-device-reported g value */ + +/* +#define SHIFT_ADJ_2G 4 +#define SHIFT_ADJ_4G 3 +#define SHIFT_ADJ_8G 2 +#define SHIFT_ADJ_16G 1 +*/ +#define GSENSOR_INTERRUPT_MODE + +#define SENSITIVITY_2G 1 /** mg/LSB */ +#define SENSITIVITY_4G 2 /** mg/LSB */ +#define SENSITIVITY_8G 4 /** mg/LSB */ +#define SENSITIVITY_16G 12 /** mg/LSB */ + +#define HIGH_RESOLUTION 0x08 + +#define AXISDATA_REG 0x28 +#define WHOAMI_LIS3DH_ACC 0x33 /* Expctd content for WAI */ + +/* CONTROL REGISTERS */ +#define WHO_AM_I 0x0F /* WhoAmI register */ +#define TEMP_CFG_REG 0x1F /* temper sens control reg */ +/* ctrl 1: ODR3 ODR2 ODR ODR0 LPen Zenable Yenable Zenable */ +#define CTRL_REG1 0x20 /* control reg 1 */ +#define CTRL_REG2 0x21 /* control reg 2 */ +#define CTRL_REG3 0x22 /* control reg 3 */ +#define CTRL_REG4 0x23 /* control reg 4 */ +#define CTRL_REG5 0x24 /* control reg 5 */ +#define CTRL_REG6 0x25 /* control reg 6 */ + +#define FIFO_CTRL_REG 0x2E /* FiFo control reg */ + +#define INT_CFG1 0x30 /* interrupt 1 config */ +#define INT_SRC1 0x31 /* interrupt 1 source */ +#define INT_THS1 0x32 /* interrupt 1 threshold */ +#define INT_DUR1 0x33 /* interrupt 1 duration */ + +#define INT_CFG2 0x34 /* interrupt 2 config */ +#define INT_SRC2 0x35 /* interrupt 2 source */ +#define INT_THS2 0x36 /* interrupt 2 threshold */ +#define INT_DUR2 0x37 /* interrupt 2 duration */ + +#define TT_CFG 0x38 /* tap config */ +#define TT_SRC 0x39 /* tap source */ +#define TT_THS 0x3A /* tap threshold */ +#define TT_LIM 0x3B /* tap time limit */ +#define TT_TLAT 0x3C /* tap time latency */ +#define TT_TW 0x3D /* tap time window */ +/* end CONTROL REGISTRES */ + +#define ENABLE_HIGH_RESOLUTION 1 + +#define LIS3DH_ACC_PM_OFF 0x00 +#define LIS3DH_ACC_ENABLE_ALL_AXES 0x07 + +#define PMODE_MASK 0x08 +#define ODR_MASK 0XF0 + +#define ODR1 0x10 /* 1Hz output data rate */ +#define ODR10 0x20 /* 10Hz output data rate */ +#define ODR25 0x30 /* 25Hz output data rate */ +#define ODR50 0x40 /* 50Hz output data rate */ +#define ODR100 0x50 /* 100Hz output data rate */ +#define ODR200 0x60 /* 200Hz output data rate */ +#define ODR400 0x70 /* 400Hz output data rate */ +#define ODR1250 0x90 /* 1250Hz output data rate : test actually 650hz*/ + +#define IA 0x40 +#define ZH 0x20 +#define ZL 0x10 +#define YH 0x08 +#define YL 0x04 +#define XH 0x02 +#define XL 0x01 +/* */ +/* CTRL REG BITS*/ +#define CTRL_REG3_I1_AOI1 0x40 +#define CTRL_REG6_I2_TAPEN 0x80 +/* +CTRL_REG3 (22h) µÄI1_DRDY1 λ enable +CTRL_REG5 (24h) LIR_INT1 1 Ϊ ´¥·¢ÖÐ¶Ï ºó Öжϱ£³Ö£¬0 Ϊ Âö³å +CTRL_REG6 (25h) 0 ΪÖÐ¶Ï ¸ßÓÐЧ£¬ 1 ΪÖжϵÍÓÐЧ +********must read data then will interrupter,****** +*/ +#define CTRL_REG3_I1_DRDY1 0x10 //DRDY1 interrupt on INT1 +#define CTRL_REG5_LIR_INT1 0x08 //latch interrupt +//#define CTRL_REG6_HLACTIVE 0x02 //low +#define CTRL_REG6_HLACTIVE 0x00 //high + + +/* */ + +/* TAP_SOURCE_REG BIT */ +#define DTAP 0x20 +#define STAP 0x10 +#define SIGNTAP 0x08 +#define ZTAP 0x04 +#define YTAP 0x02 +#define XTAZ 0x01 + +#define FUZZ 32 +#define FLAT 32 +#define I2C_RETRY_DELAY 5 +#define I2C_RETRIES 5 +#define I2C_AUTO_INCREMENT 0x80 + +/* RESUME STATE INDICES */ +#define RES_CTRL_REG1 0 +#define RES_CTRL_REG2 1 +#define RES_CTRL_REG3 2 +#define RES_CTRL_REG4 3 +#define RES_CTRL_REG5 4 +#define RES_CTRL_REG6 5 + +#define RES_INT_CFG1 6 +#define RES_INT_THS1 7 +#define RES_INT_DUR1 8 +#define RES_INT_CFG2 9 +#define RES_INT_THS2 10 +#define RES_INT_DUR2 11 + +#define RES_TT_CFG 12 +#define RES_TT_THS 13 +#define RES_TT_LIM 14 +#define RES_TT_TLAT 15 +#define RES_TT_TW 16 + +#define RES_TEMP_CFG_REG 17 +#define RES_REFERENCE_REG 18 +#define RES_FIFO_CTRL_REG 19 + +#define RESUME_ENTRIES 20 +#define DEVICE_INFO "ST, LIS3DH" +#define DEVICE_INFO_LEN 32 +/* end RESUME STATE INDICES */ + +//#define GSENSOR_GINT1_GPI 238 +#define GSENSOR_GINT2_GPI 1 + +#define LOG_TAG "[LIS3DH] " +#define LOG_FUN( ) printk(KERN_INFO LOG_TAG"%s\n", __FUNCTION__) +#define LOG_INFO(fmt, args...) printk(KERN_INFO LOG_TAG fmt, ##args) +#define LOG_ERR(fmt, args...) printk(KERN_ERR LOG_TAG"%s %d : "fmt, __FUNCTION__, __LINE__, ##args) + +//#define LIS3DH_DBG +#define GSENSOR_INTERRUPT_MODE +#define USE_WAIT_QUEUE 1 +#if USE_WAIT_QUEUE +static struct task_struct *thread = NULL; +static DECLARE_WAIT_QUEUE_HEAD(waiter); +static int gsensor_flag = 0; +#endif + +struct { + unsigned int cutoff_ms; + unsigned int mask; +} lis3dh_acc_odr_table[] = { + { + 1, ODR1250}, { + 2, ODR400}, { + 5, ODR200}, { + 10, ODR100}, { + 20, ODR50}, { + 40, ODR25}, { + 100, ODR10}, { + 1000, ODR1},}; + +struct lis3dh_acc_data { + struct i2c_client *client; + struct lis3dh_acc_platform_data *pdata; + + struct mutex lock; + struct delayed_work input_work; + + struct input_dev *input_dev; + + int hw_initialized; + /* hw_working=-1 means not tested yet */ + int hw_working; + atomic_t enabled; + int on_before_suspend; + + u8 sensitivity; + + u8 resume_state[RESUME_ENTRIES]; + +// int irq1_gpio_number; + int irq1; + struct work_struct irq1_work; + struct workqueue_struct *irq1_work_queue; + int irq2; + struct work_struct irq2_work; + struct workqueue_struct *irq2_work_queue; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif +#ifdef LIS3DH_DBG +struct { + u8 diag_reg_addr_wr; + u8 diag_reg_val_wr; + } debug; + u64 data_num; +#endif +}; + +/* + * Because misc devices can not carry a pointer from driver register to + * open, we keep this global. This limits the driver to a single instance. + */ +struct lis3dh_acc_data *lis3dh_acc_misc_data; +struct i2c_client *lis3dh_i2c_client; + +#ifndef GSENSOR_INTERRUPT_MODE +static struct workqueue_struct *_gSensorWork_workqueue = NULL; +#endif + +static int lis3dh_acc_get_acceleration_data(struct lis3dh_acc_data *acc,int *xyz); +static void lis3dh_acc_report_values(struct lis3dh_acc_data *acc, int *xyz); + +static int lis3dh_acc_i2c_read(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { + { + .addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = 1, + .buf = buf,}, + { + .addr = acc->client->addr, + .flags = (acc->client->flags & I2C_M_TEN) | I2C_M_RD, + .len = len, + .buf = buf,}, + }; + + do { + err = i2c_transfer(acc->client->adapter, msgs, 2); + if (err != 2){ + LOG_ERR("************* exception read transfer error,tries=%d********\n",tries); + msleep_interruptible(I2C_RETRY_DELAY); + } + } while ((err != 2) && (++tries < I2C_RETRIES)); + + if (err != 2) { + LOG_ERR(" exception read transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_i2c_write(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { {.addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = len + 1,.buf = buf,}, + }; + do { + err = i2c_transfer(acc->client->adapter, msgs, 1); + if (err != 1) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 1) && (++tries < I2C_RETRIES)); + + if (err != 1) { + dev_err(&acc->client->dev, "write transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + + +static int lis3dh_acc_register_read(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address) +{ + int err = -1; + buf[0] = (reg_address); + err = lis3dh_acc_i2c_read(acc, buf, 1); + return err; +} + +static void lis3dh_read_interrupt_reg(struct lis3dh_acc_data *acc) +{ + u8 value = 0; + int err; + + err = lis3dh_acc_register_read(acc, &value, CTRL_REG3); + LOG_INFO("REG content: =======================>\n"); + if (err >= 0) + LOG_INFO("REG content: [CTRL_REG3:0x%x]= 0x%02x\n", CTRL_REG3, value); + + err = lis3dh_acc_register_read(acc, &value, CTRL_REG5); + if (err >= 0) + LOG_INFO("REG content: [CTRL_REG5:0x%x]= 0x%02x\n", CTRL_REG5, value); + err = lis3dh_acc_register_read(acc, &value, CTRL_REG6); + if (err >= 0) + LOG_INFO("REG content: [CTRL_REG6:0x%x]= 0x%02x\n", CTRL_REG6, value); + + LOG_INFO("REG content:< =======================\n"); + +} + + + +/* if CTM want to turn off vdd & vddio , we recommend to call this function to retrive register setting */ + +static int lis3dh_acc_hw_init(struct lis3dh_acc_data *acc) +{ + int err = -1; + u8 buf[7]; + + pr_debug("%s: hw init start\n", LIS3DH_ACC_DEV_NAME); + LOG_INFO("sprd-gsensor: -- %s entry :acc-> pdata ->gpio_int1=%d-- !\n",__func__,gpio_get_value(acc-> pdata ->gpio_int1)); + + buf[0] = WHO_AM_I; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error_firstread; + else + acc->hw_working = 1; + if (buf[0] != WHOAMI_LIS3DH_ACC) { + err = -1; /* choose the right coded error */ + goto error_unknown_device; + } + + buf[0] = CTRL_REG1; + buf[1] = acc->resume_state[RES_CTRL_REG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = TEMP_CFG_REG; + buf[1] = acc->resume_state[RES_TEMP_CFG_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = FIFO_CTRL_REG; + buf[1] = acc->resume_state[RES_FIFO_CTRL_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | TT_THS); + buf[1] = acc->resume_state[RES_TT_THS]; + buf[2] = acc->resume_state[RES_TT_LIM]; + buf[3] = acc->resume_state[RES_TT_TLAT]; + buf[4] = acc->resume_state[RES_TT_TW]; + err = lis3dh_acc_i2c_write(acc, buf, 4); + if (err < 0) + goto error1; + buf[0] = TT_CFG; + buf[1] = acc->resume_state[RES_TT_CFG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS1); + buf[1] = acc->resume_state[RES_INT_THS1]; + buf[2] = acc->resume_state[RES_INT_DUR1]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG1; + buf[1] = acc->resume_state[RES_INT_CFG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS2); + buf[1] = acc->resume_state[RES_INT_THS2]; + buf[2] = acc->resume_state[RES_INT_DUR2]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG2; + buf[1] = acc->resume_state[RES_INT_CFG2]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | CTRL_REG2); + buf[1] = acc->resume_state[RES_CTRL_REG2]; + buf[2] = acc->resume_state[RES_CTRL_REG3]; + buf[3] = acc->resume_state[RES_CTRL_REG4]; + buf[4] = acc->resume_state[RES_CTRL_REG5]; + buf[5] = acc->resume_state[RES_CTRL_REG6]; + err = lis3dh_acc_i2c_write(acc, buf, 5); + if (err < 0) + goto error1; + + acc->hw_initialized = 1; + + LOG_INFO("sprd-gsensor: -- %s exit :acc-> pdata ->gpio_int1=%d-- !\n",__func__,gpio_get_value(acc-> pdata ->gpio_int1)); + + pr_debug("%s: hw init done\n", LIS3DH_ACC_DEV_NAME); + return 0; + +error_firstread: + acc->hw_working = 0; + dev_warn(&acc->client->dev, "Error reading WHO_AM_I: is device " + "available/working?\n"); + goto error1; +error_unknown_device: + dev_err(&acc->client->dev, + "device unknown. Expected: 0x%x," + " Replies: 0x%x\n", WHOAMI_LIS3DH_ACC, buf[0]); +error1: + acc->hw_initialized = 0; + dev_err(&acc->client->dev, "hw init error 0x%x,0x%x: %d\n", buf[0], + buf[1], err); + return err; +} + +static void lis3dh_acc_device_power_off(struct lis3dh_acc_data *acc) +{ + int err; + u8 buf[2] = { CTRL_REG1, LIS3DH_ACC_PM_OFF }; + int xyz[3] = { 0 }; + + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + dev_err(&acc->client->dev, "soft power off failed: %d\n", err); +#ifdef GSENSOR_INTERRUPT_MODE +/* +read data:clear interrupter +*/ + err = lis3dh_acc_get_acceleration_data(acc, xyz); +#endif + LOG_INFO("sprd-gsensor: -- %s acc-> pdata ->gpio_int1=%d acc->hw_initialized=%d-- !\n",__func__,gpio_get_value(acc-> pdata ->gpio_int1),acc->hw_initialized); + +} + +static int lis3dh_acc_device_power_on(struct lis3dh_acc_data *acc) +{ + int err = -1; + u8 buf[2]; + + + if (acc->pdata->power_on) { + err = acc->pdata->power_on(); + if (err < 0) { + dev_err(&acc->client->dev, + "power_on failed: %d\n", err); + return err; + } + } + + LOG_INFO("sprd-gsensor: -- %s acc->irq1_gpio_number=%d acc->hw_initialized=%d-- !\n",__func__,gpio_get_value(acc-> pdata ->gpio_int1),acc->hw_initialized); + buf[0] = CTRL_REG1; + buf[1] = acc->resume_state[RES_CTRL_REG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + return err; + LOG_INFO("sprd-gsensor: -- %s acc->resume_state[RES_CTRL_REG1]=0x%02x-- !\n",__func__, acc->resume_state[RES_CTRL_REG1]); + + + if (!acc->hw_initialized) { + err = lis3dh_acc_hw_init(acc); + lis3dh_read_interrupt_reg(acc); + if (acc->hw_working == 1 && err < 0) { + lis3dh_acc_device_power_off(acc); + return err; + } + } + return 0; +} + +static irqreturn_t lis3dh_acc_isr1(int irq, void *dev) +{ +#ifndef USE_WAIT_QUEUE + struct lis3dh_acc_data *acc = dev; +#endif + +#ifdef LIS3DH_DBG + static int count_intr = 0; + static s64 interrupt_last = 0; + static s64 interrupt_cur = 0; + static int poll_interval=0; + ktime_t time_mono; + + time_mono = ktime_get(); + if (poll_interval !=lis3dh_acc_misc_data->pdata->poll_interval) { + count_intr=1; + poll_interval = lis3dh_acc_misc_data->pdata->poll_interval; + interrupt_last = ktime_to_ns(time_mono); + } + interrupt_cur = ktime_to_ns(time_mono); + int interrupt_interval = interrupt_cur - interrupt_last; + interrupt_last = interrupt_cur; + + if(interrupt_interval > (lis3dh_acc_misc_data->pdata->poll_interval*1000000) +(lis3dh_acc_misc_data->pdata->poll_interval*1000000) /4) + LOG_INFO("***sprd-gsensor ISR exception:count_intr=%d,interrupt_interval=%d,poll_interva=%d********\n",count_intr++,interrupt_interval,lis3dh_acc_misc_data->pdata->poll_interval); + LOG_INFO("sprd-gsensor: -- %s entry : interrupt_interval=%d,poll_interval=%d,acc->irq1_gpio_number=%d-- >>>>>>>>>>>>>>>>>!\n",__func__,interrupt_interval,poll_interval,gpio_get_value(lis3dh_acc_misc_data->pdata->gpio_int1)); +#endif + + disable_irq_nosync(irq); +#if USE_WAIT_QUEUE + gsensor_flag = 1; + wake_up_interruptible(&waiter); +#else + queue_work(acc->irq1_work_queue, &acc->irq1_work); +#endif + pr_debug("%s: isr1 queued\n", LIS3DH_ACC_DEV_NAME); + return IRQ_HANDLED; +} + +static irqreturn_t lis3dh_acc_isr2(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + +// disable_irq_nosync(irq); + queue_work(acc->irq2_work_queue, &acc->irq2_work); + + pr_debug("%s: isr2 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} +//static int lis3dh_acc_get_acceleration_data(struct lis3dh_acc_data *acc,int *xyz); +static void lis3dh_acc_irq1_work_func(struct work_struct *work) +{ + int xyz[3] = { 0 }; + int err; + u8 value; + struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq1_work); + + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_int1_source(acc); */ + ; + /* */ + LOG_INFO("%s: isr1 queued=========>>>>>>>>>>>>>>>>>\n", __func__); + LOG_INFO("sprd-gsensor: -- %s entry :acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + + err = lis3dh_acc_register_read(acc, &value, INT_SRC1); + + if (err < 0) { + LOG_INFO("%s, error read register INT_SRC1\n", __func__); + } + LOG_INFO("%s: IRQ1 triggered INT_SRC1=0x%02x\n",__func__,value); + + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + dev_err(&acc->client->dev, "get_acceleration_data failed\n"); + else + lis3dh_acc_report_values(acc, xyz); + + + LOG_INFO("sprd-gsensor: -- %s exit :acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + enable_irq(acc->irq1); +} + + +#if USE_WAIT_QUEUE + +static void lis3dh_acc_update_data_func(void) +{ + int xyz[3] = { 0 }; + int err; + struct lis3dh_acc_data *acc =lis3dh_acc_misc_data; + +// LOG_INFO("sprd-gsensor: -- %s entry :acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + LOG_ERR("get_acceleration_data failed*******************************\n"); + else + lis3dh_acc_report_values(acc, xyz); +#ifdef LIS3DH_DBG + LOG_INFO("sprd-gsensor: -- %s exit :acc->irq1_gpio_number=%d-->>>>>>>>>>>>>>>>> !\n\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + LOG_INFO("\n"); + #endif + enable_irq(acc->irq1); +} + +static int gsensor_event_handler(void *unused) +{ +#ifdef LIS3DH_DBG + static int count_intr = 0; + static s64 interrupt_last = 0; + static s64 interrupt_read = 0; + static s64 interrupt_cur = 0; + static int poll_interval=0; + ktime_t time_mono; +#endif + struct sched_param param = { .sched_priority = 5}; + + sched_setscheduler(current, SCHED_RR, ¶m); + LOG_INFO("sprd-gsensor: -- %s entry :acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(lis3dh_acc_misc_data->pdata->gpio_int1)); + + do { +#ifdef LIS3DH_DBG + LOG_INFO("sprd-gsensor: -- %s 1 : gsensor_flag=%d,acc->irq1_gpio_number=%d-- !\n",__func__,gsensor_flag,gpio_get_value(lis3dh_acc_misc_data->pdata->gpio_int1)); +#endif + + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(waiter, (0 != gsensor_flag)); +// +#ifdef LIS3DH_DBG + time_mono = ktime_get(); + if (poll_interval !=lis3dh_acc_misc_data->pdata->poll_interval) { + count_intr=1; + poll_interval = lis3dh_acc_misc_data->pdata->poll_interval; + interrupt_last = ktime_to_ns(time_mono); + } + interrupt_cur = ktime_to_ns(time_mono); + int interrupt_interval = interrupt_cur - interrupt_last; + interrupt_last = interrupt_cur; + + if(interrupt_interval > (lis3dh_acc_misc_data->pdata->poll_interval*1000000) +(lis3dh_acc_misc_data->pdata->poll_interval*1000000) /4) + LOG_INFO("***sprd-gsensor SHED exception:count_intr=%d,interrupt_interval=%d,poll_interva=%d********\n",count_intr++,interrupt_interval,lis3dh_acc_misc_data->pdata->poll_interval); + + LOG_INFO("sprd-gsensor: -- %s 2: interrupt_interval=%d,poll_interval=%d,gsensor_flag=%d,acc->irq1_gpio_number=%d-- !\n",__func__,interrupt_interval,poll_interval,gsensor_flag,gpio_get_value(lis3dh_acc_misc_data->pdata->gpio_int1)); +#endif + gsensor_flag = 0; + set_current_state(TASK_RUNNING); + lis3dh_acc_update_data_func(); +#ifdef LIS3DH_DBG + time_mono = ktime_get(); + interrupt_read=ktime_to_ns(time_mono)-interrupt_cur; + if(interrupt_interval > (lis3dh_acc_misc_data->pdata->poll_interval*1000000) +(lis3dh_acc_misc_data->pdata->poll_interval*1000000) /4) + LOG_INFO("***sprd-gsensor SHED exception:count_intr=%d,interrupt_interval=%d,poll_interva=%d, interrupt_read=%lld********\n",count_intr++,interrupt_interval,lis3dh_acc_misc_data->pdata->poll_interval,interrupt_read); + + LOG_INFO("sprd-gsensor: -- %s 3: interrupt_read=%lld,poll_interval=%d,gsensor_flag=%d,acc->irq1_gpio_number=%d-- !\n",__func__,interrupt_read,poll_interval,gsensor_flag,gpio_get_value(lis3dh_acc_misc_data->pdata->gpio_int1)); +#endif + } while (!kthread_should_stop()); + + return 0; +} +#endif + + +static void lis3dh_acc_irq2_work_func(struct work_struct *work) +{ + + /*struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq2_work); + */ + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_tap_source(acc); */ + ; + /* */ + + LOG_INFO("%s: IRQ2 triggered\n", LIS3DH_ACC_DEV_NAME); +} + +int lis3dh_acc_update_g_range(struct lis3dh_acc_data *acc, u8 new_g_range) +{ + int err; + + u8 sensitivity; + u8 buf[2]; + u8 updated_val; + u8 init_val; + u8 new_val; + u8 mask = LIS3DH_ACC_FS_MASK | HIGH_RESOLUTION; + + pr_debug("%s\n", __func__); + + switch (new_g_range) { + case LIS3DH_ACC_G_2G: + + sensitivity = SENSITIVITY_2G; + break; + case LIS3DH_ACC_G_4G: + + sensitivity = SENSITIVITY_4G; + break; + case LIS3DH_ACC_G_8G: + + sensitivity = SENSITIVITY_8G; + break; + case LIS3DH_ACC_G_16G: + + sensitivity = SENSITIVITY_16G; + break; + default: + dev_err(&acc->client->dev, "invalid g range requested: %u\n", + new_g_range); + return -EINVAL; + } + + if (atomic_read(&acc->enabled)) { + /* Set configuration register 4, which contains g range setting + * NOTE: this is a straight overwrite because this driver does + * not use any of the other configuration bits in this + * register. Should this become untrue, we will have to read + * out the value and only change the relevant bits --XX---- + * (marked by X) */ + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error; + init_val = buf[0]; + acc->resume_state[RES_CTRL_REG4] = init_val; + new_val = new_g_range | HIGH_RESOLUTION; + updated_val = ((mask & new_val) | ((~mask) & init_val)); + buf[1] = updated_val; + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG4] = updated_val; + acc->sensitivity = sensitivity; + + pr_debug("%s sensitivity %d g-range %d\n", __func__, sensitivity,new_g_range); + } + + return 0; +error: + dev_err(&acc->client->dev, "update g range failed 0x%x,0x%x: %d\n", + buf[0], buf[1], err); + + return err; +} + +int lis3dh_acc_update_odr(struct lis3dh_acc_data *acc, int poll_interval_ms) +{ + int err = -1; + int i; + u8 config[2]; + + /* Convert the poll interval into an output data rate configuration + * that is as low as possible. The ordering of these checks must be + * maintained due to the cascading cut off values - poll intervals are + * checked from shortest to longest. At each check, if the next lower + * ODR cannot support the current poll interval, we stop searching */ + for (i = ARRAY_SIZE(lis3dh_acc_odr_table) - 1; i >= 0; i--) { + if (lis3dh_acc_odr_table[i].cutoff_ms <= poll_interval_ms) + break; + } + config[1] = lis3dh_acc_odr_table[i].mask; + + LOG_INFO("%s :ODR poll_interval_ms=%d, config[1]=0x%02x,cutoff_ms %d",__func__,poll_interval_ms,config[1],lis3dh_acc_odr_table[i].cutoff_ms ); + + config[1] |= LIS3DH_ACC_ENABLE_ALL_AXES; + + /* If device is currently enabled, we need to write new + * configuration out to it */ + if (atomic_read(&acc->enabled)) { + config[0] = CTRL_REG1; + err = lis3dh_acc_i2c_write(acc, config, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG1] = config[1]; + } + + return 0; + +error: + dev_err(&acc->client->dev, "update odr failed 0x%x,0x%x: %d\n", + config[0], config[1], err); + + return err; +} + +/* */ + +static int lis3dh_acc_register_write(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address, u8 new_value) +{ + int err = -1; + + if (atomic_read(&acc->enabled)) { + /* Sets configuration register at reg_address + * NOTE: this is a straight overwrite */ + buf[0] = reg_address; + buf[1] = new_value; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + return err; + } + return err; +} + +static int lis3dh_acc_register_update(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address, u8 mask, + u8 new_bit_values) +{ + int err = -1; + u8 init_val; + u8 updated_val; + err = lis3dh_acc_register_read(acc, buf, reg_address); + if (!(err < 0)) { + init_val = buf[1]; + updated_val = ((mask & new_bit_values) | ((~mask) & init_val)); + err = lis3dh_acc_register_write(acc, buf, reg_address, + updated_val); + } + return err; +} + +/* */ + +static int lis3dh_acc_get_acceleration_data(struct lis3dh_acc_data *acc, + int *xyz) +{ + int err = -1; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[6]; + /* x,y,z hardware data */ + s16 hw_d[3] = { 0 }; + + acc_data[0] = (I2C_AUTO_INCREMENT | AXISDATA_REG); + err = lis3dh_acc_i2c_read(acc, acc_data, 6); + + if (err < 0) { + LOG_ERR("%s exception ssssI2C read error %d\n", LIS3DH_ACC_I2C_NAME, + err); + return err; + } + + hw_d[0] = (((s16) ((acc_data[1] << 8) | acc_data[0])) >> 4); + hw_d[1] = (((s16) ((acc_data[3] << 8) | acc_data[2])) >> 4); + hw_d[2] = (((s16) ((acc_data[5] << 8) | acc_data[4])) >> 4); + + hw_d[0] = hw_d[0] * acc->sensitivity; + hw_d[1] = hw_d[1] * acc->sensitivity; + hw_d[2] = hw_d[2] * acc->sensitivity; + + xyz[0] = ((acc->pdata->negate_x) ? (-hw_d[acc->pdata->axis_map_x]) + : (hw_d[acc->pdata->axis_map_x])); + xyz[1] = ((acc->pdata->negate_y) ? (-hw_d[acc->pdata->axis_map_y]) + : (hw_d[acc->pdata->axis_map_y])); + xyz[2] = ((acc->pdata->negate_z) ? (-hw_d[acc->pdata->axis_map_z]) + : (hw_d[acc->pdata->axis_map_z])); +#ifdef LIS3DH_DBG + LOG_INFO("%s read x=%d, y=%d, z=%d\n", + LIS3DH_ACC_DEV_NAME, xyz[0], xyz[1], xyz[2]); +#endif + + return err; +} + +static void lis3dh_acc_report_values(struct lis3dh_acc_data *acc, int *xyz) +{ + input_report_abs(acc->input_dev, ABS_X, xyz[0]); + input_report_abs(acc->input_dev, ABS_Y, xyz[1]); + input_report_abs(acc->input_dev, ABS_Z, xyz[2]); + input_sync(acc->input_dev); + #ifdef LIS3DH_DBG + acc->data_num++; + #endif +} + +static int lis3dh_acc_enable(struct lis3dh_acc_data *acc) +{ + int err; + + pr_debug("%s: pr_debug PRINT \n", __func__); + + LOG_INFO("sprd-gsensor: -- %s entry :acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + + if (!atomic_cmpxchg(&acc->enabled, 0, 1)) { + err = lis3dh_acc_device_power_on(acc); + LOG_INFO("sprd-gsensor: -- %s err=%d-- !\n",__func__,err); + if (err < 0) { + atomic_set(&acc->enabled, 0); + return err; + } + + LOG_INFO("sprd-gsensor: -- %s acc->hw_initialized=%d acc->irq1=%d-- !\n",__func__,acc->hw_initialized,acc->irq1); + if (acc->hw_initialized) { + if (acc->irq1 != 0){ + LOG_INFO("sprd-gsensor: -- %s after init : acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + enable_irq(acc->irq1); + } + if (acc->irq2 != 0) + enable_irq(acc->irq2); + LOG_INFO("%s: power on: irq enabled\n", + LIS3DH_ACC_DEV_NAME); + } + + #ifdef LIS3DH_DBG + acc->data_num = 0; + #endif + + /* + schedule_delayed_work(&acc->input_work, + msecs_to_jiffies(acc->pdata-> + poll_interval)); + */ +#ifndef GSENSOR_INTERRUPT_MODE + queue_delayed_work(_gSensorWork_workqueue, &acc->input_work, msecs_to_jiffies(acc->pdata->poll_interval)); +#endif + } + LOG_INFO("sprd-gsensor: -- %s exit :acc->irq1_gpio_number=%d-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + LOG_INFO("sprd-gsensor: -- %s -- success!\n",__func__); + return 0; +} + +static int lis3dh_acc_disable(struct lis3dh_acc_data *acc) +{ + LOG_INFO("sprd-gsensor: -- %s --acc->hw_initialized=%d\n",__func__,acc->hw_initialized); + if (atomic_cmpxchg(&acc->enabled, 1, 0)) { + cancel_delayed_work_sync(&acc->input_work); + + if (acc->pdata->power_off) { + if (acc->irq1 != 0) + disable_irq_nosync(acc->irq1); + if (acc->irq2 != 0) + disable_irq_nosync(acc->irq2); + acc->pdata->power_off(); + acc->hw_initialized = 0; + } + if (acc->hw_initialized) { + if (acc->irq1 != 0) + disable_irq_nosync(acc->irq1); + if (acc->irq2 != 0) + disable_irq_nosync(acc->irq2); + //only init once during probe, the sensor is ALWAYS power supply + // acc->hw_initialized = 0; + } + lis3dh_acc_device_power_off(acc); + } +#ifdef LIS3DH_DBG + LOG_INFO("******sprd-gsensor: -- %s --acc->data_num =%lld ,acc->pdata->poll_interval =%d****\n",__func__,acc->data_num,acc->pdata->poll_interval); + acc->data_num = 0; +#endif + return 0; +} + +static int lis3dh_acc_misc_open(struct inode *inode, struct file *file) +{ + int err; + err = nonseekable_open(inode, file); + if (err < 0) + return err; + + file->private_data = lis3dh_acc_misc_data; + + return 0; +} + +static long lis3dh_acc_misc_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + void __user *argp = (void __user *)arg; + u8 buf[4]; + u8 mask; + u8 reg_address; + u8 bit_values; + int err; + int interval; + int xyz[3] = { 0 }; + struct lis3dh_acc_data *acc = file->private_data; + + + LOG_INFO("%s :ioctl cmd %d\n",__func__, _IOC_NR(cmd)); + switch (cmd) { + case LIS3DH_ACC_IOCTL_GET_DELAY: + interval = acc->pdata->poll_interval; + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EFAULT; + break; + + case LIS3DH_ACC_IOCTL_SET_DELAY: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval < 0 || interval > 1000) + return -EINVAL; + interval = interval/2; + acc->pdata->poll_interval = max(interval,acc->pdata->min_interval); // max the frequecy of g sensor + LOG_INFO(" %s,acc->pdata->poll_interval =%d,interval=%d,acc->pdata->min_interval=%d\n", __func__,acc->pdata->poll_interval,interval,acc->pdata->min_interval ); + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + /* TODO: if update fails poll is still set */ + if (err < 0) + return err; + break; + + case LIS3DH_ACC_IOCTL_SET_ENABLE: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval > 1) + return -EINVAL; + if (interval) + err = lis3dh_acc_enable(acc); + else + err = lis3dh_acc_disable(acc); + return err; + break; + + case LIS3DH_ACC_IOCTL_GET_ENABLE: + interval = atomic_read(&acc->enabled); + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_G_RANGE: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + bit_values = buf[0]; + err = lis3dh_acc_update_g_range(acc, bit_values); + if (err < 0) + return err; + break; + +#ifdef INTERRUPT_MANAGEMENT + case LIS3DH_ACC_IOCTL_SET_CTRL_REG3: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG3; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG3] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_CTRL_REG3])); + break; + + case LIS3DH_ACC_IOCTL_SET_CTRL_REG6: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG6; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG6] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_CTRL_REG6])); + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_DUR1])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_THS1])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG1: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG1; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_CFG1])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE1: + err = lis3dh_acc_register_read(acc, buf, INT_SRC1); + if (err < 0) + return err; + + pr_debug("INT1_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_DUR2])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_THS2])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG2: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG2; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_CFG2])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE2: + err = lis3dh_acc_register_read(acc, buf, INT_SRC2); + if (err < 0) + return err; + + pr_debug("INT2_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_GET_TAP_SOURCE: + err = lis3dh_acc_register_read(acc, buf, TT_SRC); + if (err < 0) + return err; + pr_debug("TT_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) { + pr_err("%s: %s error in copy_to_user \n", + LIS3DH_ACC_DEV_NAME, __func__); + return -EINVAL; + } + break; + case LIS3DH_ACC_IOCTL_GET_COOR_XYZ: + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + return err; + + if (copy_to_user(argp, xyz, sizeof(xyz))) { + pr_err(" %s %d error in copy_to_user \n", + __func__, __LINE__); + return -EINVAL; + } + break; + case LIS3DH_ACC_IOCTL_SET_TAP_CFG: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_CFG; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_CFG] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_CFG])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLIM: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_LIM; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_LIM] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_LIM])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_THS: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_THS; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_THS] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_THS])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLAT: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TLAT; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TLAT] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_TLAT])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TW: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TW; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TW] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_TW])); + break; + +#endif /* INTERRUPT_MANAGEMENT */ + case LIS3DH_ACC_IOCTL_GET_CHIP_ID: + { + u8 devid = 0; + u8 devinfo[DEVICE_INFO_LEN] = {0}; + err = lis3dh_acc_register_read(acc, &devid, WHO_AM_I); + if (err < 0) { + LOG_INFO("%s, error read register WHO_AM_I\n", __func__); + return -EAGAIN; + } + sprintf(devinfo, "%s, %#x", DEVICE_INFO, devid); + + if (copy_to_user(argp, devinfo, sizeof(devinfo))) { + printk("%s error in copy_to_user(IOCTL_GET_CHIP_ID)\n", __func__); + return -EINVAL; + } + } + break; + default: + return -EINVAL; + } + + return 0; +} + +static const struct file_operations lis3dh_acc_misc_fops = { + .owner = THIS_MODULE, + .open = lis3dh_acc_misc_open, + .unlocked_ioctl = lis3dh_acc_misc_ioctl, +}; + +static struct miscdevice lis3dh_acc_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = LIS3DH_ACC_DEV_NAME, + .fops = &lis3dh_acc_misc_fops, +}; + + +#ifndef GSENSOR_INTERRUPT_MODE + +static void lis3dh_acc_input_work_func(struct work_struct *work) +{ + struct lis3dh_acc_data *acc; + + int xyz[3] = { 0 }; + int err; + static int count_intr = 0; + static s64 interrupt_last = 0; + static s64 interrupt_cur = 0; + ktime_t time_mono; + time_mono = ktime_get(); + interrupt_cur = ktime_to_ns(time_mono); + int interrupt_interval = interrupt_cur - interrupt_last; + interrupt_last = interrupt_cur; + +// LOG_INFO("ENTRY----->%s\n",__func__); + acc = container_of((struct delayed_work *)work, + struct lis3dh_acc_data, input_work); + + mutex_lock(&acc->lock); + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + dev_err(&acc->client->dev, "get_acceleration_data failed\n"); + else + lis3dh_acc_report_values(acc, xyz); +// LOG_INFO(KERN_ERR "lihai: sprd-gsensor count_intr=%8d interrupt_interval=%8d, poll_interval=%d, err=%d \n", count_intr++, interrupt_interval, acc->pdata->poll_interval, err); +#if 0 + schedule_delayed_work(&acc->input_work, + msecs_to_jiffies(acc->pdata->poll_interval)); +#else + queue_delayed_work(_gSensorWork_workqueue, &acc->input_work, msecs_to_jiffies(acc->pdata->poll_interval)); +#endif + mutex_unlock(&acc->lock); + +// LOG_INFO("EXIT----->%s\n\n",__func__); +} +#endif + +#ifdef LIS3DH_OPEN_ENABLE +int lis3dh_acc_input_open(struct input_dev *input) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(input); + + return lis3dh_acc_enable(acc); +} + +void lis3dh_acc_input_close(struct input_dev *dev) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(dev); + + lis3dh_acc_disable(acc); +} +#endif + +static int lis3dh_acc_validate_pdata(struct lis3dh_acc_data *acc) +{ + acc->pdata->poll_interval = max(acc->pdata->poll_interval, + acc->pdata->min_interval); + + if (acc->pdata->axis_map_x > 2 || acc->pdata->axis_map_y > 2 + || acc->pdata->axis_map_z > 2) { + dev_err(&acc->client->dev, "invalid axis_map value " + "x:%u y:%u z%u\n", acc->pdata->axis_map_x, + acc->pdata->axis_map_y, acc->pdata->axis_map_z); + return -EINVAL; + } + + /* Only allow 0 and 1 for negation boolean flag */ + if (acc->pdata->negate_x > 1 || acc->pdata->negate_y > 1 + || acc->pdata->negate_z > 1) { + dev_err(&acc->client->dev, "invalid negate value " + "x:%u y:%u z:%u\n", acc->pdata->negate_x, + acc->pdata->negate_y, acc->pdata->negate_z); + return -EINVAL; + } + + /* Enforce minimum polling interval */ + if (acc->pdata->poll_interval < acc->pdata->min_interval) { + dev_err(&acc->client->dev, "minimum poll interval violated\n"); + return -EINVAL; + } + + return 0; +} + +static int lis3dh_acc_input_init(struct lis3dh_acc_data *acc) +{ + int err; + +#ifndef GSENSOR_INTERRUPT_MODE + /* Polling rx data when the interrupt is not used.*/ + if (1 /*acc->irq1 == 0 && acc->irq1 == 0 */ ) { + INIT_DELAYED_WORK(&acc->input_work, lis3dh_acc_input_work_func); + _gSensorWork_workqueue = create_singlethread_workqueue("acc_singlethread"); + if (!_gSensorWork_workqueue) { + err = -ESRCH; + printk(KERN_ERR "acc: create_singlethread_workqueue\n"); + return err; + } + } +#endif + + acc->input_dev = input_allocate_device(); + if (!acc->input_dev) { + err = -ENOMEM; + dev_err(&acc->client->dev, "input device allocate failed\n"); + goto err0; + } +#ifdef LIS3DH_ACC_OPEN_ENABLE + acc->input_dev->open = lis3dh_acc_input_open; + acc->input_dev->close = lis3dh_acc_input_close; +#endif + + input_set_drvdata(acc->input_dev, acc); + + set_bit(EV_ABS, acc->input_dev->evbit); + /* next is used for interruptA sources data if the case */ + set_bit(ABS_MISC, acc->input_dev->absbit); + /* next is used for interruptB sources data if the case */ + set_bit(ABS_WHEEL, acc->input_dev->absbit); + + input_set_abs_params(acc->input_dev, ABS_X, -G_MAX, G_MAX, 0, 0); + input_set_abs_params(acc->input_dev, ABS_Y, -G_MAX, G_MAX, 0, 0); + input_set_abs_params(acc->input_dev, ABS_Z, -G_MAX, G_MAX, 0, 0); + /* next is used for interruptA sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_MISC, INT_MIN, INT_MAX, 0, 0); + /* next is used for interruptB sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_WHEEL, INT_MIN, INT_MAX, 0, 0); + + acc->input_dev->name = "accelerometer"; + + err = input_register_device(acc->input_dev); + if (err) { + dev_err(&acc->client->dev, + "unable to register input polled device %s\n", + acc->input_dev->name); + goto err1; + } + + return 0; + +err1: + input_free_device(acc->input_dev); +err0: + return err; +} + +static void lis3dh_acc_input_cleanup(struct lis3dh_acc_data *acc) +{ + input_unregister_device(acc->input_dev); + input_free_device(acc->input_dev); +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void lis3dh_early_suspend(struct early_suspend *es); +static void lis3dh_early_resume(struct early_suspend *es); +#endif + +#ifdef CONFIG_OF +static struct lis3dh_acc_platform_data *lis3dh_acc_parse_dt(struct device *dev) +{ + struct lis3dh_acc_platform_data *pdata; + struct device_node *np = dev->of_node; + int ret; + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct lis3dh_acc_platform_data"); + return NULL; + } + + pdata->gpio_int1 = of_get_gpio(np, 0); + LOG_INFO(" %s:get gpio_int1 %d\n",__func__,pdata->gpio_int1); + if(pdata->gpio_int1 < 0){ + dev_err(dev, "fail to get irq_gpio_number\n"); + LOG_INFO(" get irq1_gpio_number fail\n"); + goto fail; + } + ret = of_property_read_u32(np, "poll_interval", &pdata->poll_interval); + LOG_INFO("%s: get pdata->poll_interval %d\n",__func__,pdata->poll_interval); + if(ret){ + dev_err(dev, "fail to get poll_interval\n"); + goto fail; + } + ret = of_property_read_u32(np, "min_interval", &pdata->min_interval); + if(ret){ + dev_err(dev, "fail to get min_interval\n"); + goto fail; + } + ret = of_property_read_u32(np, "g_range", &pdata->g_range); + if(ret){ + dev_err(dev, "fail to get g_range\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_x", &pdata->axis_map_x); + if(ret){ + dev_err(dev, "fail to get axis_map_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_y", &pdata->axis_map_y); + if(ret){ + dev_err(dev, "fail to get axis_map_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_z", &pdata->axis_map_z); + if(ret){ + dev_err(dev, "fail to get axis_map_z\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_x", &pdata->negate_x); + if(ret){ + dev_err(dev, "fail to get negate_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_y", &pdata->negate_y); + if(ret){ + dev_err(dev, "fail to get negate_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_z", &pdata->negate_z); + if(ret){ + dev_err(dev, "fail to get negate_z\n"); + goto fail; + } + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif + + + + +#ifdef LIS3DH_DBG +static int str2int(char *p, char *end) +{ + int result = 0; + int len = end - p + 1; + int c; + + for(; len > 0; len--, p++) { + if(p > end) + return -1; + c = *p - '0'; + if((unsigned int)c >= 10) + return -1; + result = result * 10 + c; + } + return result; +} + +/*parse a int from the string*/ +static int get_int(char *p, u8 max_len) +{ + char *start = p; + char *end =NULL; + + if(max_len > 60) { + LOG_ERR("CMD ERROR!the max length of the cmd should less than 60\n"); + return -1; + } + for(; max_len > 0; max_len--, p++) { + if(*p >= '0' && *p <= '9') { + start = p; + break; + } + } + if(0 == max_len) + return -1; + + end = start; + + for(; max_len > 0; max_len--, p++) { + if(*p >= '0' && *p <= '9') { + end = p; + continue; + } + break; + } + + return str2int(start, end); +} + +static ssize_t lis3dh_val_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + LOG_FUN( ); + + return sprintf(buff, "acc->pdata->poll_interva=%d\n",lis3dh_acc_misc_data->pdata->poll_interval); +} +// adjust poll interval dynamiclly,eg echo 5>val_show ,means poll interval is 5ms +static ssize_t lis3dh_val_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t n) +{ + LOG_FUN( ); + char *buff_temp = NULL; + int interval; + int err; + + buff_temp = kmalloc(n, GFP_KERNEL); + if(NULL == buff_temp){ + LOG_ERR("kmalloc err\n"); + return n; + } + + memcpy(buff_temp, buff, n); + interval = get_int(buff_temp, n); + + if (interval < 0 || interval > 1000) + return -EINVAL; + + lis3dh_acc_misc_data->pdata->poll_interval = max(interval,lis3dh_acc_misc_data->pdata->min_interval); // max the frequecy of g sensor + LOG_INFO("yuebao %s,acc->pdata->poll_interval =%d,interval=%d,acc->pdata->min_interval=%d\n", __func__,lis3dh_acc_misc_data->pdata->poll_interval,interval,lis3dh_acc_misc_data->pdata->min_interval ); + err = lis3dh_acc_update_odr(lis3dh_acc_misc_data, lis3dh_acc_misc_data->pdata->poll_interval ); + /* TODO: if update fails poll is still set */ + // if (err < 0) + // return err; + if(buff_temp != NULL) + kfree(buff_temp); + + return 0; +} + +/* +1 should first write ,eg echo 0x20=0x97>reg +2 then read ,eg cat reg:Addr: 0x20 Val: 0x97 +*/ +static ssize_t sensor_reg_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + int err; + u8 value = 0; + + LOG_FUN( ); + + err = lis3dh_acc_register_read(lis3dh_acc_misc_data, &value, lis3dh_acc_misc_data->debug.diag_reg_addr_wr); + return sprintf(buff, "Addr: 0x%x Val: 0x%x\n", + lis3dh_acc_misc_data->debug.diag_reg_addr_wr, value); +} + +static ssize_t sensor_reg_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t n) +{ + char buf[32]; + char *sptr, *token; + unsigned int len = 0; + u8 reg_addr, reg_val; + int err = -1; + + LOG_INFO("%s, user echo is:%s\n",__func__,buff); + len = min(n, sizeof(buf) - 1); + if (!memcpy(buf, buff, len)){ + LOG_INFO("%s, %s\n",__func__,buf); + return -EFAULT; + } + + buf[len] = '\0'; + sptr = buf; + + token = strsep(&sptr, "="); + LOG_INFO("%s, token=%s\n",__func__,token); + + if (!token) + return -EINVAL; + + LOG_INFO("%s,now token=%s,sptr=%s\n",__func__,token,sptr); + + if (kstrtou8(token, 0, ®_addr)){ + LOG_INFO("%s,now reg_addr=0x%x\n",__func__,reg_addr); + return -EINVAL; + } +// if (!ath6kl_dbg_is_diag_reg_valid(reg_addr)) +// return -EINVAL; + + if (kstrtou8(sptr, 0, ®_val)){ + LOG_INFO("%s,now reg_val=0x%x\n",__func__,reg_val); + return -EINVAL; + } + LOG_INFO("%s,now reg_addr=0x%x,reg_val=0x%x\n",__func__,reg_addr,reg_val); + + lis3dh_acc_misc_data->debug.diag_reg_addr_wr = reg_addr; + lis3dh_acc_misc_data->debug.diag_reg_val_wr = reg_val; + + buf[0] = reg_addr; + buf[1] = reg_val; + + err = lis3dh_acc_i2c_write(lis3dh_acc_misc_data, buf, 1); + if (err < 0){ + LOG_ERR("%s: %d\n",__func__,err); + return -EIO; + } + //resume_state[index] index is not reg addr, so ONLY CAN config CTRL_REG1~CTRL_REG6 + lis3dh_acc_misc_data->resume_state[reg_addr-0x20] = reg_val; + LOG_INFO("%s,now n=%d\n",__func__,n); + return n; +} +static struct kobject *lis3dh_kobj; +static struct kobj_attribute lis3dh_val_attr = + __ATTR(show_val, 0644, lis3dh_val_show, lis3dh_val_store); +static struct kobj_attribute sensor_reg_attr = + __ATTR(reg, 0644, sensor_reg_show, sensor_reg_store); + + +static struct attribute *sensor_sysfs_attrs[] = { + &lis3dh_val_attr.attr, + &sensor_reg_attr.attr, + + NULL +}; + +static struct attribute_group sensor_attribute_group = { + .attrs = sensor_sysfs_attrs, +}; + + +static int lis3dh_sysfs_init(struct lis3dh_acc_data *acc) +{ + int ret = -1; + + lis3dh_kobj = kobject_create_and_add("lis3dh", &(acc->input_dev->dev.kobj)); + if (lis3dh_kobj == NULL) { + ret = -ENOMEM; + LOG_ERR("register sysfs failed. ret = %d\n", ret); + return ret; + } + ret = sysfs_create_group(lis3dh_kobj, &sensor_attribute_group); + if (ret) { + LOG_ERR("create sysfs failed. ret = %d\n", ret); + return ret; + } + return ret; +} + +#endif + +static int lis3dh_acc_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + + struct lis3dh_acc_data *acc; + struct lis3dh_acc_platform_data *pdata = client->dev.platform_data; + + int err = -1; + int tempvalue; + LOG_INFO("sprd-gsensor: -- %s -- start !\n",__func__); + pr_debug("%s: probe start.\n", LIS3DH_ACC_DEV_NAME); + + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = lis3dh_acc_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } + if(!pdata){ + err = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } +#endif + /* + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "platform data is NULL. exiting.\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "client not i2c capable\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "client not smb-i2c capable:2\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { + dev_err(&client->dev, "client not smb-i2c capable:3\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + /* + * OK. From now, we presume we have a valid client. We now create the + * client structure, even though we cannot fill it completely yet. + */ + + acc = kzalloc(sizeof(struct lis3dh_acc_data), GFP_KERNEL); + if (acc == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for module data: " + "%d\n", err); + goto exit_alloc_data_failed; + } + + mutex_init(&acc->lock); + mutex_lock(&acc->lock); + + acc->client = client; + lis3dh_i2c_client = client; + i2c_set_clientdata(client, acc); + + LOG_INFO("gpio pin request (%d)\n", pdata->gpio_int1); + err=gpio_request(pdata->gpio_int1, "GSENSOR_INT1"); + + if (err) { + LOG_ERR("gpio pin request fail (%d)\n", err); + goto err_free_irq1; + } else { + gpio_direction_input(pdata->gpio_int1); + LOG_INFO("sprd-gsensor: -- %s acc->irq1_gpio_number status is [%d]-- !\n",__func__,gpio_get_value(pdata->gpio_int1)); + /*get irq*/ + acc->irq1 = gpio_to_irq(pdata->gpio_int1); + LOG_INFO("IRQ1 number is %d\n", acc->irq1 ); + } + if (acc->irq1 != 0) { + pr_debug("%s request irq1\n", __func__); + err = + request_irq(acc->irq1, lis3dh_acc_isr1, IRQF_TRIGGER_HIGH| IRQF_NO_SUSPEND , + "lis3dh_acc_irq1", acc); + if (err < 0) { + dev_err(&client->dev, "request irq1 failed: %d\n", err); + goto err_mutexunlockfreedata; + } + disable_irq_nosync(acc->irq1); + + INIT_WORK(&acc->irq1_work, lis3dh_acc_irq1_work_func); + acc->irq1_work_queue = + create_singlethread_workqueue("lis3dh_acc_wq1"); + if (!acc->irq1_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue1: %d\n", + err); + goto err_free_irq1; + } + } + + +// gpio_request(GSENSOR_GINT2_GPI, "GSENSOR_INT2"); + acc->irq2 = 0; /* gpio_to_irq(GSENSOR_GINT2_GPI); */ + if (acc->irq2 != 0) { + err = + request_irq(acc->irq2, lis3dh_acc_isr2, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq2", acc); + if (err < 0) { + dev_err(&client->dev, "request irq2 failed: %d\n", err); + goto err_destoyworkqueue1; + } + disable_irq_nosync(acc->irq2); + +/* Create workqueue for IRQ.*/ + + INIT_WORK(&acc->irq2_work, lis3dh_acc_irq2_work_func); + acc->irq2_work_queue = + create_singlethread_workqueue("lis3dh_acc_wq2"); + if (!acc->irq2_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue2: %d\n", + err); + goto err_free_irq2; + } + } + + acc->pdata = kmalloc(sizeof(*acc->pdata), GFP_KERNEL); + if (acc->pdata == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for pdata: %d\n", err); + goto err_destoyworkqueue2; + } + + memcpy(acc->pdata, client->dev.platform_data, sizeof(*acc->pdata)); + + err = lis3dh_acc_validate_pdata(acc); + if (err < 0) { + dev_err(&client->dev, "failed to validate platform data\n"); + goto exit_kfree_pdata; + } + +#ifdef GSENSOR_INTERRUPT_MODE +memset(acc->resume_state, 0, ARRAY_SIZE(acc->resume_state)); + + acc->resume_state[RES_CTRL_REG1] = LIS3DH_ACC_ENABLE_ALL_AXES; + acc->resume_state[RES_CTRL_REG2] = 0x00; + acc->resume_state[RES_CTRL_REG3] = CTRL_REG3_I1_DRDY1;//0x00; + acc->resume_state[RES_CTRL_REG4] = 0x00; + acc->resume_state[RES_CTRL_REG5] = CTRL_REG5_LIR_INT1;//0x00; + acc->resume_state[RES_CTRL_REG6] = CTRL_REG6_HLACTIVE;//0x00; + + acc->resume_state[RES_TEMP_CFG_REG] = 0x00; + acc->resume_state[RES_FIFO_CTRL_REG] = 0x00; + acc->resume_state[RES_INT_CFG1] = 0x00; + acc->resume_state[RES_INT_THS1] = 0x00; + acc->resume_state[RES_INT_DUR1] = 0x00; + acc->resume_state[RES_INT_CFG2] = 0x00; + acc->resume_state[RES_INT_THS2] = 0x00; + acc->resume_state[RES_INT_DUR2] = 0x00; + + acc->resume_state[RES_TT_CFG] = 0x00; + acc->resume_state[RES_TT_THS] = 0x00; + acc->resume_state[RES_TT_LIM] = 0x00; + acc->resume_state[RES_TT_TLAT] = 0x00; + acc->resume_state[RES_TT_TW] = 0x00; + +#endif + sprd_i2c_ctl_chg_clk(client->adapter->nr, 400000); + + + + + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + dev_err(&client->dev, "power on failed: %d\n", err); + goto err2; + } + +#if 1 + if (i2c_smbus_read_byte(client) < 0) { + pr_err("i2c_smbus_read_byte error!!\n"); + goto err_destoyworkqueue2; + } else { + pr_debug("%s Device detected!\n", LIS3DH_ACC_DEV_NAME); + } +#endif + /* read chip id */ + + tempvalue = i2c_smbus_read_word_data(client, WHO_AM_I); + + if ((tempvalue & 0x00FF) == WHOAMI_LIS3DH_ACC) { + pr_debug("%s I2C driver registered!\n", + LIS3DH_ACC_DEV_NAME); + } else { + acc->client = NULL; + pr_debug("I2C driver not registered!" + " Device unknown 0x%x\n", tempvalue); + goto err_destoyworkqueue2; + } + + i2c_set_clientdata(client, acc); + + if (acc->pdata->init) { + err = acc->pdata->init(); + if (err < 0) { + dev_err(&client->dev, "init failed: %d\n", err); + goto err2; + } + } +#ifndef GSENSOR_INTERRUPT_MODE + memset(acc->resume_state, 0, ARRAY_SIZE(acc->resume_state)); + + acc->resume_state[RES_CTRL_REG1] = LIS3DH_ACC_ENABLE_ALL_AXES; + acc->resume_state[RES_CTRL_REG2] = 0x00; + acc->resume_state[RES_CTRL_REG3] = CTRL_REG3_I1_DRDY1;//0x00; + acc->resume_state[RES_CTRL_REG4] = 0x00; + acc->resume_state[RES_CTRL_REG5] = 0x00;//CTRL_REG5_LIR_INT1;//0x04; + acc->resume_state[RES_CTRL_REG6] = CTRL_REG6_HLACTIVE;//0x00; + + acc->resume_state[RES_TEMP_CFG_REG] = 0x00; + acc->resume_state[RES_FIFO_CTRL_REG] = 0x00; + acc->resume_state[RES_INT_CFG1] = 0x00; + acc->resume_state[RES_INT_THS1] = 0x00; + acc->resume_state[RES_INT_DUR1] = 0x00; + acc->resume_state[RES_INT_CFG2] = 0x00; + acc->resume_state[RES_INT_THS2] = 0x00; + acc->resume_state[RES_INT_DUR2] = 0x00; + + acc->resume_state[RES_TT_CFG] = 0x00; + acc->resume_state[RES_TT_THS] = 0x00; + acc->resume_state[RES_TT_LIM] = 0x00; + acc->resume_state[RES_TT_TLAT] = 0x00; + acc->resume_state[RES_TT_TW] = 0x00; + +#endif + atomic_set(&acc->enabled, 1); + + err = lis3dh_acc_update_g_range(acc, acc->pdata->g_range); + if (err < 0) { + dev_err(&client->dev, "update_g_range failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + if (err < 0) { + dev_err(&client->dev, "update_odr failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_input_init(acc); + if (err < 0) { + dev_err(&client->dev, "input init failed\n"); + goto err_power_off; + } + lis3dh_acc_misc_data = acc; + + err = misc_register(&lis3dh_acc_misc_device); + if (err < 0) { + dev_err(&client->dev, + "misc LIS3DH_ACC_DEV_NAME register failed\n"); + goto err_input_cleanup; + } + + lis3dh_acc_device_power_off(acc); + + /* As default, do not report information */ + atomic_set(&acc->enabled, 0); +/* +#ifdef CONFIG_HAS_EARLYSUSPEND + acc->early_suspend.suspend = lis3dh_early_suspend; + acc->early_suspend.resume = lis3dh_early_resume; + acc->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + register_early_suspend(&acc->early_suspend); +#endif +*/ +#ifdef LIS3DH_DBG + err = lis3dh_sysfs_init(acc); + if(err) { + LOG_ERR("lis3dh_sysfs_init failed!\n"); + goto exit_lis3dh_sysfs_init_failed; + } +#endif +#if USE_WAIT_QUEUE + thread = kthread_run(gsensor_event_handler, 0, "gsensor-wait"); + if (IS_ERR(thread)) + { + err = PTR_ERR(thread); + LOG_ERR("failed to create kernel thread: %d\n", err); + } +#endif + mutex_unlock(&acc->lock); + dev_info(&client->dev, "###%s###\n", __func__); + LOG_INFO("sprd-gsensor: -- %s exit :acc->irq1_gpio_number status is [%d]-- !\n",__func__,gpio_get_value(acc->pdata->gpio_int1)); + LOG_INFO("sprd-gsensor: -- %s -- success !\n",__func__); + return 0; + +#ifdef LIS3DH_DBG +exit_lis3dh_sysfs_init_failed: +#endif + +err_input_cleanup: + lis3dh_acc_input_cleanup(acc); +err_power_off: + lis3dh_acc_device_power_off(acc); +err2: + if (acc->pdata->exit) + acc->pdata->exit(); +exit_kfree_pdata: + kfree(acc->pdata); +err_destoyworkqueue2: + if (acc->irq2_work_queue) + destroy_workqueue(acc->irq2_work_queue); +err_free_irq2: + if (acc->irq2) { + free_irq(acc->irq2, acc); + gpio_free(GSENSOR_GINT2_GPI); + } +err_destoyworkqueue1: + if (acc->irq1_work_queue) + destroy_workqueue(acc->irq1_work_queue); +err_free_irq1: + if (acc->irq1) { + free_irq(acc->irq1, acc); + gpio_free(acc->pdata->gpio_int1); + } +err_mutexunlockfreedata: + i2c_set_clientdata(client, NULL); + mutex_unlock(&acc->lock); + kfree(acc); + lis3dh_acc_misc_data = NULL; +exit_alloc_data_failed: +exit_check_functionality_failed: + pr_err("%s: Driver Init failed\n", LIS3DH_ACC_DEV_NAME); +exit_alloc_platform_data_failed: + return err; +} + +static int lis3dh_acc_remove(struct i2c_client *client) +{ + + /* TODO: revisit ordering here once _probe order is finalized */ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + if (acc != NULL) { + if (acc->irq1) { + free_irq(acc->irq1, acc); + gpio_free(acc->pdata->gpio_int1); + } + if (acc->irq2) { + free_irq(acc->irq2, acc); + gpio_free(GSENSOR_GINT2_GPI); + } + + if (acc->irq1_work_queue) + destroy_workqueue(acc->irq1_work_queue); + if (acc->irq2_work_queue) + destroy_workqueue(acc->irq2_work_queue); + misc_deregister(&lis3dh_acc_misc_device); + lis3dh_acc_input_cleanup(acc); + lis3dh_acc_device_power_off(acc); + if (acc->pdata->exit) + acc->pdata->exit(); + kfree(acc->pdata); + kfree(acc); + } + + return 0; +} + +static int lis3dh_acc_resume(struct i2c_client *client) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + + LOG_INFO("sprd-gsensor: -- %s -- !\n",__func__); + dev_dbg(&client->dev, "###%s###\n", __func__); + if (acc != NULL && acc->on_before_suspend) + return lis3dh_acc_enable(acc); + + return 0; +} + +static int lis3dh_acc_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + + LOG_INFO("sprd-gsensor: -- %s -- !\n",__func__); + dev_dbg(&client->dev, "###%s###\n", __func__); + if (acc != NULL) { + acc->on_before_suspend = atomic_read(&acc->enabled); + return lis3dh_acc_disable(acc); + } + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND + +static void lis3dh_early_suspend(struct early_suspend *es) +{ + lis3dh_acc_suspend(lis3dh_i2c_client, (pm_message_t) { + .event = 0}); +} + +static void lis3dh_early_resume(struct early_suspend *es) +{ + lis3dh_acc_resume(lis3dh_i2c_client); +} + +#endif /* CONFIG_HAS_EARLYSUSPEND */ + +static const struct i2c_device_id lis3dh_acc_id[] += { {LIS3DH_ACC_DEV_NAME, 0}, {}, }; + +MODULE_DEVICE_TABLE(i2c, lis3dh_acc_id); + +static const struct of_device_id lis3dh_acc_of_match[] = { + { .compatible = "ST,lis3dh_acc", }, + { } +}; +MODULE_DEVICE_TABLE(of, lis3dh_acc_of_match); +static struct i2c_driver lis3dh_acc_driver = { + .driver = { + .name = LIS3DH_ACC_I2C_NAME, + .of_match_table = lis3dh_acc_of_match, + }, + .probe = lis3dh_acc_probe, + .remove = lis3dh_acc_remove, + .resume = lis3dh_acc_resume, + .suspend = lis3dh_acc_suspend, + .id_table = lis3dh_acc_id, +}; + + +static int __init lis3dh_acc_init(void) +{ + pr_debug("%s accelerometer driver: init\n", LIS3DH_ACC_I2C_NAME); + + return i2c_add_driver(&lis3dh_acc_driver); +} + +static void __exit lis3dh_acc_exit(void) +{ + pr_debug("%s accelerometer driver exit\n", LIS3DH_ACC_DEV_NAME); + + i2c_del_driver(&lis3dh_acc_driver); + return; +} + +module_init(lis3dh_acc_init); +module_exit(lis3dh_acc_exit); + +MODULE_DESCRIPTION("lis3dh accelerometer misc driver"); +MODULE_AUTHOR("STMicroelectronics"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/lis3dh_zt.c b/drivers/input/misc/lis3dh_zt.c new file mode 100644 index 00000000..c0494cb3 --- /dev/null +++ b/drivers/input/misc/lis3dh_zt.c @@ -0,0 +1,1729 @@ +/******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** + * + * File Name : lis3dh_acc.c + * Authors : MSH - Motion Mems BU - Application Team + * : Carmine Iascone (carmine.iascone@st.com) + * : Matteo Dameno (matteo.dameno@st.com) + * Version : V.1.0.5 + * Date : 16/08/2010 + * Description : LIS3DH accelerometer sensor API + * + ******************************************************************************* + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * THE PRESENT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES + * OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, FOR THE SOLE + * PURPOSE TO SUPPORT YOUR APPLICATION DEVELOPMENT. + * AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, + * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE + * CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING + * INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS. + * + ****************************************************************************** + Revision 1.0.0 05/11/09 + First Release + Revision 1.0.3 22/01/2010 + Linux K&R Compliant Release; + Revision 1.0.5 16/08/2010 + modified _get_acceleration_data function + modified _update_odr function + manages 2 interrupts + + ******************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#include +#include +#include +#include + +#define INTERRUPT_MANAGEMENT 1 + +#define G_MAX 16000 /** Maximum polled-device-reported g value */ + +/* +#define SHIFT_ADJ_2G 4 +#define SHIFT_ADJ_4G 3 +#define SHIFT_ADJ_8G 2 +#define SHIFT_ADJ_16G 1 +*/ + +//#define SENSITIVITY_2G 1 /** mg/LSB */ +#define SENSITIVITY_2G 15.6 /** mg/LSB */ +//#define SENSITIVITY_4G 2 /** mg/LSB */ +#define SENSITIVITY_4G 31.2 /** mg/LSB */ +//#define SENSITIVITY_8G 4 /** mg/LSB */ +#define SENSITIVITY_8G 62.5 /** mg/LSB */ +//#define SENSITIVITY_16G 12 /** mg/LSB */ +#define SENSITIVITY_16G 187.5 /** mg/LSB */ + +#define HIGH_RESOLUTION 0x08 + +#define AXISDATA_REG 0x28 +#define WHOAMI_LIS3DH_ACC 0x33 /* Expctd content for WAI */ + +/* CONTROL REGISTERS */ +#define WHO_AM_I 0x0F /* WhoAmI register */ +#define TEMP_CFG_REG 0x1F /* temper sens control reg */ +/* ctrl 1: ODR3 ODR2 ODR ODR0 LPen Zenable Yenable Zenable */ +#define CTRL_REG1 0x20 /* control reg 1 */ +#define CTRL_REG2 0x21 /* control reg 2 */ +#define CTRL_REG3 0x22 /* control reg 3 */ +#define CTRL_REG4 0x23 /* control reg 4 */ +#define CTRL_REG5 0x24 /* control reg 5 */ +#define CTRL_REG6 0x25 /* control reg 6 */ + +#define FIFO_CTRL_REG 0x2E /* FiFo control reg */ + +#define INT_CFG1 0x30 /* interrupt 1 config */ +#define INT_SRC1 0x31 /* interrupt 1 source */ +#define INT_THS1 0x32 /* interrupt 1 threshold */ +#define INT_DUR1 0x33 /* interrupt 1 duration */ + +#define INT_CFG2 0x34 /* interrupt 2 config */ +#define INT_SRC2 0x35 /* interrupt 2 source */ +#define INT_THS2 0x36 /* interrupt 2 threshold */ +#define INT_DUR2 0x37 /* interrupt 2 duration */ + +#define TT_CFG 0x38 /* tap config */ +#define TT_SRC 0x39 /* tap source */ +#define TT_THS 0x3A /* tap threshold */ +#define TT_LIM 0x3B /* tap time limit */ +#define TT_TLAT 0x3C /* tap time latency */ +#define TT_TW 0x3D /* tap time window */ +/* end CONTROL REGISTRES */ + +#define ENABLE_HIGH_RESOLUTION 1 + +#define LIS3DH_ACC_PM_OFF 0x00 +#define LIS3DH_ACC_ENABLE_ALL_AXES 0x07 + +#define PMODE_MASK 0x08 +#define ODR_MASK 0XF0 + +#define ODR1 0x10 /* 1Hz output data rate */ +#define ODR10 0x20 /* 10Hz output data rate */ +#define ODR25 0x30 /* 25Hz output data rate */ +#define ODR50 0x40 /* 50Hz output data rate */ +#define ODR100 0x50 /* 100Hz output data rate */ +#define ODR200 0x60 /* 200Hz output data rate */ +#define ODR400 0x70 /* 400Hz output data rate */ +#define ODR1250 0x90 /* 1250Hz output data rate */ + +#define IA 0x40 +#define ZH 0x20 +#define ZL 0x10 +#define YH 0x08 +#define YL 0x04 +#define XH 0x02 +#define XL 0x01 +/* */ +/* CTRL REG BITS*/ +#define CTRL_REG3_I1_AOI1 0x40 +#define CTRL_REG6_I2_TAPEN 0x80 +#define CTRL_REG6_HLACTIVE 0x02 +/* */ + +/* TAP_SOURCE_REG BIT */ +#define DTAP 0x20 +#define STAP 0x10 +#define SIGNTAP 0x08 +#define ZTAP 0x04 +#define YTAP 0x02 +#define XTAZ 0x01 + +#define FUZZ 32 +#define FLAT 32 +#define I2C_RETRY_DELAY 5 +#define I2C_RETRIES 5 +#define I2C_AUTO_INCREMENT 0x80 + +/* RESUME STATE INDICES */ +#define RES_CTRL_REG1 0 +#define RES_CTRL_REG2 1 +#define RES_CTRL_REG3 2 +#define RES_CTRL_REG4 3 +#define RES_CTRL_REG5 4 +#define RES_CTRL_REG6 5 + +#define RES_INT_CFG1 6 +#define RES_INT_THS1 7 +#define RES_INT_DUR1 8 +#define RES_INT_CFG2 9 +#define RES_INT_THS2 10 +#define RES_INT_DUR2 11 + +#define RES_TT_CFG 12 +#define RES_TT_THS 13 +#define RES_TT_LIM 14 +#define RES_TT_TLAT 15 +#define RES_TT_TW 16 + +#define RES_TEMP_CFG_REG 17 +#define RES_REFERENCE_REG 18 +#define RES_FIFO_CTRL_REG 19 + +#define RESUME_ENTRIES 20 +#define DEVICE_INFO "ST, LIS3DH" +#define DEVICE_INFO_LEN 32 +/* end RESUME STATE INDICES */ + +#define GSENSOR_GINT1_GPI 0 +#define GSENSOR_GINT2_GPI 1 + +struct { + unsigned int cutoff_ms; + unsigned int mask; +} lis3dh_acc_odr_table[] = { + { + 1, ODR1250}, { + 3, ODR400}, { + 5, ODR200}, { + 10, ODR100}, { + 20, ODR50}, { + 40, ODR25}, { + 100, ODR10}, { +1000, ODR1},}; + +struct lis3dh_acc_data { + struct i2c_client *client; + struct lis3dh_acc_platform_data *pdata; + + struct mutex lock; + struct delayed_work input_work; + + struct input_dev *input_dev; + + int hw_initialized; + /* hw_working=-1 means not tested yet */ + int hw_working; + atomic_t enabled; + int on_before_suspend; + + u8 sensitivity; + + u8 resume_state[RESUME_ENTRIES]; + + int irq1; + struct work_struct irq1_work; + struct workqueue_struct *irq1_work_queue; + int irq2; + struct work_struct irq2_work; + struct workqueue_struct *irq2_work_queue; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif +}; + +/* + * Because misc devices can not carry a pointer from driver register to + * open, we keep this global. This limits the driver to a single instance. + */ +struct lis3dh_acc_data *lis3dh_acc_misc_data; +struct i2c_client *lis3dh_i2c_client; + +static int lis3dh_acc_i2c_read(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { + { + .addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = 1, + .buf = buf,}, + { + .addr = acc->client->addr, + .flags = (acc->client->flags & I2C_M_TEN) | I2C_M_RD, + .len = len, + .buf = buf,}, + }; + + do { + err = i2c_transfer(acc->client->adapter, msgs, 2); + if (err != 2) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 2) && (++tries < I2C_RETRIES)); + + if (err != 2) { + dev_err(&acc->client->dev, "read transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_i2c_write(struct lis3dh_acc_data *acc, u8 * buf, int len) +{ + int err; + int tries = 0; + + struct i2c_msg msgs[] = { {.addr = acc->client->addr, + .flags = acc->client->flags & I2C_M_TEN, + .len = len + 1,.buf = buf,}, + }; + do { + err = i2c_transfer(acc->client->adapter, msgs, 1); + if (err != 1) + msleep_interruptible(I2C_RETRY_DELAY); + } while ((err != 1) && (++tries < I2C_RETRIES)); + + if (err != 1) { + dev_err(&acc->client->dev, "write transfer error\n"); + err = -EIO; + } else { + err = 0; + } + + return err; +} + +static int lis3dh_acc_hw_init(struct lis3dh_acc_data *acc) +{ + int err = -1; + u8 buf[7]; + + pr_debug("%s: hw init start\n", LIS3DH_ACC_DEV_NAME); + + buf[0] = WHO_AM_I; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error_firstread; + else + acc->hw_working = 1; + if (buf[0] != WHOAMI_LIS3DH_ACC) { + err = -1; /* choose the right coded error */ + goto error_unknown_device; + } + + buf[0] = CTRL_REG1; + buf[1] = acc->resume_state[RES_CTRL_REG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = TEMP_CFG_REG; + buf[1] = acc->resume_state[RES_TEMP_CFG_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = FIFO_CTRL_REG; + buf[1] = acc->resume_state[RES_FIFO_CTRL_REG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | TT_THS); + buf[1] = acc->resume_state[RES_TT_THS]; + buf[2] = acc->resume_state[RES_TT_LIM]; + buf[3] = acc->resume_state[RES_TT_TLAT]; + buf[4] = acc->resume_state[RES_TT_TW]; + err = lis3dh_acc_i2c_write(acc, buf, 4); + if (err < 0) + goto error1; + buf[0] = TT_CFG; + buf[1] = acc->resume_state[RES_TT_CFG]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS1); + buf[1] = acc->resume_state[RES_INT_THS1]; + buf[2] = acc->resume_state[RES_INT_DUR1]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG1; + buf[1] = acc->resume_state[RES_INT_CFG1]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | INT_THS2); + buf[1] = acc->resume_state[RES_INT_THS2]; + buf[2] = acc->resume_state[RES_INT_DUR2]; + err = lis3dh_acc_i2c_write(acc, buf, 2); + if (err < 0) + goto error1; + buf[0] = INT_CFG2; + buf[1] = acc->resume_state[RES_INT_CFG2]; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error1; + + buf[0] = (I2C_AUTO_INCREMENT | CTRL_REG2); + buf[1] = acc->resume_state[RES_CTRL_REG2]; + buf[2] = acc->resume_state[RES_CTRL_REG3]; + buf[3] = acc->resume_state[RES_CTRL_REG4]; + buf[4] = acc->resume_state[RES_CTRL_REG5]; + buf[5] = acc->resume_state[RES_CTRL_REG6]; + err = lis3dh_acc_i2c_write(acc, buf, 5); + if (err < 0) + goto error1; + + acc->hw_initialized = 1; + pr_debug("%s: hw init done\n", LIS3DH_ACC_DEV_NAME); + return 0; + +error_firstread: + acc->hw_working = 0; + dev_warn(&acc->client->dev, "Error reading WHO_AM_I: is device " + "available/working?\n"); + goto error1; +error_unknown_device: + dev_err(&acc->client->dev, + "device unknown. Expected: 0x%x," + " Replies: 0x%x\n", WHOAMI_LIS3DH_ACC, buf[0]); +error1: + acc->hw_initialized = 0; + dev_err(&acc->client->dev, "hw init error 0x%x,0x%x: %d\n", buf[0], + buf[1], err); + return err; +} + +static void lis3dh_acc_device_power_off(struct lis3dh_acc_data *acc) +{ + int err; + u8 buf[2] = { CTRL_REG1, LIS3DH_ACC_PM_OFF }; + + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + dev_err(&acc->client->dev, "soft power off failed: %d\n", err); + + if (acc->pdata->power_off) { + if (acc->irq1 != 0) + disable_irq_nosync(acc->irq1); + if (acc->irq2 != 0) + disable_irq_nosync(acc->irq2); + acc->pdata->power_off(); + acc->hw_initialized = 0; + } + if (acc->hw_initialized) { + if (acc->irq1 != 0) + disable_irq_nosync(acc->irq1); + if (acc->irq2 != 0) + disable_irq_nosync(acc->irq2); + acc->hw_initialized = 0; + } +} + +static int lis3dh_acc_device_power_on(struct lis3dh_acc_data *acc) +{ + int err = -1; + + if (acc->pdata->power_on) { + err = acc->pdata->power_on(); + if (err < 0) { + dev_err(&acc->client->dev, + "power_on failed: %d\n", err); + return err; + } + } + + if (!acc->hw_initialized) { + err = lis3dh_acc_hw_init(acc); + if (acc->hw_working == 1 && err < 0) { + lis3dh_acc_device_power_off(acc); + return err; + } + } + return 0; +} + +static irqreturn_t lis3dh_acc_isr1(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + + disable_irq_nosync(irq); + queue_work(acc->irq1_work_queue, &acc->irq1_work); + + pr_debug("%s: isr1 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} + +static irqreturn_t lis3dh_acc_isr2(int irq, void *dev) +{ + struct lis3dh_acc_data *acc = dev; + + disable_irq_nosync(irq); + queue_work(acc->irq2_work_queue, &acc->irq2_work); + + pr_debug("%s: isr2 queued\n", LIS3DH_ACC_DEV_NAME); + + return IRQ_HANDLED; +} + +static void lis3dh_acc_irq1_work_func(struct work_struct *work) +{ + + struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq1_work); + + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_int1_source(acc); */ + ; + /* */ + pr_debug("%s: IRQ1 triggered\n", LIS3DH_ACC_DEV_NAME); +} + +static void lis3dh_acc_irq2_work_func(struct work_struct *work) +{ + + /*struct lis3dh_acc_data *acc = + container_of(work, struct lis3dh_acc_data, irq2_work); + */ + /* TODO add interrupt service procedure. + ie:lis3dh_acc_get_tap_source(acc); */ + ; + /* */ + + pr_debug("%s: IRQ2 triggered\n", LIS3DH_ACC_DEV_NAME); +} + +int lis3dh_acc_update_g_range(struct lis3dh_acc_data *acc, u8 new_g_range) +{ + int err; + + u8 sensitivity; + u8 buf[2]; + u8 updated_val; + u8 init_val; + u8 new_val; + u8 mask = LIS3DH_ACC_FS_MASK | HIGH_RESOLUTION; + + pr_debug("%s\n", __func__); + + switch (new_g_range) { + case LIS3DH_ACC_G_2G: + + sensitivity = SENSITIVITY_2G; + break; + case LIS3DH_ACC_G_4G: + + sensitivity = SENSITIVITY_4G; + break; + case LIS3DH_ACC_G_8G: + + sensitivity = SENSITIVITY_8G; + break; + case LIS3DH_ACC_G_16G: + + sensitivity = SENSITIVITY_16G; + break; + default: + dev_err(&acc->client->dev, "invalid g range requested: %u\n", + new_g_range); + return -EINVAL; + } + + if (atomic_read(&acc->enabled)) { + /* Set configuration register 4, which contains g range setting + * NOTE: this is a straight overwrite because this driver does + * not use any of the other configuration bits in this + * register. Should this become untrue, we will have to read + * out the value and only change the relevant bits --XX---- + * (marked by X) */ + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_read(acc, buf, 1); + if (err < 0) + goto error; + init_val = buf[0]; + acc->resume_state[RES_CTRL_REG4] = init_val; + new_val = new_g_range | HIGH_RESOLUTION; + updated_val = ((mask & new_val) | ((~mask) & init_val)); + buf[1] = updated_val; + buf[0] = CTRL_REG4; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG4] = updated_val; + acc->sensitivity = sensitivity; + + pr_debug("%s sensitivity %d g-range %d\n", __func__, sensitivity,new_g_range); + } + + return 0; +error: + dev_err(&acc->client->dev, "update g range failed 0x%x,0x%x: %d\n", + buf[0], buf[1], err); + + return err; +} + +int lis3dh_acc_update_odr(struct lis3dh_acc_data *acc, int poll_interval_ms) +{ + int err = -1; + int i; + u8 config[2]; + + /* Convert the poll interval into an output data rate configuration + * that is as low as possible. The ordering of these checks must be + * maintained due to the cascading cut off values - poll intervals are + * checked from shortest to longest. At each check, if the next lower + * ODR cannot support the current poll interval, we stop searching */ + for (i = ARRAY_SIZE(lis3dh_acc_odr_table) - 1; i >= 0; i--) { + if (lis3dh_acc_odr_table[i].cutoff_ms <= poll_interval_ms) + break; + } + config[1] = lis3dh_acc_odr_table[i].mask; + + config[1] |= LIS3DH_ACC_ENABLE_ALL_AXES; + + /* If device is currently enabled, we need to write new + * configuration out to it */ + if (atomic_read(&acc->enabled)) { + config[0] = CTRL_REG1; + err = lis3dh_acc_i2c_write(acc, config, 1); + if (err < 0) + goto error; + acc->resume_state[RES_CTRL_REG1] = config[1]; + } + + return 0; + +error: + dev_err(&acc->client->dev, "update odr failed 0x%x,0x%x: %d\n", + config[0], config[1], err); + + return err; +} + +/* */ + +static int lis3dh_acc_register_write(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address, u8 new_value) +{ + int err = -1; + + if (atomic_read(&acc->enabled)) { + /* Sets configuration register at reg_address + * NOTE: this is a straight overwrite */ + buf[0] = reg_address; + buf[1] = new_value; + err = lis3dh_acc_i2c_write(acc, buf, 1); + if (err < 0) + return err; + } + return err; +} + +static int lis3dh_acc_register_read(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address) +{ + + int err = -1; + buf[0] = (reg_address); + err = lis3dh_acc_i2c_read(acc, buf, 1); + return err; +} + +static int lis3dh_acc_register_update(struct lis3dh_acc_data *acc, u8 * buf, + u8 reg_address, u8 mask, + u8 new_bit_values) +{ + int err = -1; + u8 init_val; + u8 updated_val; + err = lis3dh_acc_register_read(acc, buf, reg_address); + if (!(err < 0)) { + init_val = buf[1]; + updated_val = ((mask & new_bit_values) | ((~mask) & init_val)); + err = lis3dh_acc_register_write(acc, buf, reg_address, + updated_val); + } + return err; +} + +/* */ + +static int lis3dh_acc_get_acceleration_data(struct lis3dh_acc_data *acc, + int *xyz) +{ + int err = -1; + /* Data bytes from hardware xL, xH, yL, yH, zL, zH */ + u8 acc_data[6]; + /* x,y,z hardware data */ + s16 hw_d[3] = { 0 }; + s8 acc_data_term[3]={0}; + + acc_data[0] = (I2C_AUTO_INCREMENT | AXISDATA_REG); + err = lis3dh_acc_i2c_read(acc, acc_data, 6); + + if (err < 0) { + pr_debug("%s I2C read error %d\n", LIS3DH_ACC_I2C_NAME, + err); + return err; + } + + //hw_d[0] = (((s16) ((acc_data[1] << 8) | acc_data[0])) >> 4); + //hw_d[1] = (((s16) ((acc_data[3] << 8) | acc_data[2])) >> 4); + //hw_d[2] = (((s16) ((acc_data[5] << 8) | acc_data[4])) >> 4); + acc_data_term[0]=acc_data[1]; + acc_data_term[1]=acc_data[3]; + acc_data_term[2]=acc_data[5]; + + //printk("%s read 000 x=%d, y=%d, z=%d\n", + // LIS3DH_ACC_DEV_NAME, acc_data_term[0], acc_data_term[1], acc_data_term[2]); + //hw_d[0] = hw_d[0] * acc->sensitivity; + hw_d[0] = acc_data_term[0] * acc->sensitivity; + //hw_d[1] = hw_d[1] * acc->sensitivity; + hw_d[1] = acc_data_term[1] * acc->sensitivity; + //hw_d[2] = hw_d[2] * acc->sensitivity; + hw_d[2] = acc_data_term[2] * acc->sensitivity; + + acc->pdata->negate_x = -acc->pdata->negate_x; + acc->pdata->negate_y = -acc->pdata->negate_y; + + xyz[0] = ((acc->pdata->negate_x) ? (-hw_d[acc->pdata->axis_map_x]) + : (hw_d[acc->pdata->axis_map_x])); + xyz[1] = ((acc->pdata->negate_y) ? (-hw_d[acc->pdata->axis_map_y]) + : (hw_d[acc->pdata->axis_map_y])); + xyz[2] = ((acc->pdata->negate_z) ? (-hw_d[acc->pdata->axis_map_z]) + : (hw_d[acc->pdata->axis_map_z])); + + pr_debug("%s read x=%d, y=%d, z=%d\n", + LIS3DH_ACC_DEV_NAME, xyz[0], xyz[1], xyz[2]); + + return err; +} + +static void lis3dh_acc_report_values(struct lis3dh_acc_data *acc, int *xyz) +{ + input_report_abs(acc->input_dev, ABS_X, xyz[0]); + input_report_abs(acc->input_dev, ABS_Y, xyz[1]); + input_report_abs(acc->input_dev, ABS_Z, xyz[2]); + input_sync(acc->input_dev); +} + +static int lis3dh_acc_enable(struct lis3dh_acc_data *acc) +{ + int err; + printk("sprd-gsensor: -- %s -- !\n",__func__); + if (!atomic_cmpxchg(&acc->enabled, 0, 1)) { + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + atomic_set(&acc->enabled, 0); + return err; + } + + if (acc->hw_initialized) { + if (acc->irq1 != 0) + enable_irq(acc->irq1); + if (acc->irq2 != 0) + enable_irq(acc->irq2); + pr_debug("%s: power on: irq enabled\n", + LIS3DH_ACC_DEV_NAME); + } + + schedule_delayed_work(&acc->input_work, + msecs_to_jiffies(acc->pdata-> + poll_interval)); + } + printk("sprd-gsensor: -- %s -- success!\n",__func__); + return 0; +} + +static int lis3dh_acc_disable(struct lis3dh_acc_data *acc) +{ + printk("sprd-gsensor: -- %s -- \n",__func__); + if (atomic_cmpxchg(&acc->enabled, 1, 0)) { + cancel_delayed_work_sync(&acc->input_work); + lis3dh_acc_device_power_off(acc); + } + + return 0; +} + +static int lis3dh_acc_misc_open(struct inode *inode, struct file *file) +{ + int err; + err = nonseekable_open(inode, file); + if (err < 0) + return err; + + file->private_data = lis3dh_acc_misc_data; + + return 0; +} + +static long lis3dh_acc_misc_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + void __user *argp = (void __user *)arg; + u8 buf[4]; + u8 mask; + u8 reg_address; + u8 bit_values; + int err; + int interval; + int xyz[3] = { 0 }; + struct lis3dh_acc_data *acc = file->private_data; + + switch (cmd) { + case LIS3DH_ACC_IOCTL_GET_DELAY: + interval = acc->pdata->poll_interval; + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EFAULT; + break; + + case LIS3DH_ACC_IOCTL_SET_DELAY: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval < 0 || interval > 1000) + return -EINVAL; + + acc->pdata->poll_interval = max(interval, + acc->pdata->min_interval); + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + /* TODO: if update fails poll is still set */ + if (err < 0) + return err; + break; + + case LIS3DH_ACC_IOCTL_SET_ENABLE: + if (copy_from_user(&interval, argp, sizeof(interval))) + return -EFAULT; + if (interval > 1) + return -EINVAL; + if (interval) + err = lis3dh_acc_enable(acc); + else + err = lis3dh_acc_disable(acc); + return err; + break; + + case LIS3DH_ACC_IOCTL_GET_ENABLE: + interval = atomic_read(&acc->enabled); + if (copy_to_user(argp, &interval, sizeof(interval))) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_G_RANGE: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + bit_values = buf[0]; + err = lis3dh_acc_update_g_range(acc, bit_values); + if (err < 0) + return err; + break; + +#ifdef INTERRUPT_MANAGEMENT + case LIS3DH_ACC_IOCTL_SET_CTRL_REG3: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG3; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG3] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_CTRL_REG3])); + break; + + case LIS3DH_ACC_IOCTL_SET_CTRL_REG6: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = CTRL_REG6; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_CTRL_REG6] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_CTRL_REG6])); + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_DUR1])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD1: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS1; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_THS1])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG1: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG1; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG1] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_CFG1])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE1: + err = lis3dh_acc_register_read(acc, buf, INT_SRC1); + if (err < 0) + return err; + + pr_debug("INT1_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_SET_DURATION2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_DUR2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_DUR2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_DUR2])); + break; + + case LIS3DH_ACC_IOCTL_SET_THRESHOLD2: + if (copy_from_user(buf, argp, 1)) + return -EFAULT; + reg_address = INT_THS2; + mask = 0x7F; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_THS2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_THS2])); + break; + + case LIS3DH_ACC_IOCTL_SET_CONFIG2: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = INT_CFG2; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_INT_CFG2] = ((mask & bit_values) | + (~mask & acc-> + resume_state + [RES_INT_CFG2])); + break; + + case LIS3DH_ACC_IOCTL_GET_SOURCE2: + err = lis3dh_acc_register_read(acc, buf, INT_SRC2); + if (err < 0) + return err; + + pr_debug("INT2_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) + return -EINVAL; + break; + + case LIS3DH_ACC_IOCTL_GET_TAP_SOURCE: + err = lis3dh_acc_register_read(acc, buf, TT_SRC); + if (err < 0) + return err; + pr_debug("TT_SRC content: %d , 0x%x\n", buf[0], buf[0]); + + if (copy_to_user(argp, buf, 1)) { + pr_err("%s: %s error in copy_to_user \n", + LIS3DH_ACC_DEV_NAME, __func__); + return -EINVAL; + } + break; + case LIS3DH_ACC_IOCTL_GET_COOR_XYZ: + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + return err; + + if (copy_to_user(argp, xyz, sizeof(xyz))) { + pr_err(" %s %d error in copy_to_user \n", + __func__, __LINE__); + return -EINVAL; + } + break; + case LIS3DH_ACC_IOCTL_SET_TAP_CFG: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_CFG; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_CFG] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_CFG])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLIM: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_LIM; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_LIM] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_LIM])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_THS: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_THS; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_THS] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_THS])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TLAT: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TLAT; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TLAT] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_TLAT])); + break; + + case LIS3DH_ACC_IOCTL_SET_TAP_TW: + if (copy_from_user(buf, argp, 2)) + return -EFAULT; + reg_address = TT_TW; + mask = buf[1]; + bit_values = buf[0]; + err = lis3dh_acc_register_update(acc, (u8 *) arg, reg_address, + mask, bit_values); + if (err < 0) + return err; + acc->resume_state[RES_TT_TW] = ((mask & bit_values) | + (~mask & acc-> + resume_state[RES_TT_TW])); + break; + +#endif /* INTERRUPT_MANAGEMENT */ + case LIS3DH_ACC_IOCTL_GET_CHIP_ID: + { + u8 devid = 0; + u8 devinfo[DEVICE_INFO_LEN] = {0}; + err = lis3dh_acc_register_read(acc, &devid, WHO_AM_I); + if (err < 0) { + printk("__func__, error read register WHO_AM_I\n", __func__); + return -EAGAIN; + } + sprintf(devinfo, "%s, %#x", DEVICE_INFO, devid); + + if (copy_to_user(argp, devinfo, sizeof(devinfo))) { + printk("%s error in copy_to_user(IOCTL_GET_CHIP_ID)\n", __func__); + return -EINVAL; + } + } + break; + default: + return -EINVAL; + } + + return 0; +} + +static const struct file_operations lis3dh_acc_misc_fops = { + .owner = THIS_MODULE, + .open = lis3dh_acc_misc_open, + .unlocked_ioctl = lis3dh_acc_misc_ioctl, +}; + +static struct miscdevice lis3dh_acc_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = LIS3DH_ACC_DEV_NAME, + .fops = &lis3dh_acc_misc_fops, +}; + +static void lis3dh_acc_input_work_func(struct work_struct *work) +{ + struct lis3dh_acc_data *acc; + + int xyz[3] = { 0 }; + int err; + + acc = container_of((struct delayed_work *)work, + struct lis3dh_acc_data, input_work); + + mutex_lock(&acc->lock); + err = lis3dh_acc_get_acceleration_data(acc, xyz); + if (err < 0) + dev_err(&acc->client->dev, "get_acceleration_data failed\n"); + else + lis3dh_acc_report_values(acc, xyz); + + schedule_delayed_work(&acc->input_work, + msecs_to_jiffies(acc->pdata->poll_interval)); + mutex_unlock(&acc->lock); +} + +#ifdef LIS3DH_OPEN_ENABLE +int lis3dh_acc_input_open(struct input_dev *input) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(input); + + return lis3dh_acc_enable(acc); +} + +void lis3dh_acc_input_close(struct input_dev *dev) +{ + struct lis3dh_acc_data *acc = input_get_drvdata(dev); + + lis3dh_acc_disable(acc); +} +#endif + +static int lis3dh_acc_validate_pdata(struct lis3dh_acc_data *acc) +{ + acc->pdata->poll_interval = max(acc->pdata->poll_interval, + acc->pdata->min_interval); + + if (acc->pdata->axis_map_x > 2 || acc->pdata->axis_map_y > 2 + || acc->pdata->axis_map_z > 2) { + dev_err(&acc->client->dev, "invalid axis_map value " + "x:%u y:%u z%u\n", acc->pdata->axis_map_x, + acc->pdata->axis_map_y, acc->pdata->axis_map_z); + return -EINVAL; + } + + /* Only allow 0 and 1 for negation boolean flag */ + if (acc->pdata->negate_x > 1 || acc->pdata->negate_y > 1 + || acc->pdata->negate_z > 1) { + dev_err(&acc->client->dev, "invalid negate value " + "x:%u y:%u z:%u\n", acc->pdata->negate_x, + acc->pdata->negate_y, acc->pdata->negate_z); + return -EINVAL; + } + + /* Enforce minimum polling interval */ + if (acc->pdata->poll_interval < acc->pdata->min_interval) { + dev_err(&acc->client->dev, "minimum poll interval violated\n"); + return -EINVAL; + } + + return 0; +} + +static int lis3dh_acc_input_init(struct lis3dh_acc_data *acc) +{ + int err; + /* Polling rx data when the interrupt is not used.*/ + if (1 /*acc->irq1 == 0 && acc->irq1 == 0 */ ) { + INIT_DELAYED_WORK(&acc->input_work, lis3dh_acc_input_work_func); + } + + acc->input_dev = input_allocate_device(); + if (!acc->input_dev) { + err = -ENOMEM; + dev_err(&acc->client->dev, "input device allocate failed\n"); + goto err0; + } +#ifdef LIS3DH_ACC_OPEN_ENABLE + acc->input_dev->open = lis3dh_acc_input_open; + acc->input_dev->close = lis3dh_acc_input_close; +#endif + + input_set_drvdata(acc->input_dev, acc); + + set_bit(EV_ABS, acc->input_dev->evbit); + /* next is used for interruptA sources data if the case */ + set_bit(ABS_MISC, acc->input_dev->absbit); + /* next is used for interruptB sources data if the case */ + set_bit(ABS_WHEEL, acc->input_dev->absbit); + + input_set_abs_params(acc->input_dev, ABS_X, -G_MAX, G_MAX, 0, 0); + input_set_abs_params(acc->input_dev, ABS_Y, -G_MAX, G_MAX, 0, 0); + input_set_abs_params(acc->input_dev, ABS_Z, -G_MAX, G_MAX, 0, 0); + /* next is used for interruptA sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_MISC, INT_MIN, INT_MAX, 0, 0); + /* next is used for interruptB sources data if the case */ + input_set_abs_params(acc->input_dev, ABS_WHEEL, INT_MIN, INT_MAX, 0, 0); + + acc->input_dev->name = "accelerometer"; + + err = input_register_device(acc->input_dev); + if (err) { + dev_err(&acc->client->dev, + "unable to register input polled device %s\n", + acc->input_dev->name); + goto err1; + } + + return 0; + +err1: + input_free_device(acc->input_dev); +err0: + return err; +} + +static void lis3dh_acc_input_cleanup(struct lis3dh_acc_data *acc) +{ + input_unregister_device(acc->input_dev); + input_free_device(acc->input_dev); +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void lis3dh_early_suspend(struct early_suspend *es); +static void lis3dh_early_resume(struct early_suspend *es); +#endif + +#ifdef CONFIG_OF +static struct lis3dh_acc_platform_data *lis3dh_acc_parse_dt(struct device *dev) +{ + struct lis3dh_acc_platform_data *pdata; + struct device_node *np = dev->of_node; + int ret; + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct lis3dh_acc_platform_data"); + return NULL; + } + ret = of_property_read_u32(np, "poll_interval", &pdata->poll_interval); + if(ret){ + dev_err(dev, "fail to get poll_interval\n"); + goto fail; + } + ret = of_property_read_u32(np, "min_interval", &pdata->min_interval); + if(ret){ + dev_err(dev, "fail to get min_interval\n"); + goto fail; + } + ret = of_property_read_u32(np, "g_range", &pdata->g_range); + if(ret){ + dev_err(dev, "fail to get g_range\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_x", &pdata->axis_map_x); + if(ret){ + dev_err(dev, "fail to get axis_map_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_y", &pdata->axis_map_y); + if(ret){ + dev_err(dev, "fail to get axis_map_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "axis_map_z", &pdata->axis_map_z); + if(ret){ + dev_err(dev, "fail to get axis_map_z\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_x", &pdata->negate_x); + if(ret){ + dev_err(dev, "fail to get negate_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_y", &pdata->negate_y); + if(ret){ + dev_err(dev, "fail to get negate_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "negate_z", &pdata->negate_z); + if(ret){ + dev_err(dev, "fail to get negate_z\n"); + goto fail; + } + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif +static int lis3dh_acc_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + + struct lis3dh_acc_data *acc; + struct lis3dh_acc_platform_data *pdata = client->dev.platform_data; + int xyz[3] = { 0 }; + + int err = -1; + int tempvalue; + printk("sprd-gsensor: -- %s -- start !\n",__func__); + pr_debug("%s: probe start.\n", LIS3DH_ACC_DEV_NAME); + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = lis3dh_acc_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } + if(!pdata){ + err = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } +#endif + /* + if (client->dev.platform_data == NULL) { + dev_err(&client->dev, "platform data is NULL. exiting.\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + */ + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "client not i2c capable\n"); + err = -ENODEV; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE | + I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "client not smb-i2c capable:2\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { + dev_err(&client->dev, "client not smb-i2c capable:3\n"); + err = -EIO; + goto exit_check_functionality_failed; + } + /* + * OK. From now, we presume we have a valid client. We now create the + * client structure, even though we cannot fill it completely yet. + */ + + acc = kzalloc(sizeof(struct lis3dh_acc_data), GFP_KERNEL); + if (acc == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for module data: " + "%d\n", err); + goto exit_alloc_data_failed; + } + + mutex_init(&acc->lock); + mutex_lock(&acc->lock); + + acc->client = client; + lis3dh_i2c_client = client; + i2c_set_clientdata(client, acc); + + pr_debug("%s: %s has set irq1 to irq: %d\n", + LIS3DH_ACC_DEV_NAME, __func__, acc->irq1); + pr_debug("%s: %s has set irq2 to irq: %d\n", + LIS3DH_ACC_DEV_NAME, __func__, acc->irq2); + + gpio_request(GSENSOR_GINT1_GPI, "GSENSOR_INT1"); + gpio_request(GSENSOR_GINT2_GPI, "GSENSOR_INT2"); + acc->irq1 = 0; /* gpio_to_irq(GSENSOR_GINT1_GPI); */ + acc->irq2 = 0; /* gpio_to_irq(GSENSOR_GINT2_GPI); */ + + if (acc->irq1 != 0) { + pr_debug("%s request irq1\n", __func__); + err = + request_irq(acc->irq1, lis3dh_acc_isr1, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq1", acc); + if (err < 0) { + dev_err(&client->dev, "request irq1 failed: %d\n", err); + goto err_mutexunlockfreedata; + } + disable_irq_nosync(acc->irq1); + + INIT_WORK(&acc->irq1_work, lis3dh_acc_irq1_work_func); + acc->irq1_work_queue = + create_singlethread_workqueue("lis3dh_acc_wq1"); + if (!acc->irq1_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue1: %d\n", + err); + goto err_free_irq1; + } + } + + if (acc->irq2 != 0) { + err = + request_irq(acc->irq2, lis3dh_acc_isr2, IRQF_TRIGGER_RISING, + "lis3dh_acc_irq2", acc); + if (err < 0) { + dev_err(&client->dev, "request irq2 failed: %d\n", err); + goto err_destoyworkqueue1; + } + disable_irq_nosync(acc->irq2); + +/* Create workqueue for IRQ.*/ + + INIT_WORK(&acc->irq2_work, lis3dh_acc_irq2_work_func); + acc->irq2_work_queue = + create_singlethread_workqueue("lis3dh_acc_wq2"); + if (!acc->irq2_work_queue) { + err = -ENOMEM; + dev_err(&client->dev, "cannot create work queue2: %d\n", + err); + goto err_free_irq2; + } + } + + acc->pdata = kmalloc(sizeof(*acc->pdata), GFP_KERNEL); + if (acc->pdata == NULL) { + err = -ENOMEM; + dev_err(&client->dev, + "failed to allocate memory for pdata: %d\n", err); + goto err_destoyworkqueue2; + } + + memcpy(acc->pdata, client->dev.platform_data, sizeof(*acc->pdata)); + + err = lis3dh_acc_validate_pdata(acc); + if (err < 0) { + dev_err(&client->dev, "failed to validate platform data\n"); + goto exit_kfree_pdata; + } + + err = lis3dh_acc_device_power_on(acc); + if (err < 0) { + dev_err(&client->dev, "power on failed: %d\n", err); + goto err2; + } + +#if 1 + if (i2c_smbus_read_byte(client) < 0) { + pr_err("i2c_smbus_read_byte error!!\n"); + goto err_destoyworkqueue2; + } else { + pr_debug("%s Device detected!\n", LIS3DH_ACC_DEV_NAME); + } +#endif + /* read chip id */ + + tempvalue = i2c_smbus_read_word_data(client, WHO_AM_I); + + if ((tempvalue & 0x00FF) == WHOAMI_LIS3DH_ACC) { + pr_debug("%s I2C driver registered!\n", + LIS3DH_ACC_DEV_NAME); + } else { + acc->client = NULL; + pr_debug("I2C driver not registered!" + " Device unknown 0x%x\n", tempvalue); + goto err_destoyworkqueue2; + } + + i2c_set_clientdata(client, acc); + + if (acc->pdata->init) { + err = acc->pdata->init(); + if (err < 0) { + dev_err(&client->dev, "init failed: %d\n", err); + goto err2; + } + } + + memset(acc->resume_state, 0, ARRAY_SIZE(acc->resume_state)); + + acc->resume_state[RES_CTRL_REG1] = LIS3DH_ACC_ENABLE_ALL_AXES; + acc->resume_state[RES_CTRL_REG2] = 0x00; + acc->resume_state[RES_CTRL_REG3] = 0x00; + acc->resume_state[RES_CTRL_REG4] = 0x00; + acc->resume_state[RES_CTRL_REG5] = 0x00; + acc->resume_state[RES_CTRL_REG6] = 0x00; + + acc->resume_state[RES_TEMP_CFG_REG] = 0x00; + acc->resume_state[RES_FIFO_CTRL_REG] = 0x00; + acc->resume_state[RES_INT_CFG1] = 0x00; + acc->resume_state[RES_INT_THS1] = 0x00; + acc->resume_state[RES_INT_DUR1] = 0x00; + acc->resume_state[RES_INT_CFG2] = 0x00; + acc->resume_state[RES_INT_THS2] = 0x00; + acc->resume_state[RES_INT_DUR2] = 0x00; + + acc->resume_state[RES_TT_CFG] = 0x00; + acc->resume_state[RES_TT_THS] = 0x00; + acc->resume_state[RES_TT_LIM] = 0x00; + acc->resume_state[RES_TT_TLAT] = 0x00; + acc->resume_state[RES_TT_TW] = 0x00; + + + atomic_set(&acc->enabled, 1); + + err = lis3dh_acc_update_g_range(acc, acc->pdata->g_range); + if (err < 0) { + dev_err(&client->dev, "update_g_range failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_update_odr(acc, acc->pdata->poll_interval); + if (err < 0) { + dev_err(&client->dev, "update_odr failed\n"); + goto err_power_off; + } + + err = lis3dh_acc_input_init(acc); + if (err < 0) { + dev_err(&client->dev, "input init failed\n"); + goto err_power_off; + } + lis3dh_acc_misc_data = acc; + + err = misc_register(&lis3dh_acc_misc_device); + if (err < 0) { + dev_err(&client->dev, + "misc LIS3DH_ACC_DEV_NAME register failed\n"); + goto err_input_cleanup; + } + + lis3dh_acc_device_power_off(acc); + + /* As default, do not report information */ + atomic_set(&acc->enabled, 0); +/* +#ifdef CONFIG_HAS_EARLYSUSPEND + acc->early_suspend.suspend = lis3dh_early_suspend; + acc->early_suspend.resume = lis3dh_early_resume; + acc->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + register_early_suspend(&acc->early_suspend); +#endif +*/ + mutex_unlock(&acc->lock); + dev_info(&client->dev, "###%s###\n", __func__); + printk("sprd-gsensor: -- %s -- success !\n",__func__); + + + err = lis3dh_acc_get_acceleration_data(acc, xyz); + + + return 0; + +err_input_cleanup: + lis3dh_acc_input_cleanup(acc); +err_power_off: + lis3dh_acc_device_power_off(acc); +err2: + if (acc->pdata->exit) + acc->pdata->exit(); +exit_kfree_pdata: + kfree(acc->pdata); +err_destoyworkqueue2: + if (acc->irq2_work_queue) + destroy_workqueue(acc->irq2_work_queue); +err_free_irq2: + if (acc->irq2) { + free_irq(acc->irq2, acc); + gpio_free(GSENSOR_GINT2_GPI); + } +err_destoyworkqueue1: + if (acc->irq1_work_queue) + destroy_workqueue(acc->irq1_work_queue); +err_free_irq1: + if (acc->irq1) { + free_irq(acc->irq1, acc); + gpio_free(GSENSOR_GINT1_GPI); + } +err_mutexunlockfreedata: + i2c_set_clientdata(client, NULL); + mutex_unlock(&acc->lock); + kfree(acc); + lis3dh_acc_misc_data = NULL; +exit_alloc_data_failed: +exit_check_functionality_failed: + pr_err("%s: Driver Init failed\n", LIS3DH_ACC_DEV_NAME); +exit_alloc_platform_data_failed: + return err; +} + +static int lis3dh_acc_remove(struct i2c_client *client) +{ + /* TODO: revisit ordering here once _probe order is finalized */ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + if (acc != NULL) { + if (acc->irq1) { + free_irq(acc->irq1, acc); + gpio_free(GSENSOR_GINT1_GPI); + } + if (acc->irq2) { + free_irq(acc->irq2, acc); + gpio_free(GSENSOR_GINT2_GPI); + } + + if (acc->irq1_work_queue) + destroy_workqueue(acc->irq1_work_queue); + if (acc->irq2_work_queue) + destroy_workqueue(acc->irq2_work_queue); + misc_deregister(&lis3dh_acc_misc_device); + lis3dh_acc_input_cleanup(acc); + lis3dh_acc_device_power_off(acc); + if (acc->pdata->exit) + acc->pdata->exit(); + kfree(acc->pdata); + kfree(acc); + } + + return 0; +} + +static int lis3dh_acc_resume(struct i2c_client *client) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + printk("sprd-gsensor: -- %s -- !\n",__func__); + dev_dbg(&client->dev, "###%s###\n", __func__); + + if (acc != NULL && acc->on_before_suspend) + return lis3dh_acc_enable(acc); + + return 0; +} + +static int lis3dh_acc_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct lis3dh_acc_data *acc = i2c_get_clientdata(client); + printk("sprd-gsensor: -- %s -- !\n",__func__); + dev_dbg(&client->dev, "###%s###\n", __func__); + + if (acc != NULL) { + acc->on_before_suspend = atomic_read(&acc->enabled); + return lis3dh_acc_disable(acc); + } + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND + +static void lis3dh_early_suspend(struct early_suspend *es) +{ + lis3dh_acc_suspend(lis3dh_i2c_client, (pm_message_t) { + .event = 0}); +} + +static void lis3dh_early_resume(struct early_suspend *es) +{ + lis3dh_acc_resume(lis3dh_i2c_client); +} + +#endif /* CONFIG_HAS_EARLYSUSPEND */ + +static const struct i2c_device_id lis3dh_acc_id[] += { {LIS3DH_ACC_DEV_NAME, 0}, {}, }; + +MODULE_DEVICE_TABLE(i2c, lis3dh_acc_id); + +static const struct of_device_id lis3dh_acc_of_match[] = { + { .compatible = "ST,lis3dh_acc", }, + { } +}; +MODULE_DEVICE_TABLE(of, lis3dh_acc_of_match); +static struct i2c_driver lis3dh_acc_driver = { + .driver = { + .name = LIS3DH_ACC_I2C_NAME, + .of_match_table = lis3dh_acc_of_match, + }, + .probe = lis3dh_acc_probe, + .remove = lis3dh_acc_remove, + .resume = lis3dh_acc_resume, + .suspend = lis3dh_acc_suspend, + .id_table = lis3dh_acc_id, +}; + + +static int __init lis3dh_acc_init(void) +{ + pr_debug("%s accelerometer driver: init\n", LIS3DH_ACC_I2C_NAME); + + return i2c_add_driver(&lis3dh_acc_driver); +} + +static void __exit lis3dh_acc_exit(void) +{ + pr_debug("%s accelerometer driver exit\n", LIS3DH_ACC_DEV_NAME); + + i2c_del_driver(&lis3dh_acc_driver); + return; +} + +module_init(lis3dh_acc_init); +module_exit(lis3dh_acc_exit); + +MODULE_DESCRIPTION("lis3dh accelerometer misc driver"); +MODULE_AUTHOR("STMicroelectronics"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/ltr_558als.c b/drivers/input/misc/ltr_558als.c new file mode 100644 index 00000000..0251cdb9 --- /dev/null +++ b/drivers/input/misc/ltr_558als.c @@ -0,0 +1,1236 @@ +/* + * File:ltr_558als.c + * Author:Yaochuan Li + * Created:2013-03-18 + * Description:LTR-558ALS Driver + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LTR588_DBG +#define LTR558_ADAPTIVE +#ifdef LTR588_DBG +#define ENTER printk(KERN_INFO "[LTR588_DBG] func: %s line: %04d ", __func__, __LINE__) +#define PRINT_DBG(x...) printk(KERN_INFO "[LTR588_DBG] " x) +#define PRINT_INFO(x...) printk(KERN_INFO "[LTR588_INFO] " x) +#define PRINT_WARN(x...) printk(KERN_INFO "[LTR588_WARN] " x) +#define PRINT_ERR(format,x...) printk(KERN_ERR "[LTR588_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x) +#else +#define ENTER +#define PRINT_DBG(x...) +#define PRINT_INFO(x...) printk(KERN_INFO "[LTR588_INFO] " x) +#define PRINT_WARN(x...) printk(KERN_INFO "[LTR588_WARN] " x) +#define PRINT_ERR(format,x...) printk(KERN_ERR "[LTR588_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x) +#endif + +typedef struct tag_ltr558 { + struct input_dev *input; + struct i2c_client *client; + struct work_struct work; + struct workqueue_struct *ltr_work_queue; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend ltr_early_suspend; +#endif +} ltr558_t, *ltr558_p; + +static int ps_threshold = 0; +static int ps_threshold_high = 600; +static int ps_threshold_low = 500; +static int dyna_cali = 2047; + +static int p_flag = 0; +static int l_flag = 0; +static u8 p_gainrange = PS_RANGE4; +static u8 l_gainrange = ALS_RANGE1_320; +//static int ps_threshold = 0; +static struct i2c_client *this_client = NULL; +static int LTR_PLS_MODE = 0; + +#ifdef LTR558_ADAPTIVE +#define DEBOUNCE 10 +#define MIN_SPACING 120 +#define DIVEDE 10 +static int ps_max_filter[5] = {0}; +static int ps_min_filter[5] = {0}; +static int max_index = 0; +static int min_index = 0; +static int ps_min = 0; +static int ps_max = 0; +#endif + +static int ltr558_reg_init(void); + +static int ltr558_i2c_read_bytes(u8 index, u8 *rx_buff, u8 length) +{ + int ret = -1; + struct i2c_msg msgs[] = { + { + .addr = this_client->addr,//chip address, 7bit + .flags = 0,//write + .len = 1, + .buf = &index, + }, + { + .addr = this_client->addr, + .flags = I2C_M_RD,//read + .len = length, + .buf = rx_buff, + }, + }; + + ret = i2c_transfer(this_client->adapter, msgs, 2); + if(ret != 2) { + PRINT_ERR("READ ERROR!ret=%d\n", ret); + } + return ret; +} + +static int ltr558_i2c_write_bytes(u8 *tx_buff, u8 length) +{ + int ret = -1; + struct i2c_msg msgs[1]; + + msgs[0].addr = this_client->addr; + msgs[0].flags = 0; + msgs[0].len = length; + msgs[0].buf = tx_buff; + + ret = i2c_transfer(this_client->adapter, msgs, 1); + if(ret != 1) { + PRINT_ERR("WRITE ERROR!ret=%d\n", ret); + } + return ret; +} + +static int ltr558_i2c_read_2_bytes(u8 reg) +{ + int ret = 0; + u8 data[2] = {0}; + + ret = ltr558_i2c_read_bytes(reg, data, 2); + if(ret != 2) { + PRINT_ERR("READ ERROR!ret=%d\n", ret); + return -1; + } + + ret = data[1]; + ret = ( ret<<8) |data[0]; + + return ret; +} + +static int ltr558_i2c_read_1_byte(u8 reg) +{ + int ret = 0; + u8 data[1] = {0}; + + ret = ltr558_i2c_read_bytes(reg, data, 1); + if(ret != 2) { + PRINT_ERR("READ ERROR!ret=%d\n", ret); + return -1; + } + + ret = data[0]; + return ret; +} + +static int ltr558_i2c_write_2_bytes(u8 reg, u16 value) +{ + int ret = 0; + u8 data[3] = {0}; + + data[0] = reg; + data[1] = value & 0x00FF; + data[2] = value >> 8; + + ret = ltr558_i2c_write_bytes(data, 3); + if(ret != 1) { + PRINT_ERR("WRITE ERROR!ret=%d\n", ret); + return -1; + } + return 1; +} + +static int ltr558_i2c_write_1_byte(u8 reg, u8 value) +{ + int ret = 0; + u8 data[2] = {0}; + + data[0] = reg; + data[1] = value; + + ret = ltr558_i2c_write_bytes(data, 2); + if(ret != 1) { + PRINT_ERR("WRITE ERROR!ret=%d\n", ret); + return -1; + } + return 1; +} + +static int ltr_read_chip_info(struct i2c_client *client, char *buf) +{ + if(NULL == buf) { + return -1; + } + if(NULL == client) { + *buf = 0; + return -2; + } + + if( LTR_PLS_553 == LTR_PLS_MODE) + { + sprintf(buf, "LTR558ALS"); + printk("[LTR553] ltr_read_chip_info LTR553ALS\n"); + } + if(LTR_PLS_558 == LTR_PLS_MODE) + { + sprintf(buf, "LTR558ALS"); + printk("[LTR558] ltr_read_chip_info LTR558ALS\n"); + } + return 0; +} + +static int dynamic_cali(void) +{ + int i=0; + int j=0; + int val=0; + int data_total=0; + int noise=0; + + for (i = 0; i < 3; i++) + { + msleep(10); + val = ltr558_i2c_read_2_bytes(LTR558_PS_DATA_0); + data_total += val; + } + noise = data_total/3; + + if(noise < (dyna_cali + 500)) + { + if(noise < 1500) + { + ps_threshold_high = noise + 250; + ps_threshold_low = noise + 220; + }else{ + ps_threshold_high = 1800; + ps_threshold_low = 1600; + } + } + PRINT_INFO("ltr558_ps_enable, ps_threshold_high=%d, ps_threshold_low=%d\n", ps_threshold_high, ps_threshold_low); +} + +static int ltr558_ps_enable(u8 gainrange) +{ + int ret = -1; + u8 setgain; + ltr558_t *ltr_558als = (ltr558_t *)i2c_get_clientdata(this_client); + + if(LTR_PLS_553 == LTR_PLS_MODE) + { + switch (gainrange) + { + case PS_553_RANGE16: + setgain = MODE_PS_553_ON_Gain16; + break; + case PS_553_RANGE32: + setgain = MODE_PS_553_ON_Gain32; + break; + case PS_553_RANGE64: + setgain = MODE_PS_553_ON_Gain64; + break; + default: + setgain = MODE_PS_553_ON_Gain16; + break; + } + } + else + { + switch (gainrange) { + case PS_558_RANGE1: + setgain = MODE_PS_558_ON_Gain1; + break; + case PS_558_RANGE2: + setgain = MODE_PS_558_ON_Gain4; + break; + case PS_558_RANGE4: + setgain = MODE_PS_558_ON_Gain8; + break; + case PS_558_RANGE8: + setgain = MODE_PS_558_ON_Gain16; + break; + default: + setgain = MODE_PS_558_ON_Gain8; + break; + } + } + + ret = ltr558_i2c_write_1_byte(LTR558_PS_CONTR, setgain); + mdelay(WAKEUP_DELAY); + + if(setgain != ltr558_i2c_read_1_byte(LTR558_PS_CONTR)) + { + ret = ltr558_i2c_write_1_byte(LTR558_PS_CONTR, setgain); + mdelay(WAKEUP_DELAY); + } + + /*input report init*/ + input_report_abs(ltr_558als->input, ABS_DISTANCE, 1); + input_sync(ltr_558als->input); + + dynamic_cali(); + + PRINT_INFO("ltr558_ps_enable, gainrange=%d, ret=%d\n", gainrange, ret); + if(ret >= 0) + return 0; + else + return ret; +} + +static int ltr558_ps_disable(void) +{ + int ret = -1; + ltr558_t *ltr_558als = (ltr558_t *)i2c_get_clientdata(this_client); + ret = ltr558_i2c_write_1_byte(LTR558_PS_CONTR, MODE_PS_STANDBY); + + /*input report init*/ + input_report_abs(ltr_558als->input, ABS_DISTANCE, 1); + input_sync(ltr_558als->input); + + PRINT_INFO("ltr558_ps_disable, ret=%d\n", ret); + if(ret >= 0) + return 0; + else + return ret; +} + +static int ltr558_als_enable(u8 gainrange) +{ + int ret = -1; + u8 setgain; + + if(LTR_PLS_553 == LTR_PLS_MODE) + { + switch (gainrange) + { + case ALS_553_RANGE1_64K: + setgain = MODE_ALS_553_ON_Range1; + break; + + case ALS_553_RANGE2_32K: + setgain = MODE_ALS_553_ON_Range2; + break; + + case ALS_553_RANGE4_16K: + setgain = MODE_ALS_553_ON_Range4; + break; + + case ALS_553_RANGE8_8K: + setgain = MODE_ALS_553_ON_Range8; + break; + + case ALS_553_RANGE48_1K3: + setgain = MODE_ALS_553_ON_Range48; + break; + + case ALS_553_RANGE96_600: + setgain = MODE_ALS_553_ON_Range96; + break; + + default: + setgain = MODE_ALS_553_ON_Range1; + break; + } + } + else + { + switch (gainrange) + { + case ALS_558_RANGE1_320: + setgain = MODE_ALS_558_ON_Range1; + break; + + case ALS_558_RANGE2_64K: + setgain = MODE_ALS_558_ON_Range2; + break; + + default: + setgain = MODE_ALS_558_ON_Range1; + break; + } + } + + ret = ltr558_i2c_write_1_byte(LTR558_ALS_CONTR, setgain); + mdelay(WAKEUP_DELAY); + + if(setgain != ltr558_i2c_read_1_byte(LTR558_ALS_CONTR)) + { + ret = ltr558_i2c_write_1_byte(LTR558_ALS_CONTR, setgain); + mdelay(WAKEUP_DELAY); + } + + ltr558_i2c_read_1_byte(LTR558_ALS_PS_STATUS); + ltr558_i2c_read_2_bytes(LTR558_PS_DATA_0); + ltr558_i2c_read_2_bytes(LTR558_ALS_DATA_CH1); + ltr558_i2c_read_2_bytes(LTR558_ALS_DATA_CH0); + + PRINT_INFO("ltr558_als_enable, gainrange=%d, ret = %d\n", gainrange, ret); + if(ret >= 0) + return 0; + else + return ret; +} + +// Put ALS into Standby mode +static int ltr558_als_disable(void) +{ + int ret = -1; + ret = ltr558_i2c_write_1_byte(LTR558_ALS_CONTR, MODE_ALS_STANDBY); + PRINT_INFO("ltr558_als_disable, ret = %d \n", ret); + if(ret >= 0) + return 0; + else + return ret; +} + +static int ltr558_als_read(int gainrange) +{ + int luxdata_int; + int luxdata_flt, ratio; + int ch0, ch1; + + /*IMPORTANT!CH1 MUST BE READ FIRST!*/ + ch1 = ltr558_i2c_read_2_bytes(LTR558_ALS_DATA_CH1); + ch0 = ltr558_i2c_read_2_bytes(LTR558_ALS_DATA_CH0); + + PRINT_DBG("ch0=%d, ch1=%d\n", ch0, ch1); + if (0 == ch0) + ratio = 100; + else + ratio = (ch1 * 100) / ch0; + + // Compute Lux data from ALS data (ch0 and ch1) + // For Ratio < 0.69: + // 1.3618*CH0 – 1.5*CH1 + // For 0.69 <= Ratio < 1: + // 0.57*CH0 – 0.345*CH1 + // For high gain, divide the calculated lux by 150. + if (ratio < 69) { + luxdata_flt = (13618 * ch0) - (15000 * ch1); + luxdata_flt = luxdata_flt / 10000; + } else if ((ratio >= 69) && (ratio < 100)) { + luxdata_flt = (5700 * ch0) - (3450 * ch1); + luxdata_flt = luxdata_flt / 10000; + } else { + luxdata_flt = 0; + } + + // For Range1 + //if (gainrange == ALS_RANGE1_320) + // luxdata_flt = luxdata_flt / 150; + + luxdata_int = luxdata_flt / 80; + return luxdata_int; +} + +static int ltr558_open(struct inode *inode, struct file *file) +{ + PRINT_INFO("ltr558_open\n"); + return 0; +} + +static int ltr558_release(struct inode *inode, struct file *file) +{ + PRINT_INFO("ltr558_release\n"); + return 0; +} + +static long ltr558_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + void __user *argp = (void __user *)arg; + int flag, err; + char strbuf[256]; + PRINT_INFO("cmd = %d, %d\n", _IOC_NR(cmd), cmd); + switch (cmd) { + case LTR_IOCTL_SET_PFLAG: { + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + PRINT_INFO("LTR_IOCTL_SET_PFLAG = %d\n", flag); + if (1 == flag) { + ltr558_reg_init(); + msleep(20); + if (ltr558_ps_enable(p_gainrange)) + return -EIO; + } else if (0 == flag) { + if (ltr558_ps_disable()) + return -EIO; + } else { + return -EINVAL; + } + p_flag = flag; + } + break; + case LTR_IOCTL_SET_LFLAG: { + if (copy_from_user(&flag, argp, sizeof(flag))) + return -EFAULT; + PRINT_INFO("LTR_IOCTL_SET_LFLAG = %d\n", flag); + if (1 == flag) { + ltr558_reg_init(); + msleep(20); + if (ltr558_als_enable(l_gainrange)) + return -EIO; + } else if (0 == flag) { + if (ltr558_als_disable()) + return -EIO; + } else { + return -EINVAL; + } + l_flag = flag; + } + break; + case LTR_IOCTL_GET_CHIPINFO: { + err = ltr_read_chip_info(this_client, strbuf); + if(err < 0) + return -EFAULT; + if(copy_to_user(argp, strbuf, strlen(strbuf)+1)) + return -EFAULT; + } + break; + case LTR_IOCTL_GET_PFLAG: { + flag = p_flag; + PRINT_INFO("LTR_IOCTL_GET_PFLAG = %d\n", flag); + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + } + break; + case LTR_IOCTL_GET_LFLAG: { + flag = l_flag; + PRINT_INFO("LTR_IOCTL_GET_LFLAG = %d\n", flag); + if (copy_to_user(argp, &flag, sizeof(flag))) + return -EFAULT; + } + break; + default: + PRINT_ERR("unknown command: 0x%08X (%d)\n", cmd, cmd); + break; + } + return 0; +} + +static struct file_operations ltr558_fops = { + .owner = THIS_MODULE, + .open = ltr558_open, + .release = ltr558_release, + .unlocked_ioctl = ltr558_ioctl, +}; + +static struct miscdevice ltr558_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = LTR558_I2C_NAME, + .fops = <r558_fops, +}; + +static int get_min_value(int* array, int size) +{ + int ret = 0; + int i = 0; + ret = array[0]; + for(i=1; i array[i]) + ret = array[i]; + } + return ret; +} + +static int get_max_value(int* array, int size) +{ + int ret = 0; + int i = 0; + ret = array[0]; + for(i=1; i= ps_threshold_high) { // 3cm //high + /*ltr558_i2c_write_1_byte(LTR558_PS_THRES_UP_0, 0xff); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_UP_1, 0x07); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_LOW_0, 0xDC); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_LOW_1, 0x05); + */ + + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, 0x07FF); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, ps_threshold_low); + + input_report_abs(pls->input, ABS_DISTANCE, 0); + input_sync(pls->input); + } else if (value <= ps_threshold_low) { // 5cm //low + /*ltr558_i2c_write_1_byte(LTR558_PS_THRES_UP_0, 0x0E); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_UP_1, 0x06); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_LOW_0, 0x00); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_LOW_1, 0x00); + */ + + if(dyna_cali > 20 && value <(dyna_cali - 100)) + { + if(value < 1500) + { + ps_threshold_high = value + 250; + ps_threshold_low = value + 220; + }else{ + ps_threshold_high = 1800; + ps_threshold_low = 1600; + } + } + + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, ps_threshold_high); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, 0x0000); + + input_report_abs(pls->input, ABS_DISTANCE, 1); + input_sync(pls->input); + } + } + + if ((0x03 == (status & 0x03)) && (LTR_PLS_MODE == LTR_PLS_553)) {/*is 553 PS*/ + value = ltr558_i2c_read_2_bytes(LTR558_PS_DATA_0); + PRINT_DBG("LTR_PLS_MODE is pls 553 \n"); +#ifdef LTR558_ADAPTIVE + /*threshold detect process*/ + if(0 == ps_max || 0 == ps_min) { + ps_min = value; + ps_max = value; + ps_threshold = ps_min + MIN_SPACING; + } + if(value > ps_max) { + ps_max_filter[max_index++] = value; + if(ARRAY_SIZE(ps_max_filter) == max_index) { + ps_max = get_min_value(ps_max_filter, ARRAY_SIZE(ps_max_filter)); + ps_threshold = ((ps_max - ps_min) / DIVEDE) + ps_min; + if(ps_threshold - ps_min < MIN_SPACING) + ps_threshold = ps_min + MIN_SPACING; + max_index = 0; + } + min_index = 0; + } else if(value < ps_min) { + ps_min_filter[min_index++] = value; + if(ARRAY_SIZE(ps_min_filter) == min_index) { + ps_min = get_max_value(ps_min_filter, ARRAY_SIZE(ps_min_filter)); + ps_threshold = ((ps_max - ps_min) / DIVEDE) + ps_min; + if(ps_threshold - ps_min < MIN_SPACING) + ps_threshold = ps_min + MIN_SPACING; + min_index = 0; + } + max_index = 0; + } else { + max_index = 0; + min_index = 0; + } + /*threshold detect process end*/ + + if (value > (ps_threshold + DEBOUNCE)) { + input_report_abs(pls->input, ABS_DISTANCE, 0); + input_sync(pls->input); + } else if (value < (ps_threshold - DEBOUNCE)) { + input_report_abs(pls->input, ABS_DISTANCE, 1); + input_sync(pls->input); + } + PRINT_DBG("PS INT: PS_DATA_VAL = 0x%04X(%4d) ps_min=%4d ps_max=%4d ps_threshold=%4d\n", \ + value, value, ps_min, ps_max, ps_threshold); +#else + if (value >= ps_threshold) { + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, 0x07FF); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, ps_threshold); + input_report_abs(pls->input, ABS_DISTANCE, 0); + input_sync(pls->input); + } else if (value <= ps_threshold) { + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, ps_threshold); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, 0x0000); + input_report_abs(pls->input, ABS_DISTANCE, 1); + input_sync(pls->input); + } + PRINT_DBG("PS INT: PS_DATA_VAL = 0x%04X ( %d )\n", value, value); +#endif + } + if (0x0c == (status & 0x0c)) {/*is ALS*/ + value = ltr558_als_read(l_gainrange); + PRINT_DBG("ALS INT: ALS_DATA_VAL = 0x%04X(%4d)\n", value, value); + input_report_abs(pls->input, ABS_MISC, value); + input_sync(pls->input); + } + + enable_irq(pls->client->irq); +} + +static irqreturn_t ltr558_irq_handler(int irq, void *dev_id) +{ + ltr558_t *pls = (ltr558_t *) dev_id; + + disable_irq_nosync(pls->client->irq); + queue_work(pls->ltr_work_queue, &pls->work); + return IRQ_HANDLED; +} + +static int ltr558_sw_reset(void) +{ + int ret = 0; + ret = ltr558_i2c_write_1_byte(LTR558_ALS_CONTR, 0x04); + if(1 == ret) + PRINT_INFO("ltr558_sw_reset success\n"); + else + PRINT_ERR("ltr558_sw_reset failed! ret = %d\n", ret); + return ret; +} + +static int ltr558_reg_init(void) +{ + int ret = 0; +// ret = ltr558_sw_reset(); +// if(1 != ret) { +// PRINT_ERR("ltr558_reg_init failed! ret = %d\n", ret); +// return ret; +// } +// mdelay(PON_DELAY); + + if(LTR_PLS_558 == LTR_PLS_MODE){ + //set: LED Pulse Frequency=60KHz,LED Duty Cycle=100%,LED Peak Current=50mA + ltr558_i2c_write_1_byte(LTR558_PS_LED, 0x7B); + //set: LED Pulse Count=15 + ltr558_i2c_write_1_byte(LTR558_PS_N_PULSES , 0x1f); + //set: PS Measurement Repeat Rate: 0x00=50ms 0x02=100ms + ltr558_i2c_write_1_byte(LTR558_PS_MEAS_RATE, 0x00); + //set: ALS Integration Time=100ms, ALS Measurement Repeat Rate=100ms + ltr558_i2c_write_1_byte(LTR558_ALS_MEAS_RATE, 0x13); + ltr558_i2c_write_1_byte(LTR558_INTERRUPT_PERSIST,0x02); + //set: INT MODE=updated after every measurement, + //=active low level, + //=both PS & ALS measurement can trigger interrupt + ltr558_i2c_write_1_byte(LTR558_INTERRUPT, 0x0B); + }else{ + //set: LED Pulse Frequency=60KHz,LED Duty Cycle=100%,LED Peak Current=50mA + ltr558_i2c_write_1_byte(LTR558_PS_LED, 0x7B); + //set: LED Pulse Count=15 + ltr558_i2c_write_1_byte(LTR558_PS_N_PULSES , 0x08); + //set: PS Measurement Repeat Rate: 0x00=50ms 0x02=100ms + ltr558_i2c_write_1_byte(LTR558_PS_MEAS_RATE, 0x00); + //set: ALS Integration Time=100ms, ALS Measurement Repeat Rate=100ms + ltr558_i2c_write_1_byte(LTR558_ALS_MEAS_RATE, 0x03); + ltr558_i2c_write_1_byte(LTR558_INTERRUPT_PERSIST,0x12); + //set: INT MODE=updated after every measurement, + //=active low level, + //=both PS & ALS measurement can trigger interrupt + ltr558_i2c_write_1_byte(LTR558_INTERRUPT, 0x03); + } + //set: PS Persist=2, ALS Persist=2 + //ltr558_i2c_write_1_byte(LTR558_INTERRUPT_PERSIST, 0x22); + //set: PS Threshold + //ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, 0x0000); + //ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, 0x0000); + //set: ALS Threshold + //ltr558_i2c_write_2_bytes(LTR558_ALS_THRES_UP, 0x0000); + //ltr558_i2c_write_2_bytes(LTR558_ALS_THRES_LOW, 0x0001);/*DO NOT set:0x0000*/ + + // ps + ltr558_i2c_write_1_byte(LTR558_PS_THRES_UP_0, 0x00); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_UP_1, 0x03); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_LOW_0, 0xf0); + ltr558_i2c_write_1_byte(LTR558_PS_THRES_LOW_1, 0x02); + + // als + ltr558_i2c_write_1_byte(LTR558_ALS_THRES_UP_0, 0x00); + ltr558_i2c_write_1_byte(LTR558_ALS_THRES_UP_1, 0x00); + ltr558_i2c_write_1_byte(LTR558_ALS_THRES_LOW_0, 0x01); + ltr558_i2c_write_1_byte(LTR558_ALS_THRES_LOW_1, 0x00); + + msleep(WAKEUP_DELAY); + + PRINT_INFO("ltr558_reg_init success!\n"); + return ret; +} + +static int ltr558_version_check(void) +{ + int part_id = -1; + int manufacturer_id = -1; + part_id = ltr558_i2c_read_1_byte(LTR558_PART_NUMBER_ID); + manufacturer_id = ltr558_i2c_read_1_byte(LTR558_MANUFACTURER_ID); + PRINT_INFO("PART_ID: 0x%02X MANUFACTURER_ID: 0x%02X\n", part_id, manufacturer_id); + + if(part_id == 0x80 && manufacturer_id == 0x05) { + PRINT_INFO("I'm LTR558, and I'm working now\n"); + return 0; + }else if(part_id == 0x92 && manufacturer_id == 0x05) + { + PRINT_INFO("I'm LTR553, and I'm working now\n"); + return 0; + } + else if(part_id < 0 || manufacturer_id < 0) { + PRINT_ERR("can't read who am I\n"); + return -1; + } else { + PRINT_ERR("I'm working, but I'm NOT LTR558\n"); + return -1; + } +} + +static ssize_t ltr_558als_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + return sprintf(buff, "ps_min=%4d ps_max=%4d ps_threshold=%4d\n", ps_min, ps_max, ps_threshold); +} + +#ifdef LTR588_DBG +static int str2int(char *p, char *end) +{ + int result = 0; + int len = end - p + 1; + int c; + + for(; len > 0; len--, p++) { + if(p > end) + return -1; + c = *p - '0'; + if((unsigned int)c >= 10) + return -1; + result = result * 10 + c; + } + return result; +} + +/*parse a int from the string*/ +static int get_int(char *p, u8 max_len) +{ + char *start = p; + char *end =NULL; + + if(max_len > 60) { + PRINT_ERR("CMD ERROR!the max length of the cmd should less than 60\n"); + return -1; + } + for(; max_len > 0; max_len--, p++) { + if(*p >= '0' && *p <= '9') { + start = p; + break; + } + } + if(0 == max_len) + return -1; + + end = start; + + for(; max_len > 0; max_len--, p++) { + if(*p >= '0' && *p <= '9') { + end = p; + continue; + } + break; + } + + return str2int(start, end); +} + +static ssize_t ltr_558als_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t n) +{ + char *buff_temp = NULL; + + buff_temp = kmalloc(n, GFP_KERNEL); + if(NULL == buff_temp){ + PRINT_ERR("kmalloc err\n"); + return n; + } + + memcpy(buff_temp, buff, n); + + ps_threshold = get_int(buff_temp, n); + if(0x07FF < ps_threshold) { + ps_threshold = LTR558_PS_THRESHOLD; + PRINT_WARN("ps_threshold value over range, replace with the default value\n"); + } + PRINT_INFO("set ps_threshold = 0x%04X ( %d )\n", ps_threshold, ps_threshold); + + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, 0x0000); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, 0x0000); + + if(buff_temp != NULL) + kfree(buff_temp); + + return n; +} + +static int break_loop = 0; +static ssize_t ltr_558als_val_show(struct kobject *kobj, struct kobj_attribute *attr, char *buff) +{ + int measured_val = 0; + ltr558_t *pls = (ltr558_t *)i2c_get_clientdata(this_client); + + disable_irq_nosync(pls->client->irq); + ltr558_als_enable(l_gainrange); + ltr558_ps_enable(p_gainrange); + + break_loop = 0; + while(1) { + measured_val = ltr558_i2c_read_2_bytes(LTR558_PS_DATA_0); + PRINT_DBG("PS_DATA_VAL = 0x%04X ( %d )\n", measured_val, measured_val); + input_report_abs(pls->input, ABS_DISTANCE, measured_val); + input_sync(pls->input); + + measured_val = ltr558_als_read(l_gainrange); + PRINT_DBG("ALS_DATA_VAL = 0x%04X ( %d )\n", measured_val, measured_val); + input_report_abs(pls->input, ABS_MISC, measured_val); + input_sync(pls->input); + + if(1 == break_loop) + break; + msleep(200); + } + ltr558_ps_disable(); + ltr558_als_disable(); + enable_irq(pls->client->irq); + + return 0; +} + +static ssize_t ltr_558als_val_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buff, size_t n) +{ + break_loop = 1; + PRINT_INFO("stop show value\n"); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_UP, 0x0000); + ltr558_i2c_write_2_bytes(LTR558_PS_THRES_LOW, 0x0000); + return n; +} +#endif + +static struct kobject *ltr_558als_kobj; +static struct kobj_attribute ltr_558als_attr = + __ATTR(ps_threshold, 0644, ltr_558als_show, NULL); +#ifdef LTR588_DBG +static struct kobj_attribute ltr_558als_val_attr = + __ATTR(show_val, 0644, ltr_558als_val_show, ltr_558als_val_store); +#endif + +static int ltr_558als_sysfs_init(struct input_dev *input_dev) +{ + int ret = -1; + + ltr_558als_kobj = kobject_create_and_add("ltr_558als", &(input_dev->dev.kobj)); + if (ltr_558als_kobj == NULL) { + ret = -ENOMEM; + PRINT_ERR("register sysfs failed. ret = %d\n", ret); + return ret; + } + + ret = sysfs_create_file(ltr_558als_kobj, <r_558als_attr.attr); + if (ret) { + PRINT_ERR("create sysfs failed. ret = %d\n", ret); + return ret; + } +#ifdef LTR588_DBG + ret = sysfs_create_file(ltr_558als_kobj, <r_558als_val_attr.attr); + if (ret) { + PRINT_ERR("create sysfs failed. ret = %d\n", ret); + return ret; + } +#endif + return ret; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ltr558_early_suspend(struct early_suspend *handler) +{ + PRINT_INFO("ltr558_early_suspend\n"); +} + +static void ltr558_late_resume(struct early_suspend *handler) +{ + PRINT_INFO("ltr558_late_resume\n"); +} +#endif + +static int ltr558_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int ret = 0; + ltr558_t *ltr_558als = NULL; + struct input_dev *input_dev = NULL; + struct ltr558_pls_platform_data *pdata = client->dev.platform_data; + int chip_id = 0; +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Could not allocate struct ltr558_pls_platform_data"); + goto exit_allocate_pdata_failed; + } + pdata->irq_gpio_number = of_get_gpio(np, 0); + if(pdata->irq_gpio_number < 0){ + dev_err(&client->dev, "fail to get irq_gpio_number\n"); + kfree(pdata); + goto exit_irq_gpio_read_fail; + } + client->dev.platform_data = pdata; + } +#endif + ret = gpio_request(pdata->irq_gpio_number, LTR558_PLS_IRQ_PIN); + if(ret) { + PRINT_ERR("gpio_request failed!\n"); + goto exit_gpio_request_failed; + } + gpio_direction_input(pdata->irq_gpio_number); + client->irq = gpio_to_irq(pdata->irq_gpio_number); + PRINT_INFO("client->irq = %d\n", client->irq); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + PRINT_ERR("i2c_check_functionality failed!\n"); + ret = -ENODEV; + goto exit_i2c_check_functionality_failed; + } + + ltr_558als = kzalloc(sizeof(ltr558_t), GFP_KERNEL); + if (!ltr_558als) { + PRINT_ERR("kzalloc failed!\n"); + ret = -ENOMEM; + goto exit_kzalloc_failed; + } + + i2c_set_clientdata(client, ltr_558als); + ltr_558als->client = client; + this_client = client; + + chip_id = ltr558_i2c_read_1_byte(LTR558_PART_ID); + if(chip_id < 0) + { + PRINT_ERR("ltr558 or ltr553 read chip_id failed!\n"); + ret = -ENOMEM; + goto exit_read_chip_id_failed; + } + if(LTR_553_PART_ID == chip_id) + { + LTR_PLS_MODE = LTR_PLS_553; + p_gainrange = PS_553_RANGE16; + l_gainrange = ALS_553_RANGE1_64K; + } + else + { + LTR_PLS_MODE = LTR_PLS_558; + p_gainrange = PS_558_RANGE4; + l_gainrange = ALS_558_RANGE1_320; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + PRINT_ERR("input_allocate_device failed!\n"); + ret = -ENOMEM; + goto exit_input_allocate_device_failed; + } + + input_dev->name = LTR558_INPUT_DEV; + input_dev->phys = LTR558_INPUT_DEV; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0010; + ltr_558als->input = input_dev; + + __set_bit(EV_ABS, input_dev->evbit); + input_set_abs_params(input_dev, ABS_DISTANCE, 0, 1, 0, 0); + input_set_abs_params(input_dev, ABS_MISC, 0, 100001, 0, 0); + + ret = input_register_device(input_dev); + if (ret < 0) { + PRINT_ERR("input_register_device failed!\n"); + input_free_device(input_dev); + input_dev = NULL; + goto exit_input_register_device_failed; + } + + ret = misc_register(<r558_device); + if (ret) { + PRINT_ERR("misc_register failed!\n"); + goto exit_misc_register_failed; + } + + if (ltr558_reg_init() < 0) { + PRINT_ERR("ltr558_reg_init failed!\n"); + ret = -1; + goto exit_ltr558_reg_init_failed; + } + + ret = ltr558_version_check(); + if(ret) { + PRINT_ERR("ltr558_version_check failed!\n"); + goto exit_ltr558_version_check_failed; + } + + INIT_WORK(<r_558als->work, ltr558_work); + ltr_558als->ltr_work_queue = create_singlethread_workqueue(LTR558_I2C_NAME); + if (!ltr_558als->ltr_work_queue) { + PRINT_ERR("create_singlethread_workqueue failed!\n"); + goto exit_create_singlethread_workqueue_failed; + } + + if (client->irq > 0) { + ret = request_irq(client->irq, ltr558_irq_handler, IRQ_TYPE_LEVEL_LOW | IRQF_NO_SUSPEND, client->name, ltr_558als); + if (ret < 0) { + PRINT_ERR("request_irq failed!\n"); + goto exit_request_irq_failed; + } + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + ltr_558als->ltr_early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 25; + ltr_558als->ltr_early_suspend.suspend = ltr558_early_suspend; + ltr_558als->ltr_early_suspend.resume = ltr558_late_resume; + register_early_suspend(<r_558als->ltr_early_suspend); +#endif + + ret = ltr_558als_sysfs_init(input_dev); + if(ret) { + PRINT_ERR("ltr_558als_sysfs_init failed!\n"); + goto exit_ltr_558als_sysfs_init_failed; + } + + PRINT_INFO("probe success!\n"); + return 0; + +exit_ltr_558als_sysfs_init_failed: + free_irq(ltr_558als->client->irq, ltr_558als); +exit_request_irq_failed: + destroy_workqueue(ltr_558als->ltr_work_queue); + ltr_558als->ltr_work_queue = NULL; +exit_create_singlethread_workqueue_failed: +exit_ltr558_version_check_failed: +exit_ltr558_reg_init_failed: + misc_deregister(<r558_device); +exit_misc_register_failed: + input_unregister_device(input_dev); +exit_input_register_device_failed: +exit_input_allocate_device_failed: +exit_read_chip_id_failed: + kfree(ltr_558als); + ltr_558als = NULL; +exit_kzalloc_failed: +exit_i2c_check_functionality_failed: + gpio_free(pdata->irq_gpio_number); +exit_gpio_request_failed: +exit_irq_gpio_read_fail: +exit_allocate_pdata_failed: + PRINT_ERR("probe failed!\n"); + return ret; +} + +static int ltr558_remove(struct i2c_client *client) +{ + ltr558_t *ltr_558als = i2c_get_clientdata(client); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(<r_558als->ltr_early_suspend); +#endif + + flush_workqueue(ltr_558als->ltr_work_queue); + destroy_workqueue(ltr_558als->ltr_work_queue); + ltr_558als->ltr_work_queue = NULL; + + misc_deregister(<r558_device); + input_unregister_device(ltr_558als->input); + input_free_device(ltr_558als->input); + ltr_558als->input = NULL; + free_irq(ltr_558als->client->irq, ltr_558als); + gpio_free(irq_to_gpio(ltr_558als->client->irq)); + kfree(ltr_558als); + ltr_558als = NULL; + this_client = NULL; + + PRINT_INFO("ltr558_remove\n"); + return 0; +} + +static const struct i2c_device_id ltr558_id[] = { + {LTR558_I2C_NAME, 0}, + {} +}; + +static const struct of_device_id ltr558_of_match[] = { + { .compatible = "LITEON,ltr_558als", }, + {} +}; +MODULE_DEVICE_TABLE(of, ltr558_of_match); +static struct i2c_driver ltr558_driver = { + .driver = { + .owner = THIS_MODULE, + .name = LTR558_I2C_NAME, + .of_match_table = ltr558_of_match, + }, + .probe = ltr558_probe, + .remove = ltr558_remove, + .id_table = ltr558_id, +}; + +static int __init ltr558_init(void) +{ + int ret = -1; + ret = i2c_add_driver(<r558_driver); + if(ret) { + PRINT_ERR("i2c_add_driver failed!\n"); + return ret; + } + return ret; +} + +static void __exit ltr558_exit(void) +{ + i2c_del_driver(<r558_driver); +} + +late_initcall(ltr558_init); +module_exit(ltr558_exit); + +MODULE_AUTHOR("Yaochuan Li "); +MODULE_DESCRIPTION("Proximity&Light Sensor LTR558ALS DRIVER"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/m68kspkr.c b/drivers/input/misc/m68kspkr.c new file mode 100644 index 00000000..b40ee4b4 --- /dev/null +++ b/drivers/input/misc/m68kspkr.c @@ -0,0 +1,151 @@ +/* + * m68k beeper driver for Linux + * + * Copyright (c) 2002 Richard Zidlicky + * Copyright (c) 2002 Vojtech Pavlik + * Copyright (c) 1992 Orest Zborowski + * + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation + */ + +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Richard Zidlicky "); +MODULE_DESCRIPTION("m68k beeper driver"); +MODULE_LICENSE("GPL"); + +static struct platform_device *m68kspkr_platform_device; + +static int m68kspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + unsigned int count = 0; + + if (type != EV_SND) + return -1; + + switch (code) { + case SND_BELL: if (value) value = 1000; + case SND_TONE: break; + default: return -1; + } + + if (value > 20 && value < 32767) + count = 1193182 / value; + + mach_beep(count, -1); + + return 0; +} + +static int m68kspkr_probe(struct platform_device *dev) +{ + struct input_dev *input_dev; + int err; + + input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + input_dev->name = "m68k beeper"; + input_dev->phys = "m68k/generic"; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x001f; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &dev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_SND); + input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); + input_dev->event = m68kspkr_event; + + err = input_register_device(input_dev); + if (err) { + input_free_device(input_dev); + return err; + } + + platform_set_drvdata(dev, input_dev); + + return 0; +} + +static int m68kspkr_remove(struct platform_device *dev) +{ + struct input_dev *input_dev = platform_get_drvdata(dev); + + input_unregister_device(input_dev); + platform_set_drvdata(dev, NULL); + /* turn off the speaker */ + m68kspkr_event(NULL, EV_SND, SND_BELL, 0); + + return 0; +} + +static void m68kspkr_shutdown(struct platform_device *dev) +{ + /* turn off the speaker */ + m68kspkr_event(NULL, EV_SND, SND_BELL, 0); +} + +static struct platform_driver m68kspkr_platform_driver = { + .driver = { + .name = "m68kspkr", + .owner = THIS_MODULE, + }, + .probe = m68kspkr_probe, + .remove = m68kspkr_remove, + .shutdown = m68kspkr_shutdown, +}; + +static int __init m68kspkr_init(void) +{ + int err; + + if (!mach_beep) { + printk(KERN_INFO "m68kspkr: no lowlevel beep support\n"); + return -ENODEV; + } + + err = platform_driver_register(&m68kspkr_platform_driver); + if (err) + return err; + + m68kspkr_platform_device = platform_device_alloc("m68kspkr", -1); + if (!m68kspkr_platform_device) { + err = -ENOMEM; + goto err_unregister_driver; + } + + err = platform_device_add(m68kspkr_platform_device); + if (err) + goto err_free_device; + + return 0; + + err_free_device: + platform_device_put(m68kspkr_platform_device); + err_unregister_driver: + platform_driver_unregister(&m68kspkr_platform_driver); + + return err; +} + +static void __exit m68kspkr_exit(void) +{ + platform_device_unregister(m68kspkr_platform_device); + platform_driver_unregister(&m68kspkr_platform_driver); +} + +module_init(m68kspkr_init); +module_exit(m68kspkr_exit); diff --git a/drivers/input/misc/max8925_onkey.c b/drivers/input/misc/max8925_onkey.c new file mode 100644 index 00000000..f9179b25 --- /dev/null +++ b/drivers/input/misc/max8925_onkey.c @@ -0,0 +1,201 @@ +/** + * MAX8925 ONKEY driver + * + * Copyright (C) 2009 Marvell International Ltd. + * Haojian Zhuang + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define SW_INPUT (1 << 7) /* 0/1 -- up/down */ +#define HARDRESET_EN (1 << 7) +#define PWREN_EN (1 << 7) + +struct max8925_onkey_info { + struct input_dev *idev; + struct i2c_client *i2c; + struct device *dev; + unsigned int irq[2]; +}; + +/* + * MAX8925 gives us an interrupt when ONKEY is pressed or released. + * max8925_set_bits() operates I2C bus and may sleep. So implement + * it in thread IRQ handler. + */ +static irqreturn_t max8925_onkey_handler(int irq, void *data) +{ + struct max8925_onkey_info *info = data; + int state; + + state = max8925_reg_read(info->i2c, MAX8925_ON_OFF_STATUS); + + input_report_key(info->idev, KEY_POWER, state & SW_INPUT); + input_sync(info->idev); + + dev_dbg(info->dev, "onkey state:%d\n", state); + + /* Enable hardreset to halt if system isn't shutdown on time */ + max8925_set_bits(info->i2c, MAX8925_SYSENSEL, + HARDRESET_EN, HARDRESET_EN); + + return IRQ_HANDLED; +} + +static int max8925_onkey_probe(struct platform_device *pdev) +{ + struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); + struct max8925_onkey_info *info; + struct input_dev *input; + int irq[2], error; + + irq[0] = platform_get_irq(pdev, 0); + if (irq[0] < 0) { + dev_err(&pdev->dev, "No IRQ resource!\n"); + return -EINVAL; + } + + irq[1] = platform_get_irq(pdev, 1); + if (irq[1] < 0) { + dev_err(&pdev->dev, "No IRQ resource!\n"); + return -EINVAL; + } + + info = kzalloc(sizeof(struct max8925_onkey_info), GFP_KERNEL); + input = input_allocate_device(); + if (!info || !input) { + error = -ENOMEM; + goto err_free_mem; + } + + info->idev = input; + info->i2c = chip->i2c; + info->dev = &pdev->dev; + info->irq[0] = irq[0]; + info->irq[1] = irq[1]; + + input->name = "max8925_on"; + input->phys = "max8925_on/input0"; + input->id.bustype = BUS_I2C; + input->dev.parent = &pdev->dev; + input_set_capability(input, EV_KEY, KEY_POWER); + + error = request_threaded_irq(irq[0], NULL, max8925_onkey_handler, + IRQF_ONESHOT, "onkey-down", info); + if (error < 0) { + dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n", + irq[0], error); + goto err_free_mem; + } + + error = request_threaded_irq(irq[1], NULL, max8925_onkey_handler, + IRQF_ONESHOT, "onkey-up", info); + if (error < 0) { + dev_err(chip->dev, "Failed to request IRQ: #%d: %d\n", + irq[1], error); + goto err_free_irq0; + } + + error = input_register_device(info->idev); + if (error) { + dev_err(chip->dev, "Can't register input device: %d\n", error); + goto err_free_irq1; + } + + platform_set_drvdata(pdev, info); + device_init_wakeup(&pdev->dev, 1); + + return 0; + +err_free_irq1: + free_irq(irq[1], info); +err_free_irq0: + free_irq(irq[0], info); +err_free_mem: + input_free_device(input); + kfree(info); + + return error; +} + +static int max8925_onkey_remove(struct platform_device *pdev) +{ + struct max8925_onkey_info *info = platform_get_drvdata(pdev); + struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); + + free_irq(info->irq[0] + chip->irq_base, info); + free_irq(info->irq[1] + chip->irq_base, info); + input_unregister_device(info->idev); + kfree(info); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int max8925_onkey_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct max8925_onkey_info *info = platform_get_drvdata(pdev); + struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); + + if (device_may_wakeup(dev)) { + chip->wakeup_flag |= 1 << info->irq[0]; + chip->wakeup_flag |= 1 << info->irq[1]; + } + + return 0; +} + +static int max8925_onkey_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct max8925_onkey_info *info = platform_get_drvdata(pdev); + struct max8925_chip *chip = dev_get_drvdata(pdev->dev.parent); + + if (device_may_wakeup(dev)) { + chip->wakeup_flag &= ~(1 << info->irq[0]); + chip->wakeup_flag &= ~(1 << info->irq[1]); + } + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(max8925_onkey_pm_ops, max8925_onkey_suspend, max8925_onkey_resume); + +static struct platform_driver max8925_onkey_driver = { + .driver = { + .name = "max8925-onkey", + .owner = THIS_MODULE, + .pm = &max8925_onkey_pm_ops, + }, + .probe = max8925_onkey_probe, + .remove = max8925_onkey_remove, +}; +module_platform_driver(max8925_onkey_driver); + +MODULE_DESCRIPTION("Maxim MAX8925 ONKEY driver"); +MODULE_AUTHOR("Haojian Zhuang "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/max8997_haptic.c b/drivers/input/misc/max8997_haptic.c new file mode 100644 index 00000000..e9731332 --- /dev/null +++ b/drivers/input/misc/max8997_haptic.c @@ -0,0 +1,407 @@ +/* + * MAX8997-haptic controller driver + * + * Copyright (C) 2012 Samsung Electronics + * Donggeun Kim + * + * This program is not provided / owned by Maxim Integrated Products. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Haptic configuration 2 register */ +#define MAX8997_MOTOR_TYPE_SHIFT 7 +#define MAX8997_ENABLE_SHIFT 6 +#define MAX8997_MODE_SHIFT 5 + +/* Haptic driver configuration register */ +#define MAX8997_CYCLE_SHIFT 6 +#define MAX8997_SIG_PERIOD_SHIFT 4 +#define MAX8997_SIG_DUTY_SHIFT 2 +#define MAX8997_PWM_DUTY_SHIFT 0 + +struct max8997_haptic { + struct device *dev; + struct i2c_client *client; + struct input_dev *input_dev; + struct regulator *regulator; + + struct work_struct work; + struct mutex mutex; + + bool enabled; + unsigned int level; + + struct pwm_device *pwm; + unsigned int pwm_period; + enum max8997_haptic_pwm_divisor pwm_divisor; + + enum max8997_haptic_motor_type type; + enum max8997_haptic_pulse_mode mode; + + unsigned int internal_mode_pattern; + unsigned int pattern_cycle; + unsigned int pattern_signal_period; +}; + +static int max8997_haptic_set_duty_cycle(struct max8997_haptic *chip) +{ + int ret = 0; + + if (chip->mode == MAX8997_EXTERNAL_MODE) { + unsigned int duty = chip->pwm_period * chip->level / 100; + ret = pwm_config(chip->pwm, duty, chip->pwm_period); + } else { + int i; + u8 duty_index = 0; + + for (i = 0; i <= 64; i++) { + if (chip->level <= i * 100 / 64) { + duty_index = i; + break; + } + } + switch (chip->internal_mode_pattern) { + case 0: + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGPWMDC1, duty_index); + break; + case 1: + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGPWMDC2, duty_index); + break; + case 2: + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGPWMDC3, duty_index); + break; + case 3: + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGPWMDC4, duty_index); + break; + default: + break; + } + } + return ret; +} + +static void max8997_haptic_configure(struct max8997_haptic *chip) +{ + u8 value; + + value = chip->type << MAX8997_MOTOR_TYPE_SHIFT | + chip->enabled << MAX8997_ENABLE_SHIFT | + chip->mode << MAX8997_MODE_SHIFT | chip->pwm_divisor; + max8997_write_reg(chip->client, MAX8997_HAPTIC_REG_CONF2, value); + + if (chip->mode == MAX8997_INTERNAL_MODE && chip->enabled) { + value = chip->internal_mode_pattern << MAX8997_CYCLE_SHIFT | + chip->internal_mode_pattern << MAX8997_SIG_PERIOD_SHIFT | + chip->internal_mode_pattern << MAX8997_SIG_DUTY_SHIFT | + chip->internal_mode_pattern << MAX8997_PWM_DUTY_SHIFT; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_DRVCONF, value); + + switch (chip->internal_mode_pattern) { + case 0: + value = chip->pattern_cycle << 4; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_CYCLECONF1, value); + value = chip->pattern_signal_period; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGCONF1, value); + break; + + case 1: + value = chip->pattern_cycle; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_CYCLECONF1, value); + value = chip->pattern_signal_period; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGCONF2, value); + break; + + case 2: + value = chip->pattern_cycle << 4; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_CYCLECONF2, value); + value = chip->pattern_signal_period; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGCONF3, value); + break; + + case 3: + value = chip->pattern_cycle; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_CYCLECONF2, value); + value = chip->pattern_signal_period; + max8997_write_reg(chip->client, + MAX8997_HAPTIC_REG_SIGCONF4, value); + break; + + default: + break; + } + } +} + +static void max8997_haptic_enable(struct max8997_haptic *chip) +{ + int error; + + mutex_lock(&chip->mutex); + + error = max8997_haptic_set_duty_cycle(chip); + if (error) { + dev_err(chip->dev, "set_pwm_cycle failed, error: %d\n", error); + goto out; + } + + if (!chip->enabled) { + chip->enabled = true; + regulator_enable(chip->regulator); + max8997_haptic_configure(chip); + if (chip->mode == MAX8997_EXTERNAL_MODE) + pwm_enable(chip->pwm); + } + +out: + mutex_unlock(&chip->mutex); +} + +static void max8997_haptic_disable(struct max8997_haptic *chip) +{ + mutex_lock(&chip->mutex); + + if (chip->enabled) { + chip->enabled = false; + max8997_haptic_configure(chip); + if (chip->mode == MAX8997_EXTERNAL_MODE) + pwm_disable(chip->pwm); + regulator_disable(chip->regulator); + } + + mutex_unlock(&chip->mutex); +} + +static void max8997_haptic_play_effect_work(struct work_struct *work) +{ + struct max8997_haptic *chip = + container_of(work, struct max8997_haptic, work); + + if (chip->level) + max8997_haptic_enable(chip); + else + max8997_haptic_disable(chip); +} + +static int max8997_haptic_play_effect(struct input_dev *dev, void *data, + struct ff_effect *effect) +{ + struct max8997_haptic *chip = input_get_drvdata(dev); + + chip->level = effect->u.rumble.strong_magnitude; + if (!chip->level) + chip->level = effect->u.rumble.weak_magnitude; + + schedule_work(&chip->work); + + return 0; +} + +static void max8997_haptic_close(struct input_dev *dev) +{ + struct max8997_haptic *chip = input_get_drvdata(dev); + + cancel_work_sync(&chip->work); + max8997_haptic_disable(chip); +} + +static int max8997_haptic_probe(struct platform_device *pdev) +{ + struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); + const struct max8997_platform_data *pdata = + dev_get_platdata(iodev->dev); + const struct max8997_haptic_platform_data *haptic_pdata = + pdata->haptic_pdata; + struct max8997_haptic *chip; + struct input_dev *input_dev; + int error; + + if (!haptic_pdata) { + dev_err(&pdev->dev, "no haptic platform data\n"); + return -EINVAL; + } + + chip = kzalloc(sizeof(struct max8997_haptic), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!chip || !input_dev) { + dev_err(&pdev->dev, "unable to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + INIT_WORK(&chip->work, max8997_haptic_play_effect_work); + mutex_init(&chip->mutex); + + chip->client = iodev->haptic; + chip->dev = &pdev->dev; + chip->input_dev = input_dev; + chip->pwm_period = haptic_pdata->pwm_period; + chip->type = haptic_pdata->type; + chip->mode = haptic_pdata->mode; + chip->pwm_divisor = haptic_pdata->pwm_divisor; + + switch (chip->mode) { + case MAX8997_INTERNAL_MODE: + chip->internal_mode_pattern = + haptic_pdata->internal_mode_pattern; + chip->pattern_cycle = haptic_pdata->pattern_cycle; + chip->pattern_signal_period = + haptic_pdata->pattern_signal_period; + break; + + case MAX8997_EXTERNAL_MODE: + chip->pwm = pwm_request(haptic_pdata->pwm_channel_id, + "max8997-haptic"); + if (IS_ERR(chip->pwm)) { + error = PTR_ERR(chip->pwm); + dev_err(&pdev->dev, + "unable to request PWM for haptic, error: %d\n", + error); + goto err_free_mem; + } + break; + + default: + dev_err(&pdev->dev, + "Invalid chip mode specified (%d)\n", chip->mode); + error = -EINVAL; + goto err_free_mem; + } + + chip->regulator = regulator_get(&pdev->dev, "inmotor"); + if (IS_ERR(chip->regulator)) { + error = PTR_ERR(chip->regulator); + dev_err(&pdev->dev, + "unable to get regulator, error: %d\n", + error); + goto err_free_pwm; + } + + input_dev->name = "max8997-haptic"; + input_dev->id.version = 1; + input_dev->dev.parent = &pdev->dev; + input_dev->close = max8997_haptic_close; + input_set_drvdata(input_dev, chip); + input_set_capability(input_dev, EV_FF, FF_RUMBLE); + + error = input_ff_create_memless(input_dev, NULL, + max8997_haptic_play_effect); + if (error) { + dev_err(&pdev->dev, + "unable to create FF device, error: %d\n", + error); + goto err_put_regulator; + } + + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, + "unable to register input device, error: %d\n", + error); + goto err_destroy_ff; + } + + platform_set_drvdata(pdev, chip); + return 0; + +err_destroy_ff: + input_ff_destroy(input_dev); +err_put_regulator: + regulator_put(chip->regulator); +err_free_pwm: + if (chip->mode == MAX8997_EXTERNAL_MODE) + pwm_free(chip->pwm); +err_free_mem: + input_free_device(input_dev); + kfree(chip); + + return error; +} + +static int max8997_haptic_remove(struct platform_device *pdev) +{ + struct max8997_haptic *chip = platform_get_drvdata(pdev); + + input_unregister_device(chip->input_dev); + regulator_put(chip->regulator); + + if (chip->mode == MAX8997_EXTERNAL_MODE) + pwm_free(chip->pwm); + + kfree(chip); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int max8997_haptic_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct max8997_haptic *chip = platform_get_drvdata(pdev); + + max8997_haptic_disable(chip); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(max8997_haptic_pm_ops, max8997_haptic_suspend, NULL); + +static const struct platform_device_id max8997_haptic_id[] = { + { "max8997-haptic", 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, max8997_haptic_id); + +static struct platform_driver max8997_haptic_driver = { + .driver = { + .name = "max8997-haptic", + .owner = THIS_MODULE, + .pm = &max8997_haptic_pm_ops, + }, + .probe = max8997_haptic_probe, + .remove = max8997_haptic_remove, + .id_table = max8997_haptic_id, +}; +module_platform_driver(max8997_haptic_driver); + +MODULE_ALIAS("platform:max8997-haptic"); +MODULE_AUTHOR("Donggeun Kim "); +MODULE_DESCRIPTION("max8997_haptic driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/mc13783-pwrbutton.c b/drivers/input/misc/mc13783-pwrbutton.c new file mode 100644 index 00000000..0906ca59 --- /dev/null +++ b/drivers/input/misc/mc13783-pwrbutton.c @@ -0,0 +1,272 @@ +/** + * Copyright (C) 2011 Philippe Rétornaz + * + * Based on twl4030-pwrbutton driver by: + * Peter De Schrijver + * Felipe Balbi + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct mc13783_pwrb { + struct input_dev *pwr; + struct mc13xxx *mc13783; +#define MC13783_PWRB_B1_POL_INVERT (1 << 0) +#define MC13783_PWRB_B2_POL_INVERT (1 << 1) +#define MC13783_PWRB_B3_POL_INVERT (1 << 2) + int flags; + unsigned short keymap[3]; +}; + +#define MC13783_REG_INTERRUPT_SENSE_1 5 +#define MC13783_IRQSENSE1_ONOFD1S (1 << 3) +#define MC13783_IRQSENSE1_ONOFD2S (1 << 4) +#define MC13783_IRQSENSE1_ONOFD3S (1 << 5) + +#define MC13783_REG_POWER_CONTROL_2 15 +#define MC13783_POWER_CONTROL_2_ON1BDBNC 4 +#define MC13783_POWER_CONTROL_2_ON2BDBNC 6 +#define MC13783_POWER_CONTROL_2_ON3BDBNC 8 +#define MC13783_POWER_CONTROL_2_ON1BRSTEN (1 << 1) +#define MC13783_POWER_CONTROL_2_ON2BRSTEN (1 << 2) +#define MC13783_POWER_CONTROL_2_ON3BRSTEN (1 << 3) + +static irqreturn_t button_irq(int irq, void *_priv) +{ + struct mc13783_pwrb *priv = _priv; + int val; + + mc13xxx_irq_ack(priv->mc13783, irq); + mc13xxx_reg_read(priv->mc13783, MC13783_REG_INTERRUPT_SENSE_1, &val); + + switch (irq) { + case MC13783_IRQ_ONOFD1: + val = val & MC13783_IRQSENSE1_ONOFD1S ? 1 : 0; + if (priv->flags & MC13783_PWRB_B1_POL_INVERT) + val ^= 1; + input_report_key(priv->pwr, priv->keymap[0], val); + break; + + case MC13783_IRQ_ONOFD2: + val = val & MC13783_IRQSENSE1_ONOFD2S ? 1 : 0; + if (priv->flags & MC13783_PWRB_B2_POL_INVERT) + val ^= 1; + input_report_key(priv->pwr, priv->keymap[1], val); + break; + + case MC13783_IRQ_ONOFD3: + val = val & MC13783_IRQSENSE1_ONOFD3S ? 1 : 0; + if (priv->flags & MC13783_PWRB_B3_POL_INVERT) + val ^= 1; + input_report_key(priv->pwr, priv->keymap[2], val); + break; + } + + input_sync(priv->pwr); + + return IRQ_HANDLED; +} + +static int mc13783_pwrbutton_probe(struct platform_device *pdev) +{ + const struct mc13xxx_buttons_platform_data *pdata; + struct mc13xxx *mc13783 = dev_get_drvdata(pdev->dev.parent); + struct input_dev *pwr; + struct mc13783_pwrb *priv; + int err = 0; + int reg = 0; + + pdata = dev_get_platdata(&pdev->dev); + if (!pdata) { + dev_err(&pdev->dev, "missing platform data\n"); + return -ENODEV; + } + + pwr = input_allocate_device(); + if (!pwr) { + dev_dbg(&pdev->dev, "Can't allocate power button\n"); + return -ENOMEM; + } + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) { + err = -ENOMEM; + dev_dbg(&pdev->dev, "Can't allocate power button\n"); + goto free_input_dev; + } + + reg |= (pdata->b1on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON1BDBNC; + reg |= (pdata->b2on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON2BDBNC; + reg |= (pdata->b3on_flags & 0x3) << MC13783_POWER_CONTROL_2_ON3BDBNC; + + priv->pwr = pwr; + priv->mc13783 = mc13783; + + mc13xxx_lock(mc13783); + + if (pdata->b1on_flags & MC13783_BUTTON_ENABLE) { + priv->keymap[0] = pdata->b1on_key; + if (pdata->b1on_key != KEY_RESERVED) + __set_bit(pdata->b1on_key, pwr->keybit); + + if (pdata->b1on_flags & MC13783_BUTTON_POL_INVERT) + priv->flags |= MC13783_PWRB_B1_POL_INVERT; + + if (pdata->b1on_flags & MC13783_BUTTON_RESET_EN) + reg |= MC13783_POWER_CONTROL_2_ON1BRSTEN; + + err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD1, + button_irq, "b1on", priv); + if (err) { + dev_dbg(&pdev->dev, "Can't request irq\n"); + goto free_priv; + } + } + + if (pdata->b2on_flags & MC13783_BUTTON_ENABLE) { + priv->keymap[1] = pdata->b2on_key; + if (pdata->b2on_key != KEY_RESERVED) + __set_bit(pdata->b2on_key, pwr->keybit); + + if (pdata->b2on_flags & MC13783_BUTTON_POL_INVERT) + priv->flags |= MC13783_PWRB_B2_POL_INVERT; + + if (pdata->b2on_flags & MC13783_BUTTON_RESET_EN) + reg |= MC13783_POWER_CONTROL_2_ON2BRSTEN; + + err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD2, + button_irq, "b2on", priv); + if (err) { + dev_dbg(&pdev->dev, "Can't request irq\n"); + goto free_irq_b1; + } + } + + if (pdata->b3on_flags & MC13783_BUTTON_ENABLE) { + priv->keymap[2] = pdata->b3on_key; + if (pdata->b3on_key != KEY_RESERVED) + __set_bit(pdata->b3on_key, pwr->keybit); + + if (pdata->b3on_flags & MC13783_BUTTON_POL_INVERT) + priv->flags |= MC13783_PWRB_B3_POL_INVERT; + + if (pdata->b3on_flags & MC13783_BUTTON_RESET_EN) + reg |= MC13783_POWER_CONTROL_2_ON3BRSTEN; + + err = mc13xxx_irq_request(mc13783, MC13783_IRQ_ONOFD3, + button_irq, "b3on", priv); + if (err) { + dev_dbg(&pdev->dev, "Can't request irq: %d\n", err); + goto free_irq_b2; + } + } + + mc13xxx_reg_rmw(mc13783, MC13783_REG_POWER_CONTROL_2, 0x3FE, reg); + + mc13xxx_unlock(mc13783); + + pwr->name = "mc13783_pwrbutton"; + pwr->phys = "mc13783_pwrbutton/input0"; + pwr->dev.parent = &pdev->dev; + + pwr->keycode = priv->keymap; + pwr->keycodemax = ARRAY_SIZE(priv->keymap); + pwr->keycodesize = sizeof(priv->keymap[0]); + __set_bit(EV_KEY, pwr->evbit); + + err = input_register_device(pwr); + if (err) { + dev_dbg(&pdev->dev, "Can't register power button: %d\n", err); + goto free_irq; + } + + platform_set_drvdata(pdev, priv); + + return 0; + +free_irq: + mc13xxx_lock(mc13783); + + if (pdata->b3on_flags & MC13783_BUTTON_ENABLE) + mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD3, priv); + +free_irq_b2: + if (pdata->b2on_flags & MC13783_BUTTON_ENABLE) + mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD2, priv); + +free_irq_b1: + if (pdata->b1on_flags & MC13783_BUTTON_ENABLE) + mc13xxx_irq_free(mc13783, MC13783_IRQ_ONOFD1, priv); + +free_priv: + mc13xxx_unlock(mc13783); + kfree(priv); + +free_input_dev: + input_free_device(pwr); + + return err; +} + +static int mc13783_pwrbutton_remove(struct platform_device *pdev) +{ + struct mc13783_pwrb *priv = platform_get_drvdata(pdev); + const struct mc13xxx_buttons_platform_data *pdata; + + pdata = dev_get_platdata(&pdev->dev); + + mc13xxx_lock(priv->mc13783); + + if (pdata->b3on_flags & MC13783_BUTTON_ENABLE) + mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD3, priv); + if (pdata->b2on_flags & MC13783_BUTTON_ENABLE) + mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD2, priv); + if (pdata->b1on_flags & MC13783_BUTTON_ENABLE) + mc13xxx_irq_free(priv->mc13783, MC13783_IRQ_ONOFD1, priv); + + mc13xxx_unlock(priv->mc13783); + + input_unregister_device(priv->pwr); + kfree(priv); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver mc13783_pwrbutton_driver = { + .probe = mc13783_pwrbutton_probe, + .remove = mc13783_pwrbutton_remove, + .driver = { + .name = "mc13783-pwrbutton", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver(mc13783_pwrbutton_driver); + +MODULE_ALIAS("platform:mc13783-pwrbutton"); +MODULE_DESCRIPTION("MC13783 Power Button"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Philippe Retornaz"); diff --git a/drivers/input/misc/mma8450.c b/drivers/input/misc/mma8450.c new file mode 100644 index 00000000..f3309696 --- /dev/null +++ b/drivers/input/misc/mma8450.c @@ -0,0 +1,254 @@ +/* + * Driver for Freescale's 3-Axis Accelerometer MMA8450 + * + * Copyright (C) 2011 Freescale Semiconductor, Inc. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define MMA8450_DRV_NAME "mma8450" + +#define MODE_CHANGE_DELAY_MS 100 +#define POLL_INTERVAL 100 +#define POLL_INTERVAL_MAX 500 + +/* register definitions */ +#define MMA8450_STATUS 0x00 +#define MMA8450_STATUS_ZXYDR 0x08 + +#define MMA8450_OUT_X8 0x01 +#define MMA8450_OUT_Y8 0x02 +#define MMA8450_OUT_Z8 0x03 + +#define MMA8450_OUT_X_LSB 0x05 +#define MMA8450_OUT_X_MSB 0x06 +#define MMA8450_OUT_Y_LSB 0x07 +#define MMA8450_OUT_Y_MSB 0x08 +#define MMA8450_OUT_Z_LSB 0x09 +#define MMA8450_OUT_Z_MSB 0x0a + +#define MMA8450_XYZ_DATA_CFG 0x16 + +#define MMA8450_CTRL_REG1 0x38 +#define MMA8450_CTRL_REG2 0x39 + +/* mma8450 status */ +struct mma8450 { + struct i2c_client *client; + struct input_polled_dev *idev; +}; + +static int mma8450_read(struct mma8450 *m, unsigned off) +{ + struct i2c_client *c = m->client; + int ret; + + ret = i2c_smbus_read_byte_data(c, off); + if (ret < 0) + dev_err(&c->dev, + "failed to read register 0x%02x, error %d\n", + off, ret); + + return ret; +} + +static int mma8450_write(struct mma8450 *m, unsigned off, u8 v) +{ + struct i2c_client *c = m->client; + int error; + + error = i2c_smbus_write_byte_data(c, off, v); + if (error < 0) { + dev_err(&c->dev, + "failed to write to register 0x%02x, error %d\n", + off, error); + return error; + } + + return 0; +} + +static int mma8450_read_block(struct mma8450 *m, unsigned off, + u8 *buf, size_t size) +{ + struct i2c_client *c = m->client; + int err; + + err = i2c_smbus_read_i2c_block_data(c, off, size, buf); + if (err < 0) { + dev_err(&c->dev, + "failed to read block data at 0x%02x, error %d\n", + MMA8450_OUT_X_LSB, err); + return err; + } + + return 0; +} + +static void mma8450_poll(struct input_polled_dev *dev) +{ + struct mma8450 *m = dev->private; + int x, y, z; + int ret; + u8 buf[6]; + + ret = mma8450_read(m, MMA8450_STATUS); + if (ret < 0) + return; + + if (!(ret & MMA8450_STATUS_ZXYDR)) + return; + + ret = mma8450_read_block(m, MMA8450_OUT_X_LSB, buf, sizeof(buf)); + if (ret < 0) + return; + + x = ((int)(s8)buf[1] << 4) | (buf[0] & 0xf); + y = ((int)(s8)buf[3] << 4) | (buf[2] & 0xf); + z = ((int)(s8)buf[5] << 4) | (buf[4] & 0xf); + + input_report_abs(dev->input, ABS_X, x); + input_report_abs(dev->input, ABS_Y, y); + input_report_abs(dev->input, ABS_Z, z); + input_sync(dev->input); +} + +/* Initialize the MMA8450 chip */ +static void mma8450_open(struct input_polled_dev *dev) +{ + struct mma8450 *m = dev->private; + int err; + + /* enable all events from X/Y/Z, no FIFO */ + err = mma8450_write(m, MMA8450_XYZ_DATA_CFG, 0x07); + if (err) + return; + + /* + * Sleep mode poll rate - 50Hz + * System output data rate - 400Hz + * Full scale selection - Active, +/- 2G + */ + err = mma8450_write(m, MMA8450_CTRL_REG1, 0x01); + if (err < 0) + return; + + msleep(MODE_CHANGE_DELAY_MS); +} + +static void mma8450_close(struct input_polled_dev *dev) +{ + struct mma8450 *m = dev->private; + + mma8450_write(m, MMA8450_CTRL_REG1, 0x00); + mma8450_write(m, MMA8450_CTRL_REG2, 0x01); +} + +/* + * I2C init/probing/exit functions + */ +static int mma8450_probe(struct i2c_client *c, + const struct i2c_device_id *id) +{ + struct input_polled_dev *idev; + struct mma8450 *m; + int err; + + m = kzalloc(sizeof(struct mma8450), GFP_KERNEL); + idev = input_allocate_polled_device(); + if (!m || !idev) { + err = -ENOMEM; + goto err_free_mem; + } + + m->client = c; + m->idev = idev; + + idev->private = m; + idev->input->name = MMA8450_DRV_NAME; + idev->input->id.bustype = BUS_I2C; + idev->poll = mma8450_poll; + idev->poll_interval = POLL_INTERVAL; + idev->poll_interval_max = POLL_INTERVAL_MAX; + idev->open = mma8450_open; + idev->close = mma8450_close; + + __set_bit(EV_ABS, idev->input->evbit); + input_set_abs_params(idev->input, ABS_X, -2048, 2047, 32, 32); + input_set_abs_params(idev->input, ABS_Y, -2048, 2047, 32, 32); + input_set_abs_params(idev->input, ABS_Z, -2048, 2047, 32, 32); + + err = input_register_polled_device(idev); + if (err) { + dev_err(&c->dev, "failed to register polled input device\n"); + goto err_free_mem; + } + + return 0; + +err_free_mem: + input_free_polled_device(idev); + kfree(m); + return err; +} + +static int mma8450_remove(struct i2c_client *c) +{ + struct mma8450 *m = i2c_get_clientdata(c); + struct input_polled_dev *idev = m->idev; + + input_unregister_polled_device(idev); + input_free_polled_device(idev); + kfree(m); + + return 0; +} + +static const struct i2c_device_id mma8450_id[] = { + { MMA8450_DRV_NAME, 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, mma8450_id); + +static const struct of_device_id mma8450_dt_ids[] = { + { .compatible = "fsl,mma8450", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, mma8450_dt_ids); + +static struct i2c_driver mma8450_driver = { + .driver = { + .name = MMA8450_DRV_NAME, + .owner = THIS_MODULE, + .of_match_table = mma8450_dt_ids, + }, + .probe = mma8450_probe, + .remove = mma8450_remove, + .id_table = mma8450_id, +}; + +module_i2c_driver(mma8450_driver); + +MODULE_AUTHOR("Freescale Semiconductor, Inc."); +MODULE_DESCRIPTION("MMA8450 3-Axis Accelerometer Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/mpu3050.c b/drivers/input/misc/mpu3050.c new file mode 100644 index 00000000..dce0d959 --- /dev/null +++ b/drivers/input/misc/mpu3050.c @@ -0,0 +1,482 @@ +/* + * MPU3050 Tri-axis gyroscope driver + * + * Copyright (C) 2011 Wistron Co.Ltd + * Joseph Lai + * + * Trimmed down by Alan Cox to produce this version + * + * This is a 'lite' version of the driver, while we consider the right way + * to present the other features to user space. In particular it requires the + * device has an IRQ, and it only provides an input interface, so is not much + * use for device orientation. A fuller version is available from the Meego + * tree. + * + * This program is based on bma023.c. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MPU3050_CHIP_ID 0x69 + +#define MPU3050_AUTO_DELAY 1000 + +#define MPU3050_MIN_VALUE -32768 +#define MPU3050_MAX_VALUE 32767 + +#define MPU3050_DEFAULT_POLL_INTERVAL 200 +#define MPU3050_DEFAULT_FS_RANGE 3 + +/* Register map */ +#define MPU3050_CHIP_ID_REG 0x00 +#define MPU3050_SMPLRT_DIV 0x15 +#define MPU3050_DLPF_FS_SYNC 0x16 +#define MPU3050_INT_CFG 0x17 +#define MPU3050_XOUT_H 0x1D +#define MPU3050_PWR_MGM 0x3E +#define MPU3050_PWR_MGM_POS 6 + +/* Register bits */ + +/* DLPF_FS_SYNC */ +#define MPU3050_EXT_SYNC_NONE 0x00 +#define MPU3050_EXT_SYNC_TEMP 0x20 +#define MPU3050_EXT_SYNC_GYROX 0x40 +#define MPU3050_EXT_SYNC_GYROY 0x60 +#define MPU3050_EXT_SYNC_GYROZ 0x80 +#define MPU3050_EXT_SYNC_ACCELX 0xA0 +#define MPU3050_EXT_SYNC_ACCELY 0xC0 +#define MPU3050_EXT_SYNC_ACCELZ 0xE0 +#define MPU3050_EXT_SYNC_MASK 0xE0 +#define MPU3050_FS_250DPS 0x00 +#define MPU3050_FS_500DPS 0x08 +#define MPU3050_FS_1000DPS 0x10 +#define MPU3050_FS_2000DPS 0x18 +#define MPU3050_FS_MASK 0x18 +#define MPU3050_DLPF_CFG_256HZ_NOLPF2 0x00 +#define MPU3050_DLPF_CFG_188HZ 0x01 +#define MPU3050_DLPF_CFG_98HZ 0x02 +#define MPU3050_DLPF_CFG_42HZ 0x03 +#define MPU3050_DLPF_CFG_20HZ 0x04 +#define MPU3050_DLPF_CFG_10HZ 0x05 +#define MPU3050_DLPF_CFG_5HZ 0x06 +#define MPU3050_DLPF_CFG_2100HZ_NOLPF 0x07 +#define MPU3050_DLPF_CFG_MASK 0x07 +/* INT_CFG */ +#define MPU3050_RAW_RDY_EN 0x01 +#define MPU3050_MPU_RDY_EN 0x02 +#define MPU3050_LATCH_INT_EN 0x04 +/* PWR_MGM */ +#define MPU3050_PWR_MGM_PLL_X 0x01 +#define MPU3050_PWR_MGM_PLL_Y 0x02 +#define MPU3050_PWR_MGM_PLL_Z 0x03 +#define MPU3050_PWR_MGM_CLKSEL 0x07 +#define MPU3050_PWR_MGM_STBY_ZG 0x08 +#define MPU3050_PWR_MGM_STBY_YG 0x10 +#define MPU3050_PWR_MGM_STBY_XG 0x20 +#define MPU3050_PWR_MGM_SLEEP 0x40 +#define MPU3050_PWR_MGM_RESET 0x80 +#define MPU3050_PWR_MGM_MASK 0x40 + +struct axis_data { + s16 x; + s16 y; + s16 z; +}; + +struct mpu3050_sensor { + struct i2c_client *client; + struct device *dev; + struct input_dev *idev; +}; + +/** + * mpu3050_xyz_read_reg - read the axes values + * @buffer: provide register addr and get register + * @length: length of register + * + * Reads the register values in one transaction or returns a negative + * error code on failure. + */ +static int mpu3050_xyz_read_reg(struct i2c_client *client, + u8 *buffer, int length) +{ + /* + * Annoying we can't make this const because the i2c layer doesn't + * declare input buffers const. + */ + char cmd = MPU3050_XOUT_H; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = &cmd, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = buffer, + }, + }; + + return i2c_transfer(client->adapter, msg, 2); +} + +/** + * mpu3050_read_xyz - get co-ordinates from device + * @client: i2c address of sensor + * @coords: co-ordinates to update + * + * Return the converted X Y and Z co-ordinates from the sensor device + */ +static void mpu3050_read_xyz(struct i2c_client *client, + struct axis_data *coords) +{ + u16 buffer[3]; + + mpu3050_xyz_read_reg(client, (u8 *)buffer, 6); + coords->x = be16_to_cpu(buffer[0]); + coords->y = be16_to_cpu(buffer[1]); + coords->z = be16_to_cpu(buffer[2]); + dev_dbg(&client->dev, "%s: x %d, y %d, z %d\n", __func__, + coords->x, coords->y, coords->z); +} + +/** + * mpu3050_set_power_mode - set the power mode + * @client: i2c client for the sensor + * @val: value to switch on/off of power, 1: normal power, 0: low power + * + * Put device to normal-power mode or low-power mode. + */ +static void mpu3050_set_power_mode(struct i2c_client *client, u8 val) +{ + u8 value; + + value = i2c_smbus_read_byte_data(client, MPU3050_PWR_MGM); + value = (value & ~MPU3050_PWR_MGM_MASK) | + (((val << MPU3050_PWR_MGM_POS) & MPU3050_PWR_MGM_MASK) ^ + MPU3050_PWR_MGM_MASK); + i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM, value); +} + +/** + * mpu3050_input_open - called on input event open + * @input: input dev of opened device + * + * The input layer calls this function when input event is opened. The + * function will push the device to resume. Then, the device is ready + * to provide data. + */ +static int mpu3050_input_open(struct input_dev *input) +{ + struct mpu3050_sensor *sensor = input_get_drvdata(input); + int error; + + pm_runtime_get(sensor->dev); + + /* Enable interrupts */ + error = i2c_smbus_write_byte_data(sensor->client, MPU3050_INT_CFG, + MPU3050_LATCH_INT_EN | + MPU3050_RAW_RDY_EN | + MPU3050_MPU_RDY_EN); + if (error < 0) { + pm_runtime_put(sensor->dev); + return error; + } + + return 0; +} + +/** + * mpu3050_input_close - called on input event close + * @input: input dev of closed device + * + * The input layer calls this function when input event is closed. The + * function will push the device to suspend. + */ +static void mpu3050_input_close(struct input_dev *input) +{ + struct mpu3050_sensor *sensor = input_get_drvdata(input); + + pm_runtime_put(sensor->dev); +} + +/** + * mpu3050_interrupt_thread - handle an IRQ + * @irq: interrupt numner + * @data: the sensor + * + * Called by the kernel single threaded after an interrupt occurs. Read + * the sensor data and generate an input event for it. + */ +static irqreturn_t mpu3050_interrupt_thread(int irq, void *data) +{ + struct mpu3050_sensor *sensor = data; + struct axis_data axis; + + mpu3050_read_xyz(sensor->client, &axis); + + input_report_abs(sensor->idev, ABS_X, axis.x); + input_report_abs(sensor->idev, ABS_Y, axis.y); + input_report_abs(sensor->idev, ABS_Z, axis.z); + input_sync(sensor->idev); + + return IRQ_HANDLED; +} + +/** + * mpu3050_hw_init - initialize hardware + * @sensor: the sensor + * + * Called during device probe; configures the sampling method. + */ +static int mpu3050_hw_init(struct mpu3050_sensor *sensor) +{ + struct i2c_client *client = sensor->client; + int ret; + u8 reg; + + /* Reset */ + ret = i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM, + MPU3050_PWR_MGM_RESET); + if (ret < 0) + return ret; + + ret = i2c_smbus_read_byte_data(client, MPU3050_PWR_MGM); + if (ret < 0) + return ret; + + ret &= ~MPU3050_PWR_MGM_CLKSEL; + ret |= MPU3050_PWR_MGM_PLL_Z; + ret = i2c_smbus_write_byte_data(client, MPU3050_PWR_MGM, ret); + if (ret < 0) + return ret; + + /* Output frequency divider. The poll interval */ + ret = i2c_smbus_write_byte_data(client, MPU3050_SMPLRT_DIV, + MPU3050_DEFAULT_POLL_INTERVAL - 1); + if (ret < 0) + return ret; + + /* Set low pass filter and full scale */ + reg = MPU3050_DEFAULT_FS_RANGE; + reg |= MPU3050_DLPF_CFG_42HZ << 3; + reg |= MPU3050_EXT_SYNC_NONE << 5; + ret = i2c_smbus_write_byte_data(client, MPU3050_DLPF_FS_SYNC, reg); + if (ret < 0) + return ret; + + return 0; +} + +/** + * mpu3050_probe - device detection callback + * @client: i2c client of found device + * @id: id match information + * + * The I2C layer calls us when it believes a sensor is present at this + * address. Probe to see if this is correct and to validate the device. + * + * If present install the relevant sysfs interfaces and input device. + */ +static int mpu3050_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct mpu3050_sensor *sensor; + struct input_dev *idev; + int ret; + int error; + + sensor = kzalloc(sizeof(struct mpu3050_sensor), GFP_KERNEL); + idev = input_allocate_device(); + if (!sensor || !idev) { + dev_err(&client->dev, "failed to allocate driver data\n"); + error = -ENOMEM; + goto err_free_mem; + } + + sensor->client = client; + sensor->dev = &client->dev; + sensor->idev = idev; + + mpu3050_set_power_mode(client, 1); + msleep(10); + + ret = i2c_smbus_read_byte_data(client, MPU3050_CHIP_ID_REG); + if (ret < 0) { + dev_err(&client->dev, "failed to detect device\n"); + error = -ENXIO; + goto err_free_mem; + } + + if (ret != MPU3050_CHIP_ID) { + dev_err(&client->dev, "unsupported chip id\n"); + error = -ENXIO; + goto err_free_mem; + } + + idev->name = "MPU3050"; + idev->id.bustype = BUS_I2C; + idev->dev.parent = &client->dev; + + idev->open = mpu3050_input_open; + idev->close = mpu3050_input_close; + + __set_bit(EV_ABS, idev->evbit); + input_set_abs_params(idev, ABS_X, + MPU3050_MIN_VALUE, MPU3050_MAX_VALUE, 0, 0); + input_set_abs_params(idev, ABS_Y, + MPU3050_MIN_VALUE, MPU3050_MAX_VALUE, 0, 0); + input_set_abs_params(idev, ABS_Z, + MPU3050_MIN_VALUE, MPU3050_MAX_VALUE, 0, 0); + + input_set_drvdata(idev, sensor); + + pm_runtime_set_active(&client->dev); + + error = mpu3050_hw_init(sensor); + if (error) + goto err_pm_set_suspended; + + error = request_threaded_irq(client->irq, + NULL, mpu3050_interrupt_thread, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "mpu3050", sensor); + if (error) { + dev_err(&client->dev, + "can't get IRQ %d, error %d\n", client->irq, error); + goto err_pm_set_suspended; + } + + error = input_register_device(idev); + if (error) { + dev_err(&client->dev, "failed to register input device\n"); + goto err_free_irq; + } + + pm_runtime_enable(&client->dev); + pm_runtime_set_autosuspend_delay(&client->dev, MPU3050_AUTO_DELAY); + + return 0; + +err_free_irq: + free_irq(client->irq, sensor); +err_pm_set_suspended: + pm_runtime_set_suspended(&client->dev); +err_free_mem: + input_free_device(idev); + kfree(sensor); + return error; +} + +/** + * mpu3050_remove - remove a sensor + * @client: i2c client of sensor being removed + * + * Our sensor is going away, clean up the resources. + */ +static int mpu3050_remove(struct i2c_client *client) +{ + struct mpu3050_sensor *sensor = i2c_get_clientdata(client); + + pm_runtime_disable(&client->dev); + pm_runtime_set_suspended(&client->dev); + + free_irq(client->irq, sensor); + input_unregister_device(sensor->idev); + kfree(sensor); + + return 0; +} + +#ifdef CONFIG_PM +/** + * mpu3050_suspend - called on device suspend + * @dev: device being suspended + * + * Put the device into sleep mode before we suspend the machine. + */ +static int mpu3050_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + mpu3050_set_power_mode(client, 0); + + return 0; +} + +/** + * mpu3050_resume - called on device resume + * @dev: device being resumed + * + * Put the device into powered mode on resume. + */ +static int mpu3050_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + mpu3050_set_power_mode(client, 1); + msleep(100); /* wait for gyro chip resume */ + + return 0; +} +#endif + +static UNIVERSAL_DEV_PM_OPS(mpu3050_pm, mpu3050_suspend, mpu3050_resume, NULL); + +static const struct i2c_device_id mpu3050_ids[] = { + { "mpu3050", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mpu3050_ids); + +static const struct of_device_id mpu3050_of_match[] = { + { .compatible = "invn,mpu3050", }, + { }, +}; +MODULE_DEVICE_TABLE(of, mpu3050_of_match); + +static struct i2c_driver mpu3050_i2c_driver = { + .driver = { + .name = "mpu3050", + .owner = THIS_MODULE, + .pm = &mpu3050_pm, + .of_match_table = mpu3050_of_match, + }, + .probe = mpu3050_probe, + .remove = mpu3050_remove, + .id_table = mpu3050_ids, +}; + +module_i2c_driver(mpu3050_i2c_driver); + +MODULE_AUTHOR("Wistron Corp."); +MODULE_DESCRIPTION("MPU3050 Tri-axis gyroscope driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/pcap_keys.c b/drivers/input/misc/pcap_keys.c new file mode 100644 index 00000000..40ac9a5a --- /dev/null +++ b/drivers/input/misc/pcap_keys.c @@ -0,0 +1,133 @@ +/* + * Input driver for PCAP events: + * * Power key + * * Headphone button + * + * Copyright (c) 2008,2009 Ilya Petrov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +struct pcap_keys { + struct pcap_chip *pcap; + struct input_dev *input; +}; + +/* PCAP2 interrupts us on keypress */ +static irqreturn_t pcap_keys_handler(int irq, void *_pcap_keys) +{ + struct pcap_keys *pcap_keys = _pcap_keys; + int pirq = irq_to_pcap(pcap_keys->pcap, irq); + u32 pstat; + + ezx_pcap_read(pcap_keys->pcap, PCAP_REG_PSTAT, &pstat); + pstat &= 1 << pirq; + + switch (pirq) { + case PCAP_IRQ_ONOFF: + input_report_key(pcap_keys->input, KEY_POWER, !pstat); + break; + case PCAP_IRQ_MIC: + input_report_key(pcap_keys->input, KEY_HP, !pstat); + break; + } + + input_sync(pcap_keys->input); + + return IRQ_HANDLED; +} + +static int pcap_keys_probe(struct platform_device *pdev) +{ + int err = -ENOMEM; + struct pcap_keys *pcap_keys; + struct input_dev *input_dev; + + pcap_keys = kmalloc(sizeof(struct pcap_keys), GFP_KERNEL); + if (!pcap_keys) + return err; + + pcap_keys->pcap = dev_get_drvdata(pdev->dev.parent); + + input_dev = input_allocate_device(); + if (!input_dev) + goto fail; + + pcap_keys->input = input_dev; + + platform_set_drvdata(pdev, pcap_keys); + input_dev->name = pdev->name; + input_dev->phys = "pcap-keys/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(KEY_POWER, input_dev->keybit); + __set_bit(KEY_HP, input_dev->keybit); + + err = input_register_device(input_dev); + if (err) + goto fail_allocate; + + err = request_irq(pcap_to_irq(pcap_keys->pcap, PCAP_IRQ_ONOFF), + pcap_keys_handler, 0, "Power key", pcap_keys); + if (err) + goto fail_register; + + err = request_irq(pcap_to_irq(pcap_keys->pcap, PCAP_IRQ_MIC), + pcap_keys_handler, 0, "Headphone button", pcap_keys); + if (err) + goto fail_pwrkey; + + return 0; + +fail_pwrkey: + free_irq(pcap_to_irq(pcap_keys->pcap, PCAP_IRQ_ONOFF), pcap_keys); +fail_register: + input_unregister_device(input_dev); + goto fail; +fail_allocate: + input_free_device(input_dev); +fail: + kfree(pcap_keys); + return err; +} + +static int pcap_keys_remove(struct platform_device *pdev) +{ + struct pcap_keys *pcap_keys = platform_get_drvdata(pdev); + + free_irq(pcap_to_irq(pcap_keys->pcap, PCAP_IRQ_ONOFF), pcap_keys); + free_irq(pcap_to_irq(pcap_keys->pcap, PCAP_IRQ_MIC), pcap_keys); + + input_unregister_device(pcap_keys->input); + kfree(pcap_keys); + + return 0; +} + +static struct platform_driver pcap_keys_device_driver = { + .probe = pcap_keys_probe, + .remove = pcap_keys_remove, + .driver = { + .name = "pcap-keys", + .owner = THIS_MODULE, + } +}; +module_platform_driver(pcap_keys_device_driver); + +MODULE_DESCRIPTION("Motorola PCAP2 input events driver"); +MODULE_AUTHOR("Ilya Petrov "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:pcap_keys"); diff --git a/drivers/input/misc/pcf50633-input.c b/drivers/input/misc/pcf50633-input.c new file mode 100644 index 00000000..73b13eba --- /dev/null +++ b/drivers/input/misc/pcf50633-input.c @@ -0,0 +1,121 @@ +/* NXP PCF50633 Input Driver + * + * (C) 2006-2008 by Openmoko, Inc. + * Author: Balaji Rao + * All rights reserved. + * + * Broken down from monstrous PCF50633 driver mainly by + * Harald Welte, Andy Green and Werner Almesberger + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +#define PCF50633_OOCSTAT_ONKEY 0x01 +#define PCF50633_REG_OOCSTAT 0x12 +#define PCF50633_REG_OOCMODE 0x10 + +struct pcf50633_input { + struct pcf50633 *pcf; + struct input_dev *input_dev; +}; + +static void +pcf50633_input_irq(int irq, void *data) +{ + struct pcf50633_input *input; + int onkey_released; + + input = data; + + /* We report only one event depending on the key press status */ + onkey_released = pcf50633_reg_read(input->pcf, PCF50633_REG_OOCSTAT) + & PCF50633_OOCSTAT_ONKEY; + + if (irq == PCF50633_IRQ_ONKEYF && !onkey_released) + input_report_key(input->input_dev, KEY_POWER, 1); + else if (irq == PCF50633_IRQ_ONKEYR && onkey_released) + input_report_key(input->input_dev, KEY_POWER, 0); + + input_sync(input->input_dev); +} + +static int pcf50633_input_probe(struct platform_device *pdev) +{ + struct pcf50633_input *input; + struct input_dev *input_dev; + int ret; + + + input = kzalloc(sizeof(*input), GFP_KERNEL); + if (!input) + return -ENOMEM; + + input_dev = input_allocate_device(); + if (!input_dev) { + kfree(input); + return -ENOMEM; + } + + platform_set_drvdata(pdev, input); + input->pcf = dev_to_pcf50633(pdev->dev.parent); + input->input_dev = input_dev; + + input_dev->name = "PCF50633 PMU events"; + input_dev->id.bustype = BUS_I2C; + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR); + set_bit(KEY_POWER, input_dev->keybit); + + ret = input_register_device(input_dev); + if (ret) { + input_free_device(input_dev); + kfree(input); + return ret; + } + pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYR, + pcf50633_input_irq, input); + pcf50633_register_irq(input->pcf, PCF50633_IRQ_ONKEYF, + pcf50633_input_irq, input); + + return 0; +} + +static int pcf50633_input_remove(struct platform_device *pdev) +{ + struct pcf50633_input *input = platform_get_drvdata(pdev); + + pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYR); + pcf50633_free_irq(input->pcf, PCF50633_IRQ_ONKEYF); + + input_unregister_device(input->input_dev); + kfree(input); + + return 0; +} + +static struct platform_driver pcf50633_input_driver = { + .driver = { + .name = "pcf50633-input", + }, + .probe = pcf50633_input_probe, + .remove = pcf50633_input_remove, +}; +module_platform_driver(pcf50633_input_driver); + +MODULE_AUTHOR("Balaji Rao "); +MODULE_DESCRIPTION("PCF50633 input driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:pcf50633-input"); diff --git a/drivers/input/misc/pcf8574_keypad.c b/drivers/input/misc/pcf8574_keypad.c new file mode 100644 index 00000000..e3739297 --- /dev/null +++ b/drivers/input/misc/pcf8574_keypad.c @@ -0,0 +1,223 @@ +/* + * Driver for a keypad w/16 buttons connected to a PCF8574 I2C I/O expander + * + * Copyright 2005-2008 Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "pcf8574_keypad" + +static const unsigned char pcf8574_kp_btncode[] = { + [0] = KEY_RESERVED, + [1] = KEY_ENTER, + [2] = KEY_BACKSLASH, + [3] = KEY_0, + [4] = KEY_RIGHTBRACE, + [5] = KEY_C, + [6] = KEY_9, + [7] = KEY_8, + [8] = KEY_7, + [9] = KEY_B, + [10] = KEY_6, + [11] = KEY_5, + [12] = KEY_4, + [13] = KEY_A, + [14] = KEY_3, + [15] = KEY_2, + [16] = KEY_1 +}; + +struct kp_data { + unsigned short btncode[ARRAY_SIZE(pcf8574_kp_btncode)]; + struct input_dev *idev; + struct i2c_client *client; + char name[64]; + char phys[32]; + unsigned char laststate; +}; + +static short read_state(struct kp_data *lp) +{ + unsigned char x, y, a, b; + + i2c_smbus_write_byte(lp->client, 240); + x = 0xF & (~(i2c_smbus_read_byte(lp->client) >> 4)); + + i2c_smbus_write_byte(lp->client, 15); + y = 0xF & (~i2c_smbus_read_byte(lp->client)); + + for (a = 0; x > 0; a++) + x = x >> 1; + for (b = 0; y > 0; b++) + y = y >> 1; + + return ((a - 1) * 4) + b; +} + +static irqreturn_t pcf8574_kp_irq_handler(int irq, void *dev_id) +{ + struct kp_data *lp = dev_id; + unsigned char nextstate = read_state(lp); + + if (lp->laststate != nextstate) { + int key_down = nextstate < ARRAY_SIZE(lp->btncode); + unsigned short keycode = key_down ? + lp->btncode[nextstate] : lp->btncode[lp->laststate]; + + input_report_key(lp->idev, keycode, key_down); + input_sync(lp->idev); + + lp->laststate = nextstate; + } + + return IRQ_HANDLED; +} + +static int pcf8574_kp_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + int i, ret; + struct input_dev *idev; + struct kp_data *lp; + + if (i2c_smbus_write_byte(client, 240) < 0) { + dev_err(&client->dev, "probe: write fail\n"); + return -ENODEV; + } + + lp = kzalloc(sizeof(*lp), GFP_KERNEL); + if (!lp) + return -ENOMEM; + + idev = input_allocate_device(); + if (!idev) { + dev_err(&client->dev, "Can't allocate input device\n"); + ret = -ENOMEM; + goto fail_allocate; + } + + lp->idev = idev; + lp->client = client; + + idev->evbit[0] = BIT_MASK(EV_KEY); + idev->keycode = lp->btncode; + idev->keycodesize = sizeof(lp->btncode[0]); + idev->keycodemax = ARRAY_SIZE(lp->btncode); + + for (i = 0; i < ARRAY_SIZE(pcf8574_kp_btncode); i++) { + lp->btncode[i] = pcf8574_kp_btncode[i]; + __set_bit(lp->btncode[i] & KEY_MAX, idev->keybit); + } + + sprintf(lp->name, DRV_NAME); + sprintf(lp->phys, "kp_data/input0"); + + idev->name = lp->name; + idev->phys = lp->phys; + idev->id.bustype = BUS_I2C; + idev->id.vendor = 0x0001; + idev->id.product = 0x0001; + idev->id.version = 0x0100; + + lp->laststate = read_state(lp); + + ret = request_threaded_irq(client->irq, NULL, pcf8574_kp_irq_handler, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + DRV_NAME, lp); + if (ret) { + dev_err(&client->dev, "IRQ %d is not free\n", client->irq); + goto fail_free_device; + } + + ret = input_register_device(idev); + if (ret) { + dev_err(&client->dev, "input_register_device() failed\n"); + goto fail_free_irq; + } + + i2c_set_clientdata(client, lp); + return 0; + + fail_free_irq: + free_irq(client->irq, lp); + fail_free_device: + input_free_device(idev); + fail_allocate: + kfree(lp); + + return ret; +} + +static int pcf8574_kp_remove(struct i2c_client *client) +{ + struct kp_data *lp = i2c_get_clientdata(client); + + free_irq(client->irq, lp); + + input_unregister_device(lp->idev); + kfree(lp); + + return 0; +} + +#ifdef CONFIG_PM +static int pcf8574_kp_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + enable_irq(client->irq); + + return 0; +} + +static int pcf8574_kp_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + disable_irq(client->irq); + + return 0; +} + +static const struct dev_pm_ops pcf8574_kp_pm_ops = { + .suspend = pcf8574_kp_suspend, + .resume = pcf8574_kp_resume, +}; + +#else +# define pcf8574_kp_resume NULL +# define pcf8574_kp_suspend NULL +#endif + +static const struct i2c_device_id pcf8574_kp_id[] = { + { DRV_NAME, 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, pcf8574_kp_id); + +static struct i2c_driver pcf8574_kp_driver = { + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &pcf8574_kp_pm_ops, +#endif + }, + .probe = pcf8574_kp_probe, + .remove = pcf8574_kp_remove, + .id_table = pcf8574_kp_id, +}; + +module_i2c_driver(pcf8574_kp_driver); + +MODULE_AUTHOR("Michael Hennerich"); +MODULE_DESCRIPTION("Keypad input driver for 16 keys connected to PCF8574"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/pcspkr.c b/drivers/input/misc/pcspkr.c new file mode 100644 index 00000000..199db78a --- /dev/null +++ b/drivers/input/misc/pcspkr.c @@ -0,0 +1,138 @@ +/* + * PC Speaker beeper driver for Linux + * + * Copyright (c) 2002 Vojtech Pavlik + * Copyright (c) 1992 Orest Zborowski + * + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("PC Speaker beeper driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:pcspkr"); + +static int pcspkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + unsigned int count = 0; + unsigned long flags; + + if (type != EV_SND) + return -1; + + switch (code) { + case SND_BELL: if (value) value = 1000; + case SND_TONE: break; + default: return -1; + } + + if (value > 20 && value < 32767) + count = PIT_TICK_RATE / value; + + raw_spin_lock_irqsave(&i8253_lock, flags); + + if (count) { + /* set command for counter 2, 2 byte write */ + outb_p(0xB6, 0x43); + /* select desired HZ */ + outb_p(count & 0xff, 0x42); + outb((count >> 8) & 0xff, 0x42); + /* enable counter 2 */ + outb_p(inb_p(0x61) | 3, 0x61); + } else { + /* disable counter 2 */ + outb(inb_p(0x61) & 0xFC, 0x61); + } + + raw_spin_unlock_irqrestore(&i8253_lock, flags); + + return 0; +} + +static int pcspkr_probe(struct platform_device *dev) +{ + struct input_dev *pcspkr_dev; + int err; + + pcspkr_dev = input_allocate_device(); + if (!pcspkr_dev) + return -ENOMEM; + + pcspkr_dev->name = "PC Speaker"; + pcspkr_dev->phys = "isa0061/input0"; + pcspkr_dev->id.bustype = BUS_ISA; + pcspkr_dev->id.vendor = 0x001f; + pcspkr_dev->id.product = 0x0001; + pcspkr_dev->id.version = 0x0100; + pcspkr_dev->dev.parent = &dev->dev; + + pcspkr_dev->evbit[0] = BIT_MASK(EV_SND); + pcspkr_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); + pcspkr_dev->event = pcspkr_event; + + err = input_register_device(pcspkr_dev); + if (err) { + input_free_device(pcspkr_dev); + return err; + } + + platform_set_drvdata(dev, pcspkr_dev); + + return 0; +} + +static int pcspkr_remove(struct platform_device *dev) +{ + struct input_dev *pcspkr_dev = platform_get_drvdata(dev); + + input_unregister_device(pcspkr_dev); + platform_set_drvdata(dev, NULL); + /* turn off the speaker */ + pcspkr_event(NULL, EV_SND, SND_BELL, 0); + + return 0; +} + +static int pcspkr_suspend(struct device *dev) +{ + pcspkr_event(NULL, EV_SND, SND_BELL, 0); + + return 0; +} + +static void pcspkr_shutdown(struct platform_device *dev) +{ + /* turn off the speaker */ + pcspkr_event(NULL, EV_SND, SND_BELL, 0); +} + +static const struct dev_pm_ops pcspkr_pm_ops = { + .suspend = pcspkr_suspend, +}; + +static struct platform_driver pcspkr_platform_driver = { + .driver = { + .name = "pcspkr", + .owner = THIS_MODULE, + .pm = &pcspkr_pm_ops, + }, + .probe = pcspkr_probe, + .remove = pcspkr_remove, + .shutdown = pcspkr_shutdown, +}; +module_platform_driver(pcspkr_platform_driver); + diff --git a/drivers/input/misc/pm8xxx-vibrator.c b/drivers/input/misc/pm8xxx-vibrator.c new file mode 100644 index 00000000..a9da65e4 --- /dev/null +++ b/drivers/input/misc/pm8xxx-vibrator.c @@ -0,0 +1,285 @@ +/* Copyright (c) 2010-2011, Code Aurora Forum. 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define VIB_DRV 0x4A + +#define VIB_DRV_SEL_MASK 0xf8 +#define VIB_DRV_SEL_SHIFT 0x03 +#define VIB_DRV_EN_MANUAL_MASK 0xfc + +#define VIB_MAX_LEVEL_mV (3100) +#define VIB_MIN_LEVEL_mV (1200) +#define VIB_MAX_LEVELS (VIB_MAX_LEVEL_mV - VIB_MIN_LEVEL_mV) + +#define MAX_FF_SPEED 0xff + +/** + * struct pm8xxx_vib - structure to hold vibrator data + * @vib_input_dev: input device supporting force feedback + * @work: work structure to set the vibration parameters + * @dev: device supporting force feedback + * @speed: speed of vibration set from userland + * @active: state of vibrator + * @level: level of vibration to set in the chip + * @reg_vib_drv: VIB_DRV register value + */ +struct pm8xxx_vib { + struct input_dev *vib_input_dev; + struct work_struct work; + struct device *dev; + int speed; + int level; + bool active; + u8 reg_vib_drv; +}; + +/** + * pm8xxx_vib_read_u8 - helper to read a byte from pmic chip + * @vib: pointer to vibrator structure + * @data: placeholder for data to be read + * @reg: register address + */ +static int pm8xxx_vib_read_u8(struct pm8xxx_vib *vib, + u8 *data, u16 reg) +{ + int rc; + + rc = pm8xxx_readb(vib->dev->parent, reg, data); + if (rc < 0) + dev_warn(vib->dev, "Error reading pm8xxx reg 0x%x(0x%x)\n", + reg, rc); + return rc; +} + +/** + * pm8xxx_vib_write_u8 - helper to write a byte to pmic chip + * @vib: pointer to vibrator structure + * @data: data to write + * @reg: register address + */ +static int pm8xxx_vib_write_u8(struct pm8xxx_vib *vib, + u8 data, u16 reg) +{ + int rc; + + rc = pm8xxx_writeb(vib->dev->parent, reg, data); + if (rc < 0) + dev_warn(vib->dev, "Error writing pm8xxx reg 0x%x(0x%x)\n", + reg, rc); + return rc; +} + +/** + * pm8xxx_vib_set - handler to start/stop vibration + * @vib: pointer to vibrator structure + * @on: state to set + */ +static int pm8xxx_vib_set(struct pm8xxx_vib *vib, bool on) +{ + int rc; + u8 val = vib->reg_vib_drv; + + if (on) + val |= ((vib->level << VIB_DRV_SEL_SHIFT) & VIB_DRV_SEL_MASK); + else + val &= ~VIB_DRV_SEL_MASK; + + rc = pm8xxx_vib_write_u8(vib, val, VIB_DRV); + if (rc < 0) + return rc; + + vib->reg_vib_drv = val; + return 0; +} + +/** + * pm8xxx_work_handler - worker to set vibration level + * @work: pointer to work_struct + */ +static void pm8xxx_work_handler(struct work_struct *work) +{ + struct pm8xxx_vib *vib = container_of(work, struct pm8xxx_vib, work); + int rc; + u8 val; + + rc = pm8xxx_vib_read_u8(vib, &val, VIB_DRV); + if (rc < 0) + return; + + /* + * pmic vibrator supports voltage ranges from 1.2 to 3.1V, so + * scale the level to fit into these ranges. + */ + if (vib->speed) { + vib->active = true; + vib->level = ((VIB_MAX_LEVELS * vib->speed) / MAX_FF_SPEED) + + VIB_MIN_LEVEL_mV; + vib->level /= 100; + } else { + vib->active = false; + vib->level = VIB_MIN_LEVEL_mV / 100; + } + + pm8xxx_vib_set(vib, vib->active); +} + +/** + * pm8xxx_vib_close - callback of input close callback + * @dev: input device pointer + * + * Turns off the vibrator. + */ +static void pm8xxx_vib_close(struct input_dev *dev) +{ + struct pm8xxx_vib *vib = input_get_drvdata(dev); + + cancel_work_sync(&vib->work); + if (vib->active) + pm8xxx_vib_set(vib, false); +} + +/** + * pm8xxx_vib_play_effect - function to handle vib effects. + * @dev: input device pointer + * @data: data of effect + * @effect: effect to play + * + * Currently this driver supports only rumble effects. + */ +static int pm8xxx_vib_play_effect(struct input_dev *dev, void *data, + struct ff_effect *effect) +{ + struct pm8xxx_vib *vib = input_get_drvdata(dev); + + vib->speed = effect->u.rumble.strong_magnitude >> 8; + if (!vib->speed) + vib->speed = effect->u.rumble.weak_magnitude >> 9; + + schedule_work(&vib->work); + + return 0; +} + +static int pm8xxx_vib_probe(struct platform_device *pdev) + +{ + struct pm8xxx_vib *vib; + struct input_dev *input_dev; + int error; + u8 val; + + vib = kzalloc(sizeof(*vib), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!vib || !input_dev) { + dev_err(&pdev->dev, "couldn't allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + INIT_WORK(&vib->work, pm8xxx_work_handler); + vib->dev = &pdev->dev; + vib->vib_input_dev = input_dev; + + /* operate in manual mode */ + error = pm8xxx_vib_read_u8(vib, &val, VIB_DRV); + if (error < 0) + goto err_free_mem; + val &= ~VIB_DRV_EN_MANUAL_MASK; + error = pm8xxx_vib_write_u8(vib, val, VIB_DRV); + if (error < 0) + goto err_free_mem; + + vib->reg_vib_drv = val; + + input_dev->name = "pm8xxx_vib_ffmemless"; + input_dev->id.version = 1; + input_dev->dev.parent = &pdev->dev; + input_dev->close = pm8xxx_vib_close; + input_set_drvdata(input_dev, vib); + input_set_capability(vib->vib_input_dev, EV_FF, FF_RUMBLE); + + error = input_ff_create_memless(input_dev, NULL, + pm8xxx_vib_play_effect); + if (error) { + dev_err(&pdev->dev, + "couldn't register vibrator as FF device\n"); + goto err_free_mem; + } + + error = input_register_device(input_dev); + if (error) { + dev_err(&pdev->dev, "couldn't register input device\n"); + goto err_destroy_memless; + } + + platform_set_drvdata(pdev, vib); + return 0; + +err_destroy_memless: + input_ff_destroy(input_dev); +err_free_mem: + input_free_device(input_dev); + kfree(vib); + + return error; +} + +static int pm8xxx_vib_remove(struct platform_device *pdev) +{ + struct pm8xxx_vib *vib = platform_get_drvdata(pdev); + + input_unregister_device(vib->vib_input_dev); + kfree(vib); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int pm8xxx_vib_suspend(struct device *dev) +{ + struct pm8xxx_vib *vib = dev_get_drvdata(dev); + + /* Turn off the vibrator */ + pm8xxx_vib_set(vib, false); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(pm8xxx_vib_pm_ops, pm8xxx_vib_suspend, NULL); + +static struct platform_driver pm8xxx_vib_driver = { + .probe = pm8xxx_vib_probe, + .remove = pm8xxx_vib_remove, + .driver = { + .name = "pm8xxx-vib", + .owner = THIS_MODULE, + .pm = &pm8xxx_vib_pm_ops, + }, +}; +module_platform_driver(pm8xxx_vib_driver); + +MODULE_ALIAS("platform:pm8xxx_vib"); +MODULE_DESCRIPTION("PMIC8xxx vibrator driver based on ff-memless framework"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Amy Maloche "); diff --git a/drivers/input/misc/pmic8xxx-pwrkey.c b/drivers/input/misc/pmic8xxx-pwrkey.c new file mode 100644 index 00000000..4b811be7 --- /dev/null +++ b/drivers/input/misc/pmic8xxx-pwrkey.c @@ -0,0 +1,221 @@ +/* Copyright (c) 2010-2011, Code Aurora Forum. 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 + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define PON_CNTL_1 0x1C +#define PON_CNTL_PULL_UP BIT(7) +#define PON_CNTL_TRIG_DELAY_MASK (0x7) + +/** + * struct pmic8xxx_pwrkey - pmic8xxx pwrkey information + * @key_press_irq: key press irq number + */ +struct pmic8xxx_pwrkey { + struct input_dev *pwr; + int key_press_irq; +}; + +static irqreturn_t pwrkey_press_irq(int irq, void *_pwrkey) +{ + struct pmic8xxx_pwrkey *pwrkey = _pwrkey; + + input_report_key(pwrkey->pwr, KEY_POWER, 1); + input_sync(pwrkey->pwr); + + return IRQ_HANDLED; +} + +static irqreturn_t pwrkey_release_irq(int irq, void *_pwrkey) +{ + struct pmic8xxx_pwrkey *pwrkey = _pwrkey; + + input_report_key(pwrkey->pwr, KEY_POWER, 0); + input_sync(pwrkey->pwr); + + return IRQ_HANDLED; +} + +#ifdef CONFIG_PM_SLEEP +static int pmic8xxx_pwrkey_suspend(struct device *dev) +{ + struct pmic8xxx_pwrkey *pwrkey = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + enable_irq_wake(pwrkey->key_press_irq); + + return 0; +} + +static int pmic8xxx_pwrkey_resume(struct device *dev) +{ + struct pmic8xxx_pwrkey *pwrkey = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + disable_irq_wake(pwrkey->key_press_irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(pm8xxx_pwr_key_pm_ops, + pmic8xxx_pwrkey_suspend, pmic8xxx_pwrkey_resume); + +static int pmic8xxx_pwrkey_probe(struct platform_device *pdev) +{ + struct input_dev *pwr; + int key_release_irq = platform_get_irq(pdev, 0); + int key_press_irq = platform_get_irq(pdev, 1); + int err; + unsigned int delay; + u8 pon_cntl; + struct pmic8xxx_pwrkey *pwrkey; + const struct pm8xxx_pwrkey_platform_data *pdata = + dev_get_platdata(&pdev->dev); + + if (!pdata) { + dev_err(&pdev->dev, "power key platform data not supplied\n"); + return -EINVAL; + } + + if (pdata->kpd_trigger_delay_us > 62500) { + dev_err(&pdev->dev, "invalid power key trigger delay\n"); + return -EINVAL; + } + + pwrkey = kzalloc(sizeof(*pwrkey), GFP_KERNEL); + if (!pwrkey) + return -ENOMEM; + + pwr = input_allocate_device(); + if (!pwr) { + dev_dbg(&pdev->dev, "Can't allocate power button\n"); + err = -ENOMEM; + goto free_pwrkey; + } + + input_set_capability(pwr, EV_KEY, KEY_POWER); + + pwr->name = "pmic8xxx_pwrkey"; + pwr->phys = "pmic8xxx_pwrkey/input0"; + pwr->dev.parent = &pdev->dev; + + delay = (pdata->kpd_trigger_delay_us << 10) / USEC_PER_SEC; + delay = 1 + ilog2(delay); + + err = pm8xxx_readb(pdev->dev.parent, PON_CNTL_1, &pon_cntl); + if (err < 0) { + dev_err(&pdev->dev, "failed reading PON_CNTL_1 err=%d\n", err); + goto free_input_dev; + } + + pon_cntl &= ~PON_CNTL_TRIG_DELAY_MASK; + pon_cntl |= (delay & PON_CNTL_TRIG_DELAY_MASK); + if (pdata->pull_up) + pon_cntl |= PON_CNTL_PULL_UP; + else + pon_cntl &= ~PON_CNTL_PULL_UP; + + err = pm8xxx_writeb(pdev->dev.parent, PON_CNTL_1, pon_cntl); + if (err < 0) { + dev_err(&pdev->dev, "failed writing PON_CNTL_1 err=%d\n", err); + goto free_input_dev; + } + + err = input_register_device(pwr); + if (err) { + dev_dbg(&pdev->dev, "Can't register power key: %d\n", err); + goto free_input_dev; + } + + pwrkey->key_press_irq = key_press_irq; + pwrkey->pwr = pwr; + + platform_set_drvdata(pdev, pwrkey); + + err = request_irq(key_press_irq, pwrkey_press_irq, + IRQF_TRIGGER_RISING, "pmic8xxx_pwrkey_press", pwrkey); + if (err < 0) { + dev_dbg(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", + key_press_irq, err); + goto unreg_input_dev; + } + + err = request_irq(key_release_irq, pwrkey_release_irq, + IRQF_TRIGGER_RISING, "pmic8xxx_pwrkey_release", pwrkey); + if (err < 0) { + dev_dbg(&pdev->dev, "Can't get %d IRQ for pwrkey: %d\n", + key_release_irq, err); + + goto free_press_irq; + } + + device_init_wakeup(&pdev->dev, pdata->wakeup); + + return 0; + +free_press_irq: + free_irq(key_press_irq, NULL); +unreg_input_dev: + platform_set_drvdata(pdev, NULL); + input_unregister_device(pwr); + pwr = NULL; +free_input_dev: + input_free_device(pwr); +free_pwrkey: + kfree(pwrkey); + return err; +} + +static int pmic8xxx_pwrkey_remove(struct platform_device *pdev) +{ + struct pmic8xxx_pwrkey *pwrkey = platform_get_drvdata(pdev); + int key_release_irq = platform_get_irq(pdev, 0); + int key_press_irq = platform_get_irq(pdev, 1); + + device_init_wakeup(&pdev->dev, 0); + + free_irq(key_press_irq, pwrkey); + free_irq(key_release_irq, pwrkey); + input_unregister_device(pwrkey->pwr); + platform_set_drvdata(pdev, NULL); + kfree(pwrkey); + + return 0; +} + +static struct platform_driver pmic8xxx_pwrkey_driver = { + .probe = pmic8xxx_pwrkey_probe, + .remove = pmic8xxx_pwrkey_remove, + .driver = { + .name = PM8XXX_PWRKEY_DEV_NAME, + .owner = THIS_MODULE, + .pm = &pm8xxx_pwr_key_pm_ops, + }, +}; +module_platform_driver(pmic8xxx_pwrkey_driver); + +MODULE_ALIAS("platform:pmic8xxx_pwrkey"); +MODULE_DESCRIPTION("PMIC8XXX Power Key driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Trilok Soni "); diff --git a/drivers/input/misc/powermate.c b/drivers/input/misc/powermate.c new file mode 100644 index 00000000..49c0c3eb --- /dev/null +++ b/drivers/input/misc/powermate.c @@ -0,0 +1,453 @@ +/* + * A driver for the Griffin Technology, Inc. "PowerMate" USB controller dial. + * + * v1.1, (c)2002 William R Sowerbutts + * + * This device is a anodised aluminium knob which connects over USB. It can measure + * clockwise and anticlockwise rotation. The dial also acts as a pushbutton with + * a spring for automatic release. The base contains a pair of LEDs which illuminate + * the translucent base. It rotates without limit and reports its relative rotation + * back to the host when polled by the USB controller. + * + * Testing with the knob I have has shown that it measures approximately 94 "clicks" + * for one full rotation. Testing with my High Speed Rotation Actuator (ok, it was + * a variable speed cordless electric drill) has shown that the device can measure + * speeds of up to 7 clicks either clockwise or anticlockwise between pollings from + * the host. If it counts more than 7 clicks before it is polled, it will wrap back + * to zero and start counting again. This was at quite high speed, however, almost + * certainly faster than the human hand could turn it. Griffin say that it loses a + * pulse or two on a direction change; the granularity is so fine that I never + * noticed this in practice. + * + * The device's microcontroller can be programmed to set the LED to either a constant + * intensity, or to a rhythmic pulsing. Several patterns and speeds are available. + * + * Griffin were very happy to provide documentation and free hardware for development. + * + * Some userspace tools are available on the web: http://sowerbutts.com/powermate/ + * + */ + +#include +#include +#include +#include +#include +#include + +#define POWERMATE_VENDOR 0x077d /* Griffin Technology, Inc. */ +#define POWERMATE_PRODUCT_NEW 0x0410 /* Griffin PowerMate */ +#define POWERMATE_PRODUCT_OLD 0x04AA /* Griffin soundKnob */ + +#define CONTOUR_VENDOR 0x05f3 /* Contour Design, Inc. */ +#define CONTOUR_JOG 0x0240 /* Jog and Shuttle */ + +/* these are the command codes we send to the device */ +#define SET_STATIC_BRIGHTNESS 0x01 +#define SET_PULSE_ASLEEP 0x02 +#define SET_PULSE_AWAKE 0x03 +#define SET_PULSE_MODE 0x04 + +/* these refer to bits in the powermate_device's requires_update field. */ +#define UPDATE_STATIC_BRIGHTNESS (1<<0) +#define UPDATE_PULSE_ASLEEP (1<<1) +#define UPDATE_PULSE_AWAKE (1<<2) +#define UPDATE_PULSE_MODE (1<<3) + +/* at least two versions of the hardware exist, with differing payload + sizes. the first three bytes always contain the "interesting" data in + the relevant format. */ +#define POWERMATE_PAYLOAD_SIZE_MAX 6 +#define POWERMATE_PAYLOAD_SIZE_MIN 3 +struct powermate_device { + signed char *data; + dma_addr_t data_dma; + struct urb *irq, *config; + struct usb_ctrlrequest *configcr; + struct usb_device *udev; + struct usb_interface *intf; + struct input_dev *input; + spinlock_t lock; + int static_brightness; + int pulse_speed; + int pulse_table; + int pulse_asleep; + int pulse_awake; + int requires_update; // physical settings which are out of sync + char phys[64]; +}; + +static char pm_name_powermate[] = "Griffin PowerMate"; +static char pm_name_soundknob[] = "Griffin SoundKnob"; + +static void powermate_config_complete(struct urb *urb); + +/* Callback for data arriving from the PowerMate over the USB interrupt pipe */ +static void powermate_irq(struct urb *urb) +{ + struct powermate_device *pm = urb->context; + struct device *dev = &pm->intf->dev; + int retval; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + default: + dev_dbg(dev, "%s - nonzero urb status received: %d\n", + __func__, urb->status); + goto exit; + } + + /* handle updates to device state */ + input_report_key(pm->input, BTN_0, pm->data[0] & 0x01); + input_report_rel(pm->input, REL_DIAL, pm->data[1]); + input_sync(pm->input); + +exit: + retval = usb_submit_urb (urb, GFP_ATOMIC); + if (retval) + dev_err(dev, "%s - usb_submit_urb failed with result: %d\n", + __func__, retval); +} + +/* Decide if we need to issue a control message and do so. Must be called with pm->lock taken */ +static void powermate_sync_state(struct powermate_device *pm) +{ + if (pm->requires_update == 0) + return; /* no updates are required */ + if (pm->config->status == -EINPROGRESS) + return; /* an update is already in progress; it'll issue this update when it completes */ + + if (pm->requires_update & UPDATE_PULSE_ASLEEP){ + pm->configcr->wValue = cpu_to_le16( SET_PULSE_ASLEEP ); + pm->configcr->wIndex = cpu_to_le16( pm->pulse_asleep ? 1 : 0 ); + pm->requires_update &= ~UPDATE_PULSE_ASLEEP; + }else if (pm->requires_update & UPDATE_PULSE_AWAKE){ + pm->configcr->wValue = cpu_to_le16( SET_PULSE_AWAKE ); + pm->configcr->wIndex = cpu_to_le16( pm->pulse_awake ? 1 : 0 ); + pm->requires_update &= ~UPDATE_PULSE_AWAKE; + }else if (pm->requires_update & UPDATE_PULSE_MODE){ + int op, arg; + /* the powermate takes an operation and an argument for its pulse algorithm. + the operation can be: + 0: divide the speed + 1: pulse at normal speed + 2: multiply the speed + the argument only has an effect for operations 0 and 2, and ranges between + 1 (least effect) to 255 (maximum effect). + + thus, several states are equivalent and are coalesced into one state. + + we map this onto a range from 0 to 510, with: + 0 -- 254 -- use divide (0 = slowest) + 255 -- use normal speed + 256 -- 510 -- use multiple (510 = fastest). + + Only values of 'arg' quite close to 255 are particularly useful/spectacular. + */ + if (pm->pulse_speed < 255) { + op = 0; // divide + arg = 255 - pm->pulse_speed; + } else if (pm->pulse_speed > 255) { + op = 2; // multiply + arg = pm->pulse_speed - 255; + } else { + op = 1; // normal speed + arg = 0; // can be any value + } + pm->configcr->wValue = cpu_to_le16( (pm->pulse_table << 8) | SET_PULSE_MODE ); + pm->configcr->wIndex = cpu_to_le16( (arg << 8) | op ); + pm->requires_update &= ~UPDATE_PULSE_MODE; + } else if (pm->requires_update & UPDATE_STATIC_BRIGHTNESS) { + pm->configcr->wValue = cpu_to_le16( SET_STATIC_BRIGHTNESS ); + pm->configcr->wIndex = cpu_to_le16( pm->static_brightness ); + pm->requires_update &= ~UPDATE_STATIC_BRIGHTNESS; + } else { + printk(KERN_ERR "powermate: unknown update required"); + pm->requires_update = 0; /* fudge the bug */ + return; + } + +/* printk("powermate: %04x %04x\n", pm->configcr->wValue, pm->configcr->wIndex); */ + + pm->configcr->bRequestType = 0x41; /* vendor request */ + pm->configcr->bRequest = 0x01; + pm->configcr->wLength = 0; + + usb_fill_control_urb(pm->config, pm->udev, usb_sndctrlpipe(pm->udev, 0), + (void *) pm->configcr, NULL, 0, + powermate_config_complete, pm); + + if (usb_submit_urb(pm->config, GFP_ATOMIC)) + printk(KERN_ERR "powermate: usb_submit_urb(config) failed"); +} + +/* Called when our asynchronous control message completes. We may need to issue another immediately */ +static void powermate_config_complete(struct urb *urb) +{ + struct powermate_device *pm = urb->context; + unsigned long flags; + + if (urb->status) + printk(KERN_ERR "powermate: config urb returned %d\n", urb->status); + + spin_lock_irqsave(&pm->lock, flags); + powermate_sync_state(pm); + spin_unlock_irqrestore(&pm->lock, flags); +} + +/* Set the LED up as described and begin the sync with the hardware if required */ +static void powermate_pulse_led(struct powermate_device *pm, int static_brightness, int pulse_speed, + int pulse_table, int pulse_asleep, int pulse_awake) +{ + unsigned long flags; + + if (pulse_speed < 0) + pulse_speed = 0; + if (pulse_table < 0) + pulse_table = 0; + if (pulse_speed > 510) + pulse_speed = 510; + if (pulse_table > 2) + pulse_table = 2; + + pulse_asleep = !!pulse_asleep; + pulse_awake = !!pulse_awake; + + + spin_lock_irqsave(&pm->lock, flags); + + /* mark state updates which are required */ + if (static_brightness != pm->static_brightness) { + pm->static_brightness = static_brightness; + pm->requires_update |= UPDATE_STATIC_BRIGHTNESS; + } + if (pulse_asleep != pm->pulse_asleep) { + pm->pulse_asleep = pulse_asleep; + pm->requires_update |= (UPDATE_PULSE_ASLEEP | UPDATE_STATIC_BRIGHTNESS); + } + if (pulse_awake != pm->pulse_awake) { + pm->pulse_awake = pulse_awake; + pm->requires_update |= (UPDATE_PULSE_AWAKE | UPDATE_STATIC_BRIGHTNESS); + } + if (pulse_speed != pm->pulse_speed || pulse_table != pm->pulse_table) { + pm->pulse_speed = pulse_speed; + pm->pulse_table = pulse_table; + pm->requires_update |= UPDATE_PULSE_MODE; + } + + powermate_sync_state(pm); + + spin_unlock_irqrestore(&pm->lock, flags); +} + +/* Callback from the Input layer when an event arrives from userspace to configure the LED */ +static int powermate_input_event(struct input_dev *dev, unsigned int type, unsigned int code, int _value) +{ + unsigned int command = (unsigned int)_value; + struct powermate_device *pm = input_get_drvdata(dev); + + if (type == EV_MSC && code == MSC_PULSELED){ + /* + bits 0- 7: 8 bits: LED brightness + bits 8-16: 9 bits: pulsing speed modifier (0 ... 510); 0-254 = slower, 255 = standard, 256-510 = faster. + bits 17-18: 2 bits: pulse table (0, 1, 2 valid) + bit 19: 1 bit : pulse whilst asleep? + bit 20: 1 bit : pulse constantly? + */ + int static_brightness = command & 0xFF; // bits 0-7 + int pulse_speed = (command >> 8) & 0x1FF; // bits 8-16 + int pulse_table = (command >> 17) & 0x3; // bits 17-18 + int pulse_asleep = (command >> 19) & 0x1; // bit 19 + int pulse_awake = (command >> 20) & 0x1; // bit 20 + + powermate_pulse_led(pm, static_brightness, pulse_speed, pulse_table, pulse_asleep, pulse_awake); + } + + return 0; +} + +static int powermate_alloc_buffers(struct usb_device *udev, struct powermate_device *pm) +{ + pm->data = usb_alloc_coherent(udev, POWERMATE_PAYLOAD_SIZE_MAX, + GFP_ATOMIC, &pm->data_dma); + if (!pm->data) + return -1; + + pm->configcr = kmalloc(sizeof(*(pm->configcr)), GFP_KERNEL); + if (!pm->configcr) + return -ENOMEM; + + return 0; +} + +static void powermate_free_buffers(struct usb_device *udev, struct powermate_device *pm) +{ + usb_free_coherent(udev, POWERMATE_PAYLOAD_SIZE_MAX, + pm->data, pm->data_dma); + kfree(pm->configcr); +} + +/* Called whenever a USB device matching one in our supported devices table is connected */ +static int powermate_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev (intf); + struct usb_host_interface *interface; + struct usb_endpoint_descriptor *endpoint; + struct powermate_device *pm; + struct input_dev *input_dev; + int pipe, maxp; + int error = -ENOMEM; + + interface = intf->cur_altsetting; + endpoint = &interface->endpoint[0].desc; + if (!usb_endpoint_is_int_in(endpoint)) + return -EIO; + + usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + 0x0a, USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, interface->desc.bInterfaceNumber, NULL, 0, + USB_CTRL_SET_TIMEOUT); + + pm = kzalloc(sizeof(struct powermate_device), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!pm || !input_dev) + goto fail1; + + if (powermate_alloc_buffers(udev, pm)) + goto fail2; + + pm->irq = usb_alloc_urb(0, GFP_KERNEL); + if (!pm->irq) + goto fail2; + + pm->config = usb_alloc_urb(0, GFP_KERNEL); + if (!pm->config) + goto fail3; + + pm->udev = udev; + pm->intf = intf; + pm->input = input_dev; + + usb_make_path(udev, pm->phys, sizeof(pm->phys)); + strlcat(pm->phys, "/input0", sizeof(pm->phys)); + + spin_lock_init(&pm->lock); + + switch (le16_to_cpu(udev->descriptor.idProduct)) { + case POWERMATE_PRODUCT_NEW: + input_dev->name = pm_name_powermate; + break; + case POWERMATE_PRODUCT_OLD: + input_dev->name = pm_name_soundknob; + break; + default: + input_dev->name = pm_name_soundknob; + printk(KERN_WARNING "powermate: unknown product id %04x\n", + le16_to_cpu(udev->descriptor.idProduct)); + } + + input_dev->phys = pm->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, pm); + + input_dev->event = powermate_input_event; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) | + BIT_MASK(EV_MSC); + input_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0); + input_dev->relbit[BIT_WORD(REL_DIAL)] = BIT_MASK(REL_DIAL); + input_dev->mscbit[BIT_WORD(MSC_PULSELED)] = BIT_MASK(MSC_PULSELED); + + /* get a handle to the interrupt data pipe */ + pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); + maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + + if (maxp < POWERMATE_PAYLOAD_SIZE_MIN || maxp > POWERMATE_PAYLOAD_SIZE_MAX) { + printk(KERN_WARNING "powermate: Expected payload of %d--%d bytes, found %d bytes!\n", + POWERMATE_PAYLOAD_SIZE_MIN, POWERMATE_PAYLOAD_SIZE_MAX, maxp); + maxp = POWERMATE_PAYLOAD_SIZE_MAX; + } + + usb_fill_int_urb(pm->irq, udev, pipe, pm->data, + maxp, powermate_irq, + pm, endpoint->bInterval); + pm->irq->transfer_dma = pm->data_dma; + pm->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + /* register our interrupt URB with the USB system */ + if (usb_submit_urb(pm->irq, GFP_KERNEL)) { + error = -EIO; + goto fail4; + } + + error = input_register_device(pm->input); + if (error) + goto fail5; + + + /* force an update of everything */ + pm->requires_update = UPDATE_PULSE_ASLEEP | UPDATE_PULSE_AWAKE | UPDATE_PULSE_MODE | UPDATE_STATIC_BRIGHTNESS; + powermate_pulse_led(pm, 0x80, 255, 0, 1, 0); // set default pulse parameters + + usb_set_intfdata(intf, pm); + return 0; + + fail5: usb_kill_urb(pm->irq); + fail4: usb_free_urb(pm->config); + fail3: usb_free_urb(pm->irq); + fail2: powermate_free_buffers(udev, pm); + fail1: input_free_device(input_dev); + kfree(pm); + return error; +} + +/* Called when a USB device we've accepted ownership of is removed */ +static void powermate_disconnect(struct usb_interface *intf) +{ + struct powermate_device *pm = usb_get_intfdata (intf); + + usb_set_intfdata(intf, NULL); + if (pm) { + pm->requires_update = 0; + usb_kill_urb(pm->irq); + input_unregister_device(pm->input); + usb_free_urb(pm->irq); + usb_free_urb(pm->config); + powermate_free_buffers(interface_to_usbdev(intf), pm); + + kfree(pm); + } +} + +static struct usb_device_id powermate_devices [] = { + { USB_DEVICE(POWERMATE_VENDOR, POWERMATE_PRODUCT_NEW) }, + { USB_DEVICE(POWERMATE_VENDOR, POWERMATE_PRODUCT_OLD) }, + { USB_DEVICE(CONTOUR_VENDOR, CONTOUR_JOG) }, + { } /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE (usb, powermate_devices); + +static struct usb_driver powermate_driver = { + .name = "powermate", + .probe = powermate_probe, + .disconnect = powermate_disconnect, + .id_table = powermate_devices, +}; + +module_usb_driver(powermate_driver); + +MODULE_AUTHOR( "William R Sowerbutts" ); +MODULE_DESCRIPTION( "Griffin Technology, Inc PowerMate driver" ); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/pwm-beeper.c b/drivers/input/misc/pwm-beeper.c new file mode 100644 index 00000000..08088684 --- /dev/null +++ b/drivers/input/misc/pwm-beeper.c @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2010, Lars-Peter Clausen + * PWM beeper driver + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +struct pwm_beeper { + struct input_dev *input; + struct pwm_device *pwm; + unsigned long period; +}; + +#define HZ_TO_NANOSECONDS(x) (1000000000UL/(x)) + +static int pwm_beeper_event(struct input_dev *input, + unsigned int type, unsigned int code, int value) +{ + int ret = 0; + struct pwm_beeper *beeper = input_get_drvdata(input); + unsigned long period; + + if (type != EV_SND || value < 0) + return -EINVAL; + + switch (code) { + case SND_BELL: + value = value ? 1000 : 0; + break; + case SND_TONE: + break; + default: + return -EINVAL; + } + + if (value == 0) { + pwm_config(beeper->pwm, 0, 0); + pwm_disable(beeper->pwm); + } else { + period = HZ_TO_NANOSECONDS(value); + ret = pwm_config(beeper->pwm, period / 2, period); + if (ret) + return ret; + ret = pwm_enable(beeper->pwm); + if (ret) + return ret; + beeper->period = period; + } + + return 0; +} + +static int pwm_beeper_probe(struct platform_device *pdev) +{ + unsigned long pwm_id = (unsigned long)pdev->dev.platform_data; + struct pwm_beeper *beeper; + int error; + + beeper = kzalloc(sizeof(*beeper), GFP_KERNEL); + if (!beeper) + return -ENOMEM; + + beeper->pwm = pwm_get(&pdev->dev, NULL); + if (IS_ERR(beeper->pwm)) { + dev_dbg(&pdev->dev, "unable to request PWM, trying legacy API\n"); + beeper->pwm = pwm_request(pwm_id, "pwm beeper"); + } + + if (IS_ERR(beeper->pwm)) { + error = PTR_ERR(beeper->pwm); + dev_err(&pdev->dev, "Failed to request pwm device: %d\n", error); + goto err_free; + } + + beeper->input = input_allocate_device(); + if (!beeper->input) { + dev_err(&pdev->dev, "Failed to allocate input device\n"); + error = -ENOMEM; + goto err_pwm_free; + } + beeper->input->dev.parent = &pdev->dev; + + beeper->input->name = "pwm-beeper"; + beeper->input->phys = "pwm/input0"; + beeper->input->id.bustype = BUS_HOST; + beeper->input->id.vendor = 0x001f; + beeper->input->id.product = 0x0001; + beeper->input->id.version = 0x0100; + + beeper->input->evbit[0] = BIT(EV_SND); + beeper->input->sndbit[0] = BIT(SND_TONE) | BIT(SND_BELL); + + beeper->input->event = pwm_beeper_event; + + input_set_drvdata(beeper->input, beeper); + + error = input_register_device(beeper->input); + if (error) { + dev_err(&pdev->dev, "Failed to register input device: %d\n", error); + goto err_input_free; + } + + platform_set_drvdata(pdev, beeper); + + return 0; + +err_input_free: + input_free_device(beeper->input); +err_pwm_free: + pwm_free(beeper->pwm); +err_free: + kfree(beeper); + + return error; +} + +static int pwm_beeper_remove(struct platform_device *pdev) +{ + struct pwm_beeper *beeper = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + input_unregister_device(beeper->input); + + pwm_disable(beeper->pwm); + pwm_free(beeper->pwm); + + kfree(beeper); + + return 0; +} + +#ifdef CONFIG_PM +static int pwm_beeper_suspend(struct device *dev) +{ + struct pwm_beeper *beeper = dev_get_drvdata(dev); + + if (beeper->period) + pwm_disable(beeper->pwm); + + return 0; +} + +static int pwm_beeper_resume(struct device *dev) +{ + struct pwm_beeper *beeper = dev_get_drvdata(dev); + + if (beeper->period) { + pwm_config(beeper->pwm, beeper->period / 2, beeper->period); + pwm_enable(beeper->pwm); + } + + return 0; +} + +static SIMPLE_DEV_PM_OPS(pwm_beeper_pm_ops, + pwm_beeper_suspend, pwm_beeper_resume); + +#define PWM_BEEPER_PM_OPS (&pwm_beeper_pm_ops) +#else +#define PWM_BEEPER_PM_OPS NULL +#endif + +#ifdef CONFIG_OF +static const struct of_device_id pwm_beeper_match[] = { + { .compatible = "pwm-beeper", }, + { }, +}; +#endif + +static struct platform_driver pwm_beeper_driver = { + .probe = pwm_beeper_probe, + .remove = pwm_beeper_remove, + .driver = { + .name = "pwm-beeper", + .owner = THIS_MODULE, + .pm = PWM_BEEPER_PM_OPS, + .of_match_table = of_match_ptr(pwm_beeper_match), + }, +}; +module_platform_driver(pwm_beeper_driver); + +MODULE_AUTHOR("Lars-Peter Clausen "); +MODULE_DESCRIPTION("PWM beeper driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:pwm-beeper"); diff --git a/drivers/input/misc/rb532_button.c b/drivers/input/misc/rb532_button.c new file mode 100644 index 00000000..fb4f8ac3 --- /dev/null +++ b/drivers/input/misc/rb532_button.c @@ -0,0 +1,108 @@ +/* + * Support for the S1 button on Routerboard 532 + * + * Copyright (C) 2009 Phil Sutter + */ + +#include +#include +#include + +#include +#include + +#define DRV_NAME "rb532-button" + +#define RB532_BTN_RATE 100 /* msec */ +#define RB532_BTN_KSYM BTN_0 + +/* The S1 button state is provided by GPIO pin 1. But as this + * pin is also used for uart input as alternate function, the + * operational modes must be switched first: + * 1) disable uart using set_latch_u5() + * 2) turn off alternate function implicitly through + * gpio_direction_input() + * 3) read the GPIO's current value + * 4) undo step 2 by enabling alternate function (in this + * mode the GPIO direction is fixed, so no change needed) + * 5) turn on uart again + * The GPIO value occurs to be inverted, so pin high means + * button is not pressed. + */ +static bool rb532_button_pressed(void) +{ + int val; + + set_latch_u5(0, LO_FOFF); + gpio_direction_input(GPIO_BTN_S1); + + val = gpio_get_value(GPIO_BTN_S1); + + rb532_gpio_set_func(GPIO_BTN_S1); + set_latch_u5(LO_FOFF, 0); + + return !val; +} + +static void rb532_button_poll(struct input_polled_dev *poll_dev) +{ + input_report_key(poll_dev->input, RB532_BTN_KSYM, + rb532_button_pressed()); + input_sync(poll_dev->input); +} + +static int rb532_button_probe(struct platform_device *pdev) +{ + struct input_polled_dev *poll_dev; + int error; + + poll_dev = input_allocate_polled_device(); + if (!poll_dev) + return -ENOMEM; + + poll_dev->poll = rb532_button_poll; + poll_dev->poll_interval = RB532_BTN_RATE; + + poll_dev->input->name = "rb532 button"; + poll_dev->input->phys = "rb532/button0"; + poll_dev->input->id.bustype = BUS_HOST; + poll_dev->input->dev.parent = &pdev->dev; + + dev_set_drvdata(&pdev->dev, poll_dev); + + input_set_capability(poll_dev->input, EV_KEY, RB532_BTN_KSYM); + + error = input_register_polled_device(poll_dev); + if (error) { + input_free_polled_device(poll_dev); + return error; + } + + return 0; +} + +static int rb532_button_remove(struct platform_device *pdev) +{ + struct input_polled_dev *poll_dev = dev_get_drvdata(&pdev->dev); + + input_unregister_polled_device(poll_dev); + input_free_polled_device(poll_dev); + dev_set_drvdata(&pdev->dev, NULL); + + return 0; +} + +static struct platform_driver rb532_button_driver = { + .probe = rb532_button_probe, + .remove = rb532_button_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + }, +}; +module_platform_driver(rb532_button_driver); + +MODULE_AUTHOR("Phil Sutter "); +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Support for S1 button on Routerboard 532"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/drivers/input/misc/retu-pwrbutton.c b/drivers/input/misc/retu-pwrbutton.c new file mode 100644 index 00000000..7ca09baa --- /dev/null +++ b/drivers/input/misc/retu-pwrbutton.c @@ -0,0 +1,99 @@ +/* + * Retu power button driver. + * + * Copyright (C) 2004-2010 Nokia Corporation + * + * Original code written by Ari Saastamoinen, Juha Yrjölä and Felipe Balbi. + * Rewritten by Aaro Koskinen. + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define RETU_STATUS_PWRONX (1 << 5) + +static irqreturn_t retu_pwrbutton_irq(int irq, void *_pwr) +{ + struct input_dev *idev = _pwr; + struct retu_dev *rdev = input_get_drvdata(idev); + bool state; + + state = !(retu_read(rdev, RETU_REG_STATUS) & RETU_STATUS_PWRONX); + input_report_key(idev, KEY_POWER, state); + input_sync(idev); + + return IRQ_HANDLED; +} + +static int retu_pwrbutton_probe(struct platform_device *pdev) +{ + struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent); + struct input_dev *idev; + int irq; + int error; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) + return irq; + + idev = devm_input_allocate_device(&pdev->dev); + if (!idev) + return -ENOMEM; + + idev->name = "retu-pwrbutton"; + idev->dev.parent = &pdev->dev; + + input_set_capability(idev, EV_KEY, KEY_POWER); + input_set_drvdata(idev, rdev); + + error = devm_request_threaded_irq(&pdev->dev, irq, + NULL, retu_pwrbutton_irq, 0, + "retu-pwrbutton", idev); + if (error) + return error; + + error = input_register_device(idev); + if (error) + return error; + + return 0; +} + +static int retu_pwrbutton_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct platform_driver retu_pwrbutton_driver = { + .probe = retu_pwrbutton_probe, + .remove = retu_pwrbutton_remove, + .driver = { + .name = "retu-pwrbutton", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(retu_pwrbutton_driver); + +MODULE_ALIAS("platform:retu-pwrbutton"); +MODULE_DESCRIPTION("Retu Power Button"); +MODULE_AUTHOR("Ari Saastamoinen"); +MODULE_AUTHOR("Felipe Balbi"); +MODULE_AUTHOR("Aaro Koskinen "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/rotary_encoder.c b/drivers/input/misc/rotary_encoder.c new file mode 100644 index 00000000..aff47b2c --- /dev/null +++ b/drivers/input/misc/rotary_encoder.c @@ -0,0 +1,339 @@ +/* + * rotary_encoder.c + * + * (c) 2009 Daniel Mack + * Copyright (C) 2011 Johan Hovold + * + * state machine code inspired by code from Tim Ruetz + * + * A generic driver for rotary encoders connected to GPIO lines. + * See file:Documentation/input/rotary-encoder.txt for more information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "rotary-encoder" + +struct rotary_encoder { + struct input_dev *input; + const struct rotary_encoder_platform_data *pdata; + + unsigned int axis; + unsigned int pos; + + unsigned int irq_a; + unsigned int irq_b; + + bool armed; + unsigned char dir; /* 0 - clockwise, 1 - CCW */ + + char last_stable; +}; + +static int rotary_encoder_get_state(const struct rotary_encoder_platform_data *pdata) +{ + int a = !!gpio_get_value(pdata->gpio_a); + int b = !!gpio_get_value(pdata->gpio_b); + + a ^= pdata->inverted_a; + b ^= pdata->inverted_b; + + return ((a << 1) | b); +} + +static void rotary_encoder_report_event(struct rotary_encoder *encoder) +{ + const struct rotary_encoder_platform_data *pdata = encoder->pdata; + + if (pdata->relative_axis) { + input_report_rel(encoder->input, + pdata->axis, encoder->dir ? -1 : 1); + } else { + unsigned int pos = encoder->pos; + + if (encoder->dir) { + /* turning counter-clockwise */ + if (pdata->rollover) + pos += pdata->steps; + if (pos) + pos--; + } else { + /* turning clockwise */ + if (pdata->rollover || pos < pdata->steps) + pos++; + } + + if (pdata->rollover) + pos %= pdata->steps; + + encoder->pos = pos; + input_report_abs(encoder->input, pdata->axis, encoder->pos); + } + + input_sync(encoder->input); +} + +static irqreturn_t rotary_encoder_irq(int irq, void *dev_id) +{ + struct rotary_encoder *encoder = dev_id; + int state; + + state = rotary_encoder_get_state(encoder->pdata); + + switch (state) { + case 0x0: + if (encoder->armed) { + rotary_encoder_report_event(encoder); + encoder->armed = false; + } + break; + + case 0x1: + case 0x2: + if (encoder->armed) + encoder->dir = state - 1; + break; + + case 0x3: + encoder->armed = true; + break; + } + + return IRQ_HANDLED; +} + +static irqreturn_t rotary_encoder_half_period_irq(int irq, void *dev_id) +{ + struct rotary_encoder *encoder = dev_id; + int state; + + state = rotary_encoder_get_state(encoder->pdata); + + switch (state) { + case 0x00: + case 0x03: + if (state != encoder->last_stable) { + rotary_encoder_report_event(encoder); + encoder->last_stable = state; + } + break; + + case 0x01: + case 0x02: + encoder->dir = (encoder->last_stable + state) & 0x01; + break; + } + + return IRQ_HANDLED; +} + +#ifdef CONFIG_OF +static struct of_device_id rotary_encoder_of_match[] = { + { .compatible = "rotary-encoder", }, + { }, +}; +MODULE_DEVICE_TABLE(of, rotary_encoder_of_match); + +static struct rotary_encoder_platform_data *rotary_encoder_parse_dt(struct device *dev) +{ + const struct of_device_id *of_id = + of_match_device(rotary_encoder_of_match, dev); + struct device_node *np = dev->of_node; + struct rotary_encoder_platform_data *pdata; + enum of_gpio_flags flags; + + if (!of_id || !np) + return NULL; + + pdata = kzalloc(sizeof(struct rotary_encoder_platform_data), + GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + of_property_read_u32(np, "rotary-encoder,steps", &pdata->steps); + of_property_read_u32(np, "linux,axis", &pdata->axis); + + pdata->gpio_a = of_get_gpio_flags(np, 0, &flags); + pdata->inverted_a = flags & OF_GPIO_ACTIVE_LOW; + + pdata->gpio_b = of_get_gpio_flags(np, 1, &flags); + pdata->inverted_b = flags & OF_GPIO_ACTIVE_LOW; + + pdata->relative_axis = !!of_get_property(np, + "rotary-encoder,relative-axis", NULL); + pdata->rollover = !!of_get_property(np, + "rotary-encoder,rollover", NULL); + pdata->half_period = !!of_get_property(np, + "rotary-encoder,half-period", NULL); + + return pdata; +} +#else +static inline struct rotary_encoder_platform_data * +rotary_encoder_parse_dt(struct device *dev) +{ + return NULL; +} +#endif + +static int rotary_encoder_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + const struct rotary_encoder_platform_data *pdata = dev_get_platdata(dev); + struct rotary_encoder *encoder; + struct input_dev *input; + irq_handler_t handler; + int err; + + if (!pdata) { + pdata = rotary_encoder_parse_dt(dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + + if (!pdata) { + dev_err(dev, "missing platform data\n"); + return -EINVAL; + } + } + + encoder = kzalloc(sizeof(struct rotary_encoder), GFP_KERNEL); + input = input_allocate_device(); + if (!encoder || !input) { + err = -ENOMEM; + goto exit_free_mem; + } + + encoder->input = input; + encoder->pdata = pdata; + + input->name = pdev->name; + input->id.bustype = BUS_HOST; + input->dev.parent = dev; + + if (pdata->relative_axis) { + input->evbit[0] = BIT_MASK(EV_REL); + input->relbit[0] = BIT_MASK(pdata->axis); + } else { + input->evbit[0] = BIT_MASK(EV_ABS); + input_set_abs_params(encoder->input, + pdata->axis, 0, pdata->steps, 0, 1); + } + + /* request the GPIOs */ + err = gpio_request_one(pdata->gpio_a, GPIOF_IN, dev_name(dev)); + if (err) { + dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_a); + goto exit_free_mem; + } + + err = gpio_request_one(pdata->gpio_b, GPIOF_IN, dev_name(dev)); + if (err) { + dev_err(dev, "unable to request GPIO %d\n", pdata->gpio_b); + goto exit_free_gpio_a; + } + + encoder->irq_a = gpio_to_irq(pdata->gpio_a); + encoder->irq_b = gpio_to_irq(pdata->gpio_b); + + /* request the IRQs */ + if (pdata->half_period) { + handler = &rotary_encoder_half_period_irq; + encoder->last_stable = rotary_encoder_get_state(pdata); + } else { + handler = &rotary_encoder_irq; + } + + err = request_irq(encoder->irq_a, handler, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + DRV_NAME, encoder); + if (err) { + dev_err(dev, "unable to request IRQ %d\n", encoder->irq_a); + goto exit_free_gpio_b; + } + + err = request_irq(encoder->irq_b, handler, + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, + DRV_NAME, encoder); + if (err) { + dev_err(dev, "unable to request IRQ %d\n", encoder->irq_b); + goto exit_free_irq_a; + } + + err = input_register_device(input); + if (err) { + dev_err(dev, "failed to register input device\n"); + goto exit_free_irq_b; + } + + platform_set_drvdata(pdev, encoder); + + return 0; + +exit_free_irq_b: + free_irq(encoder->irq_b, encoder); +exit_free_irq_a: + free_irq(encoder->irq_a, encoder); +exit_free_gpio_b: + gpio_free(pdata->gpio_b); +exit_free_gpio_a: + gpio_free(pdata->gpio_a); +exit_free_mem: + input_free_device(input); + kfree(encoder); + if (!dev_get_platdata(&pdev->dev)) + kfree(pdata); + + return err; +} + +static int rotary_encoder_remove(struct platform_device *pdev) +{ + struct rotary_encoder *encoder = platform_get_drvdata(pdev); + const struct rotary_encoder_platform_data *pdata = encoder->pdata; + + free_irq(encoder->irq_a, encoder); + free_irq(encoder->irq_b, encoder); + gpio_free(pdata->gpio_a); + gpio_free(pdata->gpio_b); + + input_unregister_device(encoder->input); + kfree(encoder); + + if (!dev_get_platdata(&pdev->dev)) + kfree(pdata); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver rotary_encoder_driver = { + .probe = rotary_encoder_probe, + .remove = rotary_encoder_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(rotary_encoder_of_match), + } +}; +module_platform_driver(rotary_encoder_driver); + +MODULE_ALIAS("platform:" DRV_NAME); +MODULE_DESCRIPTION("GPIO rotary encoder driver"); +MODULE_AUTHOR("Daniel Mack , Johan Hovold"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/misc/sgi_btns.c b/drivers/input/misc/sgi_btns.c new file mode 100644 index 00000000..ad6415ce --- /dev/null +++ b/drivers/input/misc/sgi_btns.c @@ -0,0 +1,169 @@ +/* + * SGI Volume Button interface driver + * + * Copyright (C) 2008 Thomas Bogendoerfer + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_SGI_IP22 +#include + +static inline u8 button_status(void) +{ + u8 status; + + status = readb(&sgioc->panel) ^ 0xa0; + return ((status & 0x80) >> 6) | ((status & 0x20) >> 5); +} +#endif + +#ifdef CONFIG_SGI_IP32 +#include + +static inline u8 button_status(void) +{ + u64 status; + + status = readq(&mace->perif.audio.control); + writeq(status & ~(3U << 23), &mace->perif.audio.control); + + return (status >> 23) & 3; +} +#endif + +#define BUTTONS_POLL_INTERVAL 30 /* msec */ +#define BUTTONS_COUNT_THRESHOLD 3 + +static const unsigned short sgi_map[] = { + KEY_VOLUMEDOWN, + KEY_VOLUMEUP +}; + +struct buttons_dev { + struct input_polled_dev *poll_dev; + unsigned short keymap[ARRAY_SIZE(sgi_map)]; + int count[ARRAY_SIZE(sgi_map)]; +}; + +static void handle_buttons(struct input_polled_dev *dev) +{ + struct buttons_dev *bdev = dev->private; + struct input_dev *input = dev->input; + u8 status; + int i; + + status = button_status(); + + for (i = 0; i < ARRAY_SIZE(bdev->keymap); i++) { + if (status & (1U << i)) { + if (++bdev->count[i] == BUTTONS_COUNT_THRESHOLD) { + input_event(input, EV_MSC, MSC_SCAN, i); + input_report_key(input, bdev->keymap[i], 1); + input_sync(input); + } + } else { + if (bdev->count[i] >= BUTTONS_COUNT_THRESHOLD) { + input_event(input, EV_MSC, MSC_SCAN, i); + input_report_key(input, bdev->keymap[i], 0); + input_sync(input); + } + bdev->count[i] = 0; + } + } +} + +static int sgi_buttons_probe(struct platform_device *pdev) +{ + struct buttons_dev *bdev; + struct input_polled_dev *poll_dev; + struct input_dev *input; + int error, i; + + bdev = kzalloc(sizeof(struct buttons_dev), GFP_KERNEL); + poll_dev = input_allocate_polled_device(); + if (!bdev || !poll_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + memcpy(bdev->keymap, sgi_map, sizeof(bdev->keymap)); + + poll_dev->private = bdev; + poll_dev->poll = handle_buttons; + poll_dev->poll_interval = BUTTONS_POLL_INTERVAL; + + input = poll_dev->input; + input->name = "SGI buttons"; + input->phys = "sgi/input0"; + input->id.bustype = BUS_HOST; + input->dev.parent = &pdev->dev; + + input->keycode = bdev->keymap; + input->keycodemax = ARRAY_SIZE(bdev->keymap); + input->keycodesize = sizeof(unsigned short); + + input_set_capability(input, EV_MSC, MSC_SCAN); + __set_bit(EV_KEY, input->evbit); + for (i = 0; i < ARRAY_SIZE(sgi_map); i++) + __set_bit(bdev->keymap[i], input->keybit); + __clear_bit(KEY_RESERVED, input->keybit); + + bdev->poll_dev = poll_dev; + dev_set_drvdata(&pdev->dev, bdev); + + error = input_register_polled_device(poll_dev); + if (error) + goto err_free_mem; + + return 0; + + err_free_mem: + input_free_polled_device(poll_dev); + kfree(bdev); + dev_set_drvdata(&pdev->dev, NULL); + return error; +} + +static int sgi_buttons_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct buttons_dev *bdev = dev_get_drvdata(dev); + + input_unregister_polled_device(bdev->poll_dev); + input_free_polled_device(bdev->poll_dev); + kfree(bdev); + dev_set_drvdata(dev, NULL); + + return 0; +} + +static struct platform_driver sgi_buttons_driver = { + .probe = sgi_buttons_probe, + .remove = sgi_buttons_remove, + .driver = { + .name = "sgibtns", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(sgi_buttons_driver); + +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/sparcspkr.c b/drivers/input/misc/sparcspkr.c new file mode 100644 index 00000000..a53586a7 --- /dev/null +++ b/drivers/input/misc/sparcspkr.c @@ -0,0 +1,372 @@ +/* + * Driver for PC-speaker like devices found on various Sparc systems. + * + * Copyright (c) 2002 Vojtech Pavlik + * Copyright (c) 2002, 2006, 2008 David S. Miller (davem@davemloft.net) + */ +#include +#include +#include +#include +#include +#include + +#include + +MODULE_AUTHOR("David S. Miller "); +MODULE_DESCRIPTION("Sparc Speaker beeper driver"); +MODULE_LICENSE("GPL"); + +struct grover_beep_info { + void __iomem *freq_regs; + void __iomem *enable_reg; +}; + +struct bbc_beep_info { + u32 clock_freq; + void __iomem *regs; +}; + +struct sparcspkr_state { + const char *name; + int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); + spinlock_t lock; + struct input_dev *input_dev; + union { + struct grover_beep_info grover; + struct bbc_beep_info bbc; + } u; +}; + +static u32 bbc_count_to_reg(struct bbc_beep_info *info, unsigned int count) +{ + u32 val, clock_freq = info->clock_freq; + int i; + + if (!count) + return 0; + + if (count <= clock_freq >> 20) + return 1 << 18; + + if (count >= clock_freq >> 12) + return 1 << 10; + + val = 1 << 18; + for (i = 19; i >= 11; i--) { + val >>= 1; + if (count <= clock_freq >> i) + break; + } + + return val; +} + +static int bbc_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + struct sparcspkr_state *state = dev_get_drvdata(dev->dev.parent); + struct bbc_beep_info *info = &state->u.bbc; + unsigned int count = 0; + unsigned long flags; + + if (type != EV_SND) + return -1; + + switch (code) { + case SND_BELL: if (value) value = 1000; + case SND_TONE: break; + default: return -1; + } + + if (value > 20 && value < 32767) + count = 1193182 / value; + + count = bbc_count_to_reg(info, count); + + spin_lock_irqsave(&state->lock, flags); + + if (count) { + outb(0x01, info->regs + 0); + outb(0x00, info->regs + 2); + outb((count >> 16) & 0xff, info->regs + 3); + outb((count >> 8) & 0xff, info->regs + 4); + outb(0x00, info->regs + 5); + } else { + outb(0x00, info->regs + 0); + } + + spin_unlock_irqrestore(&state->lock, flags); + + return 0; +} + +static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ + struct sparcspkr_state *state = dev_get_drvdata(dev->dev.parent); + struct grover_beep_info *info = &state->u.grover; + unsigned int count = 0; + unsigned long flags; + + if (type != EV_SND) + return -1; + + switch (code) { + case SND_BELL: if (value) value = 1000; + case SND_TONE: break; + default: return -1; + } + + if (value > 20 && value < 32767) + count = 1193182 / value; + + spin_lock_irqsave(&state->lock, flags); + + if (count) { + /* enable counter 2 */ + outb(inb(info->enable_reg) | 3, info->enable_reg); + /* set command for counter 2, 2 byte write */ + outb(0xB6, info->freq_regs + 1); + /* select desired HZ */ + outb(count & 0xff, info->freq_regs + 0); + outb((count >> 8) & 0xff, info->freq_regs + 0); + } else { + /* disable counter 2 */ + outb(inb_p(info->enable_reg) & 0xFC, info->enable_reg); + } + + spin_unlock_irqrestore(&state->lock, flags); + + return 0; +} + +static int sparcspkr_probe(struct device *dev) +{ + struct sparcspkr_state *state = dev_get_drvdata(dev); + struct input_dev *input_dev; + int error; + + input_dev = input_allocate_device(); + if (!input_dev) + return -ENOMEM; + + input_dev->name = state->name; + input_dev->phys = "sparc/input0"; + input_dev->id.bustype = BUS_ISA; + input_dev->id.vendor = 0x001f; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = dev; + + input_dev->evbit[0] = BIT_MASK(EV_SND); + input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); + + input_dev->event = state->event; + + error = input_register_device(input_dev); + if (error) { + input_free_device(input_dev); + return error; + } + + state->input_dev = input_dev; + + return 0; +} + +static void sparcspkr_shutdown(struct platform_device *dev) +{ + struct sparcspkr_state *state = dev_get_drvdata(&dev->dev); + struct input_dev *input_dev = state->input_dev; + + /* turn off the speaker */ + state->event(input_dev, EV_SND, SND_BELL, 0); +} + +static int bbc_beep_probe(struct platform_device *op) +{ + struct sparcspkr_state *state; + struct bbc_beep_info *info; + struct device_node *dp; + int err = -ENOMEM; + + state = kzalloc(sizeof(*state), GFP_KERNEL); + if (!state) + goto out_err; + + state->name = "Sparc BBC Speaker"; + state->event = bbc_spkr_event; + spin_lock_init(&state->lock); + + dp = of_find_node_by_path("/"); + err = -ENODEV; + if (!dp) + goto out_free; + + info = &state->u.bbc; + info->clock_freq = of_getintprop_default(dp, "clock-frequency", 0); + if (!info->clock_freq) + goto out_free; + + info->regs = of_ioremap(&op->resource[0], 0, 6, "bbc beep"); + if (!info->regs) + goto out_free; + + dev_set_drvdata(&op->dev, state); + + err = sparcspkr_probe(&op->dev); + if (err) + goto out_clear_drvdata; + + return 0; + +out_clear_drvdata: + dev_set_drvdata(&op->dev, NULL); + of_iounmap(&op->resource[0], info->regs, 6); + +out_free: + kfree(state); +out_err: + return err; +} + +static int bbc_remove(struct platform_device *op) +{ + struct sparcspkr_state *state = dev_get_drvdata(&op->dev); + struct input_dev *input_dev = state->input_dev; + struct bbc_beep_info *info = &state->u.bbc; + + /* turn off the speaker */ + state->event(input_dev, EV_SND, SND_BELL, 0); + + input_unregister_device(input_dev); + + of_iounmap(&op->resource[0], info->regs, 6); + + dev_set_drvdata(&op->dev, NULL); + kfree(state); + + return 0; +} + +static const struct of_device_id bbc_beep_match[] = { + { + .name = "beep", + .compatible = "SUNW,bbc-beep", + }, + {}, +}; + +static struct platform_driver bbc_beep_driver = { + .driver = { + .name = "bbcbeep", + .owner = THIS_MODULE, + .of_match_table = bbc_beep_match, + }, + .probe = bbc_beep_probe, + .remove = bbc_remove, + .shutdown = sparcspkr_shutdown, +}; + +static int grover_beep_probe(struct platform_device *op) +{ + struct sparcspkr_state *state; + struct grover_beep_info *info; + int err = -ENOMEM; + + state = kzalloc(sizeof(*state), GFP_KERNEL); + if (!state) + goto out_err; + + state->name = "Sparc Grover Speaker"; + state->event = grover_spkr_event; + spin_lock_init(&state->lock); + + info = &state->u.grover; + info->freq_regs = of_ioremap(&op->resource[2], 0, 2, "grover beep freq"); + if (!info->freq_regs) + goto out_free; + + info->enable_reg = of_ioremap(&op->resource[3], 0, 1, "grover beep enable"); + if (!info->enable_reg) + goto out_unmap_freq_regs; + + dev_set_drvdata(&op->dev, state); + + err = sparcspkr_probe(&op->dev); + if (err) + goto out_clear_drvdata; + + return 0; + +out_clear_drvdata: + dev_set_drvdata(&op->dev, NULL); + of_iounmap(&op->resource[3], info->enable_reg, 1); + +out_unmap_freq_regs: + of_iounmap(&op->resource[2], info->freq_regs, 2); +out_free: + kfree(state); +out_err: + return err; +} + +static int grover_remove(struct platform_device *op) +{ + struct sparcspkr_state *state = dev_get_drvdata(&op->dev); + struct grover_beep_info *info = &state->u.grover; + struct input_dev *input_dev = state->input_dev; + + /* turn off the speaker */ + state->event(input_dev, EV_SND, SND_BELL, 0); + + input_unregister_device(input_dev); + + of_iounmap(&op->resource[3], info->enable_reg, 1); + of_iounmap(&op->resource[2], info->freq_regs, 2); + + dev_set_drvdata(&op->dev, NULL); + kfree(state); + + return 0; +} + +static const struct of_device_id grover_beep_match[] = { + { + .name = "beep", + .compatible = "SUNW,smbus-beep", + }, + {}, +}; + +static struct platform_driver grover_beep_driver = { + .driver = { + .name = "groverbeep", + .owner = THIS_MODULE, + .of_match_table = grover_beep_match, + }, + .probe = grover_beep_probe, + .remove = grover_remove, + .shutdown = sparcspkr_shutdown, +}; + +static int __init sparcspkr_init(void) +{ + int err = platform_driver_register(&bbc_beep_driver); + + if (!err) { + err = platform_driver_register(&grover_beep_driver); + if (err) + platform_driver_unregister(&bbc_beep_driver); + } + + return err; +} + +static void __exit sparcspkr_exit(void) +{ + platform_driver_unregister(&bbc_beep_driver); + platform_driver_unregister(&grover_beep_driver); +} + +module_init(sparcspkr_init); +module_exit(sparcspkr_exit); diff --git a/drivers/input/misc/stk3x1x.c b/drivers/input/misc/stk3x1x.c new file mode 100644 index 00000000..a6ed55fb --- /dev/null +++ b/drivers/input/misc/stk3x1x.c @@ -0,0 +1,4262 @@ +/* + * stk3x1x.c - Linux kernel modules for sensortek stk301x, stk321x, stk331x + * , and stk3410 proximity/ambient light sensor + * + * Copyright (C) 2012~2015 Lex Hsieh / sensortek + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#include +#include +//#include +#include + +#include + +#define DRIVER_VERSION "3.10.1 20151217" + +/* Driver Settings */ +#define CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD +#ifdef CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD +#define STK_ALS_CHANGE_THD 5 //10 /* The threshold to trigger ALS interrupt, unit: lux */ +#endif /* #ifdef CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD */ +#define STK_INT_PS_MODE 1 /* 1, 2, or 3 */ +//#define STK_POLL_PS +#define STK_POLL_ALS /* ALS interrupt is valid only when STK_INT_PS_MODE = 1 or 4*/ +#define STK_TUNE0 +#define CALI_PS_EVERY_TIME +//#define STK_DEBUG_PRINTF +#define SPREADTRUM_PLATFORM +#define STK_ALS_FIR +//#define STK_IRS +//#define STK_CHK_REG +//#define STK_GES +//#define STK_QUALCOMM_POWER_CTRL +//#define QUALCOMM_PLATFORM + +#if 0 +#ifdef SPREADTRUM_PLATFORM +#include +#else + #include "stk3x1x.h" +#endif +#endif +#include "stk3x1x.h" + +/* Define Register Map */ +#define STK_STATE_REG 0x00 +#define STK_PSCTRL_REG 0x01 +#define STK_ALSCTRL_REG 0x02 +#define STK_LEDCTRL_REG 0x03 +#define STK_INT_REG 0x04 +#define STK_WAIT_REG 0x05 +#define STK_THDH1_PS_REG 0x06 +#define STK_THDH2_PS_REG 0x07 +#define STK_THDL1_PS_REG 0x08 +#define STK_THDL2_PS_REG 0x09 +#define STK_THDH1_ALS_REG 0x0A +#define STK_THDH2_ALS_REG 0x0B +#define STK_THDL1_ALS_REG 0x0C +#define STK_THDL2_ALS_REG 0x0D +#define STK_FLAG_REG 0x10 +#define STK_DATA1_PS_REG 0x11 +#define STK_DATA2_PS_REG 0x12 +#define STK_DATA1_ALS_REG 0x13 +#define STK_DATA2_ALS_REG 0x14 +#define STK_DATA1_OFFSET_REG 0x15 +#define STK_DATA2_OFFSET_REG 0x16 +#define STK_DATA1_IR_REG 0x17 +#define STK_DATA2_IR_REG 0x18 +#define STK_PDT_ID_REG 0x3E +#define STK_RSRVD_REG 0x3F +#define STK_SW_RESET_REG 0x80 + +#define STK_GSCTRL_REG 0x1A +#define STK_FLAG2_REG 0x1C + +/* Define state reg */ +#define STK_STATE_EN_IRS_SHIFT 7 +#define STK_STATE_EN_AK_SHIFT 6 +#define STK_STATE_EN_ASO_SHIFT 5 +#define STK_STATE_EN_IRO_SHIFT 4 +#define STK_STATE_EN_WAIT_SHIFT 2 +#define STK_STATE_EN_ALS_SHIFT 1 +#define STK_STATE_EN_PS_SHIFT 0 + +#define STK_STATE_EN_IRS_MASK 0x80 +#define STK_STATE_EN_AK_MASK 0x40 +#define STK_STATE_EN_ASO_MASK 0x20 +#define STK_STATE_EN_IRO_MASK 0x10 +#define STK_STATE_EN_WAIT_MASK 0x04 +#define STK_STATE_EN_ALS_MASK 0x02 +#define STK_STATE_EN_PS_MASK 0x01 + +/* Define PS ctrl reg */ +#define STK_PS_PRS_SHIFT 6 +#define STK_PS_GAIN_SHIFT 4 +#define STK_PS_IT_SHIFT 0 + +#define STK_PS_PRS_MASK 0xC0 +#define STK_PS_GAIN_MASK 0x30 +#define STK_PS_IT_MASK 0x0F + +/* Define ALS ctrl reg */ +#define STK_ALS_PRS_SHIFT 6 +#define STK_ALS_GAIN_SHIFT 4 +#define STK_ALS_IT_SHIFT 0 + +#define STK_ALS_PRS_MASK 0xC0 +#define STK_ALS_GAIN_MASK 0x30 +#define STK_ALS_IT_MASK 0x0F + +/* Define LED ctrl reg */ +#define STK_LED_IRDR_SHIFT 6 +#define STK_LED_DT_SHIFT 0 + +#define STK_LED_IRDR_MASK 0xC0 +#define STK_LED_DT_MASK 0x3F + +/* Define interrupt reg */ +#define STK_INT_CTRL_SHIFT 7 +#define STK_INT_OUI_SHIFT 4 +#define STK_INT_ALS_SHIFT 3 +#define STK_INT_PS_SHIFT 0 + +#define STK_INT_CTRL_MASK 0x80 +#define STK_INT_OUI_MASK 0x10 +#define STK_INT_ALS_MASK 0x08 +#define STK_INT_PS_MASK 0x07 + +#define STK_INT_ALS 0x08 + +/* Define flag reg */ +#define STK_FLG_ALSDR_SHIFT 7 +#define STK_FLG_PSDR_SHIFT 6 +#define STK_FLG_ALSINT_SHIFT 5 +#define STK_FLG_PSINT_SHIFT 4 +#define STK_FLG_OUI_SHIFT 2 +#define STK_FLG_IR_RDY_SHIFT 1 +#define STK_FLG_NF_SHIFT 0 + +#define STK_FLG_ALSDR_MASK 0x80 +#define STK_FLG_PSDR_MASK 0x40 +#define STK_FLG_ALSINT_MASK 0x20 +#define STK_FLG_PSINT_MASK 0x10 +#define STK_FLG_OUI_MASK 0x04 +#define STK_FLG_IR_RDY_MASK 0x02 +#define STK_FLG_NF_MASK 0x01 + +/* Define flag2 reg */ +#define STK_FLG2_INT_GS_SHIFT 6 +#define STK_FLG2_GS10_SHIFT 5 +#define STK_FLG2_GS01_SHIFT 4 + +#define STK_FLG2_INT_GS_MASK 0x40 +#define STK_FLG2_GS10_MASK 0x20 +#define STK_FLG2_GS01_MASK 0x10 + + +/* misc define */ +#define MIN_ALS_POLL_DELAY_NS 60000000 + + +#ifdef STK_TUNE0 + #define STK_MAX_MIN_DIFF 150 //200 + #define STK_LT_N_CT 50 //100 + #define STK_HT_N_CT 80 //150 +#endif /* #ifdef STK_TUNE0 */ + +#define STK_IRC_MAX_ALS_CODE 20000 +#define STK_IRC_MIN_ALS_CODE 25 +#define STK_IRC_MIN_IR_CODE 50 +#define STK_IRC_ALS_DENOMI 2 +#define STK_IRC_ALS_NUMERA 5 +#define STK_IRC_ALS_CORREC 850 + +#define STK_IRS_IT_REDUCE 2 +#define STK_ALS_READ_IRS_IT_REDUCE 5 +#define STK_ALS_THRESHOLD 30 + +#define DEVICE_NAME "stk_ps" +#define ALS_NAME "lightsensor-level" +#define PS_NAME "proximity" + +#ifdef STK_QUALCOMM_POWER_CTRL + /* POWER SUPPLY VOLTAGE RANGE */ + #define STK3X1X_VDD_MIN_UV 2000000 + #define STK3X1X_VDD_MAX_UV 3300000 + #define STK3X1X_VIO_MIN_UV 1750000 + #define STK3X1X_VIO_MAX_UV 1950000 +#endif + +#define STK3310SA_PID 0x17 +#define STK3311SA_PID 0x1E +#define STK3311WV_PID 0x1D + +#ifdef SPREADTRUM_PLATFORM +extern int sprd_3rdparty_gpio_pls_irq; + +static struct stk3x1x_platform_data stk3x1x_pfdata={ + .state_reg = 0x0, /* disable all */ + .psctrl_reg = 0x31, /* ps_persistance=1, ps_gain=64X, PS_IT=0.391ms */ + .alsctrl_reg = 0x39, /* als_persistance=1, als_gain=64X, ALS_IT=100ms */ + .ledctrl_reg = 0xFF, /* 100mA IRDR, 64/64 LED duty */ + .wait_reg = 0xF, /* 100 ms */ + .ps_thd_h =1700, + .ps_thd_l = 1500, + .int_pin = 216,//GPIO_PROX_INT//sprd_3rdparty_gpio_pls_irq + .transmittance = 3100, //500 +}; +#endif + +#ifdef STK_ALS_FIR + #define STK_FIR_LEN 4 //6 //8 + #define MAX_FIR_LEN 32 +struct data_filter { + u16 raw[MAX_FIR_LEN]; + int sum; + int number; + int idx; +}; +#endif + +#ifdef STK_GES +union stk_ges_operation{ + uint8_t ops[4]; + struct { + uint8_t rw_len_retry; + uint8_t reg; + uint8_t reg_value_retry_crit; + uint8_t sleep_10ns; + }action; +}; + +union stk_ges_operation stk_ges_op[10] = +{ + {.ops={0xc1, 0x24, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}}, + {.ops={0, 0, 0, 0}} +}; +#endif + +struct stk3x1x_data { + struct i2c_client *client; + struct stk3x1x_platform_data *pdata; +#if (!defined(STK_POLL_PS) || !defined(STK_POLL_ALS)) + int32_t irq; + struct work_struct stk_work; + struct workqueue_struct *stk_wq; +#endif + uint16_t ir_code; + uint16_t als_correct_factor; + uint8_t alsctrl_reg; + uint8_t psctrl_reg; + uint8_t ledctrl_reg; + uint8_t state_reg; + int int_pin; + uint8_t wait_reg; + uint8_t int_reg; +#ifdef CONFIG_HAS_EARLYSUSPEND + //struct early_suspend stk_early_suspend; +#endif + uint16_t ps_thd_h; + uint16_t ps_thd_l; +#ifdef CALI_PS_EVERY_TIME + uint16_t ps_high_thd_boot; + uint16_t ps_low_thd_boot; +#endif + struct mutex io_lock; + struct input_dev *ps_input_dev; + int32_t ps_distance_last; + bool ps_enabled; + bool re_enable_ps; + struct wake_lock ps_wakelock; +#ifdef STK_POLL_PS + struct hrtimer ps_timer; + struct work_struct stk_ps_work; + struct workqueue_struct *stk_ps_wq; + struct wake_lock ps_nosuspend_wl; +#endif + struct input_dev *als_input_dev; + int32_t als_lux_last; + uint32_t als_transmittance; + bool als_enabled; + bool re_enable_als; + ktime_t ps_poll_delay; + ktime_t als_poll_delay; +#ifdef STK_POLL_ALS + struct work_struct stk_als_work; + struct hrtimer als_timer; + struct workqueue_struct *stk_als_wq; +#endif + bool first_boot; +#ifdef STK_TUNE0 + uint16_t psa; + uint16_t psi; + uint16_t psi_set; + struct hrtimer ps_tune0_timer; + struct workqueue_struct *stk_ps_tune0_wq; + struct work_struct stk_ps_tune0_work; + ktime_t ps_tune0_delay; + bool tune_zero_init_proc; + uint32_t ps_stat_data[3]; + int data_count; + int stk_max_min_diff; + int stk_lt_n_ct; + int stk_ht_n_ct; +#endif +#ifdef STK_ALS_FIR + struct data_filter fir; + atomic_t firlength; +#endif + atomic_t recv_reg; + +#ifdef STK_GES + struct input_dev *ges_input_dev; + int ges_enabled; + int re_enable_ges; + atomic_t gesture2; +#endif +#ifdef STK_IRS + int als_data_index; +#endif +#ifdef STK_QUALCOMM_POWER_CTRL + struct regulator *vdd; + struct regulator *vio; + bool power_enabled; +#endif + uint8_t pid; + uint8_t p_wv_r_bd_with_co; + uint32_t als_code_last; +}; + +#if( !defined(CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD)) +static uint32_t lux_threshold_table[] = +{ + 3, + 10, + 40, + 65, + 145, + 300, + 550, + 930, + 1250, + 1700, +}; + +#define LUX_THD_TABLE_SIZE (sizeof(lux_threshold_table)/sizeof(uint32_t)+1) +static uint16_t code_threshold_table[LUX_THD_TABLE_SIZE+1]; +#endif + +static int32_t stk3x1x_enable_ps(struct stk3x1x_data *ps_data, uint8_t enable, uint8_t validate_reg); +static int32_t stk3x1x_enable_als(struct stk3x1x_data *ps_data, uint8_t enable); +static int32_t stk3x1x_set_ps_thd_l(struct stk3x1x_data *ps_data, uint16_t thd_l); +static int32_t stk3x1x_set_ps_thd_h(struct stk3x1x_data *ps_data, uint16_t thd_h); +static int32_t stk3x1x_set_als_thd_l(struct stk3x1x_data *ps_data, uint16_t thd_l); +static int32_t stk3x1x_set_als_thd_h(struct stk3x1x_data *ps_data, uint16_t thd_h); +static int32_t stk3x1x_get_ir_reading(struct stk3x1x_data *ps_data, int32_t als_it_reduce); +#ifdef STK_TUNE0 +static int stk_ps_tune_zero_func_fae(struct stk3x1x_data *ps_data); +#endif +#ifdef STK_CHK_REG +static int stk3x1x_validate_n_handle(struct i2c_client *client); +#endif +static int stk_ps_val(struct stk3x1x_data *ps_data); +#ifdef STK_QUALCOMM_POWER_CTRL +static int stk3x1x_device_ctl(struct stk3x1x_data *ps_data, bool enable); +#endif + +static int stk3x1x_i2c_read_data(struct i2c_client *client, unsigned char command, int length, unsigned char *values) +{ + uint8_t retry; + int err; + struct i2c_msg msgs[] = + { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = &command, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = values, + }, + }; + + for (retry = 0; retry < 5; retry++) + { + err = i2c_transfer(client->adapter, msgs, 2); + if (err == 2) + break; + else + mdelay(5); + } + //printk("stk3x1x_i2c_read_data"); + + if (retry >= 5) + { + printk(KERN_ERR "%s: i2c read fail, err=%d\n", __func__, err); + return -EIO; + } + return 0; +} + +static int stk3x1x_i2c_write_data(struct i2c_client *client, unsigned char command, int length, unsigned char *values) +{ + int retry; + int err; + unsigned char data[11]; + struct i2c_msg msg; + int index; + //printk("stk3x1x_i2c_write_data"); + + if (!client) + return -EINVAL; + else if (length >= 10) + { + printk(KERN_ERR "%s:length %d exceeds 10\n", __func__, length); + return -EINVAL; + } + + data[0] = command; + for (index=1;index<=length;index++) + data[index] = values[index-1]; + + msg.addr = client->addr; + msg.flags = 0; + msg.len = length+1; + msg.buf = data; + + for (retry = 0; retry < 5; retry++) + { + err = i2c_transfer(client->adapter, &msg, 1); + if (err == 1) + break; + else + mdelay(5); + } + + if (retry >= 5) + { + printk(KERN_ERR "%s: i2c write fail, err=%d\n", __func__, err); + return -EIO; + } + return 0; +} + +static int stk3x1x_i2c_smbus_read_byte_data(struct i2c_client *client, unsigned char command) +{ + unsigned char value; + int err; + err = stk3x1x_i2c_read_data(client, command, 1, &value); + if(err < 0) + return err; + return value; +} + +static int stk3x1x_i2c_smbus_write_byte_data(struct i2c_client *client, unsigned char command, unsigned char value) +{ + int err; + err = stk3x1x_i2c_write_data(client, command, 1, &value); + return err; +} + +uint32_t stk_alscode2lux(struct stk3x1x_data *ps_data, uint32_t alscode) +{ + alscode += ((alscode<<7)+(alscode<<3)+(alscode>>1)); + alscode<<=3; + alscode/=ps_data->als_transmittance; + return alscode; +} + +uint32_t stk_lux2alscode(struct stk3x1x_data *ps_data, uint32_t lux) +{ + lux*=ps_data->als_transmittance; + lux/=1100; + if (unlikely(lux>=(1<<16))) + lux = (1<<16) -1; + return lux; +} + +#ifndef CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD +static void stk_init_code_threshold_table(struct stk3x1x_data *ps_data) +{ + uint32_t i,j; + uint32_t alscode; + + code_threshold_table[0] = 0; +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "alscode[0]=%d\n",0); +#endif + for (i=1,j=0;i=code_threshold_table[i-1])&&(alscode= (1<<16)) + high_thd = (1<<16) -1; + if (low_thd <0) + low_thd = 0; + stk3x1x_set_als_thd_h(ps_data, (uint16_t)high_thd); + stk3x1x_set_als_thd_l(ps_data, (uint16_t)low_thd); +} +#endif // CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD + + +static void stk3x1x_proc_plat_data(struct stk3x1x_data *ps_data, struct stk3x1x_platform_data *plat_data) +{ + uint8_t w_reg; + + ps_data->state_reg = plat_data->state_reg; + ps_data->psctrl_reg = plat_data->psctrl_reg; +#ifdef STK_POLL_PS + ps_data->psctrl_reg &= 0x3F; +#endif + ps_data->alsctrl_reg = plat_data->alsctrl_reg; + ps_data->ledctrl_reg = plat_data->ledctrl_reg; + if(ps_data->pid == STK3310SA_PID || ps_data->pid == STK3311SA_PID) + ps_data->ledctrl_reg &= 0x3F; + + ps_data->wait_reg = plat_data->wait_reg; + if(ps_data->wait_reg < 2) + { + printk(KERN_WARNING "%s: wait_reg should be larger than 2, force to write 2\n", __func__); + ps_data->wait_reg = 2; + } + else if (ps_data->wait_reg > 0xFF) + { + printk(KERN_WARNING "%s: wait_reg should be less than 0xFF, force to write 0xFF\n", __func__); + ps_data->wait_reg = 0xFF; + } +//#ifndef STK_TUNE0 + if(ps_data->ps_thd_h == 0 && ps_data->ps_thd_l == 0) + { + ps_data->ps_thd_h = plat_data->ps_thd_h; + ps_data->ps_thd_l = plat_data->ps_thd_l; + } +//#endif +#ifdef CALI_PS_EVERY_TIME + ps_data->ps_high_thd_boot = plat_data->ps_thd_h; + ps_data->ps_low_thd_boot = plat_data->ps_thd_l; +#endif + w_reg = 0; +#ifndef STK_POLL_PS + w_reg |= STK_INT_PS_MODE; +#else + w_reg |= 0x01; +#endif + +#if (!defined(STK_POLL_ALS) && (STK_INT_PS_MODE != 0x02) && (STK_INT_PS_MODE != 0x03)) + w_reg |= STK_INT_ALS; +#endif + ps_data->int_reg = w_reg; + return; +} + +static int32_t stk3x1x_init_all_reg(struct stk3x1x_data *ps_data) +{ + int32_t ret; + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_STATE_REG, ps_data->state_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_PSCTRL_REG, ps_data->psctrl_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_ALSCTRL_REG, ps_data->alsctrl_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_LEDCTRL_REG, ps_data->ledctrl_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_WAIT_REG, ps_data->wait_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } +#ifdef STK_TUNE0 + ps_data->psa = 0x0; + ps_data->psi = 0xFFFF; +#endif +//#else + stk3x1x_set_ps_thd_h(ps_data, ps_data->ps_thd_h); + stk3x1x_set_ps_thd_l(ps_data, ps_data->ps_thd_l); +//#endif + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_INT_REG, ps_data->int_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + /* + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, 0x87, 0x60); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + */ + + return 0; +} + +static int32_t stk3x1x_read_otp25(struct stk3x1x_data *ps_data) +{ + int32_t ret, otp25; + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, 0x0, 0x2); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, 0x90, 0x25); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, 0x92, 0x82); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + usleep_range(1000, 5000); + + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,0x91); + if (ret < 0) + { + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; + } + otp25 = ret; + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, 0x0, 0x0); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + printk(KERN_INFO "%s: otp25=0x%x\n", __func__, otp25); + if(otp25 & 0x80) + return 1; + return 0; +} + +static int32_t stk3x1x_check_pid(struct stk3x1x_data *ps_data) +{ + unsigned char value[2], pid_msb; + int err; + + ps_data->p_wv_r_bd_with_co = 0; + + err = stk3x1x_i2c_read_data(ps_data->client, STK_PDT_ID_REG, 2, &value[0]); + if(err < 0) + { + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, err); + return err; + } + + printk(KERN_INFO "%s: PID=0x%x, RID=0x%x\n", __func__, value[0], value[1]); + ps_data->pid = value[0]; + + if(value[0] == STK3311WV_PID) + ps_data->p_wv_r_bd_with_co |= 0b100; + if(value[1] == 0xC3) + ps_data->p_wv_r_bd_with_co |= 0b010; + + if(stk3x1x_read_otp25(ps_data) == 1) + { + ps_data->p_wv_r_bd_with_co |= 0b001; + } + printk(KERN_INFO "%s: p_wv_r_bd_with_co = 0x%x\n", __func__, ps_data->p_wv_r_bd_with_co); + + if(value[0] == 0) + { + printk(KERN_ERR "PID=0x0, please make sure the chip is stk3x1x!\n"); + return -2; + } + + pid_msb = value[0] & 0xF0; + switch(pid_msb) + { + case 0x10: + case 0x20: + case 0x30: + return 0; + default: + printk(KERN_ERR "%s: invalid PID(%#x)\n", __func__, value[0]); + return -1; + } + return 0; +} + + +static int32_t stk3x1x_software_reset(struct stk3x1x_data *ps_data) +{ + int32_t r; + uint8_t w_reg; + + w_reg = 0x7F; + r = stk3x1x_i2c_smbus_write_byte_data(ps_data->client,STK_WAIT_REG,w_reg); + if (r<0) + { + printk(KERN_ERR "%s: software reset: write i2c error, ret=%d\n", __func__, r); + return r; + } + r = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_WAIT_REG); + if (w_reg != r) + { + printk(KERN_ERR "%s: software reset: read-back value is not the same\n", __func__); + return -1; + } + + r = stk3x1x_i2c_smbus_write_byte_data(ps_data->client,STK_SW_RESET_REG,0); + if (r<0) + { + printk(KERN_ERR "%s: software reset: read error after reset\n", __func__); + return r; + } + usleep_range(13000, 15000); + return 0; +} + + +static int32_t stk3x1x_set_als_thd_l(struct stk3x1x_data *ps_data, uint16_t thd_l) +{ + unsigned char val[2]; + int ret; + val[0] = (thd_l & 0xFF00) >> 8; + val[1] = thd_l & 0x00FF; + ret = stk3x1x_i2c_write_data(ps_data->client, STK_THDL1_ALS_REG, 2, val); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} +static int32_t stk3x1x_set_als_thd_h(struct stk3x1x_data *ps_data, uint16_t thd_h) +{ + unsigned char val[2]; + int ret; + val[0] = (thd_h & 0xFF00) >> 8; + val[1] = thd_h & 0x00FF; + ret = stk3x1x_i2c_write_data(ps_data->client, STK_THDH1_ALS_REG, 2, val); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +static int32_t stk3x1x_set_ps_thd_l(struct stk3x1x_data *ps_data, uint16_t thd_l) +{ + unsigned char val[2]; + int ret; + val[0] = (thd_l & 0xFF00) >> 8; + val[1] = thd_l & 0x00FF; + ret = stk3x1x_i2c_write_data(ps_data->client, STK_THDL1_PS_REG, 2, val); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} +static int32_t stk3x1x_set_ps_thd_h(struct stk3x1x_data *ps_data, uint16_t thd_h) +{ + unsigned char val[2]; + int ret; + val[0] = (thd_h & 0xFF00) >> 8; + val[1] = thd_h & 0x00FF; + ret = stk3x1x_i2c_write_data(ps_data->client, STK_THDH1_PS_REG, 2, val); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +static uint32_t stk3x1x_get_ps_reading(struct stk3x1x_data *ps_data) +{ + unsigned char value[2]; + int err; + err = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_PS_REG, 2, &value[0]); + if(err < 0) + { + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, err); + return err; + } + return ((value[0]<<8) | value[1]); +} + + +static int32_t stk3x1x_set_flag(struct stk3x1x_data *ps_data, uint8_t org_flag_reg, uint8_t clr) +{ + uint8_t w_flag; + int ret; + + w_flag = org_flag_reg | (STK_FLG_ALSINT_MASK | STK_FLG_PSINT_MASK | STK_FLG_OUI_MASK | STK_FLG_IR_RDY_MASK); + w_flag &= (~clr); + //printk(KERN_INFO "%s: org_flag_reg=0x%x, w_flag = 0x%x\n", __func__, org_flag_reg, w_flag); + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client,STK_FLAG_REG, w_flag); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +static int32_t stk3x1x_get_flag(struct stk3x1x_data *ps_data) +{ + int ret; + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_FLAG_REG); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +#ifdef STK_GES +static int32_t stk3x1x_set_flag2(struct stk3x1x_data *ps_data, uint8_t org_flag2_reg, uint8_t clr) +{ + uint8_t w_flag2; + int ret; + + w_flag2 = org_flag2_reg | 0x72; + w_flag2 &= (~clr); + //printk(KERN_INFO "%s: org_flag2_reg=0x%x, w_flag2 = 0x%x\n", __func__, org_flag2_reg, w_flag2); + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client,STK_FLAG2_REG, w_flag2); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +static int32_t stk3x1x_get_flag2(struct stk3x1x_data *ps_data) +{ + int ret; + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_FLAG2_REG); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} +#endif + +static int32_t stk3x1x_set_state(struct stk3x1x_data *ps_data, uint8_t state) +{ + int ret; + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client,STK_STATE_REG, state); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +static int32_t stk3x1x_get_state(struct stk3x1x_data *ps_data) +{ + int ret; + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_STATE_REG); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +#ifdef STK_GES +static int32_t stk3x1x_set_gsctrl(struct stk3x1x_data *ps_data, uint8_t state) +{ + int ret; + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client,STK_GSCTRL_REG, state); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +static int32_t stk3x1x_get_gsctrl(struct stk3x1x_data *ps_data) +{ + int ret; + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_GSCTRL_REG); + if(ret < 0) + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, ret); + return ret; +} + +#if 0 +static uint32_t stk3x1x_get_ges_reading(struct stk3x1x_data *ps_data, unsigned int *ges0, + unsigned int *ges1, unsigned int *ges2) +{ + int retry, len, no = 0; + uint8_t reg_val_crit; + int err; + unsigned char value[10]; + + while(stk_ges_op[no].ops[1] != 0) + { + retry = stk_ges_op[no].action.rw_len_retry & 0x0F; + len = (stk_ges_op[no].action.rw_len_retry & 0x70) >> 4; + reg_val_crit = stk_ges_op[no].action.reg_value_retry_crit; + if(stk_ges_op[no].action.rw_len_retry & 0x80) + { + while(retry != 0) + { + err = stk3x1x_i2c_read_data(ps_data->client, + stk_ges_op[no].action.reg, len, value); + if(err < 0) + { + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, err); + return err; + } + if(reg_val_crit) + { + if(value[0] & reg_val_crit) + break; + } + if(stk_ges_op[no].action.sleep_10ns != 0) + usleep_range(stk_ges_op[no].action.sleep_10ns*10, + stk_ges_op[no].action.sleep_10ns*10+300); + retry--; + } + } + else + { + while(retry != 0) + { + err = stk3x1x_i2c_write_data(ps_data->client, stk_ges_op[no].action.reg, + len, ®_val_crit); + if(err < 0) + { + printk(KERN_ERR "%s: fail, err=%d\n", __func__, err); + return err; + } + + if(stk_ges_op[no].action.sleep_10ns != 0) + usleep_range(stk_ges_op[no].action.sleep_10ns*10, + stk_ges_op[no].action.sleep_10ns*10+300); + retry--; + } + } + + if(stk_ges_op[no].action.reg == 0x24) + { + *ges0 = (value[0]<<8) | value[1]; + *ges1 = (value[2]<<8) | value[3]; + } + else if(stk_ges_op[no].action.reg == stk_ges_op[9].ops[0]) + { + *ges2 = (value[0]<<8) | value[1]; + } + + no++; + } + return 0; +} + +#else +static uint32_t stk3x1x_get_ges_reading(struct stk3x1x_data *ps_data, unsigned int *ges0,unsigned int *ges1,unsigned int *ges2) +{ + unsigned char value[4]; + int err, retry = 10; + + do { + err = stk3x1x_get_flag(ps_data); + if(err < 0) + return err; + if(err & STK_FLG_PSDR_MASK) + break; + //printk(KERN_INFO "ges: not ready, %d\n", retry); + retry--; + usleep_range(350, 1000); + } while(retry > 0); + err = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_PS_REG, 2, &value[0]); + + err = stk3x1x_i2c_read_data(ps_data->client, 0x24, 4, &value[0]); + if(err < 0) + { + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, err); + return err; + } + *ges0 = (value[0]<<8) | value[1]; + *ges1 = (value[2]<<8) | value[3]; + //printk(KERN_INFO "%s: ges=%d,%d\n",__func__, *ges0, *ges1); + return 0; +} +#endif + +static int32_t stk3x1x_enable_ges(struct stk3x1x_data *ps_data, uint8_t enable, uint8_t mode) +{ + int32_t ret; + uint8_t w_state_reg, gsctrl_reg; + uint8_t org_mode = 0; + + if(ps_data->ps_enabled) + { + printk(KERN_INFO "%s: since PS is enabled, ges is disabled\n", __func__); + ps_data->re_enable_ges = enable; + return 0; + } + + if(enable == ps_data->ges_enabled) + return 0; + + if(enable) + { +#ifdef STK_QUALCOMM_POWER_CTRL + ret = stk3x1x_device_ctl(ps_data, enable); + if (ret) + return ret; +#endif + if(ps_data->als_enabled) + { + printk(KERN_INFO "%s: force disable ALS\n", __func__); + stk3x1x_enable_als(ps_data, 0); + ps_data->re_enable_als = true; + } + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_WAIT_REG, 0); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_INT_REG, 0); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + w_state_reg = STK_STATE_EN_WAIT_MASK | STK_STATE_EN_PS_MASK; + ret = stk3x1x_set_state(ps_data, w_state_reg); + if(ret < 0) + return ret; + ps_data->state_reg = w_state_reg; + + if(mode == 2) + { + ret = stk3x1x_get_gsctrl(ps_data); + if(ret < 0) + return ret; + gsctrl_reg = ret & 0xF3; +#ifdef STK_POLL_PS + gsctrl_reg |= 0x04; +#else + gsctrl_reg |= 0x0C; +#endif + ret = stk3x1x_set_gsctrl(ps_data, gsctrl_reg); + if(ret < 0) + return ret; +#ifdef STK_POLL_PS + hrtimer_start(&ps_data->ps_timer, ps_data->ps_poll_delay, HRTIMER_MODE_REL); +#else + enable_irq(ps_data->irq); +#endif + } + ps_data->ges_enabled = mode; + } + else + { + org_mode = ps_data->ges_enabled; + if(org_mode == 2) + { +#ifdef STK_POLL_PS + hrtimer_cancel(&ps_data->ps_timer); + cancel_work_sync(&ps_data->stk_ps_work); +#else + disable_irq(ps_data->irq); +#endif + } + + ret = stk3x1x_set_state(ps_data, 0); + if(ret < 0) + return ret; + ps_data->state_reg = 0; + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_WAIT_REG, ps_data->wait_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_INT_REG, ps_data->int_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + if(org_mode == 2) + { + ret = stk3x1x_get_gsctrl(ps_data); + if(ret < 0) + return ret; + gsctrl_reg = ret & (~0x0C); + ret = stk3x1x_set_gsctrl(ps_data, gsctrl_reg); + if(ret < 0) + return ret; + } + ps_data->ges_enabled = 0; + if(ps_data->re_enable_als) + { + printk(KERN_INFO "%s: re-enable ALS\n", __func__); + stk3x1x_enable_als(ps_data, 1); + ps_data->re_enable_als = false; + } +#ifdef STK_QUALCOMM_POWER_CTRL + ret = stk3x1x_device_ctl(ps_data, enable); + if (ret) + return ret; +#endif + } + + return 0; +} +#endif /* #ifdef STK_GES */ + +static int32_t stk3x1x_enable_ps(struct stk3x1x_data *ps_data, uint8_t enable, uint8_t validate_reg) +{ + int32_t ret; + uint8_t w_state_reg; + uint8_t curr_ps_enable; + uint32_t reading; + int32_t near_far_state; + +#ifdef STK_QUALCOMM_POWER_CTRL + if (enable) { + ret = stk3x1x_device_ctl(ps_data, enable); + if (ret) + return ret; + } +#endif + +#ifdef STK_CHK_REG + if(validate_reg) + { + ret = stk3x1x_validate_n_handle(ps_data->client); + if(ret < 0) + printk(KERN_ERR "stk3x1x_validate_n_handle fail: %d\n", ret); + } +#endif /* #ifdef STK_CHK_REG */ + +#ifdef STK_GES + if(ps_data->ges_enabled && enable) + { + printk(KERN_INFO "%s: force disable ges\n", __func__); + stk3x1x_enable_ges(ps_data, 0, 1); + ps_data->re_enable_ges = 1; + } +#endif + curr_ps_enable = ps_data->ps_enabled?1:0; + if(curr_ps_enable == enable) + return 0; + +#ifdef STK_TUNE0 + if (!(ps_data->psi_set) && !enable) + { + hrtimer_cancel(&ps_data->ps_tune0_timer); + cancel_work_sync(&ps_data->stk_ps_tune0_work); + } +#endif + if(ps_data->first_boot == true) + { + ps_data->first_boot = false; + } + + ret = stk3x1x_get_state(ps_data); + if(ret < 0) + return ret; + w_state_reg = ret; + + + w_state_reg &= ~(STK_STATE_EN_PS_MASK | STK_STATE_EN_WAIT_MASK | STK_STATE_EN_AK_MASK); + if(enable) + { + w_state_reg |= STK_STATE_EN_PS_MASK; + if(!(ps_data->als_enabled)) + w_state_reg |= STK_STATE_EN_WAIT_MASK; + } + ret = stk3x1x_set_state(ps_data, w_state_reg); + if(ret < 0) + return ret; + ps_data->state_reg = w_state_reg; + + if(enable) + { +#ifdef STK_TUNE0 + #ifdef CALI_PS_EVERY_TIME + ps_data->psi_set = 0; + ps_data->psa = 0; + ps_data->psi = 0xFFFF; + #ifndef QUALCOMM_PLATFORM + ps_data->ps_thd_h = ps_data->ps_high_thd_boot; + ps_data->ps_thd_l = ps_data->ps_low_thd_boot; + #endif + hrtimer_start(&ps_data->ps_tune0_timer, ps_data->ps_tune0_delay, HRTIMER_MODE_REL); + #else + + if (!(ps_data->psi_set)) + hrtimer_start(&ps_data->ps_tune0_timer, ps_data->ps_tune0_delay, HRTIMER_MODE_REL); + #endif /* #ifdef CALI_PS_EVERY_TIME */ + stk3x1x_set_ps_thd_h(ps_data, ps_data->ps_thd_h); + stk3x1x_set_ps_thd_l(ps_data, ps_data->ps_thd_l); +#endif + printk(KERN_INFO "%s: HT=%d,LT=%d\n", __func__, ps_data->ps_thd_h, ps_data->ps_thd_l); +#ifdef STK_POLL_PS + hrtimer_start(&ps_data->ps_timer, ps_data->ps_poll_delay, HRTIMER_MODE_REL); + ps_data->ps_distance_last = -1; +#endif +#ifndef STK_POLL_PS + #ifndef STK_POLL_ALS + if(!(ps_data->als_enabled)) + #endif /* #ifndef STK_POLL_ALS */ + enable_irq(ps_data->irq); +#endif /* #ifndef STK_POLL_PS */ + ps_data->ps_enabled = true; +#ifdef STK_CHK_REG + if(!validate_reg) + { + ps_data->ps_distance_last = 1; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, 1); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); + reading = stk3x1x_get_ps_reading(ps_data); + printk(KERN_INFO "%s: force report ps input event=1, ps code = %d\n",__func__, reading); + } + else +#endif /* #ifdef STK_CHK_REG */ + { + usleep_range(4000, 5000); + ret = stk3x1x_get_flag(ps_data); + if (ret < 0) + return ret; + near_far_state = ret & STK_FLG_NF_MASK; + ps_data->ps_distance_last = near_far_state; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, near_far_state); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); + reading = stk3x1x_get_ps_reading(ps_data); + printk(KERN_INFO "%s: ps input event=%d, ps code = %d\n",__func__, near_far_state, reading); + } + } + else + { +#ifdef STK_POLL_PS + hrtimer_cancel(&ps_data->ps_timer); + cancel_work_sync(&ps_data->stk_ps_work); +#else +#ifndef STK_POLL_ALS + if(!(ps_data->als_enabled)) +#endif + disable_irq(ps_data->irq); +#endif + ps_data->ps_enabled = false; +#ifdef STK_GES + if(ps_data->re_enable_ges) + { + printk(KERN_INFO "%s: re-enable ges\n", __func__); + stk3x1x_enable_ges(ps_data, 1, 1); + ps_data->re_enable_ges = 0; + } +#endif +#ifdef STK_QUALCOMM_POWER_CTRL + ret = stk3x1x_device_ctl(ps_data, enable); + if (ret) + return ret; +#endif + } + return ret; +} + +static int32_t stk3x1x_enable_als(struct stk3x1x_data *ps_data, uint8_t enable) +{ + int32_t ret; + uint8_t w_state_reg; + uint8_t curr_als_enable = (ps_data->als_enabled)?1:0; + +#ifdef STK_GES + if(ps_data->ges_enabled) + { + printk(KERN_INFO "%s: since ges is enabled, ALS is disabled\n", __func__); + ps_data->re_enable_als = enable ? true : false; + return 0; + } +#endif /* #ifdef STK_GES */ + if(curr_als_enable == enable) + return 0; +#ifdef STK_QUALCOMM_POWER_CTRL + if (enable) { + ret = stk3x1x_device_ctl(ps_data, enable); + if (ret) + return ret; + } +#endif +#ifndef STK_POLL_ALS + #ifdef STK_IRS + if(enable && !(ps_data->ps_enabled)) + { + ret = stk3x1x_get_ir_reading(ps_data, STK_IRS_IT_REDUCE ); + if(ret > 0) + ps_data->ir_code = ret; + } + #endif + + if (enable) + { + stk3x1x_set_als_thd_h(ps_data, 0x0000); + stk3x1x_set_als_thd_l(ps_data, 0xFFFF); + } +#endif + + ret = stk3x1x_get_state(ps_data); + if(ret < 0) + return ret; + + w_state_reg = (uint8_t)(ret & (~(STK_STATE_EN_ALS_MASK | STK_STATE_EN_WAIT_MASK))); + if(enable) + w_state_reg |= STK_STATE_EN_ALS_MASK; + else if (ps_data->ps_enabled) + w_state_reg |= STK_STATE_EN_WAIT_MASK; + + ret = stk3x1x_set_state(ps_data, w_state_reg); + if(ret < 0) + return ret; + ps_data->state_reg = w_state_reg; + + if (enable) + { + ps_data->als_enabled = true; +#ifdef STK_POLL_ALS + hrtimer_start(&ps_data->als_timer, ps_data->als_poll_delay, HRTIMER_MODE_REL); +#else +#ifndef STK_POLL_PS + if(!(ps_data->ps_enabled)) +#endif + enable_irq(ps_data->irq); +#endif +#ifdef STK_IRS + ps_data->als_data_index = 0; +#endif + } + else + { + ps_data->als_enabled = false; +#ifdef STK_POLL_ALS + hrtimer_cancel(&ps_data->als_timer); + cancel_work_sync(&ps_data->stk_als_work); +#else +#ifndef STK_POLL_PS + if(!(ps_data->ps_enabled)) +#endif + disable_irq(ps_data->irq); +#endif +#ifdef STK_QUALCOMM_POWER_CTRL + ret = stk3x1x_device_ctl(ps_data, enable); + if (ret) + return ret; +#endif + } + return ret; +} + +static int32_t stk3x1x_get_als_reading(struct stk3x1x_data *ps_data) +{ + int32_t als_data, ir_data = 0; +#ifdef STK_ALS_FIR + int index; + int firlen = atomic_read(&ps_data->firlength); +#endif + unsigned char value[2]; + int ret; + const int ir_enlarge = 1 << (STK_ALS_READ_IRS_IT_REDUCE - STK_IRS_IT_REDUCE); + + ret = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_ALS_REG, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + als_data = (value[0]<<8) | value[1]; + // printk("%s: raw als_data=%d\n", __func__, als_data); + if(ps_data->p_wv_r_bd_with_co & 0b010) + { + if(als_data < STK_ALS_THRESHOLD && ps_data->als_code_last > 10000) + { + ir_data = stk3x1x_get_ir_reading(ps_data, STK_ALS_READ_IRS_IT_REDUCE); +#ifdef STK_IRS + if(ir_data > 0) + ps_data->ir_code = ir_data * ir_enlarge; +#endif + // printk(KERN_INFO "%s: als_data=%d, als_code_last=%d,ir_data=%d\n", + // __func__, als_data, ps_data->als_code_last, ir_data); + if(ir_data > (STK_ALS_THRESHOLD*3)) + { + als_data = ps_data->als_code_last; + } + } +#ifdef STK_IRS + else + { + ps_data->ir_code = 0; + } +#endif + } + + ps_data->als_code_last = als_data; + +#ifdef STK_ALS_FIR + if(ps_data->fir.number < firlen) + { + ps_data->fir.raw[ps_data->fir.number] = als_data; + ps_data->fir.sum += als_data; + ps_data->fir.number++; + ps_data->fir.idx++; + } + else + { + index = ps_data->fir.idx % firlen; + ps_data->fir.sum -= ps_data->fir.raw[index]; + ps_data->fir.raw[index] = als_data; + ps_data->fir.sum += als_data; + ps_data->fir.idx++; + als_data = ps_data->fir.sum/firlen; + } +#endif + + return als_data; +} + + +#if (defined(STK_IRS) && defined(STK_POLL_ALS)) +static int stk_als_ir_skip_als(struct stk3x1x_data *ps_data) +{ + int ret; + unsigned char value[2]; + + if(ps_data->als_data_index < 60000) + ps_data->als_data_index++; + else + ps_data->als_data_index = 0; + + if( ps_data->als_data_index % 10 == 1) + { + ret = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_ALS_REG, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + return 1; + } + return 0; +} + +static void stk_als_ir_get_corr(struct stk3x1x_data *ps_data, int32_t als) +{ + int32_t als_comperator; + + if(ps_data->ir_code) + { + ps_data->als_correct_factor = 1000; + if(als < STK_IRC_MAX_ALS_CODE && als > STK_IRC_MIN_ALS_CODE && + ps_data->ir_code > STK_IRC_MIN_IR_CODE) + { + als_comperator = als * STK_IRC_ALS_NUMERA / STK_IRC_ALS_DENOMI; + if(ps_data->ir_code > als_comperator) + ps_data->als_correct_factor = STK_IRC_ALS_CORREC; + } +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: als=%d, ir=%d, als_correct_factor=%d", __func__, + als, ps_data->ir_code, ps_data->als_correct_factor); +#endif + ps_data->ir_code = 0; + } + return; +} + +static int stk_als_ir_run(struct stk3x1x_data *ps_data) +{ + int ret; + + if( ps_data->als_data_index % 10 == 0) + { + if(ps_data->ps_distance_last != 0 && ps_data->ir_code == 0) + { + ret = stk3x1x_get_ir_reading(ps_data, STK_IRS_IT_REDUCE); + if(ret > 0) + ps_data->ir_code = ret; + } + return ret; + } + return 0; +} +#endif /* #if (defined(STK_IRS) && defined(STK_POLL_ALS)) */ + + +static int32_t stk3x1x_set_irs_it_slp(struct stk3x1x_data *ps_data, uint16_t *slp_time, int32_t ials_it_reduce) +{ + uint8_t irs_alsctrl; + int32_t ret; + + irs_alsctrl = (ps_data->alsctrl_reg & 0x0F) - ials_it_reduce; + switch(irs_alsctrl) + { + case 2: + *slp_time = 1; + break; + case 3: + *slp_time = 2; + break; + case 4: + *slp_time = 3; + break; + case 5: + *slp_time = 6; + break; + case 6: + *slp_time = 12; + break; + case 7: + *slp_time = 24; + break; + case 8: + *slp_time = 48; + break; + case 9: + *slp_time = 96; + break; + case 10: + *slp_time = 192; + break; + default: + printk(KERN_ERR "%s: unknown ALS IT=0x%x\n", __func__, irs_alsctrl); + ret = -EINVAL; + return ret; + } + irs_alsctrl |= (ps_data->alsctrl_reg & 0xF0); + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_ALSCTRL_REG, irs_alsctrl); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + return 0; +} + +static int32_t stk3x1x_get_ir_reading(struct stk3x1x_data *ps_data, int32_t als_it_reduce) +{ + int32_t word_data, ret; + uint8_t w_reg, retry = 0; + uint16_t irs_slp_time = 100; + unsigned char value[2]; + + ret = stk3x1x_set_irs_it_slp(ps_data, &irs_slp_time, als_it_reduce); + if(ret < 0) + goto irs_err_i2c_rw; + + ret = stk3x1x_get_state(ps_data); + if(ret < 0) + goto irs_err_i2c_rw; + + w_reg = ret | STK_STATE_EN_IRS_MASK; + ret = stk3x1x_set_state(ps_data, w_reg); + if(ret < 0) + goto irs_err_i2c_rw; + msleep(irs_slp_time); + + do + { + usleep_range(3000, 4000); + ret = stk3x1x_get_flag(ps_data); + if (ret < 0) + goto irs_err_i2c_rw; + retry++; + }while(retry < 10 && ((ret&STK_FLG_IR_RDY_MASK) == 0)); + + if(retry == 10) + { + printk(KERN_ERR "%s: ir data is not ready for a long time\n", __func__); + ret = -EINVAL; + goto irs_err_i2c_rw; + } + + ret = stk3x1x_set_flag(ps_data, ret, STK_FLG_IR_RDY_MASK); + if (ret < 0) + goto irs_err_i2c_rw; + + ret = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_IR_REG, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + goto irs_err_i2c_rw; + } + word_data = ((value[0]<<8) | value[1]); + //printk(KERN_INFO "%s: ir=%d\n", __func__, word_data); + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_ALSCTRL_REG, ps_data->alsctrl_reg ); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + goto irs_err_i2c_rw; + } + + return word_data; + +irs_err_i2c_rw: + return ret; +} + +#ifdef STK_CHK_REG +static int stk3x1x_chk_reg_valid(struct stk3x1x_data *ps_data) +{ + unsigned char value[9]; + int err; + /* + uint8_t cnt; + + for(cnt=0;cnt<9;cnt++) + { + value[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, (cnt+1)); + if(value[cnt] < 0) + { + printk(KERN_ERR "%s fail, ret=%d", __func__, value[cnt]); + return value[cnt]; + } + } + */ + err = stk3x1x_i2c_read_data(ps_data->client, STK_PSCTRL_REG, 9, &value[0]); + if(err < 0) + { + printk(KERN_ERR "%s: fail, ret=%d\n", __func__, err); + return err; + } + + if(value[0] != ps_data->psctrl_reg) + { + printk(KERN_ERR "%s: invalid reg 0x01=0x%2x\n", __func__, value[0]); + return 0xFF; + } +#ifdef STK_IRS + if((value[1] != ps_data->alsctrl_reg) && (value[1] != (ps_data->alsctrl_reg - STK_IRS_IT_REDUCE)) + && (value[1] != (ps_data->alsctrl_reg - STK_ALS_READ_IRS_IT_REDUCE))) +#else + if((value[1] != ps_data->alsctrl_reg) && (value[1] != (ps_data->alsctrl_reg - STK_ALS_READ_IRS_IT_REDUCE))) +#endif + { + printk(KERN_ERR "%s: invalid reg 0x02=0x%2x\n", __func__, value[1]); + return 0xFF; + } + if(value[2] != ps_data->ledctrl_reg) + { + printk(KERN_ERR "%s: invalid reg 0x03=0x%2x\n", __func__, value[2]); + return 0xFF; + } + if(value[3] != ps_data->int_reg) + { + printk(KERN_ERR "%s: invalid reg 0x04=0x%2x\n", __func__, value[3]); + return 0xFF; + } + if(value[4] != ps_data->wait_reg) + { + printk(KERN_ERR "%s: invalid reg 0x05=0x%2x\n", __func__, value[4]); + return 0xFF; + } + if(value[5] != ((ps_data->ps_thd_h & 0xFF00) >> 8)) + { + printk(KERN_ERR "%s: invalid reg 0x06=0x%2x\n", __func__, value[5]); + return 0xFF; + } + if(value[6] != (ps_data->ps_thd_h & 0x00FF)) + { + printk(KERN_ERR "%s: invalid reg 0x07=0x%2x\n", __func__, value[6]); + return 0xFF; + } + if(value[7] != ((ps_data->ps_thd_l & 0xFF00) >> 8)) + { + printk(KERN_ERR "%s: invalid reg 0x08=0x%2x\n", __func__, value[7]); + return 0xFF; + } + if(value[8] != (ps_data->ps_thd_l & 0x00FF)) + { + printk(KERN_ERR "%s: invalid reg 0x09=0x%2x\n", __func__, value[8]); + return 0xFF; + } + + return 0; +} + +static int stk3x1x_validate_n_handle(struct i2c_client *client) +{ + struct stk3x1x_data *ps_data = i2c_get_clientdata(client); + int err; + + err = stk3x1x_chk_reg_valid(ps_data); + if(err < 0) + { + printk(KERN_ERR "stk3x1x_chk_reg_valid fail: %d\n", err); + return err; + } + + if(err == 0xFF) + { + printk(KERN_ERR "%s: Re-init chip\n", __func__); + err = stk3x1x_software_reset(ps_data); + if(err < 0) + return err; + err = stk3x1x_init_all_reg(ps_data); + if(err < 0) + return err; + + //ps_data->psa = 0; + //ps_data->psi = 0xFFFF; + stk3x1x_set_ps_thd_h(ps_data, ps_data->ps_thd_h); + stk3x1x_set_ps_thd_l(ps_data, ps_data->ps_thd_l); +#ifdef STK_ALS_FIR + memset(&ps_data->fir, 0x00, sizeof(ps_data->fir)); +#endif + return 0xFF; + } + return 0; +} +#endif /* #ifdef STK_CHK_REG */ + +static ssize_t stk_als_code_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t reading; +#ifdef STK_POLL_ALS + reading = ps_data->als_code_last; +#else + unsigned char value[2]; + int ret; + ret = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_ALS_REG, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + reading = (value[0]<<8) | value[1]; +#endif + return scnprintf(buf, PAGE_SIZE, "%d\n", reading); +} + + +static ssize_t stk_als_enable_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t ret; + + ret = stk3x1x_get_state(ps_data); + if(ret < 0) + return ret; + ret = (ret & STK_STATE_EN_ALS_MASK)?1:0; + + return scnprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t stk_als_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + uint8_t en; + if (sysfs_streq(buf, "1")) + en = 1; + else if (sysfs_streq(buf, "0")) + en = 0; + else + { + printk(KERN_ERR "%s, invalid value %d\n", __func__, *buf); + return -EINVAL; + } + printk(KERN_INFO "%s: Enable ALS : %d\n", __func__, en); + mutex_lock(&ps_data->io_lock); + stk3x1x_enable_als(ps_data, en); + mutex_unlock(&ps_data->io_lock); + return size; +} + +static ssize_t stk_als_lux_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t als_reading; + uint32_t als_lux; + als_reading = stk3x1x_get_als_reading(ps_data); + als_lux = stk_alscode2lux(ps_data, als_reading); + return scnprintf(buf, PAGE_SIZE, "%d lux\n", als_lux); +} + +static ssize_t stk_als_lux_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + ret = kstrtoul(buf, 16, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + ps_data->als_lux_last = value; + input_report_abs(ps_data->als_input_dev, ABS_MISC, value); + input_sync(ps_data->als_input_dev); + printk(KERN_INFO "%s: als input event %ld lux\n",__func__, value); + + return size; +} + + +static ssize_t stk_als_transmittance_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t transmittance; + transmittance = ps_data->als_transmittance; + return scnprintf(buf, PAGE_SIZE, "%d\n", transmittance); +} + + +static ssize_t stk_als_transmittance_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + ret = kstrtoul(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + ps_data->als_transmittance = value; + return size; +} + +static ssize_t stk_als_delay_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int64_t delay; + mutex_lock(&ps_data->io_lock); + delay = ktime_to_ns(ps_data->als_poll_delay); + mutex_unlock(&ps_data->io_lock); + return scnprintf(buf, PAGE_SIZE, "%lld\n", delay); +} + + +static ssize_t stk_als_delay_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + uint64_t value = 0; + int ret; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + ret = kstrtoull(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoull failed, ret=0x%x\n", __func__, ret); + return ret; + } +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: set als poll delay=%lld\n", __func__, value); +#endif + if(value < MIN_ALS_POLL_DELAY_NS) + { + printk(KERN_ERR "%s: delay is too small\n", __func__); + value = MIN_ALS_POLL_DELAY_NS; + } + mutex_lock(&ps_data->io_lock); + if(value != ktime_to_ns(ps_data->als_poll_delay)) + ps_data->als_poll_delay = ns_to_ktime(value); +#ifdef STK_ALS_FIR + ps_data->fir.number = 0; + ps_data->fir.idx = 0; + ps_data->fir.sum = 0; +#endif + mutex_unlock(&ps_data->io_lock); + return size; +} + +static ssize_t stk_als_ir_code_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t reading; + reading = stk3x1x_get_ir_reading(ps_data, STK_IRS_IT_REDUCE); + return scnprintf(buf, PAGE_SIZE, "%d\n", reading); +} + +#ifdef STK_ALS_FIR +static ssize_t stk_als_firlen_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int len = atomic_read(&ps_data->firlength); + + printk(KERN_INFO "%s: len = %2d, idx = %2d\n", __func__, len, ps_data->fir.idx); + printk(KERN_INFO "%s: sum = %5d, ave = %5d\n", __func__, ps_data->fir.sum, ps_data->fir.sum/len); + + return scnprintf(buf, PAGE_SIZE, "%d\n", len); +} + + +static ssize_t stk_als_firlen_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + uint64_t value = 0; + int ret; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + ret = kstrtoull(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoull failed, ret=0x%x\n", __func__, ret); + return ret; + } + + if(value > MAX_FIR_LEN) + { + printk(KERN_ERR "%s: firlen exceed maximum filter length\n", __func__); + } + else if (value < 1) + { + atomic_set(&ps_data->firlength, 1); + memset(&ps_data->fir, 0x00, sizeof(ps_data->fir)); + } + else + { + atomic_set(&ps_data->firlength, value); + memset(&ps_data->fir, 0x00, sizeof(ps_data->fir)); + } + return size; +} +#endif /* #ifdef STK_ALS_FIR */ + +#ifdef STK_GES +static ssize_t stk_ges_code_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int ret; + unsigned int gest0 = 0, gest1 = 0, gest2 = 0; + + if(!ps_data->ges_enabled) + return 0; + + ret = stk3x1x_get_ges_reading(ps_data, &gest0, &gest1, &gest2); + if(ret < 0) + return ret; + else if(ret == 0xFFFF) + atomic_set(&ps_data->gesture2, 0); + + return scnprintf(buf, PAGE_SIZE, "%5d,%5d,%5d\n", gest0, gest1, atomic_read(&ps_data->gesture2)); +} + +static ssize_t stk_ges_code_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + uint8_t ges; + unsigned long value = 0; + int ret; + + ret = kstrtoul(buf, 16, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=%d\n", __func__, ret); + return ret; + } + + switch(value) + { + case 3: + //printk(KERN_INFO "%s: ges input event, not detected\n",__func__); + case 0: + return size; + case 1: + ges = KEY_PAGEUP; + atomic_set(&ps_data->gesture2, 0); + printk(KERN_INFO "%s: ges input event >>>\n",__func__); + break; + case 2: + ges = KEY_PAGEDOWN; + atomic_set(&ps_data->gesture2, 0); + printk(KERN_INFO "%s: ges input event <<<\n",__func__); + break; + case 32: + ges = KEY_VOLUMEDOWN; + printk(KERN_INFO "%s: ges input event near\n",__func__); + break; + case 48: + ges = KEY_VOLUMEUP; + printk(KERN_INFO "%s: ges input event far\n",__func__); + break; + default: + printk(KERN_ERR "%s, invalid value %d\n", __func__, (int)value); + return -EINVAL; + } + + input_report_key(ps_data->ges_input_dev, ges, 1); + input_report_key(ps_data->ges_input_dev, ges, 0); + input_sync(ps_data->ges_input_dev); + return size; +} + +static ssize_t stk_ges_poll_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int len = 0, ii = 0, jj = 0; + + while(stk_ges_op[ii].ops[0] != 0) + { + len += scnprintf(buf + len, PAGE_SIZE - len, "%x ", ii); + for(jj=0;jj<4;jj++) + len += scnprintf(buf + len, PAGE_SIZE - len, "%x ", stk_ges_op[ii].ops[jj]); + len += scnprintf(buf + len, PAGE_SIZE - len, "\n"); + ii++; + } + return len; +} + + +static ssize_t stk_ges_poll_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + int32_t ret, i = 0, index = 0; + char *token; + unsigned long value = 0; + + while(buf != '\0') + { + token = strsep((char **)&buf, " "); + if((ret = kstrtoul(token, 16, &value)) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + + if(i == 0) + { + if(value >= 10) + { + memset(stk_ges_op, 0, sizeof(stk_ges_op)); + break; + } + else + index = value; + } + else + { + stk_ges_op[index].ops[i-1] = value; + } + i++; + if(i == 5) + break; + } + if(i != 5) + { + printk(KERN_ERR "%s: invalid length(%d)\n", __func__, i); + memset(&(stk_ges_op[index]), 0, sizeof(union stk_ges_operation)); + } + return size; +} + +static ssize_t stk_ges_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + + ret = kstrtoul(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=%d\n", __func__, ret); + return ret; + } + printk(KERN_INFO "%s: Enable GES : %d\n", __func__, (int)value); + + switch(value) + { + case 0: + mutex_lock(&ps_data->io_lock); + if(ps_data->ges_enabled == 1) + stk3x1x_enable_ges(ps_data, 0, 1); + else + stk3x1x_enable_ges(ps_data, 0, 2); + mutex_unlock(&ps_data->io_lock); + break; + case 1: + mutex_lock(&ps_data->io_lock); + stk3x1x_enable_ges(ps_data, 1, 1); + mutex_unlock(&ps_data->io_lock); + break; + case 2: + mutex_lock(&ps_data->io_lock); + stk3x1x_enable_ges(ps_data, 1, 2); + mutex_unlock(&ps_data->io_lock); + break; + default: + printk(KERN_ERR "%s, invalid value %d\n", __func__, *buf); + return -EINVAL; + break; + } + + return size; +} + +static ssize_t stk_ges_enable_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + return scnprintf(buf, PAGE_SIZE, "%d\n", ps_data->ges_enabled); +} + +#endif /* #ifdef STK_GES */ + +static ssize_t stk_ps_code_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + uint32_t reading; + reading = stk3x1x_get_ps_reading(ps_data); + return scnprintf(buf, PAGE_SIZE, "%d\n", reading); +} + +static ssize_t stk_ps_enable_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int32_t ret; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + + ret = stk3x1x_get_state(ps_data); + if(ret < 0) + return ret; + ret = (ret & STK_STATE_EN_PS_MASK)?1:0; + + return scnprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t stk_ps_enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + uint8_t en; + if (sysfs_streq(buf, "1")) + en = 1; + else if (sysfs_streq(buf, "0")) + en = 0; + else + { + printk(KERN_ERR "%s, invalid value %d\n", __func__, *buf); + return -EINVAL; + } + printk(KERN_INFO "%s: Enable PS : %d\n", __func__, en); + mutex_lock(&ps_data->io_lock); + stk3x1x_enable_ps(ps_data, en, 1); + mutex_unlock(&ps_data->io_lock); + return size; +} + +static ssize_t stk_ps_enable_aso_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int32_t ret; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_STATE_REG); + ret = (ret & STK_STATE_EN_ASO_MASK)?1:0; + + return scnprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t stk_ps_enable_aso_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + uint8_t en; + int32_t ret; + uint8_t w_state_reg; + + if (sysfs_streq(buf, "1")) + en = 1; + else if (sysfs_streq(buf, "0")) + en = 0; + else + { + printk(KERN_ERR "%s, invalid value %d\n", __func__, *buf); + return -EINVAL; + } + printk(KERN_INFO "%s: Enable PS ASO : %d\n", __func__, en); + + ret = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, STK_STATE_REG); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + w_state_reg = (uint8_t)(ret & (~STK_STATE_EN_ASO_MASK)); + if(en) + w_state_reg |= STK_STATE_EN_ASO_MASK; + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_STATE_REG, w_state_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + return size; +} + + +static ssize_t stk_ps_offset_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t word_data; + unsigned char value[2]; + int ret; + + ret = stk3x1x_i2c_read_data(ps_data->client, STK_DATA1_OFFSET_REG, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + word_data = (value[0]<<8) | value[1]; + + return scnprintf(buf, PAGE_SIZE, "%d\n", word_data); +} + +static ssize_t stk_ps_offset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long offset = 0; + int ret; + unsigned char val[2]; + + ret = kstrtoul(buf, 10, &offset); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + if(offset > 65535) + { + printk(KERN_ERR "%s: invalid value, offset=%ld\n", __func__, offset); + return -EINVAL; + } + + val[0] = (offset & 0xFF00) >> 8; + val[1] = offset & 0x00FF; + ret = stk3x1x_i2c_write_data(ps_data->client, STK_DATA1_OFFSET_REG, 2, val); + if(ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + return size; +} + + +static ssize_t stk_ps_distance_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t dist=1, ret; + + ret = stk3x1x_get_flag(ps_data); + if(ret < 0) + return ret; + dist = (ret & STK_FLG_NF_MASK)?1:0; + + ps_data->ps_distance_last = dist; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, dist); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); + printk(KERN_INFO "%s: ps input event %d cm\n",__func__, dist); + return scnprintf(buf, PAGE_SIZE, "%d\n", dist); +} + + +static ssize_t stk_ps_distance_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + ret = kstrtoul(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + ps_data->ps_distance_last = value; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, value); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); + printk(KERN_INFO "%s: ps input event %ld cm\n",__func__, value); + return size; +} + + +static ssize_t stk_ps_code_thd_l_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int32_t ps_thd_l1_reg, ps_thd_l2_reg; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + ps_thd_l1_reg = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_THDL1_PS_REG); + if(ps_thd_l1_reg < 0) + { + printk(KERN_ERR "%s fail, err=0x%x", __func__, ps_thd_l1_reg); + return -EINVAL; + } + ps_thd_l2_reg = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_THDL2_PS_REG); + if(ps_thd_l2_reg < 0) + { + printk(KERN_ERR "%s fail, err=0x%x", __func__, ps_thd_l2_reg); + return -EINVAL; + } + ps_thd_l1_reg = ps_thd_l1_reg<<8 | ps_thd_l2_reg; + return scnprintf(buf, PAGE_SIZE, "%d\n", ps_thd_l1_reg); +} + + +static ssize_t stk_ps_code_thd_l_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + ret = kstrtoul(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + stk3x1x_set_ps_thd_l(ps_data, value); + return size; +} + +static ssize_t stk_ps_code_thd_h_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int32_t ps_thd_h1_reg, ps_thd_h2_reg; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + ps_thd_h1_reg = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_THDH1_PS_REG); + if(ps_thd_h1_reg < 0) + { + printk(KERN_ERR "%s fail, err=0x%x", __func__, ps_thd_h1_reg); + return -EINVAL; + } + ps_thd_h2_reg = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,STK_THDH2_PS_REG); + if(ps_thd_h2_reg < 0) + { + printk(KERN_ERR "%s fail, err=0x%x", __func__, ps_thd_h2_reg); + return -EINVAL; + } + ps_thd_h1_reg = ps_thd_h1_reg<<8 | ps_thd_h2_reg; + return scnprintf(buf, PAGE_SIZE, "%d\n", ps_thd_h1_reg); +} + + +static ssize_t stk_ps_code_thd_h_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + ret = kstrtoul(buf, 10, &value); + if(ret < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + stk3x1x_set_ps_thd_h(ps_data, value); + return size; +} + + +static ssize_t stk_all_reg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int32_t ps_reg[0x22]; + uint8_t cnt; + int len = 0; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + + for(cnt=0;cnt<0x20;cnt++) + { + ps_reg[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, (cnt)); + if(ps_reg[cnt] < 0) + { + printk(KERN_ERR "%s fail, ret=%d", __func__, ps_reg[cnt]); + return -EINVAL; + } + else + { + printk(KERN_INFO "reg[0x%2X]=0x%2X\n", cnt, ps_reg[cnt]); + len += scnprintf(buf+len, PAGE_SIZE-len, "[%2X]%2X,", cnt, ps_reg[cnt]); + } + } + ps_reg[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, STK_PDT_ID_REG); + if(ps_reg[cnt] < 0) + { + printk( KERN_ERR "%s fail, ret=%d", __func__, ps_reg[cnt]); + return -EINVAL; + } + printk( KERN_INFO "reg[0x%x]=0x%2X\n", STK_PDT_ID_REG, ps_reg[cnt]); + cnt++; + ps_reg[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, STK_RSRVD_REG); + if(ps_reg[cnt] < 0) + { + printk( KERN_ERR "%s fail, ret=%d", __func__, ps_reg[cnt]); + return -EINVAL; + } + printk( KERN_INFO "reg[0x%x]=0x%2X\n", STK_RSRVD_REG, ps_reg[cnt]); + len += scnprintf(buf+len, PAGE_SIZE-len, "[%2X]%2X,[%2X]%2X\n", cnt-1, ps_reg[cnt-1], cnt, ps_reg[cnt]); + return len; +/* + return scnprintf(buf, PAGE_SIZE, "[0]%2X [1]%2X [2]%2X [3]%2X [4]%2X [5]%2X [6/7 HTHD]%2X,%2X [8/9 LTHD]%2X, %2X [A]%2X [B]%2X [C]%2X [D]%2X [E/F Aoff]%2X,%2X,[10]%2X [11/12 PS]%2X,%2X [13]%2X [14]%2X [15/16 Foff]%2X,%2X [17]%2X [18]%2X [3E]%2X [3F]%2X\n", + ps_reg[0], ps_reg[1], ps_reg[2], ps_reg[3], ps_reg[4], ps_reg[5], ps_reg[6], ps_reg[7], ps_reg[8], + ps_reg[9], ps_reg[10], ps_reg[11], ps_reg[12], ps_reg[13], ps_reg[14], ps_reg[15], ps_reg[16], ps_reg[17], + ps_reg[18], ps_reg[19], ps_reg[20], ps_reg[21], ps_reg[22], ps_reg[23], ps_reg[24], ps_reg[25], ps_reg[26]); + */ +} + +static ssize_t stk_status_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int32_t ps_reg[27]; + uint8_t cnt; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + for(cnt=0;cnt<25;cnt++) + { + ps_reg[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, (cnt)); + if(ps_reg[cnt] < 0) + { + printk(KERN_ERR "%s fail, ret=%d", __func__, ps_reg[cnt]); + return -EINVAL; + } + else + { + printk(KERN_INFO "reg[0x%2X]=0x%2X\n", cnt, ps_reg[cnt]); + } + } + ps_reg[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, STK_PDT_ID_REG); + if(ps_reg[cnt] < 0) + { + printk( KERN_ERR "%s fail, ret=%d", __func__, ps_reg[cnt]); + return -EINVAL; + } + printk( KERN_INFO "reg[0x%x]=0x%2X\n", STK_PDT_ID_REG, ps_reg[cnt]); + cnt++; + ps_reg[cnt] = stk3x1x_i2c_smbus_read_byte_data(ps_data->client, STK_RSRVD_REG); + if(ps_reg[cnt] < 0) + { + printk( KERN_ERR "%s fail, ret=%d", __func__, ps_reg[cnt]); + return -EINVAL; + } + printk( KERN_INFO "reg[0x%x]=0x%2X\n", STK_RSRVD_REG, ps_reg[cnt]); + + return scnprintf(buf, PAGE_SIZE, "[PS=%2X] [ALS=%2X] [WAIT=0x%4Xms] [EN_ASO=%2X] [EN_AK=%2X] [NEAR/FAR=%2X] [FLAG_OUI=%2X] [FLAG_PSINT=%2X] [FLAG_ALSINT=%2X]\n", + ps_reg[0]&0x01,(ps_reg[0]&0x02)>>1,((ps_reg[0]&0x04)>>2)*ps_reg[5]*6,(ps_reg[0]&0x20)>>5, + (ps_reg[0]&0x40)>>6,ps_reg[16]&0x01,(ps_reg[16]&0x04)>>2,(ps_reg[16]&0x10)>>4,(ps_reg[16]&0x20)>>5); +} + +static ssize_t stk_recv_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + return scnprintf(buf, PAGE_SIZE, "0x%04X\n", atomic_read(&ps_data->recv_reg)); +} + + +static ssize_t stk_recv_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + unsigned long value = 0; + int ret; + int32_t recv_data; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + + if((ret = kstrtoul(buf, 16, &value)) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + recv_data = stk3x1x_i2c_smbus_read_byte_data(ps_data->client,value); +// printk("%s: reg 0x%x=0x%x\n", __func__, (int)value, recv_data); + atomic_set(&ps_data->recv_reg, recv_data); + return size; +} + + +static ssize_t stk_send_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return 0; +} + + +static ssize_t stk_send_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + int addr, cmd; + int32_t ret, i; + char *token[10]; + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + + for (i = 0; i < 2; i++) + token[i] = strsep((char **)&buf, " "); + if((ret = kstrtoul(token[0], 16, (unsigned long *)&(addr))) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + if((ret = kstrtoul(token[1], 16, (unsigned long *)&(cmd))) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + printk(KERN_INFO "%s: write reg 0x%x=0x%x\n", __func__, addr, cmd); + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, (unsigned char)addr, (unsigned char)cmd); + if (0 != ret) + { + printk(KERN_ERR "%s: stk3x1x_i2c_smbus_write_byte_data fail\n", __func__); + return ret; + } + + return size; +} + +#ifdef STK_TUNE0 + +static ssize_t stk_ps_cali_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + int32_t word_data; + unsigned char value[2]; + int ret; + + ret = stk3x1x_i2c_read_data(ps_data->client, 0x20, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + word_data = (value[0]<<8) | value[1]; + + ret = stk3x1x_i2c_read_data(ps_data->client, 0x22, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + word_data += ((value[0]<<8) | value[1]); + + printk("%s: psi_set=%d, psa=%d,psi=%d, word_data=%d\n", __func__, + ps_data->psi_set, ps_data->psa, ps_data->psi, word_data); +#ifdef CALI_PS_EVERY_TIME + printk("%s: boot HT=%d, LT=%d\n", __func__, ps_data->ps_high_thd_boot, ps_data->ps_low_thd_boot); +#endif + return 0; +} + +static ssize_t stk_ps_maxdiff_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + + if((ret = kstrtoul(buf, 10, &value)) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + ps_data->stk_max_min_diff = (int) value; + return size; +} + + +static ssize_t stk_ps_maxdiff_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + return scnprintf(buf, PAGE_SIZE, "%d\n", ps_data->stk_max_min_diff); +} + +static ssize_t stk_ps_ltnct_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + + if((ret = kstrtoul(buf, 10, &value)) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + ps_data->stk_lt_n_ct = (int) value; + return size; +} + +static ssize_t stk_ps_ltnct_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + return scnprintf(buf, PAGE_SIZE, "%d\n", ps_data->stk_lt_n_ct); +} + +static ssize_t stk_ps_htnct_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + unsigned long value = 0; + int ret; + + if((ret = kstrtoul(buf, 10, &value)) < 0) + { + printk(KERN_ERR "%s:kstrtoul failed, ret=0x%x\n", __func__, ret); + return ret; + } + ps_data->stk_ht_n_ct = (int) value; + return size; +} + +static ssize_t stk_ps_htnct_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); + return scnprintf(buf, PAGE_SIZE, "%d\n", ps_data->stk_ht_n_ct); +} +#endif /* #ifdef STK_TUNE0 */ + +static struct device_attribute als_enable_attribute = __ATTR(enable,0666,stk_als_enable_show,stk_als_enable_store); +static struct device_attribute als_lux_attribute = __ATTR(lux,0664,stk_als_lux_show,stk_als_lux_store); +static struct device_attribute als_code_attribute = __ATTR(code, 0444, stk_als_code_show, NULL); +static struct device_attribute als_transmittance_attribute = __ATTR(transmittance,0664,stk_als_transmittance_show,stk_als_transmittance_store); +static struct device_attribute als_poll_delay_attribute = __ATTR(delay,0664,stk_als_delay_show,stk_als_delay_store); +static struct device_attribute als_ir_code_attribute = __ATTR(ircode,0444,stk_als_ir_code_show,NULL); +#ifdef STK_ALS_FIR +static struct device_attribute als_firlen_attribute = __ATTR(firlen,0664,stk_als_firlen_show,stk_als_firlen_store); +#endif + +static struct attribute *stk_als_attrs [] = +{ + &als_enable_attribute.attr, + &als_lux_attribute.attr, + &als_code_attribute.attr, + &als_transmittance_attribute.attr, + &als_poll_delay_attribute.attr, + &als_ir_code_attribute.attr, +#ifdef STK_ALS_FIR + &als_firlen_attribute.attr, +#endif + NULL +}; + +static struct attribute_group stk_als_attribute_group = { +#ifndef QUALCOMM_PLATFORM + .name = "driver", +#endif + .attrs = stk_als_attrs, +}; + +#ifdef STK_GES +static struct device_attribute ges_enable_attribute = __ATTR(enable,0666,stk_ges_enable_show,stk_ges_enable_store); +static struct device_attribute ges_code_attribute = __ATTR(code, 0664, stk_ges_code_show, stk_ges_code_store); +static struct device_attribute ges_poll_attribute = __ATTR(poll, 0664, stk_ges_poll_show, stk_ges_poll_store); +static struct device_attribute ges_recv_attribute = __ATTR(recv,0664,stk_recv_show,stk_recv_store); +static struct device_attribute ges_send_attribute = __ATTR(send,0664,stk_send_show, stk_send_store); + +static struct attribute *stk_ges_attrs [] = +{ + &ges_enable_attribute.attr, + &ges_code_attribute.attr, + &ges_poll_attribute.attr, + &ges_recv_attribute.attr, + &ges_send_attribute.attr, + NULL +}; + +static struct attribute_group stk_ges_attribute_group = +{ + .name = "driver", + .attrs = stk_ges_attrs, +}; +#endif /* #ifdef STK_GES */ + +static struct device_attribute ps_enable_attribute = __ATTR(enable,0666,stk_ps_enable_show,stk_ps_enable_store); +static struct device_attribute ps_enable_aso_attribute = __ATTR(enableaso,0664,stk_ps_enable_aso_show,stk_ps_enable_aso_store); +static struct device_attribute ps_distance_attribute = __ATTR(distance,0664,stk_ps_distance_show, stk_ps_distance_store); +static struct device_attribute ps_offset_attribute = __ATTR(offset,0664,stk_ps_offset_show, stk_ps_offset_store); +static struct device_attribute ps_code_attribute = __ATTR(code, 0444, stk_ps_code_show, NULL); +static struct device_attribute ps_code_thd_l_attribute = __ATTR(codethdl,0664,stk_ps_code_thd_l_show,stk_ps_code_thd_l_store); +static struct device_attribute ps_code_thd_h_attribute = __ATTR(codethdh,0664,stk_ps_code_thd_h_show,stk_ps_code_thd_h_store); +static struct device_attribute ps_recv_attribute = __ATTR(recv,0664,stk_recv_show,stk_recv_store); +static struct device_attribute ps_send_attribute = __ATTR(send,0664,stk_send_show, stk_send_store); +static struct device_attribute all_reg_attribute = __ATTR(allreg, 0444, stk_all_reg_show, NULL); +static struct device_attribute status_attribute = __ATTR(status, 0444, stk_status_show, NULL); +#ifdef STK_TUNE0 +static struct device_attribute ps_cali_attribute = __ATTR(cali,0444,stk_ps_cali_show, NULL); +static struct device_attribute ps_maxdiff_attribute = __ATTR(maxdiff,0664,stk_ps_maxdiff_show, stk_ps_maxdiff_store); +static struct device_attribute ps_ltnct_attribute = __ATTR(ltnct,0664,stk_ps_ltnct_show, stk_ps_ltnct_store); +static struct device_attribute ps_htnct_attribute = __ATTR(htnct,0664,stk_ps_htnct_show, stk_ps_htnct_store); +#endif + +static struct attribute *stk_ps_attrs [] = +{ + &ps_enable_attribute.attr, + &ps_enable_aso_attribute.attr, + &ps_distance_attribute.attr, + &ps_offset_attribute.attr, + &ps_code_attribute.attr, + &ps_code_thd_l_attribute.attr, + &ps_code_thd_h_attribute.attr, + &ps_recv_attribute.attr, + &ps_send_attribute.attr, + &all_reg_attribute.attr, + &status_attribute.attr, +#ifdef STK_TUNE0 + &ps_cali_attribute.attr, + &ps_maxdiff_attribute.attr, + &ps_ltnct_attribute.attr, + &ps_htnct_attribute.attr, +#endif + NULL +}; + +static struct attribute_group stk_ps_attribute_group = { +#ifndef QUALCOMM_PLATFORM + .name = "driver", +#endif + .attrs = stk_ps_attrs, +}; + +static int stk_ps_val(struct stk3x1x_data *ps_data) +{ + int mode; + int32_t word_data, lii; + unsigned char value[4]; + int ret; + + ret = stk3x1x_i2c_read_data(ps_data->client, 0x20, 4, value); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + word_data = (value[0]<<8) | value[1]; + word_data += ((value[2]<<8) | value[3]); + + mode = (ps_data->psctrl_reg) & 0x3F; + if(mode == 0x30) + lii = 100; + else if (mode == 0x31) + lii = 200; + else if (mode == 0x32) + lii = 400; + else if (mode == 0x33) + lii = 800; + else + { + printk(KERN_ERR "%s: unsupported PS_IT(0x%x)\n", __func__, mode); + return -1; + } + + if(word_data > lii) + { + printk(KERN_INFO "%s: word_data=%d, lii=%d\n", __func__, word_data, lii); + return 0xFFFF; + } + return 0; +} + +#ifdef STK_TUNE0 + +static int stk_ps_tune_zero_final(struct stk3x1x_data *ps_data) +{ + int ret; + + ps_data->tune_zero_init_proc = false; + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_INT_REG, ps_data->int_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_STATE_REG, 0); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + if(ps_data->data_count == -1) + { + printk(KERN_INFO "%s: exceed limit\n", __func__); + hrtimer_cancel(&ps_data->ps_tune0_timer); + return 0; + } + + ps_data->psa = ps_data->ps_stat_data[0]; + ps_data->psi = ps_data->ps_stat_data[2]; + +#ifdef CALI_PS_EVERY_TIME + ps_data->ps_high_thd_boot = ps_data->ps_stat_data[1] + ps_data->stk_ht_n_ct*3; + ps_data->ps_low_thd_boot = ps_data->ps_stat_data[1] + ps_data->stk_lt_n_ct*3; + ps_data->ps_thd_h = ps_data->ps_high_thd_boot ; + ps_data->ps_thd_l = ps_data->ps_low_thd_boot ; +#else + ps_data->ps_thd_h = ps_data->ps_stat_data[1] + ps_data->stk_ht_n_ct; + ps_data->ps_thd_l = ps_data->ps_stat_data[1] + ps_data->stk_lt_n_ct; +#endif + stk3x1x_set_ps_thd_h(ps_data, ps_data->ps_thd_h); + stk3x1x_set_ps_thd_l(ps_data, ps_data->ps_thd_l); + printk(KERN_INFO "%s: set HT=%d,LT=%d\n", __func__, ps_data->ps_thd_h, ps_data->ps_thd_l); + hrtimer_cancel(&ps_data->ps_tune0_timer); + return 0; +} + +static int32_t stk_tune_zero_get_ps_data(struct stk3x1x_data *ps_data) +{ + uint32_t ps_adc; + int ret; + + ret = stk_ps_val(ps_data); + if(ret == 0xFFFF) + { + ps_data->data_count = -1; + stk_ps_tune_zero_final(ps_data); + return 0; + } + + ps_adc = stk3x1x_get_ps_reading(ps_data); + printk(KERN_INFO "%s: ps_adc #%d=%d\n", __func__, ps_data->data_count, ps_adc); + if(ps_adc < 0) + return ps_adc; + + ps_data->ps_stat_data[1] += ps_adc; + if(ps_adc > ps_data->ps_stat_data[0]) + ps_data->ps_stat_data[0] = ps_adc; + if(ps_adc < ps_data->ps_stat_data[2]) + ps_data->ps_stat_data[2] = ps_adc; + ps_data->data_count++; + + if(ps_data->data_count == 5) + { + ps_data->ps_stat_data[1] /= ps_data->data_count; + stk_ps_tune_zero_final(ps_data); + } + + return 0; +} +static int stk_ps_tune_zero_init(struct stk3x1x_data *ps_data) +{ + int32_t ret = 0; + uint8_t w_state_reg; + + ps_data->psi_set = 0; + ps_data->ps_stat_data[0] = 0; + ps_data->ps_stat_data[2] = 9999; + ps_data->ps_stat_data[1] = 0; + ps_data->data_count = 0; + + ps_data->tune_zero_init_proc = true; + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_INT_REG, 0); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + + w_state_reg = (STK_STATE_EN_PS_MASK | STK_STATE_EN_WAIT_MASK); + ret = stk3x1x_i2c_smbus_write_byte_data(ps_data->client, STK_STATE_REG, w_state_reg); + if (ret < 0) + { + printk(KERN_ERR "%s: write i2c error\n", __func__); + return ret; + } + hrtimer_start(&ps_data->ps_tune0_timer, ps_data->ps_tune0_delay, HRTIMER_MODE_REL); + + return 0; +} +static int stk_ps_tune_zero_func_fae(struct stk3x1x_data *ps_data) +{ + int32_t word_data; + int ret, diff; + unsigned char value[2]; + +#ifdef CALI_PS_EVERY_TIME + if(!(ps_data->ps_enabled)) +#else + if(ps_data->psi_set || !(ps_data->ps_enabled)) +#endif + { + return 0; + } + + ret = stk3x1x_get_flag(ps_data); + if(ret < 0) + return ret; + if(!(ret&STK_FLG_PSDR_MASK)) + { + //printk(KERN_INFO "%s: ps data is not ready yet\n", __func__); + return 0; + } + + ret = stk_ps_val(ps_data); + if(ret == 0) + { + ret = stk3x1x_i2c_read_data(ps_data->client, 0x11, 2, &value[0]); + if(ret < 0) + { + printk(KERN_ERR "%s fail, ret=0x%x", __func__, ret); + return ret; + } + word_data = (value[0]<<8) | value[1]; + //printk(KERN_INFO "%s: word_data=%d\n", __func__, word_data); + + if(word_data == 0) + { + //printk(KERN_ERR "%s: incorrect word data (0)\n", __func__); + return 0xFFFF; + } + + if(word_data > ps_data->psa) + { + ps_data->psa = word_data; + printk(KERN_INFO "%s: update psa: psa=%d,psi=%d\n", __func__, ps_data->psa, ps_data->psi); + } + if(word_data < ps_data->psi) + { + ps_data->psi = word_data; + printk(KERN_INFO "%s: update psi: psa=%d,psi=%d\n", __func__, ps_data->psa, ps_data->psi); + } + } + diff = ps_data->psa - ps_data->psi; + if(diff > ps_data->stk_max_min_diff) + { + ps_data->psi_set = ps_data->psi; + ps_data->ps_thd_h = ps_data->psi + ps_data->stk_ht_n_ct; + ps_data->ps_thd_l = ps_data->psi + ps_data->stk_lt_n_ct; + + +#ifdef CALI_PS_EVERY_TIME + if(ps_data->ps_thd_h > ps_data->ps_high_thd_boot) + { + ps_data->ps_high_thd_boot = ps_data->ps_thd_h; + ps_data->ps_low_thd_boot = ps_data->ps_thd_l; + printk(KERN_INFO "%s: update boot HT=%d, LT=%d\n", __func__, ps_data->ps_high_thd_boot, ps_data->ps_low_thd_boot); + } +#endif + + stk3x1x_set_ps_thd_h(ps_data, ps_data->ps_thd_h); + stk3x1x_set_ps_thd_l(ps_data, ps_data->ps_thd_l); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: FAE tune0 psa-psi(%d) > STK_DIFF found\n", __func__, diff); +#endif + hrtimer_cancel(&ps_data->ps_tune0_timer); + } + + return 0; +} + +static void stk_ps_tune0_work_func(struct work_struct *work) +{ + struct stk3x1x_data *ps_data = container_of(work, struct stk3x1x_data, stk_ps_tune0_work); + if(ps_data->tune_zero_init_proc) + stk_tune_zero_get_ps_data(ps_data); + else + stk_ps_tune_zero_func_fae(ps_data); + return; +} + + +static enum hrtimer_restart stk_ps_tune0_timer_func(struct hrtimer *timer) +{ + struct stk3x1x_data *ps_data = container_of(timer, struct stk3x1x_data, ps_tune0_timer); + queue_work(ps_data->stk_ps_tune0_wq, &ps_data->stk_ps_tune0_work); + hrtimer_forward_now(&ps_data->ps_tune0_timer, ps_data->ps_tune0_delay); + return HRTIMER_RESTART; +} +#endif + +#ifdef STK_POLL_ALS +static enum hrtimer_restart stk_als_timer_func(struct hrtimer *timer) +{ + struct stk3x1x_data *ps_data = container_of(timer, struct stk3x1x_data, als_timer); + queue_work(ps_data->stk_als_wq, &ps_data->stk_als_work); + hrtimer_forward_now(&ps_data->als_timer, ps_data->als_poll_delay); + return HRTIMER_RESTART; + +} + +static void stk_als_poll_work_func(struct work_struct *work) +{ + struct stk3x1x_data *ps_data = container_of(work, struct stk3x1x_data, stk_als_work); + int32_t reading = 0, reading_lux, flag_reg; +#ifdef STK_IRS + int ret; +#endif +#ifdef STK_GES + if(ps_data->ges_enabled) + { + input_report_abs(ps_data->als_input_dev, ABS_MISC, ps_data->als_lux_last); + input_sync(ps_data->als_input_dev); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: ges_enabled=1, als input event %d lux\n",__func__, ps_data->als_lux_last); + return; +#endif + } +#endif + + flag_reg = stk3x1x_get_flag(ps_data); + if(flag_reg < 0) + return; + if(!(flag_reg&STK_FLG_ALSDR_MASK)) + { + //printk(KERN_INFO "%s: als is not ready\n", __func__); + return; + } + +#ifdef STK_IRS + ret = stk_als_ir_skip_als(ps_data); + if(ret == 1) + return; +#endif + + reading = stk3x1x_get_als_reading(ps_data); + if(reading < 0) + return; + // printk("%s: als_data_index=%d, als_data=%d\n", __func__, ps_data->als_data_index, reading); +#ifdef STK_IRS + stk_als_ir_get_corr(ps_data, reading); + reading = reading * ps_data->als_correct_factor / 1000; +#endif + reading_lux = stk_alscode2lux(ps_data, reading); + if(abs(ps_data->als_lux_last - reading_lux) >= STK_ALS_CHANGE_THD) + { + ps_data->als_lux_last = reading_lux; + input_report_abs(ps_data->als_input_dev, ABS_MISC, reading_lux); + input_sync(ps_data->als_input_dev); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: als input event %d lux\n",__func__, reading_lux); +#endif + } + +#ifdef STK_IRS + stk_als_ir_run(ps_data); +#endif + return; +} +#endif /* #ifdef STK_POLL_ALS */ + + +#ifdef STK_POLL_PS +static enum hrtimer_restart stk_ps_timer_func(struct hrtimer *timer) +{ + struct stk3x1x_data *ps_data = container_of(timer, struct stk3x1x_data, ps_timer); + queue_work(ps_data->stk_ps_wq, &ps_data->stk_ps_work); + hrtimer_forward_now(&ps_data->ps_timer, ps_data->ps_poll_delay); + return HRTIMER_RESTART; +} + +static void stk_ps_poll_work_func(struct work_struct *work) +{ + struct stk3x1x_data *ps_data = container_of(work, struct stk3x1x_data, stk_ps_work); + uint32_t reading; + int32_t near_far_state; + uint8_t org_flag_reg; +#ifdef STK_GES + int32_t ret; + //uint8_t disable_flag = 0; + uint8_t disable_flag2 = 0, org_flag2_reg; + if(ps_data->ges_enabled == 2) + { + ret = stk3x1x_get_flag2(ps_data); + if(ret < 0) + goto err_i2c_rw; + org_flag2_reg = ret; + + disable_flag2 = org_flag2_reg & (STK_FLG2_INT_GS_MASK | + STK_FLG2_GS10_MASK | STK_FLG2_GS01_MASK); + if(org_flag2_reg & STK_FLG2_GS10_MASK) + { + printk(KERN_INFO "%s: >>>>>>>>>>>>\n", __func__); + } + if(org_flag2_reg & STK_FLG2_GS01_MASK) + { + printk(KERN_INFO "%s: <<<<<<<<<<<<\n", __func__); + } + atomic_set(&ps_data->gesture2, (disable_flag2 & + (STK_FLG2_GS10_MASK | STK_FLG2_GS01_MASK))); + + if(disable_flag2) + { + ret = stk3x1x_set_flag2(ps_data, org_flag2_reg, disable_flag2); + if(ret < 0) + goto err_i2c_rw; + } + } +#endif + + if(ps_data->ps_enabled) + { +#ifdef STK_TUNE0 + // if(!(ps_data->psi_set)) + // return; +#endif + org_flag_reg = stk3x1x_get_flag(ps_data); + if(org_flag_reg < 0) + goto err_i2c_rw; + + if(!(org_flag_reg&STK_FLG_PSDR_MASK)) + { + //printk(KERN_INFO "%s: ps is not ready\n", __func__); + return; + } + + near_far_state = (org_flag_reg & STK_FLG_NF_MASK)?1:0; + reading = stk3x1x_get_ps_reading(ps_data); + if(ps_data->ps_distance_last != near_far_state) + { + ps_data->ps_distance_last = near_far_state; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, near_far_state); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: ps input event %d cm, ps code = %d\n",__func__, near_far_state, reading); +#endif + } + // ret = stk3x1x_set_flag(ps_data, org_flag_reg, disable_flag); + // if(ret < 0) + // goto err_i2c_rw; + return; + } + +err_i2c_rw: + msleep(30); + return; +} +#endif + +#if (!defined(STK_POLL_PS) || !defined(STK_POLL_ALS)) +static void stk_work_func(struct work_struct *work) +{ + uint32_t reading; +#if ((STK_INT_PS_MODE != 0x03) && (STK_INT_PS_MODE != 0x02)) + int32_t ret; + uint8_t disable_flag = 0; + int32_t org_flag_reg; +#endif /* #if ((STK_INT_PS_MODE != 0x03) && (STK_INT_PS_MODE != 0x02)) */ + +#ifndef CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD + uint32_t nLuxIndex; +#endif + struct stk3x1x_data *ps_data = container_of(work, struct stk3x1x_data, stk_work); + int32_t near_far_state; + int32_t als_comperator; +#ifdef STK_GES + uint8_t disable_flag2 = 0, org_flag2_reg; +#endif + +#if (STK_INT_PS_MODE == 0x03) + near_far_state = gpio_get_value(ps_data->int_pin); +#elif (STK_INT_PS_MODE == 0x02) + near_far_state = !(gpio_get_value(ps_data->int_pin)); +#endif + +#if ((STK_INT_PS_MODE == 0x03) || (STK_INT_PS_MODE == 0x02)) + ps_data->ps_distance_last = near_far_state; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, near_far_state); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); + reading = stk3x1x_get_ps_reading(ps_data); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: ps input event %d cm, ps code = %d\n",__func__, near_far_state, reading); +#endif +#else + /* mode 0x01 or 0x04 */ + org_flag_reg = stk3x1x_get_flag(ps_data); + if(org_flag_reg < 0) + goto err_i2c_rw; + + if (org_flag_reg & STK_FLG_ALSINT_MASK) + { + disable_flag |= STK_FLG_ALSINT_MASK; + reading = stk3x1x_get_als_reading(ps_data); + if(reading < 0) + { + printk(KERN_ERR "%s: stk3x1x_get_als_reading fail, ret=%d", __func__, reading); + goto err_i2c_rw; + } +#ifndef CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD + nLuxIndex = stk_get_lux_interval_index(reading); + stk3x1x_set_als_thd_h(ps_data, code_threshold_table[nLuxIndex]); + stk3x1x_set_als_thd_l(ps_data, code_threshold_table[nLuxIndex-1]); +#else + stk_als_set_new_thd(ps_data, reading); +#endif //CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD + + if(ps_data->ir_code) + { + if(reading < STK_IRC_MAX_ALS_CODE && reading > STK_IRC_MIN_ALS_CODE && + ps_data->ir_code > STK_IRC_MIN_IR_CODE) + { + als_comperator = reading * STK_IRC_ALS_NUMERA / STK_IRC_ALS_DENOMI; + if(ps_data->ir_code > als_comperator) + ps_data->als_correct_factor = STK_IRC_ALS_CORREC; + else + ps_data->als_correct_factor = 1000; + } + printk(KERN_INFO "%s: als=%d, ir=%d, als_correct_factor=%d", __func__, reading, ps_data->ir_code, ps_data->als_correct_factor); + ps_data->ir_code = 0; + } + + reading = reading * ps_data->als_correct_factor / 1000; + + ps_data->als_lux_last = stk_alscode2lux(ps_data, reading); + input_report_abs(ps_data->als_input_dev, ABS_MISC, ps_data->als_lux_last); + input_sync(ps_data->als_input_dev); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: als input event %d lux\n",__func__, ps_data->als_lux_last); +#endif + } + if (org_flag_reg & STK_FLG_PSINT_MASK) + { + disable_flag |= STK_FLG_PSINT_MASK; + near_far_state = (org_flag_reg & STK_FLG_NF_MASK)?1:0; + + ps_data->ps_distance_last = near_far_state; + input_report_abs(ps_data->ps_input_dev, ABS_DISTANCE, near_far_state); + input_sync(ps_data->ps_input_dev); + wake_lock_timeout(&ps_data->ps_wakelock, 3*HZ); + reading = stk3x1x_get_ps_reading(ps_data); +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: ps input event=%d, ps code = %d\n",__func__, near_far_state, reading); +#endif + } + + if(disable_flag) + { + ret = stk3x1x_set_flag(ps_data, org_flag_reg, disable_flag); + if(ret < 0) + goto err_i2c_rw; + } +#endif + usleep_range(1000, 2000); + //msleep(1); + enable_irq(ps_data->irq); + return; + +err_i2c_rw: + msleep(30); + enable_irq(ps_data->irq); + return; +} + +static irqreturn_t stk_oss_irq_handler(int irq, void *data) +{ + struct stk3x1x_data *pData = data; + disable_irq_nosync(irq); + queue_work(pData->stk_wq,&pData->stk_work); + return IRQ_HANDLED; +} +#endif /* #if (!defined(STK_POLL_PS) || !defined(STK_POLL_ALS)) */ + +#ifdef STK_POLL_ALS +static void stk3x1x_als_set_poll_delay(struct stk3x1x_data *ps_data) +{ + uint8_t als_it = ps_data->alsctrl_reg & 0x0F; + + if(als_it == 0x8) + { + ps_data->als_poll_delay = ns_to_ktime(60 * NSEC_PER_MSEC); + } + else if(als_it == 0x9) + { + ps_data->als_poll_delay = ns_to_ktime(110 * NSEC_PER_MSEC); + } + else if(als_it == 0xA) + { + ps_data->als_poll_delay = ns_to_ktime(220 * NSEC_PER_MSEC); + } + else if(als_it == 0xB) + { + ps_data->als_poll_delay = ns_to_ktime(440 * NSEC_PER_MSEC); + } + else if(als_it == 0xC) + { + ps_data->als_poll_delay = ns_to_ktime(880 * NSEC_PER_MSEC); + } + else + { + ps_data->als_poll_delay = ns_to_ktime(110 * NSEC_PER_MSEC); + printk(KERN_INFO "%s: unknown ALS_IT=%d, set als_poll_delay=110ms\n", __func__, als_it); + } +} +#endif + +static int32_t stk3x1x_init_all_setting(struct i2c_client *client, struct stk3x1x_platform_data *plat_data) +{ + int32_t ret; + struct stk3x1x_data *ps_data = i2c_get_clientdata(client); + + ret = stk3x1x_software_reset(ps_data); + if(ret < 0) + return ret; + + ret = stk3x1x_check_pid(ps_data); + if(ret < 0) + return ret; + stk3x1x_proc_plat_data(ps_data, plat_data); + ret = stk3x1x_init_all_reg(ps_data); + if(ret < 0) + return ret; +#ifdef STK_POLL_ALS + stk3x1x_als_set_poll_delay(ps_data); +#endif + ps_data->als_enabled = false; + ps_data->ps_enabled = false; + ps_data->re_enable_als = false; + ps_data->re_enable_ps = false; + ps_data->ir_code = 0; + ps_data->als_correct_factor = 1000; + ps_data->first_boot = true; +#ifndef CONFIG_STK_PS_ALS_USE_CHANGE_THRESHOLD + stk_init_code_threshold_table(ps_data); +#endif +#ifdef STK_TUNE0 + #ifdef QUALCOMM_PLATFORM + ps_data->tune_zero_init_proc = false; + ps_data->psi_set = 0; + #else + stk_ps_tune_zero_init(ps_data); + #endif +#endif +#ifdef STK_ALS_FIR + memset(&ps_data->fir, 0x00, sizeof(ps_data->fir)); + atomic_set(&ps_data->firlength, STK_FIR_LEN); +#endif + atomic_set(&ps_data->recv_reg, 0); +#ifdef STK_GES + ps_data->re_enable_ges = 0; + atomic_set(&ps_data->gesture2, 0); + //memset(stk_ges_op, 0, sizeof(stk_ges_op)); +#endif +#ifdef STK_IRS + ps_data->als_data_index = 0; +#endif + ps_data->ps_distance_last = 1; + ps_data->als_code_last = 0; + return 0; +} + +#if (!defined(STK_POLL_PS) || !defined(STK_POLL_ALS)) +static int stk3x1x_setup_irq(struct i2c_client *client) +{ + int irq, err = -EIO; + struct stk3x1x_data *ps_data = i2c_get_clientdata(client); + +//#ifdef SPREADTRUM_PLATFORM +// irq = sprd_alloc_gpio_irq(ps_data->int_pin); +//#else + irq = gpio_to_irq(ps_data->int_pin); +//#endif +#ifdef STK_DEBUG_PRINTF + printk(KERN_INFO "%s: int pin #=%d, irq=%d\n",__func__, ps_data->int_pin, irq); +#endif + if (irq <= 0) + { + printk(KERN_ERR "irq number is not specified, irq # = %d, int pin=%d\n",irq, ps_data->int_pin); + return irq; + } + ps_data->irq = irq; + err = gpio_request(ps_data->int_pin,"stk-int"); + if(err < 0) + { + printk(KERN_ERR "%s: gpio_request, err=%d", __func__, err); + return err; + } + err = gpio_direction_input(ps_data->int_pin); + if(err < 0) + { + printk(KERN_ERR "%s: gpio_direction_input, err=%d", __func__, err); + return err; + } +#if ((STK_INT_PS_MODE == 0x03) || (STK_INT_PS_MODE == 0x02)) + err = request_any_context_irq(irq, stk_oss_irq_handler, IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING, DEVICE_NAME, ps_data); +#else + err = request_any_context_irq(irq, stk_oss_irq_handler, IRQF_TRIGGER_LOW|IRQF_NO_SUSPEND|IRQF_ONESHOT, DEVICE_NAME, ps_data); +#endif + if (err < 0) + { + printk(KERN_WARNING "%s: request_any_context_irq(%d) failed for (%d)\n", __func__, irq, err); + goto err_request_any_context_irq; + } + disable_irq(irq); + + return 0; +err_request_any_context_irq: +//#ifdef SPREADTRUM_PLATFORM +// sprd_free_gpio_irq(ps_data->int_pin); +//#else + gpio_free(ps_data->int_pin); +//#endif + return err; +} +#endif + + +static int stk3x1x_suspend(struct device *dev) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); +#if (defined(STK_CHK_REG) || !defined(STK_POLL_PS)) + int err; +#endif + +#ifndef STK_POLL_PS + struct i2c_client *client = to_i2c_client(dev); +#endif + + printk(KERN_INFO "%s", __func__); +#ifndef SPREADTRUM_PLATFORM + mutex_lock(&ps_data->io_lock); +#endif +#ifdef STK_CHK_REG + err = stk3x1x_validate_n_handle(ps_data->client); + if(err < 0) + { + printk(KERN_ERR "stk3x1x_validate_n_handle fail: %d\n", err); + } + else if (err == 0xFF) + { + if(ps_data->ps_enabled) + stk3x1x_enable_ps(ps_data, 1, 0); + } +#endif /* #ifdef STK_CHK_REG */ +#ifdef STK_GES + if(ps_data->ges_enabled == 1) + { + ps_data->re_enable_ges = ps_data->ges_enabled; + stk3x1x_enable_ges(ps_data, 0, 1); + } + else if(ps_data->ges_enabled == 2) + { + ps_data->re_enable_ges = ps_data->ges_enabled; + stk3x1x_enable_ges(ps_data, 0, 2); + } +#endif +#ifndef SPREADTRUM_PLATFORM + if(ps_data->als_enabled) + { + printk(KERN_INFO "%s: Enable ALS : 0\n", __func__); + stk3x1x_enable_als(ps_data, 0); + ps_data->re_enable_als = true; + } +#endif + if(ps_data->ps_enabled) + { +#ifdef STK_POLL_PS + wake_lock(&ps_data->ps_nosuspend_wl); +#else + if(device_may_wakeup(&client->dev)) + { + err = enable_irq_wake(ps_data->irq); + if (err) + printk(KERN_WARNING "%s: set_irq_wake(%d) failed, err=(%d)\n", __func__, ps_data->irq, err); + } + else + { + printk(KERN_ERR "%s: not support wakeup source", __func__); + } +#endif + } +#ifndef SPREADTRUM_PLATFORM + mutex_unlock(&ps_data->io_lock); +#endif + return 0; +} + +static int stk3x1x_resume(struct device *dev) +{ + struct stk3x1x_data *ps_data = dev_get_drvdata(dev); +#if (defined(STK_CHK_REG) || !defined(STK_POLL_PS)) + int err; +#endif + +#ifndef STK_POLL_PS + struct i2c_client *client = to_i2c_client(dev); +#endif + printk("%s called\n", __func__); + printk(KERN_INFO "%s", __func__); +#ifndef SPREADTRUM_PLATFORM + mutex_lock(&ps_data->io_lock); +#endif +#ifdef STK_CHK_REG + err = stk3x1x_validate_n_handle(ps_data->client); + if(err < 0) + { + printk(KERN_ERR "stk3x1x_validate_n_handle fail: %d\n", err); + } + else if (err == 0xFF) + { + if(ps_data->ps_enabled) + stk3x1x_enable_ps(ps_data, 1, 0); + } +#endif /* #ifdef STK_CHK_REG */ +#ifdef STK_GES + if(ps_data->re_enable_ges == 1) + { + stk3x1x_enable_ges(ps_data, 1, 1); + ps_data->re_enable_ges = 0; + } + else if(ps_data->re_enable_ges == 2) + { + stk3x1x_enable_ges(ps_data, 1, 2); + ps_data->re_enable_ges = 0; + } +#endif +#ifndef SPREADTRUM_PLATFORM + if(ps_data->re_enable_als) + { + printk(KERN_INFO "%s: Enable ALS : 1\n", __func__); + stk3x1x_enable_als(ps_data, 1); + ps_data->re_enable_als = false; + } +#endif + if(ps_data->ps_enabled) + { +#ifdef STK_POLL_PS + wake_unlock(&ps_data->ps_nosuspend_wl); +#else + if(device_may_wakeup(&client->dev)) + { + err = disable_irq_wake(ps_data->irq); + if (err) + printk(KERN_WARNING "%s: disable_irq_wake(%d) failed, err=(%d)\n", __func__, ps_data->irq, err); + } +#endif + } +#ifndef SPREADTRUM_PLATFORM + mutex_unlock(&ps_data->io_lock); +#endif + return 0; +} + +static const struct dev_pm_ops stk3x1x_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(stk3x1x_suspend, stk3x1x_resume) +}; + +//#ifdef CONFIG_HAS_EARLYSUSPEND +#if 0 +static void stk3x1x_early_suspend(struct early_suspend *h) +{ + +} + +static void stk3x1x_late_resume(struct early_suspend *h) +{ + +} +#endif //#ifdef CONFIG_HAS_EARLYSUSPEND + + +#ifdef STK_QUALCOMM_POWER_CTRL +static int stk3x1x_power_ctl(struct stk3x1x_data *data, bool on) +{ + int ret = 0; + + if (!on && data->power_enabled) { + ret = regulator_disable(data->vdd); + if (ret) { + dev_err(&data->client->dev, + "Regulator vdd disable failed ret=%d\n", ret); + return ret; + } + + ret = regulator_disable(data->vio); + if (ret) { + dev_err(&data->client->dev, + "Regulator vio disable failed ret=%d\n", ret); + regulator_enable(data->vdd); + return ret; + } + data->power_enabled = on; + printk(KERN_INFO "%s: disable stk3x1x power", __func__); + dev_dbg(&data->client->dev, "stk3x1x_power_ctl on=%d\n", + on); + } else if (on && !data->power_enabled) { + ret = regulator_enable(data->vdd); + if (ret) { + dev_err(&data->client->dev, + "Regulator vdd enable failed ret=%d\n", ret); + return ret; + } + + ret = regulator_enable(data->vio); + if (ret) { + dev_err(&data->client->dev, + "Regulator vio enable failed ret=%d\n", ret); + regulator_disable(data->vdd); + return ret; + } + data->power_enabled = on; + printk(KERN_INFO "%s: enable stk3x1x power", __func__); + dev_dbg(&data->client->dev, "stk3x1x_power_ctl on=%d\n", + on); + } else { + dev_warn(&data->client->dev, + "Power on=%d. enabled=%d\n", + on, data->power_enabled); + } + + return ret; +} + +static int stk3x1x_power_init(struct stk3x1x_data *data, bool on) +{ + int ret; + + if (!on) { + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, + 0, STK3X1X_VDD_MAX_UV); + + regulator_put(data->vdd); + + if (regulator_count_voltages(data->vio) > 0) + regulator_set_voltage(data->vio, + 0, STK3X1X_VIO_MAX_UV); + + regulator_put(data->vio); + } else { + data->vdd = regulator_get(&data->client->dev, "vdd"); + if (IS_ERR(data->vdd)) { + ret = PTR_ERR(data->vdd); + dev_err(&data->client->dev, + "Regulator get failed vdd ret=%d\n", ret); + return ret; + } + + if (regulator_count_voltages(data->vdd) > 0) { + ret = regulator_set_voltage(data->vdd, + STK3X1X_VDD_MIN_UV, + STK3X1X_VDD_MAX_UV); + if (ret) { + dev_err(&data->client->dev, + "Regulator set failed vdd ret=%d\n", + ret); + goto reg_vdd_put; + } + } + + data->vio = regulator_get(&data->client->dev, "vio"); + if (IS_ERR(data->vio)) { + ret = PTR_ERR(data->vio); + dev_err(&data->client->dev, + "Regulator get failed vio ret=%d\n", ret); + goto reg_vdd_set; + } + + if (regulator_count_voltages(data->vio) > 0) { + ret = regulator_set_voltage(data->vio, + STK3X1X_VIO_MIN_UV, + STK3X1X_VIO_MAX_UV); + if (ret) { + dev_err(&data->client->dev, + "Regulator set failed vio ret=%d\n", ret); + goto reg_vio_put; + } + } + } + + return 0; + +reg_vio_put: + regulator_put(data->vio); +reg_vdd_set: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, STK3X1X_VDD_MAX_UV); +reg_vdd_put: + regulator_put(data->vdd); + return ret; +} + +static int stk3x1x_device_ctl(struct stk3x1x_data *ps_data, bool enable) +{ + int ret; + struct device *dev = &ps_data->client->dev; + + if (enable && !ps_data->power_enabled) { + ret = stk3x1x_power_ctl(ps_data, true); + if (ret) { + dev_err(dev, "Failed to enable device power\n"); + goto err_exit; + } + ret = stk3x1x_init_all_setting(ps_data->client, ps_data->pdata); + if (ret < 0) { + stk3x1x_power_ctl(ps_data, false); + dev_err(dev, "Failed to re-init device setting\n"); + goto err_exit; + } + } else if (!enable && ps_data->power_enabled) { + #ifdef STK_GES + if (!ps_data->als_enabled && !ps_data->ps_enabled && !ps_data->ges_enabled) { + #else + if (!ps_data->als_enabled && !ps_data->ps_enabled) { + #endif + ret = stk3x1x_power_ctl(ps_data, false); + if (ret) { + dev_err(dev, "Failed to disable device power\n"); + goto err_exit; + } + } else { + dev_dbg(dev, "device control: als_enabled=%d, ps_enabled=%d\n", + ps_data->als_enabled, ps_data->ps_enabled); + } + } else { + dev_dbg(dev, "device control: enable=%d, power_enabled=%d\n", + enable, ps_data->power_enabled); + } + return 0; + +err_exit: + return ret; +} +#endif /* #ifdef STK_QUALCOMM_POWER_CTRL */ + +#ifdef CONFIG_OF +static int stk3x1x_parse_dt(struct device *dev, + struct stk3x1x_platform_data *pdata) +{ +#if 0 + int rc; + struct device_node *np = dev->of_node; + u32 temp_val; + + pdata->int_pin = of_get_named_gpio_flags(np, "stk,irq-gpio", + 0, &pdata->int_flags); + if (pdata->int_pin < 0) { + dev_err(dev, "Unable to read irq-gpio\n"); + return pdata->int_pin; + } + + rc = of_property_read_u32(np, "stk,transmittance", &temp_val); + if (!rc) + pdata->transmittance = temp_val; + else { + dev_err(dev, "Unable to read transmittance\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,state-reg", &temp_val); + if (!rc) + pdata->state_reg = temp_val; + else { + dev_err(dev, "Unable to read state-reg\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,psctrl-reg", &temp_val); + if (!rc) + pdata->psctrl_reg = (u8)temp_val; + else { + dev_err(dev, "Unable to read psctrl-reg\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,alsctrl-reg", &temp_val); + if (!rc) + pdata->alsctrl_reg = (u8)temp_val; + else { + dev_err(dev, "Unable to read alsctrl-reg\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,ledctrl-reg", &temp_val); + if (!rc) + pdata->ledctrl_reg = (u8)temp_val; + else { + dev_err(dev, "Unable to read ledctrl-reg\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,wait-reg", &temp_val); + if (!rc) + pdata->wait_reg = (u8)temp_val; + else { + dev_err(dev, "Unable to read wait-reg\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,ps-thdh", &temp_val); + if (!rc) + pdata->ps_thd_h = (u16)temp_val; + else { + dev_err(dev, "Unable to read ps-thdh\n"); + return rc; + } + + rc = of_property_read_u32(np, "stk,ps-thdl", &temp_val); + if (!rc) + pdata->ps_thd_l = (u16)temp_val; + else { + dev_err(dev, "Unable to read ps-thdl\n"); + return rc; + } + + //pdata->use_fir = of_property_read_bool(np, "stk,use-fir"); +#endif + + return 0; +} +#else +static int stk3x1x_parse_dt(struct device *dev, + struct stk3x1x_platform_data *pdata) +{ + return -ENODEV; +} +#endif /* !CONFIG_OF */ + +static int stk3x1x_set_wq(struct stk3x1x_data *ps_data) +{ +#ifdef STK_POLL_ALS + ps_data->stk_als_wq = create_singlethread_workqueue("stk_als_wq"); + INIT_WORK(&ps_data->stk_als_work, stk_als_poll_work_func); + hrtimer_init(&ps_data->als_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ps_data->als_poll_delay = ns_to_ktime(110 * NSEC_PER_MSEC); + ps_data->als_timer.function = stk_als_timer_func; +#endif + +#ifdef STK_POLL_PS + ps_data->stk_ps_wq = create_singlethread_workqueue("stk_ps_wq"); + INIT_WORK(&ps_data->stk_ps_work, stk_ps_poll_work_func); + hrtimer_init(&ps_data->ps_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ps_data->ps_poll_delay = ns_to_ktime(60 * NSEC_PER_MSEC); + ps_data->ps_timer.function = stk_ps_timer_func; +#endif + +#ifdef STK_TUNE0 + ps_data->stk_ps_tune0_wq = create_singlethread_workqueue("stk_ps_tune0_wq"); + INIT_WORK(&ps_data->stk_ps_tune0_work, stk_ps_tune0_work_func); + hrtimer_init(&ps_data->ps_tune0_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ps_data->ps_tune0_delay = ns_to_ktime(60 * NSEC_PER_MSEC); + ps_data->ps_tune0_timer.function = stk_ps_tune0_timer_func; +#endif + +#if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) + ps_data->stk_wq = create_singlethread_workqueue("stk_wq"); + INIT_WORK(&ps_data->stk_work, stk_work_func); +#endif + return 0; +} + + +static int stk3x1x_set_input_devices(struct stk3x1x_data *ps_data) +{ + int err; + + ps_data->als_input_dev = input_allocate_device(); + if (ps_data->als_input_dev==NULL) + { + printk(KERN_ERR "%s: could not allocate als device\n", __func__); + err = -ENOMEM; + return err; + } + ps_data->ps_input_dev = input_allocate_device(); + if (ps_data->ps_input_dev==NULL) + { + printk(KERN_ERR "%s: could not allocate ps device\n", __func__); + err = -ENOMEM; + return err; + } + ps_data->als_input_dev->name = ALS_NAME; + ps_data->ps_input_dev->name = PS_NAME; + set_bit(EV_ABS, ps_data->als_input_dev->evbit); + set_bit(EV_ABS, ps_data->ps_input_dev->evbit); + input_set_abs_params(ps_data->als_input_dev, ABS_MISC, 0, stk_alscode2lux(ps_data, (1<<16)-1), 0, 0); + input_set_abs_params(ps_data->ps_input_dev, ABS_DISTANCE, 0,1, 0, 0); + err = input_register_device(ps_data->als_input_dev); + if (err<0) + { + printk(KERN_ERR "%s: can not register als input device\n", __func__); + return err; + } + err = input_register_device(ps_data->ps_input_dev); + if (err<0) + { + printk(KERN_ERR "%s: can not register ps input device\n", __func__); + return err; + } + + err = sysfs_create_group(&ps_data->als_input_dev->dev.kobj, &stk_als_attribute_group); + if (err < 0) + { + printk(KERN_ERR "%s:could not create sysfs group for als\n", __func__); + return err; + } + err = sysfs_create_group(&ps_data->ps_input_dev->dev.kobj, &stk_ps_attribute_group); + if (err < 0) + { + printk(KERN_ERR "%s:could not create sysfs group for ps\n", __func__); + return err; + } + input_set_drvdata(ps_data->als_input_dev, ps_data); + input_set_drvdata(ps_data->ps_input_dev, ps_data); + +#ifdef STK_GES + ps_data->ges_input_dev = input_allocate_device(); + if (ps_data->ges_input_dev==NULL) + { + printk(KERN_ERR "%s: could not allocate ps device\n", __func__); + err = -ENOMEM; + return err; + } + ps_data->ges_input_dev->name = "stk_ges"; + ps_data->ges_input_dev->evbit[0] = BIT_MASK(EV_KEY); + set_bit(KEY_PAGEUP, ps_data->ges_input_dev->keybit); + set_bit(KEY_PAGEDOWN, ps_data->ges_input_dev->keybit); + set_bit(KEY_VOLUMEUP, ps_data->ges_input_dev->keybit); + set_bit(KEY_VOLUMEDOWN, ps_data->ges_input_dev->keybit); + /* + set_bit(KEY_LEFT, ps_data->ges_input_dev->keybit); + set_bit(KEY_RIGHT, ps_data->ges_input_dev->keybit); + set_bit(KEY_UP, ps_data->ges_input_dev->keybit); + set_bit(KEY_DOWN, ps_data->ges_input_dev->keybit); + */ + err = input_register_device(ps_data->ges_input_dev); + if (err<0) + { + printk(KERN_ERR "%s: can not register ps input device\n", __func__); + return err; + } + + err = sysfs_create_group(&ps_data->ges_input_dev->dev.kobj, &stk_ges_attribute_group); + if (err < 0) + { + printk(KERN_ERR "%s:could not create sysfs group for ps\n", __func__); + return err; + } + input_set_drvdata(ps_data->ges_input_dev, ps_data); +#endif + + return 0; +} + +static int stk3x1x_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int err = -ENODEV; + struct stk3x1x_data *ps_data; + struct stk3x1x_platform_data *plat_data; + printk(KERN_INFO "%s: driver version = %s\n", __func__, DRIVER_VERSION); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + { + printk(KERN_ERR "%s: No Support for I2C_FUNC_I2C\n", __func__); + return -ENODEV; + } + + ps_data = kzalloc(sizeof(struct stk3x1x_data),GFP_KERNEL); + if(!ps_data) + { + printk(KERN_ERR "%s: failed to allocate stk3x1x_data\n", __func__); + return -ENOMEM; + } + ps_data->client = client; + i2c_set_clientdata(client,ps_data); + mutex_init(&ps_data->io_lock); + wake_lock_init(&ps_data->ps_wakelock,WAKE_LOCK_SUSPEND, "stk_input_wakelock"); + +#ifdef STK_POLL_PS + wake_lock_init(&ps_data->ps_nosuspend_wl,WAKE_LOCK_SUSPEND, "stk_nosuspend_wakelock"); +#endif + + if (client->dev.of_node) { + printk(KERN_INFO "%s: probe with device tree\n", __func__); + plat_data = devm_kzalloc(&client->dev, + sizeof(struct stk3x1x_platform_data), GFP_KERNEL); + if (!plat_data) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + err = stk3x1x_parse_dt(&client->dev, plat_data); +//huanggq + plat_data->state_reg = stk3x1x_pfdata.state_reg; + plat_data->psctrl_reg = stk3x1x_pfdata.psctrl_reg; + plat_data->alsctrl_reg = stk3x1x_pfdata.alsctrl_reg; + plat_data->ledctrl_reg = stk3x1x_pfdata.ledctrl_reg; + plat_data->wait_reg = stk3x1x_pfdata.wait_reg; + plat_data->ps_thd_h = stk3x1x_pfdata.ps_thd_h; + plat_data->ps_thd_l = stk3x1x_pfdata.ps_thd_l; + plat_data->int_pin = stk3x1x_pfdata.int_pin; + plat_data->transmittance = stk3x1x_pfdata.transmittance; +//end + dev_err(&client->dev, + "%s: stk3x1x_parse_dt ret=%d\n", __func__, err); + if (err) + return err; + } else { + printk(KERN_INFO "%s: probe with platform data\n", __func__); +#ifdef SPREADTRUM_PLATFORM + plat_data = &stk3x1x_pfdata; +#else + plat_data = client->dev.platform_data; +#endif + } + if (!plat_data) { + dev_err(&client->dev, + "%s: no stk3x1x platform data!\n", __func__); + goto err_als_input_allocate; + } + ps_data->als_transmittance = plat_data->transmittance; + ps_data->int_pin = plat_data->int_pin; + ps_data->pdata = plat_data; + + if (ps_data->als_transmittance == 0) { + dev_err(&client->dev, + "%s: Please set als_transmittance\n", __func__); + goto err_als_input_allocate; + } + + stk3x1x_set_wq(ps_data); +#ifdef QUALCOMM_PLATFORM + ps_data->ps_thd_h = 0; + ps_data->ps_thd_l = 0; +#endif + ps_data->stk_max_min_diff = STK_MAX_MIN_DIFF; + ps_data->stk_lt_n_ct = STK_LT_N_CT; + ps_data->stk_ht_n_ct = STK_HT_N_CT; + +#ifdef STK_QUALCOMM_POWER_CTRL + err = stk3x1x_power_init(ps_data, true); + if (err) + goto err_init_all_setting; + + err = stk3x1x_power_ctl(ps_data, true); + if (err) + goto err_power_on; + + ps_data->als_enabled = false; + ps_data->ps_enabled = false; +#endif + + err = stk3x1x_init_all_setting(client, plat_data); + if(err < 0) + goto err_init_all_setting; + + err = stk3x1x_set_input_devices(ps_data); + if(err < 0) + goto err_setup_input_device; + +#if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) + err = stk3x1x_setup_irq(client); + if(err < 0) + goto err_stk3x1x_setup_irq; +#endif + device_init_wakeup(&client->dev, true); + +//#ifdef CONFIG_HAS_EARLYSUSPEND +#if 0 + ps_data->stk_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ps_data->stk_early_suspend.suspend = stk3x1x_early_suspend; + ps_data->stk_early_suspend.resume = stk3x1x_late_resume; + register_early_suspend(&ps_data->stk_early_suspend); +#endif + +#ifdef STK_QUALCOMM_POWER_CTRL + /* enable device power only when it is enabled */ + err = stk3x1x_power_ctl(ps_data, false); + if (err) + goto err_stk3x1x_setup_irq; +#endif + printk(KERN_INFO "%s: probe successfully", __func__); + return 0; + + //device_init_wakeup(&client->dev, false); +err_stk3x1x_setup_irq: +#if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) + free_irq(ps_data->irq, ps_data); + //#ifdef SPREADTRUM_PLATFORM + // sprd_free_gpio_irq(ps_data->int_pin); + //#else + gpio_free(ps_data->int_pin); + //#endif +#endif +err_setup_input_device: +#ifdef STK_GES + sysfs_remove_group(&ps_data->ges_input_dev->dev.kobj, &stk_ges_attribute_group); + input_unregister_device(ps_data->ges_input_dev); + input_free_device(ps_data->ges_input_dev); +#endif + sysfs_remove_group(&ps_data->ps_input_dev->dev.kobj, &stk_ps_attribute_group); + sysfs_remove_group(&ps_data->als_input_dev->dev.kobj, &stk_als_attribute_group); + input_unregister_device(ps_data->ps_input_dev); + input_unregister_device(ps_data->als_input_dev); + input_free_device(ps_data->ps_input_dev); + input_free_device(ps_data->als_input_dev); +#ifdef STK_QUALCOMM_POWER_CTRL + stk3x1x_power_ctl(ps_data, false); +err_power_on: + stk3x1x_power_init(ps_data, false); +#endif +err_init_all_setting: +#ifdef STK_POLL_ALS + hrtimer_try_to_cancel(&ps_data->als_timer); + destroy_workqueue(ps_data->stk_als_wq); +#endif +#ifdef STK_TUNE0 + destroy_workqueue(ps_data->stk_ps_tune0_wq); +#endif +#ifdef STK_POLL_PS + hrtimer_try_to_cancel(&ps_data->ps_timer); + destroy_workqueue(ps_data->stk_ps_wq); +#endif +#if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) + destroy_workqueue(ps_data->stk_wq); +#endif +err_als_input_allocate: +#ifdef STK_POLL_PS + wake_lock_destroy(&ps_data->ps_nosuspend_wl); +#endif + wake_lock_destroy(&ps_data->ps_wakelock); + mutex_destroy(&ps_data->io_lock); + kfree(ps_data); + return err; +} + + +static int stk3x1x_remove(struct i2c_client *client) +{ + struct stk3x1x_data *ps_data = i2c_get_clientdata(client); + device_init_wakeup(&client->dev, false); +#if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) + free_irq(ps_data->irq, ps_data); + //#ifdef SPREADTRUM_PLATFORM + // sprd_free_gpio_irq(ps_data->int_pin); + //#else + gpio_free(ps_data->int_pin); + //#endif +#endif /* #if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) */ + + +#ifdef STK_GES + sysfs_remove_group(&ps_data->ges_input_dev->dev.kobj, &stk_ges_attribute_group); + input_unregister_device(ps_data->ges_input_dev); + input_free_device(ps_data->ges_input_dev); +#endif +#if (!defined(STK_POLL_ALS) || !defined(STK_POLL_PS)) + destroy_workqueue(ps_data->stk_wq); +#endif + sysfs_remove_group(&ps_data->ps_input_dev->dev.kobj, &stk_ps_attribute_group); + sysfs_remove_group(&ps_data->als_input_dev->dev.kobj, &stk_als_attribute_group); + input_unregister_device(ps_data->ps_input_dev); + input_unregister_device(ps_data->als_input_dev); + input_free_device(ps_data->ps_input_dev); + input_free_device(ps_data->als_input_dev); +#ifdef STK_QUALCOMM_POWER_CTRL + stk3x1x_power_ctl(ps_data, false); + stk3x1x_power_init(ps_data, false); +#endif +#ifdef STK_POLL_ALS + hrtimer_try_to_cancel(&ps_data->als_timer); + destroy_workqueue(ps_data->stk_als_wq); +#endif +#ifdef STK_TUNE0 + destroy_workqueue(ps_data->stk_ps_tune0_wq); +#endif +#ifdef STK_POLL_PS + hrtimer_try_to_cancel(&ps_data->ps_timer); + destroy_workqueue(ps_data->stk_ps_wq); + wake_lock_destroy(&ps_data->ps_nosuspend_wl); +#endif + wake_lock_destroy(&ps_data->ps_wakelock); + mutex_destroy(&ps_data->io_lock); + kfree(ps_data); + + return 0; +} + +static const struct i2c_device_id stk_ps_id[] = +{ + { "stk_ps", 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, stk_ps_id); + +static struct of_device_id stk_match_table[] = { + { .compatible = "stk,stk3x1x", }, + { }, +}; + +static struct i2c_driver stk_ps_driver = +{ + .driver = { + .name = DEVICE_NAME, + .owner = THIS_MODULE, +#ifdef CONFIG_OF + .of_match_table = stk_match_table, +#endif + .pm = &stk3x1x_pm_ops, + }, + .probe = stk3x1x_probe, + .remove = stk3x1x_remove, + .id_table = stk_ps_id, +}; + +static int __init stk3x1x_init(void) +{ + int ret; + + printk("stk3x1x_init"); + + ret = i2c_add_driver(&stk_ps_driver); + if (ret) + { + i2c_del_driver(&stk_ps_driver); + return ret; + } + return 0; +} + +static void __exit stk3x1x_exit(void) +{ + i2c_del_driver(&stk_ps_driver); +} + +module_init(stk3x1x_init); +module_exit(stk3x1x_exit); +MODULE_AUTHOR("Lex Hsieh "); +MODULE_DESCRIPTION("Sensortek stk3x1x Proximity Sensor driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(DRIVER_VERSION); \ No newline at end of file diff --git a/drivers/input/misc/stk3x1x.h b/drivers/input/misc/stk3x1x.h new file mode 100644 index 00000000..2d3cc79b --- /dev/null +++ b/drivers/input/misc/stk3x1x.h @@ -0,0 +1,31 @@ +/* + * + * $Id: stk3x1x.h + * + * Copyright (C) 2012~2013 Lex Hsieh + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + * + */ +#ifndef __STK3X1X_H__ +#define __STK3X1X_H__ + +/* platform data */ +struct stk3x1x_platform_data +{ + uint8_t state_reg; + uint8_t psctrl_reg; + uint8_t alsctrl_reg; + uint8_t ledctrl_reg; + uint8_t wait_reg; + uint16_t ps_thd_h; + uint16_t ps_thd_l; + int int_pin; + uint32_t transmittance; + uint32_t int_flags; +}; + + +#endif // __STK3X1X_H__ \ No newline at end of file diff --git a/drivers/input/misc/tmd2771_pls.c b/drivers/input/misc/tmd2771_pls.c new file mode 100644 index 00000000..e3cc465e --- /dev/null +++ b/drivers/input/misc/tmd2771_pls.c @@ -0,0 +1,1591 @@ +/******************************************************************************* +* * +* File Name: taos.c * +* Description: Linux device driver for Taos ambient light and * +* proximity sensors. * +* Author: John Koshi * +* History: 09/16/2009 - Initial creation * +* 10/09/2009 - Triton version * +* 12/21/2009 - Probe/remove mode * +* 02/07/2010 - Add proximity * +* * +******************************************************************************** +* Proprietary to Taos Inc., 1001 Klein Road #300, Plano, TX 75074 * +*******************************************************************************/ +// includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//iVIZM +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +// device name/id/address/counts +#define TAOS_DEVICE_NAME "tmd2771_pls" +#define TAOS_DEVICE_ID "tritonFN" +#define TAOS_ID_NAME_SIZE 10 +#define TAOS_TRITON_CHIPIDVAL 0x00 +#define TAOS_TRITON_MAXREGS 32 +#define TAOS_DEVICE_ADDR1 0x29 +#define TAOS_DEVICE_ADDR2 0x39 +#define TAOS_DEVICE_ADDR3 0x49 +#define TAOS_MAX_NUM_DEVICES 3 +#define TAOS_MAX_DEVICE_REGS 32 +#define I2C_MAX_ADAPTERS 8 + +// TRITON register offsets +#define TAOS_TRITON_CNTRL 0x00 +#define TAOS_TRITON_ALS_TIME 0X01 +#define TAOS_TRITON_PRX_TIME 0x02 +#define TAOS_TRITON_WAIT_TIME 0x03 +#define TAOS_TRITON_ALS_MINTHRESHLO 0X04 +#define TAOS_TRITON_ALS_MINTHRESHHI 0X05 +#define TAOS_TRITON_ALS_MAXTHRESHLO 0X06 +#define TAOS_TRITON_ALS_MAXTHRESHHI 0X07 +#define TAOS_TRITON_PRX_MINTHRESHLO 0X08 +#define TAOS_TRITON_PRX_MINTHRESHHI 0X09 +#define TAOS_TRITON_PRX_MAXTHRESHLO 0X0A +#define TAOS_TRITON_PRX_MAXTHRESHHI 0X0B +#define TAOS_TRITON_INTERRUPT 0x0C +#define TAOS_TRITON_PRX_CFG 0x0D +#define TAOS_TRITON_PRX_COUNT 0x0E +#define TAOS_TRITON_GAIN 0x0F +#define TAOS_TRITON_REVID 0x11 +#define TAOS_TRITON_CHIPID 0x12 +#define TAOS_TRITON_STATUS 0x13 +#define TAOS_TRITON_ALS_CHAN0LO 0x14 +#define TAOS_TRITON_ALS_CHAN0HI 0x15 +#define TAOS_TRITON_ALS_CHAN1LO 0x16 +#define TAOS_TRITON_ALS_CHAN1HI 0x17 +#define TAOS_TRITON_PRX_LO 0x18 +#define TAOS_TRITON_PRX_HI 0x19 +#define TAOS_TRITON_TEST_STATUS 0x1F + +// Triton cmd reg masks +#define TAOS_TRITON_CMD_REG 0X80 +#define TAOS_TRITON_CMD_AUTO 0x10 //iVIZM +#define TAOS_TRITON_CMD_BYTE_RW 0x00 +#define TAOS_TRITON_CMD_WORD_BLK_RW 0x20 +#define TAOS_TRITON_CMD_SPL_FN 0x60 +#define TAOS_TRITON_CMD_PROX_INTCLR 0X05 +#define TAOS_TRITON_CMD_ALS_INTCLR 0X06 +#define TAOS_TRITON_CMD_PROXALS_INTCLR 0X07 +#define TAOS_TRITON_CMD_TST_REG 0X08 +#define TAOS_TRITON_CMD_USER_REG 0X09 + +// Triton cntrl reg masks +#define TAOS_TRITON_CNTL_PROX_INT_ENBL 0X20 +#define TAOS_TRITON_CNTL_ALS_INT_ENBL 0X10 +#define TAOS_TRITON_CNTL_WAIT_TMR_ENBL 0X08 +#define TAOS_TRITON_CNTL_PROX_DET_ENBL 0X04 +#define TAOS_TRITON_CNTL_ADC_ENBL 0x02 +#define TAOS_TRITON_CNTL_PWRON 0x01 + +// Triton status reg masks +#define TAOS_TRITON_STATUS_ADCVALID 0x01 +#define TAOS_TRITON_STATUS_PRXVALID 0x02 +#define TAOS_TRITON_STATUS_ADCINTR 0x10 +#define TAOS_TRITON_STATUS_PRXINTR 0x20 + +// lux constants +#define TAOS_MAX_LUX 10000 +#define TAOS_SCALE_MILLILUX 3 +#define TAOS_FILTER_DEPTH 3 +#define CHIP_ID 0x3d + +#define TAOS_INPUT_NAME "light sensor" +// forward declarations +static int taos_probe(struct i2c_client *clientp, const struct i2c_device_id *idp); +static int taos_remove(struct i2c_client *client); +static int taos_open(struct inode *inode, struct file *file); +static int taos_release(struct inode *inode, struct file *file); +static int taos_ioctl(struct file *file, unsigned int cmd, unsigned long arg); +static int taos_get_lux(void); +//static int taos_lux_filter(int raw_lux); +static int taos_device_name(unsigned char *bufp, char **device_name); +static int taos_prox_poll(struct taos_prox_info *prxp); +static void taos_prox_poll_timer_func(unsigned long param); +static void taos_prox_poll_timer_start(void); +//iVIZM +static int taos_als_threshold_set(void); +static int taos_prox_threshold_set(void); +static int taos_als_get_data(void); +static int taos_interrupts_clear(void); +//static unsigned int taos_poll(struct file *filp, poll_table *wait); +//static int taos_resume(struct i2c_client *client); +//static int taos_suspend(struct i2c_client *client,pm_message_t mesg); + + +DECLARE_WAIT_QUEUE_HEAD(waitqueue_read);//iVIZM + +#define ALS_PROX_DEBUG //iVIZM + +// first device number +static dev_t taos_dev_number; + +// workqueue struct +//static struct workqueue_struct *taos_wq; //iVIZM + +// class structure for this device +struct class *taos_class; + +// module device table +static struct i2c_device_id taos_idtable[] = { + {TAOS_DEVICE_NAME, 0}, + {} +}; +MODULE_DEVICE_TABLE(i2c, taos_idtable); + +// board and address info iVIZM +struct i2c_board_info taos_board_info[] = { + {I2C_BOARD_INFO(TAOS_DEVICE_ID, TAOS_DEVICE_ADDR2),}, +}; + +unsigned short const taos_addr_list[2] = {TAOS_DEVICE_ADDR2, I2C_CLIENT_END};//iVIZM + +// client and device +struct i2c_client *my_clientp; +struct i2c_client *bad_clientp[TAOS_MAX_NUM_DEVICES]; +static int num_bad = 0; +static int device_found = 0; +//iVIZM +static char pro_buf[4]; //iVIZM +static int mcount = 0; //iVIZM +static char als_buf[4]; //iVIZM +u16 status = 0; +static int ALS_ON; + +// driver definition +static struct i2c_driver taos_driver = { + .driver = { + .owner = THIS_MODULE, + .name = TAOS_DEVICE_NAME, + }, + .id_table = taos_idtable, + .probe = taos_probe, + //.resume = taos_resume,//iVIZM + //.suspend = taos_suspend,//iVIZM + .remove = __devexit_p(taos_remove), +}; + +// per-device data +struct taos_data { + struct i2c_client *client; + struct cdev cdev; + unsigned int addr; + struct input_dev *input_dev;//iVIZM + struct work_struct work;//iVIZM + struct wake_lock taos_wake_lock;//iVIZM + char taos_id; + char taos_name[TAOS_ID_NAME_SIZE]; + struct semaphore update_lock; + char valid; + //int working; + unsigned long last_updated; + struct regulator *reg_vdd; +} *taos_datap; + +// file operations +static struct file_operations taos_fops = { + .owner = THIS_MODULE, + .open = taos_open, + .release = taos_release, + .unlocked_ioctl = taos_ioctl, +}; + +// device configuration +struct taos_cfg *taos_cfgp; + +#if 1 //zwj add +static struct file_operations taos_fops_2 = { + .owner = THIS_MODULE, + .open = taos_open, + .release = taos_release, + .unlocked_ioctl = taos_ioctl, +}; + +static struct miscdevice taos_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = TAOS_DEVICE_NAME, + .fops = &taos_fops_2, +}; +#endif + + +static u32 calibrate_target_param = 300000; +static u16 als_time_param = 200; +static u16 scale_factor_param = 1; +static u16 gain_trim_param = 512; +static u8 filter_history_param = 3; +static u8 filter_count_param = 1; +static u8 gain_param = 2; +static u16 prox_threshold_hi_param = 560; //120; +static u16 prox_threshold_lo_param = 500; //80; +static u16 als_threshold_hi_param = 3000;//iVIZM +static u16 als_threshold_lo_param = 10;//iVIZM +static u8 prox_int_time_param = 0xEE;//50ms +static u8 prox_adc_time_param = 0xFF; +static u8 prox_wait_time_param = 0xEE; +static u8 prox_intr_filter_param = 0x23; +static u8 prox_config_param = 0x00; +static u8 prox_pulse_cnt_param = 0x04; //0x01; +static u8 prox_gain_param = 0xA2; //0x22; + +// prox info +struct taos_prox_info prox_cal_info[20]; +struct taos_prox_info prox_cur_info; +struct taos_prox_info *prox_cur_infop = &prox_cur_info; +static u8 prox_history_hi = 0; +static u8 prox_history_lo = 0; +static struct timer_list prox_poll_timer; +static int prox_on = 0; +static int device_released = 0; +static u16 sat_als = 0; +static u16 sat_prox = 0; + +// device reg init values +u8 taos_triton_reg_init[16] = {0x00,0xFF,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0XFF,0XFF,0X00,0X00,0X00,0X00}; + +// lux time scale +struct time_scale_factor { + u16 numerator; + u16 denominator; + u16 saturation; +}; +struct time_scale_factor TritonTime = {1, 0, 0}; +struct time_scale_factor *lux_timep = &TritonTime; + +// gain table +u8 taos_triton_gain_table[] = {1, 8, 16, 120}; + +// lux data + +struct lux_data { + u16 ratio; + u16 clear; + u16 ir; + +}; +struct lux_data TritonFN_lux_data[] = { + { 9830, 8320, 15360 }, + { 12452, 10554, 22797 }, + { 14746, 6234, 11430 }, + { 17695, 3968, 6400 }, + { 0, 0, 0 } +}; +struct lux_data *lux_tablep = TritonFN_lux_data; +static int lux_history[TAOS_FILTER_DEPTH] = {-ENODATA, -ENODATA, -ENODATA};//iVIZM + +static int tmd2711_pls_irq; + + + +static irqreturn_t taos_irq_handler(int irq, void *dev_id) //iVIZM +{ + //disable_irq_nosync(tmd2711_pls_irq); + //queue_work(taos_wq,&taos_datap->work); + //printk("^^^^^^^^^^^^^^^^^^ taos_irq_handler ^^^^^^^^^^^^^^^^^^^^\n"); + schedule_work(&taos_datap->work); + //enable_irq(tmd2711_pls_irq); + + return IRQ_HANDLED; +} + +static int taos_get_data(void)//iVIZM +{ + int ret = 0; + + //printk("^^^^^^^^^^^^^^^^^^ taos_get_data ^^^^^^^^^^^^^^^^^^^^\n"); + + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | 0x13)))) < 0) { + //printk(KERN_ERR "TAOS: i2c_smbus_write_byte(1) failed in taos_work_func()\n"); + return (ret); + } + status = i2c_smbus_read_byte(taos_datap->client); + // if (down_interruptible(&taos_datap->update_lock)) + // return -ERESTARTSYS; + printk(" kl# %s, line=%d, status=%x\n", __func__, __LINE__, status); + // status : 5:4 = pint:aint //It has a little error here + // 1:1 = pint:aint + // 1:0 = pint + // 0:1 = aint + if((status & 0x20) == 0x20) { // ps + ret = taos_prox_threshold_set(); + } else if((status & 0x10) == 0x10) { // as + taos_als_threshold_set(); + taos_als_get_data(); + } + //up(&taos_datap->update_lock); + return ret; +} + +static int taos_interrupts_clear(void)//iVIZM +{ + int ret = 0; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|0x07)))) < 0) { + //printk(KERN_ERR "TAOS: i2c_smbus_write_byte(2) failed in taos_work_func()\n"); + return (ret); + } + return ret; +} +static void taos_work_func(struct work_struct * work) //iVIZM +{ + wake_lock(&taos_datap->taos_wake_lock); + printk("^^^^^^^^^^^^^^^^^^ taos_work_func ^^^^^^^^^^^^^^^^^^^^\n"); + taos_get_data(); + taos_interrupts_clear(); + wake_unlock(&taos_datap->taos_wake_lock); +} + +static int taos_als_get_data(void)//iVIZM +{ + int ret = 0; + u8 reg_val; + int lux_val = 0; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + //printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) != (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) + return -ENODATA; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { + //printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & TAOS_TRITON_STATUS_ADCVALID) != TAOS_TRITON_STATUS_ADCVALID) + return -ENODATA; + if ((lux_val = taos_get_lux()) < 0) + printk(KERN_ERR "TAOS: call to taos_get_lux() returned error %d in ioctl als_data\n", lux_val); + printk("********** before taos_als_get_data ********* lux_val = %d \n",lux_val); + input_report_abs(taos_datap->input_dev,ABS_MISC,lux_val); + input_sync(taos_datap->input_dev); // zwj add test + return ret; +} + + +static int taos_als_threshold_set(void)//iVIZM +{ + int i,ret = 0; + u8 chdata[2]; + u16 ch0; + + printk("kl# %s, line=%d \n", __func__, __LINE__); + + for (i = 0; i < 2; i++) { + chdata[i] = (i2c_smbus_read_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CMD_WORD_BLK_RW | (TAOS_TRITON_ALS_CHAN0LO + i)))); + } + ch0 = chdata[0] + chdata[1]*256; + als_threshold_hi_param = (12*ch0)/10; + if (als_threshold_hi_param >= 65535) + als_threshold_hi_param = 65535; + als_threshold_lo_param = (8*ch0)/10; + als_buf[0] = als_threshold_lo_param & 0x0ff; + als_buf[1] = als_threshold_lo_param >> 8; + als_buf[2] = als_threshold_hi_param & 0x0ff; + als_buf[3] = als_threshold_hi_param >> 8; + + for( mcount=0; mcount<4; mcount++ ) { + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x04) + mcount, als_buf[mcount]))) < 0) { + //printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in taos als threshold set\n"); + return (ret); + } + } + return ret; +} + +static int taos_prox_threshold_set(void)//iVIZM +{ + int i,ret = 0; + u8 chdata[6]; + u16 proxdata = 0; + u16 cleardata = 0; + int data = 0; + + // int ch0,ch1; +// printk("kl# %s, line=%d \n", __func__, __LINE__); + + for (i = 0; i < 6; i++) { + chdata[i] = (i2c_smbus_read_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CMD_WORD_BLK_RW| (TAOS_TRITON_ALS_CHAN0LO + i)))); + } + cleardata = chdata[0] + chdata[1]*256; + proxdata = chdata[4] + chdata[5]*256; + printk("kl## = proxdata = %d, cleardata=%d\n",proxdata, cleardata); + + //ch0= i2c_smbus_read_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | 0x18 )); + //ch1= i2c_smbus_read_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | 0x19 )); + + //printk("================= proxdatatest = %d\n",ch1<<8 |ch0); + + if(prox_on || (proxdata < (taos_cfgp->prox_threshold_lo ))) + { + pro_buf[0] = 0x0; + pro_buf[1] = 0x0; + pro_buf[2] = taos_cfgp->prox_threshold_hi & 0x0ff; + pro_buf[3] = taos_cfgp->prox_threshold_hi >> 8; + data = 1; + printk(KERN_ERR "report pls data 1\n"); + input_report_abs(taos_datap->input_dev,ABS_DISTANCE,data); + input_sync(taos_datap->input_dev); + } + else if(proxdata > (taos_cfgp->prox_threshold_hi) ) + { + if (cleardata > ((sat_als*80)/100)){ + data = 0; + } + else{ + pro_buf[0] = taos_cfgp->prox_threshold_lo & 0x0ff; + pro_buf[1] = taos_cfgp->prox_threshold_lo >> 8; + pro_buf[2] = 0xff; + pro_buf[3] = 0xff; + data = 0; + } + input_report_abs(taos_datap->input_dev,ABS_DISTANCE,data); + + input_sync(taos_datap->input_dev); + } + + // printk("prox_threshold_hi=%d, prox_threshold_lo= %d\n",pro_buf[3]<<8 |pro_buf[2], pro_buf[1]<<8 |pro_buf[0]); + + for( mcount=0; mcount<4; mcount++ ) { + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x08) + mcount, pro_buf[mcount]))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in taos prox threshold set\n"); + return (ret); + } + } + + prox_on = 0; + return ret; +} + +static int taos_reg_init(struct i2c_client *clientp) +{ + int ret = 0; + int i = 0; + unsigned char buf[TAOS_MAX_DEVICE_REGS]; + char *device_name; + int chip_id; + + for (i = 0; i < TAOS_MAX_DEVICE_REGS; i++) { + if ((ret = (i2c_smbus_write_byte(clientp, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_CNTRL + i))))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to control reg failed in taos_probe()\n"); + return(ret); + } + buf[i] = i2c_smbus_read_byte(clientp); + } + if ((ret = taos_device_name(buf, &device_name)) == 0) { + printk(KERN_ERR "TAOS: chip id that was read found mismatched by taos_device_name(), in taos_probe()\n"); + return -ENODEV; + } + if (strcmp(device_name, TAOS_DEVICE_ID)) { + printk(KERN_ERR "TAOS: chip id that was read does not match expected id in taos_probe()\n"); + return -ENODEV; + } + else { + printk(KERN_ERR "TAOS: chip id of %s that was read matches expected id in taos_probe()\n", device_name); + device_found = 1; + } + if ((ret = (i2c_smbus_write_byte(clientp, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to control reg failed in taos_probe()\n"); + return(ret); + } + strlcpy(clientp->name, TAOS_DEVICE_ID, I2C_NAME_SIZE); + strlcpy(taos_datap->taos_name, TAOS_DEVICE_ID, TAOS_ID_NAME_SIZE); + taos_datap->valid = 0; + if (!(taos_cfgp = kmalloc(sizeof(struct taos_cfg), GFP_KERNEL))) { + printk(KERN_ERR "TAOS: kmalloc for struct taos_cfg failed in taos_probe()\n"); + return -ENOMEM; + } + taos_cfgp->calibrate_target = calibrate_target_param; + taos_cfgp->als_time = als_time_param; + taos_cfgp->scale_factor = scale_factor_param; + taos_cfgp->gain_trim = gain_trim_param; + taos_cfgp->filter_history = filter_history_param; + taos_cfgp->filter_count = filter_count_param; + taos_cfgp->gain = gain_param; + taos_cfgp->als_threshold_hi = als_threshold_hi_param;//iVIZM + taos_cfgp->als_threshold_lo = als_threshold_lo_param;//iVIZM + taos_cfgp->prox_threshold_hi = prox_threshold_hi_param; + taos_cfgp->prox_threshold_lo = prox_threshold_lo_param; + taos_cfgp->prox_int_time = prox_int_time_param; + taos_cfgp->prox_adc_time = prox_adc_time_param; + taos_cfgp->prox_wait_time = prox_wait_time_param; + taos_cfgp->prox_intr_filter = prox_intr_filter_param; + taos_cfgp->prox_config = prox_config_param; + taos_cfgp->prox_pulse_cnt = prox_pulse_cnt_param; + taos_cfgp->prox_gain = prox_gain_param; + sat_als = (256 - taos_cfgp->prox_int_time) << 10; + sat_prox = (256 - taos_cfgp->prox_adc_time) << 10; + + /*dmobile ::power down for init ,Rambo liu*/ + printk("Rambo::light sensor will pwr down \n"); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { + printk(KERN_ERR "TAOS:Rambo, i2c_smbus_write_byte_data failed in power down\n"); + return (ret); + } +} + +static void tmd2771_pls_pininit(int irq_pin) +{ + printk(KERN_INFO "%s [irq=%d]\n",__func__,irq_pin); + gpio_request(irq_pin, "tmd2771_pls irq"); + gpio_direction_input(irq_pin); +} + + +// client probe +static int taos_probe(struct i2c_client *clientp, const struct i2c_device_id *idp) { + int ret = 0; + int i = 0; + int chip_id; + int ch0,ch1,ch2,ch3,ch4,ch5; + struct regulator *reg_vdd; + //unsigned char buf[TAOS_MAX_DEVICE_REGS]; + //char *device_name; + struct i2c_adapter *adapter = to_i2c_adapter(clientp->dev.parent); + struct tmd2771_pls_platform_data *pdata = clientp->dev.platform_data; + + printk("kl# tmd2771 probe!!!!line=%d\n", __LINE__); + + //reg_vdd = regulator_get(NULL,REGU_NAMES_VDD28); + //regulator_enable(reg_vdd); + + if (!i2c_check_functionality(clientp->adapter, I2C_FUNC_I2C)) { + printk("%s: functionality check failed\n", __func__); + ret = -ENODEV; + goto exit_check_functionality_failed; + } + + taos_datap = kmalloc(sizeof(struct taos_data), GFP_KERNEL); + if (!taos_datap) { + printk(KERN_ERR "TAOS: kmalloc for struct taos_data failed in taos_init()\n"); + //return -ENOMEM; + ret = -ENOMEM; + goto exit_request_memory_failed; + } + memset(taos_datap, 0, sizeof(struct taos_data)); + taos_datap->reg_vdd = reg_vdd; + + // get chip id + chip_id = i2c_smbus_read_byte_data(clientp, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_CNTRL + 0x12))); //iVIZM + printk(" toas1 chip_id = %d\n",chip_id); + if(chip_id < 0) { + ret = chip_id; + goto exit_request_memory_failed; + } + + tmd2771_pls_pininit(pdata->irq_gpio_number); + + + /*get irq*/ + clientp->irq = gpio_to_irq(pdata->irq_gpio_number); + + tmd2711_pls_irq = clientp->irq; + + + taos_datap->client = clientp; + i2c_set_clientdata(clientp, taos_datap); + INIT_WORK(&(taos_datap->work),taos_work_func); + mutex_init(&taos_datap->update_lock); + + // input devices + taos_datap->input_dev = input_allocate_device();//iVIZM + if (taos_datap->input_dev == NULL) { + ret = -ENOMEM; + goto exit_input_dev_allocate_failed; + } + + taos_datap->input_dev->name = TAOS_INPUT_NAME; + taos_datap->input_dev->id.bustype = BUS_I2C; + set_bit(EV_ABS,taos_datap->input_dev->evbit); + set_bit(ABS_MISC, taos_datap->input_dev->absbit); + set_bit(ABS_DISTANCE, taos_datap->input_dev->absbit); + /*for proximity*/ + input_set_abs_params(taos_datap->input_dev, ABS_DISTANCE, 0, 1, 0, 0); + /*for lightsensor*/ + input_set_abs_params(taos_datap->input_dev, ABS_MISC, 0, 100001, 0, 0); + + ret = input_register_device(taos_datap->input_dev); + if (ret < 0) { + printk("%s: input device regist failed\n", __func__); + goto exit_input_register_failed; + } + // chip init + if(taos_reg_init(clientp)<0) + { + printk("%s: device init failed\n", __func__); + ret=-1; + goto exit_device_init_failed; + } + + // create char device + if ((ret = (alloc_chrdev_region(&taos_dev_number, 0, TAOS_MAX_NUM_DEVICES, TAOS_DEVICE_NAME))) < 0) { + printk(KERN_ERR "TAOS: alloc_chrdev_region() failed in taos_init()\n"); + goto exit_chrdev_region_failed; + } + taos_class = class_create(THIS_MODULE, TAOS_DEVICE_NAME); + cdev_init(&taos_datap->cdev, &taos_fops); + taos_datap->cdev.owner = THIS_MODULE; + if ((ret = (cdev_add(&taos_datap->cdev, taos_dev_number, 1))) < 0) { + printk(KERN_ERR "TAOS: cdev_add() failed in taos_init()\n"); + goto exit_chrdev_add_failed; + } + wake_lock_init(&taos_datap->taos_wake_lock, WAKE_LOCK_SUSPEND, "taos-wake-lock"); + device_create(taos_class, NULL, MKDEV(MAJOR(taos_dev_number), 0), &taos_driver ,"taos"); + + + + // interrupt + ret = request_irq(tmd2711_pls_irq,taos_irq_handler, IRQ_TYPE_EDGE_FALLING, "taos_irq",taos_datap);//iVIZM + if (ret != 0) { + goto irq_request_err; + } + disable_irq(tmd2711_pls_irq);//iVIZM + for(i = 0; i < 50; i++) + taos_als_get_data(); + + printk("%s probe success!\n", __func__); + return (ret); + +irq_request_err: + device_destroy(taos_class, MKDEV(MAJOR(taos_dev_number), 0)); + gpio_free(pdata->irq_gpio_number); +exit_chrdev_add_failed: + cdev_del(&taos_datap->cdev); + class_destroy(taos_class); +exit_chrdev_region_failed: + unregister_chrdev_region(taos_dev_number, TAOS_MAX_NUM_DEVICES); +exit_device_init_failed: +exit_input_register_failed: + input_free_device(taos_datap->input_dev); +exit_input_dev_allocate_failed: +exit_device_register_failed: + kfree(taos_datap); +exit_request_memory_failed: +exit_check_functionality_failed: + //wake_lock_destroy(&pls_delayed_work_wake_lock); + printk("kl %s: Probe Fail!\n",__func__); + return ret; +} +# if 0 +//resume iVIZM +static int taos_resume(struct i2c_client *client) { + u8 reg_val = 0,reg_cntrl = 0; + int ret = -1; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in taos_resume\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ( taos_datap->working == 1) { + taos_datap->working = 0; + reg_cntrl = reg_val | TAOS_TRITON_CNTL_PWRON; + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_off\n"); + return (ret); + } + } + enable_irq(tmd2711_pls_irq); + return ret; +} + +//suspend iVIZM +static int taos_suspend(struct i2c_client *client, pm_message_t mesg) { + u8 reg_val = 0,reg_cntrl = 0; + int ret = -1; + disable_irq(tmd2711_pls_irq); + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in taos_resume\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if (reg_val & TAOS_TRITON_CNTL_PWRON) { + taos_datap->working = 1; + reg_cntrl = reg_val & (~TAOS_TRITON_CNTL_PWRON); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in taos_suspend\n"); + return (ret); + } + } + return ret; +} +#endif +// client remove +static int __devexit taos_remove(struct i2c_client *client) { + int ret = 0; + +#if 1 // zwj mv from taos_exit + unregister_chrdev_region(taos_dev_number, TAOS_MAX_NUM_DEVICES); + device_destroy(taos_class, MKDEV(MAJOR(taos_dev_number), 0)); + cdev_del(&taos_datap->cdev); + class_destroy(taos_class); + disable_irq(tmd2711_pls_irq);//iVIZM + //if (taos_wq) + // destroy_workqueue(taos_wq);//iVIZM + kfree(taos_datap); +#endif + + return (ret); +} + +// open +static int taos_open(struct inode *inode, struct file *file) { + struct taos_data *taos_datap; + int ret = 0; + + device_released = 0; + taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); + if (strcmp(taos_datap->taos_name, TAOS_DEVICE_ID) != 0) { + printk(KERN_ERR "TAOS: device name incorrect during taos_open(), get %s\n", taos_datap->taos_name); + ret = -ENODEV; + } + + enable_irq(tmd2711_pls_irq);//iVIZM + return (ret); +} + +// release +static int taos_release(struct inode *inode, struct file *file) { + struct taos_data *taos_datap; + int ret = 0; + + device_released = 1; + prox_on = 0; + prox_history_hi = 0; + prox_history_lo = 0; + taos_datap = container_of(inode->i_cdev, struct taos_data, cdev); + if (strcmp(taos_datap->taos_name, TAOS_DEVICE_ID) != 0) { + printk(KERN_ERR "TAOS: device name incorrect during taos_release(), get %s\n", taos_datap->taos_name); + ret = -ENODEV; + } + disable_irq(tmd2711_pls_irq); + return (ret); +} + +static int taos_sensors_als_on(void) { + int ret = 0, i = 0; + u8 itime = 0, reg_val = 0, reg_cntrl = 0; + //int lux_val = 0, ret = 0, i = 0, tmp = 0; + +// printk("kl# %s, line=%d \n", __func__, __LINE__); + + for (i = 0; i < TAOS_FILTER_DEPTH; i++) + lux_history[i] = -ENODATA; + //taos_als_threshold_set();//iVIZM + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_ALS_INTCLR)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + itime = (((taos_cfgp->als_time/50) * 18) - 1); + itime = (~itime); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_ALS_TIME), itime))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_INTERRUPT), taos_cfgp->prox_intr_filter))) < 0) {//golden + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & 0xFC; + reg_val = reg_val | (taos_cfgp->gain & 0x03); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + //if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + // printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + // return (ret); + //} + //reg_val = i2c_smbus_read_byte(taos_datap->client); + //reg_cntrl = reg_val | (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_ALS_INT_ENBL); + reg_cntrl = (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_ALS_INT_ENBL); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + + mdelay(100); + + taos_als_threshold_set();//iVIZM + return ret; +} + +// ioctls +//static int taos_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { +static int taos_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { + int prox_sum = 0, prox_mean = 0, prox_max = 0; + int lux_val = 0, ret = 0, i = 0, tmp = 0; + u16 gain_trim_val = 0; + u8 reg_val = 0, reg_cntrl = 0; + int ret_check=0; + int ret_m=0; + u8 reg_val_temp=0; + + printk("k#### %s, line=%d \n", __func__, __LINE__); + + switch (cmd) { + case TAOS_IOCTL_SENSOR_CHECK: + reg_val_temp=0; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_CHECK failed\n"); + return (ret); + } + reg_val_temp = i2c_smbus_read_byte(taos_datap->client); + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_CHECK,prox_adc_time,%d~\n",reg_val_temp); + if ((reg_val_temp & 0xFF) == 0xF) + return -ENODATA; + + break; + + case TAOS_IOCTL_SENSOR_CONFIG: + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_CONFIG,test01~\n"); + ret = copy_from_user(taos_cfgp, (struct taos_cfg *)arg, sizeof(struct taos_cfg)); + if (ret) { + printk(KERN_ERR "TAOS: copy_from_user failed in ioctl config_set\n"); + return -ENODATA; + } + + break; + + case TAOS_IOCTL_SENSOR_ON: + ret=0; + reg_val=0; + ret_m=0; + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test01~\n"); + +#if 0 + /*decide the numbers of sensors*/ + ret_m=taos_sensor_mark(); + if(ret_m <0){ + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, error~~\n"); + return -1; + } + if(ret_m ==0){ + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, num >0 ~~\n"); + return 1; + } +#endif +#if 1 + /*Register init and turn off */ + for (i = 0; i < TAOS_FILTER_DEPTH; i++){ + /*Rambo ??*/ + lux_history[i] = -ENODATA; + } +#endif + +#if 0 + for (i = 0; i < sizeof(taos_triton_reg_init); i++){ + if(i !=11){ + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|(TAOS_TRITON_CNTRL +i)), taos_triton_reg_init[i]))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + } + } +#endif + /*ALS interrupt clear*/ + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_ALS_INTCLR)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test02~\n"); + /*Register setting*/ +#if 0 + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } +#endif + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test03,prox_int_time,%d~\n",taos_cfgp->prox_int_time); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_ALS_TIME), taos_cfgp->prox_int_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test04,prox_adc_time,%d~\n",taos_cfgp->prox_adc_time); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_PRX_TIME), taos_cfgp->prox_adc_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test05,prox_wait_time,%d~\n", taos_cfgp->prox_wait_time); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_WAIT_TIME), taos_cfgp->prox_wait_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test05-1,prox_intr_filter,%d~\n", taos_cfgp->prox_intr_filter); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_INTERRUPT), taos_cfgp->prox_intr_filter))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test06,prox_config,%d~\n",taos_cfgp->prox_config); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_PRX_CFG), taos_cfgp->prox_config))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test06,prox_pulse_cnt,%d~\n",taos_cfgp->prox_pulse_cnt); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_PRX_COUNT), taos_cfgp->prox_pulse_cnt))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + /*gain*/ +#if 0 + reg_val_temp=0; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val_temp = i2c_smbus_read_byte(taos_datap->client); + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test07-1,gain_init&0xC,%d~\n",reg_val_temp&0xC); + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test07-2,prox_gain&0xFC,%d~\n",(taos_cfgp->prox_gain&0xFC)); + reg_val_temp=(taos_cfgp->prox_gain&0xFC)|(reg_val_temp&0xC); + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test07,%d~\n",reg_val_temp); +#endif + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_GAIN), taos_cfgp->prox_gain))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + /*turn on*/ +#if 0 + reg_val_temp=0; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val_temp = i2c_smbus_read_byte(taos_datap->client); + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test08-1,%d~\n",reg_val_temp); + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test08-2,%d~\n",(reg_val_temp&0x40)); + reg_val_temp=(0xF&0x3F)|(reg_val_temp&0x40); + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, test08,%d~\n",reg_val_temp); +#endif + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CNTRL), 0xF))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + break; + + + case TAOS_IOCTL_SENSOR_OFF: + ret=0; + reg_val=0; + ret_check=0; + ret_m=0; + +#if 0 + /*chech the num of used sensor*/ + ret_check=taos_sensor_check(); + + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_OFF,test01~\n"); + if(ret_check <0){ + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_OFF, error~~\n"); + return -1; + } + if(ret_check ==0){ + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_ON, num >1 ~~\n"); + return 1; + } +#endif + /*turn off*/ + printk(KERN_ERR "TAOS: TAOS_IOCTL_SENSOR_OFF,test02~\n"); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x00), 0x00))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_off\n"); + return (ret); + } + + break; + case TAOS_IOCTL_ALS_ON: + printk("####################################\n"); + printk("######## TAOS IOCTL ALS ON #########\n"); + printk("####################################\n"); + + + printk("taos==== TAOS IOCTL ALS ON ===00==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + + if ((reg_val & TAOS_TRITON_CNTL_PROX_DET_ENBL) == 0x0) { + printk("taos==== TAOS_IOCTL_ALS_ON ===TAOS_IOCTL_PROX_OFF\n"); + taos_sensors_als_on(); + } + + /* for (i = 0; i < TAOS_FILTER_DEPTH; i++) + lux_history[i] = -ENODATA; + //taos_als_threshold_set();//iVIZM + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_CMD_SPL_FN|TAOS_TRITON_CMD_ALS_INTCLR)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + itime = (((taos_cfgp->als_time/50) * 18) - 1); + itime = (~itime); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_ALS_TIME), itime))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|TAOS_TRITON_INTERRUPT), taos_cfgp->prox_intr_filter))) < 0) {//golden + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_on\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_val = reg_val & 0xFC; + reg_val = reg_val | (taos_cfgp->gain & 0x03); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_GAIN), reg_val))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_cntrl = reg_val | (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_ALS_INT_ENBL); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + taos_als_threshold_set();//iVIZM + */ + ALS_ON = 1; + printk("taos==== TAOS IOCTL ALS ON ===11==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + return (ret); + break; + case TAOS_IOCTL_ALS_OFF: + printk("#####################################\n"); + printk("######## TAOS IOCTL ALS OFF #########\n"); + printk("#####################################\n"); + + printk("taos==== TAOS IOCTL ALS OFF ===00==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + + for (i = 0; i < TAOS_FILTER_DEPTH; i++) + lux_history[i] = -ENODATA; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & TAOS_TRITON_CNTL_PROX_DET_ENBL) == 0x0) { + + printk("taos==== TAOS_IOCTL_ALS_OFF ===TAOS_IOCTL_PROX_OFF\n"); + + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), 0x00))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_off\n"); + return (ret); + } + cancel_work_sync(&taos_datap->work);//golden + // reg_cntrl = reg_val & (~TAOS_TRITON_CNTL_ALS_INT_ENBL); + // } else { + // reg_cntrl = reg_val & (~(TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_ALS_INT_ENBL)); + // printk("===========cancel_work_sync======als====\n"); + // cancel_work_sync(&taos_datap->work);//golden + // } + // if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + // printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_off\n"); + // return (ret); + } + ALS_ON = 0; + printk("taos==== TAOS IOCTL ALS OFF ===11==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + return (ret); + break; + case TAOS_IOCTL_ALS_DATA: + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) != (TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_PWRON)) + return -ENODATA; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_data\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & TAOS_TRITON_STATUS_ADCVALID) != TAOS_TRITON_STATUS_ADCVALID) + return -ENODATA; + if ((lux_val = taos_get_lux()) < 0) + printk(KERN_ERR "TAOS: call to taos_get_lux() returned error %d in ioctl als_data\n", lux_val); + //lux_val = taos_lux_filter(lux_val); + return (lux_val); + break; + case TAOS_IOCTL_ALS_CALIBRATE: + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & 0x07) != 0x07) + return -ENODATA; + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_STATUS)))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + + return (ret); + } + reg_val = i2c_smbus_read_byte(taos_datap->client); + if ((reg_val & 0x01) != 0x01) + return -ENODATA; + if ((lux_val = taos_get_lux()) < 0) { + printk(KERN_ERR "TAOS: call to lux_val() returned error %d in ioctl als_data\n", lux_val); + return (lux_val); + } + gain_trim_val = (u16)(((taos_cfgp->calibrate_target) * 512)/lux_val); + taos_cfgp->gain_trim = (int)gain_trim_val; + return ((int)gain_trim_val); + break; + case TAOS_IOCTL_CONFIG_GET: + ret = copy_to_user((struct taos_cfg *)arg, taos_cfgp, sizeof(struct taos_cfg)); + if (ret) { + printk(KERN_ERR "TAOS: copy_to_user failed in ioctl config_get\n"); + return -ENODATA; + } + return (ret); + break; + case TAOS_IOCTL_CONFIG_SET: + printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); + printk("^^^^^^^^^ TAOS INCTL CONFIG SET ^^^^^^^\n"); + printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); + ret = copy_from_user(taos_cfgp, (struct taos_cfg *)arg, sizeof(struct taos_cfg)); + if (ret) { + printk(KERN_ERR "TAOS: copy_from_user failed in ioctl config_set\n"); + return -ENODATA; + } + if(taos_cfgp->als_time < 50) + taos_cfgp->als_time = 50; + if(taos_cfgp->als_time > 650) + taos_cfgp->als_time = 650; + tmp = (taos_cfgp->als_time + 25)/50; + taos_cfgp->als_time = tmp*50; + sat_als = (256 - taos_cfgp->prox_int_time) << 10; + sat_prox = (256 - taos_cfgp->prox_adc_time) << 10; + break; + case TAOS_IOCTL_PROX_ON: + printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); + printk("^^^^^^^^^ TAOS IOCTL PROX ON ^^^^^^^\n"); + printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); + + printk("taos==== TAOS_IOCTL_PROX_ON ===00==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + + prox_on = 1; + + + reg_cntrl = TAOS_TRITON_CNTL_PROX_DET_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_PROX_INT_ENBL | + TAOS_TRITON_CNTL_ADC_ENBL | TAOS_TRITON_CNTL_WAIT_TMR_ENBL ; + + printk("taos==== TAOS_IOCTL_PROX_ON ===00==reg_cntrl=%x\n",reg_cntrl); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x01), taos_cfgp->prox_int_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x02), taos_cfgp->prox_adc_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), taos_cfgp->prox_wait_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0C), taos_cfgp->prox_intr_filter))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0D), taos_cfgp->prox_config))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0E), taos_cfgp->prox_pulse_cnt))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0F), taos_cfgp->prox_gain))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + //if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + // printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl prox_on\n"); + // return (ret); + //} + //reg_val = i2c_smbus_read_byte(taos_datap->client); + //reg_cntrl = reg_val | (TAOS_TRITON_CNTL_PROX_DET_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_PROX_INT_ENBL | TAOS_TRITON_CNTL_ADC_ENBL); + + mdelay(100); + + taos_prox_threshold_set();//iVIZM + + printk("taos==== TAOS_IOCTL_PROX_ON ===11==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + break; + case TAOS_IOCTL_PROX_OFF: + printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); + printk("^^^^^^^^^ TAOS IOCTL PROX OFF ^^^^^^^\n"); + printk("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); + + + printk("taos==== TAOS_IOCTL_PROX_OFF ===00==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + //if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + // printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl als_calibrate\n"); + // return (ret); + //} + //reg_val = i2c_smbus_read_byte(taos_datap->client); + //if (reg_val & TAOS_TRITON_CNTL_ALS_INT_ENBL) { + // reg_cntrl = reg_val & (~(TAOS_TRITON_CNTL_PROX_DET_ENBL | TAOS_TRITON_CNTL_PROX_INT_ENBL)); + //} else { + // reg_cntrl = reg_val & (~(TAOS_TRITON_CNTL_PROX_DET_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_PROX_INT_ENBL)); + //reg_cntrl = reg_val & (~(TAOS_TRITON_CNTL_PROX_DET_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_PROX_INT_ENBL)); + // printk("===========cancel_work_sync=====prox=====\n"); + // cancel_work_sync(&taos_datap->work);//golden + //} + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), 0x00))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_off\n"); + return (ret); + } + if (ALS_ON == 1) { + taos_sensors_als_on(); + } else { + cancel_work_sync(&taos_datap->work);//golden + } + prox_on = 0; + printk("taos==== TAOS_IOCTL_PROX_OFF ===11==ALS_ON=%d prox_on=%d\n",ALS_ON,prox_on); + break; + case TAOS_IOCTL_PROX_DATA: + //Rambo +#if 1 + if ((ret = taos_prox_poll(prox_cur_infop)) < 0) { + printk(KERN_ERR "TAOS: call to prox_poll failed in taos_prox_poll_timer_func()\n"); + return ret; + } +#endif + ret = copy_to_user((struct taos_prox_info *)arg, prox_cur_infop, sizeof(struct taos_prox_info)); + if (ret) { + printk(KERN_ERR "TAOS: copy_to_user failed in ioctl prox_data\n"); + return -ENODATA; + } + return (ret); + break; + case TAOS_IOCTL_PROX_EVENT: + if ((ret = taos_prox_poll(prox_cur_infop)) < 0) { + printk(KERN_ERR "TAOS: call to prox_poll failed in taos_prox_poll_timer_func()\n"); + return ret; + } + + return (prox_cur_infop->prox_event); + break; + case TAOS_IOCTL_PROX_CALIBRATE: + //if (prox_on) golden + //del_timer(&prox_poll_timer); + //else { + //printk(KERN_ERR "TAOS: ioctl prox_calibrate was called before ioctl prox_on was called\n"); + //return -EPERM; + //} + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x01), taos_cfgp->prox_int_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x02), taos_cfgp->prox_adc_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x03), taos_cfgp->prox_wait_time))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0D), taos_cfgp->prox_config))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0E), taos_cfgp->prox_pulse_cnt))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|0x0F), taos_cfgp->prox_gain))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + //if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL)))) < 0) { + // printk(KERN_ERR "TAOS: i2c_smbus_write_byte failed in ioctl prox_on\n"); + // return (ret); + //} + //reg_val = i2c_smbus_read_byte(taos_datap->client); + reg_cntrl = reg_val | (TAOS_TRITON_CNTL_PROX_DET_ENBL | TAOS_TRITON_CNTL_PWRON | TAOS_TRITON_CNTL_ADC_ENBL); + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CNTRL), reg_cntrl))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl prox_on\n"); + return (ret); + } + + prox_sum = 0; + prox_max = 0; + for (i = 0; i < 20; i++) { + if ((ret = taos_prox_poll(&prox_cal_info[i])) < 0) { + printk(KERN_ERR "TAOS: call to prox_poll failed in ioctl prox_calibrate\n"); + return (ret); + } + prox_sum += prox_cal_info[i].prox_data; + if (prox_cal_info[i].prox_data > prox_max) + prox_max = prox_cal_info[i].prox_data; + mdelay(100); + } + prox_mean = prox_sum/20; + taos_cfgp->prox_threshold_hi = ((((prox_max - prox_mean) * 200) + 50)/100) + prox_mean; + taos_cfgp->prox_threshold_lo = ((((prox_max - prox_mean) * 170) + 50)/100) + prox_mean; + printk("TAOS:------------ taos_cfgp->prox_threshold_hi = %d\n",taos_cfgp->prox_threshold_hi ); + printk("TAOS:------------ taos_cfgp->prox_threshold_lo = %d\n",taos_cfgp->prox_threshold_lo ); + // if (taos_cfgp->prox_threshold_lo < ((sat_prox*12)/100)) { + // taos_cfgp->prox_threshold_lo = ((sat_prox*12)/100); + // taos_cfgp->prox_threshold_hi = ((sat_prox*15)/100); + // } + for (i = 0; i < sizeof(taos_triton_reg_init); i++){ + if(i !=11){ + if ((ret = (i2c_smbus_write_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG|(TAOS_TRITON_CNTRL +i)), taos_triton_reg_init[i]))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte_data failed in ioctl als_on\n"); + return (ret); + } + } + } + + //taos_prox_poll_timer_start();//Rambo + break; + default: + return -EINVAL; + break; + } + return (ret); +} + +// read/calculate lux value +static int taos_get_lux(void) { + u16 raw_clear = 0, raw_ir = 0, raw_lux = 0; + u32 lux = 0; + u32 ratio = 0; + u8 dev_gain = 0; + u16 Tint = 0; + struct lux_data *p; + int ret = 0; + u8 chdata[4]; + int tmp = 0, i = 0; + + for (i = 0; i < 4; i++) { + if ((ret = (i2c_smbus_write_byte(taos_datap->client, (TAOS_TRITON_CMD_REG | (TAOS_TRITON_ALS_CHAN0LO + i))))) < 0) { + printk(KERN_ERR "TAOS: i2c_smbus_write_byte() to chan0/1/lo/hi reg failed in taos_get_lux()\n"); + return (ret); + } + chdata[i] = i2c_smbus_read_byte(taos_datap->client); + printk("ch(%d),data=%d\n",i,chdata[i]); + } + printk("ch0=%d\n",chdata[0]+chdata[1]*256); + printk("ch1=%d\n",chdata[2]+chdata[3]*256); + + tmp = (taos_cfgp->als_time + 25)/50; //if atime =100 tmp = (atime+25)/50=2.5 tine = 2.7*(256-atime)= 412.5 + TritonTime.numerator = 1; + TritonTime.denominator = tmp; + + tmp = 300 * taos_cfgp->als_time; //tmp = 300*atime 400 + if(tmp > 65535) + tmp = 65535; + TritonTime.saturation = tmp; + raw_clear = chdata[1]; + raw_clear <<= 8; + raw_clear |= chdata[0]; + raw_ir = chdata[3]; + raw_ir <<= 8; + raw_ir |= chdata[2]; + + raw_clear *= (taos_cfgp->scale_factor *11 ); + raw_ir *= (taos_cfgp->scale_factor *3 ); + + if(raw_ir > raw_clear) { + raw_lux = raw_ir; + raw_ir = raw_clear; + raw_clear = raw_lux; + } + dev_gain = taos_triton_gain_table[taos_cfgp->gain & 0x3]; + if(raw_clear >= lux_timep->saturation) + return(TAOS_MAX_LUX); + if(raw_ir >= lux_timep->saturation) + return(TAOS_MAX_LUX); + if(raw_clear == 0) + return(0); + if(dev_gain == 0 || dev_gain > 127) { + printk(KERN_ERR "TAOS: dev_gain = 0 or > 127 in taos_get_lux()\n"); + return -1; + } + if(lux_timep->denominator == 0) { + printk(KERN_ERR "TAOS: lux_timep->denominator = 0 in taos_get_lux()\n"); + return -1; + } + ratio = (raw_ir<<15)/raw_clear; + for (p = lux_tablep; p->ratio && p->ratio < ratio; p++); + if(!p->ratio) {//iVIZM + if(lux_history[0] < 0) + return 0; + else + return lux_history[0]; + } + Tint = taos_cfgp->als_time; + raw_clear = ((raw_clear*400 + (dev_gain>>1))/dev_gain + (Tint>>1))/Tint; + raw_ir = ((raw_ir*400 +(dev_gain>>1))/dev_gain + (Tint>>1))/Tint; + lux = ((raw_clear*(p->clear)) - (raw_ir*(p->ir))); + lux = (lux + 32768)/65536; + if(lux > TAOS_MAX_LUX) { + lux = TAOS_MAX_LUX; + } + //return(lux)*taos_cfgp->filter_count; + return(lux); +} + +/*static int taos_lux_filter(int lux) +{ + static u8 middle[] = {1,0,2,0,0,2,0,1}; + int index; + + lux_history[2] = lux_history[1]; + lux_history[1] = lux_history[0]; + lux_history[0] = lux; + + if(lux_history[2] < 0) { //iVIZM + if(lux_history[1] > 0) + return lux_history[1]; + else + return lux_history[0]; + } + index = 0; + if( lux_history[0] > lux_history[1] ) + index += 4; + if( lux_history[1] > lux_history[2] ) + index += 2; + if( lux_history[0] > lux_history[2] ) + index++; + return(lux_history[middle[index]]); +}*/ + + +// verify device +static int taos_device_name(unsigned char *bufp, char **device_name) { + if( (bufp[0x12]&0x00)!=0x00) + return(0); + //if(bufp[0x10]|bufp[0x1a]|bufp[0x1b]|bufp[0x1c]|bufp[0x1d]|bufp[0x1e]) + // return(0); + if(bufp[0x13]&0x0c) + return(0); + *device_name="tritonFN"; + return(1); +} + +// proximity poll +static int taos_prox_poll(struct taos_prox_info *prxp) { + //static int event = 0; + //u16 status = 0; + int i = 0, ret = 0; //wait_count = 0; + u8 chdata[6]; + + for (i = 0; i < 6; i++) { + chdata[i] = (i2c_smbus_read_byte_data(taos_datap->client, (TAOS_TRITON_CMD_REG | TAOS_TRITON_CMD_AUTO | (TAOS_TRITON_ALS_CHAN0LO + i)))); + } + prxp->prox_clear = chdata[1]; + prxp->prox_clear <<= 8; + prxp->prox_clear |= chdata[0]; + if (prxp->prox_clear > ((sat_als*80)/100)) + return -ENODATA; + prxp->prox_data = chdata[5]; + prxp->prox_data <<= 8; + prxp->prox_data |= chdata[4]; + + return (ret); +} + +// prox poll timer function +static void taos_prox_poll_timer_func(unsigned long param) { + int ret = 0; + + if (!device_released) { + if ((ret = taos_prox_poll(prox_cur_infop)) < 0) { + printk(KERN_ERR "TAOS: call to prox_poll failed in taos_prox_poll_timer_func()\n"); + return; + } + taos_prox_poll_timer_start(); + } + return; +} + +// start prox poll timer +static void taos_prox_poll_timer_start(void) { + init_timer(&prox_poll_timer); + prox_poll_timer.expires = jiffies + (HZ/10); + prox_poll_timer.function = taos_prox_poll_timer_func; + add_timer(&prox_poll_timer); + return; +} + +// driver init +static int __init taos_init(void) { + int ret = 0, i = 0, k = 0; + //struct i2c_adapter *my_adap; + + //tmd2711_pls_config_pins(); + //LDO_TurnOnLDO(LDO_LDO_VDD28); + //printk(KERN_ERR "TAOS:init()\n"); + + if ((ret = (i2c_add_driver(&taos_driver))) < 0) { + printk(KERN_ERR "TAOS: i2c_add_driver() failed in taos_init()\n"); + return (ret); + } + //printk(KERN_ERR "TAOS:end(ret [%d])\n ",ret); + return (ret); +} + +// driver exit +static void __exit taos_exit(void) { + i2c_del_driver(&taos_driver); +} + +MODULE_AUTHOR("John Koshi - Surya Software"); +MODULE_DESCRIPTION("TAOS ambient light and proximity sensor driver"); +MODULE_LICENSE("GPL"); + +module_init(taos_init); +module_exit(taos_exit); + diff --git a/drivers/input/misc/twl4030-pwrbutton.c b/drivers/input/misc/twl4030-pwrbutton.c new file mode 100644 index 00000000..b9a05fda --- /dev/null +++ b/drivers/input/misc/twl4030-pwrbutton.c @@ -0,0 +1,125 @@ +/** + * twl4030-pwrbutton.c - TWL4030 Power Button Input Driver + * + * Copyright (C) 2008-2009 Nokia Corporation + * + * Written by Peter De Schrijver + * Several fixes by Felipe Balbi + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PWR_PWRON_IRQ (1 << 0) + +#define STS_HW_CONDITIONS 0xf + +static irqreturn_t powerbutton_irq(int irq, void *_pwr) +{ + struct input_dev *pwr = _pwr; + int err; + u8 value; + + err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &value, STS_HW_CONDITIONS); + if (!err) { + pm_wakeup_event(pwr->dev.parent, 0); + input_report_key(pwr, KEY_POWER, value & PWR_PWRON_IRQ); + input_sync(pwr); + } else { + dev_err(pwr->dev.parent, "twl4030: i2c error %d while reading" + " TWL4030 PM_MASTER STS_HW_CONDITIONS register\n", err); + } + + return IRQ_HANDLED; +} + +static int __init twl4030_pwrbutton_probe(struct platform_device *pdev) +{ + struct input_dev *pwr; + int irq = platform_get_irq(pdev, 0); + int err; + + pwr = input_allocate_device(); + if (!pwr) { + dev_dbg(&pdev->dev, "Can't allocate power button\n"); + return -ENOMEM; + } + + pwr->evbit[0] = BIT_MASK(EV_KEY); + pwr->keybit[BIT_WORD(KEY_POWER)] = BIT_MASK(KEY_POWER); + pwr->name = "twl4030_pwrbutton"; + pwr->phys = "twl4030_pwrbutton/input0"; + pwr->dev.parent = &pdev->dev; + + err = request_threaded_irq(irq, NULL, powerbutton_irq, + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + "twl4030_pwrbutton", pwr); + if (err < 0) { + dev_dbg(&pdev->dev, "Can't get IRQ for pwrbutton: %d\n", err); + goto free_input_dev; + } + + err = input_register_device(pwr); + if (err) { + dev_dbg(&pdev->dev, "Can't register power button: %d\n", err); + goto free_irq; + } + + platform_set_drvdata(pdev, pwr); + + return 0; + +free_irq: + free_irq(irq, pwr); +free_input_dev: + input_free_device(pwr); + return err; +} + +static int __exit twl4030_pwrbutton_remove(struct platform_device *pdev) +{ + struct input_dev *pwr = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + free_irq(irq, pwr); + input_unregister_device(pwr); + + return 0; +} + +static struct platform_driver twl4030_pwrbutton_driver = { + .remove = __exit_p(twl4030_pwrbutton_remove), + .driver = { + .name = "twl4030_pwrbutton", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver_probe(twl4030_pwrbutton_driver, + twl4030_pwrbutton_probe); + +MODULE_ALIAS("platform:twl4030_pwrbutton"); +MODULE_DESCRIPTION("Triton2 Power Button"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Peter De Schrijver "); +MODULE_AUTHOR("Felipe Balbi "); + diff --git a/drivers/input/misc/twl4030-vibra.c b/drivers/input/misc/twl4030-vibra.c new file mode 100644 index 00000000..68a5f331 --- /dev/null +++ b/drivers/input/misc/twl4030-vibra.c @@ -0,0 +1,263 @@ +/* + * twl4030-vibra.c - TWL4030 Vibrator driver + * + * Copyright (C) 2008-2010 Nokia Corporation + * + * Written by Henrik Saari + * Updates by Felipe Balbi + * Input by Jari Vanhala + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* MODULE ID2 */ +#define LEDEN 0x00 + +/* ForceFeedback */ +#define EFFECT_DIR_180_DEG 0x8000 /* range is 0 - 0xFFFF */ + +struct vibra_info { + struct device *dev; + struct input_dev *input_dev; + + struct work_struct play_work; + + bool enabled; + int speed; + int direction; + + bool coexist; +}; + +static void vibra_disable_leds(void) +{ + u8 reg; + + /* Disable LEDA & LEDB, cannot be used with vibra (PWM) */ + twl_i2c_read_u8(TWL4030_MODULE_LED, ®, LEDEN); + reg &= ~0x03; + twl_i2c_write_u8(TWL4030_MODULE_LED, LEDEN, reg); +} + +/* Powers H-Bridge and enables audio clk */ +static void vibra_enable(struct vibra_info *info) +{ + u8 reg; + + twl4030_audio_enable_resource(TWL4030_AUDIO_RES_POWER); + + /* turn H-Bridge on */ + twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, + ®, TWL4030_REG_VIBRA_CTL); + twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, + (reg | TWL4030_VIBRA_EN), TWL4030_REG_VIBRA_CTL); + + twl4030_audio_enable_resource(TWL4030_AUDIO_RES_APLL); + + info->enabled = true; +} + +static void vibra_disable(struct vibra_info *info) +{ + u8 reg; + + /* Power down H-Bridge */ + twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, + ®, TWL4030_REG_VIBRA_CTL); + twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, + (reg & ~TWL4030_VIBRA_EN), TWL4030_REG_VIBRA_CTL); + + twl4030_audio_disable_resource(TWL4030_AUDIO_RES_APLL); + twl4030_audio_disable_resource(TWL4030_AUDIO_RES_POWER); + + info->enabled = false; +} + +static void vibra_play_work(struct work_struct *work) +{ + struct vibra_info *info = container_of(work, + struct vibra_info, play_work); + int dir; + int pwm; + u8 reg; + + dir = info->direction; + pwm = info->speed; + + twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, + ®, TWL4030_REG_VIBRA_CTL); + if (pwm && (!info->coexist || !(reg & TWL4030_VIBRA_SEL))) { + + if (!info->enabled) + vibra_enable(info); + + /* set vibra rotation direction */ + twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, + ®, TWL4030_REG_VIBRA_CTL); + reg = (dir) ? (reg | TWL4030_VIBRA_DIR) : + (reg & ~TWL4030_VIBRA_DIR); + twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, + reg, TWL4030_REG_VIBRA_CTL); + + /* set PWM, 1 = max, 255 = min */ + twl_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, + 256 - pwm, TWL4030_REG_VIBRA_SET); + } else { + if (info->enabled) + vibra_disable(info); + } +} + +/*** Input/ForceFeedback ***/ + +static int vibra_play(struct input_dev *input, void *data, + struct ff_effect *effect) +{ + struct vibra_info *info = input_get_drvdata(input); + + info->speed = effect->u.rumble.strong_magnitude >> 8; + if (!info->speed) + info->speed = effect->u.rumble.weak_magnitude >> 9; + info->direction = effect->direction < EFFECT_DIR_180_DEG ? 0 : 1; + schedule_work(&info->play_work); + return 0; +} + +static void twl4030_vibra_close(struct input_dev *input) +{ + struct vibra_info *info = input_get_drvdata(input); + + cancel_work_sync(&info->play_work); + + if (info->enabled) + vibra_disable(info); +} + +/*** Module ***/ +#ifdef CONFIG_PM_SLEEP +static int twl4030_vibra_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct vibra_info *info = platform_get_drvdata(pdev); + + if (info->enabled) + vibra_disable(info); + + return 0; +} + +static int twl4030_vibra_resume(struct device *dev) +{ + vibra_disable_leds(); + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(twl4030_vibra_pm_ops, + twl4030_vibra_suspend, twl4030_vibra_resume); + +static bool twl4030_vibra_check_coexist(struct twl4030_vibra_data *pdata, + struct device_node *node) +{ + if (pdata && pdata->coexist) + return true; + + if (of_find_node_by_name(node, "codec")) + return true; + + return false; +} + +static int twl4030_vibra_probe(struct platform_device *pdev) +{ + struct twl4030_vibra_data *pdata = pdev->dev.platform_data; + struct device_node *twl4030_core_node = pdev->dev.parent->of_node; + struct vibra_info *info; + int ret; + + if (!pdata && !twl4030_core_node) { + dev_dbg(&pdev->dev, "platform_data not available\n"); + return -EINVAL; + } + + info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + info->dev = &pdev->dev; + info->coexist = twl4030_vibra_check_coexist(pdata, twl4030_core_node); + INIT_WORK(&info->play_work, vibra_play_work); + + info->input_dev = devm_input_allocate_device(&pdev->dev); + if (info->input_dev == NULL) { + dev_err(&pdev->dev, "couldn't allocate input device\n"); + return -ENOMEM; + } + + input_set_drvdata(info->input_dev, info); + + info->input_dev->name = "twl4030:vibrator"; + info->input_dev->id.version = 1; + info->input_dev->dev.parent = pdev->dev.parent; + info->input_dev->close = twl4030_vibra_close; + __set_bit(FF_RUMBLE, info->input_dev->ffbit); + + ret = input_ff_create_memless(info->input_dev, NULL, vibra_play); + if (ret < 0) { + dev_dbg(&pdev->dev, "couldn't register vibrator to FF\n"); + return ret; + } + + ret = input_register_device(info->input_dev); + if (ret < 0) { + dev_dbg(&pdev->dev, "couldn't register input device\n"); + goto err_iff; + } + + vibra_disable_leds(); + + platform_set_drvdata(pdev, info); + return 0; + +err_iff: + input_ff_destroy(info->input_dev); + return ret; +} + +static struct platform_driver twl4030_vibra_driver = { + .probe = twl4030_vibra_probe, + .driver = { + .name = "twl4030-vibra", + .owner = THIS_MODULE, + .pm = &twl4030_vibra_pm_ops, + }, +}; +module_platform_driver(twl4030_vibra_driver); + +MODULE_ALIAS("platform:twl4030-vibra"); +MODULE_DESCRIPTION("TWL4030 Vibra driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Nokia Corporation"); diff --git a/drivers/input/misc/twl6040-vibra.c b/drivers/input/misc/twl6040-vibra.c new file mode 100644 index 00000000..0c2dfc8e --- /dev/null +++ b/drivers/input/misc/twl6040-vibra.c @@ -0,0 +1,431 @@ +/* + * twl6040-vibra.c - TWL6040 Vibrator driver + * + * Author: Jorge Eduardo Candelaria + * Author: Misael Lopez Cruz + * + * Copyright: (C) 2011 Texas Instruments, Inc. + * + * Based on twl4030-vibra.c by Henrik Saari + * Felipe Balbi + * Jari Vanhala + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EFFECT_DIR_180_DEG 0x8000 + +/* Recommended modulation index 85% */ +#define TWL6040_VIBRA_MOD 85 + +#define TWL6040_NUM_SUPPLIES 2 + +struct vibra_info { + struct device *dev; + struct input_dev *input_dev; + struct workqueue_struct *workqueue; + struct work_struct play_work; + struct mutex mutex; + int irq; + + bool enabled; + int weak_speed; + int strong_speed; + int direction; + + unsigned int vibldrv_res; + unsigned int vibrdrv_res; + unsigned int viblmotor_res; + unsigned int vibrmotor_res; + + struct regulator_bulk_data supplies[TWL6040_NUM_SUPPLIES]; + + struct twl6040 *twl6040; +}; + +static irqreturn_t twl6040_vib_irq_handler(int irq, void *data) +{ + struct vibra_info *info = data; + struct twl6040 *twl6040 = info->twl6040; + u8 status; + + status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS); + if (status & TWL6040_VIBLOCDET) { + dev_warn(info->dev, "Left Vibrator overcurrent detected\n"); + twl6040_clear_bits(twl6040, TWL6040_REG_VIBCTLL, + TWL6040_VIBENA); + } + if (status & TWL6040_VIBROCDET) { + dev_warn(info->dev, "Right Vibrator overcurrent detected\n"); + twl6040_clear_bits(twl6040, TWL6040_REG_VIBCTLR, + TWL6040_VIBENA); + } + + return IRQ_HANDLED; +} + +static void twl6040_vibra_enable(struct vibra_info *info) +{ + struct twl6040 *twl6040 = info->twl6040; + int ret; + + ret = regulator_bulk_enable(ARRAY_SIZE(info->supplies), info->supplies); + if (ret) { + dev_err(info->dev, "failed to enable regulators %d\n", ret); + return; + } + + twl6040_power(info->twl6040, 1); + if (twl6040_get_revid(twl6040) <= TWL6040_REV_ES1_1) { + /* + * ERRATA: Disable overcurrent protection for at least + * 3ms when enabling vibrator drivers to avoid false + * overcurrent detection + */ + twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, + TWL6040_VIBENA | TWL6040_VIBCTRL); + twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, + TWL6040_VIBENA | TWL6040_VIBCTRL); + usleep_range(3000, 3500); + } + + twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, + TWL6040_VIBENA); + twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, + TWL6040_VIBENA); + + info->enabled = true; +} + +static void twl6040_vibra_disable(struct vibra_info *info) +{ + struct twl6040 *twl6040 = info->twl6040; + + twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLL, 0x00); + twl6040_reg_write(twl6040, TWL6040_REG_VIBCTLR, 0x00); + twl6040_power(info->twl6040, 0); + + regulator_bulk_disable(ARRAY_SIZE(info->supplies), info->supplies); + + info->enabled = false; +} + +static u8 twl6040_vibra_code(int vddvib, int vibdrv_res, int motor_res, + int speed, int direction) +{ + int vpk, max_code; + u8 vibdat; + + /* output swing */ + vpk = (vddvib * motor_res * TWL6040_VIBRA_MOD) / + (100 * (vibdrv_res + motor_res)); + + /* 50mV per VIBDAT code step */ + max_code = vpk / 50; + if (max_code > TWL6040_VIBDAT_MAX) + max_code = TWL6040_VIBDAT_MAX; + + /* scale speed to max allowed code */ + vibdat = (u8)((speed * max_code) / USHRT_MAX); + + /* 2's complement for direction > 180 degrees */ + vibdat *= direction; + + return vibdat; +} + +static void twl6040_vibra_set_effect(struct vibra_info *info) +{ + struct twl6040 *twl6040 = info->twl6040; + u8 vibdatl, vibdatr; + int volt; + + /* weak motor */ + volt = regulator_get_voltage(info->supplies[0].consumer) / 1000; + vibdatl = twl6040_vibra_code(volt, info->vibldrv_res, + info->viblmotor_res, + info->weak_speed, info->direction); + + /* strong motor */ + volt = regulator_get_voltage(info->supplies[1].consumer) / 1000; + vibdatr = twl6040_vibra_code(volt, info->vibrdrv_res, + info->vibrmotor_res, + info->strong_speed, info->direction); + + twl6040_reg_write(twl6040, TWL6040_REG_VIBDATL, vibdatl); + twl6040_reg_write(twl6040, TWL6040_REG_VIBDATR, vibdatr); +} + +static void vibra_play_work(struct work_struct *work) +{ + struct vibra_info *info = container_of(work, + struct vibra_info, play_work); + + mutex_lock(&info->mutex); + + if (info->weak_speed || info->strong_speed) { + if (!info->enabled) + twl6040_vibra_enable(info); + + twl6040_vibra_set_effect(info); + } else if (info->enabled) + twl6040_vibra_disable(info); + + mutex_unlock(&info->mutex); +} + +static int vibra_play(struct input_dev *input, void *data, + struct ff_effect *effect) +{ + struct vibra_info *info = input_get_drvdata(input); + int ret; + + /* Do not allow effect, while the routing is set to use audio */ + ret = twl6040_get_vibralr_status(info->twl6040); + if (ret & TWL6040_VIBSEL) { + dev_info(&input->dev, "Vibra is configured for audio\n"); + return -EBUSY; + } + + info->weak_speed = effect->u.rumble.weak_magnitude; + info->strong_speed = effect->u.rumble.strong_magnitude; + info->direction = effect->direction < EFFECT_DIR_180_DEG ? 1 : -1; + + ret = queue_work(info->workqueue, &info->play_work); + if (!ret) { + dev_info(&input->dev, "work is already on queue\n"); + return ret; + } + + return 0; +} + +static void twl6040_vibra_close(struct input_dev *input) +{ + struct vibra_info *info = input_get_drvdata(input); + + cancel_work_sync(&info->play_work); + + mutex_lock(&info->mutex); + + if (info->enabled) + twl6040_vibra_disable(info); + + mutex_unlock(&info->mutex); +} + +#ifdef CONFIG_PM_SLEEP +static int twl6040_vibra_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct vibra_info *info = platform_get_drvdata(pdev); + + mutex_lock(&info->mutex); + + if (info->enabled) + twl6040_vibra_disable(info); + + mutex_unlock(&info->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(twl6040_vibra_pm_ops, twl6040_vibra_suspend, NULL); + +static int twl6040_vibra_probe(struct platform_device *pdev) +{ + struct twl6040_vibra_data *pdata = pdev->dev.platform_data; + struct device *twl6040_core_dev = pdev->dev.parent; + struct device_node *twl6040_core_node = NULL; + struct vibra_info *info; + int vddvibl_uV = 0; + int vddvibr_uV = 0; + int ret; + +#ifdef CONFIG_OF + twl6040_core_node = of_find_node_by_name(twl6040_core_dev->of_node, + "vibra"); +#endif + + if (!pdata && !twl6040_core_node) { + dev_err(&pdev->dev, "platform_data not available\n"); + return -EINVAL; + } + + info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL); + if (!info) { + dev_err(&pdev->dev, "couldn't allocate memory\n"); + return -ENOMEM; + } + + info->dev = &pdev->dev; + + info->twl6040 = dev_get_drvdata(pdev->dev.parent); + if (pdata) { + info->vibldrv_res = pdata->vibldrv_res; + info->vibrdrv_res = pdata->vibrdrv_res; + info->viblmotor_res = pdata->viblmotor_res; + info->vibrmotor_res = pdata->vibrmotor_res; + vddvibl_uV = pdata->vddvibl_uV; + vddvibr_uV = pdata->vddvibr_uV; + } else { + of_property_read_u32(twl6040_core_node, "ti,vibldrv-res", + &info->vibldrv_res); + of_property_read_u32(twl6040_core_node, "ti,vibrdrv-res", + &info->vibrdrv_res); + of_property_read_u32(twl6040_core_node, "ti,viblmotor-res", + &info->viblmotor_res); + of_property_read_u32(twl6040_core_node, "ti,vibrmotor-res", + &info->vibrmotor_res); + of_property_read_u32(twl6040_core_node, "ti,vddvibl-uV", + &vddvibl_uV); + of_property_read_u32(twl6040_core_node, "ti,vddvibr-uV", + &vddvibr_uV); + } + + if ((!info->vibldrv_res && !info->viblmotor_res) || + (!info->vibrdrv_res && !info->vibrmotor_res)) { + dev_err(info->dev, "invalid vibra driver/motor resistance\n"); + return -EINVAL; + } + + info->irq = platform_get_irq(pdev, 0); + if (info->irq < 0) { + dev_err(info->dev, "invalid irq\n"); + return -EINVAL; + } + + mutex_init(&info->mutex); + + ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL, + twl6040_vib_irq_handler, 0, + "twl6040_irq_vib", info); + if (ret) { + dev_err(info->dev, "VIB IRQ request failed: %d\n", ret); + return ret; + } + + info->supplies[0].supply = "vddvibl"; + info->supplies[1].supply = "vddvibr"; + /* + * When booted with Device tree the regulators are attached to the + * parent device (twl6040 MFD core) + */ + ret = regulator_bulk_get(pdata ? info->dev : twl6040_core_dev, + ARRAY_SIZE(info->supplies), info->supplies); + if (ret) { + dev_err(info->dev, "couldn't get regulators %d\n", ret); + return ret; + } + + if (vddvibl_uV) { + ret = regulator_set_voltage(info->supplies[0].consumer, + vddvibl_uV, vddvibl_uV); + if (ret) { + dev_err(info->dev, "failed to set VDDVIBL volt %d\n", + ret); + goto err_regulator; + } + } + + if (vddvibr_uV) { + ret = regulator_set_voltage(info->supplies[1].consumer, + vddvibr_uV, vddvibr_uV); + if (ret) { + dev_err(info->dev, "failed to set VDDVIBR volt %d\n", + ret); + goto err_regulator; + } + } + + INIT_WORK(&info->play_work, vibra_play_work); + + info->input_dev = input_allocate_device(); + if (info->input_dev == NULL) { + dev_err(info->dev, "couldn't allocate input device\n"); + ret = -ENOMEM; + goto err_regulator; + } + + input_set_drvdata(info->input_dev, info); + + info->input_dev->name = "twl6040:vibrator"; + info->input_dev->id.version = 1; + info->input_dev->dev.parent = pdev->dev.parent; + info->input_dev->close = twl6040_vibra_close; + __set_bit(FF_RUMBLE, info->input_dev->ffbit); + + ret = input_ff_create_memless(info->input_dev, NULL, vibra_play); + if (ret < 0) { + dev_err(info->dev, "couldn't register vibrator to FF\n"); + goto err_ialloc; + } + + ret = input_register_device(info->input_dev); + if (ret < 0) { + dev_err(info->dev, "couldn't register input device\n"); + goto err_iff; + } + + platform_set_drvdata(pdev, info); + + return 0; + +err_iff: + input_ff_destroy(info->input_dev); +err_ialloc: + input_free_device(info->input_dev); +err_regulator: + regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies); + return ret; +} + +static int twl6040_vibra_remove(struct platform_device *pdev) +{ + struct vibra_info *info = platform_get_drvdata(pdev); + + input_unregister_device(info->input_dev); + regulator_bulk_free(ARRAY_SIZE(info->supplies), info->supplies); + + return 0; +} + +static struct platform_driver twl6040_vibra_driver = { + .probe = twl6040_vibra_probe, + .remove = twl6040_vibra_remove, + .driver = { + .name = "twl6040-vibra", + .owner = THIS_MODULE, + .pm = &twl6040_vibra_pm_ops, + }, +}; +module_platform_driver(twl6040_vibra_driver); + +MODULE_ALIAS("platform:twl6040-vibra"); +MODULE_DESCRIPTION("TWL6040 Vibra driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Jorge Eduardo Candelaria "); +MODULE_AUTHOR("Misael Lopez Cruz "); diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c new file mode 100644 index 00000000..a0a4bbae --- /dev/null +++ b/drivers/input/misc/uinput.c @@ -0,0 +1,883 @@ +/* + * User level driver support for input subsystem + * + * Heavily based on evdev.c by Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Aristeu Sergio Rozanski Filho + * + * Changes/Revisions: + * 0.3 09/04/2006 (Anssi Hannula ) + * - updated ff support for the changes in kernel interface + * - added MODULE_VERSION + * 0.2 16/10/2004 (Micah Dowty ) + * - added force feedback support + * - added UI_SET_PHYS + * 0.1 20/06/2002 + * - first public version + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../input-compat.h" + +static int uinput_dev_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + struct uinput_device *udev = input_get_drvdata(dev); + + udev->buff[udev->head].type = type; + udev->buff[udev->head].code = code; + udev->buff[udev->head].value = value; + do_gettimeofday(&udev->buff[udev->head].time); + udev->head = (udev->head + 1) % UINPUT_BUFFER_SIZE; + + wake_up_interruptible(&udev->waitq); + + return 0; +} + +/* Atomically allocate an ID for the given request. Returns 0 on success. */ +static bool uinput_request_alloc_id(struct uinput_device *udev, + struct uinput_request *request) +{ + unsigned int id; + bool reserved = false; + + spin_lock(&udev->requests_lock); + + for (id = 0; id < UINPUT_NUM_REQUESTS; id++) { + if (!udev->requests[id]) { + request->id = id; + udev->requests[id] = request; + reserved = true; + break; + } + } + + spin_unlock(&udev->requests_lock); + return reserved; +} + +static struct uinput_request *uinput_request_find(struct uinput_device *udev, + unsigned int id) +{ + /* Find an input request, by ID. Returns NULL if the ID isn't valid. */ + if (id >= UINPUT_NUM_REQUESTS) + return NULL; + + return udev->requests[id]; +} + +static int uinput_request_reserve_slot(struct uinput_device *udev, + struct uinput_request *request) +{ + /* Allocate slot. If none are available right away, wait. */ + return wait_event_interruptible(udev->requests_waitq, + uinput_request_alloc_id(udev, request)); +} + +static void uinput_request_done(struct uinput_device *udev, + struct uinput_request *request) +{ + /* Mark slot as available */ + udev->requests[request->id] = NULL; + wake_up(&udev->requests_waitq); + + complete(&request->done); +} + +static int uinput_request_send(struct uinput_device *udev, + struct uinput_request *request) +{ + int retval; + + retval = mutex_lock_interruptible(&udev->mutex); + if (retval) + return retval; + + if (udev->state != UIST_CREATED) { + retval = -ENODEV; + goto out; + } + + init_completion(&request->done); + + /* + * Tell our userspace application about this new request + * by queueing an input event. + */ + uinput_dev_event(udev->dev, EV_UINPUT, request->code, request->id); + + out: + mutex_unlock(&udev->mutex); + return retval; +} + +static int uinput_request_submit(struct uinput_device *udev, + struct uinput_request *request) +{ + int error; + + error = uinput_request_reserve_slot(udev, request); + if (error) + return error; + + error = uinput_request_send(udev, request); + if (error) { + uinput_request_done(udev, request); + return error; + } + + wait_for_completion(&request->done); + return request->retval; +} + +/* + * Fail all outstanding requests so handlers don't wait for the userspace + * to finish processing them. + */ +static void uinput_flush_requests(struct uinput_device *udev) +{ + struct uinput_request *request; + int i; + + spin_lock(&udev->requests_lock); + + for (i = 0; i < UINPUT_NUM_REQUESTS; i++) { + request = udev->requests[i]; + if (request) { + request->retval = -ENODEV; + uinput_request_done(udev, request); + } + } + + spin_unlock(&udev->requests_lock); +} + +static void uinput_dev_set_gain(struct input_dev *dev, u16 gain) +{ + uinput_dev_event(dev, EV_FF, FF_GAIN, gain); +} + +static void uinput_dev_set_autocenter(struct input_dev *dev, u16 magnitude) +{ + uinput_dev_event(dev, EV_FF, FF_AUTOCENTER, magnitude); +} + +static int uinput_dev_playback(struct input_dev *dev, int effect_id, int value) +{ + return uinput_dev_event(dev, EV_FF, effect_id, value); +} + +static int uinput_dev_upload_effect(struct input_dev *dev, + struct ff_effect *effect, + struct ff_effect *old) +{ + struct uinput_device *udev = input_get_drvdata(dev); + struct uinput_request request; + + /* + * uinput driver does not currently support periodic effects with + * custom waveform since it does not have a way to pass buffer of + * samples (custom_data) to userspace. If ever there is a device + * supporting custom waveforms we would need to define an additional + * ioctl (UI_UPLOAD_SAMPLES) but for now we just bail out. + */ + if (effect->type == FF_PERIODIC && + effect->u.periodic.waveform == FF_CUSTOM) + return -EINVAL; + + request.code = UI_FF_UPLOAD; + request.u.upload.effect = effect; + request.u.upload.old = old; + + return uinput_request_submit(udev, &request); +} + +static int uinput_dev_erase_effect(struct input_dev *dev, int effect_id) +{ + struct uinput_device *udev = input_get_drvdata(dev); + struct uinput_request request; + + if (!test_bit(EV_FF, dev->evbit)) + return -ENOSYS; + + request.code = UI_FF_ERASE; + request.u.effect_id = effect_id; + + return uinput_request_submit(udev, &request); +} + +static void uinput_destroy_device(struct uinput_device *udev) +{ + const char *name, *phys; + struct input_dev *dev = udev->dev; + enum uinput_state old_state = udev->state; + + udev->state = UIST_NEW_DEVICE; + + if (dev) { + name = dev->name; + phys = dev->phys; + if (old_state == UIST_CREATED) { + uinput_flush_requests(udev); + input_unregister_device(dev); + } else { + input_free_device(dev); + } + kfree(name); + kfree(phys); + udev->dev = NULL; + } +} + +static int uinput_create_device(struct uinput_device *udev) +{ + struct input_dev *dev = udev->dev; + int error; + + if (udev->state != UIST_SETUP_COMPLETE) { + printk(KERN_DEBUG "%s: write device info first\n", UINPUT_NAME); + return -EINVAL; + } + + if (udev->ff_effects_max) { + error = input_ff_create(dev, udev->ff_effects_max); + if (error) + goto fail1; + + dev->ff->upload = uinput_dev_upload_effect; + dev->ff->erase = uinput_dev_erase_effect; + dev->ff->playback = uinput_dev_playback; + dev->ff->set_gain = uinput_dev_set_gain; + dev->ff->set_autocenter = uinput_dev_set_autocenter; + } + + error = input_register_device(udev->dev); + if (error) + goto fail2; + + udev->state = UIST_CREATED; + + return 0; + + fail2: input_ff_destroy(dev); + fail1: uinput_destroy_device(udev); + return error; +} + +static int uinput_open(struct inode *inode, struct file *file) +{ + struct uinput_device *newdev; + + newdev = kzalloc(sizeof(struct uinput_device), GFP_KERNEL); + if (!newdev) + return -ENOMEM; + + mutex_init(&newdev->mutex); + spin_lock_init(&newdev->requests_lock); + init_waitqueue_head(&newdev->requests_waitq); + init_waitqueue_head(&newdev->waitq); + newdev->state = UIST_NEW_DEVICE; + + file->private_data = newdev; + nonseekable_open(inode, file); + + return 0; +} + +static int uinput_validate_absbits(struct input_dev *dev) +{ + unsigned int cnt; + int retval = 0; + + for (cnt = 0; cnt < ABS_CNT; cnt++) { + int min, max; + if (!test_bit(cnt, dev->absbit)) + continue; + + min = input_abs_get_min(dev, cnt); + max = input_abs_get_max(dev, cnt); + + if ((min != 0 || max != 0) && max <= min) { + printk(KERN_DEBUG + "%s: invalid abs[%02x] min:%d max:%d\n", + UINPUT_NAME, cnt, + input_abs_get_min(dev, cnt), + input_abs_get_max(dev, cnt)); + retval = -EINVAL; + break; + } + + if (input_abs_get_flat(dev, cnt) > + input_abs_get_max(dev, cnt) - input_abs_get_min(dev, cnt)) { + printk(KERN_DEBUG + "%s: abs_flat #%02x out of range: %d " + "(min:%d/max:%d)\n", + UINPUT_NAME, cnt, + input_abs_get_flat(dev, cnt), + input_abs_get_min(dev, cnt), + input_abs_get_max(dev, cnt)); + retval = -EINVAL; + break; + } + } + return retval; +} + +static int uinput_allocate_device(struct uinput_device *udev) +{ + udev->dev = input_allocate_device(); + if (!udev->dev) + return -ENOMEM; + + udev->dev->event = uinput_dev_event; + input_set_drvdata(udev->dev, udev); + + return 0; +} + +static int uinput_setup_device(struct uinput_device *udev, + const char __user *buffer, size_t count) +{ + struct uinput_user_dev *user_dev; + struct input_dev *dev; + int i; + int retval; + + if (count != sizeof(struct uinput_user_dev)) + return -EINVAL; + + if (!udev->dev) { + retval = uinput_allocate_device(udev); + if (retval) + return retval; + } + + dev = udev->dev; + + user_dev = memdup_user(buffer, sizeof(struct uinput_user_dev)); + if (IS_ERR(user_dev)) + return PTR_ERR(user_dev); + + udev->ff_effects_max = user_dev->ff_effects_max; + + /* Ensure name is filled in */ + if (!user_dev->name[0]) { + retval = -EINVAL; + goto exit; + } + + kfree(dev->name); + dev->name = kstrndup(user_dev->name, UINPUT_MAX_NAME_SIZE, + GFP_KERNEL); + if (!dev->name) { + retval = -ENOMEM; + goto exit; + } + + dev->id.bustype = user_dev->id.bustype; + dev->id.vendor = user_dev->id.vendor; + dev->id.product = user_dev->id.product; + dev->id.version = user_dev->id.version; + + for (i = 0; i < ABS_CNT; i++) { + input_abs_set_max(dev, i, user_dev->absmax[i]); + input_abs_set_min(dev, i, user_dev->absmin[i]); + input_abs_set_fuzz(dev, i, user_dev->absfuzz[i]); + input_abs_set_flat(dev, i, user_dev->absflat[i]); + } + + /* check if absmin/absmax/absfuzz/absflat are filled as + * told in Documentation/input/input-programming.txt */ + if (test_bit(EV_ABS, dev->evbit)) { + retval = uinput_validate_absbits(dev); + if (retval < 0) + goto exit; + if (test_bit(ABS_MT_SLOT, dev->absbit)) { + int nslot = input_abs_get_max(dev, ABS_MT_SLOT) + 1; + input_mt_init_slots(dev, nslot, 0); + } else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) { + input_set_events_per_packet(dev, 60); + } + } + + udev->state = UIST_SETUP_COMPLETE; + retval = count; + + exit: + kfree(user_dev); + return retval; +} + +static ssize_t uinput_inject_event(struct uinput_device *udev, + const char __user *buffer, size_t count) +{ + struct input_event ev; + + if (count < input_event_size()) + return -EINVAL; + + if (input_event_from_user(buffer, &ev)) + return -EFAULT; + + input_event(udev->dev, ev.type, ev.code, ev.value); + + return input_event_size(); +} + +static ssize_t uinput_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + struct uinput_device *udev = file->private_data; + int retval; + + if (count == 0) + return 0; + + retval = mutex_lock_interruptible(&udev->mutex); + if (retval) + return retval; + + retval = udev->state == UIST_CREATED ? + uinput_inject_event(udev, buffer, count) : + uinput_setup_device(udev, buffer, count); + + mutex_unlock(&udev->mutex); + + return retval; +} + +static bool uinput_fetch_next_event(struct uinput_device *udev, + struct input_event *event) +{ + bool have_event; + + spin_lock_irq(&udev->dev->event_lock); + + have_event = udev->head != udev->tail; + if (have_event) { + *event = udev->buff[udev->tail]; + udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE; + } + + spin_unlock_irq(&udev->dev->event_lock); + + return have_event; +} + +static ssize_t uinput_events_to_user(struct uinput_device *udev, + char __user *buffer, size_t count) +{ + struct input_event event; + size_t read = 0; + + while (read + input_event_size() <= count && + uinput_fetch_next_event(udev, &event)) { + + if (input_event_to_user(buffer + read, &event)) + return -EFAULT; + + read += input_event_size(); + } + + return read; +} + +static ssize_t uinput_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct uinput_device *udev = file->private_data; + ssize_t retval; + + if (count != 0 && count < input_event_size()) + return -EINVAL; + + do { + retval = mutex_lock_interruptible(&udev->mutex); + if (retval) + return retval; + + if (udev->state != UIST_CREATED) + retval = -ENODEV; + else if (udev->head == udev->tail && + (file->f_flags & O_NONBLOCK)) + retval = -EAGAIN; + else + retval = uinput_events_to_user(udev, buffer, count); + + mutex_unlock(&udev->mutex); + + if (retval || count == 0) + break; + + if (!(file->f_flags & O_NONBLOCK)) + retval = wait_event_interruptible(udev->waitq, + udev->head != udev->tail || + udev->state != UIST_CREATED); + } while (retval == 0); + + return retval; +} + +static unsigned int uinput_poll(struct file *file, poll_table *wait) +{ + struct uinput_device *udev = file->private_data; + + poll_wait(file, &udev->waitq, wait); + + if (udev->head != udev->tail) + return POLLIN | POLLRDNORM; + + return 0; +} + +static int uinput_release(struct inode *inode, struct file *file) +{ + struct uinput_device *udev = file->private_data; + + uinput_destroy_device(udev); + kfree(udev); + + return 0; +} + +#ifdef CONFIG_COMPAT +struct uinput_ff_upload_compat { + __u32 request_id; + __s32 retval; + struct ff_effect_compat effect; + struct ff_effect_compat old; +}; + +static int uinput_ff_upload_to_user(char __user *buffer, + const struct uinput_ff_upload *ff_up) +{ + if (INPUT_COMPAT_TEST) { + struct uinput_ff_upload_compat ff_up_compat; + + ff_up_compat.request_id = ff_up->request_id; + ff_up_compat.retval = ff_up->retval; + /* + * It so happens that the pointer that gives us the trouble + * is the last field in the structure. Since we don't support + * custom waveforms in uinput anyway we can just copy the whole + * thing (to the compat size) and ignore the pointer. + */ + memcpy(&ff_up_compat.effect, &ff_up->effect, + sizeof(struct ff_effect_compat)); + memcpy(&ff_up_compat.old, &ff_up->old, + sizeof(struct ff_effect_compat)); + + if (copy_to_user(buffer, &ff_up_compat, + sizeof(struct uinput_ff_upload_compat))) + return -EFAULT; + } else { + if (copy_to_user(buffer, ff_up, + sizeof(struct uinput_ff_upload))) + return -EFAULT; + } + + return 0; +} + +static int uinput_ff_upload_from_user(const char __user *buffer, + struct uinput_ff_upload *ff_up) +{ + if (INPUT_COMPAT_TEST) { + struct uinput_ff_upload_compat ff_up_compat; + + if (copy_from_user(&ff_up_compat, buffer, + sizeof(struct uinput_ff_upload_compat))) + return -EFAULT; + + ff_up->request_id = ff_up_compat.request_id; + ff_up->retval = ff_up_compat.retval; + memcpy(&ff_up->effect, &ff_up_compat.effect, + sizeof(struct ff_effect_compat)); + memcpy(&ff_up->old, &ff_up_compat.old, + sizeof(struct ff_effect_compat)); + + } else { + if (copy_from_user(ff_up, buffer, + sizeof(struct uinput_ff_upload))) + return -EFAULT; + } + + return 0; +} + +#else + +static int uinput_ff_upload_to_user(char __user *buffer, + const struct uinput_ff_upload *ff_up) +{ + if (copy_to_user(buffer, ff_up, sizeof(struct uinput_ff_upload))) + return -EFAULT; + + return 0; +} + +static int uinput_ff_upload_from_user(const char __user *buffer, + struct uinput_ff_upload *ff_up) +{ + if (copy_from_user(ff_up, buffer, sizeof(struct uinput_ff_upload))) + return -EFAULT; + + return 0; +} + +#endif + +#define uinput_set_bit(_arg, _bit, _max) \ +({ \ + int __ret = 0; \ + if (udev->state == UIST_CREATED) \ + __ret = -EINVAL; \ + else if ((_arg) > (_max)) \ + __ret = -EINVAL; \ + else set_bit((_arg), udev->dev->_bit); \ + __ret; \ +}) + +static long uinput_ioctl_handler(struct file *file, unsigned int cmd, + unsigned long arg, void __user *p) +{ + int retval; + struct uinput_device *udev = file->private_data; + struct uinput_ff_upload ff_up; + struct uinput_ff_erase ff_erase; + struct uinput_request *req; + char *phys; + + retval = mutex_lock_interruptible(&udev->mutex); + if (retval) + return retval; + + if (!udev->dev) { + retval = uinput_allocate_device(udev); + if (retval) + goto out; + } + + switch (cmd) { + case UI_DEV_CREATE: + retval = uinput_create_device(udev); + break; + + case UI_DEV_DESTROY: + uinput_destroy_device(udev); + break; + + case UI_SET_EVBIT: + retval = uinput_set_bit(arg, evbit, EV_MAX); + break; + + case UI_SET_KEYBIT: + retval = uinput_set_bit(arg, keybit, KEY_MAX); + break; + + case UI_SET_RELBIT: + retval = uinput_set_bit(arg, relbit, REL_MAX); + break; + + case UI_SET_ABSBIT: + retval = uinput_set_bit(arg, absbit, ABS_MAX); + break; + + case UI_SET_MSCBIT: + retval = uinput_set_bit(arg, mscbit, MSC_MAX); + break; + + case UI_SET_LEDBIT: + retval = uinput_set_bit(arg, ledbit, LED_MAX); + break; + + case UI_SET_SNDBIT: + retval = uinput_set_bit(arg, sndbit, SND_MAX); + break; + + case UI_SET_FFBIT: + retval = uinput_set_bit(arg, ffbit, FF_MAX); + break; + + case UI_SET_SWBIT: + retval = uinput_set_bit(arg, swbit, SW_MAX); + break; + + case UI_SET_PROPBIT: + retval = uinput_set_bit(arg, propbit, INPUT_PROP_MAX); + break; + + case UI_SET_PHYS: + if (udev->state == UIST_CREATED) { + retval = -EINVAL; + goto out; + } + + phys = strndup_user(p, 1024); + if (IS_ERR(phys)) { + retval = PTR_ERR(phys); + goto out; + } + + kfree(udev->dev->phys); + udev->dev->phys = phys; + break; + + case UI_BEGIN_FF_UPLOAD: + retval = uinput_ff_upload_from_user(p, &ff_up); + if (retval) + break; + + req = uinput_request_find(udev, ff_up.request_id); + if (!req || req->code != UI_FF_UPLOAD || + !req->u.upload.effect) { + retval = -EINVAL; + break; + } + + ff_up.retval = 0; + ff_up.effect = *req->u.upload.effect; + if (req->u.upload.old) + ff_up.old = *req->u.upload.old; + else + memset(&ff_up.old, 0, sizeof(struct ff_effect)); + + retval = uinput_ff_upload_to_user(p, &ff_up); + break; + + case UI_BEGIN_FF_ERASE: + if (copy_from_user(&ff_erase, p, sizeof(ff_erase))) { + retval = -EFAULT; + break; + } + + req = uinput_request_find(udev, ff_erase.request_id); + if (!req || req->code != UI_FF_ERASE) { + retval = -EINVAL; + break; + } + + ff_erase.retval = 0; + ff_erase.effect_id = req->u.effect_id; + if (copy_to_user(p, &ff_erase, sizeof(ff_erase))) { + retval = -EFAULT; + break; + } + + break; + + case UI_END_FF_UPLOAD: + retval = uinput_ff_upload_from_user(p, &ff_up); + if (retval) + break; + + req = uinput_request_find(udev, ff_up.request_id); + if (!req || req->code != UI_FF_UPLOAD || + !req->u.upload.effect) { + retval = -EINVAL; + break; + } + + req->retval = ff_up.retval; + uinput_request_done(udev, req); + break; + + case UI_END_FF_ERASE: + if (copy_from_user(&ff_erase, p, sizeof(ff_erase))) { + retval = -EFAULT; + break; + } + + req = uinput_request_find(udev, ff_erase.request_id); + if (!req || req->code != UI_FF_ERASE) { + retval = -EINVAL; + break; + } + + req->retval = ff_erase.retval; + uinput_request_done(udev, req); + break; + + default: + retval = -EINVAL; + } + + out: + mutex_unlock(&udev->mutex); + return retval; +} + +static long uinput_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + return uinput_ioctl_handler(file, cmd, arg, (void __user *)arg); +} + +#ifdef CONFIG_COMPAT +static long uinput_compat_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return uinput_ioctl_handler(file, cmd, arg, compat_ptr(arg)); +} +#endif + +static const struct file_operations uinput_fops = { + .owner = THIS_MODULE, + .open = uinput_open, + .release = uinput_release, + .read = uinput_read, + .write = uinput_write, + .poll = uinput_poll, + .unlocked_ioctl = uinput_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = uinput_compat_ioctl, +#endif + .llseek = no_llseek, +}; + +static struct miscdevice uinput_misc = { + .fops = &uinput_fops, + .minor = UINPUT_MINOR, + .name = UINPUT_NAME, +}; +MODULE_ALIAS_MISCDEV(UINPUT_MINOR); +MODULE_ALIAS("devname:" UINPUT_NAME); + +static int __init uinput_init(void) +{ + return misc_register(&uinput_misc); +} + +static void __exit uinput_exit(void) +{ + misc_deregister(&uinput_misc); +} + +MODULE_AUTHOR("Aristeu Sergio Rozanski Filho"); +MODULE_DESCRIPTION("User level driver support for input subsystem"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("0.3"); + +module_init(uinput_init); +module_exit(uinput_exit); diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c new file mode 100644 index 00000000..56536f4b --- /dev/null +++ b/drivers/input/misc/wistron_btns.c @@ -0,0 +1,1389 @@ +/* + * Wistron laptop button driver + * Copyright (C) 2005 Miloslav Trmac + * Copyright (C) 2005 Bernhard Rosenkraenzer + * Copyright (C) 2005 Dmitry Torokhov + * + * You can redistribute and/or modify this program under the terms of the + * GNU General Public License version 2 as published by the Free Software + * Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place Suite 330, Boston, MA 02111-1307, USA. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* How often we poll keys - msecs */ +#define POLL_INTERVAL_DEFAULT 500 /* when idle */ +#define POLL_INTERVAL_BURST 100 /* when a key was recently pressed */ + +/* BIOS subsystem IDs */ +#define WIFI 0x35 +#define BLUETOOTH 0x34 +#define MAIL_LED 0x31 + +MODULE_AUTHOR("Miloslav Trmac "); +MODULE_DESCRIPTION("Wistron laptop button driver"); +MODULE_LICENSE("GPL v2"); +MODULE_VERSION("0.3"); + +static bool force; /* = 0; */ +module_param(force, bool, 0); +MODULE_PARM_DESC(force, "Load even if computer is not in database"); + +static char *keymap_name; /* = NULL; */ +module_param_named(keymap, keymap_name, charp, 0); +MODULE_PARM_DESC(keymap, "Keymap name, if it can't be autodetected [generic, 1557/MS2141]"); + +static struct platform_device *wistron_device; + + /* BIOS interface implementation */ + +static void __iomem *bios_entry_point; /* BIOS routine entry point */ +static void __iomem *bios_code_map_base; +static void __iomem *bios_data_map_base; + +static u8 cmos_address; + +struct regs { + u32 eax, ebx, ecx; +}; + +static void call_bios(struct regs *regs) +{ + unsigned long flags; + + preempt_disable(); + local_irq_save(flags); + asm volatile ("pushl %%ebp;" + "movl %7, %%ebp;" + "call *%6;" + "popl %%ebp" + : "=a" (regs->eax), "=b" (regs->ebx), "=c" (regs->ecx) + : "0" (regs->eax), "1" (regs->ebx), "2" (regs->ecx), + "m" (bios_entry_point), "m" (bios_data_map_base) + : "edx", "edi", "esi", "memory"); + local_irq_restore(flags); + preempt_enable(); +} + +static ssize_t __init locate_wistron_bios(void __iomem *base) +{ + static unsigned char __initdata signature[] = + { 0x42, 0x21, 0x55, 0x30 }; + ssize_t offset; + + for (offset = 0; offset < 0x10000; offset += 0x10) { + if (check_signature(base + offset, signature, + sizeof(signature)) != 0) + return offset; + } + return -1; +} + +static int __init map_bios(void) +{ + void __iomem *base; + ssize_t offset; + u32 entry_point; + + base = ioremap(0xF0000, 0x10000); /* Can't fail */ + offset = locate_wistron_bios(base); + if (offset < 0) { + printk(KERN_ERR "wistron_btns: BIOS entry point not found\n"); + iounmap(base); + return -ENODEV; + } + + entry_point = readl(base + offset + 5); + printk(KERN_DEBUG + "wistron_btns: BIOS signature found at %p, entry point %08X\n", + base + offset, entry_point); + + if (entry_point >= 0xF0000) { + bios_code_map_base = base; + bios_entry_point = bios_code_map_base + (entry_point & 0xFFFF); + } else { + iounmap(base); + bios_code_map_base = ioremap(entry_point & ~0x3FFF, 0x4000); + if (bios_code_map_base == NULL) { + printk(KERN_ERR + "wistron_btns: Can't map BIOS code at %08X\n", + entry_point & ~0x3FFF); + goto err; + } + bios_entry_point = bios_code_map_base + (entry_point & 0x3FFF); + } + /* The Windows driver maps 0x10000 bytes, we keep only one page... */ + bios_data_map_base = ioremap(0x400, 0xc00); + if (bios_data_map_base == NULL) { + printk(KERN_ERR "wistron_btns: Can't map BIOS data\n"); + goto err_code; + } + return 0; + +err_code: + iounmap(bios_code_map_base); +err: + return -ENOMEM; +} + +static inline void unmap_bios(void) +{ + iounmap(bios_code_map_base); + iounmap(bios_data_map_base); +} + + /* BIOS calls */ + +static u16 bios_pop_queue(void) +{ + struct regs regs; + + memset(®s, 0, sizeof (regs)); + regs.eax = 0x9610; + regs.ebx = 0x061C; + regs.ecx = 0x0000; + call_bios(®s); + + return regs.eax; +} + +static void bios_attach(void) +{ + struct regs regs; + + memset(®s, 0, sizeof (regs)); + regs.eax = 0x9610; + regs.ebx = 0x012E; + call_bios(®s); +} + +static void bios_detach(void) +{ + struct regs regs; + + memset(®s, 0, sizeof (regs)); + regs.eax = 0x9610; + regs.ebx = 0x002E; + call_bios(®s); +} + +static u8 bios_get_cmos_address(void) +{ + struct regs regs; + + memset(®s, 0, sizeof (regs)); + regs.eax = 0x9610; + regs.ebx = 0x051C; + call_bios(®s); + + return regs.ecx; +} + +static u16 bios_get_default_setting(u8 subsys) +{ + struct regs regs; + + memset(®s, 0, sizeof (regs)); + regs.eax = 0x9610; + regs.ebx = 0x0200 | subsys; + call_bios(®s); + + return regs.eax; +} + +static void bios_set_state(u8 subsys, int enable) +{ + struct regs regs; + + memset(®s, 0, sizeof (regs)); + regs.eax = 0x9610; + regs.ebx = (enable ? 0x0100 : 0x0000) | subsys; + call_bios(®s); +} + +/* Hardware database */ + +#define KE_WIFI (KE_LAST + 1) +#define KE_BLUETOOTH (KE_LAST + 2) + +#define FE_MAIL_LED 0x01 +#define FE_WIFI_LED 0x02 +#define FE_UNTESTED 0x80 + +static struct key_entry *keymap; /* = NULL; Current key map */ +static bool have_wifi; +static bool have_bluetooth; +static int leds_present; /* bitmask of leds present */ + +static int __init dmi_matched(const struct dmi_system_id *dmi) +{ + const struct key_entry *key; + + keymap = dmi->driver_data; + for (key = keymap; key->type != KE_END; key++) { + if (key->type == KE_WIFI) + have_wifi = true; + else if (key->type == KE_BLUETOOTH) + have_bluetooth = true; + } + leds_present = key->code & (FE_MAIL_LED | FE_WIFI_LED); + + return 1; +} + +static struct key_entry keymap_empty[] __initdata = { + { KE_END, 0 } +}; + +static struct key_entry keymap_fs_amilo_pro_v2000[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_WIFI, 0x30 }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, 0 } +}; + +static struct key_entry keymap_fs_amilo_pro_v3505[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, /* Fn+F1 */ + { KE_KEY, 0x06, {KEY_DISPLAYTOGGLE} }, /* Fn+F4 */ + { KE_BLUETOOTH, 0x30 }, /* Fn+F10 */ + { KE_KEY, 0x31, {KEY_MAIL} }, /* mail button */ + { KE_KEY, 0x36, {KEY_WWW} }, /* www button */ + { KE_WIFI, 0x78 }, /* satellite dish button */ + { KE_END, 0 } +}; + +static struct key_entry keymap_fujitsu_n3510[] __initdata = { + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x71, {KEY_STOPCD} }, + { KE_KEY, 0x72, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x74, {KEY_REWIND} }, + { KE_KEY, 0x78, {KEY_FORWARD} }, + { KE_END, 0 } +}; + +static struct key_entry keymap_wistron_ms2111[] __initdata = { + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, FE_MAIL_LED } +}; + +static struct key_entry keymap_wistron_md40100[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x37, {KEY_DISPLAYTOGGLE} }, /* Display on/off */ + { KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_wistron_ms2141[] __initdata = { + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_WIFI, 0x30 }, + { KE_KEY, 0x22, {KEY_REWIND} }, + { KE_KEY, 0x23, {KEY_FORWARD} }, + { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x25, {KEY_STOPCD} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, 0 } +}; + +static struct key_entry keymap_acer_aspire_1500[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_WIFI, 0x30 }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x49, {KEY_CONFIG} }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, FE_UNTESTED } +}; + +static struct key_entry keymap_acer_aspire_1600[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x49, {KEY_CONFIG} }, + { KE_WIFI, 0x30 }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +/* 3020 has been tested */ +static struct key_entry keymap_acer_aspire_5020[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */ + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x6a, {KEY_CONFIG} }, + { KE_WIFI, 0x30 }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_2410[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x6d, {KEY_POWER} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x6a, {KEY_CONFIG} }, + { KE_WIFI, 0x30 }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_110[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x20, {KEY_VOLUMEUP} }, + { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_SW, 0x4a, {.sw = {SW_LID, 1}} }, /* lid close */ + { KE_SW, 0x4b, {.sw = {SW_LID, 0}} }, /* lid open */ + { KE_WIFI, 0x30 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_300[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x20, {KEY_VOLUMEUP} }, + { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_WIFI, 0x30 }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_380[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x03, {KEY_POWER} }, /* not 370 */ + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_WIFI, 0x30 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +/* unusual map */ +static struct key_entry keymap_acer_travelmate_220[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x11, {KEY_MAIL} }, + { KE_KEY, 0x12, {KEY_WWW} }, + { KE_KEY, 0x13, {KEY_PROG2} }, + { KE_KEY, 0x31, {KEY_PROG1} }, + { KE_END, FE_WIFI_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_230[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, FE_WIFI_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_240[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_BLUETOOTH, 0x44 }, + { KE_WIFI, 0x30 }, + { KE_END, FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_350[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_MAIL} }, + { KE_KEY, 0x14, {KEY_PROG3} }, + { KE_KEY, 0x15, {KEY_WWW} }, + { KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_acer_travelmate_360[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_MAIL} }, + { KE_KEY, 0x14, {KEY_PROG3} }, + { KE_KEY, 0x15, {KEY_WWW} }, + { KE_KEY, 0x40, {KEY_WLAN} }, + { KE_END, FE_WIFI_LED | FE_UNTESTED } /* no mail led */ +}; + +/* Wifi subsystem only activates the led. Therefore we need to pass + * wifi event as a normal key, then userspace can really change the wifi state. + * TODO we need to export led state to userspace (wifi and mail) */ +static struct key_entry keymap_acer_travelmate_610[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_KEY, 0x14, {KEY_MAIL} }, + { KE_KEY, 0x15, {KEY_WWW} }, + { KE_KEY, 0x40, {KEY_WLAN} }, + { KE_END, FE_MAIL_LED | FE_WIFI_LED } +}; + +static struct key_entry keymap_acer_travelmate_630[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x08, {KEY_MUTE} }, /* not 620 */ + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_KEY, 0x20, {KEY_VOLUMEUP} }, + { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_WIFI, 0x30 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_aopen_1559as[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x06, {KEY_PROG3} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_WIFI, 0x30 }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, 0 }, +}; + +static struct key_entry keymap_fs_amilo_d88x0[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_END, FE_MAIL_LED | FE_WIFI_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_wistron_md2900[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_WIFI, 0x30 }, + { KE_END, FE_MAIL_LED | FE_UNTESTED } +}; + +static struct key_entry keymap_wistron_md96500[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */ + { KE_KEY, 0x06, {KEY_DISPLAYTOGGLE} }, /* Display on/off */ + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x20, {KEY_VOLUMEUP} }, + { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, + { KE_KEY, 0x22, {KEY_REWIND} }, + { KE_KEY, 0x23, {KEY_FORWARD} }, + { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x25, {KEY_STOPCD} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_WIFI, 0x30 }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, FE_UNTESTED } +}; + +static struct key_entry keymap_wistron_generic[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x02, {KEY_CONFIG} }, + { KE_KEY, 0x03, {KEY_POWER} }, + { KE_KEY, 0x05, {KEY_SWITCHVIDEOMODE} }, /* Display selection */ + { KE_KEY, 0x06, {KEY_DISPLAYTOGGLE} }, /* Display on/off */ + { KE_KEY, 0x08, {KEY_MUTE} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_KEY, 0x13, {KEY_PROG3} }, + { KE_KEY, 0x14, {KEY_MAIL} }, + { KE_KEY, 0x15, {KEY_WWW} }, + { KE_KEY, 0x20, {KEY_VOLUMEUP} }, + { KE_KEY, 0x21, {KEY_VOLUMEDOWN} }, + { KE_KEY, 0x22, {KEY_REWIND} }, + { KE_KEY, 0x23, {KEY_FORWARD} }, + { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x25, {KEY_STOPCD} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_KEY, 0x37, {KEY_DISPLAYTOGGLE} }, /* Display on/off */ + { KE_KEY, 0x40, {KEY_WLAN} }, + { KE_KEY, 0x49, {KEY_CONFIG} }, + { KE_SW, 0x4a, {.sw = {SW_LID, 1}} }, /* lid close */ + { KE_SW, 0x4b, {.sw = {SW_LID, 0}} }, /* lid open */ + { KE_KEY, 0x6a, {KEY_CONFIG} }, + { KE_KEY, 0x6d, {KEY_POWER} }, + { KE_KEY, 0x71, {KEY_STOPCD} }, + { KE_KEY, 0x72, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x74, {KEY_REWIND} }, + { KE_KEY, 0x78, {KEY_FORWARD} }, + { KE_WIFI, 0x30 }, + { KE_BLUETOOTH, 0x44 }, + { KE_END, 0 } +}; + +static struct key_entry keymap_aopen_1557[] __initdata = { + { KE_KEY, 0x01, {KEY_HELP} }, + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_WIFI, 0x30 }, + { KE_KEY, 0x22, {KEY_REWIND} }, + { KE_KEY, 0x23, {KEY_FORWARD} }, + { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x25, {KEY_STOPCD} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, 0 } +}; + +static struct key_entry keymap_prestigio[] __initdata = { + { KE_KEY, 0x11, {KEY_PROG1} }, + { KE_KEY, 0x12, {KEY_PROG2} }, + { KE_WIFI, 0x30 }, + { KE_KEY, 0x22, {KEY_REWIND} }, + { KE_KEY, 0x23, {KEY_FORWARD} }, + { KE_KEY, 0x24, {KEY_PLAYPAUSE} }, + { KE_KEY, 0x25, {KEY_STOPCD} }, + { KE_KEY, 0x31, {KEY_MAIL} }, + { KE_KEY, 0x36, {KEY_WWW} }, + { KE_END, 0 } +}; + + +/* + * If your machine is not here (which is currently rather likely), please send + * a list of buttons and their key codes (reported when loading this module + * with force=1) and the output of dmidecode to $MODULE_AUTHOR. + */ +static const struct dmi_system_id __initconst dmi_ids[] = { + { + /* Fujitsu-Siemens Amilo Pro V2000 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"), + }, + .driver_data = keymap_fs_amilo_pro_v2000 + }, + { + /* Fujitsu-Siemens Amilo Pro Edition V3505 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro Edition V3505"), + }, + .driver_data = keymap_fs_amilo_pro_v3505 + }, + { + /* Fujitsu-Siemens Amilo M7400 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO M "), + }, + .driver_data = keymap_fs_amilo_pro_v2000 + }, + { + /* Maxdata Pro 7000 DX */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"), + }, + .driver_data = keymap_fs_amilo_pro_v2000 + }, + { + /* Fujitsu N3510 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "N3510"), + }, + .driver_data = keymap_fujitsu_n3510 + }, + { + /* Acer Aspire 1500 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"), + }, + .driver_data = keymap_acer_aspire_1500 + }, + { + /* Acer Aspire 1600 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1600"), + }, + .driver_data = keymap_acer_aspire_1600 + }, + { + /* Acer Aspire 3020 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3020"), + }, + .driver_data = keymap_acer_aspire_5020 + }, + { + /* Acer Aspire 5020 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5020"), + }, + .driver_data = keymap_acer_aspire_5020 + }, + { + /* Acer TravelMate 2100 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2100"), + }, + .driver_data = keymap_acer_aspire_5020 + }, + { + /* Acer TravelMate 2410 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2410"), + }, + .driver_data = keymap_acer_travelmate_2410 + }, + { + /* Acer TravelMate C300 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C300"), + }, + .driver_data = keymap_acer_travelmate_300 + }, + { + /* Acer TravelMate C100 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C100"), + }, + .driver_data = keymap_acer_travelmate_300 + }, + { + /* Acer TravelMate C110 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate C110"), + }, + .driver_data = keymap_acer_travelmate_110 + }, + { + /* Acer TravelMate 380 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 380"), + }, + .driver_data = keymap_acer_travelmate_380 + }, + { + /* Acer TravelMate 370 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 370"), + }, + .driver_data = keymap_acer_travelmate_380 /* keyboard minus 1 key */ + }, + { + /* Acer TravelMate 220 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 220"), + }, + .driver_data = keymap_acer_travelmate_220 + }, + { + /* Acer TravelMate 260 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 260"), + }, + .driver_data = keymap_acer_travelmate_220 + }, + { + /* Acer TravelMate 230 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 230"), + /* acerhk looks for "TravelMate F4..." ?! */ + }, + .driver_data = keymap_acer_travelmate_230 + }, + { + /* Acer TravelMate 280 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 280"), + }, + .driver_data = keymap_acer_travelmate_230 + }, + { + /* Acer TravelMate 240 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 240"), + }, + .driver_data = keymap_acer_travelmate_240 + }, + { + /* Acer TravelMate 250 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 250"), + }, + .driver_data = keymap_acer_travelmate_240 + }, + { + /* Acer TravelMate 2424NWXCi */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2420"), + }, + .driver_data = keymap_acer_travelmate_240 + }, + { + /* Acer TravelMate 350 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 350"), + }, + .driver_data = keymap_acer_travelmate_350 + }, + { + /* Acer TravelMate 360 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"), + }, + .driver_data = keymap_acer_travelmate_360 + }, + { + /* Acer TravelMate 610 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ACER"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 610"), + }, + .driver_data = keymap_acer_travelmate_610 + }, + { + /* Acer TravelMate 620 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 620"), + }, + .driver_data = keymap_acer_travelmate_630 + }, + { + /* Acer TravelMate 630 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 630"), + }, + .driver_data = keymap_acer_travelmate_630 + }, + { + /* AOpen 1559AS */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "E2U"), + DMI_MATCH(DMI_BOARD_NAME, "E2U"), + }, + .driver_data = keymap_aopen_1559as + }, + { + /* Medion MD 9783 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), + DMI_MATCH(DMI_PRODUCT_NAME, "MD 9783"), + }, + .driver_data = keymap_wistron_ms2111 + }, + { + /* Medion MD 40100 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), + DMI_MATCH(DMI_PRODUCT_NAME, "WID2000"), + }, + .driver_data = keymap_wistron_md40100 + }, + { + /* Medion MD 2900 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDIONNB"), + DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2000"), + }, + .driver_data = keymap_wistron_md2900 + }, + { + /* Medion MD 42200 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Medion"), + DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2030"), + }, + .driver_data = keymap_fs_amilo_pro_v2000 + }, + { + /* Medion MD 96500 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), + DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2040"), + }, + .driver_data = keymap_wistron_md96500 + }, + { + /* Medion MD 95400 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDIONPC"), + DMI_MATCH(DMI_PRODUCT_NAME, "WIM 2050"), + }, + .driver_data = keymap_wistron_md96500 + }, + { + /* Fujitsu Siemens Amilo D7820 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), /* not sure */ + DMI_MATCH(DMI_PRODUCT_NAME, "Amilo D"), + }, + .driver_data = keymap_fs_amilo_d88x0 + }, + { + /* Fujitsu Siemens Amilo D88x0 */ + .callback = dmi_matched, + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO D"), + }, + .driver_data = keymap_fs_amilo_d88x0 + }, + { NULL, } +}; + +/* Copy the good keymap, as the original ones are free'd */ +static int __init copy_keymap(void) +{ + const struct key_entry *key; + struct key_entry *new_keymap; + unsigned int length = 1; + + for (key = keymap; key->type != KE_END; key++) + length++; + + new_keymap = kmemdup(keymap, length * sizeof(struct key_entry), + GFP_KERNEL); + if (!new_keymap) + return -ENOMEM; + + keymap = new_keymap; + + return 0; +} + +static int __init select_keymap(void) +{ + dmi_check_system(dmi_ids); + if (keymap_name != NULL) { + if (strcmp (keymap_name, "1557/MS2141") == 0) + keymap = keymap_wistron_ms2141; + else if (strcmp (keymap_name, "aopen1557") == 0) + keymap = keymap_aopen_1557; + else if (strcmp (keymap_name, "prestigio") == 0) + keymap = keymap_prestigio; + else if (strcmp (keymap_name, "generic") == 0) + keymap = keymap_wistron_generic; + else { + printk(KERN_ERR "wistron_btns: Keymap unknown\n"); + return -EINVAL; + } + } + if (keymap == NULL) { + if (!force) { + printk(KERN_ERR "wistron_btns: System unknown\n"); + return -ENODEV; + } + keymap = keymap_empty; + } + + return copy_keymap(); +} + + /* Input layer interface */ + +static struct input_polled_dev *wistron_idev; +static unsigned long jiffies_last_press; +static bool wifi_enabled; +static bool bluetooth_enabled; + + /* led management */ +static void wistron_mail_led_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + bios_set_state(MAIL_LED, (value != LED_OFF) ? 1 : 0); +} + +/* same as setting up wifi card, but for laptops on which the led is managed */ +static void wistron_wifi_led_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + bios_set_state(WIFI, (value != LED_OFF) ? 1 : 0); +} + +static struct led_classdev wistron_mail_led = { + .name = "wistron:green:mail", + .brightness_set = wistron_mail_led_set, +}; + +static struct led_classdev wistron_wifi_led = { + .name = "wistron:red:wifi", + .brightness_set = wistron_wifi_led_set, +}; + +static void wistron_led_init(struct device *parent) +{ + if (leds_present & FE_WIFI_LED) { + u16 wifi = bios_get_default_setting(WIFI); + if (wifi & 1) { + wistron_wifi_led.brightness = (wifi & 2) ? LED_FULL : LED_OFF; + if (led_classdev_register(parent, &wistron_wifi_led)) + leds_present &= ~FE_WIFI_LED; + else + bios_set_state(WIFI, wistron_wifi_led.brightness); + + } else + leds_present &= ~FE_WIFI_LED; + } + + if (leds_present & FE_MAIL_LED) { + /* bios_get_default_setting(MAIL) always retuns 0, so just turn the led off */ + wistron_mail_led.brightness = LED_OFF; + if (led_classdev_register(parent, &wistron_mail_led)) + leds_present &= ~FE_MAIL_LED; + else + bios_set_state(MAIL_LED, wistron_mail_led.brightness); + } +} + +static void wistron_led_remove(void) +{ + if (leds_present & FE_MAIL_LED) + led_classdev_unregister(&wistron_mail_led); + + if (leds_present & FE_WIFI_LED) + led_classdev_unregister(&wistron_wifi_led); +} + +static inline void wistron_led_suspend(void) +{ + if (leds_present & FE_MAIL_LED) + led_classdev_suspend(&wistron_mail_led); + + if (leds_present & FE_WIFI_LED) + led_classdev_suspend(&wistron_wifi_led); +} + +static inline void wistron_led_resume(void) +{ + if (leds_present & FE_MAIL_LED) + led_classdev_resume(&wistron_mail_led); + + if (leds_present & FE_WIFI_LED) + led_classdev_resume(&wistron_wifi_led); +} + +static void handle_key(u8 code) +{ + const struct key_entry *key = + sparse_keymap_entry_from_scancode(wistron_idev->input, code); + + if (key) { + switch (key->type) { + case KE_WIFI: + if (have_wifi) { + wifi_enabled = !wifi_enabled; + bios_set_state(WIFI, wifi_enabled); + } + break; + + case KE_BLUETOOTH: + if (have_bluetooth) { + bluetooth_enabled = !bluetooth_enabled; + bios_set_state(BLUETOOTH, bluetooth_enabled); + } + break; + + default: + sparse_keymap_report_entry(wistron_idev->input, + key, 1, true); + break; + } + jiffies_last_press = jiffies; + } else + printk(KERN_NOTICE + "wistron_btns: Unknown key code %02X\n", code); +} + +static void poll_bios(bool discard) +{ + u8 qlen; + u16 val; + + for (;;) { + qlen = CMOS_READ(cmos_address); + if (qlen == 0) + break; + val = bios_pop_queue(); + if (val != 0 && !discard) + handle_key((u8)val); + } +} + +static void wistron_flush(struct input_polled_dev *dev) +{ + /* Flush stale event queue */ + poll_bios(true); +} + +static void wistron_poll(struct input_polled_dev *dev) +{ + poll_bios(false); + + /* Increase poll frequency if user is currently pressing keys (< 2s ago) */ + if (time_before(jiffies, jiffies_last_press + 2 * HZ)) + dev->poll_interval = POLL_INTERVAL_BURST; + else + dev->poll_interval = POLL_INTERVAL_DEFAULT; +} + +static int wistron_setup_keymap(struct input_dev *dev, + struct key_entry *entry) +{ + switch (entry->type) { + + /* if wifi or bluetooth are not available, create normal keys */ + case KE_WIFI: + if (!have_wifi) { + entry->type = KE_KEY; + entry->keycode = KEY_WLAN; + } + break; + + case KE_BLUETOOTH: + if (!have_bluetooth) { + entry->type = KE_KEY; + entry->keycode = KEY_BLUETOOTH; + } + break; + + case KE_END: + if (entry->code & FE_UNTESTED) + printk(KERN_WARNING "Untested laptop multimedia keys, " + "please report success or failure to " + "eric.piel@tremplin-utc.net\n"); + break; + } + + return 0; +} + +static int setup_input_dev(void) +{ + struct input_dev *input_dev; + int error; + + wistron_idev = input_allocate_polled_device(); + if (!wistron_idev) + return -ENOMEM; + + wistron_idev->open = wistron_flush; + wistron_idev->poll = wistron_poll; + wistron_idev->poll_interval = POLL_INTERVAL_DEFAULT; + + input_dev = wistron_idev->input; + input_dev->name = "Wistron laptop buttons"; + input_dev->phys = "wistron/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &wistron_device->dev; + + error = sparse_keymap_setup(input_dev, keymap, wistron_setup_keymap); + if (error) + goto err_free_dev; + + error = input_register_polled_device(wistron_idev); + if (error) + goto err_free_keymap; + + return 0; + + err_free_keymap: + sparse_keymap_free(input_dev); + err_free_dev: + input_free_polled_device(wistron_idev); + return error; +} + +/* Driver core */ + +static int wistron_probe(struct platform_device *dev) +{ + int err; + + bios_attach(); + cmos_address = bios_get_cmos_address(); + + if (have_wifi) { + u16 wifi = bios_get_default_setting(WIFI); + if (wifi & 1) + wifi_enabled = wifi & 2; + else + have_wifi = 0; + + if (have_wifi) + bios_set_state(WIFI, wifi_enabled); + } + + if (have_bluetooth) { + u16 bt = bios_get_default_setting(BLUETOOTH); + if (bt & 1) + bluetooth_enabled = bt & 2; + else + have_bluetooth = false; + + if (have_bluetooth) + bios_set_state(BLUETOOTH, bluetooth_enabled); + } + + wistron_led_init(&dev->dev); + + err = setup_input_dev(); + if (err) { + bios_detach(); + return err; + } + + return 0; +} + +static int wistron_remove(struct platform_device *dev) +{ + wistron_led_remove(); + input_unregister_polled_device(wistron_idev); + sparse_keymap_free(wistron_idev->input); + input_free_polled_device(wistron_idev); + bios_detach(); + + return 0; +} + +#ifdef CONFIG_PM +static int wistron_suspend(struct device *dev) +{ + if (have_wifi) + bios_set_state(WIFI, 0); + + if (have_bluetooth) + bios_set_state(BLUETOOTH, 0); + + wistron_led_suspend(); + + return 0; +} + +static int wistron_resume(struct device *dev) +{ + if (have_wifi) + bios_set_state(WIFI, wifi_enabled); + + if (have_bluetooth) + bios_set_state(BLUETOOTH, bluetooth_enabled); + + wistron_led_resume(); + + poll_bios(true); + + return 0; +} + +static const struct dev_pm_ops wistron_pm_ops = { + .suspend = wistron_suspend, + .resume = wistron_resume, + .poweroff = wistron_suspend, + .restore = wistron_resume, +}; +#endif + +static struct platform_driver wistron_driver = { + .driver = { + .name = "wistron-bios", + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &wistron_pm_ops, +#endif + }, + .probe = wistron_probe, + .remove = wistron_remove, +}; + +static int __init wb_module_init(void) +{ + int err; + + err = select_keymap(); + if (err) + return err; + + err = map_bios(); + if (err) + goto err_free_keymap; + + err = platform_driver_register(&wistron_driver); + if (err) + goto err_unmap_bios; + + wistron_device = platform_device_alloc("wistron-bios", -1); + if (!wistron_device) { + err = -ENOMEM; + goto err_unregister_driver; + } + + err = platform_device_add(wistron_device); + if (err) + goto err_free_device; + + return 0; + + err_free_device: + platform_device_put(wistron_device); + err_unregister_driver: + platform_driver_unregister(&wistron_driver); + err_unmap_bios: + unmap_bios(); + err_free_keymap: + kfree(keymap); + + return err; +} + +static void __exit wb_module_exit(void) +{ + platform_device_unregister(wistron_device); + platform_driver_unregister(&wistron_driver); + unmap_bios(); + kfree(keymap); +} + +module_init(wb_module_init); +module_exit(wb_module_exit); diff --git a/drivers/input/misc/wm831x-on.c b/drivers/input/misc/wm831x-on.c new file mode 100644 index 00000000..caa2c406 --- /dev/null +++ b/drivers/input/misc/wm831x-on.c @@ -0,0 +1,151 @@ +/** + * wm831x-on.c - WM831X ON pin driver + * + * Copyright (C) 2009 Wolfson Microelectronics plc + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct wm831x_on { + struct input_dev *dev; + struct delayed_work work; + struct wm831x *wm831x; +}; + +/* + * The chip gives us an interrupt when the ON pin is asserted but we + * then need to poll to see when the pin is deasserted. + */ +static void wm831x_poll_on(struct work_struct *work) +{ + struct wm831x_on *wm831x_on = container_of(work, struct wm831x_on, + work.work); + struct wm831x *wm831x = wm831x_on->wm831x; + int poll, ret; + + ret = wm831x_reg_read(wm831x, WM831X_ON_PIN_CONTROL); + if (ret >= 0) { + poll = !(ret & WM831X_ON_PIN_STS); + + input_report_key(wm831x_on->dev, KEY_POWER, poll); + input_sync(wm831x_on->dev); + } else { + dev_err(wm831x->dev, "Failed to read ON status: %d\n", ret); + poll = 1; + } + + if (poll) + schedule_delayed_work(&wm831x_on->work, 100); +} + +static irqreturn_t wm831x_on_irq(int irq, void *data) +{ + struct wm831x_on *wm831x_on = data; + + schedule_delayed_work(&wm831x_on->work, 0); + + return IRQ_HANDLED; +} + +static int wm831x_on_probe(struct platform_device *pdev) +{ + struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); + struct wm831x_on *wm831x_on; + int irq = wm831x_irq(wm831x, platform_get_irq(pdev, 0)); + int ret; + + wm831x_on = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_on), + GFP_KERNEL); + if (!wm831x_on) { + dev_err(&pdev->dev, "Can't allocate data\n"); + return -ENOMEM; + } + + wm831x_on->wm831x = wm831x; + INIT_DELAYED_WORK(&wm831x_on->work, wm831x_poll_on); + + wm831x_on->dev = devm_input_allocate_device(&pdev->dev); + if (!wm831x_on->dev) { + dev_err(&pdev->dev, "Can't allocate input dev\n"); + ret = -ENOMEM; + goto err; + } + + wm831x_on->dev->evbit[0] = BIT_MASK(EV_KEY); + wm831x_on->dev->keybit[BIT_WORD(KEY_POWER)] = BIT_MASK(KEY_POWER); + wm831x_on->dev->name = "wm831x_on"; + wm831x_on->dev->phys = "wm831x_on/input0"; + wm831x_on->dev->dev.parent = &pdev->dev; + + ret = request_threaded_irq(irq, NULL, wm831x_on_irq, + IRQF_TRIGGER_RISING, "wm831x_on", + wm831x_on); + if (ret < 0) { + dev_err(&pdev->dev, "Unable to request IRQ: %d\n", ret); + goto err_input_dev; + } + ret = input_register_device(wm831x_on->dev); + if (ret) { + dev_dbg(&pdev->dev, "Can't register input device: %d\n", ret); + goto err_irq; + } + + platform_set_drvdata(pdev, wm831x_on); + + return 0; + +err_irq: + free_irq(irq, wm831x_on); +err_input_dev: +err: + return ret; +} + +static int wm831x_on_remove(struct platform_device *pdev) +{ + struct wm831x_on *wm831x_on = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + free_irq(irq, wm831x_on); + cancel_delayed_work_sync(&wm831x_on->work); + + return 0; +} + +static struct platform_driver wm831x_on_driver = { + .probe = wm831x_on_probe, + .remove = wm831x_on_remove, + .driver = { + .name = "wm831x-on", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(wm831x_on_driver); + +MODULE_ALIAS("platform:wm831x-on"); +MODULE_DESCRIPTION("WM831x ON pin"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Mark Brown "); + diff --git a/drivers/input/misc/xen-kbdfront.c b/drivers/input/misc/xen-kbdfront.c new file mode 100644 index 00000000..e21c1816 --- /dev/null +++ b/drivers/input/misc/xen-kbdfront.c @@ -0,0 +1,396 @@ +/* + * Xen para-virtual input device + * + * Copyright (C) 2005 Anthony Liguori + * Copyright (C) 2006-2008 Red Hat, Inc., Markus Armbruster + * + * Based on linux/drivers/input/mouse/sermouse.c + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +struct xenkbd_info { + struct input_dev *kbd; + struct input_dev *ptr; + struct xenkbd_page *page; + int gref; + int irq; + struct xenbus_device *xbdev; + char phys[32]; +}; + +static int xenkbd_remove(struct xenbus_device *); +static int xenkbd_connect_backend(struct xenbus_device *, struct xenkbd_info *); +static void xenkbd_disconnect_backend(struct xenkbd_info *); + +/* + * Note: if you need to send out events, see xenfb_do_update() for how + * to do that. + */ + +static irqreturn_t input_handler(int rq, void *dev_id) +{ + struct xenkbd_info *info = dev_id; + struct xenkbd_page *page = info->page; + __u32 cons, prod; + + prod = page->in_prod; + if (prod == page->in_cons) + return IRQ_HANDLED; + rmb(); /* ensure we see ring contents up to prod */ + for (cons = page->in_cons; cons != prod; cons++) { + union xenkbd_in_event *event; + struct input_dev *dev; + event = &XENKBD_IN_RING_REF(page, cons); + + dev = info->ptr; + switch (event->type) { + case XENKBD_TYPE_MOTION: + input_report_rel(dev, REL_X, event->motion.rel_x); + input_report_rel(dev, REL_Y, event->motion.rel_y); + if (event->motion.rel_z) + input_report_rel(dev, REL_WHEEL, + -event->motion.rel_z); + break; + case XENKBD_TYPE_KEY: + dev = NULL; + if (test_bit(event->key.keycode, info->kbd->keybit)) + dev = info->kbd; + if (test_bit(event->key.keycode, info->ptr->keybit)) + dev = info->ptr; + if (dev) + input_report_key(dev, event->key.keycode, + event->key.pressed); + else + pr_warning("unhandled keycode 0x%x\n", + event->key.keycode); + break; + case XENKBD_TYPE_POS: + input_report_abs(dev, ABS_X, event->pos.abs_x); + input_report_abs(dev, ABS_Y, event->pos.abs_y); + if (event->pos.rel_z) + input_report_rel(dev, REL_WHEEL, + -event->pos.rel_z); + break; + } + if (dev) + input_sync(dev); + } + mb(); /* ensure we got ring contents */ + page->in_cons = cons; + notify_remote_via_irq(info->irq); + + return IRQ_HANDLED; +} + +static int xenkbd_probe(struct xenbus_device *dev, + const struct xenbus_device_id *id) +{ + int ret, i, abs; + struct xenkbd_info *info; + struct input_dev *kbd, *ptr; + + info = kzalloc(sizeof(*info), GFP_KERNEL); + if (!info) { + xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure"); + return -ENOMEM; + } + dev_set_drvdata(&dev->dev, info); + info->xbdev = dev; + info->irq = -1; + info->gref = -1; + snprintf(info->phys, sizeof(info->phys), "xenbus/%s", dev->nodename); + + info->page = (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO); + if (!info->page) + goto error_nomem; + + if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-abs-pointer", "%d", &abs) < 0) + abs = 0; + if (abs) + xenbus_printf(XBT_NIL, dev->nodename, "request-abs-pointer", "1"); + + /* keyboard */ + kbd = input_allocate_device(); + if (!kbd) + goto error_nomem; + kbd->name = "Xen Virtual Keyboard"; + kbd->phys = info->phys; + kbd->id.bustype = BUS_PCI; + kbd->id.vendor = 0x5853; + kbd->id.product = 0xffff; + + __set_bit(EV_KEY, kbd->evbit); + for (i = KEY_ESC; i < KEY_UNKNOWN; i++) + __set_bit(i, kbd->keybit); + for (i = KEY_OK; i < KEY_MAX; i++) + __set_bit(i, kbd->keybit); + + ret = input_register_device(kbd); + if (ret) { + input_free_device(kbd); + xenbus_dev_fatal(dev, ret, "input_register_device(kbd)"); + goto error; + } + info->kbd = kbd; + + /* pointing device */ + ptr = input_allocate_device(); + if (!ptr) + goto error_nomem; + ptr->name = "Xen Virtual Pointer"; + ptr->phys = info->phys; + ptr->id.bustype = BUS_PCI; + ptr->id.vendor = 0x5853; + ptr->id.product = 0xfffe; + + if (abs) { + __set_bit(EV_ABS, ptr->evbit); + input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0); + input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0); + } else { + input_set_capability(ptr, EV_REL, REL_X); + input_set_capability(ptr, EV_REL, REL_Y); + } + input_set_capability(ptr, EV_REL, REL_WHEEL); + + __set_bit(EV_KEY, ptr->evbit); + for (i = BTN_LEFT; i <= BTN_TASK; i++) + __set_bit(i, ptr->keybit); + + ret = input_register_device(ptr); + if (ret) { + input_free_device(ptr); + xenbus_dev_fatal(dev, ret, "input_register_device(ptr)"); + goto error; + } + info->ptr = ptr; + + ret = xenkbd_connect_backend(dev, info); + if (ret < 0) + goto error; + + return 0; + + error_nomem: + ret = -ENOMEM; + xenbus_dev_fatal(dev, ret, "allocating device memory"); + error: + xenkbd_remove(dev); + return ret; +} + +static int xenkbd_resume(struct xenbus_device *dev) +{ + struct xenkbd_info *info = dev_get_drvdata(&dev->dev); + + xenkbd_disconnect_backend(info); + memset(info->page, 0, PAGE_SIZE); + return xenkbd_connect_backend(dev, info); +} + +static int xenkbd_remove(struct xenbus_device *dev) +{ + struct xenkbd_info *info = dev_get_drvdata(&dev->dev); + + xenkbd_disconnect_backend(info); + if (info->kbd) + input_unregister_device(info->kbd); + if (info->ptr) + input_unregister_device(info->ptr); + free_page((unsigned long)info->page); + kfree(info); + return 0; +} + +static int xenkbd_connect_backend(struct xenbus_device *dev, + struct xenkbd_info *info) +{ + int ret, evtchn; + struct xenbus_transaction xbt; + + ret = gnttab_grant_foreign_access(dev->otherend_id, + virt_to_mfn(info->page), 0); + if (ret < 0) + return ret; + info->gref = ret; + + ret = xenbus_alloc_evtchn(dev, &evtchn); + if (ret) + goto error_grant; + ret = bind_evtchn_to_irqhandler(evtchn, input_handler, + 0, dev->devicetype, info); + if (ret < 0) { + xenbus_dev_fatal(dev, ret, "bind_evtchn_to_irqhandler"); + goto error_evtchan; + } + info->irq = ret; + + again: + ret = xenbus_transaction_start(&xbt); + if (ret) { + xenbus_dev_fatal(dev, ret, "starting transaction"); + goto error_irqh; + } + ret = xenbus_printf(xbt, dev->nodename, "page-ref", "%lu", + virt_to_mfn(info->page)); + if (ret) + goto error_xenbus; + ret = xenbus_printf(xbt, dev->nodename, "page-gref", "%u", info->gref); + if (ret) + goto error_xenbus; + ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u", + evtchn); + if (ret) + goto error_xenbus; + ret = xenbus_transaction_end(xbt, 0); + if (ret) { + if (ret == -EAGAIN) + goto again; + xenbus_dev_fatal(dev, ret, "completing transaction"); + goto error_irqh; + } + + xenbus_switch_state(dev, XenbusStateInitialised); + return 0; + + error_xenbus: + xenbus_transaction_end(xbt, 1); + xenbus_dev_fatal(dev, ret, "writing xenstore"); + error_irqh: + unbind_from_irqhandler(info->irq, info); + info->irq = -1; + error_evtchan: + xenbus_free_evtchn(dev, evtchn); + error_grant: + gnttab_end_foreign_access_ref(info->gref, 0); + info->gref = -1; + return ret; +} + +static void xenkbd_disconnect_backend(struct xenkbd_info *info) +{ + if (info->irq >= 0) + unbind_from_irqhandler(info->irq, info); + info->irq = -1; + if (info->gref >= 0) + gnttab_end_foreign_access_ref(info->gref, 0); + info->gref = -1; +} + +static void xenkbd_backend_changed(struct xenbus_device *dev, + enum xenbus_state backend_state) +{ + struct xenkbd_info *info = dev_get_drvdata(&dev->dev); + int ret, val; + + switch (backend_state) { + case XenbusStateInitialising: + case XenbusStateInitialised: + case XenbusStateReconfiguring: + case XenbusStateReconfigured: + case XenbusStateUnknown: + break; + + case XenbusStateInitWait: +InitWait: + ret = xenbus_scanf(XBT_NIL, info->xbdev->otherend, + "feature-abs-pointer", "%d", &val); + if (ret < 0) + val = 0; + if (val) { + ret = xenbus_printf(XBT_NIL, info->xbdev->nodename, + "request-abs-pointer", "1"); + if (ret) + pr_warning("xenkbd: can't request abs-pointer"); + } + + xenbus_switch_state(dev, XenbusStateConnected); + break; + + case XenbusStateConnected: + /* + * Work around xenbus race condition: If backend goes + * through InitWait to Connected fast enough, we can + * get Connected twice here. + */ + if (dev->state != XenbusStateConnected) + goto InitWait; /* no InitWait seen yet, fudge it */ + + /* Set input abs params to match backend screen res */ + if (xenbus_scanf(XBT_NIL, info->xbdev->otherend, + "width", "%d", &val) > 0) + input_set_abs_params(info->ptr, ABS_X, 0, val, 0, 0); + + if (xenbus_scanf(XBT_NIL, info->xbdev->otherend, + "height", "%d", &val) > 0) + input_set_abs_params(info->ptr, ABS_Y, 0, val, 0, 0); + + break; + + case XenbusStateClosed: + if (dev->state == XenbusStateClosed) + break; + /* Missed the backend's CLOSING state -- fallthrough */ + case XenbusStateClosing: + xenbus_frontend_closed(dev); + break; + } +} + +static const struct xenbus_device_id xenkbd_ids[] = { + { "vkbd" }, + { "" } +}; + +static DEFINE_XENBUS_DRIVER(xenkbd, , + .probe = xenkbd_probe, + .remove = xenkbd_remove, + .resume = xenkbd_resume, + .otherend_changed = xenkbd_backend_changed, +); + +static int __init xenkbd_init(void) +{ + if (!xen_domain()) + return -ENODEV; + + /* Nothing to do if running in dom0. */ + if (xen_initial_domain()) + return -ENODEV; + + return xenbus_register_frontend(&xenkbd_driver); +} + +static void __exit xenkbd_cleanup(void) +{ + xenbus_unregister_driver(&xenkbd_driver); +} + +module_init(xenkbd_init); +module_exit(xenkbd_cleanup); + +MODULE_DESCRIPTION("Xen virtual keyboard/pointer device frontend"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("xen:vkbd"); diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c new file mode 100644 index 00000000..285a5bd6 --- /dev/null +++ b/drivers/input/misc/yealink.c @@ -0,0 +1,1008 @@ +/* + * drivers/usb/input/yealink.c + * + * Copyright (c) 2005 Henk Vergonet + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +/* + * Description: + * Driver for the USB-P1K voip usb phone. + * This device is produced by Yealink Network Technology Co Ltd + * but may be branded under several names: + * - Yealink usb-p1k + * - Tiptel 115 + * - ... + * + * This driver is based on: + * - the usbb2k-api http://savannah.nongnu.org/projects/usbb2k-api/ + * - information from http://memeteau.free.fr/usbb2k + * - the xpad-driver drivers/input/joystick/xpad.c + * + * Thanks to: + * - Olivier Vandorpe, for providing the usbb2k-api. + * - Martin Diehl, for spotting my memory allocation bug. + * + * History: + * 20050527 henk First version, functional keyboard. Keyboard events + * will pop-up on the ../input/eventX bus. + * 20050531 henk Added led, LCD, dialtone and sysfs interface. + * 20050610 henk Cleanups, make it ready for public consumption. + * 20050630 henk Cleanups, fixes in response to comments. + * 20050701 henk sysfs write serialisation, fix potential unload races + * 20050801 henk Added ringtone, restructure USB + * 20050816 henk Merge 2.6.13-rc6 + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "yealink.h" + +#define DRIVER_VERSION "yld-20051230" +#define DRIVER_AUTHOR "Henk Vergonet" +#define DRIVER_DESC "Yealink phone driver" + +#define YEALINK_POLLING_FREQUENCY 10 /* in [Hz] */ + +struct yld_status { + u8 lcd[24]; + u8 led; + u8 dialtone; + u8 ringtone; + u8 keynum; +} __attribute__ ((packed)); + +/* + * Register the LCD segment and icon map + */ +#define _LOC(k,l) { .a = (k), .m = (l) } +#define _SEG(t, a, am, b, bm, c, cm, d, dm, e, em, f, fm, g, gm) \ + { .type = (t), \ + .u = { .s = { _LOC(a, am), _LOC(b, bm), _LOC(c, cm), \ + _LOC(d, dm), _LOC(e, em), _LOC(g, gm), \ + _LOC(f, fm) } } } +#define _PIC(t, h, hm, n) \ + { .type = (t), \ + .u = { .p = { .name = (n), .a = (h), .m = (hm) } } } + +static const struct lcd_segment_map { + char type; + union { + struct pictogram_map { + u8 a,m; + char name[10]; + } p; + struct segment_map { + u8 a,m; + } s[7]; + } u; +} lcdMap[] = { +#include "yealink.h" +}; + +struct yealink_dev { + struct input_dev *idev; /* input device */ + struct usb_device *udev; /* usb device */ + struct usb_interface *intf; /* usb interface */ + + /* irq input channel */ + struct yld_ctl_packet *irq_data; + dma_addr_t irq_dma; + struct urb *urb_irq; + + /* control output channel */ + struct yld_ctl_packet *ctl_data; + dma_addr_t ctl_dma; + struct usb_ctrlrequest *ctl_req; + struct urb *urb_ctl; + + char phys[64]; /* physical device path */ + + u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */ + int key_code; /* last reported key */ + + unsigned int shutdown:1; + + int stat_ix; + union { + struct yld_status s; + u8 b[sizeof(struct yld_status)]; + } master, copy; +}; + + +/******************************************************************************* + * Yealink lcd interface + ******************************************************************************/ + +/* + * Register a default 7 segment character set + */ +static SEG7_DEFAULT_MAP(map_seg7); + + /* Display a char, + * char '\9' and '\n' are placeholders and do not overwrite the original text. + * A space will always hide an icon. + */ +static int setChar(struct yealink_dev *yld, int el, int chr) +{ + int i, a, m, val; + + if (el >= ARRAY_SIZE(lcdMap)) + return -EINVAL; + + if (chr == '\t' || chr == '\n') + return 0; + + yld->lcdMap[el] = chr; + + if (lcdMap[el].type == '.') { + a = lcdMap[el].u.p.a; + m = lcdMap[el].u.p.m; + if (chr != ' ') + yld->master.b[a] |= m; + else + yld->master.b[a] &= ~m; + return 0; + } + + val = map_to_seg7(&map_seg7, chr); + for (i = 0; i < ARRAY_SIZE(lcdMap[0].u.s); i++) { + m = lcdMap[el].u.s[i].m; + + if (m == 0) + continue; + + a = lcdMap[el].u.s[i].a; + if (val & 1) + yld->master.b[a] |= m; + else + yld->master.b[a] &= ~m; + val = val >> 1; + } + return 0; +}; + +/******************************************************************************* + * Yealink key interface + ******************************************************************************/ + +/* Map device buttons to internal key events. + * + * USB-P1K button layout: + * + * up + * IN OUT + * down + * + * pickup C hangup + * 1 2 3 + * 4 5 6 + * 7 8 9 + * * 0 # + * + * The "up" and "down" keys, are symbolised by arrows on the button. + * The "pickup" and "hangup" keys are symbolised by a green and red phone + * on the button. + */ +static int map_p1k_to_key(int scancode) +{ + switch(scancode) { /* phone key: */ + case 0x23: return KEY_LEFT; /* IN */ + case 0x33: return KEY_UP; /* up */ + case 0x04: return KEY_RIGHT; /* OUT */ + case 0x24: return KEY_DOWN; /* down */ + case 0x03: return KEY_ENTER; /* pickup */ + case 0x14: return KEY_BACKSPACE; /* C */ + case 0x13: return KEY_ESC; /* hangup */ + case 0x00: return KEY_1; /* 1 */ + case 0x01: return KEY_2; /* 2 */ + case 0x02: return KEY_3; /* 3 */ + case 0x10: return KEY_4; /* 4 */ + case 0x11: return KEY_5; /* 5 */ + case 0x12: return KEY_6; /* 6 */ + case 0x20: return KEY_7; /* 7 */ + case 0x21: return KEY_8; /* 8 */ + case 0x22: return KEY_9; /* 9 */ + case 0x30: return KEY_KPASTERISK; /* * */ + case 0x31: return KEY_0; /* 0 */ + case 0x32: return KEY_LEFTSHIFT | + KEY_3 << 8; /* # */ + } + return -EINVAL; +} + +/* Completes a request by converting the data into events for the + * input subsystem. + * + * The key parameter can be cascaded: key2 << 8 | key1 + */ +static void report_key(struct yealink_dev *yld, int key) +{ + struct input_dev *idev = yld->idev; + + if (yld->key_code >= 0) { + /* old key up */ + input_report_key(idev, yld->key_code & 0xff, 0); + if (yld->key_code >> 8) + input_report_key(idev, yld->key_code >> 8, 0); + } + + yld->key_code = key; + if (key >= 0) { + /* new valid key */ + input_report_key(idev, key & 0xff, 1); + if (key >> 8) + input_report_key(idev, key >> 8, 1); + } + input_sync(idev); +} + +/******************************************************************************* + * Yealink usb communication interface + ******************************************************************************/ + +static int yealink_cmd(struct yealink_dev *yld, struct yld_ctl_packet *p) +{ + u8 *buf = (u8 *)p; + int i; + u8 sum = 0; + + for(i=0; isum = sum; + return usb_control_msg(yld->udev, + usb_sndctrlpipe(yld->udev, 0), + USB_REQ_SET_CONFIGURATION, + USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, + 0x200, 3, + p, sizeof(*p), + USB_CTRL_SET_TIMEOUT); +} + +static u8 default_ringtone[] = { + 0xEF, /* volume [0-255] */ + 0xFB, 0x1E, 0x00, 0x0C, /* 1250 [hz], 12/100 [s] */ + 0xFC, 0x18, 0x00, 0x0C, /* 1000 [hz], 12/100 [s] */ + 0xFB, 0x1E, 0x00, 0x0C, + 0xFC, 0x18, 0x00, 0x0C, + 0xFB, 0x1E, 0x00, 0x0C, + 0xFC, 0x18, 0x00, 0x0C, + 0xFB, 0x1E, 0x00, 0x0C, + 0xFC, 0x18, 0x00, 0x0C, + 0xFF, 0xFF, 0x01, 0x90, /* silent, 400/100 [s] */ + 0x00, 0x00 /* end of sequence */ +}; + +static int yealink_set_ringtone(struct yealink_dev *yld, u8 *buf, size_t size) +{ + struct yld_ctl_packet *p = yld->ctl_data; + int ix, len; + + if (size <= 0) + return -EINVAL; + + /* Set the ringtone volume */ + memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data))); + yld->ctl_data->cmd = CMD_RING_VOLUME; + yld->ctl_data->size = 1; + yld->ctl_data->data[0] = buf[0]; + yealink_cmd(yld, p); + + buf++; + size--; + + p->cmd = CMD_RING_NOTE; + ix = 0; + while (size != ix) { + len = size - ix; + if (len > sizeof(p->data)) + len = sizeof(p->data); + p->size = len; + p->offset = cpu_to_be16(ix); + memcpy(p->data, &buf[ix], len); + yealink_cmd(yld, p); + ix += len; + } + return 0; +} + +/* keep stat_master & stat_copy in sync. + */ +static int yealink_do_idle_tasks(struct yealink_dev *yld) +{ + u8 val; + int i, ix, len; + + ix = yld->stat_ix; + + memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data))); + yld->ctl_data->cmd = CMD_KEYPRESS; + yld->ctl_data->size = 1; + yld->ctl_data->sum = 0xff - CMD_KEYPRESS; + + /* If state update pointer wraps do a KEYPRESS first. */ + if (ix >= sizeof(yld->master)) { + yld->stat_ix = 0; + return 0; + } + + /* find update candidates: copy != master */ + do { + val = yld->master.b[ix]; + if (val != yld->copy.b[ix]) + goto send_update; + } while (++ix < sizeof(yld->master)); + + /* nothing todo, wait a bit and poll for a KEYPRESS */ + yld->stat_ix = 0; + /* TODO how can we wait abit. ?? + * msleep_interruptible(1000 / YEALINK_POLLING_FREQUENCY); + */ + return 0; + +send_update: + + /* Setup an appropriate update request */ + yld->copy.b[ix] = val; + yld->ctl_data->data[0] = val; + + switch(ix) { + case offsetof(struct yld_status, led): + yld->ctl_data->cmd = CMD_LED; + yld->ctl_data->sum = -1 - CMD_LED - val; + break; + case offsetof(struct yld_status, dialtone): + yld->ctl_data->cmd = CMD_DIALTONE; + yld->ctl_data->sum = -1 - CMD_DIALTONE - val; + break; + case offsetof(struct yld_status, ringtone): + yld->ctl_data->cmd = CMD_RINGTONE; + yld->ctl_data->sum = -1 - CMD_RINGTONE - val; + break; + case offsetof(struct yld_status, keynum): + val--; + val &= 0x1f; + yld->ctl_data->cmd = CMD_SCANCODE; + yld->ctl_data->offset = cpu_to_be16(val); + yld->ctl_data->data[0] = 0; + yld->ctl_data->sum = -1 - CMD_SCANCODE - val; + break; + default: + len = sizeof(yld->master.s.lcd) - ix; + if (len > sizeof(yld->ctl_data->data)) + len = sizeof(yld->ctl_data->data); + + /* Combine up to consecutive LCD bytes in a singe request + */ + yld->ctl_data->cmd = CMD_LCD; + yld->ctl_data->offset = cpu_to_be16(ix); + yld->ctl_data->size = len; + yld->ctl_data->sum = -CMD_LCD - ix - val - len; + for(i=1; imaster.b[ix]; + yld->copy.b[ix] = val; + yld->ctl_data->data[i] = val; + yld->ctl_data->sum -= val; + } + } + yld->stat_ix = ix + 1; + return 1; +} + +/* Decide on how to handle responses + * + * The state transition diagram is somethhing like: + * + * syncState<--+ + * | | + * | idle + * \|/ | + * init --ok--> waitForKey --ok--> getKey + * ^ ^ | + * | +-------ok-------+ + * error,start + * + */ +static void urb_irq_callback(struct urb *urb) +{ + struct yealink_dev *yld = urb->context; + int ret, status = urb->status; + + if (status) + dev_err(&yld->intf->dev, "%s - urb status %d\n", + __func__, status); + + switch (yld->irq_data->cmd) { + case CMD_KEYPRESS: + + yld->master.s.keynum = yld->irq_data->data[0]; + break; + + case CMD_SCANCODE: + dev_dbg(&yld->intf->dev, "get scancode %x\n", + yld->irq_data->data[0]); + + report_key(yld, map_p1k_to_key(yld->irq_data->data[0])); + break; + + default: + dev_err(&yld->intf->dev, "unexpected response %x\n", + yld->irq_data->cmd); + } + + yealink_do_idle_tasks(yld); + + if (!yld->shutdown) { + ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); + if (ret && ret != -EPERM) + dev_err(&yld->intf->dev, + "%s - usb_submit_urb failed %d\n", + __func__, ret); + } +} + +static void urb_ctl_callback(struct urb *urb) +{ + struct yealink_dev *yld = urb->context; + int ret = 0, status = urb->status; + + if (status) + dev_err(&yld->intf->dev, "%s - urb status %d\n", + __func__, status); + + switch (yld->ctl_data->cmd) { + case CMD_KEYPRESS: + case CMD_SCANCODE: + /* ask for a response */ + if (!yld->shutdown) + ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC); + break; + default: + /* send new command */ + yealink_do_idle_tasks(yld); + if (!yld->shutdown) + ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); + break; + } + + if (ret && ret != -EPERM) + dev_err(&yld->intf->dev, "%s - usb_submit_urb failed %d\n", + __func__, ret); +} + +/******************************************************************************* + * input event interface + ******************************************************************************/ + +/* TODO should we issue a ringtone on a SND_BELL event? +static int input_ev(struct input_dev *dev, unsigned int type, + unsigned int code, int value) +{ + + if (type != EV_SND) + return -EINVAL; + + switch (code) { + case SND_BELL: + case SND_TONE: + break; + default: + return -EINVAL; + } + + return 0; +} +*/ + +static int input_open(struct input_dev *dev) +{ + struct yealink_dev *yld = input_get_drvdata(dev); + int i, ret; + + dev_dbg(&yld->intf->dev, "%s\n", __func__); + + /* force updates to device */ + for (i = 0; imaster); i++) + yld->copy.b[i] = ~yld->master.b[i]; + yld->key_code = -1; /* no keys pressed */ + + yealink_set_ringtone(yld, default_ringtone, sizeof(default_ringtone)); + + /* issue INIT */ + memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data))); + yld->ctl_data->cmd = CMD_INIT; + yld->ctl_data->size = 10; + yld->ctl_data->sum = 0x100-CMD_INIT-10; + if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) { + dev_dbg(&yld->intf->dev, + "%s - usb_submit_urb failed with result %d\n", + __func__, ret); + return ret; + } + return 0; +} + +static void input_close(struct input_dev *dev) +{ + struct yealink_dev *yld = input_get_drvdata(dev); + + yld->shutdown = 1; + /* + * Make sure the flag is seen by other CPUs before we start + * killing URBs so new URBs won't be submitted + */ + smp_wmb(); + + usb_kill_urb(yld->urb_ctl); + usb_kill_urb(yld->urb_irq); + + yld->shutdown = 0; + smp_wmb(); +} + +/******************************************************************************* + * sysfs interface + ******************************************************************************/ + +static DECLARE_RWSEM(sysfs_rwsema); + +/* Interface to the 7-segments translation table aka. char set. + */ +static ssize_t show_map(struct device *dev, struct device_attribute *attr, + char *buf) +{ + memcpy(buf, &map_seg7, sizeof(map_seg7)); + return sizeof(map_seg7); +} + +static ssize_t store_map(struct device *dev, struct device_attribute *attr, + const char *buf, size_t cnt) +{ + if (cnt != sizeof(map_seg7)) + return -EINVAL; + memcpy(&map_seg7, buf, sizeof(map_seg7)); + return sizeof(map_seg7); +} + +/* Interface to the LCD. + */ + +/* Reading /sys/../lineX will return the format string with its settings: + * + * Example: + * cat ./line3 + * 888888888888 + * Linux Rocks! + */ +static ssize_t show_line(struct device *dev, char *buf, int a, int b) +{ + struct yealink_dev *yld; + int i; + + down_read(&sysfs_rwsema); + yld = dev_get_drvdata(dev); + if (yld == NULL) { + up_read(&sysfs_rwsema); + return -ENODEV; + } + + for (i = a; i < b; i++) + *buf++ = lcdMap[i].type; + *buf++ = '\n'; + for (i = a; i < b; i++) + *buf++ = yld->lcdMap[i]; + *buf++ = '\n'; + *buf = 0; + + up_read(&sysfs_rwsema); + return 3 + ((b - a) << 1); +} + +static ssize_t show_line1(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return show_line(dev, buf, LCD_LINE1_OFFSET, LCD_LINE2_OFFSET); +} + +static ssize_t show_line2(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return show_line(dev, buf, LCD_LINE2_OFFSET, LCD_LINE3_OFFSET); +} + +static ssize_t show_line3(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return show_line(dev, buf, LCD_LINE3_OFFSET, LCD_LINE4_OFFSET); +} + +/* Writing to /sys/../lineX will set the coresponding LCD line. + * - Excess characters are ignored. + * - If less characters are written than allowed, the remaining digits are + * unchanged. + * - The '\n' or '\t' char is a placeholder, it does not overwrite the + * original content. + */ +static ssize_t store_line(struct device *dev, const char *buf, size_t count, + int el, size_t len) +{ + struct yealink_dev *yld; + int i; + + down_write(&sysfs_rwsema); + yld = dev_get_drvdata(dev); + if (yld == NULL) { + up_write(&sysfs_rwsema); + return -ENODEV; + } + + if (len > count) + len = count; + for (i = 0; i < len; i++) + setChar(yld, el++, buf[i]); + + up_write(&sysfs_rwsema); + return count; +} + +static ssize_t store_line1(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_line(dev, buf, count, LCD_LINE1_OFFSET, LCD_LINE1_SIZE); +} + +static ssize_t store_line2(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_line(dev, buf, count, LCD_LINE2_OFFSET, LCD_LINE2_SIZE); +} + +static ssize_t store_line3(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return store_line(dev, buf, count, LCD_LINE3_OFFSET, LCD_LINE3_SIZE); +} + +/* Interface to visible and audible "icons", these include: + * pictures on the LCD, the LED, and the dialtone signal. + */ + +/* Get a list of "switchable elements" with their current state. */ +static ssize_t get_icons(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct yealink_dev *yld; + int i, ret = 1; + + down_read(&sysfs_rwsema); + yld = dev_get_drvdata(dev); + if (yld == NULL) { + up_read(&sysfs_rwsema); + return -ENODEV; + } + + for (i = 0; i < ARRAY_SIZE(lcdMap); i++) { + if (lcdMap[i].type != '.') + continue; + ret += sprintf(&buf[ret], "%s %s\n", + yld->lcdMap[i] == ' ' ? " " : "on", + lcdMap[i].u.p.name); + } + up_read(&sysfs_rwsema); + return ret; +} + +/* Change the visibility of a particular element. */ +static ssize_t set_icon(struct device *dev, const char *buf, size_t count, + int chr) +{ + struct yealink_dev *yld; + int i; + + down_write(&sysfs_rwsema); + yld = dev_get_drvdata(dev); + if (yld == NULL) { + up_write(&sysfs_rwsema); + return -ENODEV; + } + + for (i = 0; i < ARRAY_SIZE(lcdMap); i++) { + if (lcdMap[i].type != '.') + continue; + if (strncmp(buf, lcdMap[i].u.p.name, count) == 0) { + setChar(yld, i, chr); + break; + } + } + + up_write(&sysfs_rwsema); + return count; +} + +static ssize_t show_icon(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return set_icon(dev, buf, count, buf[0]); +} + +static ssize_t hide_icon(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) +{ + return set_icon(dev, buf, count, ' '); +} + +/* Upload a ringtone to the device. + */ + +/* Stores raw ringtone data in the phone */ +static ssize_t store_ringtone(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct yealink_dev *yld; + + down_write(&sysfs_rwsema); + yld = dev_get_drvdata(dev); + if (yld == NULL) { + up_write(&sysfs_rwsema); + return -ENODEV; + } + + /* TODO locking with async usb control interface??? */ + yealink_set_ringtone(yld, (char *)buf, count); + up_write(&sysfs_rwsema); + return count; +} + +#define _M444 S_IRUGO +#define _M664 S_IRUGO|S_IWUSR|S_IWGRP +#define _M220 S_IWUSR|S_IWGRP + +static DEVICE_ATTR(map_seg7 , _M664, show_map , store_map ); +static DEVICE_ATTR(line1 , _M664, show_line1 , store_line1 ); +static DEVICE_ATTR(line2 , _M664, show_line2 , store_line2 ); +static DEVICE_ATTR(line3 , _M664, show_line3 , store_line3 ); +static DEVICE_ATTR(get_icons , _M444, get_icons , NULL ); +static DEVICE_ATTR(show_icon , _M220, NULL , show_icon ); +static DEVICE_ATTR(hide_icon , _M220, NULL , hide_icon ); +static DEVICE_ATTR(ringtone , _M220, NULL , store_ringtone); + +static struct attribute *yld_attributes[] = { + &dev_attr_line1.attr, + &dev_attr_line2.attr, + &dev_attr_line3.attr, + &dev_attr_get_icons.attr, + &dev_attr_show_icon.attr, + &dev_attr_hide_icon.attr, + &dev_attr_map_seg7.attr, + &dev_attr_ringtone.attr, + NULL +}; + +static struct attribute_group yld_attr_group = { + .attrs = yld_attributes +}; + +/******************************************************************************* + * Linux interface and usb initialisation + ******************************************************************************/ + +struct driver_info { + char *name; +}; + +static const struct driver_info info_P1K = { + .name = "Yealink usb-p1k", +}; + +static const struct usb_device_id usb_table [] = { + { + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | + USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x6993, + .idProduct = 0xb001, + .bInterfaceClass = USB_CLASS_HID, + .bInterfaceSubClass = 0, + .bInterfaceProtocol = 0, + .driver_info = (kernel_ulong_t)&info_P1K + }, + { } +}; + +static int usb_cleanup(struct yealink_dev *yld, int err) +{ + if (yld == NULL) + return err; + + if (yld->idev) { + if (err) + input_free_device(yld->idev); + else + input_unregister_device(yld->idev); + } + + usb_free_urb(yld->urb_irq); + usb_free_urb(yld->urb_ctl); + + kfree(yld->ctl_req); + usb_free_coherent(yld->udev, USB_PKT_LEN, yld->ctl_data, yld->ctl_dma); + usb_free_coherent(yld->udev, USB_PKT_LEN, yld->irq_data, yld->irq_dma); + + kfree(yld); + return err; +} + +static void usb_disconnect(struct usb_interface *intf) +{ + struct yealink_dev *yld; + + down_write(&sysfs_rwsema); + yld = usb_get_intfdata(intf); + sysfs_remove_group(&intf->dev.kobj, &yld_attr_group); + usb_set_intfdata(intf, NULL); + up_write(&sysfs_rwsema); + + usb_cleanup(yld, 0); +} + +static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev (intf); + struct driver_info *nfo = (struct driver_info *)id->driver_info; + struct usb_host_interface *interface; + struct usb_endpoint_descriptor *endpoint; + struct yealink_dev *yld; + struct input_dev *input_dev; + int ret, pipe, i; + + interface = intf->cur_altsetting; + endpoint = &interface->endpoint[0].desc; + if (!usb_endpoint_is_int_in(endpoint)) + return -ENODEV; + + yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL); + if (!yld) + return -ENOMEM; + + yld->udev = udev; + yld->intf = intf; + + yld->idev = input_dev = input_allocate_device(); + if (!input_dev) + return usb_cleanup(yld, -ENOMEM); + + /* allocate usb buffers */ + yld->irq_data = usb_alloc_coherent(udev, USB_PKT_LEN, + GFP_ATOMIC, &yld->irq_dma); + if (yld->irq_data == NULL) + return usb_cleanup(yld, -ENOMEM); + + yld->ctl_data = usb_alloc_coherent(udev, USB_PKT_LEN, + GFP_ATOMIC, &yld->ctl_dma); + if (!yld->ctl_data) + return usb_cleanup(yld, -ENOMEM); + + yld->ctl_req = kmalloc(sizeof(*(yld->ctl_req)), GFP_KERNEL); + if (yld->ctl_req == NULL) + return usb_cleanup(yld, -ENOMEM); + + /* allocate urb structures */ + yld->urb_irq = usb_alloc_urb(0, GFP_KERNEL); + if (yld->urb_irq == NULL) + return usb_cleanup(yld, -ENOMEM); + + yld->urb_ctl = usb_alloc_urb(0, GFP_KERNEL); + if (yld->urb_ctl == NULL) + return usb_cleanup(yld, -ENOMEM); + + /* get a handle to the interrupt data pipe */ + pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); + ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); + if (ret != USB_PKT_LEN) + dev_err(&intf->dev, "invalid payload size %d, expected %zd\n", + ret, USB_PKT_LEN); + + /* initialise irq urb */ + usb_fill_int_urb(yld->urb_irq, udev, pipe, yld->irq_data, + USB_PKT_LEN, + urb_irq_callback, + yld, endpoint->bInterval); + yld->urb_irq->transfer_dma = yld->irq_dma; + yld->urb_irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + yld->urb_irq->dev = udev; + + /* initialise ctl urb */ + yld->ctl_req->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | + USB_DIR_OUT; + yld->ctl_req->bRequest = USB_REQ_SET_CONFIGURATION; + yld->ctl_req->wValue = cpu_to_le16(0x200); + yld->ctl_req->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); + yld->ctl_req->wLength = cpu_to_le16(USB_PKT_LEN); + + usb_fill_control_urb(yld->urb_ctl, udev, usb_sndctrlpipe(udev, 0), + (void *)yld->ctl_req, yld->ctl_data, USB_PKT_LEN, + urb_ctl_callback, yld); + yld->urb_ctl->transfer_dma = yld->ctl_dma; + yld->urb_ctl->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + yld->urb_ctl->dev = udev; + + /* find out the physical bus location */ + usb_make_path(udev, yld->phys, sizeof(yld->phys)); + strlcat(yld->phys, "/input0", sizeof(yld->phys)); + + /* register settings for the input device */ + input_dev->name = nfo->name; + input_dev->phys = yld->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, yld); + + input_dev->open = input_open; + input_dev->close = input_close; + /* input_dev->event = input_ev; TODO */ + + /* register available key events */ + input_dev->evbit[0] = BIT_MASK(EV_KEY); + for (i = 0; i < 256; i++) { + int k = map_p1k_to_key(i); + if (k >= 0) { + set_bit(k & 0xff, input_dev->keybit); + if (k >> 8) + set_bit(k >> 8, input_dev->keybit); + } + } + + ret = input_register_device(yld->idev); + if (ret) + return usb_cleanup(yld, ret); + + usb_set_intfdata(intf, yld); + + /* clear visible elements */ + for (i = 0; i < ARRAY_SIZE(lcdMap); i++) + setChar(yld, i, ' '); + + /* display driver version on LCD line 3 */ + store_line3(&intf->dev, NULL, + DRIVER_VERSION, sizeof(DRIVER_VERSION)); + + /* Register sysfs hooks (don't care about failure) */ + ret = sysfs_create_group(&intf->dev.kobj, &yld_attr_group); + return 0; +} + +static struct usb_driver yealink_driver = { + .name = "yealink", + .probe = usb_probe, + .disconnect = usb_disconnect, + .id_table = usb_table, +}; + +module_usb_driver(yealink_driver); + +MODULE_DEVICE_TABLE (usb, usb_table); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/misc/yealink.h b/drivers/input/misc/yealink.h new file mode 100644 index 00000000..1e0f5239 --- /dev/null +++ b/drivers/input/misc/yealink.h @@ -0,0 +1,220 @@ +/* + * drivers/usb/input/yealink.h + * + * Copyright (c) 2005 Henk Vergonet + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef INPUT_YEALINK_H +#define INPUT_YEALINK_H + +/* Using the control channel on interface 3 various aspects of the phone + * can be controlled like LCD, LED, dialtone and the ringtone. + */ + +struct yld_ctl_packet { + u8 cmd; /* command code, see below */ + u8 size; /* 1-11, size of used data bytes. */ + u16 offset; /* internal packet offset */ + u8 data[11]; + s8 sum; /* negative sum of 15 preceding bytes */ +} __attribute__ ((packed)); + +#define USB_PKT_LEN sizeof(struct yld_ctl_packet) + +/* The following yld_ctl_packet's are available: */ + +/* Init registers + * + * cmd 0x8e + * size 10 + * offset 0 + * data 0,0,0,0.... + */ +#define CMD_INIT 0x8e + +/* Request key scan + * + * cmd 0x80 + * size 1 + * offset 0 + * data[0] on return returns the key number, if it changes there's a new + * key pressed. + */ +#define CMD_KEYPRESS 0x80 + +/* Request scancode + * + * cmd 0x81 + * size 1 + * offset key number [0-1f] + * data[0] on return returns the scancode + */ +#define CMD_SCANCODE 0x81 + +/* Set LCD + * + * cmd 0x04 + * size 1-11 + * offset 0-23 + * data segment bits + */ +#define CMD_LCD 0x04 + +/* Set led + * + * cmd 0x05 + * size 1 + * offset 0 + * data[0] 0 OFF / 1 ON + */ +#define CMD_LED 0x05 + +/* Set ringtone volume + * + * cmd 0x11 + * size 1 + * offset 0 + * data[0] 0-0xff volume + */ +#define CMD_RING_VOLUME 0x11 + +/* Set ringtone notes + * + * cmd 0x02 + * size 1-11 + * offset 0-> + * data binary representation LE16(-freq), LE16(duration) .... + */ +#define CMD_RING_NOTE 0x02 + +/* Sound ringtone via the speaker on the back + * + * cmd 0x03 + * size 1 + * offset 0 + * data[0] 0 OFF / 0x24 ON + */ +#define CMD_RINGTONE 0x03 + +/* Sound dial tone via the ear speaker + * + * cmd 0x09 + * size 1 + * offset 0 + * data[0] 0 OFF / 1 ON + */ +#define CMD_DIALTONE 0x09 + +#endif /* INPUT_YEALINK_H */ + + +#if defined(_SEG) && defined(_PIC) +/* This table maps the LCD segments onto individual bit positions in the + * yld_status struct. + */ + +/* LCD, each segment must be driven separately. + * + * Layout: + * + * |[] [][] [][] [][] in |[][] + * |[] M [][] D [][] : [][] out |[][] + * store + * + * NEW REP SU MO TU WE TH FR SA + * + * [] [] [] [] [] [] [] [] [] [] [] [] + * [] [] [] [] [] [] [] [] [] [] [] [] + */ + +/* Line 1 + * Format : 18.e8.M8.88...188 + * Icon names : M D : IN OUT STORE + */ +#define LCD_LINE1_OFFSET 0 +#define LCD_LINE1_SIZE 17 + +/* Note: first g then f => ! ! */ +/* _SEG( type a b c d e g f ) */ + _SEG('1', 0,0 , 22,2 , 22,2 , 0,0 , 0,0 , 0,0 , 0,0 ), + _SEG('8', 20,1 , 20,2 , 20,4 , 20,8 , 21,4 , 21,2 , 21,1 ), + _PIC('.', 22,1 , "M" ), + _SEG('e', 18,1 , 18,2 , 18,4 , 18,1 , 19,2 , 18,1 , 19,1 ), + _SEG('8', 16,1 , 16,2 , 16,4 , 16,8 , 17,4 , 17,2 , 17,1 ), + _PIC('.', 15,8 , "D" ), + _SEG('M', 14,1 , 14,2 , 14,4 , 14,1 , 15,4 , 15,2 , 15,1 ), + _SEG('8', 12,1 , 12,2 , 12,4 , 12,8 , 13,4 , 13,2 , 13,1 ), + _PIC('.', 11,8 , ":" ), + _SEG('8', 10,1 , 10,2 , 10,4 , 10,8 , 11,4 , 11,2 , 11,1 ), + _SEG('8', 8,1 , 8,2 , 8,4 , 8,8 , 9,4 , 9,2 , 9,1 ), + _PIC('.', 7,1 , "IN" ), + _PIC('.', 7,2 , "OUT" ), + _PIC('.', 7,4 , "STORE" ), + _SEG('1', 0,0 , 5,1 , 5,1 , 0,0 , 0,0 , 0,0 , 0,0 ), + _SEG('8', 4,1 , 4,2 , 4,4 , 4,8 , 5,8 , 5,4 , 5,2 ), + _SEG('8', 2,1 , 2,2 , 2,4 , 2,8 , 3,4 , 3,2 , 3,1 ), + +/* Line 2 + * Format : ......... + * Pict. name : NEW REP SU MO TU WE TH FR SA + */ +#define LCD_LINE2_OFFSET LCD_LINE1_OFFSET + LCD_LINE1_SIZE +#define LCD_LINE2_SIZE 9 + + _PIC('.', 23,2 , "NEW" ), + _PIC('.', 23,4 , "REP" ), + _PIC('.', 1,8 , "SU" ), + _PIC('.', 1,4 , "MO" ), + _PIC('.', 1,2 , "TU" ), + _PIC('.', 1,1 , "WE" ), + _PIC('.', 0,1 , "TH" ), + _PIC('.', 0,2 , "FR" ), + _PIC('.', 0,4 , "SA" ), + +/* Line 3 + * Format : 888888888888 + */ +#define LCD_LINE3_OFFSET LCD_LINE2_OFFSET + LCD_LINE2_SIZE +#define LCD_LINE3_SIZE 12 + + _SEG('8', 22,16, 22,32, 22,64, 22,128, 23,128, 23,64, 23,32 ), + _SEG('8', 20,16, 20,32, 20,64, 20,128, 21,128, 21,64, 21,32 ), + _SEG('8', 18,16, 18,32, 18,64, 18,128, 19,128, 19,64, 19,32 ), + _SEG('8', 16,16, 16,32, 16,64, 16,128, 17,128, 17,64, 17,32 ), + _SEG('8', 14,16, 14,32, 14,64, 14,128, 15,128, 15,64, 15,32 ), + _SEG('8', 12,16, 12,32, 12,64, 12,128, 13,128, 13,64, 13,32 ), + _SEG('8', 10,16, 10,32, 10,64, 10,128, 11,128, 11,64, 11,32 ), + _SEG('8', 8,16, 8,32, 8,64, 8,128, 9,128, 9,64, 9,32 ), + _SEG('8', 6,16, 6,32, 6,64, 6,128, 7,128, 7,64, 7,32 ), + _SEG('8', 4,16, 4,32, 4,64, 4,128, 5,128, 5,64, 5,32 ), + _SEG('8', 2,16, 2,32, 2,64, 2,128, 3,128, 3,64, 3,32 ), + _SEG('8', 0,16, 0,32, 0,64, 0,128, 1,128, 1,64, 1,32 ), + +/* Line 4 + * + * The LED, DIALTONE and RINGTONE are implemented as icons and use the same + * sysfs interface. + */ +#define LCD_LINE4_OFFSET LCD_LINE3_OFFSET + LCD_LINE3_SIZE + + _PIC('.', offsetof(struct yld_status, led) , 0x01, "LED" ), + _PIC('.', offsetof(struct yld_status, dialtone) , 0x01, "DIALTONE" ), + _PIC('.', offsetof(struct yld_status, ringtone) , 0x24, "RINGTONE" ), + +#undef _SEG +#undef _PIC +#endif /* _SEG && _PIC */ diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig new file mode 100644 index 00000000..effa9c5f --- /dev/null +++ b/drivers/input/mouse/Kconfig @@ -0,0 +1,376 @@ +# +# Mouse driver configuration +# +menuconfig INPUT_MOUSE + bool "Mice" + default y + help + Say Y here, and a list of supported mice will be displayed. + This option doesn't affect the kernel. + + If unsure, say Y. + +if INPUT_MOUSE + +config MOUSE_PS2 + tristate "PS/2 mouse" + default y + select SERIO + select SERIO_LIBPS2 + select SERIO_I8042 if X86 + select SERIO_GSCPS2 if GSC + help + Say Y here if you have a PS/2 mouse connected to your system. This + includes the standard 2 or 3-button PS/2 mouse, as well as PS/2 + mice with wheels and extra buttons, Microsoft, Logitech or Genius + compatible. + + Synaptics, ALPS or Elantech TouchPad users might be interested + in a specialized Xorg/XFree86 driver at: + + and a new version of GPM at: + + + to take advantage of the advanced features of the touchpad. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called psmouse. + +config MOUSE_PS2_ALPS + bool "ALPS PS/2 mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 + help + Say Y here if you have an ALPS PS/2 touchpad connected to + your system. + + If unsure, say Y. + +config MOUSE_PS2_LOGIPS2PP + bool "Logitech PS/2++ mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 + help + Say Y here if you have a Logictech PS/2++ mouse connected to + your system. + + If unsure, say Y. + +config MOUSE_PS2_SYNAPTICS + bool "Synaptics PS/2 mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 + help + Say Y here if you have a Synaptics PS/2 TouchPad connected to + your system. + + If unsure, say Y. + +config MOUSE_PS2_CYPRESS + bool "Cypress PS/2 mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 + help + Say Y here if you have a Cypress PS/2 Trackpad connected to + your system. + + If unsure, say Y. + +config MOUSE_PS2_LIFEBOOK + bool "Fujitsu Lifebook PS/2 mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 && X86 && DMI + help + Say Y here if you have a Fujitsu B-series Lifebook PS/2 + TouchScreen connected to your system. + + If unsure, say Y. + +config MOUSE_PS2_TRACKPOINT + bool "IBM Trackpoint PS/2 mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 + help + Say Y here if you have an IBM Trackpoint PS/2 mouse connected + to your system. + + If unsure, say Y. + +config MOUSE_PS2_ELANTECH + bool "Elantech PS/2 protocol extension" + depends on MOUSE_PS2 + help + Say Y here if you have an Elantech PS/2 touchpad connected + to your system. + + Note that if you enable this driver you will need an updated + X.org Synaptics driver that does not require ABS_PRESSURE + reports from the touchpad (i.e. post 1.5.0 version). You can + grab a patch for the driver here: + + http://userweb.kernel.org/~dtor/synaptics-no-abspressure.patch + + If unsure, say N. + + This driver exposes some configuration registers via sysfs + entries. For further information, + see . + +config MOUSE_PS2_SENTELIC + bool "Sentelic Finger Sensing Pad PS/2 protocol extension" + depends on MOUSE_PS2 + help + Say Y here if you have a laptop (such as MSI WIND Netbook) + with Sentelic Finger Sensing Pad touchpad. + + If unsure, say N. + +config MOUSE_PS2_TOUCHKIT + bool "eGalax TouchKit PS/2 protocol extension" + depends on MOUSE_PS2 + help + Say Y here if you have an eGalax TouchKit PS/2 touchscreen + connected to your system. + + If unsure, say N. + +config MOUSE_PS2_OLPC + bool "OLPC PS/2 mouse protocol extension" + depends on MOUSE_PS2 && OLPC + help + Say Y here if you have an OLPC XO-1 laptop (with built-in + PS/2 touchpad/tablet device). The manufacturer calls the + touchpad an HGPK. + + If unsure, say N. + +config MOUSE_SERIAL + tristate "Serial mouse" + select SERIO + help + Say Y here if you have a serial (RS-232, COM port) mouse connected + to your system. This includes Sun, MouseSystems, Microsoft, + Logitech and all other compatible serial mice. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called sermouse. + +config MOUSE_APPLETOUCH + tristate "Apple USB Touchpad support" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use an Apple USB Touchpad. + + These are the touchpads that can be found on post-February 2005 + Apple Powerbooks (prior models have a Synaptics touchpad connected + to the ADB bus). + + This driver provides a basic mouse driver but can be interfaced + with the synaptics X11 driver to provide acceleration and + scrolling in X11. + + For further information, see + . + + To compile this driver as a module, choose M here: the + module will be called appletouch. + +config MOUSE_BCM5974 + tristate "Apple USB BCM5974 Multitouch trackpad support" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you have an Apple USB BCM5974 Multitouch + trackpad. + + The BCM5974 is the multitouch trackpad found in the Macbook + Air (JAN2008) and Macbook Pro Penryn (FEB2008) laptops. + + It is also found in the IPhone (2007) and Ipod Touch (2008). + + This driver provides multitouch functionality together with + the synaptics X11 driver. + + The interface is currently identical to the appletouch interface, + for further information, see + . + + To compile this driver as a module, choose M here: the + module will be called bcm5974. + +config MOUSE_CYAPA + tristate "Cypress APA I2C Trackpad support" + depends on I2C + help + This driver adds support for Cypress All Points Addressable (APA) + I2C Trackpads, including the ones used in 2012 Samsung Chromebooks. + + Say Y here if you have a Cypress APA I2C Trackpad. + + To compile this driver as a module, choose M here: the module will be + called cyapa. + +config MOUSE_INPORT + tristate "InPort/MS/ATIXL busmouse" + depends on ISA + help + Say Y here if you have an InPort, Microsoft or ATI XL busmouse. + They are rather rare these days. + + To compile this driver as a module, choose M here: the + module will be called inport. + +config MOUSE_ATIXL + bool "ATI XL variant" + depends on MOUSE_INPORT + help + Say Y here if your mouse is of the ATI XL variety. + +config MOUSE_LOGIBM + tristate "Logitech busmouse" + depends on ISA + help + Say Y here if you have a Logitech busmouse. + They are rather rare these days. + + To compile this driver as a module, choose M here: the + module will be called logibm. + +config MOUSE_PC110PAD + tristate "IBM PC110 touchpad" + depends on ISA + help + Say Y if you have the IBM PC-110 micro-notebook and want its + touchpad supported. + + To compile this driver as a module, choose M here: the + module will be called pc110pad. + +config MOUSE_AMIGA + tristate "Amiga mouse" + depends on AMIGA + help + Say Y here if you have an Amiga and want its native mouse + supported by the kernel. + + To compile this driver as a module, choose M here: the + module will be called amimouse. + +config MOUSE_ATARI + tristate "Atari mouse" + depends on ATARI + select ATARI_KBD_CORE + help + Say Y here if you have an Atari and want its native mouse + supported by the kernel. + + To compile this driver as a module, choose M here: the + module will be called atarimouse. + +config MOUSE_RISCPC + tristate "Acorn RiscPC mouse" + depends on ARCH_ACORN + help + Say Y here if you have the Acorn RiscPC computer and want its + native mouse supported. + + To compile this driver as a module, choose M here: the + module will be called rpcmouse. + +config MOUSE_VSXXXAA + tristate "DEC VSXXX-AA/GA mouse and VSXXX-AB tablet" + select SERIO + help + Say Y (or M) if you want to use a DEC VSXXX-AA (hockey + puck) or a VSXXX-GA (rectangular) mouse. Theses mice are + typically used on DECstations or VAXstations, but can also + be used on any box capable of RS232 (with some adaptor + described in the source file). This driver also works with the + digitizer (VSXXX-AB) DEC produced. + +config MOUSE_GPIO + tristate "GPIO mouse" + depends on GPIOLIB + select INPUT_POLLDEV + help + This driver simulates a mouse on GPIO lines of various CPUs (and some + other chips). + + Say Y here if your device has buttons or a simple joystick connected + directly to GPIO lines. Your board-specific setup logic must also + provide a platform device and platform data saying which GPIOs are + used. + + To compile this driver as a module, choose M here: the + module will be called gpio_mouse. + +config MOUSE_PXA930_TRKBALL + tristate "PXA930 Trackball mouse" + depends on CPU_PXA930 || CPU_PXA935 + help + Say Y here to support PXA930 Trackball mouse. + +config MOUSE_MAPLE + tristate "Maple mouse (for the Dreamcast)" + depends on MAPLE + help + This driver supports the Maple mouse on the SEGA Dreamcast. + + Most Dreamcast users, who have a mouse, will say Y here. + + To compile this driver as a module choose M here: the module will be + called maplemouse. + +config MOUSE_SYNAPTICS_I2C + tristate "Synaptics I2C Touchpad support" + depends on I2C + help + This driver supports Synaptics I2C touchpad controller on eXeda + mobile device. + The device will not work the synaptics X11 driver because + (i) it reports only relative coordinates and has no capabilities + to report absolute coordinates + (ii) the eXeda device itself uses Xfbdev as X Server and it does + not allow using xf86-input-* drivers. + + Say y here if you have eXeda device and want to use a Synaptics + I2C Touchpad. + + To compile this driver as a module, choose M here: the + module will be called synaptics_i2c. + +config MOUSE_SYNAPTICS_USB + tristate "Synaptics USB device support" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use a Synaptics USB touchpad or pointing + stick. + + While these devices emulate an USB mouse by default and can be used + with standard usbhid driver, this driver, together with its X.Org + counterpart, allows you to fully utilize capabilities of the device. + More information can be found at: + + + To compile this driver as a module, choose M here: the + module will be called synaptics_usb. + +config MOUSE_NAVPOINT_PXA27x + tristate "Synaptics NavPoint (PXA27x SSP/SPI)" + depends on PXA27x && PXA_SSP + help + This driver adds support for the Synaptics NavPoint touchpad connected + to a PXA27x SSP port in SPI slave mode. The device emulates a mouse; + a tap or tap-and-a-half drag gesture emulates the left mouse button. + For example, use the xf86-input-evdev driver for an X pointing device. + + To compile this driver as a module, choose M here: the + module will be called navpoint. + +endif diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile new file mode 100644 index 00000000..c25efdb3 --- /dev/null +++ b/drivers/input/mouse/Makefile @@ -0,0 +1,36 @@ +# +# Makefile for the mouse drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o +obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o +obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o +obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o +obj-$(CONFIG_MOUSE_CYAPA) += cyapa.o +obj-$(CONFIG_MOUSE_GPIO) += gpio_mouse.o +obj-$(CONFIG_MOUSE_INPORT) += inport.o +obj-$(CONFIG_MOUSE_LOGIBM) += logibm.o +obj-$(CONFIG_MOUSE_MAPLE) += maplemouse.o +obj-$(CONFIG_MOUSE_NAVPOINT_PXA27x) += navpoint.o +obj-$(CONFIG_MOUSE_PC110PAD) += pc110pad.o +obj-$(CONFIG_MOUSE_PS2) += psmouse.o +obj-$(CONFIG_MOUSE_PXA930_TRKBALL) += pxa930_trkball.o +obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o +obj-$(CONFIG_MOUSE_SERIAL) += sermouse.o +obj-$(CONFIG_MOUSE_SYNAPTICS_I2C) += synaptics_i2c.o +obj-$(CONFIG_MOUSE_SYNAPTICS_USB) += synaptics_usb.o +obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o + +psmouse-objs := psmouse-base.o synaptics.o + +psmouse-$(CONFIG_MOUSE_PS2_ALPS) += alps.o +psmouse-$(CONFIG_MOUSE_PS2_ELANTECH) += elantech.o +psmouse-$(CONFIG_MOUSE_PS2_OLPC) += hgpk.o +psmouse-$(CONFIG_MOUSE_PS2_LOGIPS2PP) += logips2pp.o +psmouse-$(CONFIG_MOUSE_PS2_LIFEBOOK) += lifebook.o +psmouse-$(CONFIG_MOUSE_PS2_SENTELIC) += sentelic.o +psmouse-$(CONFIG_MOUSE_PS2_TRACKPOINT) += trackpoint.o +psmouse-$(CONFIG_MOUSE_PS2_TOUCHKIT) += touchkit_ps2.o +psmouse-$(CONFIG_MOUSE_PS2_CYPRESS) += cypress_ps2.o diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c new file mode 100644 index 00000000..19e070f1 --- /dev/null +++ b/drivers/input/mouse/alps.c @@ -0,0 +1,1853 @@ +/* + * ALPS touchpad PS/2 mouse driver + * + * Copyright (c) 2003 Neil Brown + * Copyright (c) 2003-2005 Peter Osterlund + * Copyright (c) 2004 Dmitry Torokhov + * Copyright (c) 2005 Vojtech Pavlik + * Copyright (c) 2009 Sebastian Kapfer + * + * ALPS detection, tap switching and status querying info is taken from + * tpconfig utility (by C. Scott Ananian and Bruce Kall). + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include + +#include "psmouse.h" +#include "alps.h" + +/* + * Definitions for ALPS version 3 and 4 command mode protocol + */ +#define ALPS_CMD_NIBBLE_10 0x01f2 + +#define ALPS_REG_BASE_RUSHMORE 0xc2c0 +#define ALPS_REG_BASE_PINNACLE 0x0000 + +static const struct alps_nibble_commands alps_v3_nibble_commands[] = { + { PSMOUSE_CMD_SETPOLL, 0x00 }, /* 0 */ + { PSMOUSE_CMD_RESET_DIS, 0x00 }, /* 1 */ + { PSMOUSE_CMD_SETSCALE21, 0x00 }, /* 2 */ + { PSMOUSE_CMD_SETRATE, 0x0a }, /* 3 */ + { PSMOUSE_CMD_SETRATE, 0x14 }, /* 4 */ + { PSMOUSE_CMD_SETRATE, 0x28 }, /* 5 */ + { PSMOUSE_CMD_SETRATE, 0x3c }, /* 6 */ + { PSMOUSE_CMD_SETRATE, 0x50 }, /* 7 */ + { PSMOUSE_CMD_SETRATE, 0x64 }, /* 8 */ + { PSMOUSE_CMD_SETRATE, 0xc8 }, /* 9 */ + { ALPS_CMD_NIBBLE_10, 0x00 }, /* a */ + { PSMOUSE_CMD_SETRES, 0x00 }, /* b */ + { PSMOUSE_CMD_SETRES, 0x01 }, /* c */ + { PSMOUSE_CMD_SETRES, 0x02 }, /* d */ + { PSMOUSE_CMD_SETRES, 0x03 }, /* e */ + { PSMOUSE_CMD_SETSCALE11, 0x00 }, /* f */ +}; + +static const struct alps_nibble_commands alps_v4_nibble_commands[] = { + { PSMOUSE_CMD_ENABLE, 0x00 }, /* 0 */ + { PSMOUSE_CMD_RESET_DIS, 0x00 }, /* 1 */ + { PSMOUSE_CMD_SETSCALE21, 0x00 }, /* 2 */ + { PSMOUSE_CMD_SETRATE, 0x0a }, /* 3 */ + { PSMOUSE_CMD_SETRATE, 0x14 }, /* 4 */ + { PSMOUSE_CMD_SETRATE, 0x28 }, /* 5 */ + { PSMOUSE_CMD_SETRATE, 0x3c }, /* 6 */ + { PSMOUSE_CMD_SETRATE, 0x50 }, /* 7 */ + { PSMOUSE_CMD_SETRATE, 0x64 }, /* 8 */ + { PSMOUSE_CMD_SETRATE, 0xc8 }, /* 9 */ + { ALPS_CMD_NIBBLE_10, 0x00 }, /* a */ + { PSMOUSE_CMD_SETRES, 0x00 }, /* b */ + { PSMOUSE_CMD_SETRES, 0x01 }, /* c */ + { PSMOUSE_CMD_SETRES, 0x02 }, /* d */ + { PSMOUSE_CMD_SETRES, 0x03 }, /* e */ + { PSMOUSE_CMD_SETSCALE11, 0x00 }, /* f */ +}; + + +#define ALPS_DUALPOINT 0x02 /* touchpad has trackstick */ +#define ALPS_PASS 0x04 /* device has a pass-through port */ + +#define ALPS_WHEEL 0x08 /* hardware wheel present */ +#define ALPS_FW_BK_1 0x10 /* front & back buttons present */ +#define ALPS_FW_BK_2 0x20 /* front & back buttons present */ +#define ALPS_FOUR_BUTTONS 0x40 /* 4 direction button present */ +#define ALPS_PS2_INTERLEAVED 0x80 /* 3-byte PS/2 packet interleaved with + 6-byte ALPS packet */ + +static const struct alps_model_info alps_model_data[] = { + { { 0x32, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Toshiba Salellite Pro M10 */ + { { 0x33, 0x02, 0x0a }, 0x00, ALPS_PROTO_V1, 0x88, 0xf8, 0 }, /* UMAX-530T */ + { { 0x53, 0x02, 0x0a }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, + { { 0x53, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, + { { 0x60, 0x03, 0xc8 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, /* HP ze1115 */ + { { 0x63, 0x02, 0x0a }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, + { { 0x63, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, + { { 0x63, 0x02, 0x28 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_FW_BK_2 }, /* Fujitsu Siemens S6010 */ + { { 0x63, 0x02, 0x3c }, 0x00, ALPS_PROTO_V2, 0x8f, 0x8f, ALPS_WHEEL }, /* Toshiba Satellite S2400-103 */ + { { 0x63, 0x02, 0x50 }, 0x00, ALPS_PROTO_V2, 0xef, 0xef, ALPS_FW_BK_1 }, /* NEC Versa L320 */ + { { 0x63, 0x02, 0x64 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, + { { 0x63, 0x03, 0xc8 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D800 */ + { { 0x73, 0x00, 0x0a }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_DUALPOINT }, /* ThinkPad R61 8918-5QG */ + { { 0x73, 0x02, 0x0a }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, 0 }, + { { 0x73, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_FW_BK_2 }, /* Ahtec Laptop */ + { { 0x20, 0x02, 0x0e }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */ + { { 0x22, 0x02, 0x0a }, 0x00, ALPS_PROTO_V2, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, + { { 0x22, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */ + /* Dell Latitude E5500, E6400, E6500, Precision M4400 */ + { { 0x62, 0x02, 0x14 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf, + ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, + { { 0x73, 0x02, 0x50 }, 0x00, ALPS_PROTO_V2, 0xcf, 0xcf, ALPS_FOUR_BUTTONS }, /* Dell Vostro 1400 */ + { { 0x52, 0x01, 0x14 }, 0x00, ALPS_PROTO_V2, 0xff, 0xff, + ALPS_PASS | ALPS_DUALPOINT | ALPS_PS2_INTERLEAVED }, /* Toshiba Tecra A11-11L */ + { { 0x73, 0x02, 0x64 }, 0x8a, ALPS_PROTO_V4, 0x8f, 0x8f, 0 }, +}; + +static void alps_set_abs_params_st(struct alps_data *priv, + struct input_dev *dev1); +static void alps_set_abs_params_mt(struct alps_data *priv, + struct input_dev *dev1); + +/* + * XXX - this entry is suspicious. First byte has zero lower nibble, + * which is what a normal mouse would report. Also, the value 0x0e + * isn't valid per PS/2 spec. + */ + +/* Packet formats are described in Documentation/input/alps.txt */ + +static bool alps_is_valid_first_byte(struct alps_data *priv, + unsigned char data) +{ + return (data & priv->mask0) == priv->byte0; +} + +static void alps_report_buttons(struct psmouse *psmouse, + struct input_dev *dev1, struct input_dev *dev2, + int left, int right, int middle) +{ + struct input_dev *dev; + + /* + * If shared button has already been reported on the + * other device (dev2) then this event should be also + * sent through that device. + */ + dev = test_bit(BTN_LEFT, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_LEFT, left); + + dev = test_bit(BTN_RIGHT, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_RIGHT, right); + + dev = test_bit(BTN_MIDDLE, dev2->key) ? dev2 : dev1; + input_report_key(dev, BTN_MIDDLE, middle); + + /* + * Sync the _other_ device now, we'll do the first + * device later once we report the rest of the events. + */ + input_sync(dev2); +} + +static void alps_process_packet_v1_v2(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + unsigned char *packet = psmouse->packet; + struct input_dev *dev = psmouse->dev; + struct input_dev *dev2 = priv->dev2; + int x, y, z, ges, fin, left, right, middle; + int back = 0, forward = 0; + + if (priv->proto_version == ALPS_PROTO_V1) { + left = packet[2] & 0x10; + right = packet[2] & 0x08; + middle = 0; + x = packet[1] | ((packet[0] & 0x07) << 7); + y = packet[4] | ((packet[3] & 0x07) << 7); + z = packet[5]; + } else { + left = packet[3] & 1; + right = packet[3] & 2; + middle = packet[3] & 4; + x = packet[1] | ((packet[2] & 0x78) << (7 - 3)); + y = packet[4] | ((packet[3] & 0x70) << (7 - 4)); + z = packet[5]; + } + + if (priv->flags & ALPS_FW_BK_1) { + back = packet[0] & 0x10; + forward = packet[2] & 4; + } + + if (priv->flags & ALPS_FW_BK_2) { + back = packet[3] & 4; + forward = packet[2] & 4; + if ((middle = forward && back)) + forward = back = 0; + } + + ges = packet[2] & 1; + fin = packet[2] & 2; + + if ((priv->flags & ALPS_DUALPOINT) && z == 127) { + input_report_rel(dev2, REL_X, (x > 383 ? (x - 768) : x)); + input_report_rel(dev2, REL_Y, -(y > 255 ? (y - 512) : y)); + + alps_report_buttons(psmouse, dev2, dev, left, right, middle); + + input_sync(dev2); + return; + } + + alps_report_buttons(psmouse, dev, dev2, left, right, middle); + + /* Convert hardware tap to a reasonable Z value */ + if (ges && !fin) + z = 40; + + /* + * A "tap and drag" operation is reported by the hardware as a transition + * from (!fin && ges) to (fin && ges). This should be translated to the + * sequence Z>0, Z==0, Z>0, so the Z==0 event has to be generated manually. + */ + if (ges && fin && !priv->prev_fin) { + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + input_report_abs(dev, ABS_PRESSURE, 0); + input_report_key(dev, BTN_TOOL_FINGER, 0); + input_sync(dev); + } + priv->prev_fin = fin; + + if (z > 30) + input_report_key(dev, BTN_TOUCH, 1); + if (z < 25) + input_report_key(dev, BTN_TOUCH, 0); + + if (z > 0) { + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + } + + input_report_abs(dev, ABS_PRESSURE, z); + input_report_key(dev, BTN_TOOL_FINGER, z > 0); + + if (priv->flags & ALPS_WHEEL) + input_report_rel(dev, REL_WHEEL, ((packet[2] << 1) & 0x08) - ((packet[0] >> 4) & 0x07)); + + if (priv->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { + input_report_key(dev, BTN_FORWARD, forward); + input_report_key(dev, BTN_BACK, back); + } + + if (priv->flags & ALPS_FOUR_BUTTONS) { + input_report_key(dev, BTN_0, packet[2] & 4); + input_report_key(dev, BTN_1, packet[0] & 0x10); + input_report_key(dev, BTN_2, packet[3] & 4); + input_report_key(dev, BTN_3, packet[0] & 0x20); + } + + input_sync(dev); +} + +/* + * Process bitmap data from v3 and v4 protocols. Returns the number of + * fingers detected. A return value of 0 means at least one of the + * bitmaps was empty. + * + * The bitmaps don't have enough data to track fingers, so this function + * only generates points representing a bounding box of all contacts. + * These points are returned in x1, y1, x2, and y2 when the return value + * is greater than 0. + */ +static int alps_process_bitmap(struct alps_data *priv, + unsigned int x_map, unsigned int y_map, + int *x1, int *y1, int *x2, int *y2) +{ + struct alps_bitmap_point { + int start_bit; + int num_bits; + }; + + int fingers_x = 0, fingers_y = 0, fingers; + int i, bit, prev_bit; + struct alps_bitmap_point x_low = {0,}, x_high = {0,}; + struct alps_bitmap_point y_low = {0,}, y_high = {0,}; + struct alps_bitmap_point *point; + + if (!x_map || !y_map) + return 0; + + *x1 = *y1 = *x2 = *y2 = 0; + + prev_bit = 0; + point = &x_low; + for (i = 0; x_map != 0; i++, x_map >>= 1) { + bit = x_map & 1; + if (bit) { + if (!prev_bit) { + point->start_bit = i; + fingers_x++; + } + point->num_bits++; + } else { + if (prev_bit) + point = &x_high; + else + point->num_bits = 0; + } + prev_bit = bit; + } + + /* + * y bitmap is reversed for what we need (lower positions are in + * higher bits), so we process from the top end. + */ + y_map = y_map << (sizeof(y_map) * BITS_PER_BYTE - priv->y_bits); + prev_bit = 0; + point = &y_low; + for (i = 0; y_map != 0; i++, y_map <<= 1) { + bit = y_map & (1 << (sizeof(y_map) * BITS_PER_BYTE - 1)); + if (bit) { + if (!prev_bit) { + point->start_bit = i; + fingers_y++; + } + point->num_bits++; + } else { + if (prev_bit) + point = &y_high; + else + point->num_bits = 0; + } + prev_bit = bit; + } + + /* + * Fingers can overlap, so we use the maximum count of fingers + * on either axis as the finger count. + */ + fingers = max(fingers_x, fingers_y); + + /* + * If total fingers is > 1 but either axis reports only a single + * contact, we have overlapping or adjacent fingers. For the + * purposes of creating a bounding box, divide the single contact + * (roughly) equally between the two points. + */ + if (fingers > 1) { + if (fingers_x == 1) { + i = x_low.num_bits / 2; + x_low.num_bits = x_low.num_bits - i; + x_high.start_bit = x_low.start_bit + i; + x_high.num_bits = max(i, 1); + } else if (fingers_y == 1) { + i = y_low.num_bits / 2; + y_low.num_bits = y_low.num_bits - i; + y_high.start_bit = y_low.start_bit + i; + y_high.num_bits = max(i, 1); + } + } + + *x1 = (priv->x_max * (2 * x_low.start_bit + x_low.num_bits - 1)) / + (2 * (priv->x_bits - 1)); + *y1 = (priv->y_max * (2 * y_low.start_bit + y_low.num_bits - 1)) / + (2 * (priv->y_bits - 1)); + + if (fingers > 1) { + *x2 = (priv->x_max * + (2 * x_high.start_bit + x_high.num_bits - 1)) / + (2 * (priv->x_bits - 1)); + *y2 = (priv->y_max * + (2 * y_high.start_bit + y_high.num_bits - 1)) / + (2 * (priv->y_bits - 1)); + } + + return fingers; +} + +static void alps_set_slot(struct input_dev *dev, int slot, bool active, + int x, int y) +{ + input_mt_slot(dev, slot); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); + if (active) { + input_report_abs(dev, ABS_MT_POSITION_X, x); + input_report_abs(dev, ABS_MT_POSITION_Y, y); + } +} + +static void alps_report_semi_mt_data(struct input_dev *dev, int num_fingers, + int x1, int y1, int x2, int y2) +{ + alps_set_slot(dev, 0, num_fingers != 0, x1, y1); + alps_set_slot(dev, 1, num_fingers == 2, x2, y2); +} + +static void alps_process_trackstick_packet_v3(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + unsigned char *packet = psmouse->packet; + struct input_dev *dev = priv->dev2; + int x, y, z, left, right, middle; + + /* Sanity check packet */ + if (!(packet[0] & 0x40)) { + psmouse_dbg(psmouse, "Bad trackstick packet, discarding\n"); + return; + } + + /* + * There's a special packet that seems to indicate the end + * of a stream of trackstick data. Filter these out. + */ + if (packet[1] == 0x7f && packet[2] == 0x7f && packet[4] == 0x7f) + return; + + x = (s8)(((packet[0] & 0x20) << 2) | (packet[1] & 0x7f)); + y = (s8)(((packet[0] & 0x10) << 3) | (packet[2] & 0x7f)); + z = (packet[4] & 0x7c) >> 2; + + /* + * The x and y values tend to be quite large, and when used + * alone the trackstick is difficult to use. Scale them down + * to compensate. + */ + x /= 8; + y /= 8; + + input_report_rel(dev, REL_X, x); + input_report_rel(dev, REL_Y, -y); + + /* + * Most ALPS models report the trackstick buttons in the touchpad + * packets, but a few report them here. No reliable way has been + * found to differentiate between the models upfront, so we enable + * the quirk in response to seeing a button press in the trackstick + * packet. + */ + left = packet[3] & 0x01; + right = packet[3] & 0x02; + middle = packet[3] & 0x04; + + if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS) && + (left || right || middle)) + priv->quirks |= ALPS_QUIRK_TRACKSTICK_BUTTONS; + + if (priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS) { + input_report_key(dev, BTN_LEFT, left); + input_report_key(dev, BTN_RIGHT, right); + input_report_key(dev, BTN_MIDDLE, middle); + } + + input_sync(dev); + return; +} + +static void alps_decode_buttons_v3(struct alps_fields *f, unsigned char *p) +{ + f->left = !!(p[3] & 0x01); + f->right = !!(p[3] & 0x02); + f->middle = !!(p[3] & 0x04); + + f->ts_left = !!(p[3] & 0x10); + f->ts_right = !!(p[3] & 0x20); + f->ts_middle = !!(p[3] & 0x40); +} + +static void alps_decode_pinnacle(struct alps_fields *f, unsigned char *p) +{ + f->first_mp = !!(p[4] & 0x40); + f->is_mp = !!(p[0] & 0x40); + + f->fingers = (p[5] & 0x3) + 1; + f->x_map = ((p[4] & 0x7e) << 8) | + ((p[1] & 0x7f) << 2) | + ((p[0] & 0x30) >> 4); + f->y_map = ((p[3] & 0x70) << 4) | + ((p[2] & 0x7f) << 1) | + (p[4] & 0x01); + + f->x = ((p[1] & 0x7f) << 4) | ((p[4] & 0x30) >> 2) | + ((p[0] & 0x30) >> 4); + f->y = ((p[2] & 0x7f) << 4) | (p[4] & 0x0f); + f->z = p[5] & 0x7f; + + alps_decode_buttons_v3(f, p); +} + +static void alps_decode_rushmore(struct alps_fields *f, unsigned char *p) +{ + alps_decode_pinnacle(f, p); + + f->x_map |= (p[5] & 0x10) << 11; + f->y_map |= (p[5] & 0x20) << 6; +} + +static void alps_decode_dolphin(struct alps_fields *f, unsigned char *p) +{ + f->first_mp = !!(p[0] & 0x02); + f->is_mp = !!(p[0] & 0x20); + + f->fingers = ((p[0] & 0x6) >> 1 | + (p[0] & 0x10) >> 2); + f->x_map = ((p[2] & 0x60) >> 5) | + ((p[4] & 0x7f) << 2) | + ((p[5] & 0x7f) << 9) | + ((p[3] & 0x07) << 16) | + ((p[3] & 0x70) << 15) | + ((p[0] & 0x01) << 22); + f->y_map = (p[1] & 0x7f) | + ((p[2] & 0x1f) << 7); + + f->x = ((p[1] & 0x7f) | ((p[4] & 0x0f) << 7)); + f->y = ((p[2] & 0x7f) | ((p[4] & 0xf0) << 3)); + f->z = (p[0] & 4) ? 0 : p[5] & 0x7f; + + alps_decode_buttons_v3(f, p); +} + +static void alps_process_touchpad_packet_v3(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + unsigned char *packet = psmouse->packet; + struct input_dev *dev = psmouse->dev; + struct input_dev *dev2 = priv->dev2; + int x1 = 0, y1 = 0, x2 = 0, y2 = 0; + int fingers = 0, bmap_fingers; + struct alps_fields f; + + priv->decode_fields(&f, packet); + + /* + * There's no single feature of touchpad position and bitmap packets + * that can be used to distinguish between them. We rely on the fact + * that a bitmap packet should always follow a position packet with + * bit 6 of packet[4] set. + */ + if (priv->multi_packet) { + /* + * Sometimes a position packet will indicate a multi-packet + * sequence, but then what follows is another position + * packet. Check for this, and when it happens process the + * position packet as usual. + */ + if (f.is_mp) { + fingers = f.fingers; + bmap_fingers = alps_process_bitmap(priv, + f.x_map, f.y_map, + &x1, &y1, &x2, &y2); + + /* + * We shouldn't report more than one finger if + * we don't have two coordinates. + */ + if (fingers > 1 && bmap_fingers < 2) + fingers = bmap_fingers; + + /* Now process position packet */ + priv->decode_fields(&f, priv->multi_data); + } else { + priv->multi_packet = 0; + } + } + + /* + * Bit 6 of byte 0 is not usually set in position packets. The only + * times it seems to be set is in situations where the data is + * suspect anyway, e.g. a palm resting flat on the touchpad. Given + * this combined with the fact that this bit is useful for filtering + * out misidentified bitmap packets, we reject anything with this + * bit set. + */ + if (f.is_mp) + return; + + if (!priv->multi_packet && f.first_mp) { + priv->multi_packet = 1; + memcpy(priv->multi_data, packet, sizeof(priv->multi_data)); + return; + } + + priv->multi_packet = 0; + + /* + * Sometimes the hardware sends a single packet with z = 0 + * in the middle of a stream. Real releases generate packets + * with x, y, and z all zero, so these seem to be flukes. + * Ignore them. + */ + if (f.x && f.y && !f.z) + return; + + /* + * If we don't have MT data or the bitmaps were empty, we have + * to rely on ST data. + */ + if (!fingers) { + x1 = f.x; + y1 = f.y; + fingers = f.z > 0 ? 1 : 0; + } + + if (f.z >= 64) + input_report_key(dev, BTN_TOUCH, 1); + else + input_report_key(dev, BTN_TOUCH, 0); + + alps_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); + + input_mt_report_finger_count(dev, fingers); + + input_report_key(dev, BTN_LEFT, f.left); + input_report_key(dev, BTN_RIGHT, f.right); + input_report_key(dev, BTN_MIDDLE, f.middle); + + if (f.z > 0) { + input_report_abs(dev, ABS_X, f.x); + input_report_abs(dev, ABS_Y, f.y); + } + input_report_abs(dev, ABS_PRESSURE, f.z); + + input_sync(dev); + + if (!(priv->quirks & ALPS_QUIRK_TRACKSTICK_BUTTONS)) { + input_report_key(dev2, BTN_LEFT, f.ts_left); + input_report_key(dev2, BTN_RIGHT, f.ts_right); + input_report_key(dev2, BTN_MIDDLE, f.ts_middle); + input_sync(dev2); + } +} + +static void alps_process_packet_v3(struct psmouse *psmouse) +{ + unsigned char *packet = psmouse->packet; + + /* + * v3 protocol packets come in three types, two representing + * touchpad data and one representing trackstick data. + * Trackstick packets seem to be distinguished by always + * having 0x3f in the last byte. This value has never been + * observed in the last byte of either of the other types + * of packets. + */ + if (packet[5] == 0x3f) { + alps_process_trackstick_packet_v3(psmouse); + return; + } + + alps_process_touchpad_packet_v3(psmouse); +} + +static void alps_process_packet_v4(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + unsigned char *packet = psmouse->packet; + struct input_dev *dev = psmouse->dev; + int offset; + int x, y, z; + int left, right; + int x1, y1, x2, y2; + int fingers = 0; + unsigned int x_bitmap, y_bitmap; + + /* + * v4 has a 6-byte encoding for bitmap data, but this data is + * broken up between 3 normal packets. Use priv->multi_packet to + * track our position in the bitmap packet. + */ + if (packet[6] & 0x40) { + /* sync, reset position */ + priv->multi_packet = 0; + } + + if (WARN_ON_ONCE(priv->multi_packet > 2)) + return; + + offset = 2 * priv->multi_packet; + priv->multi_data[offset] = packet[6]; + priv->multi_data[offset + 1] = packet[7]; + + if (++priv->multi_packet > 2) { + priv->multi_packet = 0; + + x_bitmap = ((priv->multi_data[2] & 0x1f) << 10) | + ((priv->multi_data[3] & 0x60) << 3) | + ((priv->multi_data[0] & 0x3f) << 2) | + ((priv->multi_data[1] & 0x60) >> 5); + y_bitmap = ((priv->multi_data[5] & 0x01) << 10) | + ((priv->multi_data[3] & 0x1f) << 5) | + (priv->multi_data[1] & 0x1f); + + fingers = alps_process_bitmap(priv, x_bitmap, y_bitmap, + &x1, &y1, &x2, &y2); + + /* Store MT data.*/ + priv->fingers = fingers; + priv->x1 = x1; + priv->x2 = x2; + priv->y1 = y1; + priv->y2 = y2; + } + + left = packet[4] & 0x01; + right = packet[4] & 0x02; + + x = ((packet[1] & 0x7f) << 4) | ((packet[3] & 0x30) >> 2) | + ((packet[0] & 0x30) >> 4); + y = ((packet[2] & 0x7f) << 4) | (packet[3] & 0x0f); + z = packet[5] & 0x7f; + + /* + * If there were no contacts in the bitmap, use ST + * points in MT reports. + * If there were two contacts or more, report MT data. + */ + if (priv->fingers < 2) { + x1 = x; + y1 = y; + fingers = z > 0 ? 1 : 0; + } else { + fingers = priv->fingers; + x1 = priv->x1; + x2 = priv->x2; + y1 = priv->y1; + y2 = priv->y2; + } + + if (z >= 64) + input_report_key(dev, BTN_TOUCH, 1); + else + input_report_key(dev, BTN_TOUCH, 0); + + alps_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); + + input_mt_report_finger_count(dev, fingers); + + input_report_key(dev, BTN_LEFT, left); + input_report_key(dev, BTN_RIGHT, right); + + if (z > 0) { + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + } + input_report_abs(dev, ABS_PRESSURE, z); + + input_sync(dev); +} + +static void alps_report_bare_ps2_packet(struct psmouse *psmouse, + unsigned char packet[], + bool report_buttons) +{ + struct alps_data *priv = psmouse->private; + struct input_dev *dev2 = priv->dev2; + + if (report_buttons) + alps_report_buttons(psmouse, dev2, psmouse->dev, + packet[0] & 1, packet[0] & 2, packet[0] & 4); + + input_report_rel(dev2, REL_X, + packet[1] ? packet[1] - ((packet[0] << 4) & 0x100) : 0); + input_report_rel(dev2, REL_Y, + packet[2] ? ((packet[0] << 3) & 0x100) - packet[2] : 0); + + input_sync(dev2); +} + +static psmouse_ret_t alps_handle_interleaved_ps2(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + + if (psmouse->pktcnt < 6) + return PSMOUSE_GOOD_DATA; + + if (psmouse->pktcnt == 6) { + /* + * Start a timer to flush the packet if it ends up last + * 6-byte packet in the stream. Timer needs to fire + * psmouse core times out itself. 20 ms should be enough + * to decide if we are getting more data or not. + */ + mod_timer(&priv->timer, jiffies + msecs_to_jiffies(20)); + return PSMOUSE_GOOD_DATA; + } + + del_timer(&priv->timer); + + if (psmouse->packet[6] & 0x80) { + + /* + * Highest bit is set - that means we either had + * complete ALPS packet and this is start of the + * next packet or we got garbage. + */ + + if (((psmouse->packet[3] | + psmouse->packet[4] | + psmouse->packet[5]) & 0x80) || + (!alps_is_valid_first_byte(priv, psmouse->packet[6]))) { + psmouse_dbg(psmouse, + "refusing packet %4ph (suspected interleaved ps/2)\n", + psmouse->packet + 3); + return PSMOUSE_BAD_DATA; + } + + priv->process_packet(psmouse); + + /* Continue with the next packet */ + psmouse->packet[0] = psmouse->packet[6]; + psmouse->pktcnt = 1; + + } else { + + /* + * High bit is 0 - that means that we indeed got a PS/2 + * packet in the middle of ALPS packet. + * + * There is also possibility that we got 6-byte ALPS + * packet followed by 3-byte packet from trackpoint. We + * can not distinguish between these 2 scenarios but + * because the latter is unlikely to happen in course of + * normal operation (user would need to press all + * buttons on the pad and start moving trackpoint + * without touching the pad surface) we assume former. + * Even if we are wrong the wost thing that would happen + * the cursor would jump but we should not get protocol + * de-synchronization. + */ + + alps_report_bare_ps2_packet(psmouse, &psmouse->packet[3], + false); + + /* + * Continue with the standard ALPS protocol handling, + * but make sure we won't process it as an interleaved + * packet again, which may happen if all buttons are + * pressed. To avoid this let's reset the 4th bit which + * is normally 1. + */ + psmouse->packet[3] = psmouse->packet[6] & 0xf7; + psmouse->pktcnt = 4; + } + + return PSMOUSE_GOOD_DATA; +} + +static void alps_flush_packet(unsigned long data) +{ + struct psmouse *psmouse = (struct psmouse *)data; + struct alps_data *priv = psmouse->private; + + serio_pause_rx(psmouse->ps2dev.serio); + + if (psmouse->pktcnt == psmouse->pktsize) { + + /* + * We did not any more data in reasonable amount of time. + * Validate the last 3 bytes and process as a standard + * ALPS packet. + */ + if ((psmouse->packet[3] | + psmouse->packet[4] | + psmouse->packet[5]) & 0x80) { + psmouse_dbg(psmouse, + "refusing packet %3ph (suspected interleaved ps/2)\n", + psmouse->packet + 3); + } else { + priv->process_packet(psmouse); + } + psmouse->pktcnt = 0; + } + + serio_continue_rx(psmouse->ps2dev.serio); +} + +static psmouse_ret_t alps_process_byte(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + + /* + * Check if we are dealing with a bare PS/2 packet, presumably from + * a device connected to the external PS/2 port. Because bare PS/2 + * protocol does not have enough constant bits to self-synchronize + * properly we only do this if the device is fully synchronized. + */ + if (!psmouse->out_of_sync_cnt && (psmouse->packet[0] & 0xc8) == 0x08) { + if (psmouse->pktcnt == 3) { + alps_report_bare_ps2_packet(psmouse, psmouse->packet, + true); + return PSMOUSE_FULL_PACKET; + } + return PSMOUSE_GOOD_DATA; + } + + /* Check for PS/2 packet stuffed in the middle of ALPS packet. */ + + if ((priv->flags & ALPS_PS2_INTERLEAVED) && + psmouse->pktcnt >= 4 && (psmouse->packet[3] & 0x0f) == 0x0f) { + return alps_handle_interleaved_ps2(psmouse); + } + + if (!alps_is_valid_first_byte(priv, psmouse->packet[0])) { + psmouse_dbg(psmouse, + "refusing packet[0] = %x (mask0 = %x, byte0 = %x)\n", + psmouse->packet[0], priv->mask0, priv->byte0); + return PSMOUSE_BAD_DATA; + } + + /* Bytes 2 - pktsize should have 0 in the highest bit */ + if (priv->proto_version != ALPS_PROTO_V5 && + psmouse->pktcnt >= 2 && psmouse->pktcnt <= psmouse->pktsize && + (psmouse->packet[psmouse->pktcnt - 1] & 0x80)) { + psmouse_dbg(psmouse, "refusing packet[%i] = %x\n", + psmouse->pktcnt - 1, + psmouse->packet[psmouse->pktcnt - 1]); + return PSMOUSE_BAD_DATA; + } + + if (psmouse->pktcnt == psmouse->pktsize) { + priv->process_packet(psmouse); + return PSMOUSE_FULL_PACKET; + } + + return PSMOUSE_GOOD_DATA; +} + +static int alps_command_mode_send_nibble(struct psmouse *psmouse, int nibble) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + struct alps_data *priv = psmouse->private; + int command; + unsigned char *param; + unsigned char dummy[4]; + + BUG_ON(nibble > 0xf); + + command = priv->nibble_commands[nibble].command; + param = (command & 0x0f00) ? + dummy : (unsigned char *)&priv->nibble_commands[nibble].data; + + if (ps2_command(ps2dev, param, command)) + return -1; + + return 0; +} + +static int alps_command_mode_set_addr(struct psmouse *psmouse, int addr) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + struct alps_data *priv = psmouse->private; + int i, nibble; + + if (ps2_command(ps2dev, NULL, priv->addr_command)) + return -1; + + for (i = 12; i >= 0; i -= 4) { + nibble = (addr >> i) & 0xf; + if (alps_command_mode_send_nibble(psmouse, nibble)) + return -1; + } + + return 0; +} + +static int __alps_command_mode_read_reg(struct psmouse *psmouse, int addr) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[4]; + + if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) + return -1; + + /* + * The address being read is returned in the first two bytes + * of the result. Check that this address matches the expected + * address. + */ + if (addr != ((param[0] << 8) | param[1])) + return -1; + + return param[2]; +} + +static int alps_command_mode_read_reg(struct psmouse *psmouse, int addr) +{ + if (alps_command_mode_set_addr(psmouse, addr)) + return -1; + return __alps_command_mode_read_reg(psmouse, addr); +} + +static int __alps_command_mode_write_reg(struct psmouse *psmouse, u8 value) +{ + if (alps_command_mode_send_nibble(psmouse, (value >> 4) & 0xf)) + return -1; + if (alps_command_mode_send_nibble(psmouse, value & 0xf)) + return -1; + return 0; +} + +static int alps_command_mode_write_reg(struct psmouse *psmouse, int addr, + u8 value) +{ + if (alps_command_mode_set_addr(psmouse, addr)) + return -1; + return __alps_command_mode_write_reg(psmouse, value); +} + +static int alps_rpt_cmd(struct psmouse *psmouse, int init_command, + int repeated_command, unsigned char *param) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + + param[0] = 0; + if (init_command && ps2_command(ps2dev, param, init_command)) + return -EIO; + + if (ps2_command(ps2dev, NULL, repeated_command) || + ps2_command(ps2dev, NULL, repeated_command) || + ps2_command(ps2dev, NULL, repeated_command)) + return -EIO; + + param[0] = param[1] = param[2] = 0xff; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) + return -EIO; + + psmouse_dbg(psmouse, "%2.2X report: %3ph\n", + repeated_command, param); + return 0; +} + +static int alps_enter_command_mode(struct psmouse *psmouse) +{ + unsigned char param[4]; + + if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_RESET_WRAP, param)) { + psmouse_err(psmouse, "failed to enter command mode\n"); + return -1; + } + + if ((param[0] != 0x88 || (param[1] != 0x07 && param[1] != 0x08)) && + param[0] != 0x73) { + psmouse_dbg(psmouse, + "unknown response while entering command mode\n"); + return -1; + } + return 0; +} + +static inline int alps_exit_command_mode(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSTREAM)) + return -1; + return 0; +} + +/* + * For DualPoint devices select the device that should respond to + * subsequent commands. It looks like glidepad is behind stickpointer, + * I'd thought it would be other way around... + */ +static int alps_passthrough_mode_v2(struct psmouse *psmouse, bool enable) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + int cmd = enable ? PSMOUSE_CMD_SETSCALE21 : PSMOUSE_CMD_SETSCALE11; + + if (ps2_command(ps2dev, NULL, cmd) || + ps2_command(ps2dev, NULL, cmd) || + ps2_command(ps2dev, NULL, cmd) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE)) + return -1; + + /* we may get 3 more bytes, just ignore them */ + ps2_drain(ps2dev, 3, 100); + + return 0; +} + +static int alps_absolute_mode_v1_v2(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + + /* Try ALPS magic knock - 4 disable before enable */ + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE)) + return -1; + + /* + * Switch mouse to poll (remote) mode so motion data will not + * get in our way + */ + return ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETPOLL); +} + +static int alps_get_status(struct psmouse *psmouse, char *param) +{ + /* Get status: 0xF5 0xF5 0xF5 0xE9 */ + if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_DISABLE, param)) + return -1; + + return 0; +} + +/* + * Turn touchpad tapping on or off. The sequences are: + * 0xE9 0xF5 0xF5 0xF3 0x0A to enable, + * 0xE9 0xF5 0xF5 0xE8 0x00 to disable. + * My guess that 0xE9 (GetInfo) is here as a sync point. + * For models that also have stickpointer (DualPoints) its tapping + * is controlled separately (0xE6 0xE6 0xE6 0xF3 0x14|0x0A) but + * we don't fiddle with it. + */ +static int alps_tap_mode(struct psmouse *psmouse, int enable) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + int cmd = enable ? PSMOUSE_CMD_SETRATE : PSMOUSE_CMD_SETRES; + unsigned char tap_arg = enable ? 0x0A : 0x00; + unsigned char param[4]; + + if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, &tap_arg, cmd)) + return -1; + + if (alps_get_status(psmouse, param)) + return -1; + + return 0; +} + +/* + * alps_poll() - poll the touchpad for current motion packet. + * Used in resync. + */ +static int alps_poll(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + unsigned char buf[sizeof(psmouse->packet)]; + bool poll_failed; + + if (priv->flags & ALPS_PASS) + alps_passthrough_mode_v2(psmouse, true); + + poll_failed = ps2_command(&psmouse->ps2dev, buf, + PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)) < 0; + + if (priv->flags & ALPS_PASS) + alps_passthrough_mode_v2(psmouse, false); + + if (poll_failed || (buf[0] & priv->mask0) != priv->byte0) + return -1; + + if ((psmouse->badbyte & 0xc8) == 0x08) { +/* + * Poll the track stick ... + */ + if (ps2_command(&psmouse->ps2dev, buf, PSMOUSE_CMD_POLL | (3 << 8))) + return -1; + } + + memcpy(psmouse->packet, buf, sizeof(buf)); + return 0; +} + +static int alps_hw_init_v1_v2(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + + if ((priv->flags & ALPS_PASS) && + alps_passthrough_mode_v2(psmouse, true)) { + return -1; + } + + if (alps_tap_mode(psmouse, true)) { + psmouse_warn(psmouse, "Failed to enable hardware tapping\n"); + return -1; + } + + if (alps_absolute_mode_v1_v2(psmouse)) { + psmouse_err(psmouse, "Failed to enable absolute mode\n"); + return -1; + } + + if ((priv->flags & ALPS_PASS) && + alps_passthrough_mode_v2(psmouse, false)) { + return -1; + } + + /* ALPS needs stream mode, otherwise it won't report any data */ + if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSTREAM)) { + psmouse_err(psmouse, "Failed to enable stream mode\n"); + return -1; + } + + return 0; +} + +/* + * Enable or disable passthrough mode to the trackstick. + */ +static int alps_passthrough_mode_v3(struct psmouse *psmouse, + int reg_base, bool enable) +{ + int reg_val, ret = -1; + + if (alps_enter_command_mode(psmouse)) + return -1; + + reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x0008); + if (reg_val == -1) + goto error; + + if (enable) + reg_val |= 0x01; + else + reg_val &= ~0x01; + + ret = __alps_command_mode_write_reg(psmouse, reg_val); + +error: + if (alps_exit_command_mode(psmouse)) + ret = -1; + return ret; +} + +/* Must be in command mode when calling this function */ +static int alps_absolute_mode_v3(struct psmouse *psmouse) +{ + int reg_val; + + reg_val = alps_command_mode_read_reg(psmouse, 0x0004); + if (reg_val == -1) + return -1; + + reg_val |= 0x06; + if (__alps_command_mode_write_reg(psmouse, reg_val)) + return -1; + + return 0; +} + +static int alps_probe_trackstick_v3(struct psmouse *psmouse, int reg_base) +{ + int ret = -EIO, reg_val; + + if (alps_enter_command_mode(psmouse)) + goto error; + + reg_val = alps_command_mode_read_reg(psmouse, reg_base + 0x08); + if (reg_val == -1) + goto error; + + /* bit 7: trackstick is present */ + ret = reg_val & 0x80 ? 0 : -ENODEV; + +error: + alps_exit_command_mode(psmouse); + return ret; +} + +static int alps_setup_trackstick_v3(struct psmouse *psmouse, int reg_base) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + int ret = 0; + unsigned char param[4]; + + if (alps_passthrough_mode_v3(psmouse, reg_base, true)) + return -EIO; + + /* + * E7 report for the trackstick + * + * There have been reports of failures to seem to trace back + * to the above trackstick check failing. When these occur + * this E7 report fails, so when that happens we continue + * with the assumption that there isn't a trackstick after + * all. + */ + if (alps_rpt_cmd(psmouse, 0, PSMOUSE_CMD_SETSCALE21, param)) { + psmouse_warn(psmouse, "trackstick E7 report failed\n"); + ret = -ENODEV; + } else { + psmouse_dbg(psmouse, "trackstick E7 report: %3ph\n", param); + + /* + * Not sure what this does, but it is absolutely + * essential. Without it, the touchpad does not + * work at all and the trackstick just emits normal + * PS/2 packets. + */ + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || + alps_command_mode_send_nibble(psmouse, 0x9) || + alps_command_mode_send_nibble(psmouse, 0x4)) { + psmouse_err(psmouse, + "Error sending magic E6 sequence\n"); + ret = -EIO; + goto error; + } + + /* + * This ensures the trackstick packets are in the format + * supported by this driver. If bit 1 isn't set the packet + * format is different. + */ + if (alps_enter_command_mode(psmouse) || + alps_command_mode_write_reg(psmouse, + reg_base + 0x08, 0x82) || + alps_exit_command_mode(psmouse)) + ret = -EIO; + } + +error: + if (alps_passthrough_mode_v3(psmouse, reg_base, false)) + ret = -EIO; + + return ret; +} + +static int alps_hw_init_v3(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + int reg_val; + unsigned char param[4]; + + reg_val = alps_probe_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE); + if (reg_val == -EIO) + goto error; + + if (reg_val == 0 && + alps_setup_trackstick_v3(psmouse, ALPS_REG_BASE_PINNACLE) == -EIO) + goto error; + + if (alps_enter_command_mode(psmouse) || + alps_absolute_mode_v3(psmouse)) { + psmouse_err(psmouse, "Failed to enter absolute mode\n"); + goto error; + } + + reg_val = alps_command_mode_read_reg(psmouse, 0x0006); + if (reg_val == -1) + goto error; + if (__alps_command_mode_write_reg(psmouse, reg_val | 0x01)) + goto error; + + reg_val = alps_command_mode_read_reg(psmouse, 0x0007); + if (reg_val == -1) + goto error; + if (__alps_command_mode_write_reg(psmouse, reg_val | 0x01)) + goto error; + + if (alps_command_mode_read_reg(psmouse, 0x0144) == -1) + goto error; + if (__alps_command_mode_write_reg(psmouse, 0x04)) + goto error; + + if (alps_command_mode_read_reg(psmouse, 0x0159) == -1) + goto error; + if (__alps_command_mode_write_reg(psmouse, 0x03)) + goto error; + + if (alps_command_mode_read_reg(psmouse, 0x0163) == -1) + goto error; + if (alps_command_mode_write_reg(psmouse, 0x0163, 0x03)) + goto error; + + if (alps_command_mode_read_reg(psmouse, 0x0162) == -1) + goto error; + if (alps_command_mode_write_reg(psmouse, 0x0162, 0x04)) + goto error; + + alps_exit_command_mode(psmouse); + + /* Set rate and enable data reporting */ + param[0] = 0x64; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE)) { + psmouse_err(psmouse, "Failed to enable data reporting\n"); + return -1; + } + + return 0; + +error: + /* + * Leaving the touchpad in command mode will essentially render + * it unusable until the machine reboots, so exit it here just + * to be safe + */ + alps_exit_command_mode(psmouse); + return -1; +} + +static int alps_hw_init_rushmore_v3(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + struct ps2dev *ps2dev = &psmouse->ps2dev; + int reg_val, ret = -1; + + if (priv->flags & ALPS_DUALPOINT) { + reg_val = alps_setup_trackstick_v3(psmouse, + ALPS_REG_BASE_RUSHMORE); + if (reg_val == -EIO) + goto error; + if (reg_val == -ENODEV) + priv->flags &= ~ALPS_DUALPOINT; + } + + if (alps_enter_command_mode(psmouse) || + alps_command_mode_read_reg(psmouse, 0xc2d9) == -1 || + alps_command_mode_write_reg(psmouse, 0xc2cb, 0x00)) + goto error; + + reg_val = alps_command_mode_read_reg(psmouse, 0xc2c6); + if (reg_val == -1) + goto error; + if (__alps_command_mode_write_reg(psmouse, reg_val & 0xfd)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0xc2c9, 0x64)) + goto error; + + /* enter absolute mode */ + reg_val = alps_command_mode_read_reg(psmouse, 0xc2c4); + if (reg_val == -1) + goto error; + if (__alps_command_mode_write_reg(psmouse, reg_val | 0x02)) + goto error; + + alps_exit_command_mode(psmouse); + return ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE); + +error: + alps_exit_command_mode(psmouse); + return ret; +} + +/* Must be in command mode when calling this function */ +static int alps_absolute_mode_v4(struct psmouse *psmouse) +{ + int reg_val; + + reg_val = alps_command_mode_read_reg(psmouse, 0x0004); + if (reg_val == -1) + return -1; + + reg_val |= 0x02; + if (__alps_command_mode_write_reg(psmouse, reg_val)) + return -1; + + return 0; +} + +static int alps_hw_init_v4(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[4]; + + if (alps_enter_command_mode(psmouse)) + goto error; + + if (alps_absolute_mode_v4(psmouse)) { + psmouse_err(psmouse, "Failed to enter absolute mode\n"); + goto error; + } + + if (alps_command_mode_write_reg(psmouse, 0x0007, 0x8c)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x0149, 0x03)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x0160, 0x03)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x017f, 0x15)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x0151, 0x01)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x0168, 0x03)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x014a, 0x03)) + goto error; + + if (alps_command_mode_write_reg(psmouse, 0x0161, 0x03)) + goto error; + + alps_exit_command_mode(psmouse); + + /* + * This sequence changes the output from a 9-byte to an + * 8-byte format. All the same data seems to be present, + * just in a more compact format. + */ + param[0] = 0xc8; + param[1] = 0x64; + param[2] = 0x50; + if (ps2_command(ps2dev, ¶m[0], PSMOUSE_CMD_SETRATE) || + ps2_command(ps2dev, ¶m[1], PSMOUSE_CMD_SETRATE) || + ps2_command(ps2dev, ¶m[2], PSMOUSE_CMD_SETRATE) || + ps2_command(ps2dev, param, PSMOUSE_CMD_GETID)) + return -1; + + /* Set rate and enable data reporting */ + param[0] = 0x64; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_ENABLE)) { + psmouse_err(psmouse, "Failed to enable data reporting\n"); + return -1; + } + + return 0; + +error: + /* + * Leaving the touchpad in command mode will essentially render + * it unusable until the machine reboots, so exit it here just + * to be safe + */ + alps_exit_command_mode(psmouse); + return -1; +} + +static int alps_hw_init_dolphin_v1(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[2]; + + /* This is dolphin "v1" as empirically defined by florin9doi */ + param[0] = 0x64; + param[1] = 0x28; + + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSTREAM) || + ps2_command(ps2dev, ¶m[0], PSMOUSE_CMD_SETRATE) || + ps2_command(ps2dev, ¶m[1], PSMOUSE_CMD_SETRATE)) + return -1; + + return 0; +} + +static void alps_set_defaults(struct alps_data *priv) +{ + priv->byte0 = 0x8f; + priv->mask0 = 0x8f; + priv->flags = ALPS_DUALPOINT; + + priv->x_max = 2000; + priv->y_max = 1400; + priv->x_bits = 15; + priv->y_bits = 11; + + switch (priv->proto_version) { + case ALPS_PROTO_V1: + case ALPS_PROTO_V2: + priv->hw_init = alps_hw_init_v1_v2; + priv->process_packet = alps_process_packet_v1_v2; + priv->set_abs_params = alps_set_abs_params_st; + break; + case ALPS_PROTO_V3: + priv->hw_init = alps_hw_init_v3; + priv->process_packet = alps_process_packet_v3; + priv->set_abs_params = alps_set_abs_params_mt; + priv->decode_fields = alps_decode_pinnacle; + priv->nibble_commands = alps_v3_nibble_commands; + priv->addr_command = PSMOUSE_CMD_RESET_WRAP; + break; + case ALPS_PROTO_V4: + priv->hw_init = alps_hw_init_v4; + priv->process_packet = alps_process_packet_v4; + priv->set_abs_params = alps_set_abs_params_mt; + priv->nibble_commands = alps_v4_nibble_commands; + priv->addr_command = PSMOUSE_CMD_DISABLE; + break; + case ALPS_PROTO_V5: + priv->hw_init = alps_hw_init_dolphin_v1; + priv->process_packet = alps_process_packet_v3; + priv->decode_fields = alps_decode_dolphin; + priv->set_abs_params = alps_set_abs_params_mt; + priv->nibble_commands = alps_v3_nibble_commands; + priv->addr_command = PSMOUSE_CMD_RESET_WRAP; + priv->byte0 = 0xc8; + priv->mask0 = 0xc8; + priv->flags = 0; + priv->x_max = 1360; + priv->y_max = 660; + priv->x_bits = 23; + priv->y_bits = 12; + break; + } +} + +static int alps_match_table(struct psmouse *psmouse, struct alps_data *priv, + unsigned char *e7, unsigned char *ec) +{ + const struct alps_model_info *model; + int i; + + for (i = 0; i < ARRAY_SIZE(alps_model_data); i++) { + model = &alps_model_data[i]; + + if (!memcmp(e7, model->signature, sizeof(model->signature)) && + (!model->command_mode_resp || + model->command_mode_resp == ec[2])) { + + priv->proto_version = model->proto_version; + alps_set_defaults(priv); + + priv->flags = model->flags; + priv->byte0 = model->byte0; + priv->mask0 = model->mask0; + + return 0; + } + } + + return -EINVAL; +} + +static int alps_identify(struct psmouse *psmouse, struct alps_data *priv) +{ + unsigned char e6[4], e7[4], ec[4]; + + /* + * First try "E6 report". + * ALPS should return 0,0,10 or 0,0,100 if no buttons are pressed. + * The bits 0-2 of the first byte will be 1s if some buttons are + * pressed. + */ + if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, + PSMOUSE_CMD_SETSCALE11, e6)) + return -EIO; + + if ((e6[0] & 0xf8) != 0 || e6[1] != 0 || (e6[2] != 10 && e6[2] != 100)) + return -EINVAL; + + /* + * Now get the "E7" and "EC" reports. These will uniquely identify + * most ALPS touchpads. + */ + if (alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, + PSMOUSE_CMD_SETSCALE21, e7) || + alps_rpt_cmd(psmouse, PSMOUSE_CMD_SETRES, + PSMOUSE_CMD_RESET_WRAP, ec) || + alps_exit_command_mode(psmouse)) + return -EIO; + + if (alps_match_table(psmouse, priv, e7, ec) == 0) { + return 0; + } else if (e7[0] == 0x73 && e7[1] == 0x03 && e7[2] == 0x50 && + ec[0] == 0x73 && ec[1] == 0x01) { + priv->proto_version = ALPS_PROTO_V5; + alps_set_defaults(priv); + + return 0; + } else if (ec[0] == 0x88 && ec[1] == 0x08) { + priv->proto_version = ALPS_PROTO_V3; + alps_set_defaults(priv); + + priv->hw_init = alps_hw_init_rushmore_v3; + priv->decode_fields = alps_decode_rushmore; + priv->x_bits = 16; + priv->y_bits = 12; + + /* hack to make addr_command, nibble_command available */ + psmouse->private = priv; + + if (alps_probe_trackstick_v3(psmouse, ALPS_REG_BASE_RUSHMORE)) + priv->flags &= ~ALPS_DUALPOINT; + + return 0; + } else if (ec[0] == 0x88 && ec[1] == 0x07 && + ec[2] >= 0x90 && ec[2] <= 0x9d) { + priv->proto_version = ALPS_PROTO_V3; + alps_set_defaults(priv); + + return 0; + } + + psmouse_info(psmouse, + "Unknown ALPS touchpad: E7=%3ph, EC=%3ph\n", e7, ec); + + return -EINVAL; +} + +static int alps_reconnect(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + + psmouse_reset(psmouse); + + if (alps_identify(psmouse, priv) < 0) + return -1; + + return priv->hw_init(psmouse); +} + +static void alps_disconnect(struct psmouse *psmouse) +{ + struct alps_data *priv = psmouse->private; + + psmouse_reset(psmouse); + del_timer_sync(&priv->timer); + input_unregister_device(priv->dev2); + kfree(priv); +} + +static void alps_set_abs_params_st(struct alps_data *priv, + struct input_dev *dev1) +{ + input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0); + input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0); +} + +static void alps_set_abs_params_mt(struct alps_data *priv, + struct input_dev *dev1) +{ + set_bit(INPUT_PROP_SEMI_MT, dev1->propbit); + input_mt_init_slots(dev1, 2, 0); + input_set_abs_params(dev1, ABS_MT_POSITION_X, 0, priv->x_max, 0, 0); + input_set_abs_params(dev1, ABS_MT_POSITION_Y, 0, priv->y_max, 0, 0); + + set_bit(BTN_TOOL_DOUBLETAP, dev1->keybit); + set_bit(BTN_TOOL_TRIPLETAP, dev1->keybit); + set_bit(BTN_TOOL_QUADTAP, dev1->keybit); + + input_set_abs_params(dev1, ABS_X, 0, priv->x_max, 0, 0); + input_set_abs_params(dev1, ABS_Y, 0, priv->y_max, 0, 0); +} + +int alps_init(struct psmouse *psmouse) +{ + struct alps_data *priv; + struct input_dev *dev1 = psmouse->dev, *dev2; + + priv = kzalloc(sizeof(struct alps_data), GFP_KERNEL); + dev2 = input_allocate_device(); + if (!priv || !dev2) + goto init_fail; + + priv->dev2 = dev2; + setup_timer(&priv->timer, alps_flush_packet, (unsigned long)psmouse); + + psmouse->private = priv; + + psmouse_reset(psmouse); + + if (alps_identify(psmouse, priv) < 0) + goto init_fail; + + if (priv->hw_init(psmouse)) + goto init_fail; + + /* + * Undo part of setup done for us by psmouse core since touchpad + * is not a relative device. + */ + __clear_bit(EV_REL, dev1->evbit); + __clear_bit(REL_X, dev1->relbit); + __clear_bit(REL_Y, dev1->relbit); + + /* + * Now set up our capabilities. + */ + dev1->evbit[BIT_WORD(EV_KEY)] |= BIT_MASK(EV_KEY); + dev1->keybit[BIT_WORD(BTN_TOUCH)] |= BIT_MASK(BTN_TOUCH); + dev1->keybit[BIT_WORD(BTN_TOOL_FINGER)] |= BIT_MASK(BTN_TOOL_FINGER); + dev1->keybit[BIT_WORD(BTN_LEFT)] |= + BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); + + dev1->evbit[BIT_WORD(EV_ABS)] |= BIT_MASK(EV_ABS); + + priv->set_abs_params(priv, dev1); + input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); + + if (priv->flags & ALPS_WHEEL) { + dev1->evbit[BIT_WORD(EV_REL)] |= BIT_MASK(EV_REL); + dev1->relbit[BIT_WORD(REL_WHEEL)] |= BIT_MASK(REL_WHEEL); + } + + if (priv->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { + dev1->keybit[BIT_WORD(BTN_FORWARD)] |= BIT_MASK(BTN_FORWARD); + dev1->keybit[BIT_WORD(BTN_BACK)] |= BIT_MASK(BTN_BACK); + } + + if (priv->flags & ALPS_FOUR_BUTTONS) { + dev1->keybit[BIT_WORD(BTN_0)] |= BIT_MASK(BTN_0); + dev1->keybit[BIT_WORD(BTN_1)] |= BIT_MASK(BTN_1); + dev1->keybit[BIT_WORD(BTN_2)] |= BIT_MASK(BTN_2); + dev1->keybit[BIT_WORD(BTN_3)] |= BIT_MASK(BTN_3); + } else { + dev1->keybit[BIT_WORD(BTN_MIDDLE)] |= BIT_MASK(BTN_MIDDLE); + } + + snprintf(priv->phys, sizeof(priv->phys), "%s/input1", psmouse->ps2dev.serio->phys); + dev2->phys = priv->phys; + dev2->name = (priv->flags & ALPS_DUALPOINT) ? + "DualPoint Stick" : "PS/2 Mouse"; + dev2->id.bustype = BUS_I8042; + dev2->id.vendor = 0x0002; + dev2->id.product = PSMOUSE_ALPS; + dev2->id.version = 0x0000; + dev2->dev.parent = &psmouse->ps2dev.serio->dev; + + dev2->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + dev2->relbit[BIT_WORD(REL_X)] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + dev2->keybit[BIT_WORD(BTN_LEFT)] = + BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + + if (input_register_device(priv->dev2)) + goto init_fail; + + psmouse->protocol_handler = alps_process_byte; + psmouse->poll = alps_poll; + psmouse->disconnect = alps_disconnect; + psmouse->reconnect = alps_reconnect; + psmouse->pktsize = priv->proto_version == ALPS_PROTO_V4 ? 8 : 6; + + /* We are having trouble resyncing ALPS touchpads so disable it for now */ + psmouse->resync_time = 0; + + /* Allow 2 invalid packets without resetting device */ + psmouse->resetafter = psmouse->pktsize * 2; + + return 0; + +init_fail: + psmouse_reset(psmouse); + input_free_device(dev2); + kfree(priv); + psmouse->private = NULL; + return -1; +} + +int alps_detect(struct psmouse *psmouse, bool set_properties) +{ + struct alps_data dummy; + + if (alps_identify(psmouse, &dummy) < 0) + return -1; + + if (set_properties) { + psmouse->vendor = "ALPS"; + psmouse->name = dummy.flags & ALPS_DUALPOINT ? + "DualPoint TouchPad" : "GlidePoint"; + psmouse->model = dummy.proto_version << 8; + } + return 0; +} + diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h new file mode 100644 index 00000000..eee59853 --- /dev/null +++ b/drivers/input/mouse/alps.h @@ -0,0 +1,176 @@ +/* + * ALPS touchpad PS/2 mouse driver + * + * Copyright (c) 2003 Peter Osterlund + * Copyright (c) 2005 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _ALPS_H +#define _ALPS_H + +#define ALPS_PROTO_V1 1 +#define ALPS_PROTO_V2 2 +#define ALPS_PROTO_V3 3 +#define ALPS_PROTO_V4 4 +#define ALPS_PROTO_V5 5 + +/** + * struct alps_model_info - touchpad ID table + * @signature: E7 response string to match. + * @command_mode_resp: For V3/V4 touchpads, the final byte of the EC response + * (aka command mode response) identifies the firmware minor version. This + * can be used to distinguish different hardware models which are not + * uniquely identifiable through their E7 responses. + * @proto_version: Indicates V1/V2/V3/... + * @byte0: Helps figure out whether a position report packet matches the + * known format for this model. The first byte of the report, ANDed with + * mask0, should match byte0. + * @mask0: The mask used to check the first byte of the report. + * @flags: Additional device capabilities (passthrough port, trackstick, etc.). + * + * Many (but not all) ALPS touchpads can be identified by looking at the + * values returned in the "E7 report" and/or the "EC report." This table + * lists a number of such touchpads. + */ +struct alps_model_info { + unsigned char signature[3]; + unsigned char command_mode_resp; + unsigned char proto_version; + unsigned char byte0, mask0; + unsigned char flags; +}; + +/** + * struct alps_nibble_commands - encodings for register accesses + * @command: PS/2 command used for the nibble + * @data: Data supplied as an argument to the PS/2 command, if applicable + * + * The ALPS protocol uses magic sequences to transmit binary data to the + * touchpad, as it is generally not OK to send arbitrary bytes out the + * PS/2 port. Each of the sequences in this table sends one nibble of the + * register address or (write) data. Different versions of the ALPS protocol + * use slightly different encodings. + */ +struct alps_nibble_commands { + int command; + unsigned char data; +}; + +/** + * struct alps_fields - decoded version of the report packet + * @x_map: Bitmap of active X positions for MT. + * @y_map: Bitmap of active Y positions for MT. + * @fingers: Number of fingers for MT. + * @x: X position for ST. + * @y: Y position for ST. + * @z: Z position for ST. + * @first_mp: Packet is the first of a multi-packet report. + * @is_mp: Packet is part of a multi-packet report. + * @left: Left touchpad button is active. + * @right: Right touchpad button is active. + * @middle: Middle touchpad button is active. + * @ts_left: Left trackstick button is active. + * @ts_right: Right trackstick button is active. + * @ts_middle: Middle trackstick button is active. + */ +struct alps_fields { + unsigned int x_map; + unsigned int y_map; + unsigned int fingers; + unsigned int x; + unsigned int y; + unsigned int z; + unsigned int first_mp:1; + unsigned int is_mp:1; + + unsigned int left:1; + unsigned int right:1; + unsigned int middle:1; + + unsigned int ts_left:1; + unsigned int ts_right:1; + unsigned int ts_middle:1; +}; + +/** + * struct alps_data - private data structure for the ALPS driver + * @dev2: "Relative" device used to report trackstick or mouse activity. + * @phys: Physical path for the relative device. + * @nibble_commands: Command mapping used for touchpad register accesses. + * @addr_command: Command used to tell the touchpad that a register address + * follows. + * @proto_version: Indicates V1/V2/V3/... + * @byte0: Helps figure out whether a position report packet matches the + * known format for this model. The first byte of the report, ANDed with + * mask0, should match byte0. + * @mask0: The mask used to check the first byte of the report. + * @flags: Additional device capabilities (passthrough port, trackstick, etc.). + * @x_max: Largest possible X position value. + * @y_max: Largest possible Y position value. + * @x_bits: Number of X bits in the MT bitmap. + * @y_bits: Number of Y bits in the MT bitmap. + * @hw_init: Protocol-specific hardware init function. + * @process_packet: Protocol-specific function to process a report packet. + * @decode_fields: Protocol-specific function to read packet bitfields. + * @set_abs_params: Protocol-specific function to configure the input_dev. + * @prev_fin: Finger bit from previous packet. + * @multi_packet: Multi-packet data in progress. + * @multi_data: Saved multi-packet data. + * @x1: First X coordinate from last MT report. + * @x2: Second X coordinate from last MT report. + * @y1: First Y coordinate from last MT report. + * @y2: Second Y coordinate from last MT report. + * @fingers: Number of fingers from last MT report. + * @quirks: Bitmap of ALPS_QUIRK_*. + * @timer: Timer for flushing out the final report packet in the stream. + */ +struct alps_data { + struct input_dev *dev2; + char phys[32]; + + /* these are autodetected when the device is identified */ + const struct alps_nibble_commands *nibble_commands; + int addr_command; + unsigned char proto_version; + unsigned char byte0, mask0; + unsigned char flags; + int x_max; + int y_max; + int x_bits; + int y_bits; + + int (*hw_init)(struct psmouse *psmouse); + void (*process_packet)(struct psmouse *psmouse); + void (*decode_fields)(struct alps_fields *f, unsigned char *p); + void (*set_abs_params)(struct alps_data *priv, struct input_dev *dev1); + + int prev_fin; + int multi_packet; + unsigned char multi_data[6]; + int x1, x2, y1, y2; + int fingers; + u8 quirks; + struct timer_list timer; +}; + +#define ALPS_QUIRK_TRACKSTICK_BUTTONS 1 /* trakcstick buttons in trackstick packet */ + +#ifdef CONFIG_MOUSE_PS2_ALPS +int alps_detect(struct psmouse *psmouse, bool set_properties); +int alps_init(struct psmouse *psmouse); +#else +inline int alps_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +inline int alps_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} +#endif /* CONFIG_MOUSE_PS2_ALPS */ + +#endif diff --git a/drivers/input/mouse/amimouse.c b/drivers/input/mouse/amimouse.c new file mode 100644 index 00000000..b55d5af2 --- /dev/null +++ b/drivers/input/mouse/amimouse.c @@ -0,0 +1,151 @@ +/* + * Amiga mouse driver for Linux/m68k + * + * Copyright (c) 2000-2002 Vojtech Pavlik + * + * Based on the work of: + * Michael Rausch James Banks + * Matther Dillon David Giller + * Nathan Laredo Linus Torvalds + * Johan Myreen Jes Sorensen + * Russell King + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation + */ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Amiga mouse driver"); +MODULE_LICENSE("GPL"); + +static int amimouse_lastx, amimouse_lasty; + +static irqreturn_t amimouse_interrupt(int irq, void *data) +{ + struct input_dev *dev = data; + unsigned short joy0dat, potgor; + int nx, ny, dx, dy; + + joy0dat = amiga_custom.joy0dat; + + nx = joy0dat & 0xff; + ny = joy0dat >> 8; + + dx = nx - amimouse_lastx; + dy = ny - amimouse_lasty; + + if (dx < -127) dx = (256 + nx) - amimouse_lastx; + if (dx > 127) dx = (nx - 256) - amimouse_lastx; + if (dy < -127) dy = (256 + ny) - amimouse_lasty; + if (dy > 127) dy = (ny - 256) - amimouse_lasty; + + amimouse_lastx = nx; + amimouse_lasty = ny; + + potgor = amiga_custom.potgor; + + input_report_rel(dev, REL_X, dx); + input_report_rel(dev, REL_Y, dy); + + input_report_key(dev, BTN_LEFT, ciaa.pra & 0x40); + input_report_key(dev, BTN_MIDDLE, potgor & 0x0100); + input_report_key(dev, BTN_RIGHT, potgor & 0x0400); + + input_sync(dev); + + return IRQ_HANDLED; +} + +static int amimouse_open(struct input_dev *dev) +{ + unsigned short joy0dat; + int error; + + joy0dat = amiga_custom.joy0dat; + + amimouse_lastx = joy0dat & 0xff; + amimouse_lasty = joy0dat >> 8; + + error = request_irq(IRQ_AMIGA_VERTB, amimouse_interrupt, 0, "amimouse", + dev); + if (error) + dev_err(&dev->dev, "Can't allocate irq %d\n", IRQ_AMIGA_VERTB); + + return error; +} + +static void amimouse_close(struct input_dev *dev) +{ + free_irq(IRQ_AMIGA_VERTB, dev); +} + +static int __init amimouse_probe(struct platform_device *pdev) +{ + int err; + struct input_dev *dev; + + dev = input_allocate_device(); + if (!dev) + return -ENOMEM; + + dev->name = pdev->name; + dev->phys = "amimouse/input0"; + dev->id.bustype = BUS_AMIGA; + dev->id.vendor = 0x0001; + dev->id.product = 0x0002; + dev->id.version = 0x0100; + + dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + dev->open = amimouse_open; + dev->close = amimouse_close; + dev->dev.parent = &pdev->dev; + + err = input_register_device(dev); + if (err) { + input_free_device(dev); + return err; + } + + platform_set_drvdata(pdev, dev); + + return 0; +} + +static int __exit amimouse_remove(struct platform_device *pdev) +{ + struct input_dev *dev = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + input_unregister_device(dev); + return 0; +} + +static struct platform_driver amimouse_driver = { + .remove = __exit_p(amimouse_remove), + .driver = { + .name = "amiga-mouse", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver_probe(amimouse_driver, amimouse_probe); + +MODULE_ALIAS("platform:amiga-mouse"); diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c new file mode 100644 index 00000000..e42f1fa8 --- /dev/null +++ b/drivers/input/mouse/appletouch.c @@ -0,0 +1,948 @@ +/* + * Apple USB Touchpad (for post-February 2005 PowerBooks and MacBooks) driver + * + * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2005-2008 Johannes Berg (johannes@sipsolutions.net) + * Copyright (C) 2005-2008 Stelian Pop (stelian@popies.net) + * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) + * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) + * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) + * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) + * Copyright (C) 2007-2008 Sven Anders (anders@anduras.de) + * + * Thanks to Alex Harper for his inputs. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include + +/* + * Note: We try to keep the touchpad aspect ratio while still doing only + * simple arithmetics: + * 0 <= x <= (xsensors - 1) * xfact + * 0 <= y <= (ysensors - 1) * yfact + */ +struct atp_info { + int xsensors; /* number of X sensors */ + int xsensors_17; /* 17" models have more sensors */ + int ysensors; /* number of Y sensors */ + int xfact; /* X multiplication factor */ + int yfact; /* Y multiplication factor */ + int datalen; /* size of USB transfers */ + void (*callback)(struct urb *); /* callback function */ +}; + +static void atp_complete_geyser_1_2(struct urb *urb); +static void atp_complete_geyser_3_4(struct urb *urb); + +static const struct atp_info fountain_info = { + .xsensors = 16, + .xsensors_17 = 26, + .ysensors = 16, + .xfact = 64, + .yfact = 43, + .datalen = 81, + .callback = atp_complete_geyser_1_2, +}; + +static const struct atp_info geyser1_info = { + .xsensors = 16, + .xsensors_17 = 26, + .ysensors = 16, + .xfact = 64, + .yfact = 43, + .datalen = 81, + .callback = atp_complete_geyser_1_2, +}; + +static const struct atp_info geyser2_info = { + .xsensors = 15, + .xsensors_17 = 20, + .ysensors = 9, + .xfact = 64, + .yfact = 43, + .datalen = 64, + .callback = atp_complete_geyser_1_2, +}; + +static const struct atp_info geyser3_info = { + .xsensors = 20, + .ysensors = 10, + .xfact = 64, + .yfact = 64, + .datalen = 64, + .callback = atp_complete_geyser_3_4, +}; + +static const struct atp_info geyser4_info = { + .xsensors = 20, + .ysensors = 10, + .xfact = 64, + .yfact = 64, + .datalen = 64, + .callback = atp_complete_geyser_3_4, +}; + +#define ATP_DEVICE(prod, info) \ +{ \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ + USB_DEVICE_ID_MATCH_INT_CLASS | \ + USB_DEVICE_ID_MATCH_INT_PROTOCOL, \ + .idVendor = 0x05ac, /* Apple */ \ + .idProduct = (prod), \ + .bInterfaceClass = 0x03, \ + .bInterfaceProtocol = 0x02, \ + .driver_info = (unsigned long) &info, \ +} + +/* + * Table of devices (Product IDs) that work with this driver. + * (The names come from Info.plist in AppleUSBTrackpad.kext, + * According to Info.plist Geyser IV is the same as Geyser III.) + */ + +static struct usb_device_id atp_table[] = { + /* PowerBooks Feb 2005, iBooks G4 */ + ATP_DEVICE(0x020e, fountain_info), /* FOUNTAIN ANSI */ + ATP_DEVICE(0x020f, fountain_info), /* FOUNTAIN ISO */ + ATP_DEVICE(0x030a, fountain_info), /* FOUNTAIN TP ONLY */ + ATP_DEVICE(0x030b, geyser1_info), /* GEYSER 1 TP ONLY */ + + /* PowerBooks Oct 2005 */ + ATP_DEVICE(0x0214, geyser2_info), /* GEYSER 2 ANSI */ + ATP_DEVICE(0x0215, geyser2_info), /* GEYSER 2 ISO */ + ATP_DEVICE(0x0216, geyser2_info), /* GEYSER 2 JIS */ + + /* Core Duo MacBook & MacBook Pro */ + ATP_DEVICE(0x0217, geyser3_info), /* GEYSER 3 ANSI */ + ATP_DEVICE(0x0218, geyser3_info), /* GEYSER 3 ISO */ + ATP_DEVICE(0x0219, geyser3_info), /* GEYSER 3 JIS */ + + /* Core2 Duo MacBook & MacBook Pro */ + ATP_DEVICE(0x021a, geyser4_info), /* GEYSER 4 ANSI */ + ATP_DEVICE(0x021b, geyser4_info), /* GEYSER 4 ISO */ + ATP_DEVICE(0x021c, geyser4_info), /* GEYSER 4 JIS */ + + /* Core2 Duo MacBook3,1 */ + ATP_DEVICE(0x0229, geyser4_info), /* GEYSER 4 HF ANSI */ + ATP_DEVICE(0x022a, geyser4_info), /* GEYSER 4 HF ISO */ + ATP_DEVICE(0x022b, geyser4_info), /* GEYSER 4 HF JIS */ + + /* Terminating entry */ + { } +}; +MODULE_DEVICE_TABLE(usb, atp_table); + +/* maximum number of sensors */ +#define ATP_XSENSORS 26 +#define ATP_YSENSORS 16 + +/* amount of fuzz this touchpad generates */ +#define ATP_FUZZ 16 + +/* maximum pressure this driver will report */ +#define ATP_PRESSURE 300 + +/* + * Threshold for the touchpad sensors. Any change less than ATP_THRESHOLD is + * ignored. + */ +#define ATP_THRESHOLD 5 + +/* Geyser initialization constants */ +#define ATP_GEYSER_MODE_READ_REQUEST_ID 1 +#define ATP_GEYSER_MODE_WRITE_REQUEST_ID 9 +#define ATP_GEYSER_MODE_REQUEST_VALUE 0x300 +#define ATP_GEYSER_MODE_REQUEST_INDEX 0 +#define ATP_GEYSER_MODE_VENDOR_VALUE 0x04 + +/** + * enum atp_status_bits - status bit meanings + * + * These constants represent the meaning of the status bits. + * (only Geyser 3/4) + * + * @ATP_STATUS_BUTTON: The button was pressed + * @ATP_STATUS_BASE_UPDATE: Update of the base values (untouched pad) + * @ATP_STATUS_FROM_RESET: Reset previously performed + */ +enum atp_status_bits { + ATP_STATUS_BUTTON = BIT(0), + ATP_STATUS_BASE_UPDATE = BIT(2), + ATP_STATUS_FROM_RESET = BIT(4), +}; + +/* Structure to hold all of our device specific stuff */ +struct atp { + char phys[64]; + struct usb_device *udev; /* usb device */ + struct usb_interface *intf; /* usb interface */ + struct urb *urb; /* usb request block */ + u8 *data; /* transferred data */ + struct input_dev *input; /* input dev */ + const struct atp_info *info; /* touchpad model */ + bool open; + bool valid; /* are the samples valid? */ + bool size_detect_done; + bool overflow_warned; + int x_old; /* last reported x/y, */ + int y_old; /* used for smoothing */ + signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; + signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; + int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; + int idlecount; /* number of empty packets */ + struct work_struct work; +}; + +#define dbg_dump(msg, tab) \ + if (debug > 1) { \ + int __i; \ + printk(KERN_DEBUG "appletouch: %s", msg); \ + for (__i = 0; __i < ATP_XSENSORS + ATP_YSENSORS; __i++) \ + printk(" %02x", tab[__i]); \ + printk("\n"); \ + } + +#define dprintk(format, a...) \ + do { \ + if (debug) \ + printk(KERN_DEBUG format, ##a); \ + } while (0) + +MODULE_AUTHOR("Johannes Berg"); +MODULE_AUTHOR("Stelian Pop"); +MODULE_AUTHOR("Frank Arnold"); +MODULE_AUTHOR("Michael Hanselmann"); +MODULE_AUTHOR("Sven Anders"); +MODULE_DESCRIPTION("Apple PowerBook and MacBook USB touchpad driver"); +MODULE_LICENSE("GPL"); + +/* + * Make the threshold a module parameter + */ +static int threshold = ATP_THRESHOLD; +module_param(threshold, int, 0644); +MODULE_PARM_DESC(threshold, "Discard any change in data from a sensor" + " (the trackpad has many of these sensors)" + " less than this value."); + +static int debug; +module_param(debug, int, 0644); +MODULE_PARM_DESC(debug, "Activate debugging output"); + +/* + * By default newer Geyser devices send standard USB HID mouse + * packets (Report ID 2). This code changes device mode, so it + * sends raw sensor reports (Report ID 5). + */ +static int atp_geyser_init(struct atp *dev) +{ + struct usb_device *udev = dev->udev; + char *data; + int size; + int i; + int ret; + + data = kmalloc(8, GFP_KERNEL); + if (!data) { + dev_err(&dev->intf->dev, "Out of memory\n"); + return -ENOMEM; + } + + size = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + ATP_GEYSER_MODE_READ_REQUEST_ID, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + ATP_GEYSER_MODE_REQUEST_VALUE, + ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000); + + if (size != 8) { + dprintk("atp_geyser_init: read error\n"); + for (i = 0; i < 8; i++) + dprintk("appletouch[%d]: %d\n", i, data[i]); + + dev_err(&dev->intf->dev, "Failed to read mode from device.\n"); + ret = -EIO; + goto out_free; + } + + /* Apply the mode switch */ + data[0] = ATP_GEYSER_MODE_VENDOR_VALUE; + + size = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + ATP_GEYSER_MODE_WRITE_REQUEST_ID, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + ATP_GEYSER_MODE_REQUEST_VALUE, + ATP_GEYSER_MODE_REQUEST_INDEX, data, 8, 5000); + + if (size != 8) { + dprintk("atp_geyser_init: write error\n"); + for (i = 0; i < 8; i++) + dprintk("appletouch[%d]: %d\n", i, data[i]); + + dev_err(&dev->intf->dev, "Failed to request geyser raw mode\n"); + ret = -EIO; + goto out_free; + } + ret = 0; +out_free: + kfree(data); + return ret; +} + +/* + * Reinitialise the device. This usually stops stream of empty packets + * coming from it. + */ +static void atp_reinit(struct work_struct *work) +{ + struct atp *dev = container_of(work, struct atp, work); + int retval; + + dprintk("appletouch: putting appletouch to sleep (reinit)\n"); + atp_geyser_init(dev); + + retval = usb_submit_urb(dev->urb, GFP_ATOMIC); + if (retval) + dev_err(&dev->intf->dev, + "atp_reinit: usb_submit_urb failed with error %d\n", + retval); +} + +static int atp_calculate_abs(int *xy_sensors, int nb_sensors, int fact, + int *z, int *fingers) +{ + int i; + /* values to calculate mean */ + int pcum = 0, psum = 0; + int is_increasing = 0; + + *fingers = 0; + + for (i = 0; i < nb_sensors; i++) { + if (xy_sensors[i] < threshold) { + if (is_increasing) + is_increasing = 0; + + continue; + } + + /* + * Makes the finger detection more versatile. For example, + * two fingers with no gap will be detected. Also, my + * tests show it less likely to have intermittent loss + * of multiple finger readings while moving around (scrolling). + * + * Changes the multiple finger detection to counting humps on + * sensors (transitions from nonincreasing to increasing) + * instead of counting transitions from low sensors (no + * finger reading) to high sensors (finger above + * sensor) + * + * - Jason Parekh + */ + if (i < 1 || + (!is_increasing && xy_sensors[i - 1] < xy_sensors[i])) { + (*fingers)++; + is_increasing = 1; + } else if (i > 0 && (xy_sensors[i - 1] - xy_sensors[i] > threshold)) { + is_increasing = 0; + } + + /* + * Subtracts threshold so a high sensor that just passes the + * threshold won't skew the calculated absolute coordinate. + * Fixes an issue where slowly moving the mouse would + * occasionally jump a number of pixels (slowly moving the + * finger makes this issue most apparent.) + */ + pcum += (xy_sensors[i] - threshold) * i; + psum += (xy_sensors[i] - threshold); + } + + if (psum > 0) { + *z = psum; + return pcum * fact / psum; + } + + return 0; +} + +static inline void atp_report_fingers(struct input_dev *input, int fingers) +{ + input_report_key(input, BTN_TOOL_FINGER, fingers == 1); + input_report_key(input, BTN_TOOL_DOUBLETAP, fingers == 2); + input_report_key(input, BTN_TOOL_TRIPLETAP, fingers > 2); +} + +/* Check URB status and for correct length of data package */ + +#define ATP_URB_STATUS_SUCCESS 0 +#define ATP_URB_STATUS_ERROR 1 +#define ATP_URB_STATUS_ERROR_FATAL 2 + +static int atp_status_check(struct urb *urb) +{ + struct atp *dev = urb->context; + struct usb_interface *intf = dev->intf; + + switch (urb->status) { + case 0: + /* success */ + break; + case -EOVERFLOW: + if (!dev->overflow_warned) { + dev_warn(&intf->dev, + "appletouch: OVERFLOW with data length %d, actual length is %d\n", + dev->info->datalen, dev->urb->actual_length); + dev->overflow_warned = true; + } + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* This urb is terminated, clean up */ + dev_dbg(&intf->dev, + "atp_complete: urb shutting down with status: %d\n", + urb->status); + return ATP_URB_STATUS_ERROR_FATAL; + + default: + dev_dbg(&intf->dev, + "atp_complete: nonzero urb status received: %d\n", + urb->status); + return ATP_URB_STATUS_ERROR; + } + + /* drop incomplete datasets */ + if (dev->urb->actual_length != dev->info->datalen) { + dprintk("appletouch: incomplete data package" + " (first byte: %d, length: %d).\n", + dev->data[0], dev->urb->actual_length); + return ATP_URB_STATUS_ERROR; + } + + return ATP_URB_STATUS_SUCCESS; +} + +static void atp_detect_size(struct atp *dev) +{ + int i; + + /* 17" Powerbooks have extra X sensors */ + for (i = dev->info->xsensors; i < ATP_XSENSORS; i++) { + if (dev->xy_cur[i]) { + + dev_info(&dev->intf->dev, + "appletouch: 17\" model detected.\n"); + + input_set_abs_params(dev->input, ABS_X, 0, + (dev->info->xsensors_17 - 1) * + dev->info->xfact - 1, + ATP_FUZZ, 0); + break; + } + } +} + +/* + * USB interrupt callback functions + */ + +/* Interrupt function for older touchpads: FOUNTAIN/GEYSER1/GEYSER2 */ + +static void atp_complete_geyser_1_2(struct urb *urb) +{ + int x, y, x_z, y_z, x_f, y_f; + int retval, i, j; + int key; + struct atp *dev = urb->context; + int status = atp_status_check(urb); + + if (status == ATP_URB_STATUS_ERROR_FATAL) + return; + else if (status == ATP_URB_STATUS_ERROR) + goto exit; + + /* reorder the sensors values */ + if (dev->info == &geyser2_info) { + memset(dev->xy_cur, 0, sizeof(dev->xy_cur)); + + /* + * The values are laid out like this: + * Y1, Y2, -, Y3, Y4, -, ..., X1, X2, -, X3, X4, -, ... + * '-' is an unused value. + */ + + /* read X values */ + for (i = 0, j = 19; i < 20; i += 2, j += 3) { + dev->xy_cur[i] = dev->data[j]; + dev->xy_cur[i + 1] = dev->data[j + 1]; + } + + /* read Y values */ + for (i = 0, j = 1; i < 9; i += 2, j += 3) { + dev->xy_cur[ATP_XSENSORS + i] = dev->data[j]; + dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 1]; + } + } else { + for (i = 0; i < 8; i++) { + /* X values */ + dev->xy_cur[i + 0] = dev->data[5 * i + 2]; + dev->xy_cur[i + 8] = dev->data[5 * i + 4]; + dev->xy_cur[i + 16] = dev->data[5 * i + 42]; + if (i < 2) + dev->xy_cur[i + 24] = dev->data[5 * i + 44]; + + /* Y values */ + dev->xy_cur[ATP_XSENSORS + i] = dev->data[5 * i + 1]; + dev->xy_cur[ATP_XSENSORS + i + 8] = dev->data[5 * i + 3]; + } + } + + dbg_dump("sample", dev->xy_cur); + + if (!dev->valid) { + /* first sample */ + dev->valid = true; + dev->x_old = dev->y_old = -1; + + /* Store first sample */ + memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); + + /* Perform size detection, if not done already */ + if (unlikely(!dev->size_detect_done)) { + atp_detect_size(dev); + dev->size_detect_done = 1; + goto exit; + } + } + + for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) { + /* accumulate the change */ + signed char change = dev->xy_old[i] - dev->xy_cur[i]; + dev->xy_acc[i] -= change; + + /* prevent down drifting */ + if (dev->xy_acc[i] < 0) + dev->xy_acc[i] = 0; + } + + memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); + + dbg_dump("accumulator", dev->xy_acc); + + x = atp_calculate_abs(dev->xy_acc, ATP_XSENSORS, + dev->info->xfact, &x_z, &x_f); + y = atp_calculate_abs(dev->xy_acc + ATP_XSENSORS, ATP_YSENSORS, + dev->info->yfact, &y_z, &y_f); + key = dev->data[dev->info->datalen - 1] & ATP_STATUS_BUTTON; + + if (x && y) { + if (dev->x_old != -1) { + x = (dev->x_old * 3 + x) >> 2; + y = (dev->y_old * 3 + y) >> 2; + dev->x_old = x; + dev->y_old = y; + + if (debug > 1) + printk(KERN_DEBUG "appletouch: " + "X: %3d Y: %3d Xz: %3d Yz: %3d\n", + x, y, x_z, y_z); + + input_report_key(dev->input, BTN_TOUCH, 1); + input_report_abs(dev->input, ABS_X, x); + input_report_abs(dev->input, ABS_Y, y); + input_report_abs(dev->input, ABS_PRESSURE, + min(ATP_PRESSURE, x_z + y_z)); + atp_report_fingers(dev->input, max(x_f, y_f)); + } + dev->x_old = x; + dev->y_old = y; + + } else if (!x && !y) { + + dev->x_old = dev->y_old = -1; + input_report_key(dev->input, BTN_TOUCH, 0); + input_report_abs(dev->input, ABS_PRESSURE, 0); + atp_report_fingers(dev->input, 0); + + /* reset the accumulator on release */ + memset(dev->xy_acc, 0, sizeof(dev->xy_acc)); + } + + input_report_key(dev->input, BTN_LEFT, key); + input_sync(dev->input); + + exit: + retval = usb_submit_urb(dev->urb, GFP_ATOMIC); + if (retval) + dev_err(&dev->intf->dev, + "atp_complete: usb_submit_urb failed with result %d\n", + retval); +} + +/* Interrupt function for older touchpads: GEYSER3/GEYSER4 */ + +static void atp_complete_geyser_3_4(struct urb *urb) +{ + int x, y, x_z, y_z, x_f, y_f; + int retval, i, j; + int key; + struct atp *dev = urb->context; + int status = atp_status_check(urb); + + if (status == ATP_URB_STATUS_ERROR_FATAL) + return; + else if (status == ATP_URB_STATUS_ERROR) + goto exit; + + /* Reorder the sensors values: + * + * The values are laid out like this: + * -, Y1, Y2, -, Y3, Y4, -, ..., -, X1, X2, -, X3, X4, ... + * '-' is an unused value. + */ + + /* read X values */ + for (i = 0, j = 19; i < 20; i += 2, j += 3) { + dev->xy_cur[i] = dev->data[j + 1]; + dev->xy_cur[i + 1] = dev->data[j + 2]; + } + /* read Y values */ + for (i = 0, j = 1; i < 9; i += 2, j += 3) { + dev->xy_cur[ATP_XSENSORS + i] = dev->data[j + 1]; + dev->xy_cur[ATP_XSENSORS + i + 1] = dev->data[j + 2]; + } + + dbg_dump("sample", dev->xy_cur); + + /* Just update the base values (i.e. touchpad in untouched state) */ + if (dev->data[dev->info->datalen - 1] & ATP_STATUS_BASE_UPDATE) { + + dprintk("appletouch: updated base values\n"); + + memcpy(dev->xy_old, dev->xy_cur, sizeof(dev->xy_old)); + goto exit; + } + + for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) { + /* calculate the change */ + dev->xy_acc[i] = dev->xy_cur[i] - dev->xy_old[i]; + + /* this is a round-robin value, so couple with that */ + if (dev->xy_acc[i] > 127) + dev->xy_acc[i] -= 256; + + if (dev->xy_acc[i] < -127) + dev->xy_acc[i] += 256; + + /* prevent down drifting */ + if (dev->xy_acc[i] < 0) + dev->xy_acc[i] = 0; + } + + dbg_dump("accumulator", dev->xy_acc); + + x = atp_calculate_abs(dev->xy_acc, ATP_XSENSORS, + dev->info->xfact, &x_z, &x_f); + y = atp_calculate_abs(dev->xy_acc + ATP_XSENSORS, ATP_YSENSORS, + dev->info->yfact, &y_z, &y_f); + key = dev->data[dev->info->datalen - 1] & ATP_STATUS_BUTTON; + + if (x && y) { + if (dev->x_old != -1) { + x = (dev->x_old * 3 + x) >> 2; + y = (dev->y_old * 3 + y) >> 2; + dev->x_old = x; + dev->y_old = y; + + if (debug > 1) + printk(KERN_DEBUG "appletouch: X: %3d Y: %3d " + "Xz: %3d Yz: %3d\n", + x, y, x_z, y_z); + + input_report_key(dev->input, BTN_TOUCH, 1); + input_report_abs(dev->input, ABS_X, x); + input_report_abs(dev->input, ABS_Y, y); + input_report_abs(dev->input, ABS_PRESSURE, + min(ATP_PRESSURE, x_z + y_z)); + atp_report_fingers(dev->input, max(x_f, y_f)); + } + dev->x_old = x; + dev->y_old = y; + + } else if (!x && !y) { + + dev->x_old = dev->y_old = -1; + input_report_key(dev->input, BTN_TOUCH, 0); + input_report_abs(dev->input, ABS_PRESSURE, 0); + atp_report_fingers(dev->input, 0); + + /* reset the accumulator on release */ + memset(dev->xy_acc, 0, sizeof(dev->xy_acc)); + } + + input_report_key(dev->input, BTN_LEFT, key); + input_sync(dev->input); + + /* + * Geysers 3/4 will continue to send packets continually after + * the first touch unless reinitialised. Do so if it's been + * idle for a while in order to avoid waking the kernel up + * several hundred times a second. + */ + + /* + * Button must not be pressed when entering suspend, + * otherwise we will never release the button. + */ + if (!x && !y && !key) { + dev->idlecount++; + if (dev->idlecount == 10) { + dev->x_old = dev->y_old = -1; + dev->idlecount = 0; + schedule_work(&dev->work); + /* Don't resubmit urb here, wait for reinit */ + return; + } + } else + dev->idlecount = 0; + + exit: + retval = usb_submit_urb(dev->urb, GFP_ATOMIC); + if (retval) + dev_err(&dev->intf->dev, + "atp_complete: usb_submit_urb failed with result %d\n", + retval); +} + +static int atp_open(struct input_dev *input) +{ + struct atp *dev = input_get_drvdata(input); + + if (usb_submit_urb(dev->urb, GFP_ATOMIC)) + return -EIO; + + dev->open = 1; + return 0; +} + +static void atp_close(struct input_dev *input) +{ + struct atp *dev = input_get_drvdata(input); + + usb_kill_urb(dev->urb); + cancel_work_sync(&dev->work); + dev->open = 0; +} + +static int atp_handle_geyser(struct atp *dev) +{ + if (dev->info != &fountain_info) { + /* switch to raw sensor mode */ + if (atp_geyser_init(dev)) + return -EIO; + + dev_info(&dev->intf->dev, "Geyser mode initialized.\n"); + } + + return 0; +} + +static int atp_probe(struct usb_interface *iface, + const struct usb_device_id *id) +{ + struct atp *dev; + struct input_dev *input_dev; + struct usb_device *udev = interface_to_usbdev(iface); + struct usb_host_interface *iface_desc; + struct usb_endpoint_descriptor *endpoint; + int int_in_endpointAddr = 0; + int i, error = -ENOMEM; + const struct atp_info *info = (const struct atp_info *)id->driver_info; + + /* set up the endpoint information */ + /* use only the first interrupt-in endpoint */ + iface_desc = iface->cur_altsetting; + for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { + endpoint = &iface_desc->endpoint[i].desc; + if (!int_in_endpointAddr && usb_endpoint_is_int_in(endpoint)) { + /* we found an interrupt in endpoint */ + int_in_endpointAddr = endpoint->bEndpointAddress; + break; + } + } + if (!int_in_endpointAddr) { + dev_err(&iface->dev, "Could not find int-in endpoint\n"); + return -EIO; + } + + /* allocate memory for our device state and initialize it */ + dev = kzalloc(sizeof(struct atp), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!dev || !input_dev) { + dev_err(&iface->dev, "Out of memory\n"); + goto err_free_devs; + } + + dev->udev = udev; + dev->intf = iface; + dev->input = input_dev; + dev->info = info; + dev->overflow_warned = false; + + dev->urb = usb_alloc_urb(0, GFP_KERNEL); + if (!dev->urb) + goto err_free_devs; + + dev->data = usb_alloc_coherent(dev->udev, dev->info->datalen, GFP_KERNEL, + &dev->urb->transfer_dma); + if (!dev->data) + goto err_free_urb; + + usb_fill_int_urb(dev->urb, udev, + usb_rcvintpipe(udev, int_in_endpointAddr), + dev->data, dev->info->datalen, + dev->info->callback, dev, 1); + + error = atp_handle_geyser(dev); + if (error) + goto err_free_buffer; + + usb_make_path(udev, dev->phys, sizeof(dev->phys)); + strlcat(dev->phys, "/input0", sizeof(dev->phys)); + + input_dev->name = "appletouch"; + input_dev->phys = dev->phys; + usb_to_input_id(dev->udev, &input_dev->id); + input_dev->dev.parent = &iface->dev; + + input_set_drvdata(input_dev, dev); + + input_dev->open = atp_open; + input_dev->close = atp_close; + + set_bit(EV_ABS, input_dev->evbit); + + input_set_abs_params(input_dev, ABS_X, 0, + (dev->info->xsensors - 1) * dev->info->xfact - 1, + ATP_FUZZ, 0); + input_set_abs_params(input_dev, ABS_Y, 0, + (dev->info->ysensors - 1) * dev->info->yfact - 1, + ATP_FUZZ, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, ATP_PRESSURE, 0, 0); + + set_bit(EV_KEY, input_dev->evbit); + set_bit(BTN_TOUCH, input_dev->keybit); + set_bit(BTN_TOOL_FINGER, input_dev->keybit); + set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); + set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); + set_bit(BTN_LEFT, input_dev->keybit); + + error = input_register_device(dev->input); + if (error) + goto err_free_buffer; + + /* save our data pointer in this interface device */ + usb_set_intfdata(iface, dev); + + INIT_WORK(&dev->work, atp_reinit); + + return 0; + + err_free_buffer: + usb_free_coherent(dev->udev, dev->info->datalen, + dev->data, dev->urb->transfer_dma); + err_free_urb: + usb_free_urb(dev->urb); + err_free_devs: + usb_set_intfdata(iface, NULL); + kfree(dev); + input_free_device(input_dev); + return error; +} + +static void atp_disconnect(struct usb_interface *iface) +{ + struct atp *dev = usb_get_intfdata(iface); + + usb_set_intfdata(iface, NULL); + if (dev) { + usb_kill_urb(dev->urb); + input_unregister_device(dev->input); + usb_free_coherent(dev->udev, dev->info->datalen, + dev->data, dev->urb->transfer_dma); + usb_free_urb(dev->urb); + kfree(dev); + } + dev_info(&iface->dev, "input: appletouch disconnected\n"); +} + +static int atp_recover(struct atp *dev) +{ + int error; + + error = atp_handle_geyser(dev); + if (error) + return error; + + if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC)) + return -EIO; + + return 0; +} + +static int atp_suspend(struct usb_interface *iface, pm_message_t message) +{ + struct atp *dev = usb_get_intfdata(iface); + + usb_kill_urb(dev->urb); + return 0; +} + +static int atp_resume(struct usb_interface *iface) +{ + struct atp *dev = usb_get_intfdata(iface); + + if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC)) + return -EIO; + + return 0; +} + +static int atp_reset_resume(struct usb_interface *iface) +{ + struct atp *dev = usb_get_intfdata(iface); + + return atp_recover(dev); +} + +static struct usb_driver atp_driver = { + .name = "appletouch", + .probe = atp_probe, + .disconnect = atp_disconnect, + .suspend = atp_suspend, + .resume = atp_resume, + .reset_resume = atp_reset_resume, + .id_table = atp_table, +}; + +module_usb_driver(atp_driver); diff --git a/drivers/input/mouse/atarimouse.c b/drivers/input/mouse/atarimouse.c new file mode 100644 index 00000000..d1c43236 --- /dev/null +++ b/drivers/input/mouse/atarimouse.c @@ -0,0 +1,158 @@ +/* + * Atari mouse driver for Linux/m68k + * + * Copyright (c) 2005 Michael Schmitz + * + * Based on: + * Amiga mouse driver for Linux/m68k + * + * Copyright (c) 2000-2002 Vojtech Pavlik + * + */ +/* + * The low level init and interrupt stuff is handled in arch/mm68k/atari/atakeyb.c + * (the keyboard ACIA also handles the mouse and joystick data, and the keyboard + * interrupt is shared with the MIDI ACIA so MIDI data also get handled there). + * This driver only deals with handing key events off to the input layer. + * + * Largely based on the old: + * + * Atari Mouse Driver for Linux + * by Robert de Vries (robert@and.nl) 19Jul93 + * + * 16 Nov 1994 Andreas Schwab + * Compatibility with busmouse + * Support for three button mouse (shamelessly stolen from MiNT) + * third button wired to one of the joystick directions on joystick 1 + * + * 1996/02/11 Andreas Schwab + * Module support + * Allow multiple open's + * + * Converted to use new generic busmouse code. 5 Apr 1998 + * Russell King + */ + + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Michael Schmitz "); +MODULE_DESCRIPTION("Atari mouse driver"); +MODULE_LICENSE("GPL"); + +static int mouse_threshold[2] = {2, 2}; +module_param_array(mouse_threshold, int, NULL, 0); + +#ifdef FIXED_ATARI_JOYSTICK +extern int atari_mouse_buttons; +#endif + +static struct input_dev *atamouse_dev; + +static void atamouse_interrupt(char *buf) +{ + int buttons, dx, dy; + + buttons = (buf[0] & 1) | ((buf[0] & 2) << 1); +#ifdef FIXED_ATARI_JOYSTICK + buttons |= atari_mouse_buttons & 2; + atari_mouse_buttons = buttons; +#endif + + /* only relative events get here */ + dx = buf[1]; + dy = buf[2]; + + input_report_rel(atamouse_dev, REL_X, dx); + input_report_rel(atamouse_dev, REL_Y, dy); + + input_report_key(atamouse_dev, BTN_LEFT, buttons & 0x4); + input_report_key(atamouse_dev, BTN_MIDDLE, buttons & 0x2); + input_report_key(atamouse_dev, BTN_RIGHT, buttons & 0x1); + + input_sync(atamouse_dev); + + return; +} + +static int atamouse_open(struct input_dev *dev) +{ +#ifdef FIXED_ATARI_JOYSTICK + atari_mouse_buttons = 0; +#endif + ikbd_mouse_y0_top(); + ikbd_mouse_thresh(mouse_threshold[0], mouse_threshold[1]); + ikbd_mouse_rel_pos(); + atari_input_mouse_interrupt_hook = atamouse_interrupt; + + return 0; +} + +static void atamouse_close(struct input_dev *dev) +{ + ikbd_mouse_disable(); + atari_input_mouse_interrupt_hook = NULL; +} + +static int __init atamouse_init(void) +{ + int error; + + if (!MACH_IS_ATARI || !ATARIHW_PRESENT(ST_MFP)) + return -ENODEV; + + error = atari_keyb_init(); + if (error) + return error; + + atamouse_dev = input_allocate_device(); + if (!atamouse_dev) + return -ENOMEM; + + atamouse_dev->name = "Atari mouse"; + atamouse_dev->phys = "atamouse/input0"; + atamouse_dev->id.bustype = BUS_HOST; + atamouse_dev->id.vendor = 0x0001; + atamouse_dev->id.product = 0x0002; + atamouse_dev->id.version = 0x0100; + + atamouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + atamouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + atamouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + + atamouse_dev->open = atamouse_open; + atamouse_dev->close = atamouse_close; + + error = input_register_device(atamouse_dev); + if (error) { + input_free_device(atamouse_dev); + return error; + } + + return 0; +} + +static void __exit atamouse_exit(void) +{ + input_unregister_device(atamouse_dev); +} + +module_init(atamouse_init); +module_exit(atamouse_exit); diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c new file mode 100644 index 00000000..a73f9618 --- /dev/null +++ b/drivers/input/mouse/bcm5974.c @@ -0,0 +1,984 @@ +/* + * Apple USB BCM5974 (Macbook Air and Penryn Macbook Pro) multitouch driver + * + * Copyright (C) 2008 Henrik Rydberg (rydberg@euromail.se) + * + * The USB initialization and package decoding was made by + * Scott Shawcroft as part of the touchd user-space driver project: + * Copyright (C) 2008 Scott Shawcroft (scott.shawcroft@gmail.com) + * + * The BCM5974 driver is based on the appletouch driver: + * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) + * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) + * Copyright (C) 2005 Stelian Pop (stelian@popies.net) + * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) + * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) + * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) + * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define USB_VENDOR_ID_APPLE 0x05ac + +/* MacbookAir, aka wellspring */ +#define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 +#define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 +#define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 +/* MacbookProPenryn, aka wellspring2 */ +#define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 +#define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 +#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 +/* Macbook5,1 (unibody), aka wellspring3 */ +#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236 +#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237 +#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238 +/* MacbookAir3,2 (unibody), aka wellspring5 */ +#define USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI 0x023f +#define USB_DEVICE_ID_APPLE_WELLSPRING4_ISO 0x0240 +#define USB_DEVICE_ID_APPLE_WELLSPRING4_JIS 0x0241 +/* MacbookAir3,1 (unibody), aka wellspring4 */ +#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI 0x0242 +#define USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO 0x0243 +#define USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS 0x0244 +/* Macbook8 (unibody, March 2011) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI 0x0245 +#define USB_DEVICE_ID_APPLE_WELLSPRING5_ISO 0x0246 +#define USB_DEVICE_ID_APPLE_WELLSPRING5_JIS 0x0247 +/* MacbookAir4,1 (unibody, July 2011) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI 0x0249 +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO 0x024a +#define USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS 0x024b +/* MacbookAir4,2 (unibody, July 2011) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI 0x024c +#define USB_DEVICE_ID_APPLE_WELLSPRING6_ISO 0x024d +#define USB_DEVICE_ID_APPLE_WELLSPRING6_JIS 0x024e +/* Macbook8,2 (unibody) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI 0x0252 +#define USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO 0x0253 +#define USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS 0x0254 +/* MacbookPro10,1 (unibody, June 2012) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI 0x0262 +#define USB_DEVICE_ID_APPLE_WELLSPRING7_ISO 0x0263 +#define USB_DEVICE_ID_APPLE_WELLSPRING7_JIS 0x0264 +/* MacbookPro10,2 (unibody, October 2012) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI 0x0259 +#define USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO 0x025a +#define USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS 0x025b +/* MacbookAir6,2 (unibody, June 2013) */ +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI 0x0290 +#define USB_DEVICE_ID_APPLE_WELLSPRING8_ISO 0x0291 +#define USB_DEVICE_ID_APPLE_WELLSPRING8_JIS 0x0292 + +#define BCM5974_DEVICE(prod) { \ + .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ + USB_DEVICE_ID_MATCH_INT_CLASS | \ + USB_DEVICE_ID_MATCH_INT_PROTOCOL), \ + .idVendor = USB_VENDOR_ID_APPLE, \ + .idProduct = (prod), \ + .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ + .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE \ +} + +/* table of devices that work with this driver */ +static const struct usb_device_id bcm5974_table[] = { + /* MacbookAir1.1 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_JIS), + /* MacbookProPenryn */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), + /* Macbook5,1 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING3_JIS), + /* MacbookAir3,2 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4_JIS), + /* MacbookAir3,1 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS), + /* MacbookPro8 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5_JIS), + /* MacbookAir4,1 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS), + /* MacbookAir4,2 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING6_JIS), + /* MacbookPro8,2 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS), + /* MacbookPro10,1 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7_JIS), + /* MacbookPro10,2 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS), + /* MacbookAir6,2 */ + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_ISO), + BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING8_JIS), + /* Terminating entry */ + {} +}; +MODULE_DEVICE_TABLE(usb, bcm5974_table); + +MODULE_AUTHOR("Henrik Rydberg"); +MODULE_DESCRIPTION("Apple USB BCM5974 multitouch driver"); +MODULE_LICENSE("GPL"); + +#define dprintk(level, format, a...)\ + { if (debug >= level) printk(KERN_DEBUG format, ##a); } + +static int debug = 1; +module_param(debug, int, 0644); +MODULE_PARM_DESC(debug, "Activate debugging output"); + +/* button data structure */ +struct bt_data { + u8 unknown1; /* constant */ + u8 button; /* left button */ + u8 rel_x; /* relative x coordinate */ + u8 rel_y; /* relative y coordinate */ +}; + +/* trackpad header types */ +enum tp_type { + TYPE1, /* plain trackpad */ + TYPE2, /* button integrated in trackpad */ + TYPE3 /* additional header fields since June 2013 */ +}; + +/* trackpad finger data offsets, le16-aligned */ +#define FINGER_TYPE1 (13 * sizeof(__le16)) +#define FINGER_TYPE2 (15 * sizeof(__le16)) +#define FINGER_TYPE3 (19 * sizeof(__le16)) + +/* trackpad button data offsets */ +#define BUTTON_TYPE2 15 +#define BUTTON_TYPE3 23 + +/* list of device capability bits */ +#define HAS_INTEGRATED_BUTTON 1 + +/* trackpad finger structure, le16-aligned */ +struct tp_finger { + __le16 origin; /* zero when switching track finger */ + __le16 abs_x; /* absolute x coodinate */ + __le16 abs_y; /* absolute y coodinate */ + __le16 rel_x; /* relative x coodinate */ + __le16 rel_y; /* relative y coodinate */ + __le16 tool_major; /* tool area, major axis */ + __le16 tool_minor; /* tool area, minor axis */ + __le16 orientation; /* 16384 when point, else 15 bit angle */ + __le16 touch_major; /* touch area, major axis */ + __le16 touch_minor; /* touch area, minor axis */ + __le16 unused[3]; /* zeros */ + __le16 multi; /* one finger: varies, more fingers: constant */ +} __attribute__((packed,aligned(2))); + +/* trackpad finger data size, empirically at least ten fingers */ +#define MAX_FINGERS 16 +#define SIZEOF_FINGER sizeof(struct tp_finger) +#define SIZEOF_ALL_FINGERS (MAX_FINGERS * SIZEOF_FINGER) +#define MAX_FINGER_ORIENTATION 16384 + +/* device-specific parameters */ +struct bcm5974_param { + int snratio; /* signal-to-noise ratio */ + int min; /* device minimum reading */ + int max; /* device maximum reading */ +}; + +/* device-specific configuration */ +struct bcm5974_config { + int ansi, iso, jis; /* the product id of this device */ + int caps; /* device capability bitmask */ + int bt_ep; /* the endpoint of the button interface */ + int bt_datalen; /* data length of the button interface */ + int tp_ep; /* the endpoint of the trackpad interface */ + enum tp_type tp_type; /* type of trackpad interface */ + int tp_offset; /* offset to trackpad finger data */ + int tp_datalen; /* data length of the trackpad interface */ + struct bcm5974_param p; /* finger pressure limits */ + struct bcm5974_param w; /* finger width limits */ + struct bcm5974_param x; /* horizontal limits */ + struct bcm5974_param y; /* vertical limits */ + struct bcm5974_param o; /* orientation limits */ +}; + +/* logical device structure */ +struct bcm5974 { + char phys[64]; + struct usb_device *udev; /* usb device */ + struct usb_interface *intf; /* our interface */ + struct input_dev *input; /* input dev */ + struct bcm5974_config cfg; /* device configuration */ + struct mutex pm_mutex; /* serialize access to open/suspend */ + int opened; /* 1: opened, 0: closed */ + struct urb *bt_urb; /* button usb request block */ + struct bt_data *bt_data; /* button transferred data */ + struct urb *tp_urb; /* trackpad usb request block */ + u8 *tp_data; /* trackpad transferred data */ + const struct tp_finger *index[MAX_FINGERS]; /* finger index data */ + struct input_mt_pos pos[MAX_FINGERS]; /* position array */ + int slots[MAX_FINGERS]; /* slot assignments */ +}; + +/* logical signal quality */ +#define SN_PRESSURE 45 /* pressure signal-to-noise ratio */ +#define SN_WIDTH 25 /* width signal-to-noise ratio */ +#define SN_COORD 250 /* coordinate signal-to-noise ratio */ +#define SN_ORIENT 10 /* orientation signal-to-noise ratio */ + +/* device constants */ +static const struct bcm5974_config bcm5974_config_table[] = { + { + USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING_JIS, + 0, + 0x84, sizeof(struct bt_data), + 0x81, TYPE1, FINGER_TYPE1, FINGER_TYPE1 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 256 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4824, 5342 }, + { SN_COORD, -172, 5820 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, + 0, + 0x84, sizeof(struct bt_data), + 0x81, TYPE1, FINGER_TYPE1, FINGER_TYPE1 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 256 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4824, 4824 }, + { SN_COORD, -172, 4290 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING3_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING3_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4460, 5166 }, + { SN_COORD, -75, 6700 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING4_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING4_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4620, 5140 }, + { SN_COORD, -150, 6600 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING4A_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING4A_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4616, 5112 }, + { SN_COORD, -142, 5234 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING5_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING5_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING5_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4415, 5050 }, + { SN_COORD, -55, 6680 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING6_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING6_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING6_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4620, 5140 }, + { SN_COORD, -150, 6600 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING5A_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING5A_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4750, 5280 }, + { SN_COORD, -150, 6730 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING6A_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING6A_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING6A_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4620, 5140 }, + { SN_COORD, -150, 6600 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING7_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING7_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING7_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4750, 5280 }, + { SN_COORD, -150, 6730 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING7A_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING7A_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING7A_JIS, + HAS_INTEGRATED_BUTTON, + 0x84, sizeof(struct bt_data), + 0x81, TYPE2, FINGER_TYPE2, FINGER_TYPE2 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4750, 5280 }, + { SN_COORD, -150, 6730 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + { + USB_DEVICE_ID_APPLE_WELLSPRING8_ANSI, + USB_DEVICE_ID_APPLE_WELLSPRING8_ISO, + USB_DEVICE_ID_APPLE_WELLSPRING8_JIS, + HAS_INTEGRATED_BUTTON, + 0, sizeof(struct bt_data), + 0x83, TYPE3, FINGER_TYPE3, FINGER_TYPE3 + SIZEOF_ALL_FINGERS, + { SN_PRESSURE, 0, 300 }, + { SN_WIDTH, 0, 2048 }, + { SN_COORD, -4620, 5140 }, + { SN_COORD, -150, 6600 }, + { SN_ORIENT, -MAX_FINGER_ORIENTATION, MAX_FINGER_ORIENTATION } + }, + {} +}; + +/* return the device-specific configuration by device */ +static const struct bcm5974_config *bcm5974_get_config(struct usb_device *udev) +{ + u16 id = le16_to_cpu(udev->descriptor.idProduct); + const struct bcm5974_config *cfg; + + for (cfg = bcm5974_config_table; cfg->ansi; ++cfg) + if (cfg->ansi == id || cfg->iso == id || cfg->jis == id) + return cfg; + + return bcm5974_config_table; +} + +/* convert 16-bit little endian to signed integer */ +static inline int raw2int(__le16 x) +{ + return (signed short)le16_to_cpu(x); +} + +static void set_abs(struct input_dev *input, unsigned int code, + const struct bcm5974_param *p) +{ + int fuzz = p->snratio ? (p->max - p->min) / p->snratio : 0; + input_set_abs_params(input, code, p->min, p->max, fuzz, 0); +} + +/* setup which logical events to report */ +static void setup_events_to_report(struct input_dev *input_dev, + const struct bcm5974_config *cfg) +{ + __set_bit(EV_ABS, input_dev->evbit); + + /* for synaptics only */ + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 256, 5, 0); + input_set_abs_params(input_dev, ABS_TOOL_WIDTH, 0, 16, 0, 0); + + /* finger touch area */ + set_abs(input_dev, ABS_MT_TOUCH_MAJOR, &cfg->w); + set_abs(input_dev, ABS_MT_TOUCH_MINOR, &cfg->w); + /* finger approach area */ + set_abs(input_dev, ABS_MT_WIDTH_MAJOR, &cfg->w); + set_abs(input_dev, ABS_MT_WIDTH_MINOR, &cfg->w); + /* finger orientation */ + set_abs(input_dev, ABS_MT_ORIENTATION, &cfg->o); + /* finger position */ + set_abs(input_dev, ABS_MT_POSITION_X, &cfg->x); + set_abs(input_dev, ABS_MT_POSITION_Y, &cfg->y); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_LEFT, input_dev->keybit); + + if (cfg->caps & HAS_INTEGRATED_BUTTON) + __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); + + input_mt_init_slots(input_dev, MAX_FINGERS, + INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED | INPUT_MT_TRACK); +} + +/* report button data as logical button state */ +static int report_bt_state(struct bcm5974 *dev, int size) +{ + if (size != sizeof(struct bt_data)) + return -EIO; + + dprintk(7, + "bcm5974: button data: %x %x %x %x\n", + dev->bt_data->unknown1, dev->bt_data->button, + dev->bt_data->rel_x, dev->bt_data->rel_y); + + input_report_key(dev->input, BTN_LEFT, dev->bt_data->button); + input_sync(dev->input); + + return 0; +} + +static void report_finger_data(struct input_dev *input, int slot, + const struct input_mt_pos *pos, + const struct tp_finger *f) +{ + input_mt_slot(input, slot); + input_mt_report_slot_state(input, MT_TOOL_FINGER, true); + + input_report_abs(input, ABS_MT_TOUCH_MAJOR, + raw2int(f->touch_major) << 1); + input_report_abs(input, ABS_MT_TOUCH_MINOR, + raw2int(f->touch_minor) << 1); + input_report_abs(input, ABS_MT_WIDTH_MAJOR, + raw2int(f->tool_major) << 1); + input_report_abs(input, ABS_MT_WIDTH_MINOR, + raw2int(f->tool_minor) << 1); + input_report_abs(input, ABS_MT_ORIENTATION, + MAX_FINGER_ORIENTATION - raw2int(f->orientation)); + input_report_abs(input, ABS_MT_POSITION_X, pos->x); + input_report_abs(input, ABS_MT_POSITION_Y, pos->y); +} + +static void report_synaptics_data(struct input_dev *input, + const struct bcm5974_config *cfg, + const struct tp_finger *f, int raw_n) +{ + int abs_p = 0, abs_w = 0; + + if (raw_n) { + int p = raw2int(f->touch_major); + int w = raw2int(f->tool_major); + if (p > 0 && raw2int(f->origin)) { + abs_p = clamp_val(256 * p / cfg->p.max, 0, 255); + abs_w = clamp_val(16 * w / cfg->w.max, 0, 15); + } + } + + input_report_abs(input, ABS_PRESSURE, abs_p); + input_report_abs(input, ABS_TOOL_WIDTH, abs_w); +} + +/* report trackpad data as logical trackpad state */ +static int report_tp_state(struct bcm5974 *dev, int size) +{ + const struct bcm5974_config *c = &dev->cfg; + const struct tp_finger *f; + struct input_dev *input = dev->input; + int raw_n, i, n = 0; + + if (size < c->tp_offset || (size - c->tp_offset) % SIZEOF_FINGER != 0) + return -EIO; + + /* finger data, le16-aligned */ + f = (const struct tp_finger *)(dev->tp_data + c->tp_offset); + raw_n = (size - c->tp_offset) / SIZEOF_FINGER; + + for (i = 0; i < raw_n; i++) { + if (raw2int(f[i].touch_major) == 0) + continue; + dev->pos[n].x = raw2int(f[i].abs_x); + dev->pos[n].y = c->y.min + c->y.max - raw2int(f[i].abs_y); + dev->index[n++] = &f[i]; + } + + input_mt_assign_slots(input, dev->slots, dev->pos, n); + + for (i = 0; i < n; i++) + report_finger_data(input, dev->slots[i], + &dev->pos[i], dev->index[i]); + + input_mt_sync_frame(input); + + report_synaptics_data(input, c, f, raw_n); + + /* type 2 reports button events via ibt only */ + if (c->tp_type == TYPE2) { + int ibt = raw2int(dev->tp_data[BUTTON_TYPE2]); + input_report_key(input, BTN_LEFT, ibt); + } + + if (c->tp_type == TYPE3) + input_report_key(input, BTN_LEFT, dev->tp_data[BUTTON_TYPE3]); + + input_sync(input); + + return 0; +} + +/* Wellspring initialization constants */ +#define BCM5974_WELLSPRING_MODE_READ_REQUEST_ID 1 +#define BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID 9 +#define BCM5974_WELLSPRING_MODE_REQUEST_VALUE 0x300 +#define BCM5974_WELLSPRING_MODE_REQUEST_INDEX 0 +#define BCM5974_WELLSPRING_MODE_VENDOR_VALUE 0x01 +#define BCM5974_WELLSPRING_MODE_NORMAL_VALUE 0x08 + +static int bcm5974_wellspring_mode(struct bcm5974 *dev, bool on) +{ + int retval = 0, size; + char *data; + + /* Type 3 does not require a mode switch */ + if (dev->cfg.tp_type == TYPE3) + return 0; + + data = kmalloc(8, GFP_KERNEL); + if (!data) { + dev_err(&dev->intf->dev, "out of memory\n"); + retval = -ENOMEM; + goto out; + } + + /* read configuration */ + size = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), + BCM5974_WELLSPRING_MODE_READ_REQUEST_ID, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + BCM5974_WELLSPRING_MODE_REQUEST_VALUE, + BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000); + + if (size != 8) { + dev_err(&dev->intf->dev, "could not read from device\n"); + retval = -EIO; + goto out; + } + + /* apply the mode switch */ + data[0] = on ? + BCM5974_WELLSPRING_MODE_VENDOR_VALUE : + BCM5974_WELLSPRING_MODE_NORMAL_VALUE; + + /* write configuration */ + size = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), + BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + BCM5974_WELLSPRING_MODE_REQUEST_VALUE, + BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000); + + if (size != 8) { + dev_err(&dev->intf->dev, "could not write to device\n"); + retval = -EIO; + goto out; + } + + dprintk(2, "bcm5974: switched to %s mode.\n", + on ? "wellspring" : "normal"); + + out: + kfree(data); + return retval; +} + +static void bcm5974_irq_button(struct urb *urb) +{ + struct bcm5974 *dev = urb->context; + struct usb_interface *intf = dev->intf; + int error; + + switch (urb->status) { + case 0: + break; + case -EOVERFLOW: + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + dev_dbg(&intf->dev, "button urb shutting down: %d\n", + urb->status); + return; + default: + dev_dbg(&intf->dev, "button urb status: %d\n", urb->status); + goto exit; + } + + if (report_bt_state(dev, dev->bt_urb->actual_length)) + dprintk(1, "bcm5974: bad button package, length: %d\n", + dev->bt_urb->actual_length); + +exit: + error = usb_submit_urb(dev->bt_urb, GFP_ATOMIC); + if (error) + dev_err(&intf->dev, "button urb failed: %d\n", error); +} + +static void bcm5974_irq_trackpad(struct urb *urb) +{ + struct bcm5974 *dev = urb->context; + struct usb_interface *intf = dev->intf; + int error; + + switch (urb->status) { + case 0: + break; + case -EOVERFLOW: + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + dev_dbg(&intf->dev, "trackpad urb shutting down: %d\n", + urb->status); + return; + default: + dev_dbg(&intf->dev, "trackpad urb status: %d\n", urb->status); + goto exit; + } + + /* control response ignored */ + if (dev->tp_urb->actual_length == 2) + goto exit; + + if (report_tp_state(dev, dev->tp_urb->actual_length)) + dprintk(1, "bcm5974: bad trackpad package, length: %d\n", + dev->tp_urb->actual_length); + +exit: + error = usb_submit_urb(dev->tp_urb, GFP_ATOMIC); + if (error) + dev_err(&intf->dev, "trackpad urb failed: %d\n", error); +} + +/* + * The Wellspring trackpad, like many recent Apple trackpads, share + * the usb device with the keyboard. Since keyboards are usually + * handled by the HID system, the device ends up being handled by two + * modules. Setting up the device therefore becomes slightly + * complicated. To enable multitouch features, a mode switch is + * required, which is usually applied via the control interface of the + * device. It can be argued where this switch should take place. In + * some drivers, like appletouch, the switch is made during + * probe. However, the hid module may also alter the state of the + * device, resulting in trackpad malfunction under certain + * circumstances. To get around this problem, there is at least one + * example that utilizes the USB_QUIRK_RESET_RESUME quirk in order to + * receive a reset_resume request rather than the normal resume. + * Since the implementation of reset_resume is equal to mode switch + * plus start_traffic, it seems easier to always do the switch when + * starting traffic on the device. + */ +static int bcm5974_start_traffic(struct bcm5974 *dev) +{ + int error; + + error = bcm5974_wellspring_mode(dev, true); + if (error) { + dprintk(1, "bcm5974: mode switch failed\n"); + goto err_out; + } + + if (dev->bt_urb) { + error = usb_submit_urb(dev->bt_urb, GFP_KERNEL); + if (error) + goto err_reset_mode; + } + + error = usb_submit_urb(dev->tp_urb, GFP_KERNEL); + if (error) + goto err_kill_bt; + + return 0; + +err_kill_bt: + usb_kill_urb(dev->bt_urb); +err_reset_mode: + bcm5974_wellspring_mode(dev, false); +err_out: + return error; +} + +static void bcm5974_pause_traffic(struct bcm5974 *dev) +{ + usb_kill_urb(dev->tp_urb); + usb_kill_urb(dev->bt_urb); + bcm5974_wellspring_mode(dev, false); +} + +/* + * The code below implements open/close and manual suspend/resume. + * All functions may be called in random order. + * + * Opening a suspended device fails with EACCES - permission denied. + * + * Failing a resume leaves the device resumed but closed. + */ +static int bcm5974_open(struct input_dev *input) +{ + struct bcm5974 *dev = input_get_drvdata(input); + int error; + + error = usb_autopm_get_interface(dev->intf); + if (error) + return error; + + mutex_lock(&dev->pm_mutex); + + error = bcm5974_start_traffic(dev); + if (!error) + dev->opened = 1; + + mutex_unlock(&dev->pm_mutex); + + if (error) + usb_autopm_put_interface(dev->intf); + + return error; +} + +static void bcm5974_close(struct input_dev *input) +{ + struct bcm5974 *dev = input_get_drvdata(input); + + mutex_lock(&dev->pm_mutex); + + bcm5974_pause_traffic(dev); + dev->opened = 0; + + mutex_unlock(&dev->pm_mutex); + + usb_autopm_put_interface(dev->intf); +} + +static int bcm5974_suspend(struct usb_interface *iface, pm_message_t message) +{ + struct bcm5974 *dev = usb_get_intfdata(iface); + + mutex_lock(&dev->pm_mutex); + + if (dev->opened) + bcm5974_pause_traffic(dev); + + mutex_unlock(&dev->pm_mutex); + + return 0; +} + +static int bcm5974_resume(struct usb_interface *iface) +{ + struct bcm5974 *dev = usb_get_intfdata(iface); + int error = 0; + + mutex_lock(&dev->pm_mutex); + + if (dev->opened) + error = bcm5974_start_traffic(dev); + + mutex_unlock(&dev->pm_mutex); + + return error; +} + +static int bcm5974_probe(struct usb_interface *iface, + const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(iface); + const struct bcm5974_config *cfg; + struct bcm5974 *dev; + struct input_dev *input_dev; + int error = -ENOMEM; + + /* find the product index */ + cfg = bcm5974_get_config(udev); + + /* allocate memory for our device state and initialize it */ + dev = kzalloc(sizeof(struct bcm5974), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!dev || !input_dev) { + dev_err(&iface->dev, "out of memory\n"); + goto err_free_devs; + } + + dev->udev = udev; + dev->intf = iface; + dev->input = input_dev; + dev->cfg = *cfg; + mutex_init(&dev->pm_mutex); + + /* setup urbs */ + if (cfg->tp_type == TYPE1) { + dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!dev->bt_urb) + goto err_free_devs; + } + + dev->tp_urb = usb_alloc_urb(0, GFP_KERNEL); + if (!dev->tp_urb) + goto err_free_bt_urb; + + if (dev->bt_urb) { + dev->bt_data = usb_alloc_coherent(dev->udev, + dev->cfg.bt_datalen, GFP_KERNEL, + &dev->bt_urb->transfer_dma); + if (!dev->bt_data) + goto err_free_urb; + } + + dev->tp_data = usb_alloc_coherent(dev->udev, + dev->cfg.tp_datalen, GFP_KERNEL, + &dev->tp_urb->transfer_dma); + if (!dev->tp_data) + goto err_free_bt_buffer; + + if (dev->bt_urb) + usb_fill_int_urb(dev->bt_urb, udev, + usb_rcvintpipe(udev, cfg->bt_ep), + dev->bt_data, dev->cfg.bt_datalen, + bcm5974_irq_button, dev, 1); + + usb_fill_int_urb(dev->tp_urb, udev, + usb_rcvintpipe(udev, cfg->tp_ep), + dev->tp_data, dev->cfg.tp_datalen, + bcm5974_irq_trackpad, dev, 1); + + /* create bcm5974 device */ + usb_make_path(udev, dev->phys, sizeof(dev->phys)); + strlcat(dev->phys, "/input0", sizeof(dev->phys)); + + input_dev->name = "bcm5974"; + input_dev->phys = dev->phys; + usb_to_input_id(dev->udev, &input_dev->id); + /* report driver capabilities via the version field */ + input_dev->id.version = cfg->caps; + input_dev->dev.parent = &iface->dev; + + input_set_drvdata(input_dev, dev); + + input_dev->open = bcm5974_open; + input_dev->close = bcm5974_close; + + setup_events_to_report(input_dev, cfg); + + error = input_register_device(dev->input); + if (error) + goto err_free_buffer; + + /* save our data pointer in this interface device */ + usb_set_intfdata(iface, dev); + + return 0; + +err_free_buffer: + usb_free_coherent(dev->udev, dev->cfg.tp_datalen, + dev->tp_data, dev->tp_urb->transfer_dma); +err_free_bt_buffer: + if (dev->bt_urb) + usb_free_coherent(dev->udev, dev->cfg.bt_datalen, + dev->bt_data, dev->bt_urb->transfer_dma); +err_free_urb: + usb_free_urb(dev->tp_urb); +err_free_bt_urb: + usb_free_urb(dev->bt_urb); +err_free_devs: + usb_set_intfdata(iface, NULL); + input_free_device(input_dev); + kfree(dev); + return error; +} + +static void bcm5974_disconnect(struct usb_interface *iface) +{ + struct bcm5974 *dev = usb_get_intfdata(iface); + + usb_set_intfdata(iface, NULL); + + input_unregister_device(dev->input); + usb_free_coherent(dev->udev, dev->cfg.tp_datalen, + dev->tp_data, dev->tp_urb->transfer_dma); + if (dev->bt_urb) + usb_free_coherent(dev->udev, dev->cfg.bt_datalen, + dev->bt_data, dev->bt_urb->transfer_dma); + usb_free_urb(dev->tp_urb); + usb_free_urb(dev->bt_urb); + kfree(dev); +} + +static struct usb_driver bcm5974_driver = { + .name = "bcm5974", + .probe = bcm5974_probe, + .disconnect = bcm5974_disconnect, + .suspend = bcm5974_suspend, + .resume = bcm5974_resume, + .id_table = bcm5974_table, + .supports_autosuspend = 1, +}; + +module_usb_driver(bcm5974_driver); diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c new file mode 100644 index 00000000..b409c3d7 --- /dev/null +++ b/drivers/input/mouse/cyapa.c @@ -0,0 +1,973 @@ +/* + * Cypress APA trackpad with I2C interface + * + * Author: Dudley Du + * Further cleanup and restructuring by: + * Daniel Kurtz + * Benson Leung + * + * Copyright (C) 2011-2012 Cypress Semiconductor, Inc. + * Copyright (C) 2011-2012 Google, Inc. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* APA trackpad firmware generation */ +#define CYAPA_GEN3 0x03 /* support MT-protocol B with tracking ID. */ + +#define CYAPA_NAME "Cypress APA Trackpad (cyapa)" + +/* commands for read/write registers of Cypress trackpad */ +#define CYAPA_CMD_SOFT_RESET 0x00 +#define CYAPA_CMD_POWER_MODE 0x01 +#define CYAPA_CMD_DEV_STATUS 0x02 +#define CYAPA_CMD_GROUP_DATA 0x03 +#define CYAPA_CMD_GROUP_CMD 0x04 +#define CYAPA_CMD_GROUP_QUERY 0x05 +#define CYAPA_CMD_BL_STATUS 0x06 +#define CYAPA_CMD_BL_HEAD 0x07 +#define CYAPA_CMD_BL_CMD 0x08 +#define CYAPA_CMD_BL_DATA 0x09 +#define CYAPA_CMD_BL_ALL 0x0a +#define CYAPA_CMD_BLK_PRODUCT_ID 0x0b +#define CYAPA_CMD_BLK_HEAD 0x0c + +/* report data start reg offset address. */ +#define DATA_REG_START_OFFSET 0x0000 + +#define BL_HEAD_OFFSET 0x00 +#define BL_DATA_OFFSET 0x10 + +/* + * Operational Device Status Register + * + * bit 7: Valid interrupt source + * bit 6 - 4: Reserved + * bit 3 - 2: Power status + * bit 1 - 0: Device status + */ +#define REG_OP_STATUS 0x00 +#define OP_STATUS_SRC 0x80 +#define OP_STATUS_POWER 0x0c +#define OP_STATUS_DEV 0x03 +#define OP_STATUS_MASK (OP_STATUS_SRC | OP_STATUS_POWER | OP_STATUS_DEV) + +/* + * Operational Finger Count/Button Flags Register + * + * bit 7 - 4: Number of touched finger + * bit 3: Valid data + * bit 2: Middle Physical Button + * bit 1: Right Physical Button + * bit 0: Left physical Button + */ +#define REG_OP_DATA1 0x01 +#define OP_DATA_VALID 0x08 +#define OP_DATA_MIDDLE_BTN 0x04 +#define OP_DATA_RIGHT_BTN 0x02 +#define OP_DATA_LEFT_BTN 0x01 +#define OP_DATA_BTN_MASK (OP_DATA_MIDDLE_BTN | OP_DATA_RIGHT_BTN | \ + OP_DATA_LEFT_BTN) + +/* + * Bootloader Status Register + * + * bit 7: Busy + * bit 6 - 5: Reserved + * bit 4: Bootloader running + * bit 3 - 1: Reserved + * bit 0: Checksum valid + */ +#define REG_BL_STATUS 0x01 +#define BL_STATUS_BUSY 0x80 +#define BL_STATUS_RUNNING 0x10 +#define BL_STATUS_DATA_VALID 0x08 +#define BL_STATUS_CSUM_VALID 0x01 + +/* + * Bootloader Error Register + * + * bit 7: Invalid + * bit 6: Invalid security key + * bit 5: Bootloading + * bit 4: Command checksum + * bit 3: Flash protection error + * bit 2: Flash checksum error + * bit 1 - 0: Reserved + */ +#define REG_BL_ERROR 0x02 +#define BL_ERROR_INVALID 0x80 +#define BL_ERROR_INVALID_KEY 0x40 +#define BL_ERROR_BOOTLOADING 0x20 +#define BL_ERROR_CMD_CSUM 0x10 +#define BL_ERROR_FLASH_PROT 0x08 +#define BL_ERROR_FLASH_CSUM 0x04 + +#define BL_STATUS_SIZE 3 /* length of bootloader status registers */ +#define BLK_HEAD_BYTES 32 + +#define PRODUCT_ID_SIZE 16 +#define QUERY_DATA_SIZE 27 +#define REG_PROTOCOL_GEN_QUERY_OFFSET 20 + +#define REG_OFFSET_DATA_BASE 0x0000 +#define REG_OFFSET_COMMAND_BASE 0x0028 +#define REG_OFFSET_QUERY_BASE 0x002a + +#define CAPABILITY_LEFT_BTN_MASK (0x01 << 3) +#define CAPABILITY_RIGHT_BTN_MASK (0x01 << 4) +#define CAPABILITY_MIDDLE_BTN_MASK (0x01 << 5) +#define CAPABILITY_BTN_MASK (CAPABILITY_LEFT_BTN_MASK | \ + CAPABILITY_RIGHT_BTN_MASK | \ + CAPABILITY_MIDDLE_BTN_MASK) + +#define CYAPA_OFFSET_SOFT_RESET REG_OFFSET_COMMAND_BASE + +#define REG_OFFSET_POWER_MODE (REG_OFFSET_COMMAND_BASE + 1) + +#define PWR_MODE_MASK 0xfc +#define PWR_MODE_FULL_ACTIVE (0x3f << 2) +#define PWR_MODE_IDLE (0x05 << 2) /* default sleep time is 50 ms. */ +#define PWR_MODE_OFF (0x00 << 2) + +#define PWR_STATUS_MASK 0x0c +#define PWR_STATUS_ACTIVE (0x03 << 2) +#define PWR_STATUS_IDLE (0x02 << 2) +#define PWR_STATUS_OFF (0x00 << 2) + +/* + * CYAPA trackpad device states. + * Used in register 0x00, bit1-0, DeviceStatus field. + * Other values indicate device is in an abnormal state and must be reset. + */ +#define CYAPA_DEV_NORMAL 0x03 +#define CYAPA_DEV_BUSY 0x01 + +enum cyapa_state { + CYAPA_STATE_OP, + CYAPA_STATE_BL_IDLE, + CYAPA_STATE_BL_ACTIVE, + CYAPA_STATE_BL_BUSY, + CYAPA_STATE_NO_DEVICE, +}; + + +struct cyapa_touch { + /* + * high bits or x/y position value + * bit 7 - 4: high 4 bits of x position value + * bit 3 - 0: high 4 bits of y position value + */ + u8 xy_hi; + u8 x_lo; /* low 8 bits of x position value. */ + u8 y_lo; /* low 8 bits of y position value. */ + u8 pressure; + /* id range is 1 - 15. It is incremented with every new touch. */ + u8 id; +} __packed; + +/* The touch.id is used as the MT slot id, thus max MT slot is 15 */ +#define CYAPA_MAX_MT_SLOTS 15 + +struct cyapa_reg_data { + /* + * bit 0 - 1: device status + * bit 3 - 2: power mode + * bit 6 - 4: reserved + * bit 7: interrupt valid bit + */ + u8 device_status; + /* + * bit 7 - 4: number of fingers currently touching pad + * bit 3: valid data check bit + * bit 2: middle mechanism button state if exists + * bit 1: right mechanism button state if exists + * bit 0: left mechanism button state if exists + */ + u8 finger_btn; + /* CYAPA reports up to 5 touches per packet. */ + struct cyapa_touch touches[5]; +} __packed; + +/* The main device structure */ +struct cyapa { + enum cyapa_state state; + + struct i2c_client *client; + struct input_dev *input; + char phys[32]; /* device physical location */ + int irq; + bool irq_wake; /* irq wake is enabled */ + bool smbus; + + /* read from query data region. */ + char product_id[16]; + u8 btn_capability; + u8 gen; + int max_abs_x; + int max_abs_y; + int physical_size_x; + int physical_size_y; +}; + +static const u8 bl_deactivate[] = { 0x00, 0xff, 0x3b, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x06, 0x07 }; +static const u8 bl_exit[] = { 0x00, 0xff, 0xa5, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x06, 0x07 }; + +struct cyapa_cmd_len { + u8 cmd; + u8 len; +}; + +#define CYAPA_ADAPTER_FUNC_NONE 0 +#define CYAPA_ADAPTER_FUNC_I2C 1 +#define CYAPA_ADAPTER_FUNC_SMBUS 2 +#define CYAPA_ADAPTER_FUNC_BOTH 3 + +/* + * macros for SMBus communication + */ +#define SMBUS_READ 0x01 +#define SMBUS_WRITE 0x00 +#define SMBUS_ENCODE_IDX(cmd, idx) ((cmd) | (((idx) & 0x03) << 1)) +#define SMBUS_ENCODE_RW(cmd, rw) ((cmd) | ((rw) & 0x01)) +#define SMBUS_BYTE_BLOCK_CMD_MASK 0x80 +#define SMBUS_GROUP_BLOCK_CMD_MASK 0x40 + + /* for byte read/write command */ +#define CMD_RESET 0 +#define CMD_POWER_MODE 1 +#define CMD_DEV_STATUS 2 +#define SMBUS_BYTE_CMD(cmd) (((cmd) & 0x3f) << 1) +#define CYAPA_SMBUS_RESET SMBUS_BYTE_CMD(CMD_RESET) +#define CYAPA_SMBUS_POWER_MODE SMBUS_BYTE_CMD(CMD_POWER_MODE) +#define CYAPA_SMBUS_DEV_STATUS SMBUS_BYTE_CMD(CMD_DEV_STATUS) + + /* for group registers read/write command */ +#define REG_GROUP_DATA 0 +#define REG_GROUP_CMD 2 +#define REG_GROUP_QUERY 3 +#define SMBUS_GROUP_CMD(grp) (0x80 | (((grp) & 0x07) << 3)) +#define CYAPA_SMBUS_GROUP_DATA SMBUS_GROUP_CMD(REG_GROUP_DATA) +#define CYAPA_SMBUS_GROUP_CMD SMBUS_GROUP_CMD(REG_GROUP_CMD) +#define CYAPA_SMBUS_GROUP_QUERY SMBUS_GROUP_CMD(REG_GROUP_QUERY) + + /* for register block read/write command */ +#define CMD_BL_STATUS 0 +#define CMD_BL_HEAD 1 +#define CMD_BL_CMD 2 +#define CMD_BL_DATA 3 +#define CMD_BL_ALL 4 +#define CMD_BLK_PRODUCT_ID 5 +#define CMD_BLK_HEAD 6 +#define SMBUS_BLOCK_CMD(cmd) (0xc0 | (((cmd) & 0x1f) << 1)) + +/* register block read/write command in bootloader mode */ +#define CYAPA_SMBUS_BL_STATUS SMBUS_BLOCK_CMD(CMD_BL_STATUS) +#define CYAPA_SMBUS_BL_HEAD SMBUS_BLOCK_CMD(CMD_BL_HEAD) +#define CYAPA_SMBUS_BL_CMD SMBUS_BLOCK_CMD(CMD_BL_CMD) +#define CYAPA_SMBUS_BL_DATA SMBUS_BLOCK_CMD(CMD_BL_DATA) +#define CYAPA_SMBUS_BL_ALL SMBUS_BLOCK_CMD(CMD_BL_ALL) + +/* register block read/write command in operational mode */ +#define CYAPA_SMBUS_BLK_PRODUCT_ID SMBUS_BLOCK_CMD(CMD_BLK_PRODUCT_ID) +#define CYAPA_SMBUS_BLK_HEAD SMBUS_BLOCK_CMD(CMD_BLK_HEAD) + +static const struct cyapa_cmd_len cyapa_i2c_cmds[] = { + { CYAPA_OFFSET_SOFT_RESET, 1 }, + { REG_OFFSET_COMMAND_BASE + 1, 1 }, + { REG_OFFSET_DATA_BASE, 1 }, + { REG_OFFSET_DATA_BASE, sizeof(struct cyapa_reg_data) }, + { REG_OFFSET_COMMAND_BASE, 0 }, + { REG_OFFSET_QUERY_BASE, QUERY_DATA_SIZE }, + { BL_HEAD_OFFSET, 3 }, + { BL_HEAD_OFFSET, 16 }, + { BL_HEAD_OFFSET, 16 }, + { BL_DATA_OFFSET, 16 }, + { BL_HEAD_OFFSET, 32 }, + { REG_OFFSET_QUERY_BASE, PRODUCT_ID_SIZE }, + { REG_OFFSET_DATA_BASE, 32 } +}; + +static const struct cyapa_cmd_len cyapa_smbus_cmds[] = { + { CYAPA_SMBUS_RESET, 1 }, + { CYAPA_SMBUS_POWER_MODE, 1 }, + { CYAPA_SMBUS_DEV_STATUS, 1 }, + { CYAPA_SMBUS_GROUP_DATA, sizeof(struct cyapa_reg_data) }, + { CYAPA_SMBUS_GROUP_CMD, 2 }, + { CYAPA_SMBUS_GROUP_QUERY, QUERY_DATA_SIZE }, + { CYAPA_SMBUS_BL_STATUS, 3 }, + { CYAPA_SMBUS_BL_HEAD, 16 }, + { CYAPA_SMBUS_BL_CMD, 16 }, + { CYAPA_SMBUS_BL_DATA, 16 }, + { CYAPA_SMBUS_BL_ALL, 32 }, + { CYAPA_SMBUS_BLK_PRODUCT_ID, PRODUCT_ID_SIZE }, + { CYAPA_SMBUS_BLK_HEAD, 16 }, +}; + +static ssize_t cyapa_i2c_reg_read_block(struct cyapa *cyapa, u8 reg, size_t len, + u8 *values) +{ + return i2c_smbus_read_i2c_block_data(cyapa->client, reg, len, values); +} + +static ssize_t cyapa_i2c_reg_write_block(struct cyapa *cyapa, u8 reg, + size_t len, const u8 *values) +{ + return i2c_smbus_write_i2c_block_data(cyapa->client, reg, len, values); +} + +/* + * cyapa_smbus_read_block - perform smbus block read command + * @cyapa - private data structure of the driver + * @cmd - the properly encoded smbus command + * @len - expected length of smbus command result + * @values - buffer to store smbus command result + * + * Returns negative errno, else the number of bytes written. + * + * Note: + * In trackpad device, the memory block allocated for I2C register map + * is 256 bytes, so the max read block for I2C bus is 256 bytes. + */ +static ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len, + u8 *values) +{ + ssize_t ret; + u8 index; + u8 smbus_cmd; + u8 *buf; + struct i2c_client *client = cyapa->client; + + if (!(SMBUS_BYTE_BLOCK_CMD_MASK & cmd)) + return -EINVAL; + + if (SMBUS_GROUP_BLOCK_CMD_MASK & cmd) { + /* read specific block registers command. */ + smbus_cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ); + ret = i2c_smbus_read_block_data(client, smbus_cmd, values); + goto out; + } + + ret = 0; + for (index = 0; index * I2C_SMBUS_BLOCK_MAX < len; index++) { + smbus_cmd = SMBUS_ENCODE_IDX(cmd, index); + smbus_cmd = SMBUS_ENCODE_RW(smbus_cmd, SMBUS_READ); + buf = values + I2C_SMBUS_BLOCK_MAX * index; + ret = i2c_smbus_read_block_data(client, smbus_cmd, buf); + if (ret < 0) + goto out; + } + +out: + return ret > 0 ? len : ret; +} + +static s32 cyapa_read_byte(struct cyapa *cyapa, u8 cmd_idx) +{ + u8 cmd; + + if (cyapa->smbus) { + cmd = cyapa_smbus_cmds[cmd_idx].cmd; + cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ); + } else { + cmd = cyapa_i2c_cmds[cmd_idx].cmd; + } + return i2c_smbus_read_byte_data(cyapa->client, cmd); +} + +static s32 cyapa_write_byte(struct cyapa *cyapa, u8 cmd_idx, u8 value) +{ + u8 cmd; + + if (cyapa->smbus) { + cmd = cyapa_smbus_cmds[cmd_idx].cmd; + cmd = SMBUS_ENCODE_RW(cmd, SMBUS_WRITE); + } else { + cmd = cyapa_i2c_cmds[cmd_idx].cmd; + } + return i2c_smbus_write_byte_data(cyapa->client, cmd, value); +} + +static ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values) +{ + u8 cmd; + size_t len; + + if (cyapa->smbus) { + cmd = cyapa_smbus_cmds[cmd_idx].cmd; + len = cyapa_smbus_cmds[cmd_idx].len; + return cyapa_smbus_read_block(cyapa, cmd, len, values); + } else { + cmd = cyapa_i2c_cmds[cmd_idx].cmd; + len = cyapa_i2c_cmds[cmd_idx].len; + return cyapa_i2c_reg_read_block(cyapa, cmd, len, values); + } +} + +/* + * Query device for its current operating state. + * + */ +static int cyapa_get_state(struct cyapa *cyapa) +{ + int ret; + u8 status[BL_STATUS_SIZE]; + + cyapa->state = CYAPA_STATE_NO_DEVICE; + + /* + * Get trackpad status by reading 3 registers starting from 0. + * If the device is in the bootloader, this will be BL_HEAD. + * If the device is in operation mode, this will be the DATA regs. + * + */ + ret = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET, BL_STATUS_SIZE, + status); + + /* + * On smbus systems in OP mode, the i2c_reg_read will fail with + * -ETIMEDOUT. In this case, try again using the smbus equivalent + * command. This should return a BL_HEAD indicating CYAPA_STATE_OP. + */ + if (cyapa->smbus && (ret == -ETIMEDOUT || ret == -ENXIO)) + ret = cyapa_read_block(cyapa, CYAPA_CMD_BL_STATUS, status); + + if (ret != BL_STATUS_SIZE) + goto error; + + if ((status[REG_OP_STATUS] & OP_STATUS_SRC) == OP_STATUS_SRC) { + switch (status[REG_OP_STATUS] & OP_STATUS_DEV) { + case CYAPA_DEV_NORMAL: + case CYAPA_DEV_BUSY: + cyapa->state = CYAPA_STATE_OP; + break; + default: + ret = -EAGAIN; + goto error; + } + } else { + if (status[REG_BL_STATUS] & BL_STATUS_BUSY) + cyapa->state = CYAPA_STATE_BL_BUSY; + else if (status[REG_BL_ERROR] & BL_ERROR_BOOTLOADING) + cyapa->state = CYAPA_STATE_BL_ACTIVE; + else + cyapa->state = CYAPA_STATE_BL_IDLE; + } + + return 0; +error: + return (ret < 0) ? ret : -EAGAIN; +} + +/* + * Poll device for its status in a loop, waiting up to timeout for a response. + * + * When the device switches state, it usually takes ~300 ms. + * However, when running a new firmware image, the device must calibrate its + * sensors, which can take as long as 2 seconds. + * + * Note: The timeout has granularity of the polling rate, which is 100 ms. + * + * Returns: + * 0 when the device eventually responds with a valid non-busy state. + * -ETIMEDOUT if device never responds (too many -EAGAIN) + * < 0 other errors + */ +static int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout) +{ + int ret; + int tries = timeout / 100; + + ret = cyapa_get_state(cyapa); + while ((ret || cyapa->state >= CYAPA_STATE_BL_BUSY) && tries--) { + msleep(100); + ret = cyapa_get_state(cyapa); + } + return (ret == -EAGAIN || ret == -ETIMEDOUT) ? -ETIMEDOUT : ret; +} + +static int cyapa_bl_deactivate(struct cyapa *cyapa) +{ + int ret; + + ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_deactivate), + bl_deactivate); + if (ret < 0) + return ret; + + /* wait for bootloader to switch to idle state; should take < 100ms */ + msleep(100); + ret = cyapa_poll_state(cyapa, 500); + if (ret < 0) + return ret; + if (cyapa->state != CYAPA_STATE_BL_IDLE) + return -EAGAIN; + return 0; +} + +/* + * Exit bootloader + * + * Send bl_exit command, then wait 50 - 100 ms to let device transition to + * operational mode. If this is the first time the device's firmware is + * running, it can take up to 2 seconds to calibrate its sensors. So, poll + * the device's new state for up to 2 seconds. + * + * Returns: + * -EIO failure while reading from device + * -EAGAIN device is stuck in bootloader, b/c it has invalid firmware + * 0 device is supported and in operational mode + */ +static int cyapa_bl_exit(struct cyapa *cyapa) +{ + int ret; + + ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_exit), bl_exit); + if (ret < 0) + return ret; + + /* + * Wait for bootloader to exit, and operation mode to start. + * Normally, this takes at least 50 ms. + */ + usleep_range(50000, 100000); + /* + * In addition, when a device boots for the first time after being + * updated to new firmware, it must first calibrate its sensors, which + * can take up to an additional 2 seconds. + */ + ret = cyapa_poll_state(cyapa, 2000); + if (ret < 0) + return ret; + if (cyapa->state != CYAPA_STATE_OP) + return -EAGAIN; + + return 0; +} + +/* + * Set device power mode + * + */ +static int cyapa_set_power_mode(struct cyapa *cyapa, u8 power_mode) +{ + struct device *dev = &cyapa->client->dev; + int ret; + u8 power; + + if (cyapa->state != CYAPA_STATE_OP) + return 0; + + ret = cyapa_read_byte(cyapa, CYAPA_CMD_POWER_MODE); + if (ret < 0) + return ret; + + power = ret & ~PWR_MODE_MASK; + power |= power_mode & PWR_MODE_MASK; + ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power); + if (ret < 0) + dev_err(dev, "failed to set power_mode 0x%02x err = %d\n", + power_mode, ret); + return ret; +} + +static int cyapa_get_query_data(struct cyapa *cyapa) +{ + u8 query_data[QUERY_DATA_SIZE]; + int ret; + + if (cyapa->state != CYAPA_STATE_OP) + return -EBUSY; + + ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_QUERY, query_data); + if (ret < 0) + return ret; + if (ret != QUERY_DATA_SIZE) + return -EIO; + + memcpy(&cyapa->product_id[0], &query_data[0], 5); + cyapa->product_id[5] = '-'; + memcpy(&cyapa->product_id[6], &query_data[5], 6); + cyapa->product_id[12] = '-'; + memcpy(&cyapa->product_id[13], &query_data[11], 2); + cyapa->product_id[15] = '\0'; + + cyapa->btn_capability = query_data[19] & CAPABILITY_BTN_MASK; + + cyapa->gen = query_data[20] & 0x0f; + + cyapa->max_abs_x = ((query_data[21] & 0xf0) << 4) | query_data[22]; + cyapa->max_abs_y = ((query_data[21] & 0x0f) << 8) | query_data[23]; + + cyapa->physical_size_x = + ((query_data[24] & 0xf0) << 4) | query_data[25]; + cyapa->physical_size_y = + ((query_data[24] & 0x0f) << 8) | query_data[26]; + + return 0; +} + +/* + * Check if device is operational. + * + * An operational device is responding, has exited bootloader, and has + * firmware supported by this driver. + * + * Returns: + * -EBUSY no device or in bootloader + * -EIO failure while reading from device + * -EAGAIN device is still in bootloader + * if ->state = CYAPA_STATE_BL_IDLE, device has invalid firmware + * -EINVAL device is in operational mode, but not supported by this driver + * 0 device is supported + */ +static int cyapa_check_is_operational(struct cyapa *cyapa) +{ + struct device *dev = &cyapa->client->dev; + static const char unique_str[] = "CYTRA"; + int ret; + + ret = cyapa_poll_state(cyapa, 2000); + if (ret < 0) + return ret; + switch (cyapa->state) { + case CYAPA_STATE_BL_ACTIVE: + ret = cyapa_bl_deactivate(cyapa); + if (ret) + return ret; + + /* Fallthrough state */ + case CYAPA_STATE_BL_IDLE: + ret = cyapa_bl_exit(cyapa); + if (ret) + return ret; + + /* Fallthrough state */ + case CYAPA_STATE_OP: + ret = cyapa_get_query_data(cyapa); + if (ret < 0) + return ret; + + /* only support firmware protocol gen3 */ + if (cyapa->gen != CYAPA_GEN3) { + dev_err(dev, "unsupported protocol version (%d)", + cyapa->gen); + return -EINVAL; + } + + /* only support product ID starting with CYTRA */ + if (memcmp(cyapa->product_id, unique_str, + sizeof(unique_str) - 1) != 0) { + dev_err(dev, "unsupported product ID (%s)\n", + cyapa->product_id); + return -EINVAL; + } + return 0; + + default: + return -EIO; + } + return 0; +} + +static irqreturn_t cyapa_irq(int irq, void *dev_id) +{ + struct cyapa *cyapa = dev_id; + struct device *dev = &cyapa->client->dev; + struct input_dev *input = cyapa->input; + struct cyapa_reg_data data; + int i; + int ret; + int num_fingers; + + if (device_may_wakeup(dev)) + pm_wakeup_event(dev, 0); + + ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_DATA, (u8 *)&data); + if (ret != sizeof(data)) + goto out; + + if ((data.device_status & OP_STATUS_SRC) != OP_STATUS_SRC || + (data.device_status & OP_STATUS_DEV) != CYAPA_DEV_NORMAL || + (data.finger_btn & OP_DATA_VALID) != OP_DATA_VALID) { + goto out; + } + + num_fingers = (data.finger_btn >> 4) & 0x0f; + for (i = 0; i < num_fingers; i++) { + const struct cyapa_touch *touch = &data.touches[i]; + /* Note: touch->id range is 1 to 15; slots are 0 to 14. */ + int slot = touch->id - 1; + + input_mt_slot(input, slot); + input_mt_report_slot_state(input, MT_TOOL_FINGER, true); + input_report_abs(input, ABS_MT_POSITION_X, + ((touch->xy_hi & 0xf0) << 4) | touch->x_lo); + input_report_abs(input, ABS_MT_POSITION_Y, + ((touch->xy_hi & 0x0f) << 8) | touch->y_lo); + input_report_abs(input, ABS_MT_PRESSURE, touch->pressure); + } + + input_mt_sync_frame(input); + + if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK) + input_report_key(input, BTN_LEFT, + data.finger_btn & OP_DATA_LEFT_BTN); + + if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK) + input_report_key(input, BTN_MIDDLE, + data.finger_btn & OP_DATA_MIDDLE_BTN); + + if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK) + input_report_key(input, BTN_RIGHT, + data.finger_btn & OP_DATA_RIGHT_BTN); + + input_sync(input); + +out: + return IRQ_HANDLED; +} + +static u8 cyapa_check_adapter_functionality(struct i2c_client *client) +{ + u8 ret = CYAPA_ADAPTER_FUNC_NONE; + + if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + ret |= CYAPA_ADAPTER_FUNC_I2C; + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA | + I2C_FUNC_SMBUS_BLOCK_DATA | + I2C_FUNC_SMBUS_I2C_BLOCK)) + ret |= CYAPA_ADAPTER_FUNC_SMBUS; + return ret; +} + +static int cyapa_create_input_dev(struct cyapa *cyapa) +{ + struct device *dev = &cyapa->client->dev; + int ret; + struct input_dev *input; + + if (!cyapa->physical_size_x || !cyapa->physical_size_y) + return -EINVAL; + + input = cyapa->input = input_allocate_device(); + if (!input) { + dev_err(dev, "allocate memory for input device failed\n"); + return -ENOMEM; + } + + input->name = CYAPA_NAME; + input->phys = cyapa->phys; + input->id.bustype = BUS_I2C; + input->id.version = 1; + input->id.product = 0; /* means any product in eventcomm. */ + input->dev.parent = &cyapa->client->dev; + + input_set_drvdata(input, cyapa); + + __set_bit(EV_ABS, input->evbit); + + /* finger position */ + input_set_abs_params(input, ABS_MT_POSITION_X, 0, cyapa->max_abs_x, 0, + 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cyapa->max_abs_y, 0, + 0); + input_set_abs_params(input, ABS_MT_PRESSURE, 0, 255, 0, 0); + + input_abs_set_res(input, ABS_MT_POSITION_X, + cyapa->max_abs_x / cyapa->physical_size_x); + input_abs_set_res(input, ABS_MT_POSITION_Y, + cyapa->max_abs_y / cyapa->physical_size_y); + + if (cyapa->btn_capability & CAPABILITY_LEFT_BTN_MASK) + __set_bit(BTN_LEFT, input->keybit); + if (cyapa->btn_capability & CAPABILITY_MIDDLE_BTN_MASK) + __set_bit(BTN_MIDDLE, input->keybit); + if (cyapa->btn_capability & CAPABILITY_RIGHT_BTN_MASK) + __set_bit(BTN_RIGHT, input->keybit); + + if (cyapa->btn_capability == CAPABILITY_LEFT_BTN_MASK) + __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); + + /* handle pointer emulation and unused slots in core */ + ret = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS, + INPUT_MT_POINTER | INPUT_MT_DROP_UNUSED); + if (ret) { + dev_err(dev, "allocate memory for MT slots failed, %d\n", ret); + goto err_free_device; + } + + /* Register the device in input subsystem */ + ret = input_register_device(input); + if (ret) { + dev_err(dev, "input device register failed, %d\n", ret); + goto err_free_device; + } + return 0; + +err_free_device: + input_free_device(input); + cyapa->input = NULL; + return ret; +} + +static int cyapa_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int ret; + u8 adapter_func; + struct cyapa *cyapa; + struct device *dev = &client->dev; + + adapter_func = cyapa_check_adapter_functionality(client); + if (adapter_func == CYAPA_ADAPTER_FUNC_NONE) { + dev_err(dev, "not a supported I2C/SMBus adapter\n"); + return -EIO; + } + + cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL); + if (!cyapa) { + dev_err(dev, "allocate memory for cyapa failed\n"); + return -ENOMEM; + } + + cyapa->gen = CYAPA_GEN3; + cyapa->client = client; + i2c_set_clientdata(client, cyapa); + sprintf(cyapa->phys, "i2c-%d-%04x/input0", client->adapter->nr, + client->addr); + + /* i2c isn't supported, use smbus */ + if (adapter_func == CYAPA_ADAPTER_FUNC_SMBUS) + cyapa->smbus = true; + cyapa->state = CYAPA_STATE_NO_DEVICE; + ret = cyapa_check_is_operational(cyapa); + if (ret) { + dev_err(dev, "device not operational, %d\n", ret); + goto err_mem_free; + } + + ret = cyapa_create_input_dev(cyapa); + if (ret) { + dev_err(dev, "create input_dev instance failed, %d\n", ret); + goto err_mem_free; + } + + ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE); + if (ret) { + dev_err(dev, "set active power failed, %d\n", ret); + goto err_unregister_device; + } + + cyapa->irq = client->irq; + ret = request_threaded_irq(cyapa->irq, + NULL, + cyapa_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "cyapa", + cyapa); + if (ret) { + dev_err(dev, "IRQ request failed: %d\n, ", ret); + goto err_unregister_device; + } + + return 0; + +err_unregister_device: + input_unregister_device(cyapa->input); +err_mem_free: + kfree(cyapa); + + return ret; +} + +static int cyapa_remove(struct i2c_client *client) +{ + struct cyapa *cyapa = i2c_get_clientdata(client); + + free_irq(cyapa->irq, cyapa); + input_unregister_device(cyapa->input); + cyapa_set_power_mode(cyapa, PWR_MODE_OFF); + kfree(cyapa); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int cyapa_suspend(struct device *dev) +{ + int ret; + u8 power_mode; + struct cyapa *cyapa = dev_get_drvdata(dev); + + disable_irq(cyapa->irq); + + /* + * Set trackpad device to idle mode if wakeup is allowed, + * otherwise turn off. + */ + power_mode = device_may_wakeup(dev) ? PWR_MODE_IDLE + : PWR_MODE_OFF; + ret = cyapa_set_power_mode(cyapa, power_mode); + if (ret < 0) + dev_err(dev, "set power mode failed, %d\n", ret); + + if (device_may_wakeup(dev)) + cyapa->irq_wake = (enable_irq_wake(cyapa->irq) == 0); + return 0; +} + +static int cyapa_resume(struct device *dev) +{ + int ret; + struct cyapa *cyapa = dev_get_drvdata(dev); + + if (device_may_wakeup(dev) && cyapa->irq_wake) + disable_irq_wake(cyapa->irq); + + ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE); + if (ret) + dev_warn(dev, "resume active power failed, %d\n", ret); + + enable_irq(cyapa->irq); + return 0; +} +#endif /* CONFIG_PM_SLEEP */ + +static SIMPLE_DEV_PM_OPS(cyapa_pm_ops, cyapa_suspend, cyapa_resume); + +static const struct i2c_device_id cyapa_id_table[] = { + { "cyapa", 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, cyapa_id_table); + +static struct i2c_driver cyapa_driver = { + .driver = { + .name = "cyapa", + .owner = THIS_MODULE, + .pm = &cyapa_pm_ops, + }, + + .probe = cyapa_probe, + .remove = cyapa_remove, + .id_table = cyapa_id_table, +}; + +module_i2c_driver(cyapa_driver); + +MODULE_DESCRIPTION("Cypress APA I2C Trackpad Driver"); +MODULE_AUTHOR("Dudley Du "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/mouse/cypress_ps2.c b/drivers/input/mouse/cypress_ps2.c new file mode 100644 index 00000000..0aaea7ad --- /dev/null +++ b/drivers/input/mouse/cypress_ps2.c @@ -0,0 +1,718 @@ +/* + * Cypress Trackpad PS/2 mouse driver + * + * Copyright (c) 2012 Cypress Semiconductor Corporation. + * + * Author: + * Dudley Du + * + * Additional contributors include: + * Kamal Mostafa + * Kyle Fazzari + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cypress_ps2.h" + +#undef CYTP_DEBUG_VERBOSE /* define this and DEBUG for more verbose dump */ + +static void cypress_set_packet_size(struct psmouse *psmouse, unsigned int n) +{ + struct cytp_data *cytp = psmouse->private; + cytp->pkt_size = n; +} + +static const unsigned char cytp_rate[] = {10, 20, 40, 60, 100, 200}; +static const unsigned char cytp_resolution[] = {0x00, 0x01, 0x02, 0x03}; + +static int cypress_ps2_sendbyte(struct psmouse *psmouse, int value) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + + if (ps2_sendbyte(ps2dev, value & 0xff, CYTP_CMD_TIMEOUT) < 0) { + psmouse_dbg(psmouse, + "sending command 0x%02x failed, resp 0x%02x\n", + value & 0xff, ps2dev->nak); + if (ps2dev->nak == CYTP_PS2_RETRY) + return CYTP_PS2_RETRY; + else + return CYTP_PS2_ERROR; + } + +#ifdef CYTP_DEBUG_VERBOSE + psmouse_dbg(psmouse, "sending command 0x%02x succeeded, resp 0xfa\n", + value & 0xff); +#endif + + return 0; +} + +static int cypress_ps2_ext_cmd(struct psmouse *psmouse, unsigned short cmd, + unsigned char data) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + int tries = CYTP_PS2_CMD_TRIES; + int rc; + + ps2_begin_command(ps2dev); + + do { + /* + * Send extension command byte (0xE8 or 0xF3). + * If sending the command fails, send recovery command + * to make the device return to the ready state. + */ + rc = cypress_ps2_sendbyte(psmouse, cmd & 0xff); + if (rc == CYTP_PS2_RETRY) { + rc = cypress_ps2_sendbyte(psmouse, 0x00); + if (rc == CYTP_PS2_RETRY) + rc = cypress_ps2_sendbyte(psmouse, 0x0a); + } + if (rc == CYTP_PS2_ERROR) + continue; + + rc = cypress_ps2_sendbyte(psmouse, data); + if (rc == CYTP_PS2_RETRY) + rc = cypress_ps2_sendbyte(psmouse, data); + if (rc == CYTP_PS2_ERROR) + continue; + else + break; + } while (--tries > 0); + + ps2_end_command(ps2dev); + + return rc; +} + +static int cypress_ps2_read_cmd_status(struct psmouse *psmouse, + unsigned char cmd, + unsigned char *param) +{ + int rc; + struct ps2dev *ps2dev = &psmouse->ps2dev; + enum psmouse_state old_state; + int pktsize; + + ps2_begin_command(&psmouse->ps2dev); + + old_state = psmouse->state; + psmouse->state = PSMOUSE_CMD_MODE; + psmouse->pktcnt = 0; + + pktsize = (cmd == CYTP_CMD_READ_TP_METRICS) ? 8 : 3; + memset(param, 0, pktsize); + + rc = cypress_ps2_sendbyte(psmouse, 0xe9); + if (rc < 0) + goto out; + + wait_event_timeout(ps2dev->wait, + (psmouse->pktcnt >= pktsize), + msecs_to_jiffies(CYTP_CMD_TIMEOUT)); + + memcpy(param, psmouse->packet, pktsize); + + psmouse_dbg(psmouse, "Command 0x%02x response data (0x): %*ph\n", + cmd, pktsize, param); + +out: + psmouse->state = old_state; + psmouse->pktcnt = 0; + + ps2_end_command(&psmouse->ps2dev); + + return rc; +} + +static bool cypress_verify_cmd_state(struct psmouse *psmouse, + unsigned char cmd, unsigned char *param) +{ + bool rate_match = false; + bool resolution_match = false; + int i; + + /* callers will do further checking. */ + if (cmd == CYTP_CMD_READ_CYPRESS_ID || + cmd == CYTP_CMD_STANDARD_MODE || + cmd == CYTP_CMD_READ_TP_METRICS) + return true; + + if ((~param[0] & DFLT_RESP_BITS_VALID) == DFLT_RESP_BITS_VALID && + (param[0] & DFLT_RESP_BIT_MODE) == DFLT_RESP_STREAM_MODE) { + for (i = 0; i < sizeof(cytp_resolution); i++) + if (cytp_resolution[i] == param[1]) + resolution_match = true; + + for (i = 0; i < sizeof(cytp_rate); i++) + if (cytp_rate[i] == param[2]) + rate_match = true; + + if (resolution_match && rate_match) + return true; + } + + psmouse_dbg(psmouse, "verify cmd state failed.\n"); + return false; +} + +static int cypress_send_ext_cmd(struct psmouse *psmouse, unsigned char cmd, + unsigned char *param) +{ + int tries = CYTP_PS2_CMD_TRIES; + int rc; + + psmouse_dbg(psmouse, "send extension cmd 0x%02x, [%d %d %d %d]\n", + cmd, DECODE_CMD_AA(cmd), DECODE_CMD_BB(cmd), + DECODE_CMD_CC(cmd), DECODE_CMD_DD(cmd)); + + do { + cypress_ps2_ext_cmd(psmouse, + PSMOUSE_CMD_SETRES, DECODE_CMD_DD(cmd)); + cypress_ps2_ext_cmd(psmouse, + PSMOUSE_CMD_SETRES, DECODE_CMD_CC(cmd)); + cypress_ps2_ext_cmd(psmouse, + PSMOUSE_CMD_SETRES, DECODE_CMD_BB(cmd)); + cypress_ps2_ext_cmd(psmouse, + PSMOUSE_CMD_SETRES, DECODE_CMD_AA(cmd)); + + rc = cypress_ps2_read_cmd_status(psmouse, cmd, param); + if (rc) + continue; + + if (cypress_verify_cmd_state(psmouse, cmd, param)) + return 0; + + } while (--tries > 0); + + return -EIO; +} + +int cypress_detect(struct psmouse *psmouse, bool set_properties) +{ + unsigned char param[3]; + + if (cypress_send_ext_cmd(psmouse, CYTP_CMD_READ_CYPRESS_ID, param)) + return -ENODEV; + + /* Check for Cypress Trackpad signature bytes: 0x33 0xCC */ + if (param[0] != 0x33 || param[1] != 0xCC) + return -ENODEV; + + if (set_properties) { + psmouse->vendor = "Cypress"; + psmouse->name = "Trackpad"; + } + + return 0; +} + +static int cypress_read_fw_version(struct psmouse *psmouse) +{ + struct cytp_data *cytp = psmouse->private; + unsigned char param[3]; + + if (cypress_send_ext_cmd(psmouse, CYTP_CMD_READ_CYPRESS_ID, param)) + return -ENODEV; + + /* Check for Cypress Trackpad signature bytes: 0x33 0xCC */ + if (param[0] != 0x33 || param[1] != 0xCC) + return -ENODEV; + + cytp->fw_version = param[2] & FW_VERSION_MASX; + cytp->tp_metrics_supported = (param[2] & TP_METRICS_MASK) ? 1 : 0; + + /* + * Trackpad fw_version 11 (in Dell XPS12) yields a bogus response to + * CYTP_CMD_READ_TP_METRICS so do not try to use it. LP: #1103594. + */ + if (cytp->fw_version >= 11) + cytp->tp_metrics_supported = 0; + + psmouse_dbg(psmouse, "cytp->fw_version = %d\n", cytp->fw_version); + psmouse_dbg(psmouse, "cytp->tp_metrics_supported = %d\n", + cytp->tp_metrics_supported); + + return 0; +} + +static int cypress_read_tp_metrics(struct psmouse *psmouse) +{ + struct cytp_data *cytp = psmouse->private; + unsigned char param[8]; + + /* set default values for tp metrics. */ + cytp->tp_width = CYTP_DEFAULT_WIDTH; + cytp->tp_high = CYTP_DEFAULT_HIGH; + cytp->tp_max_abs_x = CYTP_ABS_MAX_X; + cytp->tp_max_abs_y = CYTP_ABS_MAX_Y; + cytp->tp_min_pressure = CYTP_MIN_PRESSURE; + cytp->tp_max_pressure = CYTP_MAX_PRESSURE; + cytp->tp_res_x = cytp->tp_max_abs_x / cytp->tp_width; + cytp->tp_res_y = cytp->tp_max_abs_y / cytp->tp_high; + + if (!cytp->tp_metrics_supported) + return 0; + + memset(param, 0, sizeof(param)); + if (cypress_send_ext_cmd(psmouse, CYTP_CMD_READ_TP_METRICS, param) == 0) { + /* Update trackpad parameters. */ + cytp->tp_max_abs_x = (param[1] << 8) | param[0]; + cytp->tp_max_abs_y = (param[3] << 8) | param[2]; + cytp->tp_min_pressure = param[4]; + cytp->tp_max_pressure = param[5]; + } + + if (!cytp->tp_max_pressure || + cytp->tp_max_pressure < cytp->tp_min_pressure || + !cytp->tp_width || !cytp->tp_high || + !cytp->tp_max_abs_x || + cytp->tp_max_abs_x < cytp->tp_width || + !cytp->tp_max_abs_y || + cytp->tp_max_abs_y < cytp->tp_high) + return -EINVAL; + + cytp->tp_res_x = cytp->tp_max_abs_x / cytp->tp_width; + cytp->tp_res_y = cytp->tp_max_abs_y / cytp->tp_high; + +#ifdef CYTP_DEBUG_VERBOSE + psmouse_dbg(psmouse, "Dump trackpad hardware configuration as below:\n"); + psmouse_dbg(psmouse, "cytp->tp_width = %d\n", cytp->tp_width); + psmouse_dbg(psmouse, "cytp->tp_high = %d\n", cytp->tp_high); + psmouse_dbg(psmouse, "cytp->tp_max_abs_x = %d\n", cytp->tp_max_abs_x); + psmouse_dbg(psmouse, "cytp->tp_max_abs_y = %d\n", cytp->tp_max_abs_y); + psmouse_dbg(psmouse, "cytp->tp_min_pressure = %d\n", cytp->tp_min_pressure); + psmouse_dbg(psmouse, "cytp->tp_max_pressure = %d\n", cytp->tp_max_pressure); + psmouse_dbg(psmouse, "cytp->tp_res_x = %d\n", cytp->tp_res_x); + psmouse_dbg(psmouse, "cytp->tp_res_y = %d\n", cytp->tp_res_y); + + psmouse_dbg(psmouse, "tp_type_APA = %d\n", + (param[6] & TP_METRICS_BIT_APA) ? 1 : 0); + psmouse_dbg(psmouse, "tp_type_MTG = %d\n", + (param[6] & TP_METRICS_BIT_MTG) ? 1 : 0); + psmouse_dbg(psmouse, "tp_palm = %d\n", + (param[6] & TP_METRICS_BIT_PALM) ? 1 : 0); + psmouse_dbg(psmouse, "tp_stubborn = %d\n", + (param[6] & TP_METRICS_BIT_STUBBORN) ? 1 : 0); + psmouse_dbg(psmouse, "tp_1f_jitter = %d\n", + (param[6] & TP_METRICS_BIT_1F_JITTER) >> 2); + psmouse_dbg(psmouse, "tp_2f_jitter = %d\n", + (param[6] & TP_METRICS_BIT_2F_JITTER) >> 4); + psmouse_dbg(psmouse, "tp_1f_spike = %d\n", + param[7] & TP_METRICS_BIT_1F_SPIKE); + psmouse_dbg(psmouse, "tp_2f_spike = %d\n", + (param[7] & TP_METRICS_BIT_2F_SPIKE) >> 2); + psmouse_dbg(psmouse, "tp_abs_packet_format_set = %d\n", + (param[7] & TP_METRICS_BIT_ABS_PKT_FORMAT_SET) >> 4); +#endif + + return 0; +} + +static int cypress_query_hardware(struct psmouse *psmouse) +{ + int ret; + + ret = cypress_read_fw_version(psmouse); + if (ret) + return ret; + + ret = cypress_read_tp_metrics(psmouse); + if (ret) + return ret; + + return 0; +} + +static int cypress_set_absolute_mode(struct psmouse *psmouse) +{ + struct cytp_data *cytp = psmouse->private; + unsigned char param[3]; + + if (cypress_send_ext_cmd(psmouse, CYTP_CMD_ABS_WITH_PRESSURE_MODE, param) < 0) + return -1; + + cytp->mode = (cytp->mode & ~CYTP_BIT_ABS_REL_MASK) + | CYTP_BIT_ABS_PRESSURE; + cypress_set_packet_size(psmouse, 5); + + return 0; +} + +/* + * Reset trackpad device. + * This is also the default mode when trackpad powered on. + */ +static void cypress_reset(struct psmouse *psmouse) +{ + struct cytp_data *cytp = psmouse->private; + + cytp->mode = 0; + + psmouse_reset(psmouse); +} + +static int cypress_set_input_params(struct input_dev *input, + struct cytp_data *cytp) +{ + int ret; + + if (!cytp->tp_res_x || !cytp->tp_res_y) + return -EINVAL; + + __set_bit(EV_ABS, input->evbit); + input_set_abs_params(input, ABS_X, 0, cytp->tp_max_abs_x, 0, 0); + input_set_abs_params(input, ABS_Y, 0, cytp->tp_max_abs_y, 0, 0); + input_set_abs_params(input, ABS_PRESSURE, + cytp->tp_min_pressure, cytp->tp_max_pressure, 0, 0); + input_set_abs_params(input, ABS_TOOL_WIDTH, 0, 255, 0, 0); + + /* finger position */ + input_set_abs_params(input, ABS_MT_POSITION_X, 0, cytp->tp_max_abs_x, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cytp->tp_max_abs_y, 0, 0); + input_set_abs_params(input, ABS_MT_PRESSURE, 0, 255, 0, 0); + + ret = input_mt_init_slots(input, CYTP_MAX_MT_SLOTS, + INPUT_MT_DROP_UNUSED|INPUT_MT_TRACK); + if (ret < 0) + return ret; + + __set_bit(INPUT_PROP_SEMI_MT, input->propbit); + + input_abs_set_res(input, ABS_X, cytp->tp_res_x); + input_abs_set_res(input, ABS_Y, cytp->tp_res_y); + + input_abs_set_res(input, ABS_MT_POSITION_X, cytp->tp_res_x); + input_abs_set_res(input, ABS_MT_POSITION_Y, cytp->tp_res_y); + + __set_bit(BTN_TOUCH, input->keybit); + __set_bit(BTN_TOOL_FINGER, input->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, input->keybit); + __set_bit(BTN_TOOL_TRIPLETAP, input->keybit); + __set_bit(BTN_TOOL_QUADTAP, input->keybit); + __set_bit(BTN_TOOL_QUINTTAP, input->keybit); + + __clear_bit(EV_REL, input->evbit); + __clear_bit(REL_X, input->relbit); + __clear_bit(REL_Y, input->relbit); + + __set_bit(EV_KEY, input->evbit); + __set_bit(BTN_LEFT, input->keybit); + __set_bit(BTN_RIGHT, input->keybit); + __set_bit(BTN_MIDDLE, input->keybit); + + input_set_drvdata(input, cytp); + + return 0; +} + +static int cypress_get_finger_count(unsigned char header_byte) +{ + unsigned char bits6_7; + int finger_count; + + bits6_7 = header_byte >> 6; + finger_count = bits6_7 & 0x03; + + if (finger_count == 1) + return 1; + + if (header_byte & ABS_HSCROLL_BIT) { + /* HSCROLL gets added on to 0 finger count. */ + switch (finger_count) { + case 0: return 4; + case 2: return 5; + default: + /* Invalid contact (e.g. palm). Ignore it. */ + return 0; + } + } + + return finger_count; +} + + +static int cypress_parse_packet(struct psmouse *psmouse, + struct cytp_data *cytp, struct cytp_report_data *report_data) +{ + unsigned char *packet = psmouse->packet; + unsigned char header_byte = packet[0]; + + memset(report_data, 0, sizeof(struct cytp_report_data)); + + report_data->contact_cnt = cypress_get_finger_count(header_byte); + report_data->tap = (header_byte & ABS_MULTIFINGER_TAP) ? 1 : 0; + + if (report_data->contact_cnt == 1) { + report_data->contacts[0].x = + ((packet[1] & 0x70) << 4) | packet[2]; + report_data->contacts[0].y = + ((packet[1] & 0x07) << 8) | packet[3]; + if (cytp->mode & CYTP_BIT_ABS_PRESSURE) + report_data->contacts[0].z = packet[4]; + + } else if (report_data->contact_cnt >= 2) { + report_data->contacts[0].x = + ((packet[1] & 0x70) << 4) | packet[2]; + report_data->contacts[0].y = + ((packet[1] & 0x07) << 8) | packet[3]; + if (cytp->mode & CYTP_BIT_ABS_PRESSURE) + report_data->contacts[0].z = packet[4]; + + report_data->contacts[1].x = + ((packet[5] & 0xf0) << 4) | packet[6]; + report_data->contacts[1].y = + ((packet[5] & 0x0f) << 8) | packet[7]; + if (cytp->mode & CYTP_BIT_ABS_PRESSURE) + report_data->contacts[1].z = report_data->contacts[0].z; + } + + report_data->left = (header_byte & BTN_LEFT_BIT) ? 1 : 0; + report_data->right = (header_byte & BTN_RIGHT_BIT) ? 1 : 0; + + /* + * This is only true if one of the mouse buttons were tapped. Make + * sure it doesn't turn into a click. The regular tap-to-click + * functionality will handle that on its own. If we don't do this, + * disabling tap-to-click won't affect the mouse button zones. + */ + if (report_data->tap) + report_data->left = 0; + +#ifdef CYTP_DEBUG_VERBOSE + { + int i; + int n = report_data->contact_cnt; + psmouse_dbg(psmouse, "Dump parsed report data as below:\n"); + psmouse_dbg(psmouse, "contact_cnt = %d\n", + report_data->contact_cnt); + if (n > CYTP_MAX_MT_SLOTS) + n = CYTP_MAX_MT_SLOTS; + for (i = 0; i < n; i++) + psmouse_dbg(psmouse, "contacts[%d] = {%d, %d, %d}\n", i, + report_data->contacts[i].x, + report_data->contacts[i].y, + report_data->contacts[i].z); + psmouse_dbg(psmouse, "left = %d\n", report_data->left); + psmouse_dbg(psmouse, "right = %d\n", report_data->right); + psmouse_dbg(psmouse, "middle = %d\n", report_data->middle); + } +#endif + + return 0; +} + +static void cypress_process_packet(struct psmouse *psmouse, bool zero_pkt) +{ + int i; + struct input_dev *input = psmouse->dev; + struct cytp_data *cytp = psmouse->private; + struct cytp_report_data report_data; + struct cytp_contact *contact; + struct input_mt_pos pos[CYTP_MAX_MT_SLOTS]; + int slots[CYTP_MAX_MT_SLOTS]; + int n; + + cypress_parse_packet(psmouse, cytp, &report_data); + + n = report_data.contact_cnt; + if (n > CYTP_MAX_MT_SLOTS) + n = CYTP_MAX_MT_SLOTS; + + for (i = 0; i < n; i++) { + contact = &report_data.contacts[i]; + pos[i].x = contact->x; + pos[i].y = contact->y; + } + + input_mt_assign_slots(input, slots, pos, n); + + for (i = 0; i < n; i++) { + contact = &report_data.contacts[i]; + input_mt_slot(input, slots[i]); + input_mt_report_slot_state(input, MT_TOOL_FINGER, true); + input_report_abs(input, ABS_MT_POSITION_X, contact->x); + input_report_abs(input, ABS_MT_POSITION_Y, contact->y); + input_report_abs(input, ABS_MT_PRESSURE, contact->z); + } + + input_mt_sync_frame(input); + + input_mt_report_finger_count(input, report_data.contact_cnt); + + input_report_key(input, BTN_LEFT, report_data.left); + input_report_key(input, BTN_RIGHT, report_data.right); + input_report_key(input, BTN_MIDDLE, report_data.middle); + + input_sync(input); +} + +static psmouse_ret_t cypress_validate_byte(struct psmouse *psmouse) +{ + int contact_cnt; + int index = psmouse->pktcnt - 1; + unsigned char *packet = psmouse->packet; + struct cytp_data *cytp = psmouse->private; + + if (index < 0 || index > cytp->pkt_size) + return PSMOUSE_BAD_DATA; + + if (index == 0 && (packet[0] & 0xfc) == 0) { + /* call packet process for reporting finger leave. */ + cypress_process_packet(psmouse, 1); + return PSMOUSE_FULL_PACKET; + } + + /* + * Perform validation (and adjust packet size) based only on the + * first byte; allow all further bytes through. + */ + if (index != 0) + return PSMOUSE_GOOD_DATA; + + /* + * If absolute/relative mode bit has not been set yet, just pass + * the byte through. + */ + if ((cytp->mode & CYTP_BIT_ABS_REL_MASK) == 0) + return PSMOUSE_GOOD_DATA; + + if ((packet[0] & 0x08) == 0x08) + return PSMOUSE_BAD_DATA; + + contact_cnt = cypress_get_finger_count(packet[0]); + if (cytp->mode & CYTP_BIT_ABS_NO_PRESSURE) + cypress_set_packet_size(psmouse, contact_cnt == 2 ? 7 : 4); + else + cypress_set_packet_size(psmouse, contact_cnt == 2 ? 8 : 5); + + return PSMOUSE_GOOD_DATA; +} + +static psmouse_ret_t cypress_protocol_handler(struct psmouse *psmouse) +{ + struct cytp_data *cytp = psmouse->private; + + if (psmouse->pktcnt >= cytp->pkt_size) { + cypress_process_packet(psmouse, 0); + return PSMOUSE_FULL_PACKET; + } + + return cypress_validate_byte(psmouse); +} + +static void cypress_set_rate(struct psmouse *psmouse, unsigned int rate) +{ + struct cytp_data *cytp = psmouse->private; + + if (rate >= 80) { + psmouse->rate = 80; + cytp->mode |= CYTP_BIT_HIGH_RATE; + } else { + psmouse->rate = 40; + cytp->mode &= ~CYTP_BIT_HIGH_RATE; + } + + ps2_command(&psmouse->ps2dev, (unsigned char *)&psmouse->rate, + PSMOUSE_CMD_SETRATE); +} + +static void cypress_disconnect(struct psmouse *psmouse) +{ + cypress_reset(psmouse); + kfree(psmouse->private); + psmouse->private = NULL; +} + +static int cypress_reconnect(struct psmouse *psmouse) +{ + int tries = CYTP_PS2_CMD_TRIES; + int rc; + + do { + cypress_reset(psmouse); + rc = cypress_detect(psmouse, false); + } while (rc && (--tries > 0)); + + if (rc) { + psmouse_err(psmouse, "Reconnect: unable to detect trackpad.\n"); + return -1; + } + + if (cypress_set_absolute_mode(psmouse)) { + psmouse_err(psmouse, "Reconnect: Unable to initialize Cypress absolute mode.\n"); + return -1; + } + + return 0; +} + +int cypress_init(struct psmouse *psmouse) +{ + struct cytp_data *cytp; + + cytp = (struct cytp_data *)kzalloc(sizeof(struct cytp_data), GFP_KERNEL); + psmouse->private = (void *)cytp; + if (cytp == NULL) + return -ENOMEM; + + cypress_reset(psmouse); + + psmouse->pktsize = 8; + + if (cypress_query_hardware(psmouse)) { + psmouse_err(psmouse, "Unable to query Trackpad hardware.\n"); + goto err_exit; + } + + if (cypress_set_absolute_mode(psmouse)) { + psmouse_err(psmouse, "init: Unable to initialize Cypress absolute mode.\n"); + goto err_exit; + } + + if (cypress_set_input_params(psmouse->dev, cytp) < 0) { + psmouse_err(psmouse, "init: Unable to set input params.\n"); + goto err_exit; + } + + psmouse->model = 1; + psmouse->protocol_handler = cypress_protocol_handler; + psmouse->set_rate = cypress_set_rate; + psmouse->disconnect = cypress_disconnect; + psmouse->reconnect = cypress_reconnect; + psmouse->cleanup = cypress_reset; + psmouse->resync_time = 0; + + return 0; + +err_exit: + /* + * Reset Cypress Trackpad as a standard mouse. Then + * let psmouse driver commmunicating with it as default PS2 mouse. + */ + cypress_reset(psmouse); + + psmouse->private = NULL; + kfree(cytp); + + return -1; +} + +bool cypress_supported(void) +{ + return true; +} diff --git a/drivers/input/mouse/cypress_ps2.h b/drivers/input/mouse/cypress_ps2.h new file mode 100644 index 00000000..4720f21d --- /dev/null +++ b/drivers/input/mouse/cypress_ps2.h @@ -0,0 +1,191 @@ +#ifndef _CYPRESS_PS2_H +#define _CYPRESS_PS2_H + +#include "psmouse.h" + +#define CMD_BITS_MASK 0x03 +#define COMPOSIT(x, s) (((x) & CMD_BITS_MASK) << (s)) + +#define ENCODE_CMD(aa, bb, cc, dd) \ + (COMPOSIT((aa), 6) | COMPOSIT((bb), 4) | COMPOSIT((cc), 2) | COMPOSIT((dd), 0)) +#define CYTP_CMD_ABS_NO_PRESSURE_MODE ENCODE_CMD(0, 1, 0, 0) +#define CYTP_CMD_ABS_WITH_PRESSURE_MODE ENCODE_CMD(0, 1, 0, 1) +#define CYTP_CMD_SMBUS_MODE ENCODE_CMD(0, 1, 1, 0) +#define CYTP_CMD_STANDARD_MODE ENCODE_CMD(0, 2, 0, 0) /* not implemented yet. */ +#define CYTP_CMD_CYPRESS_REL_MODE ENCODE_CMD(1, 1, 1, 1) /* not implemented yet. */ +#define CYTP_CMD_READ_CYPRESS_ID ENCODE_CMD(0, 0, 0, 0) +#define CYTP_CMD_READ_TP_METRICS ENCODE_CMD(0, 0, 0, 1) +#define CYTP_CMD_SET_HSCROLL_WIDTH(w) ENCODE_CMD(1, 1, 0, (w)) +#define CYTP_CMD_SET_HSCROLL_MASK ENCODE_CMD(1, 1, 0, 0) +#define CYTP_CMD_SET_VSCROLL_WIDTH(w) ENCODE_CMD(1, 2, 0, (w)) +#define CYTP_CMD_SET_VSCROLL_MASK ENCODE_CMD(1, 2, 0, 0) +#define CYTP_CMD_SET_PALM_GEOMETRY(e) ENCODE_CMD(1, 2, 1, (e)) +#define CYTP_CMD_PALM_GEMMETRY_MASK ENCODE_CMD(1, 2, 1, 0) +#define CYTP_CMD_SET_PALM_SENSITIVITY(s) ENCODE_CMD(1, 2, 2, (s)) +#define CYTP_CMD_PALM_SENSITIVITY_MASK ENCODE_CMD(1, 2, 2, 0) +#define CYTP_CMD_SET_MOUSE_SENSITIVITY(s) ENCODE_CMD(1, 3, ((s) >> 2), (s)) +#define CYTP_CMD_MOUSE_SENSITIVITY_MASK ENCODE_CMD(1, 3, 0, 0) +#define CYTP_CMD_REQUEST_BASELINE_STATUS ENCODE_CMD(2, 0, 0, 1) +#define CYTP_CMD_REQUEST_RECALIBRATION ENCODE_CMD(2, 0, 0, 3) + +#define DECODE_CMD_AA(x) (((x) >> 6) & CMD_BITS_MASK) +#define DECODE_CMD_BB(x) (((x) >> 4) & CMD_BITS_MASK) +#define DECODE_CMD_CC(x) (((x) >> 2) & CMD_BITS_MASK) +#define DECODE_CMD_DD(x) ((x) & CMD_BITS_MASK) + +/* Cypress trackpad working mode. */ +#define CYTP_BIT_ABS_PRESSURE (1 << 3) +#define CYTP_BIT_ABS_NO_PRESSURE (1 << 2) +#define CYTP_BIT_CYPRESS_REL (1 << 1) +#define CYTP_BIT_STANDARD_REL (1 << 0) +#define CYTP_BIT_REL_MASK (CYTP_BIT_CYPRESS_REL | CYTP_BIT_STANDARD_REL) +#define CYTP_BIT_ABS_MASK (CYTP_BIT_ABS_PRESSURE | CYTP_BIT_ABS_NO_PRESSURE) +#define CYTP_BIT_ABS_REL_MASK (CYTP_BIT_ABS_MASK | CYTP_BIT_REL_MASK) + +#define CYTP_BIT_HIGH_RATE (1 << 4) +/* + * report mode bit is set, firmware working in Remote Mode. + * report mode bit is cleared, firmware working in Stream Mode. + */ +#define CYTP_BIT_REPORT_MODE (1 << 5) + +/* scrolling width values for set HSCROLL and VSCROLL width command. */ +#define SCROLL_WIDTH_NARROW 1 +#define SCROLL_WIDTH_NORMAL 2 +#define SCROLL_WIDTH_WIDE 3 + +#define PALM_GEOMETRY_ENABLE 1 +#define PALM_GEOMETRY_DISABLE 0 + +#define TP_METRICS_MASK 0x80 +#define FW_VERSION_MASX 0x7f +#define FW_VER_HIGH_MASK 0x70 +#define FW_VER_LOW_MASK 0x0f + +/* Times to retry a ps2_command and millisecond delay between tries. */ +#define CYTP_PS2_CMD_TRIES 3 +#define CYTP_PS2_CMD_DELAY 500 + +/* time out for PS/2 command only in milliseconds. */ +#define CYTP_CMD_TIMEOUT 200 +#define CYTP_DATA_TIMEOUT 30 + +#define CYTP_EXT_CMD 0xe8 +#define CYTP_PS2_RETRY 0xfe +#define CYTP_PS2_ERROR 0xfc + +#define CYTP_RESP_RETRY 0x01 +#define CYTP_RESP_ERROR 0xfe + + +#define CYTP_105001_WIDTH 97 /* Dell XPS 13 */ +#define CYTP_105001_HIGH 59 +#define CYTP_DEFAULT_WIDTH (CYTP_105001_WIDTH) +#define CYTP_DEFAULT_HIGH (CYTP_105001_HIGH) + +#define CYTP_ABS_MAX_X 1600 +#define CYTP_ABS_MAX_Y 900 +#define CYTP_MAX_PRESSURE 255 +#define CYTP_MIN_PRESSURE 0 + +/* header byte bits of relative package. */ +#define BTN_LEFT_BIT 0x01 +#define BTN_RIGHT_BIT 0x02 +#define BTN_MIDDLE_BIT 0x04 +#define REL_X_SIGN_BIT 0x10 +#define REL_Y_SIGN_BIT 0x20 + +/* header byte bits of absolute package. */ +#define ABS_VSCROLL_BIT 0x10 +#define ABS_HSCROLL_BIT 0x20 +#define ABS_MULTIFINGER_TAP 0x04 +#define ABS_EDGE_MOTION_MASK 0x80 + +#define DFLT_RESP_BITS_VALID 0x88 /* SMBus bit should not be set. */ +#define DFLT_RESP_SMBUS_BIT 0x80 +#define DFLT_SMBUS_MODE 0x80 +#define DFLT_PS2_MODE 0x00 +#define DFLT_RESP_BIT_MODE 0x40 +#define DFLT_RESP_REMOTE_MODE 0x40 +#define DFLT_RESP_STREAM_MODE 0x00 +#define DFLT_RESP_BIT_REPORTING 0x20 +#define DFLT_RESP_BIT_SCALING 0x10 + +#define TP_METRICS_BIT_PALM 0x80 +#define TP_METRICS_BIT_STUBBORN 0x40 +#define TP_METRICS_BIT_2F_JITTER 0x30 +#define TP_METRICS_BIT_1F_JITTER 0x0c +#define TP_METRICS_BIT_APA 0x02 +#define TP_METRICS_BIT_MTG 0x01 +#define TP_METRICS_BIT_ABS_PKT_FORMAT_SET 0xf0 +#define TP_METRICS_BIT_2F_SPIKE 0x0c +#define TP_METRICS_BIT_1F_SPIKE 0x03 + +/* bits of first byte response of E9h-Status Request command. */ +#define RESP_BTN_RIGHT_BIT 0x01 +#define RESP_BTN_MIDDLE_BIT 0x02 +#define RESP_BTN_LEFT_BIT 0x04 +#define RESP_SCALING_BIT 0x10 +#define RESP_ENABLE_BIT 0x20 +#define RESP_REMOTE_BIT 0x40 +#define RESP_SMBUS_BIT 0x80 + +#define CYTP_MAX_MT_SLOTS 2 + +struct cytp_contact { + int x; + int y; + int z; /* also named as touch pressure. */ +}; + +/* The structure of Cypress Trackpad event data. */ +struct cytp_report_data { + int contact_cnt; + struct cytp_contact contacts[CYTP_MAX_MT_SLOTS]; + unsigned int left:1; + unsigned int right:1; + unsigned int middle:1; + unsigned int tap:1; /* multi-finger tap detected. */ +}; + +/* The structure of Cypress Trackpad device private data. */ +struct cytp_data { + int fw_version; + + int pkt_size; + int mode; + + int tp_min_pressure; + int tp_max_pressure; + int tp_width; /* X direction physical size in mm. */ + int tp_high; /* Y direction physical size in mm. */ + int tp_max_abs_x; /* Max X absolute units that can be reported. */ + int tp_max_abs_y; /* Max Y absolute units that can be reported. */ + + int tp_res_x; /* X resolution in units/mm. */ + int tp_res_y; /* Y resolution in units/mm. */ + + int tp_metrics_supported; +}; + + +#ifdef CONFIG_MOUSE_PS2_CYPRESS +int cypress_detect(struct psmouse *psmouse, bool set_properties); +int cypress_init(struct psmouse *psmouse); +bool cypress_supported(void); +#else +inline int cypress_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +inline int cypress_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} +inline bool cypress_supported(void) +{ + return 0; +} +#endif /* CONFIG_MOUSE_PS2_CYPRESS */ + +#endif /* _CYPRESS_PS2_H */ diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c new file mode 100644 index 00000000..85e75239 --- /dev/null +++ b/drivers/input/mouse/elantech.c @@ -0,0 +1,1479 @@ +/* + * Elantech Touchpad driver (v6) + * + * Copyright (C) 2007-2009 Arjan Opmeer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * Trademarks are the property of their respective owners. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "psmouse.h" +#include "elantech.h" + +#define elantech_debug(fmt, ...) \ + do { \ + if (etd->debug) \ + psmouse_printk(KERN_DEBUG, psmouse, \ + fmt, ##__VA_ARGS__); \ + } while (0) + +/* + * Send a Synaptics style sliced query command + */ +static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, + unsigned char *param) +{ + if (psmouse_sliced_command(psmouse, c) || + ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { + psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c); + return -1; + } + + return 0; +} + +/* + * V3 and later support this fast command + */ +static int elantech_send_cmd(struct psmouse *psmouse, unsigned char c, + unsigned char *param) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + + if (ps2_command(ps2dev, NULL, ETP_PS2_CUSTOM_COMMAND) || + ps2_command(ps2dev, NULL, c) || + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) { + psmouse_err(psmouse, "%s query 0x%02x failed.\n", __func__, c); + return -1; + } + + return 0; +} + +/* + * A retrying version of ps2_command + */ +static int elantech_ps2_command(struct psmouse *psmouse, + unsigned char *param, int command) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + struct elantech_data *etd = psmouse->private; + int rc; + int tries = ETP_PS2_COMMAND_TRIES; + + do { + rc = ps2_command(ps2dev, param, command); + if (rc == 0) + break; + tries--; + elantech_debug("retrying ps2 command 0x%02x (%d).\n", + command, tries); + msleep(ETP_PS2_COMMAND_DELAY); + } while (tries > 0); + + if (rc) + psmouse_err(psmouse, "ps2 command 0x%02x failed.\n", command); + + return rc; +} + +/* + * Send an Elantech style special command to read a value from a register + */ +static int elantech_read_reg(struct psmouse *psmouse, unsigned char reg, + unsigned char *val) +{ + struct elantech_data *etd = psmouse->private; + unsigned char param[3]; + int rc = 0; + + if (reg < 0x07 || reg > 0x26) + return -1; + + if (reg > 0x11 && reg < 0x20) + return -1; + + switch (etd->hw_version) { + case 1: + if (psmouse_sliced_command(psmouse, ETP_REGISTER_READ) || + psmouse_sliced_command(psmouse, reg) || + ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) { + rc = -1; + } + break; + + case 2: + if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READ) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, reg) || + elantech_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO)) { + rc = -1; + } + break; + + case 3 ... 4: + if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, reg) || + elantech_ps2_command(psmouse, param, PSMOUSE_CMD_GETINFO)) { + rc = -1; + } + break; + } + + if (rc) + psmouse_err(psmouse, "failed to read register 0x%02x.\n", reg); + else if (etd->hw_version != 4) + *val = param[0]; + else + *val = param[1]; + + return rc; +} + +/* + * Send an Elantech style special command to write a register with a value + */ +static int elantech_write_reg(struct psmouse *psmouse, unsigned char reg, + unsigned char val) +{ + struct elantech_data *etd = psmouse->private; + int rc = 0; + + if (reg < 0x07 || reg > 0x26) + return -1; + + if (reg > 0x11 && reg < 0x20) + return -1; + + switch (etd->hw_version) { + case 1: + if (psmouse_sliced_command(psmouse, ETP_REGISTER_WRITE) || + psmouse_sliced_command(psmouse, reg) || + psmouse_sliced_command(psmouse, val) || + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) { + rc = -1; + } + break; + + case 2: + if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, ETP_REGISTER_WRITE) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, reg) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, val) || + elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) { + rc = -1; + } + break; + + case 3: + if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, reg) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, val) || + elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) { + rc = -1; + } + break; + + case 4: + if (elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, reg) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, ETP_REGISTER_READWRITE) || + elantech_ps2_command(psmouse, NULL, ETP_PS2_CUSTOM_COMMAND) || + elantech_ps2_command(psmouse, NULL, val) || + elantech_ps2_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11)) { + rc = -1; + } + break; + } + + if (rc) + psmouse_err(psmouse, + "failed to write register 0x%02x with value 0x%02x.\n", + reg, val); + + return rc; +} + +/* + * Dump a complete mouse movement packet to the syslog + */ +static void elantech_packet_dump(struct psmouse *psmouse) +{ + int i; + + psmouse_printk(KERN_DEBUG, psmouse, "PS/2 packet ["); + for (i = 0; i < psmouse->pktsize; i++) + printk("%s0x%02x ", i ? ", " : " ", psmouse->packet[i]); + printk("]\n"); +} + +/* + * Interpret complete data packets and report absolute mode input events for + * hardware version 1. (4 byte packets) + */ +static void elantech_report_absolute_v1(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + int fingers; + + if (etd->fw_version < 0x020000) { + /* + * byte 0: D U p1 p2 1 p3 R L + * byte 1: f 0 th tw x9 x8 y9 y8 + */ + fingers = ((packet[1] & 0x80) >> 7) + + ((packet[1] & 0x30) >> 4); + } else { + /* + * byte 0: n1 n0 p2 p1 1 p3 R L + * byte 1: 0 0 0 0 x9 x8 y9 y8 + */ + fingers = (packet[0] & 0xc0) >> 6; + } + + if (etd->jumpy_cursor) { + if (fingers != 1) { + etd->single_finger_reports = 0; + } else if (etd->single_finger_reports < 2) { + /* Discard first 2 reports of one finger, bogus */ + etd->single_finger_reports++; + elantech_debug("discarding packet\n"); + return; + } + } + + input_report_key(dev, BTN_TOUCH, fingers != 0); + + /* + * byte 2: x7 x6 x5 x4 x3 x2 x1 x0 + * byte 3: y7 y6 y5 y4 y3 y2 y1 y0 + */ + if (fingers) { + input_report_abs(dev, ABS_X, + ((packet[1] & 0x0c) << 6) | packet[2]); + input_report_abs(dev, ABS_Y, + etd->y_max - (((packet[1] & 0x03) << 8) | packet[3])); + } + + input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); + input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); + input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); + input_report_key(dev, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); + + if (etd->fw_version < 0x020000 && + (etd->capabilities[0] & ETP_CAP_HAS_ROCKER)) { + /* rocker up */ + input_report_key(dev, BTN_FORWARD, packet[0] & 0x40); + /* rocker down */ + input_report_key(dev, BTN_BACK, packet[0] & 0x80); + } + + input_sync(dev); +} + +static void elantech_set_slot(struct input_dev *dev, int slot, bool active, + unsigned int x, unsigned int y) +{ + input_mt_slot(dev, slot); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); + if (active) { + input_report_abs(dev, ABS_MT_POSITION_X, x); + input_report_abs(dev, ABS_MT_POSITION_Y, y); + } +} + +/* x1 < x2 and y1 < y2 when two fingers, x = y = 0 when not pressed */ +static void elantech_report_semi_mt_data(struct input_dev *dev, + unsigned int num_fingers, + unsigned int x1, unsigned int y1, + unsigned int x2, unsigned int y2) +{ + elantech_set_slot(dev, 0, num_fingers != 0, x1, y1); + elantech_set_slot(dev, 1, num_fingers == 2, x2, y2); +} + +/* + * Interpret complete data packets and report absolute mode input events for + * hardware version 2. (6 byte packets) + */ +static void elantech_report_absolute_v2(struct psmouse *psmouse) +{ + struct elantech_data *etd = psmouse->private; + struct input_dev *dev = psmouse->dev; + unsigned char *packet = psmouse->packet; + unsigned int fingers, x1 = 0, y1 = 0, x2 = 0, y2 = 0; + unsigned int width = 0, pres = 0; + + /* byte 0: n1 n0 . . . . R L */ + fingers = (packet[0] & 0xc0) >> 6; + + switch (fingers) { + case 3: + /* + * Same as one finger, except report of more than 3 fingers: + * byte 3: n4 . w1 w0 . . . . + */ + if (packet[3] & 0x80) + fingers = 4; + /* pass through... */ + case 1: + /* + * byte 1: . . . . x11 x10 x9 x8 + * byte 2: x7 x6 x5 x4 x4 x2 x1 x0 + */ + x1 = ((packet[1] & 0x0f) << 8) | packet[2]; + /* + * byte 4: . . . . y11 y10 y9 y8 + * byte 5: y7 y6 y5 y4 y3 y2 y1 y0 + */ + y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]); + + pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4); + width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4); + break; + + case 2: + /* + * The coordinate of each finger is reported separately + * with a lower resolution for two finger touches: + * byte 0: . . ay8 ax8 . . . . + * byte 1: ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 + */ + x1 = (((packet[0] & 0x10) << 4) | packet[1]) << 2; + /* byte 2: ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 */ + y1 = etd->y_max - + ((((packet[0] & 0x20) << 3) | packet[2]) << 2); + /* + * byte 3: . . by8 bx8 . . . . + * byte 4: bx7 bx6 bx5 bx4 bx3 bx2 bx1 bx0 + */ + x2 = (((packet[3] & 0x10) << 4) | packet[4]) << 2; + /* byte 5: by7 by8 by5 by4 by3 by2 by1 by0 */ + y2 = etd->y_max - + ((((packet[3] & 0x20) << 3) | packet[5]) << 2); + + /* Unknown so just report sensible values */ + pres = 127; + width = 7; + break; + } + + input_report_key(dev, BTN_TOUCH, fingers != 0); + if (fingers != 0) { + input_report_abs(dev, ABS_X, x1); + input_report_abs(dev, ABS_Y, y1); + } + elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); + input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); + input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); + input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); + input_report_key(dev, BTN_TOOL_QUADTAP, fingers == 4); + input_report_key(dev, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); + if (etd->reports_pressure) { + input_report_abs(dev, ABS_PRESSURE, pres); + input_report_abs(dev, ABS_TOOL_WIDTH, width); + } + + input_sync(dev); +} + +/* + * Interpret complete data packets and report absolute mode input events for + * hardware version 3. (12 byte packets for two fingers) + */ +static void elantech_report_absolute_v3(struct psmouse *psmouse, + int packet_type) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + unsigned int fingers = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0; + unsigned int width = 0, pres = 0; + + /* byte 0: n1 n0 . . . . R L */ + fingers = (packet[0] & 0xc0) >> 6; + + switch (fingers) { + case 3: + case 1: + /* + * byte 1: . . . . x11 x10 x9 x8 + * byte 2: x7 x6 x5 x4 x4 x2 x1 x0 + */ + x1 = ((packet[1] & 0x0f) << 8) | packet[2]; + /* + * byte 4: . . . . y11 y10 y9 y8 + * byte 5: y7 y6 y5 y4 y3 y2 y1 y0 + */ + y1 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]); + break; + + case 2: + if (packet_type == PACKET_V3_HEAD) { + /* + * byte 1: . . . . ax11 ax10 ax9 ax8 + * byte 2: ax7 ax6 ax5 ax4 ax3 ax2 ax1 ax0 + */ + etd->mt[0].x = ((packet[1] & 0x0f) << 8) | packet[2]; + /* + * byte 4: . . . . ay11 ay10 ay9 ay8 + * byte 5: ay7 ay6 ay5 ay4 ay3 ay2 ay1 ay0 + */ + etd->mt[0].y = etd->y_max - + (((packet[4] & 0x0f) << 8) | packet[5]); + /* + * wait for next packet + */ + return; + } + + /* packet_type == PACKET_V3_TAIL */ + x1 = etd->mt[0].x; + y1 = etd->mt[0].y; + x2 = ((packet[1] & 0x0f) << 8) | packet[2]; + y2 = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]); + break; + } + + pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4); + width = ((packet[0] & 0x30) >> 2) | ((packet[3] & 0x30) >> 4); + + input_report_key(dev, BTN_TOUCH, fingers != 0); + if (fingers != 0) { + input_report_abs(dev, ABS_X, x1); + input_report_abs(dev, ABS_Y, y1); + } + elantech_report_semi_mt_data(dev, fingers, x1, y1, x2, y2); + input_report_key(dev, BTN_TOOL_FINGER, fingers == 1); + input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2); + input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3); + + /* For clickpads map both buttons to BTN_LEFT */ + if (etd->fw_version & 0x001000) { + input_report_key(dev, BTN_LEFT, packet[0] & 0x03); + } else { + input_report_key(dev, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); + } + + input_report_abs(dev, ABS_PRESSURE, pres); + input_report_abs(dev, ABS_TOOL_WIDTH, width); + + input_sync(dev); +} + +static void elantech_input_sync_v4(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + + /* For clickpads map both buttons to BTN_LEFT */ + if (etd->fw_version & 0x001000) { + input_report_key(dev, BTN_LEFT, packet[0] & 0x03); + } else { + input_report_key(dev, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); + } + + input_mt_report_pointer_emulation(dev, true); + input_sync(dev); +} + +static void process_packet_status_v4(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + unsigned char *packet = psmouse->packet; + unsigned fingers; + int i; + + /* notify finger state change */ + fingers = packet[1] & 0x1f; + for (i = 0; i < ETP_MAX_FINGERS; i++) { + if ((fingers & (1 << i)) == 0) { + input_mt_slot(dev, i); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, false); + } + } + + elantech_input_sync_v4(psmouse); +} + +static void process_packet_head_v4(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + int id = ((packet[3] & 0xe0) >> 5) - 1; + int pres, traces; + + if (id < 0) + return; + + etd->mt[id].x = ((packet[1] & 0x0f) << 8) | packet[2]; + etd->mt[id].y = etd->y_max - (((packet[4] & 0x0f) << 8) | packet[5]); + pres = (packet[1] & 0xf0) | ((packet[4] & 0xf0) >> 4); + traces = (packet[0] & 0xf0) >> 4; + + input_mt_slot(dev, id); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, true); + + input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[id].x); + input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[id].y); + input_report_abs(dev, ABS_MT_PRESSURE, pres); + input_report_abs(dev, ABS_MT_TOUCH_MAJOR, traces * etd->width); + /* report this for backwards compatibility */ + input_report_abs(dev, ABS_TOOL_WIDTH, traces); + + elantech_input_sync_v4(psmouse); +} + +static void process_packet_motion_v4(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + int weight, delta_x1 = 0, delta_y1 = 0, delta_x2 = 0, delta_y2 = 0; + int id, sid; + + id = ((packet[0] & 0xe0) >> 5) - 1; + if (id < 0) + return; + + sid = ((packet[3] & 0xe0) >> 5) - 1; + weight = (packet[0] & 0x10) ? ETP_WEIGHT_VALUE : 1; + /* + * Motion packets give us the delta of x, y values of specific fingers, + * but in two's complement. Let the compiler do the conversion for us. + * Also _enlarge_ the numbers to int, in case of overflow. + */ + delta_x1 = (signed char)packet[1]; + delta_y1 = (signed char)packet[2]; + delta_x2 = (signed char)packet[4]; + delta_y2 = (signed char)packet[5]; + + etd->mt[id].x += delta_x1 * weight; + etd->mt[id].y -= delta_y1 * weight; + input_mt_slot(dev, id); + input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[id].x); + input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[id].y); + + if (sid >= 0) { + etd->mt[sid].x += delta_x2 * weight; + etd->mt[sid].y -= delta_y2 * weight; + input_mt_slot(dev, sid); + input_report_abs(dev, ABS_MT_POSITION_X, etd->mt[sid].x); + input_report_abs(dev, ABS_MT_POSITION_Y, etd->mt[sid].y); + } + + elantech_input_sync_v4(psmouse); +} + +static void elantech_report_absolute_v4(struct psmouse *psmouse, + int packet_type) +{ + switch (packet_type) { + case PACKET_V4_STATUS: + process_packet_status_v4(psmouse); + break; + + case PACKET_V4_HEAD: + process_packet_head_v4(psmouse); + break; + + case PACKET_V4_MOTION: + process_packet_motion_v4(psmouse); + break; + + case PACKET_UNKNOWN: + default: + /* impossible to get here */ + break; + } +} + +static int elantech_packet_check_v1(struct psmouse *psmouse) +{ + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + unsigned char p1, p2, p3; + + /* Parity bits are placed differently */ + if (etd->fw_version < 0x020000) { + /* byte 0: D U p1 p2 1 p3 R L */ + p1 = (packet[0] & 0x20) >> 5; + p2 = (packet[0] & 0x10) >> 4; + } else { + /* byte 0: n1 n0 p2 p1 1 p3 R L */ + p1 = (packet[0] & 0x10) >> 4; + p2 = (packet[0] & 0x20) >> 5; + } + + p3 = (packet[0] & 0x04) >> 2; + + return etd->parity[packet[1]] == p1 && + etd->parity[packet[2]] == p2 && + etd->parity[packet[3]] == p3; +} + +static int elantech_debounce_check_v2(struct psmouse *psmouse) +{ + /* + * When we encounter packet that matches this exactly, it means the + * hardware is in debounce status. Just ignore the whole packet. + */ + const u8 debounce_packet[] = { 0x84, 0xff, 0xff, 0x02, 0xff, 0xff }; + unsigned char *packet = psmouse->packet; + + return !memcmp(packet, debounce_packet, sizeof(debounce_packet)); +} + +static int elantech_packet_check_v2(struct psmouse *psmouse) +{ + struct elantech_data *etd = psmouse->private; + unsigned char *packet = psmouse->packet; + + /* + * V2 hardware has two flavors. Older ones that do not report pressure, + * and newer ones that reports pressure and width. With newer ones, all + * packets (1, 2, 3 finger touch) have the same constant bits. With + * older ones, 1/3 finger touch packets and 2 finger touch packets + * have different constant bits. + * With all three cases, if the constant bits are not exactly what I + * expected, I consider them invalid. + */ + if (etd->reports_pressure) + return (packet[0] & 0x0c) == 0x04 && + (packet[3] & 0x0f) == 0x02; + + if ((packet[0] & 0xc0) == 0x80) + return (packet[0] & 0x0c) == 0x0c && + (packet[3] & 0x0e) == 0x08; + + return (packet[0] & 0x3c) == 0x3c && + (packet[1] & 0xf0) == 0x00 && + (packet[3] & 0x3e) == 0x38 && + (packet[4] & 0xf0) == 0x00; +} + +/* + * We check the constant bits to determine what packet type we get, + * so packet checking is mandatory for v3 and later hardware. + */ +static int elantech_packet_check_v3(struct psmouse *psmouse) +{ + const u8 debounce_packet[] = { 0xc4, 0xff, 0xff, 0x02, 0xff, 0xff }; + unsigned char *packet = psmouse->packet; + + /* + * check debounce first, it has the same signature in byte 0 + * and byte 3 as PACKET_V3_HEAD. + */ + if (!memcmp(packet, debounce_packet, sizeof(debounce_packet))) + return PACKET_DEBOUNCE; + + if ((packet[0] & 0x0c) == 0x04 && (packet[3] & 0xcf) == 0x02) + return PACKET_V3_HEAD; + + if ((packet[0] & 0x0c) == 0x0c && (packet[3] & 0xce) == 0x0c) + return PACKET_V3_TAIL; + + return PACKET_UNKNOWN; +} + +static int elantech_packet_check_v4(struct psmouse *psmouse) +{ + unsigned char *packet = psmouse->packet; + + if ((packet[0] & 0x0c) == 0x04 && + (packet[3] & 0x1f) == 0x11) + return PACKET_V4_HEAD; + + if ((packet[0] & 0x0c) == 0x04 && + (packet[3] & 0x1f) == 0x12) + return PACKET_V4_MOTION; + + if ((packet[0] & 0x0c) == 0x04 && + (packet[3] & 0x1f) == 0x10) + return PACKET_V4_STATUS; + + return PACKET_UNKNOWN; +} + +/* + * Process byte stream from mouse and handle complete packets + */ +static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse) +{ + struct elantech_data *etd = psmouse->private; + int packet_type; + + if (psmouse->pktcnt < psmouse->pktsize) + return PSMOUSE_GOOD_DATA; + + if (etd->debug > 1) + elantech_packet_dump(psmouse); + + switch (etd->hw_version) { + case 1: + if (etd->paritycheck && !elantech_packet_check_v1(psmouse)) + return PSMOUSE_BAD_DATA; + + elantech_report_absolute_v1(psmouse); + break; + + case 2: + /* ignore debounce */ + if (elantech_debounce_check_v2(psmouse)) + return PSMOUSE_FULL_PACKET; + + if (etd->paritycheck && !elantech_packet_check_v2(psmouse)) + return PSMOUSE_BAD_DATA; + + elantech_report_absolute_v2(psmouse); + break; + + case 3: + packet_type = elantech_packet_check_v3(psmouse); + /* ignore debounce */ + if (packet_type == PACKET_DEBOUNCE) + return PSMOUSE_FULL_PACKET; + + if (packet_type == PACKET_UNKNOWN) + return PSMOUSE_BAD_DATA; + + elantech_report_absolute_v3(psmouse, packet_type); + break; + + case 4: + packet_type = elantech_packet_check_v4(psmouse); + if (packet_type == PACKET_UNKNOWN) + return PSMOUSE_BAD_DATA; + + elantech_report_absolute_v4(psmouse, packet_type); + break; + } + + return PSMOUSE_FULL_PACKET; +} + +/* + * Put the touchpad into absolute mode + */ +static int elantech_set_absolute_mode(struct psmouse *psmouse) +{ + struct elantech_data *etd = psmouse->private; + unsigned char val; + int tries = ETP_READ_BACK_TRIES; + int rc = 0; + + switch (etd->hw_version) { + case 1: + etd->reg_10 = 0x16; + etd->reg_11 = 0x8f; + if (elantech_write_reg(psmouse, 0x10, etd->reg_10) || + elantech_write_reg(psmouse, 0x11, etd->reg_11)) { + rc = -1; + } + break; + + case 2: + /* Windows driver values */ + etd->reg_10 = 0x54; + etd->reg_11 = 0x88; /* 0x8a */ + etd->reg_21 = 0x60; /* 0x00 */ + if (elantech_write_reg(psmouse, 0x10, etd->reg_10) || + elantech_write_reg(psmouse, 0x11, etd->reg_11) || + elantech_write_reg(psmouse, 0x21, etd->reg_21)) { + rc = -1; + } + break; + + case 3: + if (etd->set_hw_resolution) + etd->reg_10 = 0x0b; + else + etd->reg_10 = 0x01; + + if (elantech_write_reg(psmouse, 0x10, etd->reg_10)) + rc = -1; + + break; + + case 4: + etd->reg_07 = 0x01; + if (elantech_write_reg(psmouse, 0x07, etd->reg_07)) + rc = -1; + + goto skip_readback_reg_10; /* v4 has no reg 0x10 to read */ + } + + if (rc == 0) { + /* + * Read back reg 0x10. For hardware version 1 we must make + * sure the absolute mode bit is set. For hardware version 2 + * the touchpad is probably initializing and not ready until + * we read back the value we just wrote. + */ + do { + rc = elantech_read_reg(psmouse, 0x10, &val); + if (rc == 0) + break; + tries--; + elantech_debug("retrying read (%d).\n", tries); + msleep(ETP_READ_BACK_DELAY); + } while (tries > 0); + + if (rc) { + psmouse_err(psmouse, + "failed to read back register 0x10.\n"); + } else if (etd->hw_version == 1 && + !(val & ETP_R10_ABSOLUTE_MODE)) { + psmouse_err(psmouse, + "touchpad refuses to switch to absolute mode.\n"); + rc = -1; + } + } + + skip_readback_reg_10: + if (rc) + psmouse_err(psmouse, "failed to initialise registers.\n"); + + return rc; +} + +static int elantech_set_range(struct psmouse *psmouse, + unsigned int *x_min, unsigned int *y_min, + unsigned int *x_max, unsigned int *y_max, + unsigned int *width) +{ + struct elantech_data *etd = psmouse->private; + unsigned char param[3]; + unsigned char traces; + + switch (etd->hw_version) { + case 1: + *x_min = ETP_XMIN_V1; + *y_min = ETP_YMIN_V1; + *x_max = ETP_XMAX_V1; + *y_max = ETP_YMAX_V1; + break; + + case 2: + if (etd->fw_version == 0x020800 || + etd->fw_version == 0x020b00 || + etd->fw_version == 0x020030) { + *x_min = ETP_XMIN_V2; + *y_min = ETP_YMIN_V2; + *x_max = ETP_XMAX_V2; + *y_max = ETP_YMAX_V2; + } else { + int i; + int fixed_dpi; + + i = (etd->fw_version > 0x020800 && + etd->fw_version < 0x020900) ? 1 : 2; + + if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param)) + return -1; + + fixed_dpi = param[1] & 0x10; + + if (((etd->fw_version >> 16) == 0x14) && fixed_dpi) { + if (etd->send_cmd(psmouse, ETP_SAMPLE_QUERY, param)) + return -1; + + *x_max = (etd->capabilities[1] - i) * param[1] / 2; + *y_max = (etd->capabilities[2] - i) * param[2] / 2; + } else if (etd->fw_version == 0x040216) { + *x_max = 819; + *y_max = 405; + } else if (etd->fw_version == 0x040219 || etd->fw_version == 0x040215) { + *x_max = 900; + *y_max = 500; + } else { + *x_max = (etd->capabilities[1] - i) * 64; + *y_max = (etd->capabilities[2] - i) * 64; + } + } + break; + + case 3: + if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param)) + return -1; + + *x_max = (0x0f & param[0]) << 8 | param[1]; + *y_max = (0xf0 & param[0]) << 4 | param[2]; + break; + + case 4: + if (etd->send_cmd(psmouse, ETP_FW_ID_QUERY, param)) + return -1; + + *x_max = (0x0f & param[0]) << 8 | param[1]; + *y_max = (0xf0 & param[0]) << 4 | param[2]; + traces = etd->capabilities[1]; + if ((traces < 2) || (traces > *x_max)) + return -1; + + *width = *x_max / (traces - 1); + break; + } + + return 0; +} + +/* + * (value from firmware) * 10 + 790 = dpi + * we also have to convert dpi to dots/mm (*10/254 to avoid floating point) + */ +static unsigned int elantech_convert_res(unsigned int val) +{ + return (val * 10 + 790) * 10 / 254; +} + +static int elantech_get_resolution_v4(struct psmouse *psmouse, + unsigned int *x_res, + unsigned int *y_res) +{ + unsigned char param[3]; + + if (elantech_send_cmd(psmouse, ETP_RESOLUTION_QUERY, param)) + return -1; + + *x_res = elantech_convert_res(param[1] & 0x0f); + *y_res = elantech_convert_res((param[1] & 0xf0) >> 4); + + return 0; +} + +/* + * Advertise INPUT_PROP_BUTTONPAD for clickpads. The testing of bit 12 in + * fw_version for this is based on the following fw_version & caps table: + * + * Laptop-model: fw_version: caps: buttons: + * Acer S3 0x461f00 10, 13, 0e clickpad + * Acer S7-392 0x581f01 50, 17, 0d clickpad + * Acer V5-131 0x461f02 01, 16, 0c clickpad + * Acer V5-551 0x461f00 ? clickpad + * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons + * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons + * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons + * Asus UX31 0x361f00 20, 15, 0e clickpad + * Asus UX32VD 0x361f02 00, 15, 0e clickpad + * Avatar AVIU-145A2 0x361f00 ? clickpad + * Gigabyte U2442 0x450f01 58, 17, 0c 2 hw buttons + * Lenovo L430 0x350f02 b9, 15, 0c 2 hw buttons (*) + * Samsung NF210 0x150b00 78, 14, 0a 2 hw buttons + * Samsung NP770Z5E 0x575f01 10, 15, 0f clickpad + * Samsung NP700Z5B 0x361f06 21, 15, 0f clickpad + * Samsung NP900X3E-A02 0x575f03 ? clickpad + * Samsung NP-QX410 0x851b00 19, 14, 0c clickpad + * Samsung RC512 0x450f00 08, 15, 0c 2 hw buttons + * Samsung RF710 0x450f00 ? 2 hw buttons + * System76 Pangolin 0x250f01 ? 2 hw buttons + * (*) + 3 trackpoint buttons + */ +static void elantech_set_buttonpad_prop(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + + if (etd->fw_version & 0x001000) { + __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); + __clear_bit(BTN_RIGHT, dev->keybit); + } +} + +/* + * Set the appropriate event bits for the input subsystem + */ +static int elantech_set_input_params(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct elantech_data *etd = psmouse->private; + unsigned int x_min = 0, y_min = 0, x_max = 0, y_max = 0, width = 0; + unsigned int x_res = 0, y_res = 0; + + if (elantech_set_range(psmouse, &x_min, &y_min, &x_max, &y_max, &width)) + return -1; + + __set_bit(INPUT_PROP_POINTER, dev->propbit); + __set_bit(EV_KEY, dev->evbit); + __set_bit(EV_ABS, dev->evbit); + __clear_bit(EV_REL, dev->evbit); + + __set_bit(BTN_LEFT, dev->keybit); + __set_bit(BTN_RIGHT, dev->keybit); + + __set_bit(BTN_TOUCH, dev->keybit); + __set_bit(BTN_TOOL_FINGER, dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); + __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit); + + switch (etd->hw_version) { + case 1: + /* Rocker button */ + if (etd->fw_version < 0x020000 && + (etd->capabilities[0] & ETP_CAP_HAS_ROCKER)) { + __set_bit(BTN_FORWARD, dev->keybit); + __set_bit(BTN_BACK, dev->keybit); + } + input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); + input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); + break; + + case 2: + __set_bit(BTN_TOOL_QUADTAP, dev->keybit); + __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); + /* fall through */ + case 3: + if (etd->hw_version == 3) + elantech_set_buttonpad_prop(psmouse); + input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); + input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); + if (etd->reports_pressure) { + input_set_abs_params(dev, ABS_PRESSURE, ETP_PMIN_V2, + ETP_PMAX_V2, 0, 0); + input_set_abs_params(dev, ABS_TOOL_WIDTH, ETP_WMIN_V2, + ETP_WMAX_V2, 0, 0); + } + input_mt_init_slots(dev, 2, 0); + input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0); + input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0); + break; + + case 4: + if (elantech_get_resolution_v4(psmouse, &x_res, &y_res)) { + /* + * if query failed, print a warning and leave the values + * zero to resemble synaptics.c behavior. + */ + psmouse_warn(psmouse, "couldn't query resolution data.\n"); + } + elantech_set_buttonpad_prop(psmouse); + __set_bit(BTN_TOOL_QUADTAP, dev->keybit); + /* For X to recognize me as touchpad. */ + input_set_abs_params(dev, ABS_X, x_min, x_max, 0, 0); + input_set_abs_params(dev, ABS_Y, y_min, y_max, 0, 0); + input_abs_set_res(dev, ABS_X, x_res); + input_abs_set_res(dev, ABS_Y, y_res); + /* + * range of pressure and width is the same as v2, + * report ABS_PRESSURE, ABS_TOOL_WIDTH for compatibility. + */ + input_set_abs_params(dev, ABS_PRESSURE, ETP_PMIN_V2, + ETP_PMAX_V2, 0, 0); + input_set_abs_params(dev, ABS_TOOL_WIDTH, ETP_WMIN_V2, + ETP_WMAX_V2, 0, 0); + /* Multitouch capable pad, up to 5 fingers. */ + input_mt_init_slots(dev, ETP_MAX_FINGERS, 0); + input_set_abs_params(dev, ABS_MT_POSITION_X, x_min, x_max, 0, 0); + input_set_abs_params(dev, ABS_MT_POSITION_Y, y_min, y_max, 0, 0); + input_abs_set_res(dev, ABS_MT_POSITION_X, x_res); + input_abs_set_res(dev, ABS_MT_POSITION_Y, y_res); + input_set_abs_params(dev, ABS_MT_PRESSURE, ETP_PMIN_V2, + ETP_PMAX_V2, 0, 0); + /* + * The firmware reports how many trace lines the finger spans, + * convert to surface unit as Protocol-B requires. + */ + input_set_abs_params(dev, ABS_MT_TOUCH_MAJOR, 0, + ETP_WMAX_V2 * width, 0, 0); + break; + } + + etd->y_max = y_max; + etd->width = width; + + return 0; +} + +struct elantech_attr_data { + size_t field_offset; + unsigned char reg; +}; + +/* + * Display a register value by reading a sysfs entry + */ +static ssize_t elantech_show_int_attr(struct psmouse *psmouse, void *data, + char *buf) +{ + struct elantech_data *etd = psmouse->private; + struct elantech_attr_data *attr = data; + unsigned char *reg = (unsigned char *) etd + attr->field_offset; + int rc = 0; + + if (attr->reg) + rc = elantech_read_reg(psmouse, attr->reg, reg); + + return sprintf(buf, "0x%02x\n", (attr->reg && rc) ? -1 : *reg); +} + +/* + * Write a register value by writing a sysfs entry + */ +static ssize_t elantech_set_int_attr(struct psmouse *psmouse, + void *data, const char *buf, size_t count) +{ + struct elantech_data *etd = psmouse->private; + struct elantech_attr_data *attr = data; + unsigned char *reg = (unsigned char *) etd + attr->field_offset; + unsigned char value; + int err; + + err = kstrtou8(buf, 16, &value); + if (err) + return err; + + /* Do we need to preserve some bits for version 2 hardware too? */ + if (etd->hw_version == 1) { + if (attr->reg == 0x10) + /* Force absolute mode always on */ + value |= ETP_R10_ABSOLUTE_MODE; + else if (attr->reg == 0x11) + /* Force 4 byte mode always on */ + value |= ETP_R11_4_BYTE_MODE; + } + + if (!attr->reg || elantech_write_reg(psmouse, attr->reg, value) == 0) + *reg = value; + + return count; +} + +#define ELANTECH_INT_ATTR(_name, _register) \ + static struct elantech_attr_data elantech_attr_##_name = { \ + .field_offset = offsetof(struct elantech_data, _name), \ + .reg = _register, \ + }; \ + PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ + &elantech_attr_##_name, \ + elantech_show_int_attr, \ + elantech_set_int_attr) + +ELANTECH_INT_ATTR(reg_07, 0x07); +ELANTECH_INT_ATTR(reg_10, 0x10); +ELANTECH_INT_ATTR(reg_11, 0x11); +ELANTECH_INT_ATTR(reg_20, 0x20); +ELANTECH_INT_ATTR(reg_21, 0x21); +ELANTECH_INT_ATTR(reg_22, 0x22); +ELANTECH_INT_ATTR(reg_23, 0x23); +ELANTECH_INT_ATTR(reg_24, 0x24); +ELANTECH_INT_ATTR(reg_25, 0x25); +ELANTECH_INT_ATTR(reg_26, 0x26); +ELANTECH_INT_ATTR(debug, 0); +ELANTECH_INT_ATTR(paritycheck, 0); + +static struct attribute *elantech_attrs[] = { + &psmouse_attr_reg_07.dattr.attr, + &psmouse_attr_reg_10.dattr.attr, + &psmouse_attr_reg_11.dattr.attr, + &psmouse_attr_reg_20.dattr.attr, + &psmouse_attr_reg_21.dattr.attr, + &psmouse_attr_reg_22.dattr.attr, + &psmouse_attr_reg_23.dattr.attr, + &psmouse_attr_reg_24.dattr.attr, + &psmouse_attr_reg_25.dattr.attr, + &psmouse_attr_reg_26.dattr.attr, + &psmouse_attr_debug.dattr.attr, + &psmouse_attr_paritycheck.dattr.attr, + NULL +}; + +static struct attribute_group elantech_attr_group = { + .attrs = elantech_attrs, +}; + +static bool elantech_is_signature_valid(const unsigned char *param) +{ + static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10 }; + int i; + + if (param[0] == 0) + return false; + + if (param[1] == 0) + return true; + + /* + * Some models have a revision higher then 20. Meaning param[2] may + * be 10 or 20, skip the rates check for these. + */ + if (param[0] == 0x46 && (param[1] & 0xef) == 0x0f && param[2] < 40) + return true; + + for (i = 0; i < ARRAY_SIZE(rates); i++) + if (param[2] == rates[i]) + return false; + + return true; +} + +/* + * Use magic knock to detect Elantech touchpad + */ +int elantech_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[3]; + + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); + + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_DISABLE) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11) || + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) { + psmouse_dbg(psmouse, "sending Elantech magic knock failed.\n"); + return -1; + } + + /* + * Report this in case there are Elantech models that use a different + * set of magic numbers + */ + if (param[0] != 0x3c || param[1] != 0x03 || + (param[2] != 0xc8 && param[2] != 0x00)) { + psmouse_dbg(psmouse, + "unexpected magic knock result 0x%02x, 0x%02x, 0x%02x.\n", + param[0], param[1], param[2]); + return -1; + } + + /* + * Query touchpad's firmware version and see if it reports known + * value to avoid mis-detection. Logitech mice are known to respond + * to Elantech magic knock and there might be more. + */ + if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) { + psmouse_dbg(psmouse, "failed to query firmware version.\n"); + return -1; + } + + psmouse_dbg(psmouse, + "Elantech version query result 0x%02x, 0x%02x, 0x%02x.\n", + param[0], param[1], param[2]); + + if (!elantech_is_signature_valid(param)) { + psmouse_dbg(psmouse, + "Probably not a real Elantech touchpad. Aborting.\n"); + return -1; + } + + if (set_properties) { + psmouse->vendor = "Elantech"; + psmouse->name = "Touchpad"; + } + + return 0; +} + +/* + * Clean up sysfs entries when disconnecting + */ +static void elantech_disconnect(struct psmouse *psmouse) +{ + sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, + &elantech_attr_group); + kfree(psmouse->private); + psmouse->private = NULL; +} + +/* + * Put the touchpad back into absolute mode when reconnecting + */ +static int elantech_reconnect(struct psmouse *psmouse) +{ + psmouse_reset(psmouse); + + if (elantech_detect(psmouse, 0)) + return -1; + + if (elantech_set_absolute_mode(psmouse)) { + psmouse_err(psmouse, + "failed to put touchpad back into absolute mode.\n"); + return -1; + } + + return 0; +} + +/* + * Some hw_version 3 models go into error state when we try to set + * bit 3 and/or bit 1 of r10. + */ +static const struct dmi_system_id no_hw_res_dmi_table[] = { +#if defined(CONFIG_DMI) && defined(CONFIG_X86) + { + /* Gigabyte U2442 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "U2442"), + }, + }, +#endif + { } +}; + +/* + * determine hardware version and set some properties according to it. + */ +static int elantech_set_properties(struct elantech_data *etd) +{ + /* This represents the version of IC body. */ + int ver = (etd->fw_version & 0x0f0000) >> 16; + + /* Early version of Elan touchpads doesn't obey the rule. */ + if (etd->fw_version < 0x020030 || etd->fw_version == 0x020600) + etd->hw_version = 1; + else { + switch (ver) { + case 2: + case 4: + etd->hw_version = 2; + break; + case 5: + etd->hw_version = 3; + break; + case 6: + etd->hw_version = 4; + break; + default: + return -1; + } + } + + /* decide which send_cmd we're gonna use early */ + etd->send_cmd = etd->hw_version >= 3 ? elantech_send_cmd : + synaptics_send_cmd; + + /* Turn on packet checking by default */ + etd->paritycheck = 1; + + /* + * This firmware suffers from misreporting coordinates when + * a touch action starts causing the mouse cursor or scrolled page + * to jump. Enable a workaround. + */ + etd->jumpy_cursor = + (etd->fw_version == 0x020022 || etd->fw_version == 0x020600); + + if (etd->hw_version > 1) { + /* For now show extra debug information */ + etd->debug = 1; + + if (etd->fw_version >= 0x020800) + etd->reports_pressure = true; + } + + /* Enable real hardware resolution on hw_version 3 ? */ + etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); + + return 0; +} + +/* + * Initialize the touchpad and create sysfs entries + */ +int elantech_init(struct psmouse *psmouse) +{ + struct elantech_data *etd; + int i, error; + unsigned char param[3]; + + psmouse->private = etd = kzalloc(sizeof(struct elantech_data), GFP_KERNEL); + if (!etd) + return -ENOMEM; + + psmouse_reset(psmouse); + + etd->parity[0] = 1; + for (i = 1; i < 256; i++) + etd->parity[i] = etd->parity[i & (i - 1)] ^ 1; + + /* + * Do the version query again so we can store the result + */ + if (synaptics_send_cmd(psmouse, ETP_FW_VERSION_QUERY, param)) { + psmouse_err(psmouse, "failed to query firmware version.\n"); + goto init_fail; + } + etd->fw_version = (param[0] << 16) | (param[1] << 8) | param[2]; + + if (elantech_set_properties(etd)) { + psmouse_err(psmouse, "unknown hardware version, aborting...\n"); + goto init_fail; + } + psmouse_info(psmouse, + "assuming hardware version %d (with firmware version 0x%02x%02x%02x)\n", + etd->hw_version, param[0], param[1], param[2]); + + if (etd->send_cmd(psmouse, ETP_CAPABILITIES_QUERY, + etd->capabilities)) { + psmouse_err(psmouse, "failed to query capabilities.\n"); + goto init_fail; + } + psmouse_info(psmouse, + "Synaptics capabilities query result 0x%02x, 0x%02x, 0x%02x.\n", + etd->capabilities[0], etd->capabilities[1], + etd->capabilities[2]); + + if (elantech_set_absolute_mode(psmouse)) { + psmouse_err(psmouse, + "failed to put touchpad into absolute mode.\n"); + goto init_fail; + } + + if (elantech_set_input_params(psmouse)) { + psmouse_err(psmouse, "failed to query touchpad range.\n"); + goto init_fail; + } + + error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj, + &elantech_attr_group); + if (error) { + psmouse_err(psmouse, + "failed to create sysfs attributes, error: %d.\n", + error); + goto init_fail; + } + + psmouse->protocol_handler = elantech_process_byte; + psmouse->disconnect = elantech_disconnect; + psmouse->reconnect = elantech_reconnect; + psmouse->pktsize = etd->hw_version > 1 ? 6 : 4; + + return 0; + + init_fail: + kfree(etd); + return -1; +} diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h new file mode 100644 index 00000000..c1c15ab6 --- /dev/null +++ b/drivers/input/mouse/elantech.h @@ -0,0 +1,157 @@ +/* + * Elantech Touchpad driver (v6) + * + * Copyright (C) 2007-2009 Arjan Opmeer + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + * + * Trademarks are the property of their respective owners. + */ + +#ifndef _ELANTECH_H +#define _ELANTECH_H + +/* + * Command values for Synaptics style queries + */ +#define ETP_FW_ID_QUERY 0x00 +#define ETP_FW_VERSION_QUERY 0x01 +#define ETP_CAPABILITIES_QUERY 0x02 +#define ETP_SAMPLE_QUERY 0x03 +#define ETP_RESOLUTION_QUERY 0x04 + +/* + * Command values for register reading or writing + */ +#define ETP_REGISTER_READ 0x10 +#define ETP_REGISTER_WRITE 0x11 +#define ETP_REGISTER_READWRITE 0x00 + +/* + * Hardware version 2 custom PS/2 command value + */ +#define ETP_PS2_CUSTOM_COMMAND 0xf8 + +/* + * Times to retry a ps2_command and millisecond delay between tries + */ +#define ETP_PS2_COMMAND_TRIES 3 +#define ETP_PS2_COMMAND_DELAY 500 + +/* + * Times to try to read back a register and millisecond delay between tries + */ +#define ETP_READ_BACK_TRIES 5 +#define ETP_READ_BACK_DELAY 2000 + +/* + * Register bitmasks for hardware version 1 + */ +#define ETP_R10_ABSOLUTE_MODE 0x04 +#define ETP_R11_4_BYTE_MODE 0x02 + +/* + * Capability bitmasks + */ +#define ETP_CAP_HAS_ROCKER 0x04 + +/* + * One hard to find application note states that X axis range is 0 to 576 + * and Y axis range is 0 to 384 for harware version 1. + * Edge fuzz might be necessary because of bezel around the touchpad + */ +#define ETP_EDGE_FUZZ_V1 32 + +#define ETP_XMIN_V1 ( 0 + ETP_EDGE_FUZZ_V1) +#define ETP_XMAX_V1 (576 - ETP_EDGE_FUZZ_V1) +#define ETP_YMIN_V1 ( 0 + ETP_EDGE_FUZZ_V1) +#define ETP_YMAX_V1 (384 - ETP_EDGE_FUZZ_V1) + +/* + * The resolution for older v2 hardware doubled. + * (newer v2's firmware provides command so we can query) + */ +#define ETP_XMIN_V2 0 +#define ETP_XMAX_V2 1152 +#define ETP_YMIN_V2 0 +#define ETP_YMAX_V2 768 + +#define ETP_PMIN_V2 0 +#define ETP_PMAX_V2 255 +#define ETP_WMIN_V2 0 +#define ETP_WMAX_V2 15 + +/* + * v3 hardware has 2 kinds of packet types, + * v4 hardware has 3. + */ +#define PACKET_UNKNOWN 0x01 +#define PACKET_DEBOUNCE 0x02 +#define PACKET_V3_HEAD 0x03 +#define PACKET_V3_TAIL 0x04 +#define PACKET_V4_HEAD 0x05 +#define PACKET_V4_MOTION 0x06 +#define PACKET_V4_STATUS 0x07 + +/* + * track up to 5 fingers for v4 hardware + */ +#define ETP_MAX_FINGERS 5 + +/* + * weight value for v4 hardware + */ +#define ETP_WEIGHT_VALUE 5 + +/* + * The base position for one finger, v4 hardware + */ +struct finger_pos { + unsigned int x; + unsigned int y; +}; + +struct elantech_data { + unsigned char reg_07; + unsigned char reg_10; + unsigned char reg_11; + unsigned char reg_20; + unsigned char reg_21; + unsigned char reg_22; + unsigned char reg_23; + unsigned char reg_24; + unsigned char reg_25; + unsigned char reg_26; + unsigned char debug; + unsigned char capabilities[3]; + bool paritycheck; + bool jumpy_cursor; + bool reports_pressure; + bool set_hw_resolution; + unsigned char hw_version; + unsigned int fw_version; + unsigned int single_finger_reports; + unsigned int y_max; + unsigned int width; + struct finger_pos mt[ETP_MAX_FINGERS]; + unsigned char parity[256]; + int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param); +}; + +#ifdef CONFIG_MOUSE_PS2_ELANTECH +int elantech_detect(struct psmouse *psmouse, bool set_properties); +int elantech_init(struct psmouse *psmouse); +#else +static inline int elantech_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +static inline int elantech_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} +#endif /* CONFIG_MOUSE_PS2_ELANTECH */ + +#endif diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c new file mode 100644 index 00000000..532eaca4 --- /dev/null +++ b/drivers/input/mouse/gpio_mouse.c @@ -0,0 +1,187 @@ +/* + * Driver for simulating a mouse on GPIO lines. + * + * Copyright (C) 2007 Atmel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include + + +/* + * Timer function which is run every scan_ms ms when the device is opened. + * The dev input variable is set to the the input_dev pointer. + */ +static void gpio_mouse_scan(struct input_polled_dev *dev) +{ + struct gpio_mouse_platform_data *gpio = dev->private; + struct input_dev *input = dev->input; + int x, y; + + if (gpio->bleft >= 0) + input_report_key(input, BTN_LEFT, + gpio_get_value(gpio->bleft) ^ gpio->polarity); + if (gpio->bmiddle >= 0) + input_report_key(input, BTN_MIDDLE, + gpio_get_value(gpio->bmiddle) ^ gpio->polarity); + if (gpio->bright >= 0) + input_report_key(input, BTN_RIGHT, + gpio_get_value(gpio->bright) ^ gpio->polarity); + + x = (gpio_get_value(gpio->right) ^ gpio->polarity) + - (gpio_get_value(gpio->left) ^ gpio->polarity); + y = (gpio_get_value(gpio->down) ^ gpio->polarity) + - (gpio_get_value(gpio->up) ^ gpio->polarity); + + input_report_rel(input, REL_X, x); + input_report_rel(input, REL_Y, y); + input_sync(input); +} + +static int gpio_mouse_probe(struct platform_device *pdev) +{ + struct gpio_mouse_platform_data *pdata = pdev->dev.platform_data; + struct input_polled_dev *input_poll; + struct input_dev *input; + int pin, i; + int error; + + if (!pdata) { + dev_err(&pdev->dev, "no platform data\n"); + error = -ENXIO; + goto out; + } + + if (pdata->scan_ms < 0) { + dev_err(&pdev->dev, "invalid scan time\n"); + error = -EINVAL; + goto out; + } + + for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) { + pin = pdata->pins[i]; + + if (pin < 0) { + + if (i <= GPIO_MOUSE_PIN_RIGHT) { + /* Mouse direction is required. */ + dev_err(&pdev->dev, + "missing GPIO for directions\n"); + error = -EINVAL; + goto out_free_gpios; + } + + if (i == GPIO_MOUSE_PIN_BLEFT) + dev_dbg(&pdev->dev, "no left button defined\n"); + + } else { + error = gpio_request(pin, "gpio_mouse"); + if (error) { + dev_err(&pdev->dev, "fail %d pin (%d idx)\n", + pin, i); + goto out_free_gpios; + } + + gpio_direction_input(pin); + } + } + + input_poll = input_allocate_polled_device(); + if (!input_poll) { + dev_err(&pdev->dev, "not enough memory for input device\n"); + error = -ENOMEM; + goto out_free_gpios; + } + + platform_set_drvdata(pdev, input_poll); + + /* set input-polldev handlers */ + input_poll->private = pdata; + input_poll->poll = gpio_mouse_scan; + input_poll->poll_interval = pdata->scan_ms; + + input = input_poll->input; + input->name = pdev->name; + input->id.bustype = BUS_HOST; + input->dev.parent = &pdev->dev; + + input_set_capability(input, EV_REL, REL_X); + input_set_capability(input, EV_REL, REL_Y); + if (pdata->bleft >= 0) + input_set_capability(input, EV_KEY, BTN_LEFT); + if (pdata->bmiddle >= 0) + input_set_capability(input, EV_KEY, BTN_MIDDLE); + if (pdata->bright >= 0) + input_set_capability(input, EV_KEY, BTN_RIGHT); + + error = input_register_polled_device(input_poll); + if (error) { + dev_err(&pdev->dev, "could not register input device\n"); + goto out_free_polldev; + } + + dev_dbg(&pdev->dev, "%d ms scan time, buttons: %s%s%s\n", + pdata->scan_ms, + pdata->bleft < 0 ? "" : "left ", + pdata->bmiddle < 0 ? "" : "middle ", + pdata->bright < 0 ? "" : "right"); + + return 0; + + out_free_polldev: + input_free_polled_device(input_poll); + platform_set_drvdata(pdev, NULL); + + out_free_gpios: + while (--i >= 0) { + pin = pdata->pins[i]; + if (pin) + gpio_free(pin); + } + out: + return error; +} + +static int gpio_mouse_remove(struct platform_device *pdev) +{ + struct input_polled_dev *input = platform_get_drvdata(pdev); + struct gpio_mouse_platform_data *pdata = input->private; + int pin, i; + + input_unregister_polled_device(input); + input_free_polled_device(input); + + for (i = 0; i < GPIO_MOUSE_PIN_MAX; i++) { + pin = pdata->pins[i]; + if (pin >= 0) + gpio_free(pin); + } + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver gpio_mouse_device_driver = { + .probe = gpio_mouse_probe, + .remove = gpio_mouse_remove, + .driver = { + .name = "gpio_mouse", + .owner = THIS_MODULE, + } +}; +module_platform_driver(gpio_mouse_device_driver); + +MODULE_AUTHOR("Hans-Christian Egtvedt "); +MODULE_DESCRIPTION("GPIO mouse driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:gpio_mouse"); /* work with hotplug and coldplug */ + diff --git a/drivers/input/mouse/hgpk.c b/drivers/input/mouse/hgpk.c new file mode 100644 index 00000000..62be888e --- /dev/null +++ b/drivers/input/mouse/hgpk.c @@ -0,0 +1,1067 @@ +/* + * OLPC HGPK (XO-1) touchpad PS/2 mouse driver + * + * Copyright (c) 2006-2008 One Laptop Per Child + * Authors: + * Zephaniah E. Hull + * Andres Salomon + * + * This driver is partly based on the ALPS driver, which is: + * + * Copyright (c) 2003 Neil Brown + * Copyright (c) 2003-2005 Peter Osterlund + * Copyright (c) 2004 Dmitry Torokhov + * Copyright (c) 2005 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* + * The spec from ALPS is available from + * . It refers to this + * device as HGPK (Hybrid GS, PT, and Keymatrix). + * + * The earliest versions of the device had simultaneous reporting; that + * was removed. After that, the device used the Advanced Mode GS/PT streaming + * stuff. That turned out to be too buggy to support, so we've finally + * switched to Mouse Mode (which utilizes only the center 1/3 of the touchpad). + */ + +#define DEBUG +#include +#include +#include +#include +#include +#include +#include + +#include "psmouse.h" +#include "hgpk.h" + +#define ILLEGAL_XY 999999 + +static bool tpdebug; +module_param(tpdebug, bool, 0644); +MODULE_PARM_DESC(tpdebug, "enable debugging, dumping packets to KERN_DEBUG."); + +static int recalib_delta = 100; +module_param(recalib_delta, int, 0644); +MODULE_PARM_DESC(recalib_delta, + "packets containing a delta this large will be discarded, and a " + "recalibration may be scheduled."); + +static int jumpy_delay = 20; +module_param(jumpy_delay, int, 0644); +MODULE_PARM_DESC(jumpy_delay, + "delay (ms) before recal after jumpiness detected"); + +static int spew_delay = 1; +module_param(spew_delay, int, 0644); +MODULE_PARM_DESC(spew_delay, + "delay (ms) before recal after packet spew detected"); + +static int recal_guard_time; +module_param(recal_guard_time, int, 0644); +MODULE_PARM_DESC(recal_guard_time, + "interval (ms) during which recal will be restarted if packet received"); + +static int post_interrupt_delay = 40; +module_param(post_interrupt_delay, int, 0644); +MODULE_PARM_DESC(post_interrupt_delay, + "delay (ms) before recal after recal interrupt detected"); + +static bool autorecal = true; +module_param(autorecal, bool, 0644); +MODULE_PARM_DESC(autorecal, "enable recalibration in the driver"); + +static char hgpk_mode_name[16]; +module_param_string(hgpk_mode, hgpk_mode_name, sizeof(hgpk_mode_name), 0644); +MODULE_PARM_DESC(hgpk_mode, + "default hgpk mode: mouse, glidesensor or pentablet"); + +static int hgpk_default_mode = HGPK_MODE_MOUSE; + +static const char * const hgpk_mode_names[] = { + [HGPK_MODE_MOUSE] = "Mouse", + [HGPK_MODE_GLIDESENSOR] = "GlideSensor", + [HGPK_MODE_PENTABLET] = "PenTablet", +}; + +static int hgpk_mode_from_name(const char *buf, int len) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(hgpk_mode_names); i++) { + const char *name = hgpk_mode_names[i]; + if (strlen(name) == len && !strncasecmp(name, buf, len)) + return i; + } + + return HGPK_MODE_INVALID; +} + +/* + * see if new value is within 20% of half of old value + */ +static int approx_half(int curr, int prev) +{ + int belowhalf, abovehalf; + + if (curr < 5 || prev < 5) + return 0; + + belowhalf = (prev * 8) / 20; + abovehalf = (prev * 12) / 20; + + return belowhalf < curr && curr <= abovehalf; +} + +/* + * Throw out oddly large delta packets, and any that immediately follow whose + * values are each approximately half of the previous. It seems that the ALPS + * firmware emits errant packets, and they get averaged out slowly. + */ +static int hgpk_discard_decay_hack(struct psmouse *psmouse, int x, int y) +{ + struct hgpk_data *priv = psmouse->private; + int avx, avy; + bool do_recal = false; + + avx = abs(x); + avy = abs(y); + + /* discard if too big, or half that but > 4 times the prev delta */ + if (avx > recalib_delta || + (avx > recalib_delta / 2 && ((avx / 4) > priv->xlast))) { + psmouse_warn(psmouse, "detected %dpx jump in x\n", x); + priv->xbigj = avx; + } else if (approx_half(avx, priv->xbigj)) { + psmouse_warn(psmouse, "detected secondary %dpx jump in x\n", x); + priv->xbigj = avx; + priv->xsaw_secondary++; + } else { + if (priv->xbigj && priv->xsaw_secondary > 1) + do_recal = true; + priv->xbigj = 0; + priv->xsaw_secondary = 0; + } + + if (avy > recalib_delta || + (avy > recalib_delta / 2 && ((avy / 4) > priv->ylast))) { + psmouse_warn(psmouse, "detected %dpx jump in y\n", y); + priv->ybigj = avy; + } else if (approx_half(avy, priv->ybigj)) { + psmouse_warn(psmouse, "detected secondary %dpx jump in y\n", y); + priv->ybigj = avy; + priv->ysaw_secondary++; + } else { + if (priv->ybigj && priv->ysaw_secondary > 1) + do_recal = true; + priv->ybigj = 0; + priv->ysaw_secondary = 0; + } + + priv->xlast = avx; + priv->ylast = avy; + + if (do_recal && jumpy_delay) { + psmouse_warn(psmouse, "scheduling recalibration\n"); + psmouse_queue_work(psmouse, &priv->recalib_wq, + msecs_to_jiffies(jumpy_delay)); + } + + return priv->xbigj || priv->ybigj; +} + +static void hgpk_reset_spew_detection(struct hgpk_data *priv) +{ + priv->spew_count = 0; + priv->dupe_count = 0; + priv->x_tally = 0; + priv->y_tally = 0; + priv->spew_flag = NO_SPEW; +} + +static void hgpk_reset_hack_state(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + + priv->abs_x = priv->abs_y = -1; + priv->xlast = priv->ylast = ILLEGAL_XY; + priv->xbigj = priv->ybigj = 0; + priv->xsaw_secondary = priv->ysaw_secondary = 0; + hgpk_reset_spew_detection(priv); +} + +/* + * We have no idea why this particular hardware bug occurs. The touchpad + * will randomly start spewing packets without anything touching the + * pad. This wouldn't necessarily be bad, but it's indicative of a + * severely miscalibrated pad; attempting to use the touchpad while it's + * spewing means the cursor will jump all over the place, and act "drunk". + * + * The packets that are spewed tend to all have deltas between -2 and 2, and + * the cursor will move around without really going very far. It will + * tend to end up in the same location; if we tally up the changes over + * 100 packets, we end up w/ a final delta of close to 0. This happens + * pretty regularly when the touchpad is spewing, and is pretty hard to + * manually trigger (at least for *my* fingers). So, it makes a perfect + * scheme for detecting spews. + */ +static void hgpk_spewing_hack(struct psmouse *psmouse, + int l, int r, int x, int y) +{ + struct hgpk_data *priv = psmouse->private; + + /* ignore button press packets; many in a row could trigger + * a false-positive! */ + if (l || r) + return; + + /* don't track spew if the workaround feature has been turned off */ + if (!spew_delay) + return; + + if (abs(x) > 3 || abs(y) > 3) { + /* no spew, or spew ended */ + hgpk_reset_spew_detection(priv); + return; + } + + /* Keep a tally of the overall delta to the cursor position caused by + * the spew */ + priv->x_tally += x; + priv->y_tally += y; + + switch (priv->spew_flag) { + case NO_SPEW: + /* we're not spewing, but this packet might be the start */ + priv->spew_flag = MAYBE_SPEWING; + + /* fall-through */ + + case MAYBE_SPEWING: + priv->spew_count++; + + if (priv->spew_count < SPEW_WATCH_COUNT) + break; + + /* excessive spew detected, request recalibration */ + priv->spew_flag = SPEW_DETECTED; + + /* fall-through */ + + case SPEW_DETECTED: + /* only recalibrate when the overall delta to the cursor + * is really small. if the spew is causing significant cursor + * movement, it is probably a case of the user moving the + * cursor very slowly across the screen. */ + if (abs(priv->x_tally) < 3 && abs(priv->y_tally) < 3) { + psmouse_warn(psmouse, "packet spew detected (%d,%d)\n", + priv->x_tally, priv->y_tally); + priv->spew_flag = RECALIBRATING; + psmouse_queue_work(psmouse, &priv->recalib_wq, + msecs_to_jiffies(spew_delay)); + } + + break; + case RECALIBRATING: + /* we already detected a spew and requested a recalibration, + * just wait for the queue to kick into action. */ + break; + } +} + +/* + * HGPK Mouse Mode format (standard mouse format, sans middle button) + * + * byte 0: y-over x-over y-neg x-neg 1 0 swr swl + * byte 1: x7 x6 x5 x4 x3 x2 x1 x0 + * byte 2: y7 y6 y5 y4 y3 y2 y1 y0 + * + * swr/swl are the left/right buttons. + * x-neg/y-neg are the x and y delta negative bits + * x-over/y-over are the x and y overflow bits + * + * --- + * + * HGPK Advanced Mode - single-mode format + * + * byte 0(PT): 1 1 0 0 1 1 1 1 + * byte 0(GS): 1 1 1 1 1 1 1 1 + * byte 1: 0 x6 x5 x4 x3 x2 x1 x0 + * byte 2(PT): 0 0 x9 x8 x7 ? pt-dsw 0 + * byte 2(GS): 0 x10 x9 x8 x7 ? gs-dsw pt-dsw + * byte 3: 0 y9 y8 y7 1 0 swr swl + * byte 4: 0 y6 y5 y4 y3 y2 y1 y0 + * byte 5: 0 z6 z5 z4 z3 z2 z1 z0 + * + * ?'s are not defined in the protocol spec, may vary between models. + * + * swr/swl are the left/right buttons. + * + * pt-dsw/gs-dsw indicate that the pt/gs sensor is detecting a + * pen/finger + */ +static bool hgpk_is_byte_valid(struct psmouse *psmouse, unsigned char *packet) +{ + struct hgpk_data *priv = psmouse->private; + int pktcnt = psmouse->pktcnt; + bool valid; + + switch (priv->mode) { + case HGPK_MODE_MOUSE: + valid = (packet[0] & 0x0C) == 0x08; + break; + + case HGPK_MODE_GLIDESENSOR: + valid = pktcnt == 1 ? + packet[0] == HGPK_GS : !(packet[pktcnt - 1] & 0x80); + break; + + case HGPK_MODE_PENTABLET: + valid = pktcnt == 1 ? + packet[0] == HGPK_PT : !(packet[pktcnt - 1] & 0x80); + break; + + default: + valid = false; + break; + } + + if (!valid) + psmouse_dbg(psmouse, + "bad data, mode %d (%d) %*ph\n", + priv->mode, pktcnt, 6, psmouse->packet); + + return valid; +} + +static void hgpk_process_advanced_packet(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + struct input_dev *idev = psmouse->dev; + unsigned char *packet = psmouse->packet; + int down = !!(packet[2] & 2); + int left = !!(packet[3] & 1); + int right = !!(packet[3] & 2); + int x = packet[1] | ((packet[2] & 0x78) << 4); + int y = packet[4] | ((packet[3] & 0x70) << 3); + + if (priv->mode == HGPK_MODE_GLIDESENSOR) { + int pt_down = !!(packet[2] & 1); + int finger_down = !!(packet[2] & 2); + int z = packet[5]; + + input_report_abs(idev, ABS_PRESSURE, z); + if (tpdebug) + psmouse_dbg(psmouse, "pd=%d fd=%d z=%d", + pt_down, finger_down, z); + } else { + /* + * PenTablet mode does not report pressure, so we don't + * report it here + */ + if (tpdebug) + psmouse_dbg(psmouse, "pd=%d ", down); + } + + if (tpdebug) + psmouse_dbg(psmouse, "l=%d r=%d x=%d y=%d\n", + left, right, x, y); + + input_report_key(idev, BTN_TOUCH, down); + input_report_key(idev, BTN_LEFT, left); + input_report_key(idev, BTN_RIGHT, right); + + /* + * If this packet says that the finger was removed, reset our position + * tracking so that we don't erroneously detect a jump on next press. + */ + if (!down) { + hgpk_reset_hack_state(psmouse); + goto done; + } + + /* + * Weed out duplicate packets (we get quite a few, and they mess up + * our jump detection) + */ + if (x == priv->abs_x && y == priv->abs_y) { + if (++priv->dupe_count > SPEW_WATCH_COUNT) { + if (tpdebug) + psmouse_dbg(psmouse, "hard spew detected\n"); + priv->spew_flag = RECALIBRATING; + psmouse_queue_work(psmouse, &priv->recalib_wq, + msecs_to_jiffies(spew_delay)); + } + goto done; + } + + /* not a duplicate, continue with position reporting */ + priv->dupe_count = 0; + + /* Don't apply hacks in PT mode, it seems reliable */ + if (priv->mode != HGPK_MODE_PENTABLET && priv->abs_x != -1) { + int x_diff = priv->abs_x - x; + int y_diff = priv->abs_y - y; + if (hgpk_discard_decay_hack(psmouse, x_diff, y_diff)) { + if (tpdebug) + psmouse_dbg(psmouse, "discarding\n"); + goto done; + } + hgpk_spewing_hack(psmouse, left, right, x_diff, y_diff); + } + + input_report_abs(idev, ABS_X, x); + input_report_abs(idev, ABS_Y, y); + priv->abs_x = x; + priv->abs_y = y; + +done: + input_sync(idev); +} + +static void hgpk_process_simple_packet(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + unsigned char *packet = psmouse->packet; + int left = packet[0] & 1; + int right = (packet[0] >> 1) & 1; + int x = packet[1] - ((packet[0] << 4) & 0x100); + int y = ((packet[0] << 3) & 0x100) - packet[2]; + + if (packet[0] & 0xc0) + psmouse_dbg(psmouse, + "overflow -- 0x%02x 0x%02x 0x%02x\n", + packet[0], packet[1], packet[2]); + + if (hgpk_discard_decay_hack(psmouse, x, y)) { + if (tpdebug) + psmouse_dbg(psmouse, "discarding\n"); + return; + } + + hgpk_spewing_hack(psmouse, left, right, x, y); + + if (tpdebug) + psmouse_dbg(psmouse, "l=%d r=%d x=%d y=%d\n", + left, right, x, y); + + input_report_key(dev, BTN_LEFT, left); + input_report_key(dev, BTN_RIGHT, right); + + input_report_rel(dev, REL_X, x); + input_report_rel(dev, REL_Y, y); + + input_sync(dev); +} + +static psmouse_ret_t hgpk_process_byte(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + + if (!hgpk_is_byte_valid(psmouse, psmouse->packet)) + return PSMOUSE_BAD_DATA; + + if (psmouse->pktcnt >= psmouse->pktsize) { + if (priv->mode == HGPK_MODE_MOUSE) + hgpk_process_simple_packet(psmouse); + else + hgpk_process_advanced_packet(psmouse); + return PSMOUSE_FULL_PACKET; + } + + if (priv->recalib_window) { + if (time_before(jiffies, priv->recalib_window)) { + /* + * ugh, got a packet inside our recalibration + * window, schedule another recalibration. + */ + psmouse_dbg(psmouse, + "packet inside calibration window, queueing another recalibration\n"); + psmouse_queue_work(psmouse, &priv->recalib_wq, + msecs_to_jiffies(post_interrupt_delay)); + } + priv->recalib_window = 0; + } + + return PSMOUSE_GOOD_DATA; +} + +static int hgpk_select_mode(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + struct hgpk_data *priv = psmouse->private; + int i; + int cmd; + + /* + * 4 disables to enable advanced mode + * then 3 0xf2 bytes as the preamble for GS/PT selection + */ + const int advanced_init[] = { + PSMOUSE_CMD_DISABLE, PSMOUSE_CMD_DISABLE, + PSMOUSE_CMD_DISABLE, PSMOUSE_CMD_DISABLE, + 0xf2, 0xf2, 0xf2, + }; + + switch (priv->mode) { + case HGPK_MODE_MOUSE: + psmouse->pktsize = 3; + break; + + case HGPK_MODE_GLIDESENSOR: + case HGPK_MODE_PENTABLET: + psmouse->pktsize = 6; + + /* Switch to 'Advanced mode.', four disables in a row. */ + for (i = 0; i < ARRAY_SIZE(advanced_init); i++) + if (ps2_command(ps2dev, NULL, advanced_init[i])) + return -EIO; + + /* select between GlideSensor (mouse) or PenTablet */ + cmd = priv->mode == HGPK_MODE_GLIDESENSOR ? + PSMOUSE_CMD_SETSCALE11 : PSMOUSE_CMD_SETSCALE21; + + if (ps2_command(ps2dev, NULL, cmd)) + return -EIO; + break; + + default: + return -EINVAL; + } + + return 0; +} + +static void hgpk_setup_input_device(struct input_dev *input, + struct input_dev *old_input, + enum hgpk_mode mode) +{ + if (old_input) { + input->name = old_input->name; + input->phys = old_input->phys; + input->id = old_input->id; + input->dev.parent = old_input->dev.parent; + } + + memset(input->evbit, 0, sizeof(input->evbit)); + memset(input->relbit, 0, sizeof(input->relbit)); + memset(input->keybit, 0, sizeof(input->keybit)); + + /* All modes report left and right buttons */ + __set_bit(EV_KEY, input->evbit); + __set_bit(BTN_LEFT, input->keybit); + __set_bit(BTN_RIGHT, input->keybit); + + switch (mode) { + case HGPK_MODE_MOUSE: + __set_bit(EV_REL, input->evbit); + __set_bit(REL_X, input->relbit); + __set_bit(REL_Y, input->relbit); + break; + + case HGPK_MODE_GLIDESENSOR: + __set_bit(BTN_TOUCH, input->keybit); + __set_bit(BTN_TOOL_FINGER, input->keybit); + + __set_bit(EV_ABS, input->evbit); + + /* GlideSensor has pressure sensor, PenTablet does not */ + input_set_abs_params(input, ABS_PRESSURE, 0, 15, 0, 0); + + /* From device specs */ + input_set_abs_params(input, ABS_X, 0, 399, 0, 0); + input_set_abs_params(input, ABS_Y, 0, 290, 0, 0); + + /* Calculated by hand based on usable size (52mm x 38mm) */ + input_abs_set_res(input, ABS_X, 8); + input_abs_set_res(input, ABS_Y, 8); + break; + + case HGPK_MODE_PENTABLET: + __set_bit(BTN_TOUCH, input->keybit); + __set_bit(BTN_TOOL_FINGER, input->keybit); + + __set_bit(EV_ABS, input->evbit); + + /* From device specs */ + input_set_abs_params(input, ABS_X, 0, 999, 0, 0); + input_set_abs_params(input, ABS_Y, 5, 239, 0, 0); + + /* Calculated by hand based on usable size (156mm x 38mm) */ + input_abs_set_res(input, ABS_X, 6); + input_abs_set_res(input, ABS_Y, 8); + break; + + default: + BUG(); + } +} + +static int hgpk_reset_device(struct psmouse *psmouse, bool recalibrate) +{ + int err; + + psmouse_reset(psmouse); + + if (recalibrate) { + struct ps2dev *ps2dev = &psmouse->ps2dev; + + /* send the recalibrate request */ + if (ps2_command(ps2dev, NULL, 0xf5) || + ps2_command(ps2dev, NULL, 0xf5) || + ps2_command(ps2dev, NULL, 0xe6) || + ps2_command(ps2dev, NULL, 0xf5)) { + return -1; + } + + /* according to ALPS, 150mS is required for recalibration */ + msleep(150); + } + + err = hgpk_select_mode(psmouse); + if (err) { + psmouse_err(psmouse, "failed to select mode\n"); + return err; + } + + hgpk_reset_hack_state(psmouse); + + return 0; +} + +static int hgpk_force_recalibrate(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + int err; + + /* C-series touchpads added the recalibrate command */ + if (psmouse->model < HGPK_MODEL_C) + return 0; + + if (!autorecal) { + psmouse_dbg(psmouse, "recalibration disabled, ignoring\n"); + return 0; + } + + psmouse_dbg(psmouse, "recalibrating touchpad..\n"); + + /* we don't want to race with the irq handler, nor with resyncs */ + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + /* start by resetting the device */ + err = hgpk_reset_device(psmouse, true); + if (err) + return err; + + /* + * XXX: If a finger is down during this delay, recalibration will + * detect capacitance incorrectly. This is a hardware bug, and + * we don't have a good way to deal with it. The 2s window stuff + * (below) is our best option for now. + */ + if (psmouse_activate(psmouse)) + return -1; + + if (tpdebug) + psmouse_dbg(psmouse, "touchpad reactivated\n"); + + /* + * If we get packets right away after recalibrating, it's likely + * that a finger was on the touchpad. If so, it's probably + * miscalibrated, so we optionally schedule another. + */ + if (recal_guard_time) + priv->recalib_window = jiffies + + msecs_to_jiffies(recal_guard_time); + + return 0; +} + +/* + * This puts the touchpad in a power saving mode; according to ALPS, current + * consumption goes down to 50uA after running this. To turn power back on, + * we drive MS-DAT low. Measuring with a 1mA resolution ammeter says that + * the current on the SUS_3.3V rail drops from 3mA or 4mA to 0 when we do this. + * + * We have no formal spec that details this operation -- the low-power + * sequence came from a long-lost email trail. + */ +static int hgpk_toggle_powersave(struct psmouse *psmouse, int enable) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + int timeo; + int err; + + /* Added on D-series touchpads */ + if (psmouse->model < HGPK_MODEL_D) + return 0; + + if (enable) { + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + /* + * Sending a byte will drive MS-DAT low; this will wake up + * the controller. Once we get an ACK back from it, it + * means we can continue with the touchpad re-init. ALPS + * tells us that 1s should be long enough, so set that as + * the upper bound. (in practice, it takes about 3 loops.) + */ + for (timeo = 20; timeo > 0; timeo--) { + if (!ps2_sendbyte(&psmouse->ps2dev, + PSMOUSE_CMD_DISABLE, 20)) + break; + msleep(25); + } + + err = hgpk_reset_device(psmouse, false); + if (err) { + psmouse_err(psmouse, "Failed to reset device!\n"); + return err; + } + + /* should be all set, enable the touchpad */ + psmouse_activate(psmouse); + psmouse_dbg(psmouse, "Touchpad powered up.\n"); + } else { + psmouse_dbg(psmouse, "Powering off touchpad.\n"); + + if (ps2_command(ps2dev, NULL, 0xec) || + ps2_command(ps2dev, NULL, 0xec) || + ps2_command(ps2dev, NULL, 0xea)) { + return -1; + } + + psmouse_set_state(psmouse, PSMOUSE_IGNORE); + + /* probably won't see an ACK, the touchpad will be off */ + ps2_sendbyte(&psmouse->ps2dev, 0xec, 20); + } + + return 0; +} + +static int hgpk_poll(struct psmouse *psmouse) +{ + /* We can't poll, so always return failure. */ + return -1; +} + +static int hgpk_reconnect(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + + /* + * During suspend/resume the ps2 rails remain powered. We don't want + * to do a reset because it's flush data out of buffers; however, + * earlier prototypes (B1) had some brokenness that required a reset. + */ + if (olpc_board_at_least(olpc_board(0xb2))) + if (psmouse->ps2dev.serio->dev.power.power_state.event != + PM_EVENT_ON) + return 0; + + priv->powered = 1; + return hgpk_reset_device(psmouse, false); +} + +static ssize_t hgpk_show_powered(struct psmouse *psmouse, void *data, char *buf) +{ + struct hgpk_data *priv = psmouse->private; + + return sprintf(buf, "%d\n", priv->powered); +} + +static ssize_t hgpk_set_powered(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + struct hgpk_data *priv = psmouse->private; + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (value != priv->powered) { + /* + * hgpk_toggle_power will deal w/ state so + * we're not racing w/ irq + */ + err = hgpk_toggle_powersave(psmouse, value); + if (!err) + priv->powered = value; + } + + return err ? err : count; +} + +__PSMOUSE_DEFINE_ATTR(powered, S_IWUSR | S_IRUGO, NULL, + hgpk_show_powered, hgpk_set_powered, false); + +static ssize_t attr_show_mode(struct psmouse *psmouse, void *data, char *buf) +{ + struct hgpk_data *priv = psmouse->private; + + return sprintf(buf, "%s\n", hgpk_mode_names[priv->mode]); +} + +static ssize_t attr_set_mode(struct psmouse *psmouse, void *data, + const char *buf, size_t len) +{ + struct hgpk_data *priv = psmouse->private; + enum hgpk_mode old_mode = priv->mode; + enum hgpk_mode new_mode = hgpk_mode_from_name(buf, len); + struct input_dev *old_dev = psmouse->dev; + struct input_dev *new_dev; + int err; + + if (new_mode == HGPK_MODE_INVALID) + return -EINVAL; + + if (old_mode == new_mode) + return len; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + /* Switch device into the new mode */ + priv->mode = new_mode; + err = hgpk_reset_device(psmouse, false); + if (err) + goto err_try_restore; + + hgpk_setup_input_device(new_dev, old_dev, new_mode); + + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + + err = input_register_device(new_dev); + if (err) + goto err_try_restore; + + psmouse->dev = new_dev; + input_unregister_device(old_dev); + + return len; + +err_try_restore: + input_free_device(new_dev); + priv->mode = old_mode; + hgpk_reset_device(psmouse, false); + + return err; +} + +PSMOUSE_DEFINE_ATTR(hgpk_mode, S_IWUSR | S_IRUGO, NULL, + attr_show_mode, attr_set_mode); + +static ssize_t hgpk_trigger_recal_show(struct psmouse *psmouse, + void *data, char *buf) +{ + return -EINVAL; +} + +static ssize_t hgpk_trigger_recal(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + struct hgpk_data *priv = psmouse->private; + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value != 1) + return -EINVAL; + + /* + * We queue work instead of doing recalibration right here + * to avoid adding locking to to hgpk_force_recalibrate() + * since workqueue provides serialization. + */ + psmouse_queue_work(psmouse, &priv->recalib_wq, 0); + return count; +} + +__PSMOUSE_DEFINE_ATTR(recalibrate, S_IWUSR | S_IRUGO, NULL, + hgpk_trigger_recal_show, hgpk_trigger_recal, false); + +static void hgpk_disconnect(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + + device_remove_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_powered.dattr); + device_remove_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_hgpk_mode.dattr); + + if (psmouse->model >= HGPK_MODEL_C) + device_remove_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_recalibrate.dattr); + + psmouse_reset(psmouse); + kfree(priv); +} + +static void hgpk_recalib_work(struct work_struct *work) +{ + struct delayed_work *w = to_delayed_work(work); + struct hgpk_data *priv = container_of(w, struct hgpk_data, recalib_wq); + struct psmouse *psmouse = priv->psmouse; + + if (hgpk_force_recalibrate(psmouse)) + psmouse_err(psmouse, "recalibration failed!\n"); +} + +static int hgpk_register(struct psmouse *psmouse) +{ + struct hgpk_data *priv = psmouse->private; + int err; + + /* register handlers */ + psmouse->protocol_handler = hgpk_process_byte; + psmouse->poll = hgpk_poll; + psmouse->disconnect = hgpk_disconnect; + psmouse->reconnect = hgpk_reconnect; + + /* Disable the idle resync. */ + psmouse->resync_time = 0; + /* Reset after a lot of bad bytes. */ + psmouse->resetafter = 1024; + + hgpk_setup_input_device(psmouse->dev, NULL, priv->mode); + + err = device_create_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_powered.dattr); + if (err) { + psmouse_err(psmouse, "Failed creating 'powered' sysfs node\n"); + return err; + } + + err = device_create_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_hgpk_mode.dattr); + if (err) { + psmouse_err(psmouse, + "Failed creating 'hgpk_mode' sysfs node\n"); + goto err_remove_powered; + } + + /* C-series touchpads added the recalibrate command */ + if (psmouse->model >= HGPK_MODEL_C) { + err = device_create_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_recalibrate.dattr); + if (err) { + psmouse_err(psmouse, + "Failed creating 'recalibrate' sysfs node\n"); + goto err_remove_mode; + } + } + + return 0; + +err_remove_mode: + device_remove_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_hgpk_mode.dattr); +err_remove_powered: + device_remove_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_powered.dattr); + return err; +} + +int hgpk_init(struct psmouse *psmouse) +{ + struct hgpk_data *priv; + int err; + + priv = kzalloc(sizeof(struct hgpk_data), GFP_KERNEL); + if (!priv) { + err = -ENOMEM; + goto alloc_fail; + } + + psmouse->private = priv; + + priv->psmouse = psmouse; + priv->powered = true; + priv->mode = hgpk_default_mode; + INIT_DELAYED_WORK(&priv->recalib_wq, hgpk_recalib_work); + + err = hgpk_reset_device(psmouse, false); + if (err) + goto init_fail; + + err = hgpk_register(psmouse); + if (err) + goto init_fail; + + return 0; + +init_fail: + kfree(priv); +alloc_fail: + return err; +} + +static enum hgpk_model_t hgpk_get_model(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[3]; + + /* E7, E7, E7, E9 gets us a 3 byte identifier */ + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE21) || + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) { + return -EIO; + } + + psmouse_dbg(psmouse, "ID: %*ph\n", 3, param); + + /* HGPK signature: 0x67, 0x00, 0x */ + if (param[0] != 0x67 || param[1] != 0x00) + return -ENODEV; + + psmouse_info(psmouse, "OLPC touchpad revision 0x%x\n", param[2]); + + return param[2]; +} + +int hgpk_detect(struct psmouse *psmouse, bool set_properties) +{ + int version; + + version = hgpk_get_model(psmouse); + if (version < 0) + return version; + + if (set_properties) { + psmouse->vendor = "ALPS"; + psmouse->name = "HGPK"; + psmouse->model = version; + } + + return 0; +} + +void hgpk_module_init(void) +{ + hgpk_default_mode = hgpk_mode_from_name(hgpk_mode_name, + strlen(hgpk_mode_name)); + if (hgpk_default_mode == HGPK_MODE_INVALID) { + hgpk_default_mode = HGPK_MODE_MOUSE; + strlcpy(hgpk_mode_name, hgpk_mode_names[HGPK_MODE_MOUSE], + sizeof(hgpk_mode_name)); + } +} diff --git a/drivers/input/mouse/hgpk.h b/drivers/input/mouse/hgpk.h new file mode 100644 index 00000000..dd686771 --- /dev/null +++ b/drivers/input/mouse/hgpk.h @@ -0,0 +1,67 @@ +/* + * OLPC HGPK (XO-1) touchpad PS/2 mouse driver + */ + +#ifndef _HGPK_H +#define _HGPK_H + +#define HGPK_GS 0xff /* The GlideSensor */ +#define HGPK_PT 0xcf /* The PenTablet */ + +enum hgpk_model_t { + HGPK_MODEL_PREA = 0x0a, /* pre-B1s */ + HGPK_MODEL_A = 0x14, /* found on B1s, PT disabled in hardware */ + HGPK_MODEL_B = 0x28, /* B2s, has capacitance issues */ + HGPK_MODEL_C = 0x3c, + HGPK_MODEL_D = 0x50, /* C1, mass production */ +}; + +enum hgpk_spew_flag { + NO_SPEW, + MAYBE_SPEWING, + SPEW_DETECTED, + RECALIBRATING, +}; + +#define SPEW_WATCH_COUNT 42 /* at 12ms/packet, this is 1/2 second */ + +enum hgpk_mode { + HGPK_MODE_MOUSE, + HGPK_MODE_GLIDESENSOR, + HGPK_MODE_PENTABLET, + HGPK_MODE_INVALID +}; + +struct hgpk_data { + struct psmouse *psmouse; + enum hgpk_mode mode; + bool powered; + enum hgpk_spew_flag spew_flag; + int spew_count, x_tally, y_tally; /* spew detection */ + unsigned long recalib_window; + struct delayed_work recalib_wq; + int abs_x, abs_y; + int dupe_count; + int xbigj, ybigj, xlast, ylast; /* jumpiness detection */ + int xsaw_secondary, ysaw_secondary; /* jumpiness detection */ +}; + +#ifdef CONFIG_MOUSE_PS2_OLPC +void hgpk_module_init(void); +int hgpk_detect(struct psmouse *psmouse, bool set_properties); +int hgpk_init(struct psmouse *psmouse); +#else +static inline void hgpk_module_init(void) +{ +} +static inline int hgpk_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENODEV; +} +static inline int hgpk_init(struct psmouse *psmouse) +{ + return -ENODEV; +} +#endif + +#endif diff --git a/drivers/input/mouse/inport.c b/drivers/input/mouse/inport.c new file mode 100644 index 00000000..3827a223 --- /dev/null +++ b/drivers/input/mouse/inport.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + * + * Based on the work of: + * Teemu Rantanen Derrick Cole + * Peter Cervasio Christoph Niemann + * Philip Blundell Russell King + * Bob Harris + */ + +/* + * Inport (ATI XL and Microsoft) busmouse driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include + +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Inport (ATI XL and Microsoft) busmouse driver"); +MODULE_LICENSE("GPL"); + +#define INPORT_BASE 0x23c +#define INPORT_EXTENT 4 + +#define INPORT_CONTROL_PORT INPORT_BASE + 0 +#define INPORT_DATA_PORT INPORT_BASE + 1 +#define INPORT_SIGNATURE_PORT INPORT_BASE + 2 + +#define INPORT_REG_BTNS 0x00 +#define INPORT_REG_X 0x01 +#define INPORT_REG_Y 0x02 +#define INPORT_REG_MODE 0x07 +#define INPORT_RESET 0x80 + +#ifdef CONFIG_MOUSE_ATIXL +#define INPORT_NAME "ATI XL Mouse" +#define INPORT_VENDOR 0x0002 +#define INPORT_SPEED_30HZ 0x01 +#define INPORT_SPEED_50HZ 0x02 +#define INPORT_SPEED_100HZ 0x03 +#define INPORT_SPEED_200HZ 0x04 +#define INPORT_MODE_BASE INPORT_SPEED_100HZ +#define INPORT_MODE_IRQ 0x08 +#else +#define INPORT_NAME "Microsoft InPort Mouse" +#define INPORT_VENDOR 0x0001 +#define INPORT_MODE_BASE 0x10 +#define INPORT_MODE_IRQ 0x01 +#endif +#define INPORT_MODE_HOLD 0x20 + +#define INPORT_IRQ 5 + +static int inport_irq = INPORT_IRQ; +module_param_named(irq, inport_irq, uint, 0); +MODULE_PARM_DESC(irq, "IRQ number (5=default)"); + +static struct input_dev *inport_dev; + +static irqreturn_t inport_interrupt(int irq, void *dev_id) +{ + unsigned char buttons; + + outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); + outb(INPORT_MODE_HOLD | INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); + + outb(INPORT_REG_X, INPORT_CONTROL_PORT); + input_report_rel(inport_dev, REL_X, inb(INPORT_DATA_PORT)); + + outb(INPORT_REG_Y, INPORT_CONTROL_PORT); + input_report_rel(inport_dev, REL_Y, inb(INPORT_DATA_PORT)); + + outb(INPORT_REG_BTNS, INPORT_CONTROL_PORT); + buttons = inb(INPORT_DATA_PORT); + + input_report_key(inport_dev, BTN_MIDDLE, buttons & 1); + input_report_key(inport_dev, BTN_LEFT, buttons & 2); + input_report_key(inport_dev, BTN_RIGHT, buttons & 4); + + outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); + outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); + + input_sync(inport_dev); + return IRQ_HANDLED; +} + +static int inport_open(struct input_dev *dev) +{ + if (request_irq(inport_irq, inport_interrupt, 0, "inport", NULL)) + return -EBUSY; + outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); + outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); + + return 0; +} + +static void inport_close(struct input_dev *dev) +{ + outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); + outb(INPORT_MODE_BASE, INPORT_DATA_PORT); + free_irq(inport_irq, NULL); +} + +static int __init inport_init(void) +{ + unsigned char a, b, c; + int err; + + if (!request_region(INPORT_BASE, INPORT_EXTENT, "inport")) { + printk(KERN_ERR "inport.c: Can't allocate ports at %#x\n", INPORT_BASE); + return -EBUSY; + } + + a = inb(INPORT_SIGNATURE_PORT); + b = inb(INPORT_SIGNATURE_PORT); + c = inb(INPORT_SIGNATURE_PORT); + if (a == b || a != c) { + printk(KERN_INFO "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE); + err = -ENODEV; + goto err_release_region; + } + + inport_dev = input_allocate_device(); + if (!inport_dev) { + printk(KERN_ERR "inport.c: Not enough memory for input device\n"); + err = -ENOMEM; + goto err_release_region; + } + + inport_dev->name = INPORT_NAME; + inport_dev->phys = "isa023c/input0"; + inport_dev->id.bustype = BUS_ISA; + inport_dev->id.vendor = INPORT_VENDOR; + inport_dev->id.product = 0x0001; + inport_dev->id.version = 0x0100; + + inport_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + inport_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + inport_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + + inport_dev->open = inport_open; + inport_dev->close = inport_close; + + outb(INPORT_RESET, INPORT_CONTROL_PORT); + outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); + outb(INPORT_MODE_BASE, INPORT_DATA_PORT); + + err = input_register_device(inport_dev); + if (err) + goto err_free_dev; + + return 0; + + err_free_dev: + input_free_device(inport_dev); + err_release_region: + release_region(INPORT_BASE, INPORT_EXTENT); + + return err; +} + +static void __exit inport_exit(void) +{ + input_unregister_device(inport_dev); + release_region(INPORT_BASE, INPORT_EXTENT); +} + +module_init(inport_init); +module_exit(inport_exit); diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c new file mode 100644 index 00000000..2c4db636 --- /dev/null +++ b/drivers/input/mouse/lifebook.c @@ -0,0 +1,352 @@ +/* + * Fujitsu B-series Lifebook PS/2 TouchScreen driver + * + * Copyright (c) 2005 Vojtech Pavlik + * Copyright (c) 2005 Kenan Esau + * + * TouchScreen detection, absolute mode setting and packet layout is taken from + * Harald Hoyer's description of the device. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include + +#include "psmouse.h" +#include "lifebook.h" + +struct lifebook_data { + struct input_dev *dev2; /* Relative device */ + char phys[32]; +}; + +static bool lifebook_present; + +static const char *desired_serio_phys; + +static int lifebook_limit_serio3(const struct dmi_system_id *d) +{ + desired_serio_phys = "isa0060/serio3"; + return 1; +} + +static bool lifebook_use_6byte_proto; + +static int lifebook_set_6byte_proto(const struct dmi_system_id *d) +{ + lifebook_use_6byte_proto = true; + return 1; +} + +static const struct dmi_system_id __initconst lifebook_dmi_table[] = { + { + /* FLORA-ie 55mi */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "FLORA-ie 55mi"), + }, + }, + { + /* LifeBook B */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "Lifebook B Series"), + }, + }, + { + /* LifeBook B */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B Series"), + }, + }, + { + /* Lifebook B */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK B Series"), + }, + }, + { + /* Lifebook B-2130 */ + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "ZEPHYR"), + }, + }, + { + /* Lifebook B213x/B2150 */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B2131/B2133/B2150"), + }, + }, + { + /* Zephyr */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "ZEPHYR"), + }, + }, + { + /* Panasonic CF-18 */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"), + }, + .callback = lifebook_limit_serio3, + }, + { + /* Panasonic CF-28 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), + DMI_MATCH(DMI_PRODUCT_NAME, "CF-28"), + }, + .callback = lifebook_set_6byte_proto, + }, + { + /* Panasonic CF-29 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), + DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), + }, + .callback = lifebook_set_6byte_proto, + }, + { + /* Panasonic CF-72 */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "CF-72"), + }, + .callback = lifebook_set_6byte_proto, + }, + { + /* Lifebook B142 */ + .matches = { + DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B142"), + }, + }, + { } +}; + +void __init lifebook_module_init(void) +{ + lifebook_present = dmi_check_system(lifebook_dmi_table); +} + +static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse) +{ + struct lifebook_data *priv = psmouse->private; + struct input_dev *dev1 = psmouse->dev; + struct input_dev *dev2 = priv ? priv->dev2 : NULL; + unsigned char *packet = psmouse->packet; + bool relative_packet = packet[0] & 0x08; + + if (relative_packet || !lifebook_use_6byte_proto) { + if (psmouse->pktcnt != 3) + return PSMOUSE_GOOD_DATA; + } else { + switch (psmouse->pktcnt) { + case 1: + return (packet[0] & 0xf8) == 0x00 ? + PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA; + case 2: + return PSMOUSE_GOOD_DATA; + case 3: + return ((packet[2] & 0x30) << 2) == (packet[2] & 0xc0) ? + PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA; + case 4: + return (packet[3] & 0xf8) == 0xc0 ? + PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA; + case 5: + return (packet[4] & 0xc0) == (packet[2] & 0xc0) ? + PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA; + case 6: + if (((packet[5] & 0x30) << 2) != (packet[5] & 0xc0)) + return PSMOUSE_BAD_DATA; + if ((packet[5] & 0xc0) != (packet[1] & 0xc0)) + return PSMOUSE_BAD_DATA; + break; /* report data */ + } + } + + if (relative_packet) { + if (!dev2) + psmouse_warn(psmouse, + "got relative packet but no relative device set up\n"); + } else { + if (lifebook_use_6byte_proto) { + input_report_abs(dev1, ABS_X, + ((packet[1] & 0x3f) << 6) | (packet[2] & 0x3f)); + input_report_abs(dev1, ABS_Y, + 4096 - (((packet[4] & 0x3f) << 6) | (packet[5] & 0x3f))); + } else { + input_report_abs(dev1, ABS_X, + (packet[1] | ((packet[0] & 0x30) << 4))); + input_report_abs(dev1, ABS_Y, + 1024 - (packet[2] | ((packet[0] & 0xC0) << 2))); + } + input_report_key(dev1, BTN_TOUCH, packet[0] & 0x04); + input_sync(dev1); + } + + if (dev2) { + if (relative_packet) { + input_report_rel(dev2, REL_X, + ((packet[0] & 0x10) ? packet[1] - 256 : packet[1])); + input_report_rel(dev2, REL_Y, + -(int)((packet[0] & 0x20) ? packet[2] - 256 : packet[2])); + } + input_report_key(dev2, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev2, BTN_RIGHT, packet[0] & 0x02); + input_sync(dev2); + } + + return PSMOUSE_FULL_PACKET; +} + +static int lifebook_absolute_mode(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param; + + if (psmouse_reset(psmouse)) + return -1; + + /* + * Enable absolute output -- ps2_command fails always but if + * you leave this call out the touchscreen will never send + * absolute coordinates + */ + param = lifebook_use_6byte_proto ? 0x08 : 0x07; + ps2_command(ps2dev, ¶m, PSMOUSE_CMD_SETRES); + + return 0; +} + +static void lifebook_relative_mode(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param = 0x06; + + ps2_command(ps2dev, ¶m, PSMOUSE_CMD_SETRES); +} + +static void lifebook_set_resolution(struct psmouse *psmouse, unsigned int resolution) +{ + static const unsigned char params[] = { 0, 1, 2, 2, 3 }; + unsigned char p; + + if (resolution == 0 || resolution > 400) + resolution = 400; + + p = params[resolution / 100]; + ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES); + psmouse->resolution = 50 << p; +} + +static void lifebook_disconnect(struct psmouse *psmouse) +{ + struct lifebook_data *priv = psmouse->private; + + psmouse_reset(psmouse); + if (priv) { + input_unregister_device(priv->dev2); + kfree(priv); + } + psmouse->private = NULL; +} + +int lifebook_detect(struct psmouse *psmouse, bool set_properties) +{ + if (!lifebook_present) + return -1; + + if (desired_serio_phys && + strcmp(psmouse->ps2dev.serio->phys, desired_serio_phys)) + return -1; + + if (set_properties) { + psmouse->vendor = "Fujitsu"; + psmouse->name = "Lifebook TouchScreen"; + } + + return 0; +} + +static int lifebook_create_relative_device(struct psmouse *psmouse) +{ + struct input_dev *dev2; + struct lifebook_data *priv; + int error = -ENOMEM; + + priv = kzalloc(sizeof(struct lifebook_data), GFP_KERNEL); + dev2 = input_allocate_device(); + if (!priv || !dev2) + goto err_out; + + priv->dev2 = dev2; + snprintf(priv->phys, sizeof(priv->phys), + "%s/input1", psmouse->ps2dev.serio->phys); + + dev2->phys = priv->phys; + dev2->name = "PS/2 Touchpad"; + dev2->id.bustype = BUS_I8042; + dev2->id.vendor = 0x0002; + dev2->id.product = PSMOUSE_LIFEBOOK; + dev2->id.version = 0x0000; + dev2->dev.parent = &psmouse->ps2dev.serio->dev; + + dev2->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + dev2->relbit[BIT_WORD(REL_X)] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + dev2->keybit[BIT_WORD(BTN_LEFT)] = + BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); + + error = input_register_device(priv->dev2); + if (error) + goto err_out; + + psmouse->private = priv; + return 0; + + err_out: + input_free_device(dev2); + kfree(priv); + return error; +} + +int lifebook_init(struct psmouse *psmouse) +{ + struct input_dev *dev1 = psmouse->dev; + int max_coord = lifebook_use_6byte_proto ? 4096 : 1024; + + if (lifebook_absolute_mode(psmouse)) + return -1; + + dev1->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); + dev1->relbit[0] = 0; + dev1->keybit[BIT_WORD(BTN_MOUSE)] = 0; + dev1->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(dev1, ABS_X, 0, max_coord, 0, 0); + input_set_abs_params(dev1, ABS_Y, 0, max_coord, 0, 0); + + if (!desired_serio_phys) { + if (lifebook_create_relative_device(psmouse)) { + lifebook_relative_mode(psmouse); + return -1; + } + } + + psmouse->protocol_handler = lifebook_process_byte; + psmouse->set_resolution = lifebook_set_resolution; + psmouse->disconnect = lifebook_disconnect; + psmouse->reconnect = lifebook_absolute_mode; + + psmouse->model = lifebook_use_6byte_proto ? 6 : 3; + + /* + * Use packet size = 3 even when using 6-byte protocol because + * that's what POLL will return on Lifebooks (according to spec). + */ + psmouse->pktsize = 3; + + return 0; +} + diff --git a/drivers/input/mouse/lifebook.h b/drivers/input/mouse/lifebook.h new file mode 100644 index 00000000..4c4326c6 --- /dev/null +++ b/drivers/input/mouse/lifebook.h @@ -0,0 +1,32 @@ +/* + * Fujitsu B-series Lifebook PS/2 TouchScreen driver + * + * Copyright (c) 2005 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _LIFEBOOK_H +#define _LIFEBOOK_H + +#ifdef CONFIG_MOUSE_PS2_LIFEBOOK +void lifebook_module_init(void); +int lifebook_detect(struct psmouse *psmouse, bool set_properties); +int lifebook_init(struct psmouse *psmouse); +#else +inline void lifebook_module_init(void) +{ +} +inline int lifebook_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +inline int lifebook_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} +#endif + +#endif diff --git a/drivers/input/mouse/logibm.c b/drivers/input/mouse/logibm.c new file mode 100644 index 00000000..e2413113 --- /dev/null +++ b/drivers/input/mouse/logibm.c @@ -0,0 +1,185 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + * + * Based on the work of: + * James Banks Matthew Dillon + * David Giller Nathan Laredo + * Linus Torvalds Johan Myreen + * Cliff Matthews Philip Blundell + * Russell King + */ + +/* + * Logitech Bus Mouse Driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Logitech busmouse driver"); +MODULE_LICENSE("GPL"); + +#define LOGIBM_BASE 0x23c +#define LOGIBM_EXTENT 4 + +#define LOGIBM_DATA_PORT LOGIBM_BASE + 0 +#define LOGIBM_SIGNATURE_PORT LOGIBM_BASE + 1 +#define LOGIBM_CONTROL_PORT LOGIBM_BASE + 2 +#define LOGIBM_CONFIG_PORT LOGIBM_BASE + 3 + +#define LOGIBM_ENABLE_IRQ 0x00 +#define LOGIBM_DISABLE_IRQ 0x10 +#define LOGIBM_READ_X_LOW 0x80 +#define LOGIBM_READ_X_HIGH 0xa0 +#define LOGIBM_READ_Y_LOW 0xc0 +#define LOGIBM_READ_Y_HIGH 0xe0 + +#define LOGIBM_DEFAULT_MODE 0x90 +#define LOGIBM_CONFIG_BYTE 0x91 +#define LOGIBM_SIGNATURE_BYTE 0xa5 + +#define LOGIBM_IRQ 5 + +static int logibm_irq = LOGIBM_IRQ; +module_param_named(irq, logibm_irq, uint, 0); +MODULE_PARM_DESC(irq, "IRQ number (5=default)"); + +static struct input_dev *logibm_dev; + +static irqreturn_t logibm_interrupt(int irq, void *dev_id) +{ + char dx, dy; + unsigned char buttons; + + outb(LOGIBM_READ_X_LOW, LOGIBM_CONTROL_PORT); + dx = (inb(LOGIBM_DATA_PORT) & 0xf); + outb(LOGIBM_READ_X_HIGH, LOGIBM_CONTROL_PORT); + dx |= (inb(LOGIBM_DATA_PORT) & 0xf) << 4; + outb(LOGIBM_READ_Y_LOW, LOGIBM_CONTROL_PORT); + dy = (inb(LOGIBM_DATA_PORT) & 0xf); + outb(LOGIBM_READ_Y_HIGH, LOGIBM_CONTROL_PORT); + buttons = inb(LOGIBM_DATA_PORT); + dy |= (buttons & 0xf) << 4; + buttons = ~buttons >> 5; + + input_report_rel(logibm_dev, REL_X, dx); + input_report_rel(logibm_dev, REL_Y, dy); + input_report_key(logibm_dev, BTN_RIGHT, buttons & 1); + input_report_key(logibm_dev, BTN_MIDDLE, buttons & 2); + input_report_key(logibm_dev, BTN_LEFT, buttons & 4); + input_sync(logibm_dev); + + outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); + return IRQ_HANDLED; +} + +static int logibm_open(struct input_dev *dev) +{ + if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) { + printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq); + return -EBUSY; + } + outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); + return 0; +} + +static void logibm_close(struct input_dev *dev) +{ + outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); + free_irq(logibm_irq, NULL); +} + +static int __init logibm_init(void) +{ + int err; + + if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) { + printk(KERN_ERR "logibm.c: Can't allocate ports at %#x\n", LOGIBM_BASE); + return -EBUSY; + } + + outb(LOGIBM_CONFIG_BYTE, LOGIBM_CONFIG_PORT); + outb(LOGIBM_SIGNATURE_BYTE, LOGIBM_SIGNATURE_PORT); + udelay(100); + + if (inb(LOGIBM_SIGNATURE_PORT) != LOGIBM_SIGNATURE_BYTE) { + printk(KERN_INFO "logibm.c: Didn't find Logitech busmouse at %#x\n", LOGIBM_BASE); + err = -ENODEV; + goto err_release_region; + } + + outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT); + outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); + + logibm_dev = input_allocate_device(); + if (!logibm_dev) { + printk(KERN_ERR "logibm.c: Not enough memory for input device\n"); + err = -ENOMEM; + goto err_release_region; + } + + logibm_dev->name = "Logitech bus mouse"; + logibm_dev->phys = "isa023c/input0"; + logibm_dev->id.bustype = BUS_ISA; + logibm_dev->id.vendor = 0x0003; + logibm_dev->id.product = 0x0001; + logibm_dev->id.version = 0x0100; + + logibm_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + logibm_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + logibm_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + + logibm_dev->open = logibm_open; + logibm_dev->close = logibm_close; + + err = input_register_device(logibm_dev); + if (err) + goto err_free_dev; + + return 0; + + err_free_dev: + input_free_device(logibm_dev); + err_release_region: + release_region(LOGIBM_BASE, LOGIBM_EXTENT); + + return err; +} + +static void __exit logibm_exit(void) +{ + input_unregister_device(logibm_dev); + release_region(LOGIBM_BASE, LOGIBM_EXTENT); +} + +module_init(logibm_init); +module_exit(logibm_exit); diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c new file mode 100644 index 00000000..84de2fc6 --- /dev/null +++ b/drivers/input/mouse/logips2pp.c @@ -0,0 +1,425 @@ +/* + * Logitech PS/2++ mouse driver + * + * Copyright (c) 1999-2003 Vojtech Pavlik + * Copyright (c) 2003 Eric Wong + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include "psmouse.h" +#include "logips2pp.h" + +/* Logitech mouse types */ +#define PS2PP_KIND_WHEEL 1 +#define PS2PP_KIND_MX 2 +#define PS2PP_KIND_TP3 3 +#define PS2PP_KIND_TRACKMAN 4 + +/* Logitech mouse features */ +#define PS2PP_WHEEL 0x01 +#define PS2PP_HWHEEL 0x02 +#define PS2PP_SIDE_BTN 0x04 +#define PS2PP_EXTRA_BTN 0x08 +#define PS2PP_TASK_BTN 0x10 +#define PS2PP_NAV_BTN 0x20 + +struct ps2pp_info { + u8 model; + u8 kind; + u16 features; +}; + +/* + * Process a PS2++ or PS2T++ packet. + */ + +static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + unsigned char *packet = psmouse->packet; + + if (psmouse->pktcnt < 3) + return PSMOUSE_GOOD_DATA; + +/* + * Full packet accumulated, process it + */ + + if ((packet[0] & 0x48) == 0x48 && (packet[1] & 0x02) == 0x02) { + + /* Logitech extended packet */ + switch ((packet[1] >> 4) | (packet[0] & 0x30)) { + + case 0x0d: /* Mouse extra info */ + + input_report_rel(dev, packet[2] & 0x80 ? REL_HWHEEL : REL_WHEEL, + (int) (packet[2] & 8) - (int) (packet[2] & 7)); + input_report_key(dev, BTN_SIDE, (packet[2] >> 4) & 1); + input_report_key(dev, BTN_EXTRA, (packet[2] >> 5) & 1); + + break; + + case 0x0e: /* buttons 4, 5, 6, 7, 8, 9, 10 info */ + + input_report_key(dev, BTN_SIDE, (packet[2]) & 1); + input_report_key(dev, BTN_EXTRA, (packet[2] >> 1) & 1); + input_report_key(dev, BTN_BACK, (packet[2] >> 3) & 1); + input_report_key(dev, BTN_FORWARD, (packet[2] >> 4) & 1); + input_report_key(dev, BTN_TASK, (packet[2] >> 2) & 1); + + break; + + case 0x0f: /* TouchPad extra info */ + + input_report_rel(dev, packet[2] & 0x08 ? REL_HWHEEL : REL_WHEEL, + (int) ((packet[2] >> 4) & 8) - (int) ((packet[2] >> 4) & 7)); + packet[0] = packet[2] | 0x08; + break; + + default: + psmouse_dbg(psmouse, + "Received PS2++ packet #%x, but don't know how to handle.\n", + (packet[1] >> 4) | (packet[0] & 0x30)); + break; + } + } else { + /* Standard PS/2 motion data */ + input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0); + input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0); + } + + input_report_key(dev, BTN_LEFT, packet[0] & 1); + input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1); + input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1); + + input_sync(dev); + + return PSMOUSE_FULL_PACKET; + +} + +/* + * ps2pp_cmd() sends a PS2++ command, sliced into two bit + * pieces through the SETRES command. This is needed to send extended + * commands to mice on notebooks that try to understand the PS/2 protocol + * Ugly. + */ + +static int ps2pp_cmd(struct psmouse *psmouse, unsigned char *param, unsigned char command) +{ + if (psmouse_sliced_command(psmouse, command)) + return -1; + + if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300)) + return -1; + + return 0; +} + +/* + * SmartScroll / CruiseControl for some newer Logitech mice Defaults to + * enabled if we do nothing to it. Of course I put this in because I want it + * disabled :P + * 1 - enabled (if previously disabled, also default) + * 0 - disabled + */ + +static void ps2pp_set_smartscroll(struct psmouse *psmouse, bool smartscroll) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[4]; + + ps2pp_cmd(psmouse, param, 0x32); + + param[0] = 0; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + + param[0] = smartscroll; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); +} + +static ssize_t ps2pp_attr_show_smartscroll(struct psmouse *psmouse, + void *data, char *buf) +{ + return sprintf(buf, "%d\n", psmouse->smartscroll); +} + +static ssize_t ps2pp_attr_set_smartscroll(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + ps2pp_set_smartscroll(psmouse, value); + psmouse->smartscroll = value; + return count; +} + +PSMOUSE_DEFINE_ATTR(smartscroll, S_IWUSR | S_IRUGO, NULL, + ps2pp_attr_show_smartscroll, ps2pp_attr_set_smartscroll); + +/* + * Support 800 dpi resolution _only_ if the user wants it (there are good + * reasons to not use it even if the mouse supports it, and of course there are + * also good reasons to use it, let the user decide). + */ + +static void ps2pp_set_resolution(struct psmouse *psmouse, unsigned int resolution) +{ + if (resolution > 400) { + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param = 3; + + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, ¶m, PSMOUSE_CMD_SETRES); + psmouse->resolution = 800; + } else + psmouse_set_resolution(psmouse, resolution); +} + +static void ps2pp_disconnect(struct psmouse *psmouse) +{ + device_remove_file(&psmouse->ps2dev.serio->dev, &psmouse_attr_smartscroll.dattr); +} + +static const struct ps2pp_info *get_model_info(unsigned char model) +{ + static const struct ps2pp_info ps2pp_list[] = { + { 1, 0, 0 }, /* Simple 2-button mouse */ + { 12, 0, PS2PP_SIDE_BTN}, + { 13, 0, 0 }, + { 15, PS2PP_KIND_MX, /* MX1000 */ + PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | + PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, + { 40, 0, PS2PP_SIDE_BTN }, + { 41, 0, PS2PP_SIDE_BTN }, + { 42, 0, PS2PP_SIDE_BTN }, + { 43, 0, PS2PP_SIDE_BTN }, + { 50, 0, 0 }, + { 51, 0, 0 }, + { 52, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL }, + { 53, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 56, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL }, /* Cordless MouseMan Wheel */ + { 61, PS2PP_KIND_MX, /* MX700 */ + PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | + PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, + { 66, PS2PP_KIND_MX, /* MX3100 reciver */ + PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | + PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, + { 72, PS2PP_KIND_TRACKMAN, 0 }, /* T-CH11: TrackMan Marble */ + { 73, PS2PP_KIND_TRACKMAN, PS2PP_SIDE_BTN }, /* TrackMan FX */ + { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 79, PS2PP_KIND_TRACKMAN, PS2PP_WHEEL }, /* TrackMan with wheel */ + { 80, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL }, + { 81, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 83, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 85, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 86, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 87, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 88, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 96, 0, 0 }, + { 97, PS2PP_KIND_TP3, PS2PP_WHEEL | PS2PP_HWHEEL }, + { 99, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, + { 100, PS2PP_KIND_MX, /* MX510 */ + PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | + PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, + { 111, PS2PP_KIND_MX, PS2PP_WHEEL | PS2PP_SIDE_BTN }, /* MX300 reports task button as side */ + { 112, PS2PP_KIND_MX, /* MX500 */ + PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | + PS2PP_EXTRA_BTN | PS2PP_NAV_BTN }, + { 114, PS2PP_KIND_MX, /* MX310 */ + PS2PP_WHEEL | PS2PP_SIDE_BTN | + PS2PP_TASK_BTN | PS2PP_EXTRA_BTN } + }; + int i; + + for (i = 0; i < ARRAY_SIZE(ps2pp_list); i++) + if (model == ps2pp_list[i].model) + return &ps2pp_list[i]; + + return NULL; +} + +/* + * Set up input device's properties based on the detected mouse model. + */ + +static void ps2pp_set_model_properties(struct psmouse *psmouse, + const struct ps2pp_info *model_info, + bool using_ps2pp) +{ + struct input_dev *input_dev = psmouse->dev; + + if (model_info->features & PS2PP_SIDE_BTN) + __set_bit(BTN_SIDE, input_dev->keybit); + + if (model_info->features & PS2PP_EXTRA_BTN) + __set_bit(BTN_EXTRA, input_dev->keybit); + + if (model_info->features & PS2PP_TASK_BTN) + __set_bit(BTN_TASK, input_dev->keybit); + + if (model_info->features & PS2PP_NAV_BTN) { + __set_bit(BTN_FORWARD, input_dev->keybit); + __set_bit(BTN_BACK, input_dev->keybit); + } + + if (model_info->features & PS2PP_WHEEL) + __set_bit(REL_WHEEL, input_dev->relbit); + + if (model_info->features & PS2PP_HWHEEL) + __set_bit(REL_HWHEEL, input_dev->relbit); + + switch (model_info->kind) { + + case PS2PP_KIND_WHEEL: + psmouse->name = "Wheel Mouse"; + break; + + case PS2PP_KIND_MX: + psmouse->name = "MX Mouse"; + break; + + case PS2PP_KIND_TP3: + psmouse->name = "TouchPad 3"; + break; + + case PS2PP_KIND_TRACKMAN: + psmouse->name = "TrackMan"; + break; + + default: + /* + * Set name to "Mouse" only when using PS2++, + * otherwise let other protocols define suitable + * name + */ + if (using_ps2pp) + psmouse->name = "Mouse"; + break; + } +} + + +/* + * Logitech magic init. Detect whether the mouse is a Logitech one + * and its exact model and try turning on extended protocol for ones + * that support it. + */ + +int ps2pp_init(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[4]; + unsigned char model, buttons; + const struct ps2pp_info *model_info; + bool use_ps2pp = false; + int error; + + param[0] = 0; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + param[1] = 0; + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO); + + model = ((param[0] >> 4) & 0x07) | ((param[0] << 3) & 0x78); + buttons = param[1]; + + if (!model || !buttons) + return -1; + + model_info = get_model_info(model); + if (model_info) { + +/* + * Do Logitech PS2++ / PS2T++ magic init. + */ + if (model_info->kind == PS2PP_KIND_TP3) { /* Touch Pad 3 */ + + /* Unprotect RAM */ + param[0] = 0x11; param[1] = 0x04; param[2] = 0x68; + ps2_command(ps2dev, param, 0x30d1); + /* Enable features */ + param[0] = 0x11; param[1] = 0x05; param[2] = 0x0b; + ps2_command(ps2dev, param, 0x30d1); + /* Enable PS2++ */ + param[0] = 0x11; param[1] = 0x09; param[2] = 0xc3; + ps2_command(ps2dev, param, 0x30d1); + + param[0] = 0; + if (!ps2_command(ps2dev, param, 0x13d1) && + param[0] == 0x06 && param[1] == 0x00 && param[2] == 0x14) { + use_ps2pp = true; + } + + } else { + + param[0] = param[1] = param[2] = 0; + ps2pp_cmd(psmouse, param, 0x39); /* Magic knock */ + ps2pp_cmd(psmouse, param, 0xDB); + + if ((param[0] & 0x78) == 0x48 && + (param[1] & 0xf3) == 0xc2 && + (param[2] & 0x03) == ((param[1] >> 2) & 3)) { + ps2pp_set_smartscroll(psmouse, false); + use_ps2pp = true; + } + } + + } else { + psmouse_warn(psmouse, "Detected unknown Logitech mouse model %d\n", model); + } + + if (set_properties) { + psmouse->vendor = "Logitech"; + psmouse->model = model; + + if (use_ps2pp) { + psmouse->protocol_handler = ps2pp_process_byte; + psmouse->pktsize = 3; + + if (model_info->kind != PS2PP_KIND_TP3) { + psmouse->set_resolution = ps2pp_set_resolution; + psmouse->disconnect = ps2pp_disconnect; + + error = device_create_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_smartscroll.dattr); + if (error) { + psmouse_err(psmouse, + "failed to create smartscroll sysfs attribute, error: %d\n", + error); + return -1; + } + } + } + + if (buttons >= 3) + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + + if (model_info) + ps2pp_set_model_properties(psmouse, model_info, use_ps2pp); + } + + return use_ps2pp ? 0 : -1; +} + diff --git a/drivers/input/mouse/logips2pp.h b/drivers/input/mouse/logips2pp.h new file mode 100644 index 00000000..0c186f02 --- /dev/null +++ b/drivers/input/mouse/logips2pp.h @@ -0,0 +1,23 @@ +/* + * Logitech PS/2++ mouse driver header + * + * Copyright (c) 2003 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _LOGIPS2PP_H +#define _LOGIPS2PP_H + +#ifdef CONFIG_MOUSE_PS2_LOGIPS2PP +int ps2pp_init(struct psmouse *psmouse, bool set_properties); +#else +inline int ps2pp_init(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +#endif /* CONFIG_MOUSE_PS2_LOGIPS2PP */ + +#endif diff --git a/drivers/input/mouse/maplemouse.c b/drivers/input/mouse/maplemouse.c new file mode 100644 index 00000000..0a60717b --- /dev/null +++ b/drivers/input/mouse/maplemouse.c @@ -0,0 +1,150 @@ +/* + * SEGA Dreamcast mouse driver + * Based on drivers/usb/usbmouse.c + * + * Copyright (c) Yaegashi Takeshi, 2001 + * Copyright (c) Adrian McMenamin, 2008 - 2009 + */ + +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Adrian McMenamin "); +MODULE_DESCRIPTION("SEGA Dreamcast mouse driver"); +MODULE_LICENSE("GPL"); + +struct dc_mouse { + struct input_dev *dev; + struct maple_device *mdev; +}; + +static void dc_mouse_callback(struct mapleq *mq) +{ + int buttons, relx, rely, relz; + struct maple_device *mapledev = mq->dev; + struct dc_mouse *mse = maple_get_drvdata(mapledev); + struct input_dev *dev = mse->dev; + unsigned char *res = mq->recvbuf->buf; + + buttons = ~res[8]; + relx = *(unsigned short *)(res + 12) - 512; + rely = *(unsigned short *)(res + 14) - 512; + relz = *(unsigned short *)(res + 16) - 512; + + input_report_key(dev, BTN_LEFT, buttons & 4); + input_report_key(dev, BTN_MIDDLE, buttons & 9); + input_report_key(dev, BTN_RIGHT, buttons & 2); + input_report_rel(dev, REL_X, relx); + input_report_rel(dev, REL_Y, rely); + input_report_rel(dev, REL_WHEEL, relz); + input_sync(dev); +} + +static int dc_mouse_open(struct input_dev *dev) +{ + struct dc_mouse *mse = maple_get_drvdata(to_maple_dev(&dev->dev)); + + maple_getcond_callback(mse->mdev, dc_mouse_callback, HZ/50, + MAPLE_FUNC_MOUSE); + + return 0; +} + +static void dc_mouse_close(struct input_dev *dev) +{ + struct dc_mouse *mse = maple_get_drvdata(to_maple_dev(&dev->dev)); + + maple_getcond_callback(mse->mdev, dc_mouse_callback, 0, + MAPLE_FUNC_MOUSE); +} + +/* allow the mouse to be used */ +static int probe_maple_mouse(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct maple_driver *mdrv = to_maple_driver(dev->driver); + int error; + struct input_dev *input_dev; + struct dc_mouse *mse; + + mse = kzalloc(sizeof(struct dc_mouse), GFP_KERNEL); + if (!mse) { + error = -ENOMEM; + goto fail; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + error = -ENOMEM; + goto fail_nomem; + } + + mse->dev = input_dev; + mse->mdev = mdev; + + input_set_drvdata(input_dev, mse); + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_RIGHT) | BIT_MASK(BTN_MIDDLE); + input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y) | + BIT_MASK(REL_WHEEL); + input_dev->open = dc_mouse_open; + input_dev->close = dc_mouse_close; + input_dev->name = mdev->product_name; + input_dev->id.bustype = BUS_HOST; + error = input_register_device(input_dev); + if (error) + goto fail_register; + + mdev->driver = mdrv; + maple_set_drvdata(mdev, mse); + + return error; + +fail_register: + input_free_device(input_dev); +fail_nomem: + kfree(mse); +fail: + return error; +} + +static int remove_maple_mouse(struct device *dev) +{ + struct maple_device *mdev = to_maple_dev(dev); + struct dc_mouse *mse = maple_get_drvdata(mdev); + + mdev->callback = NULL; + input_unregister_device(mse->dev); + maple_set_drvdata(mdev, NULL); + kfree(mse); + + return 0; +} + +static struct maple_driver dc_mouse_driver = { + .function = MAPLE_FUNC_MOUSE, + .drv = { + .name = "Dreamcast_mouse", + .probe = probe_maple_mouse, + .remove = remove_maple_mouse, + }, +}; + +static int __init dc_mouse_init(void) +{ + return maple_driver_register(&dc_mouse_driver); +} + +static void __exit dc_mouse_exit(void) +{ + maple_driver_unregister(&dc_mouse_driver); +} + +module_init(dc_mouse_init); +module_exit(dc_mouse_exit); diff --git a/drivers/input/mouse/navpoint.c b/drivers/input/mouse/navpoint.c new file mode 100644 index 00000000..8e1b98ea --- /dev/null +++ b/drivers/input/mouse/navpoint.c @@ -0,0 +1,369 @@ +/* + * Synaptics NavPoint (PXA27x SSP/SPI) driver. + * + * Copyright (C) 2012 Paul Parsons + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Synaptics Modular Embedded Protocol: Module Packet Format. + * Module header byte 2:0 = Length (# bytes that follow) + * Module header byte 4:3 = Control + * Module header byte 7:5 = Module Address + */ +#define HEADER_LENGTH(byte) ((byte) & 0x07) +#define HEADER_CONTROL(byte) (((byte) >> 3) & 0x03) +#define HEADER_ADDRESS(byte) ((byte) >> 5) + +struct navpoint { + struct ssp_device *ssp; + struct input_dev *input; + struct device *dev; + int gpio; + int index; + u8 data[1 + HEADER_LENGTH(0xff)]; +}; + +/* + * Initialization values for SSCR0_x, SSCR1_x, SSSR_x. + */ +static const u32 sscr0 = 0 + | SSCR0_TUM /* TIM = 1; No TUR interrupts */ + | SSCR0_RIM /* RIM = 1; No ROR interrupts */ + | SSCR0_SSE /* SSE = 1; SSP enabled */ + | SSCR0_Motorola /* FRF = 0; Motorola SPI */ + | SSCR0_DataSize(16) /* DSS = 15; Data size = 16-bit */ + ; +static const u32 sscr1 = 0 + | SSCR1_SCFR /* SCFR = 1; SSPSCLK only during transfers */ + | SSCR1_SCLKDIR /* SCLKDIR = 1; Slave mode */ + | SSCR1_SFRMDIR /* SFRMDIR = 1; Slave mode */ + | SSCR1_RWOT /* RWOT = 1; Receive without transmit mode */ + | SSCR1_RxTresh(1) /* RFT = 0; Receive FIFO threshold = 1 */ + | SSCR1_SPH /* SPH = 1; SSPSCLK inactive 0.5 + 1 cycles */ + | SSCR1_RIE /* RIE = 1; Receive FIFO interrupt enabled */ + ; +static const u32 sssr = 0 + | SSSR_BCE /* BCE = 1; Clear BCE */ + | SSSR_TUR /* TUR = 1; Clear TUR */ + | SSSR_EOC /* EOC = 1; Clear EOC */ + | SSSR_TINT /* TINT = 1; Clear TINT */ + | SSSR_PINT /* PINT = 1; Clear PINT */ + | SSSR_ROR /* ROR = 1; Clear ROR */ + ; + +/* + * MEP Query $22: Touchpad Coordinate Range Query is not supported by + * the NavPoint module, so sampled values provide the default limits. + */ +#define NAVPOINT_X_MIN 1278 +#define NAVPOINT_X_MAX 5340 +#define NAVPOINT_Y_MIN 1572 +#define NAVPOINT_Y_MAX 4396 +#define NAVPOINT_PRESSURE_MIN 0 +#define NAVPOINT_PRESSURE_MAX 255 + +static void navpoint_packet(struct navpoint *navpoint) +{ + int finger; + int gesture; + int x, y, z; + + switch (navpoint->data[0]) { + case 0xff: /* Garbage (packet?) between reset and Hello packet */ + case 0x00: /* Module 0, NULL packet */ + break; + + case 0x0e: /* Module 0, Absolute packet */ + finger = (navpoint->data[1] & 0x01); + gesture = (navpoint->data[1] & 0x02); + x = ((navpoint->data[2] & 0x1f) << 8) | navpoint->data[3]; + y = ((navpoint->data[4] & 0x1f) << 8) | navpoint->data[5]; + z = navpoint->data[6]; + input_report_key(navpoint->input, BTN_TOUCH, finger); + input_report_abs(navpoint->input, ABS_X, x); + input_report_abs(navpoint->input, ABS_Y, y); + input_report_abs(navpoint->input, ABS_PRESSURE, z); + input_report_key(navpoint->input, BTN_TOOL_FINGER, finger); + input_report_key(navpoint->input, BTN_LEFT, gesture); + input_sync(navpoint->input); + break; + + case 0x19: /* Module 0, Hello packet */ + if ((navpoint->data[1] & 0xf0) == 0x10) + break; + /* FALLTHROUGH */ + default: + dev_warn(navpoint->dev, + "spurious packet: data=0x%02x,0x%02x,...\n", + navpoint->data[0], navpoint->data[1]); + break; + } +} + +static irqreturn_t navpoint_irq(int irq, void *dev_id) +{ + struct navpoint *navpoint = dev_id; + struct ssp_device *ssp = navpoint->ssp; + irqreturn_t ret = IRQ_NONE; + u32 status; + + status = pxa_ssp_read_reg(ssp, SSSR); + if (status & sssr) { + dev_warn(navpoint->dev, + "unexpected interrupt: status=0x%08x\n", status); + pxa_ssp_write_reg(ssp, SSSR, (status & sssr)); + ret = IRQ_HANDLED; + } + + while (status & SSSR_RNE) { + u32 data; + + data = pxa_ssp_read_reg(ssp, SSDR); + navpoint->data[navpoint->index + 0] = (data >> 8); + navpoint->data[navpoint->index + 1] = data; + navpoint->index += 2; + if (HEADER_LENGTH(navpoint->data[0]) < navpoint->index) { + navpoint_packet(navpoint); + navpoint->index = 0; + } + status = pxa_ssp_read_reg(ssp, SSSR); + ret = IRQ_HANDLED; + } + + return ret; +} + +static void navpoint_up(struct navpoint *navpoint) +{ + struct ssp_device *ssp = navpoint->ssp; + int timeout; + + clk_prepare_enable(ssp->clk); + + pxa_ssp_write_reg(ssp, SSCR1, sscr1); + pxa_ssp_write_reg(ssp, SSSR, sssr); + pxa_ssp_write_reg(ssp, SSTO, 0); + pxa_ssp_write_reg(ssp, SSCR0, sscr0); /* SSCR0_SSE written last */ + + /* Wait until SSP port is ready for slave clock operations */ + for (timeout = 100; timeout != 0; --timeout) { + if (!(pxa_ssp_read_reg(ssp, SSSR) & SSSR_CSS)) + break; + msleep(1); + } + + if (timeout == 0) + dev_err(navpoint->dev, + "timeout waiting for SSSR[CSS] to clear\n"); + + if (gpio_is_valid(navpoint->gpio)) + gpio_set_value(navpoint->gpio, 1); +} + +static void navpoint_down(struct navpoint *navpoint) +{ + struct ssp_device *ssp = navpoint->ssp; + + if (gpio_is_valid(navpoint->gpio)) + gpio_set_value(navpoint->gpio, 0); + + pxa_ssp_write_reg(ssp, SSCR0, 0); + + clk_disable_unprepare(ssp->clk); +} + +static int navpoint_open(struct input_dev *input) +{ + struct navpoint *navpoint = input_get_drvdata(input); + + navpoint_up(navpoint); + + return 0; +} + +static void navpoint_close(struct input_dev *input) +{ + struct navpoint *navpoint = input_get_drvdata(input); + + navpoint_down(navpoint); +} + +static int navpoint_probe(struct platform_device *pdev) +{ + const struct navpoint_platform_data *pdata = + dev_get_platdata(&pdev->dev); + struct ssp_device *ssp; + struct input_dev *input; + struct navpoint *navpoint; + int error; + + if (!pdata) { + dev_err(&pdev->dev, "no platform data\n"); + return -EINVAL; + } + + if (gpio_is_valid(pdata->gpio)) { + error = gpio_request_one(pdata->gpio, GPIOF_OUT_INIT_LOW, + "SYNAPTICS_ON"); + if (error) + return error; + } + + ssp = pxa_ssp_request(pdata->port, pdev->name); + if (!ssp) { + error = -ENODEV; + goto err_free_gpio; + } + + /* HaRET does not disable devices before jumping into Linux */ + if (pxa_ssp_read_reg(ssp, SSCR0) & SSCR0_SSE) { + pxa_ssp_write_reg(ssp, SSCR0, 0); + dev_warn(&pdev->dev, "ssp%d already enabled\n", pdata->port); + } + + navpoint = kzalloc(sizeof(*navpoint), GFP_KERNEL); + input = input_allocate_device(); + if (!navpoint || !input) { + error = -ENOMEM; + goto err_free_mem; + } + + navpoint->ssp = ssp; + navpoint->input = input; + navpoint->dev = &pdev->dev; + navpoint->gpio = pdata->gpio; + + input->name = pdev->name; + input->dev.parent = &pdev->dev; + + __set_bit(EV_KEY, input->evbit); + __set_bit(EV_ABS, input->evbit); + __set_bit(BTN_LEFT, input->keybit); + __set_bit(BTN_TOUCH, input->keybit); + __set_bit(BTN_TOOL_FINGER, input->keybit); + + input_set_abs_params(input, ABS_X, + NAVPOINT_X_MIN, NAVPOINT_X_MAX, 0, 0); + input_set_abs_params(input, ABS_Y, + NAVPOINT_Y_MIN, NAVPOINT_Y_MAX, 0, 0); + input_set_abs_params(input, ABS_PRESSURE, + NAVPOINT_PRESSURE_MIN, NAVPOINT_PRESSURE_MAX, + 0, 0); + + input->open = navpoint_open; + input->close = navpoint_close; + + input_set_drvdata(input, navpoint); + + error = request_irq(ssp->irq, navpoint_irq, 0, pdev->name, navpoint); + if (error) + goto err_free_mem; + + error = input_register_device(input); + if (error) + goto err_free_irq; + + platform_set_drvdata(pdev, navpoint); + dev_dbg(&pdev->dev, "ssp%d, irq %d\n", pdata->port, ssp->irq); + + return 0; + +err_free_irq: + free_irq(ssp->irq, &pdev->dev); +err_free_mem: + input_free_device(input); + kfree(navpoint); + pxa_ssp_free(ssp); +err_free_gpio: + if (gpio_is_valid(pdata->gpio)) + gpio_free(pdata->gpio); + + return error; +} + +static int navpoint_remove(struct platform_device *pdev) +{ + const struct navpoint_platform_data *pdata = + dev_get_platdata(&pdev->dev); + struct navpoint *navpoint = platform_get_drvdata(pdev); + struct ssp_device *ssp = navpoint->ssp; + + free_irq(ssp->irq, navpoint); + + input_unregister_device(navpoint->input); + kfree(navpoint); + + pxa_ssp_free(ssp); + + if (gpio_is_valid(pdata->gpio)) + gpio_free(pdata->gpio); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int navpoint_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct navpoint *navpoint = platform_get_drvdata(pdev); + struct input_dev *input = navpoint->input; + + mutex_lock(&input->mutex); + if (input->users) + navpoint_down(navpoint); + mutex_unlock(&input->mutex); + + return 0; +} + +static int navpoint_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct navpoint *navpoint = platform_get_drvdata(pdev); + struct input_dev *input = navpoint->input; + + mutex_lock(&input->mutex); + if (input->users) + navpoint_up(navpoint); + mutex_unlock(&input->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(navpoint_pm_ops, navpoint_suspend, navpoint_resume); + +static struct platform_driver navpoint_driver = { + .probe = navpoint_probe, + .remove = navpoint_remove, + .driver = { + .name = "navpoint", + .owner = THIS_MODULE, + .pm = &navpoint_pm_ops, + }, +}; + +module_platform_driver(navpoint_driver); + +MODULE_AUTHOR("Paul Parsons "); +MODULE_DESCRIPTION("Synaptics NavPoint (PXA27x SSP/SPI) driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:navpoint"); diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c new file mode 100644 index 00000000..7b02b652 --- /dev/null +++ b/drivers/input/mouse/pc110pad.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + * + * Based on the work of: + * Alan Cox Robin O'Leary + */ + +/* + * IBM PC110 touchpad driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("IBM PC110 touchpad driver"); +MODULE_LICENSE("GPL"); + +#define PC110PAD_OFF 0x30 +#define PC110PAD_ON 0x38 + +static int pc110pad_irq = 10; +static int pc110pad_io = 0x15e0; + +static struct input_dev *pc110pad_dev; +static int pc110pad_data[3]; +static int pc110pad_count; + +static irqreturn_t pc110pad_interrupt(int irq, void *ptr) +{ + int value = inb_p(pc110pad_io); + int handshake = inb_p(pc110pad_io + 2); + + outb(handshake | 1, pc110pad_io + 2); + udelay(2); + outb(handshake & ~1, pc110pad_io + 2); + udelay(2); + inb_p(0x64); + + pc110pad_data[pc110pad_count++] = value; + + if (pc110pad_count < 3) + return IRQ_HANDLED; + + input_report_key(pc110pad_dev, BTN_TOUCH, + pc110pad_data[0] & 0x01); + input_report_abs(pc110pad_dev, ABS_X, + pc110pad_data[1] | ((pc110pad_data[0] << 3) & 0x80) | ((pc110pad_data[0] << 1) & 0x100)); + input_report_abs(pc110pad_dev, ABS_Y, + pc110pad_data[2] | ((pc110pad_data[0] << 4) & 0x80)); + input_sync(pc110pad_dev); + + pc110pad_count = 0; + return IRQ_HANDLED; +} + +static void pc110pad_close(struct input_dev *dev) +{ + outb(PC110PAD_OFF, pc110pad_io + 2); +} + +static int pc110pad_open(struct input_dev *dev) +{ + pc110pad_interrupt(0, NULL); + pc110pad_interrupt(0, NULL); + pc110pad_interrupt(0, NULL); + outb(PC110PAD_ON, pc110pad_io + 2); + pc110pad_count = 0; + + return 0; +} + +/* + * We try to avoid enabling the hardware if it's not + * there, but we don't know how to test. But we do know + * that the PC110 is not a PCI system. So if we find any + * PCI devices in the machine, we don't have a PC110. + */ +static int __init pc110pad_init(void) +{ + int err; + + if (!no_pci_devices()) + return -ENODEV; + + if (!request_region(pc110pad_io, 4, "pc110pad")) { + printk(KERN_ERR "pc110pad: I/O area %#x-%#x in use.\n", + pc110pad_io, pc110pad_io + 4); + return -EBUSY; + } + + outb(PC110PAD_OFF, pc110pad_io + 2); + + if (request_irq(pc110pad_irq, pc110pad_interrupt, 0, "pc110pad", NULL)) { + printk(KERN_ERR "pc110pad: Unable to get irq %d.\n", pc110pad_irq); + err = -EBUSY; + goto err_release_region; + } + + pc110pad_dev = input_allocate_device(); + if (!pc110pad_dev) { + printk(KERN_ERR "pc110pad: Not enough memory.\n"); + err = -ENOMEM; + goto err_free_irq; + } + + pc110pad_dev->name = "IBM PC110 TouchPad"; + pc110pad_dev->phys = "isa15e0/input0"; + pc110pad_dev->id.bustype = BUS_ISA; + pc110pad_dev->id.vendor = 0x0003; + pc110pad_dev->id.product = 0x0001; + pc110pad_dev->id.version = 0x0100; + + pc110pad_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + pc110pad_dev->absbit[0] = BIT_MASK(ABS_X) | BIT_MASK(ABS_Y); + pc110pad_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_abs_set_max(pc110pad_dev, ABS_X, 0x1ff); + input_abs_set_max(pc110pad_dev, ABS_Y, 0x0ff); + + pc110pad_dev->open = pc110pad_open; + pc110pad_dev->close = pc110pad_close; + + err = input_register_device(pc110pad_dev); + if (err) + goto err_free_dev; + + return 0; + + err_free_dev: + input_free_device(pc110pad_dev); + err_free_irq: + free_irq(pc110pad_irq, NULL); + err_release_region: + release_region(pc110pad_io, 4); + + return err; +} + +static void __exit pc110pad_exit(void) +{ + outb(PC110PAD_OFF, pc110pad_io + 2); + free_irq(pc110pad_irq, NULL); + input_unregister_device(pc110pad_dev); + release_region(pc110pad_io, 4); +} + +module_init(pc110pad_init); +module_exit(pc110pad_exit); diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c new file mode 100644 index 00000000..cff065f6 --- /dev/null +++ b/drivers/input/mouse/psmouse-base.c @@ -0,0 +1,1849 @@ +/* + * PS/2 mouse driver + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * Copyright (c) 2003-2004 Dmitry Torokhov + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#define psmouse_fmt(fmt) fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "psmouse.h" +#include "synaptics.h" +#include "logips2pp.h" +#include "alps.h" +#include "hgpk.h" +#include "lifebook.h" +#include "trackpoint.h" +#include "touchkit_ps2.h" +#include "elantech.h" +#include "sentelic.h" +#include "cypress_ps2.h" + +#define DRIVER_DESC "PS/2 mouse driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +static unsigned int psmouse_max_proto = PSMOUSE_AUTO; +static int psmouse_set_maxproto(const char *val, const struct kernel_param *); +static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp); +static struct kernel_param_ops param_ops_proto_abbrev = { + .set = psmouse_set_maxproto, + .get = psmouse_get_maxproto, +}; +#define param_check_proto_abbrev(name, p) __param_check(name, p, unsigned int) +module_param_named(proto, psmouse_max_proto, proto_abbrev, 0644); +MODULE_PARM_DESC(proto, "Highest protocol extension to probe (bare, imps, exps, any). Useful for KVM switches."); + +static unsigned int psmouse_resolution = 200; +module_param_named(resolution, psmouse_resolution, uint, 0644); +MODULE_PARM_DESC(resolution, "Resolution, in dpi."); + +static unsigned int psmouse_rate = 100; +module_param_named(rate, psmouse_rate, uint, 0644); +MODULE_PARM_DESC(rate, "Report rate, in reports per second."); + +static bool psmouse_smartscroll = 1; +module_param_named(smartscroll, psmouse_smartscroll, bool, 0644); +MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled."); + +static unsigned int psmouse_resetafter = 5; +module_param_named(resetafter, psmouse_resetafter, uint, 0644); +MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); + +static unsigned int psmouse_resync_time; +module_param_named(resync_time, psmouse_resync_time, uint, 0644); +MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never)."); + +PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO, + NULL, + psmouse_attr_show_protocol, psmouse_attr_set_protocol); +PSMOUSE_DEFINE_ATTR(rate, S_IWUSR | S_IRUGO, + (void *) offsetof(struct psmouse, rate), + psmouse_show_int_attr, psmouse_attr_set_rate); +PSMOUSE_DEFINE_ATTR(resolution, S_IWUSR | S_IRUGO, + (void *) offsetof(struct psmouse, resolution), + psmouse_show_int_attr, psmouse_attr_set_resolution); +PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO, + (void *) offsetof(struct psmouse, resetafter), + psmouse_show_int_attr, psmouse_set_int_attr); +PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO, + (void *) offsetof(struct psmouse, resync_time), + psmouse_show_int_attr, psmouse_set_int_attr); + +static struct attribute *psmouse_attributes[] = { + &psmouse_attr_protocol.dattr.attr, + &psmouse_attr_rate.dattr.attr, + &psmouse_attr_resolution.dattr.attr, + &psmouse_attr_resetafter.dattr.attr, + &psmouse_attr_resync_time.dattr.attr, + NULL +}; + +static struct attribute_group psmouse_attribute_group = { + .attrs = psmouse_attributes, +}; + +/* + * psmouse_mutex protects all operations changing state of mouse + * (connecting, disconnecting, changing rate or resolution via + * sysfs). We could use a per-device semaphore but since there + * rarely more than one PS/2 mouse connected and since semaphore + * is taken in "slow" paths it is not worth it. + */ +static DEFINE_MUTEX(psmouse_mutex); + +static struct workqueue_struct *kpsmoused_wq; + +struct psmouse_protocol { + enum psmouse_type type; + bool maxproto; + bool ignore_parity; /* Protocol should ignore parity errors from KBC */ + const char *name; + const char *alias; + int (*detect)(struct psmouse *, bool); + int (*init)(struct psmouse *); +}; + +/* + * psmouse_process_byte() analyzes the PS/2 data stream and reports + * relevant events to the input module once full packet has arrived. + */ + +psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + unsigned char *packet = psmouse->packet; + + if (psmouse->pktcnt < psmouse->pktsize) + return PSMOUSE_GOOD_DATA; + +/* + * Full packet accumulated, process it + */ + +/* + * Scroll wheel on IntelliMice, scroll buttons on NetMice + */ + + if (psmouse->type == PSMOUSE_IMPS || psmouse->type == PSMOUSE_GENPS) + input_report_rel(dev, REL_WHEEL, -(signed char) packet[3]); + +/* + * Scroll wheel and buttons on IntelliMouse Explorer + */ + + if (psmouse->type == PSMOUSE_IMEX) { + switch (packet[3] & 0xC0) { + case 0x80: /* vertical scroll on IntelliMouse Explorer 4.0 */ + input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31)); + break; + case 0x40: /* horizontal scroll on IntelliMouse Explorer 4.0 */ + input_report_rel(dev, REL_HWHEEL, (int) (packet[3] & 32) - (int) (packet[3] & 31)); + break; + case 0x00: + case 0xC0: + input_report_rel(dev, REL_WHEEL, (int) (packet[3] & 8) - (int) (packet[3] & 7)); + input_report_key(dev, BTN_SIDE, (packet[3] >> 4) & 1); + input_report_key(dev, BTN_EXTRA, (packet[3] >> 5) & 1); + break; + } + } + +/* + * Extra buttons on Genius NewNet 3D + */ + + if (psmouse->type == PSMOUSE_GENPS) { + input_report_key(dev, BTN_SIDE, (packet[0] >> 6) & 1); + input_report_key(dev, BTN_EXTRA, (packet[0] >> 7) & 1); + } + +/* + * Extra button on ThinkingMouse + */ + if (psmouse->type == PSMOUSE_THINKPS) { + input_report_key(dev, BTN_EXTRA, (packet[0] >> 3) & 1); + /* Without this bit of weirdness moving up gives wildly high Y changes. */ + packet[1] |= (packet[0] & 0x40) << 1; + } + +/* + * Cortron PS2 Trackball reports SIDE button on the 4th bit of the first + * byte. + */ + if (psmouse->type == PSMOUSE_CORTRON) { + input_report_key(dev, BTN_SIDE, (packet[0] >> 3) & 1); + packet[0] |= 0x08; + } + +/* + * Generic PS/2 Mouse + */ + + input_report_key(dev, BTN_LEFT, packet[0] & 1); + input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1); + input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1); + + input_report_rel(dev, REL_X, packet[1] ? (int) packet[1] - (int) ((packet[0] << 4) & 0x100) : 0); + input_report_rel(dev, REL_Y, packet[2] ? (int) ((packet[0] << 3) & 0x100) - (int) packet[2] : 0); + + input_sync(dev); + + return PSMOUSE_FULL_PACKET; +} + +void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work, + unsigned long delay) +{ + queue_delayed_work(kpsmoused_wq, work, delay); +} + +/* + * __psmouse_set_state() sets new psmouse state and resets all flags. + */ + +static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) +{ + psmouse->state = new_state; + psmouse->pktcnt = psmouse->out_of_sync_cnt = 0; + psmouse->ps2dev.flags = 0; + psmouse->last = jiffies; +} + + +/* + * psmouse_set_state() sets new psmouse state and resets all flags and + * counters while holding serio lock so fighting with interrupt handler + * is not a concern. + */ + +void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) +{ + serio_pause_rx(psmouse->ps2dev.serio); + __psmouse_set_state(psmouse, new_state); + serio_continue_rx(psmouse->ps2dev.serio); +} + +/* + * psmouse_handle_byte() processes one byte of the input data stream + * by calling corresponding protocol handler. + */ + +static int psmouse_handle_byte(struct psmouse *psmouse) +{ + psmouse_ret_t rc = psmouse->protocol_handler(psmouse); + + switch (rc) { + case PSMOUSE_BAD_DATA: + if (psmouse->state == PSMOUSE_ACTIVATED) { + psmouse_warn(psmouse, + "%s at %s lost sync at byte %d\n", + psmouse->name, psmouse->phys, + psmouse->pktcnt); + if (++psmouse->out_of_sync_cnt == psmouse->resetafter) { + __psmouse_set_state(psmouse, PSMOUSE_IGNORE); + psmouse_notice(psmouse, + "issuing reconnect request\n"); + serio_reconnect(psmouse->ps2dev.serio); + return -1; + } + } + psmouse->pktcnt = 0; + break; + + case PSMOUSE_FULL_PACKET: + psmouse->pktcnt = 0; + if (psmouse->out_of_sync_cnt) { + psmouse->out_of_sync_cnt = 0; + psmouse_notice(psmouse, + "%s at %s - driver resynced.\n", + psmouse->name, psmouse->phys); + } + break; + + case PSMOUSE_GOOD_DATA: + break; + } + return 0; +} + +/* + * psmouse_interrupt() handles incoming characters, either passing them + * for normal processing or gathering them as command response. + */ + +static irqreturn_t psmouse_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct psmouse *psmouse = serio_get_drvdata(serio); + + if (psmouse->state == PSMOUSE_IGNORE) + goto out; + + if (unlikely((flags & SERIO_TIMEOUT) || + ((flags & SERIO_PARITY) && !psmouse->ignore_parity))) { + + if (psmouse->state == PSMOUSE_ACTIVATED) + psmouse_warn(psmouse, + "bad data from KBC -%s%s\n", + flags & SERIO_TIMEOUT ? " timeout" : "", + flags & SERIO_PARITY ? " bad parity" : ""); + ps2_cmd_aborted(&psmouse->ps2dev); + goto out; + } + + if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_ACK)) + if (ps2_handle_ack(&psmouse->ps2dev, data)) + goto out; + + if (unlikely(psmouse->ps2dev.flags & PS2_FLAG_CMD)) + if (ps2_handle_response(&psmouse->ps2dev, data)) + goto out; + + if (psmouse->state <= PSMOUSE_RESYNCING) + goto out; + + if (psmouse->state == PSMOUSE_ACTIVATED && + psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) { + psmouse_info(psmouse, "%s at %s lost synchronization, throwing %d bytes away.\n", + psmouse->name, psmouse->phys, psmouse->pktcnt); + psmouse->badbyte = psmouse->packet[0]; + __psmouse_set_state(psmouse, PSMOUSE_RESYNCING); + psmouse_queue_work(psmouse, &psmouse->resync_work, 0); + goto out; + } + + psmouse->packet[psmouse->pktcnt++] = data; +/* + * Check if this is a new device announcement (0xAA 0x00) + */ + if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) { + if (psmouse->pktcnt == 1) { + psmouse->last = jiffies; + goto out; + } + + if (psmouse->packet[1] == PSMOUSE_RET_ID || + (psmouse->type == PSMOUSE_HGPK && + psmouse->packet[1] == PSMOUSE_RET_BAT)) { + __psmouse_set_state(psmouse, PSMOUSE_IGNORE); + serio_reconnect(serio); + goto out; + } +/* + * Not a new device, try processing first byte normally + */ + psmouse->pktcnt = 1; + if (psmouse_handle_byte(psmouse)) + goto out; + + psmouse->packet[psmouse->pktcnt++] = data; + } + +/* + * See if we need to force resync because mouse was idle for too long + */ + if (psmouse->state == PSMOUSE_ACTIVATED && + psmouse->pktcnt == 1 && psmouse->resync_time && + time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) { + psmouse->badbyte = psmouse->packet[0]; + __psmouse_set_state(psmouse, PSMOUSE_RESYNCING); + psmouse_queue_work(psmouse, &psmouse->resync_work, 0); + goto out; + } + + psmouse->last = jiffies; + psmouse_handle_byte(psmouse); + + out: + return IRQ_HANDLED; +} + + +/* + * psmouse_sliced_command() sends an extended PS/2 command to the mouse + * using sliced syntax, understood by advanced devices, such as Logitech + * or Synaptics touchpads. The command is encoded as: + * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu + * is the command. + */ +int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command) +{ + int i; + + if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11)) + return -1; + + for (i = 6; i >= 0; i -= 2) { + unsigned char d = (command >> i) & 3; + if (ps2_command(&psmouse->ps2dev, &d, PSMOUSE_CMD_SETRES)) + return -1; + } + + return 0; +} + + +/* + * psmouse_reset() resets the mouse into power-on state. + */ +int psmouse_reset(struct psmouse *psmouse) +{ + unsigned char param[2]; + + if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_RESET_BAT)) + return -1; + + if (param[0] != PSMOUSE_RET_BAT && param[1] != PSMOUSE_RET_ID) + return -1; + + return 0; +} + +/* + * Here we set the mouse resolution. + */ + +void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution) +{ + static const unsigned char params[] = { 0, 1, 2, 2, 3 }; + unsigned char p; + + if (resolution == 0 || resolution > 200) + resolution = 200; + + p = params[resolution / 50]; + ps2_command(&psmouse->ps2dev, &p, PSMOUSE_CMD_SETRES); + psmouse->resolution = 25 << p; +} + +/* + * Here we set the mouse report rate. + */ + +static void psmouse_set_rate(struct psmouse *psmouse, unsigned int rate) +{ + static const unsigned char rates[] = { 200, 100, 80, 60, 40, 20, 10, 0 }; + unsigned char r; + int i = 0; + + while (rates[i] > rate) i++; + r = rates[i]; + ps2_command(&psmouse->ps2dev, &r, PSMOUSE_CMD_SETRATE); + psmouse->rate = r; +} + +/* + * psmouse_poll() - default poll handler. Everyone except for ALPS uses it. + */ + +static int psmouse_poll(struct psmouse *psmouse) +{ + return ps2_command(&psmouse->ps2dev, psmouse->packet, + PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)); +} + + +/* + * Genius NetMouse magic init. + */ +static int genius_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[4]; + + param[0] = 3; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO); + + if (param[0] != 0x00 || param[1] != 0x33 || param[2] != 0x55) + return -1; + + if (set_properties) { + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + __set_bit(BTN_EXTRA, psmouse->dev->keybit); + __set_bit(BTN_SIDE, psmouse->dev->keybit); + __set_bit(REL_WHEEL, psmouse->dev->relbit); + + psmouse->vendor = "Genius"; + psmouse->name = "Mouse"; + psmouse->pktsize = 4; + } + + return 0; +} + +/* + * IntelliMouse magic init. + */ +static int intellimouse_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[2]; + + param[0] = 200; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 100; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 80; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + ps2_command(ps2dev, param, PSMOUSE_CMD_GETID); + + if (param[0] != 3) + return -1; + + if (set_properties) { + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + __set_bit(REL_WHEEL, psmouse->dev->relbit); + + if (!psmouse->vendor) + psmouse->vendor = "Generic"; + if (!psmouse->name) + psmouse->name = "Wheel Mouse"; + psmouse->pktsize = 4; + } + + return 0; +} + +/* + * Try IntelliMouse/Explorer magic init. + */ +static int im_explorer_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[2]; + + intellimouse_detect(psmouse, 0); + + param[0] = 200; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 200; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 80; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + ps2_command(ps2dev, param, PSMOUSE_CMD_GETID); + + if (param[0] != 4) + return -1; + +/* Magic to enable horizontal scrolling on IntelliMouse 4.0 */ + param[0] = 200; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 80; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 40; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + + if (set_properties) { + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + __set_bit(REL_WHEEL, psmouse->dev->relbit); + __set_bit(REL_HWHEEL, psmouse->dev->relbit); + __set_bit(BTN_SIDE, psmouse->dev->keybit); + __set_bit(BTN_EXTRA, psmouse->dev->keybit); + + if (!psmouse->vendor) + psmouse->vendor = "Generic"; + if (!psmouse->name) + psmouse->name = "Explorer Mouse"; + psmouse->pktsize = 4; + } + + return 0; +} + +/* + * Kensington ThinkingMouse / ExpertMouse magic init. + */ +static int thinking_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[2]; + static const unsigned char seq[] = { 20, 60, 40, 20, 20, 60, 40, 20, 20 }; + int i; + + param[0] = 10; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 0; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + for (i = 0; i < ARRAY_SIZE(seq); i++) { + param[0] = seq[i]; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + } + ps2_command(ps2dev, param, PSMOUSE_CMD_GETID); + + if (param[0] != 2) + return -1; + + if (set_properties) { + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + __set_bit(BTN_EXTRA, psmouse->dev->keybit); + + psmouse->vendor = "Kensington"; + psmouse->name = "ThinkingMouse"; + } + + return 0; +} + +/* + * Bare PS/2 protocol "detection". Always succeeds. + */ +static int ps2bare_detect(struct psmouse *psmouse, bool set_properties) +{ + if (set_properties) { + if (!psmouse->vendor) + psmouse->vendor = "Generic"; + if (!psmouse->name) + psmouse->name = "Mouse"; + +/* + * We have no way of figuring true number of buttons so let's + * assume that the device has 3. + */ + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + } + + return 0; +} + +/* + * Cortron PS/2 protocol detection. There's no special way to detect it, so it + * must be forced by sysfs protocol writing. + */ +static int cortron_detect(struct psmouse *psmouse, bool set_properties) +{ + if (set_properties) { + psmouse->vendor = "Cortron"; + psmouse->name = "PS/2 Trackball"; + + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + __set_bit(BTN_SIDE, psmouse->dev->keybit); + } + + return 0; +} + +/* + * Apply default settings to the psmouse structure. Most of them will + * be overridden by individual protocol initialization routines. + */ + +static void psmouse_apply_defaults(struct psmouse *psmouse) +{ + struct input_dev *input_dev = psmouse->dev; + + memset(input_dev->evbit, 0, sizeof(input_dev->evbit)); + memset(input_dev->keybit, 0, sizeof(input_dev->keybit)); + memset(input_dev->relbit, 0, sizeof(input_dev->relbit)); + memset(input_dev->absbit, 0, sizeof(input_dev->absbit)); + memset(input_dev->mscbit, 0, sizeof(input_dev->mscbit)); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_REL, input_dev->evbit); + + __set_bit(BTN_LEFT, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + + __set_bit(REL_X, input_dev->relbit); + __set_bit(REL_Y, input_dev->relbit); + + psmouse->set_rate = psmouse_set_rate; + psmouse->set_resolution = psmouse_set_resolution; + psmouse->poll = psmouse_poll; + psmouse->protocol_handler = psmouse_process_byte; + psmouse->pktsize = 3; + psmouse->reconnect = NULL; + psmouse->disconnect = NULL; + psmouse->cleanup = NULL; + psmouse->pt_activate = NULL; + psmouse->pt_deactivate = NULL; +} + +/* + * Apply default settings to the psmouse structure and call specified + * protocol detection or initialization routine. + */ +static int psmouse_do_detect(int (*detect)(struct psmouse *psmouse, + bool set_properties), + struct psmouse *psmouse, bool set_properties) +{ + if (set_properties) + psmouse_apply_defaults(psmouse); + + return detect(psmouse, set_properties); +} + +/* + * psmouse_extensions() probes for any extensions to the basic PS/2 protocol + * the mouse may have. + */ + +static int psmouse_extensions(struct psmouse *psmouse, + unsigned int max_proto, bool set_properties) +{ + bool synaptics_hardware = false; + +/* + * We always check for lifebook because it does not disturb mouse + * (it only checks DMI information). + */ + if (psmouse_do_detect(lifebook_detect, psmouse, set_properties) == 0) { + if (max_proto > PSMOUSE_IMEX) { + if (!set_properties || lifebook_init(psmouse) == 0) + return PSMOUSE_LIFEBOOK; + } + } + +/* + * Try Kensington ThinkingMouse (we try first, because synaptics probe + * upsets the thinkingmouse). + */ + + if (max_proto > PSMOUSE_IMEX && + psmouse_do_detect(thinking_detect, psmouse, set_properties) == 0) { + return PSMOUSE_THINKPS; + } + +/* + * Try Synaptics TouchPad. Note that probing is done even if Synaptics protocol + * support is disabled in config - we need to know if it is synaptics so we + * can reset it properly after probing for intellimouse. + */ + if (max_proto > PSMOUSE_PS2 && + psmouse_do_detect(synaptics_detect, psmouse, set_properties) == 0) { + synaptics_hardware = true; + + if (max_proto > PSMOUSE_IMEX) { +/* + * Try activating protocol, but check if support is enabled first, since + * we try detecting Synaptics even when protocol is disabled. + */ + if (synaptics_supported() && + (!set_properties || synaptics_init(psmouse) == 0)) { + return PSMOUSE_SYNAPTICS; + } + +/* + * Some Synaptics touchpads can emulate extended protocols (like IMPS/2). + * Unfortunately Logitech/Genius probes confuse some firmware versions so + * we'll have to skip them. + */ + max_proto = PSMOUSE_IMEX; + } +/* + * Make sure that touchpad is in relative mode, gestures (taps) are enabled + */ + synaptics_reset(psmouse); + } + +/* + * Try Cypress Trackpad. + * Must try it before Finger Sensing Pad because Finger Sensing Pad probe + * upsets some modules of Cypress Trackpads. + */ + if (max_proto > PSMOUSE_IMEX && + cypress_detect(psmouse, set_properties) == 0) { + if (cypress_supported()) { + if (cypress_init(psmouse) == 0) + return PSMOUSE_CYPRESS; + + /* + * Finger Sensing Pad probe upsets some modules of + * Cypress Trackpad, must avoid Finger Sensing Pad + * probe if Cypress Trackpad device detected. + */ + return PSMOUSE_PS2; + } + + max_proto = PSMOUSE_IMEX; + } + +/* + * Try ALPS TouchPad + */ + if (max_proto > PSMOUSE_IMEX) { + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); + if (psmouse_do_detect(alps_detect, + psmouse, set_properties) == 0) { + if (!set_properties || alps_init(psmouse) == 0) + return PSMOUSE_ALPS; +/* + * Init failed, try basic relative protocols + */ + max_proto = PSMOUSE_IMEX; + } + } + +/* + * Try OLPC HGPK touchpad. + */ + if (max_proto > PSMOUSE_IMEX && + psmouse_do_detect(hgpk_detect, psmouse, set_properties) == 0) { + if (!set_properties || hgpk_init(psmouse) == 0) + return PSMOUSE_HGPK; +/* + * Init failed, try basic relative protocols + */ + max_proto = PSMOUSE_IMEX; + } + +/* + * Try Elantech touchpad. + */ + if (max_proto > PSMOUSE_IMEX && + psmouse_do_detect(elantech_detect, psmouse, set_properties) == 0) { + if (!set_properties || elantech_init(psmouse) == 0) + return PSMOUSE_ELANTECH; +/* + * Init failed, try basic relative protocols + */ + max_proto = PSMOUSE_IMEX; + } + + if (max_proto > PSMOUSE_IMEX) { + if (psmouse_do_detect(genius_detect, + psmouse, set_properties) == 0) + return PSMOUSE_GENPS; + + if (psmouse_do_detect(ps2pp_init, + psmouse, set_properties) == 0) + return PSMOUSE_PS2PP; + + if (psmouse_do_detect(trackpoint_detect, + psmouse, set_properties) == 0) + return PSMOUSE_TRACKPOINT; + + if (psmouse_do_detect(touchkit_ps2_detect, + psmouse, set_properties) == 0) + return PSMOUSE_TOUCHKIT_PS2; + } + +/* + * Try Finger Sensing Pad. We do it here because its probe upsets + * Trackpoint devices (causing TP_READ_ID command to time out). + */ + if (max_proto > PSMOUSE_IMEX) { + if (psmouse_do_detect(fsp_detect, + psmouse, set_properties) == 0) { + if (!set_properties || fsp_init(psmouse) == 0) + return PSMOUSE_FSP; +/* + * Init failed, try basic relative protocols + */ + max_proto = PSMOUSE_IMEX; + } + } + +/* + * Reset to defaults in case the device got confused by extended + * protocol probes. Note that we follow up with full reset because + * some mice put themselves to sleep when they see PSMOUSE_RESET_DIS. + */ + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); + psmouse_reset(psmouse); + + if (max_proto >= PSMOUSE_IMEX && + psmouse_do_detect(im_explorer_detect, + psmouse, set_properties) == 0) { + return PSMOUSE_IMEX; + } + + if (max_proto >= PSMOUSE_IMPS && + psmouse_do_detect(intellimouse_detect, + psmouse, set_properties) == 0) { + return PSMOUSE_IMPS; + } + +/* + * Okay, all failed, we have a standard mouse here. The number of the buttons + * is still a question, though. We assume 3. + */ + psmouse_do_detect(ps2bare_detect, psmouse, set_properties); + + if (synaptics_hardware) { +/* + * We detected Synaptics hardware but it did not respond to IMPS/2 probes. + * We need to reset the touchpad because if there is a track point on the + * pass through port it could get disabled while probing for protocol + * extensions. + */ + psmouse_reset(psmouse); + } + + return PSMOUSE_PS2; +} + +static const struct psmouse_protocol psmouse_protocols[] = { + { + .type = PSMOUSE_PS2, + .name = "PS/2", + .alias = "bare", + .maxproto = true, + .ignore_parity = true, + .detect = ps2bare_detect, + }, +#ifdef CONFIG_MOUSE_PS2_LOGIPS2PP + { + .type = PSMOUSE_PS2PP, + .name = "PS2++", + .alias = "logitech", + .detect = ps2pp_init, + }, +#endif + { + .type = PSMOUSE_THINKPS, + .name = "ThinkPS/2", + .alias = "thinkps", + .detect = thinking_detect, + }, +#ifdef CONFIG_MOUSE_PS2_CYPRESS + { + .type = PSMOUSE_CYPRESS, + .name = "CyPS/2", + .alias = "cypress", + .detect = cypress_detect, + .init = cypress_init, + }, +#endif + { + .type = PSMOUSE_GENPS, + .name = "GenPS/2", + .alias = "genius", + .detect = genius_detect, + }, + { + .type = PSMOUSE_IMPS, + .name = "ImPS/2", + .alias = "imps", + .maxproto = true, + .ignore_parity = true, + .detect = intellimouse_detect, + }, + { + .type = PSMOUSE_IMEX, + .name = "ImExPS/2", + .alias = "exps", + .maxproto = true, + .ignore_parity = true, + .detect = im_explorer_detect, + }, +#ifdef CONFIG_MOUSE_PS2_SYNAPTICS + { + .type = PSMOUSE_SYNAPTICS, + .name = "SynPS/2", + .alias = "synaptics", + .detect = synaptics_detect, + .init = synaptics_init, + }, + { + .type = PSMOUSE_SYNAPTICS_RELATIVE, + .name = "SynRelPS/2", + .alias = "synaptics-relative", + .detect = synaptics_detect, + .init = synaptics_init_relative, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_ALPS + { + .type = PSMOUSE_ALPS, + .name = "AlpsPS/2", + .alias = "alps", + .detect = alps_detect, + .init = alps_init, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_LIFEBOOK + { + .type = PSMOUSE_LIFEBOOK, + .name = "LBPS/2", + .alias = "lifebook", + .init = lifebook_init, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_TRACKPOINT + { + .type = PSMOUSE_TRACKPOINT, + .name = "TPPS/2", + .alias = "trackpoint", + .detect = trackpoint_detect, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_TOUCHKIT + { + .type = PSMOUSE_TOUCHKIT_PS2, + .name = "touchkitPS/2", + .alias = "touchkit", + .detect = touchkit_ps2_detect, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_OLPC + { + .type = PSMOUSE_HGPK, + .name = "OLPC HGPK", + .alias = "hgpk", + .detect = hgpk_detect, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_ELANTECH + { + .type = PSMOUSE_ELANTECH, + .name = "ETPS/2", + .alias = "elantech", + .detect = elantech_detect, + .init = elantech_init, + }, +#endif +#ifdef CONFIG_MOUSE_PS2_SENTELIC + { + .type = PSMOUSE_FSP, + .name = "FSPPS/2", + .alias = "fsp", + .detect = fsp_detect, + .init = fsp_init, + }, +#endif + { + .type = PSMOUSE_CORTRON, + .name = "CortronPS/2", + .alias = "cortps", + .detect = cortron_detect, + }, + { + .type = PSMOUSE_AUTO, + .name = "auto", + .alias = "any", + .maxproto = true, + }, +}; + +static const struct psmouse_protocol *psmouse_protocol_by_type(enum psmouse_type type) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++) + if (psmouse_protocols[i].type == type) + return &psmouse_protocols[i]; + + WARN_ON(1); + return &psmouse_protocols[0]; +} + +static const struct psmouse_protocol *psmouse_protocol_by_name(const char *name, size_t len) +{ + const struct psmouse_protocol *p; + int i; + + for (i = 0; i < ARRAY_SIZE(psmouse_protocols); i++) { + p = &psmouse_protocols[i]; + + if ((strlen(p->name) == len && !strncmp(p->name, name, len)) || + (strlen(p->alias) == len && !strncmp(p->alias, name, len))) + return &psmouse_protocols[i]; + } + + return NULL; +} + + +/* + * psmouse_probe() probes for a PS/2 mouse. + */ + +static int psmouse_probe(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[2]; + +/* + * First, we check if it's a mouse. It should send 0x00 or 0x03 + * in case of an IntelliMouse in 4-byte mode or 0x04 for IM Explorer. + * Sunrex K8561 IR Keyboard/Mouse reports 0xff on second and subsequent + * ID queries, probably due to a firmware bug. + */ + + param[0] = 0xa5; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETID)) + return -1; + + if (param[0] != 0x00 && param[0] != 0x03 && + param[0] != 0x04 && param[0] != 0xff) + return -1; + +/* + * Then we reset and disable the mouse so that it doesn't generate events. + */ + + if (ps2_command(ps2dev, NULL, PSMOUSE_CMD_RESET_DIS)) + psmouse_warn(psmouse, "Failed to reset mouse on %s\n", + ps2dev->serio->phys); + + return 0; +} + +/* + * psmouse_initialize() initializes the mouse to a sane state. + */ + +static void psmouse_initialize(struct psmouse *psmouse) +{ +/* + * We set the mouse report rate, resolution and scaling. + */ + + if (psmouse_max_proto != PSMOUSE_PS2) { + psmouse->set_rate(psmouse, psmouse->rate); + psmouse->set_resolution(psmouse, psmouse->resolution); + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_SETSCALE11); + } +} + +/* + * psmouse_activate() enables the mouse so that we get motion reports from it. + */ + +int psmouse_activate(struct psmouse *psmouse) +{ + if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) { + psmouse_warn(psmouse, "Failed to enable mouse on %s\n", + psmouse->ps2dev.serio->phys); + return -1; + } + + psmouse_set_state(psmouse, PSMOUSE_ACTIVATED); + return 0; +} + +/* + * psmouse_deactivate() puts the mouse into poll mode so that we don't get motion + * reports from it unless we explicitly request it. + */ + +int psmouse_deactivate(struct psmouse *psmouse) +{ + if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE)) { + psmouse_warn(psmouse, "Failed to deactivate mouse on %s\n", + psmouse->ps2dev.serio->phys); + return -1; + } + + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + return 0; +} + + +/* + * psmouse_resync() attempts to re-validate current protocol. + */ + +static void psmouse_resync(struct work_struct *work) +{ + struct psmouse *parent = NULL, *psmouse = + container_of(work, struct psmouse, resync_work.work); + struct serio *serio = psmouse->ps2dev.serio; + psmouse_ret_t rc = PSMOUSE_GOOD_DATA; + bool failed = false, enabled = false; + int i; + + mutex_lock(&psmouse_mutex); + + if (psmouse->state != PSMOUSE_RESYNCING) + goto out; + + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + psmouse_deactivate(parent); + } + +/* + * Some mice don't ACK commands sent while they are in the middle of + * transmitting motion packet. To avoid delay we use ps2_sendbyte() + * instead of ps2_command() which would wait for 200ms for an ACK + * that may never come. + * As an additional quirk ALPS touchpads may not only forget to ACK + * disable command but will stop reporting taps, so if we see that + * mouse at least once ACKs disable we will do full reconnect if ACK + * is missing. + */ + psmouse->num_resyncs++; + + if (ps2_sendbyte(&psmouse->ps2dev, PSMOUSE_CMD_DISABLE, 20)) { + if (psmouse->num_resyncs < 3 || psmouse->acks_disable_command) + failed = true; + } else + psmouse->acks_disable_command = true; + +/* + * Poll the mouse. If it was reset the packet will be shorter than + * psmouse->pktsize and ps2_command will fail. We do not expect and + * do not handle scenario when mouse "upgrades" its protocol while + * disconnected since it would require additional delay. If we ever + * see a mouse that does it we'll adjust the code. + */ + if (!failed) { + if (psmouse->poll(psmouse)) + failed = true; + else { + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + for (i = 0; i < psmouse->pktsize; i++) { + psmouse->pktcnt++; + rc = psmouse->protocol_handler(psmouse); + if (rc != PSMOUSE_GOOD_DATA) + break; + } + if (rc != PSMOUSE_FULL_PACKET) + failed = true; + psmouse_set_state(psmouse, PSMOUSE_RESYNCING); + } + } +/* + * Now try to enable mouse. We try to do that even if poll failed and also + * repeat our attempts 5 times, otherwise we may be left out with disabled + * mouse. + */ + for (i = 0; i < 5; i++) { + if (!ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) { + enabled = true; + break; + } + msleep(200); + } + + if (!enabled) { + psmouse_warn(psmouse, "failed to re-enable mouse on %s\n", + psmouse->ps2dev.serio->phys); + failed = true; + } + + if (failed) { + psmouse_set_state(psmouse, PSMOUSE_IGNORE); + psmouse_info(psmouse, + "resync failed, issuing reconnect request\n"); + serio_reconnect(serio); + } else + psmouse_set_state(psmouse, PSMOUSE_ACTIVATED); + + if (parent) + psmouse_activate(parent); + out: + mutex_unlock(&psmouse_mutex); +} + +/* + * psmouse_cleanup() resets the mouse into power-on state. + */ + +static void psmouse_cleanup(struct serio *serio) +{ + struct psmouse *psmouse = serio_get_drvdata(serio); + struct psmouse *parent = NULL; + + mutex_lock(&psmouse_mutex); + + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + psmouse_deactivate(parent); + } + + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + /* + * Disable stream mode so cleanup routine can proceed undisturbed. + */ + if (ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_DISABLE)) + psmouse_warn(psmouse, "Failed to disable mouse on %s\n", + psmouse->ps2dev.serio->phys); + + if (psmouse->cleanup) + psmouse->cleanup(psmouse); + +/* + * Reset the mouse to defaults (bare PS/2 protocol). + */ + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); + +/* + * Some boxes, such as HP nx7400, get terribly confused if mouse + * is not fully enabled before suspending/shutting down. + */ + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE); + + if (parent) { + if (parent->pt_deactivate) + parent->pt_deactivate(parent); + + psmouse_activate(parent); + } + + mutex_unlock(&psmouse_mutex); +} + +/* + * psmouse_disconnect() closes and frees. + */ + +static void psmouse_disconnect(struct serio *serio) +{ + struct psmouse *psmouse, *parent = NULL; + + psmouse = serio_get_drvdata(serio); + + sysfs_remove_group(&serio->dev.kobj, &psmouse_attribute_group); + + mutex_lock(&psmouse_mutex); + + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + + /* make sure we don't have a resync in progress */ + mutex_unlock(&psmouse_mutex); + flush_workqueue(kpsmoused_wq); + mutex_lock(&psmouse_mutex); + + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + psmouse_deactivate(parent); + } + + if (psmouse->disconnect) + psmouse->disconnect(psmouse); + + if (parent && parent->pt_deactivate) + parent->pt_deactivate(parent); + + psmouse_set_state(psmouse, PSMOUSE_IGNORE); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(psmouse->dev); + kfree(psmouse); + + if (parent) + psmouse_activate(parent); + + mutex_unlock(&psmouse_mutex); +} + +static int psmouse_switch_protocol(struct psmouse *psmouse, + const struct psmouse_protocol *proto) +{ + const struct psmouse_protocol *selected_proto; + struct input_dev *input_dev = psmouse->dev; + + input_dev->dev.parent = &psmouse->ps2dev.serio->dev; + + if (proto && (proto->detect || proto->init)) { + psmouse_apply_defaults(psmouse); + + if (proto->detect && proto->detect(psmouse, true) < 0) + return -1; + + if (proto->init && proto->init(psmouse) < 0) + return -1; + + psmouse->type = proto->type; + selected_proto = proto; + } else { + psmouse->type = psmouse_extensions(psmouse, + psmouse_max_proto, true); + selected_proto = psmouse_protocol_by_type(psmouse->type); + } + + psmouse->ignore_parity = selected_proto->ignore_parity; + + /* + * If mouse's packet size is 3 there is no point in polling the + * device in hopes to detect protocol reset - we won't get less + * than 3 bytes response anyhow. + */ + if (psmouse->pktsize == 3) + psmouse->resync_time = 0; + + /* + * Some smart KVMs fake response to POLL command returning just + * 3 bytes and messing up our resync logic, so if initial poll + * fails we won't try polling the device anymore. Hopefully + * such KVM will maintain initially selected protocol. + */ + if (psmouse->resync_time && psmouse->poll(psmouse)) + psmouse->resync_time = 0; + + snprintf(psmouse->devname, sizeof(psmouse->devname), "%s %s %s", + selected_proto->name, psmouse->vendor, psmouse->name); + + input_dev->name = psmouse->devname; + input_dev->phys = psmouse->phys; + input_dev->id.bustype = BUS_I8042; + input_dev->id.vendor = 0x0002; + input_dev->id.product = psmouse->type; + input_dev->id.version = psmouse->model; + + return 0; +} + +/* + * psmouse_connect() is a callback from the serio module when + * an unhandled serio port is found. + */ +static int psmouse_connect(struct serio *serio, struct serio_driver *drv) +{ + struct psmouse *psmouse, *parent = NULL; + struct input_dev *input_dev; + int retval = 0, error = -ENOMEM; + + mutex_lock(&psmouse_mutex); + + /* + * If this is a pass-through port deactivate parent so the device + * connected to this port can be successfully identified + */ + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + psmouse_deactivate(parent); + } + + psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!psmouse || !input_dev) + goto err_free; + + ps2_init(&psmouse->ps2dev, serio); + INIT_DELAYED_WORK(&psmouse->resync_work, psmouse_resync); + psmouse->dev = input_dev; + snprintf(psmouse->phys, sizeof(psmouse->phys), "%s/input0", serio->phys); + + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + serio_set_drvdata(serio, psmouse); + + error = serio_open(serio, drv); + if (error) + goto err_clear_drvdata; + + if (psmouse_probe(psmouse) < 0) { + error = -ENODEV; + goto err_close_serio; + } + + psmouse->rate = psmouse_rate; + psmouse->resolution = psmouse_resolution; + psmouse->resetafter = psmouse_resetafter; + psmouse->resync_time = parent ? 0 : psmouse_resync_time; + psmouse->smartscroll = psmouse_smartscroll; + + psmouse_switch_protocol(psmouse, NULL); + + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + psmouse_initialize(psmouse); + + error = input_register_device(psmouse->dev); + if (error) + goto err_protocol_disconnect; + + if (parent && parent->pt_activate) + parent->pt_activate(parent); + + error = sysfs_create_group(&serio->dev.kobj, &psmouse_attribute_group); + if (error) + goto err_pt_deactivate; + + psmouse_activate(psmouse); + + out: + /* If this is a pass-through port the parent needs to be re-activated */ + if (parent) + psmouse_activate(parent); + + mutex_unlock(&psmouse_mutex); + return retval; + + err_pt_deactivate: + if (parent && parent->pt_deactivate) + parent->pt_deactivate(parent); + input_unregister_device(psmouse->dev); + input_dev = NULL; /* so we don't try to free it below */ + err_protocol_disconnect: + if (psmouse->disconnect) + psmouse->disconnect(psmouse); + psmouse_set_state(psmouse, PSMOUSE_IGNORE); + err_close_serio: + serio_close(serio); + err_clear_drvdata: + serio_set_drvdata(serio, NULL); + err_free: + input_free_device(input_dev); + kfree(psmouse); + + retval = error; + goto out; +} + + +static int psmouse_reconnect(struct serio *serio) +{ + struct psmouse *psmouse = serio_get_drvdata(serio); + struct psmouse *parent = NULL; + struct serio_driver *drv = serio->drv; + unsigned char type; + int rc = -1; + + if (!drv || !psmouse) { + psmouse_dbg(psmouse, + "reconnect request, but serio is disconnected, ignoring...\n"); + return -1; + } + + mutex_lock(&psmouse_mutex); + + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + psmouse_deactivate(parent); + } + + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + if (psmouse->reconnect) { + if (psmouse->reconnect(psmouse)) + goto out; + } else { + psmouse_reset(psmouse); + + if (psmouse_probe(psmouse) < 0) + goto out; + + type = psmouse_extensions(psmouse, psmouse_max_proto, false); + if (psmouse->type != type) + goto out; + } + + /* + * OK, the device type (and capabilities) match the old one, + * we can continue using it, complete initialization + */ + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + + psmouse_initialize(psmouse); + + if (parent && parent->pt_activate) + parent->pt_activate(parent); + + psmouse_activate(psmouse); + rc = 0; + +out: + /* If this is a pass-through port the parent waits to be activated */ + if (parent) + psmouse_activate(parent); + + mutex_unlock(&psmouse_mutex); + return rc; +} + +static struct serio_device_id psmouse_serio_ids[] = { + { + .type = SERIO_8042, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_PS_PSTHRU, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, psmouse_serio_ids); + +static struct serio_driver psmouse_drv = { + .driver = { + .name = "psmouse", + }, + .description = DRIVER_DESC, + .id_table = psmouse_serio_ids, + .interrupt = psmouse_interrupt, + .connect = psmouse_connect, + .reconnect = psmouse_reconnect, + .disconnect = psmouse_disconnect, + .cleanup = psmouse_cleanup, +}; + +ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *devattr, + char *buf) +{ + struct serio *serio = to_serio_port(dev); + struct psmouse_attribute *attr = to_psmouse_attr(devattr); + struct psmouse *psmouse; + + psmouse = serio_get_drvdata(serio); + + return attr->show(psmouse, attr->data, buf); +} + +ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct serio *serio = to_serio_port(dev); + struct psmouse_attribute *attr = to_psmouse_attr(devattr); + struct psmouse *psmouse, *parent = NULL; + int retval; + + retval = mutex_lock_interruptible(&psmouse_mutex); + if (retval) + goto out; + + psmouse = serio_get_drvdata(serio); + + if (attr->protect) { + if (psmouse->state == PSMOUSE_IGNORE) { + retval = -ENODEV; + goto out_unlock; + } + + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + psmouse_deactivate(parent); + } + + psmouse_deactivate(psmouse); + } + + retval = attr->set(psmouse, attr->data, buf, count); + + if (attr->protect) { + if (retval != -ENODEV) + psmouse_activate(psmouse); + + if (parent) + psmouse_activate(parent); + } + + out_unlock: + mutex_unlock(&psmouse_mutex); + out: + return retval; +} + +static ssize_t psmouse_show_int_attr(struct psmouse *psmouse, void *offset, char *buf) +{ + unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset); + + return sprintf(buf, "%u\n", *field); +} + +static ssize_t psmouse_set_int_attr(struct psmouse *psmouse, void *offset, const char *buf, size_t count) +{ + unsigned int *field = (unsigned int *)((char *)psmouse + (size_t)offset); + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + *field = value; + + return count; +} + +static ssize_t psmouse_attr_show_protocol(struct psmouse *psmouse, void *data, char *buf) +{ + return sprintf(buf, "%s\n", psmouse_protocol_by_type(psmouse->type)->name); +} + +static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, const char *buf, size_t count) +{ + struct serio *serio = psmouse->ps2dev.serio; + struct psmouse *parent = NULL; + struct input_dev *old_dev, *new_dev; + const struct psmouse_protocol *proto, *old_proto; + int error; + int retry = 0; + + proto = psmouse_protocol_by_name(buf, count); + if (!proto) + return -EINVAL; + + if (psmouse->type == proto->type) + return count; + + new_dev = input_allocate_device(); + if (!new_dev) + return -ENOMEM; + + while (!list_empty(&serio->children)) { + if (++retry > 3) { + psmouse_warn(psmouse, + "failed to destroy children ports, protocol change aborted.\n"); + input_free_device(new_dev); + return -EIO; + } + + mutex_unlock(&psmouse_mutex); + serio_unregister_child_port(serio); + mutex_lock(&psmouse_mutex); + + if (serio->drv != &psmouse_drv) { + input_free_device(new_dev); + return -ENODEV; + } + + if (psmouse->type == proto->type) { + input_free_device(new_dev); + return count; /* switched by other thread */ + } + } + + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { + parent = serio_get_drvdata(serio->parent); + if (parent->pt_deactivate) + parent->pt_deactivate(parent); + } + + old_dev = psmouse->dev; + old_proto = psmouse_protocol_by_type(psmouse->type); + + if (psmouse->disconnect) + psmouse->disconnect(psmouse); + + psmouse_set_state(psmouse, PSMOUSE_IGNORE); + + psmouse->dev = new_dev; + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + + if (psmouse_switch_protocol(psmouse, proto) < 0) { + psmouse_reset(psmouse); + /* default to PSMOUSE_PS2 */ + psmouse_switch_protocol(psmouse, &psmouse_protocols[0]); + } + + psmouse_initialize(psmouse); + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + + error = input_register_device(psmouse->dev); + if (error) { + if (psmouse->disconnect) + psmouse->disconnect(psmouse); + + psmouse_set_state(psmouse, PSMOUSE_IGNORE); + input_free_device(new_dev); + psmouse->dev = old_dev; + psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); + psmouse_switch_protocol(psmouse, old_proto); + psmouse_initialize(psmouse); + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); + + return error; + } + + input_unregister_device(old_dev); + + if (parent && parent->pt_activate) + parent->pt_activate(parent); + + return count; +} + +static ssize_t psmouse_attr_set_rate(struct psmouse *psmouse, void *data, const char *buf, size_t count) +{ + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + psmouse->set_rate(psmouse, value); + return count; +} + +static ssize_t psmouse_attr_set_resolution(struct psmouse *psmouse, void *data, const char *buf, size_t count) +{ + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + psmouse->set_resolution(psmouse, value); + return count; +} + + +static int psmouse_set_maxproto(const char *val, const struct kernel_param *kp) +{ + const struct psmouse_protocol *proto; + + if (!val) + return -EINVAL; + + proto = psmouse_protocol_by_name(val, strlen(val)); + + if (!proto || !proto->maxproto) + return -EINVAL; + + *((unsigned int *)kp->arg) = proto->type; + + return 0; +} + +static int psmouse_get_maxproto(char *buffer, const struct kernel_param *kp) +{ + int type = *((unsigned int *)kp->arg); + + return sprintf(buffer, "%s", psmouse_protocol_by_type(type)->name); +} + +static int __init psmouse_init(void) +{ + int err; + + lifebook_module_init(); + synaptics_module_init(); + hgpk_module_init(); + + kpsmoused_wq = create_singlethread_workqueue("kpsmoused"); + if (!kpsmoused_wq) { + pr_err("failed to create kpsmoused workqueue\n"); + return -ENOMEM; + } + + err = serio_register_driver(&psmouse_drv); + if (err) + destroy_workqueue(kpsmoused_wq); + + return err; +} + +static void __exit psmouse_exit(void) +{ + serio_unregister_driver(&psmouse_drv); + destroy_workqueue(kpsmoused_wq); +} + +module_init(psmouse_init); +module_exit(psmouse_exit); diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h new file mode 100644 index 00000000..2f0b39d5 --- /dev/null +++ b/drivers/input/mouse/psmouse.h @@ -0,0 +1,184 @@ +#ifndef _PSMOUSE_H +#define _PSMOUSE_H + +#define PSMOUSE_CMD_SETSCALE11 0x00e6 +#define PSMOUSE_CMD_SETSCALE21 0x00e7 +#define PSMOUSE_CMD_SETRES 0x10e8 +#define PSMOUSE_CMD_GETINFO 0x03e9 +#define PSMOUSE_CMD_SETSTREAM 0x00ea +#define PSMOUSE_CMD_SETPOLL 0x00f0 +#define PSMOUSE_CMD_POLL 0x00eb /* caller sets number of bytes to receive */ +#define PSMOUSE_CMD_RESET_WRAP 0x00ec +#define PSMOUSE_CMD_GETID 0x02f2 +#define PSMOUSE_CMD_SETRATE 0x10f3 +#define PSMOUSE_CMD_ENABLE 0x00f4 +#define PSMOUSE_CMD_DISABLE 0x00f5 +#define PSMOUSE_CMD_RESET_DIS 0x00f6 +#define PSMOUSE_CMD_RESET_BAT 0x02ff + +#define PSMOUSE_RET_BAT 0xaa +#define PSMOUSE_RET_ID 0x00 +#define PSMOUSE_RET_ACK 0xfa +#define PSMOUSE_RET_NAK 0xfe + +enum psmouse_state { + PSMOUSE_IGNORE, + PSMOUSE_INITIALIZING, + PSMOUSE_RESYNCING, + PSMOUSE_CMD_MODE, + PSMOUSE_ACTIVATED, +}; + +/* psmouse protocol handler return codes */ +typedef enum { + PSMOUSE_BAD_DATA, + PSMOUSE_GOOD_DATA, + PSMOUSE_FULL_PACKET +} psmouse_ret_t; + +struct psmouse { + void *private; + struct input_dev *dev; + struct ps2dev ps2dev; + struct delayed_work resync_work; + char *vendor; + char *name; + unsigned char packet[8]; + unsigned char badbyte; + unsigned char pktcnt; + unsigned char pktsize; + unsigned char type; + bool ignore_parity; + bool acks_disable_command; + unsigned int model; + unsigned long last; + unsigned long out_of_sync_cnt; + unsigned long num_resyncs; + enum psmouse_state state; + char devname[64]; + char phys[32]; + + unsigned int rate; + unsigned int resolution; + unsigned int resetafter; + unsigned int resync_time; + bool smartscroll; /* Logitech only */ + + psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse); + void (*set_rate)(struct psmouse *psmouse, unsigned int rate); + void (*set_resolution)(struct psmouse *psmouse, unsigned int resolution); + + int (*reconnect)(struct psmouse *psmouse); + void (*disconnect)(struct psmouse *psmouse); + void (*cleanup)(struct psmouse *psmouse); + int (*poll)(struct psmouse *psmouse); + + void (*pt_activate)(struct psmouse *psmouse); + void (*pt_deactivate)(struct psmouse *psmouse); +}; + +enum psmouse_type { + PSMOUSE_NONE, + PSMOUSE_PS2, + PSMOUSE_PS2PP, + PSMOUSE_THINKPS, + PSMOUSE_GENPS, + PSMOUSE_IMPS, + PSMOUSE_IMEX, + PSMOUSE_SYNAPTICS, + PSMOUSE_ALPS, + PSMOUSE_LIFEBOOK, + PSMOUSE_TRACKPOINT, + PSMOUSE_TOUCHKIT_PS2, + PSMOUSE_CORTRON, + PSMOUSE_HGPK, + PSMOUSE_ELANTECH, + PSMOUSE_FSP, + PSMOUSE_SYNAPTICS_RELATIVE, + PSMOUSE_CYPRESS, + PSMOUSE_AUTO /* This one should always be last */ +}; + +void psmouse_queue_work(struct psmouse *psmouse, struct delayed_work *work, + unsigned long delay); +int psmouse_sliced_command(struct psmouse *psmouse, unsigned char command); +int psmouse_reset(struct psmouse *psmouse); +void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state); +void psmouse_set_resolution(struct psmouse *psmouse, unsigned int resolution); +psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse); +int psmouse_activate(struct psmouse *psmouse); +int psmouse_deactivate(struct psmouse *psmouse); + +struct psmouse_attribute { + struct device_attribute dattr; + void *data; + ssize_t (*show)(struct psmouse *psmouse, void *data, char *buf); + ssize_t (*set)(struct psmouse *psmouse, void *data, + const char *buf, size_t count); + bool protect; +}; +#define to_psmouse_attr(a) container_of((a), struct psmouse_attribute, dattr) + +ssize_t psmouse_attr_show_helper(struct device *dev, struct device_attribute *attr, + char *buf); +ssize_t psmouse_attr_set_helper(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); + +#define __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect) \ +static struct psmouse_attribute psmouse_attr_##_name = { \ + .dattr = { \ + .attr = { \ + .name = __stringify(_name), \ + .mode = _mode, \ + }, \ + .show = psmouse_attr_show_helper, \ + .store = psmouse_attr_set_helper, \ + }, \ + .data = _data, \ + .show = _show, \ + .set = _set, \ + .protect = _protect, \ +} + +#define __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, _protect) \ + static ssize_t _show(struct psmouse *, void *, char *); \ + static ssize_t _set(struct psmouse *, void *, const char *, size_t); \ + __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, _set, _protect) + +#define PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set) \ + __PSMOUSE_DEFINE_ATTR(_name, _mode, _data, _show, _set, true) + +#define PSMOUSE_DEFINE_RO_ATTR(_name, _mode, _data, _show) \ + static ssize_t _show(struct psmouse *, void *, char *); \ + __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, _show, NULL, true) + +#define PSMOUSE_DEFINE_WO_ATTR(_name, _mode, _data, _set) \ + static ssize_t _set(struct psmouse *, void *, const char *, size_t); \ + __PSMOUSE_DEFINE_ATTR_VAR(_name, _mode, _data, NULL, _set, true) + +#ifndef psmouse_fmt +#define psmouse_fmt(fmt) KBUILD_BASENAME ": " fmt +#endif + +#define psmouse_dbg(psmouse, format, ...) \ + dev_dbg(&(psmouse)->ps2dev.serio->dev, \ + psmouse_fmt(format), ##__VA_ARGS__) +#define psmouse_info(psmouse, format, ...) \ + dev_info(&(psmouse)->ps2dev.serio->dev, \ + psmouse_fmt(format), ##__VA_ARGS__) +#define psmouse_warn(psmouse, format, ...) \ + dev_warn(&(psmouse)->ps2dev.serio->dev, \ + psmouse_fmt(format), ##__VA_ARGS__) +#define psmouse_err(psmouse, format, ...) \ + dev_err(&(psmouse)->ps2dev.serio->dev, \ + psmouse_fmt(format), ##__VA_ARGS__) +#define psmouse_notice(psmouse, format, ...) \ + dev_notice(&(psmouse)->ps2dev.serio->dev, \ + psmouse_fmt(format), ##__VA_ARGS__) +#define psmouse_printk(level, psmouse, format, ...) \ + dev_printk(level, \ + &(psmouse)->ps2dev.serio->dev, \ + psmouse_fmt(format), ##__VA_ARGS__) + + +#endif /* _PSMOUSE_H */ diff --git a/drivers/input/mouse/pxa930_trkball.c b/drivers/input/mouse/pxa930_trkball.c new file mode 100644 index 00000000..0ecb9e79 --- /dev/null +++ b/drivers/input/mouse/pxa930_trkball.c @@ -0,0 +1,257 @@ +/* + * PXA930 track ball mouse driver + * + * Copyright (C) 2007 Marvell International Ltd. + * 2008-02-28: Yong Yao + * initial version + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +/* Trackball Controller Register Definitions */ +#define TBCR (0x000C) +#define TBCNTR (0x0010) +#define TBSBC (0x0014) + +#define TBCR_TBRST (1 << 1) +#define TBCR_TBSB (1 << 10) + +#define TBCR_Y_FLT(n) (((n) & 0xf) << 6) +#define TBCR_X_FLT(n) (((n) & 0xf) << 2) + +#define TBCNTR_YM(n) (((n) >> 24) & 0xff) +#define TBCNTR_YP(n) (((n) >> 16) & 0xff) +#define TBCNTR_XM(n) (((n) >> 8) & 0xff) +#define TBCNTR_XP(n) ((n) & 0xff) + +#define TBSBC_TBSBC (0x1) + +struct pxa930_trkball { + struct pxa930_trkball_platform_data *pdata; + + /* Memory Mapped Register */ + struct resource *mem; + void __iomem *mmio_base; + + struct input_dev *input; +}; + +static irqreturn_t pxa930_trkball_interrupt(int irq, void *dev_id) +{ + struct pxa930_trkball *trkball = dev_id; + struct input_dev *input = trkball->input; + int tbcntr, x, y; + + /* According to the spec software must read TBCNTR twice: + * if the read value is the same, the reading is valid + */ + tbcntr = __raw_readl(trkball->mmio_base + TBCNTR); + + if (tbcntr == __raw_readl(trkball->mmio_base + TBCNTR)) { + x = (TBCNTR_XP(tbcntr) - TBCNTR_XM(tbcntr)) / 2; + y = (TBCNTR_YP(tbcntr) - TBCNTR_YM(tbcntr)) / 2; + + input_report_rel(input, REL_X, x); + input_report_rel(input, REL_Y, y); + input_sync(input); + } + + __raw_writel(TBSBC_TBSBC, trkball->mmio_base + TBSBC); + __raw_writel(0, trkball->mmio_base + TBSBC); + + return IRQ_HANDLED; +} + +/* For TBCR, we need to wait for a while to make sure it has been modified. */ +static int write_tbcr(struct pxa930_trkball *trkball, int v) +{ + int i = 100; + + __raw_writel(v, trkball->mmio_base + TBCR); + + while (--i) { + if (__raw_readl(trkball->mmio_base + TBCR) == v) + break; + msleep(1); + } + + if (i == 0) { + pr_err("%s: timed out writing TBCR(%x)!\n", __func__, v); + return -ETIMEDOUT; + } + + return 0; +} + +static void pxa930_trkball_config(struct pxa930_trkball *trkball) +{ + uint32_t tbcr; + + /* According to spec, need to write the filters of x,y to 0xf first! */ + tbcr = __raw_readl(trkball->mmio_base + TBCR); + write_tbcr(trkball, tbcr | TBCR_X_FLT(0xf) | TBCR_Y_FLT(0xf)); + write_tbcr(trkball, TBCR_X_FLT(trkball->pdata->x_filter) | + TBCR_Y_FLT(trkball->pdata->y_filter)); + + /* According to spec, set TBCR_TBRST first, before clearing it! */ + tbcr = __raw_readl(trkball->mmio_base + TBCR); + write_tbcr(trkball, tbcr | TBCR_TBRST); + write_tbcr(trkball, tbcr & ~TBCR_TBRST); + + __raw_writel(TBSBC_TBSBC, trkball->mmio_base + TBSBC); + __raw_writel(0, trkball->mmio_base + TBSBC); + + pr_debug("%s: final TBCR=%x!\n", __func__, + __raw_readl(trkball->mmio_base + TBCR)); +} + +static int pxa930_trkball_open(struct input_dev *dev) +{ + struct pxa930_trkball *trkball = input_get_drvdata(dev); + + pxa930_trkball_config(trkball); + + return 0; +} + +static void pxa930_trkball_disable(struct pxa930_trkball *trkball) +{ + uint32_t tbcr = __raw_readl(trkball->mmio_base + TBCR); + + /* Held in reset, gate the 32-KHz input clock off */ + write_tbcr(trkball, tbcr | TBCR_TBRST); +} + +static void pxa930_trkball_close(struct input_dev *dev) +{ + struct pxa930_trkball *trkball = input_get_drvdata(dev); + + pxa930_trkball_disable(trkball); +} + +static int pxa930_trkball_probe(struct platform_device *pdev) +{ + struct pxa930_trkball *trkball; + struct input_dev *input; + struct resource *res; + int irq, error; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "failed to get trkball irq\n"); + return -ENXIO; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "failed to get register memory\n"); + return -ENXIO; + } + + trkball = kzalloc(sizeof(struct pxa930_trkball), GFP_KERNEL); + if (!trkball) + return -ENOMEM; + + trkball->pdata = pdev->dev.platform_data; + if (!trkball->pdata) { + dev_err(&pdev->dev, "no platform data defined\n"); + error = -EINVAL; + goto failed; + } + + trkball->mmio_base = ioremap_nocache(res->start, resource_size(res)); + if (!trkball->mmio_base) { + dev_err(&pdev->dev, "failed to ioremap registers\n"); + error = -ENXIO; + goto failed; + } + + /* held the module in reset, will be enabled in open() */ + pxa930_trkball_disable(trkball); + + error = request_irq(irq, pxa930_trkball_interrupt, 0, + pdev->name, trkball); + if (error) { + dev_err(&pdev->dev, "failed to request irq: %d\n", error); + goto failed_free_io; + } + + platform_set_drvdata(pdev, trkball); + + input = input_allocate_device(); + if (!input) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + error = -ENOMEM; + goto failed_free_irq; + } + + input->name = pdev->name; + input->id.bustype = BUS_HOST; + input->open = pxa930_trkball_open; + input->close = pxa930_trkball_close; + input->dev.parent = &pdev->dev; + input_set_drvdata(input, trkball); + + trkball->input = input; + + input_set_capability(input, EV_REL, REL_X); + input_set_capability(input, EV_REL, REL_Y); + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, "unable to register input device\n"); + goto failed_free_input; + } + + return 0; + +failed_free_input: + input_free_device(input); +failed_free_irq: + free_irq(irq, trkball); +failed_free_io: + iounmap(trkball->mmio_base); +failed: + kfree(trkball); + return error; +} + +static int pxa930_trkball_remove(struct platform_device *pdev) +{ + struct pxa930_trkball *trkball = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); + + input_unregister_device(trkball->input); + free_irq(irq, trkball); + iounmap(trkball->mmio_base); + kfree(trkball); + + return 0; +} + +static struct platform_driver pxa930_trkball_driver = { + .driver = { + .name = "pxa930-trkball", + }, + .probe = pxa930_trkball_probe, + .remove = pxa930_trkball_remove, +}; +module_platform_driver(pxa930_trkball_driver); + +MODULE_AUTHOR("Yong Yao "); +MODULE_DESCRIPTION("PXA930 Trackball Mouse Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/mouse/rpcmouse.c b/drivers/input/mouse/rpcmouse.c new file mode 100644 index 00000000..21c60fea --- /dev/null +++ b/drivers/input/mouse/rpcmouse.c @@ -0,0 +1,116 @@ +/* + * Acorn RiscPC mouse driver for Linux/ARM + * + * Copyright (c) 2000-2002 Vojtech Pavlik + * Copyright (C) 1996-2002 Russell King + * + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * This handles the Acorn RiscPCs mouse. We basically have a couple of + * hardware registers that track the sensor count for the X-Y movement and + * another register holding the button state. On every VSYNC interrupt we read + * the complete state and then work out if something has changed. + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik, Russell King"); +MODULE_DESCRIPTION("Acorn RiscPC mouse driver"); +MODULE_LICENSE("GPL"); + +static short rpcmouse_lastx, rpcmouse_lasty; +static struct input_dev *rpcmouse_dev; + +static irqreturn_t rpcmouse_irq(int irq, void *dev_id) +{ + struct input_dev *dev = dev_id; + short x, y, dx, dy, b; + + x = (short) iomd_readl(IOMD_MOUSEX); + y = (short) iomd_readl(IOMD_MOUSEY); + b = (short) (__raw_readl(IOMEM(0xe0310000)) ^ 0x70); + + dx = x - rpcmouse_lastx; + dy = y - rpcmouse_lasty; + + rpcmouse_lastx = x; + rpcmouse_lasty = y; + + input_report_rel(dev, REL_X, dx); + input_report_rel(dev, REL_Y, -dy); + + input_report_key(dev, BTN_LEFT, b & 0x40); + input_report_key(dev, BTN_MIDDLE, b & 0x20); + input_report_key(dev, BTN_RIGHT, b & 0x10); + + input_sync(dev); + + return IRQ_HANDLED; +} + + +static int __init rpcmouse_init(void) +{ + int err; + + rpcmouse_dev = input_allocate_device(); + if (!rpcmouse_dev) + return -ENOMEM; + + rpcmouse_dev->name = "Acorn RiscPC Mouse"; + rpcmouse_dev->phys = "rpcmouse/input0"; + rpcmouse_dev->id.bustype = BUS_HOST; + rpcmouse_dev->id.vendor = 0x0005; + rpcmouse_dev->id.product = 0x0001; + rpcmouse_dev->id.version = 0x0100; + + rpcmouse_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + rpcmouse_dev->keybit[BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + rpcmouse_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + + rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX); + rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY); + + if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, IRQF_SHARED, "rpcmouse", rpcmouse_dev)) { + printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n"); + err = -EBUSY; + goto err_free_dev; + } + + err = input_register_device(rpcmouse_dev); + if (err) + goto err_free_irq; + + return 0; + + err_free_irq: + free_irq(IRQ_VSYNCPULSE, rpcmouse_dev); + err_free_dev: + input_free_device(rpcmouse_dev); + + return err; +} + +static void __exit rpcmouse_exit(void) +{ + free_irq(IRQ_VSYNCPULSE, rpcmouse_dev); + input_unregister_device(rpcmouse_dev); +} + +module_init(rpcmouse_init); +module_exit(rpcmouse_exit); diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c new file mode 100644 index 00000000..cc7e0d4a --- /dev/null +++ b/drivers/input/mouse/sentelic.c @@ -0,0 +1,1087 @@ +/*- + * Finger Sensing Pad PS/2 mouse driver. + * + * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. + * Copyright (C) 2005-2012 Tai-hwa Liang, Sentelic Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "psmouse.h" +#include "sentelic.h" + +/* + * Timeout for FSP PS/2 command only (in milliseconds). + */ +#define FSP_CMD_TIMEOUT 200 +#define FSP_CMD_TIMEOUT2 30 + +#define GET_ABS_X(packet) ((packet[1] << 2) | ((packet[3] >> 2) & 0x03)) +#define GET_ABS_Y(packet) ((packet[2] << 2) | (packet[3] & 0x03)) + +/** Driver version. */ +static const char fsp_drv_ver[] = "1.1.0-K"; + +/* + * Make sure that the value being sent to FSP will not conflict with + * possible sample rate values. + */ +static unsigned char fsp_test_swap_cmd(unsigned char reg_val) +{ + switch (reg_val) { + case 10: case 20: case 40: case 60: case 80: case 100: case 200: + /* + * The requested value being sent to FSP matched to possible + * sample rates, swap the given value such that the hardware + * wouldn't get confused. + */ + return (reg_val >> 4) | (reg_val << 4); + default: + return reg_val; /* swap isn't necessary */ + } +} + +/* + * Make sure that the value being sent to FSP will not conflict with certain + * commands. + */ +static unsigned char fsp_test_invert_cmd(unsigned char reg_val) +{ + switch (reg_val) { + case 0xe9: case 0xee: case 0xf2: case 0xff: + /* + * The requested value being sent to FSP matched to certain + * commands, inverse the given value such that the hardware + * wouldn't get confused. + */ + return ~reg_val; + default: + return reg_val; /* inversion isn't necessary */ + } +} + +static int fsp_reg_read(struct psmouse *psmouse, int reg_addr, int *reg_val) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[3]; + unsigned char addr; + int rc = -1; + + /* + * We need to shut off the device and switch it into command + * mode so we don't confuse our protocol handler. We don't need + * to do that for writes because sysfs set helper does this for + * us. + */ + psmouse_deactivate(psmouse); + + ps2_begin_command(ps2dev); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + /* should return 0xfe(request for resending) */ + ps2_sendbyte(ps2dev, 0x66, FSP_CMD_TIMEOUT2); + /* should return 0xfc(failed) */ + ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + if ((addr = fsp_test_invert_cmd(reg_addr)) != reg_addr) { + ps2_sendbyte(ps2dev, 0x68, FSP_CMD_TIMEOUT2); + } else if ((addr = fsp_test_swap_cmd(reg_addr)) != reg_addr) { + /* swapping is required */ + ps2_sendbyte(ps2dev, 0xcc, FSP_CMD_TIMEOUT2); + /* expect 0xfe */ + } else { + /* swapping isn't necessary */ + ps2_sendbyte(ps2dev, 0x66, FSP_CMD_TIMEOUT2); + /* expect 0xfe */ + } + /* should return 0xfc(failed) */ + ps2_sendbyte(ps2dev, addr, FSP_CMD_TIMEOUT); + + if (__ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO) < 0) + goto out; + + *reg_val = param[2]; + rc = 0; + + out: + ps2_end_command(ps2dev); + psmouse_activate(psmouse); + psmouse_dbg(psmouse, + "READ REG: 0x%02x is 0x%02x (rc = %d)\n", + reg_addr, *reg_val, rc); + return rc; +} + +static int fsp_reg_write(struct psmouse *psmouse, int reg_addr, int reg_val) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char v; + int rc = -1; + + ps2_begin_command(ps2dev); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + if ((v = fsp_test_invert_cmd(reg_addr)) != reg_addr) { + /* inversion is required */ + ps2_sendbyte(ps2dev, 0x74, FSP_CMD_TIMEOUT2); + } else { + if ((v = fsp_test_swap_cmd(reg_addr)) != reg_addr) { + /* swapping is required */ + ps2_sendbyte(ps2dev, 0x77, FSP_CMD_TIMEOUT2); + } else { + /* swapping isn't necessary */ + ps2_sendbyte(ps2dev, 0x55, FSP_CMD_TIMEOUT2); + } + } + /* write the register address in correct order */ + ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) { + /* inversion is required */ + ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2); + } else if ((v = fsp_test_swap_cmd(reg_val)) != reg_val) { + /* swapping is required */ + ps2_sendbyte(ps2dev, 0x44, FSP_CMD_TIMEOUT2); + } else { + /* swapping isn't necessary */ + ps2_sendbyte(ps2dev, 0x33, FSP_CMD_TIMEOUT2); + } + + /* write the register value in correct order */ + ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2); + rc = 0; + + out: + ps2_end_command(ps2dev); + psmouse_dbg(psmouse, + "WRITE REG: 0x%02x to 0x%02x (rc = %d)\n", + reg_addr, reg_val, rc); + return rc; +} + +/* Enable register clock gating for writing certain registers */ +static int fsp_reg_write_enable(struct psmouse *psmouse, bool enable) +{ + int v, nv; + + if (fsp_reg_read(psmouse, FSP_REG_SYSCTL1, &v) == -1) + return -1; + + if (enable) + nv = v | FSP_BIT_EN_REG_CLK; + else + nv = v & ~FSP_BIT_EN_REG_CLK; + + /* only write if necessary */ + if (nv != v) + if (fsp_reg_write(psmouse, FSP_REG_SYSCTL1, nv) == -1) + return -1; + + return 0; +} + +static int fsp_page_reg_read(struct psmouse *psmouse, int *reg_val) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[3]; + int rc = -1; + + psmouse_deactivate(psmouse); + + ps2_begin_command(ps2dev); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + ps2_sendbyte(ps2dev, 0x66, FSP_CMD_TIMEOUT2); + ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + ps2_sendbyte(ps2dev, 0x83, FSP_CMD_TIMEOUT2); + ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2); + + /* get the returned result */ + if (__ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) + goto out; + + *reg_val = param[2]; + rc = 0; + + out: + ps2_end_command(ps2dev); + psmouse_activate(psmouse); + psmouse_dbg(psmouse, + "READ PAGE REG: 0x%02x (rc = %d)\n", + *reg_val, rc); + return rc; +} + +static int fsp_page_reg_write(struct psmouse *psmouse, int reg_val) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char v; + int rc = -1; + + ps2_begin_command(ps2dev); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + ps2_sendbyte(ps2dev, 0x38, FSP_CMD_TIMEOUT2); + ps2_sendbyte(ps2dev, 0x88, FSP_CMD_TIMEOUT2); + + if (ps2_sendbyte(ps2dev, 0xf3, FSP_CMD_TIMEOUT) < 0) + goto out; + + if ((v = fsp_test_invert_cmd(reg_val)) != reg_val) { + ps2_sendbyte(ps2dev, 0x47, FSP_CMD_TIMEOUT2); + } else if ((v = fsp_test_swap_cmd(reg_val)) != reg_val) { + /* swapping is required */ + ps2_sendbyte(ps2dev, 0x44, FSP_CMD_TIMEOUT2); + } else { + /* swapping isn't necessary */ + ps2_sendbyte(ps2dev, 0x33, FSP_CMD_TIMEOUT2); + } + + ps2_sendbyte(ps2dev, v, FSP_CMD_TIMEOUT2); + rc = 0; + + out: + ps2_end_command(ps2dev); + psmouse_dbg(psmouse, + "WRITE PAGE REG: to 0x%02x (rc = %d)\n", + reg_val, rc); + return rc; +} + +static int fsp_get_version(struct psmouse *psmouse, int *version) +{ + if (fsp_reg_read(psmouse, FSP_REG_VERSION, version)) + return -EIO; + + return 0; +} + +static int fsp_get_revision(struct psmouse *psmouse, int *rev) +{ + if (fsp_reg_read(psmouse, FSP_REG_REVISION, rev)) + return -EIO; + + return 0; +} + +static int fsp_get_sn(struct psmouse *psmouse, int *sn) +{ + int v0, v1, v2; + int rc = -EIO; + + /* production number since Cx is available at: 0x0b40 ~ 0x0b42 */ + if (fsp_page_reg_write(psmouse, FSP_PAGE_0B)) + goto out; + if (fsp_reg_read(psmouse, FSP_REG_SN0, &v0)) + goto out; + if (fsp_reg_read(psmouse, FSP_REG_SN1, &v1)) + goto out; + if (fsp_reg_read(psmouse, FSP_REG_SN2, &v2)) + goto out; + *sn = (v0 << 16) | (v1 << 8) | v2; + rc = 0; +out: + fsp_page_reg_write(psmouse, FSP_PAGE_DEFAULT); + return rc; +} + +static int fsp_get_buttons(struct psmouse *psmouse, int *btn) +{ + static const int buttons[] = { + 0x16, /* Left/Middle/Right/Forward/Backward & Scroll Up/Down */ + 0x06, /* Left/Middle/Right & Scroll Up/Down/Right/Left */ + 0x04, /* Left/Middle/Right & Scroll Up/Down */ + 0x02, /* Left/Middle/Right */ + }; + int val; + + if (fsp_reg_read(psmouse, FSP_REG_TMOD_STATUS, &val) == -1) + return -EIO; + + *btn = buttons[(val & 0x30) >> 4]; + return 0; +} + +/* Enable on-pad command tag output */ +static int fsp_opc_tag_enable(struct psmouse *psmouse, bool enable) +{ + int v, nv; + int res = 0; + + if (fsp_reg_read(psmouse, FSP_REG_OPC_QDOWN, &v) == -1) { + psmouse_err(psmouse, "Unable get OPC state.\n"); + return -EIO; + } + + if (enable) + nv = v | FSP_BIT_EN_OPC_TAG; + else + nv = v & ~FSP_BIT_EN_OPC_TAG; + + /* only write if necessary */ + if (nv != v) { + fsp_reg_write_enable(psmouse, true); + res = fsp_reg_write(psmouse, FSP_REG_OPC_QDOWN, nv); + fsp_reg_write_enable(psmouse, false); + } + + if (res != 0) { + psmouse_err(psmouse, "Unable to enable OPC tag.\n"); + res = -EIO; + } + + return res; +} + +static int fsp_onpad_vscr(struct psmouse *psmouse, bool enable) +{ + struct fsp_data *pad = psmouse->private; + int val; + + if (fsp_reg_read(psmouse, FSP_REG_ONPAD_CTL, &val)) + return -EIO; + + pad->vscroll = enable; + + if (enable) + val |= (FSP_BIT_FIX_VSCR | FSP_BIT_ONPAD_ENABLE); + else + val &= ~FSP_BIT_FIX_VSCR; + + if (fsp_reg_write(psmouse, FSP_REG_ONPAD_CTL, val)) + return -EIO; + + return 0; +} + +static int fsp_onpad_hscr(struct psmouse *psmouse, bool enable) +{ + struct fsp_data *pad = psmouse->private; + int val, v2; + + if (fsp_reg_read(psmouse, FSP_REG_ONPAD_CTL, &val)) + return -EIO; + + if (fsp_reg_read(psmouse, FSP_REG_SYSCTL5, &v2)) + return -EIO; + + pad->hscroll = enable; + + if (enable) { + val |= (FSP_BIT_FIX_HSCR | FSP_BIT_ONPAD_ENABLE); + v2 |= FSP_BIT_EN_MSID6; + } else { + val &= ~FSP_BIT_FIX_HSCR; + v2 &= ~(FSP_BIT_EN_MSID6 | FSP_BIT_EN_MSID7 | FSP_BIT_EN_MSID8); + } + + if (fsp_reg_write(psmouse, FSP_REG_ONPAD_CTL, val)) + return -EIO; + + /* reconfigure horizontal scrolling packet output */ + if (fsp_reg_write(psmouse, FSP_REG_SYSCTL5, v2)) + return -EIO; + + return 0; +} + +/* + * Write device specific initial parameters. + * + * ex: 0xab 0xcd - write oxcd into register 0xab + */ +static ssize_t fsp_attr_set_setreg(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + int reg, val; + char *rest; + ssize_t retval; + + reg = simple_strtoul(buf, &rest, 16); + if (rest == buf || *rest != ' ' || reg > 0xff) + return -EINVAL; + + retval = kstrtoint(rest + 1, 16, &val); + if (retval) + return retval; + + if (val > 0xff) + return -EINVAL; + + if (fsp_reg_write_enable(psmouse, true)) + return -EIO; + + retval = fsp_reg_write(psmouse, reg, val) < 0 ? -EIO : count; + + fsp_reg_write_enable(psmouse, false); + + return count; +} + +PSMOUSE_DEFINE_WO_ATTR(setreg, S_IWUSR, NULL, fsp_attr_set_setreg); + +static ssize_t fsp_attr_show_getreg(struct psmouse *psmouse, + void *data, char *buf) +{ + struct fsp_data *pad = psmouse->private; + + return sprintf(buf, "%02x%02x\n", pad->last_reg, pad->last_val); +} + +/* + * Read a register from device. + * + * ex: 0xab -- read content from register 0xab + */ +static ssize_t fsp_attr_set_getreg(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + struct fsp_data *pad = psmouse->private; + int reg, val, err; + + err = kstrtoint(buf, 16, ®); + if (err) + return err; + + if (reg > 0xff) + return -EINVAL; + + if (fsp_reg_read(psmouse, reg, &val)) + return -EIO; + + pad->last_reg = reg; + pad->last_val = val; + + return count; +} + +PSMOUSE_DEFINE_ATTR(getreg, S_IWUSR | S_IRUGO, NULL, + fsp_attr_show_getreg, fsp_attr_set_getreg); + +static ssize_t fsp_attr_show_pagereg(struct psmouse *psmouse, + void *data, char *buf) +{ + int val = 0; + + if (fsp_page_reg_read(psmouse, &val)) + return -EIO; + + return sprintf(buf, "%02x\n", val); +} + +static ssize_t fsp_attr_set_pagereg(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + int val, err; + + err = kstrtoint(buf, 16, &val); + if (err) + return err; + + if (val > 0xff) + return -EINVAL; + + if (fsp_page_reg_write(psmouse, val)) + return -EIO; + + return count; +} + +PSMOUSE_DEFINE_ATTR(page, S_IWUSR | S_IRUGO, NULL, + fsp_attr_show_pagereg, fsp_attr_set_pagereg); + +static ssize_t fsp_attr_show_vscroll(struct psmouse *psmouse, + void *data, char *buf) +{ + struct fsp_data *pad = psmouse->private; + + return sprintf(buf, "%d\n", pad->vscroll); +} + +static ssize_t fsp_attr_set_vscroll(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + unsigned int val; + int err; + + err = kstrtouint(buf, 10, &val); + if (err) + return err; + + if (val > 1) + return -EINVAL; + + fsp_onpad_vscr(psmouse, val); + + return count; +} + +PSMOUSE_DEFINE_ATTR(vscroll, S_IWUSR | S_IRUGO, NULL, + fsp_attr_show_vscroll, fsp_attr_set_vscroll); + +static ssize_t fsp_attr_show_hscroll(struct psmouse *psmouse, + void *data, char *buf) +{ + struct fsp_data *pad = psmouse->private; + + return sprintf(buf, "%d\n", pad->hscroll); +} + +static ssize_t fsp_attr_set_hscroll(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + unsigned int val; + int err; + + err = kstrtouint(buf, 10, &val); + if (err) + return err; + + if (val > 1) + return -EINVAL; + + fsp_onpad_hscr(psmouse, val); + + return count; +} + +PSMOUSE_DEFINE_ATTR(hscroll, S_IWUSR | S_IRUGO, NULL, + fsp_attr_show_hscroll, fsp_attr_set_hscroll); + +static ssize_t fsp_attr_show_flags(struct psmouse *psmouse, + void *data, char *buf) +{ + struct fsp_data *pad = psmouse->private; + + return sprintf(buf, "%c\n", + pad->flags & FSPDRV_FLAG_EN_OPC ? 'C' : 'c'); +} + +static ssize_t fsp_attr_set_flags(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + struct fsp_data *pad = psmouse->private; + size_t i; + + for (i = 0; i < count; i++) { + switch (buf[i]) { + case 'C': + pad->flags |= FSPDRV_FLAG_EN_OPC; + break; + case 'c': + pad->flags &= ~FSPDRV_FLAG_EN_OPC; + break; + default: + return -EINVAL; + } + } + return count; +} + +PSMOUSE_DEFINE_ATTR(flags, S_IWUSR | S_IRUGO, NULL, + fsp_attr_show_flags, fsp_attr_set_flags); + +static ssize_t fsp_attr_show_ver(struct psmouse *psmouse, + void *data, char *buf) +{ + return sprintf(buf, "Sentelic FSP kernel module %s\n", fsp_drv_ver); +} + +PSMOUSE_DEFINE_RO_ATTR(ver, S_IRUGO, NULL, fsp_attr_show_ver); + +static struct attribute *fsp_attributes[] = { + &psmouse_attr_setreg.dattr.attr, + &psmouse_attr_getreg.dattr.attr, + &psmouse_attr_page.dattr.attr, + &psmouse_attr_vscroll.dattr.attr, + &psmouse_attr_hscroll.dattr.attr, + &psmouse_attr_flags.dattr.attr, + &psmouse_attr_ver.dattr.attr, + NULL +}; + +static struct attribute_group fsp_attribute_group = { + .attrs = fsp_attributes, +}; + +#ifdef FSP_DEBUG +static void fsp_packet_debug(struct psmouse *psmouse, unsigned char packet[]) +{ + static unsigned int ps2_packet_cnt; + static unsigned int ps2_last_second; + unsigned int jiffies_msec; + const char *packet_type = "UNKNOWN"; + unsigned short abs_x = 0, abs_y = 0; + + /* Interpret & dump the packet data. */ + switch (packet[0] >> FSP_PKT_TYPE_SHIFT) { + case FSP_PKT_TYPE_ABS: + packet_type = "Absolute"; + abs_x = GET_ABS_X(packet); + abs_y = GET_ABS_Y(packet); + break; + case FSP_PKT_TYPE_NORMAL: + packet_type = "Normal"; + break; + case FSP_PKT_TYPE_NOTIFY: + packet_type = "Notify"; + break; + case FSP_PKT_TYPE_NORMAL_OPC: + packet_type = "Normal-OPC"; + break; + } + + ps2_packet_cnt++; + jiffies_msec = jiffies_to_msecs(jiffies); + psmouse_dbg(psmouse, + "%08dms %s packets: %02x, %02x, %02x, %02x; " + "abs_x: %d, abs_y: %d\n", + jiffies_msec, packet_type, + packet[0], packet[1], packet[2], packet[3], abs_x, abs_y); + + if (jiffies_msec - ps2_last_second > 1000) { + psmouse_dbg(psmouse, "PS/2 packets/sec = %d\n", ps2_packet_cnt); + ps2_packet_cnt = 0; + ps2_last_second = jiffies_msec; + } +} +#else +static void fsp_packet_debug(struct psmouse *psmouse, unsigned char packet[]) +{ +} +#endif + +static void fsp_set_slot(struct input_dev *dev, int slot, bool active, + unsigned int x, unsigned int y) +{ + input_mt_slot(dev, slot); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); + if (active) { + input_report_abs(dev, ABS_MT_POSITION_X, x); + input_report_abs(dev, ABS_MT_POSITION_Y, y); + } +} + +static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct fsp_data *ad = psmouse->private; + unsigned char *packet = psmouse->packet; + unsigned char button_status = 0, lscroll = 0, rscroll = 0; + unsigned short abs_x, abs_y, fgrs = 0; + int rel_x, rel_y; + + if (psmouse->pktcnt < 4) + return PSMOUSE_GOOD_DATA; + + /* + * Full packet accumulated, process it + */ + + fsp_packet_debug(psmouse, packet); + + switch (psmouse->packet[0] >> FSP_PKT_TYPE_SHIFT) { + case FSP_PKT_TYPE_ABS: + + if ((packet[0] == 0x48 || packet[0] == 0x49) && + packet[1] == 0 && packet[2] == 0) { + /* + * Ignore coordinate noise when finger leaving the + * surface, otherwise cursor may jump to upper-left + * corner. + */ + packet[3] &= 0xf0; + } + + abs_x = GET_ABS_X(packet); + abs_y = GET_ABS_Y(packet); + + if (packet[0] & FSP_PB0_MFMC) { + /* + * MFMC packet: assume that there are two fingers on + * pad + */ + fgrs = 2; + + /* MFMC packet */ + if (packet[0] & FSP_PB0_MFMC_FGR2) { + /* 2nd finger */ + if (ad->last_mt_fgr == 2) { + /* + * workaround for buggy firmware + * which doesn't clear MFMC bit if + * the 1st finger is up + */ + fgrs = 1; + fsp_set_slot(dev, 0, false, 0, 0); + } + ad->last_mt_fgr = 2; + + fsp_set_slot(dev, 1, fgrs == 2, abs_x, abs_y); + } else { + /* 1st finger */ + if (ad->last_mt_fgr == 1) { + /* + * workaround for buggy firmware + * which doesn't clear MFMC bit if + * the 2nd finger is up + */ + fgrs = 1; + fsp_set_slot(dev, 1, false, 0, 0); + } + ad->last_mt_fgr = 1; + fsp_set_slot(dev, 0, fgrs != 0, abs_x, abs_y); + } + } else { + /* SFAC packet */ + if ((packet[0] & (FSP_PB0_LBTN|FSP_PB0_PHY_BTN)) == + FSP_PB0_LBTN) { + /* On-pad click in SFAC mode should be handled + * by userspace. On-pad clicks in MFMC mode + * are real clickpad clicks, and not ignored. + */ + packet[0] &= ~FSP_PB0_LBTN; + } + + /* no multi-finger information */ + ad->last_mt_fgr = 0; + + if (abs_x != 0 && abs_y != 0) + fgrs = 1; + + fsp_set_slot(dev, 0, fgrs > 0, abs_x, abs_y); + fsp_set_slot(dev, 1, false, 0, 0); + } + if (fgrs == 1 || (fgrs == 2 && !(packet[0] & FSP_PB0_MFMC_FGR2))) { + input_report_abs(dev, ABS_X, abs_x); + input_report_abs(dev, ABS_Y, abs_y); + } + input_report_key(dev, BTN_LEFT, packet[0] & 0x01); + input_report_key(dev, BTN_RIGHT, packet[0] & 0x02); + input_report_key(dev, BTN_TOUCH, fgrs); + input_report_key(dev, BTN_TOOL_FINGER, fgrs == 1); + input_report_key(dev, BTN_TOOL_DOUBLETAP, fgrs == 2); + break; + + case FSP_PKT_TYPE_NORMAL_OPC: + /* on-pad click, filter it if necessary */ + if ((ad->flags & FSPDRV_FLAG_EN_OPC) != FSPDRV_FLAG_EN_OPC) + packet[0] &= ~FSP_PB0_LBTN; + /* fall through */ + + case FSP_PKT_TYPE_NORMAL: + /* normal packet */ + /* special packet data translation from on-pad packets */ + if (packet[3] != 0) { + if (packet[3] & BIT(0)) + button_status |= 0x01; /* wheel down */ + if (packet[3] & BIT(1)) + button_status |= 0x0f; /* wheel up */ + if (packet[3] & BIT(2)) + button_status |= BIT(4);/* horizontal left */ + if (packet[3] & BIT(3)) + button_status |= BIT(5);/* horizontal right */ + /* push back to packet queue */ + if (button_status != 0) + packet[3] = button_status; + rscroll = (packet[3] >> 4) & 1; + lscroll = (packet[3] >> 5) & 1; + } + /* + * Processing wheel up/down and extra button events + */ + input_report_rel(dev, REL_WHEEL, + (int)(packet[3] & 8) - (int)(packet[3] & 7)); + input_report_rel(dev, REL_HWHEEL, lscroll - rscroll); + input_report_key(dev, BTN_BACK, lscroll); + input_report_key(dev, BTN_FORWARD, rscroll); + + /* + * Standard PS/2 Mouse + */ + input_report_key(dev, BTN_LEFT, packet[0] & 1); + input_report_key(dev, BTN_MIDDLE, (packet[0] >> 2) & 1); + input_report_key(dev, BTN_RIGHT, (packet[0] >> 1) & 1); + + rel_x = packet[1] ? (int)packet[1] - (int)((packet[0] << 4) & 0x100) : 0; + rel_y = packet[2] ? (int)((packet[0] << 3) & 0x100) - (int)packet[2] : 0; + + input_report_rel(dev, REL_X, rel_x); + input_report_rel(dev, REL_Y, rel_y); + break; + } + + input_sync(dev); + + return PSMOUSE_FULL_PACKET; +} + +static int fsp_activate_protocol(struct psmouse *psmouse) +{ + struct fsp_data *pad = psmouse->private; + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[2]; + int val; + + /* + * Standard procedure to enter FSP Intellimouse mode + * (scrolling wheel, 4th and 5th buttons) + */ + param[0] = 200; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 200; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + param[0] = 80; + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRATE); + + ps2_command(ps2dev, param, PSMOUSE_CMD_GETID); + if (param[0] != 0x04) { + psmouse_err(psmouse, + "Unable to enable 4 bytes packet format.\n"); + return -EIO; + } + + if (pad->ver < FSP_VER_STL3888_C0) { + /* Preparing relative coordinates output for older hardware */ + if (fsp_reg_read(psmouse, FSP_REG_SYSCTL5, &val)) { + psmouse_err(psmouse, + "Unable to read SYSCTL5 register.\n"); + return -EIO; + } + + if (fsp_get_buttons(psmouse, &pad->buttons)) { + psmouse_err(psmouse, + "Unable to retrieve number of buttons.\n"); + return -EIO; + } + + val &= ~(FSP_BIT_EN_MSID7 | FSP_BIT_EN_MSID8 | FSP_BIT_EN_AUTO_MSID8); + /* Ensure we are not in absolute mode */ + val &= ~FSP_BIT_EN_PKT_G0; + if (pad->buttons == 0x06) { + /* Left/Middle/Right & Scroll Up/Down/Right/Left */ + val |= FSP_BIT_EN_MSID6; + } + + if (fsp_reg_write(psmouse, FSP_REG_SYSCTL5, val)) { + psmouse_err(psmouse, + "Unable to set up required mode bits.\n"); + return -EIO; + } + + /* + * Enable OPC tags such that driver can tell the difference + * between on-pad and real button click + */ + if (fsp_opc_tag_enable(psmouse, true)) + psmouse_warn(psmouse, + "Failed to enable OPC tag mode.\n"); + /* enable on-pad click by default */ + pad->flags |= FSPDRV_FLAG_EN_OPC; + + /* Enable on-pad vertical and horizontal scrolling */ + fsp_onpad_vscr(psmouse, true); + fsp_onpad_hscr(psmouse, true); + } else { + /* Enable absolute coordinates output for Cx/Dx hardware */ + if (fsp_reg_write(psmouse, FSP_REG_SWC1, + FSP_BIT_SWC1_EN_ABS_1F | + FSP_BIT_SWC1_EN_ABS_2F | + FSP_BIT_SWC1_EN_FUP_OUT | + FSP_BIT_SWC1_EN_ABS_CON)) { + psmouse_err(psmouse, + "Unable to enable absolute coordinates output.\n"); + return -EIO; + } + } + + return 0; +} + +static int fsp_set_input_params(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct fsp_data *pad = psmouse->private; + + if (pad->ver < FSP_VER_STL3888_C0) { + __set_bit(BTN_MIDDLE, dev->keybit); + __set_bit(BTN_BACK, dev->keybit); + __set_bit(BTN_FORWARD, dev->keybit); + __set_bit(REL_WHEEL, dev->relbit); + __set_bit(REL_HWHEEL, dev->relbit); + } else { + /* + * Hardware prior to Cx performs much better in relative mode; + * hence, only enable absolute coordinates output as well as + * multi-touch output for the newer hardware. + * + * Maximum coordinates can be computed as: + * + * number of scanlines * 64 - 57 + * + * where number of X/Y scanline lines are 16/12. + */ + int abs_x = 967, abs_y = 711; + + __set_bit(EV_ABS, dev->evbit); + __clear_bit(EV_REL, dev->evbit); + __set_bit(BTN_TOUCH, dev->keybit); + __set_bit(BTN_TOOL_FINGER, dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); + __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); + + input_set_abs_params(dev, ABS_X, 0, abs_x, 0, 0); + input_set_abs_params(dev, ABS_Y, 0, abs_y, 0, 0); + input_mt_init_slots(dev, 2, 0); + input_set_abs_params(dev, ABS_MT_POSITION_X, 0, abs_x, 0, 0); + input_set_abs_params(dev, ABS_MT_POSITION_Y, 0, abs_y, 0, 0); + } + + return 0; +} + +int fsp_detect(struct psmouse *psmouse, bool set_properties) +{ + int id; + + if (fsp_reg_read(psmouse, FSP_REG_DEVICE_ID, &id)) + return -EIO; + + if (id != 0x01) + return -ENODEV; + + if (set_properties) { + psmouse->vendor = "Sentelic"; + psmouse->name = "FingerSensingPad"; + } + + return 0; +} + +static void fsp_reset(struct psmouse *psmouse) +{ + fsp_opc_tag_enable(psmouse, false); + fsp_onpad_vscr(psmouse, false); + fsp_onpad_hscr(psmouse, false); +} + +static void fsp_disconnect(struct psmouse *psmouse) +{ + sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, + &fsp_attribute_group); + + fsp_reset(psmouse); + kfree(psmouse->private); +} + +static int fsp_reconnect(struct psmouse *psmouse) +{ + int version; + + if (fsp_detect(psmouse, 0)) + return -ENODEV; + + if (fsp_get_version(psmouse, &version)) + return -ENODEV; + + if (fsp_activate_protocol(psmouse)) + return -EIO; + + return 0; +} + +int fsp_init(struct psmouse *psmouse) +{ + struct fsp_data *priv; + int ver, rev, sn = 0; + int error; + + if (fsp_get_version(psmouse, &ver) || + fsp_get_revision(psmouse, &rev)) { + return -ENODEV; + } + if (ver >= FSP_VER_STL3888_C0) { + /* firmware information is only available since C0 */ + fsp_get_sn(psmouse, &sn); + } + + psmouse_info(psmouse, + "Finger Sensing Pad, hw: %d.%d.%d, sn: %x, sw: %s\n", + ver >> 4, ver & 0x0F, rev, sn, fsp_drv_ver); + + psmouse->private = priv = kzalloc(sizeof(struct fsp_data), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->ver = ver; + priv->rev = rev; + + psmouse->protocol_handler = fsp_process_byte; + psmouse->disconnect = fsp_disconnect; + psmouse->reconnect = fsp_reconnect; + psmouse->cleanup = fsp_reset; + psmouse->pktsize = 4; + + error = fsp_activate_protocol(psmouse); + if (error) + goto err_out; + + /* Set up various supported input event bits */ + error = fsp_set_input_params(psmouse); + if (error) + goto err_out; + + error = sysfs_create_group(&psmouse->ps2dev.serio->dev.kobj, + &fsp_attribute_group); + if (error) { + psmouse_err(psmouse, + "Failed to create sysfs attributes (%d)", error); + goto err_out; + } + + return 0; + + err_out: + kfree(psmouse->private); + psmouse->private = NULL; + return error; +} diff --git a/drivers/input/mouse/sentelic.h b/drivers/input/mouse/sentelic.h new file mode 100644 index 00000000..aa697ece --- /dev/null +++ b/drivers/input/mouse/sentelic.h @@ -0,0 +1,138 @@ +/*- + * Finger Sensing Pad PS/2 mouse driver. + * + * Copyright (C) 2005-2007 Asia Vital Components Co., Ltd. + * Copyright (C) 2005-2012 Tai-hwa Liang, Sentelic Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#ifndef __SENTELIC_H +#define __SENTELIC_H + +/* Finger-sensing Pad information registers */ +#define FSP_REG_DEVICE_ID 0x00 +#define FSP_REG_VERSION 0x01 +#define FSP_REG_REVISION 0x04 +#define FSP_REG_TMOD_STATUS1 0x0B +#define FSP_BIT_NO_ROTATION BIT(3) +#define FSP_REG_PAGE_CTRL 0x0F + +/* Finger-sensing Pad control registers */ +#define FSP_REG_SYSCTL1 0x10 +#define FSP_BIT_EN_REG_CLK BIT(5) +#define FSP_REG_TMOD_STATUS 0x20 +#define FSP_REG_OPC_QDOWN 0x31 +#define FSP_BIT_EN_OPC_TAG BIT(7) +#define FSP_REG_OPTZ_XLO 0x34 +#define FSP_REG_OPTZ_XHI 0x35 +#define FSP_REG_OPTZ_YLO 0x36 +#define FSP_REG_OPTZ_YHI 0x37 +#define FSP_REG_SYSCTL5 0x40 +#define FSP_BIT_90_DEGREE BIT(0) +#define FSP_BIT_EN_MSID6 BIT(1) +#define FSP_BIT_EN_MSID7 BIT(2) +#define FSP_BIT_EN_MSID8 BIT(3) +#define FSP_BIT_EN_AUTO_MSID8 BIT(5) +#define FSP_BIT_EN_PKT_G0 BIT(6) + +#define FSP_REG_ONPAD_CTL 0x43 +#define FSP_BIT_ONPAD_ENABLE BIT(0) +#define FSP_BIT_ONPAD_FBBB BIT(1) +#define FSP_BIT_FIX_VSCR BIT(3) +#define FSP_BIT_FIX_HSCR BIT(5) +#define FSP_BIT_DRAG_LOCK BIT(6) + +#define FSP_REG_SWC1 (0x90) +#define FSP_BIT_SWC1_EN_ABS_1F BIT(0) +#define FSP_BIT_SWC1_EN_GID BIT(1) +#define FSP_BIT_SWC1_EN_ABS_2F BIT(2) +#define FSP_BIT_SWC1_EN_FUP_OUT BIT(3) +#define FSP_BIT_SWC1_EN_ABS_CON BIT(4) +#define FSP_BIT_SWC1_GST_GRP0 BIT(5) +#define FSP_BIT_SWC1_GST_GRP1 BIT(6) +#define FSP_BIT_SWC1_BX_COMPAT BIT(7) + +#define FSP_PAGE_0B (0x0b) +#define FSP_PAGE_82 (0x82) +#define FSP_PAGE_DEFAULT FSP_PAGE_82 + +#define FSP_REG_SN0 (0x40) +#define FSP_REG_SN1 (0x41) +#define FSP_REG_SN2 (0x42) + +/* Finger-sensing Pad packet formating related definitions */ + +/* absolute packet type */ +#define FSP_PKT_TYPE_NORMAL (0x00) +#define FSP_PKT_TYPE_ABS (0x01) +#define FSP_PKT_TYPE_NOTIFY (0x02) +#define FSP_PKT_TYPE_NORMAL_OPC (0x03) +#define FSP_PKT_TYPE_SHIFT (6) + +/* bit definitions for the first byte of report packet */ +#define FSP_PB0_LBTN BIT(0) +#define FSP_PB0_RBTN BIT(1) +#define FSP_PB0_MBTN BIT(2) +#define FSP_PB0_MFMC_FGR2 FSP_PB0_MBTN +#define FSP_PB0_MUST_SET BIT(3) +#define FSP_PB0_PHY_BTN BIT(4) +#define FSP_PB0_MFMC BIT(5) + +/* hardware revisions */ +#define FSP_VER_STL3888_A4 (0xC1) +#define FSP_VER_STL3888_B0 (0xD0) +#define FSP_VER_STL3888_B1 (0xD1) +#define FSP_VER_STL3888_B2 (0xD2) +#define FSP_VER_STL3888_C0 (0xE0) +#define FSP_VER_STL3888_C1 (0xE1) +#define FSP_VER_STL3888_D0 (0xE2) +#define FSP_VER_STL3888_D1 (0xE3) +#define FSP_VER_STL3888_E0 (0xE4) + +#ifdef __KERNEL__ + +struct fsp_data { + unsigned char ver; /* hardware version */ + unsigned char rev; /* hardware revison */ + unsigned int buttons; /* Number of buttons */ + unsigned int flags; +#define FSPDRV_FLAG_EN_OPC (0x001) /* enable on-pad clicking */ + + bool vscroll; /* Vertical scroll zone enabled */ + bool hscroll; /* Horizontal scroll zone enabled */ + + unsigned char last_reg; /* Last register we requested read from */ + unsigned char last_val; + unsigned int last_mt_fgr; /* Last seen finger(multitouch) */ +}; + +#ifdef CONFIG_MOUSE_PS2_SENTELIC +extern int fsp_detect(struct psmouse *psmouse, bool set_properties); +extern int fsp_init(struct psmouse *psmouse); +#else +inline int fsp_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +inline int fsp_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} +#endif + +#endif /* __KERNEL__ */ + +#endif /* !__SENTELIC_H */ diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c new file mode 100644 index 00000000..d5928fd0 --- /dev/null +++ b/drivers/input/mouse/sermouse.c @@ -0,0 +1,358 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * Serial mouse driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Serial mouse driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +static const char *sermouse_protocols[] = { "None", "Mouse Systems Mouse", "Sun Mouse", "Microsoft Mouse", + "Logitech M+ Mouse", "Microsoft MZ Mouse", "Logitech MZ+ Mouse", + "Logitech MZ++ Mouse"}; + +struct sermouse { + struct input_dev *dev; + signed char buf[8]; + unsigned char count; + unsigned char type; + unsigned long last; + char phys[32]; +}; + +/* + * sermouse_process_msc() analyzes the incoming MSC/Sun bytestream and + * applies some prediction to the data, resulting in 96 updates per + * second, which is as good as a PS/2 or USB mouse. + */ + +static void sermouse_process_msc(struct sermouse *sermouse, signed char data) +{ + struct input_dev *dev = sermouse->dev; + signed char *buf = sermouse->buf; + + switch (sermouse->count) { + + case 0: + if ((data & 0xf8) != 0x80) + return; + input_report_key(dev, BTN_LEFT, !(data & 4)); + input_report_key(dev, BTN_RIGHT, !(data & 1)); + input_report_key(dev, BTN_MIDDLE, !(data & 2)); + break; + + case 1: + case 3: + input_report_rel(dev, REL_X, data / 2); + input_report_rel(dev, REL_Y, -buf[1]); + buf[0] = data - data / 2; + break; + + case 2: + case 4: + input_report_rel(dev, REL_X, buf[0]); + input_report_rel(dev, REL_Y, buf[1] - data); + buf[1] = data / 2; + break; + } + + input_sync(dev); + + if (++sermouse->count == 5) + sermouse->count = 0; +} + +/* + * sermouse_process_ms() anlyzes the incoming MS(Z/+/++) bytestream and + * generates events. With prediction it gets 80 updates/sec, assuming + * standard 3-byte packets and 1200 bps. + */ + +static void sermouse_process_ms(struct sermouse *sermouse, signed char data) +{ + struct input_dev *dev = sermouse->dev; + signed char *buf = sermouse->buf; + + if (data & 0x40) + sermouse->count = 0; + else if (sermouse->count == 0) + return; + + switch (sermouse->count) { + + case 0: + buf[1] = data; + input_report_key(dev, BTN_LEFT, (data >> 5) & 1); + input_report_key(dev, BTN_RIGHT, (data >> 4) & 1); + break; + + case 1: + buf[2] = data; + data = (signed char) (((buf[1] << 6) & 0xc0) | (data & 0x3f)); + input_report_rel(dev, REL_X, data / 2); + input_report_rel(dev, REL_Y, buf[4]); + buf[3] = data - data / 2; + break; + + case 2: + /* Guessing the state of the middle button on 3-button MS-protocol mice - ugly. */ + if ((sermouse->type == SERIO_MS) && !data && !buf[2] && !((buf[0] & 0xf0) ^ buf[1])) + input_report_key(dev, BTN_MIDDLE, !test_bit(BTN_MIDDLE, dev->key)); + buf[0] = buf[1]; + + data = (signed char) (((buf[1] << 4) & 0xc0) | (data & 0x3f)); + input_report_rel(dev, REL_X, buf[3]); + input_report_rel(dev, REL_Y, data - buf[4]); + buf[4] = data / 2; + break; + + case 3: + + switch (sermouse->type) { + + case SERIO_MS: + sermouse->type = SERIO_MP; + + case SERIO_MP: + if ((data >> 2) & 3) break; /* M++ Wireless Extension packet. */ + input_report_key(dev, BTN_MIDDLE, (data >> 5) & 1); + input_report_key(dev, BTN_SIDE, (data >> 4) & 1); + break; + + case SERIO_MZP: + case SERIO_MZPP: + input_report_key(dev, BTN_SIDE, (data >> 5) & 1); + + case SERIO_MZ: + input_report_key(dev, BTN_MIDDLE, (data >> 4) & 1); + input_report_rel(dev, REL_WHEEL, (data & 8) - (data & 7)); + break; + } + + break; + + case 4: + case 6: /* MZ++ packet type. We can get these bytes for M++ too but we ignore them later. */ + buf[1] = (data >> 2) & 0x0f; + break; + + case 5: + case 7: /* Ignore anything besides MZ++ */ + if (sermouse->type != SERIO_MZPP) + break; + + switch (buf[1]) { + + case 1: /* Extra mouse info */ + + input_report_key(dev, BTN_SIDE, (data >> 4) & 1); + input_report_key(dev, BTN_EXTRA, (data >> 5) & 1); + input_report_rel(dev, data & 0x80 ? REL_HWHEEL : REL_WHEEL, (data & 7) - (data & 8)); + + break; + + default: /* We don't decode anything else yet. */ + + printk(KERN_WARNING + "sermouse.c: Received MZ++ packet %x, don't know how to handle.\n", buf[1]); + break; + } + + break; + } + + input_sync(dev); + + sermouse->count++; +} + +/* + * sermouse_interrupt() handles incoming characters, either gathering them into + * packets or passing them to the command routine as command output. + */ + +static irqreturn_t sermouse_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct sermouse *sermouse = serio_get_drvdata(serio); + + if (time_after(jiffies, sermouse->last + HZ/10)) + sermouse->count = 0; + + sermouse->last = jiffies; + + if (sermouse->type > SERIO_SUN) + sermouse_process_ms(sermouse, data); + else + sermouse_process_msc(sermouse, data); + + return IRQ_HANDLED; +} + +/* + * sermouse_disconnect() cleans up after we don't want talk + * to the mouse anymore. + */ + +static void sermouse_disconnect(struct serio *serio) +{ + struct sermouse *sermouse = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(sermouse->dev); + kfree(sermouse); +} + +/* + * sermouse_connect() is a callback form the serio module when + * an unhandled serio port is found. + */ + +static int sermouse_connect(struct serio *serio, struct serio_driver *drv) +{ + struct sermouse *sermouse; + struct input_dev *input_dev; + unsigned char c = serio->id.extra; + int err = -ENOMEM; + + sermouse = kzalloc(sizeof(struct sermouse), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!sermouse || !input_dev) + goto fail1; + + sermouse->dev = input_dev; + snprintf(sermouse->phys, sizeof(sermouse->phys), "%s/input0", serio->phys); + sermouse->type = serio->id.proto; + + input_dev->name = sermouse_protocols[sermouse->type]; + input_dev->phys = sermouse->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = sermouse->type; + input_dev->id.product = c; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REL); + input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_RIGHT); + input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); + + if (c & 0x01) set_bit(BTN_MIDDLE, input_dev->keybit); + if (c & 0x02) set_bit(BTN_SIDE, input_dev->keybit); + if (c & 0x04) set_bit(BTN_EXTRA, input_dev->keybit); + if (c & 0x10) set_bit(REL_WHEEL, input_dev->relbit); + if (c & 0x20) set_bit(REL_HWHEEL, input_dev->relbit); + + serio_set_drvdata(serio, sermouse); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(sermouse->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(sermouse); + return err; +} + +static struct serio_device_id sermouse_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_MSC, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_SUN, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_MS, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_MP, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_MZ, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_MZP, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_RS232, + .proto = SERIO_MZPP, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, sermouse_serio_ids); + +static struct serio_driver sermouse_drv = { + .driver = { + .name = "sermouse", + }, + .description = DRIVER_DESC, + .id_table = sermouse_serio_ids, + .interrupt = sermouse_interrupt, + .connect = sermouse_connect, + .disconnect = sermouse_disconnect, +}; + +module_serio_driver(sermouse_drv); diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c new file mode 100644 index 00000000..d1c47d13 --- /dev/null +++ b/drivers/input/mouse/synaptics.c @@ -0,0 +1,1782 @@ +/* + * Synaptics TouchPad PS/2 mouse driver + * + * 2003 Dmitry Torokhov + * Added support for pass-through port. Special thanks to Peter Berg Larsen + * for explaining various Synaptics quirks. + * + * 2003 Peter Osterlund + * Ported to 2.5 input device infrastructure. + * + * Copyright (C) 2001 Stefan Gmeiner + * start merging tpconfig and gpm code to a xfree-input module + * adding some changes and extensions (ex. 3rd and 4th button) + * + * Copyright (c) 1997 C. Scott Ananian + * Copyright (c) 1998-2000 Bruce Kalk + * code for the special synaptics commands (from the tpconfig-source) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * Trademarks are the property of their respective owners. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "psmouse.h" +#include "synaptics.h" + +/* + * The x/y limits are taken from the Synaptics TouchPad interfacing Guide, + * section 2.3.2, which says that they should be valid regardless of the + * actual size of the sensor. + * Note that newer firmware allows querying device for maximum useable + * coordinates. + */ +#define XMIN 0 +#define XMAX 6143 +#define YMIN 0 +#define YMAX 6143 +#define XMIN_NOMINAL 1472 +#define XMAX_NOMINAL 5472 +#define YMIN_NOMINAL 1408 +#define YMAX_NOMINAL 4448 + +/* Size in bits of absolute position values reported by the hardware */ +#define ABS_POS_BITS 13 + +/* + * These values should represent the absolute maximum value that will + * be reported for a positive position value. Some Synaptics firmware + * uses this value to indicate a finger near the edge of the touchpad + * whose precise position cannot be determined. + * + * At least one touchpad is known to report positions in excess of this + * value which are actually negative values truncated to the 13-bit + * reporting range. These values have never been observed to be lower + * than 8184 (i.e. -8), so we treat all values greater than 8176 as + * negative and any other value as positive. + */ +#define X_MAX_POSITIVE 8176 +#define Y_MAX_POSITIVE 8176 + +/***************************************************************************** + * Stuff we need even when we do not want native Synaptics support + ****************************************************************************/ + +/* + * Set the synaptics touchpad mode byte by special commands + */ +static int synaptics_mode_cmd(struct psmouse *psmouse, unsigned char mode) +{ + unsigned char param[1]; + + if (psmouse_sliced_command(psmouse, mode)) + return -1; + param[0] = SYN_PS_SET_MODE2; + if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_SETRATE)) + return -1; + return 0; +} + +int synaptics_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[4]; + + param[0] = 0; + + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES); + ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO); + + if (param[1] != 0x47) + return -ENODEV; + + if (set_properties) { + psmouse->vendor = "Synaptics"; + psmouse->name = "TouchPad"; + } + + return 0; +} + +void synaptics_reset(struct psmouse *psmouse) +{ + /* reset touchpad back to relative mode, gestures enabled */ + synaptics_mode_cmd(psmouse, 0); +} + +#ifdef CONFIG_MOUSE_PS2_SYNAPTICS + +/***************************************************************************** + * Synaptics communications functions + ****************************************************************************/ + +/* + * Synaptics touchpads report the y coordinate from bottom to top, which is + * opposite from what userspace expects. + * This function is used to invert y before reporting. + */ +static int synaptics_invert_y(int y) +{ + return YMAX_NOMINAL + YMIN_NOMINAL - y; +} + +/* + * Send a command to the synpatics touchpad by special commands + */ +static int synaptics_send_cmd(struct psmouse *psmouse, unsigned char c, unsigned char *param) +{ + if (psmouse_sliced_command(psmouse, c)) + return -1; + if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETINFO)) + return -1; + return 0; +} + +/* + * Read the model-id bytes from the touchpad + * see also SYN_MODEL_* macros + */ +static int synaptics_model_id(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + unsigned char mi[3]; + + if (synaptics_send_cmd(psmouse, SYN_QUE_MODEL, mi)) + return -1; + priv->model_id = (mi[0]<<16) | (mi[1]<<8) | mi[2]; + return 0; +} + +/* + * Read the board id from the touchpad + * The board id is encoded in the "QUERY MODES" response + */ +static int synaptics_board_id(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + unsigned char bid[3]; + + if (synaptics_send_cmd(psmouse, SYN_QUE_MODES, bid)) + return -1; + priv->board_id = ((bid[0] & 0xfc) << 6) | bid[1]; + return 0; +} + +/* + * Read the firmware id from the touchpad + */ +static int synaptics_firmware_id(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + unsigned char fwid[3]; + + if (synaptics_send_cmd(psmouse, SYN_QUE_FIRMWARE_ID, fwid)) + return -1; + priv->firmware_id = (fwid[0] << 16) | (fwid[1] << 8) | fwid[2]; + return 0; +} + +/* + * Read the capability-bits from the touchpad + * see also the SYN_CAP_* macros + */ +static int synaptics_capability(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + unsigned char cap[3]; + + if (synaptics_send_cmd(psmouse, SYN_QUE_CAPABILITIES, cap)) + return -1; + priv->capabilities = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + priv->ext_cap = priv->ext_cap_0c = 0; + + /* + * Older firmwares had submodel ID fixed to 0x47 + */ + if (SYN_ID_FULL(priv->identity) < 0x705 && + SYN_CAP_SUBMODEL_ID(priv->capabilities) != 0x47) { + return -1; + } + + /* + * Unless capExtended is set the rest of the flags should be ignored + */ + if (!SYN_CAP_EXTENDED(priv->capabilities)) + priv->capabilities = 0; + + if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 1) { + if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB, cap)) { + psmouse_warn(psmouse, + "device claims to have extended capabilities, but I'm not able to read them.\n"); + } else { + priv->ext_cap = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + + /* + * if nExtBtn is greater than 8 it should be considered + * invalid and treated as 0 + */ + if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) > 8) + priv->ext_cap &= 0xff0fff; + } + } + + if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 4) { + if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_CAPAB_0C, cap)) { + psmouse_warn(psmouse, + "device claims to have extended capability 0x0c, but I'm not able to read it.\n"); + } else { + priv->ext_cap_0c = (cap[0] << 16) | (cap[1] << 8) | cap[2]; + } + } + + return 0; +} + +/* + * Identify Touchpad + * See also the SYN_ID_* macros + */ +static int synaptics_identify(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + unsigned char id[3]; + + if (synaptics_send_cmd(psmouse, SYN_QUE_IDENTIFY, id)) + return -1; + priv->identity = (id[0]<<16) | (id[1]<<8) | id[2]; + if (SYN_ID_IS_SYNAPTICS(priv->identity)) + return 0; + return -1; +} + +/* + * Read touchpad resolution and maximum reported coordinates + * Resolution is left zero if touchpad does not support the query + */ + +static const int *quirk_min_max; + +static int synaptics_resolution(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + unsigned char resp[3]; + + if (quirk_min_max) { + priv->x_min = quirk_min_max[0]; + priv->x_max = quirk_min_max[1]; + priv->y_min = quirk_min_max[2]; + priv->y_max = quirk_min_max[3]; + return 0; + } + + if (SYN_ID_MAJOR(priv->identity) < 4) + return 0; + + if (synaptics_send_cmd(psmouse, SYN_QUE_RESOLUTION, resp) == 0) { + if (resp[0] != 0 && (resp[1] & 0x80) && resp[2] != 0) { + priv->x_res = resp[0]; /* x resolution in units/mm */ + priv->y_res = resp[2]; /* y resolution in units/mm */ + } + } + + if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 5 && + SYN_CAP_MAX_DIMENSIONS(priv->ext_cap_0c)) { + if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MAX_COORDS, resp)) { + psmouse_warn(psmouse, + "device claims to have max coordinates query, but I'm not able to read it.\n"); + } else { + priv->x_max = (resp[0] << 5) | ((resp[1] & 0x0f) << 1); + priv->y_max = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3); + } + } + + if (SYN_EXT_CAP_REQUESTS(priv->capabilities) >= 7 && + SYN_CAP_MIN_DIMENSIONS(priv->ext_cap_0c)) { + if (synaptics_send_cmd(psmouse, SYN_QUE_EXT_MIN_COORDS, resp)) { + psmouse_warn(psmouse, + "device claims to have min coordinates query, but I'm not able to read it.\n"); + } else { + priv->x_min = (resp[0] << 5) | ((resp[1] & 0x0f) << 1); + priv->y_min = (resp[2] << 5) | ((resp[1] & 0xf0) >> 3); + } + } + + return 0; +} + +static int synaptics_query_hardware(struct psmouse *psmouse) +{ + if (synaptics_identify(psmouse)) + return -1; + if (synaptics_model_id(psmouse)) + return -1; + if (synaptics_firmware_id(psmouse)) + return -1; + if (synaptics_board_id(psmouse)) + return -1; + if (synaptics_capability(psmouse)) + return -1; + if (synaptics_resolution(psmouse)) + return -1; + + return 0; +} + +static int synaptics_set_advanced_gesture_mode(struct psmouse *psmouse) +{ + static unsigned char param = 0xc8; + struct synaptics_data *priv = psmouse->private; + + if (!(SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || + SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c))) + return 0; + + if (psmouse_sliced_command(psmouse, SYN_QUE_MODEL)) + return -1; + + if (ps2_command(&psmouse->ps2dev, ¶m, PSMOUSE_CMD_SETRATE)) + return -1; + + /* Advanced gesture mode also sends multi finger data */ + priv->capabilities |= BIT(1); + + return 0; +} + +static int synaptics_set_mode(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + + priv->mode = 0; + if (priv->absolute_mode) + priv->mode |= SYN_BIT_ABSOLUTE_MODE; + if (priv->disable_gesture) + priv->mode |= SYN_BIT_DISABLE_GESTURE; + if (psmouse->rate >= 80) + priv->mode |= SYN_BIT_HIGH_RATE; + if (SYN_CAP_EXTENDED(priv->capabilities)) + priv->mode |= SYN_BIT_W_MODE; + + if (synaptics_mode_cmd(psmouse, priv->mode)) + return -1; + + if (priv->absolute_mode && + synaptics_set_advanced_gesture_mode(psmouse)) { + psmouse_err(psmouse, "Advanced gesture mode init failed.\n"); + return -1; + } + + return 0; +} + +static void synaptics_set_rate(struct psmouse *psmouse, unsigned int rate) +{ + struct synaptics_data *priv = psmouse->private; + + if (rate >= 80) { + priv->mode |= SYN_BIT_HIGH_RATE; + psmouse->rate = 80; + } else { + priv->mode &= ~SYN_BIT_HIGH_RATE; + psmouse->rate = 40; + } + + synaptics_mode_cmd(psmouse, priv->mode); +} + +/***************************************************************************** + * Synaptics pass-through PS/2 port support + ****************************************************************************/ +static int synaptics_pt_write(struct serio *serio, unsigned char c) +{ + struct psmouse *parent = serio_get_drvdata(serio->parent); + char rate_param = SYN_PS_CLIENT_CMD; /* indicates that we want pass-through port */ + + if (psmouse_sliced_command(parent, c)) + return -1; + if (ps2_command(&parent->ps2dev, &rate_param, PSMOUSE_CMD_SETRATE)) + return -1; + return 0; +} + +static int synaptics_pt_start(struct serio *serio) +{ + struct psmouse *parent = serio_get_drvdata(serio->parent); + struct synaptics_data *priv = parent->private; + + serio_pause_rx(parent->ps2dev.serio); + priv->pt_port = serio; + serio_continue_rx(parent->ps2dev.serio); + + return 0; +} + +static void synaptics_pt_stop(struct serio *serio) +{ + struct psmouse *parent = serio_get_drvdata(serio->parent); + struct synaptics_data *priv = parent->private; + + serio_pause_rx(parent->ps2dev.serio); + priv->pt_port = NULL; + serio_continue_rx(parent->ps2dev.serio); +} + +static int synaptics_is_pt_packet(unsigned char *buf) +{ + return (buf[0] & 0xFC) == 0x84 && (buf[3] & 0xCC) == 0xC4; +} + +static void synaptics_pass_pt_packet(struct serio *ptport, unsigned char *packet) +{ + struct psmouse *child = serio_get_drvdata(ptport); + + if (child && child->state == PSMOUSE_ACTIVATED) { + serio_interrupt(ptport, packet[1], 0); + serio_interrupt(ptport, packet[4], 0); + serio_interrupt(ptport, packet[5], 0); + if (child->pktsize == 4) + serio_interrupt(ptport, packet[2], 0); + } else + serio_interrupt(ptport, packet[1], 0); +} + +static void synaptics_pt_activate(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + struct psmouse *child = serio_get_drvdata(priv->pt_port); + + /* adjust the touchpad to child's choice of protocol */ + if (child) { + if (child->pktsize == 4) + priv->mode |= SYN_BIT_FOUR_BYTE_CLIENT; + else + priv->mode &= ~SYN_BIT_FOUR_BYTE_CLIENT; + + if (synaptics_mode_cmd(psmouse, priv->mode)) + psmouse_warn(psmouse, + "failed to switch guest protocol\n"); + } +} + +static void synaptics_pt_create(struct psmouse *psmouse) +{ + struct serio *serio; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!serio) { + psmouse_err(psmouse, + "not enough memory for pass-through port\n"); + return; + } + + serio->id.type = SERIO_PS_PSTHRU; + strlcpy(serio->name, "Synaptics pass-through", sizeof(serio->name)); + strlcpy(serio->phys, "synaptics-pt/serio0", sizeof(serio->name)); + serio->write = synaptics_pt_write; + serio->start = synaptics_pt_start; + serio->stop = synaptics_pt_stop; + serio->parent = psmouse->ps2dev.serio; + + psmouse->pt_activate = synaptics_pt_activate; + + psmouse_info(psmouse, "serio: %s port at %s\n", + serio->name, psmouse->phys); + serio_register_port(serio); +} + +/***************************************************************************** + * Functions to interpret the absolute mode packets + ****************************************************************************/ + +static void synaptics_mt_state_set(struct synaptics_mt_state *state, int count, + int sgm, int agm) +{ + state->count = count; + state->sgm = sgm; + state->agm = agm; +} + +static void synaptics_parse_agm(const unsigned char buf[], + struct synaptics_data *priv, + struct synaptics_hw_state *hw) +{ + struct synaptics_hw_state *agm = &priv->agm; + int agm_packet_type; + + agm_packet_type = (buf[5] & 0x30) >> 4; + switch (agm_packet_type) { + case 1: + /* Gesture packet: (x, y, z) half resolution */ + agm->w = hw->w; + agm->x = (((buf[4] & 0x0f) << 8) | buf[1]) << 1; + agm->y = (((buf[4] & 0xf0) << 4) | buf[2]) << 1; + agm->z = ((buf[3] & 0x30) | (buf[5] & 0x0f)) << 1; + break; + + case 2: + /* AGM-CONTACT packet: (count, sgm, agm) */ + synaptics_mt_state_set(&agm->mt_state, buf[1], buf[2], buf[4]); + break; + + default: + break; + } + + /* Record that at least one AGM has been received since last SGM */ + priv->agm_pending = true; +} + +static int synaptics_parse_hw_state(const unsigned char buf[], + struct synaptics_data *priv, + struct synaptics_hw_state *hw) +{ + memset(hw, 0, sizeof(struct synaptics_hw_state)); + + if (SYN_MODEL_NEWABS(priv->model_id)) { + hw->w = (((buf[0] & 0x30) >> 2) | + ((buf[0] & 0x04) >> 1) | + ((buf[3] & 0x04) >> 2)); + + if ((SYN_CAP_ADV_GESTURE(priv->ext_cap_0c) || + SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) && + hw->w == 2) { + synaptics_parse_agm(buf, priv, hw); + return 1; + } + + hw->x = (((buf[3] & 0x10) << 8) | + ((buf[1] & 0x0f) << 8) | + buf[4]); + hw->y = (((buf[3] & 0x20) << 7) | + ((buf[1] & 0xf0) << 4) | + buf[5]); + hw->z = buf[2]; + + hw->left = (buf[0] & 0x01) ? 1 : 0; + hw->right = (buf[0] & 0x02) ? 1 : 0; + + if (SYN_CAP_FORCEPAD(priv->ext_cap_0c)) { + /* + * ForcePads, like Clickpads, use middle button + * bits to report primary button clicks. + * Unfortunately they report primary button not + * only when user presses on the pad above certain + * threshold, but also when there are more than one + * finger on the touchpad, which interferes with + * out multi-finger gestures. + */ + if (hw->z == 0) { + /* No contacts */ + priv->press = priv->report_press = false; + } else if (hw->w >= 4 && ((buf[0] ^ buf[3]) & 0x01)) { + /* + * Single-finger touch with pressure above + * the threshold. If pressure stays long + * enough, we'll start reporting primary + * button. We rely on the device continuing + * sending data even if finger does not + * move. + */ + if (!priv->press) { + priv->press_start = jiffies; + priv->press = true; + } else if (time_after(jiffies, + priv->press_start + + msecs_to_jiffies(50))) { + priv->report_press = true; + } + } else { + priv->press = false; + } + + hw->left = priv->report_press; + + } else if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { + /* + * Clickpad's button is transmitted as middle button, + * however, since it is primary button, we will report + * it as BTN_LEFT. + */ + hw->left = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; + + } else if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) { + hw->middle = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; + if (hw->w == 2) + hw->scroll = (signed char)(buf[1]); + } + + if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) { + hw->up = ((buf[0] ^ buf[3]) & 0x01) ? 1 : 0; + hw->down = ((buf[0] ^ buf[3]) & 0x02) ? 1 : 0; + } + + if (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) && + ((buf[0] ^ buf[3]) & 0x02)) { + switch (SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap) & ~0x01) { + default: + /* + * if nExtBtn is greater than 8 it should be + * considered invalid and treated as 0 + */ + break; + case 8: + hw->ext_buttons |= ((buf[5] & 0x08)) ? 0x80 : 0; + hw->ext_buttons |= ((buf[4] & 0x08)) ? 0x40 : 0; + case 6: + hw->ext_buttons |= ((buf[5] & 0x04)) ? 0x20 : 0; + hw->ext_buttons |= ((buf[4] & 0x04)) ? 0x10 : 0; + case 4: + hw->ext_buttons |= ((buf[5] & 0x02)) ? 0x08 : 0; + hw->ext_buttons |= ((buf[4] & 0x02)) ? 0x04 : 0; + case 2: + hw->ext_buttons |= ((buf[5] & 0x01)) ? 0x02 : 0; + hw->ext_buttons |= ((buf[4] & 0x01)) ? 0x01 : 0; + } + } + } else { + hw->x = (((buf[1] & 0x1f) << 8) | buf[2]); + hw->y = (((buf[4] & 0x1f) << 8) | buf[5]); + + hw->z = (((buf[0] & 0x30) << 2) | (buf[3] & 0x3F)); + hw->w = (((buf[1] & 0x80) >> 4) | ((buf[0] & 0x04) >> 1)); + + hw->left = (buf[0] & 0x01) ? 1 : 0; + hw->right = (buf[0] & 0x02) ? 1 : 0; + } + + /* + * Convert wrap-around values to negative. (X|Y)_MAX_POSITIVE + * is used by some firmware to indicate a finger at the edge of + * the touchpad whose precise position cannot be determined, so + * convert these values to the maximum axis value. + */ + if (hw->x > X_MAX_POSITIVE) + hw->x -= 1 << ABS_POS_BITS; + else if (hw->x == X_MAX_POSITIVE) + hw->x = XMAX; + + if (hw->y > Y_MAX_POSITIVE) + hw->y -= 1 << ABS_POS_BITS; + else if (hw->y == Y_MAX_POSITIVE) + hw->y = YMAX; + + return 0; +} + +static void synaptics_report_semi_mt_slot(struct input_dev *dev, int slot, + bool active, int x, int y) +{ + input_mt_slot(dev, slot); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); + if (active) { + input_report_abs(dev, ABS_MT_POSITION_X, x); + input_report_abs(dev, ABS_MT_POSITION_Y, synaptics_invert_y(y)); + } +} + +static void synaptics_report_semi_mt_data(struct input_dev *dev, + const struct synaptics_hw_state *a, + const struct synaptics_hw_state *b, + int num_fingers) +{ + if (num_fingers >= 2) { + synaptics_report_semi_mt_slot(dev, 0, true, min(a->x, b->x), + min(a->y, b->y)); + synaptics_report_semi_mt_slot(dev, 1, true, max(a->x, b->x), + max(a->y, b->y)); + } else if (num_fingers == 1) { + synaptics_report_semi_mt_slot(dev, 0, true, a->x, a->y); + synaptics_report_semi_mt_slot(dev, 1, false, 0, 0); + } else { + synaptics_report_semi_mt_slot(dev, 0, false, 0, 0); + synaptics_report_semi_mt_slot(dev, 1, false, 0, 0); + } +} + +static void synaptics_report_buttons(struct psmouse *psmouse, + const struct synaptics_hw_state *hw) +{ + struct input_dev *dev = psmouse->dev; + struct synaptics_data *priv = psmouse->private; + int i; + + input_report_key(dev, BTN_LEFT, hw->left); + input_report_key(dev, BTN_RIGHT, hw->right); + + if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) + input_report_key(dev, BTN_MIDDLE, hw->middle); + + if (SYN_CAP_FOUR_BUTTON(priv->capabilities)) { + input_report_key(dev, BTN_FORWARD, hw->up); + input_report_key(dev, BTN_BACK, hw->down); + } + + for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++) + input_report_key(dev, BTN_0 + i, hw->ext_buttons & (1 << i)); +} + +static void synaptics_report_slot(struct input_dev *dev, int slot, + const struct synaptics_hw_state *hw) +{ + input_mt_slot(dev, slot); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, (hw != NULL)); + if (!hw) + return; + + input_report_abs(dev, ABS_MT_POSITION_X, hw->x); + input_report_abs(dev, ABS_MT_POSITION_Y, synaptics_invert_y(hw->y)); + input_report_abs(dev, ABS_MT_PRESSURE, hw->z); +} + +static void synaptics_report_mt_data(struct psmouse *psmouse, + struct synaptics_mt_state *mt_state, + const struct synaptics_hw_state *sgm) +{ + struct input_dev *dev = psmouse->dev; + struct synaptics_data *priv = psmouse->private; + struct synaptics_hw_state *agm = &priv->agm; + struct synaptics_mt_state *old = &priv->mt_state; + + switch (mt_state->count) { + case 0: + synaptics_report_slot(dev, 0, NULL); + synaptics_report_slot(dev, 1, NULL); + break; + case 1: + if (mt_state->sgm == -1) { + synaptics_report_slot(dev, 0, NULL); + synaptics_report_slot(dev, 1, NULL); + } else if (mt_state->sgm == 0) { + synaptics_report_slot(dev, 0, sgm); + synaptics_report_slot(dev, 1, NULL); + } else { + synaptics_report_slot(dev, 0, NULL); + synaptics_report_slot(dev, 1, sgm); + } + break; + default: + /* + * If the finger slot contained in SGM is valid, and either + * hasn't changed, or is new, or the old SGM has now moved to + * AGM, then report SGM in MTB slot 0. + * Otherwise, empty MTB slot 0. + */ + if (mt_state->sgm != -1 && + (mt_state->sgm == old->sgm || + old->sgm == -1 || mt_state->agm == old->sgm)) + synaptics_report_slot(dev, 0, sgm); + else + synaptics_report_slot(dev, 0, NULL); + + /* + * If the finger slot contained in AGM is valid, and either + * hasn't changed, or is new, then report AGM in MTB slot 1. + * Otherwise, empty MTB slot 1. + * + * However, in the case where the AGM is new, make sure that + * that it is either the same as the old SGM, or there was no + * SGM. + * + * Otherwise, if the SGM was just 1, and the new AGM is 2, then + * the new AGM will keep the old SGM's tracking ID, which can + * cause apparent drumroll. This happens if in the following + * valid finger sequence: + * + * Action SGM AGM (MTB slot:Contact) + * 1. Touch contact 0 (0:0) + * 2. Touch contact 1 (0:0, 1:1) + * 3. Lift contact 0 (1:1) + * 4. Touch contacts 2,3 (0:2, 1:3) + * + * In step 4, contact 3, in AGM must not be given the same + * tracking ID as contact 1 had in step 3. To avoid this, + * the first agm with contact 3 is dropped and slot 1 is + * invalidated (tracking ID = -1). + */ + if (mt_state->agm != -1 && + (mt_state->agm == old->agm || + (old->agm == -1 && + (old->sgm == -1 || mt_state->agm == old->sgm)))) + synaptics_report_slot(dev, 1, agm); + else + synaptics_report_slot(dev, 1, NULL); + break; + } + + /* Don't use active slot count to generate BTN_TOOL events. */ + input_mt_report_pointer_emulation(dev, false); + + /* Send the number of fingers reported by touchpad itself. */ + input_mt_report_finger_count(dev, mt_state->count); + + synaptics_report_buttons(psmouse, sgm); + + input_sync(dev); +} + +/* Handle case where mt_state->count = 0 */ +static void synaptics_image_sensor_0f(struct synaptics_data *priv, + struct synaptics_mt_state *mt_state) +{ + synaptics_mt_state_set(mt_state, 0, -1, -1); + priv->mt_state_lost = false; +} + +/* Handle case where mt_state->count = 1 */ +static void synaptics_image_sensor_1f(struct synaptics_data *priv, + struct synaptics_mt_state *mt_state) +{ + struct synaptics_hw_state *agm = &priv->agm; + struct synaptics_mt_state *old = &priv->mt_state; + + /* + * If the last AGM was (0,0,0), and there is only one finger left, + * then we absolutely know that SGM contains slot 0, and all other + * fingers have been removed. + */ + if (priv->agm_pending && agm->z == 0) { + synaptics_mt_state_set(mt_state, 1, 0, -1); + priv->mt_state_lost = false; + return; + } + + switch (old->count) { + case 0: + synaptics_mt_state_set(mt_state, 1, 0, -1); + break; + case 1: + /* + * If mt_state_lost, then the previous transition was 3->1, + * and SGM now contains either slot 0 or 1, but we don't know + * which. So, we just assume that the SGM now contains slot 1. + * + * If pending AGM and either: + * (a) the previous SGM slot contains slot 0, or + * (b) there was no SGM slot + * then, the SGM now contains slot 1 + * + * Case (a) happens with very rapid "drum roll" gestures, where + * slot 0 finger is lifted and a new slot 1 finger touches + * within one reporting interval. + * + * Case (b) happens if initially two or more fingers tap + * briefly, and all but one lift before the end of the first + * reporting interval. + * + * (In both these cases, slot 0 will becomes empty, so SGM + * contains slot 1 with the new finger) + * + * Else, if there was no previous SGM, it now contains slot 0. + * + * Otherwise, SGM still contains the same slot. + */ + if (priv->mt_state_lost || + (priv->agm_pending && old->sgm <= 0)) + synaptics_mt_state_set(mt_state, 1, 1, -1); + else if (old->sgm == -1) + synaptics_mt_state_set(mt_state, 1, 0, -1); + break; + case 2: + /* + * If mt_state_lost, we don't know which finger SGM contains. + * + * So, report 1 finger, but with both slots empty. + * We will use slot 1 on subsequent 1->1 + */ + if (priv->mt_state_lost) { + synaptics_mt_state_set(mt_state, 1, -1, -1); + break; + } + /* + * Since the last AGM was NOT (0,0,0), it was the finger in + * slot 0 that has been removed. + * So, SGM now contains previous AGM's slot, and AGM is now + * empty. + */ + synaptics_mt_state_set(mt_state, 1, old->agm, -1); + break; + case 3: + /* + * Since last AGM was not (0,0,0), we don't know which finger + * is left. + * + * So, report 1 finger, but with both slots empty. + * We will use slot 1 on subsequent 1->1 + */ + synaptics_mt_state_set(mt_state, 1, -1, -1); + priv->mt_state_lost = true; + break; + case 4: + case 5: + /* mt_state was updated by AGM-CONTACT packet */ + break; + } +} + +/* Handle case where mt_state->count = 2 */ +static void synaptics_image_sensor_2f(struct synaptics_data *priv, + struct synaptics_mt_state *mt_state) +{ + struct synaptics_mt_state *old = &priv->mt_state; + + switch (old->count) { + case 0: + synaptics_mt_state_set(mt_state, 2, 0, 1); + break; + case 1: + /* + * If previous SGM contained slot 1 or higher, SGM now contains + * slot 0 (the newly touching finger) and AGM contains SGM's + * previous slot. + * + * Otherwise, SGM still contains slot 0 and AGM now contains + * slot 1. + */ + if (old->sgm >= 1) + synaptics_mt_state_set(mt_state, 2, 0, old->sgm); + else + synaptics_mt_state_set(mt_state, 2, 0, 1); + break; + case 2: + /* + * If mt_state_lost, SGM now contains either finger 1 or 2, but + * we don't know which. + * So, we just assume that the SGM contains slot 0 and AGM 1. + */ + if (priv->mt_state_lost) + synaptics_mt_state_set(mt_state, 2, 0, 1); + /* + * Otherwise, use the same mt_state, since it either hasn't + * changed, or was updated by a recently received AGM-CONTACT + * packet. + */ + break; + case 3: + /* + * 3->2 transitions have two unsolvable problems: + * 1) no indication is given which finger was removed + * 2) no way to tell if agm packet was for finger 3 + * before 3->2, or finger 2 after 3->2. + * + * So, report 2 fingers, but empty all slots. + * We will guess slots [0,1] on subsequent 2->2. + */ + synaptics_mt_state_set(mt_state, 2, -1, -1); + priv->mt_state_lost = true; + break; + case 4: + case 5: + /* mt_state was updated by AGM-CONTACT packet */ + break; + } +} + +/* Handle case where mt_state->count = 3 */ +static void synaptics_image_sensor_3f(struct synaptics_data *priv, + struct synaptics_mt_state *mt_state) +{ + struct synaptics_mt_state *old = &priv->mt_state; + + switch (old->count) { + case 0: + synaptics_mt_state_set(mt_state, 3, 0, 2); + break; + case 1: + /* + * If previous SGM contained slot 2 or higher, SGM now contains + * slot 0 (one of the newly touching fingers) and AGM contains + * SGM's previous slot. + * + * Otherwise, SGM now contains slot 0 and AGM contains slot 2. + */ + if (old->sgm >= 2) + synaptics_mt_state_set(mt_state, 3, 0, old->sgm); + else + synaptics_mt_state_set(mt_state, 3, 0, 2); + break; + case 2: + /* + * If the AGM previously contained slot 3 or higher, then the + * newly touching finger is in the lowest available slot. + * + * If SGM was previously 1 or higher, then the new SGM is + * now slot 0 (with a new finger), otherwise, the new finger + * is now in a hidden slot between 0 and AGM's slot. + * + * In all such cases, the SGM now contains slot 0, and the AGM + * continues to contain the same slot as before. + */ + if (old->agm >= 3) { + synaptics_mt_state_set(mt_state, 3, 0, old->agm); + break; + } + + /* + * After some 3->1 and all 3->2 transitions, we lose track + * of which slot is reported by SGM and AGM. + * + * For 2->3 in this state, report 3 fingers, but empty all + * slots, and we will guess (0,2) on a subsequent 0->3. + * + * To userspace, the resulting transition will look like: + * 2:[0,1] -> 3:[-1,-1] -> 3:[0,2] + */ + if (priv->mt_state_lost) { + synaptics_mt_state_set(mt_state, 3, -1, -1); + break; + } + + /* + * If the (SGM,AGM) really previously contained slots (0, 1), + * then we cannot know what slot was just reported by the AGM, + * because the 2->3 transition can occur either before or after + * the AGM packet. Thus, this most recent AGM could contain + * either the same old slot 1 or the new slot 2. + * Subsequent AGMs will be reporting slot 2. + * + * To userspace, the resulting transition will look like: + * 2:[0,1] -> 3:[0,-1] -> 3:[0,2] + */ + synaptics_mt_state_set(mt_state, 3, 0, -1); + break; + case 3: + /* + * If, for whatever reason, the previous agm was invalid, + * Assume SGM now contains slot 0, AGM now contains slot 2. + */ + if (old->agm <= 2) + synaptics_mt_state_set(mt_state, 3, 0, 2); + /* + * mt_state either hasn't changed, or was updated by a recently + * received AGM-CONTACT packet. + */ + break; + + case 4: + case 5: + /* mt_state was updated by AGM-CONTACT packet */ + break; + } +} + +/* Handle case where mt_state->count = 4, or = 5 */ +static void synaptics_image_sensor_45f(struct synaptics_data *priv, + struct synaptics_mt_state *mt_state) +{ + /* mt_state was updated correctly by AGM-CONTACT packet */ + priv->mt_state_lost = false; +} + +static void synaptics_image_sensor_process(struct psmouse *psmouse, + struct synaptics_hw_state *sgm) +{ + struct synaptics_data *priv = psmouse->private; + struct synaptics_hw_state *agm = &priv->agm; + struct synaptics_mt_state mt_state; + + /* Initialize using current mt_state (as updated by last agm) */ + mt_state = agm->mt_state; + + /* + * Update mt_state using the new finger count and current mt_state. + */ + if (sgm->z == 0) + synaptics_image_sensor_0f(priv, &mt_state); + else if (sgm->w >= 4) + synaptics_image_sensor_1f(priv, &mt_state); + else if (sgm->w == 0) + synaptics_image_sensor_2f(priv, &mt_state); + else if (sgm->w == 1 && mt_state.count <= 3) + synaptics_image_sensor_3f(priv, &mt_state); + else + synaptics_image_sensor_45f(priv, &mt_state); + + /* Send resulting input events to user space */ + synaptics_report_mt_data(psmouse, &mt_state, sgm); + + /* Store updated mt_state */ + priv->mt_state = agm->mt_state = mt_state; + priv->agm_pending = false; +} + +/* + * called for each full received packet from the touchpad + */ +static void synaptics_process_packet(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + struct synaptics_data *priv = psmouse->private; + struct synaptics_hw_state hw; + int num_fingers; + int finger_width; + + if (synaptics_parse_hw_state(psmouse->packet, priv, &hw)) + return; + + if (SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) { + synaptics_image_sensor_process(psmouse, &hw); + return; + } + + if (hw.scroll) { + priv->scroll += hw.scroll; + + while (priv->scroll >= 4) { + input_report_key(dev, BTN_BACK, !hw.down); + input_sync(dev); + input_report_key(dev, BTN_BACK, hw.down); + input_sync(dev); + priv->scroll -= 4; + } + while (priv->scroll <= -4) { + input_report_key(dev, BTN_FORWARD, !hw.up); + input_sync(dev); + input_report_key(dev, BTN_FORWARD, hw.up); + input_sync(dev); + priv->scroll += 4; + } + return; + } + + if (hw.z > 0 && hw.x > 1) { + num_fingers = 1; + finger_width = 5; + if (SYN_CAP_EXTENDED(priv->capabilities)) { + switch (hw.w) { + case 0 ... 1: + if (SYN_CAP_MULTIFINGER(priv->capabilities)) + num_fingers = hw.w + 2; + break; + case 2: + if (SYN_MODEL_PEN(priv->model_id)) + ; /* Nothing, treat a pen as a single finger */ + break; + case 4 ... 15: + if (SYN_CAP_PALMDETECT(priv->capabilities)) + finger_width = hw.w; + break; + } + } + } else { + num_fingers = 0; + finger_width = 0; + } + + if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) + synaptics_report_semi_mt_data(dev, &hw, &priv->agm, + num_fingers); + + /* Post events + * BTN_TOUCH has to be first as mousedev relies on it when doing + * absolute -> relative conversion + */ + if (hw.z > 30) input_report_key(dev, BTN_TOUCH, 1); + if (hw.z < 25) input_report_key(dev, BTN_TOUCH, 0); + + if (num_fingers > 0) { + input_report_abs(dev, ABS_X, hw.x); + input_report_abs(dev, ABS_Y, synaptics_invert_y(hw.y)); + } + input_report_abs(dev, ABS_PRESSURE, hw.z); + + if (SYN_CAP_PALMDETECT(priv->capabilities)) + input_report_abs(dev, ABS_TOOL_WIDTH, finger_width); + + input_report_key(dev, BTN_TOOL_FINGER, num_fingers == 1); + if (SYN_CAP_MULTIFINGER(priv->capabilities)) { + input_report_key(dev, BTN_TOOL_DOUBLETAP, num_fingers == 2); + input_report_key(dev, BTN_TOOL_TRIPLETAP, num_fingers == 3); + } + + synaptics_report_buttons(psmouse, &hw); + + input_sync(dev); +} + +static int synaptics_validate_byte(struct psmouse *psmouse, + int idx, unsigned char pkt_type) +{ + static const unsigned char newabs_mask[] = { 0xC8, 0x00, 0x00, 0xC8, 0x00 }; + static const unsigned char newabs_rel_mask[] = { 0xC0, 0x00, 0x00, 0xC0, 0x00 }; + static const unsigned char newabs_rslt[] = { 0x80, 0x00, 0x00, 0xC0, 0x00 }; + static const unsigned char oldabs_mask[] = { 0xC0, 0x60, 0x00, 0xC0, 0x60 }; + static const unsigned char oldabs_rslt[] = { 0xC0, 0x00, 0x00, 0x80, 0x00 }; + const char *packet = psmouse->packet; + + if (idx < 0 || idx > 4) + return 0; + + switch (pkt_type) { + + case SYN_NEWABS: + case SYN_NEWABS_RELAXED: + return (packet[idx] & newabs_rel_mask[idx]) == newabs_rslt[idx]; + + case SYN_NEWABS_STRICT: + return (packet[idx] & newabs_mask[idx]) == newabs_rslt[idx]; + + case SYN_OLDABS: + return (packet[idx] & oldabs_mask[idx]) == oldabs_rslt[idx]; + + default: + psmouse_err(psmouse, "unknown packet type %d\n", pkt_type); + return 0; + } +} + +static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse) +{ + int i; + + for (i = 0; i < 5; i++) + if (!synaptics_validate_byte(psmouse, i, SYN_NEWABS_STRICT)) { + psmouse_info(psmouse, "using relaxed packet validation\n"); + return SYN_NEWABS_RELAXED; + } + + return SYN_NEWABS_STRICT; +} + +static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + + if (psmouse->pktcnt >= 6) { /* Full packet received */ + if (unlikely(priv->pkt_type == SYN_NEWABS)) + priv->pkt_type = synaptics_detect_pkt_type(psmouse); + + if (SYN_CAP_PASS_THROUGH(priv->capabilities) && + synaptics_is_pt_packet(psmouse->packet)) { + if (priv->pt_port) + synaptics_pass_pt_packet(priv->pt_port, psmouse->packet); + } else + synaptics_process_packet(psmouse); + + return PSMOUSE_FULL_PACKET; + } + + return synaptics_validate_byte(psmouse, psmouse->pktcnt - 1, priv->pkt_type) ? + PSMOUSE_GOOD_DATA : PSMOUSE_BAD_DATA; +} + +/***************************************************************************** + * Driver initialization/cleanup functions + ****************************************************************************/ +static void set_abs_position_params(struct input_dev *dev, + struct synaptics_data *priv, int x_code, + int y_code) +{ + int x_min = priv->x_min ?: XMIN_NOMINAL; + int x_max = priv->x_max ?: XMAX_NOMINAL; + int y_min = priv->y_min ?: YMIN_NOMINAL; + int y_max = priv->y_max ?: YMAX_NOMINAL; + int fuzz = SYN_CAP_REDUCED_FILTERING(priv->ext_cap_0c) ? + SYN_REDUCED_FILTER_FUZZ : 0; + + input_set_abs_params(dev, x_code, x_min, x_max, fuzz, 0); + input_set_abs_params(dev, y_code, y_min, y_max, fuzz, 0); + input_abs_set_res(dev, x_code, priv->x_res); + input_abs_set_res(dev, y_code, priv->y_res); +} + +static void set_input_params(struct input_dev *dev, struct synaptics_data *priv) +{ + int i; + + /* Things that apply to both modes */ + __set_bit(INPUT_PROP_POINTER, dev->propbit); + __set_bit(EV_KEY, dev->evbit); + __set_bit(BTN_LEFT, dev->keybit); + __set_bit(BTN_RIGHT, dev->keybit); + + if (SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) + __set_bit(BTN_MIDDLE, dev->keybit); + + if (!priv->absolute_mode) { + /* Relative mode */ + __set_bit(EV_REL, dev->evbit); + __set_bit(REL_X, dev->relbit); + __set_bit(REL_Y, dev->relbit); + return; + } + + /* Absolute mode */ + __set_bit(EV_ABS, dev->evbit); + set_abs_position_params(dev, priv, ABS_X, ABS_Y); + input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); + + if (SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) { + set_abs_position_params(dev, priv, ABS_MT_POSITION_X, + ABS_MT_POSITION_Y); + /* Image sensors can report per-contact pressure */ + input_set_abs_params(dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + input_mt_init_slots(dev, 2, INPUT_MT_POINTER); + + /* Image sensors can signal 4 and 5 finger clicks */ + __set_bit(BTN_TOOL_QUADTAP, dev->keybit); + __set_bit(BTN_TOOL_QUINTTAP, dev->keybit); + } else if (SYN_CAP_ADV_GESTURE(priv->ext_cap_0c)) { + /* Non-image sensors with AGM use semi-mt */ + __set_bit(INPUT_PROP_SEMI_MT, dev->propbit); + input_mt_init_slots(dev, 2, 0); + set_abs_position_params(dev, priv, ABS_MT_POSITION_X, + ABS_MT_POSITION_Y); + } + + if (SYN_CAP_PALMDETECT(priv->capabilities)) + input_set_abs_params(dev, ABS_TOOL_WIDTH, 0, 15, 0, 0); + + __set_bit(BTN_TOUCH, dev->keybit); + __set_bit(BTN_TOOL_FINGER, dev->keybit); + + if (SYN_CAP_MULTIFINGER(priv->capabilities)) { + __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); + __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit); + } + + if (SYN_CAP_FOUR_BUTTON(priv->capabilities) || + SYN_CAP_MIDDLE_BUTTON(priv->capabilities)) { + __set_bit(BTN_FORWARD, dev->keybit); + __set_bit(BTN_BACK, dev->keybit); + } + + for (i = 0; i < SYN_CAP_MULTI_BUTTON_NO(priv->ext_cap); i++) + __set_bit(BTN_0 + i, dev->keybit); + + __clear_bit(EV_REL, dev->evbit); + __clear_bit(REL_X, dev->relbit); + __clear_bit(REL_Y, dev->relbit); + + if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { + __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); + /* Clickpads report only left button */ + __clear_bit(BTN_RIGHT, dev->keybit); + __clear_bit(BTN_MIDDLE, dev->keybit); + } +} + +static ssize_t synaptics_show_disable_gesture(struct psmouse *psmouse, + void *data, char *buf) +{ + struct synaptics_data *priv = psmouse->private; + + return sprintf(buf, "%c\n", priv->disable_gesture ? '1' : '0'); +} + +static ssize_t synaptics_set_disable_gesture(struct psmouse *psmouse, + void *data, const char *buf, + size_t len) +{ + struct synaptics_data *priv = psmouse->private; + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (value == priv->disable_gesture) + return len; + + priv->disable_gesture = value; + if (value) + priv->mode |= SYN_BIT_DISABLE_GESTURE; + else + priv->mode &= ~SYN_BIT_DISABLE_GESTURE; + + if (synaptics_mode_cmd(psmouse, priv->mode)) + return -EIO; + + return len; +} + +PSMOUSE_DEFINE_ATTR(disable_gesture, S_IWUSR | S_IRUGO, NULL, + synaptics_show_disable_gesture, + synaptics_set_disable_gesture); + +static void synaptics_disconnect(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + + if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(priv->identity)) + device_remove_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_disable_gesture.dattr); + + synaptics_reset(psmouse); + kfree(priv); + psmouse->private = NULL; +} + +static int synaptics_reconnect(struct psmouse *psmouse) +{ + struct synaptics_data *priv = psmouse->private; + struct synaptics_data old_priv = *priv; + unsigned char param[2]; + int retry = 0; + int error; + + do { + psmouse_reset(psmouse); + if (retry) { + /* + * On some boxes, right after resuming, the touchpad + * needs some time to finish initializing (I assume + * it needs time to calibrate) and start responding + * to Synaptics-specific queries, so let's wait a + * bit. + */ + ssleep(1); + } + ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID); + error = synaptics_detect(psmouse, 0); + } while (error && ++retry < 3); + + if (error) + return -1; + + if (retry > 1) + psmouse_dbg(psmouse, "reconnected after %d tries\n", retry); + + if (synaptics_query_hardware(psmouse)) { + psmouse_err(psmouse, "Unable to query device.\n"); + return -1; + } + + if (synaptics_set_mode(psmouse)) { + psmouse_err(psmouse, "Unable to initialize device.\n"); + return -1; + } + + if (old_priv.identity != priv->identity || + old_priv.model_id != priv->model_id || + old_priv.capabilities != priv->capabilities || + old_priv.ext_cap != priv->ext_cap) { + psmouse_err(psmouse, + "hardware appears to be different: id(%ld-%ld), model(%ld-%ld), caps(%lx-%lx), ext(%lx-%lx).\n", + old_priv.identity, priv->identity, + old_priv.model_id, priv->model_id, + old_priv.capabilities, priv->capabilities, + old_priv.ext_cap, priv->ext_cap); + return -1; + } + + return 0; +} + +static bool impaired_toshiba_kbc; + +static const struct dmi_system_id __initconst toshiba_dmi_table[] = { +#if defined(CONFIG_DMI) && defined(CONFIG_X86) + { + /* Toshiba Satellite */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"), + }, + }, + { + /* Toshiba Dynabook */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "dynabook"), + }, + }, + { + /* Toshiba Portege M300 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), + }, + + }, + { + /* Toshiba Portege M300 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), + }, + + }, +#endif + { } +}; + +static bool broken_olpc_ec; + +static const struct dmi_system_id __initconst olpc_dmi_table[] = { +#if defined(CONFIG_DMI) && defined(CONFIG_OLPC) + { + /* OLPC XO-1 or XO-1.5 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "OLPC"), + DMI_MATCH(DMI_PRODUCT_NAME, "XO"), + }, + }, +#endif + { } +}; + +static const struct dmi_system_id min_max_dmi_table[] __initconst = { +#if defined(CONFIG_DMI) + { + /* Lenovo ThinkPad Helix */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"), + }, + .driver_data = (int []){1024, 5052, 2258, 4832}, + }, + { + /* Lenovo ThinkPad X240 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X240"), + }, + .driver_data = (int []){1232, 5710, 1156, 4696}, + }, + { + /* Lenovo ThinkPad Edge E431 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Edge E431"), + }, + .driver_data = (int []){1024, 5022, 2508, 4832}, + }, + { + /* Lenovo ThinkPad T431s */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T431"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, + { + /* Lenovo ThinkPad T440s */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, + { + /* Lenovo ThinkPad L440 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L440"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, + { + /* Lenovo ThinkPad T540p */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, + { + /* Lenovo ThinkPad L540 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L540"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, + { + /* Lenovo ThinkPad W540 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W540"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, + { + /* Lenovo Yoga S1 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, + "ThinkPad S1 Yoga"), + }, + .driver_data = (int []){1232, 5710, 1156, 4696}, + }, + { + /* Lenovo ThinkPad X1 Carbon Haswell (3rd generation) */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, + "ThinkPad X1 Carbon 2nd"), + }, + .driver_data = (int []){1024, 5112, 2024, 4832}, + }, +#endif + { } +}; + +void __init synaptics_module_init(void) +{ + const struct dmi_system_id *min_max_dmi; + + impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); + broken_olpc_ec = dmi_check_system(olpc_dmi_table); + + min_max_dmi = dmi_first_match(min_max_dmi_table); + if (min_max_dmi) + quirk_min_max = min_max_dmi->driver_data; +} + +static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) +{ + struct synaptics_data *priv; + int err = -1; + + /* + * The OLPC XO has issues with Synaptics' absolute mode; the constant + * packet spew overloads the EC such that key presses on the keyboard + * are missed. Given that, don't even attempt to use Absolute mode. + * Relative mode seems to work just fine. + */ + if (absolute_mode && broken_olpc_ec) { + psmouse_info(psmouse, + "OLPC XO detected, not enabling Synaptics protocol.\n"); + return -ENODEV; + } + + psmouse->private = priv = kzalloc(sizeof(struct synaptics_data), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + psmouse_reset(psmouse); + + if (synaptics_query_hardware(psmouse)) { + psmouse_err(psmouse, "Unable to query device.\n"); + goto init_fail; + } + + priv->absolute_mode = absolute_mode; + if (SYN_ID_DISGEST_SUPPORTED(priv->identity)) + priv->disable_gesture = true; + + if (synaptics_set_mode(psmouse)) { + psmouse_err(psmouse, "Unable to initialize device.\n"); + goto init_fail; + } + + priv->pkt_type = SYN_MODEL_NEWABS(priv->model_id) ? SYN_NEWABS : SYN_OLDABS; + + psmouse_info(psmouse, + "Touchpad model: %ld, fw: %ld.%ld, id: %#lx, caps: %#lx/%#lx/%#lx, board id: %lu, fw id: %lu\n", + SYN_ID_MODEL(priv->identity), + SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity), + priv->model_id, + priv->capabilities, priv->ext_cap, priv->ext_cap_0c, + priv->board_id, priv->firmware_id); + + set_input_params(psmouse->dev, priv); + + /* + * Encode touchpad model so that it can be used to set + * input device->id.version and be visible to userspace. + * Because version is __u16 we have to drop something. + * Hardware info bits seem to be good candidates as they + * are documented to be for Synaptics corp. internal use. + */ + psmouse->model = ((priv->model_id & 0x00ff0000) >> 8) | + (priv->model_id & 0x000000ff); + + if (absolute_mode) { + psmouse->protocol_handler = synaptics_process_byte; + psmouse->pktsize = 6; + } else { + /* Relative mode follows standard PS/2 mouse protocol */ + psmouse->protocol_handler = psmouse_process_byte; + psmouse->pktsize = 3; + } + + psmouse->set_rate = synaptics_set_rate; + psmouse->disconnect = synaptics_disconnect; + psmouse->reconnect = synaptics_reconnect; + psmouse->cleanup = synaptics_reset; + /* Synaptics can usually stay in sync without extra help */ + psmouse->resync_time = 0; + + if (SYN_CAP_PASS_THROUGH(priv->capabilities)) + synaptics_pt_create(psmouse); + + /* + * Toshiba's KBC seems to have trouble handling data from + * Synaptics at full rate. Switch to a lower rate (roughly + * the same rate as a standard PS/2 mouse). + */ + if (psmouse->rate >= 80 && impaired_toshiba_kbc) { + psmouse_info(psmouse, + "Toshiba %s detected, limiting rate to 40pps.\n", + dmi_get_system_info(DMI_PRODUCT_NAME)); + psmouse->rate = 40; + } + + if (!priv->absolute_mode && SYN_ID_DISGEST_SUPPORTED(priv->identity)) { + err = device_create_file(&psmouse->ps2dev.serio->dev, + &psmouse_attr_disable_gesture.dattr); + if (err) { + psmouse_err(psmouse, + "Failed to create disable_gesture attribute (%d)", + err); + goto init_fail; + } + } + + return 0; + + init_fail: + kfree(priv); + return err; +} + +int synaptics_init(struct psmouse *psmouse) +{ + return __synaptics_init(psmouse, true); +} + +int synaptics_init_relative(struct psmouse *psmouse) +{ + return __synaptics_init(psmouse, false); +} + +bool synaptics_supported(void) +{ + return true; +} + +#else /* CONFIG_MOUSE_PS2_SYNAPTICS */ + +void __init synaptics_module_init(void) +{ +} + +int synaptics_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} + +bool synaptics_supported(void) +{ + return false; +} + +#endif /* CONFIG_MOUSE_PS2_SYNAPTICS */ diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h new file mode 100644 index 00000000..fb2e0767 --- /dev/null +++ b/drivers/input/mouse/synaptics.h @@ -0,0 +1,200 @@ +/* + * Synaptics TouchPad PS/2 mouse driver + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _SYNAPTICS_H +#define _SYNAPTICS_H + +/* synaptics queries */ +#define SYN_QUE_IDENTIFY 0x00 +#define SYN_QUE_MODES 0x01 +#define SYN_QUE_CAPABILITIES 0x02 +#define SYN_QUE_MODEL 0x03 +#define SYN_QUE_SERIAL_NUMBER_PREFIX 0x06 +#define SYN_QUE_SERIAL_NUMBER_SUFFIX 0x07 +#define SYN_QUE_RESOLUTION 0x08 +#define SYN_QUE_EXT_CAPAB 0x09 +#define SYN_QUE_FIRMWARE_ID 0x0a +#define SYN_QUE_EXT_CAPAB_0C 0x0c +#define SYN_QUE_EXT_MAX_COORDS 0x0d +#define SYN_QUE_EXT_MIN_COORDS 0x0f + +/* synatics modes */ +#define SYN_BIT_ABSOLUTE_MODE (1 << 7) +#define SYN_BIT_HIGH_RATE (1 << 6) +#define SYN_BIT_SLEEP_MODE (1 << 3) +#define SYN_BIT_DISABLE_GESTURE (1 << 2) +#define SYN_BIT_FOUR_BYTE_CLIENT (1 << 1) +#define SYN_BIT_W_MODE (1 << 0) + +/* synaptics model ID bits */ +#define SYN_MODEL_ROT180(m) ((m) & (1 << 23)) +#define SYN_MODEL_PORTRAIT(m) ((m) & (1 << 22)) +#define SYN_MODEL_SENSOR(m) (((m) >> 16) & 0x3f) +#define SYN_MODEL_HARDWARE(m) (((m) >> 9) & 0x7f) +#define SYN_MODEL_NEWABS(m) ((m) & (1 << 7)) +#define SYN_MODEL_PEN(m) ((m) & (1 << 6)) +#define SYN_MODEL_SIMPLIC(m) ((m) & (1 << 5)) +#define SYN_MODEL_GEOMETRY(m) ((m) & 0x0f) + +/* synaptics capability bits */ +#define SYN_CAP_EXTENDED(c) ((c) & (1 << 23)) +#define SYN_CAP_MIDDLE_BUTTON(c) ((c) & (1 << 18)) +#define SYN_CAP_PASS_THROUGH(c) ((c) & (1 << 7)) +#define SYN_CAP_SLEEP(c) ((c) & (1 << 4)) +#define SYN_CAP_FOUR_BUTTON(c) ((c) & (1 << 3)) +#define SYN_CAP_MULTIFINGER(c) ((c) & (1 << 1)) +#define SYN_CAP_PALMDETECT(c) ((c) & (1 << 0)) +#define SYN_CAP_SUBMODEL_ID(c) (((c) & 0x00ff00) >> 8) +#define SYN_EXT_CAP_REQUESTS(c) (((c) & 0x700000) >> 20) +#define SYN_CAP_MULTI_BUTTON_NO(ec) (((ec) & 0x00f000) >> 12) +#define SYN_CAP_PRODUCT_ID(ec) (((ec) & 0xff0000) >> 16) + +/* + * The following describes response for the 0x0c query. + * + * byte mask name meaning + * ---- ---- ------- ------------ + * 1 0x01 adjustable threshold capacitive button sensitivity + * can be adjusted + * 1 0x02 report max query 0x0d gives max coord reported + * 1 0x04 clearpad sensor is ClearPad product + * 1 0x08 advanced gesture not particularly meaningful + * 1 0x10 clickpad bit 0 1-button ClickPad + * 1 0x60 multifinger mode identifies firmware finger counting + * (not reporting!) algorithm. + * Not particularly meaningful + * 1 0x80 covered pad W clipped to 14, 15 == pad mostly covered + * 2 0x01 clickpad bit 1 2-button ClickPad + * 2 0x02 deluxe LED controls touchpad support LED commands + * ala multimedia control bar + * 2 0x04 reduced filtering firmware does less filtering on + * position data, driver should watch + * for noise. + * 2 0x08 image sensor image sensor tracks 5 fingers, but only + * reports 2. + * 2 0x20 report min query 0x0f gives min coord reported + * 2 0x80 forcepad forcepad is a variant of clickpad that + * does not have physical buttons but rather + * uses pressure above certain threshold to + * report primary clicks. Forcepads also have + * clickpad bit set. + */ +#define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & 0x100000) /* 1-button ClickPad */ +#define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & 0x000100) /* 2-button ClickPad */ +#define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & 0x020000) +#define SYN_CAP_MIN_DIMENSIONS(ex0c) ((ex0c) & 0x002000) +#define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & 0x080000) +#define SYN_CAP_REDUCED_FILTERING(ex0c) ((ex0c) & 0x000400) +#define SYN_CAP_IMAGE_SENSOR(ex0c) ((ex0c) & 0x000800) +#define SYN_CAP_FORCEPAD(ex0c) ((ex0c) & 0x008000) + +/* synaptics modes query bits */ +#define SYN_MODE_ABSOLUTE(m) ((m) & (1 << 7)) +#define SYN_MODE_RATE(m) ((m) & (1 << 6)) +#define SYN_MODE_BAUD_SLEEP(m) ((m) & (1 << 3)) +#define SYN_MODE_DISABLE_GESTURE(m) ((m) & (1 << 2)) +#define SYN_MODE_PACKSIZE(m) ((m) & (1 << 1)) +#define SYN_MODE_WMODE(m) ((m) & (1 << 0)) + +/* synaptics identify query bits */ +#define SYN_ID_MODEL(i) (((i) >> 4) & 0x0f) +#define SYN_ID_MAJOR(i) ((i) & 0x0f) +#define SYN_ID_MINOR(i) (((i) >> 16) & 0xff) +#define SYN_ID_FULL(i) ((SYN_ID_MAJOR(i) << 8) | SYN_ID_MINOR(i)) +#define SYN_ID_IS_SYNAPTICS(i) ((((i) >> 8) & 0xff) == 0x47) +#define SYN_ID_DISGEST_SUPPORTED(i) (SYN_ID_MAJOR(i) >= 4) + +/* synaptics special commands */ +#define SYN_PS_SET_MODE2 0x14 +#define SYN_PS_CLIENT_CMD 0x28 + +/* synaptics packet types */ +#define SYN_NEWABS 0 +#define SYN_NEWABS_STRICT 1 +#define SYN_NEWABS_RELAXED 2 +#define SYN_OLDABS 3 + +/* amount to fuzz position data when touchpad reports reduced filtering */ +#define SYN_REDUCED_FILTER_FUZZ 8 + +/* + * A structure to describe which internal touchpad finger slots are being + * reported in raw packets. + */ +struct synaptics_mt_state { + int count; /* num fingers being tracked */ + int sgm; /* which slot is reported by sgm pkt */ + int agm; /* which slot is reported by agm pkt*/ +}; + +/* + * A structure to describe the state of the touchpad hardware (buttons and pad) + */ +struct synaptics_hw_state { + int x; + int y; + int z; + int w; + unsigned int left:1; + unsigned int right:1; + unsigned int middle:1; + unsigned int up:1; + unsigned int down:1; + unsigned char ext_buttons; + signed char scroll; + + /* As reported in last AGM-CONTACT packets */ + struct synaptics_mt_state mt_state; +}; + +struct synaptics_data { + /* Data read from the touchpad */ + unsigned long int model_id; /* Model-ID */ + unsigned long int firmware_id; /* Firmware-ID */ + unsigned long int board_id; /* Board-ID */ + unsigned long int capabilities; /* Capabilities */ + unsigned long int ext_cap; /* Extended Capabilities */ + unsigned long int ext_cap_0c; /* Ext Caps from 0x0c query */ + unsigned long int identity; /* Identification */ + unsigned int x_res, y_res; /* X/Y resolution in units/mm */ + unsigned int x_max, y_max; /* Max coordinates (from FW) */ + unsigned int x_min, y_min; /* Min coordinates (from FW) */ + + unsigned char pkt_type; /* packet type - old, new, etc */ + unsigned char mode; /* current mode byte */ + int scroll; + + bool absolute_mode; /* run in Absolute mode */ + bool disable_gesture; /* disable gestures */ + + struct serio *pt_port; /* Pass-through serio port */ + + struct synaptics_mt_state mt_state; /* Current mt finger state */ + bool mt_state_lost; /* mt_state may be incorrect */ + + /* + * Last received Advanced Gesture Mode (AGM) packet. An AGM packet + * contains position data for a second contact, at half resolution. + */ + struct synaptics_hw_state agm; + bool agm_pending; /* new AGM packet received */ + + /* ForcePad handling */ + unsigned long press_start; + bool press; + bool report_press; +}; + +void synaptics_module_init(void); +int synaptics_detect(struct psmouse *psmouse, bool set_properties); +int synaptics_init(struct psmouse *psmouse); +int synaptics_init_relative(struct psmouse *psmouse); +void synaptics_reset(struct psmouse *psmouse); +bool synaptics_supported(void); + +#endif /* _SYNAPTICS_H */ diff --git a/drivers/input/mouse/synaptics_i2c.c b/drivers/input/mouse/synaptics_i2c.c new file mode 100644 index 00000000..ad822608 --- /dev/null +++ b/drivers/input/mouse/synaptics_i2c.c @@ -0,0 +1,675 @@ +/* + * Synaptics touchpad with I2C interface + * + * Copyright (C) 2009 Compulab, Ltd. + * Mike Rapoport + * Igor Grinberg + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_NAME "synaptics_i2c" +/* maximum product id is 15 characters */ +#define PRODUCT_ID_LENGTH 15 +#define REGISTER_LENGTH 8 + +/* + * after soft reset, we should wait for 1 ms + * before the device becomes operational + */ +#define SOFT_RESET_DELAY_MS 3 +/* and after hard reset, we should wait for max 500ms */ +#define HARD_RESET_DELAY_MS 500 + +/* Registers by SMBus address */ +#define PAGE_SEL_REG 0xff +#define DEVICE_STATUS_REG 0x09 + +/* Registers by RMI address */ +#define DEV_CONTROL_REG 0x0000 +#define INTERRUPT_EN_REG 0x0001 +#define ERR_STAT_REG 0x0002 +#define INT_REQ_STAT_REG 0x0003 +#define DEV_COMMAND_REG 0x0004 + +#define RMI_PROT_VER_REG 0x0200 +#define MANUFACT_ID_REG 0x0201 +#define PHYS_INT_VER_REG 0x0202 +#define PROD_PROPERTY_REG 0x0203 +#define INFO_QUERY_REG0 0x0204 +#define INFO_QUERY_REG1 (INFO_QUERY_REG0 + 1) +#define INFO_QUERY_REG2 (INFO_QUERY_REG0 + 2) +#define INFO_QUERY_REG3 (INFO_QUERY_REG0 + 3) + +#define PRODUCT_ID_REG0 0x0210 +#define PRODUCT_ID_REG1 (PRODUCT_ID_REG0 + 1) +#define PRODUCT_ID_REG2 (PRODUCT_ID_REG0 + 2) +#define PRODUCT_ID_REG3 (PRODUCT_ID_REG0 + 3) +#define PRODUCT_ID_REG4 (PRODUCT_ID_REG0 + 4) +#define PRODUCT_ID_REG5 (PRODUCT_ID_REG0 + 5) +#define PRODUCT_ID_REG6 (PRODUCT_ID_REG0 + 6) +#define PRODUCT_ID_REG7 (PRODUCT_ID_REG0 + 7) +#define PRODUCT_ID_REG8 (PRODUCT_ID_REG0 + 8) +#define PRODUCT_ID_REG9 (PRODUCT_ID_REG0 + 9) +#define PRODUCT_ID_REG10 (PRODUCT_ID_REG0 + 10) +#define PRODUCT_ID_REG11 (PRODUCT_ID_REG0 + 11) +#define PRODUCT_ID_REG12 (PRODUCT_ID_REG0 + 12) +#define PRODUCT_ID_REG13 (PRODUCT_ID_REG0 + 13) +#define PRODUCT_ID_REG14 (PRODUCT_ID_REG0 + 14) +#define PRODUCT_ID_REG15 (PRODUCT_ID_REG0 + 15) + +#define DATA_REG0 0x0400 +#define ABS_PRESSURE_REG 0x0401 +#define ABS_MSB_X_REG 0x0402 +#define ABS_LSB_X_REG (ABS_MSB_X_REG + 1) +#define ABS_MSB_Y_REG 0x0404 +#define ABS_LSB_Y_REG (ABS_MSB_Y_REG + 1) +#define REL_X_REG 0x0406 +#define REL_Y_REG 0x0407 + +#define DEV_QUERY_REG0 0x1000 +#define DEV_QUERY_REG1 (DEV_QUERY_REG0 + 1) +#define DEV_QUERY_REG2 (DEV_QUERY_REG0 + 2) +#define DEV_QUERY_REG3 (DEV_QUERY_REG0 + 3) +#define DEV_QUERY_REG4 (DEV_QUERY_REG0 + 4) +#define DEV_QUERY_REG5 (DEV_QUERY_REG0 + 5) +#define DEV_QUERY_REG6 (DEV_QUERY_REG0 + 6) +#define DEV_QUERY_REG7 (DEV_QUERY_REG0 + 7) +#define DEV_QUERY_REG8 (DEV_QUERY_REG0 + 8) + +#define GENERAL_2D_CONTROL_REG 0x1041 +#define SENSOR_SENSITIVITY_REG 0x1044 +#define SENS_MAX_POS_MSB_REG 0x1046 +#define SENS_MAX_POS_LSB_REG (SENS_MAX_POS_UPPER_REG + 1) + +/* Register bits */ +/* Device Control Register Bits */ +#define REPORT_RATE_1ST_BIT 6 + +/* Interrupt Enable Register Bits (INTERRUPT_EN_REG) */ +#define F10_ABS_INT_ENA 0 +#define F10_REL_INT_ENA 1 +#define F20_INT_ENA 2 + +/* Interrupt Request Register Bits (INT_REQ_STAT_REG | DEVICE_STATUS_REG) */ +#define F10_ABS_INT_REQ 0 +#define F10_REL_INT_REQ 1 +#define F20_INT_REQ 2 +/* Device Status Register Bits (DEVICE_STATUS_REG) */ +#define STAT_CONFIGURED 6 +#define STAT_ERROR 7 + +/* Device Command Register Bits (DEV_COMMAND_REG) */ +#define RESET_COMMAND 0x01 +#define REZERO_COMMAND 0x02 + +/* Data Register 0 Bits (DATA_REG0) */ +#define GESTURE 3 + +/* Device Query Registers Bits */ +/* DEV_QUERY_REG3 */ +#define HAS_PALM_DETECT 1 +#define HAS_MULTI_FING 2 +#define HAS_SCROLLER 4 +#define HAS_2D_SCROLL 5 + +/* General 2D Control Register Bits (GENERAL_2D_CONTROL_REG) */ +#define NO_DECELERATION 1 +#define REDUCE_REPORTING 3 +#define NO_FILTER 5 + +/* Function Masks */ +/* Device Control Register Masks (DEV_CONTROL_REG) */ +#define REPORT_RATE_MSK 0xc0 +#define SLEEP_MODE_MSK 0x07 + +/* Device Sleep Modes */ +#define FULL_AWAKE 0x0 +#define NORMAL_OP 0x1 +#define LOW_PWR_OP 0x2 +#define VERY_LOW_PWR_OP 0x3 +#define SENS_SLEEP 0x4 +#define SLEEP_MOD 0x5 +#define DEEP_SLEEP 0x6 +#define HIBERNATE 0x7 + +/* Interrupt Register Mask */ +/* (INT_REQ_STAT_REG | DEVICE_STATUS_REG | INTERRUPT_EN_REG) */ +#define INT_ENA_REQ_MSK 0x07 +#define INT_ENA_ABS_MSK 0x01 +#define INT_ENA_REL_MSK 0x02 +#define INT_ENA_F20_MSK 0x04 + +/* Device Status Register Masks (DEVICE_STATUS_REG) */ +#define CONFIGURED_MSK 0x40 +#define ERROR_MSK 0x80 + +/* Data Register 0 Masks */ +#define FINGER_WIDTH_MSK 0xf0 +#define GESTURE_MSK 0x08 +#define SENSOR_STATUS_MSK 0x07 + +/* + * MSB Position Register Masks + * ABS_MSB_X_REG | ABS_MSB_Y_REG | SENS_MAX_POS_MSB_REG | + * DEV_QUERY_REG3 | DEV_QUERY_REG5 + */ +#define MSB_POSITION_MSK 0x1f + +/* Device Query Registers Masks */ + +/* DEV_QUERY_REG2 */ +#define NUM_EXTRA_POS_MSK 0x07 + +/* When in IRQ mode read the device every THREAD_IRQ_SLEEP_SECS */ +#define THREAD_IRQ_SLEEP_SECS 2 +#define THREAD_IRQ_SLEEP_MSECS (THREAD_IRQ_SLEEP_SECS * MSEC_PER_SEC) + +/* + * When in Polling mode and no data received for NO_DATA_THRES msecs + * reduce the polling rate to NO_DATA_SLEEP_MSECS + */ +#define NO_DATA_THRES (MSEC_PER_SEC) +#define NO_DATA_SLEEP_MSECS (MSEC_PER_SEC / 4) + +/* Control touchpad's No Deceleration option */ +static bool no_decel = 1; +module_param(no_decel, bool, 0644); +MODULE_PARM_DESC(no_decel, "No Deceleration. Default = 1 (on)"); + +/* Control touchpad's Reduced Reporting option */ +static bool reduce_report; +module_param(reduce_report, bool, 0644); +MODULE_PARM_DESC(reduce_report, "Reduced Reporting. Default = 0 (off)"); + +/* Control touchpad's No Filter option */ +static bool no_filter; +module_param(no_filter, bool, 0644); +MODULE_PARM_DESC(no_filter, "No Filter. Default = 0 (off)"); + +/* + * touchpad Attention line is Active Low and Open Drain, + * therefore should be connected to pulled up line + * and the irq configuration should be set to Falling Edge Trigger + */ +/* Control IRQ / Polling option */ +static bool polling_req; +module_param(polling_req, bool, 0444); +MODULE_PARM_DESC(polling_req, "Request Polling. Default = 0 (use irq)"); + +/* Control Polling Rate */ +static int scan_rate = 80; +module_param(scan_rate, int, 0644); +MODULE_PARM_DESC(scan_rate, "Polling rate in times/sec. Default = 80"); + +/* The main device structure */ +struct synaptics_i2c { + struct i2c_client *client; + struct input_dev *input; + struct delayed_work dwork; + spinlock_t lock; + int no_data_count; + int no_decel_param; + int reduce_report_param; + int no_filter_param; + int scan_rate_param; + int scan_ms; +}; + +static inline void set_scan_rate(struct synaptics_i2c *touch, int scan_rate) +{ + touch->scan_ms = MSEC_PER_SEC / scan_rate; + touch->scan_rate_param = scan_rate; +} + +/* + * Driver's initial design makes no race condition possible on i2c bus, + * so there is no need in any locking. + * Keep it in mind, while playing with the code. + */ +static s32 synaptics_i2c_reg_get(struct i2c_client *client, u16 reg) +{ + int ret; + + ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8); + if (ret == 0) + ret = i2c_smbus_read_byte_data(client, reg & 0xff); + + return ret; +} + +static s32 synaptics_i2c_reg_set(struct i2c_client *client, u16 reg, u8 val) +{ + int ret; + + ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8); + if (ret == 0) + ret = i2c_smbus_write_byte_data(client, reg & 0xff, val); + + return ret; +} + +static s32 synaptics_i2c_word_get(struct i2c_client *client, u16 reg) +{ + int ret; + + ret = i2c_smbus_write_byte_data(client, PAGE_SEL_REG, reg >> 8); + if (ret == 0) + ret = i2c_smbus_read_word_data(client, reg & 0xff); + + return ret; +} + +static int synaptics_i2c_config(struct i2c_client *client) +{ + int ret, control; + u8 int_en; + + /* set Report Rate to Device Highest (>=80) and Sleep to normal */ + ret = synaptics_i2c_reg_set(client, DEV_CONTROL_REG, 0xc1); + if (ret) + return ret; + + /* set Interrupt Disable to Func20 / Enable to Func10) */ + int_en = (polling_req) ? 0 : INT_ENA_ABS_MSK | INT_ENA_REL_MSK; + ret = synaptics_i2c_reg_set(client, INTERRUPT_EN_REG, int_en); + if (ret) + return ret; + + control = synaptics_i2c_reg_get(client, GENERAL_2D_CONTROL_REG); + /* No Deceleration */ + control |= no_decel ? 1 << NO_DECELERATION : 0; + /* Reduced Reporting */ + control |= reduce_report ? 1 << REDUCE_REPORTING : 0; + /* No Filter */ + control |= no_filter ? 1 << NO_FILTER : 0; + ret = synaptics_i2c_reg_set(client, GENERAL_2D_CONTROL_REG, control); + if (ret) + return ret; + + return 0; +} + +static int synaptics_i2c_reset_config(struct i2c_client *client) +{ + int ret; + + /* Reset the Touchpad */ + ret = synaptics_i2c_reg_set(client, DEV_COMMAND_REG, RESET_COMMAND); + if (ret) { + dev_err(&client->dev, "Unable to reset device\n"); + } else { + msleep(SOFT_RESET_DELAY_MS); + ret = synaptics_i2c_config(client); + if (ret) + dev_err(&client->dev, "Unable to config device\n"); + } + + return ret; +} + +static int synaptics_i2c_check_error(struct i2c_client *client) +{ + int status, ret = 0; + + status = i2c_smbus_read_byte_data(client, DEVICE_STATUS_REG) & + (CONFIGURED_MSK | ERROR_MSK); + + if (status != CONFIGURED_MSK) + ret = synaptics_i2c_reset_config(client); + + return ret; +} + +static bool synaptics_i2c_get_input(struct synaptics_i2c *touch) +{ + struct input_dev *input = touch->input; + int xy_delta, gesture; + s32 data; + s8 x_delta, y_delta; + + /* Deal with spontanious resets and errors */ + if (synaptics_i2c_check_error(touch->client)) + return 0; + + /* Get Gesture Bit */ + data = synaptics_i2c_reg_get(touch->client, DATA_REG0); + gesture = (data >> GESTURE) & 0x1; + + /* + * Get Relative axes. we have to get them in one shot, + * so we get 2 bytes starting from REL_X_REG. + */ + xy_delta = synaptics_i2c_word_get(touch->client, REL_X_REG) & 0xffff; + + /* Separate X from Y */ + x_delta = xy_delta & 0xff; + y_delta = (xy_delta >> REGISTER_LENGTH) & 0xff; + + /* Report the button event */ + input_report_key(input, BTN_LEFT, gesture); + + /* Report the deltas */ + input_report_rel(input, REL_X, x_delta); + input_report_rel(input, REL_Y, -y_delta); + input_sync(input); + + return xy_delta || gesture; +} + +static void synaptics_i2c_reschedule_work(struct synaptics_i2c *touch, + unsigned long delay) +{ + unsigned long flags; + + spin_lock_irqsave(&touch->lock, flags); + + mod_delayed_work(system_wq, &touch->dwork, delay); + + spin_unlock_irqrestore(&touch->lock, flags); +} + +static irqreturn_t synaptics_i2c_irq(int irq, void *dev_id) +{ + struct synaptics_i2c *touch = dev_id; + + synaptics_i2c_reschedule_work(touch, 0); + + return IRQ_HANDLED; +} + +static void synaptics_i2c_check_params(struct synaptics_i2c *touch) +{ + bool reset = false; + + if (scan_rate != touch->scan_rate_param) + set_scan_rate(touch, scan_rate); + + if (no_decel != touch->no_decel_param) { + touch->no_decel_param = no_decel; + reset = true; + } + + if (no_filter != touch->no_filter_param) { + touch->no_filter_param = no_filter; + reset = true; + } + + if (reduce_report != touch->reduce_report_param) { + touch->reduce_report_param = reduce_report; + reset = true; + } + + if (reset) + synaptics_i2c_reset_config(touch->client); +} + +/* Control the Device polling rate / Work Handler sleep time */ +static unsigned long synaptics_i2c_adjust_delay(struct synaptics_i2c *touch, + bool have_data) +{ + unsigned long delay, nodata_count_thres; + + if (polling_req) { + delay = touch->scan_ms; + if (have_data) { + touch->no_data_count = 0; + } else { + nodata_count_thres = NO_DATA_THRES / touch->scan_ms; + if (touch->no_data_count < nodata_count_thres) + touch->no_data_count++; + else + delay = NO_DATA_SLEEP_MSECS; + } + return msecs_to_jiffies(delay); + } else { + delay = msecs_to_jiffies(THREAD_IRQ_SLEEP_MSECS); + return round_jiffies_relative(delay); + } +} + +/* Work Handler */ +static void synaptics_i2c_work_handler(struct work_struct *work) +{ + bool have_data; + struct synaptics_i2c *touch = + container_of(work, struct synaptics_i2c, dwork.work); + unsigned long delay; + + synaptics_i2c_check_params(touch); + + have_data = synaptics_i2c_get_input(touch); + delay = synaptics_i2c_adjust_delay(touch, have_data); + + /* + * While interrupt driven, there is no real need to poll the device. + * But touchpads are very sensitive, so there could be errors + * related to physical environment and the attention line isn't + * necessarily asserted. In such case we can lose the touchpad. + * We poll the device once in THREAD_IRQ_SLEEP_SECS and + * if error is detected, we try to reset and reconfigure the touchpad. + */ + synaptics_i2c_reschedule_work(touch, delay); +} + +static int synaptics_i2c_open(struct input_dev *input) +{ + struct synaptics_i2c *touch = input_get_drvdata(input); + int ret; + + ret = synaptics_i2c_reset_config(touch->client); + if (ret) + return ret; + + if (polling_req) + synaptics_i2c_reschedule_work(touch, + msecs_to_jiffies(NO_DATA_SLEEP_MSECS)); + + return 0; +} + +static void synaptics_i2c_close(struct input_dev *input) +{ + struct synaptics_i2c *touch = input_get_drvdata(input); + + if (!polling_req) + synaptics_i2c_reg_set(touch->client, INTERRUPT_EN_REG, 0); + + cancel_delayed_work_sync(&touch->dwork); + + /* Save some power */ + synaptics_i2c_reg_set(touch->client, DEV_CONTROL_REG, DEEP_SLEEP); +} + +static void synaptics_i2c_set_input_params(struct synaptics_i2c *touch) +{ + struct input_dev *input = touch->input; + + input->name = touch->client->name; + input->phys = touch->client->adapter->name; + input->id.bustype = BUS_I2C; + input->id.version = synaptics_i2c_word_get(touch->client, + INFO_QUERY_REG0); + input->dev.parent = &touch->client->dev; + input->open = synaptics_i2c_open; + input->close = synaptics_i2c_close; + input_set_drvdata(input, touch); + + /* Register the device as mouse */ + __set_bit(EV_REL, input->evbit); + __set_bit(REL_X, input->relbit); + __set_bit(REL_Y, input->relbit); + + /* Register device's buttons and keys */ + __set_bit(EV_KEY, input->evbit); + __set_bit(BTN_LEFT, input->keybit); +} + +static struct synaptics_i2c *synaptics_i2c_touch_create(struct i2c_client *client) +{ + struct synaptics_i2c *touch; + + touch = kzalloc(sizeof(struct synaptics_i2c), GFP_KERNEL); + if (!touch) + return NULL; + + touch->client = client; + touch->no_decel_param = no_decel; + touch->scan_rate_param = scan_rate; + set_scan_rate(touch, scan_rate); + INIT_DELAYED_WORK(&touch->dwork, synaptics_i2c_work_handler); + spin_lock_init(&touch->lock); + + return touch; +} + +static int synaptics_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int ret; + struct synaptics_i2c *touch; + + touch = synaptics_i2c_touch_create(client); + if (!touch) + return -ENOMEM; + + ret = synaptics_i2c_reset_config(client); + if (ret) + goto err_mem_free; + + if (client->irq < 1) + polling_req = true; + + touch->input = input_allocate_device(); + if (!touch->input) { + ret = -ENOMEM; + goto err_mem_free; + } + + synaptics_i2c_set_input_params(touch); + + if (!polling_req) { + dev_dbg(&touch->client->dev, + "Requesting IRQ: %d\n", touch->client->irq); + + ret = request_irq(touch->client->irq, synaptics_i2c_irq, + IRQ_TYPE_EDGE_FALLING, + DRIVER_NAME, touch); + if (ret) { + dev_warn(&touch->client->dev, + "IRQ request failed: %d, " + "falling back to polling\n", ret); + polling_req = true; + synaptics_i2c_reg_set(touch->client, + INTERRUPT_EN_REG, 0); + } + } + + if (polling_req) + dev_dbg(&touch->client->dev, + "Using polling at rate: %d times/sec\n", scan_rate); + + /* Register the device in input subsystem */ + ret = input_register_device(touch->input); + if (ret) { + dev_err(&client->dev, + "Input device register failed: %d\n", ret); + goto err_input_free; + } + + i2c_set_clientdata(client, touch); + + return 0; + +err_input_free: + input_free_device(touch->input); +err_mem_free: + kfree(touch); + + return ret; +} + +static int synaptics_i2c_remove(struct i2c_client *client) +{ + struct synaptics_i2c *touch = i2c_get_clientdata(client); + + if (!polling_req) + free_irq(client->irq, touch); + + input_unregister_device(touch->input); + kfree(touch); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int synaptics_i2c_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct synaptics_i2c *touch = i2c_get_clientdata(client); + + cancel_delayed_work_sync(&touch->dwork); + + /* Save some power */ + synaptics_i2c_reg_set(touch->client, DEV_CONTROL_REG, DEEP_SLEEP); + + return 0; +} + +static int synaptics_i2c_resume(struct device *dev) +{ + int ret; + struct i2c_client *client = to_i2c_client(dev); + struct synaptics_i2c *touch = i2c_get_clientdata(client); + + ret = synaptics_i2c_reset_config(client); + if (ret) + return ret; + + synaptics_i2c_reschedule_work(touch, + msecs_to_jiffies(NO_DATA_SLEEP_MSECS)); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(synaptics_i2c_pm, synaptics_i2c_suspend, + synaptics_i2c_resume); + +static const struct i2c_device_id synaptics_i2c_id_table[] = { + { "synaptics_i2c", 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, synaptics_i2c_id_table); + +static struct i2c_driver synaptics_i2c_driver = { + .driver = { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + .pm = &synaptics_i2c_pm, + }, + + .probe = synaptics_i2c_probe, + .remove = synaptics_i2c_remove, + + .id_table = synaptics_i2c_id_table, +}; + +module_i2c_driver(synaptics_i2c_driver); + +MODULE_DESCRIPTION("Synaptics I2C touchpad driver"); +MODULE_AUTHOR("Mike Rapoport, Igor Grinberg, Compulab"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/mouse/synaptics_usb.c b/drivers/input/mouse/synaptics_usb.c new file mode 100644 index 00000000..64cf34ea --- /dev/null +++ b/drivers/input/mouse/synaptics_usb.c @@ -0,0 +1,557 @@ +/* + * USB Synaptics device driver + * + * Copyright (c) 2002 Rob Miller (rob@inpharmatica . co . uk) + * Copyright (c) 2003 Ron Lee (ron@debian.org) + * cPad driver for kernel 2.4 + * + * Copyright (c) 2004 Jan Steinhoff (cpad@jan-steinhoff . de) + * Copyright (c) 2004 Ron Lee (ron@debian.org) + * rewritten for kernel 2.6 + * + * cPad display character device part is not included. It can be found at + * http://jan-steinhoff.de/linux/synaptics-usb.html + * + * Bases on: usb_skeleton.c v2.2 by Greg Kroah-Hartman + * drivers/hid/usbhid/usbmouse.c by Vojtech Pavlik + * drivers/input/mouse/synaptics.c by Peter Osterlund + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * Trademarks are the property of their respective owners. + */ + +/* + * There are three different types of Synaptics USB devices: Touchpads, + * touchsticks (or trackpoints), and touchscreens. Touchpads are well supported + * by this driver, touchstick support has not been tested much yet, and + * touchscreens have not been tested at all. + * + * Up to three alternate settings are possible: + * setting 0: one int endpoint for relative movement (used by usbhid.ko) + * setting 1: one int endpoint for absolute finger position + * setting 2 (cPad only): one int endpoint for absolute finger position and + * two bulk endpoints for the display (in/out) + * This driver uses setting 1. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define USB_VENDOR_ID_SYNAPTICS 0x06cb +#define USB_DEVICE_ID_SYNAPTICS_TP 0x0001 /* Synaptics USB TouchPad */ +#define USB_DEVICE_ID_SYNAPTICS_INT_TP 0x0002 /* Integrated USB TouchPad */ +#define USB_DEVICE_ID_SYNAPTICS_CPAD 0x0003 /* Synaptics cPad */ +#define USB_DEVICE_ID_SYNAPTICS_TS 0x0006 /* Synaptics TouchScreen */ +#define USB_DEVICE_ID_SYNAPTICS_STICK 0x0007 /* Synaptics USB Styk */ +#define USB_DEVICE_ID_SYNAPTICS_WP 0x0008 /* Synaptics USB WheelPad */ +#define USB_DEVICE_ID_SYNAPTICS_COMP_TP 0x0009 /* Composite USB TouchPad */ +#define USB_DEVICE_ID_SYNAPTICS_WTP 0x0010 /* Wireless TouchPad */ +#define USB_DEVICE_ID_SYNAPTICS_DPAD 0x0013 /* DisplayPad */ + +#define SYNUSB_TOUCHPAD (1 << 0) +#define SYNUSB_STICK (1 << 1) +#define SYNUSB_TOUCHSCREEN (1 << 2) +#define SYNUSB_AUXDISPLAY (1 << 3) /* For cPad */ +#define SYNUSB_COMBO (1 << 4) /* Composite device (TP + stick) */ +#define SYNUSB_IO_ALWAYS (1 << 5) + +#define USB_DEVICE_SYNAPTICS(prod, kind) \ + USB_DEVICE(USB_VENDOR_ID_SYNAPTICS, \ + USB_DEVICE_ID_SYNAPTICS_##prod), \ + .driver_info = (kind), + +#define SYNUSB_RECV_SIZE 8 + +#define XMIN_NOMINAL 1472 +#define XMAX_NOMINAL 5472 +#define YMIN_NOMINAL 1408 +#define YMAX_NOMINAL 4448 + +struct synusb { + struct usb_device *udev; + struct usb_interface *intf; + struct urb *urb; + unsigned char *data; + + /* input device related data structures */ + struct input_dev *input; + char name[128]; + char phys[64]; + + /* characteristics of the device */ + unsigned long flags; +}; + +static void synusb_report_buttons(struct synusb *synusb) +{ + struct input_dev *input_dev = synusb->input; + + input_report_key(input_dev, BTN_LEFT, synusb->data[1] & 0x04); + input_report_key(input_dev, BTN_RIGHT, synusb->data[1] & 0x01); + input_report_key(input_dev, BTN_MIDDLE, synusb->data[1] & 0x02); +} + +static void synusb_report_stick(struct synusb *synusb) +{ + struct input_dev *input_dev = synusb->input; + int x, y; + unsigned int pressure; + + pressure = synusb->data[6]; + x = (s16)(be16_to_cpup((__be16 *)&synusb->data[2]) << 3) >> 7; + y = (s16)(be16_to_cpup((__be16 *)&synusb->data[4]) << 3) >> 7; + + if (pressure > 0) { + input_report_rel(input_dev, REL_X, x); + input_report_rel(input_dev, REL_Y, -y); + } + + input_report_abs(input_dev, ABS_PRESSURE, pressure); + + synusb_report_buttons(synusb); + + input_sync(input_dev); +} + +static void synusb_report_touchpad(struct synusb *synusb) +{ + struct input_dev *input_dev = synusb->input; + unsigned int num_fingers, tool_width; + unsigned int x, y; + unsigned int pressure, w; + + pressure = synusb->data[6]; + x = be16_to_cpup((__be16 *)&synusb->data[2]); + y = be16_to_cpup((__be16 *)&synusb->data[4]); + w = synusb->data[0] & 0x0f; + + if (pressure > 0) { + num_fingers = 1; + tool_width = 5; + switch (w) { + case 0 ... 1: + num_fingers = 2 + w; + break; + + case 2: /* pen, pretend its a finger */ + break; + + case 4 ... 15: + tool_width = w; + break; + } + } else { + num_fingers = 0; + tool_width = 0; + } + + /* + * Post events + * BTN_TOUCH has to be first as mousedev relies on it when doing + * absolute -> relative conversion + */ + + if (pressure > 30) + input_report_key(input_dev, BTN_TOUCH, 1); + if (pressure < 25) + input_report_key(input_dev, BTN_TOUCH, 0); + + if (num_fingers > 0) { + input_report_abs(input_dev, ABS_X, x); + input_report_abs(input_dev, ABS_Y, + YMAX_NOMINAL + YMIN_NOMINAL - y); + } + + input_report_abs(input_dev, ABS_PRESSURE, pressure); + input_report_abs(input_dev, ABS_TOOL_WIDTH, tool_width); + + input_report_key(input_dev, BTN_TOOL_FINGER, num_fingers == 1); + input_report_key(input_dev, BTN_TOOL_DOUBLETAP, num_fingers == 2); + input_report_key(input_dev, BTN_TOOL_TRIPLETAP, num_fingers == 3); + + synusb_report_buttons(synusb); + if (synusb->flags & SYNUSB_AUXDISPLAY) + input_report_key(input_dev, BTN_MIDDLE, synusb->data[1] & 0x08); + + input_sync(input_dev); +} + +static void synusb_irq(struct urb *urb) +{ + struct synusb *synusb = urb->context; + int error; + + /* Check our status in case we need to bail out early. */ + switch (urb->status) { + case 0: + usb_mark_last_busy(synusb->udev); + break; + + /* Device went away so don't keep trying to read from it. */ + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + return; + + default: + goto resubmit; + break; + } + + if (synusb->flags & SYNUSB_STICK) + synusb_report_stick(synusb); + else + synusb_report_touchpad(synusb); + +resubmit: + error = usb_submit_urb(urb, GFP_ATOMIC); + if (error && error != -EPERM) + dev_err(&synusb->intf->dev, + "%s - usb_submit_urb failed with result: %d", + __func__, error); +} + +static struct usb_endpoint_descriptor * +synusb_get_in_endpoint(struct usb_host_interface *iface) +{ + + struct usb_endpoint_descriptor *endpoint; + int i; + + for (i = 0; i < iface->desc.bNumEndpoints; ++i) { + endpoint = &iface->endpoint[i].desc; + + if (usb_endpoint_is_int_in(endpoint)) { + /* we found our interrupt in endpoint */ + return endpoint; + } + } + + return NULL; +} + +static int synusb_open(struct input_dev *dev) +{ + struct synusb *synusb = input_get_drvdata(dev); + int retval; + + retval = usb_autopm_get_interface(synusb->intf); + if (retval) { + dev_err(&synusb->intf->dev, + "%s - usb_autopm_get_interface failed, error: %d\n", + __func__, retval); + return retval; + } + + retval = usb_submit_urb(synusb->urb, GFP_KERNEL); + if (retval) { + dev_err(&synusb->intf->dev, + "%s - usb_submit_urb failed, error: %d\n", + __func__, retval); + retval = -EIO; + goto out; + } + + synusb->intf->needs_remote_wakeup = 1; + +out: + usb_autopm_put_interface(synusb->intf); + return retval; +} + +static void synusb_close(struct input_dev *dev) +{ + struct synusb *synusb = input_get_drvdata(dev); + int autopm_error; + + autopm_error = usb_autopm_get_interface(synusb->intf); + + usb_kill_urb(synusb->urb); + synusb->intf->needs_remote_wakeup = 0; + + if (!autopm_error) + usb_autopm_put_interface(synusb->intf); +} + +static int synusb_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + struct usb_device *udev = interface_to_usbdev(intf); + struct usb_endpoint_descriptor *ep; + struct synusb *synusb; + struct input_dev *input_dev; + unsigned int intf_num = intf->cur_altsetting->desc.bInterfaceNumber; + unsigned int altsetting = min(intf->num_altsetting, 1U); + int error; + + error = usb_set_interface(udev, intf_num, altsetting); + if (error) { + dev_err(&udev->dev, + "Can not set alternate setting to %i, error: %i", + altsetting, error); + return error; + } + + ep = synusb_get_in_endpoint(intf->cur_altsetting); + if (!ep) + return -ENODEV; + + synusb = kzalloc(sizeof(*synusb), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!synusb || !input_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + synusb->udev = udev; + synusb->intf = intf; + synusb->input = input_dev; + + synusb->flags = id->driver_info; + if (synusb->flags & SYNUSB_COMBO) { + /* + * This is a combo device, we need to set proper + * capability, depending on the interface. + */ + synusb->flags |= intf_num == 1 ? + SYNUSB_STICK : SYNUSB_TOUCHPAD; + } + + synusb->urb = usb_alloc_urb(0, GFP_KERNEL); + if (!synusb->urb) { + error = -ENOMEM; + goto err_free_mem; + } + + synusb->data = usb_alloc_coherent(udev, SYNUSB_RECV_SIZE, GFP_KERNEL, + &synusb->urb->transfer_dma); + if (!synusb->data) { + error = -ENOMEM; + goto err_free_urb; + } + + usb_fill_int_urb(synusb->urb, udev, + usb_rcvintpipe(udev, ep->bEndpointAddress), + synusb->data, SYNUSB_RECV_SIZE, + synusb_irq, synusb, + ep->bInterval); + synusb->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + if (udev->manufacturer) + strlcpy(synusb->name, udev->manufacturer, + sizeof(synusb->name)); + + if (udev->product) { + if (udev->manufacturer) + strlcat(synusb->name, " ", sizeof(synusb->name)); + strlcat(synusb->name, udev->product, sizeof(synusb->name)); + } + + if (!strlen(synusb->name)) + snprintf(synusb->name, sizeof(synusb->name), + "USB Synaptics Device %04x:%04x", + le16_to_cpu(udev->descriptor.idVendor), + le16_to_cpu(udev->descriptor.idProduct)); + + if (synusb->flags & SYNUSB_STICK) + strlcat(synusb->name, " (Stick)", sizeof(synusb->name)); + + usb_make_path(udev, synusb->phys, sizeof(synusb->phys)); + strlcat(synusb->phys, "/input0", sizeof(synusb->phys)); + + input_dev->name = synusb->name; + input_dev->phys = synusb->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &synusb->intf->dev; + + if (!(synusb->flags & SYNUSB_IO_ALWAYS)) { + input_dev->open = synusb_open; + input_dev->close = synusb_close; + } + + input_set_drvdata(input_dev, synusb); + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + + if (synusb->flags & SYNUSB_STICK) { + __set_bit(EV_REL, input_dev->evbit); + __set_bit(REL_X, input_dev->relbit); + __set_bit(REL_Y, input_dev->relbit); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 127, 0, 0); + } else { + input_set_abs_params(input_dev, ABS_X, + XMIN_NOMINAL, XMAX_NOMINAL, 0, 0); + input_set_abs_params(input_dev, ABS_Y, + YMIN_NOMINAL, YMAX_NOMINAL, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 255, 0, 0); + input_set_abs_params(input_dev, ABS_TOOL_WIDTH, 0, 15, 0, 0); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(BTN_TOOL_FINGER, input_dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); + __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); + } + + __set_bit(BTN_LEFT, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + __set_bit(BTN_MIDDLE, input_dev->keybit); + + usb_set_intfdata(intf, synusb); + + if (synusb->flags & SYNUSB_IO_ALWAYS) { + error = synusb_open(input_dev); + if (error) + goto err_free_dma; + } + + error = input_register_device(input_dev); + if (error) { + dev_err(&udev->dev, + "Failed to register input device, error %d\n", + error); + goto err_stop_io; + } + + return 0; + +err_stop_io: + if (synusb->flags & SYNUSB_IO_ALWAYS) + synusb_close(synusb->input); +err_free_dma: + usb_free_coherent(udev, SYNUSB_RECV_SIZE, synusb->data, + synusb->urb->transfer_dma); +err_free_urb: + usb_free_urb(synusb->urb); +err_free_mem: + input_free_device(input_dev); + kfree(synusb); + usb_set_intfdata(intf, NULL); + + return error; +} + +static void synusb_disconnect(struct usb_interface *intf) +{ + struct synusb *synusb = usb_get_intfdata(intf); + struct usb_device *udev = interface_to_usbdev(intf); + + if (synusb->flags & SYNUSB_IO_ALWAYS) + synusb_close(synusb->input); + + input_unregister_device(synusb->input); + + usb_free_coherent(udev, SYNUSB_RECV_SIZE, synusb->data, + synusb->urb->transfer_dma); + usb_free_urb(synusb->urb); + kfree(synusb); + + usb_set_intfdata(intf, NULL); +} + +static int synusb_suspend(struct usb_interface *intf, pm_message_t message) +{ + struct synusb *synusb = usb_get_intfdata(intf); + struct input_dev *input_dev = synusb->input; + + mutex_lock(&input_dev->mutex); + usb_kill_urb(synusb->urb); + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int synusb_resume(struct usb_interface *intf) +{ + struct synusb *synusb = usb_get_intfdata(intf); + struct input_dev *input_dev = synusb->input; + int retval = 0; + + mutex_lock(&input_dev->mutex); + + if ((input_dev->users || (synusb->flags & SYNUSB_IO_ALWAYS)) && + usb_submit_urb(synusb->urb, GFP_NOIO) < 0) { + retval = -EIO; + } + + mutex_unlock(&input_dev->mutex); + + return retval; +} + +static int synusb_pre_reset(struct usb_interface *intf) +{ + struct synusb *synusb = usb_get_intfdata(intf); + struct input_dev *input_dev = synusb->input; + + mutex_lock(&input_dev->mutex); + usb_kill_urb(synusb->urb); + + return 0; +} + +static int synusb_post_reset(struct usb_interface *intf) +{ + struct synusb *synusb = usb_get_intfdata(intf); + struct input_dev *input_dev = synusb->input; + int retval = 0; + + if ((input_dev->users || (synusb->flags & SYNUSB_IO_ALWAYS)) && + usb_submit_urb(synusb->urb, GFP_NOIO) < 0) { + retval = -EIO; + } + + mutex_unlock(&input_dev->mutex); + + return retval; +} + +static int synusb_reset_resume(struct usb_interface *intf) +{ + return synusb_resume(intf); +} + +static struct usb_device_id synusb_idtable[] = { + { USB_DEVICE_SYNAPTICS(TP, SYNUSB_TOUCHPAD) }, + { USB_DEVICE_SYNAPTICS(INT_TP, SYNUSB_TOUCHPAD) }, + { USB_DEVICE_SYNAPTICS(CPAD, + SYNUSB_TOUCHPAD | SYNUSB_AUXDISPLAY | SYNUSB_IO_ALWAYS) }, + { USB_DEVICE_SYNAPTICS(TS, SYNUSB_TOUCHSCREEN) }, + { USB_DEVICE_SYNAPTICS(STICK, SYNUSB_STICK) }, + { USB_DEVICE_SYNAPTICS(WP, SYNUSB_TOUCHPAD) }, + { USB_DEVICE_SYNAPTICS(COMP_TP, SYNUSB_COMBO) }, + { USB_DEVICE_SYNAPTICS(WTP, SYNUSB_TOUCHPAD) }, + { USB_DEVICE_SYNAPTICS(DPAD, SYNUSB_TOUCHPAD) }, + { } +}; +MODULE_DEVICE_TABLE(usb, synusb_idtable); + +static struct usb_driver synusb_driver = { + .name = "synaptics_usb", + .probe = synusb_probe, + .disconnect = synusb_disconnect, + .id_table = synusb_idtable, + .suspend = synusb_suspend, + .resume = synusb_resume, + .pre_reset = synusb_pre_reset, + .post_reset = synusb_post_reset, + .reset_resume = synusb_reset_resume, + .supports_autosuspend = 1, +}; + +module_usb_driver(synusb_driver); + +MODULE_AUTHOR("Rob Miller , " + "Ron Lee , " + "Jan Steinhoff "); +MODULE_DESCRIPTION("Synaptics USB device driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/mouse/touchkit_ps2.c b/drivers/input/mouse/touchkit_ps2.c new file mode 100644 index 00000000..1fd8f5e1 --- /dev/null +++ b/drivers/input/mouse/touchkit_ps2.c @@ -0,0 +1,100 @@ +/* ---------------------------------------------------------------------------- + * touchkit_ps2.c -- Driver for eGalax TouchKit PS/2 Touchscreens + * + * Copyright (C) 2005 by Stefan Lucke + * Copyright (C) 2004 by Daniel Ritz + * Copyright (C) by Todd E. Johnson (mtouchusb.c) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Based upon touchkitusb.c + * + * Vendor documentation is available at: + * http://home.eeti.com.tw/web20/drivers/Software%20Programming%20Guide_v2.0.pdf + */ + +#include + +#include +#include +#include + +#include "psmouse.h" +#include "touchkit_ps2.h" + +#define TOUCHKIT_MAX_XC 0x07ff +#define TOUCHKIT_MAX_YC 0x07ff + +#define TOUCHKIT_CMD 0x0a +#define TOUCHKIT_CMD_LENGTH 1 + +#define TOUCHKIT_CMD_ACTIVE 'A' +#define TOUCHKIT_CMD_FIRMWARE_VERSION 'D' +#define TOUCHKIT_CMD_CONTROLLER_TYPE 'E' + +#define TOUCHKIT_SEND_PARMS(s, r, c) ((s) << 12 | (r) << 8 | (c)) + +#define TOUCHKIT_GET_TOUCHED(packet) (((packet)[0]) & 0x01) +#define TOUCHKIT_GET_X(packet) (((packet)[1] << 7) | (packet)[2]) +#define TOUCHKIT_GET_Y(packet) (((packet)[3] << 7) | (packet)[4]) + +static psmouse_ret_t touchkit_ps2_process_byte(struct psmouse *psmouse) +{ + unsigned char *packet = psmouse->packet; + struct input_dev *dev = psmouse->dev; + + if (psmouse->pktcnt != 5) + return PSMOUSE_GOOD_DATA; + + input_report_abs(dev, ABS_X, TOUCHKIT_GET_X(packet)); + input_report_abs(dev, ABS_Y, TOUCHKIT_GET_Y(packet)); + input_report_key(dev, BTN_TOUCH, TOUCHKIT_GET_TOUCHED(packet)); + input_sync(dev); + + return PSMOUSE_FULL_PACKET; +} + +int touchkit_ps2_detect(struct psmouse *psmouse, bool set_properties) +{ + struct input_dev *dev = psmouse->dev; + unsigned char param[3]; + int command; + + param[0] = TOUCHKIT_CMD_LENGTH; + param[1] = TOUCHKIT_CMD_ACTIVE; + command = TOUCHKIT_SEND_PARMS(2, 3, TOUCHKIT_CMD); + + if (ps2_command(&psmouse->ps2dev, param, command)) + return -ENODEV; + + if (param[0] != TOUCHKIT_CMD || param[1] != 0x01 || + param[2] != TOUCHKIT_CMD_ACTIVE) + return -ENODEV; + + if (set_properties) { + dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + dev->keybit[BIT_WORD(BTN_MOUSE)] = 0; + dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(dev, ABS_X, 0, TOUCHKIT_MAX_XC, 0, 0); + input_set_abs_params(dev, ABS_Y, 0, TOUCHKIT_MAX_YC, 0, 0); + + psmouse->vendor = "eGalax"; + psmouse->name = "Touchscreen"; + psmouse->protocol_handler = touchkit_ps2_process_byte; + psmouse->pktsize = 5; + } + + return 0; +} diff --git a/drivers/input/mouse/touchkit_ps2.h b/drivers/input/mouse/touchkit_ps2.h new file mode 100644 index 00000000..2efe9ea2 --- /dev/null +++ b/drivers/input/mouse/touchkit_ps2.h @@ -0,0 +1,25 @@ +/* ---------------------------------------------------------------------------- + * touchkit_ps2.h -- Driver for eGalax TouchKit PS/2 Touchscreens + * + * Copyright (C) 2005 by Stefan Lucke + * Copyright (c) 2005 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _TOUCHKIT_PS2_H +#define _TOUCHKIT_PS2_H + +#ifdef CONFIG_MOUSE_PS2_TOUCHKIT +int touchkit_ps2_detect(struct psmouse *psmouse, bool set_properties); +#else +static inline int touchkit_ps2_detect(struct psmouse *psmouse, + bool set_properties) +{ + return -ENOSYS; +} +#endif /* CONFIG_MOUSE_PS2_TOUCHKIT */ + +#endif diff --git a/drivers/input/mouse/trackpoint.c b/drivers/input/mouse/trackpoint.c new file mode 100644 index 00000000..ca843b6c --- /dev/null +++ b/drivers/input/mouse/trackpoint.c @@ -0,0 +1,421 @@ +/* + * Stephen Evanchik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * Trademarks are the property of their respective owners. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "psmouse.h" +#include "trackpoint.h" + +/* + * Power-on Reset: Resets all trackpoint parameters, including RAM values, + * to defaults. + * Returns zero on success, non-zero on failure. + */ +static int trackpoint_power_on_reset(struct ps2dev *ps2dev) +{ + unsigned char results[2]; + int tries = 0; + + /* Issue POR command, and repeat up to once if 0xFC00 received */ + do { + if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || + ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 2, TP_POR))) + return -1; + } while (results[0] == 0xFC && results[1] == 0x00 && ++tries < 2); + + /* Check for success response -- 0xAA00 */ + if (results[0] != 0xAA || results[1] != 0x00) + return -1; + + return 0; +} + +/* + * Device IO: read, write and toggle bit + */ +static int trackpoint_read(struct ps2dev *ps2dev, + unsigned char loc, unsigned char *results) +{ + if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || + ps2_command(ps2dev, results, MAKE_PS2_CMD(0, 1, loc))) { + return -1; + } + + return 0; +} + +static int trackpoint_write(struct ps2dev *ps2dev, + unsigned char loc, unsigned char val) +{ + if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_WRITE_MEM)) || + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) || + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, val))) { + return -1; + } + + return 0; +} + +static int trackpoint_toggle_bit(struct ps2dev *ps2dev, + unsigned char loc, unsigned char mask) +{ + /* Bad things will happen if the loc param isn't in this range */ + if (loc < 0x20 || loc >= 0x2F) + return -1; + + if (ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_COMMAND)) || + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, TP_TOGGLE)) || + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, loc)) || + ps2_command(ps2dev, NULL, MAKE_PS2_CMD(0, 0, mask))) { + return -1; + } + + return 0; +} + +static int trackpoint_update_bit(struct ps2dev *ps2dev, unsigned char loc, + unsigned char mask, unsigned char value) +{ + int retval = 0; + unsigned char data; + + trackpoint_read(ps2dev, loc, &data); + if (((data & mask) == mask) != !!value) + retval = trackpoint_toggle_bit(ps2dev, loc, mask); + + return retval; +} + +/* + * Trackpoint-specific attributes + */ +struct trackpoint_attr_data { + size_t field_offset; + unsigned char command; + unsigned char mask; + unsigned char inverted; + unsigned char power_on_default; +}; + +static ssize_t trackpoint_show_int_attr(struct psmouse *psmouse, void *data, char *buf) +{ + struct trackpoint_data *tp = psmouse->private; + struct trackpoint_attr_data *attr = data; + unsigned char value = *(unsigned char *)((char *)tp + attr->field_offset); + + if (attr->inverted) + value = !value; + + return sprintf(buf, "%u\n", value); +} + +static ssize_t trackpoint_set_int_attr(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + struct trackpoint_data *tp = psmouse->private; + struct trackpoint_attr_data *attr = data; + unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); + unsigned char value; + int err; + + err = kstrtou8(buf, 10, &value); + if (err) + return err; + + *field = value; + trackpoint_write(&psmouse->ps2dev, attr->command, value); + + return count; +} + +#define TRACKPOINT_INT_ATTR(_name, _command, _default) \ + static struct trackpoint_attr_data trackpoint_attr_##_name = { \ + .field_offset = offsetof(struct trackpoint_data, _name), \ + .command = _command, \ + .power_on_default = _default, \ + }; \ + PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ + &trackpoint_attr_##_name, \ + trackpoint_show_int_attr, trackpoint_set_int_attr) + +static ssize_t trackpoint_set_bit_attr(struct psmouse *psmouse, void *data, + const char *buf, size_t count) +{ + struct trackpoint_data *tp = psmouse->private; + struct trackpoint_attr_data *attr = data; + unsigned char *field = (unsigned char *)((char *)tp + attr->field_offset); + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + if (value > 1) + return -EINVAL; + + if (attr->inverted) + value = !value; + + if (*field != value) { + *field = value; + trackpoint_toggle_bit(&psmouse->ps2dev, attr->command, attr->mask); + } + + return count; +} + + +#define TRACKPOINT_BIT_ATTR(_name, _command, _mask, _inv, _default) \ +static struct trackpoint_attr_data trackpoint_attr_##_name = { \ + .field_offset = offsetof(struct trackpoint_data, \ + _name), \ + .command = _command, \ + .mask = _mask, \ + .inverted = _inv, \ + .power_on_default = _default, \ + }; \ +PSMOUSE_DEFINE_ATTR(_name, S_IWUSR | S_IRUGO, \ + &trackpoint_attr_##_name, \ + trackpoint_show_int_attr, trackpoint_set_bit_attr) + +#define TRACKPOINT_UPDATE_BIT(_psmouse, _tp, _name) \ +do { \ + struct trackpoint_attr_data *_attr = &trackpoint_attr_##_name; \ + \ + trackpoint_update_bit(&_psmouse->ps2dev, \ + _attr->command, _attr->mask, _tp->_name); \ +} while (0) + +#define TRACKPOINT_UPDATE(_power_on, _psmouse, _tp, _name) \ +do { \ + if (!_power_on || \ + _tp->_name != trackpoint_attr_##_name.power_on_default) { \ + if (!trackpoint_attr_##_name.mask) \ + trackpoint_write(&_psmouse->ps2dev, \ + trackpoint_attr_##_name.command, \ + _tp->_name); \ + else \ + TRACKPOINT_UPDATE_BIT(_psmouse, _tp, _name); \ + } \ +} while (0) + +#define TRACKPOINT_SET_POWER_ON_DEFAULT(_tp, _name) \ + (_tp->_name = trackpoint_attr_##_name.power_on_default) + +TRACKPOINT_INT_ATTR(sensitivity, TP_SENS, TP_DEF_SENS); +TRACKPOINT_INT_ATTR(speed, TP_SPEED, TP_DEF_SPEED); +TRACKPOINT_INT_ATTR(inertia, TP_INERTIA, TP_DEF_INERTIA); +TRACKPOINT_INT_ATTR(reach, TP_REACH, TP_DEF_REACH); +TRACKPOINT_INT_ATTR(draghys, TP_DRAGHYS, TP_DEF_DRAGHYS); +TRACKPOINT_INT_ATTR(mindrag, TP_MINDRAG, TP_DEF_MINDRAG); +TRACKPOINT_INT_ATTR(thresh, TP_THRESH, TP_DEF_THRESH); +TRACKPOINT_INT_ATTR(upthresh, TP_UP_THRESH, TP_DEF_UP_THRESH); +TRACKPOINT_INT_ATTR(ztime, TP_Z_TIME, TP_DEF_Z_TIME); +TRACKPOINT_INT_ATTR(jenks, TP_JENKS_CURV, TP_DEF_JENKS_CURV); + +TRACKPOINT_BIT_ATTR(press_to_select, TP_TOGGLE_PTSON, TP_MASK_PTSON, 0, + TP_DEF_PTSON); +TRACKPOINT_BIT_ATTR(skipback, TP_TOGGLE_SKIPBACK, TP_MASK_SKIPBACK, 0, + TP_DEF_SKIPBACK); +TRACKPOINT_BIT_ATTR(ext_dev, TP_TOGGLE_EXT_DEV, TP_MASK_EXT_DEV, 1, + TP_DEF_EXT_DEV); + +static struct attribute *trackpoint_attrs[] = { + &psmouse_attr_sensitivity.dattr.attr, + &psmouse_attr_speed.dattr.attr, + &psmouse_attr_inertia.dattr.attr, + &psmouse_attr_reach.dattr.attr, + &psmouse_attr_draghys.dattr.attr, + &psmouse_attr_mindrag.dattr.attr, + &psmouse_attr_thresh.dattr.attr, + &psmouse_attr_upthresh.dattr.attr, + &psmouse_attr_ztime.dattr.attr, + &psmouse_attr_jenks.dattr.attr, + &psmouse_attr_press_to_select.dattr.attr, + &psmouse_attr_skipback.dattr.attr, + &psmouse_attr_ext_dev.dattr.attr, + NULL +}; + +static struct attribute_group trackpoint_attr_group = { + .attrs = trackpoint_attrs, +}; + +static int trackpoint_start_protocol(struct psmouse *psmouse, unsigned char *firmware_id) +{ + unsigned char param[2] = { 0 }; + + if (ps2_command(&psmouse->ps2dev, param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) + return -1; + + if (param[0] != TP_MAGIC_IDENT) + return -1; + + if (firmware_id) + *firmware_id = param[1]; + + return 0; +} + +/* + * Write parameters to trackpad. + * in_power_on_state: Set to true if TP is in default / power-on state (ex. if + * power-on reset was run). If so, values will only be + * written to TP if they differ from power-on default. + */ +static int trackpoint_sync(struct psmouse *psmouse, bool in_power_on_state) +{ + struct trackpoint_data *tp = psmouse->private; + + if (!in_power_on_state) { + /* + * Disable features that may make device unusable + * with this driver. + */ + trackpoint_update_bit(&psmouse->ps2dev, TP_TOGGLE_TWOHAND, + TP_MASK_TWOHAND, TP_DEF_TWOHAND); + + trackpoint_update_bit(&psmouse->ps2dev, TP_TOGGLE_SOURCE_TAG, + TP_MASK_SOURCE_TAG, TP_DEF_SOURCE_TAG); + + trackpoint_update_bit(&psmouse->ps2dev, TP_TOGGLE_MB, + TP_MASK_MB, TP_DEF_MB); + } + + /* + * These properties can be changed in this driver. Only + * configure them if the values are non-default or if the TP is in + * an unknown state. + */ + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, sensitivity); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, inertia); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, speed); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, reach); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, draghys); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, mindrag); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, thresh); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, upthresh); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, ztime); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, jenks); + + /* toggles */ + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, press_to_select); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, skipback); + TRACKPOINT_UPDATE(in_power_on_state, psmouse, tp, ext_dev); + + return 0; +} + +static void trackpoint_defaults(struct trackpoint_data *tp) +{ + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, sensitivity); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, speed); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, reach); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, draghys); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, mindrag); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, thresh); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, upthresh); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, ztime); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, jenks); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, inertia); + + /* toggles */ + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, press_to_select); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, skipback); + TRACKPOINT_SET_POWER_ON_DEFAULT(tp, ext_dev); +} + +static void trackpoint_disconnect(struct psmouse *psmouse) +{ + sysfs_remove_group(&psmouse->ps2dev.serio->dev.kobj, &trackpoint_attr_group); + + kfree(psmouse->private); + psmouse->private = NULL; +} + +static int trackpoint_reconnect(struct psmouse *psmouse) +{ + int reset_fail; + + if (trackpoint_start_protocol(psmouse, NULL)) + return -1; + + reset_fail = trackpoint_power_on_reset(&psmouse->ps2dev); + if (trackpoint_sync(psmouse, !reset_fail)) + return -1; + + return 0; +} + +int trackpoint_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char firmware_id; + unsigned char button_info; + int error; + + if (trackpoint_start_protocol(psmouse, &firmware_id)) + return -1; + + if (!set_properties) + return 0; + + if (trackpoint_read(&psmouse->ps2dev, TP_EXT_BTN, &button_info)) { + psmouse_warn(psmouse, "failed to get extended button data\n"); + button_info = 0; + } + + psmouse->private = kzalloc(sizeof(struct trackpoint_data), GFP_KERNEL); + if (!psmouse->private) + return -ENOMEM; + + psmouse->vendor = "IBM"; + psmouse->name = "TrackPoint"; + + psmouse->reconnect = trackpoint_reconnect; + psmouse->disconnect = trackpoint_disconnect; + + if ((button_info & 0x0f) >= 3) + __set_bit(BTN_MIDDLE, psmouse->dev->keybit); + + trackpoint_defaults(psmouse->private); + + error = trackpoint_power_on_reset(&psmouse->ps2dev); + + /* Write defaults to TP only if reset fails. */ + if (error) + trackpoint_sync(psmouse, false); + + error = sysfs_create_group(&ps2dev->serio->dev.kobj, &trackpoint_attr_group); + if (error) { + psmouse_err(psmouse, + "failed to create sysfs attributes, error: %d\n", + error); + kfree(psmouse->private); + psmouse->private = NULL; + return -1; + } + + psmouse_info(psmouse, + "IBM TrackPoint firmware: 0x%02x, buttons: %d/%d\n", + firmware_id, + (button_info & 0xf0) >> 4, button_info & 0x0f); + + return 0; +} + diff --git a/drivers/input/mouse/trackpoint.h b/drivers/input/mouse/trackpoint.h new file mode 100644 index 00000000..ecd05479 --- /dev/null +++ b/drivers/input/mouse/trackpoint.h @@ -0,0 +1,156 @@ +/* + * IBM TrackPoint PS/2 mouse driver + * + * Stephen Evanchik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _TRACKPOINT_H +#define _TRACKPOINT_H + +/* + * These constants are from the TrackPoint System + * Engineering documentation Version 4 from IBM Watson + * research: + * http://wwwcssrv.almaden.ibm.com/trackpoint/download.html + */ + +#define TP_COMMAND 0xE2 /* Commands start with this */ + +#define TP_READ_ID 0xE1 /* Sent for device identification */ +#define TP_MAGIC_IDENT 0x01 /* Sent after a TP_READ_ID followed */ + /* by the firmware ID */ + + +/* + * Commands + */ +#define TP_RECALIB 0x51 /* Recalibrate */ +#define TP_POWER_DOWN 0x44 /* Can only be undone through HW reset */ +#define TP_EXT_DEV 0x21 /* Determines if external device is connected (RO) */ +#define TP_EXT_BTN 0x4B /* Read extended button status */ +#define TP_POR 0x7F /* Execute Power on Reset */ +#define TP_POR_RESULTS 0x25 /* Read Power on Self test results */ +#define TP_DISABLE_EXT 0x40 /* Disable external pointing device */ +#define TP_ENABLE_EXT 0x41 /* Enable external pointing device */ + +/* + * Mode manipulation + */ +#define TP_SET_SOFT_TRANS 0x4E /* Set mode */ +#define TP_CANCEL_SOFT_TRANS 0xB9 /* Cancel mode */ +#define TP_SET_HARD_TRANS 0x45 /* Mode can only be set */ + + +/* + * Register oriented commands/properties + */ +#define TP_WRITE_MEM 0x81 +#define TP_READ_MEM 0x80 /* Not used in this implementation */ + +/* +* RAM Locations for properties + */ +#define TP_SENS 0x4A /* Sensitivity */ +#define TP_MB 0x4C /* Read Middle Button Status (RO) */ +#define TP_INERTIA 0x4D /* Negative Inertia */ +#define TP_SPEED 0x60 /* Speed of TP Cursor */ +#define TP_REACH 0x57 /* Backup for Z-axis press */ +#define TP_DRAGHYS 0x58 /* Drag Hysteresis */ + /* (how hard it is to drag */ + /* with Z-axis pressed) */ + +#define TP_MINDRAG 0x59 /* Minimum amount of force needed */ + /* to trigger dragging */ + +#define TP_THRESH 0x5C /* Minimum value for a Z-axis press */ +#define TP_UP_THRESH 0x5A /* Used to generate a 'click' on Z-axis */ +#define TP_Z_TIME 0x5E /* How sharp of a press */ +#define TP_JENKS_CURV 0x5D /* Minimum curvature for double click */ + +/* + * Toggling Flag bits + */ +#define TP_TOGGLE 0x47 /* Toggle command */ + +#define TP_TOGGLE_MB 0x23 /* Disable/Enable Middle Button */ +#define TP_MASK_MB 0x01 +#define TP_TOGGLE_EXT_DEV 0x23 /* Disable external device */ +#define TP_MASK_EXT_DEV 0x02 +#define TP_TOGGLE_DRIFT 0x23 /* Drift Correction */ +#define TP_MASK_DRIFT 0x80 +#define TP_TOGGLE_BURST 0x28 /* Burst Mode */ +#define TP_MASK_BURST 0x80 +#define TP_TOGGLE_PTSON 0x2C /* Press to Select */ +#define TP_MASK_PTSON 0x01 +#define TP_TOGGLE_HARD_TRANS 0x2C /* Alternate method to set Hard Transparency */ +#define TP_MASK_HARD_TRANS 0x80 +#define TP_TOGGLE_TWOHAND 0x2D /* Two handed */ +#define TP_MASK_TWOHAND 0x01 +#define TP_TOGGLE_STICKY_TWO 0x2D /* Sticky two handed */ +#define TP_MASK_STICKY_TWO 0x04 +#define TP_TOGGLE_SKIPBACK 0x2D /* Suppress movement after drag release */ +#define TP_MASK_SKIPBACK 0x08 +#define TP_TOGGLE_SOURCE_TAG 0x20 /* Bit 3 of the first packet will be set to + to the origin of the packet (external or TP) */ +#define TP_MASK_SOURCE_TAG 0x80 +#define TP_TOGGLE_EXT_TAG 0x22 /* Bit 3 of the first packet coming from the + external device will be forced to 1 */ +#define TP_MASK_EXT_TAG 0x04 + + +/* Power on Self Test Results */ +#define TP_POR_SUCCESS 0x3B + +/* + * Default power on values + */ +#define TP_DEF_SENS 0x80 +#define TP_DEF_INERTIA 0x06 +#define TP_DEF_SPEED 0x61 +#define TP_DEF_REACH 0x0A + +#define TP_DEF_DRAGHYS 0xFF +#define TP_DEF_MINDRAG 0x14 + +#define TP_DEF_THRESH 0x08 +#define TP_DEF_UP_THRESH 0xFF +#define TP_DEF_Z_TIME 0x26 +#define TP_DEF_JENKS_CURV 0x87 + +/* Toggles */ +#define TP_DEF_MB 0x00 +#define TP_DEF_PTSON 0x00 +#define TP_DEF_SKIPBACK 0x00 +#define TP_DEF_EXT_DEV 0x00 /* 0 means enabled */ +#define TP_DEF_TWOHAND 0x00 +#define TP_DEF_SOURCE_TAG 0x00 + +#define MAKE_PS2_CMD(params, results, cmd) ((params<<12) | (results<<8) | (cmd)) + +struct trackpoint_data +{ + unsigned char sensitivity, speed, inertia, reach; + unsigned char draghys, mindrag; + unsigned char thresh, upthresh; + unsigned char ztime, jenks; + + /* toggles */ + unsigned char press_to_select; + unsigned char skipback; + unsigned char ext_dev; +}; + +#ifdef CONFIG_MOUSE_PS2_TRACKPOINT +int trackpoint_detect(struct psmouse *psmouse, bool set_properties); +#else +inline int trackpoint_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} +#endif /* CONFIG_MOUSE_PS2_TRACKPOINT */ + +#endif /* _TRACKPOINT_H */ diff --git a/drivers/input/mouse/vsxxxaa.c b/drivers/input/mouse/vsxxxaa.c new file mode 100644 index 00000000..e900d465 --- /dev/null +++ b/drivers/input/mouse/vsxxxaa.c @@ -0,0 +1,551 @@ +/* + * Driver for DEC VSXXX-AA mouse (hockey-puck mouse, ball or two rollers) + * DEC VSXXX-GA mouse (rectangular mouse, with ball) + * DEC VSXXX-AB tablet (digitizer with hair cross or stylus) + * + * Copyright (C) 2003-2004 by Jan-Benedict Glaw + * + * The packet format was initially taken from a patch to GPM which is (C) 2001 + * by Karsten Merker + * and Maciej W. Rozycki + * Later on, I had access to the device's documentation (referenced below). + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Building an adaptor to DE9 / DB25 RS232 + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * DISCLAIMER: Use this description AT YOUR OWN RISK! I'll not pay for + * anything if you break your mouse, your computer or whatever! + * + * In theory, this mouse is a simple RS232 device. In practice, it has got + * a quite uncommon plug and the requirement to additionally get a power + * supply at +5V and -12V. + * + * If you look at the socket/jack (_not_ at the plug), we use this pin + * numbering: + * _______ + * / 7 6 5 \ + * | 4 --- 3 | + * \ 2 1 / + * ------- + * + * DEC socket DE9 DB25 Note + * 1 (GND) 5 7 - + * 2 (RxD) 2 3 - + * 3 (TxD) 3 2 - + * 4 (-12V) - - Somewhere from the PSU. At ATX, it's + * the thin blue wire at pin 12 of the + * ATX power connector. Only required for + * VSXXX-AA/-GA mice. + * 5 (+5V) - - PSU (red wires of ATX power connector + * on pin 4, 6, 19 or 20) or HDD power + * connector (also red wire). + * 6 (+12V) - - HDD power connector, yellow wire. Only + * required for VSXXX-AB digitizer. + * 7 (dev. avail.) - - The mouse shorts this one to pin 1. + * This way, the host computer can detect + * the mouse. To use it with the adaptor, + * simply don't connect this pin. + * + * So to get a working adaptor, you need to connect the mouse with three + * wires to a RS232 port and two or three additional wires for +5V, +12V and + * -12V to the PSU. + * + * Flow specification for the link is 4800, 8o1. + * + * The mice and tablet are described in "VCB02 Video Subsystem - Technical + * Manual", DEC EK-104AA-TM-001. You'll find it at MANX, a search engine + * specific for DEC documentation. Try + * http://www.vt100.net/manx/details?pn=EK-104AA-TM-001;id=21;cp=1 + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Driver for DEC VSXXX-AA and -GA mice and VSXXX-AB tablet" + +MODULE_AUTHOR("Jan-Benedict Glaw "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#undef VSXXXAA_DEBUG +#ifdef VSXXXAA_DEBUG +#define DBG(x...) printk(x) +#else +#define DBG(x...) do {} while (0) +#endif + +#define VSXXXAA_INTRO_MASK 0x80 +#define VSXXXAA_INTRO_HEAD 0x80 +#define IS_HDR_BYTE(x) \ + (((x) & VSXXXAA_INTRO_MASK) == VSXXXAA_INTRO_HEAD) + +#define VSXXXAA_PACKET_MASK 0xe0 +#define VSXXXAA_PACKET_REL 0x80 +#define VSXXXAA_PACKET_ABS 0xc0 +#define VSXXXAA_PACKET_POR 0xa0 +#define MATCH_PACKET_TYPE(data, type) \ + (((data) & VSXXXAA_PACKET_MASK) == (type)) + + + +struct vsxxxaa { + struct input_dev *dev; + struct serio *serio; +#define BUFLEN 15 /* At least 5 is needed for a full tablet packet */ + unsigned char buf[BUFLEN]; + unsigned char count; + unsigned char version; + unsigned char country; + unsigned char type; + char name[64]; + char phys[32]; +}; + +static void vsxxxaa_drop_bytes(struct vsxxxaa *mouse, int num) +{ + if (num >= mouse->count) { + mouse->count = 0; + } else { + memmove(mouse->buf, mouse->buf + num - 1, BUFLEN - num); + mouse->count -= num; + } +} + +static void vsxxxaa_queue_byte(struct vsxxxaa *mouse, unsigned char byte) +{ + if (mouse->count == BUFLEN) { + printk(KERN_ERR "%s on %s: Dropping a byte of full buffer.\n", + mouse->name, mouse->phys); + vsxxxaa_drop_bytes(mouse, 1); + } + + DBG(KERN_INFO "Queueing byte 0x%02x\n", byte); + + mouse->buf[mouse->count++] = byte; +} + +static void vsxxxaa_detection_done(struct vsxxxaa *mouse) +{ + switch (mouse->type) { + case 0x02: + strlcpy(mouse->name, "DEC VSXXX-AA/-GA mouse", + sizeof(mouse->name)); + break; + + case 0x04: + strlcpy(mouse->name, "DEC VSXXX-AB digitizer", + sizeof(mouse->name)); + break; + + default: + snprintf(mouse->name, sizeof(mouse->name), + "unknown DEC pointer device (type = 0x%02x)", + mouse->type); + break; + } + + printk(KERN_INFO + "Found %s version 0x%02x from country 0x%02x on port %s\n", + mouse->name, mouse->version, mouse->country, mouse->phys); +} + +/* + * Returns number of bytes to be dropped, 0 if packet is okay. + */ +static int vsxxxaa_check_packet(struct vsxxxaa *mouse, int packet_len) +{ + int i; + + /* First byte must be a header byte */ + if (!IS_HDR_BYTE(mouse->buf[0])) { + DBG("vsck: len=%d, 1st=0x%02x\n", packet_len, mouse->buf[0]); + return 1; + } + + /* Check all following bytes */ + for (i = 1; i < packet_len; i++) { + if (IS_HDR_BYTE(mouse->buf[i])) { + printk(KERN_ERR + "Need to drop %d bytes of a broken packet.\n", + i - 1); + DBG(KERN_INFO "check: len=%d, b[%d]=0x%02x\n", + packet_len, i, mouse->buf[i]); + return i - 1; + } + } + + return 0; +} + +static inline int vsxxxaa_smells_like_packet(struct vsxxxaa *mouse, + unsigned char type, size_t len) +{ + return mouse->count >= len && MATCH_PACKET_TYPE(mouse->buf[0], type); +} + +static void vsxxxaa_handle_REL_packet(struct vsxxxaa *mouse) +{ + struct input_dev *dev = mouse->dev; + unsigned char *buf = mouse->buf; + int left, middle, right; + int dx, dy; + + /* + * Check for normal stream packets. This is three bytes, + * with the first byte's 3 MSB set to 100. + * + * [0]: 1 0 0 SignX SignY Left Middle Right + * [1]: 0 dx dx dx dx dx dx dx + * [2]: 0 dy dy dy dy dy dy dy + */ + + /* + * Low 7 bit of byte 1 are abs(dx), bit 7 is + * 0, bit 4 of byte 0 is direction. + */ + dx = buf[1] & 0x7f; + dx *= ((buf[0] >> 4) & 0x01) ? 1 : -1; + + /* + * Low 7 bit of byte 2 are abs(dy), bit 7 is + * 0, bit 3 of byte 0 is direction. + */ + dy = buf[2] & 0x7f; + dy *= ((buf[0] >> 3) & 0x01) ? -1 : 1; + + /* + * Get button state. It's the low three bits + * (for three buttons) of byte 0. + */ + left = buf[0] & 0x04; + middle = buf[0] & 0x02; + right = buf[0] & 0x01; + + vsxxxaa_drop_bytes(mouse, 3); + + DBG(KERN_INFO "%s on %s: dx=%d, dy=%d, buttons=%s%s%s\n", + mouse->name, mouse->phys, dx, dy, + left ? "L" : "l", middle ? "M" : "m", right ? "R" : "r"); + + /* + * Report what we've found so far... + */ + input_report_key(dev, BTN_LEFT, left); + input_report_key(dev, BTN_MIDDLE, middle); + input_report_key(dev, BTN_RIGHT, right); + input_report_key(dev, BTN_TOUCH, 0); + input_report_rel(dev, REL_X, dx); + input_report_rel(dev, REL_Y, dy); + input_sync(dev); +} + +static void vsxxxaa_handle_ABS_packet(struct vsxxxaa *mouse) +{ + struct input_dev *dev = mouse->dev; + unsigned char *buf = mouse->buf; + int left, middle, right, touch; + int x, y; + + /* + * Tablet position / button packet + * + * [0]: 1 1 0 B4 B3 B2 B1 Pr + * [1]: 0 0 X5 X4 X3 X2 X1 X0 + * [2]: 0 0 X11 X10 X9 X8 X7 X6 + * [3]: 0 0 Y5 Y4 Y3 Y2 Y1 Y0 + * [4]: 0 0 Y11 Y10 Y9 Y8 Y7 Y6 + */ + + /* + * Get X/Y position. Y axis needs to be inverted since VSXXX-AB + * counts down->top while monitor counts top->bottom. + */ + x = ((buf[2] & 0x3f) << 6) | (buf[1] & 0x3f); + y = ((buf[4] & 0x3f) << 6) | (buf[3] & 0x3f); + y = 1023 - y; + + /* + * Get button state. It's bits <4..1> of byte 0. + */ + left = buf[0] & 0x02; + middle = buf[0] & 0x04; + right = buf[0] & 0x08; + touch = buf[0] & 0x10; + + vsxxxaa_drop_bytes(mouse, 5); + + DBG(KERN_INFO "%s on %s: x=%d, y=%d, buttons=%s%s%s%s\n", + mouse->name, mouse->phys, x, y, + left ? "L" : "l", middle ? "M" : "m", + right ? "R" : "r", touch ? "T" : "t"); + + /* + * Report what we've found so far... + */ + input_report_key(dev, BTN_LEFT, left); + input_report_key(dev, BTN_MIDDLE, middle); + input_report_key(dev, BTN_RIGHT, right); + input_report_key(dev, BTN_TOUCH, touch); + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + input_sync(dev); +} + +static void vsxxxaa_handle_POR_packet(struct vsxxxaa *mouse) +{ + struct input_dev *dev = mouse->dev; + unsigned char *buf = mouse->buf; + int left, middle, right; + unsigned char error; + + /* + * Check for Power-On-Reset packets. These are sent out + * after plugging the mouse in, or when explicitly + * requested by sending 'T'. + * + * [0]: 1 0 1 0 R3 R2 R1 R0 + * [1]: 0 M2 M1 M0 D3 D2 D1 D0 + * [2]: 0 E6 E5 E4 E3 E2 E1 E0 + * [3]: 0 0 0 0 0 Left Middle Right + * + * M: manufacturer location code + * R: revision code + * E: Error code. If it's in the range of 0x00..0x1f, only some + * minor problem occurred. Errors >= 0x20 are considered bad + * and the device may not work properly... + * D: <0010> == mouse, <0100> == tablet + */ + + mouse->version = buf[0] & 0x0f; + mouse->country = (buf[1] >> 4) & 0x07; + mouse->type = buf[1] & 0x0f; + error = buf[2] & 0x7f; + + /* + * Get button state. It's the low three bits + * (for three buttons) of byte 0. Maybe even the bit <3> + * has some meaning if a tablet is attached. + */ + left = buf[0] & 0x04; + middle = buf[0] & 0x02; + right = buf[0] & 0x01; + + vsxxxaa_drop_bytes(mouse, 4); + vsxxxaa_detection_done(mouse); + + if (error <= 0x1f) { + /* No (serious) error. Report buttons */ + input_report_key(dev, BTN_LEFT, left); + input_report_key(dev, BTN_MIDDLE, middle); + input_report_key(dev, BTN_RIGHT, right); + input_report_key(dev, BTN_TOUCH, 0); + input_sync(dev); + + if (error != 0) + printk(KERN_INFO "Your %s on %s reports error=0x%02x\n", + mouse->name, mouse->phys, error); + + } + + /* + * If the mouse was hot-plugged, we need to force differential mode + * now... However, give it a second to recover from it's reset. + */ + printk(KERN_NOTICE + "%s on %s: Forcing standard packet format, " + "incremental streaming mode and 72 samples/sec\n", + mouse->name, mouse->phys); + serio_write(mouse->serio, 'S'); /* Standard format */ + mdelay(50); + serio_write(mouse->serio, 'R'); /* Incremental */ + mdelay(50); + serio_write(mouse->serio, 'L'); /* 72 samples/sec */ +} + +static void vsxxxaa_parse_buffer(struct vsxxxaa *mouse) +{ + unsigned char *buf = mouse->buf; + int stray_bytes; + + /* + * Parse buffer to death... + */ + do { + /* + * Out of sync? Throw away what we don't understand. Each + * packet starts with a byte whose bit 7 is set. Unhandled + * packets (ie. which we don't know about or simply b0rk3d + * data...) will get shifted out of the buffer after some + * activity on the mouse. + */ + while (mouse->count > 0 && !IS_HDR_BYTE(buf[0])) { + printk(KERN_ERR "%s on %s: Dropping a byte to regain " + "sync with mouse data stream...\n", + mouse->name, mouse->phys); + vsxxxaa_drop_bytes(mouse, 1); + } + + /* + * Check for packets we know about. + */ + + if (vsxxxaa_smells_like_packet(mouse, VSXXXAA_PACKET_REL, 3)) { + /* Check for broken packet */ + stray_bytes = vsxxxaa_check_packet(mouse, 3); + if (!stray_bytes) + vsxxxaa_handle_REL_packet(mouse); + + } else if (vsxxxaa_smells_like_packet(mouse, + VSXXXAA_PACKET_ABS, 5)) { + /* Check for broken packet */ + stray_bytes = vsxxxaa_check_packet(mouse, 5); + if (!stray_bytes) + vsxxxaa_handle_ABS_packet(mouse); + + } else if (vsxxxaa_smells_like_packet(mouse, + VSXXXAA_PACKET_POR, 4)) { + /* Check for broken packet */ + stray_bytes = vsxxxaa_check_packet(mouse, 4); + if (!stray_bytes) + vsxxxaa_handle_POR_packet(mouse); + + } else { + break; /* No REL, ABS or POR packet found */ + } + + if (stray_bytes > 0) { + printk(KERN_ERR "Dropping %d bytes now...\n", + stray_bytes); + vsxxxaa_drop_bytes(mouse, stray_bytes); + } + + } while (1); +} + +static irqreturn_t vsxxxaa_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct vsxxxaa *mouse = serio_get_drvdata(serio); + + vsxxxaa_queue_byte(mouse, data); + vsxxxaa_parse_buffer(mouse); + + return IRQ_HANDLED; +} + +static void vsxxxaa_disconnect(struct serio *serio) +{ + struct vsxxxaa *mouse = serio_get_drvdata(serio); + + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_unregister_device(mouse->dev); + kfree(mouse); +} + +static int vsxxxaa_connect(struct serio *serio, struct serio_driver *drv) +{ + struct vsxxxaa *mouse; + struct input_dev *input_dev; + int err = -ENOMEM; + + mouse = kzalloc(sizeof(struct vsxxxaa), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!mouse || !input_dev) + goto fail1; + + mouse->dev = input_dev; + mouse->serio = serio; + strlcat(mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer", + sizeof(mouse->name)); + snprintf(mouse->phys, sizeof(mouse->phys), "%s/input0", serio->phys); + + input_dev->name = mouse->name; + input_dev->phys = mouse->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->dev.parent = &serio->dev; + + __set_bit(EV_KEY, input_dev->evbit); /* We have buttons */ + __set_bit(EV_REL, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_LEFT, input_dev->keybit); /* We have 3 buttons */ + __set_bit(BTN_MIDDLE, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + __set_bit(BTN_TOUCH, input_dev->keybit); /* ...and Tablet */ + __set_bit(REL_X, input_dev->relbit); + __set_bit(REL_Y, input_dev->relbit); + input_set_abs_params(input_dev, ABS_X, 0, 1023, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 1023, 0, 0); + + serio_set_drvdata(serio, mouse); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + /* + * Request selftest. Standard packet format and differential + * mode will be requested after the device ID'ed successfully. + */ + serio_write(serio, 'T'); /* Test */ + + err = input_register_device(input_dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(mouse); + return err; +} + +static struct serio_device_id vsxxaa_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_VSXXXAA, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, vsxxaa_serio_ids); + +static struct serio_driver vsxxxaa_drv = { + .driver = { + .name = "vsxxxaa", + }, + .description = DRIVER_DESC, + .id_table = vsxxaa_serio_ids, + .connect = vsxxxaa_connect, + .interrupt = vsxxxaa_interrupt, + .disconnect = vsxxxaa_disconnect, +}; + +module_serio_driver(vsxxxaa_drv); diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c new file mode 100644 index 00000000..b604564d --- /dev/null +++ b/drivers/input/mousedev.c @@ -0,0 +1,1128 @@ +/* + * Input driver to ExplorerPS/2 device driver module. + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * Copyright (c) 2004 Dmitry Torokhov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#define MOUSEDEV_MINOR_BASE 32 +#define MOUSEDEV_MINORS 31 +#define MOUSEDEV_MIX 63 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Mouse (ExplorerPS/2) device interfaces"); +MODULE_LICENSE("GPL"); + +#ifndef CONFIG_INPUT_MOUSEDEV_SCREEN_X +#define CONFIG_INPUT_MOUSEDEV_SCREEN_X 1024 +#endif +#ifndef CONFIG_INPUT_MOUSEDEV_SCREEN_Y +#define CONFIG_INPUT_MOUSEDEV_SCREEN_Y 768 +#endif + +static int xres = CONFIG_INPUT_MOUSEDEV_SCREEN_X; +module_param(xres, uint, 0644); +MODULE_PARM_DESC(xres, "Horizontal screen resolution"); + +static int yres = CONFIG_INPUT_MOUSEDEV_SCREEN_Y; +module_param(yres, uint, 0644); +MODULE_PARM_DESC(yres, "Vertical screen resolution"); + +static unsigned tap_time = 200; +module_param(tap_time, uint, 0644); +MODULE_PARM_DESC(tap_time, "Tap time for touchpads in absolute mode (msecs)"); + +struct mousedev_hw_data { + int dx, dy, dz; + int x, y; + int abs_event; + unsigned long buttons; +}; + +struct mousedev { + int open; + struct input_handle handle; + wait_queue_head_t wait; + struct list_head client_list; + spinlock_t client_lock; /* protects client_list */ + struct mutex mutex; + struct device dev; + struct cdev cdev; + bool exist; + + struct list_head mixdev_node; + bool opened_by_mixdev; + + struct mousedev_hw_data packet; + unsigned int pkt_count; + int old_x[4], old_y[4]; + int frac_dx, frac_dy; + unsigned long touch; + + int (*open_device)(struct mousedev *mousedev); + void (*close_device)(struct mousedev *mousedev); +}; + +enum mousedev_emul { + MOUSEDEV_EMUL_PS2, + MOUSEDEV_EMUL_IMPS, + MOUSEDEV_EMUL_EXPS +}; + +struct mousedev_motion { + int dx, dy, dz; + unsigned long buttons; +}; + +#define PACKET_QUEUE_LEN 16 +struct mousedev_client { + struct fasync_struct *fasync; + struct mousedev *mousedev; + struct list_head node; + + struct mousedev_motion packets[PACKET_QUEUE_LEN]; + unsigned int head, tail; + spinlock_t packet_lock; + int pos_x, pos_y; + + signed char ps2[6]; + unsigned char ready, buffer, bufsiz; + unsigned char imexseq, impsseq; + enum mousedev_emul mode; + unsigned long last_buttons; +}; + +#define MOUSEDEV_SEQ_LEN 6 + +static unsigned char mousedev_imps_seq[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 }; +static unsigned char mousedev_imex_seq[] = { 0xf3, 200, 0xf3, 200, 0xf3, 80 }; + +static struct mousedev *mousedev_mix; +static LIST_HEAD(mousedev_mix_list); + +#define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03]) +#define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03]) + +static void mousedev_touchpad_event(struct input_dev *dev, + struct mousedev *mousedev, + unsigned int code, int value) +{ + int size, tmp; + enum { FRACTION_DENOM = 128 }; + + switch (code) { + + case ABS_X: + + fx(0) = value; + if (mousedev->touch && mousedev->pkt_count >= 2) { + size = input_abs_get_max(dev, ABS_X) - + input_abs_get_min(dev, ABS_X); + if (size == 0) + size = 256 * 2; + + tmp = ((value - fx(2)) * 256 * FRACTION_DENOM) / size; + tmp += mousedev->frac_dx; + mousedev->packet.dx = tmp / FRACTION_DENOM; + mousedev->frac_dx = + tmp - mousedev->packet.dx * FRACTION_DENOM; + } + break; + + case ABS_Y: + fy(0) = value; + if (mousedev->touch && mousedev->pkt_count >= 2) { + /* use X size for ABS_Y to keep the same scale */ + size = input_abs_get_max(dev, ABS_X) - + input_abs_get_min(dev, ABS_X); + if (size == 0) + size = 256 * 2; + + tmp = -((value - fy(2)) * 256 * FRACTION_DENOM) / size; + tmp += mousedev->frac_dy; + mousedev->packet.dy = tmp / FRACTION_DENOM; + mousedev->frac_dy = tmp - + mousedev->packet.dy * FRACTION_DENOM; + } + break; + } +} + +static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, + unsigned int code, int value) +{ + int min, max, size; + + switch (code) { + + case ABS_X: + min = input_abs_get_min(dev, ABS_X); + max = input_abs_get_max(dev, ABS_X); + + size = max - min; + if (size == 0) + size = xres ? : 1; + + value = clamp(value, min, max); + + mousedev->packet.x = ((value - min) * xres) / size; + mousedev->packet.abs_event = 1; + break; + + case ABS_Y: + min = input_abs_get_min(dev, ABS_Y); + max = input_abs_get_max(dev, ABS_Y); + + size = max - min; + if (size == 0) + size = yres ? : 1; + + value = clamp(value, min, max); + + mousedev->packet.y = yres - ((value - min) * yres) / size; + mousedev->packet.abs_event = 1; + break; + } +} + +static void mousedev_rel_event(struct mousedev *mousedev, + unsigned int code, int value) +{ + switch (code) { + case REL_X: + mousedev->packet.dx += value; + break; + + case REL_Y: + mousedev->packet.dy -= value; + break; + + case REL_WHEEL: + mousedev->packet.dz -= value; + break; + } +} + +static void mousedev_key_event(struct mousedev *mousedev, + unsigned int code, int value) +{ + int index; + + switch (code) { + + case BTN_TOUCH: + case BTN_0: + case BTN_LEFT: index = 0; break; + + case BTN_STYLUS: + case BTN_1: + case BTN_RIGHT: index = 1; break; + + case BTN_2: + case BTN_FORWARD: + case BTN_STYLUS2: + case BTN_MIDDLE: index = 2; break; + + case BTN_3: + case BTN_BACK: + case BTN_SIDE: index = 3; break; + + case BTN_4: + case BTN_EXTRA: index = 4; break; + + default: return; + } + + if (value) { + set_bit(index, &mousedev->packet.buttons); + set_bit(index, &mousedev_mix->packet.buttons); + } else { + clear_bit(index, &mousedev->packet.buttons); + clear_bit(index, &mousedev_mix->packet.buttons); + } +} + +static void mousedev_notify_readers(struct mousedev *mousedev, + struct mousedev_hw_data *packet) +{ + struct mousedev_client *client; + struct mousedev_motion *p; + unsigned int new_head; + int wake_readers = 0; + + rcu_read_lock(); + list_for_each_entry_rcu(client, &mousedev->client_list, node) { + + /* Just acquire the lock, interrupts already disabled */ + spin_lock(&client->packet_lock); + + p = &client->packets[client->head]; + if (client->ready && p->buttons != mousedev->packet.buttons) { + new_head = (client->head + 1) % PACKET_QUEUE_LEN; + if (new_head != client->tail) { + p = &client->packets[client->head = new_head]; + memset(p, 0, sizeof(struct mousedev_motion)); + } + } + + if (packet->abs_event) { + p->dx += packet->x - client->pos_x; + p->dy += packet->y - client->pos_y; + client->pos_x = packet->x; + client->pos_y = packet->y; + } + + client->pos_x += packet->dx; + client->pos_x = client->pos_x < 0 ? + 0 : (client->pos_x >= xres ? xres : client->pos_x); + client->pos_y += packet->dy; + client->pos_y = client->pos_y < 0 ? + 0 : (client->pos_y >= yres ? yres : client->pos_y); + + p->dx += packet->dx; + p->dy += packet->dy; + p->dz += packet->dz; + p->buttons = mousedev->packet.buttons; + + if (p->dx || p->dy || p->dz || + p->buttons != client->last_buttons) + client->ready = 1; + + spin_unlock(&client->packet_lock); + + if (client->ready) { + kill_fasync(&client->fasync, SIGIO, POLL_IN); + wake_readers = 1; + } + } + rcu_read_unlock(); + + if (wake_readers) + wake_up_interruptible(&mousedev->wait); +} + +static void mousedev_touchpad_touch(struct mousedev *mousedev, int value) +{ + if (!value) { + if (mousedev->touch && + time_before(jiffies, + mousedev->touch + msecs_to_jiffies(tap_time))) { + /* + * Toggle left button to emulate tap. + * We rely on the fact that mousedev_mix always has 0 + * motion packet so we won't mess current position. + */ + set_bit(0, &mousedev->packet.buttons); + set_bit(0, &mousedev_mix->packet.buttons); + mousedev_notify_readers(mousedev, &mousedev_mix->packet); + mousedev_notify_readers(mousedev_mix, + &mousedev_mix->packet); + clear_bit(0, &mousedev->packet.buttons); + clear_bit(0, &mousedev_mix->packet.buttons); + } + mousedev->touch = mousedev->pkt_count = 0; + mousedev->frac_dx = 0; + mousedev->frac_dy = 0; + + } else if (!mousedev->touch) + mousedev->touch = jiffies; +} + +static void mousedev_event(struct input_handle *handle, + unsigned int type, unsigned int code, int value) +{ + struct mousedev *mousedev = handle->private; + + switch (type) { + + case EV_ABS: + /* Ignore joysticks */ + if (test_bit(BTN_TRIGGER, handle->dev->keybit)) + return; + + if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) + mousedev_touchpad_event(handle->dev, + mousedev, code, value); + else + mousedev_abs_event(handle->dev, mousedev, code, value); + + break; + + case EV_REL: + mousedev_rel_event(mousedev, code, value); + break; + + case EV_KEY: + if (value != 2) { + if (code == BTN_TOUCH && + test_bit(BTN_TOOL_FINGER, handle->dev->keybit)) + mousedev_touchpad_touch(mousedev, value); + else + mousedev_key_event(mousedev, code, value); + } + break; + + case EV_SYN: + if (code == SYN_REPORT) { + if (mousedev->touch) { + mousedev->pkt_count++; + /* + * Input system eats duplicate events, + * but we need all of them to do correct + * averaging so apply present one forward + */ + fx(0) = fx(1); + fy(0) = fy(1); + } + + mousedev_notify_readers(mousedev, &mousedev->packet); + mousedev_notify_readers(mousedev_mix, &mousedev->packet); + + mousedev->packet.dx = mousedev->packet.dy = + mousedev->packet.dz = 0; + mousedev->packet.abs_event = 0; + } + break; + } +} + +static int mousedev_fasync(int fd, struct file *file, int on) +{ + struct mousedev_client *client = file->private_data; + + return fasync_helper(fd, file, on, &client->fasync); +} + +static void mousedev_free(struct device *dev) +{ + struct mousedev *mousedev = container_of(dev, struct mousedev, dev); + + input_put_device(mousedev->handle.dev); + kfree(mousedev); +} + +static int mousedev_open_device(struct mousedev *mousedev) +{ + int retval; + + retval = mutex_lock_interruptible(&mousedev->mutex); + if (retval) + return retval; + + if (!mousedev->exist) + retval = -ENODEV; + else if (!mousedev->open++) { + retval = input_open_device(&mousedev->handle); + if (retval) + mousedev->open--; + } + + mutex_unlock(&mousedev->mutex); + return retval; +} + +static void mousedev_close_device(struct mousedev *mousedev) +{ + mutex_lock(&mousedev->mutex); + + if (mousedev->exist && !--mousedev->open) + input_close_device(&mousedev->handle); + + mutex_unlock(&mousedev->mutex); +} + +/* + * Open all available devices so they can all be multiplexed in one. + * stream. Note that this function is called with mousedev_mix->mutex + * held. + */ +static int mixdev_open_devices(struct mousedev *mixdev) +{ + int error; + + error = mutex_lock_interruptible(&mixdev->mutex); + if (error) + return error; + + if (!mixdev->open++) { + struct mousedev *mousedev; + + list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { + if (!mousedev->opened_by_mixdev) { + if (mousedev_open_device(mousedev)) + continue; + + mousedev->opened_by_mixdev = true; + } + } + } + + mutex_unlock(&mixdev->mutex); + return 0; +} + +/* + * Close all devices that were opened as part of multiplexed + * device. Note that this function is called with mousedev_mix->mutex + * held. + */ +static void mixdev_close_devices(struct mousedev *mixdev) +{ + mutex_lock(&mixdev->mutex); + + if (!--mixdev->open) { + struct mousedev *mousedev; + + list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) { + if (mousedev->opened_by_mixdev) { + mousedev->opened_by_mixdev = false; + mousedev_close_device(mousedev); + } + } + } + + mutex_unlock(&mixdev->mutex); +} + + +static void mousedev_attach_client(struct mousedev *mousedev, + struct mousedev_client *client) +{ + spin_lock(&mousedev->client_lock); + list_add_tail_rcu(&client->node, &mousedev->client_list); + spin_unlock(&mousedev->client_lock); +} + +static void mousedev_detach_client(struct mousedev *mousedev, + struct mousedev_client *client) +{ + spin_lock(&mousedev->client_lock); + list_del_rcu(&client->node); + spin_unlock(&mousedev->client_lock); + synchronize_rcu(); +} + +static int mousedev_release(struct inode *inode, struct file *file) +{ + struct mousedev_client *client = file->private_data; + struct mousedev *mousedev = client->mousedev; + + mousedev_detach_client(mousedev, client); + kfree(client); + + mousedev->close_device(mousedev); + + return 0; +} + +static int mousedev_open(struct inode *inode, struct file *file) +{ + struct mousedev_client *client; + struct mousedev *mousedev; + int error; + +#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX + if (imajor(inode) == MISC_MAJOR) + mousedev = mousedev_mix; + else +#endif + mousedev = container_of(inode->i_cdev, struct mousedev, cdev); + + client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL); + if (!client) + return -ENOMEM; + + spin_lock_init(&client->packet_lock); + client->pos_x = xres / 2; + client->pos_y = yres / 2; + client->mousedev = mousedev; + mousedev_attach_client(mousedev, client); + + error = mousedev->open_device(mousedev); + if (error) + goto err_free_client; + + file->private_data = client; + nonseekable_open(inode, file); + + return 0; + + err_free_client: + mousedev_detach_client(mousedev, client); + kfree(client); + return error; +} + +static inline int mousedev_limit_delta(int delta, int limit) +{ + return delta > limit ? limit : (delta < -limit ? -limit : delta); +} + +static void mousedev_packet(struct mousedev_client *client, + signed char *ps2_data) +{ + struct mousedev_motion *p = &client->packets[client->tail]; + + ps2_data[0] = 0x08 | + ((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07); + ps2_data[1] = mousedev_limit_delta(p->dx, 127); + ps2_data[2] = mousedev_limit_delta(p->dy, 127); + p->dx -= ps2_data[1]; + p->dy -= ps2_data[2]; + + switch (client->mode) { + case MOUSEDEV_EMUL_EXPS: + ps2_data[3] = mousedev_limit_delta(p->dz, 7); + p->dz -= ps2_data[3]; + ps2_data[3] = (ps2_data[3] & 0x0f) | ((p->buttons & 0x18) << 1); + client->bufsiz = 4; + break; + + case MOUSEDEV_EMUL_IMPS: + ps2_data[0] |= + ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1); + ps2_data[3] = mousedev_limit_delta(p->dz, 127); + p->dz -= ps2_data[3]; + client->bufsiz = 4; + break; + + case MOUSEDEV_EMUL_PS2: + default: + ps2_data[0] |= + ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1); + p->dz = 0; + client->bufsiz = 3; + break; + } + + if (!p->dx && !p->dy && !p->dz) { + if (client->tail == client->head) { + client->ready = 0; + client->last_buttons = p->buttons; + } else + client->tail = (client->tail + 1) % PACKET_QUEUE_LEN; + } +} + +static void mousedev_generate_response(struct mousedev_client *client, + int command) +{ + client->ps2[0] = 0xfa; /* ACK */ + + switch (command) { + + case 0xeb: /* Poll */ + mousedev_packet(client, &client->ps2[1]); + client->bufsiz++; /* account for leading ACK */ + break; + + case 0xf2: /* Get ID */ + switch (client->mode) { + case MOUSEDEV_EMUL_PS2: + client->ps2[1] = 0; + break; + case MOUSEDEV_EMUL_IMPS: + client->ps2[1] = 3; + break; + case MOUSEDEV_EMUL_EXPS: + client->ps2[1] = 4; + break; + } + client->bufsiz = 2; + break; + + case 0xe9: /* Get info */ + client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200; + client->bufsiz = 4; + break; + + case 0xff: /* Reset */ + client->impsseq = client->imexseq = 0; + client->mode = MOUSEDEV_EMUL_PS2; + client->ps2[1] = 0xaa; client->ps2[2] = 0x00; + client->bufsiz = 3; + break; + + default: + client->bufsiz = 1; + break; + } + client->buffer = client->bufsiz; +} + +static ssize_t mousedev_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + struct mousedev_client *client = file->private_data; + unsigned char c; + unsigned int i; + + for (i = 0; i < count; i++) { + + if (get_user(c, buffer + i)) + return -EFAULT; + + spin_lock_irq(&client->packet_lock); + + if (c == mousedev_imex_seq[client->imexseq]) { + if (++client->imexseq == MOUSEDEV_SEQ_LEN) { + client->imexseq = 0; + client->mode = MOUSEDEV_EMUL_EXPS; + } + } else + client->imexseq = 0; + + if (c == mousedev_imps_seq[client->impsseq]) { + if (++client->impsseq == MOUSEDEV_SEQ_LEN) { + client->impsseq = 0; + client->mode = MOUSEDEV_EMUL_IMPS; + } + } else + client->impsseq = 0; + + mousedev_generate_response(client, c); + + spin_unlock_irq(&client->packet_lock); + } + + kill_fasync(&client->fasync, SIGIO, POLL_IN); + wake_up_interruptible(&client->mousedev->wait); + + return count; +} + +static ssize_t mousedev_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct mousedev_client *client = file->private_data; + struct mousedev *mousedev = client->mousedev; + signed char data[sizeof(client->ps2)]; + int retval = 0; + + if (!client->ready && !client->buffer && mousedev->exist && + (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + retval = wait_event_interruptible(mousedev->wait, + !mousedev->exist || client->ready || client->buffer); + if (retval) + return retval; + + if (!mousedev->exist) + return -ENODEV; + + spin_lock_irq(&client->packet_lock); + + if (!client->buffer && client->ready) { + mousedev_packet(client, client->ps2); + client->buffer = client->bufsiz; + } + + if (count > client->buffer) + count = client->buffer; + + memcpy(data, client->ps2 + client->bufsiz - client->buffer, count); + client->buffer -= count; + + spin_unlock_irq(&client->packet_lock); + + if (copy_to_user(buffer, data, count)) + return -EFAULT; + + return count; +} + +/* No kernel lock - fine */ +static unsigned int mousedev_poll(struct file *file, poll_table *wait) +{ + struct mousedev_client *client = file->private_data; + struct mousedev *mousedev = client->mousedev; + unsigned int mask; + + poll_wait(file, &mousedev->wait, wait); + + mask = mousedev->exist ? POLLOUT | POLLWRNORM : POLLHUP | POLLERR; + if (client->ready || client->buffer) + mask |= POLLIN | POLLRDNORM; + + return mask; +} + +static const struct file_operations mousedev_fops = { + .owner = THIS_MODULE, + .read = mousedev_read, + .write = mousedev_write, + .poll = mousedev_poll, + .open = mousedev_open, + .release = mousedev_release, + .fasync = mousedev_fasync, + .llseek = noop_llseek, +}; + +/* + * Mark device non-existent. This disables writes, ioctls and + * prevents new users from opening the device. Already posted + * blocking reads will stay, however new ones will fail. + */ +static void mousedev_mark_dead(struct mousedev *mousedev) +{ + mutex_lock(&mousedev->mutex); + mousedev->exist = false; + mutex_unlock(&mousedev->mutex); +} + +/* + * Wake up users waiting for IO so they can disconnect from + * dead device. + */ +static void mousedev_hangup(struct mousedev *mousedev) +{ + struct mousedev_client *client; + + spin_lock(&mousedev->client_lock); + list_for_each_entry(client, &mousedev->client_list, node) + kill_fasync(&client->fasync, SIGIO, POLL_HUP); + spin_unlock(&mousedev->client_lock); + + wake_up_interruptible(&mousedev->wait); +} + +static void mousedev_cleanup(struct mousedev *mousedev) +{ + struct input_handle *handle = &mousedev->handle; + + mousedev_mark_dead(mousedev); + mousedev_hangup(mousedev); + + cdev_del(&mousedev->cdev); + + /* mousedev is marked dead so no one else accesses mousedev->open */ + if (mousedev->open) + input_close_device(handle); +} + +static int mousedev_reserve_minor(bool mixdev) +{ + int minor; + + if (mixdev) { + minor = input_get_new_minor(MOUSEDEV_MIX, 1, false); + if (minor < 0) + pr_err("failed to reserve mixdev minor: %d\n", minor); + } else { + minor = input_get_new_minor(MOUSEDEV_MINOR_BASE, + MOUSEDEV_MINORS, true); + if (minor < 0) + pr_err("failed to reserve new minor: %d\n", minor); + } + + return minor; +} + +static struct mousedev *mousedev_create(struct input_dev *dev, + struct input_handler *handler, + bool mixdev) +{ + struct mousedev *mousedev; + int minor; + int error; + + minor = mousedev_reserve_minor(mixdev); + if (minor < 0) { + error = minor; + goto err_out; + } + + mousedev = kzalloc(sizeof(struct mousedev), GFP_KERNEL); + if (!mousedev) { + error = -ENOMEM; + goto err_free_minor; + } + + INIT_LIST_HEAD(&mousedev->client_list); + INIT_LIST_HEAD(&mousedev->mixdev_node); + spin_lock_init(&mousedev->client_lock); + mutex_init(&mousedev->mutex); + lockdep_set_subclass(&mousedev->mutex, + mixdev ? SINGLE_DEPTH_NESTING : 0); + init_waitqueue_head(&mousedev->wait); + + if (mixdev) { + dev_set_name(&mousedev->dev, "mice"); + + mousedev->open_device = mixdev_open_devices; + mousedev->close_device = mixdev_close_devices; + } else { + int dev_no = minor; + /* Normalize device number if it falls into legacy range */ + if (dev_no < MOUSEDEV_MINOR_BASE + MOUSEDEV_MINORS) + dev_no -= MOUSEDEV_MINOR_BASE; + dev_set_name(&mousedev->dev, "mouse%d", dev_no); + + mousedev->open_device = mousedev_open_device; + mousedev->close_device = mousedev_close_device; + } + + mousedev->exist = true; + mousedev->handle.dev = input_get_device(dev); + mousedev->handle.name = dev_name(&mousedev->dev); + mousedev->handle.handler = handler; + mousedev->handle.private = mousedev; + + mousedev->dev.class = &input_class; + if (dev) + mousedev->dev.parent = &dev->dev; + mousedev->dev.devt = MKDEV(INPUT_MAJOR, minor); + mousedev->dev.release = mousedev_free; + device_initialize(&mousedev->dev); + + if (!mixdev) { + error = input_register_handle(&mousedev->handle); + if (error) + goto err_free_mousedev; + } + + cdev_init(&mousedev->cdev, &mousedev_fops); + mousedev->cdev.kobj.parent = &mousedev->dev.kobj; + error = cdev_add(&mousedev->cdev, mousedev->dev.devt, 1); + if (error) + goto err_unregister_handle; + + error = device_add(&mousedev->dev); + if (error) + goto err_cleanup_mousedev; + + return mousedev; + + err_cleanup_mousedev: + mousedev_cleanup(mousedev); + err_unregister_handle: + if (!mixdev) + input_unregister_handle(&mousedev->handle); + err_free_mousedev: + put_device(&mousedev->dev); + err_free_minor: + input_free_minor(minor); + err_out: + return ERR_PTR(error); +} + +static void mousedev_destroy(struct mousedev *mousedev) +{ + device_del(&mousedev->dev); + mousedev_cleanup(mousedev); + input_free_minor(MINOR(mousedev->dev.devt)); + if (mousedev != mousedev_mix) + input_unregister_handle(&mousedev->handle); + put_device(&mousedev->dev); +} + +static int mixdev_add_device(struct mousedev *mousedev) +{ + int retval; + + retval = mutex_lock_interruptible(&mousedev_mix->mutex); + if (retval) + return retval; + + if (mousedev_mix->open) { + retval = mousedev_open_device(mousedev); + if (retval) + goto out; + + mousedev->opened_by_mixdev = true; + } + + get_device(&mousedev->dev); + list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list); + + out: + mutex_unlock(&mousedev_mix->mutex); + return retval; +} + +static void mixdev_remove_device(struct mousedev *mousedev) +{ + mutex_lock(&mousedev_mix->mutex); + + if (mousedev->opened_by_mixdev) { + mousedev->opened_by_mixdev = false; + mousedev_close_device(mousedev); + } + + list_del_init(&mousedev->mixdev_node); + mutex_unlock(&mousedev_mix->mutex); + + put_device(&mousedev->dev); +} + +static int mousedev_connect(struct input_handler *handler, + struct input_dev *dev, + const struct input_device_id *id) +{ + struct mousedev *mousedev; + int error; + + mousedev = mousedev_create(dev, handler, false); + if (IS_ERR(mousedev)) + return PTR_ERR(mousedev); + + error = mixdev_add_device(mousedev); + if (error) { + mousedev_destroy(mousedev); + return error; + } + + return 0; +} + +static void mousedev_disconnect(struct input_handle *handle) +{ + struct mousedev *mousedev = handle->private; + + mixdev_remove_device(mousedev); + mousedev_destroy(mousedev); +} + +static const struct input_device_id mousedev_ids[] = { + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT | + INPUT_DEVICE_ID_MATCH_RELBIT, + .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) }, + .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) }, + .relbit = { BIT_MASK(REL_X) | BIT_MASK(REL_Y) }, + }, /* A mouse like device, at least one button, + two relative axes */ + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_RELBIT, + .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) }, + .relbit = { BIT_MASK(REL_WHEEL) }, + }, /* A separate scrollwheel */ + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT | + INPUT_DEVICE_ID_MATCH_ABSBIT, + .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) }, + .keybit = { [BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH) }, + .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) }, + }, /* A tablet like device, at least touch detection, + two absolute axes */ + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT | + INPUT_DEVICE_ID_MATCH_ABSBIT, + .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) }, + .keybit = { [BIT_WORD(BTN_TOOL_FINGER)] = + BIT_MASK(BTN_TOOL_FINGER) }, + .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | + BIT_MASK(ABS_PRESSURE) | + BIT_MASK(ABS_TOOL_WIDTH) }, + }, /* A touchpad */ + { + .flags = INPUT_DEVICE_ID_MATCH_EVBIT | + INPUT_DEVICE_ID_MATCH_KEYBIT | + INPUT_DEVICE_ID_MATCH_ABSBIT, + .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) }, + .keybit = { [BIT_WORD(BTN_LEFT)] = BIT_MASK(BTN_LEFT) }, + .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) }, + }, /* Mouse-like device with absolute X and Y but ordinary + clicks, like hp ILO2 High Performance mouse */ + + { }, /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE(input, mousedev_ids); + +static struct input_handler mousedev_handler = { + .event = mousedev_event, + .connect = mousedev_connect, + .disconnect = mousedev_disconnect, + .legacy_minors = true, + .minor = MOUSEDEV_MINOR_BASE, + .name = "mousedev", + .id_table = mousedev_ids, +}; + +#ifdef CONFIG_INPUT_MOUSEDEV_PSAUX +#include + +static struct miscdevice psaux_mouse = { + .minor = PSMOUSE_MINOR, + .name = "psaux", + .fops = &mousedev_fops, +}; + +static bool psaux_registered; + +static void __init mousedev_psaux_register(void) +{ + int error; + + error = misc_register(&psaux_mouse); + if (error) + pr_warn("could not register psaux device, error: %d\n", + error); + else + psaux_registered = true; +} + +static void __exit mousedev_psaux_unregister(void) +{ + if (psaux_registered) + misc_deregister(&psaux_mouse); +} +#else +static inline void mousedev_psaux_register(void) { } +static inline void mousedev_psaux_unregister(void) { } +#endif + +static int __init mousedev_init(void) +{ + int error; + + mousedev_mix = mousedev_create(NULL, &mousedev_handler, true); + if (IS_ERR(mousedev_mix)) + return PTR_ERR(mousedev_mix); + + error = input_register_handler(&mousedev_handler); + if (error) { + mousedev_destroy(mousedev_mix); + return error; + } + + mousedev_psaux_register(); + + pr_info("PS/2 mouse device common for all mice\n"); + + return 0; +} + +static void __exit mousedev_exit(void) +{ + mousedev_psaux_unregister(); + input_unregister_handler(&mousedev_handler); + mousedev_destroy(mousedev_mix); +} + +module_init(mousedev_init); +module_exit(mousedev_exit); diff --git a/drivers/input/serio/Kconfig b/drivers/input/serio/Kconfig new file mode 100644 index 00000000..306d456a --- /dev/null +++ b/drivers/input/serio/Kconfig @@ -0,0 +1,259 @@ +# +# Input core configuration +# +config SERIO + tristate "Serial I/O support" + default n + help + Say Yes here if you have any input device that uses serial I/O to + communicate with the system. This includes the + * standard AT keyboard and PS/2 mouse * + as well as serial mice, Sun keyboards, some joysticks and 6dof + devices and more. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called serio. + +if SERIO + +config SERIO_I8042 + tristate "i8042 PC Keyboard controller" + default n + depends on !PARISC && (!ARM || ARCH_SHARK || FOOTBRIDGE_HOST) && \ + (!SUPERH || SH_CAYMAN) && !M68K && !BLACKFIN && !S390 + help + i8042 is the chip over which the standard AT keyboard and PS/2 + mouse are connected to the computer. If you use these devices, + you'll need to say Y here. + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called i8042. + +config SERIO_SERPORT + tristate "Serial port line discipline" + default y + depends on TTY + help + Say Y here if you plan to use an input device (mouse, joystick, + tablet, 6dof) that communicates over the RS232 serial (COM) port. + + More information is available: + + If unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called serport. + +config SERIO_CT82C710 + tristate "ct82c710 Aux port controller" + depends on X86 + help + Say Y here if you have a Texas Instruments TravelMate notebook + equipped with the ct82c710 chip and want to use a mouse connected + to the "QuickPort". + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ct82c710. + +config SERIO_Q40KBD + tristate "Q40 keyboard controller" + depends on Q40 + +config SERIO_PARKBD + tristate "Parallel port keyboard adapter" + depends on PARPORT + help + Say Y here if you built a simple parallel port adapter to attach + an additional AT keyboard, XT keyboard or PS/2 mouse. + + More information is available: + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called parkbd. + +config SERIO_RPCKBD + tristate "Acorn RiscPC keyboard controller" + depends on ARCH_ACORN + default y + help + Say Y here if you have the Acorn RiscPC and want to use an AT + keyboard connected to its keyboard controller. + + To compile this driver as a module, choose M here: the + module will be called rpckbd. + +config SERIO_AT32PSIF + tristate "AVR32 PSIF PS/2 keyboard and mouse controller" + depends on AVR32 + help + Say Y here if you want to use the PSIF peripheral on AVR32 devices + and connect a PS/2 keyboard and/or mouse to it. + + To compile this driver as a module, choose M here: the module will + be called at32psif. + +config SERIO_AMBAKMI + tristate "AMBA KMI keyboard controller" + depends on ARM_AMBA + +config SERIO_SA1111 + tristate "Intel SA1111 keyboard controller" + depends on SA1111 + +config SERIO_GSCPS2 + tristate "HP GSC PS/2 keyboard and PS/2 mouse controller" + depends on GSC + default y + help + This driver provides support for the PS/2 ports on PA-RISC machines + over which HP PS/2 keyboards and PS/2 mice may be connected. + If you use these devices, you'll need to say Y here. + + It's safe to enable this driver, so if unsure, say Y. + + To compile this driver as a module, choose M here: the + module will be called gscps2. + +config HP_SDC + tristate "HP System Device Controller i8042 Support" + depends on (GSC || HP300) && SERIO + default y + help + This option enables support for the "System Device + Controller", an i8042 carrying microcode to manage a + few miscellaneous devices on some Hewlett Packard systems. + The SDC itself contains a 10ms resolution timer/clock capable + of delivering interrupts on a periodic and one-shot basis. + The SDC may also be connected to a battery-backed real-time + clock, a basic audio waveform generator, and an HP-HIL Master + Link Controller serving up to seven input devices. + + By itself this option is rather useless, but enabling it will + enable selection of drivers for the abovementioned devices. + It is, however, incompatible with the old, reliable HIL keyboard + driver, and the new HIL driver is experimental, so if you plan + to use a HIL keyboard as your primary keyboard, you may wish + to keep using that driver until the new HIL drivers have had + more testing. + +config HIL_MLC + tristate "HIL MLC Support (needed for HIL input devices)" + depends on HP_SDC + +config SERIO_PCIPS2 + tristate "PCI PS/2 keyboard and PS/2 mouse controller" + depends on PCI + help + Say Y here if you have a Mobility Docking station with PS/2 + keyboard and mice ports. + + To compile this driver as a module, choose M here: the + module will be called pcips2. + +config SERIO_MACEPS2 + tristate "SGI O2 MACE PS/2 controller" + depends on SGI_IP32 + help + Say Y here if you have SGI O2 workstation and want to use its + PS/2 ports. + + To compile this driver as a module, choose M here: the + module will be called maceps2. + +config SERIO_LIBPS2 + tristate "PS/2 driver library" + depends on SERIO_I8042 || SERIO_I8042=n + help + Say Y here if you are using a driver for device connected + to a PS/2 port, such as PS/2 mouse or standard AT keyboard. + + To compile this driver as a module, choose M here: the + module will be called libps2. + +config SERIO_RAW + tristate "Raw access to serio ports" + help + Say Y here if you want to have raw access to serio ports, such as + AUX ports on i8042 keyboard controller. Each serio port that is + bound to this driver will be accessible via a char device with + major 10 and dynamically allocated minor. The driver will try + allocating minor 1 (that historically corresponds to /dev/psaux) + first. To bind this driver to a serio port use sysfs interface: + + echo -n "serio_raw" > /sys/bus/serio/devices/serioX/drvctl + + To compile this driver as a module, choose M here: the + module will be called serio_raw. + +config SERIO_XILINX_XPS_PS2 + tristate "Xilinx XPS PS/2 Controller Support" + depends on PPC || MICROBLAZE + help + This driver supports XPS PS/2 IP from the Xilinx EDK on + PowerPC platform. + + To compile this driver as a module, choose M here: the + module will be called xilinx_ps2. + +config SERIO_ALTERA_PS2 + tristate "Altera UP PS/2 controller" + depends on HAS_IOMEM + help + Say Y here if you have Altera University Program PS/2 ports. + + To compile this driver as a module, choose M here: the + module will be called altera_ps2. + +config SERIO_AMS_DELTA + tristate "Amstrad Delta (E3) mailboard support" + depends on MACH_AMS_DELTA + default y + ---help--- + Say Y here if you have an E3 and want to use its mailboard, + or any standard AT keyboard connected to the mailboard port. + + When used for the E3 mailboard, a non-standard key table + must be loaded from userspace, possibly using udev extras + provided keymap helper utility. + + To compile this driver as a module, choose M here; + the module will be called ams_delta_serio. + +config SERIO_PS2MULT + tristate "TQC PS/2 multiplexer" + help + Say Y here if you have the PS/2 line multiplexer like the one + present on TQC boards. + + To compile this driver as a module, choose M here: the + module will be called ps2mult. + +config SERIO_ARC_PS2 + tristate "ARC PS/2 support" + depends on GENERIC_HARDIRQS + help + Say Y here if you have an ARC FPGA platform with a PS/2 + controller in it. + + To compile this driver as a module, choose M here; the module + will be called arc_ps2. + +config SERIO_APBPS2 + tristate "GRLIB APBPS2 PS/2 keyboard/mouse controller" + depends on OF + help + Say Y here if you want support for GRLIB APBPS2 peripherals used + to connect to PS/2 keyboard and/or mouse. + + To compile this driver as a module, choose M here: the module will + be called apbps2. + +endif diff --git a/drivers/input/serio/Makefile b/drivers/input/serio/Makefile new file mode 100644 index 00000000..8edb36c2 --- /dev/null +++ b/drivers/input/serio/Makefile @@ -0,0 +1,29 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_SERIO) += serio.o +obj-$(CONFIG_SERIO_I8042) += i8042.o +obj-$(CONFIG_SERIO_PARKBD) += parkbd.o +obj-$(CONFIG_SERIO_SERPORT) += serport.o +obj-$(CONFIG_SERIO_CT82C710) += ct82c710.o +obj-$(CONFIG_SERIO_RPCKBD) += rpckbd.o +obj-$(CONFIG_SERIO_SA1111) += sa1111ps2.o +obj-$(CONFIG_SERIO_AMBAKMI) += ambakmi.o +obj-$(CONFIG_SERIO_AT32PSIF) += at32psif.o +obj-$(CONFIG_SERIO_Q40KBD) += q40kbd.o +obj-$(CONFIG_SERIO_GSCPS2) += gscps2.o +obj-$(CONFIG_HP_SDC) += hp_sdc.o +obj-$(CONFIG_HIL_MLC) += hp_sdc_mlc.o hil_mlc.o +obj-$(CONFIG_SERIO_PCIPS2) += pcips2.o +obj-$(CONFIG_SERIO_PS2MULT) += ps2mult.o +obj-$(CONFIG_SERIO_MACEPS2) += maceps2.o +obj-$(CONFIG_SERIO_LIBPS2) += libps2.o +obj-$(CONFIG_SERIO_RAW) += serio_raw.o +obj-$(CONFIG_SERIO_AMS_DELTA) += ams_delta_serio.o +obj-$(CONFIG_SERIO_XILINX_XPS_PS2) += xilinx_ps2.o +obj-$(CONFIG_SERIO_ALTERA_PS2) += altera_ps2.o +obj-$(CONFIG_SERIO_ARC_PS2) += arc_ps2.o +obj-$(CONFIG_SERIO_APBPS2) += apbps2.o diff --git a/drivers/input/serio/altera_ps2.c b/drivers/input/serio/altera_ps2.c new file mode 100644 index 00000000..479ce5fe --- /dev/null +++ b/drivers/input/serio/altera_ps2.c @@ -0,0 +1,202 @@ +/* + * Altera University Program PS2 controller driver + * + * Copyright (C) 2008 Thomas Chou + * + * Based on sa1111ps2.c, which is: + * Copyright (C) 2002 Russell King + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRV_NAME "altera_ps2" + +struct ps2if { + struct serio *io; + struct resource *iomem_res; + void __iomem *base; + unsigned irq; +}; + +/* + * Read all bytes waiting in the PS2 port. There should be + * at the most one, but we loop for safety. + */ +static irqreturn_t altera_ps2_rxint(int irq, void *dev_id) +{ + struct ps2if *ps2if = dev_id; + unsigned int status; + int handled = IRQ_NONE; + + while ((status = readl(ps2if->base)) & 0xffff0000) { + serio_interrupt(ps2if->io, status & 0xff, 0); + handled = IRQ_HANDLED; + } + + return handled; +} + +/* + * Write a byte to the PS2 port. + */ +static int altera_ps2_write(struct serio *io, unsigned char val) +{ + struct ps2if *ps2if = io->port_data; + + writel(val, ps2if->base); + return 0; +} + +static int altera_ps2_open(struct serio *io) +{ + struct ps2if *ps2if = io->port_data; + + /* clear fifo */ + while (readl(ps2if->base) & 0xffff0000) + /* empty */; + + writel(1, ps2if->base + 4); /* enable rx irq */ + return 0; +} + +static void altera_ps2_close(struct serio *io) +{ + struct ps2if *ps2if = io->port_data; + + writel(0, ps2if->base); /* disable rx irq */ +} + +/* + * Add one device to this driver. + */ +static int altera_ps2_probe(struct platform_device *pdev) +{ + struct ps2if *ps2if; + struct serio *serio; + int error, irq; + + ps2if = kzalloc(sizeof(struct ps2if), GFP_KERNEL); + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!ps2if || !serio) { + error = -ENOMEM; + goto err_free_mem; + } + + serio->id.type = SERIO_8042; + serio->write = altera_ps2_write; + serio->open = altera_ps2_open; + serio->close = altera_ps2_close; + strlcpy(serio->name, dev_name(&pdev->dev), sizeof(serio->name)); + strlcpy(serio->phys, dev_name(&pdev->dev), sizeof(serio->phys)); + serio->port_data = ps2if; + serio->dev.parent = &pdev->dev; + ps2if->io = serio; + + ps2if->iomem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (ps2if->iomem_res == NULL) { + error = -ENOENT; + goto err_free_mem; + } + + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + error = -ENXIO; + goto err_free_mem; + } + ps2if->irq = irq; + + if (!request_mem_region(ps2if->iomem_res->start, + resource_size(ps2if->iomem_res), pdev->name)) { + error = -EBUSY; + goto err_free_mem; + } + + ps2if->base = ioremap(ps2if->iomem_res->start, + resource_size(ps2if->iomem_res)); + if (!ps2if->base) { + error = -ENOMEM; + goto err_free_res; + } + + error = request_irq(ps2if->irq, altera_ps2_rxint, 0, pdev->name, ps2if); + if (error) { + dev_err(&pdev->dev, "could not allocate IRQ %d: %d\n", + ps2if->irq, error); + goto err_unmap; + } + + dev_info(&pdev->dev, "base %p, irq %d\n", ps2if->base, ps2if->irq); + + serio_register_port(ps2if->io); + platform_set_drvdata(pdev, ps2if); + + return 0; + + err_unmap: + iounmap(ps2if->base); + err_free_res: + release_mem_region(ps2if->iomem_res->start, + resource_size(ps2if->iomem_res)); + err_free_mem: + kfree(ps2if); + kfree(serio); + return error; +} + +/* + * Remove one device from this driver. + */ +static int altera_ps2_remove(struct platform_device *pdev) +{ + struct ps2if *ps2if = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + serio_unregister_port(ps2if->io); + free_irq(ps2if->irq, ps2if); + iounmap(ps2if->base); + release_mem_region(ps2if->iomem_res->start, + resource_size(ps2if->iomem_res)); + kfree(ps2if); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id altera_ps2_match[] = { + { .compatible = "ALTR,ps2-1.0", }, + {}, +}; +MODULE_DEVICE_TABLE(of, altera_ps2_match); +#endif /* CONFIG_OF */ + +/* + * Our device driver structure + */ +static struct platform_driver altera_ps2_driver = { + .probe = altera_ps2_probe, + .remove = altera_ps2_remove, + .driver = { + .name = DRV_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(altera_ps2_match), + }, +}; +module_platform_driver(altera_ps2_driver); + +MODULE_DESCRIPTION("Altera University Program PS2 controller driver"); +MODULE_AUTHOR("Thomas Chou "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c new file mode 100644 index 00000000..4e2fd448 --- /dev/null +++ b/drivers/input/serio/ambakmi.c @@ -0,0 +1,215 @@ +/* + * linux/drivers/input/serio/ambakmi.c + * + * Copyright (C) 2000-2003 Deep Blue Solutions Ltd. + * Copyright (C) 2002 Russell King. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define KMI_BASE (kmi->base) + +struct amba_kmi_port { + struct serio *io; + struct clk *clk; + void __iomem *base; + unsigned int irq; + unsigned int divisor; + unsigned int open; +}; + +static irqreturn_t amba_kmi_int(int irq, void *dev_id) +{ + struct amba_kmi_port *kmi = dev_id; + unsigned int status = readb(KMIIR); + int handled = IRQ_NONE; + + while (status & KMIIR_RXINTR) { + serio_interrupt(kmi->io, readb(KMIDATA), 0); + status = readb(KMIIR); + handled = IRQ_HANDLED; + } + + return handled; +} + +static int amba_kmi_write(struct serio *io, unsigned char val) +{ + struct amba_kmi_port *kmi = io->port_data; + unsigned int timeleft = 10000; /* timeout in 100ms */ + + while ((readb(KMISTAT) & KMISTAT_TXEMPTY) == 0 && --timeleft) + udelay(10); + + if (timeleft) + writeb(val, KMIDATA); + + return timeleft ? 0 : SERIO_TIMEOUT; +} + +static int amba_kmi_open(struct serio *io) +{ + struct amba_kmi_port *kmi = io->port_data; + unsigned int divisor; + int ret; + + ret = clk_prepare_enable(kmi->clk); + if (ret) + goto out; + + divisor = clk_get_rate(kmi->clk) / 8000000 - 1; + writeb(divisor, KMICLKDIV); + writeb(KMICR_EN, KMICR); + + ret = request_irq(kmi->irq, amba_kmi_int, 0, "kmi-pl050", kmi); + if (ret) { + printk(KERN_ERR "kmi: failed to claim IRQ%d\n", kmi->irq); + writeb(0, KMICR); + goto clk_disable; + } + + writeb(KMICR_EN | KMICR_RXINTREN, KMICR); + + return 0; + + clk_disable: + clk_disable_unprepare(kmi->clk); + out: + return ret; +} + +static void amba_kmi_close(struct serio *io) +{ + struct amba_kmi_port *kmi = io->port_data; + + writeb(0, KMICR); + + free_irq(kmi->irq, kmi); + clk_disable_unprepare(kmi->clk); +} + +static int amba_kmi_probe(struct amba_device *dev, + const struct amba_id *id) +{ + struct amba_kmi_port *kmi; + struct serio *io; + int ret; + + ret = amba_request_regions(dev, NULL); + if (ret) + return ret; + + kmi = kzalloc(sizeof(struct amba_kmi_port), GFP_KERNEL); + io = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!kmi || !io) { + ret = -ENOMEM; + goto out; + } + + + io->id.type = SERIO_8042; + io->write = amba_kmi_write; + io->open = amba_kmi_open; + io->close = amba_kmi_close; + strlcpy(io->name, dev_name(&dev->dev), sizeof(io->name)); + strlcpy(io->phys, dev_name(&dev->dev), sizeof(io->phys)); + io->port_data = kmi; + io->dev.parent = &dev->dev; + + kmi->io = io; + kmi->base = ioremap(dev->res.start, resource_size(&dev->res)); + if (!kmi->base) { + ret = -ENOMEM; + goto out; + } + + kmi->clk = clk_get(&dev->dev, "KMIREFCLK"); + if (IS_ERR(kmi->clk)) { + ret = PTR_ERR(kmi->clk); + goto unmap; + } + + kmi->irq = dev->irq[0]; + amba_set_drvdata(dev, kmi); + + serio_register_port(kmi->io); + return 0; + + unmap: + iounmap(kmi->base); + out: + kfree(kmi); + kfree(io); + amba_release_regions(dev); + return ret; +} + +static int amba_kmi_remove(struct amba_device *dev) +{ + struct amba_kmi_port *kmi = amba_get_drvdata(dev); + + amba_set_drvdata(dev, NULL); + + serio_unregister_port(kmi->io); + clk_put(kmi->clk); + iounmap(kmi->base); + kfree(kmi); + amba_release_regions(dev); + return 0; +} + +static int amba_kmi_resume(struct amba_device *dev) +{ + struct amba_kmi_port *kmi = amba_get_drvdata(dev); + + /* kick the serio layer to rescan this port */ + serio_reconnect(kmi->io); + + return 0; +} + +static struct amba_id amba_kmi_idtable[] = { + { + .id = 0x00041050, + .mask = 0x000fffff, + }, + { 0, 0 } +}; + +MODULE_DEVICE_TABLE(amba, amba_kmi_idtable); + +static struct amba_driver ambakmi_driver = { + .drv = { + .name = "kmi-pl050", + .owner = THIS_MODULE, + }, + .id_table = amba_kmi_idtable, + .probe = amba_kmi_probe, + .remove = amba_kmi_remove, + .resume = amba_kmi_resume, +}; + +module_amba_driver(ambakmi_driver); + +MODULE_AUTHOR("Russell King "); +MODULE_DESCRIPTION("AMBA KMI controller driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/serio/ams_delta_serio.c b/drivers/input/serio/ams_delta_serio.c new file mode 100644 index 00000000..45887e31 --- /dev/null +++ b/drivers/input/serio/ams_delta_serio.c @@ -0,0 +1,191 @@ +/* + * Amstrad E3 (Delta) keyboard port driver + * + * Copyright (c) 2006 Matt Callow + * Copyright (c) 2010 Janusz Krzysztofik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + * + * Thanks to Cliff Lawson for his help + * + * The Amstrad Delta keyboard (aka mailboard) uses normal PC-AT style serial + * transmission. The keyboard port is formed of two GPIO lines, for clock + * and data. Due to strict timing requirements of the interface, + * the serial data stream is read and processed by a FIQ handler. + * The resulting words are fetched by this driver from a circular buffer. + * + * Standard AT keyboard driver (atkbd) is used for handling the keyboard data. + * However, when used with the E3 mailboard that producecs non-standard + * scancodes, a custom key table must be prepared and loaded from userspace. + */ +#include +#include +#include +#include +#include + +#include +#include + +#include + +MODULE_AUTHOR("Matt Callow"); +MODULE_DESCRIPTION("AMS Delta (E3) keyboard port driver"); +MODULE_LICENSE("GPL"); + +static struct serio *ams_delta_serio; + +static int check_data(int data) +{ + int i, parity = 0; + + /* check valid stop bit */ + if (!(data & 0x400)) { + dev_warn(&ams_delta_serio->dev, + "invalid stop bit, data=0x%X\n", + data); + return SERIO_FRAME; + } + /* calculate the parity */ + for (i = 1; i < 10; i++) { + if (data & (1 << i)) + parity++; + } + /* it should be odd */ + if (!(parity & 0x01)) { + dev_warn(&ams_delta_serio->dev, + "paritiy check failed, data=0x%X parity=0x%X\n", + data, parity); + return SERIO_PARITY; + } + return 0; +} + +static irqreturn_t ams_delta_serio_interrupt(int irq, void *dev_id) +{ + int *circ_buff = &fiq_buffer[FIQ_CIRC_BUFF]; + int data, dfl; + u8 scancode; + + fiq_buffer[FIQ_IRQ_PEND] = 0; + + /* + * Read data from the circular buffer, check it + * and then pass it on the serio + */ + while (fiq_buffer[FIQ_KEYS_CNT] > 0) { + + data = circ_buff[fiq_buffer[FIQ_HEAD_OFFSET]++]; + fiq_buffer[FIQ_KEYS_CNT]--; + if (fiq_buffer[FIQ_HEAD_OFFSET] == fiq_buffer[FIQ_BUF_LEN]) + fiq_buffer[FIQ_HEAD_OFFSET] = 0; + + dfl = check_data(data); + scancode = (u8) (data >> 1) & 0xFF; + serio_interrupt(ams_delta_serio, scancode, dfl); + } + return IRQ_HANDLED; +} + +static int ams_delta_serio_open(struct serio *serio) +{ + /* enable keyboard */ + gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1); + + return 0; +} + +static void ams_delta_serio_close(struct serio *serio) +{ + /* disable keyboard */ + gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0); +} + +static const struct gpio ams_delta_gpios[] __initconst_or_module = { + { + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATA, + .flags = GPIOF_DIR_IN, + .label = "serio-data", + }, + { + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_CLK, + .flags = GPIOF_DIR_IN, + .label = "serio-clock", + }, + { + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR, + .flags = GPIOF_OUT_INIT_LOW, + .label = "serio-power", + }, + { + .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT, + .flags = GPIOF_OUT_INIT_LOW, + .label = "serio-dataout", + }, +}; + +static int __init ams_delta_serio_init(void) +{ + int err; + + if (!machine_is_ams_delta()) + return -ENODEV; + + ams_delta_serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!ams_delta_serio) + return -ENOMEM; + + ams_delta_serio->id.type = SERIO_8042; + ams_delta_serio->open = ams_delta_serio_open; + ams_delta_serio->close = ams_delta_serio_close; + strlcpy(ams_delta_serio->name, "AMS DELTA keyboard adapter", + sizeof(ams_delta_serio->name)); + strlcpy(ams_delta_serio->phys, "GPIO/serio0", + sizeof(ams_delta_serio->phys)); + + err = gpio_request_array(ams_delta_gpios, + ARRAY_SIZE(ams_delta_gpios)); + if (err) { + pr_err("ams_delta_serio: Couldn't request gpio pins\n"); + goto serio; + } + + err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), + ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING, + "ams-delta-serio", 0); + if (err < 0) { + pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n", + gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK)); + goto gpio; + } + /* + * Since GPIO register handling for keyboard clock pin is performed + * at FIQ level, switch back from edge to simple interrupt handler + * to avoid bad interaction. + */ + irq_set_handler(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), + handle_simple_irq); + + serio_register_port(ams_delta_serio); + dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name); + + return 0; +gpio: + gpio_free_array(ams_delta_gpios, + ARRAY_SIZE(ams_delta_gpios)); +serio: + kfree(ams_delta_serio); + return err; +} +module_init(ams_delta_serio_init); + +static void __exit ams_delta_serio_exit(void) +{ + serio_unregister_port(ams_delta_serio); + free_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0); + gpio_free_array(ams_delta_gpios, + ARRAY_SIZE(ams_delta_gpios)); +} +module_exit(ams_delta_serio_exit); diff --git a/drivers/input/serio/apbps2.c b/drivers/input/serio/apbps2.c new file mode 100644 index 00000000..17e01a80 --- /dev/null +++ b/drivers/input/serio/apbps2.c @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2013 Aeroflex Gaisler + * + * This driver supports the APBPS2 PS/2 core available in the GRLIB + * VHDL IP core library. + * + * Full documentation of the APBPS2 core can be found here: + * http://www.gaisler.com/products/grlib/grip.pdf + * + * See "Documentation/devicetree/bindings/input/ps2keyb-mouse-apbps2.txt" for + * information on open firmware properties. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Contributors: Daniel Hellstrom + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct apbps2_regs { + u32 __iomem data; /* 0x00 */ + u32 __iomem status; /* 0x04 */ + u32 __iomem ctrl; /* 0x08 */ + u32 __iomem reload; /* 0x0c */ +}; + +#define APBPS2_STATUS_DR (1<<0) +#define APBPS2_STATUS_PE (1<<1) +#define APBPS2_STATUS_FE (1<<2) +#define APBPS2_STATUS_KI (1<<3) +#define APBPS2_STATUS_RF (1<<4) +#define APBPS2_STATUS_TF (1<<5) +#define APBPS2_STATUS_TCNT (0x1f<<22) +#define APBPS2_STATUS_RCNT (0x1f<<27) + +#define APBPS2_CTRL_RE (1<<0) +#define APBPS2_CTRL_TE (1<<1) +#define APBPS2_CTRL_RI (1<<2) +#define APBPS2_CTRL_TI (1<<3) + +struct apbps2_priv { + struct serio *io; + struct apbps2_regs *regs; +}; + +static int apbps2_idx; + +static irqreturn_t apbps2_isr(int irq, void *dev_id) +{ + struct apbps2_priv *priv = dev_id; + unsigned long status, data, rxflags; + irqreturn_t ret = IRQ_NONE; + + while ((status = ioread32be(&priv->regs->status)) & APBPS2_STATUS_DR) { + data = ioread32be(&priv->regs->data); + rxflags = (status & APBPS2_STATUS_PE) ? SERIO_PARITY : 0; + rxflags |= (status & APBPS2_STATUS_FE) ? SERIO_FRAME : 0; + + /* clear error bits? */ + if (rxflags) + iowrite32be(0, &priv->regs->status); + + serio_interrupt(priv->io, data, rxflags); + + ret = IRQ_HANDLED; + } + + return ret; +} + +static int apbps2_write(struct serio *io, unsigned char val) +{ + struct apbps2_priv *priv = io->port_data; + unsigned int tleft = 10000; /* timeout in 100ms */ + + /* delay until PS/2 controller has room for more chars */ + while ((ioread32be(&priv->regs->status) & APBPS2_STATUS_TF) && tleft--) + udelay(10); + + if ((ioread32be(&priv->regs->status) & APBPS2_STATUS_TF) == 0) { + iowrite32be(val, &priv->regs->data); + + iowrite32be(APBPS2_CTRL_RE | APBPS2_CTRL_RI | APBPS2_CTRL_TE, + &priv->regs->ctrl); + return 0; + } + + return -ETIMEDOUT; +} + +static int apbps2_open(struct serio *io) +{ + struct apbps2_priv *priv = io->port_data; + int limit; + unsigned long tmp; + + /* clear error flags */ + iowrite32be(0, &priv->regs->status); + + /* Clear old data if available (unlikely) */ + limit = 1024; + while ((ioread32be(&priv->regs->status) & APBPS2_STATUS_DR) && --limit) + tmp = ioread32be(&priv->regs->data); + + /* Enable reciever and it's interrupt */ + iowrite32be(APBPS2_CTRL_RE | APBPS2_CTRL_RI, &priv->regs->ctrl); + + return 0; +} + +static void apbps2_close(struct serio *io) +{ + struct apbps2_priv *priv = io->port_data; + + /* stop interrupts at PS/2 HW level */ + iowrite32be(0, &priv->regs->ctrl); +} + +/* Initialize one APBPS2 PS/2 core */ +static int apbps2_of_probe(struct platform_device *ofdev) +{ + struct apbps2_priv *priv; + int irq, err; + u32 freq_hz; + struct resource *res; + + priv = devm_kzalloc(&ofdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) { + dev_err(&ofdev->dev, "memory allocation failed\n"); + return -ENOMEM; + } + + /* Find Device Address */ + res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); + priv->regs = devm_ioremap_resource(&ofdev->dev, res); + if (IS_ERR(priv->regs)) + return PTR_ERR(priv->regs); + + /* Reset hardware, disable interrupt */ + iowrite32be(0, &priv->regs->ctrl); + + /* IRQ */ + irq = irq_of_parse_and_map(ofdev->dev.of_node, 0); + err = devm_request_irq(&ofdev->dev, irq, apbps2_isr, + IRQF_SHARED, "apbps2", priv); + if (err) { + dev_err(&ofdev->dev, "request IRQ%d failed\n", irq); + return err; + } + + /* Get core frequency */ + if (of_property_read_u32(ofdev->dev.of_node, "freq", &freq_hz)) { + dev_err(&ofdev->dev, "unable to get core frequency\n"); + return -EINVAL; + } + + /* Set reload register to core freq in kHz/10 */ + iowrite32be(freq_hz / 10000, &priv->regs->reload); + + priv->io = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!priv->io) + return -ENOMEM; + + priv->io->id.type = SERIO_8042; + priv->io->open = apbps2_open; + priv->io->close = apbps2_close; + priv->io->write = apbps2_write; + priv->io->port_data = priv; + strlcpy(priv->io->name, "APBPS2 PS/2", sizeof(priv->io->name)); + snprintf(priv->io->phys, sizeof(priv->io->phys), + "apbps2_%d", apbps2_idx++); + + dev_info(&ofdev->dev, "irq = %d, base = 0x%p\n", irq, priv->regs); + + serio_register_port(priv->io); + + platform_set_drvdata(ofdev, priv); + + return 0; +} + +static int apbps2_of_remove(struct platform_device *of_dev) +{ + struct apbps2_priv *priv = platform_get_drvdata(of_dev); + + serio_unregister_port(priv->io); + + return 0; +} + +static struct of_device_id apbps2_of_match[] = { + { .name = "GAISLER_APBPS2", }, + { .name = "01_060", }, + {} +}; + +MODULE_DEVICE_TABLE(of, apbps2_of_match); + +static struct platform_driver apbps2_of_driver = { + .driver = { + .name = "grlib-apbps2", + .owner = THIS_MODULE, + .of_match_table = apbps2_of_match, + }, + .probe = apbps2_of_probe, + .remove = apbps2_of_remove, +}; + +module_platform_driver(apbps2_of_driver); + +MODULE_AUTHOR("Aeroflex Gaisler AB."); +MODULE_DESCRIPTION("GRLIB APBPS2 PS/2 serial I/O"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/serio/arc_ps2.c b/drivers/input/serio/arc_ps2.c new file mode 100644 index 00000000..3fb7727c --- /dev/null +++ b/drivers/input/serio/arc_ps2.c @@ -0,0 +1,285 @@ +/* + * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Driver is originally developed by Pavel Sokolov + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ARC_PS2_PORTS 2 + +#define ARC_ARC_PS2_ID 0x0001f609 + +#define STAT_TIMEOUT 128 + +#define PS2_STAT_RX_FRM_ERR (1) +#define PS2_STAT_RX_BUF_OVER (1 << 1) +#define PS2_STAT_RX_INT_EN (1 << 2) +#define PS2_STAT_RX_VAL (1 << 3) +#define PS2_STAT_TX_ISNOT_FUL (1 << 4) +#define PS2_STAT_TX_INT_EN (1 << 5) + +struct arc_ps2_port { + void __iomem *data_addr; + void __iomem *status_addr; + struct serio *io; +}; + +struct arc_ps2_data { + struct arc_ps2_port port[ARC_PS2_PORTS]; + void __iomem *addr; + unsigned int frame_error; + unsigned int buf_overflow; + unsigned int total_int; +}; + +static void arc_ps2_check_rx(struct arc_ps2_data *arc_ps2, + struct arc_ps2_port *port) +{ + unsigned int timeout = 1000; + unsigned int flag, status; + unsigned char data; + + do { + status = ioread32(port->status_addr); + if (!(status & PS2_STAT_RX_VAL)) + return; + + data = ioread32(port->data_addr) & 0xff; + + flag = 0; + arc_ps2->total_int++; + if (status & PS2_STAT_RX_FRM_ERR) { + arc_ps2->frame_error++; + flag |= SERIO_PARITY; + } else if (status & PS2_STAT_RX_BUF_OVER) { + arc_ps2->buf_overflow++; + flag |= SERIO_FRAME; + } + + serio_interrupt(port->io, data, flag); + } while (--timeout); + + dev_err(&port->io->dev, "PS/2 hardware stuck\n"); +} + +static irqreturn_t arc_ps2_interrupt(int irq, void *dev) +{ + struct arc_ps2_data *arc_ps2 = dev; + int i; + + for (i = 0; i < ARC_PS2_PORTS; i++) + arc_ps2_check_rx(arc_ps2, &arc_ps2->port[i]); + + return IRQ_HANDLED; +} + +static int arc_ps2_write(struct serio *io, unsigned char val) +{ + unsigned status; + struct arc_ps2_port *port = io->port_data; + int timeout = STAT_TIMEOUT; + + do { + status = ioread32(port->status_addr); + cpu_relax(); + + if (status & PS2_STAT_TX_ISNOT_FUL) { + iowrite32(val & 0xff, port->data_addr); + return 0; + } + + } while (--timeout); + + dev_err(&io->dev, "write timeout\n"); + return -ETIMEDOUT; +} + +static int arc_ps2_open(struct serio *io) +{ + struct arc_ps2_port *port = io->port_data; + + iowrite32(PS2_STAT_RX_INT_EN, port->status_addr); + + return 0; +} + +static void arc_ps2_close(struct serio *io) +{ + struct arc_ps2_port *port = io->port_data; + + iowrite32(ioread32(port->status_addr) & ~PS2_STAT_RX_INT_EN, + port->status_addr); +} + +static void __iomem *arc_ps2_calc_addr(struct arc_ps2_data *arc_ps2, + int index, bool status) +{ + void __iomem *addr; + + addr = arc_ps2->addr + 4 + 4 * index; + if (status) + addr += ARC_PS2_PORTS * 4; + + return addr; +} + +static void arc_ps2_inhibit_ports(struct arc_ps2_data *arc_ps2) +{ + void __iomem *addr; + u32 val; + int i; + + for (i = 0; i < ARC_PS2_PORTS; i++) { + addr = arc_ps2_calc_addr(arc_ps2, i, true); + val = ioread32(addr); + val &= ~(PS2_STAT_RX_INT_EN | PS2_STAT_TX_INT_EN); + iowrite32(val, addr); + } +} + +static int arc_ps2_create_port(struct platform_device *pdev, + struct arc_ps2_data *arc_ps2, + int index) +{ + struct arc_ps2_port *port = &arc_ps2->port[index]; + struct serio *io; + + io = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!io) + return -ENOMEM; + + io->id.type = SERIO_8042; + io->write = arc_ps2_write; + io->open = arc_ps2_open; + io->close = arc_ps2_close; + snprintf(io->name, sizeof(io->name), "ARC PS/2 port%d", index); + snprintf(io->phys, sizeof(io->phys), "arc/serio%d", index); + io->port_data = port; + + port->io = io; + + port->data_addr = arc_ps2_calc_addr(arc_ps2, index, false); + port->status_addr = arc_ps2_calc_addr(arc_ps2, index, true); + + dev_dbg(&pdev->dev, "port%d is allocated (data = 0x%p, status = 0x%p)\n", + index, port->data_addr, port->status_addr); + + serio_register_port(port->io); + return 0; +} + +static int arc_ps2_probe(struct platform_device *pdev) +{ + struct arc_ps2_data *arc_ps2; + struct resource *res; + int irq; + int error, id, i; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "no IO memory defined\n"); + return -EINVAL; + } + + irq = platform_get_irq_byname(pdev, "arc_ps2_irq"); + if (irq < 0) { + dev_err(&pdev->dev, "no IRQ defined\n"); + return -EINVAL; + } + + arc_ps2 = devm_kzalloc(&pdev->dev, sizeof(struct arc_ps2_data), + GFP_KERNEL); + if (!arc_ps2) { + dev_err(&pdev->dev, "out of memory\n"); + return -ENOMEM; + } + + arc_ps2->addr = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(arc_ps2->addr)) + return PTR_ERR(arc_ps2->addr); + + dev_info(&pdev->dev, "irq = %d, address = 0x%p, ports = %i\n", + irq, arc_ps2->addr, ARC_PS2_PORTS); + + id = ioread32(arc_ps2->addr); + if (id != ARC_ARC_PS2_ID) { + dev_err(&pdev->dev, "device id does not match\n"); + return -ENXIO; + } + + arc_ps2_inhibit_ports(arc_ps2); + + error = devm_request_irq(&pdev->dev, irq, arc_ps2_interrupt, + 0, "arc_ps2", arc_ps2); + if (error) { + dev_err(&pdev->dev, "Could not allocate IRQ\n"); + return error; + } + + for (i = 0; i < ARC_PS2_PORTS; i++) { + error = arc_ps2_create_port(pdev, arc_ps2, i); + if (error) { + while (--i >= 0) + serio_unregister_port(arc_ps2->port[i].io); + return error; + } + } + + platform_set_drvdata(pdev, arc_ps2); + + return 0; +} + +static int arc_ps2_remove(struct platform_device *pdev) +{ + struct arc_ps2_data *arc_ps2 = platform_get_drvdata(pdev); + int i; + + for (i = 0; i < ARC_PS2_PORTS; i++) + serio_unregister_port(arc_ps2->port[i].io); + + dev_dbg(&pdev->dev, "interrupt count = %i\n", arc_ps2->total_int); + dev_dbg(&pdev->dev, "frame error count = %i\n", arc_ps2->frame_error); + dev_dbg(&pdev->dev, "buffer overflow count = %i\n", + arc_ps2->buf_overflow); + + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id arc_ps2_match[] = { + { .compatible = "snps,arc_ps2" }, + { }, +}; +MODULE_DEVICE_TABLE(of, arc_ps2_match); +#endif + +static struct platform_driver arc_ps2_driver = { + .driver = { + .name = "arc_ps2", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(arc_ps2_match), + }, + .probe = arc_ps2_probe, + .remove = arc_ps2_remove, +}; + +module_platform_driver(arc_ps2_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Pavel Sokolov "); +MODULE_DESCRIPTION("ARC PS/2 Driver"); diff --git a/drivers/input/serio/at32psif.c b/drivers/input/serio/at32psif.c new file mode 100644 index 00000000..190ce35a --- /dev/null +++ b/drivers/input/serio/at32psif.c @@ -0,0 +1,366 @@ +/* + * Copyright (C) 2007 Atmel Corporation + * + * Driver for the AT32AP700X PS/2 controller (PSIF). + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* PSIF register offsets */ +#define PSIF_CR 0x00 +#define PSIF_RHR 0x04 +#define PSIF_THR 0x08 +#define PSIF_SR 0x10 +#define PSIF_IER 0x14 +#define PSIF_IDR 0x18 +#define PSIF_IMR 0x1c +#define PSIF_PSR 0x24 + +/* Bitfields in control register. */ +#define PSIF_CR_RXDIS_OFFSET 1 +#define PSIF_CR_RXDIS_SIZE 1 +#define PSIF_CR_RXEN_OFFSET 0 +#define PSIF_CR_RXEN_SIZE 1 +#define PSIF_CR_SWRST_OFFSET 15 +#define PSIF_CR_SWRST_SIZE 1 +#define PSIF_CR_TXDIS_OFFSET 9 +#define PSIF_CR_TXDIS_SIZE 1 +#define PSIF_CR_TXEN_OFFSET 8 +#define PSIF_CR_TXEN_SIZE 1 + +/* Bitfields in interrupt disable, enable, mask and status register. */ +#define PSIF_NACK_OFFSET 8 +#define PSIF_NACK_SIZE 1 +#define PSIF_OVRUN_OFFSET 5 +#define PSIF_OVRUN_SIZE 1 +#define PSIF_PARITY_OFFSET 9 +#define PSIF_PARITY_SIZE 1 +#define PSIF_RXRDY_OFFSET 4 +#define PSIF_RXRDY_SIZE 1 +#define PSIF_TXEMPTY_OFFSET 1 +#define PSIF_TXEMPTY_SIZE 1 +#define PSIF_TXRDY_OFFSET 0 +#define PSIF_TXRDY_SIZE 1 + +/* Bitfields in prescale register. */ +#define PSIF_PSR_PRSCV_OFFSET 0 +#define PSIF_PSR_PRSCV_SIZE 12 + +/* Bitfields in receive hold register. */ +#define PSIF_RHR_RXDATA_OFFSET 0 +#define PSIF_RHR_RXDATA_SIZE 8 + +/* Bitfields in transmit hold register. */ +#define PSIF_THR_TXDATA_OFFSET 0 +#define PSIF_THR_TXDATA_SIZE 8 + +/* Bit manipulation macros */ +#define PSIF_BIT(name) \ + (1 << PSIF_##name##_OFFSET) + +#define PSIF_BF(name, value) \ + (((value) & ((1 << PSIF_##name##_SIZE) - 1)) \ + << PSIF_##name##_OFFSET) + +#define PSIF_BFEXT(name, value) \ + (((value) >> PSIF_##name##_OFFSET) \ + & ((1 << PSIF_##name##_SIZE) - 1)) + +#define PSIF_BFINS(name, value, old) \ + (((old) & ~(((1 << PSIF_##name##_SIZE) - 1) \ + << PSIF_##name##_OFFSET)) \ + | PSIF_BF(name, value)) + +/* Register access macros */ +#define psif_readl(port, reg) \ + __raw_readl((port)->regs + PSIF_##reg) + +#define psif_writel(port, reg, value) \ + __raw_writel((value), (port)->regs + PSIF_##reg) + +struct psif { + struct platform_device *pdev; + struct clk *pclk; + struct serio *io; + void __iomem *regs; + unsigned int irq; + /* Prevent concurrent writes to PSIF THR. */ + spinlock_t lock; + bool open; +}; + +static irqreturn_t psif_interrupt(int irq, void *_ptr) +{ + struct psif *psif = _ptr; + int retval = IRQ_NONE; + unsigned int io_flags = 0; + unsigned long status; + + status = psif_readl(psif, SR); + + if (status & PSIF_BIT(RXRDY)) { + unsigned char val = (unsigned char) psif_readl(psif, RHR); + + if (status & PSIF_BIT(PARITY)) + io_flags |= SERIO_PARITY; + if (status & PSIF_BIT(OVRUN)) + dev_err(&psif->pdev->dev, "overrun read error\n"); + + serio_interrupt(psif->io, val, io_flags); + + retval = IRQ_HANDLED; + } + + return retval; +} + +static int psif_write(struct serio *io, unsigned char val) +{ + struct psif *psif = io->port_data; + unsigned long flags; + int timeout = 10; + int retval = 0; + + spin_lock_irqsave(&psif->lock, flags); + + while (!(psif_readl(psif, SR) & PSIF_BIT(TXEMPTY)) && timeout--) + udelay(50); + + if (timeout >= 0) { + psif_writel(psif, THR, val); + } else { + dev_dbg(&psif->pdev->dev, "timeout writing to THR\n"); + retval = -EBUSY; + } + + spin_unlock_irqrestore(&psif->lock, flags); + + return retval; +} + +static int psif_open(struct serio *io) +{ + struct psif *psif = io->port_data; + int retval; + + retval = clk_enable(psif->pclk); + if (retval) + goto out; + + psif_writel(psif, CR, PSIF_BIT(CR_TXEN) | PSIF_BIT(CR_RXEN)); + psif_writel(psif, IER, PSIF_BIT(RXRDY)); + + psif->open = true; +out: + return retval; +} + +static void psif_close(struct serio *io) +{ + struct psif *psif = io->port_data; + + psif->open = false; + + psif_writel(psif, IDR, ~0UL); + psif_writel(psif, CR, PSIF_BIT(CR_TXDIS) | PSIF_BIT(CR_RXDIS)); + + clk_disable(psif->pclk); +} + +static void psif_set_prescaler(struct psif *psif) +{ + unsigned long prscv; + unsigned long rate = clk_get_rate(psif->pclk); + + /* PRSCV = Pulse length (100 us) * PSIF module frequency. */ + prscv = 100 * (rate / 1000000UL); + + if (prscv > ((1<pdev->dev, "pclk too fast, " + "prescaler set to max\n"); + } + + clk_enable(psif->pclk); + psif_writel(psif, PSR, prscv); + clk_disable(psif->pclk); +} + +static int __init psif_probe(struct platform_device *pdev) +{ + struct resource *regs; + struct psif *psif; + struct serio *io; + struct clk *pclk; + int irq; + int ret; + + psif = kzalloc(sizeof(struct psif), GFP_KERNEL); + if (!psif) { + dev_dbg(&pdev->dev, "out of memory\n"); + ret = -ENOMEM; + goto out; + } + psif->pdev = pdev; + + io = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!io) { + dev_dbg(&pdev->dev, "out of memory\n"); + ret = -ENOMEM; + goto out_free_psif; + } + psif->io = io; + + regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!regs) { + dev_dbg(&pdev->dev, "no mmio resources defined\n"); + ret = -ENOMEM; + goto out_free_io; + } + + psif->regs = ioremap(regs->start, resource_size(regs)); + if (!psif->regs) { + ret = -ENOMEM; + dev_dbg(&pdev->dev, "could not map I/O memory\n"); + goto out_free_io; + } + + pclk = clk_get(&pdev->dev, "pclk"); + if (IS_ERR(pclk)) { + dev_dbg(&pdev->dev, "could not get peripheral clock\n"); + ret = PTR_ERR(pclk); + goto out_iounmap; + } + psif->pclk = pclk; + + /* Reset the PSIF to enter at a known state. */ + ret = clk_enable(pclk); + if (ret) { + dev_dbg(&pdev->dev, "could not enable pclk\n"); + goto out_put_clk; + } + psif_writel(psif, CR, PSIF_BIT(CR_SWRST)); + clk_disable(pclk); + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_dbg(&pdev->dev, "could not get irq\n"); + ret = -ENXIO; + goto out_put_clk; + } + ret = request_irq(irq, psif_interrupt, IRQF_SHARED, "at32psif", psif); + if (ret) { + dev_dbg(&pdev->dev, "could not request irq %d\n", irq); + goto out_put_clk; + } + psif->irq = irq; + + io->id.type = SERIO_8042; + io->write = psif_write; + io->open = psif_open; + io->close = psif_close; + snprintf(io->name, sizeof(io->name), "AVR32 PS/2 port%d", pdev->id); + snprintf(io->phys, sizeof(io->phys), "at32psif/serio%d", pdev->id); + io->port_data = psif; + io->dev.parent = &pdev->dev; + + psif_set_prescaler(psif); + + spin_lock_init(&psif->lock); + serio_register_port(psif->io); + platform_set_drvdata(pdev, psif); + + dev_info(&pdev->dev, "Atmel AVR32 PSIF PS/2 driver on 0x%08x irq %d\n", + (int)psif->regs, psif->irq); + + return 0; + +out_put_clk: + clk_put(psif->pclk); +out_iounmap: + iounmap(psif->regs); +out_free_io: + kfree(io); +out_free_psif: + kfree(psif); +out: + return ret; +} + +static int __exit psif_remove(struct platform_device *pdev) +{ + struct psif *psif = platform_get_drvdata(pdev); + + psif_writel(psif, IDR, ~0UL); + psif_writel(psif, CR, PSIF_BIT(CR_TXDIS) | PSIF_BIT(CR_RXDIS)); + + serio_unregister_port(psif->io); + iounmap(psif->regs); + free_irq(psif->irq, psif); + clk_put(psif->pclk); + kfree(psif); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int psif_suspend(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct psif *psif = platform_get_drvdata(pdev); + + if (psif->open) { + psif_writel(psif, CR, PSIF_BIT(CR_RXDIS) | PSIF_BIT(CR_TXDIS)); + clk_disable(psif->pclk); + } + + return 0; +} + +static int psif_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct psif *psif = platform_get_drvdata(pdev); + + if (psif->open) { + clk_enable(psif->pclk); + psif_set_prescaler(psif); + psif_writel(psif, CR, PSIF_BIT(CR_RXEN) | PSIF_BIT(CR_TXEN)); + } + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(psif_pm_ops, psif_suspend, psif_resume); + +static struct platform_driver psif_driver = { + .remove = __exit_p(psif_remove), + .driver = { + .name = "atmel_psif", + .owner = THIS_MODULE, + .pm = &psif_pm_ops, + }, +}; + +module_platform_driver_probe(psif_driver, psif_probe); + +MODULE_AUTHOR("Hans-Christian Egtvedt "); +MODULE_DESCRIPTION("Atmel AVR32 PSIF PS/2 driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/serio/ct82c710.c b/drivers/input/serio/ct82c710.c new file mode 100644 index 00000000..cfe549d4 --- /dev/null +++ b/drivers/input/serio/ct82c710.c @@ -0,0 +1,261 @@ +/* + * Copyright (c) 1999-2001 Vojtech Pavlik + */ + +/* + * 82C710 C&T mouse port chip driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("82C710 C&T mouse port chip driver"); +MODULE_LICENSE("GPL"); + +/* + * ct82c710 interface + */ + +#define CT82C710_DEV_IDLE 0x01 /* Device Idle */ +#define CT82C710_RX_FULL 0x02 /* Device Char received */ +#define CT82C710_TX_IDLE 0x04 /* Device XMIT Idle */ +#define CT82C710_RESET 0x08 /* Device Reset */ +#define CT82C710_INTS_ON 0x10 /* Device Interrupt On */ +#define CT82C710_ERROR_FLAG 0x20 /* Device Error */ +#define CT82C710_CLEAR 0x40 /* Device Clear */ +#define CT82C710_ENABLE 0x80 /* Device Enable */ + +#define CT82C710_IRQ 12 + +#define CT82C710_DATA ct82c710_iores.start +#define CT82C710_STATUS (ct82c710_iores.start + 1) + +static struct serio *ct82c710_port; +static struct platform_device *ct82c710_device; +static struct resource ct82c710_iores; + +/* + * Interrupt handler for the 82C710 mouse port. A character + * is waiting in the 82C710. + */ + +static irqreturn_t ct82c710_interrupt(int cpl, void *dev_id) +{ + return serio_interrupt(ct82c710_port, inb(CT82C710_DATA), 0); +} + +/* + * Wait for device to send output char and flush any input char. + */ + +static int ct82c170_wait(void) +{ + int timeout = 60000; + + while ((inb(CT82C710_STATUS) & (CT82C710_RX_FULL | CT82C710_TX_IDLE | CT82C710_DEV_IDLE)) + != (CT82C710_DEV_IDLE | CT82C710_TX_IDLE) && timeout) { + + if (inb_p(CT82C710_STATUS) & CT82C710_RX_FULL) inb_p(CT82C710_DATA); + + udelay(1); + timeout--; + } + + return !timeout; +} + +static void ct82c710_close(struct serio *serio) +{ + if (ct82c170_wait()) + printk(KERN_WARNING "ct82c710.c: Device busy in close()\n"); + + outb_p(inb_p(CT82C710_STATUS) & ~(CT82C710_ENABLE | CT82C710_INTS_ON), CT82C710_STATUS); + + if (ct82c170_wait()) + printk(KERN_WARNING "ct82c710.c: Device busy in close()\n"); + + free_irq(CT82C710_IRQ, NULL); +} + +static int ct82c710_open(struct serio *serio) +{ + unsigned char status; + int err; + + err = request_irq(CT82C710_IRQ, ct82c710_interrupt, 0, "ct82c710", NULL); + if (err) + return err; + + status = inb_p(CT82C710_STATUS); + + status |= (CT82C710_ENABLE | CT82C710_RESET); + outb_p(status, CT82C710_STATUS); + + status &= ~(CT82C710_RESET); + outb_p(status, CT82C710_STATUS); + + status |= CT82C710_INTS_ON; + outb_p(status, CT82C710_STATUS); /* Enable interrupts */ + + while (ct82c170_wait()) { + printk(KERN_ERR "ct82c710: Device busy in open()\n"); + status &= ~(CT82C710_ENABLE | CT82C710_INTS_ON); + outb_p(status, CT82C710_STATUS); + free_irq(CT82C710_IRQ, NULL); + return -EBUSY; + } + + return 0; +} + +/* + * Write to the 82C710 mouse device. + */ + +static int ct82c710_write(struct serio *port, unsigned char c) +{ + if (ct82c170_wait()) return -1; + outb_p(c, CT82C710_DATA); + return 0; +} + +/* + * See if we can find a 82C710 device. Read mouse address. + */ + +static int __init ct82c710_detect(void) +{ + outb_p(0x55, 0x2fa); /* Any value except 9, ff or 36 */ + outb_p(0xaa, 0x3fa); /* Inverse of 55 */ + outb_p(0x36, 0x3fa); /* Address the chip */ + outb_p(0xe4, 0x3fa); /* 390/4; 390 = config address */ + outb_p(0x1b, 0x2fa); /* Inverse of e4 */ + outb_p(0x0f, 0x390); /* Write index */ + if (inb_p(0x391) != 0xe4) /* Config address found? */ + return -ENODEV; /* No: no 82C710 here */ + + outb_p(0x0d, 0x390); /* Write index */ + ct82c710_iores.start = inb_p(0x391) << 2; /* Get mouse I/O address */ + ct82c710_iores.end = ct82c710_iores.start + 1; + ct82c710_iores.flags = IORESOURCE_IO; + outb_p(0x0f, 0x390); + outb_p(0x0f, 0x391); /* Close config mode */ + + return 0; +} + +static int ct82c710_probe(struct platform_device *dev) +{ + ct82c710_port = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!ct82c710_port) + return -ENOMEM; + + ct82c710_port->id.type = SERIO_8042; + ct82c710_port->dev.parent = &dev->dev; + ct82c710_port->open = ct82c710_open; + ct82c710_port->close = ct82c710_close; + ct82c710_port->write = ct82c710_write; + strlcpy(ct82c710_port->name, "C&T 82c710 mouse port", + sizeof(ct82c710_port->name)); + snprintf(ct82c710_port->phys, sizeof(ct82c710_port->phys), + "isa%16llx/serio0", (unsigned long long)CT82C710_DATA); + + serio_register_port(ct82c710_port); + + printk(KERN_INFO "serio: C&T 82c710 mouse port at %#llx irq %d\n", + (unsigned long long)CT82C710_DATA, CT82C710_IRQ); + + return 0; +} + +static int ct82c710_remove(struct platform_device *dev) +{ + serio_unregister_port(ct82c710_port); + + return 0; +} + +static struct platform_driver ct82c710_driver = { + .driver = { + .name = "ct82c710", + .owner = THIS_MODULE, + }, + .probe = ct82c710_probe, + .remove = ct82c710_remove, +}; + + +static int __init ct82c710_init(void) +{ + int error; + + error = ct82c710_detect(); + if (error) + return error; + + error = platform_driver_register(&ct82c710_driver); + if (error) + return error; + + ct82c710_device = platform_device_alloc("ct82c710", -1); + if (!ct82c710_device) { + error = -ENOMEM; + goto err_unregister_driver; + } + + error = platform_device_add_resources(ct82c710_device, &ct82c710_iores, 1); + if (error) + goto err_free_device; + + error = platform_device_add(ct82c710_device); + if (error) + goto err_free_device; + + return 0; + + err_free_device: + platform_device_put(ct82c710_device); + err_unregister_driver: + platform_driver_unregister(&ct82c710_driver); + return error; +} + +static void __exit ct82c710_exit(void) +{ + platform_device_unregister(ct82c710_device); + platform_driver_unregister(&ct82c710_driver); +} + +module_init(ct82c710_init); +module_exit(ct82c710_exit); diff --git a/drivers/input/serio/gscps2.c b/drivers/input/serio/gscps2.c new file mode 100644 index 00000000..8d9ba0c3 --- /dev/null +++ b/drivers/input/serio/gscps2.c @@ -0,0 +1,464 @@ +/* + * drivers/input/serio/gscps2.c + * + * Copyright (c) 2004-2006 Helge Deller + * Copyright (c) 2002 Laurent Canet + * Copyright (c) 2002 Thibaut Varene + * + * Pieces of code based on linux-2.4's hp_mouse.c & hp_keyb.c + * Copyright (c) 1999 Alex deVries + * Copyright (c) 1999-2000 Philipp Rumpf + * Copyright (c) 2000 Xavier Debacker + * Copyright (c) 2000-2001 Thomas Marteau + * + * HP GSC PS/2 port driver, found in PA/RISC Workstations + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * TODO: + * - Dino testing (did HP ever shipped a machine on which this port + * was usable/enabled ?) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +MODULE_AUTHOR("Laurent Canet , Thibaut Varene , Helge Deller "); +MODULE_DESCRIPTION("HP GSC PS2 port driver"); +MODULE_LICENSE("GPL"); +MODULE_DEVICE_TABLE(parisc, gscps2_device_tbl); + +#define PFX "gscps2.c: " + +/* + * Driver constants + */ + +/* various constants */ +#define ENABLE 1 +#define DISABLE 0 + +#define GSC_DINO_OFFSET 0x0800 /* offset for DINO controller versus LASI one */ + +/* PS/2 IO port offsets */ +#define GSC_ID 0x00 /* device ID offset (see: GSC_ID_XXX) */ +#define GSC_RESET 0x00 /* reset port offset */ +#define GSC_RCVDATA 0x04 /* receive port offset */ +#define GSC_XMTDATA 0x04 /* transmit port offset */ +#define GSC_CONTROL 0x08 /* see: Control register bits */ +#define GSC_STATUS 0x0C /* see: Status register bits */ + +/* Control register bits */ +#define GSC_CTRL_ENBL 0x01 /* enable interface */ +#define GSC_CTRL_LPBXR 0x02 /* loopback operation */ +#define GSC_CTRL_DIAG 0x20 /* directly control clock/data line */ +#define GSC_CTRL_DATDIR 0x40 /* data line direct control */ +#define GSC_CTRL_CLKDIR 0x80 /* clock line direct control */ + +/* Status register bits */ +#define GSC_STAT_RBNE 0x01 /* Receive Buffer Not Empty */ +#define GSC_STAT_TBNE 0x02 /* Transmit Buffer Not Empty */ +#define GSC_STAT_TERR 0x04 /* Timeout Error */ +#define GSC_STAT_PERR 0x08 /* Parity Error */ +#define GSC_STAT_CMPINTR 0x10 /* Composite Interrupt = irq on any port */ +#define GSC_STAT_DATSHD 0x40 /* Data Line Shadow */ +#define GSC_STAT_CLKSHD 0x80 /* Clock Line Shadow */ + +/* IDs returned by GSC_ID port register */ +#define GSC_ID_KEYBOARD 0 /* device ID values */ +#define GSC_ID_MOUSE 1 + + +static irqreturn_t gscps2_interrupt(int irq, void *dev); + +#define BUFFER_SIZE 0x0f + +/* GSC PS/2 port device struct */ +struct gscps2port { + struct list_head node; + struct parisc_device *padev; + struct serio *port; + spinlock_t lock; + char *addr; + u8 act, append; /* position in buffer[] */ + struct { + u8 data; + u8 str; + } buffer[BUFFER_SIZE+1]; + int id; +}; + +/* + * Various HW level routines + */ + +#define gscps2_readb_input(x) readb((x)+GSC_RCVDATA) +#define gscps2_readb_control(x) readb((x)+GSC_CONTROL) +#define gscps2_readb_status(x) readb((x)+GSC_STATUS) +#define gscps2_writeb_control(x, y) writeb((x), (y)+GSC_CONTROL) + + +/* + * wait_TBE() - wait for Transmit Buffer Empty + */ + +static int wait_TBE(char *addr) +{ + int timeout = 25000; /* device is expected to react within 250 msec */ + while (gscps2_readb_status(addr) & GSC_STAT_TBNE) { + if (!--timeout) + return 0; /* This should not happen */ + udelay(10); + } + return 1; +} + + +/* + * gscps2_flush() - flush the receive buffer + */ + +static void gscps2_flush(struct gscps2port *ps2port) +{ + while (gscps2_readb_status(ps2port->addr) & GSC_STAT_RBNE) + gscps2_readb_input(ps2port->addr); + ps2port->act = ps2port->append = 0; +} + +/* + * gscps2_writeb_output() - write a byte to the port + * + * returns 1 on success, 0 on error + */ + +static inline int gscps2_writeb_output(struct gscps2port *ps2port, u8 data) +{ + unsigned long flags; + char *addr = ps2port->addr; + + if (!wait_TBE(addr)) { + printk(KERN_DEBUG PFX "timeout - could not write byte %#x\n", data); + return 0; + } + + while (gscps2_readb_status(ps2port->addr) & GSC_STAT_RBNE) + /* wait */; + + spin_lock_irqsave(&ps2port->lock, flags); + writeb(data, addr+GSC_XMTDATA); + spin_unlock_irqrestore(&ps2port->lock, flags); + + /* this is ugly, but due to timing of the port it seems to be necessary. */ + mdelay(6); + + /* make sure any received data is returned as fast as possible */ + /* this is important e.g. when we set the LEDs on the keyboard */ + gscps2_interrupt(0, NULL); + + return 1; +} + + +/* + * gscps2_enable() - enables or disables the port + */ + +static void gscps2_enable(struct gscps2port *ps2port, int enable) +{ + unsigned long flags; + u8 data; + + /* now enable/disable the port */ + spin_lock_irqsave(&ps2port->lock, flags); + gscps2_flush(ps2port); + data = gscps2_readb_control(ps2port->addr); + if (enable) + data |= GSC_CTRL_ENBL; + else + data &= ~GSC_CTRL_ENBL; + gscps2_writeb_control(data, ps2port->addr); + spin_unlock_irqrestore(&ps2port->lock, flags); + wait_TBE(ps2port->addr); + gscps2_flush(ps2port); +} + +/* + * gscps2_reset() - resets the PS/2 port + */ + +static void gscps2_reset(struct gscps2port *ps2port) +{ + char *addr = ps2port->addr; + unsigned long flags; + + /* reset the interface */ + spin_lock_irqsave(&ps2port->lock, flags); + gscps2_flush(ps2port); + writeb(0xff, addr+GSC_RESET); + gscps2_flush(ps2port); + spin_unlock_irqrestore(&ps2port->lock, flags); +} + +static LIST_HEAD(ps2port_list); + +/** + * gscps2_interrupt() - Interruption service routine + * + * This function reads received PS/2 bytes and processes them on + * all interfaces. + * The problematic part here is, that the keyboard and mouse PS/2 port + * share the same interrupt and it's not possible to send data if any + * one of them holds input data. To solve this problem we try to receive + * the data as fast as possible and handle the reporting to the upper layer + * later. + */ + +static irqreturn_t gscps2_interrupt(int irq, void *dev) +{ + struct gscps2port *ps2port; + + list_for_each_entry(ps2port, &ps2port_list, node) { + + unsigned long flags; + spin_lock_irqsave(&ps2port->lock, flags); + + while ( (ps2port->buffer[ps2port->append].str = + gscps2_readb_status(ps2port->addr)) & GSC_STAT_RBNE ) { + ps2port->buffer[ps2port->append].data = + gscps2_readb_input(ps2port->addr); + ps2port->append = ((ps2port->append+1) & BUFFER_SIZE); + } + + spin_unlock_irqrestore(&ps2port->lock, flags); + + } /* list_for_each_entry */ + + /* all data was read from the ports - now report the data to upper layer */ + + list_for_each_entry(ps2port, &ps2port_list, node) { + + while (ps2port->act != ps2port->append) { + + unsigned int rxflags; + u8 data, status; + + /* Did new data arrived while we read existing data ? + If yes, exit now and let the new irq handler start over again */ + if (gscps2_readb_status(ps2port->addr) & GSC_STAT_CMPINTR) + return IRQ_HANDLED; + + status = ps2port->buffer[ps2port->act].str; + data = ps2port->buffer[ps2port->act].data; + + ps2port->act = ((ps2port->act+1) & BUFFER_SIZE); + rxflags = ((status & GSC_STAT_TERR) ? SERIO_TIMEOUT : 0 ) | + ((status & GSC_STAT_PERR) ? SERIO_PARITY : 0 ); + + serio_interrupt(ps2port->port, data, rxflags); + + } /* while() */ + + } /* list_for_each_entry */ + + return IRQ_HANDLED; +} + + +/* + * gscps2_write() - send a byte out through the aux interface. + */ + +static int gscps2_write(struct serio *port, unsigned char data) +{ + struct gscps2port *ps2port = port->port_data; + + if (!gscps2_writeb_output(ps2port, data)) { + printk(KERN_DEBUG PFX "sending byte %#x failed.\n", data); + return -1; + } + return 0; +} + +/* + * gscps2_open() is called when a port is opened by the higher layer. + * It resets and enables the port. + */ + +static int gscps2_open(struct serio *port) +{ + struct gscps2port *ps2port = port->port_data; + + gscps2_reset(ps2port); + + /* enable it */ + gscps2_enable(ps2port, ENABLE); + + gscps2_interrupt(0, NULL); + + return 0; +} + +/* + * gscps2_close() disables the port + */ + +static void gscps2_close(struct serio *port) +{ + struct gscps2port *ps2port = port->port_data; + gscps2_enable(ps2port, DISABLE); +} + +/** + * gscps2_probe() - Probes PS2 devices + * @return: success/error report + */ + +static int gscps2_probe(struct parisc_device *dev) +{ + struct gscps2port *ps2port; + struct serio *serio; + unsigned long hpa = dev->hpa.start; + int ret; + + if (!dev->irq) + return -ENODEV; + + /* Offset for DINO PS/2. Works with LASI even */ + if (dev->id.sversion == 0x96) + hpa += GSC_DINO_OFFSET; + + ps2port = kzalloc(sizeof(struct gscps2port), GFP_KERNEL); + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!ps2port || !serio) { + ret = -ENOMEM; + goto fail_nomem; + } + + dev_set_drvdata(&dev->dev, ps2port); + + ps2port->port = serio; + ps2port->padev = dev; + ps2port->addr = ioremap_nocache(hpa, GSC_STATUS + 4); + spin_lock_init(&ps2port->lock); + + gscps2_reset(ps2port); + ps2port->id = readb(ps2port->addr + GSC_ID) & 0x0f; + + snprintf(serio->name, sizeof(serio->name), "gsc-ps2-%s", + (ps2port->id == GSC_ID_KEYBOARD) ? "keyboard" : "mouse"); + strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys)); + serio->id.type = SERIO_8042; + serio->write = gscps2_write; + serio->open = gscps2_open; + serio->close = gscps2_close; + serio->port_data = ps2port; + serio->dev.parent = &dev->dev; + + ret = -EBUSY; + if (request_irq(dev->irq, gscps2_interrupt, IRQF_SHARED, ps2port->port->name, ps2port)) + goto fail_miserably; + + if (ps2port->id != GSC_ID_KEYBOARD && ps2port->id != GSC_ID_MOUSE) { + printk(KERN_WARNING PFX "Unsupported PS/2 port at 0x%08lx (id=%d) ignored\n", + hpa, ps2port->id); + ret = -ENODEV; + goto fail; + } + +#if 0 + if (!request_mem_region(hpa, GSC_STATUS + 4, ps2port->port.name)) + goto fail; +#endif + + printk(KERN_INFO "serio: %s port at 0x%p irq %d @ %s\n", + ps2port->port->name, + ps2port->addr, + ps2port->padev->irq, + ps2port->port->phys); + + serio_register_port(ps2port->port); + + list_add_tail(&ps2port->node, &ps2port_list); + + return 0; + +fail: + free_irq(dev->irq, ps2port); + +fail_miserably: + iounmap(ps2port->addr); + release_mem_region(dev->hpa.start, GSC_STATUS + 4); + +fail_nomem: + kfree(ps2port); + kfree(serio); + return ret; +} + +/** + * gscps2_remove() - Removes PS2 devices + * @return: success/error report + */ + +static int gscps2_remove(struct parisc_device *dev) +{ + struct gscps2port *ps2port = dev_get_drvdata(&dev->dev); + + serio_unregister_port(ps2port->port); + free_irq(dev->irq, ps2port); + gscps2_flush(ps2port); + list_del(&ps2port->node); + iounmap(ps2port->addr); +#if 0 + release_mem_region(dev->hpa, GSC_STATUS + 4); +#endif + dev_set_drvdata(&dev->dev, NULL); + kfree(ps2port); + return 0; +} + + +static struct parisc_device_id gscps2_device_tbl[] = { + { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00084 }, /* LASI PS/2 */ +#ifdef DINO_TESTED + { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x00096 }, /* DINO PS/2 */ +#endif + { 0, } /* 0 terminated list */ +}; + +static struct parisc_driver parisc_ps2_driver = { + .name = "gsc_ps2", + .id_table = gscps2_device_tbl, + .probe = gscps2_probe, + .remove = gscps2_remove, +}; + +static int __init gscps2_init(void) +{ + register_parisc_driver(&parisc_ps2_driver); + return 0; +} + +static void __exit gscps2_exit(void) +{ + unregister_parisc_driver(&parisc_ps2_driver); +} + + +module_init(gscps2_init); +module_exit(gscps2_exit); + diff --git a/drivers/input/serio/hil_mlc.c b/drivers/input/serio/hil_mlc.c new file mode 100644 index 00000000..65605e4e --- /dev/null +++ b/drivers/input/serio/hil_mlc.c @@ -0,0 +1,1016 @@ +/* + * HIL MLC state machine and serio interface driver + * + * Copyright (c) 2001 Brian S. Julin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * + * References: + * HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A + * + * + * Driver theory of operation: + * + * Some access methods and an ISR is defined by the sub-driver + * (e.g. hp_sdc_mlc.c). These methods are expected to provide a + * few bits of logic in addition to raw access to the HIL MLC, + * specifically, the ISR, which is entirely registered by the + * sub-driver and invoked directly, must check for record + * termination or packet match, at which point a semaphore must + * be cleared and then the hil_mlcs_tasklet must be scheduled. + * + * The hil_mlcs_tasklet processes the state machine for all MLCs + * each time it runs, checking each MLC's progress at the current + * node in the state machine, and moving the MLC to subsequent nodes + * in the state machine when appropriate. It will reschedule + * itself if output is pending. (This rescheduling should be replaced + * at some point with a sub-driver-specific mechanism.) + * + * A timer task prods the tasklet once per second to prevent + * hangups when attached devices do not return expected data + * and to initiate probes of the loop for new devices. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Brian S. Julin "); +MODULE_DESCRIPTION("HIL MLC serio"); +MODULE_LICENSE("Dual BSD/GPL"); + +EXPORT_SYMBOL(hil_mlc_register); +EXPORT_SYMBOL(hil_mlc_unregister); + +#define PREFIX "HIL MLC: " + +static LIST_HEAD(hil_mlcs); +static DEFINE_RWLOCK(hil_mlcs_lock); +static struct timer_list hil_mlcs_kicker; +static int hil_mlcs_probe; + +static void hil_mlcs_process(unsigned long unused); +static DECLARE_TASKLET_DISABLED(hil_mlcs_tasklet, hil_mlcs_process, 0); + + +/* #define HIL_MLC_DEBUG */ + +/********************** Device info/instance management **********************/ + +static void hil_mlc_clear_di_map(hil_mlc *mlc, int val) +{ + int j; + + for (j = val; j < 7 ; j++) + mlc->di_map[j] = -1; +} + +static void hil_mlc_clear_di_scratch(hil_mlc *mlc) +{ + memset(&mlc->di_scratch, 0, sizeof(mlc->di_scratch)); +} + +static void hil_mlc_copy_di_scratch(hil_mlc *mlc, int idx) +{ + memcpy(&mlc->di[idx], &mlc->di_scratch, sizeof(mlc->di_scratch)); +} + +static int hil_mlc_match_di_scratch(hil_mlc *mlc) +{ + int idx; + + for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) { + int j, found = 0; + + /* In-use slots are not eligible. */ + for (j = 0; j < 7 ; j++) + if (mlc->di_map[j] == idx) + found++; + + if (found) + continue; + + if (!memcmp(mlc->di + idx, &mlc->di_scratch, + sizeof(mlc->di_scratch))) + break; + } + return idx >= HIL_MLC_DEVMEM ? -1 : idx; +} + +static int hil_mlc_find_free_di(hil_mlc *mlc) +{ + int idx; + + /* TODO: Pick all-zero slots first, failing that, + * randomize the slot picked among those eligible. + */ + for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) { + int j, found = 0; + + for (j = 0; j < 7 ; j++) + if (mlc->di_map[j] == idx) + found++; + + if (!found) + break; + } + + return idx; /* Note: It is guaranteed at least one above will match */ +} + +static inline void hil_mlc_clean_serio_map(hil_mlc *mlc) +{ + int idx; + + for (idx = 0; idx < HIL_MLC_DEVMEM; idx++) { + int j, found = 0; + + for (j = 0; j < 7 ; j++) + if (mlc->di_map[j] == idx) + found++; + + if (!found) + mlc->serio_map[idx].di_revmap = -1; + } +} + +static void hil_mlc_send_polls(hil_mlc *mlc) +{ + int did, i, cnt; + struct serio *serio; + struct serio_driver *drv; + + i = cnt = 0; + did = (mlc->ipacket[0] & HIL_PKT_ADDR_MASK) >> 8; + serio = did ? mlc->serio[mlc->di_map[did - 1]] : NULL; + drv = (serio != NULL) ? serio->drv : NULL; + + while (mlc->icount < 15 - i) { + hil_packet p; + + p = mlc->ipacket[i]; + if (did != (p & HIL_PKT_ADDR_MASK) >> 8) { + if (drv && drv->interrupt) { + drv->interrupt(serio, 0, 0); + drv->interrupt(serio, HIL_ERR_INT >> 16, 0); + drv->interrupt(serio, HIL_PKT_CMD >> 8, 0); + drv->interrupt(serio, HIL_CMD_POL + cnt, 0); + } + + did = (p & HIL_PKT_ADDR_MASK) >> 8; + serio = did ? mlc->serio[mlc->di_map[did-1]] : NULL; + drv = (serio != NULL) ? serio->drv : NULL; + cnt = 0; + } + + cnt++; + i++; + + if (drv && drv->interrupt) { + drv->interrupt(serio, (p >> 24), 0); + drv->interrupt(serio, (p >> 16) & 0xff, 0); + drv->interrupt(serio, (p >> 8) & ~HIL_PKT_ADDR_MASK, 0); + drv->interrupt(serio, p & 0xff, 0); + } + } +} + +/*************************** State engine *********************************/ + +#define HILSEN_SCHED 0x000100 /* Schedule the tasklet */ +#define HILSEN_BREAK 0x000200 /* Wait until next pass */ +#define HILSEN_UP 0x000400 /* relative node#, decrement */ +#define HILSEN_DOWN 0x000800 /* relative node#, increment */ +#define HILSEN_FOLLOW 0x001000 /* use retval as next node# */ + +#define HILSEN_MASK 0x0000ff +#define HILSEN_START 0 +#define HILSEN_RESTART 1 +#define HILSEN_DHR 9 +#define HILSEN_DHR2 10 +#define HILSEN_IFC 14 +#define HILSEN_HEAL0 16 +#define HILSEN_HEAL 18 +#define HILSEN_ACF 21 +#define HILSEN_ACF2 22 +#define HILSEN_DISC0 25 +#define HILSEN_DISC 27 +#define HILSEN_MATCH 40 +#define HILSEN_OPERATE 41 +#define HILSEN_PROBE 44 +#define HILSEN_DSR 52 +#define HILSEN_REPOLL 55 +#define HILSEN_IFCACF 58 +#define HILSEN_END 60 + +#define HILSEN_NEXT (HILSEN_DOWN | 1) +#define HILSEN_SAME (HILSEN_DOWN | 0) +#define HILSEN_LAST (HILSEN_UP | 1) + +#define HILSEN_DOZE (HILSEN_SAME | HILSEN_SCHED | HILSEN_BREAK) +#define HILSEN_SLEEP (HILSEN_SAME | HILSEN_BREAK) + +static int hilse_match(hil_mlc *mlc, int unused) +{ + int rc; + + rc = hil_mlc_match_di_scratch(mlc); + if (rc == -1) { + rc = hil_mlc_find_free_di(mlc); + if (rc == -1) + goto err; + +#ifdef HIL_MLC_DEBUG + printk(KERN_DEBUG PREFIX "new in slot %i\n", rc); +#endif + hil_mlc_copy_di_scratch(mlc, rc); + mlc->di_map[mlc->ddi] = rc; + mlc->serio_map[rc].di_revmap = mlc->ddi; + hil_mlc_clean_serio_map(mlc); + serio_rescan(mlc->serio[rc]); + return -1; + } + + mlc->di_map[mlc->ddi] = rc; +#ifdef HIL_MLC_DEBUG + printk(KERN_DEBUG PREFIX "same in slot %i\n", rc); +#endif + mlc->serio_map[rc].di_revmap = mlc->ddi; + hil_mlc_clean_serio_map(mlc); + return 0; + + err: + printk(KERN_ERR PREFIX "Residual device slots exhausted, close some serios!\n"); + return 1; +} + +/* An LCV used to prevent runaway loops, forces 5 second sleep when reset. */ +static int hilse_init_lcv(hil_mlc *mlc, int unused) +{ + struct timeval tv; + + do_gettimeofday(&tv); + + if (mlc->lcv && (tv.tv_sec - mlc->lcv_tv.tv_sec) < 5) + return -1; + + mlc->lcv_tv = tv; + mlc->lcv = 0; + + return 0; +} + +static int hilse_inc_lcv(hil_mlc *mlc, int lim) +{ + return mlc->lcv++ >= lim ? -1 : 0; +} + +#if 0 +static int hilse_set_lcv(hil_mlc *mlc, int val) +{ + mlc->lcv = val; + + return 0; +} +#endif + +/* Management of the discovered device index (zero based, -1 means no devs) */ +static int hilse_set_ddi(hil_mlc *mlc, int val) +{ + mlc->ddi = val; + hil_mlc_clear_di_map(mlc, val + 1); + + return 0; +} + +static int hilse_dec_ddi(hil_mlc *mlc, int unused) +{ + mlc->ddi--; + if (mlc->ddi <= -1) { + mlc->ddi = -1; + hil_mlc_clear_di_map(mlc, 0); + return -1; + } + hil_mlc_clear_di_map(mlc, mlc->ddi + 1); + + return 0; +} + +static int hilse_inc_ddi(hil_mlc *mlc, int unused) +{ + BUG_ON(mlc->ddi >= 6); + mlc->ddi++; + + return 0; +} + +static int hilse_take_idd(hil_mlc *mlc, int unused) +{ + int i; + + /* Help the state engine: + * Is this a real IDD response or just an echo? + * + * Real IDD response does not start with a command. + */ + if (mlc->ipacket[0] & HIL_PKT_CMD) + goto bail; + + /* Should have the command echoed further down. */ + for (i = 1; i < 16; i++) { + if (((mlc->ipacket[i] & HIL_PKT_ADDR_MASK) == + (mlc->ipacket[0] & HIL_PKT_ADDR_MASK)) && + (mlc->ipacket[i] & HIL_PKT_CMD) && + ((mlc->ipacket[i] & HIL_PKT_DATA_MASK) == HIL_CMD_IDD)) + break; + } + if (i > 15) + goto bail; + + /* And the rest of the packets should still be clear. */ + while (++i < 16) + if (mlc->ipacket[i]) + break; + + if (i < 16) + goto bail; + + for (i = 0; i < 16; i++) + mlc->di_scratch.idd[i] = + mlc->ipacket[i] & HIL_PKT_DATA_MASK; + + /* Next step is to see if RSC supported */ + if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_RSC) + return HILSEN_NEXT; + + if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) + return HILSEN_DOWN | 4; + + return 0; + + bail: + mlc->ddi--; + + return -1; /* This should send us off to ACF */ +} + +static int hilse_take_rsc(hil_mlc *mlc, int unused) +{ + int i; + + for (i = 0; i < 16; i++) + mlc->di_scratch.rsc[i] = + mlc->ipacket[i] & HIL_PKT_DATA_MASK; + + /* Next step is to see if EXD supported (IDD has already been read) */ + if (mlc->di_scratch.idd[1] & HIL_IDD_HEADER_EXD) + return HILSEN_NEXT; + + return 0; +} + +static int hilse_take_exd(hil_mlc *mlc, int unused) +{ + int i; + + for (i = 0; i < 16; i++) + mlc->di_scratch.exd[i] = + mlc->ipacket[i] & HIL_PKT_DATA_MASK; + + /* Next step is to see if RNM supported. */ + if (mlc->di_scratch.exd[0] & HIL_EXD_HEADER_RNM) + return HILSEN_NEXT; + + return 0; +} + +static int hilse_take_rnm(hil_mlc *mlc, int unused) +{ + int i; + + for (i = 0; i < 16; i++) + mlc->di_scratch.rnm[i] = + mlc->ipacket[i] & HIL_PKT_DATA_MASK; + + printk(KERN_INFO PREFIX "Device name gotten: %16s\n", + mlc->di_scratch.rnm); + + return 0; +} + +static int hilse_operate(hil_mlc *mlc, int repoll) +{ + + if (mlc->opercnt == 0) + hil_mlcs_probe = 0; + mlc->opercnt = 1; + + hil_mlc_send_polls(mlc); + + if (!hil_mlcs_probe) + return 0; + hil_mlcs_probe = 0; + mlc->opercnt = 0; + return 1; +} + +#define FUNC(funct, funct_arg, zero_rc, neg_rc, pos_rc) \ +{ HILSE_FUNC, { .func = funct }, funct_arg, zero_rc, neg_rc, pos_rc }, +#define OUT(pack) \ +{ HILSE_OUT, { .packet = pack }, 0, HILSEN_NEXT, HILSEN_DOZE, 0 }, +#define CTS \ +{ HILSE_CTS, { .packet = 0 }, 0, HILSEN_NEXT | HILSEN_SCHED | HILSEN_BREAK, HILSEN_DOZE, 0 }, +#define EXPECT(comp, to, got, got_wrong, timed_out) \ +{ HILSE_EXPECT, { .packet = comp }, to, got, got_wrong, timed_out }, +#define EXPECT_LAST(comp, to, got, got_wrong, timed_out) \ +{ HILSE_EXPECT_LAST, { .packet = comp }, to, got, got_wrong, timed_out }, +#define EXPECT_DISC(comp, to, got, got_wrong, timed_out) \ +{ HILSE_EXPECT_DISC, { .packet = comp }, to, got, got_wrong, timed_out }, +#define IN(to, got, got_error, timed_out) \ +{ HILSE_IN, { .packet = 0 }, to, got, got_error, timed_out }, +#define OUT_DISC(pack) \ +{ HILSE_OUT_DISC, { .packet = pack }, 0, 0, 0, 0 }, +#define OUT_LAST(pack) \ +{ HILSE_OUT_LAST, { .packet = pack }, 0, 0, 0, 0 }, + +static const struct hilse_node hil_mlc_se[HILSEN_END] = { + + /* 0 HILSEN_START */ + FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) + + /* 1 HILSEN_RESTART */ + FUNC(hilse_inc_lcv, 10, HILSEN_NEXT, HILSEN_START, 0) + OUT(HIL_CTRL_ONLY) /* Disable APE */ + CTS + +#define TEST_PACKET(x) \ +(HIL_PKT_CMD | (x << HIL_PKT_ADDR_SHIFT) | x << 4 | x) + + OUT(HIL_DO_ALTER_CTRL | HIL_CTRL_TEST | TEST_PACKET(0x5)) + EXPECT(HIL_ERR_INT | TEST_PACKET(0x5), + 2000, HILSEN_NEXT, HILSEN_RESTART, HILSEN_RESTART) + OUT(HIL_DO_ALTER_CTRL | HIL_CTRL_TEST | TEST_PACKET(0xa)) + EXPECT(HIL_ERR_INT | TEST_PACKET(0xa), + 2000, HILSEN_NEXT, HILSEN_RESTART, HILSEN_RESTART) + OUT(HIL_CTRL_ONLY | 0) /* Disable test mode */ + + /* 9 HILSEN_DHR */ + FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_SLEEP, 0) + + /* 10 HILSEN_DHR2 */ + FUNC(hilse_inc_lcv, 10, HILSEN_NEXT, HILSEN_START, 0) + FUNC(hilse_set_ddi, -1, HILSEN_NEXT, 0, 0) + OUT(HIL_PKT_CMD | HIL_CMD_DHR) + IN(300000, HILSEN_DHR2, HILSEN_DHR2, HILSEN_NEXT) + + /* 14 HILSEN_IFC */ + OUT(HIL_PKT_CMD | HIL_CMD_IFC) + EXPECT(HIL_PKT_CMD | HIL_CMD_IFC | HIL_ERR_INT, + 20000, HILSEN_DISC, HILSEN_DHR2, HILSEN_NEXT ) + + /* If devices are there, they weren't in PUP or other loopback mode. + * We're more concerned at this point with restoring operation + * to devices than discovering new ones, so we try to salvage + * the loop configuration by closing off the loop. + */ + + /* 16 HILSEN_HEAL0 */ + FUNC(hilse_dec_ddi, 0, HILSEN_NEXT, HILSEN_ACF, 0) + FUNC(hilse_inc_ddi, 0, HILSEN_NEXT, 0, 0) + + /* 18 HILSEN_HEAL */ + OUT_LAST(HIL_CMD_ELB) + EXPECT_LAST(HIL_CMD_ELB | HIL_ERR_INT, + 20000, HILSEN_REPOLL, HILSEN_DSR, HILSEN_NEXT) + FUNC(hilse_dec_ddi, 0, HILSEN_HEAL, HILSEN_NEXT, 0) + + /* 21 HILSEN_ACF */ + FUNC(hilse_init_lcv, 0, HILSEN_NEXT, HILSEN_DOZE, 0) + + /* 22 HILSEN_ACF2 */ + FUNC(hilse_inc_lcv, 10, HILSEN_NEXT, HILSEN_START, 0) + OUT(HIL_PKT_CMD | HIL_CMD_ACF | 1) + IN(20000, HILSEN_NEXT, HILSEN_DSR, HILSEN_NEXT) + + /* 25 HILSEN_DISC0 */ + OUT_DISC(HIL_PKT_CMD | HIL_CMD_ELB) + EXPECT_DISC(HIL_PKT_CMD | HIL_CMD_ELB | HIL_ERR_INT, + 20000, HILSEN_NEXT, HILSEN_DSR, HILSEN_DSR) + + /* Only enter here if response just received */ + /* 27 HILSEN_DISC */ + OUT_DISC(HIL_PKT_CMD | HIL_CMD_IDD) + EXPECT_DISC(HIL_PKT_CMD | HIL_CMD_IDD | HIL_ERR_INT, + 20000, HILSEN_NEXT, HILSEN_DSR, HILSEN_START) + FUNC(hilse_inc_ddi, 0, HILSEN_NEXT, HILSEN_START, 0) + FUNC(hilse_take_idd, 0, HILSEN_MATCH, HILSEN_IFCACF, HILSEN_FOLLOW) + OUT_LAST(HIL_PKT_CMD | HIL_CMD_RSC) + EXPECT_LAST(HIL_PKT_CMD | HIL_CMD_RSC | HIL_ERR_INT, + 30000, HILSEN_NEXT, HILSEN_DSR, HILSEN_DSR) + FUNC(hilse_take_rsc, 0, HILSEN_MATCH, 0, HILSEN_FOLLOW) + OUT_LAST(HIL_PKT_CMD | HIL_CMD_EXD) + EXPECT_LAST(HIL_PKT_CMD | HIL_CMD_EXD | HIL_ERR_INT, + 30000, HILSEN_NEXT, HILSEN_DSR, HILSEN_DSR) + FUNC(hilse_take_exd, 0, HILSEN_MATCH, 0, HILSEN_FOLLOW) + OUT_LAST(HIL_PKT_CMD | HIL_CMD_RNM) + EXPECT_LAST(HIL_PKT_CMD | HIL_CMD_RNM | HIL_ERR_INT, + 30000, HILSEN_NEXT, HILSEN_DSR, HILSEN_DSR) + FUNC(hilse_take_rnm, 0, HILSEN_MATCH, 0, 0) + + /* 40 HILSEN_MATCH */ + FUNC(hilse_match, 0, HILSEN_NEXT, HILSEN_NEXT, /* TODO */ 0) + + /* 41 HILSEN_OPERATE */ + OUT(HIL_PKT_CMD | HIL_CMD_POL) + EXPECT(HIL_PKT_CMD | HIL_CMD_POL | HIL_ERR_INT, + 20000, HILSEN_NEXT, HILSEN_DSR, HILSEN_NEXT) + FUNC(hilse_operate, 0, HILSEN_OPERATE, HILSEN_IFC, HILSEN_NEXT) + + /* 44 HILSEN_PROBE */ + OUT_LAST(HIL_PKT_CMD | HIL_CMD_EPT) + IN(10000, HILSEN_DISC, HILSEN_DSR, HILSEN_NEXT) + OUT_DISC(HIL_PKT_CMD | HIL_CMD_ELB) + IN(10000, HILSEN_DISC, HILSEN_DSR, HILSEN_NEXT) + OUT(HIL_PKT_CMD | HIL_CMD_ACF | 1) + IN(10000, HILSEN_DISC0, HILSEN_DSR, HILSEN_NEXT) + OUT_LAST(HIL_PKT_CMD | HIL_CMD_ELB) + IN(10000, HILSEN_OPERATE, HILSEN_DSR, HILSEN_DSR) + + /* 52 HILSEN_DSR */ + FUNC(hilse_set_ddi, -1, HILSEN_NEXT, 0, 0) + OUT(HIL_PKT_CMD | HIL_CMD_DSR) + IN(20000, HILSEN_DHR, HILSEN_DHR, HILSEN_IFC) + + /* 55 HILSEN_REPOLL */ + OUT(HIL_PKT_CMD | HIL_CMD_RPL) + EXPECT(HIL_PKT_CMD | HIL_CMD_RPL | HIL_ERR_INT, + 20000, HILSEN_NEXT, HILSEN_DSR, HILSEN_NEXT) + FUNC(hilse_operate, 1, HILSEN_OPERATE, HILSEN_IFC, HILSEN_PROBE) + + /* 58 HILSEN_IFCACF */ + OUT(HIL_PKT_CMD | HIL_CMD_IFC) + EXPECT(HIL_PKT_CMD | HIL_CMD_IFC | HIL_ERR_INT, + 20000, HILSEN_ACF2, HILSEN_DHR2, HILSEN_HEAL) + + /* 60 HILSEN_END */ +}; + +static inline void hilse_setup_input(hil_mlc *mlc, const struct hilse_node *node) +{ + + switch (node->act) { + case HILSE_EXPECT_DISC: + mlc->imatch = node->object.packet; + mlc->imatch |= ((mlc->ddi + 2) << HIL_PKT_ADDR_SHIFT); + break; + case HILSE_EXPECT_LAST: + mlc->imatch = node->object.packet; + mlc->imatch |= ((mlc->ddi + 1) << HIL_PKT_ADDR_SHIFT); + break; + case HILSE_EXPECT: + mlc->imatch = node->object.packet; + break; + case HILSE_IN: + mlc->imatch = 0; + break; + default: + BUG(); + } + mlc->istarted = 1; + mlc->intimeout = node->arg; + do_gettimeofday(&(mlc->instart)); + mlc->icount = 15; + memset(mlc->ipacket, 0, 16 * sizeof(hil_packet)); + BUG_ON(down_trylock(&mlc->isem)); +} + +#ifdef HIL_MLC_DEBUG +static int doze; +static int seidx; /* For debug */ +#endif + +static int hilse_donode(hil_mlc *mlc) +{ + const struct hilse_node *node; + int nextidx = 0; + int sched_long = 0; + unsigned long flags; + +#ifdef HIL_MLC_DEBUG + if (mlc->seidx && mlc->seidx != seidx && + mlc->seidx != 41 && mlc->seidx != 42 && mlc->seidx != 43) { + printk(KERN_DEBUG PREFIX "z%i \n {%i}", doze, mlc->seidx); + doze = 0; + } + + seidx = mlc->seidx; +#endif + node = hil_mlc_se + mlc->seidx; + + switch (node->act) { + int rc; + hil_packet pack; + + case HILSE_FUNC: + BUG_ON(node->object.func == NULL); + rc = node->object.func(mlc, node->arg); + nextidx = (rc > 0) ? node->ugly : + ((rc < 0) ? node->bad : node->good); + if (nextidx == HILSEN_FOLLOW) + nextidx = rc; + break; + + case HILSE_EXPECT_LAST: + case HILSE_EXPECT_DISC: + case HILSE_EXPECT: + case HILSE_IN: + /* Already set up from previous HILSE_OUT_* */ + write_lock_irqsave(&mlc->lock, flags); + rc = mlc->in(mlc, node->arg); + if (rc == 2) { + nextidx = HILSEN_DOZE; + sched_long = 1; + write_unlock_irqrestore(&mlc->lock, flags); + break; + } + if (rc == 1) + nextidx = node->ugly; + else if (rc == 0) + nextidx = node->good; + else + nextidx = node->bad; + mlc->istarted = 0; + write_unlock_irqrestore(&mlc->lock, flags); + break; + + case HILSE_OUT_LAST: + write_lock_irqsave(&mlc->lock, flags); + pack = node->object.packet; + pack |= ((mlc->ddi + 1) << HIL_PKT_ADDR_SHIFT); + goto out; + + case HILSE_OUT_DISC: + write_lock_irqsave(&mlc->lock, flags); + pack = node->object.packet; + pack |= ((mlc->ddi + 2) << HIL_PKT_ADDR_SHIFT); + goto out; + + case HILSE_OUT: + write_lock_irqsave(&mlc->lock, flags); + pack = node->object.packet; + out: + if (!mlc->istarted) { + /* Prepare to receive input */ + if ((node + 1)->act & HILSE_IN) + hilse_setup_input(mlc, node + 1); + } + + write_unlock_irqrestore(&mlc->lock, flags); + + if (down_trylock(&mlc->osem)) { + nextidx = HILSEN_DOZE; + break; + } + up(&mlc->osem); + + write_lock_irqsave(&mlc->lock, flags); + if (!mlc->ostarted) { + mlc->ostarted = 1; + mlc->opacket = pack; + mlc->out(mlc); + nextidx = HILSEN_DOZE; + write_unlock_irqrestore(&mlc->lock, flags); + break; + } + mlc->ostarted = 0; + do_gettimeofday(&(mlc->instart)); + write_unlock_irqrestore(&mlc->lock, flags); + nextidx = HILSEN_NEXT; + break; + + case HILSE_CTS: + write_lock_irqsave(&mlc->lock, flags); + nextidx = mlc->cts(mlc) ? node->bad : node->good; + write_unlock_irqrestore(&mlc->lock, flags); + break; + + default: + BUG(); + } + +#ifdef HIL_MLC_DEBUG + if (nextidx == HILSEN_DOZE) + doze++; +#endif + + while (nextidx & HILSEN_SCHED) { + struct timeval tv; + + if (!sched_long) + goto sched; + + do_gettimeofday(&tv); + tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec); + tv.tv_usec -= mlc->instart.tv_usec; + if (tv.tv_usec >= mlc->intimeout) goto sched; + tv.tv_usec = (mlc->intimeout - tv.tv_usec) * HZ / USEC_PER_SEC; + if (!tv.tv_usec) goto sched; + mod_timer(&hil_mlcs_kicker, jiffies + tv.tv_usec); + break; + sched: + tasklet_schedule(&hil_mlcs_tasklet); + break; + } + + if (nextidx & HILSEN_DOWN) + mlc->seidx += nextidx & HILSEN_MASK; + else if (nextidx & HILSEN_UP) + mlc->seidx -= nextidx & HILSEN_MASK; + else + mlc->seidx = nextidx & HILSEN_MASK; + + if (nextidx & HILSEN_BREAK) + return 1; + + return 0; +} + +/******************** tasklet context functions **************************/ +static void hil_mlcs_process(unsigned long unused) +{ + struct list_head *tmp; + + read_lock(&hil_mlcs_lock); + list_for_each(tmp, &hil_mlcs) { + struct hil_mlc *mlc = list_entry(tmp, hil_mlc, list); + while (hilse_donode(mlc) == 0) { +#ifdef HIL_MLC_DEBUG + if (mlc->seidx != 41 && + mlc->seidx != 42 && + mlc->seidx != 43) + printk(KERN_DEBUG PREFIX " + "); +#endif + } + } + read_unlock(&hil_mlcs_lock); +} + +/************************* Keepalive timer task *********************/ + +static void hil_mlcs_timer(unsigned long data) +{ + hil_mlcs_probe = 1; + tasklet_schedule(&hil_mlcs_tasklet); + /* Re-insert the periodic task. */ + if (!timer_pending(&hil_mlcs_kicker)) + mod_timer(&hil_mlcs_kicker, jiffies + HZ); +} + +/******************** user/kernel context functions **********************/ + +static int hil_mlc_serio_write(struct serio *serio, unsigned char c) +{ + struct hil_mlc_serio_map *map; + struct hil_mlc *mlc; + struct serio_driver *drv; + uint8_t *idx, *last; + + map = serio->port_data; + BUG_ON(map == NULL); + + mlc = map->mlc; + BUG_ON(mlc == NULL); + + mlc->serio_opacket[map->didx] |= + ((hil_packet)c) << (8 * (3 - mlc->serio_oidx[map->didx])); + + if (mlc->serio_oidx[map->didx] >= 3) { + /* for now only commands */ + if (!(mlc->serio_opacket[map->didx] & HIL_PKT_CMD)) + return -EIO; + switch (mlc->serio_opacket[map->didx] & HIL_PKT_DATA_MASK) { + case HIL_CMD_IDD: + idx = mlc->di[map->didx].idd; + goto emu; + case HIL_CMD_RSC: + idx = mlc->di[map->didx].rsc; + goto emu; + case HIL_CMD_EXD: + idx = mlc->di[map->didx].exd; + goto emu; + case HIL_CMD_RNM: + idx = mlc->di[map->didx].rnm; + goto emu; + default: + break; + } + mlc->serio_oidx[map->didx] = 0; + mlc->serio_opacket[map->didx] = 0; + } + + mlc->serio_oidx[map->didx]++; + return -EIO; + emu: + drv = serio->drv; + BUG_ON(drv == NULL); + + last = idx + 15; + while ((last != idx) && (*last == 0)) + last--; + + while (idx != last) { + drv->interrupt(serio, 0, 0); + drv->interrupt(serio, HIL_ERR_INT >> 16, 0); + drv->interrupt(serio, 0, 0); + drv->interrupt(serio, *idx, 0); + idx++; + } + drv->interrupt(serio, 0, 0); + drv->interrupt(serio, HIL_ERR_INT >> 16, 0); + drv->interrupt(serio, HIL_PKT_CMD >> 8, 0); + drv->interrupt(serio, *idx, 0); + + mlc->serio_oidx[map->didx] = 0; + mlc->serio_opacket[map->didx] = 0; + + return 0; +} + +static int hil_mlc_serio_open(struct serio *serio) +{ + struct hil_mlc_serio_map *map; + struct hil_mlc *mlc; + + if (serio_get_drvdata(serio) != NULL) + return -EBUSY; + + map = serio->port_data; + BUG_ON(map == NULL); + + mlc = map->mlc; + BUG_ON(mlc == NULL); + + return 0; +} + +static void hil_mlc_serio_close(struct serio *serio) +{ + struct hil_mlc_serio_map *map; + struct hil_mlc *mlc; + + map = serio->port_data; + BUG_ON(map == NULL); + + mlc = map->mlc; + BUG_ON(mlc == NULL); + + serio_set_drvdata(serio, NULL); + serio->drv = NULL; + /* TODO wake up interruptable */ +} + +static const struct serio_device_id hil_mlc_serio_id = { + .type = SERIO_HIL_MLC, + .proto = SERIO_HIL, + .extra = SERIO_ANY, + .id = SERIO_ANY, +}; + +int hil_mlc_register(hil_mlc *mlc) +{ + int i; + unsigned long flags; + + BUG_ON(mlc == NULL); + + mlc->istarted = 0; + mlc->ostarted = 0; + + rwlock_init(&mlc->lock); + sema_init(&mlc->osem, 1); + + sema_init(&mlc->isem, 1); + mlc->icount = -1; + mlc->imatch = 0; + + mlc->opercnt = 0; + + sema_init(&(mlc->csem), 0); + + hil_mlc_clear_di_scratch(mlc); + hil_mlc_clear_di_map(mlc, 0); + for (i = 0; i < HIL_MLC_DEVMEM; i++) { + struct serio *mlc_serio; + hil_mlc_copy_di_scratch(mlc, i); + mlc_serio = kzalloc(sizeof(*mlc_serio), GFP_KERNEL); + mlc->serio[i] = mlc_serio; + if (!mlc->serio[i]) { + for (; i >= 0; i--) + kfree(mlc->serio[i]); + return -ENOMEM; + } + snprintf(mlc_serio->name, sizeof(mlc_serio->name)-1, "HIL_SERIO%d", i); + snprintf(mlc_serio->phys, sizeof(mlc_serio->phys)-1, "HIL%d", i); + mlc_serio->id = hil_mlc_serio_id; + mlc_serio->id.id = i; /* HIL port no. */ + mlc_serio->write = hil_mlc_serio_write; + mlc_serio->open = hil_mlc_serio_open; + mlc_serio->close = hil_mlc_serio_close; + mlc_serio->port_data = &(mlc->serio_map[i]); + mlc->serio_map[i].mlc = mlc; + mlc->serio_map[i].didx = i; + mlc->serio_map[i].di_revmap = -1; + mlc->serio_opacket[i] = 0; + mlc->serio_oidx[i] = 0; + serio_register_port(mlc_serio); + } + + mlc->tasklet = &hil_mlcs_tasklet; + + write_lock_irqsave(&hil_mlcs_lock, flags); + list_add_tail(&mlc->list, &hil_mlcs); + mlc->seidx = HILSEN_START; + write_unlock_irqrestore(&hil_mlcs_lock, flags); + + tasklet_schedule(&hil_mlcs_tasklet); + return 0; +} + +int hil_mlc_unregister(hil_mlc *mlc) +{ + struct list_head *tmp; + unsigned long flags; + int i; + + BUG_ON(mlc == NULL); + + write_lock_irqsave(&hil_mlcs_lock, flags); + list_for_each(tmp, &hil_mlcs) + if (list_entry(tmp, hil_mlc, list) == mlc) + goto found; + + /* not found in list */ + write_unlock_irqrestore(&hil_mlcs_lock, flags); + tasklet_schedule(&hil_mlcs_tasklet); + return -ENODEV; + + found: + list_del(tmp); + write_unlock_irqrestore(&hil_mlcs_lock, flags); + + for (i = 0; i < HIL_MLC_DEVMEM; i++) { + serio_unregister_port(mlc->serio[i]); + mlc->serio[i] = NULL; + } + + tasklet_schedule(&hil_mlcs_tasklet); + return 0; +} + +/**************************** Module interface *************************/ + +static int __init hil_mlc_init(void) +{ + setup_timer(&hil_mlcs_kicker, &hil_mlcs_timer, 0); + mod_timer(&hil_mlcs_kicker, jiffies + HZ); + + tasklet_enable(&hil_mlcs_tasklet); + + return 0; +} + +static void __exit hil_mlc_exit(void) +{ + del_timer_sync(&hil_mlcs_kicker); + tasklet_kill(&hil_mlcs_tasklet); +} + +module_init(hil_mlc_init); +module_exit(hil_mlc_exit); diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c new file mode 100644 index 00000000..d7a7e54f --- /dev/null +++ b/drivers/input/serio/hp_sdc.c @@ -0,0 +1,1135 @@ +/* + * HP i8042-based System Device Controller driver. + * + * Copyright (c) 2001 Brian S. Julin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * + * References: + * System Device Controller Microprocessor Firmware Theory of Operation + * for Part Number 1820-4784 Revision B. Dwg No. A-1820-4784-2 + * Helge Deller's original hilkbd.c port for PA-RISC. + * + * + * Driver theory of operation: + * + * hp_sdc_put does all writing to the SDC. ISR can run on a different + * CPU than hp_sdc_put, but only one CPU runs hp_sdc_put at a time + * (it cannot really benefit from SMP anyway.) A tasket fit this perfectly. + * + * All data coming back from the SDC is sent via interrupt and can be read + * fully in the ISR, so there are no latency/throughput problems there. + * The problem is with output, due to the slow clock speed of the SDC + * compared to the CPU. This should not be too horrible most of the time, + * but if used with HIL devices that support the multibyte transfer command, + * keeping outbound throughput flowing at the 6500KBps that the HIL is + * capable of is more than can be done at HZ=100. + * + * Busy polling for IBF clear wastes CPU cycles and bus cycles. hp_sdc.ibf + * is set to 0 when the IBF flag in the status register has cleared. ISR + * may do this, and may also access the parts of queued transactions related + * to reading data back from the SDC, but otherwise will not touch the + * hp_sdc state. Whenever a register is written hp_sdc.ibf is set to 1. + * + * The i8042 write index and the values in the 4-byte input buffer + * starting at 0x70 are kept track of in hp_sdc.wi, and .r7[], respectively, + * to minimize the amount of IO needed to the SDC. However these values + * do not need to be locked since they are only ever accessed by hp_sdc_put. + * + * A timer task schedules the tasklet once per second just to make + * sure it doesn't freeze up and to allow for bad reads to time out. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Machine-specific abstraction */ + +#if defined(__hppa__) +# include +# define sdc_readb(p) gsc_readb(p) +# define sdc_writeb(v,p) gsc_writeb((v),(p)) +#elif defined(__mc68000__) +# include +# define sdc_readb(p) in_8(p) +# define sdc_writeb(v,p) out_8((p),(v)) +#else +# error "HIL is not supported on this platform" +#endif + +#define PREFIX "HP SDC: " + +MODULE_AUTHOR("Brian S. Julin "); +MODULE_DESCRIPTION("HP i8042-based SDC Driver"); +MODULE_LICENSE("Dual BSD/GPL"); + +EXPORT_SYMBOL(hp_sdc_request_timer_irq); +EXPORT_SYMBOL(hp_sdc_request_hil_irq); +EXPORT_SYMBOL(hp_sdc_request_cooked_irq); + +EXPORT_SYMBOL(hp_sdc_release_timer_irq); +EXPORT_SYMBOL(hp_sdc_release_hil_irq); +EXPORT_SYMBOL(hp_sdc_release_cooked_irq); + +EXPORT_SYMBOL(__hp_sdc_enqueue_transaction); +EXPORT_SYMBOL(hp_sdc_enqueue_transaction); +EXPORT_SYMBOL(hp_sdc_dequeue_transaction); + +static bool hp_sdc_disabled; +module_param_named(no_hpsdc, hp_sdc_disabled, bool, 0); +MODULE_PARM_DESC(no_hpsdc, "Do not enable HP SDC driver."); + +static hp_i8042_sdc hp_sdc; /* All driver state is kept in here. */ + +/*************** primitives for use in any context *********************/ +static inline uint8_t hp_sdc_status_in8(void) +{ + uint8_t status; + unsigned long flags; + + write_lock_irqsave(&hp_sdc.ibf_lock, flags); + status = sdc_readb(hp_sdc.status_io); + if (!(status & HP_SDC_STATUS_IBF)) + hp_sdc.ibf = 0; + write_unlock_irqrestore(&hp_sdc.ibf_lock, flags); + + return status; +} + +static inline uint8_t hp_sdc_data_in8(void) +{ + return sdc_readb(hp_sdc.data_io); +} + +static inline void hp_sdc_status_out8(uint8_t val) +{ + unsigned long flags; + + write_lock_irqsave(&hp_sdc.ibf_lock, flags); + hp_sdc.ibf = 1; + if ((val & 0xf0) == 0xe0) + hp_sdc.wi = 0xff; + sdc_writeb(val, hp_sdc.status_io); + write_unlock_irqrestore(&hp_sdc.ibf_lock, flags); +} + +static inline void hp_sdc_data_out8(uint8_t val) +{ + unsigned long flags; + + write_lock_irqsave(&hp_sdc.ibf_lock, flags); + hp_sdc.ibf = 1; + sdc_writeb(val, hp_sdc.data_io); + write_unlock_irqrestore(&hp_sdc.ibf_lock, flags); +} + +/* Care must be taken to only invoke hp_sdc_spin_ibf when + * absolutely needed, or in rarely invoked subroutines. + * Not only does it waste CPU cycles, it also wastes bus cycles. + */ +static inline void hp_sdc_spin_ibf(void) +{ + unsigned long flags; + rwlock_t *lock; + + lock = &hp_sdc.ibf_lock; + + read_lock_irqsave(lock, flags); + if (!hp_sdc.ibf) { + read_unlock_irqrestore(lock, flags); + return; + } + read_unlock(lock); + write_lock(lock); + while (sdc_readb(hp_sdc.status_io) & HP_SDC_STATUS_IBF) + { } + hp_sdc.ibf = 0; + write_unlock_irqrestore(lock, flags); +} + + +/************************ Interrupt context functions ************************/ +static void hp_sdc_take(int irq, void *dev_id, uint8_t status, uint8_t data) +{ + hp_sdc_transaction *curr; + + read_lock(&hp_sdc.rtq_lock); + if (hp_sdc.rcurr < 0) { + read_unlock(&hp_sdc.rtq_lock); + return; + } + curr = hp_sdc.tq[hp_sdc.rcurr]; + read_unlock(&hp_sdc.rtq_lock); + + curr->seq[curr->idx++] = status; + curr->seq[curr->idx++] = data; + hp_sdc.rqty -= 2; + do_gettimeofday(&hp_sdc.rtv); + + if (hp_sdc.rqty <= 0) { + /* All data has been gathered. */ + if (curr->seq[curr->actidx] & HP_SDC_ACT_SEMAPHORE) + if (curr->act.semaphore) + up(curr->act.semaphore); + + if (curr->seq[curr->actidx] & HP_SDC_ACT_CALLBACK) + if (curr->act.irqhook) + curr->act.irqhook(irq, dev_id, status, data); + + curr->actidx = curr->idx; + curr->idx++; + /* Return control of this transaction */ + write_lock(&hp_sdc.rtq_lock); + hp_sdc.rcurr = -1; + hp_sdc.rqty = 0; + write_unlock(&hp_sdc.rtq_lock); + tasklet_schedule(&hp_sdc.task); + } +} + +static irqreturn_t hp_sdc_isr(int irq, void *dev_id) +{ + uint8_t status, data; + + status = hp_sdc_status_in8(); + /* Read data unconditionally to advance i8042. */ + data = hp_sdc_data_in8(); + + /* For now we are ignoring these until we get the SDC to behave. */ + if (((status & 0xf1) == 0x51) && data == 0x82) + return IRQ_HANDLED; + + switch (status & HP_SDC_STATUS_IRQMASK) { + case 0: /* This case is not documented. */ + break; + + case HP_SDC_STATUS_USERTIMER: + case HP_SDC_STATUS_PERIODIC: + case HP_SDC_STATUS_TIMER: + read_lock(&hp_sdc.hook_lock); + if (hp_sdc.timer != NULL) + hp_sdc.timer(irq, dev_id, status, data); + read_unlock(&hp_sdc.hook_lock); + break; + + case HP_SDC_STATUS_REG: + hp_sdc_take(irq, dev_id, status, data); + break; + + case HP_SDC_STATUS_HILCMD: + case HP_SDC_STATUS_HILDATA: + read_lock(&hp_sdc.hook_lock); + if (hp_sdc.hil != NULL) + hp_sdc.hil(irq, dev_id, status, data); + read_unlock(&hp_sdc.hook_lock); + break; + + case HP_SDC_STATUS_PUP: + read_lock(&hp_sdc.hook_lock); + if (hp_sdc.pup != NULL) + hp_sdc.pup(irq, dev_id, status, data); + else + printk(KERN_INFO PREFIX "HP SDC reports successful PUP.\n"); + read_unlock(&hp_sdc.hook_lock); + break; + + default: + read_lock(&hp_sdc.hook_lock); + if (hp_sdc.cooked != NULL) + hp_sdc.cooked(irq, dev_id, status, data); + read_unlock(&hp_sdc.hook_lock); + break; + } + + return IRQ_HANDLED; +} + + +static irqreturn_t hp_sdc_nmisr(int irq, void *dev_id) +{ + int status; + + status = hp_sdc_status_in8(); + printk(KERN_WARNING PREFIX "NMI !\n"); + +#if 0 + if (status & HP_SDC_NMISTATUS_FHS) { + read_lock(&hp_sdc.hook_lock); + if (hp_sdc.timer != NULL) + hp_sdc.timer(irq, dev_id, status, 0); + read_unlock(&hp_sdc.hook_lock); + } else { + /* TODO: pass this on to the HIL handler, or do SAK here? */ + printk(KERN_WARNING PREFIX "HIL NMI\n"); + } +#endif + + return IRQ_HANDLED; +} + + +/***************** Kernel (tasklet) context functions ****************/ + +unsigned long hp_sdc_put(void); + +static void hp_sdc_tasklet(unsigned long foo) +{ + write_lock_irq(&hp_sdc.rtq_lock); + + if (hp_sdc.rcurr >= 0) { + struct timeval tv; + + do_gettimeofday(&tv); + if (tv.tv_sec > hp_sdc.rtv.tv_sec) + tv.tv_usec += USEC_PER_SEC; + + if (tv.tv_usec - hp_sdc.rtv.tv_usec > HP_SDC_MAX_REG_DELAY) { + hp_sdc_transaction *curr; + uint8_t tmp; + + curr = hp_sdc.tq[hp_sdc.rcurr]; + /* If this turns out to be a normal failure mode + * we'll need to figure out a way to communicate + * it back to the application. and be less verbose. + */ + printk(KERN_WARNING PREFIX "read timeout (%ius)!\n", + (int)(tv.tv_usec - hp_sdc.rtv.tv_usec)); + curr->idx += hp_sdc.rqty; + hp_sdc.rqty = 0; + tmp = curr->seq[curr->actidx]; + curr->seq[curr->actidx] |= HP_SDC_ACT_DEAD; + if (tmp & HP_SDC_ACT_SEMAPHORE) + if (curr->act.semaphore) + up(curr->act.semaphore); + + if (tmp & HP_SDC_ACT_CALLBACK) { + /* Note this means that irqhooks may be called + * in tasklet/bh context. + */ + if (curr->act.irqhook) + curr->act.irqhook(0, NULL, 0, 0); + } + + curr->actidx = curr->idx; + curr->idx++; + hp_sdc.rcurr = -1; + } + } + write_unlock_irq(&hp_sdc.rtq_lock); + hp_sdc_put(); +} + +unsigned long hp_sdc_put(void) +{ + hp_sdc_transaction *curr; + uint8_t act; + int idx, curridx; + + int limit = 0; + + write_lock(&hp_sdc.lock); + + /* If i8042 buffers are full, we cannot do anything that + requires output, so we skip to the administrativa. */ + if (hp_sdc.ibf) { + hp_sdc_status_in8(); + if (hp_sdc.ibf) + goto finish; + } + + anew: + /* See if we are in the middle of a sequence. */ + if (hp_sdc.wcurr < 0) + hp_sdc.wcurr = 0; + read_lock_irq(&hp_sdc.rtq_lock); + if (hp_sdc.rcurr == hp_sdc.wcurr) + hp_sdc.wcurr++; + read_unlock_irq(&hp_sdc.rtq_lock); + if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) + hp_sdc.wcurr = 0; + curridx = hp_sdc.wcurr; + + if (hp_sdc.tq[curridx] != NULL) + goto start; + + while (++curridx != hp_sdc.wcurr) { + if (curridx >= HP_SDC_QUEUE_LEN) { + curridx = -1; /* Wrap to top */ + continue; + } + read_lock_irq(&hp_sdc.rtq_lock); + if (hp_sdc.rcurr == curridx) { + read_unlock_irq(&hp_sdc.rtq_lock); + continue; + } + read_unlock_irq(&hp_sdc.rtq_lock); + if (hp_sdc.tq[curridx] != NULL) + break; /* Found one. */ + } + if (curridx == hp_sdc.wcurr) { /* There's nothing queued to do. */ + curridx = -1; + } + hp_sdc.wcurr = curridx; + + start: + + /* Check to see if the interrupt mask needs to be set. */ + if (hp_sdc.set_im) { + hp_sdc_status_out8(hp_sdc.im | HP_SDC_CMD_SET_IM); + hp_sdc.set_im = 0; + goto finish; + } + + if (hp_sdc.wcurr == -1) + goto done; + + curr = hp_sdc.tq[curridx]; + idx = curr->actidx; + + if (curr->actidx >= curr->endidx) { + hp_sdc.tq[curridx] = NULL; + /* Interleave outbound data between the transactions. */ + hp_sdc.wcurr++; + if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) + hp_sdc.wcurr = 0; + goto finish; + } + + act = curr->seq[idx]; + idx++; + + if (curr->idx >= curr->endidx) { + if (act & HP_SDC_ACT_DEALLOC) + kfree(curr); + hp_sdc.tq[curridx] = NULL; + /* Interleave outbound data between the transactions. */ + hp_sdc.wcurr++; + if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) + hp_sdc.wcurr = 0; + goto finish; + } + + while (act & HP_SDC_ACT_PRECMD) { + if (curr->idx != idx) { + idx++; + act &= ~HP_SDC_ACT_PRECMD; + break; + } + hp_sdc_status_out8(curr->seq[idx]); + curr->idx++; + /* act finished? */ + if ((act & HP_SDC_ACT_DURING) == HP_SDC_ACT_PRECMD) + goto actdone; + /* skip quantity field if data-out sequence follows. */ + if (act & HP_SDC_ACT_DATAOUT) + curr->idx++; + goto finish; + } + if (act & HP_SDC_ACT_DATAOUT) { + int qty; + + qty = curr->seq[idx]; + idx++; + if (curr->idx - idx < qty) { + hp_sdc_data_out8(curr->seq[curr->idx]); + curr->idx++; + /* act finished? */ + if (curr->idx - idx >= qty && + (act & HP_SDC_ACT_DURING) == HP_SDC_ACT_DATAOUT) + goto actdone; + goto finish; + } + idx += qty; + act &= ~HP_SDC_ACT_DATAOUT; + } else + while (act & HP_SDC_ACT_DATAREG) { + int mask; + uint8_t w7[4]; + + mask = curr->seq[idx]; + if (idx != curr->idx) { + idx++; + idx += !!(mask & 1); + idx += !!(mask & 2); + idx += !!(mask & 4); + idx += !!(mask & 8); + act &= ~HP_SDC_ACT_DATAREG; + break; + } + + w7[0] = (mask & 1) ? curr->seq[++idx] : hp_sdc.r7[0]; + w7[1] = (mask & 2) ? curr->seq[++idx] : hp_sdc.r7[1]; + w7[2] = (mask & 4) ? curr->seq[++idx] : hp_sdc.r7[2]; + w7[3] = (mask & 8) ? curr->seq[++idx] : hp_sdc.r7[3]; + + if (hp_sdc.wi > 0x73 || hp_sdc.wi < 0x70 || + w7[hp_sdc.wi - 0x70] == hp_sdc.r7[hp_sdc.wi - 0x70]) { + int i = 0; + + /* Need to point the write index register */ + while (i < 4 && w7[i] == hp_sdc.r7[i]) + i++; + + if (i < 4) { + hp_sdc_status_out8(HP_SDC_CMD_SET_D0 + i); + hp_sdc.wi = 0x70 + i; + goto finish; + } + + idx++; + if ((act & HP_SDC_ACT_DURING) == HP_SDC_ACT_DATAREG) + goto actdone; + + curr->idx = idx; + act &= ~HP_SDC_ACT_DATAREG; + break; + } + + hp_sdc_data_out8(w7[hp_sdc.wi - 0x70]); + hp_sdc.r7[hp_sdc.wi - 0x70] = w7[hp_sdc.wi - 0x70]; + hp_sdc.wi++; /* write index register autoincrements */ + { + int i = 0; + + while ((i < 4) && w7[i] == hp_sdc.r7[i]) + i++; + if (i >= 4) { + curr->idx = idx + 1; + if ((act & HP_SDC_ACT_DURING) == + HP_SDC_ACT_DATAREG) + goto actdone; + } + } + goto finish; + } + /* We don't go any further in the command if there is a pending read, + because we don't want interleaved results. */ + read_lock_irq(&hp_sdc.rtq_lock); + if (hp_sdc.rcurr >= 0) { + read_unlock_irq(&hp_sdc.rtq_lock); + goto finish; + } + read_unlock_irq(&hp_sdc.rtq_lock); + + + if (act & HP_SDC_ACT_POSTCMD) { + uint8_t postcmd; + + /* curr->idx should == idx at this point. */ + postcmd = curr->seq[idx]; + curr->idx++; + if (act & HP_SDC_ACT_DATAIN) { + + /* Start a new read */ + hp_sdc.rqty = curr->seq[curr->idx]; + do_gettimeofday(&hp_sdc.rtv); + curr->idx++; + /* Still need to lock here in case of spurious irq. */ + write_lock_irq(&hp_sdc.rtq_lock); + hp_sdc.rcurr = curridx; + write_unlock_irq(&hp_sdc.rtq_lock); + hp_sdc_status_out8(postcmd); + goto finish; + } + hp_sdc_status_out8(postcmd); + goto actdone; + } + + actdone: + if (act & HP_SDC_ACT_SEMAPHORE) + up(curr->act.semaphore); + else if (act & HP_SDC_ACT_CALLBACK) + curr->act.irqhook(0,NULL,0,0); + + if (curr->idx >= curr->endidx) { /* This transaction is over. */ + if (act & HP_SDC_ACT_DEALLOC) + kfree(curr); + hp_sdc.tq[curridx] = NULL; + } else { + curr->actidx = idx + 1; + curr->idx = idx + 2; + } + /* Interleave outbound data between the transactions. */ + hp_sdc.wcurr++; + if (hp_sdc.wcurr >= HP_SDC_QUEUE_LEN) + hp_sdc.wcurr = 0; + + finish: + /* If by some quirk IBF has cleared and our ISR has run to + see that that has happened, do it all again. */ + if (!hp_sdc.ibf && limit++ < 20) + goto anew; + + done: + if (hp_sdc.wcurr >= 0) + tasklet_schedule(&hp_sdc.task); + write_unlock(&hp_sdc.lock); + + return 0; +} + +/******* Functions called in either user or kernel context ****/ +int __hp_sdc_enqueue_transaction(hp_sdc_transaction *this) +{ + int i; + + if (this == NULL) { + BUG(); + return -EINVAL; + } + + /* Can't have same transaction on queue twice */ + for (i = 0; i < HP_SDC_QUEUE_LEN; i++) + if (hp_sdc.tq[i] == this) + goto fail; + + this->actidx = 0; + this->idx = 1; + + /* Search for empty slot */ + for (i = 0; i < HP_SDC_QUEUE_LEN; i++) + if (hp_sdc.tq[i] == NULL) { + hp_sdc.tq[i] = this; + tasklet_schedule(&hp_sdc.task); + return 0; + } + + printk(KERN_WARNING PREFIX "No free slot to add transaction.\n"); + return -EBUSY; + + fail: + printk(KERN_WARNING PREFIX "Transaction add failed: transaction already queued?\n"); + return -EINVAL; +} + +int hp_sdc_enqueue_transaction(hp_sdc_transaction *this) { + unsigned long flags; + int ret; + + write_lock_irqsave(&hp_sdc.lock, flags); + ret = __hp_sdc_enqueue_transaction(this); + write_unlock_irqrestore(&hp_sdc.lock,flags); + + return ret; +} + +int hp_sdc_dequeue_transaction(hp_sdc_transaction *this) +{ + unsigned long flags; + int i; + + write_lock_irqsave(&hp_sdc.lock, flags); + + /* TODO: don't remove it if it's not done. */ + + for (i = 0; i < HP_SDC_QUEUE_LEN; i++) + if (hp_sdc.tq[i] == this) + hp_sdc.tq[i] = NULL; + + write_unlock_irqrestore(&hp_sdc.lock, flags); + return 0; +} + + + +/********************** User context functions **************************/ +int hp_sdc_request_timer_irq(hp_sdc_irqhook *callback) +{ + if (callback == NULL || hp_sdc.dev == NULL) + return -EINVAL; + + write_lock_irq(&hp_sdc.hook_lock); + if (hp_sdc.timer != NULL) { + write_unlock_irq(&hp_sdc.hook_lock); + return -EBUSY; + } + + hp_sdc.timer = callback; + /* Enable interrupts from the timers */ + hp_sdc.im &= ~HP_SDC_IM_FH; + hp_sdc.im &= ~HP_SDC_IM_PT; + hp_sdc.im &= ~HP_SDC_IM_TIMERS; + hp_sdc.set_im = 1; + write_unlock_irq(&hp_sdc.hook_lock); + + tasklet_schedule(&hp_sdc.task); + + return 0; +} + +int hp_sdc_request_hil_irq(hp_sdc_irqhook *callback) +{ + if (callback == NULL || hp_sdc.dev == NULL) + return -EINVAL; + + write_lock_irq(&hp_sdc.hook_lock); + if (hp_sdc.hil != NULL) { + write_unlock_irq(&hp_sdc.hook_lock); + return -EBUSY; + } + + hp_sdc.hil = callback; + hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET); + hp_sdc.set_im = 1; + write_unlock_irq(&hp_sdc.hook_lock); + + tasklet_schedule(&hp_sdc.task); + + return 0; +} + +int hp_sdc_request_cooked_irq(hp_sdc_irqhook *callback) +{ + if (callback == NULL || hp_sdc.dev == NULL) + return -EINVAL; + + write_lock_irq(&hp_sdc.hook_lock); + if (hp_sdc.cooked != NULL) { + write_unlock_irq(&hp_sdc.hook_lock); + return -EBUSY; + } + + /* Enable interrupts from the HIL MLC */ + hp_sdc.cooked = callback; + hp_sdc.im &= ~(HP_SDC_IM_HIL | HP_SDC_IM_RESET); + hp_sdc.set_im = 1; + write_unlock_irq(&hp_sdc.hook_lock); + + tasklet_schedule(&hp_sdc.task); + + return 0; +} + +int hp_sdc_release_timer_irq(hp_sdc_irqhook *callback) +{ + write_lock_irq(&hp_sdc.hook_lock); + if ((callback != hp_sdc.timer) || + (hp_sdc.timer == NULL)) { + write_unlock_irq(&hp_sdc.hook_lock); + return -EINVAL; + } + + /* Disable interrupts from the timers */ + hp_sdc.timer = NULL; + hp_sdc.im |= HP_SDC_IM_TIMERS; + hp_sdc.im |= HP_SDC_IM_FH; + hp_sdc.im |= HP_SDC_IM_PT; + hp_sdc.set_im = 1; + write_unlock_irq(&hp_sdc.hook_lock); + tasklet_schedule(&hp_sdc.task); + + return 0; +} + +int hp_sdc_release_hil_irq(hp_sdc_irqhook *callback) +{ + write_lock_irq(&hp_sdc.hook_lock); + if ((callback != hp_sdc.hil) || + (hp_sdc.hil == NULL)) { + write_unlock_irq(&hp_sdc.hook_lock); + return -EINVAL; + } + + hp_sdc.hil = NULL; + /* Disable interrupts from HIL only if there is no cooked driver. */ + if(hp_sdc.cooked == NULL) { + hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET); + hp_sdc.set_im = 1; + } + write_unlock_irq(&hp_sdc.hook_lock); + tasklet_schedule(&hp_sdc.task); + + return 0; +} + +int hp_sdc_release_cooked_irq(hp_sdc_irqhook *callback) +{ + write_lock_irq(&hp_sdc.hook_lock); + if ((callback != hp_sdc.cooked) || + (hp_sdc.cooked == NULL)) { + write_unlock_irq(&hp_sdc.hook_lock); + return -EINVAL; + } + + hp_sdc.cooked = NULL; + /* Disable interrupts from HIL only if there is no raw HIL driver. */ + if(hp_sdc.hil == NULL) { + hp_sdc.im |= (HP_SDC_IM_HIL | HP_SDC_IM_RESET); + hp_sdc.set_im = 1; + } + write_unlock_irq(&hp_sdc.hook_lock); + tasklet_schedule(&hp_sdc.task); + + return 0; +} + +/************************* Keepalive timer task *********************/ + +static void hp_sdc_kicker(unsigned long data) +{ + tasklet_schedule(&hp_sdc.task); + /* Re-insert the periodic task. */ + mod_timer(&hp_sdc.kicker, jiffies + HZ); +} + +/************************** Module Initialization ***************************/ + +#if defined(__hppa__) + +static const struct parisc_device_id hp_sdc_tbl[] = { + { + .hw_type = HPHW_FIO, + .hversion_rev = HVERSION_REV_ANY_ID, + .hversion = HVERSION_ANY_ID, + .sversion = 0x73, + }, + { 0, } +}; + +MODULE_DEVICE_TABLE(parisc, hp_sdc_tbl); + +static int __init hp_sdc_init_hppa(struct parisc_device *d); +static struct delayed_work moduleloader_work; + +static struct parisc_driver hp_sdc_driver = { + .name = "hp_sdc", + .id_table = hp_sdc_tbl, + .probe = hp_sdc_init_hppa, +}; + +#endif /* __hppa__ */ + +static int __init hp_sdc_init(void) +{ + char *errstr; + hp_sdc_transaction t_sync; + uint8_t ts_sync[6]; + struct semaphore s_sync; + + rwlock_init(&hp_sdc.lock); + rwlock_init(&hp_sdc.ibf_lock); + rwlock_init(&hp_sdc.rtq_lock); + rwlock_init(&hp_sdc.hook_lock); + + hp_sdc.timer = NULL; + hp_sdc.hil = NULL; + hp_sdc.pup = NULL; + hp_sdc.cooked = NULL; + hp_sdc.im = HP_SDC_IM_MASK; /* Mask maskable irqs */ + hp_sdc.set_im = 1; + hp_sdc.wi = 0xff; + hp_sdc.r7[0] = 0xff; + hp_sdc.r7[1] = 0xff; + hp_sdc.r7[2] = 0xff; + hp_sdc.r7[3] = 0xff; + hp_sdc.ibf = 1; + + memset(&hp_sdc.tq, 0, sizeof(hp_sdc.tq)); + + hp_sdc.wcurr = -1; + hp_sdc.rcurr = -1; + hp_sdc.rqty = 0; + + hp_sdc.dev_err = -ENODEV; + + errstr = "IO not found for"; + if (!hp_sdc.base_io) + goto err0; + + errstr = "IRQ not found for"; + if (!hp_sdc.irq) + goto err0; + + hp_sdc.dev_err = -EBUSY; + +#if defined(__hppa__) + errstr = "IO not available for"; + if (request_region(hp_sdc.data_io, 2, hp_sdc_driver.name)) + goto err0; +#endif + + errstr = "IRQ not available for"; + if (request_irq(hp_sdc.irq, &hp_sdc_isr, IRQF_SHARED, + "HP SDC", &hp_sdc)) + goto err1; + + errstr = "NMI not available for"; + if (request_irq(hp_sdc.nmi, &hp_sdc_nmisr, IRQF_SHARED, + "HP SDC NMI", &hp_sdc)) + goto err2; + + printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", + (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); + + hp_sdc_status_in8(); + hp_sdc_data_in8(); + + tasklet_init(&hp_sdc.task, hp_sdc_tasklet, 0); + + /* Sync the output buffer registers, thus scheduling hp_sdc_tasklet. */ + t_sync.actidx = 0; + t_sync.idx = 1; + t_sync.endidx = 6; + t_sync.seq = ts_sync; + ts_sync[0] = HP_SDC_ACT_DATAREG | HP_SDC_ACT_SEMAPHORE; + ts_sync[1] = 0x0f; + ts_sync[2] = ts_sync[3] = ts_sync[4] = ts_sync[5] = 0; + t_sync.act.semaphore = &s_sync; + sema_init(&s_sync, 0); + hp_sdc_enqueue_transaction(&t_sync); + down(&s_sync); /* Wait for t_sync to complete */ + + /* Create the keepalive task */ + init_timer(&hp_sdc.kicker); + hp_sdc.kicker.expires = jiffies + HZ; + hp_sdc.kicker.function = &hp_sdc_kicker; + add_timer(&hp_sdc.kicker); + + hp_sdc.dev_err = 0; + return 0; + err2: + free_irq(hp_sdc.irq, &hp_sdc); + err1: + release_region(hp_sdc.data_io, 2); + err0: + printk(KERN_WARNING PREFIX ": %s SDC IO=0x%p IRQ=0x%x NMI=0x%x\n", + errstr, (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); + hp_sdc.dev = NULL; + + return hp_sdc.dev_err; +} + +#if defined(__hppa__) + +static void request_module_delayed(struct work_struct *work) +{ + request_module("hp_sdc_mlc"); +} + +static int __init hp_sdc_init_hppa(struct parisc_device *d) +{ + int ret; + + if (!d) + return 1; + if (hp_sdc.dev != NULL) + return 1; /* We only expect one SDC */ + + hp_sdc.dev = d; + hp_sdc.irq = d->irq; + hp_sdc.nmi = d->aux_irq; + hp_sdc.base_io = d->hpa.start; + hp_sdc.data_io = d->hpa.start + 0x800; + hp_sdc.status_io = d->hpa.start + 0x801; + + INIT_DELAYED_WORK(&moduleloader_work, request_module_delayed); + + ret = hp_sdc_init(); + /* after successful initialization give SDC some time to settle + * and then load the hp_sdc_mlc upper layer driver */ + if (!ret) + schedule_delayed_work(&moduleloader_work, + msecs_to_jiffies(2000)); + + return ret; +} + +#endif /* __hppa__ */ + +static void hp_sdc_exit(void) +{ + /* do nothing if we don't have a SDC */ + if (!hp_sdc.dev) + return; + + write_lock_irq(&hp_sdc.lock); + + /* Turn off all maskable "sub-function" irq's. */ + hp_sdc_spin_ibf(); + sdc_writeb(HP_SDC_CMD_SET_IM | HP_SDC_IM_MASK, hp_sdc.status_io); + + /* Wait until we know this has been processed by the i8042 */ + hp_sdc_spin_ibf(); + + free_irq(hp_sdc.nmi, &hp_sdc); + free_irq(hp_sdc.irq, &hp_sdc); + write_unlock_irq(&hp_sdc.lock); + + del_timer(&hp_sdc.kicker); + + tasklet_kill(&hp_sdc.task); + +#if defined(__hppa__) + cancel_delayed_work_sync(&moduleloader_work); + if (unregister_parisc_driver(&hp_sdc_driver)) + printk(KERN_WARNING PREFIX "Error unregistering HP SDC"); +#endif +} + +static int __init hp_sdc_register(void) +{ + hp_sdc_transaction tq_init; + uint8_t tq_init_seq[5]; + struct semaphore tq_init_sem; +#if defined(__mc68000__) + mm_segment_t fs; + unsigned char i; +#endif + + if (hp_sdc_disabled) { + printk(KERN_WARNING PREFIX "HP SDC driver disabled by no_hpsdc=1.\n"); + return -ENODEV; + } + + hp_sdc.dev = NULL; + hp_sdc.dev_err = 0; +#if defined(__hppa__) + if (register_parisc_driver(&hp_sdc_driver)) { + printk(KERN_WARNING PREFIX "Error registering SDC with system bus tree.\n"); + return -ENODEV; + } +#elif defined(__mc68000__) + if (!MACH_IS_HP300) + return -ENODEV; + + hp_sdc.irq = 1; + hp_sdc.nmi = 7; + hp_sdc.base_io = (unsigned long) 0xf0428000; + hp_sdc.data_io = (unsigned long) hp_sdc.base_io + 1; + hp_sdc.status_io = (unsigned long) hp_sdc.base_io + 3; + fs = get_fs(); + set_fs(KERNEL_DS); + if (!get_user(i, (unsigned char *)hp_sdc.data_io)) + hp_sdc.dev = (void *)1; + set_fs(fs); + hp_sdc.dev_err = hp_sdc_init(); +#endif + if (hp_sdc.dev == NULL) { + printk(KERN_WARNING PREFIX "No SDC found.\n"); + return hp_sdc.dev_err; + } + + sema_init(&tq_init_sem, 0); + + tq_init.actidx = 0; + tq_init.idx = 1; + tq_init.endidx = 5; + tq_init.seq = tq_init_seq; + tq_init.act.semaphore = &tq_init_sem; + + tq_init_seq[0] = + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN | HP_SDC_ACT_SEMAPHORE; + tq_init_seq[1] = HP_SDC_CMD_READ_KCC; + tq_init_seq[2] = 1; + tq_init_seq[3] = 0; + tq_init_seq[4] = 0; + + hp_sdc_enqueue_transaction(&tq_init); + + down(&tq_init_sem); + up(&tq_init_sem); + + if ((tq_init_seq[0] & HP_SDC_ACT_DEAD) == HP_SDC_ACT_DEAD) { + printk(KERN_WARNING PREFIX "Error reading config byte.\n"); + hp_sdc_exit(); + return -ENODEV; + } + hp_sdc.r11 = tq_init_seq[4]; + if (hp_sdc.r11 & HP_SDC_CFG_NEW) { + const char *str; + printk(KERN_INFO PREFIX "New style SDC\n"); + tq_init_seq[1] = HP_SDC_CMD_READ_XTD; + tq_init.actidx = 0; + tq_init.idx = 1; + down(&tq_init_sem); + hp_sdc_enqueue_transaction(&tq_init); + down(&tq_init_sem); + up(&tq_init_sem); + if ((tq_init_seq[0] & HP_SDC_ACT_DEAD) == HP_SDC_ACT_DEAD) { + printk(KERN_WARNING PREFIX "Error reading extended config byte.\n"); + return -ENODEV; + } + hp_sdc.r7e = tq_init_seq[4]; + HP_SDC_XTD_REV_STRINGS(hp_sdc.r7e & HP_SDC_XTD_REV, str) + printk(KERN_INFO PREFIX "Revision: %s\n", str); + if (hp_sdc.r7e & HP_SDC_XTD_BEEPER) + printk(KERN_INFO PREFIX "TI SN76494 beeper present\n"); + if (hp_sdc.r7e & HP_SDC_XTD_BBRTC) + printk(KERN_INFO PREFIX "OKI MSM-58321 BBRTC present\n"); + printk(KERN_INFO PREFIX "Spunking the self test register to force PUP " + "on next firmware reset.\n"); + tq_init_seq[0] = HP_SDC_ACT_PRECMD | + HP_SDC_ACT_DATAOUT | HP_SDC_ACT_SEMAPHORE; + tq_init_seq[1] = HP_SDC_CMD_SET_STR; + tq_init_seq[2] = 1; + tq_init_seq[3] = 0; + tq_init.actidx = 0; + tq_init.idx = 1; + tq_init.endidx = 4; + down(&tq_init_sem); + hp_sdc_enqueue_transaction(&tq_init); + down(&tq_init_sem); + up(&tq_init_sem); + } else + printk(KERN_INFO PREFIX "Old style SDC (1820-%s).\n", + (hp_sdc.r11 & HP_SDC_CFG_REV) ? "3300" : "2564/3087"); + + return 0; +} + +module_init(hp_sdc_register); +module_exit(hp_sdc_exit); + +/* Timing notes: These measurements taken on my 64MHz 7100-LC (715/64) + * cycles cycles-adj time + * between two consecutive mfctl(16)'s: 4 n/a 63ns + * hp_sdc_spin_ibf when idle: 119 115 1.7us + * gsc_writeb status register: 83 79 1.2us + * IBF to clear after sending SET_IM: 6204 6006 93us + * IBF to clear after sending LOAD_RT: 4467 4352 68us + * IBF to clear after sending two LOAD_RTs: 18974 18859 295us + * READ_T1, read status/data, IRQ, call handler: 35564 n/a 556us + * cmd to ~IBF READ_T1 2nd time right after: 5158403 n/a 81ms + * between IRQ received and ~IBF for above: 2578877 n/a 40ms + * + * Performance stats after a run of this module configuring HIL and + * receiving a few mouse events: + * + * status in8 282508 cycles 7128 calls + * status out8 8404 cycles 341 calls + * data out8 1734 cycles 78 calls + * isr 174324 cycles 617 calls (includes take) + * take 1241 cycles 2 calls + * put 1411504 cycles 6937 calls + * task 1655209 cycles 6937 calls (includes put) + * + */ diff --git a/drivers/input/serio/hp_sdc_mlc.c b/drivers/input/serio/hp_sdc_mlc.c new file mode 100644 index 00000000..d50f0678 --- /dev/null +++ b/drivers/input/serio/hp_sdc_mlc.c @@ -0,0 +1,358 @@ +/* + * Access to HP-HIL MLC through HP System Device Controller. + * + * Copyright (c) 2001 Brian S. Julin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions, and the following disclaimer, + * without modification. + * 2. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL"). + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * + * References: + * HP-HIL Technical Reference Manual. Hewlett Packard Product No. 45918A + * System Device Controller Microprocessor Firmware Theory of Operation + * for Part Number 1820-4784 Revision B. Dwg No. A-1820-4784-2 + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define PREFIX "HP SDC MLC: " + +static hil_mlc hp_sdc_mlc; + +MODULE_AUTHOR("Brian S. Julin "); +MODULE_DESCRIPTION("Glue for onboard HIL MLC in HP-PARISC machines"); +MODULE_LICENSE("Dual BSD/GPL"); + +static struct hp_sdc_mlc_priv_s { + int emtestmode; + hp_sdc_transaction trans; + u8 tseq[16]; + int got5x; +} hp_sdc_mlc_priv; + +/************************* Interrupt context ******************************/ +static void hp_sdc_mlc_isr (int irq, void *dev_id, + uint8_t status, uint8_t data) +{ + int idx; + hil_mlc *mlc = &hp_sdc_mlc; + + write_lock(&mlc->lock); + if (mlc->icount < 0) { + printk(KERN_WARNING PREFIX "HIL Overflow!\n"); + up(&mlc->isem); + goto out; + } + idx = 15 - mlc->icount; + if ((status & HP_SDC_STATUS_IRQMASK) == HP_SDC_STATUS_HILDATA) { + mlc->ipacket[idx] |= data | HIL_ERR_INT; + mlc->icount--; + if (hp_sdc_mlc_priv.got5x || !idx) + goto check; + if ((mlc->ipacket[idx - 1] & HIL_PKT_ADDR_MASK) != + (mlc->ipacket[idx] & HIL_PKT_ADDR_MASK)) { + mlc->ipacket[idx] &= ~HIL_PKT_ADDR_MASK; + mlc->ipacket[idx] |= (mlc->ipacket[idx - 1] + & HIL_PKT_ADDR_MASK); + } + goto check; + } + /* We know status is 5X */ + if (data & HP_SDC_HIL_ISERR) + goto err; + mlc->ipacket[idx] = + (data & HP_SDC_HIL_R1MASK) << HIL_PKT_ADDR_SHIFT; + hp_sdc_mlc_priv.got5x = 1; + goto out; + + check: + hp_sdc_mlc_priv.got5x = 0; + if (mlc->imatch == 0) + goto done; + if ((mlc->imatch == (HIL_ERR_INT | HIL_PKT_CMD | HIL_CMD_POL)) + && (mlc->ipacket[idx] == (mlc->imatch | idx))) + goto done; + if (mlc->ipacket[idx] == mlc->imatch) + goto done; + goto out; + + err: + printk(KERN_DEBUG PREFIX "err code %x\n", data); + + switch (data) { + case HP_SDC_HIL_RC_DONE: + printk(KERN_WARNING PREFIX "Bastard SDC reconfigured loop!\n"); + break; + + case HP_SDC_HIL_ERR: + mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_PERR | + HIL_ERR_FERR | HIL_ERR_FOF; + break; + + case HP_SDC_HIL_TO: + mlc->ipacket[idx] |= HIL_ERR_INT | HIL_ERR_LERR; + break; + + case HP_SDC_HIL_RC: + printk(KERN_WARNING PREFIX "Bastard SDC decided to reconfigure loop!\n"); + break; + + default: + printk(KERN_WARNING PREFIX "Unknown HIL Error status (%x)!\n", data); + break; + } + + /* No more data will be coming due to an error. */ + done: + tasklet_schedule(mlc->tasklet); + up(&mlc->isem); + out: + write_unlock(&mlc->lock); +} + + +/******************** Tasklet or userspace context functions ****************/ + +static int hp_sdc_mlc_in(hil_mlc *mlc, suseconds_t timeout) +{ + struct hp_sdc_mlc_priv_s *priv; + int rc = 2; + + priv = mlc->priv; + + /* Try to down the semaphore */ + if (down_trylock(&mlc->isem)) { + struct timeval tv; + if (priv->emtestmode) { + mlc->ipacket[0] = + HIL_ERR_INT | (mlc->opacket & + (HIL_PKT_CMD | + HIL_PKT_ADDR_MASK | + HIL_PKT_DATA_MASK)); + mlc->icount = 14; + /* printk(KERN_DEBUG PREFIX ">[%x]\n", mlc->ipacket[0]); */ + goto wasup; + } + do_gettimeofday(&tv); + tv.tv_usec += USEC_PER_SEC * (tv.tv_sec - mlc->instart.tv_sec); + if (tv.tv_usec - mlc->instart.tv_usec > mlc->intimeout) { + /* printk("!%i %i", + tv.tv_usec - mlc->instart.tv_usec, + mlc->intimeout); + */ + rc = 1; + up(&mlc->isem); + } + goto done; + } + wasup: + up(&mlc->isem); + rc = 0; + done: + return rc; +} + +static int hp_sdc_mlc_cts(hil_mlc *mlc) +{ + struct hp_sdc_mlc_priv_s *priv; + + priv = mlc->priv; + + /* Try to down the semaphores -- they should be up. */ + BUG_ON(down_trylock(&mlc->isem)); + BUG_ON(down_trylock(&mlc->osem)); + + up(&mlc->isem); + up(&mlc->osem); + + if (down_trylock(&mlc->csem)) { + if (priv->trans.act.semaphore != &mlc->csem) + goto poll; + else + goto busy; + } + + if (!(priv->tseq[4] & HP_SDC_USE_LOOP)) + goto done; + + poll: + priv->trans.act.semaphore = &mlc->csem; + priv->trans.actidx = 0; + priv->trans.idx = 1; + priv->trans.endidx = 5; + priv->tseq[0] = + HP_SDC_ACT_POSTCMD | HP_SDC_ACT_DATAIN | HP_SDC_ACT_SEMAPHORE; + priv->tseq[1] = HP_SDC_CMD_READ_USE; + priv->tseq[2] = 1; + priv->tseq[3] = 0; + priv->tseq[4] = 0; + __hp_sdc_enqueue_transaction(&priv->trans); + busy: + return 1; + done: + priv->trans.act.semaphore = &mlc->osem; + up(&mlc->csem); + return 0; +} + +static void hp_sdc_mlc_out(hil_mlc *mlc) +{ + struct hp_sdc_mlc_priv_s *priv; + + priv = mlc->priv; + + /* Try to down the semaphore -- it should be up. */ + BUG_ON(down_trylock(&mlc->osem)); + + if (mlc->opacket & HIL_DO_ALTER_CTRL) + goto do_control; + + do_data: + if (priv->emtestmode) { + up(&mlc->osem); + return; + } + /* Shouldn't be sending commands when loop may be busy */ + BUG_ON(down_trylock(&mlc->csem)); + up(&mlc->csem); + + priv->trans.actidx = 0; + priv->trans.idx = 1; + priv->trans.act.semaphore = &mlc->osem; + priv->trans.endidx = 6; + priv->tseq[0] = + HP_SDC_ACT_DATAREG | HP_SDC_ACT_POSTCMD | HP_SDC_ACT_SEMAPHORE; + priv->tseq[1] = 0x7; + priv->tseq[2] = + (mlc->opacket & + (HIL_PKT_ADDR_MASK | HIL_PKT_CMD)) + >> HIL_PKT_ADDR_SHIFT; + priv->tseq[3] = + (mlc->opacket & HIL_PKT_DATA_MASK) + >> HIL_PKT_DATA_SHIFT; + priv->tseq[4] = 0; /* No timeout */ + if (priv->tseq[3] == HIL_CMD_DHR) + priv->tseq[4] = 1; + priv->tseq[5] = HP_SDC_CMD_DO_HIL; + goto enqueue; + + do_control: + priv->emtestmode = mlc->opacket & HIL_CTRL_TEST; + + /* we cannot emulate this, it should not be used. */ + BUG_ON((mlc->opacket & (HIL_CTRL_APE | HIL_CTRL_IPF)) == HIL_CTRL_APE); + + if ((mlc->opacket & HIL_CTRL_ONLY) == HIL_CTRL_ONLY) + goto control_only; + + /* Should not send command/data after engaging APE */ + BUG_ON(mlc->opacket & HIL_CTRL_APE); + + /* Disengaging APE this way would not be valid either since + * the loop must be allowed to idle. + * + * So, it works out that we really never actually send control + * and data when using SDC, we just send the data. + */ + goto do_data; + + control_only: + priv->trans.actidx = 0; + priv->trans.idx = 1; + priv->trans.act.semaphore = &mlc->osem; + priv->trans.endidx = 4; + priv->tseq[0] = + HP_SDC_ACT_PRECMD | HP_SDC_ACT_DATAOUT | HP_SDC_ACT_SEMAPHORE; + priv->tseq[1] = HP_SDC_CMD_SET_LPC; + priv->tseq[2] = 1; + /* priv->tseq[3] = (mlc->ddc + 1) | HP_SDC_LPS_ACSUCC; */ + priv->tseq[3] = 0; + if (mlc->opacket & HIL_CTRL_APE) { + priv->tseq[3] |= HP_SDC_LPC_APE_IPF; + BUG_ON(down_trylock(&mlc->csem)); + } + enqueue: + hp_sdc_enqueue_transaction(&priv->trans); +} + +static int __init hp_sdc_mlc_init(void) +{ + hil_mlc *mlc = &hp_sdc_mlc; + int err; + +#ifdef __mc68000__ + if (!MACH_IS_HP300) + return -ENODEV; +#endif + + printk(KERN_INFO PREFIX "Registering the System Domain Controller's HIL MLC.\n"); + + hp_sdc_mlc_priv.emtestmode = 0; + hp_sdc_mlc_priv.trans.seq = hp_sdc_mlc_priv.tseq; + hp_sdc_mlc_priv.trans.act.semaphore = &mlc->osem; + hp_sdc_mlc_priv.got5x = 0; + + mlc->cts = &hp_sdc_mlc_cts; + mlc->in = &hp_sdc_mlc_in; + mlc->out = &hp_sdc_mlc_out; + mlc->priv = &hp_sdc_mlc_priv; + + err = hil_mlc_register(mlc); + if (err) { + printk(KERN_WARNING PREFIX "Failed to register MLC structure with hil_mlc\n"); + return err; + } + + if (hp_sdc_request_hil_irq(&hp_sdc_mlc_isr)) { + printk(KERN_WARNING PREFIX "Request for raw HIL ISR hook denied\n"); + if (hil_mlc_unregister(mlc)) + printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n" + "This is bad. Could cause an oops.\n"); + return -EBUSY; + } + + return 0; +} + +static void __exit hp_sdc_mlc_exit(void) +{ + hil_mlc *mlc = &hp_sdc_mlc; + + if (hp_sdc_release_hil_irq(&hp_sdc_mlc_isr)) + printk(KERN_ERR PREFIX "Failed to release the raw HIL ISR hook.\n" + "This is bad. Could cause an oops.\n"); + + if (hil_mlc_unregister(mlc)) + printk(KERN_ERR PREFIX "Failed to unregister MLC structure with hil_mlc.\n" + "This is bad. Could cause an oops.\n"); +} + +module_init(hp_sdc_mlc_init); +module_exit(hp_sdc_mlc_exit); diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h new file mode 100644 index 00000000..a5eed2ad --- /dev/null +++ b/drivers/input/serio/i8042-io.h @@ -0,0 +1,95 @@ +#ifndef _I8042_IO_H +#define _I8042_IO_H + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * Names. + */ + +#define I8042_KBD_PHYS_DESC "isa0060/serio0" +#define I8042_AUX_PHYS_DESC "isa0060/serio1" +#define I8042_MUX_PHYS_DESC "isa0060/serio%d" + +/* + * IRQs. + */ + +#ifdef __alpha__ +# define I8042_KBD_IRQ 1 +# define I8042_AUX_IRQ (RTC_PORT(0) == 0x170 ? 9 : 12) /* Jensen is special */ +#elif defined(__arm__) +/* defined in include/asm-arm/arch-xxx/irqs.h */ +#include +#elif defined(CONFIG_SH_CAYMAN) +#include +#elif defined(CONFIG_PPC) +extern int of_i8042_kbd_irq; +extern int of_i8042_aux_irq; +# define I8042_KBD_IRQ of_i8042_kbd_irq +# define I8042_AUX_IRQ of_i8042_aux_irq +#else +# define I8042_KBD_IRQ 1 +# define I8042_AUX_IRQ 12 +#endif + + +/* + * Register numbers. + */ + +#define I8042_COMMAND_REG 0x64 +#define I8042_STATUS_REG 0x64 +#define I8042_DATA_REG 0x60 + +static inline int i8042_read_data(void) +{ + return inb(I8042_DATA_REG); +} + +static inline int i8042_read_status(void) +{ + return inb(I8042_STATUS_REG); +} + +static inline void i8042_write_data(int val) +{ + outb(val, I8042_DATA_REG); +} + +static inline void i8042_write_command(int val) +{ + outb(val, I8042_COMMAND_REG); +} + +static inline int i8042_platform_init(void) +{ +/* + * On some platforms touching the i8042 data register region can do really + * bad things. Because of this the region is always reserved on such boxes. + */ +#if defined(CONFIG_PPC) + if (check_legacy_ioport(I8042_DATA_REG)) + return -ENODEV; +#endif +#if !defined(__sh__) && !defined(__alpha__) + if (!request_region(I8042_DATA_REG, 16, "i8042")) + return -EBUSY; +#endif + + i8042_reset = 1; + return 0; +} + +static inline void i8042_platform_exit(void) +{ +#if !defined(__sh__) && !defined(__alpha__) + release_region(I8042_DATA_REG, 16); +#endif +} + +#endif /* _I8042_IO_H */ diff --git a/drivers/input/serio/i8042-ip22io.h b/drivers/input/serio/i8042-ip22io.h new file mode 100644 index 00000000..ee1ad27d --- /dev/null +++ b/drivers/input/serio/i8042-ip22io.h @@ -0,0 +1,76 @@ +#ifndef _I8042_IP22_H +#define _I8042_IP22_H + +#include +#include + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * Names. + */ + +#define I8042_KBD_PHYS_DESC "hpc3ps2/serio0" +#define I8042_AUX_PHYS_DESC "hpc3ps2/serio1" +#define I8042_MUX_PHYS_DESC "hpc3ps2/serio%d" + +/* + * IRQs. + */ + +#define I8042_KBD_IRQ SGI_KEYBD_IRQ +#define I8042_AUX_IRQ SGI_KEYBD_IRQ + +/* + * Register numbers. + */ + +#define I8042_COMMAND_REG ((unsigned long)&sgioc->kbdmouse.command) +#define I8042_STATUS_REG ((unsigned long)&sgioc->kbdmouse.command) +#define I8042_DATA_REG ((unsigned long)&sgioc->kbdmouse.data) + +static inline int i8042_read_data(void) +{ + return sgioc->kbdmouse.data; +} + +static inline int i8042_read_status(void) +{ + return sgioc->kbdmouse.command; +} + +static inline void i8042_write_data(int val) +{ + sgioc->kbdmouse.data = val; +} + +static inline void i8042_write_command(int val) +{ + sgioc->kbdmouse.command = val; +} + +static inline int i8042_platform_init(void) +{ +#if 0 + /* XXX sgi_kh is a virtual address */ + if (!request_mem_region(sgi_kh, sizeof(struct hpc_keyb), "i8042")) + return -EBUSY; +#endif + + i8042_reset = 1; + + return 0; +} + +static inline void i8042_platform_exit(void) +{ +#if 0 + release_mem_region(JAZZ_KEYBOARD_ADDRESS, sizeof(struct hpc_keyb)); +#endif +} + +#endif /* _I8042_IP22_H */ diff --git a/drivers/input/serio/i8042-jazzio.h b/drivers/input/serio/i8042-jazzio.h new file mode 100644 index 00000000..13fd7108 --- /dev/null +++ b/drivers/input/serio/i8042-jazzio.h @@ -0,0 +1,69 @@ +#ifndef _I8042_JAZZ_H +#define _I8042_JAZZ_H + +#include + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * Names. + */ + +#define I8042_KBD_PHYS_DESC "R4030/serio0" +#define I8042_AUX_PHYS_DESC "R4030/serio1" +#define I8042_MUX_PHYS_DESC "R4030/serio%d" + +/* + * IRQs. + */ + +#define I8042_KBD_IRQ JAZZ_KEYBOARD_IRQ +#define I8042_AUX_IRQ JAZZ_MOUSE_IRQ + +#define I8042_COMMAND_REG ((unsigned long)&jazz_kh->command) +#define I8042_STATUS_REG ((unsigned long)&jazz_kh->command) +#define I8042_DATA_REG ((unsigned long)&jazz_kh->data) + +static inline int i8042_read_data(void) +{ + return jazz_kh->data; +} + +static inline int i8042_read_status(void) +{ + return jazz_kh->command; +} + +static inline void i8042_write_data(int val) +{ + jazz_kh->data = val; +} + +static inline void i8042_write_command(int val) +{ + jazz_kh->command = val; +} + +static inline int i8042_platform_init(void) +{ +#if 0 + /* XXX JAZZ_KEYBOARD_ADDRESS is a virtual address */ + if (!request_mem_region(JAZZ_KEYBOARD_ADDRESS, 2, "i8042")) + return -EBUSY; +#endif + + return 0; +} + +static inline void i8042_platform_exit(void) +{ +#if 0 + release_mem_region(JAZZ_KEYBOARD_ADDRESS, 2); +#endif +} + +#endif /* _I8042_JAZZ_H */ diff --git a/drivers/input/serio/i8042-ppcio.h b/drivers/input/serio/i8042-ppcio.h new file mode 100644 index 00000000..f708c75d --- /dev/null +++ b/drivers/input/serio/i8042-ppcio.h @@ -0,0 +1,61 @@ +#ifndef _I8042_PPCIO_H +#define _I8042_PPCIO_H + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#if defined(CONFIG_WALNUT) + +#define I8042_KBD_IRQ 25 +#define I8042_AUX_IRQ 26 + +#define I8042_KBD_PHYS_DESC "walnutps2/serio0" +#define I8042_AUX_PHYS_DESC "walnutps2/serio1" +#define I8042_MUX_PHYS_DESC "walnutps2/serio%d" + +extern void *kb_cs; +extern void *kb_data; + +#define I8042_COMMAND_REG (*(int *)kb_cs) +#define I8042_DATA_REG (*(int *)kb_data) + +static inline int i8042_read_data(void) +{ + return readb(kb_data); +} + +static inline int i8042_read_status(void) +{ + return readb(kb_cs); +} + +static inline void i8042_write_data(int val) +{ + writeb(val, kb_data); +} + +static inline void i8042_write_command(int val) +{ + writeb(val, kb_cs); +} + +static inline int i8042_platform_init(void) +{ + i8042_reset = 1; + return 0; +} + +static inline void i8042_platform_exit(void) +{ +} + +#else + +#include "i8042-io.h" + +#endif + +#endif /* _I8042_PPCIO_H */ diff --git a/drivers/input/serio/i8042-snirm.h b/drivers/input/serio/i8042-snirm.h new file mode 100644 index 00000000..409a9341 --- /dev/null +++ b/drivers/input/serio/i8042-snirm.h @@ -0,0 +1,75 @@ +#ifndef _I8042_SNIRM_H +#define _I8042_SNIRM_H + +#include + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * Names. + */ + +#define I8042_KBD_PHYS_DESC "onboard/serio0" +#define I8042_AUX_PHYS_DESC "onboard/serio1" +#define I8042_MUX_PHYS_DESC "onboard/serio%d" + +/* + * IRQs. + */ +static int i8042_kbd_irq; +static int i8042_aux_irq; +#define I8042_KBD_IRQ i8042_kbd_irq +#define I8042_AUX_IRQ i8042_aux_irq + +static void __iomem *kbd_iobase; + +#define I8042_COMMAND_REG (kbd_iobase + 0x64UL) +#define I8042_DATA_REG (kbd_iobase + 0x60UL) + +static inline int i8042_read_data(void) +{ + return readb(kbd_iobase + 0x60UL); +} + +static inline int i8042_read_status(void) +{ + return readb(kbd_iobase + 0x64UL); +} + +static inline void i8042_write_data(int val) +{ + writeb(val, kbd_iobase + 0x60UL); +} + +static inline void i8042_write_command(int val) +{ + writeb(val, kbd_iobase + 0x64UL); +} +static inline int i8042_platform_init(void) +{ + /* RM200 is strange ... */ + if (sni_brd_type == SNI_BRD_RM200) { + kbd_iobase = ioremap(0x16000000, 4); + i8042_kbd_irq = 33; + i8042_aux_irq = 44; + } else { + kbd_iobase = ioremap(0x14000000, 4); + i8042_kbd_irq = 1; + i8042_aux_irq = 12; + } + if (!kbd_iobase) + return -ENOMEM; + + return 0; +} + +static inline void i8042_platform_exit(void) +{ + +} + +#endif /* _I8042_SNIRM_H */ diff --git a/drivers/input/serio/i8042-sparcio.h b/drivers/input/serio/i8042-sparcio.h new file mode 100644 index 00000000..d6aa4c67 --- /dev/null +++ b/drivers/input/serio/i8042-sparcio.h @@ -0,0 +1,157 @@ +#ifndef _I8042_SPARCIO_H +#define _I8042_SPARCIO_H + +#include + +#include +#include +#include + +static int i8042_kbd_irq = -1; +static int i8042_aux_irq = -1; +#define I8042_KBD_IRQ i8042_kbd_irq +#define I8042_AUX_IRQ i8042_aux_irq + +#define I8042_KBD_PHYS_DESC "sparcps2/serio0" +#define I8042_AUX_PHYS_DESC "sparcps2/serio1" +#define I8042_MUX_PHYS_DESC "sparcps2/serio%d" + +static void __iomem *kbd_iobase; +static struct resource *kbd_res; + +#define I8042_COMMAND_REG (kbd_iobase + 0x64UL) +#define I8042_DATA_REG (kbd_iobase + 0x60UL) + +static inline int i8042_read_data(void) +{ + return readb(kbd_iobase + 0x60UL); +} + +static inline int i8042_read_status(void) +{ + return readb(kbd_iobase + 0x64UL); +} + +static inline void i8042_write_data(int val) +{ + writeb(val, kbd_iobase + 0x60UL); +} + +static inline void i8042_write_command(int val) +{ + writeb(val, kbd_iobase + 0x64UL); +} + +#ifdef CONFIG_PCI + +#define OBP_PS2KBD_NAME1 "kb_ps2" +#define OBP_PS2KBD_NAME2 "keyboard" +#define OBP_PS2MS_NAME1 "kdmouse" +#define OBP_PS2MS_NAME2 "mouse" + +static int sparc_i8042_probe(struct platform_device *op) +{ + struct device_node *dp = op->dev.of_node; + + dp = dp->child; + while (dp) { + if (!strcmp(dp->name, OBP_PS2KBD_NAME1) || + !strcmp(dp->name, OBP_PS2KBD_NAME2)) { + struct platform_device *kbd = of_find_device_by_node(dp); + unsigned int irq = kbd->archdata.irqs[0]; + if (irq == 0xffffffff) + irq = op->archdata.irqs[0]; + i8042_kbd_irq = irq; + kbd_iobase = of_ioremap(&kbd->resource[0], + 0, 8, "kbd"); + kbd_res = &kbd->resource[0]; + } else if (!strcmp(dp->name, OBP_PS2MS_NAME1) || + !strcmp(dp->name, OBP_PS2MS_NAME2)) { + struct platform_device *ms = of_find_device_by_node(dp); + unsigned int irq = ms->archdata.irqs[0]; + if (irq == 0xffffffff) + irq = op->archdata.irqs[0]; + i8042_aux_irq = irq; + } + + dp = dp->sibling; + } + + return 0; +} + +static int sparc_i8042_remove(struct platform_device *op) +{ + of_iounmap(kbd_res, kbd_iobase, 8); + + return 0; +} + +static const struct of_device_id sparc_i8042_match[] = { + { + .name = "8042", + }, + {}, +}; +MODULE_DEVICE_TABLE(of, sparc_i8042_match); + +static struct platform_driver sparc_i8042_driver = { + .driver = { + .name = "i8042", + .owner = THIS_MODULE, + .of_match_table = sparc_i8042_match, + }, + .probe = sparc_i8042_probe, + .remove = sparc_i8042_remove, +}; + +static int __init i8042_platform_init(void) +{ + struct device_node *root = of_find_node_by_path("/"); + + if (!strcmp(root->name, "SUNW,JavaStation-1")) { + /* Hardcoded values for MrCoffee. */ + i8042_kbd_irq = i8042_aux_irq = 13 | 0x20; + kbd_iobase = ioremap(0x71300060, 8); + if (!kbd_iobase) + return -ENODEV; + } else { + int err = platform_driver_register(&sparc_i8042_driver); + if (err) + return err; + + if (i8042_kbd_irq == -1 || + i8042_aux_irq == -1) { + if (kbd_iobase) { + of_iounmap(kbd_res, kbd_iobase, 8); + kbd_iobase = (void __iomem *) NULL; + } + return -ENODEV; + } + } + + i8042_reset = 1; + + return 0; +} + +static inline void i8042_platform_exit(void) +{ + struct device_node *root = of_find_node_by_path("/"); + + if (strcmp(root->name, "SUNW,JavaStation-1")) + platform_driver_unregister(&sparc_i8042_driver); +} + +#else /* !CONFIG_PCI */ +static int __init i8042_platform_init(void) +{ + return -ENODEV; +} + +static inline void i8042_platform_exit(void) +{ +} +#endif /* !CONFIG_PCI */ + +#endif /* _I8042_SPARCIO_H */ diff --git a/drivers/input/serio/i8042-unicore32io.h b/drivers/input/serio/i8042-unicore32io.h new file mode 100644 index 00000000..73f5cc12 --- /dev/null +++ b/drivers/input/serio/i8042-unicore32io.h @@ -0,0 +1,73 @@ +/* + * Code specific to PKUnity SoC and UniCore ISA + * + * Maintained by GUAN Xue-tao + * Copyright (C) 2001-2011 Guan Xuetao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#ifndef _I8042_UNICORE32_H +#define _I8042_UNICORE32_H + +#include + +/* + * Names. + */ +#define I8042_KBD_PHYS_DESC "isa0060/serio0" +#define I8042_AUX_PHYS_DESC "isa0060/serio1" +#define I8042_MUX_PHYS_DESC "isa0060/serio%d" + +/* + * IRQs. + */ +#define I8042_KBD_IRQ IRQ_PS2_KBD +#define I8042_AUX_IRQ IRQ_PS2_AUX + +/* + * Register numbers. + */ +#define I8042_COMMAND_REG PS2_COMMAND +#define I8042_STATUS_REG PS2_STATUS +#define I8042_DATA_REG PS2_DATA + +#define I8042_REGION_START (resource_size_t)(PS2_DATA) +#define I8042_REGION_SIZE (resource_size_t)(16) + +static inline int i8042_read_data(void) +{ + return readb(I8042_DATA_REG); +} + +static inline int i8042_read_status(void) +{ + return readb(I8042_STATUS_REG); +} + +static inline void i8042_write_data(int val) +{ + writeb(val, I8042_DATA_REG); +} + +static inline void i8042_write_command(int val) +{ + writeb(val, I8042_COMMAND_REG); +} + +static inline int i8042_platform_init(void) +{ + if (!request_mem_region(I8042_REGION_START, I8042_REGION_SIZE, "i8042")) + return -EBUSY; + + i8042_reset = 1; + return 0; +} + +static inline void i8042_platform_exit(void) +{ + release_mem_region(I8042_REGION_START, I8042_REGION_SIZE); +} + +#endif /* _I8042_UNICORE32_H */ diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h new file mode 100644 index 00000000..ce715b1b --- /dev/null +++ b/drivers/input/serio/i8042-x86ia64io.h @@ -0,0 +1,1021 @@ +#ifndef _I8042_X86IA64IO_H +#define _I8042_X86IA64IO_H + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifdef CONFIG_X86 +#include +#endif + +/* + * Names. + */ + +#define I8042_KBD_PHYS_DESC "isa0060/serio0" +#define I8042_AUX_PHYS_DESC "isa0060/serio1" +#define I8042_MUX_PHYS_DESC "isa0060/serio%d" + +/* + * IRQs. + */ + +#if defined(__ia64__) +# define I8042_MAP_IRQ(x) isa_irq_to_vector((x)) +#else +# define I8042_MAP_IRQ(x) (x) +#endif + +#define I8042_KBD_IRQ i8042_kbd_irq +#define I8042_AUX_IRQ i8042_aux_irq + +static int i8042_kbd_irq; +static int i8042_aux_irq; + +/* + * Register numbers. + */ + +#define I8042_COMMAND_REG i8042_command_reg +#define I8042_STATUS_REG i8042_command_reg +#define I8042_DATA_REG i8042_data_reg + +static int i8042_command_reg = 0x64; +static int i8042_data_reg = 0x60; + + +static inline int i8042_read_data(void) +{ + return inb(I8042_DATA_REG); +} + +static inline int i8042_read_status(void) +{ + return inb(I8042_STATUS_REG); +} + +static inline void i8042_write_data(int val) +{ + outb(val, I8042_DATA_REG); +} + +static inline void i8042_write_command(int val) +{ + outb(val, I8042_COMMAND_REG); +} + +#ifdef CONFIG_X86 + +#include + +static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { + { + /* + * Arima-Rioworks HDAMB - + * AUX LOOP command does not raise AUX IRQ + */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "RIOWORKS"), + DMI_MATCH(DMI_BOARD_NAME, "HDAMB"), + DMI_MATCH(DMI_BOARD_VERSION, "Rev E"), + }, + }, + { + /* ASUS G1S */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."), + DMI_MATCH(DMI_BOARD_NAME, "G1S"), + DMI_MATCH(DMI_BOARD_VERSION, "1.0"), + }, + }, + { + /* ASUS P65UP5 - AUX LOOP command does not raise AUX IRQ */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), + DMI_MATCH(DMI_BOARD_NAME, "P/I-P65UP5"), + DMI_MATCH(DMI_BOARD_VERSION, "REV 2.X"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."), + DMI_MATCH(DMI_PRODUCT_NAME, "X750LN"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"), + DMI_MATCH(DMI_PRODUCT_VERSION, "8500"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Compaq"), + DMI_MATCH(DMI_PRODUCT_NAME , "ProLiant"), + DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"), + }, + }, + { + /* OQO Model 01 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "OQO"), + DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "00"), + }, + }, + { + /* ULI EV4873 - AUX LOOP does not work properly */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ULI"), + DMI_MATCH(DMI_PRODUCT_NAME, "EV4873"), + DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), + }, + }, + { + /* Microsoft Virtual Machine */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"), + DMI_MATCH(DMI_PRODUCT_VERSION, "VS2005R2"), + }, + }, + { + /* Medion MAM 2070 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Notebook"), + DMI_MATCH(DMI_PRODUCT_NAME, "MAM 2070"), + DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), + }, + }, + { + /* Blue FB5601 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "blue"), + DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"), + DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), + }, + }, + { + /* Gigabyte M912 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "M912"), + DMI_MATCH(DMI_PRODUCT_VERSION, "01"), + }, + }, + { + /* Gigabyte M1022M netbook */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co.,Ltd."), + DMI_MATCH(DMI_BOARD_NAME, "M1022E"), + DMI_MATCH(DMI_BOARD_VERSION, "1.02"), + }, + }, + { + /* Gigabyte Spring Peak - defines wrong chassis type */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"), + }, + }, + { + /* Gigabyte T1005 - defines wrong chassis type ("Other") */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "T1005"), + }, + }, + { + /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), + DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), + DMI_MATCH(DMI_PRODUCT_VERSION, "Rev 1"), + }, + }, + { } +}; + +/* + * Some Fujitsu notebooks are having trouble with touchpads if + * active multiplexing mode is activated. Luckily they don't have + * external PS/2 ports so we can safely disable it. + * ... apparently some Toshibas don't like MUX mode either and + * die horrible death on reboot. + */ +static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { + { + /* Fujitsu Lifebook P7010/P7010D */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "P7010"), + }, + }, + { + /* Fujitsu Lifebook P7010 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "0000000000"), + }, + }, + { + /* Fujitsu Lifebook P5020D */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook P Series"), + }, + }, + { + /* Fujitsu Lifebook S2000 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S Series"), + }, + }, + { + /* Fujitsu Lifebook S6230 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook S6230"), + }, + }, + { + /* Fujitsu T70H */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "FMVLT70H"), + }, + }, + { + /* Fujitsu-Siemens Lifebook T3010 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK T3010"), + }, + }, + { + /* Fujitsu-Siemens Lifebook E4010 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK E4010"), + }, + }, + { + /* Fujitsu-Siemens Amilo Pro 2010 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"), + }, + }, + { + /* Fujitsu-Siemens Amilo Pro 2030 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), + }, + }, + { + /* + * No data is coming from the touchscreen unless KBC + * is in legacy mode. + */ + /* Panasonic CF-29 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Matsushita"), + DMI_MATCH(DMI_PRODUCT_NAME, "CF-29"), + }, + }, + { + /* + * HP Pavilion DV4017EA - + * errors on MUX ports are reported without raising AUXDATA + * causing "spurious NAK" messages. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EA032EA#ABF)"), + }, + }, + { + /* + * HP Pavilion ZT1000 - + * like DV4017EA does not raise AUXERR for errors on MUX ports. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion Notebook PC"), + DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook ZT1000"), + }, + }, + { + /* + * HP Pavilion DV4270ca - + * like DV4017EA does not raise AUXERR for errors on MUX ports. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion dv4000 (EH476UA#ABL)"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P10"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "EQUIUM A110"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), + DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), + DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), + }, + }, + { + /* Sharp Actius MM20 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "SHARP"), + DMI_MATCH(DMI_PRODUCT_NAME, "PC-MM20 Series"), + }, + }, + { + /* Sony Vaio FS-115b */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FS115B"), + }, + }, + { + /* + * Sony Vaio FZ-240E - + * reset and GET ID commands issued via KBD port are + * sometimes being delivered to AUX3. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), + DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), + }, + }, + { + /* + * Most (all?) VAIOs do not have external PS/2 ports nor + * they implement active multiplexing properly, and + * MUX discovery usually messes up keyboard/touchpad. + */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), + DMI_MATCH(DMI_BOARD_NAME, "VAIO"), + }, + }, + { + /* Amoi M636/A737 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), + DMI_MATCH(DMI_PRODUCT_NAME, "M636/A737 platform"), + }, + }, + { + /* Lenovo 3000 n100 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "076804U"), + }, + }, + { + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"), + }, + }, + { + /* Gericom Bellagio */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), + DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), + }, + }, + { + /* IBM 2656 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "IBM"), + DMI_MATCH(DMI_PRODUCT_NAME, "2656"), + }, + }, + { + /* Dell XPS M1530 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), + }, + }, + { + /* Compal HEL80I */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), + DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), + }, + }, + { + /* Dell Vostro 1510 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro1510"), + }, + }, + { + /* Acer Aspire 5536 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5536"), + DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), + }, + }, + { + /* Dell Vostro V13 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), + }, + }, + { + /* Newer HP Pavilion dv4 models */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), + }, + }, + { + /* Avatar AVIU-145A6 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Intel"), + DMI_MATCH(DMI_PRODUCT_NAME, "IC4I"), + }, + }, + { } +}; + +static const struct dmi_system_id __initconst i8042_dmi_reset_table[] = { + { + /* MSI Wind U-100 */ + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "U-100"), + DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), + }, + }, + { + /* LG Electronics X110 */ + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "X110"), + DMI_MATCH(DMI_BOARD_VENDOR, "LG Electronics Inc."), + }, + }, + { + /* Acer Aspire One 150 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "AOA150"), + }, + }, + { + /* Advent 4211 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "DIXONSXP"), + DMI_MATCH(DMI_PRODUCT_NAME, "Advent 4211"), + }, + }, + { + /* Medion Akoya Mini E1210 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), + DMI_MATCH(DMI_PRODUCT_NAME, "E1210"), + }, + }, + { + /* Medion Akoya E1222 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), + DMI_MATCH(DMI_PRODUCT_NAME, "E122X"), + }, + }, + { + /* Mivvy M310 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "VIOOO"), + DMI_MATCH(DMI_PRODUCT_NAME, "N10"), + }, + }, + { + /* Dell Vostro 1320 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1320"), + }, + }, + { + /* Dell Vostro 1520 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1520"), + }, + }, + { + /* Dell Vostro 1720 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1720"), + }, + }, + { + /* Lenovo Ideapad U455 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_NAME, "20046"), + }, + }, + { } +}; + +#ifdef CONFIG_PNP +static const struct dmi_system_id __initconst i8042_dmi_nopnp_table[] = { + { + /* Intel MBO Desktop D845PESV */ + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "D845PESV"), + DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"), + }, + }, + { + /* MSI Wind U-100 */ + .matches = { + DMI_MATCH(DMI_BOARD_NAME, "U-100"), + DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), + }, + }, + { } +}; + +static const struct dmi_system_id __initconst i8042_dmi_laptop_table[] = { + { + .matches = { + DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */ + }, + }, + { + .matches = { + DMI_MATCH(DMI_CHASSIS_TYPE, "9"), /* Laptop */ + }, + }, + { + .matches = { + DMI_MATCH(DMI_CHASSIS_TYPE, "10"), /* Notebook */ + }, + }, + { + .matches = { + DMI_MATCH(DMI_CHASSIS_TYPE, "14"), /* Sub-Notebook */ + }, + }, + { } +}; +#endif + +static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { + { + /* Dell Vostro V13 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V13"), + }, + }, + { + /* Newer HP Pavilion dv4 models */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4 Notebook PC"), + }, + }, + { + /* Fujitsu A544 laptop */ + /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"), + }, + }, + { + /* Fujitsu AH544 laptop */ + /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), + }, + }, + { + /* Fujitsu U574 laptop */ + /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK U574"), + }, + }, + { } +}; + +/* + * Some Wistron based laptops need us to explicitly enable the 'Dritek + * keyboard extension' to make their extra keys start generating scancodes. + * Originally, this was just confined to older laptops, but a few Acer laptops + * have turned up in 2007 that also need this again. + */ +static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { + { + /* Acer Aspire 5100 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"), + }, + }, + { + /* Acer Aspire 5610 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"), + }, + }, + { + /* Acer Aspire 5630 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5630"), + }, + }, + { + /* Acer Aspire 5650 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5650"), + }, + }, + { + /* Acer Aspire 5680 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5680"), + }, + }, + { + /* Acer Aspire 5720 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5720"), + }, + }, + { + /* Acer Aspire 9110 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 9110"), + }, + }, + { + /* Acer TravelMate 660 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), + }, + }, + { + /* Acer TravelMate 2490 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), + }, + }, + { + /* Acer TravelMate 4280 */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), + }, + }, + { } +}; + +#endif /* CONFIG_X86 */ + +#ifdef CONFIG_PNP +#include + +static bool i8042_pnp_kbd_registered; +static unsigned int i8042_pnp_kbd_devices; +static bool i8042_pnp_aux_registered; +static unsigned int i8042_pnp_aux_devices; + +static int i8042_pnp_command_reg; +static int i8042_pnp_data_reg; +static int i8042_pnp_kbd_irq; +static int i8042_pnp_aux_irq; + +static char i8042_pnp_kbd_name[32]; +static char i8042_pnp_aux_name[32]; + +static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) +{ + if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) + i8042_pnp_data_reg = pnp_port_start(dev,0); + + if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) + i8042_pnp_command_reg = pnp_port_start(dev, 1); + + if (pnp_irq_valid(dev,0)) + i8042_pnp_kbd_irq = pnp_irq(dev, 0); + + strlcpy(i8042_pnp_kbd_name, did->id, sizeof(i8042_pnp_kbd_name)); + if (strlen(pnp_dev_name(dev))) { + strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); + strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); + } + + /* Keyboard ports are always supposed to be wakeup-enabled */ + device_set_wakeup_enable(&dev->dev, true); + + i8042_pnp_kbd_devices++; + return 0; +} + +static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id *did) +{ + if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) + i8042_pnp_data_reg = pnp_port_start(dev,0); + + if (pnp_port_valid(dev, 1) && pnp_port_len(dev, 1) == 1) + i8042_pnp_command_reg = pnp_port_start(dev, 1); + + if (pnp_irq_valid(dev, 0)) + i8042_pnp_aux_irq = pnp_irq(dev, 0); + + strlcpy(i8042_pnp_aux_name, did->id, sizeof(i8042_pnp_aux_name)); + if (strlen(pnp_dev_name(dev))) { + strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); + strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); + } + + i8042_pnp_aux_devices++; + return 0; +} + +static struct pnp_device_id pnp_kbd_devids[] = { + { .id = "PNP0300", .driver_data = 0 }, + { .id = "PNP0301", .driver_data = 0 }, + { .id = "PNP0302", .driver_data = 0 }, + { .id = "PNP0303", .driver_data = 0 }, + { .id = "PNP0304", .driver_data = 0 }, + { .id = "PNP0305", .driver_data = 0 }, + { .id = "PNP0306", .driver_data = 0 }, + { .id = "PNP0309", .driver_data = 0 }, + { .id = "PNP030a", .driver_data = 0 }, + { .id = "PNP030b", .driver_data = 0 }, + { .id = "PNP0320", .driver_data = 0 }, + { .id = "PNP0343", .driver_data = 0 }, + { .id = "PNP0344", .driver_data = 0 }, + { .id = "PNP0345", .driver_data = 0 }, + { .id = "CPQA0D7", .driver_data = 0 }, + { .id = "", }, +}; +MODULE_DEVICE_TABLE(pnp, pnp_kbd_devids); + +static struct pnp_driver i8042_pnp_kbd_driver = { + .name = "i8042 kbd", + .id_table = pnp_kbd_devids, + .probe = i8042_pnp_kbd_probe, +}; + +static struct pnp_device_id pnp_aux_devids[] = { + { .id = "AUI0200", .driver_data = 0 }, + { .id = "FJC6000", .driver_data = 0 }, + { .id = "FJC6001", .driver_data = 0 }, + { .id = "PNP0f03", .driver_data = 0 }, + { .id = "PNP0f0b", .driver_data = 0 }, + { .id = "PNP0f0e", .driver_data = 0 }, + { .id = "PNP0f12", .driver_data = 0 }, + { .id = "PNP0f13", .driver_data = 0 }, + { .id = "PNP0f19", .driver_data = 0 }, + { .id = "PNP0f1c", .driver_data = 0 }, + { .id = "SYN0801", .driver_data = 0 }, + { .id = "", }, +}; +MODULE_DEVICE_TABLE(pnp, pnp_aux_devids); + +static struct pnp_driver i8042_pnp_aux_driver = { + .name = "i8042 aux", + .id_table = pnp_aux_devids, + .probe = i8042_pnp_aux_probe, +}; + +static void i8042_pnp_exit(void) +{ + if (i8042_pnp_kbd_registered) { + i8042_pnp_kbd_registered = false; + pnp_unregister_driver(&i8042_pnp_kbd_driver); + } + + if (i8042_pnp_aux_registered) { + i8042_pnp_aux_registered = false; + pnp_unregister_driver(&i8042_pnp_aux_driver); + } +} + +static int __init i8042_pnp_init(void) +{ + char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; + bool pnp_data_busted = false; + int err; + +#ifdef CONFIG_X86 + if (dmi_check_system(i8042_dmi_nopnp_table)) + i8042_nopnp = true; +#endif + + if (i8042_nopnp) { + pr_info("PNP detection disabled\n"); + return 0; + } + + err = pnp_register_driver(&i8042_pnp_kbd_driver); + if (!err) + i8042_pnp_kbd_registered = true; + + err = pnp_register_driver(&i8042_pnp_aux_driver); + if (!err) + i8042_pnp_aux_registered = true; + + if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { + i8042_pnp_exit(); +#if defined(__ia64__) + return -ENODEV; +#else + pr_info("PNP: No PS/2 controller found. Probing ports directly.\n"); + return 0; +#endif + } + + if (i8042_pnp_kbd_devices) + snprintf(kbd_irq_str, sizeof(kbd_irq_str), + "%d", i8042_pnp_kbd_irq); + if (i8042_pnp_aux_devices) + snprintf(aux_irq_str, sizeof(aux_irq_str), + "%d", i8042_pnp_aux_irq); + + pr_info("PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", + i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", + i8042_pnp_aux_name, + i8042_pnp_data_reg, i8042_pnp_command_reg, + kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", + aux_irq_str); + +#if defined(__ia64__) + if (!i8042_pnp_kbd_devices) + i8042_nokbd = true; + if (!i8042_pnp_aux_devices) + i8042_noaux = true; +#endif + + if (((i8042_pnp_data_reg & ~0xf) == (i8042_data_reg & ~0xf) && + i8042_pnp_data_reg != i8042_data_reg) || + !i8042_pnp_data_reg) { + pr_warn("PNP: PS/2 controller has invalid data port %#x; using default %#x\n", + i8042_pnp_data_reg, i8042_data_reg); + i8042_pnp_data_reg = i8042_data_reg; + pnp_data_busted = true; + } + + if (((i8042_pnp_command_reg & ~0xf) == (i8042_command_reg & ~0xf) && + i8042_pnp_command_reg != i8042_command_reg) || + !i8042_pnp_command_reg) { + pr_warn("PNP: PS/2 controller has invalid command port %#x; using default %#x\n", + i8042_pnp_command_reg, i8042_command_reg); + i8042_pnp_command_reg = i8042_command_reg; + pnp_data_busted = true; + } + + if (!i8042_nokbd && !i8042_pnp_kbd_irq) { + pr_warn("PNP: PS/2 controller doesn't have KBD irq; using default %d\n", + i8042_kbd_irq); + i8042_pnp_kbd_irq = i8042_kbd_irq; + pnp_data_busted = true; + } + + if (!i8042_noaux && !i8042_pnp_aux_irq) { + if (!pnp_data_busted && i8042_pnp_kbd_irq) { + pr_warn("PNP: PS/2 appears to have AUX port disabled, " + "if this is incorrect please boot with i8042.nopnp\n"); + i8042_noaux = true; + } else { + pr_warn("PNP: PS/2 controller doesn't have AUX irq; using default %d\n", + i8042_aux_irq); + i8042_pnp_aux_irq = i8042_aux_irq; + } + } + + i8042_data_reg = i8042_pnp_data_reg; + i8042_command_reg = i8042_pnp_command_reg; + i8042_kbd_irq = i8042_pnp_kbd_irq; + i8042_aux_irq = i8042_pnp_aux_irq; + +#ifdef CONFIG_X86 + i8042_bypass_aux_irq_test = !pnp_data_busted && + dmi_check_system(i8042_dmi_laptop_table); +#endif + + return 0; +} + +#else +static inline int i8042_pnp_init(void) { return 0; } +static inline void i8042_pnp_exit(void) { } +#endif + +static int __init i8042_platform_init(void) +{ + int retval; + +#ifdef CONFIG_X86 + u8 a20_on = 0xdf; + /* Just return if pre-detection shows no i8042 controller exist */ + if (!x86_platform.i8042_detect()) + return -ENODEV; +#endif + +/* + * On ix86 platforms touching the i8042 data register region can do really + * bad things. Because of this the region is always reserved on ix86 boxes. + * + * if (!request_region(I8042_DATA_REG, 16, "i8042")) + * return -EBUSY; + */ + + i8042_kbd_irq = I8042_MAP_IRQ(1); + i8042_aux_irq = I8042_MAP_IRQ(12); + + retval = i8042_pnp_init(); + if (retval) + return retval; + +#if defined(__ia64__) + i8042_reset = true; +#endif + +#ifdef CONFIG_X86 + if (dmi_check_system(i8042_dmi_reset_table)) + i8042_reset = true; + + if (dmi_check_system(i8042_dmi_noloop_table)) + i8042_noloop = true; + + if (dmi_check_system(i8042_dmi_nomux_table)) + i8042_nomux = true; + + if (dmi_check_system(i8042_dmi_notimeout_table)) + i8042_notimeout = true; + + if (dmi_check_system(i8042_dmi_dritek_table)) + i8042_dritek = true; + + /* + * A20 was already enabled during early kernel init. But some buggy + * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to + * resume from S3. So we do it here and hope that nothing breaks. + */ + i8042_command(&a20_on, 0x10d1); + i8042_command(NULL, 0x00ff); /* Null command for SMM firmware */ +#endif /* CONFIG_X86 */ + + return retval; +} + +static inline void i8042_platform_exit(void) +{ + i8042_pnp_exit(); +} + +#endif /* _I8042_X86IA64IO_H */ diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c new file mode 100644 index 00000000..78e4de42 --- /dev/null +++ b/drivers/input/serio/i8042.c @@ -0,0 +1,1502 @@ +/* + * i8042 keyboard and mouse controller driver for Linux + * + * Copyright (c) 1999-2004 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("i8042 keyboard and mouse controller driver"); +MODULE_LICENSE("GPL"); + +static bool i8042_nokbd; +module_param_named(nokbd, i8042_nokbd, bool, 0); +MODULE_PARM_DESC(nokbd, "Do not probe or use KBD port."); + +static bool i8042_noaux; +module_param_named(noaux, i8042_noaux, bool, 0); +MODULE_PARM_DESC(noaux, "Do not probe or use AUX (mouse) port."); + +static bool i8042_nomux; +module_param_named(nomux, i8042_nomux, bool, 0); +MODULE_PARM_DESC(nomux, "Do not check whether an active multiplexing controller is present."); + +static bool i8042_unlock; +module_param_named(unlock, i8042_unlock, bool, 0); +MODULE_PARM_DESC(unlock, "Ignore keyboard lock."); + +static bool i8042_reset; +module_param_named(reset, i8042_reset, bool, 0); +MODULE_PARM_DESC(reset, "Reset controller during init and cleanup."); + +static bool i8042_direct; +module_param_named(direct, i8042_direct, bool, 0); +MODULE_PARM_DESC(direct, "Put keyboard port into non-translated mode."); + +static bool i8042_dumbkbd; +module_param_named(dumbkbd, i8042_dumbkbd, bool, 0); +MODULE_PARM_DESC(dumbkbd, "Pretend that controller can only read data from keyboard"); + +static bool i8042_noloop; +module_param_named(noloop, i8042_noloop, bool, 0); +MODULE_PARM_DESC(noloop, "Disable the AUX Loopback command while probing for the AUX port"); + +static bool i8042_notimeout; +module_param_named(notimeout, i8042_notimeout, bool, 0); +MODULE_PARM_DESC(notimeout, "Ignore timeouts signalled by i8042"); + +#ifdef CONFIG_X86 +static bool i8042_dritek; +module_param_named(dritek, i8042_dritek, bool, 0); +MODULE_PARM_DESC(dritek, "Force enable the Dritek keyboard extension"); +#endif + +#ifdef CONFIG_PNP +static bool i8042_nopnp; +module_param_named(nopnp, i8042_nopnp, bool, 0); +MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings"); +#endif + +#define DEBUG +#ifdef DEBUG +static bool i8042_debug; +module_param_named(debug, i8042_debug, bool, 0600); +MODULE_PARM_DESC(debug, "Turn i8042 debugging mode on and off"); +#endif + +static bool i8042_bypass_aux_irq_test; + +#include "i8042.h" + +/* + * i8042_lock protects serialization between i8042_command and + * the interrupt handler. + */ +static DEFINE_SPINLOCK(i8042_lock); + +/* + * Writers to AUX and KBD ports as well as users issuing i8042_command + * directly should acquire i8042_mutex (by means of calling + * i8042_lock_chip() and i8042_unlock_ship() helpers) to ensure that + * they do not disturb each other (unfortunately in many i8042 + * implementations write to one of the ports will immediately abort + * command that is being processed by another port). + */ +static DEFINE_MUTEX(i8042_mutex); + +struct i8042_port { + struct serio *serio; + int irq; + bool exists; + signed char mux; +}; + +#define I8042_KBD_PORT_NO 0 +#define I8042_AUX_PORT_NO 1 +#define I8042_MUX_PORT_NO 2 +#define I8042_NUM_PORTS (I8042_NUM_MUX_PORTS + 2) + +static struct i8042_port i8042_ports[I8042_NUM_PORTS]; + +static unsigned char i8042_initial_ctr; +static unsigned char i8042_ctr; +static bool i8042_mux_present; +static bool i8042_kbd_irq_registered; +static bool i8042_aux_irq_registered; +static unsigned char i8042_suppress_kbd_ack; +static struct platform_device *i8042_platform_device; + +static irqreturn_t i8042_interrupt(int irq, void *dev_id); +static bool (*i8042_platform_filter)(unsigned char data, unsigned char str, + struct serio *serio); + +void i8042_lock_chip(void) +{ + mutex_lock(&i8042_mutex); +} +EXPORT_SYMBOL(i8042_lock_chip); + +void i8042_unlock_chip(void) +{ + mutex_unlock(&i8042_mutex); +} +EXPORT_SYMBOL(i8042_unlock_chip); + +int i8042_install_filter(bool (*filter)(unsigned char data, unsigned char str, + struct serio *serio)) +{ + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(&i8042_lock, flags); + + if (i8042_platform_filter) { + ret = -EBUSY; + goto out; + } + + i8042_platform_filter = filter; + +out: + spin_unlock_irqrestore(&i8042_lock, flags); + return ret; +} +EXPORT_SYMBOL(i8042_install_filter); + +int i8042_remove_filter(bool (*filter)(unsigned char data, unsigned char str, + struct serio *port)) +{ + unsigned long flags; + int ret = 0; + + spin_lock_irqsave(&i8042_lock, flags); + + if (i8042_platform_filter != filter) { + ret = -EINVAL; + goto out; + } + + i8042_platform_filter = NULL; + +out: + spin_unlock_irqrestore(&i8042_lock, flags); + return ret; +} +EXPORT_SYMBOL(i8042_remove_filter); + +/* + * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to + * be ready for reading values from it / writing values to it. + * Called always with i8042_lock held. + */ + +static int i8042_wait_read(void) +{ + int i = 0; + + while ((~i8042_read_status() & I8042_STR_OBF) && (i < I8042_CTL_TIMEOUT)) { + udelay(50); + i++; + } + return -(i == I8042_CTL_TIMEOUT); +} + +static int i8042_wait_write(void) +{ + int i = 0; + + while ((i8042_read_status() & I8042_STR_IBF) && (i < I8042_CTL_TIMEOUT)) { + udelay(50); + i++; + } + return -(i == I8042_CTL_TIMEOUT); +} + +/* + * i8042_flush() flushes all data that may be in the keyboard and mouse buffers + * of the i8042 down the toilet. + */ + +static int i8042_flush(void) +{ + unsigned long flags; + unsigned char data, str; + int i = 0; + + spin_lock_irqsave(&i8042_lock, flags); + + while (((str = i8042_read_status()) & I8042_STR_OBF) && (i < I8042_BUFFER_SIZE)) { + udelay(50); + data = i8042_read_data(); + i++; + dbg("%02x <- i8042 (flush, %s)\n", + data, str & I8042_STR_AUXDATA ? "aux" : "kbd"); + } + + spin_unlock_irqrestore(&i8042_lock, flags); + + return i; +} + +/* + * i8042_command() executes a command on the i8042. It also sends the input + * parameter(s) of the commands to it, and receives the output value(s). The + * parameters are to be stored in the param array, and the output is placed + * into the same array. The number of the parameters and output values is + * encoded in bits 8-11 of the command number. + */ + +static int __i8042_command(unsigned char *param, int command) +{ + int i, error; + + if (i8042_noloop && command == I8042_CMD_AUX_LOOP) + return -1; + + error = i8042_wait_write(); + if (error) + return error; + + dbg("%02x -> i8042 (command)\n", command & 0xff); + i8042_write_command(command & 0xff); + + for (i = 0; i < ((command >> 12) & 0xf); i++) { + error = i8042_wait_write(); + if (error) + return error; + dbg("%02x -> i8042 (parameter)\n", param[i]); + i8042_write_data(param[i]); + } + + for (i = 0; i < ((command >> 8) & 0xf); i++) { + error = i8042_wait_read(); + if (error) { + dbg(" -- i8042 (timeout)\n"); + return error; + } + + if (command == I8042_CMD_AUX_LOOP && + !(i8042_read_status() & I8042_STR_AUXDATA)) { + dbg(" -- i8042 (auxerr)\n"); + return -1; + } + + param[i] = i8042_read_data(); + dbg("%02x <- i8042 (return)\n", param[i]); + } + + return 0; +} + +int i8042_command(unsigned char *param, int command) +{ + unsigned long flags; + int retval; + + spin_lock_irqsave(&i8042_lock, flags); + retval = __i8042_command(param, command); + spin_unlock_irqrestore(&i8042_lock, flags); + + return retval; +} +EXPORT_SYMBOL(i8042_command); + +/* + * i8042_kbd_write() sends a byte out through the keyboard interface. + */ + +static int i8042_kbd_write(struct serio *port, unsigned char c) +{ + unsigned long flags; + int retval = 0; + + spin_lock_irqsave(&i8042_lock, flags); + + if (!(retval = i8042_wait_write())) { + dbg("%02x -> i8042 (kbd-data)\n", c); + i8042_write_data(c); + } + + spin_unlock_irqrestore(&i8042_lock, flags); + + return retval; +} + +/* + * i8042_aux_write() sends a byte out through the aux interface. + */ + +static int i8042_aux_write(struct serio *serio, unsigned char c) +{ + struct i8042_port *port = serio->port_data; + + return i8042_command(&c, port->mux == -1 ? + I8042_CMD_AUX_SEND : + I8042_CMD_MUX_SEND + port->mux); +} + + +/* + * i8042_aux_close attempts to clear AUX or KBD port state by disabling + * and then re-enabling it. + */ + +static void i8042_port_close(struct serio *serio) +{ + int irq_bit; + int disable_bit; + const char *port_name; + + if (serio == i8042_ports[I8042_AUX_PORT_NO].serio) { + irq_bit = I8042_CTR_AUXINT; + disable_bit = I8042_CTR_AUXDIS; + port_name = "AUX"; + } else { + irq_bit = I8042_CTR_KBDINT; + disable_bit = I8042_CTR_KBDDIS; + port_name = "KBD"; + } + + i8042_ctr &= ~irq_bit; + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) + pr_warn("Can't write CTR while closing %s port\n", port_name); + + udelay(50); + + i8042_ctr &= ~disable_bit; + i8042_ctr |= irq_bit; + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) + pr_err("Can't reactivate %s port\n", port_name); + + /* + * See if there is any data appeared while we were messing with + * port state. + */ + i8042_interrupt(0, NULL); +} + +/* + * i8042_start() is called by serio core when port is about to finish + * registering. It will mark port as existing so i8042_interrupt can + * start sending data through it. + */ +static int i8042_start(struct serio *serio) +{ + struct i8042_port *port = serio->port_data; + + port->exists = true; + mb(); + return 0; +} + +/* + * i8042_stop() marks serio port as non-existing so i8042_interrupt + * will not try to send data to the port that is about to go away. + * The function is called by serio core as part of unregister procedure. + */ +static void i8042_stop(struct serio *serio) +{ + struct i8042_port *port = serio->port_data; + + port->exists = false; + + /* + * We synchronize with both AUX and KBD IRQs because there is + * a (very unlikely) chance that AUX IRQ is raised for KBD port + * and vice versa. + */ + synchronize_irq(I8042_AUX_IRQ); + synchronize_irq(I8042_KBD_IRQ); + port->serio = NULL; +} + +/* + * i8042_filter() filters out unwanted bytes from the input data stream. + * It is called from i8042_interrupt and thus is running with interrupts + * off and i8042_lock held. + */ +static bool i8042_filter(unsigned char data, unsigned char str, + struct serio *serio) +{ + if (unlikely(i8042_suppress_kbd_ack)) { + if ((~str & I8042_STR_AUXDATA) && + (data == 0xfa || data == 0xfe)) { + i8042_suppress_kbd_ack--; + dbg("Extra keyboard ACK - filtered out\n"); + return true; + } + } + + if (i8042_platform_filter && i8042_platform_filter(data, str, serio)) { + dbg("Filtered out by platform filter\n"); + return true; + } + + return false; +} + +/* + * i8042_interrupt() is the most important function in this driver - + * it handles the interrupts from the i8042, and sends incoming bytes + * to the upper layers. + */ + +static irqreturn_t i8042_interrupt(int irq, void *dev_id) +{ + struct i8042_port *port; + struct serio *serio; + unsigned long flags; + unsigned char str, data; + unsigned int dfl; + unsigned int port_no; + bool filtered; + int ret = 1; + + spin_lock_irqsave(&i8042_lock, flags); + + str = i8042_read_status(); + if (unlikely(~str & I8042_STR_OBF)) { + spin_unlock_irqrestore(&i8042_lock, flags); + if (irq) + dbg("Interrupt %d, without any data\n", irq); + ret = 0; + goto out; + } + + data = i8042_read_data(); + + if (i8042_mux_present && (str & I8042_STR_AUXDATA)) { + static unsigned long last_transmit; + static unsigned char last_str; + + dfl = 0; + if (str & I8042_STR_MUXERR) { + dbg("MUX error, status is %02x, data is %02x\n", + str, data); +/* + * When MUXERR condition is signalled the data register can only contain + * 0xfd, 0xfe or 0xff if implementation follows the spec. Unfortunately + * it is not always the case. Some KBCs also report 0xfc when there is + * nothing connected to the port while others sometimes get confused which + * port the data came from and signal error leaving the data intact. They + * _do not_ revert to legacy mode (actually I've never seen KBC reverting + * to legacy mode yet, when we see one we'll add proper handling). + * Anyway, we process 0xfc, 0xfd, 0xfe and 0xff as timeouts, and for the + * rest assume that the data came from the same serio last byte + * was transmitted (if transmission happened not too long ago). + */ + + switch (data) { + default: + if (time_before(jiffies, last_transmit + HZ/10)) { + str = last_str; + break; + } + /* fall through - report timeout */ + case 0xfc: + case 0xfd: + case 0xfe: dfl = SERIO_TIMEOUT; data = 0xfe; break; + case 0xff: dfl = SERIO_PARITY; data = 0xfe; break; + } + } + + port_no = I8042_MUX_PORT_NO + ((str >> 6) & 3); + last_str = str; + last_transmit = jiffies; + } else { + + dfl = ((str & I8042_STR_PARITY) ? SERIO_PARITY : 0) | + ((str & I8042_STR_TIMEOUT && !i8042_notimeout) ? SERIO_TIMEOUT : 0); + + port_no = (str & I8042_STR_AUXDATA) ? + I8042_AUX_PORT_NO : I8042_KBD_PORT_NO; + } + + port = &i8042_ports[port_no]; + serio = port->exists ? port->serio : NULL; + + dbg("%02x <- i8042 (interrupt, %d, %d%s%s)\n", + data, port_no, irq, + dfl & SERIO_PARITY ? ", bad parity" : "", + dfl & SERIO_TIMEOUT ? ", timeout" : ""); + + filtered = i8042_filter(data, str, serio); + + spin_unlock_irqrestore(&i8042_lock, flags); + + if (likely(port->exists && !filtered)) + serio_interrupt(serio, data, dfl); + + out: + return IRQ_RETVAL(ret); +} + +/* + * i8042_enable_kbd_port enables keyboard port on chip + */ + +static int i8042_enable_kbd_port(void) +{ + i8042_ctr &= ~I8042_CTR_KBDDIS; + i8042_ctr |= I8042_CTR_KBDINT; + + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { + i8042_ctr &= ~I8042_CTR_KBDINT; + i8042_ctr |= I8042_CTR_KBDDIS; + pr_err("Failed to enable KBD port\n"); + return -EIO; + } + + return 0; +} + +/* + * i8042_enable_aux_port enables AUX (mouse) port on chip + */ + +static int i8042_enable_aux_port(void) +{ + i8042_ctr &= ~I8042_CTR_AUXDIS; + i8042_ctr |= I8042_CTR_AUXINT; + + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { + i8042_ctr &= ~I8042_CTR_AUXINT; + i8042_ctr |= I8042_CTR_AUXDIS; + pr_err("Failed to enable AUX port\n"); + return -EIO; + } + + return 0; +} + +/* + * i8042_enable_mux_ports enables 4 individual AUX ports after + * the controller has been switched into Multiplexed mode + */ + +static int i8042_enable_mux_ports(void) +{ + unsigned char param; + int i; + + for (i = 0; i < I8042_NUM_MUX_PORTS; i++) { + i8042_command(¶m, I8042_CMD_MUX_PFX + i); + i8042_command(¶m, I8042_CMD_AUX_ENABLE); + } + + return i8042_enable_aux_port(); +} + +/* + * i8042_set_mux_mode checks whether the controller has an + * active multiplexor and puts the chip into Multiplexed (true) + * or Legacy (false) mode. + */ + +static int i8042_set_mux_mode(bool multiplex, unsigned char *mux_version) +{ + + unsigned char param, val; +/* + * Get rid of bytes in the queue. + */ + + i8042_flush(); + +/* + * Internal loopback test - send three bytes, they should come back from the + * mouse interface, the last should be version. + */ + + param = val = 0xf0; + if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != val) + return -1; + param = val = multiplex ? 0x56 : 0xf6; + if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != val) + return -1; + param = val = multiplex ? 0xa4 : 0xa5; + if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param == val) + return -1; + +/* + * Workaround for interference with USB Legacy emulation + * that causes a v10.12 MUX to be found. + */ + if (param == 0xac) + return -1; + + if (mux_version) + *mux_version = param; + + return 0; +} + +/* + * i8042_check_mux() checks whether the controller supports the PS/2 Active + * Multiplexing specification by Synaptics, Phoenix, Insyde and + * LCS/Telegraphics. + */ + +static int __init i8042_check_mux(void) +{ + unsigned char mux_version; + + if (i8042_set_mux_mode(true, &mux_version)) + return -1; + + pr_info("Detected active multiplexing controller, rev %d.%d\n", + (mux_version >> 4) & 0xf, mux_version & 0xf); + +/* + * Disable all muxed ports by disabling AUX. + */ + i8042_ctr |= I8042_CTR_AUXDIS; + i8042_ctr &= ~I8042_CTR_AUXINT; + + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { + pr_err("Failed to disable AUX port, can't use MUX\n"); + return -EIO; + } + + i8042_mux_present = true; + + return 0; +} + +/* + * The following is used to test AUX IRQ delivery. + */ +static struct completion i8042_aux_irq_delivered __initdata; +static bool i8042_irq_being_tested __initdata; + +static irqreturn_t __init i8042_aux_test_irq(int irq, void *dev_id) +{ + unsigned long flags; + unsigned char str, data; + int ret = 0; + + spin_lock_irqsave(&i8042_lock, flags); + str = i8042_read_status(); + if (str & I8042_STR_OBF) { + data = i8042_read_data(); + dbg("%02x <- i8042 (aux_test_irq, %s)\n", + data, str & I8042_STR_AUXDATA ? "aux" : "kbd"); + if (i8042_irq_being_tested && + data == 0xa5 && (str & I8042_STR_AUXDATA)) + complete(&i8042_aux_irq_delivered); + ret = 1; + } + spin_unlock_irqrestore(&i8042_lock, flags); + + return IRQ_RETVAL(ret); +} + +/* + * i8042_toggle_aux - enables or disables AUX port on i8042 via command and + * verifies success by readinng CTR. Used when testing for presence of AUX + * port. + */ +static int __init i8042_toggle_aux(bool on) +{ + unsigned char param; + int i; + + if (i8042_command(¶m, + on ? I8042_CMD_AUX_ENABLE : I8042_CMD_AUX_DISABLE)) + return -1; + + /* some chips need some time to set the I8042_CTR_AUXDIS bit */ + for (i = 0; i < 100; i++) { + udelay(50); + + if (i8042_command(¶m, I8042_CMD_CTL_RCTR)) + return -1; + + if (!(param & I8042_CTR_AUXDIS) == on) + return 0; + } + + return -1; +} + +/* + * i8042_check_aux() applies as much paranoia as it can at detecting + * the presence of an AUX interface. + */ + +static int __init i8042_check_aux(void) +{ + int retval = -1; + bool irq_registered = false; + bool aux_loop_broken = false; + unsigned long flags; + unsigned char param; + +/* + * Get rid of bytes in the queue. + */ + + i8042_flush(); + +/* + * Internal loopback test - filters out AT-type i8042's. Unfortunately + * SiS screwed up and their 5597 doesn't support the LOOP command even + * though it has an AUX port. + */ + + param = 0x5a; + retval = i8042_command(¶m, I8042_CMD_AUX_LOOP); + if (retval || param != 0x5a) { + +/* + * External connection test - filters out AT-soldered PS/2 i8042's + * 0x00 - no error, 0x01-0x03 - clock/data stuck, 0xff - general error + * 0xfa - no error on some notebooks which ignore the spec + * Because it's common for chipsets to return error on perfectly functioning + * AUX ports, we test for this only when the LOOP command failed. + */ + + if (i8042_command(¶m, I8042_CMD_AUX_TEST) || + (param && param != 0xfa && param != 0xff)) + return -1; + +/* + * If AUX_LOOP completed without error but returned unexpected data + * mark it as broken + */ + if (!retval) + aux_loop_broken = true; + } + +/* + * Bit assignment test - filters out PS/2 i8042's in AT mode + */ + + if (i8042_toggle_aux(false)) { + pr_warn("Failed to disable AUX port, but continuing anyway... Is this a SiS?\n"); + pr_warn("If AUX port is really absent please use the 'i8042.noaux' option\n"); + } + + if (i8042_toggle_aux(true)) + return -1; + +/* + * Test AUX IRQ delivery to make sure BIOS did not grab the IRQ and + * used it for a PCI card or somethig else. + */ + + if (i8042_noloop || i8042_bypass_aux_irq_test || aux_loop_broken) { +/* + * Without LOOP command we can't test AUX IRQ delivery. Assume the port + * is working and hope we are right. + */ + retval = 0; + goto out; + } + + if (request_irq(I8042_AUX_IRQ, i8042_aux_test_irq, IRQF_SHARED, + "i8042", i8042_platform_device)) + goto out; + + irq_registered = true; + + if (i8042_enable_aux_port()) + goto out; + + spin_lock_irqsave(&i8042_lock, flags); + + init_completion(&i8042_aux_irq_delivered); + i8042_irq_being_tested = true; + + param = 0xa5; + retval = __i8042_command(¶m, I8042_CMD_AUX_LOOP & 0xf0ff); + + spin_unlock_irqrestore(&i8042_lock, flags); + + if (retval) + goto out; + + if (wait_for_completion_timeout(&i8042_aux_irq_delivered, + msecs_to_jiffies(250)) == 0) { +/* + * AUX IRQ was never delivered so we need to flush the controller to + * get rid of the byte we put there; otherwise keyboard may not work. + */ + dbg(" -- i8042 (aux irq test timeout)\n"); + i8042_flush(); + retval = -1; + } + + out: + +/* + * Disable the interface. + */ + + i8042_ctr |= I8042_CTR_AUXDIS; + i8042_ctr &= ~I8042_CTR_AUXINT; + + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) + retval = -1; + + if (irq_registered) + free_irq(I8042_AUX_IRQ, i8042_platform_device); + + return retval; +} + +static int i8042_controller_check(void) +{ + if (i8042_flush() == I8042_BUFFER_SIZE) { + pr_err("No controller found\n"); + return -ENODEV; + } + + return 0; +} + +static int i8042_controller_selftest(void) +{ + unsigned char param; + int i = 0; + + /* + * We try this 5 times; on some really fragile systems this does not + * take the first time... + */ + do { + + if (i8042_command(¶m, I8042_CMD_CTL_TEST)) { + pr_err("i8042 controller selftest timeout\n"); + return -ENODEV; + } + + if (param == I8042_RET_CTL_TEST) + return 0; + + dbg("i8042 controller selftest: %#x != %#x\n", + param, I8042_RET_CTL_TEST); + msleep(50); + } while (i++ < 5); + +#ifdef CONFIG_X86 + /* + * On x86, we don't fail entire i8042 initialization if controller + * reset fails in hopes that keyboard port will still be functional + * and user will still get a working keyboard. This is especially + * important on netbooks. On other arches we trust hardware more. + */ + pr_info("giving up on controller selftest, continuing anyway...\n"); + return 0; +#else + pr_err("i8042 controller selftest failed\n"); + return -EIO; +#endif +} + +/* + * i8042_controller init initializes the i8042 controller, and, + * most importantly, sets it into non-xlated mode if that's + * desired. + */ + +static int i8042_controller_init(void) +{ + unsigned long flags; + int n = 0; + unsigned char ctr[2]; + +/* + * Save the CTR for restore on unload / reboot. + */ + + do { + if (n >= 10) { + pr_err("Unable to get stable CTR read\n"); + return -EIO; + } + + if (n != 0) + udelay(50); + + if (i8042_command(&ctr[n++ % 2], I8042_CMD_CTL_RCTR)) { + pr_err("Can't read CTR while initializing i8042\n"); + return -EIO; + } + + } while (n < 2 || ctr[0] != ctr[1]); + + i8042_initial_ctr = i8042_ctr = ctr[0]; + +/* + * Disable the keyboard interface and interrupt. + */ + + i8042_ctr |= I8042_CTR_KBDDIS; + i8042_ctr &= ~I8042_CTR_KBDINT; + +/* + * Handle keylock. + */ + + spin_lock_irqsave(&i8042_lock, flags); + if (~i8042_read_status() & I8042_STR_KEYLOCK) { + if (i8042_unlock) + i8042_ctr |= I8042_CTR_IGNKEYLOCK; + else + pr_warn("Warning: Keylock active\n"); + } + spin_unlock_irqrestore(&i8042_lock, flags); + +/* + * If the chip is configured into nontranslated mode by the BIOS, don't + * bother enabling translating and be happy. + */ + + if (~i8042_ctr & I8042_CTR_XLATE) + i8042_direct = true; + +/* + * Set nontranslated mode for the kbd interface if requested by an option. + * After this the kbd interface becomes a simple serial in/out, like the aux + * interface is. We don't do this by default, since it can confuse notebook + * BIOSes. + */ + + if (i8042_direct) + i8042_ctr &= ~I8042_CTR_XLATE; + +/* + * Write CTR back. + */ + + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { + pr_err("Can't write CTR while initializing i8042\n"); + return -EIO; + } + +/* + * Flush whatever accumulated while we were disabling keyboard port. + */ + + i8042_flush(); + + return 0; +} + + +/* + * Reset the controller and reset CRT to the original value set by BIOS. + */ + +static void i8042_controller_reset(bool force_reset) +{ + i8042_flush(); + +/* + * Disable both KBD and AUX interfaces so they don't get in the way + */ + + i8042_ctr |= I8042_CTR_KBDDIS | I8042_CTR_AUXDIS; + i8042_ctr &= ~(I8042_CTR_KBDINT | I8042_CTR_AUXINT); + + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) + pr_warn("Can't write CTR while resetting\n"); + +/* + * Disable MUX mode if present. + */ + + if (i8042_mux_present) + i8042_set_mux_mode(false, NULL); + +/* + * Reset the controller if requested. + */ + + if (i8042_reset || force_reset) + i8042_controller_selftest(); + +/* + * Restore the original control register setting. + */ + + if (i8042_command(&i8042_initial_ctr, I8042_CMD_CTL_WCTR)) + pr_warn("Can't restore CTR\n"); +} + + +/* + * i8042_panic_blink() will turn the keyboard LEDs on or off and is called + * when kernel panics. Flashing LEDs is useful for users running X who may + * not see the console and will help distingushing panics from "real" + * lockups. + * + * Note that DELAY has a limit of 10ms so we will not get stuck here + * waiting for KBC to free up even if KBD interrupt is off + */ + +#define DELAY do { mdelay(1); if (++delay > 10) return delay; } while(0) + +static long i8042_panic_blink(int state) +{ + long delay = 0; + char led; + + led = (state) ? 0x01 | 0x04 : 0; + while (i8042_read_status() & I8042_STR_IBF) + DELAY; + dbg("%02x -> i8042 (panic blink)\n", 0xed); + i8042_suppress_kbd_ack = 2; + i8042_write_data(0xed); /* set leds */ + DELAY; + while (i8042_read_status() & I8042_STR_IBF) + DELAY; + DELAY; + dbg("%02x -> i8042 (panic blink)\n", led); + i8042_write_data(led); + DELAY; + return delay; +} + +#undef DELAY + +#ifdef CONFIG_X86 +static void i8042_dritek_enable(void) +{ + unsigned char param = 0x90; + int error; + + error = i8042_command(¶m, 0x1059); + if (error) + pr_warn("Failed to enable DRITEK extension: %d\n", error); +} +#endif + +#ifdef CONFIG_PM + +/* + * Here we try to reset everything back to a state we had + * before suspending. + */ + +static int i8042_controller_resume(bool force_reset) +{ + int error; + + error = i8042_controller_check(); + if (error) + return error; + + if (i8042_reset || force_reset) { + error = i8042_controller_selftest(); + if (error) + return error; + } + +/* + * Restore original CTR value and disable all ports + */ + + i8042_ctr = i8042_initial_ctr; + if (i8042_direct) + i8042_ctr &= ~I8042_CTR_XLATE; + i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS; + i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT); + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { + pr_warn("Can't write CTR to resume, retrying...\n"); + msleep(50); + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { + pr_err("CTR write retry failed\n"); + return -EIO; + } + } + + +#ifdef CONFIG_X86 + if (i8042_dritek) + i8042_dritek_enable(); +#endif + + if (i8042_mux_present) { + if (i8042_set_mux_mode(true, NULL) || i8042_enable_mux_ports()) + pr_warn("failed to resume active multiplexor, mouse won't work\n"); + } else if (i8042_ports[I8042_AUX_PORT_NO].serio) + i8042_enable_aux_port(); + + if (i8042_ports[I8042_KBD_PORT_NO].serio) + i8042_enable_kbd_port(); + + i8042_interrupt(0, NULL); + + return 0; +} + +/* + * Here we try to restore the original BIOS settings to avoid + * upsetting it. + */ + +static int i8042_pm_suspend(struct device *dev) +{ + i8042_controller_reset(true); + + return 0; +} + +static int i8042_pm_resume(struct device *dev) +{ + /* + * On resume from S2R we always try to reset the controller + * to bring it in a sane state. (In case of S2D we expect + * BIOS to reset the controller for us.) + */ + return i8042_controller_resume(true); +} + +static int i8042_pm_thaw(struct device *dev) +{ + i8042_interrupt(0, NULL); + + return 0; +} + +static int i8042_pm_reset(struct device *dev) +{ + i8042_controller_reset(false); + + return 0; +} + +static int i8042_pm_restore(struct device *dev) +{ + return i8042_controller_resume(false); +} + +static const struct dev_pm_ops i8042_pm_ops = { + .suspend = i8042_pm_suspend, + .resume = i8042_pm_resume, + .thaw = i8042_pm_thaw, + .poweroff = i8042_pm_reset, + .restore = i8042_pm_restore, +}; + +#endif /* CONFIG_PM */ + +/* + * We need to reset the 8042 back to original mode on system shutdown, + * because otherwise BIOSes will be confused. + */ + +static void i8042_shutdown(struct platform_device *dev) +{ + i8042_controller_reset(false); +} + +static int __init i8042_create_kbd_port(void) +{ + struct serio *serio; + struct i8042_port *port = &i8042_ports[I8042_KBD_PORT_NO]; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!serio) + return -ENOMEM; + + serio->id.type = i8042_direct ? SERIO_8042 : SERIO_8042_XL; + serio->write = i8042_dumbkbd ? NULL : i8042_kbd_write; + serio->start = i8042_start; + serio->stop = i8042_stop; + serio->close = i8042_port_close; + serio->port_data = port; + serio->dev.parent = &i8042_platform_device->dev; + strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name)); + strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys)); + + port->serio = serio; + port->irq = I8042_KBD_IRQ; + + return 0; +} + +static int __init i8042_create_aux_port(int idx) +{ + struct serio *serio; + int port_no = idx < 0 ? I8042_AUX_PORT_NO : I8042_MUX_PORT_NO + idx; + struct i8042_port *port = &i8042_ports[port_no]; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!serio) + return -ENOMEM; + + serio->id.type = SERIO_8042; + serio->write = i8042_aux_write; + serio->start = i8042_start; + serio->stop = i8042_stop; + serio->port_data = port; + serio->dev.parent = &i8042_platform_device->dev; + if (idx < 0) { + strlcpy(serio->name, "i8042 AUX port", sizeof(serio->name)); + strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys)); + serio->close = i8042_port_close; + } else { + snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx); + snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, idx + 1); + } + + port->serio = serio; + port->mux = idx; + port->irq = I8042_AUX_IRQ; + + return 0; +} + +static void __init i8042_free_kbd_port(void) +{ + kfree(i8042_ports[I8042_KBD_PORT_NO].serio); + i8042_ports[I8042_KBD_PORT_NO].serio = NULL; +} + +static void __init i8042_free_aux_ports(void) +{ + int i; + + for (i = I8042_AUX_PORT_NO; i < I8042_NUM_PORTS; i++) { + kfree(i8042_ports[i].serio); + i8042_ports[i].serio = NULL; + } +} + +static void __init i8042_register_ports(void) +{ + int i; + + for (i = 0; i < I8042_NUM_PORTS; i++) { + if (i8042_ports[i].serio) { + printk(KERN_INFO "serio: %s at %#lx,%#lx irq %d\n", + i8042_ports[i].serio->name, + (unsigned long) I8042_DATA_REG, + (unsigned long) I8042_COMMAND_REG, + i8042_ports[i].irq); + serio_register_port(i8042_ports[i].serio); + } + } +} + +static void i8042_unregister_ports(void) +{ + int i; + + for (i = 0; i < I8042_NUM_PORTS; i++) { + if (i8042_ports[i].serio) { + serio_unregister_port(i8042_ports[i].serio); + i8042_ports[i].serio = NULL; + } + } +} + +/* + * Checks whether port belongs to i8042 controller. + */ +bool i8042_check_port_owner(const struct serio *port) +{ + int i; + + for (i = 0; i < I8042_NUM_PORTS; i++) + if (i8042_ports[i].serio == port) + return true; + + return false; +} +EXPORT_SYMBOL(i8042_check_port_owner); + +static void i8042_free_irqs(void) +{ + if (i8042_aux_irq_registered) + free_irq(I8042_AUX_IRQ, i8042_platform_device); + if (i8042_kbd_irq_registered) + free_irq(I8042_KBD_IRQ, i8042_platform_device); + + i8042_aux_irq_registered = i8042_kbd_irq_registered = false; +} + +static int __init i8042_setup_aux(void) +{ + int (*aux_enable)(void); + int error; + int i; + + if (i8042_check_aux()) + return -ENODEV; + + if (i8042_nomux || i8042_check_mux()) { + error = i8042_create_aux_port(-1); + if (error) + goto err_free_ports; + aux_enable = i8042_enable_aux_port; + } else { + for (i = 0; i < I8042_NUM_MUX_PORTS; i++) { + error = i8042_create_aux_port(i); + if (error) + goto err_free_ports; + } + aux_enable = i8042_enable_mux_ports; + } + + error = request_irq(I8042_AUX_IRQ, i8042_interrupt, IRQF_SHARED, + "i8042", i8042_platform_device); + if (error) + goto err_free_ports; + + if (aux_enable()) + goto err_free_irq; + + i8042_aux_irq_registered = true; + return 0; + + err_free_irq: + free_irq(I8042_AUX_IRQ, i8042_platform_device); + err_free_ports: + i8042_free_aux_ports(); + return error; +} + +static int __init i8042_setup_kbd(void) +{ + int error; + + error = i8042_create_kbd_port(); + if (error) + return error; + + error = request_irq(I8042_KBD_IRQ, i8042_interrupt, IRQF_SHARED, + "i8042", i8042_platform_device); + if (error) + goto err_free_port; + + error = i8042_enable_kbd_port(); + if (error) + goto err_free_irq; + + i8042_kbd_irq_registered = true; + return 0; + + err_free_irq: + free_irq(I8042_KBD_IRQ, i8042_platform_device); + err_free_port: + i8042_free_kbd_port(); + return error; +} + +static int __init i8042_probe(struct platform_device *dev) +{ + int error; + + i8042_platform_device = dev; + + if (i8042_reset) { + error = i8042_controller_selftest(); + if (error) + return error; + } + + error = i8042_controller_init(); + if (error) + return error; + +#ifdef CONFIG_X86 + if (i8042_dritek) + i8042_dritek_enable(); +#endif + + if (!i8042_noaux) { + error = i8042_setup_aux(); + if (error && error != -ENODEV && error != -EBUSY) + goto out_fail; + } + + if (!i8042_nokbd) { + error = i8042_setup_kbd(); + if (error) + goto out_fail; + } +/* + * Ok, everything is ready, let's register all serio ports + */ + i8042_register_ports(); + + return 0; + + out_fail: + i8042_free_aux_ports(); /* in case KBD failed but AUX not */ + i8042_free_irqs(); + i8042_controller_reset(false); + i8042_platform_device = NULL; + + return error; +} + +static int i8042_remove(struct platform_device *dev) +{ + i8042_unregister_ports(); + i8042_free_irqs(); + i8042_controller_reset(false); + i8042_platform_device = NULL; + + return 0; +} + +static struct platform_driver i8042_driver = { + .driver = { + .name = "i8042", + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &i8042_pm_ops, +#endif + }, + .remove = i8042_remove, + .shutdown = i8042_shutdown, +}; + +static int __init i8042_init(void) +{ + struct platform_device *pdev; + int err; + + dbg_init(); + + err = i8042_platform_init(); + if (err) + return err; + + err = i8042_controller_check(); + if (err) + goto err_platform_exit; + + pdev = platform_create_bundle(&i8042_driver, i8042_probe, NULL, 0, NULL, 0); + if (IS_ERR(pdev)) { + err = PTR_ERR(pdev); + goto err_platform_exit; + } + + panic_blink = i8042_panic_blink; + + return 0; + + err_platform_exit: + i8042_platform_exit(); + return err; +} + +static void __exit i8042_exit(void) +{ + platform_device_unregister(i8042_platform_device); + platform_driver_unregister(&i8042_driver); + i8042_platform_exit(); + + panic_blink = NULL; +} + +module_init(i8042_init); +module_exit(i8042_exit); diff --git a/drivers/input/serio/i8042.h b/drivers/input/serio/i8042.h new file mode 100644 index 00000000..3452708f --- /dev/null +++ b/drivers/input/serio/i8042.h @@ -0,0 +1,109 @@ +#ifndef _I8042_H +#define _I8042_H + + +/* + * Copyright (c) 1999-2002 Vojtech Pavlik + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * Arch-dependent inline functions and defines. + */ + +#if defined(CONFIG_MACH_JAZZ) +#include "i8042-jazzio.h" +#elif defined(CONFIG_SGI_HAS_I8042) +#include "i8042-ip22io.h" +#elif defined(CONFIG_SNI_RM) +#include "i8042-snirm.h" +#elif defined(CONFIG_PPC) +#include "i8042-ppcio.h" +#elif defined(CONFIG_SPARC) +#include "i8042-sparcio.h" +#elif defined(CONFIG_X86) || defined(CONFIG_IA64) +#include "i8042-x86ia64io.h" +#elif defined(CONFIG_UNICORE32) +#include "i8042-unicore32io.h" +#else +#include "i8042-io.h" +#endif + +/* + * This is in 50us units, the time we wait for the i8042 to react. This + * has to be long enough for the i8042 itself to timeout on sending a byte + * to a non-existent mouse. + */ + +#define I8042_CTL_TIMEOUT 10000 + +/* + * Status register bits. + */ + +#define I8042_STR_PARITY 0x80 +#define I8042_STR_TIMEOUT 0x40 +#define I8042_STR_AUXDATA 0x20 +#define I8042_STR_KEYLOCK 0x10 +#define I8042_STR_CMDDAT 0x08 +#define I8042_STR_MUXERR 0x04 +#define I8042_STR_IBF 0x02 +#define I8042_STR_OBF 0x01 + +/* + * Control register bits. + */ + +#define I8042_CTR_KBDINT 0x01 +#define I8042_CTR_AUXINT 0x02 +#define I8042_CTR_IGNKEYLOCK 0x08 +#define I8042_CTR_KBDDIS 0x10 +#define I8042_CTR_AUXDIS 0x20 +#define I8042_CTR_XLATE 0x40 + +/* + * Return codes. + */ + +#define I8042_RET_CTL_TEST 0x55 + +/* + * Expected maximum internal i8042 buffer size. This is used for flushing + * the i8042 buffers. + */ + +#define I8042_BUFFER_SIZE 16 + +/* + * Number of AUX ports on controllers supporting active multiplexing + * specification + */ + +#define I8042_NUM_MUX_PORTS 4 + +/* + * Debug. + */ + +#ifdef DEBUG +static unsigned long i8042_start_time; +#define dbg_init() do { i8042_start_time = jiffies; } while (0) +#define dbg(format, arg...) \ + do { \ + if (i8042_debug) \ + printk(KERN_DEBUG KBUILD_MODNAME ": [%d] " format, \ + (int) (jiffies - i8042_start_time), ##arg); \ + } while (0) +#else +#define dbg_init() do { } while (0) +#define dbg(format, arg...) \ + do { \ + if (0) \ + printk(KERN_DEBUG pr_fmt(format), ##arg); \ + } while (0) +#endif + +#endif /* _I8042_H */ diff --git a/drivers/input/serio/libps2.c b/drivers/input/serio/libps2.c new file mode 100644 index 00000000..07a8363f --- /dev/null +++ b/drivers/input/serio/libps2.c @@ -0,0 +1,375 @@ +/* + * PS/2 driver library + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * Copyright (c) 2004 Dmitry Torokhov + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "PS/2 driver library" + +MODULE_AUTHOR("Dmitry Torokhov "); +MODULE_DESCRIPTION("PS/2 driver library"); +MODULE_LICENSE("GPL"); + +/* + * ps2_sendbyte() sends a byte to the device and waits for acknowledge. + * It doesn't handle retransmission, though it could - because if there + * is a need for retransmissions device has to be replaced anyway. + * + * ps2_sendbyte() can only be called from a process context. + */ + +int ps2_sendbyte(struct ps2dev *ps2dev, unsigned char byte, int timeout) +{ + serio_pause_rx(ps2dev->serio); + ps2dev->nak = 1; + ps2dev->flags |= PS2_FLAG_ACK; + serio_continue_rx(ps2dev->serio); + + if (serio_write(ps2dev->serio, byte) == 0) + wait_event_timeout(ps2dev->wait, + !(ps2dev->flags & PS2_FLAG_ACK), + msecs_to_jiffies(timeout)); + + serio_pause_rx(ps2dev->serio); + ps2dev->flags &= ~PS2_FLAG_ACK; + serio_continue_rx(ps2dev->serio); + + return -ps2dev->nak; +} +EXPORT_SYMBOL(ps2_sendbyte); + +void ps2_begin_command(struct ps2dev *ps2dev) +{ + mutex_lock(&ps2dev->cmd_mutex); + + if (i8042_check_port_owner(ps2dev->serio)) + i8042_lock_chip(); +} +EXPORT_SYMBOL(ps2_begin_command); + +void ps2_end_command(struct ps2dev *ps2dev) +{ + if (i8042_check_port_owner(ps2dev->serio)) + i8042_unlock_chip(); + + mutex_unlock(&ps2dev->cmd_mutex); +} +EXPORT_SYMBOL(ps2_end_command); + +/* + * ps2_drain() waits for device to transmit requested number of bytes + * and discards them. + */ + +void ps2_drain(struct ps2dev *ps2dev, int maxbytes, int timeout) +{ + if (maxbytes > sizeof(ps2dev->cmdbuf)) { + WARN_ON(1); + maxbytes = sizeof(ps2dev->cmdbuf); + } + + ps2_begin_command(ps2dev); + + serio_pause_rx(ps2dev->serio); + ps2dev->flags = PS2_FLAG_CMD; + ps2dev->cmdcnt = maxbytes; + serio_continue_rx(ps2dev->serio); + + wait_event_timeout(ps2dev->wait, + !(ps2dev->flags & PS2_FLAG_CMD), + msecs_to_jiffies(timeout)); + + ps2_end_command(ps2dev); +} +EXPORT_SYMBOL(ps2_drain); + +/* + * ps2_is_keyboard_id() checks received ID byte against the list of + * known keyboard IDs. + */ + +int ps2_is_keyboard_id(char id_byte) +{ + static const char keyboard_ids[] = { + 0xab, /* Regular keyboards */ + 0xac, /* NCD Sun keyboard */ + 0x2b, /* Trust keyboard, translated */ + 0x5d, /* Trust keyboard */ + 0x60, /* NMB SGI keyboard, translated */ + 0x47, /* NMB SGI keyboard */ + }; + + return memchr(keyboard_ids, id_byte, sizeof(keyboard_ids)) != NULL; +} +EXPORT_SYMBOL(ps2_is_keyboard_id); + +/* + * ps2_adjust_timeout() is called after receiving 1st byte of command + * response and tries to reduce remaining timeout to speed up command + * completion. + */ + +static int ps2_adjust_timeout(struct ps2dev *ps2dev, int command, int timeout) +{ + switch (command) { + case PS2_CMD_RESET_BAT: + /* + * Device has sent the first response byte after + * reset command, reset is thus done, so we can + * shorten the timeout. + * The next byte will come soon (keyboard) or not + * at all (mouse). + */ + if (timeout > msecs_to_jiffies(100)) + timeout = msecs_to_jiffies(100); + break; + + case PS2_CMD_GETID: + /* + * Microsoft Natural Elite keyboard responds to + * the GET ID command as it were a mouse, with + * a single byte. Fail the command so atkbd will + * use alternative probe to detect it. + */ + if (ps2dev->cmdbuf[1] == 0xaa) { + serio_pause_rx(ps2dev->serio); + ps2dev->flags = 0; + serio_continue_rx(ps2dev->serio); + timeout = 0; + } + + /* + * If device behind the port is not a keyboard there + * won't be 2nd byte of ID response. + */ + if (!ps2_is_keyboard_id(ps2dev->cmdbuf[1])) { + serio_pause_rx(ps2dev->serio); + ps2dev->flags = ps2dev->cmdcnt = 0; + serio_continue_rx(ps2dev->serio); + timeout = 0; + } + break; + + default: + break; + } + + return timeout; +} + +/* + * ps2_command() sends a command and its parameters to the mouse, + * then waits for the response and puts it in the param array. + * + * ps2_command() can only be called from a process context + */ + +int __ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) +{ + int timeout; + int send = (command >> 12) & 0xf; + int receive = (command >> 8) & 0xf; + int rc = -1; + int i; + + if (receive > sizeof(ps2dev->cmdbuf)) { + WARN_ON(1); + return -1; + } + + if (send && !param) { + WARN_ON(1); + return -1; + } + + serio_pause_rx(ps2dev->serio); + ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0; + ps2dev->cmdcnt = receive; + if (receive && param) + for (i = 0; i < receive; i++) + ps2dev->cmdbuf[(receive - 1) - i] = param[i]; + serio_continue_rx(ps2dev->serio); + + /* + * Some devices (Synaptics) peform the reset before + * ACKing the reset command, and so it can take a long + * time before the ACK arrives. + */ + if (ps2_sendbyte(ps2dev, command & 0xff, + command == PS2_CMD_RESET_BAT ? 1000 : 200)) + goto out; + + for (i = 0; i < send; i++) + if (ps2_sendbyte(ps2dev, param[i], 200)) + goto out; + + /* + * The reset command takes a long time to execute. + */ + timeout = msecs_to_jiffies(command == PS2_CMD_RESET_BAT ? 4000 : 500); + + timeout = wait_event_timeout(ps2dev->wait, + !(ps2dev->flags & PS2_FLAG_CMD1), timeout); + + if (ps2dev->cmdcnt && !(ps2dev->flags & PS2_FLAG_CMD1)) { + + timeout = ps2_adjust_timeout(ps2dev, command, timeout); + wait_event_timeout(ps2dev->wait, + !(ps2dev->flags & PS2_FLAG_CMD), timeout); + } + + if (param) + for (i = 0; i < receive; i++) + param[i] = ps2dev->cmdbuf[(receive - 1) - i]; + + if (ps2dev->cmdcnt && (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1)) + goto out; + + rc = 0; + + out: + serio_pause_rx(ps2dev->serio); + ps2dev->flags = 0; + serio_continue_rx(ps2dev->serio); + + return rc; +} +EXPORT_SYMBOL(__ps2_command); + +int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command) +{ + int rc; + + ps2_begin_command(ps2dev); + rc = __ps2_command(ps2dev, param, command); + ps2_end_command(ps2dev); + + return rc; +} +EXPORT_SYMBOL(ps2_command); + +/* + * ps2_init() initializes ps2dev structure + */ + +void ps2_init(struct ps2dev *ps2dev, struct serio *serio) +{ + mutex_init(&ps2dev->cmd_mutex); + lockdep_set_subclass(&ps2dev->cmd_mutex, serio->depth); + init_waitqueue_head(&ps2dev->wait); + ps2dev->serio = serio; +} +EXPORT_SYMBOL(ps2_init); + +/* + * ps2_handle_ack() is supposed to be used in interrupt handler + * to properly process ACK/NAK of a command from a PS/2 device. + */ + +int ps2_handle_ack(struct ps2dev *ps2dev, unsigned char data) +{ + switch (data) { + case PS2_RET_ACK: + ps2dev->nak = 0; + break; + + case PS2_RET_NAK: + ps2dev->flags |= PS2_FLAG_NAK; + ps2dev->nak = PS2_RET_NAK; + break; + + case PS2_RET_ERR: + if (ps2dev->flags & PS2_FLAG_NAK) { + ps2dev->flags &= ~PS2_FLAG_NAK; + ps2dev->nak = PS2_RET_ERR; + break; + } + + /* + * Workaround for mice which don't ACK the Get ID command. + * These are valid mouse IDs that we recognize. + */ + case 0x00: + case 0x03: + case 0x04: + if (ps2dev->flags & PS2_FLAG_WAITID) { + ps2dev->nak = 0; + break; + } + /* Fall through */ + default: + return 0; + } + + + if (!ps2dev->nak) { + ps2dev->flags &= ~PS2_FLAG_NAK; + if (ps2dev->cmdcnt) + ps2dev->flags |= PS2_FLAG_CMD | PS2_FLAG_CMD1; + } + + ps2dev->flags &= ~PS2_FLAG_ACK; + wake_up(&ps2dev->wait); + + if (data != PS2_RET_ACK) + ps2_handle_response(ps2dev, data); + + return 1; +} +EXPORT_SYMBOL(ps2_handle_ack); + +/* + * ps2_handle_response() is supposed to be used in interrupt handler + * to properly store device's response to a command and notify process + * waiting for completion of the command. + */ + +int ps2_handle_response(struct ps2dev *ps2dev, unsigned char data) +{ + if (ps2dev->cmdcnt) + ps2dev->cmdbuf[--ps2dev->cmdcnt] = data; + + if (ps2dev->flags & PS2_FLAG_CMD1) { + ps2dev->flags &= ~PS2_FLAG_CMD1; + if (ps2dev->cmdcnt) + wake_up(&ps2dev->wait); + } + + if (!ps2dev->cmdcnt) { + ps2dev->flags &= ~PS2_FLAG_CMD; + wake_up(&ps2dev->wait); + } + + return 1; +} +EXPORT_SYMBOL(ps2_handle_response); + +void ps2_cmd_aborted(struct ps2dev *ps2dev) +{ + if (ps2dev->flags & PS2_FLAG_ACK) + ps2dev->nak = 1; + + if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD)) + wake_up(&ps2dev->wait); + + /* reset all flags except last nack */ + ps2dev->flags &= PS2_FLAG_NAK; +} +EXPORT_SYMBOL(ps2_cmd_aborted); diff --git a/drivers/input/serio/maceps2.c b/drivers/input/serio/maceps2.c new file mode 100644 index 00000000..bc85e1cc --- /dev/null +++ b/drivers/input/serio/maceps2.c @@ -0,0 +1,210 @@ +/* + * SGI O2 MACE PS2 controller driver for linux + * + * Copyright (C) 2002 Vivien Chappelier + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +MODULE_AUTHOR("Vivien Chappelier port_data)->port; + unsigned int timeout = MACE_PS2_TIMEOUT; + + do { + if (port->status & PS2_STATUS_TX_EMPTY) { + port->tx = val; + return 0; + } + udelay(50); + } while (timeout--); + + return -1; +} + +static irqreturn_t maceps2_interrupt(int irq, void *dev_id) +{ + struct serio *dev = dev_id; + struct mace_ps2port *port = ((struct maceps2_data *)dev->port_data)->port; + unsigned long byte; + + if (port->status & PS2_STATUS_RX_FULL) { + byte = port->rx; + serio_interrupt(dev, byte & 0xff, 0); + } + + return IRQ_HANDLED; +} + +static int maceps2_open(struct serio *dev) +{ + struct maceps2_data *data = (struct maceps2_data *)dev->port_data; + + if (request_irq(data->irq, maceps2_interrupt, 0, "PS2 port", dev)) { + printk(KERN_ERR "Could not allocate PS/2 IRQ\n"); + return -EBUSY; + } + + /* Reset port */ + data->port->control = PS2_CONTROL_TX_CLOCK_DISABLE | PS2_CONTROL_RESET; + udelay(100); + + /* Enable interrupts */ + data->port->control = PS2_CONTROL_RX_CLOCK_ENABLE | + PS2_CONTROL_TX_ENABLE | + PS2_CONTROL_RX_INT_ENABLE; + + return 0; +} + +static void maceps2_close(struct serio *dev) +{ + struct maceps2_data *data = (struct maceps2_data *)dev->port_data; + + data->port->control = PS2_CONTROL_TX_CLOCK_DISABLE | PS2_CONTROL_RESET; + udelay(100); + free_irq(data->irq, dev); +} + + +static struct serio *maceps2_allocate_port(int idx) +{ + struct serio *serio; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (serio) { + serio->id.type = SERIO_8042; + serio->write = maceps2_write; + serio->open = maceps2_open; + serio->close = maceps2_close; + snprintf(serio->name, sizeof(serio->name), "MACE PS/2 port%d", idx); + snprintf(serio->phys, sizeof(serio->phys), "mace/serio%d", idx); + serio->port_data = &port_data[idx]; + serio->dev.parent = &maceps2_device->dev; + } + + return serio; +} + +static int maceps2_probe(struct platform_device *dev) +{ + maceps2_port[0] = maceps2_allocate_port(0); + maceps2_port[1] = maceps2_allocate_port(1); + if (!maceps2_port[0] || !maceps2_port[1]) { + kfree(maceps2_port[0]); + kfree(maceps2_port[1]); + return -ENOMEM; + } + + serio_register_port(maceps2_port[0]); + serio_register_port(maceps2_port[1]); + + return 0; +} + +static int maceps2_remove(struct platform_device *dev) +{ + serio_unregister_port(maceps2_port[0]); + serio_unregister_port(maceps2_port[1]); + + return 0; +} + +static struct platform_driver maceps2_driver = { + .driver = { + .name = "maceps2", + .owner = THIS_MODULE, + }, + .probe = maceps2_probe, + .remove = maceps2_remove, +}; + +static int __init maceps2_init(void) +{ + int error; + + error = platform_driver_register(&maceps2_driver); + if (error) + return error; + + maceps2_device = platform_device_alloc("maceps2", -1); + if (!maceps2_device) { + error = -ENOMEM; + goto err_unregister_driver; + } + + port_data[0].port = &mace->perif.ps2.keyb; + port_data[0].irq = MACEISA_KEYB_IRQ; + port_data[1].port = &mace->perif.ps2.mouse; + port_data[1].irq = MACEISA_MOUSE_IRQ; + + error = platform_device_add(maceps2_device); + if (error) + goto err_free_device; + + return 0; + + err_free_device: + platform_device_put(maceps2_device); + err_unregister_driver: + platform_driver_unregister(&maceps2_driver); + return error; +} + +static void __exit maceps2_exit(void) +{ + platform_device_unregister(maceps2_device); + platform_driver_unregister(&maceps2_driver); +} + +module_init(maceps2_init); +module_exit(maceps2_exit); diff --git a/drivers/input/serio/parkbd.c b/drivers/input/serio/parkbd.c new file mode 100644 index 00000000..26b45936 --- /dev/null +++ b/drivers/input/serio/parkbd.c @@ -0,0 +1,218 @@ +/* + * Parallel port to Keyboard port adapter driver for Linux + * + * Copyright (c) 1999-2004 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * To connect an AT or XT keyboard to the parallel port, a fairly simple adapter + * can be made: + * + * Parallel port Keyboard port + * + * +5V --------------------- +5V (4) + * + * ______ + * +5V -------|______|--. + * | + * ACK (10) ------------| + * |--- KBD CLOCK (5) + * STROBE (1) ---|<|----' + * + * ______ + * +5V -------|______|--. + * | + * BUSY (11) -----------| + * |--- KBD DATA (1) + * AUTOFD (14) --|<|----' + * + * GND (18-25) ------------- GND (3) + * + * The diodes can be fairly any type, and the resistors should be somewhere + * around 5 kOhm, but the adapter will likely work without the resistors, + * too. + * + * The +5V source can be taken either from USB, from mouse or keyboard ports, + * or from a joystick port. Unfortunately, the parallel port of a PC doesn't + * have a +5V pin, and feeding the keyboard from signal pins is out of question + * with 300 mA power reqirement of a typical AT keyboard. + */ + +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Parallel port to Keyboard port adapter driver"); +MODULE_LICENSE("GPL"); + +static unsigned int parkbd_pp_no; +module_param_named(port, parkbd_pp_no, int, 0); +MODULE_PARM_DESC(port, "Parallel port the adapter is connected to (default is 0)"); + +static unsigned int parkbd_mode = SERIO_8042; +module_param_named(mode, parkbd_mode, uint, 0); +MODULE_PARM_DESC(mode, "Mode of operation: XT = 0/AT = 1 (default)"); + +#define PARKBD_CLOCK 0x01 /* Strobe & Ack */ +#define PARKBD_DATA 0x02 /* AutoFd & Busy */ + +static int parkbd_buffer; +static int parkbd_counter; +static unsigned long parkbd_last; +static int parkbd_writing; +static unsigned long parkbd_start; + +static struct pardevice *parkbd_dev; +static struct serio *parkbd_port; + +static int parkbd_readlines(void) +{ + return (parport_read_status(parkbd_dev->port) >> 6) ^ 2; +} + +static void parkbd_writelines(int data) +{ + parport_write_control(parkbd_dev->port, (~data & 3) | 0x10); +} + +static int parkbd_write(struct serio *port, unsigned char c) +{ + unsigned char p; + + if (!parkbd_mode) return -1; + + p = c ^ (c >> 4); + p = p ^ (p >> 2); + p = p ^ (p >> 1); + + parkbd_counter = 0; + parkbd_writing = 1; + parkbd_buffer = c | (((int) (~p & 1)) << 8) | 0x600; + + parkbd_writelines(2); + + return 0; +} + +static void parkbd_interrupt(void *dev_id) +{ + + if (parkbd_writing) { + + if (parkbd_counter && ((parkbd_counter == 11) || time_after(jiffies, parkbd_last + HZ/100))) { + parkbd_counter = 0; + parkbd_buffer = 0; + parkbd_writing = 0; + parkbd_writelines(3); + return; + } + + parkbd_writelines(((parkbd_buffer >> parkbd_counter++) & 1) | 2); + + if (parkbd_counter == 11) { + parkbd_counter = 0; + parkbd_buffer = 0; + parkbd_writing = 0; + parkbd_writelines(3); + } + + } else { + + if ((parkbd_counter == parkbd_mode + 10) || time_after(jiffies, parkbd_last + HZ/100)) { + parkbd_counter = 0; + parkbd_buffer = 0; + } + + parkbd_buffer |= (parkbd_readlines() >> 1) << parkbd_counter++; + + if (parkbd_counter == parkbd_mode + 10) + serio_interrupt(parkbd_port, (parkbd_buffer >> (2 - parkbd_mode)) & 0xff, 0); + } + + parkbd_last = jiffies; +} + +static int parkbd_getport(void) +{ + struct parport *pp; + + pp = parport_find_number(parkbd_pp_no); + + if (pp == NULL) { + printk(KERN_ERR "parkbd: no such parport\n"); + return -ENODEV; + } + + parkbd_dev = parport_register_device(pp, "parkbd", NULL, NULL, parkbd_interrupt, PARPORT_DEV_EXCL, NULL); + parport_put_port(pp); + + if (!parkbd_dev) + return -ENODEV; + + if (parport_claim(parkbd_dev)) { + parport_unregister_device(parkbd_dev); + return -EBUSY; + } + + parkbd_start = jiffies; + + return 0; +} + +static struct serio * __init parkbd_allocate_serio(void) +{ + struct serio *serio; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (serio) { + serio->id.type = parkbd_mode; + serio->write = parkbd_write, + strlcpy(serio->name, "PARKBD AT/XT keyboard adapter", sizeof(serio->name)); + snprintf(serio->phys, sizeof(serio->phys), "%s/serio0", parkbd_dev->port->name); + } + + return serio; +} + +static int __init parkbd_init(void) +{ + int err; + + err = parkbd_getport(); + if (err) + return err; + + parkbd_port = parkbd_allocate_serio(); + if (!parkbd_port) { + parport_release(parkbd_dev); + return -ENOMEM; + } + + parkbd_writelines(3); + + serio_register_port(parkbd_port); + + printk(KERN_INFO "serio: PARKBD %s adapter on %s\n", + parkbd_mode ? "AT" : "XT", parkbd_dev->port->name); + + return 0; +} + +static void __exit parkbd_exit(void) +{ + parport_release(parkbd_dev); + serio_unregister_port(parkbd_port); + parport_unregister_device(parkbd_dev); +} + +module_init(parkbd_init); +module_exit(parkbd_exit); diff --git a/drivers/input/serio/pcips2.c b/drivers/input/serio/pcips2.c new file mode 100644 index 00000000..76f83836 --- /dev/null +++ b/drivers/input/serio/pcips2.c @@ -0,0 +1,222 @@ +/* + * linux/drivers/input/serio/pcips2.c + * + * Copyright (C) 2003 Russell King, 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 as published by + * the Free Software Foundation; either version 2 of the License. + * + * I'm not sure if this is a generic PS/2 PCI interface or specific to + * the Mobility Electronics docking station. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PS2_CTRL (0) +#define PS2_STATUS (1) +#define PS2_DATA (2) + +#define PS2_CTRL_CLK (1<<0) +#define PS2_CTRL_DAT (1<<1) +#define PS2_CTRL_TXIRQ (1<<2) +#define PS2_CTRL_ENABLE (1<<3) +#define PS2_CTRL_RXIRQ (1<<4) + +#define PS2_STAT_CLK (1<<0) +#define PS2_STAT_DAT (1<<1) +#define PS2_STAT_PARITY (1<<2) +#define PS2_STAT_RXFULL (1<<5) +#define PS2_STAT_TXBUSY (1<<6) +#define PS2_STAT_TXEMPTY (1<<7) + +struct pcips2_data { + struct serio *io; + unsigned int base; + struct pci_dev *dev; +}; + +static int pcips2_write(struct serio *io, unsigned char val) +{ + struct pcips2_data *ps2if = io->port_data; + unsigned int stat; + + do { + stat = inb(ps2if->base + PS2_STATUS); + cpu_relax(); + } while (!(stat & PS2_STAT_TXEMPTY)); + + outb(val, ps2if->base + PS2_DATA); + + return 0; +} + +static irqreturn_t pcips2_interrupt(int irq, void *devid) +{ + struct pcips2_data *ps2if = devid; + unsigned char status, scancode; + int handled = 0; + + do { + unsigned int flag; + + status = inb(ps2if->base + PS2_STATUS); + if (!(status & PS2_STAT_RXFULL)) + break; + handled = 1; + scancode = inb(ps2if->base + PS2_DATA); + if (status == 0xff && scancode == 0xff) + break; + + flag = (status & PS2_STAT_PARITY) ? 0 : SERIO_PARITY; + + if (hweight8(scancode) & 1) + flag ^= SERIO_PARITY; + + serio_interrupt(ps2if->io, scancode, flag); + } while (1); + return IRQ_RETVAL(handled); +} + +static void pcips2_flush_input(struct pcips2_data *ps2if) +{ + unsigned char status, scancode; + + do { + status = inb(ps2if->base + PS2_STATUS); + if (!(status & PS2_STAT_RXFULL)) + break; + scancode = inb(ps2if->base + PS2_DATA); + if (status == 0xff && scancode == 0xff) + break; + } while (1); +} + +static int pcips2_open(struct serio *io) +{ + struct pcips2_data *ps2if = io->port_data; + int ret, val = 0; + + outb(PS2_CTRL_ENABLE, ps2if->base); + pcips2_flush_input(ps2if); + + ret = request_irq(ps2if->dev->irq, pcips2_interrupt, IRQF_SHARED, + "pcips2", ps2if); + if (ret == 0) + val = PS2_CTRL_ENABLE | PS2_CTRL_RXIRQ; + + outb(val, ps2if->base); + + return ret; +} + +static void pcips2_close(struct serio *io) +{ + struct pcips2_data *ps2if = io->port_data; + + outb(0, ps2if->base); + + free_irq(ps2if->dev->irq, ps2if); +} + +static int pcips2_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + struct pcips2_data *ps2if; + struct serio *serio; + int ret; + + ret = pci_enable_device(dev); + if (ret) + goto out; + + ret = pci_request_regions(dev, "pcips2"); + if (ret) + goto disable; + + ps2if = kzalloc(sizeof(struct pcips2_data), GFP_KERNEL); + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!ps2if || !serio) { + ret = -ENOMEM; + goto release; + } + + + serio->id.type = SERIO_8042; + serio->write = pcips2_write; + serio->open = pcips2_open; + serio->close = pcips2_close; + strlcpy(serio->name, pci_name(dev), sizeof(serio->name)); + strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys)); + serio->port_data = ps2if; + serio->dev.parent = &dev->dev; + ps2if->io = serio; + ps2if->dev = dev; + ps2if->base = pci_resource_start(dev, 0); + + pci_set_drvdata(dev, ps2if); + + serio_register_port(ps2if->io); + return 0; + + release: + kfree(ps2if); + kfree(serio); + pci_release_regions(dev); + disable: + pci_disable_device(dev); + out: + return ret; +} + +static void pcips2_remove(struct pci_dev *dev) +{ + struct pcips2_data *ps2if = pci_get_drvdata(dev); + + serio_unregister_port(ps2if->io); + pci_set_drvdata(dev, NULL); + kfree(ps2if); + pci_release_regions(dev); + pci_disable_device(dev); +} + +static const struct pci_device_id pcips2_ids[] = { + { + .vendor = 0x14f2, /* MOBILITY */ + .device = 0x0123, /* Keyboard */ + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .class = PCI_CLASS_INPUT_KEYBOARD << 8, + .class_mask = 0xffff00, + }, + { + .vendor = 0x14f2, /* MOBILITY */ + .device = 0x0124, /* Mouse */ + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .class = PCI_CLASS_INPUT_MOUSE << 8, + .class_mask = 0xffff00, + }, + { 0, } +}; +MODULE_DEVICE_TABLE(pci, pcips2_ids); + +static struct pci_driver pcips2_driver = { + .name = "pcips2", + .id_table = pcips2_ids, + .probe = pcips2_probe, + .remove = pcips2_remove, +}; + +module_pci_driver(pcips2_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Russell King "); +MODULE_DESCRIPTION("PCI PS/2 keyboard/mouse driver"); diff --git a/drivers/input/serio/ps2mult.c b/drivers/input/serio/ps2mult.c new file mode 100644 index 00000000..a76fb64f --- /dev/null +++ b/drivers/input/serio/ps2mult.c @@ -0,0 +1,307 @@ +/* + * TQC PS/2 Multiplexer driver + * + * Copyright (C) 2010 Dmitry Eremin-Solenikov + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + + +#include +#include +#include +#include + +MODULE_AUTHOR("Dmitry Eremin-Solenikov "); +MODULE_DESCRIPTION("TQC PS/2 Multiplexer driver"); +MODULE_LICENSE("GPL"); + +#define PS2MULT_KB_SELECTOR 0xA0 +#define PS2MULT_MS_SELECTOR 0xA1 +#define PS2MULT_ESCAPE 0x7D +#define PS2MULT_BSYNC 0x7E +#define PS2MULT_SESSION_START 0x55 +#define PS2MULT_SESSION_END 0x56 + +struct ps2mult_port { + struct serio *serio; + unsigned char sel; + bool registered; +}; + +#define PS2MULT_NUM_PORTS 2 +#define PS2MULT_KBD_PORT 0 +#define PS2MULT_MOUSE_PORT 1 + +struct ps2mult { + struct serio *mx_serio; + struct ps2mult_port ports[PS2MULT_NUM_PORTS]; + + spinlock_t lock; + struct ps2mult_port *in_port; + struct ps2mult_port *out_port; + bool escape; +}; + +/* First MUST come PS2MULT_NUM_PORTS selectors */ +static const unsigned char ps2mult_controls[] = { + PS2MULT_KB_SELECTOR, PS2MULT_MS_SELECTOR, + PS2MULT_ESCAPE, PS2MULT_BSYNC, + PS2MULT_SESSION_START, PS2MULT_SESSION_END, +}; + +static const struct serio_device_id ps2mult_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_PS2MULT, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, ps2mult_serio_ids); + +static void ps2mult_select_port(struct ps2mult *psm, struct ps2mult_port *port) +{ + struct serio *mx_serio = psm->mx_serio; + + serio_write(mx_serio, port->sel); + psm->out_port = port; + dev_dbg(&mx_serio->dev, "switched to sel %02x\n", port->sel); +} + +static int ps2mult_serio_write(struct serio *serio, unsigned char data) +{ + struct serio *mx_port = serio->parent; + struct ps2mult *psm = serio_get_drvdata(mx_port); + struct ps2mult_port *port = serio->port_data; + bool need_escape; + unsigned long flags; + + spin_lock_irqsave(&psm->lock, flags); + + if (psm->out_port != port) + ps2mult_select_port(psm, port); + + need_escape = memchr(ps2mult_controls, data, sizeof(ps2mult_controls)); + + dev_dbg(&serio->dev, + "write: %s%02x\n", need_escape ? "ESC " : "", data); + + if (need_escape) + serio_write(mx_port, PS2MULT_ESCAPE); + + serio_write(mx_port, data); + + spin_unlock_irqrestore(&psm->lock, flags); + + return 0; +} + +static int ps2mult_serio_start(struct serio *serio) +{ + struct ps2mult *psm = serio_get_drvdata(serio->parent); + struct ps2mult_port *port = serio->port_data; + unsigned long flags; + + spin_lock_irqsave(&psm->lock, flags); + port->registered = true; + spin_unlock_irqrestore(&psm->lock, flags); + + return 0; +} + +static void ps2mult_serio_stop(struct serio *serio) +{ + struct ps2mult *psm = serio_get_drvdata(serio->parent); + struct ps2mult_port *port = serio->port_data; + unsigned long flags; + + spin_lock_irqsave(&psm->lock, flags); + port->registered = false; + spin_unlock_irqrestore(&psm->lock, flags); +} + +static int ps2mult_create_port(struct ps2mult *psm, int i) +{ + struct serio *mx_serio = psm->mx_serio; + struct serio *serio; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!serio) + return -ENOMEM; + + strlcpy(serio->name, "TQC PS/2 Multiplexer", sizeof(serio->name)); + snprintf(serio->phys, sizeof(serio->phys), + "%s/port%d", mx_serio->phys, i); + serio->id.type = SERIO_8042; + serio->write = ps2mult_serio_write; + serio->start = ps2mult_serio_start; + serio->stop = ps2mult_serio_stop; + serio->parent = psm->mx_serio; + serio->port_data = &psm->ports[i]; + + psm->ports[i].serio = serio; + + return 0; +} + +static void ps2mult_reset(struct ps2mult *psm) +{ + unsigned long flags; + + spin_lock_irqsave(&psm->lock, flags); + + serio_write(psm->mx_serio, PS2MULT_SESSION_END); + serio_write(psm->mx_serio, PS2MULT_SESSION_START); + + ps2mult_select_port(psm, &psm->ports[PS2MULT_KBD_PORT]); + + spin_unlock_irqrestore(&psm->lock, flags); +} + +static int ps2mult_connect(struct serio *serio, struct serio_driver *drv) +{ + struct ps2mult *psm; + int i; + int error; + + if (!serio->write) + return -EINVAL; + + psm = kzalloc(sizeof(*psm), GFP_KERNEL); + if (!psm) + return -ENOMEM; + + spin_lock_init(&psm->lock); + psm->mx_serio = serio; + + for (i = 0; i < PS2MULT_NUM_PORTS; i++) { + psm->ports[i].sel = ps2mult_controls[i]; + error = ps2mult_create_port(psm, i); + if (error) + goto err_out; + } + + psm->in_port = psm->out_port = &psm->ports[PS2MULT_KBD_PORT]; + + serio_set_drvdata(serio, psm); + error = serio_open(serio, drv); + if (error) + goto err_out; + + ps2mult_reset(psm); + + for (i = 0; i < PS2MULT_NUM_PORTS; i++) { + struct serio *s = psm->ports[i].serio; + + dev_info(&serio->dev, "%s port at %s\n", s->name, serio->phys); + serio_register_port(s); + } + + return 0; + +err_out: + while (--i >= 0) + kfree(psm->ports[i].serio); + kfree(psm); + return error; +} + +static void ps2mult_disconnect(struct serio *serio) +{ + struct ps2mult *psm = serio_get_drvdata(serio); + + /* Note that serio core already take care of children ports */ + serio_write(serio, PS2MULT_SESSION_END); + serio_close(serio); + kfree(psm); + + serio_set_drvdata(serio, NULL); +} + +static int ps2mult_reconnect(struct serio *serio) +{ + struct ps2mult *psm = serio_get_drvdata(serio); + + ps2mult_reset(psm); + + return 0; +} + +static irqreturn_t ps2mult_interrupt(struct serio *serio, + unsigned char data, unsigned int dfl) +{ + struct ps2mult *psm = serio_get_drvdata(serio); + struct ps2mult_port *in_port; + unsigned long flags; + + dev_dbg(&serio->dev, "Received %02x flags %02x\n", data, dfl); + + spin_lock_irqsave(&psm->lock, flags); + + if (psm->escape) { + psm->escape = false; + in_port = psm->in_port; + if (in_port->registered) + serio_interrupt(in_port->serio, data, dfl); + goto out; + } + + switch (data) { + case PS2MULT_ESCAPE: + dev_dbg(&serio->dev, "ESCAPE\n"); + psm->escape = true; + break; + + case PS2MULT_BSYNC: + dev_dbg(&serio->dev, "BSYNC\n"); + psm->in_port = psm->out_port; + break; + + case PS2MULT_SESSION_START: + dev_dbg(&serio->dev, "SS\n"); + break; + + case PS2MULT_SESSION_END: + dev_dbg(&serio->dev, "SE\n"); + break; + + case PS2MULT_KB_SELECTOR: + dev_dbg(&serio->dev, "KB\n"); + psm->in_port = &psm->ports[PS2MULT_KBD_PORT]; + break; + + case PS2MULT_MS_SELECTOR: + dev_dbg(&serio->dev, "MS\n"); + psm->in_port = &psm->ports[PS2MULT_MOUSE_PORT]; + break; + + default: + in_port = psm->in_port; + if (in_port->registered) + serio_interrupt(in_port->serio, data, dfl); + break; + } + + out: + spin_unlock_irqrestore(&psm->lock, flags); + return IRQ_HANDLED; +} + +static struct serio_driver ps2mult_drv = { + .driver = { + .name = "ps2mult", + }, + .description = "TQC PS/2 Multiplexer driver", + .id_table = ps2mult_serio_ids, + .interrupt = ps2mult_interrupt, + .connect = ps2mult_connect, + .disconnect = ps2mult_disconnect, + .reconnect = ps2mult_reconnect, +}; + +module_serio_driver(ps2mult_drv); diff --git a/drivers/input/serio/q40kbd.c b/drivers/input/serio/q40kbd.c new file mode 100644 index 00000000..436a3433 --- /dev/null +++ b/drivers/input/serio/q40kbd.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + * + * Based on the work of: + * Richard Zidlicky + */ + +/* + * Q40 PS/2 keyboard controller driver for Linux/m68k + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define DRV_NAME "q40kbd" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Q40 PS/2 keyboard controller driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRV_NAME); + +struct q40kbd { + struct serio *port; + spinlock_t lock; +}; + +static irqreturn_t q40kbd_interrupt(int irq, void *dev_id) +{ + struct q40kbd *q40kbd = dev_id; + unsigned long flags; + + spin_lock_irqsave(&q40kbd->lock, flags); + + if (Q40_IRQ_KEYB_MASK & master_inb(INTERRUPT_REG)) + serio_interrupt(q40kbd->port, master_inb(KEYCODE_REG), 0); + + master_outb(-1, KEYBOARD_UNLOCK_REG); + + spin_unlock_irqrestore(&q40kbd->lock, flags); + + return IRQ_HANDLED; +} + +/* + * q40kbd_flush() flushes all data that may be in the keyboard buffers + */ + +static void q40kbd_flush(struct q40kbd *q40kbd) +{ + int maxread = 100; + unsigned long flags; + + spin_lock_irqsave(&q40kbd->lock, flags); + + while (maxread-- && (Q40_IRQ_KEYB_MASK & master_inb(INTERRUPT_REG))) + master_inb(KEYCODE_REG); + + spin_unlock_irqrestore(&q40kbd->lock, flags); +} + +static void q40kbd_stop(void) +{ + master_outb(0, KEY_IRQ_ENABLE_REG); + master_outb(-1, KEYBOARD_UNLOCK_REG); +} + +/* + * q40kbd_open() is called when a port is open by the higher layer. + * It allocates the interrupt and enables in in the chip. + */ + +static int q40kbd_open(struct serio *port) +{ + struct q40kbd *q40kbd = port->port_data; + + q40kbd_flush(q40kbd); + + /* off we go */ + master_outb(-1, KEYBOARD_UNLOCK_REG); + master_outb(1, KEY_IRQ_ENABLE_REG); + + return 0; +} + +static void q40kbd_close(struct serio *port) +{ + struct q40kbd *q40kbd = port->port_data; + + q40kbd_stop(); + q40kbd_flush(q40kbd); +} + +static int q40kbd_probe(struct platform_device *pdev) +{ + struct q40kbd *q40kbd; + struct serio *port; + int error; + + q40kbd = kzalloc(sizeof(struct q40kbd), GFP_KERNEL); + port = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!q40kbd || !port) { + error = -ENOMEM; + goto err_free_mem; + } + + q40kbd->port = port; + spin_lock_init(&q40kbd->lock); + + port->id.type = SERIO_8042; + port->open = q40kbd_open; + port->close = q40kbd_close; + port->port_data = q40kbd; + port->dev.parent = &pdev->dev; + strlcpy(port->name, "Q40 Kbd Port", sizeof(port->name)); + strlcpy(port->phys, "Q40", sizeof(port->phys)); + + q40kbd_stop(); + + error = request_irq(Q40_IRQ_KEYBOARD, q40kbd_interrupt, 0, + DRV_NAME, q40kbd); + if (error) { + dev_err(&pdev->dev, "Can't get irq %d.\n", Q40_IRQ_KEYBOARD); + goto err_free_mem; + } + + serio_register_port(q40kbd->port); + + platform_set_drvdata(pdev, q40kbd); + printk(KERN_INFO "serio: Q40 kbd registered\n"); + + return 0; + +err_free_mem: + kfree(port); + kfree(q40kbd); + return error; +} + +static int q40kbd_remove(struct platform_device *pdev) +{ + struct q40kbd *q40kbd = platform_get_drvdata(pdev); + + /* + * q40kbd_close() will be called as part of unregistering + * and will ensure that IRQ is turned off, so it is safe + * to unregister port first and free IRQ later. + */ + serio_unregister_port(q40kbd->port); + free_irq(Q40_IRQ_KEYBOARD, q40kbd); + kfree(q40kbd); + + platform_set_drvdata(pdev, NULL); + return 0; +} + +static struct platform_driver q40kbd_driver = { + .driver = { + .name = "q40kbd", + .owner = THIS_MODULE, + }, + .remove = q40kbd_remove, +}; + +module_platform_driver_probe(q40kbd_driver, q40kbd_probe); diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c new file mode 100644 index 00000000..567566ae --- /dev/null +++ b/drivers/input/serio/rpckbd.c @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + * Copyright (c) 2002 Russell King + */ + +/* + * Acorn RiscPC PS/2 keyboard controller driver for Linux/ARM + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik, Russell King"); +MODULE_DESCRIPTION("Acorn RiscPC PS/2 keyboard controller driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:kart"); + +struct rpckbd_data { + int tx_irq; + int rx_irq; +}; + +static int rpckbd_write(struct serio *port, unsigned char val) +{ + while (!(iomd_readb(IOMD_KCTRL) & (1 << 7))) + cpu_relax(); + + iomd_writeb(val, IOMD_KARTTX); + + return 0; +} + +static irqreturn_t rpckbd_rx(int irq, void *dev_id) +{ + struct serio *port = dev_id; + unsigned int byte; + int handled = IRQ_NONE; + + while (iomd_readb(IOMD_KCTRL) & (1 << 5)) { + byte = iomd_readb(IOMD_KARTRX); + + serio_interrupt(port, byte, 0); + handled = IRQ_HANDLED; + } + return handled; +} + +static irqreturn_t rpckbd_tx(int irq, void *dev_id) +{ + return IRQ_HANDLED; +} + +static int rpckbd_open(struct serio *port) +{ + struct rpckbd_data *rpckbd = port->port_data; + + /* Reset the keyboard state machine. */ + iomd_writeb(0, IOMD_KCTRL); + iomd_writeb(8, IOMD_KCTRL); + iomd_readb(IOMD_KARTRX); + + if (request_irq(rpckbd->rx_irq, rpckbd_rx, 0, "rpckbd", port) != 0) { + printk(KERN_ERR "rpckbd.c: Could not allocate keyboard receive IRQ\n"); + return -EBUSY; + } + + if (request_irq(rpckbd->tx_irq, rpckbd_tx, 0, "rpckbd", port) != 0) { + printk(KERN_ERR "rpckbd.c: Could not allocate keyboard transmit IRQ\n"); + free_irq(rpckbd->rx_irq, port); + return -EBUSY; + } + + return 0; +} + +static void rpckbd_close(struct serio *port) +{ + struct rpckbd_data *rpckbd = port->port_data; + + free_irq(rpckbd->rx_irq, port); + free_irq(rpckbd->tx_irq, port); +} + +/* + * Allocate and initialize serio structure for subsequent registration + * with serio core. + */ +static int rpckbd_probe(struct platform_device *dev) +{ + struct rpckbd_data *rpckbd; + struct serio *serio; + int tx_irq, rx_irq; + + rx_irq = platform_get_irq(dev, 0); + if (rx_irq <= 0) + return rx_irq < 0 ? rx_irq : -ENXIO; + + tx_irq = platform_get_irq(dev, 1); + if (tx_irq <= 0) + return tx_irq < 0 ? tx_irq : -ENXIO; + + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + rpckbd = kzalloc(sizeof(*rpckbd), GFP_KERNEL); + if (!serio || !rpckbd) { + kfree(rpckbd); + kfree(serio); + return -ENOMEM; + } + + rpckbd->rx_irq = rx_irq; + rpckbd->tx_irq = tx_irq; + + serio->id.type = SERIO_8042; + serio->write = rpckbd_write; + serio->open = rpckbd_open; + serio->close = rpckbd_close; + serio->dev.parent = &dev->dev; + serio->port_data = rpckbd; + strlcpy(serio->name, "RiscPC PS/2 kbd port", sizeof(serio->name)); + strlcpy(serio->phys, "rpckbd/serio0", sizeof(serio->phys)); + + platform_set_drvdata(dev, serio); + serio_register_port(serio); + return 0; +} + +static int rpckbd_remove(struct platform_device *dev) +{ + struct serio *serio = platform_get_drvdata(dev); + struct rpckbd_data *rpckbd = serio->port_data; + + serio_unregister_port(serio); + kfree(rpckbd); + + return 0; +} + +static struct platform_driver rpckbd_driver = { + .probe = rpckbd_probe, + .remove = rpckbd_remove, + .driver = { + .name = "kart", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(rpckbd_driver); diff --git a/drivers/input/serio/sa1111ps2.c b/drivers/input/serio/sa1111ps2.c new file mode 100644 index 00000000..b3e68891 --- /dev/null +++ b/drivers/input/serio/sa1111ps2.c @@ -0,0 +1,378 @@ +/* + * linux/drivers/input/serio/sa1111ps2.c + * + * Copyright (C) 2002 Russell King + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#define PS2CR 0x0000 +#define PS2STAT 0x0004 +#define PS2DATA 0x0008 +#define PS2CLKDIV 0x000c +#define PS2PRECNT 0x0010 + +#define PS2CR_ENA 0x08 +#define PS2CR_FKD 0x02 +#define PS2CR_FKC 0x01 + +#define PS2STAT_STP 0x0100 +#define PS2STAT_TXE 0x0080 +#define PS2STAT_TXB 0x0040 +#define PS2STAT_RXF 0x0020 +#define PS2STAT_RXB 0x0010 +#define PS2STAT_ENA 0x0008 +#define PS2STAT_RXP 0x0004 +#define PS2STAT_KBD 0x0002 +#define PS2STAT_KBC 0x0001 + +struct ps2if { + struct serio *io; + struct sa1111_dev *dev; + void __iomem *base; + unsigned int open; + spinlock_t lock; + unsigned int head; + unsigned int tail; + unsigned char buf[4]; +}; + +/* + * Read all bytes waiting in the PS2 port. There should be + * at the most one, but we loop for safety. If there was a + * framing error, we have to manually clear the status. + */ +static irqreturn_t ps2_rxint(int irq, void *dev_id) +{ + struct ps2if *ps2if = dev_id; + unsigned int scancode, flag, status; + + status = sa1111_readl(ps2if->base + PS2STAT); + while (status & PS2STAT_RXF) { + if (status & PS2STAT_STP) + sa1111_writel(PS2STAT_STP, ps2if->base + PS2STAT); + + flag = (status & PS2STAT_STP ? SERIO_FRAME : 0) | + (status & PS2STAT_RXP ? 0 : SERIO_PARITY); + + scancode = sa1111_readl(ps2if->base + PS2DATA) & 0xff; + + if (hweight8(scancode) & 1) + flag ^= SERIO_PARITY; + + serio_interrupt(ps2if->io, scancode, flag); + + status = sa1111_readl(ps2if->base + PS2STAT); + } + + return IRQ_HANDLED; +} + +/* + * Completion of ps2 write + */ +static irqreturn_t ps2_txint(int irq, void *dev_id) +{ + struct ps2if *ps2if = dev_id; + unsigned int status; + + spin_lock(&ps2if->lock); + status = sa1111_readl(ps2if->base + PS2STAT); + if (ps2if->head == ps2if->tail) { + disable_irq_nosync(irq); + /* done */ + } else if (status & PS2STAT_TXE) { + sa1111_writel(ps2if->buf[ps2if->tail], ps2if->base + PS2DATA); + ps2if->tail = (ps2if->tail + 1) & (sizeof(ps2if->buf) - 1); + } + spin_unlock(&ps2if->lock); + + return IRQ_HANDLED; +} + +/* + * Write a byte to the PS2 port. We have to wait for the + * port to indicate that the transmitter is empty. + */ +static int ps2_write(struct serio *io, unsigned char val) +{ + struct ps2if *ps2if = io->port_data; + unsigned long flags; + unsigned int head; + + spin_lock_irqsave(&ps2if->lock, flags); + + /* + * If the TX register is empty, we can go straight out. + */ + if (sa1111_readl(ps2if->base + PS2STAT) & PS2STAT_TXE) { + sa1111_writel(val, ps2if->base + PS2DATA); + } else { + if (ps2if->head == ps2if->tail) + enable_irq(ps2if->dev->irq[1]); + head = (ps2if->head + 1) & (sizeof(ps2if->buf) - 1); + if (head != ps2if->tail) { + ps2if->buf[ps2if->head] = val; + ps2if->head = head; + } + } + + spin_unlock_irqrestore(&ps2if->lock, flags); + return 0; +} + +static int ps2_open(struct serio *io) +{ + struct ps2if *ps2if = io->port_data; + int ret; + + ret = sa1111_enable_device(ps2if->dev); + if (ret) + return ret; + + ret = request_irq(ps2if->dev->irq[0], ps2_rxint, 0, + SA1111_DRIVER_NAME(ps2if->dev), ps2if); + if (ret) { + printk(KERN_ERR "sa1111ps2: could not allocate IRQ%d: %d\n", + ps2if->dev->irq[0], ret); + sa1111_disable_device(ps2if->dev); + return ret; + } + + ret = request_irq(ps2if->dev->irq[1], ps2_txint, 0, + SA1111_DRIVER_NAME(ps2if->dev), ps2if); + if (ret) { + printk(KERN_ERR "sa1111ps2: could not allocate IRQ%d: %d\n", + ps2if->dev->irq[1], ret); + free_irq(ps2if->dev->irq[0], ps2if); + sa1111_disable_device(ps2if->dev); + return ret; + } + + ps2if->open = 1; + + enable_irq_wake(ps2if->dev->irq[0]); + + sa1111_writel(PS2CR_ENA, ps2if->base + PS2CR); + return 0; +} + +static void ps2_close(struct serio *io) +{ + struct ps2if *ps2if = io->port_data; + + sa1111_writel(0, ps2if->base + PS2CR); + + disable_irq_wake(ps2if->dev->irq[0]); + + ps2if->open = 0; + + free_irq(ps2if->dev->irq[1], ps2if); + free_irq(ps2if->dev->irq[0], ps2if); + + sa1111_disable_device(ps2if->dev); +} + +/* + * Clear the input buffer. + */ +static void ps2_clear_input(struct ps2if *ps2if) +{ + int maxread = 100; + + while (maxread--) { + if ((sa1111_readl(ps2if->base + PS2DATA) & 0xff) == 0xff) + break; + } +} + +static unsigned int ps2_test_one(struct ps2if *ps2if, + unsigned int mask) +{ + unsigned int val; + + sa1111_writel(PS2CR_ENA | mask, ps2if->base + PS2CR); + + udelay(2); + + val = sa1111_readl(ps2if->base + PS2STAT); + return val & (PS2STAT_KBC | PS2STAT_KBD); +} + +/* + * Test the keyboard interface. We basically check to make sure that + * we can drive each line to the keyboard independently of each other. + */ +static int ps2_test(struct ps2if *ps2if) +{ + unsigned int stat; + int ret = 0; + + stat = ps2_test_one(ps2if, PS2CR_FKC); + if (stat != PS2STAT_KBD) { + printk("PS/2 interface test failed[1]: %02x\n", stat); + ret = -ENODEV; + } + + stat = ps2_test_one(ps2if, 0); + if (stat != (PS2STAT_KBC | PS2STAT_KBD)) { + printk("PS/2 interface test failed[2]: %02x\n", stat); + ret = -ENODEV; + } + + stat = ps2_test_one(ps2if, PS2CR_FKD); + if (stat != PS2STAT_KBC) { + printk("PS/2 interface test failed[3]: %02x\n", stat); + ret = -ENODEV; + } + + sa1111_writel(0, ps2if->base + PS2CR); + + return ret; +} + +/* + * Add one device to this driver. + */ +static int ps2_probe(struct sa1111_dev *dev) +{ + struct ps2if *ps2if; + struct serio *serio; + int ret; + + ps2if = kzalloc(sizeof(struct ps2if), GFP_KERNEL); + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!ps2if || !serio) { + ret = -ENOMEM; + goto free; + } + + + serio->id.type = SERIO_8042; + serio->write = ps2_write; + serio->open = ps2_open; + serio->close = ps2_close; + strlcpy(serio->name, dev_name(&dev->dev), sizeof(serio->name)); + strlcpy(serio->phys, dev_name(&dev->dev), sizeof(serio->phys)); + serio->port_data = ps2if; + serio->dev.parent = &dev->dev; + ps2if->io = serio; + ps2if->dev = dev; + sa1111_set_drvdata(dev, ps2if); + + spin_lock_init(&ps2if->lock); + + /* + * Request the physical region for this PS2 port. + */ + if (!request_mem_region(dev->res.start, + dev->res.end - dev->res.start + 1, + SA1111_DRIVER_NAME(dev))) { + ret = -EBUSY; + goto free; + } + + /* + * Our parent device has already mapped the region. + */ + ps2if->base = dev->mapbase; + + sa1111_enable_device(ps2if->dev); + + /* Incoming clock is 8MHz */ + sa1111_writel(0, ps2if->base + PS2CLKDIV); + sa1111_writel(127, ps2if->base + PS2PRECNT); + + /* + * Flush any pending input. + */ + ps2_clear_input(ps2if); + + /* + * Test the keyboard interface. + */ + ret = ps2_test(ps2if); + if (ret) + goto out; + + /* + * Flush any pending input. + */ + ps2_clear_input(ps2if); + + sa1111_disable_device(ps2if->dev); + serio_register_port(ps2if->io); + return 0; + + out: + sa1111_disable_device(ps2if->dev); + release_mem_region(dev->res.start, resource_size(&dev->res)); + free: + sa1111_set_drvdata(dev, NULL); + kfree(ps2if); + kfree(serio); + return ret; +} + +/* + * Remove one device from this driver. + */ +static int ps2_remove(struct sa1111_dev *dev) +{ + struct ps2if *ps2if = sa1111_get_drvdata(dev); + + serio_unregister_port(ps2if->io); + release_mem_region(dev->res.start, resource_size(&dev->res)); + sa1111_set_drvdata(dev, NULL); + + kfree(ps2if); + + return 0; +} + +/* + * Our device driver structure + */ +static struct sa1111_driver ps2_driver = { + .drv = { + .name = "sa1111-ps2", + .owner = THIS_MODULE, + }, + .devid = SA1111_DEVID_PS2, + .probe = ps2_probe, + .remove = ps2_remove, +}; + +static int __init ps2_init(void) +{ + return sa1111_driver_register(&ps2_driver); +} + +static void __exit ps2_exit(void) +{ + sa1111_driver_unregister(&ps2_driver); +} + +module_init(ps2_init); +module_exit(ps2_exit); + +MODULE_AUTHOR("Russell King "); +MODULE_DESCRIPTION("SA1111 PS2 controller driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c new file mode 100644 index 00000000..25fc5971 --- /dev/null +++ b/drivers/input/serio/serio.c @@ -0,0 +1,1035 @@ +/* + * The Serio abstraction module + * + * Copyright (c) 1999-2004 Vojtech Pavlik + * Copyright (c) 2004 Dmitry Torokhov + * Copyright (c) 2003 Daniele Bellucci + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Serio abstraction core"); +MODULE_LICENSE("GPL"); + +/* + * serio_mutex protects entire serio subsystem and is taken every time + * serio port or driver registered or unregistered. + */ +static DEFINE_MUTEX(serio_mutex); + +static LIST_HEAD(serio_list); + +static struct bus_type serio_bus; + +static void serio_add_port(struct serio *serio); +static int serio_reconnect_port(struct serio *serio); +static void serio_disconnect_port(struct serio *serio); +static void serio_reconnect_subtree(struct serio *serio); +static void serio_attach_driver(struct serio_driver *drv); + +static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) +{ + int retval; + + mutex_lock(&serio->drv_mutex); + retval = drv->connect(serio, drv); + mutex_unlock(&serio->drv_mutex); + + return retval; +} + +static int serio_reconnect_driver(struct serio *serio) +{ + int retval = -1; + + mutex_lock(&serio->drv_mutex); + if (serio->drv && serio->drv->reconnect) + retval = serio->drv->reconnect(serio); + mutex_unlock(&serio->drv_mutex); + + return retval; +} + +static void serio_disconnect_driver(struct serio *serio) +{ + mutex_lock(&serio->drv_mutex); + if (serio->drv) + serio->drv->disconnect(serio); + mutex_unlock(&serio->drv_mutex); +} + +static int serio_match_port(const struct serio_device_id *ids, struct serio *serio) +{ + while (ids->type || ids->proto) { + if ((ids->type == SERIO_ANY || ids->type == serio->id.type) && + (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) && + (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) && + (ids->id == SERIO_ANY || ids->id == serio->id.id)) + return 1; + ids++; + } + return 0; +} + +/* + * Basic serio -> driver core mappings + */ + +static int serio_bind_driver(struct serio *serio, struct serio_driver *drv) +{ + int error; + + if (serio_match_port(drv->id_table, serio)) { + + serio->dev.driver = &drv->driver; + if (serio_connect_driver(serio, drv)) { + serio->dev.driver = NULL; + return -ENODEV; + } + + error = device_bind_driver(&serio->dev); + if (error) { + dev_warn(&serio->dev, + "device_bind_driver() failed for %s (%s) and %s, error: %d\n", + serio->phys, serio->name, + drv->description, error); + serio_disconnect_driver(serio); + serio->dev.driver = NULL; + return error; + } + } + return 0; +} + +static void serio_find_driver(struct serio *serio) +{ + int error; + + error = device_attach(&serio->dev); + if (error < 0) + dev_warn(&serio->dev, + "device_attach() failed for %s (%s), error: %d\n", + serio->phys, serio->name, error); +} + + +/* + * Serio event processing. + */ + +enum serio_event_type { + SERIO_RESCAN_PORT, + SERIO_RECONNECT_PORT, + SERIO_RECONNECT_SUBTREE, + SERIO_REGISTER_PORT, + SERIO_ATTACH_DRIVER, +}; + +struct serio_event { + enum serio_event_type type; + void *object; + struct module *owner; + struct list_head node; +}; + +static DEFINE_SPINLOCK(serio_event_lock); /* protects serio_event_list */ +static LIST_HEAD(serio_event_list); + +static struct serio_event *serio_get_event(void) +{ + struct serio_event *event = NULL; + unsigned long flags; + + spin_lock_irqsave(&serio_event_lock, flags); + + if (!list_empty(&serio_event_list)) { + event = list_first_entry(&serio_event_list, + struct serio_event, node); + list_del_init(&event->node); + } + + spin_unlock_irqrestore(&serio_event_lock, flags); + return event; +} + +static void serio_free_event(struct serio_event *event) +{ + module_put(event->owner); + kfree(event); +} + +static void serio_remove_duplicate_events(void *object, + enum serio_event_type type) +{ + struct serio_event *e, *next; + unsigned long flags; + + spin_lock_irqsave(&serio_event_lock, flags); + + list_for_each_entry_safe(e, next, &serio_event_list, node) { + if (object == e->object) { + /* + * If this event is of different type we should not + * look further - we only suppress duplicate events + * that were sent back-to-back. + */ + if (type != e->type) + break; + + list_del_init(&e->node); + serio_free_event(e); + } + } + + spin_unlock_irqrestore(&serio_event_lock, flags); +} + +static void serio_handle_event(struct work_struct *work) +{ + struct serio_event *event; + + mutex_lock(&serio_mutex); + + while ((event = serio_get_event())) { + + switch (event->type) { + + case SERIO_REGISTER_PORT: + serio_add_port(event->object); + break; + + case SERIO_RECONNECT_PORT: + serio_reconnect_port(event->object); + break; + + case SERIO_RESCAN_PORT: + serio_disconnect_port(event->object); + serio_find_driver(event->object); + break; + + case SERIO_RECONNECT_SUBTREE: + serio_reconnect_subtree(event->object); + break; + + case SERIO_ATTACH_DRIVER: + serio_attach_driver(event->object); + break; + } + + serio_remove_duplicate_events(event->object, event->type); + serio_free_event(event); + } + + mutex_unlock(&serio_mutex); +} + +static DECLARE_WORK(serio_event_work, serio_handle_event); + +static int serio_queue_event(void *object, struct module *owner, + enum serio_event_type event_type) +{ + unsigned long flags; + struct serio_event *event; + int retval = 0; + + spin_lock_irqsave(&serio_event_lock, flags); + + /* + * Scan event list for the other events for the same serio port, + * starting with the most recent one. If event is the same we + * do not need add new one. If event is of different type we + * need to add this event and should not look further because + * we need to preseve sequence of distinct events. + */ + list_for_each_entry_reverse(event, &serio_event_list, node) { + if (event->object == object) { + if (event->type == event_type) + goto out; + break; + } + } + + event = kmalloc(sizeof(struct serio_event), GFP_ATOMIC); + if (!event) { + pr_err("Not enough memory to queue event %d\n", event_type); + retval = -ENOMEM; + goto out; + } + + if (!try_module_get(owner)) { + pr_warning("Can't get module reference, dropping event %d\n", + event_type); + kfree(event); + retval = -EINVAL; + goto out; + } + + event->type = event_type; + event->object = object; + event->owner = owner; + + list_add_tail(&event->node, &serio_event_list); + queue_work(system_long_wq, &serio_event_work); + +out: + spin_unlock_irqrestore(&serio_event_lock, flags); + return retval; +} + +/* + * Remove all events that have been submitted for a given + * object, be it serio port or driver. + */ +static void serio_remove_pending_events(void *object) +{ + struct serio_event *event, *next; + unsigned long flags; + + spin_lock_irqsave(&serio_event_lock, flags); + + list_for_each_entry_safe(event, next, &serio_event_list, node) { + if (event->object == object) { + list_del_init(&event->node); + serio_free_event(event); + } + } + + spin_unlock_irqrestore(&serio_event_lock, flags); +} + +/* + * Locate child serio port (if any) that has not been fully registered yet. + * + * Children are registered by driver's connect() handler so there can't be a + * grandchild pending registration together with a child. + */ +static struct serio *serio_get_pending_child(struct serio *parent) +{ + struct serio_event *event; + struct serio *serio, *child = NULL; + unsigned long flags; + + spin_lock_irqsave(&serio_event_lock, flags); + + list_for_each_entry(event, &serio_event_list, node) { + if (event->type == SERIO_REGISTER_PORT) { + serio = event->object; + if (serio->parent == parent) { + child = serio; + break; + } + } + } + + spin_unlock_irqrestore(&serio_event_lock, flags); + return child; +} + +/* + * Serio port operations + */ + +static ssize_t serio_show_description(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + return sprintf(buf, "%s\n", serio->name); +} + +static ssize_t serio_show_modalias(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + + return sprintf(buf, "serio:ty%02Xpr%02Xid%02Xex%02X\n", + serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); +} + +static ssize_t serio_show_id_type(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + return sprintf(buf, "%02x\n", serio->id.type); +} + +static ssize_t serio_show_id_proto(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + return sprintf(buf, "%02x\n", serio->id.proto); +} + +static ssize_t serio_show_id_id(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + return sprintf(buf, "%02x\n", serio->id.id); +} + +static ssize_t serio_show_id_extra(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + return sprintf(buf, "%02x\n", serio->id.extra); +} + +static DEVICE_ATTR(type, S_IRUGO, serio_show_id_type, NULL); +static DEVICE_ATTR(proto, S_IRUGO, serio_show_id_proto, NULL); +static DEVICE_ATTR(id, S_IRUGO, serio_show_id_id, NULL); +static DEVICE_ATTR(extra, S_IRUGO, serio_show_id_extra, NULL); + +static struct attribute *serio_device_id_attrs[] = { + &dev_attr_type.attr, + &dev_attr_proto.attr, + &dev_attr_id.attr, + &dev_attr_extra.attr, + NULL +}; + +static struct attribute_group serio_id_attr_group = { + .name = "id", + .attrs = serio_device_id_attrs, +}; + +static const struct attribute_group *serio_device_attr_groups[] = { + &serio_id_attr_group, + NULL +}; + +static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct serio *serio = to_serio_port(dev); + struct device_driver *drv; + int error; + + error = mutex_lock_interruptible(&serio_mutex); + if (error) + return error; + + if (!strncmp(buf, "none", count)) { + serio_disconnect_port(serio); + } else if (!strncmp(buf, "reconnect", count)) { + serio_reconnect_subtree(serio); + } else if (!strncmp(buf, "rescan", count)) { + serio_disconnect_port(serio); + serio_find_driver(serio); + serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT); + } else if ((drv = driver_find(buf, &serio_bus)) != NULL) { + serio_disconnect_port(serio); + error = serio_bind_driver(serio, to_serio_driver(drv)); + serio_remove_duplicate_events(serio, SERIO_RESCAN_PORT); + } else { + error = -EINVAL; + } + + mutex_unlock(&serio_mutex); + + return error ? error : count; +} + +static ssize_t serio_show_bind_mode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct serio *serio = to_serio_port(dev); + return sprintf(buf, "%s\n", serio->manual_bind ? "manual" : "auto"); +} + +static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct serio *serio = to_serio_port(dev); + int retval; + + retval = count; + if (!strncmp(buf, "manual", count)) { + serio->manual_bind = true; + } else if (!strncmp(buf, "auto", count)) { + serio->manual_bind = false; + } else { + retval = -EINVAL; + } + + return retval; +} + +static struct device_attribute serio_device_attrs[] = { + __ATTR(description, S_IRUGO, serio_show_description, NULL), + __ATTR(modalias, S_IRUGO, serio_show_modalias, NULL), + __ATTR(drvctl, S_IWUSR, NULL, serio_rebind_driver), + __ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode), + __ATTR_NULL +}; + + +static void serio_release_port(struct device *dev) +{ + struct serio *serio = to_serio_port(dev); + + kfree(serio); + module_put(THIS_MODULE); +} + +/* + * Prepare serio port for registration. + */ +static void serio_init_port(struct serio *serio) +{ + static atomic_t serio_no = ATOMIC_INIT(0); + + __module_get(THIS_MODULE); + + INIT_LIST_HEAD(&serio->node); + INIT_LIST_HEAD(&serio->child_node); + INIT_LIST_HEAD(&serio->children); + spin_lock_init(&serio->lock); + mutex_init(&serio->drv_mutex); + device_initialize(&serio->dev); + dev_set_name(&serio->dev, "serio%ld", + (long)atomic_inc_return(&serio_no) - 1); + serio->dev.bus = &serio_bus; + serio->dev.release = serio_release_port; + serio->dev.groups = serio_device_attr_groups; + if (serio->parent) { + serio->dev.parent = &serio->parent->dev; + serio->depth = serio->parent->depth + 1; + } else + serio->depth = 0; + lockdep_set_subclass(&serio->lock, serio->depth); +} + +/* + * Complete serio port registration. + * Driver core will attempt to find appropriate driver for the port. + */ +static void serio_add_port(struct serio *serio) +{ + struct serio *parent = serio->parent; + int error; + + if (parent) { + serio_pause_rx(parent); + list_add_tail(&serio->child_node, &parent->children); + serio_continue_rx(parent); + } + + list_add_tail(&serio->node, &serio_list); + + if (serio->start) + serio->start(serio); + + error = device_add(&serio->dev); + if (error) + dev_err(&serio->dev, + "device_add() failed for %s (%s), error: %d\n", + serio->phys, serio->name, error); +} + +/* + * serio_destroy_port() completes unregistration process and removes + * port from the system + */ +static void serio_destroy_port(struct serio *serio) +{ + struct serio *child; + + while ((child = serio_get_pending_child(serio)) != NULL) { + serio_remove_pending_events(child); + put_device(&child->dev); + } + + if (serio->stop) + serio->stop(serio); + + if (serio->parent) { + serio_pause_rx(serio->parent); + list_del_init(&serio->child_node); + serio_continue_rx(serio->parent); + serio->parent = NULL; + } + + if (device_is_registered(&serio->dev)) + device_del(&serio->dev); + + list_del_init(&serio->node); + serio_remove_pending_events(serio); + put_device(&serio->dev); +} + +/* + * Reconnect serio port (re-initialize attached device). + * If reconnect fails (old device is no longer attached or + * there was no device to begin with) we do full rescan in + * hope of finding a driver for the port. + */ +static int serio_reconnect_port(struct serio *serio) +{ + int error = serio_reconnect_driver(serio); + + if (error) { + serio_disconnect_port(serio); + serio_find_driver(serio); + } + + return error; +} + +/* + * Reconnect serio port and all its children (re-initialize attached + * devices). + */ +static void serio_reconnect_subtree(struct serio *root) +{ + struct serio *s = root; + int error; + + do { + error = serio_reconnect_port(s); + if (!error) { + /* + * Reconnect was successful, move on to do the + * first child. + */ + if (!list_empty(&s->children)) { + s = list_first_entry(&s->children, + struct serio, child_node); + continue; + } + } + + /* + * Either it was a leaf node or reconnect failed and it + * became a leaf node. Continue reconnecting starting with + * the next sibling of the parent node. + */ + while (s != root) { + struct serio *parent = s->parent; + + if (!list_is_last(&s->child_node, &parent->children)) { + s = list_entry(s->child_node.next, + struct serio, child_node); + break; + } + + s = parent; + } + } while (s != root); +} + +/* + * serio_disconnect_port() unbinds a port from its driver. As a side effect + * all children ports are unbound and destroyed. + */ +static void serio_disconnect_port(struct serio *serio) +{ + struct serio *s = serio; + + /* + * Children ports should be disconnected and destroyed + * first; we travel the tree in depth-first order. + */ + while (!list_empty(&serio->children)) { + + /* Locate a leaf */ + while (!list_empty(&s->children)) + s = list_first_entry(&s->children, + struct serio, child_node); + + /* + * Prune this leaf node unless it is the one we + * started with. + */ + if (s != serio) { + struct serio *parent = s->parent; + + device_release_driver(&s->dev); + serio_destroy_port(s); + + s = parent; + } + } + + /* + * OK, no children left, now disconnect this port. + */ + device_release_driver(&serio->dev); +} + +void serio_rescan(struct serio *serio) +{ + serio_queue_event(serio, NULL, SERIO_RESCAN_PORT); +} +EXPORT_SYMBOL(serio_rescan); + +void serio_reconnect(struct serio *serio) +{ + serio_queue_event(serio, NULL, SERIO_RECONNECT_SUBTREE); +} +EXPORT_SYMBOL(serio_reconnect); + +/* + * Submits register request to kseriod for subsequent execution. + * Note that port registration is always asynchronous. + */ +void __serio_register_port(struct serio *serio, struct module *owner) +{ + serio_init_port(serio); + serio_queue_event(serio, owner, SERIO_REGISTER_PORT); +} +EXPORT_SYMBOL(__serio_register_port); + +/* + * Synchronously unregisters serio port. + */ +void serio_unregister_port(struct serio *serio) +{ + mutex_lock(&serio_mutex); + serio_disconnect_port(serio); + serio_destroy_port(serio); + mutex_unlock(&serio_mutex); +} +EXPORT_SYMBOL(serio_unregister_port); + +/* + * Safely unregisters children ports if they are present. + */ +void serio_unregister_child_port(struct serio *serio) +{ + struct serio *s, *next; + + mutex_lock(&serio_mutex); + list_for_each_entry_safe(s, next, &serio->children, child_node) { + serio_disconnect_port(s); + serio_destroy_port(s); + } + mutex_unlock(&serio_mutex); +} +EXPORT_SYMBOL(serio_unregister_child_port); + + +/* + * Serio driver operations + */ + +static ssize_t serio_driver_show_description(struct device_driver *drv, char *buf) +{ + struct serio_driver *driver = to_serio_driver(drv); + return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)"); +} + +static ssize_t serio_driver_show_bind_mode(struct device_driver *drv, char *buf) +{ + struct serio_driver *serio_drv = to_serio_driver(drv); + return sprintf(buf, "%s\n", serio_drv->manual_bind ? "manual" : "auto"); +} + +static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char *buf, size_t count) +{ + struct serio_driver *serio_drv = to_serio_driver(drv); + int retval; + + retval = count; + if (!strncmp(buf, "manual", count)) { + serio_drv->manual_bind = true; + } else if (!strncmp(buf, "auto", count)) { + serio_drv->manual_bind = false; + } else { + retval = -EINVAL; + } + + return retval; +} + + +static struct driver_attribute serio_driver_attrs[] = { + __ATTR(description, S_IRUGO, serio_driver_show_description, NULL), + __ATTR(bind_mode, S_IWUSR | S_IRUGO, + serio_driver_show_bind_mode, serio_driver_set_bind_mode), + __ATTR_NULL +}; + +static int serio_driver_probe(struct device *dev) +{ + struct serio *serio = to_serio_port(dev); + struct serio_driver *drv = to_serio_driver(dev->driver); + + return serio_connect_driver(serio, drv); +} + +static int serio_driver_remove(struct device *dev) +{ + struct serio *serio = to_serio_port(dev); + + serio_disconnect_driver(serio); + return 0; +} + +static void serio_cleanup(struct serio *serio) +{ + mutex_lock(&serio->drv_mutex); + if (serio->drv && serio->drv->cleanup) + serio->drv->cleanup(serio); + mutex_unlock(&serio->drv_mutex); +} + +static void serio_shutdown(struct device *dev) +{ + struct serio *serio = to_serio_port(dev); + + serio_cleanup(serio); +} + +static void serio_attach_driver(struct serio_driver *drv) +{ + int error; + + error = driver_attach(&drv->driver); + if (error) + pr_warning("driver_attach() failed for %s with error %d\n", + drv->driver.name, error); +} + +int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name) +{ + bool manual_bind = drv->manual_bind; + int error; + + drv->driver.bus = &serio_bus; + drv->driver.owner = owner; + drv->driver.mod_name = mod_name; + + /* + * Temporarily disable automatic binding because probing + * takes long time and we are better off doing it in kseriod + */ + drv->manual_bind = true; + + error = driver_register(&drv->driver); + if (error) { + pr_err("driver_register() failed for %s, error: %d\n", + drv->driver.name, error); + return error; + } + + /* + * Restore original bind mode and let kseriod bind the + * driver to free ports + */ + if (!manual_bind) { + drv->manual_bind = false; + error = serio_queue_event(drv, NULL, SERIO_ATTACH_DRIVER); + if (error) { + driver_unregister(&drv->driver); + return error; + } + } + + return 0; +} +EXPORT_SYMBOL(__serio_register_driver); + +void serio_unregister_driver(struct serio_driver *drv) +{ + struct serio *serio; + + mutex_lock(&serio_mutex); + + drv->manual_bind = true; /* so serio_find_driver ignores it */ + serio_remove_pending_events(drv); + +start_over: + list_for_each_entry(serio, &serio_list, node) { + if (serio->drv == drv) { + serio_disconnect_port(serio); + serio_find_driver(serio); + /* we could've deleted some ports, restart */ + goto start_over; + } + } + + driver_unregister(&drv->driver); + mutex_unlock(&serio_mutex); +} +EXPORT_SYMBOL(serio_unregister_driver); + +static void serio_set_drv(struct serio *serio, struct serio_driver *drv) +{ + serio_pause_rx(serio); + serio->drv = drv; + serio_continue_rx(serio); +} + +static int serio_bus_match(struct device *dev, struct device_driver *drv) +{ + struct serio *serio = to_serio_port(dev); + struct serio_driver *serio_drv = to_serio_driver(drv); + + if (serio->manual_bind || serio_drv->manual_bind) + return 0; + + return serio_match_port(serio_drv->id_table, serio); +} + +#define SERIO_ADD_UEVENT_VAR(fmt, val...) \ + do { \ + int err = add_uevent_var(env, fmt, val); \ + if (err) \ + return err; \ + } while (0) + +static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) +{ + struct serio *serio; + + if (!dev) + return -ENODEV; + + serio = to_serio_port(dev); + + SERIO_ADD_UEVENT_VAR("SERIO_TYPE=%02x", serio->id.type); + SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); + SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); + SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); + SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X", + serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); + + return 0; +} +#undef SERIO_ADD_UEVENT_VAR + +#ifdef CONFIG_PM +static int serio_suspend(struct device *dev) +{ + struct serio *serio = to_serio_port(dev); + + serio_cleanup(serio); + + return 0; +} + +static int serio_resume(struct device *dev) +{ + struct serio *serio = to_serio_port(dev); + + /* + * Driver reconnect can take a while, so better let kseriod + * deal with it. + */ + serio_queue_event(serio, NULL, SERIO_RECONNECT_PORT); + + return 0; +} + +static const struct dev_pm_ops serio_pm_ops = { + .suspend = serio_suspend, + .resume = serio_resume, + .poweroff = serio_suspend, + .restore = serio_resume, +}; +#endif /* CONFIG_PM */ + +/* called from serio_driver->connect/disconnect methods under serio_mutex */ +int serio_open(struct serio *serio, struct serio_driver *drv) +{ + serio_set_drv(serio, drv); + + if (serio->open && serio->open(serio)) { + serio_set_drv(serio, NULL); + return -1; + } + return 0; +} +EXPORT_SYMBOL(serio_open); + +/* called from serio_driver->connect/disconnect methods under serio_mutex */ +void serio_close(struct serio *serio) +{ + if (serio->close) + serio->close(serio); + + serio_set_drv(serio, NULL); +} +EXPORT_SYMBOL(serio_close); + +irqreturn_t serio_interrupt(struct serio *serio, + unsigned char data, unsigned int dfl) +{ + unsigned long flags; + irqreturn_t ret = IRQ_NONE; + + spin_lock_irqsave(&serio->lock, flags); + + if (likely(serio->drv)) { + ret = serio->drv->interrupt(serio, data, dfl); + } else if (!dfl && device_is_registered(&serio->dev)) { + serio_rescan(serio); + ret = IRQ_HANDLED; + } + + spin_unlock_irqrestore(&serio->lock, flags); + + return ret; +} +EXPORT_SYMBOL(serio_interrupt); + +static struct bus_type serio_bus = { + .name = "serio", + .dev_attrs = serio_device_attrs, + .drv_attrs = serio_driver_attrs, + .match = serio_bus_match, + .uevent = serio_uevent, + .probe = serio_driver_probe, + .remove = serio_driver_remove, + .shutdown = serio_shutdown, +#ifdef CONFIG_PM + .pm = &serio_pm_ops, +#endif +}; + +static int __init serio_init(void) +{ + int error; + + error = bus_register(&serio_bus); + if (error) { + pr_err("Failed to register serio bus, error: %d\n", error); + return error; + } + + return 0; +} + +static void __exit serio_exit(void) +{ + bus_unregister(&serio_bus); + + /* + * There should not be any outstanding events but work may + * still be scheduled so simply cancel it. + */ + cancel_work_sync(&serio_event_work); +} + +subsys_initcall(serio_init); +module_exit(serio_exit); diff --git a/drivers/input/serio/serio_raw.c b/drivers/input/serio/serio_raw.c new file mode 100644 index 00000000..59df2e73 --- /dev/null +++ b/drivers/input/serio/serio_raw.c @@ -0,0 +1,445 @@ +/* + * Raw serio device providing access to a raw byte stream from underlying + * serio port. Closely emulates behavior of pre-2.6 /dev/psaux device + * + * Copyright (c) 2004 Dmitry Torokhov + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Raw serio driver" + +MODULE_AUTHOR("Dmitry Torokhov "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define SERIO_RAW_QUEUE_LEN 64 +struct serio_raw { + unsigned char queue[SERIO_RAW_QUEUE_LEN]; + unsigned int tail, head; + + char name[16]; + struct kref kref; + struct serio *serio; + struct miscdevice dev; + wait_queue_head_t wait; + struct list_head client_list; + struct list_head node; + bool dead; +}; + +struct serio_raw_client { + struct fasync_struct *fasync; + struct serio_raw *serio_raw; + struct list_head node; +}; + +static DEFINE_MUTEX(serio_raw_mutex); +static LIST_HEAD(serio_raw_list); + +/********************************************************************* + * Interface with userspace (file operations) * + *********************************************************************/ + +static int serio_raw_fasync(int fd, struct file *file, int on) +{ + struct serio_raw_client *client = file->private_data; + + return fasync_helper(fd, file, on, &client->fasync); +} + +static struct serio_raw *serio_raw_locate(int minor) +{ + struct serio_raw *serio_raw; + + list_for_each_entry(serio_raw, &serio_raw_list, node) { + if (serio_raw->dev.minor == minor) + return serio_raw; + } + + return NULL; +} + +static int serio_raw_open(struct inode *inode, struct file *file) +{ + struct serio_raw *serio_raw; + struct serio_raw_client *client; + int retval; + + retval = mutex_lock_interruptible(&serio_raw_mutex); + if (retval) + return retval; + + serio_raw = serio_raw_locate(iminor(inode)); + if (!serio_raw) { + retval = -ENODEV; + goto out; + } + + if (serio_raw->dead) { + retval = -ENODEV; + goto out; + } + + client = kzalloc(sizeof(struct serio_raw_client), GFP_KERNEL); + if (!client) { + retval = -ENOMEM; + goto out; + } + + client->serio_raw = serio_raw; + file->private_data = client; + + kref_get(&serio_raw->kref); + + serio_pause_rx(serio_raw->serio); + list_add_tail(&client->node, &serio_raw->client_list); + serio_continue_rx(serio_raw->serio); + +out: + mutex_unlock(&serio_raw_mutex); + return retval; +} + +static void serio_raw_free(struct kref *kref) +{ + struct serio_raw *serio_raw = + container_of(kref, struct serio_raw, kref); + + put_device(&serio_raw->serio->dev); + kfree(serio_raw); +} + +static int serio_raw_release(struct inode *inode, struct file *file) +{ + struct serio_raw_client *client = file->private_data; + struct serio_raw *serio_raw = client->serio_raw; + + serio_pause_rx(serio_raw->serio); + list_del(&client->node); + serio_continue_rx(serio_raw->serio); + + kfree(client); + + kref_put(&serio_raw->kref, serio_raw_free); + + return 0; +} + +static bool serio_raw_fetch_byte(struct serio_raw *serio_raw, char *c) +{ + bool empty; + + serio_pause_rx(serio_raw->serio); + + empty = serio_raw->head == serio_raw->tail; + if (!empty) { + *c = serio_raw->queue[serio_raw->tail]; + serio_raw->tail = (serio_raw->tail + 1) % SERIO_RAW_QUEUE_LEN; + } + + serio_continue_rx(serio_raw->serio); + + return !empty; +} + +static ssize_t serio_raw_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct serio_raw_client *client = file->private_data; + struct serio_raw *serio_raw = client->serio_raw; + char uninitialized_var(c); + ssize_t read = 0; + int error; + + for (;;) { + if (serio_raw->dead) + return -ENODEV; + + if (serio_raw->head == serio_raw->tail && + (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + if (count == 0) + break; + + while (read < count && serio_raw_fetch_byte(serio_raw, &c)) { + if (put_user(c, buffer++)) + return -EFAULT; + read++; + } + + if (read) + break; + + if (!(file->f_flags & O_NONBLOCK)) { + error = wait_event_interruptible(serio_raw->wait, + serio_raw->head != serio_raw->tail || + serio_raw->dead); + if (error) + return error; + } + } + + return read; +} + +static ssize_t serio_raw_write(struct file *file, const char __user *buffer, + size_t count, loff_t *ppos) +{ + struct serio_raw_client *client = file->private_data; + struct serio_raw *serio_raw = client->serio_raw; + int retval = 0; + unsigned char c; + + retval = mutex_lock_interruptible(&serio_raw_mutex); + if (retval) + return retval; + + if (serio_raw->dead) { + retval = -ENODEV; + goto out; + } + + if (count > 32) + count = 32; + + while (count--) { + if (get_user(c, buffer++)) { + retval = -EFAULT; + goto out; + } + + if (serio_write(serio_raw->serio, c)) { + /* Either signal error or partial write */ + if (retval == 0) + retval = -EIO; + goto out; + } + + retval++; + } + +out: + mutex_unlock(&serio_raw_mutex); + return retval; +} + +static unsigned int serio_raw_poll(struct file *file, poll_table *wait) +{ + struct serio_raw_client *client = file->private_data; + struct serio_raw *serio_raw = client->serio_raw; + unsigned int mask; + + poll_wait(file, &serio_raw->wait, wait); + + mask = serio_raw->dead ? POLLHUP | POLLERR : POLLOUT | POLLWRNORM; + if (serio_raw->head != serio_raw->tail) + mask |= POLLIN | POLLRDNORM; + + return mask; +} + +static const struct file_operations serio_raw_fops = { + .owner = THIS_MODULE, + .open = serio_raw_open, + .release = serio_raw_release, + .read = serio_raw_read, + .write = serio_raw_write, + .poll = serio_raw_poll, + .fasync = serio_raw_fasync, + .llseek = noop_llseek, +}; + + +/********************************************************************* + * Interface with serio port * + *********************************************************************/ + +static irqreturn_t serio_raw_interrupt(struct serio *serio, unsigned char data, + unsigned int dfl) +{ + struct serio_raw *serio_raw = serio_get_drvdata(serio); + struct serio_raw_client *client; + unsigned int head = serio_raw->head; + + /* we are holding serio->lock here so we are protected */ + serio_raw->queue[head] = data; + head = (head + 1) % SERIO_RAW_QUEUE_LEN; + if (likely(head != serio_raw->tail)) { + serio_raw->head = head; + list_for_each_entry(client, &serio_raw->client_list, node) + kill_fasync(&client->fasync, SIGIO, POLL_IN); + wake_up_interruptible(&serio_raw->wait); + } + + return IRQ_HANDLED; +} + +static int serio_raw_connect(struct serio *serio, struct serio_driver *drv) +{ + static atomic_t serio_raw_no = ATOMIC_INIT(0); + struct serio_raw *serio_raw; + int err; + + serio_raw = kzalloc(sizeof(struct serio_raw), GFP_KERNEL); + if (!serio_raw) { + dev_dbg(&serio->dev, "can't allocate memory for a device\n"); + return -ENOMEM; + } + + snprintf(serio_raw->name, sizeof(serio_raw->name), + "serio_raw%ld", (long)atomic_inc_return(&serio_raw_no) - 1); + kref_init(&serio_raw->kref); + INIT_LIST_HEAD(&serio_raw->client_list); + init_waitqueue_head(&serio_raw->wait); + + serio_raw->serio = serio; + get_device(&serio->dev); + + serio_set_drvdata(serio, serio_raw); + + err = serio_open(serio, drv); + if (err) + goto err_free; + + err = mutex_lock_killable(&serio_raw_mutex); + if (err) + goto err_close; + + list_add_tail(&serio_raw->node, &serio_raw_list); + mutex_unlock(&serio_raw_mutex); + + serio_raw->dev.minor = PSMOUSE_MINOR; + serio_raw->dev.name = serio_raw->name; + serio_raw->dev.parent = &serio->dev; + serio_raw->dev.fops = &serio_raw_fops; + + err = misc_register(&serio_raw->dev); + if (err) { + serio_raw->dev.minor = MISC_DYNAMIC_MINOR; + err = misc_register(&serio_raw->dev); + } + + if (err) { + dev_err(&serio->dev, + "failed to register raw access device for %s\n", + serio->phys); + goto err_unlink; + } + + dev_info(&serio->dev, "raw access enabled on %s (%s, minor %d)\n", + serio->phys, serio_raw->name, serio_raw->dev.minor); + return 0; + +err_unlink: + list_del_init(&serio_raw->node); +err_close: + serio_close(serio); +err_free: + serio_set_drvdata(serio, NULL); + kref_put(&serio_raw->kref, serio_raw_free); + return err; +} + +static int serio_raw_reconnect(struct serio *serio) +{ + struct serio_raw *serio_raw = serio_get_drvdata(serio); + struct serio_driver *drv = serio->drv; + + if (!drv || !serio_raw) { + dev_dbg(&serio->dev, + "reconnect request, but serio is disconnected, ignoring...\n"); + return -1; + } + + /* + * Nothing needs to be done here, we just need this method to + * keep the same device. + */ + return 0; +} + +/* + * Wake up users waiting for IO so they can disconnect from + * dead device. + */ +static void serio_raw_hangup(struct serio_raw *serio_raw) +{ + struct serio_raw_client *client; + + serio_pause_rx(serio_raw->serio); + list_for_each_entry(client, &serio_raw->client_list, node) + kill_fasync(&client->fasync, SIGIO, POLL_HUP); + serio_continue_rx(serio_raw->serio); + + wake_up_interruptible(&serio_raw->wait); +} + + +static void serio_raw_disconnect(struct serio *serio) +{ + struct serio_raw *serio_raw = serio_get_drvdata(serio); + + misc_deregister(&serio_raw->dev); + + mutex_lock(&serio_raw_mutex); + serio_raw->dead = true; + list_del_init(&serio_raw->node); + mutex_unlock(&serio_raw_mutex); + + serio_raw_hangup(serio_raw); + + serio_close(serio); + kref_put(&serio_raw->kref, serio_raw_free); + + serio_set_drvdata(serio, NULL); +} + +static struct serio_device_id serio_raw_serio_ids[] = { + { + .type = SERIO_8042, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { + .type = SERIO_8042_XL, + .proto = SERIO_ANY, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, serio_raw_serio_ids); + +static struct serio_driver serio_raw_drv = { + .driver = { + .name = "serio_raw", + }, + .description = DRIVER_DESC, + .id_table = serio_raw_serio_ids, + .interrupt = serio_raw_interrupt, + .connect = serio_raw_connect, + .reconnect = serio_raw_reconnect, + .disconnect = serio_raw_disconnect, + .manual_bind = true, +}; + +module_serio_driver(serio_raw_drv); diff --git a/drivers/input/serio/serport.c b/drivers/input/serio/serport.c new file mode 100644 index 00000000..e4ecf3b6 --- /dev/null +++ b/drivers/input/serio/serport.c @@ -0,0 +1,299 @@ +/* + * Input device TTY line discipline + * + * Copyright (c) 1999-2002 Vojtech Pavlik + * + * This is a module that converts a tty line into a much simpler + * 'serial io port' abstraction that the input device drivers use. + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION("Input device TTY line discipline"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_LDISC(N_MOUSE); + +#define SERPORT_BUSY 1 +#define SERPORT_ACTIVE 2 +#define SERPORT_DEAD 3 + +struct serport { + struct tty_struct *tty; + wait_queue_head_t wait; + struct serio *serio; + struct serio_device_id id; + spinlock_t lock; + unsigned long flags; +}; + +/* + * Callback functions from the serio code. + */ + +static int serport_serio_write(struct serio *serio, unsigned char data) +{ + struct serport *serport = serio->port_data; + return -(serport->tty->ops->write(serport->tty, &data, 1) != 1); +} + +static int serport_serio_open(struct serio *serio) +{ + struct serport *serport = serio->port_data; + unsigned long flags; + + spin_lock_irqsave(&serport->lock, flags); + set_bit(SERPORT_ACTIVE, &serport->flags); + spin_unlock_irqrestore(&serport->lock, flags); + + return 0; +} + + +static void serport_serio_close(struct serio *serio) +{ + struct serport *serport = serio->port_data; + unsigned long flags; + + spin_lock_irqsave(&serport->lock, flags); + clear_bit(SERPORT_ACTIVE, &serport->flags); + set_bit(SERPORT_DEAD, &serport->flags); + spin_unlock_irqrestore(&serport->lock, flags); + + wake_up_interruptible(&serport->wait); +} + +/* + * serport_ldisc_open() is the routine that is called upon setting our line + * discipline on a tty. It prepares the serio struct. + */ + +static int serport_ldisc_open(struct tty_struct *tty) +{ + struct serport *serport; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + serport = kzalloc(sizeof(struct serport), GFP_KERNEL); + if (!serport) + return -ENOMEM; + + serport->tty = tty; + spin_lock_init(&serport->lock); + init_waitqueue_head(&serport->wait); + + tty->disc_data = serport; + tty->receive_room = 256; + set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags); + + return 0; +} + +/* + * serport_ldisc_close() is the opposite of serport_ldisc_open() + */ + +static void serport_ldisc_close(struct tty_struct *tty) +{ + struct serport *serport = (struct serport *) tty->disc_data; + + kfree(serport); +} + +/* + * serport_ldisc_receive() is called by the low level tty driver when characters + * are ready for us. We forward the characters and flags, one by one to the + * 'interrupt' routine. + */ + +static void serport_ldisc_receive(struct tty_struct *tty, const unsigned char *cp, char *fp, int count) +{ + struct serport *serport = (struct serport*) tty->disc_data; + unsigned long flags; + unsigned int ch_flags; + int i; + + spin_lock_irqsave(&serport->lock, flags); + + if (!test_bit(SERPORT_ACTIVE, &serport->flags)) + goto out; + + for (i = 0; i < count; i++) { + switch (fp[i]) { + case TTY_FRAME: + ch_flags = SERIO_FRAME; + break; + + case TTY_PARITY: + ch_flags = SERIO_PARITY; + break; + + default: + ch_flags = 0; + break; + } + + serio_interrupt(serport->serio, cp[i], ch_flags); + } + +out: + spin_unlock_irqrestore(&serport->lock, flags); +} + +/* + * serport_ldisc_read() just waits indefinitely if everything goes well. + * However, when the serio driver closes the serio port, it finishes, + * returning 0 characters. + */ + +static ssize_t serport_ldisc_read(struct tty_struct * tty, struct file * file, unsigned char __user * buf, size_t nr) +{ + struct serport *serport = (struct serport*) tty->disc_data; + struct serio *serio; + char name[64]; + + if (test_and_set_bit(SERPORT_BUSY, &serport->flags)) + return -EBUSY; + + serport->serio = serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!serio) + return -ENOMEM; + + strlcpy(serio->name, "Serial port", sizeof(serio->name)); + snprintf(serio->phys, sizeof(serio->phys), "%s/serio0", tty_name(tty, name)); + serio->id = serport->id; + serio->id.type = SERIO_RS232; + serio->write = serport_serio_write; + serio->open = serport_serio_open; + serio->close = serport_serio_close; + serio->port_data = serport; + serio->dev.parent = tty->dev; + + serio_register_port(serport->serio); + printk(KERN_INFO "serio: Serial port %s\n", tty_name(tty, name)); + + wait_event_interruptible(serport->wait, test_bit(SERPORT_DEAD, &serport->flags)); + serio_unregister_port(serport->serio); + serport->serio = NULL; + + clear_bit(SERPORT_DEAD, &serport->flags); + clear_bit(SERPORT_BUSY, &serport->flags); + + return 0; +} + +static void serport_set_type(struct tty_struct *tty, unsigned long type) +{ + struct serport *serport = tty->disc_data; + + serport->id.proto = type & 0x000000ff; + serport->id.id = (type & 0x0000ff00) >> 8; + serport->id.extra = (type & 0x00ff0000) >> 16; +} + +/* + * serport_ldisc_ioctl() allows to set the port protocol, and device ID + */ + +static int serport_ldisc_ioctl(struct tty_struct *tty, struct file *file, + unsigned int cmd, unsigned long arg) +{ + if (cmd == SPIOCSTYPE) { + unsigned long type; + + if (get_user(type, (unsigned long __user *) arg)) + return -EFAULT; + + serport_set_type(tty, type); + return 0; + } + + return -EINVAL; +} + +#ifdef CONFIG_COMPAT +#define COMPAT_SPIOCSTYPE _IOW('q', 0x01, compat_ulong_t) +static long serport_ldisc_compat_ioctl(struct tty_struct *tty, + struct file *file, + unsigned int cmd, unsigned long arg) +{ + if (cmd == COMPAT_SPIOCSTYPE) { + void __user *uarg = compat_ptr(arg); + compat_ulong_t compat_type; + + if (get_user(compat_type, (compat_ulong_t __user *)uarg)) + return -EFAULT; + + serport_set_type(tty, compat_type); + return 0; + } + + return -EINVAL; +} +#endif + +static void serport_ldisc_write_wakeup(struct tty_struct * tty) +{ + struct serport *serport = (struct serport *) tty->disc_data; + unsigned long flags; + + spin_lock_irqsave(&serport->lock, flags); + if (test_bit(SERPORT_ACTIVE, &serport->flags)) + serio_drv_write_wakeup(serport->serio); + spin_unlock_irqrestore(&serport->lock, flags); +} + +/* + * The line discipline structure. + */ + +static struct tty_ldisc_ops serport_ldisc = { + .owner = THIS_MODULE, + .name = "input", + .open = serport_ldisc_open, + .close = serport_ldisc_close, + .read = serport_ldisc_read, + .ioctl = serport_ldisc_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = serport_ldisc_compat_ioctl, +#endif + .receive_buf = serport_ldisc_receive, + .write_wakeup = serport_ldisc_write_wakeup +}; + +/* + * The functions for insering/removing us as a module. + */ + +static int __init serport_init(void) +{ + int retval; + retval = tty_register_ldisc(N_MOUSE, &serport_ldisc); + if (retval) + printk(KERN_ERR "serport.c: Error registering line discipline.\n"); + + return retval; +} + +static void __exit serport_exit(void) +{ + tty_unregister_ldisc(N_MOUSE); +} + +module_init(serport_init); +module_exit(serport_exit); diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c new file mode 100644 index 00000000..17be8594 --- /dev/null +++ b/drivers/input/serio/xilinx_ps2.c @@ -0,0 +1,378 @@ +/* + * Xilinx XPS PS/2 device driver + * + * (c) 2005 MontaVista Software, Inc. + * (c) 2008 Xilinx, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_NAME "xilinx_ps2" + +/* Register offsets for the xps2 device */ +#define XPS2_SRST_OFFSET 0x00000000 /* Software Reset register */ +#define XPS2_STATUS_OFFSET 0x00000004 /* Status register */ +#define XPS2_RX_DATA_OFFSET 0x00000008 /* Receive Data register */ +#define XPS2_TX_DATA_OFFSET 0x0000000C /* Transmit Data register */ +#define XPS2_GIER_OFFSET 0x0000002C /* Global Interrupt Enable reg */ +#define XPS2_IPISR_OFFSET 0x00000030 /* Interrupt Status register */ +#define XPS2_IPIER_OFFSET 0x00000038 /* Interrupt Enable register */ + +/* Reset Register Bit Definitions */ +#define XPS2_SRST_RESET 0x0000000A /* Software Reset */ + +/* Status Register Bit Positions */ +#define XPS2_STATUS_RX_FULL 0x00000001 /* Receive Full */ +#define XPS2_STATUS_TX_FULL 0x00000002 /* Transmit Full */ + +/* Bit definitions for ISR/IER registers. Both the registers have the same bit + * definitions and are only defined once. */ +#define XPS2_IPIXR_WDT_TOUT 0x00000001 /* Watchdog Timeout Interrupt */ +#define XPS2_IPIXR_TX_NOACK 0x00000002 /* Transmit No ACK Interrupt */ +#define XPS2_IPIXR_TX_ACK 0x00000004 /* Transmit ACK (Data) Interrupt */ +#define XPS2_IPIXR_RX_OVF 0x00000008 /* Receive Overflow Interrupt */ +#define XPS2_IPIXR_RX_ERR 0x00000010 /* Receive Error Interrupt */ +#define XPS2_IPIXR_RX_FULL 0x00000020 /* Receive Data Interrupt */ + +/* Mask for all the Transmit Interrupts */ +#define XPS2_IPIXR_TX_ALL (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_TX_ACK) + +/* Mask for all the Receive Interrupts */ +#define XPS2_IPIXR_RX_ALL (XPS2_IPIXR_RX_OVF | XPS2_IPIXR_RX_ERR | \ + XPS2_IPIXR_RX_FULL) + +/* Mask for all the Interrupts */ +#define XPS2_IPIXR_ALL (XPS2_IPIXR_TX_ALL | XPS2_IPIXR_RX_ALL | \ + XPS2_IPIXR_WDT_TOUT) + +/* Global Interrupt Enable mask */ +#define XPS2_GIER_GIE_MASK 0x80000000 + +struct xps2data { + int irq; + spinlock_t lock; + void __iomem *base_address; /* virt. address of control registers */ + unsigned int flags; + struct serio *serio; /* serio */ + struct device *dev; +}; + +/************************************/ +/* XPS PS/2 data transmission calls */ +/************************************/ + +/** + * xps2_recv() - attempts to receive a byte from the PS/2 port. + * @drvdata: pointer to ps2 device private data structure + * @byte: address where the read data will be copied + * + * If there is any data available in the PS/2 receiver, this functions reads + * the data, otherwise it returns error. + */ +static int xps2_recv(struct xps2data *drvdata, u8 *byte) +{ + u32 sr; + int status = -1; + + /* If there is data available in the PS/2 receiver, read it */ + sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET); + if (sr & XPS2_STATUS_RX_FULL) { + *byte = in_be32(drvdata->base_address + XPS2_RX_DATA_OFFSET); + status = 0; + } + + return status; +} + +/*********************/ +/* Interrupt handler */ +/*********************/ +static irqreturn_t xps2_interrupt(int irq, void *dev_id) +{ + struct xps2data *drvdata = dev_id; + u32 intr_sr; + u8 c; + int status; + + /* Get the PS/2 interrupts and clear them */ + intr_sr = in_be32(drvdata->base_address + XPS2_IPISR_OFFSET); + out_be32(drvdata->base_address + XPS2_IPISR_OFFSET, intr_sr); + + /* Check which interrupt is active */ + if (intr_sr & XPS2_IPIXR_RX_OVF) + dev_warn(drvdata->dev, "receive overrun error\n"); + + if (intr_sr & XPS2_IPIXR_RX_ERR) + drvdata->flags |= SERIO_PARITY; + + if (intr_sr & (XPS2_IPIXR_TX_NOACK | XPS2_IPIXR_WDT_TOUT)) + drvdata->flags |= SERIO_TIMEOUT; + + if (intr_sr & XPS2_IPIXR_RX_FULL) { + status = xps2_recv(drvdata, &c); + + /* Error, if a byte is not received */ + if (status) { + dev_err(drvdata->dev, + "wrong rcvd byte count (%d)\n", status); + } else { + serio_interrupt(drvdata->serio, c, drvdata->flags); + drvdata->flags = 0; + } + } + + return IRQ_HANDLED; +} + +/*******************/ +/* serio callbacks */ +/*******************/ + +/** + * sxps2_write() - sends a byte out through the PS/2 port. + * @pserio: pointer to the serio structure of the PS/2 port + * @c: data that needs to be written to the PS/2 port + * + * This function checks if the PS/2 transmitter is empty and sends a byte. + * Otherwise it returns error. Transmission fails only when nothing is connected + * to the PS/2 port. Thats why, we do not try to resend the data in case of a + * failure. + */ +static int sxps2_write(struct serio *pserio, unsigned char c) +{ + struct xps2data *drvdata = pserio->port_data; + unsigned long flags; + u32 sr; + int status = -1; + + spin_lock_irqsave(&drvdata->lock, flags); + + /* If the PS/2 transmitter is empty send a byte of data */ + sr = in_be32(drvdata->base_address + XPS2_STATUS_OFFSET); + if (!(sr & XPS2_STATUS_TX_FULL)) { + out_be32(drvdata->base_address + XPS2_TX_DATA_OFFSET, c); + status = 0; + } + + spin_unlock_irqrestore(&drvdata->lock, flags); + + return status; +} + +/** + * sxps2_open() - called when a port is opened by the higher layer. + * @pserio: pointer to the serio structure of the PS/2 device + * + * This function requests irq and enables interrupts for the PS/2 device. + */ +static int sxps2_open(struct serio *pserio) +{ + struct xps2data *drvdata = pserio->port_data; + int error; + u8 c; + + error = request_irq(drvdata->irq, &xps2_interrupt, 0, + DRIVER_NAME, drvdata); + if (error) { + dev_err(drvdata->dev, + "Couldn't allocate interrupt %d\n", drvdata->irq); + return error; + } + + /* start reception by enabling the interrupts */ + out_be32(drvdata->base_address + XPS2_GIER_OFFSET, XPS2_GIER_GIE_MASK); + out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, XPS2_IPIXR_RX_ALL); + (void)xps2_recv(drvdata, &c); + + return 0; /* success */ +} + +/** + * sxps2_close() - frees the interrupt. + * @pserio: pointer to the serio structure of the PS/2 device + * + * This function frees the irq and disables interrupts for the PS/2 device. + */ +static void sxps2_close(struct serio *pserio) +{ + struct xps2data *drvdata = pserio->port_data; + + /* Disable the PS2 interrupts */ + out_be32(drvdata->base_address + XPS2_GIER_OFFSET, 0x00); + out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, 0x00); + free_irq(drvdata->irq, drvdata); +} + +/** + * xps2_of_probe - probe method for the PS/2 device. + * @of_dev: pointer to OF device structure + * @match: pointer to the structure used for matching a device + * + * This function probes the PS/2 device in the device tree. + * It initializes the driver data structure and the hardware. + * It returns 0, if the driver is bound to the PS/2 device, or a negative + * value if there is an error. + */ +static int xps2_of_probe(struct platform_device *ofdev) +{ + struct resource r_irq; /* Interrupt resources */ + struct resource r_mem; /* IO mem resources */ + struct xps2data *drvdata; + struct serio *serio; + struct device *dev = &ofdev->dev; + resource_size_t remap_size, phys_addr; + int error; + + dev_info(dev, "Device Tree Probing \'%s\'\n", + ofdev->dev.of_node->name); + + /* Get iospace for the device */ + error = of_address_to_resource(ofdev->dev.of_node, 0, &r_mem); + if (error) { + dev_err(dev, "invalid address\n"); + return error; + } + + /* Get IRQ for the device */ + if (!of_irq_to_resource(ofdev->dev.of_node, 0, &r_irq)) { + dev_err(dev, "no IRQ found\n"); + return -ENODEV; + } + + drvdata = kzalloc(sizeof(struct xps2data), GFP_KERNEL); + serio = kzalloc(sizeof(struct serio), GFP_KERNEL); + if (!drvdata || !serio) { + error = -ENOMEM; + goto failed1; + } + + spin_lock_init(&drvdata->lock); + drvdata->irq = r_irq.start; + drvdata->serio = serio; + drvdata->dev = dev; + + phys_addr = r_mem.start; + remap_size = resource_size(&r_mem); + if (!request_mem_region(phys_addr, remap_size, DRIVER_NAME)) { + dev_err(dev, "Couldn't lock memory region at 0x%08llX\n", + (unsigned long long)phys_addr); + error = -EBUSY; + goto failed1; + } + + /* Fill in configuration data and add them to the list */ + drvdata->base_address = ioremap(phys_addr, remap_size); + if (drvdata->base_address == NULL) { + dev_err(dev, "Couldn't ioremap memory at 0x%08llX\n", + (unsigned long long)phys_addr); + error = -EFAULT; + goto failed2; + } + + /* Disable all the interrupts, just in case */ + out_be32(drvdata->base_address + XPS2_IPIER_OFFSET, 0); + + /* Reset the PS2 device and abort any current transaction, to make sure + * we have the PS2 in a good state */ + out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET); + + dev_info(dev, "Xilinx PS2 at 0x%08llX mapped to 0x%p, irq=%d\n", + (unsigned long long)phys_addr, drvdata->base_address, + drvdata->irq); + + serio->id.type = SERIO_8042; + serio->write = sxps2_write; + serio->open = sxps2_open; + serio->close = sxps2_close; + serio->port_data = drvdata; + serio->dev.parent = dev; + snprintf(serio->name, sizeof(serio->name), + "Xilinx XPS PS/2 at %08llX", (unsigned long long)phys_addr); + snprintf(serio->phys, sizeof(serio->phys), + "xilinxps2/serio at %08llX", (unsigned long long)phys_addr); + + serio_register_port(serio); + + platform_set_drvdata(ofdev, drvdata); + return 0; /* success */ + +failed2: + release_mem_region(phys_addr, remap_size); +failed1: + kfree(serio); + kfree(drvdata); + + return error; +} + +/** + * xps2_of_remove - unbinds the driver from the PS/2 device. + * @of_dev: pointer to OF device structure + * + * This function is called if a device is physically removed from the system or + * if the driver module is being unloaded. It frees any resources allocated to + * the device. + */ +static int xps2_of_remove(struct platform_device *of_dev) +{ + struct xps2data *drvdata = platform_get_drvdata(of_dev); + struct resource r_mem; /* IO mem resources */ + + serio_unregister_port(drvdata->serio); + iounmap(drvdata->base_address); + + /* Get iospace of the device */ + if (of_address_to_resource(of_dev->dev.of_node, 0, &r_mem)) + dev_err(drvdata->dev, "invalid address\n"); + else + release_mem_region(r_mem.start, resource_size(&r_mem)); + + kfree(drvdata); + + platform_set_drvdata(of_dev, NULL); + + return 0; +} + +/* Match table for of_platform binding */ +static const struct of_device_id xps2_of_match[] = { + { .compatible = "xlnx,xps-ps2-1.00.a", }, + { /* end of list */ }, +}; +MODULE_DEVICE_TABLE(of, xps2_of_match); + +static struct platform_driver xps2_of_driver = { + .driver = { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = xps2_of_match, + }, + .probe = xps2_of_probe, + .remove = xps2_of_remove, +}; +module_platform_driver(xps2_of_driver); + +MODULE_AUTHOR("Xilinx, Inc."); +MODULE_DESCRIPTION("Xilinx XPS PS/2 driver"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/sparse-keymap.c b/drivers/input/sparse-keymap.c new file mode 100644 index 00000000..a70aa555 --- /dev/null +++ b/drivers/input/sparse-keymap.c @@ -0,0 +1,332 @@ +/* + * Generic support for sparse keymaps + * + * Copyright (c) 2009 Dmitry Torokhov + * + * Derived from wistron button driver: + * Copyright (C) 2005 Miloslav Trmac + * Copyright (C) 2005 Bernhard Rosenkraenzer + * Copyright (C) 2005 Dmitry Torokhov + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include + +MODULE_AUTHOR("Dmitry Torokhov "); +MODULE_DESCRIPTION("Generic support for sparse keymaps"); +MODULE_LICENSE("GPL v2"); +MODULE_VERSION("0.1"); + +static unsigned int sparse_keymap_get_key_index(struct input_dev *dev, + const struct key_entry *k) +{ + struct key_entry *key; + unsigned int idx = 0; + + for (key = dev->keycode; key->type != KE_END; key++) { + if (key->type == KE_KEY) { + if (key == k) + break; + idx++; + } + } + + return idx; +} + +static struct key_entry *sparse_keymap_entry_by_index(struct input_dev *dev, + unsigned int index) +{ + struct key_entry *key; + unsigned int key_cnt = 0; + + for (key = dev->keycode; key->type != KE_END; key++) + if (key->type == KE_KEY) + if (key_cnt++ == index) + return key; + + return NULL; +} + +/** + * sparse_keymap_entry_from_scancode - perform sparse keymap lookup + * @dev: Input device using sparse keymap + * @code: Scan code + * + * This function is used to perform &struct key_entry lookup in an + * input device using sparse keymap. + */ +struct key_entry *sparse_keymap_entry_from_scancode(struct input_dev *dev, + unsigned int code) +{ + struct key_entry *key; + + for (key = dev->keycode; key->type != KE_END; key++) + if (code == key->code) + return key; + + return NULL; +} +EXPORT_SYMBOL(sparse_keymap_entry_from_scancode); + +/** + * sparse_keymap_entry_from_keycode - perform sparse keymap lookup + * @dev: Input device using sparse keymap + * @keycode: Key code + * + * This function is used to perform &struct key_entry lookup in an + * input device using sparse keymap. + */ +struct key_entry *sparse_keymap_entry_from_keycode(struct input_dev *dev, + unsigned int keycode) +{ + struct key_entry *key; + + for (key = dev->keycode; key->type != KE_END; key++) + if (key->type == KE_KEY && keycode == key->keycode) + return key; + + return NULL; +} +EXPORT_SYMBOL(sparse_keymap_entry_from_keycode); + +static struct key_entry *sparse_keymap_locate(struct input_dev *dev, + const struct input_keymap_entry *ke) +{ + struct key_entry *key; + unsigned int scancode; + + if (ke->flags & INPUT_KEYMAP_BY_INDEX) + key = sparse_keymap_entry_by_index(dev, ke->index); + else if (input_scancode_to_scalar(ke, &scancode) == 0) + key = sparse_keymap_entry_from_scancode(dev, scancode); + else + key = NULL; + + return key; +} + +static int sparse_keymap_getkeycode(struct input_dev *dev, + struct input_keymap_entry *ke) +{ + const struct key_entry *key; + + if (dev->keycode) { + key = sparse_keymap_locate(dev, ke); + if (key && key->type == KE_KEY) { + ke->keycode = key->keycode; + if (!(ke->flags & INPUT_KEYMAP_BY_INDEX)) + ke->index = + sparse_keymap_get_key_index(dev, key); + ke->len = sizeof(key->code); + memcpy(ke->scancode, &key->code, sizeof(key->code)); + return 0; + } + } + + return -EINVAL; +} + +static int sparse_keymap_setkeycode(struct input_dev *dev, + const struct input_keymap_entry *ke, + unsigned int *old_keycode) +{ + struct key_entry *key; + + if (dev->keycode) { + key = sparse_keymap_locate(dev, ke); + if (key && key->type == KE_KEY) { + *old_keycode = key->keycode; + key->keycode = ke->keycode; + set_bit(ke->keycode, dev->keybit); + if (!sparse_keymap_entry_from_keycode(dev, *old_keycode)) + clear_bit(*old_keycode, dev->keybit); + return 0; + } + } + + return -EINVAL; +} + +/** + * sparse_keymap_setup - set up sparse keymap for an input device + * @dev: Input device + * @keymap: Keymap in form of array of &key_entry structures ending + * with %KE_END type entry + * @setup: Function that can be used to adjust keymap entries + * depending on device's deeds, may be %NULL + * + * The function calculates size and allocates copy of the original + * keymap after which sets up input device event bits appropriately. + * Before destroying input device allocated keymap should be freed + * with a call to sparse_keymap_free(). + */ +int sparse_keymap_setup(struct input_dev *dev, + const struct key_entry *keymap, + int (*setup)(struct input_dev *, struct key_entry *)) +{ + size_t map_size = 1; /* to account for the last KE_END entry */ + const struct key_entry *e; + struct key_entry *map, *entry; + int i; + int error; + + for (e = keymap; e->type != KE_END; e++) + map_size++; + + map = kcalloc(map_size, sizeof(struct key_entry), GFP_KERNEL); + if (!map) + return -ENOMEM; + + memcpy(map, keymap, map_size * sizeof(struct key_entry)); + + for (i = 0; i < map_size; i++) { + entry = &map[i]; + + if (setup) { + error = setup(dev, entry); + if (error) + goto err_out; + } + + switch (entry->type) { + case KE_KEY: + __set_bit(EV_KEY, dev->evbit); + __set_bit(entry->keycode, dev->keybit); + break; + + case KE_SW: + case KE_VSW: + __set_bit(EV_SW, dev->evbit); + __set_bit(entry->sw.code, dev->swbit); + break; + } + } + + if (test_bit(EV_KEY, dev->evbit)) { + __set_bit(KEY_UNKNOWN, dev->keybit); + __set_bit(EV_MSC, dev->evbit); + __set_bit(MSC_SCAN, dev->mscbit); + } + + dev->keycode = map; + dev->keycodemax = map_size; + dev->getkeycode = sparse_keymap_getkeycode; + dev->setkeycode = sparse_keymap_setkeycode; + + return 0; + + err_out: + kfree(map); + return error; +} +EXPORT_SYMBOL(sparse_keymap_setup); + +/** + * sparse_keymap_free - free memory allocated for sparse keymap + * @dev: Input device using sparse keymap + * + * This function is used to free memory allocated by sparse keymap + * in an input device that was set up by sparse_keymap_setup(). + * NOTE: It is safe to cal this function while input device is + * still registered (however the drivers should care not to try to + * use freed keymap and thus have to shut off interrups/polling + * before freeing the keymap). + */ +void sparse_keymap_free(struct input_dev *dev) +{ + unsigned long flags; + + /* + * Take event lock to prevent racing with input_get_keycode() + * and input_set_keycode() if we are called while input device + * is still registered. + */ + spin_lock_irqsave(&dev->event_lock, flags); + + kfree(dev->keycode); + dev->keycode = NULL; + dev->keycodemax = 0; + + spin_unlock_irqrestore(&dev->event_lock, flags); +} +EXPORT_SYMBOL(sparse_keymap_free); + +/** + * sparse_keymap_report_entry - report event corresponding to given key entry + * @dev: Input device for which event should be reported + * @ke: key entry describing event + * @value: Value that should be reported (ignored by %KE_SW entries) + * @autorelease: Signals whether release event should be emitted for %KE_KEY + * entries right after reporting press event, ignored by all other + * entries + * + * This function is used to report input event described by given + * &struct key_entry. + */ +void sparse_keymap_report_entry(struct input_dev *dev, const struct key_entry *ke, + unsigned int value, bool autorelease) +{ + switch (ke->type) { + case KE_KEY: + input_event(dev, EV_MSC, MSC_SCAN, ke->code); + input_report_key(dev, ke->keycode, value); + input_sync(dev); + if (value && autorelease) { + input_report_key(dev, ke->keycode, 0); + input_sync(dev); + } + break; + + case KE_SW: + value = ke->sw.value; + /* fall through */ + + case KE_VSW: + input_report_switch(dev, ke->sw.code, value); + break; + } +} +EXPORT_SYMBOL(sparse_keymap_report_entry); + +/** + * sparse_keymap_report_event - report event corresponding to given scancode + * @dev: Input device using sparse keymap + * @code: Scan code + * @value: Value that should be reported (ignored by %KE_SW entries) + * @autorelease: Signals whether release event should be emitted for %KE_KEY + * entries right after reporting press event, ignored by all other + * entries + * + * This function is used to perform lookup in an input device using sparse + * keymap and report corresponding event. Returns %true if lookup was + * successful and %false otherwise. + */ +bool sparse_keymap_report_event(struct input_dev *dev, unsigned int code, + unsigned int value, bool autorelease) +{ + const struct key_entry *ke = + sparse_keymap_entry_from_scancode(dev, code); + struct key_entry unknown_ke; + + if (ke) { + sparse_keymap_report_entry(dev, ke, value, autorelease); + return true; + } + + /* Report an unknown key event as a debugging aid */ + unknown_ke.type = KE_KEY; + unknown_ke.code = code; + unknown_ke.keycode = KEY_UNKNOWN; + sparse_keymap_report_entry(dev, &unknown_ke, value, true); + + return false; +} +EXPORT_SYMBOL(sparse_keymap_report_event); + diff --git a/drivers/input/tablet/Kconfig b/drivers/input/tablet/Kconfig new file mode 100644 index 00000000..bed7cbf8 --- /dev/null +++ b/drivers/input/tablet/Kconfig @@ -0,0 +1,92 @@ +# +# Tablet driver configuration +# +menuconfig INPUT_TABLET + bool "Tablets" + help + Say Y here, and a list of supported tablets will be displayed. + This option doesn't affect the kernel. + + If unsure, say Y. + +if INPUT_TABLET + +config TABLET_USB_ACECAD + tristate "Acecad Flair tablet support (USB)" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use the USB version of the Acecad Flair + tablet. Make sure to say Y to "Mouse support" + (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support" + (CONFIG_INPUT_EVDEV) as well. + + To compile this driver as a module, choose M here: the + module will be called acecad. + +config TABLET_USB_AIPTEK + tristate "Aiptek 6000U/8000U and Genius G_PEN tablet support (USB)" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use the USB version of the Aiptek 6000U, + Aiptek 8000U or Genius G-PEN 560 tablet. Make sure to say Y to + "Mouse support" (CONFIG_INPUT_MOUSEDEV) and/or "Event interface + support" (CONFIG_INPUT_EVDEV) as well. + + To compile this driver as a module, choose M here: the + module will be called aiptek. + +config TABLET_USB_GTCO + tristate "GTCO CalComp/InterWrite USB Support" + depends on USB && INPUT + help + Say Y here if you want to use the USB version of the GTCO + CalComp/InterWrite Tablet. Make sure to say Y to "Mouse support" + (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support" + (CONFIG_INPUT_EVDEV) as well. + + To compile this driver as a module, choose M here: the + module will be called gtco. + +config TABLET_USB_HANWANG + tristate "Hanwang Art Master III tablet support (USB)" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use the USB version of the Hanwang Art + Master III tablet. + + To compile this driver as a module, choose M here: the + module will be called hanwang. + +config TABLET_USB_KBTAB + tristate "KB Gear JamStudio tablet support (USB)" + depends on USB_ARCH_HAS_HCD + select USB + help + Say Y here if you want to use the USB version of the KB Gear + JamStudio tablet. Make sure to say Y to "Mouse support" + (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support" + (CONFIG_INPUT_EVDEV) as well. + + To compile this driver as a module, choose M here: the + module will be called kbtab. + +config TABLET_USB_WACOM + tristate "Wacom Intuos/Graphire tablet support (USB)" + depends on USB_ARCH_HAS_HCD + select POWER_SUPPLY + select USB + select NEW_LEDS + select LEDS_CLASS + help + Say Y here if you want to use the USB version of the Wacom Intuos + or Graphire tablet. Make sure to say Y to "Mouse support" + (CONFIG_INPUT_MOUSEDEV) and/or "Event interface support" + (CONFIG_INPUT_EVDEV) as well. + + To compile this driver as a module, choose M here: the + module will be called wacom. + +endif diff --git a/drivers/input/tablet/Makefile b/drivers/input/tablet/Makefile new file mode 100644 index 00000000..3f6c2522 --- /dev/null +++ b/drivers/input/tablet/Makefile @@ -0,0 +1,13 @@ +# +# Makefile for the tablet drivers +# + +# Multipart objects. +wacom-objs := wacom_wac.o wacom_sys.o + +obj-$(CONFIG_TABLET_USB_ACECAD) += acecad.o +obj-$(CONFIG_TABLET_USB_AIPTEK) += aiptek.o +obj-$(CONFIG_TABLET_USB_GTCO) += gtco.o +obj-$(CONFIG_TABLET_USB_HANWANG) += hanwang.o +obj-$(CONFIG_TABLET_USB_KBTAB) += kbtab.o +obj-$(CONFIG_TABLET_USB_WACOM) += wacom.o diff --git a/drivers/input/tablet/acecad.c b/drivers/input/tablet/acecad.c new file mode 100644 index 00000000..e062ec89 --- /dev/null +++ b/drivers/input/tablet/acecad.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2001-2005 Edouard TISSERANT + * Copyright (c) 2004-2005 Stephane VOLTZ + * + * USB Acecad "Acecad Flair" tablet support + * + * Changelog: + * v3.2 - Added sysfs support + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include + +/* + * Version Information + */ +#define DRIVER_VERSION "v3.2" +#define DRIVER_DESC "USB Acecad Flair tablet driver" +#define DRIVER_LICENSE "GPL" +#define DRIVER_AUTHOR "Edouard TISSERANT " + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE(DRIVER_LICENSE); + +#define USB_VENDOR_ID_ACECAD 0x0460 +#define USB_DEVICE_ID_FLAIR 0x0004 +#define USB_DEVICE_ID_302 0x0008 + +struct usb_acecad { + char name[128]; + char phys[64]; + struct usb_device *usbdev; + struct usb_interface *intf; + struct input_dev *input; + struct urb *irq; + + unsigned char *data; + dma_addr_t data_dma; +}; + +static void usb_acecad_irq(struct urb *urb) +{ + struct usb_acecad *acecad = urb->context; + unsigned char *data = acecad->data; + struct input_dev *dev = acecad->input; + struct usb_interface *intf = acecad->intf; + int prox, status; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(&intf->dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + default: + dev_dbg(&intf->dev, "%s - nonzero urb status received: %d\n", + __func__, urb->status); + goto resubmit; + } + + prox = (data[0] & 0x04) >> 2; + input_report_key(dev, BTN_TOOL_PEN, prox); + + if (prox) { + int x = data[1] | (data[2] << 8); + int y = data[3] | (data[4] << 8); + /* Pressure should compute the same way for flair and 302 */ + int pressure = data[5] | (data[6] << 8); + int touch = data[0] & 0x01; + int stylus = (data[0] & 0x10) >> 4; + int stylus2 = (data[0] & 0x20) >> 5; + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + input_report_abs(dev, ABS_PRESSURE, pressure); + input_report_key(dev, BTN_TOUCH, touch); + input_report_key(dev, BTN_STYLUS, stylus); + input_report_key(dev, BTN_STYLUS2, stylus2); + } + + /* event termination */ + input_sync(dev); + +resubmit: + status = usb_submit_urb(urb, GFP_ATOMIC); + if (status) + dev_err(&intf->dev, + "can't resubmit intr, %s-%s/input0, status %d\n", + acecad->usbdev->bus->bus_name, + acecad->usbdev->devpath, status); +} + +static int usb_acecad_open(struct input_dev *dev) +{ + struct usb_acecad *acecad = input_get_drvdata(dev); + + acecad->irq->dev = acecad->usbdev; + if (usb_submit_urb(acecad->irq, GFP_KERNEL)) + return -EIO; + + return 0; +} + +static void usb_acecad_close(struct input_dev *dev) +{ + struct usb_acecad *acecad = input_get_drvdata(dev); + + usb_kill_urb(acecad->irq); +} + +static int usb_acecad_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *dev = interface_to_usbdev(intf); + struct usb_host_interface *interface = intf->cur_altsetting; + struct usb_endpoint_descriptor *endpoint; + struct usb_acecad *acecad; + struct input_dev *input_dev; + int pipe, maxp; + int err; + + if (interface->desc.bNumEndpoints != 1) + return -ENODEV; + + endpoint = &interface->endpoint[0].desc; + + if (!usb_endpoint_is_int_in(endpoint)) + return -ENODEV; + + pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); + maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe)); + + acecad = kzalloc(sizeof(struct usb_acecad), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!acecad || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + acecad->data = usb_alloc_coherent(dev, 8, GFP_KERNEL, &acecad->data_dma); + if (!acecad->data) { + err= -ENOMEM; + goto fail1; + } + + acecad->irq = usb_alloc_urb(0, GFP_KERNEL); + if (!acecad->irq) { + err = -ENOMEM; + goto fail2; + } + + acecad->usbdev = dev; + acecad->intf = intf; + acecad->input = input_dev; + + if (dev->manufacturer) + strlcpy(acecad->name, dev->manufacturer, sizeof(acecad->name)); + + if (dev->product) { + if (dev->manufacturer) + strlcat(acecad->name, " ", sizeof(acecad->name)); + strlcat(acecad->name, dev->product, sizeof(acecad->name)); + } + + usb_make_path(dev, acecad->phys, sizeof(acecad->phys)); + strlcat(acecad->phys, "/input0", sizeof(acecad->phys)); + + input_dev->name = acecad->name; + input_dev->phys = acecad->phys; + usb_to_input_id(dev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, acecad); + + input_dev->open = usb_acecad_open; + input_dev->close = usb_acecad_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_DIGI)] = BIT_MASK(BTN_TOOL_PEN) | + BIT_MASK(BTN_TOUCH) | BIT_MASK(BTN_STYLUS) | + BIT_MASK(BTN_STYLUS2); + + switch (id->driver_info) { + case 0: + input_set_abs_params(input_dev, ABS_X, 0, 5000, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 3750, 4, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 512, 0, 0); + if (!strlen(acecad->name)) + snprintf(acecad->name, sizeof(acecad->name), + "USB Acecad Flair Tablet %04x:%04x", + le16_to_cpu(dev->descriptor.idVendor), + le16_to_cpu(dev->descriptor.idProduct)); + break; + + case 1: + input_set_abs_params(input_dev, ABS_X, 0, 53000, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 2250, 4, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1024, 0, 0); + if (!strlen(acecad->name)) + snprintf(acecad->name, sizeof(acecad->name), + "USB Acecad 302 Tablet %04x:%04x", + le16_to_cpu(dev->descriptor.idVendor), + le16_to_cpu(dev->descriptor.idProduct)); + break; + } + + usb_fill_int_urb(acecad->irq, dev, pipe, + acecad->data, maxp > 8 ? 8 : maxp, + usb_acecad_irq, acecad, endpoint->bInterval); + acecad->irq->transfer_dma = acecad->data_dma; + acecad->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + err = input_register_device(acecad->input); + if (err) + goto fail3; + + usb_set_intfdata(intf, acecad); + + return 0; + + fail3: usb_free_urb(acecad->irq); + fail2: usb_free_coherent(dev, 8, acecad->data, acecad->data_dma); + fail1: input_free_device(input_dev); + kfree(acecad); + return err; +} + +static void usb_acecad_disconnect(struct usb_interface *intf) +{ + struct usb_acecad *acecad = usb_get_intfdata(intf); + + usb_set_intfdata(intf, NULL); + + input_unregister_device(acecad->input); + usb_free_urb(acecad->irq); + usb_free_coherent(acecad->usbdev, 8, acecad->data, acecad->data_dma); + kfree(acecad); +} + +static struct usb_device_id usb_acecad_id_table [] = { + { USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_FLAIR), .driver_info = 0 }, + { USB_DEVICE(USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_302), .driver_info = 1 }, + { } +}; + +MODULE_DEVICE_TABLE(usb, usb_acecad_id_table); + +static struct usb_driver usb_acecad_driver = { + .name = "usb_acecad", + .probe = usb_acecad_probe, + .disconnect = usb_acecad_disconnect, + .id_table = usb_acecad_id_table, +}; + +module_usb_driver(usb_acecad_driver); diff --git a/drivers/input/tablet/aiptek.c b/drivers/input/tablet/aiptek.c new file mode 100644 index 00000000..ee83c390 --- /dev/null +++ b/drivers/input/tablet/aiptek.c @@ -0,0 +1,1941 @@ +/* + * Native support for the Aiptek HyperPen USB Tablets + * (4000U/5000U/6000U/8000U/12000U) + * + * Copyright (c) 2001 Chris Atenasio + * Copyright (c) 2002-2004 Bryan W. Headley + * + * based on wacom.c by + * Vojtech Pavlik + * Andreas Bach Aaen + * Clifford Wolf + * Sam Mosel + * James E. Blair + * Daniel Egger + * + * Many thanks to Oliver Kuechemann for his support. + * + * ChangeLog: + * v0.1 - Initial release + * v0.2 - Hack to get around fake event 28's. (Bryan W. Headley) + * v0.3 - Make URB dynamic (Bryan W. Headley, Jun-8-2002) + * Released to Linux 2.4.19 and 2.5.x + * v0.4 - Rewrote substantial portions of the code to deal with + * corrected control sequences, timing, dynamic configuration, + * support of 6000U - 12000U, procfs, and macro key support + * (Jan-1-2003 - Feb-5-2003, Bryan W. Headley) + * v1.0 - Added support for diagnostic messages, count of messages + * received from URB - Mar-8-2003, Bryan W. Headley + * v1.1 - added support for tablet resolution, changed DV and proximity + * some corrections - Jun-22-2003, martin schneebacher + * - Added support for the sysfs interface, deprecating the + * procfs interface for 2.5.x kernel. Also added support for + * Wheel command. Bryan W. Headley July-15-2003. + * v1.2 - Reworked jitter timer as a kernel thread. + * Bryan W. Headley November-28-2003/Jan-10-2004. + * v1.3 - Repaired issue of kernel thread going nuts on single-processor + * machines, introduced programmableDelay as a command line + * parameter. Feb 7 2004, Bryan W. Headley. + * v1.4 - Re-wire jitter so it does not require a thread. Courtesy of + * Rene van Paassen. Added reporting of physical pointer device + * (e.g., stylus, mouse in reports 2, 3, 4, 5. We don't know + * for reports 1, 6.) + * what physical device reports for reports 1, 6.) Also enabled + * MOUSE and LENS tool button modes. Renamed "rubber" to "eraser". + * Feb 20, 2004, Bryan W. Headley. + * v1.5 - Added previousJitterable, so we don't do jitter delay when the + * user is holding a button down for periods of time. + * + * NOTE: + * This kernel driver is augmented by the "Aiptek" XFree86 input + * driver for your X server, as well as the Gaiptek GUI Front-end + * "Tablet Manager". + * These three products are highly interactive with one another, + * so therefore it's easier to document them all as one subsystem. + * Please visit the project's "home page", located at, + * http://aiptektablet.sourceforge.net. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Version Information + */ +#define DRIVER_VERSION "v2.3 (May 2, 2007)" +#define DRIVER_AUTHOR "Bryan W. Headley/Chris Atenasio/Cedric Brun/Rene van Paassen" +#define DRIVER_DESC "Aiptek HyperPen USB Tablet Driver (Linux 2.6.x)" + +/* + * Aiptek status packet: + * + * (returned as Report 1 - relative coordinates from mouse and stylus) + * + * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + * byte0 0 0 0 0 0 0 0 1 + * byte1 0 0 0 0 0 BS2 BS Tip + * byte2 X7 X6 X5 X4 X3 X2 X1 X0 + * byte3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 + * + * (returned as Report 2 - absolute coordinates from the stylus) + * + * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + * byte0 0 0 0 0 0 0 1 0 + * byte1 X7 X6 X5 X4 X3 X2 X1 X0 + * byte2 X15 X14 X13 X12 X11 X10 X9 X8 + * byte3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 + * byte4 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8 + * byte5 * * * BS2 BS1 Tip IR DV + * byte6 P7 P6 P5 P4 P3 P2 P1 P0 + * byte7 P15 P14 P13 P12 P11 P10 P9 P8 + * + * (returned as Report 3 - absolute coordinates from the mouse) + * + * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + * byte0 0 0 0 0 0 0 1 1 + * byte1 X7 X6 X5 X4 X3 X2 X1 X0 + * byte2 X15 X14 X13 X12 X11 X10 X9 X8 + * byte3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 + * byte4 Y15 Y14 Y13 Y12 Y11 Y10 Y9 Y8 + * byte5 * * * BS2 BS1 Tip IR DV + * byte6 P7 P6 P5 P4 P3 P2 P1 P0 + * byte7 P15 P14 P13 P12 P11 P10 P9 P8 + * + * (returned as Report 4 - macrokeys from the stylus) + * + * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + * byte0 0 0 0 0 0 1 0 0 + * byte1 0 0 0 BS2 BS Tip IR DV + * byte2 0 0 0 0 0 0 1 0 + * byte3 0 0 0 K4 K3 K2 K1 K0 + * byte4 P7 P6 P5 P4 P3 P2 P1 P0 + * byte5 P15 P14 P13 P12 P11 P10 P9 P8 + * + * (returned as Report 5 - macrokeys from the mouse) + * + * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + * byte0 0 0 0 0 0 1 0 1 + * byte1 0 0 0 BS2 BS Tip IR DV + * byte2 0 0 0 0 0 0 1 0 + * byte3 0 0 0 K4 K3 K2 K1 K0 + * byte4 P7 P6 P5 P4 P3 P2 P1 P0 + * byte5 P15 P14 P13 P12 P11 P10 P9 P8 + * + * IR: In Range = Proximity on + * DV = Data Valid + * BS = Barrel Switch (as in, macro keys) + * BS2 also referred to as Tablet Pick + * + * Command Summary: + * + * Use report_type CONTROL (3) + * Use report_id 2 + * + * Command/Data Description Return Bytes Return Value + * 0x10/0x00 SwitchToMouse 0 + * 0x10/0x01 SwitchToTablet 0 + * 0x18/0x04 SetResolution 0 + * 0x12/0xFF AutoGainOn 0 + * 0x17/0x00 FilterOn 0 + * 0x01/0x00 GetXExtension 2 MaxX + * 0x01/0x01 GetYExtension 2 MaxY + * 0x02/0x00 GetModelCode 2 ModelCode = LOBYTE + * 0x03/0x00 GetODMCode 2 ODMCode + * 0x08/0x00 GetPressureLevels 2 =512 + * 0x04/0x00 GetFirmwareVersion 2 Firmware Version + * 0x11/0x02 EnableMacroKeys 0 + * + * To initialize the tablet: + * + * (1) Send Resolution500LPI (Command) + * (2) Query for Model code (Option Report) + * (3) Query for ODM code (Option Report) + * (4) Query for firmware (Option Report) + * (5) Query for GetXExtension (Option Report) + * (6) Query for GetYExtension (Option Report) + * (7) Query for GetPressureLevels (Option Report) + * (8) SwitchToTablet for Absolute coordinates, or + * SwitchToMouse for Relative coordinates (Command) + * (9) EnableMacroKeys (Command) + * (10) FilterOn (Command) + * (11) AutoGainOn (Command) + * + * (Step 9 can be omitted, but you'll then have no function keys.) + */ + +#define USB_VENDOR_ID_AIPTEK 0x08ca +#define USB_VENDOR_ID_KYE 0x0458 +#define USB_REQ_GET_REPORT 0x01 +#define USB_REQ_SET_REPORT 0x09 + + /* PointerMode codes + */ +#define AIPTEK_POINTER_ONLY_MOUSE_MODE 0 +#define AIPTEK_POINTER_ONLY_STYLUS_MODE 1 +#define AIPTEK_POINTER_EITHER_MODE 2 + +#define AIPTEK_POINTER_ALLOW_MOUSE_MODE(a) \ + (a == AIPTEK_POINTER_ONLY_MOUSE_MODE || \ + a == AIPTEK_POINTER_EITHER_MODE) +#define AIPTEK_POINTER_ALLOW_STYLUS_MODE(a) \ + (a == AIPTEK_POINTER_ONLY_STYLUS_MODE || \ + a == AIPTEK_POINTER_EITHER_MODE) + + /* CoordinateMode code + */ +#define AIPTEK_COORDINATE_RELATIVE_MODE 0 +#define AIPTEK_COORDINATE_ABSOLUTE_MODE 1 + + /* XTilt and YTilt values + */ +#define AIPTEK_TILT_MIN (-128) +#define AIPTEK_TILT_MAX 127 +#define AIPTEK_TILT_DISABLE (-10101) + + /* Wheel values + */ +#define AIPTEK_WHEEL_MIN 0 +#define AIPTEK_WHEEL_MAX 1024 +#define AIPTEK_WHEEL_DISABLE (-10101) + + /* ToolCode values, which BTW are 0x140 .. 0x14f + * We have things set up such that if the tool button has changed, + * the tools get reset. + */ + /* toolMode codes + */ +#define AIPTEK_TOOL_BUTTON_PEN_MODE BTN_TOOL_PEN +#define AIPTEK_TOOL_BUTTON_PENCIL_MODE BTN_TOOL_PENCIL +#define AIPTEK_TOOL_BUTTON_BRUSH_MODE BTN_TOOL_BRUSH +#define AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE BTN_TOOL_AIRBRUSH +#define AIPTEK_TOOL_BUTTON_ERASER_MODE BTN_TOOL_RUBBER +#define AIPTEK_TOOL_BUTTON_MOUSE_MODE BTN_TOOL_MOUSE +#define AIPTEK_TOOL_BUTTON_LENS_MODE BTN_TOOL_LENS + + /* Diagnostic message codes + */ +#define AIPTEK_DIAGNOSTIC_NA 0 +#define AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE 1 +#define AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE 2 +#define AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED 3 + + /* Time to wait (in ms) to help mask hand jittering + * when pressing the stylus buttons. + */ +#define AIPTEK_JITTER_DELAY_DEFAULT 50 + + /* Time to wait (in ms) in-between sending the tablet + * a command and beginning the process of reading the return + * sequence from the tablet. + */ +#define AIPTEK_PROGRAMMABLE_DELAY_25 25 +#define AIPTEK_PROGRAMMABLE_DELAY_50 50 +#define AIPTEK_PROGRAMMABLE_DELAY_100 100 +#define AIPTEK_PROGRAMMABLE_DELAY_200 200 +#define AIPTEK_PROGRAMMABLE_DELAY_300 300 +#define AIPTEK_PROGRAMMABLE_DELAY_400 400 +#define AIPTEK_PROGRAMMABLE_DELAY_DEFAULT AIPTEK_PROGRAMMABLE_DELAY_400 + + /* Mouse button programming + */ +#define AIPTEK_MOUSE_LEFT_BUTTON 0x04 +#define AIPTEK_MOUSE_RIGHT_BUTTON 0x08 +#define AIPTEK_MOUSE_MIDDLE_BUTTON 0x10 + + /* Stylus button programming + */ +#define AIPTEK_STYLUS_LOWER_BUTTON 0x08 +#define AIPTEK_STYLUS_UPPER_BUTTON 0x10 + + /* Length of incoming packet from the tablet + */ +#define AIPTEK_PACKET_LENGTH 8 + + /* We report in EV_MISC both the proximity and + * whether the report came from the stylus, tablet mouse + * or "unknown" -- Unknown when the tablet is in relative + * mode, because we only get report 1's. + */ +#define AIPTEK_REPORT_TOOL_UNKNOWN 0x10 +#define AIPTEK_REPORT_TOOL_STYLUS 0x20 +#define AIPTEK_REPORT_TOOL_MOUSE 0x40 + +static int programmableDelay = AIPTEK_PROGRAMMABLE_DELAY_DEFAULT; +static int jitterDelay = AIPTEK_JITTER_DELAY_DEFAULT; + +struct aiptek_features { + int odmCode; /* Tablet manufacturer code */ + int modelCode; /* Tablet model code (not unique) */ + int firmwareCode; /* prom/eeprom version */ + char usbPath[64 + 1]; /* device's physical usb path */ +}; + +struct aiptek_settings { + int pointerMode; /* stylus-, mouse-only or either */ + int coordinateMode; /* absolute/relative coords */ + int toolMode; /* pen, pencil, brush, etc. tool */ + int xTilt; /* synthetic xTilt amount */ + int yTilt; /* synthetic yTilt amount */ + int wheel; /* synthetic wheel amount */ + int stylusButtonUpper; /* stylus upper btn delivers... */ + int stylusButtonLower; /* stylus lower btn delivers... */ + int mouseButtonLeft; /* mouse left btn delivers... */ + int mouseButtonMiddle; /* mouse middle btn delivers... */ + int mouseButtonRight; /* mouse right btn delivers... */ + int programmableDelay; /* delay for tablet programming */ + int jitterDelay; /* delay for hand jittering */ +}; + +struct aiptek { + struct input_dev *inputdev; /* input device struct */ + struct usb_device *usbdev; /* usb device struct */ + struct usb_interface *intf; /* usb interface struct */ + struct urb *urb; /* urb for incoming reports */ + dma_addr_t data_dma; /* our dma stuffage */ + struct aiptek_features features; /* tablet's array of features */ + struct aiptek_settings curSetting; /* tablet's current programmable */ + struct aiptek_settings newSetting; /* ... and new param settings */ + unsigned int ifnum; /* interface number for IO */ + int diagnostic; /* tablet diagnostic codes */ + unsigned long eventCount; /* event count */ + int inDelay; /* jitter: in jitter delay? */ + unsigned long endDelay; /* jitter: time when delay ends */ + int previousJitterable; /* jitterable prev value */ + + int lastMacro; /* macro key to reset */ + int previousToolMode; /* pen, pencil, brush, etc. tool */ + unsigned char *data; /* incoming packet data */ +}; + +static const int eventTypes[] = { + EV_KEY, EV_ABS, EV_REL, EV_MSC, +}; + +static const int absEvents[] = { + ABS_X, ABS_Y, ABS_PRESSURE, ABS_TILT_X, ABS_TILT_Y, + ABS_WHEEL, ABS_MISC, +}; + +static const int relEvents[] = { + REL_X, REL_Y, REL_WHEEL, +}; + +static const int buttonEvents[] = { + BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, + BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, + BTN_TOOL_BRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOUCH, + BTN_STYLUS, BTN_STYLUS2, +}; + +/* + * Permit easy lookup of keyboard events to send, versus + * the bitmap which comes from the tablet. This hides the + * issue that the F_keys are not sequentially numbered. + */ +static const int macroKeyEvents[] = { + KEY_ESC, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, + KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, + KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, + KEY_F18, KEY_F19, KEY_F20, KEY_F21, KEY_F22, KEY_F23, + KEY_F24, KEY_STOP, KEY_AGAIN, KEY_PROPS, KEY_UNDO, + KEY_FRONT, KEY_COPY, KEY_OPEN, KEY_PASTE, 0 +}; + +/*********************************************************************** + * Map values to strings and back. Every map should have the following + * as its last element: { NULL, AIPTEK_INVALID_VALUE }. + */ +#define AIPTEK_INVALID_VALUE -1 + +struct aiptek_map { + const char *string; + int value; +}; + +static int map_str_to_val(const struct aiptek_map *map, const char *str, size_t count) +{ + const struct aiptek_map *p; + + if (str[count - 1] == '\n') + count--; + + for (p = map; p->string; p++) + if (!strncmp(str, p->string, count)) + return p->value; + + return AIPTEK_INVALID_VALUE; +} + +static const char *map_val_to_str(const struct aiptek_map *map, int val) +{ + const struct aiptek_map *p; + + for (p = map; p->value != AIPTEK_INVALID_VALUE; p++) + if (val == p->value) + return p->string; + + return "unknown"; +} + +/*********************************************************************** + * aiptek_irq can receive one of six potential reports. + * The documentation for each is in the body of the function. + * + * The tablet reports on several attributes per invocation of + * aiptek_irq. Because the Linux Input Event system allows the + * transmission of ONE attribute per input_report_xxx() call, + * collation has to be done on the other end to reconstitute + * a complete tablet report. Further, the number of Input Event reports + * submitted varies, depending on what USB report type, and circumstance. + * To deal with this, EV_MSC is used to indicate an 'end-of-report' + * message. This has been an undocumented convention understood by the kernel + * tablet driver and clients such as gpm and XFree86's tablet drivers. + * + * Of the information received from the tablet, the one piece I + * cannot transmit is the proximity bit (without resorting to an EV_MSC + * convention above.) I therefore have taken over REL_MISC and ABS_MISC + * (for relative and absolute reports, respectively) for communicating + * Proximity. Why two events? I thought it interesting to know if the + * Proximity event occurred while the tablet was in absolute or relative + * mode. + * Update: REL_MISC proved not to be such a good idea. With REL_MISC you + * get an event transmitted each time. ABS_MISC works better, since it + * can be set and re-set. Thus, only using ABS_MISC from now on. + * + * Other tablets use the notion of a certain minimum stylus pressure + * to infer proximity. While that could have been done, that is yet + * another 'by convention' behavior, the documentation for which + * would be spread between two (or more) pieces of software. + * + * EV_MSC usage was terminated for this purpose in Linux 2.5.x, and + * replaced with the input_sync() method (which emits EV_SYN.) + */ + +static void aiptek_irq(struct urb *urb) +{ + struct aiptek *aiptek = urb->context; + unsigned char *data = aiptek->data; + struct input_dev *inputdev = aiptek->inputdev; + struct usb_interface *intf = aiptek->intf; + int jitterable = 0; + int retval, macro, x, y, z, left, right, middle, p, dv, tip, bs, pck; + + switch (urb->status) { + case 0: + /* Success */ + break; + + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* This urb is terminated, clean up */ + dev_dbg(&intf->dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + + default: + dev_dbg(&intf->dev, "%s - nonzero urb status received: %d\n", + __func__, urb->status); + goto exit; + } + + /* See if we are in a delay loop -- throw out report if true. + */ + if (aiptek->inDelay == 1 && time_after(aiptek->endDelay, jiffies)) { + goto exit; + } + + aiptek->inDelay = 0; + aiptek->eventCount++; + + /* Report 1 delivers relative coordinates with either a stylus + * or the mouse. You do not know, however, which input + * tool generated the event. + */ + if (data[0] == 1) { + if (aiptek->curSetting.coordinateMode == + AIPTEK_COORDINATE_ABSOLUTE_MODE) { + aiptek->diagnostic = + AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE; + } else { + x = (signed char) data[2]; + y = (signed char) data[3]; + + /* jitterable keeps track of whether any button has been pressed. + * We're also using it to remap the physical mouse button mask + * to pseudo-settings. (We don't specifically care about it's + * value after moving/transposing mouse button bitmasks, except + * that a non-zero value indicates that one or more + * mouse button was pressed.) + */ + jitterable = data[1] & 0x07; + + left = (data[1] & aiptek->curSetting.mouseButtonLeft >> 2) != 0 ? 1 : 0; + right = (data[1] & aiptek->curSetting.mouseButtonRight >> 2) != 0 ? 1 : 0; + middle = (data[1] & aiptek->curSetting.mouseButtonMiddle >> 2) != 0 ? 1 : 0; + + input_report_key(inputdev, BTN_LEFT, left); + input_report_key(inputdev, BTN_MIDDLE, middle); + input_report_key(inputdev, BTN_RIGHT, right); + + input_report_abs(inputdev, ABS_MISC, + 1 | AIPTEK_REPORT_TOOL_UNKNOWN); + input_report_rel(inputdev, REL_X, x); + input_report_rel(inputdev, REL_Y, y); + + /* Wheel support is in the form of a single-event + * firing. + */ + if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) { + input_report_rel(inputdev, REL_WHEEL, + aiptek->curSetting.wheel); + aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; + } + if (aiptek->lastMacro != -1) { + input_report_key(inputdev, + macroKeyEvents[aiptek->lastMacro], 0); + aiptek->lastMacro = -1; + } + input_sync(inputdev); + } + } + /* Report 2 is delivered only by the stylus, and delivers + * absolute coordinates. + */ + else if (data[0] == 2) { + if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) { + aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE; + } else if (!AIPTEK_POINTER_ALLOW_STYLUS_MODE + (aiptek->curSetting.pointerMode)) { + aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED; + } else { + x = get_unaligned_le16(data + 1); + y = get_unaligned_le16(data + 3); + z = get_unaligned_le16(data + 6); + + dv = (data[5] & 0x01) != 0 ? 1 : 0; + p = (data[5] & 0x02) != 0 ? 1 : 0; + tip = (data[5] & 0x04) != 0 ? 1 : 0; + + /* Use jitterable to re-arrange button masks + */ + jitterable = data[5] & 0x18; + + bs = (data[5] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0; + pck = (data[5] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0; + + /* dv indicates 'data valid' (e.g., the tablet is in sync + * and has delivered a "correct" report) We will ignore + * all 'bad' reports... + */ + if (dv != 0) { + /* If the selected tool changed, reset the old + * tool key, and set the new one. + */ + if (aiptek->previousToolMode != + aiptek->curSetting.toolMode) { + input_report_key(inputdev, + aiptek->previousToolMode, 0); + input_report_key(inputdev, + aiptek->curSetting.toolMode, + 1); + aiptek->previousToolMode = + aiptek->curSetting.toolMode; + } + + if (p != 0) { + input_report_abs(inputdev, ABS_X, x); + input_report_abs(inputdev, ABS_Y, y); + input_report_abs(inputdev, ABS_PRESSURE, z); + + input_report_key(inputdev, BTN_TOUCH, tip); + input_report_key(inputdev, BTN_STYLUS, bs); + input_report_key(inputdev, BTN_STYLUS2, pck); + + if (aiptek->curSetting.xTilt != + AIPTEK_TILT_DISABLE) { + input_report_abs(inputdev, + ABS_TILT_X, + aiptek->curSetting.xTilt); + } + if (aiptek->curSetting.yTilt != AIPTEK_TILT_DISABLE) { + input_report_abs(inputdev, + ABS_TILT_Y, + aiptek->curSetting.yTilt); + } + + /* Wheel support is in the form of a single-event + * firing. + */ + if (aiptek->curSetting.wheel != + AIPTEK_WHEEL_DISABLE) { + input_report_abs(inputdev, + ABS_WHEEL, + aiptek->curSetting.wheel); + aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; + } + } + input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_STYLUS); + if (aiptek->lastMacro != -1) { + input_report_key(inputdev, + macroKeyEvents[aiptek->lastMacro], 0); + aiptek->lastMacro = -1; + } + input_sync(inputdev); + } + } + } + /* Report 3's come from the mouse in absolute mode. + */ + else if (data[0] == 3) { + if (aiptek->curSetting.coordinateMode == AIPTEK_COORDINATE_RELATIVE_MODE) { + aiptek->diagnostic = AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE; + } else if (!AIPTEK_POINTER_ALLOW_MOUSE_MODE + (aiptek->curSetting.pointerMode)) { + aiptek->diagnostic = AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED; + } else { + x = get_unaligned_le16(data + 1); + y = get_unaligned_le16(data + 3); + + jitterable = data[5] & 0x1c; + + dv = (data[5] & 0x01) != 0 ? 1 : 0; + p = (data[5] & 0x02) != 0 ? 1 : 0; + left = (data[5] & aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0; + right = (data[5] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0; + middle = (data[5] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; + + if (dv != 0) { + /* If the selected tool changed, reset the old + * tool key, and set the new one. + */ + if (aiptek->previousToolMode != + aiptek->curSetting.toolMode) { + input_report_key(inputdev, + aiptek->previousToolMode, 0); + input_report_key(inputdev, + aiptek->curSetting.toolMode, + 1); + aiptek->previousToolMode = + aiptek->curSetting.toolMode; + } + + if (p != 0) { + input_report_abs(inputdev, ABS_X, x); + input_report_abs(inputdev, ABS_Y, y); + + input_report_key(inputdev, BTN_LEFT, left); + input_report_key(inputdev, BTN_MIDDLE, middle); + input_report_key(inputdev, BTN_RIGHT, right); + + /* Wheel support is in the form of a single-event + * firing. + */ + if (aiptek->curSetting.wheel != AIPTEK_WHEEL_DISABLE) { + input_report_abs(inputdev, + ABS_WHEEL, + aiptek->curSetting.wheel); + aiptek->curSetting.wheel = AIPTEK_WHEEL_DISABLE; + } + } + input_report_abs(inputdev, ABS_MISC, p | AIPTEK_REPORT_TOOL_MOUSE); + if (aiptek->lastMacro != -1) { + input_report_key(inputdev, + macroKeyEvents[aiptek->lastMacro], 0); + aiptek->lastMacro = -1; + } + input_sync(inputdev); + } + } + } + /* Report 4s come from the macro keys when pressed by stylus + */ + else if (data[0] == 4) { + jitterable = data[1] & 0x18; + + dv = (data[1] & 0x01) != 0 ? 1 : 0; + p = (data[1] & 0x02) != 0 ? 1 : 0; + tip = (data[1] & 0x04) != 0 ? 1 : 0; + bs = (data[1] & aiptek->curSetting.stylusButtonLower) != 0 ? 1 : 0; + pck = (data[1] & aiptek->curSetting.stylusButtonUpper) != 0 ? 1 : 0; + + macro = dv && p && tip && !(data[3] & 1) ? (data[3] >> 1) : -1; + z = get_unaligned_le16(data + 4); + + if (dv) { + /* If the selected tool changed, reset the old + * tool key, and set the new one. + */ + if (aiptek->previousToolMode != + aiptek->curSetting.toolMode) { + input_report_key(inputdev, + aiptek->previousToolMode, 0); + input_report_key(inputdev, + aiptek->curSetting.toolMode, + 1); + aiptek->previousToolMode = + aiptek->curSetting.toolMode; + } + } + + if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) { + input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0); + aiptek->lastMacro = -1; + } + + if (macro != -1 && macro != aiptek->lastMacro) { + input_report_key(inputdev, macroKeyEvents[macro], 1); + aiptek->lastMacro = macro; + } + input_report_abs(inputdev, ABS_MISC, + p | AIPTEK_REPORT_TOOL_STYLUS); + input_sync(inputdev); + } + /* Report 5s come from the macro keys when pressed by mouse + */ + else if (data[0] == 5) { + jitterable = data[1] & 0x1c; + + dv = (data[1] & 0x01) != 0 ? 1 : 0; + p = (data[1] & 0x02) != 0 ? 1 : 0; + left = (data[1]& aiptek->curSetting.mouseButtonLeft) != 0 ? 1 : 0; + right = (data[1] & aiptek->curSetting.mouseButtonRight) != 0 ? 1 : 0; + middle = (data[1] & aiptek->curSetting.mouseButtonMiddle) != 0 ? 1 : 0; + macro = dv && p && left && !(data[3] & 1) ? (data[3] >> 1) : 0; + + if (dv) { + /* If the selected tool changed, reset the old + * tool key, and set the new one. + */ + if (aiptek->previousToolMode != + aiptek->curSetting.toolMode) { + input_report_key(inputdev, + aiptek->previousToolMode, 0); + input_report_key(inputdev, + aiptek->curSetting.toolMode, 1); + aiptek->previousToolMode = aiptek->curSetting.toolMode; + } + } + + if (aiptek->lastMacro != -1 && aiptek->lastMacro != macro) { + input_report_key(inputdev, macroKeyEvents[aiptek->lastMacro], 0); + aiptek->lastMacro = -1; + } + + if (macro != -1 && macro != aiptek->lastMacro) { + input_report_key(inputdev, macroKeyEvents[macro], 1); + aiptek->lastMacro = macro; + } + + input_report_abs(inputdev, ABS_MISC, + p | AIPTEK_REPORT_TOOL_MOUSE); + input_sync(inputdev); + } + /* We have no idea which tool can generate a report 6. Theoretically, + * neither need to, having been given reports 4 & 5 for such use. + * However, report 6 is the 'official-looking' report for macroKeys; + * reports 4 & 5 supposively are used to support unnamed, unknown + * hat switches (which just so happen to be the macroKeys.) + */ + else if (data[0] == 6) { + macro = get_unaligned_le16(data + 1); + if (macro > 0) { + input_report_key(inputdev, macroKeyEvents[macro - 1], + 0); + } + if (macro < 25) { + input_report_key(inputdev, macroKeyEvents[macro + 1], + 0); + } + + /* If the selected tool changed, reset the old + tool key, and set the new one. + */ + if (aiptek->previousToolMode != + aiptek->curSetting.toolMode) { + input_report_key(inputdev, + aiptek->previousToolMode, 0); + input_report_key(inputdev, + aiptek->curSetting.toolMode, + 1); + aiptek->previousToolMode = + aiptek->curSetting.toolMode; + } + + input_report_key(inputdev, macroKeyEvents[macro], 1); + input_report_abs(inputdev, ABS_MISC, + 1 | AIPTEK_REPORT_TOOL_UNKNOWN); + input_sync(inputdev); + } else { + dev_dbg(&intf->dev, "Unknown report %d\n", data[0]); + } + + /* Jitter may occur when the user presses a button on the stlyus + * or the mouse. What we do to prevent that is wait 'x' milliseconds + * following a 'jitterable' event, which should give the hand some time + * stabilize itself. + * + * We just introduced aiptek->previousJitterable to carry forth the + * notion that jitter occurs when the button state changes from on to off: + * a person drawing, holding a button down is not subject to jittering. + * With that in mind, changing from upper button depressed to lower button + * WILL transition through a jitter delay. + */ + + if (aiptek->previousJitterable != jitterable && + aiptek->curSetting.jitterDelay != 0 && aiptek->inDelay != 1) { + aiptek->endDelay = jiffies + + ((aiptek->curSetting.jitterDelay * HZ) / 1000); + aiptek->inDelay = 1; + } + aiptek->previousJitterable = jitterable; + +exit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval != 0) { + dev_err(&intf->dev, + "%s - usb_submit_urb failed with result %d\n", + __func__, retval); + } +} + +/*********************************************************************** + * These are the USB id's known so far. We do not identify them to + * specific Aiptek model numbers, because there has been overlaps, + * use, and reuse of id's in existing models. Certain models have + * been known to use more than one ID, indicative perhaps of + * manufacturing revisions. In any event, we consider these + * IDs to not be model-specific nor unique. + */ +static const struct usb_device_id aiptek_ids[] = { + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x01)}, + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x10)}, + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x20)}, + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x21)}, + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x22)}, + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x23)}, + {USB_DEVICE(USB_VENDOR_ID_AIPTEK, 0x24)}, + {USB_DEVICE(USB_VENDOR_ID_KYE, 0x5003)}, + {} +}; + +MODULE_DEVICE_TABLE(usb, aiptek_ids); + +/*********************************************************************** + * Open an instance of the tablet driver. + */ +static int aiptek_open(struct input_dev *inputdev) +{ + struct aiptek *aiptek = input_get_drvdata(inputdev); + + aiptek->urb->dev = aiptek->usbdev; + if (usb_submit_urb(aiptek->urb, GFP_KERNEL) != 0) + return -EIO; + + return 0; +} + +/*********************************************************************** + * Close an instance of the tablet driver. + */ +static void aiptek_close(struct input_dev *inputdev) +{ + struct aiptek *aiptek = input_get_drvdata(inputdev); + + usb_kill_urb(aiptek->urb); +} + +/*********************************************************************** + * aiptek_set_report and aiptek_get_report() are borrowed from Linux 2.4.x, + * where they were known as usb_set_report and usb_get_report. + */ +static int +aiptek_set_report(struct aiptek *aiptek, + unsigned char report_type, + unsigned char report_id, void *buffer, int size) +{ + return usb_control_msg(aiptek->usbdev, + usb_sndctrlpipe(aiptek->usbdev, 0), + USB_REQ_SET_REPORT, + USB_TYPE_CLASS | USB_RECIP_INTERFACE | + USB_DIR_OUT, (report_type << 8) + report_id, + aiptek->ifnum, buffer, size, 5000); +} + +static int +aiptek_get_report(struct aiptek *aiptek, + unsigned char report_type, + unsigned char report_id, void *buffer, int size) +{ + return usb_control_msg(aiptek->usbdev, + usb_rcvctrlpipe(aiptek->usbdev, 0), + USB_REQ_GET_REPORT, + USB_TYPE_CLASS | USB_RECIP_INTERFACE | + USB_DIR_IN, (report_type << 8) + report_id, + aiptek->ifnum, buffer, size, 5000); +} + +/*********************************************************************** + * Send a command to the tablet. + */ +static int +aiptek_command(struct aiptek *aiptek, unsigned char command, unsigned char data) +{ + const int sizeof_buf = 3 * sizeof(u8); + int ret; + u8 *buf; + + buf = kmalloc(sizeof_buf, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + buf[0] = 2; + buf[1] = command; + buf[2] = data; + + if ((ret = + aiptek_set_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) { + dev_dbg(&aiptek->intf->dev, + "aiptek_program: failed, tried to send: 0x%02x 0x%02x\n", + command, data); + } + kfree(buf); + return ret < 0 ? ret : 0; +} + +/*********************************************************************** + * Retrieve information from the tablet. Querying info is defined as first + * sending the {command,data} sequence as a command, followed by a wait + * (aka, "programmaticDelay") and then a "read" request. + */ +static int +aiptek_query(struct aiptek *aiptek, unsigned char command, unsigned char data) +{ + const int sizeof_buf = 3 * sizeof(u8); + int ret; + u8 *buf; + + buf = kmalloc(sizeof_buf, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + buf[0] = 2; + buf[1] = command; + buf[2] = data; + + if (aiptek_command(aiptek, command, data) != 0) { + kfree(buf); + return -EIO; + } + msleep(aiptek->curSetting.programmableDelay); + + if ((ret = + aiptek_get_report(aiptek, 3, 2, buf, sizeof_buf)) != sizeof_buf) { + dev_dbg(&aiptek->intf->dev, + "aiptek_query failed: returned 0x%02x 0x%02x 0x%02x\n", + buf[0], buf[1], buf[2]); + ret = -EIO; + } else { + ret = get_unaligned_le16(buf + 1); + } + kfree(buf); + return ret; +} + +/*********************************************************************** + * Program the tablet into either absolute or relative mode. + * We also get information about the tablet's size. + */ +static int aiptek_program_tablet(struct aiptek *aiptek) +{ + int ret; + /* Execute Resolution500LPI */ + if ((ret = aiptek_command(aiptek, 0x18, 0x04)) < 0) + return ret; + + /* Query getModelCode */ + if ((ret = aiptek_query(aiptek, 0x02, 0x00)) < 0) + return ret; + aiptek->features.modelCode = ret & 0xff; + + /* Query getODMCode */ + if ((ret = aiptek_query(aiptek, 0x03, 0x00)) < 0) + return ret; + aiptek->features.odmCode = ret; + + /* Query getFirmwareCode */ + if ((ret = aiptek_query(aiptek, 0x04, 0x00)) < 0) + return ret; + aiptek->features.firmwareCode = ret; + + /* Query getXextension */ + if ((ret = aiptek_query(aiptek, 0x01, 0x00)) < 0) + return ret; + input_set_abs_params(aiptek->inputdev, ABS_X, 0, ret - 1, 0, 0); + + /* Query getYextension */ + if ((ret = aiptek_query(aiptek, 0x01, 0x01)) < 0) + return ret; + input_set_abs_params(aiptek->inputdev, ABS_Y, 0, ret - 1, 0, 0); + + /* Query getPressureLevels */ + if ((ret = aiptek_query(aiptek, 0x08, 0x00)) < 0) + return ret; + input_set_abs_params(aiptek->inputdev, ABS_PRESSURE, 0, ret - 1, 0, 0); + + /* Depending on whether we are in absolute or relative mode, we will + * do a switchToTablet(absolute) or switchToMouse(relative) command. + */ + if (aiptek->curSetting.coordinateMode == + AIPTEK_COORDINATE_ABSOLUTE_MODE) { + /* Execute switchToTablet */ + if ((ret = aiptek_command(aiptek, 0x10, 0x01)) < 0) { + return ret; + } + } else { + /* Execute switchToMouse */ + if ((ret = aiptek_command(aiptek, 0x10, 0x00)) < 0) { + return ret; + } + } + + /* Enable the macro keys */ + if ((ret = aiptek_command(aiptek, 0x11, 0x02)) < 0) + return ret; +#if 0 + /* Execute FilterOn */ + if ((ret = aiptek_command(aiptek, 0x17, 0x00)) < 0) + return ret; +#endif + + /* Execute AutoGainOn */ + if ((ret = aiptek_command(aiptek, 0x12, 0xff)) < 0) + return ret; + + /* Reset the eventCount, so we track events from last (re)programming + */ + aiptek->diagnostic = AIPTEK_DIAGNOSTIC_NA; + aiptek->eventCount = 0; + + return 0; +} + +/*********************************************************************** + * Sysfs functions. Sysfs prefers that individually-tunable parameters + * exist in their separate pseudo-files. Summary data that is immutable + * may exist in a singular file so long as you don't define a writeable + * interface. + */ + +/*********************************************************************** + * support the 'size' file -- display support + */ +static ssize_t show_tabletSize(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%dx%d\n", + input_abs_get_max(aiptek->inputdev, ABS_X) + 1, + input_abs_get_max(aiptek->inputdev, ABS_Y) + 1); +} + +/* These structs define the sysfs files, param #1 is the name of the + * file, param 2 is the file permissions, param 3 & 4 are to the + * output generator and input parser routines. Absence of a routine is + * permitted -- it only means can't either 'cat' the file, or send data + * to it. + */ +static DEVICE_ATTR(size, S_IRUGO, show_tabletSize, NULL); + +/*********************************************************************** + * support routines for the 'pointer_mode' file. Note that this file + * both displays current setting and allows reprogramming. + */ +static struct aiptek_map pointer_mode_map[] = { + { "stylus", AIPTEK_POINTER_ONLY_STYLUS_MODE }, + { "mouse", AIPTEK_POINTER_ONLY_MOUSE_MODE }, + { "either", AIPTEK_POINTER_EITHER_MODE }, + { NULL, AIPTEK_INVALID_VALUE } +}; + +static ssize_t show_tabletPointerMode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(pointer_mode_map, + aiptek->curSetting.pointerMode)); +} + +static ssize_t +store_tabletPointerMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_mode = map_str_to_val(pointer_mode_map, buf, count); + + if (new_mode == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.pointerMode = new_mode; + return count; +} + +static DEVICE_ATTR(pointer_mode, + S_IRUGO | S_IWUSR, + show_tabletPointerMode, store_tabletPointerMode); + +/*********************************************************************** + * support routines for the 'coordinate_mode' file. Note that this file + * both displays current setting and allows reprogramming. + */ + +static struct aiptek_map coordinate_mode_map[] = { + { "absolute", AIPTEK_COORDINATE_ABSOLUTE_MODE }, + { "relative", AIPTEK_COORDINATE_RELATIVE_MODE }, + { NULL, AIPTEK_INVALID_VALUE } +}; + +static ssize_t show_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(coordinate_mode_map, + aiptek->curSetting.coordinateMode)); +} + +static ssize_t +store_tabletCoordinateMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_mode = map_str_to_val(coordinate_mode_map, buf, count); + + if (new_mode == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.coordinateMode = new_mode; + return count; +} + +static DEVICE_ATTR(coordinate_mode, + S_IRUGO | S_IWUSR, + show_tabletCoordinateMode, store_tabletCoordinateMode); + +/*********************************************************************** + * support routines for the 'tool_mode' file. Note that this file + * both displays current setting and allows reprogramming. + */ + +static struct aiptek_map tool_mode_map[] = { + { "mouse", AIPTEK_TOOL_BUTTON_MOUSE_MODE }, + { "eraser", AIPTEK_TOOL_BUTTON_ERASER_MODE }, + { "pencil", AIPTEK_TOOL_BUTTON_PENCIL_MODE }, + { "pen", AIPTEK_TOOL_BUTTON_PEN_MODE }, + { "brush", AIPTEK_TOOL_BUTTON_BRUSH_MODE }, + { "airbrush", AIPTEK_TOOL_BUTTON_AIRBRUSH_MODE }, + { "lens", AIPTEK_TOOL_BUTTON_LENS_MODE }, + { NULL, AIPTEK_INVALID_VALUE } +}; + +static ssize_t show_tabletToolMode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(tool_mode_map, + aiptek->curSetting.toolMode)); +} + +static ssize_t +store_tabletToolMode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_mode = map_str_to_val(tool_mode_map, buf, count); + + if (new_mode == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.toolMode = new_mode; + return count; +} + +static DEVICE_ATTR(tool_mode, + S_IRUGO | S_IWUSR, + show_tabletToolMode, store_tabletToolMode); + +/*********************************************************************** + * support routines for the 'xtilt' file. Note that this file + * both displays current setting and allows reprogramming. + */ +static ssize_t show_tabletXtilt(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + if (aiptek->curSetting.xTilt == AIPTEK_TILT_DISABLE) { + return snprintf(buf, PAGE_SIZE, "disable\n"); + } else { + return snprintf(buf, PAGE_SIZE, "%d\n", + aiptek->curSetting.xTilt); + } +} + +static ssize_t +store_tabletXtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int x; + + if (kstrtoint(buf, 10, &x)) { + size_t len = buf[count - 1] == '\n' ? count - 1 : count; + + if (strncmp(buf, "disable", len)) + return -EINVAL; + + aiptek->newSetting.xTilt = AIPTEK_TILT_DISABLE; + } else { + if (x < AIPTEK_TILT_MIN || x > AIPTEK_TILT_MAX) + return -EINVAL; + + aiptek->newSetting.xTilt = x; + } + + return count; +} + +static DEVICE_ATTR(xtilt, + S_IRUGO | S_IWUSR, show_tabletXtilt, store_tabletXtilt); + +/*********************************************************************** + * support routines for the 'ytilt' file. Note that this file + * both displays current setting and allows reprogramming. + */ +static ssize_t show_tabletYtilt(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + if (aiptek->curSetting.yTilt == AIPTEK_TILT_DISABLE) { + return snprintf(buf, PAGE_SIZE, "disable\n"); + } else { + return snprintf(buf, PAGE_SIZE, "%d\n", + aiptek->curSetting.yTilt); + } +} + +static ssize_t +store_tabletYtilt(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int y; + + if (kstrtoint(buf, 10, &y)) { + size_t len = buf[count - 1] == '\n' ? count - 1 : count; + + if (strncmp(buf, "disable", len)) + return -EINVAL; + + aiptek->newSetting.yTilt = AIPTEK_TILT_DISABLE; + } else { + if (y < AIPTEK_TILT_MIN || y > AIPTEK_TILT_MAX) + return -EINVAL; + + aiptek->newSetting.yTilt = y; + } + + return count; +} + +static DEVICE_ATTR(ytilt, + S_IRUGO | S_IWUSR, show_tabletYtilt, store_tabletYtilt); + +/*********************************************************************** + * support routines for the 'jitter' file. Note that this file + * both displays current setting and allows reprogramming. + */ +static ssize_t show_tabletJitterDelay(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d\n", aiptek->curSetting.jitterDelay); +} + +static ssize_t +store_tabletJitterDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int err, j; + + err = kstrtoint(buf, 10, &j); + if (err) + return err; + + aiptek->newSetting.jitterDelay = j; + return count; +} + +static DEVICE_ATTR(jitter, + S_IRUGO | S_IWUSR, + show_tabletJitterDelay, store_tabletJitterDelay); + +/*********************************************************************** + * support routines for the 'delay' file. Note that this file + * both displays current setting and allows reprogramming. + */ +static ssize_t show_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%d\n", + aiptek->curSetting.programmableDelay); +} + +static ssize_t +store_tabletProgrammableDelay(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int err, d; + + err = kstrtoint(buf, 10, &d); + if (err) + return err; + + aiptek->newSetting.programmableDelay = d; + return count; +} + +static DEVICE_ATTR(delay, + S_IRUGO | S_IWUSR, + show_tabletProgrammableDelay, store_tabletProgrammableDelay); + +/*********************************************************************** + * support routines for the 'event_count' file. Note that this file + * only displays current setting. + */ +static ssize_t show_tabletEventsReceived(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%ld\n", aiptek->eventCount); +} + +static DEVICE_ATTR(event_count, S_IRUGO, show_tabletEventsReceived, NULL); + +/*********************************************************************** + * support routines for the 'diagnostic' file. Note that this file + * only displays current setting. + */ +static ssize_t show_tabletDiagnosticMessage(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + char *retMsg; + + switch (aiptek->diagnostic) { + case AIPTEK_DIAGNOSTIC_NA: + retMsg = "no errors\n"; + break; + + case AIPTEK_DIAGNOSTIC_SENDING_RELATIVE_IN_ABSOLUTE: + retMsg = "Error: receiving relative reports\n"; + break; + + case AIPTEK_DIAGNOSTIC_SENDING_ABSOLUTE_IN_RELATIVE: + retMsg = "Error: receiving absolute reports\n"; + break; + + case AIPTEK_DIAGNOSTIC_TOOL_DISALLOWED: + if (aiptek->curSetting.pointerMode == + AIPTEK_POINTER_ONLY_MOUSE_MODE) { + retMsg = "Error: receiving stylus reports\n"; + } else { + retMsg = "Error: receiving mouse reports\n"; + } + break; + + default: + return 0; + } + return snprintf(buf, PAGE_SIZE, retMsg); +} + +static DEVICE_ATTR(diagnostic, S_IRUGO, show_tabletDiagnosticMessage, NULL); + +/*********************************************************************** + * support routines for the 'stylus_upper' file. Note that this file + * both displays current setting and allows for setting changing. + */ + +static struct aiptek_map stylus_button_map[] = { + { "upper", AIPTEK_STYLUS_UPPER_BUTTON }, + { "lower", AIPTEK_STYLUS_LOWER_BUTTON }, + { NULL, AIPTEK_INVALID_VALUE } +}; + +static ssize_t show_tabletStylusUpper(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(stylus_button_map, + aiptek->curSetting.stylusButtonUpper)); +} + +static ssize_t +store_tabletStylusUpper(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_button = map_str_to_val(stylus_button_map, buf, count); + + if (new_button == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.stylusButtonUpper = new_button; + return count; +} + +static DEVICE_ATTR(stylus_upper, + S_IRUGO | S_IWUSR, + show_tabletStylusUpper, store_tabletStylusUpper); + +/*********************************************************************** + * support routines for the 'stylus_lower' file. Note that this file + * both displays current setting and allows for setting changing. + */ + +static ssize_t show_tabletStylusLower(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(stylus_button_map, + aiptek->curSetting.stylusButtonLower)); +} + +static ssize_t +store_tabletStylusLower(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_button = map_str_to_val(stylus_button_map, buf, count); + + if (new_button == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.stylusButtonLower = new_button; + return count; +} + +static DEVICE_ATTR(stylus_lower, + S_IRUGO | S_IWUSR, + show_tabletStylusLower, store_tabletStylusLower); + +/*********************************************************************** + * support routines for the 'mouse_left' file. Note that this file + * both displays current setting and allows for setting changing. + */ + +static struct aiptek_map mouse_button_map[] = { + { "left", AIPTEK_MOUSE_LEFT_BUTTON }, + { "middle", AIPTEK_MOUSE_MIDDLE_BUTTON }, + { "right", AIPTEK_MOUSE_RIGHT_BUTTON }, + { NULL, AIPTEK_INVALID_VALUE } +}; + +static ssize_t show_tabletMouseLeft(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(mouse_button_map, + aiptek->curSetting.mouseButtonLeft)); +} + +static ssize_t +store_tabletMouseLeft(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_button = map_str_to_val(mouse_button_map, buf, count); + + if (new_button == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.mouseButtonLeft = new_button; + return count; +} + +static DEVICE_ATTR(mouse_left, + S_IRUGO | S_IWUSR, + show_tabletMouseLeft, store_tabletMouseLeft); + +/*********************************************************************** + * support routines for the 'mouse_middle' file. Note that this file + * both displays current setting and allows for setting changing. + */ +static ssize_t show_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(mouse_button_map, + aiptek->curSetting.mouseButtonMiddle)); +} + +static ssize_t +store_tabletMouseMiddle(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_button = map_str_to_val(mouse_button_map, buf, count); + + if (new_button == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.mouseButtonMiddle = new_button; + return count; +} + +static DEVICE_ATTR(mouse_middle, + S_IRUGO | S_IWUSR, + show_tabletMouseMiddle, store_tabletMouseMiddle); + +/*********************************************************************** + * support routines for the 'mouse_right' file. Note that this file + * both displays current setting and allows for setting changing. + */ +static ssize_t show_tabletMouseRight(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%s\n", + map_val_to_str(mouse_button_map, + aiptek->curSetting.mouseButtonRight)); +} + +static ssize_t +store_tabletMouseRight(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int new_button = map_str_to_val(mouse_button_map, buf, count); + + if (new_button == AIPTEK_INVALID_VALUE) + return -EINVAL; + + aiptek->newSetting.mouseButtonRight = new_button; + return count; +} + +static DEVICE_ATTR(mouse_right, + S_IRUGO | S_IWUSR, + show_tabletMouseRight, store_tabletMouseRight); + +/*********************************************************************** + * support routines for the 'wheel' file. Note that this file + * both displays current setting and allows for setting changing. + */ +static ssize_t show_tabletWheel(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + if (aiptek->curSetting.wheel == AIPTEK_WHEEL_DISABLE) { + return snprintf(buf, PAGE_SIZE, "disable\n"); + } else { + return snprintf(buf, PAGE_SIZE, "%d\n", + aiptek->curSetting.wheel); + } +} + +static ssize_t +store_tabletWheel(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + int err, w; + + err = kstrtoint(buf, 10, &w); + if (err) + return err; + + aiptek->newSetting.wheel = w; + return count; +} + +static DEVICE_ATTR(wheel, + S_IRUGO | S_IWUSR, show_tabletWheel, store_tabletWheel); + +/*********************************************************************** + * support routines for the 'execute' file. Note that this file + * both displays current setting and allows for setting changing. + */ +static ssize_t show_tabletExecute(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* There is nothing useful to display, so a one-line manual + * is in order... + */ + return snprintf(buf, PAGE_SIZE, + "Write anything to this file to program your tablet.\n"); +} + +static ssize_t +store_tabletExecute(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + /* We do not care what you write to this file. Merely the action + * of writing to this file triggers a tablet reprogramming. + */ + memcpy(&aiptek->curSetting, &aiptek->newSetting, + sizeof(struct aiptek_settings)); + + if (aiptek_program_tablet(aiptek) < 0) + return -EIO; + + return count; +} + +static DEVICE_ATTR(execute, + S_IRUGO | S_IWUSR, show_tabletExecute, store_tabletExecute); + +/*********************************************************************** + * support routines for the 'odm_code' file. Note that this file + * only displays current setting. + */ +static ssize_t show_tabletODMCode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.odmCode); +} + +static DEVICE_ATTR(odm_code, S_IRUGO, show_tabletODMCode, NULL); + +/*********************************************************************** + * support routines for the 'model_code' file. Note that this file + * only displays current setting. + */ +static ssize_t show_tabletModelCode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "0x%04x\n", aiptek->features.modelCode); +} + +static DEVICE_ATTR(model_code, S_IRUGO, show_tabletModelCode, NULL); + +/*********************************************************************** + * support routines for the 'firmware_code' file. Note that this file + * only displays current setting. + */ +static ssize_t show_firmwareCode(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct aiptek *aiptek = dev_get_drvdata(dev); + + return snprintf(buf, PAGE_SIZE, "%04x\n", + aiptek->features.firmwareCode); +} + +static DEVICE_ATTR(firmware_code, S_IRUGO, show_firmwareCode, NULL); + +static struct attribute *aiptek_attributes[] = { + &dev_attr_size.attr, + &dev_attr_pointer_mode.attr, + &dev_attr_coordinate_mode.attr, + &dev_attr_tool_mode.attr, + &dev_attr_xtilt.attr, + &dev_attr_ytilt.attr, + &dev_attr_jitter.attr, + &dev_attr_delay.attr, + &dev_attr_event_count.attr, + &dev_attr_diagnostic.attr, + &dev_attr_odm_code.attr, + &dev_attr_model_code.attr, + &dev_attr_firmware_code.attr, + &dev_attr_stylus_lower.attr, + &dev_attr_stylus_upper.attr, + &dev_attr_mouse_left.attr, + &dev_attr_mouse_middle.attr, + &dev_attr_mouse_right.attr, + &dev_attr_wheel.attr, + &dev_attr_execute.attr, + NULL +}; + +static struct attribute_group aiptek_attribute_group = { + .attrs = aiptek_attributes, +}; + +/*********************************************************************** + * This routine is called when a tablet has been identified. It basically + * sets up the tablet and the driver's internal structures. + */ +static int +aiptek_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *usbdev = interface_to_usbdev(intf); + struct usb_endpoint_descriptor *endpoint; + struct aiptek *aiptek; + struct input_dev *inputdev; + int i; + int speeds[] = { 0, + AIPTEK_PROGRAMMABLE_DELAY_50, + AIPTEK_PROGRAMMABLE_DELAY_400, + AIPTEK_PROGRAMMABLE_DELAY_25, + AIPTEK_PROGRAMMABLE_DELAY_100, + AIPTEK_PROGRAMMABLE_DELAY_200, + AIPTEK_PROGRAMMABLE_DELAY_300 + }; + int err = -ENOMEM; + + /* programmableDelay is where the command-line specified + * delay is kept. We make it the first element of speeds[], + * so therefore, your override speed is tried first, then the + * remainder. Note that the default value of 400ms will be tried + * if you do not specify any command line parameter. + */ + speeds[0] = programmableDelay; + + aiptek = kzalloc(sizeof(struct aiptek), GFP_KERNEL); + inputdev = input_allocate_device(); + if (!aiptek || !inputdev) { + dev_warn(&intf->dev, + "cannot allocate memory or input device\n"); + goto fail1; + } + + aiptek->data = usb_alloc_coherent(usbdev, AIPTEK_PACKET_LENGTH, + GFP_ATOMIC, &aiptek->data_dma); + if (!aiptek->data) { + dev_warn(&intf->dev, "cannot allocate usb buffer\n"); + goto fail1; + } + + aiptek->urb = usb_alloc_urb(0, GFP_KERNEL); + if (!aiptek->urb) { + dev_warn(&intf->dev, "cannot allocate urb\n"); + goto fail2; + } + + aiptek->inputdev = inputdev; + aiptek->usbdev = usbdev; + aiptek->intf = intf; + aiptek->ifnum = intf->altsetting[0].desc.bInterfaceNumber; + aiptek->inDelay = 0; + aiptek->endDelay = 0; + aiptek->previousJitterable = 0; + aiptek->lastMacro = -1; + + /* Set up the curSettings struct. Said struct contains the current + * programmable parameters. The newSetting struct contains changes + * the user makes to the settings via the sysfs interface. Those + * changes are not "committed" to curSettings until the user + * writes to the sysfs/.../execute file. + */ + aiptek->curSetting.pointerMode = AIPTEK_POINTER_EITHER_MODE; + aiptek->curSetting.coordinateMode = AIPTEK_COORDINATE_ABSOLUTE_MODE; + aiptek->curSetting.toolMode = AIPTEK_TOOL_BUTTON_PEN_MODE; + aiptek->curSetting.xTilt = AIPTEK_TILT_DISABLE; + aiptek->curSetting.yTilt = AIPTEK_TILT_DISABLE; + aiptek->curSetting.mouseButtonLeft = AIPTEK_MOUSE_LEFT_BUTTON; + aiptek->curSetting.mouseButtonMiddle = AIPTEK_MOUSE_MIDDLE_BUTTON; + aiptek->curSetting.mouseButtonRight = AIPTEK_MOUSE_RIGHT_BUTTON; + aiptek->curSetting.stylusButtonUpper = AIPTEK_STYLUS_UPPER_BUTTON; + aiptek->curSetting.stylusButtonLower = AIPTEK_STYLUS_LOWER_BUTTON; + aiptek->curSetting.jitterDelay = jitterDelay; + aiptek->curSetting.programmableDelay = programmableDelay; + + /* Both structs should have equivalent settings + */ + aiptek->newSetting = aiptek->curSetting; + + /* Determine the usb devices' physical path. + * Asketh not why we always pretend we're using "../input0", + * but I suspect this will have to be refactored one + * day if a single USB device can be a keyboard & a mouse + * & a tablet, and the inputX number actually will tell + * us something... + */ + usb_make_path(usbdev, aiptek->features.usbPath, + sizeof(aiptek->features.usbPath)); + strlcat(aiptek->features.usbPath, "/input0", + sizeof(aiptek->features.usbPath)); + + /* Set up client data, pointers to open and close routines + * for the input device. + */ + inputdev->name = "Aiptek"; + inputdev->phys = aiptek->features.usbPath; + usb_to_input_id(usbdev, &inputdev->id); + inputdev->dev.parent = &intf->dev; + + input_set_drvdata(inputdev, aiptek); + + inputdev->open = aiptek_open; + inputdev->close = aiptek_close; + + /* Now program the capacities of the tablet, in terms of being + * an input device. + */ + for (i = 0; i < ARRAY_SIZE(eventTypes); ++i) + __set_bit(eventTypes[i], inputdev->evbit); + + for (i = 0; i < ARRAY_SIZE(absEvents); ++i) + __set_bit(absEvents[i], inputdev->absbit); + + for (i = 0; i < ARRAY_SIZE(relEvents); ++i) + __set_bit(relEvents[i], inputdev->relbit); + + __set_bit(MSC_SERIAL, inputdev->mscbit); + + /* Set up key and button codes */ + for (i = 0; i < ARRAY_SIZE(buttonEvents); ++i) + __set_bit(buttonEvents[i], inputdev->keybit); + + for (i = 0; i < ARRAY_SIZE(macroKeyEvents); ++i) + __set_bit(macroKeyEvents[i], inputdev->keybit); + + /* + * Program the input device coordinate capacities. We do not yet + * know what maximum X, Y, and Z values are, so we're putting fake + * values in. Later, we'll ask the tablet to put in the correct + * values. + */ + input_set_abs_params(inputdev, ABS_X, 0, 2999, 0, 0); + input_set_abs_params(inputdev, ABS_Y, 0, 2249, 0, 0); + input_set_abs_params(inputdev, ABS_PRESSURE, 0, 511, 0, 0); + input_set_abs_params(inputdev, ABS_TILT_X, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0); + input_set_abs_params(inputdev, ABS_TILT_Y, AIPTEK_TILT_MIN, AIPTEK_TILT_MAX, 0, 0); + input_set_abs_params(inputdev, ABS_WHEEL, AIPTEK_WHEEL_MIN, AIPTEK_WHEEL_MAX - 1, 0, 0); + + endpoint = &intf->altsetting[0].endpoint[0].desc; + + /* Go set up our URB, which is called when the tablet receives + * input. + */ + usb_fill_int_urb(aiptek->urb, + aiptek->usbdev, + usb_rcvintpipe(aiptek->usbdev, + endpoint->bEndpointAddress), + aiptek->data, 8, aiptek_irq, aiptek, + endpoint->bInterval); + + aiptek->urb->transfer_dma = aiptek->data_dma; + aiptek->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + /* Program the tablet. This sets the tablet up in the mode + * specified in newSetting, and also queries the tablet's + * physical capacities. + * + * Sanity check: if a tablet doesn't like the slow programmatic + * delay, we often get sizes of 0x0. Let's use that as an indicator + * to try faster delays, up to 25 ms. If that logic fails, well, you'll + * have to explain to us how your tablet thinks it's 0x0, and yet that's + * not an error :-) + */ + + for (i = 0; i < ARRAY_SIZE(speeds); ++i) { + aiptek->curSetting.programmableDelay = speeds[i]; + (void)aiptek_program_tablet(aiptek); + if (input_abs_get_max(aiptek->inputdev, ABS_X) > 0) { + dev_info(&intf->dev, + "Aiptek using %d ms programming speed\n", + aiptek->curSetting.programmableDelay); + break; + } + } + + /* Murphy says that some day someone will have a tablet that fails the + above test. That's you, Frederic Rodrigo */ + if (i == ARRAY_SIZE(speeds)) { + dev_info(&intf->dev, + "Aiptek tried all speeds, no sane response\n"); + goto fail3; + } + + /* Associate this driver's struct with the usb interface. + */ + usb_set_intfdata(intf, aiptek); + + /* Set up the sysfs files + */ + err = sysfs_create_group(&intf->dev.kobj, &aiptek_attribute_group); + if (err) { + dev_warn(&intf->dev, "cannot create sysfs group err: %d\n", + err); + goto fail3; + } + + /* Register the tablet as an Input Device + */ + err = input_register_device(aiptek->inputdev); + if (err) { + dev_warn(&intf->dev, + "input_register_device returned err: %d\n", err); + goto fail4; + } + return 0; + + fail4: sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group); + fail3: usb_free_urb(aiptek->urb); + fail2: usb_free_coherent(usbdev, AIPTEK_PACKET_LENGTH, aiptek->data, + aiptek->data_dma); + fail1: usb_set_intfdata(intf, NULL); + input_free_device(inputdev); + kfree(aiptek); + return err; +} + +/*********************************************************************** + * Deal with tablet disconnecting from the system. + */ +static void aiptek_disconnect(struct usb_interface *intf) +{ + struct aiptek *aiptek = usb_get_intfdata(intf); + + /* Disassociate driver's struct with usb interface + */ + usb_set_intfdata(intf, NULL); + if (aiptek != NULL) { + /* Free & unhook everything from the system. + */ + usb_kill_urb(aiptek->urb); + input_unregister_device(aiptek->inputdev); + sysfs_remove_group(&intf->dev.kobj, &aiptek_attribute_group); + usb_free_urb(aiptek->urb); + usb_free_coherent(interface_to_usbdev(intf), + AIPTEK_PACKET_LENGTH, + aiptek->data, aiptek->data_dma); + kfree(aiptek); + } +} + +static struct usb_driver aiptek_driver = { + .name = "aiptek", + .probe = aiptek_probe, + .disconnect = aiptek_disconnect, + .id_table = aiptek_ids, +}; + +module_usb_driver(aiptek_driver); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +module_param(programmableDelay, int, 0); +MODULE_PARM_DESC(programmableDelay, "delay used during tablet programming"); +module_param(jitterDelay, int, 0); +MODULE_PARM_DESC(jitterDelay, "stylus/mouse settlement delay"); diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c new file mode 100644 index 00000000..29e01ab6 --- /dev/null +++ b/drivers/input/tablet/gtco.c @@ -0,0 +1,1034 @@ +/* -*- linux-c -*- + +GTCO digitizer USB driver + +TO CHECK: Is pressure done right on report 5? + +Copyright (C) 2006 GTCO CalComp + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; version 2 +of the License. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of GTCO-CalComp not be used in advertising +or publicity pertaining to distribution of the software without specific, +written prior permission. GTCO-CalComp makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +GTCO-CALCOMP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL GTCO-CALCOMP BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTIONS, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +GTCO CalComp, Inc. +7125 Riverwood Drive +Columbia, MD 21046 + +Jeremy Roberson jroberson@gtcocalcomp.com +Scott Hill shill@gtcocalcomp.com +*/ + + + +/*#define DEBUG*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include + +/* Version with a Major number of 2 is for kernel inclusion only. */ +#define GTCO_VERSION "2.00.0006" + + +/* MACROS */ + +#define VENDOR_ID_GTCO 0x078C +#define PID_400 0x400 +#define PID_401 0x401 +#define PID_1000 0x1000 +#define PID_1001 0x1001 +#define PID_1002 0x1002 + +/* Max size of a single report */ +#define REPORT_MAX_SIZE 10 + + +/* Bitmask whether pen is in range */ +#define MASK_INRANGE 0x20 +#define MASK_BUTTON 0x01F + +#define PATHLENGTH 64 + +/* DATA STRUCTURES */ + +/* Device table */ +static const struct usb_device_id gtco_usbid_table[] = { + { USB_DEVICE(VENDOR_ID_GTCO, PID_400) }, + { USB_DEVICE(VENDOR_ID_GTCO, PID_401) }, + { USB_DEVICE(VENDOR_ID_GTCO, PID_1000) }, + { USB_DEVICE(VENDOR_ID_GTCO, PID_1001) }, + { USB_DEVICE(VENDOR_ID_GTCO, PID_1002) }, + { } +}; +MODULE_DEVICE_TABLE (usb, gtco_usbid_table); + + +/* Structure to hold all of our device specific stuff */ +struct gtco { + + struct input_dev *inputdevice; /* input device struct pointer */ + struct usb_device *usbdev; /* the usb device for this device */ + struct usb_interface *intf; /* the usb interface for this device */ + struct urb *urbinfo; /* urb for incoming reports */ + dma_addr_t buf_dma; /* dma addr of the data buffer*/ + unsigned char * buffer; /* databuffer for reports */ + + char usbpath[PATHLENGTH]; + int openCount; + + /* Information pulled from Report Descriptor */ + u32 usage; + u32 min_X; + u32 max_X; + u32 min_Y; + u32 max_Y; + s8 mintilt_X; + s8 maxtilt_X; + s8 mintilt_Y; + s8 maxtilt_Y; + u32 maxpressure; + u32 minpressure; +}; + + + +/* Code for parsing the HID REPORT DESCRIPTOR */ + +/* From HID1.11 spec */ +struct hid_descriptor +{ + struct usb_descriptor_header header; + __le16 bcdHID; + u8 bCountryCode; + u8 bNumDescriptors; + u8 bDescriptorType; + __le16 wDescriptorLength; +} __attribute__ ((packed)); + + +#define HID_DESCRIPTOR_SIZE 9 +#define HID_DEVICE_TYPE 33 +#define REPORT_DEVICE_TYPE 34 + + +#define PREF_TAG(x) ((x)>>4) +#define PREF_TYPE(x) ((x>>2)&0x03) +#define PREF_SIZE(x) ((x)&0x03) + +#define TYPE_MAIN 0 +#define TYPE_GLOBAL 1 +#define TYPE_LOCAL 2 +#define TYPE_RESERVED 3 + +#define TAG_MAIN_INPUT 0x8 +#define TAG_MAIN_OUTPUT 0x9 +#define TAG_MAIN_FEATURE 0xB +#define TAG_MAIN_COL_START 0xA +#define TAG_MAIN_COL_END 0xC + +#define TAG_GLOB_USAGE 0 +#define TAG_GLOB_LOG_MIN 1 +#define TAG_GLOB_LOG_MAX 2 +#define TAG_GLOB_PHYS_MIN 3 +#define TAG_GLOB_PHYS_MAX 4 +#define TAG_GLOB_UNIT_EXP 5 +#define TAG_GLOB_UNIT 6 +#define TAG_GLOB_REPORT_SZ 7 +#define TAG_GLOB_REPORT_ID 8 +#define TAG_GLOB_REPORT_CNT 9 +#define TAG_GLOB_PUSH 10 +#define TAG_GLOB_POP 11 + +#define TAG_GLOB_MAX 12 + +#define DIGITIZER_USAGE_TIP_PRESSURE 0x30 +#define DIGITIZER_USAGE_TILT_X 0x3D +#define DIGITIZER_USAGE_TILT_Y 0x3E + + +/* + * This is an abbreviated parser for the HID Report Descriptor. We + * know what devices we are talking to, so this is by no means meant + * to be generic. We can make some safe assumptions: + * + * - We know there are no LONG tags, all short + * - We know that we have no MAIN Feature and MAIN Output items + * - We know what the IRQ reports are supposed to look like. + * + * The main purpose of this is to use the HID report desc to figure + * out the mins and maxs of the fields in the IRQ reports. The IRQ + * reports for 400/401 change slightly if the max X is bigger than 64K. + * + */ +static void parse_hid_report_descriptor(struct gtco *device, char * report, + int length) +{ + struct device *ddev = &device->intf->dev; + int x, i = 0; + + /* Tag primitive vars */ + __u8 prefix; + __u8 size; + __u8 tag; + __u8 type; + __u8 data = 0; + __u16 data16 = 0; + __u32 data32 = 0; + + /* For parsing logic */ + int inputnum = 0; + __u32 usage = 0; + + /* Global Values, indexed by TAG */ + __u32 globalval[TAG_GLOB_MAX]; + __u32 oldval[TAG_GLOB_MAX]; + + /* Debug stuff */ + char maintype = 'x'; + char globtype[12]; + int indent = 0; + char indentstr[10] = ""; + + + dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n"); + + /* Walk this report and pull out the info we need */ + while (i < length) { + prefix = report[i]; + + /* Skip over prefix */ + i++; + + /* Determine data size and save the data in the proper variable */ + size = PREF_SIZE(prefix); + switch (size) { + case 1: + data = report[i]; + break; + case 2: + data16 = get_unaligned_le16(&report[i]); + break; + case 3: + size = 4; + data32 = get_unaligned_le32(&report[i]); + break; + } + + /* Skip size of data */ + i += size; + + /* What we do depends on the tag type */ + tag = PREF_TAG(prefix); + type = PREF_TYPE(prefix); + switch (type) { + case TYPE_MAIN: + strcpy(globtype, ""); + switch (tag) { + + case TAG_MAIN_INPUT: + /* + * The INPUT MAIN tag signifies this is + * information from a report. We need to + * figure out what it is and store the + * min/max values + */ + + maintype = 'I'; + if (data == 2) + strcpy(globtype, "Variable"); + else if (data == 3) + strcpy(globtype, "Var|Const"); + + dev_dbg(ddev, "::::: Saving Report: %d input #%d Max: 0x%X(%d) Min:0x%X(%d) of %d bits\n", + globalval[TAG_GLOB_REPORT_ID], inputnum, + globalval[TAG_GLOB_LOG_MAX], globalval[TAG_GLOB_LOG_MAX], + globalval[TAG_GLOB_LOG_MIN], globalval[TAG_GLOB_LOG_MIN], + globalval[TAG_GLOB_REPORT_SZ] * globalval[TAG_GLOB_REPORT_CNT]); + + + /* + We can assume that the first two input items + are always the X and Y coordinates. After + that, we look for everything else by + local usage value + */ + switch (inputnum) { + case 0: /* X coord */ + dev_dbg(ddev, "GER: X Usage: 0x%x\n", usage); + if (device->max_X == 0) { + device->max_X = globalval[TAG_GLOB_LOG_MAX]; + device->min_X = globalval[TAG_GLOB_LOG_MIN]; + } + break; + + case 1: /* Y coord */ + dev_dbg(ddev, "GER: Y Usage: 0x%x\n", usage); + if (device->max_Y == 0) { + device->max_Y = globalval[TAG_GLOB_LOG_MAX]; + device->min_Y = globalval[TAG_GLOB_LOG_MIN]; + } + break; + + default: + /* Tilt X */ + if (usage == DIGITIZER_USAGE_TILT_X) { + if (device->maxtilt_X == 0) { + device->maxtilt_X = globalval[TAG_GLOB_LOG_MAX]; + device->mintilt_X = globalval[TAG_GLOB_LOG_MIN]; + } + } + + /* Tilt Y */ + if (usage == DIGITIZER_USAGE_TILT_Y) { + if (device->maxtilt_Y == 0) { + device->maxtilt_Y = globalval[TAG_GLOB_LOG_MAX]; + device->mintilt_Y = globalval[TAG_GLOB_LOG_MIN]; + } + } + + /* Pressure */ + if (usage == DIGITIZER_USAGE_TIP_PRESSURE) { + if (device->maxpressure == 0) { + device->maxpressure = globalval[TAG_GLOB_LOG_MAX]; + device->minpressure = globalval[TAG_GLOB_LOG_MIN]; + } + } + + break; + } + + inputnum++; + break; + + case TAG_MAIN_OUTPUT: + maintype = 'O'; + break; + + case TAG_MAIN_FEATURE: + maintype = 'F'; + break; + + case TAG_MAIN_COL_START: + maintype = 'S'; + + if (data == 0) { + dev_dbg(ddev, "======>>>>>> Physical\n"); + strcpy(globtype, "Physical"); + } else + dev_dbg(ddev, "======>>>>>>\n"); + + /* Indent the debug output */ + indent++; + for (x = 0; x < indent; x++) + indentstr[x] = '-'; + indentstr[x] = 0; + + /* Save global tags */ + for (x = 0; x < TAG_GLOB_MAX; x++) + oldval[x] = globalval[x]; + + break; + + case TAG_MAIN_COL_END: + dev_dbg(ddev, "<<<<<<======\n"); + maintype = 'E'; + indent--; + for (x = 0; x < indent; x++) + indentstr[x] = '-'; + indentstr[x] = 0; + + /* Copy global tags back */ + for (x = 0; x < TAG_GLOB_MAX; x++) + globalval[x] = oldval[x]; + + break; + } + + switch (size) { + case 1: + dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n", + indentstr, tag, maintype, size, globtype, data); + break; + + case 2: + dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n", + indentstr, tag, maintype, size, globtype, data16); + break; + + case 4: + dev_dbg(ddev, "%sMAINTAG:(%d) %c SIZE: %d Data: %s 0x%x\n", + indentstr, tag, maintype, size, globtype, data32); + break; + } + break; + + case TYPE_GLOBAL: + switch (tag) { + case TAG_GLOB_USAGE: + /* + * First time we hit the global usage tag, + * it should tell us the type of device + */ + if (device->usage == 0) + device->usage = data; + + strcpy(globtype, "USAGE"); + break; + + case TAG_GLOB_LOG_MIN: + strcpy(globtype, "LOG_MIN"); + break; + + case TAG_GLOB_LOG_MAX: + strcpy(globtype, "LOG_MAX"); + break; + + case TAG_GLOB_PHYS_MIN: + strcpy(globtype, "PHYS_MIN"); + break; + + case TAG_GLOB_PHYS_MAX: + strcpy(globtype, "PHYS_MAX"); + break; + + case TAG_GLOB_UNIT_EXP: + strcpy(globtype, "EXP"); + break; + + case TAG_GLOB_UNIT: + strcpy(globtype, "UNIT"); + break; + + case TAG_GLOB_REPORT_SZ: + strcpy(globtype, "REPORT_SZ"); + break; + + case TAG_GLOB_REPORT_ID: + strcpy(globtype, "REPORT_ID"); + /* New report, restart numbering */ + inputnum = 0; + break; + + case TAG_GLOB_REPORT_CNT: + strcpy(globtype, "REPORT_CNT"); + break; + + case TAG_GLOB_PUSH: + strcpy(globtype, "PUSH"); + break; + + case TAG_GLOB_POP: + strcpy(globtype, "POP"); + break; + } + + /* Check to make sure we have a good tag number + so we don't overflow array */ + if (tag < TAG_GLOB_MAX) { + switch (size) { + case 1: + dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n", + indentstr, globtype, tag, size, data); + globalval[tag] = data; + break; + + case 2: + dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n", + indentstr, globtype, tag, size, data16); + globalval[tag] = data16; + break; + + case 4: + dev_dbg(ddev, "%sGLOBALTAG:%s(%d) SIZE: %d Data: 0x%x\n", + indentstr, globtype, tag, size, data32); + globalval[tag] = data32; + break; + } + } else { + dev_dbg(ddev, "%sGLOBALTAG: ILLEGAL TAG:%d SIZE: %d\n", + indentstr, tag, size); + } + break; + + case TYPE_LOCAL: + switch (tag) { + case TAG_GLOB_USAGE: + strcpy(globtype, "USAGE"); + /* Always 1 byte */ + usage = data; + break; + + case TAG_GLOB_LOG_MIN: + strcpy(globtype, "MIN"); + break; + + case TAG_GLOB_LOG_MAX: + strcpy(globtype, "MAX"); + break; + + default: + strcpy(globtype, "UNKNOWN"); + break; + } + + switch (size) { + case 1: + dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n", + indentstr, tag, globtype, size, data); + break; + + case 2: + dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n", + indentstr, tag, globtype, size, data16); + break; + + case 4: + dev_dbg(ddev, "%sLOCALTAG:(%d) %s SIZE: %d Data: 0x%x\n", + indentstr, tag, globtype, size, data32); + break; + } + + break; + } + } +} + +/* INPUT DRIVER Routines */ + +/* + * Called when opening the input device. This will submit the URB to + * the usb system so we start getting reports + */ +static int gtco_input_open(struct input_dev *inputdev) +{ + struct gtco *device = input_get_drvdata(inputdev); + + device->urbinfo->dev = device->usbdev; + if (usb_submit_urb(device->urbinfo, GFP_KERNEL)) + return -EIO; + + return 0; +} + +/* + * Called when closing the input device. This will unlink the URB + */ +static void gtco_input_close(struct input_dev *inputdev) +{ + struct gtco *device = input_get_drvdata(inputdev); + + usb_kill_urb(device->urbinfo); +} + + +/* + * Setup input device capabilities. Tell the input system what this + * device is capable of generating. + * + * This information is based on what is read from the HID report and + * placed in the struct gtco structure + * + */ +static void gtco_setup_caps(struct input_dev *inputdev) +{ + struct gtco *device = input_get_drvdata(inputdev); + + /* Which events */ + inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) | + BIT_MASK(EV_MSC); + + /* Misc event menu block */ + inputdev->mscbit[0] = BIT_MASK(MSC_SCAN) | BIT_MASK(MSC_SERIAL) | + BIT_MASK(MSC_RAW); + + /* Absolute values based on HID report info */ + input_set_abs_params(inputdev, ABS_X, device->min_X, device->max_X, + 0, 0); + input_set_abs_params(inputdev, ABS_Y, device->min_Y, device->max_Y, + 0, 0); + + /* Proximity */ + input_set_abs_params(inputdev, ABS_DISTANCE, 0, 1, 0, 0); + + /* Tilt & pressure */ + input_set_abs_params(inputdev, ABS_TILT_X, device->mintilt_X, + device->maxtilt_X, 0, 0); + input_set_abs_params(inputdev, ABS_TILT_Y, device->mintilt_Y, + device->maxtilt_Y, 0, 0); + input_set_abs_params(inputdev, ABS_PRESSURE, device->minpressure, + device->maxpressure, 0, 0); + + /* Transducer */ + input_set_abs_params(inputdev, ABS_MISC, 0, 0xFF, 0, 0); +} + +/* USB Routines */ + +/* + * URB callback routine. Called when we get IRQ reports from the + * digitizer. + * + * This bridges the USB and input device worlds. It generates events + * on the input device based on the USB reports. + */ +static void gtco_urb_callback(struct urb *urbinfo) +{ + struct gtco *device = urbinfo->context; + struct input_dev *inputdev; + int rc; + u32 val = 0; + s8 valsigned = 0; + char le_buffer[2]; + + inputdev = device->inputdevice; + + /* Was callback OK? */ + if (urbinfo->status == -ECONNRESET || + urbinfo->status == -ENOENT || + urbinfo->status == -ESHUTDOWN) { + + /* Shutdown is occurring. Return and don't queue up any more */ + return; + } + + if (urbinfo->status != 0) { + /* + * Some unknown error. Hopefully temporary. Just go and + * requeue an URB + */ + goto resubmit; + } + + /* + * Good URB, now process + */ + + /* PID dependent when we interpret the report */ + if (inputdev->id.product == PID_1000 || + inputdev->id.product == PID_1001 || + inputdev->id.product == PID_1002) { + + /* + * Switch on the report ID + * Conveniently, the reports have more information, the higher + * the report number. We can just fall through the case + * statements if we start with the highest number report + */ + switch (device->buffer[0]) { + case 5: + /* Pressure is 9 bits */ + val = ((u16)(device->buffer[8]) << 1); + val |= (u16)(device->buffer[7] >> 7); + input_report_abs(inputdev, ABS_PRESSURE, + device->buffer[8]); + + /* Mask out the Y tilt value used for pressure */ + device->buffer[7] = (u8)((device->buffer[7]) & 0x7F); + + /* Fall thru */ + case 4: + /* Tilt */ + + /* Sign extend these 7 bit numbers. */ + if (device->buffer[6] & 0x40) + device->buffer[6] |= 0x80; + + if (device->buffer[7] & 0x40) + device->buffer[7] |= 0x80; + + + valsigned = (device->buffer[6]); + input_report_abs(inputdev, ABS_TILT_X, (s32)valsigned); + + valsigned = (device->buffer[7]); + input_report_abs(inputdev, ABS_TILT_Y, (s32)valsigned); + + /* Fall thru */ + case 2: + case 3: + /* Convert buttons, only 5 bits possible */ + val = (device->buffer[5]) & MASK_BUTTON; + + /* We don't apply any meaning to the bitmask, + just report */ + input_event(inputdev, EV_MSC, MSC_SERIAL, val); + + /* Fall thru */ + case 1: + /* All reports have X and Y coords in the same place */ + val = get_unaligned_le16(&device->buffer[1]); + input_report_abs(inputdev, ABS_X, val); + + val = get_unaligned_le16(&device->buffer[3]); + input_report_abs(inputdev, ABS_Y, val); + + /* Ditto for proximity bit */ + val = device->buffer[5] & MASK_INRANGE ? 1 : 0; + input_report_abs(inputdev, ABS_DISTANCE, val); + + /* Report 1 is an exception to how we handle buttons */ + /* Buttons are an index, not a bitmask */ + if (device->buffer[0] == 1) { + + /* + * Convert buttons, 5 bit index + * Report value of index set as one, + * the rest as 0 + */ + val = device->buffer[5] & MASK_BUTTON; + dev_dbg(&device->intf->dev, + "======>>>>>>REPORT 1: val 0x%X(%d)\n", + val, val); + + /* + * We don't apply any meaning to the button + * index, just report it + */ + input_event(inputdev, EV_MSC, MSC_SERIAL, val); + } + break; + + case 7: + /* Menu blocks */ + input_event(inputdev, EV_MSC, MSC_SCAN, + device->buffer[1]); + break; + } + } + + /* Other pid class */ + if (inputdev->id.product == PID_400 || + inputdev->id.product == PID_401) { + + /* Report 2 */ + if (device->buffer[0] == 2) { + /* Menu blocks */ + input_event(inputdev, EV_MSC, MSC_SCAN, device->buffer[1]); + } + + /* Report 1 */ + if (device->buffer[0] == 1) { + char buttonbyte; + + /* IF X max > 64K, we still a bit from the y report */ + if (device->max_X > 0x10000) { + + val = (u16)(((u16)(device->buffer[2] << 8)) | (u8)device->buffer[1]); + val |= (u32)(((u8)device->buffer[3] & 0x1) << 16); + + input_report_abs(inputdev, ABS_X, val); + + le_buffer[0] = (u8)((u8)(device->buffer[3]) >> 1); + le_buffer[0] |= (u8)((device->buffer[3] & 0x1) << 7); + + le_buffer[1] = (u8)(device->buffer[4] >> 1); + le_buffer[1] |= (u8)((device->buffer[5] & 0x1) << 7); + + val = get_unaligned_le16(le_buffer); + input_report_abs(inputdev, ABS_Y, val); + + /* + * Shift the button byte right by one to + * make it look like the standard report + */ + buttonbyte = device->buffer[5] >> 1; + } else { + + val = get_unaligned_le16(&device->buffer[1]); + input_report_abs(inputdev, ABS_X, val); + + val = get_unaligned_le16(&device->buffer[3]); + input_report_abs(inputdev, ABS_Y, val); + + buttonbyte = device->buffer[5]; + } + + /* BUTTONS and PROXIMITY */ + val = buttonbyte & MASK_INRANGE ? 1 : 0; + input_report_abs(inputdev, ABS_DISTANCE, val); + + /* Convert buttons, only 4 bits possible */ + val = buttonbyte & 0x0F; +#ifdef USE_BUTTONS + for (i = 0; i < 5; i++) + input_report_key(inputdev, BTN_DIGI + i, val & (1 << i)); +#else + /* We don't apply any meaning to the bitmask, just report */ + input_event(inputdev, EV_MSC, MSC_SERIAL, val); +#endif + + /* TRANSDUCER */ + input_report_abs(inputdev, ABS_MISC, device->buffer[6]); + } + } + + /* Everybody gets report ID's */ + input_event(inputdev, EV_MSC, MSC_RAW, device->buffer[0]); + + /* Sync it up */ + input_sync(inputdev); + + resubmit: + rc = usb_submit_urb(urbinfo, GFP_ATOMIC); + if (rc != 0) + dev_err(&device->intf->dev, + "usb_submit_urb failed rc=0x%x\n", rc); +} + +/* + * The probe routine. This is called when the kernel find the matching USB + * vendor/product. We do the following: + * + * - Allocate mem for a local structure to manage the device + * - Request a HID Report Descriptor from the device and parse it to + * find out the device parameters + * - Create an input device and assign it attributes + * - Allocate an URB so the device can talk to us when the input + * queue is open + */ +static int gtco_probe(struct usb_interface *usbinterface, + const struct usb_device_id *id) +{ + + struct gtco *gtco; + struct input_dev *input_dev; + struct hid_descriptor *hid_desc; + char *report; + int result = 0, retry; + int error; + struct usb_endpoint_descriptor *endpoint; + + /* Allocate memory for device structure */ + gtco = kzalloc(sizeof(struct gtco), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!gtco || !input_dev) { + dev_err(&usbinterface->dev, "No more memory\n"); + error = -ENOMEM; + goto err_free_devs; + } + + /* Set pointer to the input device */ + gtco->inputdevice = input_dev; + + /* Save interface information */ + gtco->usbdev = usb_get_dev(interface_to_usbdev(usbinterface)); + gtco->intf = usbinterface; + + /* Allocate some data for incoming reports */ + gtco->buffer = usb_alloc_coherent(gtco->usbdev, REPORT_MAX_SIZE, + GFP_KERNEL, >co->buf_dma); + if (!gtco->buffer) { + dev_err(&usbinterface->dev, "No more memory for us buffers\n"); + error = -ENOMEM; + goto err_free_devs; + } + + /* Allocate URB for reports */ + gtco->urbinfo = usb_alloc_urb(0, GFP_KERNEL); + if (!gtco->urbinfo) { + dev_err(&usbinterface->dev, "Failed to allocate URB\n"); + error = -ENOMEM; + goto err_free_buf; + } + + /* + * The endpoint is always altsetting 0, we know this since we know + * this device only has one interrupt endpoint + */ + endpoint = &usbinterface->altsetting[0].endpoint[0].desc; + + /* Some debug */ + dev_dbg(&usbinterface->dev, "gtco # interfaces: %d\n", usbinterface->num_altsetting); + dev_dbg(&usbinterface->dev, "num endpoints: %d\n", usbinterface->cur_altsetting->desc.bNumEndpoints); + dev_dbg(&usbinterface->dev, "interface class: %d\n", usbinterface->cur_altsetting->desc.bInterfaceClass); + dev_dbg(&usbinterface->dev, "endpoint: attribute:0x%x type:0x%x\n", endpoint->bmAttributes, endpoint->bDescriptorType); + if (usb_endpoint_xfer_int(endpoint)) + dev_dbg(&usbinterface->dev, "endpoint: we have interrupt endpoint\n"); + + dev_dbg(&usbinterface->dev, "endpoint extra len:%d\n", usbinterface->altsetting[0].extralen); + + /* + * Find the HID descriptor so we can find out the size of the + * HID report descriptor + */ + if (usb_get_extra_descriptor(usbinterface->cur_altsetting, + HID_DEVICE_TYPE, &hid_desc) != 0){ + dev_err(&usbinterface->dev, + "Can't retrieve exta USB descriptor to get hid report descriptor length\n"); + error = -EIO; + goto err_free_urb; + } + + dev_dbg(&usbinterface->dev, + "Extra descriptor success: type:%d len:%d\n", + hid_desc->bDescriptorType, hid_desc->wDescriptorLength); + + report = kzalloc(le16_to_cpu(hid_desc->wDescriptorLength), GFP_KERNEL); + if (!report) { + dev_err(&usbinterface->dev, "No more memory for report\n"); + error = -ENOMEM; + goto err_free_urb; + } + + /* Couple of tries to get reply */ + for (retry = 0; retry < 3; retry++) { + result = usb_control_msg(gtco->usbdev, + usb_rcvctrlpipe(gtco->usbdev, 0), + USB_REQ_GET_DESCRIPTOR, + USB_RECIP_INTERFACE | USB_DIR_IN, + REPORT_DEVICE_TYPE << 8, + 0, /* interface */ + report, + le16_to_cpu(hid_desc->wDescriptorLength), + 5000); /* 5 secs */ + + dev_dbg(&usbinterface->dev, "usb_control_msg result: %d\n", result); + if (result == le16_to_cpu(hid_desc->wDescriptorLength)) { + parse_hid_report_descriptor(gtco, report, result); + break; + } + } + + kfree(report); + + /* If we didn't get the report, fail */ + if (result != le16_to_cpu(hid_desc->wDescriptorLength)) { + dev_err(&usbinterface->dev, + "Failed to get HID Report Descriptor of size: %d\n", + hid_desc->wDescriptorLength); + error = -EIO; + goto err_free_urb; + } + + /* Create a device file node */ + usb_make_path(gtco->usbdev, gtco->usbpath, sizeof(gtco->usbpath)); + strlcat(gtco->usbpath, "/input0", sizeof(gtco->usbpath)); + + /* Set Input device functions */ + input_dev->open = gtco_input_open; + input_dev->close = gtco_input_close; + + /* Set input device information */ + input_dev->name = "GTCO_CalComp"; + input_dev->phys = gtco->usbpath; + + input_set_drvdata(input_dev, gtco); + + /* Now set up all the input device capabilities */ + gtco_setup_caps(input_dev); + + /* Set input device required ID information */ + usb_to_input_id(gtco->usbdev, &input_dev->id); + input_dev->dev.parent = &usbinterface->dev; + + /* Setup the URB, it will be posted later on open of input device */ + endpoint = &usbinterface->altsetting[0].endpoint[0].desc; + + usb_fill_int_urb(gtco->urbinfo, + gtco->usbdev, + usb_rcvintpipe(gtco->usbdev, + endpoint->bEndpointAddress), + gtco->buffer, + REPORT_MAX_SIZE, + gtco_urb_callback, + gtco, + endpoint->bInterval); + + gtco->urbinfo->transfer_dma = gtco->buf_dma; + gtco->urbinfo->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + /* Save gtco pointer in USB interface gtco */ + usb_set_intfdata(usbinterface, gtco); + + /* All done, now register the input device */ + error = input_register_device(input_dev); + if (error) + goto err_free_urb; + + return 0; + + err_free_urb: + usb_free_urb(gtco->urbinfo); + err_free_buf: + usb_free_coherent(gtco->usbdev, REPORT_MAX_SIZE, + gtco->buffer, gtco->buf_dma); + err_free_devs: + input_free_device(input_dev); + kfree(gtco); + return error; +} + +/* + * This function is a standard USB function called when the USB device + * is disconnected. We will get rid of the URV, de-register the input + * device, and free up allocated memory + */ +static void gtco_disconnect(struct usb_interface *interface) +{ + /* Grab private device ptr */ + struct gtco *gtco = usb_get_intfdata(interface); + + /* Now reverse all the registration stuff */ + if (gtco) { + input_unregister_device(gtco->inputdevice); + usb_kill_urb(gtco->urbinfo); + usb_free_urb(gtco->urbinfo); + usb_free_coherent(gtco->usbdev, REPORT_MAX_SIZE, + gtco->buffer, gtco->buf_dma); + kfree(gtco); + } + + dev_info(&interface->dev, "gtco driver disconnected\n"); +} + +/* STANDARD MODULE LOAD ROUTINES */ + +static struct usb_driver gtco_driverinfo_table = { + .name = "gtco", + .id_table = gtco_usbid_table, + .probe = gtco_probe, + .disconnect = gtco_disconnect, +}; + +module_usb_driver(gtco_driverinfo_table); + +MODULE_DESCRIPTION("GTCO digitizer USB driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/tablet/hanwang.c b/drivers/input/tablet/hanwang.c new file mode 100644 index 00000000..5cc04124 --- /dev/null +++ b/drivers/input/tablet/hanwang.c @@ -0,0 +1,462 @@ +/* + * USB Hanwang tablet support + * + * Copyright (c) 2010 Xing Wei + * + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include + +#define DRIVER_AUTHOR "Xing Wei " +#define DRIVER_DESC "USB Hanwang tablet driver" +#define DRIVER_LICENSE "GPL" + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE(DRIVER_LICENSE); + +#define USB_VENDOR_ID_HANWANG 0x0b57 +#define HANWANG_TABLET_INT_CLASS 0x0003 +#define HANWANG_TABLET_INT_SUB_CLASS 0x0001 +#define HANWANG_TABLET_INT_PROTOCOL 0x0002 + +#define ART_MASTER_PKGLEN_MAX 10 + +/* device IDs */ +#define STYLUS_DEVICE_ID 0x02 +#define TOUCH_DEVICE_ID 0x03 +#define CURSOR_DEVICE_ID 0x06 +#define ERASER_DEVICE_ID 0x0A +#define PAD_DEVICE_ID 0x0F + +/* match vendor and interface info */ +#define HANWANG_TABLET_DEVICE(vend, cl, sc, pr) \ + .match_flags = USB_DEVICE_ID_MATCH_VENDOR \ + | USB_DEVICE_ID_MATCH_INT_INFO, \ + .idVendor = (vend), \ + .bInterfaceClass = (cl), \ + .bInterfaceSubClass = (sc), \ + .bInterfaceProtocol = (pr) + +enum hanwang_tablet_type { + HANWANG_ART_MASTER_III, + HANWANG_ART_MASTER_HD, + HANWANG_ART_MASTER_II, +}; + +struct hanwang { + unsigned char *data; + dma_addr_t data_dma; + struct input_dev *dev; + struct usb_device *usbdev; + struct urb *irq; + const struct hanwang_features *features; + unsigned int current_tool; + unsigned int current_id; + char name[64]; + char phys[32]; +}; + +struct hanwang_features { + unsigned short pid; + char *name; + enum hanwang_tablet_type type; + int pkg_len; + int max_x; + int max_y; + int max_tilt_x; + int max_tilt_y; + int max_pressure; +}; + +static const struct hanwang_features features_array[] = { + { 0x8528, "Hanwang Art Master III 0906", HANWANG_ART_MASTER_III, + ART_MASTER_PKGLEN_MAX, 0x5757, 0x3692, 0x3f, 0x7f, 2048 }, + { 0x8529, "Hanwang Art Master III 0604", HANWANG_ART_MASTER_III, + ART_MASTER_PKGLEN_MAX, 0x3d84, 0x2672, 0x3f, 0x7f, 2048 }, + { 0x852a, "Hanwang Art Master III 1308", HANWANG_ART_MASTER_III, + ART_MASTER_PKGLEN_MAX, 0x7f00, 0x4f60, 0x3f, 0x7f, 2048 }, + { 0x8401, "Hanwang Art Master HD 5012", HANWANG_ART_MASTER_HD, + ART_MASTER_PKGLEN_MAX, 0x678e, 0x4150, 0x3f, 0x7f, 1024 }, + { 0x8503, "Hanwang Art Master II", HANWANG_ART_MASTER_II, + ART_MASTER_PKGLEN_MAX, 0x27de, 0x1cfe, 0x3f, 0x7f, 1024 }, +}; + +static const int hw_eventtypes[] = { + EV_KEY, EV_ABS, EV_MSC, +}; + +static const int hw_absevents[] = { + ABS_X, ABS_Y, ABS_TILT_X, ABS_TILT_Y, ABS_WHEEL, + ABS_RX, ABS_RY, ABS_PRESSURE, ABS_MISC, +}; + +static const int hw_btnevents[] = { + BTN_STYLUS, BTN_STYLUS2, BTN_TOOL_PEN, BTN_TOOL_RUBBER, + BTN_TOOL_MOUSE, BTN_TOOL_FINGER, + BTN_0, BTN_1, BTN_2, BTN_3, BTN_4, BTN_5, BTN_6, BTN_7, BTN_8, +}; + +static const int hw_mscevents[] = { + MSC_SERIAL, +}; + +static void hanwang_parse_packet(struct hanwang *hanwang) +{ + unsigned char *data = hanwang->data; + struct input_dev *input_dev = hanwang->dev; + struct usb_device *dev = hanwang->usbdev; + enum hanwang_tablet_type type = hanwang->features->type; + int i; + u16 p; + + if (type == HANWANG_ART_MASTER_II) { + hanwang->current_tool = BTN_TOOL_PEN; + hanwang->current_id = STYLUS_DEVICE_ID; + } + + switch (data[0]) { + case 0x02: /* data packet */ + switch (data[1]) { + case 0x80: /* tool prox out */ + if (type != HANWANG_ART_MASTER_II) { + hanwang->current_id = 0; + input_report_key(input_dev, + hanwang->current_tool, 0); + } + break; + + case 0x00: /* artmaster ii pen leave */ + if (type == HANWANG_ART_MASTER_II) { + hanwang->current_id = 0; + input_report_key(input_dev, + hanwang->current_tool, 0); + } + break; + + case 0xc2: /* first time tool prox in */ + switch (data[3] & 0xf0) { + case 0x20: /* art_master III */ + case 0x30: /* art_master_HD */ + hanwang->current_id = STYLUS_DEVICE_ID; + hanwang->current_tool = BTN_TOOL_PEN; + input_report_key(input_dev, BTN_TOOL_PEN, 1); + break; + case 0xa0: /* art_master III */ + case 0xb0: /* art_master_HD */ + hanwang->current_id = ERASER_DEVICE_ID; + hanwang->current_tool = BTN_TOOL_RUBBER; + input_report_key(input_dev, BTN_TOOL_RUBBER, 1); + break; + default: + hanwang->current_id = 0; + dev_dbg(&dev->dev, + "unknown tablet tool %02x\n", data[0]); + break; + } + break; + + default: /* tool data packet */ + switch (type) { + case HANWANG_ART_MASTER_III: + p = (data[6] << 3) | + ((data[7] & 0xc0) >> 5) | + (data[1] & 0x01); + break; + + case HANWANG_ART_MASTER_HD: + case HANWANG_ART_MASTER_II: + p = (data[7] >> 6) | (data[6] << 2); + break; + + default: + p = 0; + break; + } + + input_report_abs(input_dev, ABS_X, + be16_to_cpup((__be16 *)&data[2])); + input_report_abs(input_dev, ABS_Y, + be16_to_cpup((__be16 *)&data[4])); + input_report_abs(input_dev, ABS_PRESSURE, p); + input_report_abs(input_dev, ABS_TILT_X, data[7] & 0x3f); + input_report_abs(input_dev, ABS_TILT_Y, data[8] & 0x7f); + input_report_key(input_dev, BTN_STYLUS, data[1] & 0x02); + + if (type != HANWANG_ART_MASTER_II) + input_report_key(input_dev, BTN_STYLUS2, + data[1] & 0x04); + else + input_report_key(input_dev, BTN_TOOL_PEN, 1); + + break; + } + + input_report_abs(input_dev, ABS_MISC, hanwang->current_id); + input_event(input_dev, EV_MSC, MSC_SERIAL, + hanwang->features->pid); + break; + + case 0x0c: + /* roll wheel */ + hanwang->current_id = PAD_DEVICE_ID; + + switch (type) { + case HANWANG_ART_MASTER_III: + input_report_key(input_dev, BTN_TOOL_FINGER, + data[1] || data[2] || data[3]); + input_report_abs(input_dev, ABS_WHEEL, data[1]); + input_report_key(input_dev, BTN_0, data[2]); + for (i = 0; i < 8; i++) + input_report_key(input_dev, + BTN_1 + i, data[3] & (1 << i)); + break; + + case HANWANG_ART_MASTER_HD: + input_report_key(input_dev, BTN_TOOL_FINGER, data[1] || + data[2] || data[3] || data[4] || + data[5] || data[6]); + input_report_abs(input_dev, ABS_RX, + ((data[1] & 0x1f) << 8) | data[2]); + input_report_abs(input_dev, ABS_RY, + ((data[3] & 0x1f) << 8) | data[4]); + input_report_key(input_dev, BTN_0, data[5] & 0x01); + for (i = 0; i < 4; i++) { + input_report_key(input_dev, + BTN_1 + i, data[5] & (1 << i)); + input_report_key(input_dev, + BTN_5 + i, data[6] & (1 << i)); + } + break; + + case HANWANG_ART_MASTER_II: + dev_dbg(&dev->dev, "error packet %02x\n", data[0]); + return; + } + + input_report_abs(input_dev, ABS_MISC, hanwang->current_id); + input_event(input_dev, EV_MSC, MSC_SERIAL, 0xffffffff); + break; + + default: + dev_dbg(&dev->dev, "error packet %02x\n", data[0]); + break; + } + + input_sync(input_dev); +} + +static void hanwang_irq(struct urb *urb) +{ + struct hanwang *hanwang = urb->context; + struct usb_device *dev = hanwang->usbdev; + int retval; + + switch (urb->status) { + case 0: + /* success */; + hanwang_parse_packet(hanwang); + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_err(&dev->dev, "%s - urb shutting down with status: %d", + __func__, urb->status); + return; + default: + dev_err(&dev->dev, "%s - nonzero urb status received: %d", + __func__, urb->status); + break; + } + + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(&dev->dev, "%s - usb_submit_urb failed with result %d", + __func__, retval); +} + +static int hanwang_open(struct input_dev *dev) +{ + struct hanwang *hanwang = input_get_drvdata(dev); + + hanwang->irq->dev = hanwang->usbdev; + if (usb_submit_urb(hanwang->irq, GFP_KERNEL)) + return -EIO; + + return 0; +} + +static void hanwang_close(struct input_dev *dev) +{ + struct hanwang *hanwang = input_get_drvdata(dev); + + usb_kill_urb(hanwang->irq); +} + +static bool get_features(struct usb_device *dev, struct hanwang *hanwang) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(features_array); i++) { + if (le16_to_cpu(dev->descriptor.idProduct) == + features_array[i].pid) { + hanwang->features = &features_array[i]; + return true; + } + } + + return false; +} + + +static int hanwang_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *dev = interface_to_usbdev(intf); + struct usb_endpoint_descriptor *endpoint; + struct hanwang *hanwang; + struct input_dev *input_dev; + int error; + int i; + + hanwang = kzalloc(sizeof(struct hanwang), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!hanwang || !input_dev) { + error = -ENOMEM; + goto fail1; + } + + if (!get_features(dev, hanwang)) { + error = -ENXIO; + goto fail1; + } + + hanwang->data = usb_alloc_coherent(dev, hanwang->features->pkg_len, + GFP_KERNEL, &hanwang->data_dma); + if (!hanwang->data) { + error = -ENOMEM; + goto fail1; + } + + hanwang->irq = usb_alloc_urb(0, GFP_KERNEL); + if (!hanwang->irq) { + error = -ENOMEM; + goto fail2; + } + + hanwang->usbdev = dev; + hanwang->dev = input_dev; + + usb_make_path(dev, hanwang->phys, sizeof(hanwang->phys)); + strlcat(hanwang->phys, "/input0", sizeof(hanwang->phys)); + + strlcpy(hanwang->name, hanwang->features->name, sizeof(hanwang->name)); + input_dev->name = hanwang->name; + input_dev->phys = hanwang->phys; + usb_to_input_id(dev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, hanwang); + + input_dev->open = hanwang_open; + input_dev->close = hanwang_close; + + for (i = 0; i < ARRAY_SIZE(hw_eventtypes); ++i) + __set_bit(hw_eventtypes[i], input_dev->evbit); + + for (i = 0; i < ARRAY_SIZE(hw_absevents); ++i) + __set_bit(hw_absevents[i], input_dev->absbit); + + for (i = 0; i < ARRAY_SIZE(hw_btnevents); ++i) + __set_bit(hw_btnevents[i], input_dev->keybit); + + for (i = 0; i < ARRAY_SIZE(hw_mscevents); ++i) + __set_bit(hw_mscevents[i], input_dev->mscbit); + + input_set_abs_params(input_dev, ABS_X, + 0, hanwang->features->max_x, 4, 0); + input_set_abs_params(input_dev, ABS_Y, + 0, hanwang->features->max_y, 4, 0); + input_set_abs_params(input_dev, ABS_TILT_X, + 0, hanwang->features->max_tilt_x, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_Y, + 0, hanwang->features->max_tilt_y, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + 0, hanwang->features->max_pressure, 0, 0); + + endpoint = &intf->cur_altsetting->endpoint[0].desc; + usb_fill_int_urb(hanwang->irq, dev, + usb_rcvintpipe(dev, endpoint->bEndpointAddress), + hanwang->data, hanwang->features->pkg_len, + hanwang_irq, hanwang, endpoint->bInterval); + hanwang->irq->transfer_dma = hanwang->data_dma; + hanwang->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + error = input_register_device(hanwang->dev); + if (error) + goto fail3; + + usb_set_intfdata(intf, hanwang); + + return 0; + + fail3: usb_free_urb(hanwang->irq); + fail2: usb_free_coherent(dev, hanwang->features->pkg_len, + hanwang->data, hanwang->data_dma); + fail1: input_free_device(input_dev); + kfree(hanwang); + return error; + +} + +static void hanwang_disconnect(struct usb_interface *intf) +{ + struct hanwang *hanwang = usb_get_intfdata(intf); + + input_unregister_device(hanwang->dev); + usb_free_urb(hanwang->irq); + usb_free_coherent(interface_to_usbdev(intf), + hanwang->features->pkg_len, hanwang->data, + hanwang->data_dma); + kfree(hanwang); + usb_set_intfdata(intf, NULL); +} + +static const struct usb_device_id hanwang_ids[] = { + { HANWANG_TABLET_DEVICE(USB_VENDOR_ID_HANWANG, HANWANG_TABLET_INT_CLASS, + HANWANG_TABLET_INT_SUB_CLASS, HANWANG_TABLET_INT_PROTOCOL) }, + {} +}; + +MODULE_DEVICE_TABLE(usb, hanwang_ids); + +static struct usb_driver hanwang_driver = { + .name = "hanwang", + .probe = hanwang_probe, + .disconnect = hanwang_disconnect, + .id_table = hanwang_ids, +}; + +module_usb_driver(hanwang_driver); diff --git a/drivers/input/tablet/kbtab.c b/drivers/input/tablet/kbtab.c new file mode 100644 index 00000000..3fba74b9 --- /dev/null +++ b/drivers/input/tablet/kbtab.c @@ -0,0 +1,208 @@ +#include +#include +#include +#include +#include +#include + +/* + * Version Information + * v0.0.1 - Original, extremely basic version, 2.4.xx only + * v0.0.2 - Updated, works with 2.5.62 and 2.4.20; + * - added pressure-threshold modules param code from + * Alex Perry + */ + +#define DRIVER_VERSION "v0.0.2" +#define DRIVER_AUTHOR "Josh Myer " +#define DRIVER_DESC "USB KB Gear JamStudio Tablet driver" +#define DRIVER_LICENSE "GPL" + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE(DRIVER_LICENSE); + +#define USB_VENDOR_ID_KBGEAR 0x084e + +static int kb_pressure_click = 0x10; +module_param(kb_pressure_click, int, 0); +MODULE_PARM_DESC(kb_pressure_click, "pressure threshold for clicks"); + +struct kbtab { + unsigned char *data; + dma_addr_t data_dma; + struct input_dev *dev; + struct usb_device *usbdev; + struct usb_interface *intf; + struct urb *irq; + char phys[32]; +}; + +static void kbtab_irq(struct urb *urb) +{ + struct kbtab *kbtab = urb->context; + unsigned char *data = kbtab->data; + struct input_dev *dev = kbtab->dev; + int pressure; + int retval; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(&kbtab->intf->dev, + "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + default: + dev_dbg(&kbtab->intf->dev, + "%s - nonzero urb status received: %d\n", + __func__, urb->status); + goto exit; + } + + + input_report_key(dev, BTN_TOOL_PEN, 1); + + input_report_abs(dev, ABS_X, get_unaligned_le16(&data[1])); + input_report_abs(dev, ABS_Y, get_unaligned_le16(&data[3])); + + /*input_report_key(dev, BTN_TOUCH , data[0] & 0x01);*/ + input_report_key(dev, BTN_RIGHT, data[0] & 0x02); + + pressure = data[5]; + if (kb_pressure_click == -1) + input_report_abs(dev, ABS_PRESSURE, pressure); + else + input_report_key(dev, BTN_LEFT, pressure > kb_pressure_click ? 1 : 0); + + input_sync(dev); + + exit: + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(&kbtab->intf->dev, + "%s - usb_submit_urb failed with result %d\n", + __func__, retval); +} + +static struct usb_device_id kbtab_ids[] = { + { USB_DEVICE(USB_VENDOR_ID_KBGEAR, 0x1001), .driver_info = 0 }, + { } +}; + +MODULE_DEVICE_TABLE(usb, kbtab_ids); + +static int kbtab_open(struct input_dev *dev) +{ + struct kbtab *kbtab = input_get_drvdata(dev); + + kbtab->irq->dev = kbtab->usbdev; + if (usb_submit_urb(kbtab->irq, GFP_KERNEL)) + return -EIO; + + return 0; +} + +static void kbtab_close(struct input_dev *dev) +{ + struct kbtab *kbtab = input_get_drvdata(dev); + + usb_kill_urb(kbtab->irq); +} + +static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *dev = interface_to_usbdev(intf); + struct usb_endpoint_descriptor *endpoint; + struct kbtab *kbtab; + struct input_dev *input_dev; + int error = -ENOMEM; + + kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!kbtab || !input_dev) + goto fail1; + + kbtab->data = usb_alloc_coherent(dev, 8, GFP_KERNEL, &kbtab->data_dma); + if (!kbtab->data) + goto fail1; + + kbtab->irq = usb_alloc_urb(0, GFP_KERNEL); + if (!kbtab->irq) + goto fail2; + + kbtab->usbdev = dev; + kbtab->intf = intf; + kbtab->dev = input_dev; + + usb_make_path(dev, kbtab->phys, sizeof(kbtab->phys)); + strlcat(kbtab->phys, "/input0", sizeof(kbtab->phys)); + + input_dev->name = "KB Gear Tablet"; + input_dev->phys = kbtab->phys; + usb_to_input_id(dev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, kbtab); + + input_dev->open = kbtab_open; + input_dev->close = kbtab_close; + + input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_LEFT)] |= + BIT_MASK(BTN_LEFT) | BIT_MASK(BTN_RIGHT); + input_dev->keybit[BIT_WORD(BTN_DIGI)] |= + BIT_MASK(BTN_TOOL_PEN) | BIT_MASK(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, 0, 0x2000, 4, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 0x1750, 4, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 0xff, 0, 0); + + endpoint = &intf->cur_altsetting->endpoint[0].desc; + + usb_fill_int_urb(kbtab->irq, dev, + usb_rcvintpipe(dev, endpoint->bEndpointAddress), + kbtab->data, 8, + kbtab_irq, kbtab, endpoint->bInterval); + kbtab->irq->transfer_dma = kbtab->data_dma; + kbtab->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + error = input_register_device(kbtab->dev); + if (error) + goto fail3; + + usb_set_intfdata(intf, kbtab); + + return 0; + + fail3: usb_free_urb(kbtab->irq); + fail2: usb_free_coherent(dev, 8, kbtab->data, kbtab->data_dma); + fail1: input_free_device(input_dev); + kfree(kbtab); + return error; +} + +static void kbtab_disconnect(struct usb_interface *intf) +{ + struct kbtab *kbtab = usb_get_intfdata(intf); + + usb_set_intfdata(intf, NULL); + + input_unregister_device(kbtab->dev); + usb_free_urb(kbtab->irq); + usb_free_coherent(kbtab->usbdev, 8, kbtab->data, kbtab->data_dma); + kfree(kbtab); +} + +static struct usb_driver kbtab_driver = { + .name = "kbtab", + .probe = kbtab_probe, + .disconnect = kbtab_disconnect, + .id_table = kbtab_ids, +}; + +module_usb_driver(kbtab_driver); diff --git a/drivers/input/tablet/wacom.h b/drivers/input/tablet/wacom.h new file mode 100644 index 00000000..b79d4519 --- /dev/null +++ b/drivers/input/tablet/wacom.h @@ -0,0 +1,140 @@ +/* + * drivers/input/tablet/wacom.h + * + * USB Wacom tablet support + * + * Copyright (c) 2000-2004 Vojtech Pavlik + * Copyright (c) 2000 Andreas Bach Aaen + * Copyright (c) 2000 Clifford Wolf + * Copyright (c) 2000 Sam Mosel + * Copyright (c) 2000 James E. Blair + * Copyright (c) 2000 Daniel Egger + * Copyright (c) 2001 Frederic Lepied + * Copyright (c) 2004 Panagiotis Issaris + * Copyright (c) 2002-2011 Ping Cheng + * + * ChangeLog: + * v0.1 (vp) - Initial release + * v0.2 (aba) - Support for all buttons / combinations + * v0.3 (vp) - Support for Intuos added + * v0.4 (sm) - Support for more Intuos models, menustrip + * relative mode, proximity. + * v0.5 (vp) - Big cleanup, nifty features removed, + * they belong in userspace + * v1.8 (vp) - Submit URB only when operating, moved to CVS, + * use input_report_key instead of report_btn and + * other cleanups + * v1.11 (vp) - Add URB ->dev setting for new kernels + * v1.11 (jb) - Add support for the 4D Mouse & Lens + * v1.12 (de) - Add support for two more inking pen IDs + * v1.14 (vp) - Use new USB device id probing scheme. + * Fix Wacom Graphire mouse wheel + * v1.18 (vp) - Fix mouse wheel direction + * Make mouse relative + * v1.20 (fl) - Report tool id for Intuos devices + * - Multi tools support + * - Corrected Intuos protocol decoding (airbrush, 4D mouse, lens cursor...) + * - Add PL models support + * - Fix Wacom Graphire mouse wheel again + * v1.21 (vp) - Removed protocol descriptions + * - Added MISC_SERIAL for tool serial numbers + * (gb) - Identify version on module load. + * v1.21.1 (fl) - added Graphire2 support + * v1.21.2 (fl) - added Intuos2 support + * - added all the PL ids + * v1.21.3 (fl) - added another eraser id from Neil Okamoto + * - added smooth filter for Graphire from Peri Hankey + * - added PenPartner support from Olaf van Es + * - new tool ids from Ole Martin Bjoerndalen + * v1.29 (pc) - Add support for more tablets + * - Fix pressure reporting + * v1.30 (vp) - Merge 2.4 and 2.5 drivers + * - Since 2.5 now has input_sync(), remove MSC_SERIAL abuse + * - Cleanups here and there + * v1.30.1 (pi) - Added Graphire3 support + * v1.40 (pc) - Add support for several new devices, fix eraser reporting, ... + * v1.43 (pc) - Added support for Cintiq 21UX + * - Fixed a Graphire bug + * - Merged wacom_intuos3_irq into wacom_intuos_irq + * v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc. + * - Report Device IDs + * v1.45 (pc) - Added support for DTF 521, Intuos3 12x12 and 12x19 + * - Minor data report fix + * v1.46 (pc) - Split wacom.c into wacom_sys.c and wacom_wac.c, + * - where wacom_sys.c deals with system specific code, + * - and wacom_wac.c deals with Wacom specific code + * - Support Intuos3 4x6 + * v1.47 (pc) - Added support for Bamboo + * v1.48 (pc) - Added support for Bamboo1, BambooFun, and Cintiq 12WX + * v1.49 (pc) - Added support for USB Tablet PC (0x90, 0x93, and 0x9A) + * v1.50 (pc) - Fixed a TabletPC touch bug in 2.6.28 + * v1.51 (pc) - Added support for Intuos4 + * v1.52 (pc) - Query Wacom data upon system resume + * - add defines for features->type + * - add new devices (0x9F, 0xE2, and 0XE3) + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#ifndef WACOM_H +#define WACOM_H +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Version Information + */ +#define DRIVER_VERSION "v1.53" +#define DRIVER_AUTHOR "Vojtech Pavlik " +#define DRIVER_DESC "USB Wacom tablet driver" +#define DRIVER_LICENSE "GPL" + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE(DRIVER_LICENSE); + +#define USB_VENDOR_ID_WACOM 0x056a +#define USB_VENDOR_ID_LENOVO 0x17ef + +struct wacom { + dma_addr_t data_dma; + struct usb_device *usbdev; + struct usb_interface *intf; + struct urb *irq; + struct wacom_wac wacom_wac; + struct mutex lock; + struct work_struct work; + bool open; + char phys[32]; + struct wacom_led { + u8 select[2]; /* status led selector (0..3) */ + u8 llv; /* status led brightness no button (1..127) */ + u8 hlv; /* status led brightness button pressed (1..127) */ + u8 img_lum; /* OLED matrix display brightness */ + } led; + struct power_supply battery; +}; + +static inline void wacom_schedule_work(struct wacom_wac *wacom_wac) +{ + struct wacom *wacom = container_of(wacom_wac, struct wacom, wacom_wac); + schedule_work(&wacom->work); +} + +extern const struct usb_device_id wacom_ids[]; + +void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len); +void wacom_setup_device_quirks(struct wacom_features *features); +int wacom_setup_input_capabilities(struct input_dev *input_dev, + struct wacom_wac *wacom_wac); +#endif diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c new file mode 100644 index 00000000..3d838c0b --- /dev/null +++ b/drivers/input/tablet/wacom_sys.c @@ -0,0 +1,1453 @@ +/* + * drivers/input/tablet/wacom_sys.c + * + * USB Wacom tablet support - system specific code + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include "wacom_wac.h" +#include "wacom.h" + +/* defines to get HID report descriptor */ +#define HID_DEVICET_HID (USB_TYPE_CLASS | 0x01) +#define HID_DEVICET_REPORT (USB_TYPE_CLASS | 0x02) +#define HID_USAGE_UNDEFINED 0x00 +#define HID_USAGE_PAGE 0x05 +#define HID_USAGE_PAGE_DIGITIZER 0x0d +#define HID_USAGE_PAGE_DESKTOP 0x01 +#define HID_USAGE 0x09 +#define HID_USAGE_X 0x30 +#define HID_USAGE_Y 0x31 +#define HID_USAGE_X_TILT 0x3d +#define HID_USAGE_Y_TILT 0x3e +#define HID_USAGE_FINGER 0x22 +#define HID_USAGE_STYLUS 0x20 +#define HID_USAGE_CONTACTMAX 0x55 +#define HID_COLLECTION 0xa1 +#define HID_COLLECTION_LOGICAL 0x02 +#define HID_COLLECTION_END 0xc0 + +enum { + WCM_UNDEFINED = 0, + WCM_DESKTOP, + WCM_DIGITIZER, +}; + +struct hid_descriptor { + struct usb_descriptor_header header; + __le16 bcdHID; + u8 bCountryCode; + u8 bNumDescriptors; + u8 bDescriptorType; + __le16 wDescriptorLength; +} __attribute__ ((packed)); + +/* defines to get/set USB message */ +#define USB_REQ_GET_REPORT 0x01 +#define USB_REQ_SET_REPORT 0x09 + +#define WAC_HID_FEATURE_REPORT 0x03 +#define WAC_MSG_RETRIES 5 + +#define WAC_CMD_LED_CONTROL 0x20 +#define WAC_CMD_ICON_START 0x21 +#define WAC_CMD_ICON_XFER 0x23 +#define WAC_CMD_RETRIES 10 + +static int wacom_get_report(struct usb_interface *intf, u8 type, u8 id, + void *buf, size_t size, unsigned int retries) +{ + struct usb_device *dev = interface_to_usbdev(intf); + int retval; + + do { + retval = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), + USB_REQ_GET_REPORT, + USB_DIR_IN | USB_TYPE_CLASS | + USB_RECIP_INTERFACE, + (type << 8) + id, + intf->altsetting[0].desc.bInterfaceNumber, + buf, size, 100); + } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries); + + return retval; +} + +static int wacom_set_report(struct usb_interface *intf, u8 type, u8 id, + void *buf, size_t size, unsigned int retries) +{ + struct usb_device *dev = interface_to_usbdev(intf); + int retval; + + do { + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + USB_REQ_SET_REPORT, + USB_TYPE_CLASS | USB_RECIP_INTERFACE, + (type << 8) + id, + intf->altsetting[0].desc.bInterfaceNumber, + buf, size, 1000); + } while ((retval == -ETIMEDOUT || retval == -EPIPE) && --retries); + + return retval; +} + +static void wacom_sys_irq(struct urb *urb) +{ + struct wacom *wacom = urb->context; + struct device *dev = &wacom->intf->dev; + int retval; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + default: + dev_dbg(dev, "%s - nonzero urb status received: %d\n", + __func__, urb->status); + goto exit; + } + + wacom_wac_irq(&wacom->wacom_wac, urb->actual_length); + + exit: + usb_mark_last_busy(wacom->usbdev); + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(dev, "%s - usb_submit_urb failed with result %d\n", + __func__, retval); +} + +static int wacom_open(struct input_dev *dev) +{ + struct wacom *wacom = input_get_drvdata(dev); + int retval = 0; + + if (usb_autopm_get_interface(wacom->intf) < 0) + return -EIO; + + mutex_lock(&wacom->lock); + + if (usb_submit_urb(wacom->irq, GFP_KERNEL)) { + retval = -EIO; + goto out; + } + + wacom->open = true; + wacom->intf->needs_remote_wakeup = 1; + +out: + mutex_unlock(&wacom->lock); + usb_autopm_put_interface(wacom->intf); + return retval; +} + +static void wacom_close(struct input_dev *dev) +{ + struct wacom *wacom = input_get_drvdata(dev); + int autopm_error; + + autopm_error = usb_autopm_get_interface(wacom->intf); + + mutex_lock(&wacom->lock); + usb_kill_urb(wacom->irq); + wacom->open = false; + wacom->intf->needs_remote_wakeup = 0; + mutex_unlock(&wacom->lock); + + if (!autopm_error) + usb_autopm_put_interface(wacom->intf); +} + +/* + * Calculate the resolution of the X or Y axis, given appropriate HID data. + * This function is little more than hidinput_calc_abs_res stripped down. + */ +static int wacom_calc_hid_res(int logical_extents, int physical_extents, + unsigned char unit, unsigned char exponent) +{ + int prev, unit_exponent; + + /* Check if the extents are sane */ + if (logical_extents <= 0 || physical_extents <= 0) + return 0; + + /* Get signed value of nybble-sized twos-compliment exponent */ + unit_exponent = exponent; + if (unit_exponent > 7) + unit_exponent -= 16; + + /* Convert physical_extents to millimeters */ + if (unit == 0x11) { /* If centimeters */ + unit_exponent += 1; + } else if (unit == 0x13) { /* If inches */ + prev = physical_extents; + physical_extents *= 254; + if (physical_extents < prev) + return 0; + unit_exponent -= 1; + } else { + return 0; + } + + /* Apply negative unit exponent */ + for (; unit_exponent < 0; unit_exponent++) { + prev = logical_extents; + logical_extents *= 10; + if (logical_extents < prev) + return 0; + } + /* Apply positive unit exponent */ + for (; unit_exponent > 0; unit_exponent--) { + prev = physical_extents; + physical_extents *= 10; + if (physical_extents < prev) + return 0; + } + + /* Calculate resolution */ + return logical_extents / physical_extents; +} + +/* + * The physical dimension specified by the HID descriptor is likely not in + * the "100th of a mm" units expected by wacom_calculate_touch_res. This + * function adjusts the value of [xy]_phy based on the unit and exponent + * provided by the HID descriptor. If an error occurs durring conversion + * (e.g. from the unit being left unspecified) [xy]_phy is not modified. + */ +static void wacom_fix_phy_from_hid(struct wacom_features *features) +{ + int xres = wacom_calc_hid_res(features->x_max, features->x_phy, + features->unit, features->unitExpo); + int yres = wacom_calc_hid_res(features->y_max, features->y_phy, + features->unit, features->unitExpo); + + if (xres > 0 && yres > 0) { + features->x_phy = (100 * features->x_max) / xres; + features->y_phy = (100 * features->y_max) / yres; + } +} + +/* + * Static values for max X/Y and resolution of Pen interface is stored in + * features. This mean physical size of active area can be computed. + * This is useful to do when Pen and Touch have same active area of tablet. + * This means for Touch device, we only need to find max X/Y value and we + * have enough information to compute resolution of touch. + */ +static void wacom_set_phy_from_res(struct wacom_features *features) +{ + features->x_phy = (features->x_max * 100) / features->x_resolution; + features->y_phy = (features->y_max * 100) / features->y_resolution; +} + +static int wacom_parse_logical_collection(unsigned char *report, + struct wacom_features *features) +{ + int length = 0; + + if (features->type == BAMBOO_PT) { + + /* Logical collection is only used by 3rd gen Bamboo Touch */ + features->pktlen = WACOM_PKGLEN_BBTOUCH3; + features->device_type = BTN_TOOL_FINGER; + + wacom_set_phy_from_res(features); + + features->x_max = features->y_max = + get_unaligned_le16(&report[10]); + + length = 11; + } + return length; +} + +static void wacom_retrieve_report_data(struct usb_interface *intf, + struct wacom_features *features) +{ + int result = 0; + unsigned char *rep_data; + + rep_data = kmalloc(2, GFP_KERNEL); + if (rep_data) { + + rep_data[0] = 12; + result = wacom_get_report(intf, WAC_HID_FEATURE_REPORT, + rep_data[0], rep_data, 2, + WAC_MSG_RETRIES); + + if (result >= 0 && rep_data[1] > 2) + features->touch_max = rep_data[1]; + + kfree(rep_data); + } +} + +/* + * Interface Descriptor of wacom devices can be incomplete and + * inconsistent so wacom_features table is used to store stylus + * device's packet lengths, various maximum values, and tablet + * resolution based on product ID's. + * + * For devices that contain 2 interfaces, wacom_features table is + * inaccurate for the touch interface. Since the Interface Descriptor + * for touch interfaces has pretty complete data, this function exists + * to query tablet for this missing information instead of hard coding in + * an additional table. + * + * A typical Interface Descriptor for a stylus will contain a + * boot mouse application collection that is not of interest and this + * function will ignore it. + * + * It also contains a digitizer application collection that also is not + * of interest since any information it contains would be duplicate + * of what is in wacom_features. Usually it defines a report of an array + * of bytes that could be used as max length of the stylus packet returned. + * If it happens to define a Digitizer-Stylus Physical Collection then + * the X and Y logical values contain valid data but it is ignored. + * + * A typical Interface Descriptor for a touch interface will contain a + * Digitizer-Finger Physical Collection which will define both logical + * X/Y maximum as well as the physical size of tablet. Since touch + * interfaces haven't supported pressure or distance, this is enough + * information to override invalid values in the wacom_features table. + * + * 3rd gen Bamboo Touch no longer define a Digitizer-Finger Pysical + * Collection. Instead they define a Logical Collection with a single + * Logical Maximum for both X and Y. + * + * Intuos5 touch interface does not contain useful data. We deal with + * this after returning from this function. + */ +static int wacom_parse_hid(struct usb_interface *intf, + struct hid_descriptor *hid_desc, + struct wacom_features *features) +{ + struct usb_device *dev = interface_to_usbdev(intf); + char limit = 0; + /* result has to be defined as int for some devices */ + int result = 0, touch_max = 0; + int i = 0, usage = WCM_UNDEFINED, finger = 0, pen = 0; + unsigned char *report; + + report = kzalloc(hid_desc->wDescriptorLength, GFP_KERNEL); + if (!report) + return -ENOMEM; + + /* retrive report descriptors */ + do { + result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), + USB_REQ_GET_DESCRIPTOR, + USB_RECIP_INTERFACE | USB_DIR_IN, + HID_DEVICET_REPORT << 8, + intf->altsetting[0].desc.bInterfaceNumber, /* interface */ + report, + hid_desc->wDescriptorLength, + 5000); /* 5 secs */ + } while (result < 0 && limit++ < WAC_MSG_RETRIES); + + /* No need to parse the Descriptor. It isn't an error though */ + if (result < 0) + goto out; + + for (i = 0; i < hid_desc->wDescriptorLength; i++) { + + switch (report[i]) { + case HID_USAGE_PAGE: + switch (report[i + 1]) { + case HID_USAGE_PAGE_DIGITIZER: + usage = WCM_DIGITIZER; + i++; + break; + + case HID_USAGE_PAGE_DESKTOP: + usage = WCM_DESKTOP; + i++; + break; + } + break; + + case HID_USAGE: + switch (report[i + 1]) { + case HID_USAGE_X: + if (usage == WCM_DESKTOP) { + if (finger) { + features->device_type = BTN_TOOL_FINGER; + /* touch device at least supports one touch point */ + touch_max = 1; + switch (features->type) { + case TABLETPC2FG: + features->pktlen = WACOM_PKGLEN_TPC2FG; + break; + + case MTSCREEN: + case WACOM_24HDT: + features->pktlen = WACOM_PKGLEN_MTOUCH; + break; + + case MTTPC: + features->pktlen = WACOM_PKGLEN_MTTPC; + break; + + case BAMBOO_PT: + features->pktlen = WACOM_PKGLEN_BBTOUCH; + break; + + default: + features->pktlen = WACOM_PKGLEN_GRAPHIRE; + break; + } + + switch (features->type) { + case BAMBOO_PT: + features->x_phy = + get_unaligned_le16(&report[i + 5]); + features->x_max = + get_unaligned_le16(&report[i + 8]); + i += 15; + break; + + case WACOM_24HDT: + features->x_max = + get_unaligned_le16(&report[i + 3]); + features->x_phy = + get_unaligned_le16(&report[i + 8]); + features->unit = report[i - 1]; + features->unitExpo = report[i - 3]; + i += 12; + break; + + default: + features->x_max = + get_unaligned_le16(&report[i + 3]); + features->x_phy = + get_unaligned_le16(&report[i + 6]); + features->unit = report[i + 9]; + features->unitExpo = report[i + 11]; + i += 12; + break; + } + } else if (pen) { + /* penabled only accepts exact bytes of data */ + if (features->type >= TABLETPC) + features->pktlen = WACOM_PKGLEN_GRAPHIRE; + features->device_type = BTN_TOOL_PEN; + features->x_max = + get_unaligned_le16(&report[i + 3]); + i += 4; + } + } + break; + + case HID_USAGE_Y: + if (usage == WCM_DESKTOP) { + if (finger) { + switch (features->type) { + case TABLETPC2FG: + case MTSCREEN: + case MTTPC: + features->y_max = + get_unaligned_le16(&report[i + 3]); + features->y_phy = + get_unaligned_le16(&report[i + 6]); + i += 7; + break; + + case WACOM_24HDT: + features->y_max = + get_unaligned_le16(&report[i + 3]); + features->y_phy = + get_unaligned_le16(&report[i - 2]); + i += 7; + break; + + case BAMBOO_PT: + features->y_phy = + get_unaligned_le16(&report[i + 3]); + features->y_max = + get_unaligned_le16(&report[i + 6]); + i += 12; + break; + + default: + features->y_max = + features->x_max; + features->y_phy = + get_unaligned_le16(&report[i + 3]); + i += 4; + break; + } + } else if (pen) { + features->y_max = + get_unaligned_le16(&report[i + 3]); + i += 4; + } + } + break; + + case HID_USAGE_FINGER: + finger = 1; + i++; + break; + + /* + * Requiring Stylus Usage will ignore boot mouse + * X/Y values and some cases of invalid Digitizer X/Y + * values commonly reported. + */ + case HID_USAGE_STYLUS: + pen = 1; + i++; + break; + + case HID_USAGE_CONTACTMAX: + /* leave touch_max as is if predefined */ + if (!features->touch_max) + wacom_retrieve_report_data(intf, features); + i++; + break; + } + break; + + case HID_COLLECTION_END: + /* reset UsagePage and Finger */ + finger = usage = 0; + break; + + case HID_COLLECTION: + i++; + switch (report[i]) { + case HID_COLLECTION_LOGICAL: + i += wacom_parse_logical_collection(&report[i], + features); + break; + } + break; + } + } + + out: + if (!features->touch_max && touch_max) + features->touch_max = touch_max; + result = 0; + kfree(report); + return result; +} + +static int wacom_set_device_mode(struct usb_interface *intf, int report_id, int length, int mode) +{ + unsigned char *rep_data; + int error = -ENOMEM, limit = 0; + + rep_data = kzalloc(length, GFP_KERNEL); + if (!rep_data) + return error; + + do { + rep_data[0] = report_id; + rep_data[1] = mode; + + error = wacom_set_report(intf, WAC_HID_FEATURE_REPORT, + report_id, rep_data, length, 1); + if (error >= 0) + error = wacom_get_report(intf, WAC_HID_FEATURE_REPORT, + report_id, rep_data, length, 1); + } while ((error < 0 || rep_data[1] != mode) && limit++ < WAC_MSG_RETRIES); + + kfree(rep_data); + + return error < 0 ? error : 0; +} + +/* + * Switch the tablet into its most-capable mode. Wacom tablets are + * typically configured to power-up in a mode which sends mouse-like + * reports to the OS. To get absolute position, pressure data, etc. + * from the tablet, it is necessary to switch the tablet out of this + * mode and into one which sends the full range of tablet data. + */ +static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_features *features) +{ + if (features->device_type == BTN_TOOL_FINGER) { + if (features->type > TABLETPC) { + /* MT Tablet PC touch */ + return wacom_set_device_mode(intf, 3, 4, 4); + } + else if (features->type == WACOM_24HDT) { + return wacom_set_device_mode(intf, 18, 3, 2); + } + } else if (features->device_type == BTN_TOOL_PEN) { + if (features->type <= BAMBOO_PT && features->type != WIRELESS) { + return wacom_set_device_mode(intf, 2, 2, 2); + } + } + + return 0; +} + +static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, + struct wacom_features *features) +{ + int error = 0; + struct usb_host_interface *interface = intf->cur_altsetting; + struct hid_descriptor *hid_desc; + + /* default features */ + features->device_type = BTN_TOOL_PEN; + features->x_fuzz = 4; + features->y_fuzz = 4; + features->pressure_fuzz = 0; + features->distance_fuzz = 0; + + /* + * The wireless device HID is basic and layout conflicts with + * other tablets (monitor and touch interface can look like pen). + * Skip the query for this type and modify defaults based on + * interface number. + */ + if (features->type == WIRELESS) { + if (intf->cur_altsetting->desc.bInterfaceNumber == 0) { + features->device_type = 0; + } else if (intf->cur_altsetting->desc.bInterfaceNumber == 2) { + features->device_type = BTN_TOOL_FINGER; + features->pktlen = WACOM_PKGLEN_BBTOUCH3; + } + } + + /* only devices that support touch need to retrieve the info */ + if (features->type < BAMBOO_PT) { + goto out; + } + + error = usb_get_extra_descriptor(interface, HID_DEVICET_HID, &hid_desc); + if (error) { + error = usb_get_extra_descriptor(&interface->endpoint[0], + HID_DEVICET_REPORT, &hid_desc); + if (error) { + dev_err(&intf->dev, + "can not retrieve extra class descriptor\n"); + goto out; + } + } + error = wacom_parse_hid(intf, hid_desc, features); + if (error) + goto out; + wacom_fix_phy_from_hid(features); + + out: + return error; +} + +struct wacom_usbdev_data { + struct list_head list; + struct kref kref; + struct usb_device *dev; + struct wacom_shared shared; +}; + +static LIST_HEAD(wacom_udev_list); +static DEFINE_MUTEX(wacom_udev_list_lock); + +static struct usb_device *wacom_get_sibling(struct usb_device *dev, int vendor, int product) +{ + int port1; + struct usb_device *sibling; + + if (vendor == 0 && product == 0) + return dev; + + if (dev->parent == NULL) + return NULL; + + usb_hub_for_each_child(dev->parent, port1, sibling) { + struct usb_device_descriptor *d; + if (sibling == NULL) + continue; + + d = &sibling->descriptor; + if (d->idVendor == vendor && d->idProduct == product) + return sibling; + } + + return NULL; +} + +static struct wacom_usbdev_data *wacom_get_usbdev_data(struct usb_device *dev) +{ + struct wacom_usbdev_data *data; + + list_for_each_entry(data, &wacom_udev_list, list) { + if (data->dev == dev) { + kref_get(&data->kref); + return data; + } + } + + return NULL; +} + +static int wacom_add_shared_data(struct wacom_wac *wacom, + struct usb_device *dev) +{ + struct wacom_usbdev_data *data; + int retval = 0; + + mutex_lock(&wacom_udev_list_lock); + + data = wacom_get_usbdev_data(dev); + if (!data) { + data = kzalloc(sizeof(struct wacom_usbdev_data), GFP_KERNEL); + if (!data) { + retval = -ENOMEM; + goto out; + } + + kref_init(&data->kref); + data->dev = dev; + list_add_tail(&data->list, &wacom_udev_list); + } + + wacom->shared = &data->shared; + +out: + mutex_unlock(&wacom_udev_list_lock); + return retval; +} + +static void wacom_release_shared_data(struct kref *kref) +{ + struct wacom_usbdev_data *data = + container_of(kref, struct wacom_usbdev_data, kref); + + mutex_lock(&wacom_udev_list_lock); + list_del(&data->list); + mutex_unlock(&wacom_udev_list_lock); + + kfree(data); +} + +static void wacom_remove_shared_data(struct wacom_wac *wacom) +{ + struct wacom_usbdev_data *data; + + if (wacom->shared) { + data = container_of(wacom->shared, struct wacom_usbdev_data, shared); + kref_put(&data->kref, wacom_release_shared_data); + wacom->shared = NULL; + } +} + +static int wacom_led_control(struct wacom *wacom) +{ + unsigned char *buf; + int retval; + + buf = kzalloc(9, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + if (wacom->wacom_wac.features.type >= INTUOS5S && + wacom->wacom_wac.features.type <= INTUOS5L) { + /* + * Touch Ring and crop mark LED luminance may take on + * one of four values: + * 0 = Low; 1 = Medium; 2 = High; 3 = Off + */ + int ring_led = wacom->led.select[0] & 0x03; + int ring_lum = (((wacom->led.llv & 0x60) >> 5) - 1) & 0x03; + int crop_lum = 0; + + buf[0] = WAC_CMD_LED_CONTROL; + buf[1] = (crop_lum << 4) | (ring_lum << 2) | (ring_led); + } + else { + int led = wacom->led.select[0] | 0x4; + + if (wacom->wacom_wac.features.type == WACOM_21UX2 || + wacom->wacom_wac.features.type == WACOM_24HD) + led |= (wacom->led.select[1] << 4) | 0x40; + + buf[0] = WAC_CMD_LED_CONTROL; + buf[1] = led; + buf[2] = wacom->led.llv; + buf[3] = wacom->led.hlv; + buf[4] = wacom->led.img_lum; + } + + retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_LED_CONTROL, + buf, 9, WAC_CMD_RETRIES); + kfree(buf); + + return retval; +} + +static int wacom_led_putimage(struct wacom *wacom, int button_id, const void *img) +{ + unsigned char *buf; + int i, retval; + + buf = kzalloc(259, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + /* Send 'start' command */ + buf[0] = WAC_CMD_ICON_START; + buf[1] = 1; + retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START, + buf, 2, WAC_CMD_RETRIES); + if (retval < 0) + goto out; + + buf[0] = WAC_CMD_ICON_XFER; + buf[1] = button_id & 0x07; + for (i = 0; i < 4; i++) { + buf[2] = i; + memcpy(buf + 3, img + i * 256, 256); + + retval = wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_XFER, + buf, 259, WAC_CMD_RETRIES); + if (retval < 0) + break; + } + + /* Send 'stop' */ + buf[0] = WAC_CMD_ICON_START; + buf[1] = 0; + wacom_set_report(wacom->intf, 0x03, WAC_CMD_ICON_START, + buf, 2, WAC_CMD_RETRIES); + +out: + kfree(buf); + return retval; +} + +static ssize_t wacom_led_select_store(struct device *dev, int set_id, + const char *buf, size_t count) +{ + struct wacom *wacom = dev_get_drvdata(dev); + unsigned int id; + int err; + + err = kstrtouint(buf, 10, &id); + if (err) + return err; + + mutex_lock(&wacom->lock); + + wacom->led.select[set_id] = id & 0x3; + err = wacom_led_control(wacom); + + mutex_unlock(&wacom->lock); + + return err < 0 ? err : count; +} + +#define DEVICE_LED_SELECT_ATTR(SET_ID) \ +static ssize_t wacom_led##SET_ID##_select_store(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count) \ +{ \ + return wacom_led_select_store(dev, SET_ID, buf, count); \ +} \ +static ssize_t wacom_led##SET_ID##_select_show(struct device *dev, \ + struct device_attribute *attr, char *buf) \ +{ \ + struct wacom *wacom = dev_get_drvdata(dev); \ + return snprintf(buf, 2, "%d\n", wacom->led.select[SET_ID]); \ +} \ +static DEVICE_ATTR(status_led##SET_ID##_select, S_IWUSR | S_IRUSR, \ + wacom_led##SET_ID##_select_show, \ + wacom_led##SET_ID##_select_store) + +DEVICE_LED_SELECT_ATTR(0); +DEVICE_LED_SELECT_ATTR(1); + +static ssize_t wacom_luminance_store(struct wacom *wacom, u8 *dest, + const char *buf, size_t count) +{ + unsigned int value; + int err; + + err = kstrtouint(buf, 10, &value); + if (err) + return err; + + mutex_lock(&wacom->lock); + + *dest = value & 0x7f; + err = wacom_led_control(wacom); + + mutex_unlock(&wacom->lock); + + return err < 0 ? err : count; +} + +#define DEVICE_LUMINANCE_ATTR(name, field) \ +static ssize_t wacom_##name##_luminance_store(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count) \ +{ \ + struct wacom *wacom = dev_get_drvdata(dev); \ + \ + return wacom_luminance_store(wacom, &wacom->led.field, \ + buf, count); \ +} \ +static DEVICE_ATTR(name##_luminance, S_IWUSR, \ + NULL, wacom_##name##_luminance_store) + +DEVICE_LUMINANCE_ATTR(status0, llv); +DEVICE_LUMINANCE_ATTR(status1, hlv); +DEVICE_LUMINANCE_ATTR(buttons, img_lum); + +static ssize_t wacom_button_image_store(struct device *dev, int button_id, + const char *buf, size_t count) +{ + struct wacom *wacom = dev_get_drvdata(dev); + int err; + + if (count != 1024) + return -EINVAL; + + mutex_lock(&wacom->lock); + + err = wacom_led_putimage(wacom, button_id, buf); + + mutex_unlock(&wacom->lock); + + return err < 0 ? err : count; +} + +#define DEVICE_BTNIMG_ATTR(BUTTON_ID) \ +static ssize_t wacom_btnimg##BUTTON_ID##_store(struct device *dev, \ + struct device_attribute *attr, const char *buf, size_t count) \ +{ \ + return wacom_button_image_store(dev, BUTTON_ID, buf, count); \ +} \ +static DEVICE_ATTR(button##BUTTON_ID##_rawimg, S_IWUSR, \ + NULL, wacom_btnimg##BUTTON_ID##_store) + +DEVICE_BTNIMG_ATTR(0); +DEVICE_BTNIMG_ATTR(1); +DEVICE_BTNIMG_ATTR(2); +DEVICE_BTNIMG_ATTR(3); +DEVICE_BTNIMG_ATTR(4); +DEVICE_BTNIMG_ATTR(5); +DEVICE_BTNIMG_ATTR(6); +DEVICE_BTNIMG_ATTR(7); + +static struct attribute *cintiq_led_attrs[] = { + &dev_attr_status_led0_select.attr, + &dev_attr_status_led1_select.attr, + NULL +}; + +static struct attribute_group cintiq_led_attr_group = { + .name = "wacom_led", + .attrs = cintiq_led_attrs, +}; + +static struct attribute *intuos4_led_attrs[] = { + &dev_attr_status0_luminance.attr, + &dev_attr_status1_luminance.attr, + &dev_attr_status_led0_select.attr, + &dev_attr_buttons_luminance.attr, + &dev_attr_button0_rawimg.attr, + &dev_attr_button1_rawimg.attr, + &dev_attr_button2_rawimg.attr, + &dev_attr_button3_rawimg.attr, + &dev_attr_button4_rawimg.attr, + &dev_attr_button5_rawimg.attr, + &dev_attr_button6_rawimg.attr, + &dev_attr_button7_rawimg.attr, + NULL +}; + +static struct attribute_group intuos4_led_attr_group = { + .name = "wacom_led", + .attrs = intuos4_led_attrs, +}; + +static struct attribute *intuos5_led_attrs[] = { + &dev_attr_status0_luminance.attr, + &dev_attr_status_led0_select.attr, + NULL +}; + +static struct attribute_group intuos5_led_attr_group = { + .name = "wacom_led", + .attrs = intuos5_led_attrs, +}; + +static int wacom_initialize_leds(struct wacom *wacom) +{ + int error; + + /* Initialize default values */ + switch (wacom->wacom_wac.features.type) { + case INTUOS4S: + case INTUOS4: + case INTUOS4L: + wacom->led.select[0] = 0; + wacom->led.select[1] = 0; + wacom->led.llv = 10; + wacom->led.hlv = 20; + wacom->led.img_lum = 10; + error = sysfs_create_group(&wacom->intf->dev.kobj, + &intuos4_led_attr_group); + break; + + case WACOM_24HD: + case WACOM_21UX2: + wacom->led.select[0] = 0; + wacom->led.select[1] = 0; + wacom->led.llv = 0; + wacom->led.hlv = 0; + wacom->led.img_lum = 0; + + error = sysfs_create_group(&wacom->intf->dev.kobj, + &cintiq_led_attr_group); + break; + + case INTUOS5S: + case INTUOS5: + case INTUOS5L: + wacom->led.select[0] = 0; + wacom->led.select[1] = 0; + wacom->led.llv = 32; + wacom->led.hlv = 0; + wacom->led.img_lum = 0; + + error = sysfs_create_group(&wacom->intf->dev.kobj, + &intuos5_led_attr_group); + break; + + default: + return 0; + } + + if (error) { + dev_err(&wacom->intf->dev, + "cannot create sysfs group err: %d\n", error); + return error; + } + wacom_led_control(wacom); + + return 0; +} + +static void wacom_destroy_leds(struct wacom *wacom) +{ + switch (wacom->wacom_wac.features.type) { + case INTUOS4S: + case INTUOS4: + case INTUOS4L: + sysfs_remove_group(&wacom->intf->dev.kobj, + &intuos4_led_attr_group); + break; + + case WACOM_24HD: + case WACOM_21UX2: + sysfs_remove_group(&wacom->intf->dev.kobj, + &cintiq_led_attr_group); + break; + + case INTUOS5S: + case INTUOS5: + case INTUOS5L: + sysfs_remove_group(&wacom->intf->dev.kobj, + &intuos5_led_attr_group); + break; + } +} + +static enum power_supply_property wacom_battery_props[] = { + POWER_SUPPLY_PROP_CAPACITY +}; + +static int wacom_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + struct wacom *wacom = container_of(psy, struct wacom, battery); + int ret = 0; + + switch (psp) { + case POWER_SUPPLY_PROP_CAPACITY: + val->intval = + wacom->wacom_wac.battery_capacity * 100 / 31; + break; + default: + ret = -EINVAL; + break; + } + + return ret; +} + +static int wacom_initialize_battery(struct wacom *wacom) +{ + int error = 0; + + if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR) { + wacom->battery.properties = wacom_battery_props; + wacom->battery.num_properties = ARRAY_SIZE(wacom_battery_props); + wacom->battery.get_property = wacom_battery_get_property; + wacom->battery.name = "wacom_battery"; + wacom->battery.type = POWER_SUPPLY_TYPE_BATTERY; + wacom->battery.use_for_apm = 0; + + error = power_supply_register(&wacom->usbdev->dev, + &wacom->battery); + + if (!error) + power_supply_powers(&wacom->battery, + &wacom->usbdev->dev); + } + + return error; +} + +static void wacom_destroy_battery(struct wacom *wacom) +{ + if (wacom->wacom_wac.features.quirks & WACOM_QUIRK_MONITOR && + wacom->battery.dev) { + power_supply_unregister(&wacom->battery); + wacom->battery.dev = NULL; + } +} + +static int wacom_register_input(struct wacom *wacom) +{ + struct input_dev *input_dev; + struct usb_interface *intf = wacom->intf; + struct usb_device *dev = interface_to_usbdev(intf); + struct wacom_wac *wacom_wac = &(wacom->wacom_wac); + int error; + + input_dev = input_allocate_device(); + if (!input_dev) { + error = -ENOMEM; + goto fail1; + } + + input_dev->name = wacom_wac->name; + input_dev->dev.parent = &intf->dev; + input_dev->open = wacom_open; + input_dev->close = wacom_close; + usb_to_input_id(dev, &input_dev->id); + input_set_drvdata(input_dev, wacom); + + wacom_wac->input = input_dev; + error = wacom_setup_input_capabilities(input_dev, wacom_wac); + if (error) + goto fail1; + + error = input_register_device(input_dev); + if (error) + goto fail2; + + return 0; + +fail2: + input_free_device(input_dev); + wacom_wac->input = NULL; +fail1: + return error; +} + +static void wacom_wireless_work(struct work_struct *work) +{ + struct wacom *wacom = container_of(work, struct wacom, work); + struct usb_device *usbdev = wacom->usbdev; + struct wacom_wac *wacom_wac = &wacom->wacom_wac; + struct wacom *wacom1, *wacom2; + struct wacom_wac *wacom_wac1, *wacom_wac2; + int error; + + /* + * Regardless if this is a disconnect or a new tablet, + * remove any existing input and battery devices. + */ + + wacom_destroy_battery(wacom); + + /* Stylus interface */ + wacom1 = usb_get_intfdata(usbdev->config->interface[1]); + wacom_wac1 = &(wacom1->wacom_wac); + if (wacom_wac1->input) + input_unregister_device(wacom_wac1->input); + wacom_wac1->input = NULL; + + /* Touch interface */ + wacom2 = usb_get_intfdata(usbdev->config->interface[2]); + wacom_wac2 = &(wacom2->wacom_wac); + if (wacom_wac2->input) + input_unregister_device(wacom_wac2->input); + wacom_wac2->input = NULL; + + if (wacom_wac->pid == 0) { + dev_info(&wacom->intf->dev, "wireless tablet disconnected\n"); + } else { + const struct usb_device_id *id = wacom_ids; + + dev_info(&wacom->intf->dev, + "wireless tablet connected with PID %x\n", + wacom_wac->pid); + + while (id->match_flags) { + if (id->idVendor == USB_VENDOR_ID_WACOM && + id->idProduct == wacom_wac->pid) + break; + id++; + } + + if (!id->match_flags) { + dev_info(&wacom->intf->dev, + "ignoring unknown PID.\n"); + return; + } + + /* Stylus interface */ + wacom_wac1->features = + *((struct wacom_features *)id->driver_info); + wacom_wac1->features.device_type = BTN_TOOL_PEN; + error = wacom_register_input(wacom1); + if (error) + goto fail1; + + /* Touch interface */ + wacom_wac2->features = + *((struct wacom_features *)id->driver_info); + wacom_wac2->features.pktlen = WACOM_PKGLEN_BBTOUCH3; + wacom_wac2->features.device_type = BTN_TOOL_FINGER; + wacom_set_phy_from_res(&wacom_wac2->features); + wacom_wac2->features.x_max = wacom_wac2->features.y_max = 4096; + error = wacom_register_input(wacom2); + if (error) + goto fail2; + + error = wacom_initialize_battery(wacom); + if (error) + goto fail3; + } + + return; + +fail3: + input_unregister_device(wacom_wac2->input); + wacom_wac2->input = NULL; +fail2: + input_unregister_device(wacom_wac1->input); + wacom_wac1->input = NULL; +fail1: + return; +} + +static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *id) +{ + struct usb_device *dev = interface_to_usbdev(intf); + struct usb_endpoint_descriptor *endpoint; + struct wacom *wacom; + struct wacom_wac *wacom_wac; + struct wacom_features *features; + int error; + + if (!id->driver_info) + return -EINVAL; + + wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); + if (!wacom) + return -ENOMEM; + + wacom_wac = &wacom->wacom_wac; + wacom_wac->features = *((struct wacom_features *)id->driver_info); + features = &wacom_wac->features; + if (features->pktlen > WACOM_PKGLEN_MAX) { + error = -EINVAL; + goto fail1; + } + + wacom_wac->data = usb_alloc_coherent(dev, WACOM_PKGLEN_MAX, + GFP_KERNEL, &wacom->data_dma); + if (!wacom_wac->data) { + error = -ENOMEM; + goto fail1; + } + + wacom->irq = usb_alloc_urb(0, GFP_KERNEL); + if (!wacom->irq) { + error = -ENOMEM; + goto fail2; + } + + wacom->usbdev = dev; + wacom->intf = intf; + mutex_init(&wacom->lock); + INIT_WORK(&wacom->work, wacom_wireless_work); + usb_make_path(dev, wacom->phys, sizeof(wacom->phys)); + strlcat(wacom->phys, "/input0", sizeof(wacom->phys)); + + endpoint = &intf->cur_altsetting->endpoint[0].desc; + + /* Retrieve the physical and logical size for touch devices */ + error = wacom_retrieve_hid_descriptor(intf, features); + if (error) + goto fail3; + + /* + * Intuos5 has no useful data about its touch interface in its + * HID descriptor. If this is the touch interface (wMaxPacketSize + * of WACOM_PKGLEN_BBTOUCH3), override the table values. + */ + if (features->type >= INTUOS5S && features->type <= INTUOS5L) { + if (endpoint->wMaxPacketSize == WACOM_PKGLEN_BBTOUCH3) { + features->device_type = BTN_TOOL_FINGER; + features->pktlen = WACOM_PKGLEN_BBTOUCH3; + + wacom_set_phy_from_res(features); + + features->x_max = 4096; + features->y_max = 4096; + } else { + features->device_type = BTN_TOOL_PEN; + } + } + + wacom_setup_device_quirks(features); + + strlcpy(wacom_wac->name, features->name, sizeof(wacom_wac->name)); + + if (features->quirks & WACOM_QUIRK_MULTI_INPUT) { + struct usb_device *other_dev; + + /* Append the device type to the name */ + strlcat(wacom_wac->name, + features->device_type == BTN_TOOL_PEN ? + " Pen" : " Finger", + sizeof(wacom_wac->name)); + + + other_dev = wacom_get_sibling(dev, features->oVid, features->oPid); + if (other_dev == NULL || wacom_get_usbdev_data(other_dev) == NULL) + other_dev = dev; + error = wacom_add_shared_data(wacom_wac, other_dev); + if (error) + goto fail3; + } + + usb_fill_int_urb(wacom->irq, dev, + usb_rcvintpipe(dev, endpoint->bEndpointAddress), + wacom_wac->data, features->pktlen, + wacom_sys_irq, wacom, endpoint->bInterval); + wacom->irq->transfer_dma = wacom->data_dma; + wacom->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + error = wacom_initialize_leds(wacom); + if (error) + goto fail4; + + if (!(features->quirks & WACOM_QUIRK_NO_INPUT)) { + error = wacom_register_input(wacom); + if (error) + goto fail5; + } + + /* Note that if query fails it is not a hard failure */ + wacom_query_tablet_data(intf, features); + + usb_set_intfdata(intf, wacom); + + if (features->quirks & WACOM_QUIRK_MONITOR) { + if (usb_submit_urb(wacom->irq, GFP_KERNEL)) + goto fail5; + } + + return 0; + + fail5: wacom_destroy_leds(wacom); + fail4: wacom_remove_shared_data(wacom_wac); + fail3: usb_free_urb(wacom->irq); + fail2: usb_free_coherent(dev, WACOM_PKGLEN_MAX, wacom_wac->data, wacom->data_dma); + fail1: kfree(wacom); + return error; +} + +static void wacom_disconnect(struct usb_interface *intf) +{ + struct wacom *wacom = usb_get_intfdata(intf); + + usb_set_intfdata(intf, NULL); + + usb_kill_urb(wacom->irq); + cancel_work_sync(&wacom->work); + if (wacom->wacom_wac.input) + input_unregister_device(wacom->wacom_wac.input); + wacom_destroy_battery(wacom); + wacom_destroy_leds(wacom); + usb_free_urb(wacom->irq); + usb_free_coherent(interface_to_usbdev(intf), WACOM_PKGLEN_MAX, + wacom->wacom_wac.data, wacom->data_dma); + wacom_remove_shared_data(&wacom->wacom_wac); + kfree(wacom); +} + +static int wacom_suspend(struct usb_interface *intf, pm_message_t message) +{ + struct wacom *wacom = usb_get_intfdata(intf); + + mutex_lock(&wacom->lock); + usb_kill_urb(wacom->irq); + mutex_unlock(&wacom->lock); + + return 0; +} + +static int wacom_resume(struct usb_interface *intf) +{ + struct wacom *wacom = usb_get_intfdata(intf); + struct wacom_features *features = &wacom->wacom_wac.features; + int rv = 0; + + mutex_lock(&wacom->lock); + + /* switch to wacom mode first */ + wacom_query_tablet_data(intf, features); + wacom_led_control(wacom); + + if ((wacom->open || features->quirks & WACOM_QUIRK_MONITOR) + && usb_submit_urb(wacom->irq, GFP_NOIO) < 0) + rv = -EIO; + + mutex_unlock(&wacom->lock); + + return rv; +} + +static int wacom_reset_resume(struct usb_interface *intf) +{ + return wacom_resume(intf); +} + +static struct usb_driver wacom_driver = { + .name = "wacom", + .id_table = wacom_ids, + .probe = wacom_probe, + .disconnect = wacom_disconnect, + .suspend = wacom_suspend, + .resume = wacom_resume, + .reset_resume = wacom_reset_resume, + .supports_autosuspend = 1, +}; + +module_usb_driver(wacom_driver); diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c new file mode 100644 index 00000000..384fbcd0 --- /dev/null +++ b/drivers/input/tablet/wacom_wac.c @@ -0,0 +1,2266 @@ +/* + * drivers/input/tablet/wacom_wac.c + * + * USB Wacom tablet support - Wacom specific code + * + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +#include "wacom_wac.h" +#include "wacom.h" +#include +#include + +/* resolution for penabled devices */ +#define WACOM_PL_RES 20 +#define WACOM_PENPRTN_RES 40 +#define WACOM_VOLITO_RES 50 +#define WACOM_GRAPHIRE_RES 80 +#define WACOM_INTUOS_RES 100 +#define WACOM_INTUOS3_RES 200 + +/* Scale factor relating reported contact size to logical contact area. + * 2^14/pi is a good approximation on Intuos5 and 3rd-gen Bamboo + */ +#define WACOM_CONTACT_AREA_SCALE 2607 + +static int wacom_penpartner_irq(struct wacom_wac *wacom) +{ + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + + switch (data[0]) { + case 1: + if (data[5] & 0x80) { + wacom->tool[0] = (data[5] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; + wacom->id[0] = (data[5] & 0x20) ? ERASER_DEVICE_ID : STYLUS_DEVICE_ID; + input_report_key(input, wacom->tool[0], 1); + input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ + input_report_abs(input, ABS_X, get_unaligned_le16(&data[1])); + input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3])); + input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127); + input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -127)); + input_report_key(input, BTN_STYLUS, (data[5] & 0x40)); + } else { + input_report_key(input, wacom->tool[0], 0); + input_report_abs(input, ABS_MISC, 0); /* report tool id */ + input_report_abs(input, ABS_PRESSURE, -1); + input_report_key(input, BTN_TOUCH, 0); + } + break; + + case 2: + input_report_key(input, BTN_TOOL_PEN, 1); + input_report_abs(input, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */ + input_report_abs(input, ABS_X, get_unaligned_le16(&data[1])); + input_report_abs(input, ABS_Y, get_unaligned_le16(&data[3])); + input_report_abs(input, ABS_PRESSURE, (signed char)data[6] + 127); + input_report_key(input, BTN_TOUCH, ((signed char)data[6] > -80) && !(data[5] & 0x20)); + input_report_key(input, BTN_STYLUS, (data[5] & 0x40)); + break; + + default: + dev_dbg(input->dev.parent, + "%s: received unknown report #%d\n", __func__, data[0]); + return 0; + } + + return 1; +} + +static int wacom_pl_irq(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + int prox, pressure; + + if (data[0] != WACOM_REPORT_PENABLED) { + dev_dbg(input->dev.parent, + "%s: received unknown report #%d\n", __func__, data[0]); + return 0; + } + + prox = data[1] & 0x40; + + if (prox) { + wacom->id[0] = ERASER_DEVICE_ID; + pressure = (signed char)((data[7] << 1) | ((data[4] >> 2) & 1)); + if (features->pressure_max > 255) + pressure = (pressure << 1) | ((data[4] >> 6) & 1); + pressure += (features->pressure_max + 1) / 2; + + /* + * if going from out of proximity into proximity select between the eraser + * and the pen based on the state of the stylus2 button, choose eraser if + * pressed else choose pen. if not a proximity change from out to in, send + * an out of proximity for previous tool then a in for new tool. + */ + if (!wacom->tool[0]) { + /* Eraser bit set for DTF */ + if (data[1] & 0x10) + wacom->tool[1] = BTN_TOOL_RUBBER; + else + /* Going into proximity select tool */ + wacom->tool[1] = (data[4] & 0x20) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; + } else { + /* was entered with stylus2 pressed */ + if (wacom->tool[1] == BTN_TOOL_RUBBER && !(data[4] & 0x20)) { + /* report out proximity for previous tool */ + input_report_key(input, wacom->tool[1], 0); + input_sync(input); + wacom->tool[1] = BTN_TOOL_PEN; + return 0; + } + } + if (wacom->tool[1] != BTN_TOOL_RUBBER) { + /* Unknown tool selected default to pen tool */ + wacom->tool[1] = BTN_TOOL_PEN; + wacom->id[0] = STYLUS_DEVICE_ID; + } + input_report_key(input, wacom->tool[1], prox); /* report in proximity for tool */ + input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ + input_report_abs(input, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); + input_report_abs(input, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); + input_report_abs(input, ABS_PRESSURE, pressure); + + input_report_key(input, BTN_TOUCH, data[4] & 0x08); + input_report_key(input, BTN_STYLUS, data[4] & 0x10); + /* Only allow the stylus2 button to be reported for the pen tool. */ + input_report_key(input, BTN_STYLUS2, (wacom->tool[1] == BTN_TOOL_PEN) && (data[4] & 0x20)); + } else { + /* report proximity-out of a (valid) tool */ + if (wacom->tool[1] != BTN_TOOL_RUBBER) { + /* Unknown tool selected default to pen tool */ + wacom->tool[1] = BTN_TOOL_PEN; + } + input_report_key(input, wacom->tool[1], prox); + } + + wacom->tool[0] = prox; /* Save proximity state */ + return 1; +} + +static int wacom_ptu_irq(struct wacom_wac *wacom) +{ + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + + if (data[0] != WACOM_REPORT_PENABLED) { + dev_dbg(input->dev.parent, + "%s: received unknown report #%d\n", __func__, data[0]); + return 0; + } + + if (data[1] & 0x04) { + input_report_key(input, BTN_TOOL_RUBBER, data[1] & 0x20); + input_report_key(input, BTN_TOUCH, data[1] & 0x08); + wacom->id[0] = ERASER_DEVICE_ID; + } else { + input_report_key(input, BTN_TOOL_PEN, data[1] & 0x20); + input_report_key(input, BTN_TOUCH, data[1] & 0x01); + wacom->id[0] = STYLUS_DEVICE_ID; + } + input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ + input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); + input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); + input_report_abs(input, ABS_PRESSURE, le16_to_cpup((__le16 *)&data[6])); + input_report_key(input, BTN_STYLUS, data[1] & 0x02); + input_report_key(input, BTN_STYLUS2, data[1] & 0x10); + return 1; +} + +static int wacom_dtu_irq(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + char *data = wacom->data; + struct input_dev *input = wacom->input; + int prox = data[1] & 0x20, pressure; + + dev_dbg(input->dev.parent, + "%s: received report #%d", __func__, data[0]); + + if (prox) { + /* Going into proximity select tool */ + wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; + if (wacom->tool[0] == BTN_TOOL_PEN) + wacom->id[0] = STYLUS_DEVICE_ID; + else + wacom->id[0] = ERASER_DEVICE_ID; + } + input_report_key(input, BTN_STYLUS, data[1] & 0x02); + input_report_key(input, BTN_STYLUS2, data[1] & 0x10); + input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); + input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); + pressure = ((data[7] & 0x01) << 8) | data[6]; + if (pressure < 0) + pressure = features->pressure_max + pressure + 1; + input_report_abs(input, ABS_PRESSURE, pressure); + input_report_key(input, BTN_TOUCH, data[1] & 0x05); + if (!prox) /* out-prox */ + wacom->id[0] = 0; + input_report_key(input, wacom->tool[0], prox); + input_report_abs(input, ABS_MISC, wacom->id[0]); + return 1; +} + +static int wacom_graphire_irq(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + int prox; + int rw = 0; + int retval = 0; + + if (data[0] != WACOM_REPORT_PENABLED) { + dev_dbg(input->dev.parent, + "%s: received unknown report #%d\n", __func__, data[0]); + goto exit; + } + + prox = data[1] & 0x80; + if (prox || wacom->id[0]) { + if (prox) { + switch ((data[1] >> 5) & 3) { + + case 0: /* Pen */ + wacom->tool[0] = BTN_TOOL_PEN; + wacom->id[0] = STYLUS_DEVICE_ID; + break; + + case 1: /* Rubber */ + wacom->tool[0] = BTN_TOOL_RUBBER; + wacom->id[0] = ERASER_DEVICE_ID; + break; + + case 2: /* Mouse with wheel */ + input_report_key(input, BTN_MIDDLE, data[1] & 0x04); + /* fall through */ + + case 3: /* Mouse without wheel */ + wacom->tool[0] = BTN_TOOL_MOUSE; + wacom->id[0] = CURSOR_DEVICE_ID; + break; + } + } + input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); + input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); + if (wacom->tool[0] != BTN_TOOL_MOUSE) { + input_report_abs(input, ABS_PRESSURE, data[6] | ((data[7] & 0x03) << 8)); + input_report_key(input, BTN_TOUCH, data[1] & 0x01); + input_report_key(input, BTN_STYLUS, data[1] & 0x02); + input_report_key(input, BTN_STYLUS2, data[1] & 0x04); + } else { + input_report_key(input, BTN_LEFT, data[1] & 0x01); + input_report_key(input, BTN_RIGHT, data[1] & 0x02); + if (features->type == WACOM_G4 || + features->type == WACOM_MO) { + input_report_abs(input, ABS_DISTANCE, data[6] & 0x3f); + rw = (data[7] & 0x04) - (data[7] & 0x03); + } else { + input_report_abs(input, ABS_DISTANCE, data[7] & 0x3f); + rw = -(signed char)data[6]; + } + input_report_rel(input, REL_WHEEL, rw); + } + + if (!prox) + wacom->id[0] = 0; + input_report_abs(input, ABS_MISC, wacom->id[0]); /* report tool id */ + input_report_key(input, wacom->tool[0], prox); + input_event(input, EV_MSC, MSC_SERIAL, 1); + input_sync(input); /* sync last event */ + } + + /* send pad data */ + switch (features->type) { + case WACOM_G4: + prox = data[7] & 0xf8; + if (prox || wacom->id[1]) { + wacom->id[1] = PAD_DEVICE_ID; + input_report_key(input, BTN_BACK, (data[7] & 0x40)); + input_report_key(input, BTN_FORWARD, (data[7] & 0x80)); + rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); + input_report_rel(input, REL_WHEEL, rw); + if (!prox) + wacom->id[1] = 0; + input_report_abs(input, ABS_MISC, wacom->id[1]); + input_event(input, EV_MSC, MSC_SERIAL, 0xf0); + retval = 1; + } + break; + + case WACOM_MO: + prox = (data[7] & 0xf8) || data[8]; + if (prox || wacom->id[1]) { + wacom->id[1] = PAD_DEVICE_ID; + input_report_key(input, BTN_BACK, (data[7] & 0x08)); + input_report_key(input, BTN_LEFT, (data[7] & 0x20)); + input_report_key(input, BTN_FORWARD, (data[7] & 0x10)); + input_report_key(input, BTN_RIGHT, (data[7] & 0x40)); + input_report_abs(input, ABS_WHEEL, (data[8] & 0x7f)); + if (!prox) + wacom->id[1] = 0; + input_report_abs(input, ABS_MISC, wacom->id[1]); + input_event(input, EV_MSC, MSC_SERIAL, 0xf0); + retval = 1; + } + break; + } +exit: + return retval; +} + +static int wacom_intuos_inout(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + int idx = 0; + + /* tool number */ + if (features->type == INTUOS) + idx = data[1] & 0x01; + + /* Enter report */ + if ((data[1] & 0xfc) == 0xc0) { + if (features->quirks == WACOM_QUIRK_MULTI_INPUT) + wacom->shared->stylus_in_proximity = true; + + /* serial number of the tool */ + wacom->serial[idx] = ((data[3] & 0x0f) << 28) + + (data[4] << 20) + (data[5] << 12) + + (data[6] << 4) + (data[7] >> 4); + + wacom->id[idx] = (data[2] << 4) | (data[3] >> 4) | + ((data[7] & 0x0f) << 20) | ((data[8] & 0xf0) << 12); + + switch (wacom->id[idx]) { + case 0x812: /* Inking pen */ + case 0x801: /* Intuos3 Inking pen */ + case 0x120802: /* Intuos4/5 Inking Pen */ + case 0x012: + wacom->tool[idx] = BTN_TOOL_PENCIL; + break; + + case 0x822: /* Pen */ + case 0x842: + case 0x852: + case 0x823: /* Intuos3 Grip Pen */ + case 0x813: /* Intuos3 Classic Pen */ + case 0x885: /* Intuos3 Marker Pen */ + case 0x802: /* Intuos4/5 13HD/24HD General Pen */ + case 0x804: /* Intuos4/5 13HD/24HD Marker Pen */ + case 0x022: + case 0x100804: /* Intuos4/5 13HD/24HD Art Pen */ + case 0x140802: /* Intuos4/5 13HD/24HD Classic Pen */ + case 0x160802: /* Cintiq 13HD Pro Pen */ + case 0x180802: /* DTH2242 Pen */ + case 0x100802: /* Intuos4/5 13HD/24HD General Pen */ + wacom->tool[idx] = BTN_TOOL_PEN; + break; + + case 0x832: /* Stroke pen */ + case 0x032: + wacom->tool[idx] = BTN_TOOL_BRUSH; + break; + + case 0x007: /* Mouse 4D and 2D */ + case 0x09c: + case 0x094: + case 0x017: /* Intuos3 2D Mouse */ + case 0x806: /* Intuos4 Mouse */ + wacom->tool[idx] = BTN_TOOL_MOUSE; + break; + + case 0x096: /* Lens cursor */ + case 0x097: /* Intuos3 Lens cursor */ + case 0x006: /* Intuos4 Lens cursor */ + wacom->tool[idx] = BTN_TOOL_LENS; + break; + + case 0x82a: /* Eraser */ + case 0x85a: + case 0x91a: + case 0xd1a: + case 0x0fa: + case 0x82b: /* Intuos3 Grip Pen Eraser */ + case 0x81b: /* Intuos3 Classic Pen Eraser */ + case 0x91b: /* Intuos3 Airbrush Eraser */ + case 0x80c: /* Intuos4/5 13HD/24HD Marker Pen Eraser */ + case 0x80a: /* Intuos4/5 13HD/24HD General Pen Eraser */ + case 0x90a: /* Intuos4/5 13HD/24HD Airbrush Eraser */ + case 0x14080a: /* Intuos4/5 13HD/24HD Classic Pen Eraser */ + case 0x10090a: /* Intuos4/5 13HD/24HD Airbrush Eraser */ + case 0x10080c: /* Intuos4/5 13HD/24HD Art Pen Eraser */ + case 0x16080a: /* Cintiq 13HD Pro Pen Eraser */ + case 0x18080a: /* DTH2242 Eraser */ + case 0x10080a: /* Intuos4/5 13HD/24HD General Pen Eraser */ + wacom->tool[idx] = BTN_TOOL_RUBBER; + break; + + case 0xd12: + case 0x912: + case 0x112: + case 0x913: /* Intuos3 Airbrush */ + case 0x902: /* Intuos4/5 13HD/24HD Airbrush */ + case 0x100902: /* Intuos4/5 13HD/24HD Airbrush */ + wacom->tool[idx] = BTN_TOOL_AIRBRUSH; + break; + + default: /* Unknown tool */ + wacom->tool[idx] = BTN_TOOL_PEN; + break; + } + return 1; + } + + /* older I4 styli don't work with new Cintiqs */ + if (!((wacom->id[idx] >> 20) & 0x01) && + (features->type == WACOM_21UX2)) + return 1; + + /* Exit report */ + if ((data[1] & 0xfe) == 0x80) { + if (features->quirks == WACOM_QUIRK_MULTI_INPUT) + wacom->shared->stylus_in_proximity = false; + + /* + * Reset all states otherwise we lose the initial states + * when in-prox next time + */ + input_report_abs(input, ABS_X, 0); + input_report_abs(input, ABS_Y, 0); + input_report_abs(input, ABS_DISTANCE, 0); + input_report_abs(input, ABS_TILT_X, 0); + input_report_abs(input, ABS_TILT_Y, 0); + if (wacom->tool[idx] >= BTN_TOOL_MOUSE) { + input_report_key(input, BTN_LEFT, 0); + input_report_key(input, BTN_MIDDLE, 0); + input_report_key(input, BTN_RIGHT, 0); + input_report_key(input, BTN_SIDE, 0); + input_report_key(input, BTN_EXTRA, 0); + input_report_abs(input, ABS_THROTTLE, 0); + input_report_abs(input, ABS_RZ, 0); + } else { + input_report_abs(input, ABS_PRESSURE, 0); + input_report_key(input, BTN_STYLUS, 0); + input_report_key(input, BTN_STYLUS2, 0); + input_report_key(input, BTN_TOUCH, 0); + input_report_abs(input, ABS_WHEEL, 0); + if (features->type >= INTUOS3S) + input_report_abs(input, ABS_Z, 0); + } + input_report_key(input, wacom->tool[idx], 0); + input_report_abs(input, ABS_MISC, 0); /* reset tool id */ + input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); + wacom->id[idx] = 0; + return 2; + } + return 0; +} + +static void wacom_intuos_general(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + unsigned int t; + + /* general pen packet */ + if ((data[1] & 0xb8) == 0xa0) { + t = (data[6] << 2) | ((data[7] >> 6) & 3); + if (features->type >= INTUOS4S && features->type <= WACOM_24HD) { + t = (t << 1) | (data[1] & 1); + } + input_report_abs(input, ABS_PRESSURE, t); + input_report_abs(input, ABS_TILT_X, + ((data[7] << 1) & 0x7e) | (data[8] >> 7)); + input_report_abs(input, ABS_TILT_Y, data[8] & 0x7f); + input_report_key(input, BTN_STYLUS, data[1] & 2); + input_report_key(input, BTN_STYLUS2, data[1] & 4); + input_report_key(input, BTN_TOUCH, t > 10); + } + + /* airbrush second packet */ + if ((data[1] & 0xbc) == 0xb4) { + input_report_abs(input, ABS_WHEEL, + (data[6] << 2) | ((data[7] >> 6) & 3)); + input_report_abs(input, ABS_TILT_X, + ((data[7] << 1) & 0x7e) | (data[8] >> 7)); + input_report_abs(input, ABS_TILT_Y, data[8] & 0x7f); + } +} + +static int wacom_intuos_irq(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + unsigned char *data = wacom->data; + struct input_dev *input = wacom->input; + unsigned int t; + int idx = 0, result; + + if (data[0] != WACOM_REPORT_PENABLED && + data[0] != WACOM_REPORT_INTUOSREAD && + data[0] != WACOM_REPORT_INTUOSWRITE && + data[0] != WACOM_REPORT_INTUOSPAD && + data[0] != WACOM_REPORT_INTUOS5PAD) { + dev_dbg(input->dev.parent, + "%s: received unknown report #%d\n", __func__, data[0]); + return 0; + } + + /* tool number */ + if (features->type == INTUOS) + idx = data[1] & 0x01; + + /* pad packets. Works as a second tool and is always in prox */ + if (data[0] == WACOM_REPORT_INTUOSPAD || data[0] == WACOM_REPORT_INTUOS5PAD) { + if (features->type >= INTUOS4S && features->type <= INTUOS4L) { + input_report_key(input, BTN_0, (data[2] & 0x01)); + input_report_key(input, BTN_1, (data[3] & 0x01)); + input_report_key(input, BTN_2, (data[3] & 0x02)); + input_report_key(input, BTN_3, (data[3] & 0x04)); + input_report_key(input, BTN_4, (data[3] & 0x08)); + input_report_key(input, BTN_5, (data[3] & 0x10)); + input_report_key(input, BTN_6, (data[3] & 0x20)); + if (data[1] & 0x80) { + input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f)); + } else { + /* Out of proximity, clear wheel value. */ + input_report_abs(input, ABS_WHEEL, 0); + } + if (features->type != INTUOS4S) { + input_report_key(input, BTN_7, (data[3] & 0x40)); + input_report_key(input, BTN_8, (data[3] & 0x80)); + } + if (data[1] | (data[2] & 0x01) | data[3]) { + input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); + } else { + input_report_abs(input, ABS_MISC, 0); + } + } else if (features->type == DTK) { + input_report_key(input, BTN_0, (data[6] & 0x01)); + input_report_key(input, BTN_1, (data[6] & 0x02)); + input_report_key(input, BTN_2, (data[6] & 0x04)); + input_report_key(input, BTN_3, (data[6] & 0x08)); + input_report_key(input, BTN_4, (data[6] & 0x10)); + input_report_key(input, BTN_5, (data[6] & 0x20)); + if (data[6] & 0x3f) { + input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); + } else { + input_report_abs(input, ABS_MISC, 0); + } + } else if (features->type == WACOM_13HD) { + input_report_key(input, BTN_0, (data[3] & 0x01)); + input_report_key(input, BTN_1, (data[4] & 0x01)); + input_report_key(input, BTN_2, (data[4] & 0x02)); + input_report_key(input, BTN_3, (data[4] & 0x04)); + input_report_key(input, BTN_4, (data[4] & 0x08)); + input_report_key(input, BTN_5, (data[4] & 0x10)); + input_report_key(input, BTN_6, (data[4] & 0x20)); + input_report_key(input, BTN_7, (data[4] & 0x40)); + input_report_key(input, BTN_8, (data[4] & 0x80)); + if ((data[3] & 0x01) | data[4]) { + input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); + } else { + input_report_abs(input, ABS_MISC, 0); + } + } else if (features->type == WACOM_24HD) { + input_report_key(input, BTN_0, (data[6] & 0x01)); + input_report_key(input, BTN_1, (data[6] & 0x02)); + input_report_key(input, BTN_2, (data[6] & 0x04)); + input_report_key(input, BTN_3, (data[6] & 0x08)); + input_report_key(input, BTN_4, (data[6] & 0x10)); + input_report_key(input, BTN_5, (data[6] & 0x20)); + input_report_key(input, BTN_6, (data[6] & 0x40)); + input_report_key(input, BTN_7, (data[6] & 0x80)); + input_report_key(input, BTN_8, (data[8] & 0x01)); + input_report_key(input, BTN_9, (data[8] & 0x02)); + input_report_key(input, BTN_A, (data[8] & 0x04)); + input_report_key(input, BTN_B, (data[8] & 0x08)); + input_report_key(input, BTN_C, (data[8] & 0x10)); + input_report_key(input, BTN_X, (data[8] & 0x20)); + input_report_key(input, BTN_Y, (data[8] & 0x40)); + input_report_key(input, BTN_Z, (data[8] & 0x80)); + + /* + * Three "buttons" are available on the 24HD which are + * physically implemented as a touchstrip. Each button + * is approximately 3 bits wide with a 2 bit spacing. + * The raw touchstrip bits are stored at: + * ((data[3] & 0x1f) << 8) | data[4]) + */ + input_report_key(input, KEY_PROG1, data[4] & 0x07); + input_report_key(input, KEY_PROG2, data[4] & 0xE0); + input_report_key(input, KEY_PROG3, data[3] & 0x1C); + + if (data[1] & 0x80) { + input_report_abs(input, ABS_WHEEL, (data[1] & 0x7f)); + } else { + /* Out of proximity, clear wheel value. */ + input_report_abs(input, ABS_WHEEL, 0); + } + + if (data[2] & 0x80) { + input_report_abs(input, ABS_THROTTLE, (data[2] & 0x7f)); + } else { + /* Out of proximity, clear second wheel value. */ + input_report_abs(input, ABS_THROTTLE, 0); + } + + if (data[1] | data[2] | (data[3] & 0x1f) | data[4] | data[6] | data[8]) { + input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); + } else { + input_report_abs(input, ABS_MISC, 0); + } + } else if (features->type >= INTUOS5S && features->type <= INTUOS5L) { + int i; + + /* Touch ring mode switch has no capacitive sensor */ + input_report_key(input, BTN_0, (data[3] & 0x01)); + + /* + * ExpressKeys on Intuos5 have a capacitive sensor in + * addition to the mechanical switch. Switch data is + * stored in data[4], capacitive data in data[5]. + */ + for (i = 0; i < 8; i++) + input_report_key(input, BTN_1 + i, data[4] & (1 << i)); + + if (data[2] & 0x80) { + input_report_abs(input, ABS_WHEEL, (data[2] & 0x7f)); + } else { + /* Out of proximity, clear wheel value. */ + input_report_abs(input, ABS_WHEEL, 0); + } + + if (data[2] | (data[3] & 0x01) | data[4] | data[5]) { + input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); + } else { + input_report_abs(input, ABS_MISC, 0); + } + } else { + if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) { + input_report_key(input, BTN_0, (data[5] & 0x01)); + input_report_key(input, BTN_1, (data[6] & 0x01)); + input_report_key(input, BTN_2, (data[6] & 0x02)); + input_report_key(input, BTN_3, (data[6] & 0x04)); + input_report_key(input, BTN_4, (data[6] & 0x08)); + input_report_key(input, BTN_5, (data[6] & 0x10)); + input_report_key(input, BTN_6, (data[6] & 0x20)); + input_report_key(input, BTN_7, (data[6] & 0x40)); + input_report_key(input, BTN_8, (data[6] & 0x80)); + input_report_key(input, BTN_9, (data[7] & 0x01)); + input_report_key(input, BTN_A, (data[8] & 0x01)); + input_report_key(input, BTN_B, (data[8] & 0x02)); + input_report_key(input, BTN_C, (data[8] & 0x04)); + input_report_key(input, BTN_X, (data[8] & 0x08)); + input_report_key(input, BTN_Y, (data[8] & 0x10)); + input_report_key(input, BTN_Z, (data[8] & 0x20)); + input_report_key(input, BTN_BASE, (data[8] & 0x40)); + input_report_key(input, BTN_BASE2, (data[8] & 0x80)); + + if (features->type == WACOM_22HD) { + input_report_key(input, KEY_PROG1, data[9] & 0x01); + input_report_key(input, KEY_PROG2, data[9] & 0x02); + input_report_key(input, KEY_PROG3, data[9] & 0x04); + } + } else { + input_report_key(input, BTN_0, (data[5] & 0x01)); + input_report_key(input, BTN_1, (data[5] & 0x02)); + input_report_key(input, BTN_2, (data[5] & 0x04)); + input_report_key(input, BTN_3, (data[5] & 0x08)); + input_report_key(input, BTN_4, (data[6] & 0x01)); + input_report_key(input, BTN_5, (data[6] & 0x02)); + input_report_key(input, BTN_6, (data[6] & 0x04)); + input_report_key(input, BTN_7, (data[6] & 0x08)); + input_report_key(input, BTN_8, (data[5] & 0x10)); + input_report_key(input, BTN_9, (data[6] & 0x10)); + } + input_report_abs(input, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]); + input_report_abs(input, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]); + + if ((data[5] & 0x1f) | data[6] | (data[1] & 0x1f) | + data[2] | (data[3] & 0x1f) | data[4] | data[8] | + (data[7] & 0x01)) { + input_report_abs(input, ABS_MISC, PAD_DEVICE_ID); + } else { + input_report_abs(input, ABS_MISC, 0); + } + } + input_event(input, EV_MSC, MSC_SERIAL, 0xffffffff); + return 1; + } + + /* process in/out prox events */ + result = wacom_intuos_inout(wacom); + if (result) + return result - 1; + + /* don't proceed if we don't know the ID */ + if (!wacom->id[idx]) + return 0; + + /* Only large Intuos support Lense Cursor */ + if (wacom->tool[idx] == BTN_TOOL_LENS && + (features->type == INTUOS3 || + features->type == INTUOS3S || + features->type == INTUOS4 || + features->type == INTUOS4S || + features->type == INTUOS5 || + features->type == INTUOS5S)) { + + return 0; + } + + /* Cintiq doesn't send data when RDY bit isn't set */ + if (features->type == CINTIQ && !(data[1] & 0x40)) + return 0; + + if (features->type >= INTUOS3S) { + input_report_abs(input, ABS_X, (data[2] << 9) | (data[3] << 1) | ((data[9] >> 1) & 1)); + input_report_abs(input, ABS_Y, (data[4] << 9) | (data[5] << 1) | (data[9] & 1)); + input_report_abs(input, ABS_DISTANCE, ((data[9] >> 2) & 0x3f)); + } else { + input_report_abs(input, ABS_X, be16_to_cpup((__be16 *)&data[2])); + input_report_abs(input, ABS_Y, be16_to_cpup((__be16 *)&data[4])); + input_report_abs(input, ABS_DISTANCE, ((data[9] >> 3) & 0x1f)); + } + + /* process general packets */ + wacom_intuos_general(wacom); + + /* 4D mouse, 2D mouse, marker pen rotation, tilt mouse, or Lens cursor packets */ + if ((data[1] & 0xbc) == 0xa8 || (data[1] & 0xbe) == 0xb0 || (data[1] & 0xbc) == 0xac) { + + if (data[1] & 0x02) { + /* Rotation packet */ + if (features->type >= INTUOS3S) { + /* I3 marker pen rotation */ + t = (data[6] << 3) | ((data[7] >> 5) & 7); + t = (data[7] & 0x20) ? ((t > 900) ? ((t-1) / 2 - 1350) : + ((t-1) / 2 + 450)) : (450 - t / 2) ; + input_report_abs(input, ABS_Z, t); + } else { + /* 4D mouse rotation packet */ + t = (data[6] << 3) | ((data[7] >> 5) & 7); + input_report_abs(input, ABS_RZ, (data[7] & 0x20) ? + ((t - 1) / 2) : -t / 2); + } + + } else if (!(data[1] & 0x10) && features->type < INTUOS3S) { + /* 4D mouse packet */ + input_report_key(input, BTN_LEFT, data[8] & 0x01); + input_report_key(input, BTN_MIDDLE, data[8] & 0x02); + input_report_key(input, BTN_RIGHT, data[8] & 0x04); + + input_report_key(input, BTN_SIDE, data[8] & 0x20); + input_report_key(input, BTN_EXTRA, data[8] & 0x10); + t = (data[6] << 2) | ((data[7] >> 6) & 3); + input_report_abs(input, ABS_THROTTLE, (data[8] & 0x08) ? -t : t); + + } else if (wacom->tool[idx] == BTN_TOOL_MOUSE) { + /* I4 mouse */ + if ((features->type >= INTUOS4S && features->type <= INTUOS4L) || + (features->type >= INTUOS5S && features->type <= INTUOS5L)) { + input_report_key(input, BTN_LEFT, data[6] & 0x01); + input_report_key(input, BTN_MIDDLE, data[6] & 0x02); + input_report_key(input, BTN_RIGHT, data[6] & 0x04); + input_report_rel(input, REL_WHEEL, ((data[7] & 0x80) >> 7) + - ((data[7] & 0x40) >> 6)); + input_report_key(input, BTN_SIDE, data[6] & 0x08); + input_report_key(input, BTN_EXTRA, data[6] & 0x10); + + input_report_abs(input, ABS_TILT_X, + ((data[7] << 1) & 0x7e) | (data[8] >> 7)); + input_report_abs(input, ABS_TILT_Y, data[8] & 0x7f); + } else { + /* 2D mouse packet */ + input_report_key(input, BTN_LEFT, data[8] & 0x04); + input_report_key(input, BTN_MIDDLE, data[8] & 0x08); + input_report_key(input, BTN_RIGHT, data[8] & 0x10); + input_report_rel(input, REL_WHEEL, (data[8] & 0x01) + - ((data[8] & 0x02) >> 1)); + + /* I3 2D mouse side buttons */ + if (features->type >= INTUOS3S && features->type <= INTUOS3L) { + input_report_key(input, BTN_SIDE, data[8] & 0x40); + input_report_key(input, BTN_EXTRA, data[8] & 0x20); + } + } + } else if ((features->type < INTUOS3S || features->type == INTUOS3L || + features->type == INTUOS4L || features->type == INTUOS5L) && + wacom->tool[idx] == BTN_TOOL_LENS) { + /* Lens cursor packets */ + input_report_key(input, BTN_LEFT, data[8] & 0x01); + input_report_key(input, BTN_MIDDLE, data[8] & 0x02); + input_report_key(input, BTN_RIGHT, data[8] & 0x04); + input_report_key(input, BTN_SIDE, data[8] & 0x10); + input_report_key(input, BTN_EXTRA, data[8] & 0x08); + } + } + + input_report_abs(input, ABS_MISC, wacom->id[idx]); /* report tool id */ + input_report_key(input, wacom->tool[idx], 1); + input_event(input, EV_MSC, MSC_SERIAL, wacom->serial[idx]); + return 1; +} + +static int int_dist(int x1, int y1, int x2, int y2) +{ + int x = x2 - x1; + int y = y2 - y1; + + return int_sqrt(x*x + y*y); +} + +static int wacom_24hdt_irq(struct wacom_wac *wacom) +{ + struct input_dev *input = wacom->input; + char *data = wacom->data; + int i; + int current_num_contacts = data[61]; + int contacts_to_send = 0; + + /* + * First packet resets the counter since only the first + * packet in series will have non-zero current_num_contacts. + */ + if (current_num_contacts) + wacom->num_contacts_left = current_num_contacts; + + /* There are at most 4 contacts per packet */ + contacts_to_send = min(4, wacom->num_contacts_left); + + for (i = 0; i < contacts_to_send; i++) { + int offset = (WACOM_BYTES_PER_24HDT_PACKET * i) + 1; + bool touch = data[offset] & 0x1 && !wacom->shared->stylus_in_proximity; + int slot = input_mt_get_slot_by_key(input, data[offset + 1]); + + if (slot < 0) + continue; + input_mt_slot(input, slot); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); + + if (touch) { + int t_x = le16_to_cpup((__le16 *)&data[offset + 2]); + int c_x = le16_to_cpup((__le16 *)&data[offset + 4]); + int t_y = le16_to_cpup((__le16 *)&data[offset + 6]); + int c_y = le16_to_cpup((__le16 *)&data[offset + 8]); + int w = le16_to_cpup((__le16 *)&data[offset + 10]); + int h = le16_to_cpup((__le16 *)&data[offset + 12]); + + input_report_abs(input, ABS_MT_POSITION_X, t_x); + input_report_abs(input, ABS_MT_POSITION_Y, t_y); + input_report_abs(input, ABS_MT_TOUCH_MAJOR, min(w,h)); + input_report_abs(input, ABS_MT_WIDTH_MAJOR, min(w, h) + int_dist(t_x, t_y, c_x, c_y)); + input_report_abs(input, ABS_MT_WIDTH_MINOR, min(w, h)); + input_report_abs(input, ABS_MT_ORIENTATION, w > h); + } + } + input_mt_report_pointer_emulation(input, true); + + wacom->num_contacts_left -= contacts_to_send; + if (wacom->num_contacts_left <= 0) + wacom->num_contacts_left = 0; + + return 1; +} + +static int wacom_mt_touch(struct wacom_wac *wacom) +{ + struct input_dev *input = wacom->input; + char *data = wacom->data; + int i; + int current_num_contacts = data[2]; + int contacts_to_send = 0; + int x_offset = 0; + + /* MTTPC does not support Height and Width */ + if (wacom->features.type == MTTPC) + x_offset = -4; + + /* + * First packet resets the counter since only the first + * packet in series will have non-zero current_num_contacts. + */ + if (current_num_contacts) + wacom->num_contacts_left = current_num_contacts; + + /* There are at most 5 contacts per packet */ + contacts_to_send = min(5, wacom->num_contacts_left); + + for (i = 0; i < contacts_to_send; i++) { + int offset = (WACOM_BYTES_PER_MT_PACKET + x_offset) * i + 3; + bool touch = data[offset] & 0x1; + int id = le16_to_cpup((__le16 *)&data[offset + 1]); + int slot = input_mt_get_slot_by_key(input, id); + + if (slot < 0) + continue; + + input_mt_slot(input, slot); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); + if (touch) { + int x = le16_to_cpup((__le16 *)&data[offset + x_offset + 7]); + int y = le16_to_cpup((__le16 *)&data[offset + x_offset + 9]); + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); + } + } + input_mt_report_pointer_emulation(input, true); + + wacom->num_contacts_left -= contacts_to_send; + if (wacom->num_contacts_left < 0) + wacom->num_contacts_left = 0; + + return 1; +} + +static int wacom_tpc_mt_touch(struct wacom_wac *wacom) +{ + struct input_dev *input = wacom->input; + unsigned char *data = wacom->data; + int contact_with_no_pen_down_count = 0; + int i; + + for (i = 0; i < 2; i++) { + int p = data[1] & (1 << i); + bool touch = p && !wacom->shared->stylus_in_proximity; + + input_mt_slot(input, i); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); + if (touch) { + int x = le16_to_cpup((__le16 *)&data[i * 2 + 2]) & 0x7fff; + int y = le16_to_cpup((__le16 *)&data[i * 2 + 6]) & 0x7fff; + + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); + contact_with_no_pen_down_count++; + } + } + input_mt_report_pointer_emulation(input, true); + + /* keep touch state for pen event */ + wacom->shared->touch_down = (contact_with_no_pen_down_count > 0); + + return 1; +} + +static int wacom_tpc_single_touch(struct wacom_wac *wacom, size_t len) +{ + char *data = wacom->data; + struct input_dev *input = wacom->input; + bool prox; + int x = 0, y = 0; + + if (wacom->features.touch_max > 1 || len > WACOM_PKGLEN_TPC2FG) + return 0; + + if (!wacom->shared->stylus_in_proximity) { + if (len == WACOM_PKGLEN_TPC1FG) { + prox = data[0] & 0x01; + x = get_unaligned_le16(&data[1]); + y = get_unaligned_le16(&data[3]); + } else { + prox = data[1] & 0x01; + x = le16_to_cpup((__le16 *)&data[2]); + y = le16_to_cpup((__le16 *)&data[4]); + } + } else + /* force touch out when pen is in prox */ + prox = 0; + + if (prox) { + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + } + input_report_key(input, BTN_TOUCH, prox); + + /* keep touch state for pen events */ + wacom->shared->touch_down = prox; + + return 1; +} + +static int wacom_tpc_pen(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + char *data = wacom->data; + struct input_dev *input = wacom->input; + int pressure; + bool prox = data[1] & 0x20; + + if (!wacom->shared->stylus_in_proximity) /* first in prox */ + /* Going into proximity select tool */ + wacom->tool[0] = (data[1] & 0x0c) ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; + + /* keep pen state for touch events */ + wacom->shared->stylus_in_proximity = prox; + + /* send pen events only when touch is up or forced out */ + if (!wacom->shared->touch_down) { + input_report_key(input, BTN_STYLUS, data[1] & 0x02); + input_report_key(input, BTN_STYLUS2, data[1] & 0x10); + input_report_abs(input, ABS_X, le16_to_cpup((__le16 *)&data[2])); + input_report_abs(input, ABS_Y, le16_to_cpup((__le16 *)&data[4])); + pressure = ((data[7] & 0x01) << 8) | data[6]; + if (pressure < 0) + pressure = features->pressure_max + pressure + 1; + input_report_abs(input, ABS_PRESSURE, pressure); + input_report_key(input, BTN_TOUCH, data[1] & 0x05); + input_report_key(input, wacom->tool[0], prox); + return 1; + } + + return 0; +} + +static int wacom_tpc_irq(struct wacom_wac *wacom, size_t len) +{ + char *data = wacom->data; + + dev_dbg(wacom->input->dev.parent, + "%s: received report #%d\n", __func__, data[0]); + + switch (len) { + case WACOM_PKGLEN_TPC1FG: + return wacom_tpc_single_touch(wacom, len); + + case WACOM_PKGLEN_TPC2FG: + return wacom_tpc_mt_touch(wacom); + + default: + switch (data[0]) { + case WACOM_REPORT_TPC1FG: + case WACOM_REPORT_TPCHID: + case WACOM_REPORT_TPCST: + case WACOM_REPORT_TPC1FGE: + return wacom_tpc_single_touch(wacom, len); + + case WACOM_REPORT_TPCMT: + return wacom_mt_touch(wacom); + + case WACOM_REPORT_PENABLED: + return wacom_tpc_pen(wacom); + } + } + + return 0; +} + +static int wacom_bpt_touch(struct wacom_wac *wacom) +{ + struct wacom_features *features = &wacom->features; + struct input_dev *input = wacom->input; + unsigned char *data = wacom->data; + int i; + + if (data[0] != 0x02) + return 0; + + for (i = 0; i < 2; i++) { + int offset = (data[1] & 0x80) ? (8 * i) : (9 * i); + bool touch = data[offset + 3] & 0x80; + + /* + * Touch events need to be disabled while stylus is + * in proximity because user's hand is resting on touchpad + * and sending unwanted events. User expects tablet buttons + * to continue working though. + */ + touch = touch && !wacom->shared->stylus_in_proximity; + + input_mt_slot(input, i); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); + if (touch) { + int x = get_unaligned_be16(&data[offset + 3]) & 0x7ff; + int y = get_unaligned_be16(&data[offset + 5]) & 0x7ff; + if (features->quirks & WACOM_QUIRK_BBTOUCH_LOWRES) { + x <<= 5; + y <<= 5; + } + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); + } + } + + input_mt_report_pointer_emulation(input, true); + + input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); + input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0); + input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0); + input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0); + + input_sync(input); + + return 0; +} + +static void wacom_bpt3_touch_msg(struct wacom_wac *wacom, unsigned char *data) +{ + struct input_dev *input = wacom->input; + bool touch = data[1] & 0x80; + int slot = input_mt_get_slot_by_key(input, data[0]); + + if (slot < 0) + return; + + touch = touch && !wacom->shared->stylus_in_proximity; + + input_mt_slot(input, slot); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); + + if (touch) { + int x = (data[2] << 4) | (data[4] >> 4); + int y = (data[3] << 4) | (data[4] & 0x0f); + int a = data[5]; + + // "a" is a scaled-down area which we assume is roughly + // circular and which can be described as: a=(pi*r^2)/C. + int x_res = input_abs_get_res(input, ABS_X); + int y_res = input_abs_get_res(input, ABS_Y); + int width = 2 * int_sqrt(a * WACOM_CONTACT_AREA_SCALE); + int height = width * y_res / x_res; + + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); + input_report_abs(input, ABS_MT_TOUCH_MAJOR, width); + input_report_abs(input, ABS_MT_TOUCH_MINOR, height); + } +} + +static void wacom_bpt3_button_msg(struct wacom_wac *wacom, unsigned char *data) +{ + struct input_dev *input = wacom->input; + + input_report_key(input, BTN_LEFT, (data[1] & 0x08) != 0); + input_report_key(input, BTN_FORWARD, (data[1] & 0x04) != 0); + input_report_key(input, BTN_BACK, (data[1] & 0x02) != 0); + input_report_key(input, BTN_RIGHT, (data[1] & 0x01) != 0); +} + +static int wacom_bpt3_touch(struct wacom_wac *wacom) +{ + struct input_dev *input = wacom->input; + unsigned char *data = wacom->data; + int count = data[1] & 0x07; + int i; + + if (data[0] != 0x02) + return 0; + + /* data has up to 7 fixed sized 8-byte messages starting at data[2] */ + for (i = 0; i < count; i++) { + int offset = (8 * i) + 2; + int msg_id = data[offset]; + + if (msg_id >= 2 && msg_id <= 17) + wacom_bpt3_touch_msg(wacom, data + offset); + else if (msg_id == 128) + wacom_bpt3_button_msg(wacom, data + offset); + + } + input_mt_report_pointer_emulation(input, true); + + input_sync(input); + + return 0; +} + +static int wacom_bpt_pen(struct wacom_wac *wacom) +{ + struct input_dev *input = wacom->input; + unsigned char *data = wacom->data; + int prox = 0, x = 0, y = 0, p = 0, d = 0, pen = 0, btn1 = 0, btn2 = 0; + + if (data[0] != 0x02) + return 0; + + prox = (data[1] & 0x20) == 0x20; + + /* + * All reports shared between PEN and RUBBER tool must be + * forced to a known starting value (zero) when transitioning to + * out-of-prox. + * + * If not reset then, to userspace, it will look like lost events + * if new tool comes in-prox with same values as previous tool sent. + * + * Hardware does report zero in most out-of-prox cases but not all. + */ + if (prox) { + if (!wacom->shared->stylus_in_proximity) { + if (data[1] & 0x08) { + wacom->tool[0] = BTN_TOOL_RUBBER; + wacom->id[0] = ERASER_DEVICE_ID; + } else { + wacom->tool[0] = BTN_TOOL_PEN; + wacom->id[0] = STYLUS_DEVICE_ID; + } + wacom->shared->stylus_in_proximity = true; + } + x = le16_to_cpup((__le16 *)&data[2]); + y = le16_to_cpup((__le16 *)&data[4]); + p = le16_to_cpup((__le16 *)&data[6]); + /* + * Convert distance from out prox to distance from tablet. + * distance will be greater than distance_max once + * touching and applying pressure; do not report negative + * distance. + */ + if (data[8] <= wacom->features.distance_max) + d = wacom->features.distance_max - data[8]; + + pen = data[1] & 0x01; + btn1 = data[1] & 0x02; + btn2 = data[1] & 0x04; + } + + input_report_key(input, BTN_TOUCH, pen); + input_report_key(input, BTN_STYLUS, btn1); + input_report_key(input, BTN_STYLUS2, btn2); + + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + input_report_abs(input, ABS_PRESSURE, p); + input_report_abs(input, ABS_DISTANCE, d); + + if (!prox) { + wacom->id[0] = 0; + wacom->shared->stylus_in_proximity = false; + } + + input_report_key(input, wacom->tool[0], prox); /* PEN or RUBBER */ + input_report_abs(input, ABS_MISC, wacom->id[0]); /* TOOL ID */ + + return 1; +} + +static int wacom_bpt_irq(struct wacom_wac *wacom, size_t len) +{ + if (len == WACOM_PKGLEN_BBTOUCH) + return wacom_bpt_touch(wacom); + else if (len == WACOM_PKGLEN_BBTOUCH3) + return wacom_bpt3_touch(wacom); + else if (len == WACOM_PKGLEN_BBFUN || len == WACOM_PKGLEN_BBPEN) + return wacom_bpt_pen(wacom); + + return 0; +} + +static int wacom_wireless_irq(struct wacom_wac *wacom, size_t len) +{ + unsigned char *data = wacom->data; + int connected; + + if (len != WACOM_PKGLEN_WIRELESS || data[0] != 0x80) + return 0; + + connected = data[1] & 0x01; + if (connected) { + int pid, battery; + + pid = get_unaligned_be16(&data[6]); + battery = data[5] & 0x3f; + if (wacom->pid != pid) { + wacom->pid = pid; + wacom_schedule_work(wacom); + } + wacom->battery_capacity = battery; + } else if (wacom->pid != 0) { + /* disconnected while previously connected */ + wacom->pid = 0; + wacom_schedule_work(wacom); + wacom->battery_capacity = 0; + } + + return 0; +} + +void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) +{ + bool sync; + + switch (wacom_wac->features.type) { + case PENPARTNER: + sync = wacom_penpartner_irq(wacom_wac); + break; + + case PL: + sync = wacom_pl_irq(wacom_wac); + break; + + case WACOM_G4: + case GRAPHIRE: + case WACOM_MO: + sync = wacom_graphire_irq(wacom_wac); + break; + + case PTU: + sync = wacom_ptu_irq(wacom_wac); + break; + + case DTU: + sync = wacom_dtu_irq(wacom_wac); + break; + + case INTUOS: + case INTUOS3S: + case INTUOS3: + case INTUOS3L: + case INTUOS4S: + case INTUOS4: + case INTUOS4L: + case CINTIQ: + case WACOM_BEE: + case WACOM_13HD: + case WACOM_21UX2: + case WACOM_22HD: + case WACOM_24HD: + case DTK: + sync = wacom_intuos_irq(wacom_wac); + break; + + case WACOM_24HDT: + sync = wacom_24hdt_irq(wacom_wac); + break; + + case INTUOS5S: + case INTUOS5: + case INTUOS5L: + if (len == WACOM_PKGLEN_BBTOUCH3) + sync = wacom_bpt3_touch(wacom_wac); + else + sync = wacom_intuos_irq(wacom_wac); + break; + + case TABLETPC: + case TABLETPCE: + case TABLETPC2FG: + case MTSCREEN: + case MTTPC: + sync = wacom_tpc_irq(wacom_wac, len); + break; + + case BAMBOO_PT: + sync = wacom_bpt_irq(wacom_wac, len); + break; + + case WIRELESS: + sync = wacom_wireless_irq(wacom_wac, len); + break; + + default: + sync = false; + break; + } + + if (sync) + input_sync(wacom_wac->input); +} + +static void wacom_setup_cintiq(struct wacom_wac *wacom_wac) +{ + struct input_dev *input_dev = wacom_wac->input; + + input_set_capability(input_dev, EV_MSC, MSC_SERIAL); + + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); + __set_bit(BTN_TOOL_PEN, input_dev->keybit); + __set_bit(BTN_TOOL_BRUSH, input_dev->keybit); + __set_bit(BTN_TOOL_PENCIL, input_dev->keybit); + __set_bit(BTN_TOOL_AIRBRUSH, input_dev->keybit); + __set_bit(BTN_STYLUS, input_dev->keybit); + __set_bit(BTN_STYLUS2, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_DISTANCE, + 0, wacom_wac->features.distance_max, 0, 0); + input_set_abs_params(input_dev, ABS_WHEEL, 0, 1023, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_X, 0, 127, 0, 0); + input_set_abs_params(input_dev, ABS_TILT_Y, 0, 127, 0, 0); +} + +static void wacom_setup_intuos(struct wacom_wac *wacom_wac) +{ + struct input_dev *input_dev = wacom_wac->input; + + input_set_capability(input_dev, EV_REL, REL_WHEEL); + + wacom_setup_cintiq(wacom_wac); + + __set_bit(BTN_LEFT, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + __set_bit(BTN_MIDDLE, input_dev->keybit); + __set_bit(BTN_SIDE, input_dev->keybit); + __set_bit(BTN_EXTRA, input_dev->keybit); + __set_bit(BTN_TOOL_MOUSE, input_dev->keybit); + __set_bit(BTN_TOOL_LENS, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_RZ, -900, 899, 0, 0); + input_set_abs_params(input_dev, ABS_THROTTLE, -1023, 1023, 0, 0); +} + +void wacom_setup_device_quirks(struct wacom_features *features) +{ + + /* touch device found but size is not defined. use default */ + if (features->device_type == BTN_TOOL_FINGER && !features->x_max) { + features->x_max = 1023; + features->y_max = 1023; + } + + /* these device have multiple inputs */ + if (features->type >= WIRELESS || + (features->type >= INTUOS5S && features->type <= INTUOS5L) || + (features->oVid && features->oPid)) + features->quirks |= WACOM_QUIRK_MULTI_INPUT; + + /* quirk for bamboo touch with 2 low res touches */ + if (features->type == BAMBOO_PT && + features->pktlen == WACOM_PKGLEN_BBTOUCH) { + features->x_max <<= 5; + features->y_max <<= 5; + features->x_fuzz <<= 5; + features->y_fuzz <<= 5; + features->quirks |= WACOM_QUIRK_BBTOUCH_LOWRES; + } + + if (features->type == WIRELESS) { + + /* monitor never has input and pen/touch have delayed create */ + features->quirks |= WACOM_QUIRK_NO_INPUT; + + /* must be monitor interface if no device_type set */ + if (!features->device_type) + features->quirks |= WACOM_QUIRK_MONITOR; + } +} + +static unsigned int wacom_calculate_touch_res(unsigned int logical_max, + unsigned int physical_max) +{ + /* Touch physical dimensions are in 100th of mm */ + return (logical_max * 100) / physical_max; +} + +static void wacom_abs_set_axis(struct input_dev *input_dev, + struct wacom_wac *wacom_wac) +{ + struct wacom_features *features = &wacom_wac->features; + + if (features->device_type == BTN_TOOL_PEN) { + input_set_abs_params(input_dev, ABS_X, 0, features->x_max, + features->x_fuzz, 0); + input_set_abs_params(input_dev, ABS_Y, 0, features->y_max, + features->y_fuzz, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, + features->pressure_max, features->pressure_fuzz, 0); + + /* penabled devices have fixed resolution for each model */ + input_abs_set_res(input_dev, ABS_X, features->x_resolution); + input_abs_set_res(input_dev, ABS_Y, features->y_resolution); + } else { + if (features->touch_max <= 2) { + input_set_abs_params(input_dev, ABS_X, 0, + features->x_max, features->x_fuzz, 0); + input_set_abs_params(input_dev, ABS_Y, 0, + features->y_max, features->y_fuzz, 0); + input_abs_set_res(input_dev, ABS_X, + wacom_calculate_touch_res(features->x_max, + features->x_phy)); + input_abs_set_res(input_dev, ABS_Y, + wacom_calculate_touch_res(features->y_max, + features->y_phy)); + } + + if (features->touch_max > 1) { + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, + features->x_max, features->x_fuzz, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, + features->y_max, features->y_fuzz, 0); + input_abs_set_res(input_dev, ABS_MT_POSITION_X, + wacom_calculate_touch_res(features->x_max, + features->x_phy)); + input_abs_set_res(input_dev, ABS_MT_POSITION_Y, + wacom_calculate_touch_res(features->y_max, + features->y_phy)); + } + } +} + +int wacom_setup_input_capabilities(struct input_dev *input_dev, + struct wacom_wac *wacom_wac) +{ + struct wacom_features *features = &wacom_wac->features; + int i; + + input_dev->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(ABS_MISC, input_dev->absbit); + + wacom_abs_set_axis(input_dev, wacom_wac); + + switch (wacom_wac->features.type) { + case WACOM_MO: + input_set_abs_params(input_dev, ABS_WHEEL, 0, 71, 0, 0); + /* fall through */ + + case WACOM_G4: + input_set_capability(input_dev, EV_MSC, MSC_SERIAL); + + __set_bit(BTN_BACK, input_dev->keybit); + __set_bit(BTN_FORWARD, input_dev->keybit); + /* fall through */ + + case GRAPHIRE: + input_set_capability(input_dev, EV_REL, REL_WHEEL); + + __set_bit(BTN_LEFT, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + __set_bit(BTN_MIDDLE, input_dev->keybit); + + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); + __set_bit(BTN_TOOL_PEN, input_dev->keybit); + __set_bit(BTN_TOOL_MOUSE, input_dev->keybit); + __set_bit(BTN_STYLUS, input_dev->keybit); + __set_bit(BTN_STYLUS2, input_dev->keybit); + + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + break; + + case WACOM_24HD: + __set_bit(BTN_A, input_dev->keybit); + __set_bit(BTN_B, input_dev->keybit); + __set_bit(BTN_C, input_dev->keybit); + __set_bit(BTN_X, input_dev->keybit); + __set_bit(BTN_Y, input_dev->keybit); + __set_bit(BTN_Z, input_dev->keybit); + + for (i = 6; i < 10; i++) + __set_bit(BTN_0 + i, input_dev->keybit); + + __set_bit(KEY_PROG1, input_dev->keybit); + __set_bit(KEY_PROG2, input_dev->keybit); + __set_bit(KEY_PROG3, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + input_set_abs_params(input_dev, ABS_THROTTLE, 0, 71, 0, 0); + /* fall through */ + + case DTK: + for (i = 0; i < 6; i++) + __set_bit(BTN_0 + i, input_dev->keybit); + + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + wacom_setup_cintiq(wacom_wac); + break; + + case WACOM_22HD: + __set_bit(KEY_PROG1, input_dev->keybit); + __set_bit(KEY_PROG2, input_dev->keybit); + __set_bit(KEY_PROG3, input_dev->keybit); + /* fall through */ + + case WACOM_21UX2: + __set_bit(BTN_A, input_dev->keybit); + __set_bit(BTN_B, input_dev->keybit); + __set_bit(BTN_C, input_dev->keybit); + __set_bit(BTN_X, input_dev->keybit); + __set_bit(BTN_Y, input_dev->keybit); + __set_bit(BTN_Z, input_dev->keybit); + __set_bit(BTN_BASE, input_dev->keybit); + __set_bit(BTN_BASE2, input_dev->keybit); + /* fall through */ + + case WACOM_BEE: + __set_bit(BTN_8, input_dev->keybit); + __set_bit(BTN_9, input_dev->keybit); + /* fall through */ + + case CINTIQ: + for (i = 0; i < 8; i++) + __set_bit(BTN_0 + i, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); + input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + wacom_setup_cintiq(wacom_wac); + break; + + case WACOM_13HD: + for (i = 0; i < 9; i++) + __set_bit(BTN_0 + i, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + wacom_setup_cintiq(wacom_wac); + break; + + case INTUOS3: + case INTUOS3L: + __set_bit(BTN_4, input_dev->keybit); + __set_bit(BTN_5, input_dev->keybit); + __set_bit(BTN_6, input_dev->keybit); + __set_bit(BTN_7, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_RY, 0, 4096, 0, 0); + /* fall through */ + + case INTUOS3S: + __set_bit(BTN_0, input_dev->keybit); + __set_bit(BTN_1, input_dev->keybit); + __set_bit(BTN_2, input_dev->keybit); + __set_bit(BTN_3, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_RX, 0, 4096, 0, 0); + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + /* fall through */ + + case INTUOS: + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + + wacom_setup_intuos(wacom_wac); + break; + + case INTUOS5: + case INTUOS5L: + if (features->device_type == BTN_TOOL_PEN) { + __set_bit(BTN_7, input_dev->keybit); + __set_bit(BTN_8, input_dev->keybit); + } + /* fall through */ + + case INTUOS5S: + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + + if (features->device_type == BTN_TOOL_PEN) { + for (i = 0; i < 7; i++) + __set_bit(BTN_0 + i, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_DISTANCE, 0, + features->distance_max, + 0, 0); + + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + + wacom_setup_intuos(wacom_wac); + } else if (features->device_type == BTN_TOOL_FINGER) { + __clear_bit(ABS_MISC, input_dev->absbit); + + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, + 0, features->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, + 0, features->y_max, 0, 0); + input_mt_init_slots(input_dev, features->touch_max, INPUT_MT_POINTER); + } + break; + + case INTUOS4: + case INTUOS4L: + __set_bit(BTN_7, input_dev->keybit); + __set_bit(BTN_8, input_dev->keybit); + /* fall through */ + + case INTUOS4S: + for (i = 0; i < 7; i++) + __set_bit(BTN_0 + i, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_Z, -900, 899, 0, 0); + wacom_setup_intuos(wacom_wac); + + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + break; + + case WACOM_24HDT: + if (features->device_type == BTN_TOOL_FINGER) { + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, features->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, features->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_WIDTH_MINOR, 0, features->y_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0); + } + /* fall through */ + + case MTSCREEN: + case MTTPC: + case TABLETPC2FG: + if (features->device_type == BTN_TOOL_FINGER) { + unsigned int flags = INPUT_MT_DIRECT; + + if (wacom_wac->features.type == TABLETPC2FG) + flags = 0; + + input_mt_init_slots(input_dev, features->touch_max, flags); + } + /* fall through */ + + case TABLETPC: + case TABLETPCE: + __clear_bit(ABS_MISC, input_dev->absbit); + + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + if (features->device_type != BTN_TOOL_PEN) + break; /* no need to process stylus stuff */ + + /* fall through */ + + case PL: + case DTU: + __set_bit(BTN_TOOL_PEN, input_dev->keybit); + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); + __set_bit(BTN_STYLUS, input_dev->keybit); + __set_bit(BTN_STYLUS2, input_dev->keybit); + + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + break; + + case PTU: + __set_bit(BTN_STYLUS2, input_dev->keybit); + /* fall through */ + + case PENPARTNER: + __set_bit(BTN_TOOL_PEN, input_dev->keybit); + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); + __set_bit(BTN_STYLUS, input_dev->keybit); + + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + break; + + case BAMBOO_PT: + __clear_bit(ABS_MISC, input_dev->absbit); + + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + + if (features->device_type == BTN_TOOL_FINGER) { + unsigned int flags = INPUT_MT_POINTER; + + __set_bit(BTN_LEFT, input_dev->keybit); + __set_bit(BTN_FORWARD, input_dev->keybit); + __set_bit(BTN_BACK, input_dev->keybit); + __set_bit(BTN_RIGHT, input_dev->keybit); + + if (features->pktlen == WACOM_PKGLEN_BBTOUCH3) { + input_set_abs_params(input_dev, + ABS_MT_TOUCH_MAJOR, + 0, features->x_max, 0, 0); + input_set_abs_params(input_dev, + ABS_MT_TOUCH_MINOR, + 0, features->y_max, 0, 0); + } else { + __set_bit(BTN_TOOL_FINGER, input_dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); + flags = 0; + } + input_mt_init_slots(input_dev, features->touch_max, flags); + } else if (features->device_type == BTN_TOOL_PEN) { + __set_bit(BTN_TOOL_RUBBER, input_dev->keybit); + __set_bit(BTN_TOOL_PEN, input_dev->keybit); + __set_bit(BTN_STYLUS, input_dev->keybit); + __set_bit(BTN_STYLUS2, input_dev->keybit); + input_set_abs_params(input_dev, ABS_DISTANCE, 0, + features->distance_max, + 0, 0); + } + break; + } + return 0; +} + +static const struct wacom_features wacom_features_0x00 = + { "Wacom Penpartner", WACOM_PKGLEN_PENPRTN, 5040, 3780, 255, + 0, PENPARTNER, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; +static const struct wacom_features wacom_features_0x10 = + { "Wacom Graphire", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, + 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x11 = + { "Wacom Graphire2 4x5", WACOM_PKGLEN_GRAPHIRE, 10206, 7422, 511, + 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x12 = + { "Wacom Graphire2 5x7", WACOM_PKGLEN_GRAPHIRE, 13918, 10206, 511, + 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x13 = + { "Wacom Graphire3", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, + 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x14 = + { "Wacom Graphire3 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, + 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x15 = + { "Wacom Graphire4 4x5", WACOM_PKGLEN_GRAPHIRE, 10208, 7424, 511, + 63, WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x16 = + { "Wacom Graphire4 6x8", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, + 63, WACOM_G4, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x17 = + { "Wacom BambooFun 4x5", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, + 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x18 = + { "Wacom BambooFun 6x8", WACOM_PKGLEN_BBFUN, 21648, 13530, 511, + 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x19 = + { "Wacom Bamboo1 Medium", WACOM_PKGLEN_GRAPHIRE, 16704, 12064, 511, + 63, GRAPHIRE, WACOM_GRAPHIRE_RES, WACOM_GRAPHIRE_RES }; +static const struct wacom_features wacom_features_0x60 = + { "Wacom Volito", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, + 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; +static const struct wacom_features wacom_features_0x61 = + { "Wacom PenStation2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 255, + 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; +static const struct wacom_features wacom_features_0x62 = + { "Wacom Volito2 4x5", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, + 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; +static const struct wacom_features wacom_features_0x63 = + { "Wacom Volito2 2x3", WACOM_PKGLEN_GRAPHIRE, 3248, 2320, 511, + 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; +static const struct wacom_features wacom_features_0x64 = + { "Wacom PenPartner2", WACOM_PKGLEN_GRAPHIRE, 3250, 2320, 511, + 63, GRAPHIRE, WACOM_VOLITO_RES, WACOM_VOLITO_RES }; +static const struct wacom_features wacom_features_0x65 = + { "Wacom Bamboo", WACOM_PKGLEN_BBFUN, 14760, 9225, 511, + 63, WACOM_MO, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x69 = + { "Wacom Bamboo1", WACOM_PKGLEN_GRAPHIRE, 5104, 3712, 511, + 63, GRAPHIRE, WACOM_PENPRTN_RES, WACOM_PENPRTN_RES }; +static const struct wacom_features wacom_features_0x6A = + { "Wacom Bamboo1 4x6", WACOM_PKGLEN_GRAPHIRE, 14760, 9225, 1023, + 63, GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x6B = + { "Wacom Bamboo1 5x8", WACOM_PKGLEN_GRAPHIRE, 21648, 13530, 1023, + 63, GRAPHIRE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x20 = + { "Wacom Intuos 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x21 = + { "Wacom Intuos 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x22 = + { "Wacom Intuos 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x23 = + { "Wacom Intuos 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x24 = + { "Wacom Intuos 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x30 = + { "Wacom PL400", WACOM_PKGLEN_GRAPHIRE, 5408, 4056, 255, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x31 = + { "Wacom PL500", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 255, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x32 = + { "Wacom PL600", WACOM_PKGLEN_GRAPHIRE, 6126, 4604, 255, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x33 = + { "Wacom PL600SX", WACOM_PKGLEN_GRAPHIRE, 6260, 5016, 255, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x34 = + { "Wacom PL550", WACOM_PKGLEN_GRAPHIRE, 6144, 4608, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x35 = + { "Wacom PL800", WACOM_PKGLEN_GRAPHIRE, 7220, 5780, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x37 = + { "Wacom PL700", WACOM_PKGLEN_GRAPHIRE, 6758, 5406, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x38 = + { "Wacom PL510", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x39 = + { "Wacom DTU710", WACOM_PKGLEN_GRAPHIRE, 34080, 27660, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0xC4 = + { "Wacom DTF521", WACOM_PKGLEN_GRAPHIRE, 6282, 4762, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0xC0 = + { "Wacom DTF720", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0xC2 = + { "Wacom DTF720a", WACOM_PKGLEN_GRAPHIRE, 6858, 5506, 511, + 0, PL, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x03 = + { "Wacom Cintiq Partner", WACOM_PKGLEN_GRAPHIRE, 20480, 15360, 511, + 0, PTU, WACOM_PL_RES, WACOM_PL_RES }; +static const struct wacom_features wacom_features_0x41 = + { "Wacom Intuos2 4x5", WACOM_PKGLEN_INTUOS, 12700, 10600, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x42 = + { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x43 = + { "Wacom Intuos2 9x12", WACOM_PKGLEN_INTUOS, 30480, 24060, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x44 = + { "Wacom Intuos2 12x12", WACOM_PKGLEN_INTUOS, 30480, 31680, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x45 = + { "Wacom Intuos2 12x18", WACOM_PKGLEN_INTUOS, 45720, 31680, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xB0 = + { "Wacom Intuos3 4x5", WACOM_PKGLEN_INTUOS, 25400, 20320, 1023, + 63, INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB1 = + { "Wacom Intuos3 6x8", WACOM_PKGLEN_INTUOS, 40640, 30480, 1023, + 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB2 = + { "Wacom Intuos3 9x12", WACOM_PKGLEN_INTUOS, 60960, 45720, 1023, + 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB3 = + { "Wacom Intuos3 12x12", WACOM_PKGLEN_INTUOS, 60960, 60960, 1023, + 63, INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB4 = + { "Wacom Intuos3 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 1023, + 63, INTUOS3L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB5 = + { "Wacom Intuos3 6x11", WACOM_PKGLEN_INTUOS, 54204, 31750, 1023, + 63, INTUOS3, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB7 = + { "Wacom Intuos3 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 1023, + 63, INTUOS3S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB8 = + { "Wacom Intuos4 4x6", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, + 63, INTUOS4S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xB9 = + { "Wacom Intuos4 6x9", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, + 63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xBA = + { "Wacom Intuos4 8x13", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, + 63, INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xBB = + { "Wacom Intuos4 12x19", WACOM_PKGLEN_INTUOS, 97536, 60960, 2047, + 63, INTUOS4L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xBC = + { "Wacom Intuos4 WL", WACOM_PKGLEN_INTUOS, 40640, 25400, 2047, + 63, INTUOS4, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0x26 = + { "Wacom Intuos5 touch S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, + 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, + .touch_max = 16 }; +static const struct wacom_features wacom_features_0x27 = + { "Wacom Intuos5 touch M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, + 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, + .touch_max = 16 }; +static const struct wacom_features wacom_features_0x28 = + { "Wacom Intuos5 touch L", WACOM_PKGLEN_INTUOS, 65024, 40640, 2047, + 63, INTUOS5L, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, + .touch_max = 16 }; +static const struct wacom_features wacom_features_0x29 = + { "Wacom Intuos5 S", WACOM_PKGLEN_INTUOS, 31496, 19685, 2047, + 63, INTUOS5S, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0x2A = + { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, + 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xF4 = + { "Wacom Cintiq 24HD", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, + 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xF8 = + { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, /* Pen */ + 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 }; +static const struct wacom_features wacom_features_0xF6 = + { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */ + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 }; +static const struct wacom_features wacom_features_0x3F = + { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, + 63, CINTIQ, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xC5 = + { "Wacom Cintiq 20WSX", WACOM_PKGLEN_INTUOS, 86680, 54180, 1023, + 63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xC6 = + { "Wacom Cintiq 12WX", WACOM_PKGLEN_INTUOS, 53020, 33440, 1023, + 63, WACOM_BEE, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0x304 = + { "Wacom Cintiq 13HD", WACOM_PKGLEN_INTUOS, 59552, 33848, 1023, + 63, WACOM_13HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xC7 = + { "Wacom DTU1931", WACOM_PKGLEN_GRAPHIRE, 37832, 30305, 511, + 0, PL, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xCE = + { "Wacom DTU2231", WACOM_PKGLEN_GRAPHIRE, 47864, 27011, 511, + 0, DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xF0 = + { "Wacom DTU1631", WACOM_PKGLEN_GRAPHIRE, 34623, 19553, 511, + 0, DTU, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x57 = + { "Wacom DTK2241", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, + 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES}; +static const struct wacom_features wacom_features_0x59 = /* Pen */ + { "Wacom DTH2242", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, + 63, DTK, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5D }; +static const struct wacom_features wacom_features_0x5D = /* Touch */ + { "Wacom DTH2242", .type = WACOM_24HDT, + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x59, .touch_max = 10 }; +static const struct wacom_features wacom_features_0xCC = + { "Wacom Cintiq 21UX2", WACOM_PKGLEN_INTUOS, 87200, 65600, 2047, + 63, WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0xFA = + { "Wacom Cintiq 22HD", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, + 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; +static const struct wacom_features wacom_features_0x5B = + { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, + 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e }; +static const struct wacom_features wacom_features_0x5E = + { "Wacom Cintiq 22HDT", .type = WACOM_24HDT, + .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 }; +static const struct wacom_features wacom_features_0x90 = + { "Wacom ISDv4 90", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x93 = + { "Wacom ISDv4 93", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x97 = + { "Wacom ISDv4 97", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 511, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x9A = + { "Wacom ISDv4 9A", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x9F = + { "Wacom ISDv4 9F", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xE2 = + { "Wacom ISDv4 E2", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, + 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xE3 = + { "Wacom ISDv4 E3", WACOM_PKGLEN_TPC2FG, 26202, 16325, 255, + 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xE5 = + { "Wacom ISDv4 E5", WACOM_PKGLEN_MTOUCH, 26202, 16325, 255, + 0, MTSCREEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xE6 = + { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255, + 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xEC = + { "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xED = + { "Wacom ISDv4 ED", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, + 0, TABLETPCE, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xEF = + { "Wacom ISDv4 EF", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x100 = + { "Wacom ISDv4 100", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, + 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x101 = + { "Wacom ISDv4 101", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, + 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x10D = + { "Wacom ISDv4 10D", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, + 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x4001 = + { "Wacom ISDv4 4001", WACOM_PKGLEN_MTTPC, 26202, 16325, 255, + 0, MTTPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x47 = + { "Wacom Intuos2 6x8", WACOM_PKGLEN_INTUOS, 20320, 16240, 1023, + 31, INTUOS, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0x84 = + { "Wacom Wireless Receiver", WACOM_PKGLEN_WIRELESS, 0, 0, 0, + 0, WIRELESS, 0, 0, .touch_max = 16 }; +static const struct wacom_features wacom_features_0xD0 = + { "Wacom Bamboo 2FG", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xD1 = + { "Wacom Bamboo 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xD2 = + { "Wacom Bamboo Craft", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xD3 = + { "Wacom Bamboo 2FG 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xD4 = + { "Wacom Bamboo Pen", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xD5 = + { "Wacom Bamboo Pen 6x8", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xD6 = + { "Wacom BambooPT 2FG 4x5", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xD7 = + { "Wacom BambooPT 2FG Small", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xD8 = + { "Wacom Bamboo Comic 2FG", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xDA = + { "Wacom Bamboo 2FG 4x5 SE", WACOM_PKGLEN_BBFUN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static struct wacom_features wacom_features_0xDB = + { "Wacom Bamboo 2FG 6x8 SE", WACOM_PKGLEN_BBFUN, 21648, 13700, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 2 }; +static const struct wacom_features wacom_features_0xDD = + { "Wacom Bamboo Connect", WACOM_PKGLEN_BBPEN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; +static const struct wacom_features wacom_features_0xDE = + { "Wacom Bamboo 16FG 4x5", WACOM_PKGLEN_BBPEN, 14720, 9200, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 16 }; +static const struct wacom_features wacom_features_0xDF = + { "Wacom Bamboo 16FG 6x8", WACOM_PKGLEN_BBPEN, 21648, 13700, 1023, + 31, BAMBOO_PT, WACOM_INTUOS_RES, WACOM_INTUOS_RES, + .touch_max = 16 }; +static const struct wacom_features wacom_features_0x6004 = + { "ISD-V4", WACOM_PKGLEN_GRAPHIRE, 12800, 8000, 255, + 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; + +#define USB_DEVICE_WACOM(prod) \ + USB_DEVICE(USB_VENDOR_ID_WACOM, prod), \ + .driver_info = (kernel_ulong_t)&wacom_features_##prod + +#define USB_DEVICE_DETAILED(prod, class, sub, proto) \ + USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_WACOM, prod, class, \ + sub, proto), \ + .driver_info = (kernel_ulong_t)&wacom_features_##prod + +#define USB_DEVICE_LENOVO(prod) \ + USB_DEVICE(USB_VENDOR_ID_LENOVO, prod), \ + .driver_info = (kernel_ulong_t)&wacom_features_##prod + +const struct usb_device_id wacom_ids[] = { + { USB_DEVICE_WACOM(0x00) }, + { USB_DEVICE_WACOM(0x10) }, + { USB_DEVICE_WACOM(0x11) }, + { USB_DEVICE_WACOM(0x12) }, + { USB_DEVICE_WACOM(0x13) }, + { USB_DEVICE_WACOM(0x14) }, + { USB_DEVICE_WACOM(0x15) }, + { USB_DEVICE_WACOM(0x16) }, + { USB_DEVICE_WACOM(0x17) }, + { USB_DEVICE_WACOM(0x18) }, + { USB_DEVICE_WACOM(0x19) }, + { USB_DEVICE_WACOM(0x60) }, + { USB_DEVICE_WACOM(0x61) }, + { USB_DEVICE_WACOM(0x62) }, + { USB_DEVICE_WACOM(0x63) }, + { USB_DEVICE_WACOM(0x64) }, + { USB_DEVICE_WACOM(0x65) }, + { USB_DEVICE_WACOM(0x69) }, + { USB_DEVICE_WACOM(0x6A) }, + { USB_DEVICE_WACOM(0x6B) }, + { USB_DEVICE_WACOM(0x20) }, + { USB_DEVICE_WACOM(0x21) }, + { USB_DEVICE_WACOM(0x22) }, + { USB_DEVICE_WACOM(0x23) }, + { USB_DEVICE_WACOM(0x24) }, + { USB_DEVICE_WACOM(0x30) }, + { USB_DEVICE_WACOM(0x31) }, + { USB_DEVICE_WACOM(0x32) }, + { USB_DEVICE_WACOM(0x33) }, + { USB_DEVICE_WACOM(0x34) }, + { USB_DEVICE_WACOM(0x35) }, + { USB_DEVICE_WACOM(0x37) }, + { USB_DEVICE_WACOM(0x38) }, + { USB_DEVICE_WACOM(0x39) }, + { USB_DEVICE_WACOM(0xC4) }, + { USB_DEVICE_WACOM(0xC0) }, + { USB_DEVICE_WACOM(0xC2) }, + { USB_DEVICE_WACOM(0x03) }, + { USB_DEVICE_WACOM(0x41) }, + { USB_DEVICE_WACOM(0x42) }, + { USB_DEVICE_WACOM(0x43) }, + { USB_DEVICE_WACOM(0x44) }, + { USB_DEVICE_WACOM(0x45) }, + { USB_DEVICE_WACOM(0x57) }, + { USB_DEVICE_WACOM(0x59) }, + { USB_DEVICE_DETAILED(0x5D, USB_CLASS_HID, 0, 0) }, + { USB_DEVICE_WACOM(0x5B) }, + { USB_DEVICE_DETAILED(0x5E, USB_CLASS_HID, 0, 0) }, + { USB_DEVICE_WACOM(0xB0) }, + { USB_DEVICE_WACOM(0xB1) }, + { USB_DEVICE_WACOM(0xB2) }, + { USB_DEVICE_WACOM(0xB3) }, + { USB_DEVICE_WACOM(0xB4) }, + { USB_DEVICE_WACOM(0xB5) }, + { USB_DEVICE_WACOM(0xB7) }, + { USB_DEVICE_WACOM(0xB8) }, + { USB_DEVICE_WACOM(0xB9) }, + { USB_DEVICE_WACOM(0xBA) }, + { USB_DEVICE_WACOM(0xBB) }, + { USB_DEVICE_WACOM(0xBC) }, + { USB_DEVICE_WACOM(0x26) }, + { USB_DEVICE_WACOM(0x27) }, + { USB_DEVICE_WACOM(0x28) }, + { USB_DEVICE_WACOM(0x29) }, + { USB_DEVICE_WACOM(0x2A) }, + { USB_DEVICE_WACOM(0x3F) }, + { USB_DEVICE_WACOM(0xC5) }, + { USB_DEVICE_WACOM(0xC6) }, + { USB_DEVICE_WACOM(0xC7) }, + /* + * DTU-2231 has two interfaces on the same configuration, + * only one is used. + */ + { USB_DEVICE_DETAILED(0xCE, USB_CLASS_HID, + USB_INTERFACE_SUBCLASS_BOOT, + USB_INTERFACE_PROTOCOL_MOUSE) }, + { USB_DEVICE_WACOM(0x84) }, + { USB_DEVICE_WACOM(0xD0) }, + { USB_DEVICE_WACOM(0xD1) }, + { USB_DEVICE_WACOM(0xD2) }, + { USB_DEVICE_WACOM(0xD3) }, + { USB_DEVICE_WACOM(0xD4) }, + { USB_DEVICE_WACOM(0xD5) }, + { USB_DEVICE_WACOM(0xD6) }, + { USB_DEVICE_WACOM(0xD7) }, + { USB_DEVICE_WACOM(0xD8) }, + { USB_DEVICE_WACOM(0xDA) }, + { USB_DEVICE_WACOM(0xDB) }, + { USB_DEVICE_WACOM(0xDD) }, + { USB_DEVICE_WACOM(0xDE) }, + { USB_DEVICE_WACOM(0xDF) }, + { USB_DEVICE_WACOM(0xF0) }, + { USB_DEVICE_WACOM(0xCC) }, + { USB_DEVICE_WACOM(0x90) }, + { USB_DEVICE_WACOM(0x93) }, + { USB_DEVICE_WACOM(0x97) }, + { USB_DEVICE_WACOM(0x9A) }, + { USB_DEVICE_WACOM(0x9F) }, + { USB_DEVICE_WACOM(0xE2) }, + { USB_DEVICE_WACOM(0xE3) }, + { USB_DEVICE_WACOM(0xE5) }, + { USB_DEVICE_WACOM(0xE6) }, + { USB_DEVICE_WACOM(0xEC) }, + { USB_DEVICE_WACOM(0xED) }, + { USB_DEVICE_WACOM(0xEF) }, + { USB_DEVICE_WACOM(0x100) }, + { USB_DEVICE_WACOM(0x101) }, + { USB_DEVICE_WACOM(0x10D) }, + { USB_DEVICE_WACOM(0x304) }, + { USB_DEVICE_WACOM(0x4001) }, + { USB_DEVICE_WACOM(0x47) }, + { USB_DEVICE_WACOM(0xF4) }, + { USB_DEVICE_WACOM(0xF8) }, + { USB_DEVICE_DETAILED(0xF6, USB_CLASS_HID, 0, 0) }, + { USB_DEVICE_WACOM(0xFA) }, + { USB_DEVICE_LENOVO(0x6004) }, + { } +}; +MODULE_DEVICE_TABLE(usb, wacom_ids); diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h new file mode 100644 index 00000000..dfc9e08e --- /dev/null +++ b/drivers/input/tablet/wacom_wac.h @@ -0,0 +1,142 @@ +/* + * drivers/input/tablet/wacom_wac.h + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ +#ifndef WACOM_WAC_H +#define WACOM_WAC_H + +#include + +/* maximum packet length for USB devices */ +#define WACOM_PKGLEN_MAX 64 + +/* packet length for individual models */ +#define WACOM_PKGLEN_PENPRTN 7 +#define WACOM_PKGLEN_GRAPHIRE 8 +#define WACOM_PKGLEN_BBFUN 9 +#define WACOM_PKGLEN_INTUOS 10 +#define WACOM_PKGLEN_TPC1FG 5 +#define WACOM_PKGLEN_TPC2FG 14 +#define WACOM_PKGLEN_BBTOUCH 20 +#define WACOM_PKGLEN_BBTOUCH3 64 +#define WACOM_PKGLEN_BBPEN 10 +#define WACOM_PKGLEN_WIRELESS 32 +#define WACOM_PKGLEN_MTOUCH 62 +#define WACOM_PKGLEN_MTTPC 40 + +/* wacom data size per MT contact */ +#define WACOM_BYTES_PER_MT_PACKET 11 +#define WACOM_BYTES_PER_24HDT_PACKET 14 + +/* device IDs */ +#define STYLUS_DEVICE_ID 0x02 +#define TOUCH_DEVICE_ID 0x03 +#define CURSOR_DEVICE_ID 0x06 +#define ERASER_DEVICE_ID 0x0A +#define PAD_DEVICE_ID 0x0F + +/* wacom data packet report IDs */ +#define WACOM_REPORT_PENABLED 2 +#define WACOM_REPORT_INTUOSREAD 5 +#define WACOM_REPORT_INTUOSWRITE 6 +#define WACOM_REPORT_INTUOSPAD 12 +#define WACOM_REPORT_INTUOS5PAD 3 +#define WACOM_REPORT_TPC1FG 6 +#define WACOM_REPORT_TPC2FG 13 +#define WACOM_REPORT_TPCMT 13 +#define WACOM_REPORT_TPCHID 15 +#define WACOM_REPORT_TPCST 16 +#define WACOM_REPORT_TPC1FGE 18 +#define WACOM_REPORT_24HDT 1 + +/* device quirks */ +#define WACOM_QUIRK_MULTI_INPUT 0x0001 +#define WACOM_QUIRK_BBTOUCH_LOWRES 0x0002 +#define WACOM_QUIRK_NO_INPUT 0x0004 +#define WACOM_QUIRK_MONITOR 0x0008 + +enum { + PENPARTNER = 0, + GRAPHIRE, + WACOM_G4, + PTU, + PL, + DTU, + INTUOS, + INTUOS3S, + INTUOS3, + INTUOS3L, + INTUOS4S, + INTUOS4, + INTUOS4L, + INTUOS5S, + INTUOS5, + INTUOS5L, + WACOM_21UX2, + WACOM_22HD, + DTK, + WACOM_24HD, + CINTIQ, + WACOM_BEE, + WACOM_13HD, + WACOM_MO, + WIRELESS, + BAMBOO_PT, + WACOM_24HDT, + TABLETPC, /* add new TPC below */ + TABLETPCE, + TABLETPC2FG, + MTSCREEN, + MTTPC, + MAX_TYPE +}; + +struct wacom_features { + const char *name; + int pktlen; + int x_max; + int y_max; + int pressure_max; + int distance_max; + int type; + int x_resolution; + int y_resolution; + int device_type; + int x_phy; + int y_phy; + unsigned char unit; + unsigned char unitExpo; + int x_fuzz; + int y_fuzz; + int pressure_fuzz; + int distance_fuzz; + unsigned quirks; + unsigned touch_max; + int oVid; + int oPid; +}; + +struct wacom_shared { + bool stylus_in_proximity; + bool touch_down; +}; + +struct wacom_wac { + char name[64]; + unsigned char *data; + int tool[2]; + int id[2]; + __u32 serial[2]; + struct wacom_features features; + struct wacom_shared *shared; + struct input_dev *input; + int pid; + int battery_capacity; + int num_contacts_left; +}; + +#endif diff --git a/drivers/input/touchscreen/88pm860x-ts.c b/drivers/input/touchscreen/88pm860x-ts.c new file mode 100644 index 00000000..c7068942 --- /dev/null +++ b/drivers/input/touchscreen/88pm860x-ts.c @@ -0,0 +1,321 @@ +/* + * Touchscreen driver for Marvell 88PM860x + * + * Copyright (C) 2009 Marvell International Ltd. + * Haojian Zhuang + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MEAS_LEN (8) +#define ACCURATE_BIT (12) + +/* touch register */ +#define MEAS_EN3 (0x52) + +#define MEAS_TSIX_1 (0x8D) +#define MEAS_TSIX_2 (0x8E) +#define MEAS_TSIY_1 (0x8F) +#define MEAS_TSIY_2 (0x90) +#define MEAS_TSIZ1_1 (0x91) +#define MEAS_TSIZ1_2 (0x92) +#define MEAS_TSIZ2_1 (0x93) +#define MEAS_TSIZ2_2 (0x94) + +/* bit definitions of touch */ +#define MEAS_PD_EN (1 << 3) +#define MEAS_TSIX_EN (1 << 4) +#define MEAS_TSIY_EN (1 << 5) +#define MEAS_TSIZ1_EN (1 << 6) +#define MEAS_TSIZ2_EN (1 << 7) + +struct pm860x_touch { + struct input_dev *idev; + struct i2c_client *i2c; + struct pm860x_chip *chip; + int irq; + int res_x; /* resistor of Xplate */ +}; + +static irqreturn_t pm860x_touch_handler(int irq, void *data) +{ + struct pm860x_touch *touch = data; + struct pm860x_chip *chip = touch->chip; + unsigned char buf[MEAS_LEN]; + int x, y, pen_down; + int z1, z2, rt = 0; + int ret; + + ret = pm860x_bulk_read(touch->i2c, MEAS_TSIX_1, MEAS_LEN, buf); + if (ret < 0) + goto out; + + pen_down = buf[1] & (1 << 6); + x = ((buf[0] & 0xFF) << 4) | (buf[1] & 0x0F); + y = ((buf[2] & 0xFF) << 4) | (buf[3] & 0x0F); + z1 = ((buf[4] & 0xFF) << 4) | (buf[5] & 0x0F); + z2 = ((buf[6] & 0xFF) << 4) | (buf[7] & 0x0F); + + if (pen_down) { + if ((x != 0) && (z1 != 0) && (touch->res_x != 0)) { + rt = z2 / z1 - 1; + rt = (rt * touch->res_x * x) >> ACCURATE_BIT; + dev_dbg(chip->dev, "z1:%d, z2:%d, rt:%d\n", + z1, z2, rt); + } + input_report_abs(touch->idev, ABS_X, x); + input_report_abs(touch->idev, ABS_Y, y); + input_report_abs(touch->idev, ABS_PRESSURE, rt); + input_report_key(touch->idev, BTN_TOUCH, 1); + dev_dbg(chip->dev, "pen down at [%d, %d].\n", x, y); + } else { + input_report_abs(touch->idev, ABS_PRESSURE, 0); + input_report_key(touch->idev, BTN_TOUCH, 0); + dev_dbg(chip->dev, "pen release\n"); + } + input_sync(touch->idev); + +out: + return IRQ_HANDLED; +} + +static int pm860x_touch_open(struct input_dev *dev) +{ + struct pm860x_touch *touch = input_get_drvdata(dev); + int data, ret; + + data = MEAS_PD_EN | MEAS_TSIX_EN | MEAS_TSIY_EN + | MEAS_TSIZ1_EN | MEAS_TSIZ2_EN; + ret = pm860x_set_bits(touch->i2c, MEAS_EN3, data, data); + if (ret < 0) + goto out; + return 0; +out: + return ret; +} + +static void pm860x_touch_close(struct input_dev *dev) +{ + struct pm860x_touch *touch = input_get_drvdata(dev); + int data; + + data = MEAS_PD_EN | MEAS_TSIX_EN | MEAS_TSIY_EN + | MEAS_TSIZ1_EN | MEAS_TSIZ2_EN; + pm860x_set_bits(touch->i2c, MEAS_EN3, data, 0); +} + +#ifdef CONFIG_OF +static int pm860x_touch_dt_init(struct platform_device *pdev, + struct pm860x_chip *chip, + int *res_x) +{ + struct device_node *np = pdev->dev.parent->of_node; + struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? chip->client \ + : chip->companion; + int data, n, ret; + if (!np) + return -ENODEV; + np = of_find_node_by_name(np, "touch"); + if (!np) { + dev_err(&pdev->dev, "Can't find touch node\n"); + return -EINVAL; + } + /* set GPADC MISC1 register */ + data = 0; + if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-prebias", &n)) + data |= (n << 1) & PM8607_GPADC_PREBIAS_MASK; + if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-slot-cycle", &n)) + data |= (n << 3) & PM8607_GPADC_SLOT_CYCLE_MASK; + if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-off-scale", &n)) + data |= (n << 5) & PM8607_GPADC_OFF_SCALE_MASK; + if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-sw-cal", &n)) + data |= (n << 7) & PM8607_GPADC_SW_CAL_MASK; + if (data) { + ret = pm860x_reg_write(i2c, PM8607_GPADC_MISC1, data); + if (ret < 0) + return -EINVAL; + } + /* set tsi prebias time */ + if (!of_property_read_u32(np, "marvell,88pm860x-tsi-prebias", &data)) { + ret = pm860x_reg_write(i2c, PM8607_TSI_PREBIAS, data); + if (ret < 0) + return -EINVAL; + } + /* set prebias & prechg time of pen detect */ + data = 0; + if (!of_property_read_u32(np, "marvell,88pm860x-pen-prebias", &n)) + data |= n & PM8607_PD_PREBIAS_MASK; + if (!of_property_read_u32(np, "marvell,88pm860x-pen-prechg", &n)) + data |= n & PM8607_PD_PRECHG_MASK; + if (data) { + ret = pm860x_reg_write(i2c, PM8607_PD_PREBIAS, data); + if (ret < 0) + return -EINVAL; + } + of_property_read_u32(np, "marvell,88pm860x-resistor-X", res_x); + return 0; +} +#else +#define pm860x_touch_dt_init(x, y, z) (-1) +#endif + +static int pm860x_touch_probe(struct platform_device *pdev) +{ + struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); + struct pm860x_touch_pdata *pdata = pdev->dev.platform_data; + struct pm860x_touch *touch; + struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? chip->client \ + : chip->companion; + int irq, ret, res_x = 0, data = 0; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "No IRQ resource!\n"); + return -EINVAL; + } + + if (pm860x_touch_dt_init(pdev, chip, &res_x)) { + if (pdata) { + /* set GPADC MISC1 register */ + data = 0; + data |= (pdata->gpadc_prebias << 1) + & PM8607_GPADC_PREBIAS_MASK; + data |= (pdata->slot_cycle << 3) + & PM8607_GPADC_SLOT_CYCLE_MASK; + data |= (pdata->off_scale << 5) + & PM8607_GPADC_OFF_SCALE_MASK; + data |= (pdata->sw_cal << 7) + & PM8607_GPADC_SW_CAL_MASK; + if (data) { + ret = pm860x_reg_write(i2c, + PM8607_GPADC_MISC1, data); + if (ret < 0) + return -EINVAL; + } + /* set tsi prebias time */ + if (pdata->tsi_prebias) { + data = pdata->tsi_prebias; + ret = pm860x_reg_write(i2c, + PM8607_TSI_PREBIAS, data); + if (ret < 0) + return -EINVAL; + } + /* set prebias & prechg time of pen detect */ + data = 0; + data |= pdata->pen_prebias + & PM8607_PD_PREBIAS_MASK; + data |= (pdata->pen_prechg << 5) + & PM8607_PD_PRECHG_MASK; + if (data) { + ret = pm860x_reg_write(i2c, + PM8607_PD_PREBIAS, data); + if (ret < 0) + return -EINVAL; + } + res_x = pdata->res_x; + } else { + dev_err(&pdev->dev, "failed to get platform data\n"); + return -EINVAL; + } + } + /* enable GPADC */ + ret = pm860x_set_bits(i2c, PM8607_GPADC_MISC1, PM8607_GPADC_EN, + PM8607_GPADC_EN); + if (ret) + return ret; + + touch = kzalloc(sizeof(struct pm860x_touch), GFP_KERNEL); + if (touch == NULL) + return -ENOMEM; + dev_set_drvdata(&pdev->dev, touch); + + touch->idev = input_allocate_device(); + if (touch->idev == NULL) { + dev_err(&pdev->dev, "Failed to allocate input device!\n"); + ret = -ENOMEM; + goto out; + } + + touch->idev->name = "88pm860x-touch"; + touch->idev->phys = "88pm860x/input0"; + touch->idev->id.bustype = BUS_I2C; + touch->idev->dev.parent = &pdev->dev; + touch->idev->open = pm860x_touch_open; + touch->idev->close = pm860x_touch_close; + touch->chip = chip; + touch->i2c = i2c; + touch->irq = irq; + touch->res_x = res_x; + input_set_drvdata(touch->idev, touch); + + ret = request_threaded_irq(touch->irq, NULL, pm860x_touch_handler, + IRQF_ONESHOT, "touch", touch); + if (ret < 0) + goto out_irq; + + __set_bit(EV_ABS, touch->idev->evbit); + __set_bit(ABS_X, touch->idev->absbit); + __set_bit(ABS_Y, touch->idev->absbit); + __set_bit(ABS_PRESSURE, touch->idev->absbit); + __set_bit(EV_SYN, touch->idev->evbit); + __set_bit(EV_KEY, touch->idev->evbit); + __set_bit(BTN_TOUCH, touch->idev->keybit); + + input_set_abs_params(touch->idev, ABS_X, 0, 1 << ACCURATE_BIT, 0, 0); + input_set_abs_params(touch->idev, ABS_Y, 0, 1 << ACCURATE_BIT, 0, 0); + input_set_abs_params(touch->idev, ABS_PRESSURE, 0, 1 << ACCURATE_BIT, + 0, 0); + + ret = input_register_device(touch->idev); + if (ret < 0) { + dev_err(chip->dev, "Failed to register touch!\n"); + goto out_rg; + } + + platform_set_drvdata(pdev, touch); + return 0; +out_rg: + free_irq(touch->irq, touch); +out_irq: + input_free_device(touch->idev); +out: + kfree(touch); + return ret; +} + +static int pm860x_touch_remove(struct platform_device *pdev) +{ + struct pm860x_touch *touch = platform_get_drvdata(pdev); + + input_unregister_device(touch->idev); + free_irq(touch->irq, touch); + platform_set_drvdata(pdev, NULL); + kfree(touch); + return 0; +} + +static struct platform_driver pm860x_touch_driver = { + .driver = { + .name = "88pm860x-touch", + .owner = THIS_MODULE, + }, + .probe = pm860x_touch_probe, + .remove = pm860x_touch_remove, +}; +module_platform_driver(pm860x_touch_driver); + +MODULE_DESCRIPTION("Touchscreen driver for Marvell Semiconductor 88PM860x"); +MODULE_AUTHOR("Haojian Zhuang "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:88pm860x-touch"); + diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig new file mode 100755 index 00000000..10355a0b --- /dev/null +++ b/drivers/input/touchscreen/Kconfig @@ -0,0 +1,1049 @@ +# +# Touchscreen driver configuration +# +menuconfig INPUT_TOUCHSCREEN + bool "Touchscreens" + help + Say Y here, and a list of supported touchscreens will be displayed. + This option doesn't affect the kernel. + + If unsure, say Y. + +if INPUT_TOUCHSCREEN + +config TOUCHSCREEN_88PM860X + tristate "Marvell 88PM860x touchscreen" + depends on MFD_88PM860X + help + Say Y here if you have a 88PM860x PMIC and want to enable + support for the built-in touchscreen. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called 88pm860x-ts. + +config TOUCHSCREEN_ADS7846 + tristate "ADS7846/TSC2046/AD7873 and AD(S)7843 based touchscreens" + depends on SPI_MASTER + depends on HWMON = n || HWMON + help + Say Y here if you have a touchscreen interface using the + ADS7846/TSC2046/AD7873 or ADS7843/AD7843 controller, + and your board-specific setup code includes that in its + table of SPI devices. + + If HWMON is selected, and the driver is told the reference voltage + on your board, you will also get hwmon interfaces for the voltage + (and on ads7846/tsc2046/ad7873, temperature) sensors of this chip. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called ads7846. + +config TOUCHSCREEN_AD7877 + tristate "AD7877 based touchscreens" + depends on SPI_MASTER + help + Say Y here if you have a touchscreen interface using the + AD7877 controller, and your board-specific initialization + code includes that in its table of SPI devices. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called ad7877. + +config TOUCHSCREEN_AD7879 + tristate "Analog Devices AD7879-1/AD7889-1 touchscreen interface" + help + Say Y here if you want to support a touchscreen interface using + the AD7879-1/AD7889-1 controller. + + You should select a bus connection too. + + To compile this driver as a module, choose M here: the + module will be called ad7879. + +config TOUCHSCREEN_AD7879_I2C + tristate "support I2C bus connection" + depends on TOUCHSCREEN_AD7879 && I2C + help + Say Y here if you have AD7879-1/AD7889-1 hooked to an I2C bus. + + To compile this driver as a module, choose M here: the + module will be called ad7879-i2c. + +config TOUCHSCREEN_AD7879_SPI + tristate "support SPI bus connection" + depends on TOUCHSCREEN_AD7879 && SPI_MASTER + help + Say Y here if you have AD7879-1/AD7889-1 hooked to a SPI bus. + + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called ad7879-spi. + +config TOUCHSCREEN_ATMEL_MXT + tristate "Atmel mXT I2C Touchscreen" + depends on I2C + help + Say Y here if you have Atmel mXT series I2C touchscreen, + such as AT42QT602240/ATMXT224, connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called atmel_mxt_ts. + +config TOUCHSCREEN_AUO_PIXCIR + tristate "AUO in-cell touchscreen using Pixcir ICs" + depends on I2C + depends on GPIOLIB + help + Say Y here if you have a AUO display with in-cell touchscreen + using Pixcir ICs. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called auo-pixcir-ts. + +config TOUCHSCREEN_BU21013 + tristate "BU21013 based touch panel controllers" + depends on I2C + help + Say Y here if you have a bu21013 touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called bu21013_ts. + +config TOUCHSCREEN_CY8CTMG110 + tristate "cy8ctmg110 touchscreen" + depends on I2C + depends on GPIOLIB + help + Say Y here if you have a cy8ctmg110 capacitive touchscreen on + an AAVA device. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called cy8ctmg110_ts. + +config TOUCHSCREEN_CYTTSP_CORE + tristate "Cypress TTSP touchscreen" + help + Say Y here if you have a touchscreen using controller from + the Cypress TrueTouch(tm) Standard Product family connected + to your system. You will also need to select appropriate + bus connection below. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called cyttsp_core. + +config TOUCHSCREEN_CYTTSP_I2C + tristate "support I2C bus connection" + depends on TOUCHSCREEN_CYTTSP_CORE && I2C + help + Say Y here if the touchscreen is connected via I2C bus. + + To compile this driver as a module, choose M here: the + module will be called cyttsp_i2c. + +config TOUCHSCREEN_CYTTSP_SPI + tristate "support SPI bus connection" + depends on TOUCHSCREEN_CYTTSP_CORE && SPI_MASTER + help + Say Y here if the touchscreen is connected via SPI bus. + + To compile this driver as a module, choose M here: the + module will be called cyttsp_spi. + +config TOUCHSCREEN_DA9034 + tristate "Touchscreen support for Dialog Semiconductor DA9034" + depends on PMIC_DA903X + default y + help + Say Y here to enable the support for the touchscreen found + on Dialog Semiconductor DA9034 PMIC. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called da9034-ts. + +config TOUCHSCREEN_DA9052 + tristate "Dialog DA9052/DA9053 TSI" + depends on PMIC_DA9052 + help + Say Y here to support the touchscreen found on Dialog Semiconductor + DA9052-BC and DA9053-AA/Bx PMICs. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called da9052_tsi. + +config TOUCHSCREEN_DYNAPRO + tristate "Dynapro serial touchscreen" + select SERIO + help + Say Y here if you have a Dynapro serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called dynapro. + +config TOUCHSCREEN_HAMPSHIRE + tristate "Hampshire serial touchscreen" + select SERIO + help + Say Y here if you have a Hampshire serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called hampshire. + +config TOUCHSCREEN_EETI + tristate "EETI touchscreen panel support" + depends on I2C + help + Say Y here to enable support for I2C connected EETI touch panels. + + To compile this driver as a module, choose M here: the + module will be called eeti_ts. + +config TOUCHSCREEN_EGALAX + tristate "EETI eGalax multi-touch panel support" + depends on I2C && OF + help + Say Y here to enable support for I2C connected EETI + eGalax multi-touch panels. + + To compile this driver as a module, choose M here: the + module will be called egalax_ts. + +config TOUCHSCREEN_FUJITSU + tristate "Fujitsu serial touchscreen" + select SERIO + help + Say Y here if you have the Fujitsu touchscreen (such as one + installed in Lifebook P series laptop) connected to your + system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called fujitsu-ts. + +config TOUCHSCREEN_ILI210X + tristate "Ilitek ILI210X based touchscreen" + depends on I2C + help + Say Y here if you have a ILI210X based touchscreen + controller. This driver supports models ILI2102, + ILI2102s, ILI2103, ILI2103s and ILI2105. + Such kind of chipsets can be found in Amazon Kindle Fire + touchscreens. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ili210x. + +config TOUCHSCREEN_S3C2410 + tristate "Samsung S3C2410/generic touchscreen input driver" + depends on ARCH_S3C24XX || SAMSUNG_DEV_TS + select S3C_ADC + help + Say Y here if you have the s3c2410 touchscreen. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called s3c2410_ts. + +config TOUCHSCREEN_GUNZE + tristate "Gunze AHL-51S touchscreen" + select SERIO + help + Say Y here if you have the Gunze AHL-51 touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called gunze. + +config TOUCHSCREEN_ELO + tristate "Elo serial touchscreens" + select SERIO + help + Say Y here if you have an Elo serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called elo. + +config TOUCHSCREEN_WACOM_W8001 + tristate "Wacom W8001 penabled serial touchscreen" + select SERIO + help + Say Y here if you have an Wacom W8001 penabled serial touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called wacom_w8001. + +config TOUCHSCREEN_WACOM_I2C + tristate "Wacom Tablet support (I2C)" + depends on I2C + help + Say Y here if you want to use the I2C version of the Wacom + Pen Tablet. + + If unsure, say N. + + To compile this driver as a module, choose M here: the module + will be called wacom_i2c. + +config TOUCHSCREEN_LPC32XX + tristate "LPC32XX touchscreen controller" + depends on ARCH_LPC32XX + help + Say Y here if you have a LPC32XX device and want + to support the built-in touchscreen. + + To compile this driver as a module, choose M here: the + module will be called lpc32xx_ts. + +config TOUCHSCREEN_MAX11801 + tristate "MAX11801 based touchscreens" + depends on I2C + help + Say Y here if you have a MAX11801 based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called max11801_ts. + +config TOUCHSCREEN_MCS5000 + tristate "MELFAS MCS-5000 touchscreen" + depends on I2C + help + Say Y here if you have the MELFAS MCS-5000 touchscreen controller + chip in your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mcs5000_ts. + +config TOUCHSCREEN_MMS114 + tristate "MELFAS MMS114 touchscreen" + depends on I2C && GENERIC_HARDIRQS + help + Say Y here if you have the MELFAS MMS114 touchscreen controller + chip in your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mms114. + +config TOUCHSCREEN_ZT7554 + tristate "ZT7554 Touchscreen" + depends on I2C + help + Say Y here if you have the Imagis ZINITIX ZT7554 I2C touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called Zinitix. +config TOUCHSCREEN_MTOUCH + tristate "MicroTouch serial touchscreens" + select SERIO + help + Say Y here if you have a MicroTouch (3M) serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mtouch. + +config TOUCHSCREEN_INEXIO + tristate "iNexio serial touchscreens" + select SERIO + help + Say Y here if you have an iNexio serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called inexio. + +config TOUCHSCREEN_INTEL_MID + tristate "Intel MID platform resistive touchscreen" + depends on INTEL_SCU_IPC + help + Say Y here if you have a Intel MID based touchscreen in + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called intel_mid_touch. + +config TOUCHSCREEN_MK712 + tristate "ICS MicroClock MK712 touchscreen" + help + Say Y here if you have the ICS MicroClock MK712 touchscreen + controller chip in your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mk712. + +config TOUCHSCREEN_HP600 + tristate "HP Jornada 6xx touchscreen" + depends on SH_HP6XX && SH_ADC + help + Say Y here if you have a HP Jornada 620/660/680/690 and want to + support the built-in touchscreen. + + To compile this driver as a module, choose M here: the + module will be called hp680_ts_input. + +config TOUCHSCREEN_HP7XX + tristate "HP Jornada 7xx touchscreen" + depends on SA1100_JORNADA720_SSP + help + Say Y here if you have a HP Jornada 710/720/728 and want + to support the built-in touchscreen. + + To compile this driver as a module, choose M here: the + module will be called jornada720_ts. + +config TOUCHSCREEN_HTCPEN + tristate "HTC Shift X9500 touchscreen" + depends on ISA + help + Say Y here if you have an HTC Shift UMPC also known as HTC X9500 + Clio / Shangrila and want to support the built-in touchscreen. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called htcpen. + +config TOUCHSCREEN_PENMOUNT + tristate "Penmount serial touchscreen" + select SERIO + help + Say Y here if you have a Penmount serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called penmount. + +config TOUCHSCREEN_EDT_FT5X06 + tristate "EDT FocalTech FT5x06 I2C Touchscreen support" + depends on I2C + help + Say Y here if you have an EDT "Polytouch" touchscreen based + on the FocalTech FT5x06 family of controllers connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called edt-ft5x06. + +config TOUCHSCREEN_MIGOR + tristate "Renesas MIGO-R touchscreen" + depends on SH_MIGOR && I2C + help + Say Y here to enable MIGO-R touchscreen support. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called migor_ts. + +config TOUCHSCREEN_TNETV107X + tristate "TI TNETV107X touchscreen support" + depends on ARCH_DAVINCI_TNETV107X + help + Say Y here if you want to use the TNETV107X touchscreen. + + To compile this driver as a module, choose M here: the + module will be called tnetv107x-ts. + +config TOUCHSCREEN_TOUCHRIGHT + tristate "Touchright serial touchscreen" + select SERIO + help + Say Y here if you have a Touchright serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called touchright. + +config TOUCHSCREEN_TOUCHWIN + tristate "Touchwin serial touchscreen" + select SERIO + help + Say Y here if you have a Touchwin serial touchscreen connected to + your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called touchwin. + +config TOUCHSCREEN_TI_AM335X_TSC + tristate "TI Touchscreen Interface" + depends on MFD_TI_AM335X_TSCADC + help + Say Y here if you have 4/5/8 wire touchscreen controller + to be connected to the ADC controller on your TI AM335x SoC. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ti_am335x_tsc. + +config TOUCHSCREEN_ATMEL_TSADCC + tristate "Atmel Touchscreen Interface" + depends on ARCH_AT91 + help + Say Y here if you have a 4-wire touchscreen connected to the + ADC Controller on your Atmel SoC. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called atmel_tsadcc. + +config TOUCHSCREEN_UCB1400 + tristate "Philips UCB1400 touchscreen" + depends on AC97_BUS + depends on UCB1400_CORE + help + This enables support for the Philips UCB1400 touchscreen interface. + The UCB1400 is an AC97 audio codec. The touchscreen interface + will be initialized only after the ALSA subsystem has been + brought up and the UCB1400 detected. You therefore have to + configure ALSA support as well (either built-in or modular, + independently of whether this driver is itself built-in or + modular) for this driver to work. + + To compile this driver as a module, choose M here: the + module will be called ucb1400_ts. + +config TOUCHSCREEN_PIXCIR + tristate "PIXCIR I2C touchscreens" + depends on I2C + help + Say Y here if you have a pixcir i2c touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called pixcir_i2c_ts. + +config TOUCHSCREEN_WM831X + tristate "Support for WM831x touchscreen controllers" + depends on MFD_WM831X + help + This enables support for the touchscreen controller on the WM831x + series of PMICs. + + To compile this driver as a module, choose M here: the + module will be called wm831x-ts. + +config TOUCHSCREEN_WM97XX + tristate "Support for WM97xx AC97 touchscreen controllers" + depends on AC97_BUS + help + Say Y here if you have a Wolfson Microelectronics WM97xx + touchscreen connected to your system. Note that this option + only enables core driver, you will also need to select + support for appropriate chip below. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called wm97xx-ts. + +config TOUCHSCREEN_WM9705 + bool "WM9705 Touchscreen interface support" + depends on TOUCHSCREEN_WM97XX + default y + help + Say Y here to enable support for the Wolfson Microelectronics + WM9705 touchscreen controller. + +config TOUCHSCREEN_WM9712 + bool "WM9712 Touchscreen interface support" + depends on TOUCHSCREEN_WM97XX + default y + help + Say Y here to enable support for the Wolfson Microelectronics + WM9712 touchscreen controller. + +config TOUCHSCREEN_WM9713 + bool "WM9713 Touchscreen interface support" + depends on TOUCHSCREEN_WM97XX + default y + help + Say Y here to enable support for the Wolfson Microelectronics + WM9713 touchscreen controller. + +config TOUCHSCREEN_WM97XX_ATMEL + tristate "WM97xx Atmel accelerated touch" + depends on TOUCHSCREEN_WM97XX && (AVR32 || ARCH_AT91) + help + Say Y here for support for streaming mode with WM97xx touchscreens + on Atmel AT91 or AVR32 systems with an AC97C module. + + Be aware that this will use channel B in the controller for + streaming data, this must not conflict with other AC97C drivers. + + If unsure, say N. + + To compile this driver as a module, choose M here: the module will + be called atmel-wm97xx. + +config TOUCHSCREEN_WM97XX_MAINSTONE + tristate "WM97xx Mainstone/Palm accelerated touch" + depends on TOUCHSCREEN_WM97XX && ARCH_PXA + help + Say Y here for support for streaming mode with WM97xx touchscreens + on Mainstone, Palm Tungsten T5, TX and LifeDrive systems. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mainstone-wm97xx. + +config TOUCHSCREEN_WM97XX_ZYLONITE + tristate "Zylonite accelerated touch" + depends on TOUCHSCREEN_WM97XX && MACH_ZYLONITE + select TOUCHSCREEN_WM9713 + help + Say Y here for support for streaming mode with the touchscreen + on Zylonite systems. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called zylonite-wm97xx. + +config TOUCHSCREEN_USB_COMPOSITE + tristate "USB Touchscreen Driver" + depends on USB_ARCH_HAS_HCD + select USB + help + USB Touchscreen driver for: + - eGalax Touchkit USB (also includes eTurboTouch CT-410/510/700) + - PanJit TouchSet USB + - 3M MicroTouch USB (EX II series) + - ITM + - some other eTurboTouch + - Gunze AHL61 + - DMC TSC-10/25 + - IRTOUCHSYSTEMS/UNITOP + - IdealTEK URTC1000 + - GoTop Super_Q2/GogoPen/PenPower tablets + - JASTEC USB Touch Controller/DigiTech DTR-02U + - Zytronic controllers + - Elo TouchSystems 2700 IntelliTouch + - EasyTouch USB Touch Controller from Data Modul + - e2i (Mimo monitors) + + Have a look at for + a usage description and the required user-space stuff. + + To compile this driver as a module, choose M here: the + module will be called usbtouchscreen. + +config TOUCHSCREEN_MC13783 + tristate "Freescale MC13783 touchscreen input driver" + depends on MFD_MC13783 + help + Say Y here if you have an Freescale MC13783 PMIC on your + board and want to use its touchscreen + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called mc13783_ts. + +config TOUCHSCREEN_USB_EGALAX + default y + bool "eGalax, eTurboTouch CT-410/510/700 device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_PANJIT + default y + bool "PanJit device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_3M + default y + bool "3M/Microtouch EX II series device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_ITM + default y + bool "ITM device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_ETURBO + default y + bool "eTurboTouch (non-eGalax compatible) device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_GUNZE + default y + bool "Gunze AHL61 device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_DMC_TSC10 + default y + bool "DMC TSC-10/25 device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_IRTOUCH + default y + bool "IRTOUCHSYSTEMS/UNITOP device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_IDEALTEK + default y + bool "IdealTEK URTC1000 device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_GENERAL_TOUCH + default y + bool "GeneralTouch Touchscreen device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_GOTOP + default y + bool "GoTop Super_Q2/GogoPen/PenPower tablet device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_JASTEC + default y + bool "JASTEC/DigiTech DTR-02U USB touch controller device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_ELO + default y + bool "Elo TouchSystems 2700 IntelliTouch controller device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_E2I + default y + bool "e2i Touchscreen controller (e.g. from Mimo 740)" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_ZYTRONIC + default y + bool "Zytronic controller" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_ETT_TC45USB + default y + bool "ET&T USB series TC4UM/TC5UH touchscreen controller support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_NEXIO + default y + bool "NEXIO/iNexio device support" if EXPERT + depends on TOUCHSCREEN_USB_COMPOSITE + +config TOUCHSCREEN_USB_EASYTOUCH + default y + bool "EasyTouch USB Touch controller device support" if EMBEDDED + depends on TOUCHSCREEN_USB_COMPOSITE + help + Say Y here if you have an EasyTouch USB Touch controller. + If unsure, say N. + +config TOUCHSCREEN_TOUCHIT213 + tristate "Sahara TouchIT-213 touchscreen" + select SERIO + help + Say Y here if you have a Sahara TouchIT-213 Tablet PC. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called touchit213. + +config TOUCHSCREEN_TSC_SERIO + tristate "TSC-10/25/40 serial touchscreen support" + select SERIO + help + Say Y here if you have a TSC-10, 25 or 40 serial touchscreen connected + to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called tsc40. + +config TOUCHSCREEN_TSC2005 + tristate "TSC2005 based touchscreens" + depends on SPI_MASTER && GENERIC_HARDIRQS + help + Say Y here if you have a TSC2005 based touchscreen. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called tsc2005. + +config TOUCHSCREEN_TSC2007 + tristate "TSC2007 based touchscreens" + depends on I2C + help + Say Y here if you have a TSC2007 based touchscreen. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called tsc2007. + +config TOUCHSCREEN_W90X900 + tristate "W90P910 touchscreen driver" + depends on HAVE_CLK + help + Say Y here if you have a W90P910 based touchscreen. + + To compile this driver as a module, choose M here: the + module will be called w90p910_ts. + +config TOUCHSCREEN_PCAP + tristate "Motorola PCAP touchscreen" + depends on EZX_PCAP + help + Say Y here if you have a Motorola EZX telephone and + want to enable support for the built-in touchscreen. + + To compile this driver as a module, choose M here: the + module will be called pcap_ts. + +config TOUCHSCREEN_ST1232 + tristate "Sitronix ST1232 touchscreen controllers" + depends on I2C + help + Say Y here if you want to support Sitronix ST1232 + touchscreen controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called st1232_ts. + +config TOUCHSCREEN_STMPE + tristate "STMicroelectronics STMPE touchscreens" + depends on MFD_STMPE + help + Say Y here if you want support for STMicroelectronics + STMPE touchscreen controllers. + + To compile this driver as a module, choose M here: the + module will be called stmpe-ts. + +config TOUCHSCREEN_TPS6507X + tristate "TPS6507x based touchscreens" + depends on I2C + help + Say Y here if you have a TPS6507x based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called tps6507x_ts. + +config TOUCHSCREEN_FOCALTECH + tristate "touchscreen_focaltech driver" + depends on I2C + help + Say Y here if you have a FOCALTECH based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called focaltech_ts.o + +config TOUCHSCREEN_FIRMWARE_UPGRADE + bool "TOUCHSCREEN FIRMWARE UPGRADE" + depends on TOUCHSCREEN_FOCALTECH + default n + help + Say Y here to enable support for the TP firmware update. + +config TOUCHSCREEN_GOODIX + tristate "touchscreen_goodix driver" + depends on I2C + help + Say Y here if you have a GOODIX based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called gt9xx_ts.ko + +config TOUCHSCREEN_MMS136 + tristate "MMS136 touchscreen driver" + depends on I2C + help + Say Y here if you want to support MMS136 based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here:the module + be called mms136_ts + + +config TOUCHSCREEN_IST30XX + tristate "IST30XX I2C Touchscreen" + depends on I2C + help + Say Y here if you have the Imagis IST30XX I2C touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ist30xx. + +config TOUCHSCREEN_IST30XXA + tristate "IST30XXA I2C Touchscreen" + depends on I2C + help + Say Y here if you have the Imagis IST30XXA I2C touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ist30xxa. + +config TOUCHSCREEN_IST30XXB + tristate "IST30XXB I2C Touchscreen" + depends on I2C + help + Say Y here if you have the Imagis IST30XXB I2C touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ist30xx. + +config TOUCHSCREEN_IST30XXC + tristate "IST30XXC I2C Touchscreen" + depends on I2C + help + Say Y here if you have the Imagis IST30XXB I2C touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called ist30xx. + +config TOUCHSCREEN_MMS134 + tristate "MMS134s touchscreen driver" + depends on I2C + help + Say Y here if you want to support MMS134s based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here:the module + be called mms100s_ts + +config TOUCHSCREEN_MMS134S + tristate "MMS134s touchscreen driver" + depends on I2C + help + Say Y here if you want to support MMS134s based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here:the module + be called mms134s + +config TOUCHSCREEN_MSG2138 + tristate "MSG2138 touchscreen driver" + depends on I2C + help + Say Y here if you have a MSG2138 based touchscreen + controller. + + If unsure, say N. + + To compile this driver as a module, choose M here: the + module will be called msg2138.c. +config TOUCHSCREEN_MSG2233 + tristate "MSG2233 touchscreen driver" + depends on I2C + help + Say Y here if you have a MSG2233 based touchscreen + controller. + + If unsure, say N. +config TOUCHSCREEN_BT541_TS + tristate "ZINITIX BT541 I2C Touchscreen" + depends on I2C + help + Say Y here if you have the Imagis ZINITIX BT541 I2C touchscreen + connected to your system. + + If unsure, say N. + + To compile this driver as a module, choose M here: + the module will be called Zinitix. + +endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile new file mode 100755 index 00000000..d385bf08 --- /dev/null +++ b/drivers/input/touchscreen/Makefile @@ -0,0 +1,87 @@ +# +# Makefile for the touchscreen drivers. +# + +# Each configuration option enables a list of files. + +wm97xx-ts-y := wm97xx-core.o + +obj-$(CONFIG_TOUCHSCREEN_88PM860X) += 88pm860x-ts.o +obj-$(CONFIG_TOUCHSCREEN_AD7877) += ad7877.o +obj-$(CONFIG_TOUCHSCREEN_AD7879) += ad7879.o +obj-$(CONFIG_TOUCHSCREEN_AD7879_I2C) += ad7879-i2c.o +obj-$(CONFIG_TOUCHSCREEN_AD7879_SPI) += ad7879-spi.o +obj-$(CONFIG_TOUCHSCREEN_ADS7846) += ads7846.o +obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT) += atmel_mxt_ts.o +obj-$(CONFIG_TOUCHSCREEN_ATMEL_TSADCC) += atmel_tsadcc.o +obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR) += auo-pixcir-ts.o +obj-$(CONFIG_TOUCHSCREEN_BU21013) += bu21013_ts.o +obj-$(CONFIG_TOUCHSCREEN_CY8CTMG110) += cy8ctmg110_ts.o +obj-$(CONFIG_TOUCHSCREEN_CYTTSP_CORE) += cyttsp_core.o +obj-$(CONFIG_TOUCHSCREEN_CYTTSP_I2C) += cyttsp_i2c.o +obj-$(CONFIG_TOUCHSCREEN_CYTTSP_SPI) += cyttsp_spi.o +obj-$(CONFIG_TOUCHSCREEN_DA9034) += da9034-ts.o +obj-$(CONFIG_TOUCHSCREEN_DA9052) += da9052_tsi.o +obj-$(CONFIG_TOUCHSCREEN_DYNAPRO) += dynapro.o +obj-$(CONFIG_TOUCHSCREEN_EDT_FT5X06) += edt-ft5x06.o +obj-$(CONFIG_TOUCHSCREEN_HAMPSHIRE) += hampshire.o +obj-$(CONFIG_TOUCHSCREEN_GUNZE) += gunze.o +obj-$(CONFIG_TOUCHSCREEN_EETI) += eeti_ts.o +obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o +obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o +obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o +obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o +obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o +obj-$(CONFIG_TOUCHSCREEN_INTEL_MID) += intel-mid-touch.o +obj-$(CONFIG_TOUCHSCREEN_LPC32XX) += lpc32xx_ts.o +obj-$(CONFIG_TOUCHSCREEN_MAX11801) += max11801_ts.o +obj-$(CONFIG_TOUCHSCREEN_MC13783) += mc13783_ts.o +obj-$(CONFIG_TOUCHSCREEN_MCS5000) += mcs5000_ts.o +obj-$(CONFIG_TOUCHSCREEN_MIGOR) += migor_ts.o +obj-$(CONFIG_TOUCHSCREEN_MMS114) += mms114.o +obj-$(CONFIG_TOUCHSCREEN_MTOUCH) += mtouch.o +obj-$(CONFIG_TOUCHSCREEN_MK712) += mk712.o +obj-$(CONFIG_TOUCHSCREEN_HP600) += hp680_ts_input.o +obj-$(CONFIG_TOUCHSCREEN_HP7XX) += jornada720_ts.o +obj-$(CONFIG_TOUCHSCREEN_HTCPEN) += htcpen.o +obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE) += usbtouchscreen.o +obj-$(CONFIG_TOUCHSCREEN_PCAP) += pcap_ts.o +obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o +obj-$(CONFIG_TOUCHSCREEN_PIXCIR) += pixcir_i2c_ts.o +obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o +obj-$(CONFIG_TOUCHSCREEN_ST1232) += st1232.o +obj-$(CONFIG_TOUCHSCREEN_STMPE) += stmpe-ts.o +obj-$(CONFIG_TOUCHSCREEN_TI_AM335X_TSC) += ti_am335x_tsc.o +obj-$(CONFIG_TOUCHSCREEN_TNETV107X) += tnetv107x-ts.o +obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o +obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o +obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o +obj-$(CONFIG_TOUCHSCREEN_TSC_SERIO) += tsc40.o +obj-$(CONFIG_TOUCHSCREEN_TSC2005) += tsc2005.o +obj-$(CONFIG_TOUCHSCREEN_TSC2007) += tsc2007.o +obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o +obj-$(CONFIG_TOUCHSCREEN_WACOM_W8001) += wacom_w8001.o +obj-$(CONFIG_TOUCHSCREEN_WACOM_I2C) += wacom_i2c.o +obj-$(CONFIG_TOUCHSCREEN_WM831X) += wm831x-ts.o +obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o +wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9705) += wm9705.o +wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9712) += wm9712.o +wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9713) += wm9713.o +obj-$(CONFIG_TOUCHSCREEN_WM97XX_ATMEL) += atmel-wm97xx.o +obj-$(CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE) += mainstone-wm97xx.o +obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o +obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o +obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o +obj-$(CONFIG_TOUCHSCREEN_FOCALTECH) += focaltech/ +obj-$(CONFIG_TOUCHSCREEN_MMS136) += mms136_ts.o +obj-$(CONFIG_TOUCHSCREEN_IST30XX) += ist30xx/ +obj-$(CONFIG_TOUCHSCREEN_IST30XXA) += ist30xxa/ +obj-$(CONFIG_TOUCHSCREEN_IST30XXB) += ist30xxb/ +obj-$(CONFIG_TOUCHSCREEN_IST30XXC) += ist30xxc/ +obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix/ +obj-$(CONFIG_TOUCHSCREEN_MMS134) += mms100s_ts.o +obj-$(CONFIG_TOUCHSCREEN_MMS134S) += mms134s/ +obj-$(CONFIG_TOUCHSCREEN_MSG2138) += msg2138/ +obj-$(CONFIG_TOUCHSCREEN_MSG2233) += msg2233/ +obj-$(CONFIG_TOUCHSCREEN_ZT7554) += zt7554_ts.o +obj-$(CONFIG_TOUCHSCREEN_BT541_TS) += zinitix_bt541_ts.o diff --git a/drivers/input/touchscreen/ad7877.c b/drivers/input/touchscreen/ad7877.c new file mode 100644 index 00000000..f3a174a8 --- /dev/null +++ b/drivers/input/touchscreen/ad7877.c @@ -0,0 +1,868 @@ +/* + * Copyright (C) 2006-2008 Michael Hennerich, Analog Devices Inc. + * + * Description: AD7877 based touchscreen, sensor (ADCs), DAC and GPIO driver + * Based on: ads7846.c + * + * Bugs: Enter bugs at http://blackfin.uclinux.org/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see the file COPYING, or write + * to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * History: + * Copyright (c) 2005 David Brownell + * Copyright (c) 2006 Nokia Corporation + * Various changes: Imre Deak + * + * Using code from: + * - corgi_ts.c + * Copyright (C) 2004-2005 Richard Purdie + * - omap_ts.[hc], ads7846.h, ts_osk.c + * Copyright (C) 2002 MontaVista Software + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2005 Dirk Behme + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(100) + +#define MAX_SPI_FREQ_HZ 20000000 +#define MAX_12BIT ((1<<12)-1) + +#define AD7877_REG_ZEROS 0 +#define AD7877_REG_CTRL1 1 +#define AD7877_REG_CTRL2 2 +#define AD7877_REG_ALERT 3 +#define AD7877_REG_AUX1HIGH 4 +#define AD7877_REG_AUX1LOW 5 +#define AD7877_REG_BAT1HIGH 6 +#define AD7877_REG_BAT1LOW 7 +#define AD7877_REG_BAT2HIGH 8 +#define AD7877_REG_BAT2LOW 9 +#define AD7877_REG_TEMP1HIGH 10 +#define AD7877_REG_TEMP1LOW 11 +#define AD7877_REG_SEQ0 12 +#define AD7877_REG_SEQ1 13 +#define AD7877_REG_DAC 14 +#define AD7877_REG_NONE1 15 +#define AD7877_REG_EXTWRITE 15 +#define AD7877_REG_XPLUS 16 +#define AD7877_REG_YPLUS 17 +#define AD7877_REG_Z2 18 +#define AD7877_REG_aux1 19 +#define AD7877_REG_aux2 20 +#define AD7877_REG_aux3 21 +#define AD7877_REG_bat1 22 +#define AD7877_REG_bat2 23 +#define AD7877_REG_temp1 24 +#define AD7877_REG_temp2 25 +#define AD7877_REG_Z1 26 +#define AD7877_REG_GPIOCTRL1 27 +#define AD7877_REG_GPIOCTRL2 28 +#define AD7877_REG_GPIODATA 29 +#define AD7877_REG_NONE2 30 +#define AD7877_REG_NONE3 31 + +#define AD7877_SEQ_YPLUS_BIT (1<<11) +#define AD7877_SEQ_XPLUS_BIT (1<<10) +#define AD7877_SEQ_Z2_BIT (1<<9) +#define AD7877_SEQ_AUX1_BIT (1<<8) +#define AD7877_SEQ_AUX2_BIT (1<<7) +#define AD7877_SEQ_AUX3_BIT (1<<6) +#define AD7877_SEQ_BAT1_BIT (1<<5) +#define AD7877_SEQ_BAT2_BIT (1<<4) +#define AD7877_SEQ_TEMP1_BIT (1<<3) +#define AD7877_SEQ_TEMP2_BIT (1<<2) +#define AD7877_SEQ_Z1_BIT (1<<1) + +enum { + AD7877_SEQ_YPOS = 0, + AD7877_SEQ_XPOS = 1, + AD7877_SEQ_Z2 = 2, + AD7877_SEQ_AUX1 = 3, + AD7877_SEQ_AUX2 = 4, + AD7877_SEQ_AUX3 = 5, + AD7877_SEQ_BAT1 = 6, + AD7877_SEQ_BAT2 = 7, + AD7877_SEQ_TEMP1 = 8, + AD7877_SEQ_TEMP2 = 9, + AD7877_SEQ_Z1 = 10, + AD7877_NR_SENSE = 11, +}; + +/* DAC Register Default RANGE 0 to Vcc, Volatge Mode, DAC On */ +#define AD7877_DAC_CONF 0x1 + +/* If gpio3 is set AUX3/GPIO3 acts as GPIO Output */ +#define AD7877_EXTW_GPIO_3_CONF 0x1C4 +#define AD7877_EXTW_GPIO_DATA 0x200 + +/* Control REG 2 */ +#define AD7877_TMR(x) ((x & 0x3) << 0) +#define AD7877_REF(x) ((x & 0x1) << 2) +#define AD7877_POL(x) ((x & 0x1) << 3) +#define AD7877_FCD(x) ((x & 0x3) << 4) +#define AD7877_PM(x) ((x & 0x3) << 6) +#define AD7877_ACQ(x) ((x & 0x3) << 8) +#define AD7877_AVG(x) ((x & 0x3) << 10) + +/* Control REG 1 */ +#define AD7877_SER (1 << 11) /* non-differential */ +#define AD7877_DFR (0 << 11) /* differential */ + +#define AD7877_MODE_NOC (0) /* Do not convert */ +#define AD7877_MODE_SCC (1) /* Single channel conversion */ +#define AD7877_MODE_SEQ0 (2) /* Sequence 0 in Slave Mode */ +#define AD7877_MODE_SEQ1 (3) /* Sequence 1 in Master Mode */ + +#define AD7877_CHANADD(x) ((x&0xF)<<7) +#define AD7877_READADD(x) ((x)<<2) +#define AD7877_WRITEADD(x) ((x)<<12) + +#define AD7877_READ_CHAN(x) (AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_SER | \ + AD7877_MODE_SCC | AD7877_CHANADD(AD7877_REG_ ## x) | \ + AD7877_READADD(AD7877_REG_ ## x)) + +#define AD7877_MM_SEQUENCE (AD7877_SEQ_YPLUS_BIT | AD7877_SEQ_XPLUS_BIT | \ + AD7877_SEQ_Z2_BIT | AD7877_SEQ_Z1_BIT) + +/* + * Non-touchscreen sensors only use single-ended conversions. + */ + +struct ser_req { + u16 reset; + u16 ref_on; + u16 command; + struct spi_message msg; + struct spi_transfer xfer[6]; + + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + u16 sample ____cacheline_aligned; +}; + +struct ad7877 { + struct input_dev *input; + char phys[32]; + + struct spi_device *spi; + u16 model; + u16 vref_delay_usecs; + u16 x_plate_ohms; + u16 pressure_max; + + u16 cmd_crtl1; + u16 cmd_crtl2; + u16 cmd_dummy; + u16 dac; + + u8 stopacq_polarity; + u8 first_conversion_delay; + u8 acquisition_time; + u8 averaging; + u8 pen_down_acc_interval; + + struct spi_transfer xfer[AD7877_NR_SENSE + 2]; + struct spi_message msg; + + struct mutex mutex; + bool disabled; /* P: mutex */ + bool gpio3; /* P: mutex */ + bool gpio4; /* P: mutex */ + + spinlock_t lock; + struct timer_list timer; /* P: lock */ + + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + u16 conversion_data[AD7877_NR_SENSE] ____cacheline_aligned; +}; + +static bool gpio3; +module_param(gpio3, bool, 0); +MODULE_PARM_DESC(gpio3, "If gpio3 is set to 1 AUX3 acts as GPIO3"); + +/* + * ad7877_read/write are only used for initial setup and for sysfs controls. + * The main traffic is done using spi_async() in the interrupt handler. + */ + +static int ad7877_read(struct spi_device *spi, u16 reg) +{ + struct ser_req *req; + int status, ret; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command = (u16) (AD7877_WRITEADD(AD7877_REG_CTRL1) | + AD7877_READADD(reg)); + req->xfer[0].tx_buf = &req->command; + req->xfer[0].len = 2; + req->xfer[0].cs_change = 1; + + req->xfer[1].rx_buf = &req->sample; + req->xfer[1].len = 2; + + spi_message_add_tail(&req->xfer[0], &req->msg); + spi_message_add_tail(&req->xfer[1], &req->msg); + + status = spi_sync(spi, &req->msg); + ret = status ? : req->sample; + + kfree(req); + + return ret; +} + +static int ad7877_write(struct spi_device *spi, u16 reg, u16 val) +{ + struct ser_req *req; + int status; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command = (u16) (AD7877_WRITEADD(reg) | (val & MAX_12BIT)); + req->xfer[0].tx_buf = &req->command; + req->xfer[0].len = 2; + + spi_message_add_tail(&req->xfer[0], &req->msg); + + status = spi_sync(spi, &req->msg); + + kfree(req); + + return status; +} + +static int ad7877_read_adc(struct spi_device *spi, unsigned command) +{ + struct ad7877 *ts = spi_get_drvdata(spi); + struct ser_req *req; + int status; + int sample; + int i; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + /* activate reference, so it has time to settle; */ + req->ref_on = AD7877_WRITEADD(AD7877_REG_CTRL2) | + AD7877_POL(ts->stopacq_polarity) | + AD7877_AVG(0) | AD7877_PM(2) | AD7877_TMR(0) | + AD7877_ACQ(ts->acquisition_time) | AD7877_FCD(0); + + req->reset = AD7877_WRITEADD(AD7877_REG_CTRL1) | AD7877_MODE_NOC; + + req->command = (u16) command; + + req->xfer[0].tx_buf = &req->reset; + req->xfer[0].len = 2; + req->xfer[0].cs_change = 1; + + req->xfer[1].tx_buf = &req->ref_on; + req->xfer[1].len = 2; + req->xfer[1].delay_usecs = ts->vref_delay_usecs; + req->xfer[1].cs_change = 1; + + req->xfer[2].tx_buf = &req->command; + req->xfer[2].len = 2; + req->xfer[2].delay_usecs = ts->vref_delay_usecs; + req->xfer[2].cs_change = 1; + + req->xfer[3].rx_buf = &req->sample; + req->xfer[3].len = 2; + req->xfer[3].cs_change = 1; + + req->xfer[4].tx_buf = &ts->cmd_crtl2; /*REF OFF*/ + req->xfer[4].len = 2; + req->xfer[4].cs_change = 1; + + req->xfer[5].tx_buf = &ts->cmd_crtl1; /*DEFAULT*/ + req->xfer[5].len = 2; + + /* group all the transfers together, so we can't interfere with + * reading touchscreen state; disable penirq while sampling + */ + for (i = 0; i < 6; i++) + spi_message_add_tail(&req->xfer[i], &req->msg); + + status = spi_sync(spi, &req->msg); + sample = req->sample; + + kfree(req); + + return status ? : sample; +} + +static int ad7877_process_data(struct ad7877 *ts) +{ + struct input_dev *input_dev = ts->input; + unsigned Rt; + u16 x, y, z1, z2; + + x = ts->conversion_data[AD7877_SEQ_XPOS] & MAX_12BIT; + y = ts->conversion_data[AD7877_SEQ_YPOS] & MAX_12BIT; + z1 = ts->conversion_data[AD7877_SEQ_Z1] & MAX_12BIT; + z2 = ts->conversion_data[AD7877_SEQ_Z2] & MAX_12BIT; + + /* + * The samples processed here are already preprocessed by the AD7877. + * The preprocessing function consists of an averaging filter. + * The combination of 'first conversion delay' and averaging provides a robust solution, + * discarding the spurious noise in the signal and keeping only the data of interest. + * The size of the averaging filter is programmable. (dev.platform_data, see linux/spi/ad7877.h) + * Other user-programmable conversion controls include variable acquisition time, + * and first conversion delay. Up to 16 averages can be taken per conversion. + */ + + if (likely(x && z1)) { + /* compute touch pressure resistance using equation #1 */ + Rt = (z2 - z1) * x * ts->x_plate_ohms; + Rt /= z1; + Rt = (Rt + 2047) >> 12; + + /* + * Sample found inconsistent, pressure is beyond + * the maximum. Don't report it to user space. + */ + if (Rt > ts->pressure_max) + return -EINVAL; + + if (!timer_pending(&ts->timer)) + input_report_key(input_dev, BTN_TOUCH, 1); + + input_report_abs(input_dev, ABS_X, x); + input_report_abs(input_dev, ABS_Y, y); + input_report_abs(input_dev, ABS_PRESSURE, Rt); + input_sync(input_dev); + + return 0; + } + + return -EINVAL; +} + +static inline void ad7877_ts_event_release(struct ad7877 *ts) +{ + struct input_dev *input_dev = ts->input; + + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_report_key(input_dev, BTN_TOUCH, 0); + input_sync(input_dev); +} + +static void ad7877_timer(unsigned long handle) +{ + struct ad7877 *ts = (void *)handle; + unsigned long flags; + + spin_lock_irqsave(&ts->lock, flags); + ad7877_ts_event_release(ts); + spin_unlock_irqrestore(&ts->lock, flags); +} + +static irqreturn_t ad7877_irq(int irq, void *handle) +{ + struct ad7877 *ts = handle; + unsigned long flags; + int error; + + error = spi_sync(ts->spi, &ts->msg); + if (error) { + dev_err(&ts->spi->dev, "spi_sync --> %d\n", error); + goto out; + } + + spin_lock_irqsave(&ts->lock, flags); + error = ad7877_process_data(ts); + if (!error) + mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); + spin_unlock_irqrestore(&ts->lock, flags); + +out: + return IRQ_HANDLED; +} + +static void ad7877_disable(struct ad7877 *ts) +{ + mutex_lock(&ts->mutex); + + if (!ts->disabled) { + ts->disabled = true; + disable_irq(ts->spi->irq); + + if (del_timer_sync(&ts->timer)) + ad7877_ts_event_release(ts); + } + + /* + * We know the chip's in lowpower mode since we always + * leave it that way after every request + */ + + mutex_unlock(&ts->mutex); +} + +static void ad7877_enable(struct ad7877 *ts) +{ + mutex_lock(&ts->mutex); + + if (ts->disabled) { + ts->disabled = false; + enable_irq(ts->spi->irq); + } + + mutex_unlock(&ts->mutex); +} + +#define SHOW(name) static ssize_t \ +name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ +{ \ + struct ad7877 *ts = dev_get_drvdata(dev); \ + ssize_t v = ad7877_read_adc(ts->spi, \ + AD7877_READ_CHAN(name)); \ + if (v < 0) \ + return v; \ + return sprintf(buf, "%u\n", (unsigned) v); \ +} \ +static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL); + +SHOW(aux1) +SHOW(aux2) +SHOW(aux3) +SHOW(bat1) +SHOW(bat2) +SHOW(temp1) +SHOW(temp2) + +static ssize_t ad7877_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->disabled); +} + +static ssize_t ad7877_disable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + if (val) + ad7877_disable(ts); + else + ad7877_enable(ts); + + return count; +} + +static DEVICE_ATTR(disable, 0664, ad7877_disable_show, ad7877_disable_store); + +static ssize_t ad7877_dac_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->dac); +} + +static ssize_t ad7877_dac_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->dac = val & 0xFF; + ad7877_write(ts->spi, AD7877_REG_DAC, (ts->dac << 4) | AD7877_DAC_CONF); + mutex_unlock(&ts->mutex); + + return count; +} + +static DEVICE_ATTR(dac, 0664, ad7877_dac_show, ad7877_dac_store); + +static ssize_t ad7877_gpio3_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->gpio3); +} + +static ssize_t ad7877_gpio3_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->gpio3 = !!val; + ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | + (ts->gpio4 << 4) | (ts->gpio3 << 5)); + mutex_unlock(&ts->mutex); + + return count; +} + +static DEVICE_ATTR(gpio3, 0664, ad7877_gpio3_show, ad7877_gpio3_store); + +static ssize_t ad7877_gpio4_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->gpio4); +} + +static ssize_t ad7877_gpio4_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + mutex_lock(&ts->mutex); + ts->gpio4 = !!val; + ad7877_write(ts->spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_DATA | + (ts->gpio4 << 4) | (ts->gpio3 << 5)); + mutex_unlock(&ts->mutex); + + return count; +} + +static DEVICE_ATTR(gpio4, 0664, ad7877_gpio4_show, ad7877_gpio4_store); + +static struct attribute *ad7877_attributes[] = { + &dev_attr_temp1.attr, + &dev_attr_temp2.attr, + &dev_attr_aux1.attr, + &dev_attr_aux2.attr, + &dev_attr_aux3.attr, + &dev_attr_bat1.attr, + &dev_attr_bat2.attr, + &dev_attr_disable.attr, + &dev_attr_dac.attr, + &dev_attr_gpio3.attr, + &dev_attr_gpio4.attr, + NULL +}; + +static umode_t ad7877_attr_is_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + umode_t mode = attr->mode; + + if (attr == &dev_attr_aux3.attr) { + if (gpio3) + mode = 0; + } else if (attr == &dev_attr_gpio3.attr) { + if (!gpio3) + mode = 0; + } + + return mode; +} + +static const struct attribute_group ad7877_attr_group = { + .is_visible = ad7877_attr_is_visible, + .attrs = ad7877_attributes, +}; + +static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts) +{ + struct spi_message *m; + int i; + + ts->cmd_crtl2 = AD7877_WRITEADD(AD7877_REG_CTRL2) | + AD7877_POL(ts->stopacq_polarity) | + AD7877_AVG(ts->averaging) | AD7877_PM(1) | + AD7877_TMR(ts->pen_down_acc_interval) | + AD7877_ACQ(ts->acquisition_time) | + AD7877_FCD(ts->first_conversion_delay); + + ad7877_write(spi, AD7877_REG_CTRL2, ts->cmd_crtl2); + + ts->cmd_crtl1 = AD7877_WRITEADD(AD7877_REG_CTRL1) | + AD7877_READADD(AD7877_REG_XPLUS-1) | + AD7877_MODE_SEQ1 | AD7877_DFR; + + ad7877_write(spi, AD7877_REG_CTRL1, ts->cmd_crtl1); + + ts->cmd_dummy = 0; + + m = &ts->msg; + + spi_message_init(m); + + m->context = ts; + + ts->xfer[0].tx_buf = &ts->cmd_crtl1; + ts->xfer[0].len = 2; + ts->xfer[0].cs_change = 1; + + spi_message_add_tail(&ts->xfer[0], m); + + ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */ + ts->xfer[1].len = 2; + ts->xfer[1].cs_change = 1; + + spi_message_add_tail(&ts->xfer[1], m); + + for (i = 0; i < AD7877_NR_SENSE; i++) { + ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i]; + ts->xfer[i + 2].len = 2; + if (i < (AD7877_NR_SENSE - 1)) + ts->xfer[i + 2].cs_change = 1; + spi_message_add_tail(&ts->xfer[i + 2], m); + } +} + +static int ad7877_probe(struct spi_device *spi) +{ + struct ad7877 *ts; + struct input_dev *input_dev; + struct ad7877_platform_data *pdata = spi->dev.platform_data; + int err; + u16 verify; + + if (!spi->irq) { + dev_dbg(&spi->dev, "no IRQ?\n"); + return -ENODEV; + } + + if (!pdata) { + dev_dbg(&spi->dev, "no platform data?\n"); + return -ENODEV; + } + + /* don't exceed max specified SPI CLK frequency */ + if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { + dev_dbg(&spi->dev, "SPI CLK %d Hz?\n",spi->max_speed_hz); + return -EINVAL; + } + + spi->bits_per_word = 16; + err = spi_setup(spi); + if (err) { + dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n"); + return err; + } + + ts = kzalloc(sizeof(struct ad7877), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + spi_set_drvdata(spi, ts); + ts->spi = spi; + ts->input = input_dev; + + setup_timer(&ts->timer, ad7877_timer, (unsigned long) ts); + mutex_init(&ts->mutex); + spin_lock_init(&ts->lock); + + ts->model = pdata->model ? : 7877; + ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; + ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; + ts->pressure_max = pdata->pressure_max ? : ~0; + + ts->stopacq_polarity = pdata->stopacq_polarity; + ts->first_conversion_delay = pdata->first_conversion_delay; + ts->acquisition_time = pdata->acquisition_time; + ts->averaging = pdata->averaging; + ts->pen_down_acc_interval = pdata->pen_down_acc_interval; + + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); + + input_dev->name = "AD7877 Touchscreen"; + input_dev->phys = ts->phys; + input_dev->dev.parent = &spi->dev; + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(ABS_X, input_dev->absbit); + __set_bit(ABS_Y, input_dev->absbit); + __set_bit(ABS_PRESSURE, input_dev->absbit); + + input_set_abs_params(input_dev, ABS_X, + pdata->x_min ? : 0, + pdata->x_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_Y, + pdata->y_min ? : 0, + pdata->y_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + pdata->pressure_min, pdata->pressure_max, 0, 0); + + ad7877_write(spi, AD7877_REG_SEQ1, AD7877_MM_SEQUENCE); + + verify = ad7877_read(spi, AD7877_REG_SEQ1); + + if (verify != AD7877_MM_SEQUENCE){ + dev_err(&spi->dev, "%s: Failed to probe %s\n", + dev_name(&spi->dev), input_dev->name); + err = -ENODEV; + goto err_free_mem; + } + + if (gpio3) + ad7877_write(spi, AD7877_REG_EXTWRITE, AD7877_EXTW_GPIO_3_CONF); + + ad7877_setup_ts_def_msg(spi, ts); + + /* Request AD7877 /DAV GPIO interrupt */ + + err = request_threaded_irq(spi->irq, NULL, ad7877_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + spi->dev.driver->name, ts); + if (err) { + dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); + goto err_free_mem; + } + + err = sysfs_create_group(&spi->dev.kobj, &ad7877_attr_group); + if (err) + goto err_free_irq; + + err = input_register_device(input_dev); + if (err) + goto err_remove_attr_group; + + return 0; + +err_remove_attr_group: + sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group); +err_free_irq: + free_irq(spi->irq, ts); +err_free_mem: + input_free_device(input_dev); + kfree(ts); + spi_set_drvdata(spi, NULL); + return err; +} + +static int ad7877_remove(struct spi_device *spi) +{ + struct ad7877 *ts = spi_get_drvdata(spi); + + sysfs_remove_group(&spi->dev.kobj, &ad7877_attr_group); + + ad7877_disable(ts); + free_irq(ts->spi->irq, ts); + + input_unregister_device(ts->input); + kfree(ts); + + dev_dbg(&spi->dev, "unregistered touchscreen\n"); + spi_set_drvdata(spi, NULL); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int ad7877_suspend(struct device *dev) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + ad7877_disable(ts); + + return 0; +} + +static int ad7877_resume(struct device *dev) +{ + struct ad7877 *ts = dev_get_drvdata(dev); + + ad7877_enable(ts); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ad7877_pm, ad7877_suspend, ad7877_resume); + +static struct spi_driver ad7877_driver = { + .driver = { + .name = "ad7877", + .owner = THIS_MODULE, + .pm = &ad7877_pm, + }, + .probe = ad7877_probe, + .remove = ad7877_remove, +}; + +module_spi_driver(ad7877_driver); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("AD7877 touchscreen Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:ad7877"); diff --git a/drivers/input/touchscreen/ad7879-i2c.c b/drivers/input/touchscreen/ad7879-i2c.c new file mode 100644 index 00000000..dcf39077 --- /dev/null +++ b/drivers/input/touchscreen/ad7879-i2c.c @@ -0,0 +1,109 @@ +/* + * AD7879-1/AD7889-1 touchscreen (I2C bus) + * + * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include /* BUS_I2C */ +#include +#include +#include +#include + +#include "ad7879.h" + +#define AD7879_DEVID 0x79 /* AD7879-1/AD7889-1 */ + +/* All registers are word-sized. + * AD7879 uses a high-byte first convention. + */ +static int ad7879_i2c_read(struct device *dev, u8 reg) +{ + struct i2c_client *client = to_i2c_client(dev); + + return i2c_smbus_read_word_swapped(client, reg); +} + +static int ad7879_i2c_multi_read(struct device *dev, + u8 first_reg, u8 count, u16 *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + u8 idx; + + i2c_smbus_read_i2c_block_data(client, first_reg, count * 2, (u8 *)buf); + + for (idx = 0; idx < count; ++idx) + buf[idx] = swab16(buf[idx]); + + return 0; +} + +static int ad7879_i2c_write(struct device *dev, u8 reg, u16 val) +{ + struct i2c_client *client = to_i2c_client(dev); + + return i2c_smbus_write_word_swapped(client, reg, val); +} + +static const struct ad7879_bus_ops ad7879_i2c_bus_ops = { + .bustype = BUS_I2C, + .read = ad7879_i2c_read, + .multi_read = ad7879_i2c_multi_read, + .write = ad7879_i2c_write, +}; + +static int ad7879_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct ad7879 *ts; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_WORD_DATA)) { + dev_err(&client->dev, "SMBUS Word Data not Supported\n"); + return -EIO; + } + + ts = ad7879_probe(&client->dev, AD7879_DEVID, client->irq, + &ad7879_i2c_bus_ops); + if (IS_ERR(ts)) + return PTR_ERR(ts); + + i2c_set_clientdata(client, ts); + + return 0; +} + +static int ad7879_i2c_remove(struct i2c_client *client) +{ + struct ad7879 *ts = i2c_get_clientdata(client); + + ad7879_remove(ts); + + return 0; +} + +static const struct i2c_device_id ad7879_id[] = { + { "ad7879", 0 }, + { "ad7889", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, ad7879_id); + +static struct i2c_driver ad7879_i2c_driver = { + .driver = { + .name = "ad7879", + .owner = THIS_MODULE, + .pm = &ad7879_pm_ops, + }, + .probe = ad7879_i2c_probe, + .remove = ad7879_i2c_remove, + .id_table = ad7879_id, +}; + +module_i2c_driver(ad7879_i2c_driver); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("AD7879(-1) touchscreen I2C bus driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ad7879-spi.c b/drivers/input/touchscreen/ad7879-spi.c new file mode 100644 index 00000000..606da5bd --- /dev/null +++ b/drivers/input/touchscreen/ad7879-spi.c @@ -0,0 +1,165 @@ +/* + * AD7879/AD7889 touchscreen (SPI bus) + * + * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#include /* BUS_SPI */ +#include +#include +#include + +#include "ad7879.h" + +#define AD7879_DEVID 0x7A /* AD7879/AD7889 */ + +#define MAX_SPI_FREQ_HZ 5000000 +#define AD7879_CMD_MAGIC 0xE000 +#define AD7879_CMD_READ (1 << 10) +#define AD7879_CMD(reg) (AD7879_CMD_MAGIC | ((reg) & 0xF)) +#define AD7879_WRITECMD(reg) (AD7879_CMD(reg)) +#define AD7879_READCMD(reg) (AD7879_CMD(reg) | AD7879_CMD_READ) + +/* + * ad7879_read/write are only used for initial setup and for sysfs controls. + * The main traffic is done in ad7879_collect(). + */ + +static int ad7879_spi_xfer(struct spi_device *spi, + u16 cmd, u8 count, u16 *tx_buf, u16 *rx_buf) +{ + struct spi_message msg; + struct spi_transfer *xfers; + void *spi_data; + u16 *command; + u16 *_rx_buf = _rx_buf; /* shut gcc up */ + u8 idx; + int ret; + + xfers = spi_data = kzalloc(sizeof(*xfers) * (count + 2), GFP_KERNEL); + if (!spi_data) + return -ENOMEM; + + spi_message_init(&msg); + + command = spi_data; + command[0] = cmd; + if (count == 1) { + /* ad7879_spi_{read,write} gave us buf on stack */ + command[1] = *tx_buf; + tx_buf = &command[1]; + _rx_buf = rx_buf; + rx_buf = &command[2]; + } + + ++xfers; + xfers[0].tx_buf = command; + xfers[0].len = 2; + spi_message_add_tail(&xfers[0], &msg); + ++xfers; + + for (idx = 0; idx < count; ++idx) { + if (rx_buf) + xfers[idx].rx_buf = &rx_buf[idx]; + if (tx_buf) + xfers[idx].tx_buf = &tx_buf[idx]; + xfers[idx].len = 2; + spi_message_add_tail(&xfers[idx], &msg); + } + + ret = spi_sync(spi, &msg); + + if (count == 1) + _rx_buf[0] = command[2]; + + kfree(spi_data); + + return ret; +} + +static int ad7879_spi_multi_read(struct device *dev, + u8 first_reg, u8 count, u16 *buf) +{ + struct spi_device *spi = to_spi_device(dev); + + return ad7879_spi_xfer(spi, AD7879_READCMD(first_reg), count, NULL, buf); +} + +static int ad7879_spi_read(struct device *dev, u8 reg) +{ + struct spi_device *spi = to_spi_device(dev); + u16 ret, dummy; + + return ad7879_spi_xfer(spi, AD7879_READCMD(reg), 1, &dummy, &ret) ? : ret; +} + +static int ad7879_spi_write(struct device *dev, u8 reg, u16 val) +{ + struct spi_device *spi = to_spi_device(dev); + u16 dummy; + + return ad7879_spi_xfer(spi, AD7879_WRITECMD(reg), 1, &val, &dummy); +} + +static const struct ad7879_bus_ops ad7879_spi_bus_ops = { + .bustype = BUS_SPI, + .read = ad7879_spi_read, + .multi_read = ad7879_spi_multi_read, + .write = ad7879_spi_write, +}; + +static int ad7879_spi_probe(struct spi_device *spi) +{ + struct ad7879 *ts; + int err; + + /* don't exceed max specified SPI CLK frequency */ + if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { + dev_err(&spi->dev, "SPI CLK %d Hz?\n", spi->max_speed_hz); + return -EINVAL; + } + + spi->bits_per_word = 16; + err = spi_setup(spi); + if (err) { + dev_dbg(&spi->dev, "spi master doesn't support 16 bits/word\n"); + return err; + } + + ts = ad7879_probe(&spi->dev, AD7879_DEVID, spi->irq, &ad7879_spi_bus_ops); + if (IS_ERR(ts)) + return PTR_ERR(ts); + + spi_set_drvdata(spi, ts); + + return 0; +} + +static int ad7879_spi_remove(struct spi_device *spi) +{ + struct ad7879 *ts = spi_get_drvdata(spi); + + ad7879_remove(ts); + spi_set_drvdata(spi, NULL); + + return 0; +} + +static struct spi_driver ad7879_spi_driver = { + .driver = { + .name = "ad7879", + .owner = THIS_MODULE, + .pm = &ad7879_pm_ops, + }, + .probe = ad7879_spi_probe, + .remove = ad7879_spi_remove, +}; + +module_spi_driver(ad7879_spi_driver); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("AD7879(-1) touchscreen SPI bus driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:ad7879"); diff --git a/drivers/input/touchscreen/ad7879.c b/drivers/input/touchscreen/ad7879.c new file mode 100644 index 00000000..facd3057 --- /dev/null +++ b/drivers/input/touchscreen/ad7879.c @@ -0,0 +1,654 @@ +/* + * AD7879/AD7889 based touchscreen and GPIO driver + * + * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + * + * History: + * Copyright (c) 2005 David Brownell + * Copyright (c) 2006 Nokia Corporation + * Various changes: Imre Deak + * + * Using code from: + * - corgi_ts.c + * Copyright (C) 2004-2005 Richard Purdie + * - omap_ts.[hc], ads7846.h, ts_osk.c + * Copyright (C) 2002 MontaVista Software + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2005 Dirk Behme + * - ad7877.c + * Copyright (C) 2006-2008 Analog Devices Inc. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "ad7879.h" + +#define AD7879_REG_ZEROS 0 +#define AD7879_REG_CTRL1 1 +#define AD7879_REG_CTRL2 2 +#define AD7879_REG_CTRL3 3 +#define AD7879_REG_AUX1HIGH 4 +#define AD7879_REG_AUX1LOW 5 +#define AD7879_REG_TEMP1HIGH 6 +#define AD7879_REG_TEMP1LOW 7 +#define AD7879_REG_XPLUS 8 +#define AD7879_REG_YPLUS 9 +#define AD7879_REG_Z1 10 +#define AD7879_REG_Z2 11 +#define AD7879_REG_AUXVBAT 12 +#define AD7879_REG_TEMP 13 +#define AD7879_REG_REVID 14 + +/* Control REG 1 */ +#define AD7879_TMR(x) ((x & 0xFF) << 0) +#define AD7879_ACQ(x) ((x & 0x3) << 8) +#define AD7879_MODE_NOC (0 << 10) /* Do not convert */ +#define AD7879_MODE_SCC (1 << 10) /* Single channel conversion */ +#define AD7879_MODE_SEQ0 (2 << 10) /* Sequence 0 in Slave Mode */ +#define AD7879_MODE_SEQ1 (3 << 10) /* Sequence 1 in Master Mode */ +#define AD7879_MODE_INT (1 << 15) /* PENIRQ disabled INT enabled */ + +/* Control REG 2 */ +#define AD7879_FCD(x) ((x & 0x3) << 0) +#define AD7879_RESET (1 << 4) +#define AD7879_MFS(x) ((x & 0x3) << 5) +#define AD7879_AVG(x) ((x & 0x3) << 7) +#define AD7879_SER (1 << 9) /* non-differential */ +#define AD7879_DFR (0 << 9) /* differential */ +#define AD7879_GPIOPOL (1 << 10) +#define AD7879_GPIODIR (1 << 11) +#define AD7879_GPIO_DATA (1 << 12) +#define AD7879_GPIO_EN (1 << 13) +#define AD7879_PM(x) ((x & 0x3) << 14) +#define AD7879_PM_SHUTDOWN (0) +#define AD7879_PM_DYN (1) +#define AD7879_PM_FULLON (2) + +/* Control REG 3 */ +#define AD7879_TEMPMASK_BIT (1<<15) +#define AD7879_AUXVBATMASK_BIT (1<<14) +#define AD7879_INTMODE_BIT (1<<13) +#define AD7879_GPIOALERTMASK_BIT (1<<12) +#define AD7879_AUXLOW_BIT (1<<11) +#define AD7879_AUXHIGH_BIT (1<<10) +#define AD7879_TEMPLOW_BIT (1<<9) +#define AD7879_TEMPHIGH_BIT (1<<8) +#define AD7879_YPLUS_BIT (1<<7) +#define AD7879_XPLUS_BIT (1<<6) +#define AD7879_Z1_BIT (1<<5) +#define AD7879_Z2_BIT (1<<4) +#define AD7879_AUX_BIT (1<<3) +#define AD7879_VBAT_BIT (1<<2) +#define AD7879_TEMP_BIT (1<<1) + +enum { + AD7879_SEQ_XPOS = 0, + AD7879_SEQ_YPOS = 1, + AD7879_SEQ_Z1 = 2, + AD7879_SEQ_Z2 = 3, + AD7879_NR_SENSE = 4, +}; + +#define MAX_12BIT ((1<<12)-1) +#define TS_PEN_UP_TIMEOUT msecs_to_jiffies(50) + +struct ad7879 { + const struct ad7879_bus_ops *bops; + + struct device *dev; + struct input_dev *input; + struct timer_list timer; +#ifdef CONFIG_GPIOLIB + struct gpio_chip gc; + struct mutex mutex; +#endif + unsigned int irq; + bool disabled; /* P: input->mutex */ + bool suspended; /* P: input->mutex */ + bool swap_xy; + u16 conversion_data[AD7879_NR_SENSE]; + char phys[32]; + u8 first_conversion_delay; + u8 acquisition_time; + u8 averaging; + u8 pen_down_acc_interval; + u8 median; + u16 x_plate_ohms; + u16 pressure_max; + u16 cmd_crtl1; + u16 cmd_crtl2; + u16 cmd_crtl3; + int x; + int y; + int Rt; +}; + +static int ad7879_read(struct ad7879 *ts, u8 reg) +{ + return ts->bops->read(ts->dev, reg); +} + +static int ad7879_multi_read(struct ad7879 *ts, u8 first_reg, u8 count, u16 *buf) +{ + return ts->bops->multi_read(ts->dev, first_reg, count, buf); +} + +static int ad7879_write(struct ad7879 *ts, u8 reg, u16 val) +{ + return ts->bops->write(ts->dev, reg, val); +} + +static int ad7879_report(struct ad7879 *ts) +{ + struct input_dev *input_dev = ts->input; + unsigned Rt; + u16 x, y, z1, z2; + + x = ts->conversion_data[AD7879_SEQ_XPOS] & MAX_12BIT; + y = ts->conversion_data[AD7879_SEQ_YPOS] & MAX_12BIT; + z1 = ts->conversion_data[AD7879_SEQ_Z1] & MAX_12BIT; + z2 = ts->conversion_data[AD7879_SEQ_Z2] & MAX_12BIT; + + if (ts->swap_xy) + swap(x, y); + + /* + * The samples processed here are already preprocessed by the AD7879. + * The preprocessing function consists of a median and an averaging + * filter. The combination of these two techniques provides a robust + * solution, discarding the spurious noise in the signal and keeping + * only the data of interest. The size of both filters is + * programmable. (dev.platform_data, see linux/spi/ad7879.h) Other + * user-programmable conversion controls include variable acquisition + * time, and first conversion delay. Up to 16 averages can be taken + * per conversion. + */ + + if (likely(x && z1)) { + /* compute touch pressure resistance using equation #1 */ + Rt = (z2 - z1) * x * ts->x_plate_ohms; + Rt /= z1; + Rt = (Rt + 2047) >> 12; + + /* + * Sample found inconsistent, pressure is beyond + * the maximum. Don't report it to user space. + */ + if (Rt > ts->pressure_max) + return -EINVAL; + + /* + * Note that we delay reporting events by one sample. + * This is done to avoid reporting last sample of the + * touch sequence, which may be incomplete if finger + * leaves the surface before last reading is taken. + */ + if (timer_pending(&ts->timer)) { + /* Touch continues */ + input_report_key(input_dev, BTN_TOUCH, 1); + input_report_abs(input_dev, ABS_X, ts->x); + input_report_abs(input_dev, ABS_Y, ts->y); + input_report_abs(input_dev, ABS_PRESSURE, ts->Rt); + input_sync(input_dev); + } + + ts->x = x; + ts->y = y; + ts->Rt = Rt; + + return 0; + } + + return -EINVAL; +} + +static void ad7879_ts_event_release(struct ad7879 *ts) +{ + struct input_dev *input_dev = ts->input; + + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_report_key(input_dev, BTN_TOUCH, 0); + input_sync(input_dev); +} + +static void ad7879_timer(unsigned long handle) +{ + struct ad7879 *ts = (void *)handle; + + ad7879_ts_event_release(ts); +} + +static irqreturn_t ad7879_irq(int irq, void *handle) +{ + struct ad7879 *ts = handle; + + ad7879_multi_read(ts, AD7879_REG_XPLUS, AD7879_NR_SENSE, ts->conversion_data); + + if (!ad7879_report(ts)) + mod_timer(&ts->timer, jiffies + TS_PEN_UP_TIMEOUT); + + return IRQ_HANDLED; +} + +static void __ad7879_enable(struct ad7879 *ts) +{ + ad7879_write(ts, AD7879_REG_CTRL2, ts->cmd_crtl2); + ad7879_write(ts, AD7879_REG_CTRL3, ts->cmd_crtl3); + ad7879_write(ts, AD7879_REG_CTRL1, ts->cmd_crtl1); + + enable_irq(ts->irq); +} + +static void __ad7879_disable(struct ad7879 *ts) +{ + u16 reg = (ts->cmd_crtl2 & ~AD7879_PM(-1)) | + AD7879_PM(AD7879_PM_SHUTDOWN); + disable_irq(ts->irq); + + if (del_timer_sync(&ts->timer)) + ad7879_ts_event_release(ts); + + ad7879_write(ts, AD7879_REG_CTRL2, reg); +} + + +static int ad7879_open(struct input_dev *input) +{ + struct ad7879 *ts = input_get_drvdata(input); + + /* protected by input->mutex */ + if (!ts->disabled && !ts->suspended) + __ad7879_enable(ts); + + return 0; +} + +static void ad7879_close(struct input_dev* input) +{ + struct ad7879 *ts = input_get_drvdata(input); + + /* protected by input->mutex */ + if (!ts->disabled && !ts->suspended) + __ad7879_disable(ts); +} + +#ifdef CONFIG_PM_SLEEP +static int ad7879_suspend(struct device *dev) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + + mutex_lock(&ts->input->mutex); + + if (!ts->suspended && !ts->disabled && ts->input->users) + __ad7879_disable(ts); + + ts->suspended = true; + + mutex_unlock(&ts->input->mutex); + + return 0; +} + +static int ad7879_resume(struct device *dev) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + + mutex_lock(&ts->input->mutex); + + if (ts->suspended && !ts->disabled && ts->input->users) + __ad7879_enable(ts); + + ts->suspended = false; + + mutex_unlock(&ts->input->mutex); + + return 0; +} +#endif + +SIMPLE_DEV_PM_OPS(ad7879_pm_ops, ad7879_suspend, ad7879_resume); +EXPORT_SYMBOL(ad7879_pm_ops); + +static void ad7879_toggle(struct ad7879 *ts, bool disable) +{ + mutex_lock(&ts->input->mutex); + + if (!ts->suspended && ts->input->users != 0) { + + if (disable) { + if (ts->disabled) + __ad7879_enable(ts); + } else { + if (!ts->disabled) + __ad7879_disable(ts); + } + } + + ts->disabled = disable; + + mutex_unlock(&ts->input->mutex); +} + +static ssize_t ad7879_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->disabled); +} + +static ssize_t ad7879_disable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ad7879 *ts = dev_get_drvdata(dev); + unsigned int val; + int error; + + error = kstrtouint(buf, 10, &val); + if (error) + return error; + + ad7879_toggle(ts, val); + + return count; +} + +static DEVICE_ATTR(disable, 0664, ad7879_disable_show, ad7879_disable_store); + +static struct attribute *ad7879_attributes[] = { + &dev_attr_disable.attr, + NULL +}; + +static const struct attribute_group ad7879_attr_group = { + .attrs = ad7879_attributes, +}; + +#ifdef CONFIG_GPIOLIB +static int ad7879_gpio_direction_input(struct gpio_chip *chip, + unsigned gpio) +{ + struct ad7879 *ts = container_of(chip, struct ad7879, gc); + int err; + + mutex_lock(&ts->mutex); + ts->cmd_crtl2 |= AD7879_GPIO_EN | AD7879_GPIODIR | AD7879_GPIOPOL; + err = ad7879_write(ts, AD7879_REG_CTRL2, ts->cmd_crtl2); + mutex_unlock(&ts->mutex); + + return err; +} + +static int ad7879_gpio_direction_output(struct gpio_chip *chip, + unsigned gpio, int level) +{ + struct ad7879 *ts = container_of(chip, struct ad7879, gc); + int err; + + mutex_lock(&ts->mutex); + ts->cmd_crtl2 &= ~AD7879_GPIODIR; + ts->cmd_crtl2 |= AD7879_GPIO_EN | AD7879_GPIOPOL; + if (level) + ts->cmd_crtl2 |= AD7879_GPIO_DATA; + else + ts->cmd_crtl2 &= ~AD7879_GPIO_DATA; + + err = ad7879_write(ts, AD7879_REG_CTRL2, ts->cmd_crtl2); + mutex_unlock(&ts->mutex); + + return err; +} + +static int ad7879_gpio_get_value(struct gpio_chip *chip, unsigned gpio) +{ + struct ad7879 *ts = container_of(chip, struct ad7879, gc); + u16 val; + + mutex_lock(&ts->mutex); + val = ad7879_read(ts, AD7879_REG_CTRL2); + mutex_unlock(&ts->mutex); + + return !!(val & AD7879_GPIO_DATA); +} + +static void ad7879_gpio_set_value(struct gpio_chip *chip, + unsigned gpio, int value) +{ + struct ad7879 *ts = container_of(chip, struct ad7879, gc); + + mutex_lock(&ts->mutex); + if (value) + ts->cmd_crtl2 |= AD7879_GPIO_DATA; + else + ts->cmd_crtl2 &= ~AD7879_GPIO_DATA; + + ad7879_write(ts, AD7879_REG_CTRL2, ts->cmd_crtl2); + mutex_unlock(&ts->mutex); +} + +static int ad7879_gpio_add(struct ad7879 *ts, + const struct ad7879_platform_data *pdata) +{ + int ret = 0; + + mutex_init(&ts->mutex); + + if (pdata->gpio_export) { + ts->gc.direction_input = ad7879_gpio_direction_input; + ts->gc.direction_output = ad7879_gpio_direction_output; + ts->gc.get = ad7879_gpio_get_value; + ts->gc.set = ad7879_gpio_set_value; + ts->gc.can_sleep = 1; + ts->gc.base = pdata->gpio_base; + ts->gc.ngpio = 1; + ts->gc.label = "AD7879-GPIO"; + ts->gc.owner = THIS_MODULE; + ts->gc.dev = ts->dev; + + ret = gpiochip_add(&ts->gc); + if (ret) + dev_err(ts->dev, "failed to register gpio %d\n", + ts->gc.base); + } + + return ret; +} + +static void ad7879_gpio_remove(struct ad7879 *ts) +{ + const struct ad7879_platform_data *pdata = ts->dev->platform_data; + int ret; + + if (pdata->gpio_export) { + ret = gpiochip_remove(&ts->gc); + if (ret) + dev_err(ts->dev, "failed to remove gpio %d\n", + ts->gc.base); + } +} +#else +static inline int ad7879_gpio_add(struct ad7879 *ts, + const struct ad7879_platform_data *pdata) +{ + return 0; +} + +static inline void ad7879_gpio_remove(struct ad7879 *ts) +{ +} +#endif + +struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned int irq, + const struct ad7879_bus_ops *bops) +{ + struct ad7879_platform_data *pdata = dev->platform_data; + struct ad7879 *ts; + struct input_dev *input_dev; + int err; + u16 revid; + + if (!irq) { + dev_err(dev, "no IRQ?\n"); + err = -EINVAL; + goto err_out; + } + + if (!pdata) { + dev_err(dev, "no platform data?\n"); + err = -EINVAL; + goto err_out; + } + + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + ts->bops = bops; + ts->dev = dev; + ts->input = input_dev; + ts->irq = irq; + ts->swap_xy = pdata->swap_xy; + + setup_timer(&ts->timer, ad7879_timer, (unsigned long) ts); + + ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; + ts->pressure_max = pdata->pressure_max ? : ~0; + + ts->first_conversion_delay = pdata->first_conversion_delay; + ts->acquisition_time = pdata->acquisition_time; + ts->averaging = pdata->averaging; + ts->pen_down_acc_interval = pdata->pen_down_acc_interval; + ts->median = pdata->median; + + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(dev)); + + input_dev->name = "AD7879 Touchscreen"; + input_dev->phys = ts->phys; + input_dev->dev.parent = dev; + input_dev->id.bustype = bops->bustype; + + input_dev->open = ad7879_open; + input_dev->close = ad7879_close; + + input_set_drvdata(input_dev, ts); + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(ABS_X, input_dev->absbit); + __set_bit(ABS_Y, input_dev->absbit); + __set_bit(ABS_PRESSURE, input_dev->absbit); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_X, + pdata->x_min ? : 0, + pdata->x_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_Y, + pdata->y_min ? : 0, + pdata->y_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + pdata->pressure_min, pdata->pressure_max, 0, 0); + + err = ad7879_write(ts, AD7879_REG_CTRL2, AD7879_RESET); + if (err < 0) { + dev_err(dev, "Failed to write %s\n", input_dev->name); + goto err_free_mem; + } + + revid = ad7879_read(ts, AD7879_REG_REVID); + input_dev->id.product = (revid & 0xff); + input_dev->id.version = revid >> 8; + if (input_dev->id.product != devid) { + dev_err(dev, "Failed to probe %s (%x vs %x)\n", + input_dev->name, devid, revid); + err = -ENODEV; + goto err_free_mem; + } + + ts->cmd_crtl3 = AD7879_YPLUS_BIT | + AD7879_XPLUS_BIT | + AD7879_Z2_BIT | + AD7879_Z1_BIT | + AD7879_TEMPMASK_BIT | + AD7879_AUXVBATMASK_BIT | + AD7879_GPIOALERTMASK_BIT; + + ts->cmd_crtl2 = AD7879_PM(AD7879_PM_DYN) | AD7879_DFR | + AD7879_AVG(ts->averaging) | + AD7879_MFS(ts->median) | + AD7879_FCD(ts->first_conversion_delay); + + ts->cmd_crtl1 = AD7879_MODE_INT | AD7879_MODE_SEQ1 | + AD7879_ACQ(ts->acquisition_time) | + AD7879_TMR(ts->pen_down_acc_interval); + + err = request_threaded_irq(ts->irq, NULL, ad7879_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + dev_name(dev), ts); + if (err) { + dev_err(dev, "irq %d busy?\n", ts->irq); + goto err_free_mem; + } + + __ad7879_disable(ts); + + err = sysfs_create_group(&dev->kobj, &ad7879_attr_group); + if (err) + goto err_free_irq; + + err = ad7879_gpio_add(ts, pdata); + if (err) + goto err_remove_attr; + + err = input_register_device(input_dev); + if (err) + goto err_remove_gpio; + + return ts; + +err_remove_gpio: + ad7879_gpio_remove(ts); +err_remove_attr: + sysfs_remove_group(&dev->kobj, &ad7879_attr_group); +err_free_irq: + free_irq(ts->irq, ts); +err_free_mem: + input_free_device(input_dev); + kfree(ts); +err_out: + return ERR_PTR(err); +} +EXPORT_SYMBOL(ad7879_probe); + +void ad7879_remove(struct ad7879 *ts) +{ + ad7879_gpio_remove(ts); + sysfs_remove_group(&ts->dev->kobj, &ad7879_attr_group); + free_irq(ts->irq, ts); + input_unregister_device(ts->input); + kfree(ts); +} +EXPORT_SYMBOL(ad7879_remove); + +MODULE_AUTHOR("Michael Hennerich "); +MODULE_DESCRIPTION("AD7879(-1) touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ad7879.h b/drivers/input/touchscreen/ad7879.h new file mode 100644 index 00000000..6fd13c48 --- /dev/null +++ b/drivers/input/touchscreen/ad7879.h @@ -0,0 +1,30 @@ +/* + * AD7879/AD7889 touchscreen (bus interfaces) + * + * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. + * + * Licensed under the GPL-2 or later. + */ + +#ifndef _AD7879_H_ +#define _AD7879_H_ + +#include + +struct ad7879; +struct device; + +struct ad7879_bus_ops { + u16 bustype; + int (*read)(struct device *dev, u8 reg); + int (*multi_read)(struct device *dev, u8 first_reg, u8 count, u16 *buf); + int (*write)(struct device *dev, u8 reg, u16 val); +}; + +extern const struct dev_pm_ops ad7879_pm_ops; + +struct ad7879 *ad7879_probe(struct device *dev, u8 devid, unsigned irq, + const struct ad7879_bus_ops *bops); +void ad7879_remove(struct ad7879 *); + +#endif diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c new file mode 100644 index 00000000..84ccf140 --- /dev/null +++ b/drivers/input/touchscreen/ads7846.c @@ -0,0 +1,1449 @@ +/* + * ADS7846 based touchscreen and sensor driver + * + * Copyright (c) 2005 David Brownell + * Copyright (c) 2006 Nokia Corporation + * Various changes: Imre Deak + * + * Using code from: + * - corgi_ts.c + * Copyright (C) 2004-2005 Richard Purdie + * - omap_ts.[hc], ads7846.h, ts_osk.c + * Copyright (C) 2002 MontaVista Software + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2005 Dirk Behme + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * This code has been heavily tested on a Nokia 770, and lightly + * tested on other ads7846 devices (OSK/Mistral, Lubbock, Spitz). + * TSC2046 is just newer ads7846 silicon. + * Support for ads7843 tested on Atmel at91sam926x-EK. + * Support for ads7845 has only been stubbed in. + * Support for Analog Devices AD7873 and AD7843 tested. + * + * IRQ handling needs a workaround because of a shortcoming in handling + * edge triggered IRQs on some platforms like the OMAP1/2. These + * platforms don't handle the ARM lazy IRQ disabling properly, thus we + * have to maintain our own SW IRQ disabled status. This should be + * removed as soon as the affected platform's IRQ handling is fixed. + * + * App note sbaa036 talks in more detail about accurate sampling... + * that ought to help in situations like LCDs inducing noise (which + * can also be helped by using synch signals) and more generally. + * This driver tries to utilize the measures described in the app + * note. The strength of filtering can be set in the board-* specific + * files. + */ + +#define TS_POLL_DELAY 1 /* ms delay before the first sample */ +#define TS_POLL_PERIOD 5 /* ms delay between samples */ + +/* this driver doesn't aim at the peak continuous sample rate */ +#define SAMPLE_BITS (8 /*cmd*/ + 16 /*sample*/ + 2 /* before, after */) + +struct ts_event { + /* + * For portability, we can't read 12 bit values using SPI (which + * would make the controller deliver them as native byte order u16 + * with msbs zeroed). Instead, we read them as two 8-bit values, + * *** WHICH NEED BYTESWAPPING *** and range adjustment. + */ + u16 x; + u16 y; + u16 z1, z2; + bool ignore; + u8 x_buf[3]; + u8 y_buf[3]; +}; + +/* + * We allocate this separately to avoid cache line sharing issues when + * driver is used with DMA-based SPI controllers (like atmel_spi) on + * systems where main memory is not DMA-coherent (most non-x86 boards). + */ +struct ads7846_packet { + u8 read_x, read_y, read_z1, read_z2, pwrdown; + u16 dummy; /* for the pwrdown read */ + struct ts_event tc; + /* for ads7845 with mpc5121 psc spi we use 3-byte buffers */ + u8 read_x_cmd[3], read_y_cmd[3], pwrdown_cmd[3]; +}; + +struct ads7846 { + struct input_dev *input; + char phys[32]; + char name[32]; + + struct spi_device *spi; + struct regulator *reg; + +#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) + struct attribute_group *attr_group; + struct device *hwmon; +#endif + + u16 model; + u16 vref_mv; + u16 vref_delay_usecs; + u16 x_plate_ohms; + u16 pressure_max; + + bool swap_xy; + bool use_internal; + + struct ads7846_packet *packet; + + struct spi_transfer xfer[18]; + struct spi_message msg[5]; + int msg_count; + wait_queue_head_t wait; + + bool pendown; + + int read_cnt; + int read_rep; + int last_read; + + u16 debounce_max; + u16 debounce_tol; + u16 debounce_rep; + + u16 penirq_recheck_delay_usecs; + + struct mutex lock; + bool stopped; /* P: lock */ + bool disabled; /* P: lock */ + bool suspended; /* P: lock */ + + int (*filter)(void *data, int data_idx, int *val); + void *filter_data; + void (*filter_cleanup)(void *data); + int (*get_pendown_state)(void); + int gpio_pendown; + + void (*wait_for_sync)(void); +}; + +/* leave chip selected when we're done, for quicker re-select? */ +#if 0 +#define CS_CHANGE(xfer) ((xfer).cs_change = 1) +#else +#define CS_CHANGE(xfer) ((xfer).cs_change = 0) +#endif + +/*--------------------------------------------------------------------------*/ + +/* The ADS7846 has touchscreen and other sensors. + * Earlier ads784x chips are somewhat compatible. + */ +#define ADS_START (1 << 7) +#define ADS_A2A1A0_d_y (1 << 4) /* differential */ +#define ADS_A2A1A0_d_z1 (3 << 4) /* differential */ +#define ADS_A2A1A0_d_z2 (4 << 4) /* differential */ +#define ADS_A2A1A0_d_x (5 << 4) /* differential */ +#define ADS_A2A1A0_temp0 (0 << 4) /* non-differential */ +#define ADS_A2A1A0_vbatt (2 << 4) /* non-differential */ +#define ADS_A2A1A0_vaux (6 << 4) /* non-differential */ +#define ADS_A2A1A0_temp1 (7 << 4) /* non-differential */ +#define ADS_8_BIT (1 << 3) +#define ADS_12_BIT (0 << 3) +#define ADS_SER (1 << 2) /* non-differential */ +#define ADS_DFR (0 << 2) /* differential */ +#define ADS_PD10_PDOWN (0 << 0) /* low power mode + penirq */ +#define ADS_PD10_ADC_ON (1 << 0) /* ADC on */ +#define ADS_PD10_REF_ON (2 << 0) /* vREF on + penirq */ +#define ADS_PD10_ALL_ON (3 << 0) /* ADC + vREF on */ + +#define MAX_12BIT ((1<<12)-1) + +/* leave ADC powered up (disables penirq) between differential samples */ +#define READ_12BIT_DFR(x, adc, vref) (ADS_START | ADS_A2A1A0_d_ ## x \ + | ADS_12_BIT | ADS_DFR | \ + (adc ? ADS_PD10_ADC_ON : 0) | (vref ? ADS_PD10_REF_ON : 0)) + +#define READ_Y(vref) (READ_12BIT_DFR(y, 1, vref)) +#define READ_Z1(vref) (READ_12BIT_DFR(z1, 1, vref)) +#define READ_Z2(vref) (READ_12BIT_DFR(z2, 1, vref)) + +#define READ_X(vref) (READ_12BIT_DFR(x, 1, vref)) +#define PWRDOWN (READ_12BIT_DFR(y, 0, 0)) /* LAST */ + +/* single-ended samples need to first power up reference voltage; + * we leave both ADC and VREF powered + */ +#define READ_12BIT_SER(x) (ADS_START | ADS_A2A1A0_ ## x \ + | ADS_12_BIT | ADS_SER) + +#define REF_ON (READ_12BIT_DFR(x, 1, 1)) +#define REF_OFF (READ_12BIT_DFR(y, 0, 0)) + +/* Must be called with ts->lock held */ +static void ads7846_stop(struct ads7846 *ts) +{ + if (!ts->disabled && !ts->suspended) { + /* Signal IRQ thread to stop polling and disable the handler. */ + ts->stopped = true; + mb(); + wake_up(&ts->wait); + disable_irq(ts->spi->irq); + } +} + +/* Must be called with ts->lock held */ +static void ads7846_restart(struct ads7846 *ts) +{ + if (!ts->disabled && !ts->suspended) { + /* Tell IRQ thread that it may poll the device. */ + ts->stopped = false; + mb(); + enable_irq(ts->spi->irq); + } +} + +/* Must be called with ts->lock held */ +static void __ads7846_disable(struct ads7846 *ts) +{ + ads7846_stop(ts); + regulator_disable(ts->reg); + + /* + * We know the chip's in low power mode since we always + * leave it that way after every request + */ +} + +/* Must be called with ts->lock held */ +static void __ads7846_enable(struct ads7846 *ts) +{ + int error; + + error = regulator_enable(ts->reg); + if (error != 0) + dev_err(&ts->spi->dev, "Failed to enable supply: %d\n", error); + + ads7846_restart(ts); +} + +static void ads7846_disable(struct ads7846 *ts) +{ + mutex_lock(&ts->lock); + + if (!ts->disabled) { + + if (!ts->suspended) + __ads7846_disable(ts); + + ts->disabled = true; + } + + mutex_unlock(&ts->lock); +} + +static void ads7846_enable(struct ads7846 *ts) +{ + mutex_lock(&ts->lock); + + if (ts->disabled) { + + ts->disabled = false; + + if (!ts->suspended) + __ads7846_enable(ts); + } + + mutex_unlock(&ts->lock); +} + +/*--------------------------------------------------------------------------*/ + +/* + * Non-touchscreen sensors only use single-ended conversions. + * The range is GND..vREF. The ads7843 and ads7835 must use external vREF; + * ads7846 lets that pin be unconnected, to use internal vREF. + */ + +struct ser_req { + u8 ref_on; + u8 command; + u8 ref_off; + u16 scratch; + struct spi_message msg; + struct spi_transfer xfer[6]; + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + __be16 sample ____cacheline_aligned; +}; + +struct ads7845_ser_req { + u8 command[3]; + struct spi_message msg; + struct spi_transfer xfer[2]; + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + u8 sample[3] ____cacheline_aligned; +}; + +static int ads7846_read12_ser(struct device *dev, unsigned command) +{ + struct spi_device *spi = to_spi_device(dev); + struct ads7846 *ts = dev_get_drvdata(dev); + struct ser_req *req; + int status; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + /* maybe turn on internal vREF, and let it settle */ + if (ts->use_internal) { + req->ref_on = REF_ON; + req->xfer[0].tx_buf = &req->ref_on; + req->xfer[0].len = 1; + spi_message_add_tail(&req->xfer[0], &req->msg); + + req->xfer[1].rx_buf = &req->scratch; + req->xfer[1].len = 2; + + /* for 1uF, settle for 800 usec; no cap, 100 usec. */ + req->xfer[1].delay_usecs = ts->vref_delay_usecs; + spi_message_add_tail(&req->xfer[1], &req->msg); + + /* Enable reference voltage */ + command |= ADS_PD10_REF_ON; + } + + /* Enable ADC in every case */ + command |= ADS_PD10_ADC_ON; + + /* take sample */ + req->command = (u8) command; + req->xfer[2].tx_buf = &req->command; + req->xfer[2].len = 1; + spi_message_add_tail(&req->xfer[2], &req->msg); + + req->xfer[3].rx_buf = &req->sample; + req->xfer[3].len = 2; + spi_message_add_tail(&req->xfer[3], &req->msg); + + /* REVISIT: take a few more samples, and compare ... */ + + /* converter in low power mode & enable PENIRQ */ + req->ref_off = PWRDOWN; + req->xfer[4].tx_buf = &req->ref_off; + req->xfer[4].len = 1; + spi_message_add_tail(&req->xfer[4], &req->msg); + + req->xfer[5].rx_buf = &req->scratch; + req->xfer[5].len = 2; + CS_CHANGE(req->xfer[5]); + spi_message_add_tail(&req->xfer[5], &req->msg); + + mutex_lock(&ts->lock); + ads7846_stop(ts); + status = spi_sync(spi, &req->msg); + ads7846_restart(ts); + mutex_unlock(&ts->lock); + + if (status == 0) { + /* on-wire is a must-ignore bit, a BE12 value, then padding */ + status = be16_to_cpu(req->sample); + status = status >> 3; + status &= 0x0fff; + } + + kfree(req); + return status; +} + +static int ads7845_read12_ser(struct device *dev, unsigned command) +{ + struct spi_device *spi = to_spi_device(dev); + struct ads7846 *ts = dev_get_drvdata(dev); + struct ads7845_ser_req *req; + int status; + + req = kzalloc(sizeof *req, GFP_KERNEL); + if (!req) + return -ENOMEM; + + spi_message_init(&req->msg); + + req->command[0] = (u8) command; + req->xfer[0].tx_buf = req->command; + req->xfer[0].rx_buf = req->sample; + req->xfer[0].len = 3; + spi_message_add_tail(&req->xfer[0], &req->msg); + + mutex_lock(&ts->lock); + ads7846_stop(ts); + status = spi_sync(spi, &req->msg); + ads7846_restart(ts); + mutex_unlock(&ts->lock); + + if (status == 0) { + /* BE12 value, then padding */ + status = be16_to_cpu(*((u16 *)&req->sample[1])); + status = status >> 3; + status &= 0x0fff; + } + + kfree(req); + return status; +} + +#if defined(CONFIG_HWMON) || defined(CONFIG_HWMON_MODULE) + +#define SHOW(name, var, adjust) static ssize_t \ +name ## _show(struct device *dev, struct device_attribute *attr, char *buf) \ +{ \ + struct ads7846 *ts = dev_get_drvdata(dev); \ + ssize_t v = ads7846_read12_ser(dev, \ + READ_12BIT_SER(var)); \ + if (v < 0) \ + return v; \ + return sprintf(buf, "%u\n", adjust(ts, v)); \ +} \ +static DEVICE_ATTR(name, S_IRUGO, name ## _show, NULL); + + +/* Sysfs conventions report temperatures in millidegrees Celsius. + * ADS7846 could use the low-accuracy two-sample scheme, but can't do the high + * accuracy scheme without calibration data. For now we won't try either; + * userspace sees raw sensor values, and must scale/calibrate appropriately. + */ +static inline unsigned null_adjust(struct ads7846 *ts, ssize_t v) +{ + return v; +} + +SHOW(temp0, temp0, null_adjust) /* temp1_input */ +SHOW(temp1, temp1, null_adjust) /* temp2_input */ + + +/* sysfs conventions report voltages in millivolts. We can convert voltages + * if we know vREF. userspace may need to scale vAUX to match the board's + * external resistors; we assume that vBATT only uses the internal ones. + */ +static inline unsigned vaux_adjust(struct ads7846 *ts, ssize_t v) +{ + unsigned retval = v; + + /* external resistors may scale vAUX into 0..vREF */ + retval *= ts->vref_mv; + retval = retval >> 12; + + return retval; +} + +static inline unsigned vbatt_adjust(struct ads7846 *ts, ssize_t v) +{ + unsigned retval = vaux_adjust(ts, v); + + /* ads7846 has a resistor ladder to scale this signal down */ + if (ts->model == 7846) + retval *= 4; + + return retval; +} + +SHOW(in0_input, vaux, vaux_adjust) +SHOW(in1_input, vbatt, vbatt_adjust) + +static struct attribute *ads7846_attributes[] = { + &dev_attr_temp0.attr, + &dev_attr_temp1.attr, + &dev_attr_in0_input.attr, + &dev_attr_in1_input.attr, + NULL, +}; + +static struct attribute_group ads7846_attr_group = { + .attrs = ads7846_attributes, +}; + +static struct attribute *ads7843_attributes[] = { + &dev_attr_in0_input.attr, + &dev_attr_in1_input.attr, + NULL, +}; + +static struct attribute_group ads7843_attr_group = { + .attrs = ads7843_attributes, +}; + +static struct attribute *ads7845_attributes[] = { + &dev_attr_in0_input.attr, + NULL, +}; + +static struct attribute_group ads7845_attr_group = { + .attrs = ads7845_attributes, +}; + +static int ads784x_hwmon_register(struct spi_device *spi, struct ads7846 *ts) +{ + struct device *hwmon; + int err; + + /* hwmon sensors need a reference voltage */ + switch (ts->model) { + case 7846: + if (!ts->vref_mv) { + dev_dbg(&spi->dev, "assuming 2.5V internal vREF\n"); + ts->vref_mv = 2500; + ts->use_internal = true; + } + break; + case 7845: + case 7843: + if (!ts->vref_mv) { + dev_warn(&spi->dev, + "external vREF for ADS%d not specified\n", + ts->model); + return 0; + } + break; + } + + /* different chips have different sensor groups */ + switch (ts->model) { + case 7846: + ts->attr_group = &ads7846_attr_group; + break; + case 7845: + ts->attr_group = &ads7845_attr_group; + break; + case 7843: + ts->attr_group = &ads7843_attr_group; + break; + default: + dev_dbg(&spi->dev, "ADS%d not recognized\n", ts->model); + return 0; + } + + err = sysfs_create_group(&spi->dev.kobj, ts->attr_group); + if (err) + return err; + + hwmon = hwmon_device_register(&spi->dev); + if (IS_ERR(hwmon)) { + sysfs_remove_group(&spi->dev.kobj, ts->attr_group); + return PTR_ERR(hwmon); + } + + ts->hwmon = hwmon; + return 0; +} + +static void ads784x_hwmon_unregister(struct spi_device *spi, + struct ads7846 *ts) +{ + if (ts->hwmon) { + sysfs_remove_group(&spi->dev.kobj, ts->attr_group); + hwmon_device_unregister(ts->hwmon); + } +} + +#else +static inline int ads784x_hwmon_register(struct spi_device *spi, + struct ads7846 *ts) +{ + return 0; +} + +static inline void ads784x_hwmon_unregister(struct spi_device *spi, + struct ads7846 *ts) +{ +} +#endif + +static ssize_t ads7846_pen_down_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ads7846 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->pendown); +} + +static DEVICE_ATTR(pen_down, S_IRUGO, ads7846_pen_down_show, NULL); + +static ssize_t ads7846_disable_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ads7846 *ts = dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", ts->disabled); +} + +static ssize_t ads7846_disable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ads7846 *ts = dev_get_drvdata(dev); + unsigned int i; + int err; + + err = kstrtouint(buf, 10, &i); + if (err) + return err; + + if (i) + ads7846_disable(ts); + else + ads7846_enable(ts); + + return count; +} + +static DEVICE_ATTR(disable, 0664, ads7846_disable_show, ads7846_disable_store); + +static struct attribute *ads784x_attributes[] = { + &dev_attr_pen_down.attr, + &dev_attr_disable.attr, + NULL, +}; + +static struct attribute_group ads784x_attr_group = { + .attrs = ads784x_attributes, +}; + +/*--------------------------------------------------------------------------*/ + +static int get_pendown_state(struct ads7846 *ts) +{ + if (ts->get_pendown_state) + return ts->get_pendown_state(); + + return !gpio_get_value(ts->gpio_pendown); +} + +static void null_wait_for_sync(void) +{ +} + +static int ads7846_debounce_filter(void *ads, int data_idx, int *val) +{ + struct ads7846 *ts = ads; + + if (!ts->read_cnt || (abs(ts->last_read - *val) > ts->debounce_tol)) { + /* Start over collecting consistent readings. */ + ts->read_rep = 0; + /* + * Repeat it, if this was the first read or the read + * wasn't consistent enough. + */ + if (ts->read_cnt < ts->debounce_max) { + ts->last_read = *val; + ts->read_cnt++; + return ADS7846_FILTER_REPEAT; + } else { + /* + * Maximum number of debouncing reached and still + * not enough number of consistent readings. Abort + * the whole sample, repeat it in the next sampling + * period. + */ + ts->read_cnt = 0; + return ADS7846_FILTER_IGNORE; + } + } else { + if (++ts->read_rep > ts->debounce_rep) { + /* + * Got a good reading for this coordinate, + * go for the next one. + */ + ts->read_cnt = 0; + ts->read_rep = 0; + return ADS7846_FILTER_OK; + } else { + /* Read more values that are consistent. */ + ts->read_cnt++; + return ADS7846_FILTER_REPEAT; + } + } +} + +static int ads7846_no_filter(void *ads, int data_idx, int *val) +{ + return ADS7846_FILTER_OK; +} + +static int ads7846_get_value(struct ads7846 *ts, struct spi_message *m) +{ + struct spi_transfer *t = + list_entry(m->transfers.prev, struct spi_transfer, transfer_list); + + if (ts->model == 7845) { + return be16_to_cpup((__be16 *)&(((char*)t->rx_buf)[1])) >> 3; + } else { + /* + * adjust: on-wire is a must-ignore bit, a BE12 value, then + * padding; built from two 8 bit values written msb-first. + */ + return be16_to_cpup((__be16 *)t->rx_buf) >> 3; + } +} + +static void ads7846_update_value(struct spi_message *m, int val) +{ + struct spi_transfer *t = + list_entry(m->transfers.prev, struct spi_transfer, transfer_list); + + *(u16 *)t->rx_buf = val; +} + +static void ads7846_read_state(struct ads7846 *ts) +{ + struct ads7846_packet *packet = ts->packet; + struct spi_message *m; + int msg_idx = 0; + int val; + int action; + int error; + + while (msg_idx < ts->msg_count) { + + ts->wait_for_sync(); + + m = &ts->msg[msg_idx]; + error = spi_sync(ts->spi, m); + if (error) { + dev_err(&ts->spi->dev, "spi_async --> %d\n", error); + packet->tc.ignore = true; + return; + } + + /* + * Last message is power down request, no need to convert + * or filter the value. + */ + if (msg_idx < ts->msg_count - 1) { + + val = ads7846_get_value(ts, m); + + action = ts->filter(ts->filter_data, msg_idx, &val); + switch (action) { + case ADS7846_FILTER_REPEAT: + continue; + + case ADS7846_FILTER_IGNORE: + packet->tc.ignore = true; + msg_idx = ts->msg_count - 1; + continue; + + case ADS7846_FILTER_OK: + ads7846_update_value(m, val); + packet->tc.ignore = false; + msg_idx++; + break; + + default: + BUG(); + } + } else { + msg_idx++; + } + } +} + +static void ads7846_report_state(struct ads7846 *ts) +{ + struct ads7846_packet *packet = ts->packet; + unsigned int Rt; + u16 x, y, z1, z2; + + /* + * ads7846_get_value() does in-place conversion (including byte swap) + * from on-the-wire format as part of debouncing to get stable + * readings. + */ + if (ts->model == 7845) { + x = *(u16 *)packet->tc.x_buf; + y = *(u16 *)packet->tc.y_buf; + z1 = 0; + z2 = 0; + } else { + x = packet->tc.x; + y = packet->tc.y; + z1 = packet->tc.z1; + z2 = packet->tc.z2; + } + + /* range filtering */ + if (x == MAX_12BIT) + x = 0; + + if (ts->model == 7843) { + Rt = ts->pressure_max / 2; + } else if (ts->model == 7845) { + if (get_pendown_state(ts)) + Rt = ts->pressure_max / 2; + else + Rt = 0; + dev_vdbg(&ts->spi->dev, "x/y: %d/%d, PD %d\n", x, y, Rt); + } else if (likely(x && z1)) { + /* compute touch pressure resistance using equation #2 */ + Rt = z2; + Rt -= z1; + Rt *= x; + Rt *= ts->x_plate_ohms; + Rt /= z1; + Rt = (Rt + 2047) >> 12; + } else { + Rt = 0; + } + + /* + * Sample found inconsistent by debouncing or pressure is beyond + * the maximum. Don't report it to user space, repeat at least + * once more the measurement + */ + if (packet->tc.ignore || Rt > ts->pressure_max) { + dev_vdbg(&ts->spi->dev, "ignored %d pressure %d\n", + packet->tc.ignore, Rt); + return; + } + + /* + * Maybe check the pendown state before reporting. This discards + * false readings when the pen is lifted. + */ + if (ts->penirq_recheck_delay_usecs) { + udelay(ts->penirq_recheck_delay_usecs); + if (!get_pendown_state(ts)) + Rt = 0; + } + + /* + * NOTE: We can't rely on the pressure to determine the pen down + * state, even this controller has a pressure sensor. The pressure + * value can fluctuate for quite a while after lifting the pen and + * in some cases may not even settle at the expected value. + * + * The only safe way to check for the pen up condition is in the + * timer by reading the pen signal state (it's a GPIO _and_ IRQ). + */ + if (Rt) { + struct input_dev *input = ts->input; + + if (ts->swap_xy) + swap(x, y); + + if (!ts->pendown) { + input_report_key(input, BTN_TOUCH, 1); + ts->pendown = true; + dev_vdbg(&ts->spi->dev, "DOWN\n"); + } + + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + input_report_abs(input, ABS_PRESSURE, ts->pressure_max - Rt); + + input_sync(input); + dev_vdbg(&ts->spi->dev, "%4d/%4d/%4d\n", x, y, Rt); + } +} + +static irqreturn_t ads7846_hard_irq(int irq, void *handle) +{ + struct ads7846 *ts = handle; + + return get_pendown_state(ts) ? IRQ_WAKE_THREAD : IRQ_HANDLED; +} + + +static irqreturn_t ads7846_irq(int irq, void *handle) +{ + struct ads7846 *ts = handle; + + /* Start with a small delay before checking pendown state */ + msleep(TS_POLL_DELAY); + + while (!ts->stopped && get_pendown_state(ts)) { + + /* pen is down, continue with the measurement */ + ads7846_read_state(ts); + + if (!ts->stopped) + ads7846_report_state(ts); + + wait_event_timeout(ts->wait, ts->stopped, + msecs_to_jiffies(TS_POLL_PERIOD)); + } + + if (ts->pendown) { + struct input_dev *input = ts->input; + + input_report_key(input, BTN_TOUCH, 0); + input_report_abs(input, ABS_PRESSURE, 0); + input_sync(input); + + ts->pendown = false; + dev_vdbg(&ts->spi->dev, "UP\n"); + } + + return IRQ_HANDLED; +} + +#ifdef CONFIG_PM_SLEEP +static int ads7846_suspend(struct device *dev) +{ + struct ads7846 *ts = dev_get_drvdata(dev); + + mutex_lock(&ts->lock); + + if (!ts->suspended) { + + if (!ts->disabled) + __ads7846_disable(ts); + + if (device_may_wakeup(&ts->spi->dev)) + enable_irq_wake(ts->spi->irq); + + ts->suspended = true; + } + + mutex_unlock(&ts->lock); + + return 0; +} + +static int ads7846_resume(struct device *dev) +{ + struct ads7846 *ts = dev_get_drvdata(dev); + + mutex_lock(&ts->lock); + + if (ts->suspended) { + + ts->suspended = false; + + if (device_may_wakeup(&ts->spi->dev)) + disable_irq_wake(ts->spi->irq); + + if (!ts->disabled) + __ads7846_enable(ts); + } + + mutex_unlock(&ts->lock); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume); + +static int ads7846_setup_pendown(struct spi_device *spi, + struct ads7846 *ts) +{ + struct ads7846_platform_data *pdata = spi->dev.platform_data; + int err; + + /* + * REVISIT when the irq can be triggered active-low, or if for some + * reason the touchscreen isn't hooked up, we don't need to access + * the pendown state. + */ + + if (pdata->get_pendown_state) { + ts->get_pendown_state = pdata->get_pendown_state; + } else if (gpio_is_valid(pdata->gpio_pendown)) { + + err = gpio_request_one(pdata->gpio_pendown, GPIOF_IN, + "ads7846_pendown"); + if (err) { + dev_err(&spi->dev, + "failed to request/setup pendown GPIO%d: %d\n", + pdata->gpio_pendown, err); + return err; + } + + ts->gpio_pendown = pdata->gpio_pendown; + + if (pdata->gpio_pendown_debounce) + gpio_set_debounce(pdata->gpio_pendown, + pdata->gpio_pendown_debounce); + } else { + dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n"); + return -EINVAL; + } + + return 0; +} + +/* + * Set up the transfers to read touchscreen state; this assumes we + * use formula #2 for pressure, not #3. + */ +static void ads7846_setup_spi_msg(struct ads7846 *ts, + const struct ads7846_platform_data *pdata) +{ + struct spi_message *m = &ts->msg[0]; + struct spi_transfer *x = ts->xfer; + struct ads7846_packet *packet = ts->packet; + int vref = pdata->keep_vref_on; + + if (ts->model == 7873) { + /* + * The AD7873 is almost identical to the ADS7846 + * keep VREF off during differential/ratiometric + * conversion modes. + */ + ts->model = 7846; + vref = 0; + } + + ts->msg_count = 1; + spi_message_init(m); + m->context = ts; + + if (ts->model == 7845) { + packet->read_y_cmd[0] = READ_Y(vref); + packet->read_y_cmd[1] = 0; + packet->read_y_cmd[2] = 0; + x->tx_buf = &packet->read_y_cmd[0]; + x->rx_buf = &packet->tc.y_buf[0]; + x->len = 3; + spi_message_add_tail(x, m); + } else { + /* y- still on; turn on only y+ (and ADC) */ + packet->read_y = READ_Y(vref); + x->tx_buf = &packet->read_y; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.y; + x->len = 2; + spi_message_add_tail(x, m); + } + + /* + * The first sample after switching drivers can be low quality; + * optionally discard it, using a second one after the signals + * have had enough time to stabilize. + */ + if (pdata->settle_delay_usecs) { + x->delay_usecs = pdata->settle_delay_usecs; + + x++; + x->tx_buf = &packet->read_y; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.y; + x->len = 2; + spi_message_add_tail(x, m); + } + + ts->msg_count++; + m++; + spi_message_init(m); + m->context = ts; + + if (ts->model == 7845) { + x++; + packet->read_x_cmd[0] = READ_X(vref); + packet->read_x_cmd[1] = 0; + packet->read_x_cmd[2] = 0; + x->tx_buf = &packet->read_x_cmd[0]; + x->rx_buf = &packet->tc.x_buf[0]; + x->len = 3; + spi_message_add_tail(x, m); + } else { + /* turn y- off, x+ on, then leave in lowpower */ + x++; + packet->read_x = READ_X(vref); + x->tx_buf = &packet->read_x; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.x; + x->len = 2; + spi_message_add_tail(x, m); + } + + /* ... maybe discard first sample ... */ + if (pdata->settle_delay_usecs) { + x->delay_usecs = pdata->settle_delay_usecs; + + x++; + x->tx_buf = &packet->read_x; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.x; + x->len = 2; + spi_message_add_tail(x, m); + } + + /* turn y+ off, x- on; we'll use formula #2 */ + if (ts->model == 7846) { + ts->msg_count++; + m++; + spi_message_init(m); + m->context = ts; + + x++; + packet->read_z1 = READ_Z1(vref); + x->tx_buf = &packet->read_z1; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.z1; + x->len = 2; + spi_message_add_tail(x, m); + + /* ... maybe discard first sample ... */ + if (pdata->settle_delay_usecs) { + x->delay_usecs = pdata->settle_delay_usecs; + + x++; + x->tx_buf = &packet->read_z1; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.z1; + x->len = 2; + spi_message_add_tail(x, m); + } + + ts->msg_count++; + m++; + spi_message_init(m); + m->context = ts; + + x++; + packet->read_z2 = READ_Z2(vref); + x->tx_buf = &packet->read_z2; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.z2; + x->len = 2; + spi_message_add_tail(x, m); + + /* ... maybe discard first sample ... */ + if (pdata->settle_delay_usecs) { + x->delay_usecs = pdata->settle_delay_usecs; + + x++; + x->tx_buf = &packet->read_z2; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->tc.z2; + x->len = 2; + spi_message_add_tail(x, m); + } + } + + /* power down */ + ts->msg_count++; + m++; + spi_message_init(m); + m->context = ts; + + if (ts->model == 7845) { + x++; + packet->pwrdown_cmd[0] = PWRDOWN; + packet->pwrdown_cmd[1] = 0; + packet->pwrdown_cmd[2] = 0; + x->tx_buf = &packet->pwrdown_cmd[0]; + x->len = 3; + } else { + x++; + packet->pwrdown = PWRDOWN; + x->tx_buf = &packet->pwrdown; + x->len = 1; + spi_message_add_tail(x, m); + + x++; + x->rx_buf = &packet->dummy; + x->len = 2; + } + + CS_CHANGE(*x); + spi_message_add_tail(x, m); +} + +static int ads7846_probe(struct spi_device *spi) +{ + struct ads7846 *ts; + struct ads7846_packet *packet; + struct input_dev *input_dev; + struct ads7846_platform_data *pdata = spi->dev.platform_data; + unsigned long irq_flags; + int err; + + if (!spi->irq) { + dev_dbg(&spi->dev, "no IRQ?\n"); + return -ENODEV; + } + + if (!pdata) { + dev_dbg(&spi->dev, "no platform data?\n"); + return -ENODEV; + } + + /* don't exceed max specified sample rate */ + if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) { + dev_dbg(&spi->dev, "f(sample) %d KHz?\n", + (spi->max_speed_hz/SAMPLE_BITS)/1000); + return -EINVAL; + } + + /* We'd set TX word size 8 bits and RX word size to 13 bits ... except + * that even if the hardware can do that, the SPI controller driver + * may not. So we stick to very-portable 8 bit words, both RX and TX. + */ + spi->bits_per_word = 8; + spi->mode = SPI_MODE_0; + err = spi_setup(spi); + if (err < 0) + return err; + + ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL); + packet = kzalloc(sizeof(struct ads7846_packet), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !packet || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + spi_set_drvdata(spi, ts); + + ts->packet = packet; + ts->spi = spi; + ts->input = input_dev; + ts->vref_mv = pdata->vref_mv; + ts->swap_xy = pdata->swap_xy; + + mutex_init(&ts->lock); + init_waitqueue_head(&ts->wait); + + ts->model = pdata->model ? : 7846; + ts->vref_delay_usecs = pdata->vref_delay_usecs ? : 100; + ts->x_plate_ohms = pdata->x_plate_ohms ? : 400; + ts->pressure_max = pdata->pressure_max ? : ~0; + + if (pdata->filter != NULL) { + if (pdata->filter_init != NULL) { + err = pdata->filter_init(pdata, &ts->filter_data); + if (err < 0) + goto err_free_mem; + } + ts->filter = pdata->filter; + ts->filter_cleanup = pdata->filter_cleanup; + } else if (pdata->debounce_max) { + ts->debounce_max = pdata->debounce_max; + if (ts->debounce_max < 2) + ts->debounce_max = 2; + ts->debounce_tol = pdata->debounce_tol; + ts->debounce_rep = pdata->debounce_rep; + ts->filter = ads7846_debounce_filter; + ts->filter_data = ts; + } else { + ts->filter = ads7846_no_filter; + } + + err = ads7846_setup_pendown(spi, ts); + if (err) + goto err_cleanup_filter; + + if (pdata->penirq_recheck_delay_usecs) + ts->penirq_recheck_delay_usecs = + pdata->penirq_recheck_delay_usecs; + + ts->wait_for_sync = pdata->wait_for_sync ? : null_wait_for_sync; + + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(&spi->dev)); + snprintf(ts->name, sizeof(ts->name), "ADS%d Touchscreen", ts->model); + + input_dev->name = ts->name; + input_dev->phys = ts->phys; + input_dev->dev.parent = &spi->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, + pdata->x_min ? : 0, + pdata->x_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_Y, + pdata->y_min ? : 0, + pdata->y_max ? : MAX_12BIT, + 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + pdata->pressure_min, pdata->pressure_max, 0, 0); + + ads7846_setup_spi_msg(ts, pdata); + + ts->reg = regulator_get(&spi->dev, "vcc"); + if (IS_ERR(ts->reg)) { + err = PTR_ERR(ts->reg); + dev_err(&spi->dev, "unable to get regulator: %d\n", err); + goto err_free_gpio; + } + + err = regulator_enable(ts->reg); + if (err) { + dev_err(&spi->dev, "unable to enable regulator: %d\n", err); + goto err_put_regulator; + } + + irq_flags = pdata->irq_flags ? : IRQF_TRIGGER_FALLING; + irq_flags |= IRQF_ONESHOT; + + err = request_threaded_irq(spi->irq, ads7846_hard_irq, ads7846_irq, + irq_flags, spi->dev.driver->name, ts); + if (err && !pdata->irq_flags) { + dev_info(&spi->dev, + "trying pin change workaround on irq %d\n", spi->irq); + irq_flags |= IRQF_TRIGGER_RISING; + err = request_threaded_irq(spi->irq, + ads7846_hard_irq, ads7846_irq, + irq_flags, spi->dev.driver->name, ts); + } + + if (err) { + dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq); + goto err_disable_regulator; + } + + err = ads784x_hwmon_register(spi, ts); + if (err) + goto err_free_irq; + + dev_info(&spi->dev, "touchscreen, irq %d\n", spi->irq); + + /* + * Take a first sample, leaving nPENIRQ active and vREF off; avoid + * the touchscreen, in case it's not connected. + */ + if (ts->model == 7845) + ads7845_read12_ser(&spi->dev, PWRDOWN); + else + (void) ads7846_read12_ser(&spi->dev, READ_12BIT_SER(vaux)); + + err = sysfs_create_group(&spi->dev.kobj, &ads784x_attr_group); + if (err) + goto err_remove_hwmon; + + err = input_register_device(input_dev); + if (err) + goto err_remove_attr_group; + + device_init_wakeup(&spi->dev, pdata->wakeup); + + return 0; + + err_remove_attr_group: + sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group); + err_remove_hwmon: + ads784x_hwmon_unregister(spi, ts); + err_free_irq: + free_irq(spi->irq, ts); + err_disable_regulator: + regulator_disable(ts->reg); + err_put_regulator: + regulator_put(ts->reg); + err_free_gpio: + if (!ts->get_pendown_state) + gpio_free(ts->gpio_pendown); + err_cleanup_filter: + if (ts->filter_cleanup) + ts->filter_cleanup(ts->filter_data); + err_free_mem: + input_free_device(input_dev); + kfree(packet); + kfree(ts); + return err; +} + +static int ads7846_remove(struct spi_device *spi) +{ + struct ads7846 *ts = spi_get_drvdata(spi); + + device_init_wakeup(&spi->dev, false); + + sysfs_remove_group(&spi->dev.kobj, &ads784x_attr_group); + + ads7846_disable(ts); + free_irq(ts->spi->irq, ts); + + input_unregister_device(ts->input); + + ads784x_hwmon_unregister(spi, ts); + + regulator_disable(ts->reg); + regulator_put(ts->reg); + + if (!ts->get_pendown_state) { + /* + * If we are not using specialized pendown method we must + * have been relying on gpio we set up ourselves. + */ + gpio_free(ts->gpio_pendown); + } + + if (ts->filter_cleanup) + ts->filter_cleanup(ts->filter_data); + + kfree(ts->packet); + kfree(ts); + + dev_dbg(&spi->dev, "unregistered touchscreen\n"); + + return 0; +} + +static struct spi_driver ads7846_driver = { + .driver = { + .name = "ads7846", + .owner = THIS_MODULE, + .pm = &ads7846_pm, + }, + .probe = ads7846_probe, + .remove = ads7846_remove, +}; + +module_spi_driver(ads7846_driver); + +MODULE_DESCRIPTION("ADS7846 TouchScreen Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:ads7846"); diff --git a/drivers/input/touchscreen/atmel-wm97xx.c b/drivers/input/touchscreen/atmel-wm97xx.c new file mode 100644 index 00000000..2c1e46b7 --- /dev/null +++ b/drivers/input/touchscreen/atmel-wm97xx.c @@ -0,0 +1,439 @@ +/* + * Atmel AT91 and AVR32 continuous touch screen driver for Wolfson WM97xx AC97 + * codecs. + * + * Copyright (C) 2008 - 2009 Atmel Corporation + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define AC97C_ICA 0x10 +#define AC97C_CBRHR 0x30 +#define AC97C_CBSR 0x38 +#define AC97C_CBMR 0x3c +#define AC97C_IER 0x54 +#define AC97C_IDR 0x58 + +#define AC97C_RXRDY (1 << 4) +#define AC97C_OVRUN (1 << 5) + +#define AC97C_CMR_SIZE_20 (0 << 16) +#define AC97C_CMR_SIZE_18 (1 << 16) +#define AC97C_CMR_SIZE_16 (2 << 16) +#define AC97C_CMR_SIZE_10 (3 << 16) +#define AC97C_CMR_CEM_LITTLE (1 << 18) +#define AC97C_CMR_CEM_BIG (0 << 18) +#define AC97C_CMR_CENA (1 << 21) + +#define AC97C_INT_CBEVT (1 << 4) + +#define AC97C_SR_CAEVT (1 << 3) + +#define AC97C_CH_MASK(slot) \ + (0x7 << (3 * (slot - 3))) +#define AC97C_CH_ASSIGN(slot, channel) \ + (AC97C_CHANNEL_##channel << (3 * (slot - 3))) +#define AC97C_CHANNEL_NONE 0x0 +#define AC97C_CHANNEL_B 0x2 + +#define ac97c_writel(chip, reg, val) \ + __raw_writel((val), (chip)->regs + AC97C_##reg) +#define ac97c_readl(chip, reg) \ + __raw_readl((chip)->regs + AC97C_##reg) + +#ifdef CONFIG_CPU_AT32AP700X +#define ATMEL_WM97XX_AC97C_IOMEM (0xfff02800) +#define ATMEL_WM97XX_AC97C_IRQ (29) +#define ATMEL_WM97XX_GPIO_DEFAULT (32+16) /* Pin 16 on port B. */ +#else +#error Unknown CPU, this driver only supports AT32AP700X CPUs. +#endif + +struct continuous { + u16 id; /* codec id */ + u8 code; /* continuous code */ + u8 reads; /* number of coord reads per read cycle */ + u32 speed; /* number of coords per second */ +}; + +#define WM_READS(sp) ((sp / HZ) + 1) + +static const struct continuous cinfo[] = { + {WM9705_ID2, 0, WM_READS(94), 94}, + {WM9705_ID2, 1, WM_READS(188), 188}, + {WM9705_ID2, 2, WM_READS(375), 375}, + {WM9705_ID2, 3, WM_READS(750), 750}, + {WM9712_ID2, 0, WM_READS(94), 94}, + {WM9712_ID2, 1, WM_READS(188), 188}, + {WM9712_ID2, 2, WM_READS(375), 375}, + {WM9712_ID2, 3, WM_READS(750), 750}, + {WM9713_ID2, 0, WM_READS(94), 94}, + {WM9713_ID2, 1, WM_READS(120), 120}, + {WM9713_ID2, 2, WM_READS(154), 154}, + {WM9713_ID2, 3, WM_READS(188), 188}, +}; + +/* Continuous speed index. */ +static int sp_idx; + +/* + * Pen sampling frequency (Hz) in continuous mode. + */ +static int cont_rate = 188; +module_param(cont_rate, int, 0); +MODULE_PARM_DESC(cont_rate, "Sampling rate in continuous mode (Hz)"); + +/* + * Pen down detection. + * + * This driver can either poll or use an interrupt to indicate a pen down + * event. If the irq request fails then it will fall back to polling mode. + */ +static int pen_int = 1; +module_param(pen_int, int, 0); +MODULE_PARM_DESC(pen_int, "Pen down detection (1 = interrupt, 0 = polling)"); + +/* + * Pressure readback. + * + * Set to 1 to read back pen down pressure. + */ +static int pressure; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Pressure readback (1 = pressure, 0 = no pressure)"); + +/* + * AC97 touch data slot. + * + * Touch screen readback data ac97 slot. + */ +static int ac97_touch_slot = 5; +module_param(ac97_touch_slot, int, 0); +MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number"); + +/* + * GPIO line number. + * + * Set to GPIO number where the signal from the WM97xx device is hooked up. + */ +static int atmel_gpio_line = ATMEL_WM97XX_GPIO_DEFAULT; +module_param(atmel_gpio_line, int, 0); +MODULE_PARM_DESC(atmel_gpio_line, "GPIO line number connected to WM97xx"); + +struct atmel_wm97xx { + struct wm97xx *wm; + struct timer_list pen_timer; + void __iomem *regs; + unsigned long ac97c_irq; + unsigned long gpio_pen; + unsigned long gpio_irq; + unsigned short x; + unsigned short y; +}; + +static irqreturn_t atmel_wm97xx_channel_b_interrupt(int irq, void *dev_id) +{ + struct atmel_wm97xx *atmel_wm97xx = dev_id; + struct wm97xx *wm = atmel_wm97xx->wm; + int status = ac97c_readl(atmel_wm97xx, CBSR); + irqreturn_t retval = IRQ_NONE; + + if (status & AC97C_OVRUN) { + dev_dbg(&wm->touch_dev->dev, "AC97C overrun\n"); + ac97c_readl(atmel_wm97xx, CBRHR); + retval = IRQ_HANDLED; + } else if (status & AC97C_RXRDY) { + u16 data; + u16 value; + u16 source; + u16 pen_down; + + data = ac97c_readl(atmel_wm97xx, CBRHR); + value = data & 0x0fff; + source = data & WM97XX_ADCSEL_MASK; + pen_down = (data & WM97XX_PEN_DOWN) >> 8; + + if (source == WM97XX_ADCSEL_X) + atmel_wm97xx->x = value; + if (source == WM97XX_ADCSEL_Y) + atmel_wm97xx->y = value; + + if (!pressure && source == WM97XX_ADCSEL_Y) { + input_report_abs(wm->input_dev, ABS_X, atmel_wm97xx->x); + input_report_abs(wm->input_dev, ABS_Y, atmel_wm97xx->y); + input_report_key(wm->input_dev, BTN_TOUCH, pen_down); + input_sync(wm->input_dev); + } else if (pressure && source == WM97XX_ADCSEL_PRES) { + input_report_abs(wm->input_dev, ABS_X, atmel_wm97xx->x); + input_report_abs(wm->input_dev, ABS_Y, atmel_wm97xx->y); + input_report_abs(wm->input_dev, ABS_PRESSURE, value); + input_report_key(wm->input_dev, BTN_TOUCH, value); + input_sync(wm->input_dev); + } + + retval = IRQ_HANDLED; + } + + return retval; +} + +static void atmel_wm97xx_acc_pen_up(struct wm97xx *wm) +{ + struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(wm->touch_dev); + struct input_dev *input_dev = wm->input_dev; + int pen_down = gpio_get_value(atmel_wm97xx->gpio_pen); + + if (pen_down != 0) { + mod_timer(&atmel_wm97xx->pen_timer, + jiffies + msecs_to_jiffies(1)); + } else { + if (pressure) + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_report_key(input_dev, BTN_TOUCH, 0); + input_sync(input_dev); + } +} + +static void atmel_wm97xx_pen_timer(unsigned long data) +{ + atmel_wm97xx_acc_pen_up((struct wm97xx *)data); +} + +static int atmel_wm97xx_acc_startup(struct wm97xx *wm) +{ + struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(wm->touch_dev); + int idx = 0; + + if (wm->ac97 == NULL) + return -ENODEV; + + for (idx = 0; idx < ARRAY_SIZE(cinfo); idx++) { + if (wm->id != cinfo[idx].id) + continue; + + sp_idx = idx; + + if (cont_rate <= cinfo[idx].speed) + break; + } + + wm->acc_rate = cinfo[sp_idx].code; + wm->acc_slot = ac97_touch_slot; + dev_info(&wm->touch_dev->dev, "atmel accelerated touchscreen driver, " + "%d samples/sec\n", cinfo[sp_idx].speed); + + if (pen_int) { + unsigned long reg; + + wm->pen_irq = atmel_wm97xx->gpio_irq; + + switch (wm->id) { + case WM9712_ID2: /* Fall through. */ + case WM9713_ID2: + /* + * Use GPIO 13 (PEN_DOWN) to assert GPIO line 3 + * (PENDOWN). + */ + wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_STICKY, + WM97XX_GPIO_WAKE); + wm97xx_config_gpio(wm, WM97XX_GPIO_3, WM97XX_GPIO_OUT, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_NOTSTICKY, + WM97XX_GPIO_NOWAKE); + case WM9705_ID2: /* Fall through. */ + /* + * Enable touch data slot in AC97 controller channel B. + */ + reg = ac97c_readl(atmel_wm97xx, ICA); + reg &= ~AC97C_CH_MASK(wm->acc_slot); + reg |= AC97C_CH_ASSIGN(wm->acc_slot, B); + ac97c_writel(atmel_wm97xx, ICA, reg); + + /* + * Enable channel and interrupt for RXRDY and OVERRUN. + */ + ac97c_writel(atmel_wm97xx, CBMR, AC97C_CMR_CENA + | AC97C_CMR_CEM_BIG + | AC97C_CMR_SIZE_16 + | AC97C_OVRUN + | AC97C_RXRDY); + /* Dummy read to empty RXRHR. */ + ac97c_readl(atmel_wm97xx, CBRHR); + /* + * Enable interrupt for channel B in the AC97 + * controller. + */ + ac97c_writel(atmel_wm97xx, IER, AC97C_INT_CBEVT); + break; + default: + dev_err(&wm->touch_dev->dev, "pen down irq not " + "supported on this device\n"); + pen_int = 0; + break; + } + } + + return 0; +} + +static void atmel_wm97xx_acc_shutdown(struct wm97xx *wm) +{ + if (pen_int) { + struct atmel_wm97xx *atmel_wm97xx = + platform_get_drvdata(wm->touch_dev); + unsigned long ica; + + switch (wm->id & 0xffff) { + case WM9705_ID2: /* Fall through. */ + case WM9712_ID2: /* Fall through. */ + case WM9713_ID2: + /* Disable slot and turn off channel B interrupts. */ + ica = ac97c_readl(atmel_wm97xx, ICA); + ica &= ~AC97C_CH_MASK(wm->acc_slot); + ac97c_writel(atmel_wm97xx, ICA, ica); + ac97c_writel(atmel_wm97xx, IDR, AC97C_INT_CBEVT); + ac97c_writel(atmel_wm97xx, CBMR, 0); + wm->pen_irq = 0; + break; + default: + dev_err(&wm->touch_dev->dev, "unknown codec\n"); + break; + } + } +} + +static void atmel_wm97xx_irq_enable(struct wm97xx *wm, int enable) +{ + /* Intentionally left empty. */ +} + +static struct wm97xx_mach_ops atmel_mach_ops = { + .acc_enabled = 1, + .acc_pen_up = atmel_wm97xx_acc_pen_up, + .acc_startup = atmel_wm97xx_acc_startup, + .acc_shutdown = atmel_wm97xx_acc_shutdown, + .irq_enable = atmel_wm97xx_irq_enable, + .irq_gpio = WM97XX_GPIO_3, +}; + +static int __init atmel_wm97xx_probe(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + struct atmel_wm97xx *atmel_wm97xx; + int ret; + + atmel_wm97xx = kzalloc(sizeof(struct atmel_wm97xx), GFP_KERNEL); + if (!atmel_wm97xx) { + dev_dbg(&pdev->dev, "out of memory\n"); + return -ENOMEM; + } + + atmel_wm97xx->wm = wm; + atmel_wm97xx->regs = (void *)ATMEL_WM97XX_AC97C_IOMEM; + atmel_wm97xx->ac97c_irq = ATMEL_WM97XX_AC97C_IRQ; + atmel_wm97xx->gpio_pen = atmel_gpio_line; + atmel_wm97xx->gpio_irq = gpio_to_irq(atmel_wm97xx->gpio_pen); + + setup_timer(&atmel_wm97xx->pen_timer, atmel_wm97xx_pen_timer, + (unsigned long)wm); + + ret = request_irq(atmel_wm97xx->ac97c_irq, + atmel_wm97xx_channel_b_interrupt, + IRQF_SHARED, "atmel-wm97xx-ch-b", atmel_wm97xx); + if (ret) { + dev_dbg(&pdev->dev, "could not request ac97c irq\n"); + goto err; + } + + platform_set_drvdata(pdev, atmel_wm97xx); + + ret = wm97xx_register_mach_ops(wm, &atmel_mach_ops); + if (ret) + goto err_irq; + + return ret; + +err_irq: + free_irq(atmel_wm97xx->ac97c_irq, atmel_wm97xx); +err: + platform_set_drvdata(pdev, NULL); + kfree(atmel_wm97xx); + return ret; +} + +static int __exit atmel_wm97xx_remove(struct platform_device *pdev) +{ + struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(pdev); + struct wm97xx *wm = atmel_wm97xx->wm; + + ac97c_writel(atmel_wm97xx, IDR, AC97C_INT_CBEVT); + free_irq(atmel_wm97xx->ac97c_irq, atmel_wm97xx); + del_timer_sync(&atmel_wm97xx->pen_timer); + wm97xx_unregister_mach_ops(wm); + platform_set_drvdata(pdev, NULL); + kfree(atmel_wm97xx); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int atmel_wm97xx_suspend(struct *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(pdev); + + ac97c_writel(atmel_wm97xx, IDR, AC97C_INT_CBEVT); + disable_irq(atmel_wm97xx->gpio_irq); + del_timer_sync(&atmel_wm97xx->pen_timer); + + return 0; +} + +static int atmel_wm97xx_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct atmel_wm97xx *atmel_wm97xx = platform_get_drvdata(pdev); + struct wm97xx *wm = atmel_wm97xx->wm; + + if (wm->input_dev->users) { + enable_irq(atmel_wm97xx->gpio_irq); + ac97c_writel(atmel_wm97xx, IER, AC97C_INT_CBEVT); + } + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(atmel_wm97xx_pm_ops, + atmel_wm97xx_suspend, atmel_wm97xx_resume); + +static struct platform_driver atmel_wm97xx_driver = { + .remove = __exit_p(atmel_wm97xx_remove), + .driver = { + .name = "wm97xx-touch", + .owner = THIS_MODULE, + .pm = &atmel_wm97xx_pm_ops, + }, +}; + +module_platform_driver_probe(atmel_wm97xx_driver, atmel_wm97xx_probe); + +MODULE_AUTHOR("Hans-Christian Egtvedt "); +MODULE_DESCRIPTION("wm97xx continuous touch driver for Atmel AT91 and AVR32"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c new file mode 100644 index 00000000..59aa2400 --- /dev/null +++ b/drivers/input/touchscreen/atmel_mxt_ts.c @@ -0,0 +1,1342 @@ +/* + * Atmel maXTouch Touchscreen driver + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: Joonyoung Shim + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Version */ +#define MXT_VER_20 20 +#define MXT_VER_21 21 +#define MXT_VER_22 22 + +/* Slave addresses */ +#define MXT_APP_LOW 0x4a +#define MXT_APP_HIGH 0x4b +#define MXT_BOOT_LOW 0x24 +#define MXT_BOOT_HIGH 0x25 + +/* Firmware */ +#define MXT_FW_NAME "maxtouch.fw" + +/* Registers */ +#define MXT_INFO 0x00 +#define MXT_FAMILY_ID 0x00 +#define MXT_VARIANT_ID 0x01 +#define MXT_VERSION 0x02 +#define MXT_BUILD 0x03 +#define MXT_MATRIX_X_SIZE 0x04 +#define MXT_MATRIX_Y_SIZE 0x05 +#define MXT_OBJECT_NUM 0x06 +#define MXT_OBJECT_START 0x07 + +#define MXT_OBJECT_SIZE 6 + +/* Object types */ +#define MXT_DEBUG_DIAGNOSTIC_T37 37 +#define MXT_GEN_MESSAGE_T5 5 +#define MXT_GEN_COMMAND_T6 6 +#define MXT_GEN_POWER_T7 7 +#define MXT_GEN_ACQUIRE_T8 8 +#define MXT_GEN_DATASOURCE_T53 53 +#define MXT_TOUCH_MULTI_T9 9 +#define MXT_TOUCH_KEYARRAY_T15 15 +#define MXT_TOUCH_PROXIMITY_T23 23 +#define MXT_TOUCH_PROXKEY_T52 52 +#define MXT_PROCI_GRIPFACE_T20 20 +#define MXT_PROCG_NOISE_T22 22 +#define MXT_PROCI_ONETOUCH_T24 24 +#define MXT_PROCI_TWOTOUCH_T27 27 +#define MXT_PROCI_GRIP_T40 40 +#define MXT_PROCI_PALM_T41 41 +#define MXT_PROCI_TOUCHSUPPRESSION_T42 42 +#define MXT_PROCI_STYLUS_T47 47 +#define MXT_PROCG_NOISESUPPRESSION_T48 48 +#define MXT_SPT_COMMSCONFIG_T18 18 +#define MXT_SPT_GPIOPWM_T19 19 +#define MXT_SPT_SELFTEST_T25 25 +#define MXT_SPT_CTECONFIG_T28 28 +#define MXT_SPT_USERDATA_T38 38 +#define MXT_SPT_DIGITIZER_T43 43 +#define MXT_SPT_MESSAGECOUNT_T44 44 +#define MXT_SPT_CTECONFIG_T46 46 + +/* MXT_GEN_COMMAND_T6 field */ +#define MXT_COMMAND_RESET 0 +#define MXT_COMMAND_BACKUPNV 1 +#define MXT_COMMAND_CALIBRATE 2 +#define MXT_COMMAND_REPORTALL 3 +#define MXT_COMMAND_DIAGNOSTIC 5 + +/* MXT_GEN_POWER_T7 field */ +#define MXT_POWER_IDLEACQINT 0 +#define MXT_POWER_ACTVACQINT 1 +#define MXT_POWER_ACTV2IDLETO 2 + +/* MXT_GEN_ACQUIRE_T8 field */ +#define MXT_ACQUIRE_CHRGTIME 0 +#define MXT_ACQUIRE_TCHDRIFT 2 +#define MXT_ACQUIRE_DRIFTST 3 +#define MXT_ACQUIRE_TCHAUTOCAL 4 +#define MXT_ACQUIRE_SYNC 5 +#define MXT_ACQUIRE_ATCHCALST 6 +#define MXT_ACQUIRE_ATCHCALSTHR 7 + +/* MXT_TOUCH_MULTI_T9 field */ +#define MXT_TOUCH_CTRL 0 +#define MXT_TOUCH_XORIGIN 1 +#define MXT_TOUCH_YORIGIN 2 +#define MXT_TOUCH_XSIZE 3 +#define MXT_TOUCH_YSIZE 4 +#define MXT_TOUCH_BLEN 6 +#define MXT_TOUCH_TCHTHR 7 +#define MXT_TOUCH_TCHDI 8 +#define MXT_TOUCH_ORIENT 9 +#define MXT_TOUCH_MOVHYSTI 11 +#define MXT_TOUCH_MOVHYSTN 12 +#define MXT_TOUCH_NUMTOUCH 14 +#define MXT_TOUCH_MRGHYST 15 +#define MXT_TOUCH_MRGTHR 16 +#define MXT_TOUCH_AMPHYST 17 +#define MXT_TOUCH_XRANGE_LSB 18 +#define MXT_TOUCH_XRANGE_MSB 19 +#define MXT_TOUCH_YRANGE_LSB 20 +#define MXT_TOUCH_YRANGE_MSB 21 +#define MXT_TOUCH_XLOCLIP 22 +#define MXT_TOUCH_XHICLIP 23 +#define MXT_TOUCH_YLOCLIP 24 +#define MXT_TOUCH_YHICLIP 25 +#define MXT_TOUCH_XEDGECTRL 26 +#define MXT_TOUCH_XEDGEDIST 27 +#define MXT_TOUCH_YEDGECTRL 28 +#define MXT_TOUCH_YEDGEDIST 29 +#define MXT_TOUCH_JUMPLIMIT 30 + +/* MXT_PROCI_GRIPFACE_T20 field */ +#define MXT_GRIPFACE_CTRL 0 +#define MXT_GRIPFACE_XLOGRIP 1 +#define MXT_GRIPFACE_XHIGRIP 2 +#define MXT_GRIPFACE_YLOGRIP 3 +#define MXT_GRIPFACE_YHIGRIP 4 +#define MXT_GRIPFACE_MAXTCHS 5 +#define MXT_GRIPFACE_SZTHR1 7 +#define MXT_GRIPFACE_SZTHR2 8 +#define MXT_GRIPFACE_SHPTHR1 9 +#define MXT_GRIPFACE_SHPTHR2 10 +#define MXT_GRIPFACE_SUPEXTTO 11 + +/* MXT_PROCI_NOISE field */ +#define MXT_NOISE_CTRL 0 +#define MXT_NOISE_OUTFLEN 1 +#define MXT_NOISE_GCAFUL_LSB 3 +#define MXT_NOISE_GCAFUL_MSB 4 +#define MXT_NOISE_GCAFLL_LSB 5 +#define MXT_NOISE_GCAFLL_MSB 6 +#define MXT_NOISE_ACTVGCAFVALID 7 +#define MXT_NOISE_NOISETHR 8 +#define MXT_NOISE_FREQHOPSCALE 10 +#define MXT_NOISE_FREQ0 11 +#define MXT_NOISE_FREQ1 12 +#define MXT_NOISE_FREQ2 13 +#define MXT_NOISE_FREQ3 14 +#define MXT_NOISE_FREQ4 15 +#define MXT_NOISE_IDLEGCAFVALID 16 + +/* MXT_SPT_COMMSCONFIG_T18 */ +#define MXT_COMMS_CTRL 0 +#define MXT_COMMS_CMD 1 + +/* MXT_SPT_CTECONFIG_T28 field */ +#define MXT_CTE_CTRL 0 +#define MXT_CTE_CMD 1 +#define MXT_CTE_MODE 2 +#define MXT_CTE_IDLEGCAFDEPTH 3 +#define MXT_CTE_ACTVGCAFDEPTH 4 +#define MXT_CTE_VOLTAGE 5 + +#define MXT_VOLTAGE_DEFAULT 2700000 +#define MXT_VOLTAGE_STEP 10000 + +/* Define for MXT_GEN_COMMAND_T6 */ +#define MXT_BOOT_VALUE 0xa5 +#define MXT_BACKUP_VALUE 0x55 +#define MXT_BACKUP_TIME 50 /* msec */ +#define MXT_RESET_TIME 200 /* msec */ + +#define MXT_FWRESET_TIME 175 /* msec */ + +/* MXT_SPT_GPIOPWM_T19 field */ +#define MXT_GPIO0_MASK 0x04 +#define MXT_GPIO1_MASK 0x08 +#define MXT_GPIO2_MASK 0x10 +#define MXT_GPIO3_MASK 0x20 + +/* Command to unlock bootloader */ +#define MXT_UNLOCK_CMD_MSB 0xaa +#define MXT_UNLOCK_CMD_LSB 0xdc + +/* Bootloader mode status */ +#define MXT_WAITING_BOOTLOAD_CMD 0xc0 /* valid 7 6 bit only */ +#define MXT_WAITING_FRAME_DATA 0x80 /* valid 7 6 bit only */ +#define MXT_FRAME_CRC_CHECK 0x02 +#define MXT_FRAME_CRC_FAIL 0x03 +#define MXT_FRAME_CRC_PASS 0x04 +#define MXT_APP_CRC_FAIL 0x40 /* valid 7 8 bit only */ +#define MXT_BOOT_STATUS_MASK 0x3f + +/* Touch status */ +#define MXT_UNGRIP (1 << 0) +#define MXT_SUPPRESS (1 << 1) +#define MXT_AMP (1 << 2) +#define MXT_VECTOR (1 << 3) +#define MXT_MOVE (1 << 4) +#define MXT_RELEASE (1 << 5) +#define MXT_PRESS (1 << 6) +#define MXT_DETECT (1 << 7) + +/* Touch orient bits */ +#define MXT_XY_SWITCH (1 << 0) +#define MXT_X_INVERT (1 << 1) +#define MXT_Y_INVERT (1 << 2) + +/* Touchscreen absolute values */ +#define MXT_MAX_AREA 0xff + +#define MXT_PIXELS_PER_MM 20 + +struct mxt_info { + u8 family_id; + u8 variant_id; + u8 version; + u8 build; + u8 matrix_xsize; + u8 matrix_ysize; + u8 object_num; +}; + +struct mxt_object { + u8 type; + u16 start_address; + u8 size; /* Size of each instance - 1 */ + u8 instances; /* Number of instances - 1 */ + u8 num_report_ids; +} __packed; + +struct mxt_message { + u8 reportid; + u8 message[7]; +}; + +/* Each client has this additional data */ +struct mxt_data { + struct i2c_client *client; + struct input_dev *input_dev; + char phys[64]; /* device physical location */ + const struct mxt_platform_data *pdata; + struct mxt_object *object_table; + struct mxt_info info; + bool is_tp; + + unsigned int irq; + unsigned int max_x; + unsigned int max_y; + + /* Cached parameters from object table */ + u8 T6_reportid; + u8 T9_reportid_min; + u8 T9_reportid_max; + u8 T19_reportid; +}; + +static bool mxt_object_readable(unsigned int type) +{ + switch (type) { + case MXT_GEN_COMMAND_T6: + case MXT_GEN_POWER_T7: + case MXT_GEN_ACQUIRE_T8: + case MXT_GEN_DATASOURCE_T53: + case MXT_TOUCH_MULTI_T9: + case MXT_TOUCH_KEYARRAY_T15: + case MXT_TOUCH_PROXIMITY_T23: + case MXT_TOUCH_PROXKEY_T52: + case MXT_PROCI_GRIPFACE_T20: + case MXT_PROCG_NOISE_T22: + case MXT_PROCI_ONETOUCH_T24: + case MXT_PROCI_TWOTOUCH_T27: + case MXT_PROCI_GRIP_T40: + case MXT_PROCI_PALM_T41: + case MXT_PROCI_TOUCHSUPPRESSION_T42: + case MXT_PROCI_STYLUS_T47: + case MXT_PROCG_NOISESUPPRESSION_T48: + case MXT_SPT_COMMSCONFIG_T18: + case MXT_SPT_GPIOPWM_T19: + case MXT_SPT_SELFTEST_T25: + case MXT_SPT_CTECONFIG_T28: + case MXT_SPT_USERDATA_T38: + case MXT_SPT_DIGITIZER_T43: + case MXT_SPT_CTECONFIG_T46: + return true; + default: + return false; + } +} + +static bool mxt_object_writable(unsigned int type) +{ + switch (type) { + case MXT_GEN_COMMAND_T6: + case MXT_GEN_POWER_T7: + case MXT_GEN_ACQUIRE_T8: + case MXT_TOUCH_MULTI_T9: + case MXT_TOUCH_KEYARRAY_T15: + case MXT_TOUCH_PROXIMITY_T23: + case MXT_TOUCH_PROXKEY_T52: + case MXT_PROCI_GRIPFACE_T20: + case MXT_PROCG_NOISE_T22: + case MXT_PROCI_ONETOUCH_T24: + case MXT_PROCI_TWOTOUCH_T27: + case MXT_PROCI_GRIP_T40: + case MXT_PROCI_PALM_T41: + case MXT_PROCI_TOUCHSUPPRESSION_T42: + case MXT_PROCI_STYLUS_T47: + case MXT_PROCG_NOISESUPPRESSION_T48: + case MXT_SPT_COMMSCONFIG_T18: + case MXT_SPT_GPIOPWM_T19: + case MXT_SPT_SELFTEST_T25: + case MXT_SPT_CTECONFIG_T28: + case MXT_SPT_DIGITIZER_T43: + case MXT_SPT_CTECONFIG_T46: + return true; + default: + return false; + } +} + +static void mxt_dump_message(struct device *dev, + struct mxt_message *message) +{ + dev_dbg(dev, "reportid: %u\tmessage: %*ph\n", + message->reportid, 7, message->message); +} + +static int mxt_check_bootloader(struct i2c_client *client, + unsigned int state) +{ + u8 val; + +recheck: + if (i2c_master_recv(client, &val, 1) != 1) { + dev_err(&client->dev, "%s: i2c recv failed\n", __func__); + return -EIO; + } + + switch (state) { + case MXT_WAITING_BOOTLOAD_CMD: + case MXT_WAITING_FRAME_DATA: + val &= ~MXT_BOOT_STATUS_MASK; + break; + case MXT_FRAME_CRC_PASS: + if (val == MXT_FRAME_CRC_CHECK) + goto recheck; + break; + default: + return -EINVAL; + } + + if (val != state) { + dev_err(&client->dev, "Unvalid bootloader mode state\n"); + return -EINVAL; + } + + return 0; +} + +static int mxt_unlock_bootloader(struct i2c_client *client) +{ + u8 buf[2]; + + buf[0] = MXT_UNLOCK_CMD_LSB; + buf[1] = MXT_UNLOCK_CMD_MSB; + + if (i2c_master_send(client, buf, 2) != 2) { + dev_err(&client->dev, "%s: i2c send failed\n", __func__); + return -EIO; + } + + return 0; +} + +static int mxt_fw_write(struct i2c_client *client, + const u8 *data, unsigned int frame_size) +{ + if (i2c_master_send(client, data, frame_size) != frame_size) { + dev_err(&client->dev, "%s: i2c send failed\n", __func__); + return -EIO; + } + + return 0; +} + +static int __mxt_read_reg(struct i2c_client *client, + u16 reg, u16 len, void *val) +{ + struct i2c_msg xfer[2]; + u8 buf[2]; + int ret; + + buf[0] = reg & 0xff; + buf[1] = (reg >> 8) & 0xff; + + /* Write register */ + xfer[0].addr = client->addr; + xfer[0].flags = 0; + xfer[0].len = 2; + xfer[0].buf = buf; + + /* Read data */ + xfer[1].addr = client->addr; + xfer[1].flags = I2C_M_RD; + xfer[1].len = len; + xfer[1].buf = val; + + ret = i2c_transfer(client->adapter, xfer, 2); + if (ret == 2) { + ret = 0; + } else { + if (ret >= 0) + ret = -EIO; + dev_err(&client->dev, "%s: i2c transfer failed (%d)\n", + __func__, ret); + } + + return ret; +} + +static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val) +{ + return __mxt_read_reg(client, reg, 1, val); +} + +static int __mxt_write_reg(struct i2c_client *client, u16 reg, u16 len, + const void *val) +{ + u8 *buf; + size_t count; + int ret; + + count = len + 2; + buf = kmalloc(count, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + buf[0] = reg & 0xff; + buf[1] = (reg >> 8) & 0xff; + memcpy(&buf[2], val, len); + + ret = i2c_master_send(client, buf, count); + if (ret == count) { + ret = 0; + } else { + if (ret >= 0) + ret = -EIO; + dev_err(&client->dev, "%s: i2c send failed (%d)\n", + __func__, ret); + } + + kfree(buf); + return ret; +} + +static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val) +{ + return __mxt_write_reg(client, reg, 1, &val); +} + +static struct mxt_object * +mxt_get_object(struct mxt_data *data, u8 type) +{ + struct mxt_object *object; + int i; + + for (i = 0; i < data->info.object_num; i++) { + object = data->object_table + i; + if (object->type == type) + return object; + } + + dev_err(&data->client->dev, "Invalid object type\n"); + return NULL; +} + +static int mxt_read_message(struct mxt_data *data, + struct mxt_message *message) +{ + struct mxt_object *object; + u16 reg; + + object = mxt_get_object(data, MXT_GEN_MESSAGE_T5); + if (!object) + return -EINVAL; + + reg = object->start_address; + return __mxt_read_reg(data->client, reg, + sizeof(struct mxt_message), message); +} + +static int mxt_write_object(struct mxt_data *data, + u8 type, u8 offset, u8 val) +{ + struct mxt_object *object; + u16 reg; + + object = mxt_get_object(data, type); + if (!object || offset >= object->size + 1) + return -EINVAL; + + reg = object->start_address; + return mxt_write_reg(data->client, reg + offset, val); +} + +static void mxt_input_button(struct mxt_data *data, struct mxt_message *message) +{ + struct input_dev *input = data->input_dev; + bool button; + int i; + + /* Active-low switch */ + for (i = 0; i < MXT_NUM_GPIO; i++) { + if (data->pdata->key_map[i] == KEY_RESERVED) + continue; + button = !(message->message[0] & MXT_GPIO0_MASK << i); + input_report_key(input, data->pdata->key_map[i], button); + } +} + +static void mxt_input_touchevent(struct mxt_data *data, + struct mxt_message *message, int id) +{ + struct device *dev = &data->client->dev; + u8 status = message->message[0]; + struct input_dev *input_dev = data->input_dev; + int x; + int y; + int area; + int pressure; + + x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf); + y = (message->message[2] << 4) | ((message->message[3] & 0xf)); + if (data->max_x < 1024) + x = x >> 2; + if (data->max_y < 1024) + y = y >> 2; + + area = message->message[4]; + pressure = message->message[5]; + + dev_dbg(dev, + "[%u] %c%c%c%c%c%c%c%c x: %5u y: %5u area: %3u amp: %3u\n", + id, + (status & MXT_DETECT) ? 'D' : '.', + (status & MXT_PRESS) ? 'P' : '.', + (status & MXT_RELEASE) ? 'R' : '.', + (status & MXT_MOVE) ? 'M' : '.', + (status & MXT_VECTOR) ? 'V' : '.', + (status & MXT_AMP) ? 'A' : '.', + (status & MXT_SUPPRESS) ? 'S' : '.', + (status & MXT_UNGRIP) ? 'U' : '.', + x, y, area, pressure); + + input_mt_slot(input_dev, id); + input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, + status & MXT_DETECT); + + if (status & MXT_DETECT) { + input_report_abs(input_dev, ABS_MT_POSITION_X, x); + input_report_abs(input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(input_dev, ABS_MT_PRESSURE, pressure); + input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, area); + } +} + +static unsigned mxt_extract_T6_csum(const u8 *csum) +{ + return csum[0] | (csum[1] << 8) | (csum[2] << 16); +} + +static bool mxt_is_T9_message(struct mxt_data *data, struct mxt_message *msg) +{ + u8 id = msg->reportid; + return (id >= data->T9_reportid_min && id <= data->T9_reportid_max); +} + +static irqreturn_t mxt_interrupt(int irq, void *dev_id) +{ + struct mxt_data *data = dev_id; + struct mxt_message message; + const u8 *payload = &message.message[0]; + struct device *dev = &data->client->dev; + u8 reportid; + bool update_input = false; + + do { + if (mxt_read_message(data, &message)) { + dev_err(dev, "Failed to read message\n"); + goto end; + } + + reportid = message.reportid; + + if (reportid == data->T6_reportid) { + u8 status = payload[0]; + unsigned csum = mxt_extract_T6_csum(&payload[1]); + dev_dbg(dev, "Status: %02x Config Checksum: %06x\n", + status, csum); + } else if (mxt_is_T9_message(data, &message)) { + int id = reportid - data->T9_reportid_min; + mxt_input_touchevent(data, &message, id); + update_input = true; + } else if (message.reportid == data->T19_reportid) { + mxt_input_button(data, &message); + update_input = true; + } else { + mxt_dump_message(dev, &message); + } + } while (reportid != 0xff); + + if (update_input) { + input_mt_report_pointer_emulation(data->input_dev, false); + input_sync(data->input_dev); + } + +end: + return IRQ_HANDLED; +} + +static int mxt_check_reg_init(struct mxt_data *data) +{ + const struct mxt_platform_data *pdata = data->pdata; + struct mxt_object *object; + struct device *dev = &data->client->dev; + int index = 0; + int i, size; + int ret; + + if (!pdata->config) { + dev_dbg(dev, "No cfg data defined, skipping reg init\n"); + return 0; + } + + for (i = 0; i < data->info.object_num; i++) { + object = data->object_table + i; + + if (!mxt_object_writable(object->type)) + continue; + + size = (object->size + 1) * (object->instances + 1); + if (index + size > pdata->config_length) { + dev_err(dev, "Not enough config data!\n"); + return -EINVAL; + } + + ret = __mxt_write_reg(data->client, object->start_address, + size, &pdata->config[index]); + if (ret) + return ret; + index += size; + } + + return 0; +} + +static int mxt_make_highchg(struct mxt_data *data) +{ + struct device *dev = &data->client->dev; + struct mxt_message message; + int count = 10; + int error; + + /* Read dummy message to make high CHG pin */ + do { + error = mxt_read_message(data, &message); + if (error) + return error; + } while (message.reportid != 0xff && --count); + + if (!count) { + dev_err(dev, "CHG pin isn't cleared\n"); + return -EBUSY; + } + + return 0; +} + +static void mxt_handle_pdata(struct mxt_data *data) +{ + const struct mxt_platform_data *pdata = data->pdata; + u8 voltage; + + /* Set touchscreen lines */ + mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_XSIZE, + pdata->x_line); + mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_YSIZE, + pdata->y_line); + + /* Set touchscreen orient */ + mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_ORIENT, + pdata->orient); + + /* Set touchscreen burst length */ + mxt_write_object(data, MXT_TOUCH_MULTI_T9, + MXT_TOUCH_BLEN, pdata->blen); + + /* Set touchscreen threshold */ + mxt_write_object(data, MXT_TOUCH_MULTI_T9, + MXT_TOUCH_TCHTHR, pdata->threshold); + + /* Set touchscreen resolution */ + mxt_write_object(data, MXT_TOUCH_MULTI_T9, + MXT_TOUCH_XRANGE_LSB, (pdata->x_size - 1) & 0xff); + mxt_write_object(data, MXT_TOUCH_MULTI_T9, + MXT_TOUCH_XRANGE_MSB, (pdata->x_size - 1) >> 8); + mxt_write_object(data, MXT_TOUCH_MULTI_T9, + MXT_TOUCH_YRANGE_LSB, (pdata->y_size - 1) & 0xff); + mxt_write_object(data, MXT_TOUCH_MULTI_T9, + MXT_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8); + + /* Set touchscreen voltage */ + if (pdata->voltage) { + if (pdata->voltage < MXT_VOLTAGE_DEFAULT) { + voltage = (MXT_VOLTAGE_DEFAULT - pdata->voltage) / + MXT_VOLTAGE_STEP; + voltage = 0xff - voltage + 1; + } else + voltage = (pdata->voltage - MXT_VOLTAGE_DEFAULT) / + MXT_VOLTAGE_STEP; + + mxt_write_object(data, MXT_SPT_CTECONFIG_T28, + MXT_CTE_VOLTAGE, voltage); + } +} + +static int mxt_get_info(struct mxt_data *data) +{ + struct i2c_client *client = data->client; + struct mxt_info *info = &data->info; + int error; + + /* Read 7-byte info block starting at address 0 */ + error = __mxt_read_reg(client, MXT_INFO, sizeof(*info), info); + if (error) + return error; + + return 0; +} + +static int mxt_get_object_table(struct mxt_data *data) +{ + struct i2c_client *client = data->client; + size_t table_size; + int error; + int i; + u8 reportid; + + table_size = data->info.object_num * sizeof(struct mxt_object); + error = __mxt_read_reg(client, MXT_OBJECT_START, table_size, + data->object_table); + if (error) + return error; + + /* Valid Report IDs start counting from 1 */ + reportid = 1; + for (i = 0; i < data->info.object_num; i++) { + struct mxt_object *object = data->object_table + i; + u8 min_id, max_id; + + le16_to_cpus(&object->start_address); + + if (object->num_report_ids) { + min_id = reportid; + reportid += object->num_report_ids * + (object->instances + 1); + max_id = reportid - 1; + } else { + min_id = 0; + max_id = 0; + } + + dev_dbg(&data->client->dev, + "Type %2d Start %3d Size %3d Instances %2d ReportIDs %3u : %3u\n", + object->type, object->start_address, object->size + 1, + object->instances + 1, min_id, max_id); + + switch (object->type) { + case MXT_GEN_COMMAND_T6: + data->T6_reportid = min_id; + break; + case MXT_TOUCH_MULTI_T9: + data->T9_reportid_min = min_id; + data->T9_reportid_max = max_id; + break; + case MXT_SPT_GPIOPWM_T19: + data->T19_reportid = min_id; + break; + } + } + + return 0; +} + +static void mxt_free_object_table(struct mxt_data *data) +{ + kfree(data->object_table); + data->object_table = NULL; + data->T6_reportid = 0; + data->T9_reportid_min = 0; + data->T9_reportid_max = 0; + data->T19_reportid = 0; +} + +static int mxt_initialize(struct mxt_data *data) +{ + struct i2c_client *client = data->client; + struct mxt_info *info = &data->info; + int error; + u8 val; + + error = mxt_get_info(data); + if (error) + return error; + + data->object_table = kcalloc(info->object_num, + sizeof(struct mxt_object), + GFP_KERNEL); + if (!data->object_table) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + /* Get object table information */ + error = mxt_get_object_table(data); + if (error) + goto err_free_object_table; + + /* Check register init values */ + error = mxt_check_reg_init(data); + if (error) + goto err_free_object_table; + + mxt_handle_pdata(data); + + /* Backup to memory */ + mxt_write_object(data, MXT_GEN_COMMAND_T6, + MXT_COMMAND_BACKUPNV, + MXT_BACKUP_VALUE); + msleep(MXT_BACKUP_TIME); + + /* Soft reset */ + mxt_write_object(data, MXT_GEN_COMMAND_T6, + MXT_COMMAND_RESET, 1); + msleep(MXT_RESET_TIME); + + /* Update matrix size at info struct */ + error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, &val); + if (error) + goto err_free_object_table; + info->matrix_xsize = val; + + error = mxt_read_reg(client, MXT_MATRIX_Y_SIZE, &val); + if (error) + goto err_free_object_table; + info->matrix_ysize = val; + + dev_info(&client->dev, + "Family ID: %u Variant ID: %u Major.Minor.Build: %u.%u.%02X\n", + info->family_id, info->variant_id, info->version >> 4, + info->version & 0xf, info->build); + + dev_info(&client->dev, + "Matrix X Size: %u Matrix Y Size: %u Object Num: %u\n", + info->matrix_xsize, info->matrix_ysize, + info->object_num); + + return 0; + +err_free_object_table: + mxt_free_object_table(data); + return error; +} + +static void mxt_calc_resolution(struct mxt_data *data) +{ + unsigned int max_x = data->pdata->x_size - 1; + unsigned int max_y = data->pdata->y_size - 1; + + if (data->pdata->orient & MXT_XY_SWITCH) { + data->max_x = max_y; + data->max_y = max_x; + } else { + data->max_x = max_x; + data->max_y = max_y; + } +} + +/* Firmware Version is returned as Major.Minor.Build */ +static ssize_t mxt_fw_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mxt_data *data = dev_get_drvdata(dev); + struct mxt_info *info = &data->info; + return scnprintf(buf, PAGE_SIZE, "%u.%u.%02X\n", + info->version >> 4, info->version & 0xf, info->build); +} + +/* Hardware Version is returned as FamilyID.VariantID */ +static ssize_t mxt_hw_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mxt_data *data = dev_get_drvdata(dev); + struct mxt_info *info = &data->info; + return scnprintf(buf, PAGE_SIZE, "%u.%u\n", + info->family_id, info->variant_id); +} + +static ssize_t mxt_show_instance(char *buf, int count, + struct mxt_object *object, int instance, + const u8 *val) +{ + int i; + + if (object->instances > 0) + count += scnprintf(buf + count, PAGE_SIZE - count, + "Instance %u\n", instance); + + for (i = 0; i < object->size + 1; i++) + count += scnprintf(buf + count, PAGE_SIZE - count, + "\t[%2u]: %02x (%d)\n", i, val[i], val[i]); + count += scnprintf(buf + count, PAGE_SIZE - count, "\n"); + + return count; +} + +static ssize_t mxt_object_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mxt_data *data = dev_get_drvdata(dev); + struct mxt_object *object; + int count = 0; + int i, j; + int error; + u8 *obuf; + + /* Pre-allocate buffer large enough to hold max sized object. */ + obuf = kmalloc(256, GFP_KERNEL); + if (!obuf) + return -ENOMEM; + + error = 0; + for (i = 0; i < data->info.object_num; i++) { + object = data->object_table + i; + + if (!mxt_object_readable(object->type)) + continue; + + count += scnprintf(buf + count, PAGE_SIZE - count, + "T%u:\n", object->type); + + for (j = 0; j < object->instances + 1; j++) { + u16 size = object->size + 1; + u16 addr = object->start_address + j * size; + + error = __mxt_read_reg(data->client, addr, size, obuf); + if (error) + goto done; + + count = mxt_show_instance(buf, count, object, j, obuf); + } + } + +done: + kfree(obuf); + return error ?: count; +} + +static int mxt_load_fw(struct device *dev, const char *fn) +{ + struct mxt_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + const struct firmware *fw = NULL; + unsigned int frame_size; + unsigned int pos = 0; + int ret; + + ret = request_firmware(&fw, fn, dev); + if (ret) { + dev_err(dev, "Unable to open firmware %s\n", fn); + return ret; + } + + /* Change to the bootloader mode */ + mxt_write_object(data, MXT_GEN_COMMAND_T6, + MXT_COMMAND_RESET, MXT_BOOT_VALUE); + msleep(MXT_RESET_TIME); + + /* Change to slave address of bootloader */ + if (client->addr == MXT_APP_LOW) + client->addr = MXT_BOOT_LOW; + else + client->addr = MXT_BOOT_HIGH; + + ret = mxt_check_bootloader(client, MXT_WAITING_BOOTLOAD_CMD); + if (ret) + goto out; + + /* Unlock bootloader */ + mxt_unlock_bootloader(client); + + while (pos < fw->size) { + ret = mxt_check_bootloader(client, + MXT_WAITING_FRAME_DATA); + if (ret) + goto out; + + frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1)); + + /* We should add 2 at frame size as the the firmware data is not + * included the CRC bytes. + */ + frame_size += 2; + + /* Write one frame to device */ + mxt_fw_write(client, fw->data + pos, frame_size); + + ret = mxt_check_bootloader(client, + MXT_FRAME_CRC_PASS); + if (ret) + goto out; + + pos += frame_size; + + dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size); + } + +out: + release_firmware(fw); + + /* Change to slave address of application */ + if (client->addr == MXT_BOOT_LOW) + client->addr = MXT_APP_LOW; + else + client->addr = MXT_APP_HIGH; + + return ret; +} + +static ssize_t mxt_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct mxt_data *data = dev_get_drvdata(dev); + int error; + + disable_irq(data->irq); + + error = mxt_load_fw(dev, MXT_FW_NAME); + if (error) { + dev_err(dev, "The firmware update failed(%d)\n", error); + count = error; + } else { + dev_dbg(dev, "The firmware update succeeded\n"); + + /* Wait for reset */ + msleep(MXT_FWRESET_TIME); + + mxt_free_object_table(data); + + mxt_initialize(data); + } + + enable_irq(data->irq); + + error = mxt_make_highchg(data); + if (error) + return error; + + return count; +} + +static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL); +static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL); +static DEVICE_ATTR(object, S_IRUGO, mxt_object_show, NULL); +static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store); + +static struct attribute *mxt_attrs[] = { + &dev_attr_fw_version.attr, + &dev_attr_hw_version.attr, + &dev_attr_object.attr, + &dev_attr_update_fw.attr, + NULL +}; + +static const struct attribute_group mxt_attr_group = { + .attrs = mxt_attrs, +}; + +static void mxt_start(struct mxt_data *data) +{ + /* Touch enable */ + mxt_write_object(data, + MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83); +} + +static void mxt_stop(struct mxt_data *data) +{ + /* Touch disable */ + mxt_write_object(data, + MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0); +} + +static int mxt_input_open(struct input_dev *dev) +{ + struct mxt_data *data = input_get_drvdata(dev); + + mxt_start(data); + + return 0; +} + +static void mxt_input_close(struct input_dev *dev) +{ + struct mxt_data *data = input_get_drvdata(dev); + + mxt_stop(data); +} + +static int mxt_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct mxt_platform_data *pdata = client->dev.platform_data; + struct mxt_data *data; + struct input_dev *input_dev; + int error; + unsigned int num_mt_slots; + + if (!pdata) + return -EINVAL; + + data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!data || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + data->is_tp = pdata && pdata->is_tp; + + input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" : + "Atmel maXTouch Touchscreen"; + snprintf(data->phys, sizeof(data->phys), "i2c-%u-%04x/input0", + client->adapter->nr, client->addr); + + input_dev->phys = data->phys; + + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->open = mxt_input_open; + input_dev->close = mxt_input_close; + + data->client = client; + data->input_dev = input_dev; + data->pdata = pdata; + data->irq = client->irq; + + mxt_calc_resolution(data); + + error = mxt_initialize(data); + if (error) + goto err_free_mem; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + + if (data->is_tp) { + int i; + __set_bit(INPUT_PROP_POINTER, input_dev->propbit); + __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit); + + for (i = 0; i < MXT_NUM_GPIO; i++) + if (pdata->key_map[i] != KEY_RESERVED) + __set_bit(pdata->key_map[i], input_dev->keybit); + + __set_bit(BTN_TOOL_FINGER, input_dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); + __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); + __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit); + __set_bit(BTN_TOOL_QUINTTAP, input_dev->keybit); + + input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM); + input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM); + input_abs_set_res(input_dev, ABS_MT_POSITION_X, + MXT_PIXELS_PER_MM); + input_abs_set_res(input_dev, ABS_MT_POSITION_Y, + MXT_PIXELS_PER_MM); + } + + /* For single touch */ + input_set_abs_params(input_dev, ABS_X, + 0, data->max_x, 0, 0); + input_set_abs_params(input_dev, ABS_Y, + 0, data->max_y, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, + 0, 255, 0, 0); + + /* For multi touch */ + num_mt_slots = data->T9_reportid_max - data->T9_reportid_min + 1; + error = input_mt_init_slots(input_dev, num_mt_slots, 0); + if (error) + goto err_free_object; + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, + 0, MXT_MAX_AREA, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, + 0, data->max_x, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, + 0, data->max_y, 0, 0); + input_set_abs_params(input_dev, ABS_MT_PRESSURE, + 0, 255, 0, 0); + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + error = request_threaded_irq(client->irq, NULL, mxt_interrupt, + pdata->irqflags | IRQF_ONESHOT, + client->name, data); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_object; + } + + error = mxt_make_highchg(data); + if (error) + goto err_free_irq; + + error = input_register_device(input_dev); + if (error) + goto err_free_irq; + + error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group); + if (error) + goto err_unregister_device; + + return 0; + +err_unregister_device: + input_unregister_device(input_dev); + input_dev = NULL; +err_free_irq: + free_irq(client->irq, data); +err_free_object: + kfree(data->object_table); +err_free_mem: + input_free_device(input_dev); + kfree(data); + return error; +} + +static int mxt_remove(struct i2c_client *client) +{ + struct mxt_data *data = i2c_get_clientdata(client); + + sysfs_remove_group(&client->dev.kobj, &mxt_attr_group); + free_irq(data->irq, data); + input_unregister_device(data->input_dev); + kfree(data->object_table); + kfree(data); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int mxt_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mxt_data *data = i2c_get_clientdata(client); + struct input_dev *input_dev = data->input_dev; + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + mxt_stop(data); + + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int mxt_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mxt_data *data = i2c_get_clientdata(client); + struct input_dev *input_dev = data->input_dev; + + /* Soft reset */ + mxt_write_object(data, MXT_GEN_COMMAND_T6, + MXT_COMMAND_RESET, 1); + + msleep(MXT_RESET_TIME); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + mxt_start(data); + + mutex_unlock(&input_dev->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume); + +static const struct i2c_device_id mxt_id[] = { + { "qt602240_ts", 0 }, + { "atmel_mxt_ts", 0 }, + { "atmel_mxt_tp", 0 }, + { "mXT224", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mxt_id); + +static struct i2c_driver mxt_driver = { + .driver = { + .name = "atmel_mxt_ts", + .owner = THIS_MODULE, + .pm = &mxt_pm_ops, + }, + .probe = mxt_probe, + .remove = mxt_remove, + .id_table = mxt_id, +}; + +module_i2c_driver(mxt_driver); + +/* Module information */ +MODULE_AUTHOR("Joonyoung Shim "); +MODULE_DESCRIPTION("Atmel maXTouch Touchscreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/atmel_tsadcc.c b/drivers/input/touchscreen/atmel_tsadcc.c new file mode 100644 index 00000000..95f6785a --- /dev/null +++ b/drivers/input/touchscreen/atmel_tsadcc.c @@ -0,0 +1,359 @@ +/* + * Atmel Touch Screen Driver + * + * Copyright (c) 2008 ATMEL + * Copyright (c) 2008 Dan Liang + * Copyright (c) 2008 TimeSys Corporation + * Copyright (c) 2008 Justin Waters + * + * Based on touchscreen code from Atmel Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Register definitions based on AT91SAM9RL64 preliminary draft datasheet */ + +#define ATMEL_TSADCC_CR 0x00 /* Control register */ +#define ATMEL_TSADCC_SWRST (1 << 0) /* Software Reset*/ +#define ATMEL_TSADCC_START (1 << 1) /* Start conversion */ + +#define ATMEL_TSADCC_MR 0x04 /* Mode register */ +#define ATMEL_TSADCC_TSAMOD (3 << 0) /* ADC mode */ +#define ATMEL_TSADCC_TSAMOD_ADC_ONLY_MODE (0x0) /* ADC Mode */ +#define ATMEL_TSADCC_TSAMOD_TS_ONLY_MODE (0x1) /* Touch Screen Only Mode */ +#define ATMEL_TSADCC_LOWRES (1 << 4) /* Resolution selection */ +#define ATMEL_TSADCC_SLEEP (1 << 5) /* Sleep mode */ +#define ATMEL_TSADCC_PENDET (1 << 6) /* Pen Detect selection */ +#define ATMEL_TSADCC_PRES (1 << 7) /* Pressure Measurement Selection */ +#define ATMEL_TSADCC_PRESCAL (0x3f << 8) /* Prescalar Rate Selection */ +#define ATMEL_TSADCC_EPRESCAL (0xff << 8) /* Prescalar Rate Selection (Extended) */ +#define ATMEL_TSADCC_STARTUP (0x7f << 16) /* Start Up time */ +#define ATMEL_TSADCC_SHTIM (0xf << 24) /* Sample & Hold time */ +#define ATMEL_TSADCC_PENDBC (0xf << 28) /* Pen Detect debouncing time */ + +#define ATMEL_TSADCC_TRGR 0x08 /* Trigger register */ +#define ATMEL_TSADCC_TRGMOD (7 << 0) /* Trigger mode */ +#define ATMEL_TSADCC_TRGMOD_NONE (0 << 0) +#define ATMEL_TSADCC_TRGMOD_EXT_RISING (1 << 0) +#define ATMEL_TSADCC_TRGMOD_EXT_FALLING (2 << 0) +#define ATMEL_TSADCC_TRGMOD_EXT_ANY (3 << 0) +#define ATMEL_TSADCC_TRGMOD_PENDET (4 << 0) +#define ATMEL_TSADCC_TRGMOD_PERIOD (5 << 0) +#define ATMEL_TSADCC_TRGMOD_CONTINUOUS (6 << 0) +#define ATMEL_TSADCC_TRGPER (0xffff << 16) /* Trigger period */ + +#define ATMEL_TSADCC_TSR 0x0C /* Touch Screen register */ +#define ATMEL_TSADCC_TSFREQ (0xf << 0) /* TS Frequency in Interleaved mode */ +#define ATMEL_TSADCC_TSSHTIM (0xf << 24) /* Sample & Hold time */ + +#define ATMEL_TSADCC_CHER 0x10 /* Channel Enable register */ +#define ATMEL_TSADCC_CHDR 0x14 /* Channel Disable register */ +#define ATMEL_TSADCC_CHSR 0x18 /* Channel Status register */ +#define ATMEL_TSADCC_CH(n) (1 << (n)) /* Channel number */ + +#define ATMEL_TSADCC_SR 0x1C /* Status register */ +#define ATMEL_TSADCC_EOC(n) (1 << ((n)+0)) /* End of conversion for channel N */ +#define ATMEL_TSADCC_OVRE(n) (1 << ((n)+8)) /* Overrun error for channel N */ +#define ATMEL_TSADCC_DRDY (1 << 16) /* Data Ready */ +#define ATMEL_TSADCC_GOVRE (1 << 17) /* General Overrun Error */ +#define ATMEL_TSADCC_ENDRX (1 << 18) /* End of RX Buffer */ +#define ATMEL_TSADCC_RXBUFF (1 << 19) /* TX Buffer full */ +#define ATMEL_TSADCC_PENCNT (1 << 20) /* Pen contact */ +#define ATMEL_TSADCC_NOCNT (1 << 21) /* No contact */ + +#define ATMEL_TSADCC_LCDR 0x20 /* Last Converted Data register */ +#define ATMEL_TSADCC_DATA (0x3ff << 0) /* Channel data */ + +#define ATMEL_TSADCC_IER 0x24 /* Interrupt Enable register */ +#define ATMEL_TSADCC_IDR 0x28 /* Interrupt Disable register */ +#define ATMEL_TSADCC_IMR 0x2C /* Interrupt Mask register */ +#define ATMEL_TSADCC_CDR0 0x30 /* Channel Data 0 */ +#define ATMEL_TSADCC_CDR1 0x34 /* Channel Data 1 */ +#define ATMEL_TSADCC_CDR2 0x38 /* Channel Data 2 */ +#define ATMEL_TSADCC_CDR3 0x3C /* Channel Data 3 */ +#define ATMEL_TSADCC_CDR4 0x40 /* Channel Data 4 */ +#define ATMEL_TSADCC_CDR5 0x44 /* Channel Data 5 */ + +#define ATMEL_TSADCC_XPOS 0x50 +#define ATMEL_TSADCC_Z1DAT 0x54 +#define ATMEL_TSADCC_Z2DAT 0x58 + +#define PRESCALER_VAL(x) ((x) >> 8) + +#define ADC_DEFAULT_CLOCK 100000 + +struct atmel_tsadcc { + struct input_dev *input; + char phys[32]; + struct clk *clk; + int irq; + unsigned int prev_absx; + unsigned int prev_absy; + unsigned char bufferedmeasure; +}; + +static void __iomem *tsc_base; + +#define atmel_tsadcc_read(reg) __raw_readl(tsc_base + (reg)) +#define atmel_tsadcc_write(reg, val) __raw_writel((val), tsc_base + (reg)) + +static irqreturn_t atmel_tsadcc_interrupt(int irq, void *dev) +{ + struct atmel_tsadcc *ts_dev = (struct atmel_tsadcc *)dev; + struct input_dev *input_dev = ts_dev->input; + + unsigned int status; + unsigned int reg; + + status = atmel_tsadcc_read(ATMEL_TSADCC_SR); + status &= atmel_tsadcc_read(ATMEL_TSADCC_IMR); + + if (status & ATMEL_TSADCC_NOCNT) { + /* Contact lost */ + reg = atmel_tsadcc_read(ATMEL_TSADCC_MR) | ATMEL_TSADCC_PENDBC; + + atmel_tsadcc_write(ATMEL_TSADCC_MR, reg); + atmel_tsadcc_write(ATMEL_TSADCC_TRGR, ATMEL_TSADCC_TRGMOD_NONE); + atmel_tsadcc_write(ATMEL_TSADCC_IDR, + ATMEL_TSADCC_EOC(3) | ATMEL_TSADCC_NOCNT); + atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT); + + input_report_key(input_dev, BTN_TOUCH, 0); + ts_dev->bufferedmeasure = 0; + input_sync(input_dev); + + } else if (status & ATMEL_TSADCC_PENCNT) { + /* Pen detected */ + reg = atmel_tsadcc_read(ATMEL_TSADCC_MR); + reg &= ~ATMEL_TSADCC_PENDBC; + + atmel_tsadcc_write(ATMEL_TSADCC_IDR, ATMEL_TSADCC_PENCNT); + atmel_tsadcc_write(ATMEL_TSADCC_MR, reg); + atmel_tsadcc_write(ATMEL_TSADCC_IER, + ATMEL_TSADCC_EOC(3) | ATMEL_TSADCC_NOCNT); + atmel_tsadcc_write(ATMEL_TSADCC_TRGR, + ATMEL_TSADCC_TRGMOD_PERIOD | (0x0FFF << 16)); + + } else if (status & ATMEL_TSADCC_EOC(3)) { + /* Conversion finished */ + + if (ts_dev->bufferedmeasure) { + /* Last measurement is always discarded, since it can + * be erroneous. + * Always report previous measurement */ + input_report_abs(input_dev, ABS_X, ts_dev->prev_absx); + input_report_abs(input_dev, ABS_Y, ts_dev->prev_absy); + input_report_key(input_dev, BTN_TOUCH, 1); + input_sync(input_dev); + } else + ts_dev->bufferedmeasure = 1; + + /* Now make new measurement */ + ts_dev->prev_absx = atmel_tsadcc_read(ATMEL_TSADCC_CDR3) << 10; + ts_dev->prev_absx /= atmel_tsadcc_read(ATMEL_TSADCC_CDR2); + + ts_dev->prev_absy = atmel_tsadcc_read(ATMEL_TSADCC_CDR1) << 10; + ts_dev->prev_absy /= atmel_tsadcc_read(ATMEL_TSADCC_CDR0); + } + + return IRQ_HANDLED; +} + +/* + * The functions for inserting/removing us as a module. + */ + +static int atmel_tsadcc_probe(struct platform_device *pdev) +{ + struct atmel_tsadcc *ts_dev; + struct input_dev *input_dev; + struct resource *res; + struct at91_tsadcc_data *pdata = pdev->dev.platform_data; + int err = 0; + unsigned int prsc; + unsigned int reg; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "no mmio resource defined.\n"); + return -ENXIO; + } + + /* Allocate memory for device */ + ts_dev = kzalloc(sizeof(struct atmel_tsadcc), GFP_KERNEL); + if (!ts_dev) { + dev_err(&pdev->dev, "failed to allocate memory.\n"); + return -ENOMEM; + } + platform_set_drvdata(pdev, ts_dev); + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&pdev->dev, "failed to allocate input device.\n"); + err = -EBUSY; + goto err_free_mem; + } + + ts_dev->irq = platform_get_irq(pdev, 0); + if (ts_dev->irq < 0) { + dev_err(&pdev->dev, "no irq ID is designated.\n"); + err = -ENODEV; + goto err_free_dev; + } + + if (!request_mem_region(res->start, resource_size(res), + "atmel tsadcc regs")) { + dev_err(&pdev->dev, "resources is unavailable.\n"); + err = -EBUSY; + goto err_free_dev; + } + + tsc_base = ioremap(res->start, resource_size(res)); + if (!tsc_base) { + dev_err(&pdev->dev, "failed to map registers.\n"); + err = -ENOMEM; + goto err_release_mem; + } + + err = request_irq(ts_dev->irq, atmel_tsadcc_interrupt, 0, + pdev->dev.driver->name, ts_dev); + if (err) { + dev_err(&pdev->dev, "failed to allocate irq.\n"); + goto err_unmap_regs; + } + + ts_dev->clk = clk_get(&pdev->dev, "tsc_clk"); + if (IS_ERR(ts_dev->clk)) { + dev_err(&pdev->dev, "failed to get ts_clk\n"); + err = PTR_ERR(ts_dev->clk); + goto err_free_irq; + } + + ts_dev->input = input_dev; + ts_dev->bufferedmeasure = 0; + + snprintf(ts_dev->phys, sizeof(ts_dev->phys), + "%s/input0", dev_name(&pdev->dev)); + + input_dev->name = "atmel touch screen controller"; + input_dev->phys = ts_dev->phys; + input_dev->dev.parent = &pdev->dev; + + __set_bit(EV_ABS, input_dev->evbit); + input_set_abs_params(input_dev, ABS_X, 0, 0x3FF, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 0x3FF, 0, 0); + + input_set_capability(input_dev, EV_KEY, BTN_TOUCH); + + /* clk_enable() always returns 0, no need to check it */ + clk_enable(ts_dev->clk); + + prsc = clk_get_rate(ts_dev->clk); + dev_info(&pdev->dev, "Master clock is set at: %d Hz\n", prsc); + + if (!pdata) + goto err_fail; + + if (!pdata->adc_clock) + pdata->adc_clock = ADC_DEFAULT_CLOCK; + + prsc = (prsc / (2 * pdata->adc_clock)) - 1; + + /* saturate if this value is too high */ + if (cpu_is_at91sam9rl()) { + if (prsc > PRESCALER_VAL(ATMEL_TSADCC_PRESCAL)) + prsc = PRESCALER_VAL(ATMEL_TSADCC_PRESCAL); + } else { + if (prsc > PRESCALER_VAL(ATMEL_TSADCC_EPRESCAL)) + prsc = PRESCALER_VAL(ATMEL_TSADCC_EPRESCAL); + } + + dev_info(&pdev->dev, "Prescaler is set at: %d\n", prsc); + + reg = ATMEL_TSADCC_TSAMOD_TS_ONLY_MODE | + ((0x00 << 5) & ATMEL_TSADCC_SLEEP) | /* Normal Mode */ + ((0x01 << 6) & ATMEL_TSADCC_PENDET) | /* Enable Pen Detect */ + (prsc << 8) | + ((0x26 << 16) & ATMEL_TSADCC_STARTUP) | + ((pdata->pendet_debounce << 28) & ATMEL_TSADCC_PENDBC); + + atmel_tsadcc_write(ATMEL_TSADCC_CR, ATMEL_TSADCC_SWRST); + atmel_tsadcc_write(ATMEL_TSADCC_MR, reg); + atmel_tsadcc_write(ATMEL_TSADCC_TRGR, ATMEL_TSADCC_TRGMOD_NONE); + atmel_tsadcc_write(ATMEL_TSADCC_TSR, + (pdata->ts_sample_hold_time << 24) & ATMEL_TSADCC_TSSHTIM); + + atmel_tsadcc_read(ATMEL_TSADCC_SR); + atmel_tsadcc_write(ATMEL_TSADCC_IER, ATMEL_TSADCC_PENCNT); + + /* All went ok, so register to the input system */ + err = input_register_device(input_dev); + if (err) + goto err_fail; + + return 0; + +err_fail: + clk_disable(ts_dev->clk); + clk_put(ts_dev->clk); +err_free_irq: + free_irq(ts_dev->irq, ts_dev); +err_unmap_regs: + iounmap(tsc_base); +err_release_mem: + release_mem_region(res->start, resource_size(res)); +err_free_dev: + input_free_device(input_dev); +err_free_mem: + kfree(ts_dev); + return err; +} + +static int atmel_tsadcc_remove(struct platform_device *pdev) +{ + struct atmel_tsadcc *ts_dev = dev_get_drvdata(&pdev->dev); + struct resource *res; + + free_irq(ts_dev->irq, ts_dev); + + input_unregister_device(ts_dev->input); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + iounmap(tsc_base); + release_mem_region(res->start, resource_size(res)); + + clk_disable(ts_dev->clk); + clk_put(ts_dev->clk); + + kfree(ts_dev); + + return 0; +} + +static struct platform_driver atmel_tsadcc_driver = { + .probe = atmel_tsadcc_probe, + .remove = atmel_tsadcc_remove, + .driver = { + .name = "atmel_tsadcc", + }, +}; +module_platform_driver(atmel_tsadcc_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Atmel TouchScreen Driver"); +MODULE_AUTHOR("Dan Liang "); + diff --git a/drivers/input/touchscreen/auo-pixcir-ts.c b/drivers/input/touchscreen/auo-pixcir-ts.c new file mode 100644 index 00000000..d3f9f6b0 --- /dev/null +++ b/drivers/input/touchscreen/auo-pixcir-ts.c @@ -0,0 +1,704 @@ +/* + * Driver for AUO in-cell touchscreens + * + * Copyright (c) 2011 Heiko Stuebner + * + * loosely based on auo_touch.c from Dell Streak vendor-kernel + * + * Copyright (c) 2008 QUALCOMM Incorporated. + * Copyright (c) 2008 QUALCOMM USA, INC. + * + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Coordinate calculation: + * X1 = X1_LSB + X1_MSB*256 + * Y1 = Y1_LSB + Y1_MSB*256 + * X2 = X2_LSB + X2_MSB*256 + * Y2 = Y2_LSB + Y2_MSB*256 + */ +#define AUO_PIXCIR_REG_X1_LSB 0x00 +#define AUO_PIXCIR_REG_X1_MSB 0x01 +#define AUO_PIXCIR_REG_Y1_LSB 0x02 +#define AUO_PIXCIR_REG_Y1_MSB 0x03 +#define AUO_PIXCIR_REG_X2_LSB 0x04 +#define AUO_PIXCIR_REG_X2_MSB 0x05 +#define AUO_PIXCIR_REG_Y2_LSB 0x06 +#define AUO_PIXCIR_REG_Y2_MSB 0x07 + +#define AUO_PIXCIR_REG_STRENGTH 0x0d +#define AUO_PIXCIR_REG_STRENGTH_X1_LSB 0x0e +#define AUO_PIXCIR_REG_STRENGTH_X1_MSB 0x0f + +#define AUO_PIXCIR_REG_RAW_DATA_X 0x2b +#define AUO_PIXCIR_REG_RAW_DATA_Y 0x4f + +#define AUO_PIXCIR_REG_X_SENSITIVITY 0x6f +#define AUO_PIXCIR_REG_Y_SENSITIVITY 0x70 +#define AUO_PIXCIR_REG_INT_SETTING 0x71 +#define AUO_PIXCIR_REG_INT_WIDTH 0x72 +#define AUO_PIXCIR_REG_POWER_MODE 0x73 + +#define AUO_PIXCIR_REG_VERSION 0x77 +#define AUO_PIXCIR_REG_CALIBRATE 0x78 + +#define AUO_PIXCIR_REG_TOUCHAREA_X1 0x1e +#define AUO_PIXCIR_REG_TOUCHAREA_Y1 0x1f +#define AUO_PIXCIR_REG_TOUCHAREA_X2 0x20 +#define AUO_PIXCIR_REG_TOUCHAREA_Y2 0x21 + +#define AUO_PIXCIR_REG_EEPROM_CALIB_X 0x42 +#define AUO_PIXCIR_REG_EEPROM_CALIB_Y 0xad + +#define AUO_PIXCIR_INT_TPNUM_MASK 0xe0 +#define AUO_PIXCIR_INT_TPNUM_SHIFT 5 +#define AUO_PIXCIR_INT_RELEASE (1 << 4) +#define AUO_PIXCIR_INT_ENABLE (1 << 3) +#define AUO_PIXCIR_INT_POL_HIGH (1 << 2) +#define AUO_PIXCIR_INT_MODE_MASK 0x03 + +/* + * Power modes: + * active: scan speed 60Hz + * sleep: scan speed 10Hz can be auto-activated, wakeup on 1st touch + * deep sleep: scan speed 1Hz can only be entered or left manually. + */ +#define AUO_PIXCIR_POWER_ACTIVE 0x00 +#define AUO_PIXCIR_POWER_SLEEP 0x01 +#define AUO_PIXCIR_POWER_DEEP_SLEEP 0x02 +#define AUO_PIXCIR_POWER_MASK 0x03 + +#define AUO_PIXCIR_POWER_ALLOW_SLEEP (1 << 2) +#define AUO_PIXCIR_POWER_IDLE_TIME(ms) ((ms & 0xf) << 4) + +#define AUO_PIXCIR_CALIBRATE 0x03 + +#define AUO_PIXCIR_EEPROM_CALIB_X_LEN 62 +#define AUO_PIXCIR_EEPROM_CALIB_Y_LEN 36 + +#define AUO_PIXCIR_RAW_DATA_X_LEN 18 +#define AUO_PIXCIR_RAW_DATA_Y_LEN 11 + +#define AUO_PIXCIR_STRENGTH_ENABLE (1 << 0) + +/* Touchscreen absolute values */ +#define AUO_PIXCIR_REPORT_POINTS 2 +#define AUO_PIXCIR_MAX_AREA 0xff +#define AUO_PIXCIR_PENUP_TIMEOUT_MS 10 + +struct auo_pixcir_ts { + struct i2c_client *client; + struct input_dev *input; + const struct auo_pixcir_ts_platdata *pdata; + char phys[32]; + + /* special handling for touch_indicate interupt mode */ + bool touch_ind_mode; + + wait_queue_head_t wait; + bool stopped; +}; + +struct auo_point_t { + int coord_x; + int coord_y; + int area_major; + int area_minor; + int orientation; +}; + +static int auo_pixcir_collect_data(struct auo_pixcir_ts *ts, + struct auo_point_t *point) +{ + struct i2c_client *client = ts->client; + const struct auo_pixcir_ts_platdata *pdata = ts->pdata; + uint8_t raw_coord[8]; + uint8_t raw_area[4]; + int i, ret; + + /* touch coordinates */ + ret = i2c_smbus_read_i2c_block_data(client, AUO_PIXCIR_REG_X1_LSB, + 8, raw_coord); + if (ret < 0) { + dev_err(&client->dev, "failed to read coordinate, %d\n", ret); + return ret; + } + + /* touch area */ + ret = i2c_smbus_read_i2c_block_data(client, AUO_PIXCIR_REG_TOUCHAREA_X1, + 4, raw_area); + if (ret < 0) { + dev_err(&client->dev, "could not read touch area, %d\n", ret); + return ret; + } + + for (i = 0; i < AUO_PIXCIR_REPORT_POINTS; i++) { + point[i].coord_x = + raw_coord[4 * i + 1] << 8 | raw_coord[4 * i]; + point[i].coord_y = + raw_coord[4 * i + 3] << 8 | raw_coord[4 * i + 2]; + + if (point[i].coord_x > pdata->x_max || + point[i].coord_y > pdata->y_max) { + dev_warn(&client->dev, "coordinates (%d,%d) invalid\n", + point[i].coord_x, point[i].coord_y); + point[i].coord_x = point[i].coord_y = 0; + } + + /* determine touch major, minor and orientation */ + point[i].area_major = max(raw_area[2 * i], raw_area[2 * i + 1]); + point[i].area_minor = min(raw_area[2 * i], raw_area[2 * i + 1]); + point[i].orientation = raw_area[2 * i] > raw_area[2 * i + 1]; + } + + return 0; +} + +static irqreturn_t auo_pixcir_interrupt(int irq, void *dev_id) +{ + struct auo_pixcir_ts *ts = dev_id; + const struct auo_pixcir_ts_platdata *pdata = ts->pdata; + struct auo_point_t point[AUO_PIXCIR_REPORT_POINTS]; + int i; + int ret; + int fingers = 0; + int abs = -1; + + while (!ts->stopped) { + + /* check for up event in touch touch_ind_mode */ + if (ts->touch_ind_mode) { + if (gpio_get_value(pdata->gpio_int) == 0) { + input_mt_sync(ts->input); + input_report_key(ts->input, BTN_TOUCH, 0); + input_sync(ts->input); + break; + } + } + + ret = auo_pixcir_collect_data(ts, point); + if (ret < 0) { + /* we want to loop only in touch_ind_mode */ + if (!ts->touch_ind_mode) + break; + + wait_event_timeout(ts->wait, ts->stopped, + msecs_to_jiffies(AUO_PIXCIR_PENUP_TIMEOUT_MS)); + continue; + } + + for (i = 0; i < AUO_PIXCIR_REPORT_POINTS; i++) { + if (point[i].coord_x > 0 || point[i].coord_y > 0) { + input_report_abs(ts->input, ABS_MT_POSITION_X, + point[i].coord_x); + input_report_abs(ts->input, ABS_MT_POSITION_Y, + point[i].coord_y); + input_report_abs(ts->input, ABS_MT_TOUCH_MAJOR, + point[i].area_major); + input_report_abs(ts->input, ABS_MT_TOUCH_MINOR, + point[i].area_minor); + input_report_abs(ts->input, ABS_MT_ORIENTATION, + point[i].orientation); + input_mt_sync(ts->input); + + /* use first finger as source for singletouch */ + if (fingers == 0) + abs = i; + + /* number of touch points could also be queried + * via i2c but would require an additional call + */ + fingers++; + } + } + + input_report_key(ts->input, BTN_TOUCH, fingers > 0); + + if (abs > -1) { + input_report_abs(ts->input, ABS_X, point[abs].coord_x); + input_report_abs(ts->input, ABS_Y, point[abs].coord_y); + } + + input_sync(ts->input); + + /* we want to loop only in touch_ind_mode */ + if (!ts->touch_ind_mode) + break; + + wait_event_timeout(ts->wait, ts->stopped, + msecs_to_jiffies(AUO_PIXCIR_PENUP_TIMEOUT_MS)); + } + + return IRQ_HANDLED; +} + +/* + * Set the power mode of the device. + * Valid modes are + * - AUO_PIXCIR_POWER_ACTIVE + * - AUO_PIXCIR_POWER_SLEEP - automatically left on first touch + * - AUO_PIXCIR_POWER_DEEP_SLEEP + */ +static int auo_pixcir_power_mode(struct auo_pixcir_ts *ts, int mode) +{ + struct i2c_client *client = ts->client; + int ret; + + ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_POWER_MODE); + if (ret < 0) { + dev_err(&client->dev, "unable to read reg %Xh, %d\n", + AUO_PIXCIR_REG_POWER_MODE, ret); + return ret; + } + + ret &= ~AUO_PIXCIR_POWER_MASK; + ret |= mode; + + ret = i2c_smbus_write_byte_data(client, AUO_PIXCIR_REG_POWER_MODE, ret); + if (ret) { + dev_err(&client->dev, "unable to write reg %Xh, %d\n", + AUO_PIXCIR_REG_POWER_MODE, ret); + return ret; + } + + return 0; +} + +static int auo_pixcir_int_config(struct auo_pixcir_ts *ts, + int int_setting) +{ + struct i2c_client *client = ts->client; + const struct auo_pixcir_ts_platdata *pdata = ts->pdata; + int ret; + + ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_INT_SETTING); + if (ret < 0) { + dev_err(&client->dev, "unable to read reg %Xh, %d\n", + AUO_PIXCIR_REG_INT_SETTING, ret); + return ret; + } + + ret &= ~AUO_PIXCIR_INT_MODE_MASK; + ret |= int_setting; + ret |= AUO_PIXCIR_INT_POL_HIGH; /* always use high for interrupts */ + + ret = i2c_smbus_write_byte_data(client, AUO_PIXCIR_REG_INT_SETTING, + ret); + if (ret < 0) { + dev_err(&client->dev, "unable to write reg %Xh, %d\n", + AUO_PIXCIR_REG_INT_SETTING, ret); + return ret; + } + + ts->touch_ind_mode = pdata->int_setting == AUO_PIXCIR_INT_TOUCH_IND; + + return 0; +} + +/* control the generation of interrupts on the device side */ +static int auo_pixcir_int_toggle(struct auo_pixcir_ts *ts, bool enable) +{ + struct i2c_client *client = ts->client; + int ret; + + ret = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_INT_SETTING); + if (ret < 0) { + dev_err(&client->dev, "unable to read reg %Xh, %d\n", + AUO_PIXCIR_REG_INT_SETTING, ret); + return ret; + } + + if (enable) + ret |= AUO_PIXCIR_INT_ENABLE; + else + ret &= ~AUO_PIXCIR_INT_ENABLE; + + ret = i2c_smbus_write_byte_data(client, AUO_PIXCIR_REG_INT_SETTING, + ret); + if (ret < 0) { + dev_err(&client->dev, "unable to write reg %Xh, %d\n", + AUO_PIXCIR_REG_INT_SETTING, ret); + return ret; + } + + return 0; +} + +static int auo_pixcir_start(struct auo_pixcir_ts *ts) +{ + struct i2c_client *client = ts->client; + int ret; + + ret = auo_pixcir_power_mode(ts, AUO_PIXCIR_POWER_ACTIVE); + if (ret < 0) { + dev_err(&client->dev, "could not set power mode, %d\n", + ret); + return ret; + } + + ts->stopped = false; + mb(); + enable_irq(client->irq); + + ret = auo_pixcir_int_toggle(ts, 1); + if (ret < 0) { + dev_err(&client->dev, "could not enable interrupt, %d\n", + ret); + disable_irq(client->irq); + return ret; + } + + return 0; +} + +static int auo_pixcir_stop(struct auo_pixcir_ts *ts) +{ + struct i2c_client *client = ts->client; + int ret; + + ret = auo_pixcir_int_toggle(ts, 0); + if (ret < 0) { + dev_err(&client->dev, "could not disable interrupt, %d\n", + ret); + return ret; + } + + /* disable receiving of interrupts */ + disable_irq(client->irq); + ts->stopped = true; + mb(); + wake_up(&ts->wait); + + return auo_pixcir_power_mode(ts, AUO_PIXCIR_POWER_DEEP_SLEEP); +} + +static int auo_pixcir_input_open(struct input_dev *dev) +{ + struct auo_pixcir_ts *ts = input_get_drvdata(dev); + int ret; + + ret = auo_pixcir_start(ts); + if (ret) + return ret; + + return 0; +} + +static void auo_pixcir_input_close(struct input_dev *dev) +{ + struct auo_pixcir_ts *ts = input_get_drvdata(dev); + + auo_pixcir_stop(ts); + + return; +} + +#ifdef CONFIG_PM_SLEEP +static int auo_pixcir_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct auo_pixcir_ts *ts = i2c_get_clientdata(client); + struct input_dev *input = ts->input; + int ret = 0; + + mutex_lock(&input->mutex); + + /* when configured as wakeup source, device should always wake system + * therefore start device if necessary + */ + if (device_may_wakeup(&client->dev)) { + /* need to start device if not open, to be wakeup source */ + if (!input->users) { + ret = auo_pixcir_start(ts); + if (ret) + goto unlock; + } + + enable_irq_wake(client->irq); + ret = auo_pixcir_power_mode(ts, AUO_PIXCIR_POWER_SLEEP); + } else if (input->users) { + ret = auo_pixcir_stop(ts); + } + +unlock: + mutex_unlock(&input->mutex); + + return ret; +} + +static int auo_pixcir_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct auo_pixcir_ts *ts = i2c_get_clientdata(client); + struct input_dev *input = ts->input; + int ret = 0; + + mutex_lock(&input->mutex); + + if (device_may_wakeup(&client->dev)) { + disable_irq_wake(client->irq); + + /* need to stop device if it was not open on suspend */ + if (!input->users) { + ret = auo_pixcir_stop(ts); + if (ret) + goto unlock; + } + + /* device wakes automatically from SLEEP */ + } else if (input->users) { + ret = auo_pixcir_start(ts); + } + +unlock: + mutex_unlock(&input->mutex); + + return ret; +} +#endif + +static SIMPLE_DEV_PM_OPS(auo_pixcir_pm_ops, + auo_pixcir_suspend, auo_pixcir_resume); + +#ifdef CONFIG_OF +static struct auo_pixcir_ts_platdata *auo_pixcir_parse_dt(struct device *dev) +{ + struct auo_pixcir_ts_platdata *pdata; + struct device_node *np = dev->of_node; + + if (!np) + return ERR_PTR(-ENOENT); + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "failed to allocate platform data\n"); + return ERR_PTR(-ENOMEM); + } + + pdata->gpio_int = of_get_gpio(np, 0); + if (!gpio_is_valid(pdata->gpio_int)) { + dev_err(dev, "failed to get interrupt gpio\n"); + return ERR_PTR(-EINVAL); + } + + pdata->gpio_rst = of_get_gpio(np, 1); + if (!gpio_is_valid(pdata->gpio_rst)) { + dev_err(dev, "failed to get reset gpio\n"); + return ERR_PTR(-EINVAL); + } + + if (of_property_read_u32(np, "x-size", &pdata->x_max)) { + dev_err(dev, "failed to get x-size property\n"); + return ERR_PTR(-EINVAL); + } + + if (of_property_read_u32(np, "y-size", &pdata->y_max)) { + dev_err(dev, "failed to get y-size property\n"); + return ERR_PTR(-EINVAL); + } + + /* default to asserting the interrupt when the screen is touched */ + pdata->int_setting = AUO_PIXCIR_INT_TOUCH_IND; + + return pdata; +} +#else +static struct auo_pixcir_ts_platdata *auo_pixcir_parse_dt(struct device *dev) +{ + return ERR_PTR(-EINVAL); +} +#endif + +static void auo_pixcir_reset(void *data) +{ + struct auo_pixcir_ts *ts = data; + + gpio_set_value(ts->pdata->gpio_rst, 0); +} + +static int auo_pixcir_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct auo_pixcir_ts_platdata *pdata; + struct auo_pixcir_ts *ts; + struct input_dev *input_dev; + int version; + int error; + + pdata = dev_get_platdata(&client->dev); + if (!pdata) { + pdata = auo_pixcir_parse_dt(&client->dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + } + + ts = devm_kzalloc(&client->dev, + sizeof(struct auo_pixcir_ts), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + input_dev = devm_input_allocate_device(&client->dev); + if (!input_dev) { + dev_err(&client->dev, "could not allocate input device\n"); + return -ENOMEM; + } + + ts->pdata = pdata; + ts->client = client; + ts->input = input_dev; + ts->touch_ind_mode = 0; + ts->stopped = true; + init_waitqueue_head(&ts->wait); + + snprintf(ts->phys, sizeof(ts->phys), + "%s/input0", dev_name(&client->dev)); + + input_dev->name = "AUO-Pixcir touchscreen"; + input_dev->phys = ts->phys; + input_dev->id.bustype = BUS_I2C; + + input_dev->open = auo_pixcir_input_open; + input_dev->close = auo_pixcir_input_close; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + + __set_bit(BTN_TOUCH, input_dev->keybit); + + /* For single touch */ + input_set_abs_params(input_dev, ABS_X, 0, pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, pdata->y_max, 0, 0); + + /* For multi touch */ + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, + pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, + pdata->y_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, + AUO_PIXCIR_MAX_AREA, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MINOR, 0, + AUO_PIXCIR_MAX_AREA, 0, 0); + input_set_abs_params(input_dev, ABS_MT_ORIENTATION, 0, 1, 0, 0); + + input_set_drvdata(ts->input, ts); + + error = devm_gpio_request_one(&client->dev, pdata->gpio_int, + GPIOF_DIR_IN, "auo_pixcir_ts_int"); + if (error) { + dev_err(&client->dev, "request of gpio %d failed, %d\n", + pdata->gpio_int, error); + return error; + } + + error = devm_gpio_request_one(&client->dev, pdata->gpio_rst, + GPIOF_DIR_OUT | GPIOF_INIT_HIGH, + "auo_pixcir_ts_rst"); + if (error) { + dev_err(&client->dev, "request of gpio %d failed, %d\n", + pdata->gpio_rst, error); + return error; + } + + error = devm_add_action(&client->dev, auo_pixcir_reset, ts); + if (error) { + auo_pixcir_reset(ts); + dev_err(&client->dev, "failed to register reset action, %d\n", + error); + return error; + } + + msleep(200); + + version = i2c_smbus_read_byte_data(client, AUO_PIXCIR_REG_VERSION); + if (version < 0) { + error = version; + return error; + } + + dev_info(&client->dev, "firmware version 0x%X\n", version); + + error = auo_pixcir_int_config(ts, pdata->int_setting); + if (error) + return error; + + error = devm_request_threaded_irq(&client->dev, client->irq, + NULL, auo_pixcir_interrupt, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + input_dev->name, ts); + if (error) { + dev_err(&client->dev, "irq %d requested failed, %d\n", + client->irq, error); + return error; + } + + /* stop device and put it into deep sleep until it is opened */ + error = auo_pixcir_stop(ts); + if (error) + return error; + + error = input_register_device(input_dev); + if (error) { + dev_err(&client->dev, "could not register input device, %d\n", + error); + return error; + } + + i2c_set_clientdata(client, ts); + + return 0; +} + +static const struct i2c_device_id auo_pixcir_idtable[] = { + { "auo_pixcir_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, auo_pixcir_idtable); + +#ifdef CONFIG_OF +static struct of_device_id auo_pixcir_ts_dt_idtable[] = { + { .compatible = "auo,auo_pixcir_ts" }, + {}, +}; +MODULE_DEVICE_TABLE(of, auo_pixcir_ts_dt_idtable); +#endif + +static struct i2c_driver auo_pixcir_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "auo_pixcir_ts", + .pm = &auo_pixcir_pm_ops, + .of_match_table = of_match_ptr(auo_pixcir_ts_dt_idtable), + }, + .probe = auo_pixcir_probe, + .id_table = auo_pixcir_idtable, +}; + +module_i2c_driver(auo_pixcir_driver); + +MODULE_DESCRIPTION("AUO-PIXCIR touchscreen driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Heiko Stuebner "); diff --git a/drivers/input/touchscreen/bu21013_ts.c b/drivers/input/touchscreen/bu21013_ts.c new file mode 100644 index 00000000..b9b5ddad --- /dev/null +++ b/drivers/input/touchscreen/bu21013_ts.c @@ -0,0 +1,733 @@ +/* + * Copyright (C) ST-Ericsson SA 2010 + * Author: Naveen Kumar G for ST-Ericsson + * License terms:GNU General Public License (GPL) version 2 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PEN_DOWN_INTR 0 +#define MAX_FINGERS 2 +#define RESET_DELAY 30 +#define PENUP_TIMEOUT (10) +#define DELTA_MIN 16 +#define MASK_BITS 0x03 +#define SHIFT_8 8 +#define SHIFT_2 2 +#define LENGTH_OF_BUFFER 11 +#define I2C_RETRY_COUNT 5 + +#define BU21013_SENSORS_BTN_0_7_REG 0x70 +#define BU21013_SENSORS_BTN_8_15_REG 0x71 +#define BU21013_SENSORS_BTN_16_23_REG 0x72 +#define BU21013_X1_POS_MSB_REG 0x73 +#define BU21013_X1_POS_LSB_REG 0x74 +#define BU21013_Y1_POS_MSB_REG 0x75 +#define BU21013_Y1_POS_LSB_REG 0x76 +#define BU21013_X2_POS_MSB_REG 0x77 +#define BU21013_X2_POS_LSB_REG 0x78 +#define BU21013_Y2_POS_MSB_REG 0x79 +#define BU21013_Y2_POS_LSB_REG 0x7A +#define BU21013_INT_CLR_REG 0xE8 +#define BU21013_INT_MODE_REG 0xE9 +#define BU21013_GAIN_REG 0xEA +#define BU21013_OFFSET_MODE_REG 0xEB +#define BU21013_XY_EDGE_REG 0xEC +#define BU21013_RESET_REG 0xED +#define BU21013_CALIB_REG 0xEE +#define BU21013_DONE_REG 0xEF +#define BU21013_SENSOR_0_7_REG 0xF0 +#define BU21013_SENSOR_8_15_REG 0xF1 +#define BU21013_SENSOR_16_23_REG 0xF2 +#define BU21013_POS_MODE1_REG 0xF3 +#define BU21013_POS_MODE2_REG 0xF4 +#define BU21013_CLK_MODE_REG 0xF5 +#define BU21013_IDLE_REG 0xFA +#define BU21013_FILTER_REG 0xFB +#define BU21013_TH_ON_REG 0xFC +#define BU21013_TH_OFF_REG 0xFD + + +#define BU21013_RESET_ENABLE 0x01 + +#define BU21013_SENSORS_EN_0_7 0x3F +#define BU21013_SENSORS_EN_8_15 0xFC +#define BU21013_SENSORS_EN_16_23 0x1F + +#define BU21013_POS_MODE1_0 0x02 +#define BU21013_POS_MODE1_1 0x04 +#define BU21013_POS_MODE1_2 0x08 + +#define BU21013_POS_MODE2_ZERO 0x01 +#define BU21013_POS_MODE2_AVG1 0x02 +#define BU21013_POS_MODE2_AVG2 0x04 +#define BU21013_POS_MODE2_EN_XY 0x08 +#define BU21013_POS_MODE2_EN_RAW 0x10 +#define BU21013_POS_MODE2_MULTI 0x80 + +#define BU21013_CLK_MODE_DIV 0x01 +#define BU21013_CLK_MODE_EXT 0x02 +#define BU21013_CLK_MODE_CALIB 0x80 + +#define BU21013_IDLET_0 0x01 +#define BU21013_IDLET_1 0x02 +#define BU21013_IDLET_2 0x04 +#define BU21013_IDLET_3 0x08 +#define BU21013_IDLE_INTERMIT_EN 0x10 + +#define BU21013_DELTA_0_6 0x7F +#define BU21013_FILTER_EN 0x80 + +#define BU21013_INT_MODE_LEVEL 0x00 +#define BU21013_INT_MODE_EDGE 0x01 + +#define BU21013_GAIN_0 0x01 +#define BU21013_GAIN_1 0x02 +#define BU21013_GAIN_2 0x04 + +#define BU21013_OFFSET_MODE_DEFAULT 0x00 +#define BU21013_OFFSET_MODE_MOVE 0x01 +#define BU21013_OFFSET_MODE_DISABLE 0x02 + +#define BU21013_TH_ON_0 0x01 +#define BU21013_TH_ON_1 0x02 +#define BU21013_TH_ON_2 0x04 +#define BU21013_TH_ON_3 0x08 +#define BU21013_TH_ON_4 0x10 +#define BU21013_TH_ON_5 0x20 +#define BU21013_TH_ON_6 0x40 +#define BU21013_TH_ON_7 0x80 +#define BU21013_TH_ON_MAX 0xFF + +#define BU21013_TH_OFF_0 0x01 +#define BU21013_TH_OFF_1 0x02 +#define BU21013_TH_OFF_2 0x04 +#define BU21013_TH_OFF_3 0x08 +#define BU21013_TH_OFF_4 0x10 +#define BU21013_TH_OFF_5 0x20 +#define BU21013_TH_OFF_6 0x40 +#define BU21013_TH_OFF_7 0x80 +#define BU21013_TH_OFF_MAX 0xFF + +#define BU21013_X_EDGE_0 0x01 +#define BU21013_X_EDGE_1 0x02 +#define BU21013_X_EDGE_2 0x04 +#define BU21013_X_EDGE_3 0x08 +#define BU21013_Y_EDGE_0 0x10 +#define BU21013_Y_EDGE_1 0x20 +#define BU21013_Y_EDGE_2 0x40 +#define BU21013_Y_EDGE_3 0x80 + +#define BU21013_DONE 0x01 +#define BU21013_NUMBER_OF_X_SENSORS (6) +#define BU21013_NUMBER_OF_Y_SENSORS (11) + +#define DRIVER_TP "bu21013_tp" + +/** + * struct bu21013_ts_data - touch panel data structure + * @client: pointer to the i2c client + * @wait: variable to wait_queue_head_t structure + * @touch_stopped: touch stop flag + * @chip: pointer to the touch panel controller + * @in_dev: pointer to the input device structure + * @intr_pin: interrupt pin value + * @regulator: pointer to the Regulator used for touch screen + * + * Touch panel device data structure + */ +struct bu21013_ts_data { + struct i2c_client *client; + wait_queue_head_t wait; + const struct bu21013_platform_device *chip; + struct input_dev *in_dev; + struct regulator *regulator; + unsigned int irq; + unsigned int intr_pin; + bool touch_stopped; +}; + +/** + * bu21013_read_block_data(): read the touch co-ordinates + * @data: bu21013_ts_data structure pointer + * @buf: byte pointer + * + * Read the touch co-ordinates using i2c read block into buffer + * and returns integer. + */ +static int bu21013_read_block_data(struct bu21013_ts_data *data, u8 *buf) +{ + int ret, i; + + for (i = 0; i < I2C_RETRY_COUNT; i++) { + ret = i2c_smbus_read_i2c_block_data + (data->client, BU21013_SENSORS_BTN_0_7_REG, + LENGTH_OF_BUFFER, buf); + if (ret == LENGTH_OF_BUFFER) + return 0; + } + return -EINVAL; +} + +/** + * bu21013_do_touch_report(): Get the touch co-ordinates + * @data: bu21013_ts_data structure pointer + * + * Get the touch co-ordinates from touch sensor registers and writes + * into device structure and returns integer. + */ +static int bu21013_do_touch_report(struct bu21013_ts_data *data) +{ + u8 buf[LENGTH_OF_BUFFER]; + unsigned int pos_x[2], pos_y[2]; + bool has_x_sensors, has_y_sensors; + int finger_down_count = 0; + int i; + + if (data == NULL) + return -EINVAL; + + if (bu21013_read_block_data(data, buf) < 0) + return -EINVAL; + + has_x_sensors = hweight32(buf[0] & BU21013_SENSORS_EN_0_7); + has_y_sensors = hweight32(((buf[1] & BU21013_SENSORS_EN_8_15) | + ((buf[2] & BU21013_SENSORS_EN_16_23) << SHIFT_8)) >> SHIFT_2); + if (!has_x_sensors || !has_y_sensors) + return 0; + + for (i = 0; i < MAX_FINGERS; i++) { + const u8 *p = &buf[4 * i + 3]; + unsigned int x = p[0] << SHIFT_2 | (p[1] & MASK_BITS); + unsigned int y = p[2] << SHIFT_2 | (p[3] & MASK_BITS); + if (x == 0 || y == 0) + continue; + pos_x[finger_down_count] = x; + pos_y[finger_down_count] = y; + finger_down_count++; + } + + if (finger_down_count) { + if (finger_down_count == 2 && + (abs(pos_x[0] - pos_x[1]) < DELTA_MIN || + abs(pos_y[0] - pos_y[1]) < DELTA_MIN)) { + return 0; + } + + for (i = 0; i < finger_down_count; i++) { + if (data->chip->x_flip) + pos_x[i] = data->chip->touch_x_max - pos_x[i]; + if (data->chip->y_flip) + pos_y[i] = data->chip->touch_y_max - pos_y[i]; + + input_report_abs(data->in_dev, + ABS_MT_POSITION_X, pos_x[i]); + input_report_abs(data->in_dev, + ABS_MT_POSITION_Y, pos_y[i]); + input_mt_sync(data->in_dev); + } + } else + input_mt_sync(data->in_dev); + + input_sync(data->in_dev); + + return 0; +} +/** + * bu21013_gpio_irq() - gpio thread function for touch interrupt + * @irq: irq value + * @device_data: void pointer + * + * This gpio thread function for touch interrupt + * and returns irqreturn_t. + */ +static irqreturn_t bu21013_gpio_irq(int irq, void *device_data) +{ + struct bu21013_ts_data *data = device_data; + struct i2c_client *i2c = data->client; + int retval; + + do { + retval = bu21013_do_touch_report(data); + if (retval < 0) { + dev_err(&i2c->dev, "bu21013_do_touch_report failed\n"); + return IRQ_NONE; + } + + data->intr_pin = gpio_get_value(data->chip->touch_pin); + if (data->intr_pin == PEN_DOWN_INTR) + wait_event_timeout(data->wait, data->touch_stopped, + msecs_to_jiffies(2)); + } while (!data->intr_pin && !data->touch_stopped); + + return IRQ_HANDLED; +} + +/** + * bu21013_init_chip() - power on sequence for the bu21013 controller + * @data: device structure pointer + * + * This function is used to power on + * the bu21013 controller and returns integer. + */ +static int bu21013_init_chip(struct bu21013_ts_data *data) +{ + int retval; + struct i2c_client *i2c = data->client; + + retval = i2c_smbus_write_byte_data(i2c, BU21013_RESET_REG, + BU21013_RESET_ENABLE); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_RESET reg write failed\n"); + return retval; + } + msleep(RESET_DELAY); + + retval = i2c_smbus_write_byte_data(i2c, BU21013_SENSOR_0_7_REG, + BU21013_SENSORS_EN_0_7); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_SENSOR_0_7 reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_SENSOR_8_15_REG, + BU21013_SENSORS_EN_8_15); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_SENSOR_8_15 reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_SENSOR_16_23_REG, + BU21013_SENSORS_EN_16_23); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_SENSOR_16_23 reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_POS_MODE1_REG, + (BU21013_POS_MODE1_0 | BU21013_POS_MODE1_1)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_POS_MODE1 reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_POS_MODE2_REG, + (BU21013_POS_MODE2_ZERO | BU21013_POS_MODE2_AVG1 | + BU21013_POS_MODE2_AVG2 | BU21013_POS_MODE2_EN_RAW | + BU21013_POS_MODE2_MULTI)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_POS_MODE2 reg write failed\n"); + return retval; + } + + if (data->chip->ext_clk) + retval = i2c_smbus_write_byte_data(i2c, BU21013_CLK_MODE_REG, + (BU21013_CLK_MODE_EXT | BU21013_CLK_MODE_CALIB)); + else + retval = i2c_smbus_write_byte_data(i2c, BU21013_CLK_MODE_REG, + (BU21013_CLK_MODE_DIV | BU21013_CLK_MODE_CALIB)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_CLK_MODE reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_IDLE_REG, + (BU21013_IDLET_0 | BU21013_IDLE_INTERMIT_EN)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_IDLE reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_INT_MODE_REG, + BU21013_INT_MODE_LEVEL); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_INT_MODE reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_FILTER_REG, + (BU21013_DELTA_0_6 | + BU21013_FILTER_EN)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_FILTER reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_TH_ON_REG, + BU21013_TH_ON_5); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_TH_ON reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_TH_OFF_REG, + BU21013_TH_OFF_4 | BU21013_TH_OFF_3); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_TH_OFF reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_GAIN_REG, + (BU21013_GAIN_0 | BU21013_GAIN_1)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_GAIN reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_OFFSET_MODE_REG, + BU21013_OFFSET_MODE_DEFAULT); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_OFFSET_MODE reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_XY_EDGE_REG, + (BU21013_X_EDGE_0 | BU21013_X_EDGE_2 | + BU21013_Y_EDGE_1 | BU21013_Y_EDGE_3)); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_XY_EDGE reg write failed\n"); + return retval; + } + + retval = i2c_smbus_write_byte_data(i2c, BU21013_DONE_REG, + BU21013_DONE); + if (retval < 0) { + dev_err(&i2c->dev, "BU21013_REG_DONE reg write failed\n"); + return retval; + } + + return 0; +} + +/** + * bu21013_free_irq() - frees IRQ registered for touchscreen + * @bu21013_data: device structure pointer + * + * This function signals interrupt thread to stop processing and + * frees interrupt. + */ +static void bu21013_free_irq(struct bu21013_ts_data *bu21013_data) +{ + bu21013_data->touch_stopped = true; + wake_up(&bu21013_data->wait); + free_irq(bu21013_data->irq, bu21013_data); +} + +/** + * bu21013_cs_disable() - deconfigures the touch panel controller + * @bu21013_data: device structure pointer + * + * This function is used to deconfigure the chip selection + * for touch panel controller. + */ +static void bu21013_cs_disable(struct bu21013_ts_data *bu21013_data) +{ + int error; + + error = gpio_direction_output(bu21013_data->chip->cs_pin, 0); + if (error < 0) + dev_warn(&bu21013_data->client->dev, + "%s: gpio direction failed, error: %d\n", + __func__, error); + else + gpio_set_value(bu21013_data->chip->cs_pin, 0); + + gpio_free(bu21013_data->chip->cs_pin); +} + +#ifdef CONFIG_OF +static const struct bu21013_platform_device * +bu21013_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct bu21013_platform_device *pdata; + + if (!np) { + dev_err(dev, "no device tree or platform data\n"); + return ERR_PTR(-EINVAL); + } + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return ERR_PTR(-ENOMEM); + + pdata->y_flip = pdata->x_flip = false; + + pdata->x_flip = of_property_read_bool(np, "rohm,flip-x"); + pdata->y_flip = of_property_read_bool(np, "rohm,flip-y"); + + of_property_read_u32(np, "rohm,touch-max-x", &pdata->touch_x_max); + of_property_read_u32(np, "rohm,touch-max-y", &pdata->touch_y_max); + + pdata->touch_pin = of_get_named_gpio(np, "touch-gpio", 0); + pdata->cs_pin = of_get_named_gpio(np, "reset-gpio", 0); + + pdata->ext_clk = false; + + return pdata; +} +#else +static inline const struct bu21013_platform_device * +bu21013_parse_dt(struct device *dev) +{ + dev_err(dev, "no platform data available\n"); + return ERR_PTR(-EINVAL); +} +#endif + +/** + * bu21013_probe() - initializes the i2c-client touchscreen driver + * @client: i2c client structure pointer + * @id: i2c device id pointer + * + * This function used to initializes the i2c-client touchscreen + * driver and returns integer. + */ +static int bu21013_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct bu21013_platform_device *pdata = + dev_get_platdata(&client->dev); + struct bu21013_ts_data *bu21013_data; + struct input_dev *in_dev; + int error; + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_err(&client->dev, "i2c smbus byte data not supported\n"); + return -EIO; + } + + if (!pdata) { + pdata = bu21013_parse_dt(&client->dev); + if (IS_ERR(pdata)) + return PTR_ERR(pdata); + } + + if (!gpio_is_valid(pdata->touch_pin)) { + dev_err(&client->dev, "invalid touch_pin supplied\n"); + return -EINVAL; + } + + bu21013_data = kzalloc(sizeof(struct bu21013_ts_data), GFP_KERNEL); + in_dev = input_allocate_device(); + if (!bu21013_data || !in_dev) { + dev_err(&client->dev, "device memory alloc failed\n"); + error = -ENOMEM; + goto err_free_mem; + } + + bu21013_data->in_dev = in_dev; + bu21013_data->chip = pdata; + bu21013_data->client = client; + bu21013_data->irq = gpio_to_irq(pdata->touch_pin); + + bu21013_data->regulator = regulator_get(&client->dev, "avdd"); + if (IS_ERR(bu21013_data->regulator)) { + dev_err(&client->dev, "regulator_get failed\n"); + error = PTR_ERR(bu21013_data->regulator); + goto err_free_mem; + } + + error = regulator_enable(bu21013_data->regulator); + if (error < 0) { + dev_err(&client->dev, "regulator enable failed\n"); + goto err_put_regulator; + } + + bu21013_data->touch_stopped = false; + init_waitqueue_head(&bu21013_data->wait); + + /* configure the gpio pins */ + error = gpio_request_one(pdata->cs_pin, GPIOF_OUT_INIT_HIGH, + "touchp_reset"); + if (error < 0) { + dev_err(&client->dev, "Unable to request gpio reset_pin\n"); + goto err_disable_regulator; + } + + /* configure the touch panel controller */ + error = bu21013_init_chip(bu21013_data); + if (error) { + dev_err(&client->dev, "error in bu21013 config\n"); + goto err_cs_disable; + } + + /* register the device to input subsystem */ + in_dev->name = DRIVER_TP; + in_dev->id.bustype = BUS_I2C; + in_dev->dev.parent = &client->dev; + + __set_bit(EV_SYN, in_dev->evbit); + __set_bit(EV_KEY, in_dev->evbit); + __set_bit(EV_ABS, in_dev->evbit); + + input_set_abs_params(in_dev, ABS_MT_POSITION_X, 0, + pdata->touch_x_max, 0, 0); + input_set_abs_params(in_dev, ABS_MT_POSITION_Y, 0, + pdata->touch_y_max, 0, 0); + input_set_drvdata(in_dev, bu21013_data); + + error = request_threaded_irq(bu21013_data->irq, NULL, bu21013_gpio_irq, + IRQF_TRIGGER_FALLING | IRQF_SHARED | + IRQF_ONESHOT, + DRIVER_TP, bu21013_data); + if (error) { + dev_err(&client->dev, "request irq %d failed\n", + bu21013_data->irq); + goto err_cs_disable; + } + + error = input_register_device(in_dev); + if (error) { + dev_err(&client->dev, "failed to register input device\n"); + goto err_free_irq; + } + + device_init_wakeup(&client->dev, pdata->wakeup); + i2c_set_clientdata(client, bu21013_data); + + return 0; + +err_free_irq: + bu21013_free_irq(bu21013_data); +err_cs_disable: + bu21013_cs_disable(bu21013_data); +err_disable_regulator: + regulator_disable(bu21013_data->regulator); +err_put_regulator: + regulator_put(bu21013_data->regulator); +err_free_mem: + input_free_device(in_dev); + kfree(bu21013_data); + + return error; +} +/** + * bu21013_remove() - removes the i2c-client touchscreen driver + * @client: i2c client structure pointer + * + * This function uses to remove the i2c-client + * touchscreen driver and returns integer. + */ +static int bu21013_remove(struct i2c_client *client) +{ + struct bu21013_ts_data *bu21013_data = i2c_get_clientdata(client); + + bu21013_free_irq(bu21013_data); + + bu21013_cs_disable(bu21013_data); + + input_unregister_device(bu21013_data->in_dev); + + regulator_disable(bu21013_data->regulator); + regulator_put(bu21013_data->regulator); + + kfree(bu21013_data); + + device_init_wakeup(&client->dev, false); + + return 0; +} + +#ifdef CONFIG_PM +/** + * bu21013_suspend() - suspend the touch screen controller + * @dev: pointer to device structure + * + * This function is used to suspend the + * touch panel controller and returns integer + */ +static int bu21013_suspend(struct device *dev) +{ + struct bu21013_ts_data *bu21013_data = dev_get_drvdata(dev); + struct i2c_client *client = bu21013_data->client; + + bu21013_data->touch_stopped = true; + if (device_may_wakeup(&client->dev)) + enable_irq_wake(bu21013_data->irq); + else + disable_irq(bu21013_data->irq); + + regulator_disable(bu21013_data->regulator); + + return 0; +} + +/** + * bu21013_resume() - resume the touch screen controller + * @dev: pointer to device structure + * + * This function is used to resume the touch panel + * controller and returns integer. + */ +static int bu21013_resume(struct device *dev) +{ + struct bu21013_ts_data *bu21013_data = dev_get_drvdata(dev); + struct i2c_client *client = bu21013_data->client; + int retval; + + retval = regulator_enable(bu21013_data->regulator); + if (retval < 0) { + dev_err(&client->dev, "bu21013 regulator enable failed\n"); + return retval; + } + + retval = bu21013_init_chip(bu21013_data); + if (retval < 0) { + dev_err(&client->dev, "bu21013 controller config failed\n"); + return retval; + } + + bu21013_data->touch_stopped = false; + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(bu21013_data->irq); + else + enable_irq(bu21013_data->irq); + + return 0; +} + +static const struct dev_pm_ops bu21013_dev_pm_ops = { + .suspend = bu21013_suspend, + .resume = bu21013_resume, +}; +#endif + +static const struct i2c_device_id bu21013_id[] = { + { DRIVER_TP, 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, bu21013_id); + +static struct i2c_driver bu21013_driver = { + .driver = { + .name = DRIVER_TP, + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &bu21013_dev_pm_ops, +#endif + }, + .probe = bu21013_probe, + .remove = bu21013_remove, + .id_table = bu21013_id, +}; + +module_i2c_driver(bu21013_driver); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Naveen Kumar G "); +MODULE_DESCRIPTION("bu21013 touch screen controller driver"); diff --git a/drivers/input/touchscreen/cy8ctmg110_ts.c b/drivers/input/touchscreen/cy8ctmg110_ts.c new file mode 100644 index 00000000..96e0eedc --- /dev/null +++ b/drivers/input/touchscreen/cy8ctmg110_ts.c @@ -0,0 +1,367 @@ +/* + * Driver for cypress touch screen controller + * + * Copyright (c) 2009 Aava Mobile + * + * Some cleanups by Alan Cox + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CY8CTMG110_DRIVER_NAME "cy8ctmg110" + +/* Touch coordinates */ +#define CY8CTMG110_X_MIN 0 +#define CY8CTMG110_Y_MIN 0 +#define CY8CTMG110_X_MAX 759 +#define CY8CTMG110_Y_MAX 465 + + +/* cy8ctmg110 register definitions */ +#define CY8CTMG110_TOUCH_WAKEUP_TIME 0 +#define CY8CTMG110_TOUCH_SLEEP_TIME 2 +#define CY8CTMG110_TOUCH_X1 3 +#define CY8CTMG110_TOUCH_Y1 5 +#define CY8CTMG110_TOUCH_X2 7 +#define CY8CTMG110_TOUCH_Y2 9 +#define CY8CTMG110_FINGERS 11 +#define CY8CTMG110_GESTURE 12 +#define CY8CTMG110_REG_MAX 13 + + +/* + * The touch driver structure. + */ +struct cy8ctmg110 { + struct input_dev *input; + char phys[32]; + struct i2c_client *client; + int reset_pin; + int irq_pin; +}; + +/* + * cy8ctmg110_power is the routine that is called when touch hardware + * will powered off or on. + */ +static void cy8ctmg110_power(struct cy8ctmg110 *ts, bool poweron) +{ + if (ts->reset_pin) + gpio_direction_output(ts->reset_pin, 1 - poweron); +} + +static int cy8ctmg110_write_regs(struct cy8ctmg110 *tsc, unsigned char reg, + unsigned char len, unsigned char *value) +{ + struct i2c_client *client = tsc->client; + int ret; + unsigned char i2c_data[6]; + + BUG_ON(len > 5); + + i2c_data[0] = reg; + memcpy(i2c_data + 1, value, len); + + ret = i2c_master_send(client, i2c_data, len + 1); + if (ret != len + 1) { + dev_err(&client->dev, "i2c write data cmd failed\n"); + return ret < 0 ? ret : -EIO; + } + + return 0; +} + +static int cy8ctmg110_read_regs(struct cy8ctmg110 *tsc, + unsigned char *data, unsigned char len, unsigned char cmd) +{ + struct i2c_client *client = tsc->client; + int ret; + struct i2c_msg msg[2] = { + /* first write slave position to i2c devices */ + { + .addr = client->addr, + .len = 1, + .buf = &cmd + }, + /* Second read data from position */ + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len, + .buf = data + } + }; + + ret = i2c_transfer(client->adapter, msg, 2); + if (ret < 0) + return ret; + + return 0; +} + +static int cy8ctmg110_touch_pos(struct cy8ctmg110 *tsc) +{ + struct input_dev *input = tsc->input; + unsigned char reg_p[CY8CTMG110_REG_MAX]; + int x, y; + + memset(reg_p, 0, CY8CTMG110_REG_MAX); + + /* Reading coordinates */ + if (cy8ctmg110_read_regs(tsc, reg_p, 9, CY8CTMG110_TOUCH_X1) != 0) + return -EIO; + + y = reg_p[2] << 8 | reg_p[3]; + x = reg_p[0] << 8 | reg_p[1]; + + /* Number of touch */ + if (reg_p[8] == 0) { + input_report_key(input, BTN_TOUCH, 0); + } else { + input_report_key(input, BTN_TOUCH, 1); + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + } + + input_sync(input); + + return 0; +} + +static int cy8ctmg110_set_sleepmode(struct cy8ctmg110 *ts, bool sleep) +{ + unsigned char reg_p[3]; + + if (sleep) { + reg_p[0] = 0x00; + reg_p[1] = 0xff; + reg_p[2] = 5; + } else { + reg_p[0] = 0x10; + reg_p[1] = 0xff; + reg_p[2] = 0; + } + + return cy8ctmg110_write_regs(ts, CY8CTMG110_TOUCH_WAKEUP_TIME, 3, reg_p); +} + +static irqreturn_t cy8ctmg110_irq_thread(int irq, void *dev_id) +{ + struct cy8ctmg110 *tsc = dev_id; + + cy8ctmg110_touch_pos(tsc); + + return IRQ_HANDLED; +} + +static int cy8ctmg110_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct cy8ctmg110_pdata *pdata = client->dev.platform_data; + struct cy8ctmg110 *ts; + struct input_dev *input_dev; + int err; + + /* No pdata no way forward */ + if (pdata == NULL) { + dev_err(&client->dev, "no pdata\n"); + return -ENODEV; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_WORD_DATA)) + return -EIO; + + ts = kzalloc(sizeof(struct cy8ctmg110), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + ts->client = client; + ts->input = input_dev; + ts->reset_pin = pdata->reset_pin; + ts->irq_pin = pdata->irq_pin; + + snprintf(ts->phys, sizeof(ts->phys), + "%s/input0", dev_name(&client->dev)); + + input_dev->name = CY8CTMG110_DRIVER_NAME " Touchscreen"; + input_dev->phys = ts->phys; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, + CY8CTMG110_X_MIN, CY8CTMG110_X_MAX, 4, 0); + input_set_abs_params(input_dev, ABS_Y, + CY8CTMG110_Y_MIN, CY8CTMG110_Y_MAX, 4, 0); + + if (ts->reset_pin) { + err = gpio_request(ts->reset_pin, NULL); + if (err) { + dev_err(&client->dev, + "Unable to request GPIO pin %d.\n", + ts->reset_pin); + goto err_free_mem; + } + } + + cy8ctmg110_power(ts, true); + cy8ctmg110_set_sleepmode(ts, false); + + err = gpio_request(ts->irq_pin, "touch_irq_key"); + if (err < 0) { + dev_err(&client->dev, + "Failed to request GPIO %d, error %d\n", + ts->irq_pin, err); + goto err_shutoff_device; + } + + err = gpio_direction_input(ts->irq_pin); + if (err < 0) { + dev_err(&client->dev, + "Failed to configure input direction for GPIO %d, error %d\n", + ts->irq_pin, err); + goto err_free_irq_gpio; + } + + client->irq = gpio_to_irq(ts->irq_pin); + if (client->irq < 0) { + err = client->irq; + dev_err(&client->dev, + "Unable to get irq number for GPIO %d, error %d\n", + ts->irq_pin, err); + goto err_free_irq_gpio; + } + + err = request_threaded_irq(client->irq, NULL, cy8ctmg110_irq_thread, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "touch_reset_key", ts); + if (err < 0) { + dev_err(&client->dev, + "irq %d busy? error %d\n", client->irq, err); + goto err_free_irq_gpio; + } + + err = input_register_device(input_dev); + if (err) + goto err_free_irq; + + i2c_set_clientdata(client, ts); + device_init_wakeup(&client->dev, 1); + return 0; + +err_free_irq: + free_irq(client->irq, ts); +err_free_irq_gpio: + gpio_free(ts->irq_pin); +err_shutoff_device: + cy8ctmg110_set_sleepmode(ts, true); + cy8ctmg110_power(ts, false); + if (ts->reset_pin) + gpio_free(ts->reset_pin); +err_free_mem: + input_free_device(input_dev); + kfree(ts); + return err; +} + +#ifdef CONFIG_PM +static int cy8ctmg110_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cy8ctmg110 *ts = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + else { + cy8ctmg110_set_sleepmode(ts, true); + cy8ctmg110_power(ts, false); + } + return 0; +} + +static int cy8ctmg110_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cy8ctmg110 *ts = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + else { + cy8ctmg110_power(ts, true); + cy8ctmg110_set_sleepmode(ts, false); + } + return 0; +} + +static SIMPLE_DEV_PM_OPS(cy8ctmg110_pm, cy8ctmg110_suspend, cy8ctmg110_resume); +#endif + +static int cy8ctmg110_remove(struct i2c_client *client) +{ + struct cy8ctmg110 *ts = i2c_get_clientdata(client); + + cy8ctmg110_set_sleepmode(ts, true); + cy8ctmg110_power(ts, false); + + free_irq(client->irq, ts); + input_unregister_device(ts->input); + gpio_free(ts->irq_pin); + if (ts->reset_pin) + gpio_free(ts->reset_pin); + kfree(ts); + + return 0; +} + +static const struct i2c_device_id cy8ctmg110_idtable[] = { + { CY8CTMG110_DRIVER_NAME, 1 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, cy8ctmg110_idtable); + +static struct i2c_driver cy8ctmg110_driver = { + .driver = { + .owner = THIS_MODULE, + .name = CY8CTMG110_DRIVER_NAME, +#ifdef CONFIG_PM + .pm = &cy8ctmg110_pm, +#endif + }, + .id_table = cy8ctmg110_idtable, + .probe = cy8ctmg110_probe, + .remove = cy8ctmg110_remove, +}; + +module_i2c_driver(cy8ctmg110_driver); + +MODULE_AUTHOR("Samuli Konttila "); +MODULE_DESCRIPTION("cy8ctmg110 TouchScreen Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/cyttsp_core.c b/drivers/input/touchscreen/cyttsp_core.c new file mode 100644 index 00000000..ae89d260 --- /dev/null +++ b/drivers/input/touchscreen/cyttsp_core.c @@ -0,0 +1,639 @@ +/* + * Core Source for: + * Cypress TrueTouch(TM) Standard Product (TTSP) touchscreen drivers. + * For use with Cypress Txx3xx parts. + * Supported parts include: + * CY8CTST341 + * CY8CTMA340 + * + * Copyright (C) 2009, 2010, 2011 Cypress Semiconductor, Inc. + * Copyright (C) 2012 Javier Martinez Canillas + * + * 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 only version 2, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contact Cypress Semiconductor at www.cypress.com + * + */ + +#include +#include +#include +#include +#include +#include + +#include "cyttsp_core.h" + +/* Bootloader number of command keys */ +#define CY_NUM_BL_KEYS 8 + +/* helpers */ +#define GET_NUM_TOUCHES(x) ((x) & 0x0F) +#define IS_LARGE_AREA(x) (((x) & 0x10) >> 4) +#define IS_BAD_PKT(x) ((x) & 0x20) +#define IS_VALID_APP(x) ((x) & 0x01) +#define IS_OPERATIONAL_ERR(x) ((x) & 0x3F) +#define GET_HSTMODE(reg) (((reg) & 0x70) >> 4) +#define GET_BOOTLOADERMODE(reg) (((reg) & 0x10) >> 4) + +#define CY_REG_BASE 0x00 +#define CY_REG_ACT_DIST 0x1E +#define CY_REG_ACT_INTRVL 0x1D +#define CY_REG_TCH_TMOUT (CY_REG_ACT_INTRVL + 1) +#define CY_REG_LP_INTRVL (CY_REG_TCH_TMOUT + 1) +#define CY_MAXZ 255 +#define CY_DELAY_DFLT 20 /* ms */ +#define CY_DELAY_MAX 500 +#define CY_ACT_DIST_DFLT 0xF8 +#define CY_HNDSHK_BIT 0x80 +/* device mode bits */ +#define CY_OPERATE_MODE 0x00 +#define CY_SYSINFO_MODE 0x10 +/* power mode select bits */ +#define CY_SOFT_RESET_MODE 0x01 /* return to Bootloader mode */ +#define CY_DEEP_SLEEP_MODE 0x02 +#define CY_LOW_POWER_MODE 0x04 + +/* Slots management */ +#define CY_MAX_FINGER 4 +#define CY_MAX_ID 16 + +static const u8 bl_command[] = { + 0x00, /* file offset */ + 0xFF, /* command */ + 0xA5, /* exit bootloader command */ + 0, 1, 2, 3, 4, 5, 6, 7 /* default keys */ +}; + +static int ttsp_read_block_data(struct cyttsp *ts, u8 command, + u8 length, void *buf) +{ + int error; + int tries; + + for (tries = 0; tries < CY_NUM_RETRY; tries++) { + error = ts->bus_ops->read(ts, command, length, buf); + if (!error) + return 0; + + msleep(CY_DELAY_DFLT); + } + + return -EIO; +} + +static int ttsp_write_block_data(struct cyttsp *ts, u8 command, + u8 length, void *buf) +{ + int error; + int tries; + + for (tries = 0; tries < CY_NUM_RETRY; tries++) { + error = ts->bus_ops->write(ts, command, length, buf); + if (!error) + return 0; + + msleep(CY_DELAY_DFLT); + } + + return -EIO; +} + +static int ttsp_send_command(struct cyttsp *ts, u8 cmd) +{ + return ttsp_write_block_data(ts, CY_REG_BASE, sizeof(cmd), &cmd); +} + +static int cyttsp_handshake(struct cyttsp *ts) +{ + if (ts->pdata->use_hndshk) + return ttsp_send_command(ts, + ts->xy_data.hst_mode ^ CY_HNDSHK_BIT); + + return 0; +} + +static int cyttsp_load_bl_regs(struct cyttsp *ts) +{ + memset(&ts->bl_data, 0, sizeof(ts->bl_data)); + ts->bl_data.bl_status = 0x10; + + return ttsp_read_block_data(ts, CY_REG_BASE, + sizeof(ts->bl_data), &ts->bl_data); +} + +static int cyttsp_exit_bl_mode(struct cyttsp *ts) +{ + int error; + u8 bl_cmd[sizeof(bl_command)]; + + memcpy(bl_cmd, bl_command, sizeof(bl_command)); + if (ts->pdata->bl_keys) + memcpy(&bl_cmd[sizeof(bl_command) - CY_NUM_BL_KEYS], + ts->pdata->bl_keys, CY_NUM_BL_KEYS); + + error = ttsp_write_block_data(ts, CY_REG_BASE, + sizeof(bl_cmd), bl_cmd); + if (error) + return error; + + /* wait for TTSP Device to complete the operation */ + msleep(CY_DELAY_DFLT); + + error = cyttsp_load_bl_regs(ts); + if (error) + return error; + + if (GET_BOOTLOADERMODE(ts->bl_data.bl_status)) + return -EIO; + + return 0; +} + +static int cyttsp_set_operational_mode(struct cyttsp *ts) +{ + int error; + + error = ttsp_send_command(ts, CY_OPERATE_MODE); + if (error) + return error; + + /* wait for TTSP Device to complete switch to Operational mode */ + error = ttsp_read_block_data(ts, CY_REG_BASE, + sizeof(ts->xy_data), &ts->xy_data); + if (error) + return error; + + error = cyttsp_handshake(ts); + if (error) + return error; + + return ts->xy_data.act_dist == CY_ACT_DIST_DFLT ? -EIO : 0; +} + +static int cyttsp_set_sysinfo_mode(struct cyttsp *ts) +{ + int error; + + memset(&ts->sysinfo_data, 0, sizeof(ts->sysinfo_data)); + + /* switch to sysinfo mode */ + error = ttsp_send_command(ts, CY_SYSINFO_MODE); + if (error) + return error; + + /* read sysinfo registers */ + msleep(CY_DELAY_DFLT); + error = ttsp_read_block_data(ts, CY_REG_BASE, sizeof(ts->sysinfo_data), + &ts->sysinfo_data); + if (error) + return error; + + error = cyttsp_handshake(ts); + if (error) + return error; + + if (!ts->sysinfo_data.tts_verh && !ts->sysinfo_data.tts_verl) + return -EIO; + + return 0; +} + +static int cyttsp_set_sysinfo_regs(struct cyttsp *ts) +{ + int retval = 0; + + if (ts->pdata->act_intrvl != CY_ACT_INTRVL_DFLT || + ts->pdata->tch_tmout != CY_TCH_TMOUT_DFLT || + ts->pdata->lp_intrvl != CY_LP_INTRVL_DFLT) { + + u8 intrvl_ray[] = { + ts->pdata->act_intrvl, + ts->pdata->tch_tmout, + ts->pdata->lp_intrvl + }; + + /* set intrvl registers */ + retval = ttsp_write_block_data(ts, CY_REG_ACT_INTRVL, + sizeof(intrvl_ray), intrvl_ray); + msleep(CY_DELAY_DFLT); + } + + return retval; +} + +static int cyttsp_soft_reset(struct cyttsp *ts) +{ + unsigned long timeout; + int retval; + + /* wait for interrupt to set ready completion */ + INIT_COMPLETION(ts->bl_ready); + ts->state = CY_BL_STATE; + + enable_irq(ts->irq); + + retval = ttsp_send_command(ts, CY_SOFT_RESET_MODE); + if (retval) + goto out; + + timeout = wait_for_completion_timeout(&ts->bl_ready, + msecs_to_jiffies(CY_DELAY_DFLT * CY_DELAY_MAX)); + retval = timeout ? 0 : -EIO; + +out: + ts->state = CY_IDLE_STATE; + disable_irq(ts->irq); + return retval; +} + +static int cyttsp_act_dist_setup(struct cyttsp *ts) +{ + u8 act_dist_setup = ts->pdata->act_dist; + + /* Init gesture; active distance setup */ + return ttsp_write_block_data(ts, CY_REG_ACT_DIST, + sizeof(act_dist_setup), &act_dist_setup); +} + +static void cyttsp_extract_track_ids(struct cyttsp_xydata *xy_data, int *ids) +{ + ids[0] = xy_data->touch12_id >> 4; + ids[1] = xy_data->touch12_id & 0xF; + ids[2] = xy_data->touch34_id >> 4; + ids[3] = xy_data->touch34_id & 0xF; +} + +static const struct cyttsp_tch *cyttsp_get_tch(struct cyttsp_xydata *xy_data, + int idx) +{ + switch (idx) { + case 0: + return &xy_data->tch1; + case 1: + return &xy_data->tch2; + case 2: + return &xy_data->tch3; + case 3: + return &xy_data->tch4; + default: + return NULL; + } +} + +static void cyttsp_report_tchdata(struct cyttsp *ts) +{ + struct cyttsp_xydata *xy_data = &ts->xy_data; + struct input_dev *input = ts->input; + int num_tch = GET_NUM_TOUCHES(xy_data->tt_stat); + const struct cyttsp_tch *tch; + int ids[CY_MAX_ID]; + int i; + DECLARE_BITMAP(used, CY_MAX_ID); + + if (IS_LARGE_AREA(xy_data->tt_stat) == 1) { + /* terminate all active tracks */ + num_tch = 0; + dev_dbg(ts->dev, "%s: Large area detected\n", __func__); + } else if (num_tch > CY_MAX_FINGER) { + /* terminate all active tracks */ + num_tch = 0; + dev_dbg(ts->dev, "%s: Num touch error detected\n", __func__); + } else if (IS_BAD_PKT(xy_data->tt_mode)) { + /* terminate all active tracks */ + num_tch = 0; + dev_dbg(ts->dev, "%s: Invalid buffer detected\n", __func__); + } + + cyttsp_extract_track_ids(xy_data, ids); + + bitmap_zero(used, CY_MAX_ID); + + for (i = 0; i < num_tch; i++) { + tch = cyttsp_get_tch(xy_data, i); + + input_mt_slot(input, ids[i]); + input_mt_report_slot_state(input, MT_TOOL_FINGER, true); + input_report_abs(input, ABS_MT_POSITION_X, be16_to_cpu(tch->x)); + input_report_abs(input, ABS_MT_POSITION_Y, be16_to_cpu(tch->y)); + input_report_abs(input, ABS_MT_TOUCH_MAJOR, tch->z); + + __set_bit(ids[i], used); + } + + for (i = 0; i < CY_MAX_ID; i++) { + if (test_bit(i, used)) + continue; + + input_mt_slot(input, i); + input_mt_report_slot_state(input, MT_TOOL_FINGER, false); + } + + input_sync(input); +} + +static irqreturn_t cyttsp_irq(int irq, void *handle) +{ + struct cyttsp *ts = handle; + int error; + + if (unlikely(ts->state == CY_BL_STATE)) { + complete(&ts->bl_ready); + goto out; + } + + /* Get touch data from CYTTSP device */ + error = ttsp_read_block_data(ts, CY_REG_BASE, + sizeof(struct cyttsp_xydata), &ts->xy_data); + if (error) + goto out; + + /* provide flow control handshake */ + error = cyttsp_handshake(ts); + if (error) + goto out; + + if (unlikely(ts->state == CY_IDLE_STATE)) + goto out; + + if (GET_BOOTLOADERMODE(ts->xy_data.tt_mode)) { + /* + * TTSP device has reset back to bootloader mode. + * Restore to operational mode. + */ + error = cyttsp_exit_bl_mode(ts); + if (error) { + dev_err(ts->dev, + "Could not return to operational mode, err: %d\n", + error); + ts->state = CY_IDLE_STATE; + } + } else { + cyttsp_report_tchdata(ts); + } + +out: + return IRQ_HANDLED; +} + +static int cyttsp_power_on(struct cyttsp *ts) +{ + int error; + + error = cyttsp_soft_reset(ts); + if (error) + return error; + + error = cyttsp_load_bl_regs(ts); + if (error) + return error; + + if (GET_BOOTLOADERMODE(ts->bl_data.bl_status) && + IS_VALID_APP(ts->bl_data.bl_status)) { + error = cyttsp_exit_bl_mode(ts); + if (error) + return error; + } + + if (GET_HSTMODE(ts->bl_data.bl_file) != CY_OPERATE_MODE || + IS_OPERATIONAL_ERR(ts->bl_data.bl_status)) { + return -ENODEV; + } + + error = cyttsp_set_sysinfo_mode(ts); + if (error) + return error; + + error = cyttsp_set_sysinfo_regs(ts); + if (error) + return error; + + error = cyttsp_set_operational_mode(ts); + if (error) + return error; + + /* init active distance */ + error = cyttsp_act_dist_setup(ts); + if (error) + return error; + + ts->state = CY_ACTIVE_STATE; + + return 0; +} + +static int cyttsp_enable(struct cyttsp *ts) +{ + int error; + + /* + * The device firmware can wake on an I2C or SPI memory slave + * address match. So just reading a register is sufficient to + * wake up the device. The first read attempt will fail but it + * will wake it up making the second read attempt successful. + */ + error = ttsp_read_block_data(ts, CY_REG_BASE, + sizeof(ts->xy_data), &ts->xy_data); + if (error) + return error; + + if (GET_HSTMODE(ts->xy_data.hst_mode)) + return -EIO; + + enable_irq(ts->irq); + + return 0; +} + +static int cyttsp_disable(struct cyttsp *ts) +{ + int error; + + error = ttsp_send_command(ts, CY_LOW_POWER_MODE); + if (error) + return error; + + disable_irq(ts->irq); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int cyttsp_suspend(struct device *dev) +{ + struct cyttsp *ts = dev_get_drvdata(dev); + int retval = 0; + + mutex_lock(&ts->input->mutex); + + if (ts->input->users) { + retval = cyttsp_disable(ts); + if (retval == 0) + ts->suspended = true; + } + + mutex_unlock(&ts->input->mutex); + + return retval; +} + +static int cyttsp_resume(struct device *dev) +{ + struct cyttsp *ts = dev_get_drvdata(dev); + + mutex_lock(&ts->input->mutex); + + if (ts->input->users) + cyttsp_enable(ts); + + ts->suspended = false; + + mutex_unlock(&ts->input->mutex); + + return 0; +} + +#endif + +SIMPLE_DEV_PM_OPS(cyttsp_pm_ops, cyttsp_suspend, cyttsp_resume); +EXPORT_SYMBOL_GPL(cyttsp_pm_ops); + +static int cyttsp_open(struct input_dev *dev) +{ + struct cyttsp *ts = input_get_drvdata(dev); + int retval = 0; + + if (!ts->suspended) + retval = cyttsp_enable(ts); + + return retval; +} + +static void cyttsp_close(struct input_dev *dev) +{ + struct cyttsp *ts = input_get_drvdata(dev); + + if (!ts->suspended) + cyttsp_disable(ts); +} + +struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, + struct device *dev, int irq, size_t xfer_buf_size) +{ + const struct cyttsp_platform_data *pdata = dev->platform_data; + struct cyttsp *ts; + struct input_dev *input_dev; + int error; + + if (!pdata || !pdata->name || irq <= 0) { + error = -EINVAL; + goto err_out; + } + + ts = kzalloc(sizeof(*ts) + xfer_buf_size, GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + ts->dev = dev; + ts->input = input_dev; + ts->pdata = dev->platform_data; + ts->bus_ops = bus_ops; + ts->irq = irq; + + init_completion(&ts->bl_ready); + snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(dev)); + + if (pdata->init) { + error = pdata->init(); + if (error) { + dev_err(ts->dev, "platform init failed, err: %d\n", + error); + goto err_free_mem; + } + } + + input_dev->name = pdata->name; + input_dev->phys = ts->phys; + input_dev->id.bustype = bus_ops->bustype; + input_dev->dev.parent = ts->dev; + + input_dev->open = cyttsp_open; + input_dev->close = cyttsp_close; + + input_set_drvdata(input_dev, ts); + + __set_bit(EV_ABS, input_dev->evbit); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, + 0, pdata->maxx, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, + 0, pdata->maxy, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, + 0, CY_MAXZ, 0, 0); + + input_mt_init_slots(input_dev, CY_MAX_ID, 0); + + error = request_threaded_irq(ts->irq, NULL, cyttsp_irq, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + pdata->name, ts); + if (error) { + dev_err(ts->dev, "failed to request IRQ %d, err: %d\n", + ts->irq, error); + goto err_platform_exit; + } + + disable_irq(ts->irq); + + error = cyttsp_power_on(ts); + if (error) + goto err_free_irq; + + error = input_register_device(input_dev); + if (error) { + dev_err(ts->dev, "failed to register input device: %d\n", + error); + goto err_free_irq; + } + + return ts; + +err_free_irq: + free_irq(ts->irq, ts); +err_platform_exit: + if (pdata->exit) + pdata->exit(); +err_free_mem: + input_free_device(input_dev); + kfree(ts); +err_out: + return ERR_PTR(error); +} +EXPORT_SYMBOL_GPL(cyttsp_probe); + +void cyttsp_remove(struct cyttsp *ts) +{ + free_irq(ts->irq, ts); + input_unregister_device(ts->input); + if (ts->pdata->exit) + ts->pdata->exit(); + kfree(ts); +} +EXPORT_SYMBOL_GPL(cyttsp_remove); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard touchscreen driver core"); +MODULE_AUTHOR("Cypress"); diff --git a/drivers/input/touchscreen/cyttsp_core.h b/drivers/input/touchscreen/cyttsp_core.h new file mode 100644 index 00000000..f1ebde36 --- /dev/null +++ b/drivers/input/touchscreen/cyttsp_core.h @@ -0,0 +1,149 @@ +/* + * Header file for: + * Cypress TrueTouch(TM) Standard Product (TTSP) touchscreen drivers. + * For use with Cypress Txx3xx parts. + * Supported parts include: + * CY8CTST341 + * CY8CTMA340 + * + * Copyright (C) 2009, 2010, 2011 Cypress Semiconductor, Inc. + * Copyright (C) 2012 Javier Martinez Canillas + * + * 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 only version 2, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contact Cypress Semiconductor at www.cypress.com + * + */ + + +#ifndef __CYTTSP_CORE_H__ +#define __CYTTSP_CORE_H__ + +#include +#include +#include +#include +#include +#include + +#define CY_NUM_RETRY 16 /* max number of retries for read ops */ + +struct cyttsp_tch { + __be16 x, y; + u8 z; +} __packed; + +/* TrueTouch Standard Product Gen3 interface definition */ +struct cyttsp_xydata { + u8 hst_mode; + u8 tt_mode; + u8 tt_stat; + struct cyttsp_tch tch1; + u8 touch12_id; + struct cyttsp_tch tch2; + u8 gest_cnt; + u8 gest_id; + struct cyttsp_tch tch3; + u8 touch34_id; + struct cyttsp_tch tch4; + u8 tt_undef[3]; + u8 act_dist; + u8 tt_reserved; +} __packed; + + +/* TTSP System Information interface definition */ +struct cyttsp_sysinfo_data { + u8 hst_mode; + u8 mfg_stat; + u8 mfg_cmd; + u8 cid[3]; + u8 tt_undef1; + u8 uid[8]; + u8 bl_verh; + u8 bl_verl; + u8 tts_verh; + u8 tts_verl; + u8 app_idh; + u8 app_idl; + u8 app_verh; + u8 app_verl; + u8 tt_undef[5]; + u8 scn_typ; + u8 act_intrvl; + u8 tch_tmout; + u8 lp_intrvl; +}; + +/* TTSP Bootloader Register Map interface definition */ +#define CY_BL_CHKSUM_OK 0x01 +struct cyttsp_bootloader_data { + u8 bl_file; + u8 bl_status; + u8 bl_error; + u8 blver_hi; + u8 blver_lo; + u8 bld_blver_hi; + u8 bld_blver_lo; + u8 ttspver_hi; + u8 ttspver_lo; + u8 appid_hi; + u8 appid_lo; + u8 appver_hi; + u8 appver_lo; + u8 cid_0; + u8 cid_1; + u8 cid_2; +}; + +struct cyttsp; + +struct cyttsp_bus_ops { + u16 bustype; + int (*write)(struct cyttsp *ts, + u8 addr, u8 length, const void *values); + int (*read)(struct cyttsp *ts, u8 addr, u8 length, void *values); +}; + +enum cyttsp_state { + CY_IDLE_STATE, + CY_ACTIVE_STATE, + CY_BL_STATE, +}; + +struct cyttsp { + struct device *dev; + int irq; + struct input_dev *input; + char phys[32]; + const struct cyttsp_platform_data *pdata; + const struct cyttsp_bus_ops *bus_ops; + struct cyttsp_bootloader_data bl_data; + struct cyttsp_sysinfo_data sysinfo_data; + struct cyttsp_xydata xy_data; + struct completion bl_ready; + enum cyttsp_state state; + bool suspended; + + u8 xfer_buf[] ____cacheline_aligned; +}; + +struct cyttsp *cyttsp_probe(const struct cyttsp_bus_ops *bus_ops, + struct device *dev, int irq, size_t xfer_buf_size); +void cyttsp_remove(struct cyttsp *ts); + +extern const struct dev_pm_ops cyttsp_pm_ops; + +#endif /* __CYTTSP_CORE_H__ */ diff --git a/drivers/input/touchscreen/cyttsp_i2c.c b/drivers/input/touchscreen/cyttsp_i2c.c new file mode 100644 index 00000000..4dbdf44b --- /dev/null +++ b/drivers/input/touchscreen/cyttsp_i2c.c @@ -0,0 +1,136 @@ +/* + * Source for: + * Cypress TrueTouch(TM) Standard Product (TTSP) I2C touchscreen driver. + * For use with Cypress Txx3xx parts. + * Supported parts include: + * CY8CTST341 + * CY8CTMA340 + * + * Copyright (C) 2009, 2010, 2011 Cypress Semiconductor, Inc. + * Copyright (C) 2012 Javier Martinez Canillas + * + * 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 only version 2, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contact Cypress Semiconductor at www.cypress.com + * + */ + +#include "cyttsp_core.h" + +#include +#include + +#define CY_I2C_DATA_SIZE 128 + +static int cyttsp_i2c_read_block_data(struct cyttsp *ts, + u8 addr, u8 length, void *values) +{ + struct i2c_client *client = to_i2c_client(ts->dev); + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = &addr, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = values, + }, + }; + int retval; + + retval = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (retval < 0) + return retval; + + return retval != ARRAY_SIZE(msgs) ? -EIO : 0; +} + +static int cyttsp_i2c_write_block_data(struct cyttsp *ts, + u8 addr, u8 length, const void *values) +{ + struct i2c_client *client = to_i2c_client(ts->dev); + int retval; + + ts->xfer_buf[0] = addr; + memcpy(&ts->xfer_buf[1], values, length); + + retval = i2c_master_send(client, ts->xfer_buf, length + 1); + + return retval < 0 ? retval : 0; +} + +static const struct cyttsp_bus_ops cyttsp_i2c_bus_ops = { + .bustype = BUS_I2C, + .write = cyttsp_i2c_write_block_data, + .read = cyttsp_i2c_read_block_data, +}; + +static int cyttsp_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct cyttsp *ts; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C functionality not Supported\n"); + return -EIO; + } + + ts = cyttsp_probe(&cyttsp_i2c_bus_ops, &client->dev, client->irq, + CY_I2C_DATA_SIZE); + + if (IS_ERR(ts)) + return PTR_ERR(ts); + + i2c_set_clientdata(client, ts); + + return 0; +} + +static int cyttsp_i2c_remove(struct i2c_client *client) +{ + struct cyttsp *ts = i2c_get_clientdata(client); + + cyttsp_remove(ts); + + return 0; +} + +static const struct i2c_device_id cyttsp_i2c_id[] = { + { CY_I2C_NAME, 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, cyttsp_i2c_id); + +static struct i2c_driver cyttsp_i2c_driver = { + .driver = { + .name = CY_I2C_NAME, + .owner = THIS_MODULE, + .pm = &cyttsp_pm_ops, + }, + .probe = cyttsp_i2c_probe, + .remove = cyttsp_i2c_remove, + .id_table = cyttsp_i2c_id, +}; + +module_i2c_driver(cyttsp_i2c_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard Product (TTSP) I2C driver"); +MODULE_AUTHOR("Cypress"); +MODULE_ALIAS("i2c:cyttsp"); diff --git a/drivers/input/touchscreen/cyttsp_spi.c b/drivers/input/touchscreen/cyttsp_spi.c new file mode 100644 index 00000000..861b7f77 --- /dev/null +++ b/drivers/input/touchscreen/cyttsp_spi.c @@ -0,0 +1,199 @@ +/* + * Source for: + * Cypress TrueTouch(TM) Standard Product (TTSP) SPI touchscreen driver. + * For use with Cypress Txx3xx parts. + * Supported parts include: + * CY8CTST341 + * CY8CTMA340 + * + * Copyright (C) 2009, 2010, 2011 Cypress Semiconductor, Inc. + * Copyright (C) 2012 Javier Martinez Canillas + * + * 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 only version 2, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Contact Cypress Semiconductor at www.cypress.com + * + */ + +#include "cyttsp_core.h" + +#include +#include +#include + +#define CY_SPI_WR_OP 0x00 /* r/~w */ +#define CY_SPI_RD_OP 0x01 +#define CY_SPI_CMD_BYTES 4 +#define CY_SPI_SYNC_BYTE 2 +#define CY_SPI_SYNC_ACK1 0x62 /* from protocol v.2 */ +#define CY_SPI_SYNC_ACK2 0x9D /* from protocol v.2 */ +#define CY_SPI_DATA_SIZE 128 +#define CY_SPI_DATA_BUF_SIZE (CY_SPI_CMD_BYTES + CY_SPI_DATA_SIZE) +#define CY_SPI_BITS_PER_WORD 8 + +static int cyttsp_spi_xfer(struct cyttsp *ts, + u8 op, u8 reg, u8 *buf, int length) +{ + struct spi_device *spi = to_spi_device(ts->dev); + struct spi_message msg; + struct spi_transfer xfer[2]; + u8 *wr_buf = &ts->xfer_buf[0]; + u8 *rd_buf = &ts->xfer_buf[CY_SPI_DATA_BUF_SIZE]; + int retval; + int i; + + if (length > CY_SPI_DATA_SIZE) { + dev_err(ts->dev, "%s: length %d is too big.\n", + __func__, length); + return -EINVAL; + } + + memset(wr_buf, 0, CY_SPI_DATA_BUF_SIZE); + memset(rd_buf, 0, CY_SPI_DATA_BUF_SIZE); + + wr_buf[0] = 0x00; /* header byte 0 */ + wr_buf[1] = 0xFF; /* header byte 1 */ + wr_buf[2] = reg; /* reg index */ + wr_buf[3] = op; /* r/~w */ + if (op == CY_SPI_WR_OP) + memcpy(wr_buf + CY_SPI_CMD_BYTES, buf, length); + + memset(xfer, 0, sizeof(xfer)); + spi_message_init(&msg); + + /* + We set both TX and RX buffers because Cypress TTSP + requires full duplex operation. + */ + xfer[0].tx_buf = wr_buf; + xfer[0].rx_buf = rd_buf; + switch (op) { + case CY_SPI_WR_OP: + xfer[0].len = length + CY_SPI_CMD_BYTES; + spi_message_add_tail(&xfer[0], &msg); + break; + + case CY_SPI_RD_OP: + xfer[0].len = CY_SPI_CMD_BYTES; + spi_message_add_tail(&xfer[0], &msg); + + xfer[1].rx_buf = buf; + xfer[1].len = length; + spi_message_add_tail(&xfer[1], &msg); + break; + + default: + dev_err(ts->dev, "%s: bad operation code=%d\n", __func__, op); + return -EINVAL; + } + + retval = spi_sync(spi, &msg); + if (retval < 0) { + dev_dbg(ts->dev, "%s: spi_sync() error %d, len=%d, op=%d\n", + __func__, retval, xfer[1].len, op); + + /* + * do not return here since was a bad ACK sequence + * let the following ACK check handle any errors and + * allow silent retries + */ + } + + if (rd_buf[CY_SPI_SYNC_BYTE] != CY_SPI_SYNC_ACK1 || + rd_buf[CY_SPI_SYNC_BYTE + 1] != CY_SPI_SYNC_ACK2) { + + dev_dbg(ts->dev, "%s: operation %d failed\n", __func__, op); + + for (i = 0; i < CY_SPI_CMD_BYTES; i++) + dev_dbg(ts->dev, "%s: test rd_buf[%d]:0x%02x\n", + __func__, i, rd_buf[i]); + for (i = 0; i < length; i++) + dev_dbg(ts->dev, "%s: test buf[%d]:0x%02x\n", + __func__, i, buf[i]); + + return -EIO; + } + + return 0; +} + +static int cyttsp_spi_read_block_data(struct cyttsp *ts, + u8 addr, u8 length, void *data) +{ + return cyttsp_spi_xfer(ts, CY_SPI_RD_OP, addr, data, length); +} + +static int cyttsp_spi_write_block_data(struct cyttsp *ts, + u8 addr, u8 length, const void *data) +{ + return cyttsp_spi_xfer(ts, CY_SPI_WR_OP, addr, (void *)data, length); +} + +static const struct cyttsp_bus_ops cyttsp_spi_bus_ops = { + .bustype = BUS_SPI, + .write = cyttsp_spi_write_block_data, + .read = cyttsp_spi_read_block_data, +}; + +static int cyttsp_spi_probe(struct spi_device *spi) +{ + struct cyttsp *ts; + int error; + + /* Set up SPI*/ + spi->bits_per_word = CY_SPI_BITS_PER_WORD; + spi->mode = SPI_MODE_0; + error = spi_setup(spi); + if (error < 0) { + dev_err(&spi->dev, "%s: SPI setup error %d\n", + __func__, error); + return error; + } + + ts = cyttsp_probe(&cyttsp_spi_bus_ops, &spi->dev, spi->irq, + CY_SPI_DATA_BUF_SIZE * 2); + if (IS_ERR(ts)) + return PTR_ERR(ts); + + spi_set_drvdata(spi, ts); + + return 0; +} + +static int cyttsp_spi_remove(struct spi_device *spi) +{ + struct cyttsp *ts = spi_get_drvdata(spi); + + cyttsp_remove(ts); + + return 0; +} + +static struct spi_driver cyttsp_spi_driver = { + .driver = { + .name = CY_SPI_NAME, + .owner = THIS_MODULE, + .pm = &cyttsp_pm_ops, + }, + .probe = cyttsp_spi_probe, + .remove = cyttsp_spi_remove, +}; + +module_spi_driver(cyttsp_spi_driver); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("Cypress TrueTouch(R) Standard Product (TTSP) SPI driver"); +MODULE_AUTHOR("Cypress"); +MODULE_ALIAS("spi:cyttsp"); diff --git a/drivers/input/touchscreen/da9034-ts.c b/drivers/input/touchscreen/da9034-ts.c new file mode 100644 index 00000000..34ad8410 --- /dev/null +++ b/drivers/input/touchscreen/da9034-ts.c @@ -0,0 +1,387 @@ +/* + * Touchscreen driver for Dialog Semiconductor DA9034 + * + * Copyright (C) 2006-2008 Marvell International Ltd. + * Fengwei Yin + * Bin Yang + * Eric Miao + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DA9034_MANUAL_CTRL 0x50 +#define DA9034_LDO_ADC_EN (1 << 4) + +#define DA9034_AUTO_CTRL1 0x51 + +#define DA9034_AUTO_CTRL2 0x52 +#define DA9034_AUTO_TSI_EN (1 << 3) +#define DA9034_PEN_DETECT (1 << 4) + +#define DA9034_TSI_CTRL1 0x53 +#define DA9034_TSI_CTRL2 0x54 +#define DA9034_TSI_X_MSB 0x6c +#define DA9034_TSI_Y_MSB 0x6d +#define DA9034_TSI_XY_LSB 0x6e + +enum { + STATE_IDLE, /* wait for pendown */ + STATE_BUSY, /* TSI busy sampling */ + STATE_STOP, /* sample available */ + STATE_WAIT, /* Wait to start next sample */ +}; + +enum { + EVENT_PEN_DOWN, + EVENT_PEN_UP, + EVENT_TSI_READY, + EVENT_TIMEDOUT, +}; + +struct da9034_touch { + struct device *da9034_dev; + struct input_dev *input_dev; + + struct delayed_work tsi_work; + struct notifier_block notifier; + + int state; + + int interval_ms; + int x_inverted; + int y_inverted; + + int last_x; + int last_y; +}; + +static inline int is_pen_down(struct da9034_touch *touch) +{ + return da903x_query_status(touch->da9034_dev, DA9034_STATUS_PEN_DOWN); +} + +static inline int detect_pen_down(struct da9034_touch *touch, int on) +{ + if (on) + return da903x_set_bits(touch->da9034_dev, + DA9034_AUTO_CTRL2, DA9034_PEN_DETECT); + else + return da903x_clr_bits(touch->da9034_dev, + DA9034_AUTO_CTRL2, DA9034_PEN_DETECT); +} + +static int read_tsi(struct da9034_touch *touch) +{ + uint8_t _x, _y, _v; + int ret; + + ret = da903x_read(touch->da9034_dev, DA9034_TSI_X_MSB, &_x); + if (ret) + return ret; + + ret = da903x_read(touch->da9034_dev, DA9034_TSI_Y_MSB, &_y); + if (ret) + return ret; + + ret = da903x_read(touch->da9034_dev, DA9034_TSI_XY_LSB, &_v); + if (ret) + return ret; + + touch->last_x = ((_x << 2) & 0x3fc) | (_v & 0x3); + touch->last_y = ((_y << 2) & 0x3fc) | ((_v & 0xc) >> 2); + + return 0; +} + +static inline int start_tsi(struct da9034_touch *touch) +{ + return da903x_set_bits(touch->da9034_dev, + DA9034_AUTO_CTRL2, DA9034_AUTO_TSI_EN); +} + +static inline int stop_tsi(struct da9034_touch *touch) +{ + return da903x_clr_bits(touch->da9034_dev, + DA9034_AUTO_CTRL2, DA9034_AUTO_TSI_EN); +} + +static inline void report_pen_down(struct da9034_touch *touch) +{ + int x = touch->last_x; + int y = touch->last_y; + + x &= 0xfff; + if (touch->x_inverted) + x = 1024 - x; + y &= 0xfff; + if (touch->y_inverted) + y = 1024 - y; + + input_report_abs(touch->input_dev, ABS_X, x); + input_report_abs(touch->input_dev, ABS_Y, y); + input_report_key(touch->input_dev, BTN_TOUCH, 1); + + input_sync(touch->input_dev); +} + +static inline void report_pen_up(struct da9034_touch *touch) +{ + input_report_key(touch->input_dev, BTN_TOUCH, 0); + input_sync(touch->input_dev); +} + +static void da9034_event_handler(struct da9034_touch *touch, int event) +{ + int err; + + switch (touch->state) { + case STATE_IDLE: + if (event != EVENT_PEN_DOWN) + break; + + /* Enable auto measurement of the TSI, this will + * automatically disable pen down detection + */ + err = start_tsi(touch); + if (err) + goto err_reset; + + touch->state = STATE_BUSY; + break; + + case STATE_BUSY: + if (event != EVENT_TSI_READY) + break; + + err = read_tsi(touch); + if (err) + goto err_reset; + + /* Disable auto measurement of the TSI, so that + * pen down status will be available + */ + err = stop_tsi(touch); + if (err) + goto err_reset; + + touch->state = STATE_STOP; + + /* FIXME: PEN_{UP/DOWN} events are expected to be + * available by stopping TSI, but this is found not + * always true, delay and simulate such an event + * here is more reliable + */ + mdelay(1); + da9034_event_handler(touch, + is_pen_down(touch) ? EVENT_PEN_DOWN : + EVENT_PEN_UP); + break; + + case STATE_STOP: + if (event == EVENT_PEN_DOWN) { + report_pen_down(touch); + schedule_delayed_work(&touch->tsi_work, + msecs_to_jiffies(touch->interval_ms)); + touch->state = STATE_WAIT; + } + + if (event == EVENT_PEN_UP) { + report_pen_up(touch); + touch->state = STATE_IDLE; + } + break; + + case STATE_WAIT: + if (event != EVENT_TIMEDOUT) + break; + + if (is_pen_down(touch)) { + start_tsi(touch); + touch->state = STATE_BUSY; + } else { + report_pen_up(touch); + touch->state = STATE_IDLE; + } + break; + } + return; + +err_reset: + touch->state = STATE_IDLE; + stop_tsi(touch); + detect_pen_down(touch, 1); +} + +static void da9034_tsi_work(struct work_struct *work) +{ + struct da9034_touch *touch = + container_of(work, struct da9034_touch, tsi_work.work); + + da9034_event_handler(touch, EVENT_TIMEDOUT); +} + +static int da9034_touch_notifier(struct notifier_block *nb, + unsigned long event, void *data) +{ + struct da9034_touch *touch = + container_of(nb, struct da9034_touch, notifier); + + if (event & DA9034_EVENT_TSI_READY) + da9034_event_handler(touch, EVENT_TSI_READY); + + if ((event & DA9034_EVENT_PEN_DOWN) && touch->state == STATE_IDLE) + da9034_event_handler(touch, EVENT_PEN_DOWN); + + return 0; +} + +static int da9034_touch_open(struct input_dev *dev) +{ + struct da9034_touch *touch = input_get_drvdata(dev); + int ret; + + ret = da903x_register_notifier(touch->da9034_dev, &touch->notifier, + DA9034_EVENT_PEN_DOWN | DA9034_EVENT_TSI_READY); + if (ret) + return -EBUSY; + + /* Enable ADC LDO */ + ret = da903x_set_bits(touch->da9034_dev, + DA9034_MANUAL_CTRL, DA9034_LDO_ADC_EN); + if (ret) + return ret; + + /* TSI_DELAY: 3 slots, TSI_SKIP: 3 slots */ + ret = da903x_write(touch->da9034_dev, DA9034_TSI_CTRL1, 0x1b); + if (ret) + return ret; + + ret = da903x_write(touch->da9034_dev, DA9034_TSI_CTRL2, 0x00); + if (ret) + return ret; + + touch->state = STATE_IDLE; + detect_pen_down(touch, 1); + + return 0; +} + +static void da9034_touch_close(struct input_dev *dev) +{ + struct da9034_touch *touch = input_get_drvdata(dev); + + da903x_unregister_notifier(touch->da9034_dev, &touch->notifier, + DA9034_EVENT_PEN_DOWN | DA9034_EVENT_TSI_READY); + + cancel_delayed_work_sync(&touch->tsi_work); + + touch->state = STATE_IDLE; + stop_tsi(touch); + detect_pen_down(touch, 0); + + /* Disable ADC LDO */ + da903x_clr_bits(touch->da9034_dev, + DA9034_MANUAL_CTRL, DA9034_LDO_ADC_EN); +} + + +static int da9034_touch_probe(struct platform_device *pdev) +{ + struct da9034_touch_pdata *pdata = pdev->dev.platform_data; + struct da9034_touch *touch; + struct input_dev *input_dev; + int ret; + + touch = kzalloc(sizeof(struct da9034_touch), GFP_KERNEL); + if (touch == NULL) { + dev_err(&pdev->dev, "failed to allocate driver data\n"); + return -ENOMEM; + } + + touch->da9034_dev = pdev->dev.parent; + + if (pdata) { + touch->interval_ms = pdata->interval_ms; + touch->x_inverted = pdata->x_inverted; + touch->y_inverted = pdata->y_inverted; + } else + /* fallback into default */ + touch->interval_ms = 10; + + INIT_DELAYED_WORK(&touch->tsi_work, da9034_tsi_work); + touch->notifier.notifier_call = da9034_touch_notifier; + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&pdev->dev, "failed to allocate input device\n"); + ret = -ENOMEM; + goto err_free_touch; + } + + input_dev->name = pdev->name; + input_dev->open = da9034_touch_open; + input_dev->close = da9034_touch_close; + input_dev->dev.parent = &pdev->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(ABS_X, input_dev->absbit); + __set_bit(ABS_Y, input_dev->absbit); + input_set_abs_params(input_dev, ABS_X, 0, 1023, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 1023, 0, 0); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + + touch->input_dev = input_dev; + input_set_drvdata(input_dev, touch); + + ret = input_register_device(input_dev); + if (ret) + goto err_free_input; + + platform_set_drvdata(pdev, touch); + return 0; + +err_free_input: + input_free_device(input_dev); +err_free_touch: + kfree(touch); + return ret; +} + +static int da9034_touch_remove(struct platform_device *pdev) +{ + struct da9034_touch *touch = platform_get_drvdata(pdev); + + input_unregister_device(touch->input_dev); + kfree(touch); + + return 0; +} + +static struct platform_driver da9034_touch_driver = { + .driver = { + .name = "da9034-touch", + .owner = THIS_MODULE, + }, + .probe = da9034_touch_probe, + .remove = da9034_touch_remove, +}; +module_platform_driver(da9034_touch_driver); + +MODULE_DESCRIPTION("Touchscreen driver for Dialog Semiconductor DA9034"); +MODULE_AUTHOR("Eric Miao , Bin Yang "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:da9034-touch"); diff --git a/drivers/input/touchscreen/da9052_tsi.c b/drivers/input/touchscreen/da9052_tsi.c new file mode 100644 index 00000000..8f561e22 --- /dev/null +++ b/drivers/input/touchscreen/da9052_tsi.c @@ -0,0 +1,351 @@ +/* + * TSI driver for Dialog DA9052 + * + * Copyright(c) 2012 Dialog Semiconductor Ltd. + * + * Author: David Dajun Chen + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ +#include +#include +#include +#include +#include + +#include +#include + +#define TSI_PEN_DOWN_STATUS 0x40 + +struct da9052_tsi { + struct da9052 *da9052; + struct input_dev *dev; + struct delayed_work ts_pen_work; + struct mutex mutex; + bool stopped; + bool adc_on; +}; + +static void da9052_ts_adc_toggle(struct da9052_tsi *tsi, bool on) +{ + da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 1 << 0, on); + tsi->adc_on = on; +} + +static irqreturn_t da9052_ts_pendwn_irq(int irq, void *data) +{ + struct da9052_tsi *tsi = data; + + if (!tsi->stopped) { + /* Mask PEN_DOWN event and unmask TSI_READY event */ + da9052_disable_irq_nosync(tsi->da9052, DA9052_IRQ_PENDOWN); + da9052_enable_irq(tsi->da9052, DA9052_IRQ_TSIREADY); + + da9052_ts_adc_toggle(tsi, true); + + schedule_delayed_work(&tsi->ts_pen_work, HZ / 50); + } + + return IRQ_HANDLED; +} + +static void da9052_ts_read(struct da9052_tsi *tsi) +{ + struct input_dev *input = tsi->dev; + int ret; + u16 x, y, z; + u8 v; + + ret = da9052_reg_read(tsi->da9052, DA9052_TSI_X_MSB_REG); + if (ret < 0) + return; + + x = (u16) ret; + + ret = da9052_reg_read(tsi->da9052, DA9052_TSI_Y_MSB_REG); + if (ret < 0) + return; + + y = (u16) ret; + + ret = da9052_reg_read(tsi->da9052, DA9052_TSI_Z_MSB_REG); + if (ret < 0) + return; + + z = (u16) ret; + + ret = da9052_reg_read(tsi->da9052, DA9052_TSI_LSB_REG); + if (ret < 0) + return; + + v = (u8) ret; + + x = ((x << 2) & 0x3fc) | (v & 0x3); + y = ((y << 2) & 0x3fc) | ((v & 0xc) >> 2); + z = ((z << 2) & 0x3fc) | ((v & 0x30) >> 4); + + input_report_key(input, BTN_TOUCH, 1); + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + input_report_abs(input, ABS_PRESSURE, z); + input_sync(input); +} + +static irqreturn_t da9052_ts_datardy_irq(int irq, void *data) +{ + struct da9052_tsi *tsi = data; + + da9052_ts_read(tsi); + + return IRQ_HANDLED; +} + +static void da9052_ts_pen_work(struct work_struct *work) +{ + struct da9052_tsi *tsi = container_of(work, struct da9052_tsi, + ts_pen_work.work); + if (!tsi->stopped) { + int ret = da9052_reg_read(tsi->da9052, DA9052_TSI_LSB_REG); + if (ret < 0 || (ret & TSI_PEN_DOWN_STATUS)) { + /* Pen is still DOWN (or read error) */ + schedule_delayed_work(&tsi->ts_pen_work, HZ / 50); + } else { + struct input_dev *input = tsi->dev; + + /* Pen UP */ + da9052_ts_adc_toggle(tsi, false); + + /* Report Pen UP */ + input_report_key(input, BTN_TOUCH, 0); + input_report_abs(input, ABS_PRESSURE, 0); + input_sync(input); + + /* + * FIXME: Fixes the unhandled irq issue when quick + * pen down and pen up events occurs + */ + ret = da9052_reg_update(tsi->da9052, + DA9052_EVENT_B_REG, 0xC0, 0xC0); + if (ret < 0) + return; + + /* Mask TSI_READY event and unmask PEN_DOWN event */ + da9052_disable_irq(tsi->da9052, DA9052_IRQ_TSIREADY); + da9052_enable_irq(tsi->da9052, DA9052_IRQ_PENDOWN); + } + } +} + +static int da9052_ts_configure_gpio(struct da9052 *da9052) +{ + int error; + + error = da9052_reg_update(da9052, DA9052_GPIO_2_3_REG, 0x30, 0); + if (error < 0) + return error; + + error = da9052_reg_update(da9052, DA9052_GPIO_4_5_REG, 0x33, 0); + if (error < 0) + return error; + + error = da9052_reg_update(da9052, DA9052_GPIO_6_7_REG, 0x33, 0); + if (error < 0) + return error; + + return 0; +} + +static int da9052_configure_tsi(struct da9052_tsi *tsi) +{ + int error; + + error = da9052_ts_configure_gpio(tsi->da9052); + if (error) + return error; + + /* Measure TSI sample every 1ms */ + error = da9052_reg_update(tsi->da9052, DA9052_ADC_CONT_REG, + 1 << 6, 1 << 6); + if (error < 0) + return error; + + /* TSI_DELAY: 3 slots, TSI_SKIP: 0 slots, TSI_MODE: XYZP */ + error = da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 0xFC, 0xC0); + if (error < 0) + return error; + + /* Supply TSIRef through LD09 */ + error = da9052_reg_write(tsi->da9052, DA9052_LDO9_REG, 0x59); + if (error < 0) + return error; + + return 0; +} + +static int da9052_ts_input_open(struct input_dev *input_dev) +{ + struct da9052_tsi *tsi = input_get_drvdata(input_dev); + + tsi->stopped = false; + mb(); + + /* Unmask PEN_DOWN event */ + da9052_enable_irq(tsi->da9052, DA9052_IRQ_PENDOWN); + + /* Enable Pen Detect Circuit */ + return da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, + 1 << 1, 1 << 1); +} + +static void da9052_ts_input_close(struct input_dev *input_dev) +{ + struct da9052_tsi *tsi = input_get_drvdata(input_dev); + + tsi->stopped = true; + mb(); + da9052_disable_irq(tsi->da9052, DA9052_IRQ_PENDOWN); + cancel_delayed_work_sync(&tsi->ts_pen_work); + + if (tsi->adc_on) { + da9052_disable_irq(tsi->da9052, DA9052_IRQ_TSIREADY); + da9052_ts_adc_toggle(tsi, false); + + /* + * If ADC was on that means that pendwn IRQ was disabled + * twice and we need to enable it to keep enable/disable + * counter balanced. IRQ is still off though. + */ + da9052_enable_irq(tsi->da9052, DA9052_IRQ_PENDOWN); + } + + /* Disable Pen Detect Circuit */ + da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 1 << 1, 0); +} + +static int da9052_ts_probe(struct platform_device *pdev) +{ + struct da9052 *da9052; + struct da9052_tsi *tsi; + struct input_dev *input_dev; + int error; + + da9052 = dev_get_drvdata(pdev->dev.parent); + if (!da9052) + return -EINVAL; + + tsi = kzalloc(sizeof(struct da9052_tsi), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!tsi || !input_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + tsi->da9052 = da9052; + tsi->dev = input_dev; + tsi->stopped = true; + INIT_DELAYED_WORK(&tsi->ts_pen_work, da9052_ts_pen_work); + + input_dev->id.version = 0x0101; + input_dev->id.vendor = 0x15B6; + input_dev->id.product = 0x9052; + input_dev->name = "Dialog DA9052 TouchScreen Driver"; + input_dev->dev.parent = &pdev->dev; + input_dev->open = da9052_ts_input_open; + input_dev->close = da9052_ts_input_close; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_X, 0, 1023, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 1023, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 1023, 0, 0); + + input_set_drvdata(input_dev, tsi); + + /* Disable Pen Detect Circuit */ + da9052_reg_update(tsi->da9052, DA9052_TSI_CONT_A_REG, 1 << 1, 0); + + /* Disable ADC */ + da9052_ts_adc_toggle(tsi, false); + + error = da9052_request_irq(tsi->da9052, DA9052_IRQ_PENDOWN, + "pendown-irq", da9052_ts_pendwn_irq, tsi); + if (error) { + dev_err(tsi->da9052->dev, + "Failed to register PENDWN IRQ: %d\n", error); + goto err_free_mem; + } + + error = da9052_request_irq(tsi->da9052, DA9052_IRQ_TSIREADY, + "tsiready-irq", da9052_ts_datardy_irq, tsi); + if (error) { + dev_err(tsi->da9052->dev, + "Failed to register TSIRDY IRQ :%d\n", error); + goto err_free_pendwn_irq; + } + + /* Mask PEN_DOWN and TSI_READY events */ + da9052_disable_irq(tsi->da9052, DA9052_IRQ_PENDOWN); + da9052_disable_irq(tsi->da9052, DA9052_IRQ_TSIREADY); + + error = da9052_configure_tsi(tsi); + if (error) + goto err_free_datardy_irq; + + error = input_register_device(tsi->dev); + if (error) + goto err_free_datardy_irq; + + platform_set_drvdata(pdev, tsi); + + return 0; + +err_free_datardy_irq: + da9052_free_irq(tsi->da9052, DA9052_IRQ_TSIREADY, tsi); +err_free_pendwn_irq: + da9052_free_irq(tsi->da9052, DA9052_IRQ_PENDOWN, tsi); +err_free_mem: + kfree(tsi); + input_free_device(input_dev); + + return error; +} + +static int da9052_ts_remove(struct platform_device *pdev) +{ + struct da9052_tsi *tsi = platform_get_drvdata(pdev); + + da9052_reg_write(tsi->da9052, DA9052_LDO9_REG, 0x19); + + da9052_free_irq(tsi->da9052, DA9052_IRQ_TSIREADY, tsi); + da9052_free_irq(tsi->da9052, DA9052_IRQ_PENDOWN, tsi); + + input_unregister_device(tsi->dev); + kfree(tsi); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver da9052_tsi_driver = { + .probe = da9052_ts_probe, + .remove = da9052_ts_remove, + .driver = { + .name = "da9052-tsi", + .owner = THIS_MODULE, + }, +}; + +module_platform_driver(da9052_tsi_driver); + +MODULE_DESCRIPTION("Touchscreen driver for Dialog Semiconductor DA9052"); +MODULE_AUTHOR("Anthony Olech "); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:da9052-tsi"); diff --git a/drivers/input/touchscreen/dynapro.c b/drivers/input/touchscreen/dynapro.c new file mode 100644 index 00000000..1809677a --- /dev/null +++ b/drivers/input/touchscreen/dynapro.c @@ -0,0 +1,191 @@ +/* + * Dynapro serial touchscreen driver + * + * Copyright (c) 2009 Tias Guns + * Based on the inexio driver (c) Vojtech Pavlik and Dan Streetman and + * Richard Lemon + * + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * 2009/09/19 Tias Guns + * Copied inexio.c and edited for Dynapro protocol (from retired Xorg module) + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Dynapro serial touchscreen driver" + +MODULE_AUTHOR("Tias Guns "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define DYNAPRO_FORMAT_TOUCH_BIT 0x40 +#define DYNAPRO_FORMAT_LENGTH 3 +#define DYNAPRO_RESPONSE_BEGIN_BYTE 0x80 + +#define DYNAPRO_MIN_XC 0 +#define DYNAPRO_MAX_XC 0x3ff +#define DYNAPRO_MIN_YC 0 +#define DYNAPRO_MAX_YC 0x3ff + +#define DYNAPRO_GET_XC(data) (data[1] | ((data[0] & 0x38) << 4)) +#define DYNAPRO_GET_YC(data) (data[2] | ((data[0] & 0x07) << 7)) +#define DYNAPRO_GET_TOUCHED(data) (DYNAPRO_FORMAT_TOUCH_BIT & data[0]) + +/* + * Per-touchscreen data. + */ + +struct dynapro { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[DYNAPRO_FORMAT_LENGTH]; + char phys[32]; +}; + +static void dynapro_process_data(struct dynapro *pdynapro) +{ + struct input_dev *dev = pdynapro->dev; + + if (DYNAPRO_FORMAT_LENGTH == ++pdynapro->idx) { + input_report_abs(dev, ABS_X, DYNAPRO_GET_XC(pdynapro->data)); + input_report_abs(dev, ABS_Y, DYNAPRO_GET_YC(pdynapro->data)); + input_report_key(dev, BTN_TOUCH, + DYNAPRO_GET_TOUCHED(pdynapro->data)); + input_sync(dev); + + pdynapro->idx = 0; + } +} + +static irqreturn_t dynapro_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct dynapro *pdynapro = serio_get_drvdata(serio); + + pdynapro->data[pdynapro->idx] = data; + + if (DYNAPRO_RESPONSE_BEGIN_BYTE & pdynapro->data[0]) + dynapro_process_data(pdynapro); + else + dev_dbg(&serio->dev, "unknown/unsynchronized data: %x\n", + pdynapro->data[0]); + + return IRQ_HANDLED; +} + +static void dynapro_disconnect(struct serio *serio) +{ + struct dynapro *pdynapro = serio_get_drvdata(serio); + + input_get_device(pdynapro->dev); + input_unregister_device(pdynapro->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(pdynapro->dev); + kfree(pdynapro); +} + +/* + * dynapro_connect() is the routine that is called when someone adds a + * new serio device that supports dynapro protocol and registers it as + * an input device. This is usually accomplished using inputattach. + */ + +static int dynapro_connect(struct serio *serio, struct serio_driver *drv) +{ + struct dynapro *pdynapro; + struct input_dev *input_dev; + int err; + + pdynapro = kzalloc(sizeof(struct dynapro), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!pdynapro || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + pdynapro->serio = serio; + pdynapro->dev = input_dev; + snprintf(pdynapro->phys, sizeof(pdynapro->phys), + "%s/input0", serio->phys); + + input_dev->name = "Dynapro Serial TouchScreen"; + input_dev->phys = pdynapro->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_DYNAPRO; + input_dev->id.product = 0; + input_dev->id.version = 0x0001; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(pdynapro->dev, ABS_X, + DYNAPRO_MIN_XC, DYNAPRO_MAX_XC, 0, 0); + input_set_abs_params(pdynapro->dev, ABS_Y, + DYNAPRO_MIN_YC, DYNAPRO_MAX_YC, 0, 0); + + serio_set_drvdata(serio, pdynapro); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(pdynapro->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(pdynapro); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id dynapro_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_DYNAPRO, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, dynapro_serio_ids); + +static struct serio_driver dynapro_drv = { + .driver = { + .name = "dynapro", + }, + .description = DRIVER_DESC, + .id_table = dynapro_serio_ids, + .interrupt = dynapro_interrupt, + .connect = dynapro_connect, + .disconnect = dynapro_disconnect, +}; + +module_serio_driver(dynapro_drv); diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c new file mode 100644 index 00000000..83fa1b15 --- /dev/null +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -0,0 +1,892 @@ +/* + * Copyright (C) 2012 Simon Budig, + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * This is a driver for the EDT "Polytouch" family of touch controllers + * based on the FocalTech FT5x06 line of chips. + * + * Development of this driver has been sponsored by Glyn: + * http://www.glyn.com/Products/Displays + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_SUPPORT_POINTS 5 + +#define WORK_REGISTER_THRESHOLD 0x00 +#define WORK_REGISTER_REPORT_RATE 0x08 +#define WORK_REGISTER_GAIN 0x30 +#define WORK_REGISTER_OFFSET 0x31 +#define WORK_REGISTER_NUM_X 0x33 +#define WORK_REGISTER_NUM_Y 0x34 + +#define WORK_REGISTER_OPMODE 0x3c +#define FACTORY_REGISTER_OPMODE 0x01 + +#define TOUCH_EVENT_DOWN 0x00 +#define TOUCH_EVENT_UP 0x01 +#define TOUCH_EVENT_ON 0x02 +#define TOUCH_EVENT_RESERVED 0x03 + +#define EDT_NAME_LEN 23 +#define EDT_SWITCH_MODE_RETRIES 10 +#define EDT_SWITCH_MODE_DELAY 5 /* msec */ +#define EDT_RAW_DATA_RETRIES 100 +#define EDT_RAW_DATA_DELAY 1 /* msec */ + +struct edt_ft5x06_ts_data { + struct i2c_client *client; + struct input_dev *input; + u16 num_x; + u16 num_y; + +#if defined(CONFIG_DEBUG_FS) + struct dentry *debug_dir; + u8 *raw_buffer; + size_t raw_bufsize; +#endif + + struct mutex mutex; + bool factory_mode; + int threshold; + int gain; + int offset; + int report_rate; + + char name[EDT_NAME_LEN]; +}; + +static int edt_ft5x06_ts_readwrite(struct i2c_client *client, + u16 wr_len, u8 *wr_buf, + u16 rd_len, u8 *rd_buf) +{ + struct i2c_msg wrmsg[2]; + int i = 0; + int ret; + + if (wr_len) { + wrmsg[i].addr = client->addr; + wrmsg[i].flags = 0; + wrmsg[i].len = wr_len; + wrmsg[i].buf = wr_buf; + i++; + } + if (rd_len) { + wrmsg[i].addr = client->addr; + wrmsg[i].flags = I2C_M_RD; + wrmsg[i].len = rd_len; + wrmsg[i].buf = rd_buf; + i++; + } + + ret = i2c_transfer(client->adapter, wrmsg, i); + if (ret < 0) + return ret; + if (ret != i) + return -EIO; + + return 0; +} + +static bool edt_ft5x06_ts_check_crc(struct edt_ft5x06_ts_data *tsdata, + u8 *buf, int buflen) +{ + int i; + u8 crc = 0; + + for (i = 0; i < buflen - 1; i++) + crc ^= buf[i]; + + if (crc != buf[buflen-1]) { + dev_err_ratelimited(&tsdata->client->dev, + "crc error: 0x%02x expected, got 0x%02x\n", + crc, buf[buflen-1]); + return false; + } + + return true; +} + +static irqreturn_t edt_ft5x06_ts_isr(int irq, void *dev_id) +{ + struct edt_ft5x06_ts_data *tsdata = dev_id; + struct device *dev = &tsdata->client->dev; + u8 cmd = 0xf9; + u8 rdbuf[26]; + int i, type, x, y, id; + int error; + + memset(rdbuf, 0, sizeof(rdbuf)); + + error = edt_ft5x06_ts_readwrite(tsdata->client, + sizeof(cmd), &cmd, + sizeof(rdbuf), rdbuf); + if (error) { + dev_err_ratelimited(dev, "Unable to fetch data, error: %d\n", + error); + goto out; + } + + if (rdbuf[0] != 0xaa || rdbuf[1] != 0xaa || rdbuf[2] != 26) { + dev_err_ratelimited(dev, "Unexpected header: %02x%02x%02x!\n", + rdbuf[0], rdbuf[1], rdbuf[2]); + goto out; + } + + if (!edt_ft5x06_ts_check_crc(tsdata, rdbuf, 26)) + goto out; + + for (i = 0; i < MAX_SUPPORT_POINTS; i++) { + u8 *buf = &rdbuf[i * 4 + 5]; + bool down; + + type = buf[0] >> 6; + /* ignore Reserved events */ + if (type == TOUCH_EVENT_RESERVED) + continue; + + x = ((buf[0] << 8) | buf[1]) & 0x0fff; + y = ((buf[2] << 8) | buf[3]) & 0x0fff; + id = (buf[2] >> 4) & 0x0f; + down = (type != TOUCH_EVENT_UP); + + input_mt_slot(tsdata->input, id); + input_mt_report_slot_state(tsdata->input, MT_TOOL_FINGER, down); + + if (!down) + continue; + + input_report_abs(tsdata->input, ABS_MT_POSITION_X, x); + input_report_abs(tsdata->input, ABS_MT_POSITION_Y, y); + } + + input_mt_report_pointer_emulation(tsdata->input, true); + input_sync(tsdata->input); + +out: + return IRQ_HANDLED; +} + +static int edt_ft5x06_register_write(struct edt_ft5x06_ts_data *tsdata, + u8 addr, u8 value) +{ + u8 wrbuf[4]; + + wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; + wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; + wrbuf[2] = value; + wrbuf[3] = wrbuf[0] ^ wrbuf[1] ^ wrbuf[2]; + + return edt_ft5x06_ts_readwrite(tsdata->client, 4, wrbuf, 0, NULL); +} + +static int edt_ft5x06_register_read(struct edt_ft5x06_ts_data *tsdata, + u8 addr) +{ + u8 wrbuf[2], rdbuf[2]; + int error; + + wrbuf[0] = tsdata->factory_mode ? 0xf3 : 0xfc; + wrbuf[1] = tsdata->factory_mode ? addr & 0x7f : addr & 0x3f; + wrbuf[1] |= tsdata->factory_mode ? 0x80 : 0x40; + + error = edt_ft5x06_ts_readwrite(tsdata->client, 2, wrbuf, 2, rdbuf); + if (error) + return error; + + if ((wrbuf[0] ^ wrbuf[1] ^ rdbuf[0]) != rdbuf[1]) { + dev_err(&tsdata->client->dev, + "crc error: 0x%02x expected, got 0x%02x\n", + wrbuf[0] ^ wrbuf[1] ^ rdbuf[0], rdbuf[1]); + return -EIO; + } + + return rdbuf[0]; +} + +struct edt_ft5x06_attribute { + struct device_attribute dattr; + size_t field_offset; + u8 limit_low; + u8 limit_high; + u8 addr; +}; + +#define EDT_ATTR(_field, _mode, _addr, _limit_low, _limit_high) \ + struct edt_ft5x06_attribute edt_ft5x06_attr_##_field = { \ + .dattr = __ATTR(_field, _mode, \ + edt_ft5x06_setting_show, \ + edt_ft5x06_setting_store), \ + .field_offset = \ + offsetof(struct edt_ft5x06_ts_data, _field), \ + .limit_low = _limit_low, \ + .limit_high = _limit_high, \ + .addr = _addr, \ + } + +static ssize_t edt_ft5x06_setting_show(struct device *dev, + struct device_attribute *dattr, + char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); + struct edt_ft5x06_attribute *attr = + container_of(dattr, struct edt_ft5x06_attribute, dattr); + u8 *field = (u8 *)((char *)tsdata + attr->field_offset); + int val; + size_t count = 0; + int error = 0; + + mutex_lock(&tsdata->mutex); + + if (tsdata->factory_mode) { + error = -EIO; + goto out; + } + + val = edt_ft5x06_register_read(tsdata, attr->addr); + if (val < 0) { + error = val; + dev_err(&tsdata->client->dev, + "Failed to fetch attribute %s, error %d\n", + dattr->attr.name, error); + goto out; + } + + if (val != *field) { + dev_warn(&tsdata->client->dev, + "%s: read (%d) and stored value (%d) differ\n", + dattr->attr.name, val, *field); + *field = val; + } + + count = scnprintf(buf, PAGE_SIZE, "%d\n", val); +out: + mutex_unlock(&tsdata->mutex); + return error ?: count; +} + +static ssize_t edt_ft5x06_setting_store(struct device *dev, + struct device_attribute *dattr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); + struct edt_ft5x06_attribute *attr = + container_of(dattr, struct edt_ft5x06_attribute, dattr); + u8 *field = (u8 *)((char *)tsdata + attr->field_offset); + unsigned int val; + int error; + + mutex_lock(&tsdata->mutex); + + if (tsdata->factory_mode) { + error = -EIO; + goto out; + } + + error = kstrtouint(buf, 0, &val); + if (error) + goto out; + + if (val < attr->limit_low || val > attr->limit_high) { + error = -ERANGE; + goto out; + } + + error = edt_ft5x06_register_write(tsdata, attr->addr, val); + if (error) { + dev_err(&tsdata->client->dev, + "Failed to update attribute %s, error: %d\n", + dattr->attr.name, error); + goto out; + } + + *field = val; + +out: + mutex_unlock(&tsdata->mutex); + return error ?: count; +} + +static EDT_ATTR(gain, S_IWUSR | S_IRUGO, WORK_REGISTER_GAIN, 0, 31); +static EDT_ATTR(offset, S_IWUSR | S_IRUGO, WORK_REGISTER_OFFSET, 0, 31); +static EDT_ATTR(threshold, S_IWUSR | S_IRUGO, + WORK_REGISTER_THRESHOLD, 20, 80); +static EDT_ATTR(report_rate, S_IWUSR | S_IRUGO, + WORK_REGISTER_REPORT_RATE, 3, 14); + +static struct attribute *edt_ft5x06_attrs[] = { + &edt_ft5x06_attr_gain.dattr.attr, + &edt_ft5x06_attr_offset.dattr.attr, + &edt_ft5x06_attr_threshold.dattr.attr, + &edt_ft5x06_attr_report_rate.dattr.attr, + NULL +}; + +static const struct attribute_group edt_ft5x06_attr_group = { + .attrs = edt_ft5x06_attrs, +}; + +#ifdef CONFIG_DEBUG_FS +static int edt_ft5x06_factory_mode(struct edt_ft5x06_ts_data *tsdata) +{ + struct i2c_client *client = tsdata->client; + int retries = EDT_SWITCH_MODE_RETRIES; + int ret; + int error; + + disable_irq(client->irq); + + if (!tsdata->raw_buffer) { + tsdata->raw_bufsize = tsdata->num_x * tsdata->num_y * + sizeof(u16); + tsdata->raw_buffer = kzalloc(tsdata->raw_bufsize, GFP_KERNEL); + if (!tsdata->raw_buffer) { + error = -ENOMEM; + goto err_out; + } + } + + /* mode register is 0x3c when in the work mode */ + error = edt_ft5x06_register_write(tsdata, WORK_REGISTER_OPMODE, 0x03); + if (error) { + dev_err(&client->dev, + "failed to switch to factory mode, error %d\n", error); + goto err_out; + } + + tsdata->factory_mode = true; + do { + mdelay(EDT_SWITCH_MODE_DELAY); + /* mode register is 0x01 when in factory mode */ + ret = edt_ft5x06_register_read(tsdata, FACTORY_REGISTER_OPMODE); + if (ret == 0x03) + break; + } while (--retries > 0); + + if (retries == 0) { + dev_err(&client->dev, "not in factory mode after %dms.\n", + EDT_SWITCH_MODE_RETRIES * EDT_SWITCH_MODE_DELAY); + error = -EIO; + goto err_out; + } + + return 0; + +err_out: + kfree(tsdata->raw_buffer); + tsdata->raw_buffer = NULL; + tsdata->factory_mode = false; + enable_irq(client->irq); + + return error; +} + +static int edt_ft5x06_work_mode(struct edt_ft5x06_ts_data *tsdata) +{ + struct i2c_client *client = tsdata->client; + int retries = EDT_SWITCH_MODE_RETRIES; + int ret; + int error; + + /* mode register is 0x01 when in the factory mode */ + error = edt_ft5x06_register_write(tsdata, FACTORY_REGISTER_OPMODE, 0x1); + if (error) { + dev_err(&client->dev, + "failed to switch to work mode, error: %d\n", error); + return error; + } + + tsdata->factory_mode = false; + + do { + mdelay(EDT_SWITCH_MODE_DELAY); + /* mode register is 0x01 when in factory mode */ + ret = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OPMODE); + if (ret == 0x01) + break; + } while (--retries > 0); + + if (retries == 0) { + dev_err(&client->dev, "not in work mode after %dms.\n", + EDT_SWITCH_MODE_RETRIES * EDT_SWITCH_MODE_DELAY); + tsdata->factory_mode = true; + return -EIO; + } + + kfree(tsdata->raw_buffer); + tsdata->raw_buffer = NULL; + + /* restore parameters */ + edt_ft5x06_register_write(tsdata, WORK_REGISTER_THRESHOLD, + tsdata->threshold); + edt_ft5x06_register_write(tsdata, WORK_REGISTER_GAIN, + tsdata->gain); + edt_ft5x06_register_write(tsdata, WORK_REGISTER_OFFSET, + tsdata->offset); + edt_ft5x06_register_write(tsdata, WORK_REGISTER_REPORT_RATE, + tsdata->report_rate); + + enable_irq(client->irq); + + return 0; +} + +static int edt_ft5x06_debugfs_mode_get(void *data, u64 *mode) +{ + struct edt_ft5x06_ts_data *tsdata = data; + + *mode = tsdata->factory_mode; + + return 0; +}; + +static int edt_ft5x06_debugfs_mode_set(void *data, u64 mode) +{ + struct edt_ft5x06_ts_data *tsdata = data; + int retval = 0; + + if (mode > 1) + return -ERANGE; + + mutex_lock(&tsdata->mutex); + + if (mode != tsdata->factory_mode) { + retval = mode ? edt_ft5x06_factory_mode(tsdata) : + edt_ft5x06_work_mode(tsdata); + } + + mutex_unlock(&tsdata->mutex); + + return retval; +}; + +DEFINE_SIMPLE_ATTRIBUTE(debugfs_mode_fops, edt_ft5x06_debugfs_mode_get, + edt_ft5x06_debugfs_mode_set, "%llu\n"); + +static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file, + char __user *buf, size_t count, loff_t *off) +{ + struct edt_ft5x06_ts_data *tsdata = file->private_data; + struct i2c_client *client = tsdata->client; + int retries = EDT_RAW_DATA_RETRIES; + int val, i, error; + size_t read = 0; + int colbytes; + char wrbuf[3]; + u8 *rdbuf; + + if (*off < 0 || *off >= tsdata->raw_bufsize) + return 0; + + mutex_lock(&tsdata->mutex); + + if (!tsdata->factory_mode || !tsdata->raw_buffer) { + error = -EIO; + goto out; + } + + error = edt_ft5x06_register_write(tsdata, 0x08, 0x01); + if (error) { + dev_dbg(&client->dev, + "failed to write 0x08 register, error %d\n", error); + goto out; + } + + do { + msleep(EDT_RAW_DATA_DELAY); + val = edt_ft5x06_register_read(tsdata, 0x08); + if (val < 1) + break; + } while (--retries > 0); + + if (val < 0) { + error = val; + dev_dbg(&client->dev, + "failed to read 0x08 register, error %d\n", error); + goto out; + } + + if (retries == 0) { + dev_dbg(&client->dev, + "timed out waiting for register to settle\n"); + error = -ETIMEDOUT; + goto out; + } + + rdbuf = tsdata->raw_buffer; + colbytes = tsdata->num_y * sizeof(u16); + + wrbuf[0] = 0xf5; + wrbuf[1] = 0x0e; + for (i = 0; i < tsdata->num_x; i++) { + wrbuf[2] = i; /* column index */ + error = edt_ft5x06_ts_readwrite(tsdata->client, + sizeof(wrbuf), wrbuf, + colbytes, rdbuf); + if (error) + goto out; + + rdbuf += colbytes; + } + + read = min_t(size_t, count, tsdata->raw_bufsize - *off); + if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { + error = -EFAULT; + goto out; + } + + *off += read; +out: + mutex_unlock(&tsdata->mutex); + return error ?: read; +}; + + +static const struct file_operations debugfs_raw_data_fops = { + .open = simple_open, + .read = edt_ft5x06_debugfs_raw_data_read, +}; + +static void +edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, + const char *debugfs_name) +{ + tsdata->debug_dir = debugfs_create_dir(debugfs_name, NULL); + if (!tsdata->debug_dir) + return; + + debugfs_create_u16("num_x", S_IRUSR, tsdata->debug_dir, &tsdata->num_x); + debugfs_create_u16("num_y", S_IRUSR, tsdata->debug_dir, &tsdata->num_y); + + debugfs_create_file("mode", S_IRUSR | S_IWUSR, + tsdata->debug_dir, tsdata, &debugfs_mode_fops); + debugfs_create_file("raw_data", S_IRUSR, + tsdata->debug_dir, tsdata, &debugfs_raw_data_fops); +} + +static void +edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) +{ + if (tsdata->debug_dir) + debugfs_remove_recursive(tsdata->debug_dir); + kfree(tsdata->raw_buffer); +} + +#else + +static inline void +edt_ft5x06_ts_prepare_debugfs(struct edt_ft5x06_ts_data *tsdata, + const char *debugfs_name) +{ +} + +static inline void +edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) +{ +} + +#endif /* CONFIG_DEBUGFS */ + + + +static int edt_ft5x06_ts_reset(struct i2c_client *client, + int reset_pin) +{ + int error; + + if (gpio_is_valid(reset_pin)) { + /* this pulls reset down, enabling the low active reset */ + error = gpio_request_one(reset_pin, GPIOF_OUT_INIT_LOW, + "edt-ft5x06 reset"); + if (error) { + dev_err(&client->dev, + "Failed to request GPIO %d as reset pin, error %d\n", + reset_pin, error); + return error; + } + + mdelay(50); + gpio_set_value(reset_pin, 1); + mdelay(100); + } + + return 0; +} + +static int edt_ft5x06_ts_identify(struct i2c_client *client, + char *model_name, + char *fw_version) +{ + u8 rdbuf[EDT_NAME_LEN]; + char *p; + int error; + + error = edt_ft5x06_ts_readwrite(client, 1, "\xbb", + EDT_NAME_LEN - 1, rdbuf); + if (error) + return error; + + /* remove last '$' end marker */ + rdbuf[EDT_NAME_LEN - 1] = '\0'; + if (rdbuf[EDT_NAME_LEN - 2] == '$') + rdbuf[EDT_NAME_LEN - 2] = '\0'; + + /* look for Model/Version separator */ + p = strchr(rdbuf, '*'); + if (p) + *p++ = '\0'; + + strlcpy(model_name, rdbuf + 1, EDT_NAME_LEN); + strlcpy(fw_version, p ? p : "", EDT_NAME_LEN); + + return 0; +} + +#define EDT_ATTR_CHECKSET(name, reg) \ + if (pdata->name >= edt_ft5x06_attr_##name.limit_low && \ + pdata->name <= edt_ft5x06_attr_##name.limit_high) \ + edt_ft5x06_register_write(tsdata, reg, pdata->name) + +static void +edt_ft5x06_ts_get_defaults(struct edt_ft5x06_ts_data *tsdata, + const struct edt_ft5x06_platform_data *pdata) +{ + if (!pdata->use_parameters) + return; + + /* pick up defaults from the platform data */ + EDT_ATTR_CHECKSET(threshold, WORK_REGISTER_THRESHOLD); + EDT_ATTR_CHECKSET(gain, WORK_REGISTER_GAIN); + EDT_ATTR_CHECKSET(offset, WORK_REGISTER_OFFSET); + EDT_ATTR_CHECKSET(report_rate, WORK_REGISTER_REPORT_RATE); +} + +static void +edt_ft5x06_ts_get_parameters(struct edt_ft5x06_ts_data *tsdata) +{ + tsdata->threshold = edt_ft5x06_register_read(tsdata, + WORK_REGISTER_THRESHOLD); + tsdata->gain = edt_ft5x06_register_read(tsdata, WORK_REGISTER_GAIN); + tsdata->offset = edt_ft5x06_register_read(tsdata, WORK_REGISTER_OFFSET); + tsdata->report_rate = edt_ft5x06_register_read(tsdata, + WORK_REGISTER_REPORT_RATE); + tsdata->num_x = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_X); + tsdata->num_y = edt_ft5x06_register_read(tsdata, WORK_REGISTER_NUM_Y); +} + +static int edt_ft5x06_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct edt_ft5x06_platform_data *pdata = + client->dev.platform_data; + struct edt_ft5x06_ts_data *tsdata; + struct input_dev *input; + int error; + char fw_version[EDT_NAME_LEN]; + + dev_dbg(&client->dev, "probing for EDT FT5x06 I2C\n"); + + if (!pdata) { + dev_err(&client->dev, "no platform data?\n"); + return -EINVAL; + } + + error = edt_ft5x06_ts_reset(client, pdata->reset_pin); + if (error) + return error; + + if (gpio_is_valid(pdata->irq_pin)) { + error = gpio_request_one(pdata->irq_pin, + GPIOF_IN, "edt-ft5x06 irq"); + if (error) { + dev_err(&client->dev, + "Failed to request GPIO %d, error %d\n", + pdata->irq_pin, error); + return error; + } + } + + tsdata = kzalloc(sizeof(*tsdata), GFP_KERNEL); + input = input_allocate_device(); + if (!tsdata || !input) { + dev_err(&client->dev, "failed to allocate driver data.\n"); + error = -ENOMEM; + goto err_free_mem; + } + + mutex_init(&tsdata->mutex); + tsdata->client = client; + tsdata->input = input; + tsdata->factory_mode = false; + + error = edt_ft5x06_ts_identify(client, tsdata->name, fw_version); + if (error) { + dev_err(&client->dev, "touchscreen probe failed\n"); + goto err_free_mem; + } + + edt_ft5x06_ts_get_defaults(tsdata, pdata); + edt_ft5x06_ts_get_parameters(tsdata); + + dev_dbg(&client->dev, + "Model \"%s\", Rev. \"%s\", %dx%d sensors\n", + tsdata->name, fw_version, tsdata->num_x, tsdata->num_y); + + input->name = tsdata->name; + input->id.bustype = BUS_I2C; + input->dev.parent = &client->dev; + + __set_bit(EV_SYN, input->evbit); + __set_bit(EV_KEY, input->evbit); + __set_bit(EV_ABS, input->evbit); + __set_bit(BTN_TOUCH, input->keybit); + input_set_abs_params(input, ABS_X, 0, tsdata->num_x * 64 - 1, 0, 0); + input_set_abs_params(input, ABS_Y, 0, tsdata->num_y * 64 - 1, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_X, + 0, tsdata->num_x * 64 - 1, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, + 0, tsdata->num_y * 64 - 1, 0, 0); + error = input_mt_init_slots(input, MAX_SUPPORT_POINTS, 0); + if (error) { + dev_err(&client->dev, "Unable to init MT slots.\n"); + goto err_free_mem; + } + + input_set_drvdata(input, tsdata); + i2c_set_clientdata(client, tsdata); + + error = request_threaded_irq(client->irq, NULL, edt_ft5x06_ts_isr, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->name, tsdata); + if (error) { + dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); + goto err_free_mem; + } + + error = sysfs_create_group(&client->dev.kobj, &edt_ft5x06_attr_group); + if (error) + goto err_free_irq; + + error = input_register_device(input); + if (error) + goto err_remove_attrs; + + edt_ft5x06_ts_prepare_debugfs(tsdata, dev_driver_string(&client->dev)); + device_init_wakeup(&client->dev, 1); + + dev_dbg(&client->dev, + "EDT FT5x06 initialized: IRQ pin %d, Reset pin %d.\n", + pdata->irq_pin, pdata->reset_pin); + + return 0; + +err_remove_attrs: + sysfs_remove_group(&client->dev.kobj, &edt_ft5x06_attr_group); +err_free_irq: + free_irq(client->irq, tsdata); +err_free_mem: + input_free_device(input); + kfree(tsdata); + + if (gpio_is_valid(pdata->irq_pin)) + gpio_free(pdata->irq_pin); + + return error; +} + +static int edt_ft5x06_ts_remove(struct i2c_client *client) +{ + const struct edt_ft5x06_platform_data *pdata = + dev_get_platdata(&client->dev); + struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); + + edt_ft5x06_ts_teardown_debugfs(tsdata); + sysfs_remove_group(&client->dev.kobj, &edt_ft5x06_attr_group); + + free_irq(client->irq, tsdata); + input_unregister_device(tsdata->input); + + if (gpio_is_valid(pdata->irq_pin)) + gpio_free(pdata->irq_pin); + if (gpio_is_valid(pdata->reset_pin)) + gpio_free(pdata->reset_pin); + + kfree(tsdata); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int edt_ft5x06_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int edt_ft5x06_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(dev)) + disable_irq_wake(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(edt_ft5x06_ts_pm_ops, + edt_ft5x06_ts_suspend, edt_ft5x06_ts_resume); + +static const struct i2c_device_id edt_ft5x06_ts_id[] = { + { "edt-ft5x06", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, edt_ft5x06_ts_id); + +static struct i2c_driver edt_ft5x06_ts_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "edt_ft5x06", + .pm = &edt_ft5x06_ts_pm_ops, + }, + .id_table = edt_ft5x06_ts_id, + .probe = edt_ft5x06_ts_probe, + .remove = edt_ft5x06_ts_remove, +}; + +module_i2c_driver(edt_ft5x06_ts_driver); + +MODULE_AUTHOR("Simon Budig "); +MODULE_DESCRIPTION("EDT FT5x06 I2C Touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/eeti_ts.c b/drivers/input/touchscreen/eeti_ts.c new file mode 100644 index 00000000..8fe5086c --- /dev/null +++ b/drivers/input/touchscreen/eeti_ts.c @@ -0,0 +1,331 @@ +/* + * Touch Screen driver for EETI's I2C connected touch screen panels + * Copyright (c) 2009 Daniel Mack + * + * See EETI's software guide for the protocol specification: + * http://home.eeti.com.tw/web20/eg/guide.htm + * + * Based on migor_ts.c + * Copyright (c) 2008 Magnus Damm + * Copyright (c) 2007 Ujjwal Pande + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static bool flip_x; +module_param(flip_x, bool, 0644); +MODULE_PARM_DESC(flip_x, "flip x coordinate"); + +static bool flip_y; +module_param(flip_y, bool, 0644); +MODULE_PARM_DESC(flip_y, "flip y coordinate"); + +struct eeti_ts_priv { + struct i2c_client *client; + struct input_dev *input; + struct work_struct work; + struct mutex mutex; + int irq_gpio, irq, irq_active_high; +}; + +#define EETI_TS_BITDEPTH (11) +#define EETI_MAXVAL ((1 << (EETI_TS_BITDEPTH + 1)) - 1) + +#define REPORT_BIT_PRESSED (1 << 0) +#define REPORT_BIT_AD0 (1 << 1) +#define REPORT_BIT_AD1 (1 << 2) +#define REPORT_BIT_HAS_PRESSURE (1 << 6) +#define REPORT_RES_BITS(v) (((v) >> 1) + EETI_TS_BITDEPTH) + +static inline int eeti_ts_irq_active(struct eeti_ts_priv *priv) +{ + return gpio_get_value(priv->irq_gpio) == priv->irq_active_high; +} + +static void eeti_ts_read(struct work_struct *work) +{ + char buf[6]; + unsigned int x, y, res, pressed, to = 100; + struct eeti_ts_priv *priv = + container_of(work, struct eeti_ts_priv, work); + + mutex_lock(&priv->mutex); + + while (eeti_ts_irq_active(priv) && --to) + i2c_master_recv(priv->client, buf, sizeof(buf)); + + if (!to) { + dev_err(&priv->client->dev, + "unable to clear IRQ - line stuck?\n"); + goto out; + } + + /* drop non-report packets */ + if (!(buf[0] & 0x80)) + goto out; + + pressed = buf[0] & REPORT_BIT_PRESSED; + res = REPORT_RES_BITS(buf[0] & (REPORT_BIT_AD0 | REPORT_BIT_AD1)); + x = buf[2] | (buf[1] << 8); + y = buf[4] | (buf[3] << 8); + + /* fix the range to 11 bits */ + x >>= res - EETI_TS_BITDEPTH; + y >>= res - EETI_TS_BITDEPTH; + + if (flip_x) + x = EETI_MAXVAL - x; + + if (flip_y) + y = EETI_MAXVAL - y; + + if (buf[0] & REPORT_BIT_HAS_PRESSURE) + input_report_abs(priv->input, ABS_PRESSURE, buf[5]); + + input_report_abs(priv->input, ABS_X, x); + input_report_abs(priv->input, ABS_Y, y); + input_report_key(priv->input, BTN_TOUCH, !!pressed); + input_sync(priv->input); + +out: + mutex_unlock(&priv->mutex); +} + +static irqreturn_t eeti_ts_isr(int irq, void *dev_id) +{ + struct eeti_ts_priv *priv = dev_id; + + /* postpone I2C transactions as we are atomic */ + schedule_work(&priv->work); + + return IRQ_HANDLED; +} + +static void eeti_ts_start(struct eeti_ts_priv *priv) +{ + enable_irq(priv->irq); + + /* Read the events once to arm the IRQ */ + eeti_ts_read(&priv->work); +} + +static void eeti_ts_stop(struct eeti_ts_priv *priv) +{ + disable_irq(priv->irq); + cancel_work_sync(&priv->work); +} + +static int eeti_ts_open(struct input_dev *dev) +{ + struct eeti_ts_priv *priv = input_get_drvdata(dev); + + eeti_ts_start(priv); + + return 0; +} + +static void eeti_ts_close(struct input_dev *dev) +{ + struct eeti_ts_priv *priv = input_get_drvdata(dev); + + eeti_ts_stop(priv); +} + +static int eeti_ts_probe(struct i2c_client *client, + const struct i2c_device_id *idp) +{ + struct eeti_ts_platform_data *pdata = client->dev.platform_data; + struct eeti_ts_priv *priv; + struct input_dev *input; + unsigned int irq_flags; + int err = -ENOMEM; + + /* + * In contrast to what's described in the datasheet, there seems + * to be no way of probing the presence of that device using I2C + * commands. So we need to blindly believe it is there, and wait + * for interrupts to occur. + */ + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) { + dev_err(&client->dev, "failed to allocate driver data\n"); + goto err0; + } + + mutex_init(&priv->mutex); + input = input_allocate_device(); + + if (!input) { + dev_err(&client->dev, "Failed to allocate input device.\n"); + goto err1; + } + + input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input, ABS_X, 0, EETI_MAXVAL, 0, 0); + input_set_abs_params(input, ABS_Y, 0, EETI_MAXVAL, 0, 0); + input_set_abs_params(input, ABS_PRESSURE, 0, 0xff, 0, 0); + + input->name = client->name; + input->id.bustype = BUS_I2C; + input->dev.parent = &client->dev; + input->open = eeti_ts_open; + input->close = eeti_ts_close; + + priv->client = client; + priv->input = input; + priv->irq_gpio = pdata->irq_gpio; + priv->irq = gpio_to_irq(pdata->irq_gpio); + + err = gpio_request_one(pdata->irq_gpio, GPIOF_IN, client->name); + if (err < 0) + goto err1; + + priv->irq_active_high = pdata->irq_active_high; + + irq_flags = priv->irq_active_high ? + IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; + + INIT_WORK(&priv->work, eeti_ts_read); + i2c_set_clientdata(client, priv); + input_set_drvdata(input, priv); + + err = input_register_device(input); + if (err) + goto err2; + + err = request_irq(priv->irq, eeti_ts_isr, irq_flags, + client->name, priv); + if (err) { + dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); + goto err3; + } + + /* + * Disable the device for now. It will be enabled once the + * input device is opened. + */ + eeti_ts_stop(priv); + + device_init_wakeup(&client->dev, 0); + return 0; + +err3: + input_unregister_device(input); + input = NULL; /* so we dont try to free it below */ +err2: + gpio_free(pdata->irq_gpio); +err1: + input_free_device(input); + kfree(priv); +err0: + return err; +} + +static int eeti_ts_remove(struct i2c_client *client) +{ + struct eeti_ts_priv *priv = i2c_get_clientdata(client); + + free_irq(priv->irq, priv); + /* + * eeti_ts_stop() leaves IRQ disabled. We need to re-enable it + * so that device still works if we reload the driver. + */ + enable_irq(priv->irq); + + input_unregister_device(priv->input); + kfree(priv); + + return 0; +} + +#ifdef CONFIG_PM +static int eeti_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct eeti_ts_priv *priv = i2c_get_clientdata(client); + struct input_dev *input_dev = priv->input; + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + eeti_ts_stop(priv); + + mutex_unlock(&input_dev->mutex); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(priv->irq); + + return 0; +} + +static int eeti_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct eeti_ts_priv *priv = i2c_get_clientdata(client); + struct input_dev *input_dev = priv->input; + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(priv->irq); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + eeti_ts_start(priv); + + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(eeti_ts_pm, eeti_ts_suspend, eeti_ts_resume); +#endif + +static const struct i2c_device_id eeti_ts_id[] = { + { "eeti_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, eeti_ts_id); + +static struct i2c_driver eeti_ts_driver = { + .driver = { + .name = "eeti_ts", +#ifdef CONFIG_PM + .pm = &eeti_ts_pm, +#endif + }, + .probe = eeti_ts_probe, + .remove = eeti_ts_remove, + .id_table = eeti_ts_id, +}; + +module_i2c_driver(eeti_ts_driver); + +MODULE_DESCRIPTION("EETI Touchscreen driver"); +MODULE_AUTHOR("Daniel Mack "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/egalax_ts.c b/drivers/input/touchscreen/egalax_ts.c new file mode 100644 index 00000000..39f3df86 --- /dev/null +++ b/drivers/input/touchscreen/egalax_ts.c @@ -0,0 +1,311 @@ +/* + * Driver for EETI eGalax Multiple Touch Controller + * + * Copyright (C) 2011 Freescale Semiconductor, Inc. + * + * based on max11801_ts.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +/* EETI eGalax serial touch screen controller is a I2C based multiple + * touch screen controller, it supports 5 point multiple touch. */ + +/* TODO: + - auto idle mode support +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Mouse Mode: some panel may configure the controller to mouse mode, + * which can only report one point at a given time. + * This driver will ignore events in this mode. + */ +#define REPORT_MODE_MOUSE 0x1 +/* + * Vendor Mode: this mode is used to transfer some vendor specific + * messages. + * This driver will ignore events in this mode. + */ +#define REPORT_MODE_VENDOR 0x3 +/* Multiple Touch Mode */ +#define REPORT_MODE_MTTOUCH 0x4 + +#define MAX_SUPPORT_POINTS 5 + +#define EVENT_VALID_OFFSET 7 +#define EVENT_VALID_MASK (0x1 << EVENT_VALID_OFFSET) +#define EVENT_ID_OFFSET 2 +#define EVENT_ID_MASK (0xf << EVENT_ID_OFFSET) +#define EVENT_IN_RANGE (0x1 << 1) +#define EVENT_DOWN_UP (0X1 << 0) + +#define MAX_I2C_DATA_LEN 10 + +#define EGALAX_MAX_X 32760 +#define EGALAX_MAX_Y 32760 +#define EGALAX_MAX_TRIES 100 + +struct egalax_ts { + struct i2c_client *client; + struct input_dev *input_dev; +}; + +static irqreturn_t egalax_ts_interrupt(int irq, void *dev_id) +{ + struct egalax_ts *ts = dev_id; + struct input_dev *input_dev = ts->input_dev; + struct i2c_client *client = ts->client; + u8 buf[MAX_I2C_DATA_LEN]; + int id, ret, x, y, z; + int tries = 0; + bool down, valid; + u8 state; + + do { + ret = i2c_master_recv(client, buf, MAX_I2C_DATA_LEN); + } while (ret == -EAGAIN && tries++ < EGALAX_MAX_TRIES); + + if (ret < 0) + return IRQ_HANDLED; + + if (buf[0] != REPORT_MODE_MTTOUCH) { + /* ignore mouse events and vendor events */ + return IRQ_HANDLED; + } + + state = buf[1]; + x = (buf[3] << 8) | buf[2]; + y = (buf[5] << 8) | buf[4]; + z = (buf[7] << 8) | buf[6]; + + valid = state & EVENT_VALID_MASK; + id = (state & EVENT_ID_MASK) >> EVENT_ID_OFFSET; + down = state & EVENT_DOWN_UP; + + if (!valid || id > MAX_SUPPORT_POINTS) { + dev_dbg(&client->dev, "point invalid\n"); + return IRQ_HANDLED; + } + + input_mt_slot(input_dev, id); + input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, down); + + dev_dbg(&client->dev, "%s id:%d x:%d y:%d z:%d", + down ? "down" : "up", id, x, y, z); + + if (down) { + input_report_abs(input_dev, ABS_MT_POSITION_X, x); + input_report_abs(input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(input_dev, ABS_MT_PRESSURE, z); + } + + input_mt_report_pointer_emulation(input_dev, true); + input_sync(input_dev); + + return IRQ_HANDLED; +} + +/* wake up controller by an falling edge of interrupt gpio. */ +static int egalax_wake_up_device(struct i2c_client *client) +{ + struct device_node *np = client->dev.of_node; + int gpio; + int ret; + + if (!np) + return -ENODEV; + + gpio = of_get_named_gpio(np, "wakeup-gpios", 0); + if (!gpio_is_valid(gpio)) + return -ENODEV; + + ret = gpio_request(gpio, "egalax_irq"); + if (ret < 0) { + dev_err(&client->dev, + "request gpio failed, cannot wake up controller: %d\n", + ret); + return ret; + } + + /* wake up controller via an falling edge on IRQ gpio. */ + gpio_direction_output(gpio, 0); + gpio_set_value(gpio, 1); + + /* controller should be waken up, return irq. */ + gpio_direction_input(gpio); + gpio_free(gpio); + + return 0; +} + +static int egalax_firmware_version(struct i2c_client *client) +{ + static const u8 cmd[MAX_I2C_DATA_LEN] = { 0x03, 0x03, 0xa, 0x01, 0x41 }; + int ret; + + ret = i2c_master_send(client, cmd, MAX_I2C_DATA_LEN); + if (ret < 0) + return ret; + + return 0; +} + +static int egalax_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct egalax_ts *ts; + struct input_dev *input_dev; + int ret; + int error; + + ts = kzalloc(sizeof(struct egalax_ts), GFP_KERNEL); + if (!ts) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_ts; + } + + ts->client = client; + ts->input_dev = input_dev; + + /* controller may be in sleep, wake it up. */ + error = egalax_wake_up_device(client); + if (error) { + dev_err(&client->dev, "Failed to wake up the controller\n"); + goto err_free_dev; + } + + ret = egalax_firmware_version(client); + if (ret < 0) { + dev_err(&client->dev, "Failed to read firmware version\n"); + error = -EIO; + goto err_free_dev; + } + + input_dev->name = "EETI eGalax Touch Screen"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_X, 0, EGALAX_MAX_X, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, EGALAX_MAX_Y, 0, 0); + input_set_abs_params(input_dev, + ABS_MT_POSITION_X, 0, EGALAX_MAX_X, 0, 0); + input_set_abs_params(input_dev, + ABS_MT_POSITION_Y, 0, EGALAX_MAX_Y, 0, 0); + input_mt_init_slots(input_dev, MAX_SUPPORT_POINTS, 0); + + input_set_drvdata(input_dev, ts); + + error = request_threaded_irq(client->irq, NULL, egalax_ts_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + "egalax_ts", ts); + if (error < 0) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_dev; + } + + error = input_register_device(ts->input_dev); + if (error) + goto err_free_irq; + + i2c_set_clientdata(client, ts); + return 0; + +err_free_irq: + free_irq(client->irq, ts); +err_free_dev: + input_free_device(input_dev); +err_free_ts: + kfree(ts); + + return error; +} + +static int egalax_ts_remove(struct i2c_client *client) +{ + struct egalax_ts *ts = i2c_get_clientdata(client); + + free_irq(client->irq, ts); + + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + +static const struct i2c_device_id egalax_ts_id[] = { + { "egalax_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, egalax_ts_id); + +#ifdef CONFIG_PM_SLEEP +static int egalax_ts_suspend(struct device *dev) +{ + static const u8 suspend_cmd[MAX_I2C_DATA_LEN] = { + 0x3, 0x6, 0xa, 0x3, 0x36, 0x3f, 0x2, 0, 0, 0 + }; + struct i2c_client *client = to_i2c_client(dev); + int ret; + + ret = i2c_master_send(client, suspend_cmd, MAX_I2C_DATA_LEN); + return ret > 0 ? 0 : ret; +} + +static int egalax_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + return egalax_wake_up_device(client); +} +#endif + +static SIMPLE_DEV_PM_OPS(egalax_ts_pm_ops, egalax_ts_suspend, egalax_ts_resume); + +static struct of_device_id egalax_ts_dt_ids[] = { + { .compatible = "eeti,egalax_ts" }, + { /* sentinel */ } +}; + +static struct i2c_driver egalax_ts_driver = { + .driver = { + .name = "egalax_ts", + .owner = THIS_MODULE, + .pm = &egalax_ts_pm_ops, + .of_match_table = of_match_ptr(egalax_ts_dt_ids), + }, + .id_table = egalax_ts_id, + .probe = egalax_ts_probe, + .remove = egalax_ts_remove, +}; + +module_i2c_driver(egalax_ts_driver); + +MODULE_AUTHOR("Freescale Semiconductor, Inc."); +MODULE_DESCRIPTION("Touchscreen driver for EETI eGalax touch controller"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/elo.c b/drivers/input/touchscreen/elo.c new file mode 100644 index 00000000..957423d1 --- /dev/null +++ b/drivers/input/touchscreen/elo.c @@ -0,0 +1,408 @@ +/* + * Elo serial touchscreen driver + * + * Copyright (c) 2004 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * This driver can handle serial Elo touchscreens using either the Elo standard + * 'E271-2210' 10-byte protocol, Elo legacy 'E281A-4002' 6-byte protocol, Elo + * legacy 'E271-140' 4-byte protocol and Elo legacy 'E261-280' 3-byte protocol. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Elo serial touchscreen driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define ELO_MAX_LENGTH 10 + +#define ELO10_PACKET_LEN 8 +#define ELO10_TOUCH 0x03 +#define ELO10_PRESSURE 0x80 + +#define ELO10_LEAD_BYTE 'U' + +#define ELO10_ID_CMD 'i' + +#define ELO10_TOUCH_PACKET 'T' +#define ELO10_ACK_PACKET 'A' +#define ELI10_ID_PACKET 'I' + +/* + * Per-touchscreen data. + */ + +struct elo { + struct input_dev *dev; + struct serio *serio; + struct mutex cmd_mutex; + struct completion cmd_done; + int id; + int idx; + unsigned char expected_packet; + unsigned char csum; + unsigned char data[ELO_MAX_LENGTH]; + unsigned char response[ELO10_PACKET_LEN]; + char phys[32]; +}; + +static void elo_process_data_10(struct elo *elo, unsigned char data) +{ + struct input_dev *dev = elo->dev; + + elo->data[elo->idx] = data; + + switch (elo->idx++) { + case 0: + elo->csum = 0xaa; + if (data != ELO10_LEAD_BYTE) { + dev_dbg(&elo->serio->dev, + "unsynchronized data: 0x%02x\n", data); + elo->idx = 0; + } + break; + + case 9: + elo->idx = 0; + if (data != elo->csum) { + dev_dbg(&elo->serio->dev, + "bad checksum: 0x%02x, expected 0x%02x\n", + data, elo->csum); + break; + } + if (elo->data[1] != elo->expected_packet) { + if (elo->data[1] != ELO10_TOUCH_PACKET) + dev_dbg(&elo->serio->dev, + "unexpected packet: 0x%02x\n", + elo->data[1]); + break; + } + if (likely(elo->data[1] == ELO10_TOUCH_PACKET)) { + input_report_abs(dev, ABS_X, (elo->data[4] << 8) | elo->data[3]); + input_report_abs(dev, ABS_Y, (elo->data[6] << 8) | elo->data[5]); + if (elo->data[2] & ELO10_PRESSURE) + input_report_abs(dev, ABS_PRESSURE, + (elo->data[8] << 8) | elo->data[7]); + input_report_key(dev, BTN_TOUCH, elo->data[2] & ELO10_TOUCH); + input_sync(dev); + } else if (elo->data[1] == ELO10_ACK_PACKET) { + if (elo->data[2] == '0') + elo->expected_packet = ELO10_TOUCH_PACKET; + complete(&elo->cmd_done); + } else { + memcpy(elo->response, &elo->data[1], ELO10_PACKET_LEN); + elo->expected_packet = ELO10_ACK_PACKET; + } + break; + } + elo->csum += data; +} + +static void elo_process_data_6(struct elo *elo, unsigned char data) +{ + struct input_dev *dev = elo->dev; + + elo->data[elo->idx] = data; + + switch (elo->idx++) { + + case 0: + if ((data & 0xc0) != 0xc0) + elo->idx = 0; + break; + + case 1: + if ((data & 0xc0) != 0x80) + elo->idx = 0; + break; + + case 2: + if ((data & 0xc0) != 0x40) + elo->idx = 0; + break; + + case 3: + if (data & 0xc0) { + elo->idx = 0; + break; + } + + input_report_abs(dev, ABS_X, ((elo->data[0] & 0x3f) << 6) | (elo->data[1] & 0x3f)); + input_report_abs(dev, ABS_Y, ((elo->data[2] & 0x3f) << 6) | (elo->data[3] & 0x3f)); + + if (elo->id == 2) { + input_report_key(dev, BTN_TOUCH, 1); + input_sync(dev); + elo->idx = 0; + } + + break; + + case 4: + if (data) { + input_sync(dev); + elo->idx = 0; + } + break; + + case 5: + if ((data & 0xf0) == 0) { + input_report_abs(dev, ABS_PRESSURE, elo->data[5]); + input_report_key(dev, BTN_TOUCH, !!elo->data[5]); + } + input_sync(dev); + elo->idx = 0; + break; + } +} + +static void elo_process_data_3(struct elo *elo, unsigned char data) +{ + struct input_dev *dev = elo->dev; + + elo->data[elo->idx] = data; + + switch (elo->idx++) { + + case 0: + if ((data & 0x7f) != 0x01) + elo->idx = 0; + break; + case 2: + input_report_key(dev, BTN_TOUCH, !(elo->data[1] & 0x80)); + input_report_abs(dev, ABS_X, elo->data[1]); + input_report_abs(dev, ABS_Y, elo->data[2]); + input_sync(dev); + elo->idx = 0; + break; + } +} + +static irqreturn_t elo_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct elo *elo = serio_get_drvdata(serio); + + switch (elo->id) { + case 0: + elo_process_data_10(elo, data); + break; + + case 1: + case 2: + elo_process_data_6(elo, data); + break; + + case 3: + elo_process_data_3(elo, data); + break; + } + + return IRQ_HANDLED; +} + +static int elo_command_10(struct elo *elo, unsigned char *packet) +{ + int rc = -1; + int i; + unsigned char csum = 0xaa + ELO10_LEAD_BYTE; + + mutex_lock(&elo->cmd_mutex); + + serio_pause_rx(elo->serio); + elo->expected_packet = toupper(packet[0]); + init_completion(&elo->cmd_done); + serio_continue_rx(elo->serio); + + if (serio_write(elo->serio, ELO10_LEAD_BYTE)) + goto out; + + for (i = 0; i < ELO10_PACKET_LEN; i++) { + csum += packet[i]; + if (serio_write(elo->serio, packet[i])) + goto out; + } + + if (serio_write(elo->serio, csum)) + goto out; + + wait_for_completion_timeout(&elo->cmd_done, HZ); + + if (elo->expected_packet == ELO10_TOUCH_PACKET) { + /* We are back in reporting mode, the command was ACKed */ + memcpy(packet, elo->response, ELO10_PACKET_LEN); + rc = 0; + } + + out: + mutex_unlock(&elo->cmd_mutex); + return rc; +} + +static int elo_setup_10(struct elo *elo) +{ + static const char *elo_types[] = { "Accu", "Dura", "Intelli", "Carroll" }; + struct input_dev *dev = elo->dev; + unsigned char packet[ELO10_PACKET_LEN] = { ELO10_ID_CMD }; + + if (elo_command_10(elo, packet)) + return -1; + + dev->id.version = (packet[5] << 8) | packet[4]; + + input_set_abs_params(dev, ABS_X, 96, 4000, 0, 0); + input_set_abs_params(dev, ABS_Y, 96, 4000, 0, 0); + if (packet[3] & ELO10_PRESSURE) + input_set_abs_params(dev, ABS_PRESSURE, 0, 255, 0, 0); + + dev_info(&elo->serio->dev, + "%sTouch touchscreen, fw: %02x.%02x, features: 0x%02x, controller: 0x%02x\n", + elo_types[(packet[1] -'0') & 0x03], + packet[5], packet[4], packet[3], packet[7]); + + return 0; +} + +/* + * elo_disconnect() is the opposite of elo_connect() + */ + +static void elo_disconnect(struct serio *serio) +{ + struct elo *elo = serio_get_drvdata(serio); + + input_get_device(elo->dev); + input_unregister_device(elo->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(elo->dev); + kfree(elo); +} + +/* + * elo_connect() is the routine that is called when someone adds a + * new serio device that supports Gunze protocol and registers it as + * an input device. + */ + +static int elo_connect(struct serio *serio, struct serio_driver *drv) +{ + struct elo *elo; + struct input_dev *input_dev; + int err; + + elo = kzalloc(sizeof(struct elo), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!elo || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + elo->serio = serio; + elo->id = serio->id.id; + elo->dev = input_dev; + elo->expected_packet = ELO10_TOUCH_PACKET; + mutex_init(&elo->cmd_mutex); + init_completion(&elo->cmd_done); + snprintf(elo->phys, sizeof(elo->phys), "%s/input0", serio->phys); + + input_dev->name = "Elo Serial TouchScreen"; + input_dev->phys = elo->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_ELO; + input_dev->id.product = elo->id; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + serio_set_drvdata(serio, elo); + err = serio_open(serio, drv); + if (err) + goto fail2; + + switch (elo->id) { + + case 0: /* 10-byte protocol */ + if (elo_setup_10(elo)) + goto fail3; + + break; + + case 1: /* 6-byte protocol */ + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0); + + case 2: /* 4-byte protocol */ + input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); + break; + + case 3: /* 3-byte protocol */ + input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0); + break; + } + + err = input_register_device(elo->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(elo); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id elo_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_ELO, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, elo_serio_ids); + +static struct serio_driver elo_drv = { + .driver = { + .name = "elo", + }, + .description = DRIVER_DESC, + .id_table = elo_serio_ids, + .interrupt = elo_interrupt, + .connect = elo_connect, + .disconnect = elo_disconnect, +}; + +module_serio_driver(elo_drv); diff --git a/drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2c_app_3.3V.h b/drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2c_app_3.3V.h new file mode 100644 index 00000000..331fc3d8 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2c_app_3.3V.h @@ -0,0 +1,1660 @@ +0x2, 0x5, 0xf0,0x2, 0x5a,0xa9,0xee,0x30,0xe7,0x7, 0xc3,0xe4,0x9f,0xff,0xe4,0x9e, +0xfe,0x22,0x12,0x0, 0x2, 0x3, 0x4, 0x6, 0x7, 0x8, 0xa, 0x2, 0x59,0x7d,0x2, 0x17, +0xfa,0x22,0x22,0x2, 0x3c,0xd1,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x13,0x40,0x19,0x74, +0xf3,0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0x13,0x40,0xb, 0x74,0xf8,0x2f, +0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0xff,0xff,0x2, 0x3c,0xba,0x8f,0xd9, +0x8d,0xda,0x22,0x2, 0x64,0x5c,0xe7,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x46,0xe7,0x9, +0xf2,0x8, 0xdf,0xfa,0x80,0x3e,0x88,0x82,0x8c,0x83,0xe7,0x9, 0xf0,0xa3,0xdf,0xfa, +0x80,0x32,0xe3,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x78,0xe3,0x9, 0xf2,0x8, 0xdf,0xfa, +0x80,0x70,0x88,0x82,0x8c,0x83,0xe3,0x9, 0xf0,0xa3,0xdf,0xfa,0x80,0x64,0x89,0x82, +0x8a,0x83,0xe0,0xa3,0xf6,0x8, 0xdf,0xfa,0x80,0x58,0x89,0x82,0x8a,0x83,0xe0,0xa3, +0xf2,0x8, 0xdf,0xfa,0x80,0x4c,0x80,0xd2,0x80,0xfa,0x80,0xc6,0x80,0xd4,0x80,0x69, +0x80,0xf2,0x80,0x33,0x80,0x10,0x80,0xa6,0x80,0xea,0x80,0x9a,0x80,0xa8,0x80,0xda, +0x80,0xe2,0x80,0xca,0x80,0x33,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe4,0x93,0xa3,0xc8, +0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83, +0xcc,0xdf,0xe9,0xde,0xe7,0x80,0xd, 0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3,0xf6,0x8, +0xdf,0xf9,0xec,0xfa,0xa9,0xf0,0xed,0xfb,0x22,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe0, +0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc, +0xc5,0x83,0xcc,0xdf,0xea,0xde,0xe8,0x80,0xdb,0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3, +0xf2,0x8, 0xdf,0xf9,0x80,0xcc,0x88,0xf0,0xef,0x60,0x1, 0xe, 0x4e,0x60,0xc3,0x88, +0xf0,0xed,0x24,0x2, 0xb4,0x4, 0x0, 0x50,0xb9,0xf5,0x82,0xeb,0x24,0x2, 0xb4,0x4, +0x0, 0x50,0xaf,0x23,0x23,0x45,0x82,0x23,0x90,0x0, 0xa6,0x73,0xbb,0x1, 0x6, 0x89, +0x82,0x8a,0x83,0xe0,0x22,0x50,0x2, 0xe7,0x22,0xbb,0xfe,0x2, 0xe3,0x22,0x89,0x82, +0x8a,0x83,0xe4,0x93,0x22,0xbb,0x1, 0xc, 0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x6, 0xe9, +0x25,0x82,0xf8,0xe2,0x22,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4, +0x93,0x22,0xbb,0x1, 0xf, 0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe0,0x28,0xf0,0x22,0x50,0x9, 0xc5,0x82,0x29,0xf8,0xe5,0x82,0x26,0xf6,0x22,0xbb, +0xfe,0x9, 0xc5,0x82,0x29,0xf8,0xe2,0x25,0x82,0xf2,0x22,0xf8,0xea,0x25,0x83,0xf5, +0x83,0xe9,0x93,0x28,0x22,0xbb,0x1, 0x6, 0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x2, +0xf7,0x22,0xbb,0xfe,0x1, 0xf3,0x22,0xf8,0xbb,0x1, 0xd, 0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x5, 0xe9,0x25,0x82,0xc8,0xf2,0x22,0xef,0x8d,0xf0,0xa4,0xa8,0xf0,0xcf, +0x8c,0xf0,0xa4,0x28,0xce,0x8d,0xf0,0xa4,0x2e,0xfe,0x22,0xbc,0x0, 0xb, 0xbe,0x0, +0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc,0xf8,0x75,0xf0,0x8, 0xef, +0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec,0x98,0x40,0x5, 0xfc,0xee, +0x9d,0xfe,0xf, 0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed,0xf8,0xf5,0xf0,0xee,0x84, +0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x8, 0xef,0x2f,0xff,0xed,0x33,0xfd,0x40, +0x7, 0x98,0x50,0x6, 0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd,0xf, 0xd5,0xf0,0xea,0x22, +0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x2, +0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3,0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x2, 0x15,0x83,0xe0,0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x6, 0x87,0xf0,0x9, 0xe7,0x19, +0x22,0xbb,0xfe,0x7, 0xe3,0xf5,0xf0,0x9, 0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4, +0x93,0xf5,0xf0,0x74,0x1, 0x93,0x22,0xbb,0x1, 0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5, +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x9, 0xe9,0x25,0x82,0xf8, +0x86,0xf0,0x8, 0xe6,0x22,0xbb,0xfe,0xa, 0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x8, +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb, +0x1, 0xd, 0xc5,0x82,0x29,0xc5,0x82,0xc5,0x83,0x3a,0xc5,0x83,0x2, 0x2, 0x60,0x50, +0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe5,0xf0,0x26,0xf6,0x18,0xf5,0xf0,0xe5,0x82,0x36, +0xf6,0x22,0xbb,0xfe,0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe2,0x25,0xf0,0xf5,0xf0,0xf2, +0x18,0xe2,0x35,0x82,0xf2,0x22,0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x2a,0xf5, +0x83,0x74,0x1, 0x93,0x25,0xf0,0xf5,0xf0,0xe4,0x93,0x38,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x6, 0xf7,0x9, 0xa7,0xf0,0x19, +0x22,0xbb,0xfe,0x6, 0xf3,0xe5,0xf0,0x9, 0xf3,0x19,0x22,0xf8,0xbb,0x1, 0x11,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22, +0x50,0x9, 0xe9,0x25,0x82,0xc8,0xf6,0x8, 0xa6,0xf0,0x22,0xbb,0xfe,0x9, 0xe9,0x25, +0x82,0xc8,0xf2,0xe5,0xf0,0x8, 0xf2,0x22,0xe8,0x8f,0xf0,0xa4,0xcc,0x8b,0xf0,0xa4, +0x2c,0xfc,0xe9,0x8e,0xf0,0xa4,0x2c,0xfc,0x8a,0xf0,0xed,0xa4,0x2c,0xfc,0xea,0x8e, +0xf0,0xa4,0xcd,0xa8,0xf0,0x8b,0xf0,0xa4,0x2d,0xcc,0x38,0x25,0xf0,0xfd,0xe9,0x8f, +0xf0,0xa4,0x2c,0xcd,0x35,0xf0,0xfc,0xeb,0x8e,0xf0,0xa4,0xfe,0xa9,0xf0,0xeb,0x8f, +0xf0,0xa4,0xcf,0xc5,0xf0,0x2e,0xcd,0x39,0xfe,0xe4,0x3c,0xfc,0xea,0xa4,0x2d,0xce, +0x35,0xf0,0xfd,0xe4,0x3c,0xfc,0x22,0x75,0xf0,0x8, 0x75,0x82,0x0, 0xef,0x2f,0xff, +0xee,0x33,0xfe,0xcd,0x33,0xcd,0xcc,0x33,0xcc,0xc5,0x82,0x33,0xc5,0x82,0x9b,0xed, +0x9a,0xec,0x99,0xe5,0x82,0x98,0x40,0xc, 0xf5,0x82,0xee,0x9b,0xfe,0xed,0x9a,0xfd, +0xec,0x99,0xfc,0xf, 0xd5,0xf0,0xd6,0xe4,0xce,0xfb,0xe4,0xcd,0xfa,0xe4,0xcc,0xf9, +0xa8,0x82,0x22,0xb8,0x0, 0xc1,0xb9,0x0, 0x59,0xba,0x0, 0x2d,0xec,0x8b,0xf0,0x84, +0xcf,0xce,0xcd,0xfc,0xe5,0xf0,0xcb,0xf9,0x78,0x18,0xef,0x2f,0xff,0xee,0x33,0xfe, +0xed,0x33,0xfd,0xec,0x33,0xfc,0xeb,0x33,0xfb,0x10,0xd7,0x3, 0x99,0x40,0x4, 0xeb, +0x99,0xfb,0xf, 0xd8,0xe5,0xe4,0xf9,0xfa,0x22,0x78,0x18,0xef,0x2f,0xff,0xee,0x33, +0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xc9,0x33,0xc9,0x10,0xd7,0x5, 0x9b,0xe9,0x9a, +0x40,0x7, 0xec,0x9b,0xfc,0xe9,0x9a,0xf9,0xf, 0xd8,0xe0,0xe4,0xc9,0xfa,0xe4,0xcc, +0xfb,0x22,0x75,0xf0,0x10,0xef,0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xcc,0x33, +0xcc,0xc8,0x33,0xc8,0x10,0xd7,0x7, 0x9b,0xec,0x9a,0xe8,0x99,0x40,0xa, 0xed,0x9b, +0xfd,0xec,0x9a,0xfc,0xe8,0x99,0xf8,0xf, 0xd5,0xf0,0xda,0xe4,0xcd,0xfb,0xe4,0xcc, +0xfa,0xe4,0xc8,0xf9,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42, +0xf0,0xec,0x64,0x80,0xc8,0x64,0x80,0x98,0x45,0xf0,0x22,0xeb,0x9f,0xf5,0xf0,0xea, +0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xe8,0x9c,0x45,0xf0,0x22,0xe8,0x60,0xf, 0xec, +0xc3,0x13,0xfc,0xed,0x13,0xfd,0xee,0x13,0xfe,0xef,0x13,0xff,0xd8,0xf1,0x22,0xe8, +0x60,0xf, 0xef,0xc3,0x33,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xd8, +0xf1,0x22,0xec,0xf0,0xa3,0xed,0xf0,0xa3,0xee,0xf0,0xa3,0xef,0xf0,0x22,0xa8,0x82, +0x85,0x83,0xf0,0xd0,0x83,0xd0,0x82,0x12,0x5, 0x15,0x12,0x5, 0x15,0x12,0x5, 0x15, +0x12,0x5, 0x15,0xe4,0x73,0xe4,0x93,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5, +0x82,0xc8,0xf0,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5,0x82,0xc8,0x22,0xf5, +0xf0,0xc5,0x82,0xa4,0xc5,0x82,0xc5,0xf0,0xc5,0x83,0xa4,0x25,0x83,0xf5,0x83,0x22, +0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xbb,0x1, 0x7, 0x89, +0x82,0x8a,0x83,0x2, 0x5, 0xd2,0x50,0x5, 0xe9,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x5, +0xe9,0xf8,0x2, 0x5, 0xdb,0x89,0x82,0x8a,0x83,0x2, 0x5, 0xe4,0xbb,0x1, 0xd, 0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xd2,0x50,0x7, 0xe9,0x25, +0x82,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x7, 0xe9,0x25,0x82,0xf8,0x2, 0x5, 0xdb,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xe4,0xec,0x8e,0xf0,0xa4, +0xcc,0xc5,0xf0,0xcc,0xcd,0xf8,0xef,0xa4,0xce,0xc5,0xf0,0x2d,0xfd,0xe4,0x3c,0xfc, +0xe8,0xa4,0x2e,0xc8,0xc5,0xf0,0x3d,0xfd,0xe4,0x3c,0xfc,0xef,0xa4,0xff,0xe5,0xf0, +0x28,0xfe,0xe4,0x3d,0xfd,0xe4,0x3c,0xfc,0x22,0xe6,0xfb,0x8, 0xe6,0xfa,0x8, 0xe6, +0xf9,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xe2,0xfb,0x8, 0xe2,0xfa, +0x8, 0xe2,0xf9,0x22,0xe4,0x93,0xfb,0x74,0x1, 0x93,0xfa,0x74,0x2, 0x93,0xf9,0x22, +0x78,0xff,0xe4,0xf6,0xd8,0xfd,0x75,0x81,0x98,0x2, 0x6, 0x37,0x2, 0x36,0x12,0xe4, +0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x3, 0xf6,0x80,0x1, 0xf2,0x8, 0xdf,0xf4,0x80, +0x29,0xe4,0x93,0xa3,0xf8,0x54,0x7, 0x24,0xc, 0xc8,0xc3,0x33,0xc4,0x54,0xf, 0x44, +0x20,0xc8,0x83,0x40,0x4, 0xf4,0x56,0x80,0x1, 0x46,0xf6,0xdf,0xe4,0x80,0xb, 0x1, +0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x90,0x6, 0x7c,0xe4,0x7e,0x1, 0x93,0x60,0xbc, +0xa3,0xff,0x54,0x3f,0x30,0xe5,0x9, 0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x1, 0xe, +0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, +0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, +0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0xc1,0x80,0x41,0xa, +0xe3,0x0, 0x41,0xc, 0xa7,0x0, 0x41,0xc, 0xa9,0x0, 0x41,0xc, 0xad,0x0, 0x41,0xc, +0xaa,0x0, 0x2, 0x12,0x0, 0x0, 0x41,0xc, 0xea,0x2, 0x41,0xc, 0xeb,0x0, 0x1, 0x16, +0x0, 0x41,0xc, 0xec,0x0, 0x1, 0x17,0x0, 0x0, 0xab,0x45,0xaa,0x46,0xa9,0x47,0x85, +0x4a,0x82,0x75,0x83,0x0, 0x22,0xab,0x5f,0xaa,0x60,0xa9,0x61,0x85,0x64,0x82,0x75, +0x83,0x0, 0x22,0xe5,0x49,0xab,0x45,0xaa,0x46,0xa9,0x47,0x22,0xe5,0x63,0xab,0x5f, +0xaa,0x60,0xa9,0x61,0x22,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x6, 0x40,0x19,0x74,0xd, +0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0xb, 0x40,0xb, 0x74,0x8, 0x2f,0xff, +0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, +0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x8b, +0x34,0x8a,0x35,0x89,0x36,0xe5,0x38,0xd3,0x94,0xb, 0x50,0x3b,0xed,0x94,0xf, 0x50, +0x36,0xe5,0x38,0xc3,0x94,0xb, 0x50,0x2f,0xe5,0x38,0x90,0xf, 0x48,0x93,0xff,0x24, +0x3, 0xab,0x34,0x20,0xe0,0x13,0xe5,0x36,0x24,0x10,0xf9,0xe4,0x35,0x35,0xfa,0xef, +0xf1,0x6b,0x54,0xf0,0xf1,0x58,0x4d,0x80,0xc, 0xf1,0x5c,0x54,0xf, 0xf1,0x58,0xff, +0xed,0xc4,0x54,0xf0,0x4f,0x31,0xc5,0x22,0x31,0xc5,0xab,0x34,0xe5,0x36,0x24,0x10, +0xf9,0xe4,0x35,0x35,0xfa,0xe5,0x38,0x90,0xf, 0x48,0x93,0x24,0x3, 0xff,0xe4,0x33, +0xa2,0xe7,0x13,0xfe,0xef,0x13,0x29,0xf9,0xea,0x3e,0xfa,0x21,0x4c,0x90,0x0, 0x41, +0x21,0x65,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8b,0x42,0x8a,0x43,0x89,0x44,0xe4,0xf5,0x4a,0xe5,0x4a,0xc3,0x95,0x48,0x40,0x3, +0x2, 0xa, 0x56,0xab,0x42,0xaa,0x43,0xa9,0x44,0x12,0x6, 0xaf,0x12,0x1, 0x65,0xb4, +0x1c,0x0, 0x40,0x3, 0x2, 0xa, 0x51,0x90,0x8, 0x2e,0xf8,0x28,0x28,0x73,0x2, 0x8, +0x82,0x2, 0x8, 0x89,0x2, 0x8, 0x91,0x2, 0x8, 0x99,0x2, 0x8, 0xa1,0x2, 0x8, 0xa9, +0x2, 0x8, 0xb1,0x2, 0x8, 0xc7,0x2, 0x8, 0xdd,0x2, 0x8, 0xf3,0x2, 0x9, 0x9, 0x2, +0x9, 0x1f,0x2, 0x9, 0x42,0x2, 0x9, 0x65,0x2, 0x9, 0x88,0x2, 0x9, 0xab,0x2, 0x9, +0xc1,0x2, 0x9, 0xd7,0x2, 0x9, 0xed,0x2, 0xa, 0x3, 0x2, 0xa, 0x18,0x2, 0xa, 0x1f, +0x2, 0xa, 0x26,0x2, 0xa, 0x2d,0x2, 0xa, 0x34,0x2, 0xa, 0x3b,0x2, 0xa, 0x42,0x2, +0xa, 0x49,0x12,0x6, 0xa9,0xe4,0x2, 0xa, 0x4e,0x12,0x6, 0xa9,0x74,0x1, 0x2, 0xa, +0x4e,0x12,0x6, 0xa9,0x74,0x2, 0x2, 0xa, 0x4e,0x12,0x6, 0xa9,0x74,0x3, 0x2, 0xa, +0x4e,0x12,0x6, 0xa9,0x74,0x4, 0x2, 0xa, 0x4e,0x12,0x6, 0xa9,0x74,0x5, 0x2, 0xa, +0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12,0x6, 0xaf,0x74,0x13,0x2, 0xa, 0x4e,0x12, +0x6, 0xaf,0x74,0x6, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12,0x6, 0xaf, +0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x7, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3, +0xb4,0x77,0x8, 0x12,0x6, 0xaf,0x74,0x15,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x8, +0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12,0x6, 0xaf,0x74,0x16,0x2, 0xa, +0x4e,0x12,0x6, 0xaf,0x74,0x9, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12, +0x6, 0xaf,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xa, 0x2, 0xa, 0x4e,0xe5, +0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9,0x74,0x18,0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4, +0x78,0x8, 0x12,0x6, 0xaf,0x74,0x13,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xb, 0x2, +0xa, 0x4e,0xe5,0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9,0x74,0x19,0x2, 0xa, 0x4e,0x12, +0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0xaf, +0x74,0xc, 0x2, 0xa, 0x4e,0xe5,0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9,0x74,0x1a,0x2, +0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x15,0x2, 0xa, 0x4e, +0x12,0x6, 0xaf,0x74,0xd, 0x2, 0xa, 0x4e,0xe5,0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9, +0x74,0x1b,0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x16, +0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xe, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78, +0x8, 0x12,0x6, 0xaf,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xf, 0x2, 0xa, +0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x18,0x2, 0xa, 0x4e,0x12, +0x6, 0xaf,0x74,0x10,0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf, +0x74,0x19,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x11,0x2, 0xa, 0x4e,0x12,0x6, 0xc3, +0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x1a,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x12, +0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x1b,0x2, 0xa, +0x4e,0x12,0x6, 0xaf,0x74,0x13,0x80,0x36,0x12,0x6, 0xa9,0x74,0x14,0x80,0x2f,0x12, +0x6, 0xa9,0x74,0x15,0x80,0x28,0x12,0x6, 0xa9,0x74,0x16,0x80,0x21,0x12,0x6, 0xa9, +0x74,0x17,0x80,0x1a,0x12,0x6, 0xa9,0x74,0x18,0x80,0x13,0x12,0x6, 0xa9,0x74,0x19, +0x80,0xc, 0x12,0x6, 0xa9,0x74,0x1a,0x80,0x5, 0x12,0x6, 0xa9,0x74,0x1b,0x12,0x1, +0xd7,0x5, 0x4a,0x2, 0x8, 0x9, 0x22,0x8b,0x5c,0x8a,0x5d,0x89,0x5e,0xe4,0xf5,0x64, +0xe5,0x64,0xc3,0x95,0x62,0x40,0x3, 0x2, 0xc, 0x53,0xab,0x5c,0xaa,0x5d,0xa9,0x5e, +0x12,0x6, 0xbc,0x12,0x1, 0x65,0xb4,0x10,0x0, 0x40,0x3, 0x2, 0xc, 0x4e,0x90,0xa, +0x85,0xf8,0x28,0x28,0x73,0x2, 0xa, 0xb5,0x2, 0xa, 0xcf,0x2, 0xa, 0xf2,0x2, 0xb, +0x15,0x2, 0xb, 0x38,0x2, 0xb, 0x5b,0x2, 0xb, 0x7e,0x2, 0xb, 0xa1,0x2, 0xb, 0xc4, +0x2, 0xb, 0xe7,0x2, 0xc, 0x9, 0x2, 0xc, 0x1d,0x2, 0xc, 0x31,0x2, 0xc, 0x38,0x2, +0xc, 0x3f,0x2, 0xc, 0x46,0xe5,0x63,0xb4,0x77,0x5, 0x12,0x6, 0xce,0x80,0x23,0x12, +0x6, 0xcc,0xb4,0x78,0x3, 0x2, 0xb, 0x30,0x12,0x6, 0xbc,0xe4,0x2, 0xc, 0x4b,0xe5, +0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4, +0x78,0x8, 0x12,0x6, 0xbc,0x74,0x4, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x1, 0x2, +0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0x6, 0x2, 0xc, 0x4b,0x12, +0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc, +0x74,0x2, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0x7, 0x2, +0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0x6, 0x2, 0xc, 0x4b, +0x12,0x6, 0xbc,0x74,0x3, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6, +0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0x7, +0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x4, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, +0x12,0x6, 0xb6,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, +0xbc,0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x5, 0x2, 0xc, 0x4b,0xe5,0x63, +0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78, +0x8, 0x12,0x6, 0xbc,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x6, 0x2, 0xc, +0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0xb, 0x2, 0xc, 0x4b,0x12,0x6, +0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74, +0x7, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0xc, 0x2, 0xc, +0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0xb, 0x2, 0xc, 0x4b,0x12, +0x6, 0xbc,0x74,0x8, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74, +0xd, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0xc, 0x2, +0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x9, 0x80,0x42,0x12,0x6, 0xcc,0xb4,0x78,0x7, 0x12, +0x6, 0xbc,0x74,0xd, 0x80,0x35,0x12,0x6, 0xbc,0x74,0xa, 0x80,0x2e,0x12,0x6, 0xcc, +0xb4,0x78,0x7, 0x12,0x6, 0xbc,0x74,0xe, 0x80,0x21,0x12,0x6, 0xbc,0x74,0xb, 0x80, +0x1a,0x12,0x6, 0xb6,0x74,0xc, 0x80,0x13,0x12,0x6, 0xb6,0x74,0xd, 0x80,0xc, 0x12, +0x6, 0xb6,0x74,0xe, 0x80,0x5, 0x12,0x6, 0xb6,0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x64, +0x2, 0xa, 0x60,0x22,0xc0,0x0, 0xc0,0x3f,0xdf,0xbf,0xdf,0xbf,0xc0,0x1, 0xc0,0x82, +0xc1,0x2, 0xc1,0x1, 0xc0,0x3f,0xdf,0x3d,0xde,0x3c,0xde,0xbe,0xc0,0x2, 0xc1,0x85, +0xc2,0x85,0xc2,0x2, 0xc0,0x3e,0xde,0x3a,0xdd,0x3a,0xdd,0xbd,0xc0,0x3, 0xc2,0x87, +0xc4,0x7, 0xc3,0x3, 0xc0,0x3d,0xdd,0x38,0xdb,0xb7,0xdc,0xbc,0xc0,0x4, 0xc3,0x8a, +0xc5,0x8a,0xc4,0x4, 0xc0,0x3c,0xdc,0x35,0xda,0x35,0xdb,0xbb,0xc0,0x5, 0xc4,0x8c, +0xc6,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x32,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x34,0xd9,0xb4,0xdb,0xbb,0xc0,0x5, 0xc4,0x8b, +0xc6,0xb, 0xc4,0x4, 0xc0,0x3c,0xdc,0x36,0xdb,0x36,0xdc,0xbc,0xc0,0x4, 0xc3,0x89, +0xc4,0x88,0xc3,0x3, 0xc0,0x3d,0xdd,0x39,0xdc,0x39,0xdd,0xbd,0xc0,0x3, 0xc2,0x86, +0xc3,0x6, 0xc2,0x2, 0xc0,0x3e,0xde,0x3b,0xdd,0xbc,0xde,0xbe,0xc0,0x2, 0xc1,0x83, +0xc1,0x83,0xc1,0x1, 0xc0,0x3f,0xdf,0x3e,0xdf,0x3e,0xdf,0xbf,0xc0,0x0, 0xc0,0x81, +0xc0,0x80,0xc0,0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, +0x4, 0x1, 0x0, 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x2, 0x0, 0x2, 0x1, 0x2, 0x3, 0x2, +0x4, 0x3, 0x0, 0x3, 0x1, 0x3, 0x2, 0x3, 0x4, 0x4, 0x0, 0x4, 0x1, 0x4, 0x2, 0x4, +0x3, 0x0, 0x1, 0x2, 0x0, 0x1, 0x3, 0x0, 0x1, 0x4, 0x0, 0x2, 0x1, 0x0, 0x2, 0x3, +0x0, 0x2, 0x4, 0x0, 0x3, 0x1, 0x0, 0x3, 0x2, 0x0, 0x3, 0x4, 0x0, 0x4, 0x1, 0x0, +0x4, 0x2, 0x0, 0x4, 0x3, 0x1, 0x0, 0x2, 0x1, 0x0, 0x3, 0x1, 0x0, 0x4, 0x1, 0x2, +0x0, 0x1, 0x2, 0x3, 0x1, 0x2, 0x4, 0x1, 0x3, 0x0, 0x1, 0x3, 0x2, 0x1, 0x3, 0x4, +0x1, 0x4, 0x0, 0x1, 0x4, 0x2, 0x1, 0x4, 0x3, 0x2, 0x0, 0x1, 0x2, 0x0, 0x3, 0x2, +0x0, 0x4, 0x2, 0x1, 0x0, 0x2, 0x1, 0x3, 0x2, 0x1, 0x4, 0x2, 0x3, 0x0, 0x2, 0x3, +0x1, 0x2, 0x3, 0x4, 0x2, 0x4, 0x0, 0x2, 0x4, 0x1, 0x2, 0x4, 0x3, 0x3, 0x0, 0x1, +0x3, 0x0, 0x2, 0x3, 0x0, 0x4, 0x3, 0x1, 0x0, 0x3, 0x1, 0x2, 0x3, 0x1, 0x4, 0x3, +0x2, 0x0, 0x3, 0x2, 0x1, 0x3, 0x2, 0x4, 0x3, 0x4, 0x0, 0x3, 0x4, 0x1, 0x3, 0x4, +0x2, 0x4, 0x0, 0x1, 0x4, 0x0, 0x2, 0x4, 0x0, 0x3, 0x4, 0x1, 0x0, 0x4, 0x1, 0x2, +0x4, 0x1, 0x3, 0x4, 0x2, 0x0, 0x4, 0x2, 0x1, 0x4, 0x2, 0x3, 0x4, 0x3, 0x0, 0x4, +0x3, 0x1, 0x4, 0x3, 0x2, 0x12,0x11,0x10,0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, +0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0x0, 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x22,0x66,0x66,0x66, +0x66,0x66,0x66,0x66,0x66,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x12,0x0, 0x2, 0x3, 0x4, 0x6, 0x7, 0x8, 0xa, 0x0, 0x64,0x3, 0xfc,0x1, 0x18, +0x3, 0xfc,0x1, 0xd6,0x3, 0xfc,0x1, 0x5, 0x9, 0x7b,0x1, 0x7a,0xa, 0x79,0xeb,0x12, +0x16,0xf4,0x12,0x2f,0xf3,0xf5,0x31,0x12,0x67,0x32,0xf5,0x32,0x74,0x1, 0x12,0x66, +0xbf,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x2e,0xab,0x22,0xe5,0x24,0x24,0x58,0x12,0x64, +0x8f,0xed,0xf0,0x5, 0x2e,0xe5,0x2e,0xb4,0xe, 0xee,0xe4,0xf5,0x30,0xf5,0x2e,0xf1, +0x1, 0xff,0xc3,0x95,0x30,0x40,0x2, 0x8f,0x30,0x5, 0x2e,0xe5,0x2e,0xb4,0x13,0xef, +0xe5,0x30,0xc3,0x94,0xf, 0x50,0x9, 0xc3,0x74,0xf, 0x95,0x30,0xf5,0x30,0x80,0x3, +0xe4,0xf5,0x30,0xe4,0xf5,0x2e,0xab,0x22,0xe5,0x24,0x24,0x66,0x12,0x64,0x8f,0xed, +0xf0,0x5, 0x2e,0xe5,0x2e,0xb4,0x8, 0xee,0x85,0x30,0x2f,0xaf,0x2f,0x15,0x2f,0xef, +0x70,0x2, 0x21,0x80,0x12,0x0, 0x1e,0x12,0x37,0xa9,0x12,0x4e,0x61,0x12,0x2f,0x61, +0x12,0x27,0x3b,0x85,0x28,0x4b,0x85,0x29,0x4c,0x85,0x2a,0x4d,0xd1,0xfa,0x12,0x2f, +0xf9,0x60,0xf0,0xe4,0xf5,0x2e,0xd1,0xfa,0x12,0x67,0x68,0x9f,0x50,0x49,0xe4,0xfd, +0xf1,0xbb,0xff,0xed,0xc3,0x9f,0x50,0x3b,0xe5,0x2e,0x70,0xb, 0xf1,0xb0,0xe4,0xf0, +0xed,0x31,0xcb,0xe4,0xf0,0xa3,0xf0,0xd1,0x49,0xe5,0x2e,0x12,0x65,0xad,0x75,0xf0, +0x2, 0xed,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xae,0xf0,0x78,0x5, 0x12,0x58,0xf8,0xd8, +0xfb,0xff,0xed,0x31,0xcb,0xee,0x8f,0xf0,0x12,0x2, 0x60,0xf1,0xb0,0xe0,0x4, 0xf0, +0xd, 0x80,0xbd,0x5, 0x2e,0x80,0xaf,0xe4,0xf5,0x33,0xf5,0x2e,0xf1,0xbb,0xff,0xe5, +0x2e,0xc3,0x9f,0x40,0x2, 0x21,0x78,0x74,0x90,0x25,0x2e,0xf1,0xb3,0xe0,0xfd,0x70, +0x9, 0xe5,0x2e,0x31,0xcb,0x12,0x47,0x1f,0x80,0x3a,0xe5,0x2e,0x31,0xcb,0xc0,0x83, +0xc0,0x82,0xe0,0xfe,0xa3,0xe0,0xff,0x7c,0x0, 0x12,0x2, 0xb, 0xd0,0x82,0xd0,0x83, +0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x2e,0x31,0xcb,0xc0,0x83,0xc0,0x82,0xe0,0xfe,0xa3, +0xe0,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xd0,0x82,0xd0,0x83,0xee, +0xf0,0xa3,0xef,0xf0,0xf1,0x15,0x90,0x0, 0x73,0xd1,0x93,0x90,0x0, 0xe, 0xf1,0xa5, +0xe5,0x2e,0x31,0xcb,0xf1,0xea,0x9e,0x50,0x10,0xf1,0x1, 0xc3,0x95,0x30,0x50,0x5, +0xf1,0x1, 0x4, 0x80,0x2a,0x5, 0x33,0x80,0x3b,0xf1,0x15,0x90,0x0, 0x73,0xd1,0x93, +0x90,0x0, 0xe, 0x12,0x2, 0xb7,0x2f,0xff,0xe5,0xf0,0x3e,0xfe,0xe5,0x2e,0x31,0xcb, +0xf1,0xf2,0x9e,0x40,0x1d,0xf1,0x1, 0xd3,0x94,0x0, 0x40,0x12,0xf1,0x1, 0x14,0xf0, +0x12,0x4e,0x61,0xf1,0x1, 0xfd,0x85,0x2e,0x38,0x12,0x7, 0xf, 0x80,0x6, 0x5, 0x33, +0x80,0x2, 0x5, 0x33,0x5, 0x2e,0x1, 0xbc,0xf1,0xbb,0x65,0x33,0x60,0x2, 0x1, 0x3b, +0xe4,0xf5,0x2e,0x12,0x64,0xc0,0xe0,0xc4,0x54,0xf0,0xfd,0x74,0x74,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0xe0,0x54,0xf, 0x4d,0xff,0xab,0x22,0xe5,0x24,0x24,0x66, +0xf9,0xe4,0x35,0x23,0xfa,0xe5,0x2e,0x12,0x26,0x2b,0xef,0x12,0x1, 0xc5,0x5, 0x2e, +0xe5,0x2e,0xb4,0x8, 0xce,0xd1,0xfa,0xe5,0x31,0x12,0x66,0xbf,0xe5,0x32,0x12,0x1, +0xd7,0x7f,0x1, 0x22,0x12,0x4, 0xf2,0xe5,0x30,0x25,0xe0,0x25,0xe0,0x24,0x3c,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x12,0x20,0xed,0xe4,0x90,0xa, 0x50,0xf0,0x75, +0x2f,0x1, 0xf5,0x2b,0xd1,0xaf,0x74,0xff,0xf1,0xdc,0xd1,0xc0,0x74,0xff,0xf0,0xe5, +0x2b,0x31,0xcb,0x74,0xff,0xf0,0xa3,0xf0,0x74,0x4b,0x25,0x2b,0xd1,0xd0,0xe4,0xf0, +0x5, 0x2b,0xe5,0x2b,0xb4,0x5, 0xdd,0xd1,0x49,0x12,0x7, 0x7d,0x70,0x21,0x90,0x0, +0x42,0x12,0x1, 0x65,0x70,0x2, 0xa1,0xa0,0xe4,0xf5,0x2b,0xd1,0x49,0x90,0x0, 0x2d, +0xf1,0x8e,0xd1,0x49,0xf1,0x8b,0x5, 0x2b,0xe5,0x2b,0xb4,0x5, 0xee,0xa1,0xa0,0xd1, +0x49,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70,0x39,0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d, +0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, 0xa1,0xa0,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3, +0xd1,0x93,0xf1,0x9e,0xe5,0x2b,0xd1,0xa6,0x90,0x0, 0x2, 0x12,0x2, 0xb7,0xff,0xe5, +0x2b,0xd1,0x9a,0xf1,0xe2,0x74,0x4b,0x25,0x2b,0xd1,0xd0,0x74,0x1, 0xf0,0x5, 0x2b, +0x80,0xc9,0xe4,0xf5,0x2e,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xb4,0x1, 0xb, 0xe4,0xf5, +0x38,0x75,0x37,0x1, 0x75,0x2f,0x5, 0x61,0x12,0xef,0xb4,0x2, 0xb, 0x75,0x38,0x5, +0x75,0x37,0x2, 0x75,0x2f,0x14,0x80,0x7a,0xef,0xb4,0x3, 0xb, 0x75,0x38,0x2d,0x75, +0x37,0x3, 0x75,0x2f,0x3c,0x80,0x6b,0xef,0xd3,0x94,0x3, 0x40,0x65,0xe4,0xf5,0x2b, +0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x50,0x56,0xe4,0xf5,0x2c,0xd1, +0x49,0x90,0x0, 0x37,0x75,0xf0,0x2, 0xe5,0x2c,0xf1,0xc7,0x12,0x65,0xdf,0xc0,0x6, +0xc0,0x7, 0xd1,0x49,0xf1,0x9e,0xe5,0x2c,0xd1,0x90,0x75,0xf0,0x7, 0xe5,0x2b,0xd1, +0xe3,0xf1,0xa5,0x12,0x0, 0x6, 0xd0,0xe0,0x2f,0xff,0xd0,0xe0,0x3e,0xfe,0xe5,0x2b, +0x31,0xcb,0xf1,0xf2,0x9e,0x40,0xe, 0xd1,0xc0,0xe5,0x2c,0xf0,0xe5,0x2b,0x31,0xcb, +0xee,0xf0,0xa3,0xef,0xf0,0x5, 0x2c,0xe5,0x2c,0xc3,0x94,0x5, 0x40,0xb1,0x5, 0x2b, +0x80,0x9e,0x74,0xff,0xf5,0x3c,0xf5,0x3b,0xf5,0x3a,0xf5,0x39,0xf5,0x2d,0xd1,0x49, +0x12,0x7, 0x7d,0xff,0xd3,0x94,0x0, 0x50,0x2, 0x81,0x1f,0xef,0x94,0x4, 0x40,0x2, +0x81,0x1f,0xe5,0x2e,0xc3,0x95,0x2f,0x40,0x2, 0x81,0x1f,0xe4,0xf5,0x40,0xf5,0x3f, +0xf5,0x3e,0xf5,0x3d,0xe5,0x37,0xf5,0x82,0x75,0x83,0x0, 0x85,0x2e,0xf0,0x12,0x65, +0x38,0xaf,0x82,0x12,0x1, 0x26,0xe4,0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5, +0x2b,0xc3,0x9f,0x40,0x2, 0x61,0xf6,0xd1,0xea,0x75,0xf0,0x2, 0xd1,0x90,0xbe,0x7f, +0x1d,0xbf,0xff,0x1a,0xe5,0x40,0x24,0xff,0xf5,0x40,0xe5,0x3f,0x34,0xff,0xf5,0x3f, +0xe5,0x3e,0x34,0xff,0xf5,0x3e,0xe5,0x3d,0x34,0x3, 0xf5,0x3d,0x80,0x64,0xd1,0x49, +0xd1,0xea,0x75,0xf0,0x2, 0xd1,0x90,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3,0xf1,0xa5, +0x12,0x0, 0x6, 0x8e,0x30,0x8f,0x31,0xd1,0x49,0x90,0x0, 0x37,0xd1,0xed,0x75,0xf0, +0x2, 0xf1,0xc7,0x12,0x65,0xdf,0x8f,0x82,0x8e,0x83,0xe5,0x31,0xae,0x30,0x78,0x2, +0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x31,0x8e,0x30,0xe5,0x82,0xae,0x83,0x78, +0x2, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x82,0x8e,0x83,0xae,0x30,0xaf,0x31, +0xac,0x30,0xad,0x31,0x12,0x65,0x87,0xaf,0x82,0xae,0x83,0xad,0x82,0xac,0x83,0x12, +0x65,0x87,0x5, 0x2b,0x61,0x59,0xaf,0x40,0xae,0x3f,0xad,0x3e,0xac,0x3d,0xab,0x3c, +0xaa,0x3b,0xa9,0x3a,0xa8,0x39,0xd3,0x12,0x4, 0xbb,0x40,0xf, 0x85,0x40,0x3c,0x85, +0x3f,0x3b,0x85,0x3e,0x3a,0x85,0x3d,0x39,0x85,0x2e,0x2d,0x5, 0x2e,0x61,0x32,0xe5, +0x2d,0xf4,0x60,0x59,0xe5,0x37,0x85,0x2d,0xf0,0x12,0x65,0x38,0x7f,0x5, 0x12,0x1, +0x26,0xe4,0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, +0xa1,0x82,0xd1,0xed,0x24,0x4b,0xd1,0xd0,0x74,0x1, 0xf0,0x75,0xf0,0x7, 0xe5,0x2b, +0xd1,0xe3,0xd1,0x93,0xd1,0xea,0xd1,0xa3,0x90,0x0, 0x2, 0xd1,0x93,0xaa,0x29,0xa9, +0x2a,0x90,0x0, 0x37,0x74,0x32,0x25,0x2b,0x12,0x2a,0x94,0xee,0x8f,0xf0,0x12,0x3, +0x5b,0xd1,0xed,0xfd,0xd1,0xaf,0xed,0xf1,0xdc,0x5, 0x2b,0x80,0xb7,0xe4,0xf5,0x2b, +0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, 0xa1,0x2f,0x90,0xa, +0x50,0x74,0x1, 0xf0,0xe4,0xf5,0x2c,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2c,0xc3, +0x9f,0x50,0x31,0xe5,0x2b,0x65,0x2c,0x60,0x27,0x74,0x46,0x25,0x2c,0xd1,0xc4,0xe0, +0xff,0xd1,0xc0,0xe0,0xb5,0x7, 0x19,0xe5,0x2c,0x31,0xcb,0xe0,0xfe,0xa3,0xe0,0xff, +0xe5,0x2b,0x31,0xcb,0xf1,0xea,0x9e,0x40,0x7, 0xe4,0x90,0xa, 0x50,0xf0,0x80,0x4, +0x5, 0x2c,0x80,0xc3,0x90,0xa, 0x50,0xe0,0x64,0x1, 0x70,0x4f,0xd1,0xc0,0xe0,0x24, +0x4b,0xd1,0xd0,0x74,0x1, 0xf0,0xd1,0xc0,0xe0,0xfd,0xd1,0xaf,0x90,0x0, 0x4, 0xed, +0x12,0x1, 0xd7,0xd1,0x49,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3,0xd1,0x93,0xe9,0x24, +0x2d,0xf9,0xe4,0x3a,0xfa,0xd1,0xc0,0xe0,0x75,0xf0,0x2, 0xd1,0xe3,0xd1,0xa9,0x90, +0x0, 0x2, 0xd1,0x93,0xe5,0x2a,0x24,0x37,0xf9,0xe4,0x35,0x29,0xfa,0xd1,0xc0,0xe0, +0x75,0xf0,0x2, 0xd1,0xe3,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0x5, 0x2b,0x81,0x80,0xe4, +0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x50,0x44,0xf1,0xd0, +0xfa,0x12,0x1f,0x9, 0xf4,0x70,0x37,0xf5,0x2c,0xd1,0xcc,0xe0,0x70,0x28,0xd1,0xcc, +0x74,0x1, 0xf0,0xd1,0x49,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3,0xd1,0x93,0xf1,0x9e, +0xe5,0x2c,0xd1,0xa6,0x90,0x0, 0x2, 0x12,0x46,0x4d,0xd1,0x9a,0x90,0x0, 0x4, 0xe5, +0x2c,0x12,0x1, 0xd7,0x80,0x8, 0x5, 0x2c,0xe5,0x2c,0x64,0x5, 0x70,0xcb,0x5, 0x2b, +0x80,0xb0,0xe4,0xf5,0x2b,0x74,0x4b,0x25,0x2b,0xd1,0xd0,0xe0,0x70,0xb, 0xd1,0x49, +0x90,0x0, 0x2d,0xf1,0x8e,0xd1,0x49,0xf1,0x8b,0x5, 0x2b,0xe5,0x2b,0xb4,0x5, 0xe5, +0xd1,0x49,0x12,0x7, 0x7d,0xf5,0x2c,0xe4,0xf5,0x2b,0x74,0x4b,0x25,0x2b,0xd1,0xd0, +0xe0,0x64,0x1, 0x70,0x2e,0xab,0x28,0xe5,0x2a,0x24,0x28,0xf1,0x7c,0x12,0x1, 0x4c, +0xb4,0x1, 0x5, 0x74,0x3, 0x12,0x1, 0xc5,0x12,0x1, 0x4c,0xff,0xb4,0x3, 0xb, 0x12, +0x66,0xc9,0xe5,0x2b,0x12,0x26,0x2b,0xe4,0x80,0x32,0xef,0x70,0x32,0xf1,0x76,0x74, +0x2, 0x80,0x29,0xab,0x28,0xe5,0x2a,0x24,0x28,0xf1,0x7c,0x12,0x1, 0x4c,0xff,0x64, +0x2, 0x60,0x3, 0xef,0x70,0x12,0xf1,0x76,0x74,0x1, 0x12,0x1, 0xc5,0xaf,0x2c,0x5, +0x2c,0xef,0xd1,0xb1,0xf1,0xe2,0x80,0x7, 0xf1,0x76,0x74,0x3, 0x12,0x1, 0xc5,0x12, +0x66,0xc9,0xaf,0x2b,0x7e,0x0, 0x12,0x58,0xf1,0x12,0x1, 0x4c,0xfd,0xe5,0x2a,0x24, +0x28,0x12,0x58,0xec,0xed,0x12,0x1, 0xc5,0x5, 0x2b,0xe5,0x2b,0x64,0x5, 0x60,0x2, +0xa1,0xaa,0x22,0xef,0x25,0xe0,0xff,0xee,0x33,0xfe,0xe5,0x40,0x2f,0xf5,0x82,0xe5, +0x3f,0x3e,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xff,0xab,0x28,0xaa,0x29,0xa9,0x2a,0x22, +0xc3,0xee,0x94,0x0, 0x40,0x2, 0x80,0x3, 0xe4,0xfe,0xff,0x7d,0xc6,0x12,0x65,0xf, +0xe4,0x7f,0x1c,0x7e,0x2, 0x12,0x66,0x7f,0x40,0xb, 0xe4,0x75,0x35,0x1b,0x75,0x34, +0x2, 0xf5,0x33,0xf5,0x32,0xae,0x34,0xaf,0x35,0x22,0xab,0x22,0xaa,0x23,0xa9,0x24, +0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x29,0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5,0x28, +0x12,0x5, 0x40,0x12,0x2, 0xb7,0xff,0xae,0xf0,0x22,0xae,0xf0,0xaa,0x29,0xa9,0x2a, +0x90,0x0, 0x37,0x75,0xf0,0x2, 0x12,0x5, 0x40,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0xe5, +0x2b,0x75,0xf0,0x7, 0xa4,0xab,0x28,0x25,0x2a,0xf9,0xe5,0x29,0x35,0xf0,0xfa,0x22, +0x74,0x46,0x25,0x2b,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x74,0x4b,0x25,0x2c, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xab,0x2b,0xaa,0x2c,0xa9,0x2d,0x75,0xf0, +0x2, 0xe5,0x30,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x22,0x90,0x0, 0x2d,0x74,0x32,0x25, +0x2b,0xf8,0xe6,0x22,0x8b,0x22,0x8a,0x23,0x89,0x24,0xab,0x25,0xaa,0x26,0xa9,0x27, +0x22,0x74,0x74,0x25,0x2e,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0x7e,0x0, +0x7f,0x23,0x12,0x1, 0x26,0xab,0x22,0xaa,0x23,0xa9,0x24,0x22,0xd1,0xf4,0x12,0x4e, +0x82,0xf1,0x15,0x90,0x0, 0x41,0x12,0x1, 0xd7,0xab,0x25,0xe5,0x27,0x24,0xa, 0xf9, +0xe4,0x35,0x26,0xfa,0xa8,0x24,0xac,0x23,0xad,0x22,0xf1,0xe, 0x31,0xd7,0xf1,0x15, +0x90,0x0, 0x43,0x12,0x5, 0x6c,0x8b,0x2b,0x8a,0x2c,0x89,0x2d,0xf1,0x15,0x12,0x1c, +0xb1,0xe5,0x27,0x24,0xa, 0xf9,0xe4,0x35,0x26,0xa8,0x1, 0xfc,0xad,0x25,0xf1,0x15, +0xf1,0xe, 0x12,0x7, 0x7d,0x90,0x0, 0x42,0x12,0x1, 0xd7,0x12,0x7, 0x7d,0xd1,0xfa, +0x90,0x0, 0x2d,0x2, 0x1, 0xd7,0xab,0x28,0xe5,0x2a,0x24,0x23,0xf9,0xe4,0x35,0x29, +0xfa,0x7e,0x0, 0xe9,0x25,0x2b,0xf9,0xee,0x3a,0xfa,0x22,0x90,0x0, 0x37,0x75,0xf0, +0x2, 0xe5,0x2b,0x12,0x5, 0x40,0x74,0x7f,0x75,0xf0,0xff,0x2, 0x3, 0x5b,0x90,0x0, +0x2d,0x75,0xf0,0x2, 0x22,0x12,0x2, 0xb7,0xc3,0x9f,0xff,0xe5,0xf0,0x9e,0xfe,0x22, +0x74,0x90,0x2d,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xab,0x25,0xaa,0x26,0xa9, +0x27,0x90,0x0, 0x1, 0x2, 0x1, 0x65,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xfd,0xac,0xf0, +0xe5,0x2b,0x75,0xf0,0x7, 0xa4,0x29,0xf9,0xea,0x35,0xf0,0x22,0x90,0x0, 0x4, 0x2, +0x1, 0xd7,0x90,0x0, 0x4, 0xe5,0x2b,0x2, 0x1, 0xd7,0xe0,0xfc,0xa3,0xe0,0xc3,0x9f, +0xec,0x22,0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec,0x22,0xe5,0x92,0x60,0x4, 0xd2,0xae, +0xd2,0xbe,0x22,0xc3,0xee,0x94,0x0, 0x40,0x2, 0x80,0x3, 0xe4,0xfe,0xff,0x7d,0xd6, +0x12,0x65,0xf, 0xe4,0x7f,0xc0,0x7e,0x3, 0x12,0x66,0x7f,0x40,0xb, 0xe4,0x75,0x35, +0xbf,0x75,0x34,0x3, 0xf5,0x33,0xf5,0x32,0xae,0x34,0xaf,0x35,0x22,0x12,0x3f,0x4d, +0x12,0x16,0x49,0xf1,0xf7,0xf5,0x30,0xf1,0xaa,0xf5,0x31,0xe4,0xf5,0x2d,0xf1,0x35, +0x91,0x6a,0x12,0x11,0xcd,0x74,0x7f,0xf0,0xa3,0x91,0x6a,0x24,0x3e,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0x74,0x7f,0xf0,0xa3,0x74,0xff,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4, +0x5, 0xdc,0xe5,0x30,0x70,0x31,0xe5,0x31,0xd3,0x94,0x0, 0x50,0x2, 0x81,0x52,0xe4, +0xf5,0x2e,0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x2a,0x74,0xff,0x12,0x1, 0xd7,0x5, +0x2e,0xe5,0x2e,0xb4,0x5, 0xec,0xf1,0x89,0x44,0x4, 0x12,0x1, 0xc5,0x54,0xf7,0x12, +0x1, 0xc5,0x54,0xdf,0x2, 0x1, 0xc5,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x30,0x50, +0x2c,0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xfd,0xac,0xf0,0xab,0x22,0x25,0x24,0xf9,0xe5, +0x23,0x3c,0xfa,0xe9,0x24,0xa, 0x12,0x65,0x6e,0xab,0x22,0xe5,0x24,0x2d,0xf9,0xe5, +0x23,0x3c,0xfa,0xe9,0x24,0xc, 0x12,0x65,0x6e,0x5, 0x2e,0x80,0xcd,0xe5,0x31,0x70, +0x7, 0xf1,0x89,0x44,0x10,0x12,0x1, 0xc5,0xe4,0xf5,0x2d,0xf5,0x2e,0xe4,0xf5,0x2f, +0xe5,0x2f,0xc3,0x95,0x30,0x50,0x38,0x91,0x59,0xf1,0x15,0xe5,0x2e,0x12,0x16,0xb1, +0xf1,0xf, 0xff,0x6d,0x70,0x25,0xef,0xf4,0x60,0x21,0xf1,0x2e,0xef,0xf0,0x90,0x0, +0x26,0x12,0x16,0x93,0x91,0x6d,0x12,0x11,0xcd,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x0, +0x28,0x12,0x16,0x93,0x91,0x6d,0x12,0x66,0x16,0x80,0x4, 0x5, 0x2f,0x80,0xc1,0x5, +0x2e,0xe5,0x2e,0x64,0x5, 0x70,0xb6,0xe4,0xf5,0x2e,0x85,0x30,0x2f,0xe5,0x2f,0xc3, +0x94,0x5, 0x50,0x38,0x91,0x59,0xf1,0x15,0xe5,0x2e,0x12,0x16,0xb1,0xf1,0xf, 0xff, +0x6d,0x70,0x25,0xef,0xf4,0x60,0x21,0xf1,0x2e,0xef,0xf0,0x90,0x0, 0x26,0x12,0x16, +0x93,0x91,0x6d,0x12,0x11,0xcd,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x0, 0x28,0x12,0x16, +0x93,0x91,0x6d,0x12,0x66,0x16,0x80,0x4, 0x5, 0x2f,0x80,0xc1,0x5, 0x2e,0xe5,0x2e, +0x64,0x5, 0x70,0xb6,0xe4,0xf5,0x2f,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x2d,0x50, +0x15,0x91,0x59,0x90,0x0, 0xe, 0x12,0x1, 0x65,0xff,0xe5,0x2e,0xf1,0x37,0xe0,0x6f, +0x60,0x4, 0x5, 0x2e,0x80,0xe4,0xe5,0x2e,0x65,0x2d,0x70,0x1e,0xf1,0xcd,0xe5,0x2f, +0x12,0x17,0xd2,0xfa,0xc0,0x1, 0x91,0x6d,0x24,0x3c,0xf9,0x74,0xa, 0x35,0xf0,0xa8, +0x1, 0xfc,0x7d,0x1, 0xd0,0x1, 0xf1,0x5d,0x5, 0x2d,0x5, 0x2f,0xe5,0x2f,0x64,0x5, +0x70,0xb5,0xe5,0x2a,0x24,0x26,0xf9,0xe4,0x35,0x29,0x7f,0x23,0xf1,0xe7,0xe5,0x31, +0x70,0x20,0xf1,0xcd,0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x24,0x26,0xf9,0xe4,0x35,0x29, +0xa8,0x1, 0xfc,0xad,0x28,0xd0,0x1, 0xd0,0x2, 0x7e,0x0, 0x7f,0x23,0x12,0x1, 0x26, +0x61,0x91,0x12,0x16,0x49,0x12,0x3f,0xa, 0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x2, +0x61,0x91,0xe4,0xf5,0x2f,0xe5,0x2f,0xc3,0x95,0x30,0x40,0x2, 0x61,0x91,0xe4,0xf5, +0x2e,0x91,0x59,0xf1,0x15,0xe5,0x2e,0x12,0x16,0xb1,0xf1,0xf, 0x6d,0x60,0x7, 0x5, +0x2e,0xe5,0x2e,0xb4,0x5, 0xeb,0x91,0x59,0x90,0x0, 0xc, 0x12,0x16,0x93,0xc0,0x6, +0xc0,0x7, 0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x28,0x91,0x77,0xd0,0x7, 0xd0,0x6, +0xf1,0x1d,0xc0,0x6, 0xc0,0x7, 0x91,0x59,0x90,0x0, 0xa, 0x12,0x16,0x93,0xc0,0x6, +0xc0,0x7, 0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x26,0x91,0x77,0xd0,0x7, 0xd0,0x6, +0xf1,0x1d,0xd0,0xe0,0x2f,0xf5,0x2c,0xd0,0xe0,0x3e,0xf5,0x2b,0x12,0x16,0xfa,0x91, +0x74,0xae,0x4, 0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf1,0x6b,0x50,0x5, +0x75,0x2d,0x4, 0x80,0x37,0xed,0xae,0x4, 0x78,0x2, 0xce,0xc3,0x13,0xce,0x13,0xd8, +0xf9,0xf1,0x6b,0x50,0x5, 0x75,0x2d,0x3, 0x80,0x22,0x91,0x74,0xec,0xc3,0x13,0xfe, +0xed,0x13,0xf1,0x6b,0x50,0x5, 0x75,0x2d,0x2, 0x80,0x11,0xc3,0xe5,0x2c,0x9d,0xe5, +0x2b,0x9c,0x50,0x5, 0x75,0x2d,0x1, 0x80,0x3, 0xe4,0xf5,0x2d,0x91,0x59,0x90,0x0, +0xc, 0x12,0x16,0x93,0xbe,0x4b,0x6, 0xbf,0xf0,0x3, 0xe4,0xf5,0x2d,0xe5,0x2e,0x12, +0x16,0xb1,0x90,0x0, 0x28,0x12,0x16,0x93,0xbe,0x4b,0x6, 0xbf,0xf0,0x3, 0xe4,0xf5, +0x2d,0x91,0x59,0x90,0x0, 0xa, 0x12,0x16,0x93,0xc0,0x6, 0xc0,0x7, 0xe5,0x2e,0x12, +0x16,0xb1,0x90,0x0, 0x26,0x91,0x77,0xd0,0x7, 0xd0,0x6, 0xf1,0x7d,0x80,0x5, 0xce, +0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2c,0x8e,0x2b,0xe5,0x2e,0x12,0x16,0xb1,0x90, +0x0, 0x26,0x91,0x53,0x90,0x0, 0xa, 0xf1,0xd9,0x40,0x10,0x12,0x16,0xb4,0x90,0x0, +0x26,0xe5,0x2b,0x85,0x2c,0xf0,0x12,0x2, 0xef,0x80,0xc, 0x12,0x16,0xb4,0xe9,0x24, +0x26,0x12,0x65,0xfb,0x12,0x3, 0x3c,0x91,0x59,0x90,0x0, 0xc, 0x12,0x16,0x93,0xc0, +0x6, 0xc0,0x7, 0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x28,0x91,0x77,0xd0,0x7, 0xd0, +0x6, 0xf1,0x7d,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2c,0x8e,0x2b, +0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x28,0x91,0x53,0x90,0x0, 0xc, 0xf1,0xd9,0x40, +0x10,0x12,0x16,0xb4,0x90,0x0, 0x28,0xe5,0x2b,0x85,0x2c,0xf0,0x12,0x2, 0xef,0x80, +0xc, 0x12,0x16,0xb4,0xe9,0x24,0x28,0x12,0x65,0xfb,0x12,0x3, 0x3c,0x5, 0x2f,0x41, +0x5, 0xe4,0xf5,0x2f,0xe5,0x2f,0x12,0x16,0xb1,0x90,0x0, 0x26,0x12,0x2, 0xb7,0x90, +0x0, 0xa, 0x91,0x7e,0x90,0x0, 0x28,0x12,0x2, 0xb7,0x90,0x0, 0xc, 0x91,0x7e,0xf1, +0xf, 0xfd,0xf1,0x9f,0x90,0x0, 0xe, 0xed,0x12,0x1, 0xd7,0x5, 0x2f,0xe5,0x2f,0x64, +0x5, 0x70,0xd1,0xf1,0x89,0x44,0x1, 0x12,0x1, 0xc5,0xe5,0x30,0xd3,0x94,0x0, 0x50, +0x2, 0x81,0x52,0xe4,0xf5,0x2f,0x91,0x59,0x90,0x0, 0xc, 0x12,0x2, 0xb7,0xd3,0x94, +0x7f,0xe5,0xf0,0x94,0x4, 0x50,0x39,0x90,0x0, 0xa, 0x12,0x16,0x93,0x12,0x16,0x50, +0xac,0x6, 0xad,0x7, 0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x28,0x25, +0x2a,0xf9,0xe5,0x29,0x3e,0xfa,0xec,0xf1,0x97,0x90,0x0, 0xc, 0x12,0x16,0x93,0x11, +0x3, 0xac,0x6, 0xad,0x7, 0xe5,0x2f,0x12,0x16,0xb1,0x90,0x0, 0x5, 0xec,0x80,0x1e, +0x12,0x65,0xcc,0x90,0x0, 0xa, 0x12,0x2, 0xb7,0xfd,0x91,0xa6,0xe5,0xf0,0xf1,0x97, +0x90,0x0, 0xc, 0x12,0x2, 0xb7,0xfd,0x91,0xa6,0x90,0x0, 0x5, 0xe5,0xf0,0x8d,0xf0, +0x12,0x3, 0x5b,0x12,0x65,0xcc,0xf1,0x15,0x91,0xa6,0xed,0x12,0x46,0xe2,0xf1,0xb0, +0x40,0x84,0x22,0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0xab, +0x22,0x25,0x24,0xf9,0xe5,0x23,0x35,0xf0,0xfa,0x22,0x74,0xff,0xf0,0xe5,0x2d,0x75, +0xf0,0x7, 0xa4,0x22,0x90,0x0, 0x1, 0x12,0x2, 0xb7,0xfd,0xac,0xf0,0x22,0xff,0xe5, +0xf0,0xc4,0xf8,0x54,0xf0,0xc8,0x68,0xfc,0xef,0xc4,0x54,0xf, 0x48,0xfd,0xe5,0x2f, +0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x22,0x25,0x24,0xf9,0xe5,0x23,0x3e,0xfa, +0xec,0x8d,0xf0,0x12,0x3, 0x5b,0xab,0x28,0xe5,0x2a,0x2f,0xf9,0xe5,0x29,0x3e,0xfa, +0x22,0x12,0x20,0xed,0xe4,0xf5,0x30,0xf5,0x31,0x12,0x7, 0x7d,0xf5,0x32,0x70,0x43, +0xf5,0x2e,0xe5,0x2e,0xfd,0x33,0x95,0xe0,0xfc,0x12,0x46,0xf7,0x74,0xcf,0x2f,0xf5, +0x82,0x74,0xa, 0x12,0x67,0x60,0x90,0xa, 0xb0,0x75,0xf0,0x7, 0xed,0x12,0x5, 0x40, +0xec,0x75,0xf0,0x7, 0xa4,0x25,0x83,0xf5,0x83,0x74,0xff,0xf0,0xf1,0x64,0xfe,0x74, +0xd9,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x74,0x2, 0xf0,0x5, 0x2e,0xe5,0x2e, +0xb4,0x5, 0xbf,0xe4,0xf5,0x2e,0x12,0x16,0x49,0x12,0x7, 0x7d,0xfd,0xf1,0x64,0xfe, +0xc3,0xef,0x9d,0x74,0x80,0xf8,0x6e,0x98,0x40,0x2, 0xc1,0xc4,0xd1,0xf2,0x12,0x37, +0x3a,0xf1,0x9, 0xff,0xf4,0x70,0x2, 0xc1,0xc0,0x12,0x58,0xe6,0x12,0x1, 0x4c,0x60, +0x6, 0x64,0x2, 0x60,0x2, 0xc1,0xc0,0xe4,0xf5,0x2f,0xd1,0xeb,0x91,0xa6,0xf1,0x9, +0xff,0xd1,0xdf,0x34,0xa, 0xf5,0x83,0xe0,0x6f,0x60,0x2, 0xc1,0xba,0x90,0x0, 0x2, +0x12,0x16,0x93,0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0x24,0xae,0xf5,0x82,0xe4,0x34,0xa, +0xf1,0x56,0xf1,0x74,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0x12,0x16,0x49,0xf1,0x64, +0x8f,0x82,0xf5,0x83,0x74,0x7, 0x12,0x5, 0x2f,0x12,0x16,0x93,0xe5,0x2f,0x75,0xf0, +0x7, 0xa4,0x24,0xac,0xf5,0x82,0xe4,0x34,0xa, 0xf1,0x56,0xf1,0x74,0x12,0x0, 0x6, +0xd0,0xe0,0x2f,0xf5,0x31,0xd0,0xe0,0x3e,0xf5,0x30,0xd1,0xdf,0x34,0xa, 0xf5,0x83, +0xe0,0xff,0xf1,0xc2,0xd3,0x94,0x0, 0x40,0x12,0xef,0xd1,0xff,0xf1,0xb8,0xd1,0xdf, +0x34,0xa, 0xf5,0x83,0xe0,0xf1,0xc2,0x14,0xf0,0xc1,0xc0,0xd1,0xdf,0xd1,0xf9,0xf1, +0x56,0xfd,0xd3,0x94,0x64,0xec,0x94,0x0, 0x40,0xd, 0xd3,0xe5,0x31,0x94,0x64,0xe5, +0x30,0x94,0x0, 0x40,0x2, 0x80,0x1e,0xed,0x24,0x32,0xff,0xe4,0x3c,0xfe,0xd3,0xe5, +0x31,0x9f,0xe5,0x30,0x9e,0x40,0x11,0xd1,0xdf,0xd1,0xf9,0xf1,0x56,0xd3,0x94,0x32, +0xec,0x94,0x0, 0x40,0x3, 0xef,0xc1,0xb4,0xd1,0xdf,0x34,0xa, 0xf5,0x83,0xe0,0xfd, +0xd1,0xff,0xf5,0x83,0xa3,0xe0,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xff,0x5, 0x82,0xd5, +0x82,0x2, 0x15,0x83,0x15,0x82,0xe0,0xc4,0x54,0xf0,0x48,0xfe,0xc3,0xe5,0x31,0x9f, +0xe5,0x30,0x9e,0x50,0x3, 0xed,0xc1,0xb4,0x12,0x4e,0x61,0x90,0x0, 0x4, 0x12,0x2, +0xb7,0xff,0xd3,0xe5,0x31,0x9f,0xe5,0x30,0x95,0xf0,0x40,0x71,0xd1,0xeb,0x91,0xa6, +0xf1,0x9, 0xff,0x12,0x58,0xe6,0x12,0x1, 0x4c,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74, +0x1, 0x12,0x1, 0xc5,0xd1,0xeb,0x91,0xa6,0xf1,0x9, 0xfd,0xe5,0x2a,0x24,0x28,0xf9, +0xe4,0x35,0x29,0x12,0x59,0x71,0x91,0xa6,0x78,0x3c,0x7c,0xa, 0x7d,0x1, 0xf1,0x5d, +0xe5,0x32,0xd3,0x94,0x0, 0x40,0x36,0x15,0x32,0xe5,0x32,0x12,0x16,0xb1,0xc0,0x3, +0xc0,0x2, 0xc0,0x1, 0xd1,0xeb,0xe5,0x2a,0x2f,0xf9,0xe5,0x29,0x3e,0xa8,0x1, 0xfc, +0xad,0x3, 0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xf1,0x5d,0xe5,0x32,0x75,0xf0,0x7, 0xa4, +0x25,0x2a,0xf9,0xe5,0x29,0x35,0xf0,0x7f,0x7, 0xf1,0xe7,0x15,0x2e,0xd1,0xdf,0x34, +0xa, 0xf5,0x83,0xe0,0xd1,0xff,0xf1,0xb8,0x80,0x6, 0xf1,0xb0,0x50,0x2, 0xa1,0x3a, +0x5, 0x2e,0xa1,0x6, 0x12,0x16,0x49,0x90,0x0, 0x41,0xe5,0x32,0x12,0x1, 0xd7,0x78, +0xac,0x7c,0xa, 0x7d,0x1, 0x12,0x16,0x49,0x7e,0x0, 0x7f,0x23,0x2, 0x1, 0x26,0xe5, +0x2f,0x75,0xf0,0x7, 0xa4,0x24,0xb0,0xf5,0x82,0xe4,0x22,0xaf,0x2e,0xef,0x33,0x95, +0xe0,0xfe,0x7c,0x0, 0x7d,0x7, 0x2, 0x1, 0xf9,0x34,0xa, 0xf5,0x83,0xe0,0xff,0x25, +0xe0,0x24,0xcf,0xf5,0x82,0xe4,0x34,0xa, 0x22,0x90,0x0, 0x4, 0x2, 0x1, 0x65,0x90, +0x0, 0x2a,0x2, 0x1, 0x65,0x90,0x0, 0xe, 0x12,0x1, 0x65,0xfd,0x22,0xd3,0xef,0x9d, +0xee,0x9c,0x40,0x2, 0x80,0x50,0xc3,0xed,0x9f,0xff,0xec,0x9e,0xfe,0x22,0x90,0x0, +0x2a,0x12,0x1, 0x65,0xff,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0x24,0x40,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0x22,0xe5,0x2e,0x25,0xe0,0xff,0xe5,0x2d,0x33,0xfe,0xe5,0x32, +0x2f,0xf5,0x82,0xe5,0x31,0x3e,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0x22,0x7e,0x0, 0x7f, +0x7, 0x2, 0x1, 0x26,0xaf,0x2e,0xef,0x33,0x95,0xe0,0x22,0xff,0xc3,0xe5,0x2c,0x9f, +0xe5,0x2b,0x9e,0x22,0xfd,0xc3,0xef,0x9d,0xff,0xee,0x9c,0xfe,0x22,0xf1,0x1d,0x8e, +0x2b,0x8f,0x2c,0xe5,0x2c,0xa8,0x2d,0x8, 0x22,0xab,0x28,0xe5,0x2a,0x24,0x4f,0xf9, +0xe4,0x35,0x29,0xfa,0x2, 0x1, 0x4c,0x90,0x0, 0x3, 0x8d,0xf0,0x12,0x3, 0x5b,0xab, +0x22,0xe5,0x24,0x2f,0xf9,0xe5,0x23,0x3e,0xfa,0x22,0x90,0x0, 0x4c,0x2, 0x1, 0x65, +0x5, 0x2f,0xe5,0x2f,0xc3,0x94,0x5, 0x22,0xf5,0x83,0xe5,0x30,0xf0,0xa3,0xe5,0x31, +0xf0,0x22,0x24,0xd9,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0xab,0x22,0xe5, +0x24,0x24,0xa, 0xf9,0xe4,0x35,0x23,0xfa,0x22,0x12,0x2, 0xb7,0xd3,0x9d,0xe5,0xf0, +0x9c,0xe5,0x2e,0x75,0xf0,0x7, 0x22,0xa8,0x1, 0xfc,0xad,0x28,0x7b,0x1, 0x7a,0xa, +0x79,0x3c,0x7e,0x0, 0x2, 0x1, 0x26,0x90,0x0, 0x4b,0x2, 0x1, 0x65,0x8e,0x26,0x8f, +0x27,0x11,0xed,0xc3,0xe5,0x26,0x94,0x0, 0x50,0x5, 0xe4,0xf5,0x26,0xf5,0x27,0xc3, +0xec,0x94,0x0, 0x50,0x3, 0xe4,0xfc,0xfd,0xd3,0xe5,0x27,0x94,0x3f,0xe5,0x26,0x94, +0x0, 0x50,0x12,0xe5,0x27,0x25,0xe0,0xff,0xe5,0x26,0x11,0xd5,0x50,0x39,0xe4,0xf5, +0x2b,0xf5,0x2c,0x80,0x32,0xc3,0xe5,0x27,0x94,0x80,0xe5,0x26,0x94,0x2, 0x40,0x2d, +0xe5,0x27,0x24,0x80,0xff,0xe5,0x26,0x34,0xfd,0xfe,0xe5,0x27,0x2f,0xf5,0x2c,0xe5, +0x26,0x3e,0xf5,0x2b,0xd3,0xe5,0x2c,0x94,0xbd,0xe5,0x2b,0x64,0x80,0x94,0x82,0x40, +0x6, 0x75,0x2b,0x2, 0x75,0x2c,0xbf,0x85,0x2b,0x26,0x85,0x2c,0x27,0xd3,0xed,0x94, +0x3f,0xec,0x94,0x0, 0x50,0x10,0xed,0x25,0xe0,0xff,0xec,0x11,0xd5,0x50,0x32,0xe4, +0xf5,0x2b,0xf5,0x2c,0x80,0x2b,0xc3,0xed,0x94,0x40,0xec,0x94,0x4, 0x40,0x26,0xed, +0x24,0xc0,0xff,0xec,0x34,0xfb,0xcf,0x2d,0xf5,0x2c,0xef,0x3c,0xf5,0x2b,0xd3,0xe5, +0x2c,0x94,0x7d,0xe5,0x2b,0x64,0x80,0x94,0x84,0x40,0x6, 0x75,0x2b,0x4, 0x75,0x2c, +0x7f,0xac,0x2b,0xad,0x2c,0x12,0x16,0x49,0xe5,0x26,0x85,0x27,0xf0,0x12,0x3, 0x3c, +0xab,0x28,0x74,0x2, 0x25,0x2a,0xf9,0xf5,0x2a,0xe4,0x35,0x29,0xfa,0xf5,0x29,0xec, +0x8d,0xf0,0x2, 0x3, 0x3c,0x33,0xfe,0xef,0x24,0xc1,0xf5,0x2c,0xee,0x34,0xff,0xf5, +0x2b,0xc3,0xe5,0x2c,0x94,0x2, 0xe5,0x2b,0x64,0x80,0x94,0x80,0x22,0x8b,0x28,0x8a, +0x29,0x89,0x2a,0x22,0x12,0x3f,0x4d,0xe4,0xf5,0x25,0x12,0x17,0x15,0x12,0x4e,0x82, +0xff,0xe5,0x25,0xc3,0x9f,0x50,0x20,0xe5,0x25,0x12,0x17,0xd2,0xfa,0x90,0x0, 0xa, +0x12,0x16,0x93,0x90,0x0, 0xc, 0x12,0x1c,0x77,0xe9,0x24,0xa, 0xf9,0xe4,0x3a,0xfa, +0x12,0x1f,0xfd,0x5, 0x25,0x80,0xd3,0x22,0x12,0x65,0xf0,0x74,0x60,0x12,0x65,0x53, +0x12,0x42,0x48,0xf1,0x1e,0x12,0x34,0x35,0x75,0x36,0x1, 0x75,0x37,0x8, 0x75,0x38, +0xc5,0x91,0xe3,0x12,0x36,0x9b,0x7b,0x1, 0x7a,0x9, 0x79,0xdf,0x12,0x59,0x14,0xe4, +0x90,0xc, 0xef,0xf0,0x7b,0x1, 0x7a,0x9, 0x79,0x3b,0x12,0x30,0xfe,0x90,0xc, 0x31, +0x74,0xa, 0xf0,0x90,0xc, 0x31,0xe0,0x70,0xfa,0x12,0x35,0xaf,0x7b,0x1, 0x7a,0x9, +0x79,0x5e,0xd1,0x33,0x7b,0x1, 0x7a,0x9, 0x79,0x5e,0xf1,0x39,0x90,0xb, 0x5e,0x74, +0x3, 0xf0,0x74,0xe8,0xf1,0x57,0x75,0x2c,0x9, 0x75,0x2d,0x3b,0x12,0xf, 0xc9,0x7e, +0x0, 0x7f,0x83,0x12,0x4f,0xe8,0xb1,0x5, 0x12,0x4f,0x54,0x12,0x37,0xaf,0x90,0xa, +0xde,0xf0,0xa3,0x74,0x64,0xf0,0x75,0x36,0x1, 0x75,0x37,0x0, 0x75,0x38,0x83,0xf1, +0x1e,0xf1,0xcb,0xe4,0x90,0x0, 0x52,0xf0,0xa3,0x4, 0x12,0x67,0x56,0x12,0x5a,0x8d, +0xe4,0x90,0xa, 0xe6,0xf0,0xa3,0xf0,0x7b,0x1, 0x7a,0xa, 0x79,0x2b,0x12,0x3f,0x6b, +0x90,0xc, 0x59,0xe0,0x64,0x1, 0x60,0x2, 0x81,0x9f,0x12,0x37,0xb0,0x90,0xa, 0xde, +0xf0,0x74,0x64,0x12,0x65,0x53,0x12,0x43,0xae,0xe4,0xf5,0xa, 0xf5,0x9, 0x90,0xc, +0x57,0xe0,0x70,0x5, 0x90,0x8, 0x2c,0x80,0x3, 0x90,0x8, 0x2e,0xe0,0xf5,0xb, 0x90, +0xc, 0x52,0xe0,0xf4,0x60,0x17,0x7e,0x0, 0x7f,0x0, 0x7c,0x9, 0x7d,0x3b,0x7a,0x0, +0x7b,0x83,0x75,0x28,0x9, 0x75,0x29,0x5e,0xf1,0x6f,0x12,0x46,0xe8,0xf1,0x15,0x12, +0x2f,0xf9,0x60,0xf9,0x90,0x8, 0x28,0xe0,0x90,0xc, 0x5b,0xf0,0x90,0x8, 0x32,0xe0, +0xb4,0x1, 0x5, 0xe4,0xff,0x12,0x37,0x84,0xb1,0x5, 0x12,0x52,0xa9,0x91,0xea,0x12, +0x5a,0xeb,0xf1,0x59,0x75,0x2c,0x9, 0x75,0x2d,0x18,0x91,0xe3,0x12,0x54,0x69,0x90, +0x8, 0x27,0xe0,0x90,0xc, 0x35,0xf0,0x90,0x8, 0x20,0xe0,0x90,0xc, 0x36,0xf0,0x75, +0x25,0x1, 0x75,0x26,0x9, 0x75,0x27,0x18,0xf1,0x62,0x75,0x2c,0xa, 0x75,0x2d,0x2b, +0x91,0xe3,0x12,0x57,0x8a,0x90,0x8, 0x20,0xe0,0x64,0x6, 0x70,0x42,0x12,0x5a,0x94, +0x40,0x20,0x75,0x34,0x1, 0x75,0x35,0x0, 0x75,0x36,0x83,0x75,0x37,0x1, 0x75,0x38, +0x9, 0x75,0x39,0x18,0x75,0x3a,0x1, 0x75,0x3b,0x0, 0x75,0x3c,0x0, 0x91,0xe3,0x12, +0x2a,0x9c,0x12,0x67,0x4c,0x12,0x66,0xb2,0x75,0x2c,0x8, 0x75,0x2d,0x33,0xf1,0x32, +0x12,0x4e,0xd0,0x90,0x8, 0x62,0xe0,0x30,0xe0,0x5, 0xe4,0x90,0x8, 0x20,0xf0,0x90, +0x8, 0x27,0xe0,0x70,0x10,0x90,0x8, 0x20,0xe0,0xb4,0x4, 0x9, 0x90,0xa, 0xe6,0xe4, +0xf0,0xa3,0x74,0xa, 0xf0,0xd3,0x90,0xa, 0xe7,0xe0,0x94,0x0, 0x90,0xa, 0xe6,0xe0, +0x94,0x0, 0x40,0x12,0xa3,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xe6,0xe0,0x34,0xff,0xf0, +0x90,0x8, 0x20,0x74,0x4, 0xf0,0x12,0x66,0x48,0xb1,0x5, 0x12,0x51,0x48,0x90,0x9, +0x15,0xef,0xf0,0x90,0x0, 0x0, 0xe0,0x14,0xf0,0x90,0xa, 0x2b,0xe0,0xb4,0x1, 0x11, +0x90,0xa, 0x2f,0xe0,0xff,0x90,0x8, 0x60,0xe0,0xfe,0xc3,0x9f,0x40,0x3, 0xee,0x9f, +0xf0,0x91,0xea,0x12,0x48,0xa3,0x91,0xe3,0x11,0xf4,0x90,0x0, 0x0, 0xe0,0x4, 0xf0, +0x90,0xa, 0x2b,0xe0,0x64,0x1, 0x70,0x52,0xf5,0x21,0x90,0xa, 0x2f,0xe0,0xff,0xe5, +0x21,0xc3,0x9f,0x50,0x3f,0x74,0x2c,0x25,0x21,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83, +0xe0,0xfd,0x90,0x8, 0x60,0xe0,0x25,0x21,0xfe,0x75,0xf0,0x7, 0xa4,0x24,0x3d,0xf5, +0x82,0xe4,0x34,0x8, 0xf5,0x83,0xe4,0xf0,0xa3,0xed,0xf0,0xee,0x75,0xf0,0x7, 0xa4, +0x24,0x3f,0xf5,0x82,0xe4,0x34,0x8, 0xf5,0x83,0x74,0x4, 0xf0,0xa3,0x74,0xbf,0xf0, +0x5, 0x21,0x80,0xb6,0x90,0x8, 0x60,0xe0,0x2f,0xf0,0x90,0x8, 0x20,0xe0,0xb4,0x6, +0xe, 0x90,0x8, 0x60,0xe0,0xd3,0x94,0x1, 0x40,0x5, 0xe4,0x90,0x8, 0x20,0xf0,0x12, +0x67,0x4c,0x75,0x28,0x1, 0x75,0x29,0x9, 0x75,0x2a,0x18,0xf1,0x1e,0x12,0x55,0xb5, +0x90,0x8, 0x27,0xe0,0x70,0xf, 0x90,0x8, 0x61,0xe0,0xff,0x90,0x8, 0x60,0xe0,0xd3, +0x9f,0x40,0xa, 0x80,0x0, 0x12,0x66,0x48,0xb1,0x5, 0x12,0x45,0x3c,0x90,0x8, 0x60, +0xe0,0xa3,0xf0,0x90,0x9, 0x10,0xf0,0xf1,0x32,0x91,0xa5,0x90,0x9, 0x10,0xe0,0x90, +0x8, 0x60,0xf0,0x90,0xa, 0x22,0x74,0x1, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0x74,0x25, +0xf0,0x12,0x66,0x48,0x7b,0x1, 0x7a,0x9, 0x79,0xdf,0x12,0x17,0x1c,0x90,0x8, 0xc5, +0x74,0x1, 0xf0,0xa3,0x74,0x9, 0xf0,0xa3,0x74,0xdf,0xf0,0x90,0x8, 0x60,0xe0,0x90, +0x9, 0x10,0xf0,0x12,0x67,0x42,0x75,0x28,0x1, 0x75,0x29,0x8, 0x75,0x2a,0xc5,0x91, +0xe3,0x12,0x18,0x2d,0xe4,0xf5,0x21,0x12,0x66,0xa4,0x12,0x55,0xae,0x64,0xbf,0x70, +0x3, 0xee,0x64,0x4, 0x70,0x37,0x12,0x66,0x38,0xa3,0xe0,0xff,0x25,0xe0,0x25,0xe0, +0x24,0x30,0xf5,0x82,0xe4,0x34,0xa, 0x12,0x1f,0x56,0xfd,0x12,0x66,0x38,0xec,0xf0, +0xa3,0xed,0xf0,0xef,0x25,0xe0,0x25,0xe0,0x24,0x32,0xf5,0x82,0xe4,0x34,0xa, 0x12, +0x55,0xae,0xff,0x12,0x66,0xa4,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x5, 0x21,0xe5, +0x21,0x64,0x5, 0x70,0xb2,0x12,0x67,0x42,0xf1,0x32,0x12,0x3d,0x41,0x75,0x25,0x1, +0x75,0x26,0x8, 0x75,0x27,0x29,0x12,0x66,0xb2,0x75,0x2c,0x0, 0x75,0x2d,0x83,0x75, +0x2e,0x1, 0x75,0x2f,0x8, 0x75,0x30,0x33,0xf1,0x32,0x12,0x50,0x1a,0x21,0xd0,0x12, +0x30,0xdd,0x2, 0x0, 0x21,0x12,0x1f,0xaa,0xff,0xd3,0x94,0x0, 0x50,0x34,0x12,0x1f, +0xf7,0xd3,0x9f,0x40,0x1d,0x90,0x0, 0x50,0x12,0x1, 0x65,0xff,0x90,0xc, 0xef,0xe0, +0xc3,0x9f,0x50,0x13,0xe0,0x4, 0xf0,0x12,0x1f,0xaa,0x90,0x0, 0x4b,0x12,0x1, 0xd7, +0x80,0x5, 0xe4,0x90,0xc, 0xef,0xf0,0x12,0x1f,0xf7,0x70,0x6, 0xe9,0x24,0x4f,0x12, +0x3f,0x5f,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0x33,0x22,0x75,0x25,0x1, 0x75,0x26,0x0, +0x75,0x27,0x0, 0x75,0x28,0x1, 0x75,0x29,0x9, 0x75,0x2a,0x18,0x75,0x2b,0x1, 0x75, +0x2c,0x8, 0x75,0x2d,0x33,0x7b,0x1, 0x7a,0x0, 0x79,0x83,0x22,0x12,0x37,0xa2,0xe4, +0xf5,0x2d,0xd1,0x16,0x85,0x2d,0x82,0x12,0x63,0xd9,0xfd,0xaf,0x2d,0x12,0x0, 0x4e, +0xe5,0x2d,0x24,0x1c,0x12,0x67,0x80,0xd1,0x24,0x12,0x67,0x1e,0x24,0x38,0xd1,0x1d, +0x12,0x67,0x1e,0x24,0x54,0x12,0x67,0x78,0xd1,0x24,0xf1,0x25,0x94,0x1c,0x40,0xd2, +0xd1,0x16,0x90,0x0, 0x70,0x12,0x1, 0x65,0xfd,0x7f,0x7e,0x12,0x0, 0x4e,0xd1,0x16, +0x90,0x0, 0x71,0x12,0x1, 0x65,0xfd,0x7f,0x7f,0x12,0x0, 0x4e,0xd1,0x16,0x90,0x0, +0x73,0x12,0x1, 0x65,0xfd,0x7f,0x81,0x12,0x0, 0x4e,0xd1,0x16,0x90,0x0, 0x74,0x12, +0x1, 0x65,0x7f,0x82,0x12,0x67,0x70,0xe5,0x2d,0x24,0x83,0xff,0xab,0x2a,0xe5,0x2c, +0x24,0x75,0xd1,0x24,0xf1,0x25,0x94,0x4, 0x40,0xed,0xe4,0xf5,0x2d,0xe5,0x2d,0x24, +0x87,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x79,0xd1,0x24,0xf1,0x25,0x94,0x2, 0x40,0xed, +0xd1,0x16,0x90,0x0, 0x7b,0x12,0x1, 0x65,0xfd,0x7f,0x89,0x12,0x0, 0x4e,0xd1,0x16, +0x90,0x0, 0x7c,0x12,0x1, 0x65,0x7f,0x8c,0x12,0x67,0x70,0xe5,0x2d,0x24,0x8d,0xff, +0xab,0x2a,0xe5,0x2c,0x24,0x7d,0xd1,0x24,0xf1,0x25,0x94,0x3, 0x40,0xed,0xd1,0x16, +0x12,0x2d,0x9a,0xfd,0x7f,0x90,0x2, 0x0, 0x4e,0x12,0x36,0x0, 0x12,0x65,0xf0,0xa3, +0x74,0x60,0xf0,0xf1,0x1e,0x12,0x34,0x35,0x12,0x32,0x4, 0xb1,0xc, 0x53,0xdb,0xf0, +0xf1,0x3b,0x90,0xb, 0x5e,0x74,0x1, 0xf0,0x74,0x2c,0xf1,0x57,0x75,0x2c,0x8, 0x75, +0x2d,0x29,0x12,0xf, 0xc9,0x12,0x30,0xdd,0x12,0x5a,0x8d,0x90,0xc, 0xac,0xe0,0x54, +0x8f,0xf0,0x22,0x12,0x47,0xb2,0xab,0x2a,0xaa,0x2b,0xa9,0x2c,0x22,0xff,0xab,0x2a, +0xe5,0x2c,0x24,0x38,0xf9,0xe4,0x35,0x2b,0xfa,0xe5,0x2d,0x7c,0x0, 0x29,0xf9,0xec, +0x3a,0xfa,0x22,0x12,0x37,0xa2,0x78,0x2e,0x7c,0x0, 0x7d,0x0, 0x7b,0xff,0x7a,0xf, +0x79,0x95,0x7e,0x0, 0x7f,0x1c,0x12,0x1, 0x26,0xe4,0xf5,0x2d,0xf1,0x4b,0xe0,0xff, +0xc3,0x94,0x1c,0x50,0x53,0x12,0x47,0x5a,0xe0,0xd1,0x16,0x8f,0x82,0x75,0x83,0x0, +0x12,0x1, 0xd7,0xe5,0x2d,0x20,0xe0,0xf, 0x12,0x41,0x69,0xe0,0x54,0xf, 0xff,0xe9, +0x24,0x1c,0xf9,0xe4,0x3a,0x80,0x10,0xe5,0x2d,0x12,0x41,0x69,0xe0,0xc4,0x54,0xf, +0x12,0x67,0x80,0xf9,0xe4,0x35,0x2b,0xfa,0xf1,0x4b,0xe0,0xd1,0x2b,0xef,0x12,0x1, +0xc5,0x74,0x2e,0x25,0x2d,0xf8,0xe6,0x12,0x67,0x78,0xf9,0xe4,0x35,0x2b,0xfa,0xf1, +0x4b,0xe0,0xd1,0x2b,0xef,0x12,0x1, 0xc5,0x90,0xa, 0xef,0xe0,0xd1,0x1d,0xef,0x12, +0x1, 0xc5,0x5, 0x2d,0xe5,0x2d,0x64,0x1c,0x70,0x92,0xd1,0x16,0x90,0x0, 0x70,0xe4, +0x12,0x1, 0xd7,0x90,0x0, 0x71,0x74,0x7, 0x12,0x1, 0xd7,0x90,0x0, 0x72,0x74,0x17, +0x12,0x1, 0xd7,0x90,0x0, 0x73,0x74,0x2, 0x12,0x1, 0xd7,0x90,0x0, 0x74,0x74,0x7f, +0x12,0x1, 0xd7,0xe4,0xfd,0xd1,0x13,0x7d,0x1, 0xd1,0x13,0x90,0x0, 0x7b,0x74,0xf, +0x12,0x1, 0xd7,0x90,0x0, 0x7c,0x74,0x21,0x12,0x67,0xa8,0xff,0x90,0x0, 0x7d,0x12, +0x1, 0xd7,0x90,0x0, 0x7e,0xef,0x12,0x1, 0xd7,0x90,0x0, 0x7f,0xef,0x12,0x67,0x3, +0x74,0x5d,0x2, 0x1, 0xd7,0x75,0x4b,0x1, 0x75,0x4c,0x0, 0x75,0x4d,0x83,0x7b,0x1, +0x7a,0x0, 0x79,0x0, 0x22,0x12,0x1, 0x4c,0xfd,0x12,0x0, 0x4e,0x5, 0x2d,0xe5,0x2d, +0xc3,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0xc5,0x22,0xb1,0xc, 0x53,0xdb,0xfd,0xd2,0xba, +0x43,0xdb,0x1, 0x43,0xdb,0x20,0x22,0xef,0x12,0x1, 0xc5,0x74,0xfb,0x25,0x2d,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xa3,0xf0,0x75,0x25,0x1, 0x75,0x26,0x0, 0x75, +0x27,0x0, 0x75,0x28,0x1, 0x75,0x29,0x0, 0x75,0x2a,0x83,0x75,0x2b,0x1, 0x22,0x8e, +0x22,0x8f,0x23,0x8c,0x24,0x8d,0x25,0x8a,0x26,0x8b,0x27,0x12,0x37,0xa9,0x12,0x3f, +0x9e,0xaa,0x22,0xa9,0x23,0x7b,0x1, 0x12,0x34,0x35,0xaa,0x24,0xa9,0x25,0x7b,0x1, +0x12,0x30,0xfe,0xe5,0x23,0x24,0x55,0xf5,0x82,0xe4,0x35,0x22,0xf5,0x83,0x74,0x21, +0xf0,0xaa,0x28,0xa9,0x29,0x7b,0x1, 0xd1,0x33,0xaa,0x28,0xa9,0x29,0x7b,0x1, 0xb1, +0xc, 0xf1,0x3b,0xaa,0x26,0xa9,0x27,0x7b,0x1, 0x12,0x35,0xfd,0xaa,0x22,0xa9,0x23, +0x7b,0x1, 0xc0,0x3, 0x8b,0x36,0x12,0x4f,0x44,0xd0,0x3, 0x8b,0x33,0x8a,0x34,0x89, +0x35,0x12,0x67,0x32,0xf5,0x40,0x12,0x2f,0xf3,0xf5,0x41,0x90,0x0, 0x53,0xe4,0x12, +0x1, 0xd7,0x90,0x0, 0x52,0xe4,0x12,0x1, 0xd7,0xe5,0x38,0x24,0x80,0xf9,0xe5,0x37, +0x34,0x3, 0xaf,0x1, 0xf5,0x3e,0x8f,0x3f,0x85,0x37,0x3c,0x85,0x38,0x3d,0x75,0x39, +0x1, 0x85,0x36,0x4b,0x85,0x37,0x4c,0x85,0x38,0x4d,0xab,0x33,0xaa,0x34,0xa9,0x35, +0xf1,0xf9,0x60,0xed,0xe4,0xf5,0x3a,0xf5,0x3b,0x12,0x67,0x38,0xe5,0x3f,0x2f,0xf5, +0x82,0xe5,0x3e,0x12,0x55,0xad,0x78,0x2, 0x12,0x58,0xf8,0xd8,0xfb,0xfd,0xac,0x6, +0x12,0x67,0x38,0xe5,0x3d,0x2f,0xf5,0x82,0xe5,0x3c,0x3e,0xf5,0x83,0xec,0x8d,0xf0, +0x12,0x2, 0x60,0x5, 0x3b,0xe5,0x3b,0x70,0x2, 0x5, 0x3a,0xb4,0xc0,0xcb,0xe5,0x3a, +0xb4,0x1, 0xc6,0x5, 0x39,0xe5,0x39,0xd3,0x94,0x4, 0x40,0xa5,0xab,0x33,0xaa,0x34, +0xa9,0x35,0x90,0x0, 0x53,0xe5,0x40,0x12,0x1, 0xd7,0x90,0x0, 0x52,0xe5,0x41,0x2, +0x1, 0xd7,0x8b,0x48,0x8a,0x49,0x89,0x4a,0x75,0x51,0x20,0x90,0x0, 0x55,0x12,0x1, +0x65,0xf5,0x59,0x12,0x17,0xc1,0xf5,0x60,0x12,0x1, 0x4c,0xf5,0x61,0x85,0x60,0x62, +0xe5,0x60,0x25,0xe0,0xf5,0x63,0x12,0x67,0x32,0xf5,0x64,0xf1,0xf3,0xf5,0x67,0x90, +0x0, 0x82,0x12,0x1, 0x65,0xf5,0x68,0xab,0x4b,0xaa,0x4c,0xa9,0x4d,0x90,0x7, 0xa5, +0xe5,0x17,0x12,0x1, 0xd7,0x12,0x64,0x4e,0xef,0x70,0x3, 0x7f,0xaa,0x22,0xab,0x4b, +0xaa,0x4c,0xa9,0x4d,0x90,0x7, 0x9a,0x12,0x5, 0x6c,0xaf,0x1, 0x8a,0x65,0x8f,0x66, +0xaf,0x61,0x7e,0x0, 0xab,0x48,0xe5,0x4a,0x24,0x56,0xf9,0xe4,0x35,0x49,0xfa,0x78, +0x6d,0x7c,0x0, 0x7d,0x0, 0x12,0x1, 0x26,0xaf,0x60,0x7e,0x0, 0xab,0x48,0xe5,0x4a, +0x24,0x72,0xf9,0xe4,0x35,0x49,0xfa,0x78,0x89,0x7c,0x0, 0x7d,0x0, 0x12,0x1, 0x26, +0xe5,0x59,0x54,0x30,0x60,0x78,0x75,0x4e,0x10,0x75,0x4f,0x0, 0xe4,0x25,0x4d,0xf9, +0xe5,0x4c,0x34,0x7, 0xaf,0x1, 0xf5,0x5c,0x8f,0x5d,0xe4,0xf5,0x50,0xe5,0x50,0xc3, +0x95,0x60,0x50,0x5a,0xb1,0xb0,0xe0,0xfe,0xa3,0xe0,0xff,0x85,0x5d,0x82,0x85,0x5c, +0x83,0x51,0x90,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x59,0x30,0xe5,0x19,0xb1,0xb0,0x75, +0xf0,0x2, 0xe5,0x62,0x12,0x35,0xef,0xff,0xe5,0x5d,0x24,0x20,0x12,0x67,0x90,0x51, +0x95,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x59,0x54,0x30,0x64,0x30,0x70,0x19,0xb1,0xb0, +0x75,0xf0,0x2, 0xe5,0x63,0x12,0x35,0xef,0xff,0xe5,0x5d,0x24,0x40,0x12,0x67,0x90, +0x51,0x90,0xee,0xf0,0xa3,0xef,0xf0,0x12,0x66,0xd5,0x5, 0x50,0x80,0x9f,0xe5,0x59, +0x54,0x3, 0xf5,0x58,0x70,0x2, 0x41,0x8a,0xe5,0x68,0xb4,0x1, 0x8, 0x75,0x4e,0x10, +0x75,0x4f,0x60,0x80,0x6, 0x75,0x4e,0x10,0x75,0x4f,0x48,0x85,0x4e,0x52,0x85,0x4f, +0x53,0xe5,0x4d,0x24,0x80,0xf9,0xe5,0x4c,0x34,0x3, 0xaf,0x1, 0xf5,0x54,0x8f,0x55, +0x85,0x4c,0x56,0x85,0x4d,0x57,0xe4,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x61,0x40,0x2, +0x41,0x8a,0x85,0x51,0xf0,0x12,0x67,0x88,0xff,0xae,0xf0,0x25,0x55,0xfd,0xe5,0x54, +0x3e,0xf5,0x5a,0x8d,0x5b,0xe5,0x57,0x2f,0xff,0xe5,0x56,0x3e,0xf5,0x5c,0x8f,0x5d, +0xe4,0xfd,0xed,0xc3,0x95,0x60,0x40,0x2, 0x41,0x6c,0xb1,0xb0,0xe0,0xf5,0x5e,0xa3, +0xe0,0xf5,0x5f,0xe5,0x67,0x70,0x29,0x85,0x60,0xf0,0x12,0x67,0x88,0x25,0x66,0xf5, +0x82,0xe5,0x65,0x35,0xf0,0xf5,0x83,0x74,0x89,0x2d,0xf8,0xe6,0x25,0x82,0x12,0x3f, +0x34,0x75,0xf0,0x8, 0xa4,0xae,0xf0,0x25,0x5f,0xf5,0x5f,0xee,0x35,0x5e,0xf5,0x5e, +0xe5,0x64,0x60,0x30,0x85,0x5d,0x82,0x85,0x5c,0x83,0x74,0x89,0x2d,0xf8,0xe6,0xff, +0x51,0x96,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0xe5,0x5f,0x9b,0xfb,0xe5,0x5e,0x9a,0xfa, +0x85,0x5a,0x83,0x85,0x5b,0x82,0x75,0xf0,0x2, 0xef,0x12,0x5, 0x40,0xea,0xf0,0xa3, +0xeb,0xf0,0x80,0x12,0x85,0x5b,0x82,0x85,0x5a,0x83,0x74,0x89,0x2d,0x51,0x94,0xe5, +0x5e,0xf0,0xa3,0xe5,0x5f,0xf0,0x12,0x66,0xd5,0xd, 0x21,0xe2,0xe5,0x68,0xb4,0x1, +0x4, 0x74,0x20,0x80,0x2, 0x74,0x48,0x25,0x53,0xf5,0x53,0xe4,0x35,0x52,0xf5,0x52, +0x85,0x52,0x4e,0x85,0x53,0x4f,0x5, 0x50,0x21,0xb9,0x12,0x27,0x3b,0x7f,0x0, 0x22, +0x74,0x89,0x25,0x50,0xf8,0xe6,0x75,0xf0,0x2, 0x2, 0x5, 0x40,0x12,0x57,0x70,0x12, +0x4e,0x82,0xf5,0x43,0x12,0x55,0x7b,0xf5,0x44,0xe5,0x43,0xd3,0x94,0x0, 0x50,0x8, +0xe5,0x44,0x94,0x0, 0x50,0x2, 0xa1,0x70,0xb1,0x7e,0x90,0x0, 0x82,0x74,0x1, 0x12, +0x1, 0x92,0x90,0x0, 0x82,0x12,0x1, 0x65,0x64,0x5, 0x60,0x2, 0xa1,0x7d,0xb1,0x7e, +0x90,0x0, 0x82,0x12,0x1, 0xd7,0xb1,0x9a,0x60,0x2, 0x61,0xb0,0xb1,0x7e,0xb1,0xaa, +0x60,0x2, 0x61,0xb0,0x90,0x0, 0x83,0x12,0x67,0x3, 0xe5,0x43,0x12,0x1, 0xd7,0x90, +0x0, 0x81,0xe5,0x44,0x12,0x1, 0xd7,0xe4,0xf5,0x3d,0xe5,0x43,0x25,0x44,0xff,0xe4, +0x33,0xfe,0xc3,0xe5,0x3d,0xb1,0xd4,0x40,0x2, 0xa1,0x7d,0xe5,0x3d,0xc3,0x95,0x43, +0x50,0x2a,0xe5,0x33,0x24,0x30,0xf9,0xe4,0x35,0x32,0xb1,0xc4,0x12,0x17,0xd5,0xb1, +0xb7,0xb1,0x7e,0x75,0xf0,0x2, 0xe5,0x3d,0x12,0x16,0xe3,0x12,0x67,0xa0,0xe5,0x3d, +0x75,0xf0,0x2, 0x12,0x17,0xd5,0xfa,0x90,0x0, 0x1, 0x80,0x3d,0xab,0x31,0xe5,0x33, +0x24,0x58,0xf9,0xe4,0x35,0x32,0xfa,0xc3,0xe5,0x3d,0x95,0x43,0xfd,0xe4,0x94,0x0, +0xfc,0xed,0xae,0x4, 0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea, +0x3e,0xb1,0xb7,0x12,0x46,0xf7,0xab,0x31,0xe5,0x33,0x2f,0xf9,0xe5,0x32,0x3e,0xfa, +0x90,0x0, 0x87,0x12,0x67,0xa0,0x90,0x0, 0x88,0x12,0x1, 0x65,0xc3,0x13,0xf5,0x41, +0xb1,0x8c,0xa3,0xe5,0x42,0xf0,0xb1,0x8c,0xe5,0x41,0xf0,0xb1,0xa0,0xf5,0x83,0x74, +0x1, 0xf0,0xd1,0xd2,0xe5,0x42,0x12,0x59,0x7, 0xe5,0x41,0x12,0x5, 0x40,0x12,0x2, +0xb7,0xff,0xb1,0x8c,0xa3,0xa3,0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x5, 0x3d,0x41,0xfa, +0xb1,0x7e,0xb1,0xaa,0xff,0xb1,0x9a,0x2f,0xf5,0x3e,0xe4,0xf5,0x3d,0xb1,0x7e,0xb1, +0xaa,0xff,0xb1,0x9a,0xb1,0xcb,0x40,0x2, 0xa1,0xc, 0xe5,0x3d,0xc3,0x9d,0x50,0x7, +0xb1,0xbe,0x12,0x17,0xd5,0x80,0x12,0xb1,0x94,0x12,0x62,0x90,0xef,0x78,0x3, 0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x66,0x96,0xb1,0xb7,0x12,0x66,0xe1,0xb1,0x8b, +0xa3,0xe0,0x75,0xf0,0x20,0xb1,0x85,0xe0,0x75,0xf0,0x2, 0x12,0x16,0xe3,0x12,0x2, +0xb7,0xf5,0x40,0x85,0xf0,0x3f,0xb1,0xa0,0xf5,0x83,0xe0,0x70,0x4, 0x15,0x3e,0xa1, +0x8, 0xe4,0xf5,0x48,0xf5,0x47,0x12,0x63,0xe7,0x12,0x1, 0x4c,0xff,0xe5,0x47,0xc3, +0x9f,0x40,0x2, 0x81,0xbe,0xb1,0x8c,0xa3,0xe0,0xff,0x65,0x47,0x70,0x2, 0x81,0xba, +0x12,0x66,0xe1,0xfa,0x75,0xf0,0x20,0xef,0xb1,0x85,0xe0,0x75,0xf0,0x2, 0x12,0x16, +0xe3,0x12,0x1c,0x77,0xb1,0x8c,0xa3,0xe0,0x75,0xf0,0x10,0xa4,0xff,0xb1,0x8c,0xe0, +0x12,0x62,0xd4,0x12,0x46,0x76,0xaa,0x35,0xa9,0x36,0x12,0x67,0xa, 0xfd,0xec,0x35, +0xf0,0xfc,0xc0,0x4, 0xc0,0x5, 0xe5,0x47,0x12,0x65,0xad,0xc0,0x83,0xc0,0x82,0xb1, +0x8c,0xe0,0xff,0xd0,0x82,0xd0,0x83,0x51,0x96,0x12,0x1c,0x77,0xef,0xfb,0x7a,0x0, +0xe5,0x47,0x75,0xf0,0x10,0xa4,0x2b,0xff,0xea,0x35,0xf0,0x12,0x46,0x76,0xab,0x34, +0xaa,0x35,0x12,0x67,0xa, 0xff,0xec,0x35,0xf0,0xfe,0xc3,0xd0,0xe0,0x9f,0xff,0xd0, +0xe0,0x9e,0xfe,0xb1,0x94,0xfd,0xe5,0x3d,0xc3,0x9d,0x50,0xe, 0xd1,0xd9,0x12,0x58, +0xff,0xe5,0xf0,0x12,0x62,0x80,0x40,0x2, 0x5, 0x48,0x5, 0x47,0x81,0x16,0x12,0x63, +0xe7,0x12,0x1, 0x4c,0xc3,0x13,0xff,0xe5,0x48,0xc3,0x9f,0x40,0xf, 0xd1,0xd2,0x12, +0x57,0x28,0x64,0x6, 0x60,0x6, 0xb1,0xa0,0xf5,0x83,0xe4,0xf0,0xb1,0x8c,0xa3,0x12, +0x4d,0xe1,0xc3,0xe5,0x40,0x9f,0xff,0xe5,0x3f,0x9e,0xfe,0x12,0x0, 0x6, 0x8e,0x3f, +0x8f,0x40,0x12,0x65,0x3, 0xff,0xd3,0xe5,0x40,0x9f,0x74,0x80,0xf8,0x65,0x3f,0x98, +0x40,0x6, 0xb1,0xa0,0xf5,0x83,0xe4,0xf0,0x5, 0x3d,0x61,0xbd,0xe5,0x3e,0x70,0x7, +0xb1,0x7e,0x90,0x0, 0x80,0x80,0x63,0xb1,0x7e,0x90,0x0, 0x83,0x12,0x1, 0x65,0xc3, +0x94,0x4, 0x40,0x42,0xe4,0xf5,0x3d,0xb1,0x7e,0xb1,0xaa,0xff,0xb1,0x9a,0xb1,0xcb, +0x50,0x4b,0xe5,0x3d,0xc3,0x9d,0x50,0x7, 0xb1,0xbe,0x12,0x17,0xd5,0x80,0x12,0xb1, +0x94,0x12,0x62,0x90,0xef,0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x66, +0x96,0xb1,0xb7,0xb1,0xa0,0xf5,0x83,0xe0,0xb4,0x1, 0x7, 0xb1,0xa0,0xf5,0x83,0x74, +0x2, 0xf0,0x5, 0x3d,0x80,0xc1,0xb1,0x7e,0x90,0x0, 0x83,0x74,0x1, 0x2, 0x1, 0x92, +0xb1,0x7e,0x90,0x0, 0x83,0xe4,0x12,0x67,0x3, 0xe4,0x12,0x57,0x80,0x22,0xab,0x31, +0xaa,0x32,0xa9,0x33,0x22,0xa4,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x85,0x46,0x82,0x85, +0x45,0x83,0xa3,0x22,0xab,0x31,0xaa,0x32,0xa9,0x33,0x90,0x0, 0x80,0x2, 0x1, 0x65, +0xe5,0x46,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x45,0x22,0x90,0x0, 0x81,0x2, 0x1, 0x65, +0x85,0x4f,0x82,0x85,0x4e,0x83,0x22,0xaf,0x1, 0xf5,0x45,0x8f,0x46,0x22,0xe9,0x24, +0x30,0xf9,0xe4,0x3a,0xfa,0xe5,0x3d,0x75,0xf0,0x8, 0x22,0xfd,0x2f,0xff,0xe4,0x33, +0xfe,0xe5,0x3d,0xc3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x22,0x12,0x57,0x70, +0x12,0x1, 0x4c,0x13,0x13,0x54,0x3f,0xf5,0x3c,0x12,0x17,0xc1,0x13,0x13,0x54,0x3f, +0xf5,0x3d,0xe4,0xf5,0x3e,0xf5,0x3f,0xf5,0x40,0xe5,0x3c,0x70,0x3, 0x75,0x3c,0x1, +0xe5,0x3d,0x70,0x3, 0x75,0x3d,0x1, 0xe4,0xf5,0x3a,0xb1,0x7e,0x12,0x1, 0x4c,0xff, +0xe5,0x3a,0xc3,0x9f,0x50,0x4e,0xe4,0xf5,0x3b,0xb1,0x7e,0x12,0x17,0xc1,0xff,0xe5, +0x3b,0xc3,0x9f,0x50,0x37,0xf1,0xca,0xfd,0xd3,0xef,0x9d,0x74,0x80,0xf8,0x65,0xf0, +0x98,0x40,0x4, 0x5, 0x3e,0x80,0x1b,0xf1,0xca,0xfd,0xc3,0xe4,0x9d,0xfd,0xe4,0x94, +0x0, 0xfc,0xc3,0xef,0x9d,0xec,0x64,0x80,0xf8,0xe5,0xf0,0x64,0x80,0x98,0x50,0x2, +0x5, 0x3f,0x5, 0x40,0xe5,0x3d,0x25,0x3b,0xf5,0x3b,0x80,0xbd,0xe5,0x3c,0x25,0x3a, +0xf5,0x3a,0x80,0xa6,0xe5,0x40,0xc3,0x13,0xff,0xe5,0x3e,0xd3,0x9f,0x40,0x21,0x90, +0x7, 0x9f,0x12,0x64,0xd3,0xfe,0xd1,0xd2,0x90,0x7, 0x9e,0x12,0x1, 0x65,0xc3,0x9e, +0x90,0x7, 0x9e,0x50,0x2, 0x80,0x25,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x1, 0x80,0x3f, +0xe5,0x3f,0xd3,0x9f,0x40,0x26,0x90,0x7, 0x9e,0x12,0x64,0xd3,0xff,0xd1,0xd2,0x90, +0x7, 0x9f,0x12,0x1, 0x65,0xc3,0x9f,0x90,0x7, 0x9f,0x50,0x7, 0x74,0x1, 0x12,0x1, +0x92,0x80,0x1c,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x2, 0x80,0x13,0xd1,0xd2,0x90,0x7, +0x9f,0xe4,0x12,0x1, 0xd7,0x90,0x7, 0x9e,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x16,0xaf, +0x16,0x22,0xab,0x34,0xaa,0x35,0xa9,0x36,0x22,0xab,0x37,0xaa,0x38,0xa9,0x39,0x22, +0x8b,0x37,0x8a,0x38,0x89,0x39,0x90,0x0, 0x19,0x12,0x1, 0x65,0xfd,0x7f,0x6, 0xf1, +0x43,0xd1,0xd9,0x90,0x0, 0x1a,0x12,0x1, 0x65,0xfd,0x7f,0xa, 0xf1,0x43,0x12,0x65, +0x3, 0xfd,0x7f,0x8, 0xf1,0x43,0xd1,0xd9,0x90,0x0, 0x1c,0x12,0x1, 0x65,0xfd,0x7f, +0xc, 0xf1,0x43,0xd1,0xd9,0x90,0x0, 0x1d,0x12,0x1, 0x65,0xfd,0x7f,0x2a,0xf1,0x43, +0xf1,0xe7,0xfd,0x7f,0x2e,0xf1,0x43,0xe4,0xfd,0x7f,0x1c,0xf1,0x43,0xd1,0xd9,0x90, +0x0, 0x21,0x12,0x1, 0x65,0xfd,0x7f,0x2, 0xf1,0x43,0x90,0x0, 0x22,0x12,0x57,0x77, +0xfd,0x7f,0x4, 0x12,0x63,0xfd,0xef,0x44,0x40,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x43,0xab,0x4, +0x22,0x8b,0x34,0x8a,0x35,0x89,0x36,0xe4,0xff,0x12,0x64,0x62,0xd1,0xd2,0x90,0x0, +0x18,0x12,0x1, 0x65,0xff,0x12,0x64,0x21,0x7f,0x1, 0x12,0x64,0x6d,0x12,0x64,0x33, +0xef,0x70,0x2, 0xff,0x22,0x7d,0x7f,0x7f,0x14,0xf1,0xb8,0xef,0x70,0x2, 0xff,0x22, +0xe5,0x36,0x24,0x10,0xf9,0xe4,0x35,0x35,0x85,0x34,0x3a,0xf5,0x3b,0x89,0x3c,0xd1, +0xd2,0x12,0x63,0x1d,0xd1,0xd2,0xd1,0xe0,0xe4,0xff,0x12,0x64,0x6d,0x12,0x64,0x45, +0xef,0x7f,0x0, 0x60,0x2, 0x7f,0x1, 0x22,0xae,0x5, 0xac,0x7, 0xf1,0x43,0x12,0x64, +0x4, 0xef,0x7f,0x0, 0xb5,0x6, 0x2, 0x7f,0x1, 0x22,0xab,0x34,0xaa,0x35,0xa9,0x36, +0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x3a,0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5,0x3b, +0x12,0x5, 0x40,0x12,0x2, 0xb7,0xff,0xab,0x37,0xaa,0x38,0xa9,0x39,0x90,0x0, 0x1e, +0x2, 0x1, 0x65,0x90,0x0, 0x52,0x2, 0x1, 0x65,0x11,0x72,0xef,0x64,0xaa,0x22,0xe4, +0x90,0xc, 0xdb,0xf0,0x90,0xc, 0xae,0xf0,0x22,0x75,0x10,0x4, 0x75,0x11,0x3, 0x12, +0x65,0xf0,0xa3,0x74,0x60,0xf0,0x12,0x3d,0x29,0x12,0x2f,0xff,0x12,0x27,0x1e,0x91, +0x35,0x7b,0x1, 0x7a,0x8, 0x79,0x29,0x11,0xfe,0xb1,0xaf,0x51,0xc, 0x12,0x27,0x39, +0x90,0x0, 0x1, 0xe0,0x90,0xc, 0xd5,0xf0,0x90,0x0, 0x0, 0xe0,0x90,0xc, 0xd4,0xf0, +0xd1,0x0, 0xe4,0x90,0x0, 0x52,0xf0,0xa3,0x12,0x67,0x56,0x90,0xc, 0xd2,0x74,0x3, +0xf0,0xd1,0x0, 0x90,0xc, 0xd1,0xe0,0x70,0x31,0x12,0x0, 0x1e,0x90,0xc, 0xd1,0x74, +0x1, 0xf0,0x7f,0x0, 0x7e,0x7c,0xf1,0x8d,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26, +0x83,0x75,0x27,0x4, 0x12,0x27,0x1e,0x51,0x1c,0xe4,0xfd,0xff,0xfe,0x71,0x9f,0x7f, +0x4, 0x12,0x40,0xea,0x90,0xc, 0xd1,0x74,0xff,0xf0,0x90,0xc, 0xd2,0xe0,0x64,0x3, +0x70,0x43,0x90,0xc, 0xac,0xe0,0x30,0xe7,0xb8,0x12,0x27,0x1e,0x91,0x35,0xf1,0xa9, +0x51,0x4, 0x12,0x25,0xc, 0x12,0x27,0x3b,0x90,0xc, 0xda,0xe0,0x90,0x0, 0x52,0x70, +0x3, 0xf0,0x80,0x3, 0x74,0x1, 0xf0,0xe4,0x90,0x0, 0x53,0xf0,0xb1,0xaf,0x12,0x27, +0x15,0x12,0x2f,0xf9,0x60,0xf8,0x75,0x10,0x4, 0x75,0x11,0x3, 0x90,0xc, 0xac,0xe0, +0x54,0x7f,0xf0,0x1, 0x51,0x90,0xc, 0xd2,0xe0,0x90,0xc, 0x59,0xf0,0xe4,0xff,0xfd, +0xfc,0xe5,0xdb,0x20,0xe1,0xf, 0xf, 0xbf,0xff,0x5, 0xd, 0xbd,0x0, 0x1, 0xc, 0xbc, +0x3, 0xef,0xbd,0xe8,0xec,0x53,0xdb,0xfe,0x53,0xdb,0xfd,0xc2,0xba,0x22,0xf1,0xa2, +0xe4,0xf5,0x2e,0xe5,0x2e,0x20,0xe0,0x13,0xab,0x2a,0x31,0xfa,0xe5,0x2e,0xc3,0x13, +0x7e,0x0, 0x29,0xf9,0xee,0x3a,0xfa,0xe4,0x12,0x1, 0xc5,0xe5,0x2e,0xc3,0x94,0xb, +0x50,0x1e,0x74,0x33,0x25,0x2e,0x12,0x47,0x17,0xe0,0xff,0xe5,0x2e,0x90,0xf, 0x48, +0x93,0xf5,0x82,0x75,0x83,0x0, 0xa3,0xa3,0xa3,0x12,0x26,0x16,0xef,0x12,0x1, 0xd7, +0x5, 0x2e,0xe5,0x2e,0xb4,0x10,0xbc,0xe4,0xf5,0x2e,0xe5,0x2e,0x20,0xe0,0x5, 0xb1, +0xc6,0xe0,0x80,0x9, 0xe5,0x2e,0xb1,0xc6,0xe0,0x54,0xf0,0xff,0xc4,0x54,0xf, 0xf5, +0x2d,0xe5,0x2e,0xc3,0x94,0xb, 0x50,0x2c,0xe5,0x2e,0x90,0xf, 0x48,0x93,0xff,0x24, +0x3, 0xab,0x2a,0x20,0xe0,0xa, 0x31,0xfa,0xef,0x12,0x7, 0x6b,0x45,0x2d,0x80,0x11, +0x31,0xfa,0xe5,0x2e,0x90,0xf, 0x48,0x12,0x7, 0x6a,0xff,0xe5,0x2d,0xc4,0x54,0xf0, +0x4f,0x12,0x1, 0xc5,0x5, 0x2e,0xe5,0x2e,0x64,0x10,0x70,0xae,0x90,0xa, 0xed,0xe0, +0x12,0x26,0x16,0x90,0x0, 0x18,0x12,0x1, 0xd7,0x90,0xb, 0x17,0xe0,0x90,0x0, 0x19, +0xf1,0xbf,0x90,0x0, 0x1a,0x12,0x1, 0xd7,0x90,0x0, 0x1b,0xe4,0xf1,0xb7,0x90,0x0, +0x1c,0x12,0x1, 0xd7,0x90,0x0, 0x1e,0x74,0x13,0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74, +0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x21,0x74,0x3f,0x12,0x1, 0xd7,0x90,0x0, 0x22,0x74, +0x3f,0x12,0x1, 0xd7,0x90,0x0, 0x1d,0x74,0xa, 0x12,0x1, 0xd7,0x90,0x0, 0x1f,0x74, +0x1, 0x12,0x1, 0xd7,0x12,0x2f,0x61,0x8f,0x2d,0x22,0xe5,0x2c,0x24,0x10,0xf9,0xe4, +0x35,0x2b,0xfa,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0x29,0x11,0xfe,0x7b,0x1, 0x7a,0x8, +0x79,0x4c,0x12,0x26,0x33,0x7b,0x1, 0x7a,0x8, 0x79,0x4c,0x22,0x8b,0x21,0x8a,0x22, +0x89,0x23,0xe4,0xf5,0x44,0xf5,0x45,0x74,0x60,0x25,0x45,0x12,0x47,0x45,0x5, 0x45, +0xe5,0x45,0x70,0x2, 0x5, 0x44,0x64,0xd1,0x45,0x44,0x70,0xeb,0x11,0xdd,0x12,0x27, +0x3b,0x85,0x24,0x4b,0x85,0x25,0x4c,0x85,0x26,0x4d,0xab,0x21,0xaa,0x22,0xa9,0x23, +0x12,0x2f,0xf9,0x60,0xec,0xe5,0x26,0x24,0x80,0xf9,0xe5,0x25,0x34,0x3, 0xaf,0x1, +0xf5,0x10,0x8f,0x11,0xe4,0xf5,0x2a,0xf5,0x2b,0xe4,0xf5,0x43,0xe5,0x2b,0x45,0x2a, +0x70,0x6, 0x71,0xf7,0xe4,0xf6,0x8, 0xf6,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xb1,0xe1,0xff,0x71,0xf7,0xe6,0xfc,0x8, 0xe6,0xfd,0xd3, +0xef,0x9d,0xee,0x9c,0x40,0xf, 0xef,0x94,0x1c,0xee,0x94,0x25,0x50,0x7, 0x71,0xf7, +0xa6,0x6, 0x8, 0xa6,0x7, 0x5, 0x43,0xe5,0x43,0xb4,0xb, 0xc0,0x5, 0x2b,0xe5,0x2b, +0x70,0x2, 0x5, 0x2a,0x64,0x13,0x45,0x2a,0x70,0xaf,0xe4,0xf5,0x46,0xf5,0x47,0xf5, +0x2a,0xf5,0x2b,0xe4,0xf5,0x43,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33, +0xce,0xd8,0xf9,0xb1,0xe1,0xff,0xd3,0x94,0x1c,0xee,0x94,0x25,0x40,0xa, 0x5, 0x47, +0xe5,0x47,0x70,0x2, 0x5, 0x46,0x80,0x45,0x71,0xf7,0xe6,0xfc,0x8, 0xe6,0xc3,0x9f, +0xf5,0x45,0xec,0x9e,0xf5,0x44,0xe5,0x45,0xae,0x44,0x78,0x3, 0xce,0xc3,0x13,0xce, +0x13,0xd8,0xf9,0xf5,0x45,0x8e,0x44,0xd3,0x94,0xff,0xe5,0x44,0x94,0x0, 0x40,0x6, +0x75,0x44,0x0, 0x75,0x45,0xff,0x5, 0x47,0xe5,0x47,0xac,0x46,0x70,0x2, 0x5, 0x46, +0x14,0x24,0x60,0xf5,0x82,0x74,0xb, 0x3c,0xf5,0x83,0xe5,0x45,0xf0,0x5, 0x43,0xe5, +0x43,0x64,0xb, 0x70,0x91,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64,0x13,0x45, +0x2a,0x70,0x80,0x75,0x28,0xa, 0x75,0x29,0xeb,0xe4,0xf5,0x2c,0xf5,0x2a,0xf5,0x2b, +0x85,0x29,0x82,0x85,0x28,0x83,0xe0,0x62,0x2c,0x7e,0x0, 0xe5,0x2b,0x25,0x27,0xff, +0xee,0x35,0x2a,0xfe,0x5, 0x29,0xe5,0x29,0xac,0x28,0x70,0x2, 0x5, 0x28,0x14,0xf5, +0x82,0x8c,0x83,0xe0,0xfd,0x71,0x9f,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0xc3, +0x94,0x46,0xe5,0x2a,0x94,0x1, 0x40,0xc8,0xad,0x2c,0x7f,0xf0,0x7e,0x3, 0x71,0x9f, +0xc3,0x74,0xff,0x95,0x2c,0xfd,0x7f,0xf1,0x7e,0x3, 0x71,0x9f,0x7f,0x1, 0x22,0x12, +0x47,0xf, 0x12,0x47,0x31,0xe4,0xf5,0xf8,0x8a,0xf9,0x8b,0xfa,0x8d,0xfb,0x43,0xfc, +0x3, 0x75,0xf8,0x82,0x7f,0xa, 0x71,0xe1,0xd2,0xf8,0x7f,0x4, 0x71,0xe1,0xd2,0xfe, +0x7f,0x26,0x71,0xe1,0xc2,0xfe,0xc2,0xf9,0x7f,0xc, 0x71,0xe1,0xc2,0xf8,0x7f,0x1, +0x71,0xe1,0x43,0xfc,0x3, 0xe4,0xf5,0xf8,0xd2,0xaf,0x22,0x7f,0xfa,0x71,0xe1,0x7f, +0xfa,0xae,0x7, 0x1f,0xee,0x60,0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x80,0xeb,0x22,0xe5,0x43,0x25,0xe0,0x24,0x2d,0xf8,0x22,0xad, +0x7, 0xaf,0x5, 0x1d,0xef,0x60,0xa, 0x71,0xdb,0x7f,0xfa,0x71,0xe1,0x71,0xdb,0x80, +0xf0,0x22,0x12,0x47,0x3b,0xe4,0xf5,0xf8,0x12,0x47,0x7, 0x75,0xf8,0x88,0x7f,0x14, +0x71,0xe1,0x75,0xf8,0x89,0x7f,0x2d,0x71,0xff,0xc2,0xfb,0x7f,0x14,0x71,0xe1,0xc2, +0xf8,0x7f,0xa, 0x80,0x9b,0xf1,0xa2,0x75,0x4d,0xff,0xe4,0xf5,0x4e,0x75,0x4f,0xff, +0xf5,0x50,0xf5,0x5f,0x75,0x60,0x0, 0x75,0x61,0x51,0x12,0x66,0x52,0x12,0x26,0x16, +0x90,0x0, 0x52,0xe4,0x12,0x66,0xc2,0x74,0x1, 0x12,0x67,0xa8,0x90,0x0, 0x54,0x12, +0x1, 0xd7,0x90,0xa, 0xeb,0xe0,0x12,0x1, 0xc5,0x90,0xa, 0xec,0xe0,0x12,0x26,0x16, +0x12,0x46,0xdc,0xe4,0xf5,0x2d,0x12,0x26,0x16,0x12,0x1, 0x4c,0xff,0xe5,0x2d,0xc3, +0x9f,0x50,0x33,0x12,0x47,0x5a,0xe0,0xff,0xe9,0x24,0x31,0xf9,0xe4,0x3a,0xfa,0xe5, +0x2d,0xfd,0x12,0x26,0x2b,0x12,0x27,0x47,0xe0,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x4, +0xf9,0xe4,0x35,0x2b,0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x12,0x27,0x47,0xe0,0xff, +0x74,0x2f,0xb1,0xb6,0x80,0xc0,0xe4,0xf5,0x2d,0x12,0x26,0x16,0x12,0x17,0xc1,0xff, +0xe5,0x2d,0xc3,0x9f,0x50,0x17,0xb1,0xbe,0xe9,0x24,0x20,0xf9,0xe4,0x3a,0x12,0x26, +0x28,0xef,0x12,0x1, 0xc5,0xb1,0xbe,0x74,0x42,0xb1,0xb6,0x80,0xdc,0xe4,0xf5,0x2d, +0x90,0xa, 0xec,0xe0,0xff,0xe5,0x2d,0xc3,0x9f,0x50,0x3e,0xe4,0xf5,0x2e,0x90,0xa, +0xec,0xe0,0xff,0xe5,0x2e,0xc3,0x9f,0x50,0x15,0x74,0x42,0x25,0x2e,0xf8,0xe6,0xff, +0xc3,0x95,0x4f,0x50,0x5, 0x8f,0x4f,0x85,0x2e,0x50,0x5, 0x2e,0x80,0xe0,0x74,0x42, +0x25,0x50,0xf8,0x76,0xff,0x75,0x4f,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x72,0xb1,0xd2, +0xe5,0x50,0x12,0x1, 0xc5,0x5, 0x2d,0x80,0xb7,0xe4,0xf5,0x2d,0x90,0xa, 0xeb,0xe0, +0xff,0xe5,0x2d,0xc3,0x9f,0x50,0x3e,0xe4,0xf5,0x2e,0x90,0xa, 0xeb,0xe0,0xff,0xe5, +0x2e,0xc3,0x9f,0x50,0x15,0x74,0x2f,0x25,0x2e,0xf8,0xe6,0xff,0xc3,0x95,0x4d,0x50, +0x5, 0x8f,0x4d,0x85,0x2e,0x4e,0x5, 0x2e,0x80,0xe0,0x74,0x2f,0x25,0x4e,0xf8,0x76, +0xff,0x75,0x4d,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x56,0xb1,0xd2,0xe5,0x4e,0x12,0x1, +0xc5,0x5, 0x2d,0x80,0xb7,0x90,0xa, 0xee,0xe0,0x12,0x26,0x16,0x90,0x0, 0x30,0x12, +0x1, 0xd7,0x90,0x0, 0x31,0x12,0x1, 0x65,0x90,0x0, 0x51,0xf1,0xbf,0x90,0x0, 0x4d, +0xf1,0xb7,0xff,0x90,0x0, 0x4e,0x12,0x1, 0xd7,0x90,0x0, 0x4f,0xef,0x12,0x1, 0xd7, +0x90,0x0, 0x50,0xef,0x12,0x1, 0xd7,0x90,0x0, 0x82,0x74,0x1, 0x2, 0x1, 0xd7,0x90, +0x0, 0x55,0x74,0x21,0xf0,0x22,0x25,0x2d,0xf8,0xa6,0x7, 0x5, 0x2d,0x22,0x74,0x51, +0x25,0x2d,0xf8,0xe6,0xff,0x22,0xc3,0x13,0x24,0x51,0xf5,0x82,0xe4,0x34,0xb, 0xf5, +0x83,0x22,0xf9,0xe4,0x35,0x2b,0xfa,0x7e,0x0, 0xe9,0x25,0x2d,0xf9,0xee,0x3a,0xfa, +0x22,0x25,0x11,0xf5,0x82,0xe5,0x10,0x3e,0xf5,0x83,0x75,0xf0,0x2, 0xe5,0x43,0x12, +0x5, 0x40,0xe0,0xfe,0xa3,0xe0,0x22,0xab,0x25,0xaa,0x26,0xa9,0x27,0x12,0x4f,0x54, +0xe4,0x90,0xa, 0xe4,0xf0,0xa3,0xf0,0x90,0xa, 0xde,0x74,0xd, 0xf0,0xa3,0x74,0xac, +0xf0,0x22,0xd1,0x0, 0xf1,0x70,0xf1,0x8f,0x7f,0x1, 0x12,0x62,0xdc,0xf1,0xc7,0x12, +0x46,0xe8,0x12,0x3f,0x9e,0x12,0x5a,0x8d,0x90,0xc, 0x59,0xe0,0x24,0xfd,0x60,0x14, +0x14,0x60,0x15,0x24,0xaf,0x60,0x2d,0x24,0xab,0x60,0x12,0x24,0xa9,0x70,0xe9,0x12, +0x21,0x28,0x80,0xe4,0x11,0x9, 0x80,0xe0,0x12,0x25,0xd9,0x80,0xdb,0xf1,0xaf,0x90, +0xa, 0xe8,0xe0,0x64,0xaa,0x60,0xd1,0xe4,0x90,0xa, 0xe0,0xf0,0x90,0xa, 0xe8,0x74, +0xaa,0xf0,0x80,0xc4,0xf1,0xaf,0x90,0xa, 0xe8,0xe0,0xb4,0xaa,0xbb,0x74,0x55,0xf0, +0x90,0xc, 0xed,0x12,0x46,0xff,0x90,0xc, 0xed,0x74,0xff,0xf5,0xf0,0x12,0x2, 0x76, +0x45,0xf0,0x70,0xf2,0xd1,0x8b,0x75,0xe9,0xff,0x80,0x9d,0x7d,0x66,0x7f,0xf8,0x7e, +0x6f,0x71,0xa2,0x7d,0xbb,0x7f,0xf9,0x7e,0x6f,0x61,0xa2,0x8b,0x33,0x8a,0x34,0x89, +0x35,0xe4,0xf5,0x39,0xf5,0x3a,0xf1,0x61,0x70,0x2, 0x5, 0x39,0x64,0x92,0x45,0x39, +0x70,0xf4,0xab,0x36,0xaa,0x37,0xa9,0x38,0xe4,0xf5,0x39,0xf5,0x3a,0xf1,0x61,0x70, +0x2, 0x5, 0x39,0x64,0x53,0x45,0x39,0x70,0xf4,0xe4,0xf5,0x39,0xf5,0x3a,0xab,0x33, +0xe5,0x35,0x24,0xa, 0xf9,0xe4,0x35,0x34,0xfa,0xae,0x39,0xaf,0x3a,0x12,0x1e,0xf2, +0xf1,0x3a,0xf1,0x5a,0x24,0x3, 0xf1,0x2e,0xf1,0x5a,0x24,0x26,0xf1,0x2e,0xf1,0x41, +0x5, 0x3a,0xe5,0x3a,0x70,0x2, 0x5, 0x39,0xc3,0x94,0x5, 0xe5,0x39,0x94,0x0, 0x40, +0xcd,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x51,0x74,0x1, 0x12,0x1, 0xd7,0xe4, +0xf5,0xa, 0xf5,0xb, 0xf5,0x9, 0xf5,0x8, 0xd1,0x1, 0xe4,0xa3,0xf0,0x90,0xa, 0xe8, +0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0x1, 0x90,0xa, 0xe1,0xf0,0xa3,0xf0,0x22,0xf9,0xe4, +0x35,0x37,0xfa,0xae,0x39,0xaf,0x3a,0x12,0x1, 0xf9,0xe9,0x2f,0xf9,0xea,0x3e,0xfa, +0x22,0x74,0xff,0xf5,0xf0,0x12,0x3, 0x3c,0x90,0x0, 0x2, 0x74,0xff,0xf5,0xf0,0x12, +0x3, 0x5b,0x90,0x0, 0x4, 0x74,0xff,0x2, 0x1, 0xd7,0xf1,0x41,0xab,0x36,0xe5,0x38, +0x22,0xe4,0x12,0x1, 0xc5,0x4, 0x29,0xf9,0xe4,0x3a,0xfa,0x5, 0x3a,0xe5,0x3a,0x22, +0x2, 0x0, 0x22,0x30,0x0, 0x7, 0x7f,0x1, 0xf1,0x84,0xc2,0x0, 0x22,0xe4,0xff,0xf1, +0x84,0xd2,0x0, 0x22,0xef,0x70,0x3, 0xd2,0x98,0x22,0xc2,0x98,0x22,0x81,0x12,0x12, +0x41,0xcc,0xc2,0x8e,0x43,0xa2,0x10,0x75,0xa6,0xf0,0x75,0xa5,0x5f,0xd2,0x8e,0xd2, +0xab,0x22,0x8b,0x2a,0x8a,0x2b,0x89,0x2c,0x22,0x11,0xdd,0x53,0xdb,0xf0,0x22,0xe4, +0x90,0xa, 0xe4,0xf0,0xa3,0xf0,0x22,0x12,0x1, 0xd7,0x90,0xa, 0xef,0xe0,0x22,0x12, +0x1, 0xd7,0x90,0xb, 0x43,0xe0,0x22,0xe4,0x90,0xc, 0xac,0xf0,0x12,0x42,0x3b,0xe4, +0x90,0xc, 0xab,0xf0,0x90,0xc, 0xa7,0xf0,0x90,0xc, 0xac,0xe0,0xc4,0x54,0x7, 0x70, +0x6, 0xa3,0x12,0x3a,0x78,0x80,0xf, 0x90,0xc, 0xac,0xe0,0xc4,0x54,0x7, 0xff,0xbf, +0x4, 0x4, 0xa3,0x12,0x38,0xa, 0xe4,0x12,0x3c,0xb2,0xf0,0x90,0xc, 0x73,0x74,0xaa, +0xf0,0xa3,0xf0,0x90,0xc, 0x8d,0xf0,0xa3,0xf0,0x22,0xe0,0xff,0x31,0x6e,0x8f,0x95, +0x22,0x30,0x95,0x5d,0x90,0xc, 0xa9,0xe0,0x4, 0xf0,0xe0,0xff,0xb4,0x1, 0x8, 0x90, +0xc, 0xad,0xe5,0x95,0xf0,0x80,0x2d,0x90,0xc, 0xac,0xe0,0xfe,0xc4,0x54,0x7, 0x70, +0xc, 0xa3,0xe0,0x2f,0x24,0xfe,0xff,0xad,0x95,0x51,0x9b,0x80,0x17,0x90,0xc, 0xac, +0xe0,0xc4,0x54,0x7, 0xff,0xbf,0x4, 0xc, 0x90,0xc, 0xa9,0x51,0x89,0x24,0xfe,0xff, +0xad,0x95,0x71,0x40,0x90,0xc, 0xac,0xe0,0xc4,0x54,0x7, 0xfd,0x70,0xb, 0x51,0x7f, +0x60,0xf, 0x90,0xc, 0xad,0x51,0x78,0x80,0x8, 0xbd,0x4, 0x5, 0x90,0xc, 0xad,0x11, +0xa, 0x30,0x94,0x1f,0x90,0xc, 0xa7,0xe0,0x4, 0xf0,0x90,0xc, 0xac,0xe0,0xc4,0x54, +0x7, 0xfd,0x70,0x8, 0x51,0x7f,0x60,0xb, 0x51,0x86,0x41,0x79,0xbd,0x4, 0x4, 0x51, +0x86,0x11,0xb, 0x22,0x51,0x91,0xff,0xc3,0x94,0x80,0x40,0x10,0xef,0xd3,0x94,0xbf, +0x50,0xa, 0x74,0xb2,0x2f,0xf5,0x82,0xe4,0x34,0xb, 0x21,0x55,0xa8,0x18,0xe6,0x24, +0x4, 0x60,0xb, 0x24,0xfc,0x70,0xe, 0x90,0xc, 0xac,0xe0,0xff,0x21,0x5d,0x90,0xc, +0x59,0xe0,0xff,0x21,0x5d,0xa8,0x18,0xe6,0xff,0xb4,0x3, 0x9, 0x30,0x2, 0x4, 0x51, +0x71,0x80,0x2, 0x51,0x6a,0xef,0x24,0xfe,0x60,0x34,0x24,0xfb,0x50,0x46,0x24,0xfe, +0x24,0xfc,0x50,0x4c,0x24,0xfe,0x24,0xfc,0x50,0x52,0x24,0xfe,0x24,0xfc,0x50,0x55, +0x24,0xfe,0x24,0xfc,0x50,0x58,0x24,0x1e,0x70,0x61,0x30,0x2, 0x4, 0x51,0x71,0x80, +0x2, 0x51,0x6a,0xe5,0xf, 0x24,0x4, 0xf5,0x82,0xe4,0x35,0xe, 0x80,0x47,0x30,0x2, +0x4, 0x51,0x71,0x80,0x2, 0x51,0x6a,0x85,0xf, 0x82,0x85,0xe, 0x83,0xa3,0xa3,0xa3, +0xe0,0xff,0x80,0x39,0xa8,0x18,0xe6,0x24,0x2, 0xff,0xe4,0x33,0x31,0x64,0x80,0x25, +0xa8,0x18,0xe6,0x25,0xf, 0xf5,0x82,0xe4,0x35,0xe, 0x80,0x19,0xa8,0x18,0xe6,0x24, +0xfe,0x31,0x60,0x80,0x10,0xa8,0x18,0xe6,0x24,0xfc,0x31,0x60,0x80,0x7, 0xa8,0x18, +0xe6,0x24,0xfa,0x31,0x60,0xf5,0x83,0xe0,0xff,0x80,0x2, 0x7f,0x0, 0x5, 0x18,0x22, +0xff,0xe4,0x34,0xff,0xfe,0xe5,0xf, 0x2f,0xf5,0x82,0xe5,0xe, 0x3e,0x22,0x51,0x91, +0xfe,0x14,0x60,0x1e,0x14,0x60,0x22,0x24,0xf2,0x50,0x22,0x24,0xc4,0x60,0x28,0x24, +0xfe,0x60,0x32,0x24,0x64,0x60,0x27,0x24,0xea,0x70,0x31,0x90,0xc, 0xac,0xe0,0xff, +0x41,0x67,0x90,0xc, 0xaa,0xe0,0xff,0x41,0x67,0x7f,0xff,0x41,0x67,0x74,0xe8,0x2e, +0xf5,0x82,0xe4,0x34,0xa, 0x41,0x5f,0x90,0xa, 0xf8,0xe0,0xff,0x41,0x67,0x90,0xc, +0xda,0xe0,0xff,0x41,0x67,0x90,0xb, 0x5d,0xe0,0xff,0x41,0x67,0xa8,0x18,0xe6,0xff, +0xc3,0x94,0x10,0x40,0x1b,0xef,0x94,0x26,0x50,0x16,0xe5,0xd, 0x2f,0xf5,0x82,0xe4, +0x35,0xc, 0xf5,0x83,0xe5,0x82,0x24,0xf0,0xf5,0x82,0xe5,0x83,0x34,0xff,0x80,0x7f, +0xa8,0x18,0xe6,0xff,0xc3,0x94,0x50,0x40,0x14,0xef,0xd3,0x94,0x77,0x50,0xe, 0x74, +0xab,0x2f,0x91,0x5c,0xe0,0xff,0x7d,0x78,0x12,0x0, 0x26,0x80,0x6a,0xa8,0x18,0xe6, +0xff,0xc3,0x94,0x78,0x40,0x10,0xef,0xd3,0x94,0x9f,0x50,0xa, 0x74,0x9f,0x2f,0xf5, +0x82,0xe4,0x34,0xa, 0x80,0x49,0xa8,0x18,0xe6,0xff,0xc3,0x94,0xa0,0x40,0x10,0xef, +0xd3,0x94,0xbe,0x50,0xa, 0x74,0x93,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x30,0xa8, +0x18,0xe6,0xff,0xc3,0x94,0xbf,0x40,0x10,0xef,0xd3,0x94,0xd2,0x50,0xa, 0x74,0x84, +0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x17,0xa8,0x18,0xe6,0xff,0xc3,0x94,0xd3,0x40, +0x14,0xef,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x7e,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0xe0,0xff,0x80,0x2, 0x7f,0xff,0x5, 0x18,0x22,0x75,0xe, 0xc, 0x75,0xf, 0x8d, +0x22,0x75,0xe, 0xc, 0x75,0xf, 0x73,0x22,0xe0,0xff,0x11,0x94,0x8f,0x95,0x22,0xff, +0x11,0x94,0xef,0x64,0x10,0x22,0x90,0xc, 0xa7,0xe0,0xff,0x90,0xc, 0xad,0xe0,0x2f, +0x22,0x15,0x18,0xa8,0x18,0xa6,0x7, 0xa8,0x18,0xe6,0x22,0x8f,0x69,0x8d,0x6a,0xe5, +0x69,0xc3,0x94,0x80,0x40,0xe, 0xe5,0x69,0xd3,0x94,0xbf,0x50,0x7, 0xe5,0x69,0x24, +0x80,0xff,0x80,0x33,0xe5,0x69,0x24,0x4, 0x60,0x29,0x24,0xfc,0x70,0x2b,0x91,0x64, +0xb4,0x4, 0xf, 0x90,0xc, 0x59,0xe0,0x7d,0x3, 0xb4,0x3, 0x2, 0x80,0xd, 0x7f,0x27, +0x80,0x15,0x90,0xc, 0x59,0xe0,0x7d,0x1, 0xb4,0x3, 0x4, 0x7f,0x1, 0x80,0xb, 0x7f, +0x27,0x80,0x4, 0xad,0x6a,0x7f,0x27,0x91,0x7a,0x22,0x8d,0x6b,0xef,0xc3,0x94,0xa, +0x50,0xa, 0x74,0xd1,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0x80,0x34,0xef,0x24,0xf6,0xf5, +0x6c,0xc3,0x94,0x46,0x74,0x80,0x94,0x81,0x50,0x2b,0xe5,0x6c,0xb4,0x4f,0x3, 0x2, +0x37,0x73,0xe5,0x6c,0xc3,0x94,0x10,0x40,0x15,0xe5,0x6c,0xd3,0x94,0x23,0x50,0xe, +0x7d,0x78,0xaf,0x6b,0x12,0x6, 0xd5,0x71,0x36,0xf5,0x83,0xef,0xf0,0x22,0x71,0x36, +0xf5,0x83,0xe5,0x6b,0xf0,0x22,0x74,0xeb,0x25,0x6c,0xf5,0x82,0xe4,0x34,0xa, 0x22, +0x8f,0x69,0x8d,0x6a,0xe5,0x69,0x14,0x60,0x3c,0x14,0x60,0x50,0x24,0xf2,0x50,0x63, +0x24,0xc4,0x60,0x6a,0x24,0xfe,0x60,0x70,0x14,0x60,0x72,0x24,0x65,0x60,0x64,0x24, +0xea,0x70,0x6d,0x91,0x64,0x64,0x4, 0x60,0xd, 0x90,0xc, 0x59,0xe0,0x7d,0x1, 0xb4, +0x3, 0x2, 0x80,0x2f,0x80,0xb, 0x90,0xc, 0x59,0xe0,0x7d,0x3, 0xb4,0x3, 0x2, 0x80, +0x22,0x7f,0x27,0x81,0x7a,0x90,0xc, 0xaa,0xe5,0x6a,0xf0,0xe0,0x75,0xf0,0x20,0xa4, +0xae,0xf0,0x25,0x11,0xf5,0xd, 0xee,0x35,0x10,0xf5,0xc, 0x22,0xe5,0x6a,0xb4,0x4, +0x6, 0x7d,0x4, 0x7f,0x1, 0x80,0xa, 0xe5,0x6a,0x64,0x5, 0x60,0x2, 0x81,0x5b,0xfd, +0xff,0x41,0xea,0x74,0xe8,0x25,0x69,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x47,0x90,0xa, +0xf8,0x81,0x58,0x90,0xc, 0xda,0x81,0x58,0x90,0xb, 0x5d,0x81,0x58,0x2, 0x37,0x73, +0xe5,0x69,0xc3,0x94,0x50,0x40,0x17,0xe5,0x69,0xd3,0x94,0x77,0x50,0x10,0x7d,0x78, +0xaf,0x6a,0x12,0x6, 0xd5,0x74,0xab,0x25,0x69,0x91,0x5c,0xef,0xf0,0x22,0xe5,0x69, +0xc3,0x94,0x78,0x40,0x14,0xe5,0x69,0xd3,0x94,0x9f,0x50,0xd, 0x74,0x9f,0x25,0x69, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x4f,0xe5,0x69,0xc3,0x94,0xa0,0x40,0x14, +0xe5,0x69,0xd3,0x94,0xbe,0x50,0xd, 0x74,0x93,0x25,0x69,0xf5,0x82,0xe4,0x34,0xa, +0xf5,0x83,0x80,0x34,0xe5,0x69,0xc3,0x94,0xbf,0x40,0x14,0xe5,0x69,0xd3,0x94,0xd2, +0x50,0xd, 0x74,0x84,0x25,0x69,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x19,0xe5, +0x69,0xc3,0x94,0xd3,0x40,0x15,0xe5,0x69,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x7e,0x25, +0x69,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe5,0x6a,0xf0,0x22,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0x22,0x7b,0x1, 0x7a,0xc, 0x79,0xac,0xe5,0x6a,0x12,0x1, 0xc5,0x53, +0x6a,0x70,0xe5,0x6a,0xc4,0x54,0xf, 0xf5,0x6a,0x22,0xef,0xd3,0x94,0x3f,0x50,0x31, +0xef,0x24,0xfd,0x60,0x2c,0x14,0x60,0x29,0x24,0xe1,0x60,0x25,0x24,0xfd,0x60,0x21, +0x24,0xfe,0x60,0x1d,0x24,0xf9,0x60,0x19,0x24,0xfe,0x60,0x15,0x80,0x0, 0x74,0x32, +0x2f,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xed,0xf0,0x90,0xc, 0x72,0xe0,0x44,0x1, +0xf0,0x22,0x90,0xc, 0xa9,0xf0,0x90,0xc, 0xa8,0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82, +0xc2,0x93,0x90,0xc, 0xa7,0xe4,0xf0,0x91,0xb2,0xf0,0xd0,0x82,0xd0,0x83,0xd0,0xe0, +0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, +0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xe5,0xc9, +0x54,0x3, 0xff,0xbf,0x1, 0x6, 0x53,0xc9,0xfc,0x43,0xc9,0x2, 0x11,0x11,0x30,0x95, +0x2, 0xc2,0x95,0x30,0x94,0x2, 0xc2,0x94,0x90,0xc, 0xa8,0x74,0x1, 0xf0,0xd0,0x7, +0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0, +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0xc, 0xd2,0x74,0x3, 0xf0,0xe4, +0x90,0xc, 0xd9,0xf0,0x90,0xc, 0xd1,0x74,0xff,0xf0,0x90,0xc, 0xda,0x74,0x1, 0xf0, +0x22,0xf1,0x4d,0xe4,0xf5,0x2e,0x12,0x5, 0x4c,0xaf,0x1, 0x8a,0x30,0x8f,0x31,0x12, +0x17,0x15,0xf1,0xa, 0x20,0xe0,0x10,0x13,0x13,0x54,0x3f,0x20,0xe0,0x9, 0xf1,0xa, +0xc3,0x13,0x20,0xe0,0x2, 0xc1,0xe4,0x20,0x2, 0x8, 0x75,0x2c,0xc, 0x75,0x2d,0x73, +0x80,0x6, 0x75,0x2c,0xc, 0x75,0x2d,0x8d,0xe4,0xf5,0x28,0xd1,0xf8,0x74,0xff,0xf0, +0x5, 0x28,0xe5,0x28,0xb4,0x1a,0xf4,0xf1,0x10,0x74,0xaa,0xf0,0xa3,0xf0,0xf1,0x10, +0xa3,0xa3,0x74,0x1a,0xf0,0x12,0x17,0x15,0x90,0x0, 0x49,0x12,0x1, 0x65,0xff,0xe5, +0x2d,0x24,0x4, 0xd1,0xfc,0xef,0xf0,0xe4,0xf5,0x2f,0xf5,0x28,0x12,0x16,0xfa,0x12, +0x1, 0x4c,0xff,0xe5,0x28,0xc3,0x9f,0x40,0x2, 0xc1,0x89,0xe5,0x28,0x12,0x1c,0x5b, +0xf1,0x4, 0x54,0xf0,0xff,0xd3,0x94,0x0, 0x40,0x29,0xef,0x64,0xb0,0x60,0x2, 0xc1, +0x85,0xf1,0x18,0xff,0xe9,0x24,0x7, 0xf9,0xe4,0x3a,0xfa,0x12,0x1, 0x4c,0x54,0xf, +0x12,0x1, 0xc5,0xab,0x22,0xe5,0x24,0x2f,0x12,0x1c,0x63,0xf1,0x1f,0x64,0x1, 0x60, +0x2, 0xc1,0x85,0xe5,0x28,0x12,0x1c,0x5b,0xf1,0x1f,0x64,0x3, 0x70,0x2, 0xc1,0x85, +0xe5,0x2f,0x25,0xe0,0x25,0xe0,0xf5,0x29,0x90,0x0, 0x3, 0xf1,0x3d,0x24,0x5, 0xd1, +0xe9,0xef,0xf0,0xe5,0x29,0x24,0x6, 0xd1,0xe9,0xe5,0x2b,0xf0,0xe5,0x28,0x12,0x1c, +0x5b,0x90,0x0, 0x5, 0xf1,0x3d,0x24,0x7, 0xd1,0xe9,0xef,0xf0,0xe5,0x29,0x24,0x8, +0xd1,0xe9,0xe5,0x2b,0xf1,0x17,0x12,0x1c,0x61,0xf1,0x4, 0xc4,0x54,0xf0,0xff,0xe5, +0x29,0x24,0x7, 0xd1,0xe9,0xe0,0x2f,0xf1,0x17,0x12,0x1c,0x61,0xf1,0x4, 0xff,0xf4, +0x60,0x1b,0xf1,0x26,0xff,0x64,0x1, 0x60,0x2, 0x5, 0x2e,0xef,0xc4,0x33,0x33,0x54, +0xc0,0xff,0xe5,0x29,0x24,0x5, 0xd1,0xe9,0xe0,0x2f,0xf0,0x80,0x16,0xe5,0x29,0x24, +0x5, 0xff,0xe4,0x33,0xfe,0xe5,0x2d,0x2f,0xf5,0x82,0xe5,0x2c,0x3e,0xf5,0x83,0xe0, +0x24,0xc0,0xf0,0x5, 0x2f,0x5, 0x28,0xa1,0xac,0xf1,0x10,0xa3,0xa3,0xa3,0xe5,0x2e, +0xf0,0xe5,0x2d,0x24,0x19,0xd1,0xfc,0xe4,0xf0,0xf5,0x28,0xe5,0x2d,0x24,0x19,0xd1, +0xfc,0xc0,0x83,0xc0,0x82,0xe0,0xff,0xd1,0xf8,0xe0,0xfe,0xef,0x6e,0xd0,0x82,0xd0, +0x83,0xf0,0x5, 0x28,0xe5,0x28,0xb4,0x19,0xe2,0xb2,0x2, 0x7f,0x1, 0x12,0x37,0x84, +0x12,0x17,0x15,0xf1,0xa, 0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x9, 0xaa,0x30,0xa9, +0x31,0x7b,0x1, 0x12,0x59,0x14,0xf1,0x54,0xf1,0x62,0x54,0xfb,0x12,0x1, 0xc5,0x54, +0xfd,0x2, 0x1, 0xc5,0xe4,0xff,0x2, 0x37,0x84,0xfd,0xe4,0x33,0xfc,0xe5,0x2d,0x2d, +0xf5,0x82,0xe5,0x2c,0x3c,0xf5,0x83,0x22,0xe5,0x2d,0x25,0x28,0xf5,0x82,0xe4,0x35, +0x2c,0xf5,0x83,0x22,0x90,0x0, 0x7, 0x2, 0x1, 0x65,0x90,0x0, 0x4f,0x2, 0x1, 0x65, +0x85,0x2d,0x82,0x85,0x2c,0x83,0x22,0xf0,0xe5,0x28,0x75,0xf0,0x7, 0xa4,0x22,0x90, +0x0, 0x7, 0x12,0x1, 0x65,0xff,0xe5,0x31,0x24,0x23,0xf5,0x82,0xe4,0x35,0x30,0xf5, +0x83,0xe5,0x82,0x2f,0xf5,0x82,0xe4,0x35,0x83,0xf5,0x83,0xe0,0x22,0x12,0x2, 0xb7, +0xf5,0x2b,0x85,0xf0,0x2a,0xe5,0x2a,0x54,0xf, 0xff,0xe5,0x29,0x22,0x8b,0x22,0x8a, +0x23,0x89,0x24,0x22,0xab,0x22,0xe5,0x24,0x24,0x4f,0xf9,0xe4,0x35,0x23,0x22,0xf9, +0xe4,0x3a,0xfa,0x12,0x1, 0x4c,0x54,0xfe,0x2, 0x1, 0xc5,0xf1,0x4d,0x78,0x25,0x7c, +0x0, 0x7d,0x0, 0x7b,0xff,0x7a,0xf, 0x79,0xba,0x7e,0x0, 0x7f,0xc, 0x12,0x17,0x12, +0xe4,0x12,0x1, 0xc5,0xe5,0x24,0x24,0x5, 0xf9,0xe4,0x35,0x23,0xa8,0x1, 0xfc,0xad, +0x22,0x7b,0x0, 0x7a,0x0, 0x79,0x25,0x7e,0x0, 0x7f,0xc, 0x2, 0x1, 0x26,0x75,0x45, +0x0, 0x75,0x46,0x0, 0x75,0x47,0x2f,0x75,0x48,0x13,0x75,0x49,0x78,0x7b,0xff,0x7a, +0xf, 0x79,0x35,0x12,0x8, 0x0, 0xe4,0xff,0xfe,0x12,0x40,0xce,0x8f,0x2e,0x90,0xc, +0x52,0xe0,0x70,0x3, 0x75,0x2e,0xff,0xe5,0x2e,0xf4,0x60,0x4c,0x7f,0xf0,0x7e,0x3, +0x12,0x40,0xce,0x8f,0x2a,0x7f,0xf1,0x7e,0x3, 0x12,0x40,0xce,0x8f,0x2b,0xe5,0x2a, +0x45,0x2b,0xf4,0x60,0x3, 0x75,0x2e,0xff,0xe4,0xf5,0x2b,0xf5,0x2c,0xf5,0x2d,0xe5, +0x2d,0x24,0x4, 0xff,0xe4,0x35,0x2c,0xfe,0x12,0x40,0xce,0xef,0x62,0x2b,0x5, 0x2d, +0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0xc3,0x94,0x46,0xe5,0x2c,0x94,0x1, 0x40,0xe0,0xe5, +0x2a,0x65,0x2b,0x60,0x3, 0x75,0x2e,0xff,0x90,0xa, 0xeb,0x74,0x13,0xf0,0x74,0xb, +0x51,0x41,0x90,0xb, 0x5d,0x74,0x3, 0xf0,0xe4,0x90,0xa, 0xee,0xf0,0xa3,0x74,0x28, +0xf0,0x90,0xa, 0xf9,0xf1,0x1f,0x90,0xb, 0x5e,0xd1,0xff,0xe4,0xff,0x90,0xa, 0xeb, +0xe0,0xfe,0xef,0xc3,0x9e,0x40,0xb, 0x74,0xfb,0x2f,0x12,0x27,0x4f,0x74,0xff,0xf0, +0x80,0xe, 0x74,0x2f,0x2f,0xf8,0xe6,0xfe,0x74,0xfb,0x2f,0x12,0x27,0x4f,0xee,0xf0, +0xef,0x90,0xf, 0x53,0x93,0xfe,0x74,0x17,0x2f,0xf1,0x5e,0xee,0xf0,0xf, 0xbf,0x1c, +0xcc,0xe4,0xff,0xef,0x90,0xf, 0x7f,0x93,0xfe,0x74,0x43,0x2f,0x31,0x6d,0xee,0xf0, +0xf, 0xbf,0xe, 0xef,0xe4,0xff,0xef,0x90,0xf, 0x6f,0x93,0xfe,0x74,0x33,0x2f,0xf1, +0x17,0xee,0xf0,0xf, 0xbf,0x10,0xef,0xe4,0xff,0xef,0x90,0xf, 0x8d,0x93,0xfe,0x74, +0x51,0x2f,0x12,0x35,0xca,0xee,0xf0,0xf, 0xbf,0x8, 0xee,0xe4,0xf5,0x2c,0xf5,0x2d, +0x74,0x60,0x25,0x2d,0xf1,0x45,0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x64,0xd1, +0x45,0x2c,0x70,0xec,0xe5,0x2e,0xf4,0x60,0x4, 0x7f,0x4, 0x11,0xea,0x22,0xf1,0xf, +0xe4,0xfd,0xf1,0x31,0xed,0xc4,0x54,0xf0,0xf5,0xf8,0x8a,0xf9,0x8b,0xfa,0x43,0xfc, +0x3, 0x44,0xe0,0xf5,0xf8,0xaf,0xfb,0x2, 0x33,0xd2,0x8f,0x42,0x75,0x43,0xb, 0x75, +0x44,0x51,0x31,0x4f,0x31,0x27,0x70,0x2, 0x5, 0x43,0x31,0x43,0x70,0x2, 0x5, 0x45, +0xc3,0x94,0x8, 0xe5,0x45,0x94,0x0, 0x40,0xeb,0x75,0x43,0xb, 0x75,0x44,0x60,0x31, +0x4f,0x31,0x27,0x70,0x2, 0x5, 0x43,0x31,0x43,0x70,0x2, 0x5, 0x45,0xc3,0x94,0xd1, +0xe5,0x45,0x94,0x0, 0x40,0xeb,0x22,0x7e,0x0, 0xe5,0x46,0x25,0x42,0xff,0xee,0x35, +0x45,0xfe,0xe5,0x48,0x2f,0xff,0xe5,0x47,0x3e,0xfe,0x11,0xce,0x5, 0x44,0xe5,0x44, +0xac,0x43,0x22,0x14,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x5, 0x46,0xe5,0x46,0x22,0x75, +0x47,0xa, 0x75,0x48,0xeb,0xc3,0xe5,0x44,0x95,0x48,0xff,0xe5,0x43,0x95,0x47,0xf5, +0x47,0x8f,0x48,0xe4,0xf5,0x45,0xf5,0x46,0x22,0xc3,0x13,0x24,0x43,0xf5,0x82,0xe4, +0x34,0xb, 0xf5,0x83,0x22,0x85,0xe6,0x21,0xe4,0xf5,0x22,0x75,0x99,0x1, 0xd2,0x98, +0x7f,0x2, 0x7e,0x78,0x11,0xd0,0x8f,0x23,0x7f,0x3, 0x7e,0x78,0x11,0xd0,0xe5,0x23, +0xf4,0x60,0xa, 0xe5,0x23,0x6f,0xff,0xbf,0xff,0x3, 0x85,0x23,0x22,0xe5,0x21,0xb4, +0xff,0x3, 0x75,0x21,0x6a,0xe5,0x22,0xb4,0x1, 0xf, 0xe5,0x21,0x64,0x6a,0x60,0x18, +0xe5,0x21,0xb4,0x6b,0x2, 0x80,0x11,0x80,0xb, 0xe5,0x21,0x64,0x6a,0x60,0x5, 0xe5, +0x21,0xb4,0x6b,0x4, 0x53,0xea,0x7f,0x22,0x43,0xea,0x80,0x22,0x51,0x3d,0x7f,0x1, +0xf1,0x66,0x31,0x75,0xf1,0x8d,0xd1,0xef,0x7f,0x1, 0xef,0x70,0x3, 0xc2,0xaf,0x22, +0xd2,0xaf,0x22,0x75,0x33,0x70,0x75,0x90,0x4, 0x75,0x33,0x70,0x7f,0x0, 0x7e,0x78, +0x11,0xd0,0x8f,0x34,0x7f,0x1, 0x7e,0x78,0x11,0xd0,0xe5,0x34,0xf4,0x60,0x1c,0xe5, +0x34,0x6f,0xff,0xbf,0xff,0x15,0xe5,0x34,0xc3,0x94,0x60,0x40,0xe, 0xe5,0x34,0xd3, +0x94,0x7f,0x50,0x7, 0xe5,0x34,0x20,0xe0,0x2, 0xf5,0x33,0xe5,0x33,0xc3,0x13,0x54, +0xf, 0xc4,0x54,0xf0,0xf5,0x93,0xd2,0xac,0x53,0xe8,0x3f,0x43,0xe8,0xc0,0xd2,0xec, +0xd2,0xb9,0xc2,0xc1,0x43,0xb9,0x10,0x53,0xa9,0xef,0x22,0x80,0xa6,0x53,0xdb,0xbf, +0x22,0xa3,0xf0,0xa3,0x74,0x1, 0xf0,0x22,0x12,0x3f,0x4d,0x90,0xc, 0x32,0x74,0x16, +0xf0,0xa3,0x74,0x3c,0xf0,0xe4,0x90,0xc, 0x35,0xf0,0xa3,0x74,0x6, 0xf0,0xa3,0x74, +0xbb,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0x74,0x6, 0xf0,0xa3,0x74, +0x28,0xf0,0xd1,0xe8,0x90,0xc, 0x55,0x74,0x55,0xf0,0xa3,0x74,0x1, 0xf0,0xe4,0xa3, +0xf0,0x74,0x2c,0x51,0x41,0xa3,0x74,0x5a,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0xc, +0x61,0x74,0x5, 0xf0,0x90,0xc, 0x60,0x74,0x96,0xf0,0x90,0xc, 0x65,0x74,0x64,0xf0, +0xa3,0x74,0x28,0xf0,0xd1,0x90,0x90,0xc, 0x63,0xef,0xf0,0x12,0x16,0xfa,0xe4,0x12, +0x1, 0xc5,0x12,0x16,0xfa,0x4, 0xd1,0xdc,0x90,0x0, 0x8, 0xe4,0x12,0x1, 0xd7,0x74, +0x10,0x71,0xa8,0x74,0x6, 0xd1,0x54,0x90,0x0, 0x5, 0x74,0x28,0x12,0x1, 0xd7,0x90, +0x0, 0x6, 0x74,0x28,0x12,0x1, 0xd7,0x74,0xa, 0xd1,0xe2,0x90,0x0, 0x9, 0x74,0x1, +0x12,0x1, 0xd7,0x12,0x17,0x15,0xe4,0x75,0xf0,0x5a,0x12,0x3, 0x3c,0x12,0x17,0x15, +0x90,0x0, 0x2, 0x74,0x16,0x12,0x1, 0xd7,0x90,0x0, 0x3, 0xe4,0x75,0xf0,0x3c,0x12, +0x3, 0x5b,0x90,0x0, 0x22,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x15,0x74,0x3, 0x12,0x1, +0xd7,0x90,0x0, 0x16,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x1a,0xe4,0x12,0x1, 0xd7, +0x90,0x0, 0x1b,0x74,0x12,0x12,0x1, 0xd7,0x90,0x0, 0x17,0xe4,0x12,0x1, 0xd7,0x90, +0x0, 0x1c,0xe4,0x75,0xf0,0xfa,0x12,0x3, 0x5b,0x90,0x0, 0x1e,0x74,0xa, 0x12,0x1, +0xd7,0x90,0x0, 0x1f,0x74,0x5, 0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74,0x23,0x12,0x1, +0xd7,0xf1,0x4f,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x11,0xe4,0x12,0x1, 0xd7,0x90, +0x0, 0x12,0x74,0x4, 0x12,0x1, 0xd7,0x90,0x0, 0x13,0x71,0xa1,0x90,0x0, 0xb, 0x71, +0xa1,0x90,0x0, 0xd, 0x74,0x28,0x12,0x1, 0xd7,0x12,0x16,0x49,0x74,0x5, 0x12,0x1, +0xc5,0x12,0x16,0x49,0x90,0x0, 0x1, 0x74,0xb, 0x75,0xf0,0xb8,0x12,0x3, 0x5b,0x90, +0x0, 0x3, 0x74,0xbb,0x12,0x1, 0xd7,0x90,0x0, 0x4, 0xe4,0x75,0xf0,0x96,0x2, 0x3, +0x5b,0xe4,0x75,0xf0,0x64,0x2, 0x3, 0x5b,0x90,0x0, 0x3, 0x2, 0x1, 0xd7,0x12,0x3f, +0x4d,0x75,0x2b,0xc, 0x75,0x2c,0x32,0x90,0xc, 0x72,0xe0,0x20,0xe0,0x2, 0xa1,0x1a, +0x54,0xfe,0xf0,0x90,0x0, 0x2, 0x12,0x1, 0x65,0xff,0xb1,0x35,0xe0,0x6f,0x60,0x15, +0xe0,0xff,0x90,0x0, 0x2, 0x12,0x1, 0xd7,0xef,0x75,0xf0,0x4, 0xa4,0xff,0xe5,0xf0, +0x8f,0xf0,0x12,0x3, 0x3c,0x12,0x17,0x15,0x90,0x0, 0x3, 0x12,0x2, 0xb7,0xff,0xb1, +0x35,0xa3,0xe0,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, 0x3, +0xb1,0x2f,0x12,0x16,0x49,0x90,0x0, 0x3, 0xb1,0x28,0x24,0x5, 0xb1,0x1f,0xfe,0x6f, +0x60,0x18,0xee,0x71,0xa8,0xe5,0x2c,0x24,0x5, 0xb1,0x1f,0x75,0xf0,0x20,0xa4,0xff, +0x90,0x0, 0x1, 0xe5,0xf0,0x8f,0xf0,0x12,0x3, 0x5b,0x12,0x16,0x49,0x90,0x0, 0x4, +0xd1,0x4d,0x24,0x2e,0xb1,0x1f,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, +0x90,0x0, 0x4, 0xb1,0x2f,0x12,0x16,0xfa,0x12,0x1, 0x4c,0xff,0xe5,0x2c,0x24,0x25, +0xb1,0x1f,0xfe,0x6f,0x60,0x4, 0xee,0x12,0x1, 0xc5,0x12,0x17,0xbb,0xff,0xe5,0x2c, +0x24,0x6, 0xb1,0x1f,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x1, 0xee,0x12,0x1, 0xd7,0x12, +0x1f,0x9, 0xff,0xe5,0x2c,0x24,0x8, 0xb1,0x1f,0xfe,0x6f,0x60,0x20,0xee,0xd1,0x54, +0xe5,0x2c,0x24,0x8, 0xb1,0x1f,0xc3,0x94,0xf, 0x40,0x6, 0xe5,0x2c,0x24,0x8, 0xd1, +0x5a,0xe5,0x2c,0x24,0x8, 0xb1,0x1f,0x90,0x6, 0xf8,0x93,0x71,0xa8,0x12,0x16,0xfa, +0x90,0x0, 0x6, 0xb1,0x28,0x24,0x9, 0xb1,0x1f,0xfe,0x6f,0x60,0x13,0x90,0x0, 0x6, +0xee,0x12,0x1, 0xd7,0xe5,0x2c,0x24,0x9, 0xb1,0x1f,0x90,0x0, 0x5, 0x12,0x1, 0xd7, +0x12,0x16,0xfa,0x12,0x3f,0x4, 0xff,0xb1,0x1b,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x7, +0xee,0x12,0x1, 0xd7,0x90,0x0, 0x9, 0xb1,0x28,0x24,0x24,0xb1,0x1f,0xfe,0x6f,0x60, +0x7, 0x90,0x0, 0x9, 0xee,0x12,0x1, 0xd7,0x12,0x17,0x15,0x90,0x0, 0xb, 0xd1,0x4d, +0x24,0x33,0xb1,0x1f,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, +0xb, 0xb1,0x2f,0x12,0x17,0x15,0x90,0x0, 0xd, 0xb1,0x28,0x24,0x34,0xb1,0x1f,0xfe, +0x6f,0x60,0x7, 0x90,0x0, 0xd, 0xee,0x12,0x1, 0xd7,0x22,0xe5,0x2c,0x24,0x7, 0xf5, +0x82,0xe4,0x35,0x2b,0xf5,0x83,0xe0,0x22,0x12,0x1, 0x65,0xff,0xe5,0x2c,0x22,0xec, +0x8d,0xf0,0x2, 0x3, 0x5b,0x85,0x2c,0x82,0x85,0x2b,0x83,0x22,0x12,0x3f,0x4d,0xe4, +0xf5,0x2a,0xe5,0x2a,0xc3,0x94,0x5, 0x50,0x13,0xe5,0x27,0x24,0x30,0xf9,0xe4,0x35, +0x26,0xfa,0xe5,0x2a,0x75,0xf0,0x8, 0x12,0x17,0xd5,0x80,0x14,0xe5,0x2a,0x75,0xf0, +0x8, 0xa4,0x24,0x30,0xff,0xe4,0x35,0xf0,0xfe,0xe5,0x27,0x2f,0xf9,0xe5,0x26,0x3e, +0xaf,0x1, 0xf5,0x2b,0x8f,0x2c,0xb1,0x1b,0x64,0x2, 0x60,0x2, 0xc1,0x42,0xe5,0x2c, +0x24,0x7, 0xd1,0x5a,0xb1,0x35,0xa3,0xa3,0xe0,0x24,0xfe,0xf5,0x28,0xb1,0x35,0xa3, +0xa3,0xe0,0x24,0x2, 0xff,0xe4,0xad,0x28,0xd1,0x7d,0x40,0x2, 0xc1,0x42,0xb1,0x35, +0xa3,0xe0,0x24,0xfe,0xf5,0x29,0xb1,0x35,0xa3,0xe0,0x24,0x2, 0xff,0xe4,0x33,0xfe, +0xad,0x29,0xd1,0x7f,0x40,0x2, 0xc1,0x3e,0xc3,0xe5,0x28,0x64,0x80,0x94,0x80,0x40, +0x79,0xe5,0x28,0x64,0x80,0x94,0x9c,0x50,0x71,0xc3,0xe5,0x29,0x64,0x80,0x94,0x80, +0x40,0x68,0xe5,0x29,0x64,0x80,0x94,0x90,0x50,0x60,0xf1,0x27,0xd1,0x64,0x78,0x5, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xd1,0xf7,0x12,0x37, +0x3a,0x12,0x2, 0x8c,0xfd,0xaf,0x28,0xf1,0x79,0xab,0x29,0xeb,0x33,0x95,0xe0,0xfa, +0xef,0x2b,0xff,0xee,0x3a,0xd1,0x76,0x33,0x12,0x17,0x15,0x8f,0x82,0xf5,0x83,0xe5, +0xf0,0x8d,0xf0,0x12,0x2, 0xef,0xe9,0x24,0x80,0xf9,0xea,0xd1,0x64,0x78,0x5, 0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xaf,0x29,0xd1,0x72,0x33, +0xfe,0x12,0x37,0x3a,0xe4,0xf5,0xf0,0x12,0x3, 0x3c,0x5, 0x29,0xa1,0xa6,0x5, 0x28, +0xa1,0x8d,0x5, 0x2a,0xe5,0x2a,0x64,0xa, 0x60,0x2, 0xa1,0x42,0x22,0x12,0x2, 0xb7, +0xff,0xe5,0x2c,0x22,0x90,0x0, 0x4, 0x2, 0x1, 0xd7,0xf5,0x82,0xe4,0x35,0x2b,0xf5, +0x83,0xe4,0xf0,0x22,0x34,0x3, 0xfa,0xaf,0x28,0xef,0x33,0x95,0xe0,0xfe,0xef,0x22, +0xaf,0x3a,0xef,0x33,0x95,0xe0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x22,0x33,0xfe,0xed, +0x33,0x95,0xe0,0xfc,0xd3,0xed,0x9f,0xee,0x64,0x80,0xf8,0xec,0x64,0x80,0x98,0x22, +0x7f,0x6, 0x7e,0x0, 0xd1,0xcd,0x8f,0x2b,0x7f,0x1e,0x7e,0x0, 0xd1,0xcd,0xe5,0x2b, +0xb4,0x6d,0x3, 0x7f,0x2, 0x22,0xe5,0x2b,0xb4,0x6e,0x3, 0x7f,0x3, 0x22,0xe5,0x2b, +0xb4,0x6f,0x9, 0xbf,0xff,0x3, 0x7f,0x2, 0x22,0x7f,0x3, 0x22,0xe5,0x2b,0xb4,0x67, +0x9, 0xbf,0xff,0x3, 0x7f,0x4, 0x22,0x7f,0x5, 0x22,0x7f,0x0, 0x22,0xf1,0x3b,0x75, +0xf8,0x10,0xf1,0x7, 0x75,0xf8,0xf0,0xaf,0xfb,0x2, 0x33,0xd2,0x90,0x0, 0x1, 0x2, +0x1, 0xd7,0x90,0x0, 0x7, 0x2, 0x1, 0xd7,0x90,0xc, 0x52,0x74,0xff,0xf0,0x22,0x75, +0x92,0xe8,0xd2,0xae,0xd2,0xbe,0x22,0xed,0x25,0xe0,0xff,0xec,0x33,0xfe,0x22,0x74, +0x3, 0xf0,0xa3,0x74,0xe8,0xf0,0x22,0x8c,0xf9,0x8d,0xfa,0x43,0xfc,0x3, 0x22,0xe4, +0x2f,0xff,0xee,0x34,0x7c,0xfe,0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x74, +0x21,0xf0,0xa3,0x74,0x34,0xf0,0x22,0xab,0x22,0xe5,0x24,0x24,0x80,0xf9,0xe5,0x23, +0x22,0xab,0x7, 0xaa,0x6, 0xc2,0xaf,0x43,0xfc,0x3, 0x22,0xad,0x7, 0xac,0x6, 0xc2, +0xaf,0x43,0xfc,0x3, 0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0xe4,0xf0,0x22,0x90, +0x0, 0xf, 0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x10,0x22,0x74,0x17,0x25,0x2d,0xf5,0x82, +0xe4,0x34,0xb, 0xf5,0x83,0x22,0x53,0xc9,0xf8,0xef,0x70,0x5, 0x43,0xc9,0x3, 0x80, +0x3, 0x43,0xc9,0x2, 0xc2,0xce,0xc2,0xca,0x22,0xef,0x33,0x95,0xe0,0xfe,0xef,0xc4, +0xf8,0x54,0xf, 0xc8,0x68,0xff,0xee,0xc4,0x54,0xf0,0x48,0xfe,0x22,0xe4,0xff,0xa2, +0xaf,0x33,0xfe,0xc2,0x88,0xd2,0xa8,0xc2,0xaf,0x30,0x89,0x6, 0xc2,0x89,0xe4,0xff, +0x80,0x1, 0xf, 0xef,0xd3,0x94,0xfa,0x40,0xf0,0xee,0x24,0xff,0x92,0xaf,0x75,0xf7, +0xff,0x22,0x8b,0x4a,0x8a,0x4b,0x89,0x4c,0x8d,0x4d,0x90,0xa, 0x3c,0x12,0x4, 0xfe, +0x0, 0x0, 0x0, 0x0, 0x90,0xa, 0x40,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x1, 0x75,0x5f, +0x1, 0x75,0x60,0xa, 0x75,0x61,0x48,0x12,0x66,0x52,0x90,0xa, 0xeb,0xe0,0xf5,0x4f, +0xa3,0xe0,0xf5,0x4e,0xe5,0x4d,0x70,0x3c,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x4f,0x50, +0x20,0x12,0x48,0x94,0xc0,0x0, 0xc0,0x1, 0xa3,0x12,0x4d,0xdc,0x74,0xfb,0x25,0x50, +0x12,0x27,0x4f,0xe0,0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0xd1,0x2f,0x80, +0xd9,0xe4,0xf5,0x50,0xb1,0xc4,0x78,0x8, 0x12,0x4, 0xcc,0xd1,0x3b,0xe5,0x50,0xb4, +0x4, 0xf2,0x80,0x3d,0xe4,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x4e,0x50,0x22,0x11,0x94, +0xc0,0x0, 0xc0,0x1, 0xa3,0xb1,0xdc,0x74,0x48,0x25,0x50,0xf5,0x82,0xe4,0x34,0xa, +0xf5,0x83,0xe0,0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0xd1,0x2f,0x80,0xd7, +0xe4,0xf5,0x50,0xb1,0xc4,0x78,0x8, 0x12,0x4, 0xcc,0xd1,0x3b,0xe5,0x50,0xb4,0x2, +0xf2,0xe5,0x4d,0x70,0x17,0xf5,0x50,0xd1,0xbe,0x24,0x75,0xd1,0xa7,0x12,0x26,0x2b, +0xef,0x12,0x1, 0xc5,0x5, 0x50,0xe5,0x50,0xb4,0x4, 0xec,0x22,0xe4,0xf5,0x50,0xd1, +0xbe,0x24,0x79,0xd1,0xa7,0x12,0x26,0x2b,0xef,0x12,0x1, 0xc5,0x5, 0x50,0xe5,0x50, +0xb4,0x2, 0xec,0x22,0x90,0xa, 0x3c,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3, +0xe0,0xfb,0x22,0x12,0x3f,0x4d,0xe4,0xf5,0x2e,0xf5,0x2f,0x12,0x66,0x70,0xf5,0x38, +0xf5,0x39,0xf5,0x3d,0xf5,0x3e,0x12,0x16,0x49,0x90,0x0, 0x13,0x12,0x2, 0xb7,0xf5, +0x45,0x85,0xf0,0x44,0x90,0x0, 0x22,0x12,0x1, 0x65,0xf5,0x48,0x12,0x47,0x29,0x34, +0x3, 0xaf,0x1, 0xf5,0x3f,0x8f,0x40,0xe5,0x24,0x24,0x60,0xf9,0xe5,0x23,0x34,0x7, +0xaf,0x1, 0xf5,0x41,0x8f,0x42,0xe4,0xf5,0x30,0xb1,0xa6,0x12,0x47,0x4f,0xe4,0x12, +0x1, 0xd7,0x5, 0x30,0xe5,0x30,0xb4,0x5, 0xf0,0xd1,0x7c,0x70,0x2, 0xa1,0xa5,0xe4, +0xf5,0x30,0xd1,0x7c,0xff,0xe5,0x30,0xc3,0x9f,0x40,0x2, 0x81,0x7f,0x12,0x11,0xc7, +0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0xd1,0xc, 0xf5,0x83,0x12,0x4, 0xfe,0x0, 0x0, +0x0, 0x0, 0xb1,0xeb,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0xd1,0x97,0x12,0x4, 0xfe, +0x0, 0x0, 0x0, 0x0, 0x90,0xa, 0x8c,0x74,0x2, 0xf0,0xf5,0xf0,0x12,0x16,0xe1,0x12, +0x1, 0x65,0x12,0x66,0x61,0x40,0xb, 0x12,0x16,0xfa,0x12,0x1, 0x4c,0x12,0x65,0xb6, +0x50,0x5, 0x12,0x16,0x49,0xf1,0xc0,0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12,0x17, +0xc1,0x12,0x66,0x61,0x40,0x8, 0x12,0x17,0xbb,0x12,0x65,0xb6,0x50,0x5, 0x12,0x16, +0x49,0xf1,0xc0,0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12,0x17,0xc1,0xc3,0x13,0xfd, +0x7c,0x0, 0x12,0x16,0xda,0x12,0x1, 0x65,0x12,0x62,0x51,0x2d,0xff,0xec,0x35,0xf0, +0xfe,0xe4,0xf5,0x43,0x12,0x16,0x33,0xf1,0xb5,0x40,0x3, 0x75,0x43,0x1, 0x12,0x16, +0xd8,0xd1,0x71,0xfe,0xc3,0xef,0x9e,0xf5,0x2e,0x12,0x16,0xd8,0xd1,0x71,0x2f,0xff, +0xe4,0x33,0xfe,0xad,0x2e,0x12,0x46,0x7f,0x40,0x2, 0x81,0x7b,0xe5,0x30,0x75,0xf0, +0x2, 0x12,0x17,0xd5,0xfa,0x12,0x17,0xc1,0xd1,0x74,0xfe,0xc3,0xef,0x9e,0xf5,0x2f, +0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12,0x17,0xc1,0xd1,0x74,0x2f,0xff,0xe4,0xad, +0x2f,0x12,0x46,0x7d,0x40,0x2, 0x81,0x77,0xc3,0xe5,0x2e,0x64,0x80,0x94,0x80,0x50, +0x2, 0x81,0x73,0x12,0x16,0xfa,0x12,0x1, 0x4c,0xad,0x2e,0xd1,0xaf,0x40,0x2, 0x81, +0x73,0xc3,0xe5,0x2f,0x64,0x80,0x94,0x80,0x50,0x2, 0x81,0x73,0x12,0x17,0xc1,0xff, +0xad,0x2f,0xd1,0xb0,0x40,0x2, 0x81,0x73,0xaf,0x2e,0x12,0x47,0x79,0xef,0x2d,0xf5, +0x3c,0xee,0x3c,0xf5,0x3b,0xe5,0x3c,0x25,0xe0,0xff,0xe5,0x3b,0x33,0xfe,0xe5,0x40, +0x2f,0xf5,0x82,0xe5,0x3f,0x12,0x55,0xad,0xff,0xc3,0x95,0x48,0xf5,0x47,0xee,0x94, +0x0, 0xf5,0x46,0xd3,0xe5,0x47,0x94,0x0, 0xe5,0x46,0x64,0x80,0x94,0x80,0x50,0x2, +0x81,0x73,0xef,0x95,0x45,0xee,0x95,0x44,0x40,0xa, 0xb1,0xa6,0x90,0x0, 0x10,0x74, +0x1, 0x12,0x1, 0x92,0xe5,0x43,0xb4,0x1, 0x2c,0xe5,0x3c,0xae,0x3b,0x78,0x3, 0xce, +0xc3,0x13,0xce,0x13,0xd8,0xf9,0x25,0x42,0xf5,0x82,0xe5,0x41,0x3e,0xf5,0x83,0xc0, +0x83,0xc0,0x82,0xe0,0xff,0x7c,0x0, 0xe5,0x3c,0x12,0x57,0x62,0xf4,0xfe,0xef,0x5e, +0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x2e,0x25,0xe0,0xf5,0x3d,0xe5,0x2f,0x25,0xe0,0xf5, +0x3e,0x12,0x16,0xd8,0xd1,0x88,0x60,0x77,0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12, +0x17,0xc1,0xd1,0x68,0x60,0x69,0x12,0x11,0xc7,0xc0,0x83,0xc0,0x82,0x11,0x97,0xc0, +0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xd1,0x44,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0, +0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0xd1,0x94,0xc0,0x83,0xc0,0x82,0x11,0x97,0xae, +0x46,0xd1,0x5, 0xeb,0x25,0x47,0xb1,0xb9,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xf2,0xd1, +0xc, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0, +0x3, 0x12,0x66,0x27,0xd1,0x54,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7, +0xd0,0x82,0xd0,0x83,0xf1,0xab,0x24,0x64,0xf5,0x82,0xe4,0x34,0xa, 0x81,0x5b,0xe4, +0xf5,0x3a,0xd1,0x7c,0xad,0x3a,0xd1,0xaf,0x50,0x51,0xe5,0x30,0x65,0x3a,0x60,0x47, +0xed,0x25,0xe0,0xff,0xec,0x33,0x8f,0x82,0xf5,0x83,0xd1,0x88,0x60,0x11,0x12,0x46, +0x70,0xf1,0xcd,0x12,0x17,0xc1,0xd1,0x68,0x60,0x5, 0x75,0x3a,0xff,0x80,0x2c,0x12, +0x46,0x70,0x33,0xd1,0x61,0x8f,0x82,0xf5,0x83,0x12,0x1, 0x65,0xfd,0x7b,0x4, 0xd1, +0x8e,0x60,0x14,0x12,0x46,0x70,0xf1,0xcd,0x12,0x17,0xc1,0xfd,0x7b,0x4, 0xd1,0x6b, +0x60,0x5, 0xe4,0xf5,0x3a,0x80,0x4, 0x5, 0x3a,0x80,0xa7,0xe5,0x3a,0x70,0x73,0xd1, +0xc, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0, +0x3, 0xae,0x46,0xaf,0x47,0xd1,0x5, 0xf1,0xda,0xaf,0x2e,0xd1,0x54,0xd0,0x3, 0xd0, +0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0x12,0x11,0xc4,0xc0,0x83, +0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xae,0x46,0xaf,0x47, +0xd1,0x5, 0xf1,0xda,0xd1,0x52,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7, +0xd0,0x82,0xd0,0x83,0xb1,0xe8,0xc0,0x83,0xc0,0x82,0x11,0x97,0xb1,0xfb,0xb1,0xb7, +0xd0,0x82,0xd0,0x83,0xd1,0x94,0xc0,0x83,0xc0,0x82,0x11,0x97,0xb1,0xfb,0xeb,0x2f, +0x80,0x78,0xe5,0x3a,0xf4,0x60,0x7c,0xd1,0xc, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11, +0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x12,0x66,0x27,0xd1,0x54,0xd0,0x3, +0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0x12,0x11,0xc4,0xc0, +0x83,0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xd1,0x44,0xd0, +0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0xb1,0xe8,0xc0, +0x83,0xc0,0x82,0x11,0x97,0xae,0x46,0xd1,0x5, 0xeb,0x25,0x47,0xb1,0xb9,0xd0,0x82, +0xd0,0x83,0xf1,0xab,0x24,0x78,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xc0,0x83,0xc0, +0x82,0x11,0x97,0xae,0x46,0xd1,0x5, 0xeb,0x25,0x47,0xb1,0xb9,0xd0,0x82,0xd0,0x83, +0x12,0x4, 0xf2,0x5, 0x2f,0x21,0xd0,0x5, 0x2e,0x21,0xa9,0x5, 0x30,0x21,0x2, 0xe4, +0xf5,0x30,0xd1,0x7c,0xff,0xe5,0x30,0xc3,0x9f,0x40,0x2, 0xa1,0x9b,0xe5,0x30,0x75, +0xf0,0x2, 0x12,0x17,0xd5,0xfa,0x12,0x17,0xc1,0xc3,0x13,0xfd,0x7c,0x0, 0x12,0x16, +0xda,0x12,0x1, 0x65,0x12,0x62,0x51,0x2d,0xff,0xec,0x35,0xf0,0xfe,0x12,0x16,0x33, +0xf1,0xb5,0x50,0x2, 0xa1,0x97,0x12,0x11,0xc7,0xc0,0x83,0xc0,0x82,0xb1,0xdc,0x78, +0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83,0xd1,0x94,0x11,0x97,0x12,0x11,0xc7,0xb1, +0xdc,0x12,0x4, 0x13,0xef,0x24,0x20,0xf5,0x32,0xe4,0x3e,0xf5,0x31,0xd1,0xc, 0xf5, +0x83,0xc0,0x83,0xc0,0x82,0xb1,0xdc,0x78,0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83, +0xb1,0xe8,0x11,0x97,0xd1,0xc, 0xf5,0x83,0xb1,0xdc,0x12,0x4, 0x13,0xef,0x24,0x20, +0xf5,0x36,0xe4,0x3e,0xf5,0x35,0xe5,0x39,0xb1,0xa8,0x90,0x0, 0xa, 0xe5,0x31,0x85, +0x32,0xf0,0x12,0x3, 0x5b,0x90,0x0, 0xc, 0xe5,0x35,0x85,0x36,0xf0,0x12,0x3, 0x5b, +0xb1,0xeb,0xc0,0x83,0xc0,0x82,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0x12,0x16,0x44,0x90, +0x0, 0x12,0x12,0x1, 0x65,0xf9,0xf8,0x12,0x4, 0xcc,0xd0,0x82,0xd0,0x83,0xb1,0xe8, +0xb1,0xdc,0xe4,0x7b,0x7f,0xfa,0xf9,0xf8,0xc3,0x12,0x4, 0xbb,0x50,0x9, 0xb1,0xeb, +0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x7f,0xb1,0xeb,0xa3,0xa3,0xa3,0xe0,0xfd,0xe5,0x39, +0xb1,0xa8,0x90,0x0, 0xf, 0xed,0x12,0x1, 0xd7,0xb1,0xa6,0x90,0x0, 0x10,0x12,0x1, +0x65,0xfd,0xe5,0x39,0x75,0xf0,0x7, 0xa4,0xb1,0xae,0x90,0x0, 0x10,0xed,0x12,0x47, +0x53,0x12,0x1, 0x65,0xd3,0x94,0xf, 0x40,0xc, 0xe5,0x39,0xb1,0xa8,0x90,0x0, 0x10, +0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x39,0x5, 0x30,0x81,0x82,0xd1,0x61,0x90,0x0, 0x2d, +0xe5,0x39,0x12,0x1, 0xd7,0x22,0xe5,0x30,0x75,0xf0,0x7, 0xa4,0xab,0x2b,0x25,0x2d, +0xf9,0xe5,0x2c,0x35,0xf0,0xfa,0x22,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xe9,0x3d,0xfd, +0xe8,0x3c,0xfc,0x22,0x90,0xa, 0x3c,0xa3,0xa3,0xa3,0xe0,0xff,0x74,0x44,0x25,0x50, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xef,0xf0,0x90,0xa, 0x3c,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x12,0x4, 0xf2,0xe5,0x30,0x25,0xe0,0x25, +0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xe5,0x46,0xa2,0xe7,0x13, +0xfe,0xe5,0x47,0x13,0xff,0xee,0x33,0x95,0xe0,0xfd,0xfc,0x22,0xe5,0x30,0x25,0xe0, +0x25,0xe0,0x24,0x50,0xf5,0x82,0xe4,0x34,0xa, 0x22,0x7e,0x0, 0x7c,0x0, 0x12,0x1f, +0x1d,0xeb,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x7f,0x0, 0x50,0x2, 0x7f,0x1, 0x22,0xeb, +0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d,0xfd,0xe8,0x4c,0xfc,0x90,0xa, 0x3c,0x12,0x4, +0xf2,0x5, 0x50,0x22,0xae,0x46,0xaf,0x47,0xab,0x7, 0xaa,0x6, 0xea,0x33,0x95,0xe0, +0xf9,0xf8,0xaf,0x2f,0xef,0x33,0x95,0xe0,0xfe,0xfd,0xfc,0x2, 0x3, 0x88,0x12,0x1, +0xc5,0xab,0x2b,0xaa,0x2c,0xa9,0x2d,0x22,0xfd,0x7b,0x2, 0xaf,0x3e,0xd1,0x1a,0xef, +0x22,0x12,0x1, 0x65,0xc3,0x13,0xff,0x90,0xa, 0x8c,0xe0,0x22,0xab,0x2b,0xaa,0x2c, +0xa9,0x2d,0x90,0x0, 0x2d,0x2, 0x1, 0x65,0x12,0x1, 0x65,0xfd,0x7b,0x2, 0xaf,0x3d, +0xd1,0x1a,0xef,0x22,0x12,0x4, 0xf2,0xe5,0x30,0x25,0xe0,0x25,0xe0,0x24,0x78,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xf9,0xe4,0x35,0x4b,0xfa,0xe5,0x50,0x22,0xff, +0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x9f,0x74,0x80,0xf8,0x6c,0x98,0x22,0x74,0x44, +0x25,0x50,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0xff,0xab,0x4a,0xe5,0x4c,0x22, +0x12,0x3f,0x4d,0xd1,0x61,0x90,0x0, 0x2f,0x12,0x1, 0x65,0x30,0xe0,0x3b,0x12,0x17, +0x15,0x90,0x0, 0x4d,0x12,0x2, 0xb7,0xc3,0x94,0x3c,0xe5,0xf0,0x94,0x0, 0x50,0xc, +0x90,0x0, 0x4d,0xe4,0x75,0xf0,0x1, 0x12,0x2, 0xef,0x80,0x1d,0x12,0x35,0xf7,0x85, +0x25,0x36,0xf1,0x44,0x12,0x16,0x49,0x12,0x27,0xcb,0x12,0x17,0x15,0xf1,0x4b,0x90, +0xa, 0xe9,0x74,0x5, 0xf0,0xa3,0x74,0xdc,0xf0,0xd1,0x61,0x90,0x0, 0x2f,0x12,0x1, +0x65,0x20,0xe0,0x1f,0x12,0x17,0x15,0xf1,0x4b,0x30,0x1, 0x17,0xc2,0x1, 0xd1,0x7c, +0xd3,0x94,0x0, 0x40,0xe, 0x12,0x35,0xf7,0x85,0x25,0x36,0xf1,0x44,0x12,0x16,0x49, +0x12,0x27,0xcb,0x22,0x85,0x26,0x37,0x85,0x27,0x38,0x22,0x90,0x0, 0x4d,0xe4,0xf5, +0xf0,0x2, 0x3, 0x5b,0x90,0xc, 0x53,0x74,0x30,0xf0,0xa3,0x74,0x3, 0xf0,0xae,0x2, +0xaf,0x1, 0xad,0x7, 0xac,0x6, 0xe9,0x24,0x60,0xf9,0xea,0x34,0x7, 0xfa,0xe4,0xf5, +0x33,0xf5,0x34,0xe5,0x34,0x25,0xe0,0xff,0xe5,0x33,0x33,0xfe,0xed,0x2f,0xf5,0x82, +0xec,0x12,0x67,0x60,0xe5,0x34,0xae,0x33,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8, +0xf9,0xf5,0x82,0x8e,0x83,0x74,0xff,0x12,0x1, 0xd7,0x5, 0x34,0xe5,0x34,0x70,0x2, +0x5, 0x33,0xb4,0xc0,0xce,0xe5,0x33,0xb4,0x1, 0xc9,0x22,0x12,0x4, 0xf2,0xe5,0x30, +0x25,0xe0,0x25,0xe0,0x22,0x12,0x2, 0x8c,0xfd,0xc3,0xef,0x9d,0xee,0x95,0xf0,0x22, +0x90,0x0, 0x10,0x12,0x1, 0x65,0xc3,0x13,0x90,0xa, 0x8c,0xf0,0x22,0x33,0xfe,0xab, +0x2b,0xe5,0x2d,0x2f,0xf9,0xe5,0x2c,0x3e,0xfa,0x22,0x78,0x1, 0x12,0x4, 0xcc,0xa8, +0x4, 0xa9,0x5, 0xaa,0x6, 0xab,0x7, 0x22,0xef,0x24,0x9f,0x12,0x50,0x4, 0xef,0x24, +0x9e,0x12,0x50,0x4, 0xef,0x24,0x9d,0xf5,0x82,0xee,0x34,0x7, 0xf5,0x83,0x74,0x1, +0xf0,0xef,0x24,0xa4,0xf5,0x82,0xee,0x34,0x7, 0xf5,0x83,0xe4,0xf0,0x22,0xe5,0xe8, +0x54,0xc0,0x64,0xc0,0x60,0x3, 0x12,0x37,0xc7,0x22,0x12,0x3f,0x4d,0x85,0xc9,0x31, +0x12,0x16,0xfa,0x12,0x1, 0x4c,0xff,0x70,0x28,0x12,0x17,0x15,0x12,0x1f,0xf7,0xd3, +0x94,0x0, 0x40,0x5, 0xe4,0xf5,0x8, 0x1, 0xd6,0x12,0x17,0xbb,0x20,0xe0,0x2, 0x1, +0xd6,0x12,0x3f,0x4, 0x65,0x8, 0x60,0x2, 0x1, 0xd6,0xf5,0x8, 0x4, 0x31,0x24,0x1, +0xd6,0xef,0xb4,0x1, 0x12,0x12,0x17,0x15,0x12,0x1f,0xf7,0x60,0x79,0x12,0x16,0xfa, +0x31,0x23,0x75,0xa, 0x1e,0x80,0x6f,0x12,0x16,0xfa,0x12,0x1, 0x4c,0x64,0x3, 0x70, +0x65,0xff,0x31,0x2c,0x12,0x36,0x0, 0x12,0x0, 0x1e,0xe5,0xdb,0x30,0xe1,0xfb,0xc2, +0x89,0xd2,0xa8,0x20,0x96,0xfd,0x43,0x87,0x2, 0xc2,0xa8,0x12,0x36,0x0, 0x12,0x0, +0x1e,0x53,0xdb,0xf0,0x12,0x27,0x3b,0x85,0x22,0x36,0x85,0x23,0x37,0x85,0x24,0x38, +0xab,0x2e,0xaa,0x2f,0xa9,0x30,0x12,0x36,0x9b,0x12,0x16,0xfa,0x31,0x23,0xae,0x2c, +0xaf,0x2d,0x12,0x4f,0xe8,0x12,0x4e,0x61,0x12,0x4f,0x54,0x90,0xc, 0x31,0x74,0xa, +0xf0,0x90,0xc, 0x31,0xe0,0x70,0xfa,0x85,0x2b,0x36,0x85,0x2c,0x37,0x85,0x2d,0x38, +0x12,0x16,0x49,0x12,0x27,0xcb,0xe4,0xf5,0x32,0xe5,0x9, 0x70,0x22,0xff,0x31,0x35, +0xe5,0xdb,0x30,0xe1,0xf4,0xc2,0xcd,0x12,0x16,0xfa,0x12,0x1, 0x4c,0xb4,0x1, 0xe9, +0xe5,0x32,0x70,0xe5,0x75,0x32,0x1, 0x53,0xc9,0xfc,0x43,0xc9,0x1, 0x80,0xda,0xe4, +0xf5,0xa, 0xf5,0x9, 0x85,0x31,0xc9,0xd2,0xcd,0x12,0x3f,0x54,0xfa,0x12,0x1, 0x4c, +0x54,0xef,0x12,0x1, 0xc5,0x12,0x17,0x15,0x12,0x1f,0xf7,0x90,0x0, 0x4c,0x12,0x1, +0xd7,0x1, 0xe, 0xe4,0x12,0x1, 0xc5,0x90,0xc, 0x57,0xf0,0x22,0xef,0x70,0x3, 0xd2, +0x84,0x22,0xc2,0x84,0x22,0xef,0x70,0x3, 0x43,0x87,0x1, 0xbf,0x1, 0x3, 0x43,0x87, +0x2, 0xbf,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x12,0x3f,0x4d,0xe4,0xf5,0x2c,0x12,0x16, +0xfa,0x12,0x4e,0x82,0x60,0x8, 0x90,0x0, 0x2e,0x12,0x1, 0x65,0x60,0x3, 0x7f,0x0, +0x22,0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x29,0x12,0x17,0xc1,0xc3,0x13,0xf5,0x2a,0xe4, +0xf5,0x2b,0xf5,0x28,0x12,0x16,0x7a,0x12,0x0, 0x6, 0xd3,0xef,0x94,0x14,0xee,0x64, +0x80,0x94,0x80,0x40,0x2, 0x5, 0x2b,0x51,0x87,0x40,0xe9,0xe5,0x2b,0xd3,0x94,0x7, +0x40,0x2, 0x51,0x8f,0xe4,0xf5,0x2b,0xe5,0x29,0xd3,0x94,0x0, 0x40,0x35,0xe4,0xf5, +0x28,0x12,0x16,0x7a,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x29,0x75,0xf0,0x20, +0xa4,0x24,0x60,0xf5,0x82,0x74,0x3, 0x35,0xf0,0xf5,0x83,0x12,0x17,0x15,0x12,0x16, +0x8b,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0x12,0x46,0x84,0x40,0x2, 0x5, 0x2b,0x51, +0x87,0x40,0xce,0xe5,0x2b,0xd3,0x94,0x7, 0x40,0x2, 0x51,0x8f,0xe4,0xf5,0x2b,0xe5, +0x29,0xc3,0x94,0x12,0x50,0x35,0xe4,0xf5,0x28,0x12,0x16,0x7a,0x12,0x0, 0x6, 0xc0, +0x6, 0xc0,0x7, 0xe5,0x29,0x75,0xf0,0x20,0xa4,0x24,0xa0,0xf5,0x82,0x74,0x3, 0x35, +0xf0,0xf5,0x83,0x12,0x17,0x15,0x12,0x16,0x8b,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, +0x12,0x46,0x84,0x40,0x2, 0x5, 0x2b,0x51,0x87,0x40,0xce,0xe5,0x2b,0xd3,0x94,0x7, +0x40,0x2, 0x51,0x8f,0xe5,0x2a,0xd3,0x94,0x0, 0x40,0x23,0xe5,0x29,0x75,0xf0,0x20, +0x12,0x1c,0x5e,0xe5,0x2a,0x75,0xf0,0x2, 0xa4,0x24,0x7e,0xff,0xe5,0xf0,0x34,0x3, +0xfe,0x12,0x37,0x3a,0x51,0x9c,0x50,0x6, 0x74,0xa, 0x25,0x2c,0xf5,0x2c,0xe5,0x2a, +0x24,0x1, 0xff,0xe4,0x33,0xfe,0xc3,0xef,0x94,0x13,0xee,0x64,0x80,0x94,0x80,0x50, +0x23,0xe5,0x29,0x75,0xf0,0x20,0x12,0x1c,0x5e,0xe5,0x2a,0x75,0xf0,0x2, 0xa4,0x24, +0x82,0xff,0xe5,0xf0,0x34,0x3, 0xfe,0x12,0x37,0x3a,0x51,0x9c,0x50,0x6, 0x74,0xa, +0x25,0x2c,0xf5,0x2c,0xaf,0x2c,0x22,0x5, 0x28,0xe5,0x28,0xc3,0x94,0xb, 0x22,0xe5, +0x2b,0x24,0xf9,0x75,0xf0,0xa, 0xa4,0x25,0x2c,0xf5,0x2c,0x22,0x12,0x2, 0x8c,0xc3, +0x94,0xce,0xe5,0xf0,0x64,0x80,0x94,0x7f,0x22,0x12,0x3f,0x4d,0x7a,0xf, 0x79,0xb1, +0xb1,0x8e,0x7a,0xf, 0x79,0xb2,0xb1,0x81,0x12,0x1, 0x26,0xe4,0x90,0xa, 0x45,0xf0, +0xe4,0x90,0xa, 0x46,0xf0,0x90,0xa, 0x46,0xe0,0xff,0xc3,0x94,0x8, 0x50,0x2e,0x12, +0x47,0x27,0x34,0x3, 0xfa,0x90,0xa, 0x45,0xe0,0x12,0x11,0xcd,0xe0,0x75,0xf0,0x20, +0xa4,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x74,0x3d,0x2f,0x71,0xe, 0x75,0xf0,0x2, 0x12, +0x16,0xe3,0x12,0x4f,0x4e,0x90,0xa, 0x46,0xe0,0x4, 0xf0,0x80,0xc8,0x90,0xa, 0x45, +0xe0,0x4, 0xf0,0xe0,0xb4,0x1, 0xb9,0x22,0xe5,0x2e,0x25,0xe0,0x24,0x3d,0xf5,0x82, +0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0xf1,0x70,0x7a,0x0, 0x79,0x12,0xb1,0x8e,0x7a, +0x0, 0x79,0x13,0xb1,0x81,0x12,0x1, 0x26,0x12,0x2d,0x7e,0x12,0x1, 0x4c,0xf5,0x3a, +0x90,0xc, 0xeb,0xe0,0xc3,0x94,0x1, 0x50,0x5, 0xe0,0x4, 0xf0,0x81,0x63,0xe4,0x90, +0xc, 0xeb,0xf0,0xaa,0x35,0xa9,0x36,0xae,0x2, 0xaf,0x1, 0x8e,0x40,0x8f,0x41,0xf1, +0x38,0xf5,0x42,0x8f,0x43,0xe4,0xf5,0x3a,0xe4,0xf5,0x3c,0xf5,0x3d,0x75,0x3e,0x7f, +0x75,0x3f,0xff,0x90,0x0, 0x1a,0xf1,0x77,0xfd,0x75,0xf0,0x10,0xa4,0xff,0xae,0xf0, +0xe5,0x3a,0x7a,0x0, 0x2f,0xf5,0x45,0xea,0x3e,0xf5,0x44,0x8d,0x3b,0x12,0x2e,0xd9, +0x90,0x0, 0x1b,0x12,0x1, 0x65,0xff,0xe5,0x3b,0xd3,0x9f,0x40,0x2, 0x81,0x29,0x90, +0xa, 0x46,0x74,0x8, 0xf0,0xe4,0x90,0xa, 0x45,0xf0,0x90,0xa, 0x45,0xe0,0xff,0xc3, +0x94,0x1, 0x50,0x32,0x74,0x3c,0x2f,0x12,0x11,0xcf,0xe0,0xb5,0x3b,0x20,0xe4,0x90, +0xa, 0x46,0xf0,0x90,0xa, 0x46,0xe0,0xff,0xc3,0x94,0x8, 0x50,0x11,0x74,0x3d,0x2f, +0x71,0xe, 0x65,0x3a,0x60,0x8, 0x90,0xa, 0x46,0xe0,0x4, 0xf0,0x80,0xe5,0x90,0xa, +0x45,0xe0,0x4, 0xf0,0x80,0xc4,0x90,0xa, 0x46,0xe0,0x64,0x8, 0x70,0x47,0xe5,0x45, +0x25,0xe0,0xff,0xe5,0x44,0x33,0xfe,0xe5,0x41,0x2f,0xf5,0x82,0xe5,0x40,0x12,0x1f, +0x55,0xfd,0xe5,0x43,0x2f,0xf5,0x82,0xe5,0x42,0xb1,0xad,0x2d,0xff,0xee,0x3c,0xfe, +0xd3,0xef,0x95,0x3d,0xee,0x95,0x3c,0x40,0x4, 0x8e,0x3c,0x8f,0x3d,0xc3,0xef,0x95, +0x3f,0xee,0x95,0x3e,0x50,0x4, 0x8e,0x3e,0x8f,0x3f,0x74,0x10,0x25,0x45,0xf5,0x45, +0xe4,0x35,0x44,0xf5,0x44,0x5, 0x3b,0x61,0x7d,0x12,0x2e,0xd9,0x90,0x0, 0x1c,0x12, +0x2, 0xb7,0xff,0xc3,0xe5,0x3d,0x95,0x3f,0xfd,0xe5,0x3c,0x95,0x3e,0xfc,0xd3,0xed, +0x9f,0xec,0x95,0xf0,0x40,0x8, 0x90,0xc, 0xea,0x74,0x2, 0xf0,0x80,0xa, 0x5, 0x3a, +0xe5,0x3a,0x64,0xb, 0x60,0x2, 0x61,0x58,0xe5,0x3a,0xb4,0xb, 0x6, 0x90,0xc, 0xea, +0x74,0x1, 0xf0,0x90,0xc, 0xea,0xe0,0xff,0x22,0x12,0x3f,0x4d,0x75,0x30,0x1, 0xb1, +0x68,0x12,0x16,0xfa,0x71,0x17,0x8f,0x2e,0xb1,0x68,0x12,0x16,0xfa,0x12,0x2d,0xdd, +0x8f,0x2f,0x12,0x16,0x49,0x90,0x7, 0xa4,0x12,0x1, 0x65,0xff,0x70,0x4a,0x4, 0xb1, +0x62,0xe5,0x2e,0xb4,0x2, 0xd, 0x90,0x7, 0x9d,0x74,0x6, 0x12,0x1, 0xd7,0xe4,0xf5, +0x30,0x80,0x2f,0x12,0x17,0x15,0x12,0x4e,0x82,0x70,0x1f,0xb1,0x7b,0x70,0x1b,0x90, +0xc, 0xec,0xe0,0xc3,0x94,0x2, 0x40,0xa, 0xe4,0xf0,0x12,0x16,0x49,0x90,0x7, 0xa4, +0x80,0x46,0x90,0xc, 0xec,0xe0,0x4, 0xf0,0xa1,0x4c,0x12,0x16,0x49,0x74,0x4, 0xb1, +0x62,0xe4,0x90,0xc, 0xec,0xf0,0x80,0x74,0xef,0x64,0x1, 0x70,0x44,0x12,0x16,0x49, +0xb1,0x62,0xe5,0x2f,0x60,0x5, 0x90,0x7, 0xa4,0x80,0x4e,0xe5,0x2e,0xb4,0x2, 0x6, +0x90,0x7, 0x9d,0xe4,0x80,0x53,0x12,0x17,0x15,0x12,0x4e,0x82,0x70,0xd, 0xb1,0x7b, +0x70,0x9, 0x12,0x16,0x49,0x90,0x7, 0x9d,0x4, 0x80,0x3e,0xb1,0x68,0x85,0x25,0x3a, +0x85,0x26,0x3b,0x85,0x27,0x3c,0x12,0x17,0x15,0x12,0x2a,0x9c,0xe4,0xf5,0x30,0x80, +0x2b,0x12,0x16,0x49,0x90,0x7, 0xa4,0x12,0x1, 0x65,0xb4,0x3, 0x1f,0xe5,0x2f,0x24, +0xfe,0x60,0xa, 0x4, 0x70,0xe, 0x90,0x7, 0x9d,0x74,0x3, 0x80,0xc, 0x90,0x7, 0x9d, +0x74,0x2, 0x80,0x5, 0x90,0x7, 0xa4,0x74,0x1, 0x12,0x1, 0xd7,0xe5,0x30,0xb4,0x1, +0x10,0x12,0x17,0x15,0x90,0x0, 0x80,0xe4,0xf1,0x80,0x90,0x0, 0x82,0xe4,0x12,0x1, +0xd7,0x22,0x90,0x7, 0x9d,0x2, 0x1, 0xd7,0x85,0x28,0x34,0x85,0x29,0x35,0x85,0x2a, +0x36,0x85,0x2b,0x37,0x85,0x2c,0x38,0x85,0x2d,0x39,0x22,0x90,0x0, 0x86,0x2, 0x1, +0x65,0x78,0x3d,0x7c,0xa, 0x7d,0x1, 0x7b,0xff,0x7e,0x0, 0x7f,0x8, 0x22,0x78,0x3c, +0x7c,0xa, 0x7d,0x1, 0x7b,0xff,0x7e,0x0, 0x7f,0x1, 0x2, 0x1, 0x26,0xe5,0x2e,0x25, +0xe0,0xff,0xe5,0x2d,0x33,0xfe,0xe5,0x32,0x2f,0xf5,0x82,0xe5,0x31,0x3e,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x22,0x12,0x16,0xf4,0xf1,0x28,0xff,0xf5,0x35,0x12,0x16,0x49, +0x90,0x0, 0x15,0x12,0x1, 0x65,0xf5,0x36,0x90,0x0, 0x16,0x12,0x1, 0x65,0xf5,0x37, +0xef,0x70,0x2, 0xe1,0x8, 0x12,0x16,0xfa,0xf1,0x28,0xb4,0x4, 0x8, 0xe5,0x36,0x25, +0xe0,0x25,0xe0,0xf5,0x36,0xae,0x2, 0xaf,0x1, 0x8e,0x2f,0x8f,0x30,0xf1,0x38,0xf5, +0x31,0x8f,0x32,0xe5,0x27,0x24,0x60,0xf9,0xe5,0x26,0x34,0x7, 0xaf,0x1, 0xf5,0x33, +0x8f,0x34,0xe4,0xf5,0x2b,0x12,0x17,0x15,0x12,0x1, 0x4c,0xff,0xe5,0x2b,0xc3,0x9f, +0x40,0x2, 0xe1,0x8, 0xe5,0x2b,0x75,0xf0,0x10,0xa4,0x85,0xf0,0x2d,0xf5,0x2e,0xe4, +0xf5,0x2c,0x12,0x17,0x15,0x12,0x17,0xc1,0xff,0xe5,0x2c,0xc3,0x9f,0x40,0x2, 0xe1, +0x4, 0xe5,0x35,0xb4,0x3, 0x2, 0xc1,0xc8,0xe5,0x35,0xb4,0x2, 0xf, 0xf1,0x9, 0xc0, +0x83,0xc0,0x82,0xf1,0x1d,0xd5,0x82,0x2, 0x15,0x83,0xc1,0xec,0xe5,0x35,0xb4,0x5, +0x6, 0x12,0x1f,0x45,0xfd,0x80,0x2e,0xe5,0x35,0x64,0x6, 0x70,0x65,0xe5,0x2e,0xae, +0x2d,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf1,0x2e,0xf1,0x5c,0xfe,0xef, +0x5e,0x60,0x30,0xb1,0x9d,0xf1,0x42,0x40,0x11,0xe5,0x36,0xfd,0xe5,0x2e,0x25,0xe0, +0xff,0xe5,0x2d,0x33,0xfe,0xf1,0x12,0xec,0x80,0x44,0x12,0x1f,0x45,0xf1,0x4d,0x12, +0x46,0x88,0x50,0x64,0xf1,0x12,0xc0,0x83,0xc0,0x82,0xf1,0x1d,0xd5,0x82,0x2, 0x15, +0x83,0x80,0x49,0xe5,0x2e,0xae,0x2d,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9, +0xf1,0x2e,0xc0,0x83,0xc0,0x82,0xf1,0x5c,0xfe,0xef,0x4e,0xd0,0x82,0xd0,0x83,0xf0, +0x80,0x36,0xb1,0x9d,0xf1,0x42,0x40,0xd, 0xe5,0x36,0xfd,0xf1,0x9, 0xe4,0x8d,0xf0, +0x12,0x2, 0x60,0x80,0x23,0x12,0x1f,0x45,0xf1,0x4d,0x12,0x46,0x88,0x50,0x19,0xf1, +0x12,0xc0,0x83,0xc0,0x82,0xf1,0x1d,0xd5,0x82,0x2, 0x15,0x83,0x15,0x82,0xe0,0x9e, +0xd0,0x82,0xd0,0x83,0xf0,0xa3,0xef,0xf0,0x5, 0x2e,0xe5,0x2e,0x70,0x2, 0x5, 0x2d, +0x5, 0x2c,0xc1,0x22,0x5, 0x2b,0xc1,0x5, 0x22,0xe5,0x2e,0x25,0xe0,0xff,0xe5,0x2d, +0x33,0xfe,0xe5,0x30,0x2f,0xf5,0x82,0xe5,0x2f,0x3e,0xf5,0x83,0x22,0x7e,0x0, 0xc3, +0xa3,0xe0,0x95,0x36,0xff,0x5, 0x82,0x22,0x90,0x7, 0x9d,0x2, 0x1, 0x65,0x25,0x34, +0xf5,0x82,0xe5,0x33,0x3e,0xf5,0x83,0x22,0xe9,0x24,0x80,0xf9,0xea,0x34,0x3, 0xaf, +0x1, 0x22,0xd3,0x95,0x37,0x74,0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0xfd,0xc3,0xe4, +0x95,0x37,0xfb,0xe4,0x94,0x0, 0xfa,0xc3,0xed,0x9b,0xea,0x22,0xe0,0xff,0x7c,0x0, +0xe5,0x2e,0x54,0x7, 0x24,0x7, 0xf5,0x82,0xec,0x34,0x7, 0xf5,0x83,0xe4,0x93,0x22, +0x8b,0x31,0x8a,0x32,0x89,0x33,0x22,0xab,0x37,0xaa,0x38,0xa9,0x39,0x2, 0x1, 0x65, +0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe4,0x2, 0x1, 0xd7,0x12,0x3f,0x4d,0x12,0x4e,0x82, +0xf5,0x32,0x12,0x4e,0x61,0xe4,0x12,0x4e,0x5e,0x12,0x46,0x54,0xe5,0x32,0x70,0x3, +0x2, 0x58,0xe5,0x78,0x38,0x7c,0x0, 0x7d,0x0, 0x12,0x17,0x15,0x7e,0x0, 0x7f,0xa, +0x12,0x1, 0x26,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x32,0x40,0x3, 0x2, 0x58,0x9d, +0x12,0x17,0x15,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x16,0xe3,0x12,0x1, 0x65,0xc3,0x13, +0xf5,0x30,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x17,0xd5,0xfa,0x12,0x17,0xc1,0xc3,0x13, +0xf5,0x31,0x74,0x33,0x25,0x2e,0xf8,0xe4,0xf6,0xe5,0x30,0x64,0x12,0x60,0x3, 0x2, +0x58,0x98,0xf5,0x2f,0xe5,0x2f,0x90,0xf, 0xc6,0x93,0x65,0x31,0x60,0x2, 0x1, 0x8d, +0x74,0x33,0x25,0x2e,0xf8,0x76,0x1, 0x12,0x16,0x49,0xe5,0x30,0x31,0x7, 0xe5,0x31, +0x12,0x16,0x90,0x12,0x16,0xfa,0x11,0xff,0xee,0x95,0xf0,0x40,0x65,0x12,0x4e,0x61, +0x74,0x1, 0x12,0x4e,0x5e,0x12,0x1f,0x9, 0xff,0x7e,0x0, 0xe9,0x24,0x1, 0xf9,0xe4, +0x3a,0x11,0xf0,0xe5,0x2f,0x12,0x4e,0x5e,0x90,0x0, 0x4, 0x74,0x1, 0x12,0x1, 0x92, +0xab,0x28,0xe5,0x2a,0x24,0x60,0xf9,0xe5,0x29,0x34,0x7, 0xfa,0xe5,0x30,0x75,0xf0, +0x10,0xa4,0x7c,0x0, 0x25,0x31,0xff,0xec,0x35,0xf0,0xfe,0xef,0x78,0x3, 0x11,0xf8, +0xd8,0xfc,0x12,0x7, 0x76,0xff,0xe5,0x30,0xc4,0x54,0xf0,0x25,0x31,0x54,0x7, 0xfe, +0x74,0x1, 0xa8,0x6, 0x8, 0x80,0x2, 0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x12,0x1, 0xc5, +0x80,0x16,0x12,0x17,0x15,0x90,0x0, 0x2d,0x74,0xff,0x12,0x1, 0x92,0x5, 0x2f,0xe5, +0x2f,0x64,0x3, 0x60,0x3, 0x2, 0x57,0xf4,0x5, 0x2e,0x2, 0x57,0xb6,0xe4,0xf5,0x2f, +0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x32,0x50,0x3c,0x74,0x33,0x25,0x2e,0xf8,0xe6,0x70, +0x30,0xe5,0x2e,0x25,0xe0,0x24,0x38,0xf8,0xe6,0xff,0x12,0x17,0x15,0x75,0xf0,0x2, +0xe5,0x2f,0x12,0x16,0xe3,0xef,0x12,0x1, 0xd7,0xe5,0x2e,0x25,0xe0,0x24,0x39,0xf8, +0xe6,0xfd,0xe5,0x2f,0x75,0xf0,0x2, 0x12,0x17,0xd5,0xfa,0xed,0x12,0x46,0xdc,0x5, +0x2f,0x5, 0x2e,0x80,0xbd,0x22,0x7e,0x0, 0xe5,0x2a,0x24,0x23,0xf9,0xe4,0x35,0x29, +0xfa,0xe9,0x2f,0xf9,0xee,0x3a,0xfa,0x22,0xce,0xa2,0xe7,0x13,0xce,0x13,0x22,0x12, +0x2, 0x8c,0xfd,0xd3,0xef,0x9d,0x22,0x90,0x3, 0x80,0x75,0xf0,0x20,0x12,0x5, 0x40, +0x75,0xf0,0x2, 0x22,0x8b,0x32,0x8a,0x33,0x89,0x34,0xe4,0xff,0xab,0x32,0xe5,0x34, +0x24,0x28,0xf9,0xe4,0x35,0x33,0xfa,0xef,0xfd,0x12,0x26,0x2b,0x74,0x3, 0x12,0x1, +0xc5,0xab,0x32,0xe5,0x34,0x24,0x23,0xf9,0xe4,0x35,0x33,0x31,0x71,0x90,0x0, 0x2d, +0x31,0x67,0xef,0x12,0x17,0x93,0x90,0x0, 0x37,0x31,0x67,0xef,0x12,0x17,0x93,0xf, +0xbf,0x5, 0xc9,0xab,0x32,0xaa,0x33,0xa9,0x34,0x90,0x0, 0x41,0xe4,0x12,0x1, 0xd7, +0x90,0x0, 0x42,0xe4,0x2, 0x1, 0xd7,0xab,0x32,0xaa,0x33,0xa9,0x34,0x75,0xf0,0x2, +0x22,0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x74,0x3, 0x2, 0x1, 0xc5,0xc0,0xe0,0xc0, +0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, +0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0x51,0x82,0x5, 0x13,0xe5,0x13, +0x70,0x2, 0x5, 0x12,0x90,0xc, 0x31,0xe0,0x60,0x2, 0x14,0xf0,0xc3,0xe5,0x13,0x94, +0xe8,0xe5,0x12,0x94,0x3, 0x40,0xe, 0x75,0x12,0x0, 0x75,0x13,0x0, 0xe5,0x8, 0x94, +0x64,0x50,0x2, 0x5, 0x8, 0x90,0xa, 0xe5,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0xe4, +0xe0,0x4, 0xf0,0x90,0xa, 0xde,0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x90,0xa, 0xe5,0xe0, +0x9f,0x90,0xa, 0xe4,0xe0,0x9e,0x50,0x3, 0x12,0x0, 0x1e,0x90,0xa, 0xe9,0xe0,0xfe, +0xa3,0xe0,0xff,0x4e,0x60,0x16,0xef,0x64,0x1, 0x4e,0x70,0x2, 0xd2,0x1, 0x90,0xa, +0xea,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xe9,0xe0,0x34,0xff,0xf0,0x51,0x94,0x40,0xe, +0x90,0xa, 0xe2,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0xe1,0xe0,0x4, 0xf0,0x90,0xc, +0x59,0xe0,0xb4,0xaa,0xf, 0x90,0xa, 0xe0,0xe0,0xff,0x4, 0xf0,0xef,0xd3,0x94,0x64, +0x40,0x2, 0x51,0x8d,0xe5,0xa, 0xc3,0x95,0xb, 0x50,0x12,0x5, 0xa, 0xe5,0xc9,0x54, +0x3, 0xff,0xbf,0x1, 0xb, 0x74,0x3, 0x25,0xa, 0xf5,0xa, 0x80,0x3, 0x75,0x9, 0x1, +0x90,0xc, 0xa8,0xe0,0xff,0x60,0x10,0xc3,0x94,0x28,0x50,0x5, 0xe0,0x4, 0xf0,0x80, +0x6, 0x12,0x37,0xcf,0x12,0x2f,0xff,0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0, +0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0, +0xe0,0x32,0xc2,0x8e,0x75,0xa6,0xf0,0x75,0xa5,0x5f,0xd2,0x8e,0x22,0x90,0xc, 0x59, +0x74,0x1, 0xf0,0x22,0x90,0xa, 0xe1,0xe0,0xfe,0xa3,0xe0,0xff,0xe4,0xfc,0xfd,0x7b, +0x40,0x7a,0x9c,0xf9,0xf8,0xd3,0x2, 0x4, 0xa5,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0, +0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, +0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0x12,0x17,0xfa,0x90,0xc, 0xac,0xe0,0x54,0xfd,0xf0, +0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, +0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x3f,0x4d,0xe4,0xf5, +0x2e,0xf5,0x2f,0xf5,0x30,0x12,0x66,0x70,0xf5,0x3c,0x75,0x3d,0xff,0xf5,0x42,0xf5, +0x43,0x12,0x16,0x49,0x90,0x0, 0xb, 0x12,0x2, 0xb7,0xf5,0x47,0x85,0xf0,0x46,0xe4, +0xf5,0x48,0xf5,0x49,0x90,0x0, 0x3, 0x12,0x2, 0xb7,0xf5,0x4b,0x85,0xf0,0x4a,0x12, +0x47,0x29,0x34,0x3, 0xaf,0x1, 0xf5,0x44,0x8f,0x45,0xe4,0xf5,0x2e,0x12,0x16,0xfa, +0x12,0x67,0x68,0x9f,0x40,0x2, 0xe1,0xdd,0xe5,0x2e,0x75,0xf0,0x10,0xa4,0x85,0xf0, +0x40,0xf5,0x41,0xe4,0xf5,0x2f,0x12,0x17,0xbb,0xff,0xe5,0x2f,0xc3,0x9f,0x40,0x2, +0xe1,0xd9,0x12,0x62,0x23,0x12,0x67,0x28,0x95,0x47,0xee,0x95,0x46,0x40,0x2, 0x5, +0x48,0x12,0x62,0x23,0x12,0x67,0x28,0x95,0x4b,0xe5,0x4a,0x12,0x62,0x80,0x50,0x2, +0xe1,0xcd,0xe5,0x2e,0x70,0x6, 0xf5,0x30,0xf5,0x31,0x80,0x15,0xe5,0x41,0x24,0xf0, +0xff,0xe5,0x40,0x34,0xff,0x12,0x46,0x76,0x12,0x62,0x2a,0xf5,0x30,0xa3,0xe0,0xf5, +0x31,0x12,0x16,0xfa,0x12,0x1, 0x4c,0x14,0xb5,0x2e,0x7, 0xe4,0xf5,0x32,0xf5,0x33, +0x80,0x14,0xe5,0x41,0x24,0x10,0xff,0xe4,0x35,0x40,0x12,0x46,0x76,0x12,0x62,0x2a, +0xf5,0x32,0xa3,0xe0,0xf5,0x33,0xe5,0x2f,0x70,0x6, 0xf5,0x36,0xf5,0x37,0x80,0x15, +0xe5,0x41,0x24,0xff,0xff,0xe5,0x40,0x34,0xff,0x12,0x46,0x76,0x12,0x62,0x2a,0xf5, +0x36,0xa3,0xe0,0xf5,0x37,0x12,0x17,0xc1,0x14,0xb5,0x2f,0x7, 0xe4,0xf5,0x34,0xf5, +0x35,0x80,0x14,0xe5,0x41,0x24,0x1, 0xff,0xe4,0x35,0x40,0x12,0x46,0x76,0x12,0x62, +0x2a,0xf5,0x34,0xa3,0xe0,0xf5,0x35,0x12,0x62,0x23,0xfe,0xc3,0xee,0x64,0x80,0x94, +0x80,0x50,0x2e,0xe5,0x31,0x95,0x33,0xe5,0x32,0x12,0x65,0x30,0x98,0x40,0x6, 0x85, +0x32,0x30,0x85,0x33,0x31,0xd3,0xe5,0x31,0x95,0x35,0xe5,0x34,0x12,0x65,0x30,0x98, +0x40,0x6, 0x85,0x34,0x30,0x85,0x35,0x31,0xd3,0x12,0x65,0x2a,0x98,0x40,0x35,0x80, +0x2d,0xc3,0xe5,0x31,0x95,0x33,0xe5,0x32,0x12,0x65,0x30,0x98,0x50,0x6, 0x85,0x32, +0x30,0x85,0x33,0x31,0xc3,0xe5,0x31,0x95,0x35,0xe5,0x34,0x12,0x65,0x30,0x98,0x50, +0x6, 0x85,0x34,0x30,0x85,0x35,0x31,0xc3,0x12,0x65,0x2a,0x98,0x50,0x6, 0x85,0x36, +0x30,0x85,0x37,0x31,0xe5,0x2e,0x25,0xe0,0xf5,0x42,0xe5,0x2f,0x25,0xe0,0xf5,0x43, +0xc3,0xee,0x64,0x80,0x94,0x80,0x40,0x2, 0xa1,0x41,0x12,0x62,0x23,0x12,0x62,0x77, +0x40,0x2, 0xa1,0x37,0xc3,0xe4,0x95,0x4b,0xfd,0xe4,0x95,0x4a,0xfc,0xd3,0xef,0x9d, +0xec,0x12,0x62,0x80,0x40,0x2, 0xa1,0x37,0xe5,0x49,0x70,0x9, 0x90,0xa, 0x8c,0xe5, +0x42,0xf0,0xa3,0xa1,0x32,0xe5,0x49,0xc3,0x94,0x5, 0x40,0x5, 0x75,0x49,0x5, 0xa1, +0x37,0xe4,0xf5,0x3d,0x12,0x67,0x14,0x95,0x49,0x74,0x80,0xf8,0x6c,0x98,0x50,0x62, +0x12,0x46,0xf7,0x12,0x66,0xed,0x7b,0x2, 0x12,0x66,0x8d,0x60,0x51,0xaf,0x3d,0x12, +0x46,0x72,0x33,0xfe,0x12,0x66,0xf8,0x12,0x66,0xd, 0x60,0x42,0xaf,0x3d,0x12,0x46, +0x69,0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0x8c,0x2d,0xf5,0x82,0x74,0xa, 0x12,0x62, +0x4d,0xff,0x74,0x8d,0x2d,0xf5,0x82,0x74,0xa, 0x12,0x61,0xff,0xfe,0xa3,0xe0,0xff, +0xc3,0x12,0x46,0x85,0x50,0x13,0xaf,0x3d,0x12,0x46,0x72,0x33,0xfe,0x12,0x66,0xed, +0xe5,0x42,0xf0,0x12,0x66,0xf8,0xe5,0x43,0xf0,0x75,0x3d,0xff,0x80,0x4, 0x5, 0x3d, +0x80,0x92,0xe5,0x49,0xb5,0x3d,0x10,0x12,0x62,0xc8,0xe5,0x42,0xf0,0xe5,0x49,0x12, +0x62,0xbc,0xe5,0x43,0xf0,0x5, 0x49,0x5, 0x41,0xe5,0x41,0x70,0x2, 0x5, 0x40,0xe1, +0xd5,0x12,0x62,0x23,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x62,0x7c,0x50,0x2, 0xe1,0xcd, +0xef,0x95,0x4b,0xe5,0x4a,0x12,0x62,0x80,0x50,0x2, 0xe1,0xcd,0xe5,0x3c,0x70,0x9, +0x90,0xa, 0x3c,0xe5,0x42,0xf0,0xa3,0xe1,0xc8,0xe5,0x3c,0xc3,0x94,0x14,0x40,0x5, +0x75,0x3c,0x14,0xe1,0xcd,0xe4,0xf5,0x3d,0x12,0x67,0x14,0x95,0x3c,0x74,0x80,0xf8, +0x6c,0x98,0x40,0x2, 0xe1,0xb6,0xed,0x25,0xe0,0xff,0xec,0x12,0x64,0xe9,0xe0,0xfd, +0x7b,0x2, 0x12,0x66,0x8f,0x60,0x3a,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xf6,0x12, +0x66,0xd, 0x60,0x2d,0x12,0x62,0x38,0xff,0x74,0x3d,0x2d,0xf5,0x82,0x74,0xa, 0x12, +0x61,0xff,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x46,0x85,0x40,0x2, 0xe1,0xad,0xaf,0x3d, +0x12,0x46,0x72,0x12,0x64,0xe9,0xe5,0x42,0xf0,0x12,0x64,0xf8,0xe5,0x43,0xf0,0xe1, +0xad,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xe9,0x7b,0x6, 0x12,0x66,0x8d,0x70,0x2, +0xe1,0xb2,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xf6,0x12,0x66,0xd, 0x70,0x2, 0xe1, +0xb2,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xe9,0xe0,0xfd,0xc3,0x13,0x25,0x2e,0xf5, +0x3e,0x12,0x64,0xf8,0xe0,0xc3,0x13,0x25,0x2f,0xf5,0x3f,0xe4,0xf5,0x30,0xf5,0x31, +0xc3,0xe5,0x31,0x95,0x3c,0x74,0x80,0xf8,0x65,0x30,0x98,0x50,0x39,0xaf,0x3d,0x12, +0x46,0x69,0x65,0x31,0x70,0x3, 0xee,0x65,0x30,0x60,0x21,0x12,0x67,0x98,0x12,0x64, +0xe9,0xe0,0x12,0x4e,0x68,0x60,0x15,0x12,0x67,0x98,0x12,0x64,0xf6,0xe0,0xfd,0xaf, +0x3f,0x12,0x4e,0x1a,0xef,0x60,0x5, 0x75,0x3e,0xff,0x80,0xa, 0x5, 0x31,0xe5,0x31, +0x70,0x2, 0x5, 0x30,0x80,0xba,0xe5,0x3e,0xf4,0x70,0x2, 0xe1,0xb2,0x12,0x62,0x38, +0xff,0x74,0x3d,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83,0xe0,0xc3,0x13,0xf9,0x12, +0x62,0x5, 0xfe,0xa3,0xe0,0xff,0x12,0x46,0x84,0x40,0x1c,0xaf,0x3d,0x12,0x46,0x72, +0x33,0xfe,0x74,0x3c,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0x12,0x62,0x4e,0xff,0xe9,0x12, +0x62,0xaa,0x12,0x46,0x76,0x80,0x7, 0xe5,0x41,0x25,0xe0,0xff,0xe5,0x40,0x12,0x62, +0x2a,0xf5,0x32,0xa3,0xe0,0xf5,0x33,0xe5,0x33,0xae,0x32,0x78,0x2, 0x11,0xf8,0xd8, +0xfc,0xfd,0xac,0x6, 0xe5,0x32,0xa2,0xe7,0x13,0xfe,0xe5,0x33,0x13,0x2d,0xf5,0x33, +0xee,0x3c,0xf5,0x32,0x12,0x16,0x49,0x12,0x2, 0x8c,0xff,0xae,0xf0,0xc3,0xe5,0x33, +0x9f,0xe5,0x32,0x9e,0x50,0x4, 0x8e,0x32,0x8f,0x33,0xaf,0x3e,0x12,0x46,0x69,0x24, +0x1, 0xff,0xe4,0x3e,0x12,0x65,0xa6,0x12,0x47,0x7f,0xe5,0x3f,0xc3,0x13,0xfd,0x7c, +0x0, 0x2f,0xff,0xec,0x3e,0x12,0x46,0x76,0x12,0x62,0x2a,0xfa,0xa3,0xe0,0xfb,0xe5, +0x3e,0xa2,0xe7,0x13,0xf9,0xff,0x12,0x47,0x7a,0xef,0x2d,0xff,0xec,0x3e,0x12,0x46, +0x76,0x12,0x62,0x2a,0xfe,0xa3,0xe0,0x2b,0xf5,0x35,0xee,0x3a,0xf5,0x34,0xa2,0xe7, +0x13,0xf5,0x34,0xe5,0x35,0x13,0xf5,0x35,0xaf,0x3e,0x12,0x46,0x69,0x24,0x1, 0xff, +0xe4,0x3e,0x12,0x65,0xa6,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xfd,0xee,0xc4,0x54,0xf0, +0x48,0xfc,0x12,0x65,0x9f,0x2d,0xff,0xee,0x3c,0x12,0x46,0x76,0x12,0x62,0x2a,0xfc, +0xa3,0xe0,0xfd,0xe9,0xff,0x33,0x95,0xe0,0xfe,0xef,0xc4,0xf8,0x54,0xf, 0xc8,0x68, +0xfb,0xee,0xc4,0x54,0xf0,0x48,0xfa,0x12,0x65,0x9f,0x2b,0xff,0xee,0x3a,0x12,0x46, +0x76,0x12,0x62,0x2a,0xfe,0xa3,0xe0,0x2d,0xf5,0x37,0xee,0x3c,0xf5,0x36,0xa2,0xe7, +0x13,0xf5,0x36,0xe5,0x37,0x13,0xf5,0x37,0x25,0x35,0xff,0xe5,0x34,0x35,0x36,0x12, +0x65,0xa6,0xc3,0x95,0x33,0xe5,0x32,0x12,0x62,0x80,0x40,0x16,0xaf,0x3d,0x12,0x46, +0x72,0x12,0x64,0xe9,0xe5,0x3e,0xf0,0x12,0x64,0xf8,0xe5,0x3f,0xf0,0x75,0x3d,0xff, +0x80,0x4, 0x5, 0x3d,0xa1,0x78,0xe5,0x3c,0xb5,0x3d,0x12,0x12,0x11,0xcb,0xe5,0x42, +0xf0,0xe5,0x3c,0x12,0x62,0xb2,0xf5,0x83,0xe5,0x43,0xf0,0x5, 0x3c,0x5, 0x41,0xe5, +0x41,0x70,0x2, 0x5, 0x40,0x5, 0x2f,0x61,0x46,0x5, 0x2e,0x61,0x2d,0xe5,0x3c,0xd3, +0x94,0x5, 0x50,0x3, 0x2, 0x61,0x2a,0xe4,0xf5,0x3e,0xf5,0x2e,0x12,0x4e,0x7c,0xff, +0xe5,0x2e,0xc3,0x9f,0x40,0x3, 0x2, 0x60,0x9c,0x75,0x38,0x3, 0x75,0x39,0xff,0xe4, +0xf5,0x43,0xf5,0x2f,0xe5,0x2f,0xc3,0x95,0x3c,0x50,0x42,0xe5,0x2f,0x12,0x53,0xa, +0x51,0x58,0xe0,0xc3,0x51,0x94,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x2f,0x12, +0x11,0xcb,0x51,0x67,0xe0,0xc3,0x51,0x94,0x12,0x0, 0x6, 0xd0,0xe0,0x2f,0xf5,0x3b, +0xd0,0xe0,0x3e,0xf5,0x3a,0xc3,0xe5,0x3b,0x95,0x39,0xe5,0x3a,0x95,0x38,0x50,0x9, +0x85,0x3a,0x38,0x85,0x3b,0x39,0x85,0x2f,0x43,0x5, 0x2f,0x80,0xb7,0xe5,0x43,0x12, +0x11,0xcb,0x51,0x50,0xff,0xe5,0x43,0x12,0x53,0xa, 0xc3,0x13,0x51,0xaa,0x12,0x46, +0x76,0x51,0x2a,0x12,0x16,0x45,0x12,0x4f,0xb5,0x40,0x2c,0xe5,0x43,0x12,0x11,0xcb, +0xe0,0xfd,0xaf,0x3e,0x12,0x46,0x72,0x33,0xfe,0x74,0x64,0x2f,0xf5,0x82,0x74,0xa, +0x51,0x88,0x12,0x53,0xa, 0xfd,0x74,0x65,0x2f,0xf5,0x82,0x74,0xa, 0x51,0x88,0x12, +0x11,0xcb,0x74,0xff,0xf0,0x5, 0x3e,0x5, 0x2e,0x2, 0x5f,0xec,0x85,0x3e,0x2e,0xe5, +0x2e,0xc3,0x94,0x5, 0x50,0x5e,0xe4,0xf5,0x30,0xf5,0x31,0xf5,0x3f,0xf5,0x2f,0xe5, +0x2f,0xc3,0x95,0x3c,0x50,0x36,0xe5,0x2f,0x12,0x11,0xcb,0xe0,0xff,0xf4,0x60,0x28, +0xef,0x51,0x51,0xff,0xe5,0x2f,0x12,0x53,0xa, 0xfd,0xc3,0x13,0x51,0xd4,0x12,0x46, +0x76,0x51,0x2a,0x51,0x77,0x40,0x11,0xe5,0x2f,0x12,0x11,0xcb,0xe0,0xf5,0x42,0x8d, +0x43,0x8e,0x30,0x8f,0x31,0x85,0x2f,0x3f,0x5, 0x2f,0x80,0xc3,0xe5,0x2e,0x12,0x4d, +0xef,0xe5,0x42,0x51,0x9b,0xe5,0x43,0xf0,0xe5,0x3f,0x12,0x11,0xcb,0x74,0xff,0xf0, +0x5, 0x2e,0x80,0x9b,0xe4,0xf5,0x2e,0xe5,0x2e,0x12,0x4d,0xef,0xe0,0xff,0xe5,0x2e, +0x12,0x11,0xcb,0xef,0x51,0x9b,0xe0,0xff,0xe5,0x2e,0x51,0xb2,0xf5,0x83,0xef,0xf0, +0x5, 0x2e,0xe5,0x2e,0xb4,0x5, 0xe0,0x75,0x3c,0x5, 0xe4,0xf5,0x2e,0x51,0x69,0x74, +0xff,0xf0,0x51,0x59,0x74,0xff,0xf0,0x5, 0x2e,0xe5,0x2e,0xb4,0x5, 0xef,0xe5,0x3c, +0xd3,0x94,0x0, 0x40,0x48,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3c,0x50,0x3e,0xe5, +0x2e,0x12,0x11,0xcb,0xe0,0xff,0x12,0x4e,0x61,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x16, +0xe3,0xef,0x12,0x1, 0xd7,0x12,0x53,0x8, 0xfd,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x17, +0xd5,0xfa,0x90,0x0, 0x1, 0xed,0x12,0x1, 0xd7,0xe5,0x2e,0x12,0x11,0xcb,0x51,0x67, +0xef,0xf0,0x12,0x53,0x8, 0x51,0x58,0xef,0xf0,0x5, 0x2e,0x80,0xbb,0xe5,0x49,0xd3, +0x94,0x0, 0x40,0x2e,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x49,0x50,0x24,0xe5,0x2e, +0x51,0xc8,0xe0,0xfd,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x4d,0xab,0x90,0x0, 0x87,0xed, +0x12,0x1, 0xd7,0xe5,0x2e,0x51,0xbc,0xe0,0x90,0x0, 0x88,0x12,0x1, 0xd7,0x5, 0x2e, +0x80,0xd5,0x12,0x4e,0x61,0x90,0x0, 0x86,0xe5,0x49,0x12,0x1, 0xd7,0x90,0x0, 0x2d, +0xe5,0x3c,0x12,0x1, 0xd7,0xe9,0x24,0x2f,0x12,0x3f,0x5f,0x12,0x16,0x49,0x90,0x0, +0xd, 0x12,0x1, 0x65,0xff,0xe5,0x48,0xd3,0x9f,0x40,0x13,0xab,0x2b,0xe5,0x2d,0x24, +0x2f,0xf9,0xe4,0x35,0x2c,0xfa,0x12,0x1, 0x4c,0x44,0x1, 0x12,0x1, 0xc5,0x22,0x3c, +0xf5,0x83,0xe0,0xc3,0x13,0x7c,0x0, 0x2f,0xff,0xec,0x35,0xf0,0xfe,0xef,0x25,0xe0, +0xff,0xee,0x33,0xfe,0xe5,0x45,0x2f,0xf5,0x82,0xe5,0x44,0x3e,0xf5,0x83,0xe0,0xfc, +0xa3,0xe0,0xfd,0xe5,0x41,0x25,0xe0,0xff,0xe5,0x40,0x33,0xfe,0xe5,0x45,0x2f,0xf5, +0x82,0xe5,0x44,0x3e,0xf5,0x83,0xe0,0x22,0xaf,0x3d,0xef,0x33,0x95,0xe0,0xfe,0xef, +0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0x3c,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83, +0xe0,0xc3,0x13,0x75,0xf0,0x10,0xa4,0x22,0xff,0xe5,0x2e,0x25,0xe0,0x24,0xe1,0xf5, +0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0xe0,0xff,0xe5,0x2e,0x25,0xe0,0x24,0xe0,0xf5, +0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0xfe,0xa3,0xe0,0xff,0xd3,0x95,0x31,0xe5,0x30, +0x64,0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0x3e,0xf5,0x83,0xed,0xf0,0xe5,0x43,0x22, +0xff,0xc3,0xe5,0x3d,0x9f,0xff,0xe4,0x94,0x0, 0xfe,0x22,0xf0,0xe5,0x2e,0x25,0xe0, +0x24,0x65,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x7c,0x0, 0x2f,0xff,0xec,0x35, +0xf0,0x22,0x25,0xe0,0x24,0x3d,0xf5,0x82,0xe4,0x34,0xa, 0x22,0x25,0xe0,0x24,0x8d, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x25,0xe0,0x24,0x8c,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0x22,0x7a,0x0, 0x2f,0xff,0xea,0x35,0xf0,0x22,0xbf,0x1, 0x5, 0x43, +0xdb,0x80,0x80,0x6, 0xef,0x70,0x3, 0x53,0xdb,0x7f,0xc2,0xea,0x43,0xdb,0x10,0xd2, +0xd9,0xc2,0xdd,0xc2,0xdc,0xc2,0xdb,0xc2,0xda,0xd2,0xd8,0x75,0xab,0x6, 0xe4,0xf5, +0x9a,0x53,0xdb,0xfd,0xd2,0xed,0xd2,0xba,0xc2,0xc2,0x43,0xa9,0x4, 0x43,0xb9,0x4, +0x22,0xef,0x71,0xee,0xed,0x2b,0xfb,0xe4,0x3a,0xfe,0xaf,0x3, 0x22,0x8b,0x37,0x8a, +0x38,0x89,0x39,0xe4,0xf5,0x3d,0x12,0x2e,0xd9,0x71,0xd6,0xfd,0xe4,0xff,0x71,0x11, +0x8e,0x3e,0x8f,0x3f,0xe5,0x3d,0x70,0x3, 0x43,0x3e,0x20,0x71,0xc9,0x94,0x10,0x40, +0xe5,0x75,0x3d,0x10,0xe4,0xfd,0x7f,0xc0,0x71,0xce,0x94,0x20,0x40,0xf6,0xe4,0xf5, +0x3d,0x71,0xe7,0x71,0xd6,0xfe,0x54,0xf, 0xff,0xee,0xc4,0x54,0xf, 0xfd,0x71,0xdf, +0x8e,0x3e,0x8f,0x3f,0x71,0xc9,0x94,0x8, 0x40,0xe7,0x75,0x3d,0x8, 0xe4,0xfd,0x7f, +0xc0,0x71,0xce,0x94,0x20,0x40,0xf6,0xe4,0xf5,0x3d,0x75,0xf0,0x2, 0xe5,0x3d,0xa4, +0x24,0x54,0xf5,0x82,0xe5,0xf0,0x34,0xc, 0xf5,0x83,0xe4,0x93,0xf5,0x3e,0x74,0x1, +0x93,0xf5,0x3f,0x71,0xc9,0x94,0xff,0x40,0xe1,0x90,0xe, 0x52,0xe4,0x93,0xfc,0x74, +0x1, 0x93,0xfd,0xec,0xff,0x71,0xfd,0x8f,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1, +0x14,0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1,0x15,0x53,0xdb, +0xf3,0x43,0xab,0x4, 0xae,0x14,0xaf,0x15,0x22,0xe5,0x3e,0xff,0xad,0x3f,0x71,0xa5, +0x5, 0x3d,0xe5,0x3d,0xc3,0x22,0x85,0x3d,0x82,0x75,0x83,0x0, 0x2, 0x1, 0x65,0xac, +0x7, 0xed,0x71,0xee,0xec,0x61,0x15,0xab,0x3a,0xaa,0x3b,0xa9,0x3c,0x22,0x7b,0x0, +0x7a,0xc0,0x75,0xf0,0x80,0xa4,0x2b,0xfb,0xe5,0xf0,0x3a,0xfa,0x22,0x53,0xab,0x3, +0x53,0xdb,0xf3,0x22,0x71,0xfd,0xef,0x44,0x80,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0xe4,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0xaf,0xa1,0x43,0xab,0x4, +0x22,0x53,0xc9,0x7, 0x43,0xc9,0x30,0x75,0xeb,0x80,0xef,0x25,0xe0,0x4, 0x25,0xeb, +0xf5,0xeb,0x22,0x7d,0x3, 0xe4,0x91,0x3d,0x60,0x2, 0x7f,0x1, 0x22,0xff,0x12,0x2f, +0xb8,0xef,0x7f,0x0, 0x22,0xe4,0xfd,0x91,0x3d,0x60,0x2, 0x7f,0x1, 0x22,0xe5,0xdb, +0x20,0xe1,0x3, 0x7f,0x0, 0x22,0x53,0xdb,0xfd,0x7f,0x1, 0x22,0xc2,0xc2,0x53,0xdb, +0xbf,0x32,0xef,0x70,0x4, 0x53,0xdb,0xbf,0x22,0x43,0xdb,0x40,0x22,0xef,0x24,0xfe, +0x60,0xb, 0x14,0x60,0xc, 0x24,0x2, 0x70,0xc, 0x7d,0x9, 0x80,0xa, 0x7d,0x6, 0x80, +0x6, 0x7d,0x3, 0x80,0x2, 0xe4,0xfd,0xe5,0xdc,0x54,0xf0,0x2d,0xf5,0xdc,0x22,0xf9, +0xe4,0x35,0x23,0xfa,0x7e,0x0, 0xe9,0x25,0x2e,0xf9,0xee,0x3a,0xfa,0x12,0x1, 0x4c, +0x54,0xf, 0xfd,0xe5,0x2e,0x25,0xe0,0xff,0xee,0x33,0xfe,0x74,0x74,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0xed,0xf0,0x12,0x1, 0x4c,0x54,0xf0,0xc4,0x54,0xf, 0xfd, +0xe5,0x2e,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x74,0x75,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0xab,0x34,0xaa,0x35,0xa9,0x36,0xe4,0x12,0x1, 0xd7,0xab,0x37,0xaa, +0x38,0xa9,0x39,0x90,0x0, 0x1f,0x2, 0x1, 0x65,0x33,0xfe,0x74,0x3c,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0x22,0x33,0xfe,0x74,0x3d,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0xab,0x37,0xaa,0x38,0xa9,0x39,0x90,0x0, 0x20,0x2, 0x1, 0x65,0x7c, +0x0, 0x12,0x5, 0x9c,0x8f,0x35,0x8e,0x34,0x8d,0x33,0x8c,0x32,0x78,0x8, 0x12,0x4, +0xcc,0x8f,0x35,0x8e,0x34,0x8d,0x33,0x8c,0x32,0x22,0xe5,0x31,0x95,0x37,0xe5,0x36, +0x64,0x80,0xf8,0xe5,0x30,0x64,0x80,0x22,0xa4,0x24,0x54,0xf9,0x74,0xe, 0x35,0xf0, +0xfa,0x7b,0xff,0xe9,0x25,0x38,0xf9,0xe4,0x3a,0xfa,0x78,0x32,0x7c,0x0, 0x7d,0x0, +0x7e,0x0, 0x22,0xa3,0xf0,0x75,0x25,0x1, 0x75,0x26,0x8, 0x75,0x27,0x29,0x75,0x28, +0x1, 0x75,0x29,0xa, 0x75,0x2a,0x25,0x7b,0x1, 0x7a,0x9, 0x79,0x18,0x22,0xf9,0xe4, +0x3a,0xfa,0x12,0x2, 0x8c,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xff,0xe5,0xf0,0xc4,0x54, +0xf0,0x48,0x8f,0xf0,0x2, 0x3, 0x3c,0x12,0x5, 0x9c,0xe5,0x40,0x2f,0xf5,0x40,0xe5, +0x3f,0x3e,0xf5,0x3f,0xe5,0x3e,0x3d,0xf5,0x3e,0xe5,0x3d,0x3c,0xf5,0x3d,0x22,0xe5, +0x3f,0x24,0x1, 0xff,0xe4,0x33,0xa2,0xe7,0x13,0xfe,0xef,0x13,0x22,0x90,0x3, 0x80, +0x75,0xf0,0x20,0x2, 0x5, 0x40,0x24,0xff,0xff,0xe4,0x34,0xff,0xcf,0xc3,0x95,0x3c, +0xcf,0x95,0x3b,0xfe,0xd3,0xef,0x94,0x0, 0xee,0x94,0x0, 0x22,0xe5,0x2f,0x75,0xf0, +0x7, 0xa4,0xff,0xae,0xf0,0xab,0x22,0x25,0x24,0xf9,0xe5,0x23,0x3e,0xfa,0x22,0xfa, +0x90,0x0, 0x2, 0x12,0x2, 0xb7,0xc3,0x9d,0xff,0xe5,0xf0,0x9c,0xfe,0x2, 0x0, 0x6, +0x90,0x8, 0x1d,0x74,0x1, 0xf0,0xa3,0x74,0xb, 0xf0,0x22,0xf9,0xe4,0x3a,0xfa,0x12, +0x2, 0x8c,0xc3,0x95,0x2c,0xff,0xe5,0xf0,0x95,0x2b,0x8f,0xf0,0x22,0xe0,0xfd,0xaf, +0x43,0x12,0x4e,0x1a,0xef,0x22,0x24,0x3e,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xee, +0xf0,0xa3,0xef,0xf0,0x5, 0x2d,0x22,0xae,0x46,0xaf,0x47,0xab,0x7, 0xaa,0x6, 0xea, +0x33,0x95,0xe0,0xf9,0xf8,0xaf,0x2e,0x22,0xe5,0x21,0x75,0xf0,0x7, 0xa4,0x24,0xc8, +0xf5,0x82,0xe4,0x34,0x8, 0xf5,0x83,0x22,0x75,0x25,0x1, 0x75,0x26,0x8, 0x75,0x27, +0x33,0x22,0x75,0x62,0xb, 0x75,0x63,0x78,0x7b,0xff,0x7a,0xf, 0x79,0x48,0x2, 0xa, +0x57,0xc3,0x13,0x75,0x3b,0x0, 0xf5,0x3c,0xd3,0x94,0x0, 0xe5,0x3b,0x94,0x0, 0x22, +0xf5,0x31,0xf5,0x32,0xf5,0x33,0xf5,0x34,0xf5,0x35,0xf5,0x36,0xf5,0x37,0x22,0xfd, +0xfc,0xab,0x35,0xaa,0x34,0xa9,0x33,0xa8,0x32,0xc3,0x2, 0x4, 0xbb,0xe0,0xfd,0xaf, +0x42,0x12,0x4e,0x1a,0xef,0x22,0xff,0xe9,0x24,0x58,0xf9,0xe4,0x3a,0xfa,0xe9,0x2f, +0xf9,0xea,0x3e,0x22,0xe5,0x21,0x75,0xf0,0x7, 0xa4,0x24,0xca,0xf5,0x82,0xe4,0x34, +0x8, 0x22,0x75,0x28,0x1, 0x75,0x29,0x0, 0x75,0x2a,0x0, 0x75,0x2b,0x1, 0x22,0x90, +0x0, 0x52,0x12,0x1, 0xd7,0x90,0x0, 0x53,0x22,0xab,0x28,0xe5,0x2a,0x24,0x23,0xf9, +0xe4,0x35,0x29,0xfa,0x22,0x74,0x2, 0x25,0x4f,0xf5,0x4f,0xe4,0x35,0x4e,0xf5,0x4e, +0x22,0xab,0x34,0xe5,0x36,0x24,0x80,0xf9,0xe5,0x35,0x34,0x3, 0x22,0x74,0x8c,0x2f, +0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22,0x74,0x8d,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0x12,0x1, 0xd7,0x90,0x0, 0x80,0x22,0x33,0x8f,0x82,0xf5,0x83,0x12, +0x2, 0xb7,0x2d,0x22,0xad,0x3d,0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x22,0x12,0x1, +0x4c,0xfd,0x12,0x0, 0x4e,0xe5,0x2d,0x22,0xfe,0xa3,0xe0,0xff,0x12,0x0, 0x6, 0xd3, +0xef,0x22,0x90,0x0, 0x53,0x2, 0x1, 0x65,0xe5,0x3b,0x25,0xe0,0xff,0xe5,0x3a,0x33, +0xfe,0x22,0x75,0x25,0x1, 0x75,0x26,0xa, 0x75,0x27,0x25,0x22,0x75,0x25,0x1, 0x75, +0x26,0x0, 0x75,0x27,0x83,0x22,0xf0,0x90,0xb, 0x5d,0xe0,0x90,0x0, 0x54,0xf0,0x22, +0x3e,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2e,0xc3,0x22, +0xfd,0x12,0x0, 0x4e,0xe4,0xf5,0x2d,0x22,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x54,0x22, +0xff,0xab,0x2a,0xe5,0x2c,0x24,0x1c,0x22,0x74,0x6d,0x25,0x50,0xf8,0xe6,0xa4,0x22, +0xf5,0x82,0xe4,0x35,0x5c,0xf5,0x83,0x22,0xe5,0x31,0x25,0xe0,0xff,0xe5,0x30,0x22, +0x12,0x1, 0x65,0xc3,0x13,0xf5,0x42,0x22,0x12,0x1, 0xd7,0x90,0xb, 0x5d,0xe0,0x22, +0x67,0xb0,0x98,0x4f,0x6c,0x93,0x2c,0x5a, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2e_app.h b/drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2e_app.h new file mode 100644 index 00000000..a1f2d1d2 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/FT5306_Spreadtrum_tiger_TRYLY_COB_0x2e_app.h @@ -0,0 +1,1660 @@ +0x2, 0x5, 0xf0,0x2, 0x5a,0xa9,0xee,0x30,0xe7,0x7, 0xc3,0xe4,0x9f,0xff,0xe4,0x9e, +0xfe,0x22,0x12,0x0, 0x2, 0x3, 0x4, 0x6, 0x7, 0x8, 0xa, 0x2, 0x59,0x7d,0x2, 0x17, +0xfa,0x22,0x22,0x2, 0x3c,0xd1,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x13,0x40,0x19,0x74, +0xf3,0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0x13,0x40,0xb, 0x74,0xf8,0x2f, +0xff,0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0xff,0xff,0x2, 0x3c,0xba,0x8f,0xd9, +0x8d,0xda,0x22,0x2, 0x64,0x5c,0xe7,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x46,0xe7,0x9, +0xf2,0x8, 0xdf,0xfa,0x80,0x3e,0x88,0x82,0x8c,0x83,0xe7,0x9, 0xf0,0xa3,0xdf,0xfa, +0x80,0x32,0xe3,0x9, 0xf6,0x8, 0xdf,0xfa,0x80,0x78,0xe3,0x9, 0xf2,0x8, 0xdf,0xfa, +0x80,0x70,0x88,0x82,0x8c,0x83,0xe3,0x9, 0xf0,0xa3,0xdf,0xfa,0x80,0x64,0x89,0x82, +0x8a,0x83,0xe0,0xa3,0xf6,0x8, 0xdf,0xfa,0x80,0x58,0x89,0x82,0x8a,0x83,0xe0,0xa3, +0xf2,0x8, 0xdf,0xfa,0x80,0x4c,0x80,0xd2,0x80,0xfa,0x80,0xc6,0x80,0xd4,0x80,0x69, +0x80,0xf2,0x80,0x33,0x80,0x10,0x80,0xa6,0x80,0xea,0x80,0x9a,0x80,0xa8,0x80,0xda, +0x80,0xe2,0x80,0xca,0x80,0x33,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe4,0x93,0xa3,0xc8, +0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83, +0xcc,0xdf,0xe9,0xde,0xe7,0x80,0xd, 0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3,0xf6,0x8, +0xdf,0xf9,0xec,0xfa,0xa9,0xf0,0xed,0xfb,0x22,0x89,0x82,0x8a,0x83,0xec,0xfa,0xe0, +0xa3,0xc8,0xc5,0x82,0xc8,0xcc,0xc5,0x83,0xcc,0xf0,0xa3,0xc8,0xc5,0x82,0xc8,0xcc, +0xc5,0x83,0xcc,0xdf,0xea,0xde,0xe8,0x80,0xdb,0x89,0x82,0x8a,0x83,0xe4,0x93,0xa3, +0xf2,0x8, 0xdf,0xf9,0x80,0xcc,0x88,0xf0,0xef,0x60,0x1, 0xe, 0x4e,0x60,0xc3,0x88, +0xf0,0xed,0x24,0x2, 0xb4,0x4, 0x0, 0x50,0xb9,0xf5,0x82,0xeb,0x24,0x2, 0xb4,0x4, +0x0, 0x50,0xaf,0x23,0x23,0x45,0x82,0x23,0x90,0x0, 0xa6,0x73,0xbb,0x1, 0x6, 0x89, +0x82,0x8a,0x83,0xe0,0x22,0x50,0x2, 0xe7,0x22,0xbb,0xfe,0x2, 0xe3,0x22,0x89,0x82, +0x8a,0x83,0xe4,0x93,0x22,0xbb,0x1, 0xc, 0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a, +0xf5,0x83,0xe0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xf8,0xe6,0x22,0xbb,0xfe,0x6, 0xe9, +0x25,0x82,0xf8,0xe2,0x22,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe4, +0x93,0x22,0xbb,0x1, 0xf, 0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83, +0xe0,0x28,0xf0,0x22,0x50,0x9, 0xc5,0x82,0x29,0xf8,0xe5,0x82,0x26,0xf6,0x22,0xbb, +0xfe,0x9, 0xc5,0x82,0x29,0xf8,0xe2,0x25,0x82,0xf2,0x22,0xf8,0xea,0x25,0x83,0xf5, +0x83,0xe9,0x93,0x28,0x22,0xbb,0x1, 0x6, 0x89,0x82,0x8a,0x83,0xf0,0x22,0x50,0x2, +0xf7,0x22,0xbb,0xfe,0x1, 0xf3,0x22,0xf8,0xbb,0x1, 0xd, 0xe5,0x82,0x29,0xf5,0x82, +0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0x22,0x50,0x6, 0xe9,0x25,0x82,0xc8,0xf6,0x22, +0xbb,0xfe,0x5, 0xe9,0x25,0x82,0xc8,0xf2,0x22,0xef,0x8d,0xf0,0xa4,0xa8,0xf0,0xcf, +0x8c,0xf0,0xa4,0x28,0xce,0x8d,0xf0,0xa4,0x2e,0xfe,0x22,0xbc,0x0, 0xb, 0xbe,0x0, +0x29,0xef,0x8d,0xf0,0x84,0xff,0xad,0xf0,0x22,0xe4,0xcc,0xf8,0x75,0xf0,0x8, 0xef, +0x2f,0xff,0xee,0x33,0xfe,0xec,0x33,0xfc,0xee,0x9d,0xec,0x98,0x40,0x5, 0xfc,0xee, +0x9d,0xfe,0xf, 0xd5,0xf0,0xe9,0xe4,0xce,0xfd,0x22,0xed,0xf8,0xf5,0xf0,0xee,0x84, +0x20,0xd2,0x1c,0xfe,0xad,0xf0,0x75,0xf0,0x8, 0xef,0x2f,0xff,0xed,0x33,0xfd,0x40, +0x7, 0x98,0x50,0x6, 0xd5,0xf0,0xf2,0x22,0xc3,0x98,0xfd,0xf, 0xd5,0xf0,0xea,0x22, +0xc5,0xf0,0xf8,0xa3,0xe0,0x28,0xf0,0xc5,0xf0,0xf8,0xe5,0x82,0x15,0x82,0x70,0x2, +0x15,0x83,0xe0,0x38,0xf0,0x22,0xa3,0xf8,0xe0,0xc5,0xf0,0x25,0xf0,0xf0,0xe5,0x82, +0x15,0x82,0x70,0x2, 0x15,0x83,0xe0,0xc8,0x38,0xf0,0xe8,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x6, 0x87,0xf0,0x9, 0xe7,0x19, +0x22,0xbb,0xfe,0x7, 0xe3,0xf5,0xf0,0x9, 0xe3,0x19,0x22,0x89,0x82,0x8a,0x83,0xe4, +0x93,0xf5,0xf0,0x74,0x1, 0x93,0x22,0xbb,0x1, 0x10,0xe5,0x82,0x29,0xf5,0x82,0xe5, +0x83,0x3a,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0x22,0x50,0x9, 0xe9,0x25,0x82,0xf8, +0x86,0xf0,0x8, 0xe6,0x22,0xbb,0xfe,0xa, 0xe9,0x25,0x82,0xf8,0xe2,0xf5,0xf0,0x8, +0xe2,0x22,0xe5,0x83,0x2a,0xf5,0x83,0xe9,0x93,0xf5,0xf0,0xa3,0xe9,0x93,0x22,0xbb, +0x1, 0xd, 0xc5,0x82,0x29,0xc5,0x82,0xc5,0x83,0x3a,0xc5,0x83,0x2, 0x2, 0x60,0x50, +0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe5,0xf0,0x26,0xf6,0x18,0xf5,0xf0,0xe5,0x82,0x36, +0xf6,0x22,0xbb,0xfe,0x11,0xc5,0x82,0x29,0xf8,0x8, 0xe2,0x25,0xf0,0xf5,0xf0,0xf2, +0x18,0xe2,0x35,0x82,0xf2,0x22,0xf8,0xe5,0x82,0x29,0xf5,0x82,0xe5,0x83,0x2a,0xf5, +0x83,0x74,0x1, 0x93,0x25,0xf0,0xf5,0xf0,0xe4,0x93,0x38,0x22,0xbb,0x1, 0xa, 0x89, +0x82,0x8a,0x83,0xf0,0xe5,0xf0,0xa3,0xf0,0x22,0x50,0x6, 0xf7,0x9, 0xa7,0xf0,0x19, +0x22,0xbb,0xfe,0x6, 0xf3,0xe5,0xf0,0x9, 0xf3,0x19,0x22,0xf8,0xbb,0x1, 0x11,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0xe8,0xf0,0xe5,0xf0,0xa3,0xf0,0x22, +0x50,0x9, 0xe9,0x25,0x82,0xc8,0xf6,0x8, 0xa6,0xf0,0x22,0xbb,0xfe,0x9, 0xe9,0x25, +0x82,0xc8,0xf2,0xe5,0xf0,0x8, 0xf2,0x22,0xe8,0x8f,0xf0,0xa4,0xcc,0x8b,0xf0,0xa4, +0x2c,0xfc,0xe9,0x8e,0xf0,0xa4,0x2c,0xfc,0x8a,0xf0,0xed,0xa4,0x2c,0xfc,0xea,0x8e, +0xf0,0xa4,0xcd,0xa8,0xf0,0x8b,0xf0,0xa4,0x2d,0xcc,0x38,0x25,0xf0,0xfd,0xe9,0x8f, +0xf0,0xa4,0x2c,0xcd,0x35,0xf0,0xfc,0xeb,0x8e,0xf0,0xa4,0xfe,0xa9,0xf0,0xeb,0x8f, +0xf0,0xa4,0xcf,0xc5,0xf0,0x2e,0xcd,0x39,0xfe,0xe4,0x3c,0xfc,0xea,0xa4,0x2d,0xce, +0x35,0xf0,0xfd,0xe4,0x3c,0xfc,0x22,0x75,0xf0,0x8, 0x75,0x82,0x0, 0xef,0x2f,0xff, +0xee,0x33,0xfe,0xcd,0x33,0xcd,0xcc,0x33,0xcc,0xc5,0x82,0x33,0xc5,0x82,0x9b,0xed, +0x9a,0xec,0x99,0xe5,0x82,0x98,0x40,0xc, 0xf5,0x82,0xee,0x9b,0xfe,0xed,0x9a,0xfd, +0xec,0x99,0xfc,0xf, 0xd5,0xf0,0xd6,0xe4,0xce,0xfb,0xe4,0xcd,0xfa,0xe4,0xcc,0xf9, +0xa8,0x82,0x22,0xb8,0x0, 0xc1,0xb9,0x0, 0x59,0xba,0x0, 0x2d,0xec,0x8b,0xf0,0x84, +0xcf,0xce,0xcd,0xfc,0xe5,0xf0,0xcb,0xf9,0x78,0x18,0xef,0x2f,0xff,0xee,0x33,0xfe, +0xed,0x33,0xfd,0xec,0x33,0xfc,0xeb,0x33,0xfb,0x10,0xd7,0x3, 0x99,0x40,0x4, 0xeb, +0x99,0xfb,0xf, 0xd8,0xe5,0xe4,0xf9,0xfa,0x22,0x78,0x18,0xef,0x2f,0xff,0xee,0x33, +0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xc9,0x33,0xc9,0x10,0xd7,0x5, 0x9b,0xe9,0x9a, +0x40,0x7, 0xec,0x9b,0xfc,0xe9,0x9a,0xf9,0xf, 0xd8,0xe0,0xe4,0xc9,0xfa,0xe4,0xcc, +0xfb,0x22,0x75,0xf0,0x10,0xef,0x2f,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xcc,0x33, +0xcc,0xc8,0x33,0xc8,0x10,0xd7,0x7, 0x9b,0xec,0x9a,0xe8,0x99,0x40,0xa, 0xed,0x9b, +0xfd,0xec,0x9a,0xfc,0xe8,0x99,0xf8,0xf, 0xd5,0xf0,0xda,0xe4,0xcd,0xfb,0xe4,0xcc, +0xfa,0xe4,0xc8,0xf9,0x22,0xeb,0x9f,0xf5,0xf0,0xea,0x9e,0x42,0xf0,0xe9,0x9d,0x42, +0xf0,0xec,0x64,0x80,0xc8,0x64,0x80,0x98,0x45,0xf0,0x22,0xeb,0x9f,0xf5,0xf0,0xea, +0x9e,0x42,0xf0,0xe9,0x9d,0x42,0xf0,0xe8,0x9c,0x45,0xf0,0x22,0xe8,0x60,0xf, 0xec, +0xc3,0x13,0xfc,0xed,0x13,0xfd,0xee,0x13,0xfe,0xef,0x13,0xff,0xd8,0xf1,0x22,0xe8, +0x60,0xf, 0xef,0xc3,0x33,0xff,0xee,0x33,0xfe,0xed,0x33,0xfd,0xec,0x33,0xfc,0xd8, +0xf1,0x22,0xec,0xf0,0xa3,0xed,0xf0,0xa3,0xee,0xf0,0xa3,0xef,0xf0,0x22,0xa8,0x82, +0x85,0x83,0xf0,0xd0,0x83,0xd0,0x82,0x12,0x5, 0x15,0x12,0x5, 0x15,0x12,0x5, 0x15, +0x12,0x5, 0x15,0xe4,0x73,0xe4,0x93,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5, +0x82,0xc8,0xf0,0xa3,0xc5,0x83,0xc5,0xf0,0xc5,0x83,0xc8,0xc5,0x82,0xc8,0x22,0xf5, +0xf0,0xc5,0x82,0xa4,0xc5,0x82,0xc5,0xf0,0xc5,0x83,0xa4,0x25,0x83,0xf5,0x83,0x22, +0xa4,0x25,0x82,0xf5,0x82,0xe5,0xf0,0x35,0x83,0xf5,0x83,0x22,0xbb,0x1, 0x7, 0x89, +0x82,0x8a,0x83,0x2, 0x5, 0xd2,0x50,0x5, 0xe9,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x5, +0xe9,0xf8,0x2, 0x5, 0xdb,0x89,0x82,0x8a,0x83,0x2, 0x5, 0xe4,0xbb,0x1, 0xd, 0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xd2,0x50,0x7, 0xe9,0x25, +0x82,0xf8,0x2, 0x5, 0xc9,0xbb,0xfe,0x7, 0xe9,0x25,0x82,0xf8,0x2, 0x5, 0xdb,0xe5, +0x82,0x29,0xf5,0x82,0xe5,0x83,0x3a,0xf5,0x83,0x2, 0x5, 0xe4,0xec,0x8e,0xf0,0xa4, +0xcc,0xc5,0xf0,0xcc,0xcd,0xf8,0xef,0xa4,0xce,0xc5,0xf0,0x2d,0xfd,0xe4,0x3c,0xfc, +0xe8,0xa4,0x2e,0xc8,0xc5,0xf0,0x3d,0xfd,0xe4,0x3c,0xfc,0xef,0xa4,0xff,0xe5,0xf0, +0x28,0xfe,0xe4,0x3d,0xfd,0xe4,0x3c,0xfc,0x22,0xe6,0xfb,0x8, 0xe6,0xfa,0x8, 0xe6, +0xf9,0x22,0xe0,0xfb,0xa3,0xe0,0xfa,0xa3,0xe0,0xf9,0x22,0xe2,0xfb,0x8, 0xe2,0xfa, +0x8, 0xe2,0xf9,0x22,0xe4,0x93,0xfb,0x74,0x1, 0x93,0xfa,0x74,0x2, 0x93,0xf9,0x22, +0x78,0xff,0xe4,0xf6,0xd8,0xfd,0x75,0x81,0x98,0x2, 0x6, 0x37,0x2, 0x36,0x12,0xe4, +0x93,0xa3,0xf8,0xe4,0x93,0xa3,0x40,0x3, 0xf6,0x80,0x1, 0xf2,0x8, 0xdf,0xf4,0x80, +0x29,0xe4,0x93,0xa3,0xf8,0x54,0x7, 0x24,0xc, 0xc8,0xc3,0x33,0xc4,0x54,0xf, 0x44, +0x20,0xc8,0x83,0x40,0x4, 0xf4,0x56,0x80,0x1, 0x46,0xf6,0xdf,0xe4,0x80,0xb, 0x1, +0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x90,0x6, 0x7c,0xe4,0x7e,0x1, 0x93,0x60,0xbc, +0xa3,0xff,0x54,0x3f,0x30,0xe5,0x9, 0x54,0x1f,0xfe,0xe4,0x93,0xa3,0x60,0x1, 0xe, +0xcf,0x54,0xc0,0x25,0xe0,0x60,0xa8,0x40,0xb8,0xe4,0x93,0xa3,0xfa,0xe4,0x93,0xa3, +0xf8,0xe4,0x93,0xa3,0xc8,0xc5,0x82,0xc8,0xca,0xc5,0x83,0xca,0xf0,0xa3,0xc8,0xc5, +0x82,0xc8,0xca,0xc5,0x83,0xca,0xdf,0xe9,0xde,0xe7,0x80,0xbe,0xc1,0x80,0x41,0xa, +0xe3,0x0, 0x41,0xc, 0xa7,0x0, 0x41,0xc, 0xa9,0x0, 0x41,0xc, 0xad,0x0, 0x41,0xc, +0xaa,0x0, 0x2, 0x12,0x0, 0x0, 0x41,0xc, 0xea,0x2, 0x41,0xc, 0xeb,0x0, 0x1, 0x16, +0x0, 0x41,0xc, 0xec,0x0, 0x1, 0x17,0x0, 0x0, 0xab,0x45,0xaa,0x46,0xa9,0x47,0x85, +0x4a,0x82,0x75,0x83,0x0, 0x22,0xab,0x5f,0xaa,0x60,0xa9,0x61,0x85,0x64,0x82,0x75, +0x83,0x0, 0x22,0xe5,0x49,0xab,0x45,0xaa,0x46,0xa9,0x47,0x22,0xe5,0x63,0xab,0x5f, +0xaa,0x60,0xa9,0x61,0x22,0xbd,0x77,0xb, 0xef,0xc3,0x94,0x6, 0x40,0x19,0x74,0xd, +0x2f,0xff,0x22,0xbd,0x78,0xb, 0xef,0xc3,0x94,0xb, 0x40,0xb, 0x74,0x8, 0x2f,0xff, +0x22,0xbd,0x79,0x1, 0x22,0x7f,0xff,0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, +0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x8b, +0x34,0x8a,0x35,0x89,0x36,0xe5,0x38,0xd3,0x94,0xb, 0x50,0x3b,0xed,0x94,0xf, 0x50, +0x36,0xe5,0x38,0xc3,0x94,0xb, 0x50,0x2f,0xe5,0x38,0x90,0xf, 0x48,0x93,0xff,0x24, +0x3, 0xab,0x34,0x20,0xe0,0x13,0xe5,0x36,0x24,0x10,0xf9,0xe4,0x35,0x35,0xfa,0xef, +0xf1,0x6b,0x54,0xf0,0xf1,0x58,0x4d,0x80,0xc, 0xf1,0x5c,0x54,0xf, 0xf1,0x58,0xff, +0xed,0xc4,0x54,0xf0,0x4f,0x31,0xc5,0x22,0x31,0xc5,0xab,0x34,0xe5,0x36,0x24,0x10, +0xf9,0xe4,0x35,0x35,0xfa,0xe5,0x38,0x90,0xf, 0x48,0x93,0x24,0x3, 0xff,0xe4,0x33, +0xa2,0xe7,0x13,0xfe,0xef,0x13,0x29,0xf9,0xea,0x3e,0xfa,0x21,0x4c,0x90,0x0, 0x41, +0x21,0x65,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8b,0x42,0x8a,0x43,0x89,0x44,0xe4,0xf5,0x4a,0xe5,0x4a,0xc3,0x95,0x48,0x40,0x3, +0x2, 0xa, 0x56,0xab,0x42,0xaa,0x43,0xa9,0x44,0x12,0x6, 0xaf,0x12,0x1, 0x65,0xb4, +0x1c,0x0, 0x40,0x3, 0x2, 0xa, 0x51,0x90,0x8, 0x2e,0xf8,0x28,0x28,0x73,0x2, 0x8, +0x82,0x2, 0x8, 0x89,0x2, 0x8, 0x91,0x2, 0x8, 0x99,0x2, 0x8, 0xa1,0x2, 0x8, 0xa9, +0x2, 0x8, 0xb1,0x2, 0x8, 0xc7,0x2, 0x8, 0xdd,0x2, 0x8, 0xf3,0x2, 0x9, 0x9, 0x2, +0x9, 0x1f,0x2, 0x9, 0x42,0x2, 0x9, 0x65,0x2, 0x9, 0x88,0x2, 0x9, 0xab,0x2, 0x9, +0xc1,0x2, 0x9, 0xd7,0x2, 0x9, 0xed,0x2, 0xa, 0x3, 0x2, 0xa, 0x18,0x2, 0xa, 0x1f, +0x2, 0xa, 0x26,0x2, 0xa, 0x2d,0x2, 0xa, 0x34,0x2, 0xa, 0x3b,0x2, 0xa, 0x42,0x2, +0xa, 0x49,0x12,0x6, 0xa9,0xe4,0x2, 0xa, 0x4e,0x12,0x6, 0xa9,0x74,0x1, 0x2, 0xa, +0x4e,0x12,0x6, 0xa9,0x74,0x2, 0x2, 0xa, 0x4e,0x12,0x6, 0xa9,0x74,0x3, 0x2, 0xa, +0x4e,0x12,0x6, 0xa9,0x74,0x4, 0x2, 0xa, 0x4e,0x12,0x6, 0xa9,0x74,0x5, 0x2, 0xa, +0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12,0x6, 0xaf,0x74,0x13,0x2, 0xa, 0x4e,0x12, +0x6, 0xaf,0x74,0x6, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12,0x6, 0xaf, +0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x7, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3, +0xb4,0x77,0x8, 0x12,0x6, 0xaf,0x74,0x15,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x8, +0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12,0x6, 0xaf,0x74,0x16,0x2, 0xa, +0x4e,0x12,0x6, 0xaf,0x74,0x9, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x77,0x8, 0x12, +0x6, 0xaf,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xa, 0x2, 0xa, 0x4e,0xe5, +0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9,0x74,0x18,0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4, +0x78,0x8, 0x12,0x6, 0xaf,0x74,0x13,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xb, 0x2, +0xa, 0x4e,0xe5,0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9,0x74,0x19,0x2, 0xa, 0x4e,0x12, +0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x14,0x2, 0xa, 0x4e,0x12,0x6, 0xaf, +0x74,0xc, 0x2, 0xa, 0x4e,0xe5,0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9,0x74,0x1a,0x2, +0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x15,0x2, 0xa, 0x4e, +0x12,0x6, 0xaf,0x74,0xd, 0x2, 0xa, 0x4e,0xe5,0x49,0xb4,0x77,0x8, 0x12,0x6, 0xa9, +0x74,0x1b,0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x16, +0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xe, 0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78, +0x8, 0x12,0x6, 0xaf,0x74,0x17,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0xf, 0x2, 0xa, +0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x18,0x2, 0xa, 0x4e,0x12, +0x6, 0xaf,0x74,0x10,0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf, +0x74,0x19,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x11,0x2, 0xa, 0x4e,0x12,0x6, 0xc3, +0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x1a,0x2, 0xa, 0x4e,0x12,0x6, 0xaf,0x74,0x12, +0x2, 0xa, 0x4e,0x12,0x6, 0xc3,0xb4,0x78,0x8, 0x12,0x6, 0xaf,0x74,0x1b,0x2, 0xa, +0x4e,0x12,0x6, 0xaf,0x74,0x13,0x80,0x36,0x12,0x6, 0xa9,0x74,0x14,0x80,0x2f,0x12, +0x6, 0xa9,0x74,0x15,0x80,0x28,0x12,0x6, 0xa9,0x74,0x16,0x80,0x21,0x12,0x6, 0xa9, +0x74,0x17,0x80,0x1a,0x12,0x6, 0xa9,0x74,0x18,0x80,0x13,0x12,0x6, 0xa9,0x74,0x19, +0x80,0xc, 0x12,0x6, 0xa9,0x74,0x1a,0x80,0x5, 0x12,0x6, 0xa9,0x74,0x1b,0x12,0x1, +0xd7,0x5, 0x4a,0x2, 0x8, 0x9, 0x22,0x8b,0x5c,0x8a,0x5d,0x89,0x5e,0xe4,0xf5,0x64, +0xe5,0x64,0xc3,0x95,0x62,0x40,0x3, 0x2, 0xc, 0x53,0xab,0x5c,0xaa,0x5d,0xa9,0x5e, +0x12,0x6, 0xbc,0x12,0x1, 0x65,0xb4,0x10,0x0, 0x40,0x3, 0x2, 0xc, 0x4e,0x90,0xa, +0x85,0xf8,0x28,0x28,0x73,0x2, 0xa, 0xb5,0x2, 0xa, 0xcf,0x2, 0xa, 0xf2,0x2, 0xb, +0x15,0x2, 0xb, 0x38,0x2, 0xb, 0x5b,0x2, 0xb, 0x7e,0x2, 0xb, 0xa1,0x2, 0xb, 0xc4, +0x2, 0xb, 0xe7,0x2, 0xc, 0x9, 0x2, 0xc, 0x1d,0x2, 0xc, 0x31,0x2, 0xc, 0x38,0x2, +0xc, 0x3f,0x2, 0xc, 0x46,0xe5,0x63,0xb4,0x77,0x5, 0x12,0x6, 0xce,0x80,0x23,0x12, +0x6, 0xcc,0xb4,0x78,0x3, 0x2, 0xb, 0x30,0x12,0x6, 0xbc,0xe4,0x2, 0xc, 0x4b,0xe5, +0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4, +0x78,0x8, 0x12,0x6, 0xbc,0x74,0x4, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x1, 0x2, +0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0x6, 0x2, 0xc, 0x4b,0x12, +0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0x5, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc, +0x74,0x2, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0x7, 0x2, +0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0x6, 0x2, 0xc, 0x4b, +0x12,0x6, 0xbc,0x74,0x3, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6, +0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0x7, +0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x4, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, +0x12,0x6, 0xb6,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, +0xbc,0x74,0x8, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x5, 0x2, 0xc, 0x4b,0xe5,0x63, +0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78, +0x8, 0x12,0x6, 0xbc,0x74,0x9, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x6, 0x2, 0xc, +0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0xb, 0x2, 0xc, 0x4b,0x12,0x6, +0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0xa, 0x2, 0xc, 0x4b,0x12,0x6, 0xbc,0x74, +0x7, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74,0xc, 0x2, 0xc, +0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0xb, 0x2, 0xc, 0x4b,0x12, +0x6, 0xbc,0x74,0x8, 0x2, 0xc, 0x4b,0xe5,0x63,0xb4,0x77,0x8, 0x12,0x6, 0xb6,0x74, +0xd, 0x2, 0xc, 0x4b,0x12,0x6, 0xcc,0xb4,0x78,0x8, 0x12,0x6, 0xbc,0x74,0xc, 0x2, +0xc, 0x4b,0x12,0x6, 0xbc,0x74,0x9, 0x80,0x42,0x12,0x6, 0xcc,0xb4,0x78,0x7, 0x12, +0x6, 0xbc,0x74,0xd, 0x80,0x35,0x12,0x6, 0xbc,0x74,0xa, 0x80,0x2e,0x12,0x6, 0xcc, +0xb4,0x78,0x7, 0x12,0x6, 0xbc,0x74,0xe, 0x80,0x21,0x12,0x6, 0xbc,0x74,0xb, 0x80, +0x1a,0x12,0x6, 0xb6,0x74,0xc, 0x80,0x13,0x12,0x6, 0xb6,0x74,0xd, 0x80,0xc, 0x12, +0x6, 0xb6,0x74,0xe, 0x80,0x5, 0x12,0x6, 0xb6,0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x64, +0x2, 0xa, 0x60,0x22,0xc0,0x0, 0xc0,0x3f,0xdf,0xbf,0xdf,0xbf,0xc0,0x1, 0xc0,0x82, +0xc1,0x2, 0xc1,0x1, 0xc0,0x3f,0xdf,0x3d,0xde,0x3c,0xde,0xbe,0xc0,0x2, 0xc1,0x85, +0xc2,0x85,0xc2,0x2, 0xc0,0x3e,0xde,0x3a,0xdd,0x3a,0xdd,0xbd,0xc0,0x3, 0xc2,0x87, +0xc4,0x7, 0xc3,0x3, 0xc0,0x3d,0xdd,0x38,0xdb,0xb7,0xdc,0xbc,0xc0,0x4, 0xc3,0x8a, +0xc5,0x8a,0xc4,0x4, 0xc0,0x3c,0xdc,0x35,0xda,0x35,0xdb,0xbb,0xc0,0x5, 0xc4,0x8c, +0xc6,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x32,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8e,0xc5,0x86,0xc0,0x3a,0xda,0xb2,0xd8,0xb2,0xda,0xba,0xc0,0x6, 0xc5,0x8e, +0xc7,0x8d,0xc5,0x5, 0xc0,0x3b,0xdb,0x34,0xd9,0xb4,0xdb,0xbb,0xc0,0x5, 0xc4,0x8b, +0xc6,0xb, 0xc4,0x4, 0xc0,0x3c,0xdc,0x36,0xdb,0x36,0xdc,0xbc,0xc0,0x4, 0xc3,0x89, +0xc4,0x88,0xc3,0x3, 0xc0,0x3d,0xdd,0x39,0xdc,0x39,0xdd,0xbd,0xc0,0x3, 0xc2,0x86, +0xc3,0x6, 0xc2,0x2, 0xc0,0x3e,0xde,0x3b,0xdd,0xbc,0xde,0xbe,0xc0,0x2, 0xc1,0x83, +0xc1,0x83,0xc1,0x1, 0xc0,0x3f,0xdf,0x3e,0xdf,0x3e,0xdf,0xbf,0xc0,0x0, 0xc0,0x81, +0xc0,0x80,0xc0,0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x0, 0x1, 0x0, 0x2, 0x0, 0x3, 0x0, +0x4, 0x1, 0x0, 0x1, 0x2, 0x1, 0x3, 0x1, 0x4, 0x2, 0x0, 0x2, 0x1, 0x2, 0x3, 0x2, +0x4, 0x3, 0x0, 0x3, 0x1, 0x3, 0x2, 0x3, 0x4, 0x4, 0x0, 0x4, 0x1, 0x4, 0x2, 0x4, +0x3, 0x0, 0x1, 0x2, 0x0, 0x1, 0x3, 0x0, 0x1, 0x4, 0x0, 0x2, 0x1, 0x0, 0x2, 0x3, +0x0, 0x2, 0x4, 0x0, 0x3, 0x1, 0x0, 0x3, 0x2, 0x0, 0x3, 0x4, 0x0, 0x4, 0x1, 0x0, +0x4, 0x2, 0x0, 0x4, 0x3, 0x1, 0x0, 0x2, 0x1, 0x0, 0x3, 0x1, 0x0, 0x4, 0x1, 0x2, +0x0, 0x1, 0x2, 0x3, 0x1, 0x2, 0x4, 0x1, 0x3, 0x0, 0x1, 0x3, 0x2, 0x1, 0x3, 0x4, +0x1, 0x4, 0x0, 0x1, 0x4, 0x2, 0x1, 0x4, 0x3, 0x2, 0x0, 0x1, 0x2, 0x0, 0x3, 0x2, +0x0, 0x4, 0x2, 0x1, 0x0, 0x2, 0x1, 0x3, 0x2, 0x1, 0x4, 0x2, 0x3, 0x0, 0x2, 0x3, +0x1, 0x2, 0x3, 0x4, 0x2, 0x4, 0x0, 0x2, 0x4, 0x1, 0x2, 0x4, 0x3, 0x3, 0x0, 0x1, +0x3, 0x0, 0x2, 0x3, 0x0, 0x4, 0x3, 0x1, 0x0, 0x3, 0x1, 0x2, 0x3, 0x1, 0x4, 0x3, +0x2, 0x0, 0x3, 0x2, 0x1, 0x3, 0x2, 0x4, 0x3, 0x4, 0x0, 0x3, 0x4, 0x1, 0x3, 0x4, +0x2, 0x4, 0x0, 0x1, 0x4, 0x0, 0x2, 0x4, 0x0, 0x3, 0x4, 0x1, 0x0, 0x4, 0x1, 0x2, +0x4, 0x1, 0x3, 0x4, 0x2, 0x0, 0x4, 0x2, 0x1, 0x4, 0x2, 0x3, 0x4, 0x3, 0x0, 0x4, +0x3, 0x1, 0x4, 0x3, 0x2, 0x12,0x11,0x10,0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, +0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0x0, 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x22,0x66,0x66,0x66, +0x66,0x66,0x66,0x66,0x66,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x12,0x0, 0x2, 0x3, 0x4, 0x6, 0x7, 0x8, 0xa, 0x0, 0x64,0x3, 0xfc,0x1, 0x18, +0x3, 0xfc,0x1, 0xd6,0x3, 0xfc,0x1, 0x5, 0x9, 0x7b,0x1, 0x7a,0xa, 0x79,0xeb,0x12, +0x16,0xf4,0x12,0x2f,0xf3,0xf5,0x31,0x12,0x67,0x32,0xf5,0x32,0x74,0x1, 0x12,0x66, +0xbf,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x2e,0xab,0x22,0xe5,0x24,0x24,0x58,0x12,0x64, +0x8f,0xed,0xf0,0x5, 0x2e,0xe5,0x2e,0xb4,0xe, 0xee,0xe4,0xf5,0x30,0xf5,0x2e,0xf1, +0x1, 0xff,0xc3,0x95,0x30,0x40,0x2, 0x8f,0x30,0x5, 0x2e,0xe5,0x2e,0xb4,0x13,0xef, +0xe5,0x30,0xc3,0x94,0xf, 0x50,0x9, 0xc3,0x74,0xf, 0x95,0x30,0xf5,0x30,0x80,0x3, +0xe4,0xf5,0x30,0xe4,0xf5,0x2e,0xab,0x22,0xe5,0x24,0x24,0x66,0x12,0x64,0x8f,0xed, +0xf0,0x5, 0x2e,0xe5,0x2e,0xb4,0x8, 0xee,0x85,0x30,0x2f,0xaf,0x2f,0x15,0x2f,0xef, +0x70,0x2, 0x21,0x80,0x12,0x0, 0x1e,0x12,0x37,0xa9,0x12,0x4e,0x61,0x12,0x2f,0x61, +0x12,0x27,0x3b,0x85,0x28,0x4b,0x85,0x29,0x4c,0x85,0x2a,0x4d,0xd1,0xfa,0x12,0x2f, +0xf9,0x60,0xf0,0xe4,0xf5,0x2e,0xd1,0xfa,0x12,0x67,0x68,0x9f,0x50,0x49,0xe4,0xfd, +0xf1,0xbb,0xff,0xed,0xc3,0x9f,0x50,0x3b,0xe5,0x2e,0x70,0xb, 0xf1,0xb0,0xe4,0xf0, +0xed,0x31,0xcb,0xe4,0xf0,0xa3,0xf0,0xd1,0x49,0xe5,0x2e,0x12,0x65,0xad,0x75,0xf0, +0x2, 0xed,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xae,0xf0,0x78,0x5, 0x12,0x58,0xf8,0xd8, +0xfb,0xff,0xed,0x31,0xcb,0xee,0x8f,0xf0,0x12,0x2, 0x60,0xf1,0xb0,0xe0,0x4, 0xf0, +0xd, 0x80,0xbd,0x5, 0x2e,0x80,0xaf,0xe4,0xf5,0x33,0xf5,0x2e,0xf1,0xbb,0xff,0xe5, +0x2e,0xc3,0x9f,0x40,0x2, 0x21,0x78,0x74,0x90,0x25,0x2e,0xf1,0xb3,0xe0,0xfd,0x70, +0x9, 0xe5,0x2e,0x31,0xcb,0x12,0x47,0x1f,0x80,0x3a,0xe5,0x2e,0x31,0xcb,0xc0,0x83, +0xc0,0x82,0xe0,0xfe,0xa3,0xe0,0xff,0x7c,0x0, 0x12,0x2, 0xb, 0xd0,0x82,0xd0,0x83, +0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x2e,0x31,0xcb,0xc0,0x83,0xc0,0x82,0xe0,0xfe,0xa3, +0xe0,0x78,0x5, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0xff,0xd0,0x82,0xd0,0x83,0xee, +0xf0,0xa3,0xef,0xf0,0xf1,0x15,0x90,0x0, 0x73,0xd1,0x93,0x90,0x0, 0xe, 0xf1,0xa5, +0xe5,0x2e,0x31,0xcb,0xf1,0xea,0x9e,0x50,0x10,0xf1,0x1, 0xc3,0x95,0x30,0x50,0x5, +0xf1,0x1, 0x4, 0x80,0x2a,0x5, 0x33,0x80,0x3b,0xf1,0x15,0x90,0x0, 0x73,0xd1,0x93, +0x90,0x0, 0xe, 0x12,0x2, 0xb7,0x2f,0xff,0xe5,0xf0,0x3e,0xfe,0xe5,0x2e,0x31,0xcb, +0xf1,0xf2,0x9e,0x40,0x1d,0xf1,0x1, 0xd3,0x94,0x0, 0x40,0x12,0xf1,0x1, 0x14,0xf0, +0x12,0x4e,0x61,0xf1,0x1, 0xfd,0x85,0x2e,0x38,0x12,0x7, 0xf, 0x80,0x6, 0x5, 0x33, +0x80,0x2, 0x5, 0x33,0x5, 0x2e,0x1, 0xbc,0xf1,0xbb,0x65,0x33,0x60,0x2, 0x1, 0x3b, +0xe4,0xf5,0x2e,0x12,0x64,0xc0,0xe0,0xc4,0x54,0xf0,0xfd,0x74,0x74,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0xe0,0x54,0xf, 0x4d,0xff,0xab,0x22,0xe5,0x24,0x24,0x66, +0xf9,0xe4,0x35,0x23,0xfa,0xe5,0x2e,0x12,0x26,0x2b,0xef,0x12,0x1, 0xc5,0x5, 0x2e, +0xe5,0x2e,0xb4,0x8, 0xce,0xd1,0xfa,0xe5,0x31,0x12,0x66,0xbf,0xe5,0x32,0x12,0x1, +0xd7,0x7f,0x1, 0x22,0x12,0x4, 0xf2,0xe5,0x30,0x25,0xe0,0x25,0xe0,0x24,0x3c,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x12,0x20,0xed,0xe4,0x90,0xa, 0x50,0xf0,0x75, +0x2f,0x1, 0xf5,0x2b,0xd1,0xaf,0x74,0xff,0xf1,0xdc,0xd1,0xc0,0x74,0xff,0xf0,0xe5, +0x2b,0x31,0xcb,0x74,0xff,0xf0,0xa3,0xf0,0x74,0x4b,0x25,0x2b,0xd1,0xd0,0xe4,0xf0, +0x5, 0x2b,0xe5,0x2b,0xb4,0x5, 0xdd,0xd1,0x49,0x12,0x7, 0x7d,0x70,0x21,0x90,0x0, +0x42,0x12,0x1, 0x65,0x70,0x2, 0xa1,0xa0,0xe4,0xf5,0x2b,0xd1,0x49,0x90,0x0, 0x2d, +0xf1,0x8e,0xd1,0x49,0xf1,0x8b,0x5, 0x2b,0xe5,0x2b,0xb4,0x5, 0xee,0xa1,0xa0,0xd1, +0x49,0x90,0x0, 0x42,0x12,0x1, 0x65,0x70,0x39,0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d, +0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, 0xa1,0xa0,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3, +0xd1,0x93,0xf1,0x9e,0xe5,0x2b,0xd1,0xa6,0x90,0x0, 0x2, 0x12,0x2, 0xb7,0xff,0xe5, +0x2b,0xd1,0x9a,0xf1,0xe2,0x74,0x4b,0x25,0x2b,0xd1,0xd0,0x74,0x1, 0xf0,0x5, 0x2b, +0x80,0xc9,0xe4,0xf5,0x2e,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xb4,0x1, 0xb, 0xe4,0xf5, +0x38,0x75,0x37,0x1, 0x75,0x2f,0x5, 0x61,0x12,0xef,0xb4,0x2, 0xb, 0x75,0x38,0x5, +0x75,0x37,0x2, 0x75,0x2f,0x14,0x80,0x7a,0xef,0xb4,0x3, 0xb, 0x75,0x38,0x2d,0x75, +0x37,0x3, 0x75,0x2f,0x3c,0x80,0x6b,0xef,0xd3,0x94,0x3, 0x40,0x65,0xe4,0xf5,0x2b, +0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x50,0x56,0xe4,0xf5,0x2c,0xd1, +0x49,0x90,0x0, 0x37,0x75,0xf0,0x2, 0xe5,0x2c,0xf1,0xc7,0x12,0x65,0xdf,0xc0,0x6, +0xc0,0x7, 0xd1,0x49,0xf1,0x9e,0xe5,0x2c,0xd1,0x90,0x75,0xf0,0x7, 0xe5,0x2b,0xd1, +0xe3,0xf1,0xa5,0x12,0x0, 0x6, 0xd0,0xe0,0x2f,0xff,0xd0,0xe0,0x3e,0xfe,0xe5,0x2b, +0x31,0xcb,0xf1,0xf2,0x9e,0x40,0xe, 0xd1,0xc0,0xe5,0x2c,0xf0,0xe5,0x2b,0x31,0xcb, +0xee,0xf0,0xa3,0xef,0xf0,0x5, 0x2c,0xe5,0x2c,0xc3,0x94,0x5, 0x40,0xb1,0x5, 0x2b, +0x80,0x9e,0x74,0xff,0xf5,0x3c,0xf5,0x3b,0xf5,0x3a,0xf5,0x39,0xf5,0x2d,0xd1,0x49, +0x12,0x7, 0x7d,0xff,0xd3,0x94,0x0, 0x50,0x2, 0x81,0x1f,0xef,0x94,0x4, 0x40,0x2, +0x81,0x1f,0xe5,0x2e,0xc3,0x95,0x2f,0x40,0x2, 0x81,0x1f,0xe4,0xf5,0x40,0xf5,0x3f, +0xf5,0x3e,0xf5,0x3d,0xe5,0x37,0xf5,0x82,0x75,0x83,0x0, 0x85,0x2e,0xf0,0x12,0x65, +0x38,0xaf,0x82,0x12,0x1, 0x26,0xe4,0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5, +0x2b,0xc3,0x9f,0x40,0x2, 0x61,0xf6,0xd1,0xea,0x75,0xf0,0x2, 0xd1,0x90,0xbe,0x7f, +0x1d,0xbf,0xff,0x1a,0xe5,0x40,0x24,0xff,0xf5,0x40,0xe5,0x3f,0x34,0xff,0xf5,0x3f, +0xe5,0x3e,0x34,0xff,0xf5,0x3e,0xe5,0x3d,0x34,0x3, 0xf5,0x3d,0x80,0x64,0xd1,0x49, +0xd1,0xea,0x75,0xf0,0x2, 0xd1,0x90,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3,0xf1,0xa5, +0x12,0x0, 0x6, 0x8e,0x30,0x8f,0x31,0xd1,0x49,0x90,0x0, 0x37,0xd1,0xed,0x75,0xf0, +0x2, 0xf1,0xc7,0x12,0x65,0xdf,0x8f,0x82,0x8e,0x83,0xe5,0x31,0xae,0x30,0x78,0x2, +0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x31,0x8e,0x30,0xe5,0x82,0xae,0x83,0x78, +0x2, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x82,0x8e,0x83,0xae,0x30,0xaf,0x31, +0xac,0x30,0xad,0x31,0x12,0x65,0x87,0xaf,0x82,0xae,0x83,0xad,0x82,0xac,0x83,0x12, +0x65,0x87,0x5, 0x2b,0x61,0x59,0xaf,0x40,0xae,0x3f,0xad,0x3e,0xac,0x3d,0xab,0x3c, +0xaa,0x3b,0xa9,0x3a,0xa8,0x39,0xd3,0x12,0x4, 0xbb,0x40,0xf, 0x85,0x40,0x3c,0x85, +0x3f,0x3b,0x85,0x3e,0x3a,0x85,0x3d,0x39,0x85,0x2e,0x2d,0x5, 0x2e,0x61,0x32,0xe5, +0x2d,0xf4,0x60,0x59,0xe5,0x37,0x85,0x2d,0xf0,0x12,0x65,0x38,0x7f,0x5, 0x12,0x1, +0x26,0xe4,0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, +0xa1,0x82,0xd1,0xed,0x24,0x4b,0xd1,0xd0,0x74,0x1, 0xf0,0x75,0xf0,0x7, 0xe5,0x2b, +0xd1,0xe3,0xd1,0x93,0xd1,0xea,0xd1,0xa3,0x90,0x0, 0x2, 0xd1,0x93,0xaa,0x29,0xa9, +0x2a,0x90,0x0, 0x37,0x74,0x32,0x25,0x2b,0x12,0x2a,0x94,0xee,0x8f,0xf0,0x12,0x3, +0x5b,0xd1,0xed,0xfd,0xd1,0xaf,0xed,0xf1,0xdc,0x5, 0x2b,0x80,0xb7,0xe4,0xf5,0x2b, +0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x40,0x2, 0xa1,0x2f,0x90,0xa, +0x50,0x74,0x1, 0xf0,0xe4,0xf5,0x2c,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2c,0xc3, +0x9f,0x50,0x31,0xe5,0x2b,0x65,0x2c,0x60,0x27,0x74,0x46,0x25,0x2c,0xd1,0xc4,0xe0, +0xff,0xd1,0xc0,0xe0,0xb5,0x7, 0x19,0xe5,0x2c,0x31,0xcb,0xe0,0xfe,0xa3,0xe0,0xff, +0xe5,0x2b,0x31,0xcb,0xf1,0xea,0x9e,0x40,0x7, 0xe4,0x90,0xa, 0x50,0xf0,0x80,0x4, +0x5, 0x2c,0x80,0xc3,0x90,0xa, 0x50,0xe0,0x64,0x1, 0x70,0x4f,0xd1,0xc0,0xe0,0x24, +0x4b,0xd1,0xd0,0x74,0x1, 0xf0,0xd1,0xc0,0xe0,0xfd,0xd1,0xaf,0x90,0x0, 0x4, 0xed, +0x12,0x1, 0xd7,0xd1,0x49,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3,0xd1,0x93,0xe9,0x24, +0x2d,0xf9,0xe4,0x3a,0xfa,0xd1,0xc0,0xe0,0x75,0xf0,0x2, 0xd1,0xe3,0xd1,0xa9,0x90, +0x0, 0x2, 0xd1,0x93,0xe5,0x2a,0x24,0x37,0xf9,0xe4,0x35,0x29,0xfa,0xd1,0xc0,0xe0, +0x75,0xf0,0x2, 0xd1,0xe3,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0x5, 0x2b,0x81,0x80,0xe4, +0xf5,0x2b,0xd1,0x49,0x12,0x7, 0x7d,0xff,0xe5,0x2b,0xc3,0x9f,0x50,0x44,0xf1,0xd0, +0xfa,0x12,0x1f,0x9, 0xf4,0x70,0x37,0xf5,0x2c,0xd1,0xcc,0xe0,0x70,0x28,0xd1,0xcc, +0x74,0x1, 0xf0,0xd1,0x49,0x75,0xf0,0x7, 0xe5,0x2b,0xd1,0xe3,0xd1,0x93,0xf1,0x9e, +0xe5,0x2c,0xd1,0xa6,0x90,0x0, 0x2, 0x12,0x46,0x4d,0xd1,0x9a,0x90,0x0, 0x4, 0xe5, +0x2c,0x12,0x1, 0xd7,0x80,0x8, 0x5, 0x2c,0xe5,0x2c,0x64,0x5, 0x70,0xcb,0x5, 0x2b, +0x80,0xb0,0xe4,0xf5,0x2b,0x74,0x4b,0x25,0x2b,0xd1,0xd0,0xe0,0x70,0xb, 0xd1,0x49, +0x90,0x0, 0x2d,0xf1,0x8e,0xd1,0x49,0xf1,0x8b,0x5, 0x2b,0xe5,0x2b,0xb4,0x5, 0xe5, +0xd1,0x49,0x12,0x7, 0x7d,0xf5,0x2c,0xe4,0xf5,0x2b,0x74,0x4b,0x25,0x2b,0xd1,0xd0, +0xe0,0x64,0x1, 0x70,0x2e,0xab,0x28,0xe5,0x2a,0x24,0x28,0xf1,0x7c,0x12,0x1, 0x4c, +0xb4,0x1, 0x5, 0x74,0x3, 0x12,0x1, 0xc5,0x12,0x1, 0x4c,0xff,0xb4,0x3, 0xb, 0x12, +0x66,0xc9,0xe5,0x2b,0x12,0x26,0x2b,0xe4,0x80,0x32,0xef,0x70,0x32,0xf1,0x76,0x74, +0x2, 0x80,0x29,0xab,0x28,0xe5,0x2a,0x24,0x28,0xf1,0x7c,0x12,0x1, 0x4c,0xff,0x64, +0x2, 0x60,0x3, 0xef,0x70,0x12,0xf1,0x76,0x74,0x1, 0x12,0x1, 0xc5,0xaf,0x2c,0x5, +0x2c,0xef,0xd1,0xb1,0xf1,0xe2,0x80,0x7, 0xf1,0x76,0x74,0x3, 0x12,0x1, 0xc5,0x12, +0x66,0xc9,0xaf,0x2b,0x7e,0x0, 0x12,0x58,0xf1,0x12,0x1, 0x4c,0xfd,0xe5,0x2a,0x24, +0x28,0x12,0x58,0xec,0xed,0x12,0x1, 0xc5,0x5, 0x2b,0xe5,0x2b,0x64,0x5, 0x60,0x2, +0xa1,0xaa,0x22,0xef,0x25,0xe0,0xff,0xee,0x33,0xfe,0xe5,0x40,0x2f,0xf5,0x82,0xe5, +0x3f,0x3e,0xf5,0x83,0xe0,0xfe,0xa3,0xe0,0xff,0xab,0x28,0xaa,0x29,0xa9,0x2a,0x22, +0xc3,0xee,0x94,0x0, 0x40,0x2, 0x80,0x3, 0xe4,0xfe,0xff,0x7d,0xc6,0x12,0x65,0xf, +0xe4,0x7f,0x1c,0x7e,0x2, 0x12,0x66,0x7f,0x40,0xb, 0xe4,0x75,0x35,0x1b,0x75,0x34, +0x2, 0xf5,0x33,0xf5,0x32,0xae,0x34,0xaf,0x35,0x22,0xab,0x22,0xaa,0x23,0xa9,0x24, +0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x29,0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5,0x28, +0x12,0x5, 0x40,0x12,0x2, 0xb7,0xff,0xae,0xf0,0x22,0xae,0xf0,0xaa,0x29,0xa9,0x2a, +0x90,0x0, 0x37,0x75,0xf0,0x2, 0x12,0x5, 0x40,0xee,0x8f,0xf0,0x12,0x3, 0x5b,0xe5, +0x2b,0x75,0xf0,0x7, 0xa4,0xab,0x28,0x25,0x2a,0xf9,0xe5,0x29,0x35,0xf0,0xfa,0x22, +0x74,0x46,0x25,0x2b,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x74,0x4b,0x25,0x2c, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xab,0x2b,0xaa,0x2c,0xa9,0x2d,0x75,0xf0, +0x2, 0xe5,0x30,0xa4,0xf5,0x82,0x85,0xf0,0x83,0x22,0x90,0x0, 0x2d,0x74,0x32,0x25, +0x2b,0xf8,0xe6,0x22,0x8b,0x22,0x8a,0x23,0x89,0x24,0xab,0x25,0xaa,0x26,0xa9,0x27, +0x22,0x74,0x74,0x25,0x2e,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0x7e,0x0, +0x7f,0x23,0x12,0x1, 0x26,0xab,0x22,0xaa,0x23,0xa9,0x24,0x22,0xd1,0xf4,0x12,0x4e, +0x82,0xf1,0x15,0x90,0x0, 0x41,0x12,0x1, 0xd7,0xab,0x25,0xe5,0x27,0x24,0xa, 0xf9, +0xe4,0x35,0x26,0xfa,0xa8,0x24,0xac,0x23,0xad,0x22,0xf1,0xe, 0x31,0xd7,0xf1,0x15, +0x90,0x0, 0x43,0x12,0x5, 0x6c,0x8b,0x2b,0x8a,0x2c,0x89,0x2d,0xf1,0x15,0x12,0x1c, +0xb1,0xe5,0x27,0x24,0xa, 0xf9,0xe4,0x35,0x26,0xa8,0x1, 0xfc,0xad,0x25,0xf1,0x15, +0xf1,0xe, 0x12,0x7, 0x7d,0x90,0x0, 0x42,0x12,0x1, 0xd7,0x12,0x7, 0x7d,0xd1,0xfa, +0x90,0x0, 0x2d,0x2, 0x1, 0xd7,0xab,0x28,0xe5,0x2a,0x24,0x23,0xf9,0xe4,0x35,0x29, +0xfa,0x7e,0x0, 0xe9,0x25,0x2b,0xf9,0xee,0x3a,0xfa,0x22,0x90,0x0, 0x37,0x75,0xf0, +0x2, 0xe5,0x2b,0x12,0x5, 0x40,0x74,0x7f,0x75,0xf0,0xff,0x2, 0x3, 0x5b,0x90,0x0, +0x2d,0x75,0xf0,0x2, 0x22,0x12,0x2, 0xb7,0xc3,0x9f,0xff,0xe5,0xf0,0x9e,0xfe,0x22, +0x74,0x90,0x2d,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xab,0x25,0xaa,0x26,0xa9, +0x27,0x90,0x0, 0x1, 0x2, 0x1, 0x65,0x12,0x5, 0x40,0x12,0x2, 0xb7,0xfd,0xac,0xf0, +0xe5,0x2b,0x75,0xf0,0x7, 0xa4,0x29,0xf9,0xea,0x35,0xf0,0x22,0x90,0x0, 0x4, 0x2, +0x1, 0xd7,0x90,0x0, 0x4, 0xe5,0x2b,0x2, 0x1, 0xd7,0xe0,0xfc,0xa3,0xe0,0xc3,0x9f, +0xec,0x22,0xe0,0xfc,0xa3,0xe0,0xd3,0x9f,0xec,0x22,0xe5,0x92,0x60,0x4, 0xd2,0xae, +0xd2,0xbe,0x22,0xc3,0xee,0x94,0x0, 0x40,0x2, 0x80,0x3, 0xe4,0xfe,0xff,0x7d,0xd6, +0x12,0x65,0xf, 0xe4,0x7f,0xc0,0x7e,0x3, 0x12,0x66,0x7f,0x40,0xb, 0xe4,0x75,0x35, +0xbf,0x75,0x34,0x3, 0xf5,0x33,0xf5,0x32,0xae,0x34,0xaf,0x35,0x22,0x12,0x3f,0x4d, +0x12,0x16,0x49,0xf1,0xf7,0xf5,0x30,0xf1,0xaa,0xf5,0x31,0xe4,0xf5,0x2d,0xf1,0x35, +0x91,0x6a,0x12,0x11,0xcd,0x74,0x7f,0xf0,0xa3,0x91,0x6a,0x24,0x3e,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0x74,0x7f,0xf0,0xa3,0x74,0xff,0xf0,0x5, 0x2d,0xe5,0x2d,0xb4, +0x5, 0xdc,0xe5,0x30,0x70,0x31,0xe5,0x31,0xd3,0x94,0x0, 0x50,0x2, 0x81,0x52,0xe4, +0xf5,0x2e,0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x2a,0x74,0xff,0x12,0x1, 0xd7,0x5, +0x2e,0xe5,0x2e,0xb4,0x5, 0xec,0xf1,0x89,0x44,0x4, 0x12,0x1, 0xc5,0x54,0xf7,0x12, +0x1, 0xc5,0x54,0xdf,0x2, 0x1, 0xc5,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x30,0x50, +0x2c,0xe5,0x2e,0x75,0xf0,0x7, 0xa4,0xfd,0xac,0xf0,0xab,0x22,0x25,0x24,0xf9,0xe5, +0x23,0x3c,0xfa,0xe9,0x24,0xa, 0x12,0x65,0x6e,0xab,0x22,0xe5,0x24,0x2d,0xf9,0xe5, +0x23,0x3c,0xfa,0xe9,0x24,0xc, 0x12,0x65,0x6e,0x5, 0x2e,0x80,0xcd,0xe5,0x31,0x70, +0x7, 0xf1,0x89,0x44,0x10,0x12,0x1, 0xc5,0xe4,0xf5,0x2d,0xf5,0x2e,0xe4,0xf5,0x2f, +0xe5,0x2f,0xc3,0x95,0x30,0x50,0x38,0x91,0x59,0xf1,0x15,0xe5,0x2e,0x12,0x16,0xb1, +0xf1,0xf, 0xff,0x6d,0x70,0x25,0xef,0xf4,0x60,0x21,0xf1,0x2e,0xef,0xf0,0x90,0x0, +0x26,0x12,0x16,0x93,0x91,0x6d,0x12,0x11,0xcd,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x0, +0x28,0x12,0x16,0x93,0x91,0x6d,0x12,0x66,0x16,0x80,0x4, 0x5, 0x2f,0x80,0xc1,0x5, +0x2e,0xe5,0x2e,0x64,0x5, 0x70,0xb6,0xe4,0xf5,0x2e,0x85,0x30,0x2f,0xe5,0x2f,0xc3, +0x94,0x5, 0x50,0x38,0x91,0x59,0xf1,0x15,0xe5,0x2e,0x12,0x16,0xb1,0xf1,0xf, 0xff, +0x6d,0x70,0x25,0xef,0xf4,0x60,0x21,0xf1,0x2e,0xef,0xf0,0x90,0x0, 0x26,0x12,0x16, +0x93,0x91,0x6d,0x12,0x11,0xcd,0xee,0xf0,0xa3,0xef,0xf0,0x90,0x0, 0x28,0x12,0x16, +0x93,0x91,0x6d,0x12,0x66,0x16,0x80,0x4, 0x5, 0x2f,0x80,0xc1,0x5, 0x2e,0xe5,0x2e, +0x64,0x5, 0x70,0xb6,0xe4,0xf5,0x2f,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x2d,0x50, +0x15,0x91,0x59,0x90,0x0, 0xe, 0x12,0x1, 0x65,0xff,0xe5,0x2e,0xf1,0x37,0xe0,0x6f, +0x60,0x4, 0x5, 0x2e,0x80,0xe4,0xe5,0x2e,0x65,0x2d,0x70,0x1e,0xf1,0xcd,0xe5,0x2f, +0x12,0x17,0xd2,0xfa,0xc0,0x1, 0x91,0x6d,0x24,0x3c,0xf9,0x74,0xa, 0x35,0xf0,0xa8, +0x1, 0xfc,0x7d,0x1, 0xd0,0x1, 0xf1,0x5d,0x5, 0x2d,0x5, 0x2f,0xe5,0x2f,0x64,0x5, +0x70,0xb5,0xe5,0x2a,0x24,0x26,0xf9,0xe4,0x35,0x29,0x7f,0x23,0xf1,0xe7,0xe5,0x31, +0x70,0x20,0xf1,0xcd,0xc0,0x2, 0xc0,0x1, 0xe5,0x2a,0x24,0x26,0xf9,0xe4,0x35,0x29, +0xa8,0x1, 0xfc,0xad,0x28,0xd0,0x1, 0xd0,0x2, 0x7e,0x0, 0x7f,0x23,0x12,0x1, 0x26, +0x61,0x91,0x12,0x16,0x49,0x12,0x3f,0xa, 0x13,0x13,0x13,0x54,0x1f,0x30,0xe0,0x2, +0x61,0x91,0xe4,0xf5,0x2f,0xe5,0x2f,0xc3,0x95,0x30,0x40,0x2, 0x61,0x91,0xe4,0xf5, +0x2e,0x91,0x59,0xf1,0x15,0xe5,0x2e,0x12,0x16,0xb1,0xf1,0xf, 0x6d,0x60,0x7, 0x5, +0x2e,0xe5,0x2e,0xb4,0x5, 0xeb,0x91,0x59,0x90,0x0, 0xc, 0x12,0x16,0x93,0xc0,0x6, +0xc0,0x7, 0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x28,0x91,0x77,0xd0,0x7, 0xd0,0x6, +0xf1,0x1d,0xc0,0x6, 0xc0,0x7, 0x91,0x59,0x90,0x0, 0xa, 0x12,0x16,0x93,0xc0,0x6, +0xc0,0x7, 0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x26,0x91,0x77,0xd0,0x7, 0xd0,0x6, +0xf1,0x1d,0xd0,0xe0,0x2f,0xf5,0x2c,0xd0,0xe0,0x3e,0xf5,0x2b,0x12,0x16,0xfa,0x91, +0x74,0xae,0x4, 0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf1,0x6b,0x50,0x5, +0x75,0x2d,0x4, 0x80,0x37,0xed,0xae,0x4, 0x78,0x2, 0xce,0xc3,0x13,0xce,0x13,0xd8, +0xf9,0xf1,0x6b,0x50,0x5, 0x75,0x2d,0x3, 0x80,0x22,0x91,0x74,0xec,0xc3,0x13,0xfe, +0xed,0x13,0xf1,0x6b,0x50,0x5, 0x75,0x2d,0x2, 0x80,0x11,0xc3,0xe5,0x2c,0x9d,0xe5, +0x2b,0x9c,0x50,0x5, 0x75,0x2d,0x1, 0x80,0x3, 0xe4,0xf5,0x2d,0x91,0x59,0x90,0x0, +0xc, 0x12,0x16,0x93,0xbe,0x4b,0x6, 0xbf,0xf0,0x3, 0xe4,0xf5,0x2d,0xe5,0x2e,0x12, +0x16,0xb1,0x90,0x0, 0x28,0x12,0x16,0x93,0xbe,0x4b,0x6, 0xbf,0xf0,0x3, 0xe4,0xf5, +0x2d,0x91,0x59,0x90,0x0, 0xa, 0x12,0x16,0x93,0xc0,0x6, 0xc0,0x7, 0xe5,0x2e,0x12, +0x16,0xb1,0x90,0x0, 0x26,0x91,0x77,0xd0,0x7, 0xd0,0x6, 0xf1,0x7d,0x80,0x5, 0xce, +0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2c,0x8e,0x2b,0xe5,0x2e,0x12,0x16,0xb1,0x90, +0x0, 0x26,0x91,0x53,0x90,0x0, 0xa, 0xf1,0xd9,0x40,0x10,0x12,0x16,0xb4,0x90,0x0, +0x26,0xe5,0x2b,0x85,0x2c,0xf0,0x12,0x2, 0xef,0x80,0xc, 0x12,0x16,0xb4,0xe9,0x24, +0x26,0x12,0x65,0xfb,0x12,0x3, 0x3c,0x91,0x59,0x90,0x0, 0xc, 0x12,0x16,0x93,0xc0, +0x6, 0xc0,0x7, 0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x28,0x91,0x77,0xd0,0x7, 0xd0, +0x6, 0xf1,0x7d,0x80,0x5, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf5,0x2c,0x8e,0x2b, +0xe5,0x2e,0x12,0x16,0xb1,0x90,0x0, 0x28,0x91,0x53,0x90,0x0, 0xc, 0xf1,0xd9,0x40, +0x10,0x12,0x16,0xb4,0x90,0x0, 0x28,0xe5,0x2b,0x85,0x2c,0xf0,0x12,0x2, 0xef,0x80, +0xc, 0x12,0x16,0xb4,0xe9,0x24,0x28,0x12,0x65,0xfb,0x12,0x3, 0x3c,0x5, 0x2f,0x41, +0x5, 0xe4,0xf5,0x2f,0xe5,0x2f,0x12,0x16,0xb1,0x90,0x0, 0x26,0x12,0x2, 0xb7,0x90, +0x0, 0xa, 0x91,0x7e,0x90,0x0, 0x28,0x12,0x2, 0xb7,0x90,0x0, 0xc, 0x91,0x7e,0xf1, +0xf, 0xfd,0xf1,0x9f,0x90,0x0, 0xe, 0xed,0x12,0x1, 0xd7,0x5, 0x2f,0xe5,0x2f,0x64, +0x5, 0x70,0xd1,0xf1,0x89,0x44,0x1, 0x12,0x1, 0xc5,0xe5,0x30,0xd3,0x94,0x0, 0x50, +0x2, 0x81,0x52,0xe4,0xf5,0x2f,0x91,0x59,0x90,0x0, 0xc, 0x12,0x2, 0xb7,0xd3,0x94, +0x7f,0xe5,0xf0,0x94,0x4, 0x50,0x39,0x90,0x0, 0xa, 0x12,0x16,0x93,0x12,0x16,0x50, +0xac,0x6, 0xad,0x7, 0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x28,0x25, +0x2a,0xf9,0xe5,0x29,0x3e,0xfa,0xec,0xf1,0x97,0x90,0x0, 0xc, 0x12,0x16,0x93,0x11, +0x3, 0xac,0x6, 0xad,0x7, 0xe5,0x2f,0x12,0x16,0xb1,0x90,0x0, 0x5, 0xec,0x80,0x1e, +0x12,0x65,0xcc,0x90,0x0, 0xa, 0x12,0x2, 0xb7,0xfd,0x91,0xa6,0xe5,0xf0,0xf1,0x97, +0x90,0x0, 0xc, 0x12,0x2, 0xb7,0xfd,0x91,0xa6,0x90,0x0, 0x5, 0xe5,0xf0,0x8d,0xf0, +0x12,0x3, 0x5b,0x12,0x65,0xcc,0xf1,0x15,0x91,0xa6,0xed,0x12,0x46,0xe2,0xf1,0xb0, +0x40,0x84,0x22,0x12,0x2, 0xb7,0xfd,0xac,0xf0,0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0xab, +0x22,0x25,0x24,0xf9,0xe5,0x23,0x35,0xf0,0xfa,0x22,0x74,0xff,0xf0,0xe5,0x2d,0x75, +0xf0,0x7, 0xa4,0x22,0x90,0x0, 0x1, 0x12,0x2, 0xb7,0xfd,0xac,0xf0,0x22,0xff,0xe5, +0xf0,0xc4,0xf8,0x54,0xf0,0xc8,0x68,0xfc,0xef,0xc4,0x54,0xf, 0x48,0xfd,0xe5,0x2f, +0x75,0xf0,0x7, 0xa4,0xff,0xae,0xf0,0xab,0x22,0x25,0x24,0xf9,0xe5,0x23,0x3e,0xfa, +0xec,0x8d,0xf0,0x12,0x3, 0x5b,0xab,0x28,0xe5,0x2a,0x2f,0xf9,0xe5,0x29,0x3e,0xfa, +0x22,0x12,0x20,0xed,0xe4,0xf5,0x30,0xf5,0x31,0x12,0x7, 0x7d,0xf5,0x32,0x70,0x43, +0xf5,0x2e,0xe5,0x2e,0xfd,0x33,0x95,0xe0,0xfc,0x12,0x46,0xf7,0x74,0xcf,0x2f,0xf5, +0x82,0x74,0xa, 0x12,0x67,0x60,0x90,0xa, 0xb0,0x75,0xf0,0x7, 0xed,0x12,0x5, 0x40, +0xec,0x75,0xf0,0x7, 0xa4,0x25,0x83,0xf5,0x83,0x74,0xff,0xf0,0xf1,0x64,0xfe,0x74, +0xd9,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x74,0x2, 0xf0,0x5, 0x2e,0xe5,0x2e, +0xb4,0x5, 0xbf,0xe4,0xf5,0x2e,0x12,0x16,0x49,0x12,0x7, 0x7d,0xfd,0xf1,0x64,0xfe, +0xc3,0xef,0x9d,0x74,0x80,0xf8,0x6e,0x98,0x40,0x2, 0xc1,0xc4,0xd1,0xf2,0x12,0x37, +0x3a,0xf1,0x9, 0xff,0xf4,0x70,0x2, 0xc1,0xc0,0x12,0x58,0xe6,0x12,0x1, 0x4c,0x60, +0x6, 0x64,0x2, 0x60,0x2, 0xc1,0xc0,0xe4,0xf5,0x2f,0xd1,0xeb,0x91,0xa6,0xf1,0x9, +0xff,0xd1,0xdf,0x34,0xa, 0xf5,0x83,0xe0,0x6f,0x60,0x2, 0xc1,0xba,0x90,0x0, 0x2, +0x12,0x16,0x93,0xe5,0x2f,0x75,0xf0,0x7, 0xa4,0x24,0xae,0xf5,0x82,0xe4,0x34,0xa, +0xf1,0x56,0xf1,0x74,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0x12,0x16,0x49,0xf1,0x64, +0x8f,0x82,0xf5,0x83,0x74,0x7, 0x12,0x5, 0x2f,0x12,0x16,0x93,0xe5,0x2f,0x75,0xf0, +0x7, 0xa4,0x24,0xac,0xf5,0x82,0xe4,0x34,0xa, 0xf1,0x56,0xf1,0x74,0x12,0x0, 0x6, +0xd0,0xe0,0x2f,0xf5,0x31,0xd0,0xe0,0x3e,0xf5,0x30,0xd1,0xdf,0x34,0xa, 0xf5,0x83, +0xe0,0xff,0xf1,0xc2,0xd3,0x94,0x0, 0x40,0x12,0xef,0xd1,0xff,0xf1,0xb8,0xd1,0xdf, +0x34,0xa, 0xf5,0x83,0xe0,0xf1,0xc2,0x14,0xf0,0xc1,0xc0,0xd1,0xdf,0xd1,0xf9,0xf1, +0x56,0xfd,0xd3,0x94,0x64,0xec,0x94,0x0, 0x40,0xd, 0xd3,0xe5,0x31,0x94,0x64,0xe5, +0x30,0x94,0x0, 0x40,0x2, 0x80,0x1e,0xed,0x24,0x32,0xff,0xe4,0x3c,0xfe,0xd3,0xe5, +0x31,0x9f,0xe5,0x30,0x9e,0x40,0x11,0xd1,0xdf,0xd1,0xf9,0xf1,0x56,0xd3,0x94,0x32, +0xec,0x94,0x0, 0x40,0x3, 0xef,0xc1,0xb4,0xd1,0xdf,0x34,0xa, 0xf5,0x83,0xe0,0xfd, +0xd1,0xff,0xf5,0x83,0xa3,0xe0,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xff,0x5, 0x82,0xd5, +0x82,0x2, 0x15,0x83,0x15,0x82,0xe0,0xc4,0x54,0xf0,0x48,0xfe,0xc3,0xe5,0x31,0x9f, +0xe5,0x30,0x9e,0x50,0x3, 0xed,0xc1,0xb4,0x12,0x4e,0x61,0x90,0x0, 0x4, 0x12,0x2, +0xb7,0xff,0xd3,0xe5,0x31,0x9f,0xe5,0x30,0x95,0xf0,0x40,0x71,0xd1,0xeb,0x91,0xa6, +0xf1,0x9, 0xff,0x12,0x58,0xe6,0x12,0x1, 0x4c,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74, +0x1, 0x12,0x1, 0xc5,0xd1,0xeb,0x91,0xa6,0xf1,0x9, 0xfd,0xe5,0x2a,0x24,0x28,0xf9, +0xe4,0x35,0x29,0x12,0x59,0x71,0x91,0xa6,0x78,0x3c,0x7c,0xa, 0x7d,0x1, 0xf1,0x5d, +0xe5,0x32,0xd3,0x94,0x0, 0x40,0x36,0x15,0x32,0xe5,0x32,0x12,0x16,0xb1,0xc0,0x3, +0xc0,0x2, 0xc0,0x1, 0xd1,0xeb,0xe5,0x2a,0x2f,0xf9,0xe5,0x29,0x3e,0xa8,0x1, 0xfc, +0xad,0x3, 0xd0,0x1, 0xd0,0x2, 0xd0,0x3, 0xf1,0x5d,0xe5,0x32,0x75,0xf0,0x7, 0xa4, +0x25,0x2a,0xf9,0xe5,0x29,0x35,0xf0,0x7f,0x7, 0xf1,0xe7,0x15,0x2e,0xd1,0xdf,0x34, +0xa, 0xf5,0x83,0xe0,0xd1,0xff,0xf1,0xb8,0x80,0x6, 0xf1,0xb0,0x50,0x2, 0xa1,0x3a, +0x5, 0x2e,0xa1,0x6, 0x12,0x16,0x49,0x90,0x0, 0x41,0xe5,0x32,0x12,0x1, 0xd7,0x78, +0xac,0x7c,0xa, 0x7d,0x1, 0x12,0x16,0x49,0x7e,0x0, 0x7f,0x23,0x2, 0x1, 0x26,0xe5, +0x2f,0x75,0xf0,0x7, 0xa4,0x24,0xb0,0xf5,0x82,0xe4,0x22,0xaf,0x2e,0xef,0x33,0x95, +0xe0,0xfe,0x7c,0x0, 0x7d,0x7, 0x2, 0x1, 0xf9,0x34,0xa, 0xf5,0x83,0xe0,0xff,0x25, +0xe0,0x24,0xcf,0xf5,0x82,0xe4,0x34,0xa, 0x22,0x90,0x0, 0x4, 0x2, 0x1, 0x65,0x90, +0x0, 0x2a,0x2, 0x1, 0x65,0x90,0x0, 0xe, 0x12,0x1, 0x65,0xfd,0x22,0xd3,0xef,0x9d, +0xee,0x9c,0x40,0x2, 0x80,0x50,0xc3,0xed,0x9f,0xff,0xec,0x9e,0xfe,0x22,0x90,0x0, +0x2a,0x12,0x1, 0x65,0xff,0xe5,0x2d,0x75,0xf0,0x7, 0xa4,0x24,0x40,0xf5,0x82,0xe4, +0x34,0xa, 0xf5,0x83,0x22,0xe5,0x2e,0x25,0xe0,0xff,0xe5,0x2d,0x33,0xfe,0xe5,0x32, +0x2f,0xf5,0x82,0xe5,0x31,0x3e,0xf5,0x83,0xe0,0xfc,0xa3,0xe0,0x22,0x7e,0x0, 0x7f, +0x7, 0x2, 0x1, 0x26,0xaf,0x2e,0xef,0x33,0x95,0xe0,0x22,0xff,0xc3,0xe5,0x2c,0x9f, +0xe5,0x2b,0x9e,0x22,0xfd,0xc3,0xef,0x9d,0xff,0xee,0x9c,0xfe,0x22,0xf1,0x1d,0x8e, +0x2b,0x8f,0x2c,0xe5,0x2c,0xa8,0x2d,0x8, 0x22,0xab,0x28,0xe5,0x2a,0x24,0x4f,0xf9, +0xe4,0x35,0x29,0xfa,0x2, 0x1, 0x4c,0x90,0x0, 0x3, 0x8d,0xf0,0x12,0x3, 0x5b,0xab, +0x22,0xe5,0x24,0x2f,0xf9,0xe5,0x23,0x3e,0xfa,0x22,0x90,0x0, 0x4c,0x2, 0x1, 0x65, +0x5, 0x2f,0xe5,0x2f,0xc3,0x94,0x5, 0x22,0xf5,0x83,0xe5,0x30,0xf0,0xa3,0xe5,0x31, +0xf0,0x22,0x24,0xd9,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0xab,0x22,0xe5, +0x24,0x24,0xa, 0xf9,0xe4,0x35,0x23,0xfa,0x22,0x12,0x2, 0xb7,0xd3,0x9d,0xe5,0xf0, +0x9c,0xe5,0x2e,0x75,0xf0,0x7, 0x22,0xa8,0x1, 0xfc,0xad,0x28,0x7b,0x1, 0x7a,0xa, +0x79,0x3c,0x7e,0x0, 0x2, 0x1, 0x26,0x90,0x0, 0x4b,0x2, 0x1, 0x65,0x8e,0x26,0x8f, +0x27,0x11,0xed,0xc3,0xe5,0x26,0x94,0x0, 0x50,0x5, 0xe4,0xf5,0x26,0xf5,0x27,0xc3, +0xec,0x94,0x0, 0x50,0x3, 0xe4,0xfc,0xfd,0xd3,0xe5,0x27,0x94,0x3f,0xe5,0x26,0x94, +0x0, 0x50,0x12,0xe5,0x27,0x25,0xe0,0xff,0xe5,0x26,0x11,0xd5,0x50,0x39,0xe4,0xf5, +0x2b,0xf5,0x2c,0x80,0x32,0xc3,0xe5,0x27,0x94,0x80,0xe5,0x26,0x94,0x2, 0x40,0x2d, +0xe5,0x27,0x24,0x80,0xff,0xe5,0x26,0x34,0xfd,0xfe,0xe5,0x27,0x2f,0xf5,0x2c,0xe5, +0x26,0x3e,0xf5,0x2b,0xd3,0xe5,0x2c,0x94,0xbd,0xe5,0x2b,0x64,0x80,0x94,0x82,0x40, +0x6, 0x75,0x2b,0x2, 0x75,0x2c,0xbf,0x85,0x2b,0x26,0x85,0x2c,0x27,0xd3,0xed,0x94, +0x3f,0xec,0x94,0x0, 0x50,0x10,0xed,0x25,0xe0,0xff,0xec,0x11,0xd5,0x50,0x32,0xe4, +0xf5,0x2b,0xf5,0x2c,0x80,0x2b,0xc3,0xed,0x94,0x40,0xec,0x94,0x4, 0x40,0x26,0xed, +0x24,0xc0,0xff,0xec,0x34,0xfb,0xcf,0x2d,0xf5,0x2c,0xef,0x3c,0xf5,0x2b,0xd3,0xe5, +0x2c,0x94,0x7d,0xe5,0x2b,0x64,0x80,0x94,0x84,0x40,0x6, 0x75,0x2b,0x4, 0x75,0x2c, +0x7f,0xac,0x2b,0xad,0x2c,0x12,0x16,0x49,0xe5,0x26,0x85,0x27,0xf0,0x12,0x3, 0x3c, +0xab,0x28,0x74,0x2, 0x25,0x2a,0xf9,0xf5,0x2a,0xe4,0x35,0x29,0xfa,0xf5,0x29,0xec, +0x8d,0xf0,0x2, 0x3, 0x3c,0x33,0xfe,0xef,0x24,0xc1,0xf5,0x2c,0xee,0x34,0xff,0xf5, +0x2b,0xc3,0xe5,0x2c,0x94,0x2, 0xe5,0x2b,0x64,0x80,0x94,0x80,0x22,0x8b,0x28,0x8a, +0x29,0x89,0x2a,0x22,0x12,0x3f,0x4d,0xe4,0xf5,0x25,0x12,0x17,0x15,0x12,0x4e,0x82, +0xff,0xe5,0x25,0xc3,0x9f,0x50,0x20,0xe5,0x25,0x12,0x17,0xd2,0xfa,0x90,0x0, 0xa, +0x12,0x16,0x93,0x90,0x0, 0xc, 0x12,0x1c,0x77,0xe9,0x24,0xa, 0xf9,0xe4,0x3a,0xfa, +0x12,0x1f,0xfd,0x5, 0x25,0x80,0xd3,0x22,0x12,0x65,0xf0,0x74,0x60,0x12,0x65,0x53, +0x12,0x42,0x48,0xf1,0x1e,0x12,0x34,0x35,0x75,0x36,0x1, 0x75,0x37,0x8, 0x75,0x38, +0xc5,0x91,0xe3,0x12,0x36,0x9b,0x7b,0x1, 0x7a,0x9, 0x79,0xdf,0x12,0x59,0x14,0xe4, +0x90,0xc, 0xef,0xf0,0x7b,0x1, 0x7a,0x9, 0x79,0x3b,0x12,0x30,0xfe,0x90,0xc, 0x31, +0x74,0xa, 0xf0,0x90,0xc, 0x31,0xe0,0x70,0xfa,0x12,0x35,0xaf,0x7b,0x1, 0x7a,0x9, +0x79,0x5e,0xd1,0x33,0x7b,0x1, 0x7a,0x9, 0x79,0x5e,0xf1,0x39,0x90,0xb, 0x5e,0x74, +0x3, 0xf0,0x74,0xe8,0xf1,0x57,0x75,0x2c,0x9, 0x75,0x2d,0x3b,0x12,0xf, 0xc9,0x7e, +0x0, 0x7f,0x83,0x12,0x4f,0xe8,0xb1,0x5, 0x12,0x4f,0x54,0x12,0x37,0xaf,0x90,0xa, +0xde,0xf0,0xa3,0x74,0x64,0xf0,0x75,0x36,0x1, 0x75,0x37,0x0, 0x75,0x38,0x83,0xf1, +0x1e,0xf1,0xcb,0xe4,0x90,0x0, 0x52,0xf0,0xa3,0x4, 0x12,0x67,0x56,0x12,0x5a,0x8d, +0xe4,0x90,0xa, 0xe6,0xf0,0xa3,0xf0,0x7b,0x1, 0x7a,0xa, 0x79,0x2b,0x12,0x3f,0x6b, +0x90,0xc, 0x59,0xe0,0x64,0x1, 0x60,0x2, 0x81,0x9f,0x12,0x37,0xb0,0x90,0xa, 0xde, +0xf0,0x74,0x64,0x12,0x65,0x53,0x12,0x43,0xae,0xe4,0xf5,0xa, 0xf5,0x9, 0x90,0xc, +0x57,0xe0,0x70,0x5, 0x90,0x8, 0x2c,0x80,0x3, 0x90,0x8, 0x2e,0xe0,0xf5,0xb, 0x90, +0xc, 0x52,0xe0,0xf4,0x60,0x17,0x7e,0x0, 0x7f,0x0, 0x7c,0x9, 0x7d,0x3b,0x7a,0x0, +0x7b,0x83,0x75,0x28,0x9, 0x75,0x29,0x5e,0xf1,0x6f,0x12,0x46,0xe8,0xf1,0x15,0x12, +0x2f,0xf9,0x60,0xf9,0x90,0x8, 0x28,0xe0,0x90,0xc, 0x5b,0xf0,0x90,0x8, 0x32,0xe0, +0xb4,0x1, 0x5, 0xe4,0xff,0x12,0x37,0x84,0xb1,0x5, 0x12,0x52,0xa9,0x91,0xea,0x12, +0x5a,0xeb,0xf1,0x59,0x75,0x2c,0x9, 0x75,0x2d,0x18,0x91,0xe3,0x12,0x54,0x69,0x90, +0x8, 0x27,0xe0,0x90,0xc, 0x35,0xf0,0x90,0x8, 0x20,0xe0,0x90,0xc, 0x36,0xf0,0x75, +0x25,0x1, 0x75,0x26,0x9, 0x75,0x27,0x18,0xf1,0x62,0x75,0x2c,0xa, 0x75,0x2d,0x2b, +0x91,0xe3,0x12,0x57,0x8a,0x90,0x8, 0x20,0xe0,0x64,0x6, 0x70,0x42,0x12,0x5a,0x94, +0x40,0x20,0x75,0x34,0x1, 0x75,0x35,0x0, 0x75,0x36,0x83,0x75,0x37,0x1, 0x75,0x38, +0x9, 0x75,0x39,0x18,0x75,0x3a,0x1, 0x75,0x3b,0x0, 0x75,0x3c,0x0, 0x91,0xe3,0x12, +0x2a,0x9c,0x12,0x67,0x4c,0x12,0x66,0xb2,0x75,0x2c,0x8, 0x75,0x2d,0x33,0xf1,0x32, +0x12,0x4e,0xd0,0x90,0x8, 0x62,0xe0,0x30,0xe0,0x5, 0xe4,0x90,0x8, 0x20,0xf0,0x90, +0x8, 0x27,0xe0,0x70,0x10,0x90,0x8, 0x20,0xe0,0xb4,0x4, 0x9, 0x90,0xa, 0xe6,0xe4, +0xf0,0xa3,0x74,0xa, 0xf0,0xd3,0x90,0xa, 0xe7,0xe0,0x94,0x0, 0x90,0xa, 0xe6,0xe0, +0x94,0x0, 0x40,0x12,0xa3,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xe6,0xe0,0x34,0xff,0xf0, +0x90,0x8, 0x20,0x74,0x4, 0xf0,0x12,0x66,0x48,0xb1,0x5, 0x12,0x51,0x48,0x90,0x9, +0x15,0xef,0xf0,0x90,0x0, 0x0, 0xe0,0x14,0xf0,0x90,0xa, 0x2b,0xe0,0xb4,0x1, 0x11, +0x90,0xa, 0x2f,0xe0,0xff,0x90,0x8, 0x60,0xe0,0xfe,0xc3,0x9f,0x40,0x3, 0xee,0x9f, +0xf0,0x91,0xea,0x12,0x48,0xa3,0x91,0xe3,0x11,0xf4,0x90,0x0, 0x0, 0xe0,0x4, 0xf0, +0x90,0xa, 0x2b,0xe0,0x64,0x1, 0x70,0x52,0xf5,0x21,0x90,0xa, 0x2f,0xe0,0xff,0xe5, +0x21,0xc3,0x9f,0x50,0x3f,0x74,0x2c,0x25,0x21,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83, +0xe0,0xfd,0x90,0x8, 0x60,0xe0,0x25,0x21,0xfe,0x75,0xf0,0x7, 0xa4,0x24,0x3d,0xf5, +0x82,0xe4,0x34,0x8, 0xf5,0x83,0xe4,0xf0,0xa3,0xed,0xf0,0xee,0x75,0xf0,0x7, 0xa4, +0x24,0x3f,0xf5,0x82,0xe4,0x34,0x8, 0xf5,0x83,0x74,0x4, 0xf0,0xa3,0x74,0xbf,0xf0, +0x5, 0x21,0x80,0xb6,0x90,0x8, 0x60,0xe0,0x2f,0xf0,0x90,0x8, 0x20,0xe0,0xb4,0x6, +0xe, 0x90,0x8, 0x60,0xe0,0xd3,0x94,0x1, 0x40,0x5, 0xe4,0x90,0x8, 0x20,0xf0,0x12, +0x67,0x4c,0x75,0x28,0x1, 0x75,0x29,0x9, 0x75,0x2a,0x18,0xf1,0x1e,0x12,0x55,0xb5, +0x90,0x8, 0x27,0xe0,0x70,0xf, 0x90,0x8, 0x61,0xe0,0xff,0x90,0x8, 0x60,0xe0,0xd3, +0x9f,0x40,0xa, 0x80,0x0, 0x12,0x66,0x48,0xb1,0x5, 0x12,0x45,0x3c,0x90,0x8, 0x60, +0xe0,0xa3,0xf0,0x90,0x9, 0x10,0xf0,0xf1,0x32,0x91,0xa5,0x90,0x9, 0x10,0xe0,0x90, +0x8, 0x60,0xf0,0x90,0xa, 0x22,0x74,0x1, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0x74,0x25, +0xf0,0x12,0x66,0x48,0x7b,0x1, 0x7a,0x9, 0x79,0xdf,0x12,0x17,0x1c,0x90,0x8, 0xc5, +0x74,0x1, 0xf0,0xa3,0x74,0x9, 0xf0,0xa3,0x74,0xdf,0xf0,0x90,0x8, 0x60,0xe0,0x90, +0x9, 0x10,0xf0,0x12,0x67,0x42,0x75,0x28,0x1, 0x75,0x29,0x8, 0x75,0x2a,0xc5,0x91, +0xe3,0x12,0x18,0x2d,0xe4,0xf5,0x21,0x12,0x66,0xa4,0x12,0x55,0xae,0x64,0xbf,0x70, +0x3, 0xee,0x64,0x4, 0x70,0x37,0x12,0x66,0x38,0xa3,0xe0,0xff,0x25,0xe0,0x25,0xe0, +0x24,0x30,0xf5,0x82,0xe4,0x34,0xa, 0x12,0x1f,0x56,0xfd,0x12,0x66,0x38,0xec,0xf0, +0xa3,0xed,0xf0,0xef,0x25,0xe0,0x25,0xe0,0x24,0x32,0xf5,0x82,0xe4,0x34,0xa, 0x12, +0x55,0xae,0xff,0x12,0x66,0xa4,0xf5,0x83,0xee,0xf0,0xa3,0xef,0xf0,0x5, 0x21,0xe5, +0x21,0x64,0x5, 0x70,0xb2,0x12,0x67,0x42,0xf1,0x32,0x12,0x3d,0x41,0x75,0x25,0x1, +0x75,0x26,0x8, 0x75,0x27,0x29,0x12,0x66,0xb2,0x75,0x2c,0x0, 0x75,0x2d,0x83,0x75, +0x2e,0x1, 0x75,0x2f,0x8, 0x75,0x30,0x33,0xf1,0x32,0x12,0x50,0x1a,0x21,0xd0,0x12, +0x30,0xdd,0x2, 0x0, 0x21,0x12,0x1f,0xaa,0xff,0xd3,0x94,0x0, 0x50,0x34,0x12,0x1f, +0xf7,0xd3,0x9f,0x40,0x1d,0x90,0x0, 0x50,0x12,0x1, 0x65,0xff,0x90,0xc, 0xef,0xe0, +0xc3,0x9f,0x50,0x13,0xe0,0x4, 0xf0,0x12,0x1f,0xaa,0x90,0x0, 0x4b,0x12,0x1, 0xd7, +0x80,0x5, 0xe4,0x90,0xc, 0xef,0xf0,0x12,0x1f,0xf7,0x70,0x6, 0xe9,0x24,0x4f,0x12, +0x3f,0x5f,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0x33,0x22,0x75,0x25,0x1, 0x75,0x26,0x0, +0x75,0x27,0x0, 0x75,0x28,0x1, 0x75,0x29,0x9, 0x75,0x2a,0x18,0x75,0x2b,0x1, 0x75, +0x2c,0x8, 0x75,0x2d,0x33,0x7b,0x1, 0x7a,0x0, 0x79,0x83,0x22,0x12,0x37,0xa2,0xe4, +0xf5,0x2d,0xd1,0x16,0x85,0x2d,0x82,0x12,0x63,0xd9,0xfd,0xaf,0x2d,0x12,0x0, 0x4e, +0xe5,0x2d,0x24,0x1c,0x12,0x67,0x80,0xd1,0x24,0x12,0x67,0x1e,0x24,0x38,0xd1,0x1d, +0x12,0x67,0x1e,0x24,0x54,0x12,0x67,0x78,0xd1,0x24,0xf1,0x25,0x94,0x1c,0x40,0xd2, +0xd1,0x16,0x90,0x0, 0x70,0x12,0x1, 0x65,0xfd,0x7f,0x7e,0x12,0x0, 0x4e,0xd1,0x16, +0x90,0x0, 0x71,0x12,0x1, 0x65,0xfd,0x7f,0x7f,0x12,0x0, 0x4e,0xd1,0x16,0x90,0x0, +0x73,0x12,0x1, 0x65,0xfd,0x7f,0x81,0x12,0x0, 0x4e,0xd1,0x16,0x90,0x0, 0x74,0x12, +0x1, 0x65,0x7f,0x82,0x12,0x67,0x70,0xe5,0x2d,0x24,0x83,0xff,0xab,0x2a,0xe5,0x2c, +0x24,0x75,0xd1,0x24,0xf1,0x25,0x94,0x4, 0x40,0xed,0xe4,0xf5,0x2d,0xe5,0x2d,0x24, +0x87,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x79,0xd1,0x24,0xf1,0x25,0x94,0x2, 0x40,0xed, +0xd1,0x16,0x90,0x0, 0x7b,0x12,0x1, 0x65,0xfd,0x7f,0x89,0x12,0x0, 0x4e,0xd1,0x16, +0x90,0x0, 0x7c,0x12,0x1, 0x65,0x7f,0x8c,0x12,0x67,0x70,0xe5,0x2d,0x24,0x8d,0xff, +0xab,0x2a,0xe5,0x2c,0x24,0x7d,0xd1,0x24,0xf1,0x25,0x94,0x3, 0x40,0xed,0xd1,0x16, +0x12,0x2d,0x9a,0xfd,0x7f,0x90,0x2, 0x0, 0x4e,0x12,0x36,0x0, 0x12,0x65,0xf0,0xa3, +0x74,0x60,0xf0,0xf1,0x1e,0x12,0x34,0x35,0x12,0x32,0x4, 0xb1,0xc, 0x53,0xdb,0xf0, +0xf1,0x3b,0x90,0xb, 0x5e,0x74,0x1, 0xf0,0x74,0x2c,0xf1,0x57,0x75,0x2c,0x8, 0x75, +0x2d,0x29,0x12,0xf, 0xc9,0x12,0x30,0xdd,0x12,0x5a,0x8d,0x90,0xc, 0xac,0xe0,0x54, +0x8f,0xf0,0x22,0x12,0x47,0xb2,0xab,0x2a,0xaa,0x2b,0xa9,0x2c,0x22,0xff,0xab,0x2a, +0xe5,0x2c,0x24,0x38,0xf9,0xe4,0x35,0x2b,0xfa,0xe5,0x2d,0x7c,0x0, 0x29,0xf9,0xec, +0x3a,0xfa,0x22,0x12,0x37,0xa2,0x78,0x2e,0x7c,0x0, 0x7d,0x0, 0x7b,0xff,0x7a,0xf, +0x79,0x95,0x7e,0x0, 0x7f,0x1c,0x12,0x1, 0x26,0xe4,0xf5,0x2d,0xf1,0x4b,0xe0,0xff, +0xc3,0x94,0x1c,0x50,0x53,0x12,0x47,0x5a,0xe0,0xd1,0x16,0x8f,0x82,0x75,0x83,0x0, +0x12,0x1, 0xd7,0xe5,0x2d,0x20,0xe0,0xf, 0x12,0x41,0x69,0xe0,0x54,0xf, 0xff,0xe9, +0x24,0x1c,0xf9,0xe4,0x3a,0x80,0x10,0xe5,0x2d,0x12,0x41,0x69,0xe0,0xc4,0x54,0xf, +0x12,0x67,0x80,0xf9,0xe4,0x35,0x2b,0xfa,0xf1,0x4b,0xe0,0xd1,0x2b,0xef,0x12,0x1, +0xc5,0x74,0x2e,0x25,0x2d,0xf8,0xe6,0x12,0x67,0x78,0xf9,0xe4,0x35,0x2b,0xfa,0xf1, +0x4b,0xe0,0xd1,0x2b,0xef,0x12,0x1, 0xc5,0x90,0xa, 0xef,0xe0,0xd1,0x1d,0xef,0x12, +0x1, 0xc5,0x5, 0x2d,0xe5,0x2d,0x64,0x1c,0x70,0x92,0xd1,0x16,0x90,0x0, 0x70,0xe4, +0x12,0x1, 0xd7,0x90,0x0, 0x71,0x74,0x7, 0x12,0x1, 0xd7,0x90,0x0, 0x72,0x74,0x17, +0x12,0x1, 0xd7,0x90,0x0, 0x73,0x74,0x2, 0x12,0x1, 0xd7,0x90,0x0, 0x74,0x74,0x7f, +0x12,0x1, 0xd7,0xe4,0xfd,0xd1,0x13,0x7d,0x1, 0xd1,0x13,0x90,0x0, 0x7b,0x74,0xf, +0x12,0x1, 0xd7,0x90,0x0, 0x7c,0x74,0x21,0x12,0x67,0xa8,0xff,0x90,0x0, 0x7d,0x12, +0x1, 0xd7,0x90,0x0, 0x7e,0xef,0x12,0x1, 0xd7,0x90,0x0, 0x7f,0xef,0x12,0x67,0x3, +0x74,0x5d,0x2, 0x1, 0xd7,0x75,0x4b,0x1, 0x75,0x4c,0x0, 0x75,0x4d,0x83,0x7b,0x1, +0x7a,0x0, 0x79,0x0, 0x22,0x12,0x1, 0x4c,0xfd,0x12,0x0, 0x4e,0x5, 0x2d,0xe5,0x2d, +0xc3,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0xc5,0x22,0xb1,0xc, 0x53,0xdb,0xfd,0xd2,0xba, +0x43,0xdb,0x1, 0x43,0xdb,0x20,0x22,0xef,0x12,0x1, 0xc5,0x74,0xfb,0x25,0x2d,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xa3,0xf0,0x75,0x25,0x1, 0x75,0x26,0x0, 0x75, +0x27,0x0, 0x75,0x28,0x1, 0x75,0x29,0x0, 0x75,0x2a,0x83,0x75,0x2b,0x1, 0x22,0x8e, +0x22,0x8f,0x23,0x8c,0x24,0x8d,0x25,0x8a,0x26,0x8b,0x27,0x12,0x37,0xa9,0x12,0x3f, +0x9e,0xaa,0x22,0xa9,0x23,0x7b,0x1, 0x12,0x34,0x35,0xaa,0x24,0xa9,0x25,0x7b,0x1, +0x12,0x30,0xfe,0xe5,0x23,0x24,0x55,0xf5,0x82,0xe4,0x35,0x22,0xf5,0x83,0x74,0x21, +0xf0,0xaa,0x28,0xa9,0x29,0x7b,0x1, 0xd1,0x33,0xaa,0x28,0xa9,0x29,0x7b,0x1, 0xb1, +0xc, 0xf1,0x3b,0xaa,0x26,0xa9,0x27,0x7b,0x1, 0x12,0x35,0xfd,0xaa,0x22,0xa9,0x23, +0x7b,0x1, 0xc0,0x3, 0x8b,0x36,0x12,0x4f,0x44,0xd0,0x3, 0x8b,0x33,0x8a,0x34,0x89, +0x35,0x12,0x67,0x32,0xf5,0x40,0x12,0x2f,0xf3,0xf5,0x41,0x90,0x0, 0x53,0xe4,0x12, +0x1, 0xd7,0x90,0x0, 0x52,0xe4,0x12,0x1, 0xd7,0xe5,0x38,0x24,0x80,0xf9,0xe5,0x37, +0x34,0x3, 0xaf,0x1, 0xf5,0x3e,0x8f,0x3f,0x85,0x37,0x3c,0x85,0x38,0x3d,0x75,0x39, +0x1, 0x85,0x36,0x4b,0x85,0x37,0x4c,0x85,0x38,0x4d,0xab,0x33,0xaa,0x34,0xa9,0x35, +0xf1,0xf9,0x60,0xed,0xe4,0xf5,0x3a,0xf5,0x3b,0x12,0x67,0x38,0xe5,0x3f,0x2f,0xf5, +0x82,0xe5,0x3e,0x12,0x55,0xad,0x78,0x2, 0x12,0x58,0xf8,0xd8,0xfb,0xfd,0xac,0x6, +0x12,0x67,0x38,0xe5,0x3d,0x2f,0xf5,0x82,0xe5,0x3c,0x3e,0xf5,0x83,0xec,0x8d,0xf0, +0x12,0x2, 0x60,0x5, 0x3b,0xe5,0x3b,0x70,0x2, 0x5, 0x3a,0xb4,0xc0,0xcb,0xe5,0x3a, +0xb4,0x1, 0xc6,0x5, 0x39,0xe5,0x39,0xd3,0x94,0x4, 0x40,0xa5,0xab,0x33,0xaa,0x34, +0xa9,0x35,0x90,0x0, 0x53,0xe5,0x40,0x12,0x1, 0xd7,0x90,0x0, 0x52,0xe5,0x41,0x2, +0x1, 0xd7,0x8b,0x48,0x8a,0x49,0x89,0x4a,0x75,0x51,0x20,0x90,0x0, 0x55,0x12,0x1, +0x65,0xf5,0x59,0x12,0x17,0xc1,0xf5,0x60,0x12,0x1, 0x4c,0xf5,0x61,0x85,0x60,0x62, +0xe5,0x60,0x25,0xe0,0xf5,0x63,0x12,0x67,0x32,0xf5,0x64,0xf1,0xf3,0xf5,0x67,0x90, +0x0, 0x82,0x12,0x1, 0x65,0xf5,0x68,0xab,0x4b,0xaa,0x4c,0xa9,0x4d,0x90,0x7, 0xa5, +0xe5,0x17,0x12,0x1, 0xd7,0x12,0x64,0x4e,0xef,0x70,0x3, 0x7f,0xaa,0x22,0xab,0x4b, +0xaa,0x4c,0xa9,0x4d,0x90,0x7, 0x9a,0x12,0x5, 0x6c,0xaf,0x1, 0x8a,0x65,0x8f,0x66, +0xaf,0x61,0x7e,0x0, 0xab,0x48,0xe5,0x4a,0x24,0x56,0xf9,0xe4,0x35,0x49,0xfa,0x78, +0x6d,0x7c,0x0, 0x7d,0x0, 0x12,0x1, 0x26,0xaf,0x60,0x7e,0x0, 0xab,0x48,0xe5,0x4a, +0x24,0x72,0xf9,0xe4,0x35,0x49,0xfa,0x78,0x89,0x7c,0x0, 0x7d,0x0, 0x12,0x1, 0x26, +0xe5,0x59,0x54,0x30,0x60,0x78,0x75,0x4e,0x10,0x75,0x4f,0x0, 0xe4,0x25,0x4d,0xf9, +0xe5,0x4c,0x34,0x7, 0xaf,0x1, 0xf5,0x5c,0x8f,0x5d,0xe4,0xf5,0x50,0xe5,0x50,0xc3, +0x95,0x60,0x50,0x5a,0xb1,0xb0,0xe0,0xfe,0xa3,0xe0,0xff,0x85,0x5d,0x82,0x85,0x5c, +0x83,0x51,0x90,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x59,0x30,0xe5,0x19,0xb1,0xb0,0x75, +0xf0,0x2, 0xe5,0x62,0x12,0x35,0xef,0xff,0xe5,0x5d,0x24,0x20,0x12,0x67,0x90,0x51, +0x95,0xee,0xf0,0xa3,0xef,0xf0,0xe5,0x59,0x54,0x30,0x64,0x30,0x70,0x19,0xb1,0xb0, +0x75,0xf0,0x2, 0xe5,0x63,0x12,0x35,0xef,0xff,0xe5,0x5d,0x24,0x40,0x12,0x67,0x90, +0x51,0x90,0xee,0xf0,0xa3,0xef,0xf0,0x12,0x66,0xd5,0x5, 0x50,0x80,0x9f,0xe5,0x59, +0x54,0x3, 0xf5,0x58,0x70,0x2, 0x41,0x8a,0xe5,0x68,0xb4,0x1, 0x8, 0x75,0x4e,0x10, +0x75,0x4f,0x60,0x80,0x6, 0x75,0x4e,0x10,0x75,0x4f,0x48,0x85,0x4e,0x52,0x85,0x4f, +0x53,0xe5,0x4d,0x24,0x80,0xf9,0xe5,0x4c,0x34,0x3, 0xaf,0x1, 0xf5,0x54,0x8f,0x55, +0x85,0x4c,0x56,0x85,0x4d,0x57,0xe4,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x61,0x40,0x2, +0x41,0x8a,0x85,0x51,0xf0,0x12,0x67,0x88,0xff,0xae,0xf0,0x25,0x55,0xfd,0xe5,0x54, +0x3e,0xf5,0x5a,0x8d,0x5b,0xe5,0x57,0x2f,0xff,0xe5,0x56,0x3e,0xf5,0x5c,0x8f,0x5d, +0xe4,0xfd,0xed,0xc3,0x95,0x60,0x40,0x2, 0x41,0x6c,0xb1,0xb0,0xe0,0xf5,0x5e,0xa3, +0xe0,0xf5,0x5f,0xe5,0x67,0x70,0x29,0x85,0x60,0xf0,0x12,0x67,0x88,0x25,0x66,0xf5, +0x82,0xe5,0x65,0x35,0xf0,0xf5,0x83,0x74,0x89,0x2d,0xf8,0xe6,0x25,0x82,0x12,0x3f, +0x34,0x75,0xf0,0x8, 0xa4,0xae,0xf0,0x25,0x5f,0xf5,0x5f,0xee,0x35,0x5e,0xf5,0x5e, +0xe5,0x64,0x60,0x30,0x85,0x5d,0x82,0x85,0x5c,0x83,0x74,0x89,0x2d,0xf8,0xe6,0xff, +0x51,0x96,0xe0,0xfa,0xa3,0xe0,0xfb,0xc3,0xe5,0x5f,0x9b,0xfb,0xe5,0x5e,0x9a,0xfa, +0x85,0x5a,0x83,0x85,0x5b,0x82,0x75,0xf0,0x2, 0xef,0x12,0x5, 0x40,0xea,0xf0,0xa3, +0xeb,0xf0,0x80,0x12,0x85,0x5b,0x82,0x85,0x5a,0x83,0x74,0x89,0x2d,0x51,0x94,0xe5, +0x5e,0xf0,0xa3,0xe5,0x5f,0xf0,0x12,0x66,0xd5,0xd, 0x21,0xe2,0xe5,0x68,0xb4,0x1, +0x4, 0x74,0x20,0x80,0x2, 0x74,0x48,0x25,0x53,0xf5,0x53,0xe4,0x35,0x52,0xf5,0x52, +0x85,0x52,0x4e,0x85,0x53,0x4f,0x5, 0x50,0x21,0xb9,0x12,0x27,0x3b,0x7f,0x0, 0x22, +0x74,0x89,0x25,0x50,0xf8,0xe6,0x75,0xf0,0x2, 0x2, 0x5, 0x40,0x12,0x57,0x70,0x12, +0x4e,0x82,0xf5,0x43,0x12,0x55,0x7b,0xf5,0x44,0xe5,0x43,0xd3,0x94,0x0, 0x50,0x8, +0xe5,0x44,0x94,0x0, 0x50,0x2, 0xa1,0x70,0xb1,0x7e,0x90,0x0, 0x82,0x74,0x1, 0x12, +0x1, 0x92,0x90,0x0, 0x82,0x12,0x1, 0x65,0x64,0x5, 0x60,0x2, 0xa1,0x7d,0xb1,0x7e, +0x90,0x0, 0x82,0x12,0x1, 0xd7,0xb1,0x9a,0x60,0x2, 0x61,0xb0,0xb1,0x7e,0xb1,0xaa, +0x60,0x2, 0x61,0xb0,0x90,0x0, 0x83,0x12,0x67,0x3, 0xe5,0x43,0x12,0x1, 0xd7,0x90, +0x0, 0x81,0xe5,0x44,0x12,0x1, 0xd7,0xe4,0xf5,0x3d,0xe5,0x43,0x25,0x44,0xff,0xe4, +0x33,0xfe,0xc3,0xe5,0x3d,0xb1,0xd4,0x40,0x2, 0xa1,0x7d,0xe5,0x3d,0xc3,0x95,0x43, +0x50,0x2a,0xe5,0x33,0x24,0x30,0xf9,0xe4,0x35,0x32,0xb1,0xc4,0x12,0x17,0xd5,0xb1, +0xb7,0xb1,0x7e,0x75,0xf0,0x2, 0xe5,0x3d,0x12,0x16,0xe3,0x12,0x67,0xa0,0xe5,0x3d, +0x75,0xf0,0x2, 0x12,0x17,0xd5,0xfa,0x90,0x0, 0x1, 0x80,0x3d,0xab,0x31,0xe5,0x33, +0x24,0x58,0xf9,0xe4,0x35,0x32,0xfa,0xc3,0xe5,0x3d,0x95,0x43,0xfd,0xe4,0x94,0x0, +0xfc,0xed,0xae,0x4, 0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea, +0x3e,0xb1,0xb7,0x12,0x46,0xf7,0xab,0x31,0xe5,0x33,0x2f,0xf9,0xe5,0x32,0x3e,0xfa, +0x90,0x0, 0x87,0x12,0x67,0xa0,0x90,0x0, 0x88,0x12,0x1, 0x65,0xc3,0x13,0xf5,0x41, +0xb1,0x8c,0xa3,0xe5,0x42,0xf0,0xb1,0x8c,0xe5,0x41,0xf0,0xb1,0xa0,0xf5,0x83,0x74, +0x1, 0xf0,0xd1,0xd2,0xe5,0x42,0x12,0x59,0x7, 0xe5,0x41,0x12,0x5, 0x40,0x12,0x2, +0xb7,0xff,0xb1,0x8c,0xa3,0xa3,0xe5,0xf0,0xf0,0xa3,0xef,0xf0,0x5, 0x3d,0x41,0xfa, +0xb1,0x7e,0xb1,0xaa,0xff,0xb1,0x9a,0x2f,0xf5,0x3e,0xe4,0xf5,0x3d,0xb1,0x7e,0xb1, +0xaa,0xff,0xb1,0x9a,0xb1,0xcb,0x40,0x2, 0xa1,0xc, 0xe5,0x3d,0xc3,0x9d,0x50,0x7, +0xb1,0xbe,0x12,0x17,0xd5,0x80,0x12,0xb1,0x94,0x12,0x62,0x90,0xef,0x78,0x3, 0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x66,0x96,0xb1,0xb7,0x12,0x66,0xe1,0xb1,0x8b, +0xa3,0xe0,0x75,0xf0,0x20,0xb1,0x85,0xe0,0x75,0xf0,0x2, 0x12,0x16,0xe3,0x12,0x2, +0xb7,0xf5,0x40,0x85,0xf0,0x3f,0xb1,0xa0,0xf5,0x83,0xe0,0x70,0x4, 0x15,0x3e,0xa1, +0x8, 0xe4,0xf5,0x48,0xf5,0x47,0x12,0x63,0xe7,0x12,0x1, 0x4c,0xff,0xe5,0x47,0xc3, +0x9f,0x40,0x2, 0x81,0xbe,0xb1,0x8c,0xa3,0xe0,0xff,0x65,0x47,0x70,0x2, 0x81,0xba, +0x12,0x66,0xe1,0xfa,0x75,0xf0,0x20,0xef,0xb1,0x85,0xe0,0x75,0xf0,0x2, 0x12,0x16, +0xe3,0x12,0x1c,0x77,0xb1,0x8c,0xa3,0xe0,0x75,0xf0,0x10,0xa4,0xff,0xb1,0x8c,0xe0, +0x12,0x62,0xd4,0x12,0x46,0x76,0xaa,0x35,0xa9,0x36,0x12,0x67,0xa, 0xfd,0xec,0x35, +0xf0,0xfc,0xc0,0x4, 0xc0,0x5, 0xe5,0x47,0x12,0x65,0xad,0xc0,0x83,0xc0,0x82,0xb1, +0x8c,0xe0,0xff,0xd0,0x82,0xd0,0x83,0x51,0x96,0x12,0x1c,0x77,0xef,0xfb,0x7a,0x0, +0xe5,0x47,0x75,0xf0,0x10,0xa4,0x2b,0xff,0xea,0x35,0xf0,0x12,0x46,0x76,0xab,0x34, +0xaa,0x35,0x12,0x67,0xa, 0xff,0xec,0x35,0xf0,0xfe,0xc3,0xd0,0xe0,0x9f,0xff,0xd0, +0xe0,0x9e,0xfe,0xb1,0x94,0xfd,0xe5,0x3d,0xc3,0x9d,0x50,0xe, 0xd1,0xd9,0x12,0x58, +0xff,0xe5,0xf0,0x12,0x62,0x80,0x40,0x2, 0x5, 0x48,0x5, 0x47,0x81,0x16,0x12,0x63, +0xe7,0x12,0x1, 0x4c,0xc3,0x13,0xff,0xe5,0x48,0xc3,0x9f,0x40,0xf, 0xd1,0xd2,0x12, +0x57,0x28,0x64,0x6, 0x60,0x6, 0xb1,0xa0,0xf5,0x83,0xe4,0xf0,0xb1,0x8c,0xa3,0x12, +0x4d,0xe1,0xc3,0xe5,0x40,0x9f,0xff,0xe5,0x3f,0x9e,0xfe,0x12,0x0, 0x6, 0x8e,0x3f, +0x8f,0x40,0x12,0x65,0x3, 0xff,0xd3,0xe5,0x40,0x9f,0x74,0x80,0xf8,0x65,0x3f,0x98, +0x40,0x6, 0xb1,0xa0,0xf5,0x83,0xe4,0xf0,0x5, 0x3d,0x61,0xbd,0xe5,0x3e,0x70,0x7, +0xb1,0x7e,0x90,0x0, 0x80,0x80,0x63,0xb1,0x7e,0x90,0x0, 0x83,0x12,0x1, 0x65,0xc3, +0x94,0x4, 0x40,0x42,0xe4,0xf5,0x3d,0xb1,0x7e,0xb1,0xaa,0xff,0xb1,0x9a,0xb1,0xcb, +0x50,0x4b,0xe5,0x3d,0xc3,0x9d,0x50,0x7, 0xb1,0xbe,0x12,0x17,0xd5,0x80,0x12,0xb1, +0x94,0x12,0x62,0x90,0xef,0x78,0x3, 0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x12,0x66, +0x96,0xb1,0xb7,0xb1,0xa0,0xf5,0x83,0xe0,0xb4,0x1, 0x7, 0xb1,0xa0,0xf5,0x83,0x74, +0x2, 0xf0,0x5, 0x3d,0x80,0xc1,0xb1,0x7e,0x90,0x0, 0x83,0x74,0x1, 0x2, 0x1, 0x92, +0xb1,0x7e,0x90,0x0, 0x83,0xe4,0x12,0x67,0x3, 0xe4,0x12,0x57,0x80,0x22,0xab,0x31, +0xaa,0x32,0xa9,0x33,0x22,0xa4,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x85,0x46,0x82,0x85, +0x45,0x83,0xa3,0x22,0xab,0x31,0xaa,0x32,0xa9,0x33,0x90,0x0, 0x80,0x2, 0x1, 0x65, +0xe5,0x46,0x24,0x7, 0xf5,0x82,0xe4,0x35,0x45,0x22,0x90,0x0, 0x81,0x2, 0x1, 0x65, +0x85,0x4f,0x82,0x85,0x4e,0x83,0x22,0xaf,0x1, 0xf5,0x45,0x8f,0x46,0x22,0xe9,0x24, +0x30,0xf9,0xe4,0x3a,0xfa,0xe5,0x3d,0x75,0xf0,0x8, 0x22,0xfd,0x2f,0xff,0xe4,0x33, +0xfe,0xe5,0x3d,0xc3,0x9f,0xee,0x64,0x80,0xf8,0x74,0x80,0x98,0x22,0x12,0x57,0x70, +0x12,0x1, 0x4c,0x13,0x13,0x54,0x3f,0xf5,0x3c,0x12,0x17,0xc1,0x13,0x13,0x54,0x3f, +0xf5,0x3d,0xe4,0xf5,0x3e,0xf5,0x3f,0xf5,0x40,0xe5,0x3c,0x70,0x3, 0x75,0x3c,0x1, +0xe5,0x3d,0x70,0x3, 0x75,0x3d,0x1, 0xe4,0xf5,0x3a,0xb1,0x7e,0x12,0x1, 0x4c,0xff, +0xe5,0x3a,0xc3,0x9f,0x50,0x4e,0xe4,0xf5,0x3b,0xb1,0x7e,0x12,0x17,0xc1,0xff,0xe5, +0x3b,0xc3,0x9f,0x50,0x37,0xf1,0xca,0xfd,0xd3,0xef,0x9d,0x74,0x80,0xf8,0x65,0xf0, +0x98,0x40,0x4, 0x5, 0x3e,0x80,0x1b,0xf1,0xca,0xfd,0xc3,0xe4,0x9d,0xfd,0xe4,0x94, +0x0, 0xfc,0xc3,0xef,0x9d,0xec,0x64,0x80,0xf8,0xe5,0xf0,0x64,0x80,0x98,0x50,0x2, +0x5, 0x3f,0x5, 0x40,0xe5,0x3d,0x25,0x3b,0xf5,0x3b,0x80,0xbd,0xe5,0x3c,0x25,0x3a, +0xf5,0x3a,0x80,0xa6,0xe5,0x40,0xc3,0x13,0xff,0xe5,0x3e,0xd3,0x9f,0x40,0x21,0x90, +0x7, 0x9f,0x12,0x64,0xd3,0xfe,0xd1,0xd2,0x90,0x7, 0x9e,0x12,0x1, 0x65,0xc3,0x9e, +0x90,0x7, 0x9e,0x50,0x2, 0x80,0x25,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x1, 0x80,0x3f, +0xe5,0x3f,0xd3,0x9f,0x40,0x26,0x90,0x7, 0x9e,0x12,0x64,0xd3,0xff,0xd1,0xd2,0x90, +0x7, 0x9f,0x12,0x1, 0x65,0xc3,0x9f,0x90,0x7, 0x9f,0x50,0x7, 0x74,0x1, 0x12,0x1, +0x92,0x80,0x1c,0xe4,0x12,0x1, 0xd7,0x75,0x16,0x2, 0x80,0x13,0xd1,0xd2,0x90,0x7, +0x9f,0xe4,0x12,0x1, 0xd7,0x90,0x7, 0x9e,0xe4,0x12,0x1, 0xd7,0xe4,0xf5,0x16,0xaf, +0x16,0x22,0xab,0x34,0xaa,0x35,0xa9,0x36,0x22,0xab,0x37,0xaa,0x38,0xa9,0x39,0x22, +0x8b,0x37,0x8a,0x38,0x89,0x39,0x90,0x0, 0x19,0x12,0x1, 0x65,0xfd,0x7f,0x6, 0xf1, +0x43,0xd1,0xd9,0x90,0x0, 0x1a,0x12,0x1, 0x65,0xfd,0x7f,0xa, 0xf1,0x43,0x12,0x65, +0x3, 0xfd,0x7f,0x8, 0xf1,0x43,0xd1,0xd9,0x90,0x0, 0x1c,0x12,0x1, 0x65,0xfd,0x7f, +0xc, 0xf1,0x43,0xd1,0xd9,0x90,0x0, 0x1d,0x12,0x1, 0x65,0xfd,0x7f,0x2a,0xf1,0x43, +0xf1,0xe7,0xfd,0x7f,0x2e,0xf1,0x43,0xe4,0xfd,0x7f,0x1c,0xf1,0x43,0xd1,0xd9,0x90, +0x0, 0x21,0x12,0x1, 0x65,0xfd,0x7f,0x2, 0xf1,0x43,0x90,0x0, 0x22,0x12,0x57,0x77, +0xfd,0x7f,0x4, 0x12,0x63,0xfd,0xef,0x44,0x40,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x43,0xab,0x4, +0x22,0x8b,0x34,0x8a,0x35,0x89,0x36,0xe4,0xff,0x12,0x64,0x62,0xd1,0xd2,0x90,0x0, +0x18,0x12,0x1, 0x65,0xff,0x12,0x64,0x21,0x7f,0x1, 0x12,0x64,0x6d,0x12,0x64,0x33, +0xef,0x70,0x2, 0xff,0x22,0x7d,0x7f,0x7f,0x14,0xf1,0xb8,0xef,0x70,0x2, 0xff,0x22, +0xe5,0x36,0x24,0x10,0xf9,0xe4,0x35,0x35,0x85,0x34,0x3a,0xf5,0x3b,0x89,0x3c,0xd1, +0xd2,0x12,0x63,0x1d,0xd1,0xd2,0xd1,0xe0,0xe4,0xff,0x12,0x64,0x6d,0x12,0x64,0x45, +0xef,0x7f,0x0, 0x60,0x2, 0x7f,0x1, 0x22,0xae,0x5, 0xac,0x7, 0xf1,0x43,0x12,0x64, +0x4, 0xef,0x7f,0x0, 0xb5,0x6, 0x2, 0x7f,0x1, 0x22,0xab,0x34,0xaa,0x35,0xa9,0x36, +0x90,0x3, 0x80,0x75,0xf0,0x20,0xe5,0x3a,0x12,0x5, 0x40,0x75,0xf0,0x2, 0xe5,0x3b, +0x12,0x5, 0x40,0x12,0x2, 0xb7,0xff,0xab,0x37,0xaa,0x38,0xa9,0x39,0x90,0x0, 0x1e, +0x2, 0x1, 0x65,0x90,0x0, 0x52,0x2, 0x1, 0x65,0x11,0x72,0xef,0x64,0xaa,0x22,0xe4, +0x90,0xc, 0xdb,0xf0,0x90,0xc, 0xae,0xf0,0x22,0x75,0x10,0x4, 0x75,0x11,0x3, 0x12, +0x65,0xf0,0xa3,0x74,0x60,0xf0,0x12,0x3d,0x29,0x12,0x2f,0xff,0x12,0x27,0x1e,0x91, +0x35,0x7b,0x1, 0x7a,0x8, 0x79,0x29,0x11,0xfe,0xb1,0xaf,0x51,0xc, 0x12,0x27,0x39, +0x90,0x0, 0x1, 0xe0,0x90,0xc, 0xd5,0xf0,0x90,0x0, 0x0, 0xe0,0x90,0xc, 0xd4,0xf0, +0xd1,0x0, 0xe4,0x90,0x0, 0x52,0xf0,0xa3,0x12,0x67,0x56,0x90,0xc, 0xd2,0x74,0x3, +0xf0,0xd1,0x0, 0x90,0xc, 0xd1,0xe0,0x70,0x31,0x12,0x0, 0x1e,0x90,0xc, 0xd1,0x74, +0x1, 0xf0,0x7f,0x0, 0x7e,0x7c,0xf1,0x8d,0x75,0x24,0x1, 0x75,0x25,0x0, 0x75,0x26, +0x83,0x75,0x27,0x4, 0x12,0x27,0x1e,0x51,0x1c,0xe4,0xfd,0xff,0xfe,0x71,0x9f,0x7f, +0x4, 0x12,0x40,0xea,0x90,0xc, 0xd1,0x74,0xff,0xf0,0x90,0xc, 0xd2,0xe0,0x64,0x3, +0x70,0x43,0x90,0xc, 0xac,0xe0,0x30,0xe7,0xb8,0x12,0x27,0x1e,0x91,0x35,0xf1,0xa9, +0x51,0x4, 0x12,0x25,0xc, 0x12,0x27,0x3b,0x90,0xc, 0xda,0xe0,0x90,0x0, 0x52,0x70, +0x3, 0xf0,0x80,0x3, 0x74,0x1, 0xf0,0xe4,0x90,0x0, 0x53,0xf0,0xb1,0xaf,0x12,0x27, +0x15,0x12,0x2f,0xf9,0x60,0xf8,0x75,0x10,0x4, 0x75,0x11,0x3, 0x90,0xc, 0xac,0xe0, +0x54,0x7f,0xf0,0x1, 0x51,0x90,0xc, 0xd2,0xe0,0x90,0xc, 0x59,0xf0,0xe4,0xff,0xfd, +0xfc,0xe5,0xdb,0x20,0xe1,0xf, 0xf, 0xbf,0xff,0x5, 0xd, 0xbd,0x0, 0x1, 0xc, 0xbc, +0x3, 0xef,0xbd,0xe8,0xec,0x53,0xdb,0xfe,0x53,0xdb,0xfd,0xc2,0xba,0x22,0xf1,0xa2, +0xe4,0xf5,0x2e,0xe5,0x2e,0x20,0xe0,0x13,0xab,0x2a,0x31,0xfa,0xe5,0x2e,0xc3,0x13, +0x7e,0x0, 0x29,0xf9,0xee,0x3a,0xfa,0xe4,0x12,0x1, 0xc5,0xe5,0x2e,0xc3,0x94,0xb, +0x50,0x1e,0x74,0x33,0x25,0x2e,0x12,0x47,0x17,0xe0,0xff,0xe5,0x2e,0x90,0xf, 0x48, +0x93,0xf5,0x82,0x75,0x83,0x0, 0xa3,0xa3,0xa3,0x12,0x26,0x16,0xef,0x12,0x1, 0xd7, +0x5, 0x2e,0xe5,0x2e,0xb4,0x10,0xbc,0xe4,0xf5,0x2e,0xe5,0x2e,0x20,0xe0,0x5, 0xb1, +0xc6,0xe0,0x80,0x9, 0xe5,0x2e,0xb1,0xc6,0xe0,0x54,0xf0,0xff,0xc4,0x54,0xf, 0xf5, +0x2d,0xe5,0x2e,0xc3,0x94,0xb, 0x50,0x2c,0xe5,0x2e,0x90,0xf, 0x48,0x93,0xff,0x24, +0x3, 0xab,0x2a,0x20,0xe0,0xa, 0x31,0xfa,0xef,0x12,0x7, 0x6b,0x45,0x2d,0x80,0x11, +0x31,0xfa,0xe5,0x2e,0x90,0xf, 0x48,0x12,0x7, 0x6a,0xff,0xe5,0x2d,0xc4,0x54,0xf0, +0x4f,0x12,0x1, 0xc5,0x5, 0x2e,0xe5,0x2e,0x64,0x10,0x70,0xae,0x90,0xa, 0xed,0xe0, +0x12,0x26,0x16,0x90,0x0, 0x18,0x12,0x1, 0xd7,0x90,0xb, 0x17,0xe0,0x90,0x0, 0x19, +0xf1,0xbf,0x90,0x0, 0x1a,0x12,0x1, 0xd7,0x90,0x0, 0x1b,0xe4,0xf1,0xb7,0x90,0x0, +0x1c,0x12,0x1, 0xd7,0x90,0x0, 0x1e,0x74,0x13,0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74, +0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x21,0x74,0x3f,0x12,0x1, 0xd7,0x90,0x0, 0x22,0x74, +0x3f,0x12,0x1, 0xd7,0x90,0x0, 0x1d,0x74,0xa, 0x12,0x1, 0xd7,0x90,0x0, 0x1f,0x74, +0x1, 0x12,0x1, 0xd7,0x12,0x2f,0x61,0x8f,0x2d,0x22,0xe5,0x2c,0x24,0x10,0xf9,0xe4, +0x35,0x2b,0xfa,0x22,0x7b,0x1, 0x7a,0x8, 0x79,0x29,0x11,0xfe,0x7b,0x1, 0x7a,0x8, +0x79,0x4c,0x12,0x26,0x33,0x7b,0x1, 0x7a,0x8, 0x79,0x4c,0x22,0x8b,0x21,0x8a,0x22, +0x89,0x23,0xe4,0xf5,0x44,0xf5,0x45,0x74,0x60,0x25,0x45,0x12,0x47,0x45,0x5, 0x45, +0xe5,0x45,0x70,0x2, 0x5, 0x44,0x64,0xd1,0x45,0x44,0x70,0xeb,0x11,0xdd,0x12,0x27, +0x3b,0x85,0x24,0x4b,0x85,0x25,0x4c,0x85,0x26,0x4d,0xab,0x21,0xaa,0x22,0xa9,0x23, +0x12,0x2f,0xf9,0x60,0xec,0xe5,0x26,0x24,0x80,0xf9,0xe5,0x25,0x34,0x3, 0xaf,0x1, +0xf5,0x10,0x8f,0x11,0xe4,0xf5,0x2a,0xf5,0x2b,0xe4,0xf5,0x43,0xe5,0x2b,0x45,0x2a, +0x70,0x6, 0x71,0xf7,0xe4,0xf6,0x8, 0xf6,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33, +0xce,0x33,0xce,0xd8,0xf9,0xb1,0xe1,0xff,0x71,0xf7,0xe6,0xfc,0x8, 0xe6,0xfd,0xd3, +0xef,0x9d,0xee,0x9c,0x40,0xf, 0xef,0x94,0x1c,0xee,0x94,0x25,0x50,0x7, 0x71,0xf7, +0xa6,0x6, 0x8, 0xa6,0x7, 0x5, 0x43,0xe5,0x43,0xb4,0xb, 0xc0,0x5, 0x2b,0xe5,0x2b, +0x70,0x2, 0x5, 0x2a,0x64,0x13,0x45,0x2a,0x70,0xaf,0xe4,0xf5,0x46,0xf5,0x47,0xf5, +0x2a,0xf5,0x2b,0xe4,0xf5,0x43,0xe5,0x2b,0xae,0x2a,0x78,0x5, 0xc3,0x33,0xce,0x33, +0xce,0xd8,0xf9,0xb1,0xe1,0xff,0xd3,0x94,0x1c,0xee,0x94,0x25,0x40,0xa, 0x5, 0x47, +0xe5,0x47,0x70,0x2, 0x5, 0x46,0x80,0x45,0x71,0xf7,0xe6,0xfc,0x8, 0xe6,0xc3,0x9f, +0xf5,0x45,0xec,0x9e,0xf5,0x44,0xe5,0x45,0xae,0x44,0x78,0x3, 0xce,0xc3,0x13,0xce, +0x13,0xd8,0xf9,0xf5,0x45,0x8e,0x44,0xd3,0x94,0xff,0xe5,0x44,0x94,0x0, 0x40,0x6, +0x75,0x44,0x0, 0x75,0x45,0xff,0x5, 0x47,0xe5,0x47,0xac,0x46,0x70,0x2, 0x5, 0x46, +0x14,0x24,0x60,0xf5,0x82,0x74,0xb, 0x3c,0xf5,0x83,0xe5,0x45,0xf0,0x5, 0x43,0xe5, +0x43,0x64,0xb, 0x70,0x91,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0x64,0x13,0x45, +0x2a,0x70,0x80,0x75,0x28,0xa, 0x75,0x29,0xeb,0xe4,0xf5,0x2c,0xf5,0x2a,0xf5,0x2b, +0x85,0x29,0x82,0x85,0x28,0x83,0xe0,0x62,0x2c,0x7e,0x0, 0xe5,0x2b,0x25,0x27,0xff, +0xee,0x35,0x2a,0xfe,0x5, 0x29,0xe5,0x29,0xac,0x28,0x70,0x2, 0x5, 0x28,0x14,0xf5, +0x82,0x8c,0x83,0xe0,0xfd,0x71,0x9f,0x5, 0x2b,0xe5,0x2b,0x70,0x2, 0x5, 0x2a,0xc3, +0x94,0x46,0xe5,0x2a,0x94,0x1, 0x40,0xc8,0xad,0x2c,0x7f,0xf0,0x7e,0x3, 0x71,0x9f, +0xc3,0x74,0xff,0x95,0x2c,0xfd,0x7f,0xf1,0x7e,0x3, 0x71,0x9f,0x7f,0x1, 0x22,0x12, +0x47,0xf, 0x12,0x47,0x31,0xe4,0xf5,0xf8,0x8a,0xf9,0x8b,0xfa,0x8d,0xfb,0x43,0xfc, +0x3, 0x75,0xf8,0x82,0x7f,0xa, 0x71,0xe1,0xd2,0xf8,0x7f,0x4, 0x71,0xe1,0xd2,0xfe, +0x7f,0x26,0x71,0xe1,0xc2,0xfe,0xc2,0xf9,0x7f,0xc, 0x71,0xe1,0xc2,0xf8,0x7f,0x1, +0x71,0xe1,0x43,0xfc,0x3, 0xe4,0xf5,0xf8,0xd2,0xaf,0x22,0x7f,0xfa,0x71,0xe1,0x7f, +0xfa,0xae,0x7, 0x1f,0xee,0x60,0xf, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x80,0xeb,0x22,0xe5,0x43,0x25,0xe0,0x24,0x2d,0xf8,0x22,0xad, +0x7, 0xaf,0x5, 0x1d,0xef,0x60,0xa, 0x71,0xdb,0x7f,0xfa,0x71,0xe1,0x71,0xdb,0x80, +0xf0,0x22,0x12,0x47,0x3b,0xe4,0xf5,0xf8,0x12,0x47,0x7, 0x75,0xf8,0x88,0x7f,0x14, +0x71,0xe1,0x75,0xf8,0x89,0x7f,0x2d,0x71,0xff,0xc2,0xfb,0x7f,0x14,0x71,0xe1,0xc2, +0xf8,0x7f,0xa, 0x80,0x9b,0xf1,0xa2,0x75,0x4d,0xff,0xe4,0xf5,0x4e,0x75,0x4f,0xff, +0xf5,0x50,0xf5,0x5f,0x75,0x60,0x0, 0x75,0x61,0x51,0x12,0x66,0x52,0x12,0x26,0x16, +0x90,0x0, 0x52,0xe4,0x12,0x66,0xc2,0x74,0x1, 0x12,0x67,0xa8,0x90,0x0, 0x54,0x12, +0x1, 0xd7,0x90,0xa, 0xeb,0xe0,0x12,0x1, 0xc5,0x90,0xa, 0xec,0xe0,0x12,0x26,0x16, +0x12,0x46,0xdc,0xe4,0xf5,0x2d,0x12,0x26,0x16,0x12,0x1, 0x4c,0xff,0xe5,0x2d,0xc3, +0x9f,0x50,0x33,0x12,0x47,0x5a,0xe0,0xff,0xe9,0x24,0x31,0xf9,0xe4,0x3a,0xfa,0xe5, +0x2d,0xfd,0x12,0x26,0x2b,0x12,0x27,0x47,0xe0,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x4, +0xf9,0xe4,0x35,0x2b,0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x12,0x27,0x47,0xe0,0xff, +0x74,0x2f,0xb1,0xb6,0x80,0xc0,0xe4,0xf5,0x2d,0x12,0x26,0x16,0x12,0x17,0xc1,0xff, +0xe5,0x2d,0xc3,0x9f,0x50,0x17,0xb1,0xbe,0xe9,0x24,0x20,0xf9,0xe4,0x3a,0x12,0x26, +0x28,0xef,0x12,0x1, 0xc5,0xb1,0xbe,0x74,0x42,0xb1,0xb6,0x80,0xdc,0xe4,0xf5,0x2d, +0x90,0xa, 0xec,0xe0,0xff,0xe5,0x2d,0xc3,0x9f,0x50,0x3e,0xe4,0xf5,0x2e,0x90,0xa, +0xec,0xe0,0xff,0xe5,0x2e,0xc3,0x9f,0x50,0x15,0x74,0x42,0x25,0x2e,0xf8,0xe6,0xff, +0xc3,0x95,0x4f,0x50,0x5, 0x8f,0x4f,0x85,0x2e,0x50,0x5, 0x2e,0x80,0xe0,0x74,0x42, +0x25,0x50,0xf8,0x76,0xff,0x75,0x4f,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x72,0xb1,0xd2, +0xe5,0x50,0x12,0x1, 0xc5,0x5, 0x2d,0x80,0xb7,0xe4,0xf5,0x2d,0x90,0xa, 0xeb,0xe0, +0xff,0xe5,0x2d,0xc3,0x9f,0x50,0x3e,0xe4,0xf5,0x2e,0x90,0xa, 0xeb,0xe0,0xff,0xe5, +0x2e,0xc3,0x9f,0x50,0x15,0x74,0x2f,0x25,0x2e,0xf8,0xe6,0xff,0xc3,0x95,0x4d,0x50, +0x5, 0x8f,0x4d,0x85,0x2e,0x4e,0x5, 0x2e,0x80,0xe0,0x74,0x2f,0x25,0x4e,0xf8,0x76, +0xff,0x75,0x4d,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x56,0xb1,0xd2,0xe5,0x4e,0x12,0x1, +0xc5,0x5, 0x2d,0x80,0xb7,0x90,0xa, 0xee,0xe0,0x12,0x26,0x16,0x90,0x0, 0x30,0x12, +0x1, 0xd7,0x90,0x0, 0x31,0x12,0x1, 0x65,0x90,0x0, 0x51,0xf1,0xbf,0x90,0x0, 0x4d, +0xf1,0xb7,0xff,0x90,0x0, 0x4e,0x12,0x1, 0xd7,0x90,0x0, 0x4f,0xef,0x12,0x1, 0xd7, +0x90,0x0, 0x50,0xef,0x12,0x1, 0xd7,0x90,0x0, 0x82,0x74,0x1, 0x2, 0x1, 0xd7,0x90, +0x0, 0x55,0x74,0x21,0xf0,0x22,0x25,0x2d,0xf8,0xa6,0x7, 0x5, 0x2d,0x22,0x74,0x51, +0x25,0x2d,0xf8,0xe6,0xff,0x22,0xc3,0x13,0x24,0x51,0xf5,0x82,0xe4,0x34,0xb, 0xf5, +0x83,0x22,0xf9,0xe4,0x35,0x2b,0xfa,0x7e,0x0, 0xe9,0x25,0x2d,0xf9,0xee,0x3a,0xfa, +0x22,0x25,0x11,0xf5,0x82,0xe5,0x10,0x3e,0xf5,0x83,0x75,0xf0,0x2, 0xe5,0x43,0x12, +0x5, 0x40,0xe0,0xfe,0xa3,0xe0,0x22,0xab,0x25,0xaa,0x26,0xa9,0x27,0x12,0x4f,0x54, +0xe4,0x90,0xa, 0xe4,0xf0,0xa3,0xf0,0x90,0xa, 0xde,0x74,0xd, 0xf0,0xa3,0x74,0xac, +0xf0,0x22,0xd1,0x0, 0xf1,0x70,0xf1,0x8f,0x7f,0x1, 0x12,0x62,0xdc,0xf1,0xc7,0x12, +0x46,0xe8,0x12,0x3f,0x9e,0x12,0x5a,0x8d,0x90,0xc, 0x59,0xe0,0x24,0xfd,0x60,0x14, +0x14,0x60,0x15,0x24,0xaf,0x60,0x2d,0x24,0xab,0x60,0x12,0x24,0xa9,0x70,0xe9,0x12, +0x21,0x28,0x80,0xe4,0x11,0x9, 0x80,0xe0,0x12,0x25,0xd9,0x80,0xdb,0xf1,0xaf,0x90, +0xa, 0xe8,0xe0,0x64,0xaa,0x60,0xd1,0xe4,0x90,0xa, 0xe0,0xf0,0x90,0xa, 0xe8,0x74, +0xaa,0xf0,0x80,0xc4,0xf1,0xaf,0x90,0xa, 0xe8,0xe0,0xb4,0xaa,0xbb,0x74,0x55,0xf0, +0x90,0xc, 0xed,0x12,0x46,0xff,0x90,0xc, 0xed,0x74,0xff,0xf5,0xf0,0x12,0x2, 0x76, +0x45,0xf0,0x70,0xf2,0xd1,0x8b,0x75,0xe9,0xff,0x80,0x9d,0x7d,0x66,0x7f,0xf8,0x7e, +0x6f,0x71,0xa2,0x7d,0xbb,0x7f,0xf9,0x7e,0x6f,0x61,0xa2,0x8b,0x33,0x8a,0x34,0x89, +0x35,0xe4,0xf5,0x39,0xf5,0x3a,0xf1,0x61,0x70,0x2, 0x5, 0x39,0x64,0x92,0x45,0x39, +0x70,0xf4,0xab,0x36,0xaa,0x37,0xa9,0x38,0xe4,0xf5,0x39,0xf5,0x3a,0xf1,0x61,0x70, +0x2, 0x5, 0x39,0x64,0x53,0x45,0x39,0x70,0xf4,0xe4,0xf5,0x39,0xf5,0x3a,0xab,0x33, +0xe5,0x35,0x24,0xa, 0xf9,0xe4,0x35,0x34,0xfa,0xae,0x39,0xaf,0x3a,0x12,0x1e,0xf2, +0xf1,0x3a,0xf1,0x5a,0x24,0x3, 0xf1,0x2e,0xf1,0x5a,0x24,0x26,0xf1,0x2e,0xf1,0x41, +0x5, 0x3a,0xe5,0x3a,0x70,0x2, 0x5, 0x39,0xc3,0x94,0x5, 0xe5,0x39,0x94,0x0, 0x40, +0xcd,0xab,0x36,0xaa,0x37,0xa9,0x38,0x90,0x0, 0x51,0x74,0x1, 0x12,0x1, 0xd7,0xe4, +0xf5,0xa, 0xf5,0xb, 0xf5,0x9, 0xf5,0x8, 0xd1,0x1, 0xe4,0xa3,0xf0,0x90,0xa, 0xe8, +0xf0,0xa3,0xf0,0xa3,0xf0,0xc2,0x1, 0x90,0xa, 0xe1,0xf0,0xa3,0xf0,0x22,0xf9,0xe4, +0x35,0x37,0xfa,0xae,0x39,0xaf,0x3a,0x12,0x1, 0xf9,0xe9,0x2f,0xf9,0xea,0x3e,0xfa, +0x22,0x74,0xff,0xf5,0xf0,0x12,0x3, 0x3c,0x90,0x0, 0x2, 0x74,0xff,0xf5,0xf0,0x12, +0x3, 0x5b,0x90,0x0, 0x4, 0x74,0xff,0x2, 0x1, 0xd7,0xf1,0x41,0xab,0x36,0xe5,0x38, +0x22,0xe4,0x12,0x1, 0xc5,0x4, 0x29,0xf9,0xe4,0x3a,0xfa,0x5, 0x3a,0xe5,0x3a,0x22, +0x2, 0x0, 0x22,0x30,0x0, 0x7, 0x7f,0x1, 0xf1,0x84,0xc2,0x0, 0x22,0xe4,0xff,0xf1, +0x84,0xd2,0x0, 0x22,0xef,0x70,0x3, 0xd2,0x98,0x22,0xc2,0x98,0x22,0x81,0x12,0x12, +0x41,0xcc,0xc2,0x8e,0x43,0xa2,0x10,0x75,0xa6,0xf0,0x75,0xa5,0x5f,0xd2,0x8e,0xd2, +0xab,0x22,0x8b,0x2a,0x8a,0x2b,0x89,0x2c,0x22,0x11,0xdd,0x53,0xdb,0xf0,0x22,0xe4, +0x90,0xa, 0xe4,0xf0,0xa3,0xf0,0x22,0x12,0x1, 0xd7,0x90,0xa, 0xef,0xe0,0x22,0x12, +0x1, 0xd7,0x90,0xb, 0x43,0xe0,0x22,0xe4,0x90,0xc, 0xac,0xf0,0x12,0x42,0x3b,0xe4, +0x90,0xc, 0xab,0xf0,0x90,0xc, 0xa7,0xf0,0x90,0xc, 0xac,0xe0,0xc4,0x54,0x7, 0x70, +0x6, 0xa3,0x12,0x3a,0x78,0x80,0xf, 0x90,0xc, 0xac,0xe0,0xc4,0x54,0x7, 0xff,0xbf, +0x4, 0x4, 0xa3,0x12,0x38,0xa, 0xe4,0x12,0x3c,0xb2,0xf0,0x90,0xc, 0x73,0x74,0xaa, +0xf0,0xa3,0xf0,0x90,0xc, 0x8d,0xf0,0xa3,0xf0,0x22,0xe0,0xff,0x31,0x6e,0x8f,0x95, +0x22,0x30,0x95,0x5d,0x90,0xc, 0xa9,0xe0,0x4, 0xf0,0xe0,0xff,0xb4,0x1, 0x8, 0x90, +0xc, 0xad,0xe5,0x95,0xf0,0x80,0x2d,0x90,0xc, 0xac,0xe0,0xfe,0xc4,0x54,0x7, 0x70, +0xc, 0xa3,0xe0,0x2f,0x24,0xfe,0xff,0xad,0x95,0x51,0x9b,0x80,0x17,0x90,0xc, 0xac, +0xe0,0xc4,0x54,0x7, 0xff,0xbf,0x4, 0xc, 0x90,0xc, 0xa9,0x51,0x89,0x24,0xfe,0xff, +0xad,0x95,0x71,0x40,0x90,0xc, 0xac,0xe0,0xc4,0x54,0x7, 0xfd,0x70,0xb, 0x51,0x7f, +0x60,0xf, 0x90,0xc, 0xad,0x51,0x78,0x80,0x8, 0xbd,0x4, 0x5, 0x90,0xc, 0xad,0x11, +0xa, 0x30,0x94,0x1f,0x90,0xc, 0xa7,0xe0,0x4, 0xf0,0x90,0xc, 0xac,0xe0,0xc4,0x54, +0x7, 0xfd,0x70,0x8, 0x51,0x7f,0x60,0xb, 0x51,0x86,0x41,0x79,0xbd,0x4, 0x4, 0x51, +0x86,0x11,0xb, 0x22,0x51,0x91,0xff,0xc3,0x94,0x80,0x40,0x10,0xef,0xd3,0x94,0xbf, +0x50,0xa, 0x74,0xb2,0x2f,0xf5,0x82,0xe4,0x34,0xb, 0x21,0x55,0xa8,0x18,0xe6,0x24, +0x4, 0x60,0xb, 0x24,0xfc,0x70,0xe, 0x90,0xc, 0xac,0xe0,0xff,0x21,0x5d,0x90,0xc, +0x59,0xe0,0xff,0x21,0x5d,0xa8,0x18,0xe6,0xff,0xb4,0x3, 0x9, 0x30,0x2, 0x4, 0x51, +0x71,0x80,0x2, 0x51,0x6a,0xef,0x24,0xfe,0x60,0x34,0x24,0xfb,0x50,0x46,0x24,0xfe, +0x24,0xfc,0x50,0x4c,0x24,0xfe,0x24,0xfc,0x50,0x52,0x24,0xfe,0x24,0xfc,0x50,0x55, +0x24,0xfe,0x24,0xfc,0x50,0x58,0x24,0x1e,0x70,0x61,0x30,0x2, 0x4, 0x51,0x71,0x80, +0x2, 0x51,0x6a,0xe5,0xf, 0x24,0x4, 0xf5,0x82,0xe4,0x35,0xe, 0x80,0x47,0x30,0x2, +0x4, 0x51,0x71,0x80,0x2, 0x51,0x6a,0x85,0xf, 0x82,0x85,0xe, 0x83,0xa3,0xa3,0xa3, +0xe0,0xff,0x80,0x39,0xa8,0x18,0xe6,0x24,0x2, 0xff,0xe4,0x33,0x31,0x64,0x80,0x25, +0xa8,0x18,0xe6,0x25,0xf, 0xf5,0x82,0xe4,0x35,0xe, 0x80,0x19,0xa8,0x18,0xe6,0x24, +0xfe,0x31,0x60,0x80,0x10,0xa8,0x18,0xe6,0x24,0xfc,0x31,0x60,0x80,0x7, 0xa8,0x18, +0xe6,0x24,0xfa,0x31,0x60,0xf5,0x83,0xe0,0xff,0x80,0x2, 0x7f,0x0, 0x5, 0x18,0x22, +0xff,0xe4,0x34,0xff,0xfe,0xe5,0xf, 0x2f,0xf5,0x82,0xe5,0xe, 0x3e,0x22,0x51,0x91, +0xfe,0x14,0x60,0x1e,0x14,0x60,0x22,0x24,0xf2,0x50,0x22,0x24,0xc4,0x60,0x28,0x24, +0xfe,0x60,0x32,0x24,0x64,0x60,0x27,0x24,0xea,0x70,0x31,0x90,0xc, 0xac,0xe0,0xff, +0x41,0x67,0x90,0xc, 0xaa,0xe0,0xff,0x41,0x67,0x7f,0xff,0x41,0x67,0x74,0xe8,0x2e, +0xf5,0x82,0xe4,0x34,0xa, 0x41,0x5f,0x90,0xa, 0xf8,0xe0,0xff,0x41,0x67,0x90,0xc, +0xda,0xe0,0xff,0x41,0x67,0x90,0xb, 0x5d,0xe0,0xff,0x41,0x67,0xa8,0x18,0xe6,0xff, +0xc3,0x94,0x10,0x40,0x1b,0xef,0x94,0x26,0x50,0x16,0xe5,0xd, 0x2f,0xf5,0x82,0xe4, +0x35,0xc, 0xf5,0x83,0xe5,0x82,0x24,0xf0,0xf5,0x82,0xe5,0x83,0x34,0xff,0x80,0x7f, +0xa8,0x18,0xe6,0xff,0xc3,0x94,0x50,0x40,0x14,0xef,0xd3,0x94,0x77,0x50,0xe, 0x74, +0xab,0x2f,0x91,0x5c,0xe0,0xff,0x7d,0x78,0x12,0x0, 0x26,0x80,0x6a,0xa8,0x18,0xe6, +0xff,0xc3,0x94,0x78,0x40,0x10,0xef,0xd3,0x94,0x9f,0x50,0xa, 0x74,0x9f,0x2f,0xf5, +0x82,0xe4,0x34,0xa, 0x80,0x49,0xa8,0x18,0xe6,0xff,0xc3,0x94,0xa0,0x40,0x10,0xef, +0xd3,0x94,0xbe,0x50,0xa, 0x74,0x93,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x30,0xa8, +0x18,0xe6,0xff,0xc3,0x94,0xbf,0x40,0x10,0xef,0xd3,0x94,0xd2,0x50,0xa, 0x74,0x84, +0x2f,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x17,0xa8,0x18,0xe6,0xff,0xc3,0x94,0xd3,0x40, +0x14,0xef,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x7e,0x2f,0xf5,0x82,0xe4,0x34,0xa, 0xf5, +0x83,0xe0,0xff,0x80,0x2, 0x7f,0xff,0x5, 0x18,0x22,0x75,0xe, 0xc, 0x75,0xf, 0x8d, +0x22,0x75,0xe, 0xc, 0x75,0xf, 0x73,0x22,0xe0,0xff,0x11,0x94,0x8f,0x95,0x22,0xff, +0x11,0x94,0xef,0x64,0x10,0x22,0x90,0xc, 0xa7,0xe0,0xff,0x90,0xc, 0xad,0xe0,0x2f, +0x22,0x15,0x18,0xa8,0x18,0xa6,0x7, 0xa8,0x18,0xe6,0x22,0x8f,0x69,0x8d,0x6a,0xe5, +0x69,0xc3,0x94,0x80,0x40,0xe, 0xe5,0x69,0xd3,0x94,0xbf,0x50,0x7, 0xe5,0x69,0x24, +0x80,0xff,0x80,0x33,0xe5,0x69,0x24,0x4, 0x60,0x29,0x24,0xfc,0x70,0x2b,0x91,0x64, +0xb4,0x4, 0xf, 0x90,0xc, 0x59,0xe0,0x7d,0x3, 0xb4,0x3, 0x2, 0x80,0xd, 0x7f,0x27, +0x80,0x15,0x90,0xc, 0x59,0xe0,0x7d,0x1, 0xb4,0x3, 0x4, 0x7f,0x1, 0x80,0xb, 0x7f, +0x27,0x80,0x4, 0xad,0x6a,0x7f,0x27,0x91,0x7a,0x22,0x8d,0x6b,0xef,0xc3,0x94,0xa, +0x50,0xa, 0x74,0xd1,0x2f,0xf5,0x82,0xe4,0x34,0xc, 0x80,0x34,0xef,0x24,0xf6,0xf5, +0x6c,0xc3,0x94,0x46,0x74,0x80,0x94,0x81,0x50,0x2b,0xe5,0x6c,0xb4,0x4f,0x3, 0x2, +0x37,0x73,0xe5,0x6c,0xc3,0x94,0x10,0x40,0x15,0xe5,0x6c,0xd3,0x94,0x23,0x50,0xe, +0x7d,0x78,0xaf,0x6b,0x12,0x6, 0xd5,0x71,0x36,0xf5,0x83,0xef,0xf0,0x22,0x71,0x36, +0xf5,0x83,0xe5,0x6b,0xf0,0x22,0x74,0xeb,0x25,0x6c,0xf5,0x82,0xe4,0x34,0xa, 0x22, +0x8f,0x69,0x8d,0x6a,0xe5,0x69,0x14,0x60,0x3c,0x14,0x60,0x50,0x24,0xf2,0x50,0x63, +0x24,0xc4,0x60,0x6a,0x24,0xfe,0x60,0x70,0x14,0x60,0x72,0x24,0x65,0x60,0x64,0x24, +0xea,0x70,0x6d,0x91,0x64,0x64,0x4, 0x60,0xd, 0x90,0xc, 0x59,0xe0,0x7d,0x1, 0xb4, +0x3, 0x2, 0x80,0x2f,0x80,0xb, 0x90,0xc, 0x59,0xe0,0x7d,0x3, 0xb4,0x3, 0x2, 0x80, +0x22,0x7f,0x27,0x81,0x7a,0x90,0xc, 0xaa,0xe5,0x6a,0xf0,0xe0,0x75,0xf0,0x20,0xa4, +0xae,0xf0,0x25,0x11,0xf5,0xd, 0xee,0x35,0x10,0xf5,0xc, 0x22,0xe5,0x6a,0xb4,0x4, +0x6, 0x7d,0x4, 0x7f,0x1, 0x80,0xa, 0xe5,0x6a,0x64,0x5, 0x60,0x2, 0x81,0x5b,0xfd, +0xff,0x41,0xea,0x74,0xe8,0x25,0x69,0xf5,0x82,0xe4,0x34,0xa, 0x80,0x47,0x90,0xa, +0xf8,0x81,0x58,0x90,0xc, 0xda,0x81,0x58,0x90,0xb, 0x5d,0x81,0x58,0x2, 0x37,0x73, +0xe5,0x69,0xc3,0x94,0x50,0x40,0x17,0xe5,0x69,0xd3,0x94,0x77,0x50,0x10,0x7d,0x78, +0xaf,0x6a,0x12,0x6, 0xd5,0x74,0xab,0x25,0x69,0x91,0x5c,0xef,0xf0,0x22,0xe5,0x69, +0xc3,0x94,0x78,0x40,0x14,0xe5,0x69,0xd3,0x94,0x9f,0x50,0xd, 0x74,0x9f,0x25,0x69, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x4f,0xe5,0x69,0xc3,0x94,0xa0,0x40,0x14, +0xe5,0x69,0xd3,0x94,0xbe,0x50,0xd, 0x74,0x93,0x25,0x69,0xf5,0x82,0xe4,0x34,0xa, +0xf5,0x83,0x80,0x34,0xe5,0x69,0xc3,0x94,0xbf,0x40,0x14,0xe5,0x69,0xd3,0x94,0xd2, +0x50,0xd, 0x74,0x84,0x25,0x69,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x80,0x19,0xe5, +0x69,0xc3,0x94,0xd3,0x40,0x15,0xe5,0x69,0xd3,0x94,0xe1,0x50,0xe, 0x74,0x7e,0x25, +0x69,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe5,0x6a,0xf0,0x22,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0x22,0x7b,0x1, 0x7a,0xc, 0x79,0xac,0xe5,0x6a,0x12,0x1, 0xc5,0x53, +0x6a,0x70,0xe5,0x6a,0xc4,0x54,0xf, 0xf5,0x6a,0x22,0xef,0xd3,0x94,0x3f,0x50,0x31, +0xef,0x24,0xfd,0x60,0x2c,0x14,0x60,0x29,0x24,0xe1,0x60,0x25,0x24,0xfd,0x60,0x21, +0x24,0xfe,0x60,0x1d,0x24,0xf9,0x60,0x19,0x24,0xfe,0x60,0x15,0x80,0x0, 0x74,0x32, +0x2f,0xf5,0x82,0xe4,0x34,0xc, 0xf5,0x83,0xed,0xf0,0x90,0xc, 0x72,0xe0,0x44,0x1, +0xf0,0x22,0x90,0xc, 0xa9,0xf0,0x90,0xc, 0xa8,0x22,0xc0,0xe0,0xc0,0x83,0xc0,0x82, +0xc2,0x93,0x90,0xc, 0xa7,0xe4,0xf0,0x91,0xb2,0xf0,0xd0,0x82,0xd0,0x83,0xd0,0xe0, +0x32,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, +0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0xe5,0xc9, +0x54,0x3, 0xff,0xbf,0x1, 0x6, 0x53,0xc9,0xfc,0x43,0xc9,0x2, 0x11,0x11,0x30,0x95, +0x2, 0xc2,0x95,0x30,0x94,0x2, 0xc2,0x94,0x90,0xc, 0xa8,0x74,0x1, 0xf0,0xd0,0x7, +0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0, +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x90,0xc, 0xd2,0x74,0x3, 0xf0,0xe4, +0x90,0xc, 0xd9,0xf0,0x90,0xc, 0xd1,0x74,0xff,0xf0,0x90,0xc, 0xda,0x74,0x1, 0xf0, +0x22,0xf1,0x4d,0xe4,0xf5,0x2e,0x12,0x5, 0x4c,0xaf,0x1, 0x8a,0x30,0x8f,0x31,0x12, +0x17,0x15,0xf1,0xa, 0x20,0xe0,0x10,0x13,0x13,0x54,0x3f,0x20,0xe0,0x9, 0xf1,0xa, +0xc3,0x13,0x20,0xe0,0x2, 0xc1,0xe4,0x20,0x2, 0x8, 0x75,0x2c,0xc, 0x75,0x2d,0x73, +0x80,0x6, 0x75,0x2c,0xc, 0x75,0x2d,0x8d,0xe4,0xf5,0x28,0xd1,0xf8,0x74,0xff,0xf0, +0x5, 0x28,0xe5,0x28,0xb4,0x1a,0xf4,0xf1,0x10,0x74,0xaa,0xf0,0xa3,0xf0,0xf1,0x10, +0xa3,0xa3,0x74,0x1a,0xf0,0x12,0x17,0x15,0x90,0x0, 0x49,0x12,0x1, 0x65,0xff,0xe5, +0x2d,0x24,0x4, 0xd1,0xfc,0xef,0xf0,0xe4,0xf5,0x2f,0xf5,0x28,0x12,0x16,0xfa,0x12, +0x1, 0x4c,0xff,0xe5,0x28,0xc3,0x9f,0x40,0x2, 0xc1,0x89,0xe5,0x28,0x12,0x1c,0x5b, +0xf1,0x4, 0x54,0xf0,0xff,0xd3,0x94,0x0, 0x40,0x29,0xef,0x64,0xb0,0x60,0x2, 0xc1, +0x85,0xf1,0x18,0xff,0xe9,0x24,0x7, 0xf9,0xe4,0x3a,0xfa,0x12,0x1, 0x4c,0x54,0xf, +0x12,0x1, 0xc5,0xab,0x22,0xe5,0x24,0x2f,0x12,0x1c,0x63,0xf1,0x1f,0x64,0x1, 0x60, +0x2, 0xc1,0x85,0xe5,0x28,0x12,0x1c,0x5b,0xf1,0x1f,0x64,0x3, 0x70,0x2, 0xc1,0x85, +0xe5,0x2f,0x25,0xe0,0x25,0xe0,0xf5,0x29,0x90,0x0, 0x3, 0xf1,0x3d,0x24,0x5, 0xd1, +0xe9,0xef,0xf0,0xe5,0x29,0x24,0x6, 0xd1,0xe9,0xe5,0x2b,0xf0,0xe5,0x28,0x12,0x1c, +0x5b,0x90,0x0, 0x5, 0xf1,0x3d,0x24,0x7, 0xd1,0xe9,0xef,0xf0,0xe5,0x29,0x24,0x8, +0xd1,0xe9,0xe5,0x2b,0xf1,0x17,0x12,0x1c,0x61,0xf1,0x4, 0xc4,0x54,0xf0,0xff,0xe5, +0x29,0x24,0x7, 0xd1,0xe9,0xe0,0x2f,0xf1,0x17,0x12,0x1c,0x61,0xf1,0x4, 0xff,0xf4, +0x60,0x1b,0xf1,0x26,0xff,0x64,0x1, 0x60,0x2, 0x5, 0x2e,0xef,0xc4,0x33,0x33,0x54, +0xc0,0xff,0xe5,0x29,0x24,0x5, 0xd1,0xe9,0xe0,0x2f,0xf0,0x80,0x16,0xe5,0x29,0x24, +0x5, 0xff,0xe4,0x33,0xfe,0xe5,0x2d,0x2f,0xf5,0x82,0xe5,0x2c,0x3e,0xf5,0x83,0xe0, +0x24,0xc0,0xf0,0x5, 0x2f,0x5, 0x28,0xa1,0xac,0xf1,0x10,0xa3,0xa3,0xa3,0xe5,0x2e, +0xf0,0xe5,0x2d,0x24,0x19,0xd1,0xfc,0xe4,0xf0,0xf5,0x28,0xe5,0x2d,0x24,0x19,0xd1, +0xfc,0xc0,0x83,0xc0,0x82,0xe0,0xff,0xd1,0xf8,0xe0,0xfe,0xef,0x6e,0xd0,0x82,0xd0, +0x83,0xf0,0x5, 0x28,0xe5,0x28,0xb4,0x19,0xe2,0xb2,0x2, 0x7f,0x1, 0x12,0x37,0x84, +0x12,0x17,0x15,0xf1,0xa, 0xff,0x13,0x13,0x54,0x3f,0x30,0xe0,0x9, 0xaa,0x30,0xa9, +0x31,0x7b,0x1, 0x12,0x59,0x14,0xf1,0x54,0xf1,0x62,0x54,0xfb,0x12,0x1, 0xc5,0x54, +0xfd,0x2, 0x1, 0xc5,0xe4,0xff,0x2, 0x37,0x84,0xfd,0xe4,0x33,0xfc,0xe5,0x2d,0x2d, +0xf5,0x82,0xe5,0x2c,0x3c,0xf5,0x83,0x22,0xe5,0x2d,0x25,0x28,0xf5,0x82,0xe4,0x35, +0x2c,0xf5,0x83,0x22,0x90,0x0, 0x7, 0x2, 0x1, 0x65,0x90,0x0, 0x4f,0x2, 0x1, 0x65, +0x85,0x2d,0x82,0x85,0x2c,0x83,0x22,0xf0,0xe5,0x28,0x75,0xf0,0x7, 0xa4,0x22,0x90, +0x0, 0x7, 0x12,0x1, 0x65,0xff,0xe5,0x31,0x24,0x23,0xf5,0x82,0xe4,0x35,0x30,0xf5, +0x83,0xe5,0x82,0x2f,0xf5,0x82,0xe4,0x35,0x83,0xf5,0x83,0xe0,0x22,0x12,0x2, 0xb7, +0xf5,0x2b,0x85,0xf0,0x2a,0xe5,0x2a,0x54,0xf, 0xff,0xe5,0x29,0x22,0x8b,0x22,0x8a, +0x23,0x89,0x24,0x22,0xab,0x22,0xe5,0x24,0x24,0x4f,0xf9,0xe4,0x35,0x23,0x22,0xf9, +0xe4,0x3a,0xfa,0x12,0x1, 0x4c,0x54,0xfe,0x2, 0x1, 0xc5,0xf1,0x4d,0x78,0x25,0x7c, +0x0, 0x7d,0x0, 0x7b,0xff,0x7a,0xf, 0x79,0xba,0x7e,0x0, 0x7f,0xc, 0x12,0x17,0x12, +0xe4,0x12,0x1, 0xc5,0xe5,0x24,0x24,0x5, 0xf9,0xe4,0x35,0x23,0xa8,0x1, 0xfc,0xad, +0x22,0x7b,0x0, 0x7a,0x0, 0x79,0x25,0x7e,0x0, 0x7f,0xc, 0x2, 0x1, 0x26,0x75,0x45, +0x0, 0x75,0x46,0x0, 0x75,0x47,0x2f,0x75,0x48,0x13,0x75,0x49,0x78,0x7b,0xff,0x7a, +0xf, 0x79,0x35,0x12,0x8, 0x0, 0xe4,0xff,0xfe,0x12,0x40,0xce,0x8f,0x2e,0x90,0xc, +0x52,0xe0,0x70,0x3, 0x75,0x2e,0xff,0xe5,0x2e,0xf4,0x60,0x4c,0x7f,0xf0,0x7e,0x3, +0x12,0x40,0xce,0x8f,0x2a,0x7f,0xf1,0x7e,0x3, 0x12,0x40,0xce,0x8f,0x2b,0xe5,0x2a, +0x45,0x2b,0xf4,0x60,0x3, 0x75,0x2e,0xff,0xe4,0xf5,0x2b,0xf5,0x2c,0xf5,0x2d,0xe5, +0x2d,0x24,0x4, 0xff,0xe4,0x35,0x2c,0xfe,0x12,0x40,0xce,0xef,0x62,0x2b,0x5, 0x2d, +0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0xc3,0x94,0x46,0xe5,0x2c,0x94,0x1, 0x40,0xe0,0xe5, +0x2a,0x65,0x2b,0x60,0x3, 0x75,0x2e,0xff,0x90,0xa, 0xeb,0x74,0x13,0xf0,0x74,0xb, +0x51,0x41,0x90,0xb, 0x5d,0x74,0x4, 0xf0,0xe4,0x90,0xa, 0xee,0xf0,0xa3,0x74,0x28, +0xf0,0x90,0xa, 0xf9,0xf1,0x1f,0x90,0xb, 0x5e,0xd1,0xff,0xe4,0xff,0x90,0xa, 0xeb, +0xe0,0xfe,0xef,0xc3,0x9e,0x40,0xb, 0x74,0xfb,0x2f,0x12,0x27,0x4f,0x74,0xff,0xf0, +0x80,0xe, 0x74,0x2f,0x2f,0xf8,0xe6,0xfe,0x74,0xfb,0x2f,0x12,0x27,0x4f,0xee,0xf0, +0xef,0x90,0xf, 0x53,0x93,0xfe,0x74,0x17,0x2f,0xf1,0x5e,0xee,0xf0,0xf, 0xbf,0x1c, +0xcc,0xe4,0xff,0xef,0x90,0xf, 0x7f,0x93,0xfe,0x74,0x43,0x2f,0x31,0x6d,0xee,0xf0, +0xf, 0xbf,0xe, 0xef,0xe4,0xff,0xef,0x90,0xf, 0x6f,0x93,0xfe,0x74,0x33,0x2f,0xf1, +0x17,0xee,0xf0,0xf, 0xbf,0x10,0xef,0xe4,0xff,0xef,0x90,0xf, 0x8d,0x93,0xfe,0x74, +0x51,0x2f,0x12,0x35,0xca,0xee,0xf0,0xf, 0xbf,0x8, 0xee,0xe4,0xf5,0x2c,0xf5,0x2d, +0x74,0x60,0x25,0x2d,0xf1,0x45,0x5, 0x2d,0xe5,0x2d,0x70,0x2, 0x5, 0x2c,0x64,0xd1, +0x45,0x2c,0x70,0xec,0xe5,0x2e,0xf4,0x60,0x4, 0x7f,0x4, 0x11,0xea,0x22,0xf1,0xf, +0xe4,0xfd,0xf1,0x31,0xed,0xc4,0x54,0xf0,0xf5,0xf8,0x8a,0xf9,0x8b,0xfa,0x43,0xfc, +0x3, 0x44,0xe0,0xf5,0xf8,0xaf,0xfb,0x2, 0x33,0xd2,0x8f,0x42,0x75,0x43,0xb, 0x75, +0x44,0x51,0x31,0x4f,0x31,0x27,0x70,0x2, 0x5, 0x43,0x31,0x43,0x70,0x2, 0x5, 0x45, +0xc3,0x94,0x8, 0xe5,0x45,0x94,0x0, 0x40,0xeb,0x75,0x43,0xb, 0x75,0x44,0x60,0x31, +0x4f,0x31,0x27,0x70,0x2, 0x5, 0x43,0x31,0x43,0x70,0x2, 0x5, 0x45,0xc3,0x94,0xd1, +0xe5,0x45,0x94,0x0, 0x40,0xeb,0x22,0x7e,0x0, 0xe5,0x46,0x25,0x42,0xff,0xee,0x35, +0x45,0xfe,0xe5,0x48,0x2f,0xff,0xe5,0x47,0x3e,0xfe,0x11,0xce,0x5, 0x44,0xe5,0x44, +0xac,0x43,0x22,0x14,0xf5,0x82,0x8c,0x83,0xef,0xf0,0x5, 0x46,0xe5,0x46,0x22,0x75, +0x47,0xa, 0x75,0x48,0xeb,0xc3,0xe5,0x44,0x95,0x48,0xff,0xe5,0x43,0x95,0x47,0xf5, +0x47,0x8f,0x48,0xe4,0xf5,0x45,0xf5,0x46,0x22,0xc3,0x13,0x24,0x43,0xf5,0x82,0xe4, +0x34,0xb, 0xf5,0x83,0x22,0x85,0xe6,0x21,0xe4,0xf5,0x22,0x75,0x99,0x1, 0xd2,0x98, +0x7f,0x2, 0x7e,0x78,0x11,0xd0,0x8f,0x23,0x7f,0x3, 0x7e,0x78,0x11,0xd0,0xe5,0x23, +0xf4,0x60,0xa, 0xe5,0x23,0x6f,0xff,0xbf,0xff,0x3, 0x85,0x23,0x22,0xe5,0x21,0xb4, +0xff,0x3, 0x75,0x21,0x6a,0xe5,0x22,0xb4,0x1, 0xf, 0xe5,0x21,0x64,0x6a,0x60,0x18, +0xe5,0x21,0xb4,0x6b,0x2, 0x80,0x11,0x80,0xb, 0xe5,0x21,0x64,0x6a,0x60,0x5, 0xe5, +0x21,0xb4,0x6b,0x4, 0x53,0xea,0x7f,0x22,0x43,0xea,0x80,0x22,0x51,0x3d,0x7f,0x1, +0xf1,0x66,0x31,0x75,0xf1,0x8d,0xd1,0xef,0x7f,0x1, 0xef,0x70,0x3, 0xc2,0xaf,0x22, +0xd2,0xaf,0x22,0x75,0x33,0x70,0x75,0x90,0x4, 0x75,0x33,0x70,0x7f,0x0, 0x7e,0x78, +0x11,0xd0,0x8f,0x34,0x7f,0x1, 0x7e,0x78,0x11,0xd0,0xe5,0x34,0xf4,0x60,0x1c,0xe5, +0x34,0x6f,0xff,0xbf,0xff,0x15,0xe5,0x34,0xc3,0x94,0x60,0x40,0xe, 0xe5,0x34,0xd3, +0x94,0x7f,0x50,0x7, 0xe5,0x34,0x20,0xe0,0x2, 0xf5,0x33,0xe5,0x33,0xc3,0x13,0x54, +0xf, 0xc4,0x54,0xf0,0xf5,0x93,0xd2,0xac,0x53,0xe8,0x3f,0x43,0xe8,0xc0,0xd2,0xec, +0xd2,0xb9,0xc2,0xc1,0x43,0xb9,0x10,0x53,0xa9,0xef,0x22,0x80,0xa6,0x53,0xdb,0xbf, +0x22,0xa3,0xf0,0xa3,0x74,0x1, 0xf0,0x22,0x12,0x3f,0x4d,0x90,0xc, 0x32,0x74,0x1e, +0xf0,0xa3,0x74,0x5a,0xf0,0xe4,0x90,0xc, 0x35,0xf0,0xa3,0x74,0x6, 0xf0,0xa3,0x74, +0xbb,0xf0,0xa3,0x74,0x1, 0xf0,0xa3,0x74,0xa, 0xf0,0xa3,0x74,0x6, 0xf0,0xa3,0x74, +0x28,0xf0,0xd1,0xe8,0x90,0xc, 0x55,0x74,0x55,0xf0,0xa3,0x74,0x1, 0xf0,0xe4,0xa3, +0xf0,0x74,0x2e,0x51,0x41,0xa3,0x74,0x5a,0xf0,0xe4,0xa3,0xf0,0xa3,0xf0,0x90,0xc, +0x61,0x74,0x5, 0xf0,0x90,0xc, 0x60,0x74,0x96,0xf0,0x90,0xc, 0x65,0x74,0x64,0xf0, +0xa3,0x74,0x28,0xf0,0xd1,0x90,0x90,0xc, 0x63,0xef,0xf0,0x12,0x16,0xfa,0xe4,0x12, +0x1, 0xc5,0x12,0x16,0xfa,0x4, 0xd1,0xdc,0x90,0x0, 0x8, 0xe4,0x12,0x1, 0xd7,0x74, +0x10,0x71,0xa8,0x74,0x6, 0xd1,0x54,0x90,0x0, 0x5, 0x74,0x28,0x12,0x1, 0xd7,0x90, +0x0, 0x6, 0x74,0x28,0x12,0x1, 0xd7,0x74,0xa, 0xd1,0xe2,0x90,0x0, 0x9, 0x74,0x1, +0x12,0x1, 0xd7,0x12,0x17,0x15,0xe4,0x75,0xf0,0x78,0x12,0x3, 0x3c,0x12,0x17,0x15, +0x90,0x0, 0x2, 0x74,0x1e,0x12,0x1, 0xd7,0x90,0x0, 0x3, 0xe4,0x75,0xf0,0x5a,0x12, +0x3, 0x5b,0x90,0x0, 0x22,0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x15,0x74,0x3, 0x12,0x1, +0xd7,0x90,0x0, 0x16,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x1a,0xe4,0x12,0x1, 0xd7, +0x90,0x0, 0x1b,0x74,0x12,0x12,0x1, 0xd7,0x90,0x0, 0x17,0xe4,0x12,0x1, 0xd7,0x90, +0x0, 0x1c,0xe4,0x75,0xf0,0xfa,0x12,0x3, 0x5b,0x90,0x0, 0x1e,0x74,0xa, 0x12,0x1, +0xd7,0x90,0x0, 0x1f,0x74,0x5, 0x12,0x1, 0xd7,0x90,0x0, 0x20,0x74,0x23,0x12,0x1, +0xd7,0xf1,0x4f,0x74,0x3, 0x12,0x1, 0xd7,0x90,0x0, 0x11,0xe4,0x12,0x1, 0xd7,0x90, +0x0, 0x12,0x74,0x4, 0x12,0x1, 0xd7,0x90,0x0, 0x13,0x71,0xa1,0x90,0x0, 0xb, 0x71, +0xa1,0x90,0x0, 0xd, 0x74,0x28,0x12,0x1, 0xd7,0x12,0x16,0x49,0x74,0x5, 0x12,0x1, +0xc5,0x12,0x16,0x49,0x90,0x0, 0x1, 0x74,0xb, 0x75,0xf0,0xb8,0x12,0x3, 0x5b,0x90, +0x0, 0x3, 0x74,0xbb,0x12,0x1, 0xd7,0x90,0x0, 0x4, 0xe4,0x75,0xf0,0x96,0x2, 0x3, +0x5b,0xe4,0x75,0xf0,0x64,0x2, 0x3, 0x5b,0x90,0x0, 0x3, 0x2, 0x1, 0xd7,0x12,0x3f, +0x4d,0x75,0x2b,0xc, 0x75,0x2c,0x32,0x90,0xc, 0x72,0xe0,0x20,0xe0,0x2, 0xa1,0x1a, +0x54,0xfe,0xf0,0x90,0x0, 0x2, 0x12,0x1, 0x65,0xff,0xb1,0x35,0xe0,0x6f,0x60,0x15, +0xe0,0xff,0x90,0x0, 0x2, 0x12,0x1, 0xd7,0xef,0x75,0xf0,0x4, 0xa4,0xff,0xe5,0xf0, +0x8f,0xf0,0x12,0x3, 0x3c,0x12,0x17,0x15,0x90,0x0, 0x3, 0x12,0x2, 0xb7,0xff,0xb1, +0x35,0xa3,0xe0,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, 0x3, +0xb1,0x2f,0x12,0x16,0x49,0x90,0x0, 0x3, 0xb1,0x28,0x24,0x5, 0xb1,0x1f,0xfe,0x6f, +0x60,0x18,0xee,0x71,0xa8,0xe5,0x2c,0x24,0x5, 0xb1,0x1f,0x75,0xf0,0x20,0xa4,0xff, +0x90,0x0, 0x1, 0xe5,0xf0,0x8f,0xf0,0x12,0x3, 0x5b,0x12,0x16,0x49,0x90,0x0, 0x4, +0xd1,0x4d,0x24,0x2e,0xb1,0x1f,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, +0x90,0x0, 0x4, 0xb1,0x2f,0x12,0x16,0xfa,0x12,0x1, 0x4c,0xff,0xe5,0x2c,0x24,0x25, +0xb1,0x1f,0xfe,0x6f,0x60,0x4, 0xee,0x12,0x1, 0xc5,0x12,0x17,0xbb,0xff,0xe5,0x2c, +0x24,0x6, 0xb1,0x1f,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x1, 0xee,0x12,0x1, 0xd7,0x12, +0x1f,0x9, 0xff,0xe5,0x2c,0x24,0x8, 0xb1,0x1f,0xfe,0x6f,0x60,0x20,0xee,0xd1,0x54, +0xe5,0x2c,0x24,0x8, 0xb1,0x1f,0xc3,0x94,0xf, 0x40,0x6, 0xe5,0x2c,0x24,0x8, 0xd1, +0x5a,0xe5,0x2c,0x24,0x8, 0xb1,0x1f,0x90,0x6, 0xf8,0x93,0x71,0xa8,0x12,0x16,0xfa, +0x90,0x0, 0x6, 0xb1,0x28,0x24,0x9, 0xb1,0x1f,0xfe,0x6f,0x60,0x13,0x90,0x0, 0x6, +0xee,0x12,0x1, 0xd7,0xe5,0x2c,0x24,0x9, 0xb1,0x1f,0x90,0x0, 0x5, 0x12,0x1, 0xd7, +0x12,0x16,0xfa,0x12,0x3f,0x4, 0xff,0xb1,0x1b,0xfe,0x6f,0x60,0x7, 0x90,0x0, 0x7, +0xee,0x12,0x1, 0xd7,0x90,0x0, 0x9, 0xb1,0x28,0x24,0x24,0xb1,0x1f,0xfe,0x6f,0x60, +0x7, 0x90,0x0, 0x9, 0xee,0x12,0x1, 0xd7,0x12,0x17,0x15,0x90,0x0, 0xb, 0xd1,0x4d, +0x24,0x33,0xb1,0x1f,0xfd,0x7c,0x0, 0x6f,0x70,0x2, 0xe5,0xf0,0x60,0x5, 0x90,0x0, +0xb, 0xb1,0x2f,0x12,0x17,0x15,0x90,0x0, 0xd, 0xb1,0x28,0x24,0x34,0xb1,0x1f,0xfe, +0x6f,0x60,0x7, 0x90,0x0, 0xd, 0xee,0x12,0x1, 0xd7,0x22,0xe5,0x2c,0x24,0x7, 0xf5, +0x82,0xe4,0x35,0x2b,0xf5,0x83,0xe0,0x22,0x12,0x1, 0x65,0xff,0xe5,0x2c,0x22,0xec, +0x8d,0xf0,0x2, 0x3, 0x5b,0x85,0x2c,0x82,0x85,0x2b,0x83,0x22,0x12,0x3f,0x4d,0xe4, +0xf5,0x2a,0xe5,0x2a,0xc3,0x94,0x5, 0x50,0x13,0xe5,0x27,0x24,0x30,0xf9,0xe4,0x35, +0x26,0xfa,0xe5,0x2a,0x75,0xf0,0x8, 0x12,0x17,0xd5,0x80,0x14,0xe5,0x2a,0x75,0xf0, +0x8, 0xa4,0x24,0x30,0xff,0xe4,0x35,0xf0,0xfe,0xe5,0x27,0x2f,0xf9,0xe5,0x26,0x3e, +0xaf,0x1, 0xf5,0x2b,0x8f,0x2c,0xb1,0x1b,0x64,0x2, 0x60,0x2, 0xc1,0x42,0xe5,0x2c, +0x24,0x7, 0xd1,0x5a,0xb1,0x35,0xa3,0xa3,0xe0,0x24,0xfe,0xf5,0x28,0xb1,0x35,0xa3, +0xa3,0xe0,0x24,0x2, 0xff,0xe4,0xad,0x28,0xd1,0x7d,0x40,0x2, 0xc1,0x42,0xb1,0x35, +0xa3,0xe0,0x24,0xfe,0xf5,0x29,0xb1,0x35,0xa3,0xe0,0x24,0x2, 0xff,0xe4,0x33,0xfe, +0xad,0x29,0xd1,0x7f,0x40,0x2, 0xc1,0x3e,0xc3,0xe5,0x28,0x64,0x80,0x94,0x80,0x40, +0x79,0xe5,0x28,0x64,0x80,0x94,0x9c,0x50,0x71,0xc3,0xe5,0x29,0x64,0x80,0x94,0x80, +0x40,0x68,0xe5,0x29,0x64,0x80,0x94,0x90,0x50,0x60,0xf1,0x27,0xd1,0x64,0x78,0x5, +0xc3,0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xd1,0xf7,0x12,0x37, +0x3a,0x12,0x2, 0x8c,0xfd,0xaf,0x28,0xf1,0x79,0xab,0x29,0xeb,0x33,0x95,0xe0,0xfa, +0xef,0x2b,0xff,0xee,0x3a,0xd1,0x76,0x33,0x12,0x17,0x15,0x8f,0x82,0xf5,0x83,0xe5, +0xf0,0x8d,0xf0,0x12,0x2, 0xef,0xe9,0x24,0x80,0xf9,0xea,0xd1,0x64,0x78,0x5, 0xc3, +0x33,0xce,0x33,0xce,0xd8,0xf9,0x29,0xf9,0xea,0x3e,0xfa,0xaf,0x29,0xd1,0x72,0x33, +0xfe,0x12,0x37,0x3a,0xe4,0xf5,0xf0,0x12,0x3, 0x3c,0x5, 0x29,0xa1,0xa6,0x5, 0x28, +0xa1,0x8d,0x5, 0x2a,0xe5,0x2a,0x64,0xa, 0x60,0x2, 0xa1,0x42,0x22,0x12,0x2, 0xb7, +0xff,0xe5,0x2c,0x22,0x90,0x0, 0x4, 0x2, 0x1, 0xd7,0xf5,0x82,0xe4,0x35,0x2b,0xf5, +0x83,0xe4,0xf0,0x22,0x34,0x3, 0xfa,0xaf,0x28,0xef,0x33,0x95,0xe0,0xfe,0xef,0x22, +0xaf,0x3a,0xef,0x33,0x95,0xe0,0xfe,0xef,0x25,0xe0,0xff,0xee,0x22,0x33,0xfe,0xed, +0x33,0x95,0xe0,0xfc,0xd3,0xed,0x9f,0xee,0x64,0x80,0xf8,0xec,0x64,0x80,0x98,0x22, +0x7f,0x6, 0x7e,0x0, 0xd1,0xcd,0x8f,0x2b,0x7f,0x1e,0x7e,0x0, 0xd1,0xcd,0xe5,0x2b, +0xb4,0x6d,0x3, 0x7f,0x2, 0x22,0xe5,0x2b,0xb4,0x6e,0x3, 0x7f,0x3, 0x22,0xe5,0x2b, +0xb4,0x6f,0x9, 0xbf,0xff,0x3, 0x7f,0x2, 0x22,0x7f,0x3, 0x22,0xe5,0x2b,0xb4,0x67, +0x9, 0xbf,0xff,0x3, 0x7f,0x4, 0x22,0x7f,0x5, 0x22,0x7f,0x0, 0x22,0xf1,0x3b,0x75, +0xf8,0x10,0xf1,0x7, 0x75,0xf8,0xf0,0xaf,0xfb,0x2, 0x33,0xd2,0x90,0x0, 0x1, 0x2, +0x1, 0xd7,0x90,0x0, 0x7, 0x2, 0x1, 0xd7,0x90,0xc, 0x52,0x74,0xff,0xf0,0x22,0x75, +0x92,0xe8,0xd2,0xae,0xd2,0xbe,0x22,0xed,0x25,0xe0,0xff,0xec,0x33,0xfe,0x22,0x74, +0x3, 0xf0,0xa3,0x74,0xe8,0xf0,0x22,0x8c,0xf9,0x8d,0xfa,0x43,0xfc,0x3, 0x22,0xe4, +0x2f,0xff,0xee,0x34,0x7c,0xfe,0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0x22,0x74, +0x21,0xf0,0xa3,0x74,0x34,0xf0,0x22,0xab,0x22,0xe5,0x24,0x24,0x80,0xf9,0xe5,0x23, +0x22,0xab,0x7, 0xaa,0x6, 0xc2,0xaf,0x43,0xfc,0x3, 0x22,0xad,0x7, 0xac,0x6, 0xc2, +0xaf,0x43,0xfc,0x3, 0x22,0xf5,0x82,0xe4,0x34,0xb, 0xf5,0x83,0xe4,0xf0,0x22,0x90, +0x0, 0xf, 0xe4,0x12,0x1, 0xd7,0x90,0x0, 0x10,0x22,0x74,0x17,0x25,0x2d,0xf5,0x82, +0xe4,0x34,0xb, 0xf5,0x83,0x22,0x53,0xc9,0xf8,0xef,0x70,0x5, 0x43,0xc9,0x3, 0x80, +0x3, 0x43,0xc9,0x2, 0xc2,0xce,0xc2,0xca,0x22,0xef,0x33,0x95,0xe0,0xfe,0xef,0xc4, +0xf8,0x54,0xf, 0xc8,0x68,0xff,0xee,0xc4,0x54,0xf0,0x48,0xfe,0x22,0xe4,0xff,0xa2, +0xaf,0x33,0xfe,0xc2,0x88,0xd2,0xa8,0xc2,0xaf,0x30,0x89,0x6, 0xc2,0x89,0xe4,0xff, +0x80,0x1, 0xf, 0xef,0xd3,0x94,0xfa,0x40,0xf0,0xee,0x24,0xff,0x92,0xaf,0x75,0xf7, +0xff,0x22,0x8b,0x4a,0x8a,0x4b,0x89,0x4c,0x8d,0x4d,0x90,0xa, 0x3c,0x12,0x4, 0xfe, +0x0, 0x0, 0x0, 0x0, 0x90,0xa, 0x40,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x1, 0x75,0x5f, +0x1, 0x75,0x60,0xa, 0x75,0x61,0x48,0x12,0x66,0x52,0x90,0xa, 0xeb,0xe0,0xf5,0x4f, +0xa3,0xe0,0xf5,0x4e,0xe5,0x4d,0x70,0x3c,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x4f,0x50, +0x20,0x12,0x48,0x94,0xc0,0x0, 0xc0,0x1, 0xa3,0x12,0x4d,0xdc,0x74,0xfb,0x25,0x50, +0x12,0x27,0x4f,0xe0,0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0xd1,0x2f,0x80, +0xd9,0xe4,0xf5,0x50,0xb1,0xc4,0x78,0x8, 0x12,0x4, 0xcc,0xd1,0x3b,0xe5,0x50,0xb4, +0x4, 0xf2,0x80,0x3d,0xe4,0xf5,0x50,0xe5,0x50,0xc3,0x95,0x4e,0x50,0x22,0x11,0x94, +0xc0,0x0, 0xc0,0x1, 0xa3,0xb1,0xdc,0x74,0x48,0x25,0x50,0xf5,0x82,0xe4,0x34,0xa, +0xf5,0x83,0xe0,0xf9,0xf8,0x12,0x4, 0xdf,0xd0,0x1, 0xd0,0x0, 0xd1,0x2f,0x80,0xd7, +0xe4,0xf5,0x50,0xb1,0xc4,0x78,0x8, 0x12,0x4, 0xcc,0xd1,0x3b,0xe5,0x50,0xb4,0x2, +0xf2,0xe5,0x4d,0x70,0x17,0xf5,0x50,0xd1,0xbe,0x24,0x75,0xd1,0xa7,0x12,0x26,0x2b, +0xef,0x12,0x1, 0xc5,0x5, 0x50,0xe5,0x50,0xb4,0x4, 0xec,0x22,0xe4,0xf5,0x50,0xd1, +0xbe,0x24,0x79,0xd1,0xa7,0x12,0x26,0x2b,0xef,0x12,0x1, 0xc5,0x5, 0x50,0xe5,0x50, +0xb4,0x2, 0xec,0x22,0x90,0xa, 0x3c,0xe0,0xf8,0xa3,0xe0,0xf9,0xa3,0xe0,0xfa,0xa3, +0xe0,0xfb,0x22,0x12,0x3f,0x4d,0xe4,0xf5,0x2e,0xf5,0x2f,0x12,0x66,0x70,0xf5,0x38, +0xf5,0x39,0xf5,0x3d,0xf5,0x3e,0x12,0x16,0x49,0x90,0x0, 0x13,0x12,0x2, 0xb7,0xf5, +0x45,0x85,0xf0,0x44,0x90,0x0, 0x22,0x12,0x1, 0x65,0xf5,0x48,0x12,0x47,0x29,0x34, +0x3, 0xaf,0x1, 0xf5,0x3f,0x8f,0x40,0xe5,0x24,0x24,0x60,0xf9,0xe5,0x23,0x34,0x7, +0xaf,0x1, 0xf5,0x41,0x8f,0x42,0xe4,0xf5,0x30,0xb1,0xa6,0x12,0x47,0x4f,0xe4,0x12, +0x1, 0xd7,0x5, 0x30,0xe5,0x30,0xb4,0x5, 0xf0,0xd1,0x7c,0x70,0x2, 0xa1,0xa5,0xe4, +0xf5,0x30,0xd1,0x7c,0xff,0xe5,0x30,0xc3,0x9f,0x40,0x2, 0x81,0x7f,0x12,0x11,0xc7, +0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0xd1,0xc, 0xf5,0x83,0x12,0x4, 0xfe,0x0, 0x0, +0x0, 0x0, 0xb1,0xeb,0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x0, 0xd1,0x97,0x12,0x4, 0xfe, +0x0, 0x0, 0x0, 0x0, 0x90,0xa, 0x8c,0x74,0x2, 0xf0,0xf5,0xf0,0x12,0x16,0xe1,0x12, +0x1, 0x65,0x12,0x66,0x61,0x40,0xb, 0x12,0x16,0xfa,0x12,0x1, 0x4c,0x12,0x65,0xb6, +0x50,0x5, 0x12,0x16,0x49,0xf1,0xc0,0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12,0x17, +0xc1,0x12,0x66,0x61,0x40,0x8, 0x12,0x17,0xbb,0x12,0x65,0xb6,0x50,0x5, 0x12,0x16, +0x49,0xf1,0xc0,0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12,0x17,0xc1,0xc3,0x13,0xfd, +0x7c,0x0, 0x12,0x16,0xda,0x12,0x1, 0x65,0x12,0x62,0x51,0x2d,0xff,0xec,0x35,0xf0, +0xfe,0xe4,0xf5,0x43,0x12,0x16,0x33,0xf1,0xb5,0x40,0x3, 0x75,0x43,0x1, 0x12,0x16, +0xd8,0xd1,0x71,0xfe,0xc3,0xef,0x9e,0xf5,0x2e,0x12,0x16,0xd8,0xd1,0x71,0x2f,0xff, +0xe4,0x33,0xfe,0xad,0x2e,0x12,0x46,0x7f,0x40,0x2, 0x81,0x7b,0xe5,0x30,0x75,0xf0, +0x2, 0x12,0x17,0xd5,0xfa,0x12,0x17,0xc1,0xd1,0x74,0xfe,0xc3,0xef,0x9e,0xf5,0x2f, +0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12,0x17,0xc1,0xd1,0x74,0x2f,0xff,0xe4,0xad, +0x2f,0x12,0x46,0x7d,0x40,0x2, 0x81,0x77,0xc3,0xe5,0x2e,0x64,0x80,0x94,0x80,0x50, +0x2, 0x81,0x73,0x12,0x16,0xfa,0x12,0x1, 0x4c,0xad,0x2e,0xd1,0xaf,0x40,0x2, 0x81, +0x73,0xc3,0xe5,0x2f,0x64,0x80,0x94,0x80,0x50,0x2, 0x81,0x73,0x12,0x17,0xc1,0xff, +0xad,0x2f,0xd1,0xb0,0x40,0x2, 0x81,0x73,0xaf,0x2e,0x12,0x47,0x79,0xef,0x2d,0xf5, +0x3c,0xee,0x3c,0xf5,0x3b,0xe5,0x3c,0x25,0xe0,0xff,0xe5,0x3b,0x33,0xfe,0xe5,0x40, +0x2f,0xf5,0x82,0xe5,0x3f,0x12,0x55,0xad,0xff,0xc3,0x95,0x48,0xf5,0x47,0xee,0x94, +0x0, 0xf5,0x46,0xd3,0xe5,0x47,0x94,0x0, 0xe5,0x46,0x64,0x80,0x94,0x80,0x50,0x2, +0x81,0x73,0xef,0x95,0x45,0xee,0x95,0x44,0x40,0xa, 0xb1,0xa6,0x90,0x0, 0x10,0x74, +0x1, 0x12,0x1, 0x92,0xe5,0x43,0xb4,0x1, 0x2c,0xe5,0x3c,0xae,0x3b,0x78,0x3, 0xce, +0xc3,0x13,0xce,0x13,0xd8,0xf9,0x25,0x42,0xf5,0x82,0xe5,0x41,0x3e,0xf5,0x83,0xc0, +0x83,0xc0,0x82,0xe0,0xff,0x7c,0x0, 0xe5,0x3c,0x12,0x57,0x62,0xf4,0xfe,0xef,0x5e, +0xd0,0x82,0xd0,0x83,0xf0,0xe5,0x2e,0x25,0xe0,0xf5,0x3d,0xe5,0x2f,0x25,0xe0,0xf5, +0x3e,0x12,0x16,0xd8,0xd1,0x88,0x60,0x77,0xe5,0x30,0x75,0xf0,0x2, 0xb1,0xab,0x12, +0x17,0xc1,0xd1,0x68,0x60,0x69,0x12,0x11,0xc7,0xc0,0x83,0xc0,0x82,0x11,0x97,0xc0, +0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xd1,0x44,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0, +0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0xd1,0x94,0xc0,0x83,0xc0,0x82,0x11,0x97,0xae, +0x46,0xd1,0x5, 0xeb,0x25,0x47,0xb1,0xb9,0xd0,0x82,0xd0,0x83,0x12,0x4, 0xf2,0xd1, +0xc, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0, +0x3, 0x12,0x66,0x27,0xd1,0x54,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7, +0xd0,0x82,0xd0,0x83,0xf1,0xab,0x24,0x64,0xf5,0x82,0xe4,0x34,0xa, 0x81,0x5b,0xe4, +0xf5,0x3a,0xd1,0x7c,0xad,0x3a,0xd1,0xaf,0x50,0x51,0xe5,0x30,0x65,0x3a,0x60,0x47, +0xed,0x25,0xe0,0xff,0xec,0x33,0x8f,0x82,0xf5,0x83,0xd1,0x88,0x60,0x11,0x12,0x46, +0x70,0xf1,0xcd,0x12,0x17,0xc1,0xd1,0x68,0x60,0x5, 0x75,0x3a,0xff,0x80,0x2c,0x12, +0x46,0x70,0x33,0xd1,0x61,0x8f,0x82,0xf5,0x83,0x12,0x1, 0x65,0xfd,0x7b,0x4, 0xd1, +0x8e,0x60,0x14,0x12,0x46,0x70,0xf1,0xcd,0x12,0x17,0xc1,0xfd,0x7b,0x4, 0xd1,0x6b, +0x60,0x5, 0xe4,0xf5,0x3a,0x80,0x4, 0x5, 0x3a,0x80,0xa7,0xe5,0x3a,0x70,0x73,0xd1, +0xc, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0, +0x3, 0xae,0x46,0xaf,0x47,0xd1,0x5, 0xf1,0xda,0xaf,0x2e,0xd1,0x54,0xd0,0x3, 0xd0, +0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0x12,0x11,0xc4,0xc0,0x83, +0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xae,0x46,0xaf,0x47, +0xd1,0x5, 0xf1,0xda,0xd1,0x52,0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7, +0xd0,0x82,0xd0,0x83,0xb1,0xe8,0xc0,0x83,0xc0,0x82,0x11,0x97,0xb1,0xfb,0xb1,0xb7, +0xd0,0x82,0xd0,0x83,0xd1,0x94,0xc0,0x83,0xc0,0x82,0x11,0x97,0xb1,0xfb,0xeb,0x2f, +0x80,0x78,0xe5,0x3a,0xf4,0x60,0x7c,0xd1,0xc, 0xf5,0x83,0xc0,0x83,0xc0,0x82,0x11, +0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0x12,0x66,0x27,0xd1,0x54,0xd0,0x3, +0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0x12,0x11,0xc4,0xc0, +0x83,0xc0,0x82,0x11,0x97,0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xd1,0x44,0xd0, +0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xb1,0xb7,0xd0,0x82,0xd0,0x83,0xb1,0xe8,0xc0, +0x83,0xc0,0x82,0x11,0x97,0xae,0x46,0xd1,0x5, 0xeb,0x25,0x47,0xb1,0xb9,0xd0,0x82, +0xd0,0x83,0xf1,0xab,0x24,0x78,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xc0,0x83,0xc0, +0x82,0x11,0x97,0xae,0x46,0xd1,0x5, 0xeb,0x25,0x47,0xb1,0xb9,0xd0,0x82,0xd0,0x83, +0x12,0x4, 0xf2,0x5, 0x2f,0x21,0xd0,0x5, 0x2e,0x21,0xa9,0x5, 0x30,0x21,0x2, 0xe4, +0xf5,0x30,0xd1,0x7c,0xff,0xe5,0x30,0xc3,0x9f,0x40,0x2, 0xa1,0x9b,0xe5,0x30,0x75, +0xf0,0x2, 0x12,0x17,0xd5,0xfa,0x12,0x17,0xc1,0xc3,0x13,0xfd,0x7c,0x0, 0x12,0x16, +0xda,0x12,0x1, 0x65,0x12,0x62,0x51,0x2d,0xff,0xec,0x35,0xf0,0xfe,0x12,0x16,0x33, +0xf1,0xb5,0x50,0x2, 0xa1,0x97,0x12,0x11,0xc7,0xc0,0x83,0xc0,0x82,0xb1,0xdc,0x78, +0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83,0xd1,0x94,0x11,0x97,0x12,0x11,0xc7,0xb1, +0xdc,0x12,0x4, 0x13,0xef,0x24,0x20,0xf5,0x32,0xe4,0x3e,0xf5,0x31,0xd1,0xc, 0xf5, +0x83,0xc0,0x83,0xc0,0x82,0xb1,0xdc,0x78,0x6, 0x12,0x4, 0xdf,0xd0,0x82,0xd0,0x83, +0xb1,0xe8,0x11,0x97,0xd1,0xc, 0xf5,0x83,0xb1,0xdc,0x12,0x4, 0x13,0xef,0x24,0x20, +0xf5,0x36,0xe4,0x3e,0xf5,0x35,0xe5,0x39,0xb1,0xa8,0x90,0x0, 0xa, 0xe5,0x31,0x85, +0x32,0xf0,0x12,0x3, 0x5b,0x90,0x0, 0xc, 0xe5,0x35,0x85,0x36,0xf0,0x12,0x3, 0x5b, +0xb1,0xeb,0xc0,0x83,0xc0,0x82,0xe0,0xfc,0xa3,0xe0,0xfd,0xa3,0x12,0x16,0x44,0x90, +0x0, 0x12,0x12,0x1, 0x65,0xf9,0xf8,0x12,0x4, 0xcc,0xd0,0x82,0xd0,0x83,0xb1,0xe8, +0xb1,0xdc,0xe4,0x7b,0x7f,0xfa,0xf9,0xf8,0xc3,0x12,0x4, 0xbb,0x50,0x9, 0xb1,0xeb, +0x12,0x4, 0xfe,0x0, 0x0, 0x0, 0x7f,0xb1,0xeb,0xa3,0xa3,0xa3,0xe0,0xfd,0xe5,0x39, +0xb1,0xa8,0x90,0x0, 0xf, 0xed,0x12,0x1, 0xd7,0xb1,0xa6,0x90,0x0, 0x10,0x12,0x1, +0x65,0xfd,0xe5,0x39,0x75,0xf0,0x7, 0xa4,0xb1,0xae,0x90,0x0, 0x10,0xed,0x12,0x47, +0x53,0x12,0x1, 0x65,0xd3,0x94,0xf, 0x40,0xc, 0xe5,0x39,0xb1,0xa8,0x90,0x0, 0x10, +0x74,0xf, 0x12,0x1, 0xd7,0x5, 0x39,0x5, 0x30,0x81,0x82,0xd1,0x61,0x90,0x0, 0x2d, +0xe5,0x39,0x12,0x1, 0xd7,0x22,0xe5,0x30,0x75,0xf0,0x7, 0xa4,0xab,0x2b,0x25,0x2d, +0xf9,0xe5,0x2c,0x35,0xf0,0xfa,0x22,0xeb,0x2f,0xff,0xea,0x3e,0xfe,0xe9,0x3d,0xfd, +0xe8,0x3c,0xfc,0x22,0x90,0xa, 0x3c,0xa3,0xa3,0xa3,0xe0,0xff,0x74,0x44,0x25,0x50, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xef,0xf0,0x90,0xa, 0x3c,0xe0,0xfc,0xa3,0xe0, +0xfd,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22,0x12,0x4, 0xf2,0xe5,0x30,0x25,0xe0,0x25, +0xe0,0x24,0x64,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xe5,0x46,0xa2,0xe7,0x13, +0xfe,0xe5,0x47,0x13,0xff,0xee,0x33,0x95,0xe0,0xfd,0xfc,0x22,0xe5,0x30,0x25,0xe0, +0x25,0xe0,0x24,0x50,0xf5,0x82,0xe4,0x34,0xa, 0x22,0x7e,0x0, 0x7c,0x0, 0x12,0x1f, +0x1d,0xeb,0xfd,0xd3,0xef,0x9d,0xee,0x9c,0x7f,0x0, 0x50,0x2, 0x7f,0x1, 0x22,0xeb, +0x4f,0xff,0xea,0x4e,0xfe,0xe9,0x4d,0xfd,0xe8,0x4c,0xfc,0x90,0xa, 0x3c,0x12,0x4, +0xf2,0x5, 0x50,0x22,0xae,0x46,0xaf,0x47,0xab,0x7, 0xaa,0x6, 0xea,0x33,0x95,0xe0, +0xf9,0xf8,0xaf,0x2f,0xef,0x33,0x95,0xe0,0xfe,0xfd,0xfc,0x2, 0x3, 0x88,0x12,0x1, +0xc5,0xab,0x2b,0xaa,0x2c,0xa9,0x2d,0x22,0xfd,0x7b,0x2, 0xaf,0x3e,0xd1,0x1a,0xef, +0x22,0x12,0x1, 0x65,0xc3,0x13,0xff,0x90,0xa, 0x8c,0xe0,0x22,0xab,0x2b,0xaa,0x2c, +0xa9,0x2d,0x90,0x0, 0x2d,0x2, 0x1, 0x65,0x12,0x1, 0x65,0xfd,0x7b,0x2, 0xaf,0x3d, +0xd1,0x1a,0xef,0x22,0x12,0x4, 0xf2,0xe5,0x30,0x25,0xe0,0x25,0xe0,0x24,0x78,0xf5, +0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0xf9,0xe4,0x35,0x4b,0xfa,0xe5,0x50,0x22,0xff, +0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x9f,0x74,0x80,0xf8,0x6c,0x98,0x22,0x74,0x44, +0x25,0x50,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xe0,0xff,0xab,0x4a,0xe5,0x4c,0x22, +0x12,0x3f,0x4d,0xd1,0x61,0x90,0x0, 0x2f,0x12,0x1, 0x65,0x30,0xe0,0x3b,0x12,0x17, +0x15,0x90,0x0, 0x4d,0x12,0x2, 0xb7,0xc3,0x94,0x3c,0xe5,0xf0,0x94,0x0, 0x50,0xc, +0x90,0x0, 0x4d,0xe4,0x75,0xf0,0x1, 0x12,0x2, 0xef,0x80,0x1d,0x12,0x35,0xf7,0x85, +0x25,0x36,0xf1,0x44,0x12,0x16,0x49,0x12,0x27,0xcb,0x12,0x17,0x15,0xf1,0x4b,0x90, +0xa, 0xe9,0x74,0x5, 0xf0,0xa3,0x74,0xdc,0xf0,0xd1,0x61,0x90,0x0, 0x2f,0x12,0x1, +0x65,0x20,0xe0,0x1f,0x12,0x17,0x15,0xf1,0x4b,0x30,0x1, 0x17,0xc2,0x1, 0xd1,0x7c, +0xd3,0x94,0x0, 0x40,0xe, 0x12,0x35,0xf7,0x85,0x25,0x36,0xf1,0x44,0x12,0x16,0x49, +0x12,0x27,0xcb,0x22,0x85,0x26,0x37,0x85,0x27,0x38,0x22,0x90,0x0, 0x4d,0xe4,0xf5, +0xf0,0x2, 0x3, 0x5b,0x90,0xc, 0x53,0x74,0x30,0xf0,0xa3,0x74,0x3, 0xf0,0xae,0x2, +0xaf,0x1, 0xad,0x7, 0xac,0x6, 0xe9,0x24,0x60,0xf9,0xea,0x34,0x7, 0xfa,0xe4,0xf5, +0x33,0xf5,0x34,0xe5,0x34,0x25,0xe0,0xff,0xe5,0x33,0x33,0xfe,0xed,0x2f,0xf5,0x82, +0xec,0x12,0x67,0x60,0xe5,0x34,0xae,0x33,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8, +0xf9,0xf5,0x82,0x8e,0x83,0x74,0xff,0x12,0x1, 0xd7,0x5, 0x34,0xe5,0x34,0x70,0x2, +0x5, 0x33,0xb4,0xc0,0xce,0xe5,0x33,0xb4,0x1, 0xc9,0x22,0x12,0x4, 0xf2,0xe5,0x30, +0x25,0xe0,0x25,0xe0,0x22,0x12,0x2, 0x8c,0xfd,0xc3,0xef,0x9d,0xee,0x95,0xf0,0x22, +0x90,0x0, 0x10,0x12,0x1, 0x65,0xc3,0x13,0x90,0xa, 0x8c,0xf0,0x22,0x33,0xfe,0xab, +0x2b,0xe5,0x2d,0x2f,0xf9,0xe5,0x2c,0x3e,0xfa,0x22,0x78,0x1, 0x12,0x4, 0xcc,0xa8, +0x4, 0xa9,0x5, 0xaa,0x6, 0xab,0x7, 0x22,0xef,0x24,0x9f,0x12,0x50,0x4, 0xef,0x24, +0x9e,0x12,0x50,0x4, 0xef,0x24,0x9d,0xf5,0x82,0xee,0x34,0x7, 0xf5,0x83,0x74,0x1, +0xf0,0xef,0x24,0xa4,0xf5,0x82,0xee,0x34,0x7, 0xf5,0x83,0xe4,0xf0,0x22,0xe5,0xe8, +0x54,0xc0,0x64,0xc0,0x60,0x3, 0x12,0x37,0xc7,0x22,0x12,0x3f,0x4d,0x85,0xc9,0x31, +0x12,0x16,0xfa,0x12,0x1, 0x4c,0xff,0x70,0x28,0x12,0x17,0x15,0x12,0x1f,0xf7,0xd3, +0x94,0x0, 0x40,0x5, 0xe4,0xf5,0x8, 0x1, 0xd6,0x12,0x17,0xbb,0x20,0xe0,0x2, 0x1, +0xd6,0x12,0x3f,0x4, 0x65,0x8, 0x60,0x2, 0x1, 0xd6,0xf5,0x8, 0x4, 0x31,0x24,0x1, +0xd6,0xef,0xb4,0x1, 0x12,0x12,0x17,0x15,0x12,0x1f,0xf7,0x60,0x79,0x12,0x16,0xfa, +0x31,0x23,0x75,0xa, 0x1e,0x80,0x6f,0x12,0x16,0xfa,0x12,0x1, 0x4c,0x64,0x3, 0x70, +0x65,0xff,0x31,0x2c,0x12,0x36,0x0, 0x12,0x0, 0x1e,0xe5,0xdb,0x30,0xe1,0xfb,0xc2, +0x89,0xd2,0xa8,0x20,0x96,0xfd,0x43,0x87,0x2, 0xc2,0xa8,0x12,0x36,0x0, 0x12,0x0, +0x1e,0x53,0xdb,0xf0,0x12,0x27,0x3b,0x85,0x22,0x36,0x85,0x23,0x37,0x85,0x24,0x38, +0xab,0x2e,0xaa,0x2f,0xa9,0x30,0x12,0x36,0x9b,0x12,0x16,0xfa,0x31,0x23,0xae,0x2c, +0xaf,0x2d,0x12,0x4f,0xe8,0x12,0x4e,0x61,0x12,0x4f,0x54,0x90,0xc, 0x31,0x74,0xa, +0xf0,0x90,0xc, 0x31,0xe0,0x70,0xfa,0x85,0x2b,0x36,0x85,0x2c,0x37,0x85,0x2d,0x38, +0x12,0x16,0x49,0x12,0x27,0xcb,0xe4,0xf5,0x32,0xe5,0x9, 0x70,0x22,0xff,0x31,0x35, +0xe5,0xdb,0x30,0xe1,0xf4,0xc2,0xcd,0x12,0x16,0xfa,0x12,0x1, 0x4c,0xb4,0x1, 0xe9, +0xe5,0x32,0x70,0xe5,0x75,0x32,0x1, 0x53,0xc9,0xfc,0x43,0xc9,0x1, 0x80,0xda,0xe4, +0xf5,0xa, 0xf5,0x9, 0x85,0x31,0xc9,0xd2,0xcd,0x12,0x3f,0x54,0xfa,0x12,0x1, 0x4c, +0x54,0xef,0x12,0x1, 0xc5,0x12,0x17,0x15,0x12,0x1f,0xf7,0x90,0x0, 0x4c,0x12,0x1, +0xd7,0x1, 0xe, 0xe4,0x12,0x1, 0xc5,0x90,0xc, 0x57,0xf0,0x22,0xef,0x70,0x3, 0xd2, +0x84,0x22,0xc2,0x84,0x22,0xef,0x70,0x3, 0x43,0x87,0x1, 0xbf,0x1, 0x3, 0x43,0x87, +0x2, 0xbf,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x12,0x3f,0x4d,0xe4,0xf5,0x2c,0x12,0x16, +0xfa,0x12,0x4e,0x82,0x60,0x8, 0x90,0x0, 0x2e,0x12,0x1, 0x65,0x60,0x3, 0x7f,0x0, +0x22,0x12,0x1, 0x4c,0xc3,0x13,0xf5,0x29,0x12,0x17,0xc1,0xc3,0x13,0xf5,0x2a,0xe4, +0xf5,0x2b,0xf5,0x28,0x12,0x16,0x7a,0x12,0x0, 0x6, 0xd3,0xef,0x94,0x14,0xee,0x64, +0x80,0x94,0x80,0x40,0x2, 0x5, 0x2b,0x51,0x87,0x40,0xe9,0xe5,0x2b,0xd3,0x94,0x7, +0x40,0x2, 0x51,0x8f,0xe4,0xf5,0x2b,0xe5,0x29,0xd3,0x94,0x0, 0x40,0x35,0xe4,0xf5, +0x28,0x12,0x16,0x7a,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x29,0x75,0xf0,0x20, +0xa4,0x24,0x60,0xf5,0x82,0x74,0x3, 0x35,0xf0,0xf5,0x83,0x12,0x17,0x15,0x12,0x16, +0x8b,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, 0x12,0x46,0x84,0x40,0x2, 0x5, 0x2b,0x51, +0x87,0x40,0xce,0xe5,0x2b,0xd3,0x94,0x7, 0x40,0x2, 0x51,0x8f,0xe4,0xf5,0x2b,0xe5, +0x29,0xc3,0x94,0x12,0x50,0x35,0xe4,0xf5,0x28,0x12,0x16,0x7a,0x12,0x0, 0x6, 0xc0, +0x6, 0xc0,0x7, 0xe5,0x29,0x75,0xf0,0x20,0xa4,0x24,0xa0,0xf5,0x82,0x74,0x3, 0x35, +0xf0,0xf5,0x83,0x12,0x17,0x15,0x12,0x16,0x8b,0x12,0x0, 0x6, 0xd0,0x5, 0xd0,0x4, +0x12,0x46,0x84,0x40,0x2, 0x5, 0x2b,0x51,0x87,0x40,0xce,0xe5,0x2b,0xd3,0x94,0x7, +0x40,0x2, 0x51,0x8f,0xe5,0x2a,0xd3,0x94,0x0, 0x40,0x23,0xe5,0x29,0x75,0xf0,0x20, +0x12,0x1c,0x5e,0xe5,0x2a,0x75,0xf0,0x2, 0xa4,0x24,0x7e,0xff,0xe5,0xf0,0x34,0x3, +0xfe,0x12,0x37,0x3a,0x51,0x9c,0x50,0x6, 0x74,0xa, 0x25,0x2c,0xf5,0x2c,0xe5,0x2a, +0x24,0x1, 0xff,0xe4,0x33,0xfe,0xc3,0xef,0x94,0x13,0xee,0x64,0x80,0x94,0x80,0x50, +0x23,0xe5,0x29,0x75,0xf0,0x20,0x12,0x1c,0x5e,0xe5,0x2a,0x75,0xf0,0x2, 0xa4,0x24, +0x82,0xff,0xe5,0xf0,0x34,0x3, 0xfe,0x12,0x37,0x3a,0x51,0x9c,0x50,0x6, 0x74,0xa, +0x25,0x2c,0xf5,0x2c,0xaf,0x2c,0x22,0x5, 0x28,0xe5,0x28,0xc3,0x94,0xb, 0x22,0xe5, +0x2b,0x24,0xf9,0x75,0xf0,0xa, 0xa4,0x25,0x2c,0xf5,0x2c,0x22,0x12,0x2, 0x8c,0xc3, +0x94,0xce,0xe5,0xf0,0x64,0x80,0x94,0x7f,0x22,0x12,0x3f,0x4d,0x7a,0xf, 0x79,0xb1, +0xb1,0x8e,0x7a,0xf, 0x79,0xb2,0xb1,0x81,0x12,0x1, 0x26,0xe4,0x90,0xa, 0x45,0xf0, +0xe4,0x90,0xa, 0x46,0xf0,0x90,0xa, 0x46,0xe0,0xff,0xc3,0x94,0x8, 0x50,0x2e,0x12, +0x47,0x27,0x34,0x3, 0xfa,0x90,0xa, 0x45,0xe0,0x12,0x11,0xcd,0xe0,0x75,0xf0,0x20, +0xa4,0x29,0xf9,0xe5,0xf0,0x3a,0xfa,0x74,0x3d,0x2f,0x71,0xe, 0x75,0xf0,0x2, 0x12, +0x16,0xe3,0x12,0x4f,0x4e,0x90,0xa, 0x46,0xe0,0x4, 0xf0,0x80,0xc8,0x90,0xa, 0x45, +0xe0,0x4, 0xf0,0xe0,0xb4,0x1, 0xb9,0x22,0xe5,0x2e,0x25,0xe0,0x24,0x3d,0xf5,0x82, +0xe4,0x34,0xa, 0xf5,0x83,0xe0,0x22,0xf1,0x70,0x7a,0x0, 0x79,0x12,0xb1,0x8e,0x7a, +0x0, 0x79,0x13,0xb1,0x81,0x12,0x1, 0x26,0x12,0x2d,0x7e,0x12,0x1, 0x4c,0xf5,0x3a, +0x90,0xc, 0xeb,0xe0,0xc3,0x94,0x1, 0x50,0x5, 0xe0,0x4, 0xf0,0x81,0x63,0xe4,0x90, +0xc, 0xeb,0xf0,0xaa,0x35,0xa9,0x36,0xae,0x2, 0xaf,0x1, 0x8e,0x40,0x8f,0x41,0xf1, +0x38,0xf5,0x42,0x8f,0x43,0xe4,0xf5,0x3a,0xe4,0xf5,0x3c,0xf5,0x3d,0x75,0x3e,0x7f, +0x75,0x3f,0xff,0x90,0x0, 0x1a,0xf1,0x77,0xfd,0x75,0xf0,0x10,0xa4,0xff,0xae,0xf0, +0xe5,0x3a,0x7a,0x0, 0x2f,0xf5,0x45,0xea,0x3e,0xf5,0x44,0x8d,0x3b,0x12,0x2e,0xd9, +0x90,0x0, 0x1b,0x12,0x1, 0x65,0xff,0xe5,0x3b,0xd3,0x9f,0x40,0x2, 0x81,0x29,0x90, +0xa, 0x46,0x74,0x8, 0xf0,0xe4,0x90,0xa, 0x45,0xf0,0x90,0xa, 0x45,0xe0,0xff,0xc3, +0x94,0x1, 0x50,0x32,0x74,0x3c,0x2f,0x12,0x11,0xcf,0xe0,0xb5,0x3b,0x20,0xe4,0x90, +0xa, 0x46,0xf0,0x90,0xa, 0x46,0xe0,0xff,0xc3,0x94,0x8, 0x50,0x11,0x74,0x3d,0x2f, +0x71,0xe, 0x65,0x3a,0x60,0x8, 0x90,0xa, 0x46,0xe0,0x4, 0xf0,0x80,0xe5,0x90,0xa, +0x45,0xe0,0x4, 0xf0,0x80,0xc4,0x90,0xa, 0x46,0xe0,0x64,0x8, 0x70,0x47,0xe5,0x45, +0x25,0xe0,0xff,0xe5,0x44,0x33,0xfe,0xe5,0x41,0x2f,0xf5,0x82,0xe5,0x40,0x12,0x1f, +0x55,0xfd,0xe5,0x43,0x2f,0xf5,0x82,0xe5,0x42,0xb1,0xad,0x2d,0xff,0xee,0x3c,0xfe, +0xd3,0xef,0x95,0x3d,0xee,0x95,0x3c,0x40,0x4, 0x8e,0x3c,0x8f,0x3d,0xc3,0xef,0x95, +0x3f,0xee,0x95,0x3e,0x50,0x4, 0x8e,0x3e,0x8f,0x3f,0x74,0x10,0x25,0x45,0xf5,0x45, +0xe4,0x35,0x44,0xf5,0x44,0x5, 0x3b,0x61,0x7d,0x12,0x2e,0xd9,0x90,0x0, 0x1c,0x12, +0x2, 0xb7,0xff,0xc3,0xe5,0x3d,0x95,0x3f,0xfd,0xe5,0x3c,0x95,0x3e,0xfc,0xd3,0xed, +0x9f,0xec,0x95,0xf0,0x40,0x8, 0x90,0xc, 0xea,0x74,0x2, 0xf0,0x80,0xa, 0x5, 0x3a, +0xe5,0x3a,0x64,0xb, 0x60,0x2, 0x61,0x58,0xe5,0x3a,0xb4,0xb, 0x6, 0x90,0xc, 0xea, +0x74,0x1, 0xf0,0x90,0xc, 0xea,0xe0,0xff,0x22,0x12,0x3f,0x4d,0x75,0x30,0x1, 0xb1, +0x68,0x12,0x16,0xfa,0x71,0x17,0x8f,0x2e,0xb1,0x68,0x12,0x16,0xfa,0x12,0x2d,0xdd, +0x8f,0x2f,0x12,0x16,0x49,0x90,0x7, 0xa4,0x12,0x1, 0x65,0xff,0x70,0x4a,0x4, 0xb1, +0x62,0xe5,0x2e,0xb4,0x2, 0xd, 0x90,0x7, 0x9d,0x74,0x6, 0x12,0x1, 0xd7,0xe4,0xf5, +0x30,0x80,0x2f,0x12,0x17,0x15,0x12,0x4e,0x82,0x70,0x1f,0xb1,0x7b,0x70,0x1b,0x90, +0xc, 0xec,0xe0,0xc3,0x94,0x2, 0x40,0xa, 0xe4,0xf0,0x12,0x16,0x49,0x90,0x7, 0xa4, +0x80,0x46,0x90,0xc, 0xec,0xe0,0x4, 0xf0,0xa1,0x4c,0x12,0x16,0x49,0x74,0x4, 0xb1, +0x62,0xe4,0x90,0xc, 0xec,0xf0,0x80,0x74,0xef,0x64,0x1, 0x70,0x44,0x12,0x16,0x49, +0xb1,0x62,0xe5,0x2f,0x60,0x5, 0x90,0x7, 0xa4,0x80,0x4e,0xe5,0x2e,0xb4,0x2, 0x6, +0x90,0x7, 0x9d,0xe4,0x80,0x53,0x12,0x17,0x15,0x12,0x4e,0x82,0x70,0xd, 0xb1,0x7b, +0x70,0x9, 0x12,0x16,0x49,0x90,0x7, 0x9d,0x4, 0x80,0x3e,0xb1,0x68,0x85,0x25,0x3a, +0x85,0x26,0x3b,0x85,0x27,0x3c,0x12,0x17,0x15,0x12,0x2a,0x9c,0xe4,0xf5,0x30,0x80, +0x2b,0x12,0x16,0x49,0x90,0x7, 0xa4,0x12,0x1, 0x65,0xb4,0x3, 0x1f,0xe5,0x2f,0x24, +0xfe,0x60,0xa, 0x4, 0x70,0xe, 0x90,0x7, 0x9d,0x74,0x3, 0x80,0xc, 0x90,0x7, 0x9d, +0x74,0x2, 0x80,0x5, 0x90,0x7, 0xa4,0x74,0x1, 0x12,0x1, 0xd7,0xe5,0x30,0xb4,0x1, +0x10,0x12,0x17,0x15,0x90,0x0, 0x80,0xe4,0xf1,0x80,0x90,0x0, 0x82,0xe4,0x12,0x1, +0xd7,0x22,0x90,0x7, 0x9d,0x2, 0x1, 0xd7,0x85,0x28,0x34,0x85,0x29,0x35,0x85,0x2a, +0x36,0x85,0x2b,0x37,0x85,0x2c,0x38,0x85,0x2d,0x39,0x22,0x90,0x0, 0x86,0x2, 0x1, +0x65,0x78,0x3d,0x7c,0xa, 0x7d,0x1, 0x7b,0xff,0x7e,0x0, 0x7f,0x8, 0x22,0x78,0x3c, +0x7c,0xa, 0x7d,0x1, 0x7b,0xff,0x7e,0x0, 0x7f,0x1, 0x2, 0x1, 0x26,0xe5,0x2e,0x25, +0xe0,0xff,0xe5,0x2d,0x33,0xfe,0xe5,0x32,0x2f,0xf5,0x82,0xe5,0x31,0x3e,0xf5,0x83, +0xe0,0xfe,0xa3,0xe0,0x22,0x12,0x16,0xf4,0xf1,0x28,0xff,0xf5,0x35,0x12,0x16,0x49, +0x90,0x0, 0x15,0x12,0x1, 0x65,0xf5,0x36,0x90,0x0, 0x16,0x12,0x1, 0x65,0xf5,0x37, +0xef,0x70,0x2, 0xe1,0x8, 0x12,0x16,0xfa,0xf1,0x28,0xb4,0x4, 0x8, 0xe5,0x36,0x25, +0xe0,0x25,0xe0,0xf5,0x36,0xae,0x2, 0xaf,0x1, 0x8e,0x2f,0x8f,0x30,0xf1,0x38,0xf5, +0x31,0x8f,0x32,0xe5,0x27,0x24,0x60,0xf9,0xe5,0x26,0x34,0x7, 0xaf,0x1, 0xf5,0x33, +0x8f,0x34,0xe4,0xf5,0x2b,0x12,0x17,0x15,0x12,0x1, 0x4c,0xff,0xe5,0x2b,0xc3,0x9f, +0x40,0x2, 0xe1,0x8, 0xe5,0x2b,0x75,0xf0,0x10,0xa4,0x85,0xf0,0x2d,0xf5,0x2e,0xe4, +0xf5,0x2c,0x12,0x17,0x15,0x12,0x17,0xc1,0xff,0xe5,0x2c,0xc3,0x9f,0x40,0x2, 0xe1, +0x4, 0xe5,0x35,0xb4,0x3, 0x2, 0xc1,0xc8,0xe5,0x35,0xb4,0x2, 0xf, 0xf1,0x9, 0xc0, +0x83,0xc0,0x82,0xf1,0x1d,0xd5,0x82,0x2, 0x15,0x83,0xc1,0xec,0xe5,0x35,0xb4,0x5, +0x6, 0x12,0x1f,0x45,0xfd,0x80,0x2e,0xe5,0x35,0x64,0x6, 0x70,0x65,0xe5,0x2e,0xae, +0x2d,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9,0xf1,0x2e,0xf1,0x5c,0xfe,0xef, +0x5e,0x60,0x30,0xb1,0x9d,0xf1,0x42,0x40,0x11,0xe5,0x36,0xfd,0xe5,0x2e,0x25,0xe0, +0xff,0xe5,0x2d,0x33,0xfe,0xf1,0x12,0xec,0x80,0x44,0x12,0x1f,0x45,0xf1,0x4d,0x12, +0x46,0x88,0x50,0x64,0xf1,0x12,0xc0,0x83,0xc0,0x82,0xf1,0x1d,0xd5,0x82,0x2, 0x15, +0x83,0x80,0x49,0xe5,0x2e,0xae,0x2d,0x78,0x3, 0xce,0xc3,0x13,0xce,0x13,0xd8,0xf9, +0xf1,0x2e,0xc0,0x83,0xc0,0x82,0xf1,0x5c,0xfe,0xef,0x4e,0xd0,0x82,0xd0,0x83,0xf0, +0x80,0x36,0xb1,0x9d,0xf1,0x42,0x40,0xd, 0xe5,0x36,0xfd,0xf1,0x9, 0xe4,0x8d,0xf0, +0x12,0x2, 0x60,0x80,0x23,0x12,0x1f,0x45,0xf1,0x4d,0x12,0x46,0x88,0x50,0x19,0xf1, +0x12,0xc0,0x83,0xc0,0x82,0xf1,0x1d,0xd5,0x82,0x2, 0x15,0x83,0x15,0x82,0xe0,0x9e, +0xd0,0x82,0xd0,0x83,0xf0,0xa3,0xef,0xf0,0x5, 0x2e,0xe5,0x2e,0x70,0x2, 0x5, 0x2d, +0x5, 0x2c,0xc1,0x22,0x5, 0x2b,0xc1,0x5, 0x22,0xe5,0x2e,0x25,0xe0,0xff,0xe5,0x2d, +0x33,0xfe,0xe5,0x30,0x2f,0xf5,0x82,0xe5,0x2f,0x3e,0xf5,0x83,0x22,0x7e,0x0, 0xc3, +0xa3,0xe0,0x95,0x36,0xff,0x5, 0x82,0x22,0x90,0x7, 0x9d,0x2, 0x1, 0x65,0x25,0x34, +0xf5,0x82,0xe5,0x33,0x3e,0xf5,0x83,0x22,0xe9,0x24,0x80,0xf9,0xea,0x34,0x3, 0xaf, +0x1, 0x22,0xd3,0x95,0x37,0x74,0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0xfd,0xc3,0xe4, +0x95,0x37,0xfb,0xe4,0x94,0x0, 0xfa,0xc3,0xed,0x9b,0xea,0x22,0xe0,0xff,0x7c,0x0, +0xe5,0x2e,0x54,0x7, 0x24,0x7, 0xf5,0x82,0xec,0x34,0x7, 0xf5,0x83,0xe4,0x93,0x22, +0x8b,0x31,0x8a,0x32,0x89,0x33,0x22,0xab,0x37,0xaa,0x38,0xa9,0x39,0x2, 0x1, 0x65, +0x12,0x1, 0xd7,0x90,0x0, 0x81,0xe4,0x2, 0x1, 0xd7,0x12,0x3f,0x4d,0x12,0x4e,0x82, +0xf5,0x32,0x12,0x4e,0x61,0xe4,0x12,0x4e,0x5e,0x12,0x46,0x54,0xe5,0x32,0x70,0x3, +0x2, 0x58,0xe5,0x78,0x38,0x7c,0x0, 0x7d,0x0, 0x12,0x17,0x15,0x7e,0x0, 0x7f,0xa, +0x12,0x1, 0x26,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x32,0x40,0x3, 0x2, 0x58,0x9d, +0x12,0x17,0x15,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x16,0xe3,0x12,0x1, 0x65,0xc3,0x13, +0xf5,0x30,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x17,0xd5,0xfa,0x12,0x17,0xc1,0xc3,0x13, +0xf5,0x31,0x74,0x33,0x25,0x2e,0xf8,0xe4,0xf6,0xe5,0x30,0x64,0x12,0x60,0x3, 0x2, +0x58,0x98,0xf5,0x2f,0xe5,0x2f,0x90,0xf, 0xc6,0x93,0x65,0x31,0x60,0x2, 0x1, 0x8d, +0x74,0x33,0x25,0x2e,0xf8,0x76,0x1, 0x12,0x16,0x49,0xe5,0x30,0x31,0x7, 0xe5,0x31, +0x12,0x16,0x90,0x12,0x16,0xfa,0x11,0xff,0xee,0x95,0xf0,0x40,0x65,0x12,0x4e,0x61, +0x74,0x1, 0x12,0x4e,0x5e,0x12,0x1f,0x9, 0xff,0x7e,0x0, 0xe9,0x24,0x1, 0xf9,0xe4, +0x3a,0x11,0xf0,0xe5,0x2f,0x12,0x4e,0x5e,0x90,0x0, 0x4, 0x74,0x1, 0x12,0x1, 0x92, +0xab,0x28,0xe5,0x2a,0x24,0x60,0xf9,0xe5,0x29,0x34,0x7, 0xfa,0xe5,0x30,0x75,0xf0, +0x10,0xa4,0x7c,0x0, 0x25,0x31,0xff,0xec,0x35,0xf0,0xfe,0xef,0x78,0x3, 0x11,0xf8, +0xd8,0xfc,0x12,0x7, 0x76,0xff,0xe5,0x30,0xc4,0x54,0xf0,0x25,0x31,0x54,0x7, 0xfe, +0x74,0x1, 0xa8,0x6, 0x8, 0x80,0x2, 0xc3,0x33,0xd8,0xfc,0xf4,0x5f,0x12,0x1, 0xc5, +0x80,0x16,0x12,0x17,0x15,0x90,0x0, 0x2d,0x74,0xff,0x12,0x1, 0x92,0x5, 0x2f,0xe5, +0x2f,0x64,0x3, 0x60,0x3, 0x2, 0x57,0xf4,0x5, 0x2e,0x2, 0x57,0xb6,0xe4,0xf5,0x2f, +0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x32,0x50,0x3c,0x74,0x33,0x25,0x2e,0xf8,0xe6,0x70, +0x30,0xe5,0x2e,0x25,0xe0,0x24,0x38,0xf8,0xe6,0xff,0x12,0x17,0x15,0x75,0xf0,0x2, +0xe5,0x2f,0x12,0x16,0xe3,0xef,0x12,0x1, 0xd7,0xe5,0x2e,0x25,0xe0,0x24,0x39,0xf8, +0xe6,0xfd,0xe5,0x2f,0x75,0xf0,0x2, 0x12,0x17,0xd5,0xfa,0xed,0x12,0x46,0xdc,0x5, +0x2f,0x5, 0x2e,0x80,0xbd,0x22,0x7e,0x0, 0xe5,0x2a,0x24,0x23,0xf9,0xe4,0x35,0x29, +0xfa,0xe9,0x2f,0xf9,0xee,0x3a,0xfa,0x22,0xce,0xa2,0xe7,0x13,0xce,0x13,0x22,0x12, +0x2, 0x8c,0xfd,0xd3,0xef,0x9d,0x22,0x90,0x3, 0x80,0x75,0xf0,0x20,0x12,0x5, 0x40, +0x75,0xf0,0x2, 0x22,0x8b,0x32,0x8a,0x33,0x89,0x34,0xe4,0xff,0xab,0x32,0xe5,0x34, +0x24,0x28,0xf9,0xe4,0x35,0x33,0xfa,0xef,0xfd,0x12,0x26,0x2b,0x74,0x3, 0x12,0x1, +0xc5,0xab,0x32,0xe5,0x34,0x24,0x23,0xf9,0xe4,0x35,0x33,0x31,0x71,0x90,0x0, 0x2d, +0x31,0x67,0xef,0x12,0x17,0x93,0x90,0x0, 0x37,0x31,0x67,0xef,0x12,0x17,0x93,0xf, +0xbf,0x5, 0xc9,0xab,0x32,0xaa,0x33,0xa9,0x34,0x90,0x0, 0x41,0xe4,0x12,0x1, 0xd7, +0x90,0x0, 0x42,0xe4,0x2, 0x1, 0xd7,0xab,0x32,0xaa,0x33,0xa9,0x34,0x75,0xf0,0x2, +0x22,0xfa,0xe9,0x2d,0xf9,0xec,0x3a,0xfa,0x74,0x3, 0x2, 0x1, 0xc5,0xc0,0xe0,0xc0, +0xf0,0xc0,0x83,0xc0,0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, +0xc0,0x3, 0xc0,0x4, 0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0x51,0x82,0x5, 0x13,0xe5,0x13, +0x70,0x2, 0x5, 0x12,0x90,0xc, 0x31,0xe0,0x60,0x2, 0x14,0xf0,0xc3,0xe5,0x13,0x94, +0xe8,0xe5,0x12,0x94,0x3, 0x40,0xe, 0x75,0x12,0x0, 0x75,0x13,0x0, 0xe5,0x8, 0x94, +0x64,0x50,0x2, 0x5, 0x8, 0x90,0xa, 0xe5,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0xe4, +0xe0,0x4, 0xf0,0x90,0xa, 0xde,0xe0,0xfe,0xa3,0xe0,0xff,0xc3,0x90,0xa, 0xe5,0xe0, +0x9f,0x90,0xa, 0xe4,0xe0,0x9e,0x50,0x3, 0x12,0x0, 0x1e,0x90,0xa, 0xe9,0xe0,0xfe, +0xa3,0xe0,0xff,0x4e,0x60,0x16,0xef,0x64,0x1, 0x4e,0x70,0x2, 0xd2,0x1, 0x90,0xa, +0xea,0xe0,0x24,0xff,0xf0,0x90,0xa, 0xe9,0xe0,0x34,0xff,0xf0,0x51,0x94,0x40,0xe, +0x90,0xa, 0xe2,0xe0,0x4, 0xf0,0x70,0x6, 0x90,0xa, 0xe1,0xe0,0x4, 0xf0,0x90,0xc, +0x59,0xe0,0xb4,0xaa,0xf, 0x90,0xa, 0xe0,0xe0,0xff,0x4, 0xf0,0xef,0xd3,0x94,0x64, +0x40,0x2, 0x51,0x8d,0xe5,0xa, 0xc3,0x95,0xb, 0x50,0x12,0x5, 0xa, 0xe5,0xc9,0x54, +0x3, 0xff,0xbf,0x1, 0xb, 0x74,0x3, 0x25,0xa, 0xf5,0xa, 0x80,0x3, 0x75,0x9, 0x1, +0x90,0xc, 0xa8,0xe0,0xff,0x60,0x10,0xc3,0x94,0x28,0x50,0x5, 0xe0,0x4, 0xf0,0x80, +0x6, 0x12,0x37,0xcf,0x12,0x2f,0xff,0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0, +0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, 0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0, +0xe0,0x32,0xc2,0x8e,0x75,0xa6,0xf0,0x75,0xa5,0x5f,0xd2,0x8e,0x22,0x90,0xc, 0x59, +0x74,0x1, 0xf0,0x22,0x90,0xa, 0xe1,0xe0,0xfe,0xa3,0xe0,0xff,0xe4,0xfc,0xfd,0x7b, +0x40,0x7a,0x9c,0xf9,0xf8,0xd3,0x2, 0x4, 0xa5,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0, +0x82,0xc0,0xd0,0x75,0xd0,0x0, 0xc0,0x0, 0xc0,0x1, 0xc0,0x2, 0xc0,0x3, 0xc0,0x4, +0xc0,0x5, 0xc0,0x6, 0xc0,0x7, 0x12,0x17,0xfa,0x90,0xc, 0xac,0xe0,0x54,0xfd,0xf0, +0xd0,0x7, 0xd0,0x6, 0xd0,0x5, 0xd0,0x4, 0xd0,0x3, 0xd0,0x2, 0xd0,0x1, 0xd0,0x0, +0xd0,0xd0,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0x32,0x12,0x3f,0x4d,0xe4,0xf5, +0x2e,0xf5,0x2f,0xf5,0x30,0x12,0x66,0x70,0xf5,0x3c,0x75,0x3d,0xff,0xf5,0x42,0xf5, +0x43,0x12,0x16,0x49,0x90,0x0, 0xb, 0x12,0x2, 0xb7,0xf5,0x47,0x85,0xf0,0x46,0xe4, +0xf5,0x48,0xf5,0x49,0x90,0x0, 0x3, 0x12,0x2, 0xb7,0xf5,0x4b,0x85,0xf0,0x4a,0x12, +0x47,0x29,0x34,0x3, 0xaf,0x1, 0xf5,0x44,0x8f,0x45,0xe4,0xf5,0x2e,0x12,0x16,0xfa, +0x12,0x67,0x68,0x9f,0x40,0x2, 0xe1,0xdd,0xe5,0x2e,0x75,0xf0,0x10,0xa4,0x85,0xf0, +0x40,0xf5,0x41,0xe4,0xf5,0x2f,0x12,0x17,0xbb,0xff,0xe5,0x2f,0xc3,0x9f,0x40,0x2, +0xe1,0xd9,0x12,0x62,0x23,0x12,0x67,0x28,0x95,0x47,0xee,0x95,0x46,0x40,0x2, 0x5, +0x48,0x12,0x62,0x23,0x12,0x67,0x28,0x95,0x4b,0xe5,0x4a,0x12,0x62,0x80,0x50,0x2, +0xe1,0xcd,0xe5,0x2e,0x70,0x6, 0xf5,0x30,0xf5,0x31,0x80,0x15,0xe5,0x41,0x24,0xf0, +0xff,0xe5,0x40,0x34,0xff,0x12,0x46,0x76,0x12,0x62,0x2a,0xf5,0x30,0xa3,0xe0,0xf5, +0x31,0x12,0x16,0xfa,0x12,0x1, 0x4c,0x14,0xb5,0x2e,0x7, 0xe4,0xf5,0x32,0xf5,0x33, +0x80,0x14,0xe5,0x41,0x24,0x10,0xff,0xe4,0x35,0x40,0x12,0x46,0x76,0x12,0x62,0x2a, +0xf5,0x32,0xa3,0xe0,0xf5,0x33,0xe5,0x2f,0x70,0x6, 0xf5,0x36,0xf5,0x37,0x80,0x15, +0xe5,0x41,0x24,0xff,0xff,0xe5,0x40,0x34,0xff,0x12,0x46,0x76,0x12,0x62,0x2a,0xf5, +0x36,0xa3,0xe0,0xf5,0x37,0x12,0x17,0xc1,0x14,0xb5,0x2f,0x7, 0xe4,0xf5,0x34,0xf5, +0x35,0x80,0x14,0xe5,0x41,0x24,0x1, 0xff,0xe4,0x35,0x40,0x12,0x46,0x76,0x12,0x62, +0x2a,0xf5,0x34,0xa3,0xe0,0xf5,0x35,0x12,0x62,0x23,0xfe,0xc3,0xee,0x64,0x80,0x94, +0x80,0x50,0x2e,0xe5,0x31,0x95,0x33,0xe5,0x32,0x12,0x65,0x30,0x98,0x40,0x6, 0x85, +0x32,0x30,0x85,0x33,0x31,0xd3,0xe5,0x31,0x95,0x35,0xe5,0x34,0x12,0x65,0x30,0x98, +0x40,0x6, 0x85,0x34,0x30,0x85,0x35,0x31,0xd3,0x12,0x65,0x2a,0x98,0x40,0x35,0x80, +0x2d,0xc3,0xe5,0x31,0x95,0x33,0xe5,0x32,0x12,0x65,0x30,0x98,0x50,0x6, 0x85,0x32, +0x30,0x85,0x33,0x31,0xc3,0xe5,0x31,0x95,0x35,0xe5,0x34,0x12,0x65,0x30,0x98,0x50, +0x6, 0x85,0x34,0x30,0x85,0x35,0x31,0xc3,0x12,0x65,0x2a,0x98,0x50,0x6, 0x85,0x36, +0x30,0x85,0x37,0x31,0xe5,0x2e,0x25,0xe0,0xf5,0x42,0xe5,0x2f,0x25,0xe0,0xf5,0x43, +0xc3,0xee,0x64,0x80,0x94,0x80,0x40,0x2, 0xa1,0x41,0x12,0x62,0x23,0x12,0x62,0x77, +0x40,0x2, 0xa1,0x37,0xc3,0xe4,0x95,0x4b,0xfd,0xe4,0x95,0x4a,0xfc,0xd3,0xef,0x9d, +0xec,0x12,0x62,0x80,0x40,0x2, 0xa1,0x37,0xe5,0x49,0x70,0x9, 0x90,0xa, 0x8c,0xe5, +0x42,0xf0,0xa3,0xa1,0x32,0xe5,0x49,0xc3,0x94,0x5, 0x40,0x5, 0x75,0x49,0x5, 0xa1, +0x37,0xe4,0xf5,0x3d,0x12,0x67,0x14,0x95,0x49,0x74,0x80,0xf8,0x6c,0x98,0x50,0x62, +0x12,0x46,0xf7,0x12,0x66,0xed,0x7b,0x2, 0x12,0x66,0x8d,0x60,0x51,0xaf,0x3d,0x12, +0x46,0x72,0x33,0xfe,0x12,0x66,0xf8,0x12,0x66,0xd, 0x60,0x42,0xaf,0x3d,0x12,0x46, +0x69,0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0x8c,0x2d,0xf5,0x82,0x74,0xa, 0x12,0x62, +0x4d,0xff,0x74,0x8d,0x2d,0xf5,0x82,0x74,0xa, 0x12,0x61,0xff,0xfe,0xa3,0xe0,0xff, +0xc3,0x12,0x46,0x85,0x50,0x13,0xaf,0x3d,0x12,0x46,0x72,0x33,0xfe,0x12,0x66,0xed, +0xe5,0x42,0xf0,0x12,0x66,0xf8,0xe5,0x43,0xf0,0x75,0x3d,0xff,0x80,0x4, 0x5, 0x3d, +0x80,0x92,0xe5,0x49,0xb5,0x3d,0x10,0x12,0x62,0xc8,0xe5,0x42,0xf0,0xe5,0x49,0x12, +0x62,0xbc,0xe5,0x43,0xf0,0x5, 0x49,0x5, 0x41,0xe5,0x41,0x70,0x2, 0x5, 0x40,0xe1, +0xd5,0x12,0x62,0x23,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x62,0x7c,0x50,0x2, 0xe1,0xcd, +0xef,0x95,0x4b,0xe5,0x4a,0x12,0x62,0x80,0x50,0x2, 0xe1,0xcd,0xe5,0x3c,0x70,0x9, +0x90,0xa, 0x3c,0xe5,0x42,0xf0,0xa3,0xe1,0xc8,0xe5,0x3c,0xc3,0x94,0x14,0x40,0x5, +0x75,0x3c,0x14,0xe1,0xcd,0xe4,0xf5,0x3d,0x12,0x67,0x14,0x95,0x3c,0x74,0x80,0xf8, +0x6c,0x98,0x40,0x2, 0xe1,0xb6,0xed,0x25,0xe0,0xff,0xec,0x12,0x64,0xe9,0xe0,0xfd, +0x7b,0x2, 0x12,0x66,0x8f,0x60,0x3a,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xf6,0x12, +0x66,0xd, 0x60,0x2d,0x12,0x62,0x38,0xff,0x74,0x3d,0x2d,0xf5,0x82,0x74,0xa, 0x12, +0x61,0xff,0xfe,0xa3,0xe0,0xff,0xc3,0x12,0x46,0x85,0x40,0x2, 0xe1,0xad,0xaf,0x3d, +0x12,0x46,0x72,0x12,0x64,0xe9,0xe5,0x42,0xf0,0x12,0x64,0xf8,0xe5,0x43,0xf0,0xe1, +0xad,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xe9,0x7b,0x6, 0x12,0x66,0x8d,0x70,0x2, +0xe1,0xb2,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xf6,0x12,0x66,0xd, 0x70,0x2, 0xe1, +0xb2,0xaf,0x3d,0x12,0x46,0x72,0x12,0x64,0xe9,0xe0,0xfd,0xc3,0x13,0x25,0x2e,0xf5, +0x3e,0x12,0x64,0xf8,0xe0,0xc3,0x13,0x25,0x2f,0xf5,0x3f,0xe4,0xf5,0x30,0xf5,0x31, +0xc3,0xe5,0x31,0x95,0x3c,0x74,0x80,0xf8,0x65,0x30,0x98,0x50,0x39,0xaf,0x3d,0x12, +0x46,0x69,0x65,0x31,0x70,0x3, 0xee,0x65,0x30,0x60,0x21,0x12,0x67,0x98,0x12,0x64, +0xe9,0xe0,0x12,0x4e,0x68,0x60,0x15,0x12,0x67,0x98,0x12,0x64,0xf6,0xe0,0xfd,0xaf, +0x3f,0x12,0x4e,0x1a,0xef,0x60,0x5, 0x75,0x3e,0xff,0x80,0xa, 0x5, 0x31,0xe5,0x31, +0x70,0x2, 0x5, 0x30,0x80,0xba,0xe5,0x3e,0xf4,0x70,0x2, 0xe1,0xb2,0x12,0x62,0x38, +0xff,0x74,0x3d,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83,0xe0,0xc3,0x13,0xf9,0x12, +0x62,0x5, 0xfe,0xa3,0xe0,0xff,0x12,0x46,0x84,0x40,0x1c,0xaf,0x3d,0x12,0x46,0x72, +0x33,0xfe,0x74,0x3c,0x2f,0xf5,0x82,0x74,0xa, 0x3e,0x12,0x62,0x4e,0xff,0xe9,0x12, +0x62,0xaa,0x12,0x46,0x76,0x80,0x7, 0xe5,0x41,0x25,0xe0,0xff,0xe5,0x40,0x12,0x62, +0x2a,0xf5,0x32,0xa3,0xe0,0xf5,0x33,0xe5,0x33,0xae,0x32,0x78,0x2, 0x11,0xf8,0xd8, +0xfc,0xfd,0xac,0x6, 0xe5,0x32,0xa2,0xe7,0x13,0xfe,0xe5,0x33,0x13,0x2d,0xf5,0x33, +0xee,0x3c,0xf5,0x32,0x12,0x16,0x49,0x12,0x2, 0x8c,0xff,0xae,0xf0,0xc3,0xe5,0x33, +0x9f,0xe5,0x32,0x9e,0x50,0x4, 0x8e,0x32,0x8f,0x33,0xaf,0x3e,0x12,0x46,0x69,0x24, +0x1, 0xff,0xe4,0x3e,0x12,0x65,0xa6,0x12,0x47,0x7f,0xe5,0x3f,0xc3,0x13,0xfd,0x7c, +0x0, 0x2f,0xff,0xec,0x3e,0x12,0x46,0x76,0x12,0x62,0x2a,0xfa,0xa3,0xe0,0xfb,0xe5, +0x3e,0xa2,0xe7,0x13,0xf9,0xff,0x12,0x47,0x7a,0xef,0x2d,0xff,0xec,0x3e,0x12,0x46, +0x76,0x12,0x62,0x2a,0xfe,0xa3,0xe0,0x2b,0xf5,0x35,0xee,0x3a,0xf5,0x34,0xa2,0xe7, +0x13,0xf5,0x34,0xe5,0x35,0x13,0xf5,0x35,0xaf,0x3e,0x12,0x46,0x69,0x24,0x1, 0xff, +0xe4,0x3e,0x12,0x65,0xa6,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xfd,0xee,0xc4,0x54,0xf0, +0x48,0xfc,0x12,0x65,0x9f,0x2d,0xff,0xee,0x3c,0x12,0x46,0x76,0x12,0x62,0x2a,0xfc, +0xa3,0xe0,0xfd,0xe9,0xff,0x33,0x95,0xe0,0xfe,0xef,0xc4,0xf8,0x54,0xf, 0xc8,0x68, +0xfb,0xee,0xc4,0x54,0xf0,0x48,0xfa,0x12,0x65,0x9f,0x2b,0xff,0xee,0x3a,0x12,0x46, +0x76,0x12,0x62,0x2a,0xfe,0xa3,0xe0,0x2d,0xf5,0x37,0xee,0x3c,0xf5,0x36,0xa2,0xe7, +0x13,0xf5,0x36,0xe5,0x37,0x13,0xf5,0x37,0x25,0x35,0xff,0xe5,0x34,0x35,0x36,0x12, +0x65,0xa6,0xc3,0x95,0x33,0xe5,0x32,0x12,0x62,0x80,0x40,0x16,0xaf,0x3d,0x12,0x46, +0x72,0x12,0x64,0xe9,0xe5,0x3e,0xf0,0x12,0x64,0xf8,0xe5,0x3f,0xf0,0x75,0x3d,0xff, +0x80,0x4, 0x5, 0x3d,0xa1,0x78,0xe5,0x3c,0xb5,0x3d,0x12,0x12,0x11,0xcb,0xe5,0x42, +0xf0,0xe5,0x3c,0x12,0x62,0xb2,0xf5,0x83,0xe5,0x43,0xf0,0x5, 0x3c,0x5, 0x41,0xe5, +0x41,0x70,0x2, 0x5, 0x40,0x5, 0x2f,0x61,0x46,0x5, 0x2e,0x61,0x2d,0xe5,0x3c,0xd3, +0x94,0x5, 0x50,0x3, 0x2, 0x61,0x2a,0xe4,0xf5,0x3e,0xf5,0x2e,0x12,0x4e,0x7c,0xff, +0xe5,0x2e,0xc3,0x9f,0x40,0x3, 0x2, 0x60,0x9c,0x75,0x38,0x3, 0x75,0x39,0xff,0xe4, +0xf5,0x43,0xf5,0x2f,0xe5,0x2f,0xc3,0x95,0x3c,0x50,0x42,0xe5,0x2f,0x12,0x53,0xa, +0x51,0x58,0xe0,0xc3,0x51,0x94,0x12,0x0, 0x6, 0xc0,0x6, 0xc0,0x7, 0xe5,0x2f,0x12, +0x11,0xcb,0x51,0x67,0xe0,0xc3,0x51,0x94,0x12,0x0, 0x6, 0xd0,0xe0,0x2f,0xf5,0x3b, +0xd0,0xe0,0x3e,0xf5,0x3a,0xc3,0xe5,0x3b,0x95,0x39,0xe5,0x3a,0x95,0x38,0x50,0x9, +0x85,0x3a,0x38,0x85,0x3b,0x39,0x85,0x2f,0x43,0x5, 0x2f,0x80,0xb7,0xe5,0x43,0x12, +0x11,0xcb,0x51,0x50,0xff,0xe5,0x43,0x12,0x53,0xa, 0xc3,0x13,0x51,0xaa,0x12,0x46, +0x76,0x51,0x2a,0x12,0x16,0x45,0x12,0x4f,0xb5,0x40,0x2c,0xe5,0x43,0x12,0x11,0xcb, +0xe0,0xfd,0xaf,0x3e,0x12,0x46,0x72,0x33,0xfe,0x74,0x64,0x2f,0xf5,0x82,0x74,0xa, +0x51,0x88,0x12,0x53,0xa, 0xfd,0x74,0x65,0x2f,0xf5,0x82,0x74,0xa, 0x51,0x88,0x12, +0x11,0xcb,0x74,0xff,0xf0,0x5, 0x3e,0x5, 0x2e,0x2, 0x5f,0xec,0x85,0x3e,0x2e,0xe5, +0x2e,0xc3,0x94,0x5, 0x50,0x5e,0xe4,0xf5,0x30,0xf5,0x31,0xf5,0x3f,0xf5,0x2f,0xe5, +0x2f,0xc3,0x95,0x3c,0x50,0x36,0xe5,0x2f,0x12,0x11,0xcb,0xe0,0xff,0xf4,0x60,0x28, +0xef,0x51,0x51,0xff,0xe5,0x2f,0x12,0x53,0xa, 0xfd,0xc3,0x13,0x51,0xd4,0x12,0x46, +0x76,0x51,0x2a,0x51,0x77,0x40,0x11,0xe5,0x2f,0x12,0x11,0xcb,0xe0,0xf5,0x42,0x8d, +0x43,0x8e,0x30,0x8f,0x31,0x85,0x2f,0x3f,0x5, 0x2f,0x80,0xc3,0xe5,0x2e,0x12,0x4d, +0xef,0xe5,0x42,0x51,0x9b,0xe5,0x43,0xf0,0xe5,0x3f,0x12,0x11,0xcb,0x74,0xff,0xf0, +0x5, 0x2e,0x80,0x9b,0xe4,0xf5,0x2e,0xe5,0x2e,0x12,0x4d,0xef,0xe0,0xff,0xe5,0x2e, +0x12,0x11,0xcb,0xef,0x51,0x9b,0xe0,0xff,0xe5,0x2e,0x51,0xb2,0xf5,0x83,0xef,0xf0, +0x5, 0x2e,0xe5,0x2e,0xb4,0x5, 0xe0,0x75,0x3c,0x5, 0xe4,0xf5,0x2e,0x51,0x69,0x74, +0xff,0xf0,0x51,0x59,0x74,0xff,0xf0,0x5, 0x2e,0xe5,0x2e,0xb4,0x5, 0xef,0xe5,0x3c, +0xd3,0x94,0x0, 0x40,0x48,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x3c,0x50,0x3e,0xe5, +0x2e,0x12,0x11,0xcb,0xe0,0xff,0x12,0x4e,0x61,0x75,0xf0,0x2, 0xe5,0x2e,0x12,0x16, +0xe3,0xef,0x12,0x1, 0xd7,0x12,0x53,0x8, 0xfd,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x17, +0xd5,0xfa,0x90,0x0, 0x1, 0xed,0x12,0x1, 0xd7,0xe5,0x2e,0x12,0x11,0xcb,0x51,0x67, +0xef,0xf0,0x12,0x53,0x8, 0x51,0x58,0xef,0xf0,0x5, 0x2e,0x80,0xbb,0xe5,0x49,0xd3, +0x94,0x0, 0x40,0x2e,0xe4,0xf5,0x2e,0xe5,0x2e,0xc3,0x95,0x49,0x50,0x24,0xe5,0x2e, +0x51,0xc8,0xe0,0xfd,0xe5,0x2e,0x75,0xf0,0x2, 0x12,0x4d,0xab,0x90,0x0, 0x87,0xed, +0x12,0x1, 0xd7,0xe5,0x2e,0x51,0xbc,0xe0,0x90,0x0, 0x88,0x12,0x1, 0xd7,0x5, 0x2e, +0x80,0xd5,0x12,0x4e,0x61,0x90,0x0, 0x86,0xe5,0x49,0x12,0x1, 0xd7,0x90,0x0, 0x2d, +0xe5,0x3c,0x12,0x1, 0xd7,0xe9,0x24,0x2f,0x12,0x3f,0x5f,0x12,0x16,0x49,0x90,0x0, +0xd, 0x12,0x1, 0x65,0xff,0xe5,0x48,0xd3,0x9f,0x40,0x13,0xab,0x2b,0xe5,0x2d,0x24, +0x2f,0xf9,0xe4,0x35,0x2c,0xfa,0x12,0x1, 0x4c,0x44,0x1, 0x12,0x1, 0xc5,0x22,0x3c, +0xf5,0x83,0xe0,0xc3,0x13,0x7c,0x0, 0x2f,0xff,0xec,0x35,0xf0,0xfe,0xef,0x25,0xe0, +0xff,0xee,0x33,0xfe,0xe5,0x45,0x2f,0xf5,0x82,0xe5,0x44,0x3e,0xf5,0x83,0xe0,0xfc, +0xa3,0xe0,0xfd,0xe5,0x41,0x25,0xe0,0xff,0xe5,0x40,0x33,0xfe,0xe5,0x45,0x2f,0xf5, +0x82,0xe5,0x44,0x3e,0xf5,0x83,0xe0,0x22,0xaf,0x3d,0xef,0x33,0x95,0xe0,0xfe,0xef, +0x25,0xe0,0xfd,0xee,0x33,0xfc,0x74,0x3c,0x2d,0xf5,0x82,0x74,0xa, 0x3c,0xf5,0x83, +0xe0,0xc3,0x13,0x75,0xf0,0x10,0xa4,0x22,0xff,0xe5,0x2e,0x25,0xe0,0x24,0xe1,0xf5, +0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0xe0,0xff,0xe5,0x2e,0x25,0xe0,0x24,0xe0,0xf5, +0x82,0xe4,0x34,0xc, 0xf5,0x83,0x22,0xfe,0xa3,0xe0,0xff,0xd3,0x95,0x31,0xe5,0x30, +0x64,0x80,0xf8,0xee,0x64,0x80,0x98,0x22,0x3e,0xf5,0x83,0xed,0xf0,0xe5,0x43,0x22, +0xff,0xc3,0xe5,0x3d,0x9f,0xff,0xe4,0x94,0x0, 0xfe,0x22,0xf0,0xe5,0x2e,0x25,0xe0, +0x24,0x65,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x7c,0x0, 0x2f,0xff,0xec,0x35, +0xf0,0x22,0x25,0xe0,0x24,0x3d,0xf5,0x82,0xe4,0x34,0xa, 0x22,0x25,0xe0,0x24,0x8d, +0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0x22,0x25,0xe0,0x24,0x8c,0xf5,0x82,0xe4,0x34, +0xa, 0xf5,0x83,0x22,0x7a,0x0, 0x2f,0xff,0xea,0x35,0xf0,0x22,0xbf,0x1, 0x5, 0x43, +0xdb,0x80,0x80,0x6, 0xef,0x70,0x3, 0x53,0xdb,0x7f,0xc2,0xea,0x43,0xdb,0x10,0xd2, +0xd9,0xc2,0xdd,0xc2,0xdc,0xc2,0xdb,0xc2,0xda,0xd2,0xd8,0x75,0xab,0x6, 0xe4,0xf5, +0x9a,0x53,0xdb,0xfd,0xd2,0xed,0xd2,0xba,0xc2,0xc2,0x43,0xa9,0x4, 0x43,0xb9,0x4, +0x22,0xef,0x71,0xee,0xed,0x2b,0xfb,0xe4,0x3a,0xfe,0xaf,0x3, 0x22,0x8b,0x37,0x8a, +0x38,0x89,0x39,0xe4,0xf5,0x3d,0x12,0x2e,0xd9,0x71,0xd6,0xfd,0xe4,0xff,0x71,0x11, +0x8e,0x3e,0x8f,0x3f,0xe5,0x3d,0x70,0x3, 0x43,0x3e,0x20,0x71,0xc9,0x94,0x10,0x40, +0xe5,0x75,0x3d,0x10,0xe4,0xfd,0x7f,0xc0,0x71,0xce,0x94,0x20,0x40,0xf6,0xe4,0xf5, +0x3d,0x71,0xe7,0x71,0xd6,0xfe,0x54,0xf, 0xff,0xee,0xc4,0x54,0xf, 0xfd,0x71,0xdf, +0x8e,0x3e,0x8f,0x3f,0x71,0xc9,0x94,0x8, 0x40,0xe7,0x75,0x3d,0x8, 0xe4,0xfd,0x7f, +0xc0,0x71,0xce,0x94,0x20,0x40,0xf6,0xe4,0xf5,0x3d,0x75,0xf0,0x2, 0xe5,0x3d,0xa4, +0x24,0x54,0xf5,0x82,0xe5,0xf0,0x34,0xc, 0xf5,0x83,0xe4,0x93,0xf5,0x3e,0x74,0x1, +0x93,0xf5,0x3f,0x71,0xc9,0x94,0xff,0x40,0xe1,0x90,0xe, 0x52,0xe4,0x93,0xfc,0x74, +0x1, 0x93,0xfd,0xec,0xff,0x71,0xfd,0x8f,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1, +0x14,0x53,0xdb,0xf3,0x8d,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0x85,0xa1,0x15,0x53,0xdb, +0xf3,0x43,0xab,0x4, 0xae,0x14,0xaf,0x15,0x22,0xe5,0x3e,0xff,0xad,0x3f,0x71,0xa5, +0x5, 0x3d,0xe5,0x3d,0xc3,0x22,0x85,0x3d,0x82,0x75,0x83,0x0, 0x2, 0x1, 0x65,0xac, +0x7, 0xed,0x71,0xee,0xec,0x61,0x15,0xab,0x3a,0xaa,0x3b,0xa9,0x3c,0x22,0x7b,0x0, +0x7a,0xc0,0x75,0xf0,0x80,0xa4,0x2b,0xfb,0xe5,0xf0,0x3a,0xfa,0x22,0x53,0xab,0x3, +0x53,0xdb,0xf3,0x22,0x71,0xfd,0xef,0x44,0x80,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0xe4,0xf5,0xa1,0xe5,0xdb,0x30,0xe3,0xfb,0xaf,0xa1,0x43,0xab,0x4, +0x22,0x53,0xc9,0x7, 0x43,0xc9,0x30,0x75,0xeb,0x80,0xef,0x25,0xe0,0x4, 0x25,0xeb, +0xf5,0xeb,0x22,0x7d,0x3, 0xe4,0x91,0x3d,0x60,0x2, 0x7f,0x1, 0x22,0xff,0x12,0x2f, +0xb8,0xef,0x7f,0x0, 0x22,0xe4,0xfd,0x91,0x3d,0x60,0x2, 0x7f,0x1, 0x22,0xe5,0xdb, +0x20,0xe1,0x3, 0x7f,0x0, 0x22,0x53,0xdb,0xfd,0x7f,0x1, 0x22,0xc2,0xc2,0x53,0xdb, +0xbf,0x32,0xef,0x70,0x4, 0x53,0xdb,0xbf,0x22,0x43,0xdb,0x40,0x22,0xef,0x24,0xfe, +0x60,0xb, 0x14,0x60,0xc, 0x24,0x2, 0x70,0xc, 0x7d,0x9, 0x80,0xa, 0x7d,0x6, 0x80, +0x6, 0x7d,0x3, 0x80,0x2, 0xe4,0xfd,0xe5,0xdc,0x54,0xf0,0x2d,0xf5,0xdc,0x22,0xf9, +0xe4,0x35,0x23,0xfa,0x7e,0x0, 0xe9,0x25,0x2e,0xf9,0xee,0x3a,0xfa,0x12,0x1, 0x4c, +0x54,0xf, 0xfd,0xe5,0x2e,0x25,0xe0,0xff,0xee,0x33,0xfe,0x74,0x74,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0xed,0xf0,0x12,0x1, 0x4c,0x54,0xf0,0xc4,0x54,0xf, 0xfd, +0xe5,0x2e,0x25,0xe0,0xff,0xe4,0x33,0xfe,0x74,0x75,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0xab,0x34,0xaa,0x35,0xa9,0x36,0xe4,0x12,0x1, 0xd7,0xab,0x37,0xaa, +0x38,0xa9,0x39,0x90,0x0, 0x1f,0x2, 0x1, 0x65,0x33,0xfe,0x74,0x3c,0x2f,0xf5,0x82, +0x74,0xa, 0x3e,0xf5,0x83,0x22,0x33,0xfe,0x74,0x3d,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0xab,0x37,0xaa,0x38,0xa9,0x39,0x90,0x0, 0x20,0x2, 0x1, 0x65,0x7c, +0x0, 0x12,0x5, 0x9c,0x8f,0x35,0x8e,0x34,0x8d,0x33,0x8c,0x32,0x78,0x8, 0x12,0x4, +0xcc,0x8f,0x35,0x8e,0x34,0x8d,0x33,0x8c,0x32,0x22,0xe5,0x31,0x95,0x37,0xe5,0x36, +0x64,0x80,0xf8,0xe5,0x30,0x64,0x80,0x22,0xa4,0x24,0x54,0xf9,0x74,0xe, 0x35,0xf0, +0xfa,0x7b,0xff,0xe9,0x25,0x38,0xf9,0xe4,0x3a,0xfa,0x78,0x32,0x7c,0x0, 0x7d,0x0, +0x7e,0x0, 0x22,0xa3,0xf0,0x75,0x25,0x1, 0x75,0x26,0x8, 0x75,0x27,0x29,0x75,0x28, +0x1, 0x75,0x29,0xa, 0x75,0x2a,0x25,0x7b,0x1, 0x7a,0x9, 0x79,0x18,0x22,0xf9,0xe4, +0x3a,0xfa,0x12,0x2, 0x8c,0xc4,0xf8,0x54,0xf, 0xc8,0x68,0xff,0xe5,0xf0,0xc4,0x54, +0xf0,0x48,0x8f,0xf0,0x2, 0x3, 0x3c,0x12,0x5, 0x9c,0xe5,0x40,0x2f,0xf5,0x40,0xe5, +0x3f,0x3e,0xf5,0x3f,0xe5,0x3e,0x3d,0xf5,0x3e,0xe5,0x3d,0x3c,0xf5,0x3d,0x22,0xe5, +0x3f,0x24,0x1, 0xff,0xe4,0x33,0xa2,0xe7,0x13,0xfe,0xef,0x13,0x22,0x90,0x3, 0x80, +0x75,0xf0,0x20,0x2, 0x5, 0x40,0x24,0xff,0xff,0xe4,0x34,0xff,0xcf,0xc3,0x95,0x3c, +0xcf,0x95,0x3b,0xfe,0xd3,0xef,0x94,0x0, 0xee,0x94,0x0, 0x22,0xe5,0x2f,0x75,0xf0, +0x7, 0xa4,0xff,0xae,0xf0,0xab,0x22,0x25,0x24,0xf9,0xe5,0x23,0x3e,0xfa,0x22,0xfa, +0x90,0x0, 0x2, 0x12,0x2, 0xb7,0xc3,0x9d,0xff,0xe5,0xf0,0x9c,0xfe,0x2, 0x0, 0x6, +0x90,0x8, 0x1d,0x74,0x1, 0xf0,0xa3,0x74,0xb, 0xf0,0x22,0xf9,0xe4,0x3a,0xfa,0x12, +0x2, 0x8c,0xc3,0x95,0x2c,0xff,0xe5,0xf0,0x95,0x2b,0x8f,0xf0,0x22,0xe0,0xfd,0xaf, +0x43,0x12,0x4e,0x1a,0xef,0x22,0x24,0x3e,0xf5,0x82,0xe4,0x34,0xa, 0xf5,0x83,0xee, +0xf0,0xa3,0xef,0xf0,0x5, 0x2d,0x22,0xae,0x46,0xaf,0x47,0xab,0x7, 0xaa,0x6, 0xea, +0x33,0x95,0xe0,0xf9,0xf8,0xaf,0x2e,0x22,0xe5,0x21,0x75,0xf0,0x7, 0xa4,0x24,0xc8, +0xf5,0x82,0xe4,0x34,0x8, 0xf5,0x83,0x22,0x75,0x25,0x1, 0x75,0x26,0x8, 0x75,0x27, +0x33,0x22,0x75,0x62,0xb, 0x75,0x63,0x78,0x7b,0xff,0x7a,0xf, 0x79,0x48,0x2, 0xa, +0x57,0xc3,0x13,0x75,0x3b,0x0, 0xf5,0x3c,0xd3,0x94,0x0, 0xe5,0x3b,0x94,0x0, 0x22, +0xf5,0x31,0xf5,0x32,0xf5,0x33,0xf5,0x34,0xf5,0x35,0xf5,0x36,0xf5,0x37,0x22,0xfd, +0xfc,0xab,0x35,0xaa,0x34,0xa9,0x33,0xa8,0x32,0xc3,0x2, 0x4, 0xbb,0xe0,0xfd,0xaf, +0x42,0x12,0x4e,0x1a,0xef,0x22,0xff,0xe9,0x24,0x58,0xf9,0xe4,0x3a,0xfa,0xe9,0x2f, +0xf9,0xea,0x3e,0x22,0xe5,0x21,0x75,0xf0,0x7, 0xa4,0x24,0xca,0xf5,0x82,0xe4,0x34, +0x8, 0x22,0x75,0x28,0x1, 0x75,0x29,0x0, 0x75,0x2a,0x0, 0x75,0x2b,0x1, 0x22,0x90, +0x0, 0x52,0x12,0x1, 0xd7,0x90,0x0, 0x53,0x22,0xab,0x28,0xe5,0x2a,0x24,0x23,0xf9, +0xe4,0x35,0x29,0xfa,0x22,0x74,0x2, 0x25,0x4f,0xf5,0x4f,0xe4,0x35,0x4e,0xf5,0x4e, +0x22,0xab,0x34,0xe5,0x36,0x24,0x80,0xf9,0xe5,0x35,0x34,0x3, 0x22,0x74,0x8c,0x2f, +0xf5,0x82,0x74,0xa, 0x3e,0xf5,0x83,0x22,0x74,0x8d,0x2f,0xf5,0x82,0x74,0xa, 0x3e, +0xf5,0x83,0x22,0x12,0x1, 0xd7,0x90,0x0, 0x80,0x22,0x33,0x8f,0x82,0xf5,0x83,0x12, +0x2, 0xb7,0x2d,0x22,0xad,0x3d,0xed,0x33,0x95,0xe0,0xfc,0xc3,0xed,0x22,0x12,0x1, +0x4c,0xfd,0x12,0x0, 0x4e,0xe5,0x2d,0x22,0xfe,0xa3,0xe0,0xff,0x12,0x0, 0x6, 0xd3, +0xef,0x22,0x90,0x0, 0x53,0x2, 0x1, 0x65,0xe5,0x3b,0x25,0xe0,0xff,0xe5,0x3a,0x33, +0xfe,0x22,0x75,0x25,0x1, 0x75,0x26,0xa, 0x75,0x27,0x25,0x22,0x75,0x25,0x1, 0x75, +0x26,0x0, 0x75,0x27,0x83,0x22,0xf0,0x90,0xb, 0x5d,0xe0,0x90,0x0, 0x54,0xf0,0x22, +0x3e,0xf5,0x83,0xe4,0xf0,0xa3,0xf0,0x22,0x12,0x1, 0x4c,0xff,0xe5,0x2e,0xc3,0x22, +0xfd,0x12,0x0, 0x4e,0xe4,0xf5,0x2d,0x22,0xff,0xab,0x2a,0xe5,0x2c,0x24,0x54,0x22, +0xff,0xab,0x2a,0xe5,0x2c,0x24,0x1c,0x22,0x74,0x6d,0x25,0x50,0xf8,0xe6,0xa4,0x22, +0xf5,0x82,0xe4,0x35,0x5c,0xf5,0x83,0x22,0xe5,0x31,0x25,0xe0,0xff,0xe5,0x30,0x22, +0x12,0x1, 0x65,0xc3,0x13,0xf5,0x42,0x22,0x12,0x1, 0xd7,0x90,0xb, 0x5d,0xe0,0x22, +0x67,0xb0,0x98,0x4f,0x4b,0xb4,0x2e,0x5a, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/FT6x06_4Column_V02_20140901_app.h b/drivers/input/touchscreen/focaltech/FT6x06_4Column_V02_20140901_app.h new file mode 100644 index 00000000..9ba755fe --- /dev/null +++ b/drivers/input/touchscreen/focaltech/FT6x06_4Column_V02_20140901_app.h @@ -0,0 +1,1386 @@ +0x2, 0x1, 0xd4,0x2, 0x48,0x46,0x22,0x22,0x2, 0x3b,0xe6,0x2, 0x7, 0x82,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x22,0x2, 0x3c,0x19,0x22,0x2, 0x45,0x24,0x7e,0xa1, +0x26,0x74,0x4, 0xa4,0x22,0xf5,0xe4,0x7a,0x71,0xe5,0x22,0x2, 0x47,0xd4,0xa2,0xf, +0xe4,0x33,0x22,0x2, 0x4e,0xc2,0x74,0x5, 0xac,0xbf,0x49,0x35,0x0, 0x63,0x9d,0x32, +0x2, 0x2, 0x9e,0x2, 0x48,0x1d,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff, +0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5, +0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21, +0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d, +0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22, +0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f, +0x12,0x12,0x0, 0x94,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x0, 0x94,0x30, +0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e, +0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x20,0x21,0x20,0x21,0x20,0x21, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, +0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a, +0x1, 0x22,0x23,0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x6, 0x6, 0x6, 0x6, 0x5, 0x5, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x21,0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x21, +0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x21,0x20,0x20,0x20,0x20,0x21,0x21,0x21,0x21, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19, +0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a, +0x1, 0x22,0x23,0x0, 0x75,0x84,0x1, 0x7e,0x44,0x8, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b, +0x44,0x78,0xf9,0x7e,0xf8,0x5, 0x60,0xc2,0xd, 0x75,0x55,0x0, 0x75,0x56,0x0, 0x75, +0x57,0x0, 0x75,0x14,0x0, 0x75,0x15,0x0, 0xc2,0xe, 0xc2,0x7, 0xd2,0x8, 0x75,0x5b, +0x0, 0x75,0x5c,0x0, 0x75,0x4d,0x0, 0x75,0x58,0x0, 0x75,0x59,0x0, 0x75,0x5a,0x0, +0xc2,0xf, 0xd2,0x9, 0xc2,0xa, 0xc2,0x10,0xc2,0x11,0x7e,0x4, 0x0, 0xff,0x7e,0x14, +0x2, 0xcd,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, +0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78, +0xf2,0x80,0xdf,0x2, 0x3c,0x33,0xff,0xfe,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6, +0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef,0xee,0xed,0xec,0xeb,0xea,0xe9,0xe8,0xe7,0xe6, +0xe5,0xe4,0xe3,0xe2,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, +0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x19,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13, +0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22,0x10,0x10, +0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x0, 0x18,0x4, +0xd7,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5, 0x60,0x0, 0x0, 0x24, +0x3, 0xdb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24,0x5, 0x14,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, +0x4, 0xc1,0x0, 0x0, 0x1, 0x4, 0xc3,0x0, 0x0, 0x1, 0x4, 0xc4,0x0, 0x0, 0x1, 0x4, +0xc6,0x0, 0x0, 0x1, 0x0, 0xa5,0x0, 0x0, 0x1, 0x5, 0x5e,0x10,0x0, 0x1, 0x5, 0x5f, +0x8, 0x0, 0x1, 0x3, 0xff,0x0, 0x0, 0x1, 0x4, 0x2, 0x10,0x0, 0x1, 0x4, 0x3, 0x8, +0x0, 0x1, 0x4, 0x16,0x5, 0x0, 0x1, 0x4, 0x18,0xa, 0x0, 0x1, 0x4, 0x19,0xa, 0x0, +0x1, 0x4, 0x1a,0x5, 0x0, 0x1, 0x4, 0x1b,0x32,0x0, 0x1, 0x4, 0x1c,0x20,0x0, 0x2, +0x4, 0x1d,0x7, 0xd0,0x0, 0x1, 0x4, 0x1f,0x10,0x0, 0x1, 0x4, 0x20,0x14,0x0, 0x1, +0x4, 0x21,0x4, 0x0, 0x1, 0x4, 0x22,0x14,0x0, 0x1, 0x4, 0x23,0x3c,0x0, 0x1, 0x4, +0x24,0x14,0x0, 0x2, 0x4, 0x25,0x1, 0xf4,0x0, 0x2, 0x4, 0x27,0xb, 0xb8,0x0, 0x2, +0x4, 0x29,0xb, 0xb8,0x0, 0x2, 0x4, 0x2f,0x1, 0xe0,0x0, 0x2, 0x4, 0x31,0x3, 0x56, +0x0, 0x1, 0x4, 0x4f,0x0, 0x0, 0x1, 0x4, 0x50,0x0, 0x0, 0x1, 0x4, 0x57,0x1, 0x0, +0x2, 0x4, 0x58,0x5, 0xdc,0x0, 0x1, 0x4, 0x5a,0x14,0x0, 0x1, 0x5, 0x4d,0x0, 0x0, +0x8, 0x5, 0x56,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x0, 0x0, 0xca,0x3b,0x7e, +0xc3,0x0, 0x9f,0x7e,0xb3,0x0, 0xa0,0xf5,0x23,0x4c,0xcc,0x78,0x2f,0x12,0x7, 0x49, +0xe5,0x23,0xbe,0xb0,0x0, 0x38,0x2, 0xe1,0x46,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70, +0x5, 0xac,0x7f,0x19,0xa3,0x0, 0x97,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xf0,0xd2,0x5, +0xc2,0x3, 0x6d,0x33,0x7a,0x35,0x55,0x75,0x57,0x0, 0xe1,0x46,0xe5,0x57,0xbe,0xb0, +0x3c,0x50,0x12,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x0, 0x86,0x74,0xfa,0x7a,0xb3,0x0, +0x88,0x5, 0x57,0x80,0x18,0x7e,0x37,0x0, 0x86,0xbe,0x34,0xa, 0x0, 0x68,0xe, 0x7e, +0x34,0xa, 0x0, 0x7a,0x37,0x0, 0x86,0x74,0xa0,0x7a,0xb3,0x0, 0x88,0x6c,0xff,0x7e, +0x70,0xff,0x74,0x5, 0xac,0xbf,0x19,0x75,0x2, 0xbd,0x7e,0x34,0x7f,0xff,0x59,0x35, +0x2, 0xb9,0x59,0x35,0x2, 0xbb,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xe2,0x6c,0xff,0x80, +0x23,0x7e,0x50,0x5, 0xac,0x5f,0x7d,0x12,0x2e,0x14,0x0, 0x63,0xb, 0x18,0x30,0x12, +0x17,0xb1,0x1b,0x18,0x30,0x2e,0x24,0x0, 0x65,0xb, 0x28,0x30,0x12,0x17,0xb1,0x1b, +0x28,0x30,0xb, 0xf0,0xbc,0xcf,0x38,0xd9,0xe5,0x23,0xbc,0xbc,0x68,0x5, 0x6d,0x33, +0x7a,0x35,0x55,0x6c,0xff,0x12,0x56,0x55,0x50,0xf, 0xa, 0x37,0x9, 0xb3,0x0, 0xe0, +0x70,0x7, 0x6d,0x33,0x7a,0x35,0x55,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xe5, +0xe5,0x23,0x70,0x28,0x6c,0xff,0x80,0x1e,0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, 0x63, +0x59,0x45,0x0, 0x93,0x49,0x45,0x0, 0x65,0x59,0x45,0x0, 0x95,0x9, 0x75,0x0, 0x67, +0x19,0x75,0x0, 0x97,0xb, 0xf0,0xbc,0xcf,0x38,0xde,0xa1,0xe7,0x6c,0xdd,0x6c,0xff, +0x6c,0xee,0x7e,0x70,0x5, 0xac,0x7e,0x9, 0xa3,0x0, 0x97,0x7e,0x50,0x5, 0xac,0x5f, +0x9, 0xb2,0x0, 0x67,0xbc,0xba,0x78,0x16,0xbe,0xb0,0xff,0x68,0x11,0xbe,0xd0,0x2, +0x50,0x13,0x2e,0x34,0x0, 0x93,0x12,0x56,0x61,0x12,0x1, 0x19,0x80,0x7, 0xb, 0xe0, +0xbe,0xe0,0x2, 0x40,0xcd,0xbe,0xe0,0x2, 0x78,0xe, 0xbe,0xd0,0x2, 0x50,0x9, 0x12, +0x56,0x6d,0x12,0x56,0x61,0x12,0x1, 0x19,0xb, 0xd0,0xb, 0xf0,0xbe,0xf0,0x2, 0x78, +0xaf,0x6c,0xff,0x12,0x56,0x7f,0x2e,0x34,0x2, 0xb9,0x2e,0x14,0x0, 0x93,0x12,0x56, +0x77,0xbe,0xf0,0x2, 0x78,0xed,0x20,0x3, 0x6e,0x6c,0xff,0x80,0x66,0x7c,0xef,0x6c, +0xdd,0x80,0x21,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xa4,0x0, 0x97,0x7e,0x70,0x5, 0xac, +0x7d,0x9, 0xb3,0x0, 0x67,0xbc,0xba,0x78,0x9, 0xbe,0xa0,0xff,0x68,0x4, 0x7c,0xed, +0x80,0x6, 0xb, 0xd0,0xbc,0xcd,0x38,0xdb,0xbe,0xe0,0x2, 0x40,0x2, 0x7c,0xef,0x7e, +0x90,0x5, 0xac,0x9e,0x49,0x34,0x0, 0x65,0xbe,0x34,0x32,0x0, 0x50,0xa, 0x49,0x24, +0x0, 0x95,0xbe,0x24,0x32,0x0, 0x40,0x12,0x49,0x24,0x0, 0x63,0x74,0x5, 0xac,0xbf, +0x59,0x25,0x0, 0x93,0x59,0x35,0x0, 0x95,0x80,0x7, 0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0x0, 0xb, 0xf0,0xbc,0xcf,0x38,0x96,0x6c,0xff,0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, +0x93,0x12,0x0, 0xe, 0x59,0x45,0x0, 0x63,0x49,0x45,0x0, 0x95,0x12,0x0, 0xe, 0x59, +0x45,0x0, 0x65,0x9, 0x75,0x0, 0x97,0x19,0x75,0x0, 0x67,0xb, 0xf0,0xbe,0xf0,0x2, +0x78,0xd7,0xbe,0xc0,0x0, 0x38,0x2, 0xe1,0x26,0x6c,0xff,0x74,0x5, 0xac,0xbf,0x49, +0x45,0x0, 0x63,0x59,0x45,0x0, 0x89,0x49,0x45,0x0, 0x65,0x59,0x45,0x0, 0x8b,0x9, +0x75,0x0, 0x67,0x19,0x75,0x0, 0x8d,0xa, 0x37,0xbe,0x34,0x0, 0x2, 0x50,0xf, 0x49, +0x25,0x0, 0x8b,0xbe,0x24,0x3, 0x20,0x40,0x5, 0x6d,0x22,0x7a,0x25,0x55,0x7e,0x15, +0x55,0x4d,0x11,0x78,0x41,0xbe,0xf0,0x1, 0x78,0x7, 0x7d,0x21,0xb, 0x24,0x7a,0x25, +0x55,0xbe,0x34,0x0, 0x2, 0x40,0x2, 0xe1,0x1d,0x6c,0xee,0x7e,0x50,0x5, 0xac,0x5f, +0x49,0x42,0x0, 0x89,0x7e,0xf4,0x0, 0xc, 0xad,0xf3,0x7e,0x10,0x4, 0xac,0x1e,0x2d, +0xf, 0x59,0x40,0x4, 0xd7,0x49,0x22,0x0, 0x8b,0x59,0x20,0x4, 0xd9,0xb, 0xe0,0xbe, +0xe0,0x3, 0x78,0xd7,0xe1,0x1d,0xbe,0x34,0x0, 0x2, 0x50,0x74,0x74,0x5, 0xac,0xbf, +0x49,0x25,0x0, 0x89,0x7e,0x4, 0x0, 0x3, 0x8d,0x10,0x7d,0x50,0x3e,0x54,0x3e,0x54, +0x7e,0x14,0x0, 0xc, 0xad,0x13,0x2d,0x15,0x59,0x21,0x4, 0xd7,0x74,0x5, 0xac,0xbf, +0x49,0x25,0x0, 0x8b,0x59,0x21,0x4, 0xd9,0x6d,0x22,0x74,0x5, 0xac,0xbf,0x59,0x25, +0x0, 0x89,0x6c,0xee,0x12,0x56,0x5, 0x49,0x2, 0x4, 0xd7,0x7e,0x50,0x5, 0xac,0x5f, +0x2e,0x24,0x0, 0x89,0x12,0x55,0xf7,0x78,0xeb,0x12,0x56,0x48,0x6d,0x22,0x74,0x5, +0xac,0xbf,0x59,0x25,0x0, 0x8b,0x6c,0xee,0x12,0x56,0x5, 0x49,0x2, 0x4, 0xd9,0x7e, +0x50,0x5, 0xac,0x5f,0x2e,0x24,0x0, 0x8b,0x12,0x55,0xf7,0x78,0xeb,0x12,0x56,0x48, +0xbe,0xf0,0x1, 0x78,0x8, 0x7e,0x25,0x55,0xb, 0x24,0x7a,0x25,0x55,0xb, 0xf0,0xbe, +0xf0,0x2, 0x68,0x2, 0xc1,0x1b,0xd2,0x0, 0x6c,0xff,0x12,0x56,0x55,0x50,0x10,0xa, +0x37,0x9, 0xb3,0x0, 0xe0,0xb4,0x1, 0x7, 0x6d,0x33,0x7a,0x35,0x55,0x80,0x7, 0xb, +0xf0,0xbe,0xf0,0x2, 0x40,0xe4,0xda,0x3b,0x22,0x7e,0xb3,0x0, 0x9f,0x70,0x32,0x20, +0xd, 0x2f,0x6c,0xaa,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x4, +0xcb,0x59,0x43,0x4, 0xcd,0x6d,0x33,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x32,0x4, 0xd3, +0x7e,0x34,0x1, 0x0, 0x59,0x32,0x4, 0xc7,0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xd5,0xd2, +0xd, 0x22,0x32,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xca,0x3b,0x7c,0xf7,0x7c,0xeb,0x74,0x5, 0xac,0xbe,0x49,0x25,0x0, 0x95,0x12,0xa, +0x12,0x74,0x5, 0xac,0xbe,0x49,0x25,0x0, 0x93,0x12,0x0, 0x36,0x2d,0x36,0x7a,0x37, +0x2, 0xc3,0x74,0x5, 0xac,0xbe,0x9, 0x75,0x0, 0x97,0x7a,0x71,0x26,0xbe,0x70,0x2, +0x40,0x3, 0x75,0x26,0x0, 0x12,0x0, 0x1e,0x49,0x25,0x4, 0xcd,0x12,0xa, 0x12,0x12, +0x0, 0x1e,0x49,0x25,0x4, 0xcb,0x12,0x0, 0x36,0x7d,0xf3,0x2d,0xf6,0x7e,0x17,0x0, +0x86,0xbd,0x1f,0x38,0x9, 0x7e,0x4, 0x1, 0x0, 0x7a,0x5, 0x24,0x80,0x21,0x7e,0x37, +0x2, 0xc3,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x0, 0x92,0x7d,0xe3,0x7a, +0xe5,0x24,0xbe,0xe4,0x0, 0x10,0x50,0x7, 0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x24,0x7e, +0xe5,0x24,0xbe,0xe4,0x1, 0x0, 0x28,0x7, 0x7e,0xe4,0x1, 0x0, 0x7a,0xe5,0x24,0x7e, +0xa1,0x26,0x74,0x2, 0xa4,0x49,0x45,0x4, 0xd3,0xbd,0x4f,0x28,0x9, 0x49,0x45,0x4, +0xc7,0x7a,0x45,0x24,0x80,0x7, 0x7e,0x45,0x24,0x59,0x45,0x4, 0xc7,0x59,0xf5,0x4, +0xd3,0x74,0x5, 0xac,0xbe,0x49,0x25,0x0, 0x93,0x12,0x0, 0x36,0x12,0xf, 0xe4,0x7e, +0x90,0x5, 0xac,0x9e,0x49,0xe4,0x0, 0x93,0x74,0x5, 0xac,0xbf,0x49,0x35,0x0, 0x63, +0xbd,0x3e,0x7d,0x34,0x28,0xb, 0x2e,0x34,0x0, 0x93,0x2d,0xfe,0x1b,0x38,0xf0,0x80, +0x9, 0x2e,0x34,0x0, 0x93,0x9d,0xef,0x1b,0x38,0xe0,0x49,0x24,0x0, 0x95,0x49,0x35, +0x0, 0x65,0x9d,0x32,0x12,0x2, 0x9e,0x12,0xf, 0xe4,0x7e,0x30,0x5, 0xac,0x3e,0x49, +0x21,0x0, 0x95,0x7e,0x90,0x5, 0xac,0x9f,0x49,0x34,0x0, 0x65,0xbd,0x32,0x7d,0x51, +0x28,0xd, 0x2e,0x54,0x0, 0x95,0x7d,0x2, 0x2d,0xf, 0x1b,0x58,0x0, 0x80,0x9, 0x2e, +0x54,0x0, 0x95,0x9d,0x2f,0x1b,0x58,0x20,0x49,0x24,0x0, 0x63,0x12,0x0, 0x1e,0x59, +0x25,0x4, 0xcb,0x59,0x35,0x4, 0xcd,0xda,0x3b,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x3f, +0x38,0x2b,0x7d,0x5f,0x9e,0x54,0x0, 0x20,0x6d,0x44,0xbe,0x28,0x0, 0x1, 0x50,0x4, +0x9f,0x22,0x80,0x2, 0x1b,0x2c,0x12,0xa, 0x0, 0xbe,0x28,0x0, 0x15,0x28,0x2, 0x80, +0x5a,0xbe,0x28,0x0, 0x1, 0x50,0x64,0x7e,0x28,0x0, 0x1, 0x80,0x5e,0xbe,0xf4,0x1, +0xc0,0x40,0x2f,0x7d,0x5f,0x9e,0x54,0x1, 0xc0,0x6d,0x44,0xbe,0x28,0x0, 0x1f,0x28, +0x4, 0x7e,0x28,0x0, 0x1f,0x12,0xa, 0x0, 0xbe,0x28,0x0, 0x15,0x40,0x4, 0x7e,0x28, +0x0, 0x14,0xbe,0x28,0x0, 0x14,0x28,0x4, 0x7e,0x28,0x0, 0x14,0x2e,0x28,0x1, 0xcb, +0x80,0x29,0x7d,0x5f,0x9e,0x54,0x0, 0x3f,0x6d,0x44,0x7e,0x14,0x1, 0x24,0x12,0xa, +0x4, 0x2e,0x28,0x0, 0x15,0xbe,0x28,0x0, 0x15,0x50,0x6, 0x7e,0x28,0x0, 0x15,0x80, +0xa, 0xbe,0x28,0x1, 0xcb,0x28,0x4, 0x7e,0x28,0x1, 0xcb,0x7d,0x35,0x22,0xca,0x79, +0x12,0xf, 0x96,0xbe,0xf0,0x0, 0x28,0x25,0x6c,0xee,0x80,0x1d,0x1a,0x2e,0x7e,0x34, +0x0, 0x5, 0xad,0x32,0x49,0x33,0x0, 0x63,0x12,0x9, 0x3a,0x1a,0xe, 0x7e,0x14,0x0, +0x5, 0xad,0x10,0x59,0x31,0x0, 0x63,0xb, 0xe0,0xbc,0xfe,0x18,0xdf,0xda,0x79,0x22, +0x7e,0x14,0x1, 0x80,0x7f,0x12,0x12,0x0, 0x89,0x7f,0x21,0x7c,0xba,0x7c,0xa9,0xa, +0x48,0x22,0x74,0x5, 0xac,0xbf,0x49,0x35,0x0, 0x65,0x9d,0x32,0x12,0x2, 0x9e,0x7d, +0x63,0x22,0xca,0x3b,0xc2,0xb, 0x6c,0xee,0x7e,0xa0,0xff,0x7e,0x70,0x5, 0xac,0x7e, +0x19,0xa3,0x0, 0x67,0x7c,0x1e,0x2e,0x10,0x29,0x74,0xff,0xa5,0xf7,0x7e,0x24,0xff, +0xff,0x12,0xd, 0x16,0x1b,0x38,0x20,0x7c,0x1e,0x2e,0x10,0x2b,0xe4,0xa5,0xf7,0xb, +0xe0,0xbe,0xe0,0x2, 0x78,0xd2,0x7e,0xa3,0x0, 0x79,0x7c,0xba,0x54,0xf, 0x78,0x1f, +0x12,0xf, 0xc3,0x78,0x2, 0x61,0xcf,0x6c,0xee,0x12,0x3a,0x42,0xac,0x7e,0x59,0x43, +0x0, 0xe4,0x59,0x43,0x0, 0xe8,0xb, 0xe0,0xbe,0xe0,0x2, 0x78,0xec,0x61,0xcf,0x12, +0xf, 0xc3,0x78,0x21,0x6c,0xee,0x80,0x13,0x12,0xf, 0xcb,0xac,0xbe,0x12,0xf, 0xd7, +0x19,0xe3,0x0, 0x67,0x7c,0x1e,0x12,0xf, 0xa6,0xb, 0xe0,0x12,0xc, 0x28,0x12,0xd, +0x8, 0x40,0xe5,0x61,0xcf,0x6c,0xee,0x80,0x4d,0x6c,0xff,0x74,0x2, 0xac,0xbf,0x49, +0x25,0x0, 0xe8,0x74,0x5, 0xac,0xbe,0x12,0xa, 0x16,0x74,0x2, 0xac,0xbf,0x49,0x25, +0x0, 0xe4,0x74,0x5, 0xac,0xbe,0x12,0x0, 0x3a,0x2d,0x36,0x7a,0x35,0x23,0x7c,0xbe, +0x3e,0xb0,0x24,0x25,0xa, 0x2b,0xb, 0x28,0x30,0xbe,0x35,0x23,0x28,0xf, 0x7c,0x1e, +0x2e,0x10,0x29,0x7c,0xbf,0xa5,0xf7,0x7e,0x35,0x23,0x1b,0x28,0x30,0xb, 0xf0,0xbe, +0xf0,0x2, 0x78,0xb7,0xb, 0xe0,0x12,0xc, 0x28,0x12,0xd, 0x8, 0x40,0xab,0x6c,0xee, +0x80,0x6a,0xd2,0xb, 0x6c,0xff,0x80,0x2c,0xbc,0xfe,0x68,0x26,0x7c,0x1f,0x12,0xf, +0xae,0x7c,0x1e,0x2e,0x10,0x29,0xa5,0xe7,0xbc,0xba,0x78,0x16,0x7c,0xbf,0x12,0xd, +0x18,0xb, 0x38,0x20,0x12,0xd, 0x16,0xb, 0x38,0x30,0xbd,0x32,0x40,0x4, 0xc2,0xb, +0x80,0xa, 0xb, 0xf0,0x12,0xc, 0x28,0x12,0x1f,0xc8,0x40,0xcc,0x30,0xb, 0x2b,0x7c, +0x1e,0x12,0xf, 0xae,0xbe,0xa0,0x2, 0x50,0x21,0x7c,0x1a,0x12,0xf, 0xa6,0x7e,0x90, +0x5, 0xac,0x9e,0x19,0xa4,0x0, 0x67,0x49,0x34,0x0, 0x63,0x74,0x2, 0xa4,0x59,0x35, +0x0, 0xe4,0x49,0x34,0x0, 0x65,0x59,0x35,0x0, 0xe8,0xb, 0xe0,0x12,0xc, 0x28,0x12, +0xd, 0x8, 0x40,0x8e,0x6c,0xee,0x80,0x31,0x74,0x5, 0xac,0xbe,0x9, 0xb5,0x0, 0x67, +0xb4,0xff,0x24,0x6c,0xff,0x7c,0x1f,0x2e,0x10,0x2b,0xa5,0xe7,0x70,0x12,0x74,0x1, +0xa5,0xf7,0x12,0xf, 0xcb,0xac,0xbf,0x12,0xf, 0xd7,0x19,0xf3,0x0, 0x67,0x80,0x7, +0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xde,0xb, 0xe0,0x12,0xc, 0x28,0x12,0xd, 0x8, 0x40, +0xc7,0x6c,0xee,0x12,0xf, 0x9e,0x70,0x10,0x7e,0x34,0x7f,0xff,0x74,0x2, 0xac,0xbe, +0x59,0x35,0x0, 0xe4,0x59,0x35,0x0, 0xe8,0xb, 0xe0,0xbe,0xe0,0x2, 0x78,0xe4,0x12, +0xf, 0x96,0x6c,0xee,0x12,0xf, 0x9e,0xb4,0x1, 0x1b,0xa, 0x3e,0x9, 0xb3,0x0, 0xe2, +0xbe,0xb0,0x3, 0x68,0x3, 0xb4,0x1, 0x6, 0xe4,0x12,0xd, 0xf, 0x80,0x30,0x74,0x2, +0x12,0xd, 0xf, 0x80,0x29,0xa, 0x3e,0x9, 0xb3,0x0, 0xe2,0xbe,0xb0,0x2, 0x68,0x2, +0x70,0x17,0x74,0x1, 0x12,0xd, 0xf, 0xbe,0xf0,0x2, 0x50,0x12,0x7c,0xaf,0xb, 0xf0, +0x74,0x5, 0xa4,0x19,0xe5,0x0, 0x67,0x80,0x5, 0x74,0x3, 0x12,0xd, 0xf, 0xb, 0xe0, +0xbe,0xe0,0x2, 0x40,0xaf,0xda,0x3b,0x22,0x7e,0xb3,0x0, 0x79,0x54,0xf, 0x22,0x12, +0x21,0xc2,0x12,0x56,0x13,0x12,0x43,0xd4,0xe4,0x12,0x24,0x28,0x12,0x48,0x2e,0x12, +0x3a,0x1d,0x12,0x3c,0xb4,0x12,0x40,0x5a,0x12,0x26,0xed,0x12,0x4d,0x1d,0x7e,0xb3, +0x4, 0x99,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0x7, 0x30,0xe, 0x3, 0x12,0x3f,0xfc,0x12, +0x3f,0x6b,0x12,0x3e,0xea,0x12,0x27,0xc5,0x44,0x40,0x7a,0xb3,0x2, 0xb5,0x12,0x10, +0x5d,0x74,0x1, 0x12,0xd, 0x1f,0x12,0xd, 0x83,0x12,0x1f,0xf4,0x12,0x4b,0xf, 0xe4, +0x12,0xd, 0x1f,0x12,0xd, 0x83,0x12,0xf, 0x57,0x7e,0xb3,0x2, 0x5f,0x30,0xe1,0x3, +0x12,0x37,0xe, 0x12,0x4a,0x8d,0x12,0xc, 0x28,0x12,0x3a,0xe0,0x7e,0x34,0x0, 0xec, +0x7e,0x24,0x1, 0xc8,0x7e,0xb3,0x2, 0x62,0x14,0x12,0x45,0xbe,0x12,0x48,0xe8,0x12, +0x17,0xfc,0x12,0x55,0xc, 0x12,0x29,0x76,0x12,0x53,0x9, 0x12,0x9, 0xce,0x12,0x1c, +0x4b,0x12,0x37,0x8b,0x12,0xc, 0x28,0x7a,0xb3,0x0, 0x9f,0x7e,0x63,0x0, 0x9f,0x12, +0x4c,0x71,0x12,0xf, 0x75,0x12,0x15,0x2d,0x12,0xc, 0x28,0x7a,0xb3,0x0, 0x9f,0x12, +0xa, 0x22,0x12,0xd, 0xd8,0x12,0xc, 0x28,0x7a,0xb3,0x0, 0x9f,0x12,0x50,0xa0,0x12, +0x3, 0xfd,0x12,0x53,0xba,0x7e,0xb3,0x0, 0x83,0x12,0x38,0xd1,0x12,0x3a,0xfb,0x12, +0x40,0x24,0x12,0x52,0x6c,0x81,0x4e,0x22,0xa, 0x2b,0xa, 0x3e,0xbd,0x32,0x22,0xa, +0x3e,0x19,0xb3,0x0, 0xe0,0x22,0x7c,0xbe,0x3e,0xb0,0x24,0x25,0xa, 0x3b,0x22,0xca, +0x79,0x7c,0xfb,0x6c,0xee,0xa, 0x3e,0x12,0xf, 0xf4,0x4d,0x22,0x68,0x6, 0xbe,0x24, +0x0, 0x7, 0x78,0x29,0x4c,0xff,0x68,0xd, 0x7e,0x14,0x0, 0x14,0x12,0xd, 0x67,0x7e, +0x8, 0x0, 0xa, 0x80,0xb, 0x7e,0x14,0x0, 0xa, 0x12,0xd, 0x67,0x7e,0x8, 0x0, 0x14, +0x49,0x3f,0x0, 0x2, 0xb, 0xf8,0x20,0x12,0x0, 0xe5,0x12,0xd, 0x7b,0xb, 0xe0,0xbe, +0xe0,0x20,0x40,0xc1,0xda,0x79,0x22,0x74,0x4, 0xac,0xbe,0x7d,0xf5,0x2e,0xf4,0x0, +0xec,0x49,0x3f,0x0, 0x2, 0xb, 0xf8,0x20,0x12,0x0, 0x89,0x59,0x3f,0x0, 0x2, 0x1b, +0xf8,0x20,0x22,0x9f,0x11,0x7a,0x1f,0x1, 0xc4,0x6c,0xaa,0x9f,0x11,0x7e,0x30,0x4, +0xac,0x3a,0x59,0x31,0x1, 0x7e,0x59,0x21,0x1, 0x7c,0x49,0xf1,0x0, 0xee,0x49,0xe1, +0x0, 0xec,0xbe,0x78,0x0, 0x32,0x8, 0x3, 0x12,0xf, 0x7f,0x49,0xf1,0x1, 0x2e,0x49, +0xe1,0x1, 0x2c,0xbe,0x78,0x0, 0x32,0x8, 0x3, 0x12,0xf, 0x7f,0x49,0x31,0x1, 0x7e, +0x49,0x21,0x1, 0x7c,0x7e,0x7f,0x1, 0xc4,0xbf,0x17,0x8, 0x4, 0x7a,0x1f,0x1, 0xc4, +0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xb4,0x22,0xca,0x3b,0x6d,0x0, 0x12,0xc, 0x28,0x7c, +0xeb,0x78,0x30,0x6c,0xff,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x59,0x15,0x5, 0x42,0x7e, +0xa0,0xff,0x7e,0x30,0x5, 0xac,0x3f,0x19,0xa1,0x5, 0x3c,0x7e,0xb3,0x5, 0x4d,0x70, +0x3, 0xe4,0x80,0x2, 0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x5, 0x4b,0xb, 0xf0,0xbe,0xf0, +0x2, 0x78,0xd2,0x6c,0xff,0xe1,0x28,0x74,0x5, 0xac,0xbf,0x9, 0x75,0x0, 0x67,0x7a, +0x71,0x24,0xbe,0x70,0x2, 0x40,0x2, 0xe1,0x26,0xe5,0x24,0xa, 0x1b,0x9, 0xb1,0x0, +0xe0,0xbe,0xb0,0x1, 0x78,0x2, 0xe1,0x26,0x75,0x23,0x0, 0x7e,0x31,0x23,0x74,0x5, +0xac,0x3b,0x9, 0x71,0x5, 0x3c,0x7a,0x71,0x25,0xbe,0x71,0x24,0x68,0x2, 0xe1,0x1b, +0x49,0x21,0x5, 0x3a,0x12,0xa, 0x12,0x12,0x56,0x20,0x49,0x25,0x5, 0x38,0x12,0x0, +0x36,0x7d,0x3, 0x2d,0x6, 0xe5,0x25,0xa, 0x1b,0x9, 0xa1,0x5, 0x4b,0xbe,0xa0,0x0, +0x28,0x17,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x5, 0x42,0x2e,0x14,0x5, +0x4b,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xe1,0x26,0x7e,0x31,0x25,0x74,0x2, 0xac,0x3b, +0x49,0x31,0x5, 0x42,0xbe,0x34,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, 0x32,0x28,0x2, +0x80,0x10,0x7d,0x23,0x2e,0x24,0x0, 0x32,0xbd,0x20,0x50,0x12,0xbe,0x34,0x0, 0x32, +0x28,0xc, 0x59,0x1, 0x5, 0x42,0x74,0x1, 0x7a,0xb3,0x5, 0x4d,0x80,0x68,0xbe,0x4, +0x0, 0xc8,0x28,0x4b,0xe4,0x7a,0xb3,0x5, 0x4d,0xe5,0x24,0xa, 0x1b,0x9, 0xb1,0x0, +0xe0,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0x0, 0xe0,0x12,0x56,0x6d, +0x7e,0x14,0x5, 0x46,0x74,0x5, 0x12,0x1, 0x19,0xbe,0xe0,0x0, 0x28,0x21,0x1b,0xe0, +0x7e,0x70,0x5, 0xac,0x7e,0x2e,0x34,0x0, 0x63,0x7e,0x30,0x5, 0xac,0x3f,0x12,0xf, +0xb6,0x7e,0x34,0x5, 0x46,0x7e,0x30,0x5, 0xac,0x3e,0x12,0xf, 0xb6,0x1b,0xf0,0x7e, +0xa1,0x25,0x74,0x2, 0xa4,0x59,0x5, 0x5, 0x42,0x80,0xb, 0x5, 0x23,0xe5,0x23,0xbe, +0xb0,0x2, 0x50,0x2, 0xc1,0x3b,0xb, 0xf0,0x7e,0x73,0x0, 0x79,0x7c,0xb7,0x54,0xf, +0xa, 0x2b,0xa, 0x1f,0xbd,0x12,0x50,0x2, 0xc1,0x17,0x7c,0x6e,0x12,0xf, 0x72,0x6c, +0xff,0x12,0x56,0x7f,0x2e,0x34,0x0, 0x63,0x2e,0x14,0x5, 0x38,0x12,0x56,0x77,0xbe, +0xf0,0x2, 0x40,0xed,0xda,0x3b,0x22,0x12,0xc, 0x28,0x68,0xd, 0x7e,0x34,0x2, 0x3a, +0x7e,0xb3,0x0, 0x5f,0x6c,0x55,0x2, 0x49,0xed,0x22,0x7e,0x73,0x0, 0x79,0x7c,0x67, +0xb, 0x60,0x5e,0x60,0xf, 0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x73,0x0, 0x79,0x22,0x7d, +0x1, 0x2e,0x4, 0x1, 0x7c,0x49,0x30,0x0, 0x2, 0xb, 0x8, 0x20,0x2f,0x17,0x59,0x30, +0x0, 0x2, 0x1b,0x8, 0x20,0x22,0x7e,0xf3,0x0, 0x79,0x5e,0xf0,0xf, 0x22,0x7c,0x1e, +0x2e,0x10,0x2b,0xa5,0xe7,0x22,0x2e,0x10,0x2b,0x74,0x1, 0xa5,0xf7,0x22,0x2e,0x10, +0x29,0xa5,0xe7,0x7c,0xab,0x22,0x2e,0x14,0x0, 0x63,0x74,0x5, 0x2, 0x1, 0x19,0x7e, +0xa3,0x0, 0x79,0x7c,0xba,0xc4,0x54,0xf, 0x54,0xf, 0x22,0x7e,0x70,0x5, 0xac,0x7e, +0x49,0x23,0x0, 0x63,0x74,0x2, 0x22,0x59,0x25,0x0, 0xe4,0x49,0x23,0x0, 0x65,0x59, +0x25,0x0, 0xe8,0x22,0x7d,0xf3,0x7e,0x35,0x24,0xad,0x3f,0x7c,0x76,0x7c,0x65,0xa, +0x24,0x7d,0xf3,0x22,0x7e,0x24,0x0, 0x8, 0x2, 0x0, 0x46,0xca,0xf8,0x7e,0xa3,0x2, +0xb5,0x7c,0xba,0xc4,0x13,0x13,0x54,0x3, 0x7c,0xfb,0x5e,0xf0,0x1, 0x7c,0xba,0x12, +0x27,0xd4,0x12,0x10,0x5d,0x6c,0xaa,0x80,0x1e,0x7e,0x90,0x4, 0xac,0x9a,0x49,0x34, +0x0, 0xee,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x32,0x1, 0xc8,0x9f,0x11,0x59,0x34,0x0, +0xee,0x59,0x24,0x0, 0xec,0xb, 0xa0,0x7e,0xb3,0x2, 0x62,0xbc,0xba,0x38,0xda,0x7c, +0x6f,0x5e,0x60,0x1, 0x7c,0xb6,0xc4,0x33,0x33,0x54,0xc0,0x7c,0x6b,0x7e,0x73,0x2, +0xb5,0x5e,0x70,0xbf,0x4c,0x76,0x7a,0x73,0x2, 0xb5,0xda,0xf8,0x22,0xca,0x3b,0x12, +0x0, 0x2e,0x70,0x14,0x6c,0xff,0x80,0x9, 0x7e,0x18,0x30,0x39,0x12,0x17,0x4e,0xb, +0xf0,0x12,0x13,0xcf,0x38,0xf2,0x61,0xcc,0x7e,0xb3,0x2, 0xad,0x30,0xe1,0x5, 0x75, +0x29,0x2, 0x80,0x3, 0x75,0x29,0x1, 0x7e,0xa3,0x2, 0xb5,0x7c,0xba,0x30,0xe7,0xe, +0x7e,0xb3,0x2, 0x5f,0x30,0xe0,0x7, 0x7e,0x35,0x58,0x4d,0x33,0x78,0xe, 0x7e,0xb3, +0x2, 0x5f,0x20,0xe0,0x2, 0x41,0x54,0x20,0xe2,0x2, 0x41,0x54,0x7c,0xba,0x30,0xe7, +0x8, 0x7e,0xb3,0x2, 0x38,0xf5,0x2a,0x80,0x6, 0x7e,0xb3,0x2, 0x39,0xf5,0x2a,0x7e, +0x35,0x58,0xbe,0x34,0x0, 0x0, 0x28,0x5, 0x1b,0x34,0x7a,0x35,0x58,0x7e,0xb3,0x2, +0x5f,0x30,0xe5,0xb, 0x80,0x4, 0xe4,0x12,0x17,0x5b,0x12,0x17,0x47,0x50,0xf7,0x53, +0xe1,0xfd,0x43,0xe1,0x2, 0x53,0xe3,0x1f,0x6c,0xff,0x9f,0x11,0x12,0x17,0x4e,0xb, +0xf0,0xbe,0xf0,0x24,0x78,0xf6,0x6c,0xdd,0x21,0xff,0x75,0x28,0x0, 0x80,0x7d,0xe5, +0x28,0x70,0x1c,0x53,0xe7,0xbf,0x6c,0xff,0x9f,0x11,0x74,0x4, 0xac,0xbf,0x59,0x35, +0x3, 0x3, 0x59,0x25,0x3, 0x1, 0xb, 0xf0,0xbe,0xf0,0x24,0x78,0xed,0x80,0x3, 0x43, +0xe7,0x40,0x7e,0xb3,0x2, 0xad,0x54,0x1, 0x6c,0x77,0x12,0x17,0xc3,0x80,0x4, 0xe4, +0x12,0x17,0x5b,0x12,0x17,0x47,0x50,0xf7,0x7e,0xb3,0x2, 0xaf,0x30,0xe7,0xc, 0x6c, +0xff,0x7e,0xc1,0xe2,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xf6,0x6c,0xff,0x80,0x26,0x12, +0x13,0xf0,0x7e,0x7d,0x24,0x7e,0x30,0x4, 0xac,0x3e,0x2e,0x14,0x3, 0x1, 0x12,0x13, +0xe8,0x12,0x13,0xd6,0x7e,0xb3,0x2, 0xad,0x20,0xe1,0x8, 0x12,0x13,0xe8,0x2f,0x11, +0x12,0x13,0xd8,0xb, 0xf0,0x12,0x13,0xcf,0x38,0xd5,0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x28,0x28,0x2, 0x1, 0xff,0x6c,0xff,0x80,0x6f,0x12,0x14,0xa, 0x7e,0xb3,0x2, 0xb5, +0x30,0xe6,0x2e,0x74,0x4, 0xac,0xbe,0x49,0x35,0x3, 0x3, 0x7a,0x37,0x3, 0x91,0x74, +0x2, 0xac,0xbe,0x49,0x25,0x1, 0xc8,0x1e,0x24,0x1e,0x24,0x9d,0x32,0x7a,0x37,0x3, +0x91,0x7e,0x37,0x2, 0x12,0xe, 0x34,0xe, 0x34,0xbe,0x37,0x3, 0x91,0x8, 0x21,0x80, +0x1c,0x74,0x4, 0xac,0xbe,0x49,0x15,0x3, 0x3, 0x49,0x5, 0x3, 0x1, 0x7e,0x37,0x2, +0x14,0xe, 0x34,0xe, 0x34,0x1a,0x26,0x1a,0x24,0xbf,0x10,0x8, 0x3, 0x12,0x56,0x87, +0x74,0x4, 0xac,0xbe,0x49,0x35,0x3, 0x3, 0x49,0x25,0x3, 0x1, 0x12,0x17,0x7c,0xbf, +0x10,0x8, 0x3, 0x12,0x17,0x52,0xb, 0xf0,0x12,0x13,0xcf,0x38,0x8c,0xb, 0xd0,0xe5, +0x2a,0xbc,0xbd,0x28,0x2, 0x1, 0xfa,0x7e,0xb3,0x2, 0xb5,0x30,0xe7,0x34,0x6c,0xff, +0x80,0x2b,0x12,0x14,0xa, 0x12,0x17,0x8e,0x12,0x13,0xe8,0x2f,0x11,0x2f,0x11,0x12, +0x13,0xd8,0x7e,0xb3,0x2, 0xb5,0x30,0xe6,0x12,0x74,0x2, 0xac,0xbe,0x49,0x55,0x1, +0xc8,0x6d,0x44,0x12,0x13,0xe8,0x9f,0x12,0x12,0x13,0xd8,0xb, 0xf0,0x12,0x13,0xcf, +0x38,0xd0,0x53,0xe1,0xfd,0x12,0x27,0xdb,0x53,0xe3,0x1f,0x12,0x17,0xa7,0x7c,0xb7, +0x42,0xe3,0x61,0xcc,0x7e,0xb3,0x2, 0xad,0x20,0xe0,0x2, 0x61,0x13,0x6c,0xff,0x9f, +0x11,0x12,0x17,0x4e,0xb, 0xf0,0xbe,0xf0,0x24,0x78,0xf6,0x6c,0xdd,0x61,0xb, 0x7e, +0xb3,0x2, 0x5f,0x30,0xe5,0x5, 0x12,0x17,0x47,0x50,0x1a,0x4c,0xdd,0x78,0x5, 0x53, +0xe7,0xbf,0x80,0x3, 0x43,0xe7,0x40,0x74,0x2, 0x12,0x17,0xee,0x12,0x17,0xba,0x80, +0x4, 0xe4,0x12,0x17,0x5b,0x12,0x17,0x47,0x50,0xf7,0xe4,0x12,0x17,0xee,0x7e,0xb3, +0x2, 0xaf,0x30,0xe7,0xc, 0x6c,0xff,0x7e,0xc1,0xe2,0xb, 0xf0,0xbe,0xf0,0x4, 0x78, +0xf6,0x6c,0xff,0x80,0x38,0x12,0x13,0xf0,0x7e,0xb3,0x2, 0xb5,0x30,0xe7,0x20,0x7e, +0xa3,0x2, 0xad,0x12,0x17,0x75,0xbe,0xb0,0x3, 0x40,0x14,0x7c,0xba,0x30,0xe1,0xf, +0x7e,0x1d,0x24,0x1e,0x34,0xe, 0x24,0x50,0x3, 0x4e,0x60,0x80,0x7a,0x1d,0x24,0x7e, +0x7d,0x24,0x12,0x17,0x8e,0x12,0x13,0xe8,0x12,0x13,0xd6,0xb, 0xf0,0x12,0x13,0xcf, +0x38,0xc3,0x7e,0xb3,0x2, 0x5f,0x30,0xe5,0x10,0xbe,0xd0,0x1, 0x78,0x5, 0x53,0xe7, +0xbf,0x80,0x3, 0x43,0xe7,0x40,0x12,0x17,0xba,0xb, 0xd0,0xe5,0x29,0xbc,0xbd,0x28, +0x2, 0x41,0x6f,0x6c,0xff,0x61,0xc5,0x12,0x14,0xa, 0x7e,0xb3,0x2, 0xb5,0x30,0xe7, +0x54,0x7e,0xa3,0x2, 0xad,0x7c,0xba,0x30,0xe1,0x26,0x12,0x17,0x75,0xbe,0xb0,0x1, +0x38,0x1e,0xa, 0xb, 0x7e,0x14,0x0, 0x2, 0x9d,0x10,0x7e,0x90,0x4, 0xac,0x9e,0x12, +0x1f,0xe8,0x7c,0xb3,0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x17,0xf4,0x80,0x25, +0x7c,0xba,0x20,0xe1,0x20,0x12,0x17,0x75,0xbe,0xb0,0x2, 0x38,0x18,0xa, 0x4b,0x7e, +0x54,0x0, 0x3, 0x9d,0x54,0x12,0x17,0x8e,0x12,0x13,0xe8,0x60,0x5, 0x2f,0x11,0x14, +0x78,0xfb,0x12,0x13,0xd8,0x7e,0xb3,0x2, 0xb5,0x30,0xe6,0x2d,0x74,0x2, 0xac,0xbe, +0x49,0x15,0x1, 0xc8,0x6d,0x0, 0x74,0x4, 0xac,0xbe,0x7d,0x45,0x12,0x1f,0xe8,0x9f, +0x10,0x12,0x17,0xf4,0x12,0x17,0x7c,0x7e,0x37,0x2, 0x12,0x12,0x17,0xa0,0x58,0x23, +0x7e,0xb3,0x2, 0x5f,0x30,0xe0,0x1c,0x80,0x17,0x74,0x4, 0xac,0xbe,0x12,0x17,0x7c, +0x7e,0x37,0x2, 0x14,0x12,0x17,0xa0,0x58,0xa, 0x7e,0xb3,0x2, 0x5f,0x30,0xe0,0x3, +0x12,0x56,0x87,0xb, 0xf0,0x12,0x13,0xcf,0x28,0x2, 0x61,0x17,0xda,0x3b,0x22,0x7e, +0x73,0x2, 0x62,0xbc,0x7f,0x22,0x2f,0x17,0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x22, +0x7e,0x30,0x4, 0xac,0x23,0x2e,0x15,0x51,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x22, +0xe5,0xe2,0xa, 0x3b,0x6d,0x22,0x7a,0x1d,0x24,0x7e,0xc1,0xe2,0x7c,0x2c,0x6c,0x33, +0x6d,0x0, 0x7e,0x1d,0x24,0x2f,0x10,0x7a,0x1d,0x24,0xa, 0x3f,0x9, 0xe3,0x2, 0x87, +0x22,0xca,0x79,0x53,0xe1,0xf, 0x7e,0xa3,0x2, 0xb5,0x12,0x26,0xe2,0x12,0x17,0xb1, +0x7c,0xb7,0x42,0xe1,0x7c,0xba,0x30,0xe2,0x54,0x7c,0xba,0xc4,0x23,0x7c,0xab,0x5e, +0xa0,0x7, 0x78,0x5, 0x7e,0xe0,0x4, 0x80,0x3b,0xbe,0xa0,0x1, 0x78,0x11,0x7e,0xb3, +0x2, 0xad,0x30,0xe1,0x5, 0x7e,0xe0,0x2, 0x80,0x2a,0x7e,0xe0,0x5, 0x80,0x25,0xbe, +0xa0,0x3, 0x78,0x11,0x7e,0xb3,0x2, 0xad,0x30,0xe1,0x5, 0x7e,0xe0,0x7, 0x80,0x14, +0x7e,0xe0,0x6, 0x80,0xf, 0x7e,0xb3,0x2, 0xad,0x30,0xe1,0x5, 0x7e,0xe0,0x3, 0x80, +0x3, 0x7e,0xe0,0x1, 0xa, 0x3e,0x12,0x17,0xaf,0x7c,0xb7,0x42,0xe1,0x7e,0xb3,0x2, +0xaf,0x30,0xe7,0xa, 0x74,0x7, 0x7e,0x73,0x2, 0x60,0xb, 0x71,0x80,0x6, 0x74,0x7, +0x7e,0x73,0x2, 0x60,0x12,0x0, 0x25,0x74,0x8, 0x7e,0x73,0x2, 0x61,0x12,0x0, 0x25, +0x74,0x9, 0x6c,0x77,0x12,0x0, 0x25,0x7e,0xb3,0x2, 0xaf,0x30,0xe7,0x46,0x74,0x2f, +0x7e,0x73,0x2, 0xab,0x12,0x0, 0x25,0x74,0x30,0x7e,0x73,0x2, 0xac,0x12,0x0, 0x25, +0x7e,0xf0,0x2, 0x80,0xf, 0x7c,0xbf,0x24,0x2f,0xa, 0x3f,0x9, 0x73,0x2, 0x61,0x12, +0x0, 0x25,0xb, 0xf0,0x7e,0x73,0x2, 0x62,0xa, 0x17,0xb, 0x15,0xa, 0x2f,0xbd,0x21, +0x48,0xe3,0xa, 0x37,0xb, 0x35,0x7c,0xf7,0x80,0x3, 0x12,0x56,0x27,0xbe,0xf0,0x24, +0x40,0xf8,0x80,0x24,0x6c,0xff,0x80,0xf, 0x7c,0xbf,0x24,0x2f,0xa, 0x3f,0x9, 0x73, +0x2, 0x63,0x12,0x0, 0x25,0xb, 0xf0,0x12,0x13,0xcf,0x38,0xec,0x7c,0xf7,0x80,0x3, +0x12,0x56,0x27,0xbe,0xf0,0x24,0x40,0xf8,0x74,0x56,0x7e,0x73,0x2, 0xb1,0x12,0x0, +0x25,0x74,0x57,0x7e,0x73,0x2, 0xb2,0x12,0x0, 0x25,0xda,0x79,0x22,0xc2,0xb, 0x7e, +0xb3,0x0, 0x7a,0x54,0xf, 0x78,0x5, 0xf5,0x14,0xc2,0x4, 0x22,0x20,0x4, 0x2, 0xc1, +0x6f,0x12,0xf, 0xbf,0x68,0x2, 0xc1,0x6f,0x7c,0xba,0x54,0xf, 0xb4,0x1, 0x2, 0x80, +0x2, 0xc1,0x6f,0xe5,0x14,0xbe,0xb0,0x3, 0x40,0x2, 0xc1,0x6f,0x7e,0x37,0x0, 0x63, +0x7e,0x51,0x14,0x3e,0x50,0x3e,0x50,0x7c,0xb5,0x24,0x8, 0xa, 0xb, 0x1b,0x8, 0x30, +0x7e,0x7, 0x0, 0x65,0x7c,0xb5,0x24,0xa, 0xa, 0x2b,0x1b,0x28,0x0, 0x5, 0x14,0xe5, +0x14,0xbe,0xb0,0x3, 0x50,0x5, 0x7c,0xba,0x2, 0x37,0x12,0xe5,0x14,0xb4,0x3, 0x2, +0x80,0x2, 0xc1,0x6f,0x7a,0x35,0x23,0x7a,0x5, 0x25,0x7e,0x5, 0xa, 0x7d,0x30,0xb, +0x36,0xbe,0x35,0xe, 0x50,0x4d,0x7e,0x35,0xe, 0xb, 0x36,0xbe,0x35,0x12,0x50,0x43, +0xbe,0x4, 0x0, 0x3c,0x50,0x3d,0x7e,0x35,0x10,0xbe,0x35,0xc, 0x78,0x5, 0x7e,0x15, +0xc, 0x80,0x19,0x7e,0x25,0x10,0x9e,0x25,0xc, 0x7e,0x35,0xe, 0xad,0x32,0x7e,0x25, +0x12,0x9e,0x25,0xe, 0x12,0x0, 0x46,0x7e,0x15,0xc, 0x9d,0x13,0xbe,0x14,0x0, 0x0, +0x8, 0x6d,0xbe,0x14,0x1, 0xe0,0x58,0x67,0xd2,0xb, 0x7a,0x15,0x23,0x7e,0x34,0x0, +0x1, 0x80,0x59,0x7e,0x35,0xe, 0xb, 0x36,0xbe,0x35,0xa, 0x50,0x52,0x7e,0x35,0x12, +0xb, 0x36,0xbe,0x35,0xe, 0x50,0x48,0xbe,0x4, 0x2, 0xe4,0x28,0x42,0x7e,0x35,0x10, +0xbe,0x35,0xc, 0x78,0x5, 0x7e,0x15,0xc, 0x80,0x1d,0x7e,0x25,0xc, 0x9e,0x25,0x10, +0x7e,0x34,0x3, 0x1f,0x9e,0x35,0xe, 0xad,0x32,0x7e,0x25,0xe, 0x9e,0x25,0x12,0x12, +0x0, 0x46,0x7d,0x13,0x2e,0x15,0xc, 0xbe,0x14,0x0, 0x0, 0x8, 0x12,0xbe,0x14,0x1, +0xe0,0x58,0xc, 0xd2,0xb, 0x7a,0x15,0x23,0x7e,0x34,0x3, 0x1f,0x7a,0x35,0x25,0x30, +0xb, 0x10,0x7e,0x35,0x23,0x7a,0x37,0x0, 0x63,0x7e,0x35,0x25,0x7a,0x37,0x0, 0x65, +0x80,0xb, 0x7e,0x35,0x8, 0x7a,0x37,0x0, 0x63,0x7a,0x7, 0x0, 0x65,0xc2,0x4, 0x22, +0x12,0x19,0xb9,0x7e,0x23,0x2, 0xcd,0x12,0x13,0xe0,0x7a,0x1f,0x2, 0xd1,0x7e,0x23, +0x2, 0xce,0x12,0x13,0xe0,0x7a,0x1f,0x2, 0xd5,0x7e,0x23,0x2, 0xcf,0x12,0x13,0xe0, +0x7a,0x1f,0x2, 0xd9,0x7e,0x23,0x2, 0xd0,0x12,0x13,0xe0,0x7a,0x1f,0x2, 0xdd,0x7e, +0x1f,0x2, 0xd1,0x7e,0xa0,0x1, 0x7e,0x90,0x4, 0xac,0x9a,0x49,0x14,0x2, 0xd3,0x49, +0x4, 0x2, 0xd1,0xbf,0x10,0x58,0x2, 0x7f,0x10,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xe6, +0x22,0x7d,0x12,0x7d,0x43,0x6d,0x0, 0xd2,0xb, 0xa, 0x3b,0x7e,0x24,0x0, 0x10,0x12, +0x0, 0x46,0xbe,0x24,0x0, 0x8, 0x48,0x2, 0xc2,0xb, 0xbe,0x44,0x0, 0x20,0x40,0x3e, +0xbe,0x44,0x0, 0x3e,0x50,0x38,0x7e,0x4, 0x0, 0x3e,0x9d,0x4, 0x1b,0x4, 0x2e,0x4, +0x2, 0x64,0x12,0x17,0x85,0x1a,0xb, 0x30,0xb, 0xf, 0x12,0x13,0xe8,0xbe,0x18,0x0, +0x8c,0x48,0x36,0xbe,0x18,0x1, 0xe, 0x80,0x30,0x12,0x13,0xe8,0xbe,0x18,0x0, 0x8c, +0x48,0x27,0xbe,0x18,0x0, 0xfa,0x8, 0x21,0x3e,0x4, 0x3e,0x4, 0x80,0x1b,0xbe,0x44, +0x1, 0xc2,0x28,0x15,0xbe,0x44,0x1, 0xe0,0x38,0xf, 0x7d,0x4, 0x9e,0x4, 0x1, 0xc3, +0x2e,0x4, 0x2, 0x46,0x12,0x17,0x85,0x1a,0xb, 0x7d,0x50,0x1a,0x4a,0x1a,0x48,0x12, +0x13,0xe8,0x2f,0x12,0x2, 0x13,0xd8,0x30,0x9, 0x2, 0xd3,0x22,0xc3,0x22,0x74,0x4, +0xac,0xbf,0x59,0x35,0x0, 0xee,0x59,0x25,0x0, 0xec,0x22,0x70,0x5, 0x43,0x87,0x1, +0x80,0xe, 0xb4,0x1, 0x5, 0x43,0x87,0x2, 0x80,0x6, 0xb4,0x2, 0x7, 0x43,0x87,0x2, +0x0, 0x0, 0x0, 0x0, 0x22,0x7c,0xba,0xc4,0x3, 0x54,0x7, 0x22,0x49,0x15,0x0, 0xee, +0x49,0x5, 0x0, 0xec,0x22,0x7a,0x11,0x82,0x7a,0x1, 0x83,0xe4,0x93,0x22,0x7e,0x30, +0x4, 0xac,0x3e,0x2e,0x14,0x0, 0xec,0x22,0x1a,0x37,0x1a,0x26,0x2f,0x1, 0x7d,0x3e, +0x1a,0x26,0x1a,0x24,0xbf,0x1, 0x22,0x7c,0xba,0xc4,0x3, 0x54,0x7, 0xa, 0x3b,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0xb3,0x2, 0xad,0x54,0x1, +0x7e,0x70,0x1, 0xca,0xf8,0x7c,0xfb,0x4c,0x77,0x68,0xf, 0xc2,0xaf,0x43,0xe1,0x1, +0x7e,0x37,0x2, 0x30,0x99,0x34,0xd2,0xaf,0x80,0x3, 0x43,0xe1,0x1, 0xc2,0x9, 0x2e, +0xf0,0xff,0x92,0xa, 0xd2,0xae,0xa9,0xd6,0xb7,0xc2,0xbe,0xda,0xf8,0x22,0x7e,0x37, +0x2, 0x32,0x89,0x34,0x59,0x34,0x0, 0x2, 0x1b,0x48,0x20,0x22,0x12,0x1e,0x5d,0x30, +0x10,0x6, 0x7e,0x34,0x1, 0x2c,0x80,0x4, 0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x2, 0x26, +0x12,0x1a,0x93,0x12,0x19,0x43,0x2, 0x18,0x19,0xca,0xd8,0xca,0x79,0x6c,0xff,0x7e, +0x35,0x53,0x9, 0x73,0x0, 0x1a,0x5e,0x70,0xf, 0x7e,0x63,0x4, 0x17,0xbe,0x60,0x1, +0x28,0x53,0xbe,0x73,0x4, 0x17,0x50,0x4d,0x30,0x10,0x4a,0x6c,0xee,0x80,0x3b,0x7e, +0x70,0x7, 0xac,0x7e,0x9, 0xb3,0x4, 0x39,0x30,0xe1,0x2d,0x30,0xe0,0x4, 0xb, 0xf0, +0x80,0x26,0xbe,0xf0,0x0, 0x28,0x21,0x9, 0xd3,0x4, 0x38,0x7c,0xbd,0x12,0x18,0x8a, +0x60,0x16,0x7c,0xbd,0x7e,0x73,0x4, 0x16,0x12,0x18,0xdf,0x7c,0x6b,0x5e,0x60,0x1, +0x7e,0x50,0x7, 0xac,0x5e,0x12,0x1e,0x4d,0xb, 0xe0,0x7e,0x73,0x4, 0x17,0xbc,0x7e, +0x38,0xbd,0x12,0x1b,0x85,0xda,0x79,0xda,0xd8,0x22,0x12,0x19,0xb9,0x7e,0xb3,0x2, +0xce,0x12,0x18,0xad,0x78,0x12,0x7e,0xb3,0x2, 0xcf,0x12,0x18,0xad,0x78,0x9, 0x7e, +0xb3,0x2, 0xd0,0x12,0x18,0xad,0x68,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x12,0x18,0xb5, +0xa, 0x3b,0x4d,0x33,0x22,0x7c,0xab,0x6c,0x77,0x80,0x11,0xa, 0x27,0x2e,0x25,0x53, +0x7e,0x29,0x60,0xbc,0x6a,0x78,0x3, 0x74,0x1, 0x22,0xb, 0x70,0x7e,0x25,0x53,0x9, +0xb2,0x0, 0x1a,0x54,0xf, 0xa, 0x1b,0xa, 0x27,0xbd,0x21,0x48,0xde,0xe4,0x22,0xca, +0x79,0x7c,0xe7,0x7c,0xfb,0x7a,0xf3,0x2, 0xb9,0x7e,0x34,0x2, 0xb9,0x12,0x19,0xc1, +0x7c,0xbf,0x12,0x16,0x70,0x7e,0xa3,0x2, 0xb9,0x74,0x4, 0xa4,0x2e,0x55,0x51,0x49, +0x15,0x0, 0x2, 0xb, 0x58,0x0, 0x7a,0xf, 0x2, 0xbd,0xbf,0x1, 0x78,0x3, 0xe4,0x80, +0x28,0x12,0x1e,0x46,0xa, 0x1e,0x6d,0x0, 0x12,0x0, 0x78,0x7f,0x1, 0x12,0x19,0x3c, +0x8, 0x16,0x7e,0x17,0x4, 0x29,0x6d,0x0, 0x12,0x19,0x3c,0x8, 0xb, 0x7c,0xbf,0x12, +0x18,0x8a,0x60,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xda,0x79,0x22,0x7e,0x1f,0x2, 0xbd, +0xbf,0x10,0x22,0xca,0xd8,0xca,0x79,0x12,0xc, 0x28,0x68,0x68,0x7e,0xb3,0x4, 0x4f, +0x60,0x62,0x6c,0xff,0x80,0x53,0x7e,0x30,0x7, 0xac,0x3f,0x9, 0xb1,0x4, 0x39,0x30, +0xe0,0x45,0x9, 0xe1,0x4, 0x38,0x9, 0xd1,0x4, 0x37,0x49,0x31,0x4, 0x35,0x49,0x21, +0x4, 0x33,0x7a,0x1f,0x2, 0xbd,0x7c,0xbe,0x7e,0x70,0x10,0x12,0x1b,0xc2,0x7a,0x1f, +0x2, 0xb9,0xbe,0xd0,0x8, 0x50,0x20,0x7e,0xf, 0x2, 0xb9,0x2e,0x8, 0x3, 0xe8,0x12, +0x19,0x3c,0x58,0x13,0xbe,0x18,0xb, 0xb8,0x58,0xd, 0x7e,0x70,0x7, 0xac,0x7f,0x12, +0x1f,0xcf,0x54,0xfe,0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0x4, 0x17,0xbc,0x7f,0x38, +0xa5,0x12,0x1b,0x85,0xda,0x79,0xda,0xd8,0x22,0x7a,0xb3,0x2, 0xcd,0x7e,0x34,0x2, +0xcd,0x7d,0x23,0x7e,0x29,0x70,0xbe,0x73,0x4, 0x2, 0x50,0x6b,0xa, 0x57,0x7e,0x33, +0x4, 0x3, 0xa, 0x3, 0x2d,0x5, 0x7c,0x61,0x19,0x62,0x0, 0x1, 0xbe,0x63,0x4, 0x2, +0x78,0x19,0xa, 0x6, 0xb, 0x4, 0x7c,0x21,0x19,0x22,0x0, 0x2, 0x9, 0x22,0x0, 0x1, +0xa, 0x2, 0xb, 0x4, 0x7c,0x21,0x19,0x22,0x0, 0x3, 0x22,0xa, 0x13,0x7e,0x13,0x4, +0x2, 0xa, 0x1, 0x2d,0x1, 0x1b,0x4, 0xa, 0x16,0xbd,0x10,0x78,0x13,0x1b,0x14,0x19, +0x32,0x0, 0x2, 0x9, 0x32,0x0, 0x1, 0xa, 0x13,0x1b,0x14,0x19,0x32,0x0, 0x3, 0x22, +0x1b,0x14,0x7c,0x63,0x19,0x62,0x0, 0x2, 0x9, 0x62,0x0, 0x1, 0xa, 0x16,0xb, 0x14, +0x7c,0x63,0x19,0x62,0x0, 0x3, 0x22,0xa, 0x37,0x7e,0x33,0x4, 0x3, 0xa, 0x13,0x9d, +0x31,0x19,0x72,0x0, 0x1, 0x9, 0xa2,0x0, 0x1, 0xbe,0xa3,0x4, 0x3, 0x78,0xb, 0xa, +0x3a,0xb, 0x34,0x12,0x1a,0x86,0xb, 0x34,0x80,0x12,0x7e,0xb3,0x4, 0x2, 0x14,0xbc, +0xab,0xa, 0x3a,0x78,0xe, 0x1b,0x34,0x12,0x1a,0x86,0x1b,0x34,0x7c,0xb7,0x19,0xb2, +0x0, 0x3, 0x22,0x1b,0x34,0x19,0x72,0x0, 0x2, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0xb, +0x34,0x19,0x72,0x0, 0x3, 0x22,0x7c,0xb7,0x19,0xb2,0x0, 0x2, 0x9, 0xb2,0x0, 0x1, +0xa, 0x3b,0x22,0x12,0x1a,0xa3,0x7a,0xb3,0x4, 0x17,0xbe,0xb0,0x1, 0x28,0x3, 0x2, +0x1a,0xad,0x22,0x7e,0x35,0x53,0x9, 0xb3,0x0, 0x1a,0x54,0xf, 0x22,0xca,0xd8,0xca, +0x79,0xc2,0xb, 0x12,0x1a,0xa3,0xbe,0xb0,0x1, 0x38,0x2, 0x61,0x7d,0x7e,0xb3,0x4, +0x4f,0x70,0x2, 0x61,0x7d,0x7e,0xf0,0x1, 0x61,0x73,0xc2,0xb, 0x74,0x7, 0xac,0xbf, +0x9, 0xe5,0x4, 0x38,0x9, 0xd5,0x4, 0x37,0x49,0xd5,0x4, 0x35,0x49,0xc5,0x4, 0x33, +0x7c,0xbe,0x7e,0x73,0x4, 0x18,0x12,0x1b,0xc2,0x7f,0x71,0x7e,0x73,0x4, 0x24,0xbc, +0x7d,0x38,0x2, 0xd2,0xb, 0x7e,0xb7,0x4, 0x58,0x6d,0xaa,0x7f,0x15,0x2e,0x18,0x3, +0xe8,0xbf,0x61,0x48,0xa, 0x7e,0x73,0x4, 0x19,0xbc,0x7d,0x38,0x2, 0xd2,0xb, 0x7f, +0x17,0x2f,0x15,0xbf,0x61,0x8, 0xa, 0x7e,0x73,0x4, 0x21,0xbc,0x7d,0x38,0x2, 0xd2, +0xb, 0x7e,0x8, 0x0, 0x4, 0x7e,0x1f,0x4, 0x33,0x12,0x0, 0xe5,0x2f,0x15,0xbf,0x61, +0x8, 0x1b,0xbe,0x68,0x1f,0x40,0x8, 0x15,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x4, 0x39, +0x20,0xe1,0xa, 0x7e,0x73,0x4, 0x21,0xbc,0x7d,0x38,0x2, 0xd2,0xb, 0xbe,0x68,0x4e, +0x20,0x8, 0xd, 0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x4, 0x39,0x20,0xe1,0x2, 0xd2,0xb, +0xa2,0xb, 0xe4,0x33,0x7c,0x6b,0x5e,0x60,0x1, 0x7e,0x50,0x7, 0xac,0x5f,0x12,0x1e, +0x4d,0xb, 0xf0,0x12,0x1a,0xa3,0x12,0x1f,0xc8,0x58,0x2, 0x41,0xca,0x12,0x1b,0x85, +0xda,0x79,0xda,0xd8,0x22,0x6c,0x66,0x6c,0x77,0x7e,0x50,0x7, 0xac,0x57,0x9, 0xb2, +0x4, 0x39,0x30,0xe0,0x10,0x9, 0xa2,0x4, 0x38,0x7c,0x56,0xb, 0x60,0xa, 0x25,0x2e, +0x25,0x53,0x7a,0x29,0xa0,0xb, 0x70,0xbe,0x70,0x4, 0x40,0xdd,0x5e,0x60,0xf, 0x7e, +0x25,0x53,0x2e,0x24,0x0, 0x1a,0x7e,0x29,0x70,0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x29, +0x70,0x22,0xca,0xd8,0xca,0x79,0x7c,0xa7,0x7c,0xdb,0x9f,0x0, 0x7e,0x93,0x4, 0x3, +0xa, 0xe9,0xa, 0xfd,0x12,0x1c,0x44,0x7c,0x85,0x12,0x1c,0x44,0x7c,0x57,0x4c,0x88, +0x78,0x8, 0x7e,0xe0,0x2, 0x7e,0xf0,0x2, 0x80,0x19,0x7c,0xb9,0x14,0xbc,0xb8,0xa, +0x78,0x78,0x6, 0x1b,0x75,0x7c,0xef,0x80,0xa, 0x1b,0x74,0x7c,0xef,0xa, 0x38,0xb, +0x34,0x7c,0xf7,0x7c,0x75,0xac,0x79,0x2c,0xe7,0x2c,0xf7,0x7e,0x90,0x4, 0xac,0x9f, +0x2e,0x45,0x51,0x12,0x1f,0xec,0x7e,0x90,0x4, 0xac,0x9e,0x2e,0x45,0x51,0x49,0xf4, +0x0, 0x2, 0xb, 0x48,0xe0,0xbf,0x71,0x8, 0x2, 0x80,0x2, 0x7f,0x17,0xbe,0x18,0x0, +0x0, 0x58,0x2, 0x7f,0x10,0xa, 0x1a,0x6d,0x0, 0x12,0x0, 0x78,0x12,0x1e,0x46,0xda, +0x79,0xda,0xd8,0x22,0x7d,0x3f,0x7d,0x2e,0x2, 0x0, 0x46,0xca,0x3b,0x7e,0x77,0x4, +0x31,0x7d,0x37,0x1e,0x34,0x1e,0x34,0x7a,0x37,0x2, 0xba,0x1e,0x74,0x7e,0x37,0x4, +0x2f,0x1e,0x34,0x7a,0x37,0x2, 0xbc,0xe4,0xa1,0xfe,0x12,0x1e,0x39,0x49,0x23,0x0, +0x4, 0x7a,0x27,0x2, 0xbe,0x49,0x63,0x0, 0x6, 0x7e,0x37,0x4, 0x31,0xbd,0x36,0x38, +0x2, 0xc1,0x13,0x7e,0x37,0x2, 0xbe,0x9e,0x37,0x2, 0xbc,0x12,0x2, 0x9e,0x7d,0x23, +0x7e,0x37,0x2, 0xbc,0x9d,0x32,0x7a,0x37,0x2, 0xc0,0x7e,0x24,0x0, 0xa, 0x8d,0x32, +0x7a,0x37,0x2, 0xc0,0xb, 0x34,0x7a,0x37,0x2, 0xc0,0x7d,0x36,0x8d,0x37,0x7a,0x27, +0x2, 0xca,0x7d,0x32,0x9e,0x37,0x2, 0xba,0x12,0x2, 0x9e,0x7e,0x24,0x0, 0xa, 0x12, +0x0, 0x46,0x7a,0x37,0x2, 0xc2,0xb, 0x34,0x7a,0x37,0x2, 0xc2,0xbd,0x76,0x40,0x6, +0x7e,0x37,0x4, 0x53,0x80,0x4, 0x7e,0x37,0x4, 0x12,0x7e,0x24,0x0, 0x64,0x8d,0x32, +0x7a,0x37,0x2, 0xc4,0x7e,0x73,0x4, 0x57,0xa, 0x37,0xbe,0x37,0x2, 0xc4,0x28,0x4, +0x6d,0x33,0x80,0xc, 0x7e,0x73,0x4, 0x5a,0xa, 0x37,0xbe,0x37,0x2, 0xc4,0x50,0x4, +0x7a,0x37,0x2, 0xc4,0x7e,0x27,0x2, 0xc0,0x7e,0x37,0x2, 0xc2,0xad,0x32,0x6d,0x22, +0x7a,0x1f,0x2, 0xc6,0x7e,0x17,0x2, 0xc4,0x12,0x0, 0x89,0x7a,0x1f,0x2, 0xc6,0x7e, +0xf7,0x2, 0xba,0xbd,0xf6,0x40,0x2e,0x7e,0x1f,0x2, 0xc6,0x7e,0xb3,0x4, 0x2b,0x7e, +0x33,0x4, 0x2c,0x7e,0x20,0xc8,0x12,0x1e,0x16,0x7f,0x1, 0x7a,0xf, 0x2, 0xc6,0x7d, +0x36,0x6d,0x22,0xbf,0x10,0x50,0x4, 0x6d,0x66,0xa1,0xf2,0x7e,0x1f,0x2, 0xc6,0x7d, +0xe3,0x9d,0x6e,0xa1,0xf2,0xbd,0x76,0x40,0x35,0x7e,0x1f,0x2, 0xc6,0x7e,0xb3,0x4, +0x2d,0x7e,0x33,0x4, 0x2e,0x12,0x1e,0x2e,0x7e,0x73,0x2, 0xb9,0xa, 0xe7,0x2e,0xe5, +0x53,0x9, 0xbe,0x0, 0x18,0xb4,0x1, 0x6, 0x9f,0x11,0x7a,0x1f,0x2, 0xc6,0x7e,0x1f, +0x2, 0xc6,0x7d,0xe3,0x2d,0x6e,0xbd,0x76,0x50,0x68,0x7d,0x67,0x80,0x64,0x7d,0x3f, +0x2d,0x37,0xbd,0x36,0x40,0x3f,0x7e,0x1f,0x2, 0xc6,0x7e,0xb3,0x4, 0x4, 0x7e,0x33, +0x4, 0x5, 0x12,0x1e,0x2e,0x7e,0x73,0x2, 0xb9,0xa, 0x37,0x2e,0x35,0x53,0x9, 0xb3, +0x0, 0x18,0xb4,0x1, 0x6, 0x9f,0x11,0x7a,0x1f,0x2, 0xc6,0x7d,0x57,0x6d,0x44,0x7e, +0x1f,0x2, 0xc6,0x2f,0x21,0x7d,0x16,0x6d,0x0, 0xbf,0x2, 0x50,0x4, 0x7d,0x67,0x80, +0x21,0x9d,0x63,0x80,0x1d,0x7e,0x1f,0x2, 0xc6,0x7e,0xb3,0x4, 0x6, 0x7e,0x33,0x4, +0x7, 0x12,0x1e,0x2e,0x2d,0x63,0x7e,0x37,0x4, 0x31,0xbd,0x36,0x38,0x4, 0x7d,0x63, +0x1b,0x64,0x12,0x1e,0x39,0x59,0x63,0x0, 0x6, 0x7e,0xb3,0x2, 0xb9,0x4, 0x7a,0xb3, +0x2, 0xb9,0x12,0x1a,0xa3,0xa, 0x2b,0x7e,0x73,0x2, 0xb9,0xa, 0x37,0xbd,0x32,0x58, +0x2, 0x81,0x6a,0xda,0x3b,0x22,0xca,0xf8,0x7c,0xf2,0x12,0x1f,0xdf,0xa, 0x19,0x6d, +0x0, 0x12,0x0, 0x94,0xa, 0x1f,0x6d,0x0, 0x12,0x0, 0x94,0xda,0xf8,0x22,0x7e,0x20, +0xc8,0x12,0x1e,0x16,0x7a,0x1f,0x2, 0xc6,0x22,0x7e,0x63,0x2, 0xb9,0x7e,0x70,0x5, +0xac,0x67,0x2e,0x35,0x53,0x22,0x7e,0x8, 0x0, 0xa, 0x2, 0x0, 0xe5,0x2e,0x24,0x4, +0x39,0x7e,0x29,0x70,0x5e,0x70,0xfe,0x4c,0x76,0x7a,0x29,0x70,0x22,0x12,0x1f,0x25, +0xc2,0xb, 0x7e,0x34,0x4, 0x51,0x12,0x34,0x68,0xd2,0xb, 0x7e,0x34,0x4, 0x10,0x12, +0x34,0x68,0x7e,0x34,0x4, 0x51,0x12,0x1e,0xbc,0x7e,0x34,0x4, 0x10,0x12,0x1e,0xbc, +0x7e,0xb3,0x4, 0x15,0x1e,0xb0,0x54,0x3, 0xa, 0x2b,0x7e,0xb3,0x4, 0x56,0x1e,0xb0, +0x54,0x3, 0xa, 0x3b,0x2d,0x32,0x68,0x5, 0x12,0x1a,0xa3,0x78,0x5, 0xc2,0x10,0x12, +0x52,0x2d,0x7e,0xb3,0x4, 0x56,0x20,0xe0,0x7, 0x7e,0xb3,0x4, 0x15,0x30,0xe0,0x9, +0xd2,0x10,0x74,0x78,0x7a,0xb3,0x4, 0x4f,0x22,0xc2,0x10,0x22,0x49,0x3, 0x0, 0x2, +0x9, 0x53,0x0, 0x4, 0x9, 0xa3,0x0, 0x5, 0x7c,0xba,0x1e,0xb0,0x54,0x3, 0xbe,0xb0, +0x0, 0x28,0x46,0x7e,0x17,0x4, 0x27,0xbd,0x10,0x50,0x2, 0x80,0x22,0x7e,0x17,0x4, +0x1d,0xbd,0x10,0x50,0xa, 0x7e,0x43,0x4, 0x20,0xbc,0x45,0x40,0x37,0x80,0x10,0x7e, +0x17,0x4, 0x25,0xbd,0x10,0x50,0x14,0x7e,0xb3,0x4, 0x1f,0xbc,0xb5,0x40,0x25,0x7d, +0x43,0x2e,0x44,0x0, 0x5, 0x7c,0xba,0x44,0x1, 0x80,0xa, 0x7d,0x43,0x2e,0x44,0x0, +0x5, 0x7c,0xba,0x54,0xfe,0x7a,0x49,0xb0,0x22,0x2e,0x34,0x0, 0x5, 0x7c,0xba,0x54, +0xfe,0x7a,0x39,0xb0,0x22,0xca,0x79,0x6c,0xff,0x7e,0x70,0x7, 0xac,0x7f,0x7d,0x23, +0x2e,0x24,0x4, 0x39,0x7e,0x29,0xb0,0x54,0xfe,0x7a,0x29,0xb0,0x9f,0x0, 0x59,0x13, +0x4, 0x35,0x59,0x3, 0x4, 0x33,0xe4,0x19,0xb3,0x4, 0x37,0xb, 0xf0,0xbe,0xf0,0x4, +0x78,0xd7,0x6c,0xff,0x80,0x67,0xa, 0x3f,0x2e,0x35,0x53,0x7e,0x39,0xe0,0x7e,0x30, +0x7, 0xac,0x3f,0x19,0xe1,0x4, 0x38,0x7e,0x10,0x4, 0xac,0x1e,0x2e,0x5, 0x51,0x12, +0x1f,0xd7,0x59,0x31,0x4, 0x35,0x59,0x21,0x4, 0x33,0x7c,0xbe,0x12,0x51,0xe7,0x7c, +0xab,0x7e,0x50,0x7, 0xac,0x5f,0x19,0xa2,0x4, 0x37,0x7d,0x32,0x12,0x1f,0xcf,0x44, +0x1, 0x7a,0x39,0xb0,0x7e,0x33,0x4, 0x3, 0xbc,0x3e,0x38,0x17,0xa, 0x13,0x7e,0x13, +0x4, 0x2, 0xa, 0x1, 0x2d,0x1, 0xa, 0x1e,0xbd,0x10,0x58,0x7, 0x7e,0x39,0xb0,0x44, +0x2, 0x80,0x5, 0x7e,0x39,0xb0,0x54,0xfd,0x7a,0x39,0xb0,0xb, 0xf0,0x12,0x1a,0xa3, +0x12,0x1f,0xc8,0x48,0x91,0xda,0x79,0x22,0xa, 0x2b,0xa, 0x3f,0xbd,0x32,0x22,0x2e, +0x34,0x4, 0x39,0x7e,0x39,0xb0,0x22,0x49,0x30,0x0, 0x2, 0xb, 0x8, 0x20,0x22,0x7c, +0x93,0xa, 0x1b,0x6d,0x0, 0x2, 0x0, 0x78,0x2e,0x44,0x0, 0xec,0x49,0x34,0x0, 0x2, +0xb, 0x48,0x20,0x22,0x6c,0x77,0x6c,0xaa,0x6c,0x66,0x7e,0x50,0x4, 0xac,0x56,0x49, +0x12,0x1, 0x7e,0x49,0x2, 0x1, 0x7c,0xbe,0x8, 0x9, 0xc4,0x8, 0x4, 0xb, 0x70,0x80, +0x7, 0xbe,0x70,0x8, 0x50,0x2, 0x6c,0x77,0xbe,0x8, 0x3a,0x98,0x8, 0x4, 0xb, 0xa0, +0x80,0x7, 0xbe,0xa0,0x8, 0x50,0x2, 0x6c,0xaa,0xb, 0x60,0xa5,0xbe,0x10,0xcb,0xbe, +0x70,0x8, 0x40,0xa, 0x7e,0x1f,0x1, 0xc4,0xbe,0x18,0x61,0xa8,0x48,0xf, 0xbe,0xa0, +0x8, 0x40,0x1a,0x7e,0x1f,0x1, 0xc4,0xbe,0x18,0x9c,0x40,0x58,0x10,0x7e,0xb3,0x2, +0x5f,0x44,0x2, 0x7a,0xb3,0x2, 0x5f,0xe4,0x7a,0xb3,0x5, 0x60,0x22,0x7e,0xa3,0x2, +0x5f,0x7c,0xba,0x30,0xe1,0x1b,0x7e,0xb3,0x5, 0x60,0x4, 0x7a,0xb3,0x5, 0x60,0xbe, +0xb0,0x14,0x40,0xd, 0xe4,0x7a,0xb3,0x5, 0x60,0x7c,0xba,0x54,0xfd,0x7a,0xb3,0x2, +0x5f,0x22,0x75,0x18,0x3, 0x75,0x1e,0x0, 0x22,0xca,0x79,0x12,0x21,0xc2,0x12,0x56, +0x13,0x12,0x20,0x82,0x7e,0xb3,0x0, 0xd8,0x12,0x24,0x28,0x12,0x40,0x5a,0x12,0x25, +0xf1,0xbe,0xf0,0x1, 0x78,0x6, 0x7e,0x34,0x0, 0xcc,0x80,0x9, 0xbe,0xf0,0x2, 0x78, +0x7, 0x7e,0x34,0x0, 0xd2,0x12,0x3a,0x77,0x12,0x22,0x82,0x75,0x18,0x3, 0x75,0x16, +0x40,0x12,0x21,0xc2,0x7a,0x37,0x0, 0x5d,0xe5,0x18,0xb4,0x3, 0x2, 0x80,0x2, 0x21, +0x57,0xe5,0x1e,0x60,0xec,0x12,0x27,0xc5,0x12,0x23,0xd1,0x12,0x10,0x5d,0x6c,0xff, +0x80,0x40,0x12,0x21,0xba,0x68,0x3, 0xb4,0x2, 0x2b,0x74,0x4, 0xac,0xbf,0x49,0x35, +0x0, 0xee,0x7d,0xe3,0x7c,0xbf,0x12,0x21,0x60,0x7c,0xab,0x74,0x2, 0xa4,0x59,0xe5, +0x3, 0x93,0xa, 0x3f,0x9, 0xe3,0x0, 0xa6,0x7c,0xbf,0x12,0x21,0x60,0xa, 0x3b,0x19, +0xe3,0x3, 0xdb,0x80,0xb, 0x12,0x21,0xcd,0x74,0x2, 0xac,0xbf,0x59,0x35,0x3, 0x93, +0xb, 0xf0,0x12,0x13,0xcf,0x38,0xbb,0x12,0x21,0xba,0x68,0x3, 0xb4,0x2, 0xc, 0xe5, +0x15,0x70,0x5, 0x75,0x15,0x1, 0x80,0x89,0x75,0x15,0x0, 0x75,0x1e,0x0, 0x7e,0xb3, +0x4, 0xc5,0x54,0x7f,0x7a,0xb3,0x4, 0xc5,0xe5,0x4d,0x30,0xe0,0x2, 0x1, 0xc1,0x74, +0x1, 0x7a,0xb3,0x0, 0xdd,0x1, 0xc1,0xe5,0x18,0x7a,0xb3,0x4, 0x99,0xda,0x79,0x22, +0x7c,0x3b,0xe5,0x15,0x70,0x5, 0x12,0x23,0xb2,0x80,0x6, 0x12,0x23,0xb2,0x2e,0xa0, +0x12,0x6c,0x22,0xa, 0xa, 0x2e,0x4, 0x1, 0xb0,0x12,0x17,0x85,0x7c,0x7b,0xa, 0x2, +0x2e,0x4, 0x1, 0x40,0x12,0x17,0x85,0xbc,0xb7,0x78,0x25,0xbe,0x20,0x20,0x50,0x1b, +0xa, 0x32,0x12,0x27,0xb5,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c, +0x72,0x1e,0x70,0xa, 0x57,0x2d,0x54,0x7c,0xab,0x80,0x2, 0x7c,0xa2,0x7c,0xba,0x22, +0xb, 0x20,0xbe,0x20,0x24,0x40,0xbc,0x7c,0xb3,0x22,0x7e,0xb3,0x0, 0xd8,0xbe,0xb0, +0x1, 0x22,0x6d,0x33,0x7a,0x37,0x0, 0xa2,0x7e,0x34,0x7, 0xd0,0x22,0x74,0x4, 0xac, +0xbf,0x49,0x35,0x0, 0xee,0x49,0x25,0x0, 0xec,0x22,0xca,0x3b,0x7c,0xab,0x9f,0x66, +0x7f,0x36,0x7f,0x46,0x7f,0x56,0x7e,0x78,0x0, 0x1, 0x7e,0x33,0x5, 0x5f,0xa, 0x43, +0x12,0x34,0x5c,0x68,0xd, 0x7e,0x50,0x4, 0xac,0x5a,0x49,0x72,0x0, 0xea,0x49,0x62, +0x0, 0xe8,0x30,0xc, 0x12,0xbe,0x70,0x1, 0x28,0xd, 0x7e,0x50,0x4, 0xac,0x5a,0x49, +0xb2,0x0, 0xe6,0x49,0xa2,0x0, 0xe4,0x7c,0xb3,0x14,0xbc,0xb7,0x68,0xd, 0x7e,0x50, +0x4, 0xac,0x5a,0x49,0x92,0x0, 0xf2,0x49,0x82,0x0, 0xf0,0x30,0xc, 0x17,0x7d,0x24, +0x1b,0x25,0xa, 0x37,0xbd,0x32,0x58,0xd, 0x7e,0x70,0x4, 0xac,0x7a,0x49,0xd3,0x0, +0xf6,0x49,0xc3,0x0, 0xf4,0x74,0x4, 0xa4,0x12,0x21,0xd1,0x12,0x22,0x71,0x2f,0x71, +0x7f,0x13,0x12,0x22,0x71,0x2f,0x71,0x7f,0x14,0x12,0x22,0x71,0x2f,0x71,0x7f,0x15, +0x12,0x22,0x71,0x2f,0x71,0x7f,0x16,0x12,0x22,0x71,0x2f,0x71,0x7f,0x17,0xda,0x3b, +0x22,0x7f,0x1, 0x7e,0x37,0x2, 0x10,0x12,0x17,0xa0,0x8, 0x3, 0x7f,0x10,0x22,0x9f, +0x11,0x22,0xca,0x3b,0xc2,0xb, 0x7e,0xb3,0x2, 0xb5,0x54,0x7f,0x7a,0xb3,0x2, 0xb5, +0x7e,0x67,0x2, 0xb6,0x7e,0xb3,0x2, 0x5f,0x30,0xe5,0x17,0x80,0x4, 0xe4,0x12,0x17, +0x5b,0x12,0x17,0x47,0x50,0xf7,0xd2,0xb, 0x7e,0xb3,0x2, 0x5f,0x54,0xdf,0x7a,0xb3, +0x2, 0x5f,0x53,0xe3,0x1f,0x6c,0xff,0x74,0xff,0x80,0x8, 0xa, 0x3f,0x19,0xb3,0x2, +0xb9,0xb, 0xf0,0x7e,0xa3,0x2, 0x62,0xbc,0xaf,0x38,0xf0,0x6c,0xee,0x61,0x5e,0x6c, +0xff,0x80,0xa, 0xe4,0xa, 0x3f,0x2d,0x36,0x7a,0x39,0xb0,0xb, 0xf0,0x12,0x13,0xcf, +0x38,0xf1,0x6c,0xff,0xa, 0x2f,0x7e,0x34,0x0, 0x7, 0x9d,0x32,0x7a,0x73,0x5, 0x13, +0x4c,0xff,0x78,0x14,0x75,0x23,0x0, 0x6c,0xaa,0xe5,0x23,0xa, 0x3b,0x19,0xa3,0x4, +0xef,0x5, 0x23,0xe5,0x23,0xb4,0x24,0xef,0x12,0x4f,0x25,0x12,0x42,0xf3,0x12,0x4f, +0x76,0xb, 0xf0,0xbe,0xf0,0x8, 0x78,0xcc,0x6c,0xff,0x80,0x3b,0xa, 0x2f,0x9, 0x62, +0x2, 0xb9,0xa, 0x1f,0x2d,0x16,0x7e,0x19,0x70,0xbc,0x67,0x28,0x28,0x19,0x72,0x2, +0xb9,0x7e,0xb3,0x2, 0x5f,0x20,0xe0,0x7, 0x7e,0xb3,0x2, 0xad,0x30,0xe1,0x5, 0x12, +0x21,0xcd,0x80,0x5, 0x12,0x21,0xcd,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x74,0x2, 0xac, +0xbf,0x59,0x35,0x1, 0xc8,0xb, 0xf0,0x12,0x13,0xcf,0x38,0xc0,0xb, 0xe0,0x7e,0x73, +0x2, 0x37,0xbc,0x7e,0x28,0x2, 0x41,0xcf,0x6c,0xff,0x80,0xd, 0xa, 0x3f,0x9, 0x53, +0x2, 0xb9,0x2d,0x36,0x7a,0x39,0x50,0xb, 0xf0,0x12,0x13,0xcf,0x38,0xee,0x74,0x3, +0x12,0x17,0xee,0x12,0x4e,0xe1,0x12,0x27,0xc5,0x30,0xb, 0x15,0x7e,0xb3,0x2, 0x5f, +0x44,0x20,0x7a,0xb3,0x2, 0x5f,0x80,0x4, 0xe4,0x12,0x17,0x5b,0x12,0x17,0x47,0x50, +0xf7,0x53,0xe3,0x1f,0x7e,0xb3,0x2, 0xad,0x12,0x17,0xa9,0x7c,0xb7,0x42,0xe3,0xda, +0x3b,0x22,0xa, 0xf3,0x7e,0x44,0x0, 0x9, 0x7d,0x3f,0x7d,0x24,0x12,0x0, 0x46,0x7d, +0x2, 0x3e,0x4, 0x7d,0x3f,0x7d,0x24,0x12,0x0, 0x46,0x7d,0x50,0x2d,0x53,0x7c,0xab, +0x22,0xca,0xf8,0x7e,0xa3,0x0, 0xd8,0xbe,0xa0,0x1, 0x68,0x5, 0xbe,0xa0,0x2, 0x78, +0x3, 0x75,0x4d,0x1, 0xe5,0x4d,0x30,0xe0,0x25,0x7c,0xba,0x12,0x24,0x28,0x12,0x25, +0xf1,0xbe,0xf0,0x1, 0x78,0x6, 0x7e,0x34,0x0, 0xcc,0x80,0x9, 0xbe,0xf0,0x2, 0x78, +0x7, 0x7e,0x34,0x0, 0xd2,0x12,0x3a,0x77,0x12,0x22,0x82,0x53,0x4d,0xfc,0xe5,0x4d, +0x30,0xe2,0x12,0x53,0xca,0xe1,0x7e,0x73,0x0, 0xdc,0xa, 0x37,0x3e,0x34,0x7c,0xb7, +0x42,0xca,0x53,0x4d,0xfb,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x68, +0x5, 0xbe,0xf0,0x2, 0x78,0x15,0x74,0x12,0x7a,0xb3,0x2, 0x60,0xe4,0x7a,0xb3,0x2, +0x61,0x7e,0x73,0x2, 0x60,0x7a,0x73,0x2, 0x62,0x80,0x12,0x74,0x20,0x7a,0xb3,0x2, +0x60,0x74,0x4, 0x7a,0xb3,0x2, 0x61,0x74,0x24,0x7a,0xb3,0x2, 0x62,0x7e,0xb3,0x2, +0xaf,0x54,0x7f,0x7a,0xb3,0x2, 0xaf,0x7e,0xb3,0x2, 0xb3,0x44,0xf, 0x7a,0xb3,0x2, +0xb3,0x44,0xf0,0x7a,0xb3,0x2, 0xb3,0x7e,0x73,0x0, 0xca,0x7a,0x73,0x2, 0xb1,0x7e, +0x73,0x0, 0xcb,0x7a,0x73,0x2, 0xb2,0xbe,0xf0,0x1, 0x68,0x5, 0xbe,0xf0,0x2, 0x78, +0x16,0xe5,0x15,0x70,0x6, 0x7e,0x34,0x1, 0xb0,0x80,0x4, 0x7e,0x34,0x1, 0xc2,0x7e, +0x24,0x2, 0x63,0x74,0x12,0x80,0xa, 0x7e,0x34,0x1, 0x40,0x7e,0x24,0x2, 0x63,0x74, +0x24,0x7e,0x30,0x98,0x12,0x4e,0x70,0x6c,0xaa,0x80,0x21,0xa, 0x3a,0x12,0x27,0xb5, +0x7e,0xb3,0x2, 0x60,0x1e,0xb0,0xa, 0x1b,0xad,0x12,0x7c,0xba,0x1e,0xb0,0xa, 0x3b, +0x2d,0x31,0x7c,0xb7,0xa, 0x4a,0x19,0xb4,0x2, 0x87,0xb, 0xa0,0x7e,0xb3,0x2, 0x60, +0xbc,0xba,0x38,0xd7,0x6c,0xaa,0x80,0x12,0xa, 0x3a,0x7e,0xb3,0x2, 0x60,0xa, 0x4b, +0x2d,0x43,0x7c,0xb9,0x19,0xb4,0x2, 0x87,0xb, 0xa0,0x7e,0xb3,0x2, 0x61,0xbc,0xba, +0x38,0xe6,0x7e,0xb3,0x2, 0xad,0x44,0x1, 0x7a,0xb3,0x2, 0xad,0xbe,0xf0,0x1, 0x78, +0xd, 0x7e,0xb3,0x2, 0xad,0x54,0xfd,0x12,0x25,0xe0,0x44,0x8, 0x80,0x21,0xbe,0xf0, +0x2, 0x7e,0xb3,0x2, 0xad,0x78,0x11,0x54,0xfd,0x7a,0xb3,0x2, 0xad,0x7e,0xb3,0x2, +0xb5,0x54,0xfb,0x12,0x25,0xea,0x80,0x7, 0x44,0x2, 0x12,0x25,0xe0,0x44,0x18,0x7a, +0xb3,0x2, 0xb5,0x7e,0xb3,0x2, 0xad,0x54,0xfb,0x7a,0xb3,0x2, 0xad,0x54,0xe7,0x44, +0x8, 0x7a,0xb3,0x2, 0xad,0x7e,0x63,0x0, 0xd9,0x5e,0x60,0x7, 0x7c,0xb6,0xc4,0x33, +0x54,0xe0,0x7c,0x6b,0x7e,0x73,0x2, 0xad,0x12,0x26,0xd8,0x7c,0xb7,0xc4,0x13,0x54, +0x7, 0x54,0x7, 0xbe,0xb0,0x0, 0x28,0x10,0x7c,0xb7,0x30,0xe1,0xb, 0x7c,0x67,0x9e, +0x60,0x20,0x5e,0x60,0xe0,0x12,0x26,0xd8,0x7e,0x63,0x0, 0xda,0x5e,0x60,0x7f,0x7e, +0x73,0x2, 0xae,0x5e,0x70,0x80,0x4c,0x76,0x7a,0x73,0x2, 0xae,0x7e,0x63,0x0, 0xdb, +0x5e,0x60,0x7f,0x7e,0x73,0x2, 0xaf,0x5e,0x70,0x80,0x4c,0x76,0x7a,0x73,0x2, 0xaf, +0x7e,0xb3,0x2, 0xb0,0x54,0xf0,0x44,0x1, 0x7a,0xb3,0x2, 0xb0,0x54,0xf, 0x44,0x20, +0x7a,0xb3,0x2, 0xb0,0x74,0x3, 0x7a,0xb3,0x2, 0xb4,0x7e,0xb3,0x2, 0xb5,0x54,0xfc, +0x7a,0xb3,0x2, 0xb5,0x12,0x27,0xd4,0x54,0x7f,0x7a,0xb3,0x2, 0xb5,0xda,0xf8,0x22, +0x7a,0xb3,0x2, 0xad,0x7e,0xb3,0x2, 0xb5,0x44,0x4, 0x7a,0xb3,0x2, 0xb5,0x54,0xc7, +0x22,0x12,0x25,0xf9,0x7e,0xf3,0x0, 0xd8,0x22,0x12,0x0, 0x2e,0x70,0x2, 0xc1,0xd7, +0x80,0x4, 0xe4,0x12,0x17,0x5b,0x12,0x17,0x47,0x50,0xf7,0x75,0xe1,0x0, 0x12,0x27, +0xdb,0x7c,0xba,0x12,0x26,0xe6,0x3e,0x34,0x12,0x27,0xe5,0x75,0xe3,0x0, 0x12,0x26, +0xe2,0x3e,0x34,0x7c,0xb7,0x42,0xe3,0x7c,0xba,0xc4,0x23,0x54,0x3, 0xa, 0x3b,0x12, +0x17,0xb3,0x7c,0xb7,0x42,0xe3,0x12,0x17,0xa7,0x7c,0xb7,0x42,0xe3,0x75,0xe7,0x0, +0x7c,0xba,0x30,0xe1,0x5, 0x43,0xe7,0x33,0x80,0x3, 0x43,0xe7,0x11,0x74,0x1, 0x7e, +0x73,0x2, 0xae,0x5e,0x70,0x7f,0x12,0x0, 0x25,0x74,0x2, 0x7e,0x73,0x2, 0xaf,0x5e, +0x70,0x7f,0x12,0x0, 0x25,0x74,0x3, 0xca,0xb8,0x7e,0x63,0x2, 0xb0,0x7c,0x76,0x12, +0x27,0xbc,0x7c,0x7b,0x7c,0xb6,0xc4,0x54,0xf, 0x2c,0x7b,0xda,0xb8,0x12,0x0, 0x25, +0x74,0x6, 0x7e,0x70,0x61,0x12,0x0, 0x25,0x12,0x14,0x11,0x74,0x53,0x7e,0x73,0x2, +0xb3,0x5e,0x70,0xf, 0x12,0x0, 0x25,0x74,0x54,0xca,0xb8,0x7e,0xb3,0x2, 0xb3,0xc4, +0x7c,0x7b,0x5e,0x70,0xf, 0xda,0xb8,0x12,0x0, 0x25,0x7e,0xb3,0x2, 0xad,0xc4,0x23, +0x54,0x3, 0xbe,0xb0,0x1, 0x68,0x3, 0xb4,0x2, 0x15,0x74,0x5b,0x7e,0x73,0x2, 0xb4, +0x12,0x0, 0x25,0x74,0x5c,0x7e,0x73,0x2, 0xb5,0x5e,0x70,0x3, 0x12,0x0, 0x25,0x43, +0xe1,0x8, 0x74,0x2, 0x2, 0x3a,0x63,0x22,0x5e,0x70,0x1f,0x4c,0x76,0x7a,0x73,0x2, +0xad,0x22,0x7c,0xba,0x1e,0xb0,0x1e,0xb0,0x54,0x1, 0xa, 0x3b,0x22,0x12,0x25,0xf9, +0x12,0x22,0x82,0x12,0x48,0xbd,0x2, 0x26,0xf9,0xca,0x79,0x12,0x27,0xd0,0x6d,0x33, +0x6c,0xee,0x80,0xa, 0x74,0x2, 0xac,0xbe,0x59,0x35,0x2, 0xb9,0xb, 0xe0,0x7e,0x53, +0x2, 0x62,0xbc,0x5e,0x38,0xee,0x7e,0xb3,0x2, 0x5f,0x30,0xe0,0x3a,0x6c,0xee,0x80, +0x2c,0x12,0x42,0xf3,0x6c,0xff,0x80,0x1e,0x7e,0x50,0x2, 0xac,0x5f,0x49,0xf2,0x2, +0xb9,0x6d,0xee,0x74,0x4, 0xac,0xbf,0x12,0x17,0x7c,0xbf,0x7, 0x8, 0x6, 0x7d,0x31, +0x59,0x32,0x2, 0xb9,0xb, 0xf0,0x12,0x13,0xcf,0x38,0xdd,0xb, 0xe0,0x7e,0x73,0x2, +0x36,0xbc,0x7e,0x38,0xcc,0x80,0x3c,0x7e,0xe0,0x1, 0x12,0x10,0x5d,0x6c,0xff,0x80, +0x26,0x12,0x21,0xcd,0x74,0x2, 0x1e,0x34,0xe, 0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x7d,0x13,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x2, 0xb9,0xb, 0x28,0x30, +0x2d,0x31,0x1b,0x28,0x30,0xb, 0xf0,0x12,0x13,0xcf,0x38,0xd5,0xb, 0xe0,0xbe,0xe0, +0x4, 0x28,0xc7,0x6c,0xee,0x80,0x16,0x74,0x2, 0xac,0xbe,0x49,0x35,0x2, 0xb9,0x49, +0x25,0x1, 0xc8,0xbd,0x23,0x50,0x4, 0x59,0x35,0x1, 0xc8,0xb, 0xe0,0x12,0x4f,0x16, +0x38,0xe5,0xda,0x79,0x22,0x7e,0x24,0x0, 0x2, 0x2, 0x0, 0x46,0x5e,0x70,0xf, 0x7c, +0xb7,0xc4,0x54,0xf0,0x22,0x7e,0xb3,0x2, 0xb5,0x44,0x80,0x7a,0xb3,0x2, 0xb5,0x22, +0x7e,0xb3,0x2, 0xb5,0x54,0xbf,0x7a,0xb3,0x2, 0xb5,0x22,0x7e,0xa3,0x2, 0xad,0x7c, +0xba,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x7c,0xb7,0x42,0xe1,0x22,0xbe,0xb0,0xa, 0x50, +0x8, 0x7c,0x1b,0x2e,0x10,0x16,0xa5,0xe7,0x22,0x2, 0x27,0xfc,0x7c,0x7b,0xa5,0xbf, +0xa, 0x5, 0x7e,0xa0,0x20,0x21,0x59,0xa5,0xbf,0xb, 0x5, 0x7e,0xa0,0x3, 0x21,0x59, +0xa5,0xbf,0xc, 0x6, 0x7e,0xa3,0x0, 0xd9,0x21,0x59,0xa5,0xbf,0xd, 0x1c,0x7e,0xb3, +0x0, 0xd8,0xb4,0x1, 0x6, 0x7e,0xa3,0x0, 0xcc,0x21,0x59,0xb4,0x2, 0x6, 0x7e,0xa3, +0x0, 0xd2,0x21,0x59,0x7e,0xa3,0x0, 0xca,0x21,0x59,0xa5,0xbf,0xe, 0x1c,0x7e,0xb3, +0x0, 0xd8,0xb4,0x1, 0x6, 0x7e,0xa3,0x0, 0xcd,0x21,0x59,0xb4,0x2, 0x6, 0x7e,0xa3, +0x0, 0xd3,0x21,0x59,0x7e,0xa3,0x0, 0xcb,0x21,0x59,0xa5,0xbf,0xf, 0x6, 0x7e,0xa3, +0x0, 0xda,0x21,0x59,0xa5,0xbf,0x10,0x6, 0x7e,0xa3,0x0, 0xdb,0x21,0x59,0xbe,0x70, +0x11,0x40,0x1d,0xbe,0x70,0x34,0x38,0x18,0x12,0x21,0xba,0x68,0x3, 0xb4,0x2, 0x8, +0xa, 0x37,0x9, 0xa3,0x3, 0xca,0x21,0x59,0xa, 0x37,0x9, 0xa3,0x0, 0x95,0x21,0x59, +0xbe,0x70,0x35,0x40,0x35,0xbe,0x70,0x58,0x38,0x30,0xa, 0x57,0x9e,0x54,0x0, 0x35, +0x7c,0xab,0xbe,0xa0,0x20,0x50,0x14,0xa, 0x4a,0x7e,0x4, 0x0, 0x10,0x12,0x29,0x6f, +0x7d,0x12,0x3e,0x14,0x12,0x29,0x6f,0x2d,0x31,0x80,0x2, 0xa, 0x3a,0x2e,0x34,0x1, +0x40,0x12,0x29,0x66,0x7c,0xab,0xb, 0xa0,0x21,0x59,0xa5,0xbf,0x59,0x6, 0x7e,0xa3, +0x0, 0xdc,0x21,0x59,0xa5,0xbf,0x5a,0x5, 0x7e,0xa0,0xf, 0x80,0x7c,0xa5,0xbf,0xac, +0x13,0x7e,0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e,0xa3,0x0, 0xd4,0x80,0x6b,0x7e,0xa3, +0x0, 0xce,0x80,0x65,0xa5,0xbf,0xa0,0x5, 0x7e,0xa0,0x1, 0x80,0x5c,0xa5,0xbf,0xa1, +0x13,0x7e,0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e,0xa3,0x0, 0xd5,0x80,0x4b,0x7e,0xa3, +0x0, 0xcf,0x80,0x45,0xa5,0xbf,0xa2,0x13,0x7e,0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e, +0xa3,0x0, 0xd6,0x80,0x34,0x7e,0xa3,0x0, 0xd0,0x80,0x2e,0xa5,0xbf,0xa3,0x13,0x7e, +0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e,0xa3,0x0, 0xd7,0x80,0x1d,0x7e,0xa3,0x0, 0xd1, +0x80,0x17,0xa5,0xbf,0xad,0x6, 0x7e,0xa3,0x0, 0xdd,0x80,0xd, 0xa5,0xbf,0xae,0x6, +0x7e,0xa3,0x0, 0xd8,0x80,0x3, 0x7e,0xa0,0xee,0x7c,0xba,0x22,0xe5,0x29,0xa, 0xfb, +0x7d,0x3f,0x2e,0x37,0x2, 0x57,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7d, +0x34,0x7d,0x20,0x2, 0x0, 0x46,0xca,0x3b,0xc2,0xb, 0x12,0x0, 0x2e,0x70,0x3, 0x2, +0x32,0xbf,0x75,0x23,0x0, 0x6c,0xaa,0xe5,0x23,0xa, 0x3b,0x19,0xa3,0x0, 0x77,0x5, +0x23,0xe5,0x23,0xb4,0x2, 0xef,0x7e,0xa3,0x2, 0x60,0x7c,0xba,0x1e,0xb0,0xf5,0x27, +0x7c,0xba,0x1e,0xb0,0x1e,0xb0,0xf5,0x28,0x7e,0x63,0x0, 0x79,0x7c,0xa6,0x5e,0xa0, +0xf, 0x7a,0xa1,0x5a,0xbe,0xa0,0x1, 0x68,0x2e,0xbe,0xa0,0x2, 0x78,0x2b,0xe5,0x27, +0xa, 0xfb,0x7e,0xa3,0x0, 0x5f,0xa, 0xa, 0x7d,0x30,0x7d,0x2f,0x12,0x0, 0x46,0x7d, +0x12,0xe5,0x28,0xa, 0x4b,0xbd,0x41,0x8, 0x5, 0x12,0x55,0xe9,0x8, 0x9, 0x12,0x55, +0xe9,0x8, 0x6, 0xbd,0x41,0x18,0x2, 0xd2,0xb, 0x75,0x23,0x0, 0xa1,0xdc,0xe5,0x23, +0xa, 0x3b,0x9, 0x73,0x0, 0x5f,0x7a,0x71,0x25,0x7e,0xa1,0x27,0x7c,0xb7,0x84,0x7a, +0xa1,0x25,0x9f,0x0, 0x7a,0xf, 0x2, 0xd5,0x7a,0xf, 0x2, 0xd9,0x7a,0xf, 0x2, 0xe1, +0x7a,0xf, 0x2, 0xe5,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, 0x7e,0x49,0x25, +0x1, 0x7c,0x7a,0x1f,0x2, 0xdd,0xe5,0x28,0xa, 0xfb,0x6d,0xee,0xe5,0x25,0xa, 0xdb, +0x6d,0xcc,0x7f,0x16,0x7f,0x7, 0x12,0x0, 0x94,0x7f,0x20,0x7a,0x2f,0x2, 0xc1,0x7f, +0x7, 0x1b,0xc, 0xbf,0x2, 0x68,0x12,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, +0x82,0x49,0x25,0x1, 0x80,0x7a,0x1f,0x2, 0xd9,0x30,0xb, 0x1e,0x7f,0x7, 0x1b,0xd, +0x7e,0x1f,0x2, 0xc1,0xbf,0x1, 0x28,0x12,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35, +0x1, 0x86,0x49,0x25,0x1, 0x84,0x7a,0x1f,0x2, 0xe5,0x7e,0x1f,0x2, 0xc1,0xbe,0x18, +0x0, 0x0, 0x68,0x12,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, 0x7a,0x49,0x25, +0x1, 0x78,0x7a,0x1f,0x2, 0xd5,0x30,0xb, 0x1c,0x7e,0x1f,0x2, 0xc1,0xbe,0x18,0x0, +0x1, 0x28,0x12,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, 0x76,0x49,0x25,0x1, +0x74,0x7a,0x1f,0x2, 0xe1,0x7a,0x6f,0x2, 0xc1,0xbf,0x67,0x40,0xa, 0x7e,0x1f,0x2, +0xc1,0x9f,0x17,0x7a,0x1f,0x2, 0xc1,0x7e,0xb3,0x2, 0x5f,0x20,0xe4,0x2, 0x61,0xcc, +0x7e,0x27,0x2, 0x57,0x12,0x56,0x8f,0x93,0xbe,0xb3,0x2, 0x62,0x50,0x4, 0xe5,0x25, +0x60,0x41,0x7d,0x32,0xb, 0x34,0x12,0x29,0x66,0xbe,0xb3,0x2, 0x62,0x50,0x5, 0x12, +0x32,0xe3,0x68,0x2f,0x7d,0x32,0xb, 0x35,0x12,0x29,0x66,0xbe,0xb3,0x2, 0x62,0x50, +0x7, 0xe5,0x25,0xbe,0xb1,0x28,0x68,0x1b,0x7d,0x32,0x2e,0x34,0x0, 0x3, 0x12,0x29, +0x66,0xbe,0xb3,0x2, 0x62,0x40,0x2, 0x61,0xcc,0xe5,0x27,0x14,0xbe,0xb1,0x25,0x68, +0x2, 0x61,0xcc,0xe5,0x25,0x70,0x4, 0xf5,0x29,0x80,0x19,0x12,0x32,0xe3,0x78,0x5, +0x75,0x29,0x1, 0x80,0xf, 0xe5,0x25,0xbe,0xb1,0x28,0x78,0x5, 0x75,0x29,0x2, 0x80, +0x3, 0x75,0x29,0x3, 0x12,0x29,0x5c,0x12,0x37,0x29,0x48,0x2, 0x61,0xcc,0x12,0x36, +0xe1,0x12,0x32,0xda,0x58,0x2, 0x7f,0x31,0x7f,0x13,0x7d,0x1f,0x2e,0x17,0x2, 0x59, +0x12,0x32,0xc8,0xca,0xb8,0x12,0x32,0xc2,0x7c,0x3b,0xda,0xb8,0x12,0x32,0xd1,0x58, +0x2, 0x7f,0x31,0xe5,0x25,0x60,0x7, 0xe5,0x25,0xbe,0xb1,0x28,0x78,0x28,0x7e,0x2f, +0x2, 0xd9,0xbf,0x23,0x58,0x4, 0x9f,0x11,0x80,0x3, 0x12,0x55,0xce,0x7a,0x1f,0x2, +0xd9,0x7e,0x2f,0x2, 0xe5,0xbf,0x23,0x58,0x4, 0x9f,0x11,0x80,0x3, 0x12,0x55,0xce, +0x7a,0x1f,0x2, 0xe5,0x80,0x26,0x7e,0x2f,0x2, 0xd5,0xbf,0x23,0x58,0x4, 0x9f,0x11, +0x80,0x3, 0x12,0x55,0xce,0x7a,0x1f,0x2, 0xd5,0x7e,0x2f,0x2, 0xe1,0xbf,0x23,0x58, +0x4, 0x9f,0x11,0x80,0x3, 0x12,0x55,0xce,0x7a,0x1f,0x2, 0xe1,0x7e,0x5f,0x2, 0xc1, +0x12,0x37,0x43,0xb, 0xc, 0x7e,0x1f,0x2, 0xd9,0x12,0x37,0x5a,0x1b,0xd, 0x7e,0x1f, +0x2, 0xe1,0x12,0x37,0x5a,0xb, 0xd, 0x7e,0x5f,0x2, 0xe5,0x12,0x37,0x19,0x7e,0x1f, +0x2, 0xd9,0x2f,0x10,0x7e,0xf, 0x2, 0xe1,0x2f,0x1, 0x7f,0x60,0x2f,0x65,0x7a,0x6f, +0x2, 0xbd,0x74,0x6, 0x7f,0x17,0x2f,0x11,0x14,0x78,0xfb,0x12,0x37,0x4, 0x7a,0x37, +0x2, 0xd1,0xe5,0x23,0xa, 0x3b,0x9, 0xa3,0x0, 0x5f,0x7a,0xa1,0x25,0xe5,0x27,0xa, +0x2b,0x1b,0x24,0xa, 0x3a,0xbd,0x32,0xe5,0x27,0xa, 0x4b,0xe5,0x25,0x8, 0x8, 0xa, +0x5b,0x9d,0x54,0xf5,0x26,0x80,0x6, 0xa, 0x5b,0x2d,0x54,0xf5,0x26,0xa2,0xb, 0x92, +0xc, 0xe5,0x25,0x12,0x21,0xda,0x7a,0x1f,0x2, 0xc1,0xa2,0xb, 0x92,0xc, 0xe5,0x26, +0x12,0x21,0xda,0x12,0x55,0xa3,0x8, 0x5, 0x12,0x55,0xba,0x80,0x3, 0x12,0x55,0xd7, +0x12,0x55,0x85,0x12,0x4c,0x79,0x7a,0x1f,0x2, 0xcd,0x7e,0xb3,0x2, 0x5f,0x20,0xe3, +0x2, 0xa1,0xc7,0x12,0xc, 0x28,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0xc7,0x7e,0x17,0x2, +0x2c,0x1a,0x2, 0x1a,0x0, 0x7e,0x2f,0x2, 0xcd,0xbf,0x20,0x48,0xe, 0x7e,0x17,0x2, +0x2e,0x1a,0x2, 0x1a,0x0, 0xbf,0x20,0x18,0x2, 0xa1,0xc7,0xe5,0x25,0xbe,0xb1,0x28, +0x40,0x16,0xe5,0x28,0xa, 0x3b,0x7e,0x53,0x2, 0x60,0xa, 0x25,0x9d,0x23,0xe5,0x25, +0xa, 0x3b,0xbd,0x23,0x8, 0x2, 0xa1,0xc7,0xe5,0x25,0xbe,0xb1,0x28,0xe5,0x25,0xa, +0x2b,0x7d,0x32,0x50,0x19,0x2e,0x37,0x2, 0x4f,0x12,0x29,0x66,0xf5,0x29,0x7d,0x32, +0x2e,0x37,0x2, 0x51,0x12,0x29,0x66,0xf5,0x2a,0x85,0x25,0x2b,0x80,0x26,0x2e,0x37, +0x2, 0x4f,0xe5,0x27,0xa, 0xb, 0x9d,0x30,0x12,0x29,0x66,0xf5,0x29,0x7d,0x32,0x2e, +0x37,0x2, 0x51,0x9d,0x30,0x12,0x29,0x66,0xf5,0x2a,0xe5,0x27,0xa, 0x4b,0x7d,0x52, +0x9d,0x54,0xf5,0x2b,0x7e,0x63,0x2, 0x62,0xbe,0x61,0x2a,0x38,0x2, 0xa1,0xc7,0xbe, +0x61,0x29,0x38,0x2, 0xa1,0xc7,0x7e,0xa1,0x2a,0x74,0x4, 0xa4,0x12,0x21,0xd1,0x7e, +0xa1,0x29,0x74,0x4, 0xa4,0x49,0x75,0x0, 0xee,0x49,0x65,0x0, 0xec,0x2f,0x31,0x12, +0x37,0x36,0x48,0x2, 0xa1,0xc7,0x12,0x36,0xe1,0x12,0x32,0xda,0x58,0x2, 0x7f,0x31, +0x7f,0x13,0xe5,0x2b,0xa, 0xb, 0x7d,0x10,0x2e,0x17,0x2, 0x53,0x12,0x32,0xc8,0x54, +0x7f,0xca,0xb8,0x7d,0x10,0x2e,0x17,0x2, 0x55,0x12,0x32,0xc8,0x7c,0x3b,0xda,0xb8, +0x12,0x32,0xd1,0x58,0x2, 0x7f,0x31,0x7e,0x71,0x25,0x74,0x40,0xac,0xb7,0x7d,0x35, +0x2e,0x34,0x0, 0x10,0xbe,0x37,0x2, 0xd1,0x50,0xe, 0x7d,0x35,0x2e,0x34,0x0, 0x30, +0xbe,0x37,0x2, 0xd1,0x28,0x2, 0x2f,0x33,0xe5,0x2b,0xa, 0x3b,0x2e,0x37,0x2, 0x53, +0x12,0x29,0x66,0x23,0x54,0x1, 0x68,0x8, 0x7e,0x1f,0x2, 0xc5,0x2f,0x13,0x80,0x10, +0x7e,0xf, 0x2, 0xc5,0xbf,0x3, 0x50,0x4, 0x9f,0x11,0x80,0x4, 0x7f,0x10,0x9f,0x13, +0x12,0x55,0xa3,0x8, 0x5, 0x12,0x55,0xba,0x80,0x3, 0x12,0x55,0xd7,0x12,0x55,0x85, +0x12,0x4c,0x79,0x7a,0x1f,0x2, 0xcd,0x7e,0x37,0x2, 0xd1,0x12,0x56,0x20,0x59,0x35, +0x0, 0x63,0x7e,0x1f,0x2, 0xcd,0x59,0x35,0x0, 0x65,0x5, 0x23,0x7e,0x23,0x0, 0x79, +0x7c,0xa2,0x5e,0xa0,0xf, 0xa, 0x2a,0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x21, +0xee,0xbe,0xa0,0x2, 0x50,0x3, 0x2, 0x32,0xbf,0x7a,0xa3,0x3, 0x1, 0x75,0x23,0x0, +0x80,0x28,0x12,0x36,0xfa,0x49,0x32,0x0, 0x63,0x59,0x32,0x2, 0xe9,0x49,0x32,0x0, +0x65,0x59,0x32,0x2, 0xeb,0x7e,0xa0,0xff,0x19,0xa2,0x2, 0xed,0xe5,0x23,0xa, 0x3b, +0x9, 0xa3,0x0, 0x5f,0x19,0xa3,0x2, 0xfd,0x5, 0x23,0x12,0xc, 0x28,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0xbd,0x32,0x48,0xcb,0x75,0x23,0x0, 0x2, 0x32,0x49,0x12,0x56,0x20, +0x9, 0xb5,0x2, 0xed,0xbe,0xb0,0xaa,0x78,0x3, 0x2, 0x32,0x47,0xe5,0x23,0xa, 0x5b, +0xb, 0x54,0xf5,0x24,0x2, 0x32,0x3b,0x7e,0xa1,0x24,0x74,0x5, 0xa4,0x9, 0xb5,0x2, +0xed,0xbe,0xb0,0xaa,0x78,0x3, 0x2, 0x32,0x39,0xe5,0x23,0xa, 0xfb,0x9, 0xf, 0x2, +0xfd,0xbe,0x1, 0x28,0x40,0x19,0xbe,0x1, 0x27,0x50,0x14,0xe5,0x24,0xa, 0x2b,0x9, +0x62,0x2, 0xfd,0xbe,0x61,0x27,0x40,0x7, 0xa, 0x26,0x12,0x56,0x3b,0x48,0x2a,0xe5, +0x24,0xa, 0x2b,0x9, 0x62,0x2, 0xfd,0xbe,0x61,0x28,0x50,0x3, 0x2, 0x32,0x39,0xbe, +0x61,0x27,0x40,0x3, 0x2, 0x32,0x39,0xbe,0x1, 0x27,0x50,0x3, 0x2, 0x32,0x39,0xa, +0x20,0x12,0x56,0x3b,0x48,0x3, 0x2, 0x32,0x39,0xa, 0x30,0xe5,0x28,0xa, 0x1b,0x12, +0x36,0xe8,0x7a,0xa3,0x3, 0x2, 0xe5,0x24,0xa, 0x3b,0x9, 0x73,0x2, 0xfd,0x7d,0x21, +0x12,0x0, 0x46,0x7c,0x65,0x7a,0x63,0x3, 0x3, 0xa, 0x26,0xa, 0x3a,0x12,0x36,0xf0, +0x8, 0x3, 0x2, 0x32,0x39,0x7e,0xa1,0x24,0x74,0x5, 0xa4,0x49,0x25,0x2, 0xeb,0x12, +0x56,0x20,0x49,0x35,0x2, 0xeb,0x9d,0x32,0x12,0x2, 0x9e,0xbe,0x37,0x2, 0x26,0x48, +0x3, 0x2, 0x32,0x39,0xe5,0x23,0xa, 0x3b,0x9, 0xb3,0x2, 0xfd,0x7e,0xa1,0x24,0xa, +0x3a,0x9, 0x73,0x2, 0xfd,0x12,0x4d,0x32,0x7a,0x37,0x2, 0xd3,0xe5,0x24,0xa, 0x3b, +0x9, 0x73,0x2, 0xfd,0xa, 0x27,0xe5,0x23,0xa, 0x3b,0x9, 0x73,0x2, 0xfd,0x12,0x51, +0xa5,0xe5,0x28,0xa, 0x9b,0xbd,0x92,0x78,0x13,0xe5,0x23,0xa, 0x3b,0x9, 0x73,0x2, +0xfd,0x7d,0x29,0x12,0x0, 0x46,0x7c,0xb5,0xf5,0x25,0x80,0x7f,0x7e,0x93,0x3, 0x3, +0xa, 0xe9,0x7d,0xde,0x2d,0xd9,0x7d,0x1d,0x3e,0x14,0x3e,0x14,0x49,0x31,0x0, 0xee, +0x49,0x21,0x0, 0xec,0x74,0x4, 0xac,0xb9,0x12,0x17,0x7c,0x2f,0x1, 0xe5,0x27,0xa, +0xcb,0x7d,0x5e,0x12,0x56,0x34,0x12,0x21,0xd1,0x2f,0x10,0x7d,0x5d,0x12,0x56,0x34, +0x12,0x17,0x7c,0x2f,0x1, 0x7e,0x83,0x3, 0x2, 0xa, 0xa8,0x7d,0x8a,0x2d,0x89,0x7d, +0x38,0x3e,0x34,0x3e,0x34,0x49,0xf3,0x0, 0xee,0x49,0xe3,0x0, 0xec,0x74,0x4, 0xac, +0xb8,0x12,0x21,0xd1,0x2f,0x17,0x7d,0x5a,0x12,0x56,0x34,0x49,0xf5,0x0, 0xee,0x49, +0xe5,0x0, 0xec,0x2f,0x71,0x7d,0x58,0x12,0x56,0x34,0x12,0x21,0xd1,0x2f,0x17,0xbf, +0x10,0x8, 0x5, 0x7a,0x81,0x25,0x80,0x3, 0x7a,0x91,0x25,0x9f,0x11,0x7a,0x1f,0x2, +0xdd,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, 0x7e,0x49,0x25,0x1, 0x7c,0x12, +0x22,0x71,0x7a,0x1f,0x2, 0xdd,0x12,0x33,0xf, 0x49,0x31,0x1, 0x7e,0x49,0x21,0x1, +0x7c,0x12,0x22,0x71,0x7f,0x1, 0x7e,0x1f,0x2, 0xdd,0x2f,0x10,0x7a,0x1f,0x2, 0xdd, +0x12,0x32,0xea,0xe5,0x25,0x60,0x1f,0x7e,0xa1,0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, +0x7a,0x49,0x25,0x1, 0x78,0x12,0x33,0x2e,0x12,0x33,0xf, 0x49,0x31,0x1, 0x7a,0x49, +0x21,0x1, 0x78,0x12,0x33,0x2e,0x12,0x32,0xf1,0x12,0x32,0xe3,0x68,0x1f,0x7e,0xa1, +0x25,0x74,0x4, 0xa4,0x49,0x35,0x1, 0x82,0x49,0x25,0x1, 0x80,0x12,0x33,0x1e,0x12, +0x33,0xf, 0x49,0x31,0x1, 0x82,0x49,0x21,0x1, 0x80,0x12,0x33,0x1e,0x7e,0xb3,0x2, +0x5f,0x30,0xe6,0x4b,0x12,0xc, 0x28,0xb4,0x2, 0x3, 0x75,0x5a,0x1, 0xe5,0x25,0x12, +0x34,0x3f,0xe5,0x28,0x25,0x25,0x12,0x34,0x3f,0xbe,0x18,0x0, 0x0, 0x58,0x3, 0x12, +0x32,0xea,0xe5,0x25,0x12,0x33,0xb8,0xe5,0x28,0x25,0x25,0x12,0x33,0xb8,0xbe,0x18, +0x0, 0x0, 0x58,0x3, 0x12,0x32,0xf1,0xe5,0x25,0x12,0x33,0x3e,0xe5,0x28,0x25,0x25, +0x12,0x33,0x3e,0xbe,0x18,0x0, 0x0, 0x58,0x6, 0x9f,0x11,0x7a,0x1f,0x2, 0xdd,0x7e, +0x1f,0x2, 0xdd,0xb, 0x1c,0x7a,0x1f,0x2, 0xdd,0x7e,0xf4,0x0, 0x64,0x7e,0x1f,0x2, +0xd5,0x7d,0x1f,0x12,0x0, 0x89,0x7e,0x6f,0x2, 0xdd,0x7f,0x6, 0x12,0x0, 0xe5,0x7f, +0x51,0x7a,0x5f,0x2, 0xb9,0x7e,0x1f,0x2, 0xd9,0x7d,0x1f,0x12,0x0, 0x89,0x7f,0x6, +0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xbd,0x7e,0xb3,0x2, 0x5d,0xa, 0xfb,0x6d,0xee,0xbf, +0x57,0x28,0x12,0x7e,0x73,0x2, 0x5e,0xa, 0x17,0x6d,0x0, 0x12,0x19,0x3c,0x50,0x5, +0x12,0x32,0xf1,0x80,0x1b,0x7e,0x1f,0x2, 0xbd,0xbf,0x17,0x28,0x13,0x7e,0x73,0x2, +0x5e,0xa, 0x17,0x6d,0x0, 0x7e,0x1f,0x2, 0xb9,0xbf,0x10,0x50,0x3, 0x12,0x32,0xea, +0x7e,0xb3,0x2, 0x5f,0x20,0xe4,0x2, 0x21,0xa9,0x7e,0x27,0x2, 0x57,0x7d,0x32,0xb, +0x36,0x12,0x29,0x66,0xbe,0xb3,0x2, 0x62,0x50,0x4, 0xe5,0x25,0x60,0x14,0x7d,0x32, +0x2e,0x34,0x0, 0x5, 0x12,0x29,0x66,0xbe,0xb3,0x2, 0x62,0x50,0x6c,0x12,0x32,0xe3, +0x78,0x67,0xe5,0x25,0x70,0x5, 0x75,0x29,0x4, 0x80,0x3, 0x75,0x29,0x5, 0x12,0x29, +0x5c,0x12,0x37,0x29,0x58,0x53,0x12,0x36,0xe1,0x12,0x32,0xda,0x58,0x2, 0x7f,0x31, +0x7f,0x13,0x7d,0x1f,0x2e,0x17,0x2, 0x59,0x12,0x32,0xc8,0xca,0xb8,0x12,0x32,0xc2, +0x7c,0x3b,0xda,0xb8,0x12,0x32,0xd1,0x58,0x2, 0x7f,0x31,0xe5,0x25,0x70,0x16,0x7e, +0xf, 0x2, 0xd9,0xbf,0x3, 0x58,0x4, 0x9f,0x11,0x80,0x4, 0x7f,0x10,0x9f,0x13,0x7a, +0x1f,0x2, 0xd9,0x80,0x14,0x7e,0xf, 0x2, 0xd5,0xbf,0x3, 0x58,0x4, 0x9f,0x11,0x80, +0x4, 0x7f,0x10,0x9f,0x13,0x7a,0x1f,0x2, 0xd5,0xe5,0x25,0xa, 0xbb,0x6d,0xaa,0x12, +0x37,0x43,0xb, 0xc, 0x7e,0x5f,0x2, 0xd9,0x12,0x37,0x19,0x7f,0x10,0x2f,0x15,0x7f, +0x61,0xb, 0x6c,0x7a,0x6f,0x2, 0xbd,0x74,0x6, 0x7f,0x17,0x2f,0x11,0x14,0x78,0xfb, +0x12,0x37,0x4, 0x7a,0x1f,0x2, 0xc9,0x7e,0xa0,0xbb,0x7e,0x71,0x23,0x74,0x5, 0x7c, +0x17,0xac,0x1b,0x19,0xa0,0x2, 0xed,0x7e,0xa1,0x24,0x7c,0x9a,0xac,0x9b,0x49,0x14, +0x2, 0xeb,0x49,0xf0,0x2, 0xeb,0xbd,0xf1,0x50,0xa, 0xbe,0x17,0x2, 0xd3,0x50,0x14, +0x80,0xc, 0x80,0x10,0xbd,0xf1,0x28,0x1b,0xbe,0x17,0x2, 0xd3,0x40,0x6, 0x59,0x10, +0x2, 0xeb,0x80,0xf, 0x7e,0xa0,0xcc,0x19,0xa0,0x2, 0xed,0x7e,0x37,0x2, 0xd3,0x59, +0x30,0x2, 0xeb,0x7e,0x1f,0x2, 0xc9,0x59,0x30,0x2, 0xe9,0x7e,0xa0,0xaa,0x7e,0x71, +0x24,0x74,0x5, 0xac,0x7b,0x19,0xa3,0x2, 0xed,0x5, 0x24,0x7e,0x73,0x3, 0x1, 0xbe, +0x71,0x24,0x28,0x3, 0x2, 0x2e,0x57,0x5, 0x23,0x12,0x32,0xf8,0x28,0x3, 0x2, 0x2e, +0x3d,0x12,0x37,0xe, 0x75,0x23,0x0, 0x80,0x61,0x12,0x36,0xfa,0x9, 0x32,0x2, 0xed, +0xbe,0x30,0xaa,0x68,0x53,0x49,0x32,0x2, 0xe9,0x7e,0x13,0x0, 0x79,0x7c,0x1, 0x5e, +0x0, 0xf, 0x74,0x5, 0xac,0xb0,0x59,0x35,0x0, 0x63,0x49,0x32,0x2, 0xeb,0x59,0x35, +0x0, 0x65,0xe5,0x23,0xa, 0x3b,0x9, 0xa3,0x2, 0xfd,0xa, 0x40,0x19,0xa4,0x0, 0x5f, +0xa5,0xbb,0xbb,0x5, 0x7e,0xa0,0x2, 0x80,0x7, 0xa5,0xbb,0xcc,0x7, 0x7e,0xa0,0x1, +0x19,0xa4,0x0, 0x77,0x7c,0x61,0xb, 0x60,0x5e,0x60,0xf, 0x7c,0x71,0x12,0xf, 0x75, +0x12,0xc, 0x28,0xbe,0xb0,0x2, 0x50,0x7, 0x5, 0x23,0x12,0x32,0xf8,0x38,0x9a,0xda, +0x3b,0x22,0x7d,0x1f,0x2e,0x17,0x2, 0x5b,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93, +0x22,0x12,0x33,0x0, 0x7f,0x31,0x7e,0x17,0x2, 0x1a,0x7d,0x31,0x1a,0x26,0x1a,0x24, +0xbf,0x13,0x22,0xe5,0x28,0x14,0xbe,0xb1,0x25,0x22,0x9f,0x11,0x7a,0x1f,0x2, 0xd5, +0x22,0x9f,0x11,0x7a,0x1f,0x2, 0xd9,0x22,0x7e,0x73,0x3, 0x1, 0xbe,0x71,0x23,0x22, +0x12,0x1f,0xdf,0x4c,0x99,0x68,0x7, 0xa, 0x19,0x6d,0x0, 0x2, 0x0, 0xe5,0x22,0xe5, +0x28,0xa, 0xb, 0xe5,0x25,0xa, 0x1b,0x2d,0x10,0x3e,0x14,0x3e,0x14,0x22,0x12,0x22, +0x71,0x7f,0x1, 0x7e,0x1f,0x2, 0xd9,0x2f,0x10,0x7a,0x1f,0x2, 0xd9,0x22,0x12,0x22, +0x71,0x7f,0x1, 0x7e,0x1f,0x2, 0xd5,0x2f,0x10,0x7a,0x1f,0x2, 0xd5,0x22,0x7e,0x71, +0x28,0x12,0x33,0x51,0x7f,0x1, 0x7e,0x1f,0x2, 0xdd,0x9f,0x10,0x7a,0x1f,0x2, 0xdd, +0x22,0x7c,0x87,0x7c,0x9b,0xa, 0x18,0xa, 0x39,0x12,0x36,0xe8,0x4c,0xaa,0x68,0xe, +0x7c,0xb8,0x14,0xbc,0xba,0x68,0x7, 0xe5,0x5a,0xbe,0xb0,0x1, 0x28,0x4, 0x9f,0x77, +0x80,0x43,0xbe,0xa0,0x1, 0x38,0xe, 0x74,0x4, 0xac,0xb9,0x49,0xf5,0x1, 0x86,0x49, +0xe5,0x1, 0x84,0x80,0x30,0x7d,0x21,0x1b,0x25,0xa, 0x3a,0xbd,0x23,0x74,0x4, 0x18, +0xc, 0xac,0xb9,0x49,0xf5,0x1, 0x76,0x49,0xe5,0x1, 0x74,0x80,0x18,0xac,0xb9,0x12, +0x34,0x4, 0x49,0x35,0x1, 0x76,0x49,0x25,0x1, 0x74,0x2f,0x10,0x7e,0x8, 0x0, 0x2, +0x12,0x0, 0xe5,0x7f,0x71,0x7f,0x17,0x22,0x7e,0x71,0x28,0x12,0x33,0xcb,0x7f,0x1, +0x7e,0x1f,0x2, 0xd9,0x9f,0x10,0x7a,0x1f,0x2, 0xd9,0x22,0xca,0xf8,0x7c,0xf7,0x7c, +0xab,0xa, 0x4f,0x12,0x34,0x5c,0x68,0xe, 0x7c,0xbf,0x14,0xbc,0xb7,0x68,0x7, 0xe5, +0x5a,0xbe,0xb0,0x1, 0x28,0x4, 0x9f,0x0, 0x80,0x15,0x7d,0x24,0x1b,0x25,0xa, 0x37, +0xbd,0x32,0x74,0x4, 0x58,0x6, 0xa4,0x12,0x34,0x4, 0x80,0x3, 0x12,0x34,0x52,0x7f, +0x10,0xda,0xf8,0x22,0x49,0x15,0x1, 0x86,0x49,0x5, 0x1, 0x84,0x22,0x7c,0x97,0x7c, +0xab,0xa, 0x29,0xa, 0x3a,0x12,0x34,0x60,0x68,0xe, 0x7c,0xb9,0x14,0xbc,0xb7,0x68, +0x7, 0xe5,0x5a,0xbe,0xb0,0x1, 0x28,0x4, 0x9f,0x0, 0x80,0x10,0xbe,0x70,0x1, 0x74, +0x4, 0x28,0x5, 0x12,0x34,0x52,0x80,0x4, 0xa4,0x12,0x34,0x4, 0x7f,0x10,0x22,0x7e, +0x71,0x28,0x12,0x34,0xd, 0x7f,0x1, 0x7e,0x1f,0x2, 0xd5,0x9f,0x10,0x7a,0x1f,0x2, +0xd5,0x22,0xa4,0x49,0x15,0x1, 0x76,0x49,0x5, 0x1, 0x74,0x22,0xa, 0x3a,0x7d,0x24, +0x12,0x0, 0x46,0x7c,0x75,0x4c,0x77,0x22,0xca,0x3b,0x7d,0x73,0x6c,0xdd,0x9f,0x11, +0x7a,0x1f,0x2, 0xea,0x6c,0xcc,0x80,0x3a,0x30,0xb, 0x1c,0x7e,0x73,0x4, 0x3, 0xa, +0x7, 0xa, 0x1c,0x12,0x33,0x17,0x2e,0x15,0x51,0x49,0x31,0x0, 0x92,0x49,0x21,0x0, +0x90,0x74,0x4, 0xac,0xbc,0x80,0x11,0x74,0x4, 0xac,0xbc,0x7d,0x45,0x2e,0x45,0x51, +0x49,0x34,0x0, 0x92,0x49,0x24,0x0, 0x90,0x59,0x35,0x2, 0xbc,0x59,0x25,0x2, 0xba, +0xb, 0xc0,0x7e,0x73,0x4, 0x3, 0xbc,0x7c,0x38,0xbe,0x7e,0x34,0x2, 0xba,0x7e,0x24, +0x2, 0xda,0x12,0x35,0xfb,0x7a,0xb3,0x2, 0xb9,0xbe,0xb0,0x2, 0x28,0x6, 0x74,0x2, +0x7a,0xb3,0x2, 0xb9,0x7e,0x63,0x2, 0xb9,0x5e,0x60,0x3, 0x3e,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x5, 0x7e,0x29,0x70,0x5e,0x70,0xf9,0x4c,0x76,0x7a,0x29,0x70,0x7e,0x34, +0x2, 0xe2,0x7e,0x53,0x4, 0x3, 0xa, 0x25,0xe4,0x12,0x2, 0xae,0x7e,0x34,0x2, 0xe2, +0x7e,0x24,0x2, 0xda,0x7e,0xb3,0x2, 0xb9,0x12,0x36,0x87,0x7e,0xb3,0x2, 0xb9,0x70, +0x6, 0x7e,0x18,0x0, 0x1, 0x80,0x11,0x7e,0xa3,0x2, 0xda,0x74,0x4, 0xa4,0x49,0x35, +0x2, 0xbc,0x49,0x25,0x2, 0xba,0x2f,0x11,0x7a,0x1f,0x2, 0xea,0x9f,0x11,0x7a,0x1f, +0x2, 0xee,0x6c,0xcc,0x80,0x28,0xa, 0x3c,0x9, 0xb3,0x2, 0xe2,0x70,0x1e,0x74,0x4, +0xac,0xbc,0x49,0x15,0x2, 0xbc,0x49,0x5, 0x2, 0xba,0xbe,0x8, 0x0, 0x64,0x8, 0xc, +0x7e,0x1f,0x2, 0xee,0x2f,0x10,0x7a,0x1f,0x2, 0xee,0xb, 0xd0,0xb, 0xc0,0x7e,0x73, +0x4, 0x3, 0xbc,0x7c,0x38,0xd0,0xbe,0xd0,0x0, 0x28,0x1d,0xa, 0x1d,0x6d,0x0, 0x7e, +0x1f,0x2, 0xee,0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xee,0xbe,0x18,0x0, 0x1, 0x58,0x8, +0x7e,0x18,0x0, 0x1, 0x7a,0x1f,0x2, 0xee,0x7e,0x1f,0x2, 0xea,0xbe,0x18,0x0, 0x1, +0x18,0x8, 0x7e,0x18,0x0, 0x1, 0x7a,0x1f,0x2, 0xea,0x7e,0x1f,0x2, 0xee,0xbe,0x18, +0x0, 0x1, 0x18,0x8, 0x7e,0x18,0x0, 0x1, 0x7a,0x1f,0x2, 0xee,0x7e,0x6f,0x2, 0xee, +0x7e,0x7f,0x2, 0xea,0x7f,0x17,0x7f,0x6, 0x12,0x0, 0xe5,0xbe,0x34,0x0, 0x64,0x28, +0x4, 0x7e,0x34,0x0, 0x64,0xbe,0x68,0xfd,0xe8,0x48,0x8, 0x7e,0x8, 0xfd,0xe8,0x7a, +0xf, 0x2, 0xee,0xbe,0x78,0xfd,0xe8,0x48,0x8, 0x7e,0x8, 0xfd,0xe8,0x7a,0xf, 0x2, +0xea,0x7e,0xf, 0x2, 0xee,0x7d,0x21,0x59,0x27,0x0, 0x2, 0x7e,0xf, 0x2, 0xea,0x7d, +0x21,0x1b,0x78,0x20,0x19,0x77,0x0, 0x4, 0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x6c, +0xaa,0x80,0x64,0x4c,0xaa,0x78,0x4, 0x9f,0x0, 0x80,0x8, 0x12,0x36,0x77,0x1b,0x46, +0x12,0x36,0x7f,0x7a,0xf, 0x2, 0xf2,0x7e,0xb3,0x4, 0x3, 0x14,0xbc,0xba,0x78,0x4, +0x9f,0x0, 0x80,0xb, 0x12,0x36,0x77,0x49,0x14,0x0, 0x6, 0x49,0x4, 0x0, 0x4, 0x7a, +0xf, 0x2, 0xf6,0x12,0x36,0x77,0x12,0x36,0x7f,0x7e,0x7f,0x2, 0xf2,0xbf,0x7, 0x48, +0x24,0x7e,0x7f,0x2, 0xf6,0xbf,0x7, 0x48,0x1c,0x7e,0xf7,0x4, 0x58,0x6d,0xee,0xbf, +0x7, 0x48,0x12,0xb, 0xc, 0x59,0x14,0x0, 0x2, 0x1b,0x48,0x0, 0xa, 0x1f,0x2d,0x12, +0x7a,0x19,0xa0,0xb, 0xf0,0xb, 0xa0,0x7e,0xb3,0x4, 0x3, 0xbc,0xba,0x38,0x94,0x12, +0x4a,0x8d,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x90,0x4, 0xac,0x9a,0x2d,0x43,0x22,0x49, +0x14,0x0, 0x2, 0xb, 0x48,0x0, 0x22,0xca,0x3b,0xf5,0x23,0x7d,0x72,0x7d,0x63,0x75, +0x24,0x0, 0x80,0x43,0xe5,0x24,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x70,0xa, 0x37,0x7e, +0x53,0x4, 0x3, 0xa, 0x25,0x12,0x0, 0x46,0x7c,0xb5,0xf5,0x26,0x75,0x25,0x0, 0x80, +0x1b,0xe5,0x26,0xa, 0x2b,0xe5,0x25,0xa, 0x3b,0x12,0x36,0xf0,0x18,0xc, 0x7e,0xa0, +0x1, 0xe5,0x25,0xa, 0x3b,0x2d,0x36,0x7a,0x39,0xa0,0x5, 0x25,0x7e,0x73,0x4, 0x3, +0xbe,0x71,0x25,0x38,0xdc,0x5, 0x24,0xe5,0x23,0xbe,0xb1,0x24,0x38,0xb6,0xda,0x3b, +0x22,0x9f,0x32,0x7e,0x17,0x2, 0x18,0x22,0x7d,0x21,0x12,0x0, 0x46,0x7c,0xa5,0x22, +0x9d,0x32,0x12,0x2, 0x9e,0xbe,0x34,0x0, 0x1, 0x22,0x7e,0xa1,0x23,0x74,0x5, 0x7c, +0x5a,0xac,0x5b,0x22,0x7f,0x6, 0x12,0x0, 0x94,0x2e,0x18,0x0, 0x20,0x22,0x7e,0xb3, +0x0, 0x79,0x54,0xf0,0x7a,0xb3,0x0, 0x79,0x22,0x7f,0x15,0x12,0x0, 0x78,0x2f,0x71, +0x7a,0x7f,0x2, 0xb9,0x7f,0x6, 0x2f,0x4, 0x22,0x7c,0xab,0x74,0x4, 0xa4,0x49,0x75, +0x0, 0xee,0x49,0x65,0x0, 0xec,0x7e,0x17,0x2, 0x16,0x7d,0x51,0x1a,0x4a,0x1a,0x48, +0xbf,0x23,0x22,0x7f,0x5, 0x1b,0xc, 0x7e,0x4f,0x2, 0xd5,0x7f,0x14,0x12,0x0, 0x78, +0x7f,0x71,0x7e,0x6f,0x2, 0xdd,0x7f,0x16,0x7f,0x5, 0x12,0x0, 0x78,0x2f,0x71,0x7f, +0x5, 0x22,0x7e,0xf, 0x1, 0x70,0x7e,0x1f,0x1, 0x6c,0x2f,0x10,0x7e,0xf, 0x1, 0x74, +0x2f,0x1, 0x7e,0x1f,0x1, 0xc4,0xbf,0x10,0x58,0x8, 0x20,0x11,0x5, 0x12,0x37,0xe, +0xc3,0x22,0x12,0xc, 0x28,0x68,0x2, 0xd2,0x11,0xd3,0x22,0xca,0x79,0x7e,0xb3,0x2, +0x5f,0x20,0xe1,0x2d,0x7e,0x73,0x4, 0x86,0x4c,0x77,0x68,0x12,0xbe,0x70,0xff,0x68, +0xd, 0x7e,0xf0,0x28,0xac,0xf7,0xbe,0x74,0xb, 0xb8,0x58,0x6, 0x80,0x0, 0x7e,0x74, +0xb, 0xb8,0x7d,0x37,0x12,0x4a,0x3d,0x12,0x37,0x62,0x40,0x5, 0x7d,0x37,0x12,0x54, +0x72,0xda,0x79,0x22,0xbe,0xb0,0xa, 0x50,0xa, 0x7c,0x1b,0x2e,0x10,0x16,0x7c,0xb7, +0xa5,0xf7,0x22,0x2, 0x37,0xd6,0xca,0x79,0xb4,0xc, 0x7, 0x7e,0x74,0x0, 0xd9,0x2, +0x38,0xa4,0xb4,0xd, 0x1e,0x7e,0xb3,0x0, 0xd8,0xb4,0x1, 0x7, 0x7e,0x74,0x0, 0xcc, +0x2, 0x38,0xa4,0xb4,0x2, 0x7, 0x7e,0x74,0x0, 0xd2,0x2, 0x38,0xa4,0x7e,0x74,0x0, +0xca,0x1, 0xa4,0xb4,0xe, 0x1c,0x7e,0xb3,0x0, 0xd8,0xb4,0x1, 0x6, 0x7e,0x74,0x0, +0xcd,0x1, 0xa4,0xb4,0x2, 0x6, 0x7e,0x74,0x0, 0xd3,0x1, 0xa4,0x7e,0x74,0x0, 0xcb, +0x1, 0xa4,0xb4,0xf, 0x6, 0x7e,0x74,0x0, 0xda,0x80,0x79,0xb4,0x10,0x6, 0x7e,0x74, +0x0, 0xdb,0x80,0x70,0xb4,0x59,0x9, 0x7e,0x74,0x0, 0xdc,0x43,0x4d,0x4, 0x80,0x71, +0xb4,0xac,0x13,0x7e,0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e,0x74,0x0, 0xd4,0x80,0x54, +0x7e,0x74,0x0, 0xce,0x80,0x4e,0xb4,0xa1,0x13,0x7e,0xb3,0x0, 0xd8,0xb4,0x2, 0x6, +0x7e,0x74,0x0, 0xd5,0x80,0x3e,0x7e,0x74,0x0, 0xcf,0x80,0x38,0xb4,0xa2,0x13,0x7e, +0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e,0x74,0x0, 0xd6,0x80,0x28,0x7e,0x74,0x0, 0xd0, +0x80,0x22,0xb4,0xa3,0x13,0x7e,0xb3,0x0, 0xd8,0xb4,0x2, 0x6, 0x7e,0x74,0x0, 0xd7, +0x80,0x12,0x7e,0x74,0x0, 0xd1,0x80,0xc, 0xb4,0xae,0xe, 0x7e,0x74,0x0, 0xd8,0xe4, +0x7a,0xb3,0x0, 0xdd,0x43,0x4d,0x1, 0x80,0x8, 0xb4,0xaf,0x8, 0x12,0x38,0xb7,0x80, +0x3, 0x7a,0x79,0x70,0xda,0x79,0x22,0x30,0x8, 0x8, 0x74,0x1, 0x12,0x38,0xc9,0xc2, +0x8, 0x22,0xe4,0x12,0x38,0xc9,0xd2,0x8, 0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86, +0x22,0xca,0x3b,0x7c,0xcb,0x6c,0xaa,0x20,0x0, 0x8, 0x20,0x5, 0x5, 0x20,0x2, 0x2, +0x41,0x9, 0x20,0x6, 0x6, 0x7e,0x74,0x4, 0x9d,0x80,0x4, 0x7e,0x74,0x4, 0xaf,0x6c, +0xdd,0x74,0xff,0xa, 0x3d,0x2d,0x37,0x7a,0x39,0xb0,0xb, 0xd0,0xbe,0xd0,0x12,0x78, +0xf2,0x74,0xaa,0x7a,0x79,0xb0,0x74,0xaa,0x19,0xb7,0x0, 0x1, 0x74,0x12,0x19,0xb7, +0x0, 0x2, 0x7e,0xb3,0x0, 0x9d,0x19,0xb7,0x0, 0x4, 0x6c,0x77,0x6c,0xdd,0x7e,0x30, +0x5, 0xac,0x3d,0x9, 0x11,0x0, 0x8d,0xbe,0x10,0xff,0x78,0x2, 0x21,0xb1,0xa, 0xe1, +0x9, 0x6e,0x0, 0xe0,0xbe,0x60,0x3, 0x68,0x78,0x49,0x41,0x0, 0x89,0x12,0x3a,0x10, +0x19,0x2, 0x0, 0x5, 0x7c,0x9, 0xa, 0x27,0x2d,0x27,0x19,0x2, 0x0, 0x6, 0x49,0x41, +0x0, 0x8b,0x12,0x3a,0x10,0x19,0x2, 0x0, 0x7, 0x7c,0x9, 0xa, 0x27,0x2d,0x27,0x19, +0x2, 0x0, 0x8, 0xe4,0xa, 0x27,0x2d,0x27,0x19,0xb2,0x0, 0x9, 0xa, 0x27,0x2d,0x27, +0x19,0xb2,0x0, 0xa, 0x7c,0xb1,0xc4,0x54,0xf0,0xa, 0x27,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0x0, 0x2c,0xb, 0x7a,0x29,0x0, 0xbe,0x10,0xff,0x68,0x20,0xbe,0x60, +0x1, 0x68,0x2, 0xb, 0xa0,0x9, 0xbe,0x0, 0xe0,0xc4,0x33,0x33,0x54,0xc0,0xa, 0x27, +0x2d,0x27,0x2e,0x24,0x0, 0x5, 0x7e,0x29,0x60,0x2c,0x6b,0x7a,0x29,0x60,0x2e,0x70, +0x6, 0xb, 0xd0,0xbe,0xd0,0x2, 0x68,0x2, 0x21,0x1e,0x19,0xa7,0x0, 0x3, 0xe4,0x19, +0xb7,0x0, 0x11,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e,0x24, +0x0, 0x11,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x11,0x78, +0xe4,0x30,0x6, 0x4, 0xc2,0x6, 0x80,0x2, 0xd2,0x6, 0x30,0x5, 0x3, 0x12,0x3a,0x1d, +0xc2,0x0, 0xc2,0x5, 0xc2,0x2, 0x74,0x1, 0x12,0x38,0xc9,0x7e,0x34,0x0, 0x3, 0x12, +0x3a,0x4a,0xbe,0xc0,0x1, 0x78,0x6, 0x80,0x0, 0xe4,0x12,0x38,0xc9,0xda,0x3b,0x22, +0xa, 0x28,0x5e,0x24,0x0, 0xf, 0x7c,0x5, 0xa, 0x27,0x2d,0x27,0x22,0x6c,0xaa,0x74, +0x3, 0xa, 0x4a,0x19,0xb4,0x0, 0xe2,0x74,0x3, 0x19,0xb4,0x0, 0xe0,0x12,0x3a,0x42, +0xac,0x7a,0x59,0x43,0x0, 0xe4,0x59,0x43,0x0, 0xe8,0xb, 0xa0,0xbe,0xa0,0x2, 0x40, +0xde,0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0x22,0x7e,0x24,0x0, 0x14,0xad,0x32, +0x80,0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d,0x23,0x1b,0x34,0x4d,0x22, +0x78,0xf0,0x22,0x7c,0xab,0x80,0x7, 0x7e,0x34,0x0, 0x42,0x12,0x3a,0x4a,0x7c,0x7a, +0x1b,0xa0,0xa5,0xbf,0x0, 0xf1,0x22,0xca,0x79,0x7d,0x73,0xe5,0x15,0x70,0x27,0x74, +0x7, 0x7e,0x70,0x4, 0x12,0x3a,0xd2,0x7e,0x70,0x2, 0x12,0x0, 0x25,0x74,0x56,0x7e, +0x79,0x70,0x12,0x0, 0x25,0x74,0x57,0x9, 0x77,0x0, 0x1, 0x12,0x0, 0x25,0x74,0x58, +0x9, 0x77,0x0, 0x2, 0x80,0x26,0x74,0x7, 0x7e,0x70,0x2, 0x12,0x3a,0xd2,0x7e,0x70, +0x4, 0x12,0x0, 0x25,0x74,0x56,0x9, 0x77,0x0, 0x3, 0x12,0x0, 0x25,0x74,0x57,0x9, +0x77,0x0, 0x4, 0x12,0x0, 0x25,0x74,0x58,0x9, 0x77,0x0, 0x5, 0x12,0x0, 0x25,0xda, +0x79,0x22,0x12,0x0, 0x25,0x74,0x8, 0x7e,0x70,0xc, 0x12,0x0, 0x25,0x74,0x9, 0x22, +0x70,0x18,0x7e,0x1f,0x1, 0x70,0x7e,0xf, 0x1, 0x6c,0x2f,0x1, 0x7e,0x1f,0x1, 0x74, +0x2f,0x10,0xbe,0x18,0x7, 0xd0,0x58,0x2, 0xc2,0x11,0x22,0x7e,0x37,0x0, 0x7b,0x4d, +0x33,0x78,0x31,0x7e,0x53,0x0, 0x9f,0xbe,0x50,0x0, 0x28,0x5, 0x75,0x4e,0x0, 0x61, +0xd7,0x7e,0xb3,0x0, 0x7d,0x20,0xe0,0x2, 0x61,0xd7,0x7e,0x53,0x0, 0x82,0xbe,0x51, +0x4e,0x28,0x2, 0x61,0xd7,0x75,0x4e,0x0, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x0, 0x7b, +0x74,0x1, 0x80,0x74,0xbe,0x34,0x0, 0x1, 0x78,0x1a,0x7e,0xb3,0x0, 0x9f,0x70,0x2, +0x61,0xd7,0x6d,0x22,0x7a,0x27,0x0, 0x7b,0xe4,0x7a,0xb3,0x4, 0x82,0x75,0x4f,0x26, +0xd2,0x1, 0x61,0xd7,0xbe,0x34,0x0, 0x3, 0x78,0x7d,0xa9,0xd6,0xeb,0xa9,0xc6,0xac, +0xa9,0xc6,0xec,0xc2,0x96,0xc2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x80,0x4, +0xe4,0x12,0x17,0x5b,0x12,0x17,0x47,0x50,0xf7,0x20,0x93,0xfd,0xa9,0xc0,0xca,0x75, +0xe7,0x0, 0x53,0xe1,0xf7,0x74,0x2, 0x12,0x17,0x5b,0x12,0x21,0xc2,0x7a,0x37,0x0, +0x5d,0x12,0x0, 0x8, 0xc2,0xa8,0xc2,0x95,0xa9,0xd0,0xca,0x12,0x3b,0xf0,0x12,0x25, +0xf9,0x6d,0x33,0x7a,0x37,0x0, 0x7b,0xe4,0x7a,0xb3,0x4, 0x82,0x80,0x29,0xe4,0x12, +0x17,0x5b,0x20,0x93,0x22,0x7e,0x37,0x0, 0x7b,0x4d,0x33,0x78,0xe, 0xe5,0xcc,0x54, +0x7, 0xbe,0xb0,0x2, 0x68,0x11,0x75,0xcc,0x2, 0x80,0xc, 0xe5,0xcc,0x54,0x7, 0xbe, +0xb0,0x7, 0x68,0x3, 0x75,0xcc,0x7, 0x30,0x1, 0xd4,0x75,0x4f,0x0, 0xc2,0x1, 0x20, +0x93,0x3, 0x75,0xcc,0x50,0x22,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22, +0x75,0xeb,0x3, 0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x22,0xe4,0x12,0x48,0x7c, +0x12,0x3b,0xf0,0x12,0x48,0xb1,0x74,0x1, 0x2, 0x3c,0xb, 0x70,0x3, 0xc2,0xaf,0x22, +0xd2,0xaf,0x22,0x12,0x3b,0xfc,0x2, 0x0, 0x17,0xc2,0x8e,0xe5,0x89,0x54,0xf, 0x44, +0x20,0xf5,0x89,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0xa9,0xc3,0xb7, +0xd2,0xbb,0x22,0x12,0x21,0xc2,0x7a,0x37,0x0, 0x5d,0x12,0x3c,0x13,0x12,0x3d,0x2a, +0x12,0x43,0xb, 0x12,0x44,0xe1,0x7e,0xb3,0x4, 0x99,0x24,0xfd,0x68,0x11,0x24,0xae, +0x68,0x32,0x24,0xab,0x68,0xe, 0x24,0xa9,0x78,0xec,0x12,0xc, 0x2f,0x80,0xe7,0x12, +0x20,0x89,0x80,0xe2,0x12,0x3c,0xad,0x7e,0x24,0x1, 0xf4,0x7a,0x27,0x0, 0x5d,0x7e, +0xb3,0x0, 0xa4,0xbe,0xb0,0xaa,0x68,0xce,0x7a,0x37,0x0, 0x84,0x74,0xaa,0x7a,0xb3, +0x0, 0xa4,0x80,0xc2,0x12,0x3c,0xad,0x7e,0x34,0x1, 0xf4,0x7a,0x37,0x0, 0x5d,0x7e, +0xb3,0x0, 0xa4,0xb4,0xaa,0xb0,0x74,0x55,0x7a,0xb3,0x0, 0xa4,0x7e,0x74,0x3, 0xe8, +0x7d,0x37,0x1b,0x74,0x4d,0x33,0x78,0xf8,0x75,0xe9,0xff,0x80,0x99,0x6d,0x33,0x7a, +0x37,0x0, 0xa2,0x22,0x7e,0x34,0x0, 0x5f,0x7e,0x24,0x0, 0x1c,0xe4,0x12,0x2, 0xae, +0x7e,0x34,0x0, 0x89,0x7e,0x24,0x0, 0x19,0xe4,0x12,0x2, 0xae,0x6d,0x11,0x12,0x3d, +0x11,0x2e,0x34,0x0, 0x63,0x12,0x3d,0xe, 0x2e,0x34,0x0, 0x89,0x12,0x3d,0xe, 0x2e, +0x34,0x0, 0x93,0x12,0x3d,0x18,0xb, 0x14,0xbe,0x14,0x0, 0x2, 0x40,0xe0,0x75,0x4f, +0x0, 0x75,0x50,0x0, 0xc2,0x1, 0x75,0x4e,0x0, 0x12,0x3c,0xad,0x7e,0x24,0x7, 0xd0, +0x7a,0x27,0x0, 0x5d,0x7a,0x37,0x0, 0x84,0xe4,0x7a,0xb3,0x0, 0xa4,0x22,0x12,0x3d, +0x18,0x7e,0x34,0x0, 0x5, 0xad,0x31,0x22,0x7e,0x24,0x7f,0xff,0x1b,0x38,0x20,0x59, +0x23,0x0, 0x2, 0x74,0xff,0x19,0xb3,0x0, 0x4, 0x22,0xe4,0x7a,0xb3,0x4, 0xc5,0x12, +0x44,0xa8,0x2, 0x3d,0x35,0xca,0xf8,0xe4,0x12,0x3d,0x80,0x7c,0xfb,0x5e,0xf0,0x7, +0x78,0x5, 0x12,0x3f,0x57,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x3f,0x4d,0x80, +0x8, 0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x3f,0x61,0x75,0x91,0x0, 0xe4,0x7a,0xb3,0x4, +0xc3,0x7a,0xb3,0x4, 0xc2,0x74,0xaa,0x7a,0xb3,0x4, 0x9d,0x74,0xaa,0x7a,0xb3,0x4, +0x9e,0x74,0xaa,0x7a,0xb3,0x4, 0xaf,0x74,0xaa,0x7a,0xb3,0x4, 0xb0,0xda,0xf8,0x22, +0x7a,0xb3,0x4, 0xc1,0x7e,0xb3,0x4, 0xc5,0xc4,0x54,0xf, 0x22,0xca,0x79,0x30,0x90, +0x79,0xd2,0x7, 0x7e,0xb3,0x4, 0xc3,0x4, 0x7a,0xb3,0x4, 0xc3,0x7e,0xf3,0x4, 0xc3, +0xbe,0xf0,0x1, 0x78,0x8, 0xe5,0x91,0x7a,0xb3,0x4, 0xc6,0x80,0x31,0x12,0x3d,0x84, +0x7c,0xeb,0x5e,0xe0,0x7, 0x78,0x8, 0x12,0x3f,0x3, 0x12,0x46,0x76,0x80,0x1f,0xbe, +0xe0,0x4, 0x78,0x8, 0x12,0x3f,0x3, 0x12,0x47,0x1a,0x80,0x12,0x12,0x3d,0x84,0x54, +0x7, 0xb4,0x1, 0xa, 0x7e,0xb3,0x4, 0xc3,0x12,0x3f,0x5, 0x12,0x48,0xf, 0x12,0x3d, +0x84,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0xe, 0xe4,0x12,0x3e,0x67,0xb4,0x10,0x2, 0x80, +0x14,0x12,0x3f,0x57,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x3f,0x4d,0x80,0x8, +0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x3f,0x61,0xc2,0x90,0x30,0x91,0x57,0xc2,0x7, 0x7e, +0xb3,0x4, 0xc1,0x4, 0x12,0x3d,0x80,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0x13,0xe4,0x12, +0x3e,0x67,0xb4,0x10,0x6, 0x7e,0xb3,0x4, 0xc1,0x80,0x23,0x7e,0xb3,0x4, 0xc1,0x80, +0x28,0xbe,0xf0,0x4, 0x78,0xf, 0x7e,0xb3,0x4, 0xc1,0x2e,0xb3,0x4, 0xc6,0x12,0x3f, +0xf, 0xf5,0x91,0x80,0x1d,0xbe,0xf0,0x1, 0x7e,0xb3,0x4, 0xc1,0x78,0xb, 0x2e,0xb3, +0x4, 0xc6,0x12,0x0, 0x1a,0xf5,0x91,0x80,0x9, 0x2e,0xb3,0x4, 0xc6,0x12,0x3e,0x67, +0xf5,0x91,0xc2,0x91,0xda,0x79,0x22,0x7c,0x7b,0xbe,0x70,0x80,0x40,0xc, 0xbe,0x70, +0xde,0x38,0x7, 0xa, 0x37,0x9, 0xb3,0x3, 0xdd,0x22,0xa5,0xbf,0x0, 0x5, 0x7e,0xb3, +0x4, 0xc5,0x22,0x30,0x6, 0x6, 0x7e,0x24,0x4, 0x9d,0x80,0x4, 0x7e,0x24,0x4, 0xaf, +0x7a,0x25,0x4b,0x7c,0xb7,0x14,0xbe,0xb0,0xe, 0x50,0x4c,0x7e,0xa0,0x3, 0xa4,0x90, +0x3e,0xa3,0x73,0x2, 0x3e,0xcd,0x2, 0x3e,0xd5,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x2, +0x3e,0xdd,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x2, 0x3e, +0xdd,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x2, 0x3e,0xdd,0x7e,0x35,0x4b, +0x9, 0xb3,0x0, 0x4, 0x22,0x7e,0x35,0x4b,0x9, 0xb3,0x0, 0x3, 0x22,0xa, 0x37,0x2e, +0x35,0x4b,0x9, 0xb3,0x0, 0x2, 0x22,0x74,0xff,0x22,0x75,0x4f,0x0, 0xc2,0x1, 0x7e, +0xb3,0x4, 0x82,0x70,0x7, 0x7e,0xb3,0x0, 0x7e,0xf5,0x50,0x22,0x7e,0xb3,0x0, 0x80, +0xf5,0x50,0x22,0x7c,0xbf,0x2e,0xb3,0x4, 0xc6,0x24,0xfe,0x7e,0x71,0x91,0x22,0x7c, +0xab,0x24,0x0, 0x78,0x5, 0x7e,0xb3,0x4, 0xc5,0x22,0xbe,0xa0,0xae,0x38,0xc, 0x7e, +0xb3,0x4, 0x99,0xb4,0x3, 0x24,0x7c,0xba,0x2, 0x27,0xec,0xbe,0xa0,0xb0,0x40,0x1a, +0xbe,0xa0,0xf7,0x38,0x15,0x7e,0xb3,0x4, 0x99,0xb4,0x3, 0xe, 0xa, 0x3a,0x2e,0x34, +0x3, 0x93,0x9e,0x34,0x0, 0xb0,0x7e,0x39,0xb0,0x22,0x7c,0xba,0x22,0x7e,0xb3,0x4, +0xc6,0x12,0x3f,0xf, 0xf5,0x91,0x22,0x7e,0xb3,0x4, 0xc6,0x12,0x3e,0x67,0xf5,0x91, +0x22,0x7e,0xb3,0x4, 0xc6,0x12,0x0, 0x1a,0xf5,0x91,0x22,0x12,0x3c,0xad,0x7e,0x34, +0x0, 0x64,0x7a,0x37,0x0, 0x5d,0x2, 0x3f,0x79,0x7e,0x34,0x4, 0x5d,0x7e,0xb3,0x4, +0x9c,0x30,0xe0,0x77,0x54,0xfe,0x7a,0xb3,0x4, 0x9c,0x9, 0x53,0x0, 0x5, 0x7a,0x53, +0x0, 0x88,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x0, 0x86, +0x9, 0x53,0x0, 0x25,0xa, 0x25,0x7a,0x27,0x0, 0x7b,0x9, 0x53,0x0, 0x6, 0x7a,0x53, +0x0, 0x7d,0x9, 0x53,0x0, 0x8, 0x7a,0x53,0x0, 0x7f,0xbe,0x50,0xf, 0x40,0x6, 0x74, +0xe, 0x19,0xb3,0x0, 0x8, 0x9, 0x53,0x0, 0x8, 0xa, 0x25,0x2e,0x24,0x2, 0xbe,0x12, +0x56,0x8f,0x93,0x7a,0xb3,0x0, 0x7e,0x9, 0x53,0x0, 0x9, 0x7a,0x53,0x0, 0x81,0x7a, +0x53,0x0, 0x80,0x9, 0x53,0x0, 0x7, 0x7a,0x53,0x0, 0x82,0x9, 0x53,0x0, 0x24,0x7a, +0x53,0x0, 0x83,0x9, 0x73,0x0, 0x2e,0x7a,0x73,0x0, 0xd8,0x22,0xca,0x79,0x6d,0x77, +0x7a,0x77,0x0, 0xa2,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x0, 0x5d,0x12,0x27,0xd0,0x12, +0x22,0x82,0x12,0x26,0xf9,0x7a,0x77,0x0, 0xa2,0x7e,0x34,0x0, 0x64,0x7a,0x37,0x0, +0x5d,0xda,0x79,0x22,0x6c,0x77,0xa, 0x27,0x9, 0x62,0x0, 0xe0,0x19,0x62,0x0, 0xe2, +0xb, 0x70,0xbe,0x70,0x2, 0x40,0xef,0x7e,0x73,0x0, 0x9f,0x7a,0x73,0x0, 0xa0,0x7e, +0x73,0x0, 0x79,0x12,0x27,0xbc,0x4c,0x7b,0x7a,0x73,0x0, 0x79,0x7e,0x73,0x0, 0x7a, +0x12,0x27,0xbc,0x4c,0x7b,0x7a,0x73,0x0, 0x7a,0x22,0x74,0x5, 0x7a,0xb3,0x2, 0x40, +0x74,0x5, 0x7a,0xb3,0x2, 0x3f,0x74,0xf, 0x7a,0xb3,0x2, 0x41,0x74,0x5, 0x7a,0xb3, +0x2, 0x43,0x74,0x5, 0x7a,0xb3,0x2, 0x42,0x74,0xf, 0x7a,0xb3,0x2, 0x44,0x7e,0x34, +0x0, 0x32,0x7a,0x37,0x2, 0x10,0x7e,0xb3,0x2, 0x5f,0x44,0x1, 0x7a,0xb3,0x2, 0x5f, +0x74,0x2, 0x7a,0xb3,0x2, 0x36,0x7e,0xb3,0x2, 0x5f,0x30,0xe0,0x10,0x74,0x2, 0x7a, +0xb3,0x2, 0x37,0x74,0x4, 0x7a,0xb3,0x2, 0x38,0x74,0x2, 0x80,0xe, 0x74,0x1, 0x7a, +0xb3,0x2, 0x37,0x74,0x1, 0x7a,0xb3,0x2, 0x38,0x74,0x1, 0x7a,0xb3,0x2, 0x39,0x7e, +0x34,0x2a,0xf8,0x7a,0x37,0x2, 0x14,0x7e,0xb3,0x2, 0x5f,0x54,0xfd,0x7a,0xb3,0x2, +0x5f,0x7e,0x34,0xfc,0x18,0x7a,0x37,0x2, 0x12,0x12,0x43,0x0, 0x7e,0x34,0x0, 0x32, +0x7a,0x37,0x2, 0x16,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x2, 0x18,0x7e,0x34,0xf, 0xa0, +0x7a,0x37,0x2, 0x1a,0x7e,0xb3,0x2, 0x5f,0x44,0x8, 0x7a,0xb3,0x2, 0x5f,0x7e,0x34, +0x1, 0x90,0x7a,0x37,0x2, 0x4f,0x7e,0x34,0x1, 0xa0,0x7a,0x37,0x2, 0x51,0x7e,0x34, +0x1, 0x64,0x7a,0x37,0x2, 0x53,0x7e,0x34,0x1, 0x74,0x7a,0x37,0x2, 0x55,0x7e,0xb3, +0x2, 0x5f,0x44,0x10,0x7a,0xb3,0x2, 0x5f,0x7e,0x34,0x1, 0x3a,0x7a,0x37,0x2, 0x57, +0x7e,0x34,0x1, 0x84,0x7a,0x37,0x2, 0x59,0x7e,0x34,0x1, 0x8a,0x7a,0x37,0x2, 0x5b, +0x7e,0x34,0x1, 0x90,0x7a,0x37,0x2, 0x1c,0x7e,0x34,0x0, 0x82,0x7a,0x37,0x2, 0x1e, +0x7e,0x34,0x0, 0x80,0x7a,0x37,0x2, 0x20,0x7e,0x34,0x0, 0x85,0x7a,0x37,0x2, 0x22, +0x7e,0x34,0x0, 0x85,0x7a,0x37,0x2, 0x24,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x2, 0x26, +0x7e,0x34,0x0, 0x50,0x7a,0x37,0x2, 0x28,0x7e,0x34,0x0, 0x50,0x7a,0x37,0x2, 0x2a, +0x7e,0x34,0x0, 0x64,0x7a,0x37,0x2, 0x2c,0x7e,0x34,0x2, 0xbc,0x7a,0x37,0x2, 0x2e, +0xe4,0x7a,0xb3,0x2, 0x45,0x7a,0xb3,0x2, 0x46,0x74,0x5a,0x7a,0xb3,0x2, 0x5d,0x74, +0x32,0x7a,0xb3,0x2, 0x5e,0x7e,0xb3,0x2, 0x5f,0x44,0x20,0x7a,0xb3,0x2, 0x5f,0x44, +0x40,0x7a,0xb3,0x2, 0x5f,0x7e,0x34,0x0, 0x7, 0x7a,0x37,0x2, 0x32,0x7e,0x34,0x0, +0x6, 0x7a,0x37,0x2, 0x30,0x7e,0x34,0x16,0xc1,0x7a,0x37,0x2, 0x34,0x75,0x2f,0x20, +0x7e,0x34,0x1, 0xe0,0x7a,0x35,0x2b,0x7e,0x24,0x3, 0x20,0x7a,0x25,0x2d,0x75,0x23, +0x9, 0x75,0x24,0x4, 0x75,0x25,0x7, 0x75,0x26,0x4, 0x75,0x27,0x7, 0x75,0x28,0x4, +0x75,0x29,0x9, 0x75,0x2a,0x4, 0x75,0x30,0xa, 0x75,0x31,0xa, 0x75,0x32,0x14,0x75, +0x33,0x14,0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x4, 0x27,0x7e,0x34,0x7, 0xd0,0x7a,0x37, +0x4, 0x1d,0x7a,0x27,0x4, 0x25,0x74,0x10,0x7a,0xb3,0x4, 0x1f,0x74,0x14,0x7a,0xb3, +0x4, 0x20,0x7e,0x24,0x6, 0x40,0x7a,0x27,0x4, 0x58,0x74,0xe, 0x7a,0xb3,0x4, 0x18, +0x74,0x3, 0x7a,0xb3,0x4, 0x21,0x74,0xa, 0x7a,0xb3,0x4, 0x19,0x74,0x19,0x7a,0xb3, +0x4, 0x24,0x74,0x28,0x7a,0xb3,0x4, 0x5a,0x74,0x1, 0x7a,0xb3,0x4, 0x57,0x74,0x6, +0x7a,0xb3,0x4, 0x16,0x7a,0x37,0x4, 0x29,0x7e,0x34,0x0, 0x23,0x7e,0x14,0x0, 0x34, +0x74,0x11,0x12,0x1, 0x19,0x7e,0x34,0x0, 0x5f,0x7e,0x24,0x0, 0xec,0x2, 0x42,0x70, +0x7e,0xa1,0x40,0x7a,0xa3,0x4, 0x1c,0x7e,0x15,0x3c,0x7a,0x17,0x4, 0x2f,0x7e,0x15, +0x3e,0x7a,0x17,0x4, 0x31,0xe5,0x34,0x7a,0xb3,0x4, 0x2b,0xe5,0x35,0x7a,0xb3,0x4, +0x2c,0xe5,0x36,0x7a,0xb3,0x4, 0x2d,0xe5,0x37,0x7a,0xb3,0x4, 0x2e,0xe5,0x38,0x7a, +0xb3,0x4, 0x4, 0xe5,0x39,0x7a,0xb3,0x4, 0x5, 0xe5,0x3a,0x7a,0xb3,0x4, 0x6, 0xe5, +0x3b,0x7a,0xb3,0x4, 0x7, 0xe5,0x41,0x7a,0xb3,0x4, 0x1a,0xe5,0x42,0x7a,0xb3,0x4, +0x1b,0xe5,0x43,0x7a,0xb3,0x4, 0x22,0xe5,0x44,0x7a,0xb3,0x4, 0x23,0xa, 0x1a,0x7d, +0x1, 0x1e,0x4, 0x7a,0x13,0x4, 0x2, 0x1e,0x14,0x1e,0x14,0x7a,0x33,0x4, 0x3, 0x7a, +0x35,0x53,0x7a,0x25,0x51,0xe4,0x7a,0xb3,0x4, 0x50,0x7a,0xb3,0x3, 0xff,0x7a,0xb3, +0x4, 0x4f,0x22,0x7e,0xb3,0x2, 0x5f,0x44,0x4, 0x7a,0xb3,0x2, 0x5f,0x12,0x10,0x5d, +0x7e,0xb3,0x2, 0x5f,0x54,0xfb,0x7a,0xb3,0x2, 0x5f,0x22,0xe4,0x7a,0xb3,0x0, 0xd8, +0x74,0x1, 0x7a,0xb3,0x0, 0xdd,0x74,0x1b,0x7a,0xb3,0x0, 0xca,0x74,0x1d,0x7a,0xb3, +0x0, 0xcb,0x74,0x30,0x7a,0xb3,0x0, 0xcc,0x74,0x30,0x7a,0xb3,0x0, 0xcd,0x74,0x30, +0x7a,0xb3,0x0, 0xce,0x74,0x30,0x7a,0xb3,0x0, 0xcf,0x74,0x30,0x7a,0xb3,0x0, 0xd0, +0x74,0x30,0x7a,0xb3,0x0, 0xd1,0x74,0x30,0x7a,0xb3,0x0, 0xd2,0x74,0x30,0x7a,0xb3, +0x0, 0xd3,0x74,0x30,0x7a,0xb3,0x0, 0xd4,0x74,0x30,0x7a,0xb3,0x0, 0xd5,0x74,0x30, +0x7a,0xb3,0x0, 0xd6,0x74,0x30,0x7a,0xb3,0x0, 0xd7,0x12,0x43,0x86,0x74,0xa, 0x7a, +0xb3,0x0, 0xdc,0x74,0x14,0x7a,0xb3,0x0, 0xda,0x74,0x1e,0x7a,0xb3,0x0, 0xdb,0x74, +0x3, 0x7a,0xb3,0x0, 0xd9,0x22,0x12,0x43,0xa4,0xb4,0x48,0x3, 0xd2,0xf, 0x22,0xb4, +0xff,0x11,0x7e,0x34,0x0, 0x20,0x74,0x48,0x12,0x44,0xe8,0x12,0x43,0xa4,0xb4,0x48, +0x2, 0xd2,0xf, 0x22,0x7e,0x34,0x0, 0x20,0x12,0x44,0x95,0x75,0xf5,0x3, 0xa9,0x37, +0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0x2, 0x43,0xb9,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9, +0xd2,0xaf,0x22,0x12,0x44,0x95,0x75,0xf5,0x1, 0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5, +0xfc,0x2, 0x43,0xb9,0xca,0x79,0x7e,0xf0,0xd8,0x74,0x2e,0x7a,0xb3,0x4, 0x5d,0x74, +0xa0,0x7a,0xb3,0x4, 0x62,0x74,0x1, 0x7a,0xb3,0x4, 0x63,0x74,0x1e,0x7a,0xb3,0x4, +0x64,0x74,0xc, 0x7a,0xb3,0x4, 0x65,0x74,0x14,0x7a,0xb3,0x4, 0x66,0x74,0x6, 0x7a, +0xb3,0x4, 0x80,0x74,0x1, 0x7a,0xb3,0x4, 0x81,0xe4,0x7a,0xb3,0x4, 0x82,0x74,0x2, +0x7a,0xb3,0x4, 0x83,0x12,0x44,0xe1,0x7e,0x34,0x78,0x4, 0x12,0x43,0xc3,0x7c,0xeb, +0x7e,0x34,0x78,0x5, 0x12,0x43,0xc3,0xbe,0xe0,0xff,0x68,0x7, 0x6c,0xbe,0xb4,0xff, +0x2, 0x7c,0xfe,0x7a,0xf3,0x4, 0x85,0x74,0x4b,0x7a,0xb3,0x4, 0x86,0x74,0x1, 0x7a, +0xb3,0x4, 0x8c,0xe4,0x7a,0xb3,0x4, 0x8b,0x7a,0xb3,0x4, 0x8d,0x7e,0x34,0xb, 0xb8, +0x7a,0x37,0x0, 0xde,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x0, 0x86,0x74,0xa0,0x7a,0xb3, +0x0, 0x88,0x6d,0x33,0x7a,0x37,0x0, 0x7b,0x74,0x1, 0x7a,0xb3,0x0, 0x7d,0x74,0x8, +0x7a,0xb3,0x0, 0x7e,0x74,0xc, 0x7a,0xb3,0x0, 0x7f,0x74,0x14,0x7a,0xb3,0x0, 0x80, +0x74,0x14,0x7a,0xb3,0x0, 0x81,0x74,0x1e,0x7a,0xb3,0x0, 0x82,0x74,0x1, 0x7a,0xb3, +0x0, 0x83,0xda,0x79,0x22,0xc2,0xaf,0xd2,0xc9,0xa, 0x56,0xf5,0xf1,0x7c,0xb7,0xf5, +0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x22,0xca,0x79,0x7e,0xf0,0x70,0x7e,0x34,0x78, +0x0, 0x12,0x43,0xc3,0x7c,0xeb,0x7e,0x34,0x78,0x1, 0x12,0x43,0xc3,0xbe,0xe0,0xff, +0x68,0x7, 0x6c,0xbe,0xb4,0xff,0x2, 0x7c,0xfe,0xd2,0xce,0x7a,0xf1,0x92,0xd2,0xad, +0xd2,0xe8,0xc2,0xc0,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xd5,0xb7,0xd2,0xbd,0xda,0x79, +0x22,0x74,0x1, 0x7a,0xb3,0x4, 0x99,0x22,0x7c,0xab,0x7d,0x43,0x5e,0x80,0x7f,0xc2, +0xaf,0xd2,0xc9,0xa, 0x38,0x7c,0xb7,0xf5,0xf1,0x7c,0xb9,0xf5,0xf2,0x75,0xf3,0x80, +0x75,0xf4,0x1, 0x75,0xf5,0xa, 0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0x7a, +0xa1,0xf6,0x75,0xf6,0xff,0xa9,0x36,0xf5,0xfc,0x43,0xfa,0x80,0x75,0xfb,0x0, 0xc2, +0xc9,0xd2,0xaf,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x7e,0x35,0x5b,0xb, 0x34,0x7a,0x35,0x5b, +0xbe,0x34,0x3, 0xe8,0x40,0xe, 0x6d,0x33,0x7a,0x35,0x5b,0xe5,0x4e,0xbe,0xb0,0x64, +0x50,0x2, 0x5, 0x4e,0x7e,0x37,0x0, 0xa2,0xb, 0x34,0x7a,0x37,0x0, 0xa2,0x7e,0x37, +0x0, 0x5d,0xbe,0x37,0x0, 0xa2,0x28,0x3, 0x12,0x0, 0x8, 0x7e,0xb3,0x4, 0x99,0xb4, +0xaa,0x15,0x7e,0x37,0x0, 0x84,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x0, 0x84,0xbe,0x34, +0x1, 0x2c,0x28,0x3, 0x12,0x44,0xe1,0xe5,0x50,0xbe,0xb1,0x4f,0x28,0x4, 0x5, 0x4f, +0x80,0x2, 0xd2,0x1, 0x7e,0xb3,0x4, 0xc2,0x60,0xf, 0xbe,0xb0,0x28,0x50,0x7, 0x4, +0x7a,0xb3,0x4, 0xc2,0x80,0x3, 0x12,0x3d,0x35,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0xf8, +0x7c,0xab,0xc2,0xb, 0x4d,0x33,0x68,0x77,0x4d,0x22,0x68,0x73,0xc2,0xe, 0x6c,0xff, +0x6c,0x33,0x80,0x57,0x7e,0x10,0x4, 0xac,0x13,0x2d,0x3, 0x49,0xd0,0x0, 0x2, 0xb, +0x8, 0xc0,0xbe,0x6c,0xf8,0x30,0x58,0x3a,0xa, 0x43,0x2e,0x44,0x5, 0x14,0x7e,0x49, +0xb0,0x4, 0x7a,0x49,0xb0,0xb, 0xf0,0xa, 0x3, 0x9, 0x20,0x5, 0x14,0xbe,0x20,0xf, +0x28,0x27,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0xf0,0x7d,0xf, 0x1a,0x0, +0x1a,0xe0,0x2f,0x76,0xbe,0x78,0x32,0xc8,0x58,0x4, 0xd2,0xe, 0x80,0x4, 0xd2,0xb, +0x80,0x0, 0xe4,0xa, 0x43,0x19,0xb4,0x5, 0x14,0xb, 0x30,0xbc,0xa3,0x38,0xa5,0x20, +0xe, 0x6, 0x30,0xb, 0x3, 0x12,0xf, 0xfb,0xbe,0xf0,0x4, 0x38,0x2, 0xc2,0xe, 0xda, +0xf8,0x22,0xbe,0xb0,0x3e,0x38,0x2e,0xbe,0xb0,0x26,0x68,0x29,0xbe,0xb0,0x2f,0x68, +0x24,0xbe,0xb0,0x23,0x68,0x1f,0xbe,0xb0,0x28,0x68,0x1a,0xbe,0xb0,0x21,0x68,0x15, +0xbe,0xb0,0x22,0x68,0x10,0xa, 0x2b,0x19,0x72,0x4, 0x5d,0x7e,0xb3,0x4, 0x9c,0x44, +0x1, 0x7a,0xb3,0x4, 0x9c,0x22,0xca,0x69,0xca,0xf8,0x7c,0xf7,0xbe,0xb0,0x80,0x40, +0xb, 0xbe,0xb0,0xde,0x38,0x6, 0x24,0x80,0x7c,0x7f,0xe1,0x12,0x24,0x0, 0x68,0x2, +0xe1,0x15,0x7e,0x64,0x4, 0xc5,0x7a,0x69,0xf0,0x5e,0xf0,0x70,0x7c,0xbf,0xc4,0x54, +0xf, 0x7c,0xfb,0xbe,0xf0,0x4, 0x78,0x15,0x7e,0xb3,0x4, 0x99,0xb4,0x3, 0x7, 0x74, +0x2, 0x7e,0x70,0x3, 0x80,0x36,0x74,0x3c,0x7e,0x70,0x3, 0x80,0x55,0x7e,0xb3,0x4, +0x99,0xb4,0x3, 0x2d,0x74,0x2, 0x7e,0x70,0x1, 0x12,0x37,0xc4,0xbe,0xf0,0x1, 0x78, +0x6, 0x74,0x2, 0x6c,0x77,0x80,0x15,0x4c,0xff,0x78,0x7, 0x74,0x2, 0x7e,0x70,0x1, +0x80,0xa, 0xbe,0xf0,0x3, 0x78,0x2e,0x74,0x2, 0x7e,0x70,0x4, 0x12,0x37,0xc4,0x80, +0x24,0xbe,0xf0,0x1, 0x78,0x6, 0x74,0x3c,0x6c,0x77,0x80,0x16,0xbe,0xf0,0x4, 0x78, +0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80,0xa, 0xbe,0xf0,0x3, 0x78,0x8, 0x74,0x3c,0x7e, +0x70,0x4, 0x12,0x46,0x42,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x7c,0x6b,0x14,0x68, +0x7a,0x4, 0x68,0x2, 0xe1,0xa8,0x7e,0x74,0x4, 0xc5,0x7a,0x79,0x70,0x5e,0x70,0x70, +0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0x7b,0xbe,0x70,0x4, 0x68,0x47,0x7e,0xb3,0x4, 0x99, +0xb4,0x3, 0x20,0xa5,0xbf,0x1, 0x6, 0x74,0x2, 0x6c,0x77,0x80,0x69,0xa5,0xbf,0x0, +0x7, 0x74,0x2, 0x7e,0x70,0x1, 0x80,0x5e,0xa5,0xbf,0x3, 0x75,0x74,0x2, 0x7e,0x70, +0x4, 0x80,0x53,0xa5,0xbf,0x1, 0x6, 0x74,0x3c,0x6c,0x77,0x80,0x29,0xa5,0xbf,0x4, +0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80,0x1e,0xa5,0xbf,0x3, 0x55,0x74,0x3c,0x7e,0x70, +0x4, 0x80,0x13,0x7e,0xb3,0x4, 0x99,0xb4,0x3, 0x7, 0x74,0x2, 0x7e,0x70,0x3, 0x80, +0x25,0x74,0x3c,0x7e,0x70,0x3, 0x12,0x46,0x42,0x80,0x36,0x7a,0x73,0x4, 0xc4,0x7e, +0x34,0x3, 0x93,0x7a,0x35,0x49,0x80,0x29,0xbe,0x60,0xa, 0x50,0xe, 0x7e,0xb3,0x4, +0x99,0xb4,0x3, 0x1d,0x7c,0xb6,0x12,0x37,0xc4,0x80,0x16,0xbe,0x60,0xa, 0x40,0x11, +0xbe,0x60,0xaf,0x38,0xc, 0x7e,0xb3,0x4, 0x99,0xb4,0x3, 0x5, 0x7c,0xb6,0x12,0x37, +0xd6,0xda,0x79,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xe5,0xcc,0x54,0x7, 0x68,0x3, 0x75,0xcc, +0x50,0x12,0x3d,0x8c,0x74,0x1, 0x7a,0xb3,0x4, 0xc2,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c, +0xa7,0x24,0x0, 0x78,0x7, 0x7e,0x34,0x4, 0xc5,0x7a,0x39,0xa0,0x22,0xca,0xb8,0xa9, +0xc0,0x93,0xe4,0x7a,0xb3,0x4, 0xc1,0x7a,0xb3,0x4, 0xc3,0xda,0xb8,0x32,0x6c,0xaa, +0x74,0xff,0xa, 0x4a,0x19,0xb4,0x4, 0x9d,0x74,0xff,0x19,0xb4,0x4, 0xaf,0xb, 0xa0, +0xbe,0xa0,0x12,0x40,0xeb,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x3b,0xe6,0x7e,0xb3,0x4, +0xc5,0x54,0xfd,0x7a,0xb3,0x4, 0xc5,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda, +0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xd2,0xcf,0xbe,0xb0, +0x7, 0x38,0x4, 0x7c,0xab,0x80,0x2, 0x6c,0xaa,0x4e,0xa0,0x50,0x7a,0xa1,0xcc,0x0, +0x0, 0x0, 0x0, 0xa9,0xd0,0xca,0xa9,0xc5,0xca,0x53,0xca,0xe1,0x43,0xca,0x14,0x75, +0xcb,0x2, 0xc2,0xcc,0xd2,0xcb,0xc2,0xca,0xc2,0xc9,0xc2,0xc8,0x0, 0x0, 0x0, 0x0, +0x22,0xa9,0xd1,0x99,0x75,0x9a,0xfe,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x74,0x20,0x7a, +0xb3,0x4, 0x7e,0x74,0xd, 0x7a,0xb3,0x4, 0x7f,0xe4,0x6c,0xaa,0x12,0x48,0xd2,0x40, +0xfb,0x22,0xa, 0x4a,0x19,0xb4,0x2, 0x3a,0xb, 0xa0,0xbe,0xa0,0x5, 0x22,0x74,0xff, +0x6c,0xaa,0x12,0x48,0xd2,0x40,0xfb,0x22,0x6c,0x22,0x80,0x9, 0x12,0x49,0xad,0x70, +0x2, 0x21,0x8f,0xb, 0x20,0x7e,0x33,0x2, 0x62,0xbc,0x32,0x38,0xef,0x7e,0xb3,0x2, +0x5f,0x30,0xe1,0x2, 0x21,0x8f,0x6c,0x22,0x80,0x7b,0x12,0x49,0xad,0xb4,0x1, 0x73, +0x7e,0x33,0x2, 0x60,0xbc,0x32,0x28,0x24,0x12,0x49,0x9f,0x7e,0x33,0x2, 0x41,0xa, +0x33,0x7d,0x53,0x1a,0x4a,0x1a,0x48,0xbf,0x72,0x8, 0x6, 0x7e,0x33,0x2, 0x3f,0x80, +0x22,0x12,0x49,0x92,0x58,0x4d,0x7e,0x33,0x2, 0x40,0x80,0x34,0x12,0x49,0x9f,0x7e, +0x33,0x2, 0x44,0xa, 0x33,0x7d,0x53,0x1a,0x4a,0x1a,0x48,0xbf,0x72,0x8, 0x18,0x7e, +0x33,0x2, 0x42,0xa, 0x43,0x74,0x2, 0xac,0xb2,0x2e,0x54,0x1, 0xc8,0xb, 0x58,0x0, +0x2d,0x4, 0x1b,0x58,0x0, 0x80,0x1c,0x12,0x49,0x92,0x58,0x17,0x7e,0x33,0x2, 0x43, +0xa, 0x3, 0x7e,0x50,0x2, 0xac,0x52,0x2e,0x24,0x1, 0xc8,0xb, 0x28,0x30,0x9d,0x30, +0x1b,0x28,0x30,0xb, 0x20,0x7e,0x33,0x2, 0x62,0xbc,0x32,0x28,0x2, 0x21,0xa, 0x2, +0x48,0xde,0x6e,0x34,0xff,0xff,0xb, 0x34,0x1a,0x26,0x1a,0x24,0xbf,0x71,0x22,0x7e, +0x50,0x4, 0xac,0x52,0x49,0xf2,0x0, 0xee,0x49,0xe2,0x0, 0xec,0x22,0x7e,0x34,0x2, +0x3a,0x7c,0xb2,0x7c,0x3b,0x7d,0x43,0x4d,0x44,0x68,0x5, 0xbe,0x30,0x24,0x40,0x3, +0x74,0x1, 0x22,0xa, 0x33,0x12,0xf, 0xf4,0x7c,0xb5,0x7e,0x34,0x0, 0x1, 0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7c,0xa7,0xa, 0x33,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x2d, +0x34,0x7e,0x39,0xb0,0x5c,0xba,0x68,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7c,0xa5,0x7c, +0x2b,0x7d,0x43,0x4d,0x44,0x68,0x45,0xbe,0x20,0x24,0x50,0x40,0xa, 0x32,0x12,0xf, +0xf4,0x7c,0x75,0x7e,0x24,0x0, 0x1, 0x7c,0xb7,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb, +0x7c,0x35,0x7c,0xb7,0x60,0x5, 0x3e,0xa0,0x14,0x78,0xfb,0x6e,0x30,0xff,0xa, 0x32, +0x1e,0x34,0x1e,0x34,0x1e,0x34,0x7d,0x23,0x2d,0x24,0x7e,0x29,0xb0,0x5c,0xb3,0x7a, +0x29,0xb0,0x2d,0x34,0x7e,0x39,0xb0,0x4c,0xba,0x7a,0x39,0xb0,0x22,0xca,0x79,0x7d, +0x73,0x12,0x4a,0x86,0x7e,0x1f,0x1, 0x6c,0xbf,0x1, 0x18,0xb, 0x7e,0x34,0x2, 0x3a, +0x74,0x20,0x6c,0x55,0x12,0x49,0xed,0x12,0x4a,0x86,0x7e,0x1f,0x1, 0x70,0xbf,0x1, +0x18,0xb, 0x7e,0x34,0x2, 0x3a,0x74,0x21,0x6c,0x55,0x12,0x49,0xed,0x12,0x4a,0x86, +0x7e,0x1f,0x1, 0x74,0xbf,0x1, 0x18,0xb, 0x7e,0x34,0x2, 0x3a,0x74,0x22,0x6c,0x55, +0x12,0x49,0xed,0xda,0x79,0x22,0x7d,0x17,0x1a,0x2, 0x1a,0x0, 0x22,0xca,0x3b,0x6c, +0xaa,0x7e,0x73,0x0, 0x79,0x5e,0x70,0xf, 0x7e,0x44,0x0, 0xec,0x7e,0x24,0x0, 0x5f, +0x6c,0x66,0x80,0x64,0x75,0x23,0xff,0xa, 0xf6,0x2d,0xf2,0x7e,0xf9,0x20,0x7e,0x30, +0x4, 0xac,0x23,0x7d,0xe1,0x2d,0xe4,0x49,0x1e,0x0, 0x2, 0xb, 0xe8,0x0, 0xa, 0x76, +0xb, 0x74,0x80,0x24,0xa, 0xef,0x2d,0xe2,0x7e,0xe9,0xe0,0x7e,0xd0,0x4, 0xac,0xde, +0x7d,0xe6,0x2d,0xe4,0x49,0xde,0x0, 0x2, 0xb, 0xe8,0xc0,0xbf,0x6, 0x58,0x7, 0x7c, +0xae,0x7a,0xf1,0x23,0x7f,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xd8,0xe5,0x23,0xbe,0xb0, +0xff,0x68,0x13,0x7e,0xf9,0xe0,0xe5,0x23,0xa, 0xfb,0x2d,0xf2,0x7a,0xf9,0xe0,0xa, +0xf6,0x2d,0xf2,0x7a,0xf9,0xa0,0xb, 0x60,0xbc,0x76,0x38,0x98,0xda,0x3b,0x22,0xca, +0xf8,0x12,0x0, 0x2e,0x70,0x2, 0x81,0x66,0x7e,0x33,0x2, 0x60,0x7c,0xa3,0x1e,0xa0, +0x1e,0x30,0x1e,0x30,0x6c,0xff,0x7e,0xf7,0x0, 0xde,0x6d,0xee,0x7e,0x1f,0x1, 0xc4, +0xbf,0x17,0x58,0x2, 0x81,0x4c,0x6c,0x22,0x81,0x42,0xa, 0x3a,0x1b,0x34,0xa, 0x2, +0xbd,0x3, 0xa, 0x3a,0x18,0x4, 0x2d,0x3, 0x80,0x2, 0x9d,0x3, 0x7c,0xb1,0xf5,0x23, +0xa, 0x2a,0xa, 0x32,0x12,0x0, 0x46,0x7c,0xb5,0x7a,0xb3,0x2, 0xc9,0x7e,0x90,0x4, +0xac,0x92,0x49,0xd4,0x0, 0xee,0x49,0xc4,0x0, 0xec,0x7e,0x37,0x0, 0xde,0x7d,0xf3, +0x1e,0xf4,0x6d,0xee,0xbf,0x67,0x58,0x2, 0x81,0x40,0x7e,0x43,0x2, 0xc9,0x7e,0x50, +0x4, 0xac,0x45,0x49,0xf2,0x1, 0x7e,0x49,0xe2,0x1, 0x7c,0x6d,0x22,0xbf,0x71,0x58, +0x2, 0x81,0x40,0x12,0x4c,0x69,0x49,0xf0,0x0, 0xee,0x49,0xe0,0x0, 0xec,0xa, 0x23, +0xa, 0x32,0x12,0x0, 0x46,0x4d,0x22,0x78,0x8, 0x9f,0x55,0x7a,0x5f,0x2, 0xb9,0x80, +0x14,0x49,0xb4,0x0, 0xea,0x49,0xa4,0x0, 0xe8,0x7a,0x5f,0x2, 0xb9,0x49,0xb0,0x0, +0xea,0x49,0xa0,0x0, 0xe8,0x7a,0x5f,0x2, 0xc1,0xa, 0x3, 0x1b,0x4, 0xbd,0x2, 0x78, +0x8, 0x9f,0x11,0x7a,0x1f,0x2, 0xbd,0x80,0x1c,0x7e,0x10,0x4, 0xac,0x12,0x49,0x30, +0x0, 0xf2,0x49,0x20,0x0, 0xf0,0x7a,0x1f,0x2, 0xbd,0x12,0x4c,0x69,0x49,0x30,0x0, +0xf2,0x49,0x20,0x0, 0xf0,0x7a,0x1f,0x2, 0xc5,0x7e,0x1f,0x2, 0xb9,0xbf,0x61,0x48, +0x3f,0x7e,0x1f,0x2, 0xbd,0xbf,0x61,0x48,0x37,0xbf,0x67,0x48,0x33,0x7e,0x1f,0x2, +0xc5,0xbf,0x61,0x48,0x2b,0x7e,0x1f,0x2, 0xc1,0xbf,0x61,0x48,0x23,0xa, 0xf, 0x19, +0x20,0x0, 0x5f,0xb, 0xf0,0x7e,0x10,0x4, 0xac,0x12,0x2e,0x4, 0x0, 0xec,0x12,0x1f, +0xd7,0xb, 0x1c,0x12,0xf, 0x8e,0xbe,0xf0,0x4, 0x40,0x5, 0x7e,0xf0,0x4, 0x80,0xc, +0xb, 0x20,0x7e,0xb3,0x2, 0x60,0xbc,0xb2,0x28,0x2, 0x61,0x3a,0x7c,0x6f,0x12,0x4c, +0x71,0x12,0xf, 0x75,0x7c,0x6f,0x5e,0x60,0xf, 0x7e,0x73,0x0, 0x7a,0x5e,0x70,0xf0, +0x4c,0x76,0x7a,0x73,0x0, 0x7a,0xda,0xf8,0x22,0x7e,0x11,0x23,0x74,0x4, 0xac,0x1b, +0x22,0x5e,0x60,0xf, 0x7e,0x73,0x0, 0x79,0x22,0xca,0x79,0x7f,0x1, 0x7c,0xab,0x7e, +0xf7,0x2, 0x1c,0x7e,0x24,0x0, 0x2, 0x7d,0x3f,0x12,0x0, 0x46,0x7d,0xe3,0x7e,0xb3, +0x5, 0x5e,0xa, 0x2b,0xa, 0x3a,0x12,0x0, 0x46,0x7c,0xe5,0x7e,0xf3,0x5, 0x5f,0xbc, +0xfe,0x28,0x15,0x7e,0x73,0x2, 0x45,0x12,0x17,0x98,0x48,0x6, 0x7e,0x47,0x2, 0x20, +0x80,0x19,0x7e,0x47,0x2, 0x1e,0x80,0x13,0x7e,0x73,0x2, 0x46,0x12,0x17,0x98,0x48, +0x6, 0x7e,0x47,0x2, 0x24,0x80,0x4, 0x7e,0x47,0x2, 0x22,0x7d,0x34,0x7d,0xd4,0x1a, +0x36,0x1a,0xc6,0x7f,0x10,0x9f,0x16,0x12,0x4d,0x16,0x12,0x0, 0x78,0x7d,0x54,0x3e, +0x54,0x1a,0x4a,0x1a,0x48,0x12,0x4d,0x16,0x9f,0x2, 0x12,0x0, 0xe5,0x7f,0x1, 0xbe, +0x8, 0x0, 0x0, 0x58,0x4, 0x9f,0x0, 0x80,0xc, 0x7d,0x3f,0x12,0x17,0xa0,0x48,0x5, +0x12,0x4d,0x16,0x1b,0xc, 0xbc,0xfe,0x38,0x8, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x2f, +0x1, 0x7f,0x10,0xda,0x79,0x22,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x22,0x7e,0x73,0x2, +0x60,0xa, 0x37,0x1e,0x34,0x7a,0x73,0x5, 0x5e,0xa, 0x37,0x1e,0x34,0x7a,0x73,0x5, +0x5f,0x22,0xca,0x3b,0x7c,0x27,0x7c,0x3b,0x7e,0x93,0x5, 0x5f,0xa, 0xa9,0xa, 0x83, +0x12,0x4e,0x5c,0x7c,0x15,0xa, 0x92,0x12,0x4e,0x55,0x7c,0x85,0x7a,0x81,0x2c,0x7e, +0xa3,0x5, 0x5e,0xa, 0xaa,0x12,0x4e,0x5c,0x7c,0x5, 0x12,0x4e,0x55,0x7c,0x25,0xbc, +0x81,0x78,0x5b,0x7e,0xd0,0x4, 0xac,0xd0,0x49,0xd6,0x1, 0x7e,0x49,0xc6,0x1, 0x7c, +0x7e,0xf0,0x4, 0xac,0xf2,0x49,0xf7,0x1, 0x7e,0x49,0xe7,0x1, 0x7c,0x4c,0x11,0x68, +0x14,0x49,0x36,0x1, 0x7a,0x49,0x26,0x1, 0x78,0x2f,0x61,0x49,0x37,0x1, 0x7a,0x49, +0x27,0x1, 0x78,0x2f,0x71,0x7c,0xb9,0x14,0xbc,0xb1,0x78,0x2, 0xc1,0x20,0x7e,0x10, +0x4, 0xac,0x1, 0x49,0x30,0x1, 0x82,0x49,0x20,0x1, 0x80,0x2f,0x61,0x7e,0x10,0x4, +0xac,0x12,0x49,0x30,0x1, 0x82,0x49,0x20,0x1, 0x80,0x2f,0x71,0x80,0x62,0xa, 0x31, +0xa, 0xa0,0x9d,0xa3,0x7d,0x3a,0x7c,0x7, 0xe5,0x2c,0xa, 0x3b,0xa, 0xa2,0x9d,0xa3, +0x7d,0x3a,0x7c,0x27,0xe5,0x2c,0xa, 0x3b,0xa, 0x20,0x2d,0x23,0x3e,0x24,0x3e,0x24, +0x49,0xf2,0x1, 0x7e,0x49,0xe2,0x1, 0x7c,0xa, 0xa1,0xa, 0x20,0x2d,0x2a,0x3e,0x24, +0x3e,0x24,0x49,0xd2,0x1, 0x7e,0x49,0xc2,0x1, 0x7c,0x2f,0x67,0xa, 0xa2,0x2d,0xa3, +0x3e,0xa4,0x3e,0xa4,0x49,0x3a,0x1, 0x7e,0x49,0x2a,0x1, 0x7c,0xa, 0x1, 0xa, 0xa2, +0x2d,0xa0,0x3e,0xa4,0x3e,0xa4,0x49,0xfa,0x1, 0x7e,0x49,0xea,0x1, 0x7c,0x2f,0x71, +0xb, 0x6c,0xb, 0x7c,0xbc,0xa3,0x7e,0x37,0x2, 0x2a,0x1a,0x26,0x38,0x7, 0x12,0x4e, +0x63,0x7f,0x17,0x80,0x5, 0x12,0x4e,0x63,0x7f,0x16,0x12,0x0, 0x78,0x7f,0x6, 0x2f, +0x7, 0x12,0x0, 0xe5,0x7d,0xb3,0x7e,0xa7,0x2, 0x1c,0x9e,0xa7,0x2, 0x28,0x2d,0xba, +0x7d,0x3b,0xda,0x3b,0x22,0x7d,0x39,0x7d,0x2a,0x2, 0x0, 0x46,0x7d,0x38,0x7d,0x2a, +0x2, 0x0, 0x46,0x1a,0x24,0x7e,0x17,0x2, 0x28,0x1a,0x2, 0x1a,0x0, 0x2f,0x1, 0x22, +0x7c,0x23,0x7c,0x3b,0xa5,0xba,0x97,0x24,0xbe,0x30,0x1c,0x50,0x4, 0x7c,0x23,0x80, +0x3, 0x7e,0x20,0x1c,0x6c,0xaa,0x80,0xf, 0x12,0x4e,0xab,0xa, 0x4b,0x2e,0x44,0x2, +0x82,0x12,0x4e,0xb1,0x12,0x4e,0xba,0xbc,0x2a,0x38,0xed,0x22,0x6c,0xaa,0x80,0x6, +0x12,0x4e,0xab,0x12,0x4e,0xba,0xbc,0x3a,0x38,0xf6,0x22,0xa, 0xa, 0x7d,0x40,0x2d, +0x43,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x22,0x2d,0x2, 0x7a,0x9, 0xb0,0xb, +0xa0,0x22,0xca,0x59,0xc2,0xae,0x30,0xa, 0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e,0xa0, +0x2, 0xe5,0xe6,0x5c,0xba,0x68,0x5, 0x75,0xe6,0x0, 0xd2,0x9, 0xd2,0xae,0xda,0x59, +0x32,0xca,0x3b,0x7e,0x67,0x2, 0xb6,0x7e,0xb3,0x2, 0xaf,0x30,0xe7,0x5, 0x7e,0xf0, +0x2, 0x80,0x2, 0x6c,0xff,0x6c,0xee,0x80,0x15,0xa, 0x3e,0x9, 0x73,0x2, 0x87,0x2d, +0x36,0x7e,0x39,0x70,0x7a,0x71,0x24,0x7c,0xbf,0x24,0xb, 0x12,0x4f,0x1d,0x12,0x4f, +0x16,0x38,0xe6,0xda,0x3b,0x22,0x7e,0x73,0x2, 0x62,0xbc,0x7e,0x22,0x12,0x0, 0x25, +0xb, 0xe0,0xb, 0xf0,0x22,0xca,0x3b,0x7e,0xb3,0x2, 0xb5,0x20,0xe7,0x45,0x7e,0xb3, +0x2, 0xaf,0x30,0xe7,0x5, 0x7e,0xf0,0x2, 0x80,0x2, 0x6c,0xff,0x7e,0x67,0x2, 0xb6, +0x6c,0xee,0x80,0x2a,0xa, 0x3e,0x9, 0x73,0x2, 0x87,0x2d,0x36,0x7e,0x39,0xb0,0xf5, +0x24,0x7e,0xb3,0x5, 0x13,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0xb7,0x42,0x24,0x7c,0xbf,0x24,0xb, 0x7e,0x71,0x24,0x12,0x4f,0x1d,0x12,0x4f, +0x16,0x38,0xd1,0xda,0x3b,0x22,0xca,0x79,0x12,0x0, 0x2e,0x60,0x78,0x7e,0xb3,0x2, +0xb5,0x20,0xe7,0x71,0x7e,0xb3,0x2, 0x5f,0x30,0xe0,0x2, 0x80,0x7, 0x7e,0xb3,0x2, +0xad,0x30,0xe1,0x6, 0x7e,0x74,0xe, 0xb0,0x80,0x4, 0x7e,0x74,0x7, 0x58,0x7e,0x37, +0x2, 0xb6,0x6c,0xaa,0x80,0x47,0xa, 0x2a,0x9, 0x52,0x2, 0x87,0x7e,0x30,0x4, 0xac, +0x35,0x49,0xf1,0x0, 0xee,0x49,0xe1,0x0, 0xec,0x7d,0x17,0x6d,0x0, 0xbf,0x70,0x58, +0x1f,0x7e,0xb3,0x5, 0x13,0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0xb9,0xa, 0x15,0x2e,0x14,0x4, 0xef,0x7e,0x19,0x40,0x4c,0x4b,0x7a,0x19,0x40, +0xa, 0x15,0x9, 0x41,0x4, 0xef,0x2d,0x13,0x7a,0x19,0x40,0xb, 0xa0,0x7e,0x43,0x2, +0x62,0xbc,0x4a,0x38,0xb1,0xda,0x79,0x22,0xe4,0x7a,0xb3,0x4, 0x5b,0x7a,0xb3,0x4, +0x0, 0x22,0xca,0x69,0xca,0xf8,0x12,0x51,0x74,0x7e,0x73,0x4, 0x1a,0xa, 0x37,0xbd, +0x36,0x8, 0x26,0x7e,0x73,0x4, 0x1b,0xa, 0x37,0xbd,0x32,0x8, 0x1c,0xa, 0x3f,0x7d, +0x23,0x2e,0x24,0x4, 0x5b,0x7e,0x29,0xb0,0x4, 0x7a,0x29,0xb0,0x9, 0x53,0x4, 0x5b, +0xbe,0x50,0x20,0x28,0x20,0x74,0x20,0x80,0xc, 0xa, 0x3f,0x9, 0xa3,0x4, 0x5b,0xbe, +0xa0,0x3, 0x38,0x7, 0xe4,0x19,0xb3,0x4, 0x5b,0x80,0xa, 0x2e,0x34,0x4, 0x5b,0x7c, +0xba,0x14,0x7a,0x39,0xb0,0xa, 0x3f,0x2e,0x35,0x53,0x7e,0x39,0xb0,0x12,0x51,0xad, +0x60,0xa, 0x74,0x78,0xa, 0x3f,0x19,0xb3,0x4, 0x0, 0x80,0x13,0xa, 0x3f,0x9, 0xb3, +0x4, 0x0, 0xbe,0xb0,0x0, 0x28,0x8, 0x2e,0x34,0x4, 0x0, 0x14,0x7a,0x39,0xb0,0x7e, +0x90,0x5, 0xac,0x9f,0x2e,0x45,0x53,0x49,0x34,0x0, 0x4, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x4, 0x8, 0x49,0x34,0x0, 0x6, 0x59,0x35,0x4, 0xa, 0xda,0xf8,0xda,0x69,0x22, +0xca,0x69,0xca,0xf8,0x7e,0x65,0x53,0x9, 0xf6,0x0, 0x1a,0x5e,0xf0,0xf, 0x78,0x8, +0x12,0x4f,0xf8,0x12,0x51,0x6a,0x80,0x55,0xbe,0xf0,0x1, 0x78,0x1a,0x7e,0x73,0x4, +0x50,0xbe,0x70,0x3, 0x50,0x5, 0x12,0x4f,0xf8,0x80,0x9, 0x12,0x51,0x62,0x28,0x4, +0xe4,0x12,0x51,0x12,0xe4,0x80,0x33,0xbe,0xf0,0x2, 0x78,0x31,0x7e,0x73,0x3, 0xff, +0xbe,0x70,0x3, 0x50,0x8, 0x12,0x4f,0xf8,0x12,0x51,0x6a,0x80,0x17,0x12,0x51,0x62, +0x28,0x4, 0xe4,0x12,0x51,0x12,0x7e,0x73,0x4, 0x5c,0xbe,0x70,0x3, 0x28,0x5, 0x74, +0x1, 0x12,0x51,0x12,0xe4,0x12,0x50,0x2, 0x74,0x1, 0x12,0x50,0x2, 0xda,0xf8,0xda, +0x69,0x22,0xca,0x69,0xca,0xf8,0x12,0x51,0x74,0x7e,0x73,0x4, 0x22,0xa, 0x37,0xbd, +0x36,0x8, 0x3a,0x7e,0x73,0x4, 0x23,0xa, 0x37,0xbd,0x32,0x8, 0x30,0xa, 0x3f,0x9, +0xb3,0x4, 0x0, 0x60,0x28,0x74,0x4, 0xac,0xbf,0x49,0x35,0x4, 0x8, 0x7e,0x50,0x5, +0xac,0x5f,0x2e,0x25,0x53,0x59,0x32,0x0, 0x4, 0x74,0x4, 0xac,0xbf,0x49,0x35,0x4, +0xa, 0x7e,0x50,0x5, 0xac,0x5f,0x2e,0x25,0x53,0x59,0x32,0x0, 0x6, 0xda,0xf8,0xda, +0x69,0x22,0x7e,0x73,0x4, 0x5b,0xbe,0x70,0x3, 0x22,0xe4,0x7a,0xb3,0x4, 0x5c,0x7a, +0xb3,0x4, 0x1, 0x22,0x7c,0xfb,0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0x8, 0x7e,0x70, +0x5, 0xac,0x7f,0x2e,0x35,0x53,0x49,0x33,0x0, 0x4, 0x9d,0x32,0x12,0x2, 0x9e,0x7d, +0x63,0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0xa, 0x7e,0x70,0x5, 0xac,0x7f,0x2e,0x35, +0x53,0x49,0x33,0x0, 0x6, 0x9d,0x32,0x12,0x2, 0x9e,0x7d,0x23,0x22,0xca,0x79,0x7c, +0xeb,0x6c,0xff,0x7c,0xbe,0x7e,0x30,0x4, 0xac,0x3e,0x12,0x13,0xe5,0x12,0x51,0xe7, +0x7c,0x6b,0x7e,0x50,0x4, 0xac,0x5e,0x2e,0x25,0x51,0x49,0x12,0x0, 0x2, 0xb, 0x28, +0x0, 0xbe,0x8, 0x3a,0x98,0x8, 0xb, 0x7e,0x73,0x4, 0x19,0xbc,0x76,0x28,0x3, 0x7e, +0xf0,0x1, 0x7c,0xbf,0xda,0x79,0x22,0x7f,0x71,0x7e,0xa3,0x4, 0x2, 0xa, 0x2a,0xa, +0x3b,0x12,0x0, 0x46,0x7e,0x73,0x4, 0x3, 0xa, 0x37,0xbd,0x23,0x58,0x6, 0x7e,0x7, +0x4, 0x53,0x80,0x4, 0x7e,0x7, 0x4, 0x12,0xbe,0x78,0x75,0x30,0x8, 0x0, 0xbe,0x78, +0x0, 0x0, 0x58,0x4, 0x6d,0x11,0x80,0x6, 0x7f,0x17,0x2f,0x11,0x7d,0x13,0x7d,0x51, +0x8d,0x50,0xbe,0x54,0x0, 0x64,0x28,0x4, 0x7e,0x54,0x0, 0x64,0x22,0x7e,0x34,0x0, +0x1, 0x7a,0x37,0x4, 0x51,0x7a,0x37,0x4, 0x53,0xe4,0x7a,0xb3,0x4, 0x55,0x7e,0xb3, +0x4, 0x56,0x54,0xf9,0x7a,0xb3,0x4, 0x56,0x54,0xfe,0x7a,0xb3,0x4, 0x56,0x7a,0x37, +0x4, 0x10,0x7a,0x37,0x4, 0x12,0xe4,0x7a,0xb3,0x4, 0x14,0x7e,0xb3,0x4, 0x15,0x54, +0xf9,0x7a,0xb3,0x4, 0x15,0x54,0xfe,0x7a,0xb3,0x4, 0x15,0x22,0x7e,0x45,0x53,0x9, +0xa4,0x0, 0x1a,0x5e,0xa0,0xf, 0x78,0x7, 0xe4,0x7a,0xb3,0x4, 0x50,0x80,0x3d,0xbe, +0xa0,0x1, 0x78,0x1f,0xe4,0x7a,0xb3,0x3, 0xff,0x7e,0xb3,0x4, 0x50,0x4, 0x7a,0xb3, +0x4, 0x50,0x7e,0x73,0x4, 0x50,0xbe,0x70,0xc8,0x28,0x25,0x74,0xc8,0x7a,0xb3,0x4, +0x50,0x80,0x1d,0xe4,0x7a,0xb3,0x4, 0x50,0x7e,0xb3,0x3, 0xff,0x4, 0x7a,0xb3,0x3, +0xff,0x7e,0x73,0x3, 0xff,0xbe,0x70,0xc8,0x28,0x6, 0x74,0xc8,0x7a,0xb3,0x3, 0xff, +0x7e,0xb3,0x4, 0x4f,0x60,0x5, 0x14,0x7a,0xb3,0x4, 0x4f,0x22,0x7c,0x6b,0x7e,0x53, +0x0, 0x79,0x7c,0xb5,0x54,0xf, 0x68,0x10,0x7c,0x45,0x1b,0x40,0x5e,0x40,0xf, 0x5e, +0x50,0xf0,0x4c,0x54,0x7a,0x53,0x0, 0x79,0xa5,0xbe,0x0, 0x1c,0xa5,0xbf,0x2, 0x18, +0x7e,0x73,0x0, 0x60,0x7a,0x73,0x0, 0x5f,0x7e,0x1f,0x0, 0x69,0x7e,0x33,0x0, 0x68, +0x7a,0x1f,0x0, 0x64,0x7a,0x33,0x0, 0x63,0x22,0xca,0x3b,0x12,0xf, 0x96,0x6c,0xee, +0x61,0x9c,0x7e,0x50,0x5, 0xac,0x5e,0x49,0x62,0x0, 0x63,0x7e,0x34,0x0, 0x1, 0x7a, +0x35,0x23,0x7a,0x35,0x25,0x9e,0x64,0x0, 0x20,0x7e,0x35,0x23,0xbd,0x36,0x38,0xb, +0x7e,0x34,0x1, 0xc0,0x9e,0x35,0x25,0xbd,0x36,0x50,0x33,0x12,0x53,0xa5,0x78,0x27, +0xbe,0xf0,0x1, 0x78,0x22,0x74,0x4, 0xac,0xbe,0x49,0x15,0x5, 0x56,0xbe,0x14,0x7f, +0xff,0x68,0x14,0x49,0x35,0x5, 0x58,0xbe,0x34,0x7f,0xff,0x68,0xa, 0x59,0x12,0x0, +0x63,0x59,0x32,0x0, 0x65,0x80,0x7, 0x7c,0xbe,0x7c,0x7f,0x12,0x52,0xcc,0x12,0x53, +0xa5,0x68,0xe, 0x7e,0x34,0x7f,0xff,0x74,0x4, 0xac,0xbe,0x59,0x35,0x5, 0x56,0x80, +0x15,0x7e,0x90,0x5, 0xac,0x9e,0x49,0x34,0x0, 0x63,0x74,0x4, 0xac,0xbe,0x59,0x35, +0x5, 0x56,0x49,0x34,0x0, 0x65,0x59,0x35,0x5, 0x58,0xb, 0xe0,0xbc,0xfe,0x28,0x2, +0x61,0x12,0xda,0x3b,0x22,0x7e,0x73,0x0, 0x79,0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0xab, +0x5e,0xa0,0xf, 0x7c,0xb7,0x54,0xf, 0xbc,0xba,0x22,0xca,0xd8,0xca,0x79,0x7e,0xf3, +0x0, 0x9f,0x4c,0xff,0x78,0x2, 0x81,0x58,0x6c,0xee,0x7e,0x90,0x5, 0xac,0x9e,0x9, +0xd4,0x0, 0x8d,0xbe,0xd0,0x2, 0x50,0xb, 0xa, 0x5d,0x9, 0xb5,0x0, 0xe0,0x70,0x3, +0x12,0x54,0x5d,0xb, 0xe0,0xbe,0xe0,0x2, 0x78,0xe0,0x6c,0xee,0x80,0x66,0x7e,0x50, +0x5, 0xac,0x5e,0x9, 0xd2,0x0, 0x8d,0xbe,0xd0,0x2, 0x50,0x56,0x74,0x4, 0xac,0xbd, +0x49,0x45,0x5, 0x4e,0x49,0x32,0x0, 0x89,0x9d,0x34,0x7a,0x35,0x23,0x49,0x15,0x5, +0x50,0x49,0x22,0x0, 0x8b,0x9d,0x21,0x7a,0x25,0x25,0x12,0x2, 0x9e,0xbe,0x34,0x0, +0x5, 0x18,0x27,0x7e,0x35,0x25,0x12,0x2, 0x9e,0xbe,0x34,0x0, 0x3, 0x18,0x1b,0x7e, +0x90,0x4, 0xac,0x9d,0x49,0x34,0x5, 0x4e,0x74,0x5, 0xac,0xbe,0x59,0x35,0x0, 0x89, +0x49,0x34,0x5, 0x50,0x59,0x35,0x0, 0x8b,0x80,0x8, 0x7e,0x90,0x5, 0xac,0x9e,0x12, +0x54,0x5d,0xb, 0xe0,0xbc,0xfe,0x38,0x96,0xda,0x79,0xda,0xd8,0x22,0x49,0x34,0x0, +0x89,0x74,0x4, 0xac,0xbd,0x59,0x35,0x5, 0x4e,0x49,0x34,0x0, 0x8b,0x59,0x35,0x5, +0x50,0x22,0x7d,0x23,0x7d,0xd3,0x1a,0x24,0x1a,0xc4,0x7e,0x7f,0x1, 0x6c,0xbf,0x67, +0x18,0x29,0x7e,0xf, 0x1, 0x70,0xbf,0x7, 0x18,0x21,0x7e,0xf, 0x1, 0x74,0xbf,0x7, +0x18,0x19,0x7e,0x2f,0x1, 0x38,0x7e,0xf, 0x1, 0x34,0x2f,0x2, 0xbe,0x8, 0xd, 0xac, +0x18,0x69,0x12,0xf, 0x6a,0x7e,0x34,0x0, 0x50,0x80,0x54,0x7e,0xf, 0x1, 0x70,0xbf, +0x60,0x18,0x25,0xbf,0x70,0x18,0x21,0x7e,0x2f,0x1, 0x74,0xbf,0x20,0x18,0x19,0x7e, +0x5f,0x1, 0x50,0x7e,0x2f,0x1, 0x4c,0x2f,0x25,0xbe,0x28,0xd, 0xac,0x18,0x3c,0x12, +0xf, 0x6a,0x7e,0x34,0x0, 0xf0,0x80,0x27,0x7e,0x1f,0x1, 0x74,0xbf,0x61,0x18,0x2b, +0xbf,0x71,0x18,0x27,0xbf,0x1, 0x18,0x23,0x7e,0xf, 0x1, 0x60,0x7e,0x1f,0x1, 0x5c, +0x2f,0x10,0xbe,0x18,0xd, 0xac,0x18,0x13,0x12,0xf, 0x6a,0x7e,0x34,0x1, 0x90,0x7a, +0x37,0x0, 0x63,0x7e,0x34,0x3, 0x84,0x7a,0x37,0x0, 0x65,0x22,0x12,0xf, 0xbf,0xb4, +0x1, 0x6a,0x7c,0xba,0x54,0xf, 0x68,0x64,0x7e,0x73,0x0, 0x5f,0xa, 0x37,0x12,0xf, +0xf4,0xbe,0x24,0x0, 0x7, 0x78,0x2e,0x90,0x1, 0x3d,0x12,0x55,0x7d,0x12,0x17,0x7c, +0xbe,0x8, 0x0, 0x3c,0x8, 0x12,0x7d,0x35,0x2e,0x34,0x0, 0xec,0x2e,0x8, 0x0, 0x64, +0x59,0x13,0x0, 0x2, 0x1b,0x38,0x0, 0x22,0x7e,0x8, 0x0, 0x96,0x59,0x15,0x0, 0xee, +0x59,0x5, 0x0, 0xec,0x22,0x4d,0x22,0x78,0x23,0x90,0x1, 0x3c,0x12,0x55,0x7d,0x12, +0x21,0xd1,0xbe,0x18,0x0, 0x3c,0x8, 0xd, 0x7d,0x45,0x2e,0x44,0x0, 0xec,0x2e,0x18, +0x0, 0x64,0x2, 0x17,0xf4,0x7e,0x18,0x0, 0x96,0x12,0x17,0x52,0x22,0xe4,0x93,0x7c, +0xab,0x74,0x4, 0xa4,0x22,0x12,0x0, 0x94,0x7a,0x1f,0x2, 0xcd,0x7e,0x24,0x2, 0xcd, +0x7e,0x37,0x2, 0xd1,0xe5,0x25,0x7e,0x17,0x2, 0x34,0x99,0x14,0xe5,0x25,0x7e,0x1f, +0x2, 0xcd,0x22,0x7a,0x1f,0x2, 0xc5,0xe5,0x27,0xa, 0x2b,0x1b,0x24,0xe5,0x25,0xa, +0x3b,0xbd,0x32,0x7e,0x17,0x2, 0x1c,0x1a,0x2, 0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xc1, +0x7f,0x17,0x12,0x0, 0x78,0x7e,0x2f,0x2, 0xc5,0x7f,0x7, 0x2f,0x2, 0x22,0x7d,0x17, +0x6d,0x0, 0x7f,0x12,0x9f,0x10,0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xc5,0x7f,0x17,0x12, +0x0, 0x78,0x7e,0xf, 0x2, 0xc1,0x2f,0x7, 0x22,0x7e,0x73,0x0, 0x60,0xa, 0x37,0x7d, +0x2f,0x12,0x0, 0x46,0xbd,0x42,0x22,0xb, 0x28,0x10,0x2d,0x10,0x1b,0x28,0x10,0xb, +0xe0,0xbe,0xe0,0x3, 0x22,0x7e,0x14,0x0, 0xc, 0xad,0x13,0x7e,0x50,0x4, 0xac,0x5e, +0x2d,0x21,0x22,0x7a,0x37,0x0, 0x5d,0x7e,0x34,0x0, 0xa6,0x7a,0x37,0x2, 0xb6,0x22, +0x7e,0xa1,0x23,0x74,0x5, 0xa4,0x22,0x7c,0xbf,0x24,0x2f,0x7e,0x70,0x3f,0x12,0x0, +0x25,0xb, 0xf0,0x22,0x2d,0x5c,0x3e,0x54,0x3e,0x54,0x22,0xe5,0x27,0xa, 0x1b,0xe5, +0x28,0xa, 0x3b,0x2d,0x31,0xbd,0x23,0x22,0x7e,0x4, 0x0, 0x3, 0xb, 0x28,0x10,0x8d, +0x10,0x1b,0x28,0x10,0x22,0x74,0x5, 0xac,0xbf,0x9, 0x75,0x0, 0x8d,0xbe,0x70,0x2, +0x22,0x7e,0x30,0x5, 0xac,0x3d,0x2e,0x14,0x2, 0xb9,0x74,0x5, 0x22,0x7e,0x70,0x5, +0xac,0x7f,0x2e,0x34,0x0, 0x63,0x22,0x74,0x5, 0x12,0x1, 0x19,0xb, 0xf0,0x22,0x7e, +0x30,0x5, 0xac,0x3f,0x7d,0x31,0x22,0x7e,0x34,0x0, 0x3c,0x7a,0x35,0x58,0x22,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x56,0x97,0xa9,0x68,0xa4,0x5b,0x2, 0xd8, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x03_20141117_app.h b/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x03_20141117_app.h new file mode 100644 index 00000000..6523e3e2 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x03_20141117_app.h @@ -0,0 +1,1310 @@ +0x2, 0x1, 0xee,0x2, 0x39,0x9d,0x22,0x22,0x22,0x22,0x32,0x2, 0x0, 0xa, 0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x22,0x7e,0x37,0x2, 0x6, 0x89,0x34,0x2, 0x3b,0x9, 0x74,0x5, +0xac,0xbf,0x9, 0x75,0x0, 0x6c,0x22,0x2, 0x39,0xf, 0xff,0x2, 0x3f,0x9b,0xa2,0xc, +0xe4,0x33,0x22,0x2, 0x46,0x1f,0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, 0x3e,0x22,0x2, +0x39,0x42,0xff,0x2, 0x3f,0xe4,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff, +0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5, +0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21, +0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d, +0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22, +0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f, +0x12,0x12,0x0, 0x94,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x0, 0x94,0x30, +0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e, +0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xff,0xff,0xff,0xff,0xfe,0xfe, +0xfe,0xfd,0xfc,0xfc,0xfb,0xfb,0xfa,0xfa,0xfa,0xf9,0xf8,0xf7,0xf7,0xf6,0xf5,0xf5, +0xf4,0xf3,0xf2,0xf2,0xf1,0xf0,0xf0,0xef,0xee,0xed,0xec,0xec,0xeb,0xea,0xe9,0xe7, +0xe5,0xe4,0xe2,0xe0,0xe0,0xe0,0xe0,0x1, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, +0x6, 0x6, 0x7, 0x7, 0x7, 0x8, 0x8, 0x9, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0xd, 0xe, +0xf, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x21, +0x23,0x26,0x2a,0x2d,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfb, +0xfa,0xfa,0xfa,0xf9,0xf8,0xf7,0xf7,0xf6,0xf5,0xf5,0xf4,0xf3,0xf2,0xf2,0xf1,0xf0, +0xf0,0xef,0xee,0xed,0xec,0xec,0xeb,0xea,0xe9,0xe7,0xe5,0xe4,0xe2,0xe0,0xe0,0xe0, +0xe0,0x1, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, 0x6, 0x6, 0x7, 0x7, 0x7, 0x8, +0x8, 0x9, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0xd, 0xe, 0xf, 0xf, 0x10,0x11,0x12,0x13, +0x14,0x15,0x16,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x21,0x23,0x26,0x2a,0x2d,0x75,0x84, +0x1, 0x7e,0x44,0x8, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x5, +0x59,0xc2,0xb, 0x75,0x2e,0x0, 0x75,0x2f,0x0, 0x75,0x30,0x0, 0x75,0x31,0x0, 0x75, +0x32,0x0, 0xc2,0x7, 0xd2,0x8, 0x75,0x33,0x0, 0x75,0x34,0x0, 0x75,0x26,0x0, 0x75, +0x35,0x0, 0x75,0x36,0x0, 0xc2,0xc, 0xd2,0x9, 0xc2,0xa, 0x75,0x37,0x0, 0xc2,0xd, +0xc2,0xe, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x3, 0xd, 0xb, 0xa, 0x40,0x5d,0x44,0x68, +0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29, +0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x39,0xd3,0xa, 0xb, +0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x9, 0x8, +0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x1, 0x22, +0x23,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, +0x3, 0x5, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22, +0x22,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22, +0x22,0x22,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13, +0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22,0x10,0x10, +0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x0, 0x18,0x4, +0xeb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5, 0x59,0x0, 0x0, 0x1, +0x3, 0xe8,0x0, 0x0, 0x24,0x3, 0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24,0x4, 0xd, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0xd5,0x0, 0x0, 0x1, 0x4, 0xd7,0x0, 0x0, 0x1, 0x4, +0xd8,0x0, 0x0, 0x1, 0x4, 0xda,0x0, 0x0, 0x1, 0x5, 0x51,0x0, 0x0, 0x1, 0x5, 0x52, +0xff,0x0, 0x1, 0x5, 0x53,0x10,0x0, 0x1, 0x5, 0x54,0x8, 0x0, 0x1, 0x5, 0x38,0x0, +0x0, 0x10,0x5, 0x39,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff, +0x7f,0xff,0x7f,0xff,0x0, 0x0, 0xca,0x3b,0x7e,0xa3,0x0, 0x54,0x7c,0xca,0x5e,0xc0, +0xf, 0x7c,0xba,0xc4,0x54,0xf, 0xf5,0x8, 0x4c,0xcc,0x78,0x2f,0x12,0x7, 0x12,0xe5, +0x8, 0xbe,0xb0,0x0, 0x38,0x2, 0xc1,0xfc,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x5, +0xac,0x7f,0x19,0xa3,0x0, 0x76,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xf0,0xd2,0x5, 0xc2, +0x3, 0x6d,0x33,0x7a,0x35,0x2e,0x75,0x30,0x0, 0xc1,0xfc,0x6c,0xff,0x7e,0x70,0xff, +0x74,0x5, 0xac,0xbf,0x19,0x75,0x2, 0xb2,0x7e,0x34,0x7f,0xff,0x59,0x35,0x2, 0xae, +0x59,0x35,0x2, 0xb0,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xe2,0x6c,0xff,0x80,0x23,0x7e, +0x50,0x5, 0xac,0x5f,0x7d,0x12,0x2e,0x14,0x0, 0x3e,0xb, 0x18,0x30,0x12,0x25,0x25, +0x1b,0x18,0x30,0x2e,0x24,0x0, 0x40,0xb, 0x28,0x30,0x12,0x25,0x25,0x1b,0x28,0x30, +0xb, 0xf0,0xbc,0xcf,0x38,0xd9,0xe5,0x8, 0xbc,0xbc,0x68,0x5, 0x6d,0x33,0x7a,0x35, +0x2e,0x6c,0xff,0x12,0x0, 0x1e,0xbe,0x70,0x2, 0x50,0xf, 0xa, 0x37,0x9, 0xb3,0x0, +0xc0,0x70,0x7, 0x6d,0x33,0x7a,0x35,0x2e,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40, +0xe2,0xe5,0x8, 0x70,0x23,0x6c,0xff,0x80,0x19,0x12,0x0, 0x36,0x59,0x45,0x0, 0x72, +0x49,0x45,0x0, 0x40,0x59,0x45,0x0, 0x74,0x9, 0x75,0x0, 0x42,0x19,0x75,0x0, 0x76, +0xb, 0xf0,0xbc,0xcf,0x38,0xe3,0xa1,0x95,0x6c,0xdd,0x6c,0xff,0x6c,0xee,0x7e,0x70, +0x5, 0xac,0x7e,0x9, 0xa3,0x0, 0x76,0x7e,0x50,0x5, 0xac,0x5f,0x9, 0xb2,0x0, 0x42, +0xbc,0xba,0x78,0x18,0xbe,0xb0,0xff,0x68,0x13,0xbe,0xd0,0x2, 0x50,0x15,0x2e,0x34, +0x0, 0x72,0x12,0x7, 0x61,0x74,0x5, 0x12,0x1, 0x19,0x80,0x7, 0xb, 0xe0,0xbe,0xe0, +0x2, 0x40,0xcb,0xbe,0xe0,0x2, 0x78,0x16,0xbe,0xd0,0x2, 0x50,0x11,0x7e,0x70,0x5, +0xac,0x7f,0x2e,0x34,0x0, 0x3e,0x12,0x7, 0x61,0x74,0x5, 0x12,0x1, 0x19,0xb, 0xd0, +0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xa5,0x6c,0xff,0x7e,0x30,0x5, 0xac,0x3f,0x7d,0x31, +0x2e,0x34,0x2, 0xae,0x2e,0x14,0x0, 0x72,0x74,0x5, 0x12,0x1, 0x19,0xb, 0xf0,0xbe, +0xf0,0x2, 0x78,0xe5,0x20,0x3, 0x6e,0x6c,0xff,0x80,0x66,0x7c,0xef,0x6c,0xdd,0x80, +0x21,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xa4,0x0, 0x76,0x7e,0x70,0x5, 0xac,0x7d,0x9, +0xb3,0x0, 0x42,0xbc,0xba,0x78,0x9, 0xbe,0xa0,0xff,0x68,0x4, 0x7c,0xed,0x80,0x6, +0xb, 0xd0,0xbc,0xcd,0x38,0xdb,0xbe,0xe0,0x2, 0x40,0x2, 0x7c,0xef,0x7e,0x90,0x5, +0xac,0x9e,0x49,0x34,0x0, 0x40,0xbe,0x34,0x32,0x0, 0x50,0xa, 0x49,0x24,0x0, 0x74, +0xbe,0x24,0x32,0x0, 0x40,0x12,0x49,0x24,0x0, 0x3e,0x74,0x5, 0xac,0xbf,0x59,0x25, +0x0, 0x72,0x59,0x35,0x0, 0x74,0x80,0x7, 0x7c,0xbf,0x7c,0x7e,0x12,0x9, 0x14,0xb, +0xf0,0xbc,0xcf,0x38,0x96,0x6c,0xff,0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, 0x72,0x12, +0x0, 0xe, 0x1e,0x44,0x59,0x45,0x0, 0x3e,0x49,0x45,0x0, 0x74,0x12,0x0, 0xe, 0x1e, +0x44,0x59,0x45,0x0, 0x40,0x9, 0x75,0x0, 0x76,0x19,0x75,0x0, 0x42,0xb, 0xf0,0xbe, +0xf0,0x2, 0x78,0xd3,0xbe,0xc0,0x0, 0x38,0x2, 0xc1,0xd9,0x6c,0xff,0x12,0x0, 0x36, +0x59,0x45,0x0, 0x68,0x49,0x45,0x0, 0x40,0x59,0x45,0x0, 0x6a,0x9, 0x75,0x0, 0x42, +0x19,0x75,0x0, 0x6c,0xa, 0x37,0xbe,0x34,0x0, 0x2, 0x50,0xf, 0x49,0x25,0x0, 0x6a, +0xbe,0x24,0x3, 0x20,0x40,0x5, 0x6d,0x22,0x7a,0x25,0x2e,0x7e,0x15,0x2e,0x4d,0x11, +0x78,0x41,0xbe,0xf0,0x1, 0x78,0x7, 0x7d,0x21,0xb, 0x24,0x7a,0x25,0x2e,0xbe,0x34, +0x0, 0x2, 0x40,0x2, 0xc1,0xd0,0x6c,0xee,0x7e,0x50,0x5, 0xac,0x5f,0x49,0x42,0x0, +0x68,0x7e,0xf4,0x0, 0xc, 0xad,0xf3,0x7e,0x10,0x4, 0xac,0x1e,0x2d,0xf, 0x59,0x40, +0x4, 0xeb,0x49,0x22,0x0, 0x6a,0x59,0x20,0x4, 0xed,0xb, 0xe0,0xbe,0xe0,0x3, 0x78, +0xd7,0xc1,0xd0,0xbe,0x34,0x0, 0x2, 0x50,0x7a,0x74,0x5, 0xac,0xbf,0x49,0x25,0x0, +0x68,0x7e,0x4, 0x0, 0x3, 0x8d,0x10,0x7d,0x50,0x3e,0x54,0x3e,0x54,0x7e,0x14,0x0, +0xc, 0xad,0x13,0x2d,0x15,0x59,0x21,0x4, 0xeb,0x74,0x5, 0xac,0xbf,0x49,0x25,0x0, +0x6a,0x59,0x21,0x4, 0xed,0x6d,0x22,0x74,0x5, 0xac,0xbf,0x59,0x25,0x0, 0x68,0x6c, +0xee,0x12,0x51,0x57,0x49,0x2, 0x4, 0xeb,0x7e,0x50,0x5, 0xac,0x5f,0x2e,0x24,0x0, +0x68,0x12,0x7, 0x6b,0x78,0xeb,0x12,0x7, 0x57,0x1b,0x28,0x10,0x6d,0x22,0x74,0x5, +0xac,0xbf,0x59,0x25,0x0, 0x6a,0x6c,0xee,0x12,0x51,0x57,0x49,0x2, 0x4, 0xed,0x7e, +0x50,0x5, 0xac,0x5f,0x2e,0x24,0x0, 0x6a,0x12,0x7, 0x6b,0x78,0xeb,0x12,0x7, 0x57, +0x1b,0x28,0x10,0xbe,0xf0,0x1, 0x78,0x8, 0x7e,0x25,0x2e,0xb, 0x24,0x7a,0x25,0x2e, +0xb, 0xf0,0xbe,0xf0,0x2, 0x68,0x2, 0xa1,0xcd,0xd2,0x0, 0x6c,0xff,0x12,0x0, 0x1e, +0xbe,0x70,0x2, 0x50,0x10,0xa, 0x37,0x9, 0xb3,0x0, 0xc0,0xb4,0x1, 0x7, 0x6d,0x33, +0x7a,0x35,0x2e,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xe1,0xda,0x3b,0x22,0x7d, +0x14,0x1a,0x2, 0x1a,0x0, 0x7f,0x17,0x9f,0x10,0x7d,0x1d,0x1a,0x2, 0x1a,0x0, 0x2, +0x0, 0x78,0x12,0x7, 0x79,0x78,0x32,0x20,0xb, 0x2f,0x6c,0xaa,0x7e,0x44,0x7f,0xff, +0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x4, 0xdf,0x59,0x43,0x4, 0xe1,0x6d,0x33,0x7e, +0x50,0x2, 0xac,0x5a,0x59,0x32,0x4, 0xe7,0x7e,0x34,0x1, 0x0, 0x59,0x32,0x4, 0xdb, +0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xd5,0xd2,0xb, 0x22,0x74,0x5, 0xac,0xbe,0x49,0x35, +0x0, 0x40,0x9d,0x32,0x2, 0x2, 0xde,0x7e,0x4, 0x0, 0x3, 0xb, 0x28,0x10,0x8d,0x10, +0x22,0x7e,0x30,0x5, 0xac,0x3d,0x2e,0x14,0x2, 0xae,0x22,0xb, 0x28,0x10,0x2d,0x10, +0x1b,0x28,0x10,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0x7e,0xb3,0x0, 0x54,0x54,0xf, 0x22, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xca,0x3b,0x7f,0x71,0x7c,0xab,0x7e,0x30,0x2, 0x7e,0xe0,0x3, 0x7e,0x94,0x0, 0x87, +0x7a,0x95,0x8, 0x7e,0x24,0x0, 0x8a,0x7a,0x25,0xa, 0x7d,0x62,0x7e,0xb4,0x0, 0x8c, +0x7d,0x8b,0x7d,0x42,0x7d,0xa2,0x7e,0x37,0x1, 0xfc,0x7d,0xd3,0x12,0x45,0xcf,0x7d, +0xc3,0xa, 0x3a,0x12,0xb, 0xae,0x7c,0xb5,0x7c,0xfb,0xbe,0xf0,0x8, 0x50,0x4e,0x1a, +0x13,0x12,0xb, 0x5e,0x48,0x2e,0xbe,0x78,0x1, 0xa, 0x48,0x2, 0x80,0x3, 0x7e,0x45, +0xa, 0x12,0x6, 0xff,0x7d,0x54,0x12,0xb, 0x6f,0xbe,0x78,0x1, 0x5e,0x18,0x2, 0x1, +0xe1,0x7f,0x17,0x9e,0x18,0x1, 0x5e,0x12,0xb, 0x98,0x7f,0x71,0x2e,0x18,0x1, 0x5e, +0x7f,0x71,0x80,0x6d,0xbe,0x78,0x0, 0x89,0x18,0x9, 0x7d,0x19,0x12,0x7, 0x1, 0x7d, +0x59,0x80,0x27,0x7e,0x45,0x8, 0x12,0x6, 0xff,0x7d,0x54,0x80,0x1d,0x1a,0x1e,0x12, +0xb, 0x5e,0x48,0x1b,0xbe,0x78,0x1, 0xc, 0x48,0x9, 0x7d,0x1b,0x12,0x7, 0x1, 0x7d, +0x5b,0x80,0x7, 0x7d,0x18,0x12,0x7, 0x1, 0x7d,0x58,0x12,0xb, 0x6f,0x80,0x32,0xbe, +0x78,0x0, 0x87,0x18,0x9, 0x7d,0x1a,0x12,0x7, 0x1, 0x7d,0x5a,0x80,0x7, 0x7d,0x16, +0x12,0x7, 0x1, 0x7d,0x56,0x12,0xb, 0x6f,0xbe,0x78,0x0, 0x32,0x58,0x13,0x7e,0x58, +0x0, 0x32,0x7f,0x15,0x9f,0x17,0x12,0xb, 0x98,0x7f,0x71,0x7f,0x15,0x9f,0x17,0x7f, +0x71,0xbe,0x78,0x0, 0x0, 0x58,0x6, 0x9f,0x11,0x7f,0x71,0x80,0x11,0x7d,0x1d,0x12, +0xb, 0x68,0x48,0xa, 0x7d,0x3d,0x1a,0x26,0x1a,0x24,0x1b,0x1c,0x7f,0x71,0xbe,0xf0, +0x8, 0x40,0xc, 0x7d,0x1d,0x1a,0x2, 0x1a,0x0, 0x7f,0x17,0x2f,0x10,0x7f,0x71,0x7f, +0x17,0xda,0x3b,0x22,0xca,0xd8,0xca,0x79,0x7c,0xe7,0x7c,0xdb,0x74,0x5, 0xac,0xbd, +0x49,0x25,0x0, 0x74,0x12,0x7, 0x4a,0x7d,0x3, 0x12,0xb, 0x83,0x2d,0x3, 0x74,0x5, +0xac,0xbd,0x9, 0xf5,0x0, 0x76,0xbe,0xf0,0x2, 0x40,0x2, 0x6c,0xff,0x74,0x4, 0xac, +0xbf,0x49,0x25,0x4, 0xe1,0x12,0x7, 0x4a,0x7d,0xd3,0x74,0x4, 0xac,0xbf,0x49,0x25, +0x4, 0xdf,0x12,0xb, 0x8b,0x2d,0xd3,0x7e,0x17,0x0, 0x65,0xbd,0x1d,0x38,0x6, 0x7e, +0xf4,0x1, 0x0, 0x80,0x19,0x7d,0x30,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12, +0x0, 0x92,0x7d,0xf3,0xbe,0xf4,0x0, 0x10,0x50,0x4, 0x7e,0xf4,0x0, 0x10,0xbe,0xf4, +0x1, 0x0, 0x28,0x4, 0x7e,0xf4,0x1, 0x0, 0x74,0x2, 0xac,0xbf,0x49,0x45,0x4, 0xe7, +0xbd,0x4d,0x28,0x6, 0x49,0xf5,0x4, 0xdb,0x80,0x4, 0x59,0xf5,0x4, 0xdb,0x59,0xd5, +0x4, 0xe7,0x74,0x5, 0xac,0xbd,0x49,0xe5,0x0, 0x3e,0x1e,0xe4,0x1e,0xe4,0x1e,0xe4, +0x1e,0xe4,0xbe,0xe4,0x0, 0x14,0x28,0x71,0xbe,0xe4,0x1, 0xcc,0x50,0x6b,0xa, 0xed, +0x9, 0x3e,0x0, 0x3a,0xa, 0x33,0x12,0xb, 0xae,0x7c,0xa5,0xa, 0x33,0x12,0x2d,0x75, +0x7c,0x35,0x7e,0x90,0x4, 0xac,0x9a,0x49,0x34,0x1, 0x5e,0x49,0x24,0x1, 0x5c,0x4c, +0x33,0x68,0xa, 0x49,0xd4,0x1, 0x5a,0x49,0xc4,0x1, 0x58,0x2f,0x16,0xbe,0x30,0x7, +0x68,0xa, 0x49,0x14,0x1, 0x62,0x49,0x4, 0x1, 0x60,0x2f,0x10,0x7e,0x8, 0x1, 0xf4, +0x12,0x0, 0xe5,0x7d,0xe3,0xbe,0xe4,0x0, 0xb4,0x28,0x6, 0x7e,0xe4,0x0, 0xb4,0x80, +0xe, 0xbe,0xe4,0x0, 0x3c,0x28,0x6, 0x9e,0xe4,0x0, 0x14,0x80,0x2, 0x6d,0xee,0xbd, +0xef,0x50,0x4, 0x9d,0xfe,0x80,0x2, 0x6d,0xff,0x12,0xb, 0x83,0x12,0xb, 0xa1,0x7e, +0x90,0x5, 0xac,0x9d,0x49,0xe4,0x0, 0x72,0x74,0x5, 0xac,0xbe,0x49,0xc5,0x0, 0x3e, +0xbd,0xce,0x28,0xf, 0x7d,0x24,0x2e,0x24,0x0, 0x72,0x7d,0x3e,0x2d,0x3d,0x1b,0x28, +0x30,0x80,0xb, 0x7d,0xc4,0x2e,0xc4,0x0, 0x72,0x9d,0xed,0x1b,0xc8,0xe0,0x49,0x24, +0x0, 0x74,0x12,0x7, 0x4e,0x12,0xb, 0xa1,0x7e,0x30,0x5, 0xac,0x3d,0x49,0x21,0x0, +0x74,0x7e,0x70,0x5, 0xac,0x7e,0x49,0xe3,0x0, 0x40,0xbd,0xe2,0x28,0xf, 0x7d,0xc1, +0x2e,0xc4,0x0, 0x74,0x7d,0x2, 0x2d,0xd, 0x1b,0xc8,0x0, 0x80,0x9, 0x2e,0x14,0x0, +0x74,0x9d,0x2d,0x1b,0x18,0x20,0x49,0x43,0x0, 0x3e,0x74,0x4, 0xac,0xbf,0x59,0x45, +0x4, 0xdf,0x59,0xe5,0x4, 0xe1,0xda,0x79,0xda,0xd8,0x22,0x7d,0xf3,0xbe,0xf4,0x0, +0x47,0x38,0x2b,0x7e,0x54,0x0, 0x47,0x9d,0x5f,0x6d,0x44,0x7e,0x14,0x1, 0x80,0x12, +0xb, 0x50,0xbe,0x28,0x0, 0x18,0x28,0x4, 0x9f,0x22,0x80,0x8, 0x7e,0x18,0x0, 0x18, +0x9f,0x12,0x7f,0x21,0xbe,0x28,0x0, 0x0, 0x50,0x6d,0x9f,0x22,0x80,0x69,0xbe,0xf4, +0x1, 0xb8,0x40,0x29,0x7d,0x5f,0x9e,0x54,0x1, 0xb8,0x6d,0x44,0x7e,0x14,0x1, 0x80, +0x12,0xb, 0x50,0xbe,0x28,0x0, 0x18,0x40,0x4, 0x7e,0x28,0x0, 0x17,0xbe,0x28,0x0, +0x18,0x28,0x4, 0x7e,0x28,0x0, 0x18,0x2e,0x28,0x1, 0xc8,0x80,0x3a,0xbe,0xf4,0x0, +0xff,0x50,0x1d,0x7e,0x54,0x0, 0xff,0x9d,0x5f,0x12,0xb, 0x4a,0x7e,0x18,0x0, 0xf0, +0x9f,0x12,0x7f,0x21,0xbe,0x28,0x0, 0x18,0x50,0x1d,0x7e,0x28,0x0, 0x18,0x80,0x17, +0x7d,0x5f,0x9e,0x54,0x0, 0xff,0x12,0xb, 0x4a,0x2e,0x28,0x0, 0xf0,0xbe,0x28,0x1, +0xc8,0x28,0x4, 0x7e,0x28,0x1, 0xc8,0x7d,0x35,0x22,0x6d,0x44,0x7e,0x14,0x1, 0x1f, +0x7f,0x12,0x12,0x0, 0x89,0x7f,0x21,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x22,0x1a,0x2, +0x7f,0x17,0x2f,0x10,0x7f,0x71,0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0xbf,0x70,0x22,0x3e, +0x54,0x1a,0x4a,0x1a,0x48,0x7d,0x1d,0x1a,0x2, 0x1a,0x0, 0x9f,0x2, 0x12,0x0, 0xe5, +0x7f,0x71,0x22,0x74,0x5, 0xac,0xbd,0x49,0x25,0x0, 0x72,0x74,0x5, 0xac,0xbe,0x49, +0x35,0x0, 0x3e,0x9d,0x32,0x2, 0x2, 0xde,0x7f,0x71,0x7e,0x8, 0x0, 0x2, 0x2, 0x0, +0xe5,0xad,0x3f,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7d,0xd3,0x22,0xa, 0x3b,0x7e,0x24, +0x0, 0x10,0x2, 0x0, 0x46,0xca,0xd8,0xca,0x79,0x12,0x7, 0x79,0x7c,0xb, 0x78,0x2f, +0x6c,0x11,0x6d,0x11,0x74,0x2, 0xac,0xb1,0x59,0x15,0x5, 0x32,0x7e,0xa0,0xff,0x7e, +0x30,0x5, 0xac,0x31,0x19,0xa1,0x5, 0x2c,0x7e,0xb3,0x5, 0x38,0x70,0x3, 0xe4,0x80, +0x2, 0x74,0x2, 0xa, 0x11,0x19,0xb1,0x5, 0x36,0xb, 0x10,0xa5,0xb9,0x2, 0xd3,0x6c, +0x11,0x81,0xfe,0x74,0x5, 0xac,0xb1,0x9, 0xf5,0x0, 0x42,0xbe,0xf0,0x2, 0x40,0x2, +0x81,0xfc,0xa, 0x1f,0x9, 0xb1,0x0, 0xc0,0xbe,0xb0,0x1, 0x78,0x2, 0x81,0xfc,0x6c, +0xee,0x74,0x5, 0xac,0xbe,0x9, 0xd5,0x5, 0x2c,0xbc,0xdf,0x68,0x2, 0x81,0xf3,0x49, +0x25,0x5, 0x2a,0x74,0x5, 0xac,0xb1,0x12,0x7, 0x4e,0x7d,0x43,0x74,0x5, 0xac,0xbe, +0x49,0x25,0x5, 0x28,0x74,0x5, 0xac,0xb1,0x12,0xb, 0x8f,0x2d,0x43,0xa, 0x1d,0x9, +0xa1,0x5, 0x36,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3d,0x59,0x41,0x5, +0x32,0xa, 0x1d,0x2e,0x14,0x5, 0x36,0x7c,0xba,0x14,0x7a,0x19,0xb0,0x81,0xfc,0x7e, +0x30,0x2, 0xac,0x3d,0x49,0x31,0x5, 0x32,0xbe,0x34,0x0, 0x32,0x28,0x8, 0xbe,0x44, +0x0, 0x32,0x28,0x2, 0x80,0x10,0x7d,0x23,0x2e,0x24,0x0, 0x32,0xbd,0x24,0x50,0x12, +0xbe,0x34,0x0, 0x32,0x28,0xc, 0x59,0x41,0x5, 0x32,0x74,0x1, 0x7a,0xb3,0x5, 0x38, +0x80,0x6a,0xbe,0x44,0x0, 0xc8,0x28,0x51,0xe4,0x7a,0xb3,0x5, 0x38,0xa, 0x1f,0x9, +0xb1,0x0, 0xc0,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1f,0x19,0xb1,0x0, +0xc0,0x7e,0x70,0x5, 0xac,0x71,0x2e,0x34,0x0, 0x3e,0x7e,0x14,0x2, 0xae,0x74,0x5, +0x12,0x1, 0x19,0xbe,0x0, 0x0, 0x28,0x21,0x1b,0x0, 0x7e,0x70,0x5, 0xac,0x70,0x2e, +0x34,0x0, 0x3e,0x7e,0x30,0x5, 0xac,0x31,0x12,0xd, 0x34,0x7e,0x34,0x2, 0xae,0x7e, +0x30,0x5, 0xac,0x30,0x12,0xd, 0x34,0x1b,0x10,0x74,0x2, 0xac,0xbd,0x59,0x45,0x5, +0x32,0x80,0x9, 0xb, 0xe0,0xbe,0xe0,0x2, 0x50,0x2, 0x81,0x11,0xb, 0x10,0x12,0x4a, +0xb2,0x54,0xf, 0xa, 0x5b,0xa, 0x11,0xbd,0x15,0x58,0x2, 0x61,0xf3,0x7c,0x60,0x12, +0xd, 0x45,0x6c,0x11,0x7e,0x30,0x5, 0xac,0x31,0x7d,0x31,0x2e,0x34,0x0, 0x3e,0x2e, +0x14,0x5, 0x28,0x74,0x5, 0x12,0x1, 0x19,0xb, 0x10,0xbe,0x10,0x2, 0x40,0xe5,0xda, +0x79,0xda,0xd8,0x22,0x2e,0x14,0x0, 0x3e,0x74,0x5, 0x2, 0x1, 0x19,0x7e,0x73,0x0, +0x54,0x7c,0x67,0xb, 0x60,0x5e,0x60,0xf, 0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x73,0x0, +0x54,0x22,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x7e,0x2f,0x1, 0x4c,0xbf,0x2, 0x18,0x9, +0x12,0xd, 0x3d,0x7e,0x34,0x0, 0x50,0x80,0x20,0x7e,0x2f,0x1, 0x50,0xbf,0x2, 0x18, +0x9, 0x12,0xd, 0x3d,0x7e,0x34,0x0, 0xf0,0x80,0xf, 0x7e,0x1f,0x1, 0x54,0xbf,0x1, +0x18,0x13,0x12,0xd, 0x3d,0x7e,0x34,0x1, 0x90,0x7a,0x37,0x0, 0x3e,0x7e,0x34,0x3, +0x84,0x7a,0x37,0x0, 0x40,0x22,0x7e,0xb3,0x2, 0x54,0x20,0xe1,0x45,0x7e,0xa3,0x3, +0xb1,0x4c,0xaa,0x68,0x2a,0xbe,0xa0,0xff,0x68,0x25,0x74,0x28,0xa4,0x7d,0xf5,0xbe, +0xf4,0x9, 0x60,0x58,0x4, 0x7e,0xf4,0x9, 0x60,0x12,0x51,0x9a,0xb4,0x1, 0x14,0x7e, +0xe7,0x0, 0x6a,0xbe,0xe4,0x3, 0x84,0x78,0xa, 0x7e,0xf4,0x8, 0x98,0x80,0x4, 0x7e, +0xf4,0x9, 0x60,0x7d,0x3f,0x12,0xd, 0xe3,0x12,0xf, 0x92,0x40,0x5, 0x7d,0x3f,0x2, +0xd, 0x52,0x22,0x7d,0x3, 0x7d,0x50,0x1a,0x4a,0x1a,0x48,0x7e,0x1f,0x1, 0x4c,0xbf, +0x21,0x18,0xb, 0x7e,0x34,0x2, 0x10,0x74,0x20,0x6c,0x55,0x12,0xe, 0x31,0x7d,0x50, +0x1a,0x4a,0x1a,0x48,0x7e,0x1f,0x1, 0x50,0xbf,0x21,0x18,0xb, 0x7e,0x34,0x2, 0x10, +0x74,0x21,0x6c,0x55,0x12,0xe, 0x31,0x7d,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x1f,0x1, +0x54,0xbf,0x1, 0x18,0xb, 0x7e,0x34,0x2, 0x10,0x74,0x22,0x6c,0x55,0x2, 0xe, 0x31, +0x22,0x7d,0x13,0xa, 0x3b,0x2d,0x31,0x7a,0x39,0x50,0x22,0x12,0xf, 0x69,0x12,0x26, +0xcd,0x7a,0x37,0x2, 0xac,0x12,0x3b,0xa3,0xe4,0x12,0x20,0x76,0x12,0x3f,0xf5,0x12, +0x37,0x39,0x12,0x3d,0xb6,0x12,0x3c,0x77,0x12,0x25,0x37,0x12,0x45,0xdf,0x7e,0xb3, +0x3, 0xc4,0xb4,0x1, 0x2, 0x80,0x2, 0xe1,0x68,0x7e,0xb3,0x2, 0x3c,0x60,0x28,0xb4, +0x1, 0xb, 0x12,0x25,0xee,0x74,0x3c,0x7a,0xb3,0x3, 0xe8,0x80,0x3, 0x12,0xf, 0xfc, +0x7e,0x34,0x4, 0xd, 0x7e,0x24,0x0, 0x24,0xe4,0x12,0x2, 0xee,0x7e,0x34,0x3, 0xe9, +0x7e,0x24,0x0, 0x24,0x12,0x2, 0xee,0x12,0x26,0xfa,0x12,0x3c,0x5e,0x12,0x27,0x83, +0x44,0x40,0x12,0x10,0x65,0x12,0x17,0xfd,0x12,0x20,0x1e,0x12,0x1e,0x33,0x12,0x13, +0xc0,0x12,0xf, 0x7f,0x7e,0xb3,0x2, 0x54,0x30,0xe1,0x7, 0x12,0xf, 0xbf,0x7a,0xb3, +0x0, 0x54,0x12,0x40,0x7, 0x12,0x7, 0x79,0x12,0x38,0xb, 0x7e,0x34,0x0, 0xcc,0x7e, +0x24,0x1, 0xa8,0x7e,0xb3,0x2, 0x58,0x14,0x12,0x3e,0x31,0x7e,0xb3,0x3, 0xe8,0x60, +0x5, 0x14,0x7a,0xb3,0x3, 0xe8,0x7e,0xb3,0x3, 0xe8,0x60,0x9, 0x74,0xa, 0x12,0xf, +0x76,0x74,0x1e,0x80,0x5, 0x12,0xf, 0x74,0x74,0xf, 0x7a,0xb3,0x2, 0x36,0x12,0x1e, +0x9e,0x12,0x17,0xd1,0x12,0x27,0xb2,0x12,0x0, 0x6, 0x12,0x18,0x6d,0x7e,0xb3,0x2, +0x55,0x30,0xe0,0x21,0x7e,0xa3,0x0, 0x54,0x7c,0xba,0x54,0xf, 0xbe,0xb0,0x2, 0x40, +0x14,0x7c,0xba,0xc4,0x54,0xf, 0xbe,0xb0,0x2, 0x50,0xa, 0x7c,0xba,0x54,0xf0,0x44, +0x1, 0x7a,0xb3,0x0, 0x54,0x12,0x49,0xff,0x12,0xf, 0xc6,0x12,0x41,0xf4,0x12,0x2b, +0xe2,0x12,0xd, 0x96,0x12,0x4a,0xb9,0x12,0x46,0xb7,0x12,0xb, 0xb5,0x12,0x4d,0xab, +0x12,0x3, 0xc6,0x12,0x49,0xb, 0x7e,0xb3,0x0, 0x62,0x12,0x35,0xdf,0x12,0x38,0x26, +0x12,0x26,0x55,0x12,0x4f,0xf9,0xc1,0x5e,0x22,0x6d,0x33,0x7a,0x37,0x0, 0x7f,0x7e, +0x34,0x7, 0xd0,0x22,0x74,0x5, 0x7a,0xb3,0x2, 0x35,0x7a,0xb3,0x2, 0x34,0x22,0x12, +0x7, 0x79,0x68,0xd, 0x7e,0x34,0x2, 0x10,0x7e,0xb3,0x0, 0x3a,0x6c,0x55,0x2, 0xe, +0x31,0x22,0x7e,0xf, 0x1, 0x50,0x7e,0x1f,0x1, 0x4c,0x2f,0x10,0x7e,0xf, 0x1, 0x54, +0x2f,0x1, 0x7e,0x1f,0x1, 0xa4,0xbf,0x10,0x58,0xc, 0x20,0xd, 0x9, 0x12,0xf, 0xbf, +0x7a,0xb3,0x0, 0x54,0xc3,0x22,0x12,0x7, 0x79,0x68,0x2, 0xd2,0xd, 0xd3,0x22,0x7e, +0xb3,0x0, 0x54,0x54,0xf0,0x22,0xca,0x79,0x7e,0xf3,0x0, 0x54,0x5e,0xf0,0xf, 0xbe, +0xf0,0x0, 0x28,0x25,0x6c,0xee,0x80,0x1d,0x1a,0x2e,0x7e,0x34,0x0, 0x5, 0xad,0x32, +0x49,0x33,0x0, 0x3e,0x12,0xa, 0xab,0x1a,0xe, 0x7e,0x14,0x0, 0x5, 0xad,0x10,0x59, +0x31,0x0, 0x3e,0xb, 0xe0,0xbc,0xfe,0x18,0xdf,0xda,0x79,0x22,0xca,0xf8,0x7e,0xa3, +0x2, 0xab,0x7c,0xba,0x23,0x23,0x7c,0xfb,0x5e,0xf0,0x1, 0x7c,0xba,0x54,0xbf,0x12, +0x10,0x65,0x6c,0xaa,0x80,0x2d,0x7e,0xb3,0x2, 0x3c,0xb4,0x2, 0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0xe9,0x60,0x1c,0x7e,0x90,0x4, 0xac,0x9a,0x49,0x34,0x0, 0xce,0x7e,0x50, +0x2, 0xac,0x5a,0x59,0x32,0x1, 0xa8,0x9f,0x11,0x59,0x34,0x0, 0xce,0x59,0x24,0x0, +0xcc,0xb, 0xa0,0x12,0x1f,0x3f,0x38,0xce,0x7c,0x6f,0x5e,0x60,0x1, 0x7c,0xb6,0x3, +0x3, 0x54,0xc0,0x7c,0x6b,0x7e,0x73,0x2, 0xab,0x5e,0x70,0xbf,0x4c,0x76,0x7a,0x73, +0x2, 0xab,0xda,0xf8,0x22,0x7a,0xb3,0x2, 0xab,0xca,0x3b,0x12,0x0, 0x2e,0x70,0x17, +0xf5,0x8, 0x80,0xc, 0x7e,0x18,0x30,0x39,0x12,0x1f,0xf1,0x12,0x51,0x7f,0x5, 0x8, +0x12,0x13,0x90,0x38,0xef,0x61,0x8d,0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, 0x75,0xd, +0x2, 0x80,0x3, 0x75,0xd, 0x1, 0x7e,0xa3,0x2, 0xab,0x7c,0xba,0x30,0xe7,0xe, 0x7e, +0xb3,0x2, 0x54,0x30,0xe0,0x7, 0x7e,0x35,0x35,0x4d,0x33,0x78,0xe, 0x7e,0xb3,0x2, +0x54,0x20,0xe0,0x2, 0x41,0x2a,0x20,0xe2,0x2, 0x41,0x2a,0x7c,0xba,0x30,0xe7,0x8, +0x7e,0xb3,0x2, 0xe, 0xf5,0xe, 0x80,0x6, 0x7e,0xb3,0x2, 0xf, 0xf5,0xe, 0x7e,0x35, +0x35,0xbe,0x34,0x0, 0x0, 0x28,0x5, 0x1b,0x34,0x7a,0x35,0x35,0x7e,0xb3,0x2, 0x54, +0x30,0xe5,0xb, 0x80,0x4, 0xe4,0x12,0x17,0x56,0x12,0x13,0xb9,0x50,0xf7,0x53,0xe1, +0xfd,0x43,0xe1,0x2, 0x53,0xe3,0x1f,0x12,0x51,0xf, 0x75,0x9, 0x0, 0x21,0xd3,0x75, +0xa, 0x0, 0x80,0x58,0xe5,0xa, 0x70,0xc, 0x53,0xe7,0xbf,0x7e,0x34,0x2, 0xf6,0x12, +0x51,0x13,0x80,0x3, 0x43,0xe7,0x40,0x7e,0xb3,0x2, 0xa3,0x54,0x1, 0x6c,0x77,0x12, +0x45,0xf4,0x80,0x4, 0xe4,0x12,0x17,0x56,0x12,0x13,0xb9,0x50,0xf7,0x75,0x8, 0x0, +0x80,0x23,0x12,0x50,0xe9,0x2f,0x31,0x12,0x51,0x24,0x2e,0x14,0x2, 0xf6,0x12,0x13, +0xaa,0x12,0x13,0x98,0x7e,0xb3,0x2, 0xa3,0x20,0xe1,0x8, 0x12,0x13,0xaa,0x2f,0x11, +0x12,0x13,0x9a,0x5, 0x8, 0x12,0x13,0x90,0x38,0xd8,0x5, 0xa, 0xe5,0xd, 0xbe,0xb1, +0xa, 0x38,0xa1,0x75,0x8, 0x0, 0x80,0x64,0x12,0x50,0xda,0x30,0xe6,0x2c,0x12,0x13, +0xb2,0x49,0x35,0x2, 0xf8,0x7a,0x37,0x3, 0x86,0x12,0x51,0x65,0x49,0x25,0x1, 0xa8, +0x1e,0x24,0x1e,0x24,0x9d,0x32,0x7a,0x37,0x3, 0x86,0x7e,0x37,0x1, 0xf2,0xe, 0x34, +0xe, 0x34,0xbe,0x37,0x3, 0x86,0x8, 0x1d,0x80,0x18,0x12,0x13,0xb2,0x49,0x15,0x2, +0xf8,0x49,0x5, 0x2, 0xf6,0x7e,0x37,0x1, 0xf4,0xe, 0x34,0xe, 0x34,0x12,0x1f,0xda, +0x8, 0x3, 0x12,0x51,0xb2,0x12,0x13,0xb2,0x49,0x35,0x2, 0xf8,0x49,0x25,0x2, 0xf6, +0x12,0x17,0xc8,0xbf,0x10,0x8, 0x3, 0x12,0x51,0x7f,0x5, 0x8, 0x12,0x13,0x90,0x38, +0x97,0x5, 0x9, 0xe5,0xe, 0xbe,0xb1,0x9, 0x28,0x2, 0x1, 0xff,0x7e,0xb3,0x2, 0xab, +0x30,0xe7,0x35,0x75,0x8, 0x0, 0x80,0x2b,0x12,0x51,0x24,0x2e,0x14,0x0, 0xcc,0x12, +0x13,0xaa,0x2f,0x11,0x2f,0x11,0x12,0x13,0x9a,0x7e,0xb3,0x2, 0xab,0x30,0xe6,0x11, +0x12,0x51,0x65,0x49,0x55,0x1, 0xa8,0x6d,0x44,0x12,0x13,0xaa,0x9f,0x12,0x12,0x13, +0x9a,0x5, 0x8, 0x12,0x13,0x90,0x38,0xd0,0x53,0xe1,0xfd,0x12,0x25,0xa, 0x53,0xe3, +0x1f,0x12,0x25,0x1b,0x7c,0xb7,0x42,0xe3,0x61,0x8d,0x7e,0xb3,0x2, 0xa3,0x20,0xe0, +0x2, 0x41,0xd0,0x12,0x51,0xf, 0x75,0x9, 0x0, 0x41,0xc7,0x7e,0xb3,0x2, 0x54,0x30, +0xe5,0x5, 0x12,0x13,0xb9,0x50,0x1d,0xe5,0x9, 0x70,0x5, 0x53,0xe7,0xbf,0x80,0x3, +0x43,0xe7,0x40,0x74,0x2, 0x12,0x0, 0x15,0x12,0x51,0x6c,0x12,0x45,0xf4,0x80,0x4, +0xe4,0x12,0x17,0x56,0x12,0x13,0xb9,0x50,0xf7,0xe4,0x12,0x0, 0x15,0x75,0x8, 0x0, +0x80,0x34,0x12,0x50,0xe9,0x2f,0x31,0x12,0x50,0xda,0x30,0xe7,0x1a,0x7e,0xa3,0x2, +0xa3,0x12,0x17,0xf6,0xbe,0xb0,0x3, 0x40,0xe, 0x7c,0xba,0x30,0xe1,0x9, 0x1e,0x74, +0xe, 0x64,0x50,0x3, 0x4e,0xe0,0x80,0x12,0x51,0xc2,0x2e,0x14,0x0, 0xcc,0x12,0x13, +0xaa,0x12,0x13,0x98,0x5, 0x8, 0x12,0x13,0x90,0x38,0xc7,0x7e,0xb3,0x2, 0x54,0x30, +0xe5,0x13,0xe5,0x9, 0xb4,0x1, 0x5, 0x53,0xe7,0xbf,0x80,0x3, 0x43,0xe7,0x40,0x12, +0x51,0x6c,0x12,0x45,0xf4,0x5, 0x9, 0xe5,0xd, 0xbe,0xb1,0x9, 0x28,0x2, 0x41,0x3b, +0x75,0x8, 0x0, 0x61,0x86,0x12,0x50,0xda,0x30,0xe7,0x5e,0x7e,0xa3,0x2, 0xa3,0x7c, +0xba,0x30,0xe1,0x28,0x12,0x17,0xf6,0xbe,0xb0,0x1, 0x38,0x20,0xa, 0xb, 0x7e,0x14, +0x0, 0x2, 0x9d,0x10,0x7e,0x91,0xc, 0x74,0x4, 0xac,0x9b,0x12,0x2d,0x7c,0x7c,0xb3, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x51,0xba,0x80,0x2d,0x7c,0xba,0x20,0xe1, +0x28,0x12,0x17,0xf6,0xbe,0xb0,0x2, 0x38,0x20,0xa, 0x4b,0x7e,0x54,0x0, 0x3, 0x9d, +0x54,0x7c,0xab,0x12,0x51,0xc2,0x2e,0x14,0x0, 0xcc,0x12,0x13,0xaa,0x7c,0xba,0x60, +0x5, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x13,0x9a,0x7e,0xb3,0x2, 0xab,0x30,0xe6,0x2b, +0x12,0x51,0x65,0x49,0x15,0x1, 0xa8,0x6d,0x0, 0x12,0x13,0xb2,0x7d,0x45,0x12,0x2d, +0x7c,0x9f,0x10,0x12,0x51,0xba,0x12,0x17,0xc8,0x7e,0x37,0x1, 0xf2,0x12,0x1d,0xab, +0x58,0x22,0x7e,0xb3,0x2, 0x54,0x30,0xe0,0x1b,0x80,0x16,0x12,0x13,0xb2,0x12,0x17, +0xc8,0x7e,0x37,0x1, 0xf4,0x12,0x1d,0xab,0x58,0xa, 0x7e,0xb3,0x2, 0x54,0x30,0xe0, +0x3, 0x12,0x51,0xb2,0x5, 0x8, 0x12,0x13,0x90,0x28,0x2, 0x41,0xd5,0xda,0x3b,0x22, +0x7e,0x73,0x2, 0x58,0xbe,0x71,0x8, 0x22,0x2f,0x13,0x59,0x31,0x0, 0x2, 0x1b,0x18, +0x20,0x22,0x7e,0x30,0x4, 0xac,0x23,0x2e,0x15,0x2a,0x49,0x31,0x0, 0x2, 0xb, 0x18, +0x20,0x22,0x7e,0xa1,0xc, 0x74,0x4, 0xa4,0x22,0x30,0x9, 0x2, 0xd3,0x22,0xc3,0x22, +0xca,0x3b,0x12,0x0, 0x2e,0x70,0x2, 0xc1,0x1f,0x7e,0xe3,0x2, 0x56,0x7c,0xde,0x1e, +0xd0,0x1e,0xe0,0x1e,0xe0,0x6c,0xcc,0x7e,0xb3,0x2, 0x55,0x54,0xfe,0x7a,0xb3,0x2, +0x55,0x7e,0x17,0x0, 0xbe,0x6d,0x0, 0x7e,0x1f,0x1, 0xa4,0xbf,0x10,0x58,0x2, 0x81, +0xf4,0x6c,0xff,0x81,0xea,0xa, 0x2d,0x7d,0x12,0x1b,0x14,0xa, 0x3f,0xbd,0x31,0xa, +0x4d,0xa, 0x5f,0x18,0x6, 0x2d,0x54,0xf5,0x8, 0x80,0x4, 0x9d,0x54,0xf5,0x8, 0x12, +0x0, 0x46,0x7c,0x75,0x7a,0x73,0x2, 0xb2,0x7e,0x70,0x4, 0xac,0x7f,0x49,0x53,0x0, +0xce,0x49,0x43,0x0, 0xcc,0x7e,0x37,0x0, 0xbe,0x7d,0x13,0x1e,0x14,0x6d,0x0, 0xbf, +0x20,0x58,0x2, 0x81,0xe8,0x7e,0xa3,0x2, 0xb2,0x74,0x4, 0xa4,0x49,0x15,0x1, 0x5e, +0x49,0x5, 0x1, 0x5c,0x6d,0x22,0xbf,0x1, 0x58,0x2, 0x81,0xe8,0x7e,0x31,0x8, 0x74, +0x4, 0xac,0x3b,0x12,0x51,0x91,0x12,0x51,0xca,0x4d,0x22,0x78,0x6, 0x9f,0x11,0x7f, +0x61,0x80,0xf, 0x74,0x4, 0xac,0xbf,0x49,0xd5,0x0, 0xca,0x49,0xc5,0x0, 0xc8,0x12, +0x51,0x88,0x7a,0x1f,0x2, 0xae,0x12,0x51,0xca,0xa, 0x3e,0x1b,0x34,0xbd,0x32,0x78, +0x6, 0x9f,0x44,0x7f,0x74,0x80,0x17,0x74,0x4, 0xac,0xbf,0x49,0xf5,0x0, 0xd2,0x49, +0xe5,0x0, 0xd0,0x12,0x1f,0xf1,0x49,0x95,0x0, 0xd2,0x49,0x85,0x0, 0xd0,0x12,0x16, +0x2d,0xbf,0x16,0x48,0x43,0x12,0x16,0x2d,0xbf,0x17,0x48,0x3c,0x12,0x16,0x2d,0xbf, +0x15,0x48,0x35,0x12,0x16,0x2d,0xbf,0x14,0x48,0x2e,0x12,0x17,0xc4,0x7e,0x1f,0x2, +0xae,0xbf,0x1, 0x48,0x23,0xa, 0x3c,0x19,0xf3,0x0, 0x3a,0xb, 0xc0,0x7e,0x30,0x4, +0xac,0x3f,0x2e,0x14,0x0, 0xcc,0x12,0x13,0xaa,0xb, 0x1c,0x12,0x13,0x9a,0xbe,0xc0, +0x4, 0x40,0x5, 0x7e,0xc0,0x4, 0x80,0xc, 0xb, 0xf0,0x7e,0x73,0x2, 0x56,0xbc,0x7f, +0x28,0x2, 0x61,0xf5,0x7e,0xb3,0x2, 0x54,0x20,0xe6,0x2, 0xc1,0x1, 0x4c,0xcc,0x68, +0x2, 0xc1,0x1, 0x6c,0xff,0xa1,0xfb,0x12,0x16,0x22,0x12,0x51,0x45,0xa, 0x1e,0x12, +0x16,0x26,0x12,0x51,0x91,0x2f,0x51,0x4c,0xff,0x68,0x7, 0x7c,0xbe,0x14,0xbc,0xbf, +0x78,0xa, 0x12,0x51,0x4e,0x7f,0x15,0x12,0x2a,0xb8,0x7f,0x51,0x7e,0x37,0x0, 0xbe, +0x6d,0x22,0xbf,0x51,0x18,0x2, 0xa1,0xf9,0x12,0x16,0x22,0x12,0x51,0x45,0x12,0x26, +0xc6,0x7f,0x1, 0x12,0x44,0x65,0x12,0x16,0x31,0xbf,0x10,0x18,0x2, 0xa1,0xf9,0x12, +0x16,0x22,0x12,0x51,0x45,0x7f,0x1, 0x2f,0x0, 0x2f,0x0, 0x12,0x44,0x65,0x12,0x16, +0x31,0xbf,0x10,0x48,0x2, 0xa1,0xf9,0x4c,0xff,0x78,0x4, 0x9f,0x66,0x80,0x2a,0x12, +0x16,0x22,0x12,0x51,0x88,0xa, 0x1e,0x12,0x16,0x26,0x49,0xd1,0x0, 0xca,0x49,0xc1, +0x0, 0xc8,0x2f,0x61,0x4c,0xff,0x68,0x7, 0x7c,0xbe,0x14,0xbc,0xbf,0x78,0xa, 0x12, +0x51,0x4e,0x7f,0x16,0x12,0x2a,0xb8,0x7f,0x61,0x7c,0xbe,0x14,0xbc,0xbf,0x78,0x4, +0x9f,0x77,0x80,0x2c,0x12,0x16,0x22,0x49,0x31,0x0, 0xd2,0x49,0x21,0x0, 0xd0,0xa, +0x1e,0x12,0x16,0x26,0x49,0xf1,0x0, 0xd2,0x49,0xe1,0x0, 0xd0,0x2f,0x71,0x4c,0xff, +0x68,0x4, 0xbc,0xbf,0x78,0xa, 0x12,0x51,0x4e,0x7f,0x17,0x12,0x2a,0xb8,0x7f,0x71, +0xbf,0x56,0x48,0x25,0xbf,0x57,0x48,0x21,0x7e,0xc0,0x2, 0xa, 0x2f,0xa, 0x3d,0x2d, +0x32,0x7a,0x73,0x0, 0x3a,0xa, 0x3e,0x2d,0x32,0x7a,0x73,0x0, 0x3b,0x7e,0xb3,0x2, +0x55,0x44,0x1, 0x7a,0xb3,0x2, 0x55,0x80,0x8, 0xb, 0xf0,0xbc,0xef,0x28,0x2, 0xa1, +0x7, 0x7c,0x6c,0x5e,0x60,0xf, 0x7e,0x73,0x0, 0x54,0x12,0xd, 0x48,0x7c,0x6c,0x5e, +0x60,0xf, 0x7e,0x73,0x0, 0x55,0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x73,0x0, 0x55,0xda, +0x3b,0x22,0xa, 0xf, 0xa, 0x1d,0x2d,0x10,0x3e,0x14,0x3e,0x14,0x22,0x74,0x4, 0xac, +0xbf,0x49,0x35,0x0, 0xce,0x49,0x25,0x0, 0xcc,0x22,0xca,0x3b,0xc2,0xf, 0x7e,0xb3, +0x2, 0xab,0x54,0x7f,0x7a,0xb3,0x2, 0xab,0x7e,0x67,0x2, 0xac,0x7e,0xb3,0x2, 0x54, +0x30,0xe5,0x10,0x80,0x4, 0xe4,0x12,0x17,0x56,0x12,0x13,0xb9,0x50,0xf7,0xd2,0xf, +0x12,0x3d,0xab,0x53,0xe3,0x1f,0x7e,0x34,0x2, 0xae,0x7e,0x24,0x0, 0x24,0x74,0xff, +0x12,0x2, 0xee,0x6c,0xee,0xe1,0x2, 0x6c,0xff,0x80,0xa, 0xe4,0xa, 0x3f,0x2d,0x36, +0x7a,0x39,0xb0,0xb, 0xf0,0x12,0x17,0xef,0x38,0xf1,0x7e,0x34,0x5, 0x3, 0x7e,0x24, +0x0, 0x24,0x12,0x26,0xdf,0x44,0x4, 0x7a,0xb3,0x2, 0x54,0x6c,0xff,0xa, 0x2f,0x7e, +0x34,0x0, 0x7, 0x9d,0x32,0x7a,0x73,0x5, 0x27,0x12,0x26,0x83,0x12,0x10,0x69,0x12, +0x46,0x3e,0xb, 0xf0,0xbe,0xf0,0x8, 0x78,0xe4,0x12,0x27,0x8e,0x6c,0xff,0x80,0x3b, +0xa, 0x2f,0x9, 0x62,0x2, 0xae,0xa, 0x1f,0x2d,0x16,0x7e,0x19,0x70,0xbc,0x67,0x28, +0x28,0x19,0x72,0x2, 0xae,0x7e,0xb3,0x2, 0x54,0x20,0xe0,0x7, 0x7e,0xb3,0x2, 0xa3, +0x30,0xe1,0x5, 0x12,0x16,0x2d,0x80,0x5, 0x12,0x16,0x2d,0x2f,0x11,0x2f,0x11,0x2f, +0x11,0x74,0x2, 0xac,0xbf,0x59,0x35,0x1, 0xa8,0xb, 0xf0,0x12,0x17,0xef,0x38,0xc0, +0xb, 0xe0,0x7e,0x73,0x2, 0xd, 0xbc,0x7e,0x28,0x2, 0xc1,0x77,0x6c,0xff,0x80,0xd, +0xa, 0x3f,0x9, 0x53,0x2, 0xae,0x2d,0x36,0x7a,0x39,0x50,0xb, 0xf0,0x12,0x17,0xef, +0x38,0xee,0x74,0x3, 0x12,0x0, 0x15,0x12,0x26,0x3c,0x12,0x27,0x83,0x30,0xf, 0x15, +0x7e,0xb3,0x2, 0x54,0x44,0x20,0x7a,0xb3,0x2, 0x54,0x80,0x4, 0xe4,0x12,0x17,0x56, +0x12,0x13,0xb9,0x50,0xf7,0x53,0xe3,0x1f,0x7e,0xb3,0x2, 0xa3,0x12,0x25,0x1d,0x7c, +0xb7,0x42,0xe3,0xda,0x3b,0x22,0x70,0x5, 0x43,0x87,0x1, 0x80,0xe, 0xb4,0x1, 0x5, +0x43,0x87,0x2, 0x80,0x6, 0xb4,0x2, 0x7, 0x43,0x87,0x2, 0x0, 0x0, 0x0, 0x0, 0x22, +0x12,0x2f,0xbf,0x12,0x29,0x37,0x7e,0x23,0x2, 0xc2,0x12,0x13,0xa2,0x7a,0x1f,0x2, +0xc6,0x7e,0x23,0x2, 0xc3,0x12,0x13,0xa2,0x7a,0x1f,0x2, 0xca,0x7e,0x23,0x2, 0xc4, +0x12,0x13,0xa2,0x7a,0x1f,0x2, 0xce,0x7e,0x23,0x2, 0xc5,0x12,0x13,0xa2,0x7a,0x1f, +0x2, 0xd2,0x7e,0x1f,0x2, 0xc6,0x7e,0xa0,0x1, 0x7e,0x90,0x4, 0xac,0x9a,0x49,0x14, +0x2, 0xc8,0x49,0x4, 0x2, 0xc6,0xbf,0x10,0x58,0x2, 0x7f,0x10,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xe6,0x22,0x74,0x4, 0xac,0xbf,0x49,0x15,0x0, 0xce,0x49,0x5, 0x0, 0xcc, +0x22,0x7e,0xa3,0x0, 0x54,0x7c,0xba,0xc4,0x54,0xf, 0x78,0x12,0x7e,0x1f,0x1, 0xa4, +0xbe,0x18,0xc, 0xe4,0x58,0x8, 0x7c,0xba,0x54,0xf0,0x7a,0xb3,0x0, 0x54,0x22,0x7e, +0x73,0x2, 0x58,0xbc,0x7f,0x22,0x7c,0xba,0xc4,0x3, 0x54,0x7, 0x22,0x9f,0x11,0x7a, +0x1f,0x1, 0xa4,0x6c,0xaa,0x9f,0x11,0x7e,0x30,0x4, 0xac,0x3a,0x59,0x31,0x1, 0x5e, +0x59,0x21,0x1, 0x5c,0x49,0xf1,0x0, 0xce,0x49,0xe1,0x0, 0xcc,0xbe,0x78,0x0, 0x32, +0x8, 0x3, 0x12,0x18,0x4d,0x49,0xf1,0x1, 0xe, 0x49,0xe1,0x1, 0xc, 0xbe,0x78,0x0, +0x32,0x8, 0x3, 0x12,0x18,0x4d,0x12,0x18,0x64,0x7e,0x7f,0x1, 0xa4,0xbf,0x17,0x8, +0x4, 0x7a,0x1f,0x1, 0xa4,0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xb9,0x22,0x7d,0x1, 0x2e, +0x4, 0x1, 0x5c,0x49,0x30,0x0, 0x2, 0xb, 0x8, 0x20,0x2f,0x17,0x59,0x30,0x0, 0x2, +0x1b,0x8, 0x20,0x22,0x49,0x31,0x1, 0x5e,0x49,0x21,0x1, 0x5c,0x22,0xca,0x3b,0xe4, +0x6c,0xdd,0xa, 0x3d,0x19,0xb3,0x0, 0x52,0xb, 0xd0,0xbe,0xd0,0x2, 0x78,0xf3,0x6c, +0xdd,0xa1,0x2, 0x12,0x1f,0xa5,0x7c,0xbc,0x84,0x7c,0xca,0x9f,0x11,0x7a,0x1f,0x2, +0xc8,0x7a,0x1f,0x2, 0xcc,0x7a,0x1f,0x2, 0xdc,0x12,0x2d,0x68,0x7a,0x1f,0x2, 0xd0, +0x7e,0x73,0x5, 0x54,0xa, 0xf7,0x6d,0xee,0xa, 0x3c,0x6d,0x22,0x7f,0x7, 0x12,0x0, +0x94,0x7a,0xf, 0x2, 0xb6,0x7f,0x17,0x1b,0x1c,0xbf,0x10,0x68,0xb, 0x12,0x2f,0xd1, +0x49,0x25,0x1, 0x60,0x7a,0x1f,0x2, 0xcc,0x7e,0x1f,0x2, 0xb6,0xbe,0x18,0x0, 0x0, +0x68,0xb, 0x12,0x2f,0xc8,0x49,0x25,0x1, 0x58,0x7a,0x1f,0x2, 0xc8,0x7e,0xb3,0x2, +0x54,0x20,0xe4,0x2, 0x41,0x2d,0x7e,0x37,0x2, 0x4d,0x12,0x1d,0x14,0xbe,0xb3,0x2, +0x58,0x50,0x4, 0x4c,0xcc,0x68,0x41,0x7d,0x23,0xb, 0x24,0x12,0x1f,0x76,0xbe,0xb3, +0x2, 0x58,0x50,0x5, 0x12,0x1d,0x96,0x68,0x2f,0x7d,0x23,0xb, 0x25,0x12,0x1f,0x76, +0xbe,0xb3,0x2, 0x58,0x50,0x8, 0x7e,0x53,0x5, 0x54,0xbc,0x5c,0x68,0x1a,0x2e,0x34, +0x0, 0x3, 0x12,0x1d,0x14,0xbe,0xb3,0x2, 0x58,0x40,0x2, 0x41,0x2d,0x7e,0xb3,0x5, +0x53,0x14,0xbc,0xbc,0x68,0x2, 0x41,0x2d,0x4c,0xcc,0x78,0x4, 0x6c,0xff,0x80,0x17, +0x12,0x1d,0x96,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xd, 0x12,0x1d,0x1d,0x78,0x5, 0x7e, +0xf0,0x2, 0x80,0x3, 0x7e,0xf0,0x3, 0xa, 0x1f,0x7d,0x1, 0x2e,0x7, 0x2, 0x4d,0x12, +0x1d,0x24,0x7c,0xab,0x74,0x4, 0xa4,0x12,0x16,0x31,0x7a,0x1f,0x2, 0xbe,0x7e,0x57, +0x1, 0xf6,0x1a,0x4a,0x1a,0x48,0xbf,0x21,0x48,0x2, 0x41,0x2d,0x7e,0x1f,0x2, 0xbe, +0x9f,0x12,0x12,0x1f,0x9a,0x1a,0x24,0x7e,0x2f,0x2, 0xbe,0xbf,0x12,0x58,0x4, 0x7a, +0x1f,0x2, 0xbe,0x7e,0x1f,0x2, 0xbe,0x7d,0x1, 0x2e,0x7, 0x2, 0x4f,0x12,0x1d,0x24, +0xca,0xb8,0x2e,0x17,0x2, 0x51,0x12,0x1d,0x9e,0x7c,0x3b,0xda,0xb8,0x12,0x1f,0xcd, +0x58,0x4, 0x7a,0x1f,0x2, 0xbe,0x4c,0xcc,0x68,0x5, 0x12,0x1d,0x1d,0x78,0x38,0x7e, +0xf, 0x2, 0xbe,0x7e,0x1f,0x2, 0xcc,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, +0xcc,0x80,0xa, 0x7d,0x51,0x6d,0x44,0x9f,0x12,0x7a,0x1f,0x2, 0xcc,0x7e,0x1f,0x2, +0xd8,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xd8,0x80,0x40,0x6d,0x0, 0x9f, +0x10,0x7a,0x1f,0x2, 0xd8,0x80,0x36,0x7e,0xf, 0x2, 0xbe,0x7e,0x1f,0x2, 0xc8,0xbf, +0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xc8,0x80,0xa, 0x7d,0x51,0x6d,0x44,0x9f, +0x12,0x7a,0x1f,0x2, 0xc8,0x7e,0x1f,0x2, 0xd4,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a, +0x2f,0x2, 0xd4,0x80,0x8, 0x6d,0x0, 0x9f,0x10,0x7a,0x1f,0x2, 0xd4,0x7e,0x93,0x5, +0x54,0xa, 0x29,0xa, 0x3c,0x12,0x45,0xd6,0x1a,0x38,0x7d,0xf3,0x1a,0xe6,0x7f,0x7, +0x1b,0xc, 0x7e,0x5f,0x2, 0xc8,0x7f,0x15,0x12,0x0, 0x78,0x7f,0x41,0x7e,0x6f,0x2, +0xd0,0x7f,0x16,0x7f,0x7, 0x12,0x0, 0x78,0x2f,0x41,0x7f,0x7, 0xb, 0xc, 0x7e,0x7f, +0x2, 0xcc,0x7f,0x17,0x12,0x0, 0x78,0x2f,0x14,0x7a,0x1f,0x2, 0xae,0x7f,0x16,0x2f, +0x15,0x2f,0x17,0x7a,0x1f,0x2, 0xb2,0x7e,0xf, 0x2, 0xb6,0xbe,0x8, 0x0, 0x0, 0x38, +0x2, 0x61,0x4c,0xa, 0x39,0x6d,0x22,0x1b,0x1c,0xbf,0x1, 0x40,0x2, 0x61,0x4c,0xe4, +0x7a,0xb3,0x5, 0x51,0x12,0x1f,0x6f,0x7e,0x1f,0x2, 0xcc,0x7a,0x1d,0x10,0x7a,0xd1, +0x15,0x7e,0x1f,0x2, 0xd0,0x7e,0xf, 0x2, 0xc8,0x7c,0xbc,0x12,0x40,0x9f,0x7c,0xeb, +0x7e,0xa3,0x5, 0x51,0xbe,0xa0,0x0, 0x28,0x50,0xbe,0xe0,0x0, 0x48,0x4b,0x7e,0xb3, +0x5, 0x53,0xbc,0xbe,0x8, 0x43,0x7e,0xb3,0x5, 0x54,0xa, 0x2b,0x1a,0x3e,0x12,0x0, +0x46,0x7c,0x95,0x7a,0x91,0x8, 0x1a,0x1e,0x3e,0x14,0x3e,0x14,0x12,0x18,0x64,0xa, +0x1a,0x6d,0x0, 0x12,0x0, 0x78,0x74,0x7, 0x7f,0x71,0x1e,0xf4,0xe, 0xe4,0x50,0x4, +0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7a,0x7f,0x2, 0xdc,0x1a,0x19,0x12,0x1f,0xb0, +0x2f,0x10,0x12,0x1f,0x91,0x2f,0x17,0x80,0x3f,0x7e,0x73,0x5, 0x52,0xbe,0x70,0x0, +0x8, 0x3a,0x7e,0x63,0x5, 0x54,0xa, 0x26,0x1a,0x47,0x7d,0x34,0x12,0x0, 0x46,0x7c, +0x75,0x7a,0x71,0x8, 0x3e,0x44,0x3e,0x44,0x49,0x14,0x1, 0x5e,0x49,0x4, 0x1, 0x5c, +0x7f,0x70,0x1e,0xf4,0xe, 0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x1a,0x17,0x12,0x1f, +0xb0,0x9f,0x10,0x12,0x1f,0x91,0x9f,0x17,0x7a,0x1f,0x2, 0xb2,0x7e,0x1f,0x2, 0xae, +0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf, 0x2, 0xb2,0x12,0x0, 0xe5,0x2e,0x18, +0x0, 0x20,0xbe,0x18,0x0, 0x0, 0x58,0x8, 0x6d,0x11,0x7a,0x17,0x2, 0xc6,0x80,0x4, +0x7a,0x37,0x2, 0xc6,0x12,0x1f,0xa5,0xa, 0x2a,0x1b,0x24,0xa, 0x3c,0xbd,0x32,0x8, +0xc, 0xa, 0x2a,0xa, 0x3c,0x9d,0x32,0x7c,0xb7,0xf5,0x9, 0x80,0x8, 0xa, 0x4a,0xa, +0x5c,0x2d,0x54,0xf5,0x9, 0x7c,0xbc,0x12,0x1d,0x2d,0x7a,0x1f,0x2, 0xb6,0xe5,0x9, +0x12,0x1d,0x2d,0x7a,0x1f,0x2, 0xba,0x12,0x50,0xfc,0x8, 0x5, 0x12,0x51,0x35,0x80, +0x3, 0x12,0x1f,0xe1,0x12,0x50,0xb5,0x7a,0x1f,0x2, 0xc2,0x7e,0xb3,0x2, 0x54,0x20, +0xe3,0x2, 0x81,0xec,0x12,0x7, 0x79,0xb4,0x1, 0x2, 0x80,0x2, 0x81,0xec,0x7e,0x37, +0x2, 0x0, 0x1a,0x26,0x1a,0x24,0x7e,0xf, 0x2, 0xc2,0xbf,0x1, 0x48,0xb, 0x7e,0x37, +0x2, 0x2, 0x12,0x1d,0xab,0x18,0x2, 0x81,0xec,0x12,0x1d,0x1d,0x38,0x12,0xa, 0x7, +0x7e,0x63,0x2, 0x56,0xa, 0x16,0x9d,0x10,0xa, 0x2c,0xbd,0x12,0x8, 0x2, 0x81,0xec, +0xbc,0x7c,0xa, 0x3c,0x28,0x14,0x2e,0x37,0x2, 0x45,0x12,0x1d,0x14,0x12,0x1f,0x7f, +0x12,0x1d,0x14,0xf5,0xa, 0x7a,0xc1,0xb, 0x80,0x1d,0x2e,0x37,0x2, 0x45,0x7e,0xa3, +0x5, 0x53,0xa, 0x2a,0x12,0x1d,0x12,0x12,0x1f,0x7f,0x12,0x1d,0x12,0xf5,0xa, 0xa, +0x4a,0xa, 0x5c,0x9d,0x54,0xf5,0xb, 0x7e,0x73,0x2, 0x58,0xbe,0x71,0xa, 0x38,0x2, +0x81,0xec,0xbc,0x7f,0x38,0x2, 0x81,0xec,0x7e,0xa1,0xa, 0x74,0x4, 0xa4,0x12,0x17, +0xc8,0x12,0x16,0x2d,0x2f,0x10,0x7a,0x1f,0x2, 0xbe,0x7e,0x17,0x1, 0xf6,0x1a,0x2, +0x1a,0x0, 0xbf,0x1, 0x48,0x2, 0x81,0xec,0x7e,0x1f,0x2, 0xbe,0x9f,0x10,0x12,0x1f, +0x9a,0x1a,0x24,0x7e,0xf, 0x2, 0xbe,0xbf,0x10,0x58,0x4, 0x7a,0x1f,0x2, 0xbe,0x7e, +0x1f,0x2, 0xbe,0xe5,0xb, 0xa, 0x1b,0x7d,0x1, 0x2e,0x7, 0x2, 0x49,0x12,0x1d,0x24, +0x54,0x7f,0xca,0xb8,0x2e,0x17,0x2, 0x4b,0x12,0x1d,0x9e,0x7c,0x3b,0xda,0xb8,0x12, +0x1f,0xcd,0x58,0x4, 0x7a,0x1f,0x2, 0xbe,0xe5,0xb, 0xa, 0x3b,0x2e,0x37,0x2, 0x49, +0x12,0x1d,0x14,0x23,0x54,0x1, 0x68,0x7, 0x12,0x1f,0x88,0x2f,0x10,0x80,0x15,0x12, +0x1f,0x88,0xbf,0x10,0x50,0x8, 0x9f,0x0, 0x7a,0xf, 0x2, 0xba,0x80,0xa, 0x7e,0xf, +0x2, 0xbe,0x9f,0x10,0x7a,0x1f,0x2, 0xba,0x12,0x50,0xfc,0x8, 0x5, 0x12,0x51,0x35, +0x80,0x3, 0x12,0x1f,0xe1,0x12,0x50,0xb5,0x7a,0x1f,0x2, 0xc2,0x7e,0x47,0x2, 0xc6, +0x74,0x5, 0xac,0xbd,0x59,0x45,0x0, 0x3e,0x7e,0x1f,0x2, 0xc2,0x59,0x35,0x0, 0x40, +0xb, 0xd0,0x12,0x7, 0x79,0xa, 0x2b,0xa, 0x3d,0xbd,0x32,0x58,0x2, 0x1, 0x83,0xda, +0x3b,0x22,0x9d,0x32,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0x73,0x5, +0x54,0xbc,0x7c,0x22,0x7a,0x11,0x82,0x7a,0x1, 0x83,0xe4,0x93,0x22,0x7c,0xab,0x9f, +0x66,0x7f,0x56,0x7e,0x78,0x0, 0x1, 0x7e,0x33,0x5, 0x54,0xa, 0x23,0xa, 0x3a,0x12, +0x0, 0x46,0x7c,0x75,0x4c,0x77,0x68,0xd, 0x7e,0x50,0x4, 0xac,0x5a,0x49,0xb2,0x0, +0xca,0x49,0xa2,0x0, 0xc8,0x7c,0xb3,0x14,0xbc,0xb7,0x68,0xd, 0x7e,0x70,0x4, 0xac, +0x7a,0x49,0xd3,0x0, 0xd2,0x49,0xc3,0x0, 0xd0,0x74,0x4, 0xa4,0x12,0x16,0x31,0x12, +0x1d,0x85,0x2f,0x71,0x7f,0x15,0x12,0x1d,0x85,0x2f,0x71,0x7f,0x16,0x12,0x1d,0x85, +0x2f,0x71,0x7f,0x17,0x22,0x7f,0x1, 0x7e,0x37,0x1, 0xf0,0x12,0x1d,0xab,0x8, 0x3, +0x7f,0x10,0x22,0x9f,0x11,0x22,0x7e,0xb3,0x5, 0x54,0x14,0xbc,0xbc,0x22,0x7a,0x31, +0x82,0x7a,0x21,0x83,0xe4,0x93,0x22,0x6d,0x33,0x9d,0x34,0x1a,0x26,0x1a,0x24,0xbf, +0x1, 0x22,0xca,0xf8,0x7c,0xab,0x7f,0x70,0x7f,0x61,0x6c,0x11,0x6c,0xff,0x7e,0x34, +0x2, 0xae,0x7e,0x24,0x0, 0x40,0xe4,0x12,0x2, 0xee,0x6c,0x0, 0xa5,0xb8,0x8, 0x6, +0xbc,0xa1,0x28,0x2, 0x6c,0x11,0x7e,0x30,0x4, 0xac,0x30,0x12,0x18,0x64,0xbf,0x16, +0x8, 0x11,0x7e,0x30,0x4, 0xac,0x31,0x59,0x31,0x2, 0xb0,0x59,0x21,0x2, 0xae,0xb, +0x10,0x80,0x6, 0xbc,0xa1,0x28,0x2, 0x6c,0x11,0xb, 0x0, 0xa5,0xb8,0x10,0xcd,0xbc, +0xa1,0x38,0x2b,0x7e,0x1f,0x1, 0xa4,0xbf,0x17,0x58,0x23,0x7e,0x34,0x2, 0xae,0xa, +0x2a,0x12,0x2f,0xe4,0x12,0x1f,0xf1,0x49,0x35,0x2, 0xb0,0x49,0x25,0x2, 0xae,0x7f, +0x1, 0x2f,0x0, 0x7e,0x1f,0x2, 0xae,0xbf,0x1, 0x8, 0x3, 0x7e,0xf0,0x1, 0x7c,0xbf, +0xda,0xf8,0x22,0x75,0x8, 0x4, 0x7e,0x18,0x27,0x10,0x7e,0x8, 0x9c,0x40,0x74,0x8, +0x12,0x1d,0xb2,0x70,0x10,0x75,0x8, 0x4, 0x7e,0x18,0x4e,0x20,0x7e,0x8, 0xea,0x60, +0x74,0x6, 0x12,0x1d,0xb2,0x70,0x10,0x75,0x8, 0x4, 0x7e,0x18,0x5, 0xdc,0x7e,0x8, +0x13,0x88,0x74,0x8, 0x12,0x1d,0xb2,0x60,0x10,0x7e,0xb3,0x2, 0x54,0x44,0x2, 0x7a, +0xb3,0x2, 0x54,0xe4,0x7a,0xb3,0x5, 0x59,0x22,0x7e,0xa3,0x2, 0x54,0x7c,0xba,0x30, +0xe1,0x1b,0x7e,0xb3,0x5, 0x59,0x4, 0x7a,0xb3,0x5, 0x59,0xbe,0xb0,0x14,0x40,0xd, +0xe4,0x7a,0xb3,0x5, 0x59,0x7c,0xba,0x54,0xfd,0x7a,0xb3,0x2, 0x54,0x22,0x6c,0xaa, +0x80,0x9, 0x12,0x1f,0x5f,0x70,0x2, 0xe1,0x34,0xb, 0xa0,0x12,0x1f,0x3f,0x38,0xf2, +0x7e,0xb3,0x2, 0x54,0x20,0xe1,0x7d,0x6c,0xaa,0x80,0x74,0x12,0x1f,0x5f,0xb4,0x1, +0x6c,0x7e,0xb3,0x2, 0x56,0xbc,0xba,0x28,0x1f,0x12,0x1f,0x51,0x7e,0xb3,0x2, 0x36, +0x12,0x1f,0x46,0xbf,0x7, 0x8, 0x6, 0x7e,0xb3,0x2, 0x34,0x80,0x1d,0x12,0x1d,0xa7, +0x58,0x4b,0x7e,0xb3,0x2, 0x35,0x80,0x32,0x12,0x1f,0x51,0x7e,0xb3,0x2, 0x39,0x12, +0x1f,0x46,0xbf,0x7, 0x8, 0x1b,0x7e,0xb3,0x2, 0x37,0xa, 0xeb,0x7e,0x50,0x2, 0xac, +0x5a,0x7d,0xf2,0x2e,0xf4,0x1, 0xa8,0xb, 0xf8,0x20,0x2d,0x2e,0x1b,0xf8,0x20,0x80, +0x1c,0x12,0x1d,0xa7,0x58,0x17,0x7e,0xb3,0x2, 0x38,0xa, 0x4b,0x7e,0x50,0x2, 0xac, +0x5a,0x2e,0x24,0x1, 0xa8,0xb, 0x28,0x30,0x9d,0x34,0x1b,0x28,0x30,0xb, 0xa0,0x12, +0x1f,0x3f,0x38,0x87,0x2, 0x1f,0x37,0x12,0x26,0xe8,0x74,0x1, 0x2, 0x2, 0xee,0x7e, +0xb3,0x2, 0x58,0xbc,0xba,0x22,0xa, 0x4b,0x7d,0x24,0x7d,0xf4,0x1a,0x24,0x1a,0xe4, +0x22,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x13,0x0, 0xce,0x49,0x3, 0x0, 0xcc,0x22,0x7e, +0x34,0x2, 0x10,0x7c,0xba,0x7d,0x23,0xa, 0x3b,0x2d,0x32,0x7e,0x39,0xb0,0x22,0x74, +0xff,0x7a,0xb3,0x5, 0x52,0x22,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7c, +0xfb,0xa, 0x3c,0x2e,0x37,0x2, 0x47,0x22,0x7e,0xf, 0x2, 0xbe,0x7e,0x1f,0x2, 0xba, +0x22,0x7a,0x1f,0x2, 0xae,0x7e,0x1f,0x2, 0xb2,0x22,0x7a,0x1f,0x2, 0xbe,0x7e,0x37, +0x1, 0xf8,0x1a,0x26,0x22,0xa, 0x3d,0x9, 0xc3,0x0, 0x3a,0x7e,0xa3,0x5, 0x53,0x22, +0x1a,0x2, 0x7f,0x17,0x12,0x0, 0x78,0x7f,0x1, 0x7e,0x1f,0x2, 0xae,0x22,0x12,0x4f, +0xb1,0x4c,0x99,0x68,0x7, 0xa, 0x19,0x6d,0x0, 0x2, 0x0, 0xe5,0x22,0x12,0x1f,0xbe, +0x7f,0x1, 0x7a,0xf, 0x2, 0xbe,0x7e,0x37,0x1, 0xfa,0x1a,0x26,0x1a,0x24,0xbf,0x10, +0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xba,0x7f,0x17,0x12,0x0, 0x78,0x7e,0xf, 0x2, 0xb6, +0x22,0x7e,0xa1,0x8, 0x74,0x4, 0xa4,0x22,0xca,0xf8,0x7c,0xf7,0x7c,0xab,0x7c,0xbf, +0x1e,0xb0,0xa, 0x4b,0xa, 0xa, 0x12,0x20,0x17,0x7d,0x12,0x3e,0x14,0x12,0x20,0x17, +0x7d,0x51,0x2d,0x53,0xda,0xf8,0x22,0x7d,0x30,0x7d,0x24,0x2, 0x0, 0x46,0x9f,0x11, +0x7a,0x1f,0x0, 0x56,0x7a,0x1f,0x0, 0xba,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a,0x49, +0xf3,0x1, 0x5e,0x49,0xe3,0x1, 0x5c,0x7e,0xf, 0x0, 0x56,0x2f,0x7, 0x7a,0xf, 0x0, +0x56,0x49,0x13,0x1, 0x7e,0x49,0x3, 0x1, 0x7c,0x7e,0x1f,0x0, 0xba,0x2f,0x10,0x7a, +0x1f,0x0, 0xba,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xd0,0x22,0xa, 0x2b,0x5e,0x24,0x0, +0x1, 0x7c,0xa7,0x1e,0xa0,0xa, 0x3a,0xad,0x32,0x7c,0x5b,0x1e,0x50,0xa, 0x55,0x2d, +0x53,0x22,0x7e,0xb3,0x0, 0xb4,0xca,0xf8,0x7c,0xfb,0x74,0x20,0x7a,0xb3,0x2, 0x56, +0x74,0x4, 0x7a,0xb3,0x2, 0x57,0x74,0x24,0x7a,0xb3,0x2, 0x58,0x7e,0xb3,0x2, 0xa9, +0x44,0xf, 0x7a,0xb3,0x2, 0xa9,0x44,0xf0,0x7a,0xb3,0x2, 0xa9,0x7e,0x73,0x0, 0xa6, +0x7a,0x73,0x2, 0xa7,0x7e,0x73,0x0, 0xa7,0x7a,0x73,0x2, 0xa8,0x7e,0x34,0x2, 0x5e, +0x7e,0x24,0x2, 0x59,0x74,0x24,0x7e,0x30,0x98,0x12,0x21,0xe6,0x6c,0x33,0x80,0x11, +0x7c,0xb3,0x7e,0x73,0x2, 0x56,0x12,0x20,0x5b,0xa, 0x33,0x19,0xb3,0x2, 0x7d,0xb, +0x30,0x7e,0x23,0x2, 0x56,0xbc,0x23,0x38,0xe7,0x6c,0x33,0x80,0x18,0xa, 0x3, 0x7e, +0x53,0x2, 0x56,0xa, 0x35,0x2d,0x30,0x7c,0x27,0xa, 0x33,0xa, 0x5, 0x2d,0x3, 0x19, +0x20,0x2, 0x7d,0xb, 0x30,0x7e,0x23,0x2, 0x57,0xbc,0x23,0x38,0xe0,0x7e,0xb3,0x2, +0xa3,0x44,0x1, 0x7a,0xb3,0x2, 0xa3,0xbe,0xf0,0x1, 0x78,0xd, 0x7e,0xb3,0x2, 0xa3, +0x54,0xfd,0x12,0x21,0xcb,0x44,0x8, 0x80,0x21,0xbe,0xf0,0x2, 0x7e,0xb3,0x2, 0xa3, +0x78,0x11,0x54,0xfd,0x7a,0xb3,0x2, 0xa3,0x7e,0xb3,0x2, 0xab,0x54,0xfb,0x12,0x21, +0xd5,0x80,0x7, 0x44,0x2, 0x12,0x21,0xcb,0x44,0x18,0x7a,0xb3,0x2, 0xab,0x7e,0xb3, +0x2, 0xa3,0x54,0xfb,0x7a,0xb3,0x2, 0xa3,0x44,0x18,0x7a,0xb3,0x2, 0xa3,0x7e,0x63, +0x0, 0xb5,0x5e,0x60,0x7, 0x7c,0xb6,0xc4,0x23,0x54,0xe0,0x7c,0x6b,0x7e,0x73,0x2, +0xa3,0x12,0x21,0xdc,0x7c,0xb7,0xc4,0x3, 0x54,0x7, 0xbe,0xb0,0x0, 0x28,0x10,0x7c, +0xb7,0x30,0xe1,0xb, 0x7c,0x67,0x9e,0x60,0x20,0x5e,0x60,0xe0,0x12,0x21,0xdc,0x7e, +0x63,0x0, 0xb6,0x5e,0x60,0x7f,0x7e,0x73,0x2, 0xa4,0x5e,0x70,0x80,0x4c,0x76,0x7a, +0x73,0x2, 0xa4,0x7e,0x63,0x0, 0xb7,0x5e,0x60,0x7f,0x7e,0x73,0x2, 0xa5,0x5e,0x70, +0x80,0x4c,0x76,0x7a,0x73,0x2, 0xa5,0x7e,0xb3,0x2, 0xa6,0x54,0xf0,0x44,0x1, 0x7a, +0xb3,0x2, 0xa6,0x54,0xf, 0x44,0x20,0x7a,0xb3,0x2, 0xa6,0x12,0x25,0xe7,0x7a,0xb3, +0x2, 0xab,0x54,0x7f,0x7a,0xb3,0x2, 0xab,0xda,0xf8,0x22,0x7a,0xb3,0x2, 0xa3,0x7e, +0xb3,0x2, 0xab,0x44,0x4, 0x7a,0xb3,0x2, 0xab,0x54,0xc7,0x22,0x5e,0x70,0x1f,0x4c, +0x76,0x7a,0x73,0x2, 0xa3,0x22,0x7c,0x23,0x7c,0x3b,0xa5,0xba,0x97,0x24,0xbe,0x30, +0x1c,0x50,0x4, 0x7c,0x23,0x80,0x3, 0x7e,0x20,0x1c,0x6c,0xaa,0x80,0xf, 0x12,0x22, +0x21,0xa, 0x4b,0x2e,0x44,0x2, 0xc2,0x12,0x22,0x27,0x12,0x22,0x30,0xbc,0x2a,0x38, +0xed,0x22,0x6c,0xaa,0x80,0x6, 0x12,0x22,0x21,0x12,0x22,0x30,0xbc,0x3a,0x38,0xf6, +0x22,0xa, 0xa, 0x7d,0x40,0x2d,0x43,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x22, +0x2d,0x2, 0x7a,0x9, 0xb0,0xb, 0xa0,0x22,0xe5,0x26,0x30,0xe0,0x20,0x12,0x20,0x72, +0x12,0x24,0xff,0x78,0x6, 0x7e,0x34,0x0, 0xa8,0x80,0x9, 0xbe,0xa0,0x2, 0x78,0x7, +0x7e,0x34,0x0, 0xae,0x12,0x24,0x30,0x12,0x16,0x3a,0x53,0x26,0xfc,0xe5,0x26,0x30, +0xe2,0x12,0x53,0xca,0xe1,0x7e,0x73,0x0, 0xb8,0xa, 0x37,0x3e,0x34,0x7c,0xb7,0x42, +0xca,0x53,0x26,0xfb,0x22,0x12,0x0, 0x2e,0x70,0x2, 0x61,0x53,0x80,0x4, 0xe4,0x12, +0x17,0x56,0x12,0x13,0xb9,0x50,0xf7,0x75,0xe1,0x0, 0x12,0x25,0xa, 0x7c,0xba,0x12, +0x24,0xf6,0x12,0x25,0x14,0x75,0xe3,0x0, 0x7c,0xba,0x1e,0xb0,0x12,0x24,0xf6,0x7c, +0xb7,0x42,0xe3,0x7c,0xba,0xc4,0x23,0x54,0x3, 0xa, 0x3b,0x12,0x25,0x27,0x7c,0xb7, +0x42,0xe3,0x12,0x25,0x1b,0x7c,0xb7,0x42,0xe3,0x75,0xe7,0x0, 0x7c,0xba,0x30,0xe1, +0x5, 0x43,0xe7,0x33,0x80,0x3, 0x43,0xe7,0x11,0x74,0x1, 0x7e,0x73,0x2, 0xa4,0x5e, +0x70,0x7f,0x12,0x23,0x5a,0x74,0x2, 0x7e,0x73,0x2, 0xa5,0x5e,0x70,0x7f,0x12,0x23, +0x5a,0x74,0x3, 0xca,0xb8,0x7e,0x63,0x2, 0xa6,0x7c,0x76,0x12,0x25,0x2e,0x7c,0x7b, +0x7c,0xb6,0xc4,0x54,0xf, 0x2c,0x7b,0xda,0xb8,0x12,0x23,0x5a,0x74,0x6, 0x7e,0x70, +0x61,0x12,0x23,0x5a,0x12,0x23,0x60,0x74,0x53,0x7e,0x73,0x2, 0xa9,0x5e,0x70,0xf, +0x12,0x23,0x5a,0x74,0x54,0xca,0xb8,0x7e,0xb3,0x2, 0xa9,0xc4,0x7c,0x7b,0x5e,0x70, +0xf, 0xda,0xb8,0x12,0x23,0x5a,0x7e,0xb3,0x2, 0xa3,0xc4,0x23,0x54,0x3, 0xbe,0xb0, +0x1, 0x68,0x3, 0xb4,0x2, 0x15,0x74,0x5b,0x7e,0x73,0x2, 0xaa,0x12,0x23,0x5a,0x74, +0x5c,0x7e,0x73,0x2, 0xab,0x5e,0x70,0x3, 0x12,0x23,0x5a,0x43,0xe1,0x8, 0x74,0x2, +0x2, 0x26,0x28,0x22,0x7c,0xb6,0x24,0xb, 0x7c,0x7a,0xf5,0xe4,0x7a,0x71,0xe5,0x22, +0x53,0xe1,0xf, 0x7e,0x73,0x2, 0xab,0x7c,0xb7,0x1e,0xb0,0x1e,0xb0,0x54,0x1, 0xa, +0x2b,0x12,0x24,0xed,0x7c,0xb5,0x42,0xe1,0x7c,0xb7,0x30,0xe2,0x58,0x7c,0xb7,0xc4, +0x23,0x7c,0x7b,0x5e,0x70,0x7, 0xa5,0xbf,0x0, 0x5, 0x7e,0x60,0x4, 0x80,0x39,0xa5, +0xbf,0x1, 0x11,0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, 0x7e,0x60,0x2, 0x80,0x29,0x7e, +0x60,0x5, 0x80,0x24,0xa5,0xbf,0x3, 0x11,0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, 0x7e, +0x60,0x7, 0x80,0x14,0x7e,0x60,0x6, 0x80,0xf, 0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, +0x7e,0x60,0x3, 0x80,0x3, 0x7e,0x60,0x1, 0xa, 0x26,0x3e,0x24,0x12,0x24,0xed,0x7c, +0x75,0x7c,0xb7,0x42,0xe1,0x74,0x7, 0x7e,0x73,0x2, 0x56,0x12,0x23,0x5a,0x74,0x8, +0x7e,0x73,0x2, 0x57,0x12,0x23,0x5a,0x74,0x9, 0x6c,0x77,0x12,0x23,0x5a,0x6c,0xaa, +0x80,0xf, 0x7c,0xba,0x24,0x2f,0xa, 0x4a,0x9, 0x74,0x2, 0x59,0x12,0x23,0x5a,0xb, +0xa0,0x7e,0x73,0x2, 0x58,0xbc,0x7a,0x38,0xe9,0x7c,0xa7,0x80,0xc, 0x7c,0xba,0x24, +0x2f,0x7e,0x70,0x3f,0x12,0x23,0x5a,0xb, 0xa0,0xbe,0xa0,0x24,0x40,0xef,0x74,0x56, +0x7e,0x73,0x2, 0xa7,0x12,0x23,0x5a,0x74,0x57,0x7e,0x73,0x2, 0xa8,0x2, 0x23,0x5a, +0x7d,0x23,0x74,0x7, 0x7e,0x70,0x10,0x12,0x23,0x5a,0x74,0x8, 0x12,0x23,0x5a,0x74, +0x9, 0x7e,0x70,0x4, 0x12,0x23,0x5a,0x74,0x56,0x7e,0x29,0x70,0x12,0x23,0x5a,0x74, +0x57,0x9, 0x72,0x0, 0x1, 0x12,0x23,0x5a,0x74,0x58,0x9, 0x72,0x0, 0x2, 0x2, 0x23, +0x5a,0xca,0xf8,0x12,0xf, 0x69,0x12,0x26,0xcd,0x7a,0x37,0x2, 0xac,0x12,0x26,0xbf, +0x12,0x20,0x72,0x12,0x3c,0x77,0x12,0x24,0xff,0x78,0x6, 0x7e,0x34,0x0, 0xa8,0x80, +0x9, 0xbe,0xa0,0x2, 0x78,0x7, 0x7e,0x34,0x0, 0xae,0x12,0x24,0x30,0x12,0x16,0x3a, +0x75,0x18,0x3, 0x75,0x16,0x40,0x12,0xf, 0x69,0x7a,0x37,0x0, 0x38,0xe5,0x18,0xb4, +0x3, 0x42,0xe5,0x1e,0x60,0xf0,0x12,0x27,0x83,0x12,0x22,0x38,0x12,0x10,0x69,0x6c, +0xff,0x80,0x12,0x74,0x4, 0xac,0xbf,0x49,0x35,0x0, 0xce,0x74,0x2, 0xac,0xbf,0x59, +0x35,0x4, 0x31,0xb, 0xf0,0x12,0x17,0xef,0x38,0xe9,0x75,0x1e,0x0, 0x7e,0xb3,0x4, +0xd9,0x54,0x7f,0x7a,0xb3,0x4, 0xd9,0xe5,0x26,0x20,0xe0,0xba,0x74,0x1, 0x7a,0xb3, +0x0, 0xb9,0x80,0xb2,0xe5,0x18,0x7a,0xb3,0x3, 0xc4,0xda,0xf8,0x22,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x22,0x1e,0xb0,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x22,0x12, +0x22,0x75,0x7e,0xa3,0x0, 0xb4,0xbe,0xa0,0x1, 0x22,0x7e,0xa3,0x2, 0xa3,0x7c,0xba, +0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x7c,0xb7,0x42,0xe1,0x22,0x7c,0xba,0xc4,0x3, 0x54, +0x7, 0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x5e,0x70, +0xf, 0x7c,0xb7,0xc4,0x54,0xf0,0x22,0x12,0x22,0x75,0x12,0x16,0x3a,0x12,0x26,0x15, +0x2, 0x25,0x43,0xca,0x79,0x12,0x25,0xe7,0x7a,0xb3,0x2, 0xab,0x7e,0x34,0x2, 0xae, +0x7e,0x24,0x0, 0x48,0x12,0x26,0xdf,0x30,0xe0,0x3f,0x44,0x4, 0x7a,0xb3,0x2, 0x54, +0x6c,0xee,0x80,0x28,0x12,0x10,0x69,0x6c,0xff,0x80,0x1a,0x7e,0x50,0x2, 0xac,0x5f, +0x49,0xf2,0x2, 0xae,0x6d,0xee,0x12,0x17,0xc4,0xbf,0x7, 0x8, 0x6, 0x7d,0x31,0x59, +0x32,0x2, 0xae,0xb, 0xf0,0x12,0x17,0xef,0x38,0xe1,0xb, 0xe0,0x7e,0x73,0x2, 0xc, +0xbc,0x7e,0x38,0xd0,0x12,0x27,0x8e,0x80,0x31,0x7e,0xe0,0x1, 0x12,0x10,0x69,0x6c, +0xff,0x80,0x1b,0x12,0x16,0x2d,0x12,0x26,0xc6,0x7d,0x13,0x7e,0x50,0x2, 0xac,0x5f, +0x2e,0x24,0x2, 0xae,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xf0,0x12,0x17, +0xef,0x38,0xe0,0xb, 0xe0,0xbe,0xe0,0x4, 0x28,0xd2,0x6c,0xee,0x80,0xe, 0x74,0x2, +0xac,0xbe,0x49,0x35,0x2, 0xae,0x59,0x35,0x1, 0xa8,0xb, 0xe0,0x7e,0x73,0x2, 0x58, +0xbc,0x7e,0x38,0xea,0xda,0x79,0x22,0x7e,0xb3,0x2, 0xab,0x54,0xbf,0x22,0xca,0x79, +0x6d,0x77,0x7a,0x77,0x0, 0x7f,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x0, 0x38,0x12,0x25, +0xe7,0x7a,0xb3,0x2, 0xab,0x12,0x16,0x3a,0x12,0x25,0x43,0x7a,0x77,0x0, 0x7f,0x12, +0x26,0xf1,0xda,0x79,0x22,0x74,0x20,0x7a,0xb3,0x3, 0xa9,0x74,0xe, 0x7a,0xb3,0x3, +0xaa,0x12,0x26,0xe8,0xe4,0x2, 0x2, 0xee,0x7c,0xab,0x80,0x7, 0x7e,0x34,0x0, 0x42, +0x12,0x27,0x99,0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xf1,0x22,0x7e,0x27,0x2, 0xac, +0x6c,0x66,0x80,0x8, 0x12,0x26,0xb1,0x12,0x23,0x54,0xb, 0x60,0x7e,0x73,0x2, 0x58, +0xbc,0x76,0x38,0xf0,0x22,0x6c,0x77,0xa, 0x27,0x9, 0x62,0x0, 0xc0,0x19,0x62,0x0, +0xc2,0xb, 0x70,0xbe,0x70,0x2, 0x40,0xef,0x7e,0x73,0x0, 0x54,0x12,0x25,0x2e,0x4c, +0x7b,0x7a,0x73,0x0, 0x54,0x7e,0x73,0x0, 0x55,0x12,0x25,0x2e,0x4c,0x7b,0x7a,0x73, +0x0, 0x55,0x22,0x7e,0xb3,0x2, 0xab,0x20,0xe7,0x26,0x7e,0x27,0x2, 0xac,0x6c,0x66, +0x80,0x16,0x12,0x26,0xb1,0x12,0x26,0xd6,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0x4c,0xa7,0x12,0x23,0x54,0xb, 0x60,0x7e,0x73,0x2, 0x58,0xbc,0x76,0x38,0xe2, +0x22,0xa, 0x16,0x9, 0x71,0x2, 0x7d,0xa, 0x17,0x2d,0x12,0x7e,0x19,0xa0,0x22,0x75, +0x18,0x3, 0x75,0x1e,0x0, 0x22,0x7e,0x8, 0x0, 0x4, 0x2, 0x0, 0xe5,0x7a,0x37,0x0, +0x38,0x7e,0x34,0x0, 0x82,0x22,0x7e,0xb3,0x5, 0x27,0x7e,0x44,0x0, 0x1, 0x22,0xe4, +0x12,0x2, 0xee,0x7e,0xb3,0x2, 0x54,0x22,0x7e,0x34,0x2, 0x10,0x7e,0x24,0x0, 0x24, +0x22,0x7e,0x34,0x0, 0x64,0x7a,0x37,0x0, 0x38,0x22,0x6d,0x33,0x7a,0x37,0x0, 0x7f, +0x12,0x26,0xf1,0x2, 0x27,0x6, 0x7e,0x34,0x3, 0x88,0x7e,0xb3,0x3, 0xe7,0x30,0xe0, +0x71,0x54,0xfe,0x7a,0xb3,0x3, 0xe7,0x9, 0x53,0x0, 0x5, 0x7a,0x53,0x0, 0x67,0xa, +0x25,0x12,0x24,0xed,0x7a,0x27,0x0, 0x65,0x9, 0x53,0x0, 0x25,0xa, 0x25,0x7a,0x27, +0x0, 0x5a,0x9, 0x53,0x0, 0x6, 0x7a,0x53,0x0, 0x5c,0x9, 0x53,0x0, 0x8, 0x7a,0x53, +0x0, 0x5e,0xbe,0x50,0xf, 0x40,0x6, 0x74,0xe, 0x19,0xb3,0x0, 0x8, 0x9, 0x53,0x0, +0x8, 0xa, 0x25,0x2e,0x24,0x2, 0xfe,0x12,0x1f,0x76,0x7a,0xb3,0x0, 0x5d,0x9, 0x53, +0x0, 0x9, 0x7a,0x53,0x0, 0x60,0x7a,0x53,0x0, 0x5f,0x9, 0x53,0x0, 0x7, 0x7a,0x53, +0x0, 0x61,0x9, 0x53,0x0, 0x24,0x7a,0x53,0x0, 0x62,0x9, 0x73,0x0, 0x2e,0x7a,0x73, +0x0, 0xb4,0x22,0x7e,0xb3,0x2, 0xab,0x44,0x80,0x7a,0xb3,0x2, 0xab,0x22,0x7e,0xb3, +0x2, 0x54,0x54,0xfb,0x7a,0xb3,0x2, 0x54,0x22,0x7e,0x24,0x0, 0x14,0xad,0x32,0x80, +0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78, +0xf0,0x22,0x12,0x2f,0x40,0x30,0xe, 0x36,0x7e,0xf, 0x0, 0xba,0x7e,0x1f,0x0, 0x56, +0x2f,0x10,0x7e,0x8, 0x0, 0x64,0x12,0x0, 0xe5,0xbe,0x18,0x5, 0xdc,0x8, 0x8, 0x12, +0x51,0x9a,0xbe,0xb0,0x2, 0x40,0x6, 0xbe,0x18,0x9, 0xc4,0x8, 0x11,0x7e,0x34,0x1, +0x2c,0x7a,0x37,0x1, 0xfe,0x7e,0x34,0x0, 0xa, 0x7a,0x35,0x31,0x80,0x1a,0x7e,0x35, +0x31,0x4d,0x33,0x68,0xb, 0x1b,0x34,0x7a,0x35,0x31,0x7e,0x34,0x1, 0x2c,0x80,0x4, +0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x1, 0xfe,0x12,0x29,0xd0,0x12,0x2b,0x38,0x2, 0x28, +0x11,0xca,0xd8,0xca,0x79,0x6c,0xff,0x7e,0x35,0x2c,0x9, 0x73,0x0, 0x1a,0x5e,0x70, +0xf, 0x7e,0x63,0x4, 0x8a,0xbe,0x60,0x1, 0x28,0x4d,0xbe,0x73,0x4, 0x8a,0x50,0x47, +0x30,0xe, 0x44,0x6c,0xee,0x80,0x35,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0x4, 0x91, +0x30,0xe1,0x27,0x30,0xe0,0x4, 0xb, 0xf0,0x80,0x20,0xbe,0xf0,0x0, 0x28,0x1b,0x9, +0xd3,0x4, 0x90,0x7c,0xbd,0x12,0x28,0x7c,0x60,0x10,0x7c,0xbd,0x7e,0x70,0x6, 0x12, +0x28,0xd8,0x12,0x2a,0xa9,0xac,0x5e,0x12,0x2d,0x88,0xb, 0xe0,0x7e,0x73,0x4, 0x8a, +0xbc,0x7e,0x38,0xc3,0x12,0x2b,0xa5,0xda,0x79,0xda,0xd8,0x22,0x12,0x2f,0xbf,0x12, +0x29,0x37,0x7e,0xb3,0x2, 0xc3,0x12,0x28,0xae,0xa, 0x3b,0x4d,0x33,0x78,0x1a,0x7e, +0xb3,0x2, 0xc4,0x12,0x28,0xae,0xa, 0x3b,0x4d,0x33,0x78,0xd, 0x7e,0xb3,0x2, 0xc5, +0x12,0x28,0xae,0xa, 0x3b,0x4d,0x33,0x68,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7c,0xab, +0x6c,0x77,0x80,0x11,0xa, 0x27,0x2e,0x25,0x2c,0x7e,0x29,0x60,0xbc,0x6a,0x78,0x3, +0x74,0x1, 0x22,0xb, 0x70,0x7e,0x25,0x2c,0x9, 0xb2,0x0, 0x1a,0x54,0xf, 0xa, 0x1b, +0xa, 0x27,0xbd,0x21,0x48,0xde,0xe4,0x22,0xca,0x79,0x7c,0xe7,0x7c,0xfb,0x7a,0xf3, +0x2, 0xae,0x7e,0x34,0x2, 0xae,0x12,0x29,0x37,0x7c,0xbf,0x12,0x17,0x70,0x7e,0xa3, +0x2, 0xae,0x74,0x4, 0xa4,0x2e,0x55,0x2a,0x49,0x15,0x0, 0x2, 0xb, 0x58,0x0, 0x7a, +0xf, 0x2, 0xb2,0xbf,0x1, 0x78,0x3, 0xe4,0x80,0x2a,0x12,0x2a,0xbb,0xa, 0x1e,0x6d, +0x0, 0x12,0x0, 0x78,0x7f,0x1, 0x7e,0x1f,0x2, 0xb2,0xbf,0x10,0x8, 0x15,0x7e,0x1f, +0x2, 0xb2,0xbe,0x18,0x7, 0xd0,0x8, 0xb, 0x7c,0xbf,0x12,0x28,0x7c,0x60,0x4, 0x74, +0x1, 0x80,0x1, 0xe4,0xda,0x79,0x22,0x7d,0x23,0x7e,0x29,0xa0,0xbe,0xa0,0x10,0x50, +0x3a,0xa, 0x3a,0x2e,0x34,0x0, 0x8, 0x7c,0xb7,0x19,0xb2,0x0, 0x1, 0xb4,0x10,0x6, +0xa, 0x3b,0xb, 0x34,0x80,0x5a,0xa, 0x3b,0xb4,0x17,0x9, 0x1b,0x34,0x12,0x29,0xba, +0x1b,0x34,0x80,0x51,0x1b,0x34,0x7c,0xb7,0x19,0xb2,0x0, 0x2, 0x9, 0xb2,0x0, 0x1, +0xa, 0x3b,0xb, 0x34,0x7c,0xb7,0x19,0xb2,0x0, 0x3, 0x22,0xa, 0x3a,0x9e,0x34,0x0, +0x8, 0x19,0x72,0x0, 0x1, 0xa5,0xbf,0x8, 0xd, 0xa, 0x17,0xb, 0x14,0x12,0x29,0xc5, +0xa, 0x16,0xb, 0x14,0x80,0xf, 0xa5,0xbf,0xf, 0x12,0xa, 0x17,0x1b,0x14,0x12,0x29, +0xc5,0xa, 0x16,0x1b,0x14,0x7c,0x63,0x19,0x62,0x0, 0x3, 0x22,0xa, 0x37,0x1b,0x34, +0x12,0x29,0xba,0xb, 0x34,0x19,0x72,0x0, 0x3, 0x22,0x19,0x72,0x0, 0x2, 0x9, 0x72, +0x0, 0x1, 0xa, 0x37,0x22,0x7c,0x63,0x19,0x62,0x0, 0x2, 0x9, 0x62,0x0, 0x1, 0x22, +0x12,0x29,0xe0,0x7a,0xb3,0x4, 0x8a,0xbe,0xb0,0x1, 0x28,0x3, 0x2, 0x29,0xea,0x22, +0x7e,0x35,0x2c,0x9, 0xb3,0x0, 0x1a,0x54,0xf, 0x22,0xca,0xd8,0xca,0x79,0xc2,0xf, +0x12,0x29,0xe0,0xbe,0xb0,0x1, 0x38,0x2, 0x41,0x98,0x7e,0xb3,0x4, 0xa7,0x70,0x2, +0x41,0x98,0x7e,0xf0,0x1, 0x41,0x8e,0xc2,0xf, 0x74,0x7, 0xac,0xbf,0x9, 0xe5,0x4, +0x90,0x9, 0xd5,0x4, 0x8f,0x49,0xd5,0x4, 0x8d,0x49,0xc5,0x4, 0x8b,0x7c,0xbe,0x7e, +0x70,0xe, 0x12,0x2a,0xc2,0x7f,0x71,0xbe,0xd0,0x19,0x40,0x2, 0xd2,0xf, 0xbe,0x68, +0x9, 0xc4,0x48,0x7, 0xbe,0xd0,0xa, 0x40,0x2, 0xd2,0xf, 0x7f,0x17,0x2e,0x18,0x5, +0xdc,0xbf,0x61,0x8, 0x7, 0xbe,0xd0,0x3, 0x40,0x2, 0xd2,0xf, 0x7e,0x8, 0x0, 0x4, +0x7e,0x1f,0x4, 0x8b,0x12,0x0, 0xe5,0x2e,0x18,0x5, 0xdc,0xbf,0x61,0x8, 0x13,0xbe, +0x68,0x1f,0x40,0x8, 0xd, 0x12,0x2a,0xa0,0x20,0xe1,0x7, 0xbe,0xd0,0x3, 0x40,0x2, +0xd2,0xf, 0xbe,0x68,0x4e,0x20,0x8, 0x8, 0x12,0x2a,0xa0,0x20,0xe1,0x2, 0xd2,0xf, +0xa2,0xf, 0xe4,0x33,0x12,0x2a,0xa9,0xac,0x5f,0x12,0x2d,0x88,0xb, 0xf0,0x12,0x29, +0xe0,0x12,0x2f,0xb0,0x58,0x2, 0x41,0x7, 0x12,0x2b,0xa5,0xda,0x79,0xda,0xd8,0x22, +0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x4, 0x91,0x22,0x7c,0x6b,0x5e,0x60,0x1, 0x7e,0x50, +0x7, 0x22,0xe5,0xa, 0xa, 0x1b,0x6d,0x0, 0x12,0x0, 0x78,0x7e,0x8, 0x0, 0xa, 0x2, +0x0, 0xe5,0xca,0x79,0x7c,0xa7,0x7c,0x9b,0x9f,0x0, 0xa, 0x39,0x12,0x2d,0x75,0x7c, +0x45,0xa, 0x39,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x7c,0x57,0xa5,0xbc,0x0, 0x8, 0x7e, +0xe0,0x2, 0x7e,0xf0,0x2, 0x80,0x16,0xa, 0x74,0xa5,0xbc,0x7, 0x6, 0x1b,0x75,0x7c, +0xef,0x80,0xa, 0x1b,0x74,0x7c,0xef,0xa, 0x34,0xb, 0x34,0x7c,0xf7,0x7e,0x70,0x8, +0xac,0x75,0x2c,0xe7,0x2c,0xf7,0x7e,0x90,0x4, 0xac,0x9f,0x2e,0x45,0x2a,0x12,0x2d, +0x80,0x7e,0x90,0x4, 0xac,0x9e,0x2e,0x45,0x2a,0x49,0xf4,0x0, 0x2, 0xb, 0x48,0xe0, +0xbf,0x71,0x8, 0x2, 0x80,0x2, 0x7f,0x17,0xbe,0x18,0x0, 0x0, 0x58,0x2, 0x7f,0x10, +0xa, 0x1a,0x12,0x2a,0xb6,0xda,0x79,0x22,0xca,0xd8,0xca,0x79,0x12,0x7, 0x79,0x68, +0x5f,0x7e,0xb3,0x4, 0xa7,0x60,0x59,0x6c,0xff,0x80,0x4a,0x7e,0x70,0x7, 0xac,0x7f, +0x9, 0xb3,0x4, 0x91,0x30,0xe0,0x3c,0x9, 0xe3,0x4, 0x90,0x9, 0xd3,0x4, 0x8f,0x49, +0xd3,0x4, 0x8d,0x49,0xc3,0x4, 0x8b,0x7c,0xbe,0x7e,0x70,0x10,0x12,0x2a,0xc2,0x7f, +0x51,0xbe,0xd0,0x8, 0x50,0x1d,0x7f,0x15,0x2e,0x18,0x3, 0x41,0xbf,0x61,0x58,0x13, +0xbe,0x68,0xb, 0xb8,0x58,0xd, 0x7e,0x70,0x7, 0xac,0x7f,0x12,0x2f,0xb7,0x54,0xfe, +0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0x4, 0x8a,0xbc,0x7f,0x38,0xae,0x12,0x2b,0xa5, +0xda,0x79,0xda,0xd8,0x22,0x6c,0x66,0x6c,0x77,0x7e,0x50,0x7, 0xac,0x57,0x9, 0xb2, +0x4, 0x91,0x30,0xe0,0x10,0x9, 0xa2,0x4, 0x90,0x7c,0x56,0xb, 0x60,0xa, 0x25,0x2e, +0x25,0x2c,0x7a,0x29,0xa0,0xb, 0x70,0xbe,0x70,0x4, 0x40,0xdd,0x5e,0x60,0xf, 0x7e, +0x25,0x2c,0x2e,0x24,0x0, 0x1a,0x7e,0x29,0x70,0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x29, +0x70,0x22,0xca,0x3b,0x7e,0xe3,0x0, 0x54,0x5e,0xe0,0xf, 0x74,0x5, 0xac,0xbf,0x7e, +0x68,0x7, 0x8, 0x7e,0x78,0x3, 0xe8,0x6c,0xff,0xa1,0x4d,0xa, 0x3f,0x9, 0xd3,0x0, +0x3a,0xa, 0x3d,0x12,0xb, 0xae,0x7c,0xc5,0xa, 0x3d,0x12,0x2d,0x75,0x7c,0xb5,0xf5, +0x8, 0x75,0x9, 0x0, 0x60,0x2, 0x81,0xae,0x12,0x2d,0x5f,0xbe,0xb4,0x1, 0xf4,0x28, +0x5, 0x75,0xa, 0x19,0x80,0x3, 0x75,0xa, 0x14,0x74,0x4, 0xac,0xbd,0x12,0x16,0x31, +0xbe,0x18,0x7, 0x8, 0x58,0xe, 0x49,0x35,0x0, 0xd2,0x49,0x25,0x0, 0xd0,0xbe,0x18, +0x3, 0xe8,0x48,0x4c,0x12,0x2d,0x68,0xbe,0x18,0x27,0x10,0x58,0x25,0x49,0x95,0x1, +0x62,0x49,0x85,0x1, 0x60,0xbe,0x48,0x7, 0xd0,0x58,0x17,0x12,0x1f,0xf1,0x49,0x35, +0x1, 0x86,0x49,0x25,0x1, 0x84,0x12,0x2a,0xb2,0xbf,0x14,0x8, 0x5, 0xbe,0xe0,0x1, +0x68,0x1e,0xbe,0xb4,0x1, 0x90,0x38,0x2, 0xa1,0x3d,0x12,0x2f,0xd1,0x49,0x25,0x1, +0x60,0xbe,0x18,0x3, 0x20,0x48,0x2, 0xa1,0x3d,0xbe,0xe0,0x1, 0x68,0x2, 0xa1,0x3d, +0x12,0x2d,0x56,0xbe,0xa4,0x0, 0x1e,0x40,0x2, 0xa1,0x3d,0xbe,0xb4,0x1, 0xa4,0x38, +0x8, 0xbe,0xb4,0x1, 0x7c,0x40,0x2, 0xa1,0x3d,0x75,0x9, 0x1, 0xa1,0x3d,0xe5,0x8, +0xb4,0x7, 0x2, 0x80,0x2, 0xa1,0x3d,0x12,0x2d,0x5f,0xbe,0xb4,0x1, 0xf4,0x28,0x5, +0x75,0xa, 0x19,0x80,0x3, 0x75,0xa, 0x14,0x74,0x4, 0xac,0xbd,0x12,0x16,0x31,0xbf, +0x16,0x58,0xc, 0x49,0x35,0x0, 0xca,0x49,0x25,0x0, 0xc8,0xbf,0x17,0x48,0x46,0x12, +0x2d,0x68,0xbe,0x18,0x27,0x10,0x58,0x25,0x49,0x95,0x1, 0x5a,0x49,0x85,0x1, 0x58, +0xbe,0x48,0x7, 0xd0,0x58,0x17,0x12,0x1f,0xf1,0x49,0x35,0x1, 0x76,0x49,0x25,0x1, +0x74,0x12,0x2a,0xb2,0xbf,0x14,0x8, 0x5, 0xbe,0xe0,0x1, 0x68,0x18,0xbe,0xb4,0x1, +0x90,0x28,0x2a,0x12,0x2f,0xc8,0x49,0x25,0x1, 0x58,0xbe,0x18,0x3, 0x20,0x58,0x1d, +0xbe,0xe0,0x1, 0x78,0x18,0x12,0x2d,0x56,0xbe,0xa4,0x1, 0xc2,0x28,0xf, 0xbe,0xb4, +0x1, 0xa4,0x38,0x6, 0xbe,0xb4,0x1, 0x7c,0x50,0x3, 0x75,0x9, 0x2, 0xe5,0x9, 0xbe, +0xb0,0x0, 0x28,0x7, 0x7c,0xbf,0x7c,0x7e,0x12,0x49,0xc2,0xb, 0xf0,0xbc,0xef,0x28, +0x2, 0x61,0xfb,0xda,0x3b,0x22,0x74,0x5, 0xac,0xbf,0x49,0xa5,0x0, 0x3e,0x22,0x74, +0x5, 0xac,0xbf,0x49,0xb5,0x0, 0x40,0x22,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x5e, +0x49,0x25,0x1, 0x5c,0x22,0x7e,0x24,0x0, 0x8, 0x2, 0x0, 0x46,0x2e,0x44,0x0, 0xcc, +0x49,0x34,0x0, 0x2, 0xb, 0x48,0x20,0x22,0x2e,0x24,0x4, 0x91,0x7e,0x29,0x70,0x5e, +0x70,0xfe,0x4c,0x76,0x7a,0x29,0x70,0x22,0xca,0xf8,0x7c,0xab,0x7d,0x42,0x7d,0x13, +0x6c,0x11,0x80,0x2b,0xa, 0x31,0x2d,0x34,0x7e,0x39,0x0, 0xa, 0x30,0x12,0x2d,0x75, +0x7c,0x5, 0x6c,0xff,0xa, 0x20,0xa, 0x3f,0x12,0x2f,0xda,0x18,0x9, 0x74,0x1, 0xa, +0x3f,0x2d,0x31,0x7a,0x39,0xb0,0xb, 0xf0,0xbe,0xf0,0x8, 0x78,0xe7,0xb, 0x10,0xbc, +0xa1,0x38,0xd1,0xda,0xf8,0x22,0xca,0x3b,0x7d,0x73,0x6c,0xdd,0x9f,0x11,0x7a,0x1f, +0x2, 0xdf,0x6c,0xcc,0x74,0x4, 0x30,0xf, 0xd, 0x12,0x2f,0x9f,0x49,0x34,0x0, 0xb2, +0x49,0x24,0x0, 0xb0,0x80,0xb, 0x12,0x2f,0x9f,0x49,0x34,0x0, 0x92,0x49,0x24,0x0, +0x90,0x59,0x35,0x2, 0xb1,0x59,0x25,0x2, 0xaf,0xb, 0xc0,0xbe,0xc0,0x8, 0x78,0xd4, +0x7e,0x34,0x2, 0xaf,0x7e,0x24,0x2, 0xcf,0x12,0x3f,0x1e,0x7a,0xb3,0x2, 0xae,0xbe, +0xb0,0x2, 0x28,0x6, 0x74,0x2, 0x7a,0xb3,0x2, 0xae,0x7e,0x63,0x2, 0xae,0x5e,0x60, +0x3, 0x3e,0x60,0x7d,0x27,0x2e,0x24,0x0, 0x5, 0x7e,0x29,0x70,0x5e,0x70,0xf9,0x4c, +0x76,0x7a,0x29,0x70,0x7e,0x34,0x2, 0xd7,0x7e,0x24,0x0, 0x8, 0xe4,0x12,0x2, 0xee, +0x7e,0x34,0x2, 0xd7,0x7e,0x24,0x2, 0xcf,0x7e,0xb3,0x2, 0xae,0x12,0x2d,0x98,0x7e, +0xb3,0x2, 0xae,0x70,0x6, 0x7e,0x18,0x0, 0x1, 0x80,0x11,0x7e,0xa3,0x2, 0xcf,0x74, +0x4, 0xa4,0x49,0x35,0x2, 0xb1,0x49,0x25,0x2, 0xaf,0x2f,0x11,0x7a,0x1f,0x2, 0xdf, +0x9f,0x11,0x7a,0x1f,0x2, 0xe3,0x6c,0xcc,0xa, 0x3c,0x9, 0xb3,0x2, 0xd7,0x70,0x1e, +0x74,0x4, 0xac,0xbc,0x49,0x15,0x2, 0xb1,0x49,0x5, 0x2, 0xaf,0xbe,0x8, 0x0, 0x64, +0x8, 0xc, 0x7e,0x1f,0x2, 0xe3,0x2f,0x10,0x7a,0x1f,0x2, 0xe3,0xb, 0xd0,0xb, 0xc0, +0xbe,0xc0,0x8, 0x78,0xd3,0xbe,0xd0,0x0, 0x28,0x18,0xa, 0x1d,0x6d,0x0, 0x7e,0x1f, +0x2, 0xe3,0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xe3,0xbe,0x18,0x0, 0x1, 0x58,0x3, 0x12, +0x2f,0xa7,0x7e,0x1f,0x2, 0xdf,0xbe,0x18,0x0, 0x1, 0x18,0x8, 0x7e,0x18,0x0, 0x1, +0x7a,0x1f,0x2, 0xdf,0x7e,0x1f,0x2, 0xe3,0xbe,0x18,0x0, 0x1, 0x18,0x3, 0x12,0x2f, +0xa7,0x7e,0x6f,0x2, 0xe3,0x7e,0x7f,0x2, 0xdf,0x7f,0x17,0x7f,0x6, 0x12,0x0, 0xe5, +0xbe,0x34,0x0, 0x64,0x28,0x4, 0x7e,0x34,0x0, 0x64,0xbe,0x68,0xfd,0xe8,0x48,0x8, +0x7e,0x8, 0xfd,0xe8,0x7a,0xf, 0x2, 0xe3,0xbe,0x78,0xfd,0xe8,0x48,0x8, 0x7e,0x8, +0xfd,0xe8,0x7a,0xf, 0x2, 0xdf,0x7e,0xf, 0x2, 0xe3,0x7d,0x21,0x59,0x27,0x0, 0x2, +0x7e,0xf, 0x2, 0xdf,0x7d,0x21,0x1b,0x78,0x20,0x19,0x77,0x0, 0x4, 0xda,0x3b,0x22, +0x12,0x4e,0xe2,0xc2,0xf, 0x7e,0x34,0x4, 0xa9,0x12,0x2d,0xd6,0xd2,0xf, 0x7e,0x34, +0x4, 0x84,0x12,0x2d,0xd6,0x7e,0x34,0x4, 0xa9,0x12,0x50,0x59,0x7e,0x34,0x4, 0x84, +0x12,0x50,0x59,0x7e,0xb3,0x4, 0x89,0x1e,0xb0,0x54,0x3, 0xa, 0x2b,0x7e,0xb3,0x4, +0xae,0x1e,0xb0,0x54,0x3, 0xa, 0x3b,0x2d,0x32,0x68,0x5, 0x12,0x29,0xe0,0x78,0x5, +0xc2,0xe, 0x12,0x4f,0xba,0x7e,0xb3,0x4, 0xae,0x20,0xe0,0x7, 0x7e,0xb3,0x4, 0x89, +0x30,0xe0,0x9, 0xd2,0xe, 0x74,0x78,0x7a,0xb3,0x4, 0xa7,0x22,0xc2,0xe, 0x22,0xac, +0xbc,0x7d,0x45,0x2e,0x45,0x2a,0x22,0x7e,0x18,0x0, 0x1, 0x7a,0x1f,0x2, 0xe3,0x22, +0xa, 0x2b,0xa, 0x3f,0xbd,0x32,0x22,0x2e,0x34,0x4, 0x91,0x7e,0x39,0xb0,0x22,0x7a, +0xb3,0x2, 0xc2,0x7e,0x34,0x2, 0xc2,0x22,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x5a, +0x22,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x62,0x22,0x9d,0x32,0x12,0x2, 0xde,0xbe, +0x34,0x0, 0x1, 0x22,0x6d,0x11,0x80,0x3e,0x6d,0x0, 0x80,0x2e,0x7d,0xf0,0x3e,0xf4, +0x3e,0xf4,0x7d,0xef,0x2d,0xe3,0x12,0x30,0x2b,0x49,0x5e,0x0, 0x2, 0xb, 0xe8,0x40, +0xbf,0x26,0x58,0x14,0x12,0x30,0x2b,0x59,0xde,0x0, 0x2, 0x1b,0xe8,0xc0,0x2d,0xf3, +0x59,0x5f,0x0, 0x6, 0x59,0x4f,0x0, 0x4, 0xb, 0x4, 0x7d,0xf2,0x1b,0xf4,0x9d,0xf1, +0xbd,0xf0,0x38,0xc8,0xb, 0x14,0xbd,0x21,0x38,0xbe,0x22,0x49,0xde,0x0, 0x6, 0x49, +0xce,0x0, 0x4, 0x22,0xbe,0xb0,0xa, 0x50,0x8, 0x7c,0x1b,0x2e,0x10,0x16,0xa5,0xe7, +0x22,0x2, 0x30,0x44,0xca,0x79,0xb4,0xa, 0x5, 0x7e,0xf0,0x20,0x21,0x76,0xb4,0xb, +0x5, 0x7e,0xf0,0x3, 0x21,0x76,0xb4,0xc, 0x6, 0x7e,0xf3,0x0, 0xb5,0x21,0x76,0xb4, +0xd, 0x1c,0x7e,0xb3,0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0xf3,0x0, 0xa8,0x21,0x76,0xb4, +0x2, 0x6, 0x7e,0xf3,0x0, 0xae,0x21,0x76,0x7e,0xf3,0x0, 0xa6,0x21,0x76,0xb4,0xe, +0x1c,0x7e,0xb3,0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0xf3,0x0, 0xa9,0x21,0x76,0xb4,0x2, +0x6, 0x7e,0xf3,0x0, 0xaf,0x21,0x76,0x7e,0xf3,0x0, 0xa7,0x21,0x76,0xb4,0xf, 0x6, +0x7e,0xf3,0x0, 0xb6,0x21,0x76,0xb4,0x10,0x6, 0x7e,0xf3,0x0, 0xb7,0x21,0x76,0xbe, +0xb0,0x11,0x40,0xd, 0xbe,0xb0,0x34,0x38,0x8, 0xa, 0x3b,0x9, 0xf3,0x0, 0x71,0x21, +0x76,0xbe,0xb0,0x35,0x40,0x2b,0xbe,0xb0,0x58,0x38,0x26,0xa, 0x7b,0x9e,0x74,0x0, +0x35,0xbe,0xf0,0x20,0x50,0xc, 0x7c,0xbf,0x7e,0x70,0x20,0x12,0x1f,0xf8,0xa, 0x3b, +0x80,0x2, 0xa, 0x3f,0x2e,0x34,0x2, 0x5e,0x12,0x1d,0x14,0x7c,0xfb,0xb, 0xf0,0x21, +0x76,0xb4,0x59,0x6, 0x7e,0xf3,0x0, 0xb8,0x80,0x7c,0xb4,0x5a,0x5, 0x7e,0xf0,0xf, +0x80,0x74,0xb4,0xac,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb0, +0x80,0x64,0x7e,0xf3,0x0, 0xaa,0x80,0x5e,0xb4,0xa0,0x4, 0x6c,0xff,0x80,0x57,0xb4, +0xa1,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb1,0x80,0x47,0x7e, +0xf3,0x0, 0xab,0x80,0x41,0xb4,0xa2,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e, +0xf3,0x0, 0xb2,0x80,0x31,0x7e,0xf3,0x0, 0xac,0x80,0x2b,0xb4,0xa3,0x13,0x7e,0xb3, +0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb3,0x80,0x1b,0x7e,0xf3,0x0, 0xad,0x80, +0x15,0xb4,0xad,0x6, 0x7e,0xf3,0x0, 0xb9,0x80,0xc, 0xb4,0xae,0x6, 0x7e,0xf3,0x0, +0xb4,0x80,0x3, 0x7e,0xf0,0xee,0x7c,0xbf,0xda,0x79,0x22,0x7c,0xab,0x24,0x0, 0x78, +0x5, 0x7e,0xb3,0x4, 0xd9,0x22,0xbe,0xa0,0xae,0x38,0xc, 0x7e,0xb3,0x3, 0xc4,0xb4, +0x3, 0x24,0x7c,0xba,0x2, 0x30,0x34,0xbe,0xa0,0xb0,0x40,0x1a,0xbe,0xa0,0xf7,0x38, +0x15,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0xe, 0xa, 0x3a,0x2e,0x34,0x4, 0x31,0x9e,0x34, +0x0, 0xb0,0x7e,0x39,0xb0,0x22,0x7c,0xba,0x22,0xca,0xf8,0x30,0x90,0x79,0xd2,0x7, +0x7e,0xb3,0x4, 0xd7,0x4, 0x7a,0xb3,0x4, 0xd7,0x7e,0x93,0x4, 0xd7,0xbe,0x90,0x1, +0x78,0x8, 0xe5,0x91,0x7a,0xb3,0x4, 0xda,0x80,0x36,0x7e,0xf3,0x4, 0xd9,0x7c,0xbf, +0xc4,0x7c,0xfb,0x7c,0x8f,0x5e,0x80,0x7, 0x78,0x8, 0x12,0x33,0x12,0x12,0x34,0xa, +0x80,0x1e,0xbe,0x80,0x4, 0x78,0x8, 0x12,0x33,0x12,0x12,0x34,0x9c,0x80,0x11,0x7c, +0xbf,0x54,0x7, 0xb4,0x1, 0xa, 0x7e,0xb3,0x4, 0xd7,0x12,0x33,0x14,0x12,0x3f,0xd6, +0x12,0x35,0x51,0x78,0xe, 0xe4,0x12,0x32,0x8f,0xb4,0x10,0x2, 0x80,0x14,0x12,0x35, +0xa6,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x35,0x9c,0x80,0x8, 0xbe,0xf0,0x1, +0x78,0x3, 0x12,0x35,0xb0,0xc2,0x90,0x30,0x91,0x52,0xc2,0x7, 0x7e,0xb3,0x4, 0xd5, +0x4, 0x12,0x35,0x4d,0x78,0x13,0xe4,0x12,0x32,0x8f,0xb4,0x10,0x6, 0x7e,0xb3,0x4, +0xd5,0x80,0x23,0x7e,0xb3,0x4, 0xd5,0x80,0x28,0xbe,0xf0,0x4, 0x78,0xf, 0x7e,0xb3, +0x4, 0xd5,0x2e,0xb3,0x4, 0xda,0x12,0x31,0x7b,0xf5,0x91,0x80,0x1d,0xbe,0xf0,0x1, +0x7e,0xb3,0x4, 0xd5,0x78,0xb, 0x2e,0xb3,0x4, 0xda,0x12,0x0, 0x9, 0xf5,0x91,0x80, +0x9, 0x2e,0xb3,0x4, 0xda,0x12,0x32,0x8f,0xf5,0x91,0xc2,0x91,0xda,0xf8,0x22,0x7c, +0x7b,0xbe,0x70,0x80,0x40,0xc, 0xbe,0x70,0xde,0x38,0x7, 0xa, 0x37,0x9, 0xb3,0x3, +0x8, 0x22,0xa5,0xbf,0x0, 0x5, 0x7e,0xb3,0x4, 0xd9,0x22,0x30,0x6, 0x6, 0x7e,0x24, +0x4, 0xb1,0x80,0x4, 0x7e,0x24,0x4, 0xc3,0x7a,0x25,0x24,0x7c,0xb7,0x14,0xbe,0xb0, +0xe, 0x50,0x4c,0x7e,0xa0,0x3, 0xa4,0x90,0x32,0xcb,0x73,0x2, 0x32,0xf5,0x2, 0x32, +0xfd,0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, 0x33,0x5, +0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, 0x33,0x5, 0x2, +0x33,0x5, 0x2, 0x33,0x5, 0x7e,0x35,0x24,0x9, 0xb3,0x0, 0x4, 0x22,0x7e,0x35,0x24, +0x9, 0xb3,0x0, 0x3, 0x22,0xa, 0x37,0x2e,0x35,0x24,0x9, 0xb3,0x0, 0x2, 0x22,0x74, +0xff,0x22,0x7c,0xb9,0x2e,0xb3,0x4, 0xda,0x24,0xfe,0x7e,0x71,0x91,0x22,0xbe,0xb0, +0xa, 0x50,0xa, 0x7c,0x1b,0x2e,0x10,0x16,0x7c,0xb7,0xa5,0xf7,0x22,0x2, 0x33,0x30, +0x7c,0xa7,0xb4,0xc, 0x6, 0x7e,0x34,0x0, 0xb5,0x61,0xfb,0xb4,0xd, 0x1c,0x7e,0xb3, +0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0xa8,0x61,0xfb,0xb4,0x2, 0x6, 0x7e,0x34, +0x0, 0xae,0x61,0xfb,0x7e,0x34,0x0, 0xa6,0x61,0xfb,0xb4,0xe, 0x1c,0x7e,0xb3,0x0, +0xb4,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0xa9,0x61,0xfb,0xb4,0x2, 0x6, 0x7e,0x34,0x0, +0xaf,0x61,0xfb,0x7e,0x34,0x0, 0xa7,0x61,0xfb,0xb4,0xf, 0x6, 0x7e,0x34,0x0, 0xb6, +0x80,0x79,0xb4,0x10,0x6, 0x7e,0x34,0x0, 0xb7,0x80,0x70,0xb4,0x59,0x9, 0x7e,0x34, +0x0, 0xb8,0x43,0x26,0x4, 0x80,0x6f,0xb4,0xac,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, +0x6, 0x7e,0x34,0x0, 0xb0,0x80,0x54,0x7e,0x34,0x0, 0xaa,0x80,0x4e,0xb4,0xa1,0x13, +0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb1,0x80,0x3e,0x7e,0x34,0x0, +0xab,0x80,0x38,0xb4,0xa2,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0x34,0x0, +0xb2,0x80,0x28,0x7e,0x34,0x0, 0xac,0x80,0x22,0xb4,0xa3,0x13,0x7e,0xb3,0x0, 0xb4, +0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb3,0x80,0x12,0x7e,0x34,0x0, 0xad,0x80,0xc, 0xb4, +0xae,0xe, 0x7e,0x34,0x0, 0xb4,0xe4,0x7a,0xb3,0x0, 0xb9,0x43,0x26,0x1, 0x80,0x6, +0xb4,0xaf,0x6, 0x2, 0x35,0xc5,0x7a,0x39,0xa0,0x22,0x7c,0x7, 0xbe,0xb0,0x80,0x40, +0xb, 0xbe,0xb0,0xde,0x38,0x6, 0x24,0x80,0x7c,0x70,0x80,0x7c,0x24,0x0, 0x78,0x7b, +0x7e,0x14,0x4, 0xd9,0x7a,0x19,0x0, 0x5e,0x0, 0x70,0x7c,0xb0,0xc4,0x54,0xf, 0x7c, +0xb, 0xa5,0xb8,0x4, 0x15,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x7, 0x74,0x2, 0x7e,0x70, +0x3, 0x80,0x34,0x74,0x3c,0x7e,0x70,0x3, 0x80,0x4e,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, +0x29,0x74,0x2, 0x7e,0x70,0x1, 0x12,0x33,0x1e,0xa5,0xb8,0x1, 0x6, 0x74,0x2, 0x6c, +0x77,0x80,0x14,0xa5,0xb8,0x0, 0x7, 0x74,0x2, 0x7e,0x70,0x1, 0x80,0x9, 0xa5,0xb8, +0x3, 0x29,0x74,0x2, 0x7e,0x70,0x4, 0x2, 0x33,0x1e,0xa5,0xb8,0x1, 0x6, 0x74,0x3c, +0x6c,0x77,0x80,0x14,0xa5,0xb8,0x4, 0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80,0x9, 0xa5, +0xb8,0x3, 0x8, 0x74,0x3c,0x7e,0x70,0x4, 0x2, 0x37,0x57,0x22,0x7c,0x6b,0x14,0x68, +0x78,0x4, 0x68,0x2, 0xa1,0x25,0x7e,0x44,0x4, 0xd9,0x7a,0x49,0x70,0x5e,0x70,0x70, +0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0x7b,0xbe,0x70,0x4, 0x68,0x47,0x7e,0xb3,0x3, 0xc4, +0xb4,0x3, 0x20,0xa5,0xbf,0x1, 0x6, 0x74,0x2, 0x6c,0x77,0x80,0x66,0xa5,0xbf,0x0, +0x7, 0x74,0x2, 0x7e,0x70,0x1, 0x80,0x5b,0xa5,0xbf,0x3, 0x70,0x74,0x2, 0x7e,0x70, +0x4, 0x80,0x50,0xa5,0xbf,0x1, 0x6, 0x74,0x3c,0x6c,0x77,0x80,0x29,0xa5,0xbf,0x4, +0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80,0x1e,0xa5,0xbf,0x3, 0x50,0x74,0x3c,0x7e,0x70, +0x4, 0x80,0x13,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x7, 0x74,0x2, 0x7e,0x70,0x3, 0x80, +0x22,0x74,0x3c,0x7e,0x70,0x3, 0x2, 0x37,0x57,0x7a,0x73,0x4, 0xd8,0x7e,0x54,0x4, +0x31,0x7a,0x55,0x22,0x22,0xbe,0x60,0xa, 0x50,0xc, 0x7e,0xb3,0x3, 0xc4,0xb4,0x3, +0x1b,0x7c,0xb6,0x2, 0x33,0x1e,0xbe,0x60,0xa, 0x40,0x11,0xbe,0x60,0xaf,0x38,0xc, +0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x5, 0x7c,0xb6,0x2, 0x33,0x30,0x22,0x7a,0xb3,0x4, +0xd5,0x7e,0xb3,0x4, 0xd9,0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x22,0xca,0xf8,0xe4,0x12, +0x35,0x4d,0x78,0x5, 0x12,0x35,0xa6,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x35, +0x9c,0x80,0x8, 0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x35,0xb0,0x75,0x91,0x0, 0xe4,0x7a, +0xb3,0x4, 0xd7,0x7a,0xb3,0x4, 0xd6,0x74,0xaa,0x7a,0xb3,0x4, 0xb1,0x7a,0xb3,0x4, +0xb2,0x7a,0xb3,0x4, 0xc3,0x7a,0xb3,0x4, 0xc4,0xda,0xf8,0x22,0x7e,0xb3,0x4, 0xda, +0x12,0x31,0x7b,0xf5,0x91,0x22,0x7e,0xb3,0x4, 0xda,0x12,0x32,0x8f,0xf5,0x91,0x22, +0x7e,0xb3,0x4, 0xda,0x12,0x0, 0x9, 0xf5,0x91,0x22,0xe4,0x7a,0xb3,0x4, 0xd9,0x12, +0x37,0x8b,0x2, 0x35,0x5c,0x30,0x8, 0x8, 0x74,0x1, 0x12,0x35,0xd7,0xc2,0x8, 0x22, +0xe4,0x12,0x35,0xd7,0xd2,0x8, 0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xca, +0x3b,0x7c,0xeb,0x6c,0xaa,0x20,0x0, 0x8, 0x20,0x5, 0x5, 0x20,0x2, 0x2, 0xe1,0x1f, +0x20,0x6, 0x6, 0x7e,0x4, 0x4, 0xb1,0x80,0x4, 0x7e,0x4, 0x4, 0xc3,0x7d,0x30,0x12, +0x51,0x76,0x74,0xaa,0x7a,0x9, 0xb0,0x19,0xb0,0x0, 0x1, 0x74,0x12,0x19,0xb0,0x0, +0x2, 0x7e,0xb3,0x0, 0x7c,0x19,0xb0,0x0, 0x4, 0x6c,0x77,0x6c,0xff,0x7e,0x50,0x5, +0xac,0x5f,0x9, 0x62,0x0, 0x6c,0xbe,0x60,0xff,0x78,0x2, 0xc1,0xc7,0xa, 0x46,0x9, +0xb4,0x0, 0xc0,0xbe,0xb0,0x3, 0x78,0x2, 0xc1,0xc7,0x49,0x12,0x0, 0x68,0x7d,0x61, +0xa, 0x6c,0x7d,0xf6,0x5e,0xf4,0x0, 0xf, 0x7d,0x6f,0x7c,0x6d,0xa, 0xf7,0x2d,0xf0, +0x19,0x6f,0x0, 0x5, 0x7c,0x63,0xa, 0x17,0x2d,0x10,0x19,0x61,0x0, 0x6, 0x49,0x12, +0x0, 0x6a,0xa, 0x22,0x5e,0x24,0x0, 0xf, 0x7c,0x65,0xa, 0x27,0x2d,0x20,0x19,0x62, +0x0, 0x7, 0x7c,0x63,0xa, 0x27,0x2d,0x20,0x19,0x62,0x0, 0x8, 0xe4,0xa, 0x27,0x2d, +0x20,0x19,0xb2,0x0, 0x9, 0xa, 0x27,0x2d,0x20,0x19,0xb2,0x0, 0xa, 0x12,0x37,0x2f, +0xc4,0x54,0xf0,0xa, 0x27,0x2d,0x20,0x2e,0x24,0x0, 0x7, 0x12,0x37,0x26,0x12,0x37, +0x2f,0xbe,0xb0,0xff,0x68,0x1e,0x9, 0xb4,0x0, 0xc0,0xbe,0xb0,0x1, 0x68,0x2, 0xb, +0xa0,0x9, 0xb4,0x0, 0xc0,0x3, 0x3, 0x54,0xc0,0xa, 0x27,0x2d,0x20,0x2e,0x24,0x0, +0x5, 0x12,0x37,0x26,0x2e,0x70,0x6, 0xb, 0xf0,0xbe,0xf0,0x2, 0x68,0x2, 0xc1,0x1d, +0x19,0xa0,0x0, 0x3, 0xe4,0x19,0xb0,0x0, 0x11,0x6c,0xff,0xa, 0x1f,0x2d,0x10,0x7e, +0x19,0x60,0x7d,0x10,0x2e,0x14,0x0, 0x11,0x7e,0x19,0x70,0x6c,0x76,0x7a,0x19,0x70, +0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xe4,0x30,0x6, 0x4, 0xc2,0x6, 0x80,0x2, 0xd2,0x6, +0x30,0x5, 0x3, 0x12,0x37,0x39,0xc2,0x0, 0xc2,0x5, 0xc2,0x2, 0x74,0x1, 0x12,0x35, +0xd7,0x7e,0x34,0x0, 0x3, 0x12,0x27,0x99,0xbe,0xe0,0x1, 0x78,0x6, 0x80,0x0, 0xe4, +0x12,0x35,0xd7,0xda,0x3b,0x22,0x7e,0x29,0x60,0x2c,0x6b,0x7a,0x29,0x60,0x22,0x7e, +0x50,0x5, 0xac,0x5f,0x9, 0xb2,0x0, 0x6c,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x4a,0x19, +0xb4,0x0, 0xc2,0x19,0xb4,0x0, 0xc0,0x12,0x37,0xf0,0xac,0x7a,0x12,0x49,0xb9,0xb, +0xa0,0xbe,0xa0,0x2, 0x40,0xe5,0x22,0xbe,0xb0,0x5e,0x38,0x2e,0xbe,0xb0,0x26,0x68, +0x29,0xbe,0xb0,0x2f,0x68,0x24,0xbe,0xb0,0x23,0x68,0x1f,0xbe,0xb0,0x28,0x68,0x1a, +0xbe,0xb0,0x21,0x68,0x15,0xbe,0xb0,0x22,0x68,0x10,0xa, 0x2b,0x19,0x72,0x3, 0x88, +0x7e,0xb3,0x3, 0xe7,0x44,0x1, 0x7a,0xb3,0x3, 0xe7,0x22,0x7e,0x50,0x70,0x7e,0x34, +0x78,0x0, 0x12,0x37,0xc0,0x7c,0x4b,0x7e,0x34,0x78,0x1, 0x12,0x37,0xc0,0xbe,0x40, +0xff,0x68,0x7, 0x6c,0xb4,0xb4,0xff,0x2, 0x7c,0x54,0xd2,0xce,0x7a,0x51,0x92,0xd2, +0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xd5,0xb7,0xd2,0xbd,0x22, +0x12,0x37,0xf8,0x75,0xf5,0x1, 0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0x2, 0x37, +0xd1,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xd2,0xaf,0x22,0x7e,0x34,0x0, 0x20,0x12, +0x37,0xf8,0x75,0xf5,0x3, 0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0x2, 0x37,0xd1, +0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0x22,0xc2,0xaf,0xd2,0xc9,0xa, 0x56,0xf5,0xf1, +0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x22,0x70,0x18,0x7e,0x1f,0x1, +0x50,0x7e,0xf, 0x1, 0x4c,0x2f,0x1, 0x7e,0x1f,0x1, 0x54,0x2f,0x10,0xbe,0x18,0x6, +0x40,0x58,0x2, 0xc2,0xd, 0x22,0x7e,0x37,0x0, 0x5a,0x4d,0x33,0x78,0x30,0x12,0x7, +0x79,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x27,0x0, 0x21,0x0, 0x7e,0xb3,0x0, 0x5c,0x20, +0xe0,0x2, 0x21,0x0, 0x7e,0x53,0x0, 0x61,0xbe,0x51,0x27,0x28,0x2, 0x21,0x0, 0x75, +0x27,0x0, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x0, 0x5a,0x74,0x1, 0x80,0x73,0xbe,0x34, +0x0, 0x1, 0x78,0x19,0x12,0x7, 0x79,0x78,0x2, 0x21,0x0, 0x6d,0x22,0x7a,0x27,0x0, +0x5a,0xe4,0x7a,0xb3,0x3, 0xad,0x75,0x28,0x22,0xd2,0x1, 0x21,0x0, 0xbe,0x34,0x0, +0x3, 0x78,0x7d,0xa9,0xd6,0xeb,0xa9,0xc6,0xac,0xa9,0xc6,0xec,0xc2,0x96,0xc2,0x95, +0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x80,0x4, 0xe4,0x12,0x17,0x56,0x12,0x13,0xb9, +0x50,0xf7,0x20,0x93,0xfd,0xa9,0xc0,0xca,0x75,0xe7,0x0, 0x53,0xe1,0xf7,0x74,0x2, +0x12,0x17,0x56,0x12,0xf, 0x69,0x7a,0x37,0x0, 0x38,0x12,0x0, 0x27,0xc2,0xa8,0xc2, +0x95,0xa9,0xd0,0xca,0x12,0x39,0x19,0x12,0x22,0x75,0x6d,0x33,0x7a,0x37,0x0, 0x5a, +0xe4,0x7a,0xb3,0x3, 0xad,0x80,0x29,0xe4,0x12,0x17,0x56,0x20,0x93,0x22,0x7e,0x37, +0x0, 0x5a,0x4d,0x33,0x78,0xe, 0xe5,0xcc,0x54,0x7, 0xbe,0xb0,0x2, 0x68,0x11,0x75, +0xcc,0x2, 0x80,0xc, 0xe5,0xcc,0x54,0x7, 0xbe,0xb0,0x7, 0x68,0x3, 0x75,0xcc,0x7, +0x30,0x1, 0xd4,0x75,0x28,0x0, 0xc2,0x1, 0x20,0x93,0x3, 0x75,0xcc,0x50,0x22,0xe5, +0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xeb,0x3, 0xa9,0xd6,0xac,0xa9, +0xd6,0xec,0xd2,0x86,0x22,0xe4,0x12,0x39,0x68,0x12,0x39,0x19,0x12,0x39,0x5c,0x74, +0x1, 0x2, 0x39,0x34,0x70,0x3, 0xc2,0xaf,0x22,0xd2,0xaf,0x22,0x12,0x39,0x25,0x2, +0x0, 0x3f,0xc2,0x8e,0xe5,0x89,0x54,0xf, 0x44,0x20,0xf5,0x89,0x75,0x8d,0x1, 0x75, +0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0xa9,0xc3,0xb7,0xd2,0xbb,0x22,0xa9,0xd1,0x99,0x75, +0x9a,0xfe,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xd2,0xcf,0xbe,0xb0,0x7, 0x38,0x4, 0x7c, +0xab,0x80,0x2, 0x6c,0xaa,0x4e,0xa0,0x50,0x7a,0xa1,0xcc,0x0, 0x0, 0x0, 0x0, 0xa9, +0xd0,0xca,0xa9,0xc5,0xca,0x53,0xca,0xe1,0x43,0xca,0x14,0x75,0xcb,0x2, 0xc2,0xcc, +0xd2,0xcb,0xc2,0xca,0xc2,0xc9,0xc2,0xc8,0x0, 0x0, 0x0, 0x0, 0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x39,0xf, 0x7e,0xb3,0x4, 0xd9,0x54,0xfd,0x7a,0xb3,0x4, 0xd9,0xd0,0x82, +0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b, +0xda,0x7b,0x32,0x12,0xf, 0x69,0x7a,0x37,0x0, 0x38,0x12,0x39,0x3c,0x12,0x35,0xba, +0x12,0x3a,0x53,0x12,0x3a,0xc6,0x7e,0xb3,0x3, 0xc4,0x24,0xfd,0x68,0x11,0x24,0xae, +0x68,0x35,0x24,0xab,0x68,0xe, 0x24,0xa9,0x78,0xec,0x12,0xe, 0x3b,0x80,0xe7,0x12, +0x24,0x61,0x80,0xe2,0x6d,0x33,0x7a,0x37,0x0, 0x7f,0x7e,0x24,0x1, 0xf4,0x7a,0x27, +0x0, 0x38,0x7e,0xb3,0x0, 0x81,0xbe,0xb0,0xaa,0x68,0xcb,0x7a,0x37,0x0, 0x63,0x74, +0xaa,0x7a,0xb3,0x0, 0x81,0x80,0xbf,0x6d,0x33,0x7a,0x37,0x0, 0x7f,0x7e,0x34,0x1, +0xf4,0x7a,0x37,0x0, 0x38,0x7e,0xb3,0x0, 0x81,0xb4,0xaa,0xaa,0x74,0x55,0x7a,0xb3, +0x0, 0x81,0x7e,0x74,0x3, 0xe8,0x7d,0x37,0x1b,0x74,0x4d,0x33,0x78,0xf8,0x75,0xe9, +0xff,0x80,0x93,0xe4,0x7a,0xb3,0x0, 0xb4,0x74,0x1, 0x7a,0xb3,0x0, 0xb9,0x74,0x1b, +0x7a,0xb3,0x0, 0xa6,0x74,0x1d,0x7a,0xb3,0x0, 0xa7,0x74,0x24,0x7a,0xb3,0x0, 0xa8, +0x74,0x26,0x7a,0xb3,0x0, 0xa9,0x74,0x28,0x7a,0xb3,0x0, 0xaa,0x7a,0xb3,0x0, 0xae, +0x74,0x30,0x7a,0xb3,0x0, 0xaf,0x74,0x29,0x7a,0xb3,0x0, 0xb0,0x12,0x3a,0xa8,0x74, +0xa, 0x7a,0xb3,0x0, 0xb8,0x74,0xf, 0x7a,0xb3,0x0, 0xb6,0x74,0x19,0x7a,0xb3,0x0, +0xb7,0x74,0x3, 0x7a,0xb3,0x0, 0xb5,0x22,0x12,0x37,0xdb,0xb4,0x48,0x3, 0xd2,0xc, +0x22,0xb4,0xff,0x11,0x7e,0x34,0x0, 0x20,0x74,0x48,0x12,0x3a,0xcd,0x12,0x37,0xdb, +0xb4,0x48,0x2, 0xd2,0xc, 0x22,0x74,0x1, 0x7a,0xb3,0x3, 0xc4,0x22,0x7c,0xab,0x7d, +0x43,0x5e,0x80,0x7f,0xc2,0xaf,0xd2,0xc9,0xa, 0x38,0x7c,0xb7,0xf5,0xf1,0x7c,0xb9, +0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x1, 0x75,0xf5,0xa, 0x75,0xfb,0xa5,0x75,0xfb, +0xf, 0x75,0xfb,0x6a,0x7a,0xa1,0xf6,0x75,0xf6,0xff,0xa9,0x36,0xf5,0xfc,0x43,0xfa, +0x80,0x75,0xfb,0x0, 0xc2,0xc9,0xd2,0xaf,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x7e,0x35,0x33, +0xb, 0x34,0x7a,0x35,0x33,0xbe,0x34,0x3, 0xe8,0x40,0xe, 0x6d,0x33,0x7a,0x35,0x33, +0xe5,0x27,0xbe,0xb0,0x64,0x50,0x2, 0x5, 0x27,0x7e,0x37,0x0, 0x7f,0xb, 0x34,0x7a, +0x37,0x0, 0x7f,0x7e,0x37,0x0, 0x38,0xbe,0x37,0x0, 0x7f,0x28,0x3, 0x12,0x0, 0x27, +0x7e,0xb3,0x3, 0xc4,0xb4,0xaa,0x15,0x7e,0x37,0x0, 0x63,0x7d,0x23,0xb, 0x24,0x7a, +0x27,0x0, 0x63,0xbe,0x34,0x1, 0x2c,0x28,0x3, 0x12,0x3a,0xc6,0xe5,0x29,0xbe,0xb1, +0x28,0x28,0x4, 0x5, 0x28,0x80,0x2, 0xd2,0x1, 0x7e,0xb3,0x4, 0xd6,0x60,0xf, 0xbe, +0xb0,0x28,0x50,0x7, 0x4, 0x7a,0xb3,0x4, 0xd6,0x80,0x3, 0x12,0x35,0x5c,0xd0,0x82, +0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b, +0xda,0x7b,0x32,0x7e,0x50,0xd8,0x74,0x27,0x7a,0xb3,0x3, 0x88,0x74,0xa0,0x7a,0xb3, +0x3, 0x8d,0x74,0x1, 0x7a,0xb3,0x3, 0x8e,0x74,0x1e,0x7a,0xb3,0x3, 0x8f,0x74,0x8, +0x7a,0xb3,0x3, 0x90,0x74,0x14,0x7a,0xb3,0x3, 0x91,0x74,0x6, 0x7a,0xb3,0x3, 0xab, +0x74,0x1, 0x7a,0xb3,0x3, 0xac,0xe4,0x7a,0xb3,0x3, 0xad,0x74,0x3, 0x7a,0xb3,0x3, +0xae,0x12,0x3a,0xc6,0x7e,0x34,0x78,0x4, 0x12,0x37,0xc0,0x7c,0x4b,0x7e,0x34,0x78, +0x5, 0x12,0x37,0xc0,0xbe,0x40,0xff,0x68,0x7, 0x6c,0xb4,0xb4,0xff,0x2, 0x7c,0x54, +0x7a,0x53,0x3, 0xb0,0x74,0x3c,0x7a,0xb3,0x3, 0xb1,0x74,0x1, 0x7a,0xb3,0x3, 0xb7, +0xe4,0x7a,0xb3,0x3, 0xb6,0x7a,0xb3,0x3, 0xb8,0x7e,0x34,0x9, 0xc4,0x7a,0x37,0x0, +0xbe,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x0, 0x65,0x74,0xa0,0x7a,0xb3,0x0, 0x67,0x6d, +0x33,0x7a,0x37,0x0, 0x5a,0x74,0x1, 0x7a,0xb3,0x0, 0x5c,0x74,0xc, 0x7a,0xb3,0x0, +0x5d,0x74,0x8, 0x7a,0xb3,0x0, 0x5e,0x74,0x14,0x7a,0xb3,0x0, 0x5f,0x7a,0xb3,0x0, +0x60,0x74,0x1e,0x7a,0xb3,0x0, 0x61,0x74,0x1, 0x7a,0xb3,0x0, 0x62,0x22,0x75,0x28, +0x0, 0xc2,0x1, 0x7e,0xb3,0x3, 0xad,0x70,0x7, 0x7e,0xb3,0x0, 0x5d,0xf5,0x29,0x22, +0x7e,0xb3,0x0, 0x5f,0xf5,0x29,0x22,0x12,0xf, 0x74,0x74,0xf, 0x7a,0xb3,0x2, 0x36, +0x74,0x5, 0x7a,0xb3,0x2, 0x38,0x7a,0xb3,0x2, 0x37,0x74,0xf, 0x7a,0xb3,0x2, 0x39, +0x7e,0x34,0x0, 0x32,0x7a,0x37,0x1, 0xf0,0x7e,0xb3,0x2, 0x54,0x44,0x1, 0x7a,0xb3, +0x2, 0x54,0x74,0x2, 0x7a,0xb3,0x2, 0xc, 0x7e,0xb3,0x2, 0x54,0x30,0xe0,0x10,0x74, +0x2, 0x7a,0xb3,0x2, 0xd, 0x74,0x8, 0x7a,0xb3,0x2, 0xe, 0x74,0x2, 0x80,0xa, 0x74, +0x1, 0x7a,0xb3,0x2, 0xd, 0x7a,0xb3,0x2, 0xe, 0x7a,0xb3,0x2, 0xf, 0x74,0x14,0x7a, +0xb3,0x2, 0x53,0x7e,0x34,0x2a,0xf8,0x7a,0x37,0x1, 0xf4,0x7e,0xb3,0x2, 0x54,0x54, +0xfd,0x7a,0xb3,0x2, 0x54,0x7e,0x34,0xfc,0x18,0x7a,0x37,0x1, 0xf2,0x12,0x27,0x8e, +0x7e,0x34,0x0, 0x32,0x7a,0x37,0x1, 0xf6,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x1, 0xf8, +0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x1, 0xfa,0x7e,0xb3,0x2, 0x54,0x44,0x8, 0x7a,0xb3, +0x2, 0x54,0x7e,0x34,0x2, 0xa2,0x7a,0x37,0x2, 0x45,0x7e,0x34,0x2, 0xb2,0x7a,0x37, +0x2, 0x47,0x7e,0x34,0x2, 0x82,0x7a,0x37,0x2, 0x49,0x7e,0x34,0x2, 0x92,0x7a,0x37, +0x2, 0x4b,0x7e,0xb3,0x2, 0x54,0x54,0xef,0x7a,0xb3,0x2, 0x54,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0x1, 0xfc,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x1, 0xfe,0x7e,0x34,0x0, 0x64, +0x7a,0x37,0x2, 0x0, 0x7e,0x34,0x2, 0xbc,0x7a,0x37,0x2, 0x2, 0x7e,0x34,0x0, 0x78, +0x7a,0x37,0x2, 0x3a,0x12,0x3d,0xab,0x7e,0x34,0x0, 0x8, 0x7a,0x37,0x2, 0x6, 0x7e, +0x34,0x0, 0x7, 0x7a,0x37,0x2, 0x4, 0x7e,0x34,0x4b,0x7, 0x7a,0x37,0x2, 0x8, 0x7e, +0x34,0x8, 0x0, 0x7a,0x37,0x2, 0xa, 0xe4,0x7a,0xb3,0x2, 0x3c,0x7e,0x34,0x0, 0x3a, +0x7e,0x24,0x0, 0xcc,0x2, 0x3d,0x97,0x7a,0x35,0x2c,0x7a,0x25,0x2a,0xe4,0x7a,0xb3, +0x4, 0xa8,0x7a,0xb3,0x4, 0x79,0x7a,0xb3,0x4, 0xa7,0x22,0x7e,0xb3,0x2, 0x54,0x54, +0xdf,0x7a,0xb3,0x2, 0x54,0x22,0x7e,0x34,0x0, 0x3a,0x7e,0x24,0x0, 0x1c,0xe4,0x12, +0x2, 0xee,0x7e,0x34,0x0, 0x68,0x7e,0x24,0x0, 0x17,0x12,0x2, 0xee,0x6d,0x11,0x12, +0x3e,0x18,0x2e,0x34,0x0, 0x3e,0x12,0x3e,0x1f,0x12,0x3e,0x18,0x2e,0x34,0x0, 0x68, +0x12,0x3e,0x1f,0x12,0x3e,0x18,0x2e,0x34,0x0, 0x72,0x12,0x3e,0x1f,0xb, 0x14,0xbe, +0x14,0x0, 0x2, 0x40,0xda,0x75,0x28,0x0, 0x75,0x29,0x0, 0xc2,0x1, 0x75,0x27,0x0, +0x6d,0x33,0x7a,0x37,0x0, 0x7f,0x7e,0x24,0x7, 0xd0,0x7a,0x27,0x0, 0x38,0x7a,0x37, +0x0, 0x63,0xe4,0x7a,0xb3,0x0, 0x81,0x22,0x7e,0x34,0x0, 0x5, 0xad,0x31,0x22,0x7e, +0x24,0x7f,0xff,0x1b,0x38,0x20,0x59,0x23,0x0, 0x2, 0x74,0xff,0x19,0xb3,0x0, 0x4, +0x22,0x7c,0x3b,0x4d,0x33,0x78,0x2, 0xe1,0x15,0x4d,0x22,0x78,0x2, 0xe1,0x15,0xe4, +0x7a,0xb3,0x2, 0x3c,0x6c,0xaa,0x80,0x74,0x12,0x3f,0x16,0x49,0xf4,0x0, 0x2, 0xb, +0x48,0xe0,0xbe,0x7c,0xf8,0x30,0x58,0x5, 0xbe,0xa0,0x20,0x40,0x15,0xbe,0x7c,0xf2, +0x54,0x58,0x50,0xbe,0xa0,0x20,0x40,0x4b,0x7e,0x7f,0x1, 0xa4,0xbe,0x78,0xb, 0xb8, +0x58,0x41,0xa, 0xa, 0x9, 0xb0,0x4, 0xd, 0xbe,0xb0,0xfa,0x50,0xa, 0x7d,0xf0,0x2e, +0xf4,0x4, 0xd, 0x4, 0x7a,0xf9,0xb0,0x9, 0x20,0x4, 0xd, 0xbe,0x20,0xf, 0x28,0x2a, +0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0xd0,0x6d,0xcc,0x49,0xf4,0x0, 0x2, +0xb, 0x48,0xe0,0x2f,0x76,0xbe,0x78,0x32,0xc8,0x58,0xf, 0x74,0x1, 0x7a,0xb3,0x2, +0x3c,0x80,0x7, 0xe4,0xa, 0x4a,0x19,0xb4,0x4, 0xd, 0xb, 0xa0,0xbc,0x3a,0x38,0x88, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x4, 0xac,0x5a,0x2d,0x23,0x49,0x12,0x0, 0x2, 0xb, +0x28,0x0, 0xbe,0xc, 0xfd,0x6c,0x58,0x2c,0x7e,0xb3,0x2, 0x3c,0x70,0x26,0xa, 0x2a, +0x9, 0xb2,0x3, 0xe9,0xbe,0xb0,0xfa,0x50,0xa, 0x7d,0x42,0x2e,0x44,0x3, 0xe9,0x4, +0x7a,0x49,0xb0,0x9, 0xb2,0x3, 0xe9,0xbe,0xb0,0x14,0x28,0xf, 0x74,0x2, 0x7a,0xb3, +0x2, 0x3c,0x80,0x7, 0xe4,0xa, 0x2a,0x19,0xb2,0x3, 0xe9,0xb, 0xa0,0x7e,0xb3,0x2, +0x56,0xbc,0xba,0x38,0xaf,0x22,0x7e,0x90,0x4, 0xac,0x9a,0x2d,0x43,0x22,0xca,0xf8, +0x6c,0xff,0x6c,0xaa,0x4c,0xaa,0x78,0x4, 0x9f,0x44,0x80,0xc, 0x12,0x3f,0x93,0x1b, +0x16,0x49,0x91,0x0, 0x2, 0xb, 0x18,0x80,0xbe,0xa0,0x7, 0x78,0x4, 0x9f,0x55,0x80, +0xb, 0x12,0x3f,0x93,0x49,0xb1,0x0, 0x6, 0x49,0xa1,0x0, 0x4, 0x12,0x3f,0x16,0x49, +0x14,0x0, 0x2, 0xb, 0x48,0x0, 0xbf,0x4, 0x48,0x2a,0xbf,0x5, 0x48,0x26,0x49,0x14, +0x0, 0x2, 0xb, 0x48,0x0, 0xbe,0x8, 0x5, 0xdc,0x48,0x19,0x49,0x14,0x0, 0x2, 0xb, +0x48,0x0, 0xb, 0xc, 0x59,0x14,0x0, 0x2, 0x1b,0x48,0x0, 0xa, 0x1f,0x2d,0x12,0x7a, +0x19,0xa0,0xb, 0xf0,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0x99,0x12,0x40,0x7, 0x7c,0xbf, +0xda,0xf8,0x22,0x7e,0x30,0x4, 0xac,0x3a,0x2d,0x13,0x22,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xe5, +0xcc,0x54,0x7, 0x68,0x3, 0x75,0xcc,0x50,0x12,0x31,0xb9,0x74,0x1, 0x7a,0xb3,0x4, +0xd6,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda, +0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c,0xa7,0x24,0x0, 0x78,0x7, 0x7e,0x34,0x4, 0xd9, +0x7a,0x39,0xa0,0x22,0xca,0xb8,0xa9,0xc0,0x93,0xe4,0x7a,0xb3,0x4, 0xd5,0x7a,0xb3, +0x4, 0xd7,0xda,0xb8,0x32,0x7e,0x34,0x4, 0xb1,0x12,0x51,0x76,0x7e,0x34,0x4, 0xc3, +0x7e,0x24,0x0, 0x12,0x2, 0x2, 0xee,0xca,0x3b,0x6c,0xaa,0x7e,0x73,0x0, 0x54,0x5e, +0x70,0xf, 0x7e,0x44,0x0, 0xcc,0x7e,0x24,0x0, 0x3a,0x6c,0x66,0x80,0x64,0x75,0x8, +0xff,0xa, 0xf6,0x2d,0xf2,0x7e,0xf9,0x20,0x7e,0x30,0x4, 0xac,0x23,0x7d,0xe1,0x2d, +0xe4,0x49,0x1e,0x0, 0x2, 0xb, 0xe8,0x0, 0xa, 0x76,0xb, 0x74,0x80,0x24,0xa, 0xef, +0x2d,0xe2,0x7e,0xe9,0xe0,0x7e,0xd0,0x4, 0xac,0xde,0x7d,0xe6,0x2d,0xe4,0x49,0xde, +0x0, 0x2, 0xb, 0xe8,0xc0,0xbf,0x6, 0x58,0x7, 0x7c,0xae,0x7a,0xf1,0x8, 0x7f,0x6, +0xb, 0xf0,0xbc,0x7f,0x38,0xd8,0xe5,0x8, 0xbe,0xb0,0xff,0x68,0x13,0x7e,0xf9,0xe0, +0xe5,0x8, 0xa, 0xfb,0x2d,0xf2,0x7a,0xf9,0xe0,0xa, 0xf6,0x2d,0xf2,0x7a,0xf9,0xa0, +0xb, 0x60,0xbc,0x76,0x38,0x98,0xda,0x3b,0x22,0x7c,0xa6,0xa, 0x27,0xa, 0x3b,0x9d, +0x32,0x12,0x2, 0xde,0xa, 0x2a,0xbd,0x32,0x18,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca, +0xf8,0x7c,0xfb,0x7f,0x40,0x7a,0x1d,0xc, 0x7e,0x30,0xff,0xbe,0x48,0x0, 0x0, 0x8, +0x50,0x7e,0x1d,0x10,0xbe,0x18,0x0, 0x0, 0x8, 0x47,0xbf,0x41,0x8, 0x20,0x7e,0x1d, +0xc, 0x7f,0x4, 0x12,0x41,0x91,0x1a,0x1f,0x1b,0x15,0x7e,0x23,0x5, 0x54,0xbc,0x2f, +0x68,0x2c,0xa, 0x22,0xb, 0x24,0xa, 0x3f,0xbd,0x32,0x78,0x25,0x80,0x20,0x7e,0x1d, +0xc, 0x7e,0xd, 0x10,0x12,0x41,0x91,0xa, 0x1f,0xb, 0x15,0x7e,0x23,0x5, 0x54,0x7c, +0xb2,0x24,0xfe,0xbc,0xbf,0x68,0x7, 0x7c,0xb2,0x14,0xbc,0xbf,0x78,0x3, 0x7e,0x30, +0xff,0x7e,0x23,0x5, 0x53,0xbc,0x23,0x8, 0x5, 0xbe,0x30,0x0, 0x58,0xa, 0xe4,0x7a, +0xb3,0x5, 0x51,0x12,0x1f,0x6f,0x80,0x74,0x6c,0x22,0x80,0x65,0xe5,0x15,0xbc,0xb2, +0x68,0x5d,0xa, 0x2, 0x9, 0x10,0x0, 0x3a,0x7e,0xa3,0x5, 0x53,0x7c,0xb1,0x84,0x7c, +0x1a,0x7e,0x3, 0x5, 0x54,0xbc,0x3, 0x8, 0x8, 0x7e,0x73,0x5, 0x54,0xbc,0x71,0x38, +0xc, 0xbc,0x3, 0x18,0x3a,0x7e,0x3, 0x5, 0x54,0xbc,0x1, 0x38,0x32,0x7c,0xb3,0x7c, +0x71,0x7e,0x60,0x1, 0x12,0x40,0x89,0xb4,0x1, 0x25,0xbc,0x13,0x78,0x17,0x7e,0x1d, +0x10,0xbf,0x41,0x1a,0x33,0x8, 0x4, 0xb, 0x34,0x80,0x2, 0x1b,0x34,0x7c,0x27,0x7a, +0x23,0x5, 0x52,0x80,0x3, 0x12,0x1f,0x6f,0xe4,0x7a,0xb3,0x5, 0x51,0x80,0xd, 0xb, +0x20,0x12,0x7, 0x79,0xa, 0x2b,0xa, 0x32,0xbd,0x32,0x48,0x90,0x7c,0xb3,0xda,0xf8, +0x22,0x12,0x41,0x99,0x7a,0xb3,0x5, 0x51,0x22,0x7f,0x60,0x7f,0x71,0x7e,0x14,0x0, +0x74,0x7f,0x17,0x12,0x0, 0x89,0x74,0x7, 0x7f,0x51,0x1e,0xb4,0x1e,0xa4,0x50,0x4, +0x4e,0xb4,0x80,0x0, 0x14,0x78,0xf3,0x7e,0x14,0x0, 0x54,0x7f,0x17,0x12,0x0, 0x89, +0x7f,0x1, 0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4, +0xbf,0x65,0x8, 0x3, 0x74,0x80,0x22,0xbf,0x61,0x58,0x2, 0xe4,0x22,0x74,0x9, 0x7f, +0x16,0x2f,0x11,0x14,0x78,0xfb,0x2f,0x0, 0x2f,0x0, 0x9f,0x10,0x7f,0x7, 0x12,0x0, +0x94,0x7c,0xb7,0x22,0xca,0x3b,0x12,0x7, 0x79,0x7c,0xeb,0xbe,0xb0,0x2, 0x50,0x2, +0x81,0x5a,0x6c,0xff,0x80,0x27,0x7e,0x70,0x5, 0xac,0x7f,0x49,0x23,0x0, 0x3e,0x59, +0x23,0x2, 0xae,0x49,0x23,0x0, 0x40,0x59,0x23,0x2, 0xb0,0x74,0xff,0x19,0xb3,0x2, +0xb2,0xa, 0x2f,0x9, 0x72,0x0, 0x3a,0x19,0x72,0x2, 0xd4,0xb, 0xf0,0x12,0x7, 0x79, +0x12,0x2f,0xb0,0x48,0xd1,0x6c,0xff,0x61,0xef,0x74,0x5, 0xac,0xbf,0x12,0x44,0x5d, +0x78,0x2, 0x61,0xed,0xa, 0x6f,0xb, 0x64,0x61,0xe7,0x74,0x5, 0xac,0xbd,0x12,0x44, +0x5d,0x78,0x2, 0x61,0xe5,0xa, 0x2f,0x9, 0x72,0x2, 0xd4,0xbe,0x73,0x5, 0x54,0x40, +0x19,0xbe,0x73,0x5, 0x53,0x50,0x13,0xa, 0x1d,0x9, 0x61,0x2, 0xd4,0xbe,0x63,0x5, +0x53,0x40,0x7, 0xa, 0x6, 0x12,0x44,0x91,0x48,0x27,0xa, 0x1d,0x9, 0x61,0x2, 0xd4, +0xbe,0x63,0x5, 0x54,0x50,0x2, 0x61,0xe5,0xbe,0x63,0x5, 0x53,0x40,0x2, 0x61,0xe5, +0xbe,0x73,0x5, 0x53,0x50,0x2, 0x61,0xe5,0xa, 0x7, 0x12,0x44,0x91,0x48,0x2, 0x61, +0xe5,0xa, 0x37,0x7e,0x53,0x5, 0x54,0xa, 0x45,0x7d,0x24,0x12,0x0, 0x46,0x7c,0xa5, +0x7a,0xa3,0x2, 0xd8,0xa, 0x3d,0x9, 0xb3,0x2, 0xd4,0xa, 0x3b,0x7d,0x24,0x12,0x0, +0x46,0x7c,0xb5,0x7a,0xb3,0x2, 0xd9,0xa, 0x2b,0xa, 0x3a,0x12,0x2f,0xda,0x8, 0x2, +0x61,0xe5,0x12,0x44,0x80,0x9d,0x32,0x12,0x2, 0xde,0xbe,0x37,0x1, 0xfe,0x48,0x2, +0x61,0xe5,0xa, 0x3f,0x9, 0xb3,0x2, 0xd4,0xa, 0x3d,0x9, 0x73,0x2, 0xd4,0x12,0x44, +0xa2,0x7a,0x37,0x2, 0xce,0xa, 0x3f,0x9, 0x73,0x2, 0xd4,0x7e,0x53,0x5, 0x54,0xa, +0x45,0x12,0x44,0x70,0x49,0x5, 0x1, 0x5c,0x7a,0xf, 0x2, 0xc2,0xa, 0x5c,0x12,0x44, +0x69,0x12,0x2d,0x6c,0x2f,0x10,0x7a,0x1f,0x2, 0xc2,0xa, 0x5d,0x9, 0x75,0x2, 0xd4, +0xa, 0x37,0x12,0x44,0x70,0x49,0x5, 0x1, 0x5c,0x7a,0xf, 0x2, 0xc6,0xa, 0x5c,0x12, +0x44,0x69,0x12,0x2d,0x6c,0x2f,0x10,0x7a,0x1f,0x2, 0xc6,0x74,0x5, 0xac,0xbd,0x49, +0x35,0x2, 0xae,0x6d,0x22,0x7e,0x6f,0x2, 0xc6,0x7f,0x6, 0x12,0x0, 0x78,0x7f,0x51, +0x74,0x5, 0xac,0xbf,0x49,0x35,0x2, 0xae,0x6d,0x22,0x7e,0x7f,0x2, 0xc2,0x7f,0x7, +0x12,0x0, 0x78,0x2f,0x15,0x7f,0x7, 0x2f,0x6, 0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xca, +0x7e,0xa0,0xbb,0x7e,0x70,0x5, 0xac,0x7f,0x19,0xa3,0x2, 0xb2,0x12,0x44,0x80,0xbd, +0x32,0x50,0xa, 0x7a,0x37,0x2, 0xd0,0x7a,0x27,0x2, 0xd2,0x80,0x8, 0x7a,0x27,0x2, +0xd0,0x7a,0x37,0x2, 0xd2,0x7e,0x37,0x2, 0xce,0xbe,0x37,0x2, 0xd0,0x38,0x6, 0x7e, +0x27,0x2, 0xd0,0x80,0xa, 0xbe,0x37,0x2, 0xd2,0x40,0xe, 0x7e,0x27,0x2, 0xd2,0x74, +0x5, 0xac,0xbf,0x59,0x25,0x2, 0xb0,0x80,0x14,0x7e,0xa0,0xcc,0x7e,0x50,0x5, 0xac, +0x5f,0x19,0xa2,0x2, 0xb2,0x74,0x5, 0xac,0xbf,0x59,0x35,0x2, 0xb0,0x7e,0x1f,0x2, +0xca,0x74,0x5, 0xac,0xbf,0x59,0x35,0x2, 0xae,0x7e,0xa0,0xaa,0x7e,0x70,0x5, 0xac, +0x7d,0x19,0xa3,0x2, 0xb2,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x41,0x4a,0xb, 0xf0,0xbc, +0xef,0x28,0x2, 0x41,0x39,0x12,0xf, 0xbf,0x7a,0xb3,0x0, 0x54,0x6c,0xff,0x80,0x56, +0x7e,0x30,0x5, 0xac,0x3f,0x9, 0x61,0x2, 0xb2,0xbe,0x60,0xaa,0x68,0x46,0x49,0x21, +0x2, 0xae,0x7e,0x73,0x0, 0x54,0x7c,0x7, 0x5e,0x0, 0xf, 0x74,0x5, 0xac,0xb0,0x59, +0x25,0x0, 0x3e,0x49,0x21,0x2, 0xb0,0x59,0x25,0x0, 0x40,0xa, 0x2f,0x9, 0x12,0x2, +0xd4,0xa, 0x20,0x19,0x12,0x0, 0x3a,0xa5,0xbe,0xbb,0x4, 0x74,0x2, 0x80,0x6, 0xa5, +0xbe,0xcc,0x6, 0x74,0x1, 0x19,0xb2,0x0, 0x52,0x12,0xd, 0x41,0x12,0x7, 0x79,0xbe, +0xb0,0x2, 0x50,0x6, 0xb, 0xf0,0xbc,0xef,0x38,0xa6,0xda,0x3b,0x22,0x9, 0xb5,0x2, +0xb2,0xbe,0xb0,0xaa,0x22,0xa, 0x4f,0xa, 0x5e,0x2d,0x54,0x3e,0x54,0x3e,0x54,0x22, +0x7d,0x24,0x12,0x0, 0x46,0x7c,0xc5,0x74,0x4, 0xac,0xbc,0x49,0x15,0x1, 0x5e,0x22, +0x74,0x5, 0xac,0xbd,0x49,0x25,0x2, 0xb0,0x74,0x5, 0xac,0xbf,0x49,0x35,0x2, 0xb0, +0x22,0x7e,0x63,0x5, 0x53,0xa, 0x56,0x7e,0x63,0x5, 0x54,0xa, 0x16,0x2d,0x15,0xbd, +0x1, 0x22,0xca,0x3b,0x7c,0x27,0x7c,0x3b,0x7e,0x93,0x5, 0x54,0xa, 0xa9,0xa, 0x83, +0x12,0x45,0xbf,0x7c,0x15,0xa, 0x92,0x7d,0x39,0x7d,0x2a,0x12,0x45,0xd6,0x7e,0xa3, +0x5, 0x53,0xa, 0xaa,0x12,0x45,0xbf,0x7c,0x5, 0x7d,0x39,0x7d,0x2a,0x12,0x0, 0x46, +0x7c,0x25,0xbc,0x81,0x78,0x4f,0x7e,0xd0,0x4, 0xac,0xd0,0x49,0xd6,0x1, 0x5e,0x49, +0xc6,0x1, 0x5c,0x7e,0xf0,0x4, 0xac,0xf2,0x49,0xf7,0x1, 0x5e,0x49,0xe7,0x1, 0x5c, +0x4c,0x11,0x68,0x14,0x49,0x36,0x1, 0x5a,0x49,0x26,0x1, 0x58,0x2f,0x61,0x49,0x37, +0x1, 0x5a,0x49,0x27,0x1, 0x58,0x2f,0x71,0x7c,0xb9,0x14,0xbc,0xb1,0x68,0x78,0x7e, +0x10,0x4, 0xac,0x1, 0x12,0x45,0xc6,0x2f,0x61,0x7e,0x10,0x4, 0xac,0x12,0x12,0x45, +0xc6,0x2f,0x71,0x80,0x62,0xa, 0x31,0xa, 0xa0,0x9d,0xa3,0x7d,0x3a,0x7c,0x7, 0xe5, +0x8, 0xa, 0x3b,0xa, 0xa2,0x9d,0xa3,0x7d,0x3a,0x7c,0x27,0xe5,0x8, 0xa, 0x3b,0xa, +0x20,0x2d,0x23,0x3e,0x24,0x3e,0x24,0x49,0xf2,0x1, 0x5e,0x49,0xe2,0x1, 0x5c,0xa, +0xa1,0xa, 0x20,0x2d,0x2a,0x3e,0x24,0x3e,0x24,0x49,0xd2,0x1, 0x5e,0x49,0xc2,0x1, +0x5c,0x2f,0x67,0xa, 0xa2,0x2d,0xa3,0x3e,0xa4,0x3e,0xa4,0x49,0x3a,0x1, 0x5e,0x49, +0x2a,0x1, 0x5c,0xa, 0x1, 0xa, 0xa2,0x2d,0xa0,0x3e,0xa4,0x3e,0xa4,0x49,0xfa,0x1, +0x5e,0x49,0xea,0x1, 0x5c,0x2f,0x71,0xb, 0x6c,0xb, 0x7c,0xbc,0xa3,0x7e,0x17,0x2, +0x3a,0x1a,0x2, 0x38,0x6, 0x1a,0x0, 0x7f,0x17,0x80,0x4, 0x1a,0x0, 0x7f,0x16,0x12, +0x0, 0x78,0x7f,0x6, 0x2f,0x7, 0x12,0x0, 0xe5,0x7d,0xb3,0x7e,0x37,0x2, 0x3a,0x12, +0x45,0xcf,0x7e,0xa7,0x1, 0xfc,0x9d,0xa3,0x2d,0xba,0x7d,0x3b,0xda,0x3b,0x22,0x7d, +0x38,0x7d,0x2a,0x2, 0x0, 0x46,0x49,0x30,0x1, 0x62,0x49,0x20,0x1, 0x60,0x22,0x7e, +0x24,0x0, 0x2, 0x2, 0x0, 0x46,0x12,0x0, 0x46,0x7c,0x85,0x7a,0x81,0x8, 0x22,0x7e, +0x73,0x2, 0x56,0xa, 0x37,0x1e,0x34,0x7a,0x73,0x5, 0x53,0xa, 0x37,0x1e,0x34,0x7a, +0x73,0x5, 0x54,0x22,0xca,0xf8,0x7c,0xfb,0x4c,0x77,0x68,0xf, 0xc2,0xaf,0x43,0xe1, +0x1, 0x7e,0x37,0x2, 0x4, 0x99,0x34,0xd2,0xaf,0x80,0x3, 0x43,0xe1,0x1, 0xc2,0x9, +0x2e,0xf0,0xff,0x92,0xa, 0xd2,0xae,0xa9,0xd6,0xb7,0xc2,0xbe,0xda,0xf8,0x22,0xca, +0x59,0xc2,0xae,0x30,0xa, 0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e,0xa0,0x2, 0xe5,0xe6, +0x5c,0xba,0x68,0x5, 0x75,0xe6,0x0, 0xd2,0x9, 0xd2,0xae,0xda,0x59,0x32,0x12,0x0, +0x2e,0x60,0x73,0x7e,0xb3,0x2, 0xab,0x20,0xe7,0x6c,0x7e,0xb3,0x2, 0x54,0x30,0xe0, +0x2, 0x80,0x7, 0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x6, 0x7e,0x34,0xe, 0xb0,0x80,0x4, +0x7e,0x34,0x7, 0x58,0x7e,0x27,0x2, 0xac,0x6c,0xaa,0x80,0x42,0xa, 0x1a,0x9, 0x31, +0x2, 0x7d,0x7e,0x10,0x4, 0xac,0x13,0x49,0xd0,0x0, 0xce,0x49,0xc0,0x0, 0xcc,0x7d, +0xf3,0x6d,0xee,0xbf,0x67,0x58,0x1a,0x12,0x26,0xd6,0x60,0x5, 0x3e,0x44,0x14,0x78, +0xfb,0x7c,0xb9,0xa, 0x3, 0x2e,0x4, 0x5, 0x3, 0x7e,0x9, 0x20,0x4c,0x2b,0x7a,0x9, +0x20,0xa, 0x3, 0x9, 0x20,0x5, 0x3, 0x2d,0x2, 0x7a,0x9, 0x20,0xb, 0xa0,0x7e,0x23, +0x2, 0x58,0xbc,0x2a,0x38,0xb6,0x22,0xc2,0xf, 0x6c,0x33,0x7e,0x20,0xff,0x7e,0x10, +0x5, 0xac,0x13,0x19,0x20,0x0, 0x42,0x7c,0x13,0x2e,0x10,0xc, 0x74,0xff,0xa5,0xf7, +0x7e,0x24,0xff,0xff,0x12,0x51,0x1b,0x1b,0x38,0x20,0x7c,0x13,0x2e,0x10,0xe, 0xe4, +0xa5,0xf7,0xb, 0x30,0xa5,0xbb,0x2, 0xd3,0x7e,0x23,0x0, 0x54,0x7c,0xb2,0x54,0xf, +0x78,0x26,0x7c,0xb2,0xc4,0x54,0xf, 0x78,0x3, 0x2, 0x48,0x83,0x6c,0x33,0x7e,0x4, +0x7f,0xff,0x7e,0x70,0x2, 0xac,0x73,0x59,0x3, 0x0, 0xc4,0x59,0x3, 0x0, 0xc8,0xb, +0x30,0xa5,0xbb,0x2, 0xe9,0x2, 0x48,0x83,0x7c,0xb2,0xc4,0x54,0xf, 0x78,0x2c,0x6c, +0x33,0x80,0x1a,0x12,0x48,0xf9,0x7e,0x50,0x2, 0xac,0x53,0x12,0x48,0xf0,0x59,0x32, +0x0, 0xc8,0x19,0x34,0x0, 0x42,0x7c,0x13,0x12,0x51,0xa2,0xb, 0x30,0x12,0x7, 0x79, +0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xdb,0x2, 0x48,0x83,0x6c,0x33,0x80,0x4f,0x6c, +0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x0, 0xc8,0x7e,0x70,0x5, 0xac,0x73,0x49, +0x33,0x0, 0x40,0x12,0x4e,0xd2,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x0, 0xc4,0x7e, +0x70,0x5, 0xac,0x73,0x49,0x33,0x0, 0x3e,0x9d,0x32,0x12,0x2, 0xde,0x2d,0x43,0x12, +0x51,0x1b,0xb, 0x38,0x20,0xbd,0x24,0x28,0xc, 0x7c,0x13,0x2e,0x10,0xc, 0x7c,0xba, +0xa5,0xf7,0x1b,0x38,0x40,0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xb5,0xb, 0x30,0x12,0x7, +0x79,0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xa6,0x6c,0x33,0x80,0x6e,0xd2,0xf, 0x6c, +0xaa,0x80,0x2c,0xbc,0xa3,0x68,0x26,0x7c,0x1a,0x2e,0x10,0xc, 0xa5,0xe7,0x7c,0x2b, +0x12,0x51,0xaa,0xbc,0xb2,0x78,0x16,0x7c,0xba,0x12,0x51,0x1d,0xb, 0x38,0x20,0x12, +0x51,0x1b,0xb, 0x38,0x30,0xbd,0x32,0x40,0x4, 0xc2,0xf, 0x80,0xd, 0xb, 0xa0,0x12, +0x7, 0x79,0xa, 0x2b,0xa, 0x3a,0xbd,0x32,0x48,0xc9,0x30,0xf, 0x2c,0x12,0x51,0xaa, +0x7c,0x5b,0xbe,0x50,0x2, 0x50,0x22,0x7c,0x15,0x12,0x51,0xa2,0x7e,0x70,0x5, 0xac, +0x73,0x19,0x53,0x0, 0x42,0x49,0x43,0x0, 0x3e,0x74,0x2, 0xac,0x5b,0x59,0x42,0x0, +0xc4,0x49,0x33,0x0, 0x40,0x59,0x32,0x0, 0xc8,0xb, 0x30,0x12,0x7, 0x79,0xa, 0x2b, +0xa, 0x33,0xbd,0x32,0x48,0x87,0x6c,0x33,0x80,0x39,0x7e,0x70,0x5, 0xac,0x73,0x9, +0xb3,0x0, 0x42,0xb4,0xff,0x2b,0x6c,0xaa,0x7c,0x1a,0x2e,0x10,0xe, 0xa5,0xe7,0x70, +0x19,0x74,0x1, 0xa5,0xf7,0x12,0x48,0xf9,0x7e,0x50,0x2, 0xac,0x5a,0x12,0x48,0xf0, +0x59,0x32,0x0, 0xc8,0x19,0xa4,0x0, 0x42,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x2, 0x40, +0xd7,0xb, 0x30,0x12,0x7, 0x79,0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xbc,0x6c,0x33, +0x12,0x48,0xe8,0x70,0x8, 0x12,0x37,0xf0,0xac,0x73,0x12,0x49,0xb9,0xb, 0x30,0xa5, +0xbb,0x2, 0xed,0x12,0x49,0x3, 0x6c,0x33,0x12,0x48,0xe8,0xb4,0x1, 0x21,0xa, 0x33, +0x9, 0xb3,0x0, 0xc2,0xbe,0xb0,0x3, 0x68,0x3, 0xb4,0x1, 0x9, 0xe4,0xa, 0x43,0x19, +0xb4,0x0, 0xc0,0x80,0x3b,0x74,0x2, 0xa, 0x43,0x19,0xb4,0x0, 0xc0,0x80,0x31,0xa, +0x33,0x9, 0xb3,0x0, 0xc2,0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x1c,0x74,0x1, 0xa, 0x43, +0x19,0xb4,0x0, 0xc0,0xbe,0xa0,0x2, 0x50,0x17,0x7c,0x6a,0xb, 0xa0,0x7e,0x70,0x5, +0xac,0x67,0x19,0x33,0x0, 0x42,0x80,0x8, 0x74,0x3, 0xa, 0x43,0x19,0xb4,0x0, 0xc0, +0xb, 0x30,0xbe,0x30,0x2, 0x40,0xa1,0x22,0x7c,0x13,0x2e,0x10,0xe, 0xa5,0xe7,0x22, +0x59,0x32,0x0, 0xc4,0x49,0x34,0x0, 0x40,0x22,0x7e,0x90,0x5, 0xac,0x93,0x49,0x34, +0x0, 0x3e,0x22,0x7e,0xa3,0x0, 0x54,0x5e,0xa0,0xf, 0x22,0x12,0x49,0x3, 0x78,0x2, +0x21,0xae,0x6c,0x33,0x12,0x49,0xaf,0xbe,0x20,0x2, 0x50,0x1d,0xa, 0x32,0x9, 0xb3, +0x0, 0xc0,0x70,0x15,0x49,0x2, 0x0, 0x68,0x7e,0x70,0x4, 0xac,0x72,0x59,0x3, 0x5, +0x49,0x49,0x2, 0x0, 0x6a,0x59,0x3, 0x5, 0x4b,0xb, 0x30,0xa5,0xbb,0x2, 0xd5,0x6c, +0x33,0x80,0x67,0x12,0x49,0xaf,0xbe,0x20,0x2, 0x50,0x5d,0x7e,0x70,0x4, 0xac,0x72, +0x49,0x43,0x5, 0x49,0x49,0x2, 0x0, 0x68,0x9d,0x4, 0x49,0x33,0x5, 0x4b,0x49,0x42, +0x0, 0x6a,0x9d,0x43,0x7d,0x30,0x12,0x2f,0xdc,0x18,0x23,0x7d,0x34,0x12,0x2f,0xdc, +0x18,0x1c,0x7e,0x70,0x4, 0xac,0x72,0x49,0xf3,0x5, 0x49,0x7e,0x50,0x5, 0xac,0x53, +0x59,0xf2,0x0, 0x68,0x49,0x33,0x5, 0x4b,0x59,0x32,0x0, 0x6a,0x80,0x1a,0x7e,0x70, +0x5, 0xac,0x73,0x49,0xf3,0x0, 0x68,0x7e,0x50,0x4, 0xac,0x52,0x59,0xf2,0x5, 0x49, +0x49,0x33,0x0, 0x6a,0x59,0x32,0x5, 0x4b,0xb, 0x30,0xbc,0xa3,0x38,0x95,0x22,0x7e, +0x50,0x5, 0xac,0x53,0x9, 0x22,0x0, 0x6c,0x22,0x59,0x43,0x0, 0xc4,0x59,0x43,0x0, +0xc8,0x22,0x7c,0x6b,0x7e,0x53,0x0, 0x54,0x7c,0xb5,0x54,0xf, 0x68,0x10,0x7c,0x45, +0x1b,0x40,0x5e,0x40,0xf, 0x5e,0x50,0xf0,0x4c,0x54,0x7a,0x53,0x0, 0x54,0xa5,0xbe, +0x0, 0x1c,0xa5,0xbf,0x2, 0x18,0x7e,0x73,0x0, 0x3b,0x7a,0x73,0x0, 0x3a,0x7e,0x1f, +0x0, 0x44,0x7e,0x33,0x0, 0x43,0x7a,0x1f,0x0, 0x3f,0x7a,0x33,0x0, 0x3e,0x22,0xca, +0x79,0x7e,0x23,0x0, 0x54,0x5e,0x20,0xf, 0x6c,0xaa,0x41,0x9f,0x7e,0x70,0x5, 0xac, +0x7a,0x49,0xf3,0x0, 0x3e,0x7e,0x4, 0x0, 0xf, 0x7d,0x40,0x9e,0xf4,0x0, 0x20,0xbd, +0x4f,0x38,0xa, 0x7e,0x24,0x1, 0xc0,0x9d,0x20,0xbd,0x2f,0x50,0x42,0x7e,0x53,0x0, +0x54,0x7c,0xb5,0xc4,0x7c,0x3b,0x5e,0x30,0xf, 0x7c,0xb5,0x54,0xf, 0xbc,0xb3,0x78, +0x27,0xa5,0xba,0x1, 0x23,0x7e,0xf0,0x4, 0xac,0xfa,0x49,0x27,0x5, 0x39,0xbe,0x24, +0x7f,0xff,0x68,0x14,0x49,0xe7,0x5, 0x3b,0xbe,0xe4,0x7f,0xff,0x68,0xa, 0x59,0x23, +0x0, 0x3e,0x59,0xe3,0x0, 0x40,0x80,0x7, 0x7c,0xba,0x7c,0x72,0x12,0x49,0xc2,0x12, +0x4a,0xb2,0xc4,0x7c,0x3b,0x5e,0x30,0xf, 0x7c,0xb7,0x54,0xf, 0xbc,0xb3,0x68,0x9, +0x7e,0xe4,0x7f,0xff,0x12,0x4a,0xa8,0x80,0x10,0x7e,0x50,0x5, 0xac,0x5a,0x49,0xe2, +0x0, 0x3e,0x12,0x4a,0xa8,0x49,0xe2,0x0, 0x40,0x59,0xe3,0x5, 0x3b,0xb, 0xa0,0xbc, +0x2a,0x28,0x2, 0x41,0xc, 0xda,0x79,0x22,0x7e,0x70,0x4, 0xac,0x7a,0x59,0xe3,0x5, +0x39,0x22,0x7e,0x73,0x0, 0x54,0x7c,0xb7,0x22,0x6c,0xaa,0x7e,0x90,0x5, 0xac,0x9a, +0x9, 0xb4,0x0, 0x6c,0xbe,0xb0,0xff,0x68,0xa, 0x49,0x34,0x0, 0x6a,0xbe,0x34,0x3, +0x1f,0x50,0x33,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xe1,0x12,0x4a,0xb2,0x54,0xf, 0x78, +0x20,0x7c,0xb7,0xc4,0x7c,0x6b,0x5e,0x60,0xf, 0xbe,0x60,0x0, 0x28,0x13,0xe5,0x37, +0xbe,0xb0,0x1, 0x50,0x8, 0x12,0xd, 0x48,0xd2,0x3, 0x5, 0x37,0x22,0x75,0x37,0x0, +0x22,0x75,0x37,0x0, 0xc2,0x3, 0x22,0x7d,0x2, 0x7d,0xf3,0x6d,0x44,0xd2,0xf, 0x12, +0xb, 0xac,0xbe,0x24,0x0, 0x8, 0x48,0x2, 0xc2,0xf, 0xbe,0xf4,0x0, 0x20,0x40,0x21, +0xbe,0xf4,0x0, 0x4d,0x50,0x1b,0x7e,0x14,0x0, 0x4d,0x30,0xf, 0xa, 0x9d,0x1f,0x1b, +0x14,0x2e,0x14,0x1, 0xc1,0x80,0x2d,0x9d,0x1f,0x1b,0x14,0x2e,0x14,0x1, 0x67,0x80, +0x23,0xbe,0xf4,0x1, 0xb3,0x28,0x2f,0xbe,0xf4,0x1, 0xe0,0x38,0x29,0x7d,0x1f,0x30, +0xf, 0xa, 0x9e,0x14,0x1, 0xb4,0x2e,0x14,0x1, 0x94,0x80,0x8, 0x9e,0x14,0x1, 0xb4, +0x2e,0x14,0x1, 0x3a,0x12,0x1d,0x9e,0x1a,0x4b,0x7e,0x14,0x0, 0xa, 0x7d,0x34,0xad, +0x31,0x12,0x4b,0x84,0x7d,0x43,0x7d,0x54,0x1a,0x4a,0x1a,0x48,0x12,0x4e,0xda,0x2f, +0x12,0x2, 0x18,0x5c,0x7e,0x24,0x0, 0xa, 0x2, 0x0, 0x46,0xca,0xf8,0x7e,0xe4,0x0, +0xc8,0x7e,0xd4,0x1, 0x90,0x7e,0xc4,0x0, 0xf0,0x6c,0xff,0x81,0x9f,0x12,0x4c,0xe7, +0x49,0x23,0x0, 0x4, 0x7a,0x27,0x5, 0x55,0x49,0xb3,0x0, 0x6, 0xbe,0xb4,0x3, 0x20, +0x40,0x2, 0x81,0xb2,0x7e,0x37,0x5, 0x55,0x9d,0x3c,0x12,0x2, 0xde,0x7d,0xac,0x9d, +0xa3,0x7e,0x24,0x0, 0xa, 0x7d,0x3a,0x8d,0x32,0x7d,0xa3,0xb, 0xa4,0x7d,0x3b,0x8d, +0x3d,0x7a,0x27,0x5, 0x57,0x7d,0x32,0x9d,0x3e,0x12,0x2, 0xde,0x12,0x4b,0x84,0x7d, +0x93,0xb, 0x94,0xbd,0xdb,0x40,0x6, 0x7e,0x37,0x4, 0xab,0x80,0x4, 0x7e,0x37,0x4, +0x86,0x7e,0x24,0x0, 0x64,0x8d,0x32,0x7d,0xf3,0xbe,0xf4,0x0, 0x1, 0x50,0x4, 0x6d, +0xff,0x80,0xa, 0xbe,0xf4,0x0, 0x28,0x28,0x4, 0x7e,0xf4,0x0, 0x28,0x7d,0x19,0xad, +0x1a,0x6d,0x0, 0x7f,0x10,0x7d,0x1f,0x12,0x0, 0x89,0x7f,0x1, 0xbd,0xeb,0x40,0x11, +0x12,0x4c,0xb5,0x7d,0x3b,0x6d,0x22,0xbf,0x10,0x50,0x4e,0x6d,0xbb,0x80,0x61,0x80, +0x48,0xbd,0xdb,0x40,0x1b,0x7f,0x10,0x74,0x7, 0x12,0x4c,0xb9,0x12,0x4c,0xdd,0xb4, +0x1, 0x2, 0x9f,0x0, 0x7d,0x81,0x2d,0xb8,0xbd,0xdb,0x50,0x44,0x7d,0xbd,0x80,0x40, +0x7d,0x8e,0x2d,0x8d,0xbd,0x8b,0x40,0x27,0x7f,0x10,0x74,0x7, 0x12,0x4c,0xb9,0x12, +0x4c,0xdd,0xb4,0x1, 0x2, 0x9f,0x0, 0x7d,0x5d,0x6d,0x44,0x2f,0x20,0x7d,0x3b,0x6d, +0x22,0xbf,0x12,0x50,0x4, 0x7d,0xbd,0x80,0x17,0x7d,0x81,0x9d,0xb8,0x80,0x11,0x12, +0x4c,0xb5,0x7d,0x81,0x2d,0xb8,0xbe,0xb4,0x3, 0x20,0x40,0x4, 0x7e,0xb4,0x3, 0x1f, +0x74,0x5, 0xac,0xbf,0x7d,0x85,0x2e,0x85,0x2c,0x59,0xb8,0x0, 0x6, 0xb, 0xf0,0x7e, +0x85,0x2c,0x9, 0xb8,0x0, 0x1a,0x54,0xf, 0xa, 0x3b,0xa, 0x8f,0xbd,0x83,0x58,0x2, +0x61,0x9d,0xda,0xf8,0x22,0x7f,0x10,0x74,0x9, 0x7e,0x30,0x4, 0x7e,0x20,0xc8,0x12, +0x4c,0xc5,0x7f,0x1, 0x22,0xca,0xf8,0x7c,0xf2,0x12,0x4f,0xb1,0xa, 0x19,0x6d,0x0, +0x12,0x0, 0x94,0xa, 0x1f,0x6d,0x0, 0x12,0x0, 0x94,0xda,0xf8,0x22,0xa, 0x8f,0x2e, +0x85,0x2c,0x9, 0xb8,0x0, 0x18,0x22,0x7e,0x70,0x5, 0xac,0x7f,0x2e,0x35,0x2c,0x22, +0xca,0xf8,0x7c,0xfb,0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0x7c,0x12,0x4c,0xe7,0x49, +0x33,0x0, 0x4, 0x9d,0x32,0x12,0x2, 0xde,0x7d,0x13,0x74,0x4, 0xac,0xbf,0x49,0x25, +0x4, 0x7e,0x12,0x4c,0xe7,0x49,0x33,0x0, 0x6, 0x9d,0x32,0x12,0x2, 0xde,0xbe,0x14, +0x0, 0xa, 0x58,0x22,0xbe,0x34,0x0, 0xf, 0x58,0x1c,0xa, 0x3f,0x7d,0x23,0x2e,0x24, +0x4, 0xaf,0x7e,0x29,0xb0,0x4, 0x7a,0x29,0xb0,0x9, 0x53,0x4, 0xaf,0xbe,0x50,0x20, +0x28,0x20,0x74,0x20,0x80,0xc, 0xa, 0x3f,0x9, 0xa3,0x4, 0xaf,0xbe,0xa0,0x3, 0x38, +0x7, 0xe4,0x19,0xb3,0x4, 0xaf,0x80,0xa, 0x2e,0x34,0x4, 0xaf,0x7c,0xba,0x14,0x7a, +0x39,0xb0,0xa, 0x3f,0x2e,0x35,0x2c,0x7e,0x39,0xb0,0x12,0x4e,0xa2,0x60,0xa, 0x74, +0x78,0xa, 0x3f,0x19,0xb3,0x4, 0x7a,0x80,0x13,0xa, 0x3f,0x9, 0xb3,0x4, 0x7a,0xbe, +0xb0,0x0, 0x28,0x8, 0x2e,0x34,0x4, 0x7a,0x14,0x7a,0x39,0xb0,0x7e,0x90,0x5, 0xac, +0x9f,0x2e,0x45,0x2c,0x49,0x34,0x0, 0x4, 0x74,0x4, 0xac,0xbf,0x59,0x35,0x4, 0x7c, +0x49,0x34,0x0, 0x6, 0x59,0x35,0x4, 0x7e,0xda,0xf8,0x22,0xca,0xf8,0x7e,0xd5,0x2c, +0x9, 0xfd,0x0, 0x1a,0x5e,0xf0,0xf, 0x78,0x8, 0x12,0x4e,0x86,0x12,0x4e,0x98,0x80, +0x55,0xbe,0xf0,0x1, 0x78,0x1a,0x7e,0x73,0x4, 0xa8,0xbe,0x70,0x3, 0x50,0x5, 0x12, +0x4e,0x86,0x80,0x9, 0x12,0x4e,0x90,0x28,0x4, 0xe4,0x12,0x4e,0x19,0xe4,0x80,0x33, +0xbe,0xf0,0x2, 0x78,0x31,0x7e,0x73,0x4, 0x79,0xbe,0x70,0x3, 0x50,0x8, 0x12,0x4e, +0x86,0x12,0x4e,0x98,0x80,0x17,0x12,0x4e,0x90,0x28,0x4, 0xe4,0x12,0x4e,0x19,0x7e, +0x73,0x4, 0xb0,0xbe,0x70,0x3, 0x28,0x5, 0x74,0x1, 0x12,0x4e,0x19,0xe4,0x12,0x4c, +0xf0,0x74,0x1, 0x12,0x4c,0xf0,0xda,0xf8,0x22,0x7c,0xab,0x7e,0x70,0x4, 0xac,0x7a, +0x49,0x23,0x4, 0x7c,0x12,0x4e,0x7d,0x49,0x33,0x0, 0x4, 0x12,0x4e,0xd2,0x7e,0x70, +0x4, 0xac,0x7a,0x49,0x23,0x4, 0x7e,0x12,0x4e,0x7d,0x49,0x33,0x0, 0x6, 0x9d,0x32, +0x12,0x2, 0xde,0xbe,0x44,0x0, 0x14,0x58,0x33,0xbe,0x34,0x0, 0x1e,0x58,0x2d,0xa, +0x3a,0x9, 0xb3,0x4, 0x7a,0x60,0x25,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x43,0x4, 0x7c, +0x12,0x4e,0x7d,0x59,0x43,0x0, 0x4, 0x7e,0x70,0x4, 0xac,0x7a,0x49,0x33,0x4, 0x7e, +0x7e,0x50,0x5, 0xac,0x5a,0x2e,0x25,0x2c,0x59,0x32,0x0, 0x6, 0x22,0x7e,0x70,0x5, +0xac,0x7a,0x2e,0x35,0x2c,0x22,0xe4,0x7a,0xb3,0x4, 0xaf,0x7a,0xb3,0x4, 0x7a,0x22, +0x7e,0x73,0x4, 0xaf,0xbe,0x70,0x3, 0x22,0xe4,0x7a,0xb3,0x4, 0xb0,0x7a,0xb3,0x4, +0x7b,0x22,0xca,0x79,0x7c,0xeb,0x6c,0xff,0x7c,0xbe,0x7e,0x30,0x4, 0xac,0x3e,0x12, +0x13,0xa7,0x12,0x4f,0x77,0x7c,0xab,0x7e,0x30,0x4, 0xac,0x3e,0x12,0x13,0xa7,0xbe, +0x18,0x3a,0x98,0x8, 0x8, 0xbe,0xa0,0xa, 0x50,0x3, 0x7e,0xf0,0x1, 0x7c,0xbf,0xda, +0x79,0x22,0x9d,0x32,0x12,0x2, 0xde,0x7d,0x43,0x22,0x49,0x30,0x0, 0x2, 0xb, 0x8, +0x20,0x22,0xca,0x79,0x6c,0xff,0x7e,0x70,0x7, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x4, +0x91,0x7e,0x29,0xb0,0x54,0xfe,0x7a,0x29,0xb0,0x9f,0x0, 0x59,0x13,0x4, 0x8d,0x59, +0x3, 0x4, 0x8b,0xe4,0x19,0xb3,0x4, 0x8f,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xd7,0x6c, +0xff,0x80,0x59,0xa, 0x3f,0x2e,0x35,0x2c,0x7e,0x39,0xe0,0x7e,0x30,0x7, 0xac,0x3f, +0x19,0xe1,0x4, 0x90,0x7e,0x10,0x4, 0xac,0x1e,0x2e,0x5, 0x2a,0x12,0x4e,0xda,0x59, +0x31,0x4, 0x8d,0x59,0x21,0x4, 0x8b,0x7c,0xbe,0x12,0x4f,0x77,0x7c,0xab,0x7e,0x50, +0x7, 0xac,0x5f,0x19,0xa2,0x4, 0x8f,0x7d,0x32,0x12,0x2f,0xb7,0x44,0x1, 0x7a,0x39, +0xb0,0xbe,0xe0,0x8, 0x40,0xc, 0xbe,0xe0,0x18,0x50,0x7, 0x7e,0x39,0xb0,0x44,0x2, +0x80,0x5, 0x7e,0x39,0xb0,0x54,0xfd,0x7a,0x39,0xb0,0xb, 0xf0,0x12,0x29,0xe0,0x12, +0x2f,0xb0,0x48,0x9f,0xda,0x79,0x22,0x7f,0x71,0x12,0xb, 0xac,0xbe,0x24,0x0, 0x8, +0x58,0x6, 0x7e,0x7, 0x4, 0xab,0x80,0x4, 0x7e,0x7, 0x4, 0x86,0xbe,0x78,0x75,0x30, +0x8, 0x0, 0xbe,0x78,0x0, 0x0, 0x58,0x4, 0x6d,0x11,0x80,0x6, 0x7f,0x17,0x2f,0x11, +0x7d,0x13,0x7d,0x51,0x8d,0x50,0xbe,0x54,0x0, 0x64,0x28,0x4, 0x7e,0x54,0x0, 0x64, +0x22,0x7c,0x93,0xa, 0x1b,0x6d,0x0, 0x2, 0x0, 0x78,0x7e,0x34,0x0, 0x1, 0x7a,0x37, +0x4, 0xa9,0x7a,0x37,0x4, 0xab,0xe4,0x7a,0xb3,0x4, 0xad,0x7e,0xb3,0x4, 0xae,0x54, +0xf9,0x7a,0xb3,0x4, 0xae,0x54,0xfe,0x7a,0xb3,0x4, 0xae,0x7a,0x37,0x4, 0x84,0x7a, +0x37,0x4, 0x86,0xe4,0x7a,0xb3,0x4, 0x88,0x7e,0xb3,0x4, 0x89,0x54,0xf9,0x7a,0xb3, +0x4, 0x89,0x54,0xfe,0x7a,0xb3,0x4, 0x89,0x22,0x7e,0x45,0x2c,0x9, 0xa4,0x0, 0x1a, +0x5e,0xa0,0xf, 0x78,0x7, 0xe4,0x7a,0xb3,0x4, 0xa8,0x80,0x3d,0xbe,0xa0,0x1, 0x78, +0x1f,0xe4,0x7a,0xb3,0x4, 0x79,0x7e,0xb3,0x4, 0xa8,0x4, 0x7a,0xb3,0x4, 0xa8,0x7e, +0x73,0x4, 0xa8,0xbe,0x70,0xc8,0x28,0x25,0x74,0xc8,0x7a,0xb3,0x4, 0xa8,0x80,0x1d, +0xe4,0x7a,0xb3,0x4, 0xa8,0x7e,0xb3,0x4, 0x79,0x4, 0x7a,0xb3,0x4, 0x79,0x7e,0x73, +0x4, 0x79,0xbe,0x70,0xc8,0x28,0x6, 0x74,0xc8,0x7a,0xb3,0x4, 0x79,0x7e,0xb3,0x4, +0xa7,0x60,0x5, 0x14,0x7a,0xb3,0x4, 0xa7,0x22,0x49,0x43,0x0, 0x2, 0x9, 0x53,0x0, +0x4, 0x9, 0xa3,0x0, 0x5, 0x7c,0xba,0x1e,0xb0,0x54,0x3, 0xbe,0xb0,0x0, 0x28,0x30, +0xbe,0x44,0xb, 0xb8,0x28,0x2, 0x80,0x18,0xbe,0x44,0x7, 0xd0,0x28,0x7, 0xbe,0x50, +0x14,0x38,0x28,0x80,0xb, 0xbe,0x44,0x3, 0x20,0x28,0xc, 0xbe,0x50,0x10,0x38,0x1b, +0x12,0x50,0xac,0x44,0x1, 0x80,0x5, 0x12,0x50,0xac,0x54,0xfe,0x7a,0x49,0xb0,0x22, +0x2e,0x34,0x0, 0x5, 0x7c,0xba,0x54,0xfe,0x7a,0x39,0xb0,0x22,0x7d,0x43,0x2e,0x44, +0x0, 0x5, 0x7c,0xba,0x22,0x2f,0x7, 0x12,0x0, 0x94,0x7a,0x1f,0x2, 0xc2,0x7e,0x24, +0x2, 0xc2,0x7e,0x37,0x2, 0xc6,0x7c,0xbc,0x7e,0x17,0x2, 0x8, 0x99,0x14,0x7e,0x1f, +0x2, 0xc2,0x7c,0xbc,0x7e,0x17,0x2, 0xa, 0x89,0x14,0xe5,0x8, 0xa, 0x3b,0x9, 0xb3, +0x2, 0x7d,0xf5,0xc, 0x7e,0xb3,0x2, 0xab,0x22,0xe5,0xe2,0xa, 0x7b,0x6d,0x66,0xe5, +0xe2,0xf5,0xb, 0xe5,0xb, 0x7c,0x6b,0x6c,0x77,0x6d,0x22,0x22,0x7e,0x73,0x5, 0x53, +0xa, 0x27,0x1b,0x24,0xa, 0x3c,0xbd,0x32,0x7e,0x17,0x1, 0xfc,0x1a,0x2, 0x22,0x7e, +0x34,0x0, 0xcc,0x7e,0x24,0x0, 0x90,0xe4,0x2, 0x2, 0xee,0x7c,0xb3,0x3e,0xb0,0x24, +0x8, 0xa, 0x3b,0x22,0xe5,0x8, 0xa, 0x3b,0x9, 0x23,0x2, 0x7d,0x7a,0x21,0xc, 0x7e, +0x30,0x4, 0xac,0x23,0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xb6,0x7f,0x17,0x12,0x0, 0x78, +0x7e,0xf, 0x2, 0xba,0x22,0x49,0x31,0x0, 0xce,0x49,0x21,0x0, 0xcc,0x22,0x7e,0x73, +0x2, 0x53,0xa, 0x17,0x6d,0x0, 0x22,0x7e,0x14,0x0, 0xc, 0xad,0x13,0x7e,0x50,0x4, +0xac,0x5e,0x2d,0x21,0x22,0x7e,0xa1,0xc, 0x74,0x2, 0xa4,0x22,0x7e,0xb3,0x2, 0xa3, +0x54,0x1, 0x7e,0x70,0x1, 0x22,0x7e,0x24,0x0, 0x12,0x74,0xff,0x2, 0x2, 0xee,0x59, +0x35,0x0, 0xce,0x59,0x25,0x0, 0xcc,0x22,0x49,0x31,0x0, 0xca,0x49,0x21,0x0, 0xc8, +0x22,0x49,0xb1,0x0, 0xce,0x49,0xa1,0x0, 0xcc,0x22,0x7e,0xb3,0x0, 0x54,0xc4,0x54, +0xf, 0x22,0x2e,0x10,0xe, 0x74,0x1, 0xa5,0xf7,0x22,0x7c,0x13,0x2e,0x10,0xc, 0xa5, +0xe7,0x22,0x7e,0x34,0x0, 0x3c,0x7a,0x35,0x35,0x22,0x59,0x34,0x0, 0x2, 0x1b,0x48, +0x20,0x22,0x7e,0x31,0xc, 0x74,0x4, 0xac,0x3b,0x22,0xa, 0x2e,0xa, 0x3f,0x2, 0x0, +0x46,0x51,0xd1,0xae,0x2e,0x30,0xcf,0x3, 0xd8, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x11_20141206_app.h b/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x11_20141206_app.h new file mode 100644 index 00000000..56692dd1 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x11_20141206_app.h @@ -0,0 +1,1339 @@ +0x2, 0x2, 0x76,0x2, 0x47,0x25,0x2, 0xf, 0xfa,0x22,0x22,0x2, 0x0, 0x2a,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x22,0xa2,0xc, 0xe4,0x33,0x22,0x22,0x2, 0x42,0x93,0x74,0x5, +0xac,0xbf,0x9, 0x75,0x0, 0x6d,0x22,0x2, 0x42,0xe, 0x32,0x2, 0x46,0xb9,0x22,0xff, +0xff,0xff,0xff,0x2, 0x4b,0xb2,0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, 0x3f,0x22,0xff, +0xff,0xff,0xff,0x2, 0x47,0x2, 0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff, +0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5, +0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21, +0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d, +0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22, +0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f, +0x12,0x12,0x0, 0x94,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x0, 0x94,0x30, +0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e, +0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xff,0xff,0xff,0xff,0xfe,0xfe, +0xfe,0xfd,0xfc,0xfc,0xfb,0xfb,0xfa,0xfa,0xfa,0xf9,0xf8,0xf7,0xf7,0xf6,0xf5,0xf5, +0xf4,0xf3,0xf2,0xf2,0xf1,0xf0,0xf0,0xef,0xee,0xed,0xec,0xec,0xeb,0xea,0xe9,0xe7, +0xe5,0xe4,0xe2,0xe0,0xe0,0xe0,0xe0,0x1, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, +0x6, 0x6, 0x7, 0x7, 0x7, 0x8, 0x8, 0x9, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0xd, 0xe, +0xf, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x21, +0x23,0x26,0x2a,0x2d,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfb, +0xfa,0xfa,0xfa,0xf9,0xf8,0xf7,0xf7,0xf6,0xf5,0xf5,0xf4,0xf3,0xf2,0xf2,0xf1,0xf0, +0xf0,0xef,0xee,0xed,0xec,0xec,0xeb,0xea,0xe9,0xe7,0xe5,0xe4,0xe2,0xe0,0xe0,0xe0, +0xe0,0x1, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, 0x6, 0x6, 0x7, 0x7, 0x7, 0x8, +0x8, 0x9, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0xd, 0xe, 0xf, 0xf, 0x10,0x11,0x12,0x13, +0x14,0x15,0x16,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x21,0x23,0x26,0x2a,0x2d,0x1a,0x19, +0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf, 0xe, 0xd, 0xc, 0xb, 0x1b,0x1c, +0x1d,0x1e,0x1f,0x20,0x21,0x22,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x23,0x2, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, +0x3, 0x5, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22, +0x22,0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x22, +0x22,0x22,0x1a,0x19,0xc, 0xb, 0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf, +0xe, 0xd, 0x1b,0x1c,0x9, 0xa, 0x1d,0x1e,0x1f,0x20,0x21,0x22,0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x23,0x2, 0x1, 0x0, 0x75,0x84,0x1, 0x7e,0x44,0x8, 0x1f,0xe4,0x7a,0x49, +0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x5, 0x7e,0xc2,0xb, 0x75,0x31,0x0, 0x75,0x32, +0x0, 0x75,0x33,0x0, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x22,0x0, 0xc2,0x7, 0xd2, +0x8, 0x75,0x34,0x0, 0x75,0x35,0x0, 0x75,0x1a,0x0, 0x75,0x36,0x0, 0x75,0x37,0x0, +0xc2,0xc, 0xd2,0x9, 0xc2,0xa, 0x75,0x38,0x0, 0xc2,0xd, 0xc2,0xe, 0x7e,0x4, 0x0, +0xff,0x7e,0x14,0x3, 0x34,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, +0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, +0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x41,0x88,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, +0x8, 0x9, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x1a,0x1b,0x1c,0x1d, +0x1e,0x1f,0x20,0x21,0x22,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22, +0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14, +0x4d,0x22,0x78,0xf5,0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, +0x9, 0x8, 0x7, 0x6, 0x0, 0x18,0x5, 0x10,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x5, 0x7e,0x0, 0x0, 0x24,0x3, 0xd1,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, +0x55,0x0, 0x0, 0x24,0x4, 0x56,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24,0x4, 0x7a,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xfa,0x0, 0x0, 0x1, 0x4, 0xfc,0x0, 0x0, 0x1, 0x4, 0xfd, +0x0, 0x0, 0x1, 0x4, 0xff,0x0, 0x0, 0x1, 0x5, 0x76,0x0, 0x0, 0x1, 0x5, 0x77,0xff, +0x0, 0x1, 0x5, 0x78,0x10,0x0, 0x1, 0x5, 0x79,0x8, 0x0, 0x1, 0x5, 0x5d,0x0, 0x0, +0x10,0x5, 0x5e,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f, +0xff,0x7f,0xff,0x0, 0x0, 0xca,0x3b,0x7e,0xa3,0x0, 0x55,0x7c,0xca,0x5e,0xc0,0xf, +0x7c,0xba,0xc4,0x54,0xf, 0xf5,0x8, 0x4c,0xcc,0x78,0x2f,0x12,0x9, 0x14,0xe5,0x8, +0xbe,0xb0,0x0, 0x38,0x2, 0xe1,0x4b,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x5, 0xac, +0x7f,0x19,0xa3,0x0, 0x77,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xf0,0xd2,0x5, 0xc2,0x3, +0x6d,0x33,0x7a,0x35,0x31,0x75,0x33,0x0, 0xe1,0x4b,0x6c,0xff,0x7e,0x70,0xff,0x74, +0x5, 0xac,0xbf,0x19,0x75,0x2, 0xb3,0x7e,0x34,0x7f,0xff,0x59,0x35,0x2, 0xaf,0x59, +0x35,0x2, 0xb1,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xe2,0x6c,0xff,0x80,0x23,0x7e,0x50, +0x5, 0xac,0x5f,0x7d,0x12,0x2e,0x14,0x0, 0x3f,0xb, 0x18,0x30,0x12,0x2d,0x3b,0x1b, +0x18,0x30,0x2e,0x24,0x0, 0x41,0xb, 0x28,0x30,0x12,0x2d,0x3b,0x1b,0x28,0x30,0xb, +0xf0,0xbc,0xcf,0x38,0xd9,0xe5,0x8, 0xbc,0xbc,0x68,0x5, 0x6d,0x33,0x7a,0x35,0x31, +0x6c,0xff,0x12,0x0, 0x1e,0xbe,0x70,0x2, 0x50,0xf, 0xa, 0x37,0x9, 0xb3,0x0, 0xc1, +0x70,0x7, 0x6d,0x33,0x7a,0x35,0x31,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xe2, +0xe5,0x8, 0x70,0x23,0x6c,0xff,0x80,0x19,0x12,0x0, 0x36,0x59,0x45,0x0, 0x73,0x49, +0x45,0x0, 0x41,0x59,0x45,0x0, 0x75,0x9, 0x75,0x0, 0x43,0x19,0x75,0x0, 0x77,0xb, +0xf0,0xbc,0xcf,0x38,0xe3,0xa1,0xe4,0x6c,0xdd,0x6c,0xff,0x6c,0xee,0x7e,0x70,0x5, +0xac,0x7e,0x9, 0xa3,0x0, 0x77,0x7e,0x50,0x5, 0xac,0x5f,0x9, 0xb2,0x0, 0x43,0xbc, +0xba,0x78,0x18,0xbe,0xb0,0xff,0x68,0x13,0xbe,0xd0,0x2, 0x50,0x15,0x2e,0x34,0x0, +0x73,0x12,0x53,0x27,0x74,0x5, 0x12,0x1, 0x19,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x2, +0x40,0xcb,0xbe,0xe0,0x2, 0x78,0x16,0xbe,0xd0,0x2, 0x50,0x11,0x7e,0x70,0x5, 0xac, +0x7f,0x2e,0x34,0x0, 0x3f,0x12,0x53,0x27,0x74,0x5, 0x12,0x1, 0x19,0xb, 0xd0,0xb, +0xf0,0xbe,0xf0,0x2, 0x78,0xa5,0x6c,0xff,0x7e,0x30,0x5, 0xac,0x3f,0x7d,0x31,0x2e, +0x34,0x2, 0xaf,0x2e,0x14,0x0, 0x73,0x74,0x5, 0x12,0x1, 0x19,0xb, 0xf0,0xbe,0xf0, +0x2, 0x78,0xe5,0x20,0x3, 0x6e,0x6c,0xff,0x80,0x66,0x7c,0xef,0x6c,0xdd,0x80,0x21, +0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xa4,0x0, 0x77,0x7e,0x70,0x5, 0xac,0x7d,0x9, 0xb3, +0x0, 0x43,0xbc,0xba,0x78,0x9, 0xbe,0xa0,0xff,0x68,0x4, 0x7c,0xed,0x80,0x6, 0xb, +0xd0,0xbc,0xcd,0x38,0xdb,0xbe,0xe0,0x2, 0x40,0x2, 0x7c,0xef,0x7e,0x90,0x5, 0xac, +0x9e,0x49,0x34,0x0, 0x41,0xbe,0x34,0x32,0x0, 0x50,0xa, 0x49,0x24,0x0, 0x75,0xbe, +0x24,0x32,0x0, 0x40,0x12,0x49,0x24,0x0, 0x3f,0x74,0x5, 0xac,0xbf,0x59,0x25,0x0, +0x73,0x59,0x35,0x0, 0x75,0x80,0x7, 0x7c,0xbf,0x7c,0x7e,0x12,0x9, 0x4c,0xb, 0xf0, +0xbc,0xcf,0x38,0x96,0x6c,0xff,0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, 0x73,0x12,0x0, +0xe, 0x1e,0x44,0x59,0x45,0x0, 0x3f,0x49,0x45,0x0, 0x75,0x12,0x0, 0xe, 0x1e,0x44, +0x59,0x45,0x0, 0x41,0x9, 0x75,0x0, 0x77,0x19,0x75,0x0, 0x43,0xb, 0xf0,0xbe,0xf0, +0x2, 0x78,0xd3,0xbe,0xc0,0x0, 0x38,0x2, 0xe1,0x28,0x6c,0xff,0x12,0x0, 0x36,0x59, +0x45,0x0, 0x69,0x49,0x45,0x0, 0x41,0x59,0x45,0x0, 0x6b,0x9, 0x75,0x0, 0x43,0x19, +0x75,0x0, 0x6d,0xa, 0x37,0xbe,0x34,0x0, 0x2, 0x50,0xf, 0x49,0x25,0x0, 0x6b,0xbe, +0x24,0x3, 0x20,0x40,0x5, 0x6d,0x22,0x7a,0x25,0x31,0x7e,0x15,0x31,0x4d,0x11,0x78, +0x41,0xbe,0xf0,0x1, 0x78,0x7, 0x7d,0x21,0xb, 0x24,0x7a,0x25,0x31,0xbe,0x34,0x0, +0x2, 0x40,0x2, 0xe1,0x1f,0x6c,0xee,0x7e,0x50,0x5, 0xac,0x5f,0x49,0x42,0x0, 0x69, +0x7e,0xf4,0x0, 0xc, 0xad,0xf3,0x7e,0x10,0x4, 0xac,0x1e,0x2d,0xf, 0x59,0x40,0x5, +0x10,0x49,0x22,0x0, 0x6b,0x59,0x20,0x5, 0x12,0xb, 0xe0,0xbe,0xe0,0x3, 0x78,0xd7, +0xe1,0x1f,0xbe,0x34,0x0, 0x2, 0x50,0x7a,0x74,0x5, 0xac,0xbf,0x49,0x25,0x0, 0x69, +0x7e,0x4, 0x0, 0x3, 0x8d,0x10,0x7d,0x50,0x3e,0x54,0x3e,0x54,0x7e,0x14,0x0, 0xc, +0xad,0x13,0x2d,0x15,0x59,0x21,0x5, 0x10,0x74,0x5, 0xac,0xbf,0x49,0x25,0x0, 0x6b, +0x59,0x21,0x5, 0x12,0x6d,0x22,0x74,0x5, 0xac,0xbf,0x59,0x25,0x0, 0x69,0x6c,0xee, +0x12,0x52,0xe7,0x49,0x2, 0x5, 0x10,0x7e,0x50,0x5, 0xac,0x5f,0x2e,0x24,0x0, 0x69, +0x12,0x52,0xd9,0x78,0xeb,0x12,0x53,0x1d,0x1b,0x28,0x10,0x6d,0x22,0x74,0x5, 0xac, +0xbf,0x59,0x25,0x0, 0x6b,0x6c,0xee,0x12,0x52,0xe7,0x49,0x2, 0x5, 0x12,0x7e,0x50, +0x5, 0xac,0x5f,0x2e,0x24,0x0, 0x6b,0x12,0x52,0xd9,0x78,0xeb,0x12,0x53,0x1d,0x1b, +0x28,0x10,0xbe,0xf0,0x1, 0x78,0x8, 0x7e,0x25,0x31,0xb, 0x24,0x7a,0x25,0x31,0xb, +0xf0,0xbe,0xf0,0x2, 0x68,0x2, 0xc1,0x1c,0xd2,0x0, 0x6c,0xff,0x12,0x0, 0x1e,0xbe, +0x70,0x2, 0x50,0x10,0xa, 0x37,0x9, 0xb3,0x0, 0xc1,0xb4,0x1, 0x7, 0x6d,0x33,0x7a, +0x35,0x31,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xe1,0xda,0x3b,0x22,0x7d,0x14, +0x1a,0x2, 0x1a,0x0, 0x7f,0x17,0x9f,0x10,0x7d,0x1d,0x1a,0x2, 0x1a,0x0, 0x2, 0x0, +0x78,0x1a,0x2, 0x7f,0x17,0x2f,0x10,0x7f,0x71,0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0xbf, +0x70,0x22,0x74,0x5, 0xac,0xbe,0x49,0x35,0x0, 0x41,0x9d,0x32,0x2, 0x3, 0x5, 0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xca,0x3b,0x7f,0x71,0x7c,0xab,0x7e,0x30,0x2, 0x7e,0xe0,0x3, 0x7e,0x94,0x0, 0x87, +0x7a,0x95,0x8, 0x7e,0x24,0x0, 0x8a,0x7a,0x25,0xa, 0x7d,0x62,0x7e,0xb4,0x0, 0x8c, +0x7d,0x8b,0x7d,0x42,0x7d,0xa2,0x7e,0x37,0x1, 0xfd,0x7d,0xd3,0x12,0x4a,0x35,0x7d, +0xc3,0xa, 0x3a,0x12,0x27,0x7a,0x7c,0xb5,0x7c,0xfb,0xbe,0xf0,0x8, 0x50,0x4e,0x1a, +0x13,0x12,0x7, 0x61,0x48,0x2e,0xbe,0x78,0x1, 0xa, 0x48,0x2, 0x80,0x3, 0x7e,0x45, +0xa, 0x12,0x7, 0x4e,0x7d,0x54,0x12,0xb, 0x96,0xbe,0x78,0x1, 0x5e,0x18,0x2, 0x1, +0xe1,0x7f,0x17,0x9e,0x18,0x1, 0x5e,0x12,0x53,0x14,0x7f,0x71,0x2e,0x18,0x1, 0x5e, +0x7f,0x71,0x80,0x6d,0xbe,0x78,0x0, 0x89,0x18,0x9, 0x7d,0x19,0x12,0x7, 0x50,0x7d, +0x59,0x80,0x27,0x7e,0x45,0x8, 0x12,0x7, 0x4e,0x7d,0x54,0x80,0x1d,0x1a,0x1e,0x12, +0x7, 0x61,0x48,0x1b,0xbe,0x78,0x1, 0xc, 0x48,0x9, 0x7d,0x1b,0x12,0x7, 0x50,0x7d, +0x5b,0x80,0x7, 0x7d,0x18,0x12,0x7, 0x50,0x7d,0x58,0x12,0xb, 0x96,0x80,0x32,0xbe, +0x78,0x0, 0x87,0x18,0x9, 0x7d,0x1a,0x12,0x7, 0x50,0x7d,0x5a,0x80,0x7, 0x7d,0x16, +0x12,0x7, 0x50,0x7d,0x56,0x12,0xb, 0x96,0xbe,0x78,0x0, 0x32,0x58,0x13,0x7e,0x58, +0x0, 0x32,0x7f,0x15,0x9f,0x17,0x12,0x53,0x14,0x7f,0x71,0x7f,0x15,0x9f,0x17,0x7f, +0x71,0xbe,0x78,0x0, 0x0, 0x58,0x6, 0x9f,0x11,0x7f,0x71,0x80,0x11,0x7d,0x1d,0x12, +0x7, 0x6b,0x48,0xa, 0x7d,0x3d,0x1a,0x26,0x1a,0x24,0x1b,0x1c,0x7f,0x71,0xbe,0xf0, +0x8, 0x40,0xc, 0x7d,0x1d,0x1a,0x2, 0x1a,0x0, 0x7f,0x17,0x2f,0x10,0x7f,0x71,0x7f, +0x17,0xda,0x3b,0x22,0x12,0xb, 0xbf,0x78,0x32,0x20,0xb, 0x2f,0x6c,0xaa,0x7e,0x44, +0x7f,0xff,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x5, 0x4, 0x59,0x43,0x5, 0x6, 0x6d, +0x33,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x32,0x5, 0xc, 0x7e,0x34,0x1, 0x0, 0x59,0x32, +0x5, 0x0, 0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xd5,0xd2,0xb, 0x22,0xca,0xd8,0xca,0x79, +0x7c,0xe7,0x7c,0xdb,0x74,0x5, 0xac,0xbd,0x49,0x25,0x0, 0x75,0x12,0x7, 0x72,0x7d, +0x3, 0x12,0xb, 0xaa,0x2d,0x3, 0x74,0x5, 0xac,0xbd,0x9, 0xf5,0x0, 0x77,0xbe,0xf0, +0x2, 0x40,0x2, 0x6c,0xff,0x74,0x4, 0xac,0xbf,0x49,0x25,0x5, 0x6, 0x12,0x7, 0x72, +0x7d,0xd3,0x74,0x4, 0xac,0xbf,0x49,0x25,0x5, 0x4, 0x12,0xb, 0xb2,0x2d,0xd3,0x7e, +0x17,0x0, 0x66,0xbd,0x1d,0x38,0x6, 0x7e,0xf4,0x1, 0x0, 0x80,0x19,0x7d,0x30,0x6d, +0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x0, 0x92,0x7d,0xf3,0xbe,0xf4,0x0, 0x10, +0x50,0x4, 0x7e,0xf4,0x0, 0x10,0xbe,0xf4,0x1, 0x0, 0x28,0x4, 0x7e,0xf4,0x1, 0x0, +0x74,0x2, 0xac,0xbf,0x49,0x45,0x5, 0xc, 0xbd,0x4d,0x28,0x6, 0x49,0xf5,0x5, 0x0, +0x80,0x4, 0x59,0xf5,0x5, 0x0, 0x59,0xd5,0x5, 0xc, 0x74,0x5, 0xac,0xbd,0x49,0xe5, +0x0, 0x3f,0x1e,0xe4,0x1e,0xe4,0x1e,0xe4,0x1e,0xe4,0xbe,0xe4,0x0, 0x14,0x28,0x71, +0xbe,0xe4,0x1, 0xcc,0x50,0x6b,0xa, 0xed,0x9, 0x3e,0x0, 0x3b,0xa, 0x33,0x12,0x27, +0x7a,0x7c,0xa5,0xa, 0x33,0x12,0x27,0xb, 0x7c,0x35,0x7e,0x90,0x4, 0xac,0x9a,0x49, +0x34,0x1, 0x5f,0x49,0x24,0x1, 0x5d,0x4c,0x33,0x68,0xa, 0x49,0xd4,0x1, 0x5b,0x49, +0xc4,0x1, 0x59,0x2f,0x16,0xbe,0x30,0x7, 0x68,0xa, 0x49,0x14,0x1, 0x63,0x49,0x4, +0x1, 0x61,0x2f,0x10,0x7e,0x8, 0x1, 0xf4,0x12,0x0, 0xe5,0x7d,0xe3,0xbe,0xe4,0x0, +0xb4,0x28,0x6, 0x7e,0xe4,0x0, 0xb4,0x80,0xe, 0xbe,0xe4,0x0, 0x3c,0x28,0x6, 0x9e, +0xe4,0x0, 0x14,0x80,0x2, 0x6d,0xee,0xbd,0xef,0x50,0x4, 0x9d,0xfe,0x80,0x2, 0x6d, +0xff,0x12,0xb, 0xaa,0x12,0x52,0xf5,0x7e,0x90,0x5, 0xac,0x9d,0x49,0xe4,0x0, 0x73, +0x74,0x5, 0xac,0xbe,0x49,0xc5,0x0, 0x3f,0xbd,0xce,0x28,0xf, 0x7d,0x24,0x2e,0x24, +0x0, 0x73,0x7d,0x3e,0x2d,0x3d,0x1b,0x28,0x30,0x80,0xb, 0x7d,0xc4,0x2e,0xc4,0x0, +0x73,0x9d,0xed,0x1b,0xc8,0xe0,0x49,0x24,0x0, 0x75,0x12,0x7, 0x76,0x12,0x52,0xf5, +0x7e,0x30,0x5, 0xac,0x3d,0x49,0x21,0x0, 0x75,0x7e,0x70,0x5, 0xac,0x7e,0x49,0xe3, +0x0, 0x41,0xbd,0xe2,0x28,0xf, 0x7d,0xc1,0x2e,0xc4,0x0, 0x75,0x7d,0x2, 0x2d,0xd, +0x1b,0xc8,0x0, 0x80,0x9, 0x2e,0x14,0x0, 0x75,0x9d,0x2d,0x1b,0x18,0x20,0x49,0x43, +0x0, 0x3f,0x74,0x4, 0xac,0xbf,0x59,0x45,0x5, 0x4, 0x59,0xe5,0x5, 0x6, 0xda,0x79, +0xda,0xd8,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x47,0x38,0x2b,0x7e,0x54,0x0, 0x47,0x9d, +0x5f,0x6d,0x44,0x7e,0x14,0x1, 0x80,0x12,0xb, 0x88,0xbe,0x28,0x0, 0x18,0x28,0x4, +0x9f,0x22,0x80,0x8, 0x7e,0x18,0x0, 0x18,0x9f,0x12,0x7f,0x21,0xbe,0x28,0x0, 0x0, +0x50,0x6d,0x9f,0x22,0x80,0x69,0xbe,0xf4,0x1, 0xb8,0x40,0x29,0x7d,0x5f,0x9e,0x54, +0x1, 0xb8,0x6d,0x44,0x7e,0x14,0x1, 0x80,0x12,0xb, 0x88,0xbe,0x28,0x0, 0x18,0x40, +0x4, 0x7e,0x28,0x0, 0x17,0xbe,0x28,0x0, 0x18,0x28,0x4, 0x7e,0x28,0x0, 0x18,0x2e, +0x28,0x1, 0xc8,0x80,0x3a,0xbe,0xf4,0x0, 0xff,0x50,0x1d,0x7e,0x54,0x0, 0xff,0x9d, +0x5f,0x12,0xb, 0x82,0x7e,0x18,0x0, 0xf0,0x9f,0x12,0x7f,0x21,0xbe,0x28,0x0, 0x18, +0x50,0x1d,0x7e,0x28,0x0, 0x18,0x80,0x17,0x7d,0x5f,0x9e,0x54,0x0, 0xff,0x12,0xb, +0x82,0x2e,0x28,0x0, 0xf0,0xbe,0x28,0x1, 0xc8,0x28,0x4, 0x7e,0x28,0x1, 0xc8,0x7d, +0x35,0x22,0x6d,0x44,0x7e,0x14,0x1, 0x1f,0x7f,0x12,0x12,0x0, 0x89,0x7f,0x21,0x7c, +0xba,0x7c,0xa9,0xa, 0x48,0x22,0x3e,0x54,0x1a,0x4a,0x1a,0x48,0x7d,0x1d,0x1a,0x2, +0x1a,0x0, 0x9f,0x2, 0x12,0x0, 0xe5,0x7f,0x71,0x22,0x74,0x5, 0xac,0xbd,0x49,0x25, +0x0, 0x73,0x74,0x5, 0xac,0xbe,0x49,0x35,0x0, 0x3f,0x9d,0x32,0x2, 0x3, 0x5, 0x7e, +0xb3,0x0, 0x55,0x54,0xf, 0x22,0xc2,0xf, 0x6c,0x33,0x7e,0x20,0xff,0x7e,0x10,0x5, +0xac,0x13,0x19,0x20,0x0, 0x43,0x7c,0x13,0x2e,0x10,0xc, 0x74,0xff,0xa5,0xf7,0x7e, +0x24,0xff,0xff,0x12,0xd, 0xf4,0x1b,0x38,0x20,0x7c,0x13,0x2e,0x10,0xe, 0xe4,0xa5, +0xf7,0xb, 0x30,0xa5,0xbb,0x2, 0xd3,0x7e,0x23,0x0, 0x55,0x7c,0xb2,0x54,0xf, 0x78, +0x24,0x7c,0xb2,0xc4,0x54,0xf, 0x78,0x2, 0xa1,0x8f,0x6c,0x33,0x7e,0x4, 0x7f,0xff, +0x7e,0x70,0x2, 0xac,0x73,0x59,0x3, 0x0, 0xc5,0x59,0x3, 0x0, 0xc9,0xb, 0x30,0xa5, +0xbb,0x2, 0xe9,0xa1,0x8f,0x7c,0xb2,0xc4,0x54,0xf, 0x78,0x2b,0x6c,0x33,0x80,0x1a, +0x12,0x53,0x0, 0x7e,0x50,0x2, 0xac,0x53,0x12,0x53,0x55,0x59,0x32,0x0, 0xc9,0x19, +0x34,0x0, 0x43,0x7c,0x13,0x12,0x53,0x79,0xb, 0x30,0x12,0xb, 0xbf,0xa, 0x2b,0xa, +0x33,0xbd,0x32,0x48,0xdb,0xa1,0x8f,0x6c,0x33,0x80,0x4f,0x6c,0xaa,0x7e,0x70,0x2, +0xac,0x7a,0x49,0x23,0x0, 0xc9,0x7e,0x70,0x5, 0xac,0x73,0x49,0x33,0x0, 0x41,0x12, +0x4f,0xc4,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x0, 0xc5,0x7e,0x70,0x5, 0xac,0x73, +0x49,0x33,0x0, 0x3f,0x9d,0x32,0x12,0x3, 0x5, 0x2d,0x43,0x12,0xd, 0xf4,0xb, 0x38, +0x20,0xbd,0x24,0x28,0xc, 0x7c,0x13,0x2e,0x10,0xc, 0x7c,0xba,0xa5,0xf7,0x1b,0x38, +0x40,0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xb5,0xb, 0x30,0x12,0xb, 0xbf,0xa, 0x2b,0xa, +0x33,0xbd,0x32,0x48,0xa6,0x6c,0x33,0x80,0x6e,0xd2,0xf, 0x6c,0xaa,0x80,0x2c,0xbc, +0xa3,0x68,0x26,0x7c,0x1a,0x2e,0x10,0xc, 0xa5,0xe7,0x7c,0x2b,0x12,0x53,0x81,0xbc, +0xb2,0x78,0x16,0x7c,0xba,0x12,0xd, 0xf6,0xb, 0x38,0x20,0x12,0xd, 0xf4,0xb, 0x38, +0x30,0xbd,0x32,0x40,0x4, 0xc2,0xf, 0x80,0xd, 0xb, 0xa0,0x12,0xb, 0xbf,0xa, 0x2b, +0xa, 0x3a,0xbd,0x32,0x48,0xc9,0x30,0xf, 0x2c,0x12,0x53,0x81,0x7c,0x5b,0xbe,0x50, +0x2, 0x50,0x22,0x7c,0x15,0x12,0x53,0x79,0x7e,0x70,0x5, 0xac,0x73,0x19,0x53,0x0, +0x43,0x49,0x43,0x0, 0x3f,0x74,0x2, 0xac,0x5b,0x59,0x42,0x0, 0xc5,0x49,0x33,0x0, +0x41,0x59,0x32,0x0, 0xc9,0xb, 0x30,0x12,0xb, 0xbf,0xa, 0x2b,0xa, 0x33,0xbd,0x32, +0x48,0x87,0x6c,0x33,0x80,0x39,0x7e,0x70,0x5, 0xac,0x73,0x9, 0xb3,0x0, 0x43,0xb4, +0xff,0x2b,0x6c,0xaa,0x7c,0x1a,0x2e,0x10,0xe, 0xa5,0xe7,0x70,0x19,0x74,0x1, 0xa5, +0xf7,0x12,0x53,0x0, 0x7e,0x50,0x2, 0xac,0x5a,0x12,0x53,0x55,0x59,0x32,0x0, 0xc9, +0x19,0xa4,0x0, 0x43,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xd7,0xb, 0x30,0x12, +0xb, 0xbf,0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xbc,0x6c,0x33,0x12,0xf, 0xf2,0x70, +0x8, 0x12,0x4e,0xbc,0xac,0x73,0x12,0x4e,0xc4,0xb, 0x30,0xa5,0xbb,0x2, 0xed,0x12, +0x27,0x70,0x6c,0x33,0x12,0xf, 0xf2,0xb4,0x1, 0x21,0xa, 0x33,0x9, 0xb3,0x0, 0xc3, +0xbe,0xb0,0x3, 0x68,0x3, 0xb4,0x1, 0x9, 0xe4,0xa, 0x43,0x19,0xb4,0x0, 0xc1,0x80, +0x3b,0x74,0x2, 0xa, 0x43,0x19,0xb4,0x0, 0xc1,0x80,0x31,0xa, 0x33,0x9, 0xb3,0x0, +0xc3,0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x1c,0x74,0x1, 0xa, 0x43,0x19,0xb4,0x0, 0xc1, +0xbe,0xa0,0x2, 0x50,0x17,0x7c,0x6a,0xb, 0xa0,0x7e,0x70,0x5, 0xac,0x67,0x19,0x33, +0x0, 0x43,0x80,0x8, 0x74,0x3, 0xa, 0x43,0x19,0xb4,0x0, 0xc1,0xb, 0x30,0xbe,0x30, +0x2, 0x40,0xa1,0x22,0x7c,0xb3,0x3e,0xb0,0x24,0x8, 0xa, 0x3b,0x22,0x7e,0x37,0x0, +0x5b,0x4d,0x33,0x78,0x30,0x12,0xb, 0xbf,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x1b,0x0, +0xc1,0xd7,0x7e,0xb3,0x0, 0x5d,0x20,0xe0,0x2, 0xc1,0xd7,0x7e,0x53,0x0, 0x62,0xbe, +0x51,0x1b,0x28,0x2, 0xc1,0xd7,0x75,0x1b,0x0, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x0, +0x5b,0x74,0x1, 0x80,0x73,0xbe,0x34,0x0, 0x1, 0x78,0x19,0x12,0xb, 0xbf,0x78,0x2, +0xc1,0xd7,0x6d,0x22,0x7a,0x27,0x0, 0x5b,0xe4,0x7a,0xb3,0x4, 0x1a,0x75,0x1c,0x22, +0xd2,0x1, 0xc1,0xd7,0xbe,0x34,0x0, 0x3, 0x78,0x7d,0xa9,0xd6,0xeb,0xa9,0xc6,0xac, +0xa9,0xc6,0xec,0xc2,0x96,0xc2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x80,0x4, +0xe4,0x12,0xf, 0xd1,0x12,0xf, 0xeb,0x50,0xf7,0x20,0x93,0xfd,0xa9,0xc0,0xca,0x75, +0xe7,0x0, 0x53,0xe1,0xf7,0x74,0x2, 0x12,0xf, 0xd1,0x12,0x1f,0x5e,0x7a,0x37,0x0, +0x39,0x12,0x0, 0x6, 0xc2,0xa8,0xc2,0x95,0xa9,0xd0,0xca,0x12,0x42,0x46,0x12,0xe, +0xe6,0x6d,0x33,0x7a,0x37,0x0, 0x5b,0xe4,0x7a,0xb3,0x4, 0x1a,0x80,0x29,0xe4,0x12, +0xf, 0xd1,0x20,0x93,0x22,0x7e,0x37,0x0, 0x5b,0x4d,0x33,0x78,0xe, 0xe5,0xcc,0x54, +0x7, 0xbe,0xb0,0x2, 0x68,0x11,0x75,0xcc,0x2, 0x80,0xc, 0xe5,0xcc,0x54,0x7, 0xbe, +0xb0,0x7, 0x68,0x3, 0x75,0xcc,0x7, 0x30,0x1, 0xd4,0x75,0x1c,0x0, 0xc2,0x1, 0x20, +0x93,0x3, 0x75,0xcc,0x50,0x22,0x12,0x0, 0x15,0x70,0x2, 0xe1,0xc4,0x80,0x4, 0xe4, +0x12,0xf, 0xd1,0x12,0xf, 0xeb,0x50,0xf7,0x75,0xe1,0x0, 0x12,0x52,0x81,0x7c,0xba, +0x12,0x53,0x31,0x12,0x52,0x8b,0x75,0xe3,0x0, 0x7c,0xba,0x1e,0xb0,0x12,0x53,0x31, +0x7c,0xb7,0x42,0xe3,0x7c,0xba,0xc4,0x23,0x54,0x3, 0xa, 0x3b,0x12,0x2d,0x3d,0x7c, +0xb7,0x42,0xe3,0x12,0x2d,0x31,0x7c,0xb7,0x42,0xe3,0x75,0xe7,0x0, 0x7c,0xba,0x30, +0xe1,0x5, 0x43,0xe7,0x33,0x80,0x3, 0x43,0xe7,0x11,0x74,0x1, 0x7e,0x73,0x2, 0xa5, +0x5e,0x70,0x7f,0x12,0xf, 0xcb,0x74,0x2, 0x7e,0x73,0x2, 0xa6,0x5e,0x70,0x7f,0x12, +0xf, 0xcb,0x74,0x3, 0xca,0xb8,0x7e,0x63,0x2, 0xa7,0x7c,0x76,0x12,0x40,0x45,0x7c, +0x7b,0x7c,0xb6,0xc4,0x54,0xf, 0x2c,0x7b,0xda,0xb8,0x12,0xf, 0xcb,0x74,0x6, 0x7e, +0x70,0x61,0x12,0xf, 0xcb,0x12,0x4a,0xae,0x74,0x53,0x7e,0x73,0x2, 0xaa,0x5e,0x70, +0xf, 0x12,0xf, 0xcb,0x74,0x54,0xca,0xb8,0x7e,0xb3,0x2, 0xaa,0xc4,0x7c,0x7b,0x5e, +0x70,0xf, 0xda,0xb8,0x12,0xf, 0xcb,0x7e,0xb3,0x2, 0xa4,0xc4,0x23,0x54,0x3, 0xbe, +0xb0,0x1, 0x68,0x3, 0xb4,0x2, 0x15,0x74,0x5b,0x7e,0x73,0x2, 0xab,0x12,0xf, 0xcb, +0x74,0x5c,0x7e,0x73,0x2, 0xac,0x5e,0x70,0x3, 0x12,0xf, 0xcb,0x43,0xe1,0x8, 0x74, +0x2, 0x2, 0x47,0x74,0x22,0x7c,0xb6,0x24,0xb, 0x7c,0x7a,0xf5,0xe4,0x7a,0x71,0xe5, +0x22,0x70,0x5, 0x43,0x87,0x1, 0x80,0xe, 0xb4,0x1, 0x5, 0x43,0x87,0x2, 0x80,0x6, +0xb4,0x2, 0x7, 0x43,0x87,0x2, 0x0, 0x0, 0x0, 0x0, 0x22,0x30,0x9, 0x2, 0xd3,0x22, +0xc3,0x22,0x7c,0x13,0x2e,0x10,0xe, 0xa5,0xe7,0x22,0xe5,0x9a,0x60,0x5, 0xd2,0x9c, +0xa9,0xd6,0xdf,0x22,0xca,0x79,0x7e,0xf3,0x0, 0x55,0x5e,0xf0,0xf, 0xbe,0xf0,0x0, +0x28,0x25,0x6c,0xee,0x80,0x1d,0x1a,0x2e,0x7e,0x34,0x0, 0x5, 0xad,0x32,0x49,0x33, +0x0, 0x3f,0x12,0xa, 0xe3,0x1a,0xe, 0x7e,0x14,0x0, 0x5, 0xad,0x10,0x59,0x31,0x0, +0x3f,0xb, 0xe0,0xbc,0xfe,0x18,0xdf,0xda,0x79,0x22,0x12,0x1f,0x5e,0x12,0x53,0x3a, +0x7a,0x37,0x2, 0xad,0x12,0x43,0x2d,0xe4,0x12,0x28,0x52,0x12,0x47,0x13,0x12,0x4e, +0x9e,0x12,0x40,0x4e,0x12,0x2e,0x1b,0x12,0x2c,0x2c,0x12,0x48,0xf3,0x7e,0xb3,0x4, +0x31,0xb4,0x1, 0x2, 0x80,0x2, 0x21,0x67,0x7e,0xb3,0x2, 0x3d,0x60,0x28,0xb4,0x1, +0xb, 0x12,0x2c,0xdc,0x74,0x3c,0x7a,0xb3,0x4, 0x55,0x80,0x3, 0x12,0x17,0xe2,0x7e, +0x34,0x4, 0x7a,0x7e,0x24,0x0, 0x24,0xe4,0x12,0x3, 0x15,0x7e,0x34,0x4, 0x56,0x7e, +0x24,0x0, 0x24,0x12,0x3, 0x15,0x12,0x2f,0x91,0x12,0x3f,0xfe,0x12,0x2f,0x86,0x44, +0x40,0x12,0x13,0xe2,0x12,0x20,0x18,0x12,0x27,0xfe,0x12,0x21,0x9, 0x12,0x11,0x68, +0x12,0x45,0xd4,0x7e,0xb3,0x2, 0x55,0x30,0xe1,0x7, 0x12,0x27,0x69,0x7a,0xb3,0x0, +0x55,0x12,0x45,0x52,0x12,0xb, 0xbf,0x12,0x3d,0x4, 0x7e,0x34,0x0, 0xcd,0x7e,0x24, +0x1, 0xa9,0x7e,0xb3,0x2, 0x59,0x14,0x12,0x43,0xe8,0x7e,0xb3,0x4, 0x55,0x60,0x5, +0x14,0x7a,0xb3,0x4, 0x55,0x7e,0xb3,0x4, 0x55,0x60,0x9, 0x74,0xa, 0x12,0x2f,0x51, +0x74,0x1e,0x80,0x5, 0x12,0x2f,0x4f,0x74,0xf, 0x7a,0xb3,0x2, 0x37,0x12,0x18,0x52, +0x12,0x1f,0xfa,0x12,0x30,0x1a,0x12,0x0, 0x2e,0x12,0x18,0xfe,0x7e,0xb3,0x2, 0x56, +0x30,0xe0,0x21,0x7e,0xa3,0x0, 0x55,0x7c,0xba,0x54,0xf, 0xbe,0xb0,0x2, 0x40,0x14, +0x7c,0xba,0xc4,0x54,0xf, 0xbe,0xb0,0x2, 0x50,0xa, 0x7c,0xba,0x54,0xf0,0x44,0x1, +0x7a,0xb3,0x0, 0x55,0x12,0x4d,0x60,0x12,0x10,0x4, 0x12,0x23,0xe, 0x12,0x21,0x7b, +0x12,0x46,0x3f,0x12,0x4e,0x50,0x12,0xb, 0xc6,0x12,0x4b,0xd1,0x12,0x4e,0xd7,0x12, +0x4, 0x15,0x12,0x25,0xc6,0x7e,0xb3,0x0, 0x63,0x12,0x3d,0xef,0x12,0xd, 0xfd,0x12, +0x40,0x17,0x12,0x50,0x87,0x1, 0x5d,0x22,0xca,0x3b,0x12,0x0, 0x15,0x70,0x2, 0x61, +0xc7,0x7e,0xe3,0x2, 0x57,0x7c,0xde,0x1e,0xd0,0x1e,0xe0,0x1e,0xe0,0x6c,0xcc,0x7e, +0xb3,0x2, 0x56,0x54,0xfe,0x7a,0xb3,0x2, 0x56,0x7e,0x17,0x0, 0xbf,0x6d,0x0, 0x7e, +0x1f,0x1, 0xa5,0xbf,0x10,0x58,0x2, 0x41,0x9c,0x6c,0xff,0x41,0x92,0xa, 0x2d,0x7d, +0x12,0x1b,0x14,0xa, 0x3f,0xbd,0x31,0xa, 0x4d,0xa, 0x5f,0x18,0x6, 0x2d,0x54,0xf5, +0x8, 0x80,0x4, 0x9d,0x54,0xf5,0x8, 0x12,0x0, 0x46,0x7c,0x75,0x7a,0x73,0x2, 0xb3, +0x7e,0x70,0x4, 0xac,0x7f,0x49,0x53,0x0, 0xcf,0x49,0x43,0x0, 0xcd,0x7e,0x37,0x0, +0xbf,0x7d,0x13,0x1e,0x14,0x6d,0x0, 0xbf,0x20,0x58,0x2, 0x41,0x90,0x7e,0xa3,0x2, +0xb3,0x74,0x4, 0xa4,0x49,0x15,0x1, 0x5f,0x49,0x5, 0x1, 0x5d,0x6d,0x22,0xbf,0x1, +0x58,0x2, 0x41,0x90,0x7e,0x31,0x8, 0x74,0x4, 0xac,0x3b,0x12,0x53,0x70,0x12,0x53, +0xa1,0x4d,0x22,0x78,0x6, 0x9f,0x11,0x7f,0x61,0x80,0xf, 0x74,0x4, 0xac,0xbf,0x49, +0xd5,0x0, 0xcb,0x49,0xc5,0x0, 0xc9,0x12,0x53,0x67,0x7a,0x1f,0x2, 0xaf,0x12,0x53, +0xa1,0xa, 0x3e,0x1b,0x34,0xbd,0x32,0x78,0x6, 0x9f,0x44,0x7f,0x74,0x80,0x17,0x74, +0x4, 0xac,0xbf,0x49,0xf5,0x0, 0xd3,0x49,0xe5,0x0, 0xd1,0x12,0x21,0x74,0x49,0x95, +0x0, 0xd3,0x49,0x85,0x0, 0xd1,0x12,0x13,0xd5,0xbf,0x16,0x48,0x43,0x12,0x13,0xd5, +0xbf,0x17,0x48,0x3c,0x12,0x13,0xd5,0xbf,0x15,0x48,0x35,0x12,0x13,0xd5,0xbf,0x14, +0x48,0x2e,0x12,0x17,0x8a,0x7e,0x1f,0x2, 0xaf,0xbf,0x1, 0x48,0x23,0xa, 0x3c,0x19, +0xf3,0x0, 0x3b,0xb, 0xc0,0x7e,0x30,0x4, 0xac,0x3f,0x2e,0x14,0x0, 0xcd,0x12,0x17, +0x1f,0xb, 0x1c,0x12,0x17,0xf, 0xbe,0xc0,0x4, 0x40,0x5, 0x7e,0xc0,0x4, 0x80,0xc, +0xb, 0xf0,0x7e,0x73,0x2, 0x57,0xbc,0x7f,0x28,0x2, 0x21,0x9d,0x7e,0xb3,0x2, 0x55, +0x20,0xe6,0x2, 0x61,0xa9,0x4c,0xcc,0x68,0x2, 0x61,0xa9,0x6c,0xff,0x61,0xa3,0x12, +0x13,0xca,0x12,0x17,0xa5,0xa, 0x1e,0x12,0x13,0xce,0x12,0x53,0x70,0x2f,0x51,0x4c, +0xff,0x68,0x7, 0x7c,0xbe,0x14,0xbc,0xbf,0x78,0xa, 0x12,0x17,0xae,0x7f,0x15,0x12, +0x17,0xd8,0x7f,0x51,0x7e,0x37,0x0, 0xbf,0x6d,0x22,0xbf,0x51,0x18,0x2, 0x61,0xa1, +0x12,0x13,0xca,0x12,0x17,0xa5,0x12,0x2f,0x65,0x7f,0x1, 0x12,0x25,0x7f,0x12,0x13, +0xd9,0xbf,0x10,0x18,0x2, 0x61,0xa1,0x12,0x13,0xca,0x12,0x17,0xa5,0x7f,0x1, 0x2f, +0x0, 0x2f,0x0, 0x12,0x25,0x7f,0x12,0x13,0xd9,0xbf,0x10,0x48,0x2, 0x61,0xa1,0x4c, +0xff,0x78,0x4, 0x9f,0x66,0x80,0x2a,0x12,0x13,0xca,0x12,0x53,0x67,0xa, 0x1e,0x12, +0x13,0xce,0x49,0xd1,0x0, 0xcb,0x49,0xc1,0x0, 0xc9,0x2f,0x61,0x4c,0xff,0x68,0x7, +0x7c,0xbe,0x14,0xbc,0xbf,0x78,0xa, 0x12,0x17,0xae,0x7f,0x16,0x12,0x17,0xd8,0x7f, +0x61,0x7c,0xbe,0x14,0xbc,0xbf,0x78,0x4, 0x9f,0x77,0x80,0x2c,0x12,0x13,0xca,0x49, +0x31,0x0, 0xd3,0x49,0x21,0x0, 0xd1,0xa, 0x1e,0x12,0x13,0xce,0x49,0xf1,0x0, 0xd3, +0x49,0xe1,0x0, 0xd1,0x2f,0x71,0x4c,0xff,0x68,0x4, 0xbc,0xbf,0x78,0xa, 0x12,0x17, +0xae,0x7f,0x17,0x12,0x17,0xd8,0x7f,0x71,0xbf,0x56,0x48,0x25,0xbf,0x57,0x48,0x21, +0x7e,0xc0,0x2, 0xa, 0x2f,0xa, 0x3d,0x2d,0x32,0x7a,0x73,0x0, 0x3b,0xa, 0x3e,0x2d, +0x32,0x7a,0x73,0x0, 0x3c,0x7e,0xb3,0x2, 0x56,0x44,0x1, 0x7a,0xb3,0x2, 0x56,0x80, +0x8, 0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x41,0xaf,0x7c,0x6c,0x5e,0x60,0xf, 0x7e,0x73, +0x0, 0x55,0x12,0x26,0x7f,0x7c,0x6c,0x5e,0x60,0xf, 0x7e,0x73,0x0, 0x56,0x5e,0x70, +0xf0,0x4c,0x76,0x7a,0x73,0x0, 0x56,0xda,0x3b,0x22,0xa, 0xf, 0xa, 0x1d,0x2d,0x10, +0x3e,0x14,0x3e,0x14,0x22,0x74,0x4, 0xac,0xbf,0x49,0x35,0x0, 0xcf,0x49,0x25,0x0, +0xcd,0x22,0x7a,0xb3,0x2, 0xac,0xca,0x3b,0x12,0x0, 0x15,0x70,0x17,0xf5,0x8, 0x80, +0xc, 0x7e,0x18,0x30,0x39,0x12,0x21,0x74,0x12,0x53,0x5e,0x5, 0x8, 0x12,0x17,0x27, +0x38,0xef,0xe1,0xa, 0x7e,0xb3,0x2, 0xa4,0x30,0xe1,0x5, 0x75,0xd, 0x2, 0x80,0x3, +0x75,0xd, 0x1, 0x7e,0xa3,0x2, 0xac,0x7c,0xba,0x30,0xe7,0xe, 0x7e,0xb3,0x2, 0x55, +0x30,0xe0,0x7, 0x7e,0x35,0x36,0x4d,0x33,0x78,0xe, 0x7e,0xb3,0x2, 0x55,0x20,0xe0, +0x2, 0xa1,0xa7,0x20,0xe2,0x2, 0xa1,0xa7,0x7c,0xba,0x30,0xe7,0x8, 0x7e,0xb3,0x2, +0xf, 0xf5,0xe, 0x80,0x6, 0x7e,0xb3,0x2, 0x10,0xf5,0xe, 0x7e,0x35,0x36,0xbe,0x34, +0x0, 0x0, 0x28,0x5, 0x1b,0x34,0x7a,0x35,0x36,0x7e,0xb3,0x2, 0x55,0x30,0xe5,0xb, +0x80,0x4, 0xe4,0x12,0xf, 0xd1,0x12,0xf, 0xeb,0x50,0xf7,0x53,0xe1,0xfd,0x43,0xe1, +0x2, 0x53,0xe3,0x1f,0x12,0x17,0xb7,0x75,0x9, 0x0, 0xa1,0x50,0x75,0xa, 0x0, 0x80, +0x58,0xe5,0xa, 0x70,0xc, 0x53,0xe7,0xbf,0x7e,0x34,0x2, 0xf7,0x12,0x17,0xbb,0x80, +0x3, 0x43,0xe7,0x40,0x7e,0xb3,0x2, 0xa4,0x54,0x1, 0x6c,0x77,0x12,0x4b,0x87,0x80, +0x4, 0xe4,0x12,0xf, 0xd1,0x12,0xf, 0xeb,0x50,0xf7,0x75,0x8, 0x0, 0x80,0x23,0x12, +0x52,0x92,0x2f,0x31,0x12,0x52,0xb8,0x2e,0x14,0x2, 0xf7,0x12,0x17,0x1f,0x12,0x17, +0xd, 0x7e,0xb3,0x2, 0xa4,0x20,0xe1,0x8, 0x12,0x17,0x1f,0x2f,0x11,0x12,0x17,0xf, +0x5, 0x8, 0x12,0x17,0x27,0x38,0xd8,0x5, 0xa, 0xe5,0xd, 0xbe,0xb1,0xa, 0x38,0xa1, +0x75,0x8, 0x0, 0x80,0x64,0x12,0x17,0xc3,0x30,0xe6,0x2c,0x12,0x17,0x2f,0x49,0x35, +0x2, 0xf9,0x7a,0x37,0x3, 0x87,0x12,0x17,0x9e,0x49,0x25,0x1, 0xa9,0x1e,0x24,0x1e, +0x24,0x9d,0x32,0x7a,0x37,0x3, 0x87,0x7e,0x37,0x1, 0xf3,0xe, 0x34,0xe, 0x34,0xbe, +0x37,0x3, 0x87,0x8, 0x1d,0x80,0x18,0x12,0x17,0x2f,0x49,0x15,0x2, 0xf9,0x49,0x5, +0x2, 0xf7,0x7e,0x37,0x1, 0xf5,0xe, 0x34,0xe, 0x34,0x12,0x1f,0xe3,0x8, 0x3, 0x12, +0x53,0x89,0x12,0x17,0x2f,0x49,0x35,0x2, 0xf9,0x49,0x25,0x2, 0xf7,0x12,0x17,0x8e, +0xbf,0x10,0x8, 0x3, 0x12,0x53,0x5e,0x5, 0x8, 0x12,0x17,0x27,0x38,0x97,0x5, 0x9, +0xe5,0xe, 0xbe,0xb1,0x9, 0x28,0x2, 0x81,0x7c,0x7e,0xb3,0x2, 0xac,0x30,0xe7,0x35, +0x75,0x8, 0x0, 0x80,0x2b,0x12,0x52,0xb8,0x2e,0x14,0x0, 0xcd,0x12,0x17,0x1f,0x2f, +0x11,0x2f,0x11,0x12,0x17,0xf, 0x7e,0xb3,0x2, 0xac,0x30,0xe6,0x11,0x12,0x17,0x9e, +0x49,0x55,0x1, 0xa9,0x6d,0x44,0x12,0x17,0x1f,0x9f,0x12,0x12,0x17,0xf, 0x5, 0x8, +0x12,0x17,0x27,0x38,0xd0,0x53,0xe1,0xfd,0x12,0x52,0x81,0x53,0xe3,0x1f,0x12,0x2d, +0x31,0x7c,0xb7,0x42,0xe3,0xe1,0xa, 0x7e,0xb3,0x2, 0xa4,0x20,0xe0,0x2, 0xc1,0x4d, +0x12,0x17,0xb7,0x75,0x9, 0x0, 0xc1,0x44,0x7e,0xb3,0x2, 0x55,0x30,0xe5,0x5, 0x12, +0xf, 0xeb,0x50,0x1d,0xe5,0x9, 0x70,0x5, 0x53,0xe7,0xbf,0x80,0x3, 0x43,0xe7,0x40, +0x74,0x2, 0x12,0x2c,0x26,0x12,0x53,0xa, 0x12,0x4b,0x87,0x80,0x4, 0xe4,0x12,0xf, +0xd1,0x12,0xf, 0xeb,0x50,0xf7,0xe4,0x12,0x2c,0x26,0x75,0x8, 0x0, 0x80,0x34,0x12, +0x52,0x92,0x2f,0x31,0x12,0x17,0xc3,0x30,0xe7,0x1a,0x7e,0xa3,0x2, 0xa4,0x12,0x17, +0x97,0xbe,0xb0,0x3, 0x40,0xe, 0x7c,0xba,0x30,0xe1,0x9, 0x1e,0x74,0xe, 0x64,0x50, +0x3, 0x4e,0xe0,0x80,0x12,0x53,0x99,0x2e,0x14,0x0, 0xcd,0x12,0x17,0x1f,0x12,0x17, +0xd, 0x5, 0x8, 0x12,0x17,0x27,0x38,0xc7,0x7e,0xb3,0x2, 0x55,0x30,0xe5,0x13,0xe5, +0x9, 0xb4,0x1, 0x5, 0x53,0xe7,0xbf,0x80,0x3, 0x43,0xe7,0x40,0x12,0x53,0xa, 0x12, +0x4b,0x87,0x5, 0x9, 0xe5,0xd, 0xbe,0xb1,0x9, 0x28,0x2, 0xa1,0xb8,0x75,0x8, 0x0, +0xe1,0x3, 0x12,0x17,0xc3,0x30,0xe7,0x5e,0x7e,0xa3,0x2, 0xa4,0x7c,0xba,0x30,0xe1, +0x28,0x12,0x17,0x97,0xbe,0xb0,0x1, 0x38,0x20,0xa, 0xb, 0x7e,0x14,0x0, 0x2, 0x9d, +0x10,0x7e,0x91,0xc, 0x74,0x4, 0xac,0x9b,0x12,0x37,0x36,0x7c,0xb3,0x60,0x5, 0x2f, +0x11,0x14,0x78,0xfb,0x12,0x53,0x91,0x80,0x2d,0x7c,0xba,0x20,0xe1,0x28,0x12,0x17, +0x97,0xbe,0xb0,0x2, 0x38,0x20,0xa, 0x4b,0x7e,0x54,0x0, 0x3, 0x9d,0x54,0x7c,0xab, +0x12,0x53,0x99,0x2e,0x14,0x0, 0xcd,0x12,0x17,0x1f,0x7c,0xba,0x60,0x5, 0x2f,0x11, +0x14,0x78,0xfb,0x12,0x17,0xf, 0x7e,0xb3,0x2, 0xac,0x30,0xe6,0x2b,0x12,0x17,0x9e, +0x49,0x15,0x1, 0xa9,0x6d,0x0, 0x12,0x17,0x2f,0x7d,0x45,0x12,0x37,0x36,0x9f,0x10, +0x12,0x53,0x91,0x12,0x17,0x8e,0x7e,0x37,0x1, 0xf3,0x12,0x18,0xf7,0x58,0x22,0x7e, +0xb3,0x2, 0x55,0x30,0xe0,0x1b,0x80,0x16,0x12,0x17,0x2f,0x12,0x17,0x8e,0x7e,0x37, +0x1, 0xf5,0x12,0x18,0xf7,0x58,0xa, 0x7e,0xb3,0x2, 0x55,0x30,0xe0,0x3, 0x12,0x53, +0x89,0x5, 0x8, 0x12,0x17,0x27,0x28,0x2, 0xc1,0x52,0xda,0x3b,0x22,0x2f,0x13,0x59, +0x31,0x0, 0x2, 0x1b,0x18,0x20,0x22,0x7e,0x30,0x4, 0xac,0x23,0x2e,0x15,0x2d,0x49, +0x31,0x0, 0x2, 0xb, 0x18,0x20,0x22,0x7e,0x73,0x2, 0x59,0xbe,0x71,0x8, 0x22,0x7e, +0xa1,0xc, 0x74,0x4, 0xa4,0x22,0x12,0x37,0x2d,0x12,0x31,0x9f,0x7e,0x23,0x2, 0xc3, +0x12,0x17,0x17,0x7a,0x1f,0x2, 0xc7,0x7e,0x23,0x2, 0xc4,0x12,0x17,0x17,0x7a,0x1f, +0x2, 0xcb,0x7e,0x23,0x2, 0xc5,0x12,0x17,0x17,0x7a,0x1f,0x2, 0xcf,0x7e,0x23,0x2, +0xc6,0x12,0x17,0x17,0x7a,0x1f,0x2, 0xd3,0x7e,0x1f,0x2, 0xc7,0x7e,0xa0,0x1, 0x7e, +0x90,0x4, 0xac,0x9a,0x49,0x14,0x2, 0xc9,0x49,0x4, 0x2, 0xc7,0xbf,0x10,0x58,0x2, +0x7f,0x10,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xe6,0x22,0x74,0x4, 0xac,0xbf,0x49,0x15, +0x0, 0xcf,0x49,0x5, 0x0, 0xcd,0x22,0x7c,0xba,0xc4,0x3, 0x54,0x7, 0x22,0x7e,0xa1, +0xc, 0x74,0x2, 0xa4,0x22,0x49,0x31,0x0, 0xcf,0x49,0x21,0x0, 0xcd,0x22,0x7e,0x73, +0x2, 0x54,0xa, 0x17,0x6d,0x0, 0x22,0x7e,0x34,0x0, 0xcd,0x7e,0x24,0x0, 0x90,0xe4, +0x2, 0x3, 0x15,0xe5,0x8, 0xa, 0x3b,0x9, 0xb3,0x2, 0x7e,0xf5,0xc, 0x7e,0xb3,0x2, +0xac,0x22,0xe5,0xa, 0xa, 0x1b,0x6d,0x0, 0x12,0x0, 0x78,0x7e,0x8, 0x0, 0xa, 0x2, +0x0, 0xe5,0xca,0xf8,0x7e,0xa3,0x2, 0xac,0x7c,0xba,0x23,0x23,0x7c,0xfb,0x5e,0xf0, +0x1, 0x7c,0xba,0x54,0xbf,0x12,0x13,0xe2,0x6c,0xaa,0x80,0x2d,0x7e,0xb3,0x2, 0x3d, +0xb4,0x2, 0x8, 0xa, 0x3a,0x9, 0xb3,0x4, 0x56,0x60,0x1c,0x7e,0x90,0x4, 0xac,0x9a, +0x49,0x34,0x0, 0xcf,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x32,0x1, 0xa9,0x9f,0x11,0x59, +0x34,0x0, 0xcf,0x59,0x24,0x0, 0xcd,0xb, 0xa0,0x12,0x18,0x4b,0x38,0xce,0x7c,0x6f, +0x5e,0x60,0x1, 0x7c,0xb6,0x3, 0x3, 0x54,0xc0,0x7c,0x6b,0x7e,0x73,0x2, 0xac,0x5e, +0x70,0xbf,0x4c,0x76,0x7a,0x73,0x2, 0xac,0xda,0xf8,0x22,0x7e,0xb3,0x2, 0x59,0xbc, +0xba,0x22,0x6c,0xaa,0x80,0x9, 0x12,0x1d,0xd7,0x70,0x2, 0x1, 0xe8,0xb, 0xa0,0x12, +0x18,0x4b,0x38,0xf2,0x7e,0xb3,0x2, 0x55,0x20,0xe1,0x7d,0x6c,0xaa,0x80,0x74,0x12, +0x1d,0xd7,0xb4,0x1, 0x6c,0x7e,0xb3,0x2, 0x57,0xbc,0xba,0x28,0x1f,0x12,0x1d,0xc9, +0x7e,0xb3,0x2, 0x37,0x12,0x1d,0xbe,0xbf,0x7, 0x8, 0x6, 0x7e,0xb3,0x2, 0x35,0x80, +0x1d,0x12,0x18,0xf3,0x58,0x4b,0x7e,0xb3,0x2, 0x36,0x80,0x32,0x12,0x1d,0xc9,0x7e, +0xb3,0x2, 0x3a,0x12,0x1d,0xbe,0xbf,0x7, 0x8, 0x1b,0x7e,0xb3,0x2, 0x38,0xa, 0xeb, +0x7e,0x50,0x2, 0xac,0x5a,0x7d,0xf2,0x2e,0xf4,0x1, 0xa9,0xb, 0xf8,0x20,0x2d,0x2e, +0x1b,0xf8,0x20,0x80,0x1c,0x12,0x18,0xf3,0x58,0x17,0x7e,0xb3,0x2, 0x39,0xa, 0x4b, +0x7e,0x50,0x2, 0xac,0x5a,0x2e,0x24,0x1, 0xa9,0xb, 0x28,0x30,0x9d,0x34,0x1b,0x28, +0x30,0xb, 0xa0,0x12,0x18,0x4b,0x38,0x87,0x2, 0x18,0xeb,0x12,0x2f,0x74,0x74,0x1, +0x2, 0x3, 0x15,0x6d,0x33,0x9d,0x34,0x1a,0x26,0x1a,0x24,0xbf,0x1, 0x22,0xca,0x3b, +0xe4,0x6c,0xdd,0xa, 0x3d,0x19,0xb3,0x0, 0x53,0xb, 0xd0,0xbe,0xd0,0x2, 0x78,0xf3, +0x6c,0xdd,0xa1,0x93,0x12,0x1f,0xae,0x7c,0xbc,0x84,0x7c,0xca,0x9f,0x11,0x7a,0x1f, +0x2, 0xc9,0x7a,0x1f,0x2, 0xcd,0x7a,0x1f,0x2, 0xdd,0x12,0x23,0x1, 0x7a,0x1f,0x2, +0xd1,0x7e,0x73,0x5, 0x79,0xa, 0xf7,0x6d,0xee,0xa, 0x3c,0x6d,0x22,0x7f,0x7, 0x12, +0x0, 0x94,0x7a,0xf, 0x2, 0xb7,0x7f,0x17,0x1b,0x1c,0xbf,0x10,0x68,0xb, 0x12,0x53, +0x4c,0x49,0x25,0x1, 0x61,0x7a,0x1f,0x2, 0xcd,0x7e,0x1f,0x2, 0xb7,0xbe,0x18,0x0, +0x0, 0x68,0xb, 0x12,0x53,0x43,0x49,0x25,0x1, 0x59,0x7a,0x1f,0x2, 0xc9,0x7e,0xb3, +0x2, 0x55,0x20,0xe4,0x2, 0x41,0xbe,0x7e,0x37,0x2, 0x4e,0x12,0x1d,0xa5,0xbe,0xb3, +0x2, 0x59,0x50,0x4, 0x4c,0xcc,0x68,0x41,0x7d,0x23,0xb, 0x24,0x12,0x1e,0x6e,0xbe, +0xb3,0x2, 0x59,0x50,0x5, 0x12,0x1f,0x77,0x68,0x2f,0x7d,0x23,0xb, 0x25,0x12,0x1e, +0x6e,0xbe,0xb3,0x2, 0x59,0x50,0x8, 0x7e,0x53,0x5, 0x79,0xbc,0x5c,0x68,0x1a,0x2e, +0x34,0x0, 0x3, 0x12,0x1d,0xa5,0xbe,0xb3,0x2, 0x59,0x40,0x2, 0x41,0xbe,0x7e,0xb3, +0x5, 0x78,0x14,0xbc,0xbc,0x68,0x2, 0x41,0xbe,0x4c,0xcc,0x78,0x4, 0x6c,0xff,0x80, +0x17,0x12,0x1f,0x77,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xd, 0x12,0x1d,0xae,0x78,0x5, +0x7e,0xf0,0x2, 0x80,0x3, 0x7e,0xf0,0x3, 0xa, 0x1f,0x7d,0x1, 0x2e,0x7, 0x2, 0x4e, +0x12,0x1d,0xb5,0x7c,0xab,0x74,0x4, 0xa4,0x12,0x13,0xd9,0x7a,0x1f,0x2, 0xbf,0x7e, +0x57,0x1, 0xf7,0x1a,0x4a,0x1a,0x48,0xbf,0x21,0x48,0x2, 0x41,0xbe,0x7e,0x1f,0x2, +0xbf,0x9f,0x12,0x12,0x1f,0xa3,0x1a,0x24,0x7e,0x2f,0x2, 0xbf,0xbf,0x12,0x58,0x4, +0x7a,0x1f,0x2, 0xbf,0x7e,0x1f,0x2, 0xbf,0x7d,0x1, 0x2e,0x7, 0x2, 0x50,0x12,0x1d, +0xb5,0xca,0xb8,0x2e,0x17,0x2, 0x52,0x12,0x1f,0x7f,0x7c,0x3b,0xda,0xb8,0x12,0x1f, +0xd6,0x58,0x4, 0x7a,0x1f,0x2, 0xbf,0x4c,0xcc,0x68,0x5, 0x12,0x1d,0xae,0x78,0x38, +0x7e,0xf, 0x2, 0xbf,0x7e,0x1f,0x2, 0xcd,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f, +0x2, 0xcd,0x80,0xa, 0x7d,0x51,0x6d,0x44,0x9f,0x12,0x7a,0x1f,0x2, 0xcd,0x7e,0x1f, +0x2, 0xd9,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xd9,0x80,0x40,0x6d,0x0, +0x9f,0x10,0x7a,0x1f,0x2, 0xd9,0x80,0x36,0x7e,0xf, 0x2, 0xbf,0x7e,0x1f,0x2, 0xc9, +0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xc9,0x80,0xa, 0x7d,0x51,0x6d,0x44, +0x9f,0x12,0x7a,0x1f,0x2, 0xc9,0x7e,0x1f,0x2, 0xd5,0xbf,0x10,0x58,0x8, 0x9f,0x22, +0x7a,0x2f,0x2, 0xd5,0x80,0x8, 0x6d,0x0, 0x9f,0x10,0x7a,0x1f,0x2, 0xd5,0x7e,0x93, +0x5, 0x79,0xa, 0x29,0xa, 0x3c,0x12,0x4a,0x3c,0x1a,0x38,0x7d,0xf3,0x1a,0xe6,0x7f, +0x7, 0x1b,0xc, 0x7e,0x5f,0x2, 0xc9,0x7f,0x15,0x12,0x0, 0x78,0x7f,0x41,0x7e,0x6f, +0x2, 0xd1,0x7f,0x16,0x7f,0x7, 0x12,0x0, 0x78,0x2f,0x41,0x7f,0x7, 0xb, 0xc, 0x7e, +0x7f,0x2, 0xcd,0x7f,0x17,0x12,0x0, 0x78,0x2f,0x14,0x7a,0x1f,0x2, 0xaf,0x7f,0x16, +0x2f,0x15,0x2f,0x17,0x7a,0x1f,0x2, 0xb3,0x7e,0xf, 0x2, 0xb7,0xbe,0x8, 0x0, 0x0, +0x38,0x2, 0x61,0xdd,0xa, 0x39,0x6d,0x22,0x1b,0x1c,0xbf,0x1, 0x40,0x2, 0x61,0xdd, +0xe4,0x7a,0xb3,0x5, 0x76,0x12,0x1f,0x70,0x7e,0x1f,0x2, 0xcd,0x7a,0x1d,0x10,0x7a, +0xd1,0x15,0x7e,0x1f,0x2, 0xd1,0x7e,0xf, 0x2, 0xc9,0x7c,0xbc,0x12,0x47,0xf9,0x7c, +0xeb,0x7e,0xa3,0x5, 0x76,0xbe,0xa0,0x0, 0x28,0x50,0xbe,0xe0,0x0, 0x48,0x4b,0x7e, +0xb3,0x5, 0x78,0xbc,0xbe,0x8, 0x43,0x7e,0xb3,0x5, 0x79,0xa, 0x2b,0x1a,0x3e,0x12, +0x0, 0x46,0x7c,0x95,0x7a,0x91,0x8, 0x1a,0x1e,0x3e,0x14,0x3e,0x14,0x12,0x20,0x7f, +0xa, 0x1a,0x6d,0x0, 0x12,0x0, 0x78,0x74,0x7, 0x7f,0x71,0x1e,0xf4,0xe, 0xe4,0x50, +0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7a,0x7f,0x2, 0xdd,0x1a,0x19,0x12,0x1f, +0xb9,0x2f,0x10,0x12,0x1f,0x9a,0x2f,0x17,0x80,0x3f,0x7e,0x73,0x5, 0x77,0xbe,0x70, +0x0, 0x8, 0x3a,0x7e,0x63,0x5, 0x79,0xa, 0x26,0x1a,0x47,0x7d,0x34,0x12,0x0, 0x46, +0x7c,0x75,0x7a,0x71,0x8, 0x3e,0x44,0x3e,0x44,0x49,0x14,0x1, 0x5f,0x49,0x4, 0x1, +0x5d,0x7f,0x70,0x1e,0xf4,0xe, 0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x1a,0x17,0x12, +0x1f,0xb9,0x9f,0x10,0x12,0x1f,0x9a,0x9f,0x17,0x7a,0x1f,0x2, 0xb3,0x7e,0x1f,0x2, +0xaf,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf, 0x2, 0xb3,0x12,0x0, 0xe5,0x2e, +0x18,0x0, 0x20,0xbe,0x18,0x0, 0x0, 0x58,0x8, 0x6d,0x11,0x7a,0x17,0x2, 0xc7,0x80, +0x4, 0x7a,0x37,0x2, 0xc7,0x12,0x1f,0xae,0xa, 0x2a,0x1b,0x24,0xa, 0x3c,0xbd,0x32, +0x8, 0xc, 0xa, 0x2a,0xa, 0x3c,0x9d,0x32,0x7c,0xb7,0xf5,0x9, 0x80,0x8, 0xa, 0x4a, +0xa, 0x5c,0x2d,0x54,0xf5,0x9, 0x7c,0xbc,0x12,0x4a,0x45,0x7a,0x1f,0x2, 0xb7,0xe5, +0x9, 0x12,0x4a,0x45,0x7a,0x1f,0x2, 0xbb,0x12,0x52,0xa5,0x8, 0x5, 0x12,0x52,0xc9, +0x80,0x3, 0x12,0x1f,0xea,0x12,0x52,0x5c,0x7a,0x1f,0x2, 0xc3,0x7e,0xb3,0x2, 0x55, +0x20,0xe3,0x2, 0xa1,0x7d,0x12,0xb, 0xbf,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0x7d,0x7e, +0x37,0x2, 0x1, 0x1a,0x26,0x1a,0x24,0x7e,0xf, 0x2, 0xc3,0xbf,0x1, 0x48,0xb, 0x7e, +0x37,0x2, 0x3, 0x12,0x18,0xf7,0x18,0x2, 0xa1,0x7d,0x12,0x1d,0xae,0x38,0x12,0xa, +0x7, 0x7e,0x63,0x2, 0x57,0xa, 0x16,0x9d,0x10,0xa, 0x2c,0xbd,0x12,0x8, 0x2, 0xa1, +0x7d,0xbc,0x7c,0xa, 0x3c,0x28,0x14,0x2e,0x37,0x2, 0x46,0x12,0x1d,0xa5,0x12,0x1f, +0x88,0x12,0x1d,0xa5,0xf5,0xa, 0x7a,0xc1,0xb, 0x80,0x1d,0x2e,0x37,0x2, 0x46,0x7e, +0xa3,0x5, 0x78,0xa, 0x2a,0x12,0x1d,0xa3,0x12,0x1f,0x88,0x12,0x1d,0xa3,0xf5,0xa, +0xa, 0x4a,0xa, 0x5c,0x9d,0x54,0xf5,0xb, 0x7e,0x73,0x2, 0x59,0xbe,0x71,0xa, 0x38, +0x2, 0xa1,0x7d,0xbc,0x7f,0x38,0x2, 0xa1,0x7d,0x7e,0xa1,0xa, 0x74,0x4, 0xa4,0x12, +0x17,0x8e,0x12,0x13,0xd5,0x2f,0x10,0x7a,0x1f,0x2, 0xbf,0x7e,0x17,0x1, 0xf7,0x1a, +0x2, 0x1a,0x0, 0xbf,0x1, 0x48,0x2, 0xa1,0x7d,0x7e,0x1f,0x2, 0xbf,0x9f,0x10,0x12, +0x1f,0xa3,0x1a,0x24,0x7e,0xf, 0x2, 0xbf,0xbf,0x10,0x58,0x4, 0x7a,0x1f,0x2, 0xbf, +0x7e,0x1f,0x2, 0xbf,0xe5,0xb, 0xa, 0x1b,0x7d,0x1, 0x2e,0x7, 0x2, 0x4a,0x12,0x1d, +0xb5,0x54,0x7f,0xca,0xb8,0x2e,0x17,0x2, 0x4c,0x12,0x1f,0x7f,0x7c,0x3b,0xda,0xb8, +0x12,0x1f,0xd6,0x58,0x4, 0x7a,0x1f,0x2, 0xbf,0xe5,0xb, 0xa, 0x3b,0x2e,0x37,0x2, +0x4a,0x12,0x1d,0xa5,0x23,0x54,0x1, 0x68,0x7, 0x12,0x1f,0x91,0x2f,0x10,0x80,0x15, +0x12,0x1f,0x91,0xbf,0x10,0x50,0x8, 0x9f,0x0, 0x7a,0xf, 0x2, 0xbb,0x80,0xa, 0x7e, +0xf, 0x2, 0xbf,0x9f,0x10,0x7a,0x1f,0x2, 0xbb,0x12,0x52,0xa5,0x8, 0x5, 0x12,0x52, +0xc9,0x80,0x3, 0x12,0x1f,0xea,0x12,0x52,0x5c,0x7a,0x1f,0x2, 0xc3,0x7e,0x47,0x2, +0xc7,0x74,0x5, 0xac,0xbd,0x59,0x45,0x0, 0x3f,0x7e,0x1f,0x2, 0xc3,0x59,0x35,0x0, +0x41,0xb, 0xd0,0x12,0xb, 0xbf,0xa, 0x2b,0xa, 0x3d,0xbd,0x32,0x58,0x2, 0x21,0x14, +0xda,0x3b,0x22,0x9d,0x32,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0x73, +0x5, 0x79,0xbc,0x7c,0x22,0x7a,0x11,0x82,0x7a,0x1, 0x83,0xe4,0x93,0x22,0xa, 0x4b, +0x7d,0x24,0x7d,0xf4,0x1a,0x24,0x1a,0xe4,0x22,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x13, +0x0, 0xcf,0x49,0x3, 0x0, 0xcd,0x22,0x7e,0x34,0x2, 0x11,0x7c,0xba,0x7d,0x23,0xa, +0x3b,0x2d,0x32,0x7e,0x39,0xb0,0x22,0xca,0x3b,0x7c,0xeb,0x7e,0xd0,0x12,0x7e,0xc0, +0x12,0xe5,0x22,0x70,0xb, 0x7c,0xbe,0x7c,0x7d,0x12,0x1e,0x48,0x7c,0xfb,0x80,0xb, +0x7c,0xbe,0x7c,0x7c,0x12,0x1e,0x48,0x7c,0xfb,0x2c,0xfd,0x6c,0xaa,0xa, 0x3f,0x2e, +0x34,0x2, 0x52,0x12,0x1d,0xa5,0x7c,0x7b,0xa, 0x2a,0x2e,0x24,0x1, 0xee,0x12,0x1e, +0x6e,0xbc,0xb7,0x78,0x17,0xbe,0xa0,0x20,0x50,0xc, 0x7c,0xba,0x7e,0x70,0x20,0x12, +0x28,0x3b,0x7c,0xfb,0x80,0x2, 0x7c,0xfa,0x7c,0xbf,0x80,0x9, 0xb, 0xa0,0xbe,0xa0, +0x24,0x40,0xca,0x7c,0xbe,0xda,0x3b,0x22,0xca,0xf8,0x7c,0xf7,0x7c,0xab,0x7c,0xbf, +0x1e,0xb0,0xa, 0x4b,0xa, 0xa, 0x12,0x1e,0x67,0x7d,0x12,0x3e,0x14,0x12,0x1e,0x67, +0x7d,0x51,0x2d,0x53,0xda,0xf8,0x22,0x7d,0x30,0x7d,0x24,0x2, 0x0, 0x46,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0xca,0x79,0x12,0x1f,0x5e,0x12,0x53,0x3a,0x7a, +0x37,0x2, 0xad,0x12,0x37,0xeb,0x7e,0xb3,0x0, 0xb5,0x12,0x28,0x52,0x12,0x2e,0x1b, +0x12,0x2f,0x6c,0xbe,0xa0,0x1, 0x78,0x6, 0x7e,0x34,0x0, 0xa9,0x80,0x9, 0xbe,0xa0, +0x2, 0x78,0x7, 0x7e,0x34,0x0, 0xaf,0x12,0x2a,0xa6,0x12,0x2b,0xa, 0x75,0x25,0x3, +0x75,0x23,0x40,0x12,0x1f,0x5e,0x7a,0x37,0x0, 0x39,0xe5,0x25,0xb4,0x3, 0x2, 0x80, +0x2, 0xe1,0x4c,0xe5,0x2b,0x60,0xec,0x12,0x2f,0x86,0x12,0x2a,0x53,0x12,0x13,0xe6, +0x6c,0xff,0x80,0x3f,0x7e,0xb3,0x0, 0xb5,0xbe,0xb0,0x1, 0x68,0x3, 0xb4,0x2, 0x26, +0x12,0x1f,0x55,0x7d,0xf3,0x7c,0xbf,0x12,0x1d,0xe7,0x7c,0xab,0x74,0x2, 0xa4,0x59, +0xf5,0x3, 0x89,0xa, 0x3f,0x9, 0xe3,0x0, 0x83,0x7c,0xbf,0x12,0x1d,0xe7,0xa, 0x3b, +0x19,0xe3,0x3, 0xd1,0x80,0xb, 0x12,0x1f,0x55,0x74,0x2, 0xac,0xbf,0x59,0x35,0x3, +0x89,0xb, 0xf0,0x12,0x1f,0x69,0x38,0xbc,0x7e,0xb3,0x0, 0xb5,0xbe,0xb0,0x1, 0x68, +0x3, 0xb4,0x2, 0xc, 0xe5,0x22,0x70,0x5, 0x75,0x22,0x1, 0x80,0x86,0x75,0x22,0x0, +0x75,0x2b,0x0, 0x7e,0xb3,0x4, 0xfe,0x54,0x7f,0x7a,0xb3,0x4, 0xfe,0xe5,0x1a,0x30, +0xe0,0x2, 0xc1,0xb3,0x74,0x1, 0x7a,0xb3,0x0, 0xba,0xc1,0xb3,0xe5,0x25,0x7a,0xb3, +0x4, 0x31,0xda,0x79,0x22,0x74,0x4, 0xac,0xbf,0x49,0x35,0x0, 0xcf,0x22,0x6d,0x33, +0x7a,0x37,0x0, 0x80,0x7e,0x34,0x7, 0xd0,0x22,0x7e,0x73,0x2, 0x59,0xbc,0x7f,0x22, +0x74,0xff,0x7a,0xb3,0x5, 0x77,0x22,0x7e,0xb3,0x5, 0x79,0x14,0xbc,0xbc,0x22,0x7a, +0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x22,0x7c,0xfb,0xa, 0x3c,0x2e,0x37,0x2, 0x48, +0x22,0x7e,0xf, 0x2, 0xbf,0x7e,0x1f,0x2, 0xbb,0x22,0x7a,0x1f,0x2, 0xaf,0x7e,0x1f, +0x2, 0xb3,0x22,0x7a,0x1f,0x2, 0xbf,0x7e,0x37,0x1, 0xf9,0x1a,0x26,0x22,0xa, 0x3d, +0x9, 0xc3,0x0, 0x3b,0x7e,0xa3,0x5, 0x78,0x22,0x1a,0x2, 0x7f,0x17,0x12,0x0, 0x78, +0x7f,0x1, 0x7e,0x1f,0x2, 0xaf,0x22,0x12,0x52,0x53,0x4c,0x99,0x68,0x7, 0xa, 0x19, +0x6d,0x0, 0x2, 0x0, 0xe5,0x22,0x12,0x1f,0xc7,0x7f,0x1, 0x7a,0xf, 0x2, 0xbf,0x7e, +0x37,0x1, 0xfb,0x1a,0x26,0x1a,0x24,0xbf,0x10,0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xbb, +0x7f,0x17,0x12,0x0, 0x78,0x7e,0xf, 0x2, 0xb7,0x22,0x7e,0xa3,0x0, 0x55,0x7c,0xba, +0xc4,0x54,0xf, 0x78,0x12,0x7e,0x1f,0x1, 0xa5,0xbe,0x18,0xc, 0xe4,0x58,0x8, 0x7c, +0xba,0x54,0xf0,0x7a,0xb3,0x0, 0x55,0x22,0x9f,0x11,0x7a,0x1f,0x1, 0xa5,0x6c,0xaa, +0x9f,0x11,0x7e,0x30,0x4, 0xac,0x3a,0x59,0x31,0x1, 0x5f,0x59,0x21,0x1, 0x5d,0x49, +0xf1,0x0, 0xcf,0x49,0xe1,0x0, 0xcd,0xbe,0x78,0x0, 0x32,0x8, 0x3, 0x12,0x20,0x68, +0x49,0xf1,0x1, 0xf, 0x49,0xe1,0x1, 0xd, 0xbe,0x78,0x0, 0x32,0x8, 0x3, 0x12,0x20, +0x68,0x12,0x20,0x7f,0x7e,0x7f,0x1, 0xa5,0xbf,0x17,0x8, 0x4, 0x7a,0x1f,0x1, 0xa5, +0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xb9,0x22,0x7d,0x1, 0x2e,0x4, 0x1, 0x5d,0x49,0x30, +0x0, 0x2, 0xb, 0x8, 0x20,0x2f,0x17,0x59,0x30,0x0, 0x2, 0x1b,0x8, 0x20,0x22,0x49, +0x31,0x1, 0x5f,0x49,0x21,0x1, 0x5d,0x22,0xca,0xf8,0x7c,0xab,0x7f,0x70,0x7f,0x61, +0x6c,0x11,0x6c,0xff,0x7e,0x34,0x2, 0xaf,0x7e,0x24,0x0, 0x40,0xe4,0x12,0x3, 0x15, +0x6c,0x0, 0xa5,0xb8,0x8, 0x6, 0xbc,0xa1,0x28,0x2, 0x6c,0x11,0x7e,0x30,0x4, 0xac, +0x30,0x12,0x20,0x7f,0xbf,0x16,0x8, 0x11,0x7e,0x30,0x4, 0xac,0x31,0x59,0x31,0x2, +0xb1,0x59,0x21,0x2, 0xaf,0xb, 0x10,0x80,0x6, 0xbc,0xa1,0x28,0x2, 0x6c,0x11,0xb, +0x0, 0xa5,0xb8,0x10,0xcd,0xbc,0xa1,0x38,0x2b,0x7e,0x1f,0x1, 0xa5,0xbf,0x17,0x58, +0x23,0x7e,0x34,0x2, 0xaf,0xa, 0x2a,0x12,0x27,0x12,0x12,0x21,0x74,0x49,0x35,0x2, +0xb1,0x49,0x25,0x2, 0xaf,0x7f,0x1, 0x2f,0x0, 0x7e,0x1f,0x2, 0xaf,0xbf,0x1, 0x8, +0x3, 0x7e,0xf0,0x1, 0x7c,0xbf,0xda,0xf8,0x22,0x75,0x8, 0x4, 0x7e,0x18,0x27,0x10, +0x7e,0x8, 0x9c,0x40,0x74,0x8, 0x12,0x20,0x88,0x70,0x10,0x75,0x8, 0x4, 0x7e,0x18, +0x4e,0x20,0x7e,0x8, 0xea,0x60,0x74,0x6, 0x12,0x20,0x88,0x70,0x10,0x75,0x8, 0x4, +0x7e,0x18,0x5, 0xdc,0x7e,0x8, 0x13,0x88,0x74,0x8, 0x12,0x20,0x88,0x60,0x10,0x7e, +0xb3,0x2, 0x55,0x44,0x2, 0x7a,0xb3,0x2, 0x55,0xe4,0x7a,0xb3,0x5, 0x7e,0x22,0x7e, +0xa3,0x2, 0x55,0x7c,0xba,0x30,0xe1,0x1b,0x7e,0xb3,0x5, 0x7e,0x4, 0x7a,0xb3,0x5, +0x7e,0xbe,0xb0,0x14,0x40,0xd, 0xe4,0x7a,0xb3,0x5, 0x7e,0x7c,0xba,0x54,0xfd,0x7a, +0xb3,0x2, 0x55,0x22,0x7e,0xa1,0x8, 0x74,0x4, 0xa4,0x22,0xca,0x3b,0x7e,0xe3,0x0, +0x55,0x5e,0xe0,0xf, 0x74,0x5, 0xac,0xbf,0x7e,0x68,0x7, 0x8, 0x7e,0x78,0x3, 0xe8, +0x6c,0xff,0x41,0xe6,0xa, 0x3f,0x9, 0xd3,0x0, 0x3b,0xa, 0x3d,0x12,0x27,0x7a,0x7c, +0xc5,0xa, 0x3d,0x12,0x27,0xb, 0x7c,0xb5,0xf5,0x8, 0x75,0x9, 0x0, 0x60,0x2, 0x41, +0x47,0x12,0x22,0xf8,0xbe,0xb4,0x1, 0xf4,0x28,0x5, 0x75,0xa, 0x19,0x80,0x3, 0x75, +0xa, 0x14,0x74,0x4, 0xac,0xbd,0x12,0x13,0xd9,0xbe,0x18,0x7, 0x8, 0x58,0xe, 0x49, +0x35,0x0, 0xd3,0x49,0x25,0x0, 0xd1,0xbe,0x18,0x3, 0xe8,0x48,0x4c,0x12,0x23,0x1, +0xbe,0x18,0x27,0x10,0x58,0x25,0x49,0x95,0x1, 0x63,0x49,0x85,0x1, 0x61,0xbe,0x48, +0x7, 0xd0,0x58,0x17,0x12,0x21,0x74,0x49,0x35,0x1, 0x87,0x49,0x25,0x1, 0x85,0x12, +0x17,0xd2,0xbf,0x14,0x8, 0x5, 0xbe,0xe0,0x1, 0x68,0x1e,0xbe,0xb4,0x1, 0x90,0x38, +0x2, 0x41,0xd6,0x12,0x53,0x4c,0x49,0x25,0x1, 0x61,0xbe,0x18,0x3, 0x20,0x48,0x2, +0x41,0xd6,0xbe,0xe0,0x1, 0x68,0x2, 0x41,0xd6,0x12,0x22,0xef,0xbe,0xa4,0x0, 0x1e, +0x40,0x2, 0x41,0xd6,0xbe,0xb4,0x1, 0xa4,0x38,0x8, 0xbe,0xb4,0x1, 0x7c,0x40,0x2, +0x41,0xd6,0x75,0x9, 0x1, 0x41,0xd6,0xe5,0x8, 0xb4,0x7, 0x2, 0x80,0x2, 0x41,0xd6, +0x12,0x22,0xf8,0xbe,0xb4,0x1, 0xf4,0x28,0x5, 0x75,0xa, 0x19,0x80,0x3, 0x75,0xa, +0x14,0x74,0x4, 0xac,0xbd,0x12,0x13,0xd9,0xbf,0x16,0x58,0xc, 0x49,0x35,0x0, 0xcb, +0x49,0x25,0x0, 0xc9,0xbf,0x17,0x48,0x46,0x12,0x23,0x1, 0xbe,0x18,0x27,0x10,0x58, +0x25,0x49,0x95,0x1, 0x5b,0x49,0x85,0x1, 0x59,0xbe,0x48,0x7, 0xd0,0x58,0x17,0x12, +0x21,0x74,0x49,0x35,0x1, 0x77,0x49,0x25,0x1, 0x75,0x12,0x17,0xd2,0xbf,0x14,0x8, +0x5, 0xbe,0xe0,0x1, 0x68,0x18,0xbe,0xb4,0x1, 0x90,0x28,0x2a,0x12,0x53,0x43,0x49, +0x25,0x1, 0x59,0xbe,0x18,0x3, 0x20,0x58,0x1d,0xbe,0xe0,0x1, 0x78,0x18,0x12,0x22, +0xef,0xbe,0xa4,0x1, 0xc2,0x28,0xf, 0xbe,0xb4,0x1, 0xa4,0x38,0x6, 0xbe,0xb4,0x1, +0x7c,0x50,0x3, 0x75,0x9, 0x2, 0xe5,0x9, 0xbe,0xb0,0x0, 0x28,0x7, 0x7c,0xbf,0x7c, +0x7e,0x12,0x4e,0x13,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x21,0x94,0xda,0x3b,0x22,0x74, +0x5, 0xac,0xbf,0x49,0xa5,0x0, 0x3f,0x22,0x74,0x5, 0xac,0xbf,0x49,0xb5,0x0, 0x41, +0x22,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x5f,0x49,0x25,0x1, 0x5d,0x22,0xca,0x3b, +0x12,0xb, 0xbf,0x7c,0xeb,0xbe,0xb0,0x2, 0x50,0x2, 0xa1,0x74,0x6c,0xff,0x80,0x27, +0x7e,0x70,0x5, 0xac,0x7f,0x49,0x23,0x0, 0x3f,0x59,0x23,0x2, 0xaf,0x49,0x23,0x0, +0x41,0x59,0x23,0x2, 0xb1,0x74,0xff,0x19,0xb3,0x2, 0xb3,0xa, 0x2f,0x9, 0x72,0x0, +0x3b,0x19,0x72,0x2, 0xd5,0xb, 0xf0,0x12,0xb, 0xbf,0x12,0x27,0x62,0x48,0xd1,0x6c, +0xff,0xa1,0x9, 0x74,0x5, 0xac,0xbf,0x12,0x25,0x77,0x78,0x2, 0xa1,0x7, 0xa, 0x6f, +0xb, 0x64,0xa1,0x1, 0x74,0x5, 0xac,0xbd,0x12,0x25,0x77,0x78,0x2, 0x81,0xff,0xa, +0x2f,0x9, 0x72,0x2, 0xd5,0xbe,0x73,0x5, 0x79,0x40,0x19,0xbe,0x73,0x5, 0x78,0x50, +0x13,0xa, 0x1d,0x9, 0x61,0x2, 0xd5,0xbe,0x63,0x5, 0x78,0x40,0x7, 0xa, 0x6, 0x12, +0x25,0xab,0x48,0x27,0xa, 0x1d,0x9, 0x61,0x2, 0xd5,0xbe,0x63,0x5, 0x79,0x50,0x2, +0x81,0xff,0xbe,0x63,0x5, 0x78,0x40,0x2, 0x81,0xff,0xbe,0x73,0x5, 0x78,0x50,0x2, +0x81,0xff,0xa, 0x7, 0x12,0x25,0xab,0x48,0x2, 0x81,0xff,0xa, 0x37,0x7e,0x53,0x5, +0x79,0xa, 0x45,0x7d,0x24,0x12,0x0, 0x46,0x7c,0xa5,0x7a,0xa3,0x2, 0xd9,0xa, 0x3d, +0x9, 0xb3,0x2, 0xd5,0xa, 0x3b,0x7d,0x24,0x12,0x0, 0x46,0x7c,0xb5,0x7a,0xb3,0x2, +0xda,0xa, 0x2b,0xa, 0x3a,0x12,0x25,0xbc,0x8, 0x2, 0x81,0xff,0x12,0x25,0x9a,0x9d, +0x32,0x12,0x3, 0x5, 0xbe,0x37,0x1, 0xff,0x48,0x2, 0x81,0xff,0xa, 0x3f,0x9, 0xb3, +0x2, 0xd5,0xa, 0x3d,0x9, 0x73,0x2, 0xd5,0x12,0x49,0x8, 0x7a,0x37,0x2, 0xcf,0xa, +0x3f,0x9, 0x73,0x2, 0xd5,0x7e,0x53,0x5, 0x79,0xa, 0x45,0x12,0x25,0x8a,0x49,0x5, +0x1, 0x5d,0x7a,0xf, 0x2, 0xc3,0xa, 0x5c,0x12,0x25,0x83,0x12,0x23,0x5, 0x2f,0x10, +0x7a,0x1f,0x2, 0xc3,0xa, 0x5d,0x9, 0x75,0x2, 0xd5,0xa, 0x37,0x12,0x25,0x8a,0x49, +0x5, 0x1, 0x5d,0x7a,0xf, 0x2, 0xc7,0xa, 0x5c,0x12,0x25,0x83,0x12,0x23,0x5, 0x2f, +0x10,0x7a,0x1f,0x2, 0xc7,0x74,0x5, 0xac,0xbd,0x49,0x35,0x2, 0xaf,0x6d,0x22,0x7e, +0x6f,0x2, 0xc7,0x7f,0x6, 0x12,0x0, 0x78,0x7f,0x51,0x74,0x5, 0xac,0xbf,0x49,0x35, +0x2, 0xaf,0x6d,0x22,0x7e,0x7f,0x2, 0xc3,0x7f,0x7, 0x12,0x0, 0x78,0x2f,0x15,0x7f, +0x7, 0x2f,0x6, 0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xcb,0x7e,0xa0,0xbb,0x7e,0x70,0x5, +0xac,0x7f,0x19,0xa3,0x2, 0xb3,0x12,0x25,0x9a,0xbd,0x32,0x50,0xa, 0x7a,0x37,0x2, +0xd1,0x7a,0x27,0x2, 0xd3,0x80,0x8, 0x7a,0x27,0x2, 0xd1,0x7a,0x37,0x2, 0xd3,0x7e, +0x37,0x2, 0xcf,0xbe,0x37,0x2, 0xd1,0x38,0x6, 0x7e,0x27,0x2, 0xd1,0x80,0xa, 0xbe, +0x37,0x2, 0xd3,0x40,0xe, 0x7e,0x27,0x2, 0xd3,0x74,0x5, 0xac,0xbf,0x59,0x25,0x2, +0xb1,0x80,0x14,0x7e,0xa0,0xcc,0x7e,0x50,0x5, 0xac,0x5f,0x19,0xa2,0x2, 0xb3,0x74, +0x5, 0xac,0xbf,0x59,0x35,0x2, 0xb1,0x7e,0x1f,0x2, 0xcb,0x74,0x5, 0xac,0xbf,0x59, +0x35,0x2, 0xaf,0x7e,0xa0,0xaa,0x7e,0x70,0x5, 0xac,0x7d,0x19,0xa3,0x2, 0xb3,0xb, +0xd0,0xbc,0xed,0x28,0x2, 0x61,0x64,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x61,0x53,0x12, +0x27,0x69,0x7a,0xb3,0x0, 0x55,0x6c,0xff,0x80,0x56,0x7e,0x30,0x5, 0xac,0x3f,0x9, +0x61,0x2, 0xb3,0xbe,0x60,0xaa,0x68,0x46,0x49,0x21,0x2, 0xaf,0x7e,0x73,0x0, 0x55, +0x7c,0x7, 0x5e,0x0, 0xf, 0x74,0x5, 0xac,0xb0,0x59,0x25,0x0, 0x3f,0x49,0x21,0x2, +0xb1,0x59,0x25,0x0, 0x41,0xa, 0x2f,0x9, 0x12,0x2, 0xd5,0xa, 0x20,0x19,0x12,0x0, +0x3b,0xa5,0xbe,0xbb,0x4, 0x74,0x2, 0x80,0x6, 0xa5,0xbe,0xcc,0x6, 0x74,0x1, 0x19, +0xb2,0x0, 0x53,0x12,0x26,0x78,0x12,0xb, 0xbf,0xbe,0xb0,0x2, 0x50,0x6, 0xb, 0xf0, +0xbc,0xef,0x38,0xa6,0xda,0x3b,0x22,0x9, 0xb5,0x2, 0xb3,0xbe,0xb0,0xaa,0x22,0xa, +0x4f,0xa, 0x5e,0x2d,0x54,0x3e,0x54,0x3e,0x54,0x22,0x7d,0x24,0x12,0x0, 0x46,0x7c, +0xc5,0x74,0x4, 0xac,0xbc,0x49,0x15,0x1, 0x5f,0x22,0x74,0x5, 0xac,0xbd,0x49,0x25, +0x2, 0xb1,0x74,0x5, 0xac,0xbf,0x49,0x35,0x2, 0xb1,0x22,0x7e,0x63,0x5, 0x78,0xa, +0x56,0x7e,0x63,0x5, 0x79,0xa, 0x16,0x2d,0x15,0xbd,0x1, 0x22,0x9d,0x32,0x12,0x3, +0x5, 0xbe,0x34,0x0, 0x1, 0x22,0x12,0x27,0x70,0x78,0x2, 0xc1,0x69,0x6c,0x33,0x12, +0x26,0x6a,0xbe,0x20,0x2, 0x50,0x1d,0xa, 0x32,0x9, 0xb3,0x0, 0xc1,0x70,0x15,0x49, +0x2, 0x0, 0x69,0x7e,0x70,0x4, 0xac,0x72,0x59,0x3, 0x5, 0x6e,0x49,0x2, 0x0, 0x6b, +0x59,0x3, 0x5, 0x70,0xb, 0x30,0xa5,0xbb,0x2, 0xd5,0x6c,0x33,0x80,0x67,0x12,0x26, +0x6a,0xbe,0x20,0x2, 0x50,0x5d,0x7e,0x70,0x4, 0xac,0x72,0x49,0x43,0x5, 0x6e,0x49, +0x2, 0x0, 0x69,0x9d,0x4, 0x49,0x33,0x5, 0x70,0x49,0x42,0x0, 0x6b,0x9d,0x43,0x7d, +0x30,0x12,0x25,0xbe,0x18,0x23,0x7d,0x34,0x12,0x25,0xbe,0x18,0x1c,0x7e,0x70,0x4, +0xac,0x72,0x49,0xf3,0x5, 0x6e,0x7e,0x50,0x5, 0xac,0x53,0x59,0xf2,0x0, 0x69,0x49, +0x33,0x5, 0x70,0x59,0x32,0x0, 0x6b,0x80,0x1a,0x7e,0x70,0x5, 0xac,0x73,0x49,0xf3, +0x0, 0x69,0x7e,0x50,0x4, 0xac,0x52,0x59,0xf2,0x5, 0x6e,0x49,0x33,0x0, 0x6b,0x59, +0x32,0x5, 0x70,0xb, 0x30,0xbc,0xa3,0x38,0x95,0x22,0x7e,0x50,0x5, 0xac,0x53,0x9, +0x22,0x0, 0x6d,0x22,0x7e,0x73,0x0, 0x55,0x7c,0x67,0xb, 0x60,0x5e,0x60,0xf, 0x5e, +0x70,0xf0,0x4c,0x76,0x7a,0x73,0x0, 0x55,0x22,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x7e, +0x2f,0x1, 0x4d,0xbf,0x2, 0x18,0x9, 0x12,0x26,0x74,0x7e,0x34,0x0, 0x50,0x80,0x20, +0x7e,0x2f,0x1, 0x51,0xbf,0x2, 0x18,0x9, 0x12,0x26,0x74,0x7e,0x34,0x0, 0xf0,0x80, +0xf, 0x7e,0x1f,0x1, 0x55,0xbf,0x1, 0x18,0x13,0x12,0x26,0x74,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0x0, 0x3f,0x7e,0x34,0x3, 0x84,0x7a,0x37,0x0, 0x41,0x22,0xca,0xf8,0x7c, +0xab,0x7d,0x42,0x7d,0x13,0x6c,0x11,0x80,0x2b,0xa, 0x31,0x2d,0x34,0x7e,0x39,0x0, +0xa, 0x30,0x12,0x27,0xb, 0x7c,0x5, 0x6c,0xff,0xa, 0x20,0xa, 0x3f,0x12,0x25,0xbc, +0x18,0x9, 0x74,0x1, 0xa, 0x3f,0x2d,0x31,0x7a,0x39,0xb0,0xb, 0xf0,0xbe,0xf0,0x8, +0x78,0xe7,0xb, 0x10,0xbc,0xa1,0x38,0xd1,0xda,0xf8,0x22,0x7e,0x24,0x0, 0x8, 0x2, +0x0, 0x46,0x6d,0x11,0x80,0x3e,0x6d,0x0, 0x80,0x2e,0x7d,0xf0,0x3e,0xf4,0x3e,0xf4, +0x7d,0xef,0x2d,0xe3,0x12,0x27,0x59,0x49,0x5e,0x0, 0x2, 0xb, 0xe8,0x40,0xbf,0x26, +0x58,0x14,0x12,0x27,0x59,0x59,0xde,0x0, 0x2, 0x1b,0xe8,0xc0,0x2d,0xf3,0x59,0x5f, +0x0, 0x6, 0x59,0x4f,0x0, 0x4, 0xb, 0x4, 0x7d,0xf2,0x1b,0xf4,0x9d,0xf1,0xbd,0xf0, +0x38,0xc8,0xb, 0x14,0xbd,0x21,0x38,0xbe,0x22,0x49,0xde,0x0, 0x6, 0x49,0xce,0x0, +0x4, 0x22,0xa, 0x2b,0xa, 0x3f,0xbd,0x32,0x22,0x7e,0xb3,0x0, 0x55,0x54,0xf0,0x22, +0x7e,0xa3,0x0, 0x55,0x5e,0xa0,0xf, 0x22,0xa, 0x3b,0x7e,0x24,0x0, 0x10,0x2, 0x0, +0x46,0x7d,0x2, 0x7d,0xf3,0x6d,0x44,0xd2,0xf, 0x12,0x27,0x78,0xbe,0x24,0x0, 0x8, +0x48,0x2, 0xc2,0xf, 0xbe,0xf4,0x0, 0x20,0x40,0x21,0xbe,0xf4,0x0, 0x4d,0x50,0x1b, +0x7e,0x14,0x0, 0x4d,0x30,0xf, 0xa, 0x9d,0x1f,0x1b,0x14,0x2e,0x14,0x1, 0xc1,0x80, +0x2d,0x9d,0x1f,0x1b,0x14,0x2e,0x14,0x1, 0x67,0x80,0x23,0xbe,0xf4,0x1, 0xb3,0x28, +0x2f,0xbe,0xf4,0x1, 0xe0,0x38,0x29,0x7d,0x1f,0x30,0xf, 0xa, 0x9e,0x14,0x1, 0xb4, +0x2e,0x14,0x1, 0x94,0x80,0x8, 0x9e,0x14,0x1, 0xb4,0x2e,0x14,0x1, 0x3a,0x12,0x1f, +0x7f,0x1a,0x4b,0x7e,0x14,0x0, 0xa, 0x7d,0x34,0xad,0x31,0x12,0x52,0x4c,0x7d,0x43, +0x7d,0x54,0x1a,0x4a,0x1a,0x48,0x12,0x37,0x1d,0x2f,0x12,0x2, 0x20,0x77,0x9f,0x11, +0x7a,0x1f,0x0, 0x57,0x7a,0x1f,0x0, 0xbb,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a,0x49, +0xf3,0x1, 0x5f,0x49,0xe3,0x1, 0x5d,0x7e,0xf, 0x0, 0x57,0x2f,0x7, 0x7a,0xf, 0x0, +0x57,0x49,0x13,0x1, 0x7f,0x49,0x3, 0x1, 0x7d,0x7e,0x1f,0x0, 0xbb,0x2f,0x10,0x7a, +0x1f,0x0, 0xbb,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xd0,0x22,0xa, 0x2b,0x5e,0x24,0x0, +0x1, 0x7c,0xa7,0x1e,0xa0,0xa, 0x3a,0xad,0x32,0x7c,0x5b,0x1e,0x50,0xa, 0x55,0x2d, +0x53,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x68,0x5, 0xbe,0xf0,0x2, 0x78,0x15, +0x74,0x12,0x7a,0xb3,0x2, 0x57,0xe4,0x7a,0xb3,0x2, 0x58,0x7e,0x73,0x2, 0x57,0x7a, +0x73,0x2, 0x59,0x80,0x12,0x74,0x20,0x7a,0xb3,0x2, 0x57,0x74,0x4, 0x7a,0xb3,0x2, +0x58,0x74,0x24,0x7a,0xb3,0x2, 0x59,0x7e,0xb3,0x2, 0xaa,0x44,0xf, 0x7a,0xb3,0x2, +0xaa,0x44,0xf0,0x7a,0xb3,0x2, 0xaa,0x7e,0x73,0x0, 0xa7,0x7a,0x73,0x2, 0xa8,0x7e, +0x73,0x0, 0xa8,0x7a,0x73,0x2, 0xa9,0xbe,0xf0,0x1, 0x68,0x5, 0xbe,0xf0,0x2, 0x78, +0x16,0xe5,0x22,0x70,0x6, 0x7e,0x34,0x2, 0x52,0x80,0x4, 0x7e,0x34,0x2, 0x64,0x7e, +0x24,0x2, 0x5a,0x74,0x12,0x80,0xa, 0x7e,0x34,0x1, 0xee,0x7e,0x24,0x2, 0x5a,0x74, +0x24,0x7e,0x30,0x98,0x12,0x2a,0x1, 0x6c,0x33,0x80,0x11,0x7c,0xb3,0x7e,0x73,0x2, +0x57,0x12,0x28,0x3b,0xa, 0x33,0x19,0xb3,0x2, 0x7e,0xb, 0x30,0x7e,0x23,0x2, 0x57, +0xbc,0x23,0x38,0xe7,0x6c,0x33,0x80,0x18,0xa, 0x3, 0x7e,0x53,0x2, 0x57,0xa, 0x35, +0x2d,0x30,0x7c,0x27,0xa, 0x33,0xa, 0x5, 0x2d,0x3, 0x19,0x20,0x2, 0x7e,0xb, 0x30, +0x7e,0x23,0x2, 0x58,0xbc,0x23,0x38,0xe0,0x7e,0xb3,0x2, 0xa4,0x44,0x1, 0x7a,0xb3, +0x2, 0xa4,0xbe,0xf0,0x1, 0x78,0xd, 0x7e,0xb3,0x2, 0xa4,0x54,0xfd,0x12,0x29,0xe6, +0x44,0x8, 0x80,0x21,0xbe,0xf0,0x2, 0x7e,0xb3,0x2, 0xa4,0x78,0x11,0x54,0xfd,0x7a, +0xb3,0x2, 0xa4,0x7e,0xb3,0x2, 0xac,0x54,0xfb,0x12,0x29,0xf0,0x80,0x7, 0x44,0x2, +0x12,0x29,0xe6,0x44,0x18,0x7a,0xb3,0x2, 0xac,0x7e,0xb3,0x2, 0xa4,0x54,0xfb,0x7a, +0xb3,0x2, 0xa4,0x44,0x18,0x7a,0xb3,0x2, 0xa4,0x7e,0x63,0x0, 0xb6,0x5e,0x60,0x7, +0x7c,0xb6,0xc4,0x23,0x54,0xe0,0x7c,0x6b,0x7e,0x73,0x2, 0xa4,0x12,0x29,0xf7,0x7c, +0xb7,0xc4,0x3, 0x54,0x7, 0xbe,0xb0,0x0, 0x28,0x10,0x7c,0xb7,0x30,0xe1,0xb, 0x7c, +0x67,0x9e,0x60,0x20,0x5e,0x60,0xe0,0x12,0x29,0xf7,0x7e,0x63,0x0, 0xb7,0x5e,0x60, +0x7f,0x7e,0x73,0x2, 0xa5,0x5e,0x70,0x80,0x4c,0x76,0x7a,0x73,0x2, 0xa5,0x7e,0x63, +0x0, 0xb8,0x5e,0x60,0x7f,0x7e,0x73,0x2, 0xa6,0x5e,0x70,0x80,0x4c,0x76,0x7a,0x73, +0x2, 0xa6,0x7e,0xb3,0x2, 0xa7,0x54,0xf0,0x44,0x1, 0x7a,0xb3,0x2, 0xa7,0x54,0xf, +0x44,0x20,0x7a,0xb3,0x2, 0xa7,0x12,0x2d,0x3, 0x7a,0xb3,0x2, 0xac,0x54,0x7f,0x7a, +0xb3,0x2, 0xac,0xda,0xf8,0x22,0x7a,0xb3,0x2, 0xa4,0x7e,0xb3,0x2, 0xac,0x44,0x4, +0x7a,0xb3,0x2, 0xac,0x54,0xc7,0x22,0x5e,0x70,0x1f,0x4c,0x76,0x7a,0x73,0x2, 0xa4, +0x22,0x7c,0x23,0x7c,0x3b,0xa5,0xba,0x97,0x24,0xbe,0x30,0x1c,0x50,0x4, 0x7c,0x23, +0x80,0x3, 0x7e,0x20,0x1c,0x6c,0xaa,0x80,0xf, 0x12,0x2a,0x3c,0xa, 0x4b,0x2e,0x44, +0x2, 0xe9,0x12,0x2a,0x42,0x12,0x2a,0x4b,0xbc,0x2a,0x38,0xed,0x22,0x6c,0xaa,0x80, +0x6, 0x12,0x2a,0x3c,0x12,0x2a,0x4b,0xbc,0x3a,0x38,0xf6,0x22,0xa, 0xa, 0x7d,0x40, +0x2d,0x43,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x22,0x2d,0x2, 0x7a,0x9, 0xb0, +0xb, 0xa0,0x22,0x7e,0xa3,0x0, 0xb5,0xbe,0xa0,0x1, 0x68,0x5, 0xbe,0xa0,0x2, 0x78, +0x3, 0x75,0x1a,0x1, 0xe5,0x1a,0x30,0xe0,0x25,0x7c,0xba,0x12,0x28,0x52,0x12,0x2f, +0x6c,0xbe,0xa0,0x1, 0x78,0x6, 0x7e,0x34,0x0, 0xa9,0x80,0x9, 0xbe,0xa0,0x2, 0x78, +0x7, 0x7e,0x34,0x0, 0xaf,0x12,0x2a,0xa6,0x12,0x2b,0xa, 0x53,0x1a,0xfc,0xe5,0x1a, +0x30,0xe2,0x12,0x53,0xca,0xe1,0x7e,0x73,0x0, 0xb9,0xa, 0x37,0x3e,0x34,0x7c,0xb7, +0x42,0xca,0x53,0x1a,0xfb,0x22,0x7d,0x23,0xe5,0x22,0x70,0x27,0x74,0x7, 0x7e,0x70, +0x4, 0x12,0x2a,0xfc,0x7e,0x70,0x2, 0x12,0xf, 0xcb,0x74,0x56,0x7e,0x29,0x70,0x12, +0xf, 0xcb,0x74,0x57,0x9, 0x72,0x0, 0x1, 0x12,0xf, 0xcb,0x74,0x58,0x9, 0x72,0x0, +0x2, 0x80,0x26,0x74,0x7, 0x7e,0x70,0x2, 0x12,0x2a,0xfc,0x7e,0x70,0x4, 0x12,0xf, +0xcb,0x74,0x56,0x9, 0x72,0x0, 0x3, 0x12,0xf, 0xcb,0x74,0x57,0x9, 0x72,0x0, 0x4, +0x12,0xf, 0xcb,0x74,0x58,0x9, 0x72,0x0, 0x5, 0x2, 0xf, 0xcb,0x12,0xf, 0xcb,0x74, +0x8, 0x7e,0x70,0xc, 0x12,0xf, 0xcb,0x74,0x9, 0x22,0xca,0x3b,0xc2,0xf, 0x7e,0xb3, +0x2, 0xac,0x54,0x7f,0x7a,0xb3,0x2, 0xac,0x7e,0x67,0x2, 0xad,0x7e,0xb3,0x2, 0x55, +0x30,0xe5,0x10,0x80,0x4, 0xe4,0x12,0xf, 0xd1,0x12,0xf, 0xeb,0x50,0xf7,0xd2,0xf, +0x12,0x2f,0x5a,0x53,0xe3,0x1f,0x7e,0x34,0x2, 0xaf,0x7e,0x24,0x0, 0x24,0x74,0xff, +0x12,0x3, 0x15,0x6c,0xee,0x61,0xd2,0x6c,0xff,0x80,0xa, 0xe4,0xa, 0x3f,0x2d,0x36, +0x7a,0x39,0xb0,0xb, 0xf0,0x12,0x1f,0x69,0x38,0xf1,0x7e,0x34,0x5, 0x28,0x7e,0x24, +0x0, 0x24,0x12,0x2d,0xa, 0x44,0x4, 0x7a,0xb3,0x2, 0x55,0x6c,0xff,0xa, 0x2f,0x7e, +0x34,0x0, 0x7, 0x9d,0x32,0x7a,0x73,0x5, 0x4c,0x12,0x2d,0x5d,0x12,0x13,0xe6,0x12, +0x2d,0x99,0xb, 0xf0,0xbe,0xf0,0x8, 0x78,0xe4,0x12,0x2d,0x13,0x6c,0xff,0x80,0x3b, +0xa, 0x2f,0x9, 0x62,0x2, 0xaf,0xa, 0x1f,0x2d,0x16,0x7e,0x19,0x70,0xbc,0x67,0x28, +0x28,0x19,0x72,0x2, 0xaf,0x7e,0xb3,0x2, 0x55,0x20,0xe0,0x7, 0x7e,0xb3,0x2, 0xa4, +0x30,0xe1,0x5, 0x12,0x13,0xd5,0x80,0x5, 0x12,0x13,0xd5,0x2f,0x11,0x2f,0x11,0x2f, +0x11,0x74,0x2, 0xac,0xbf,0x59,0x35,0x1, 0xa9,0xb, 0xf0,0x12,0x1f,0x69,0x38,0xc0, +0xb, 0xe0,0x7e,0x73,0x2, 0xe, 0xbc,0x7e,0x28,0x2, 0x61,0x47,0x6c,0xff,0x80,0xd, +0xa, 0x3f,0x9, 0x53,0x2, 0xaf,0x2d,0x36,0x7a,0x39,0x50,0xb, 0xf0,0x12,0x1f,0x69, +0x38,0xee,0x74,0x3, 0x12,0x2c,0x26,0x12,0x2d,0x44,0x12,0x2f,0x86,0x30,0xf, 0x15, +0x7e,0xb3,0x2, 0x55,0x44,0x20,0x7a,0xb3,0x2, 0x55,0x80,0x4, 0xe4,0x12,0xf, 0xd1, +0x12,0xf, 0xeb,0x50,0xf7,0x53,0xe3,0x1f,0x7e,0xb3,0x2, 0xa4,0x12,0x2d,0x33,0x7c, +0xb7,0x42,0xe3,0xda,0x3b,0x22,0x7e,0x37,0x2, 0x7, 0x89,0x34,0x12,0xe, 0xe6,0x12, +0x2b,0xa, 0x12,0x2d,0x1e,0x2, 0x2c,0x38,0xca,0x79,0x12,0x2d,0x3, 0x7a,0xb3,0x2, +0xac,0x7e,0x34,0x2, 0xaf,0x7e,0x24,0x0, 0x48,0x12,0x2d,0xa, 0x30,0xe0,0x3f,0x44, +0x4, 0x7a,0xb3,0x2, 0x55,0x6c,0xee,0x80,0x28,0x12,0x13,0xe6,0x6c,0xff,0x80,0x1a, +0x7e,0x50,0x2, 0xac,0x5f,0x49,0xf2,0x2, 0xaf,0x6d,0xee,0x12,0x17,0x8a,0xbf,0x7, +0x8, 0x6, 0x7d,0x31,0x59,0x32,0x2, 0xaf,0xb, 0xf0,0x12,0x1f,0x69,0x38,0xe1,0xb, +0xe0,0x7e,0x73,0x2, 0xd, 0xbc,0x7e,0x38,0xd0,0x12,0x2d,0x13,0x80,0x31,0x7e,0xe0, +0x1, 0x12,0x13,0xe6,0x6c,0xff,0x80,0x1b,0x12,0x13,0xd5,0x12,0x2f,0x65,0x7d,0x13, +0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x2, 0xaf,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28, +0x30,0xb, 0xf0,0x12,0x1f,0x69,0x38,0xe0,0xb, 0xe0,0xbe,0xe0,0x4, 0x28,0xd2,0x6c, +0xee,0x80,0xe, 0x74,0x2, 0xac,0xbe,0x49,0x35,0x2, 0xaf,0x59,0x35,0x1, 0xa9,0xb, +0xe0,0x7e,0x73,0x2, 0x59,0xbc,0x7e,0x38,0xea,0xda,0x79,0x22,0xca,0x79,0x6d,0x77, +0x7a,0x77,0x0, 0x80,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x0, 0x39,0x12,0x2d,0x3, 0x7a, +0xb3,0x2, 0xac,0x12,0x2b,0xa, 0x12,0x2c,0x38,0x7a,0x77,0x0, 0x80,0x12,0x2f,0x7d, +0xda,0x79,0x22,0x7e,0xb3,0x2, 0xac,0x54,0xbf,0x22,0xe4,0x12,0x3, 0x15,0x7e,0xb3, +0x2, 0x55,0x22,0x7e,0xb3,0x2, 0x55,0x54,0xfb,0x7a,0xb3,0x2, 0x55,0x22,0x74,0x20, +0x7a,0xb3,0x4, 0x16,0x74,0xe, 0x7a,0xb3,0x4, 0x17,0x12,0x2f,0x74,0xe4,0x2, 0x3, +0x15,0x7c,0xba,0xc4,0x3, 0x54,0x7, 0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x22,0x7e,0x27,0x2, 0xad,0x6c,0x66,0x80,0x8, 0x12,0x2d,0x8b,0x12, +0xf, 0xc5,0xb, 0x60,0x7e,0x73,0x2, 0x59,0xbc,0x76,0x38,0xf0,0x22,0x7e,0xb3,0x2, +0xac,0x20,0xe7,0x26,0x7e,0x27,0x2, 0xad,0x6c,0x66,0x80,0x16,0x12,0x2d,0x8b,0x12, +0x2e,0x12,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x79,0x4c,0xa7,0x12,0xf, 0xc5, +0xb, 0x60,0x7e,0x73,0x2, 0x59,0xbc,0x76,0x38,0xe2,0x22,0xa, 0x16,0x9, 0x71,0x2, +0x7e,0xa, 0x17,0x2d,0x12,0x7e,0x19,0xa0,0x22,0x12,0x0, 0x15,0x60,0x73,0x7e,0xb3, +0x2, 0xac,0x20,0xe7,0x6c,0x7e,0xb3,0x2, 0x55,0x30,0xe0,0x2, 0x80,0x7, 0x7e,0xb3, +0x2, 0xa4,0x30,0xe1,0x6, 0x7e,0x34,0xe, 0xb0,0x80,0x4, 0x7e,0x34,0x7, 0x58,0x7e, +0x27,0x2, 0xad,0x6c,0xaa,0x80,0x42,0xa, 0x1a,0x9, 0x31,0x2, 0x7e,0x7e,0x10,0x4, +0xac,0x13,0x49,0xd0,0x0, 0xcf,0x49,0xc0,0x0, 0xcd,0x7d,0xf3,0x6d,0xee,0xbf,0x67, +0x58,0x1a,0x12,0x2e,0x12,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0xa, 0x3, +0x2e,0x4, 0x5, 0x28,0x7e,0x9, 0x20,0x4c,0x2b,0x7a,0x9, 0x20,0xa, 0x3, 0x9, 0x20, +0x5, 0x28,0x2d,0x2, 0x7a,0x9, 0x20,0xb, 0xa0,0x7e,0x23,0x2, 0x59,0xbc,0x2a,0x38, +0xb6,0x22,0x7e,0xb3,0x5, 0x4c,0x7e,0x44,0x0, 0x1, 0x22,0x12,0x2f,0x4f,0x74,0xf, +0x7a,0xb3,0x2, 0x37,0x74,0x5, 0x7a,0xb3,0x2, 0x39,0x7a,0xb3,0x2, 0x38,0x74,0xf, +0x7a,0xb3,0x2, 0x3a,0x7e,0x34,0x0, 0x32,0x7a,0x37,0x1, 0xf1,0x7e,0xb3,0x2, 0x55, +0x44,0x1, 0x7a,0xb3,0x2, 0x55,0x74,0x2, 0x7a,0xb3,0x2, 0xd, 0x7e,0xb3,0x2, 0x55, +0x30,0xe0,0x10,0x74,0x2, 0x7a,0xb3,0x2, 0xe, 0x74,0x8, 0x7a,0xb3,0x2, 0xf, 0x74, +0x2, 0x80,0xa, 0x74,0x1, 0x7a,0xb3,0x2, 0xe, 0x7a,0xb3,0x2, 0xf, 0x7a,0xb3,0x2, +0x10,0x74,0x14,0x7a,0xb3,0x2, 0x54,0x7e,0x34,0x2a,0xf8,0x7a,0x37,0x1, 0xf5,0x7e, +0xb3,0x2, 0x55,0x54,0xfd,0x7a,0xb3,0x2, 0x55,0x7e,0x34,0xfc,0x18,0x7a,0x37,0x1, +0xf3,0x12,0x2d,0x13,0x7e,0x34,0x0, 0x32,0x7a,0x37,0x1, 0xf7,0x7e,0x34,0x3, 0xe8, +0x7a,0x37,0x1, 0xf9,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x1, 0xfb,0x7e,0xb3,0x2, 0x55, +0x44,0x8, 0x7a,0xb3,0x2, 0x55,0x7e,0x34,0x2, 0x32,0x7a,0x37,0x2, 0x46,0x7e,0x34, +0x2, 0x42,0x7a,0x37,0x2, 0x48,0x7e,0x34,0x2, 0x12,0x7a,0x37,0x2, 0x4a,0x7e,0x34, +0x2, 0x22,0x7a,0x37,0x2, 0x4c,0x7e,0xb3,0x2, 0x55,0x54,0xef,0x7a,0xb3,0x2, 0x55, +0x7e,0x34,0x1, 0x90,0x7a,0x37,0x1, 0xfd,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x1, 0xff, +0x7e,0x34,0x0, 0x64,0x7a,0x37,0x2, 0x1, 0x7e,0x34,0x2, 0xbc,0x7a,0x37,0x2, 0x3, +0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2, 0x3b,0x12,0x2f,0x5a,0x7e,0x34,0x0, 0xa, 0x7a, +0x37,0x2, 0x7, 0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x2, 0x5, 0x7e,0x34,0x27,0x81,0x7a, +0x37,0x2, 0x9, 0x7e,0x34,0x8, 0x0, 0x7a,0x37,0x2, 0xb, 0xe4,0x7a,0xb3,0x2, 0x3d, +0x7e,0x34,0x0, 0x3b,0x7e,0x24,0x0, 0xcd,0x2, 0x2f,0x3b,0x7a,0x35,0x2f,0x7a,0x25, +0x2d,0xe4,0x7a,0xb3,0x4, 0xcd,0x7a,0xb3,0x4, 0x9e,0x7a,0xb3,0x4, 0xcc,0x22,0x74, +0x5, 0x7a,0xb3,0x2, 0x36,0x7a,0xb3,0x2, 0x35,0x22,0x7e,0xb3,0x2, 0x55,0x54,0xdf, +0x7a,0xb3,0x2, 0x55,0x22,0x7e,0x8, 0x0, 0x4, 0x2, 0x0, 0xe5,0x12,0xe, 0xe6,0x7e, +0xa3,0x0, 0xb5,0x22,0x7e,0x34,0x2, 0x11,0x7e,0x24,0x0, 0x24,0x22,0x7e,0x34,0x0, +0x64,0x7a,0x37,0x0, 0x39,0x22,0x7e,0xb3,0x2, 0xac,0x44,0x80,0x7a,0xb3,0x2, 0xac, +0x22,0x6d,0x33,0x7a,0x37,0x0, 0x80,0x12,0x2f,0x7d,0x2, 0x2f,0x9d,0x7e,0x34,0x3, +0xf5,0x7e,0xb3,0x4, 0x54,0x30,0xe0,0x71,0x54,0xfe,0x7a,0xb3,0x4, 0x54,0x9, 0x53, +0x0, 0x5, 0x7a,0x53,0x0, 0x68,0xa, 0x25,0x12,0x4b,0x7e,0x7a,0x27,0x0, 0x66,0x9, +0x53,0x0, 0x25,0xa, 0x25,0x7a,0x27,0x0, 0x5b,0x9, 0x53,0x0, 0x6, 0x7a,0x53,0x0, +0x5d,0x9, 0x53,0x0, 0x8, 0x7a,0x53,0x0, 0x5f,0xbe,0x50,0xf, 0x40,0x6, 0x74,0xe, +0x19,0xb3,0x0, 0x8, 0x9, 0x53,0x0, 0x8, 0xa, 0x25,0x2e,0x24,0x3, 0x25,0x12,0x1e, +0x6e,0x7a,0xb3,0x0, 0x5e,0x9, 0x53,0x0, 0x9, 0x7a,0x53,0x0, 0x61,0x7a,0x53,0x0, +0x60,0x9, 0x53,0x0, 0x7, 0x7a,0x53,0x0, 0x62,0x9, 0x53,0x0, 0x24,0x7a,0x53,0x0, +0x63,0x9, 0x73,0x0, 0x2e,0x7a,0x73,0x0, 0xb5,0x22,0x12,0x33,0x11,0x30,0xe, 0x36, +0x7e,0xf, 0x0, 0xbb,0x7e,0x1f,0x0, 0x57,0x2f,0x10,0x7e,0x8, 0x0, 0x64,0x12,0x0, +0xe5,0xbe,0x18,0x5, 0xdc,0x8, 0x8, 0x12,0x37,0x25,0xbe,0xb0,0x2, 0x40,0x6, 0xbe, +0x18,0x9, 0xc4,0x8, 0x11,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x1, 0xff,0x7e,0x34,0x0, +0xa, 0x7a,0x35,0x1e,0x80,0x1a,0x7e,0x35,0x1e,0x4d,0x33,0x68,0xb, 0x1b,0x34,0x7a, +0x35,0x1e,0x7e,0x34,0x1, 0x2c,0x80,0x4, 0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x1, 0xff, +0x12,0x32,0x38,0x12,0x36,0x32,0x2, 0x30,0x79,0xca,0xd8,0xca,0x79,0x6c,0xff,0x7e, +0x35,0x2f,0x9, 0x73,0x0, 0x1a,0x5e,0x70,0xf, 0x7e,0x63,0x4, 0xaf,0xbe,0x60,0x1, +0x28,0x4d,0xbe,0x73,0x4, 0xaf,0x50,0x47,0x30,0xe, 0x44,0x6c,0xee,0x80,0x35,0x7e, +0x70,0x7, 0xac,0x7e,0x9, 0xb3,0x4, 0xb6,0x30,0xe1,0x27,0x30,0xe0,0x4, 0xb, 0xf0, +0x80,0x20,0xbe,0xf0,0x0, 0x28,0x1b,0x9, 0xd3,0x4, 0xb5,0x7c,0xbd,0x12,0x30,0xe4, +0x60,0x10,0x7c,0xbd,0x7e,0x70,0x6, 0x12,0x31,0x40,0x12,0x35,0xdc,0xac,0x5e,0x12, +0x35,0xe5,0xb, 0xe0,0x7e,0x73,0x4, 0xaf,0xbc,0x7e,0x38,0xc3,0x12,0x35,0xf5,0xda, +0x79,0xda,0xd8,0x22,0x12,0x37,0x2d,0x12,0x31,0x9f,0x7e,0xb3,0x2, 0xc4,0x12,0x31, +0x16,0xa, 0x3b,0x4d,0x33,0x78,0x1a,0x7e,0xb3,0x2, 0xc5,0x12,0x31,0x16,0xa, 0x3b, +0x4d,0x33,0x78,0xd, 0x7e,0xb3,0x2, 0xc6,0x12,0x31,0x16,0xa, 0x3b,0x4d,0x33,0x68, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7c,0xab,0x6c,0x77,0x80,0x11,0xa, 0x27,0x2e,0x25, +0x2f,0x7e,0x29,0x60,0xbc,0x6a,0x78,0x3, 0x74,0x1, 0x22,0xb, 0x70,0x7e,0x25,0x2f, +0x9, 0xb2,0x0, 0x1a,0x54,0xf, 0xa, 0x1b,0xa, 0x27,0xbd,0x21,0x48,0xde,0xe4,0x22, +0xca,0x79,0x7c,0xe7,0x7c,0xfb,0x7a,0xf3,0x2, 0xaf,0x7e,0x34,0x2, 0xaf,0x12,0x31, +0x9f,0x7c,0xbf,0x12,0x17,0x36,0x7e,0xa3,0x2, 0xaf,0x74,0x4, 0xa4,0x2e,0x55,0x2d, +0x49,0x15,0x0, 0x2, 0xb, 0x58,0x0, 0x7a,0xf, 0x2, 0xb3,0xbf,0x1, 0x78,0x3, 0xe4, +0x80,0x2a,0x12,0x17,0xdb,0xa, 0x1e,0x6d,0x0, 0x12,0x0, 0x78,0x7f,0x1, 0x7e,0x1f, +0x2, 0xb3,0xbf,0x10,0x8, 0x15,0x7e,0x1f,0x2, 0xb3,0xbe,0x18,0x7, 0xd0,0x8, 0xb, +0x7c,0xbf,0x12,0x30,0xe4,0x60,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xda,0x79,0x22,0x7d, +0x23,0x7e,0x29,0xa0,0xbe,0xa0,0x10,0x50,0x3a,0xa, 0x3a,0x2e,0x34,0x0, 0x8, 0x7c, +0xb7,0x19,0xb2,0x0, 0x1, 0xb4,0x10,0x6, 0xa, 0x3b,0xb, 0x34,0x80,0x5a,0xa, 0x3b, +0xb4,0x17,0x9, 0x1b,0x34,0x12,0x32,0x22,0x1b,0x34,0x80,0x51,0x1b,0x34,0x7c,0xb7, +0x19,0xb2,0x0, 0x2, 0x9, 0xb2,0x0, 0x1, 0xa, 0x3b,0xb, 0x34,0x7c,0xb7,0x19,0xb2, +0x0, 0x3, 0x22,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x19,0x72,0x0, 0x1, 0xa5,0xbf,0x8, +0xd, 0xa, 0x17,0xb, 0x14,0x12,0x32,0x2d,0xa, 0x16,0xb, 0x14,0x80,0xf, 0xa5,0xbf, +0xf, 0x12,0xa, 0x17,0x1b,0x14,0x12,0x32,0x2d,0xa, 0x16,0x1b,0x14,0x7c,0x63,0x19, +0x62,0x0, 0x3, 0x22,0xa, 0x37,0x1b,0x34,0x12,0x32,0x22,0xb, 0x34,0x19,0x72,0x0, +0x3, 0x22,0x19,0x72,0x0, 0x2, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x22,0x7c,0x63,0x19, +0x62,0x0, 0x2, 0x9, 0x62,0x0, 0x1, 0x22,0x12,0x32,0x48,0x7a,0xb3,0x4, 0xaf,0xbe, +0xb0,0x1, 0x28,0x3, 0x2, 0x32,0x52,0x22,0x7e,0x35,0x2f,0x9, 0xb3,0x0, 0x1a,0x54, +0xf, 0x22,0xca,0xd8,0xca,0x79,0xc2,0xf, 0x12,0x32,0x48,0xbe,0xb0,0x1, 0x38,0x2, +0x61,0x0, 0x7e,0xb3,0x4, 0xcc,0x70,0x2, 0x61,0x0, 0x7e,0xf0,0x1, 0x41,0xf6,0xc2, +0xf, 0x74,0x7, 0xac,0xbf,0x9, 0xe5,0x4, 0xb5,0x9, 0xd5,0x4, 0xb4,0x49,0xd5,0x4, +0xb2,0x49,0xc5,0x4, 0xb0,0x7c,0xbe,0x7e,0x70,0xe, 0x12,0x36,0x9f,0x7f,0x71,0xbe, +0xd0,0x19,0x40,0x2, 0xd2,0xf, 0xbe,0x68,0x9, 0xc4,0x48,0x7, 0xbe,0xd0,0xa, 0x40, +0x2, 0xd2,0xf, 0x7f,0x17,0x2e,0x18,0x5, 0xdc,0xbf,0x61,0x8, 0x7, 0xbe,0xd0,0x3, +0x40,0x2, 0xd2,0xf, 0x7e,0x8, 0x0, 0x4, 0x7e,0x1f,0x4, 0xb0,0x12,0x0, 0xe5,0x2e, +0x18,0x5, 0xdc,0xbf,0x61,0x8, 0x13,0xbe,0x68,0x1f,0x40,0x8, 0xd, 0x12,0x33,0x8, +0x20,0xe1,0x7, 0xbe,0xd0,0x3, 0x40,0x2, 0xd2,0xf, 0xbe,0x68,0x4e,0x20,0x8, 0x8, +0x12,0x33,0x8, 0x20,0xe1,0x2, 0xd2,0xf, 0xa2,0xf, 0xe4,0x33,0x12,0x35,0xdc,0xac, +0x5f,0x12,0x35,0xe5,0xb, 0xf0,0x12,0x32,0x48,0x12,0x27,0x62,0x58,0x2, 0x41,0x6f, +0x12,0x35,0xf5,0xda,0x79,0xda,0xd8,0x22,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x4, 0xb6, +0x22,0x12,0x35,0x47,0xc2,0xf, 0x7e,0x34,0x4, 0xce,0x12,0x33,0xc3,0xd2,0xf, 0x7e, +0x34,0x4, 0xa9,0x12,0x33,0xc3,0x7e,0x34,0x4, 0xce,0x12,0x33,0x70,0x7e,0x34,0x4, +0xa9,0x12,0x33,0x70,0x7e,0xb3,0x4, 0xae,0x1e,0xb0,0x54,0x3, 0xa, 0x2b,0x7e,0xb3, +0x4, 0xd3,0x1e,0xb0,0x54,0x3, 0xa, 0x3b,0x2d,0x32,0x68,0x5, 0x12,0x32,0x48,0x78, +0x5, 0xc2,0xe, 0x12,0x37,0xac,0x7e,0xb3,0x4, 0xd3,0x20,0xe0,0x7, 0x7e,0xb3,0x4, +0xae,0x30,0xe0,0x9, 0xd2,0xe, 0x74,0x78,0x7a,0xb3,0x4, 0xcc,0x22,0xc2,0xe, 0x22, +0x49,0x43,0x0, 0x2, 0x9, 0x53,0x0, 0x4, 0x9, 0xa3,0x0, 0x5, 0x7c,0xba,0x1e,0xb0, +0x54,0x3, 0xbe,0xb0,0x0, 0x28,0x30,0xbe,0x44,0xb, 0xb8,0x28,0x2, 0x80,0x18,0xbe, +0x44,0x7, 0xd0,0x28,0x7, 0xbe,0x50,0x14,0x38,0x28,0x80,0xb, 0xbe,0x44,0x3, 0x20, +0x28,0xc, 0xbe,0x50,0x10,0x38,0x1b,0x12,0x35,0x3e,0x44,0x1, 0x80,0x5, 0x12,0x35, +0x3e,0x54,0xfe,0x7a,0x49,0xb0,0x22,0x2e,0x34,0x0, 0x5, 0x7c,0xba,0x54,0xfe,0x7a, +0x39,0xb0,0x22,0xca,0x3b,0x7d,0x73,0x6c,0xdd,0x9f,0x11,0x7a,0x1f,0x2, 0xe0,0x6c, +0xcc,0x74,0x4, 0x30,0xf, 0xd, 0x12,0x35,0x2d,0x49,0x34,0x0, 0xb2,0x49,0x24,0x0, +0xb0,0x80,0xb, 0x12,0x35,0x2d,0x49,0x34,0x0, 0x92,0x49,0x24,0x0, 0x90,0x59,0x35, +0x2, 0xb2,0x59,0x25,0x2, 0xb0,0xb, 0xc0,0xbe,0xc0,0x8, 0x78,0xd4,0x7e,0x34,0x2, +0xb0,0x7e,0x24,0x2, 0xd0,0x12,0x44,0xd5,0x7a,0xb3,0x2, 0xaf,0xbe,0xb0,0x2, 0x28, +0x6, 0x74,0x2, 0x7a,0xb3,0x2, 0xaf,0x7e,0x63,0x2, 0xaf,0x5e,0x60,0x3, 0x3e,0x60, +0x7d,0x27,0x2e,0x24,0x0, 0x5, 0x7e,0x29,0x70,0x5e,0x70,0xf9,0x4c,0x76,0x7a,0x29, +0x70,0x7e,0x34,0x2, 0xd8,0x7e,0x24,0x0, 0x8, 0xe4,0x12,0x3, 0x15,0x7e,0x34,0x2, +0xd8,0x7e,0x24,0x2, 0xd0,0x7e,0xb3,0x2, 0xaf,0x12,0x26,0xcd,0x7e,0xb3,0x2, 0xaf, +0x70,0x6, 0x7e,0x18,0x0, 0x1, 0x80,0x11,0x7e,0xa3,0x2, 0xd0,0x74,0x4, 0xa4,0x49, +0x35,0x2, 0xb2,0x49,0x25,0x2, 0xb0,0x2f,0x11,0x7a,0x1f,0x2, 0xe0,0x9f,0x11,0x7a, +0x1f,0x2, 0xe4,0x6c,0xcc,0xa, 0x3c,0x9, 0xb3,0x2, 0xd8,0x70,0x1e,0x74,0x4, 0xac, +0xbc,0x49,0x15,0x2, 0xb2,0x49,0x5, 0x2, 0xb0,0xbe,0x8, 0x0, 0x64,0x8, 0xc, 0x7e, +0x1f,0x2, 0xe4,0x2f,0x10,0x7a,0x1f,0x2, 0xe4,0xb, 0xd0,0xb, 0xc0,0xbe,0xc0,0x8, +0x78,0xd3,0xbe,0xd0,0x0, 0x28,0x18,0xa, 0x1d,0x6d,0x0, 0x7e,0x1f,0x2, 0xe4,0x12, +0x0, 0xe5,0x7a,0x1f,0x2, 0xe4,0xbe,0x18,0x0, 0x1, 0x58,0x3, 0x12,0x35,0x35,0x7e, +0x1f,0x2, 0xe0,0xbe,0x18,0x0, 0x1, 0x18,0x8, 0x7e,0x18,0x0, 0x1, 0x7a,0x1f,0x2, +0xe0,0x7e,0x1f,0x2, 0xe4,0xbe,0x18,0x0, 0x1, 0x18,0x3, 0x12,0x35,0x35,0x7e,0x6f, +0x2, 0xe4,0x7e,0x7f,0x2, 0xe0,0x7f,0x17,0x7f,0x6, 0x12,0x0, 0xe5,0xbe,0x34,0x0, +0x64,0x28,0x4, 0x7e,0x34,0x0, 0x64,0xbe,0x68,0xfd,0xe8,0x48,0x8, 0x7e,0x8, 0xfd, +0xe8,0x7a,0xf, 0x2, 0xe4,0xbe,0x78,0xfd,0xe8,0x48,0x8, 0x7e,0x8, 0xfd,0xe8,0x7a, +0xf, 0x2, 0xe0,0x7e,0xf, 0x2, 0xe4,0x7d,0x21,0x59,0x27,0x0, 0x2, 0x7e,0xf, 0x2, +0xe0,0x7d,0x21,0x1b,0x78,0x20,0x19,0x77,0x0, 0x4, 0xda,0x3b,0x22,0xac,0xbc,0x7d, +0x45,0x2e,0x45,0x2d,0x22,0x7e,0x18,0x0, 0x1, 0x7a,0x1f,0x2, 0xe4,0x22,0x7d,0x43, +0x2e,0x44,0x0, 0x5, 0x7c,0xba,0x22,0xca,0x79,0x6c,0xff,0x7e,0x70,0x7, 0xac,0x7f, +0x7d,0x23,0x2e,0x24,0x4, 0xb6,0x7e,0x29,0xb0,0x54,0xfe,0x7a,0x29,0xb0,0x9f,0x0, +0x59,0x13,0x4, 0xb2,0x59,0x3, 0x4, 0xb0,0xe4,0x19,0xb3,0x4, 0xb4,0xb, 0xf0,0xbe, +0xf0,0x4, 0x78,0xd7,0x6c,0xff,0x80,0x59,0xa, 0x3f,0x2e,0x35,0x2f,0x7e,0x39,0xe0, +0x7e,0x30,0x7, 0xac,0x3f,0x19,0xe1,0x4, 0xb5,0x7e,0x10,0x4, 0xac,0x1e,0x2e,0x5, +0x2d,0x12,0x37,0x1d,0x59,0x31,0x4, 0xb2,0x59,0x21,0x4, 0xb0,0x7c,0xbe,0x12,0x37, +0x42,0x7c,0xab,0x7e,0x50,0x7, 0xac,0x5f,0x19,0xa2,0x4, 0xb4,0x7d,0x32,0x12,0x37, +0x15,0x44,0x1, 0x7a,0x39,0xb0,0xbe,0xe0,0x8, 0x40,0xc, 0xbe,0xe0,0x18,0x50,0x7, +0x7e,0x39,0xb0,0x44,0x2, 0x80,0x5, 0x7e,0x39,0xb0,0x54,0xfd,0x7a,0x39,0xb0,0xb, +0xf0,0x12,0x32,0x48,0x12,0x27,0x62,0x48,0x9f,0xda,0x79,0x22,0x7c,0x6b,0x5e,0x60, +0x1, 0x7e,0x50,0x7, 0x22,0x2e,0x24,0x4, 0xb6,0x7e,0x29,0x70,0x5e,0x70,0xfe,0x4c, +0x76,0x7a,0x29,0x70,0x22,0x6c,0x66,0x6c,0x77,0x7e,0x50,0x7, 0xac,0x57,0x9, 0xb2, +0x4, 0xb6,0x30,0xe0,0x10,0x9, 0xa2,0x4, 0xb5,0x7c,0x56,0xb, 0x60,0xa, 0x25,0x2e, +0x25,0x2f,0x7a,0x29,0xa0,0xb, 0x70,0xbe,0x70,0x4, 0x40,0xdd,0x5e,0x60,0xf, 0x7e, +0x25,0x2f,0x2e,0x24,0x0, 0x1a,0x7e,0x29,0x70,0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x29, +0x70,0x22,0xca,0xd8,0xca,0x79,0x12,0xb, 0xbf,0x68,0x5f,0x7e,0xb3,0x4, 0xcc,0x60, +0x59,0x6c,0xff,0x80,0x4a,0x7e,0x70,0x7, 0xac,0x7f,0x9, 0xb3,0x4, 0xb6,0x30,0xe0, +0x3c,0x9, 0xe3,0x4, 0xb5,0x9, 0xd3,0x4, 0xb4,0x49,0xd3,0x4, 0xb2,0x49,0xc3,0x4, +0xb0,0x7c,0xbe,0x7e,0x70,0x10,0x12,0x36,0x9f,0x7f,0x51,0xbe,0xd0,0x8, 0x50,0x1d, +0x7f,0x15,0x2e,0x18,0x3, 0x41,0xbf,0x61,0x58,0x13,0xbe,0x68,0xb, 0xb8,0x58,0xd, +0x7e,0x70,0x7, 0xac,0x7f,0x12,0x37,0x15,0x54,0xfe,0x7a,0x39,0xb0,0xb, 0xf0,0x7e, +0x73,0x4, 0xaf,0xbc,0x7f,0x38,0xae,0x12,0x35,0xf5,0xda,0x79,0xda,0xd8,0x22,0xca, +0x79,0x7c,0xa7,0x7c,0x9b,0x9f,0x0, 0xa, 0x39,0x12,0x27,0xb, 0x7c,0x45,0xa, 0x39, +0x1e,0x34,0x1e,0x34,0x1e,0x34,0x7c,0x57,0xa5,0xbc,0x0, 0x8, 0x7e,0xe0,0x2, 0x7e, +0xf0,0x2, 0x80,0x16,0xa, 0x74,0xa5,0xbc,0x7, 0x6, 0x1b,0x75,0x7c,0xef,0x80,0xa, +0x1b,0x74,0x7c,0xef,0xa, 0x34,0xb, 0x34,0x7c,0xf7,0x7e,0x70,0x8, 0xac,0x75,0x2c, +0xe7,0x2c,0xf7,0x7e,0x90,0x4, 0xac,0x9f,0x2e,0x45,0x2d,0x12,0x37,0x3a,0x7e,0x90, +0x4, 0xac,0x9e,0x2e,0x45,0x2d,0x49,0xf4,0x0, 0x2, 0xb, 0x48,0xe0,0xbf,0x71,0x8, +0x2, 0x80,0x2, 0x7f,0x17,0xbe,0x18,0x0, 0x0, 0x58,0x2, 0x7f,0x10,0xa, 0x1a,0x12, +0x17,0xd6,0xda,0x79,0x22,0x2e,0x34,0x4, 0xb6,0x7e,0x39,0xb0,0x22,0x49,0x30,0x0, +0x2, 0xb, 0x8, 0x20,0x22,0x7e,0xb3,0x0, 0x55,0xc4,0x54,0xf, 0x22,0x7a,0xb3,0x2, +0xc3,0x7e,0x34,0x2, 0xc3,0x22,0x2e,0x44,0x0, 0xcd,0x49,0x34,0x0, 0x2, 0xb, 0x48, +0x20,0x22,0x7f,0x71,0x12,0x27,0x78,0xbe,0x24,0x0, 0x8, 0x58,0x6, 0x7e,0x7, 0x4, +0xd0,0x80,0x4, 0x7e,0x7, 0x4, 0xab,0xbe,0x78,0x75,0x30,0x8, 0x0, 0xbe,0x78,0x0, +0x0, 0x58,0x4, 0x6d,0x11,0x80,0x6, 0x7f,0x17,0x2f,0x11,0x7d,0x13,0x7d,0x51,0x8d, +0x50,0xbe,0x54,0x0, 0x64,0x28,0x4, 0x7e,0x54,0x0, 0x64,0x22,0xca,0x79,0x7c,0xeb, +0x6c,0xff,0x7c,0xbe,0x7e,0x30,0x4, 0xac,0x3e,0x12,0x17,0x1c,0x12,0x37,0x42,0x7c, +0xab,0x7e,0x30,0x4, 0xac,0x3e,0x12,0x17,0x1c,0xbe,0x18,0x3a,0x98,0x8, 0x8, 0xbe, +0xa0,0xa, 0x50,0x3, 0x7e,0xf0,0x1, 0x7c,0xbf,0xda,0x79,0x22,0x7e,0x34,0x0, 0x1, +0x7a,0x37,0x4, 0xce,0x7a,0x37,0x4, 0xd0,0xe4,0x7a,0xb3,0x4, 0xd2,0x7e,0xb3,0x4, +0xd3,0x54,0xf9,0x7a,0xb3,0x4, 0xd3,0x54,0xfe,0x7a,0xb3,0x4, 0xd3,0x7a,0x37,0x4, +0xa9,0x7a,0x37,0x4, 0xab,0xe4,0x7a,0xb3,0x4, 0xad,0x7e,0xb3,0x4, 0xae,0x54,0xf9, +0x7a,0xb3,0x4, 0xae,0x54,0xfe,0x7a,0xb3,0x4, 0xae,0x22,0x75,0x25,0x3, 0x75,0x2b, +0x0, 0x22,0xbe,0xb0,0xa, 0x50,0x8, 0x7c,0x1b,0x2e,0x10,0x23,0xa5,0xe7,0x22,0x2, +0x38,0x2, 0xca,0x79,0x7c,0xab,0xbe,0xa0,0xa, 0x78,0x5, 0x7e,0xf0,0x20,0x21,0x6b, +0xbe,0xa0,0xb, 0x78,0x5, 0x7e,0xf0,0x3, 0x21,0x6b,0xbe,0xa0,0xc, 0x78,0x6, 0x7e, +0xf3,0x0, 0xb6,0x21,0x6b,0xbe,0xa0,0xd, 0x78,0x1c,0x7e,0xb3,0x0, 0xb5,0xb4,0x1, +0x6, 0x7e,0xf3,0x0, 0xa9,0x21,0x6b,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xaf,0x21,0x6b, +0x7e,0xf3,0x0, 0xa7,0x21,0x6b,0xbe,0xa0,0xe, 0x78,0x1c,0x7e,0xb3,0x0, 0xb5,0xb4, +0x1, 0x6, 0x7e,0xf3,0x0, 0xaa,0x21,0x6b,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb0,0x21, +0x6b,0x7e,0xf3,0x0, 0xa8,0x21,0x6b,0xbe,0xa0,0xf, 0x78,0x6, 0x7e,0xf3,0x0, 0xb7, +0x21,0x6b,0xbe,0xa0,0x10,0x78,0x6, 0x7e,0xf3,0x0, 0xb8,0x21,0x6b,0xbe,0xa0,0x11, +0x40,0x21,0xbe,0xa0,0x34,0x38,0x1c,0x7e,0xb3,0x0, 0xb5,0xbe,0xb0,0x1, 0x68,0x3, +0xb4,0x2, 0x8, 0xa, 0x3a,0x9, 0xf3,0x3, 0xc0,0x21,0x6b,0xa, 0x3a,0x9, 0xf3,0x0, +0x72,0x21,0x6b,0xbe,0xa0,0x35,0x40,0x2b,0xbe,0xa0,0x58,0x38,0x26,0xa, 0x7a,0x9e, +0x74,0x0, 0x35,0xbe,0xf0,0x20,0x50,0xc, 0x7c,0xbf,0x7e,0x70,0x20,0x12,0x1e,0x48, +0xa, 0x3b,0x80,0x2, 0xa, 0x3f,0x2e,0x34,0x1, 0xee,0x12,0x1d,0xa5,0x7c,0xfb,0xb, +0xf0,0x21,0x6b,0xbe,0xa0,0x59,0x78,0x6, 0x7e,0xf3,0x0, 0xb9,0x21,0x6b,0xbe,0xa0, +0x5a,0x78,0x5, 0x7e,0xf0,0xf, 0x21,0x6b,0xbe,0xa0,0xac,0x78,0x13,0x7e,0xb3,0x0, +0xb5,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb1,0x80,0x71,0x7e,0xf3,0x0, 0xab,0x80,0x6b, +0xbe,0xa0,0xa0,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0x61,0xbe,0xa0,0xa1,0x78,0x13,0x7e, +0xb3,0x0, 0xb5,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb2,0x80,0x4f,0x7e,0xf3,0x0, 0xac, +0x80,0x49,0xbe,0xa0,0xa2,0x78,0x13,0x7e,0xb3,0x0, 0xb5,0xb4,0x2, 0x6, 0x7e,0xf3, +0x0, 0xb3,0x80,0x37,0x7e,0xf3,0x0, 0xad,0x80,0x31,0xbe,0xa0,0xa3,0x78,0x13,0x7e, +0xb3,0x0, 0xb5,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb4,0x80,0x1f,0x7e,0xf3,0x0, 0xae, +0x80,0x19,0xbe,0xa0,0xad,0x78,0x6, 0x7e,0xf3,0x0, 0xba,0x80,0xe, 0xbe,0xa0,0xae, +0x78,0x6, 0x7e,0xf3,0x0, 0xb5,0x80,0x3, 0x7e,0xf0,0xee,0x7c,0xbf,0xda,0x79,0x22, +0xbe,0xb0,0xa, 0x50,0xa, 0x7c,0x1b,0x2e,0x10,0x23,0x7c,0xb7,0xa5,0xf7,0x22,0x2, +0x39,0x82,0x7c,0xa7,0xb4,0xc, 0x6, 0x7e,0x34,0x0, 0xb6,0x41,0x4d,0xb4,0xd, 0x1c, +0x7e,0xb3,0x0, 0xb5,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0xa9,0x41,0x4d,0xb4,0x2, 0x6, +0x7e,0x34,0x0, 0xaf,0x41,0x4d,0x7e,0x34,0x0, 0xa7,0x41,0x4d,0xb4,0xe, 0x1c,0x7e, +0xb3,0x0, 0xb5,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0xaa,0x41,0x4d,0xb4,0x2, 0x6, 0x7e, +0x34,0x0, 0xb0,0x41,0x4d,0x7e,0x34,0x0, 0xa8,0x41,0x4d,0xb4,0xf, 0x6, 0x7e,0x34, +0x0, 0xb7,0x80,0x79,0xb4,0x10,0x6, 0x7e,0x34,0x0, 0xb8,0x80,0x70,0xb4,0x59,0x9, +0x7e,0x34,0x0, 0xb9,0x43,0x1a,0x4, 0x80,0x6f,0xb4,0xac,0x13,0x7e,0xb3,0x0, 0xb5, +0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb1,0x80,0x54,0x7e,0x34,0x0, 0xab,0x80,0x4e,0xb4, +0xa1,0x13,0x7e,0xb3,0x0, 0xb5,0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb2,0x80,0x3e,0x7e, +0x34,0x0, 0xac,0x80,0x38,0xb4,0xa2,0x13,0x7e,0xb3,0x0, 0xb5,0xb4,0x2, 0x6, 0x7e, +0x34,0x0, 0xb3,0x80,0x28,0x7e,0x34,0x0, 0xad,0x80,0x22,0xb4,0xa3,0x13,0x7e,0xb3, +0x0, 0xb5,0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb4,0x80,0x12,0x7e,0x34,0x0, 0xae,0x80, +0xc, 0xb4,0xae,0xe, 0x7e,0x34,0x0, 0xb5,0xe4,0x7a,0xb3,0x0, 0xba,0x43,0x1a,0x1, +0x80,0x6, 0xb4,0xaf,0x6, 0x2, 0x3d,0xd5,0x7a,0x39,0xa0,0x22,0x7c,0x7, 0xbe,0xb0, +0x80,0x40,0xb, 0xbe,0xb0,0xde,0x38,0x6, 0x24,0x80,0x7c,0x70,0x80,0x7c,0x24,0x0, +0x78,0x7b,0x7e,0x14,0x4, 0xfe,0x7a,0x19,0x0, 0x5e,0x0, 0x70,0x7c,0xb0,0xc4,0x54, +0xf, 0x7c,0xb, 0xa5,0xb8,0x4, 0x15,0x7e,0xb3,0x4, 0x31,0xb4,0x3, 0x7, 0x74,0x2, +0x7e,0x70,0x3, 0x80,0x34,0x74,0x3c,0x7e,0x70,0x3, 0x80,0x4e,0x7e,0xb3,0x4, 0x31, +0xb4,0x3, 0x29,0x74,0x2, 0x7e,0x70,0x1, 0x12,0x39,0x70,0xa5,0xb8,0x1, 0x6, 0x74, +0x2, 0x6c,0x77,0x80,0x14,0xa5,0xb8,0x0, 0x7, 0x74,0x2, 0x7e,0x70,0x1, 0x80,0x9, +0xa5,0xb8,0x3, 0x29,0x74,0x2, 0x7e,0x70,0x4, 0x2, 0x39,0x70,0xa5,0xb8,0x1, 0x6, +0x74,0x3c,0x6c,0x77,0x80,0x14,0xa5,0xb8,0x4, 0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80, +0x9, 0xa5,0xb8,0x3, 0x8, 0x74,0x3c,0x7e,0x70,0x4, 0x2, 0x3f,0x49,0x22,0x7c,0x6b, +0x14,0x68,0x78,0x4, 0x68,0x2, 0x61,0x77,0x7e,0x44,0x4, 0xfe,0x7a,0x49,0x70,0x5e, +0x70,0x70,0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0x7b,0xbe,0x70,0x4, 0x68,0x47,0x7e,0xb3, +0x4, 0x31,0xb4,0x3, 0x20,0xa5,0xbf,0x1, 0x6, 0x74,0x2, 0x6c,0x77,0x80,0x66,0xa5, +0xbf,0x0, 0x7, 0x74,0x2, 0x7e,0x70,0x1, 0x80,0x5b,0xa5,0xbf,0x3, 0x70,0x74,0x2, +0x7e,0x70,0x4, 0x80,0x50,0xa5,0xbf,0x1, 0x6, 0x74,0x3c,0x6c,0x77,0x80,0x29,0xa5, +0xbf,0x4, 0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80,0x1e,0xa5,0xbf,0x3, 0x50,0x74,0x3c, +0x7e,0x70,0x4, 0x80,0x13,0x7e,0xb3,0x4, 0x31,0xb4,0x3, 0x7, 0x74,0x2, 0x7e,0x70, +0x3, 0x80,0x22,0x74,0x3c,0x7e,0x70,0x3, 0x2, 0x3f,0x49,0x7a,0x73,0x4, 0xfd,0x7e, +0x54,0x3, 0x89,0x7a,0x55,0x16,0x22,0xbe,0x60,0xa, 0x50,0xc, 0x7e,0xb3,0x4, 0x31, +0xb4,0x3, 0x1b,0x7c,0xb6,0x2, 0x39,0x70,0xbe,0x60,0xa, 0x40,0x11,0xbe,0x60,0xaf, +0x38,0xc, 0x7e,0xb3,0x4, 0x31,0xb4,0x3, 0x5, 0x7c,0xb6,0x2, 0x39,0x82,0x22,0xca, +0xf8,0x30,0x90,0x79,0xd2,0x7, 0x7e,0xb3,0x4, 0xfc,0x4, 0x7a,0xb3,0x4, 0xfc,0x7e, +0x93,0x4, 0xfc,0xbe,0x90,0x1, 0x78,0x8, 0xe5,0x91,0x7a,0xb3,0x4, 0xff,0x80,0x36, +0x7e,0xf3,0x4, 0xfe,0x7c,0xbf,0xc4,0x7c,0xfb,0x7c,0x8f,0x5e,0x80,0x7, 0x78,0x8, +0x12,0x3c,0xf8,0x12,0x3a,0x5c,0x80,0x1e,0xbe,0x80,0x4, 0x78,0x8, 0x12,0x3c,0xf8, +0x12,0x3a,0xee,0x80,0x11,0x7c,0xbf,0x54,0x7, 0xb4,0x1, 0xa, 0x7e,0xb3,0x4, 0xfc, +0x12,0x3c,0xfa,0x12,0x46,0xf4,0x12,0x3d,0x23,0x78,0xe, 0xe4,0x12,0x3c,0x75,0xb4, +0x10,0x2, 0x80,0x14,0x12,0x3d,0xb6,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x3d, +0xac,0x80,0x8, 0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x3d,0xc0,0xc2,0x90,0x30,0x91,0x52, +0xc2,0x7, 0x7e,0xb3,0x4, 0xfa,0x4, 0x12,0x3d,0x1f,0x78,0x13,0xe4,0x12,0x3c,0x75, +0xb4,0x10,0x6, 0x7e,0xb3,0x4, 0xfa,0x80,0x23,0x7e,0xb3,0x4, 0xfa,0x80,0x28,0xbe, +0xf0,0x4, 0x78,0xf, 0x7e,0xb3,0x4, 0xfa,0x2e,0xb3,0x4, 0xff,0x12,0x3d,0x2e,0xf5, +0x91,0x80,0x1d,0xbe,0xf0,0x1, 0x7e,0xb3,0x4, 0xfa,0x78,0xb, 0x2e,0xb3,0x4, 0xff, +0x12,0x0, 0x1a,0xf5,0x91,0x80,0x9, 0x2e,0xb3,0x4, 0xff,0x12,0x3c,0x75,0xf5,0x91, +0xc2,0x91,0xda,0xf8,0x22,0x7c,0x7b,0xbe,0x70,0x80,0x40,0xc, 0xbe,0x70,0xde,0x38, +0x7, 0xa, 0x37,0x9, 0xb3,0x3, 0x75,0x22,0xa5,0xbf,0x0, 0x5, 0x7e,0xb3,0x4, 0xfe, +0x22,0x30,0x6, 0x6, 0x7e,0x24,0x4, 0xd6,0x80,0x4, 0x7e,0x24,0x4, 0xe8,0x7a,0x25, +0x18,0x7c,0xb7,0x14,0xbe,0xb0,0xe, 0x50,0x4c,0x7e,0xa0,0x3, 0xa4,0x90,0x3c,0xb1, +0x73,0x2, 0x3c,0xdb,0x2, 0x3c,0xe3,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb, +0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x2, +0x3c,0xeb,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x2, 0x3c,0xeb,0x7e,0x35,0x18,0x9, 0xb3, +0x0, 0x4, 0x22,0x7e,0x35,0x18,0x9, 0xb3,0x0, 0x3, 0x22,0xa, 0x37,0x2e,0x35,0x18, +0x9, 0xb3,0x0, 0x2, 0x22,0x74,0xff,0x22,0x7c,0xb9,0x2e,0xb3,0x4, 0xff,0x24,0xfe, +0x7e,0x71,0x91,0x22,0x70,0x18,0x7e,0x1f,0x1, 0x51,0x7e,0xf, 0x1, 0x4d,0x2f,0x1, +0x7e,0x1f,0x1, 0x55,0x2f,0x10,0xbe,0x18,0x6, 0x40,0x58,0x2, 0xc2,0xd, 0x22,0x7a, +0xb3,0x4, 0xfa,0x7e,0xb3,0x4, 0xfe,0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x22,0x7c,0xab, +0x24,0x0, 0x78,0x5, 0x7e,0xb3,0x4, 0xfe,0x22,0xbe,0xa0,0xae,0x38,0xc, 0x7e,0xb3, +0x4, 0x31,0xb4,0x3, 0x24,0x7c,0xba,0x2, 0x37,0xf2,0xbe,0xa0,0xb0,0x40,0x1a,0xbe, +0xa0,0xf7,0x38,0x15,0x7e,0xb3,0x4, 0x31,0xb4,0x3, 0xe, 0xa, 0x3a,0x2e,0x34,0x3, +0x89,0x9e,0x34,0x0, 0xb0,0x7e,0x39,0xb0,0x22,0x7c,0xba,0x22,0xca,0xf8,0xe4,0x12, +0x3d,0x1f,0x78,0x5, 0x12,0x3d,0xb6,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x3d, +0xac,0x80,0x8, 0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x3d,0xc0,0x75,0x91,0x0, 0xe4,0x7a, +0xb3,0x4, 0xfc,0x7a,0xb3,0x4, 0xfb,0x74,0xaa,0x7a,0xb3,0x4, 0xd6,0x7a,0xb3,0x4, +0xd7,0x7a,0xb3,0x4, 0xe8,0x7a,0xb3,0x4, 0xe9,0xda,0xf8,0x22,0x7e,0xb3,0x4, 0xff, +0x12,0x3d,0x2e,0xf5,0x91,0x22,0x7e,0xb3,0x4, 0xff,0x12,0x3c,0x75,0xf5,0x91,0x22, +0x7e,0xb3,0x4, 0xff,0x12,0x0, 0x1a,0xf5,0x91,0x22,0xe4,0x7a,0xb3,0x4, 0xfe,0x12, +0x3f,0x7d,0x2, 0x3d,0x6c,0x30,0x8, 0x8, 0x74,0x1, 0x12,0x3d,0xe7,0xc2,0x8, 0x22, +0xe4,0x12,0x3d,0xe7,0xd2,0x8, 0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xca, +0x3b,0x7c,0xeb,0x6c,0xaa,0x20,0x0, 0x8, 0x20,0x5, 0x5, 0x20,0x2, 0x2, 0xe1,0x2f, +0x20,0x6, 0x6, 0x7e,0x4, 0x4, 0xd6,0x80,0x4, 0x7e,0x4, 0x4, 0xe8,0x7d,0x30,0x12, +0x3f,0xf5,0x74,0xaa,0x7a,0x9, 0xb0,0x19,0xb0,0x0, 0x1, 0x74,0x12,0x19,0xb0,0x0, +0x2, 0x7e,0xb3,0x0, 0x7d,0x19,0xb0,0x0, 0x4, 0x6c,0x77,0x6c,0xff,0x7e,0x50,0x5, +0xac,0x5f,0x9, 0x62,0x0, 0x6d,0xbe,0x60,0xff,0x78,0x2, 0xc1,0xd7,0xa, 0x46,0x9, +0xb4,0x0, 0xc1,0xbe,0xb0,0x3, 0x78,0x2, 0xc1,0xd7,0x49,0x12,0x0, 0x69,0x7d,0x61, +0xa, 0x6c,0x7d,0xf6,0x5e,0xf4,0x0, 0xf, 0x7d,0x6f,0x7c,0x6d,0xa, 0xf7,0x2d,0xf0, +0x19,0x6f,0x0, 0x5, 0x7c,0x63,0xa, 0x17,0x2d,0x10,0x19,0x61,0x0, 0x6, 0x49,0x12, +0x0, 0x6b,0xa, 0x22,0x5e,0x24,0x0, 0xf, 0x7c,0x65,0xa, 0x27,0x2d,0x20,0x19,0x62, +0x0, 0x7, 0x7c,0x63,0xa, 0x27,0x2d,0x20,0x19,0x62,0x0, 0x8, 0xe4,0xa, 0x27,0x2d, +0x20,0x19,0xb2,0x0, 0x9, 0xa, 0x27,0x2d,0x20,0x19,0xb2,0x0, 0xa, 0x12,0x3f,0x3f, +0xc4,0x54,0xf0,0xa, 0x27,0x2d,0x20,0x2e,0x24,0x0, 0x7, 0x12,0x3f,0x36,0x12,0x3f, +0x3f,0xbe,0xb0,0xff,0x68,0x1e,0x9, 0xb4,0x0, 0xc1,0xbe,0xb0,0x1, 0x68,0x2, 0xb, +0xa0,0x9, 0xb4,0x0, 0xc1,0x3, 0x3, 0x54,0xc0,0xa, 0x27,0x2d,0x20,0x2e,0x24,0x0, +0x5, 0x12,0x3f,0x36,0x2e,0x70,0x6, 0xb, 0xf0,0xbe,0xf0,0x2, 0x68,0x2, 0xc1,0x2d, +0x19,0xa0,0x0, 0x3, 0xe4,0x19,0xb0,0x0, 0x11,0x6c,0xff,0xa, 0x1f,0x2d,0x10,0x7e, +0x19,0x60,0x7d,0x10,0x2e,0x14,0x0, 0x11,0x7e,0x19,0x70,0x6c,0x76,0x7a,0x19,0x70, +0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xe4,0x30,0x6, 0x4, 0xc2,0x6, 0x80,0x2, 0xd2,0x6, +0x30,0x5, 0x3, 0x12,0x4e,0x9e,0xc2,0x0, 0xc2,0x5, 0xc2,0x2, 0x74,0x1, 0x12,0x3d, +0xe7,0x7e,0x34,0x0, 0x3, 0x12,0x47,0x5b,0xbe,0xe0,0x1, 0x78,0x6, 0x80,0x0, 0xe4, +0x12,0x3d,0xe7,0xda,0x3b,0x22,0x7e,0x29,0x60,0x2c,0x6b,0x7a,0x29,0x60,0x22,0x7e, +0x50,0x5, 0xac,0x5f,0x9, 0xb2,0x0, 0x6d,0x22,0xbe,0xb0,0x5e,0x38,0x2e,0xbe,0xb0, +0x26,0x68,0x29,0xbe,0xb0,0x2f,0x68,0x24,0xbe,0xb0,0x23,0x68,0x1f,0xbe,0xb0,0x28, +0x68,0x1a,0xbe,0xb0,0x21,0x68,0x15,0xbe,0xb0,0x22,0x68,0x10,0xa, 0x2b,0x19,0x72, +0x3, 0xf5,0x7e,0xb3,0x4, 0x54,0x44,0x1, 0x7a,0xb3,0x4, 0x54,0x22,0x7e,0x50,0x70, +0x7e,0x34,0x78,0x0, 0x12,0x3f,0xb2,0x7c,0x4b,0x7e,0x34,0x78,0x1, 0x12,0x3f,0xb2, +0xbe,0x40,0xff,0x68,0x7, 0x6c,0xb4,0xb4,0xff,0x2, 0x7c,0x54,0xd2,0xce,0x7a,0x51, +0x92,0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xd5,0xb7,0xd2, +0xbd,0x22,0x12,0x3f,0xe2,0x75,0xf5,0x1, 0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc, +0x2, 0x3f,0xc3,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xd2,0xaf,0x22,0x7e,0x34,0x0, +0x20,0x12,0x3f,0xe2,0x75,0xf5,0x3, 0xa9,0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0x2, +0x3f,0xc3,0xc2,0xaf,0xd2,0xc9,0xa, 0x56,0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3, +0x80,0x75,0xf4,0x0, 0x22,0x7e,0x24,0x0, 0x12,0x74,0xff,0x2, 0x3, 0x15,0x75,0x1c, +0x0, 0xc2,0x1, 0x7e,0xb3,0x4, 0x1a,0x70,0x7, 0x7e,0xb3,0x0, 0x5e,0xf5,0x1d,0x22, +0x7e,0xb3,0x0, 0x60,0xf5,0x1d,0x22,0x6c,0x77,0xa, 0x27,0x9, 0x62,0x0, 0xc1,0x19, +0x62,0x0, 0xc3,0xb, 0x70,0xbe,0x70,0x2, 0x40,0xef,0x7e,0x73,0x0, 0x55,0x12,0x40, +0x45,0x4c,0x7b,0x7a,0x73,0x0, 0x55,0x7e,0x73,0x0, 0x56,0x12,0x40,0x45,0x4c,0x7b, +0x7a,0x73,0x0, 0x56,0x22,0x5e,0x70,0xf, 0x7c,0xb7,0xc4,0x54,0xf0,0x22,0x7e,0x34, +0x0, 0x3b,0x7e,0x24,0x0, 0x1c,0xe4,0x12,0x3, 0x15,0x7e,0x34,0x0, 0x69,0x7e,0x24, +0x0, 0x17,0x12,0x3, 0x15,0x6d,0x11,0x12,0x40,0xb0,0x2e,0x34,0x0, 0x3f,0x12,0x40, +0xb7,0x12,0x40,0xb0,0x2e,0x34,0x0, 0x69,0x12,0x40,0xb7,0x12,0x40,0xb0,0x2e,0x34, +0x0, 0x73,0x12,0x40,0xb7,0xb, 0x14,0xbe,0x14,0x0, 0x2, 0x40,0xda,0x75,0x1c,0x0, +0x75,0x1d,0x0, 0xc2,0x1, 0x75,0x1b,0x0, 0x6d,0x33,0x7a,0x37,0x0, 0x80,0x7e,0x24, +0x7, 0xd0,0x7a,0x27,0x0, 0x39,0x7a,0x37,0x0, 0x64,0xe4,0x7a,0xb3,0x0, 0x82,0x22, +0x7e,0x34,0x0, 0x5, 0xad,0x31,0x22,0x7e,0x24,0x7f,0xff,0x1b,0x38,0x20,0x59,0x23, +0x0, 0x2, 0x74,0xff,0x19,0xb3,0x0, 0x4, 0x22,0xe4,0x7a,0xb3,0x0, 0xb5,0x74,0x1, +0x7a,0xb3,0x0, 0xba,0x74,0x1b,0x7a,0xb3,0x0, 0xa7,0x74,0x1d,0x7a,0xb3,0x0, 0xa8, +0x74,0x30,0x7a,0xb3,0x0, 0xa9,0x7a,0xb3,0x0, 0xaa,0x7a,0xb3,0x0, 0xab,0x7a,0xb3, +0x0, 0xac,0x7a,0xb3,0x0, 0xad,0x7a,0xb3,0x0, 0xae,0x7a,0xb3,0x0, 0xaf,0x7a,0xb3, +0x0, 0xb0,0x7a,0xb3,0x0, 0xb1,0x7a,0xb3,0x0, 0xb2,0x7a,0xb3,0x0, 0xb3,0x7a,0xb3, +0x0, 0xb4,0x12,0x41,0x2e,0x74,0xa, 0x7a,0xb3,0x0, 0xb9,0x74,0xf, 0x7a,0xb3,0x0, +0xb7,0x74,0x19,0x7a,0xb3,0x0, 0xb8,0x74,0x3, 0x7a,0xb3,0x0, 0xb6,0x22,0x12,0x3f, +0xcd,0xb4,0x48,0x3, 0xd2,0xc, 0x22,0xb4,0xff,0x11,0x7e,0x34,0x0, 0x20,0x74,0x48, +0x12,0x41,0x4c,0x12,0x3f,0xcd,0xb4,0x48,0x2, 0xd2,0xc, 0x22,0x7c,0xab,0x7d,0x43, +0x5e,0x80,0x7f,0xc2,0xaf,0xd2,0xc9,0xa, 0x38,0x7c,0xb7,0xf5,0xf1,0x7c,0xb9,0xf5, +0xf2,0x75,0xf3,0x80,0x75,0xf4,0x1, 0x75,0xf5,0xa, 0x75,0xfb,0xa5,0x75,0xfb,0xf, +0x75,0xfb,0x6a,0x7a,0xa1,0xf6,0x75,0xf6,0xff,0xa9,0x36,0xf5,0xfc,0x43,0xfa,0x80, +0x75,0xfb,0x0, 0xc2,0xc9,0xd2,0xaf,0x22,0x12,0x1f,0x5e,0x7a,0x37,0x0, 0x39,0x12, +0x42,0x8, 0x12,0x3d,0xca,0x12,0x40,0xc9,0x12,0x42,0x3f,0x7e,0xb3,0x4, 0x31,0x24, +0xfd,0x68,0x11,0x24,0xae,0x68,0x35,0x24,0xab,0x68,0xe, 0x24,0xa9,0x78,0xec,0x12, +0x10,0x3a,0x80,0xe7,0x12,0x1e,0x77,0x80,0xe2,0x6d,0x33,0x7a,0x37,0x0, 0x80,0x7e, +0x24,0x1, 0xf4,0x7a,0x27,0x0, 0x39,0x7e,0xb3,0x0, 0x82,0xbe,0xb0,0xaa,0x68,0xcb, +0x7a,0x37,0x0, 0x64,0x74,0xaa,0x7a,0xb3,0x0, 0x82,0x80,0xbf,0x6d,0x33,0x7a,0x37, +0x0, 0x80,0x7e,0x34,0x1, 0xf4,0x7a,0x37,0x0, 0x39,0x7e,0xb3,0x0, 0x82,0xb4,0xaa, +0xaa,0x74,0x55,0x7a,0xb3,0x0, 0x82,0x7e,0x74,0x3, 0xe8,0x7d,0x37,0x1b,0x74,0x4d, +0x33,0x78,0xf8,0x75,0xe9,0xff,0x80,0x93,0x12,0x42,0x28,0x2, 0x0, 0x27,0xc2,0x8e, +0xe5,0x89,0x54,0xf, 0x44,0x20,0xf5,0x89,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0xa9,0xc3,0xb7,0xd2,0xbb,0x22,0xe4,0x12,0x42,0x5e,0x12,0x42,0x46,0x12, +0x42,0x52,0x74,0x1, 0x2, 0x42,0x37,0x70,0x3, 0xc2,0xaf,0x22,0xd2,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x4, 0x31,0x22,0x75,0xeb,0x3, 0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2, +0x86,0x22,0xa9,0xd1,0x99,0x75,0x9a,0xfe,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xd2,0xcf, +0xbe,0xb0,0x7, 0x38,0x4, 0x7c,0xab,0x80,0x2, 0x6c,0xaa,0x4e,0xa0,0x50,0x7a,0xa1, +0xcc,0x0, 0x0, 0x0, 0x0, 0xa9,0xd0,0xca,0xa9,0xc5,0xca,0x53,0xca,0xe1,0x43,0xca, +0x14,0x75,0xcb,0x2, 0xc2,0xcc,0xd2,0xcb,0xc2,0xca,0xc2,0xc9,0xc2,0xc8,0x0, 0x0, +0x0, 0x0, 0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x7e,0x35,0x34,0xb, 0x34,0x7a,0x35,0x34,0xbe, +0x34,0x3, 0xe8,0x40,0xe, 0x6d,0x33,0x7a,0x35,0x34,0xe5,0x1b,0xbe,0xb0,0x64,0x50, +0x2, 0x5, 0x1b,0x7e,0x37,0x0, 0x80,0xb, 0x34,0x7a,0x37,0x0, 0x80,0x7e,0x37,0x0, +0x39,0xbe,0x37,0x0, 0x80,0x28,0x3, 0x12,0x0, 0x6, 0x7e,0xb3,0x4, 0x31,0xb4,0xaa, +0x15,0x7e,0x37,0x0, 0x64,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x0, 0x64,0xbe,0x34,0x1, +0x2c,0x28,0x3, 0x12,0x42,0x3f,0xe5,0x1d,0xbe,0xb1,0x1c,0x28,0x4, 0x5, 0x1c,0x80, +0x2, 0xd2,0x1, 0x7e,0xb3,0x4, 0xfb,0x60,0xf, 0xbe,0xb0,0x28,0x50,0x7, 0x4, 0x7a, +0xb3,0x4, 0xfb,0x80,0x3, 0x12,0x3d,0x6c,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x50,0xd8, +0x74,0x27,0x7a,0xb3,0x3, 0xf5,0x74,0xa0,0x7a,0xb3,0x3, 0xfa,0x74,0x1, 0x7a,0xb3, +0x3, 0xfb,0x74,0x1e,0x7a,0xb3,0x3, 0xfc,0x74,0x8, 0x7a,0xb3,0x3, 0xfd,0x74,0x14, +0x7a,0xb3,0x3, 0xfe,0x74,0x6, 0x7a,0xb3,0x4, 0x18,0x74,0x1, 0x7a,0xb3,0x4, 0x19, +0xe4,0x7a,0xb3,0x4, 0x1a,0x74,0x11,0x7a,0xb3,0x4, 0x1b,0x12,0x42,0x3f,0x7e,0x34, +0x78,0x4, 0x12,0x3f,0xb2,0x7c,0x4b,0x7e,0x34,0x78,0x5, 0x12,0x3f,0xb2,0xbe,0x40, +0xff,0x68,0x7, 0x6c,0xb4,0xb4,0xff,0x2, 0x7c,0x54,0x7a,0x53,0x4, 0x1d,0x74,0x3c, +0x7a,0xb3,0x4, 0x1e,0x74,0x1, 0x7a,0xb3,0x4, 0x24,0xe4,0x7a,0xb3,0x4, 0x23,0x7a, +0xb3,0x4, 0x25,0x7e,0x34,0x9, 0xc4,0x7a,0x37,0x0, 0xbf,0x7e,0x34,0xa, 0x0, 0x7a, +0x37,0x0, 0x66,0x74,0xa0,0x7a,0xb3,0x0, 0x68,0x6d,0x33,0x7a,0x37,0x0, 0x5b,0x74, +0x1, 0x7a,0xb3,0x0, 0x5d,0x74,0xc, 0x7a,0xb3,0x0, 0x5e,0x74,0x8, 0x7a,0xb3,0x0, +0x5f,0x74,0x14,0x7a,0xb3,0x0, 0x60,0x7a,0xb3,0x0, 0x61,0x74,0x1e,0x7a,0xb3,0x0, +0x62,0x74,0x1, 0x7a,0xb3,0x0, 0x63,0x22,0x7c,0x3b,0x4d,0x33,0x78,0x2, 0x81,0xcc, +0x4d,0x22,0x78,0x2, 0x81,0xcc,0xe4,0x7a,0xb3,0x2, 0x3d,0x6c,0xaa,0x80,0x74,0x12, +0x44,0xcd,0x49,0xf4,0x0, 0x2, 0xb, 0x48,0xe0,0xbe,0x7c,0xf8,0x30,0x58,0x5, 0xbe, +0xa0,0x20,0x40,0x15,0xbe,0x7c,0xf2,0x54,0x58,0x50,0xbe,0xa0,0x20,0x40,0x4b,0x7e, +0x7f,0x1, 0xa5,0xbe,0x78,0xb, 0xb8,0x58,0x41,0xa, 0xa, 0x9, 0xb0,0x4, 0x7a,0xbe, +0xb0,0xfa,0x50,0xa, 0x7d,0xf0,0x2e,0xf4,0x4, 0x7a,0x4, 0x7a,0xf9,0xb0,0x9, 0x20, +0x4, 0x7a,0xbe,0x20,0xf, 0x28,0x2a,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, +0xd0,0x6d,0xcc,0x49,0xf4,0x0, 0x2, 0xb, 0x48,0xe0,0x2f,0x76,0xbe,0x78,0x32,0xc8, +0x58,0xf, 0x74,0x1, 0x7a,0xb3,0x2, 0x3d,0x80,0x7, 0xe4,0xa, 0x4a,0x19,0xb4,0x4, +0x7a,0xb, 0xa0,0xbc,0x3a,0x38,0x88,0x6c,0xaa,0x80,0x49,0x7e,0x50,0x4, 0xac,0x5a, +0x2d,0x23,0x49,0x12,0x0, 0x2, 0xb, 0x28,0x0, 0xbe,0xc, 0xfd,0x6c,0x58,0x2c,0x7e, +0xb3,0x2, 0x3d,0x70,0x26,0xa, 0x2a,0x9, 0xb2,0x4, 0x56,0xbe,0xb0,0xfa,0x50,0xa, +0x7d,0x42,0x2e,0x44,0x4, 0x56,0x4, 0x7a,0x49,0xb0,0x9, 0xb2,0x4, 0x56,0xbe,0xb0, +0x14,0x28,0xf, 0x74,0x2, 0x7a,0xb3,0x2, 0x3d,0x80,0x7, 0xe4,0xa, 0x2a,0x19,0xb2, +0x4, 0x56,0xb, 0xa0,0x7e,0xb3,0x2, 0x57,0xbc,0xba,0x38,0xaf,0x22,0x7e,0x90,0x4, +0xac,0x9a,0x2d,0x43,0x22,0xca,0xf8,0x6c,0xff,0x6c,0xaa,0x4c,0xaa,0x78,0x4, 0x9f, +0x44,0x80,0xc, 0x12,0x45,0x4a,0x1b,0x16,0x49,0x91,0x0, 0x2, 0xb, 0x18,0x80,0xbe, +0xa0,0x7, 0x78,0x4, 0x9f,0x55,0x80,0xb, 0x12,0x45,0x4a,0x49,0xb1,0x0, 0x6, 0x49, +0xa1,0x0, 0x4, 0x12,0x44,0xcd,0x49,0x14,0x0, 0x2, 0xb, 0x48,0x0, 0xbf,0x4, 0x48, +0x2a,0xbf,0x5, 0x48,0x26,0x49,0x14,0x0, 0x2, 0xb, 0x48,0x0, 0xbe,0x8, 0x5, 0xdc, +0x48,0x19,0x49,0x14,0x0, 0x2, 0xb, 0x48,0x0, 0xb, 0xc, 0x59,0x14,0x0, 0x2, 0x1b, +0x48,0x0, 0xa, 0x1f,0x2d,0x12,0x7a,0x19,0xa0,0xb, 0xf0,0xb, 0xa0,0xbe,0xa0,0x8, +0x40,0x99,0x12,0x45,0x52,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x30,0x4, 0xac,0x3a,0x2d, +0x13,0x22,0xca,0x3b,0x6c,0xaa,0x7e,0x73,0x0, 0x55,0x5e,0x70,0xf, 0x7e,0x44,0x0, +0xcd,0x7e,0x24,0x0, 0x3b,0x6c,0x66,0x80,0x64,0x75,0x8, 0xff,0xa, 0xf6,0x2d,0xf2, +0x7e,0xf9,0x20,0x7e,0x30,0x4, 0xac,0x23,0x7d,0xe1,0x2d,0xe4,0x49,0x1e,0x0, 0x2, +0xb, 0xe8,0x0, 0xa, 0x76,0xb, 0x74,0x80,0x24,0xa, 0xef,0x2d,0xe2,0x7e,0xe9,0xe0, +0x7e,0xd0,0x4, 0xac,0xde,0x7d,0xe6,0x2d,0xe4,0x49,0xde,0x0, 0x2, 0xb, 0xe8,0xc0, +0xbf,0x6, 0x58,0x7, 0x7c,0xae,0x7a,0xf1,0x8, 0x7f,0x6, 0xb, 0xf0,0xbc,0x7f,0x38, +0xd8,0xe5,0x8, 0xbe,0xb0,0xff,0x68,0x13,0x7e,0xf9,0xe0,0xe5,0x8, 0xa, 0xfb,0x2d, +0xf2,0x7a,0xf9,0xe0,0xa, 0xf6,0x2d,0xf2,0x7a,0xf9,0xa0,0xb, 0x60,0xbc,0x76,0x38, +0x98,0xda,0x3b,0x22,0x12,0xb, 0xbf,0x68,0xd, 0x7e,0x34,0x2, 0x11,0x7e,0xb3,0x0, +0x3b,0x6c,0x55,0x2, 0x45,0xe7,0x22,0x7d,0x13,0xa, 0x3b,0x2d,0x31,0x7a,0x39,0x50, +0x22,0x7d,0x3, 0x7d,0x50,0x1a,0x4a,0x1a,0x48,0x7e,0x1f,0x1, 0x4d,0xbf,0x21,0x18, +0xb, 0x7e,0x34,0x2, 0x11,0x74,0x20,0x6c,0x55,0x12,0x45,0xe7,0x7d,0x50,0x1a,0x4a, +0x1a,0x48,0x7e,0x1f,0x1, 0x51,0xbf,0x21,0x18,0xb, 0x7e,0x34,0x2, 0x11,0x74,0x21, +0x6c,0x55,0x12,0x45,0xe7,0x7d,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x1f,0x1, 0x55,0xbf, +0x1, 0x18,0xb, 0x7e,0x34,0x2, 0x11,0x74,0x22,0x6c,0x55,0x2, 0x45,0xe7,0x22,0x7e, +0xb3,0x2, 0x55,0x20,0xe1,0x45,0x7e,0xa3,0x4, 0x1e,0x4c,0xaa,0x68,0x2a,0xbe,0xa0, +0xff,0x68,0x25,0x74,0x28,0xa4,0x7d,0xf5,0xbe,0xf4,0x9, 0x60,0x58,0x4, 0x7e,0xf4, +0x9, 0x60,0x12,0x37,0x25,0xb4,0x1, 0x14,0x7e,0xe7,0x0, 0x6b,0xbe,0xe4,0x3, 0x84, +0x78,0xa, 0x7e,0xf4,0x8, 0x98,0x80,0x4, 0x7e,0xf4,0x9, 0x60,0x7d,0x3f,0x12,0x45, +0xf1,0x12,0x46,0x8c,0x40,0x5, 0x7d,0x3f,0x2, 0x26,0x89,0x22,0x7e,0xf, 0x1, 0x51, +0x7e,0x1f,0x1, 0x4d,0x2f,0x10,0x7e,0xf, 0x1, 0x55,0x2f,0x1, 0x7e,0x1f,0x1, 0xa5, +0xbf,0x10,0x58,0xc, 0x20,0xd, 0x9, 0x12,0x27,0x69,0x7a,0xb3,0x0, 0x55,0xc3,0x22, +0x12,0xb, 0xbf,0x68,0x2, 0xd2,0xd, 0xd3,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xe5,0xcc,0x54, +0x7, 0x68,0x3, 0x75,0xcc,0x50,0x12,0x3b,0x9f,0x74,0x1, 0x7a,0xb3,0x4, 0xfb,0xd0, +0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda, +0x6b,0xda,0x7b,0x32,0x7c,0xa7,0x24,0x0, 0x78,0x7, 0x7e,0x34,0x4, 0xfe,0x7a,0x39, +0xa0,0x22,0xca,0xb8,0xa9,0xc0,0x93,0xe4,0x7a,0xb3,0x4, 0xfa,0x7a,0xb3,0x4, 0xfc, +0xda,0xb8,0x32,0x7e,0x34,0x4, 0xd6,0x12,0x3f,0xf5,0x7e,0x34,0x4, 0xe8,0x7e,0x24, +0x0, 0x12,0x2, 0x3, 0x15,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca, +0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0xf, 0xfa,0x7e,0xb3,0x4, 0xfe, +0x54,0xfd,0x7a,0xb3,0x4, 0xfe,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x24,0x0, 0x14,0xad, +0x32,0x80,0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d,0x23,0x1b,0x34,0x4d, +0x22,0x78,0xf0,0x22,0x7c,0xab,0x80,0x7, 0x7e,0x34,0x0, 0x42,0x12,0x47,0x5b,0x7c, +0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xf1,0x22,0x7c,0xa6,0xa, 0x27,0xa, 0x3b,0x9d,0x32, +0x12,0x3, 0x5, 0xa, 0x2a,0xbd,0x32,0x18,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7f,0x60, +0x7f,0x71,0x7e,0x14,0x0, 0x74,0x7f,0x17,0x12,0x0, 0x89,0x74,0x7, 0x7f,0x51,0x1e, +0xb4,0x1e,0xa4,0x50,0x4, 0x4e,0xb4,0x80,0x0, 0x14,0x78,0xf3,0x7e,0x14,0x0, 0x54, +0x7f,0x17,0x12,0x0, 0x89,0x7f,0x1, 0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e, +0x60,0x80,0x14,0x78,0xf4,0xbf,0x65,0x8, 0x3, 0x74,0x80,0x22,0xbf,0x61,0x58,0x2, +0xe4,0x22,0x74,0x9, 0x7f,0x16,0x2f,0x11,0x14,0x78,0xfb,0x2f,0x0, 0x2f,0x0, 0x9f, +0x10,0x7f,0x7, 0x12,0x0, 0x94,0x7c,0xb7,0x22,0xca,0xf8,0x7c,0xfb,0x7f,0x40,0x7a, +0x1d,0xc, 0x7e,0x30,0xff,0xbe,0x48,0x0, 0x0, 0x8, 0x50,0x7e,0x1d,0x10,0xbe,0x18, +0x0, 0x0, 0x8, 0x47,0xbf,0x41,0x8, 0x20,0x7e,0x1d,0xc, 0x7f,0x4, 0x12,0x48,0xeb, +0x1a,0x1f,0x1b,0x15,0x7e,0x23,0x5, 0x79,0xbc,0x2f,0x68,0x2c,0xa, 0x22,0xb, 0x24, +0xa, 0x3f,0xbd,0x32,0x78,0x25,0x80,0x20,0x7e,0x1d,0xc, 0x7e,0xd, 0x10,0x12,0x48, +0xeb,0xa, 0x1f,0xb, 0x15,0x7e,0x23,0x5, 0x79,0x7c,0xb2,0x24,0xfe,0xbc,0xbf,0x68, +0x7, 0x7c,0xb2,0x14,0xbc,0xbf,0x78,0x3, 0x7e,0x30,0xff,0x7e,0x23,0x5, 0x78,0xbc, +0x23,0x8, 0x5, 0xbe,0x30,0x0, 0x58,0xa, 0xe4,0x7a,0xb3,0x5, 0x76,0x12,0x1f,0x70, +0x80,0x74,0x6c,0x22,0x80,0x65,0xe5,0x15,0xbc,0xb2,0x68,0x5d,0xa, 0x2, 0x9, 0x10, +0x0, 0x3b,0x7e,0xa3,0x5, 0x78,0x7c,0xb1,0x84,0x7c,0x1a,0x7e,0x3, 0x5, 0x79,0xbc, +0x3, 0x8, 0x8, 0x7e,0x73,0x5, 0x79,0xbc,0x71,0x38,0xc, 0xbc,0x3, 0x18,0x3a,0x7e, +0x3, 0x5, 0x79,0xbc,0x1, 0x38,0x32,0x7c,0xb3,0x7c,0x71,0x7e,0x60,0x1, 0x12,0x47, +0x88,0xb4,0x1, 0x25,0xbc,0x13,0x78,0x17,0x7e,0x1d,0x10,0xbf,0x41,0x1a,0x33,0x8, +0x4, 0xb, 0x34,0x80,0x2, 0x1b,0x34,0x7c,0x27,0x7a,0x23,0x5, 0x77,0x80,0x3, 0x12, +0x1f,0x70,0xe4,0x7a,0xb3,0x5, 0x76,0x80,0xd, 0xb, 0x20,0x12,0xb, 0xbf,0xa, 0x2b, +0xa, 0x32,0xbd,0x32,0x48,0x90,0x7c,0xb3,0xda,0xf8,0x22,0x12,0x47,0x9e,0x7a,0xb3, +0x5, 0x76,0x22,0x7e,0x73,0x2, 0x57,0xa, 0x37,0x1e,0x34,0x7a,0x73,0x5, 0x78,0xa, +0x37,0x1e,0x34,0x7a,0x73,0x5, 0x79,0x22,0xca,0x3b,0x7c,0x27,0x7c,0x3b,0x7e,0x93, +0x5, 0x79,0xa, 0xa9,0xa, 0x83,0x12,0x4a,0x25,0x7c,0x15,0xa, 0x92,0x7d,0x39,0x7d, +0x2a,0x12,0x4a,0x3c,0x7e,0xa3,0x5, 0x78,0xa, 0xaa,0x12,0x4a,0x25,0x7c,0x5, 0x7d, +0x39,0x7d,0x2a,0x12,0x0, 0x46,0x7c,0x25,0xbc,0x81,0x78,0x4f,0x7e,0xd0,0x4, 0xac, +0xd0,0x49,0xd6,0x1, 0x5f,0x49,0xc6,0x1, 0x5d,0x7e,0xf0,0x4, 0xac,0xf2,0x49,0xf7, +0x1, 0x5f,0x49,0xe7,0x1, 0x5d,0x4c,0x11,0x68,0x14,0x49,0x36,0x1, 0x5b,0x49,0x26, +0x1, 0x59,0x2f,0x61,0x49,0x37,0x1, 0x5b,0x49,0x27,0x1, 0x59,0x2f,0x71,0x7c,0xb9, +0x14,0xbc,0xb1,0x68,0x78,0x7e,0x10,0x4, 0xac,0x1, 0x12,0x4a,0x2c,0x2f,0x61,0x7e, +0x10,0x4, 0xac,0x12,0x12,0x4a,0x2c,0x2f,0x71,0x80,0x62,0xa, 0x31,0xa, 0xa0,0x9d, +0xa3,0x7d,0x3a,0x7c,0x7, 0xe5,0x8, 0xa, 0x3b,0xa, 0xa2,0x9d,0xa3,0x7d,0x3a,0x7c, +0x27,0xe5,0x8, 0xa, 0x3b,0xa, 0x20,0x2d,0x23,0x3e,0x24,0x3e,0x24,0x49,0xf2,0x1, +0x5f,0x49,0xe2,0x1, 0x5d,0xa, 0xa1,0xa, 0x20,0x2d,0x2a,0x3e,0x24,0x3e,0x24,0x49, +0xd2,0x1, 0x5f,0x49,0xc2,0x1, 0x5d,0x2f,0x67,0xa, 0xa2,0x2d,0xa3,0x3e,0xa4,0x3e, +0xa4,0x49,0x3a,0x1, 0x5f,0x49,0x2a,0x1, 0x5d,0xa, 0x1, 0xa, 0xa2,0x2d,0xa0,0x3e, +0xa4,0x3e,0xa4,0x49,0xfa,0x1, 0x5f,0x49,0xea,0x1, 0x5d,0x2f,0x71,0xb, 0x6c,0xb, +0x7c,0xbc,0xa3,0x7e,0x17,0x2, 0x3b,0x1a,0x2, 0x38,0x6, 0x1a,0x0, 0x7f,0x17,0x80, +0x4, 0x1a,0x0, 0x7f,0x16,0x12,0x0, 0x78,0x7f,0x6, 0x2f,0x7, 0x12,0x0, 0xe5,0x7d, +0xb3,0x7e,0x37,0x2, 0x3b,0x12,0x4a,0x35,0x7e,0xa7,0x1, 0xfd,0x9d,0xa3,0x2d,0xba, +0x7d,0x3b,0xda,0x3b,0x22,0x7d,0x38,0x7d,0x2a,0x2, 0x0, 0x46,0x49,0x30,0x1, 0x63, +0x49,0x20,0x1, 0x61,0x22,0x7e,0x24,0x0, 0x2, 0x2, 0x0, 0x46,0x12,0x0, 0x46,0x7c, +0x85,0x7a,0x81,0x8, 0x22,0x7c,0xab,0x9f,0x66,0x7f,0x56,0x7e,0x78,0x0, 0x1, 0x7e, +0x33,0x5, 0x79,0xa, 0x23,0xa, 0x3a,0x12,0x0, 0x46,0x7c,0x75,0x4c,0x77,0x68,0xd, +0x7e,0x50,0x4, 0xac,0x5a,0x49,0xb2,0x0, 0xcb,0x49,0xa2,0x0, 0xc9,0x7c,0xb3,0x14, +0xbc,0xb7,0x68,0xd, 0x7e,0x70,0x4, 0xac,0x7a,0x49,0xd3,0x0, 0xd3,0x49,0xc3,0x0, +0xd1,0x74,0x4, 0xa4,0x12,0x13,0xd9,0x12,0x4a,0x9d,0x2f,0x71,0x7f,0x15,0x12,0x4a, +0x9d,0x2f,0x71,0x7f,0x16,0x12,0x4a,0x9d,0x2f,0x71,0x7f,0x17,0x22,0x7f,0x1, 0x7e, +0x37,0x1, 0xf1,0x12,0x18,0xf7,0x8, 0x3, 0x7f,0x10,0x22,0x9f,0x11,0x22,0x53,0xe1, +0xf, 0x7e,0x73,0x2, 0xac,0x7c,0xb7,0x1e,0xb0,0x1e,0xb0,0x54,0x1, 0xa, 0x2b,0x12, +0x4b,0x7e,0x7c,0xb5,0x42,0xe1,0x7c,0xb7,0x30,0xe2,0x58,0x7c,0xb7,0xc4,0x23,0x7c, +0x7b,0x5e,0x70,0x7, 0xa5,0xbf,0x0, 0x5, 0x7e,0x60,0x4, 0x80,0x39,0xa5,0xbf,0x1, +0x11,0x7e,0xb3,0x2, 0xa4,0x30,0xe1,0x5, 0x7e,0x60,0x2, 0x80,0x29,0x7e,0x60,0x5, +0x80,0x24,0xa5,0xbf,0x3, 0x11,0x7e,0xb3,0x2, 0xa4,0x30,0xe1,0x5, 0x7e,0x60,0x7, +0x80,0x14,0x7e,0x60,0x6, 0x80,0xf, 0x7e,0xb3,0x2, 0xa4,0x30,0xe1,0x5, 0x7e,0x60, +0x3, 0x80,0x3, 0x7e,0x60,0x1, 0xa, 0x26,0x3e,0x24,0x12,0x4b,0x7e,0x7c,0x75,0x7c, +0xb7,0x42,0xe1,0x74,0x7, 0x7e,0x73,0x2, 0x57,0x12,0xf, 0xcb,0x74,0x8, 0x7e,0x73, +0x2, 0x58,0x12,0xf, 0xcb,0x74,0x9, 0x6c,0x77,0x12,0xf, 0xcb,0x6c,0xaa,0x80,0xf, +0x7c,0xba,0x24,0x2f,0xa, 0x4a,0x9, 0x74,0x2, 0x5a,0x12,0xf, 0xcb,0xb, 0xa0,0x7e, +0x73,0x2, 0x59,0xbc,0x7a,0x38,0xe9,0x7c,0xa7,0x80,0xc, 0x7c,0xba,0x24,0x2f,0x7e, +0x70,0x3f,0x12,0xf, 0xcb,0xb, 0xa0,0xbe,0xa0,0x24,0x40,0xef,0x74,0x56,0x7e,0x73, +0x2, 0xa8,0x12,0xf, 0xcb,0x74,0x57,0x7e,0x73,0x2, 0xa9,0x2, 0xf, 0xcb,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xca,0xf8,0x7c,0xfb,0x4c,0x77,0x68,0xf, 0xc2, +0xaf,0x43,0xe1,0x1, 0x7e,0x37,0x2, 0x5, 0x99,0x34,0xd2,0xaf,0x80,0x3, 0x43,0xe1, +0x1, 0xc2,0x9, 0x2e,0xf0,0xff,0x92,0xa, 0xd2,0xae,0xa9,0xd6,0xb7,0xc2,0xbe,0xda, +0xf8,0x22,0xca,0x59,0xc2,0xae,0x30,0xa, 0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e,0xa0, +0x2, 0xe5,0xe6,0x5c,0xba,0x68,0x5, 0x75,0xe6,0x0, 0xd2,0x9, 0xd2,0xae,0xda,0x59, +0x32,0xca,0xd8,0xca,0x79,0x12,0xb, 0xbf,0x7c,0xb, 0x78,0x2f,0x6c,0x11,0x6d,0x11, +0x74,0x2, 0xac,0xb1,0x59,0x15,0x5, 0x57,0x7e,0xa0,0xff,0x7e,0x30,0x5, 0xac,0x31, +0x19,0xa1,0x5, 0x51,0x7e,0xb3,0x5, 0x5d,0x70,0x3, 0xe4,0x80,0x2, 0x74,0x2, 0xa, +0x11,0x19,0xb1,0x5, 0x5b,0xb, 0x10,0xa5,0xb9,0x2, 0xd3,0x6c,0x11,0xa1,0x1a,0x74, +0x5, 0xac,0xb1,0x9, 0xf5,0x0, 0x43,0xbe,0xf0,0x2, 0x40,0x2, 0xa1,0x18,0xa, 0x1f, +0x9, 0xb1,0x0, 0xc1,0xbe,0xb0,0x1, 0x78,0x2, 0xa1,0x18,0x6c,0xee,0x74,0x5, 0xac, +0xbe,0x9, 0xd5,0x5, 0x51,0xbc,0xdf,0x68,0x2, 0xa1,0xf, 0x49,0x25,0x5, 0x4f,0x74, +0x5, 0xac,0xb1,0x12,0x7, 0x76,0x7d,0x43,0x74,0x5, 0xac,0xbe,0x49,0x25,0x5, 0x4d, +0x74,0x5, 0xac,0xb1,0x12,0xb, 0xb6,0x2d,0x43,0xa, 0x1d,0x9, 0xa1,0x5, 0x5b,0xbe, +0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3d,0x59,0x41,0x5, 0x57,0xa, 0x1d,0x2e, +0x14,0x5, 0x5b,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1,0x18,0x7e,0x30,0x2, 0xac,0x3d, +0x49,0x31,0x5, 0x57,0xbe,0x34,0x0, 0x32,0x28,0x8, 0xbe,0x44,0x0, 0x32,0x28,0x2, +0x80,0x10,0x7d,0x23,0x2e,0x24,0x0, 0x32,0xbd,0x24,0x50,0x12,0xbe,0x34,0x0, 0x32, +0x28,0xc, 0x59,0x41,0x5, 0x57,0x74,0x1, 0x7a,0xb3,0x5, 0x5d,0x80,0x6a,0xbe,0x44, +0x0, 0xc8,0x28,0x51,0xe4,0x7a,0xb3,0x5, 0x5d,0xa, 0x1f,0x9, 0xb1,0x0, 0xc1,0x70, +0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1f,0x19,0xb1,0x0, 0xc1,0x7e,0x70,0x5, +0xac,0x71,0x2e,0x34,0x0, 0x3f,0x7e,0x14,0x2, 0xaf,0x74,0x5, 0x12,0x1, 0x19,0xbe, +0x0, 0x0, 0x28,0x21,0x1b,0x0, 0x7e,0x70,0x5, 0xac,0x70,0x2e,0x34,0x0, 0x3f,0x7e, +0x30,0x5, 0xac,0x31,0x12,0x4d,0x50,0x7e,0x34,0x2, 0xaf,0x7e,0x30,0x5, 0xac,0x30, +0x12,0x4d,0x50,0x1b,0x10,0x74,0x2, 0xac,0xbd,0x59,0x45,0x5, 0x57,0x80,0x9, 0xb, +0xe0,0xbe,0xe0,0x2, 0x50,0x2, 0x81,0x2d,0xb, 0x10,0x12,0x4d,0x59,0x54,0xf, 0xa, +0x5b,0xa, 0x11,0xbd,0x15,0x58,0x2, 0x81,0xf, 0x7c,0x60,0x12,0x26,0x7c,0x6c,0x11, +0x7e,0x30,0x5, 0xac,0x31,0x7d,0x31,0x2e,0x34,0x0, 0x3f,0x2e,0x14,0x5, 0x4d,0x74, +0x5, 0x12,0x1, 0x19,0xb, 0x10,0xbe,0x10,0x2, 0x40,0xe5,0xda,0x79,0xda,0xd8,0x22, +0x2e,0x14,0x0, 0x3f,0x74,0x5, 0x2, 0x1, 0x19,0x7e,0x73,0x0, 0x55,0x7c,0xb7,0x22, +0xca,0x79,0x7e,0x23,0x0, 0x55,0x5e,0x20,0xf, 0x6c,0xaa,0xc1,0x0, 0x7e,0x70,0x5, +0xac,0x7a,0x49,0xf3,0x0, 0x3f,0x7e,0x4, 0x0, 0xf, 0x7d,0x40,0x9e,0xf4,0x0, 0x20, +0xbd,0x4f,0x38,0xa, 0x7e,0x24,0x1, 0xc0,0x9d,0x20,0xbd,0x2f,0x50,0x42,0x7e,0x53, +0x0, 0x55,0x7c,0xb5,0xc4,0x7c,0x3b,0x5e,0x30,0xf, 0x7c,0xb5,0x54,0xf, 0xbc,0xb3, +0x78,0x27,0xa5,0xba,0x1, 0x23,0x7e,0xf0,0x4, 0xac,0xfa,0x49,0x27,0x5, 0x5e,0xbe, +0x24,0x7f,0xff,0x68,0x14,0x49,0xe7,0x5, 0x60,0xbe,0xe4,0x7f,0xff,0x68,0xa, 0x59, +0x23,0x0, 0x3f,0x59,0xe3,0x0, 0x41,0x80,0x7, 0x7c,0xba,0x7c,0x72,0x12,0x4e,0x13, +0x12,0x4d,0x59,0xc4,0x7c,0x3b,0x5e,0x30,0xf, 0x7c,0xb7,0x54,0xf, 0xbc,0xb3,0x68, +0x9, 0x7e,0xe4,0x7f,0xff,0x12,0x4e,0x9, 0x80,0x10,0x7e,0x50,0x5, 0xac,0x5a,0x49, +0xe2,0x0, 0x3f,0x12,0x4e,0x9, 0x49,0xe2,0x0, 0x41,0x59,0xe3,0x5, 0x60,0xb, 0xa0, +0xbc,0x2a,0x28,0x2, 0xa1,0x6d,0xda,0x79,0x22,0x7e,0x70,0x4, 0xac,0x7a,0x59,0xe3, +0x5, 0x5e,0x22,0x7c,0x6b,0x7e,0x53,0x0, 0x55,0x7c,0xb5,0x54,0xf, 0x68,0x10,0x7c, +0x45,0x1b,0x40,0x5e,0x40,0xf, 0x5e,0x50,0xf0,0x4c,0x54,0x7a,0x53,0x0, 0x55,0xa5, +0xbe,0x0, 0x1c,0xa5,0xbf,0x2, 0x18,0x7e,0x73,0x0, 0x3c,0x7a,0x73,0x0, 0x3b,0x7e, +0x1f,0x0, 0x45,0x7e,0x33,0x0, 0x44,0x7a,0x1f,0x0, 0x40,0x7a,0x33,0x0, 0x3f,0x22, +0x6c,0xaa,0x7e,0x90,0x5, 0xac,0x9a,0x9, 0xb4,0x0, 0x6d,0xbe,0xb0,0xff,0x68,0xa, +0x49,0x34,0x0, 0x6b,0xbe,0x34,0x3, 0x1f,0x50,0x33,0xb, 0xa0,0xbe,0xa0,0x2, 0x40, +0xe1,0x12,0x4d,0x59,0x54,0xf, 0x78,0x20,0x7c,0xb7,0xc4,0x7c,0x6b,0x5e,0x60,0xf, +0xbe,0x60,0x0, 0x28,0x13,0xe5,0x38,0xbe,0xb0,0x1, 0x50,0x8, 0x12,0x26,0x7f,0xd2, +0x3, 0x5, 0x38,0x22,0x75,0x38,0x0, 0x22,0x75,0x38,0x0, 0xc2,0x3, 0x22,0x6c,0xaa, +0x74,0x3, 0xa, 0x4a,0x19,0xb4,0x0, 0xc3,0x19,0xb4,0x0, 0xc1,0x12,0x4e,0xbc,0xac, +0x7a,0x12,0x4e,0xc4,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xe5,0x22,0x7e,0x44,0x7f,0xff, +0x7e,0x70,0x2, 0x22,0x59,0x43,0x0, 0xc5,0x59,0x43,0x0, 0xc9,0x22,0xe4,0x7a,0xb3, +0x4, 0xd4,0x7a,0xb3,0x4, 0x9f,0x22,0xca,0xf8,0x7e,0xd5,0x2f,0x9, 0xfd,0x0, 0x1a, +0x5e,0xf0,0xf, 0x78,0x8, 0x12,0x4e,0xcd,0x12,0x4f,0xba,0x80,0x55,0xbe,0xf0,0x1, +0x78,0x1a,0x7e,0x73,0x4, 0xcd,0xbe,0x70,0x3, 0x50,0x5, 0x12,0x4e,0xcd,0x80,0x9, +0x12,0x4f,0xb2,0x28,0x4, 0xe4,0x12,0x4f,0x45,0xe4,0x80,0x33,0xbe,0xf0,0x2, 0x78, +0x31,0x7e,0x73,0x4, 0x9e,0xbe,0x70,0x3, 0x50,0x8, 0x12,0x4e,0xcd,0x12,0x4f,0xba, +0x80,0x17,0x12,0x4f,0xb2,0x28,0x4, 0xe4,0x12,0x4f,0x45,0x7e,0x73,0x4, 0xd5,0xbe, +0x70,0x3, 0x28,0x5, 0x74,0x1, 0x12,0x4f,0x45,0xe4,0x12,0x4f,0xcc,0x74,0x1, 0x12, +0x4f,0xcc,0xda,0xf8,0x22,0x7c,0xab,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x23,0x4, 0xa1, +0x12,0x4f,0xa9,0x49,0x33,0x0, 0x4, 0x12,0x4f,0xc4,0x7e,0x70,0x4, 0xac,0x7a,0x49, +0x23,0x4, 0xa3,0x12,0x4f,0xa9,0x49,0x33,0x0, 0x6, 0x9d,0x32,0x12,0x3, 0x5, 0xbe, +0x44,0x0, 0x14,0x58,0x33,0xbe,0x34,0x0, 0x1e,0x58,0x2d,0xa, 0x3a,0x9, 0xb3,0x4, +0x9f,0x60,0x25,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x43,0x4, 0xa1,0x12,0x4f,0xa9,0x59, +0x43,0x0, 0x4, 0x7e,0x70,0x4, 0xac,0x7a,0x49,0x33,0x4, 0xa3,0x7e,0x50,0x5, 0xac, +0x5a,0x2e,0x25,0x2f,0x59,0x32,0x0, 0x6, 0x22,0x7e,0x70,0x5, 0xac,0x7a,0x2e,0x35, +0x2f,0x22,0x7e,0x73,0x4, 0xd4,0xbe,0x70,0x3, 0x22,0xe4,0x7a,0xb3,0x4, 0xd5,0x7a, +0xb3,0x4, 0xa0,0x22,0x9d,0x32,0x12,0x3, 0x5, 0x7d,0x43,0x22,0xca,0xf8,0x7c,0xfb, +0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0xa1,0x12,0x52,0x43,0x49,0x33,0x0, 0x4, 0x9d, +0x32,0x12,0x3, 0x5, 0x7d,0x13,0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0xa3,0x12,0x52, +0x43,0x49,0x33,0x0, 0x6, 0x9d,0x32,0x12,0x3, 0x5, 0xbe,0x14,0x0, 0xa, 0x58,0x22, +0xbe,0x34,0x0, 0xf, 0x58,0x1c,0xa, 0x3f,0x7d,0x23,0x2e,0x24,0x4, 0xd4,0x7e,0x29, +0xb0,0x4, 0x7a,0x29,0xb0,0x9, 0x53,0x4, 0xd4,0xbe,0x50,0x20,0x28,0x20,0x74,0x20, +0x80,0xc, 0xa, 0x3f,0x9, 0xa3,0x4, 0xd4,0xbe,0xa0,0x3, 0x38,0x7, 0xe4,0x19,0xb3, +0x4, 0xd4,0x80,0xa, 0x2e,0x34,0x4, 0xd4,0x7c,0xba,0x14,0x7a,0x39,0xb0,0xa, 0x3f, +0x2e,0x35,0x2f,0x7e,0x39,0xb0,0x12,0x37,0x7c,0x60,0xa, 0x74,0x78,0xa, 0x3f,0x19, +0xb3,0x4, 0x9f,0x80,0x13,0xa, 0x3f,0x9, 0xb3,0x4, 0x9f,0xbe,0xb0,0x0, 0x28,0x8, +0x2e,0x34,0x4, 0x9f,0x14,0x7a,0x39,0xb0,0x7e,0x90,0x5, 0xac,0x9f,0x2e,0x45,0x2f, +0x49,0x34,0x0, 0x4, 0x74,0x4, 0xac,0xbf,0x59,0x35,0x4, 0xa1,0x49,0x34,0x0, 0x6, +0x59,0x35,0x4, 0xa3,0xda,0xf8,0x22,0x7e,0x45,0x2f,0x9, 0xa4,0x0, 0x1a,0x5e,0xa0, +0xf, 0x78,0x7, 0xe4,0x7a,0xb3,0x4, 0xcd,0x80,0x3d,0xbe,0xa0,0x1, 0x78,0x1f,0xe4, +0x7a,0xb3,0x4, 0x9e,0x7e,0xb3,0x4, 0xcd,0x4, 0x7a,0xb3,0x4, 0xcd,0x7e,0x73,0x4, +0xcd,0xbe,0x70,0xc8,0x28,0x25,0x74,0xc8,0x7a,0xb3,0x4, 0xcd,0x80,0x1d,0xe4,0x7a, +0xb3,0x4, 0xcd,0x7e,0xb3,0x4, 0x9e,0x4, 0x7a,0xb3,0x4, 0x9e,0x7e,0x73,0x4, 0x9e, +0xbe,0x70,0xc8,0x28,0x6, 0x74,0xc8,0x7a,0xb3,0x4, 0x9e,0x7e,0xb3,0x4, 0xcc,0x60, +0x5, 0x14,0x7a,0xb3,0x4, 0xcc,0x22,0xca,0xf8,0x7e,0xe4,0x0, 0xc8,0x7e,0xd4,0x1, +0x90,0x7e,0xc4,0x0, 0xf0,0x6c,0xff,0x21,0xfb,0x12,0x52,0x43,0x49,0x23,0x0, 0x4, +0x7a,0x27,0x5, 0x7a,0x49,0xb3,0x0, 0x6, 0xbe,0xb4,0x3, 0x20,0x40,0x2, 0x41,0xe, +0x7e,0x37,0x5, 0x7a,0x9d,0x3c,0x12,0x3, 0x5, 0x7d,0xac,0x9d,0xa3,0x7e,0x24,0x0, +0xa, 0x7d,0x3a,0x8d,0x32,0x7d,0xa3,0xb, 0xa4,0x7d,0x3b,0x8d,0x3d,0x7a,0x27,0x5, +0x7c,0x7d,0x32,0x9d,0x3e,0x12,0x3, 0x5, 0x12,0x52,0x4c,0x7d,0x93,0xb, 0x94,0xbd, +0xdb,0x40,0x6, 0x7e,0x37,0x4, 0xd0,0x80,0x4, 0x7e,0x37,0x4, 0xab,0x7e,0x24,0x0, +0x64,0x8d,0x32,0x7d,0xf3,0xbe,0xf4,0x0, 0x1, 0x50,0x4, 0x6d,0xff,0x80,0xa, 0xbe, +0xf4,0x0, 0x28,0x28,0x4, 0x7e,0xf4,0x0, 0x28,0x7d,0x19,0xad,0x1a,0x6d,0x0, 0x7f, +0x10,0x7d,0x1f,0x12,0x0, 0x89,0x7f,0x1, 0xbd,0xeb,0x40,0x11,0x12,0x52,0x11,0x7d, +0x3b,0x6d,0x22,0xbf,0x10,0x50,0x4e,0x6d,0xbb,0x80,0x61,0x80,0x48,0xbd,0xdb,0x40, +0x1b,0x7f,0x10,0x74,0x7, 0x12,0x52,0x15,0x12,0x52,0x39,0xb4,0x1, 0x2, 0x9f,0x0, +0x7d,0x81,0x2d,0xb8,0xbd,0xdb,0x50,0x44,0x7d,0xbd,0x80,0x40,0x7d,0x8e,0x2d,0x8d, +0xbd,0x8b,0x40,0x27,0x7f,0x10,0x74,0x7, 0x12,0x52,0x15,0x12,0x52,0x39,0xb4,0x1, +0x2, 0x9f,0x0, 0x7d,0x5d,0x6d,0x44,0x2f,0x20,0x7d,0x3b,0x6d,0x22,0xbf,0x12,0x50, +0x4, 0x7d,0xbd,0x80,0x17,0x7d,0x81,0x9d,0xb8,0x80,0x11,0x12,0x52,0x11,0x7d,0x81, +0x2d,0xb8,0xbe,0xb4,0x3, 0x20,0x40,0x4, 0x7e,0xb4,0x3, 0x1f,0x74,0x5, 0xac,0xbf, +0x7d,0x85,0x2e,0x85,0x2f,0x59,0xb8,0x0, 0x6, 0xb, 0xf0,0x7e,0x85,0x2f,0x9, 0xb8, +0x0, 0x1a,0x54,0xf, 0xa, 0x3b,0xa, 0x8f,0xbd,0x83,0x58,0x2, 0x1, 0xf9,0xda,0xf8, +0x22,0x7f,0x10,0x74,0x9, 0x7e,0x30,0x4, 0x7e,0x20,0xc8,0x12,0x52,0x21,0x7f,0x1, +0x22,0xca,0xf8,0x7c,0xf2,0x12,0x52,0x53,0xa, 0x19,0x6d,0x0, 0x12,0x0, 0x94,0xa, +0x1f,0x6d,0x0, 0x12,0x0, 0x94,0xda,0xf8,0x22,0xa, 0x8f,0x2e,0x85,0x2f,0x9, 0xb8, +0x0, 0x18,0x22,0x7e,0x70,0x5, 0xac,0x7f,0x2e,0x35,0x2f,0x22,0x7e,0x24,0x0, 0xa, +0x2, 0x0, 0x46,0x7c,0x93,0xa, 0x1b,0x6d,0x0, 0x2, 0x0, 0x78,0x2f,0x7, 0x12,0x0, +0x94,0x7a,0x1f,0x2, 0xc3,0x7e,0x24,0x2, 0xc3,0x7e,0x37,0x2, 0xc7,0x7c,0xbc,0x7e, +0x17,0x2, 0x9, 0x99,0x14,0x7e,0x1f,0x2, 0xc3,0x7c,0xbc,0x7e,0x17,0x2, 0xb, 0x89, +0x14,0x7e,0xa3,0x2, 0xa4,0x7c,0xba,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x7c,0xb7,0x42, +0xe1,0x22,0xe5,0xe2,0xa, 0x7b,0x6d,0x66,0xe5,0xe2,0xf5,0xb, 0xe5,0xb, 0x7c,0x6b, +0x6c,0x77,0x6d,0x22,0x22,0x7e,0x73,0x5, 0x78,0xa, 0x27,0x1b,0x24,0xa, 0x3c,0xbd, +0x32,0x7e,0x17,0x1, 0xfd,0x1a,0x2, 0x22,0xe5,0x8, 0xa, 0x3b,0x9, 0x23,0x2, 0x7e, +0x7a,0x21,0xc, 0x7e,0x30,0x4, 0xac,0x23,0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xb7,0x7f, +0x17,0x12,0x0, 0x78,0x7e,0xf, 0x2, 0xbb,0x22,0xb, 0x28,0x10,0x2d,0x10,0x1b,0x28, +0x10,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0x7e,0x14,0x0, 0xc, 0xad,0x13,0x7e,0x50,0x4, +0xac,0x5e,0x2d,0x21,0x22,0xad,0x3f,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7d,0xd3,0x22, +0x7e,0x90,0x5, 0xac,0x93,0x49,0x34,0x0, 0x3f,0x22,0x7e,0xb3,0x2, 0xa4,0x54,0x1, +0x7e,0x70,0x1, 0x22,0x7f,0x71,0x7e,0x8, 0x0, 0x2, 0x2, 0x0, 0xe5,0x7e,0x4, 0x0, +0x3, 0xb, 0x28,0x10,0x8d,0x10,0x22,0x7e,0x30,0x5, 0xac,0x3d,0x2e,0x14,0x2, 0xaf, +0x22,0x1e,0xb0,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x22,0x7a,0x37,0x0, 0x39,0x7e,0x34, +0x0, 0x83,0x22,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x5b,0x22,0x74,0x4, 0xac,0xbc, +0x49,0x35,0x1, 0x63,0x22,0x59,0x32,0x0, 0xc5,0x49,0x34,0x0, 0x41,0x22,0x59,0x35, +0x0, 0xcf,0x59,0x25,0x0, 0xcd,0x22,0x49,0x31,0x0, 0xcb,0x49,0x21,0x0, 0xc9,0x22, +0x49,0xb1,0x0, 0xcf,0x49,0xa1,0x0, 0xcd,0x22,0x2e,0x10,0xe, 0x74,0x1, 0xa5,0xf7, +0x22,0x7c,0x13,0x2e,0x10,0xc, 0xa5,0xe7,0x22,0x7e,0x34,0x0, 0x3c,0x7a,0x35,0x36, +0x22,0x59,0x34,0x0, 0x2, 0x1b,0x48,0x20,0x22,0x7e,0x31,0xc, 0x74,0x4, 0xac,0x3b, +0x22,0xa, 0x2e,0xa, 0x3f,0x2, 0x0, 0x46,0x53,0xa8,0xac,0x57,0xe8,0x17,0x11,0xd8, diff --git a/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x12_20150227_app.h b/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x12_20150227_app.h new file mode 100644 index 00000000..ff657aab --- /dev/null +++ b/drivers/input/touchscreen/focaltech/FT6x06_4Column_Ver0x12_20150227_app.h @@ -0,0 +1,1285 @@ +0x2, 0x1, 0xee,0x2, 0x3f,0x9, 0x22,0x22,0x2, 0x26,0xba,0x2, 0x0, 0x28,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x22,0x2, 0x27,0xd1,0x22,0x2, 0x3a,0xad,0x74,0x5, +0xac,0xbf,0x49,0x45,0x0, 0x3e,0x22,0x22,0x32,0xff,0xff,0x2, 0x3e,0x94,0xa2,0xc, +0xe4,0x33,0x22,0x2, 0x47,0x84,0x7e,0x4, 0x0, 0x3, 0xb, 0x28,0x10,0x8d,0x10,0x22, +0xff,0xff,0xff,0x2, 0x3e,0xdd,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff, +0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5, +0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21, +0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d, +0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22, +0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f, +0x12,0x12,0x0, 0x94,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x0, 0x94,0x30, +0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e, +0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xff,0xff,0xff,0xff,0xfe,0xfe, +0xfe,0xfd,0xfc,0xfc,0xfb,0xfb,0xfa,0xfa,0xfa,0xf9,0xf8,0xf7,0xf7,0xf6,0xf5,0xf5, +0xf4,0xf3,0xf2,0xf2,0xf1,0xf0,0xf0,0xef,0xee,0xed,0xec,0xec,0xeb,0xea,0xe9,0xe7, +0xe5,0xe4,0xe2,0xe0,0xdd,0xd9,0xd6,0x1, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, +0x6, 0x6, 0x7, 0x7, 0x7, 0x8, 0x8, 0x9, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0xd, 0xe, +0xf, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x21, +0x23,0x26,0x2a,0x2d,0xff,0xff,0xfe,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfb,0xfa,0xfa, +0xfa,0xf9,0xf8,0xf7,0xf7,0xf6,0xf5,0xf5,0xf4,0xf3,0xf2,0xf2,0xf1,0xf0,0xf0,0xef, +0xee,0xed,0xec,0xec,0xeb,0xea,0xe9,0xe7,0xe5,0xe4,0xe2,0xe0,0xdd,0xdb,0xd8,0xd4, +0xd0,0x1, 0x2, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5, 0x5, 0x6, 0x6, 0x7, 0x7, 0x7, 0x8, +0x8, 0x9, 0xa, 0xa, 0xb, 0xb, 0xc, 0xd, 0xd, 0xe, 0xf, 0xf, 0x10,0x11,0x12,0x13, +0x14,0x15,0x16,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x21,0x23,0x26,0x2a,0x2d,0x75,0x84, +0x1, 0x7e,0x44,0x8, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x5, +0x59,0xc2,0xb, 0x75,0x2e,0x0, 0x75,0x2f,0x0, 0x75,0x30,0x0, 0x75,0x31,0x0, 0x75, +0x32,0x0, 0xc2,0x7, 0xd2,0x8, 0x75,0x33,0x0, 0x75,0x34,0x0, 0x75,0x26,0x0, 0x75, +0x35,0x0, 0x75,0x36,0x0, 0xc2,0xc, 0xd2,0x9, 0xc2,0xa, 0x75,0x37,0x0, 0xc2,0xd, +0xc2,0xe, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x3, 0xd, 0xb, 0xa, 0x40,0x5d,0x44,0x68, +0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29, +0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x3a,0x26,0x1a,0x19, +0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0xf, 0xe, 0xd, 0xc, 0xb, 0x1b,0x1c, +0x1d,0x1e,0x1f,0x20,0x21,0x22,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0x23,0x2, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0x3, 0x4, 0x3, 0x3, 0x1, 0x1, 0x3, 0x5, +0x5, 0x5, 0xff,0xff,0xff,0xff,0xff,0x22,0x22,0x22,0x20,0x20,0xff,0x22,0x22,0x22, +0x22,0x22,0xff,0xff,0xff,0xff,0xff,0x22,0x22,0x22,0x20,0x20,0xff,0x22,0x22,0x22, +0x22,0x22,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13, +0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22,0x10,0x10, +0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x0, 0x18,0x4, +0xeb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5, 0x59,0x0, 0x0, 0x1, +0x3, 0xe8,0x0, 0x0, 0x24,0x3, 0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24,0x4, 0xd, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0xd5,0x0, 0x0, 0x1, 0x4, 0xd7,0x0, 0x0, 0x1, 0x4, +0xd8,0x0, 0x0, 0x1, 0x4, 0xda,0x0, 0x0, 0x1, 0x5, 0x51,0x0, 0x0, 0x1, 0x5, 0x52, +0xff,0x0, 0x1, 0x5, 0x53,0x10,0x0, 0x1, 0x5, 0x54,0x8, 0x0, 0x1, 0x5, 0x38,0x0, +0x0, 0x10,0x5, 0x39,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff, +0x7f,0xff,0x7f,0xff,0x0, 0x0, 0xca,0x3b,0x7e,0xa3,0x0, 0x54,0x7c,0xca,0x5e,0xc0, +0xf, 0x7c,0xba,0xc4,0x54,0xf, 0xf5,0x8, 0x4c,0xcc,0x78,0x2f,0x12,0x7, 0x4, 0xe5, +0x8, 0xbe,0xb0,0x0, 0x38,0x2, 0xc1,0xee,0x6c,0xff,0x7e,0xa0,0xff,0x7e,0x70,0x5, +0xac,0x7f,0x19,0xa3,0x0, 0x76,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xf0,0xd2,0x5, 0xc2, +0x3, 0x6d,0x33,0x7a,0x35,0x2e,0x75,0x30,0x0, 0xc1,0xee,0x6c,0xff,0x7e,0x70,0xff, +0x74,0x5, 0xac,0xbf,0x19,0x75,0x2, 0xb2,0x7e,0x34,0x7f,0xff,0x59,0x35,0x2, 0xae, +0x59,0x35,0x2, 0xb0,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xe2,0x6c,0xff,0x80,0x23,0x7e, +0x50,0x5, 0xac,0x5f,0x7d,0x12,0x2e,0x14,0x0, 0x3e,0xb, 0x18,0x30,0x12,0x25,0x20, +0x1b,0x18,0x30,0x2e,0x24,0x0, 0x40,0xb, 0x28,0x30,0x12,0x25,0x20,0x1b,0x28,0x30, +0xb, 0xf0,0xbc,0xcf,0x38,0xd9,0xe5,0x8, 0xbc,0xbc,0x68,0x5, 0x6d,0x33,0x7a,0x35, +0x2e,0x6c,0xff,0x12,0x7, 0x49,0x50,0xf, 0xa, 0x37,0x9, 0xb3,0x0, 0xc0,0x70,0x7, +0x6d,0x33,0x7a,0x35,0x2e,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xe5,0xe5,0x8, +0x70,0x23,0x6c,0xff,0x80,0x19,0x12,0x0, 0x1e,0x59,0x45,0x0, 0x72,0x49,0x45,0x0, +0x40,0x59,0x45,0x0, 0x74,0x9, 0x75,0x0, 0x42,0x19,0x75,0x0, 0x76,0xb, 0xf0,0xbc, +0xcf,0x38,0xe3,0xa1,0x8e,0x6c,0xdd,0x6c,0xff,0x6c,0xee,0x7e,0x70,0x5, 0xac,0x7e, +0x9, 0xa3,0x0, 0x76,0x7e,0x50,0x5, 0xac,0x5f,0x9, 0xb2,0x0, 0x42,0xbc,0xba,0x78, +0x16,0xbe,0xb0,0xff,0x68,0x11,0xbe,0xd0,0x2, 0x50,0x13,0x2e,0x34,0x0, 0x72,0x12, +0x7, 0x55,0x12,0x1, 0x19,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x2, 0x40,0xcd,0xbe,0xe0, +0x2, 0x78,0x14,0xbe,0xd0,0x2, 0x50,0xf, 0x7e,0x70,0x5, 0xac,0x7f,0x2e,0x34,0x0, +0x3e,0x12,0x7, 0x55,0x12,0x1, 0x19,0xb, 0xd0,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xa9, +0x6c,0xff,0x7e,0x30,0x5, 0xac,0x3f,0x7d,0x31,0x2e,0x34,0x2, 0xae,0x2e,0x14,0x0, +0x72,0x74,0x5, 0x12,0x1, 0x19,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xe5,0x20,0x3, 0x6e, +0x6c,0xff,0x80,0x66,0x7c,0xef,0x6c,0xdd,0x80,0x21,0x7e,0x90,0x5, 0xac,0x9f,0x9, +0xa4,0x0, 0x76,0x7e,0x70,0x5, 0xac,0x7d,0x9, 0xb3,0x0, 0x42,0xbc,0xba,0x78,0x9, +0xbe,0xa0,0xff,0x68,0x4, 0x7c,0xed,0x80,0x6, 0xb, 0xd0,0xbc,0xcd,0x38,0xdb,0xbe, +0xe0,0x2, 0x40,0x2, 0x7c,0xef,0x7e,0x90,0x5, 0xac,0x9e,0x49,0x34,0x0, 0x40,0xbe, +0x34,0x32,0x0, 0x50,0xa, 0x49,0x24,0x0, 0x74,0xbe,0x24,0x32,0x0, 0x40,0x12,0x49, +0x24,0x0, 0x3e,0x74,0x5, 0xac,0xbf,0x59,0x25,0x0, 0x72,0x59,0x35,0x0, 0x74,0x80, +0x7, 0x7c,0xbf,0x7c,0x7e,0x12,0x9, 0x1a,0xb, 0xf0,0xbc,0xcf,0x38,0x96,0x6c,0xff, +0x74,0x5, 0xac,0xbf,0x49,0x45,0x0, 0x72,0x12,0x0, 0xe, 0x59,0x45,0x0, 0x3e,0x49, +0x45,0x0, 0x74,0x12,0x0, 0xe, 0x59,0x45,0x0, 0x40,0x9, 0x75,0x0, 0x76,0x19,0x75, +0x0, 0x42,0xb, 0xf0,0xbe,0xf0,0x2, 0x78,0xd7,0xbe,0xc0,0x0, 0x38,0x2, 0xc1,0xce, +0x6c,0xff,0x12,0x0, 0x1e,0x59,0x45,0x0, 0x68,0x49,0x45,0x0, 0x40,0x59,0x45,0x0, +0x6a,0x9, 0x75,0x0, 0x42,0x19,0x75,0x0, 0x6c,0xa, 0x37,0xbe,0x34,0x0, 0x2, 0x50, +0xf, 0x49,0x25,0x0, 0x6a,0xbe,0x24,0x3, 0x20,0x40,0x5, 0x6d,0x22,0x7a,0x25,0x2e, +0x7e,0x15,0x2e,0x4d,0x11,0x78,0x41,0xbe,0xf0,0x1, 0x78,0x7, 0x7d,0x21,0xb, 0x24, +0x7a,0x25,0x2e,0xbe,0x34,0x0, 0x2, 0x40,0x2, 0xc1,0xc5,0x6c,0xee,0x7e,0x50,0x5, +0xac,0x5f,0x49,0x42,0x0, 0x68,0x7e,0xf4,0x0, 0xc, 0xad,0xf3,0x7e,0x10,0x4, 0xac, +0x1e,0x2d,0xf, 0x59,0x40,0x4, 0xeb,0x49,0x22,0x0, 0x6a,0x59,0x20,0x4, 0xed,0xb, +0xe0,0xbe,0xe0,0x3, 0x78,0xd7,0xc1,0xc5,0xbe,0x34,0x0, 0x2, 0x50,0x7a,0x74,0x5, +0xac,0xbf,0x49,0x25,0x0, 0x68,0x7e,0x4, 0x0, 0x3, 0x8d,0x10,0x7d,0x50,0x3e,0x54, +0x3e,0x54,0x7e,0x14,0x0, 0xc, 0xad,0x13,0x2d,0x15,0x59,0x21,0x4, 0xeb,0x74,0x5, +0xac,0xbf,0x49,0x25,0x0, 0x6a,0x59,0x21,0x4, 0xed,0x6d,0x22,0x74,0x5, 0xac,0xbf, +0x59,0x25,0x0, 0x68,0x6c,0xee,0x12,0x7, 0x6f,0x49,0x2, 0x4, 0xeb,0x7e,0x50,0x5, +0xac,0x5f,0x2e,0x24,0x0, 0x68,0x12,0x7, 0x61,0x78,0xeb,0x12,0x0, 0x36,0x1b,0x28, +0x10,0x6d,0x22,0x74,0x5, 0xac,0xbf,0x59,0x25,0x0, 0x6a,0x6c,0xee,0x12,0x7, 0x6f, +0x49,0x2, 0x4, 0xed,0x7e,0x50,0x5, 0xac,0x5f,0x2e,0x24,0x0, 0x6a,0x12,0x7, 0x61, +0x78,0xeb,0x12,0x0, 0x36,0x1b,0x28,0x10,0xbe,0xf0,0x1, 0x78,0x8, 0x7e,0x25,0x2e, +0xb, 0x24,0x7a,0x25,0x2e,0xb, 0xf0,0xbe,0xf0,0x2, 0x68,0x2, 0xa1,0xc2,0xd2,0x0, +0x6c,0xff,0x12,0x7, 0x49,0x50,0x10,0xa, 0x37,0x9, 0xb3,0x0, 0xc0,0xb4,0x1, 0x7, +0x6d,0x33,0x7a,0x35,0x2e,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0x2, 0x40,0xe4,0xda,0x3b, +0x22,0x7d,0x14,0x1a,0x2, 0x1a,0x0, 0x7f,0x17,0x9f,0x10,0x7d,0x1d,0x1a,0x2, 0x1a, +0x0, 0x2, 0x0, 0x78,0x12,0x7, 0x7d,0x78,0x32,0x20,0xb, 0x2f,0x6c,0xaa,0x7e,0x44, +0x7f,0xff,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x4, 0xdf,0x59,0x43,0x4, 0xe1,0x6d, +0x33,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x32,0x4, 0xe7,0x7e,0x34,0x1, 0x0, 0x59,0x32, +0x4, 0xdb,0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xd5,0xd2,0xb, 0x22,0x74,0x5, 0xac,0xbe, +0x49,0x35,0x0, 0x40,0x9d,0x32,0x2, 0x2, 0xde,0x74,0x5, 0xac,0xbf,0x9, 0x75,0x0, +0x6c,0xbe,0x70,0x2, 0x22,0x7e,0x30,0x5, 0xac,0x3d,0x2e,0x14,0x2, 0xae,0x74,0x5, +0x22,0xb, 0x28,0x10,0x2d,0x10,0x1b,0x28,0x10,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0x7e, +0x14,0x0, 0xc, 0xad,0x13,0x7e,0x50,0x4, 0xac,0x5e,0x2d,0x21,0x22,0x7e,0xb3,0x0, +0x54,0x54,0xf, 0x22,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xca,0x3b,0x7f,0x71,0x7c,0xab,0x7e,0x30,0xfe,0x7e,0xe0,0x2, 0x7e,0x24,0x0, 0x87, +0x7a,0x25,0x8, 0x7e,0x4, 0x0, 0x8a,0x7a,0x5, 0xa, 0x7e,0xd4,0x0, 0x8e,0x7d,0x6d, +0x7e,0x34,0x0, 0x8c,0x7d,0x83,0x7d,0x92,0x7d,0x40,0x7d,0xad,0x7e,0x34,0x0, 0x80, +0x7d,0xb3,0x7e,0x37,0x1, 0xfc,0x7d,0xd3,0x12,0x46,0x9a,0x7d,0xc3,0xa, 0x3a,0x12, +0xb, 0xb7,0x7c,0xb5,0x7c,0xfb,0xbe,0xf0,0x8, 0x50,0x4a,0x1a,0x13,0x12,0xb, 0x64, +0x48,0x2a,0xbe,0x78,0x1, 0xa, 0x48,0x2, 0x80,0x3, 0x7e,0x45,0xa, 0x12,0x6, 0xf1, +0x7d,0x54,0x12,0xb, 0x75,0xbe,0x78,0x1, 0x5e,0x8, 0x7c,0x7f,0x17,0x9e,0x18,0x1, +0x5e,0x12,0xb, 0xa9,0x2e,0x18,0x1, 0x5e,0x7f,0x71,0x80,0x6b,0xbe,0x78,0x0, 0x89, +0x18,0x9, 0x7d,0x19,0x12,0x6, 0xf3,0x7d,0x59,0x80,0x27,0x7e,0x45,0x8, 0x12,0x6, +0xf1,0x7d,0x54,0x80,0x1d,0x1a,0x1e,0x12,0xb, 0x64,0x48,0x1b,0xbe,0x78,0x1, 0xc, +0x48,0x9, 0x7d,0x1b,0x12,0x6, 0xf3,0x7d,0x5b,0x80,0x7, 0x7d,0x18,0x12,0x6, 0xf3, +0x7d,0x58,0x12,0xb, 0x75,0x80,0x30,0xbe,0x78,0x0, 0x87,0x18,0x9, 0x7d,0x1a,0x12, +0x6, 0xf3,0x7d,0x5a,0x80,0x7, 0x7d,0x16,0x12,0x6, 0xf3,0x7d,0x56,0x12,0xb, 0x75, +0xbe,0x78,0x0, 0x32,0x58,0x11,0x7e,0x58,0x0, 0x32,0x7f,0x15,0x9f,0x17,0x12,0xb, +0xa9,0x7f,0x15,0x9f,0x17,0x7f,0x71,0xbe,0x78,0x0, 0x0, 0x58,0x6, 0x9f,0x11,0x7f, +0x71,0x80,0x11,0x7d,0x1d,0x12,0xb, 0x6e,0x48,0xa, 0x7d,0x3d,0x1a,0x26,0x1a,0x24, +0x1b,0x1c,0x7f,0x71,0xbe,0xf0,0x8, 0x40,0xc, 0x7d,0x1d,0x1a,0x2, 0x1a,0x0, 0x7f, +0x17,0x2f,0x10,0x7f,0x71,0x7f,0x17,0xda,0x3b,0x22,0xca,0xd8,0xca,0x79,0x7c,0xe7, +0x7c,0xdb,0x74,0x5, 0xac,0xbd,0x49,0x25,0x0, 0x74,0x12,0x7, 0x3c,0x7d,0x3, 0x12, +0xb, 0x89,0x2d,0x3, 0x74,0x5, 0xac,0xbd,0x9, 0xf5,0x0, 0x76,0xbe,0xf0,0x2, 0x40, +0x2, 0x6c,0xff,0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0xe1,0x12,0x7, 0x3c,0x7d,0xd3, +0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0xdf,0x12,0xb, 0x91,0x2d,0xd3,0x7e,0x17,0x0, +0x65,0xbd,0x1d,0x38,0x6, 0x7e,0xf4,0x1, 0x0, 0x80,0x19,0x7d,0x30,0x6d,0x22,0x7c, +0x56,0x7c,0x67,0x6c,0x77,0x12,0x0, 0x92,0x7d,0xf3,0xbe,0xf4,0x0, 0x10,0x50,0x4, +0x7e,0xf4,0x0, 0x10,0xbe,0xf4,0x1, 0x0, 0x28,0x4, 0x7e,0xf4,0x1, 0x0, 0x74,0x2, +0xac,0xbf,0x49,0x45,0x4, 0xe7,0xbd,0x4d,0x28,0x6, 0x49,0xf5,0x4, 0xdb,0x80,0x4, +0x59,0xf5,0x4, 0xdb,0x59,0xd5,0x4, 0xe7,0x74,0x5, 0xac,0xbd,0x49,0xe5,0x0, 0x3e, +0x1e,0xe4,0x1e,0xe4,0x1e,0xe4,0x1e,0xe4,0xbe,0xe4,0x0, 0x14,0x28,0x71,0xbe,0xe4, +0x1, 0xcc,0x50,0x6b,0xa, 0xed,0x9, 0x3e,0x0, 0x3a,0xa, 0x33,0x12,0xb, 0xb7,0x7c, +0xa5,0xa, 0x33,0x12,0x2f,0xf1,0x7c,0x35,0x7e,0x90,0x4, 0xac,0x9a,0x49,0x34,0x1, +0x5e,0x49,0x24,0x1, 0x5c,0x4c,0x33,0x68,0xa, 0x49,0xd4,0x1, 0x5a,0x49,0xc4,0x1, +0x58,0x2f,0x16,0xbe,0x30,0x7, 0x68,0xa, 0x49,0x14,0x1, 0x62,0x49,0x4, 0x1, 0x60, +0x2f,0x10,0x7e,0x8, 0x1, 0xf4,0x12,0x0, 0xe5,0x7d,0xe3,0xbe,0xe4,0x0, 0xb4,0x28, +0x6, 0x7e,0xe4,0x0, 0xb4,0x80,0xe, 0xbe,0xe4,0x0, 0x3c,0x28,0x6, 0x9e,0xe4,0x0, +0x14,0x80,0x2, 0x6d,0xee,0xbd,0xef,0x50,0x4, 0x9d,0xfe,0x80,0x2, 0x6d,0xff,0x12, +0xb, 0x89,0x12,0xb, 0x9e,0x7e,0x90,0x5, 0xac,0x9d,0x49,0xe4,0x0, 0x72,0x74,0x5, +0xac,0xbe,0x49,0xc5,0x0, 0x3e,0xbd,0xce,0x28,0xf, 0x7d,0x24,0x2e,0x24,0x0, 0x72, +0x7d,0x3e,0x2d,0x3d,0x1b,0x28,0x30,0x80,0xb, 0x7d,0xc4,0x2e,0xc4,0x0, 0x72,0x9d, +0xed,0x1b,0xc8,0xe0,0x49,0x24,0x0, 0x74,0x12,0x7, 0x40,0x12,0xb, 0x9e,0x7e,0x30, +0x5, 0xac,0x3d,0x49,0x21,0x0, 0x74,0x7e,0x70,0x5, 0xac,0x7e,0x49,0xe3,0x0, 0x40, +0xbd,0xe2,0x28,0xf, 0x7d,0xc1,0x2e,0xc4,0x0, 0x74,0x7d,0x2, 0x2d,0xd, 0x1b,0xc8, +0x0, 0x80,0x9, 0x2e,0x14,0x0, 0x74,0x9d,0x2d,0x1b,0x18,0x20,0x49,0x43,0x0, 0x3e, +0x74,0x4, 0xac,0xbf,0x59,0x45,0x4, 0xdf,0x59,0xe5,0x4, 0xe1,0xda,0x79,0xda,0xd8, +0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x47,0x38,0x2b,0x7e,0x54,0x0, 0x47,0x9d,0x5f,0x6d, +0x44,0x7e,0x14,0x1, 0x80,0x12,0xb, 0x56,0xbe,0x28,0x0, 0x18,0x28,0x4, 0x9f,0x22, +0x80,0x8, 0x7e,0x18,0x0, 0x18,0x9f,0x12,0x7f,0x21,0xbe,0x28,0x0, 0x0, 0x50,0x6d, +0x9f,0x22,0x80,0x69,0xbe,0xf4,0x1, 0xb8,0x40,0x29,0x7d,0x5f,0x9e,0x54,0x1, 0xb8, +0x6d,0x44,0x7e,0x14,0x1, 0x80,0x12,0xb, 0x56,0xbe,0x28,0x0, 0x18,0x40,0x4, 0x7e, +0x28,0x0, 0x17,0xbe,0x28,0x0, 0x18,0x28,0x4, 0x7e,0x28,0x0, 0x18,0x2e,0x28,0x1, +0xc8,0x80,0x3a,0xbe,0xf4,0x0, 0xff,0x50,0x1d,0x7e,0x54,0x0, 0xff,0x9d,0x5f,0x12, +0xb, 0x50,0x7e,0x18,0x0, 0xf0,0x9f,0x12,0x7f,0x21,0xbe,0x28,0x0, 0x18,0x50,0x1d, +0x7e,0x28,0x0, 0x18,0x80,0x17,0x7d,0x5f,0x9e,0x54,0x0, 0xff,0x12,0xb, 0x50,0x2e, +0x28,0x0, 0xf0,0xbe,0x28,0x1, 0xc8,0x28,0x4, 0x7e,0x28,0x1, 0xc8,0x7d,0x35,0x22, +0x6d,0x44,0x7e,0x14,0x1, 0x1f,0x7f,0x12,0x12,0x0, 0x89,0x7f,0x21,0x7c,0xba,0x7c, +0xa9,0xa, 0x48,0x22,0x1a,0x2, 0x7f,0x17,0x2f,0x10,0x7f,0x71,0x7d,0x1c,0x1a,0x2, +0x1a,0x0, 0xbf,0x70,0x22,0x3e,0x54,0x1a,0x4a,0x1a,0x48,0x7d,0x1d,0x1a,0x2, 0x1a, +0x0, 0x9f,0x2, 0x12,0x0, 0xe5,0x7f,0x71,0x22,0x74,0x5, 0xac,0xbd,0x49,0x25,0x0, +0x72,0x74,0x5, 0xac,0xbe,0x49,0x35,0x0, 0x3e,0x9d,0x32,0x2, 0x2, 0xde,0xad,0x3f, +0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7d,0xd3,0x22,0x7f,0x71,0x7e,0x8, 0x0, 0x2, 0x12, +0x0, 0xe5,0x7f,0x71,0x22,0xa, 0x3b,0x7e,0x24,0x0, 0x10,0x2, 0x0, 0x46,0xca,0xd8, +0xca,0x79,0x12,0x7, 0x7d,0x7c,0xb, 0x78,0x2f,0x6c,0x11,0x6d,0x11,0x74,0x2, 0xac, +0xb1,0x59,0x15,0x5, 0x32,0x7e,0xa0,0xff,0x7e,0x30,0x5, 0xac,0x31,0x19,0xa1,0x5, +0x2c,0x7e,0xb3,0x5, 0x38,0x70,0x3, 0xe4,0x80,0x2, 0x74,0x2, 0xa, 0x11,0x19,0xb1, +0x5, 0x36,0xb, 0x10,0xa5,0xb9,0x2, 0xd3,0x6c,0x11,0xa1,0x7, 0x74,0x5, 0xac,0xb1, +0x9, 0xf5,0x0, 0x42,0xbe,0xf0,0x2, 0x40,0x2, 0xa1,0x5, 0xa, 0x1f,0x9, 0xb1,0x0, +0xc0,0xbe,0xb0,0x1, 0x78,0x2, 0xa1,0x5, 0x6c,0xee,0x74,0x5, 0xac,0xbe,0x9, 0xd5, +0x5, 0x2c,0xbc,0xdf,0x68,0x2, 0x81,0xfc,0x49,0x25,0x5, 0x2a,0x74,0x5, 0xac,0xb1, +0x12,0x7, 0x40,0x7d,0x43,0x74,0x5, 0xac,0xbe,0x49,0x25,0x5, 0x28,0x74,0x5, 0xac, +0xb1,0x12,0xb, 0x95,0x2d,0x43,0xa, 0x1d,0x9, 0xa1,0x5, 0x36,0xbe,0xa0,0x0, 0x28, +0x17,0x7e,0x30,0x2, 0xac,0x3d,0x59,0x41,0x5, 0x32,0xa, 0x1d,0x2e,0x14,0x5, 0x36, +0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1,0x5, 0x7e,0x30,0x2, 0xac,0x3d,0x49,0x31,0x5, +0x32,0xbe,0x34,0x0, 0x32,0x28,0x8, 0xbe,0x44,0x0, 0x32,0x28,0x2, 0x80,0x10,0x7d, +0x23,0x2e,0x24,0x0, 0x32,0xbd,0x24,0x50,0x12,0xbe,0x34,0x0, 0x32,0x28,0xc, 0x59, +0x41,0x5, 0x32,0x74,0x1, 0x7a,0xb3,0x5, 0x38,0x80,0x6a,0xbe,0x44,0x0, 0xc8,0x28, +0x51,0xe4,0x7a,0xb3,0x5, 0x38,0xa, 0x1f,0x9, 0xb1,0x0, 0xc0,0x70,0x4, 0x74,0x3, +0x80,0x2, 0x74,0x1, 0xa, 0x1f,0x19,0xb1,0x0, 0xc0,0x7e,0x70,0x5, 0xac,0x71,0x2e, +0x34,0x0, 0x3e,0x7e,0x14,0x2, 0xae,0x74,0x5, 0x12,0x1, 0x19,0xbe,0x0, 0x0, 0x28, +0x21,0x1b,0x0, 0x7e,0x70,0x5, 0xac,0x70,0x2e,0x34,0x0, 0x3e,0x7e,0x30,0x5, 0xac, +0x31,0x12,0xd, 0x73,0x7e,0x34,0x2, 0xae,0x7e,0x30,0x5, 0xac,0x30,0x12,0xd, 0x73, +0x1b,0x10,0x74,0x2, 0xac,0xbd,0x59,0x45,0x5, 0x32,0x80,0x9, 0xb, 0xe0,0xbe,0xe0, +0x2, 0x50,0x2, 0x81,0x1a,0xb, 0x10,0x12,0x3d,0x8e,0x54,0xf, 0xa, 0x5b,0xa, 0x11, +0xbd,0x15,0x58,0x2, 0x61,0xfc,0x7c,0x60,0x12,0x3d,0x6, 0x6c,0x11,0x7e,0x30,0x5, +0xac,0x31,0x7d,0x31,0x2e,0x34,0x0, 0x3e,0x2e,0x14,0x5, 0x28,0x74,0x5, 0x12,0x1, +0x19,0xb, 0x10,0xbe,0x10,0x2, 0x40,0xe5,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7e, +0xf3,0x0, 0x54,0x5e,0xf0,0xf, 0xbe,0xf0,0x0, 0x28,0x25,0x6c,0xee,0x80,0x1d,0x1a, +0x2e,0x7e,0x34,0x0, 0x5, 0xad,0x32,0x49,0x33,0x0, 0x3e,0x12,0xa, 0xb1,0x1a,0xe, +0x7e,0x14,0x0, 0x5, 0xad,0x10,0x59,0x31,0x0, 0x3e,0xb, 0xe0,0xbc,0xfe,0x18,0xdf, +0xda,0x79,0x22,0x2e,0x14,0x0, 0x3e,0x74,0x5, 0x2, 0x1, 0x19,0x12,0xf, 0x2d,0x12, +0x26,0xf9,0x7a,0x37,0x2, 0xac,0x12,0x3b,0x47,0xe4,0x12,0x20,0x77,0x12,0x3e,0xee, +0x12,0x4d,0xb4,0x12,0xe, 0xb2,0x12,0x38,0x2d,0x12,0xf, 0x38,0x12,0x46,0xf0,0x7e, +0xb3,0x3, 0xc4,0xb4,0x1, 0x2, 0x80,0x2, 0xc1,0xa6,0x7e,0xb3,0x2, 0x3c,0x60,0x28, +0xb4,0x1, 0xb, 0x12,0x26,0xd2,0x74,0x3c,0x7a,0xb3,0x3, 0xe8,0x80,0x3, 0x12,0xf, +0xef,0x7e,0x34,0x4, 0xd, 0x7e,0x24,0x0, 0x24,0xe4,0x12,0x2, 0xee,0x7e,0x34,0x3, +0xe9,0x7e,0x24,0x0, 0x24,0x12,0x2, 0xee,0x12,0x27,0x14,0x12,0x38,0x14,0x12,0x27, +0x9d,0x44,0x40,0x12,0x10,0x58,0x12,0x18,0x33,0x12,0x20,0x1f,0x12,0x1e,0x27,0x12, +0x13,0xab,0x12,0x3c,0x2, 0x7e,0xb3,0x2, 0x54,0x30,0xe1,0x7, 0x12,0x3e,0x48,0x7a, +0xb3,0x0, 0x54,0x12,0x40,0xf2,0x12,0x7, 0x7d,0x12,0x37,0xf9,0x7e,0x34,0x0, 0xcc, +0x7e,0x24,0x1, 0xa8,0x7e,0xb3,0x2, 0x58,0x14,0x12,0x2c,0x2e,0x7e,0xb3,0x3, 0xe8, +0x60,0x5, 0x14,0x7a,0xb3,0x3, 0xe8,0x7e,0xb3,0x3, 0xe8,0x60,0x9, 0x74,0xa, 0x12, +0xe, 0xa9,0x74,0x1e,0x80,0x5, 0x12,0xe, 0xa7,0x74,0xf, 0x7a,0xb3,0x2, 0x36,0x12, +0x3f,0xc1,0x12,0x27,0xf7,0x12,0x0, 0x6, 0x12,0x18,0xa3,0x12,0x17,0xf5,0x7e,0xb3, +0x2, 0x55,0x30,0xe0,0x21,0x7e,0xa3,0x0, 0x54,0x7c,0xba,0x54,0xf, 0xbe,0xb0,0x2, +0x40,0x14,0x7c,0xba,0xc4,0x54,0xf, 0xbe,0xb0,0x2, 0x50,0xa, 0x7c,0xba,0x54,0xf0, +0x44,0x1, 0x7a,0xb3,0x0, 0x54,0x12,0x3d,0x95,0x12,0xd, 0x3d,0x12,0x42,0xb, 0x12, +0x3c,0x6d,0x12,0x3d,0x40,0x12,0x48,0x1c,0x12,0xb, 0xbe,0x12,0x4a,0xea,0x12,0x3, +0xc6,0x12,0x44,0xbf,0x7e,0xb3,0x0, 0x62,0x12,0x35,0xf3,0x12,0x25,0xd1,0x12,0x25, +0xa3,0x12,0x4e,0xd9,0xa1,0x9f,0x22,0x74,0x5, 0x7a,0xb3,0x2, 0x35,0x7a,0xb3,0x2, +0x34,0x22,0x7e,0x34,0x0, 0x3a,0x7e,0x24,0x0, 0x1c,0xe4,0x12,0x2, 0xee,0x7e,0x34, +0x0, 0x68,0x7e,0x24,0x0, 0x17,0x12,0x2, 0xee,0x6d,0x11,0x12,0xf, 0x14,0x2e,0x34, +0x0, 0x3e,0x12,0xf, 0x1b,0x12,0xf, 0x14,0x2e,0x34,0x0, 0x68,0x12,0xf, 0x1b,0x12, +0xf, 0x14,0x2e,0x34,0x0, 0x72,0x12,0xf, 0x1b,0xb, 0x14,0xbe,0x14,0x0, 0x2, 0x40, +0xda,0x75,0x28,0x0, 0x75,0x29,0x0, 0xc2,0x1, 0x75,0x27,0x0, 0x6d,0x33,0x7a,0x37, +0x0, 0x7f,0x7e,0x24,0x7, 0xd0,0x7a,0x27,0x0, 0x38,0x7a,0x37,0x0, 0x63,0xe4,0x7a, +0xb3,0x0, 0x81,0x22,0x7e,0x34,0x0, 0x5, 0xad,0x31,0x22,0x7e,0x24,0x7f,0xff,0x1b, +0x38,0x20,0x59,0x23,0x0, 0x2, 0x74,0xff,0x19,0xb3,0x0, 0x4, 0x22,0x6d,0x33,0x7a, +0x37,0x0, 0x7f,0x7e,0x34,0x7, 0xd0,0x22,0x12,0x22,0x76,0x12,0x16,0x25,0x12,0x3f, +0x8d,0x2, 0xf, 0x44,0xca,0x79,0x12,0x26,0xcb,0x7a,0xb3,0x2, 0xab,0x7e,0x34,0x2, +0xae,0x7e,0x24,0x0, 0x48,0x12,0x50,0x5, 0x30,0xe0,0x3f,0x44,0x4, 0x7a,0xb3,0x2, +0x54,0x6c,0xee,0x80,0x28,0x12,0x10,0x5c,0x6c,0xff,0x80,0x1a,0x7e,0x50,0x2, 0xac, +0x5f,0x49,0xf2,0x2, 0xae,0x6d,0xee,0x12,0x17,0xac,0xbf,0x7, 0x8, 0x6, 0x7d,0x31, +0x59,0x32,0x2, 0xae,0xb, 0xf0,0x12,0xf, 0xe8,0x38,0xe1,0xb, 0xe0,0x7e,0x73,0x2, +0xc, 0xbc,0x7e,0x38,0xd0,0x12,0x39,0x61,0x80,0x31,0x7e,0xe0,0x1, 0x12,0x10,0x5c, +0x6c,0xff,0x80,0x1b,0x12,0x16,0x18,0x12,0x50,0x39,0x7d,0x13,0x7e,0x50,0x2, 0xac, +0x5f,0x2e,0x24,0x2, 0xae,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xf0,0x12, +0xf, 0xe8,0x38,0xe0,0xb, 0xe0,0xbe,0xe0,0x4, 0x28,0xd2,0x6c,0xee,0x80,0xe, 0x74, +0x2, 0xac,0xbe,0x49,0x35,0x2, 0xae,0x59,0x35,0x1, 0xa8,0xb, 0xe0,0x7e,0x73,0x2, +0x58,0xbc,0x7e,0x38,0xea,0xda,0x79,0x22,0x7e,0x73,0x2, 0x58,0xbc,0x7f,0x22,0xca, +0xf8,0x7e,0xa3,0x2, 0xab,0x7c,0xba,0x23,0x23,0x7c,0xfb,0x5e,0xf0,0x1, 0x7c,0xba, +0x54,0xbf,0x12,0x10,0x58,0x6c,0xaa,0x80,0x2d,0x7e,0xb3,0x2, 0x3c,0xb4,0x2, 0x8, +0xa, 0x3a,0x9, 0xb3,0x3, 0xe9,0x60,0x1c,0x7e,0x90,0x4, 0xac,0x9a,0x49,0x34,0x0, +0xce,0x7e,0x50,0x2, 0xac,0x5a,0x59,0x32,0x1, 0xa8,0x9f,0x11,0x59,0x34,0x0, 0xce, +0x59,0x24,0x0, 0xcc,0xb, 0xa0,0x12,0x40,0x69,0x38,0xce,0x7c,0x6f,0x5e,0x60,0x1, +0x7c,0xb6,0x3, 0x3, 0x54,0xc0,0x7c,0x6b,0x7e,0x73,0x2, 0xab,0x5e,0x70,0xbf,0x4c, +0x76,0x7a,0x73,0x2, 0xab,0xda,0xf8,0x22,0x7a,0xb3,0x2, 0xab,0xca,0x3b,0x12,0x0, +0x2e,0x70,0x17,0xf5,0x8, 0x80,0xc, 0x7e,0x18,0x30,0x39,0x12,0x4f,0xfe,0x12,0x50, +0xe, 0x5, 0x8, 0x12,0x13,0x7b,0x38,0xef,0x61,0x78,0x7e,0xb3,0x2, 0xa3,0x30,0xe1, +0x5, 0x75,0xd, 0x2, 0x80,0x3, 0x75,0xd, 0x1, 0x7e,0xa3,0x2, 0xab,0x7c,0xba,0x30, +0xe7,0xe, 0x7e,0xb3,0x2, 0x54,0x30,0xe0,0x7, 0x7e,0x35,0x35,0x4d,0x33,0x78,0xe, +0x7e,0xb3,0x2, 0x54,0x20,0xe0,0x2, 0x41,0x1d,0x20,0xe2,0x2, 0x41,0x1d,0x7c,0xba, +0x30,0xe7,0x8, 0x7e,0xb3,0x2, 0xe, 0xf5,0xe, 0x80,0x6, 0x7e,0xb3,0x2, 0xf, 0xf5, +0xe, 0x7e,0x35,0x35,0xbe,0x34,0x0, 0x0, 0x28,0x5, 0x1b,0x34,0x7a,0x35,0x35,0x7e, +0xb3,0x2, 0x54,0x30,0xe5,0xb, 0x80,0x4, 0xe4,0x12,0x17,0x41,0x12,0x13,0xa4,0x50, +0xf7,0x53,0xe1,0xfd,0x43,0xe1,0x2, 0x53,0xe3,0x1f,0x12,0x17,0xe9,0x75,0x9, 0x0, +0x21,0xc6,0x75,0xa, 0x0, 0x80,0x58,0xe5,0xa, 0x70,0xc, 0x53,0xe7,0xbf,0x7e,0x34, +0x2, 0xf6,0x12,0x17,0xed,0x80,0x3, 0x43,0xe7,0x40,0x7e,0xb3,0x2, 0xa3,0x54,0x1, +0x6c,0x77,0x12,0x47,0x59,0x80,0x4, 0xe4,0x12,0x17,0x41,0x12,0x13,0xa4,0x50,0xf7, +0x75,0x8, 0x0, 0x80,0x23,0x12,0x4f,0x6d,0x2f,0x31,0x12,0x4f,0x93,0x2e,0x14,0x2, +0xf6,0x12,0x13,0x95,0x12,0x13,0x83,0x7e,0xb3,0x2, 0xa3,0x20,0xe1,0x8, 0x12,0x13, +0x95,0x2f,0x11,0x12,0x13,0x85,0x5, 0x8, 0x12,0x13,0x7b,0x38,0xd8,0x5, 0xa, 0xe5, +0xd, 0xbe,0xb1,0xa, 0x38,0xa1,0x75,0x8, 0x0, 0x80,0x64,0x12,0x4f,0x5e,0x30,0xe6, +0x2c,0x12,0x13,0x9d,0x49,0x35,0x2, 0xf8,0x7a,0x37,0x3, 0x86,0x12,0x17,0xc6,0x49, +0x25,0x1, 0xa8,0x1e,0x24,0x1e,0x24,0x9d,0x32,0x7a,0x37,0x3, 0x86,0x7e,0x37,0x1, +0xf2,0xe, 0x34,0xe, 0x34,0xbe,0x37,0x3, 0x86,0x8, 0x1d,0x80,0x18,0x12,0x13,0x9d, +0x49,0x15,0x2, 0xf8,0x49,0x5, 0x2, 0xf6,0x7e,0x37,0x1, 0xf4,0xe, 0x34,0xe, 0x34, +0x12,0x47,0x52,0x8, 0x3, 0x12,0x50,0x29,0x12,0x13,0x9d,0x49,0x35,0x2, 0xf8,0x49, +0x25,0x2, 0xf6,0x12,0x17,0xb0,0xbf,0x10,0x8, 0x3, 0x12,0x50,0xe, 0x5, 0x8, 0x12, +0x13,0x7b,0x38,0x97,0x5, 0x9, 0xe5,0xe, 0xbe,0xb1,0x9, 0x28,0x2, 0x1, 0xf2,0x7e, +0xb3,0x2, 0xab,0x30,0xe7,0x35,0x75,0x8, 0x0, 0x80,0x2b,0x12,0x4f,0x93,0x2e,0x14, +0x0, 0xcc,0x12,0x13,0x95,0x2f,0x11,0x2f,0x11,0x12,0x13,0x85,0x7e,0xb3,0x2, 0xab, +0x30,0xe6,0x11,0x12,0x17,0xc6,0x49,0x55,0x1, 0xa8,0x6d,0x44,0x12,0x13,0x95,0x9f, +0x12,0x12,0x13,0x85,0x5, 0x8, 0x12,0x13,0x7b,0x38,0xd0,0x53,0xe1,0xfd,0x12,0x25, +0x5, 0x53,0xe3,0x1f,0x12,0x25,0x16,0x7c,0xb7,0x42,0xe3,0x61,0x78,0x7e,0xb3,0x2, +0xa3,0x20,0xe0,0x2, 0x41,0xbf,0x12,0x17,0xe9,0x75,0x9, 0x0, 0x41,0xb6,0x7e,0xb3, +0x2, 0x54,0x30,0xe5,0x5, 0x12,0x13,0xa4,0x50,0x1d,0xe5,0x9, 0x70,0x5, 0x53,0xe7, +0xbf,0x80,0x3, 0x43,0xe7,0x40,0x74,0x2, 0x12,0x17,0xb9,0x12,0x4f,0xf4,0x12,0x47, +0x59,0x80,0x4, 0xe4,0x12,0x17,0x41,0x12,0x13,0xa4,0x50,0xf7,0xe4,0x12,0x17,0xb9, +0x75,0x8, 0x0, 0x80,0x30,0x12,0x4f,0x6d,0x2f,0x31,0x12,0x4f,0x5e,0x30,0xe7,0x1a, +0x7e,0xa3,0x2, 0xa3,0x12,0x17,0xbf,0xbe,0xb0,0x3, 0x40,0xe, 0x7c,0xba,0x30,0xe1, +0x9, 0x1e,0x74,0xe, 0x64,0x50,0x3, 0x4e,0xe0,0x80,0x12,0x4f,0xd2,0x12,0x13,0x95, +0x12,0x13,0x83,0x5, 0x8, 0x12,0x13,0x7b,0x38,0xcb,0x7e,0xb3,0x2, 0x54,0x30,0xe5, +0x13,0xe5,0x9, 0xb4,0x1, 0x5, 0x53,0xe7,0xbf,0x80,0x3, 0x43,0xe7,0x40,0x12,0x4f, +0xf4,0x12,0x47,0x59,0x5, 0x9, 0xe5,0xd, 0xbe,0xb1,0x9, 0x28,0x2, 0x41,0x2e,0x75, +0x8, 0x0, 0x61,0x71,0x12,0x4f,0x5e,0x30,0xe7,0x5a,0x7e,0xa3,0x2, 0xa3,0x7c,0xba, +0x30,0xe1,0x28,0x12,0x17,0xbf,0xbe,0xb0,0x1, 0x38,0x20,0xa, 0xb, 0x7e,0x14,0x0, +0x2, 0x9d,0x10,0x7e,0x91,0xc, 0x74,0x4, 0xac,0x9b,0x12,0x2d,0xb, 0x7c,0xb3,0x60, +0x5, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x50,0x31,0x80,0x29,0x7c,0xba,0x20,0xe1,0x24, +0x12,0x17,0xbf,0xbe,0xb0,0x2, 0x38,0x1c,0xa, 0x4b,0x7e,0x54,0x0, 0x3, 0x9d,0x54, +0x7c,0xab,0x12,0x4f,0xd2,0x12,0x13,0x95,0x7c,0xba,0x60,0x5, 0x2f,0x11,0x14,0x78, +0xfb,0x12,0x13,0x85,0x7e,0xb3,0x2, 0xab,0x30,0xe6,0x2b,0x12,0x17,0xc6,0x49,0x15, +0x1, 0xa8,0x6d,0x0, 0x12,0x13,0x9d,0x7d,0x45,0x12,0x2d,0xb, 0x9f,0x10,0x12,0x50, +0x31,0x12,0x17,0xb0,0x7e,0x37,0x1, 0xf2,0x12,0x40,0x62,0x58,0x22,0x7e,0xb3,0x2, +0x54,0x30,0xe0,0x1b,0x80,0x16,0x12,0x13,0x9d,0x12,0x17,0xb0,0x7e,0x37,0x1, 0xf4, +0x12,0x40,0x62,0x58,0xa, 0x7e,0xb3,0x2, 0x54,0x30,0xe0,0x3, 0x12,0x50,0x29,0x5, +0x8, 0x12,0x13,0x7b,0x28,0x2, 0x41,0xc4,0xda,0x3b,0x22,0x7e,0x73,0x2, 0x58,0xbe, +0x71,0x8, 0x22,0x2f,0x13,0x59,0x31,0x0, 0x2, 0x1b,0x18,0x20,0x22,0x7e,0x30,0x4, +0xac,0x23,0x2e,0x15,0x2a,0x49,0x31,0x0, 0x2, 0xb, 0x18,0x20,0x22,0x7e,0xa1,0xc, +0x74,0x4, 0xa4,0x22,0x30,0x9, 0x2, 0xd3,0x22,0xc3,0x22,0xca,0x3b,0x12,0x0, 0x2e, +0x70,0x2, 0xc1,0xa, 0x7e,0xe3,0x2, 0x56,0x7c,0xde,0x1e,0xd0,0x1e,0xe0,0x1e,0xe0, +0x6c,0xcc,0x7e,0xb3,0x2, 0x55,0x54,0xfe,0x7a,0xb3,0x2, 0x55,0x7e,0x17,0x0, 0xbe, +0x6d,0x0, 0x7e,0x1f,0x1, 0xa4,0xbf,0x10,0x58,0x2, 0x81,0xdf,0x6c,0xff,0x81,0xd5, +0xa, 0x2d,0x7d,0x12,0x1b,0x14,0xa, 0x3f,0xbd,0x31,0xa, 0x4d,0xa, 0x5f,0x18,0x6, +0x2d,0x54,0xf5,0x8, 0x80,0x4, 0x9d,0x54,0xf5,0x8, 0x12,0x0, 0x46,0x7c,0x75,0x7a, +0x73,0x2, 0xb2,0x7e,0x70,0x4, 0xac,0x7f,0x49,0x53,0x0, 0xce,0x49,0x43,0x0, 0xcc, +0x7e,0x37,0x0, 0xbe,0x7d,0x13,0x1e,0x14,0x6d,0x0, 0xbf,0x20,0x58,0x2, 0x81,0xd3, +0x7e,0xa3,0x2, 0xb2,0x74,0x4, 0xa4,0x49,0x15,0x1, 0x5e,0x49,0x5, 0x1, 0x5c,0x6d, +0x22,0xbf,0x1, 0x58,0x2, 0x81,0xd3,0x7e,0x31,0x8, 0x74,0x4, 0xac,0x3b,0x12,0x50, +0x20,0x12,0x50,0x40,0x4d,0x22,0x78,0x6, 0x9f,0x11,0x7f,0x61,0x80,0xf, 0x74,0x4, +0xac,0xbf,0x49,0xd5,0x0, 0xca,0x49,0xc5,0x0, 0xc8,0x12,0x50,0x17,0x7a,0x1f,0x2, +0xae,0x12,0x50,0x40,0xa, 0x3e,0x1b,0x34,0xbd,0x32,0x78,0x6, 0x9f,0x44,0x7f,0x74, +0x80,0x17,0x74,0x4, 0xac,0xbf,0x49,0xf5,0x0, 0xd2,0x49,0xe5,0x0, 0xd0,0x12,0x4f, +0xfe,0x49,0x95,0x0, 0xd2,0x49,0x85,0x0, 0xd0,0x12,0x16,0x18,0xbf,0x16,0x48,0x43, +0x12,0x16,0x18,0xbf,0x17,0x48,0x3c,0x12,0x16,0x18,0xbf,0x15,0x48,0x35,0x12,0x16, +0x18,0xbf,0x14,0x48,0x2e,0x12,0x17,0xac,0x7e,0x1f,0x2, 0xae,0xbf,0x1, 0x48,0x23, +0xa, 0x3c,0x19,0xf3,0x0, 0x3a,0xb, 0xc0,0x7e,0x30,0x4, 0xac,0x3f,0x2e,0x14,0x0, +0xcc,0x12,0x13,0x95,0xb, 0x1c,0x12,0x13,0x85,0xbe,0xc0,0x4, 0x40,0x5, 0x7e,0xc0, +0x4, 0x80,0xc, 0xb, 0xf0,0x7e,0x73,0x2, 0x56,0xbc,0x7f,0x28,0x2, 0x61,0xe0,0x7e, +0xb3,0x2, 0x54,0x20,0xe6,0x2, 0xa1,0xec,0x4c,0xcc,0x68,0x2, 0xa1,0xec,0x6c,0xff, +0xa1,0xe6,0x12,0x16,0xd, 0x12,0x17,0xcd,0xa, 0x1e,0x12,0x16,0x11,0x12,0x50,0x20, +0x2f,0x51,0x4c,0xff,0x68,0x7, 0x7c,0xbe,0x14,0xbc,0xbf,0x78,0xa, 0x12,0x17,0xd6, +0x7f,0x15,0x12,0x17,0xdf,0x7f,0x51,0x7e,0x37,0x0, 0xbe,0x6d,0x22,0xbf,0x51,0x18, +0x2, 0xa1,0xe4,0x12,0x16,0xd, 0x12,0x17,0xcd,0x12,0x50,0x39,0x7f,0x1, 0x12,0x4f, +0xde,0x12,0x16,0x1c,0xbf,0x10,0x18,0x2, 0xa1,0xe4,0x12,0x16,0xd, 0x12,0x17,0xcd, +0x7f,0x1, 0x2f,0x0, 0x2f,0x0, 0x12,0x4f,0xde,0x12,0x16,0x1c,0xbf,0x10,0x48,0x2, +0xa1,0xe4,0x4c,0xff,0x78,0x4, 0x9f,0x66,0x80,0x2a,0x12,0x16,0xd, 0x12,0x50,0x17, +0xa, 0x1e,0x12,0x16,0x11,0x49,0xd1,0x0, 0xca,0x49,0xc1,0x0, 0xc8,0x2f,0x61,0x4c, +0xff,0x68,0x7, 0x7c,0xbe,0x14,0xbc,0xbf,0x78,0xa, 0x12,0x17,0xd6,0x7f,0x16,0x12, +0x17,0xdf,0x7f,0x61,0x7c,0xbe,0x14,0xbc,0xbf,0x78,0x4, 0x9f,0x77,0x80,0x2c,0x12, +0x16,0xd, 0x49,0x31,0x0, 0xd2,0x49,0x21,0x0, 0xd0,0xa, 0x1e,0x12,0x16,0x11,0x49, +0xf1,0x0, 0xd2,0x49,0xe1,0x0, 0xd0,0x2f,0x71,0x4c,0xff,0x68,0x4, 0xbc,0xbf,0x78, +0xa, 0x12,0x17,0xd6,0x7f,0x17,0x12,0x17,0xdf,0x7f,0x71,0xbf,0x56,0x48,0x25,0xbf, +0x57,0x48,0x21,0x7e,0xc0,0x2, 0xa, 0x2f,0xa, 0x3d,0x2d,0x32,0x7a,0x73,0x0, 0x3a, +0xa, 0x3e,0x2d,0x32,0x7a,0x73,0x0, 0x3b,0x7e,0xb3,0x2, 0x55,0x44,0x1, 0x7a,0xb3, +0x2, 0x55,0x80,0x8, 0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0xf2,0x7c,0x6c,0x5e,0x60, +0xf, 0x7e,0x73,0x0, 0x54,0x12,0x3d,0x9, 0x7c,0x6c,0x5e,0x60,0xf, 0x7e,0x73,0x0, +0x55,0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x73,0x0, 0x55,0xda,0x3b,0x22,0xa, 0xf, 0xa, +0x1d,0x2d,0x10,0x3e,0x14,0x3e,0x14,0x22,0x74,0x4, 0xac,0xbf,0x49,0x35,0x0, 0xce, +0x49,0x25,0x0, 0xcc,0x22,0xca,0x3b,0xc2,0xf, 0x7e,0xb3,0x2, 0xab,0x54,0x7f,0x7a, +0xb3,0x2, 0xab,0x7e,0x67,0x2, 0xac,0x7e,0xb3,0x2, 0x54,0x30,0xe5,0x10,0x80,0x4, +0xe4,0x12,0x17,0x41,0x12,0x13,0xa4,0x50,0xf7,0xd2,0xf, 0x12,0x39,0x6c,0x53,0xe3, +0x1f,0x7e,0x34,0x2, 0xae,0x7e,0x24,0x0, 0x24,0x74,0xff,0x12,0x2, 0xee,0x6c,0xee, +0xc1,0xed,0x6c,0xff,0x80,0xa, 0xe4,0xa, 0x3f,0x2d,0x36,0x7a,0x39,0xb0,0xb, 0xf0, +0x12,0xf, 0xe8,0x38,0xf1,0x7e,0x34,0x5, 0x3, 0x7e,0x24,0x0, 0x24,0x12,0x50,0x5, +0x44,0x4, 0x7a,0xb3,0x2, 0x54,0x6c,0xff,0xa, 0x2f,0x7e,0x34,0x0, 0x7, 0x9d,0x32, +0x7a,0x73,0x5, 0x27,0x12,0x25,0x69,0x12,0x10,0x5c,0x12,0x47,0xa3,0xb, 0xf0,0xbe, +0xf0,0x8, 0x78,0xe4,0x12,0x39,0x61,0x6c,0xff,0x80,0x3b,0xa, 0x2f,0x9, 0x62,0x2, +0xae,0xa, 0x1f,0x2d,0x16,0x7e,0x19,0x70,0xbc,0x67,0x28,0x28,0x19,0x72,0x2, 0xae, +0x7e,0xb3,0x2, 0x54,0x20,0xe0,0x7, 0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, 0x12,0x16, +0x18,0x80,0x5, 0x12,0x16,0x18,0x2f,0x11,0x2f,0x11,0x2f,0x11,0x74,0x2, 0xac,0xbf, +0x59,0x35,0x1, 0xa8,0xb, 0xf0,0x12,0xf, 0xe8,0x38,0xc0,0xb, 0xe0,0x7e,0x73,0x2, +0xd, 0xbc,0x7e,0x28,0x2, 0xc1,0x62,0x6c,0xff,0x80,0xd, 0xa, 0x3f,0x9, 0x53,0x2, +0xae,0x2d,0x36,0x7a,0x39,0x50,0xb, 0xf0,0x12,0xf, 0xe8,0x38,0xee,0x74,0x3, 0x12, +0x17,0xb9,0x12,0x25,0x46,0x12,0x27,0x9d,0x30,0xf, 0x15,0x7e,0xb3,0x2, 0x54,0x44, +0x20,0x7a,0xb3,0x2, 0x54,0x80,0x4, 0xe4,0x12,0x17,0x41,0x12,0x13,0xa4,0x50,0xf7, +0x53,0xe3,0x1f,0x7e,0xb3,0x2, 0xa3,0x12,0x25,0x18,0x7c,0xb7,0x42,0xe3,0xda,0x3b, +0x22,0x70,0x5, 0x43,0x87,0x1, 0x80,0xe, 0xb4,0x1, 0x5, 0x43,0x87,0x2, 0x80,0x6, +0xb4,0x2, 0x7, 0x43,0x87,0x2, 0x0, 0x0, 0x0, 0x0, 0x22,0x12,0x29,0x75,0x7e,0x23, +0x2, 0xc2,0x12,0x13,0x8d,0x7a,0x1f,0x2, 0xc6,0x7e,0x23,0x2, 0xc3,0x12,0x13,0x8d, +0x7a,0x1f,0x2, 0xca,0x7e,0x23,0x2, 0xc4,0x12,0x13,0x8d,0x7a,0x1f,0x2, 0xce,0x7e, +0x23,0x2, 0xc5,0x12,0x13,0x8d,0x7a,0x1f,0x2, 0xd2,0x7e,0x1f,0x2, 0xc6,0x7e,0xa0, +0x1, 0x7e,0x90,0x4, 0xac,0x9a,0x49,0x14,0x2, 0xc8,0x49,0x4, 0x2, 0xc6,0xbf,0x10, +0x58,0x2, 0x7f,0x10,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xe6,0x22,0x74,0x4, 0xac,0xbf, +0x49,0x15,0x0, 0xce,0x49,0x5, 0x0, 0xcc,0x22,0x7e,0x37,0x2, 0x6, 0x89,0x34,0x7c, +0xba,0xc4,0x3, 0x54,0x7, 0x22,0x7e,0xa1,0xc, 0x74,0x2, 0xa4,0x22,0x49,0x31,0x0, +0xce,0x49,0x21,0x0, 0xcc,0x22,0x7e,0x73,0x2, 0x53,0xa, 0x17,0x6d,0x0, 0x22,0x12, +0x0, 0x78,0x7e,0x8, 0x0, 0xa, 0x2, 0x0, 0xe5,0x7e,0x34,0x0, 0xcc,0x7e,0x24,0x0, +0x90,0xe4,0x2, 0x2, 0xee,0x7e,0xa3,0x0, 0x54,0x7c,0xba,0xc4,0x54,0xf, 0x78,0x32, +0x7e,0x1f,0x1, 0xa4,0xbe,0x18,0xa, 0xf0,0x58,0x28,0x7e,0x37,0x0, 0x3e,0xbe,0x34, +0x0, 0x28,0x40,0x1e,0xbe,0x34,0x1, 0xb8,0x38,0x18,0x7e,0x37,0x0, 0x40,0xbe,0x34, +0x1, 0xa4,0x50,0x6, 0xbe,0x34,0x1, 0x7c,0x38,0x8, 0x7c,0xba,0x54,0xf0,0x7a,0xb3, +0x0, 0x54,0x22,0x9f,0x11,0x7a,0x1f,0x1, 0xa4,0x6c,0xaa,0x9f,0x11,0x7e,0x30,0x4, +0xac,0x3a,0x59,0x31,0x1, 0x5e,0x59,0x21,0x1, 0x5c,0x49,0xf1,0x0, 0xce,0x49,0xe1, +0x0, 0xcc,0xbe,0x78,0x0, 0x32,0x8, 0x3, 0x12,0x18,0x83,0x49,0xf1,0x1, 0xe, 0x49, +0xe1,0x1, 0xc, 0xbe,0x78,0x0, 0x32,0x8, 0x3, 0x12,0x18,0x83,0x12,0x18,0x9a,0x7e, +0x7f,0x1, 0xa4,0xbf,0x17,0x8, 0x4, 0x7a,0x1f,0x1, 0xa4,0xb, 0xa0,0xbe,0xa0,0x10, +0x40,0xb9,0x22,0x7d,0x1, 0x2e,0x4, 0x1, 0x5c,0x49,0x30,0x0, 0x2, 0xb, 0x8, 0x20, +0x2f,0x17,0x59,0x30,0x0, 0x2, 0x1b,0x8, 0x20,0x22,0x49,0x31,0x1, 0x5e,0x49,0x21, +0x1, 0x5c,0x22,0xca,0x3b,0xe4,0x6c,0xdd,0xa, 0x3d,0x19,0xb3,0x0, 0x52,0xb, 0xd0, +0xbe,0xd0,0x2, 0x78,0xf3,0x6c,0xdd,0xa1,0x46,0x12,0x4f,0xe9,0x7c,0xbc,0x84,0x7c, +0xca,0x9f,0x11,0x7a,0x1f,0x2, 0xc8,0x7a,0x1f,0x2, 0xcc,0x7a,0x1f,0x2, 0xdc,0x74, +0x4, 0xac,0xbc,0x12,0x44,0x8a,0x7a,0x1f,0x2, 0xd0,0x7e,0x73,0x5, 0x54,0xa, 0xf7, +0x6d,0xee,0xa, 0x3c,0x6d,0x22,0x7f,0x7, 0x12,0x0, 0x94,0x7a,0xf, 0x2, 0xb6,0x7f, +0x17,0x1b,0x1c,0xbf,0x10,0x68,0x10,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x62,0x49, +0x25,0x1, 0x60,0x7a,0x1f,0x2, 0xcc,0x7e,0x1f,0x2, 0xb6,0xbe,0x18,0x0, 0x0, 0x68, +0x10,0x74,0x4, 0xac,0xbc,0x49,0x35,0x1, 0x5a,0x49,0x25,0x1, 0x58,0x7a,0x1f,0x2, +0xc8,0x7e,0xb3,0x2, 0x54,0x20,0xe4,0x2, 0x41,0x71,0x7e,0x37,0x2, 0x4d,0x12,0x1d, +0x58,0xbe,0xb3,0x2, 0x58,0x50,0x4, 0x4c,0xcc,0x68,0x41,0x7d,0x23,0xb, 0x24,0x12, +0x1d,0x82,0xbe,0xb3,0x2, 0x58,0x50,0x5, 0x12,0x1d,0x71,0x68,0x2f,0x7d,0x23,0xb, +0x25,0x12,0x1d,0x82,0xbe,0xb3,0x2, 0x58,0x50,0x8, 0x7e,0x53,0x5, 0x54,0xbc,0x5c, +0x68,0x1a,0x2e,0x34,0x0, 0x3, 0x12,0x1d,0x58,0xbe,0xb3,0x2, 0x58,0x40,0x2, 0x41, +0x71,0x7e,0xb3,0x5, 0x53,0x14,0xbc,0xbc,0x68,0x2, 0x41,0x71,0x4c,0xcc,0x78,0x4, +0x6c,0xff,0x80,0x17,0x12,0x1d,0x71,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xd, 0x12,0x1d, +0x61,0x78,0x5, 0x7e,0xf0,0x2, 0x80,0x3, 0x7e,0xf0,0x3, 0xa, 0x1f,0x7d,0x1, 0x2e, +0x7, 0x2, 0x4d,0x12,0x1d,0x68,0x7c,0xab,0x74,0x4, 0xa4,0x12,0x16,0x1c,0x7a,0x1f, +0x2, 0xbe,0x7e,0x57,0x1, 0xf6,0x1a,0x4a,0x1a,0x48,0xbf,0x21,0x48,0x2, 0x41,0x71, +0x7e,0x1f,0x2, 0xbe,0x9f,0x12,0x12,0x1f,0xee,0x1a,0x24,0x7e,0x2f,0x2, 0xbe,0xbf, +0x12,0x58,0x4, 0x7a,0x1f,0x2, 0xbe,0x7e,0x1f,0x2, 0xbe,0x7d,0x1, 0x2e,0x7, 0x2, +0x4f,0x12,0x1d,0x68,0xca,0xb8,0x2e,0x17,0x2, 0x51,0x12,0x1d,0x79,0x7c,0x3b,0xda, +0xb8,0x12,0x47,0x45,0x58,0x4, 0x7a,0x1f,0x2, 0xbe,0x4c,0xcc,0x68,0x5, 0x12,0x1d, +0x61,0x78,0x38,0x7e,0xf, 0x2, 0xbe,0x7e,0x1f,0x2, 0xcc,0xbf,0x10,0x58,0x8, 0x9f, +0x22,0x7a,0x2f,0x2, 0xcc,0x80,0xa, 0x7d,0x51,0x6d,0x44,0x9f,0x12,0x7a,0x1f,0x2, +0xcc,0x7e,0x1f,0x2, 0xd8,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xd8,0x80, +0x40,0x6d,0x0, 0x9f,0x10,0x7a,0x1f,0x2, 0xd8,0x80,0x36,0x7e,0xf, 0x2, 0xbe,0x7e, +0x1f,0x2, 0xc8,0xbf,0x10,0x58,0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xc8,0x80,0xa, 0x7d, +0x51,0x6d,0x44,0x9f,0x12,0x7a,0x1f,0x2, 0xc8,0x7e,0x1f,0x2, 0xd4,0xbf,0x10,0x58, +0x8, 0x9f,0x22,0x7a,0x2f,0x2, 0xd4,0x80,0x8, 0x6d,0x0, 0x9f,0x10,0x7a,0x1f,0x2, +0xd4,0x7e,0x93,0x5, 0x54,0xa, 0x29,0xa, 0x3c,0x12,0x46,0xa9,0x1a,0x38,0x7d,0xf3, +0x1a,0xe6,0x7f,0x7, 0x1b,0xc, 0x7e,0x5f,0x2, 0xc8,0x7f,0x15,0x12,0x0, 0x78,0x7f, +0x41,0x7e,0x6f,0x2, 0xd0,0x7f,0x16,0x7f,0x7, 0x12,0x0, 0x78,0x2f,0x41,0x7f,0x7, +0xb, 0xc, 0x7e,0x7f,0x2, 0xcc,0x7f,0x17,0x12,0x0, 0x78,0x2f,0x14,0x7a,0x1f,0x2, +0xae,0x7f,0x16,0x2f,0x15,0x2f,0x17,0x7a,0x1f,0x2, 0xb2,0x7e,0xf, 0x2, 0xb6,0xbe, +0x8, 0x0, 0x0, 0x38,0x2, 0x61,0x90,0xa, 0x39,0x6d,0x22,0x1b,0x1c,0xbf,0x1, 0x40, +0x2, 0x61,0x90,0xe4,0x7a,0xb3,0x5, 0x51,0x12,0x1e,0x92,0x7e,0x1f,0x2, 0xcc,0x7a, +0x1d,0x10,0x7a,0xd1,0x15,0x7e,0x1f,0x2, 0xd0,0x7e,0xf, 0x2, 0xc8,0x7c,0xbc,0x12, +0x1e,0x99,0x7c,0xeb,0x7e,0xa3,0x5, 0x51,0xbe,0xa0,0x0, 0x28,0x50,0xbe,0xe0,0x0, +0x48,0x4b,0x7e,0xb3,0x5, 0x53,0xbc,0xbe,0x8, 0x43,0x7e,0xb3,0x5, 0x54,0xa, 0x2b, +0x1a,0x3e,0x12,0x0, 0x46,0x7c,0x95,0x7a,0x91,0x8, 0x1a,0x1e,0x3e,0x14,0x3e,0x14, +0x12,0x18,0x9a,0xa, 0x1a,0x6d,0x0, 0x12,0x0, 0x78,0x74,0x7, 0x7f,0x71,0x1e,0xf4, +0xe, 0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7a,0x7f,0x2, 0xdc,0x1a, +0x19,0x12,0x4f,0xc4,0x2f,0x10,0x12,0x1d,0x9d,0x2f,0x17,0x80,0x3f,0x7e,0x73,0x5, +0x52,0xbe,0x70,0x0, 0x8, 0x3a,0x7e,0x63,0x5, 0x54,0xa, 0x26,0x1a,0x47,0x7d,0x34, +0x12,0x0, 0x46,0x7c,0x75,0x7a,0x71,0x8, 0x3e,0x44,0x3e,0x44,0x49,0x14,0x1, 0x5e, +0x49,0x4, 0x1, 0x5c,0x7f,0x70,0x1e,0xf4,0xe, 0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, +0x1a,0x17,0x12,0x4f,0xc4,0x9f,0x10,0x12,0x1d,0x9d,0x9f,0x17,0x7a,0x1f,0x2, 0xb2, +0x7e,0x1f,0x2, 0xae,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf, 0x2, 0xb2,0x12, +0x0, 0xe5,0x2e,0x18,0x0, 0x20,0xbe,0x18,0x0, 0x0, 0x58,0x8, 0x6d,0x11,0x7a,0x17, +0x2, 0xc6,0x80,0x4, 0x7a,0x37,0x2, 0xc6,0x12,0x4f,0xe9,0xa, 0x2a,0x1b,0x24,0xa, +0x3c,0xbd,0x32,0x8, 0xc, 0xa, 0x2a,0xa, 0x3c,0x9d,0x32,0x7c,0xb7,0xf5,0x9, 0x80, +0x8, 0xa, 0x4a,0xa, 0x5c,0x2d,0x54,0xf5,0x9, 0x7c,0xbc,0x12,0x40,0x9a,0x7a,0x1f, +0x2, 0xb6,0xe5,0x9, 0x12,0x40,0x9a,0x7a,0x1f,0x2, 0xba,0x12,0x4f,0x80,0x8, 0x5, +0x12,0x4f,0xb4,0x80,0x3, 0x12,0x4f,0xa4,0x12,0x4f,0x39,0x7a,0x1f,0x2, 0xc2,0x7e, +0xb3,0x2, 0x54,0x20,0xe3,0x2, 0xa1,0x30,0x12,0x7, 0x7d,0xb4,0x1, 0x2, 0x80,0x2, +0xa1,0x30,0x7e,0x37,0x2, 0x0, 0x1a,0x26,0x1a,0x24,0x7e,0xf, 0x2, 0xc2,0xbf,0x1, +0x48,0xb, 0x7e,0x37,0x2, 0x2, 0x12,0x40,0x62,0x18,0x2, 0xa1,0x30,0x12,0x1d,0x61, +0x38,0x12,0xa, 0x7, 0x7e,0x63,0x2, 0x56,0xa, 0x16,0x9d,0x10,0xa, 0x2c,0xbd,0x12, +0x8, 0x2, 0xa1,0x30,0xbc,0x7c,0xa, 0x3c,0x28,0x14,0x2e,0x37,0x2, 0x45,0x12,0x1d, +0x58,0x12,0x1d,0x8b,0x12,0x1d,0x58,0xf5,0xa, 0x7a,0xc1,0xb, 0x80,0x1d,0x2e,0x37, +0x2, 0x45,0x7e,0xa3,0x5, 0x53,0xa, 0x2a,0x12,0x1d,0x56,0x12,0x1d,0x8b,0x12,0x1d, +0x56,0xf5,0xa, 0xa, 0x4a,0xa, 0x5c,0x9d,0x54,0xf5,0xb, 0x7e,0x73,0x2, 0x58,0xbe, +0x71,0xa, 0x38,0x2, 0xa1,0x30,0xbc,0x7f,0x38,0x2, 0xa1,0x30,0x7e,0xa1,0xa, 0x74, +0x4, 0xa4,0x12,0x17,0xb0,0x12,0x16,0x18,0x2f,0x10,0x7a,0x1f,0x2, 0xbe,0x7e,0x17, +0x1, 0xf6,0x1a,0x2, 0x1a,0x0, 0xbf,0x1, 0x48,0x2, 0xa1,0x30,0x7e,0x1f,0x2, 0xbe, +0x9f,0x10,0x12,0x1f,0xee,0x1a,0x24,0x7e,0xf, 0x2, 0xbe,0xbf,0x10,0x58,0x4, 0x7a, +0x1f,0x2, 0xbe,0x7e,0x1f,0x2, 0xbe,0xe5,0xb, 0xa, 0x1b,0x7d,0x1, 0x2e,0x7, 0x2, +0x49,0x12,0x1d,0x68,0x54,0x7f,0xca,0xb8,0x2e,0x17,0x2, 0x4b,0x12,0x1d,0x79,0x7c, +0x3b,0xda,0xb8,0x12,0x47,0x45,0x58,0x4, 0x7a,0x1f,0x2, 0xbe,0xe5,0xb, 0xa, 0x3b, +0x2e,0x37,0x2, 0x49,0x12,0x1d,0x58,0x23,0x54,0x1, 0x68,0x7, 0x12,0x1d,0x94,0x2f, +0x10,0x80,0x15,0x12,0x1d,0x94,0xbf,0x10,0x50,0x8, 0x9f,0x0, 0x7a,0xf, 0x2, 0xba, +0x80,0xa, 0x7e,0xf, 0x2, 0xbe,0x9f,0x10,0x7a,0x1f,0x2, 0xba,0x12,0x4f,0x80,0x8, +0x5, 0x12,0x4f,0xb4,0x80,0x3, 0x12,0x4f,0xa4,0x12,0x4f,0x39,0x7a,0x1f,0x2, 0xc2, +0x7e,0x47,0x2, 0xc6,0x74,0x5, 0xac,0xbd,0x59,0x45,0x0, 0x3e,0x7e,0x1f,0x2, 0xc2, +0x59,0x35,0x0, 0x40,0xb, 0xd0,0x12,0x7, 0x7d,0xa, 0x2b,0xa, 0x3d,0xbd,0x32,0x58, +0x2, 0x1, 0xb9,0xda,0x3b,0x22,0x9d,0x32,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93, +0x22,0x7e,0x73,0x5, 0x54,0xbc,0x7c,0x22,0x7a,0x11,0x82,0x7a,0x1, 0x83,0xe4,0x93, +0x22,0x7e,0xb3,0x5, 0x54,0x14,0xbc,0xbc,0x22,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4, +0x93,0x22,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7c,0xfb,0xa, 0x3c,0x2e, +0x37,0x2, 0x47,0x22,0x7e,0xf, 0x2, 0xbe,0x7e,0x1f,0x2, 0xba,0x22,0x7a,0x1f,0x2, +0xae,0x7e,0x1f,0x2, 0xb2,0x22,0xca,0xf8,0x7c,0xab,0x7f,0x70,0x7f,0x61,0x6c,0x11, +0x6c,0xff,0x7e,0x34,0x2, 0xae,0x7e,0x24,0x0, 0x40,0xe4,0x12,0x2, 0xee,0x6c,0x0, +0xa5,0xb8,0x8, 0x6, 0xbc,0xa1,0x28,0x2, 0x6c,0x11,0x7e,0x30,0x4, 0xac,0x30,0x12, +0x18,0x9a,0xbf,0x16,0x8, 0x11,0x7e,0x30,0x4, 0xac,0x31,0x59,0x31,0x2, 0xb0,0x59, +0x21,0x2, 0xae,0xb, 0x10,0x80,0x6, 0xbc,0xa1,0x28,0x2, 0x6c,0x11,0xb, 0x0, 0xa5, +0xb8,0x10,0xcd,0xbc,0xa1,0x38,0x2b,0x7e,0x1f,0x1, 0xa4,0xbf,0x17,0x58,0x23,0x7e, +0x34,0x2, 0xae,0xa, 0x2a,0x12,0x2f,0xf8,0x12,0x4f,0xfe,0x49,0x35,0x2, 0xb0,0x49, +0x25,0x2, 0xae,0x7f,0x1, 0x2f,0x0, 0x7e,0x1f,0x2, 0xae,0xbf,0x1, 0x8, 0x3, 0x7e, +0xf0,0x1, 0x7c,0xbf,0xda,0xf8,0x22,0x75,0x8, 0x4, 0x7e,0x18,0x27,0x10,0x7e,0x8, +0x9c,0x40,0x74,0x8, 0x12,0x1d,0xa6,0x70,0x10,0x75,0x8, 0x4, 0x7e,0x18,0x4e,0x20, +0x7e,0x8, 0xea,0x60,0x74,0x6, 0x12,0x1d,0xa6,0x70,0x10,0x75,0x8, 0x4, 0x7e,0x18, +0x5, 0xdc,0x7e,0x8, 0x13,0x88,0x74,0x8, 0x12,0x1d,0xa6,0x60,0x10,0x7e,0xb3,0x2, +0x54,0x44,0x2, 0x7a,0xb3,0x2, 0x54,0xe4,0x7a,0xb3,0x5, 0x59,0x22,0x7e,0xa3,0x2, +0x54,0x7c,0xba,0x30,0xe1,0x1b,0x7e,0xb3,0x5, 0x59,0x4, 0x7a,0xb3,0x5, 0x59,0xbe, +0xb0,0x14,0x40,0xd, 0xe4,0x7a,0xb3,0x5, 0x59,0x7c,0xba,0x54,0xfd,0x7a,0xb3,0x2, +0x54,0x22,0x74,0xff,0x7a,0xb3,0x5, 0x52,0x22,0xca,0xf8,0x7c,0xfb,0x7f,0x40,0x7a, +0x1d,0xc, 0x7e,0x30,0xff,0xbe,0x48,0x0, 0x0, 0x8, 0x50,0x7e,0x1d,0x10,0xbe,0x18, +0x0, 0x0, 0x8, 0x47,0xbf,0x41,0x8, 0x20,0x7e,0x1d,0xc, 0x7f,0x4, 0x12,0x1f,0x8b, +0x1a,0x1f,0x1b,0x15,0x7e,0x23,0x5, 0x54,0xbc,0x2f,0x68,0x2c,0xa, 0x22,0xb, 0x24, +0xa, 0x3f,0xbd,0x32,0x78,0x25,0x80,0x20,0x7e,0x1d,0xc, 0x7e,0xd, 0x10,0x12,0x1f, +0x8b,0xa, 0x1f,0xb, 0x15,0x7e,0x23,0x5, 0x54,0x7c,0xb2,0x24,0xfe,0xbc,0xbf,0x68, +0x7, 0x7c,0xb2,0x14,0xbc,0xbf,0x78,0x3, 0x7e,0x30,0xff,0x7e,0x23,0x5, 0x53,0xbc, +0x23,0x8, 0x5, 0xbe,0x30,0x0, 0x58,0xa, 0xe4,0x7a,0xb3,0x5, 0x51,0x12,0x1e,0x92, +0x80,0x74,0x6c,0x22,0x80,0x65,0xe5,0x15,0xbc,0xb2,0x68,0x5d,0xa, 0x2, 0x9, 0x10, +0x0, 0x3a,0x7e,0xa3,0x5, 0x53,0x7c,0xb1,0x84,0x7c,0x1a,0x7e,0x3, 0x5, 0x54,0xbc, +0x3, 0x8, 0x8, 0x7e,0x73,0x5, 0x54,0xbc,0x71,0x38,0xc, 0xbc,0x3, 0x18,0x3a,0x7e, +0x3, 0x5, 0x54,0xbc,0x1, 0x38,0x32,0x7c,0xb3,0x7c,0x71,0x7e,0x60,0x1, 0x12,0x41, +0xf5,0xb4,0x1, 0x25,0xbc,0x13,0x78,0x17,0x7e,0x1d,0x10,0xbf,0x41,0x1a,0x33,0x8, +0x4, 0xb, 0x34,0x80,0x2, 0x1b,0x34,0x7c,0x27,0x7a,0x23,0x5, 0x52,0x80,0x3, 0x12, +0x1e,0x92,0xe4,0x7a,0xb3,0x5, 0x51,0x80,0xd, 0xb, 0x20,0x12,0x7, 0x7d,0xa, 0x2b, +0xa, 0x32,0xbd,0x32,0x48,0x90,0x7c,0xb3,0xda,0xf8,0x22,0x12,0x1f,0x93,0x7a,0xb3, +0x5, 0x51,0x22,0x7f,0x60,0x7f,0x71,0x7e,0x14,0x0, 0x74,0x7f,0x17,0x12,0x0, 0x89, +0x74,0x7, 0x7f,0x51,0x1e,0xb4,0x1e,0xa4,0x50,0x4, 0x4e,0xb4,0x80,0x0, 0x14,0x78, +0xf3,0x7e,0x14,0x0, 0x54,0x7f,0x17,0x12,0x0, 0x89,0x7f,0x1, 0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0xbf,0x65,0x8, 0x3, 0x74,0x80, +0x22,0xbf,0x61,0x58,0x2, 0xe4,0x22,0x74,0x9, 0x7f,0x16,0x2f,0x11,0x14,0x78,0xfb, +0x2f,0x0, 0x2f,0x0, 0x9f,0x10,0x7f,0x7, 0x12,0x0, 0x94,0x7c,0xb7,0x22,0x7a,0x1f, +0x2, 0xbe,0x7e,0x37,0x1, 0xf8,0x1a,0x26,0x22,0xca,0xf8,0x7c,0xf7,0x7c,0xab,0x7c, +0xbf,0x1e,0xb0,0xa, 0x4b,0xa, 0xa, 0x12,0x20,0x18,0x7d,0x12,0x3e,0x14,0x12,0x20, +0x18,0x7d,0x51,0x2d,0x53,0xda,0xf8,0x22,0x7d,0x30,0x7d,0x24,0x2, 0x0, 0x46,0x9f, +0x11,0x7a,0x1f,0x0, 0x56,0x7a,0x1f,0x0, 0xba,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a, +0x49,0xf3,0x1, 0x5e,0x49,0xe3,0x1, 0x5c,0x7e,0xf, 0x0, 0x56,0x2f,0x7, 0x7a,0xf, +0x0, 0x56,0x49,0x13,0x1, 0x7e,0x49,0x3, 0x1, 0x7c,0x7e,0x1f,0x0, 0xba,0x2f,0x10, +0x7a,0x1f,0x0, 0xba,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xd0,0x22,0xa, 0x2b,0x5e,0x24, +0x0, 0x1, 0x7c,0xa7,0x1e,0xa0,0xa, 0x3a,0xad,0x32,0x7c,0x5b,0x1e,0x50,0xa, 0x55, +0x2d,0x53,0x22,0x7e,0xb3,0x0, 0xb4,0xca,0xf8,0x7c,0xfb,0x74,0x20,0x7a,0xb3,0x2, +0x56,0x74,0x4, 0x7a,0xb3,0x2, 0x57,0x74,0x24,0x7a,0xb3,0x2, 0x58,0x7e,0xb3,0x2, +0xa9,0x44,0xf, 0x7a,0xb3,0x2, 0xa9,0x44,0xf0,0x7a,0xb3,0x2, 0xa9,0x7e,0x73,0x0, +0xa6,0x7a,0x73,0x2, 0xa7,0x7e,0x73,0x0, 0xa7,0x7a,0x73,0x2, 0xa8,0x7e,0x34,0x2, +0x5e,0x7e,0x24,0x2, 0x59,0x74,0x24,0x7e,0x30,0x98,0x12,0x21,0xe7,0x6c,0x33,0x80, +0x11,0x7c,0xb3,0x7e,0x73,0x2, 0x56,0x12,0x20,0x5c,0xa, 0x33,0x19,0xb3,0x2, 0x7d, +0xb, 0x30,0x7e,0x23,0x2, 0x56,0xbc,0x23,0x38,0xe7,0x6c,0x33,0x80,0x18,0xa, 0x3, +0x7e,0x53,0x2, 0x56,0xa, 0x35,0x2d,0x30,0x7c,0x27,0xa, 0x33,0xa, 0x5, 0x2d,0x3, +0x19,0x20,0x2, 0x7d,0xb, 0x30,0x7e,0x23,0x2, 0x57,0xbc,0x23,0x38,0xe0,0x7e,0xb3, +0x2, 0xa3,0x44,0x1, 0x7a,0xb3,0x2, 0xa3,0xbe,0xf0,0x1, 0x78,0xd, 0x7e,0xb3,0x2, +0xa3,0x54,0xfd,0x12,0x21,0xcc,0x44,0x8, 0x80,0x21,0xbe,0xf0,0x2, 0x7e,0xb3,0x2, +0xa3,0x78,0x11,0x54,0xfd,0x7a,0xb3,0x2, 0xa3,0x7e,0xb3,0x2, 0xab,0x54,0xfb,0x12, +0x21,0xd6,0x80,0x7, 0x44,0x2, 0x12,0x21,0xcc,0x44,0x18,0x7a,0xb3,0x2, 0xab,0x7e, +0xb3,0x2, 0xa3,0x54,0xfb,0x7a,0xb3,0x2, 0xa3,0x44,0x18,0x7a,0xb3,0x2, 0xa3,0x7e, +0x63,0x0, 0xb5,0x5e,0x60,0x7, 0x7c,0xb6,0xc4,0x23,0x54,0xe0,0x7c,0x6b,0x7e,0x73, +0x2, 0xa3,0x12,0x21,0xdd,0x7c,0xb7,0xc4,0x3, 0x54,0x7, 0xbe,0xb0,0x0, 0x28,0x10, +0x7c,0xb7,0x30,0xe1,0xb, 0x7c,0x67,0x9e,0x60,0x20,0x5e,0x60,0xe0,0x12,0x21,0xdd, +0x7e,0x63,0x0, 0xb6,0x5e,0x60,0x7f,0x7e,0x73,0x2, 0xa4,0x5e,0x70,0x80,0x4c,0x76, +0x7a,0x73,0x2, 0xa4,0x7e,0x63,0x0, 0xb7,0x5e,0x60,0x7f,0x7e,0x73,0x2, 0xa5,0x5e, +0x70,0x80,0x4c,0x76,0x7a,0x73,0x2, 0xa5,0x7e,0xb3,0x2, 0xa6,0x54,0xf0,0x44,0x1, +0x7a,0xb3,0x2, 0xa6,0x54,0xf, 0x44,0x20,0x7a,0xb3,0x2, 0xa6,0x12,0x26,0xcb,0x7a, +0xb3,0x2, 0xab,0x54,0x7f,0x7a,0xb3,0x2, 0xab,0xda,0xf8,0x22,0x7a,0xb3,0x2, 0xa3, +0x7e,0xb3,0x2, 0xab,0x44,0x4, 0x7a,0xb3,0x2, 0xab,0x54,0xc7,0x22,0x5e,0x70,0x1f, +0x4c,0x76,0x7a,0x73,0x2, 0xa3,0x22,0x7c,0x23,0x7c,0x3b,0xa5,0xba,0x97,0x24,0xbe, +0x30,0x1c,0x50,0x4, 0x7c,0x23,0x80,0x3, 0x7e,0x20,0x1c,0x6c,0xaa,0x80,0xf, 0x12, +0x22,0x22,0xa, 0x4b,0x2e,0x44,0x2, 0xc2,0x12,0x22,0x28,0x12,0x22,0x31,0xbc,0x2a, +0x38,0xed,0x22,0x6c,0xaa,0x80,0x6, 0x12,0x22,0x22,0x12,0x22,0x31,0xbc,0x3a,0x38, +0xf6,0x22,0xa, 0xa, 0x7d,0x40,0x2d,0x43,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93, +0x22,0x2d,0x2, 0x7a,0x9, 0xb0,0xb, 0xa0,0x22,0xe5,0x26,0x30,0xe0,0x20,0x12,0x20, +0x73,0x12,0x24,0xfa,0x78,0x6, 0x7e,0x34,0x0, 0xa8,0x80,0x9, 0xbe,0xa0,0x2, 0x78, +0x7, 0x7e,0x34,0x0, 0xae,0x12,0x24,0x2b,0x12,0x16,0x25,0x53,0x26,0xfc,0xe5,0x26, +0x30,0xe2,0x12,0x53,0xca,0xe1,0x7e,0x73,0x0, 0xb8,0xa, 0x37,0x3e,0x34,0x7c,0xb7, +0x42,0xca,0x53,0x26,0xfb,0x22,0x12,0x0, 0x2e,0x70,0x2, 0x61,0x54,0x80,0x4, 0xe4, +0x12,0x17,0x41,0x12,0x13,0xa4,0x50,0xf7,0x75,0xe1,0x0, 0x12,0x25,0x5, 0x7c,0xba, +0x12,0x24,0xf1,0x12,0x25,0xf, 0x75,0xe3,0x0, 0x7c,0xba,0x1e,0xb0,0x12,0x24,0xf1, +0x7c,0xb7,0x42,0xe3,0x7c,0xba,0xc4,0x23,0x54,0x3, 0xa, 0x3b,0x12,0x25,0x22,0x7c, +0xb7,0x42,0xe3,0x12,0x25,0x16,0x7c,0xb7,0x42,0xe3,0x75,0xe7,0x0, 0x7c,0xba,0x30, +0xe1,0x5, 0x43,0xe7,0x33,0x80,0x3, 0x43,0xe7,0x11,0x74,0x1, 0x7e,0x73,0x2, 0xa4, +0x5e,0x70,0x7f,0x12,0x23,0x55,0x74,0x2, 0x7e,0x73,0x2, 0xa5,0x5e,0x70,0x7f,0x12, +0x23,0x55,0x74,0x3, 0xca,0xb8,0x7e,0x63,0x2, 0xa6,0x7c,0x76,0x12,0x25,0x29,0x7c, +0x7b,0x7c,0xb6,0xc4,0x54,0xf, 0x2c,0x7b,0xda,0xb8,0x12,0x23,0x55,0x74,0x6, 0x7e, +0x70,0x61,0x12,0x23,0x55,0x12,0x23,0x5b,0x74,0x53,0x7e,0x73,0x2, 0xa9,0x5e,0x70, +0xf, 0x12,0x23,0x55,0x74,0x54,0xca,0xb8,0x7e,0xb3,0x2, 0xa9,0xc4,0x7c,0x7b,0x5e, +0x70,0xf, 0xda,0xb8,0x12,0x23,0x55,0x7e,0xb3,0x2, 0xa3,0xc4,0x23,0x54,0x3, 0xbe, +0xb0,0x1, 0x68,0x3, 0xb4,0x2, 0x15,0x74,0x5b,0x7e,0x73,0x2, 0xaa,0x12,0x23,0x55, +0x74,0x5c,0x7e,0x73,0x2, 0xab,0x5e,0x70,0x3, 0x12,0x23,0x55,0x43,0xe1,0x8, 0x74, +0x2, 0x2, 0x25,0x32,0x22,0xf5,0xe4,0x7a,0x71,0xe5,0x22,0x53,0xe1,0xf, 0x7e,0x73, +0x2, 0xab,0x7c,0xb7,0x1e,0xb0,0x1e,0xb0,0x54,0x1, 0xa, 0x2b,0x12,0x24,0xe8,0x7c, +0xb5,0x42,0xe1,0x7c,0xb7,0x30,0xe2,0x58,0x7c,0xb7,0xc4,0x23,0x7c,0x7b,0x5e,0x70, +0x7, 0xa5,0xbf,0x0, 0x5, 0x7e,0x60,0x4, 0x80,0x39,0xa5,0xbf,0x1, 0x11,0x7e,0xb3, +0x2, 0xa3,0x30,0xe1,0x5, 0x7e,0x60,0x2, 0x80,0x29,0x7e,0x60,0x5, 0x80,0x24,0xa5, +0xbf,0x3, 0x11,0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, 0x7e,0x60,0x7, 0x80,0x14,0x7e, +0x60,0x6, 0x80,0xf, 0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x5, 0x7e,0x60,0x3, 0x80,0x3, +0x7e,0x60,0x1, 0xa, 0x26,0x3e,0x24,0x12,0x24,0xe8,0x7c,0x75,0x7c,0xb7,0x42,0xe1, +0x74,0x7, 0x7e,0x73,0x2, 0x56,0x12,0x23,0x55,0x74,0x8, 0x7e,0x73,0x2, 0x57,0x12, +0x23,0x55,0x74,0x9, 0x6c,0x77,0x12,0x23,0x55,0x6c,0xaa,0x80,0xf, 0x7c,0xba,0x24, +0x2f,0xa, 0x4a,0x9, 0x74,0x2, 0x59,0x12,0x23,0x55,0xb, 0xa0,0x7e,0x73,0x2, 0x58, +0xbc,0x7a,0x38,0xe9,0x7c,0xa7,0x80,0xc, 0x7c,0xba,0x24,0x2f,0x7e,0x70,0x3f,0x12, +0x23,0x55,0xb, 0xa0,0xbe,0xa0,0x24,0x40,0xef,0x74,0x56,0x7e,0x73,0x2, 0xa7,0x12, +0x23,0x55,0x74,0x57,0x7e,0x73,0x2, 0xa8,0x2, 0x23,0x55,0x7d,0x23,0x74,0x7, 0x7e, +0x70,0x10,0x12,0x23,0x55,0x74,0x8, 0x12,0x23,0x55,0x74,0x9, 0x7e,0x70,0x4, 0x12, +0x23,0x55,0x74,0x56,0x7e,0x29,0x70,0x12,0x23,0x55,0x74,0x57,0x9, 0x72,0x0, 0x1, +0x12,0x23,0x55,0x74,0x58,0x9, 0x72,0x0, 0x2, 0x2, 0x23,0x55,0xca,0xf8,0x12,0xf, +0x2d,0x12,0x26,0xf9,0x7a,0x37,0x2, 0xac,0x12,0x26,0xc4,0x12,0x20,0x73,0x12,0x38, +0x2d,0x12,0x24,0xfa,0x78,0x6, 0x7e,0x34,0x0, 0xa8,0x80,0x9, 0xbe,0xa0,0x2, 0x78, +0x7, 0x7e,0x34,0x0, 0xae,0x12,0x24,0x2b,0x12,0x16,0x25,0x75,0x18,0x3, 0x75,0x16, +0x40,0x12,0xf, 0x2d,0x7a,0x37,0x0, 0x38,0xe5,0x18,0xb4,0x3, 0x42,0xe5,0x1e,0x60, +0xf0,0x12,0x27,0x9d,0x12,0x22,0x39,0x12,0x10,0x5c,0x6c,0xff,0x80,0x12,0x74,0x4, +0xac,0xbf,0x49,0x35,0x0, 0xce,0x74,0x2, 0xac,0xbf,0x59,0x35,0x4, 0x31,0xb, 0xf0, +0x12,0xf, 0xe8,0x38,0xe9,0x75,0x1e,0x0, 0x7e,0xb3,0x4, 0xd9,0x54,0x7f,0x7a,0xb3, +0x4, 0xd9,0xe5,0x26,0x20,0xe0,0xba,0x74,0x1, 0x7a,0xb3,0x0, 0xb9,0x80,0xb2,0xe5, +0x18,0x7a,0xb3,0x3, 0xc4,0xda,0xf8,0x22,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x22,0x1e,0xb0,0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x22,0x12,0x22,0x76,0x7e,0xa3,0x0, +0xb4,0xbe,0xa0,0x1, 0x22,0x7e,0xa3,0x2, 0xa3,0x7c,0xba,0x54,0x1, 0xa, 0x3b,0x3e, +0x34,0x7c,0xb7,0x42,0xe1,0x22,0x7c,0xba,0xc4,0x3, 0x54,0x7, 0xa, 0x3b,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x5e,0x70,0xf, 0x7c,0xb7,0xc4,0x54, +0xf0,0x22,0x7c,0xab,0x80,0x7, 0x7e,0x34,0x0, 0x42,0x12,0x3f,0x3f,0x7c,0x7a,0x1b, +0xa0,0xa5,0xbf,0x0, 0xf1,0x22,0x7e,0x27,0x2, 0xac,0x6c,0x66,0x80,0x6, 0x12,0x25, +0x95,0x12,0x25,0x5d,0x7e,0x73,0x2, 0x58,0xbc,0x76,0x38,0xf2,0x22,0x7c,0xb6,0x24, +0xb, 0x7c,0x7a,0x12,0x23,0x55,0xb, 0x60,0x22,0x7e,0xb3,0x2, 0xab,0x20,0xe7,0x24, +0x7e,0x27,0x2, 0xac,0x6c,0x66,0x80,0x14,0x12,0x25,0x95,0x12,0x27,0x2, 0x60,0x5, +0x3e,0x44,0x14,0x78,0xfb,0x7c,0x79,0x4c,0xa7,0x12,0x25,0x5d,0x7e,0x73,0x2, 0x58, +0xbc,0x76,0x38,0xe4,0x22,0xa, 0x16,0x9, 0x71,0x2, 0x7d,0xa, 0x17,0x2d,0x12,0x7e, +0x19,0xa0,0x22,0x6c,0x77,0xa, 0x27,0x9, 0x62,0x0, 0xc0,0x19,0x62,0x0, 0xc2,0xb, +0x70,0xbe,0x70,0x2, 0x40,0xef,0x7e,0x73,0x0, 0x54,0x12,0x25,0x29,0x4c,0x7b,0x7a, +0x73,0x0, 0x54,0x7e,0x73,0x0, 0x55,0x12,0x25,0x29,0x4c,0x7b,0x7a,0x73,0x0, 0x55, +0x22,0x7e,0x37,0x0, 0x5a,0x4d,0x33,0x78,0x30,0x12,0x7, 0x7d,0xbe,0xb0,0x0, 0x28, +0x5, 0x75,0x27,0x0, 0xc1,0xab,0x7e,0xb3,0x0, 0x5c,0x20,0xe0,0x2, 0xc1,0xab,0x7e, +0x53,0x0, 0x61,0xbe,0x51,0x27,0x28,0x2, 0xc1,0xab,0x75,0x27,0x0, 0x7e,0x24,0x0, +0x1, 0x7a,0x27,0x0, 0x5a,0x74,0x1, 0x80,0x73,0xbe,0x34,0x0, 0x1, 0x78,0x19,0x12, +0x7, 0x7d,0x78,0x2, 0xc1,0xab,0x6d,0x22,0x7a,0x27,0x0, 0x5a,0xe4,0x7a,0xb3,0x3, +0xad,0x75,0x28,0x22,0xd2,0x1, 0xc1,0xab,0xbe,0x34,0x0, 0x3, 0x78,0x7d,0xa9,0xd6, +0xeb,0xa9,0xc6,0xac,0xa9,0xc6,0xec,0xc2,0x96,0xc2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7, +0xd2,0xa8,0x80,0x4, 0xe4,0x12,0x17,0x41,0x12,0x13,0xa4,0x50,0xf7,0x20,0x93,0xfd, +0xa9,0xc0,0xca,0x75,0xe7,0x0, 0x53,0xe1,0xf7,0x74,0x2, 0x12,0x17,0x41,0x12,0xf, +0x2d,0x7a,0x37,0x0, 0x38,0x12,0x0, 0x8, 0xc2,0xa8,0xc2,0x95,0xa9,0xd0,0xca,0x12, +0x27,0xa8,0x12,0x22,0x76,0x6d,0x33,0x7a,0x37,0x0, 0x5a,0xe4,0x7a,0xb3,0x3, 0xad, +0x80,0x29,0xe4,0x12,0x17,0x41,0x20,0x93,0x22,0x7e,0x37,0x0, 0x5a,0x4d,0x33,0x78, +0xe, 0xe5,0xcc,0x54,0x7, 0xbe,0xb0,0x2, 0x68,0x11,0x75,0xcc,0x2, 0x80,0xc, 0xe5, +0xcc,0x54,0x7, 0xbe,0xb0,0x7, 0x68,0x3, 0x75,0xcc,0x7, 0x30,0x1, 0xd4,0x75,0x28, +0x0, 0xc2,0x1, 0x20,0x93,0x3, 0x75,0xcc,0x50,0x22,0xe5,0x9a,0x60,0x5, 0xd2,0x9c, +0xa9,0xd6,0xdf,0x22,0x75,0x18,0x3, 0x75,0x1e,0x0, 0x22,0x7e,0xb3,0x2, 0xab,0x54, +0xbf,0x22,0xca,0x79,0x6d,0x77,0x7a,0x77,0x0, 0x7f,0x7e,0x34,0x3, 0xe8,0x7a,0x37, +0x0, 0x38,0x12,0x26,0xcb,0x7a,0xb3,0x2, 0xab,0x12,0x16,0x25,0x12,0xf, 0x44,0x7a, +0x77,0x0, 0x7f,0x12,0x27,0xb, 0xda,0x79,0x22,0x7a,0x37,0x0, 0x38,0x7e,0x34,0x0, +0x82,0x22,0x7e,0xb3,0x5, 0x27,0x7e,0x44,0x0, 0x1, 0x22,0x7e,0x34,0x0, 0x64,0x7a, +0x37,0x0, 0x38,0x22,0x6d,0x33,0x7a,0x37,0x0, 0x7f,0x12,0x27,0xb, 0x2, 0x27,0x20, +0x7e,0x34,0x3, 0x88,0x7e,0xb3,0x3, 0xe7,0x30,0xe0,0x71,0x54,0xfe,0x7a,0xb3,0x3, +0xe7,0x9, 0x53,0x0, 0x5, 0x7a,0x53,0x0, 0x67,0xa, 0x25,0x12,0x24,0xe8,0x7a,0x27, +0x0, 0x65,0x9, 0x53,0x0, 0x25,0xa, 0x25,0x7a,0x27,0x0, 0x5a,0x9, 0x53,0x0, 0x6, +0x7a,0x53,0x0, 0x5c,0x9, 0x53,0x0, 0x8, 0x7a,0x53,0x0, 0x5e,0xbe,0x50,0xf, 0x40, +0x6, 0x74,0xe, 0x19,0xb3,0x0, 0x8, 0x9, 0x53,0x0, 0x8, 0xa, 0x25,0x2e,0x24,0x2, +0xfe,0x12,0x1d,0x82,0x7a,0xb3,0x0, 0x5d,0x9, 0x53,0x0, 0x9, 0x7a,0x53,0x0, 0x60, +0x7a,0x53,0x0, 0x5f,0x9, 0x53,0x0, 0x7, 0x7a,0x53,0x0, 0x61,0x9, 0x53,0x0, 0x24, +0x7a,0x53,0x0, 0x62,0x9, 0x73,0x0, 0x2e,0x7a,0x73,0x0, 0xb4,0x22,0x7e,0xb3,0x2, +0xab,0x44,0x80,0x7a,0xb3,0x2, 0xab,0x22,0x75,0xeb,0x3, 0xa9,0xd6,0xac,0xa9,0xd6, +0xec,0xd2,0x86,0x22,0xe4,0x12,0x3f,0x58,0x12,0x27,0xa8,0x12,0x27,0xeb,0x74,0x1, +0x2, 0x27,0xc3,0x70,0x3, 0xc2,0xaf,0x22,0xd2,0xaf,0x22,0x12,0x27,0xb4,0x2, 0x0, +0x17,0xc2,0x8e,0xe5,0x89,0x54,0xf, 0x44,0x20,0xf5,0x89,0x75,0x8d,0x1, 0x75,0x8b, +0x0, 0xd2,0x8e,0xd2,0xab,0xa9,0xc3,0xb7,0xd2,0xbb,0x22,0xa9,0xd1,0x99,0x75,0x9a, +0xfe,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x12,0x2d,0x17,0x30,0xe, 0x36,0x7e,0xf, 0x0, +0xba,0x7e,0x1f,0x0, 0x56,0x2f,0x10,0x7e,0x8, 0x0, 0x64,0x12,0x0, 0xe5,0xbe,0x18, +0x5, 0xdc,0x8, 0x8, 0x12,0x3e,0x4f,0xbe,0xb0,0x2, 0x40,0x6, 0xbe,0x18,0x9, 0xc4, +0x8, 0x11,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x1, 0xfe,0x7e,0x34,0x0, 0xa, 0x7a,0x35, +0x31,0x80,0x1a,0x7e,0x35,0x31,0x4d,0x33,0x68,0xb, 0x1b,0x34,0x7a,0x35,0x31,0x7e, +0x34,0x1, 0x2c,0x80,0x4, 0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x1, 0xfe,0x12,0x2a,0x16, +0x12,0x2b,0x45,0x2, 0x28,0x56,0xca,0xd8,0xca,0x79,0x6c,0xff,0x7e,0x35,0x2c,0x9, +0x73,0x0, 0x1a,0x5e,0x70,0xf, 0x7e,0x63,0x4, 0x8a,0xbe,0x60,0x1, 0x28,0x4d,0xbe, +0x73,0x4, 0x8a,0x50,0x47,0x30,0xe, 0x44,0x6c,0xee,0x80,0x35,0x7e,0x70,0x7, 0xac, +0x7e,0x9, 0xb3,0x4, 0x91,0x30,0xe1,0x27,0x30,0xe0,0x4, 0xb, 0xf0,0x80,0x20,0xbe, +0xf0,0x0, 0x28,0x1b,0x9, 0xd3,0x4, 0x90,0x7c,0xbd,0x12,0x28,0xc1,0x60,0x10,0x7c, +0xbd,0x7e,0x70,0x6, 0x12,0x29,0x16,0x12,0x2a,0xef,0xac,0x5e,0x12,0x2a,0xf8,0xb, +0xe0,0x7e,0x73,0x4, 0x8a,0xbc,0x7e,0x38,0xc3,0x12,0x2b,0x8, 0xda,0x79,0xda,0xd8, +0x22,0x12,0x29,0x75,0x7e,0xb3,0x2, 0xc3,0x12,0x28,0xe4,0x78,0x12,0x7e,0xb3,0x2, +0xc4,0x12,0x28,0xe4,0x78,0x9, 0x7e,0xb3,0x2, 0xc5,0x12,0x28,0xe4,0x68,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x12,0x28,0xec,0xa, 0x3b,0x4d,0x33,0x22,0x7c,0xab,0x6c,0x77, +0x80,0x11,0xa, 0x27,0x2e,0x25,0x2c,0x7e,0x29,0x60,0xbc,0x6a,0x78,0x3, 0x74,0x1, +0x22,0xb, 0x70,0x7e,0x25,0x2c,0x9, 0xb2,0x0, 0x1a,0x54,0xf, 0xa, 0x1b,0xa, 0x27, +0xbd,0x21,0x48,0xde,0xe4,0x22,0xca,0x79,0x7c,0xe7,0x7c,0xfb,0x7a,0xf3,0x2, 0xae, +0x7e,0x34,0x2, 0xae,0x12,0x29,0x7d,0x7c,0xbf,0x12,0x17,0x5b,0x7e,0xa3,0x2, 0xae, +0x74,0x4, 0xa4,0x2e,0x55,0x2a,0x49,0x15,0x0, 0x2, 0xb, 0x58,0x0, 0x7a,0xf, 0x2, +0xb2,0xbf,0x1, 0x78,0x3, 0xe4,0x80,0x2a,0x12,0x17,0xe2,0xa, 0x1e,0x6d,0x0, 0x12, +0x0, 0x78,0x7f,0x1, 0x7e,0x1f,0x2, 0xb2,0xbf,0x10,0x8, 0x15,0x7e,0x1f,0x2, 0xb2, +0xbe,0x18,0x7, 0xd0,0x8, 0xb, 0x7c,0xbf,0x12,0x28,0xc1,0x60,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xda,0x79,0x22,0x7a,0xb3,0x2, 0xc2,0x7e,0x34,0x2, 0xc2,0x7d,0x23,0x7e, +0x29,0xa0,0xbe,0xa0,0x10,0x50,0x3a,0xa, 0x3a,0x2e,0x34,0x0, 0x8, 0x7c,0xb7,0x19, +0xb2,0x0, 0x1, 0xb4,0x10,0x6, 0xa, 0x3b,0xb, 0x34,0x80,0x5a,0xa, 0x3b,0xb4,0x17, +0x9, 0x1b,0x34,0x12,0x2a,0x0, 0x1b,0x34,0x80,0x51,0x1b,0x34,0x7c,0xb7,0x19,0xb2, +0x0, 0x2, 0x9, 0xb2,0x0, 0x1, 0xa, 0x3b,0xb, 0x34,0x7c,0xb7,0x19,0xb2,0x0, 0x3, +0x22,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x19,0x72,0x0, 0x1, 0xa5,0xbf,0x8, 0xd, 0xa, +0x17,0xb, 0x14,0x12,0x2a,0xb, 0xa, 0x16,0xb, 0x14,0x80,0xf, 0xa5,0xbf,0xf, 0x12, +0xa, 0x17,0x1b,0x14,0x12,0x2a,0xb, 0xa, 0x16,0x1b,0x14,0x7c,0x63,0x19,0x62,0x0, +0x3, 0x22,0xa, 0x37,0x1b,0x34,0x12,0x2a,0x0, 0xb, 0x34,0x19,0x72,0x0, 0x3, 0x22, +0x19,0x72,0x0, 0x2, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x22,0x7c,0x63,0x19,0x62,0x0, +0x2, 0x9, 0x62,0x0, 0x1, 0x22,0x12,0x2a,0x26,0x7a,0xb3,0x4, 0x8a,0xbe,0xb0,0x1, +0x28,0x3, 0x2, 0x2a,0x30,0x22,0x7e,0x35,0x2c,0x9, 0xb3,0x0, 0x1a,0x54,0xf, 0x22, +0xca,0xd8,0xca,0x79,0xc2,0xf, 0x12,0x2a,0x26,0xbe,0xb0,0x1, 0x38,0x2, 0x41,0xde, +0x7e,0xb3,0x4, 0xa7,0x70,0x2, 0x41,0xde,0x7e,0xf0,0x1, 0x41,0xd4,0xc2,0xf, 0x74, +0x7, 0xac,0xbf,0x9, 0xe5,0x4, 0x90,0x9, 0xd5,0x4, 0x8f,0x49,0xd5,0x4, 0x8d,0x49, +0xc5,0x4, 0x8b,0x7c,0xbe,0x7e,0x70,0xe, 0x12,0x2b,0xb2,0x7f,0x71,0xbe,0xd0,0x19, +0x40,0x2, 0xd2,0xf, 0xbe,0x68,0x9, 0xc4,0x48,0x7, 0xbe,0xd0,0xa, 0x40,0x2, 0xd2, +0xf, 0x7f,0x17,0x2e,0x18,0x5, 0xdc,0xbf,0x61,0x8, 0x7, 0xbe,0xd0,0x3, 0x40,0x2, +0xd2,0xf, 0x7e,0x8, 0x0, 0x4, 0x7e,0x1f,0x4, 0x8b,0x12,0x0, 0xe5,0x2e,0x18,0x5, +0xdc,0xbf,0x61,0x8, 0x13,0xbe,0x68,0x1f,0x40,0x8, 0xd, 0x12,0x2a,0xe6,0x20,0xe1, +0x7, 0xbe,0xd0,0x3, 0x40,0x2, 0xd2,0xf, 0xbe,0x68,0x4e,0x20,0x8, 0x8, 0x12,0x2a, +0xe6,0x20,0xe1,0x2, 0xd2,0xf, 0xa2,0xf, 0xe4,0x33,0x12,0x2a,0xef,0xac,0x5f,0x12, +0x2a,0xf8,0xb, 0xf0,0x12,0x2a,0x26,0x12,0x2f,0xe2,0x58,0x2, 0x41,0x4d,0x12,0x2b, +0x8, 0xda,0x79,0xda,0xd8,0x22,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x4, 0x91,0x22,0x7c, +0x6b,0x5e,0x60,0x1, 0x7e,0x50,0x7, 0x22,0x2e,0x24,0x4, 0x91,0x7e,0x29,0x70,0x5e, +0x70,0xfe,0x4c,0x76,0x7a,0x29,0x70,0x22,0x6c,0x66,0x6c,0x77,0x7e,0x50,0x7, 0xac, +0x57,0x9, 0xb2,0x4, 0x91,0x30,0xe0,0x10,0x9, 0xa2,0x4, 0x90,0x7c,0x56,0xb, 0x60, +0xa, 0x25,0x2e,0x25,0x2c,0x7a,0x29,0xa0,0xb, 0x70,0xbe,0x70,0x4, 0x40,0xdd,0x5e, +0x60,0xf, 0x7e,0x25,0x2c,0x2e,0x24,0x0, 0x1a,0x7e,0x29,0x70,0x5e,0x70,0xf0,0x4c, +0x76,0x7a,0x29,0x70,0x22,0xca,0xd8,0xca,0x79,0x12,0x7, 0x7d,0x68,0x5f,0x7e,0xb3, +0x4, 0xa7,0x60,0x59,0x6c,0xff,0x80,0x4a,0x7e,0x70,0x7, 0xac,0x7f,0x9, 0xb3,0x4, +0x91,0x30,0xe0,0x3c,0x9, 0xe3,0x4, 0x90,0x9, 0xd3,0x4, 0x8f,0x49,0xd3,0x4, 0x8d, +0x49,0xc3,0x4, 0x8b,0x7c,0xbe,0x7e,0x70,0x10,0x12,0x2b,0xb2,0x7f,0x51,0xbe,0xd0, +0x8, 0x50,0x1d,0x7f,0x15,0x2e,0x18,0x3, 0x41,0xbf,0x61,0x58,0x13,0xbe,0x68,0xb, +0xb8,0x58,0xd, 0x7e,0x70,0x7, 0xac,0x7f,0x12,0x2f,0xe9,0x54,0xfe,0x7a,0x39,0xb0, +0xb, 0xf0,0x7e,0x73,0x4, 0x8a,0xbc,0x7f,0x38,0xae,0x12,0x2b,0x8, 0xda,0x79,0xda, +0xd8,0x22,0xca,0x79,0x7c,0xa7,0x7c,0x9b,0x9f,0x0, 0xa, 0x39,0x12,0x2f,0xf1,0x7c, +0x45,0xa, 0x39,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x7c,0x57,0xa5,0xbc,0x0, 0x8, 0x7e, +0xe0,0x2, 0x7e,0xf0,0x2, 0x80,0x16,0xa, 0x74,0xa5,0xbc,0x7, 0x6, 0x1b,0x75,0x7c, +0xef,0x80,0xa, 0x1b,0x74,0x7c,0xef,0xa, 0x34,0xb, 0x34,0x7c,0xf7,0x7e,0x70,0x8, +0xac,0x75,0x2c,0xe7,0x2c,0xf7,0x7e,0x90,0x4, 0xac,0x9f,0x2e,0x45,0x2a,0x12,0x2d, +0xf, 0x7e,0x90,0x4, 0xac,0x9e,0x2e,0x45,0x2a,0x12,0x2c,0x26,0xbf,0x71,0x8, 0x2, +0x80,0x2, 0x7f,0x17,0xbe,0x18,0x0, 0x0, 0x58,0x2, 0x7f,0x10,0xa, 0x1a,0x6d,0x0, +0x12,0x17,0xdf,0xda,0x79,0x22,0x49,0xf4,0x0, 0x2, 0xb, 0x48,0xe0,0x22,0x7c,0x3b, +0x4d,0x33,0x78,0x2, 0xa1,0xa, 0x4d,0x22,0x78,0x2, 0xa1,0xa, 0xe4,0x7a,0xb3,0x2, +0x3c,0x6c,0xaa,0x80,0x6c,0x12,0x41,0xed,0x12,0x2c,0x26,0xbe,0x7c,0xf8,0x30,0x58, +0x5, 0xbe,0xa0,0x20,0x40,0x15,0xbe,0x7c,0xf2,0x54,0x58,0x4c,0xbe,0xa0,0x20,0x40, +0x47,0x7e,0x7f,0x1, 0xa4,0xbe,0x78,0xb, 0xb8,0x58,0x3d,0xa, 0xa, 0x9, 0xb0,0x4, +0xd, 0xbe,0xb0,0xfa,0x50,0xa, 0x7d,0xf0,0x2e,0xf4,0x4, 0xd, 0x4, 0x7a,0xf9,0xb0, +0x9, 0x20,0x4, 0xd, 0xbe,0x20,0xf, 0x28,0x26,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, +0xb, 0x8, 0xd0,0x6d,0xcc,0x12,0x2c,0x26,0x2f,0x76,0xbe,0x78,0x32,0xc8,0x58,0xf, +0x74,0x1, 0x7a,0xb3,0x2, 0x3c,0x80,0x7, 0xe4,0xa, 0x4a,0x19,0xb4,0x4, 0xd, 0xb, +0xa0,0xbc,0x3a,0x38,0x90,0x6c,0xaa,0x80,0x49,0x7e,0x50,0x4, 0xac,0x5a,0x2d,0x23, +0x49,0x12,0x0, 0x2, 0xb, 0x28,0x0, 0xbe,0xc, 0xfd,0x6c,0x58,0x2c,0x7e,0xb3,0x2, +0x3c,0x70,0x26,0xa, 0x2a,0x9, 0xb2,0x3, 0xe9,0xbe,0xb0,0xfa,0x50,0xa, 0x7d,0x42, +0x2e,0x44,0x3, 0xe9,0x4, 0x7a,0x49,0xb0,0x9, 0xb2,0x3, 0xe9,0xbe,0xb0,0x14,0x28, +0xf, 0x74,0x2, 0x7a,0xb3,0x2, 0x3c,0x80,0x7, 0xe4,0xa, 0x2a,0x19,0xb2,0x3, 0xe9, +0xb, 0xa0,0x7e,0xb3,0x2, 0x56,0xbc,0xba,0x38,0xaf,0x22,0x2e,0x44,0x0, 0xcc,0x49, +0x34,0x0, 0x2, 0xb, 0x48,0x20,0x22,0x12,0x2f,0x4d,0xc2,0xf, 0x7e,0x34,0x4, 0xa9, +0x12,0x2d,0xc9,0xd2,0xf, 0x7e,0x34,0x4, 0x84,0x12,0x2d,0xc9,0x7e,0x34,0x4, 0xa9, +0x12,0x2d,0x76,0x7e,0x34,0x4, 0x84,0x12,0x2d,0x76,0x7e,0xb3,0x4, 0x89,0x1e,0xb0, +0x54,0x3, 0xa, 0x2b,0x7e,0xb3,0x4, 0xae,0x1e,0xb0,0x54,0x3, 0xa, 0x3b,0x2d,0x32, +0x68,0x5, 0x12,0x2a,0x26,0x78,0x5, 0xc2,0xe, 0x12,0x4e,0x9a,0x7e,0xb3,0x4, 0xae, +0x20,0xe0,0x7, 0x7e,0xb3,0x4, 0x89,0x30,0xe0,0x9, 0xd2,0xe, 0x74,0x78,0x7a,0xb3, +0x4, 0xa7,0x22,0xc2,0xe, 0x22,0x49,0x43,0x0, 0x2, 0x9, 0x53,0x0, 0x4, 0x9, 0xa3, +0x0, 0x5, 0x7c,0xba,0x1e,0xb0,0x54,0x3, 0xbe,0xb0,0x0, 0x28,0x30,0xbe,0x44,0xb, +0xb8,0x28,0x2, 0x80,0x18,0xbe,0x44,0x7, 0xd0,0x28,0x7, 0xbe,0x50,0x14,0x38,0x28, +0x80,0xb, 0xbe,0x44,0x3, 0x20,0x28,0xc, 0xbe,0x50,0x10,0x38,0x1b,0x12,0x2f,0x44, +0x44,0x1, 0x80,0x5, 0x12,0x2f,0x44,0x54,0xfe,0x7a,0x49,0xb0,0x22,0x2e,0x34,0x0, +0x5, 0x7c,0xba,0x54,0xfe,0x7a,0x39,0xb0,0x22,0xca,0x3b,0x7d,0x73,0x6c,0xdd,0x9f, +0x11,0x7a,0x1f,0x2, 0xdf,0x6c,0xcc,0x74,0x4, 0x30,0xf, 0xd, 0x12,0x2f,0x33,0x49, +0x34,0x0, 0xb2,0x49,0x24,0x0, 0xb0,0x80,0xb, 0x12,0x2f,0x33,0x49,0x34,0x0, 0x92, +0x49,0x24,0x0, 0x90,0x59,0x35,0x2, 0xb1,0x59,0x25,0x2, 0xaf,0xb, 0xc0,0xbe,0xc0, +0x8, 0x78,0xd4,0x7e,0x34,0x2, 0xaf,0x7e,0x24,0x2, 0xcf,0x12,0x41,0x74,0x7a,0xb3, +0x2, 0xae,0xbe,0xb0,0x2, 0x28,0x6, 0x74,0x2, 0x7a,0xb3,0x2, 0xae,0x7e,0x63,0x2, +0xae,0x5e,0x60,0x3, 0x3e,0x60,0x7d,0x27,0x2e,0x24,0x0, 0x5, 0x7e,0x29,0x70,0x5e, +0x70,0xf9,0x4c,0x76,0x7a,0x29,0x70,0x7e,0x34,0x2, 0xd7,0x7e,0x24,0x0, 0x8, 0xe4, +0x12,0x2, 0xee,0x7e,0x34,0x2, 0xd7,0x7e,0x24,0x2, 0xcf,0x7e,0xb3,0x2, 0xae,0x12, +0x46,0xb2,0x7e,0xb3,0x2, 0xae,0x70,0x6, 0x7e,0x18,0x0, 0x1, 0x80,0x11,0x7e,0xa3, +0x2, 0xcf,0x74,0x4, 0xa4,0x49,0x35,0x2, 0xb1,0x49,0x25,0x2, 0xaf,0x2f,0x11,0x7a, +0x1f,0x2, 0xdf,0x9f,0x11,0x7a,0x1f,0x2, 0xe3,0x6c,0xcc,0xa, 0x3c,0x9, 0xb3,0x2, +0xd7,0x70,0x1e,0x74,0x4, 0xac,0xbc,0x49,0x15,0x2, 0xb1,0x49,0x5, 0x2, 0xaf,0xbe, +0x8, 0x0, 0x64,0x8, 0xc, 0x7e,0x1f,0x2, 0xe3,0x2f,0x10,0x7a,0x1f,0x2, 0xe3,0xb, +0xd0,0xb, 0xc0,0xbe,0xc0,0x8, 0x78,0xd3,0xbe,0xd0,0x0, 0x28,0x18,0xa, 0x1d,0x6d, +0x0, 0x7e,0x1f,0x2, 0xe3,0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xe3,0xbe,0x18,0x0, 0x1, +0x58,0x3, 0x12,0x2f,0x3b,0x7e,0x1f,0x2, 0xdf,0xbe,0x18,0x0, 0x1, 0x18,0x8, 0x7e, +0x18,0x0, 0x1, 0x7a,0x1f,0x2, 0xdf,0x7e,0x1f,0x2, 0xe3,0xbe,0x18,0x0, 0x1, 0x18, +0x3, 0x12,0x2f,0x3b,0x7e,0x6f,0x2, 0xe3,0x7e,0x7f,0x2, 0xdf,0x7f,0x17,0x7f,0x6, +0x12,0x0, 0xe5,0xbe,0x34,0x0, 0x64,0x28,0x4, 0x7e,0x34,0x0, 0x64,0xbe,0x68,0xfd, +0xe8,0x48,0x8, 0x7e,0x8, 0xfd,0xe8,0x7a,0xf, 0x2, 0xe3,0xbe,0x78,0xfd,0xe8,0x48, +0x8, 0x7e,0x8, 0xfd,0xe8,0x7a,0xf, 0x2, 0xdf,0x7e,0xf, 0x2, 0xe3,0x7d,0x21,0x59, +0x27,0x0, 0x2, 0x7e,0xf, 0x2, 0xdf,0x7d,0x21,0x1b,0x78,0x20,0x19,0x77,0x0, 0x4, +0xda,0x3b,0x22,0xac,0xbc,0x7d,0x45,0x2e,0x45,0x2a,0x22,0x7e,0x18,0x0, 0x1, 0x7a, +0x1f,0x2, 0xe3,0x22,0x7d,0x43,0x2e,0x44,0x0, 0x5, 0x7c,0xba,0x22,0xca,0x79,0x6c, +0xff,0x7e,0x70,0x7, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x4, 0x91,0x7e,0x29,0xb0,0x54, +0xfe,0x7a,0x29,0xb0,0x9f,0x0, 0x59,0x13,0x4, 0x8d,0x59,0x3, 0x4, 0x8b,0xe4,0x19, +0xb3,0x4, 0x8f,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xd7,0x6c,0xff,0x80,0x59,0xa, 0x3f, +0x2e,0x35,0x2c,0x7e,0x39,0xe0,0x7e,0x30,0x7, 0xac,0x3f,0x19,0xe1,0x4, 0x90,0x7e, +0x10,0x4, 0xac,0x1e,0x2e,0x5, 0x2a,0x12,0x4e,0x92,0x59,0x31,0x4, 0x8d,0x59,0x21, +0x4, 0x8b,0x7c,0xbe,0x12,0x4d,0xdb,0x7c,0xab,0x7e,0x50,0x7, 0xac,0x5f,0x19,0xa2, +0x4, 0x8f,0x7d,0x32,0x12,0x2f,0xe9,0x44,0x1, 0x7a,0x39,0xb0,0xbe,0xe0,0x8, 0x40, +0xc, 0xbe,0xe0,0x18,0x50,0x7, 0x7e,0x39,0xb0,0x44,0x2, 0x80,0x5, 0x7e,0x39,0xb0, +0x54,0xfd,0x7a,0x39,0xb0,0xb, 0xf0,0x12,0x2a,0x26,0x12,0x2f,0xe2,0x48,0x9f,0xda, +0x79,0x22,0xa, 0x2b,0xa, 0x3f,0xbd,0x32,0x22,0x2e,0x34,0x4, 0x91,0x7e,0x39,0xb0, +0x22,0x7e,0x24,0x0, 0x8, 0x2, 0x0, 0x46,0x6d,0x11,0x80,0x3e,0x6d,0x0, 0x80,0x2e, +0x7d,0xf0,0x3e,0xf4,0x3e,0xf4,0x7d,0xef,0x2d,0xe3,0x12,0x30,0x3f,0x49,0x5e,0x0, +0x2, 0xb, 0xe8,0x40,0xbf,0x26,0x58,0x14,0x12,0x30,0x3f,0x59,0xde,0x0, 0x2, 0x1b, +0xe8,0xc0,0x2d,0xf3,0x59,0x5f,0x0, 0x6, 0x59,0x4f,0x0, 0x4, 0xb, 0x4, 0x7d,0xf2, +0x1b,0xf4,0x9d,0xf1,0xbd,0xf0,0x38,0xc8,0xb, 0x14,0xbd,0x21,0x38,0xbe,0x22,0x49, +0xde,0x0, 0x6, 0x49,0xce,0x0, 0x4, 0x22,0xbe,0xb0,0xa, 0x50,0x8, 0x7c,0x1b,0x2e, +0x10,0x16,0xa5,0xe7,0x22,0x2, 0x30,0x58,0xca,0x79,0xb4,0xa, 0x5, 0x7e,0xf0,0x20, +0x21,0x8a,0xb4,0xb, 0x5, 0x7e,0xf0,0x3, 0x21,0x8a,0xb4,0xc, 0x6, 0x7e,0xf3,0x0, +0xb5,0x21,0x8a,0xb4,0xd, 0x1c,0x7e,0xb3,0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0xf3,0x0, +0xa8,0x21,0x8a,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xae,0x21,0x8a,0x7e,0xf3,0x0, 0xa6, +0x21,0x8a,0xb4,0xe, 0x1c,0x7e,0xb3,0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0xf3,0x0, 0xa9, +0x21,0x8a,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xaf,0x21,0x8a,0x7e,0xf3,0x0, 0xa7,0x21, +0x8a,0xb4,0xf, 0x6, 0x7e,0xf3,0x0, 0xb6,0x21,0x8a,0xb4,0x10,0x6, 0x7e,0xf3,0x0, +0xb7,0x21,0x8a,0xbe,0xb0,0x11,0x40,0xd, 0xbe,0xb0,0x34,0x38,0x8, 0xa, 0x3b,0x9, +0xf3,0x0, 0x71,0x21,0x8a,0xbe,0xb0,0x35,0x40,0x2b,0xbe,0xb0,0x58,0x38,0x26,0xa, +0x7b,0x9e,0x74,0x0, 0x35,0xbe,0xf0,0x20,0x50,0xc, 0x7c,0xbf,0x7e,0x70,0x20,0x12, +0x1f,0xf9,0xa, 0x3b,0x80,0x2, 0xa, 0x3f,0x2e,0x34,0x2, 0x5e,0x12,0x1d,0x58,0x7c, +0xfb,0xb, 0xf0,0x21,0x8a,0xb4,0x59,0x6, 0x7e,0xf3,0x0, 0xb8,0x80,0x7c,0xb4,0x5a, +0x5, 0x7e,0xf0,0xf, 0x80,0x74,0xb4,0xac,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, +0x7e,0xf3,0x0, 0xb0,0x80,0x64,0x7e,0xf3,0x0, 0xaa,0x80,0x5e,0xb4,0xa0,0x4, 0x6c, +0xff,0x80,0x57,0xb4,0xa1,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, +0xb1,0x80,0x47,0x7e,0xf3,0x0, 0xab,0x80,0x41,0xb4,0xa2,0x13,0x7e,0xb3,0x0, 0xb4, +0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb2,0x80,0x31,0x7e,0xf3,0x0, 0xac,0x80,0x2b,0xb4, +0xa3,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0xf3,0x0, 0xb3,0x80,0x1b,0x7e, +0xf3,0x0, 0xad,0x80,0x15,0xb4,0xad,0x6, 0x7e,0xf3,0x0, 0xb9,0x80,0xc, 0xb4,0xae, +0x6, 0x7e,0xf3,0x0, 0xb4,0x80,0x3, 0x7e,0xf0,0xee,0x7c,0xbf,0xda,0x79,0x22,0x7c, +0xab,0x24,0x0, 0x78,0x5, 0x7e,0xb3,0x4, 0xd9,0x22,0xbe,0xa0,0xae,0x38,0xc, 0x7e, +0xb3,0x3, 0xc4,0xb4,0x3, 0x24,0x7c,0xba,0x2, 0x30,0x48,0xbe,0xa0,0xb0,0x40,0x1a, +0xbe,0xa0,0xf7,0x38,0x15,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0xe, 0xa, 0x3a,0x2e,0x34, +0x4, 0x31,0x9e,0x34,0x0, 0xb0,0x7e,0x39,0xb0,0x22,0x7c,0xba,0x22,0xca,0xf8,0x30, +0x90,0x79,0xd2,0x7, 0x7e,0xb3,0x4, 0xd7,0x4, 0x7a,0xb3,0x4, 0xd7,0x7e,0x93,0x4, +0xd7,0xbe,0x90,0x1, 0x78,0x8, 0xe5,0x91,0x7a,0xb3,0x4, 0xda,0x80,0x36,0x7e,0xf3, +0x4, 0xd9,0x7c,0xbf,0xc4,0x7c,0xfb,0x7c,0x8f,0x5e,0x80,0x7, 0x78,0x8, 0x12,0x33, +0x26,0x12,0x34,0x1e,0x80,0x1e,0xbe,0x80,0x4, 0x78,0x8, 0x12,0x33,0x26,0x12,0x34, +0xb0,0x80,0x11,0x7c,0xbf,0x54,0x7, 0xb4,0x1, 0xa, 0x7e,0xb3,0x4, 0xd7,0x12,0x33, +0x28,0x12,0x3e,0xcf,0x12,0x35,0x65,0x78,0xe, 0xe4,0x12,0x32,0xa3,0xb4,0x10,0x2, +0x80,0x14,0x12,0x35,0xba,0x80,0x12,0xbe,0xf0,0x4, 0x78,0x5, 0x12,0x35,0xb0,0x80, +0x8, 0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x35,0xc4,0xc2,0x90,0x30,0x91,0x52,0xc2,0x7, +0x7e,0xb3,0x4, 0xd5,0x4, 0x12,0x35,0x61,0x78,0x13,0xe4,0x12,0x32,0xa3,0xb4,0x10, +0x6, 0x7e,0xb3,0x4, 0xd5,0x80,0x23,0x7e,0xb3,0x4, 0xd5,0x80,0x28,0xbe,0xf0,0x4, +0x78,0xf, 0x7e,0xb3,0x4, 0xd5,0x2e,0xb3,0x4, 0xda,0x12,0x31,0x8f,0xf5,0x91,0x80, +0x1d,0xbe,0xf0,0x1, 0x7e,0xb3,0x4, 0xd5,0x78,0xb, 0x2e,0xb3,0x4, 0xda,0x12,0x0, +0x27,0xf5,0x91,0x80,0x9, 0x2e,0xb3,0x4, 0xda,0x12,0x32,0xa3,0xf5,0x91,0xc2,0x91, +0xda,0xf8,0x22,0x7c,0x7b,0xbe,0x70,0x80,0x40,0xc, 0xbe,0x70,0xde,0x38,0x7, 0xa, +0x37,0x9, 0xb3,0x3, 0x8, 0x22,0xa5,0xbf,0x0, 0x5, 0x7e,0xb3,0x4, 0xd9,0x22,0x30, +0x6, 0x6, 0x7e,0x24,0x4, 0xb1,0x80,0x4, 0x7e,0x24,0x4, 0xc3,0x7a,0x25,0x24,0x7c, +0xb7,0x14,0xbe,0xb0,0xe, 0x50,0x4c,0x7e,0xa0,0x3, 0xa4,0x90,0x32,0xdf,0x73,0x2, +0x33,0x9, 0x2, 0x33,0x11,0x2, 0x33,0x19,0x2, 0x33,0x19,0x2, 0x33,0x19,0x2, 0x33, +0x19,0x2, 0x33,0x19,0x2, 0x33,0x19,0x2, 0x33,0x19,0x2, 0x33,0x19,0x2, 0x33,0x19, +0x2, 0x33,0x19,0x2, 0x33,0x19,0x2, 0x33,0x19,0x7e,0x35,0x24,0x9, 0xb3,0x0, 0x4, +0x22,0x7e,0x35,0x24,0x9, 0xb3,0x0, 0x3, 0x22,0xa, 0x37,0x2e,0x35,0x24,0x9, 0xb3, +0x0, 0x2, 0x22,0x74,0xff,0x22,0x7c,0xb9,0x2e,0xb3,0x4, 0xda,0x24,0xfe,0x7e,0x71, +0x91,0x22,0xbe,0xb0,0xa, 0x50,0xa, 0x7c,0x1b,0x2e,0x10,0x16,0x7c,0xb7,0xa5,0xf7, +0x22,0x2, 0x33,0x44,0x7c,0xa7,0xb4,0xc, 0x6, 0x7e,0x34,0x0, 0xb5,0x81,0xf, 0xb4, +0xd, 0x1c,0x7e,0xb3,0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0xa8,0x81,0xf, 0xb4, +0x2, 0x6, 0x7e,0x34,0x0, 0xae,0x81,0xf, 0x7e,0x34,0x0, 0xa6,0x81,0xf, 0xb4,0xe, +0x1c,0x7e,0xb3,0x0, 0xb4,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0xa9,0x81,0xf, 0xb4,0x2, +0x6, 0x7e,0x34,0x0, 0xaf,0x81,0xf, 0x7e,0x34,0x0, 0xa7,0x81,0xf, 0xb4,0xf, 0x6, +0x7e,0x34,0x0, 0xb6,0x80,0x79,0xb4,0x10,0x6, 0x7e,0x34,0x0, 0xb7,0x80,0x70,0xb4, +0x59,0x9, 0x7e,0x34,0x0, 0xb8,0x43,0x26,0x4, 0x80,0x6f,0xb4,0xac,0x13,0x7e,0xb3, +0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb0,0x80,0x54,0x7e,0x34,0x0, 0xaa,0x80, +0x4e,0xb4,0xa1,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb1,0x80, +0x3e,0x7e,0x34,0x0, 0xab,0x80,0x38,0xb4,0xa2,0x13,0x7e,0xb3,0x0, 0xb4,0xb4,0x2, +0x6, 0x7e,0x34,0x0, 0xb2,0x80,0x28,0x7e,0x34,0x0, 0xac,0x80,0x22,0xb4,0xa3,0x13, +0x7e,0xb3,0x0, 0xb4,0xb4,0x2, 0x6, 0x7e,0x34,0x0, 0xb3,0x80,0x12,0x7e,0x34,0x0, +0xad,0x80,0xc, 0xb4,0xae,0xe, 0x7e,0x34,0x0, 0xb4,0xe4,0x7a,0xb3,0x0, 0xb9,0x43, +0x26,0x1, 0x80,0x6, 0xb4,0xaf,0x6, 0x2, 0x35,0xd9,0x7a,0x39,0xa0,0x22,0x7c,0x7, +0xbe,0xb0,0x80,0x40,0xb, 0xbe,0xb0,0xde,0x38,0x6, 0x24,0x80,0x7c,0x70,0x80,0x7c, +0x24,0x0, 0x78,0x7b,0x7e,0x14,0x4, 0xd9,0x7a,0x19,0x0, 0x5e,0x0, 0x70,0x7c,0xb0, +0xc4,0x54,0xf, 0x7c,0xb, 0xa5,0xb8,0x4, 0x15,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x7, +0x74,0x2, 0x7e,0x70,0x3, 0x80,0x34,0x74,0x3c,0x7e,0x70,0x3, 0x80,0x4e,0x7e,0xb3, +0x3, 0xc4,0xb4,0x3, 0x29,0x74,0x2, 0x7e,0x70,0x1, 0x12,0x33,0x32,0xa5,0xb8,0x1, +0x6, 0x74,0x2, 0x6c,0x77,0x80,0x14,0xa5,0xb8,0x0, 0x7, 0x74,0x2, 0x7e,0x70,0x1, +0x80,0x9, 0xa5,0xb8,0x3, 0x29,0x74,0x2, 0x7e,0x70,0x4, 0x2, 0x33,0x32,0xa5,0xb8, +0x1, 0x6, 0x74,0x3c,0x6c,0x77,0x80,0x14,0xa5,0xb8,0x4, 0x7, 0x74,0x3c,0x7e,0x70, +0x3, 0x80,0x9, 0xa5,0xb8,0x3, 0x8, 0x74,0x3c,0x7e,0x70,0x4, 0x2, 0x37,0x4d,0x22, +0x7c,0x6b,0x14,0x68,0x78,0x4, 0x68,0x2, 0xa1,0x39,0x7e,0x44,0x4, 0xd9,0x7a,0x49, +0x70,0x5e,0x70,0x70,0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0x7b,0xbe,0x70,0x4, 0x68,0x47, +0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x20,0xa5,0xbf,0x1, 0x6, 0x74,0x2, 0x6c,0x77,0x80, +0x66,0xa5,0xbf,0x0, 0x7, 0x74,0x2, 0x7e,0x70,0x1, 0x80,0x5b,0xa5,0xbf,0x3, 0x70, +0x74,0x2, 0x7e,0x70,0x4, 0x80,0x50,0xa5,0xbf,0x1, 0x6, 0x74,0x3c,0x6c,0x77,0x80, +0x29,0xa5,0xbf,0x4, 0x7, 0x74,0x3c,0x7e,0x70,0x3, 0x80,0x1e,0xa5,0xbf,0x3, 0x50, +0x74,0x3c,0x7e,0x70,0x4, 0x80,0x13,0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x7, 0x74,0x2, +0x7e,0x70,0x3, 0x80,0x22,0x74,0x3c,0x7e,0x70,0x3, 0x2, 0x37,0x4d,0x7a,0x73,0x4, +0xd8,0x7e,0x54,0x4, 0x31,0x7a,0x55,0x22,0x22,0xbe,0x60,0xa, 0x50,0xc, 0x7e,0xb3, +0x3, 0xc4,0xb4,0x3, 0x1b,0x7c,0xb6,0x2, 0x33,0x32,0xbe,0x60,0xa, 0x40,0x11,0xbe, +0x60,0xaf,0x38,0xc, 0x7e,0xb3,0x3, 0xc4,0xb4,0x3, 0x5, 0x7c,0xb6,0x2, 0x33,0x44, +0x22,0x7a,0xb3,0x4, 0xd5,0x7e,0xb3,0x4, 0xd9,0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x22, +0xca,0xf8,0xe4,0x12,0x35,0x61,0x78,0x5, 0x12,0x35,0xba,0x80,0x12,0xbe,0xf0,0x4, +0x78,0x5, 0x12,0x35,0xb0,0x80,0x8, 0xbe,0xf0,0x1, 0x78,0x3, 0x12,0x35,0xc4,0x75, +0x91,0x0, 0xe4,0x7a,0xb3,0x4, 0xd7,0x7a,0xb3,0x4, 0xd6,0x74,0xaa,0x7a,0xb3,0x4, +0xb1,0x7a,0xb3,0x4, 0xb2,0x7a,0xb3,0x4, 0xc3,0x7a,0xb3,0x4, 0xc4,0xda,0xf8,0x22, +0x7e,0xb3,0x4, 0xda,0x12,0x31,0x8f,0xf5,0x91,0x22,0x7e,0xb3,0x4, 0xda,0x12,0x32, +0xa3,0xf5,0x91,0x22,0x7e,0xb3,0x4, 0xda,0x12,0x0, 0x27,0xf5,0x91,0x22,0xe4,0x7a, +0xb3,0x4, 0xd9,0x12,0x37,0x81,0x2, 0x35,0x70,0x30,0x8, 0x8, 0x74,0x1, 0x12,0x35, +0xeb,0xc2,0x8, 0x22,0xe4,0x12,0x35,0xeb,0xd2,0x8, 0x22,0x70,0x3, 0xd2,0x86,0x22, +0xc2,0x86,0x22,0xca,0x3b,0x7c,0xeb,0x6c,0xaa,0x20,0x0, 0x8, 0x20,0x5, 0x5, 0x20, +0x2, 0x2, 0xe1,0x33,0x20,0x6, 0x6, 0x7e,0x4, 0x4, 0xb1,0x80,0x4, 0x7e,0x4, 0x4, +0xc3,0x7d,0x30,0x12,0x3f,0x0, 0x74,0xaa,0x7a,0x9, 0xb0,0x19,0xb0,0x0, 0x1, 0x74, +0x12,0x19,0xb0,0x0, 0x2, 0x7e,0xb3,0x0, 0x7c,0x19,0xb0,0x0, 0x4, 0x6c,0x77,0x6c, +0xff,0x7e,0x50,0x5, 0xac,0x5f,0x9, 0x62,0x0, 0x6c,0xbe,0x60,0xff,0x78,0x2, 0xc1, +0xdb,0xa, 0x46,0x9, 0xb4,0x0, 0xc0,0xbe,0xb0,0x3, 0x78,0x2, 0xc1,0xdb,0x49,0x12, +0x0, 0x68,0x7d,0x61,0xa, 0x6c,0x7d,0xf6,0x5e,0xf4,0x0, 0xf, 0x7d,0x6f,0x7c,0x6d, +0xa, 0xf7,0x2d,0xf0,0x19,0x6f,0x0, 0x5, 0x7c,0x63,0xa, 0x17,0x2d,0x10,0x19,0x61, +0x0, 0x6, 0x49,0x12,0x0, 0x6a,0xa, 0x22,0x5e,0x24,0x0, 0xf, 0x7c,0x65,0xa, 0x27, +0x2d,0x20,0x19,0x62,0x0, 0x7, 0x7c,0x63,0xa, 0x27,0x2d,0x20,0x19,0x62,0x0, 0x8, +0xe4,0xa, 0x27,0x2d,0x20,0x19,0xb2,0x0, 0x9, 0xa, 0x27,0x2d,0x20,0x19,0xb2,0x0, +0xa, 0x12,0x37,0x43,0xc4,0x54,0xf0,0xa, 0x27,0x2d,0x20,0x2e,0x24,0x0, 0x7, 0x12, +0x37,0x3a,0x12,0x37,0x43,0xbe,0xb0,0xff,0x68,0x1e,0x9, 0xb4,0x0, 0xc0,0xbe,0xb0, +0x1, 0x68,0x2, 0xb, 0xa0,0x9, 0xb4,0x0, 0xc0,0x3, 0x3, 0x54,0xc0,0xa, 0x27,0x2d, +0x20,0x2e,0x24,0x0, 0x5, 0x12,0x37,0x3a,0x2e,0x70,0x6, 0xb, 0xf0,0xbe,0xf0,0x2, +0x68,0x2, 0xc1,0x31,0x19,0xa0,0x0, 0x3, 0xe4,0x19,0xb0,0x0, 0x11,0x6c,0xff,0xa, +0x1f,0x2d,0x10,0x7e,0x19,0x60,0x7d,0x10,0x2e,0x14,0x0, 0x11,0x7e,0x19,0x70,0x6c, +0x76,0x7a,0x19,0x70,0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xe4,0x30,0x6, 0x4, 0xc2,0x6, +0x80,0x2, 0xd2,0x6, 0x30,0x5, 0x3, 0x12,0x4d,0xb4,0xc2,0x0, 0xc2,0x5, 0xc2,0x2, +0x74,0x1, 0x12,0x35,0xeb,0x7e,0x34,0x0, 0x3, 0x12,0x3f,0x3f,0xbe,0xe0,0x1, 0x78, +0x6, 0x80,0x0, 0xe4,0x12,0x35,0xeb,0xda,0x3b,0x22,0x7e,0x29,0x60,0x2c,0x6b,0x7a, +0x29,0x60,0x22,0x7e,0x50,0x5, 0xac,0x5f,0x9, 0xb2,0x0, 0x6c,0x22,0xbe,0xb0,0x5e, +0x38,0x2e,0xbe,0xb0,0x26,0x68,0x29,0xbe,0xb0,0x2f,0x68,0x24,0xbe,0xb0,0x23,0x68, +0x1f,0xbe,0xb0,0x28,0x68,0x1a,0xbe,0xb0,0x21,0x68,0x15,0xbe,0xb0,0x22,0x68,0x10, +0xa, 0x2b,0x19,0x72,0x3, 0x88,0x7e,0xb3,0x3, 0xe7,0x44,0x1, 0x7a,0xb3,0x3, 0xe7, +0x22,0x7e,0x50,0x70,0x7e,0x34,0x78,0x0, 0x12,0x37,0xb6,0x7c,0x4b,0x7e,0x34,0x78, +0x1, 0x12,0x37,0xb6,0xbe,0x40,0xff,0x68,0x7, 0x6c,0xb4,0xb4,0xff,0x2, 0x7c,0x54, +0xd2,0xce,0x7a,0x51,0x92,0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd0,0xf7,0xd2,0xf8, +0xa9,0xd5,0xb7,0xd2,0xbd,0x22,0x12,0x37,0xe6,0x75,0xf5,0x1, 0xa9,0x37,0xf5,0xfc, +0xa9,0x36,0xf5,0xfc,0x2, 0x37,0xc7,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xd2,0xaf, +0x22,0x7e,0x34,0x0, 0x20,0x12,0x37,0xe6,0x75,0xf5,0x3, 0xa9,0x37,0xf5,0xfc,0xa9, +0x36,0xf5,0xfc,0x2, 0x37,0xc7,0xc2,0xaf,0xd2,0xc9,0xa, 0x56,0xf5,0xf1,0x7c,0xb7, +0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x22,0x70,0x18,0x7e,0x1f,0x1, 0x50,0x7e, +0xf, 0x1, 0x4c,0x2f,0x1, 0x7e,0x1f,0x1, 0x54,0x2f,0x10,0xbe,0x18,0x6, 0x40,0x58, +0x2, 0xc2,0xd, 0x22,0x75,0x28,0x0, 0xc2,0x1, 0x7e,0xb3,0x3, 0xad,0x70,0x7, 0x7e, +0xb3,0x0, 0x5d,0xf5,0x29,0x22,0x7e,0xb3,0x0, 0x5f,0xf5,0x29,0x22,0x12,0xe, 0xa7, +0x74,0xf, 0x7a,0xb3,0x2, 0x36,0x74,0x5, 0x7a,0xb3,0x2, 0x38,0x7a,0xb3,0x2, 0x37, +0x74,0xf, 0x7a,0xb3,0x2, 0x39,0x7e,0x34,0x0, 0x32,0x7a,0x37,0x1, 0xf0,0x7e,0xb3, +0x2, 0x54,0x44,0x1, 0x7a,0xb3,0x2, 0x54,0x74,0x2, 0x7a,0xb3,0x2, 0xc, 0x7e,0xb3, +0x2, 0x54,0x30,0xe0,0x10,0x74,0x2, 0x7a,0xb3,0x2, 0xd, 0x74,0x8, 0x7a,0xb3,0x2, +0xe, 0x74,0x2, 0x80,0xa, 0x74,0x1, 0x7a,0xb3,0x2, 0xd, 0x7a,0xb3,0x2, 0xe, 0x7a, +0xb3,0x2, 0xf, 0x74,0x14,0x7a,0xb3,0x2, 0x53,0x7e,0x34,0x2a,0xf8,0x7a,0x37,0x1, +0xf4,0x7e,0xb3,0x2, 0x54,0x54,0xfd,0x7a,0xb3,0x2, 0x54,0x7e,0x34,0xfc,0x18,0x7a, +0x37,0x1, 0xf2,0x12,0x39,0x61,0x7e,0x34,0x0, 0x32,0x7a,0x37,0x1, 0xf6,0x7e,0x34, +0x3, 0xe8,0x7a,0x37,0x1, 0xf8,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x1, 0xfa,0x7e,0xb3, +0x2, 0x54,0x44,0x8, 0x7a,0xb3,0x2, 0x54,0x7e,0x34,0x2, 0xa2,0x7a,0x37,0x2, 0x45, +0x7e,0x34,0x2, 0xb2,0x7a,0x37,0x2, 0x47,0x7e,0x34,0x2, 0x82,0x7a,0x37,0x2, 0x49, +0x7e,0x34,0x2, 0x92,0x7a,0x37,0x2, 0x4b,0x7e,0xb3,0x2, 0x54,0x54,0xef,0x7a,0xb3, +0x2, 0x54,0x7e,0x34,0x1, 0x90,0x7a,0x37,0x1, 0xfc,0x7e,0x34,0x0, 0xc8,0x7a,0x37, +0x1, 0xfe,0x7e,0x34,0x0, 0x64,0x7a,0x37,0x2, 0x0, 0x7e,0x34,0x2, 0xbc,0x7a,0x37, +0x2, 0x2, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2, 0x3a,0x12,0x39,0x6c,0x7e,0x34,0x0, +0x1a,0x7a,0x37,0x2, 0x6, 0x7e,0x34,0x0, 0x7, 0x7a,0x37,0x2, 0x4, 0x7e,0x34,0x4e, +0x15,0x7a,0x37,0x2, 0x8, 0x7e,0x34,0x8, 0x0, 0x7a,0x37,0x2, 0xa, 0xe4,0x7a,0xb3, +0x2, 0x3c,0x7e,0x34,0x0, 0x3a,0x7e,0x24,0x0, 0xcc,0x2, 0x39,0x4d,0x7a,0x35,0x2c, +0x7a,0x25,0x2a,0xe4,0x7a,0xb3,0x4, 0xa8,0x7a,0xb3,0x4, 0x79,0x7a,0xb3,0x4, 0xa7, +0x22,0x7e,0xb3,0x2, 0x54,0x54,0xfb,0x7a,0xb3,0x2, 0x54,0x22,0x7e,0xb3,0x2, 0x54, +0x54,0xdf,0x7a,0xb3,0x2, 0x54,0x22,0xe4,0x7a,0xb3,0x0, 0xb4,0x74,0x1, 0x7a,0xb3, +0x0, 0xb9,0x74,0x1b,0x7a,0xb3,0x0, 0xa6,0x74,0x1d,0x7a,0xb3,0x0, 0xa7,0x74,0x24, +0x7a,0xb3,0x0, 0xa8,0x74,0x26,0x7a,0xb3,0x0, 0xa9,0x74,0x28,0x7a,0xb3,0x0, 0xaa, +0x7a,0xb3,0x0, 0xae,0x74,0x30,0x7a,0xb3,0x0, 0xaf,0x74,0x29,0x7a,0xb3,0x0, 0xb0, +0x12,0x39,0xcc,0x74,0xa, 0x7a,0xb3,0x0, 0xb8,0x74,0xf, 0x7a,0xb3,0x0, 0xb6,0x74, +0x19,0x7a,0xb3,0x0, 0xb7,0x74,0x3, 0x7a,0xb3,0x0, 0xb5,0x22,0x12,0x37,0xd1,0xb4, +0x48,0x3, 0xd2,0xc, 0x22,0xb4,0xff,0x11,0x7e,0x34,0x0, 0x20,0x74,0x48,0x12,0x39, +0xea,0x12,0x37,0xd1,0xb4,0x48,0x2, 0xd2,0xc, 0x22,0x7c,0xab,0x7d,0x43,0x5e,0x80, +0x7f,0xc2,0xaf,0xd2,0xc9,0xa, 0x38,0x7c,0xb7,0xf5,0xf1,0x7c,0xb9,0xf5,0xf2,0x75, +0xf3,0x80,0x75,0xf4,0x1, 0x75,0xf5,0xa, 0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb, +0x6a,0x7a,0xa1,0xf6,0x75,0xf6,0xff,0xa9,0x36,0xf5,0xfc,0x43,0xfa,0x80,0x75,0xfb, +0x0, 0xc2,0xc9,0xd2,0xaf,0x22,0x12,0xf, 0x2d,0x7a,0x37,0x0, 0x38,0x12,0x27,0xcb, +0x12,0x35,0xce,0x12,0x39,0x77,0x12,0x3a,0xa6,0x7e,0xb3,0x3, 0xc4,0x24,0xfd,0x68, +0x11,0x24,0xae,0x68,0x35,0x24,0xab,0x68,0xe, 0x24,0xa9,0x78,0xec,0x12,0xd, 0x7c, +0x80,0xe7,0x12,0x24,0x5c,0x80,0xe2,0x6d,0x33,0x7a,0x37,0x0, 0x7f,0x7e,0x24,0x1, +0xf4,0x7a,0x27,0x0, 0x38,0x7e,0xb3,0x0, 0x81,0xbe,0xb0,0xaa,0x68,0xcb,0x7a,0x37, +0x0, 0x63,0x74,0xaa,0x7a,0xb3,0x0, 0x81,0x80,0xbf,0x6d,0x33,0x7a,0x37,0x0, 0x7f, +0x7e,0x34,0x1, 0xf4,0x7a,0x37,0x0, 0x38,0x7e,0xb3,0x0, 0x81,0xb4,0xaa,0xaa,0x74, +0x55,0x7a,0xb3,0x0, 0x81,0x7e,0x74,0x3, 0xe8,0x7d,0x37,0x1b,0x74,0x4d,0x33,0x78, +0xf8,0x75,0xe9,0xff,0x80,0x93,0x74,0x1, 0x7a,0xb3,0x3, 0xc4,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x7e,0x35,0x33,0xb, 0x34,0x7a,0x35,0x33,0xbe,0x34,0x3, 0xe8,0x40,0xe, 0x6d, +0x33,0x7a,0x35,0x33,0xe5,0x27,0xbe,0xb0,0x64,0x50,0x2, 0x5, 0x27,0x7e,0x37,0x0, +0x7f,0xb, 0x34,0x7a,0x37,0x0, 0x7f,0x7e,0x37,0x0, 0x38,0xbe,0x37,0x0, 0x7f,0x28, +0x3, 0x12,0x0, 0x8, 0x7e,0xb3,0x3, 0xc4,0xb4,0xaa,0x15,0x7e,0x37,0x0, 0x63,0x7d, +0x23,0xb, 0x24,0x7a,0x27,0x0, 0x63,0xbe,0x34,0x1, 0x2c,0x28,0x3, 0x12,0x3a,0xa6, +0xe5,0x29,0xbe,0xb1,0x28,0x28,0x4, 0x5, 0x28,0x80,0x2, 0xd2,0x1, 0x7e,0xb3,0x4, +0xd6,0x60,0xf, 0xbe,0xb0,0x28,0x50,0x7, 0x4, 0x7a,0xb3,0x4, 0xd6,0x80,0x3, 0x12, +0x35,0x70,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x50,0xd8,0x74,0x27,0x7a,0xb3,0x3, 0x88, +0x74,0xa0,0x7a,0xb3,0x3, 0x8d,0x74,0x1, 0x7a,0xb3,0x3, 0x8e,0x74,0x1e,0x7a,0xb3, +0x3, 0x8f,0x74,0x8, 0x7a,0xb3,0x3, 0x90,0x74,0x14,0x7a,0xb3,0x3, 0x91,0x74,0x6, +0x7a,0xb3,0x3, 0xab,0x74,0x1, 0x7a,0xb3,0x3, 0xac,0xe4,0x7a,0xb3,0x3, 0xad,0x74, +0x12,0x7a,0xb3,0x3, 0xae,0x12,0x3a,0xa6,0x7e,0x34,0x78,0x4, 0x12,0x37,0xb6,0x7c, +0x4b,0x7e,0x34,0x78,0x5, 0x12,0x37,0xb6,0xbe,0x40,0xff,0x68,0x7, 0x6c,0xb4,0xb4, +0xff,0x2, 0x7c,0x54,0x7a,0x53,0x3, 0xb0,0x74,0x3c,0x7a,0xb3,0x3, 0xb1,0x74,0x1, +0x7a,0xb3,0x3, 0xb7,0xe4,0x7a,0xb3,0x3, 0xb6,0x7a,0xb3,0x3, 0xb8,0x7e,0x34,0x9, +0xc4,0x7a,0x37,0x0, 0xbe,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x0, 0x65,0x74,0xa0,0x7a, +0xb3,0x0, 0x67,0x6d,0x33,0x7a,0x37,0x0, 0x5a,0x74,0x1, 0x7a,0xb3,0x0, 0x5c,0x74, +0xc, 0x7a,0xb3,0x0, 0x5d,0x74,0x8, 0x7a,0xb3,0x0, 0x5e,0x74,0x14,0x7a,0xb3,0x0, +0x5f,0x7a,0xb3,0x0, 0x60,0x74,0x1e,0x7a,0xb3,0x0, 0x61,0x74,0x1, 0x7a,0xb3,0x0, +0x62,0x22,0x12,0x7, 0x7d,0x68,0xd, 0x7e,0x34,0x2, 0x10,0x7e,0xb3,0x0, 0x3a,0x6c, +0x55,0x2, 0x3c,0x15,0x22,0x7d,0x13,0xa, 0x3b,0x2d,0x31,0x7a,0x39,0x50,0x22,0x7d, +0x3, 0x7d,0x50,0x1a,0x4a,0x1a,0x48,0x7e,0x1f,0x1, 0x4c,0xbf,0x21,0x18,0xb, 0x7e, +0x34,0x2, 0x10,0x74,0x20,0x6c,0x55,0x12,0x3c,0x15,0x7d,0x50,0x1a,0x4a,0x1a,0x48, +0x7e,0x1f,0x1, 0x50,0xbf,0x21,0x18,0xb, 0x7e,0x34,0x2, 0x10,0x74,0x21,0x6c,0x55, +0x12,0x3c,0x15,0x7d,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x1f,0x1, 0x54,0xbf,0x1, 0x18, +0xb, 0x7e,0x34,0x2, 0x10,0x74,0x22,0x6c,0x55,0x2, 0x3c,0x15,0x22,0x7e,0xb3,0x2, +0x54,0x20,0xe1,0x45,0x7e,0xa3,0x3, 0xb1,0x4c,0xaa,0x68,0x2a,0xbe,0xa0,0xff,0x68, +0x25,0x74,0x28,0xa4,0x7d,0xf5,0xbe,0xf4,0x9, 0x60,0x58,0x4, 0x7e,0xf4,0x9, 0x60, +0x12,0x3e,0x4f,0xb4,0x1, 0x14,0x7e,0xe7,0x0, 0x6a,0xbe,0xe4,0x3, 0x84,0x78,0xa, +0x7e,0xf4,0x8, 0x98,0x80,0x4, 0x7e,0xf4,0x9, 0x60,0x7d,0x3f,0x12,0x3c,0x1f,0x12, +0x3d,0x13,0x40,0x5, 0x7d,0x3f,0x2, 0x3c,0xba,0x22,0x7d,0x13,0x1a,0x2, 0x1a,0x0, +0x7e,0x2f,0x1, 0x4c,0xbf,0x2, 0x18,0x9, 0x12,0x3c,0xfe,0x7e,0x34,0x0, 0x50,0x80, +0x20,0x7e,0x2f,0x1, 0x50,0xbf,0x2, 0x18,0x9, 0x12,0x3c,0xfe,0x7e,0x34,0x0, 0xf0, +0x80,0xf, 0x7e,0x1f,0x1, 0x54,0xbf,0x1, 0x18,0x13,0x12,0x3c,0xfe,0x7e,0x34,0x1, +0x90,0x7a,0x37,0x0, 0x3e,0x7e,0x34,0x3, 0x84,0x7a,0x37,0x0, 0x40,0x22,0x7e,0x73, +0x0, 0x54,0x7c,0x67,0xb, 0x60,0x5e,0x60,0xf, 0x5e,0x70,0xf0,0x4c,0x76,0x7a,0x73, +0x0, 0x54,0x22,0x7e,0xf, 0x1, 0x50,0x7e,0x1f,0x1, 0x4c,0x2f,0x10,0x7e,0xf, 0x1, +0x54,0x2f,0x1, 0x7e,0x1f,0x1, 0xa4,0xbf,0x10,0x58,0xc, 0x20,0xd, 0x9, 0x12,0x3e, +0x48,0x7a,0xb3,0x0, 0x54,0xc3,0x22,0x12,0x7, 0x7d,0x68,0x2, 0xd2,0xd, 0xd3,0x22, +0x6c,0xaa,0x7e,0x90,0x5, 0xac,0x9a,0x9, 0xb4,0x0, 0x6c,0xbe,0xb0,0xff,0x68,0xa, +0x49,0x34,0x0, 0x6a,0xbe,0x34,0x3, 0x1f,0x50,0x33,0xb, 0xa0,0xbe,0xa0,0x2, 0x40, +0xe1,0x12,0x3d,0x8e,0x54,0xf, 0x78,0x20,0x7c,0xb7,0xc4,0x7c,0x6b,0x5e,0x60,0xf, +0xbe,0x60,0x0, 0x28,0x13,0xe5,0x37,0xbe,0xb0,0x1, 0x50,0x8, 0x12,0x3d,0x9, 0xd2, +0x3, 0x5, 0x37,0x22,0x75,0x37,0x0, 0x22,0x75,0x37,0x0, 0xc2,0x3, 0x22,0x7e,0x73, +0x0, 0x54,0x7c,0xb7,0x22,0xca,0x79,0x7e,0x23,0x0, 0x54,0x5e,0x20,0xf, 0x6c,0xaa, +0xc1,0x35,0x7e,0x70,0x5, 0xac,0x7a,0x49,0xf3,0x0, 0x3e,0x7e,0x4, 0x0, 0xf, 0x7d, +0x40,0x9e,0xf4,0x0, 0x20,0xbd,0x4f,0x38,0xa, 0x7e,0x24,0x1, 0xc0,0x9d,0x20,0xbd, +0x2f,0x50,0x42,0x7e,0x53,0x0, 0x54,0x7c,0xb5,0xc4,0x7c,0x3b,0x5e,0x30,0xf, 0x7c, +0xb5,0x54,0xf, 0xbc,0xb3,0x78,0x27,0xa5,0xba,0x1, 0x23,0x7e,0xf0,0x4, 0xac,0xfa, +0x49,0x27,0x5, 0x39,0xbe,0x24,0x7f,0xff,0x68,0x14,0x49,0xe7,0x5, 0x3b,0xbe,0xe4, +0x7f,0xff,0x68,0xa, 0x59,0x23,0x0, 0x3e,0x59,0xe3,0x0, 0x40,0x80,0x7, 0x7c,0xba, +0x7c,0x72,0x12,0x3e,0x57,0x12,0x3d,0x8e,0xc4,0x7c,0x3b,0x5e,0x30,0xf, 0x7c,0xb7, +0x54,0xf, 0xbc,0xb3,0x68,0x9, 0x7e,0xe4,0x7f,0xff,0x12,0x3e,0x3e,0x80,0x10,0x7e, +0x50,0x5, 0xac,0x5a,0x49,0xe2,0x0, 0x3e,0x12,0x3e,0x3e,0x49,0xe2,0x0, 0x40,0x59, +0xe3,0x5, 0x3b,0xb, 0xa0,0xbc,0x2a,0x28,0x2, 0xa1,0xa2,0xda,0x79,0x22,0x7e,0x70, +0x4, 0xac,0x7a,0x59,0xe3,0x5, 0x39,0x22,0x7e,0xb3,0x0, 0x54,0x54,0xf0,0x22,0x7e, +0xb3,0x0, 0x54,0xc4,0x54,0xf, 0x22,0x7c,0x6b,0x7e,0x53,0x0, 0x54,0x7c,0xb5,0x54, +0xf, 0x68,0x10,0x7c,0x45,0x1b,0x40,0x5e,0x40,0xf, 0x5e,0x50,0xf0,0x4c,0x54,0x7a, +0x53,0x0, 0x54,0xa5,0xbe,0x0, 0x1c,0xa5,0xbf,0x2, 0x18,0x7e,0x73,0x0, 0x3b,0x7a, +0x73,0x0, 0x3a,0x7e,0x1f,0x0, 0x44,0x7e,0x33,0x0, 0x43,0x7a,0x1f,0x0, 0x3f,0x7a, +0x33,0x0, 0x3e,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xe5,0xcc,0x54,0x7, 0x68,0x3, 0x75,0xcc, +0x50,0x12,0x31,0xcd,0x74,0x1, 0x7a,0xb3,0x4, 0xd6,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c, +0xa7,0x24,0x0, 0x78,0x7, 0x7e,0x34,0x4, 0xd9,0x7a,0x39,0xa0,0x22,0xca,0xb8,0xa9, +0xc0,0x93,0xe4,0x7a,0xb3,0x4, 0xd5,0x7a,0xb3,0x4, 0xd7,0xda,0xb8,0x32,0x7e,0x34, +0x4, 0xb1,0x12,0x3f,0x0, 0x7e,0x34,0x4, 0xc3,0x7e,0x24,0x0, 0x12,0x2, 0x2, 0xee, +0x7e,0x24,0x0, 0x12,0x74,0xff,0x2, 0x2, 0xee,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x26,0xba, +0x7e,0xb3,0x4, 0xd9,0x54,0xfd,0x7a,0xb3,0x4, 0xd9,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e, +0x24,0x0, 0x14,0xad,0x32,0x80,0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7d, +0x23,0x1b,0x34,0x4d,0x22,0x78,0xf0,0x22,0xd2,0xcf,0xbe,0xb0,0x7, 0x38,0x4, 0x7c, +0xab,0x80,0x2, 0x6c,0xaa,0x4e,0xa0,0x50,0x7a,0xa1,0xcc,0x0, 0x0, 0x0, 0x0, 0xa9, +0xd0,0xca,0xa9,0xc5,0xca,0x53,0xca,0xe1,0x43,0xca,0x14,0x75,0xcb,0x2, 0xc2,0xcc, +0xd2,0xcb,0xc2,0xca,0xc2,0xc9,0xc2,0xc8,0x0, 0x0, 0x0, 0x0, 0x22,0x74,0x20,0x7a, +0xb3,0x3, 0xa9,0x74,0xe, 0x7a,0xb3,0x3, 0xaa,0x12,0x3f,0xa0,0xe4,0x2, 0x2, 0xee, +0x7e,0x34,0x2, 0x10,0x7e,0x24,0x0, 0x24,0x22,0x12,0x3f,0xa0,0x74,0x1, 0x2, 0x2, +0xee,0x7e,0x34,0x2, 0x10,0x7c,0xba,0x7d,0x23,0xa, 0x3b,0x2d,0x32,0x7e,0x39,0xb0, +0x22,0x6c,0xaa,0x80,0xa, 0x12,0x3f,0xb1,0x70,0x3, 0x2, 0x40,0x5b,0xb, 0xa0,0x12, +0x40,0x69,0x38,0xf1,0x7e,0xb3,0x2, 0x54,0x30,0xe1,0x3, 0x2, 0x40,0x5b,0x6c,0xaa, +0x80,0x74,0x12,0x3f,0xb1,0xb4,0x1, 0x6c,0x7e,0xb3,0x2, 0x56,0xbc,0xba,0x28,0x1f, +0x12,0x40,0x7b,0x7e,0xb3,0x2, 0x36,0x12,0x40,0x70,0xbf,0x7, 0x8, 0x6, 0x7e,0xb3, +0x2, 0x34,0x80,0x1d,0x12,0x40,0x5e,0x58,0x4b,0x7e,0xb3,0x2, 0x35,0x80,0x32,0x12, +0x40,0x7b,0x7e,0xb3,0x2, 0x39,0x12,0x40,0x70,0xbf,0x7, 0x8, 0x1b,0x7e,0xb3,0x2, +0x37,0xa, 0xeb,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0xf2,0x2e,0xf4,0x1, 0xa8,0xb, 0xf8, +0x20,0x2d,0x2e,0x1b,0xf8,0x20,0x80,0x1c,0x12,0x40,0x5e,0x58,0x17,0x7e,0xb3,0x2, +0x38,0xa, 0x4b,0x7e,0x50,0x2, 0xac,0x5a,0x2e,0x24,0x1, 0xa8,0xb, 0x28,0x30,0x9d, +0x34,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x40,0x69,0x38,0x87,0x2, 0x3f,0xa9,0x6d,0x33, +0x9d,0x34,0x1a,0x26,0x1a,0x24,0xbf,0x1, 0x22,0x7e,0xb3,0x2, 0x58,0xbc,0xba,0x22, +0xa, 0x4b,0x7d,0x24,0x7d,0xf4,0x1a,0x24,0x1a,0xe4,0x22,0x7e,0x70,0x4, 0xac,0x7a, +0x49,0x13,0x0, 0xce,0x49,0x3, 0x0, 0xcc,0x22,0x7f,0x1, 0x7e,0x37,0x1, 0xf0,0x12, +0x40,0x62,0x8, 0x3, 0x7f,0x10,0x22,0x9f,0x11,0x22,0x7c,0xab,0x9f,0x66,0x7f,0x56, +0x7e,0x78,0x0, 0x1, 0x7e,0x33,0x5, 0x54,0xa, 0x23,0xa, 0x3a,0x12,0x0, 0x46,0x7c, +0x75,0x4c,0x77,0x68,0xd, 0x7e,0x50,0x4, 0xac,0x5a,0x49,0xb2,0x0, 0xca,0x49,0xa2, +0x0, 0xc8,0x7c,0xb3,0x14,0xbc,0xb7,0x68,0xd, 0x7e,0x70,0x4, 0xac,0x7a,0x49,0xd3, +0x0, 0xd2,0x49,0xc3,0x0, 0xd0,0x74,0x4, 0xa4,0x12,0x16,0x1c,0x12,0x40,0x89,0x2f, +0x71,0x7f,0x15,0x12,0x40,0x89,0x2f,0x71,0x7f,0x16,0x12,0x40,0x89,0x2f,0x71,0x7f, +0x17,0x22,0xca,0x3b,0x6c,0xaa,0x7e,0x73,0x0, 0x54,0x5e,0x70,0xf, 0x7e,0x44,0x0, +0xcc,0x7e,0x24,0x0, 0x3a,0x6c,0x66,0x80,0x64,0x75,0x8, 0xff,0xa, 0xf6,0x2d,0xf2, +0x7e,0xf9,0x20,0x7e,0x30,0x4, 0xac,0x23,0x7d,0xe1,0x2d,0xe4,0x49,0x1e,0x0, 0x2, +0xb, 0xe8,0x0, 0xa, 0x76,0xb, 0x74,0x80,0x24,0xa, 0xef,0x2d,0xe2,0x7e,0xe9,0xe0, +0x7e,0xd0,0x4, 0xac,0xde,0x7d,0xe6,0x2d,0xe4,0x49,0xde,0x0, 0x2, 0xb, 0xe8,0xc0, +0xbf,0x6, 0x58,0x7, 0x7c,0xae,0x7a,0xf1,0x8, 0x7f,0x6, 0xb, 0xf0,0xbc,0x7f,0x38, +0xd8,0xe5,0x8, 0xbe,0xb0,0xff,0x68,0x13,0x7e,0xf9,0xe0,0xe5,0x8, 0xa, 0xfb,0x2d, +0xf2,0x7a,0xf9,0xe0,0xa, 0xf6,0x2d,0xf2,0x7a,0xf9,0xa0,0xb, 0x60,0xbc,0x76,0x38, +0x98,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x6c,0xaa,0x4c,0xaa,0x78,0x4, 0x9f,0x44, +0x80,0xc, 0x12,0x41,0xe5,0x1b,0x16,0x49,0x91,0x0, 0x2, 0xb, 0x18,0x80,0xbe,0xa0, +0x7, 0x78,0x4, 0x9f,0x55,0x80,0xb, 0x12,0x41,0xe5,0x49,0xb1,0x0, 0x6, 0x49,0xa1, +0x0, 0x4, 0x12,0x41,0xed,0x12,0x41,0xdd,0xbf,0x4, 0x48,0x22,0xbf,0x5, 0x48,0x1e, +0x12,0x41,0xdd,0xbe,0x8, 0x5, 0xdc,0x48,0x15,0x12,0x41,0xdd,0xb, 0xc, 0x59,0x14, +0x0, 0x2, 0x1b,0x48,0x0, 0xa, 0x1f,0x2d,0x12,0x7a,0x19,0xa0,0xb, 0xf0,0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xa5,0x12,0x40,0xf2,0x7c,0xbf,0xda,0xf8,0x22,0x49,0x14,0x0, +0x2, 0xb, 0x48,0x0, 0x22,0x7e,0x30,0x4, 0xac,0x3a,0x2d,0x13,0x22,0x7e,0x90,0x4, +0xac,0x9a,0x2d,0x43,0x22,0x7c,0xa6,0xa, 0x27,0xa, 0x3b,0x9d,0x32,0x12,0x2, 0xde, +0xa, 0x2a,0xbd,0x32,0x18,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0x3b,0x12,0x7, 0x7d, +0x7c,0xeb,0xbe,0xb0,0x2, 0x50,0x2, 0x81,0x67,0x6c,0xff,0x80,0x27,0x7e,0x70,0x5, +0xac,0x7f,0x49,0x23,0x0, 0x3e,0x59,0x23,0x2, 0xae,0x49,0x23,0x0, 0x40,0x59,0x23, +0x2, 0xb0,0x74,0xff,0x19,0xb3,0x2, 0xb2,0xa, 0x2f,0x9, 0x72,0x0, 0x3a,0x19,0x72, +0x2, 0xd4,0xb, 0xf0,0x12,0x7, 0x7d,0x12,0x2f,0xe2,0x48,0xd1,0x6c,0xff,0x61,0xfc, +0x74,0x5, 0xac,0xbf,0x12,0x44,0x6a,0x78,0x2, 0x61,0xfa,0xa, 0x6f,0xb, 0x64,0x61, +0xf4,0x74,0x5, 0xac,0xbd,0x12,0x44,0x6a,0x78,0x2, 0x61,0xf2,0xa, 0x2f,0x9, 0x72, +0x2, 0xd4,0xbe,0x73,0x5, 0x54,0x40,0x19,0xbe,0x73,0x5, 0x53,0x50,0x13,0xa, 0x1d, +0x9, 0x61,0x2, 0xd4,0xbe,0x63,0x5, 0x53,0x40,0x7, 0xa, 0x6, 0x12,0x44,0xa4,0x48, +0x27,0xa, 0x1d,0x9, 0x61,0x2, 0xd4,0xbe,0x63,0x5, 0x54,0x50,0x2, 0x61,0xf2,0xbe, +0x63,0x5, 0x53,0x40,0x2, 0x61,0xf2,0xbe,0x73,0x5, 0x53,0x50,0x2, 0x61,0xf2,0xa, +0x7, 0x12,0x44,0xa4,0x48,0x2, 0x61,0xf2,0xa, 0x37,0x7e,0x53,0x5, 0x54,0xa, 0x45, +0x7d,0x24,0x12,0x0, 0x46,0x7c,0xa5,0x7a,0xa3,0x2, 0xd8,0xa, 0x3d,0x9, 0xb3,0x2, +0xd4,0xa, 0x3b,0x7d,0x24,0x12,0x0, 0x46,0x7c,0xb5,0x7a,0xb3,0x2, 0xd9,0xa, 0x2b, +0xa, 0x3a,0x12,0x44,0xb5,0x8, 0x2, 0x61,0xf2,0x12,0x44,0x93,0x9d,0x32,0x12,0x2, +0xde,0xbe,0x37,0x1, 0xfe,0x48,0x2, 0x61,0xf2,0xa, 0x3f,0x9, 0xb3,0x2, 0xd4,0xa, +0x3d,0x9, 0x73,0x2, 0xd4,0x12,0x45,0x6d,0x7a,0x37,0x2, 0xce,0xa, 0x3f,0x9, 0x73, +0x2, 0xd4,0x7e,0x53,0x5, 0x54,0xa, 0x45,0x12,0x44,0x72,0x49,0x5, 0x1, 0x5c,0x7a, +0xf, 0x2, 0xc2,0x12,0x44,0x82,0x2f,0x10,0x7a,0x1f,0x2, 0xc2,0xa, 0x5d,0x9, 0x75, +0x2, 0xd4,0xa, 0x37,0x12,0x44,0x72,0x49,0x5, 0x1, 0x5c,0x7a,0xf, 0x2, 0xc6,0x12, +0x44,0x82,0x2f,0x10,0x7a,0x1f,0x2, 0xc6,0x74,0x5, 0xac,0xbd,0x49,0x35,0x2, 0xae, +0x6d,0x22,0x7e,0x6f,0x2, 0xc6,0x7f,0x6, 0x12,0x0, 0x78,0x7f,0x51,0x74,0x5, 0xac, +0xbf,0x49,0x35,0x2, 0xae,0x6d,0x22,0x7e,0x7f,0x2, 0xc2,0x7f,0x7, 0x12,0x0, 0x78, +0x2f,0x15,0x7f,0x7, 0x2f,0x6, 0x12,0x0, 0xe5,0x7a,0x1f,0x2, 0xca,0x7e,0xa0,0xbb, +0x7e,0x70,0x5, 0xac,0x7f,0x19,0xa3,0x2, 0xb2,0x12,0x44,0x93,0xbd,0x32,0x50,0xa, +0x7a,0x37,0x2, 0xd0,0x7a,0x27,0x2, 0xd2,0x80,0x8, 0x7a,0x27,0x2, 0xd0,0x7a,0x37, +0x2, 0xd2,0x7e,0x37,0x2, 0xce,0xbe,0x37,0x2, 0xd0,0x38,0x6, 0x7e,0x27,0x2, 0xd0, +0x80,0xa, 0xbe,0x37,0x2, 0xd2,0x40,0xe, 0x7e,0x27,0x2, 0xd2,0x74,0x5, 0xac,0xbf, +0x59,0x25,0x2, 0xb0,0x80,0x14,0x7e,0xa0,0xcc,0x7e,0x50,0x5, 0xac,0x5f,0x19,0xa2, +0x2, 0xb2,0x74,0x5, 0xac,0xbf,0x59,0x35,0x2, 0xb0,0x7e,0x1f,0x2, 0xca,0x74,0x5, +0xac,0xbf,0x59,0x35,0x2, 0xae,0x7e,0xa0,0xaa,0x7e,0x70,0x5, 0xac,0x7d,0x19,0xa3, +0x2, 0xb2,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x41,0x61,0xb, 0xf0,0xbc,0xef,0x28,0x2, +0x41,0x50,0x12,0x3e,0x48,0x7a,0xb3,0x0, 0x54,0x6c,0xff,0x80,0x56,0x7e,0x30,0x5, +0xac,0x3f,0x9, 0x61,0x2, 0xb2,0xbe,0x60,0xaa,0x68,0x46,0x49,0x21,0x2, 0xae,0x7e, +0x73,0x0, 0x54,0x7c,0x7, 0x5e,0x0, 0xf, 0x74,0x5, 0xac,0xb0,0x59,0x25,0x0, 0x3e, +0x49,0x21,0x2, 0xb0,0x59,0x25,0x0, 0x40,0xa, 0x2f,0x9, 0x12,0x2, 0xd4,0xa, 0x20, +0x19,0x12,0x0, 0x3a,0xa5,0xbe,0xbb,0x4, 0x74,0x2, 0x80,0x6, 0xa5,0xbe,0xcc,0x6, +0x74,0x1, 0x19,0xb2,0x0, 0x52,0x12,0x3d,0x2, 0x12,0x7, 0x7d,0xbe,0xb0,0x2, 0x50, +0x6, 0xb, 0xf0,0xbc,0xef,0x38,0xa6,0xda,0x3b,0x22,0x9, 0xb5,0x2, 0xb2,0xbe,0xb0, +0xaa,0x22,0x7d,0x24,0x12,0x0, 0x46,0x7c,0xc5,0x74,0x4, 0xac,0xbc,0x49,0x15,0x1, +0x5e,0x22,0xa, 0x5c,0x2d,0x54,0x3e,0x54,0x3e,0x54,0x49,0x35,0x1, 0x5e,0x49,0x25, +0x1, 0x5c,0x22,0x74,0x5, 0xac,0xbd,0x49,0x25,0x2, 0xb0,0x74,0x5, 0xac,0xbf,0x49, +0x35,0x2, 0xb0,0x22,0x7e,0x63,0x5, 0x53,0xa, 0x56,0x7e,0x63,0x5, 0x54,0xa, 0x16, +0x2d,0x15,0xbd,0x1, 0x22,0x9d,0x32,0x12,0x2, 0xde,0xbe,0x34,0x0, 0x1, 0x22,0x12, +0x46,0xa1,0x78,0x2, 0xa1,0x62,0x6c,0x33,0x12,0x45,0x63,0xbe,0x20,0x2, 0x50,0x1d, +0xa, 0x32,0x9, 0xb3,0x0, 0xc0,0x70,0x15,0x49,0x2, 0x0, 0x68,0x7e,0x70,0x4, 0xac, +0x72,0x59,0x3, 0x5, 0x49,0x49,0x2, 0x0, 0x6a,0x59,0x3, 0x5, 0x4b,0xb, 0x30,0xa5, +0xbb,0x2, 0xd5,0x6c,0x33,0x80,0x67,0x12,0x45,0x63,0xbe,0x20,0x2, 0x50,0x5d,0x7e, +0x70,0x4, 0xac,0x72,0x49,0x43,0x5, 0x49,0x49,0x2, 0x0, 0x68,0x9d,0x4, 0x49,0x33, +0x5, 0x4b,0x49,0x42,0x0, 0x6a,0x9d,0x43,0x7d,0x30,0x12,0x44,0xb7,0x18,0x23,0x7d, +0x34,0x12,0x44,0xb7,0x18,0x1c,0x7e,0x70,0x4, 0xac,0x72,0x49,0xf3,0x5, 0x49,0x7e, +0x50,0x5, 0xac,0x53,0x59,0xf2,0x0, 0x68,0x49,0x33,0x5, 0x4b,0x59,0x32,0x0, 0x6a, +0x80,0x1a,0x7e,0x70,0x5, 0xac,0x73,0x49,0xf3,0x0, 0x68,0x7e,0x50,0x4, 0xac,0x52, +0x59,0xf2,0x5, 0x49,0x49,0x33,0x0, 0x6a,0x59,0x32,0x5, 0x4b,0xb, 0x30,0xbc,0xa3, +0x38,0x95,0x22,0x7e,0x50,0x5, 0xac,0x53,0x9, 0x22,0x0, 0x6c,0x22,0xca,0x3b,0x7c, +0x27,0x7c,0x3b,0x7e,0x93,0x5, 0x54,0xa, 0xa9,0xa, 0x83,0x12,0x46,0x8a,0x7c,0x15, +0xa, 0x92,0x7d,0x39,0x7d,0x2a,0x12,0x46,0xa9,0x7e,0xa3,0x5, 0x53,0xa, 0xaa,0x12, +0x46,0x8a,0x7c,0x5, 0x7d,0x39,0x7d,0x2a,0x12,0x0, 0x46,0x7c,0x25,0xbc,0x81,0x78, +0x4f,0x7e,0xd0,0x4, 0xac,0xd0,0x49,0xd6,0x1, 0x5e,0x49,0xc6,0x1, 0x5c,0x7e,0xf0, +0x4, 0xac,0xf2,0x49,0xf7,0x1, 0x5e,0x49,0xe7,0x1, 0x5c,0x4c,0x11,0x68,0x14,0x49, +0x36,0x1, 0x5a,0x49,0x26,0x1, 0x58,0x2f,0x61,0x49,0x37,0x1, 0x5a,0x49,0x27,0x1, +0x58,0x2f,0x71,0x7c,0xb9,0x14,0xbc,0xb1,0x68,0x78,0x7e,0x10,0x4, 0xac,0x1, 0x12, +0x46,0x91,0x2f,0x61,0x7e,0x10,0x4, 0xac,0x12,0x12,0x46,0x91,0x2f,0x71,0x80,0x62, +0xa, 0x31,0xa, 0xa0,0x9d,0xa3,0x7d,0x3a,0x7c,0x7, 0xe5,0x8, 0xa, 0x3b,0xa, 0xa2, +0x9d,0xa3,0x7d,0x3a,0x7c,0x27,0xe5,0x8, 0xa, 0x3b,0xa, 0x20,0x2d,0x23,0x3e,0x24, +0x3e,0x24,0x49,0xf2,0x1, 0x5e,0x49,0xe2,0x1, 0x5c,0xa, 0xa1,0xa, 0x20,0x2d,0x2a, +0x3e,0x24,0x3e,0x24,0x49,0xd2,0x1, 0x5e,0x49,0xc2,0x1, 0x5c,0x2f,0x67,0xa, 0xa2, +0x2d,0xa3,0x3e,0xa4,0x3e,0xa4,0x49,0x3a,0x1, 0x5e,0x49,0x2a,0x1, 0x5c,0xa, 0x1, +0xa, 0xa2,0x2d,0xa0,0x3e,0xa4,0x3e,0xa4,0x49,0xfa,0x1, 0x5e,0x49,0xea,0x1, 0x5c, +0x2f,0x71,0xb, 0x6c,0xb, 0x7c,0xbc,0xa3,0x7e,0x17,0x2, 0x3a,0x1a,0x2, 0x38,0x6, +0x1a,0x0, 0x7f,0x17,0x80,0x4, 0x1a,0x0, 0x7f,0x16,0x12,0x0, 0x78,0x7f,0x6, 0x2f, +0x7, 0x12,0x0, 0xe5,0x7d,0xb3,0x7e,0x37,0x2, 0x3a,0x12,0x46,0x9a,0x7e,0xa7,0x1, +0xfc,0x9d,0xa3,0x2d,0xba,0x7d,0x3b,0xda,0x3b,0x22,0x7d,0x38,0x7d,0x2a,0x2, 0x0, +0x46,0x49,0x30,0x1, 0x62,0x49,0x20,0x1, 0x60,0x22,0x7e,0x24,0x0, 0x2, 0x2, 0x0, +0x46,0x7e,0xa3,0x0, 0x54,0x5e,0xa0,0xf, 0x22,0x12,0x0, 0x46,0x7c,0x85,0x7a,0x81, +0x8, 0x22,0xca,0xf8,0x7c,0xab,0x7d,0x42,0x7d,0x13,0x6c,0x11,0x80,0x2b,0xa, 0x31, +0x2d,0x34,0x7e,0x39,0x0, 0xa, 0x30,0x12,0x2f,0xf1,0x7c,0x5, 0x6c,0xff,0xa, 0x20, +0xa, 0x3f,0x12,0x44,0xb5,0x18,0x9, 0x74,0x1, 0xa, 0x3f,0x2d,0x31,0x7a,0x39,0xb0, +0xb, 0xf0,0xbe,0xf0,0x8, 0x78,0xe7,0xb, 0x10,0xbc,0xa1,0x38,0xd1,0xda,0xf8,0x22, +0x7e,0x73,0x2, 0x56,0xa, 0x37,0x1e,0x34,0x7a,0x73,0x5, 0x53,0xa, 0x37,0x1e,0x34, +0x7a,0x73,0x5, 0x54,0x22,0x12,0x47,0x14,0x4c,0x99,0x68,0x7, 0xa, 0x19,0x6d,0x0, +0x2, 0x0, 0xe5,0x22,0x7c,0x93,0xa, 0x1b,0x6d,0x0, 0x2, 0x0, 0x78,0xca,0xf8,0x7c, +0xf2,0x12,0x47,0x14,0xa, 0x19,0x6d,0x0, 0x12,0x0, 0x94,0xa, 0x1f,0x6d,0x0, 0x12, +0x0, 0x94,0xda,0xf8,0x22,0x7f,0x10,0x74,0x5, 0x7e,0x30,0x4, 0x7e,0x20,0xc8,0x12, +0x47,0x1d,0x7f,0x1, 0x22,0x12,0x47,0x5, 0x7f,0x1, 0x7a,0xf, 0x2, 0xbe,0x7e,0x37, +0x1, 0xfa,0x1a,0x26,0x1a,0x24,0xbf,0x10,0x22,0xca,0xf8,0x7c,0xfb,0x4c,0x77,0x68, +0xf, 0xc2,0xaf,0x43,0xe1,0x1, 0x7e,0x37,0x2, 0x4, 0x99,0x34,0xd2,0xaf,0x80,0x3, +0x43,0xe1,0x1, 0xc2,0x9, 0x2e,0xf0,0xff,0x92,0xa, 0xd2,0xae,0xa9,0xd6,0xb7,0xc2, +0xbe,0xda,0xf8,0x22,0xca,0x59,0xc2,0xae,0x30,0xa, 0x5, 0x7e,0xa0,0x1, 0x80,0x3, +0x7e,0xa0,0x2, 0xe5,0xe6,0x5c,0xba,0x68,0x5, 0x75,0xe6,0x0, 0xd2,0x9, 0xd2,0xae, +0xda,0x59,0x32,0x12,0x0, 0x2e,0x60,0x73,0x7e,0xb3,0x2, 0xab,0x20,0xe7,0x6c,0x7e, +0xb3,0x2, 0x54,0x30,0xe0,0x2, 0x80,0x7, 0x7e,0xb3,0x2, 0xa3,0x30,0xe1,0x6, 0x7e, +0x34,0xe, 0xb0,0x80,0x4, 0x7e,0x34,0x7, 0x58,0x7e,0x27,0x2, 0xac,0x6c,0xaa,0x80, +0x42,0xa, 0x1a,0x9, 0x31,0x2, 0x7d,0x7e,0x10,0x4, 0xac,0x13,0x49,0xd0,0x0, 0xce, +0x49,0xc0,0x0, 0xcc,0x7d,0xf3,0x6d,0xee,0xbf,0x67,0x58,0x1a,0x12,0x27,0x2, 0x60, +0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0xa, 0x3, 0x2e,0x4, 0x5, 0x3, 0x7e,0x9, +0x20,0x4c,0x2b,0x7a,0x9, 0x20,0xa, 0x3, 0x9, 0x20,0x5, 0x3, 0x2d,0x2, 0x7a,0x9, +0x20,0xb, 0xa0,0x7e,0x23,0x2, 0x58,0xbc,0x2a,0x38,0xb6,0x22,0xc2,0xf, 0x6c,0x33, +0x7e,0x20,0xff,0x7e,0x10,0x5, 0xac,0x13,0x19,0x20,0x0, 0x42,0x7c,0x13,0x2e,0x10, +0xc, 0x74,0xff,0xa5,0xf7,0x7e,0x24,0xff,0xff,0x12,0x4a,0x4a,0x1b,0x38,0x20,0x7c, +0x13,0x2e,0x10,0xe, 0xe4,0xa5,0xf7,0xb, 0x30,0xa5,0xbb,0x2, 0xd3,0x7e,0x23,0x0, +0x54,0x7c,0xb2,0x54,0xf, 0x78,0x24,0x7c,0xb2,0xc4,0x54,0xf, 0x78,0x2, 0x21,0xe5, +0x6c,0x33,0x7e,0x4, 0x7f,0xff,0x7e,0x70,0x2, 0xac,0x73,0x59,0x3, 0x0, 0xc4,0x59, +0x3, 0x0, 0xc8,0xb, 0x30,0xa5,0xbb,0x2, 0xe9,0x21,0xe5,0x7c,0xb2,0xc4,0x54,0xf, +0x78,0x2b,0x6c,0x33,0x80,0x1a,0x12,0x4a,0x74,0x7e,0x50,0x2, 0xac,0x53,0x12,0x4a, +0x6b,0x59,0x32,0x0, 0xc8,0x19,0x34,0x0, 0x42,0x7c,0x13,0x12,0x4a,0x5b,0xb, 0x30, +0x12,0x7, 0x7d,0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xdb,0x21,0xe5,0x6c,0x33,0x80, +0x4f,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x0, 0xc8,0x7e,0x70,0x5, 0xac, +0x73,0x49,0x33,0x0, 0x40,0x12,0x4a,0x7e,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x0, +0xc4,0x7e,0x70,0x5, 0xac,0x73,0x49,0x33,0x0, 0x3e,0x9d,0x32,0x12,0x2, 0xde,0x2d, +0x43,0x12,0x4a,0x4a,0xb, 0x38,0x20,0xbd,0x24,0x28,0xc, 0x7c,0x13,0x2e,0x10,0xc, +0x7c,0xba,0xa5,0xf7,0x1b,0x38,0x40,0xb, 0xa0,0xbe,0xa0,0x2, 0x78,0xb5,0xb, 0x30, +0x12,0x7, 0x7d,0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xa6,0x6c,0x33,0x80,0x6e,0xd2, +0xf, 0x6c,0xaa,0x80,0x2c,0xbc,0xa3,0x68,0x26,0x7c,0x1a,0x2e,0x10,0xc, 0xa5,0xe7, +0x7c,0x2b,0x12,0x4a,0x63,0xbc,0xb2,0x78,0x16,0x7c,0xba,0x12,0x4a,0x4c,0xb, 0x38, +0x20,0x12,0x4a,0x4a,0xb, 0x38,0x30,0xbd,0x32,0x40,0x4, 0xc2,0xf, 0x80,0xd, 0xb, +0xa0,0x12,0x7, 0x7d,0xa, 0x2b,0xa, 0x3a,0xbd,0x32,0x48,0xc9,0x30,0xf, 0x2c,0x12, +0x4a,0x63,0x7c,0x5b,0xbe,0x50,0x2, 0x50,0x22,0x7c,0x15,0x12,0x4a,0x5b,0x7e,0x70, +0x5, 0xac,0x73,0x19,0x53,0x0, 0x42,0x49,0x43,0x0, 0x3e,0x74,0x2, 0xac,0x5b,0x59, +0x42,0x0, 0xc4,0x49,0x33,0x0, 0x40,0x59,0x32,0x0, 0xc8,0xb, 0x30,0x12,0x7, 0x7d, +0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0x87,0x6c,0x33,0x80,0x39,0x7e,0x70,0x5, 0xac, +0x73,0x9, 0xb3,0x0, 0x42,0xb4,0xff,0x2b,0x6c,0xaa,0x7c,0x1a,0x2e,0x10,0xe, 0xa5, +0xe7,0x70,0x19,0x74,0x1, 0xa5,0xf7,0x12,0x4a,0x74,0x7e,0x50,0x2, 0xac,0x5a,0x12, +0x4a,0x6b,0x59,0x32,0x0, 0xc8,0x19,0xa4,0x0, 0x42,0x80,0x7, 0xb, 0xa0,0xbe,0xa0, +0x2, 0x40,0xd7,0xb, 0x30,0x12,0x7, 0x7d,0xa, 0x2b,0xa, 0x33,0xbd,0x32,0x48,0xbc, +0x6c,0x33,0x12,0x4a,0x53,0x70,0x8, 0x12,0x4d,0xac,0xac,0x73,0x12,0x4d,0xd2,0xb, +0x30,0xa5,0xbb,0x2, 0xed,0x12,0x46,0xa1,0x6c,0x33,0x12,0x4a,0x53,0xb4,0x1, 0x21, +0xa, 0x33,0x9, 0xb3,0x0, 0xc2,0xbe,0xb0,0x3, 0x68,0x3, 0xb4,0x1, 0x9, 0xe4,0xa, +0x43,0x19,0xb4,0x0, 0xc0,0x80,0x3b,0x74,0x2, 0xa, 0x43,0x19,0xb4,0x0, 0xc0,0x80, +0x31,0xa, 0x33,0x9, 0xb3,0x0, 0xc2,0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x1c,0x74,0x1, +0xa, 0x43,0x19,0xb4,0x0, 0xc0,0xbe,0xa0,0x2, 0x50,0x17,0x7c,0x6a,0xb, 0xa0,0x7e, +0x70,0x5, 0xac,0x67,0x19,0x33,0x0, 0x42,0x80,0x8, 0x74,0x3, 0xa, 0x43,0x19,0xb4, +0x0, 0xc0,0xb, 0x30,0xbe,0x30,0x2, 0x40,0xa1,0x22,0x7c,0xb3,0x3e,0xb0,0x24,0x8, +0xa, 0x3b,0x22,0x7c,0x13,0x2e,0x10,0xe, 0xa5,0xe7,0x22,0x2e,0x10,0xe, 0x74,0x1, +0xa5,0xf7,0x22,0x7c,0x13,0x2e,0x10,0xc, 0xa5,0xe7,0x22,0x59,0x32,0x0, 0xc4,0x49, +0x34,0x0, 0x40,0x22,0x7e,0x90,0x5, 0xac,0x93,0x49,0x34,0x0, 0x3e,0x22,0x9d,0x32, +0x12,0x2, 0xde,0x7d,0x43,0x22,0x7c,0xab,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x23,0x4, +0x7c,0x12,0x4b,0x58,0x49,0x33,0x0, 0x4, 0x12,0x4a,0x7e,0x7e,0x70,0x4, 0xac,0x7a, +0x49,0x23,0x4, 0x7e,0x12,0x4b,0x58,0x49,0x33,0x0, 0x6, 0x9d,0x32,0x12,0x2, 0xde, +0xbe,0x44,0x0, 0x14,0x58,0x33,0xbe,0x34,0x0, 0x1e,0x58,0x2d,0xa, 0x3a,0x9, 0xb3, +0x4, 0x7a,0x60,0x25,0x7e,0x70,0x4, 0xac,0x7a,0x49,0x43,0x4, 0x7c,0x12,0x4b,0x58, +0x59,0x43,0x0, 0x4, 0x7e,0x70,0x4, 0xac,0x7a,0x49,0x33,0x4, 0x7e,0x7e,0x50,0x5, +0xac,0x5a,0x2e,0x25,0x2c,0x59,0x32,0x0, 0x6, 0x22,0xca,0xf8,0x7e,0xd5,0x2c,0x9, +0xfd,0x0, 0x1a,0x5e,0xf0,0xf, 0x78,0x8, 0x12,0x4b,0x61,0x12,0x4c,0x37,0x80,0x55, +0xbe,0xf0,0x1, 0x78,0x1a,0x7e,0x73,0x4, 0xa8,0xbe,0x70,0x3, 0x50,0x5, 0x12,0x4b, +0x61,0x80,0x9, 0x12,0x4c,0x26,0x28,0x4, 0xe4,0x12,0x4a,0x86,0xe4,0x80,0x33,0xbe, +0xf0,0x2, 0x78,0x31,0x7e,0x73,0x4, 0x79,0xbe,0x70,0x3, 0x50,0x8, 0x12,0x4b,0x61, +0x12,0x4c,0x37,0x80,0x17,0x12,0x4c,0x26,0x28,0x4, 0xe4,0x12,0x4a,0x86,0x7e,0x73, +0x4, 0xb0,0xbe,0x70,0x3, 0x28,0x5, 0x74,0x1, 0x12,0x4a,0x86,0xe4,0x12,0x4b,0x6b, +0x74,0x1, 0x12,0x4b,0x6b,0xda,0xf8,0x22,0x7e,0x70,0x5, 0xac,0x7a,0x2e,0x35,0x2c, +0x22,0xe4,0x7a,0xb3,0x4, 0xaf,0x7a,0xb3,0x4, 0x7a,0x22,0xca,0xf8,0x7c,0xfb,0x74, +0x4, 0xac,0xbf,0x49,0x25,0x4, 0x7c,0x12,0x4c,0x2e,0x49,0x33,0x0, 0x4, 0x9d,0x32, +0x12,0x2, 0xde,0x7d,0x13,0x74,0x4, 0xac,0xbf,0x49,0x25,0x4, 0x7e,0x12,0x4c,0x2e, +0x49,0x33,0x0, 0x6, 0x9d,0x32,0x12,0x2, 0xde,0xbe,0x14,0x0, 0xa, 0x58,0x22,0xbe, +0x34,0x0, 0xf, 0x58,0x1c,0xa, 0x3f,0x7d,0x23,0x2e,0x24,0x4, 0xaf,0x7e,0x29,0xb0, +0x4, 0x7a,0x29,0xb0,0x9, 0x53,0x4, 0xaf,0xbe,0x50,0x20,0x28,0x20,0x74,0x20,0x80, +0xc, 0xa, 0x3f,0x9, 0xa3,0x4, 0xaf,0xbe,0xa0,0x3, 0x38,0x7, 0xe4,0x19,0xb3,0x4, +0xaf,0x80,0xa, 0x2e,0x34,0x4, 0xaf,0x7c,0xba,0x14,0x7a,0x39,0xb0,0xa, 0x3f,0x2e, +0x35,0x2c,0x7e,0x39,0xb0,0x12,0x4c,0x41,0x60,0xa, 0x74,0x78,0xa, 0x3f,0x19,0xb3, +0x4, 0x7a,0x80,0x13,0xa, 0x3f,0x9, 0xb3,0x4, 0x7a,0xbe,0xb0,0x0, 0x28,0x8, 0x2e, +0x34,0x4, 0x7a,0x14,0x7a,0x39,0xb0,0x7e,0x90,0x5, 0xac,0x9f,0x2e,0x45,0x2c,0x49, +0x34,0x0, 0x4, 0x74,0x4, 0xac,0xbf,0x59,0x35,0x4, 0x7c,0x49,0x34,0x0, 0x6, 0x59, +0x35,0x4, 0x7e,0xda,0xf8,0x22,0x7e,0x73,0x4, 0xaf,0xbe,0x70,0x3, 0x22,0x7e,0x70, +0x5, 0xac,0x7f,0x2e,0x35,0x2c,0x22,0xe4,0x7a,0xb3,0x4, 0xb0,0x7a,0xb3,0x4, 0x7b, +0x22,0xca,0x79,0x7c,0xeb,0x6c,0xff,0x7c,0xbe,0x7e,0x30,0x4, 0xac,0x3e,0x12,0x13, +0x92,0x12,0x4d,0xdb,0x7c,0xab,0x7e,0x30,0x4, 0xac,0x3e,0x12,0x13,0x92,0xbe,0x18, +0x3a,0x98,0x8, 0x8, 0xbe,0xa0,0xa, 0x50,0x3, 0x7e,0xf0,0x1, 0x7c,0xbf,0xda,0x79, +0x22,0xca,0xf8,0x7e,0xe4,0x0, 0xc8,0x7e,0xd4,0x1, 0x90,0x7e,0xc4,0x0, 0xf0,0x6c, +0xff,0xa1,0x85,0x12,0x4c,0x2e,0x49,0x23,0x0, 0x4, 0x7a,0x27,0x5, 0x55,0x49,0xb3, +0x0, 0x6, 0xbe,0xb4,0x3, 0x20,0x40,0x2, 0xa1,0x98,0x7e,0x37,0x5, 0x55,0x9d,0x3c, +0x12,0x2, 0xde,0x7d,0xac,0x9d,0xa3,0x7e,0x24,0x0, 0xa, 0x7d,0x3a,0x8d,0x32,0x7d, +0xa3,0xb, 0xa4,0x7d,0x3b,0x8d,0x3d,0x7a,0x27,0x5, 0x57,0x7d,0x32,0x9d,0x3e,0x12, +0x2, 0xde,0x12,0x4d,0xa5,0x7d,0x93,0xb, 0x94,0xbd,0xdb,0x40,0x6, 0x7e,0x37,0x4, +0xab,0x80,0x4, 0x7e,0x37,0x4, 0x86,0x7e,0x24,0x0, 0x64,0x8d,0x32,0x7d,0xf3,0xbe, +0xf4,0x0, 0x1, 0x50,0x4, 0x6d,0xff,0x80,0xa, 0xbe,0xf4,0x0, 0x28,0x28,0x4, 0x7e, +0xf4,0x0, 0x28,0x7d,0x19,0xad,0x1a,0x6d,0x0, 0x7f,0x10,0x7d,0x1f,0x12,0x0, 0x89, +0x7f,0x1, 0xbd,0xeb,0x40,0x11,0x12,0x47,0x35,0x7d,0x3b,0x6d,0x22,0xbf,0x10,0x50, +0x4e,0x6d,0xbb,0x80,0x61,0x80,0x48,0xbd,0xdb,0x40,0x1b,0x7f,0x10,0x74,0x4, 0x12, +0x47,0x39,0x12,0x4d,0x9b,0xb4,0x1, 0x2, 0x9f,0x0, 0x7d,0x81,0x2d,0xb8,0xbd,0xdb, +0x50,0x44,0x7d,0xbd,0x80,0x40,0x7d,0x8e,0x2d,0x8d,0xbd,0x8b,0x40,0x27,0x7f,0x10, +0x74,0x4, 0x12,0x47,0x39,0x12,0x4d,0x9b,0xb4,0x1, 0x2, 0x9f,0x0, 0x7d,0x5d,0x6d, +0x44,0x2f,0x20,0x7d,0x3b,0x6d,0x22,0xbf,0x12,0x50,0x4, 0x7d,0xbd,0x80,0x17,0x7d, +0x81,0x9d,0xb8,0x80,0x11,0x12,0x47,0x35,0x7d,0x81,0x2d,0xb8,0xbe,0xb4,0x3, 0x20, +0x40,0x4, 0x7e,0xb4,0x3, 0x1f,0x74,0x5, 0xac,0xbf,0x7d,0x85,0x2e,0x85,0x2c,0x59, +0xb8,0x0, 0x6, 0xb, 0xf0,0x7e,0x85,0x2c,0x9, 0xb8,0x0, 0x1a,0x54,0xf, 0xa, 0x3b, +0xa, 0x8f,0xbd,0x83,0x58,0x2, 0x81,0x83,0xda,0xf8,0x22,0xa, 0x8f,0x2e,0x85,0x2c, +0x9, 0xb8,0x0, 0x18,0x22,0x7e,0x24,0x0, 0xa, 0x2, 0x0, 0x46,0x7e,0x44,0x7f,0xff, +0x7e,0x70,0x2, 0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x4a,0x19,0xb4,0x0, 0xc2,0x19,0xb4, +0x0, 0xc0,0x12,0x4d,0xac,0xac,0x7a,0x12,0x4d,0xd2,0xb, 0xa0,0xbe,0xa0,0x2, 0x40, +0xe5,0x22,0x59,0x43,0x0, 0xc4,0x59,0x43,0x0, 0xc8,0x22,0x7f,0x71,0x12,0xb, 0xb5, +0xbe,0x24,0x0, 0x8, 0x58,0x6, 0x7e,0x7, 0x4, 0xab,0x80,0x4, 0x7e,0x7, 0x4, 0x86, +0xbe,0x78,0x75,0x30,0x8, 0x0, 0xbe,0x78,0x0, 0x0, 0x58,0x4, 0x6d,0x11,0x80,0x6, +0x7f,0x17,0x2f,0x11,0x7d,0x13,0x7d,0x51,0x8d,0x50,0xbe,0x54,0x0, 0x64,0x28,0x4, +0x7e,0x54,0x0, 0x64,0x22,0x7d,0x2, 0x7d,0xf3,0x6d,0x44,0xd2,0xf, 0x12,0xb, 0xb5, +0xbe,0x24,0x0, 0x8, 0x48,0x2, 0xc2,0xf, 0xbe,0xf4,0x0, 0x20,0x40,0x21,0xbe,0xf4, +0x0, 0x4d,0x50,0x1b,0x7e,0x14,0x0, 0x4d,0x30,0xf, 0xa, 0x9d,0x1f,0x1b,0x14,0x2e, +0x14,0x1, 0xc1,0x80,0x2d,0x9d,0x1f,0x1b,0x14,0x2e,0x14,0x1, 0x67,0x80,0x23,0xbe, +0xf4,0x1, 0xb3,0x28,0x2f,0xbe,0xf4,0x1, 0xe0,0x38,0x29,0x7d,0x1f,0x30,0xf, 0xa, +0x9e,0x14,0x1, 0xb4,0x2e,0x14,0x1, 0x94,0x80,0x8, 0x9e,0x14,0x1, 0xb4,0x2e,0x14, +0x1, 0x3a,0x12,0x1d,0x79,0x1a,0x4b,0x7e,0x14,0x0, 0xa, 0x7d,0x34,0xad,0x31,0x12, +0x4d,0xa5,0x7d,0x43,0x7d,0x54,0x1a,0x4a,0x1a,0x48,0x12,0x4e,0x92,0x2f,0x12,0x2, +0x18,0x92,0x49,0x30,0x0, 0x2, 0xb, 0x8, 0x20,0x22,0x7e,0x34,0x0, 0x1, 0x7a,0x37, +0x4, 0xa9,0x7a,0x37,0x4, 0xab,0xe4,0x7a,0xb3,0x4, 0xad,0x7e,0xb3,0x4, 0xae,0x54, +0xf9,0x7a,0xb3,0x4, 0xae,0x54,0xfe,0x7a,0xb3,0x4, 0xae,0x7a,0x37,0x4, 0x84,0x7a, +0x37,0x4, 0x86,0xe4,0x7a,0xb3,0x4, 0x88,0x7e,0xb3,0x4, 0x89,0x54,0xf9,0x7a,0xb3, +0x4, 0x89,0x54,0xfe,0x7a,0xb3,0x4, 0x89,0x22,0x7e,0x45,0x2c,0x9, 0xa4,0x0, 0x1a, +0x5e,0xa0,0xf, 0x78,0x7, 0xe4,0x7a,0xb3,0x4, 0xa8,0x80,0x3d,0xbe,0xa0,0x1, 0x78, +0x1f,0xe4,0x7a,0xb3,0x4, 0x79,0x7e,0xb3,0x4, 0xa8,0x4, 0x7a,0xb3,0x4, 0xa8,0x7e, +0x73,0x4, 0xa8,0xbe,0x70,0xc8,0x28,0x25,0x74,0xc8,0x7a,0xb3,0x4, 0xa8,0x80,0x1d, +0xe4,0x7a,0xb3,0x4, 0xa8,0x7e,0xb3,0x4, 0x79,0x4, 0x7a,0xb3,0x4, 0x79,0x7e,0x73, +0x4, 0x79,0xbe,0x70,0xc8,0x28,0x6, 0x74,0xc8,0x7a,0xb3,0x4, 0x79,0x7e,0xb3,0x4, +0xa7,0x60,0x5, 0x14,0x7a,0xb3,0x4, 0xa7,0x22,0x2f,0x7, 0x12,0x0, 0x94,0x7a,0x1f, +0x2, 0xc2,0x7e,0x24,0x2, 0xc2,0x7e,0x37,0x2, 0xc6,0x7c,0xbc,0x7e,0x17,0x2, 0x8, +0x99,0x14,0x7e,0x1f,0x2, 0xc2,0x7c,0xbc,0x7e,0x17,0x2, 0xa, 0x89,0x14,0xe5,0x8, +0xa, 0x3b,0x9, 0xb3,0x2, 0x7d,0xf5,0xc, 0x7e,0xb3,0x2, 0xab,0x22,0xe5,0xe2,0xa, +0x7b,0x6d,0x66,0xe5,0xe2,0xf5,0xb, 0xe5,0xb, 0x7c,0x6b,0x6c,0x77,0x6d,0x22,0x22, +0x7e,0x73,0x5, 0x53,0xa, 0x27,0x1b,0x24,0xa, 0x3c,0xbd,0x32,0x7e,0x17,0x1, 0xfc, +0x1a,0x2, 0x22,0xe5,0x8, 0xa, 0x3b,0x9, 0x23,0x2, 0x7d,0x7a,0x21,0xc, 0x7e,0x30, +0x4, 0xac,0x23,0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xba,0x7f,0x17,0x12,0x0, 0x78,0x7e, +0xf, 0x2, 0xb6,0x22,0x1a,0x0, 0x7e,0x7f,0x2, 0xb6,0x7f,0x17,0x12,0x0, 0x78,0x7e, +0xf, 0x2, 0xba,0x22,0x1a,0x2, 0x7f,0x17,0x12,0x0, 0x78,0x7f,0x1, 0x7e,0x1f,0x2, +0xae,0x22,0x7e,0x31,0xc, 0x74,0x4, 0xac,0x3b,0x2e,0x14,0x0, 0xcc,0x22,0xa, 0x4f, +0xa, 0x5e,0x2d,0x54,0x3e,0x54,0x3e,0x54,0x22,0xa, 0x3d,0x9, 0xc3,0x0, 0x3a,0x7e, +0xa3,0x5, 0x53,0x22,0x7e,0xb3,0x2, 0xa3,0x54,0x1, 0x7e,0x70,0x1, 0x22,0x7e,0xa1, +0x8, 0x74,0x4, 0xa4,0x22,0xe4,0x12,0x2, 0xee,0x7e,0xb3,0x2, 0x54,0x22,0x59,0x35, +0x0, 0xce,0x59,0x25,0x0, 0xcc,0x22,0x49,0x31,0x0, 0xca,0x49,0x21,0x0, 0xc8,0x22, +0x49,0xb1,0x0, 0xce,0x49,0xa1,0x0, 0xcc,0x22,0x7e,0x34,0x0, 0x3c,0x7a,0x35,0x35, +0x22,0x59,0x34,0x0, 0x2, 0x1b,0x48,0x20,0x22,0x7e,0x8, 0x0, 0x4, 0x2, 0x0, 0xe5, +0xa, 0x2e,0xa, 0x3f,0x2, 0x0, 0x46,0x50,0x47,0xaf,0xb8,0x6d,0x92,0x12,0xd8, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x0f_app.h b/drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x0f_app.h new file mode 100644 index 00000000..4dac9880 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x0f_app.h @@ -0,0 +1,1275 @@ +0x2, 0x2, 0xf2,0x2, 0x4a,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x18,0x8e,0x13,0x14, +0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x13,0x22,0x2, 0x49,0x8b,0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x2, 0x3, +0xfe,0x22,0x22,0x2, 0x49,0xcf,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, +0x14,0x4d,0x22,0x78,0xf5,0x22,0x2, 0x4, 0xa9,0xff,0xff,0x2, 0x4d,0x76,0x2, 0x4, +0xb0,0xff,0xff,0x2, 0x49,0xfa,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff, +0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5, +0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21, +0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d, +0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22, +0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f, +0x12,0x12,0x0, 0xb4,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x0, 0xb4,0x30, +0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e, +0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0xbe,0x8, 0x0, 0x0, +0x68,0x20,0x1e,0x54,0xb, 0x54,0x50,0x16,0x7e,0x1b,0x80,0x7a,0xb, 0x80,0xb, 0x1c, +0xb, 0xc, 0x80,0xa, 0xb, 0x1a,0x40,0x1b,0xa, 0x40,0xb, 0x1d,0xb, 0xd, 0x1b,0x54, +0x78,0xf2,0x22,0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x2, 0x2, +0x2, 0x2, 0x1, 0x0, 0x1, 0x2, 0x3, 0x4, 0x4, 0x3, 0x2, 0x0, 0x2, 0x3, 0x5, 0x5, +0x5, 0x4, 0x2, 0x0, 0x2, 0x4, 0x6, 0x6, 0x6, 0x5, 0x3, 0x0, 0x3, 0x5, 0x7, 0x8, +0x7, 0x6, 0x3, 0x0, 0x3, 0x6, 0x8, 0x9, 0x9, 0x7, 0x4, 0x0, 0x4, 0x7, 0xa, 0xb, +0xa, 0x8, 0x4, 0x0, 0x4, 0x8, 0xb, 0xc, 0xb, 0x9, 0x5, 0x0, 0x5, 0x9, 0xc, 0xd, +0xd, 0xa, 0x5, 0x0, 0x5, 0xa, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, +0xe, 0xb, 0x6, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x9, +0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10, +0x11,0x12,0x13,0x14,0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, +0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x0, 0x78,0x2, 0x58,0x2, +0xd0,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x50,0x0, 0x82,0x2, +0x76,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, +0x28,0x28,0x28,0x28,0x28,0x28,0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, +0xe, 0xe, 0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0xc, 0xb2,0x75,0x1b,0x0, 0x75,0x16,0x0, 0xd2,0x0, 0x75,0xa, 0x0, +0x75,0xf, 0x0, 0x75,0x10,0x0, 0x75,0x14,0x0, 0xc2,0x2, 0x75,0x17,0x0, 0x75,0x18, +0x0, 0x75,0x1c,0x0, 0xc2,0x3, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x3, 0xc2,0xb, 0xa, +0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e, +0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, +0x4, 0x32,0x1a,0x1d,0x1f,0x20,0x1c,0x1b,0xe, 0x0, 0x64,0x64,0x64,0x64,0x64,0x64, +0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x7d,0x3, +0x80,0xa, 0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14, +0x4d,0x55,0x78,0xee,0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, +0x9, 0x8, 0x7, 0x6, 0x0, 0x50,0x0, 0x50,0x0, 0x50,0x0, 0x50,0x0, 0x50,0x0, 0x50, +0x0, 0x50,0x13,0x14,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x13,0x13,0x14, +0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x13,0x1, 0x2, 0x4, 0x8, 0x10,0x20, +0x40,0x80,0x0, 0x1, 0xc, 0xac,0x0, 0x0, 0x1, 0xc, 0xad,0x0, 0x0, 0x2, 0xa, 0xd8, +0x0, 0x0, 0x0, 0x1, 0xb, 0xdf,0x0, 0x0, 0x1, 0xb, 0xe1,0x0, 0x0, 0x1, 0xb, 0xe4, +0x0, 0x0, 0x2, 0xb, 0xe5,0x0, 0x0, 0x0, 0x1, 0xb, 0xea,0x0, 0x0, 0x2, 0xc, 0xae, +0x0, 0x0, 0x0, 0x1, 0xc, 0xb0,0x0, 0x0, 0x1, 0xc, 0xb1,0x0, 0x0, 0x0, 0xc2,0x8e, +0x75,0x89,0x10,0x75,0x9b,0x0, 0x12,0x18,0x3d,0xd2,0xab,0x22,0x12,0x4, 0x12,0x2, +0x0, 0x3e,0x12,0x49,0xfd,0xe4,0x12,0x4a,0x37,0x12,0x4a,0x57,0x12,0x0, 0x42,0x12, +0x0, 0x2a,0x12,0x4a,0x63,0x74,0x1, 0x2, 0x4, 0x2a,0x70,0x3, 0xc2,0xaf,0x22,0xd2, +0xaf,0x22,0x12,0x17,0xbc,0x12,0x0, 0x56,0x12,0x4, 0xc, 0x12,0x0, 0x5e,0xa9,0xd3, +0xf7,0xc2,0xfb,0x12,0x4, 0xd6,0x12,0x4f,0x3e,0x12,0x8, 0xcc,0x12,0x1f,0xa6,0x7e, +0xb3,0xb, 0x33,0x24,0xfd,0x68,0x14,0x14,0x68,0x16,0x24,0xaf,0x68,0x2c,0x24,0xab, +0x68,0x13,0x24,0xa9,0x78,0xe9,0x12,0xa, 0xd2,0x80,0xe4,0x12,0x14,0x28,0x80,0xdf, +0x12,0x17,0x83,0x80,0xda,0x12,0x4, 0x9e,0xbe,0xb0,0xaa,0x68,0xd2,0xe4,0x7a,0xb3, +0x2, 0xc5,0x74,0xaa,0x7a,0xb3,0x3, 0xb6,0x80,0xc5,0x12,0x4, 0x9e,0xb4,0xaa,0xbf, +0x74,0x55,0x7a,0xb3,0x3, 0xb6,0x12,0x8, 0x5f,0x75,0xe9,0xff,0x80,0xb1,0x6d,0x33, +0x7a,0x37,0x3, 0xb4,0x7e,0xb3,0x3, 0xb6,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22, +0x43,0xdb,0x10,0xd2,0xd9,0xc2,0xdd,0xc2,0xdc,0xc2,0xdb,0xc2,0xda,0xd2,0xd8,0x75, +0xd7,0x6, 0xc2,0xea,0x2, 0x4, 0xc7,0xc2,0x3, 0x53,0xdb,0xfd,0xd2,0xeb,0xc2,0xc3, +0xa9,0xd3,0xf7,0xd2,0xfb,0x22,0xe4,0x7a,0xb3,0xb, 0xe7,0x12,0x7, 0x72,0x2, 0x4, +0xe1,0xca,0xf8,0x6d,0x33,0x7a,0x37,0xb, 0xe5,0xe4,0x12,0x6, 0x4d,0x7c,0xfb,0x5e, +0xf0,0x7, 0x78,0x5, 0x12,0x7, 0x68,0x80,0xd, 0xbe,0xf0,0x4, 0x40,0x8, 0xbe,0xf0, +0x5, 0x68,0x3, 0x12,0x7, 0x5e,0xe4,0x12,0x49,0xdf,0x74,0xaa,0x7a,0xb3,0xb, 0x92, +0x74,0xaa,0x7a,0xb3,0xb, 0x93,0x74,0xaa,0x7a,0xb3,0xb, 0xb6,0x74,0xaa,0x7a,0xb3, +0xb, 0xb7,0xda,0xf8,0x22,0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xbf,0x38,0x7, 0xa, +0x3b,0x9, 0xb3,0xa, 0x8c,0x22,0x7c,0xab,0xb, 0xa2,0x68,0x9, 0x1b,0xa2,0x78,0xa, +0x7e,0xb3,0xb, 0xe7,0x22,0x7e,0xb3,0xb, 0x33,0x22,0xb4,0x3, 0x11,0x30,0x2, 0x6, +0x7e,0x34,0xb, 0x92,0x80,0x4, 0x7e,0x34,0xb, 0xb6,0x7a,0x37,0xb, 0xe8,0xbe,0xb0, +0x3, 0x40,0x10,0xbe,0xb0,0x3e,0x38,0xb, 0xa, 0x3b,0x2e,0x37,0xb, 0xe8,0x9, 0xb3, +0x0, 0x2, 0x22,0x1b,0xb1,0x68,0x18,0x4, 0x78,0x2a,0x30,0x2, 0x6, 0x7e,0x34,0xb, +0x92,0x80,0x4, 0x7e,0x34,0xb, 0xb6,0x12,0x4f,0x69,0x9, 0xb3,0x0, 0x4, 0x22,0x30, +0x2, 0x6, 0x7e,0x34,0xb, 0x92,0x80,0x4, 0x7e,0x34,0xb, 0xb6,0x12,0x4f,0x69,0x9, +0xb3,0x0, 0x3, 0x22,0x74,0xff,0x22,0xca,0x79,0x30,0x90,0x67,0xc2,0x90,0x7e,0xb3, +0xb, 0xe1,0x4, 0x7a,0xb3,0xb, 0xe1,0x7e,0xf3,0xb, 0xe1,0xbe,0xf0,0x1, 0x78,0x8, +0xe5,0x91,0x7a,0xb3,0xb, 0xea,0x80,0x28,0x12,0x6, 0x51,0x7c,0xeb,0x5e,0xe0,0x7, +0x78,0xb, 0x12,0x4f,0x7b,0x7e,0x71,0x91,0x12,0x39,0xfc,0x80,0x13,0xbe,0xe0,0x4, +0x40,0xe, 0xbe,0xe0,0x5, 0x68,0x9, 0x12,0x4f,0x7b,0x7e,0x71,0x91,0x12,0x38,0x94, +0x12,0x6, 0x51,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0xa, 0x12,0x6, 0x59,0x68, +0x12,0x12,0x7, 0x68,0x80,0xd, 0xbe,0x50,0x4, 0x40,0x8, 0xbe,0x50,0x5, 0x68,0x3, +0x12,0x7, 0x5e,0x30,0x91,0x34,0xc2,0x91,0x7e,0xb3,0xb, 0xdf,0x4, 0x12,0x6, 0x4d, +0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0xf, 0x12,0x6, 0x59,0x68,0x1c,0x12,0x4f, +0x72,0x12,0x5, 0x25,0xf5,0x91,0x80,0x12,0xbe,0x50,0x4, 0x40,0xd, 0xbe,0x50,0x5, +0x68,0x8, 0x12,0x4f,0x72,0x12,0x6, 0x61,0xf5,0x91,0xda,0x79,0x22,0x7a,0xb3,0xb, +0xdf,0x7e,0xb3,0xb, 0xe7,0xc4,0x54,0xf, 0x22,0xe4,0x12,0x5, 0x25,0xbe,0xb0,0x10, +0x22,0x7c,0x7b,0x14,0x68,0x3f,0x14,0x68,0x41,0x14,0x68,0x41,0x14,0x68,0x3e,0x14, +0x68,0x3b,0x14,0x68,0x38,0x14,0x68,0x35,0x14,0x68,0x32,0x14,0x68,0x2f,0x14,0x68, +0x2c,0x14,0x68,0x29,0x14,0x68,0x26,0x14,0x68,0x23,0x14,0x68,0x20,0x14,0x68,0x1d, +0x24,0xc3,0x68,0x25,0x1b,0xb1,0x68,0x2b,0x24,0x64,0x68,0x22,0x24,0xea,0x78,0x28, +0x7e,0xb3,0xb, 0xe7,0x22,0x7e,0xb3,0xb, 0xe4,0x22,0x74,0xff,0x22,0xa, 0x37,0x2e, +0x34,0x3, 0xb9,0x9e,0x34,0x0, 0x3, 0x80,0x33,0x7e,0xb3,0x3, 0xc6,0x22,0x7e,0xb3, +0xc, 0xa5,0x22,0x7e,0xb3,0x4, 0x24,0x22,0x12,0x6, 0x51,0x54,0x7, 0x12,0x3a,0x6c, +0x7c,0x6b,0xbe,0x70,0x10,0x40,0x19,0xbe,0x70,0x38,0x38,0x14,0x74,0x28,0xac,0xb6, +0xa, 0x37,0x2e,0x37,0xb, 0xe2,0x9e,0x34,0x0, 0x10,0x2d,0x35,0x7e,0x39,0xb0,0x22, +0xbe,0x70,0x50,0x40,0xf, 0xbe,0x70,0x63,0x38,0xa, 0x12,0x7, 0x57,0x2d,0x35,0x9, +0xb3,0x3, 0x79,0x22,0xbe,0x70,0x78,0x40,0xf, 0xbe,0x70,0x8b,0x38,0xa, 0x12,0x7, +0x57,0x2d,0x35,0x9, 0xb3,0x3, 0x66,0x22,0xbe,0x70,0xa0,0x40,0xf, 0xbe,0x70,0xb3, +0x38,0xa, 0x12,0x7, 0x57,0x2d,0x35,0x9, 0xb3,0x3, 0x53,0x22,0xbe,0x70,0xbf,0x40, +0xf, 0xbe,0x70,0xd2,0x38,0xa, 0x12,0x7, 0x57,0x2d,0x35,0x9, 0xb3,0x3, 0x40,0x22, +0xbe,0x70,0xd3,0x40,0xf, 0xbe,0x70,0xe6,0x38,0xa, 0x12,0x7, 0x57,0x2d,0x35,0x9, +0xb3,0x3, 0x41,0x22,0x74,0xff,0x22,0x74,0x14,0xac,0xb6,0xa, 0x37,0x22,0x7e,0xb3, +0xb, 0xea,0x12,0x6, 0x61,0xf5,0x91,0x22,0x7e,0xb3,0xb, 0xea,0x12,0x5, 0x25,0xf5, +0x91,0x22,0x2, 0x8, 0x0, 0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xd2,0xaf,0x22,0x2, +0x17,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xca,0x79,0x7e,0xf0,0x70,0x7e,0x34,0x78,0x0, 0x12,0x8, 0x48,0x7c,0xeb,0x7e,0x34, +0x78,0x1, 0x12,0x8, 0x48,0xbe,0xe0,0xff,0x68,0xc, 0x6c,0xbe,0xb4,0xff,0x7, 0x7c, +0xbe,0x20,0xe0,0x2, 0x7c,0xfe,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0xd2,0xce,0x7c, +0xbf,0x54,0xfe,0xf5,0x92,0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd0,0xf7,0xd2,0xf8, +0xa9,0xd5,0xb7,0xd2,0xbd,0xda,0x79,0x22,0xc2,0xaf,0xd2,0xc9,0xa, 0x56,0xf5,0xf1, +0x7c,0xb7,0x12,0x4d,0x6d,0x75,0xf5,0x1, 0xa9,0x37,0xf5,0xfc,0x2, 0x7, 0x75,0x7e, +0x34,0x6f,0xf8,0x74,0x66,0x12,0x8, 0x71,0x7e,0x34,0x6f,0xf9,0x74,0xbb,0x2, 0x8, +0x71,0x7c,0xab,0x7d,0x23,0x12,0x4f,0x27,0x7d,0x12,0x5e,0x14,0x0, 0x1, 0x68,0x2, +0x1b,0x24,0xa, 0x14,0x7c,0xb3,0xf5,0xf1,0x7c,0xb5,0xf5,0xf2,0x75,0xf3,0x80,0x75, +0xf4,0x1, 0x75,0xf5,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1, +0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0xa9,0x36,0xf5,0xfc,0x43,0xfa,0x80, +0x2, 0x8, 0xb3,0x75,0xfd,0xf, 0x75,0xfe,0xf0,0xa9,0xc5,0xcb,0xc2,0xc9,0xd2,0xaf, +0x22,0x7d,0x36,0xb, 0x36,0x2e,0x34,0x7c,0x0, 0x2, 0x8, 0x48,0xca,0x3b,0x7e,0xe0, +0xff,0x7e,0xf0,0xff,0x53,0xdc,0xe0,0x43,0xdc,0x6, 0x6d,0x66,0x0, 0xb, 0x64,0xbe, +0x64,0x0, 0x12,0x78,0xf7,0x53,0xc9,0xfe,0x6d,0x33,0x12,0x8, 0xc5,0x7c,0xfb,0x7e, +0xb3,0xb, 0x2c,0x70,0x3, 0x7e,0xf0,0xff,0xbe,0xf0,0xff,0x68,0x38,0x7e,0x34,0x3, +0xf0,0x12,0x8, 0xc5,0xf5,0x27,0x7e,0x34,0x3, 0xf1,0x12,0x8, 0xc5,0xf5,0x28,0x65, +0x27,0xbe,0xb0,0xff,0x68,0x3, 0x7e,0xf0,0xff,0x75,0x28,0x0, 0x6d,0x66,0x12,0x8, +0xc1,0x62,0x28,0xb, 0x64,0xbe,0x64,0x2, 0x69,0x78,0xf3,0xe5,0x28,0xbe,0xb1,0x27, +0x68,0x3, 0x7e,0xf0,0xff,0xbe,0xf0,0xff,0x68,0x3, 0x12,0x47,0x14,0x74,0x15,0x7a, +0xb3,0x3, 0xb9,0x74,0xc, 0x7a,0xb3,0x3, 0xba,0x74,0x2, 0x7a,0xb3,0x3, 0xbb,0xe4, +0x7a,0xb3,0x3, 0xbc,0x74,0xa, 0x7a,0xb3,0x3, 0xbd,0x7e,0x34,0x21,0x34,0x7a,0x37, +0x3, 0xc7,0x12,0x4f,0x8d,0x12,0x4f,0x13,0x7a,0xb3,0x4, 0x29,0x6c,0xee,0xa, 0x3e, +0x2e,0x34,0x2, 0x8f,0x12,0x9, 0xde,0xa, 0x3e,0x19,0xb3,0x3, 0xc9,0x2e,0x34,0x2, +0xd1,0x12,0x9, 0xde,0xa, 0x3e,0x19,0xb3,0x3, 0xde,0x2e,0x34,0x2, 0xa4,0x12,0x9, +0xde,0xa, 0x3e,0x19,0xb3,0x3, 0xff,0xb, 0xe0,0xbe,0xe0,0x15,0x78,0xd0,0x6c,0xee, +0xa, 0x3e,0x2e,0x34,0x2, 0xc1,0x12,0x9, 0xde,0xa, 0x3e,0x19,0xb3,0x3, 0xf3,0xbe, +0xf0,0xff,0x78,0xf, 0xa, 0x3e,0x2e,0x34,0x2, 0xe6,0x12,0x9, 0xde,0xa, 0x3e,0x19, +0xb3,0x4, 0x14,0xb, 0xe0,0xbe,0xe0,0xc, 0x78,0xd6,0xbe,0xf0,0xff,0x78,0x6, 0x12, +0x4f,0x45,0x12,0x0, 0x46,0xda,0x3b,0x22,0xa, 0x3f,0x2e,0x34,0x2, 0x83,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x12,0x44,0x90,0x6d,0x33,0x7a,0x37,0x1, 0xab, +0x12,0x44,0xcb,0x7a,0xb3,0x1, 0xe8,0x7a,0xb3,0x1, 0xe9,0x7a,0xb3,0x1, 0xea,0x7a, +0xb3,0x1, 0xeb,0x7a,0xb3,0x1, 0xec,0x74,0x1, 0x7a,0xb3,0x1, 0xe6,0xe4,0x12,0x44, +0xb3,0x12,0x44,0xdc,0x6c,0xaa,0xbe,0xa0,0x7, 0x50,0x34,0xa, 0x3a,0x2e,0x34,0x3, +0x52,0x12,0x9, 0xde,0xa, 0x4a,0x19,0xb4,0x1, 0xad,0xa, 0x3a,0x2e,0x34,0x3, 0x59, +0x12,0x9, 0xde,0x19,0xb4,0x1, 0xd5,0xa, 0x3a,0x2e,0x34,0x3, 0x60,0x12,0x9, 0xde, +0x19,0xb4,0x1, 0xbd,0xa, 0x3a,0x2e,0x34,0x3, 0x67,0x12,0x9, 0xde,0x80,0x15,0x74, +0xff,0xa, 0x4a,0x19,0xb4,0x1, 0xad,0xe4,0x19,0xb4,0x1, 0xd5,0x74,0x2, 0x19,0xb4, +0x1, 0xbd,0x74,0x2, 0xa, 0x4a,0x19,0xb4,0x1, 0xdd,0xa, 0x3a,0x19,0xa3,0x1, 0xb5, +0x12,0xf, 0x7e,0x59,0x43,0x1, 0xc5,0xa, 0x3a,0x9, 0xb3,0x1, 0xad,0xbe,0xb3,0x4, +0x24,0x78,0x28,0xa, 0x3a,0x9, 0xb3,0x1, 0xd5,0xbe,0xb3,0x4, 0x27,0x78,0x1c,0xa, +0x3a,0x9, 0xb3,0x1, 0xdd,0xbe,0xb3,0x4, 0x29,0x78,0x10,0xa, 0x3a,0x9, 0xb3,0x1, +0xbd,0xbe,0xb3,0x4, 0x28,0x78,0x4, 0x7a,0xa3,0x1, 0xe8,0xb, 0xa0,0xbe,0xa0,0x8, +0x68,0x2, 0x41,0x16,0x6c,0xaa,0x12,0xf, 0x7e,0x59,0x43,0x2, 0x9c,0x7e,0x44,0x7f, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0x2, 0x84,0xb, 0xa0,0xbe,0xa0,0xc, 0x40, +0xe5,0x22,0xca,0x3b,0x6c,0xff,0x6c,0xee,0x12,0x4f,0x35,0x12,0x47,0x2f,0x12,0x17, +0x16,0x12,0x1a,0xc0,0x7e,0x34,0x6, 0x22,0x12,0x3e,0x54,0xe4,0x7a,0xb3,0xc, 0xb2, +0x12,0x14,0xf3,0x12,0x1f,0xe8,0x12,0x1b,0x30,0x78,0xfb,0x12,0xe, 0xa3,0x12,0xf, +0x86,0x12,0x4f,0x8d,0x12,0x10,0x44,0x12,0x9, 0xe7,0x12,0x1b,0x37,0x12,0x17,0xb5, +0x12,0xf, 0x95,0x12,0xf, 0xb8,0x12,0x4e,0xff,0x12,0x1f,0xa6,0x6d,0x33,0x7a,0x35, +0xc, 0x7e,0xd3,0xb, 0x17,0x7a,0xd1,0xe, 0x7e,0xb3,0xb, 0x33,0xb4,0x1, 0x2, 0x80, +0x2, 0xc1,0x96,0x53,0xdb,0x7f,0x6d,0x33,0x7a,0x37,0x3, 0xb4,0x7e,0x34,0x0, 0x64, +0x7a,0x37,0x0, 0x3c,0x12,0x48,0x8a,0x75,0x12,0x0, 0x75,0x11,0x0, 0x7e,0xb3,0xb, +0x31,0x70,0x8, 0x7e,0xb3,0x2, 0xbe,0xf5,0x13,0x80,0x6, 0x7e,0xb3,0x2, 0xc0,0xf5, +0x13,0x7e,0xb3,0xb, 0x2c,0xbe,0xb0,0xff,0x68,0x9, 0x12,0x8, 0xcc,0x12,0xf, 0x6f, +0x12,0x4f,0x3e,0x12,0x44,0xee,0xe5,0xe, 0x70,0x2, 0x80,0x39,0x7e,0xb3,0x1, 0xec, +0xf5,0x21,0x7e,0xb3,0x2, 0xb5,0xf5,0x23,0x7e,0xb3,0x2, 0x82,0xf5,0x25,0x12,0x4a, +0x6f,0x7e,0xb3,0x1, 0xec,0xf5,0x22,0x7e,0xb3,0x2, 0xb5,0xf5,0x24,0x7e,0xb3,0x2, +0x82,0xf5,0x26,0xe5,0x21,0x7a,0xb3,0x1, 0xec,0xe5,0x23,0x7a,0xb3,0x2, 0xb5,0xe5, +0x25,0x7a,0xb3,0x2, 0x82,0x12,0xf, 0x92,0x12,0x11,0xa8,0x12,0x46,0xe2,0x7e,0x73, +0xa, 0xa6,0x7a,0x73,0xb, 0x35,0x7e,0xb3,0x2, 0xc4,0xb4,0x1, 0x4, 0xe4,0x12,0xf, +0x76,0x7e,0x63,0x1, 0xe8,0x7e,0x70,0x2, 0xac,0x67,0x2e,0x34,0x3, 0x94,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x6, 0x67,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x6, +0x69,0x7a,0x73,0xb, 0xc, 0x12,0x2d,0x85,0x12,0x4c,0x34,0x12,0x2f,0xcb,0x7e,0x37, +0xa, 0xa4,0x7a,0x73,0xb, 0xf, 0x7e,0xb3,0xa, 0x9d,0x7a,0xb3,0xb, 0x10,0xb4,0x6, +0x17,0x12,0x1f,0xe0,0x50,0x3, 0x12,0x30,0xa8,0x12,0x3a,0x7f,0x7e,0xb3,0x0, 0x81, +0x30,0xe0,0x5, 0xe4,0x7a,0xb3,0xa, 0x9d,0x12,0x4f,0x4f,0x78,0x12,0x7e,0xb3,0xa, +0x9d,0xb4,0x4, 0xb, 0xe5,0xe, 0x70,0x7, 0x7e,0x34,0x0, 0xa, 0x7a,0x35,0xc, 0x7e, +0x35,0xc, 0xbe,0x34,0x0, 0x0, 0x28,0xb, 0x1b,0x34,0x7a,0x35,0xc, 0x74,0x4, 0x7a, +0xb3,0xa, 0x9d,0x7e,0x34,0x0, 0x3e,0x7a,0x37,0x3, 0x58,0x12,0x34,0x51,0x7a,0xb3, +0x3, 0xa9,0xe5,0xe, 0xb4,0x1, 0x12,0xe5,0x22,0x7a,0xb3,0x1, 0xec,0xe5,0x24,0x7a, +0xb3,0x2, 0xb5,0xe5,0x26,0x7a,0xb3,0x2, 0x82,0x74,0x1, 0x12,0x20,0x6e,0x12,0x22, +0xee,0x12,0x46,0x8c,0xb4,0x1, 0x12,0x7e,0xb3,0x3, 0xad,0xbe,0xb0,0x2, 0x68,0x15, +0xbe,0xb0,0x1, 0x68,0x10,0x74,0x3, 0x80,0x8, 0x7e,0xb3,0x3, 0xad,0xb4,0x3, 0x5, +0xe4,0x7a,0xb3,0x3, 0xad,0x7e,0xb3,0x3, 0xb3,0xb4,0x5, 0xe, 0x74,0x1e,0x7a,0xb3, +0x6, 0x69,0x7e,0x73,0x6, 0x69,0x7a,0x73,0xb, 0xc, 0x12,0x27,0x80,0x12,0x27,0x5d, +0x7e,0xb3,0xa, 0x9d,0xb4,0x6, 0xe, 0x7e,0x73,0x0, 0x7f,0xbe,0x70,0x1, 0x28,0x5, +0xe4,0x7a,0xb3,0xa, 0x9d,0x12,0xf, 0x95,0x7e,0x14,0x6, 0x67,0x12,0x4a,0xed,0x12, +0x4f,0x4f,0x78,0xc, 0x7e,0x73,0x0, 0x80,0xbe,0x73,0x0, 0x7f,0x50,0x5, 0x80,0x0, +0x12,0x2b,0xe6,0x7e,0x73,0x0, 0x7f,0x7a,0x73,0x0, 0x80,0x12,0x4f,0x84,0xe5,0xe, +0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0x91,0x7e,0xb3,0x3, 0xa4,0x12,0x41,0x27,0x7e,0x73, +0x1, 0xec,0xa, 0x37,0x9, 0x73,0x1, 0xb5,0xbe,0x73,0x1, 0xe8,0x78,0x36,0x7e,0x73, +0x3, 0xa4,0xbe,0x70,0x0, 0x28,0x2d,0x7e,0x37,0x1, 0xf0,0x7a,0x35,0xf, 0xbe,0x34, +0x0, 0x50,0x28,0x8, 0x74,0x2, 0x7a,0xb3,0x3, 0xad,0x6c,0xee,0x7e,0x35,0xf, 0xbe, +0x34,0x0, 0x28,0x50,0xf, 0xbe,0xe0,0x14,0x50,0x4, 0xb, 0xe0,0x80,0x6, 0x74,0x1, +0x7a,0xb3,0x3, 0xad,0x7e,0x37,0x1, 0xa9,0xbe,0x34,0x0, 0x3, 0x78,0x6, 0x74,0x2, +0x7a,0xb3,0x3, 0xad,0x7e,0xb3,0xb, 0x1b,0xb4,0x1, 0x26,0xe4,0x7a,0xb3,0xb, 0x1b, +0x7e,0x73,0xb, 0x16,0x7a,0x73,0x4, 0x24,0x7e,0x73,0xb, 0x19,0x7a,0x73,0x4, 0x27, +0x12,0x44,0xe5,0x7e,0x73,0xb, 0x18,0x7a,0x73,0x4, 0x29,0x12,0x9, 0xe7,0x12,0xf, +0x6f,0x7e,0xb3,0xb, 0x17,0x70,0x10,0xbe,0xd0,0x1, 0x78,0xb, 0xe4,0x7a,0xb3,0x3, +0xb3,0x7e,0xf0,0x1, 0x12,0xf, 0x6f,0x7e,0x73,0xb, 0x17,0xbc,0x7d,0x68,0x11,0x7c, +0xd7,0xbe,0xd0,0x1, 0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x3, 0xad, +0x7e,0xa3,0xb, 0x17,0xbe,0xa1,0xe, 0x68,0x9, 0x7e,0xb3,0x3, 0xac,0x70,0x3, 0x7a, +0xa1,0xe, 0x12,0x38,0x4, 0x7e,0x73,0x3, 0xa4,0x7a,0x73,0x0, 0x7f,0x7e,0x34,0x2, +0xef,0x7a,0x37,0x6, 0x65,0x12,0x1f,0x26,0x7e,0x34,0x6, 0x22,0x7a,0x37,0x3, 0x58, +0x12,0x4f,0x84,0x12,0x1b,0x4a,0x12,0x40,0x34,0x7e,0xa3,0x3, 0xad,0x4c,0xaa,0x78, +0x4, 0x74,0x1, 0x80,0x13,0xbe,0xa0,0x2, 0x78,0x4, 0x74,0x5, 0x80,0xa, 0xbe,0xa0, +0x3, 0x78,0x4, 0x74,0x2, 0x80,0x1, 0xe4,0x7a,0xb3,0x3, 0xb3,0x7e,0xb3,0x3, 0xa4, +0xb4,0x1, 0xe, 0x7e,0xb3,0x3, 0xa5,0x70,0x8, 0x7e,0x73,0x3, 0xb3,0x7a,0x73,0x3, +0xae,0x7e,0x34,0x3, 0x58,0x7e,0x24,0x2, 0xef,0x12,0x3a,0xc8,0x12,0x19,0x99,0x7e, +0xb3,0x3, 0xac,0xb4,0x1, 0x2, 0x80,0x2, 0x61,0x28,0x7e,0xb3,0x0, 0x80,0x60,0x2, +0x61,0x28,0xbe,0xf0,0x1, 0x78,0x35,0x6c,0xff,0x6c,0xcc,0xa, 0x2c,0x2e,0x24,0x3, +0xde,0x12,0x4a,0xe2,0xb, 0xc0,0xbe,0xc0,0x15,0x78,0xf0,0x12,0x4f,0x13,0x7a,0xb3, +0x4, 0x29,0x12,0x9, 0xe7,0x74,0x1a,0x7a,0xb3,0xb, 0x16,0xe4,0x7a,0xb3,0xb, 0x19, +0x74,0x2, 0x7a,0xb3,0xb, 0x1a,0x74,0x2, 0x7a,0xb3,0xb, 0x18,0x12,0xf, 0x9e,0xe4, +0x7a,0xb3,0x3, 0xac,0x61,0x28,0x12,0x4e,0xb6,0xe4,0x12,0xf, 0x76,0x12,0x0, 0x41, +0xda,0x3b,0x22,0x74,0x23,0x7a,0xb3,0xa, 0xd5,0x12,0x40,0xa8,0x7e,0x34,0x2, 0xf8, +0xca,0x3b,0x7d,0x73,0x6c,0xdd,0x49,0x37,0x0, 0x5d,0x12,0x1e,0xfd,0x1e,0x34,0x7c, +0xc7,0xe4,0x7e,0x79,0x70,0x12,0xf, 0x5f,0x74,0x2, 0x9, 0x77,0x0, 0x2, 0x12,0xf, +0x5f,0x74,0x3, 0x9, 0x77,0x0, 0x3, 0x12,0xf, 0x5f,0x74,0x4, 0x9, 0x77,0x0, 0x4, +0x12,0xf, 0x5f,0x74,0x5, 0x9, 0x77,0x0, 0x5, 0x12,0xf, 0x5f,0x74,0x6, 0x9, 0x77, +0x0, 0x5f,0x12,0xf, 0x5f,0x74,0x8, 0x9, 0x77,0x0, 0x6, 0x12,0xf, 0x5f,0x74,0x9, +0x9, 0x77,0x0, 0x7, 0x12,0xf, 0x5f,0x74,0xa, 0x7c,0x7c,0x12,0xf, 0x5f,0x74,0x1, +0x6c,0x77,0x12,0xf, 0x5f,0x6c,0xcc,0x80,0x3b,0x12,0xf, 0x68,0x24,0x10,0xa, 0x3c, +0x2d,0x37,0x9, 0x73,0x0, 0x47,0x12,0xf, 0x65,0x24,0x11,0xa, 0x3c,0x2d,0x37,0x9, +0x73,0x0, 0x8, 0x12,0xf, 0x65,0x24,0x12,0xa, 0x3c,0x2d,0x37,0x9, 0x73,0x0, 0x1d, +0x12,0xf, 0x65,0x24,0x13,0xa, 0x3c,0x2d,0x37,0x9, 0x73,0x0, 0x32,0x12,0xf, 0x5f, +0xb, 0xd0,0xb, 0xc0,0x9, 0x77,0x0, 0x5, 0xbc,0x7c,0x38,0xbd,0xda,0x3b,0x22,0xf5, +0xd9,0x7a,0x71,0xda,0x22,0x12,0xf, 0x5f,0x7c,0xbd,0x3e,0xb0,0x3e,0xb0,0x22,0x74, +0x1, 0x7a,0xb3,0x3, 0xac,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0x6d,0x44, +0x7e,0x70,0x2, 0xac,0x7a,0x22,0x53,0xdb,0xfd,0xd2,0xeb,0x43,0xdb,0x1, 0x43,0xdb, +0x20,0x22,0x12,0xf, 0x86,0x7e,0x34,0xa, 0xa7,0x7e,0x24,0x6, 0x8a,0x22,0x12,0x14, +0x1e,0x60,0xfb,0x12,0x15,0xfb,0x12,0x14,0xf0,0x12,0xe, 0xa3,0x12,0xf, 0x86,0x12, +0x17,0xb5,0x12,0xf, 0x95,0x2, 0xf, 0xb8,0xca,0x3b,0x7d,0x62,0x7d,0x73,0x9, 0x77, +0x0, 0x2c,0x7a,0x73,0xc, 0x44,0x9, 0xb7,0x0, 0x2b,0xf5,0x2c,0xe4,0x19,0xb7,0x0, +0x2c,0x19,0xb7,0x0, 0x2b,0x7d,0x36,0x2e,0x34,0x1, 0xf8,0x7a,0x37,0xc, 0x42,0x7a, +0x67,0xc, 0x40,0x75,0x29,0x1, 0x12,0x14,0x1e,0x60,0xfb,0x7d,0x37,0x7d,0x26,0x12, +0x11,0xa8,0x12,0xf, 0x86,0x6d,0x33,0x7a,0x35,0x2a,0x7e,0x25,0x2a,0x3e,0x24,0x7d, +0x32,0x2e,0x37,0xc, 0x42,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2e,0x27,0xc, 0x40, +0x12,0x10,0x3b,0x7e,0x35,0x2a,0xb, 0x34,0x7a,0x35,0x2a,0xbe,0x34,0x0, 0xfc,0x78, +0xd9,0x5, 0x29,0xe5,0x29,0xbe,0xb0,0x4, 0x28,0xbc,0x7e,0x73,0xc, 0x44,0x19,0x77, +0x0, 0x2c,0xe5,0x2c,0x19,0xb7,0x0, 0x2b,0xda,0x3b,0x22,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x22,0xca,0x3b,0x7e,0xb3,0xa, 0xd2,0xf5,0x27,0x7e,0xb3,0xa, 0xd3, +0xf5,0x28,0x74,0x1, 0x12,0x4f,0x5f,0x6c,0xee,0x6c,0xff,0xa, 0x3f,0x9, 0x73,0x3, +0xff,0xbc,0x7e,0x40,0x2, 0x7c,0xe7,0xb, 0xf0,0xbe,0xf0,0x15,0x78,0xed,0xbe,0xe0, +0x3f,0x50,0xc, 0xa, 0x2e,0x7e,0x34,0x0, 0x3f,0x9d,0x32,0x7c,0xe7,0x80,0x2, 0x6c, +0xee,0x7c,0xde,0x21,0x75,0x12,0x17,0xbc,0x12,0x19,0x8c,0x12,0x14,0x1e,0x60,0xfb, +0x12,0xf, 0x95,0x12,0x11,0xa8,0x6c,0xff,0x6c,0xcc,0x4c,0xff,0x78,0xa, 0x6d,0x33, +0x74,0x2, 0xac,0xbc,0x59,0x35,0xc, 0x40,0x7e,0x50,0x2, 0xac,0x5c,0x7e,0x70,0x18, +0xac,0x7f,0x2d,0x32,0x49,0x13,0x8, 0x82,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14, +0xe, 0x14,0x2e,0x24,0xc, 0x40,0x12,0x10,0x3b,0xb, 0xc0,0xbe,0xc0,0xc, 0x78,0xca, +0xb, 0xf0,0xbe,0xf0,0x15,0x78,0xc1,0x6c,0xcc,0x6c,0xff,0x7e,0x4, 0x0, 0x15,0x74, +0x2, 0xac,0xbf,0x7d,0x35,0x2e,0x34,0xc, 0x40,0xb, 0x38,0x10,0x8d,0x10,0x1b,0x38, +0x10,0xb, 0x38,0x40,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1b,0x38, +0x40,0x49,0x25,0xc, 0x40,0x7e,0x37,0x3, 0xc7,0x9e,0x37,0x4, 0x25,0xbd,0x23,0x50, +0x18,0x12,0x9, 0xd8,0xa, 0x3b,0x9, 0xb3,0x2, 0xd2,0xbc,0xbe,0x50,0x7, 0x2e,0x34, +0x2, 0xd2,0x4, 0x80,0x23,0xb, 0xc0,0x80,0x2a,0x7e,0x37,0x4, 0x25,0x2e,0x37,0x3, +0xc7,0xbd,0x23,0x28,0x1c,0x12,0x9, 0xd8,0xa, 0x3b,0x9, 0xb3,0x2, 0xd2,0xbe,0xb0, +0x0, 0x28,0xa, 0x2e,0x34,0x2, 0xd2,0x14,0x7a,0x39,0xb0,0x80,0x6, 0xb, 0xc0,0x80, +0x2, 0xb, 0xc0,0xb, 0xf0,0xbe,0xf0,0xc, 0x78,0x81,0x53,0xdb,0xf0,0x12,0x16,0xc5, +0xa9,0xc5,0xcb,0x7e,0xb3,0x4, 0x24,0x12,0x7, 0x7f,0x7e,0xf0,0x14,0x12,0xf, 0x86, +0xbe,0xc0,0xc, 0x68,0xa, 0x7c,0xad,0x1b,0xd0,0x4c,0xaa,0x68,0x2, 0x1, 0x85,0x6c, +0xff,0x12,0x9, 0xd8,0xa, 0x3b,0x9, 0x73,0x2, 0xd2,0xa, 0x2f,0x19,0x72,0x4, 0x14, +0xb, 0xf0,0xbe,0xf0,0xc, 0x40,0xea,0xe5,0x27,0x7a,0xb3,0xa, 0xd2,0xe5,0x28,0x7a, +0xb3,0xa, 0xd3,0x74,0x1, 0xda,0x3b,0x22,0xca,0xf8,0x7d,0x3, 0xc2,0x4, 0x6d,0x11, +0x9, 0x80,0x0, 0x1, 0x7e,0x9, 0x90,0x9, 0xa0,0x0, 0x2c,0xa9,0x33,0xdd,0x5, 0xa9, +0xc3,0xdd,0x80,0x3, 0xa9,0xd3,0xdd,0xe5,0x1c,0x19,0xb2,0x4, 0x1c,0xe5,0x1c,0x70, +0x17,0x75,0x1c,0x1, 0x74,0x20,0x12,0x4d,0x59,0xbe,0xb0,0xff,0x68,0x13,0xbe,0xb0, +0x1f,0x68,0xe, 0x75,0x1c,0xee,0x80,0x9, 0xe5,0x1c,0xb4,0xee,0x4, 0x74,0xee,0x41, +0xdb,0x9, 0xf0,0x0, 0x1a,0x9, 0xb0,0x0, 0x19,0xbc,0xbf,0x28,0xe, 0xd2,0x4, 0xa, +0x18,0x2d,0x10,0x9, 0x31,0x0, 0x18,0xa, 0x13,0x80,0x2, 0xa, 0x1b,0x75,0xc3,0x0, +0x9, 0xb0,0x0, 0x2f,0xc4,0x33,0x54,0xe0,0x4c,0xb8,0xf5,0xc3,0x7a,0x91,0xc4,0x3e, +0x14,0x2e,0x14,0x10,0x0, 0x9, 0xb0,0x0, 0x2b,0x70,0x64,0x49,0x32,0x4, 0x11,0xa, +0x6, 0x7c,0xb1,0xf5,0xba,0x7c,0xb7,0xf5,0xb9,0x7d,0x42,0x2e,0x44,0x1, 0xf8,0x7d, +0x34,0xa, 0x6, 0x7c,0xb1,0x12,0x12,0xe4,0x30,0x4, 0x3, 0x75,0xc2,0x10,0x43,0xc2, +0x5, 0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75, +0xc2,0x0, 0xa, 0x2, 0x7a,0x11,0xba,0x7c,0xb3,0xf5,0xb9,0x7d,0x34,0xa, 0x48,0x7c, +0xb9,0xf5,0xbc,0x7c,0xb7,0xf5,0xbb,0x7a,0x11,0xc1,0x7c,0xb3,0xf5,0xbd,0x80,0x0, +0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x4c, +0xaa,0x68,0x27,0x12,0x12,0xeb,0xa, 0x56,0xf5,0xbc,0x7c,0xb7,0xf5,0xbb,0x12,0x12, +0xde,0x30,0x4, 0x3, 0x75,0xc2,0x10,0x43,0xc2,0x3, 0x80,0x3, 0x43,0xc2,0x1, 0x0, +0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x80,0x1d,0x12,0x12,0xeb,0x12,0x12,0xde, +0x30,0x4, 0x3, 0x75,0xc2,0x10,0x43,0xc2,0x5, 0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, +0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0xe4,0xda,0xf8,0x22,0x2e,0x34, +0x1, 0xf8,0xa, 0x56,0xf5,0xc1,0x7c,0xb7,0xf5,0xbd,0x22,0xa, 0x52,0xf5,0xba,0x7c, +0xb3,0xf5,0xb9,0x7d,0x32,0x22,0xca,0x3b,0x7c,0xcb,0x12,0x4f,0x45,0x12,0x0, 0x46, +0x12,0x14,0x1e,0x60,0xfb,0x12,0xf, 0x86,0x12,0x14,0x1e,0x60,0xfb,0x12,0xf, 0x95, +0x12,0x11,0xa8,0x12,0x14,0xe7,0x6d,0x33,0x7d,0x73,0x6c,0xdd,0x4d,0x77,0x78,0xa, +0x6d,0x11,0x12,0x14,0x17,0xa, 0x2b,0x1b,0x28,0x10,0xa, 0x2d,0x2e,0x24,0x3, 0xae, +0x12,0x16,0xbd,0x93,0xa, 0x2b,0xbd,0x27,0x40,0x25,0x7e,0x14,0x0, 0xc, 0xad,0x17, +0x3e,0x14,0x7e,0x50,0x2, 0xac,0x5d,0x2d,0x21,0x2e,0x27,0xc, 0x80,0xb, 0x28,0x10, +0x12,0x14,0x17,0xa, 0x2b,0xb, 0x28,0x0, 0xbd,0x10,0x28,0x3, 0x1b,0x28,0x10,0xb, +0xd0,0xbe,0xd0,0xc, 0x78,0xb6,0xb, 0x74,0xbe,0x74,0x0, 0x15,0x78,0xac,0x7d,0x73, +0x6c,0xdd,0xa, 0x3d,0x2e,0x34,0x3, 0xae,0x12,0x9, 0xde,0xa, 0x3b,0xbd,0x37,0x40, +0x31,0x7e,0xf4,0x0, 0xc, 0xad,0xf7,0x7d,0xef,0x3e,0xe4,0x74,0x2, 0xac,0xbd,0x2d, +0xe5,0x2e,0xe7,0xc, 0x80,0xb, 0xe8,0x20,0x12,0x14,0x17,0xa, 0x3b,0xb, 0x38,0x30, +0x9d,0x32,0x7d,0x23,0x5e,0x24,0xff,0xf8,0xa, 0x1d,0x2d,0x1f,0x3e,0x14,0x59,0x21, +0x4, 0x2a,0xb, 0xd0,0xbe,0xd0,0xc, 0x78,0xb9,0xb, 0x74,0xbe,0x74,0x0, 0x15,0x78, +0xaf,0x7e,0x34,0x3, 0xb9,0x7a,0x35,0x21,0x75,0x23,0x0, 0x6d,0x77,0x7e,0x35,0x21, +0x7e,0x39,0x70,0x7c,0xb7,0x62,0x23,0xa, 0x3c,0x2d,0x37,0x7e,0x25,0x21,0x7d,0x12, +0xb, 0x14,0x7a,0x15,0x21,0x7e,0x29,0xb0,0x12,0x14,0x10,0xb, 0x74,0xbe,0x74,0x2, +0x69,0x40,0xda,0x7e,0x34,0x3, 0xf0,0xe5,0x23,0x12,0x14,0x10,0x7e,0x34,0x3, 0xf1, +0x74,0xff,0x9e,0xb1,0x23,0x12,0x14,0x10,0x12,0xf, 0x86,0x74,0x1, 0xda,0x3b,0x22, +0x2e,0x34,0x7c,0x0, 0x2, 0x8, 0x71,0x7c,0xbd,0x3e,0xb0,0x24,0x24,0x22,0x30,0x3, +0x5, 0xc2,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x12,0x14,0xe7,0x12,0x4f,0x35, +0x53,0xdb,0xf0,0x12,0x38,0x42,0x12,0x38,0x5e,0x12,0x17,0x16,0x12,0x14,0xf3,0x12, +0xe, 0xa9,0x12,0x1b,0x29,0x53,0xdb,0x7f,0x12,0xf, 0x86,0x74,0xc, 0x7a,0xb3,0xc, +0xa0,0x74,0x15,0x7a,0xb3,0xc, 0x9f,0x12,0x4f,0xa, 0x12,0x38,0x56,0x7a,0xb3,0xa, +0xd3,0x12,0x17,0xbc,0x7e,0xb3,0xc, 0x9c,0x70,0x24,0x12,0x19,0x8c,0x74,0x1, 0x7a, +0xb3,0xc, 0x9c,0x7e,0x34,0x7c,0x0, 0x12,0x1f,0xfb,0x74,0x4, 0x12,0x12,0xf6,0x6d, +0x33,0xe4,0x12,0x14,0x10,0x12,0x47,0x14,0x74,0xff,0x7a,0xb3,0xc, 0x9c,0x7e,0xf3, +0xc, 0x9d,0xbe,0xf0,0x3, 0x78,0x46,0x7e,0xb3,0xb, 0xe7,0x30,0xe7,0xc3,0x12,0x17, +0x16,0x80,0x3, 0x43,0x87,0x1, 0x12,0x14,0x1e,0x60,0xf8,0x53,0xdb,0xf0,0x12,0x14, +0xf3,0x12,0xe, 0xa9,0x12,0x1b,0x29,0x7e,0xb3,0xc, 0xa5,0x70,0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x12,0x4f,0x5f,0x12,0xf, 0x95,0x12,0x11,0xa8,0x12,0xf, 0x86,0x12,0x14, +0xe7,0x7e,0xb3,0xb, 0xe7,0x54,0x7f,0x7a,0xb3,0xb, 0xe7,0x80,0x84,0x7a,0xf3,0xb, +0x33,0x12,0x4e,0xb6,0xda,0xf8,0x22,0x7e,0x34,0x8, 0x82,0x7a,0x37,0xc, 0x80,0x22, +0x12,0x17,0x16,0xca,0xd8,0xca,0x79,0x7e,0x34,0x2, 0xd2,0x12,0x4f,0x9f,0x7e,0x34, +0x2, 0xc6,0x12,0x4f,0x9f,0x6c,0x77,0x80,0x22,0xa, 0x27,0x9, 0x62,0x3, 0xf3,0x12, +0x16,0xb9,0x93,0xa, 0x2b,0x19,0x62,0x2, 0xc6,0xa, 0x27,0x9, 0x62,0x4, 0x14,0x12, +0x16,0xb9,0x93,0xa, 0x2b,0x19,0x62,0x2, 0xd2,0xb, 0x70,0x7e,0x63,0x3, 0xba,0xbc, +0x67,0x38,0xd6,0x7e,0x73,0x3, 0xbb,0x7a,0x73,0x2, 0xde,0x7e,0x73,0x3, 0xde,0x7a, +0x73,0x2, 0xdf,0x7e,0x73,0x3, 0xff,0x7a,0x73,0x2, 0xe0,0x74,0xa, 0x7a,0xb3,0x2, +0xe1,0x7e,0x73,0x3, 0xbd,0x7a,0x73,0x2, 0xe2,0x74,0x10,0x7a,0xb3,0x2, 0xe4,0xe4, +0x7a,0xb3,0x2, 0xe6,0x6d,0x77,0x6c,0x77,0x80,0x15,0xa, 0x27,0x12,0x16,0xb9,0x93, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x4d,0x72,0xb, 0x70,0x7e, +0x63,0x3, 0xba,0xbc,0x67,0x38,0xe3,0x7d,0x37,0x5e,0x34,0x0, 0x1, 0x78,0xe, 0x74, +0xf, 0x7a,0xb3,0x2, 0xe7,0x74,0xff,0x7a,0xb3,0x2, 0xe8,0x80,0xc, 0xa, 0x3e,0x7a, +0x73,0x2, 0xe7,0x7c,0x7f,0x7a,0x73,0x2, 0xe8,0x74,0xa, 0x7a,0xb3,0x2, 0xe3,0x7e, +0x73,0x4, 0x28,0x7a,0x73,0x2, 0xe5,0x74,0x1, 0x7a,0xb3,0x2, 0xe9,0x74,0xf8,0x7a, +0xb3,0x2, 0xea,0x74,0x81,0x7a,0xb3,0x2, 0xeb,0x74,0xff,0x7a,0xb3,0x2, 0xec,0x74, +0x14,0x7a,0xb3,0x2, 0xed,0x74,0xeb,0x7a,0xb3,0x2, 0xee,0x12,0x16,0xc5,0x7c,0xdb, +0x74,0x12,0x12,0x4e,0x99,0x7c,0x7b,0x5e,0x70,0xfc,0xb, 0x71,0x74,0x12,0x12,0x16, +0x4, 0xa9,0xc5,0xcb,0x7c,0xbd,0xda,0x79,0xda,0xd8,0x22,0x53,0xdb,0xf0,0x74,0xe, +0x7e,0x73,0x4, 0x28,0x12,0x4e,0x70,0x44,0x40,0xf5,0xd6,0xe5,0xdb,0x30,0xe3,0xfb, +0x53,0xdb,0xf3,0x7a,0x71,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x43,0xd7, +0x4, 0x22,0xca,0x79,0x7d,0x73,0x74,0x6, 0x9, 0x77,0x0, 0x19,0x12,0x16,0x4, 0x74, +0xa, 0x9, 0x77,0x0, 0x1a,0x12,0x16,0x4, 0x74,0x8, 0x9, 0x77,0x0, 0x20,0x12,0x16, +0x4, 0x74,0x2a,0x9, 0x77,0x0, 0x1b,0x12,0x16,0x4, 0x74,0xc, 0x9, 0x77,0x0, 0x1c, +0x12,0x16,0x4, 0x74,0x2a,0x9, 0x77,0x0, 0x1d,0x12,0x16,0x4, 0x74,0x2e,0x9, 0x77, +0x0, 0x1e,0x12,0x16,0x4, 0x74,0x2, 0x9, 0x77,0x0, 0x21,0x12,0x16,0x4, 0x74,0x4, +0x9, 0x77,0x0, 0x22,0x12,0x16,0x4, 0x74,0x24,0x9, 0x77,0x0, 0x23,0x12,0x16,0x4, +0x74,0x1e,0x9, 0x77,0x0, 0x24,0x12,0x16,0x4, 0x74,0x18,0x9, 0x77,0x0, 0x25,0x12, +0x16,0x4, 0x74,0x20,0x9, 0x77,0x0, 0x26,0x12,0x16,0x4, 0x74,0x22,0x9, 0x77,0x0, +0x27,0x12,0x16,0x4, 0x74,0xe, 0x9, 0x77,0x0, 0x1f,0x12,0x16,0x4, 0x74,0x1c,0x9, +0x77,0x0, 0x28,0x12,0x16,0x4, 0xda,0x79,0x22,0x2e,0x24,0x2, 0x83,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x22,0xa9,0xd5,0xcb,0x7e,0x34,0x2, 0xc6,0xca,0x79,0x7d,0x73, +0xe4,0x12,0x4d,0x99,0x9, 0xb7,0x0, 0x18,0x12,0x4e,0xf3,0x74,0x1, 0x12,0x4d,0x81, +0x12,0x4e,0xd8,0x70,0x3, 0xe4,0x80,0x2b,0x74,0x14,0x7e,0x70,0x7f,0x12,0x17,0xcb, +0x70,0x3, 0xe4,0x80,0x1e,0x7d,0x37,0x7d,0x27,0x2e,0x24,0x0, 0xc, 0x12,0x4d,0xca, +0x7d,0x37,0x12,0x16,0x22,0xe4,0x12,0x4d,0x81,0x12,0x4e,0xe6,0x60,0x4, 0x74,0x1, +0x80,0x1, 0xe4,0xda,0x79,0x22,0x12,0x4e,0xff,0x7e,0x73,0x3, 0xb9,0x7a,0x73,0xa, +0xa7,0x7e,0x73,0x3, 0xba,0x7a,0x73,0xa, 0xa8,0x7e,0x24,0x3, 0xc9,0x7e,0x34,0xa, +0xab,0x12,0x44,0xd3,0x6c,0xaa,0x80,0x11,0xa, 0x3a,0x2e,0x34,0x2, 0x83,0x12,0x9, +0xde,0xa, 0x4a,0x19,0xb4,0xa, 0xc0,0xb, 0xa0,0x7e,0xb3,0x3, 0xba,0xbc,0xba,0x38, +0xe7,0x7e,0x73,0x3, 0xbc,0x7a,0x73,0xa, 0xcc,0x7e,0x73,0x3, 0xff,0x7a,0x73,0xa, +0xcd,0x7e,0x73,0x3, 0xbd,0x7a,0x73,0xa, 0xce,0x7e,0x73,0x3, 0xbd,0x7a,0x73,0xa, +0xcf,0x7e,0x73,0x3, 0xbd,0x7a,0x73,0xa, 0xd0,0xe4,0x7a,0xb3,0xa, 0xd6,0x7a,0xb3, +0xa, 0xd7,0x22,0x12,0x17,0xbc,0x12,0x4f,0x35,0x53,0xdb,0xf0,0x12,0x14,0xf0,0x7e, +0xb3,0x4, 0x24,0x12,0x7, 0x7f,0x12,0xf, 0x86,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x4, +0x25,0x12,0x10,0x44,0x12,0x4e,0xb6,0x12,0x1f,0xa6,0x7e,0xb3,0xb, 0xe7,0x54,0x8f, +0x7a,0xb3,0xb, 0xe7,0x22,0x7e,0x34,0x6, 0x8a,0x12,0x45,0xc, 0x6d,0x33,0x7a,0x37, +0x3, 0xb4,0x7e,0x34,0xd, 0xac,0x7a,0x37,0x0, 0x3c,0x22,0x7c,0x67,0x7c,0xab,0x12, +0x16,0x4, 0x7c,0xba,0x12,0x4e,0x99,0x7c,0x7b,0xbc,0x67,0x78,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0x53,0xdc,0xe0,0x43,0xdc,0x6, 0x7e,0xa0,0x12,0x0, 0x1b,0xa0,0x78,0xfb, +0x53,0xc9,0xfe,0xbe,0xb0,0xf, 0x40,0x13,0xbe,0xb0,0x2e,0x38,0xe, 0x53,0xc9,0xfe, +0x53,0xdc,0xe0,0xa, 0x3b,0x9e,0x34,0x0, 0xf, 0x80,0x13,0x43,0xc9,0x1, 0x53,0xdc, +0xe0,0xbe,0xb0,0xe, 0x38,0xd, 0xa, 0x2b,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xb7, +0x42,0xdc,0x22,0xb4,0x2f,0x4, 0x43,0xdc,0x3, 0x22,0xb4,0x30,0x4, 0x43,0xdc,0x2, +0x22,0x43,0xdc,0xa, 0x22,0x2, 0x18,0x38,0xc2,0x8e,0x2, 0x18,0x3d,0xe5,0x9b,0xa, +0x3b,0x6d,0x22,0xb, 0x1c,0x7e,0x14,0x0, 0xc, 0x12,0x0, 0xa9,0x7e,0xb4,0x3, 0xe8, +0x7d,0x1b,0x12,0x0, 0xa9,0x7f,0x1, 0x7e,0xd4,0x36,0x0, 0x7e,0xc4,0x1, 0x6e,0x7f, +0x16,0x12,0x1, 0x5, 0x7f,0x1, 0x7e,0x78,0xff,0xff,0x7f,0x17,0x9f,0x10,0x7c,0xb6, +0xf5,0x8d,0xe5,0x9b,0xa, 0xb, 0xb, 0x4, 0x7e,0x14,0x0, 0xc, 0xad,0x10,0xad,0x1b, +0x7f,0x16,0x12,0x1, 0x5, 0x7f,0x27,0x9f,0x21,0xf5,0x8b,0xd2,0x8e,0x22,0xca,0x7b, +0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83, +0xc0,0x82,0x12,0x18,0x35,0x12,0x19,0x83,0x20,0x93,0x8, 0x6d,0x33,0x7a,0x37,0xc, +0xae,0x80,0x13,0x7e,0x37,0xc, 0xae,0xb, 0x34,0x7a,0x37,0xc, 0xae,0xbe,0x34,0x3, +0xe8,0x28,0x3, 0x75,0xe9,0xff,0xe5,0xcc,0xb4,0x2, 0x3, 0x12,0x19,0x83,0x12,0x1b, +0x30,0x68,0x6, 0x1b,0x34,0x7a,0x37,0xa, 0xd8,0x7e,0x35,0x17,0xbe,0x34,0x3, 0xe8, +0x40,0xe, 0x6d,0x33,0x7a,0x35,0x17,0xe5,0xb, 0xbe,0xb0,0x64,0x50,0x2, 0x5, 0xb, +0x7e,0x37,0x3, 0xb4,0xb, 0x34,0x7a,0x37,0x3, 0xb4,0x7e,0x37,0x0, 0x3c,0xbe,0x37, +0x3, 0xb4,0x28,0x3, 0x12,0x19,0x8c,0x7e,0x37,0x3, 0xb7,0x4d,0x33,0x68,0xe, 0xbe, +0x34,0x0, 0x1, 0x78,0x2, 0xd2,0x1, 0x1b,0x34,0x7a,0x37,0x3, 0xb7,0x12,0x1f,0xe0, +0x50,0x5, 0xb, 0x34,0x7a,0x35,0x8, 0x7e,0xb3,0xb, 0x33,0xb4,0xaa,0x13,0x7e,0xa3, +0x2, 0xc5,0x7c,0xba,0x4, 0x7a,0xb3,0x2, 0xc5,0xbe,0xa0,0x64,0x28,0x3, 0x12,0x1f, +0xa6,0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x5, 0x12,0xe5,0xcc,0xb4,0x2, 0x7, 0x5, +0x12,0x80,0x3, 0x75,0x11,0x1, 0x7e,0xb3,0xb, 0xe0,0x60,0x12,0xbe,0xb0,0x28,0x50, +0x7, 0x4, 0x7a,0xb3,0xb, 0xe0,0x80,0x6, 0x12,0x4, 0xe1,0x12,0x38,0x5e,0xd0,0x82, +0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b, +0xda,0x7b,0x32,0x7e,0x35,0x17,0xb, 0x34,0x7a,0x35,0x17,0x22,0x2, 0x19,0x8f,0xe5, +0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x79,0x7e,0xf1,0xcc,0x7e,0x37, +0x2, 0xba,0x4d,0x33,0x78,0x35,0x7e,0x53,0x3, 0xa4,0xbe,0x50,0x0, 0x28,0x5, 0x75, +0xb, 0x0, 0x41,0x69,0x7e,0xb3,0x2, 0xbc,0x20,0xe0,0x2, 0x41,0x69,0x7e,0x53,0x2, +0xc2,0xbe,0x51,0xb, 0x28,0x2, 0x41,0x69,0x75,0xb, 0x0, 0x7e,0x24,0x0, 0x1, 0x7a, +0x27,0x2, 0xba,0x74,0x1, 0x7a,0xb3,0xb, 0x31,0x41,0x69,0xbe,0x34,0x0, 0x1, 0x78, +0x1b,0x7e,0xb3,0x3, 0xa4,0x70,0x2, 0x41,0x69,0x6d,0x22,0x7a,0x27,0x2, 0xba,0xe4, +0x7a,0xb3,0xb, 0x31,0x75,0x12,0x22,0x75,0x11,0x1, 0x80,0x6d,0xbe,0x34,0x0, 0x3, +0x78,0x67,0x12,0x17,0xbc,0x12,0x19,0x8c,0xa9,0xd6,0xeb,0xa9,0xc6,0xac,0xa9,0xc6, +0xec,0xc2,0x96,0xc2,0x89,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x12,0x14,0x1e,0x60, +0xfb,0x20,0x93,0xfd,0x53,0xca,0xfe,0x53,0xc9,0xfd,0x75,0x87,0x2, 0x0, 0x0, 0x0, +0x0, 0xc2,0xa8,0xc2,0x95,0x43,0xca,0x1, 0x12,0x4a,0x57,0x12,0x17,0xbc,0x12,0x19, +0x8c,0x12,0x1a,0xb8,0x53,0xdb,0xf0,0x43,0xc9,0x2, 0x12,0xf, 0x86,0x12,0x1a,0xc0, +0x6d,0x33,0x7a,0x37,0x2, 0xba,0xe4,0x7a,0xb3,0xb, 0x31,0x12,0x1b,0x37,0x12,0x1f, +0xe8,0x12,0x1b,0x30,0x78,0xfb,0x12,0xf, 0x6f,0x6c,0xee,0xa9,0xc6,0xcb,0x80,0x1d, +0xe4,0x12,0x49,0xe8,0xa9,0x25,0xdd,0x15,0xa9,0x21,0xdb,0x11,0xc2,0xcd,0xa9,0xc7, +0xcb,0xc2,0xcc,0x4c,0xee,0x78,0x6, 0x7e,0xe0,0x1, 0x75,0xcc,0x2, 0xe5,0x11,0x60, +0xdf,0x12,0x1a,0xb8,0xa9,0xd6,0xcb,0x75,0x12,0x0, 0x75,0x11,0x0, 0x7a,0xf1,0xcc, +0x7e,0xb3,0x3, 0xa8,0x54,0xef,0x7a,0xb3,0x3, 0xa8,0x7e,0x73,0x3, 0xa4,0x7a,0x73, +0x3, 0xa5,0x12,0x1b,0x29,0xda,0x79,0x22,0xd2,0xcd,0xa9,0xd7,0xcb,0xd2,0xcc,0x22, +0x7e,0x34,0x0, 0x3e,0x7e,0x24,0x1, 0x6b,0xe4,0x12,0x0, 0x46,0x7e,0x34,0x3, 0x58, +0x7e,0x24,0x0, 0x5c,0xe4,0x12,0x0, 0x46,0x7e,0x34,0x0, 0x5c,0x12,0x1b,0x20,0x7e, +0x34,0x3, 0x5c,0x12,0x1b,0x20,0x7e,0x34,0x3, 0x7f,0x12,0x1b,0x20,0x74,0x1, 0x7a, +0xb3,0x3, 0xaa,0x75,0x12,0x0, 0x75,0x13,0x0, 0x75,0x11,0x0, 0x75,0xb, 0x0, 0x6d, +0x33,0x7a,0x37,0x3, 0xb4,0x7e,0x24,0xd, 0xac,0x7a,0x27,0x0, 0x3c,0xe4,0x7a,0xb3, +0x2, 0xc5,0x7a,0xb3,0x3, 0xb6,0x7a,0x37,0x3, 0xb7,0xc2,0x1, 0x7a,0x35,0x8, 0x22, +0x7e,0x24,0x0, 0x23,0x74,0xff,0x2, 0x0, 0x46,0x74,0x23,0x7a,0xb3,0xa, 0xd5,0x22, +0x7e,0x37,0xa, 0xd8,0x4d,0x33,0x22,0x12,0x1f,0xf1,0x74,0x6, 0x7a,0xb3,0xa, 0x9d, +0x6d,0x33,0x7a,0x37,0xa, 0xa4,0x75,0x15,0x2, 0x22,0xca,0x3b,0x7e,0xb3,0x3, 0xa4, +0xf5,0x2d,0x7e,0xd3,0x3, 0xa5,0x7e,0x34,0xc, 0x40,0x12,0x1b,0x20,0x7e,0x34,0x0, +0x2f,0x7e,0x24,0x0, 0x5, 0xe4,0x12,0x0, 0x46,0xe5,0x2d,0x70,0x45,0x6c,0xee,0x12, +0x1e,0x65,0xac,0xbe,0x12,0x1e,0x61,0xac,0xbe,0x12,0x1e,0xe7,0xac,0xbe,0x12,0x1e, +0xde,0x59,0x35,0xc, 0x9, 0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xe3,0xbe,0xd0,0x0, 0x38, +0x2, 0xc1,0x4e,0x7e,0x34,0x3, 0x7f,0x12,0x1b,0x20,0x7e,0xb3,0x3, 0xa8,0x44,0x4, +0x7a,0xb3,0x3, 0xa8,0x54,0xf7,0x7a,0xb3,0x3, 0xa8,0x54,0xdf,0x7a,0xb3,0x3, 0xa8, +0xc1,0x4e,0x6c,0xee,0x80,0x26,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x0, 0x5c,0xb, +0x28,0x30,0x12,0x1f,0xa, 0x1b,0x28,0x30,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x0, +0x5e,0xb, 0x28,0x30,0x12,0x1f,0xa, 0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x2d,0xbc,0xbe, +0x38,0xd4,0x4c,0xdd,0x78,0xa, 0x7e,0xb3,0x3, 0xa8,0x44,0x10,0x7a,0xb3,0x3, 0xa8, +0x6c,0x11,0x6c,0xee,0x6c,0xff,0x80,0x11,0x12,0x1f,0x13,0x78,0xa, 0xbe,0x0, 0xff, +0x68,0x5, 0x12,0x1f,0x5b,0x80,0x8, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xe9,0xb, +0xe0,0xbe,0xe0,0x5, 0x78,0xde,0x6c,0xee,0x7e,0xf1,0x2d,0x80,0x11,0x12,0x1f,0x13, +0x78,0xa, 0xbe,0x0, 0xff,0x68,0x5, 0x12,0x1f,0x5b,0x80,0x7, 0xb, 0xf0,0xbe,0xf0, +0x5, 0x40,0xea,0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xde,0x6c,0xff,0x6c,0xee,0x80,0x17, +0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xc, 0x44,0x7e,0x70,0x7, 0xac,0x7f,0x9, 0x3, 0x0, +0x60,0xbc,0xa, 0x68,0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe5,0xbc,0x1e,0x78,0x19,0x7e, +0x70,0x7, 0xac,0x7f,0x2e,0x34,0x0, 0x5c,0x7e,0x30,0x7, 0xac,0x31,0x2e,0x14,0xc, +0x40,0x74,0x7, 0x12,0x1, 0x39,0xb, 0x10,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xbd,0x7e, +0x24,0xc, 0x40,0x7e,0x34,0x3, 0x7f,0x12,0x1e,0x51,0x4c,0xdd,0x78,0xd, 0x7e,0x24, +0x0, 0x5c,0x7e,0x34,0x3, 0x7f,0x12,0x1e,0x51,0xa1,0xc2,0x7e,0xb3,0x3, 0xa8,0x30, +0xe3,0x2, 0xa1,0xc2,0x6c,0xff,0xa1,0xba,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7f,0x9, +0x43,0x0, 0x60,0x74,0x7, 0xac,0xbe,0x9, 0x55,0x3, 0x83,0xbc,0x54,0x68,0x7, 0xb, +0xe0,0xbe,0xe0,0x5, 0x40,0xe4,0x7e,0x50,0x7, 0xac,0x5e,0x9, 0x12,0x3, 0x83,0x7a, +0x11,0x2e,0x2e,0x10,0x2f,0x74,0x1, 0xa5,0xf7,0x49,0x33,0x0, 0x5e,0x49,0x22,0x3, +0x81,0x12,0x1e,0x6c,0x7d,0x63,0x12,0x1e,0x58,0x74,0x7, 0xac,0xbe,0x49,0x25,0x3, +0x7f,0x12,0x1e,0xa4,0x7a,0x35,0x29,0x12,0x1e,0x9b,0x7e,0xa1,0x2e,0x74,0x7, 0xa4, +0x49,0x25,0xc, 0x15,0x12,0x1e,0x6c,0x7d,0x63,0x12,0x1e,0x58,0x7e,0xa1,0x2e,0x74, +0x7, 0xa4,0x49,0x25,0xc, 0x13,0x12,0x1e,0xa4,0x7e,0x17,0x2, 0xf0,0xbe,0x15,0x27, +0x38,0x9, 0x7e,0x4, 0x1, 0x0, 0x7a,0x5, 0x2b,0x80,0x1e,0x7e,0x35,0x29,0x6d,0x22, +0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x0, 0xb2,0x7a,0x35,0x2b,0xbe,0x34,0x0, 0x10, +0x50,0x7, 0x7e,0x34,0x0, 0x10,0x7a,0x35,0x2b,0x7e,0x35,0x2b,0xbe,0x34,0x1, 0x0, +0x28,0x7, 0x7e,0x34,0x1, 0x0, 0x7a,0x35,0x2b,0x7e,0xa1,0x2e,0x74,0x2, 0xa4,0x49, +0x45,0xc, 0x36,0xbe,0x45,0x27,0x28,0x9, 0x49,0x45,0xc, 0x9, 0x7a,0x45,0x2b,0x80, +0x7, 0x7e,0x45,0x2b,0x59,0x45,0xc, 0x9, 0x7e,0x35,0x27,0x59,0x35,0xc, 0x36,0x12, +0x1e,0x58,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x3, 0x7f,0x7e,0x15,0x2b,0x12,0x1e, +0xad,0x12,0x1e,0x9b,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x3, 0x81,0x7e,0x15,0x2b, +0x12,0x1e,0xad,0x12,0x1e,0xf0,0x7e,0x71,0x2e,0x74,0x7, 0xac,0x7b,0x2e,0x34,0xc, +0x13,0x7e,0x14,0x0, 0x7, 0x12,0x3, 0x6e,0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x28,0x2, +0x81,0xa8,0x7e,0x24,0x3, 0x7f,0x7e,0x34,0x0, 0x5c,0x12,0x1e,0x51,0x6c,0xff,0x12, +0x1e,0xf0,0x12,0x1e,0xfa,0x1b,0x28,0x30,0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0x0, +0x5e,0x12,0x1e,0xfa,0x1b,0x28,0x30,0x7c,0x1f,0x2e,0x10,0x2f,0xa5,0xe7,0x70,0x16, +0x12,0x1e,0x65,0xac,0xbf,0x12,0x1e,0x61,0xac,0xbf,0x12,0x1e,0xe7,0xac,0xbf,0x12, +0x1e,0xde,0x59,0x35,0xc, 0x9, 0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xc2,0x7e,0xb3,0x3, +0xa8,0x44,0x1, 0x7a,0xb3,0x3, 0xa8,0xe5,0x2d,0xbe,0xb0,0x0, 0x28,0x30,0x7e,0x24, +0x0, 0x5c,0x7e,0x34,0x3, 0x5c,0x12,0x1e,0x51,0x6c,0xff,0x12,0x1e,0x58,0x12,0x1f, +0xb4,0x74,0x7, 0xac,0xbf,0x59,0x35,0x3, 0x5c,0x12,0x1e,0x9b,0x12,0x27,0x2d,0x74, +0x7, 0xac,0xbf,0x59,0x35,0x3, 0x5e,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xdd,0xda,0x3b, +0x22,0x7e,0x14,0x0, 0x23,0x2, 0x3, 0x6e,0x74,0x7, 0xac,0xbf,0x49,0x35,0x0, 0x5c, +0x22,0x59,0x35,0xc, 0x13,0x7e,0x34,0xff,0xff,0x74,0x7, 0x22,0x7d,0x13,0xbd,0x21, +0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22,0x3e,0x34,0x9, 0x73, +0xc, 0x41,0x7e,0x60,0x2, 0x7c,0xa6,0x7c,0x57,0xa, 0x3b,0xa, 0x25,0x12,0x1e,0x6c, +0xa, 0x2a,0xbd,0x32,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x74,0x7, 0xac,0xbf,0x49, +0x35,0x0, 0x5e,0x22,0x12,0x1e,0x6c,0x2d,0x36,0x7a,0x35,0x27,0x22,0xca,0x3b,0x7a, +0x15,0x34,0x7d,0x72,0x7d,0x63,0xb, 0x78,0x20,0x12,0x1e,0x6c,0x7d,0x23,0x7e,0x35, +0x34,0xad,0x23,0x12,0x1f,0xad,0x7d,0x23,0xb, 0x78,0x30,0xbd,0x36,0x50,0x7, 0x2d, +0x23,0x1b,0x78,0x20,0x80,0x5, 0x9d,0x32,0x1b,0x78,0x30,0xda,0x3b,0x22,0x59,0x45, +0xc, 0x36,0x7e,0x34,0x1, 0x0, 0x22,0x59,0x35,0xc, 0x15,0x6d,0x44,0x74,0x2, 0x22, +0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0x0, 0x5c,0x22,0xb, 0x28,0x30,0x1e,0x34,0x1e, +0x34,0x1e,0x34,0x1e,0x34,0x22,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x22,0x74,0x7, 0xac,0xbf,0x9, 0x75,0x0, 0x60,0x74,0x7, 0xac,0xbe,0x9, +0x5, 0x3, 0x83,0xbc,0x7, 0x22,0x7e,0x73,0x0, 0x7f,0x7a,0x73,0x6, 0x63,0x7e,0x24, +0x0, 0x5c,0x7e,0x34,0x6, 0x22,0x12,0x1e,0x51,0x12,0x24,0xe8,0x12,0x3e,0x92,0x7e, +0x24,0x6, 0x22,0x7e,0x34,0x0, 0x5c,0x12,0x1e,0x51,0x7e,0x73,0x6, 0x63,0x7a,0x73, +0x6, 0x64,0x7e,0x73,0x6, 0x63,0x7a,0x73,0x0, 0x7f,0x22,0x74,0x7, 0xac,0xb1,0x19, +0x5, 0xc, 0x44,0x74,0x7, 0xac,0xbe,0x49,0x35,0x3, 0x7f,0x74,0x7, 0xac,0xb1,0x59, +0x35,0xc, 0x40,0x74,0x7, 0xac,0xbe,0x49,0x35,0x3, 0x81,0x74,0x7, 0xac,0xb1,0x59, +0x35,0xc, 0x42,0x74,0x7, 0xac,0xbf,0x9, 0x5, 0x0, 0x61,0x74,0x7, 0xac,0xb1,0x19, +0x5, 0xc, 0x45,0x74,0x7, 0xac,0xbf,0x9, 0x5, 0x0, 0x62,0x74,0x7, 0xac,0xb1,0x19, +0x5, 0xc, 0x46,0xb, 0x10,0x22,0x74,0x1, 0x7a,0xb3,0xb, 0x33,0x22,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x22,0xbe,0x34,0x0, 0x0, 0x40,0x2, 0x80,0x2, 0x6d,0x33,0x6d,0x22, +0x7e,0x14,0xcf,0x0, 0x7e,0x4, 0x0, 0x2, 0x12,0x0, 0x98,0x7e,0x14,0x2, 0xff,0x12, +0x0, 0xb2,0x12,0x1f,0xad,0xbe,0x18,0x2, 0xd0,0x40,0x4, 0x7e,0x18,0x2, 0xcf,0x22, +0x7e,0x35,0x8, 0xbe,0x34,0x9c,0x40,0x22,0x7e,0x34,0x0, 0xa, 0x7a,0x37,0xa, 0xd8, +0x22,0xe4,0x7a,0xb3,0xa, 0x9f,0x7a,0xb3,0xa, 0x9e,0x22,0x2, 0x1f,0xfe,0x12,0x4f, +0x27,0x75,0xf3,0x0, 0xa, 0x56,0x1e,0x54,0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1, +0x75,0xf2,0x0, 0x75,0xf9,0x0, 0x75,0xf9,0x10,0x75,0xf9,0x50,0x74,0xa, 0x12,0x20, +0x46,0x75,0xf9,0x51,0x74,0x2d,0x12,0x20,0x5b,0x75,0xf9,0x11,0x74,0xa, 0x12,0x20, +0x46,0x75,0xf9,0x10,0x75,0xf9,0x0, 0x74,0x1, 0x12,0x20,0x46,0x2, 0x8, 0xb3,0x74, +0xfa,0x12,0x20,0x46,0x74,0xfa,0x7c,0xab,0x80,0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xf0,0x22,0x7c,0x6b,0x80,0x6, 0x12, +0x20,0x3f,0x12,0x20,0x3f,0x7c,0x76,0x1b,0x60,0xa5,0xbf,0x0, 0xf2,0x22,0xca,0x3b, +0x7c,0xfb,0x7e,0xb3,0x0, 0x7f,0xbe,0xb0,0x2, 0x50,0x2, 0x41,0xca,0xf5,0x32,0x7e, +0x64,0x8, 0x82,0x7e,0x73,0x0, 0x3e,0x7a,0x73,0xc, 0x40,0x7e,0x73,0x0, 0x3f,0x7a, +0x73,0xc, 0x41,0x75,0x2f,0x1, 0x7e,0xf0,0x1, 0x41,0x91,0x74,0x2, 0xac,0xbf,0x9, +0x65,0x0, 0x3e,0x7a,0x61,0x35,0x9, 0x55,0x0, 0x3f,0x7a,0x51,0x36,0x1e,0x60,0x7e, +0x70,0xc, 0xac,0x67,0x1e,0x50,0xa, 0x25,0x2d,0x32,0x7a,0x35,0x33,0x6c,0xee,0x41, +0x6b,0x12,0x22,0xcd,0x7e,0x60,0x2, 0x12,0x1e,0x85,0x60,0x43,0xe5,0x36,0x1a,0x3e, +0x12,0x1e,0x7c,0x60,0x3a,0x1a,0x3e,0x3e,0x34,0x9, 0x43,0xc, 0x40,0x1e,0x40,0x7e, +0x50,0xc, 0xac,0x45,0x9, 0x33,0xc, 0x41,0x1e,0x30,0xa, 0x13,0x2d,0x21,0x3e,0x24, +0x2d,0x26,0xb, 0x28,0x10,0x7e,0x25,0x33,0x12,0x22,0xdc,0xbd,0x12,0x48,0x2, 0x41, +0x64,0xe5,0x35,0x19,0xb3,0xc, 0x40,0xe5,0x36,0x19,0xb3,0xc, 0x41,0x41,0x64,0x12, +0x22,0xcd,0x7e,0x60,0x6, 0x12,0x1e,0x85,0x70,0x2, 0x41,0x69,0xe5,0x36,0x1a,0x3e, +0x3e,0x34,0x9, 0x73,0xc, 0x41,0x7e,0x60,0x6, 0x12,0x1e,0x85,0x70,0x2, 0x41,0x69, +0x1a,0x2e,0x3e,0x24,0x9, 0x72,0xc, 0x40,0x1e,0x70,0xa, 0x47,0x7e,0x70,0x2, 0xac, +0x7f,0x9, 0x33,0x0, 0x3e,0x1e,0x30,0xa, 0x53,0x2d,0x54,0xf5,0x30,0x9, 0x52,0xc, +0x41,0x1e,0x50,0xa, 0x45,0x9, 0x73,0x0, 0x3f,0x1e,0x70,0xa, 0x57,0x2d,0x54,0xf5, +0x31,0x6d,0x33,0x80,0x2b,0x1a,0x3e,0xbe,0x35,0x27,0x68,0x1f,0xe5,0x30,0x7e,0x35, +0x27,0x12,0x22,0xd1,0x7e,0x60,0x2, 0x12,0x1e,0x85,0x60,0xf, 0xe5,0x31,0x7e,0x35, +0x27,0x12,0x1e,0x7c,0x60,0x5, 0x75,0x30,0xff,0x80,0x11,0x7e,0x35,0x27,0xb, 0x34, +0x7a,0x35,0x27,0xe5,0x2f,0xa, 0x3b,0xbe,0x35,0x27,0x18,0xc9,0xe5,0x30,0xbe,0xb0, +0xff,0x78,0x2, 0x41,0x69,0x1a,0x1e,0x3e,0x14,0x9, 0x1, 0xc, 0x40,0x1e,0x0, 0x7e, +0x10,0xc, 0xac,0x1, 0x9, 0x71,0xc, 0x41,0x1e,0x70,0xa, 0x37,0x2d,0x3, 0x3e,0x4, +0x2d,0x6, 0xb, 0x8, 0x20,0x7e,0x35,0x33,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0xbd, +0x23,0x8, 0x5, 0x7a,0x25,0x29,0x80,0x3, 0x7a,0x35,0x29,0x7e,0x35,0x29,0x7d,0x23, +0xe, 0x24,0xe, 0x24,0xe, 0x34,0x2d,0x32,0x7a,0x35,0x29,0xbe,0x34,0x0, 0x50,0x58, +0x7, 0x7e,0x34,0x0, 0x50,0x7a,0x35,0x29,0xe5,0x30,0x1a,0x1b,0xb, 0x14,0xe, 0x14, +0x7e,0x44,0x0, 0xc, 0xad,0x14,0x7e,0x71,0x31,0x1e,0x70,0xa, 0x37,0x12,0x22,0xd8, +0x7e,0x11,0x30,0xe, 0x10,0x1a,0x1, 0x7d,0x50,0xad,0x54,0x2d,0x35,0x12,0x22,0xe4, +0x7a,0x35,0x2b,0xe, 0x34,0x7a,0x35,0x2b,0xe5,0x31,0xa, 0x3b,0xb, 0x34,0xe, 0x34, +0x12,0x22,0xd8,0x7e,0x14,0x0, 0xc, 0xad,0x10,0x2d,0x31,0x12,0x22,0xe4,0x7a,0x35, +0x2d,0xe, 0x34,0x7a,0x35,0x2d,0x2e,0x35,0x2b,0xe, 0x34,0xbe,0x35,0x29,0x48,0x19, +0xe5,0x30,0x1a,0x3e,0x3e,0x34,0x19,0xb3,0xc, 0x40,0xe5,0x31,0x1a,0x3e,0x3e,0x34, +0x19,0xb3,0xc, 0x41,0x7e,0xe0,0xff,0x80,0xa, 0xb, 0xe0,0xe5,0x2f,0xbc,0xbe,0x8, +0x2, 0x1, 0xc1,0xe5,0x2f,0xbc,0xbe,0x78,0x16,0x7e,0xa1,0x35,0x7e,0x71,0x2f,0x74, +0x2, 0xac,0x7b,0x19,0xa3,0xc, 0x40,0xe5,0x36,0x19,0xb3,0xc, 0x41,0x5, 0x2f,0xb, +0xf0,0xe5,0x32,0xbc,0xbf,0x28,0x2, 0x1, 0x9b,0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x24, +0x6c,0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x9, 0x75,0xc, 0x40,0x19,0x75,0x0, 0x3e, +0x74,0x2, 0xac,0xbf,0x9, 0x75,0xc, 0x41,0x19,0x75,0x0, 0x3f,0xb, 0xf0,0xe5,0x2f, +0xbc,0xbf,0x38,0xe0,0xe5,0x2f,0x7a,0xb3,0x0, 0x7f,0xda,0x3b,0x22,0xe5,0x35,0x1a, +0x3e,0x3e,0x34,0x9, 0x73,0xc, 0x40,0x22,0x7d,0x21,0x2d,0x23,0x3e,0x24,0x2d,0x26, +0xb, 0x28,0x20,0x22,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d,0x32,0x22,0xca,0x3b, +0x6d,0x33,0x7a,0x35,0x27,0x75,0x2b,0x0, 0x75,0x2c,0x0, 0x7e,0x23,0x0, 0x7f,0x7a, +0x21,0x29,0x7e,0x34,0x8, 0x82,0x7a,0x37,0xc, 0x40,0x7e,0x30,0x2, 0xac,0x23,0x7e, +0x24,0x0, 0x3e,0x7e,0x34,0xc, 0x42,0x12,0x3, 0x6e,0xe5,0x29,0xbe,0xb0,0x5, 0x38, +0x2, 0x81,0xa1,0x75,0x2a,0x0, 0x6c,0xff,0x61,0xd8,0x7e,0x34,0x3, 0xff,0x7a,0x35, +0x2d,0x75,0x2c,0xff,0x6c,0xee,0x80,0x52,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xc, +0x42,0xbe,0xb0,0xff,0x68,0x42,0x9, 0x73,0xc, 0x43,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0xb, 0xec,0xa, 0x37,0x12,0x27,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xc, +0x42,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0xb, 0xeb,0xa, 0x37,0x9d,0x32,0x12, +0x0, 0x2e,0x2d,0x36,0x7a,0x35,0x2f,0x7e,0x35,0x2d,0xbe,0x35,0x2f,0x28,0x9, 0x7e, +0x35,0x2f,0x7a,0x35,0x2d,0x7a,0xe1,0x2c,0xb, 0xe0,0xe5,0x29,0xbc,0xbe,0x38,0xa8, +0xe5,0x2c,0xbe,0xb0,0xff,0x68,0x3f,0x7e,0x71,0x2c,0x74,0x2, 0xac,0x7b,0x9, 0x33, +0xc, 0x42,0x7c,0x43,0x1e,0x40,0x7e,0x50,0xc, 0xac,0x45,0x9, 0xa3,0xc, 0x43,0x7c, +0x2a,0x1e,0x20,0xa, 0x2, 0x2d,0x20,0x12,0x27,0x23,0xbe,0x24,0x0, 0x50,0x48,0x16, +0xe5,0x2a,0x1a,0x2b,0x3e,0x24,0x19,0x32,0xc, 0x60,0x19,0xa2,0xc, 0x61,0x74,0xff, +0x19,0xb3,0xc, 0x42,0x5, 0x2a,0xb, 0xf0,0xe5,0x1b,0xbc,0xbf,0x28,0x2, 0x61,0x2a, +0x7e,0xf1,0x2a,0x81,0x88,0x6d,0x33,0x7a,0x35,0x27,0x7e,0xa0,0xff,0x6c,0xee,0x80, +0x6c,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0xc, 0x42,0xbe,0x40,0xff,0x68,0x5c,0x1e, +0x40,0x7e,0x50,0xc, 0xac,0x45,0x9, 0xb4,0xc, 0x43,0x1e,0xb0,0xa, 0x3b,0x2d,0x23, +0x3e,0x24,0x2e,0x27,0xc, 0x40,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d, +0x33,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0xc, 0x42,0x7c,0x76,0x1e, +0x70,0x7e,0x30,0xc, 0xac,0x37,0x9, 0x72,0xc, 0x43,0x7c,0xb7,0x1e,0xb0,0xa, 0xb, +0x2d,0x10,0x3e,0x14,0x2e,0x17,0xc, 0x40,0xb, 0x18,0x40,0xbe,0x45,0x27,0x48,0xb, +0x7a,0x61,0x2b,0x7a,0x71,0x2c,0x7a,0x45,0x27,0x7c,0xae,0xb, 0xe0,0xe5,0x29,0xbc, +0xbe,0x38,0x8e,0xbe,0xa0,0xff,0x68,0x1e,0x7e,0x71,0x2b,0x7e,0x90,0x2, 0xac,0x9f, +0x19,0x74,0xc, 0x60,0xe5,0x2c,0x19,0xb4,0xc, 0x61,0x7e,0x70,0xff,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0xc, 0x42,0xb, 0xf0,0xbe,0xf0,0x5, 0x50,0x2, 0x61,0xe5,0x7e, +0x24,0xc, 0x60,0x7e,0x34,0xc, 0x42,0x7e,0x14,0x0, 0x1e,0x12,0x3, 0x6e,0x75,0x29, +0x5, 0x7e,0x34,0xb, 0xeb,0x12,0x24,0xdf,0xe5,0x29,0xbe,0xb0,0x0, 0x28,0x1c,0x12, +0x24,0xd7,0x7e,0x24,0xc, 0x42,0x7e,0x34,0x0, 0x3e,0x12,0x3, 0x6e,0x12,0x24,0xd7, +0x7e,0x24,0xc, 0x42,0x7e,0x34,0xb, 0xeb,0x12,0x3, 0x6e,0x85,0x29,0x1b,0xe5,0x29, +0x7a,0xb3,0x0, 0x7f,0xda,0x3b,0x22,0x7e,0x31,0x29,0x74,0x2, 0xac,0x3b,0x22,0x7e, +0x24,0x0, 0xa, 0x74,0xff,0x2, 0x0, 0x46,0xca,0x3b,0x6c,0xdd,0x7e,0xa0,0xff,0x7e, +0x70,0x7, 0xac,0x7d,0x19,0xa3,0x6, 0x26,0x7c,0x1d,0x2e,0x10,0x27,0xe4,0xa5,0xf7, +0xb, 0xd0,0xbe,0xd0,0x5, 0x78,0xe5,0x7e,0xc3,0x6, 0x63,0x4c,0xcc,0x78,0x18,0x7e, +0xb3,0x6, 0x64,0x70,0x2, 0xc1,0x91,0x7e,0x34,0x6, 0x4f,0x12,0x24,0xdf,0x7e,0x34, +0x6, 0x59,0x12,0x24,0xdf,0xc1,0x91,0x7e,0xb3,0x6, 0x64,0x70,0x1f,0xbe,0xc0,0x1, +0x78,0x1a,0x7e,0x37,0x6, 0x22,0x7a,0x37,0x6, 0x4f,0x7e,0x37,0x6, 0x24,0x7a,0x37, +0x6, 0x59,0x75,0x27,0x1, 0xe4,0x7a,0xb3,0x6, 0x26,0xc1,0x91,0x6c,0xdd,0x7e,0x34, +0xff,0xff,0x7e,0x50,0x2, 0xac,0x5d,0x59,0x32,0xc, 0x54,0x7c,0xbd,0x7c,0xad,0x20, +0xe0,0xb, 0x1e,0xa0,0x74,0x2, 0xa4,0x49,0x35,0x6, 0x4f,0x80,0x9, 0x1e,0xa0,0x74, +0x2, 0xa4,0x49,0x35,0x6, 0x59,0x59,0x32,0xc, 0x40,0xb, 0xd0,0xbe,0xd0,0xa, 0x78, +0xcd,0x6c,0xdd,0x80,0x25,0x7c,0xbd,0x7c,0xad,0x20,0xe0,0xb, 0x1e,0xa0,0x74,0x7, +0xa4,0x49,0x35,0x6, 0x22,0x80,0x9, 0x1e,0xa0,0x74,0x7, 0xa4,0x49,0x35,0x6, 0x24, +0x74,0x2, 0xac,0xbd,0x59,0x35,0xc, 0x54,0xb, 0xd0,0x7e,0x73,0x6, 0x63,0xa, 0x27, +0x3e,0x24,0xa, 0x3d,0xbd,0x32,0x40,0xcd,0x7e,0x34,0xc, 0x40,0x7c,0xb7,0xf5,0xb9, +0xa, 0x56,0xf5,0xba,0x7e,0x34,0xc, 0x54,0x7c,0xb7,0xf5,0xbb,0xa, 0x56,0xf5,0xbc, +0x75,0xc3,0x5, 0x75,0xc2,0x2b,0x80,0x3, 0x75,0xc2,0xb, 0x0, 0x0, 0x0, 0x0, 0xe5, +0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x1b,0xe5,0xc6, +0xa, 0xb, 0x7c,0x1, 0x6c,0x11,0x4d,0x10,0x6c,0xdd,0x74,0x3, 0xac,0xbd,0x7d,0x31, +0x60,0x5, 0x1e,0x34,0x14,0x78,0xfb,0x5e,0x34,0x0, 0x7, 0xa, 0x57,0x1b,0x54,0x7c, +0xab,0x7e,0xb3,0x6, 0x63,0xbc,0xba,0x28,0x4c,0x7e,0x10,0x2, 0xac,0x1d,0x12,0x27, +0x12,0x78,0x19,0x6c,0xff,0x7e,0x10,0x2, 0xac,0x1f,0x12,0x27,0x12,0x78,0x4, 0x7c, +0xef,0x80,0xb, 0xb, 0xf0,0xbe,0xf0,0x5, 0x40,0xeb,0x80,0x2, 0x7c,0xed,0x7e,0x50, +0x7, 0xac,0x5a,0x19,0xe2,0x6, 0x26,0x7c,0x1e,0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7, +0x49,0x2, 0x6, 0x22,0x7e,0x70,0x2, 0xac,0x7e,0x59,0x3, 0x6, 0x4f,0x49,0x2, 0x6, +0x24,0x59,0x3, 0x6, 0x59,0xb, 0xd0,0xbe,0xd0,0x5, 0x78,0x8e,0x6c,0xdd,0x12,0x27, +0xa, 0xbe,0xb0,0x1, 0x68,0x14,0x7e,0x44,0xff,0xff,0x74,0x2, 0xac,0xbd,0x59,0x45, +0x6, 0x4f,0x7e,0x34,0xff,0xff,0x59,0x35,0x6, 0x59,0xb, 0xd0,0xbe,0xd0,0x5, 0x78, +0xdd,0x7e,0xf3,0x6, 0x63,0x6c,0xdd,0x12,0x27,0xa, 0xb4,0x1, 0x2d,0xa, 0x3d,0x9, +0xb3,0x6, 0x4a,0xb4,0x1, 0x8, 0x74,0x3, 0xa, 0x3d,0x19,0xb3,0x6, 0x4a,0xa, 0x3d, +0x9, 0xa3,0x6, 0x4a,0xbe,0xa0,0x3, 0x78,0x9, 0xe4,0xa, 0x4d,0x19,0xb4,0x6, 0x45, +0x80,0x32,0x4c,0xaa,0x78,0x2e,0x74,0x2, 0x80,0x24,0xa, 0x3d,0x9, 0xb3,0x6, 0x4a, +0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x15,0x74,0x1, 0xa, 0x3d,0x19,0xb3,0x6, 0x45,0x7c, +0xaf,0xb, 0xf0,0x74,0x7, 0xa4,0x19,0xd5,0x6, 0x26,0x80,0x8, 0x74,0x3, 0xa, 0x3d, +0x19,0xb3,0x6, 0x45,0xa, 0x3d,0x9, 0x73,0x6, 0x45,0xa, 0x2d,0x19,0x72,0x6, 0x4a, +0xb, 0xd0,0xbe,0xd0,0x5, 0x40,0x90,0xda,0x3b,0x22,0x7c,0x1d,0x2e,0x10,0x27,0xa5, +0xe7,0x22,0x49,0x0, 0x6, 0x4f,0xbe,0x4, 0xff,0xff,0x22,0x9d,0x32,0x12,0x0, 0x2e, +0x7d,0x63,0x22,0x3e,0x24,0x2e,0x27,0xc, 0x40,0xb, 0x28,0x20,0x22,0xbe,0x34,0x0, +0xa, 0x40,0x6, 0x9e,0x34,0x0, 0xa, 0x80,0x2, 0x6d,0x33,0x6d,0x22,0x7e,0x14,0xff, +0x0, 0x7e,0x4, 0x0, 0x4, 0x12,0x0, 0x98,0x7e,0x14,0x4, 0xeb,0x12,0x0, 0xb2,0x12, +0x1f,0xad,0xbe,0x18,0x5, 0x8c,0x40,0x4, 0x7e,0x18,0x5, 0x8b,0x22,0x6c,0xaa,0x80, +0x16,0x7e,0x30,0x7, 0xac,0x3a,0x49,0x31,0x0, 0x5c,0x49,0x21,0x0, 0x5e,0x2e,0x14, +0x0, 0x5c,0x12,0x2d,0x96,0xb, 0xa0,0x7e,0xb3,0x0, 0x7f,0xbc,0xba,0x38,0xe2,0x22, +0xca,0x3b,0x7e,0xb3,0x0, 0x7f,0xf5,0x28,0x7e,0x67,0x6, 0x67,0x7e,0xb3,0xa, 0xa7, +0xf5,0x2d,0x7e,0xb3,0xa, 0xa8,0xf5,0x2e,0x15,0x2d,0x7e,0x24,0xa, 0x62,0x7e,0x34, +0xc, 0x40,0x12,0x2b,0xd5,0xe5,0x28,0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x28,0x9f,0x6c, +0xff,0x6c,0xee,0x2, 0x28,0x92,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x0, 0x3e,0x1e, +0xb0,0xf5,0x29,0x9, 0xb3,0x0, 0x3f,0x1e,0xb0,0xf5,0x2a,0x74,0x2, 0x12,0x2b,0xc4, +0x7e,0x51,0x2a,0x74,0x2, 0xac,0x5b,0x7e,0x71,0x29,0x12,0x34,0x4a,0x49,0x33,0x8, +0x82,0xbd,0x36,0x50,0x3, 0x2, 0x28,0x8b,0xe5,0x29,0xbe,0xb0,0x1, 0x28,0x23,0xe5, +0x2d,0xa, 0x2b,0x1b,0x25,0xe5,0x29,0xa, 0x3b,0xbd,0x32,0x58,0x15,0xe5,0x2a,0xbe, +0xb0,0x1, 0x28,0xe, 0xe5,0x2e,0xa, 0x2b,0x1b,0x25,0xe5,0x2a,0xa, 0x3b,0xbd,0x32, +0x48,0x5, 0x74,0x1, 0x12,0x2b,0xc4,0x75,0x27,0x0, 0x80,0x3a,0xbe,0xe1,0x27,0x68, +0x33,0x7e,0xa1,0x27,0x12,0x2b,0xdc,0x7a,0x71,0x2b,0x9, 0xb5,0x0, 0x3f,0x1e,0xb0, +0xf5,0x2c,0xe5,0x29,0x7e,0x60,0x3, 0x12,0x1e,0x85,0xbe,0xb0,0x1, 0x68,0xe, 0xe5, +0x2a,0x7e,0x71,0x2c,0x7e,0x60,0x3, 0x12,0x1e,0x85,0xb4,0x1, 0x7, 0x74,0x1, 0x12, +0x2b,0xc4,0x80,0x9, 0x5, 0x27,0xe5,0x28,0xbe,0xb1,0x27,0x38,0xbf,0x7a,0xe3,0x1, +0xa7,0x7a,0xf3,0x1, 0xa8,0xe5,0x29,0xbe,0xb0,0x14,0x50,0xc, 0x7e,0x34,0xa, 0x62, +0x7e,0x24,0x0, 0x18,0xe4,0x12,0x0, 0x46,0x12,0x2d,0x85,0x12,0x28,0xa2,0x7e,0x24, +0xc, 0x40,0x7e,0x34,0xa, 0x62,0x12,0x2b,0xd5,0xb, 0xf0,0xbe,0xf0,0x5, 0x50,0xb, +0xb, 0xe0,0xe5,0x28,0xbc,0xbe,0x28,0x3, 0x2, 0x27,0xb6,0x7a,0xf3,0x0, 0x7f,0xda, +0x3b,0x22,0xca,0x3b,0x7d,0xd0,0x7d,0xc1,0x7d,0x93,0x6c,0xaa,0x6c,0x77,0x6d,0x88, +0x7a,0x87,0xc, 0x58,0x7a,0x87,0xc, 0x5a,0x7e,0xa4,0x0, 0x1, 0x9, 0x6d,0x1, 0x69, +0x9, 0xbd,0x1, 0x6a,0xf5,0x2f,0xa, 0x46,0x2d,0x4d,0x9, 0x34,0x1, 0x5a,0x49,0x4c, +0x0, 0x13,0x7d,0x9, 0x2e,0x4, 0x1, 0xf8,0x7d,0xb9,0x2e,0xb4,0x3, 0xf0,0x6c,0x22, +0x7e,0xf0,0x7, 0xac,0xfb,0x7d,0x87,0x2d,0x8d,0x19,0x28,0x0, 0x23,0xe4,0x7d,0x87, +0x2d,0x8d,0x19,0xb8,0x0, 0x24,0x7e,0xf0,0x2, 0xac,0xf6,0x7d,0x87,0x2d,0x8d,0x7e, +0x89,0x20,0x1e,0x20,0x7e,0xd0,0xc, 0xac,0xd2,0x9, 0x28,0x0, 0x1, 0x1e,0x20,0xa, +0x82,0x2d,0x86,0x7a,0xb3,0xc, 0x68,0x3e,0x84,0x2d,0x80,0xb, 0x88,0x60,0xb, 0xc8, +0x80,0xbd,0x68,0x48,0x6, 0x74,0x1, 0x7a,0xb3,0xc, 0x68,0x7d,0xa9,0x2e,0xa4,0x1, +0xf8,0x7d,0x6a,0xa, 0x6c,0x7c,0xbd,0xf5,0xba,0x7d,0x6a,0x7c,0xbd,0xf5,0xb9,0x7d, +0x97,0x2d,0x9d,0x12,0x2b,0xb9,0xbd,0x89,0x40,0x15,0x12,0x2b,0xaf,0x9, 0x79,0x0, +0x1, 0x1e,0x70,0xa, 0x97,0xa, 0x83,0x9d,0x98,0x7d,0x79,0x7c,0x7f,0x80,0x2, 0x6c, +0x77,0x7a,0x71,0xbb,0x12,0x2b,0xaf,0x7e,0x99,0x20,0x12,0x2b,0xbd,0xbd,0x89,0x40, +0xa, 0xa, 0x93,0x7d,0x58,0x9d,0x59,0x7c,0xab,0x80,0x2, 0x6c,0xaa,0x1a,0x9a,0x3e, +0x94,0x3e,0x94,0x3e,0x94,0x3e,0x94,0x7d,0x79,0x7c,0x2f,0x7c,0xb2,0x42,0xbb,0x7c, +0xba,0xe, 0xb0,0xe, 0xb0,0xe, 0xb0,0xe, 0xb0,0xf5,0xbc,0x9, 0x2c,0x0, 0x22,0xa, +0x92,0x3e,0x94,0x3e,0x94,0x5e,0x94,0x0, 0xf0,0x7d,0x79,0x7c,0x2f,0x7c,0xb2,0x42, +0xbc,0x75,0xc3,0x0, 0x12,0x2b,0xaf,0x12,0x2b,0xb9,0x2d,0x98,0x9, 0x22,0x0, 0x1, +0xa, 0x82,0xbd,0x98,0x50,0x2, 0x80,0x4, 0xa, 0x92,0x1b,0x94,0x7d,0x79,0x7c,0xbf, +0xf5,0x31,0x9, 0x22,0x0, 0x2f,0x7c,0xb2,0xc4,0x33,0x54,0xe0,0x7c,0x2b,0xe5,0x31, +0x9c,0xb7,0x4, 0x4c,0xb2,0xf5,0xc3,0x12,0x2b,0xaf,0x7e,0x99,0x20,0x12,0x2b,0xbd, +0x2d,0x98,0x7e,0x29,0x20,0xa, 0x82,0xbd,0x98,0x50,0x4, 0x7d,0x79,0x80,0x6, 0xa, +0xa2,0x1b,0xa4,0x7d,0x7a,0x7c,0xbf,0xf5,0x30,0x1a,0x9a,0xe5,0x30,0x1a,0xab,0x9d, +0xa9,0xb, 0xa4,0x7d,0x7a,0x7c,0xbf,0xf5,0xc4,0x7e,0xa4,0xc, 0x69,0x7d,0x7a,0xa, +0x7e,0x7c,0xbf,0xf5,0xc1,0x7d,0x7a,0x7c,0xbf,0xf5,0xbd,0x75,0xc2,0x7, 0x80,0x3, +0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x7e, +0x7f,0xc, 0x71,0x7a,0x7f,0xc, 0x64,0x7e,0x7f,0xc, 0x75,0x7a,0x7f,0xc, 0x5c,0x7e, +0x7f,0xc, 0x6d,0x7a,0x7f,0xc, 0x60,0x7e,0x7f,0xc, 0x69,0x74,0x2, 0xac,0xb6,0x2d, +0x5d,0x7e,0x59,0xa0,0x1e,0xa0,0x9c,0xa3,0x61,0x7, 0x12,0x2b,0xcb,0x9, 0x7a,0x0, +0x1, 0x1e,0x70,0x9c,0x73,0x80,0x79,0xbe,0xa0,0x0, 0x48,0x72,0x7e,0x29,0x20,0xbc, +0x2a,0x8, 0x6b,0xbe,0x70,0x0, 0x48,0x66,0x9, 0x22,0x0, 0x1, 0xbc,0x27,0x8, 0x5e, +0x1a,0x8a,0x7e,0x94,0x0, 0xc, 0xad,0x98,0x1a,0xa7,0x2d,0xa9,0x7d,0x9a,0x3e,0x94, +0x2d,0x90,0xb, 0x98,0x90,0xbd,0x94,0x48,0x16,0x7e,0xf1,0x2f,0x74,0x7, 0xac,0xfb, +0x7d,0x97,0x2d,0x9d,0x2e,0x94,0x0, 0x24,0x7e,0x99,0xb0,0x4, 0x7a,0x99,0xb0,0x7e, +0xb3,0xc, 0x68,0xb4,0x1, 0x28,0x7d,0x9a,0x5e,0x94,0x0, 0x7, 0x2e,0x94,0x3, 0xba, +0x7d,0x79,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x64,0xff,0x7d,0x9a,0x1e,0x94, +0x1e,0x94,0x1e,0x94,0x2d,0x9b,0x7e,0x99,0x20,0x5c,0x2b,0x7a,0x99,0x20,0xb, 0x70, +0x12,0x2b,0xaf,0x9, 0xb9,0x0, 0x1, 0x1e,0xb0,0x2c,0xb3,0x1a,0x8b,0x1a,0x97,0xbd, +0x98,0x18,0x2, 0x41,0x77,0xb, 0xa0,0x12,0x2b,0xcb,0x7e,0xa9,0xb0,0x1e,0xb0,0x2c, +0xb3,0x1a,0x9b,0x1a,0xaa,0xbd,0xa9,0x18,0x2, 0x41,0x6a,0x74,0x6, 0x7e,0x1f,0xc, +0x5c,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1f,0xc, 0x5c,0x7e,0xf, 0xc, 0x64,0x7e,0x1f, +0xc, 0x5c,0x12,0x0, 0xb4,0x7d,0xb3,0x2e,0xb4,0x0, 0x20,0x7a,0xb7,0xc, 0x58,0x74, +0x6, 0x7e,0x1f,0xc, 0x60,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1f,0xc, 0x60,0x7f,0x7, +0x12,0x0, 0xb4,0x7d,0x23,0x2e,0x24,0x0, 0x20,0x7a,0x27,0xc, 0x5a,0x7e,0x71,0x2f, +0x74,0x7, 0xac,0x7b,0x7d,0xa3,0x2d,0xad,0x59,0xba,0x0, 0x1e,0x7d,0x13,0x2d,0x1d, +0x59,0x21,0x0, 0x20,0x9, 0xbc,0x0, 0x12,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, +0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, +0x7f,0x7d,0x2f,0x7d,0xc3,0x2d,0xcd,0x19,0x5c,0x0, 0x23,0x2d,0x3d,0x9, 0x53,0x0, +0x24,0xbe,0x50,0xf, 0x28,0x6, 0x74,0xf, 0x19,0xb3,0x0, 0x24,0xda,0x3b,0x22,0x7e, +0xf0,0x2, 0xac,0xf6,0x7d,0x97,0x2d,0x9d,0x22,0x9, 0x29,0x0, 0x1, 0x1e,0x20,0xa, +0x82,0xa, 0x93,0x22,0xa, 0x3e,0x19,0xb3,0x1, 0x98,0x22,0x7e,0xf0,0x2, 0xac,0xf6, +0x7d,0xa7,0x2d,0xad,0x22,0x7e,0x14,0x0, 0x18,0x2, 0x3, 0x6e,0x74,0x2, 0xa4,0x9, +0x75,0x0, 0x3e,0x1e,0x70,0x22,0xca,0x3b,0x75,0x29,0x0, 0x75,0x27,0x0, 0x12,0x2d, +0x6c,0x9, 0xb6,0x0, 0x7, 0xb4,0x3, 0x8, 0xe4,0x19,0xb6,0x0, 0x7, 0x75,0x29,0x1, +0x5, 0x27,0xe5,0x27,0xb4,0xf, 0xe7,0x75,0x27,0x0, 0xe5,0x27,0xbe,0xb0,0xf, 0x50, +0x5, 0x12,0x2d,0x6c,0x80,0x62,0x12,0x2d,0x6c,0x9, 0xb6,0x0, 0x7, 0xb4,0x2, 0x58, +0x75,0x28,0x0, 0x80,0x4a,0x7e,0xa1,0x28,0x12,0x2b,0xdc,0xa, 0x37,0x9, 0x56,0x0, +0x1, 0xa, 0x25,0x9d,0x32,0x12,0x0, 0x2e,0x7c,0xe7,0x7e,0xa1,0x28,0x74,0x2, 0xa4, +0x9, 0x75,0x0, 0x3f,0x1e,0x70,0xa, 0x37,0x9, 0x56,0x0, 0x2, 0xa, 0x25,0x9d,0x32, +0x12,0x0, 0x2e,0x7c,0xf7,0xbe,0xe0,0x2, 0x18,0x13,0xbe,0xf0,0x2, 0x18,0xe, 0xe4, +0x19,0xb6,0x0, 0x7, 0x7e,0x34,0x1, 0x73,0x12,0x2d,0x78,0x80,0xb, 0x5, 0x28,0x7e, +0x73,0x0, 0x7f,0xbe,0x71,0x28,0x38,0xad,0x9, 0xb6,0x0, 0x7, 0xb4,0x2, 0x2, 0x80, +0x2, 0xa1,0x5e,0xe5,0x27,0xbe,0xb0,0xf, 0x50,0x6, 0x7e,0x34,0x1, 0x72,0x80,0x4, +0x7e,0x34,0x1, 0x73,0x12,0x2d,0x78,0xe4,0x19,0xb6,0x0, 0x7, 0xe5,0x29,0xbe,0xb0, +0x1, 0x78,0x2, 0xa1,0x5e,0x9, 0x76,0x0, 0x2, 0x1a,0x37,0x1b,0x35,0x7c,0xe7,0xa1, +0x4e,0x9, 0x76,0x0, 0x1, 0x1a,0x37,0x1b,0x35,0x7c,0xf7,0x80,0x7f,0xbe,0xe0,0x0, +0x48,0x78,0xbe,0xe0,0x15,0x58,0x73,0xbe,0xf0,0x0, 0x48,0x6e,0xbe,0xf0,0xc, 0x58, +0x69,0x1a,0x5f,0x7d,0x15,0x3e,0x14,0x1a,0xe, 0x7e,0x34,0x0, 0x18,0xad,0x30,0x7d, +0x23,0x2d,0x21,0x49,0x32,0x8, 0x82,0xbe,0x34,0x0, 0x0, 0x8, 0x1a,0x7e,0x14,0x0, +0xc, 0xad,0x10,0x7d,0x1, 0x2d,0x5, 0x3e,0x4, 0x2e,0x4, 0x6, 0x8a,0xb, 0x8, 0x10, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x1f,0x12,0x0, 0x2e,0x7d,0x13,0x1a,0x2e,0x7e,0x34, +0x0, 0xc, 0xad,0x32,0x1a,0x2f,0x2d,0x23,0x3e,0x24,0x2e,0x24,0x6, 0x8a,0xb, 0x28, +0x30,0x9d,0x31,0x1b,0x28,0x30,0x6d,0x33,0x1a,0x2f,0x3e,0x24,0x1a,0xe, 0x7e,0x14, +0x0, 0x18,0xad,0x10,0x2d,0x21,0x59,0x32,0x8, 0x82,0xb, 0xf0,0x9, 0x76,0x0, 0x1, +0xa, 0x27,0xb, 0x25,0x1a,0x3f,0xbd,0x32,0x18,0x2, 0x81,0xbd,0xb, 0xe0,0x9, 0x76, +0x0, 0x2, 0xa, 0x27,0xb, 0x25,0x1a,0x3e,0xbd,0x32,0x18,0x2, 0x81,0xb1,0x5, 0x27, +0xe5,0x27,0xbe,0xb0,0x1e,0x50,0x2, 0x81,0xa, 0xda,0x3b,0x22,0x7e,0xd1,0x27,0x74, +0x8, 0xac,0xdb,0x2e,0x64,0x0, 0x82,0x22,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x4, +0x14,0x7a,0x39,0xb0,0x22,0x7e,0x34,0x6, 0x8a,0x7e,0x24,0xa, 0xa7,0x7e,0x14,0x6, +0x67,0x7e,0x4, 0x0, 0x3e,0x22,0x7d,0x1, 0x7d,0x12,0x7d,0x23,0xbe,0x24,0x0, 0x0, +0x50,0x2, 0x6d,0x22,0xbe,0x14,0x0, 0x0, 0x50,0x2, 0x6d,0x11,0xbe,0x24,0x0, 0x3f, +0x38,0xd, 0x7d,0x32,0x12,0x2e,0x19,0x58,0x2, 0x6d,0x33,0x7d,0x23,0x80,0x1a,0xbe, +0x24,0x2, 0xc0,0x40,0x14,0x7d,0x32,0x9e,0x34,0x2, 0xc0,0x2d,0x32,0xbe,0x34,0x2, +0xfd,0x8, 0x4, 0x7e,0x34,0x2, 0xff,0x7d,0x23,0xbe,0x14,0x0, 0x3f,0x38,0xd, 0x7d, +0x31,0x12,0x2e,0x19,0x58,0x2, 0x6d,0x33,0x7d,0x13,0x80,0x20,0xbe,0x14,0x4, 0xc0, +0x40,0x1a,0xbe,0x14,0x4, 0xff,0x38,0x14,0x7d,0x31,0x9e,0x34,0x4, 0xc0,0x2d,0x31, +0xbe,0x34,0x4, 0xfd,0x8, 0x4, 0x7e,0x34,0x4, 0xff,0x7d,0x13,0x1b,0x8, 0x20,0x7d, +0x20,0xb, 0x25,0x7d,0x2, 0x1b,0x28,0x10,0x22,0x3e,0x34,0x9e,0x34,0x0, 0x3f,0xbe, +0x34,0x0, 0x2, 0x22,0x2, 0x2e,0x27,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x22,0xca, +0x3b,0x7d,0x71,0x7a,0x25,0x27,0x7d,0x63,0x7e,0x34,0xc, 0x40,0x7d,0x27,0x2e,0x24, +0x0, 0x8, 0x7e,0x14,0x0, 0x15,0x12,0x3, 0x6e,0x7e,0x34,0xc, 0x55,0x7d,0x27,0x2e, +0x24,0x0, 0x1d,0x7e,0x14,0x0, 0x15,0x12,0x3, 0x6e,0x7e,0x34,0xc, 0x6a,0x7d,0x27, +0x2e,0x24,0x0, 0x32,0x7e,0x14,0x0, 0x15,0x12,0x3, 0x6e,0x9, 0xb6,0x1, 0x10,0x70, +0x9, 0x7d,0x36,0x12,0x2f,0xc3,0x4, 0x7a,0x39,0xb0,0xe4,0x19,0xb6,0x1, 0x10,0x9, +0x66,0x0, 0x3d,0x9, 0x76,0x0, 0x43,0xbc,0x76,0x40,0x32,0x7d,0x36,0x2e,0x34,0x0, +0x40,0x12,0x2e,0x27,0x9, 0x76,0x0, 0x40,0xbe,0x70,0x8, 0x40,0x1b,0xe4,0x19,0xb6, +0x0, 0x40,0x9, 0xa6,0x0, 0x3e,0x9, 0xb6,0x0, 0x44,0xbc,0xba,0x50,0xa, 0x7d,0x36, +0x2e,0x34,0x0, 0x44,0x4, 0x7a,0x39,0xb0,0xe4,0x19,0xb6,0x0, 0x43,0x7e,0x35,0x27, +0x7e,0x39,0x70,0xa, 0x27,0x7d,0x32,0x12,0x1e,0xff,0x74,0x8, 0xac,0xb7,0x9d,0x25, +0x7c,0x65,0x19,0x76,0x1, 0xc, 0x9, 0xb6,0x0, 0x40,0xac,0xb7,0x7c,0x7b,0x19,0x76, +0x0, 0xd9,0x9, 0x76,0x0, 0x40,0xbc,0x76,0x7d,0x26,0x50,0x1f,0x2e,0x24,0x1, 0xc, +0x7e,0x29,0xb0,0x4, 0x7a,0x29,0xb0,0x9, 0x36,0x0, 0x40,0x7d,0x26,0x2e,0x24,0x0, +0xd9,0x7e,0x29,0x70,0x2c,0x73,0x7a,0x29,0x70,0x80,0xc, 0x2e,0x24,0x0, 0xd9,0x7e, +0x29,0xb0,0x2c,0xb6,0x7a,0x29,0xb0,0x9, 0x76,0x0, 0x43,0xa, 0x37,0x2d,0x36,0x9, +0x73,0x0, 0xc, 0xa, 0x37,0x2d,0x36,0x9, 0xa3,0x0, 0x2c,0x6c,0x66,0x80,0x7f,0x9, +0x76,0x0, 0xd9,0xa, 0x17,0xa, 0x26,0x2d,0x21,0xa, 0x45,0x2e,0x44,0xc, 0x40,0x7e, +0x49,0xb0,0x2c,0xba,0x7a,0x49,0xb0,0x7c,0x46,0x3e,0x40,0xa, 0xf5,0x2e,0xf5,0x27, +0x9, 0x3f,0x0, 0x4, 0xa, 0x4, 0x2d,0x7, 0x19,0x30,0x0, 0x47,0xa, 0x5, 0x9, 0xb0, +0xc, 0x40,0xa, 0x44,0x2d,0x47,0x19,0xb4,0x0, 0x8, 0xa, 0x45,0x9, 0x74,0xc, 0x55, +0xa, 0x44,0x2d,0x47,0x19,0x74,0x0, 0x1d,0xa, 0x45,0x9, 0x24,0xc, 0x6a,0xa, 0x4, +0x2d,0x7, 0x19,0x20,0x0, 0x32,0xa, 0x44,0x2d,0x47,0x19,0x34,0x0, 0x48,0xa, 0x44, +0x2d,0x47,0x19,0xb4,0x0, 0x9, 0xa, 0x14,0x2d,0x17,0x19,0x71,0x0, 0x1e,0xa, 0x15, +0x9, 0x71,0xc, 0x6a,0xa, 0x14,0x2d,0x17,0x19,0x71,0x0, 0x33,0xb, 0x60,0x9, 0x76, +0x1, 0xc, 0xbc,0x76,0x28,0x2, 0xe1,0x2f,0x3e,0x70,0x19,0x77,0x0, 0x5, 0xda,0x3b, +0x22,0x7d,0x30,0x2e,0x34,0x0, 0x43,0x7e,0x39,0xb0,0x22,0xca,0xd8,0xca,0x79,0x7e, +0xf0,0x1, 0x12,0x35,0xeb,0x7c,0xdb,0x12,0x37,0x61,0x7c,0xeb,0x12,0x4f,0x4f,0x78, +0x52,0x74,0x1, 0x7a,0xb3,0xa, 0x9d,0xbe,0xd0,0x2, 0x78,0xa, 0x74,0x6, 0x7a,0xb3, +0xa, 0x9d,0x6c,0xff,0x80,0x36,0x7e,0xb3,0x0, 0x7f,0x70,0x2a,0x7e,0xb3,0x1, 0x78, +0x70,0x24,0xe5,0xe, 0xb4,0x1, 0x2, 0x80,0xe, 0x7e,0xa3,0xc, 0xad,0xbe,0xa0,0x2, +0x40,0xf, 0xe4,0x7a,0xb3,0xc, 0xad,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0xa, 0xa4,0x80, +0x76,0x7c,0xba,0x4, 0x80,0x7, 0x74,0x4, 0x7a,0xb3,0xa, 0x9d,0xe4,0x7a,0xb3,0xc, +0xad,0x80,0x64,0xbe,0x34,0x0, 0x1, 0x78,0x2e,0xe4,0x7a,0xb3,0xa, 0x9d,0x4c,0xee, +0x68,0x6, 0x7e,0x34,0x0, 0x3, 0x80,0x4b,0xbe,0xd0,0x2, 0x78,0x3, 0xe4,0x80,0x39, +0x7e,0xb3,0x0, 0x7f,0x70,0xa, 0x7e,0xb3,0x1, 0x78,0x70,0x4, 0x74,0x1, 0x80,0x29, +0x12,0x30,0xa8,0x6c,0xff,0x80,0x30,0x7e,0x37,0xa, 0xa4,0xbe,0x34,0x0, 0x3, 0x78, +0x26,0xbe,0xd0,0x1, 0x78,0x5, 0x12,0x30,0xa8,0x6c,0xff,0x1b,0xe1,0x68,0x8, 0xb, +0xe0,0x78,0xc, 0x74,0x3, 0x80,0x2, 0x74,0x2, 0x7a,0xb3,0xa, 0x9d,0x80,0x8, 0x7e, +0x34,0x0, 0x1, 0x7a,0x37,0xa, 0xa4,0xbe,0xf0,0x1, 0x78,0x7, 0x12,0x33,0xf7,0x7a, +0xb3,0x1, 0x74,0xda,0x79,0xda,0xd8,0x22,0xca,0x3b,0x7e,0xa3,0x0, 0x7f,0x7e,0x53, +0x1, 0x78,0x6c,0x44,0x6c,0x33,0x7e,0xc3,0xb, 0x17,0x7e,0xb3,0x2, 0x82,0xf5,0x33, +0x7e,0xb3,0x2, 0xb7,0x70,0x7, 0xbe,0xc0,0x1, 0x78,0x2, 0x61,0xf4,0xbe,0xa0,0x0, +0x38,0x7, 0xbe,0x50,0x0, 0x38,0x2, 0x61,0xec,0xbe,0xc0,0x1, 0x78,0x8, 0x74,0x5, +0x7a,0xb3,0x1, 0x74,0x80,0x7, 0x7e,0x34,0x1, 0x74,0x12,0x2e,0x24,0x7e,0xb3,0x1, +0x74,0xb4,0x5, 0x2, 0x80,0x2, 0x61,0xf4,0xe4,0x7a,0xb3,0x1, 0x74,0x7e,0xb3,0x1, +0x72,0x60,0x2, 0x41,0x21,0x7e,0xb3,0x1, 0x73,0x60,0x2, 0x41,0x21,0xe4,0x7a,0xb3, +0x1, 0x75,0x7a,0xa3,0x1, 0x72,0x7a,0x53,0x1, 0x73,0x6c,0xdd,0x41,0x11,0xbc,0xad, +0x7e,0xf0,0x8, 0x28,0x19,0xac,0xf4,0x2e,0x74,0x0, 0x82,0x7e,0x70,0x2, 0xac,0x7d, +0x9, 0xb3,0x0, 0x3e,0x1e,0xb0,0xf5,0x2b,0x9, 0xb3,0x0, 0x3f,0x80,0x1a,0xac,0xf3, +0x2e,0x74,0x0, 0xfa,0xa, 0xa, 0xa, 0x3d,0x9d,0x30,0x3e,0x34,0x9, 0xb3,0x1, 0x79, +0x1e,0xb0,0xf5,0x2b,0x9, 0xb3,0x1, 0x7a,0x1e,0xb0,0xf5,0x2a,0xe5,0x2b,0x19,0xb7, +0x0, 0x2, 0xe5,0x2a,0x19,0xb7,0x0, 0x1, 0xe4,0x19,0xb7,0x0, 0x7, 0xbe,0xc0,0x1, +0x78,0x67,0x6c,0x22,0x80,0x34,0xe5,0x33,0xa, 0x3b,0xa, 0x2, 0x2d,0x3, 0x9, 0xb7, +0x0, 0x2, 0xa, 0x3b,0xbd,0x3, 0x78,0x20,0x74,0x1, 0x19,0xb7,0x0, 0x7, 0x9, 0x7, +0x0, 0x1, 0x7e,0x10,0x2, 0xac,0x1, 0x7e,0x70,0x18,0xac,0x72,0x2d,0x30,0x49,0x33, +0x1, 0xf2,0x59,0x37,0x0, 0x5, 0x80,0xa, 0xb, 0x20,0x7e,0xb3,0x2, 0xb5,0xbc,0xb2, +0x38,0xc4,0x7e,0xb3,0x2, 0xb5,0xbc,0xb2,0x38,0x13,0xbc,0xad,0x28,0x6, 0x7e,0x34, +0x1, 0x72,0x80,0x4, 0x7e,0x34,0x1, 0x73,0x12,0x2d,0x78,0x80,0x1c,0xbc,0xad,0x28, +0x4, 0xb, 0x40,0x80,0x14,0xb, 0x30,0x80,0x10,0xbc,0xad,0x28,0x4, 0xb, 0x40,0x80, +0x2, 0xb, 0x30,0x74,0x1, 0x19,0xb7,0x0, 0x7, 0x4c,0xcc,0x78,0x16,0x7e,0x11,0x2a, +0x74,0x2, 0xac,0x1b,0x7e,0x71,0x2b,0x74,0x18,0xac,0x7b,0x2d,0x30,0x49,0x33,0x8, +0x82,0x80,0x8, 0xe4,0x7a,0x79,0xb0,0xe5,0x33,0xa, 0x3b,0x59,0x37,0x0, 0x3, 0xb, +0xd0,0xa, 0x35,0xa, 0xa, 0x2d,0x3, 0xa, 0x3d,0xbd,0x30,0x50,0x2, 0x21,0x1e,0x61, +0xf4,0x7e,0x73,0x1, 0x73,0xa, 0x47,0x7e,0x73,0x1, 0x72,0xa, 0x57,0x2d,0x54,0xf5, +0x27,0x6c,0xdd,0x61,0x84,0x7e,0xa3,0x1, 0x72,0xbc,0xad,0x28,0x5, 0x12,0x34,0x23, +0x80,0x3, 0x12,0x34,0x2d,0x9, 0x77,0x0, 0x1, 0x7e,0x90,0x2, 0xac,0x97,0x9, 0xa7, +0x0, 0x2, 0x7e,0x50,0x18,0xac,0x5a,0x2d,0x24,0x49,0x22,0x8, 0x82,0x7a,0x25,0x28, +0x9, 0xb7,0x0, 0x7, 0x70,0x4, 0x15,0x27,0x61,0x82,0x4c,0xcc,0x68,0x2, 0x61,0x11, +0x75,0x2c,0x0, 0x75,0x30,0x0, 0x7a,0x71,0x31,0x7a,0xa1,0x32,0x75,0x2f,0x0, 0xe5, +0x32,0xbe,0xb1,0x2f,0x68,0x5b,0x7e,0x31,0x31,0x74,0x2, 0xac,0x3b,0x7e,0x11,0x2f, +0x74,0x18,0xac,0x1b,0x2d,0x1, 0x49,0x30,0x8, 0x82,0x7e,0x51,0x2f,0x74,0xc, 0xac, +0x5b,0xe5,0x31,0xa, 0xb, 0x2d,0x20,0x3e,0x24,0x49,0x22,0x6, 0x8a,0x2d,0x23,0x7e, +0x71,0x32,0x74,0x18,0xac,0x7b,0x2d,0x31,0x49,0x13,0x8, 0x82,0x7e,0x71,0x32,0x74, +0xc, 0xac,0x7b,0x2d,0x30,0x3e,0x34,0x49,0x33,0x6, 0x8a,0x2d,0x31,0x9d,0x32,0x7a, +0x35,0x2d,0x7e,0x73,0x1, 0x72,0xbc,0x7d,0x28,0x7, 0x12,0x34,0x9, 0x58,0x2, 0x5, +0x2c,0x5, 0x2f,0xe5,0x2f,0xb4,0x15,0x97,0xe5,0x2c,0xbe,0xb0,0xa, 0x40,0xb, 0x12, +0x34,0x1, 0x68,0x6, 0x74,0x3, 0x19,0xb7,0x0, 0x7, 0x49,0x27,0x0, 0x3, 0x7e,0x35, +0x28,0x12,0x34,0x1a,0xbe,0x34,0x0, 0x23,0x8, 0x78,0xe4,0x19,0xb7,0x0, 0x7, 0x80, +0x71,0x75,0x2c,0x0, 0x80,0x3f,0xe5,0x33,0xa, 0x3b,0xe5,0x2c,0xa, 0x2b,0x2d,0x23, +0x9, 0x77,0x0, 0x2, 0xbd,0x23,0x78,0x16,0x12,0x34,0x3e,0x12,0x34,0x11,0x12,0x34, +0x1a,0xbe,0x34,0x0, 0x23,0x8, 0x1c,0xe4,0x19,0xb7,0x0, 0x7, 0x80,0x15,0x12,0x34, +0x3e,0x12,0x34,0x11,0x9d,0x32,0x7a,0x35,0x2d,0x12,0x34,0x9, 0x58,0x5, 0x7d,0x37, +0x12,0x2e,0x24,0x5, 0x2c,0x7e,0x73,0x2, 0xb5,0xbe,0x71,0x2c,0x38,0xb8,0x49,0x27, +0x0, 0x3, 0xe5,0x33,0xa, 0x3b,0xbd,0x23,0x78,0x18,0x7e,0x79,0x70,0xbe,0x70,0xa, +0x28,0xb, 0x12,0x34,0x1, 0x68,0x6, 0x74,0x3, 0x19,0xb7,0x0, 0x7, 0x74,0x1, 0x7a, +0x79,0xb0,0xb, 0xd0,0x12,0x35,0xd8,0x50,0x2, 0x41,0x35,0xe5,0x27,0x70,0x5, 0x12, +0x33,0xf7,0x80,0x60,0x7e,0xb3,0x1, 0x75,0xf5,0x2f,0xbe,0xc0,0x1, 0x78,0x6, 0xe5, +0x2f,0x1e,0xb0,0xf5,0x2f,0xe5,0x2f,0xbe,0xb0,0x4, 0x40,0x37,0x6c,0xdd,0x80,0x2c, +0x7e,0xa3,0x1, 0x72,0xbc,0xad,0x28,0x12,0x12,0x34,0x23,0x9, 0xb7,0x0, 0x7, 0xb4, +0x1, 0x18,0x74,0x2, 0x19,0xb7,0x0, 0x7, 0x80,0x10,0x12,0x34,0x2d,0x9, 0xb7,0x0, +0x7, 0xb4,0x1, 0x6, 0x74,0x2, 0x19,0xb7,0x0, 0x7, 0xb, 0xd0,0x12,0x35,0xd8,0x40, +0xcf,0x80,0x11,0x7e,0x34,0x1, 0x75,0x12,0x2e,0x24,0x80,0x8, 0xe4,0x7a,0xb3,0x1, +0x75,0x12,0x33,0xf8,0xda,0x3b,0x22,0xe4,0x7a,0xb3,0x1, 0x72,0x7a,0xb3,0x1, 0x73, +0x22,0x7e,0xb3,0xa, 0x9d,0xbe,0xb0,0x6, 0x22,0x7e,0x37,0x6, 0x67,0xbe,0x35,0x2d, +0x22,0x49,0x23,0x1, 0xf2,0x49,0x37,0x0, 0x5, 0x22,0x9d,0x32,0x12,0x0, 0x2e,0x7a, +0x35,0x28,0x22,0x7e,0xf0,0x8, 0xac,0xfd,0x2e,0x74,0x0, 0x82,0x22,0xa, 0x3a,0xa, +0x7d,0x9d,0x73,0x3e,0x74,0x3e,0x74,0x3e,0x74,0x2e,0x74,0x0, 0xfa,0x22,0x9, 0x47, +0x0, 0x1, 0x7e,0x50,0x2, 0xac,0x45,0x7e,0x71,0x2c,0x74,0x18,0xac,0x7b,0x2d,0x32, +0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x29,0x7e,0x18,0x80,0x0, 0x7e,0x8, 0xc, 0x40, +0x74,0x10,0x12,0x1, 0x5a,0x7e,0xb3,0x0, 0x7f,0x70,0x2, 0xa1,0x26,0x7e,0xb3,0x3, +0xa5,0x60,0x2, 0xa1,0x26,0x7e,0xb3,0x0, 0x3e,0x1e,0xb0,0xf5,0x27,0x7e,0x73,0x0, +0x3f,0x1e,0x70,0x7a,0x71,0x28,0x6d,0x66,0x75,0x2b,0x0, 0x75,0x2c,0x0, 0xa, 0x37, +0x7d,0x73,0x80,0x31,0x7d,0x17,0x3e,0x14,0x12,0x35,0xc8,0x2d,0x21,0x49,0x12,0x8, +0x82,0xbe,0x14,0x0, 0x3c,0x8, 0x24,0x12,0x35,0xd0,0x28,0x8, 0x49,0x12,0x8, 0x6a, +0x2d,0x61,0x5, 0x2c,0xe5,0x27,0xbe,0xb0,0x14,0x50,0x8, 0x49,0x22,0x8, 0x9a,0x2d, +0x62,0x5, 0x2c,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc9,0x7d,0x73,0x80,0x30,0x7d, +0x27,0x3e,0x24,0x7e,0x71,0x27,0x12,0x34,0x4a,0x49,0x23,0x8, 0x82,0xbe,0x24,0x0, +0x3c,0x8, 0x28,0x12,0x35,0xd0,0x28,0x8, 0x49,0x23,0x8, 0x6a,0x2d,0x62,0x5, 0x2c, +0xe5,0x27,0xbe,0xb0,0x14,0x50,0x8, 0x49,0x33,0x8, 0x9a,0x2d,0x63,0x5, 0x2c,0x7d, +0x37,0xb, 0x34,0x7d,0x73,0xbe,0x34,0x0, 0xc, 0x48,0xc4,0xe5,0x2b,0xbe,0xb0,0x3, +0x50,0x2, 0x80,0x12,0x7d,0x36,0x12,0x0, 0x2e,0xe5,0x2c,0xa, 0x2b,0x12,0x0, 0x66, +0xbe,0x34,0x0, 0xf, 0x8, 0x6, 0x75,0x14,0x0, 0xe4,0xa1,0xbe,0x6d,0x33,0xe5,0x27, +0xbe,0xb0,0x0, 0x28,0xb, 0x12,0x35,0xc1,0x2d,0x21,0x49,0x22,0x8, 0x6a,0x2d,0x32, +0xe5,0x27,0xbe,0xb0,0x14,0x50,0xb, 0x12,0x35,0xc1,0x2d,0x21,0x49,0x22,0x8, 0x9a, +0x2d,0x32,0x7e,0xa0,0x8, 0x80,0x1b,0x7e,0x50,0x2, 0xac,0x5a,0x9, 0xb2,0xc, 0x40, +0x1a,0x1b,0xbd,0x13,0x8, 0xc, 0x9, 0xb2,0xc, 0x41,0x1a,0x2b,0x2e,0x25,0x29,0x7a, +0x25,0x29,0x7c,0x5a,0x1b,0xa0,0xa5,0xbd,0x0, 0xdd,0x7e,0x51,0x28,0x74,0x2, 0xac, +0x5b,0x7e,0x71,0x27,0x12,0x34,0x4a,0x49,0x33,0x8, 0x82,0x12,0x0, 0x2e,0xbe,0x34, +0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x29,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x29,0x7e,0x35, +0x29,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x29,0xe5,0x14, +0xa, 0x3b,0xbe,0x35,0x29,0x50,0x5, 0x7e,0x55,0x29,0xf5,0x14,0xe5,0x14,0xda,0x3b, +0x22,0x7e,0x31,0x28,0x74,0x2, 0xac,0x3b,0x7e,0x51,0x27,0x74,0x18,0xac,0x5b,0x22, +0x5, 0x2b,0xe5,0x27,0xbe,0xb0,0x0, 0x22,0x7e,0x73,0x1, 0x73,0xa, 0x37,0x7e,0x53, +0x1, 0x72,0xa, 0x25,0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x22,0xca,0x3b,0x7e,0xb3,0x6, +0x81,0xf5,0x27,0x7e,0xe3,0x6, 0x82,0x7e,0xa1,0xe, 0x7e,0xf3,0xa, 0xa7,0x7e,0xe4, +0x6, 0x8a,0x7e,0x44,0x8, 0x82,0x7e,0xf4,0x2, 0x9c,0x7e,0x34,0x2, 0x84,0x7e,0x53, +0x2, 0xb5,0x7e,0x43,0x2, 0x82,0x7e,0xb3,0x2, 0xb7,0x70,0x9, 0xbe,0xa0,0x1, 0x78, +0x4, 0xe5,0x15,0xe1,0x56,0x4c,0xaa,0x78,0x2b,0x6c,0x44,0xe5,0x27,0xa, 0xb, 0xa, +0x1e,0x9d,0x10,0xb, 0x14,0x7c,0x53,0x74,0x1, 0x7a,0xb3,0x2, 0xb8,0x7e,0xb3,0xc, +0xac,0xbe,0xb0,0x2, 0x50,0x9, 0x4, 0x7a,0xb3,0xc, 0xac,0xe5,0x15,0xe1,0x56,0xe4, +0x7a,0xb3,0xc, 0xac,0x6c,0xff,0xa, 0x1f,0x2e,0x14,0x0, 0x1e,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x7c,0x3b,0x6c,0x22,0xc1,0xf2,0xa5,0xba,0x0, 0x4, 0x6d,0x0, +0x80,0x7, 0x7e,0x5, 0x2a,0x2e,0x4, 0x0, 0xc, 0x7a,0x5, 0x2a,0xa, 0x4, 0xa, 0xd2, +0x2d,0xd0,0xe5,0x27,0xa, 0xb, 0xbd,0xd0,0x40,0x66,0xa, 0xe, 0xbd,0xd0,0x38,0x60, +0xa, 0x3, 0xbd,0xd0,0x38,0x5a,0xbe,0xa0,0x1, 0x78,0x12,0x7e,0xd0,0x2, 0xac,0xdf, +0x7e,0x10,0x18,0xac,0x12,0x2d,0x6, 0x49,0x0, 0x1, 0xf2,0x80,0x1a,0x7e,0xd5,0x2a, +0x3e,0xd4,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0xd, 0x7d,0xd0,0x2d,0xd4,0xb, 0xd8,0xd0, +0x2d,0xe, 0xb, 0x8, 0x0, 0x2d,0xd, 0x7a,0x5, 0x28,0x12,0x37,0x59,0x2d,0xdf,0xb, +0xd8,0x0, 0xbe,0x5, 0x28,0x50,0x6, 0x7e,0x5, 0x28,0x1b,0xd8,0x0, 0x12,0x37,0x59, +0x2d,0xd3,0xb, 0xd8,0x0, 0xbe,0x5, 0x28,0x28,0x6, 0x7e,0x5, 0x28,0x1b,0xd8,0x0, +0xb, 0x20,0xbc,0x52,0x28,0x2, 0xc1,0x6a,0xb, 0xf0,0xbe,0xf0,0xb, 0x38,0x2, 0xc1, +0x56,0x6c,0xff,0x74,0x2, 0xac,0xbf,0x49,0x25,0x2, 0x84,0x49,0x35,0x2, 0x9c,0x9d, +0x32,0x12,0x0, 0x2e,0xbe,0x34,0x0, 0xfa,0x8, 0x5, 0x75,0x15,0x2, 0x80,0x7, 0xb, +0xf0,0xbe,0xf0,0xb, 0x28,0xdd,0x7e,0xb3,0x2, 0xb8,0xb4,0x1, 0x27,0xbe,0xf0,0xc, +0x78,0x3, 0x75,0x15,0x1, 0x6c,0xff,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x2, +0x9c,0x7e,0x34,0x7f,0xff,0x74,0x2, 0xac,0xbf,0x59,0x35,0x2, 0x84,0xb, 0xf0,0xbe, +0xf0,0xc, 0x78,0xe3,0xe5,0x15,0xda,0x3b,0x22,0x7e,0x10,0x2, 0xac,0x1f,0x7d,0xd0, +0x22,0x7e,0x50,0x5, 0x7e,0x40,0x3, 0x6c,0x66,0x6c,0xaa,0x6c,0x77,0xa5,0xbc,0x0, +0x3, 0x7e,0x40,0x1, 0x6c,0x33,0x6c,0x22,0x7e,0x10,0x2, 0xac,0x12,0x7e,0x90,0x18, +0xac,0x93,0x2d,0x40,0x49,0x4, 0x8, 0x82,0xbe,0x4, 0x0, 0x14,0x8, 0x4, 0xb, 0x60, +0x80,0x8, 0xbe,0x4, 0xff,0xec,0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x2c,0x24,0xbe,0x20, +0xc, 0x40,0xd5,0x2c,0x35,0xbe,0x30,0x15,0x40,0xcc,0x7c,0xb7,0x1e,0xb0,0xa, 0x2b, +0xa, 0x16,0xbd,0x12,0x28,0x1e,0xe4,0x7a,0xb3,0xa, 0x9f,0x7e,0x73,0xa, 0x9e,0xbe, +0x70,0x5, 0x50,0x6, 0x7e,0x34,0xa, 0x9e,0x80,0x22,0xe4,0x7a,0xb3,0xa, 0x9e,0x75, +0x16,0x1, 0x80,0x2d,0xa, 0x3a,0xbd,0x32,0x28,0x21,0xe4,0x7a,0xb3,0xa, 0x9e,0x7e, +0x73,0xa, 0x9f,0xbe,0x70,0x5, 0x50,0x9, 0x7e,0x34,0xa, 0x9f,0x12,0x2e,0x24,0x80, +0x10,0xe4,0x7a,0xb3,0xa, 0x9f,0x75,0x16,0x2, 0x80,0x6, 0x12,0x1f,0xf1,0x75,0x16, +0x0, 0xe5,0x16,0x22,0x7e,0xa3,0x3, 0xa5,0xbe,0xa0,0x0, 0x38,0x34,0xbe,0xa3,0x3, +0xa4,0x50,0x19,0x7e,0xb3,0x3, 0xa9,0xbe,0xb3,0xc, 0xb2,0x28,0x14,0x7e,0xb3,0xc, +0xb2,0x4, 0x7a,0xb3,0xc, 0xb2,0x7a,0xa3,0x3, 0xa4,0x80,0x5, 0xe4,0x7a,0xb3,0xc, +0xb2,0x7e,0xb3,0x3, 0xa4,0x70,0xa, 0x7e,0xb3,0x3, 0xa8,0x54,0xfe,0x7a,0xb3,0x3, +0xa8,0x22,0x12,0x38,0x56,0x7a,0xb3,0xc, 0xa4,0x74,0xff,0x7a,0xb3,0xc, 0x9c,0x74, +0x1, 0x7a,0xb3,0xc, 0xa5,0x22,0x74,0x3, 0x7a,0xb3,0xc, 0x9d,0xe4,0x22,0x6d,0x33, +0x7a,0x37,0xc, 0xa6,0xe4,0x7a,0xb3,0xc, 0x7f,0x22,0xbe,0xb0,0xa, 0x50,0x7, 0xa, +0x2b,0x19,0x72,0xc, 0x9c,0x22,0xa, 0x2b,0x9e,0x24,0x0, 0xa, 0x7c,0x65,0xa, 0x26, +0xbe,0x24,0x2, 0x69,0x50,0xd, 0xa5,0xbe,0x7d,0x3, 0x2, 0x3a,0x48,0xa, 0x26,0x19, +0x72,0x3, 0xb9,0x22,0xca,0x79,0x7c,0x6b,0x14,0x68,0x53,0x14,0x68,0x62,0x14,0x68, +0x7a,0x14,0x68,0x77,0x14,0x68,0x74,0x14,0x68,0x71,0x14,0x68,0x6e,0x14,0x68,0x6b, +0x14,0x68,0x68,0x14,0x68,0x65,0x14,0x68,0x62,0x14,0x68,0x5f,0x14,0x68,0x5c,0x14, +0x68,0x59,0x14,0x68,0x56,0x24,0xc3,0x68,0x61,0x1b,0xb1,0x68,0x69,0x14,0x68,0x6c, +0x24,0x65,0x68,0x5c,0x24,0xea,0x78,0x69,0x12,0x3a,0x5a,0x4c,0x77,0x68,0x4, 0xa5, +0xbf,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x12,0x39,0xb3,0x21,0xa8,0x7a,0x73, +0xb, 0xe4,0x74,0x18,0xac,0x7b,0x2e,0x37,0xc, 0x80,0x7a,0x37,0xb, 0xe2,0x21,0xa8, +0xa5,0xbf,0x4, 0x7, 0x74,0x1, 0x7e,0x70,0x4, 0x80,0xb, 0xa5,0xbf,0x5, 0x2, 0x80, +0x2, 0x21,0xa8,0xe4,0x6c,0x77,0x12,0x38,0x6a,0x21,0xa8,0xa, 0x26,0x2e,0x24,0x3, +0xb9,0x9e,0x24,0x0, 0x3, 0x7a,0x29,0x70,0x80,0x7e,0x7a,0x73,0x3, 0xc6,0x80,0x78, +0x7a,0x73,0xc, 0xa5,0x80,0x72,0x7a,0x73,0x4, 0x24,0x80,0x6c,0x12,0x3a,0x48,0x80, +0x67,0x12,0x6, 0x51,0x54,0x7, 0x12,0x3a,0x6c,0x7c,0xab,0xbe,0x60,0x50,0x40,0xe, +0xbe,0x60,0x63,0x38,0x9, 0x12,0x39,0xab,0x19,0x72,0x3, 0x79,0x80,0x4a,0xbe,0x60, +0x78,0x40,0xe, 0xbe,0x60,0x8b,0x38,0x9, 0x12,0x39,0xab,0x19,0x72,0x3, 0x66,0x80, +0x37,0xbe,0x60,0xa0,0x40,0xe, 0xbe,0x60,0xb3,0x38,0x9, 0x12,0x39,0xab,0x19,0x72, +0x3, 0x53,0x80,0x24,0xbe,0x60,0xbf,0x40,0xe, 0xbe,0x60,0xd2,0x38,0x9, 0x12,0x39, +0xab,0x19,0x72,0x3, 0x40,0x80,0x11,0xbe,0x60,0xd3,0x40,0xc, 0xbe,0x60,0xe6,0x38, +0x7, 0x12,0x39,0xab,0x19,0x72,0x3, 0x41,0xda,0x79,0x22,0x74,0x14,0xa4,0xa, 0x26, +0x2d,0x25,0x22,0x7c,0x7b,0x7e,0xb3,0xb, 0x33,0xb4,0x3, 0x5, 0x74,0x1, 0x2, 0x38, +0x6a,0x74,0x27,0x2, 0x39,0xc6,0xbe,0xb0,0x7f,0x38,0x30,0x7c,0x6b,0x2e,0x60,0xfd, +0x68,0x29,0x1b,0x60,0x68,0x25,0x2e,0x60,0xe1,0x68,0x20,0x2e,0x60,0xfd,0x68,0x1b, +0x1b,0x61,0x68,0x17,0x2e,0x60,0xf9,0x68,0x12,0x80,0x0, 0xa, 0x2b,0x19,0x72,0xb, +0xc, 0x7e,0xb3,0xb, 0x8c,0x44,0x1, 0x7a,0xb3,0xb, 0x8c,0x22,0xca,0x79,0xbe,0xb0, +0x80,0x40,0x1d,0xbe,0xb0,0xbf,0x38,0x18,0xbe,0xb0,0x26,0x68,0x38,0xbe,0xb0,0x28, +0x68,0x33,0xbe,0xb0,0x23,0x68,0x2e,0xbe,0xb0,0x2f,0x68,0x29,0x24,0x80,0x80,0x22, +0xb, 0xb2,0x68,0x1c,0x1b,0xb2,0x78,0x1d,0x12,0x3a,0x5a,0xbe,0x70,0x4, 0x40,0x9, +0xbe,0x70,0x5, 0x68,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x12,0x39,0xb3,0x80,0x5, +0x74,0x27,0x12,0x39,0xc6,0xda,0x79,0x22,0x30,0x0, 0x8, 0x74,0x1, 0x12,0xf, 0x76, +0xc2,0x0, 0x22,0xe4,0x12,0xf, 0x76,0xd2,0x0, 0x22,0x7e,0x74,0xb, 0xe7,0x7a,0x79, +0x70,0x5e,0x70,0x70,0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0x7b,0x22,0xb4,0x4, 0x2, 0xe4, +0x22,0xb4,0x6, 0x3, 0x74,0x1, 0x22,0xb4,0x7, 0x3, 0x74,0x2, 0x22,0xe4,0x22,0x7e, +0xb3,0x0, 0x81,0x30,0xe0,0x23,0x7e,0x37,0x3, 0xa6,0xbe,0x34,0x0, 0x3c,0x50,0x8, +0xb, 0x34,0x7a,0x37,0x3, 0xa6,0x80,0x11,0x12,0xf, 0x6f,0x6d,0x33,0x7a,0x37,0x3, +0xa6,0x7e,0x34,0x5, 0xdc,0x7a,0x37,0x3, 0xb7,0x7e,0xb3,0x0, 0x81,0x20,0xe0,0x17, +0x6d,0x33,0x7a,0x37,0x3, 0xa6,0x30,0x1, 0xe, 0xc2,0x1, 0x7e,0x73,0x0, 0x7f,0xbe, +0x70,0x0, 0x28,0x3, 0x12,0xf, 0x6f,0x22,0xca,0x3b,0x7d,0x62,0x7d,0x73,0x75,0x2b, +0x0, 0x75,0x2d,0x0, 0x75,0x30,0x0, 0x75,0x31,0x0, 0xb, 0x78,0x30,0x7a,0x37,0xc, +0x40,0x9, 0xb7,0x0, 0x50,0x20,0xe0,0x8, 0x20,0xe2,0x5, 0x20,0xe1,0x2, 0xa1,0xa7, +0x20,0x2, 0x6, 0x7e,0x34,0xb, 0x92,0x80,0x4, 0x7e,0x34,0xb, 0xb6,0x7a,0x35,0x2e, +0x75,0x27,0x0, 0x7e,0xa0,0xff,0x12,0x3d,0xd8,0x7a,0x39,0xa0,0x5, 0x27,0xe5,0x27, +0xb4,0x24,0xf0,0x74,0xaa,0x7e,0x35,0x2e,0x7a,0x39,0xb0,0x74,0xaa,0x7e,0x35,0x2e, +0x19,0xb3,0x0, 0x1, 0x9, 0x77,0x0, 0x4a,0x7e,0x25,0x2e,0x19,0x72,0x0, 0x4, 0x75, +0x2c,0x0, 0x75,0x27,0x0, 0x7e,0x91,0x27,0x74,0x7, 0xac,0x9b,0x7d,0x34,0x2d,0x37, +0x9, 0xa3,0x0, 0x8, 0x7c,0xba,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2b,0xb4,0xb0,0x2, +0x80,0x2, 0xa1,0x3a,0x2e,0x34,0x0, 0x8, 0x7c,0xba,0x54,0xf, 0x7a,0x39,0xb0,0x7d, +0x54,0x2d,0x57,0x9, 0x75,0x0, 0x8, 0xa, 0x57,0x2e,0x57,0xc, 0x40,0x9, 0xb5,0x0, +0x23,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0x3a,0x2d,0x47,0x9, 0xa4,0x0, 0x8, 0xa, 0x3a, +0x2e,0x37,0xc, 0x40,0x9, 0xb3,0x0, 0x23,0xbe,0xb0,0x3, 0x78,0x2, 0xa1,0x3a,0x7a, +0xa1,0x32,0xa, 0x3a,0x12,0x3d,0xf3,0xf5,0x33,0x60,0x5, 0xe5,0x33,0xb4,0x2, 0x3a, +0x7d,0x43,0x2d,0x47,0x9, 0x34,0x0, 0x56,0x9, 0xa7,0x0, 0x5b,0xbc,0x3a,0x50,0xe, +0x7d,0x4, 0x2e,0x4, 0x0, 0x56,0x7c,0xb3,0x4, 0x7a,0x9, 0xb0,0xa1,0x3a,0xbc,0x3a, +0x78,0x9, 0x4c,0xaa,0x68,0x5, 0xe4,0x19,0xb2,0x0, 0x23,0x7e,0xa0,0xff,0xe5,0x32, +0xa, 0x2b,0x2d,0x27,0x19,0xa2,0x0, 0x56,0x80,0x1a,0x2d,0x37,0x9, 0x43,0x0, 0x56, +0x9, 0x57,0x0, 0x5b,0xbc,0x45,0x38,0x7, 0xe4,0x19,0xb3,0x0, 0x56,0xa1,0x3a,0xe4, +0x19,0xb3,0x0, 0x56,0x7e,0xa1,0x2c,0x74,0x6, 0xa4,0xf5,0x28,0x12,0x3d,0xc1,0x9, +0xb3,0x0, 0x9, 0xf5,0x30,0x12,0x3d,0xc1,0x9, 0xb3,0x0, 0xa, 0xc4,0x54,0xf0,0xf5, +0x31,0xe5,0x32,0xbe,0xb0,0x5, 0x50,0x64,0x9, 0xb7,0x0, 0x50,0x20,0xe3,0x2a,0x7e, +0x8, 0x0, 0x30,0xe5,0x32,0xa, 0x3b,0x2e,0x34,0xb, 0x8d,0x74,0x1, 0x7e,0x50,0xf, +0x12,0x3d,0xfe,0x7e,0x8, 0x0, 0x31,0xe5,0x32,0xa, 0x3b,0x2e,0x34,0xb, 0xda,0x74, +0x10,0x7e,0x50,0x20,0x12,0x3d,0xfe,0x80,0x14,0xe5,0x32,0xa, 0x3b,0x9, 0xb3,0xb, +0x8d,0xf5,0x30,0xe5,0x32,0xa, 0x3b,0x9, 0xb3,0xb, 0xda,0xf5,0x31,0xe5,0x32,0xa, +0x3b,0x12,0x3d,0xf3,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0xb, 0x8d,0x6c,0xaa,0xe5,0x32, +0xa, 0x3b,0x19,0xa3,0xb, 0xda,0x75,0x30,0x0, 0x75,0x31,0x0, 0x9, 0xb6,0x0, 0x6, +0xb4,0xff,0x14,0x12,0x3d,0xc1,0x9, 0xb3,0x0, 0x8, 0xbe,0xb0,0xff,0x68,0x5, 0x75, +0x30,0x1, 0x80,0x3, 0x75,0x30,0x0, 0x12,0x3d,0xc1,0x49,0x33,0x0, 0x4, 0x12,0x3d, +0xae,0x19,0xa3,0x0, 0x5, 0x7e,0x55,0x29,0x12,0x3d,0xb7,0x19,0xa3,0x0, 0x6, 0x12, +0x3d,0xc1,0x49,0x33,0x0, 0x6, 0x12,0x3d,0xae,0x19,0xa3,0x0, 0x7, 0x7e,0x55,0x29, +0x12,0x3d,0xb7,0x19,0xa3,0x0, 0x8, 0x7e,0xa1,0x30,0x12,0x3d,0xb9,0x19,0xa3,0x0, +0x9, 0x7e,0xa1,0x31,0x12,0x3d,0xb9,0x19,0xa3,0x0, 0xa, 0x12,0x3d,0xc1,0x9, 0x63, +0x0, 0x8, 0x7c,0xb6,0xc4,0x54,0xf0,0x12,0x3d,0xe9,0x2e,0x24,0x0, 0x7, 0x12,0x3d, +0xe0,0x7e,0x51,0x27,0x74,0x7, 0xac,0x5b,0x2d,0x27,0x9, 0x72,0x0, 0x8, 0xbe,0x70, +0xff,0x68,0x26,0xa, 0x17,0x2e,0x17,0xc, 0x40,0x9, 0x61,0x0, 0x23,0xbe,0x60,0x1, +0x68,0x2, 0x5, 0x2b,0x5, 0x2d,0x7c,0xb6,0xc4,0x33,0x33,0x54,0xc0,0x12,0x3d,0xe9, +0x2e,0x24,0x0, 0x5, 0x12,0x3d,0xe0,0x80,0xf, 0x12,0x3d,0xb9,0x2e,0x34,0x0, 0x5, +0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x2c,0x5, 0x27,0xe5,0x27,0xb4,0x5, +0x2, 0x80,0x2, 0x61,0x35,0xe5,0x2b,0x7e,0x35,0x2e,0x19,0xb3,0x0, 0x3, 0x74,0x24, +0x7e,0x35,0x2e,0x19,0xb3,0x0, 0x2, 0xe4,0x7e,0x35,0x2e,0x19,0xb3,0x0, 0x23,0x75, +0x27,0x0, 0x12,0x3d,0xd8,0x7e,0x39,0x60,0x7e,0x25,0x2e,0x2e,0x24,0x0, 0x23,0x7e, +0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0x5, 0x27,0xe5,0x27,0xb4,0x23,0xe4,0xb2,0x2, +0x74,0x1, 0x12,0xf, 0x76,0x9, 0xb7,0x0, 0x50,0x30,0xe2,0x7, 0x7e,0x37,0xc, 0x40, +0x12,0x3e,0x54,0x12,0x3d,0xce,0x54,0xfe,0x12,0x3d,0xcb,0x54,0xfb,0x12,0x3d,0xcb, +0x54,0xfd,0x7a,0x39,0xb0,0x80,0x4, 0xe4,0x12,0xf, 0x76,0xda,0x3b,0x22,0x7a,0x35, +0x29,0xa, 0x56,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x28,0xa, 0x3b,0x2e,0x35,0x2e, +0x22,0x7e,0x71,0x27,0x74,0x7, 0xac,0x7b,0x2d,0x37,0x22,0x7a,0x39,0xb0,0x7d,0x37, +0x2e,0x34,0x0, 0x50,0x7e,0x39,0xb0,0x22,0xe5,0x27,0xa, 0x3b,0x2e,0x35,0x2e,0x22, +0x7e,0x29,0x70,0x2c,0x76,0x7a,0x29,0x70,0x22,0x7c,0x6b,0xe5,0x28,0xa, 0x2b,0x2e, +0x25,0x2e,0x22,0x7d,0x23,0x2e,0x27,0xc, 0x40,0x9, 0xb2,0x0, 0x23,0x22,0xca,0x3b, +0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x34,0x7e,0x79,0x50,0xa5,0xbd,0x0, 0xb, +0x7e,0xd, 0x34,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80,0x36,0x7e,0xd, 0x34,0x7e,0xb, +0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x0, 0x2e,0xa, 0x2c,0xbd,0x32,0x8, 0x18, +0x7e,0x1d,0x34,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c, +0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79,0x30,0x7e,0x1d,0x34,0x7a,0x1b, +0x30,0xda,0x3b,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0x28, +0x74,0x3, 0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0x23,0x7e,0x24,0xff,0xff,0x7e,0x30, +0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x2d,0x2d,0x13,0x59,0x21,0x0, +0x37,0xb, 0xa0,0xbe,0xa0,0x5, 0x40,0xce,0xe4,0x19,0xb3,0x0, 0x41,0x19,0xb3,0x0, +0x42,0x22,0xca,0x3b,0x6d,0x0, 0x7e,0xb3,0x6, 0x63,0x7c,0xeb,0x70,0x27,0x6c,0xff, +0x6d,0x11,0x74,0x2, 0xac,0xbf,0x59,0x15,0xa, 0xfd,0x7e,0xa0,0xff,0x7e,0x30,0x7, +0xac,0x3f,0x19,0xa1,0xa, 0xde,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0xb, 0x7, 0xb, 0xf0, +0xbe,0xf0,0x5, 0x78,0xdb,0x6c,0xff,0xe1,0xe7,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x6, +0x26,0xf5,0x28,0xbe,0xb0,0xff,0x78,0x2, 0xe1,0xe5,0x12,0x4f,0x96,0xbe,0xb0,0x1, +0x78,0x2, 0xe1,0xe5,0x75,0x27,0x0, 0x7e,0x31,0x27,0x74,0x7, 0xac,0x3b,0x9, 0x71, +0xa, 0xde,0x7a,0x71,0x29,0xbe,0x71,0x28,0x68,0x2, 0xe1,0xda,0x49,0x21,0xa, 0xdc, +0x74,0x7, 0xac,0xbf,0x49,0x35,0x6, 0x24,0x12,0x27,0x1b,0x7e,0xa1,0x27,0x74,0x7, +0xa4,0x49,0x25,0xa, 0xda,0x74,0x7, 0xac,0xbf,0x49,0x35,0x6, 0x22,0x9d,0x32,0x12, +0x0, 0x2e,0x7d,0x3, 0x2d,0x6, 0xe5,0x29,0xa, 0x1b,0x9, 0xa1,0xb, 0x7, 0xbe,0xa0, +0x0, 0x28,0x17,0x7e,0x71,0x29,0x74,0x2, 0xac,0x7b,0x59,0x3, 0xa, 0xfd,0x2e,0x14, +0xb, 0x7, 0x7c,0xba,0x14,0x7a,0x19,0xb0,0xe1,0xe5,0x7e,0xa1,0x29,0x74,0x2, 0xa4, +0x49,0x15,0xa, 0xfd,0xbe,0x14,0x0, 0x64,0x28,0x8, 0xbe,0x4, 0x0, 0x64,0x28,0x2, +0x80,0x72,0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32, +0x28,0x2, 0x80,0x60,0x7e,0x17,0x2, 0xf3,0xbd,0x10,0x50,0x52,0x12,0x4f,0x96,0x70, +0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0x6, 0x45,0x7e,0xa0,0x3, 0xe5,0x28, +0xa, 0x1b,0x19,0xa1,0x6, 0x4a,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0x6, 0x22,0x7e, +0x14,0xc, 0x40,0x74,0x7, 0x12,0x1, 0x39,0xbe,0xe0,0x0, 0x28,0x21,0x1b,0xe0,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0x6, 0x22,0x7e,0x30,0x7, 0xac,0x3f,0x12,0x4f,0x56, +0x7e,0x34,0xc, 0x40,0x7e,0x30,0x7, 0xac,0x3e,0x12,0x4f,0x56,0x1b,0xf0,0x7e,0xa1, +0x29,0x74,0x2, 0xa4,0x59,0x5, 0xa, 0xfd,0x80,0xb, 0x5, 0x27,0xe5,0x27,0xbe,0xb0, +0x5, 0x50,0x2, 0xc1,0xe7,0xb, 0xf0,0x7e,0x73,0x6, 0x63,0xbc,0x7f,0x28,0x2, 0xc1, +0xc9,0x7a,0xe3,0x6, 0x63,0x7e,0x24,0x6, 0x22,0x7e,0x34,0xa, 0xda,0x12,0x1e,0x51, +0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x2, 0xb9, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x2, 0xbb,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x2, 0x40, +0xd4,0x7c,0xba,0x22,0xca,0x79,0x6c,0x99,0x80,0x63,0x7e,0xf0,0x7, 0xac,0xf9,0x49, +0xc7,0x3, 0x5e,0xbe,0xc4,0x5, 0xa, 0x40,0x44,0x49,0xd7,0x3, 0x5c,0x7d,0x3d,0x12, +0x40,0x3, 0x7c,0x8b,0xbe,0x80,0x2, 0x40,0xe, 0x7e,0xd4,0x4, 0xff,0x74,0x7, 0xac, +0xb9,0x59,0xd5,0x3, 0x5e,0x80,0x3e,0x7e,0x70,0x2, 0xac,0x78,0x2e,0x34,0x2, 0xcd, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xd0,0x74,0x7, 0xac,0xb9,0x59,0xd5,0x3, 0x5c,0x7e, +0x34,0x5, 0x50,0x74,0x7, 0xac,0xb9,0x59,0x35,0x3, 0x5e,0x80,0xe, 0xbe,0xc4,0x5, +0x0, 0x40,0x8, 0x7e,0x54,0x4, 0xff,0x59,0x57,0x3, 0x5e,0xb, 0x90,0x7e,0x73,0x3, +0xa4,0xbc,0x79,0x38,0x95,0xda,0x79,0x22,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x3, 0xde, +0xa, 0x4a,0x19,0xb4,0x3, 0x0, 0x9, 0xb3,0x3, 0xff,0x19,0xb4,0x3, 0x15,0x2e,0x34, +0x0, 0x6, 0x12,0x9, 0xde,0x19,0xb4,0x3, 0x2a,0xb, 0xa0,0xbe,0xa0,0x15,0x78,0xda, +0x74,0x2, 0x7a,0xb3,0x2, 0xfc,0x7e,0xb3,0x4, 0x29,0xb4,0x1, 0x4, 0x74,0x3f,0x80, +0x2, 0x74,0x7f,0x7a,0xb3,0x2, 0xf8,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x3, 0x55,0x74, +0xc8,0x7a,0xb3,0x2, 0xfe,0xe4,0x7a,0xb3,0x2, 0xff,0x74,0xeb,0x7a,0xb3,0x2, 0xfa, +0x7e,0xb3,0x4, 0x24,0x12,0x7, 0x7f,0x74,0x5d,0x7a,0xb3,0x2, 0xfb,0x7e,0x73,0x3, +0xb9,0x7a,0x73,0x2, 0xfd,0x7e,0x24,0x3, 0xc9,0x7e,0x34,0x3, 0x3f,0x12,0x44,0xd3, +0x74,0xc8,0x7a,0xb3,0x3, 0x57,0x22,0xca,0x3b,0x7c,0xdb,0x6c,0xcc,0x12,0x44,0x99, +0x78,0x3e,0x7e,0x27,0x1, 0xab,0xbe,0x24,0x0, 0x1, 0x78,0x2, 0x61,0x58,0x7e,0x24, +0x0, 0x1, 0x7a,0x27,0x1, 0xab,0x7e,0xb3,0x1, 0xe8,0x60,0x10,0x74,0x2, 0x7a,0xb3, +0x1, 0xe6,0x7e,0x53,0x1, 0xe8,0x7a,0x53,0x1, 0xb6,0x80,0x6, 0x74,0x1, 0x7a,0xb3, +0x1, 0xe6,0xe4,0x7a,0xb3,0x1, 0xb5,0x7a,0xb3,0x1, 0xec,0x12,0x44,0xab,0x61,0x58, +0xbe,0x34,0x0, 0x2, 0x78,0x56,0x7e,0x27,0x1, 0xab,0xbe,0x24,0x0, 0x2, 0x68,0x36, +0x7e,0x24,0x0, 0x2, 0x7a,0x27,0x1, 0xab,0x74,0x7, 0x7a,0xb3,0x1, 0xe6,0xe4,0x7a, +0xb3,0x1, 0xec,0x12,0x44,0xcb,0x7a,0xb3,0x1, 0xed,0x12,0x44,0xab,0x6c,0xff,0x6d, +0x22,0x74,0x2, 0xac,0xbf,0x59,0x25,0x1, 0xc5,0xa, 0x2f,0x19,0xf2,0x1, 0xb5,0xb, +0xf0,0xbe,0xf0,0x7, 0x78,0xe9,0x7e,0x53,0x1, 0xe7,0xbe,0x53,0x1, 0xef,0x28,0x2, +0x61,0x58,0x7e,0x24,0x0, 0x3, 0x7a,0x27,0x1, 0xa9,0x61,0x58,0xbe,0x34,0x0, 0x3, +0x68,0x2, 0x61,0x40,0x7e,0x37,0x1, 0xab,0xbe,0x34,0x0, 0x3, 0x78,0x2, 0x61,0x58, +0x7e,0x34,0x7f,0xff,0x7e,0xe0,0xff,0x6d,0x22,0x7a,0x25,0x27,0x6c,0xff,0x80,0x17, +0xa, 0x1f,0x9, 0xa1,0x1, 0xb5,0x74,0x2, 0xa4,0x49,0x25,0x1, 0xc5,0xbe,0x25,0x27, +0x28,0x3, 0x7a,0x25,0x27,0xb, 0xf0,0x7e,0xa3,0x1, 0xe6,0xbc,0xaf,0x38,0xe1,0x6c, +0xff,0x80,0x44,0x7e,0x44,0x0, 0x1, 0x7c,0xbf,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7e,0xb3,0x1, 0xee,0xa, 0x2b,0x5d,0x24,0x78,0x2b,0xa, 0x4f,0x9, 0x54,0x1, 0xb5, +0x7e,0x30,0x2, 0xac,0x35,0x49,0x11,0x1, 0xc5,0xbd,0x13,0x50,0x18,0x7c,0xe5,0x7e, +0x70,0x2, 0xac,0x7e,0x49,0x33,0x1, 0xc5,0x7e,0x43,0x1, 0xe7,0x7e,0x50,0x14,0xac, +0x45,0xbd,0x23,0x38,0x6, 0xb, 0xf0,0xbc,0xaf,0x38,0xb8,0xbe,0xe0,0xff,0x78,0x2, +0x61,0x2e,0x7e,0xa3,0x1, 0xe8,0xbc,0xae,0x78,0x2, 0x61,0x2e,0x7e,0x35,0x27,0xbe, +0x34,0x0, 0x64,0x38,0x2, 0x61,0x2e,0x74,0x2, 0xa4,0x49,0x25,0x1, 0xc5,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1, 0xc5,0x9d,0x32,0x12,0x0, 0x2e,0x7e,0xa3,0x1, 0xe8,0x74, +0x2, 0xa4,0x49,0x25,0x1, 0xc5,0x1e,0x24,0xbd,0x32,0x38,0x2, 0x61,0x2e,0x4c,0xdd, +0x68,0x2, 0x61,0x2b,0x7e,0x34,0x0, 0x4, 0x7a,0x37,0x1, 0xa9,0xa, 0x3e,0x9, 0x53, +0x1, 0xad,0x7a,0x53,0x4, 0x24,0x9, 0x53,0x1, 0xdd,0x7a,0x53,0x4, 0x29,0x7a,0x53, +0xb, 0x18,0x7e,0x53,0x4, 0x24,0x7a,0x53,0xb, 0x16,0x9, 0x73,0x1, 0xbd,0x7a,0x73, +0xb, 0x1a,0x7a,0xe3,0x1, 0xe8,0xa, 0x3e,0x9, 0xe3,0x1, 0xd5,0x6c,0xff,0xa, 0x3f, +0x2e,0x34,0x3, 0xde,0x7e,0x39,0x50,0x9e,0x53,0x4, 0x27,0x7a,0x39,0x50,0x7e,0x39, +0xb0,0x2c,0xbe,0x7a,0x39,0xb0,0xb, 0xf0,0xbe,0xf0,0x15,0x78,0xe1,0x7a,0xe3,0x4, +0x27,0x7a,0xe3,0xb, 0x19,0x12,0x44,0xe5,0x12,0x14,0x1e,0x60,0xfb,0x12,0x15,0xfb, +0x12,0x17,0xb5,0x12,0x17,0x16,0x12,0xe, 0xa9,0x12,0xf, 0x92,0x12,0xf, 0xb8,0x7e, +0x34,0x0, 0x3, 0x7a,0x37,0x1, 0xab,0x74,0x1, 0x81,0x8d,0x7e,0xc0,0x1, 0x4c,0xcc, +0x78,0x26,0x12,0x44,0xa2,0x68,0x3, 0x12,0x44,0x90,0x7e,0x34,0x0, 0x3, 0x80,0x14, +0x12,0x44,0xa2,0x78,0x13,0x7e,0x37,0x1, 0xab,0xbe,0x34,0x0, 0x4, 0x68,0x9, 0x12, +0x44,0x90,0x6d,0x33,0x7a,0x37,0x1, 0xab,0x12,0x44,0xee,0x12,0x15,0xfb,0x12,0x17, +0x16,0x12,0xe, 0xa9,0x12,0xf, 0x86,0xe4,0x7a,0xb3,0xa, 0xd3,0x74,0x1, 0x7a,0xb3, +0xa, 0xd2,0x12,0xf, 0x95,0x12,0x11,0xa8,0x7e,0x34,0x1, 0xa9,0x7e,0x24,0x6, 0x8a, +0x7e,0x14,0xa, 0xa7,0x12,0x45,0x43,0x74,0x1, 0x7a,0xb3,0xa, 0xd3,0xe4,0x7a,0xb3, +0xa, 0xd2,0x12,0x44,0x99,0x78,0x53,0x7e,0x53,0x1, 0xec,0xa, 0x25,0x9, 0x52,0x1, +0xb5,0xbe,0x53,0x1, 0xe8,0x68,0x2, 0x81,0x8c,0x7e,0xb3,0xc, 0xb1,0xbe,0xb0,0xc8, +0x50,0x16,0x4, 0x7a,0xb3,0xc, 0xb1,0x7e,0x27,0x1, 0xf0,0xbe,0x24,0x0, 0x78,0x28, +0x10,0x7e,0xb3,0xc, 0xb0,0x4, 0x80,0x5, 0xe4,0x7a,0xb3,0xc, 0xb1,0x7a,0xb3,0xc, +0xb0,0x7e,0x53,0xc, 0xb0,0xbe,0x50,0x3, 0x50,0x2, 0x81,0x8c,0x7e,0x24,0x0, 0x2, +0x7a,0x27,0x1, 0xa9,0xe4,0x12,0x44,0xdc,0x81,0x8c,0xbe,0x34,0x0, 0x2, 0x68,0xe, +0xbe,0x34,0x0, 0x6, 0x68,0x8, 0xbe,0x34,0x0, 0x5, 0x68,0x2, 0x81,0x8c,0x7e,0xb3, +0x1, 0xef,0xbe,0xb3,0x1, 0xed,0x28,0x2, 0x81,0x8c,0xbe,0xd0,0x0, 0x28,0x7d,0x7e, +0xa3,0x1, 0xe7,0xbe,0xa3,0x1, 0xef,0x28,0x13,0xbe,0xb3,0x1, 0xed,0x50,0xd, 0x4, +0x7a,0xb3,0x1, 0xef,0x7e,0x73,0x1, 0xef,0x7a,0x73,0x1, 0xed,0x7e,0x63,0x1, 0xec, +0xa, 0x26,0x9, 0x72,0x1, 0xb5,0x4c,0x77,0x68,0x24,0xbe,0x73,0x1, 0xe8,0x68,0x1e, +0x7e,0x27,0x1, 0xf0,0xbe,0x24,0x1, 0x2c,0x28,0x14,0x7e,0x70,0x1, 0x7c,0xb6,0x60, +0x5, 0x3e,0x70,0x14,0x78,0xfb,0x4e,0x73,0x1, 0xee,0x7a,0x73,0x1, 0xee,0x7e,0x73, +0x1, 0xec,0xa, 0x27,0x9, 0xa2,0x1, 0xb5,0x74,0x2, 0xa4,0x49,0x45,0x1, 0xc5,0x2e, +0x47,0x1, 0xf0,0xbe,0x44,0x7f,0xff,0x50,0xb, 0x7d,0x35,0x2e,0x34,0x1, 0xc5,0x1b, +0x38,0x40,0x80,0x8, 0x7e,0x34,0x7f,0xff,0x59,0x35,0x1, 0xc5,0xe4,0xda,0x3b,0x22, +0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x1, 0xa9,0x22,0x7e,0x37,0x1, 0xa9,0xbe,0x34,0x0, +0x1, 0x22,0x7e,0x37,0x1, 0xa9,0xbe,0x34,0x0, 0x4, 0x22,0x7a,0xb3,0x1, 0xe9,0x7a, +0xb3,0x1, 0xea,0x7a,0xb3,0x2, 0xb7,0x7a,0xb3,0x2, 0xb8,0x74,0x1, 0x7a,0xb3,0x2, +0xb9,0xe4,0x7a,0xb3,0x1, 0xee,0x7a,0xb3,0x1, 0xef,0x22,0x74,0x2, 0x7a,0xb3,0x1, +0xe7,0xe4,0x22,0x7e,0x33,0x3, 0xb9,0xa, 0x13,0x2, 0x3, 0x6e,0x7a,0xb3,0xc, 0xb1, +0x7a,0xb3,0xc, 0xb0,0x22,0x7e,0x73,0xb, 0x1a,0x7a,0x73,0x4, 0x28,0x22,0xca,0x79, +0x6c,0xee,0x7e,0xf1,0xcc,0x80,0xa, 0x4c,0xee,0x78,0x3, 0x7e,0xe0,0x1, 0x43,0x87, +0x1, 0x12,0x14,0x1e,0x60,0xf1,0x7a,0xf1,0xcc,0xda,0x79,0x22,0x7d,0x23,0x74,0x30, +0x7a,0xb3,0xb, 0x2d,0x74,0xf8,0x7a,0xb3,0xb, 0x2e,0x2e,0x24,0x3, 0xf0,0x6d,0x11, +0x6d,0x55,0x7d,0x1, 0x3e,0x4, 0x2d,0x3, 0x1b,0x8, 0x50,0x74,0xff,0x7d,0x1, 0x1e, +0x4, 0x1e,0x4, 0x1e,0x4, 0x2d,0x2, 0x7a,0x9, 0xb0,0xb, 0x14,0xbe,0x14,0x0, 0xfc, +0x40,0xde,0x22,0xca,0x3b,0x7d,0x61,0x7d,0x73,0x7e,0x34,0xd8,0xf0,0x7a,0x35,0x29, +0x7e,0x34,0x27,0x10,0x7a,0x35,0x2b,0x6d,0x33,0x7a,0x35,0x2d,0x9, 0xb7,0x0, 0xd9, +0xf5,0x35,0x9, 0x77,0x0, 0x43,0x2d,0x37,0x9, 0xb3,0x0, 0xc, 0xf5,0x36,0x7d,0x32, +0x2e,0x34,0x1, 0xf8,0x7a,0x37,0xc, 0x40,0x7d,0x37,0x2e,0x34,0x0, 0x49,0x7a,0x37, +0xc, 0x42,0x49,0x32,0x4, 0x11,0x7a,0x37,0xc, 0x44,0x75,0x31,0x0, 0xc1,0x35,0xe5, +0x31,0xa, 0x2b,0x3e,0x24,0x7e,0x34,0x0, 0xc, 0xad,0x32,0x7a,0x35,0x33,0x75,0x32, +0x0, 0xc1,0x26,0xe5,0x32,0xa, 0x3b,0x2e,0x35,0x33,0x3e,0x34,0x2e,0x37,0xc, 0x40, +0x49,0x23,0x0, 0x18,0xb, 0x38,0x30,0x9d,0x32,0x7a,0x35,0x2f,0x7e,0x35,0x29,0xbe, +0x35,0x2f,0x58,0x6, 0x7e,0x35,0x2f,0x7a,0x35,0x29,0x7e,0x35,0x2b,0xbe,0x35,0x2f, +0x8, 0x6, 0x7e,0x35,0x2f,0x7a,0x35,0x2b,0x7e,0x35,0x2f,0x12,0x0, 0x2e,0xbe,0x35, +0x2d,0x28,0x9, 0x7e,0x35,0x2f,0x12,0x0, 0x2e,0x7a,0x35,0x2d,0xe5,0x36,0x70,0x34, +0x7e,0x11,0x35,0x74,0xc, 0xac,0x1b,0xe5,0x32,0xa, 0x1b,0x2d,0x1, 0x3e,0x4, 0x2e, +0x7, 0xc, 0x44,0xb, 0x8, 0x30,0xe5,0x32,0xa, 0x2b,0x2e,0x25,0x33,0x12,0x27,0x23, +0x2d,0x23,0x7e,0x71,0x31,0x74,0xc, 0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xc, +0x42,0x1b,0x38,0x20,0x5, 0x32,0x9, 0x76,0x0, 0x1, 0xbe,0x71,0x32,0x28,0x2, 0xa1, +0xa3,0x5, 0x35,0x5, 0x31,0x9, 0x77,0x1, 0xc, 0xbe,0x71,0x31,0x28,0x2, 0xa1,0x8f, +0xb, 0x78,0x30,0xbe,0x34,0x0, 0x1, 0x78,0x8, 0x7e,0x35,0x29,0x9e,0x35,0x2b,0x80, +0x3, 0x7e,0x35,0x2d,0x59,0x37,0x0, 0x47,0xe5,0x36,0x70,0x24,0x74,0x1, 0x19,0xb7, +0x1, 0xe, 0xe4,0x19,0xb7,0x1, 0xf, 0x9, 0x77,0x0, 0xd9,0xa, 0x37,0x9, 0x57,0x1, +0xc, 0xa, 0x25,0x2d,0x23,0x7e,0x69,0x70,0xbd,0x23,0x40,0xd, 0x74,0x1, 0x80,0x5, +0xe4,0x19,0xb7,0x1, 0xe, 0x19,0xb7,0x1, 0xf, 0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3, +0x0, 0x7f,0x6c,0xee,0x80,0x44,0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x0, 0x3f,0xf5,0x27, +0x7e,0xd0,0x1, 0x6c,0xcc,0x80,0x2d,0xbc,0xce,0x68,0x27,0x74,0x2, 0xac,0xbc,0x9, +0x75,0x0, 0x3f,0x7a,0x71,0x28,0xa, 0x27,0xe5,0x27,0xa, 0x3b,0x9d,0x32,0x12,0x0, +0x2e,0xbe,0x34,0x0, 0x2, 0x18,0x2, 0xb, 0xd0,0xbe,0xd0,0x2, 0x40,0x4, 0x74,0x1, +0x80,0xd, 0xb, 0xc0,0xbc,0xfc,0x38,0xcf,0xb, 0xe0,0xbc,0xfe,0x38,0xb8,0xe4,0xda, +0x3b,0x22,0x6c,0xaa,0xa, 0x3a,0x2e,0x34,0x3, 0xa2,0x12,0x9, 0xde,0xa, 0x3b,0xb, +0x34,0x80,0x14,0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7e,0x50,0x18,0xac,0x57,0x2d, +0x21,0x59,0x42,0x8, 0x82,0xb, 0x70,0xbe,0x70,0x15,0x40,0xe7,0xb, 0xa0,0xbe,0xa0, +0xc, 0x40,0xd1,0x22,0xca,0x3b,0x7e,0x74,0x3, 0xb9,0x6d,0x66,0x12,0x8, 0xc1,0x7a, +0x79,0xb0,0xb, 0x74,0xb, 0x64,0xbe,0x64,0x2, 0x69,0x40,0xf0,0xda,0x3b,0x22,0x74, +0x14,0x7a,0xb3,0xb, 0xc, 0x74,0x3c,0x7a,0xb3,0xb, 0xd, 0xe4,0x7a,0xb3,0xb, 0xf, +0x74,0x6, 0x7a,0xb3,0xb, 0x10,0x74,0xa0,0x7a,0xb3,0xb, 0x11,0x74,0x1, 0x7a,0xb3, +0xb, 0x12,0x74,0xa, 0x7a,0xb3,0xb, 0x13,0x74,0x8, 0x7a,0xb3,0xb, 0x14,0x74,0x14, +0x7a,0xb3,0xb, 0x15,0x12,0x4f,0x3e,0x74,0xa, 0x7a,0xb3,0xb, 0x2f,0x74,0x1, 0x7a, +0xb3,0xb, 0x30,0xe4,0x7a,0xb3,0xb, 0x31,0x74,0xf, 0x7a,0xb3,0xb, 0x32,0x12,0x1f, +0xa6,0x74,0x79,0x7a,0xb3,0xb, 0x34,0xe4,0x7a,0xb3,0xb, 0x35,0x7a,0xb3,0xb, 0x36, +0x74,0x1, 0x7a,0xb3,0xb, 0x3b,0x74,0xc8,0x7a,0xb3,0xb, 0x3a,0xe4,0x7a,0xb3,0xb, +0x3e,0x74,0x64,0x7a,0xb3,0xb, 0x3f,0x74,0x32,0x7a,0xb3,0xb, 0x40,0x6d,0x33,0x7a, +0x37,0x2, 0xba,0x74,0x1, 0x7a,0xb3,0x2, 0xbc,0xe4,0x7a,0xb3,0x2, 0xc3,0x74,0xc, +0x7a,0xb3,0x2, 0xbe,0x74,0x8, 0x7a,0xb3,0x2, 0xbf,0x74,0x14,0x7a,0xb3,0x2, 0xc0, +0x74,0x14,0x7a,0xb3,0x2, 0xc1,0x74,0xa, 0x7a,0xb3,0x2, 0xc2,0x74,0x1, 0x7a,0xb3, +0x2, 0xc4,0x7e,0x34,0x0, 0x50,0x7a,0x37,0x6, 0x67,0x74,0x14,0x7a,0xb3,0x6, 0x69, +0x7e,0x34,0x0, 0x3c,0x7a,0x37,0x6, 0x6a,0xe4,0x7a,0xb3,0x6, 0x89,0x74,0x3, 0x7a, +0xb3,0x6, 0x7c,0x74,0x3, 0x7a,0xb3,0x6, 0x7d,0xe4,0x7a,0xb3,0x6, 0x81,0x74,0x14, +0x7a,0xb3,0x6, 0x82,0xe4,0x7a,0xb3,0x6, 0x7e,0x7a,0xb3,0x6, 0x76,0x74,0x3, 0x7a, +0xb3,0x6, 0x77,0xe4,0x7a,0xb3,0x6, 0x78,0x74,0x4, 0x7a,0xb3,0x6, 0x79,0x7e,0x34, +0x0, 0x64,0x7a,0x37,0x6, 0x7a,0x7a,0x37,0x6, 0x72,0x74,0x32,0x7a,0xb3,0x6, 0x74, +0x74,0x5, 0x7a,0xb3,0x2, 0xef,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2, 0xf0,0x74,0xa0, +0x7a,0xb3,0x2, 0xf2,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x2, 0xf3,0xe4,0x7a,0xb3,0x2, +0xf5,0x7a,0xb3,0xb, 0x17,0x7e,0x73,0x4, 0x24,0x7a,0x73,0xb, 0x16,0x7e,0x73,0x4, +0x27,0x7a,0x73,0xb, 0x19,0x7e,0x73,0x4, 0x28,0x7a,0x73,0xb, 0x1a,0x7a,0xb3,0xb, +0x1b,0x7e,0x73,0x4, 0x29,0x7a,0x73,0xb, 0x18,0x22,0x7e,0x24,0xb, 0xc, 0x7e,0xb3, +0xb, 0x8c,0x20,0xe0,0x2, 0x21,0x8a,0x54,0xfe,0x7a,0xb3,0xb, 0x8c,0x7e,0x29,0x70, +0xbe,0x73,0x6, 0x69,0x68,0xe, 0x7a,0x73,0x6, 0x69,0xa, 0x37,0x3e,0x34,0x3e,0x34, +0x7a,0x37,0x6, 0x67,0x9, 0x72,0x0, 0x1, 0xa, 0x37,0xbe,0x37,0x6, 0x6a,0x68,0x4, +0x7a,0x37,0x6, 0x6a,0x9, 0x72,0x0, 0x5, 0xbe,0x73,0x2, 0xf2,0x68,0xb, 0x7a,0x73, +0x2, 0xf2,0x12,0x1f,0x6, 0x7a,0x37,0x2, 0xf0,0x9, 0x72,0x0, 0x2e,0xa, 0x37,0xbe, +0x37,0x2, 0xf3,0x68,0x4, 0x7a,0x37,0x2, 0xf3,0x9, 0x72,0x0, 0x25,0xa, 0x37,0xbe, +0x37,0x2, 0xba,0x68,0x4, 0x7a,0x37,0x2, 0xba,0x9, 0x72,0x0, 0x6, 0xbe,0x73,0x2, +0xbc,0x68,0x4, 0x7a,0x73,0x2, 0xbc,0x9, 0x72,0x0, 0x8, 0xbe,0x73,0x2, 0xbf,0x68, +0x1f,0x7a,0x73,0x2, 0xbf,0xbe,0x70,0xf, 0x40,0x5, 0xe4,0x19,0xb2,0x0, 0x8, 0x9, +0x72,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x3, 0x85,0x12,0x9, 0xde,0x7a,0xb3,0x2, 0xbe, +0x9, 0x72,0x0, 0x9, 0xbe,0x73,0x2, 0xc1,0x68,0x8, 0x7a,0x73,0x2, 0xc1,0x7a,0x73, +0x2, 0xc0,0x9, 0x72,0x0, 0x7, 0xbe,0x73,0x2, 0xc2,0x68,0x4, 0x7a,0x73,0x2, 0xc2, +0x9, 0x72,0x0, 0x24,0xbe,0x73,0x2, 0xc4,0x68,0x4, 0x7a,0x73,0x2, 0xc4,0x9, 0x72, +0x0, 0x32,0xbe,0x73,0x2, 0xf5,0x68,0x4, 0x7a,0x73,0x2, 0xf5,0x9, 0x72,0x0, 0x33, +0xa, 0x37,0xbe,0x37,0x6, 0x72,0x68,0x4, 0x7a,0x37,0x6, 0x72,0x9, 0x72,0x0, 0x34, +0xbe,0x73,0x6, 0x74,0x68,0x4, 0x7a,0x73,0x6, 0x74,0x22,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xe5, +0xcc,0xb4,0x2, 0x3, 0x75,0xcc,0x0, 0x12,0x5, 0xa7,0x30,0x90,0x2, 0xc2,0x90,0x30, +0x91,0x2, 0xc2,0x91,0x74,0x1, 0x7a,0xb3,0xb, 0xe0,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca, +0xb8,0xa9,0xc0,0x93,0xe4,0x7a,0xb3,0xb, 0xdf,0x12,0x49,0xdf,0xda,0xb8,0x32,0x7a, +0xb3,0xb, 0xe1,0x7a,0xb3,0xb, 0xe0,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, 0x3, +0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0xc2,0xec,0x32,0xa9,0xc6,0xdb, +0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0, +0xd0,0xc0,0x83,0xc0,0x82,0x12,0x19,0x8f,0x7e,0xb3,0xb, 0xe7,0x54,0xfd,0x7a,0xb3, +0xb, 0xe7,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x75,0xcb,0xc0,0x75,0xc8,0xb8,0x14,0x68,0xa, +0x14,0x68,0xc, 0xb, 0xb1,0x75,0xcc,0x0, 0x80,0x8, 0x75,0xcc,0x2, 0x80,0x3, 0x75, +0xcc,0x1, 0x0, 0x0, 0x0, 0x0, 0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec, +0xd2,0x86,0x22,0x75,0x9a,0xe8,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca, +0x79,0x6c,0xff,0xa, 0x2f,0x2e,0x24,0x3, 0x0, 0x12,0x4a,0xe2,0xb, 0xf0,0xbe,0xf0, +0x15,0x78,0xf0,0x7e,0x34,0x1, 0xa9,0x7e,0x24,0xa, 0xa7,0x7e,0x14,0x2, 0xf8,0x12, +0x2e,0x2f,0x7e,0x73,0x1, 0xec,0xa, 0x37,0x9, 0xe3,0x1, 0xb5,0xa, 0x3e,0x9, 0xb3, +0x1, 0xad,0x12,0x7, 0x7f,0x53,0xdb,0xf0,0x74,0xe, 0x7e,0x70,0x2, 0x12,0x16,0x4, +0xa, 0x3e,0x9, 0xb3,0x1, 0xdd,0xb4,0x1, 0x4, 0x74,0x3f,0x80,0x2, 0x74,0x7f,0x7a, +0xb3,0x2, 0xf8,0x12,0xe, 0xac,0x6c,0xff,0xa, 0x2f,0x2e,0x24,0x3, 0x0, 0x7e,0x29, +0x70,0x2e,0x73,0x4, 0x27,0x7a,0x29,0x70,0xb, 0xf0,0xbe,0xf0,0x15,0x40,0xe9,0xda, +0x79,0x22,0x7e,0x29,0x70,0x9e,0x73,0x4, 0x27,0x7a,0x29,0x70,0x22,0xca,0x3b,0x7d, +0x2, 0x9, 0xb0,0x4, 0x13,0x7c,0xab,0x9, 0x51,0x0, 0x15,0x9, 0x41,0x0, 0x16,0x70, +0x2, 0x81,0x1d,0xb4,0x4, 0x6, 0x3e,0x50,0x3e,0x50,0x3e,0x50,0x7d,0x40,0x7d,0x10, +0x2e,0x14,0x1, 0xf8,0x2e,0x4, 0x3, 0xf0,0x6c,0xff,0x81,0x14,0x7e,0xd0,0xc, 0xac, +0xdf,0x7d,0xf6,0x75,0x27,0x0, 0x81,0x7, 0xbe,0xa0,0x3, 0x78,0x8, 0xa, 0xc5,0x7d, +0xdf,0x3e,0xd4,0x80,0x18,0xbe,0xa0,0x2, 0x78,0x8, 0xa, 0xc5,0x7d,0xdf,0x3e,0xd4, +0x61,0xf9,0xbe,0xa0,0x5, 0x78,0xf, 0x12,0x4c,0x20,0xb, 0xe8,0xc0,0x2d,0xd4,0xb, +0xd8,0xe0,0x2d,0xec,0x81,0x0, 0xbe,0xa0,0x6, 0x78,0x74,0x7d,0xef,0x5e,0xe4,0x0, +0x7, 0x2e,0xe4,0x3, 0xba,0x12,0x4c,0x29,0x7c,0xeb,0x7d,0xdf,0x1e,0xd4,0x1e,0xd4, +0x1e,0xd4,0x2d,0xd0,0x7e,0xd9,0xb0,0x5c,0xbe,0x68,0x3b,0x7d,0xcf,0x3e,0xc4,0x7d, +0xdc,0x2d,0xd1,0xb, 0xd8,0xb0,0xa, 0xd4,0xbd,0xbd,0x8, 0x10,0xa, 0x95,0x7d,0xac, +0x2d,0xa4,0xb, 0xa8,0xd0,0x2d,0xd9,0x1b,0xa8,0xd0,0x80,0x67,0xa, 0xd4,0x6e,0xd4, +0xff,0xff,0xb, 0xd4,0xbd,0xbd,0x58,0x5b,0xa, 0xb5,0x2d,0xc4,0xb, 0xc8,0xd0,0x9d, +0xdb,0x1b,0xc8,0xd0,0x80,0x4d,0x12,0x4c,0x29,0x7c,0xeb,0x7d,0xef,0x1e,0xe4,0x1e, +0xe4,0x1e,0xe4,0x2d,0xe0,0x7e,0xe9,0xb0,0x4c,0xbe,0x7a,0xe9,0xb0,0x80,0x34,0x12, +0x4c,0x20,0xb, 0xe8,0xc0,0xa, 0xe4,0xbd,0xce,0x8, 0x10,0xa, 0xa5,0x7d,0xbd,0x2d, +0xb4,0xb, 0xb8,0xe0,0x2d,0xea,0x1b,0xb8,0xe0,0x80,0x18,0xa, 0xe4,0x6e,0xe4,0xff, +0xff,0xb, 0xe4,0xbd,0xce,0x58,0xc, 0xa, 0xc5,0x2d,0xd4,0xb, 0xd8,0xe0,0x9d,0xec, +0x1b,0xd8,0xe0,0xb, 0xf4,0x5, 0x27,0x9, 0xb3,0x0, 0x1, 0xbe,0xb1,0x27,0x28,0x2, +0x61,0x28,0xb, 0xf0,0x7e,0x39,0xb0,0xbc,0xbf,0x28,0x2, 0x61,0x1c,0xda,0x3b,0x22, +0x7d,0xdf,0x3e,0xd4,0x7d,0xed,0x2d,0xe1,0x22,0x7d,0x6e,0x7a,0xd1,0x82,0x7a,0xc1, +0x83,0xe4,0x93,0x22,0xca,0x3b,0x7d,0x42,0x7d,0xf3,0x49,0x21,0x0, 0xb, 0x6d,0x33, +0x2e,0xf4,0x1, 0xf8,0x7d,0x5f,0xf5,0xb9,0xa, 0x5a,0xf5,0xba,0x75,0xbb,0xf, 0x75, +0xbc,0x5, 0x7e,0xf4,0xc, 0x40,0x7d,0x5f,0xf5,0xbd,0xa, 0x5a,0xf5,0xc1,0x75,0xc3, +0x0, 0x9, 0xa4,0x0, 0x2f,0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0x9, 0xb4,0x0, +0x1, 0x4c,0xba,0xf5,0xc3,0x7e,0x49,0xb0,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, +0x49,0x41,0x0, 0x3, 0x7c,0xb9,0xf5,0xc6,0x1a,0x58,0xf5,0xc6,0x6e,0x44,0xff,0xff, +0xb, 0x44,0x7d,0x54,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x1a,0x58,0x5e,0x54,0x0, 0xff, +0xf5,0xc6,0x7c,0xb5,0xf5,0xc6,0xa, 0x54,0xf5,0xc6,0x75,0xc2,0x9, 0x80,0x7, 0x43, +0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x75,0xc5, +0xc, 0x7e,0x51,0xc6,0x7e,0xa1,0xc6,0x6c,0x44,0x80,0x29,0x7e,0xf0,0x2, 0xac,0xf4, +0x49,0x47,0xc, 0x40,0x7d,0x64,0xa, 0x6c,0x7c,0xbd,0x3e,0xb0,0x7d,0xf7,0x2d,0xf0, +0x7a,0xf9,0xb0,0x3e,0x90,0x7e,0xf0,0x2, 0xac,0xf4,0x7d,0xf7,0x2d,0xf0,0x19,0x9f, +0x0, 0x1, 0xb, 0x40,0xbc,0x54,0x38,0xd3,0x6c,0x44,0x80,0x27,0x7e,0x90,0x2, 0xac, +0x94,0x49,0xf4,0xc, 0x5e,0x7d,0x7f,0xa, 0x7e,0x7c,0xbf,0x3e,0xb0,0x7d,0xe4,0x2d, +0xe0,0x19,0xbe,0x1, 0x3b,0x7d,0x7f,0x7c,0xbf,0x3e,0xb0,0x2d,0x40,0x19,0xb4,0x1, +0x3c,0xb, 0x40,0xbc,0xa4,0x38,0xd5,0x19,0x50,0x0, 0x41,0x19,0xa0,0x1, 0x3a,0x12, +0x2f,0xc1,0x54,0xfe,0x7a,0x39,0xb0,0x75,0xc5,0xa, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6, +0xa, 0x2b,0x2d,0x32,0x9, 0x51,0x0, 0xd, 0xa, 0x15,0xbd,0x13,0x50,0x8, 0x12,0x2f, +0xc1,0x44,0x1, 0x7a,0x39,0xb0,0xda,0x3b,0x22,0xd2,0xc9,0xc2,0xaf,0x75,0xf1,0x0, +0x12,0x4d,0x6d,0x75,0xf5,0x3, 0xa9,0x37,0xf5,0xfc,0x2, 0x7, 0x75,0xf5,0xf2,0x75, +0xf3,0x80,0x75,0xf4,0x0, 0x22,0xd2,0x3, 0xa9,0xc1,0xdb,0xc2,0xc3,0x53,0xdb,0xbf, +0x32,0x60,0x5, 0x7e,0xa0,0xa, 0x80,0x2, 0x6c,0xaa,0xe5,0xdc,0x54,0xe0,0xa, 0x2b, +0xa, 0x3a,0x2d,0x32,0x7c,0xb7,0xf5,0xdc,0x22,0x70,0x4, 0x53,0xdb,0xbf,0x22,0x43, +0xdb,0x40,0x22,0x12,0x4e,0x70,0xf5,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0xe5,0xd6,0xf5, +0x19,0x53,0xdb,0xf3,0x7a,0x71,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0xe5,0xd6,0xf5,0x1a, +0x53,0xdb,0xf3,0x43,0xd7,0x4, 0x7e,0x35,0x19,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63, +0x6d,0x33,0x7a,0x35,0x29,0xe4,0x7e,0x35,0x29,0x2d,0x36,0x7e,0x39,0x70,0x12,0x4e, +0x85,0x7a,0x35,0x2b,0x7e,0x35,0x29,0x4d,0x33,0x78,0xa, 0x7e,0x35,0x2b,0x4e,0x34, +0x20,0x0, 0x7a,0x35,0x2b,0x7e,0x35,0x2b,0x12,0x4e,0x62,0xbe,0x34,0x0, 0xc, 0x78, +0xd4,0x7e,0x34,0x0, 0xc, 0x7a,0x35,0x29,0x74,0xc0,0x6c,0x77,0x12,0x4e,0x64,0xbe, +0x34,0x0, 0x24,0x78,0xf3,0x6d,0x33,0x7a,0x35,0x29,0x7e,0x35,0x29,0x3e,0x34,0x2d, +0x37,0x7e,0x39,0xb0,0x9, 0x73,0x0, 0x1, 0x12,0x4e,0x77,0x7a,0x35,0x2b,0x12,0x4e, +0x62,0xbe,0x34,0x0, 0x6, 0x78,0xe3,0x75,0x9d,0x0, 0x75,0x9e,0x0, 0x6d,0x33,0x7a, +0x35,0x29,0x7e,0x35,0x29,0x7d,0x23,0x2e,0x24,0x1, 0x83,0x12,0x16,0xbd,0x93,0xf5, +0x9f,0xb, 0x34,0x7a,0x35,0x29,0xbe,0x34,0x1, 0x0, 0x40,0xe6,0x75,0x9d,0x1, 0xda, +0x3b,0x22,0xa, 0x56,0x12,0x4d,0xa3,0x7e,0x35,0x29,0xb, 0x34,0x7a,0x35,0x29,0x22, +0x53,0xd7,0x3, 0x53,0xdb,0xf3,0x22,0x12,0x1f,0x6, 0x3e,0x34,0x2e,0x34,0xc0,0x0, +0xa, 0x2b,0x2d,0x32,0x22,0x7c,0xa7,0xa, 0x3b,0x12,0x1f,0x8, 0x3e,0x34,0x3e,0x34, +0x2e,0x34,0xc0,0x0, 0xa, 0x2a,0x2d,0x32,0x22,0x12,0x4e,0x70,0x44,0x80,0xf5,0xd6, +0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x75,0xd6,0x0, 0xe5,0xdb,0x30,0xe3,0xfb, +0xe5,0xd6,0x43,0xd7,0x4, 0x22,0x6c,0x77,0x6d,0x22,0x80,0xe, 0xb, 0x70,0xa5,0xbf, +0xff,0x2, 0xb, 0x24,0xbe,0x24,0x3, 0xe8,0x68,0x3, 0x30,0x3, 0xef,0xc2,0x3, 0x53, +0xdb,0xfe,0x53,0xdb,0xfd,0xc2,0xeb,0x22,0xe4,0x7e,0x70,0x3, 0x12,0x17,0xcb,0x60, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xe4,0x6c,0x77,0x12,0x17,0xcb,0x60,0x3, 0x74,0x1, +0x22,0xe4,0x22,0x75,0xca,0x0, 0xa, 0x5b,0x3e,0x54,0xb, 0x54,0xf5,0xca,0x22,0xe4, +0x7a,0xb3,0xa, 0xd2,0x74,0x1, 0x7a,0xb3,0xa, 0xd3,0x7e,0x73,0x4, 0x24,0x7a,0x73, +0xa, 0xd4,0x22,0x74,0x1a,0x7a,0xb3,0x4, 0x24,0xe4,0x7a,0xb3,0x4, 0x27,0x74,0x2, +0x7a,0xb3,0x4, 0x28,0x74,0x2, 0x22,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfd, +0xf, 0x75,0xfe,0xf, 0x22,0x7e,0x34,0x4, 0x2a,0x7a,0x37,0xa, 0x9b,0x22,0x74,0xff, +0x7a,0xb3,0xb, 0x2c,0x22,0x7e,0x34,0x4, 0x2a,0x7e,0x24,0x1, 0xf8,0xe4,0x22,0x7e, +0x37,0xa, 0xa4,0x4d,0x33,0x22,0x2e,0x14,0x6, 0x22,0x74,0x7, 0x2, 0x1, 0x39,0x7a, +0xb3,0xa, 0xd2,0xe4,0x7a,0xb3,0xa, 0xd3,0x22,0x7a,0x37,0xb, 0xe8,0x7e,0x37,0xb, +0xe8,0x22,0x7e,0xb3,0xb, 0xdf,0x2e,0xb3,0xb, 0xea,0x22,0x7c,0xbf,0x2e,0xb3,0xb, +0xea,0x24,0xfe,0x22,0x7e,0x73,0x0, 0x7f,0x7a,0x73,0x3, 0xa4,0x22,0x7e,0x34,0x3, +0xe8,0x7a,0x37,0x4, 0x25,0x22,0xe5,0x28,0xa, 0x1b,0x9, 0xb1,0x6, 0x45,0x22,0x7e, +0x24,0x0, 0xc, 0xe4,0x2, 0x0, 0x46,0x4f,0xa7,0xb0,0x58,0xe3,0x1c,0xf, 0x79, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x23_test_app.h b/drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x23_test_app.h new file mode 100644 index 00000000..869eae4b --- /dev/null +++ b/drivers/input/touchscreen/focaltech/Ft5x16_720P_Ver0x23_test_app.h @@ -0,0 +1,1485 @@ +0x2, 0x2, 0x7f,0x2, 0x4f,0xa4,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x18,0x60,0x13,0x14, +0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x13,0x22,0x2, 0x4f,0x10,0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x2, 0x5, +0x94,0x22,0x22,0x2, 0x4f,0x54,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, +0x14,0x4d,0x22,0x78,0xf5,0x22,0x2, 0x6, 0xa9,0xff,0xff,0x2, 0x59,0x76,0x2, 0x6, +0xb0,0xff,0xff,0x2, 0x4f,0x9d,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff, +0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5, +0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21, +0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d, +0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22, +0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f, +0x12,0x12,0x0, 0xb4,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x0, 0xb4,0x30, +0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e, +0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1e, +0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, 0x1c,0xb, 0x14, +0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x22,0x0, +0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, +0x1, 0x2, 0x3, 0x4, 0x4, 0x3, 0x2, 0x0, 0x2, 0x3, 0x5, 0x5, 0x5, 0x4, 0x2, 0x0, +0x2, 0x4, 0x6, 0x6, 0x6, 0x5, 0x3, 0x0, 0x3, 0x5, 0x7, 0x8, 0x7, 0x6, 0x3, 0x0, +0x3, 0x6, 0x8, 0x9, 0x9, 0x7, 0x4, 0x0, 0x4, 0x7, 0xa, 0xb, 0xa, 0x8, 0x4, 0x0, +0x4, 0x8, 0xb, 0xc, 0xb, 0x9, 0x5, 0x0, 0x5, 0x9, 0xc, 0xd, 0xd, 0xa, 0x5, 0x0, +0x5, 0xa, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, +0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x0, 0x6, 0xb, 0xe, 0xf, 0xe, 0xb, 0x6, 0x75, +0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8, +0xe, 0x7b,0x75,0x5c,0x0, 0x75,0x57,0x0, 0x75,0x1d,0x0, 0xd2,0x0, 0x75,0x8, 0xb, +0x75,0x9, 0xb8,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0x75, +0x14,0x0, 0x75,0x15,0x0, 0x75,0x18,0x0, 0x75,0x19,0x0, 0x75,0x1a,0x0, 0x75,0x1c, +0x1, 0xc2,0x2, 0x75,0x58,0x0, 0x75,0x59,0x0, 0x75,0x5d,0x0, 0x75,0x5e,0x0, 0xc2, +0x3, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x3, 0xdc,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a, +0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0, +0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x5, 0xc8,0xb, 0xa, 0x9, +0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0x0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x2, 0x2, +0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, +0x2, 0x2, 0x2, 0x0, 0x0, 0x0, 0x78,0x2, 0x58,0x2, 0xd0,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x82,0x2, 0x76,0x3c,0x3c,0x3c,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c, +0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0x22,0x1d,0x1f,0x20, +0x1c,0x1b,0xe, 0x0, 0x64,0x64,0x64,0x64,0x64,0x64,0x2, 0x2, 0x2, 0x2, 0x2, 0x2, +0x2, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x7d,0x3, 0x80,0xa, 0x7e,0x29,0xb0,0x7a, +0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55,0x78,0xee,0x22,0x10, +0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x0, 0x55, +0x0, 0x50,0x0, 0x50,0x0, 0x50,0x0, 0x50,0x0, 0x50,0x0, 0x50,0x13,0x14,0x13,0x13, +0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x13,0x13,0x14,0x13,0x13,0x13,0x13,0x13,0x13, +0x13,0x13,0x14,0x13,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x0, 0x1, 0xe, 0x76, +0x0, 0x0, 0x1, 0xe, 0x77,0x0, 0x0, 0x2, 0x6, 0x92,0x0, 0x1, 0x0, 0x2, 0xb, 0x9, +0x0, 0x0, 0x0, 0x1, 0xd, 0x6b,0x0, 0x0, 0x1, 0xd, 0x6d,0x0, 0x0, 0x2, 0xd, 0x6e, +0x0, 0x0, 0x0, 0x1, 0xd, 0x72,0x0, 0x0, 0x2, 0xd, 0x73,0x0, 0x0, 0x0, 0x1, 0xd, +0x78,0x0, 0x0, 0x1, 0xd, 0x79,0x0, 0x0, 0x2, 0xe, 0x78,0x0, 0x0, 0x0, 0x1, 0xe, +0x7a,0x0, 0x0, 0x1, 0xe, 0x7b,0x0, 0x0, 0x2, 0xe, 0x65,0x0, 0x0, 0x0, 0x2, 0xb, +0x3d,0xb, 0x43,0x1, 0x40,0xb, 0x43,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10,0xc, 0x83,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xc, 0x93,0x0, +0x0, 0x0, 0x0, 0x0, 0xc2,0x8e,0x75,0x89,0x10,0x75,0x9b,0x0, 0x12,0x18,0xf, 0xd2, +0xab,0x22,0x12,0x5, 0xa8,0x2, 0x0, 0x3e,0x12,0x4f,0xa0,0xe4,0x12,0x4f,0xda,0x12, +0x4f,0xf8,0x12,0x0, 0x42,0x12,0x0, 0x2a,0x12,0x50,0x4, 0x74,0x1, 0x2, 0x5, 0xc0, +0x70,0x3, 0xc2,0xaf,0x22,0xd2,0xaf,0x22,0x12,0x15,0xc9,0x12,0x0, 0x56,0x12,0x5, +0xa2,0x12,0x0, 0x5e,0xa9,0xd3,0xf7,0xc2,0xfb,0x12,0x6, 0xd6,0x12,0x1b,0x8a,0x12, +0x13,0xd, 0x12,0x1a,0x12,0x7e,0xb3,0xc, 0xbf,0x24,0xfd,0x68,0x14,0x14,0x68,0x16, +0x24,0xaf,0x68,0x30,0x24,0xab,0x68,0x13,0x24,0xa9,0x78,0xe9,0x12,0x39,0x7a,0x80, +0xe4,0x12,0x9, 0xf0,0x80,0xdf,0x12,0x15,0x97,0x80,0xda,0x12,0x6, 0x3c,0x7e,0xb3, +0x3, 0xe1,0xbe,0xb0,0xaa,0x68,0xce,0xe4,0x7a,0xb3,0x2, 0xe8,0x74,0xaa,0x7a,0xb3, +0x3, 0xe1,0x80,0xc1,0x12,0x6, 0x3c,0x7e,0xb3,0x3, 0xe1,0xb4,0xaa,0xb7,0x74,0x55, +0x7a,0xb3,0x3, 0xe1,0x12,0x7, 0x70,0x75,0xe9,0xff,0x80,0xa9,0x6d,0x33,0x7a,0x37, +0x3, 0xdf,0x22,0x7e,0x34,0x0, 0x61,0x7e,0x24,0x1, 0x6b,0xe4,0x12,0x0, 0x46,0x7e, +0x34,0x3, 0x83,0x7e,0x24,0x0, 0x5c,0xe4,0x12,0x0, 0x46,0x7e,0x34,0x0, 0x7f,0x12, +0x6, 0xa0,0x7e,0x34,0x3, 0x87,0x12,0x6, 0xa0,0x7e,0x34,0x3, 0xaa,0x12,0x6, 0xa0, +0x74,0x1, 0x7a,0xb3,0x3, 0xd5,0x75,0x17,0x0, 0x75,0x1b,0x0, 0x75,0x16,0x0, 0x75, +0x10,0x0, 0x12,0x6, 0x3c,0x7e,0x24,0xd, 0xac,0x7a,0x27,0x0, 0x5f,0xe4,0x7a,0xb3, +0x2, 0xe8,0x7a,0xb3,0x3, 0xe1,0x7a,0x37,0x3, 0xe2,0xc2,0x1, 0x7a,0x35,0xa, 0x22, +0x7e,0x24,0x0, 0x23,0x74,0xff,0x2, 0x0, 0x46,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22, +0x43,0xdb,0x10,0xd2,0xd9,0xc2,0xdd,0xc2,0xdc,0xc2,0xdb,0xc2,0xda,0xd2,0xd8,0x75, +0xd7,0x6, 0xc2,0xea,0x2, 0x6, 0xc7,0xc2,0x3, 0x53,0xdb,0xfd,0xd2,0xeb,0xc2,0xc3, +0xa9,0xd3,0xf7,0xd2,0xfb,0x22,0xe4,0x7a,0xb3,0xd, 0x75,0x12,0x7, 0x25,0x2, 0x6, +0xe1,0xca,0xf8,0x6d,0x33,0x7a,0x37,0xd, 0x73,0xe4,0x7a,0xb3,0xd, 0x6b,0x7e,0xb3, +0xd, 0x75,0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0x5, 0x12,0x4e,0xec,0x80,0xd, 0xbe, +0xf0,0x4, 0x40,0x8, 0xbe,0xf0,0x5, 0x68,0x3, 0x12,0x4e,0xe2,0xe4,0x12,0x4f,0x64, +0x74,0xaa,0x7a,0xb3,0xd, 0x1e,0x7a,0xb3,0xd, 0x1f,0x7a,0xb3,0xd, 0x42,0x7a,0xb3, +0xd, 0x43,0xda,0xf8,0x22,0x2, 0x7, 0x28,0xca,0x79,0x7e,0xf0,0x70,0x7e,0x34,0x78, +0x0, 0x12,0x14,0x1b,0x7c,0xeb,0x7e,0x34,0x78,0x1, 0x12,0x14,0x1b,0xbe,0xe0,0xff, +0x68,0xc, 0x6c,0xbe,0xb4,0xff,0x7, 0x7c,0xbe,0x20,0xe0,0x2, 0x7c,0xfe,0x75,0x91, +0x0, 0xc2,0x90,0xc2,0x91,0xd2,0xce,0x7c,0xbf,0x54,0xfe,0xf5,0x92,0xd2,0xad,0xd2, +0xe8,0xc2,0xc0,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xd5,0xb7,0xd2,0xbd,0xda,0x79,0x22, +0x7e,0x34,0x6f,0xf8,0x74,0x66,0x12,0x8, 0x0, 0x7e,0x34,0x6f,0xf9,0x74,0xbb,0x2, +0x8, 0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x7c,0xab,0x7d,0x23,0x12,0x5c,0x51,0x7d,0x12,0x5e,0x14,0x0, 0x1, 0x68,0x2, 0x1b, +0x24,0xa, 0x14,0x7c,0xb3,0xf5,0xf1,0x7c,0xb5,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4, +0x1, 0x75,0xf5,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6, +0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0xa9,0x36,0xf5,0xfc,0x43,0xfa,0x80,0x2, +0x8, 0x42,0x75,0xfd,0xf, 0x75,0xfe,0xf0,0xa9,0xc5,0xcb,0xc2,0xc9,0xd2,0xaf,0x22, +0x12,0x5c,0x51,0x75,0xf3,0x0, 0xa, 0x56,0x1e,0x54,0x1e,0x54,0x3e,0x54,0x3e,0x54, +0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf9,0x0, 0x75,0xf9,0x10,0x75,0xf9,0x50,0x74,0xa, +0x12,0x8, 0x91,0x75,0xf9,0x51,0x74,0x2d,0x12,0x8, 0xa6,0x75,0xf9,0x11,0x74,0xa, +0x12,0x8, 0x91,0x75,0xf9,0x10,0x75,0xf9,0x0, 0x74,0x1, 0x12,0x8, 0x91,0x2, 0x8, +0x42,0x7c,0xab,0x80,0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7c,0x7a,0x1b, +0xa0,0xa5,0xbf,0x0, 0xf0,0x22,0x7c,0x6b,0x80,0xe, 0x74,0xfa,0x12,0x8, 0x91,0x12, +0x8, 0x91,0x12,0x8, 0x91,0x12,0x8, 0x91,0x7c,0x76,0x1b,0x60,0xa5,0xbf,0x0, 0xea, +0x22,0x2e,0x34,0x7c,0x0, 0x2, 0x8, 0x0, 0xca,0x3b,0x7c,0xcb,0x12,0x5c,0x71,0x12, +0x9, 0xe6,0x60,0xfb,0x12,0xb, 0x82,0x12,0x9, 0xe6,0x60,0xfb,0x12,0xf, 0xb8,0x12, +0x10,0x5e,0x12,0x5c,0x5f,0x6d,0x33,0x7d,0x73,0x6c,0xdd,0x4d,0x77,0x78,0xa, 0x6d, +0x11,0x12,0x9, 0xdf,0xa, 0x2b,0x1b,0x28,0x10,0xa, 0x2d,0x2e,0x24,0x3, 0xc8,0x12, +0x17,0x54,0x93,0xa, 0x2b,0xbd,0x27,0x40,0x25,0x7e,0x14,0x0, 0xc, 0xad,0x17,0x3e, +0x14,0x7e,0x50,0x2, 0xac,0x5d,0x2d,0x21,0x2e,0x27,0xe, 0xf, 0xb, 0x28,0x10,0x12, +0x9, 0xdf,0xa, 0x2b,0xb, 0x28,0x0, 0xbd,0x10,0x28,0x3, 0x1b,0x28,0x10,0xb, 0xd0, +0xbe,0xd0,0xc, 0x78,0xb6,0xb, 0x74,0xbe,0x74,0x0, 0x15,0x78,0xac,0x7d,0x73,0x6c, +0xdd,0xa, 0x3d,0x2e,0x34,0x3, 0xc8,0x12,0x13,0x4, 0xa, 0x3b,0xbd,0x37,0x40,0x31, +0x7e,0xf4,0x0, 0xc, 0xad,0xf7,0x7d,0xef,0x3e,0xe4,0x74,0x2, 0xac,0xbd,0x2d,0xe5, +0x2e,0xe7,0xe, 0xf, 0xb, 0xe8,0x20,0x12,0x9, 0xdf,0xa, 0x3b,0xb, 0x38,0x30,0x9d, +0x32,0x7d,0x23,0x5e,0x24,0xff,0xf8,0xa, 0x1d,0x2d,0x1f,0x3e,0x14,0x59,0x21,0x4, +0x55,0xb, 0xd0,0xbe,0xd0,0xc, 0x78,0xb9,0xb, 0x74,0xbe,0x74,0x0, 0x15,0x78,0xaf, +0x7e,0x34,0x3, 0xe4,0x7a,0x35,0x21,0x75,0x23,0x0, 0x6d,0x77,0x7e,0x35,0x21,0x7e, +0x39,0x70,0x7c,0xb7,0x62,0x23,0xa, 0x3c,0x2d,0x37,0x7e,0x25,0x21,0x7d,0x12,0xb, +0x14,0x7a,0x15,0x21,0x7e,0x29,0xb0,0x12,0x8, 0xc1,0xb, 0x74,0xbe,0x74,0x2, 0x69, +0x40,0xda,0x7e,0x34,0x3, 0xf0,0xe5,0x23,0x12,0x8, 0xc1,0x7e,0x34,0x3, 0xf1,0x74, +0xff,0x9e,0xb1,0x23,0x12,0x8, 0xc1,0x12,0xb, 0x82,0x74,0x1, 0xda,0x3b,0x22,0x7c, +0xbd,0x3e,0xb0,0x24,0x24,0x22,0x30,0x3, 0x5, 0xc2,0x3, 0x74,0x1, 0x22,0xe4,0x22, +0xca,0xf8,0x12,0x5c,0x5f,0x12,0x5c,0x68,0x53,0xdb,0xf0,0x12,0x41,0x41,0x12,0x1b, +0x99,0x12,0x15,0xd8,0x12,0x16,0x48,0x12,0xa, 0xb5,0x12,0x37,0xe7,0x53,0xdb,0x7f, +0x12,0xb, 0x82,0x74,0xc, 0x7a,0xb3,0xe, 0x2f,0x74,0x15,0x7a,0xb3,0xe, 0x2e,0x12, +0x5c,0x1f,0x12,0x41,0x55,0x7a,0xb3,0xb, 0x4, 0x12,0x15,0xc9,0x7e,0xb3,0xe, 0x2b, +0x70,0x24,0x12,0x17,0xfa,0x74,0x1, 0x7a,0xb3,0xe, 0x2b,0x7e,0x34,0x7c,0x0, 0x12, +0x1b,0xa5,0x74,0x4, 0x12,0x8, 0xc8,0x6d,0x33,0xe4,0x12,0x8, 0xc1,0x12,0x17,0x76, +0x74,0xff,0x7a,0xb3,0xe, 0x2b,0x7e,0xf3,0xe, 0x2c,0xbe,0xf0,0x3, 0x78,0x46,0x7e, +0xb3,0xd, 0x75,0x30,0xe7,0xc3,0x12,0x15,0xd8,0x80,0x3, 0x43,0x87,0x1, 0x12,0x9, +0xe6,0x60,0xf8,0x53,0xdb,0xf0,0x12,0x16,0x48,0x12,0xa, 0xb5,0x12,0x37,0xe7,0x7e, +0xb3,0xe, 0x34,0x70,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0x12,0x5c,0x7d,0x12,0xf, 0xb8, +0x12,0x10,0x5e,0x12,0xb, 0x82,0x12,0x5c,0x5f,0x7e,0xb3,0xd, 0x75,0x54,0x7f,0x7a, +0xb3,0xd, 0x75,0x80,0x84,0x7a,0xf3,0xc, 0xbf,0x12,0x5a,0xc2,0xda,0xf8,0x22,0x74, +0x23,0x7a,0xb3,0xb, 0x6, 0x12,0x48,0x72,0x7e,0x34,0x3, 0x21,0xca,0x3b,0x7d,0x73, +0x6c,0xdd,0x49,0x37,0x0, 0x5d,0x12,0x1f,0x2c,0x1e,0x34,0x7c,0xc7,0xe4,0x7e,0x79, +0x70,0x12,0xb, 0x6b,0x74,0x2, 0x9, 0x77,0x0, 0x2, 0x12,0xb, 0x6b,0x74,0x3, 0x9, +0x77,0x0, 0x3, 0x12,0xb, 0x6b,0x74,0x4, 0x9, 0x77,0x0, 0x4, 0x12,0xb, 0x6b,0x74, +0x5, 0x9, 0x77,0x0, 0x5, 0x12,0xb, 0x6b,0x74,0x6, 0x9, 0x77,0x0, 0x5f,0x12,0xb, +0x6b,0x74,0x8, 0x9, 0x77,0x0, 0x6, 0x12,0xb, 0x6b,0x74,0x9, 0x9, 0x77,0x0, 0x7, +0x12,0xb, 0x6b,0x74,0xa, 0x7c,0x7c,0x12,0xb, 0x6b,0x74,0x1, 0x6c,0x77,0x12,0xb, +0x6b,0x6c,0xcc,0x80,0x3b,0x12,0xb, 0x74,0x24,0x10,0xa, 0x3c,0x2d,0x37,0x9, 0x73, +0x0, 0x47,0x12,0xb, 0x71,0x24,0x11,0xa, 0x3c,0x2d,0x37,0x9, 0x73,0x0, 0x8, 0x12, +0xb, 0x71,0x24,0x12,0xa, 0x3c,0x2d,0x37,0x9, 0x73,0x0, 0x1d,0x12,0xb, 0x71,0x24, +0x13,0xa, 0x3c,0x2d,0x37,0x9, 0x73,0x0, 0x32,0x12,0xb, 0x6b,0xb, 0xd0,0xb, 0xc0, +0x9, 0x77,0x0, 0x5, 0xbc,0x7c,0x38,0xbd,0xda,0x3b,0x22,0xf5,0xd9,0x7a,0x71,0xda, +0x22,0x12,0xb, 0x6b,0x7c,0xbd,0x3e,0xb0,0x3e,0xb0,0x22,0x7e,0xb3,0x4, 0x4f,0x12, +0x15,0x41,0x53,0xdb,0xfd,0xd2,0xeb,0x43,0xdb,0x1, 0x43,0xdb,0x20,0x22,0xca,0x3b, +0x7c,0xdb,0x6c,0xcc,0x12,0x5c,0x90,0x78,0x3e,0x7e,0x27,0x1, 0xce,0xbe,0x24,0x0, +0x1, 0x78,0x2, 0xa1,0xbf,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x1, 0xce,0x7e,0xb3,0x2, +0xb, 0x60,0x10,0x74,0x2, 0x7a,0xb3,0x2, 0x9, 0x7e,0x53,0x2, 0xb, 0x7a,0x53,0x1, +0xd9,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x2, 0x9, 0xe4,0x7a,0xb3,0x1, 0xd8,0x7a,0xb3, +0x2, 0xf, 0x12,0x5b,0xf4,0xa1,0xbf,0xbe,0x34,0x0, 0x2, 0x78,0x56,0x7e,0x27,0x1, +0xce,0xbe,0x24,0x0, 0x2, 0x68,0x36,0x7e,0x24,0x0, 0x2, 0x7a,0x27,0x1, 0xce,0x74, +0x7, 0x7a,0xb3,0x2, 0x9, 0xe4,0x7a,0xb3,0x2, 0xf, 0x12,0x5c,0xb4,0x7a,0xb3,0x2, +0x10,0x12,0x5b,0xf4,0x6c,0xff,0x6d,0x22,0x74,0x2, 0xac,0xbf,0x59,0x25,0x1, 0xe8, +0xa, 0x2f,0x19,0xf2,0x1, 0xd8,0xb, 0xf0,0xbe,0xf0,0x7, 0x78,0xe9,0x7e,0x53,0x2, +0xa, 0xbe,0x53,0x2, 0x12,0x28,0x2, 0xa1,0xbf,0x7e,0x24,0x0, 0x3, 0x7a,0x27,0x1, +0xcc,0xa1,0xbf,0xbe,0x34,0x0, 0x3, 0x68,0x2, 0xa1,0xa7,0x7e,0x37,0x1, 0xce,0xbe, +0x34,0x0, 0x3, 0x78,0x2, 0xa1,0xbf,0x7e,0x34,0x7f,0xff,0x7e,0xe0,0xff,0x6d,0x22, +0x7a,0x25,0x27,0x6c,0xff,0x80,0x17,0xa, 0x1f,0x9, 0xa1,0x1, 0xd8,0x74,0x2, 0xa4, +0x49,0x25,0x1, 0xe8,0xbe,0x25,0x27,0x28,0x3, 0x7a,0x25,0x27,0xb, 0xf0,0x7e,0xa3, +0x2, 0x9, 0xbc,0xaf,0x38,0xe1,0x6c,0xff,0x80,0x44,0x7e,0x44,0x0, 0x1, 0x7c,0xbf, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0xb3,0x2, 0x11,0xa, 0x2b,0x5d,0x24,0x78, +0x2b,0xa, 0x4f,0x9, 0x54,0x1, 0xd8,0x7e,0x30,0x2, 0xac,0x35,0x49,0x11,0x1, 0xe8, +0xbd,0x13,0x50,0x18,0x7c,0xe5,0x7e,0x70,0x2, 0xac,0x7e,0x49,0x33,0x1, 0xe8,0x7e, +0x43,0x2, 0xa, 0x7e,0x50,0x14,0xac,0x45,0xbd,0x23,0x38,0x6, 0xb, 0xf0,0xbc,0xaf, +0x38,0xb8,0xbe,0xe0,0xff,0x78,0x2, 0xa1,0x95,0x7e,0xa3,0x2, 0xb, 0xbc,0xae,0x78, +0x2, 0xa1,0x95,0x7e,0x35,0x27,0xbe,0x34,0x0, 0x64,0x38,0x2, 0xa1,0x95,0x74,0x2, +0xa4,0x49,0x25,0x1, 0xe8,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1, 0xe8,0x9d,0x32,0x12, +0x0, 0x2e,0x7e,0xa3,0x2, 0xb, 0x74,0x2, 0xa4,0x49,0x25,0x1, 0xe8,0x1e,0x24,0xbd, +0x32,0x38,0x2, 0xa1,0x95,0x4c,0xdd,0x68,0x2, 0xa1,0x92,0x7e,0x34,0x0, 0x4, 0x7a, +0x37,0x1, 0xcc,0xa, 0x3e,0x9, 0x53,0x1, 0xd0,0x7a,0x53,0x4, 0x4f,0x9, 0x53,0x2, +0x0, 0x7a,0x53,0x4, 0x54,0x7a,0x53,0xc, 0xa4,0x7e,0x53,0x4, 0x4f,0x7a,0x53,0xc, +0xa2,0x9, 0x73,0x1, 0xe0,0x7a,0x73,0xc, 0xa6,0x7a,0xe3,0x2, 0xb, 0xa, 0x3e,0x9, +0xe3,0x1, 0xf8,0x6c,0xff,0xa, 0x3f,0x2e,0x34,0x4, 0x9, 0x7e,0x39,0x50,0x9e,0x53, +0x4, 0x52,0x7a,0x39,0x50,0x7e,0x39,0xb0,0x2c,0xbe,0x7a,0x39,0xb0,0xb, 0xf0,0xbe, +0xf0,0x15,0x78,0xe1,0x7a,0xe3,0x4, 0x52,0x7a,0xe3,0xc, 0xa5,0x12,0x5c,0xa2,0x12, +0x9, 0xe6,0x60,0xfb,0x12,0xe, 0xf7,0x12,0x15,0xc2,0x12,0x15,0xd8,0x12,0xa, 0xb5, +0x12,0xf, 0xb5,0x12,0xf, 0xdb,0x7e,0x34,0x0, 0x3, 0x7a,0x37,0x1, 0xce,0x74,0x1, +0xc1,0xf4,0x7e,0xc0,0x1, 0x4c,0xcc,0x78,0x26,0x12,0x5c,0x99,0x68,0x3, 0x12,0x5c, +0x48,0x7e,0x34,0x0, 0x3, 0x80,0x14,0x12,0x5c,0x99,0x78,0x13,0x7e,0x37,0x1, 0xce, +0xbe,0x34,0x0, 0x4, 0x68,0x9, 0x12,0x5c,0x48,0x6d,0x33,0x7a,0x37,0x1, 0xce,0x12, +0x4f,0x6d,0x12,0xe, 0xf7,0x12,0x15,0xd8,0x12,0xa, 0xb5,0x12,0xb, 0x82,0xe4,0x7a, +0xb3,0xb, 0x4, 0x74,0x1, 0x7a,0xb3,0xb, 0x3, 0x12,0xf, 0xb8,0x12,0x10,0x5e,0x7e, +0x34,0x1, 0xcc,0x7e,0x24,0x6, 0xb7,0x7e,0x14,0xa, 0xd8,0x12,0x2d,0x45,0x74,0x1, +0x7a,0xb3,0xb, 0x4, 0xe4,0x7a,0xb3,0xb, 0x3, 0x12,0x5c,0x90,0x78,0x53,0x7e,0x53, +0x2, 0xf, 0xa, 0x25,0x9, 0x52,0x1, 0xd8,0xbe,0x53,0x2, 0xb, 0x68,0x2, 0xc1,0xf3, +0x7e,0xb3,0xe, 0x7b,0xbe,0xb0,0xc8,0x50,0x16,0x4, 0x7a,0xb3,0xe, 0x7b,0x7e,0x27, +0x2, 0x13,0xbe,0x24,0x0, 0x78,0x28,0x10,0x7e,0xb3,0xe, 0x7a,0x4, 0x80,0x5, 0xe4, +0x7a,0xb3,0xe, 0x7b,0x7a,0xb3,0xe, 0x7a,0x7e,0x53,0xe, 0x7a,0xbe,0x50,0x3, 0x50, +0x2, 0xc1,0xf3,0x7e,0x24,0x0, 0x2, 0x7a,0x27,0x1, 0xcc,0xe4,0x12,0x5c,0x87,0xc1, +0xf3,0xbe,0x34,0x0, 0x2, 0x68,0xe, 0xbe,0x34,0x0, 0x6, 0x68,0x8, 0xbe,0x34,0x0, +0x5, 0x68,0x2, 0xc1,0xf3,0x7e,0xb3,0x2, 0x12,0xbe,0xb3,0x2, 0x10,0x28,0x2, 0xc1, +0xf3,0xbe,0xd0,0x0, 0x28,0x7d,0x7e,0xa3,0x2, 0xa, 0xbe,0xa3,0x2, 0x12,0x28,0x13, +0xbe,0xb3,0x2, 0x10,0x50,0xd, 0x4, 0x7a,0xb3,0x2, 0x12,0x7e,0x73,0x2, 0x12,0x7a, +0x73,0x2, 0x10,0x7e,0x63,0x2, 0xf, 0xa, 0x26,0x9, 0x72,0x1, 0xd8,0x4c,0x77,0x68, +0x24,0xbe,0x73,0x2, 0xb, 0x68,0x1e,0x7e,0x27,0x2, 0x13,0xbe,0x24,0x1, 0x2c,0x28, +0x14,0x7e,0x70,0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0x70,0x14,0x78,0xfb,0x4e,0x73,0x2, +0x11,0x7a,0x73,0x2, 0x11,0x7e,0x73,0x2, 0xf, 0xa, 0x27,0x9, 0xa2,0x1, 0xd8,0x74, +0x2, 0xa4,0x49,0x45,0x1, 0xe8,0x2e,0x47,0x2, 0x13,0xbe,0x44,0x7f,0xff,0x50,0xb, +0x7d,0x35,0x2e,0x34,0x1, 0xe8,0x1b,0x38,0x40,0x80,0x8, 0x7e,0x34,0x7f,0xff,0x59, +0x35,0x1, 0xe8,0xe4,0xda,0x3b,0x22,0x53,0xdb,0xf0,0x74,0xe, 0x7e,0x73,0x4, 0x53, +0x12,0x59,0xbf,0x44,0x40,0xf5,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x7a, +0x71,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb,0xf3,0x43,0xd7,0x4, 0x22,0xca,0x79, +0x7d,0x73,0x74,0x6, 0x9, 0x77,0x0, 0x19,0x12,0xf, 0x0, 0x74,0xa, 0x9, 0x77,0x0, +0x1a,0x12,0xf, 0x0, 0x74,0x8, 0x9, 0x77,0x0, 0x20,0x12,0xf, 0x0, 0x74,0x2a,0x9, +0x77,0x0, 0x1b,0x12,0xf, 0x0, 0x74,0xc, 0x9, 0x77,0x0, 0x1c,0x12,0xf, 0x0, 0x74, +0x2a,0x9, 0x77,0x0, 0x1d,0x12,0xf, 0x0, 0x74,0x2e,0x9, 0x77,0x0, 0x1e,0x12,0xf, +0x0, 0x74,0x2, 0x9, 0x77,0x0, 0x21,0x12,0xf, 0x0, 0x74,0x4, 0x9, 0x77,0x0, 0x22, +0x12,0xf, 0x0, 0x74,0x24,0x9, 0x77,0x0, 0x23,0x12,0xf, 0x0, 0x74,0x1e,0x9, 0x77, +0x0, 0x24,0x12,0xf, 0x0, 0x74,0x18,0x9, 0x77,0x0, 0x25,0x12,0xf, 0x0, 0x74,0x20, +0x9, 0x77,0x0, 0x26,0x12,0xf, 0x0, 0x74,0x22,0x9, 0x77,0x0, 0x27,0x12,0xf, 0x0, +0x74,0xe, 0x9, 0x77,0x0, 0x1f,0x12,0xf, 0x0, 0x74,0x1c,0x9, 0x77,0x0, 0x28,0x12, +0xf, 0x0, 0xda,0x79,0x22,0x12,0xb, 0x82,0x7e,0x34,0xa, 0xd8,0x7e,0x24,0x6, 0xb7, +0x22,0x12,0x9, 0xe6,0x60,0xfb,0x12,0xe, 0xf7,0x12,0x16,0x45,0x12,0xa, 0xaf,0x12, +0xb, 0x82,0x12,0x15,0xc2,0x12,0xf, 0xb8,0x2, 0xf, 0xdb,0xca,0x3b,0x7d,0x62,0x7d, +0x73,0x9, 0x77,0x0, 0x2c,0x7a,0x73,0xd, 0xd3,0x9, 0xb7,0x0, 0x2b,0xf5,0x2c,0xe4, +0x19,0xb7,0x0, 0x2c,0x19,0xb7,0x0, 0x2b,0x7d,0x36,0x2e,0x34,0x1, 0xf8,0x7a,0x37, +0xd, 0xd1,0x7a,0x67,0xd, 0xcf,0x75,0x29,0x1, 0x12,0x9, 0xe6,0x60,0xfb,0x7d,0x37, +0x7d,0x26,0x12,0x10,0x5e,0x12,0xb, 0x82,0x6d,0x33,0x7a,0x35,0x2a,0x7e,0x25,0x2a, +0x3e,0x24,0x7d,0x32,0x2e,0x37,0xd, 0xd1,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2e, +0x27,0xd, 0xcf,0x12,0x17,0x6d,0x7e,0x35,0x2a,0xb, 0x34,0x7a,0x35,0x2a,0xbe,0x34, +0x0, 0xfc,0x78,0xd9,0x5, 0x29,0xe5,0x29,0xbe,0xb0,0x4, 0x28,0xbc,0x7e,0x73,0xd, +0xd3,0x19,0x77,0x0, 0x2c,0xe5,0x2c,0x19,0xb7,0x0, 0x2b,0xda,0x3b,0x22,0xca,0xf8, +0x7d,0x3, 0xc2,0x4, 0x6d,0x11,0x9, 0x80,0x0, 0x1, 0x7e,0x9, 0x90,0x9, 0xa0,0x0, +0x2c,0xa9,0x33,0xdd,0x5, 0xa9,0xc3,0xdd,0x80,0x3, 0xa9,0xd3,0xdd,0xe5,0x5e,0x19, +0xb2,0x4, 0x1c,0xe5,0x5e,0x70,0x17,0x75,0x5e,0x1, 0x74,0x20,0x12,0x15,0x2d,0xbe, +0xb0,0xff,0x68,0x13,0xbe,0xb0,0x1f,0x68,0xe, 0x75,0x5e,0xee,0x80,0x9, 0xe5,0x5e, +0xb4,0xee,0x4, 0x74,0xee,0x21,0x91,0x9, 0xf0,0x0, 0x1a,0x9, 0xb0,0x0, 0x19,0xbc, +0xbf,0x28,0xe, 0xd2,0x4, 0xa, 0x18,0x2d,0x10,0x9, 0x31,0x0, 0x18,0xa, 0x13,0x80, +0x2, 0xa, 0x1b,0x75,0xc3,0x0, 0x9, 0xb0,0x0, 0x2f,0xc4,0x33,0x54,0xe0,0x4c,0xb8, +0xf5,0xc3,0x7a,0x91,0xc4,0x3e,0x14,0x2e,0x14,0x10,0x0, 0x9, 0xb0,0x0, 0x2b,0x70, +0x64,0x49,0x32,0x4, 0x11,0xa, 0x6, 0x7c,0xb1,0xf5,0xba,0x7c,0xb7,0xf5,0xb9,0x7d, +0x42,0x2e,0x44,0x1, 0xf8,0x7d,0x34,0xa, 0x6, 0x7c,0xb1,0x12,0x11,0x9a,0x30,0x4, +0x3, 0x75,0xc2,0x10,0x43,0xc2,0x5, 0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, +0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0xa, 0x2, 0x7a,0x11,0xba,0x7c,0xb3,0xf5, +0xb9,0x7d,0x34,0xa, 0x48,0x7c,0xb9,0xf5,0xbc,0x7c,0xb7,0xf5,0xbb,0x7a,0x11,0xc1, +0x7c,0xb3,0xf5,0xbd,0x80,0x0, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30, +0xe7,0xf4,0x75,0xc2,0x0, 0x4c,0xaa,0x68,0x27,0x12,0x11,0xa1,0xa, 0x56,0xf5,0xbc, +0x7c,0xb7,0xf5,0xbb,0x12,0x11,0x94,0x30,0x4, 0x3, 0x75,0xc2,0x10,0x43,0xc2,0x3, +0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x80,0x1d, +0x12,0x11,0xa1,0x12,0x11,0x94,0x30,0x4, 0x3, 0x75,0xc2,0x10,0x43,0xc2,0x5, 0x80, +0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, +0xe4,0xda,0xf8,0x22,0x2e,0x34,0x1, 0xf8,0xa, 0x56,0xf5,0xc1,0x7c,0xb7,0xf5,0xbd, +0x22,0xa, 0x52,0xf5,0xba,0x7c,0xb3,0xf5,0xb9,0x7d,0x32,0x22,0xca,0x3b,0x7e,0xb3, +0xb, 0x3, 0xf5,0x27,0x7e,0xb3,0xb, 0x4, 0xf5,0x28,0x74,0x1, 0x12,0x5c,0x7d,0x6c, +0xee,0x6c,0xff,0xa, 0x3f,0x9, 0x73,0x4, 0x2a,0xbc,0x7e,0x40,0x2, 0x7c,0xe7,0xb, +0xf0,0xbe,0xf0,0x15,0x78,0xed,0xbe,0xe0,0x3f,0x50,0x8, 0x74,0x3f,0x9c,0xbe,0x7c, +0xeb,0x80,0x2, 0x6c,0xee,0x7c,0xde,0x41,0xcb,0x12,0x15,0xc9,0x12,0x17,0xfa,0x12, +0x9, 0xe6,0x60,0xfb,0x12,0xf, 0xb8,0x12,0x10,0x5e,0x6c,0xff,0x6c,0xcc,0x4c,0xff, +0x78,0xa, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35,0xd, 0xcf,0x7e,0x50,0x2, 0xac, +0x5c,0x12,0x2d,0x3d,0x49,0x13,0x8, 0xaf,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14, +0xe, 0x14,0x2e,0x24,0xd, 0xcf,0x12,0x17,0x6d,0xb, 0xc0,0xbe,0xc0,0xc, 0x78,0xce, +0xb, 0xf0,0xbe,0xf0,0x15,0x78,0xc5,0x6c,0xcc,0x6c,0xff,0x7e,0x4, 0x0, 0x15,0x74, +0x2, 0xac,0xbf,0x7d,0x35,0x2e,0x34,0xd, 0xcf,0xb, 0x38,0x10,0x8d,0x10,0x1b,0x38, +0x10,0xb, 0x38,0x40,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1b,0x38, +0x40,0x49,0x25,0xd, 0xcf,0x7e,0x37,0x3, 0xf2,0x9e,0x37,0x4, 0x50,0xbd,0x23,0x50, +0x18,0x12,0x12,0xfe,0xa, 0x3b,0x9, 0xb3,0x2, 0xf9,0xbc,0xbe,0x50,0x7, 0x2e,0x34, +0x2, 0xf9,0x4, 0x80,0x23,0xb, 0xc0,0x80,0x2a,0x7e,0x37,0x4, 0x50,0x2e,0x37,0x3, +0xf2,0xbd,0x23,0x28,0x1c,0x12,0x12,0xfe,0xa, 0x3b,0x9, 0xb3,0x2, 0xf9,0xbe,0xb0, +0x0, 0x28,0xa, 0x2e,0x34,0x2, 0xf9,0x14,0x7a,0x39,0xb0,0x80,0x6, 0xb, 0xc0,0x80, +0x2, 0xb, 0xc0,0xb, 0xf0,0xbe,0xf0,0xc, 0x78,0x81,0x53,0xdb,0xf0,0x12,0x17,0x91, +0xa9,0xc5,0xcb,0x12,0xb, 0x7b,0xbe,0xc0,0xc, 0x68,0xa, 0x7c,0xad,0x1b,0xd0,0x4c, +0xaa,0x68,0x2, 0x21,0xe9,0x6c,0xff,0x12,0x12,0xfe,0xa, 0x3b,0x9, 0x73,0x2, 0xf9, +0xa, 0x2f,0x19,0x72,0x4, 0x3f,0xb, 0xf0,0xbe,0xf0,0xc, 0x40,0xea,0xe5,0x27,0x7a, +0xb3,0xb, 0x3, 0xe5,0x28,0x7a,0xb3,0xb, 0x4, 0x74,0x1, 0xda,0x3b,0x22,0xa, 0x3f, +0x2e,0x34,0x2, 0xfd,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0xca,0x3b,0x53, +0xdc,0xe0,0x43,0xdc,0x6, 0x6d,0x66,0x0, 0xb, 0x64,0xbe,0x64,0x0, 0x12,0x78,0xf7, +0x53,0xc9,0xfe,0x6d,0x33,0x12,0x14,0x14,0x7c,0xfb,0x7e,0xb3,0xc, 0xb8,0x70,0x3, +0x7e,0xf0,0xff,0xbe,0xf0,0xff,0x68,0x38,0x7e,0x34,0x3, 0xf0,0x12,0x14,0x14,0xf5, +0x27,0x7e,0x34,0x3, 0xf1,0x12,0x14,0x14,0xf5,0x28,0x65,0x27,0xbe,0xb0,0xff,0x68, +0x3, 0x7e,0xf0,0xff,0x75,0x28,0x0, 0x6d,0x66,0x12,0x14,0x10,0x62,0x28,0xb, 0x64, +0xbe,0x64,0x2, 0x69,0x78,0xf3,0xe5,0x28,0xbe,0xb1,0x27,0x68,0x3, 0x7e,0xf0,0xff, +0xbe,0xf0,0xff,0x68,0x3, 0x12,0x17,0x76,0x74,0x15,0x7a,0xb3,0x3, 0xe4,0x74,0xc, +0x7a,0xb3,0x3, 0xe5,0x74,0x2, 0x7a,0xb3,0x3, 0xe6,0xe4,0x7a,0xb3,0x3, 0xe7,0x74, +0xc, 0x7a,0xb3,0x3, 0xe8,0x7e,0x34,0x21,0x34,0x7a,0x37,0x3, 0xf2,0x12,0x5c,0xab, +0x12,0x5c,0x28,0x7a,0xb3,0x4, 0x54,0x6c,0xee,0xa, 0x3e,0x2e,0x34,0x3, 0x9, 0x12, +0x13,0x4, 0xa, 0x3e,0x19,0xb3,0x3, 0xf4,0x2e,0x34,0x3, 0x4b,0x12,0x13,0x4, 0xa, +0x3e,0x19,0xb3,0x4, 0x9, 0x2e,0x34,0x3, 0x1e,0x12,0x13,0x4, 0xa, 0x3e,0x19,0xb3, +0x4, 0x2a,0xb, 0xe0,0xbe,0xe0,0x15,0x78,0xd0,0x6c,0xee,0xa, 0x3e,0x2e,0x34,0x3, +0x3b,0x12,0x13,0x4, 0xa, 0x3e,0x19,0xb3,0x4, 0x1e,0xbe,0xf0,0xff,0x78,0xf, 0xa, +0x3e,0x2e,0x34,0x3, 0x60,0x12,0x13,0x4, 0xa, 0x3e,0x19,0xb3,0x4, 0x3f,0xb, 0xe0, +0xbe,0xe0,0xc, 0x78,0xd6,0xbe,0xf0,0xff,0x78,0x3, 0x12,0x5c,0x71,0xda,0x3b,0x22, +0x7d,0x36,0xb, 0x36,0x2e,0x34,0x7c,0x0, 0x2, 0x14,0x1b,0xc2,0xaf,0xd2,0xc9,0xa, +0x56,0xf5,0xf1,0x7c,0xb7,0x12,0x17,0x64,0x75,0xf5,0x1, 0xa9,0x37,0xf5,0xfc,0x2, +0x14,0x32,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xd2,0xaf,0x22,0x12,0x5c,0x48,0x6d, +0x33,0x7a,0x37,0x1, 0xce,0x12,0x5c,0xb4,0x7a,0xb3,0x2, 0xb, 0x7a,0xb3,0x2, 0xc, +0x7a,0xb3,0x2, 0xd, 0x7a,0xb3,0x2, 0xe, 0x7a,0xb3,0x2, 0xf, 0x74,0x1, 0x7a,0xb3, +0x2, 0x9, 0xe4,0x12,0x5b,0xfc,0x12,0x5c,0x87,0x6c,0xaa,0xbe,0xa0,0x7, 0x50,0x34, +0xa, 0x3a,0x2e,0x34,0x3, 0x6c,0x12,0x13,0x4, 0xa, 0x4a,0x19,0xb4,0x1, 0xd0,0xa, +0x3a,0x2e,0x34,0x3, 0x73,0x12,0x13,0x4, 0x19,0xb4,0x1, 0xf8,0xa, 0x3a,0x2e,0x34, +0x3, 0x7a,0x12,0x13,0x4, 0x19,0xb4,0x1, 0xe0,0xa, 0x3a,0x2e,0x34,0x3, 0x81,0x12, +0x13,0x4, 0x80,0x13,0x74,0xff,0xa, 0x4a,0x19,0xb4,0x1, 0xd0,0xe4,0x19,0xb4,0x1, +0xf8,0x74,0x2, 0x19,0xb4,0x1, 0xe0,0xa, 0x4a,0x19,0xb4,0x2, 0x0, 0xa, 0x3a,0x19, +0xa3,0x1, 0xd8,0x12,0x15,0x25,0x59,0x43,0x1, 0xe8,0xa, 0x3a,0x9, 0xb3,0x1, 0xd0, +0xbe,0xb3,0x4, 0x4f,0x78,0x28,0xa, 0x3a,0x9, 0xb3,0x1, 0xf8,0xbe,0xb3,0x4, 0x52, +0x78,0x1c,0xa, 0x3a,0x9, 0xb3,0x2, 0x0, 0xbe,0xb3,0x4, 0x54,0x78,0x10,0xa, 0x3a, +0x9, 0xb3,0x1, 0xe0,0xbe,0xb3,0x4, 0x53,0x78,0x4, 0x7a,0xa3,0x2, 0xb, 0xb, 0xa0, +0xbe,0xa0,0x8, 0x68,0x2, 0x81,0x6b,0x6c,0xaa,0x12,0x15,0x25,0x59,0x43,0x2, 0xbf, +0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0x2, 0xa7,0xb, 0xa0,0xbe, +0xa0,0xc, 0x40,0xe5,0x22,0x6d,0x44,0x7e,0x70,0x2, 0xac,0x7a,0x22,0xd2,0xc9,0xc2, +0xaf,0x75,0xf1,0x0, 0x12,0x17,0x64,0x75,0xf5,0x3, 0xa9,0x37,0xf5,0xfc,0x2, 0x14, +0x32,0x2, 0x15,0x44,0x53,0xdc,0xe0,0x43,0xdc,0x6, 0x7e,0xa0,0x12,0x0, 0x1b,0xa0, +0x78,0xfb,0x53,0xc9,0xfe,0xbe,0xb0,0xf, 0x40,0x13,0xbe,0xb0,0x2e,0x38,0xe, 0x53, +0xc9,0xfe,0x53,0xdc,0xe0,0xa, 0x3b,0x9e,0x34,0x0, 0xf, 0x80,0x13,0x43,0xc9,0x1, +0x53,0xdc,0xe0,0xbe,0xb0,0xe, 0x38,0xd, 0xa, 0x2b,0x7e,0x34,0x0, 0x1f,0x9d,0x32, +0x7c,0xb7,0x42,0xdc,0x22,0xb4,0x2f,0x4, 0x43,0xdc,0x3, 0x22,0xb4,0x30,0x4, 0x43, +0xdc,0x2, 0x22,0x43,0xdc,0xa, 0x22,0x12,0x15,0xc9,0x12,0x5c,0x68,0x53,0xdb,0xf0, +0x12,0x16,0x45,0x12,0xb, 0x7b,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x4, 0x50,0x12,0x11, +0xac,0x12,0x5a,0xc2,0x12,0x1a,0x12,0x7e,0xb3,0xd, 0x75,0x54,0x8f,0x7a,0xb3,0xd, +0x75,0x22,0x7e,0x34,0x6, 0xb7,0x12,0x57,0xfa,0x6d,0x33,0x7a,0x37,0x3, 0xdf,0x7e, +0x34,0xd, 0xac,0x7a,0x37,0x0, 0x5f,0x22,0x12,0x5c,0x14,0x7e,0x73,0x3, 0xe4,0x7a, +0x73,0xa, 0xd8,0x7e,0x73,0x3, 0xe5,0x7a,0x73,0xa, 0xd9,0x7e,0x24,0x3, 0xf4,0x7e, +0x34,0xa, 0xdc,0x12,0x48,0xf1,0x6c,0xaa,0x80,0x11,0xa, 0x3a,0x2e,0x34,0x2, 0xfd, +0x12,0x13,0x4, 0xa, 0x4a,0x19,0xb4,0xa, 0xf1,0xb, 0xa0,0x7e,0xb3,0x3, 0xe5,0xbc, +0xba,0x38,0xe7,0x7e,0x73,0x3, 0xe7,0x7a,0x73,0xa, 0xfd,0x7e,0x73,0x4, 0x2a,0x7a, +0x73,0xa, 0xfe,0x7e,0x73,0x3, 0xe8,0x7a,0x73,0xa, 0xff,0x7e,0x73,0x3, 0xe8,0x7a, +0x73,0xb, 0x0, 0x7e,0x73,0x3, 0xe8,0x7a,0x73,0xb, 0x1, 0xe4,0x7a,0xb3,0xb, 0x7, +0x7a,0xb3,0xb, 0x8, 0x22,0x12,0x15,0xd8,0xca,0xd8,0xca,0x79,0x7e,0x34,0x2, 0xf9, +0x12,0x17,0x5c,0x7e,0x34,0x2, 0xed,0x12,0x17,0x5c,0x6c,0x77,0x80,0x22,0xa, 0x27, +0x9, 0x62,0x4, 0x1e,0x12,0x17,0x50,0x93,0xa, 0x2b,0x19,0x62,0x2, 0xed,0xa, 0x27, +0x9, 0x62,0x4, 0x3f,0x12,0x17,0x50,0x93,0xa, 0x2b,0x19,0x62,0x2, 0xf9,0xb, 0x70, +0x7e,0x63,0x3, 0xe5,0xbc,0x67,0x38,0xd6,0x7e,0x73,0x3, 0xe6,0x7a,0x73,0x3, 0x5, +0x7e,0x73,0x4, 0x9, 0x7a,0x73,0x3, 0x6, 0x7e,0x73,0x4, 0x2a,0x7a,0x73,0x3, 0x7, +0x74,0xa, 0x7a,0xb3,0x3, 0x8, 0x7e,0x73,0x3, 0xe8,0x7a,0x73,0x3, 0x9, 0x74,0x10, +0x7a,0xb3,0x3, 0xb, 0xe4,0x7a,0xb3,0x3, 0xd, 0x6d,0x77,0x6c,0x77,0x80,0x15,0xa, +0x27,0x12,0x17,0x50,0x93,0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb, +0x4d,0x72,0xb, 0x70,0x7e,0x63,0x3, 0xe5,0xbc,0x67,0x38,0xe3,0x7d,0x37,0x5e,0x34, +0x0, 0x1, 0x78,0xe, 0x74,0xf, 0x7a,0xb3,0x3, 0xe, 0x74,0xff,0x7a,0xb3,0x3, 0xf, +0x80,0xc, 0xa, 0x3e,0x7a,0x73,0x3, 0xe, 0x7c,0x7f,0x7a,0x73,0x3, 0xf, 0x74,0xa, +0x7a,0xb3,0x3, 0xa, 0x7e,0x73,0x4, 0x53,0x7a,0x73,0x3, 0xc, 0x74,0x1, 0x7a,0xb3, +0x3, 0x10,0x74,0xfc,0x7a,0xb3,0x3, 0x11,0x74,0x81,0x7a,0xb3,0x3, 0x12,0x74,0xff, +0x7a,0xb3,0x3, 0x13,0x74,0x14,0x7a,0xb3,0x3, 0x14,0x74,0xeb,0x7a,0xb3,0x3, 0x15, +0x12,0x17,0x91,0x7c,0xdb,0x74,0x12,0x12,0x59,0xa2,0x7c,0x7b,0x5e,0x70,0xfc,0xb, +0x71,0x74,0x12,0x12,0xf, 0x0, 0xa9,0xc5,0xcb,0x7c,0xbd,0xda,0x79,0xda,0xd8,0x22, +0x2e,0x24,0x2, 0xfd,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7e,0x24,0x0, 0xc, +0xe4,0x2, 0x0, 0x46,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x22,0xb, 0x28,0x30, +0x2d,0x31,0x1b,0x28,0x30,0x22,0xca,0x3b,0x7e,0x74,0x3, 0xe4,0x6d,0x66,0x12,0x14, +0x10,0x7a,0x79,0xb0,0xb, 0x74,0xb, 0x64,0xbe,0x64,0x2, 0x69,0x40,0xf0,0xda,0x3b, +0x22,0xa9,0xd5,0xcb,0x7e,0x34,0x2, 0xed,0xca,0x79,0x7d,0x73,0xe4,0x12,0x59,0x81, +0x9, 0xb7,0x0, 0x18,0x12,0x5a,0xe4,0x74,0x1, 0x12,0x17,0xe2,0x12,0x5a,0xa0,0x70, +0x3, 0xe4,0x80,0x2b,0x74,0x14,0x7e,0x70,0x7f,0x12,0x59,0x8b,0x70,0x3, 0xe4,0x80, +0x1e,0x7d,0x37,0x7d,0x27,0x2e,0x24,0x0, 0xc, 0x12,0x59,0xed,0x7d,0x37,0x12,0xf, +0x1e,0xe4,0x12,0x17,0xe2,0x12,0x5a,0x93,0x60,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xda, +0x79,0x22,0x60,0x5, 0x7e,0xa0,0xa, 0x80,0x2, 0x6c,0xaa,0xe5,0xdc,0x54,0xe0,0xa, +0x2b,0xa, 0x3a,0x2d,0x32,0x7c,0xb7,0xf5,0xdc,0x22,0x2, 0x17,0xfd,0xe5,0x9a,0x60, +0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x2, 0x18,0xa, 0xc2,0x8e,0x2, 0x18,0xf, 0xe5, +0x9b,0xa, 0x3b,0x6d,0x22,0xb, 0x1c,0x7e,0x14,0x0, 0xc, 0x12,0x0, 0xa9,0x7e,0xb4, +0x3, 0xe8,0x7d,0x1b,0x12,0x0, 0xa9,0x7f,0x1, 0x7e,0xd4,0x36,0x0, 0x7e,0xc4,0x1, +0x6e,0x7f,0x16,0x12,0x1, 0x5, 0x7f,0x1, 0x7e,0x78,0xff,0xff,0x7f,0x17,0x9f,0x10, +0x7c,0xb6,0xf5,0x8d,0xe5,0x9b,0xa, 0xb, 0xb, 0x4, 0x7e,0x14,0x0, 0xc, 0xad,0x10, +0xad,0x1b,0x7f,0x16,0x12,0x1, 0x5, 0x7f,0x27,0x9f,0x21,0xf5,0x8b,0xd2,0x8e,0x22, +0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0, +0xc0,0x83,0xc0,0x82,0x12,0x18,0x7, 0x12,0x1a,0x9, 0x7e,0x37,0x3, 0x81,0xb, 0x34, +0x7a,0x37,0x3, 0x81,0x20,0x93,0x8, 0x6d,0x33,0x7a,0x37,0xe, 0x78,0x80,0x13,0x7e, +0x37,0xe, 0x78,0xb, 0x34,0x7a,0x37,0xe, 0x78,0xbe,0x34,0x3, 0xe8,0x28,0x3, 0x75, +0xe9,0xff,0xe5,0xcc,0xb4,0x2, 0x3, 0x12,0x1a,0x9, 0x7e,0x35,0x58,0x7e,0x4, 0x0, +0xa, 0x7d,0x13,0x8d,0x10,0x4d,0x0, 0x78,0x38,0x7e,0xb3,0xc, 0x97,0xbe,0xb0,0x0, +0x28,0x5, 0x14,0x7a,0xb3,0xc, 0x97,0x7e,0xb3,0xe, 0x68,0xbe,0xb0,0x0, 0x28,0x5, +0x14,0x7a,0xb3,0xe, 0x68,0x7e,0xb3,0xe, 0x71,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a, +0xb3,0xe, 0x71,0x7e,0xb3,0xe, 0x67,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0xe, +0x67,0x7e,0x27,0xb, 0x9, 0x4d,0x22,0x68,0x6, 0x1b,0x24,0x7a,0x27,0xb, 0x9, 0xbe, +0x34,0x3, 0xe8,0x40,0xe, 0x6d,0x33,0x7a,0x35,0x58,0xe5,0x10,0xbe,0xb0,0x64,0x50, +0x2, 0x5, 0x10,0x7e,0x37,0x3, 0xdf,0xb, 0x34,0x7a,0x37,0x3, 0xdf,0x7e,0x37,0x0, +0x5f,0xbe,0x37,0x3, 0xdf,0x28,0x3, 0x12,0x17,0xfa,0x7e,0x37,0x3, 0xe2,0x4d,0x33, +0x68,0xe, 0xbe,0x34,0x0, 0x1, 0x78,0x2, 0xd2,0x1, 0x1b,0x34,0x7a,0x37,0x3, 0xe2, +0x7e,0x35,0xd, 0xbe,0x34,0x0, 0x0, 0x28,0x18,0x1b,0x34,0x7a,0x35,0xd, 0xe5,0xcc, +0xb4,0x2, 0xe, 0x7e,0x35,0xd, 0xbe,0x34,0x0, 0x0, 0x28,0x5, 0x1b,0x34,0x7a,0x35, +0xd, 0x7e,0x35,0x19,0xbe,0x34,0x0, 0x0, 0x28,0x18,0x1b,0x34,0x7a,0x35,0x19,0xe5, +0xcc,0xb4,0x2, 0xe, 0x7e,0x35,0x19,0xbe,0x34,0x0, 0x0, 0x28,0x5, 0x1b,0x34,0x7a, +0x35,0x19,0x12,0x1a,0x1, 0x28,0x14,0x1b,0x34,0x7a,0x35,0x8, 0xe5,0xcc,0xb4,0x2, +0xa, 0x12,0x1a,0x1, 0x28,0x5, 0x1b,0x34,0x7a,0x35,0x8, 0x12,0x1b,0x91,0x50,0x5, +0xb, 0x34,0x7a,0x35,0xa, 0x7e,0xb3,0xc, 0xbf,0xb4,0xaa,0x13,0x7e,0xa3,0x2, 0xe8, +0x7c,0xba,0x4, 0x7a,0xb3,0x2, 0xe8,0xbe,0xa0,0x64,0x28,0x3, 0x12,0x1a,0x12,0xe5, +0x1b,0xbe,0xb1,0x17,0x28,0xb, 0x5, 0x17,0xe5,0xcc,0xb4,0x2, 0x7, 0x5, 0x17,0x80, +0x3, 0x75,0x16,0x1, 0x7e,0xb3,0xd, 0x6c,0x60,0x12,0xbe,0xb0,0x28,0x50,0x7, 0x4, +0x7a,0xb3,0xd, 0x6c,0x80,0x6, 0x12,0x6, 0xe1,0x12,0x1b,0x99,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0x7e,0x35,0x8, 0xbe,0x34,0x0, 0x0, 0x22,0x7e,0x35,0x58,0xb, 0x34,0x7a,0x35, +0x58,0x22,0x74,0x1, 0x7a,0xb3,0xc, 0xbf,0x22,0x74,0xff,0x7a,0xb3,0xc, 0xce,0x74, +0x15,0x7a,0xb3,0xc, 0x98,0x74,0x3c,0x7a,0xb3,0xc, 0x99,0xe4,0x7a,0xb3,0xc, 0x9b, +0x74,0x6, 0x7a,0xb3,0xc, 0x9c,0x74,0xa0,0x7a,0xb3,0xc, 0x9d,0x74,0x1, 0x7a,0xb3, +0xc, 0x9e,0x74,0xa, 0x7a,0xb3,0xc, 0x9f,0x7a,0xb3,0xc, 0xa0,0x74,0x14,0x7a,0xb3, +0xc, 0xa1,0x12,0x1b,0x8a,0x74,0xa, 0x7a,0xb3,0xc, 0xbb,0x74,0x1, 0x7a,0xb3,0xc, +0xbc,0xe4,0x7a,0xb3,0xc, 0xbd,0x74,0x23,0x7a,0xb3,0xc, 0xbe,0x12,0x1a,0x12,0x74, +0x79,0x7a,0xb3,0xc, 0xc0,0xe4,0x7a,0xb3,0xc, 0xc1,0x7a,0xb3,0xc, 0xc2,0x74,0x1, +0x7a,0xb3,0xc, 0xc7,0x74,0xc8,0x7a,0xb3,0xc, 0xc6,0x74,0x5, 0x7a,0xb3,0xc, 0xa8, +0x74,0x3, 0x7a,0xb3,0xc, 0xa9,0xe4,0x7a,0xb3,0xc, 0xca,0x74,0x64,0x7a,0xb3,0xc, +0xcb,0x74,0x32,0x7a,0xb3,0xc, 0xcc,0x6d,0x33,0x7a,0x37,0x2, 0xdd,0x74,0x1, 0x7a, +0xb3,0x2, 0xdf,0xe4,0x7a,0xb3,0x2, 0xe6,0x74,0xa, 0x7a,0xb3,0x2, 0xe1,0x7a,0xb3, +0x2, 0xe2,0x74,0x14,0x7a,0xb3,0x2, 0xe3,0x7a,0xb3,0x2, 0xe4,0x74,0xa, 0x7a,0xb3, +0x2, 0xe5,0x74,0x1, 0x7a,0xb3,0x2, 0xe7,0x7e,0x34,0x0, 0x55,0x7a,0x37,0x6, 0x94, +0x74,0x15,0x7a,0xb3,0x6, 0x96,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0x6, 0x97,0xe4,0x7a, +0xb3,0x6, 0xb6,0x74,0x3, 0x7a,0xb3,0x6, 0xa9,0x7a,0xb3,0x6, 0xaa,0xe4,0x7a,0xb3, +0x6, 0xae,0x74,0x14,0x7a,0xb3,0x6, 0xaf,0xe4,0x7a,0xb3,0x6, 0xab,0x7a,0xb3,0x6, +0xa3,0x74,0x3, 0x7a,0xb3,0x6, 0xa4,0xe4,0x7a,0xb3,0x6, 0xa5,0x74,0x4, 0x7a,0xb3, +0x6, 0xa6,0x7e,0x34,0x0, 0x64,0x7a,0x37,0x6, 0xa7,0x7a,0x37,0x6, 0x9f,0x74,0x32, +0x7a,0xb3,0x6, 0xa1,0x74,0x5, 0x7a,0xb3,0x3, 0x16,0x7e,0x34,0xa, 0x0, 0x7a,0x37, +0x3, 0x17,0x74,0xa0,0x7a,0xb3,0x3, 0x19,0x7e,0x34,0x0, 0xc8,0x7a,0x37,0x3, 0x1a, +0x74,0x5, 0x7a,0xb3,0x3, 0x1d,0x74,0x3, 0x7a,0xb3,0x3, 0x1e,0xe4,0x7a,0xb3,0x3, +0x1c,0x7a,0xb3,0xc, 0xa3,0x7e,0x73,0x4, 0x4f,0x7a,0x73,0xc, 0xa2,0x7e,0x73,0x4, +0x52,0x7a,0x73,0xc, 0xa5,0x7e,0x73,0x4, 0x53,0x7a,0x73,0xc, 0xa6,0x7a,0xb3,0xc, +0xa7,0x7e,0x73,0x4, 0x54,0x7a,0x73,0xc, 0xa4,0x22,0x74,0xff,0x7a,0xb3,0xc, 0xb8, +0x22,0x7e,0x35,0xa, 0xbe,0x34,0x9c,0x40,0x22,0x6d,0x33,0x7a,0x37,0xe, 0x35,0xe4, +0x7a,0xb3,0xe, 0xe, 0x22,0x2, 0x8, 0x50,0xca,0x3b,0x7e,0xb3,0x3, 0xcf,0xf5,0x2d, +0x7e,0xd3,0x3, 0xd0,0x7e,0x34,0xd, 0xcf,0x12,0x6, 0xa0,0x7e,0x34,0x0, 0x2f,0x7e, +0x24,0x0, 0x5, 0xe4,0x12,0x0, 0x46,0xe5,0x2d,0x70,0x47,0x6c,0xee,0x7e,0x34,0xff, +0xff,0x74,0x7, 0xac,0xbe,0x59,0x35,0xd, 0xa2,0x74,0x7, 0xac,0xbe,0x12,0x1f,0x16, +0xac,0xbe,0x12,0x1f,0x42,0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xe1,0xbe,0xd0,0x0, 0x38, +0x2, 0xc1,0xb0,0x7e,0x34,0x3, 0xaa,0x12,0x6, 0xa0,0x7e,0xb3,0x3, 0xd3,0x44,0x4, +0x7a,0xb3,0x3, 0xd3,0x54,0xf7,0x7a,0xb3,0x3, 0xd3,0x54,0xdf,0x7a,0xb3,0x3, 0xd3, +0xc1,0xb0,0x6c,0xee,0x80,0x26,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x0, 0x7f,0xb, +0x28,0x30,0x12,0x1f,0x39,0x1b,0x28,0x30,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x0, +0x81,0xb, 0x28,0x30,0x12,0x1f,0x39,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x2d,0xbc,0xbe, +0x38,0xd4,0x4c,0xdd,0x78,0xa, 0x7e,0xb3,0x3, 0xd3,0x44,0x10,0x7a,0xb3,0x3, 0xd3, +0x6c,0x11,0x6c,0xee,0x6c,0xff,0x80,0x11,0x12,0x1f,0x4f,0x78,0xa, 0xbe,0x0, 0xff, +0x68,0x5, 0x12,0x1f,0x97,0x80,0x8, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xe9,0xb, +0xe0,0xbe,0xe0,0x5, 0x78,0xde,0x6c,0xee,0x7e,0xf1,0x2d,0x80,0x11,0x12,0x1f,0x4f, +0x78,0xa, 0xbe,0x0, 0xff,0x68,0x5, 0x12,0x1f,0x97,0x80,0x7, 0xb, 0xf0,0xbe,0xf0, +0x5, 0x40,0xea,0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xde,0x6c,0xff,0x6c,0xee,0x80,0x17, +0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0xd3,0x7e,0x70,0x7, 0xac,0x7f,0x9, 0x3, 0x0, +0x83,0xbc,0xa, 0x68,0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe5,0xbc,0x1e,0x78,0x19,0x7e, +0x70,0x7, 0xac,0x7f,0x2e,0x34,0x0, 0x7f,0x7e,0x30,0x7, 0xac,0x31,0x2e,0x14,0xd, +0xcf,0x74,0x7, 0x12,0x1, 0x39,0xb, 0x10,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xbd,0x7e, +0x24,0xd, 0xcf,0x7e,0x34,0x3, 0xaa,0x12,0x1e,0xb3,0x4c,0xdd,0x78,0xd, 0x7e,0x24, +0x0, 0x7f,0x7e,0x34,0x3, 0xaa,0x12,0x1e,0xb3,0xc1,0x22,0x7e,0xb3,0x3, 0xd3,0x30, +0xe3,0x2, 0xc1,0x22,0x6c,0xff,0xc1,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7f,0x9, +0x43,0x0, 0x83,0x74,0x7, 0xac,0xbe,0x9, 0x55,0x3, 0xae,0xbc,0x54,0x68,0x7, 0xb, +0xe0,0xbe,0xe0,0x5, 0x40,0xe4,0x7e,0x50,0x7, 0xac,0x5e,0x9, 0x12,0x3, 0xae,0x7a, +0x11,0x2e,0x2e,0x10,0x2f,0x74,0x1, 0xa5,0xf7,0x49,0x33,0x0, 0x81,0x49,0x22,0x3, +0xac,0x12,0x1e,0xc3,0x7d,0x63,0x12,0x1e,0xba,0x74,0x7, 0xac,0xbe,0x49,0x25,0x3, +0xaa,0x12,0x1e,0xdc,0x7a,0x35,0x29,0x12,0x1e,0xd3,0x7e,0xa1,0x2e,0x74,0x7, 0xa4, +0x49,0x25,0xd, 0xa4,0x12,0x1e,0xc3,0x7d,0x63,0x12,0x1e,0xba,0x7e,0xa1,0x2e,0x74, +0x7, 0xa4,0x49,0x25,0xd, 0xa2,0x12,0x1e,0xdc,0x7e,0x17,0x3, 0x17,0xbe,0x15,0x27, +0x38,0x9, 0x7e,0x4, 0x1, 0x0, 0x7a,0x5, 0x2b,0x80,0x1e,0x7e,0x35,0x29,0x6d,0x22, +0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x0, 0xb2,0x7a,0x35,0x2b,0xbe,0x34,0x0, 0x10, +0x50,0x7, 0x7e,0x34,0x0, 0x10,0x7a,0x35,0x2b,0x7e,0x35,0x2b,0xbe,0x34,0x1, 0x0, +0x28,0x7, 0x7e,0x34,0x1, 0x0, 0x7a,0x35,0x2b,0x7e,0xa1,0x2e,0x74,0x2, 0xa4,0x49, +0x45,0xd, 0xc5,0xbe,0x45,0x27,0x28,0x9, 0x49,0x45,0xd, 0x98,0x7a,0x45,0x2b,0x80, +0x7, 0x7e,0x45,0x2b,0x59,0x45,0xd, 0x98,0x7e,0x35,0x27,0x59,0x35,0xd, 0xc5,0x12, +0x1e,0xba,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x3, 0xaa,0x7e,0x15,0x2b,0x12,0x1e, +0xe5,0x12,0x1e,0xd3,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0x3, 0xac,0x7e,0x15,0x2b, +0x12,0x1e,0xe5,0x12,0x1f,0x1f,0x7e,0x71,0x2e,0x74,0x7, 0xac,0x7b,0x2e,0x34,0xd, +0xa2,0x7e,0x14,0x0, 0x7, 0x12,0x3, 0x88,0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x28,0x2, +0xa1,0x8, 0x7e,0x24,0x3, 0xaa,0x7e,0x34,0x0, 0x7f,0x12,0x1e,0xb3,0x6c,0xff,0x12, +0x1f,0x1f,0x12,0x1f,0x29,0x1b,0x28,0x30,0x7e,0x50,0x7, 0xac,0x5f,0x2e,0x24,0x0, +0x81,0x12,0x1f,0x29,0x1b,0x28,0x30,0x7c,0x1f,0x2e,0x10,0x2f,0xa5,0xe7,0x70,0x18, +0x7e,0x34,0xff,0xff,0x74,0x7, 0xac,0xbf,0x59,0x35,0xd, 0xa2,0x74,0x7, 0xac,0xbf, +0x12,0x1f,0x16,0xac,0xbf,0x12,0x1f,0x42,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xc0,0x7e, +0xb3,0x3, 0xd3,0x44,0x1, 0x7a,0xb3,0x3, 0xd3,0xe5,0x2d,0xbe,0xb0,0x0, 0x28,0x30, +0x7e,0x24,0x0, 0x7f,0x7e,0x34,0x3, 0x87,0x12,0x1e,0xb3,0x6c,0xff,0x12,0x1e,0xba, +0x12,0x2e,0x95,0x74,0x7, 0xac,0xbf,0x59,0x35,0x3, 0x87,0x12,0x1e,0xd3,0x12,0x2e, +0xbe,0x74,0x7, 0xac,0xbf,0x59,0x35,0x3, 0x89,0xb, 0xf0,0xbe,0xf0,0x5, 0x78,0xdd, +0xda,0x3b,0x22,0x7e,0x14,0x0, 0x23,0x2, 0x3, 0x88,0x74,0x7, 0xac,0xbf,0x49,0x35, +0x0, 0x7f,0x22,0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32, +0x9d,0x31,0x22,0x74,0x7, 0xac,0xbf,0x49,0x35,0x0, 0x81,0x22,0x12,0x1e,0xc3,0x2d, +0x36,0x7a,0x35,0x27,0x22,0xca,0x3b,0x7a,0x15,0x34,0x7d,0x72,0x7d,0x63,0xb, 0x78, +0x20,0x12,0x1e,0xc3,0x7d,0x23,0x7e,0x35,0x34,0xad,0x23,0x12,0x1f,0xe5,0x7d,0x23, +0xb, 0x78,0x30,0xbd,0x36,0x50,0x7, 0x2d,0x23,0x1b,0x78,0x20,0x80,0x5, 0x9d,0x32, +0x1b,0x78,0x30,0xda,0x3b,0x22,0x59,0x35,0xd, 0xa4,0x6d,0x44,0x74,0x2, 0x22,0x7e, +0x50,0x7, 0xac,0x5f,0x2e,0x24,0x0, 0x7f,0x22,0xb, 0x28,0x30,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x22,0x59,0x45,0xd, 0xc5,0x7e,0x34,0x1, 0x0, 0x59,0x35,0xd, 0x98,0x22,0x74, +0x7, 0xac,0xbf,0x9, 0x75,0x0, 0x83,0x74,0x7, 0xac,0xbe,0x9, 0x5, 0x3, 0xae,0xbc, +0x7, 0x22,0x7e,0x73,0x0, 0xa2,0x7a,0x73,0x6, 0x8e,0x7e,0x24,0x0, 0x7f,0x7e,0x34, +0x6, 0x4d,0x12,0x1e,0xb3,0x12,0x29,0xe, 0x12,0x46,0x44,0x7e,0x24,0x6, 0x4d,0x7e, +0x34,0x0, 0x7f,0x12,0x1e,0xb3,0x7e,0x73,0x6, 0x8e,0x7a,0x73,0x6, 0x8f,0x7e,0x73, +0x6, 0x8e,0x7a,0x73,0x0, 0xa2,0x22,0x74,0x7, 0xac,0xb1,0x19,0x5, 0xd, 0xd3,0x74, +0x7, 0xac,0xbe,0x49,0x35,0x3, 0xaa,0x74,0x7, 0xac,0xb1,0x59,0x35,0xd, 0xcf,0x74, +0x7, 0xac,0xbe,0x49,0x35,0x3, 0xac,0x74,0x7, 0xac,0xb1,0x59,0x35,0xd, 0xd1,0x74, +0x7, 0xac,0xbf,0x9, 0x5, 0x0, 0x84,0x74,0x7, 0xac,0xb1,0x19,0x5, 0xd, 0xd4,0x74, +0x7, 0xac,0xbf,0x9, 0x5, 0x0, 0x85,0x74,0x7, 0xac,0xb1,0x19,0x5, 0xd, 0xd5,0xb, +0x10,0x22,0x12,0x0, 0xb2,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x22,0x12,0x1f,0x35,0x3e, +0x34,0x2e,0x34,0xc0,0x0, 0xa, 0x2b,0x2d,0x32,0x22,0xca,0x3b,0x7e,0xb3,0x0, 0xa2, +0xbe,0xb0,0x2, 0x50,0x2, 0x41,0x46,0xf5,0x32,0x7e,0x64,0x8, 0xaf,0x7e,0x73,0x0, +0x61,0x7a,0x73,0xd, 0xcf,0x7e,0x73,0x0, 0x62,0x7a,0x73,0xd, 0xd0,0x75,0x2f,0x1, +0x7e,0xf0,0x1, 0x41,0xd, 0x74,0x2, 0xac,0xbf,0x9, 0x65,0x0, 0x61,0x7a,0x61,0x35, +0x9, 0x55,0x0, 0x62,0x7a,0x51,0x36,0x1e,0x60,0x7e,0x70,0xc, 0xac,0x67,0x1e,0x50, +0xa, 0x25,0x2d,0x32,0x7a,0x35,0x33,0x6c,0xee,0x21,0xe7,0x12,0x22,0x70,0x12,0x22, +0x4f,0x68,0x43,0xe5,0x36,0x1a,0x3e,0x12,0x22,0x49,0x68,0x3a,0x1a,0x3e,0x3e,0x34, +0x9, 0x43,0xd, 0xcf,0x1e,0x40,0x7e,0x50,0xc, 0xac,0x45,0x9, 0x33,0xd, 0xd0,0x1e, +0x30,0xa, 0x13,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x10,0x7e,0x25,0x33,0x12, +0x22,0x7f,0xbd,0x12,0x48,0x2, 0x21,0xe0,0xe5,0x35,0x19,0xb3,0xd, 0xcf,0xe5,0x36, +0x19,0xb3,0xd, 0xd0,0x21,0xe0,0x12,0x22,0x70,0x7e,0x60,0x6, 0x12,0x22,0x52,0x78, +0x2, 0x21,0xe5,0xe5,0x36,0x1a,0x3e,0x3e,0x34,0x9, 0x73,0xd, 0xd0,0x7e,0x60,0x6, +0x12,0x22,0x52,0x78,0x2, 0x21,0xe5,0x1a,0x3e,0x3e,0x34,0x9, 0xa3,0xd, 0xcf,0x1e, +0xa0,0x7e,0x90,0x2, 0xac,0x9f,0x9, 0xb4,0x0, 0x61,0x1e,0xb0,0x2c,0xba,0xf5,0x30, +0x9, 0xa3,0xd, 0xd0,0x1e,0xa0,0x9, 0xb4,0x0, 0x62,0x1e,0xb0,0x2c,0xba,0xf5,0x31, +0x6d,0x33,0x80,0x28,0x1a,0x3e,0xbe,0x35,0x27,0x68,0x1c,0xe5,0x30,0x7e,0x35,0x27, +0x12,0x22,0x74,0x12,0x22,0x4f,0x68,0xf, 0xe5,0x31,0x7e,0x35,0x27,0x12,0x22,0x49, +0x68,0x5, 0x75,0x30,0xff,0x80,0x11,0x7e,0x35,0x27,0xb, 0x34,0x7a,0x35,0x27,0xe5, +0x2f,0xa, 0x3b,0xbe,0x35,0x27,0x18,0xcc,0xe5,0x30,0xbe,0xb0,0xff,0x78,0x2, 0x21, +0xe5,0x1a,0x1e,0x3e,0x14,0x9, 0x1, 0xd, 0xcf,0x1e,0x0, 0x7e,0x10,0xc, 0xac,0x1, +0x9, 0x71,0xd, 0xd0,0x1e,0x70,0xa, 0x37,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, +0x20,0x7e,0x35,0x33,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0xbd,0x23,0x8, 0x5, 0x7a, +0x25,0x29,0x80,0x3, 0x7a,0x35,0x29,0x7e,0x35,0x29,0x7d,0x23,0xe, 0x24,0xe, 0x24, +0xe, 0x34,0x2d,0x32,0x7a,0x35,0x29,0xbe,0x34,0x0, 0x55,0x58,0x7, 0x7e,0x34,0x0, +0x55,0x7a,0x35,0x29,0xe5,0x30,0x1a,0x1b,0xb, 0x14,0xe, 0x14,0x7e,0x44,0x0, 0xc, +0xad,0x14,0x7e,0x71,0x31,0x1e,0x70,0xa, 0x37,0x12,0x22,0x7b,0x7e,0x11,0x30,0xe, +0x10,0x1a,0x1, 0x7d,0x50,0xad,0x54,0x2d,0x35,0x12,0x26,0xdd,0x7a,0x35,0x2b,0xe, +0x34,0x7a,0x35,0x2b,0xe5,0x31,0xa, 0x3b,0xb, 0x34,0xe, 0x34,0x12,0x22,0x7b,0x7e, +0x14,0x0, 0xc, 0xad,0x10,0x2d,0x31,0x12,0x26,0xdd,0x7a,0x35,0x2d,0xe, 0x34,0x7a, +0x35,0x2d,0x2e,0x35,0x2b,0xe, 0x34,0xbe,0x35,0x29,0x48,0x19,0xe5,0x30,0x1a,0x3e, +0x3e,0x34,0x19,0xb3,0xd, 0xcf,0xe5,0x31,0x1a,0x3e,0x3e,0x34,0x19,0xb3,0xd, 0xd0, +0x7e,0xe0,0xff,0x80,0xa, 0xb, 0xe0,0xe5,0x2f,0xbc,0xbe,0x8, 0x2, 0x1, 0x4b,0xe5, +0x2f,0xbc,0xbe,0x78,0x16,0x7e,0xa1,0x35,0x7e,0x71,0x2f,0x74,0x2, 0xac,0x7b,0x19, +0xa3,0xd, 0xcf,0xe5,0x36,0x19,0xb3,0xd, 0xd0,0x5, 0x2f,0xb, 0xf0,0xe5,0x32,0xbc, +0xbf,0x28,0x2, 0x1, 0x25,0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x24,0x6c,0xff,0x80,0x1a, +0x74,0x2, 0xac,0xbf,0x9, 0x75,0xd, 0xcf,0x19,0x75,0x0, 0x61,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0xd, 0xd0,0x19,0x75,0x0, 0x62,0xb, 0xf0,0xe5,0x2f,0xbc,0xbf,0x38,0xe0, +0xe5,0x2f,0x7a,0xb3,0x0, 0xa2,0xda,0x3b,0x22,0x3e,0x34,0x9, 0x73,0xd, 0xd0,0x7e, +0x60,0x2, 0x12,0x22,0x5a,0xa, 0x3b,0x4d,0x33,0x22,0x7c,0xa6,0x7c,0x57,0xa, 0x3b, +0xa, 0x25,0x12,0x1e,0xc3,0xa, 0x2a,0xbd,0x32,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22, +0xe5,0x35,0x1a,0x3e,0x3e,0x34,0x9, 0x73,0xd, 0xcf,0x22,0x7d,0x21,0x2d,0x23,0x3e, +0x24,0x2d,0x26,0xb, 0x28,0x20,0x22,0xca,0x3b,0x7e,0xb3,0x0, 0xa2,0xf5,0x28,0x7e, +0x67,0x6, 0x94,0x7e,0xb3,0xa, 0xd8,0xf5,0x2d,0x7e,0xb3,0xa, 0xd9,0xf5,0x2e,0x15, +0x2d,0x7e,0x24,0xa, 0x8f,0x7e,0x34,0xd, 0xcf,0x12,0x26,0xcc,0xe5,0x28,0xbe,0xb0, +0x0, 0x38,0x2, 0x61,0xa0,0x6c,0xff,0x6c,0xee,0x61,0x94,0x7e,0x70,0x2, 0xac,0x7e, +0x9, 0xb3,0x0, 0x61,0x1e,0xb0,0xf5,0x29,0x9, 0xb3,0x0, 0x62,0x1e,0xb0,0xf5,0x2a, +0x74,0x2, 0x12,0x23,0xa3,0x7e,0x51,0x2a,0xac,0x5b,0x7e,0x71,0x29,0x12,0x27,0xe, +0x49,0x33,0x8, 0xaf,0xbd,0x36,0x50,0x2, 0x61,0x8d,0xe5,0x29,0xbe,0xb0,0x1, 0x28, +0x23,0xe5,0x2d,0xa, 0x2b,0x1b,0x25,0xe5,0x29,0xa, 0x3b,0xbd,0x32,0x58,0x15,0xe5, +0x2a,0xbe,0xb0,0x1, 0x28,0xe, 0xe5,0x2e,0xa, 0x2b,0x1b,0x25,0xe5,0x2a,0xa, 0x3b, +0xbd,0x32,0x48,0x5, 0x74,0x1, 0x12,0x23,0xa3,0x75,0x27,0x0, 0x80,0x3a,0xbe,0xe1, +0x27,0x68,0x33,0x7e,0xa1,0x27,0x12,0x26,0xe7,0x7a,0x71,0x2b,0x9, 0xb5,0x0, 0x62, +0x1e,0xb0,0xf5,0x2c,0xe5,0x29,0x7e,0x60,0x3, 0x12,0x22,0x5a,0xbe,0xb0,0x1, 0x68, +0xe, 0xe5,0x2a,0x7e,0x71,0x2c,0x7e,0x60,0x3, 0x12,0x22,0x5a,0xb4,0x1, 0x7, 0x74, +0x1, 0x12,0x23,0xa3,0x80,0x9, 0x5, 0x27,0xe5,0x28,0xbe,0xb1,0x27,0x38,0xbf,0x7a, +0xe3,0x1, 0xca,0x7a,0xf3,0x1, 0xcb,0xe5,0x29,0xbe,0xb0,0x14,0x50,0xc, 0x7e,0x34, +0xa, 0x8f,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x0, 0x46,0x12,0x26,0xf1,0x12,0x23,0xaa, +0x7e,0x24,0xd, 0xcf,0x7e,0x34,0xa, 0x8f,0x12,0x26,0xcc,0xb, 0xf0,0xbe,0xf0,0x5, +0x50,0xa, 0xb, 0xe0,0xe5,0x28,0xbc,0xbe,0x28,0x2, 0x41,0xbb,0x7a,0xf3,0x0, 0xa2, +0xda,0x3b,0x22,0xa, 0x3e,0x19,0xb3,0x1, 0xbb,0x22,0xca,0x3b,0x7d,0xd0,0x7d,0xc1, +0x7d,0x93,0x6c,0xaa,0x6c,0x77,0x6d,0x88,0x7a,0x87,0xd, 0xe7,0x7a,0x87,0xd, 0xe9, +0x7e,0xa4,0x0, 0x1, 0x9, 0x6d,0x1, 0x69,0x9, 0xbd,0x1, 0x6a,0xf5,0x2f,0xa, 0x46, +0x2d,0x4d,0x9, 0x34,0x1, 0x5a,0x49,0x4c,0x0, 0x13,0x7d,0x9, 0x2e,0x4, 0x1, 0xf8, +0x7d,0xb9,0x2e,0xb4,0x3, 0xf0,0x6c,0x22,0x7e,0xf0,0x7, 0xac,0xfb,0x7d,0x87,0x2d, +0x8d,0x19,0x28,0x0, 0x23,0xe4,0x7d,0x87,0x2d,0x8d,0x19,0xb8,0x0, 0x24,0x7e,0xf0, +0x2, 0xac,0xf6,0x7d,0x87,0x2d,0x8d,0x7e,0x89,0x20,0x1e,0x20,0x7e,0xd0,0xc, 0xac, +0xd2,0x9, 0x28,0x0, 0x1, 0x1e,0x20,0xa, 0x82,0x2d,0x86,0x7a,0xb3,0xd, 0xf7,0x3e, +0x84,0x2d,0x80,0xb, 0x88,0x60,0xb, 0xc8,0x80,0xbd,0x68,0x48,0x6, 0x74,0x1, 0x7a, +0xb3,0xd, 0xf7,0x7d,0xa9,0x2e,0xa4,0x1, 0xf8,0x7d,0x6a,0xa, 0x6c,0x7c,0xbd,0xf5, +0xba,0x7d,0x6a,0x7c,0xbd,0xf5,0xb9,0x7d,0x97,0x2d,0x9d,0x12,0x26,0xc1,0xbd,0x89, +0x40,0x15,0x12,0x26,0xb7,0x9, 0x79,0x0, 0x1, 0x1e,0x70,0xa, 0x97,0xa, 0x83,0x9d, +0x98,0x7d,0x79,0x7c,0x7f,0x80,0x2, 0x6c,0x77,0x7a,0x71,0xbb,0x12,0x26,0xb7,0x7e, +0x99,0x20,0x12,0x26,0xc5,0xbd,0x89,0x40,0xa, 0xa, 0x93,0x7d,0x58,0x9d,0x59,0x7c, +0xab,0x80,0x2, 0x6c,0xaa,0x1a,0x9a,0x3e,0x94,0x3e,0x94,0x3e,0x94,0x3e,0x94,0x7d, +0x79,0x7c,0x2f,0x7c,0xb2,0x42,0xbb,0x7c,0xba,0xe, 0xb0,0xe, 0xb0,0xe, 0xb0,0xe, +0xb0,0xf5,0xbc,0x9, 0x2c,0x0, 0x22,0xa, 0x92,0x3e,0x94,0x3e,0x94,0x5e,0x94,0x0, +0xf0,0x7d,0x79,0x7c,0x2f,0x7c,0xb2,0x42,0xbc,0x75,0xc3,0x0, 0x12,0x26,0xb7,0x12, +0x26,0xc1,0x2d,0x98,0x9, 0x22,0x0, 0x1, 0xa, 0x82,0xbd,0x98,0x50,0x2, 0x80,0x4, +0xa, 0x92,0x1b,0x94,0x7d,0x79,0x7c,0xbf,0xf5,0x31,0x9, 0x22,0x0, 0x2f,0x7c,0xb2, +0xc4,0x33,0x54,0xe0,0x7c,0x2b,0xe5,0x31,0x9c,0xb7,0x4, 0x4c,0xb2,0xf5,0xc3,0x12, +0x26,0xb7,0x7e,0x99,0x20,0x12,0x26,0xc5,0x2d,0x98,0x7e,0x29,0x20,0xa, 0x82,0xbd, +0x98,0x50,0x4, 0x7d,0x79,0x80,0x6, 0xa, 0xa2,0x1b,0xa4,0x7d,0x7a,0x7c,0xbf,0xf5, +0x30,0x1a,0x9a,0xe5,0x30,0x1a,0xab,0x9d,0xa9,0xb, 0xa4,0x7d,0x7a,0x7c,0xbf,0xf5, +0xc4,0x7e,0xa4,0xd, 0xf8,0x7d,0x7a,0xa, 0x7e,0x7c,0xbf,0xf5,0xc1,0x7d,0x7a,0x7c, +0xbf,0xf5,0xbd,0x75,0xc2,0x7, 0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xe5, +0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x7e,0x7f,0xe, 0x0, 0x7a,0x7f,0xd, 0xf3,0x7e, +0x7f,0xe, 0x4, 0x7a,0x7f,0xd, 0xeb,0x7e,0x7f,0xd, 0xfc,0x7a,0x7f,0xd, 0xef,0x7e, +0x7f,0xd, 0xf8,0x74,0x2, 0xac,0xb6,0x2d,0x5d,0x7e,0x59,0xa0,0x1e,0xa0,0x9c,0xa3, +0xc1,0xf, 0x12,0x26,0xd3,0x9, 0x7a,0x0, 0x1, 0x1e,0x70,0x9c,0x73,0x80,0x79,0xbe, +0xa0,0x0, 0x48,0x72,0x7e,0x29,0x20,0xbc,0x2a,0x8, 0x6b,0xbe,0x70,0x0, 0x48,0x66, +0x9, 0x22,0x0, 0x1, 0xbc,0x27,0x8, 0x5e,0x1a,0x8a,0x7e,0x94,0x0, 0xc, 0xad,0x98, +0x1a,0xa7,0x2d,0xa9,0x7d,0x9a,0x3e,0x94,0x2d,0x90,0xb, 0x98,0x90,0xbd,0x94,0x48, +0x16,0x7e,0xf1,0x2f,0x74,0x7, 0xac,0xfb,0x7d,0x97,0x2d,0x9d,0x2e,0x94,0x0, 0x24, +0x7e,0x99,0xb0,0x4, 0x7a,0x99,0xb0,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x28,0x7d,0x9a, +0x5e,0x94,0x0, 0x7, 0x2e,0x94,0x3, 0xd4,0x7d,0x79,0x7a,0xf1,0x82,0x7a,0xe1,0x83, +0xe4,0x93,0x64,0xff,0x7d,0x9a,0x1e,0x94,0x1e,0x94,0x1e,0x94,0x2d,0x9b,0x7e,0x99, +0x20,0x5c,0x2b,0x7a,0x99,0x20,0xb, 0x70,0x12,0x26,0xb7,0x9, 0xb9,0x0, 0x1, 0x1e, +0xb0,0x2c,0xb3,0x1a,0x8b,0x1a,0x97,0xbd,0x98,0x18,0x2, 0xa1,0x7f,0xb, 0xa0,0x12, +0x26,0xd3,0x7e,0xa9,0xb0,0x1e,0xb0,0x2c,0xb3,0x1a,0x9b,0x1a,0xaa,0xbd,0xa9,0x18, +0x2, 0xa1,0x72,0x74,0x6, 0x7e,0x1f,0xd, 0xeb,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1f, +0xd, 0xeb,0x7e,0xf, 0xd, 0xf3,0x7e,0x1f,0xd, 0xeb,0x12,0x0, 0xb4,0x7d,0xb3,0x2e, +0xb4,0x0, 0x20,0x7a,0xb7,0xd, 0xe7,0x74,0x6, 0x7e,0x1f,0xd, 0xef,0x2f,0x11,0x14, +0x78,0xfb,0x7a,0x1f,0xd, 0xef,0x7f,0x7, 0x12,0x0, 0xb4,0x7d,0x23,0x2e,0x24,0x0, +0x20,0x7a,0x27,0xd, 0xe9,0x7e,0x71,0x2f,0x74,0x7, 0xac,0x7b,0x7d,0xa3,0x2d,0xad, +0x59,0xba,0x0, 0x1e,0x7d,0x13,0x2d,0x1d,0x59,0x21,0x0, 0x20,0x9, 0xbc,0x0, 0x12, +0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0xbe, +0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x2f,0x7d,0xc3,0x2d,0xcd,0x19, +0x5c,0x0, 0x23,0x2d,0x3d,0x9, 0x53,0x0, 0x24,0xbe,0x50,0xf, 0x28,0x6, 0x74,0xf, +0x19,0xb3,0x0, 0x24,0xda,0x3b,0x22,0x7e,0xf0,0x2, 0xac,0xf6,0x7d,0x97,0x2d,0x9d, +0x22,0x9, 0x29,0x0, 0x1, 0x1e,0x20,0xa, 0x82,0xa, 0x93,0x22,0x7e,0x14,0x0, 0x18, +0x2, 0x3, 0x88,0x7e,0xf0,0x2, 0xac,0xf6,0x7d,0xa7,0x2d,0xad,0x22,0x3e,0x34,0x2d, +0x36,0xb, 0x38,0x30,0x2d,0x32,0x22,0x74,0x2, 0xa4,0x9, 0x75,0x0, 0x61,0x1e,0x70, +0x22,0x7e,0x34,0x6, 0xb7,0x7e,0x24,0xa, 0xd8,0x7e,0x14,0x6, 0x94,0x7e,0x4, 0x0, +0x61,0x22,0x9, 0x47,0x0, 0x1, 0x7e,0x50,0x2, 0xac,0x45,0x7e,0x71,0x2c,0x74,0x18, +0xac,0x7b,0x2d,0x32,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x27,0x75,0x2b,0x0, 0x75, +0x2c,0x0, 0x7e,0x23,0x0, 0xa2,0x7a,0x21,0x29,0x7e,0x34,0x8, 0xaf,0x7a,0x37,0xd, +0xcf,0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0x0, 0x61,0x7e,0x34,0xd, 0xd1,0x12,0x3, +0x88,0xe5,0x29,0xbe,0xb0,0x5, 0x38,0x3, 0x2, 0x28,0xcb,0x75,0x2a,0x0, 0x6c,0xff, +0x2, 0x28,0x1, 0x7e,0x34,0x3, 0xff,0x7a,0x35,0x2d,0x75,0x2c,0xff,0x6c,0xee,0x80, +0x52,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0xd1,0xbe,0xb0,0xff,0x68,0x42,0x9, +0x73,0xd, 0xd2,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0xd, 0x7b,0xa, 0x37,0x12, +0x47,0xc5,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0xd1,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0xd, 0x7a,0xa, 0x37,0x9d,0x32,0x12,0x0, 0x2e,0x2d,0x36,0x7a,0x35,0x2f, +0x7e,0x35,0x2d,0xbe,0x35,0x2f,0x28,0x9, 0x7e,0x35,0x2f,0x7a,0x35,0x2d,0x7a,0xe1, +0x2c,0xb, 0xe0,0xe5,0x29,0xbc,0xbe,0x38,0xa8,0xe5,0x2c,0xbe,0xb0,0xff,0x68,0x3f, +0x7e,0x71,0x2c,0x74,0x2, 0xac,0x7b,0x9, 0x33,0xd, 0xd1,0x7c,0x43,0x1e,0x40,0x7e, +0x50,0xc, 0xac,0x45,0x9, 0xa3,0xd, 0xd2,0x7c,0x2a,0x1e,0x20,0xa, 0x2, 0x2d,0x20, +0x12,0x2e,0x8b,0xbe,0x24,0x0, 0x55,0x48,0x16,0xe5,0x2a,0x1a,0x2b,0x3e,0x24,0x19, +0x32,0xd, 0xef,0x19,0xa2,0xd, 0xf0,0x74,0xff,0x19,0xb3,0xd, 0xd1,0x5, 0x2a,0xb, +0xf0,0xe5,0x5c,0xbc,0xbf,0x28,0x3, 0x2, 0x27,0x53,0x7e,0xf1,0x2a,0x1, 0xb2,0x6d, +0x33,0x7a,0x35,0x27,0x7e,0xa0,0xff,0x6c,0xee,0x80,0x6c,0x7e,0x90,0x2, 0xac,0x9e, +0x9, 0x44,0xd, 0xd1,0xbe,0x40,0xff,0x68,0x5c,0x1e,0x40,0x7e,0x50,0xc, 0xac,0x45, +0x9, 0xb4,0xd, 0xd2,0x1e,0xb0,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27,0xd, 0xcf, +0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30,0x7e,0x50, +0x2, 0xac,0x5e,0x9, 0x62,0xd, 0xd1,0x7c,0x76,0x1e,0x70,0x7e,0x30,0xc, 0xac,0x37, +0x9, 0x72,0xd, 0xd2,0x7c,0xb7,0x1e,0xb0,0xa, 0xb, 0x2d,0x10,0x3e,0x14,0x2e,0x17, +0xd, 0xcf,0xb, 0x18,0x40,0xbe,0x45,0x27,0x48,0xb, 0x7a,0x61,0x2b,0x7a,0x71,0x2c, +0x7a,0x45,0x27,0x7c,0xae,0xb, 0xe0,0xe5,0x29,0xbc,0xbe,0x38,0x8e,0xbe,0xa0,0xff, +0x68,0x1e,0x7e,0x71,0x2b,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0xd, 0xef,0xe5,0x2c, +0x19,0xb4,0xd, 0xf0,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0xd, 0xd1, +0xb, 0xf0,0xbe,0xf0,0x5, 0x50,0x2, 0x1, 0xf, 0x7e,0x24,0xd, 0xef,0x7e,0x34,0xd, +0xd1,0x7e,0x14,0x0, 0x1e,0x12,0x3, 0x88,0x75,0x29,0x5, 0x7e,0x34,0xd, 0x7a,0x12, +0x29,0x5, 0xe5,0x29,0xbe,0xb0,0x0, 0x28,0x18,0x12,0x28,0xfd,0x7e,0x24,0xd, 0xd1, +0x12,0x2b,0x3f,0x12,0x28,0xfd,0x7e,0x24,0xd, 0xd1,0x7e,0x34,0xd, 0x7a,0x12,0x3, +0x88,0x85,0x29,0x5c,0xe5,0x29,0x7a,0xb3,0x0, 0xa2,0xda,0x3b,0x22,0x7e,0x31,0x29, +0x74,0x2, 0xac,0x3b,0x22,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x2, 0x0, 0x46,0xca,0x3b, +0x6c,0xdd,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7d,0x19,0xa3,0x6, 0x51,0x7c,0x1d, +0x2e,0x10,0x27,0xe4,0xa5,0xf7,0xb, 0xd0,0xbe,0xd0,0x5, 0x78,0xe5,0x7e,0xc3,0x6, +0x8e,0x4c,0xcc,0x78,0x18,0x7e,0xb3,0x6, 0x8f,0x70,0x2, 0x41,0xb5,0x7e,0x34,0x6, +0x7a,0x12,0x29,0x5, 0x7e,0x34,0x6, 0x84,0x12,0x29,0x5, 0x41,0xb5,0x7e,0xb3,0x6, +0x8f,0x70,0x1f,0xbe,0xc0,0x1, 0x78,0x1a,0x7e,0x37,0x6, 0x4d,0x7a,0x37,0x6, 0x7a, +0x7e,0x37,0x6, 0x4f,0x7a,0x37,0x6, 0x84,0x75,0x27,0x1, 0xe4,0x7a,0xb3,0x6, 0x51, +0x41,0xb5,0x6c,0xdd,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5d,0x59,0x32,0xd, +0xe3,0x7c,0xbd,0x7c,0xad,0x20,0xe0,0xb, 0x1e,0xa0,0x74,0x2, 0xa4,0x49,0x35,0x6, +0x7a,0x80,0x9, 0x1e,0xa0,0x74,0x2, 0xa4,0x49,0x35,0x6, 0x84,0x59,0x32,0xd, 0xcf, +0xb, 0xd0,0xbe,0xd0,0xa, 0x78,0xcd,0x6c,0xdd,0x80,0x25,0x7c,0xbd,0x7c,0xad,0x20, +0xe0,0xb, 0x1e,0xa0,0x74,0x7, 0xa4,0x49,0x35,0x6, 0x4d,0x80,0x9, 0x1e,0xa0,0x74, +0x7, 0xa4,0x49,0x35,0x6, 0x4f,0x74,0x2, 0xac,0xbd,0x59,0x35,0xd, 0xe3,0xb, 0xd0, +0x7e,0x73,0x6, 0x8e,0xa, 0x27,0x3e,0x24,0xa, 0x3d,0xbd,0x32,0x40,0xcd,0x7e,0x34, +0xd, 0xcf,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba,0x7e,0x34,0xd, 0xe3,0x7c,0xb7, +0xf5,0xbb,0xa, 0x56,0xf5,0xbc,0x75,0xc3,0x5, 0x75,0xc2,0x2b,0x80,0x3, 0x75,0xc2, +0xb, 0x0, 0x0, 0x0, 0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x75,0xc5,0xe, +0xe5,0xc6,0xa, 0x1b,0xe5,0xc6,0x7c,0xb, 0x6c,0x11,0x4d,0x10,0x6c,0xdd,0x74,0x3, +0xac,0xbd,0x7d,0x1, 0x60,0x5, 0x1e,0x4, 0x14,0x78,0xfb,0x7d,0x50,0x5e,0x54,0x0, +0x7, 0x7c,0xab,0x1b,0xa0,0x7e,0xb3,0x6, 0x8e,0xbc,0xba,0x28,0x4c,0x7e,0x10,0x2, +0xac,0x1d,0x12,0x2b,0x36,0x78,0x19,0x6c,0xff,0x7e,0x10,0x2, 0xac,0x1f,0x12,0x2b, +0x36,0x78,0x4, 0x7c,0xef,0x80,0xb, 0xb, 0xf0,0xbe,0xf0,0x5, 0x40,0xeb,0x80,0x2, +0x7c,0xed,0x7e,0x50,0x7, 0xac,0x5a,0x19,0xe2,0x6, 0x51,0x7c,0x1e,0x2e,0x10,0x27, +0x74,0x1, 0xa5,0xf7,0x49,0x2, 0x6, 0x4d,0x7e,0x70,0x2, 0xac,0x7e,0x59,0x3, 0x6, +0x7a,0x49,0x2, 0x6, 0x4f,0x59,0x3, 0x6, 0x84,0xb, 0xd0,0xbe,0xd0,0x5, 0x78,0x8e, +0x6c,0xdd,0x12,0x2b,0x2e,0xbe,0xb0,0x1, 0x68,0x14,0x7e,0x44,0xff,0xff,0x74,0x2, +0xac,0xbd,0x59,0x45,0x6, 0x7a,0x7e,0x34,0xff,0xff,0x59,0x35,0x6, 0x84,0xb, 0xd0, +0xbe,0xd0,0x5, 0x78,0xdd,0x7e,0xf3,0x6, 0x8e,0x6c,0xdd,0x12,0x2b,0x2e,0xb4,0x1, +0x2d,0xa, 0x3d,0x9, 0xb3,0x6, 0x75,0xb4,0x1, 0x8, 0x74,0x3, 0xa, 0x3d,0x19,0xb3, +0x6, 0x75,0xa, 0x3d,0x9, 0xa3,0x6, 0x75,0xbe,0xa0,0x3, 0x78,0x9, 0xe4,0xa, 0x4d, +0x19,0xb4,0x6, 0x70,0x80,0x32,0x4c,0xaa,0x78,0x2e,0x74,0x2, 0x80,0x24,0xa, 0x3d, +0x9, 0xb3,0x6, 0x75,0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x15,0x74,0x1, 0xa, 0x3d,0x19, +0xb3,0x6, 0x70,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4,0x19,0xd5,0x6, 0x51,0x80,0x8, +0x74,0x3, 0xa, 0x3d,0x19,0xb3,0x6, 0x70,0xa, 0x3d,0x9, 0x73,0x6, 0x70,0xa, 0x2d, +0x19,0x72,0x6, 0x75,0xb, 0xd0,0xbe,0xd0,0x5, 0x40,0x90,0xda,0x3b,0x22,0x7c,0x1d, +0x2e,0x10,0x27,0xa5,0xe7,0x22,0x49,0x0, 0x6, 0x7a,0xbe,0x4, 0xff,0xff,0x22,0x7e, +0x34,0x0, 0x61,0x2, 0x3, 0x88,0xca,0x3b,0x7e,0xb3,0x0, 0xa2,0xf5,0x28,0x75,0x47, +0x0, 0x7e,0x35,0xd, 0xbe,0x34,0x0, 0x0, 0x28,0x3, 0x75,0xc, 0x1, 0x7e,0x35,0x19, +0xbe,0x34,0x0, 0x0, 0x28,0x3, 0x75,0x18,0x1, 0x6d,0x33,0x7a,0x35,0x50,0x7a,0x35, +0x54,0x7a,0x35,0x4c,0x6c,0xff,0x6c,0xee,0x1a,0x2e,0x3e,0x24,0x12,0x2d,0x3d,0x49, +0x63,0x8, 0xaf,0xbe,0x64,0x0, 0x32,0x48,0xa, 0x7d,0x36,0x2e,0x35,0x54,0x7a,0x35, +0x54,0x80,0x11,0xbe,0x64,0xff,0xce,0x18,0xb, 0x7d,0x36,0x12,0x0, 0x2e,0x2e,0x35, +0x50,0x7a,0x35,0x50,0xbe,0x64,0xff,0x9c,0x58,0x18,0x7e,0x35,0x4c,0xb, 0x34,0x7a, +0x35,0x4c,0xbe,0x34,0x0, 0xa, 0x28,0xa, 0x75,0xc, 0x1, 0x7e,0x34,0x3, 0xe8,0x7a, +0x35,0xd, 0xb, 0xe0,0xbe,0xe0,0xc, 0x78,0xaf,0xb, 0xf0,0xbe,0xf0,0x15,0x78,0xa6, +0xe5,0x28,0xbe,0xb0,0x0, 0x38,0x2, 0xa1,0x20,0x6c,0xff,0x81,0xed,0x74,0x2, 0xac, +0xbf,0x9, 0xe5,0x0, 0x61,0x1e,0xe0,0x7a,0xe1,0x48,0x9, 0x75,0x0, 0x62,0x1e,0x70, +0x7a,0x71,0x49,0x1a,0x17,0x12,0x2d,0x29,0x49,0x33,0x8, 0xaf,0x7a,0x35,0x4a,0x6d, +0x33,0x7a,0x35,0x4e,0x7a,0x35,0x52,0x1b,0xe0,0x80,0x62,0xe5,0x49,0x14,0xf5,0x27, +0x80,0x4b,0xbe,0xe0,0x0, 0x48,0x44,0xbe,0xe0,0x15,0x58,0x3f,0xe5,0x27,0xbe,0xb0, +0x0, 0x48,0x38,0xe5,0x27,0xbe,0xb0,0xc, 0x58,0x31,0xe5,0x48,0xbc,0xbe,0x78,0x7, +0xe5,0x49,0xbe,0xb1,0x27,0x68,0x24,0xe5,0x27,0x1a,0x1b,0x12,0x2d,0x29,0x49,0x63, +0x8, 0xaf,0xbe,0x64,0x0, 0x0, 0x7d,0x36,0x58,0xb, 0x12,0x0, 0x2e,0x2e,0x35,0x4e, +0x7a,0x35,0x4e,0x80,0x6, 0x2e,0x35,0x52,0x7a,0x35,0x52,0x5, 0x27,0xe5,0x49,0x1a, +0x2b,0xb, 0x24,0xe5,0x27,0x1a,0x3b,0xbd,0x32,0x8, 0xa7,0xb, 0xe0,0xe5,0x48,0x1a, +0x2b,0xb, 0x24,0x1a,0x3e,0xbd,0x32,0x8, 0x92,0x7e,0x35,0x54,0x2e,0x34,0x0, 0x64, +0xbe,0x35,0x50,0x58,0x1d,0x7e,0x25,0x4a,0xbe,0x24,0x0, 0xa0,0x50,0x9, 0x7e,0x35, +0x52,0xbe,0x34,0x1, 0x90,0x48,0x54,0x12,0x2d,0x36,0x12,0x1f,0x2c,0xbe,0x35,0x4e, +0x48,0x49,0x7e,0x35,0x52,0xbe,0x35,0x4e,0x48,0x41,0xe5,0xc, 0xbe,0xb0,0x1, 0x68, +0x5, 0xe5,0x18,0xb4,0x1, 0x11,0xbe,0x34,0x1, 0x90,0x8, 0x2f,0x7e,0x35,0x4a,0xbe, +0x34,0x0, 0xa0,0x28,0x26,0x80,0x0, 0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xa1,0x0, 0x61, +0x7e,0x11,0x47,0x3e,0x10,0x7c,0x1, 0x2e,0x0, 0x29,0x7c,0xba,0xa5,0xf6,0x9, 0x1, +0x0, 0x62,0x2e,0x10,0x2a,0x7c,0xb0,0xa5,0xf7,0x5, 0x47,0xb, 0xf0,0xe5,0x28,0xbc, +0xbf,0x28,0x2, 0x61,0xdd,0xe5,0x47,0xbe,0xb0,0x0, 0x28,0xf, 0xe5,0x47,0xa, 0x1b, +0x3e,0x14,0x7e,0x24,0x0, 0x29,0x12,0x2b,0x3f,0x80,0xf, 0x7e,0x35,0x54,0xbe,0x35, +0x50,0x58,0x7, 0x7e,0x34,0x3, 0xe8,0x7a,0x35,0x19,0xe5,0x47,0x7a,0xb3,0x0, 0xa2, +0x75,0xc, 0x0, 0x75,0x18,0x0, 0xda,0x3b,0x22,0x3e,0x14,0x1a,0x2e,0x7e,0x34,0x0, +0x18,0xad,0x32,0x2d,0x31,0x22,0x7e,0x34,0x0, 0xc, 0xad,0x32,0x22,0x7e,0x70,0x18, +0xac,0x7f,0x2d,0x32,0x22,0xca,0x3b,0x7d,0x61,0x7d,0x73,0x7e,0x34,0xd8,0xf0,0x7a, +0x35,0x29,0x7e,0x34,0x27,0x10,0x7a,0x35,0x2b,0x6d,0x33,0x7a,0x35,0x2d,0x9, 0xb7, +0x0, 0xd9,0xf5,0x35,0x9, 0x77,0x0, 0x43,0x2d,0x37,0x9, 0xb3,0x0, 0xc, 0xf5,0x36, +0x7d,0x32,0x2e,0x34,0x1, 0xf8,0x7a,0x37,0xd, 0xcf,0x7d,0x37,0x2e,0x34,0x0, 0x49, +0x7a,0x37,0xd, 0xd1,0x49,0x32,0x4, 0x11,0x7a,0x37,0xd, 0xd3,0x75,0x31,0x0, 0xc1, +0x34,0xe5,0x31,0xa, 0x2b,0x3e,0x24,0x12,0x2d,0x36,0x7a,0x35,0x33,0x75,0x32,0x0, +0xc1,0x25,0xe5,0x32,0xa, 0x3b,0x2e,0x35,0x33,0x3e,0x34,0x2e,0x37,0xd, 0xcf,0x49, +0x23,0x0, 0x18,0xb, 0x38,0x30,0x9d,0x32,0x7a,0x35,0x2f,0x7e,0x35,0x29,0xbe,0x35, +0x2f,0x58,0x6, 0x7e,0x35,0x2f,0x7a,0x35,0x29,0x7e,0x35,0x2b,0xbe,0x35,0x2f,0x8, +0x6, 0x7e,0x35,0x2f,0x7a,0x35,0x2b,0x7e,0x35,0x2f,0x12,0x0, 0x2e,0xbe,0x35,0x2d, +0x28,0x9, 0x7e,0x35,0x2f,0x12,0x0, 0x2e,0x7a,0x35,0x2d,0xe5,0x36,0x70,0x34,0x7e, +0x11,0x35,0x74,0xc, 0xac,0x1b,0xe5,0x32,0xa, 0x1b,0x2d,0x1, 0x3e,0x4, 0x2e,0x7, +0xd, 0xd3,0xb, 0x8, 0x30,0xe5,0x32,0xa, 0x2b,0x2e,0x25,0x33,0x12,0x2e,0x8b,0x2d, +0x23,0x7e,0x71,0x31,0x74,0xc, 0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xd, 0xd1, +0x1b,0x38,0x20,0x5, 0x32,0x9, 0x76,0x0, 0x1, 0xbe,0x71,0x32,0x28,0x2, 0xa1,0xa2, +0x5, 0x35,0x5, 0x31,0x9, 0x77,0x1, 0xc, 0xbe,0x71,0x31,0x28,0x2, 0xa1,0x91,0xb, +0x78,0x30,0xbe,0x34,0x0, 0x1, 0x78,0x8, 0x7e,0x35,0x29,0x9e,0x35,0x2b,0x80,0x3, +0x7e,0x35,0x2d,0x59,0x37,0x0, 0x47,0xe5,0x36,0x70,0x24,0x74,0x1, 0x19,0xb7,0x1, +0xe, 0xe4,0x19,0xb7,0x1, 0xf, 0x9, 0x77,0x0, 0xd9,0xa, 0x37,0x9, 0x57,0x1, 0xc, +0xa, 0x25,0x2d,0x23,0x7e,0x69,0x70,0xbd,0x23,0x40,0xd, 0x74,0x1, 0x80,0x5, 0xe4, +0x19,0xb7,0x1, 0xe, 0x19,0xb7,0x1, 0xf, 0xda,0x3b,0x22,0x3e,0x24,0x2e,0x27,0xd, +0xcf,0xb, 0x28,0x20,0x22,0xbe,0x34,0x0, 0x0, 0x40,0x2, 0x80,0x2, 0x6d,0x33,0x6d, +0x22,0x7e,0x14,0xcf,0x0, 0x7e,0x4, 0x0, 0x2, 0x12,0x0, 0x98,0x7e,0x14,0x2, 0xff, +0x12,0x1f,0xe2,0xbe,0x18,0x2, 0xd0,0x40,0x4, 0x7e,0x18,0x2, 0xcf,0x22,0xbe,0x34, +0x0, 0xa, 0x40,0x6, 0x9e,0x34,0x0, 0xa, 0x80,0x2, 0x6d,0x33,0x6d,0x22,0x7e,0x14, +0xff,0x0, 0x7e,0x4, 0x0, 0x4, 0x12,0x0, 0x98,0x7e,0x14,0x4, 0xeb,0x12,0x1f,0xe2, +0xbe,0x18,0x5, 0x8c,0x40,0x4, 0x7e,0x18,0x5, 0x8b,0x22,0x6c,0xaa,0x80,0x16,0x7e, +0x30,0x7, 0xac,0x3a,0x49,0x31,0x0, 0x7f,0x49,0x21,0x0, 0x81,0x2e,0x14,0x0, 0x7f, +0x12,0x2f,0xe, 0xb, 0xa0,0x7e,0xb3,0x0, 0xa2,0xbc,0xba,0x38,0xe2,0x22,0x7d,0x1, +0x7d,0x12,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x50,0x2, 0x6d,0x22,0xbe,0x14,0x0, 0x0, +0x50,0x2, 0x6d,0x11,0xbe,0x24,0x0, 0x3f,0x38,0xd, 0x7d,0x32,0x12,0x2f,0x8f,0x58, +0x2, 0x6d,0x33,0x7d,0x23,0x80,0x1a,0xbe,0x24,0x2, 0xc0,0x40,0x14,0x7d,0x32,0x9e, +0x34,0x2, 0xc0,0x2d,0x32,0xbe,0x34,0x2, 0xfd,0x8, 0x4, 0x7e,0x34,0x2, 0xff,0x7d, +0x23,0xbe,0x14,0x0, 0x3f,0x38,0xd, 0x7d,0x31,0x12,0x2f,0x8f,0x58,0x2, 0x6d,0x33, +0x7d,0x13,0x80,0x20,0xbe,0x14,0x4, 0xc0,0x40,0x1a,0xbe,0x14,0x4, 0xff,0x38,0x14, +0x7d,0x31,0x9e,0x34,0x4, 0xc0,0x2d,0x31,0xbe,0x34,0x4, 0xfd,0x8, 0x4, 0x7e,0x34, +0x4, 0xff,0x7d,0x13,0x1b,0x8, 0x20,0x7d,0x20,0xb, 0x25,0x1b,0x28,0x10,0x22,0x3e, +0x34,0x9e,0x34,0x0, 0x3f,0xbe,0x34,0x0, 0x2, 0x22,0x7e,0x39,0xb0,0xbe,0xb0,0x0, +0x28,0x4, 0x14,0x7a,0x39,0xb0,0x22,0xca,0x3b,0x75,0x29,0x0, 0x75,0x27,0x0, 0x12, +0x5c,0x3c,0x9, 0xb6,0x0, 0x7, 0xb4,0x3, 0x8, 0xe4,0x19,0xb6,0x0, 0x7, 0x75,0x29, +0x1, 0x5, 0x27,0xe5,0x27,0xb4,0xf, 0xe7,0x75,0x27,0x0, 0xe5,0x27,0xbe,0xb0,0xf, +0x50,0x5, 0x12,0x5c,0x3c,0x80,0x62,0x12,0x5c,0x3c,0x9, 0xb6,0x0, 0x7, 0xb4,0x2, +0x58,0x75,0x28,0x0, 0x80,0x4a,0x7e,0xa1,0x28,0x12,0x26,0xe7,0xa, 0x37,0x9, 0x56, +0x0, 0x1, 0xa, 0x25,0x9d,0x32,0x12,0x0, 0x2e,0x7c,0xe7,0x7e,0xa1,0x28,0x74,0x2, +0xa4,0x9, 0x75,0x0, 0x62,0x1e,0x70,0xa, 0x37,0x9, 0x56,0x0, 0x2, 0xa, 0x25,0x9d, +0x32,0x12,0x0, 0x2e,0x7c,0xf7,0xbe,0xe0,0x2, 0x18,0x13,0xbe,0xf0,0x2, 0x18,0xe, +0xe4,0x19,0xb6,0x0, 0x7, 0x7e,0x34,0x1, 0x96,0x12,0x2f,0x9a,0x80,0xb, 0x5, 0x28, +0x7e,0x73,0x0, 0xa2,0xbe,0x71,0x28,0x38,0xad,0x9, 0xb6,0x0, 0x7, 0xb4,0x2, 0x2, +0x80,0x2, 0x21,0x1b,0xe5,0x27,0xbe,0xb0,0xf, 0x50,0x6, 0x7e,0x34,0x1, 0x95,0x80, +0x4, 0x7e,0x34,0x1, 0x96,0x12,0x2f,0x9a,0xe4,0x19,0xb6,0x0, 0x7, 0xe5,0x29,0xbe, +0xb0,0x1, 0x78,0x2, 0x21,0x1b,0x9, 0xe6,0x0, 0x2, 0x1b,0xe1,0x21,0xb, 0x9, 0xf6, +0x0, 0x1, 0x1b,0xf1,0x1, 0xf9,0xbe,0xe0,0x0, 0x48,0x7c,0xbe,0xe0,0x15,0x58,0x77, +0xbe,0xf0,0x0, 0x48,0x72,0xbe,0xf0,0xc, 0x58,0x6d,0x1a,0x5f,0x7d,0x15,0x3e,0x14, +0x1a,0xe, 0x7e,0x34,0x0, 0x18,0xad,0x30,0x7d,0x23,0x2d,0x21,0x49,0x32,0x8, 0xaf, +0xbe,0x34,0x0, 0x0, 0x8, 0x1a,0x7e,0x14,0x0, 0xc, 0xad,0x10,0x7d,0x1, 0x2d,0x5, +0x3e,0x4, 0x2e,0x4, 0x6, 0xb7,0xb, 0x8, 0x10,0x2d,0x13,0x1b,0x8, 0x10,0x80,0x23, +0x7e,0x15,0xd, 0x4d,0x11,0x78,0x1c,0x12,0x0, 0x2e,0x7d,0x13,0x1a,0x2e,0x12,0x2d, +0x36,0x1a,0x2f,0x2d,0x23,0x3e,0x24,0x2e,0x24,0x6, 0xb7,0xb, 0x28,0x30,0x9d,0x31, +0x1b,0x28,0x30,0x6d,0x33,0x1a,0x2f,0x3e,0x24,0x1a,0xe, 0x7e,0x14,0x0, 0x18,0xad, +0x10,0x2d,0x21,0x59,0x32,0x8, 0xaf,0xb, 0xf0,0x9, 0x76,0x0, 0x1, 0xa, 0x27,0xb, +0x25,0x1a,0x3f,0xbd,0x32,0x18,0x2, 0x1, 0x76,0xb, 0xe0,0x9, 0x76,0x0, 0x2, 0xa, +0x27,0xb, 0x25,0x1a,0x3e,0xbd,0x32,0x18,0x2, 0x1, 0x6e,0x5, 0x27,0xe5,0x27,0xbe, +0xb0,0x1e,0x50,0x3, 0x2, 0x2f,0xcb,0xda,0x3b,0x22,0x2, 0x31,0x2d,0x7e,0x39,0xb0, +0x4, 0x7a,0x39,0xb0,0x22,0xca,0x3b,0x7e,0xa3,0x0, 0xa2,0x7e,0x53,0x1, 0x9b,0x6c, +0x44,0x6c,0x33,0x7e,0xc3,0xc, 0xa3,0x7e,0xb3,0x2, 0xa5,0xf5,0x33,0x7e,0xb3,0x2, +0xda,0x70,0x7, 0xbe,0xc0,0x1, 0x78,0x2, 0x81,0x73,0xbe,0xa0,0x0, 0x38,0x7, 0xbe, +0x50,0x0, 0x38,0x2, 0x81,0x6b,0xbe,0xc0,0x1, 0x78,0x8, 0x74,0x5, 0x7a,0xb3,0x1, +0x97,0x80,0x7, 0x7e,0x34,0x1, 0x97,0x12,0x31,0x2a,0x7e,0xb3,0x1, 0x97,0xb4,0x5, +0x2, 0x80,0x2, 0x81,0x73,0xe4,0x7a,0xb3,0x1, 0x97,0x7e,0xb3,0x1, 0x95,0x60,0x2, +0x41,0xae,0x7e,0xb3,0x1, 0x96,0x60,0x2, 0x41,0xae,0xe4,0x7a,0xb3,0x1, 0x98,0x7a, +0xa3,0x1, 0x95,0x7a,0x53,0x1, 0x96,0x6c,0xdd,0x41,0x9e,0xbc,0xad,0x7e,0xf0,0x8, +0x28,0x19,0xac,0xf4,0x2e,0x74,0x0, 0xa5,0x7e,0x70,0x2, 0xac,0x7d,0x9, 0xb3,0x0, +0x61,0x1e,0xb0,0xf5,0x2b,0x9, 0xb3,0x0, 0x62,0x80,0x1a,0xac,0xf3,0x2e,0x74,0x1, +0x1d,0xa, 0xa, 0xa, 0x3d,0x9d,0x30,0x3e,0x34,0x9, 0xb3,0x1, 0x9c,0x1e,0xb0,0xf5, +0x2b,0x9, 0xb3,0x1, 0x9d,0x1e,0xb0,0xf5,0x2a,0xe5,0x2b,0x19,0xb7,0x0, 0x2, 0xe5, +0x2a,0x19,0xb7,0x0, 0x1, 0xe4,0x19,0xb7,0x0, 0x7, 0xbe,0xc0,0x1, 0x78,0x67,0x6c, +0x22,0x80,0x34,0xe5,0x33,0xa, 0x3b,0xa, 0x2, 0x2d,0x3, 0x9, 0xb7,0x0, 0x2, 0xa, +0x3b,0xbd,0x3, 0x78,0x20,0x74,0x1, 0x19,0xb7,0x0, 0x7, 0x9, 0x7, 0x0, 0x1, 0x7e, +0x10,0x2, 0xac,0x1, 0x7e,0x70,0x18,0xac,0x72,0x2d,0x30,0x49,0x33,0x2, 0x15,0x59, +0x37,0x0, 0x5, 0x80,0xa, 0xb, 0x20,0x7e,0xb3,0x2, 0xd8,0xbc,0xb2,0x38,0xc4,0x7e, +0xb3,0x2, 0xd8,0xbc,0xb2,0x38,0x13,0xbc,0xad,0x28,0x6, 0x7e,0x34,0x1, 0x95,0x80, +0x4, 0x7e,0x34,0x1, 0x96,0x12,0x2f,0x9a,0x80,0x1c,0xbc,0xad,0x28,0x4, 0xb, 0x40, +0x80,0x14,0xb, 0x30,0x80,0x10,0xbc,0xad,0x28,0x4, 0xb, 0x40,0x80,0x2, 0xb, 0x30, +0x74,0x1, 0x19,0xb7,0x0, 0x7, 0x4c,0xcc,0x78,0x16,0x7e,0x11,0x2a,0x74,0x2, 0xac, +0x1b,0x7e,0x71,0x2b,0x74,0x18,0xac,0x7b,0x2d,0x30,0x49,0x33,0x8, 0xaf,0x80,0x8, +0xe4,0x7a,0x79,0xb0,0xe5,0x33,0xa, 0x3b,0x59,0x37,0x0, 0x3, 0xb, 0xd0,0xa, 0x35, +0xa, 0xa, 0x2d,0x3, 0xa, 0x3d,0xbd,0x30,0x50,0x2, 0x21,0xab,0x81,0x73,0x7e,0xb3, +0x1, 0x96,0x2e,0xb3,0x1, 0x95,0xf5,0x27,0x6c,0xdd,0x81,0x3, 0x7e,0xa3,0x1, 0x95, +0xbc,0xad,0x28,0x5, 0x12,0x35,0x76,0x80,0x3, 0x12,0x35,0x8d,0x9, 0x77,0x0, 0x1, +0x7e,0x90,0x2, 0xac,0x97,0x9, 0xa7,0x0, 0x2, 0x7e,0x50,0x18,0xac,0x5a,0x2d,0x24, +0x49,0x22,0x8, 0xaf,0x7a,0x25,0x28,0x9, 0xb7,0x0, 0x7, 0x70,0x4, 0x15,0x27,0x81, +0x1, 0x4c,0xcc,0x68,0x2, 0x61,0x94,0x75,0x2c,0x0, 0x75,0x30,0x0, 0x7a,0x71,0x31, +0x7a,0xa1,0x32,0x75,0x2f,0x0, 0xe5,0x32,0xbe,0xb1,0x2f,0x68,0x5b,0x7e,0x31,0x31, +0x74,0x2, 0xac,0x3b,0x7e,0x11,0x2f,0x74,0x18,0xac,0x1b,0x2d,0x1, 0x49,0x30,0x8, +0xaf,0x7e,0x51,0x2f,0x74,0xc, 0xac,0x5b,0xe5,0x31,0xa, 0xb, 0x2d,0x20,0x3e,0x24, +0x49,0x22,0x6, 0xb7,0x2d,0x23,0x7e,0x71,0x32,0x74,0x18,0xac,0x7b,0x2d,0x31,0x49, +0x13,0x8, 0xaf,0x7e,0x71,0x32,0x74,0xc, 0xac,0x7b,0x2d,0x30,0x3e,0x34,0x49,0x33, +0x6, 0xb7,0x2d,0x31,0x9d,0x32,0x7a,0x35,0x2d,0x7e,0x73,0x1, 0x95,0xbc,0x7d,0x28, +0x7, 0x12,0x34,0x7e,0x58,0x2, 0x5, 0x2c,0x5, 0x2f,0xe5,0x2f,0xb4,0x15,0x97,0xe5, +0x2c,0xbe,0xb0,0xa, 0x40,0xb, 0x12,0x34,0x76,0x68,0x6, 0x74,0x3, 0x19,0xb7,0x0, +0x7, 0x49,0x27,0x0, 0x3, 0x7e,0x35,0x28,0x12,0x35,0x80,0x8, 0x74,0xe4,0x19,0xb7, +0x0, 0x7, 0x80,0x6d,0x75,0x2c,0x0, 0x80,0x3b,0xe5,0x33,0xa, 0x3b,0xe5,0x2c,0xa, +0x2b,0x2d,0x23,0x9, 0x77,0x0, 0x2, 0xbd,0x23,0x78,0x12,0x12,0x27,0x2, 0x12,0x34, +0x86,0x12,0x35,0x80,0x8, 0x1c,0xe4,0x19,0xb7,0x0, 0x7, 0x80,0x15,0x12,0x27,0x2, +0x12,0x34,0x86,0x9d,0x32,0x7a,0x35,0x2d,0x12,0x34,0x7e,0x58,0x5, 0x7d,0x37,0x12, +0x31,0x2a,0x5, 0x2c,0x7e,0x73,0x2, 0xd8,0xbe,0x71,0x2c,0x38,0xbc,0x49,0x27,0x0, +0x3, 0xe5,0x33,0xa, 0x3b,0xbd,0x23,0x78,0x18,0x7e,0x79,0x70,0xbe,0x70,0xa, 0x28, +0xb, 0x12,0x34,0x76,0x68,0x6, 0x74,0x3, 0x19,0xb7,0x0, 0x7, 0x74,0x1, 0x7a,0x79, +0xb0,0xb, 0xd0,0x12,0x35,0x9e,0x50,0x2, 0x41,0xbc,0xe5,0x27,0x70,0x5, 0x12,0x34, +0x8f,0x80,0x60,0x7e,0xb3,0x1, 0x98,0xf5,0x2f,0xbe,0xc0,0x1, 0x78,0x6, 0xe5,0x2f, +0x1e,0xb0,0xf5,0x2f,0xe5,0x2f,0xbe,0xb0,0x4, 0x40,0x37,0x6c,0xdd,0x80,0x2c,0x7e, +0xa3,0x1, 0x95,0xbc,0xad,0x28,0x12,0x12,0x35,0x76,0x9, 0xb7,0x0, 0x7, 0xb4,0x1, +0x18,0x74,0x2, 0x19,0xb7,0x0, 0x7, 0x80,0x10,0x12,0x35,0x8d,0x9, 0xb7,0x0, 0x7, +0xb4,0x1, 0x6, 0x74,0x2, 0x19,0xb7,0x0, 0x7, 0xb, 0xd0,0x12,0x35,0x9e,0x40,0xcf, +0x80,0x11,0x7e,0x34,0x1, 0x98,0x12,0x31,0x2a,0x80,0x8, 0xe4,0x7a,0xb3,0x1, 0x98, +0x12,0x34,0x90,0xda,0x3b,0x22,0x7e,0xb3,0xa, 0xca,0xbe,0xb0,0x6, 0x22,0x7e,0x37, +0x6, 0x94,0xbe,0x35,0x2d,0x22,0x49,0x23,0x2, 0x15,0x49,0x37,0x0, 0x5, 0x22,0xe4, +0x7a,0xb3,0x1, 0x95,0x7a,0xb3,0x1, 0x96,0x22,0xca,0xd8,0xca,0x79,0x7e,0xf0,0x1, +0x12,0x37,0xf7,0x7c,0xdb,0x12,0x35,0xb1,0x7c,0xeb,0x12,0x36,0x54,0x78,0x52,0x74, +0x1, 0x7a,0xb3,0xa, 0xca,0xbe,0xd0,0x2, 0x78,0xa, 0x74,0x6, 0x7a,0xb3,0xa, 0xca, +0x6c,0xff,0x80,0x36,0x7e,0xb3,0x0, 0xa2,0x70,0x2a,0x7e,0xb3,0x1, 0x9b,0x70,0x24, +0xe5,0x13,0xb4,0x1, 0x2, 0x80,0xe, 0x7e,0xa3,0xe, 0x77,0xbe,0xa0,0x2, 0x40,0xf, +0xe4,0x7a,0xb3,0xe, 0x77,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0xa, 0xd1,0x80,0x76,0x7c, +0xba,0x4, 0x80,0x7, 0x74,0x4, 0x7a,0xb3,0xa, 0xca,0xe4,0x7a,0xb3,0xe, 0x77,0x80, +0x64,0xbe,0x34,0x0, 0x1, 0x78,0x2e,0xe4,0x7a,0xb3,0xa, 0xca,0x4c,0xee,0x68,0x6, +0x7e,0x34,0x0, 0x3, 0x80,0x4b,0xbe,0xd0,0x2, 0x78,0x3, 0xe4,0x80,0x39,0x7e,0xb3, +0x0, 0xa2,0x70,0xa, 0x7e,0xb3,0x1, 0x9b,0x70,0x4, 0x74,0x1, 0x80,0x29,0x12,0x31, +0x35,0x6c,0xff,0x80,0x30,0x7e,0x37,0xa, 0xd1,0xbe,0x34,0x0, 0x3, 0x78,0x26,0xbe, +0xd0,0x1, 0x78,0x5, 0x12,0x31,0x35,0x6c,0xff,0x1b,0xe1,0x68,0x8, 0xb, 0xe0,0x78, +0xc, 0x74,0x3, 0x80,0x2, 0x74,0x2, 0x7a,0xb3,0xa, 0xca,0x80,0x8, 0x7e,0x34,0x0, +0x1, 0x7a,0x37,0xa, 0xd1,0xbe,0xf0,0x1, 0x78,0x7, 0x12,0x34,0x8f,0x7a,0xb3,0x1, +0x97,0xda,0x79,0xda,0xd8,0x22,0x7e,0xf0,0x8, 0xac,0xfd,0x2e,0x74,0x0, 0xa5,0x22, +0x9d,0x32,0x12,0x0, 0x2e,0x7a,0x35,0x28,0xbe,0x34,0x0, 0x23,0x22,0xa, 0x3a,0xa, +0x7d,0x9d,0x73,0x3e,0x74,0x3e,0x74,0x3e,0x74,0x2e,0x74,0x1, 0x1d,0x22,0x7e,0x73, +0x1, 0x96,0xa, 0x37,0x7e,0x53,0x1, 0x95,0xa, 0x25,0x2d,0x23,0xa, 0x3d,0xbd,0x32, +0x22,0x7e,0x50,0x5, 0x7e,0x40,0x3, 0x6c,0x66,0x6c,0xaa,0x6c,0x77,0xa5,0xbc,0x0, +0x3, 0x7e,0x40,0x1, 0x6c,0x33,0x6c,0x22,0x7e,0x10,0x2, 0xac,0x12,0x7e,0x90,0x18, +0xac,0x93,0x2d,0x40,0x49,0x4, 0x8, 0xaf,0xbe,0x4, 0x0, 0x14,0x8, 0x4, 0xb, 0x60, +0x80,0x8, 0xbe,0x4, 0xff,0xec,0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x2c,0x24,0xbe,0x20, +0xc, 0x40,0xd5,0x2c,0x35,0xbe,0x30,0x15,0x40,0xcc,0x7c,0xb7,0x1e,0xb0,0xa, 0x2b, +0xa, 0x16,0xbd,0x12,0x28,0x1e,0xe4,0x7a,0xb3,0xa, 0xcc,0x7e,0x73,0xa, 0xcb,0xbe, +0x70,0x5, 0x50,0x6, 0x7e,0x34,0xa, 0xcb,0x80,0x22,0xe4,0x7a,0xb3,0xa, 0xcb,0x75, +0x57,0x1, 0x80,0x2d,0xa, 0x3a,0xbd,0x32,0x28,0x21,0xe4,0x7a,0xb3,0xa, 0xcb,0x7e, +0x73,0xa, 0xcc,0xbe,0x70,0x5, 0x50,0x9, 0x7e,0x34,0xa, 0xcc,0x12,0x31,0x2a,0x80, +0x10,0xe4,0x7a,0xb3,0xa, 0xcc,0x75,0x57,0x2, 0x80,0x6, 0x12,0x36,0x5b,0x75,0x57, +0x0, 0xe5,0x57,0x22,0x7e,0x37,0xa, 0xd1,0x4d,0x33,0x22,0xe4,0x7a,0xb3,0xa, 0xcc, +0x7a,0xb3,0xa, 0xcb,0x22,0x12,0x36,0x5b,0x74,0x6, 0x7a,0xb3,0xa, 0xca,0x6d,0x33, +0x7a,0x37,0xa, 0xd1,0x75,0x56,0x2, 0x22,0xca,0x79,0x7e,0xf1,0xcc,0x7e,0x37,0x2, +0xdd,0x4d,0x33,0x78,0x65,0x7e,0xa3,0x3, 0xcf,0xbe,0xa0,0x0, 0x28,0x14,0x7e,0xb3, +0xc, 0xcd,0x60,0x9, 0xb4,0x1, 0xb, 0x7e,0xb3,0x3, 0xd0,0x70,0x5, 0x75,0x10,0x0, +0xe1,0x89,0x7e,0xb3,0x2, 0xdf,0x20,0xe0,0x2, 0xe1,0x89,0x7e,0xb3,0xc, 0xcd,0x70, +0x9, 0x7e,0x53,0x2, 0xe5,0xbe,0x51,0x10,0x68,0x1d,0xb4,0x1, 0x2, 0x80,0x2, 0xe1, +0x89,0xe5,0x10,0xbe,0xb0,0x3, 0x50,0xf, 0x4c,0xaa,0x68,0x2, 0xe1,0x89,0xe5,0x10, +0xbe,0xb0,0x2, 0x50,0x2, 0xe1,0x89,0x75,0x10,0x0, 0x7e,0x24,0x0, 0x1, 0x7a,0x27, +0x2, 0xdd,0x74,0x1, 0x7a,0xb3,0xc, 0xbd,0xe1,0x89,0xbe,0x34,0x0, 0x1, 0x78,0x29, +0x7e,0x53,0x3, 0xcf,0xbe,0x50,0x0, 0x38,0x2, 0xe1,0x89,0x7e,0xb3,0xc, 0xcd,0x60, +0x2, 0xe1,0x89,0x6d,0x22,0x7a,0x27,0x2, 0xdd,0xe4,0x7a,0xb3,0xc, 0xbd,0x75,0x10, +0x0, 0x75,0x17,0x24,0x75,0x16,0x1, 0x80,0x70,0xbe,0x34,0x0, 0x3, 0x78,0x6a,0x12, +0x15,0xc9,0x12,0x17,0xfa,0xa9,0xd6,0xeb,0xa9,0xc6,0xac,0xa9,0xc6,0xec,0xc2,0x96, +0xc2,0x89,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x12,0x9, 0xe6,0x60,0xfb,0x20,0x93, +0xfd,0x53,0xca,0xfe,0x53,0xc9,0xfd,0x75,0x87,0x2, 0x0, 0x0, 0x0, 0x0, 0xc2,0xa8, +0xc2,0x95,0x43,0xca,0x1, 0x12,0x4f,0xf8,0x12,0x15,0xc9,0x12,0x17,0xfa,0x12,0x37, +0xd8,0x53,0xdb,0xf0,0x43,0xc9,0x2, 0x12,0xb, 0x82,0x12,0x6, 0x43,0x6d,0x33,0x7a, +0x37,0x2, 0xdd,0xe4,0x7a,0xb3,0xc, 0xbd,0x12,0x36,0x65,0x12,0x37,0xee,0x7e,0x37, +0xb, 0x9, 0x4d,0x33,0x78,0xf8,0x12,0x37,0xe0,0x6c,0xee,0xa9,0xc6,0xcb,0x80,0x1d, +0xe4,0x12,0x4f,0x8b,0xa9,0x25,0xdd,0x15,0xa9,0x21,0xdb,0x11,0xc2,0xcd,0xa9,0xc7, +0xcb,0xc2,0xcc,0x4c,0xee,0x78,0x6, 0x7e,0xe0,0x1, 0x75,0xcc,0x2, 0xe5,0x16,0x60, +0xdf,0x12,0x37,0xd8,0xa9,0xd6,0xcb,0x75,0x17,0x0, 0x75,0x16,0x0, 0x7a,0xf1,0xcc, +0x7e,0xb3,0x3, 0xd3,0x54,0xef,0x7a,0xb3,0x3, 0xd3,0x7e,0x73,0x3, 0xcf,0x7a,0x73, +0x3, 0xd0,0x12,0x37,0xe7,0xda,0x79,0x22,0xd2,0xcd,0xa9,0xd7,0xcb,0xd2,0xcc,0x22, +0x74,0x1, 0x7a,0xb3,0x3, 0xd7,0x22,0x74,0x23,0x7a,0xb3,0xb, 0x6, 0x22,0x7e,0x34, +0x0, 0xa, 0x7a,0x37,0xb, 0x9, 0x22,0xca,0x69,0xca,0xf8,0x7e,0xb3,0x6, 0xae,0xf5, +0x28,0x7e,0x83,0x6, 0xaf,0x7e,0xa1,0x13,0x7e,0x84,0x6, 0xb7,0x7e,0x94,0x8, 0xaf, +0x7e,0x34,0x2, 0xbf,0x7e,0x24,0x2, 0xa7,0x7e,0x93,0x2, 0xd8,0x7e,0x33,0x2, 0xa5, +0x7e,0xb3,0x2, 0xda,0x70,0x9, 0xbe,0xa0,0x1, 0x78,0x4, 0xe5,0x56,0x21,0x63,0x4c, +0xaa,0x78,0x26,0x6c,0x33,0x7c,0x98,0x9e,0x91,0x28,0xb, 0x90,0x74,0x1, 0x7a,0xb3, +0x2, 0xdb,0x7e,0xb3,0xe, 0x76,0xbe,0xb0,0x2, 0x50,0x9, 0x4, 0x7a,0xb3,0xe, 0x76, +0xe5,0x56,0x21,0x63,0xe4,0x7a,0xb3,0xe, 0x76,0x6c,0xff,0xa, 0xf, 0x2e,0x4, 0x0, +0x1e,0x7a,0x11,0x82,0x7a,0x1, 0x83,0xe4,0x93,0xf5,0x2d,0x75,0x27,0x0, 0x1, 0xfe, +0xe5,0x27,0x70,0x4, 0x6d,0x0, 0x80,0x7, 0x7e,0x5, 0x2b,0x2e,0x4, 0x0, 0xc, 0x7a, +0x5, 0x2b,0xa, 0xe3,0xe5,0x27,0xa, 0xfb,0x2d,0xfe,0xe5,0x28,0xa, 0xeb,0xbd,0xfe, +0x40,0x6a,0xa, 0xe8,0xbd,0xfe,0x38,0x64,0xe5,0x2d,0xa, 0xb, 0xbd,0xf0,0x38,0x5c, +0xbe,0xa0,0x1, 0x78,0x14,0x7e,0xd0,0x2, 0xac,0xdf,0x7e,0x11,0x27,0x74,0x18,0xac, +0x1b,0x2d,0x6, 0x49,0x0, 0x2, 0x15,0x80,0x1a,0x7e,0xe5,0x2b,0x3e,0xe4,0x7e,0x10, +0x2, 0xac,0x1f,0x2d,0xe0,0x7d,0xfe,0x2d,0xf9,0xb, 0xf8,0xf0,0x2d,0xe8,0xb, 0xe8, +0x0, 0x2d,0xf, 0x7a,0x5, 0x29,0x12,0x39,0x68,0x2d,0xf3,0xb, 0xf8,0xe0,0xbe,0xe5, +0x29,0x50,0x6, 0x7e,0x5, 0x29,0x1b,0xf8,0x0, 0x12,0x39,0x68,0x2d,0xf2,0xb, 0xf8, +0xe0,0xbe,0xe5,0x29,0x28,0x6, 0x7e,0x5, 0x29,0x1b,0xf8,0x0, 0x5, 0x27,0xbe,0x91, +0x27,0x28,0x2, 0x1, 0x70,0xb, 0xf0,0xbe,0xf0,0xb, 0x38,0x2, 0x1, 0x5b,0x6c,0xff, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x2, 0xa7,0x49,0x35,0x2, 0xbf,0x9d,0x32,0x12,0x0, +0x2e,0xbe,0x34,0x0, 0xfa,0x8, 0x5, 0x75,0x56,0x2, 0x80,0x7, 0xb, 0xf0,0xbe,0xf0, +0xb, 0x28,0xdd,0x7e,0xb3,0x2, 0xdb,0xb4,0x1, 0x27,0xbe,0xf0,0xc, 0x78,0x3, 0x75, +0x56,0x1, 0x6c,0xff,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x2, 0xbf,0x7e,0x34, +0x7f,0xff,0x74,0x2, 0xac,0xbf,0x59,0x35,0x2, 0xa7,0xb, 0xf0,0xbe,0xf0,0xc, 0x78, +0xe3,0xe5,0x56,0xda,0xf8,0xda,0x69,0x22,0x7e,0x10,0x2, 0xac,0x1f,0x7d,0xf0,0x22, +0x7e,0xb3,0x3, 0x1d,0xf5,0x1e,0x75,0x1f,0x0, 0x22,0xca,0x3b,0x6c,0xff,0x6c,0xee, +0x12,0x5c,0x68,0x12,0x1a,0x19,0x12,0x57,0x9c,0x12,0x15,0xd8,0x12,0x6, 0x43,0x7e, +0x34,0x6, 0x4d,0x12,0x46,0x8, 0xe4,0x7a,0xb3,0xe, 0x3b,0x12,0x16,0x48,0x12,0x37, +0xee,0x7e,0x37,0xb, 0x9, 0x4d,0x33,0x78,0xf8,0x12,0xa, 0xaf,0x12,0xb, 0x82,0x12, +0x5c,0xab,0x12,0x11,0xac,0x12,0x14,0x3c,0x12,0x36,0x65,0x12,0x15,0xc2,0x12,0xf, +0xb8,0x12,0xf, 0xdb,0x12,0x5c,0x14,0x7a,0xb3,0xc, 0xbf,0x6d,0x33,0x7a,0x35,0x11, +0x12,0x39,0x70,0x7e,0xd3,0xc, 0xa3,0x7a,0xd1,0x13,0x7e,0xb3,0xc, 0xbf,0xb4,0x1, +0x2, 0x80,0x2, 0xa1,0x75,0x53,0xdb,0x7f,0x12,0x6, 0x3c,0x7e,0x34,0x0, 0x64,0x7a, +0x37,0x0, 0x5f,0x12,0x4b,0x10,0x75,0x17,0x0, 0x75,0x16,0x0, 0x7e,0xa3,0xc, 0xbd, +0x4c,0xaa,0x78,0x8, 0x7e,0xb3,0x2, 0xe1,0xf5,0x1b,0x80,0x6, 0x7e,0xb3,0x2, 0xe3, +0xf5,0x1b,0x7e,0xb3,0xc, 0xcd,0xb4,0x1, 0xc, 0x4c,0xaa,0x78,0x5, 0x75,0x1b,0xa, +0x80,0x3, 0x75,0x1b,0x32,0x7e,0xb3,0xc, 0xb8,0xbe,0xb0,0xff,0x68,0x9, 0x12,0x13, +0xd, 0x12,0x37,0xe0,0x12,0x1b,0x8a,0x12,0x4f,0x6d,0xe5,0x13,0x70,0x2, 0x80,0x39, +0x7e,0xb3,0x2, 0xf, 0xf5,0x21,0x7e,0xb3,0x2, 0xd8,0xf5,0x23,0x7e,0xb3,0x2, 0xa5, +0xf5,0x25,0x12,0x50,0x10,0x7e,0xb3,0x2, 0xf, 0xf5,0x22,0x7e,0xb3,0x2, 0xd8,0xf5, +0x24,0x7e,0xb3,0x2, 0xa5,0xf5,0x26,0xe5,0x21,0x7a,0xb3,0x2, 0xf, 0xe5,0x23,0x7a, +0xb3,0x2, 0xd8,0xe5,0x25,0x7a,0xb3,0x2, 0xa5,0x12,0xf, 0xb5,0x12,0x10,0x5e,0x12, +0x49,0x50,0x7e,0x73,0xa, 0xd3,0x7a,0x73,0xc, 0xc1,0x7e,0xb3,0x2, 0xe7,0xb4,0x1, +0x4, 0xe4,0x12,0x3d,0x82,0x7e,0x63,0x2, 0xb, 0x7e,0x70,0x2, 0xac,0x67,0x2e,0x34, +0x3, 0xae,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x6, 0x94,0x1e,0x34,0x1e, +0x34,0x7a,0x73,0x6, 0x96,0x7a,0x73,0xc, 0x98,0x12,0x26,0xf1,0x12,0x52,0x1f,0x12, +0x34,0x99,0x7e,0x37,0xa, 0xd1,0x7a,0x73,0xc, 0x9b,0x7e,0xb3,0xa, 0xca,0x7a,0xb3, +0xc, 0x9c,0xb4,0x6, 0x17,0x12,0x1b,0x91,0x50,0x3, 0x12,0x31,0x35,0x12,0x41,0x5d, +0x7e,0xb3,0x0, 0xa4,0x30,0xe0,0x5, 0xe4,0x7a,0xb3,0xa, 0xca,0x12,0x36,0x54,0x78, +0x12,0x7e,0xb3,0xa, 0xca,0xb4,0x4, 0xb, 0xe5,0x13,0x70,0x7, 0x7e,0x34,0x0, 0xa, +0x7a,0x35,0x11,0x7e,0x35,0x11,0xbe,0x34,0x0, 0x0, 0x28,0xb, 0x1b,0x34,0x7a,0x35, +0x11,0x74,0x4, 0x7a,0xb3,0xa, 0xca,0x7e,0x34,0x0, 0x61,0x7a,0x37,0x3, 0x83,0x12, +0x49,0x82,0x7a,0xb3,0x3, 0xd4,0xe5,0x13,0xb4,0x1, 0x12,0xe5,0x22,0x7a,0xb3,0x2, +0xf, 0xe5,0x24,0x7a,0xb3,0x2, 0xd8,0xe5,0x26,0x7a,0xb3,0x2, 0xa5,0x7e,0x35,0x8, +0x4d,0x33,0x78,0x3, 0x12,0x2b,0x46,0x74,0x1, 0x12,0x1f,0xfa,0x12,0x27,0x15,0x12, +0x48,0xfa,0xb4,0x1, 0x12,0x7e,0xb3,0x3, 0xd8,0xbe,0xb0,0x2, 0x68,0x15,0xbe,0xb0, +0x1, 0x68,0x10,0x74,0x3, 0x80,0x8, 0x7e,0xb3,0x3, 0xd8,0xb4,0x3, 0x5, 0xe4,0x7a, +0xb3,0x3, 0xd8,0x7e,0xb3,0x3, 0xde,0xb4,0x5, 0xe, 0x74,0x1e,0x7a,0xb3,0x6, 0x96, +0x7e,0x73,0x6, 0x96,0x7a,0x73,0xc, 0x98,0x12,0x22,0x87,0x12,0x2e,0xeb,0x7e,0xb3, +0xa, 0xca,0xb4,0x6, 0xe, 0x7e,0x73,0x0, 0xa2,0xbe,0x70,0x1, 0x28,0x5, 0xe4,0x7a, +0xb3,0xa, 0xca,0x12,0xf, 0xb8,0x7e,0x14,0x6, 0x94,0x12,0x58,0x31,0x12,0x36,0x54, +0x78,0xc, 0x7e,0x73,0x0, 0xa3,0xbe,0x73,0x0, 0xa2,0x50,0x5, 0x80,0x0, 0x12,0x2f, +0xa7,0x7e,0x73,0x0, 0xa2,0x7a,0x73,0x0, 0xa3,0x12,0x3d,0x8a,0xe5,0x13,0xb4,0x1, +0x2, 0x80,0x2, 0x81,0x5f,0x7e,0xb3,0x3, 0xcf,0x12,0xb, 0x8e,0x7e,0x73,0x2, 0xf, +0xa, 0x37,0x9, 0x73,0x1, 0xd8,0xbe,0x73,0x2, 0xb, 0x78,0x36,0x7e,0x73,0x3, 0xcf, +0xbe,0x70,0x0, 0x28,0x2d,0x7e,0x37,0x2, 0x13,0x7a,0x35,0x14,0xbe,0x34,0x0, 0x50, +0x28,0x8, 0x74,0x2, 0x7a,0xb3,0x3, 0xd8,0x6c,0xee,0x7e,0x35,0x14,0xbe,0x34,0x0, +0x28,0x50,0xf, 0xbe,0xe0,0x14,0x50,0x4, 0xb, 0xe0,0x80,0x6, 0x74,0x1, 0x7a,0xb3, +0x3, 0xd8,0x7e,0x37,0x1, 0xcc,0xbe,0x34,0x0, 0x3, 0x78,0x6, 0x74,0x2, 0x7a,0xb3, +0x3, 0xd8,0x7e,0xb3,0xc, 0xa7,0xb4,0x1, 0x26,0xe4,0x7a,0xb3,0xc, 0xa7,0x7e,0x73, +0xc, 0xa2,0x7a,0x73,0x4, 0x4f,0x7e,0x73,0xc, 0xa5,0x7a,0x73,0x4, 0x52,0x12,0x5c, +0xa2,0x7e,0x73,0xc, 0xa4,0x7a,0x73,0x4, 0x54,0x12,0x14,0x3c,0x12,0x37,0xe0,0x7e, +0xb3,0xc, 0xa3,0x70,0x10,0xbe,0xd0,0x1, 0x78,0xb, 0xe4,0x7a,0xb3,0x3, 0xde,0x7e, +0xf0,0x1, 0x12,0x37,0xe0,0x7e,0x73,0xc, 0xa3,0xbc,0x7d,0x68,0x11,0x7c,0xd7,0xbe, +0xd0,0x1, 0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x3, 0xd8,0x7e,0xa3, +0xc, 0xa3,0xbe,0xa1,0x13,0x68,0x9, 0x7e,0xb3,0x3, 0xd7,0x70,0x3, 0x7a,0xa1,0x13, +0x12,0x41,0xf, 0x12,0x40,0xcd,0x7e,0x73,0x3, 0xcf,0x7a,0x73,0x0, 0xa2,0x7e,0x34, +0x3, 0x16,0x7a,0x37,0x6, 0x90,0x12,0x1f,0x62,0x7e,0x34,0x6, 0x4d,0x7a,0x37,0x3, +0x83,0x12,0x3d,0x8a,0x12,0x1b,0xa8,0x12,0x47,0xfe,0x7e,0x34,0x3, 0x16,0x7a,0x37, +0x3, 0x85,0x12,0x3f,0x8d,0x7e,0xa3,0x3, 0xd8,0x4c,0xaa,0x78,0x4, 0x74,0x1, 0x80, +0x13,0xbe,0xa0,0x2, 0x78,0x4, 0x74,0x5, 0x80,0xa, 0xbe,0xa0,0x3, 0x78,0x4, 0x74, +0x2, 0x80,0x1, 0xe4,0x7a,0xb3,0x3, 0xde,0x7e,0xb3,0x3, 0xcf,0xb4,0x1, 0xe, 0x7e, +0xb3,0x3, 0xd0,0x70,0x8, 0x7e,0x73,0x3, 0xde,0x7a,0x73,0x3, 0xd9,0x12,0x53,0x52, +0x7e,0x34,0x3, 0x83,0x7e,0x24,0x3, 0x16,0x12,0x42,0x46,0x12,0x36,0x78,0x7e,0xb3, +0x3, 0xd7,0xb4,0x1, 0x2, 0x80,0x2, 0x21,0xda,0x7e,0xb3,0x0, 0xa3,0x60,0x2, 0x21, +0xda,0xbe,0xf0,0x1, 0x78,0x35,0x6c,0xff,0x6c,0xcc,0xa, 0x2c,0x2e,0x24,0x4, 0x9, +0x12,0x53,0x44,0xb, 0xc0,0xbe,0xc0,0x15,0x78,0xf0,0x12,0x5c,0x28,0x7a,0xb3,0x4, +0x54,0x12,0x14,0x3c,0x74,0x22,0x7a,0xb3,0xc, 0xa2,0xe4,0x7a,0xb3,0xc, 0xa5,0x74, +0x2, 0x7a,0xb3,0xc, 0xa6,0x74,0x1, 0x7a,0xb3,0xc, 0xa4,0x12,0xf, 0xc1,0xe4,0x7a, +0xb3,0x3, 0xd7,0x21,0xda,0x12,0x5a,0xc2,0xe4,0x12,0x3d,0x82,0x12,0x0, 0x41,0xda, +0x3b,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0x7e,0x73,0x0, 0xa2,0x7a,0x73, +0x3, 0xcf,0x22,0x30,0x0, 0x8, 0x74,0x1, 0x12,0x3d,0x82,0xc2,0x0, 0x22,0xe4,0x12, +0x3d,0x82,0xd2,0x0, 0x22,0xca,0x79,0x7c,0x6b,0x14,0x68,0x53,0x14,0x68,0x62,0x14, +0x68,0x7a,0x14,0x68,0x77,0x14,0x68,0x74,0x14,0x68,0x71,0x14,0x68,0x6e,0x14,0x68, +0x6b,0x14,0x68,0x68,0x14,0x68,0x65,0x14,0x68,0x62,0x14,0x68,0x5f,0x14,0x68,0x5c, +0x14,0x68,0x59,0x14,0x68,0x56,0x24,0xc3,0x68,0x61,0x1b,0xb1,0x68,0x69,0x14,0x68, +0x6c,0x24,0x65,0x68,0x5c,0x24,0xea,0x78,0x69,0x12,0x3f,0x7b,0x4c,0x77,0x68,0x4, +0xa5,0xbf,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x12,0x3e,0xbf,0xc1,0xb4,0x7a, +0x73,0xd, 0x72,0x74,0x18,0xac,0x7b,0x2e,0x37,0xe, 0xf, 0x7a,0x37,0xd, 0x70,0xc1, +0xb4,0xa5,0xbf,0x4, 0x7, 0x74,0x1, 0x7e,0x70,0x4, 0x80,0xb, 0xa5,0xbf,0x5, 0x2, +0x80,0x2, 0xc1,0xb4,0xe4,0x6c,0x77,0x12,0x3f,0x8, 0xc1,0xb4,0xa, 0x26,0x2e,0x24, +0x3, 0xe4,0x9e,0x24,0x0, 0x3, 0x7a,0x29,0x70,0x80,0x79,0x7a,0x73,0x3, 0xf1,0x80, +0x73,0x7a,0x73,0xe, 0x34,0x80,0x6d,0x7a,0x73,0x4, 0x4f,0x80,0x67,0x12,0x3d,0x93, +0x80,0x62,0x12,0x4e,0xf6,0x7c,0xab,0xbe,0x60,0x50,0x40,0xe, 0xbe,0x60,0x63,0x38, +0x9, 0x12,0x3e,0xb7,0x19,0x72,0x3, 0xa4,0x80,0x4a,0xbe,0x60,0x78,0x40,0xe, 0xbe, +0x60,0x8b,0x38,0x9, 0x12,0x3e,0xb7,0x19,0x72,0x3, 0x91,0x80,0x37,0xbe,0x60,0xa0, +0x40,0xe, 0xbe,0x60,0xb3,0x38,0x9, 0x12,0x3e,0xb7,0x19,0x72,0x3, 0x7e,0x80,0x24, +0xbe,0x60,0xbf,0x40,0xe, 0xbe,0x60,0xd2,0x38,0x9, 0x12,0x3e,0xb7,0x19,0x72,0x3, +0x6b,0x80,0x11,0xbe,0x60,0xd3,0x40,0xc, 0xbe,0x60,0xe6,0x38,0x7, 0x12,0x3e,0xb7, +0x19,0x72,0x3, 0x6c,0xda,0x79,0x22,0x74,0x14,0xa4,0xa, 0x26,0x2d,0x25,0x22,0x7c, +0x7b,0x7e,0xb3,0xc, 0xbf,0xb4,0x3, 0x5, 0x74,0x1, 0x2, 0x3f,0x8, 0x74,0x27,0x2, +0x3e,0xd2,0xbe,0xb0,0x7f,0x38,0x30,0x7c,0x6b,0x2e,0x60,0xfd,0x68,0x29,0x1b,0x60, +0x68,0x25,0x2e,0x60,0xe1,0x68,0x20,0x2e,0x60,0xfd,0x68,0x1b,0x1b,0x61,0x68,0x17, +0x2e,0x60,0xf9,0x68,0x12,0x80,0x0, 0xa, 0x2b,0x19,0x72,0xc, 0x98,0x7e,0xb3,0xd, +0x18,0x44,0x1, 0x7a,0xb3,0xd, 0x18,0x22,0xbe,0xb0,0xa, 0x50,0x7, 0xa, 0x2b,0x19, +0x72,0xe, 0x2b,0x22,0x7c,0x6b,0x9e,0x60,0xa, 0xa, 0x26,0xbe,0x24,0x2, 0x69,0x50, +0xd, 0xa5,0xbe,0x7d,0x3, 0x2, 0x3d,0x93,0xa, 0x26,0x19,0x72,0x3, 0xe4,0x22,0xca, +0x79,0xbe,0xb0,0x80,0x40,0x1d,0xbe,0xb0,0xbf,0x38,0x18,0xbe,0xb0,0x26,0x68,0x38, +0xbe,0xb0,0x28,0x68,0x33,0xbe,0xb0,0x23,0x68,0x2e,0xbe,0xb0,0x2f,0x68,0x29,0x24, +0x80,0x80,0x22,0xb, 0xb2,0x68,0x1c,0x1b,0xb2,0x78,0x1d,0x12,0x3f,0x7b,0xbe,0x70, +0x4, 0x40,0x9, 0xbe,0x70,0x5, 0x68,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x12,0x3e, +0xbf,0x80,0x5, 0x74,0x27,0x12,0x3e,0xd2,0xda,0x79,0x22,0x7e,0x74,0xd, 0x75,0x7a, +0x79,0x70,0x5e,0x70,0x70,0x7c,0xb7,0xc4,0x54,0xf, 0x7c,0x7b,0x22,0xca,0xd8,0xca, +0x79,0x7e,0xf3,0x3, 0xcf,0x4c,0xff,0x78,0x6, 0x12,0x39,0x70,0x2, 0x40,0xc8,0x6c, +0xee,0x7e,0x50,0x7, 0xac,0x5e,0x9, 0xd2,0x3, 0x8b,0xbe,0xd0,0xff,0x68,0x3a,0xa, +0x3d,0x9, 0xa3,0x6, 0x70,0x4c,0xaa,0x78,0x17,0x49,0x32,0x3, 0x87,0x7e,0x30,0x4, +0xac,0x3d,0x59,0x31,0xe, 0x3c,0x49,0x32,0x3, 0x89,0x59,0x31,0xe, 0x3e,0x80,0x19, +0xbe,0xa0,0x1, 0x78,0x14,0x74,0x4, 0xac,0xbd,0x49,0x35,0xe, 0x3c,0x59,0x32,0x3, +0x87,0x49,0x35,0xe, 0x3e,0x59,0x32,0x3, 0x89,0xb, 0xe0,0xbe,0xe0,0x5, 0x78,0xb1, +0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xd3,0x3, 0x8b,0xbe,0xd0,0xff,0x78,0x2, +0x1, 0xbe,0xa, 0x2d,0x9, 0xb2,0x6, 0x70,0xb4,0x2, 0x2, 0x80,0x2, 0x1, 0xbe,0x49, +0x33,0x3, 0x87,0x74,0x4, 0xac,0xbd,0x49,0x25,0xe, 0x3c,0x12,0x1e,0xc3,0x7a,0x35, +0x27,0x74,0x7, 0xac,0xbe,0x49,0x35,0x3, 0x89,0x74,0x4, 0xac,0xbd,0x49,0x25,0xe, +0x3e,0x12,0x1e,0xc3,0x7a,0x35,0x29,0xe5,0x1e,0xa, 0x3b,0xbe,0x35,0x27,0x28,0x48, +0xbe,0x35,0x29,0x28,0x43,0x7e,0x90,0x4, 0xac,0x9d,0x49,0x34,0xe, 0x3c,0x74,0x7, +0xac,0xbe,0x59,0x35,0x3, 0x87,0x49,0x34,0xe, 0x3e,0x59,0x35,0x3, 0x89,0xa, 0x3d, +0x9, 0xb3,0x6, 0x70,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff, +0x78,0x4c,0x5, 0x1f,0x7e,0x73,0x3, 0x1e,0xbe,0x71,0x1e,0x28,0x41,0xe5,0x1f,0xbe, +0xb0,0x32,0x40,0x3a,0x5, 0x1e,0x80,0x33,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0x3, +0x87,0x74,0x4, 0xac,0xbd,0x59,0x35,0xe, 0x3c,0x49,0x34,0x3, 0x89,0x59,0x35,0xe, +0x3e,0x7e,0x73,0x3, 0x1d,0xbe,0x71,0x1e,0x78,0x8, 0x7e,0xb3,0x3, 0x1e,0xf5,0x1e, +0x80,0x9, 0xe5,0x1e,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x1e,0x75,0x1f,0x0, 0xb, 0xe0, +0xbe,0xe0,0x5, 0x68,0x3, 0x2, 0x3f,0xf2,0xda,0x79,0xda,0xd8,0x22,0x12,0x41,0x7, +0x38,0x34,0xbe,0xa3,0x3, 0xcf,0x50,0x19,0x7e,0xb3,0x3, 0xd4,0xbe,0xb3,0xe, 0x3b, +0x28,0x14,0x7e,0xb3,0xe, 0x3b,0x4, 0x7a,0xb3,0xe, 0x3b,0x7a,0xa3,0x3, 0xcf,0x80, +0x5, 0xe4,0x7a,0xb3,0xe, 0x3b,0x7e,0xb3,0x3, 0xcf,0x70,0xa, 0x7e,0xb3,0x3, 0xd3, +0x54,0xfe,0x7a,0xb3,0x3, 0xd3,0x22,0x7e,0xa3,0x3, 0xd0,0xbe,0xa0,0x0, 0x22,0x7e, +0xb3,0x3, 0xcf,0x70,0x1e,0x12,0x41,0x7, 0x28,0x19,0xe5,0x1d,0x70,0x11,0x7a,0xa3, +0x3, 0xcf,0x7e,0xb3,0x3, 0xd3,0x44,0x8, 0x7a,0xb3,0x3, 0xd3,0x5, 0x1d,0x22,0x75, +0x1d,0x0, 0x22,0x75,0x1d,0x0, 0x7e,0xb3,0x3, 0xd3,0x54,0xf7,0x7a,0xb3,0x3, 0xd3, +0x22,0x12,0x41,0x55,0x7a,0xb3,0xe, 0x33,0x74,0xff,0x7a,0xb3,0xe, 0x2b,0x74,0x1, +0x7a,0xb3,0xe, 0x34,0x22,0x74,0x3, 0x7a,0xb3,0xe, 0x2c,0xe4,0x22,0x7e,0xb3,0x3, +0xd3,0x20,0xe6,0x1d,0x7e,0xb3,0x0, 0xa4,0x30,0xe0,0x9, 0x12,0x41,0xfe,0x7a,0x1f, +0xa, 0xd4,0x80,0xd, 0x7e,0xb3,0x0, 0xa2,0x70,0x7, 0x12,0x41,0xfe,0x7a,0x1f,0x2, +0xe9,0x7e,0xb3,0x0, 0xa4,0x30,0xe0,0x48,0xe4,0x7a,0xb3,0x0, 0xa2,0x7e,0x37,0x3, +0xd1,0xbe,0x34,0x5, 0xdc,0x50,0x8, 0xb, 0x34,0x7a,0x37,0x3, 0xd1,0x80,0x6, 0x12, +0x37,0xe0,0x12,0x41,0xf5,0x7e,0xb3,0x3, 0xd3,0x20,0xe6,0x2a,0x7e,0x37,0x3, 0xd1, +0xbe,0x34,0x0, 0x28,0x40,0x20,0x44,0x40,0x7a,0xb3,0x3, 0xd3,0x7e,0xf, 0x2, 0xe9, +0x7e,0x1f,0xa, 0xd4,0xbf,0x10,0x50,0xe, 0x12,0x37,0xe0,0x12,0x41,0xf5,0x80,0x6, +0x6d,0x33,0x7a,0x37,0x3, 0xd1,0x7e,0xb3,0x0, 0xa4,0x20,0xe0,0x17,0x6d,0x33,0x7a, +0x37,0x3, 0xd1,0x30,0x1, 0xe, 0xc2,0x1, 0x7e,0x73,0x0, 0xa2,0xbe,0x70,0x0, 0x28, +0x3, 0x12,0x37,0xe0,0x22,0x7e,0x34,0x5, 0xdc,0x7a,0x37,0x3, 0xe2,0x22,0xca,0xf8, +0x7e,0x14,0x6, 0xb7,0x7e,0x4, 0x8, 0xaf,0x9f,0x11,0x6c,0xaa,0x80,0x2d,0x7e,0x90, +0xc, 0xac,0x9a,0x6c,0xff,0x80,0x1a,0x7d,0xf4,0x3e,0xf4,0x7d,0xef,0x2d,0xe0,0xb, +0xe8,0xe0,0x2d,0xf1,0xb, 0xf8,0xf0,0x2d,0xfe,0x6d,0xee,0x2f,0x17,0xb, 0x44,0xb, +0xf0,0x7e,0xb3,0xa, 0xd9,0xbc,0xbf,0x38,0xde,0xb, 0xa0,0x7e,0xb3,0xa, 0xd8,0xbc, +0xba,0x38,0xcb,0xda,0xf8,0x22,0xca,0x3b,0x7d,0x62,0x7d,0x73,0x75,0x2b,0x0, 0x75, +0x2d,0x0, 0x75,0x30,0x0, 0x75,0x31,0x0, 0xb, 0x78,0x30,0x7a,0x37,0xd, 0xcf,0x9, +0xb7,0x0, 0x50,0x20,0xe0,0x8, 0x20,0xe2,0x5, 0x20,0xe1,0x2, 0xa1,0x5b,0x20,0xe0, +0xf, 0x30,0xe2,0x1a,0x80,0xa, 0x7e,0x37,0x3, 0x81,0xbe,0x34,0x0, 0xf, 0x38,0x8, +0x7e,0x37,0x6, 0x92,0x4d,0x33,0x68,0xee,0x6d,0x33,0x7a,0x37,0x6, 0x92,0x20,0x2, +0x6, 0x7e,0x34,0xd, 0x1e,0x80,0x4, 0x7e,0x34,0xd, 0x42,0x7a,0x35,0x2e,0x75,0x27, +0x0, 0x7e,0xa0,0xff,0x12,0x45,0x8c,0x7a,0x39,0xa0,0x5, 0x27,0xe5,0x27,0xb4,0x24, +0xf0,0x74,0xaa,0x7e,0x35,0x2e,0x7a,0x39,0xb0,0x7e,0x35,0x2e,0x19,0xb3,0x0, 0x1, +0x9, 0x77,0x0, 0x4a,0x7e,0x25,0x2e,0x19,0x72,0x0, 0x4, 0x75,0x2c,0x0, 0x75,0x27, +0x0, 0x7e,0x91,0x27,0x74,0x7, 0xac,0x9b,0x7d,0x34,0x2d,0x37,0x9, 0xa3,0x0, 0x8, +0x7c,0xba,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2b,0xb4,0xb0,0x2, 0x80,0x2, 0x81,0xd5, +0x2e,0x34,0x0, 0x8, 0x7c,0xba,0x54,0xf, 0x7a,0x39,0xb0,0x7d,0x54,0x2d,0x57,0x9, +0x75,0x0, 0x8, 0xa, 0x57,0x2e,0x57,0xd, 0xcf,0x9, 0xb5,0x0, 0x23,0xb4,0x1, 0x2, +0x80,0x2, 0x81,0xd5,0x2d,0x47,0x9, 0xa4,0x0, 0x8, 0xa, 0x3a,0x2e,0x37,0xd, 0xcf, +0x9, 0xb3,0x0, 0x23,0xbe,0xb0,0x3, 0x78,0x2, 0x81,0xd5,0x7a,0xa1,0x32,0xa, 0x3a, +0x12,0x45,0xa7,0xf5,0x33,0x60,0x5, 0xe5,0x33,0xb4,0x2, 0x3a,0x7d,0x43,0x2d,0x47, +0x9, 0x34,0x0, 0x56,0x9, 0xa7,0x0, 0x5b,0xbc,0x3a,0x50,0xe, 0x7d,0x4, 0x2e,0x4, +0x0, 0x56,0x7c,0xb3,0x4, 0x7a,0x9, 0xb0,0x81,0xd5,0xbc,0x3a,0x78,0x9, 0x4c,0xaa, +0x68,0x5, 0xe4,0x19,0xb2,0x0, 0x23,0x7e,0xa0,0xff,0xe5,0x32,0xa, 0x2b,0x2d,0x27, +0x19,0xa2,0x0, 0x56,0x80,0x1a,0x2d,0x37,0x9, 0x43,0x0, 0x56,0x9, 0x57,0x0, 0x5b, +0xbc,0x45,0x38,0x7, 0xe4,0x19,0xb3,0x0, 0x56,0x81,0xd5,0xe4,0x19,0xb3,0x0, 0x56, +0x7e,0xa1,0x2c,0x74,0x6, 0xa4,0xf5,0x28,0x12,0x45,0x75,0x9, 0xb3,0x0, 0x9, 0xf5, +0x30,0x12,0x45,0x75,0x9, 0xb3,0x0, 0xa, 0xc4,0x54,0xf0,0xf5,0x31,0xe5,0x32,0xbe, +0xb0,0x5, 0x50,0x64,0x9, 0xb7,0x0, 0x50,0x20,0xe3,0x2a,0x7e,0x8, 0x0, 0x30,0xe5, +0x32,0xa, 0x3b,0x2e,0x34,0xd, 0x19,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x45,0xb2,0x7e, +0x8, 0x0, 0x31,0xe5,0x32,0xa, 0x3b,0x2e,0x34,0xd, 0x66,0x74,0x10,0x7e,0x50,0x20, +0x12,0x45,0xb2,0x80,0x14,0xe5,0x32,0xa, 0x3b,0x9, 0xb3,0xd, 0x19,0xf5,0x30,0xe5, +0x32,0xa, 0x3b,0x9, 0xb3,0xd, 0x66,0xf5,0x31,0xe5,0x32,0xa, 0x3b,0x12,0x45,0xa7, +0xb4,0x1, 0x15,0xe4,0x19,0xb3,0xd, 0x19,0x6c,0xaa,0xe5,0x32,0xa, 0x3b,0x19,0xa3, +0xd, 0x66,0x75,0x30,0x0, 0x75,0x31,0x0, 0x9, 0xb6,0x0, 0x6, 0xb4,0xff,0x14,0x12, +0x45,0x75,0x9, 0xb3,0x0, 0x8, 0xbe,0xb0,0xff,0x68,0x5, 0x75,0x30,0x1, 0x80,0x3, +0x75,0x30,0x0, 0x12,0x45,0x75,0x49,0x33,0x0, 0x4, 0x12,0x45,0x62,0x19,0xa3,0x0, +0x5, 0x7e,0x55,0x29,0x12,0x45,0x6b,0x19,0xa3,0x0, 0x6, 0x12,0x45,0x75,0x49,0x33, +0x0, 0x6, 0x12,0x45,0x62,0x19,0xa3,0x0, 0x7, 0x7e,0x55,0x29,0x12,0x45,0x6b,0x19, +0xa3,0x0, 0x8, 0x7e,0xa1,0x30,0x12,0x45,0x6d,0x19,0xa3,0x0, 0x9, 0x7e,0xa1,0x31, +0x12,0x45,0x6d,0x19,0xa3,0x0, 0xa, 0x12,0x45,0x75,0x9, 0x63,0x0, 0x8, 0x7c,0xb6, +0xc4,0x54,0xf0,0x12,0x45,0x9d,0x2e,0x24,0x0, 0x7, 0x12,0x45,0x94,0x7e,0x51,0x27, +0x74,0x7, 0xac,0x5b,0x2d,0x27,0x9, 0x72,0x0, 0x8, 0xbe,0x70,0xff,0x68,0x25,0xa, +0x17,0x2e,0x17,0xd, 0xcf,0x9, 0x61,0x0, 0x23,0xbe,0x60,0x1, 0x68,0x2, 0x5, 0x2b, +0x5, 0x2d,0x7c,0xb6,0x3, 0x3, 0x54,0xc0,0x12,0x45,0x9d,0x2e,0x24,0x0, 0x5, 0x12, +0x45,0x94,0x80,0xf, 0x12,0x45,0x6d,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0, +0x7a,0x39,0xb0,0x5, 0x2c,0x5, 0x27,0xe5,0x27,0xb4,0x5, 0x2, 0x80,0x2, 0x41,0xd1, +0xe5,0x2b,0x7e,0x35,0x2e,0x19,0xb3,0x0, 0x3, 0x74,0x24,0x7e,0x35,0x2e,0x19,0xb3, +0x0, 0x2, 0xe4,0x7e,0x35,0x2e,0x19,0xb3,0x0, 0x23,0x75,0x27,0x0, 0x12,0x45,0x8c, +0x7e,0x39,0x60,0x7e,0x25,0x2e,0x2e,0x24,0x0, 0x23,0x7e,0x29,0x70,0x6c,0x76,0x7a, +0x29,0x70,0x5, 0x27,0xe5,0x27,0xb4,0x23,0xe4,0xb2,0x2, 0x7e,0xb3,0xc, 0xcd,0xb4, +0x1, 0x12,0xe5,0x5d,0xb4,0x1, 0x12,0x75,0x10,0x0, 0x74,0x1, 0x12,0x3d,0x82,0x75, +0x5d,0x0, 0x80,0x5, 0x74,0x1, 0x12,0x3d,0x82,0x9, 0xb7,0x0, 0x50,0x30,0xe2,0x7, +0x7e,0x37,0xd, 0xcf,0x12,0x46,0x8, 0x12,0x45,0x82,0x54,0xfe,0x12,0x45,0x7f,0x54, +0xfb,0x12,0x45,0x7f,0x54,0xfd,0x7a,0x39,0xb0,0x80,0x4, 0xe4,0x12,0x3d,0x82,0xda, +0x3b,0x22,0x7a,0x35,0x29,0xa, 0x56,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x28,0xa, +0x3b,0x2e,0x35,0x2e,0x22,0x7e,0x71,0x27,0x74,0x7, 0xac,0x7b,0x2d,0x37,0x22,0x7a, +0x39,0xb0,0x7d,0x37,0x2e,0x34,0x0, 0x50,0x7e,0x39,0xb0,0x22,0xe5,0x27,0xa, 0x3b, +0x2e,0x35,0x2e,0x22,0x7e,0x29,0x70,0x2c,0x76,0x7a,0x29,0x70,0x22,0x7c,0x6b,0xe5, +0x28,0xa, 0x2b,0x2e,0x25,0x2e,0x22,0x7d,0x23,0x2e,0x27,0xd, 0xcf,0x9, 0xb2,0x0, +0x23,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x34,0x7e,0x79,0x50, +0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x34,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80,0x36,0x7e, +0xd, 0x34,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x0, 0x2e,0xa, 0x2c, +0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x34,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc,0xba,0x7c, +0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79,0x30,0x7e, +0x1d,0x34,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d,0x23, +0x19,0xb2,0x0, 0x28,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0x23,0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x2d,0x2d,0x13,0x59, +0x21,0x0, 0x37,0xb, 0xa0,0xbe,0xa0,0x5, 0x40,0xd0,0xe4,0x19,0xb3,0x0, 0x41,0x19, +0xb3,0x0, 0x42,0x22,0xca,0x3b,0x7e,0xb3,0x6, 0x8e,0x7c,0xeb,0x70,0x27,0x6c,0xff, +0x6d,0x11,0x74,0x2, 0xac,0xbf,0x59,0x15,0xb, 0x2e,0x7e,0xa0,0xff,0x7e,0x30,0x7, +0xac,0x3f,0x19,0xa1,0xb, 0xf, 0x74,0x2, 0xa, 0x1f,0x19,0xb1,0xb, 0x38,0xb, 0xf0, +0xbe,0xf0,0x5, 0x78,0xdb,0x6c,0xff,0xe1,0x97,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0x6, +0x51,0xf5,0x28,0xbe,0xb0,0xff,0x78,0x2, 0xe1,0x95,0x12,0x47,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xe1,0x95,0x75,0x27,0x0, 0x7e,0x31,0x27,0x74,0x7, 0xac,0x3b,0x9, 0x71, +0xb, 0xf, 0x7a,0x71,0x29,0xbe,0x71,0x28,0x68,0x2, 0xe1,0x8a,0x49,0x21,0xb, 0xd, +0x74,0x7, 0xac,0xbf,0x49,0x35,0x6, 0x4f,0x12,0x47,0xc5,0x7e,0xa1,0x27,0x74,0x7, +0xa4,0x49,0x25,0xb, 0xb, 0x74,0x7, 0xac,0xbf,0x49,0x35,0x6, 0x4d,0x9d,0x32,0x12, +0x0, 0x2e,0x7d,0x3, 0x2d,0x6, 0xe5,0x29,0xa, 0x1b,0x9, 0xa1,0xb, 0x38,0xbe,0xa0, +0x0, 0x28,0x17,0x7e,0x71,0x29,0x74,0x2, 0xac,0x7b,0x59,0x3, 0xb, 0x2e,0x2e,0x14, +0xb, 0x38,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xe1,0x95,0x7e,0xa1,0x29,0x74,0x2, 0xa4, +0x49,0x15,0xb, 0x2e,0xbe,0x14,0x0, 0x64,0x28,0x8, 0xbe,0x4, 0x0, 0x64,0x28,0x2, +0x80,0x72,0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32, +0x28,0x2, 0x80,0x60,0x7e,0x17,0x3, 0x1a,0xbd,0x10,0x50,0x52,0x12,0x47,0xbc,0x70, +0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0x6, 0x70,0x7e,0xa0,0x3, 0xe5,0x28, +0xa, 0x1b,0x19,0xa1,0x6, 0x75,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0x6, 0x4d,0x7e, +0x14,0xd, 0xcf,0x74,0x7, 0x12,0x1, 0x39,0xbe,0xe0,0x0, 0x28,0x21,0x1b,0xe0,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0x6, 0x4d,0x7e,0x30,0x7, 0xac,0x3f,0x12,0x47,0xb3, +0x7e,0x34,0xd, 0xcf,0x7e,0x30,0x7, 0xac,0x3e,0x12,0x47,0xb3,0x1b,0xf0,0x7e,0xa1, +0x29,0x74,0x2, 0xa4,0x59,0x5, 0xb, 0x2e,0x80,0xb, 0x5, 0x27,0xe5,0x27,0xbe,0xb0, +0x5, 0x50,0x2, 0xc1,0x97,0xb, 0xf0,0x7e,0x73,0x6, 0x8e,0xbc,0x7f,0x28,0x2, 0xc1, +0x79,0x7a,0xe3,0x6, 0x8e,0x7e,0x24,0x6, 0x4d,0x7e,0x34,0xb, 0xb, 0x12,0x1e,0xb3, +0xda,0x3b,0x22,0x2e,0x14,0x6, 0x4d,0x74,0x7, 0x2, 0x1, 0x39,0xe5,0x28,0xa, 0x1b, +0x9, 0xb1,0x6, 0x70,0x22,0x9d,0x32,0x12,0x0, 0x2e,0x7d,0x63,0x22,0x6c,0xaa,0x7e, +0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x3, 0x33,0x7e,0xe4,0x0, 0xff,0xb, 0x7a, +0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x3, 0x35,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xd4,0x7c,0xba,0x22,0xca,0x79, +0x6c,0x99,0x80,0x63,0x7e,0xf0,0x7, 0xac,0xf9,0x49,0xc7,0x3, 0x89,0xbe,0xc4,0x5, +0xa, 0x40,0x44,0x49,0xd7,0x3, 0x87,0x7d,0x3d,0x12,0x47,0xcd,0x7c,0x8b,0xbe,0x80, +0x2, 0x40,0xe, 0x7e,0xd4,0x4, 0xff,0x74,0x7, 0xac,0xb9,0x59,0xd5,0x3, 0x89,0x80, +0x3e,0x7e,0x70,0x2, 0xac,0x78,0x2e,0x34,0x3, 0x47,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xd0,0x74,0x7, 0xac,0xb9,0x59,0xd5,0x3, 0x87,0x7e,0x34,0x5, 0x50,0x74,0x7, 0xac, +0xb9,0x59,0x35,0x3, 0x89,0x80,0xe, 0xbe,0xc4,0x5, 0x0, 0x40,0x8, 0x7e,0x54,0x4, +0xff,0x59,0x57,0x3, 0x89,0xb, 0x90,0x7e,0x73,0x3, 0xcf,0xbc,0x79,0x38,0x95,0xda, +0x79,0x22,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x4, 0x9, 0xa, 0x4a,0x19,0xb4,0x3, 0x29, +0x9, 0xb3,0x4, 0x2a,0x19,0xb4,0x3, 0x3e,0x2e,0x34,0x0, 0x6, 0x12,0x13,0x4, 0x19, +0xb4,0x3, 0x53,0xb, 0xa0,0xbe,0xa0,0x15,0x78,0xda,0x74,0x2, 0x7a,0xb3,0x3, 0x25, +0x7e,0xb3,0x4, 0x54,0xb4,0x1, 0x4, 0x74,0x3f,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x3, +0x21,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x3, 0x7e,0x74,0xc8,0x7a,0xb3,0x3, 0x27,0xe4, +0x7a,0xb3,0x3, 0x28,0x74,0xeb,0x7a,0xb3,0x3, 0x23,0x7e,0xb3,0x4, 0x4f,0x12,0x15, +0x41,0x74,0x5d,0x7a,0xb3,0x3, 0x24,0x7e,0x73,0x3, 0xe4,0x7a,0x73,0x3, 0x26,0x7e, +0x24,0x3, 0xf4,0x7e,0x34,0x3, 0x68,0x12,0x48,0xf1,0x74,0xc8,0x7a,0xb3,0x3, 0x80, +0x22,0x7e,0x33,0x3, 0xe4,0xa, 0x13,0x2, 0x3, 0x88,0xca,0x3b,0x7e,0xf3,0x0, 0xa2, +0x6c,0xee,0x80,0x44,0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x0, 0x62,0xf5,0x27,0x7e,0xd0, +0x1, 0x6c,0xcc,0x80,0x2d,0xbc,0xce,0x68,0x27,0x74,0x2, 0xac,0xbc,0x9, 0x75,0x0, +0x62,0x7a,0x71,0x28,0xa, 0x27,0xe5,0x27,0xa, 0x3b,0x9d,0x32,0x12,0x0, 0x2e,0xbe, +0x34,0x0, 0x2, 0x18,0x2, 0xb, 0xd0,0xbe,0xd0,0x2, 0x40,0x4, 0x74,0x1, 0x80,0xd, +0xb, 0xc0,0xbc,0xfc,0x38,0xcf,0xb, 0xe0,0xbc,0xfe,0x38,0xb8,0xe4,0xda,0x3b,0x22, +0x6c,0xaa,0xa, 0x3a,0x2e,0x34,0x3, 0xbc,0x12,0x13,0x4, 0x7c,0x7b,0xb, 0x70,0x80, +0x14,0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7e,0x50,0x18,0xac,0x57,0x2d,0x21,0x59, +0x42,0x8, 0xaf,0xb, 0x70,0xbe,0x70,0x15,0x40,0xe7,0xb, 0xa0,0xbe,0xa0,0xc, 0x40, +0xd1,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x29,0x7e,0x18,0x80,0x0, 0x7e,0x14,0xd, +0xcf,0x74,0x10,0x12,0x1, 0x5a,0x7e,0xb3,0xc, 0xcd,0xb4,0x1, 0x3, 0xe4,0x41,0xf4, +0x7e,0xb3,0x0, 0xa2,0x70,0x2, 0x41,0x5f,0x7e,0xb3,0x3, 0xd0,0x60,0x2, 0x41,0x5f, +0x7e,0xb3,0x0, 0x61,0x1e,0xb0,0xf5,0x27,0x7e,0x73,0x0, 0x62,0x1e,0x70,0x7a,0x71, +0x28,0x6d,0x66,0x75,0x2b,0x0, 0x75,0x2c,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x2f,0x7d, +0x17,0x3e,0x14,0x12,0x4a,0xfe,0x49,0x12,0x8, 0xaf,0xbe,0x14,0x0, 0x3c,0x8, 0x24, +0x12,0x4b,0x8, 0x28,0x8, 0x49,0x12,0x8, 0x97,0x2d,0x61,0x5, 0x2c,0xe5,0x27,0xbe, +0xb0,0x14,0x50,0x8, 0x49,0x22,0x8, 0xc7,0x2d,0x62,0x5, 0x2c,0x1b,0x74,0xbe,0x74, +0x0, 0x0, 0x58,0xcb,0x7d,0x73,0x80,0x30,0x7d,0x27,0x3e,0x24,0x7e,0x71,0x27,0x12, +0x27,0xe, 0x49,0x23,0x8, 0xaf,0xbe,0x24,0x0, 0x3c,0x8, 0x28,0x12,0x4b,0x8, 0x28, +0x8, 0x49,0x23,0x8, 0x97,0x2d,0x62,0x5, 0x2c,0xe5,0x27,0xbe,0xb0,0x14,0x50,0x8, +0x49,0x33,0x8, 0xc7,0x2d,0x63,0x5, 0x2c,0x7d,0x37,0xb, 0x34,0x7d,0x73,0xbe,0x34, +0x0, 0xc, 0x48,0xc4,0xe5,0x2b,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12,0x7d,0x36,0x12, +0x0, 0x2e,0xe5,0x2c,0xa, 0x2b,0x12,0x0, 0x66,0xbe,0x34,0x0, 0xf, 0x8, 0x7, 0x75, +0x1c,0x1, 0x74,0x1, 0x41,0xf4,0x6d,0x33,0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x9, 0x12, +0x4a,0xf7,0x49,0x22,0x8, 0x97,0x2d,0x32,0xe5,0x27,0xbe,0xb0,0x14,0x50,0x9, 0x12, +0x4a,0xf7,0x49,0x22,0x8, 0xc7,0x2d,0x32,0x7e,0xa0,0x8, 0x80,0x1b,0x7e,0x50,0x2, +0xac,0x5a,0x9, 0xb2,0xd, 0xcf,0x1a,0x1b,0xbd,0x13,0x8, 0xc, 0x9, 0xb2,0xd, 0xd0, +0x1a,0x2b,0x2e,0x25,0x29,0x7a,0x25,0x29,0x7c,0x5a,0x1b,0xa0,0xa5,0xbd,0x0, 0xdd, +0x7e,0x51,0x28,0x74,0x2, 0xac,0x5b,0x7e,0x71,0x27,0x12,0x27,0xe, 0x49,0x33,0x8, +0xaf,0x12,0x0, 0x2e,0xbe,0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x29,0x2e,0x34,0x0, +0x28,0x7a,0x35,0x29,0x7e,0x35,0x29,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, +0xfa,0x7a,0x35,0x29,0xe5,0x1c,0xa, 0x3b,0xbe,0x35,0x29,0x50,0x5, 0x7e,0x55,0x29, +0xf5,0x1c,0xe5,0x1c,0xda,0x3b,0x22,0x7e,0x31,0x28,0x74,0x2, 0xac,0x3b,0x7e,0x51, +0x27,0x74,0x18,0xac,0x5b,0x2d,0x21,0x22,0x5, 0x2b,0xe5,0x27,0xbe,0xb0,0x0, 0x22, +0x7e,0x24,0xc, 0x98,0x7e,0xb3,0xd, 0x18,0x20,0xe0,0x2, 0x81,0x10,0x54,0xfe,0x7a, +0xb3,0xd, 0x18,0x7e,0x29,0x70,0xbe,0x73,0x6, 0x96,0x68,0xe, 0x7a,0x73,0x6, 0x96, +0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0x6, 0x94,0x9, 0x72,0x0, 0x1, 0xa, 0x37, +0xbe,0x37,0x6, 0x97,0x68,0x4, 0x7a,0x37,0x6, 0x97,0x9, 0x72,0x0, 0x5, 0xbe,0x73, +0x3, 0x19,0x68,0xb, 0x7a,0x73,0x3, 0x19,0x12,0x1f,0x35,0x7a,0x37,0x3, 0x17,0x9, +0x72,0x0, 0x2e,0xa, 0x37,0xbe,0x37,0x3, 0x1a,0x68,0x4, 0x7a,0x37,0x3, 0x1a,0x9, +0x72,0x0, 0x25,0xa, 0x37,0xbe,0x37,0x2, 0xdd,0x68,0x4, 0x7a,0x37,0x2, 0xdd,0x9, +0x72,0x0, 0x6, 0xbe,0x73,0x2, 0xdf,0x68,0x4, 0x7a,0x73,0x2, 0xdf,0x9, 0x72,0x0, +0x8, 0xbe,0x73,0x2, 0xe2,0x68,0x1f,0x7a,0x73,0x2, 0xe2,0xbe,0x70,0xf, 0x40,0x5, +0xe4,0x19,0xb2,0x0, 0x8, 0x9, 0x72,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x3, 0x9f,0x12, +0x13,0x4, 0x7a,0xb3,0x2, 0xe1,0x9, 0x72,0x0, 0x9, 0xbe,0x73,0x2, 0xe4,0x68,0x8, +0x7a,0x73,0x2, 0xe4,0x7a,0x73,0x2, 0xe3,0x9, 0x72,0x0, 0x7, 0xbe,0x73,0x2, 0xe5, +0x68,0x4, 0x7a,0x73,0x2, 0xe5,0x9, 0x72,0x0, 0x24,0xbe,0x73,0x2, 0xe7,0x68,0x4, +0x7a,0x73,0x2, 0xe7,0x9, 0x72,0x0, 0x32,0xbe,0x73,0x3, 0x1c,0x68,0x4, 0x7a,0x73, +0x3, 0x1c,0x9, 0x72,0x0, 0x33,0xa, 0x37,0xbe,0x37,0x6, 0x9f,0x68,0x4, 0x7a,0x37, +0x6, 0x9f,0x9, 0x72,0x0, 0x34,0xbe,0x73,0x6, 0xa1,0x68,0x4, 0x7a,0x73,0x6, 0xa1, +0x22,0x7c,0x7b,0x14,0x68,0x3f,0x14,0x68,0x41,0x14,0x68,0x41,0x14,0x68,0x3e,0x14, +0x68,0x3b,0x14,0x68,0x38,0x14,0x68,0x35,0x14,0x68,0x32,0x14,0x68,0x2f,0x14,0x68, +0x2c,0x14,0x68,0x29,0x14,0x68,0x26,0x14,0x68,0x23,0x14,0x68,0x20,0x14,0x68,0x1d, +0x24,0xc3,0x68,0x25,0x1b,0xb1,0x68,0x2b,0x24,0x64,0x68,0x22,0x24,0xea,0x78,0x28, +0x7e,0xb3,0xd, 0x75,0x22,0x7e,0xb3,0xd, 0x72,0x22,0x74,0xff,0x22,0xa, 0x37,0x2e, +0x34,0x3, 0xe4,0x9e,0x34,0x0, 0x3, 0x80,0x2e,0x7e,0xb3,0x3, 0xf1,0x22,0x7e,0xb3, +0xe, 0x34,0x22,0x7e,0xb3,0x4, 0x4f,0x22,0x12,0x4e,0xf6,0x7c,0x6b,0xbe,0x70,0x10, +0x40,0x19,0xbe,0x70,0x38,0x38,0x14,0x74,0x28,0xac,0xb6,0xa, 0x37,0x2e,0x37,0xd, +0x70,0x9e,0x34,0x0, 0x10,0x2d,0x35,0x7e,0x39,0xb0,0x22,0xbe,0x70,0x50,0x40,0xf, +0xbe,0x70,0x63,0x38,0xa, 0x12,0x4d,0x2, 0x2d,0x35,0x9, 0xb3,0x3, 0xa4,0x22,0xbe, +0x70,0x78,0x40,0xf, 0xbe,0x70,0x8b,0x38,0xa, 0x12,0x4d,0x2, 0x2d,0x35,0x9, 0xb3, +0x3, 0x91,0x22,0xbe,0x70,0xa0,0x40,0xf, 0xbe,0x70,0xb3,0x38,0xa, 0x12,0x4d,0x2, +0x2d,0x35,0x9, 0xb3,0x3, 0x7e,0x22,0xbe,0x70,0xbf,0x40,0xf, 0xbe,0x70,0xd2,0x38, +0xa, 0x12,0x4d,0x2, 0x2d,0x35,0x9, 0xb3,0x3, 0x6b,0x22,0xbe,0x70,0xd3,0x40,0xf, +0xbe,0x70,0xe6,0x38,0xa, 0x12,0x4d,0x2, 0x2d,0x35,0x9, 0xb3,0x3, 0x6c,0x22,0x74, +0xff,0x22,0x74,0x14,0xac,0xb6,0xa, 0x37,0x22,0xca,0x79,0x20,0x90,0x2, 0xa1,0xb8, +0xc2,0x90,0x7e,0xb3,0xd, 0x6d,0x4, 0x7a,0xb3,0xd, 0x6d,0x7e,0xf3,0xd, 0x6d,0xbe, +0xf0,0x1, 0x78,0x3f,0xe5,0x91,0x7a,0xb3,0xd, 0x79,0x7e,0xb3,0xd, 0x75,0xc4,0x54, +0x7, 0x78,0x5a,0x7e,0xb3,0xd, 0x79,0xbe,0xb0,0xd0,0x40,0xb, 0xbe,0xb0,0xd5,0x38, +0x6, 0x24,0xe5,0x7a,0xb3,0xd, 0x79,0x7e,0xb3,0xd, 0x79,0xb4,0xb8,0xe, 0x74,0x1, +0x7a,0xb3,0xd, 0x78,0x6d,0x33,0x7a,0x37,0xd, 0x6e,0x80,0x31,0xe4,0x7a,0xb3,0xd, +0x78,0x80,0x2a,0x7e,0xb3,0xd, 0x75,0xc4,0x7c,0xeb,0x5e,0xe0,0x7, 0x78,0xb, 0x12, +0x4e,0xce,0x7e,0x71,0x91,0x12,0x3f,0x2f,0x80,0x13,0xbe,0xe0,0x4, 0x40,0xe, 0xbe, +0xe0,0x5, 0x68,0x9, 0x12,0x4e,0xce,0x7e,0x71,0x91,0x12,0x3d,0xa5,0x12,0x4e,0xd7, +0xa5,0xbd,0x0, 0xa, 0x12,0x4e,0xbd,0x68,0x12,0x12,0x4e,0xec,0x80,0xd, 0xbe,0x50, +0x4, 0x40,0x8, 0xbe,0x50,0x5, 0x68,0x3, 0x12,0x4e,0xe2,0x7e,0xb3,0xd, 0x79,0xb4, +0xb8,0x6, 0x7e,0xb3,0xc, 0xd0,0xf5,0x91,0x30,0x91,0x70,0xc2,0x91,0x7e,0xb3,0xd, +0x78,0xb4,0x1, 0x36,0x7e,0xa3,0xc, 0x96,0x7e,0x70,0x4, 0xac,0x7a,0xbe,0x37,0xd, +0x6e,0x40,0x22,0x7e,0x37,0xd, 0x6e,0x4d,0x33,0x78,0x5, 0x7a,0xa1,0x91,0x80,0xd, +0x7d,0x23,0x1b,0x24,0x2e,0x27,0xb, 0x3d,0x7e,0x29,0xb0,0xf5,0x91,0xb, 0x34,0x7a, +0x37,0xd, 0x6e,0x80,0x36,0x75,0x91,0xff,0x80,0x31,0x7e,0xb3,0xd, 0x6b,0x4, 0x7a, +0xb3,0xd, 0x6b,0x12,0x4e,0xd7,0xa5,0xbd,0x0, 0xf, 0x12,0x4e,0xbd,0x68,0x1c,0x12, +0x4e,0xc5,0x12,0x4e,0x2e,0xf5,0x91,0x80,0x12,0xbe,0x50,0x4, 0x40,0xd, 0xbe,0x50, +0x5, 0x68,0x8, 0x12,0x4e,0xc5,0x12,0x4c,0x11,0xf5,0x91,0xda,0x79,0x22,0xbe,0xb0, +0x80,0x40,0xc, 0xbe,0xb0,0xbf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0xc, 0x18,0x22,0x7c, +0xab,0xb, 0xa2,0x68,0x9, 0x1b,0xa2,0x78,0xa, 0x7e,0xb3,0xd, 0x75,0x22,0x7e,0xb3, +0xc, 0xbf,0x22,0xb4,0x4, 0x8, 0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x6, 0x92,0xb4,0x3, +0x11,0x30,0x2, 0x6, 0x7e,0x34,0xd, 0x1e,0x80,0x4, 0x7e,0x34,0xd, 0x42,0x7a,0x37, +0xd, 0x76,0xbe,0xb0,0x3, 0x40,0x10,0xbe,0xb0,0x3e,0x38,0xb, 0xa, 0x3b,0x2e,0x37, +0xd, 0x76,0x9, 0xb3,0x0, 0x2, 0x22,0x1b,0xb1,0x68,0x19,0x4, 0x78,0x2c,0x30,0x2, +0x6, 0x7e,0x34,0xd, 0x1e,0x80,0x4, 0x7e,0x34,0xd, 0x42,0x7a,0x37,0xd, 0x76,0x9, +0xb3,0x0, 0x4, 0x22,0x30,0x2, 0x6, 0x7e,0x34,0xd, 0x1e,0x80,0x4, 0x7e,0x34,0xd, +0x42,0x7a,0x37,0xd, 0x76,0x9, 0xb3,0x0, 0x3, 0x22,0x74,0xff,0x22,0xe4,0x12,0x4e, +0x2e,0xbe,0xb0,0x10,0x22,0x7e,0xb3,0xd, 0x6b,0x2e,0xb3,0xd, 0x79,0x22,0x7c,0xbf, +0x2e,0xb3,0xd, 0x79,0x24,0xfe,0x22,0x7e,0xb3,0xd, 0x75,0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0x22,0x7e,0xb3,0xd, 0x79,0x12,0x4c,0x11,0xf5,0x91,0x22,0x7e,0xb3,0xd, 0x79, +0x12,0x4e,0x2e,0xf5,0x91,0x22,0x7e,0xb3,0xd, 0x75,0xc4,0x54,0x7, 0xb4,0x4, 0x2, +0xe4,0x22,0xb4,0x6, 0x3, 0x74,0x1, 0x22,0xb4,0x7, 0x3, 0x74,0x2, 0x22,0xe4,0x22, +0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0, +0xc0,0x83,0xc0,0x82,0xe5,0xcc,0xb4,0x2, 0x3, 0x75,0xcc,0x0, 0x12,0x4d,0x9, 0x30, +0x90,0x2, 0xc2,0x90,0x30,0x91,0x2, 0xc2,0x91,0x74,0x1, 0x7a,0xb3,0xd, 0x6c,0xd0, +0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda, +0x6b,0xda,0x7b,0x32,0xca,0xb8,0xa9,0xc0,0x93,0xe4,0x7a,0xb3,0xd, 0x6b,0x12,0x4f, +0x64,0xda,0xb8,0x32,0x7a,0xb3,0xd, 0x6d,0x7a,0xb3,0xd, 0x6c,0x22,0xca,0x79,0x6c, +0xee,0x7e,0xf1,0xcc,0x80,0xa, 0x4c,0xee,0x78,0x3, 0x7e,0xe0,0x1, 0x43,0x87,0x1, +0x12,0x9, 0xe6,0x60,0xf1,0x7a,0xf1,0xcc,0xda,0x79,0x22,0x70,0x3, 0x43,0x87,0x1, +0xb4,0x1, 0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0xc2,0xec,0x32, +0xa9,0xc6,0xdb,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x17,0xfd,0x7e,0xb3,0xd, 0x75,0x54, +0xfd,0x7a,0xb3,0xd, 0x75,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda, +0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x75,0xcb,0xc0,0x75,0xc8,0xb8, +0x14,0x68,0x8, 0x14,0x68,0xa, 0x75,0xcc,0x0, 0x80,0x8, 0x75,0xcc,0x2, 0x80,0x3, +0x75,0xcc,0x1, 0x0, 0x0, 0x0, 0x0, 0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6, +0xec,0xd2,0x86,0x22,0x75,0x9a,0xe8,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22, +0xca,0x79,0x6c,0xff,0xa, 0x2f,0x2e,0x24,0x3, 0x29,0x12,0x53,0x44,0xb, 0xf0,0xbe, +0xf0,0x15,0x78,0xf0,0x7e,0x34,0x1, 0xcc,0x7e,0x24,0xa, 0xd8,0x7e,0x14,0x3, 0x21, +0x12,0x50,0x83,0x7e,0x73,0x2, 0xf, 0xa, 0x37,0x9, 0xe3,0x1, 0xd8,0xa, 0x3e,0x9, +0xb3,0x1, 0xd0,0x12,0x15,0x41,0x53,0xdb,0xf0,0x74,0xe, 0x7e,0x70,0x2, 0x12,0xf, +0x0, 0xa, 0x3e,0x9, 0xb3,0x2, 0x0, 0xb4,0x1, 0x4, 0x74,0x3f,0x80,0x2, 0x74,0x7f, +0x7a,0xb3,0x3, 0x21,0x12,0xa, 0xb8,0x6c,0xff,0xa, 0x2f,0x2e,0x24,0x3, 0x29,0x7e, +0x29,0x70,0x2e,0x73,0x4, 0x52,0x7a,0x29,0x70,0xb, 0xf0,0xbe,0xf0,0x15,0x40,0xe9, +0xda,0x79,0x22,0xca,0x3b,0x7d,0x71,0x7a,0x25,0x27,0x7d,0x63,0x7e,0x34,0xd, 0xcf, +0x7d,0x27,0x2e,0x24,0x0, 0x8, 0x7e,0x14,0x0, 0x15,0x12,0x3, 0x88,0x7e,0x34,0xd, +0xe4,0x7d,0x27,0x2e,0x24,0x0, 0x1d,0x7e,0x14,0x0, 0x15,0x12,0x3, 0x88,0x7e,0x34, +0xd, 0xf9,0x7d,0x27,0x2e,0x24,0x0, 0x32,0x7e,0x14,0x0, 0x15,0x12,0x3, 0x88,0x9, +0xb6,0x1, 0x10,0x70,0x9, 0x7d,0x36,0x12,0x52,0x17,0x4, 0x7a,0x39,0xb0,0xe4,0x19, +0xb6,0x1, 0x10,0x9, 0x66,0x0, 0x3d,0x9, 0x76,0x0, 0x43,0xbc,0x76,0x40,0x32,0x7d, +0x36,0x2e,0x34,0x0, 0x40,0x12,0x31,0x2d,0x9, 0x76,0x0, 0x40,0xbe,0x70,0x8, 0x40, +0x1b,0xe4,0x19,0xb6,0x0, 0x40,0x9, 0xa6,0x0, 0x3e,0x9, 0xb6,0x0, 0x44,0xbc,0xba, +0x50,0xa, 0x7d,0x36,0x2e,0x34,0x0, 0x44,0x4, 0x7a,0x39,0xb0,0xe4,0x19,0xb6,0x0, +0x43,0x7e,0x35,0x27,0x7e,0x39,0x70,0xa, 0x27,0x7d,0x32,0x12,0x1f,0x2e,0x74,0x8, +0xac,0xb7,0x9d,0x25,0x7c,0x65,0x19,0x76,0x1, 0xc, 0x9, 0xb6,0x0, 0x40,0xac,0xb7, +0x7c,0x7b,0x19,0x76,0x0, 0xd9,0x9, 0x76,0x0, 0x40,0xbc,0x76,0x7d,0x26,0x50,0x1f, +0x2e,0x24,0x1, 0xc, 0x7e,0x29,0xb0,0x4, 0x7a,0x29,0xb0,0x9, 0x36,0x0, 0x40,0x7d, +0x26,0x2e,0x24,0x0, 0xd9,0x7e,0x29,0x70,0x2c,0x73,0x7a,0x29,0x70,0x80,0xc, 0x2e, +0x24,0x0, 0xd9,0x7e,0x29,0xb0,0x2c,0xb6,0x7a,0x29,0xb0,0x9, 0x76,0x0, 0x43,0xa, +0x37,0x2d,0x36,0x9, 0x73,0x0, 0xc, 0xa, 0x37,0x2d,0x36,0x9, 0xa3,0x0, 0x2c,0x6c, +0x66,0x80,0x7f,0x9, 0x76,0x0, 0xd9,0xa, 0x17,0xa, 0x26,0x2d,0x21,0xa, 0x45,0x2e, +0x44,0xd, 0xcf,0x7e,0x49,0xb0,0x2c,0xba,0x7a,0x49,0xb0,0x7c,0x46,0x3e,0x40,0xa, +0xf5,0x2e,0xf5,0x27,0x9, 0x3f,0x0, 0x4, 0xa, 0x4, 0x2d,0x7, 0x19,0x30,0x0, 0x47, +0xa, 0x5, 0x9, 0xb0,0xd, 0xcf,0xa, 0x44,0x2d,0x47,0x19,0xb4,0x0, 0x8, 0xa, 0x45, +0x9, 0x74,0xd, 0xe4,0xa, 0x44,0x2d,0x47,0x19,0x74,0x0, 0x1d,0xa, 0x45,0x9, 0x24, +0xd, 0xf9,0xa, 0x4, 0x2d,0x7, 0x19,0x20,0x0, 0x32,0xa, 0x44,0x2d,0x47,0x19,0x34, +0x0, 0x48,0xa, 0x44,0x2d,0x47,0x19,0xb4,0x0, 0x9, 0xa, 0x14,0x2d,0x17,0x19,0x71, +0x0, 0x1e,0xa, 0x15,0x9, 0x71,0xd, 0xf9,0xa, 0x14,0x2d,0x17,0x19,0x71,0x0, 0x33, +0xb, 0x60,0x9, 0x76,0x1, 0xc, 0xbc,0x76,0x28,0x2, 0x21,0x83,0x3e,0x70,0x19,0x77, +0x0, 0x5, 0xda,0x3b,0x22,0x7d,0x30,0x2e,0x34,0x0, 0x43,0x7e,0x39,0xb0,0x22,0xca, +0x3b,0x7d,0x42,0x7d,0xf3,0x49,0x21,0x0, 0xb, 0x6d,0x33,0x2e,0xf4,0x1, 0xf8,0x7d, +0x5f,0xf5,0xb9,0xa, 0x5a,0xf5,0xba,0x75,0xbb,0xf, 0x75,0xbc,0x5, 0x7e,0xf4,0xd, +0xcf,0x7d,0x5f,0xf5,0xbd,0xa, 0x5a,0xf5,0xc1,0x75,0xc3,0x0, 0x9, 0xa4,0x0, 0x2f, +0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0x9, 0xb4,0x0, 0x1, 0x4c,0xba,0xf5,0xc3, +0x7e,0x49,0xb0,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x41,0x0, 0x3, 0x7c, +0xb9,0xf5,0xc6,0x1a,0x58,0xf5,0xc6,0x6e,0x44,0xff,0xff,0xb, 0x44,0x7d,0x54,0x5e, +0x54,0x0, 0xff,0xf5,0xc6,0x1a,0x58,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x7c,0xb5,0xf5, +0xc6,0xa, 0x54,0xf5,0xc6,0x75,0xc2,0x9, 0x80,0x7, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, +0x0, 0xe5,0xc2,0x30,0xe7,0xf4,0x75,0xc2,0x0, 0x75,0xc5,0xc, 0x7e,0x51,0xc6,0x7e, +0xa1,0xc6,0x6c,0x44,0x80,0x29,0x7e,0xf0,0x2, 0xac,0xf4,0x49,0x47,0xd, 0xcf,0x7d, +0x64,0xa, 0x6c,0x7c,0xbd,0x3e,0xb0,0x7d,0xf7,0x2d,0xf0,0x7a,0xf9,0xb0,0x3e,0x90, +0x7e,0xf0,0x2, 0xac,0xf4,0x7d,0xf7,0x2d,0xf0,0x19,0x9f,0x0, 0x1, 0xb, 0x40,0xbc, +0x54,0x38,0xd3,0x6c,0x44,0x80,0x27,0x7e,0x90,0x2, 0xac,0x94,0x49,0xf4,0xd, 0xed, +0x7d,0x7f,0xa, 0x7e,0x7c,0xbf,0x3e,0xb0,0x7d,0xe4,0x2d,0xe0,0x19,0xbe,0x1, 0x3b, +0x7d,0x7f,0x7c,0xbf,0x3e,0xb0,0x2d,0x40,0x19,0xb4,0x1, 0x3c,0xb, 0x40,0xbc,0xa4, +0x38,0xd5,0x19,0x50,0x0, 0x41,0x19,0xa0,0x1, 0x3a,0x12,0x52,0x15,0x54,0xfe,0x7a, +0x39,0xb0,0x75,0xc5,0xa, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x2d,0x32,0x9, +0x51,0x0, 0xd, 0xa, 0x15,0xbd,0x13,0x50,0x8, 0x12,0x52,0x15,0x44,0x1, 0x7a,0x39, +0xb0,0xda,0x3b,0x22,0x7e,0x29,0x70,0x9e,0x73,0x4, 0x52,0x7a,0x29,0x70,0x22,0x74, +0xfe,0x22,0xca,0xf8,0x7e,0xb3,0xc, 0xcd,0x70,0x8, 0x12,0x53,0x8f,0x12,0x56,0x31, +0x80,0x2a,0x12,0x53,0x95,0x12,0x57,0x19,0xb4,0x1, 0xa, 0x12,0x53,0x4f,0x7c,0xfb, +0x12,0x53,0x8f,0x80,0x5, 0x12,0x54,0x9b,0x7c,0xfb,0x4c,0xff,0x68,0xe, 0x7c,0xbf, +0x12,0x57,0x25,0x60,0x7, 0x7a,0xf3,0xc, 0xd0,0x75,0x5d,0x1, 0xda,0xf8,0x22,0xe4, +0x7a,0xb3,0xc, 0x93,0x22,0xca,0x3b,0x7e,0xa3,0x3, 0xcf,0x7e,0x73,0x3, 0xd0,0xbe, +0xa0,0x1, 0x38,0x49,0xbe,0x70,0x1, 0x38,0x44,0x7e,0xb3,0xc, 0x93,0x60,0x6, 0x7e, +0xb3,0xc, 0x97,0x60,0x38,0x4c,0xaa,0x78,0x3b,0xa5,0xbf,0x1, 0x37,0x7e,0x73,0xc, +0x97,0xa, 0x37,0x7a,0x37,0xc, 0x94,0x7e,0xb3,0xc, 0x93,0xb4,0x3, 0x1f,0x7e,0x37, +0xc, 0x94,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0xc, 0x93,0x7e,0x37, +0xc, 0x87,0x7e,0x27,0xc, 0x89,0x74,0xff,0x12,0x54,0x7e,0x81,0x75,0xe4,0x7a,0xb3, +0xc, 0x93,0x81,0x75,0x7e,0x67,0x3, 0x87,0x7e,0x77,0x3, 0x89,0x7e,0xb3,0xc, 0x93, +0x70,0x17,0xa5,0xbf,0x0, 0x4d,0xbe,0xa0,0x1, 0x78,0x48,0x7d,0x36,0x7d,0x27,0x12, +0x56,0x34,0x12,0x54,0x78,0x74,0x1, 0x80,0x25,0x7e,0xb3,0xc, 0x93,0xb4,0x1, 0x24, +0x7e,0x37,0xc, 0x8b,0x9e,0x37,0xc, 0x8f,0xbe,0x37,0xe, 0x51,0x38,0xe, 0x7e,0x37, +0xc, 0x8d,0x9e,0x37,0xc, 0x91,0xbe,0x37,0xe, 0x53,0x28,0x17,0x74,0x3, 0x7a,0xb3, +0xc, 0x93,0x80,0xf, 0x7e,0xb3,0xc, 0x93,0xb4,0x3, 0x8, 0x7a,0x67,0xc, 0x87,0x7a, +0x77,0xc, 0x89,0x7e,0xb3,0xc, 0x93,0x60,0x1c,0x7d,0x36,0x9e,0x37,0xb, 0x3f,0x12, +0x54,0x93,0x18,0xb, 0x7d,0x37,0x9e,0x37,0xb, 0x41,0x12,0x54,0x93,0x8, 0x6, 0x12, +0x54,0x78,0x12,0x56,0x89,0xda,0x3b,0x22,0x7d,0x36,0x7d,0x27,0x74,0xff,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7d,0x27,0x12,0x56,0x92,0x7d,0x36,0x7d,0x27,0x12,0x57,0x6b, +0xda,0x3b,0x22,0x12,0x0, 0x2e,0xbe,0x34,0x0, 0x10,0x22,0xca,0x79,0x6c,0xaa,0x6d, +0x44,0x7d,0xf4,0x7e,0xf3,0x3, 0xcf,0x7e,0xe3,0x3, 0xd0,0x7e,0xe7,0xe, 0x65,0x4d, +0xee,0x68,0x6, 0x7e,0xb3,0xe, 0x71,0x60,0x1e,0xbe,0xf0,0x1, 0x78,0x14,0x7e,0xf7, +0x3, 0x87,0x7e,0x47,0x3, 0x89,0x7d,0x3f,0x7d,0x24,0x12,0x57,0x44,0xbe,0xb0,0x1, +0x68,0x5, 0xbe,0xf0,0x1, 0x28,0x7, 0x12,0x56,0x21,0x7c,0xba,0xa1,0xde,0x7e,0xe7, +0xe, 0x65,0x1b,0xe4,0x68,0x3c,0x1b,0xe4,0x68,0x65,0x1b,0xe4,0x78,0x2, 0xa1,0x9f, +0x2e,0xe4,0x0, 0x3, 0x68,0x2, 0xa1,0xc1,0xbe,0xf0,0x1, 0x68,0x2, 0xa1,0xc7,0x4c, +0xee,0x68,0x2, 0xa1,0xc7,0x7e,0xe4,0x0, 0x1, 0x7a,0xe7,0xe, 0x65,0x7a,0xf7,0xe, +0x72,0x7a,0x47,0xe, 0x74,0x12,0x55,0xe1,0x7e,0xb3,0xe, 0x64,0x7a,0xb3,0xe, 0x71, +0x80,0x73,0x4c,0xff,0x78,0x1a,0x7e,0xb3,0xe, 0x68,0x70,0x2, 0xa1,0xc1,0x7e,0x34, +0x0, 0x2, 0x7a,0x37,0xe, 0x65,0x7e,0xb3,0xe, 0x62,0x7a,0xb3,0xe, 0x67,0xa1,0xc7, +0x12,0x55,0xe1,0x12,0x56,0x28,0x12,0x56,0x17,0x4c,0x11,0x68,0x74,0x80,0x78,0xbe, +0xf0,0x1, 0x78,0x73,0x4c,0xee,0x78,0x6f,0x7a,0xf7,0xe, 0x6d,0x7a,0x47,0xe, 0x6f, +0x12,0x55,0xe1,0x7e,0x3, 0xe, 0x61,0xa, 0x20,0x7e,0x3, 0xe, 0x62,0xa, 0x30,0x9d, +0x32,0x7e,0xb3,0xe, 0x67,0xa, 0xeb,0xbd,0xe3,0x38,0x46,0x60,0x44,0x12,0x56,0x28, +0x7e,0xb3,0xe, 0x57,0x12,0x55,0xea,0x7c,0x1b,0x4c,0x11,0x68,0x34,0x7e,0x34,0x0, +0x3, 0x7a,0x37,0xe, 0x65,0x7e,0xb3,0xe, 0x63,0x7a,0xb3,0xe, 0x68,0x80,0x28,0x4c, +0xff,0x78,0xc, 0x7e,0xb3,0xe, 0x68,0x60,0x18,0x7e,0x34,0x0, 0x4, 0x80,0x14,0x12, +0x55,0xe1,0x7e,0x37,0xe, 0x6d,0x7e,0x27,0xe, 0x6f,0x12,0x56,0x17,0xa5,0xb9,0x0, +0x6, 0x6d,0x33,0x7a,0x37,0xe, 0x65,0x7e,0x37,0xe, 0x65,0xbe,0x34,0x0, 0x4, 0x78, +0xb, 0x7e,0xa0,0x24,0x12,0x56,0x21,0xe4,0x7a,0xb3,0xe, 0x71,0x7c,0xba,0xda,0x79, +0x22,0x7a,0xf7,0xe, 0x69,0x7a,0x47,0xe, 0x6b,0x22,0x7d,0x13,0xa, 0x3b,0x7d,0x1, +0x9d,0x3, 0xbe,0x7, 0xe, 0x69,0x38,0x1d,0x2d,0x13,0xbe,0x17,0xe, 0x69,0x40,0x15, +0x7d,0x12,0x9d,0x13,0xbe,0x17,0xe, 0x6b,0x38,0xb, 0x2d,0x32,0xbe,0x37,0xe, 0x6b, +0x40,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7e,0xb3,0xe, 0x58,0x12,0x55,0xea,0x7c,0x1b, +0x22,0x6d,0x33,0x7a,0x37,0xe, 0x65,0x22,0x7e,0x37,0xe, 0x72,0x7e,0x27,0xe, 0x74, +0x22,0x2, 0x56,0x21,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0x34,0xc, 0x83,0x7e,0x24, +0x0, 0x10,0xe4,0x12,0x0, 0x46,0x7e,0x34,0xc, 0x93,0x7e,0x24,0x0, 0x3, 0xe4,0x12, +0x0, 0x46,0x7e,0x34,0xb, 0x43,0x7e,0x24,0x1, 0x40,0xe4,0x12,0x0, 0x46,0x7e,0x37, +0xe, 0x55,0x7a,0x73,0xc, 0x97,0x7a,0x67,0xc, 0x83,0x7a,0x77,0xc, 0x85,0x7a,0x67, +0xc, 0x8f,0x7a,0x67,0xc, 0x8b,0x7a,0x77,0xc, 0x91,0x7a,0x77,0xc, 0x8d,0x12,0x56, +0x89,0xe4,0x7a,0xb3,0xc, 0x96,0xda,0x3b,0x22,0x7a,0x67,0xb, 0x3f,0x7a,0x77,0xb, +0x41,0x22,0x7a,0x25,0x29,0x7a,0x35,0x27,0xe4,0x7e,0x23,0xc, 0x96,0xbe,0x20,0x50, +0x50,0x6e,0x7e,0x15,0x27,0x6e,0x14,0xff,0xff,0x5e,0x14,0x0, 0x7, 0x7e,0x70,0x18, +0xac,0x73,0x49,0x53,0x8, 0xaf,0x49,0x33,0x8, 0xb3,0x7c,0xa7,0x7e,0x25,0x27,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x54,0xf, 0xa, 0x3b,0x4d,0x32,0x7a,0x35,0x27, +0x7c,0xba,0x54,0xf, 0xa, 0x5b,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x7e,0x35,0x29,0x5e, +0x34,0xf, 0xff,0x4d,0x35,0x7a,0x35,0x29,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, 0x29, +0x12,0x5a,0xf0,0x7e,0x35,0x27,0x12,0x57,0x11,0x59,0x35,0xb, 0x43,0x7e,0x35,0x29, +0x12,0x57,0x11,0x59,0x35,0xb, 0x45,0x7e,0xb3,0xc, 0x96,0x4, 0x7a,0xb3,0xc, 0x96, +0x22,0x7e,0xa3,0xc, 0x96,0x74,0x4, 0xa4,0x22,0x7e,0xb3,0xc, 0x93,0xb4,0x4, 0x3, +0x74,0x1, 0x22,0xe4,0x22,0x7c,0xab,0x54,0xf0,0xb4,0x20,0x15,0x7c,0xba,0x54,0xf, +0x7e,0xa0,0x1, 0x60,0x5, 0x3e,0xa0,0x14,0x78,0xfb,0x7c,0xba,0x5e,0xb3,0xc, 0xce, +0x22,0x74,0x1, 0x22,0x7d,0x13,0x7e,0x37,0xe, 0x59,0xbd,0x31,0x50,0x1a,0x7e,0x37, +0xe, 0x5b,0xbd,0x31,0x28,0x12,0x7e,0x37,0xe, 0x5d,0xbd,0x32,0x50,0xa, 0x7e,0x37, +0xe, 0x5f,0xbd,0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x17,0xc, 0x8f,0xbd, +0x13,0x28,0x4, 0x7a,0x37,0xc, 0x8f,0x7e,0x17,0xc, 0x8b,0xbd,0x13,0x50,0x4, 0x7a, +0x37,0xc, 0x8b,0x7e,0x37,0xc, 0x91,0xbd,0x32,0x28,0x4, 0x7a,0x27,0xc, 0x91,0x7e, +0x37,0xc, 0x8d,0xbd,0x32,0x50,0x4, 0x7a,0x27,0xc, 0x8d,0x22,0x7e,0x34,0x0, 0xa0, +0x7a,0x37,0xe, 0x51,0x7a,0x37,0xe, 0x53,0x74,0x64,0x7a,0xb3,0xe, 0x50,0x7e,0x34, +0x0, 0x82,0x7a,0x37,0xe, 0x55,0x7e,0x34,0x0, 0x50,0x7a,0x37,0xe, 0x59,0x7e,0x24, +0x2, 0x80,0x7a,0x27,0xe, 0x5b,0x7a,0x37,0xe, 0x5d,0x7e,0x34,0x4, 0xb0,0x7a,0x37, +0xe, 0x5f,0x74,0x78,0x7a,0xb3,0xe, 0x57,0x74,0x1e,0x7a,0xb3,0xe, 0x58,0x74,0x5, +0x7a,0xb3,0xe, 0x61,0x74,0x2b,0x7a,0xb3,0xe, 0x62,0x7a,0xb3,0xe, 0x63,0x74,0x3f, +0x7a,0xb3,0xe, 0x64,0xe4,0x7a,0xb3,0xc, 0xcd,0x22,0x7d,0x23,0x74,0x30,0x7a,0xb3, +0xc, 0xb9,0x74,0xf8,0x7a,0xb3,0xc, 0xba,0x2e,0x24,0x3, 0xf0,0x6d,0x11,0x6d,0x55, +0x7d,0x1, 0x3e,0x4, 0x2d,0x3, 0x1b,0x8, 0x50,0x74,0xff,0x7d,0x1, 0x1e,0x4, 0x1e, +0x4, 0x1e,0x4, 0x2d,0x2, 0x7a,0x9, 0xb0,0xb, 0x14,0xbe,0x14,0x0, 0xfc,0x40,0xde, +0x22,0xca,0x3b,0x7d,0x2, 0x9, 0xb0,0x4, 0x13,0x7c,0xab,0x9, 0x51,0x0, 0x15,0x9, +0x41,0x0, 0x16,0x70,0x2, 0x21,0x5d,0xb4,0x4, 0x6, 0x3e,0x50,0x3e,0x50,0x3e,0x50, +0x7d,0x40,0x7d,0x10,0x2e,0x14,0x1, 0xf8,0x2e,0x4, 0x3, 0xf0,0x6c,0xff,0x21,0x54, +0x7e,0xd0,0xc, 0xac,0xdf,0x7d,0xf6,0x75,0x27,0x0, 0x21,0x47,0xbe,0xa0,0x3, 0x78, +0x8, 0xa, 0xc5,0x7d,0xdf,0x3e,0xd4,0x80,0x18,0xbe,0xa0,0x2, 0x78,0x8, 0xa, 0xc5, +0x7d,0xdf,0x3e,0xd4,0x21,0x39,0xbe,0xa0,0x5, 0x78,0xf, 0x12,0x59,0x60,0xb, 0xe8, +0xc0,0x2d,0xd4,0xb, 0xd8,0xe0,0x2d,0xec,0x21,0x40,0xbe,0xa0,0x6, 0x78,0x70,0x7d, +0xef,0x5e,0xe4,0x0, 0x7, 0x2e,0xe4,0x3, 0xd4,0x12,0x59,0x69,0x7d,0xdf,0x1e,0xd4, +0x1e,0xd4,0x1e,0xd4,0x2d,0xd0,0x7e,0xd9,0xb0,0x5c,0xbe,0x68,0x3b,0x7d,0xcf,0x3e, +0xc4,0x7d,0xdc,0x2d,0xd1,0xb, 0xd8,0xb0,0xa, 0xd4,0xbd,0xbd,0x8, 0x10,0xa, 0x95, +0x7d,0xac,0x2d,0xa4,0xb, 0xa8,0xd0,0x2d,0xd9,0x1b,0xa8,0xd0,0x80,0x65,0xa, 0xd4, +0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xbd,0x58,0x59,0xa, 0xb5,0x2d,0xc4,0xb, 0xc8, +0xd0,0x9d,0xdb,0x1b,0xc8,0xd0,0x80,0x4b,0x12,0x59,0x69,0x7d,0xef,0x1e,0xe4,0x1e, +0xe4,0x1e,0xe4,0x2d,0xe0,0x7e,0xe9,0xb0,0x4c,0xbe,0x7a,0xe9,0xb0,0x80,0x34,0x12, +0x59,0x60,0xb, 0xe8,0xc0,0xa, 0xe4,0xbd,0xce,0x8, 0x10,0xa, 0xa5,0x7d,0xbd,0x2d, +0xb4,0xb, 0xb8,0xe0,0x2d,0xea,0x1b,0xb8,0xe0,0x80,0x18,0xa, 0xe4,0x6e,0xe4,0xff, +0xff,0xb, 0xe4,0xbd,0xce,0x58,0xc, 0xa, 0xc5,0x2d,0xd4,0xb, 0xd8,0xe0,0x9d,0xec, +0x1b,0xd8,0xe0,0xb, 0xf4,0x5, 0x27,0x9, 0xb3,0x0, 0x1, 0xbe,0xb1,0x27,0x28,0x2, +0x1, 0x6c,0xb, 0xf0,0x7e,0x39,0xb0,0xbc,0xbf,0x28,0x2, 0x1, 0x60,0xda,0x3b,0x22, +0x7d,0xdf,0x3e,0xd4,0x7d,0xed,0x2d,0xe1,0x22,0x7d,0x6e,0x7a,0xd1,0x82,0x7a,0xc1, +0x83,0xe4,0x93,0x7c,0xeb,0x22,0xd2,0x3, 0xa9,0xc1,0xdb,0xc2,0xc3,0x53,0xdb,0xbf, +0x32,0x70,0x4, 0x53,0xdb,0xbf,0x22,0x43,0xdb,0x40,0x22,0x7c,0x67,0x7c,0xab,0x12, +0xf, 0x0, 0x7c,0xba,0x12,0x59,0xa2,0x7c,0x7b,0xbc,0x67,0x78,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0x12,0x59,0xbf,0x44,0x80,0xf5,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0x53,0xdb, +0xf3,0x75,0xd6,0x0, 0xe5,0xdb,0x30,0xe3,0xfb,0xe5,0xd6,0x43,0xd7,0x4, 0x22,0x53, +0xd7,0x3, 0x53,0xdb,0xf3,0x22,0x12,0x59,0xbf,0xf5,0xd6,0xe5,0xdb,0x30,0xe3,0xfb, +0xe5,0xd6,0xf5,0x5a,0x53,0xdb,0xf3,0x7a,0x71,0xd6,0xe5,0xdb,0x30,0xe3,0xfb,0xe5, +0xd6,0xf5,0x5b,0x53,0xdb,0xf3,0x43,0xd7,0x4, 0x7e,0x35,0x5a,0x22,0xca,0x3b,0x7d, +0x72,0x7d,0x63,0x6d,0x33,0x7a,0x35,0x29,0xe4,0x7e,0x35,0x29,0x2d,0x36,0x7e,0x39, +0x70,0x12,0x5a,0xae,0x7a,0x35,0x2b,0x7e,0x35,0x29,0x4d,0x33,0x78,0xa, 0x7e,0x35, +0x2b,0x4e,0x34,0x20,0x0, 0x7a,0x35,0x2b,0x7e,0x35,0x2b,0x12,0x5a,0x85,0xbe,0x34, +0x0, 0xc, 0x78,0xd4,0x7e,0x34,0x0, 0xc, 0x7a,0x35,0x29,0x74,0xc0,0x6c,0x77,0x12, +0x5a,0x87,0xbe,0x34,0x0, 0x24,0x78,0xf3,0x6d,0x33,0x7a,0x35,0x29,0x7e,0x35,0x29, +0x3e,0x34,0x2d,0x37,0x7e,0x39,0xb0,0x9, 0x73,0x0, 0x1, 0x12,0x1f,0xec,0x7a,0x35, +0x2b,0x12,0x5a,0x85,0xbe,0x34,0x0, 0x6, 0x78,0xe3,0x75,0x9d,0x0, 0x75,0x9e,0x0, +0x6d,0x33,0x7a,0x35,0x29,0x7e,0x35,0x29,0x7d,0x23,0x2e,0x24,0x1, 0x7f,0x12,0x17, +0x54,0x93,0xf5,0x9f,0xb, 0x34,0x7a,0x35,0x29,0xbe,0x34,0x1, 0x0, 0x40,0xe6,0x75, +0x9d,0x1, 0xda,0x3b,0x22,0xa, 0x56,0x12,0x59,0xc6,0x7e,0x35,0x29,0xb, 0x34,0x7a, +0x35,0x29,0x22,0xe4,0x6c,0x77,0x12,0x59,0x8b,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22, +0xe4,0x7e,0x70,0x3, 0x12,0x59,0x8b,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x7c,0xa7, +0xa, 0x3b,0x12,0x1f,0x37,0x3e,0x34,0x3e,0x34,0x2e,0x34,0xc0,0x0, 0xa, 0x2a,0x2d, +0x32,0x22,0x6c,0x77,0x6d,0x22,0x80,0xe, 0xb, 0x70,0xa5,0xbf,0xff,0x2, 0xb, 0x24, +0xbe,0x24,0x3, 0xe8,0x68,0x3, 0x30,0x3, 0xef,0xc2,0x3, 0x53,0xdb,0xfe,0x53,0xdb, +0xfd,0xc2,0xeb,0x22,0x75,0xca,0x0, 0xa, 0x5b,0x3e,0x54,0xb, 0x54,0xf5,0xca,0x22, +0xca,0x3b,0x7d,0x2, 0xb, 0x38,0x60,0x7d,0xf6,0x5e,0xf4,0xff,0x0, 0xb, 0x8, 0x70, +0x7d,0x17,0x5e,0x14,0xff,0x0, 0x6e,0xd0,0xea,0x7c,0xef,0x6e,0xe0,0xea,0x7c,0x5d, +0x1e,0x50,0x1e,0x50,0x7c,0xf5,0x5e,0xf0,0x3, 0x7a,0xf1,0x2b,0x7c,0x8e,0x1e,0x80, +0x1e,0x80,0x7c,0xa8,0x5e,0xa0,0x3, 0x7c,0x9d,0x5e,0x90,0x3, 0x7c,0x4e,0x5e,0x40, +0x3, 0x5e,0x50,0x3c,0x5e,0x80,0x3c,0x4c,0x59,0x4c,0x84,0xac,0xfa,0xa, 0xea,0x2d, +0xe7,0x2e,0xe4,0x0, 0xd, 0x7d,0x7e,0x7c,0x4f,0xac,0xf4,0x7c,0x4f,0x7c,0xb4,0x54, +0x1, 0xa, 0xdb,0x3e,0xd4,0xb, 0xd4,0x7c,0xb4,0x1e,0xb0,0x1e,0xb0,0x54,0x1, 0xa, +0xeb,0x2d,0xed,0x7d,0x7e,0x7c,0x4f,0xa5,0xbc,0x3, 0x3, 0x7e,0x40,0x2, 0x7e,0xd4, +0x0, 0x1, 0x7c,0xb4,0x7d,0x7d,0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x1b,0x74,0xa, +0xc4,0x7e,0xe4,0x0, 0x6, 0x9d,0xec,0x7d,0x6e,0x7c,0xed,0x7c,0x9f,0x5c,0x98,0x7c, +0xbe,0x60,0x5, 0x3e,0x90,0x14,0x78,0xfb,0x7c,0xbe,0x7d,0x7d,0x60,0x5, 0x3e,0x74, +0x14,0x78,0xfb,0x1b,0x74,0x5c,0xf5,0x7c,0xb4,0x60,0x5, 0x3e,0xf0,0x14,0x78,0xfb, +0x7a,0xf1,0x2c,0x7c,0xb4,0x60,0x5, 0x1e,0x80,0x14,0x78,0xfb,0x7c,0x48,0x7d,0x7e, +0x7c,0xbf,0x60,0x5, 0x1e,0x50,0x14,0x78,0xfb,0x7c,0xb4,0x4c,0xb9,0xa, 0xeb,0x3e, +0xe4,0x3e,0xe4,0xe5,0x2b,0xa, 0x4b,0x4d,0x4e,0x4d,0x4f,0x1b,0x8, 0x40,0x7c,0xb5, +0x45,0x2c,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, 0xa, 0x2a,0x4d,0x20,0x4d,0x21,0x1b,0x38, +0x20,0xda,0x3b,0x22,0x7a,0xb3,0x2, 0xc, 0x7a,0xb3,0x2, 0xd, 0x7a,0xb3,0x2, 0xda, +0x7a,0xb3,0x2, 0xdb,0x74,0x1, 0x7a,0xb3,0x2, 0xdc,0xe4,0x7a,0xb3,0x2, 0x11,0x7a, +0xb3,0x2, 0x12,0x22,0xe4,0x7a,0xb3,0xb, 0x3, 0x74,0x1, 0x7a,0xb3,0xb, 0x4, 0x7e, +0x73,0x4, 0x4f,0x7a,0x73,0xb, 0x5, 0x22,0x74,0x22,0x7a,0xb3,0x4, 0x4f,0xe4,0x7a, +0xb3,0x4, 0x52,0x74,0x2, 0x7a,0xb3,0x4, 0x53,0x74,0x1, 0x22,0x7e,0xd1,0x27,0x74, +0x8, 0xac,0xdb,0x2e,0x64,0x0, 0xa5,0x22,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x1, 0xcc, +0x22,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfd,0xf, 0x75,0xfe,0xf, 0x22,0x7e, +0x34,0x8, 0xaf,0x7a,0x37,0xe, 0xf, 0x22,0x7e,0x34,0x4, 0x55,0x7a,0x37,0xa, 0xc8, +0x22,0x7e,0x34,0x4, 0x55,0x7e,0x24,0x1, 0xf8,0xe4,0x2, 0x0, 0x46,0x7a,0xb3,0xb, +0x3, 0xe4,0x7a,0xb3,0xb, 0x4, 0x22,0x7a,0xb3,0xe, 0x7b,0x7a,0xb3,0xe, 0x7a,0x22, +0x7e,0x37,0x1, 0xcc,0xbe,0x34,0x0, 0x1, 0x22,0x7e,0x37,0x1, 0xcc,0xbe,0x34,0x0, +0x4, 0x22,0x7e,0x73,0xc, 0xa6,0x7a,0x73,0x4, 0x53,0x22,0x7e,0x34,0x3, 0xe8,0x7a, +0x37,0x4, 0x50,0x22,0x74,0x2, 0x7a,0xb3,0x2, 0xa, 0xe4,0x22,0x5c,0xbc,0xa3,0x43, +0xed,0x12,0x23,0x79, \ No newline at end of file diff --git a/drivers/input/touchscreen/focaltech/Makefile b/drivers/input/touchscreen/focaltech/Makefile new file mode 100644 index 00000000..0b53d161 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/Makefile @@ -0,0 +1,11 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. +obj-$(CONFIG_TOUCHSCREEN_FOCALTECH) += focaltech_ts.o +#focaltech_ts-objs += focaltech.o focaltech_ctl.o focaltech_ex_fun.o +focaltech_ts-objs := focaltech.o +focaltech_ts-objs += focaltech_ctl.o +focaltech_ts-objs += focaltech_ex_fun.o +#focaltech_ts-y += focaltech.o focaltech_ctl.o focaltech_ex_fun.o diff --git a/drivers/input/touchscreen/focaltech/focaltech.c b/drivers/input/touchscreen/focaltech/focaltech.c new file mode 100644 index 00000000..c7fe683d --- /dev/null +++ b/drivers/input/touchscreen/focaltech/focaltech.c @@ -0,0 +1,1053 @@ +/* + * drivers/input/touchscreen/ft5x0x_ts.c + * + * FocalTech ft5x0x TouchScreen driver. + * + * Copyright (c) 2010 Focal tech Ltd. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * VERSION DATE AUTHOR + * 1.0 2010-01-05 WenFS + * + * note: only support mulititouch Wenfs 2010-10-01 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#if(defined(CONFIG_I2C_SPRD) ||defined(CONFIG_I2C_SPRD_V1)) +#include +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +//#define FT53X6_DBG +#ifdef FT53X6_DBG +#define ENTER printk(KERN_INFO "[FT53X6_DBG] func: %s line: %04d\n", __func__, __LINE__); +#define PRINT_DBG(x...) printk(KERN_INFO "[FT53X6_DBG] " x) +#define PRINT_INFO(x...) printk(KERN_INFO "[FT53X6_INFO] " x) +#define PRINT_WARN(x...) printk(KERN_INFO "[FT53X6_WARN] " x) +#define PRINT_ERR(format,x...) printk(KERN_ERR "[FT53X6_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x) +#else +#define ENTER +#define PRINT_DBG(x...) +#define PRINT_INFO(x...) printk(KERN_INFO "[FT53X6_INFO] " x) +#define PRINT_WARN(x...) printk(KERN_INFO "[FT53X6_WARN] " x) +#define PRINT_ERR(format,x...) printk(KERN_ERR "[FT53X6_ERR] func: %s line: %04d info: " format, __func__, __LINE__, ## x) +#endif + +#define APK_DEBUG +#define SPRD_AUTO_UPGRADE +#define SYSFS_DEBUG +#define FTS_CTL_IIC +#include +#include +#include + +#define USE_WAIT_QUEUE 1 +#define USE_THREADED_IRQ 0 +#define USE_WORK_QUEUE 0 + +#define TOUCH_VIRTUAL_KEYS +#define MULTI_PROTOCOL_TYPE_B 1 +#ifdef CONFIG_ARCH_SCX35LT8 +#define TS_MAX_FINGER 2 +#else +#define TS_MAX_FINGER 5 +#endif +#define FTS_PACKET_LENGTH 128 + +#if USE_WAIT_QUEUE +static struct task_struct *thread = NULL; +static DECLARE_WAIT_QUEUE_HEAD(waiter); +static int tpd_flag = 0; +#endif + +#if 0 +static unsigned char FT5316_FW[]= +{ +#include "ft5316_720p.i" +}; + +static unsigned char FT5306_FW[]= +{ +#include "ft5306_qHD.i" +}; + +static unsigned char *CTPM_FW = FT5306_FW; +#endif +//static int fw_size; + +static struct ft5x0x_ts_data *g_ft5x0x_ts; +static struct i2c_client *this_client; + +//static unsigned char suspend_flag = 0; + + + struct Upgrade_Info fts_updateinfo[] = +{ + {0x55,"FT5x06",TPD_MAX_POINTS_5,AUTO_CLB_NEED,50, 30, 0x79, 0x03, 1, 2000}, + {0x08,"FT5606",TPD_MAX_POINTS_5,AUTO_CLB_NEED,50, 30, 0x79, 0x06, 100, 2000}, + {0x0a,"FT5x16",TPD_MAX_POINTS_5,AUTO_CLB_NEED,50, 30, 0x79, 0x07, 1, 1500}, + {0x05,"FT6208",TPD_MAX_POINTS_2,AUTO_CLB_NONEED,60, 30, 0x79, 0x05, 10, 2000}, + {0x06,"FT6x06",TPD_MAX_POINTS_2,AUTO_CLB_NONEED,100, 30, 0x79, 0x08, 10, 2000}, + {0x55,"FT5x06i",TPD_MAX_POINTS_5,AUTO_CLB_NEED,50, 30, 0x79, 0x03, 1, 2000}, + {0x14,"FT5336",TPD_MAX_POINTS_5,AUTO_CLB_NEED,30, 30, 0x79, 0x11, 10, 2000}, + {0x13,"FT3316",TPD_MAX_POINTS_5,AUTO_CLB_NEED,30, 30, 0x79, 0x11, 10, 2000}, + {0x12,"FT5436i",TPD_MAX_POINTS_5,AUTO_CLB_NEED,30, 30, 0x79, 0x11, 10, 2000}, + {0x11,"FT5336i",TPD_MAX_POINTS_5,AUTO_CLB_NEED,30, 30, 0x79, 0x11, 10, 2000}, +}; + +struct Upgrade_Info fts_updateinfo_curr; +#if 0//dennis +/* Attribute */ +static ssize_t ft5x0x_show_suspend(struct device* cd,struct device_attribute *attr, char* buf); +static ssize_t ft5x0x_store_suspend(struct device* cd, struct device_attribute *attr,const char* buf, size_t len); +static ssize_t ft5x0x_show_version(struct device* cd,struct device_attribute *attr, char* buf); +static ssize_t ft5x0x_update(struct device* cd, struct device_attribute *attr, const char* buf, size_t len); +#endif +//static unsigned char ft5x0x_read_fw_ver(void); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ft5x0x_ts_suspend(struct early_suspend *handler); +static void ft5x0x_ts_resume(struct early_suspend *handler); +#endif +//static int fts_ctpm_fw_update(void); +//static int fts_ctpm_fw_upgrade_with_i_file(void); + +struct ts_event { + u16 x1; + u16 y1; + u16 x2; + u16 y2; + u16 x3; + u16 y3; + u16 x4; + u16 y4; + u16 x5; + u16 y5; + u16 pressure; + u8 touch_point; +}; + +struct ft5x0x_ts_data { + struct input_dev *input_dev; + struct i2c_client *client; + struct ts_event event; +#if USE_WORK_QUEUE + struct work_struct pen_event_work; + struct workqueue_struct *ts_workqueue; +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND + struct work_struct resume_work; + struct workqueue_struct *ts_resume_workqueue; + struct early_suspend early_suspend; +#endif + struct ft5x0x_ts_platform_data *platform_data; +}; + +#if 0//dennis +static DEVICE_ATTR(suspend, S_IRUGO | S_IWUSR, ft5x0x_show_suspend, ft5x0x_store_suspend); +static DEVICE_ATTR(update, S_IRUGO | S_IWUSR, ft5x0x_show_version, ft5x0x_update); + +static ssize_t ft5x0x_show_suspend(struct device* cd, + struct device_attribute *attr, char* buf) +{ + ssize_t ret = 0; + + if(suspend_flag==1) + sprintf(buf, "FT5x0x Suspend\n"); + else + sprintf(buf, "FT5x0x Resume\n"); + + ret = strlen(buf) + 1; + + return ret; +} + +static ssize_t ft5x0x_store_suspend(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + suspend_flag = on_off; + + if(on_off==1) + { + pr_info("FT5x0x Entry Suspend\n"); + #ifdef CONFIG_HAS_EARLYSUSPEND + ft5x0x_ts_suspend(NULL); + #endif + } + else + { + pr_info("FT5x0x Entry Resume\n"); + #ifdef CONFIG_HAS_EARLYSUSPEND + ft5x0x_ts_resume(NULL); + #endif + } + + return len; +} + +static ssize_t ft5x0x_show_version(struct device* cd, + struct device_attribute *attr, char* buf) +{ + ssize_t ret = 0; + unsigned char uc_reg_value; + + uc_reg_value = ft5x0x_read_fw_ver(); + + sprintf(buf, "ft5x0x firmware id is V%x\n", uc_reg_value); + + ret = strlen(buf) + 1; + + return ret; +} + +static ssize_t ft5x0x_update(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + unsigned char uc_reg_value; + + uc_reg_value = ft5x0x_read_fw_ver(); + + if(on_off==1) + { + pr_info("ft5x0x update, current firmware id is V%x\n", uc_reg_value); + //fts_ctpm_fw_update(); + fts_ctpm_fw_upgrade_with_i_file(); + } + + return len; +} + +static int ft5x0x_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + err = device_create_file(dev, &dev_attr_suspend); + err = device_create_file(dev, &dev_attr_update); + + return err; +} +#endif + +static int ft5x0x_i2c_rxdata(char *rxdata, int length) +{ + int ret = 0; + + struct i2c_msg msgs[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = 1, + .buf = rxdata, + }, + { + .addr = this_client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = rxdata, + }, + }; + + if (i2c_transfer(this_client->adapter, msgs, 2) != 2) { + ret = -EIO; + pr_err("msg %s i2c read error: %d\n", __func__, ret); + } + + return ret; +} + +static int ft5x0x_i2c_txdata(char *txdata, int length) +{ + int ret = 0; + + struct i2c_msg msg[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = length, + .buf = txdata, + }, + }; + + if (i2c_transfer(this_client->adapter, msg, 1) != 1) { + ret = -EIO; + pr_err("%s i2c write error: %d\n", __func__, ret); + } + + return ret; +} + +/*********************************************************************************************** +Name : ft5x0x_write_reg + +Input : addr -- address + para -- parameter + +Output : + +function : write register of ft5x0x + +***********************************************************************************************/ +static int ft5x0x_write_reg(u8 addr, u8 para) +{ + u8 buf[3]; + int ret = -1; + + buf[0] = addr; + buf[1] = para; + ret = ft5x0x_i2c_txdata(buf, 2); + if (ret < 0) { + pr_err("write reg failed! %#x ret: %d", buf[0], ret); + return -1; + } + + return 0; +} + +/*********************************************************************************************** +Name : ft5x0x_read_reg + +Input : addr + pdata + +Output : + +function : read register of ft5x0x + +***********************************************************************************************/ +static int ft5x0x_read_reg(u8 addr, u8 *pdata) +{ + int ret = 0; + u8 buf[2] = {addr, 0}; + + struct i2c_msg msgs[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = 1, + .buf = buf, + }, + { + .addr = this_client->addr, + .flags = I2C_M_RD, + .len = 1, + .buf = buf+1, + }, + }; + + if (i2c_transfer(this_client->adapter, msgs, 2) != 2) { + ret = -EIO; + pr_err("msg %s i2c read error: %d\n", __func__, ret); + } + + *pdata = buf[1]; + return ret; +} + + +#ifdef TOUCH_VIRTUAL_KEYS + +static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client); + struct ft5x0x_ts_platform_data *pdata = data->platform_data; + return sprintf(buf,"%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d\n" + ,__stringify(EV_KEY), __stringify(KEY_APPSELECT),pdata ->virtualkeys[0],pdata ->virtualkeys[1],pdata ->virtualkeys[2],pdata ->virtualkeys[3] + ,__stringify(EV_KEY), __stringify(KEY_HOMEPAGE),pdata ->virtualkeys[4],pdata ->virtualkeys[5],pdata ->virtualkeys[6],pdata ->virtualkeys[7] + ,__stringify(EV_KEY), __stringify(KEY_BACK),pdata ->virtualkeys[8],pdata ->virtualkeys[9],pdata ->virtualkeys[10],pdata ->virtualkeys[11]); +} + +static struct kobj_attribute virtual_keys_attr = { + .attr = { + .name = "virtualkeys.focaltech_ts", + .mode = S_IRUGO, + }, + .show = &virtual_keys_show, +}; + +static struct attribute *properties_attrs[] = { + &virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group properties_attr_group = { + .attrs = properties_attrs, +}; + +static void ft5x0x_ts_virtual_keys_init(void) +{ + int ret = 0; + struct kobject *properties_kobj; + + pr_info("[FST] %s\n",__func__); + + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &properties_attr_group); + if (!properties_kobj || ret) + pr_err("failed to create board_properties\n"); +} + +#endif + +/*********************************************************************************************** +Name : ft5x0x_read_fw_ver + +Input : void + +Output : firmware version + +function : read TP firmware version + +***********************************************************************************************/ +/*static unsigned char ft5x0x_read_fw_ver(void) +{ + unsigned char ver; + ft5x0x_read_reg(FT5X0X_REG_FIRMID, &ver); + return(ver); +} +*/ + + +static void ft5x0x_clear_report_data(struct ft5x0x_ts_data *ft5x0x_ts) +{ + int i; + + for(i = 0; i < TS_MAX_FINGER; i++) { + #if MULTI_PROTOCOL_TYPE_B + input_mt_slot(ft5x0x_ts->input_dev, i); + input_mt_report_slot_state(ft5x0x_ts->input_dev, MT_TOOL_FINGER, false); + #endif + } + input_report_key(ft5x0x_ts->input_dev, BTN_TOUCH, 0); + #if !MULTI_PROTOCOL_TYPE_B + input_mt_sync(ft5x0x_ts->input_dev); + #endif + input_sync(ft5x0x_ts->input_dev); +} + +static int ft5x0x_update_data(void) +{ + struct ft5x0x_ts_data *data = i2c_get_clientdata(this_client); + struct ts_event *event = &data->event; + u8 buf[33] = {0}; + int ret = -1; + int i; + u16 x , y; + u8 ft_pressure , ft_size; + + ret = ft5x0x_i2c_rxdata(buf, 33); + + if (ret < 0) { + pr_err("%s read_data i2c_rxdata failed: %d\n", __func__, ret); + return ret; + } + + memset(event, 0, sizeof(struct ts_event)); + event->touch_point = buf[2] & 0x07; + + for(i = 0; i < TS_MAX_FINGER; i++) { + if((buf[6*i+3] & 0xc0) == 0xc0) + continue; + x = (s16)(buf[6*i+3] & 0x0F)<<8 | (s16)buf[6*i+4]; + y = (s16)(buf[6*i+5] & 0x0F)<<8 | (s16)buf[6*i+6]; + ft_pressure = buf[6*i+7]; + if(ft_pressure > 127) + ft_pressure = 127; + ft_size = (buf[6*i+8]>>4) & 0x0F; + if((buf[6*i+3] & 0x40) == 0x0) { + #if MULTI_PROTOCOL_TYPE_B + input_mt_slot(data->input_dev, buf[6*i+5]>>4); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true); + #endif + input_report_abs(data->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, y); + input_report_key(data->input_dev, BTN_TOUCH, 1); + #if !MULTI_PROTOCOL_TYPE_B + input_mt_sync(data->input_dev); + #endif + pr_debug("===x%d = %d,y%d = %d ====",i, x, i, y); + } + else { + #if MULTI_PROTOCOL_TYPE_B + input_mt_slot(data->input_dev, buf[6*i+5]>>4); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); + #endif + } + } + if(0 == event->touch_point) { + for(i = 0; i < TS_MAX_FINGER; i ++) { + #if MULTI_PROTOCOL_TYPE_B + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); + #endif + } + input_report_key(data->input_dev, BTN_TOUCH, 0); + #if !MULTI_PROTOCOL_TYPE_B + input_mt_sync(data->input_dev); + #endif + + } + input_sync(data->input_dev); + + return 0; +} + +#if USE_WAIT_QUEUE +static int touch_event_handler(void *unused) +{ + struct sched_param param = { .sched_priority = 5 }; + sched_setscheduler(current, SCHED_RR, ¶m); + + do { + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(waiter, (0 != tpd_flag)); + tpd_flag = 0; + set_current_state(TASK_RUNNING); + ft5x0x_update_data(); + + } while (!kthread_should_stop()); + + return 0; +} +#endif + +#if USE_WORK_QUEUE +static void ft5x0x_ts_pen_irq_work(struct work_struct *work) +{ + ft5x0x_update_data(); + enable_irq(this_client->irq); +} +#endif + +static irqreturn_t ft5x0x_ts_interrupt(int irq, void *dev_id) +{ +#if USE_WAIT_QUEUE + tpd_flag = 1; + wake_up_interruptible(&waiter); + return IRQ_HANDLED; +#endif + +#if USE_WORK_QUEUE + struct ft5x0x_ts_data *ft5x0x_ts = (struct ft5x0x_ts_data *)dev_id; + + if (!work_pending(&ft5x0x_ts->pen_event_work)) { + queue_work(ft5x0x_ts->ts_workqueue, &ft5x0x_ts->pen_event_work); + } + return IRQ_HANDLED; +#endif + +#if USE_THREADED_IRQ + ft5x0x_update_data(); + return IRQ_HANDLED; +#endif + +} + +static void ft5x0x_ts_reset(void) +{ + struct ft5x0x_ts_platform_data *pdata = g_ft5x0x_ts->platform_data; + + gpio_direction_output(pdata->reset_gpio_number, 1); + msleep(1); + gpio_set_value(pdata->reset_gpio_number, 0); + msleep(10); + gpio_set_value(pdata->reset_gpio_number, 1); + msleep(200); +} + +#if 0 +//for future use + +struct regulator *vdd28 = NULL; + +static void ft53x6_power_off(void) +{ + if(vdd28 != NULL) + regulator_force_disable(vdd28); + PRINT_INFO("power off\n"); +} + +static void ft53x6_power_on(void) +{ + int err = 0; + + if(vdd28 == NULL) { + vdd28 = regulator_get(NULL, "vdd28"); + if (IS_ERR(vdd28)) { + PRINT_ERR("regulator_get failed\n"); + return; + } + err = regulator_set_voltage(vdd28,2800000,2800000); + if (err) + PRINT_ERR("regulator_set_voltage failed\n"); + } + regulator_enable(vdd28); + + PRINT_INFO("power on\n"); +} +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ft5x0x_ts_suspend(struct early_suspend *handler) +{ + int ret = -1; + pr_info("==%s==\n", __FUNCTION__); + ret = ft5x0x_write_reg(FT5X0X_REG_PMODE, PMODE_HIBERNATE); + if(ret){ + PRINT_ERR("==ft5x0x_ts_suspend== ft5x0x_write_reg fail\n"); + } + disable_irq(this_client->irq); + ft5x0x_clear_report_data(g_ft5x0x_ts); + //gpio_set_value(g_ft5x0x_ts->platform_data->reset_gpio_number, 0);//for future use +} + +static void ft5x0x_ts_resume(struct early_suspend *handler) +{ + struct ft5x0x_ts_data *ft5x0x_ts = (struct ft5x0x_ts_data *)i2c_get_clientdata(this_client); + queue_work(ft5x0x_ts->ts_resume_workqueue, &ft5x0x_ts->resume_work); +} + +static void ft5x0x_ts_resume_work(struct work_struct *work) +{ + pr_info("==%s==\n", __FUNCTION__); + ft5x0x_ts_reset(); + //ft5x0x_write_reg(FT5X0X_REG_PERIODACTIVE, 7); + enable_irq(this_client->irq); + msleep(2); + ft5x0x_clear_report_data(g_ft5x0x_ts); +} +#endif + +static void ft5x0x_ts_hw_init(struct ft5x0x_ts_data *ft5x0x_ts) +{ + struct regulator *reg_vdd; + struct i2c_client *client = ft5x0x_ts->client; + struct ft5x0x_ts_platform_data *pdata = ft5x0x_ts->platform_data; + + pr_info("[FST] %s [irq=%d];[rst=%d]\n",__func__, + pdata->irq_gpio_number,pdata->reset_gpio_number); + gpio_request(pdata->irq_gpio_number, "ts_irq_pin"); + gpio_request(pdata->reset_gpio_number, "ts_rst_pin"); + gpio_direction_output(pdata->reset_gpio_number, 1); + gpio_direction_input(pdata->irq_gpio_number); + + reg_vdd = regulator_get(&client->dev, pdata->vdd_name); + if (!WARN(IS_ERR(reg_vdd), "[FST] ft5x0x_ts_hw_init regulator: failed to get %s.\n", pdata->vdd_name)) { + if(!strcmp(pdata->vdd_name,"vdd18")) + regulator_set_voltage(reg_vdd,1800000,1800000); + if(!strcmp(pdata->vdd_name,"vdd28")) + regulator_set_voltage(reg_vdd, 2800000, 2800000); + regulator_enable(reg_vdd); + } + msleep(100); + ft5x0x_ts_reset(); +} + +void focaltech_get_upgrade_array(struct i2c_client *client) +{ + + u8 chip_id; + u32 i; + + i2c_smbus_read_i2c_block_data(client,FT_REG_CHIP_ID,1,&chip_id); + + printk("%s chip_id = %x\n", __func__, chip_id); + + for(i=0;i= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) + { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[0], sizeof(struct Upgrade_Info)); + } +} + +#ifdef CONFIG_OF +static struct ft5x0x_ts_platform_data *ft5x0x_ts_parse_dt(struct device *dev) +{ + struct ft5x0x_ts_platform_data *pdata; + struct device_node *np = dev->of_node; + int ret,i = 0; + u32 data[12] = {0}; + u32 tmp_val_u32; + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct ft5x0x_ts_platform_data"); + return NULL; + } + pdata->reset_gpio_number = of_get_gpio(np, 0); + if(pdata->reset_gpio_number < 0){ + dev_err(dev, "fail to get reset_gpio_number\n"); + goto fail; + } + pdata->irq_gpio_number = of_get_gpio(np, 1); + if(pdata->irq_gpio_number < 0){ + dev_err(dev, "fail to get irq_gpio_number\n"); + goto fail; + } + ret = of_property_read_string(np, "vdd_name", &pdata->vdd_name); + if(ret){ + dev_err(dev, "fail to get vdd_name\n"); + goto fail; + } + ret = of_property_read_u32_array(np, "virtualkeys", data,12); + if(ret){ + dev_err(dev, "fail to get virtualkeys\n"); + goto fail; + } + for(i = 0; i < 12; i ++){ + pdata->virtualkeys[i] = data[i]; + } + ret = of_property_read_u32(np, "TP_MAX_X", &tmp_val_u32); + if(ret){ + dev_err(dev, "fail to get TP_MAX_X\n"); + goto fail; + } + pdata->TP_MAX_X = tmp_val_u32; + ret = of_property_read_u32(np, "TP_MAX_Y", &tmp_val_u32); + if(ret){ + dev_err(dev, "fail to get TP_MAX_Y\n"); + goto fail; + } + pdata->TP_MAX_Y = tmp_val_u32; + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif + + +static int ft5x0x_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct ft5x0x_ts_data *ft5x0x_ts; + struct input_dev *input_dev; + struct ft5x0x_ts_platform_data *pdata = client->dev.platform_data; + int err = 0; + unsigned char uc_reg_value; + //u8 chip_id,i; + + pr_info("[FST] %s: probe\n",__func__); +#ifdef CONFIG_OF + if (client->dev.of_node && !pdata){ + pdata = ft5x0x_ts_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } + else{ + err = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } +#endif + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + err = -ENODEV; + goto exit_check_functionality_failed; + } + + ft5x0x_ts = kzalloc(sizeof(*ft5x0x_ts), GFP_KERNEL); + if (!ft5x0x_ts) { + err = -ENOMEM; + goto exit_alloc_data_failed; + } + + g_ft5x0x_ts = ft5x0x_ts; + ft5x0x_ts->platform_data = pdata; + this_client = client; + ft5x0x_ts->client = client; + ft5x0x_ts_hw_init(ft5x0x_ts); + i2c_set_clientdata(client, ft5x0x_ts); + client->irq = gpio_to_irq(pdata->irq_gpio_number); + + #if(defined(CONFIG_I2C_SPRD) || defined(CONFIG_I2C_SPRD_V1)) + sprd_i2c_ctl_chg_clk(client->adapter->nr, 400000); + #endif + + err = ft5x0x_read_reg(FT5X0X_REG_CIPHER, &uc_reg_value); + if (err < 0) + { + pr_err("[FST] read chip id error %x\n", uc_reg_value); + err = -ENODEV; + goto exit_chip_check_failed; + } + + /* set report rate, about 70HZ */ + //ft5x0x_write_reg(FT5X0X_REG_PERIODACTIVE, 7); +#if USE_WORK_QUEUE + INIT_WORK(&ft5x0x_ts->pen_event_work, ft5x0x_ts_pen_irq_work); + + ft5x0x_ts->ts_workqueue = create_singlethread_workqueue("focal-work-queue"); + if (!ft5x0x_ts->ts_workqueue) { + err = -ESRCH; + goto exit_create_singlethread; + } +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + INIT_WORK(&ft5x0x_ts->resume_work, ft5x0x_ts_resume_work); + ft5x0x_ts->ts_resume_workqueue = create_singlethread_workqueue("ft5x0x_ts_resume_work"); + if (!ft5x0x_ts->ts_resume_workqueue) { + err = -ESRCH; + goto exit_create_singlethread; + } +#endif + input_dev = input_allocate_device(); + if (!input_dev) { + err = -ENOMEM; + dev_err(&client->dev, "[FST] failed to allocate input device\n"); + goto exit_input_dev_alloc_failed; + } +#ifdef TOUCH_VIRTUAL_KEYS + ft5x0x_ts_virtual_keys_init(); +#endif + ft5x0x_ts->input_dev = input_dev; + + __set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit); + __set_bit(ABS_MT_POSITION_X, input_dev->absbit); + __set_bit(ABS_MT_POSITION_Y, input_dev->absbit); + __set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit); + __set_bit(KEY_MENU, input_dev->keybit); + __set_bit(KEY_BACK, input_dev->keybit); + __set_bit(KEY_HOMEPAGE, input_dev->keybit); + __set_bit(BTN_TOUCH, input_dev->keybit); + +#if MULTI_PROTOCOL_TYPE_B + input_mt_init_slots(input_dev, TS_MAX_FINGER,0); +#endif + input_set_abs_params(input_dev,ABS_MT_POSITION_X, 0, pdata->TP_MAX_X, 0, 0); + input_set_abs_params(input_dev,ABS_MT_POSITION_Y, 0, pdata->TP_MAX_Y, 0, 0); + input_set_abs_params(input_dev,ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(input_dev,ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + #if 0 + /*ft5306's firmware is qhd, ft5316's firmware is 720p*/ + if (uc_reg_value == 0x0a || uc_reg_value == 0x0) { + input_set_abs_params(input_dev, + ABS_MT_POSITION_X, 0, 720, 0, 0); + input_set_abs_params(input_dev, + ABS_MT_POSITION_Y, 0, 1280, 0, 0); + } else { + input_set_abs_params(input_dev, + ABS_MT_POSITION_X, 0, 540, 0, 0); + input_set_abs_params(input_dev, + ABS_MT_POSITION_Y, 0, 960, 0, 0); + } + input_set_abs_params(input_dev, + ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(input_dev, + ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + + #endif + + set_bit(EV_ABS, input_dev->evbit); + set_bit(EV_KEY, input_dev->evbit); + + input_dev->name = FOCALTECH_TS_NAME; + err = input_register_device(input_dev); + if (err) { + dev_err(&client->dev, + "[FST] ft5x0x_ts_probe: failed to register input device: %s\n", + dev_name(&client->dev)); + goto exit_input_register_device_failed; + } + +#if USE_THREADED_IRQ + err = request_threaded_irq(client->irq, NULL, ft5x0x_ts_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, client->name, ft5x0x_ts); +#else + err = request_irq(client->irq, ft5x0x_ts_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, client->name, ft5x0x_ts); +#endif + if (err < 0) { + dev_err(&client->dev, "[FST] ft5x0x_probe: request irq failed %d\n",err); + goto exit_irq_request_failed; + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + ft5x0x_ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ft5x0x_ts->early_suspend.suspend = ft5x0x_ts_suspend; + ft5x0x_ts->early_suspend.resume = ft5x0x_ts_resume; + register_early_suspend(&ft5x0x_ts->early_suspend); +#endif + +focaltech_get_upgrade_array(client); + +#ifdef SYSFS_DEBUG +fts_create_sysfs(client); +#endif + +#ifdef FTS_CTL_IIC +if (ft_rw_iic_drv_init(client) < 0) +{ + dev_err(&client->dev, "%s:[FTS] create fts control iic driver failed\n", __func__); +} +#endif + +#ifdef SPRD_AUTO_UPGRADE + printk("********************Enter CTP Auto Upgrade********************\n"); + fts_ctpm_auto_upgrade(client); +#endif + +#ifdef APK_DEBUG + ft5x0x_create_apk_debug_channel(client); +#endif + +#if USE_WAIT_QUEUE + thread = kthread_run(touch_event_handler, 0, "focal-wait-queue"); + if (IS_ERR(thread)) + { + err = PTR_ERR(thread); + PRINT_ERR("failed to create kernel thread: %d\n", err); + } +#endif + + return 0; + +exit_irq_request_failed: + input_unregister_device(input_dev); +exit_input_register_device_failed: + input_free_device(input_dev); +exit_input_dev_alloc_failed: +exit_create_singlethread: +exit_chip_check_failed: + gpio_free(pdata->irq_gpio_number); + gpio_free(pdata->reset_gpio_number); + kfree(ft5x0x_ts); +exit_alloc_data_failed: +exit_check_functionality_failed: + ft5x0x_ts = NULL; + i2c_set_clientdata(client, ft5x0x_ts); +exit_alloc_platform_data_failed: + return err; +} + +static int ft5x0x_ts_remove(struct i2c_client *client) +{ + struct ft5x0x_ts_data *ft5x0x_ts = i2c_get_clientdata(client); + + pr_info("==ft5x0x_ts_remove=\n"); + + #ifdef SYSFS_DEBUG + fts_release_sysfs(client); + #endif + #ifdef FTS_CTL_IIC + ft_rw_iic_drv_exit(); + #endif + #ifdef APK_DEBUG + ft5x0x_release_apk_debug_channel(); + #endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&ft5x0x_ts->early_suspend); +#endif + free_irq(client->irq, ft5x0x_ts); + input_unregister_device(ft5x0x_ts->input_dev); + input_free_device(ft5x0x_ts->input_dev); +#if USE_WORK_QUEUE + cancel_work_sync(&ft5x0x_ts->pen_event_work); + destroy_workqueue(ft5x0x_ts->ts_workqueue); +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND + cancel_work_sync(&ft5x0x_ts->resume_work); + destroy_workqueue(ft5x0x_ts->ts_resume_workqueue); +#endif + kfree(ft5x0x_ts); + ft5x0x_ts = NULL; + i2c_set_clientdata(client, ft5x0x_ts); + + return 0; +} + +static const struct i2c_device_id ft5x0x_ts_id[] = { + { FOCALTECH_TS_NAME, 0 },{ } +}; + +static int ft5x0x_suspend(struct i2c_client *client, pm_message_t mesg) +{ + PRINT_INFO("ft5x0x_suspend\n"); + return 0; +} +static int ft5x0x_resume(struct i2c_client *client) +{ + PRINT_INFO("ft5x0x_resume\n"); + return 0; +} + +MODULE_DEVICE_TABLE(i2c, ft5x0x_ts_id); + +static const struct of_device_id focaltech_of_match[] = { + { .compatible = "focaltech,focaltech_ts", }, + { } +}; +MODULE_DEVICE_TABLE(of, focaltech_of_match); +static struct i2c_driver ft5x0x_ts_driver = { + .probe = ft5x0x_ts_probe, + .remove = ft5x0x_ts_remove, + .id_table = ft5x0x_ts_id, + .driver = { + .name = FOCALTECH_TS_NAME, + .owner = THIS_MODULE, + .of_match_table = focaltech_of_match, + }, + .suspend = NULL, + .resume = NULL, +}; + +static int __init ft5x0x_ts_init(void) +{ + return i2c_add_driver(&ft5x0x_ts_driver); +} + +static void __exit ft5x0x_ts_exit(void) +{ + i2c_del_driver(&ft5x0x_ts_driver); +} + +module_init(ft5x0x_ts_init); +module_exit(ft5x0x_ts_exit); + +MODULE_AUTHOR(""); +MODULE_DESCRIPTION("FocalTech ft5x0x TouchScreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/focaltech/focaltech_ctl.c b/drivers/input/touchscreen/focaltech/focaltech_ctl.c new file mode 100644 index 00000000..c654da28 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/focaltech_ctl.c @@ -0,0 +1,334 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +static int ft_rw_iic_drv_major = FT_RW_IIC_DRV_MAJOR; +struct ft_rw_i2c_dev { + struct cdev cdev; + struct semaphore ft_rw_i2c_sem; + struct i2c_client *client; +}; +struct ft_rw_i2c_dev *ft_rw_i2c_dev_tt; +static struct class *fts_class; +#if 0 +int ft5x0x_i2c_Read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ +int ret; + +if (writelen > 0) { +struct i2c_msg msgs[] = { +{ + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, +{ + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, +}; +ret = i2c_transfer(client->adapter, msgs, 2); +if (ret < 0) +dev_err(&client->dev, "f%s: i2c read error.\n", +__func__); +} else { +struct i2c_msg msgs[] = { +{ + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, +}; +ret = i2c_transfer(client->adapter, msgs, 1); +if (ret < 0) +dev_err(&client->dev, "%s:i2c read error.\n", __func__); +} +return ret; +} + +/*write data by i2c*/ +int ft5x0x_i2c_Write(struct i2c_client *client, char *writebuf, int writelen) +{ +int ret; + +struct i2c_msg msg[] = { +{ + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, +}; + +ret = i2c_transfer(client->adapter, msg, 1); +if (ret < 0) +dev_err(&client->dev, "%s i2c write error.\n", __func__); + +return ret; +} +#endif + +static int ft_rw_iic_drv_myread(struct i2c_client *client, u8 *buf, int length) +{ + int ret = 0; + ret = fts_i2c_Read(client, NULL, 0, buf, length); + + if(ret<0) + dev_err(&client->dev, "%s:IIC Read failed\n", + __func__); + return ret; +} + +static int ft_rw_iic_drv_mywrite(struct i2c_client *client, u8 *buf, int length) +{ + int ret = 0; + ret = fts_i2c_Write(client, buf, length); + if(ret<0) + dev_err(&client->dev, "%s:IIC Write failed\n", + __func__); + return ret; +} + +static int ft_rw_iic_drv_RDWR(struct i2c_client *client, unsigned long arg) +{ + struct ft_rw_i2c_queue i2c_rw_queue; + u8 __user **data_ptrs; + struct ft_rw_i2c * i2c_rw_msg; + int ret = 0; + int i,j; + + if (!access_ok(VERIFY_READ, (struct ft_rw_i2c_queue *)arg, sizeof(struct ft_rw_i2c_queue))) + return -EFAULT; + + if (copy_from_user(&i2c_rw_queue, + (struct ft_rw_i2c_queue *)arg, + sizeof(struct ft_rw_i2c_queue))) + return -EFAULT; + + if (i2c_rw_queue.queuenum > FT_I2C_RDWR_MAX_QUEUE) + return -EINVAL; + + + i2c_rw_msg = (struct ft_rw_i2c*) + kmalloc(i2c_rw_queue.queuenum *sizeof(struct ft_rw_i2c), + GFP_KERNEL); + if (!i2c_rw_msg) + return -ENOMEM; + + if (copy_from_user(i2c_rw_msg, i2c_rw_queue.i2c_queue, + i2c_rw_queue.queuenum*sizeof(struct ft_rw_i2c))) { + kfree(i2c_rw_msg); + i2c_rw_msg = NULL; + return -EFAULT; + } + + data_ptrs = kmalloc(i2c_rw_queue.queuenum * sizeof(u8 __user *), GFP_KERNEL); + if (data_ptrs == NULL) { + kfree(i2c_rw_msg); + i2c_rw_msg = NULL; + return -ENOMEM; + } + + ret = 0; + for (i=0; i< i2c_rw_queue.queuenum; i++) { + if ((i2c_rw_msg[i].length > 8192)|| + (i2c_rw_msg[i].flag & I2C_M_RECV_LEN)) { + ret = -EINVAL; + break; + } + data_ptrs[i] = (u8 __user *)i2c_rw_msg[i].buf; + i2c_rw_msg[i].buf = kmalloc(i2c_rw_msg[i].length, GFP_KERNEL); + if (i2c_rw_msg[i].buf == NULL) { + ret = -ENOMEM; + break; + } + + if (copy_from_user(i2c_rw_msg[i].buf, data_ptrs[i], i2c_rw_msg[i].length)) { + ++i; + ret = -EFAULT; + break; + } + } + + if (ret < 0) { + for (j=0; j=0) + ret = copy_to_user(data_ptrs[i], i2c_rw_msg[i].buf, i2c_rw_msg[i].length); + } + else + ret = ft_rw_iic_drv_mywrite(client, + i2c_rw_msg[i].buf, i2c_rw_msg[i].length); + } + for (j=0; jprivate_data = ft_rw_i2c_dev_tt; + return 0; +} + +/* +*char device close function interface +*/ +static int ft_rw_iic_drv_release(struct inode *inode, struct file *filp) +{ + + return 0; +} + +static int ft_rw_iic_drv_ioctl(struct file *filp, unsigned + int cmd, unsigned long arg) +{ + int ret = 0; + struct ft_rw_i2c_dev *ftdev = filp->private_data; + ftdev = filp->private_data; + + //down(&ft_rw_i2c_dev_tt->ft_rw_i2c_sem); + switch (cmd) + { + case FT_I2C_RW: + ret = ft_rw_iic_drv_RDWR(ftdev->client, arg); + break; + default: + ret = -ENOTTY; + break; + } + //up(&ft_rw_i2c_dev_tt->ft_rw_i2c_sem); + return ret; +} + + +/* +*char device file operation which will be put to register the char device +*/ +static const struct file_operations ft_rw_iic_drv_fops = { + .owner = THIS_MODULE, + .open = ft_rw_iic_drv_open, + .release = ft_rw_iic_drv_release, + .unlocked_ioctl = ft_rw_iic_drv_ioctl, +}; + + +static void ft_rw_iic_drv_setup_cdev(struct ft_rw_i2c_dev *dev, int index) +{ + int err, devno = MKDEV(ft_rw_iic_drv_major, index); + + cdev_init(&dev->cdev, &ft_rw_iic_drv_fops); + dev->cdev.owner = THIS_MODULE; + dev->cdev.ops = &ft_rw_iic_drv_fops; + err = cdev_add(&dev->cdev, devno, 1); + if (err) + printk(KERN_NOTICE "Error %d adding LED%d", err, index); +} + +static int ft_rw_iic_drv_myinitdev(struct i2c_client *client) +{ + int err = 0; + dev_t devno = MKDEV(ft_rw_iic_drv_major, 0); + + if (ft_rw_iic_drv_major) + err = register_chrdev_region(devno, 1, FT_RW_IIC_DRV); + else { + err = alloc_chrdev_region(&devno, 0, 1, FT_RW_IIC_DRV); + ft_rw_iic_drv_major = MAJOR(devno); + } + if (err < 0) { + dev_err(&client->dev, "%s:ft_rw_iic_drv failed error code=%d---\n", + __func__, err); + return err; + } + + ft_rw_i2c_dev_tt = kmalloc(sizeof(struct ft_rw_i2c_dev), GFP_KERNEL); + if (!ft_rw_i2c_dev_tt){ + err = -ENOMEM; + unregister_chrdev_region(devno, 1); + dev_err(&client->dev, "%s:ft_rw_iic_drv failed\n", + __func__); + return err; + } + ft_rw_i2c_dev_tt->client = client; + //init_MUTEX(&ft_rw_i2c_dev_tt->ft_rw_i2c_sem); + ft_rw_iic_drv_setup_cdev(ft_rw_i2c_dev_tt, 0); + + fts_class = class_create(THIS_MODULE, "fts_class"); + if (IS_ERR(fts_class)) { + dev_err(&client->dev, "%s:failed in creating class.\n", + __func__); + return -1; + } + /*create device node*/ + device_create(fts_class, NULL, MKDEV(ft_rw_iic_drv_major, 0), + NULL, FT_RW_IIC_DRV); + + return 0; +} + +int ft_rw_iic_drv_init(struct i2c_client *client) +{ + dev_dbg(&client->dev, "[FTS]----ft_rw_iic_drv init ---\n"); + return ft_rw_iic_drv_myinitdev(client); +} + +void ft_rw_iic_drv_exit(void) +{ + device_destroy(fts_class, MKDEV(ft_rw_iic_drv_major, 0)); + /*delete class created by us*/ + class_destroy(fts_class); + /*delet the cdev*/ + cdev_del(&ft_rw_i2c_dev_tt->cdev); + kfree(ft_rw_i2c_dev_tt); + unregister_chrdev_region(MKDEV(ft_rw_iic_drv_major, 0), 1); +} + diff --git a/drivers/input/touchscreen/focaltech/focaltech_ex_fun.c b/drivers/input/touchscreen/focaltech/focaltech_ex_fun.c new file mode 100644 index 00000000..6ec67594 --- /dev/null +++ b/drivers/input/touchscreen/focaltech/focaltech_ex_fun.c @@ -0,0 +1,1321 @@ +/* + *drivers/input/touchscreen/ft5x06_ex_fun.c + * + *FocalTech IC driver expand function for debug. + * + *Copyright (c) 2010 Focal tech Ltd. + * + *This software is licensed under the terms of the GNU General Public + *License version 2, as published by the Free Software Foundation, and + *may be copied, distributed, and modified under those terms. + * + *This program is distributed in the hope that it will be useful, + *but WITHOUT ANY WARRANTY; without even the implied warranty of + *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + *GNU General Public License for more details. + * + *Note:the error code of EIO is the general error in this file. + */ + +//#include "tpd.h" +//#include "tpd_custom_fts.h" +#include +#include +//#include +#include +#include +#include +#include + +static struct mutex g_device_mutex; +extern void mt65xx_eint_unmask(unsigned int line); +extern void mt65xx_eint_mask(unsigned int line); + +u8 *I2CDMABuf_va = NULL; +volatile u32 I2CDMABuf_pa = NULL; + +extern struct Upgrade_Info fts_updateinfo_curr; + +int fts_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth); + +static unsigned char FT6306_FW[] = { +#include "FT6x06_4Column_Ver0x12_20150227_app.h" +}; + +static unsigned char FT5316_FW[] = { +#include "Ft5x16_720P_Ver0x23_test_app.h" +}; + +static unsigned char FT_FW_NULL[] = { +}; + +static unsigned char *CTPM_FW = FT_FW_NULL; +static u32 fw_size = 0; + +static DEFINE_MUTEX(g_device_mutex); + +/* +*fts_i2c_Read-read data and write data by i2c +*@client: handle of i2c +*@writebuf: Data that will be written to the slave +*@writelen: How many bytes to write +*@readbuf: Where to store data read from slave +*@readlen: How many bytes to read +* +*Returns negative errno, else the number of messages executed +* +* +*/ +int fts_i2c_Read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + +#if 1//for normal I2c transfer + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = 1, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 1, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } +#else// for DMA I2c transfer + if(writelen!=0) + { + //DMA Write + if(0)//if(writelen < 8 ) + { + + //MSE_ERR("Sensor non-dma write timing is %x!\r\n", this_client->timing); + ret= i2c_master_send(client, writebuf, writelen); + } + else + { + for(i = 0 ; i < writelen; i++) + { + I2CDMABuf_va[i] = writebuf[i]; + } + + client->addr = client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG; + + if((ret=i2c_master_send(client, (unsigned char *)I2CDMABuf_pa, writelen))!=writelen) + dev_err(&client->dev, "###%s i2c write len=%x,buffaddr=%x\n", __func__,ret,I2CDMABuf_pa); + //MSE_ERR("Sensor dma timing is %x!\r\n", this_client->timing); + //return ret; + client->addr = client->addr & I2C_MASK_FLAG &(~ I2C_DMA_FLAG); + + } + } + //DMA Read + if(readlen!=0) + { + if(0)//if (readlen <8) { + { + ret = i2c_master_recv(client, (unsigned char *)readbuf, readlen); + } + else + { + + client->addr = client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG; + ret = i2c_master_recv(client, (unsigned char *)I2CDMABuf_pa, readlen); + + for(i = 0; i < readlen; i++) + { + readbuf[i] = I2CDMABuf_va[i]; + } + client->addr = client->addr & I2C_MASK_FLAG &(~ I2C_DMA_FLAG); + + } + } + #endif + return ret; +} +/*write data by i2c*/ + +int fts_i2c_Write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret; + + //int i = 0; + + + //printk("fts_i2c_Write %d %x %x %x %x",writelen,writebuf,I2CDMABuf_va,I2CDMABuf_pa,client); + + // client->addr = client->addr & I2C_MASK_FLAG; + // client->ext_flag |= I2C_DIRECTION_FLAG; + // client->timing = 100; + #if 1 + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + dev_err(&client->dev, "%s i2c write error.\n", __func__); + #else + + if(0)//if(writelen < 8) + { + + //MSE_ERR("Sensor non-dma write timing is %x!\r\n", this_client->timing); + ret = i2c_master_send(client, writebuf, writelen); + } + else + { + for(i = 0 ; i < writelen; i++) + { + I2CDMABuf_va[i] = writebuf[i]; + } + + client->addr = client->addr & I2C_MASK_FLAG | I2C_DMA_FLAG; + + if((ret=i2c_master_send(client, (unsigned char *)I2CDMABuf_pa, writelen))!=writelen) + dev_err(&client->dev, "###%s i2c write len=%x,buffaddr=%x\n", __func__,ret,I2CDMABuf_pa); + //MSE_ERR("Sensor dma timing is %x!\r\n", this_client->timing); + client->addr = client->addr & I2C_MASK_FLAG &(~ I2C_DMA_FLAG); + + } + #endif + return ret; + +} + +int fts_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + unsigned char buf[2] = {0}; + buf[0] = regaddr; + buf[1] = regvalue; + + return fts_i2c_Write(client, buf, sizeof(buf)); +} + + +int fts_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + return fts_i2c_Read(client, ®addr, 1, regvalue, 1); +} + +int fts_ctpm_auto_clb(struct i2c_client *client) +{ + unsigned char uc_temp = 0x00; + unsigned char i = 0; + + /*start auto CLB */ + msleep(200); + + fts_write_reg(client, 0, FTS_FACTORYMODE_VALUE); + /*make sure already enter factory mode */ + msleep(100); + /*write command to start calibration */ + fts_write_reg(client, 2, 0x4); + msleep(300); + if ((fts_updateinfo_curr.CHIP_ID==0x11) ||(fts_updateinfo_curr.CHIP_ID==0x12) ||(fts_updateinfo_curr.CHIP_ID==0x13) ||(fts_updateinfo_curr.CHIP_ID==0x14)) //5x36,5x36i + { + for(i=0;i<100;i++) + { + fts_read_reg(client, 0x02, &uc_temp); + if (0x02 == uc_temp || + 0xFF == uc_temp) + { + /*if 0x02, then auto clb ok, else 0xff, auto clb failure*/ + break; + } + msleep(20); + } + } else { + for(i=0;i<100;i++) + { + fts_read_reg(client, 0, &uc_temp); + if (0x0 == ((uc_temp&0x70)>>4)) /*return to normal mode, calibration finish*/ + { + break; + } + msleep(20); + } + } + /*calibration OK*/ + fts_write_reg(client, 0, 0x40); /*goto factory mode for store*/ + msleep(200); /*make sure already enter factory mode*/ + fts_write_reg(client, 2, 0x5); /*store CLB result*/ + msleep(300); + fts_write_reg(client, 0, FTS_WORKMODE_VALUE); /*return to normal mode */ + msleep(300); + + /*store CLB result OK */ + return 0; +} + + +/* +upgrade with *.i file +*/ +int fts_ctpm_fw_upgrade_with_i_file(struct i2c_client *client) +{ + u8 *pbt_buf = NULL; + int i_ret; + //int fw_len = sizeof(CTPM_FW); + + /*judge the fw that will be upgraded + * if illegal, then stop upgrade and return. + */ + if (fw_size < 8 || fw_size > 32 * 1024) { + dev_err(&client->dev, "%s:FW length error\n", __func__); + return -EIO; + } + + if ((CTPM_FW[fw_size - 8] ^ CTPM_FW[fw_size - 6]) == 0xFF + && (CTPM_FW[fw_size - 7] ^ CTPM_FW[fw_size - 5]) == 0xFF + && (CTPM_FW[fw_size - 3] ^ CTPM_FW[fw_size - 4]) == 0xFF) { + /*FW upgrade */ + pbt_buf = CTPM_FW; + /*call the upgrade function */ + i_ret = fts_ctpm_fw_upgrade(client, pbt_buf, fw_size); + if (i_ret != 0) + dev_err(&client->dev, "%s:upgrade failed. err.\n", + __func__); + else if(fts_updateinfo_curr.AUTO_CLB==AUTO_CLB_NEED) + fts_ctpm_auto_clb(client); /*start auto CLB */ + + } else { + dev_err(&client->dev, "%s:FW format error\n", __func__); + return -EBADFD; + } + + return i_ret; +} + +u8 fts_ctpm_get_i_file_ver(void) +{ + u16 ui_sz; + //ui_sz = sizeof(CTPM_FW); + ui_sz = fw_size; + if (ui_sz > 2) + return CTPM_FW[ui_sz - 2]; + + return 0x00; /*default value */ +} + +/*update project setting +*only update these settings for COB project, or for some special case +*/ +int fts_ctpm_update_project_setting(struct i2c_client *client) +{ + u8 uc_i2c_addr; /*I2C slave address (7 bit address)*/ + u8 uc_io_voltage; /*IO Voltage 0---3.3v; 1----1.8v*/ + u8 uc_panel_factory_id; /*TP panel factory ID*/ + u8 buf[FTS_SETTING_BUF_LEN]; + u8 reg_val[2] = {0}; + u8 auc_i2c_write_buf[10] = {0}; + u8 packet_buf[FTS_SETTING_BUF_LEN + 6]; + u32 i = 0; + int i_ret; + + uc_i2c_addr = client->addr; + uc_io_voltage = 0x0; + uc_panel_factory_id = 0x5a; + + + /*Step 1:Reset CTPM + *write 0xaa to register 0xfc + */ + fts_write_reg(client, 0xfc, 0xaa); + msleep(50); + + /*write 0x55 to register 0xfc */ + fts_write_reg(client, 0xfc, 0x55); + msleep(30); + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = 0x55; + auc_i2c_write_buf[1] = 0xaa; + do { + i++; + i_ret = fts_i2c_Write(client, auc_i2c_write_buf, 2); + msleep(5); + } while (i_ret <= 0 && i < 5); + + + /*********Step 3:check READ-ID***********************/ + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] = + 0x00; + + fts_i2c_Read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == 0x79 && reg_val[1] == 0x3) + dev_dbg(&client->dev, "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + else + return -EIO; + + auc_i2c_write_buf[0] = 0xcd; + fts_i2c_Read(client, auc_i2c_write_buf, 1, reg_val, 1); + dev_dbg(&client->dev, "bootloader version = 0x%x\n", reg_val[0]); + + /*--------- read current project setting ---------- */ + /*set read start address */ + buf[0] = 0x3; + buf[1] = 0x0; + buf[2] = 0x78; + buf[3] = 0x0; + + fts_i2c_Read(client, buf, 4, buf, FTS_SETTING_BUF_LEN); + dev_dbg(&client->dev, "[FTS] old setting: uc_i2c_addr = 0x%x,\ + uc_io_voltage = %d, uc_panel_factory_id = 0x%x\n", + buf[0], buf[2], buf[4]); + + /*--------- Step 4:erase project setting --------------*/ + auc_i2c_write_buf[0] = 0x63; + fts_i2c_Write(client, auc_i2c_write_buf, 1); + msleep(100); + + /*---------- Set new settings ---------------*/ + buf[0] = uc_i2c_addr; + buf[1] = ~uc_i2c_addr; + buf[2] = uc_io_voltage; + buf[3] = ~uc_io_voltage; + buf[4] = uc_panel_factory_id; + buf[5] = ~uc_panel_factory_id; + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + packet_buf[2] = 0x78; + packet_buf[3] = 0x0; + packet_buf[4] = 0; + packet_buf[5] = FTS_SETTING_BUF_LEN; + + for (i = 0; i < FTS_SETTING_BUF_LEN; i++) + packet_buf[6 + i] = buf[i]; + + fts_i2c_Write(client, packet_buf, FTS_SETTING_BUF_LEN + 6); + msleep(100); + + /********* reset the new FW***********************/ + auc_i2c_write_buf[0] = 0x07; + fts_i2c_Write(client, auc_i2c_write_buf, 1); + + msleep(200); + return 0; +} + +int fts_ctpm_auto_upgrade(struct i2c_client *client) +{ + u8 uc_host_fm_ver = FT_REG_FW_VER; + u8 uc_tp_fm_ver; + int i_ret; + unsigned char uc_reg_value; + + fts_read_reg(client, FT5X0X_REG_CIPHER, &uc_reg_value); + printk("[FTS] read chip id is %x\n",uc_reg_value); +#ifdef CONFIG_TOUCHSCREEN_FIRMWARE_UPGRADE +/*the chip id of FT6306 is 0x06*/ + if (uc_reg_value == 0x06) + { + CTPM_FW = FT6306_FW; + fw_size = sizeof(FT6306_FW); + } + if (uc_reg_value == 0x0a) + { + CTPM_FW = FT5316_FW; + fw_size = sizeof(FT5316_FW); + } +#endif + fts_read_reg(client, FT_REG_FW_VER, &uc_tp_fm_ver); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(); + + printk("[FTS] uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x\n",uc_tp_fm_ver, uc_host_fm_ver); +/* +*avoid the old module about 500pcs to upgrade the firmware, +*the firmware version of old module is from 0x01 to 0x03, +*but the new module firmware version is more than 0x10. +*bug385939 +*/ + if (uc_reg_value == 0x06) { + if (uc_tp_fm_ver < 0x04) + return 0; + } + + if (/*the firmware in touch panel maybe corrupted */ + uc_tp_fm_ver == FT_REG_FW_VER || + /*the firmware in host flash is new, need upgrade */ + uc_tp_fm_ver < uc_host_fm_ver + ) { + msleep(100); + dev_dbg(&client->dev, "[FTS] uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x\n", + uc_tp_fm_ver, uc_host_fm_ver); + i_ret = fts_ctpm_fw_upgrade_with_i_file(client); + if (i_ret == 0) { + msleep(300); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(); + dev_dbg(&client->dev, "[FTS] upgrade to new version 0x%x\n", + uc_host_fm_ver); + } else { + pr_err("[FTS] upgrade failed ret=%d.\n", i_ret); + return -EIO; + } + } + + return 0; +} + +void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) + { + for (j = 0; j < 1000; j++) + { + udelay(1); + } + } +} + +extern void focaltech_get_upgrade_array(struct i2c_client *client); + +int fts_ctpm_fw_upgrade(struct i2c_client *client, u8 *pbt_buf, + u32 dw_lenth) +{ + u8 reg_val[2] = {0}; + u32 i = 0; + u8 is_5336_new_bootloader = 0; + u8 is_5336_fwsize_30 = 0; + u32 packet_number; + u32 j=0; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 bt_ecc; + int i_ret; + // struct Upgrade_Info upgradeinfo; + + //fts_get_upgrade_info(&upgradeinfo); + + focaltech_get_upgrade_array(client); + + if(*(pbt_buf+dw_lenth-12) == 30) + { + is_5336_fwsize_30 = 1; + } + else + { + is_5336_fwsize_30 = 0; + } + for (i = 0; i < FTS_UPGRADE_LOOP; i++) + { + msleep(100); + printk("[FTS] Step 1:Reset CTPM\n"); + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register 0xfc */ + //if (DEVICE_IC_TYPE == IC_FT6208 || DEVICE_IC_TYPE == IC_FT6x06) + if(fts_updateinfo_curr.CHIP_ID==0x05 || fts_updateinfo_curr.CHIP_ID==0x06 ) + fts_write_reg(client, 0xbc, FT_UPGRADE_AA); + else + fts_write_reg(client, 0xfc, FT_UPGRADE_AA); + msleep(fts_updateinfo_curr.delay_aa); + + + /*write 0x55 to register 0xfc */ + //if(DEVICE_IC_TYPE == IC_FT6208 || DEVICE_IC_TYPE == IC_FT6x06) + if(fts_updateinfo_curr.CHIP_ID==0x05 || fts_updateinfo_curr.CHIP_ID==0x06 ) + fts_write_reg(client, 0xbc, FT_UPGRADE_55); + else + fts_write_reg(client, 0xfc, FT_UPGRADE_55); + if(i<=15) + { + msleep(fts_updateinfo_curr.delay_55+i*3); + } + else + { + msleep(fts_updateinfo_curr.delay_55-(i-15)*2); + } + + + /*********Step 2:Enter upgrade mode *****/ + printk("[FTS] Step 2:Enter upgrade mode \n"); + #if 0 + auc_i2c_write_buf[0] = FT_UPGRADE_55; + auc_i2c_write_buf[1] = FT_UPGRADE_AA; + do { + j++; + i_ret = fts_i2c_Write(client, auc_i2c_write_buf, 2); + msleep(5); + } while (i_ret <= 0 && j < 5); + #else + auc_i2c_write_buf[0] = FT_UPGRADE_55; + fts_i2c_Write(client, auc_i2c_write_buf, 1); + msleep(5); + auc_i2c_write_buf[0] = FT_UPGRADE_AA; + fts_i2c_Write(client, auc_i2c_write_buf, 1); + #endif + +#if 1 + /*********Step 3:check READ-ID***********************/ + msleep(fts_updateinfo_curr.delay_readid); + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] =0x00; + fts_i2c_Read(client, auc_i2c_write_buf, 4, reg_val, 2); + + printk("[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0], reg_val[1]); + if (reg_val[0] == fts_updateinfo_curr.upgrade_id_1 + && reg_val[1] == fts_updateinfo_curr.upgrade_id_2) { + //dev_dbg(&client->dev, "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + //reg_val[0], reg_val[1]); + printk("[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + break; + } else { + dev_err(&client->dev, "[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n", + reg_val[0], reg_val[1]); + } +#endif + } + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + + auc_i2c_write_buf[0] = 0xcd; + fts_i2c_Read(client, auc_i2c_write_buf, 1, reg_val, 1); + /*********0705 mshl ********************/ + /*if (reg_val[0] > 4) + is_5336_new_bootloader = 1;*/ + + if (reg_val[0] <= 4) + { + is_5336_new_bootloader = BL_VERSION_LZ4 ; + } + else if(reg_val[0] == 7) + { + is_5336_new_bootloader = BL_VERSION_Z7 ; + } + else if(reg_val[0] >= 0x0f && ((fts_updateinfo_curr.CHIP_ID==0x11) ||(fts_updateinfo_curr.CHIP_ID==0x12) ||(fts_updateinfo_curr.CHIP_ID==0x13) ||(fts_updateinfo_curr.CHIP_ID==0x14))) + { + is_5336_new_bootloader = BL_VERSION_GZF ; + } + else + { + is_5336_new_bootloader = BL_VERSION_LZ4 ; + } + + + printk("[FTS] Step 4:erase app and panel paramenter area\n"); + /*Step 4:erase app and panel paramenter area*/ + printk("Step 4:erase app and panel paramenter area\n"); + auc_i2c_write_buf[0] = 0x61; + fts_i2c_Write(client, auc_i2c_write_buf, 1); /*erase app area */ + msleep(fts_updateinfo_curr.delay_earse_flash); + /*erase panel parameter area */ + if(is_5336_fwsize_30) + { + auc_i2c_write_buf[0] = 0x63; + fts_i2c_Write(client, auc_i2c_write_buf, 1); + } + msleep(100); + + printk("[FTS] Step 5:write firmware(FW) to ctpm flash\n"); + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + printk("Step 5:write firmware(FW) to ctpm flash\n"); + + //dw_lenth = dw_lenth - 8; + if(is_5336_new_bootloader == BL_VERSION_LZ4 || is_5336_new_bootloader == BL_VERSION_Z7 ) + { + dw_lenth = dw_lenth - 8; + } + else if(is_5336_new_bootloader == BL_VERSION_GZF) + { + dw_lenth = dw_lenth - 14; + } + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_Write(client, packet_buf, FTS_PACKET_LENGTH + 6); + msleep(FTS_PACKET_LENGTH / 6 + 1); + if((((j+1) * FTS_PACKET_LENGTH)%1024)==0) + printk("write bytes:0x%04x\n", (j+1) * FTS_PACKET_LENGTH); + //delay_qt_ms(FTS_PACKET_LENGTH / 6 + 1); + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + bt_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_Write(client, packet_buf, temp + 6); + msleep(20); + } +#if 0 + /*send the last six byte*/ + for (i = 0; i<6; i++) + { + if (is_5336_new_bootloader && ((fts_updateinfo_curr.CHIP_ID==0x11) ||(fts_updateinfo_curr.CHIP_ID==0x12) ||(fts_updateinfo_curr.CHIP_ID==0x13) ||(fts_updateinfo_curr.CHIP_ID==0x14)))//5x36,5x36i + temp = 0x7bfa + i; + else + temp = 0x6ffa + i; + packet_buf[2] = (u8)(temp>>8); + packet_buf[3] = (u8)temp; + temp =1; + packet_buf[4] = (u8)(temp>>8); + packet_buf[5] = (u8)temp; + packet_buf[6] = pbt_buf[ dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + fts_i2c_Write(client, packet_buf, 7); + msleep(20); + } +#else + /*send the last six byte*/ + if(is_5336_new_bootloader == BL_VERSION_LZ4 || is_5336_new_bootloader == BL_VERSION_Z7 ) + { + for (i = 0; i<6; i++) + { + if (is_5336_new_bootloader == BL_VERSION_Z7 ) + { + temp = 0x7bfa + i; + } + else if(is_5336_new_bootloader == BL_VERSION_LZ4) + { + temp = 0x6ffa + i; + } + packet_buf[2] = (u8)(temp>>8); + packet_buf[3] = (u8)temp; + temp =1; + packet_buf[4] = (u8)(temp>>8); + packet_buf[5] = (u8)temp; + packet_buf[6] = pbt_buf[ dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + + fts_i2c_Write(client, packet_buf, 7); + msleep(20); + } + } + else if(is_5336_new_bootloader == BL_VERSION_GZF) + { + + for (i = 0; i<12; i++) + { + if (is_5336_fwsize_30) + { + temp = 0x7ff4 + i; + } + else + { + temp = 0x7bf4 + i; + } + packet_buf[2] = (u8)(temp>>8); + packet_buf[3] = (u8)temp; + temp =1; + packet_buf[4] = (u8)(temp>>8); + packet_buf[5] = (u8)temp; + packet_buf[6] = pbt_buf[ dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + + fts_i2c_Write(client, packet_buf, 7); + msleep(20); + + } + } + +#endif + printk("[FTS] Step 6: read out checksum\n"); + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + printk("Step 6: read out checksum\n"); + auc_i2c_write_buf[0] = 0xcc; + fts_i2c_Read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != bt_ecc) { + dev_err(&client->dev, "[FTS]--ecc error! FW=%02x bt_ecc=%02x\n", + reg_val[0], + bt_ecc); + return -EIO; + } + + printk("[FTS] Step 7: reset the new FW\n"); + /*********Step 7: reset the new FW***********************/ + printk("Step 7: reset the new FW\n"); + auc_i2c_write_buf[0] = 0x07; + fts_i2c_Write(client, auc_i2c_write_buf, 1); + msleep(300); /*make sure CTP startup normally */ + + return 0; +} +/*sysfs debug*/ + +/* +*get firmware size + +@firmware_name:firmware name +*note:the firmware default path is sdcard. + if you want to change the dir, please modify by yourself. +*/ +static int fts_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s", firmware_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + + + +/* +*read firmware buf for .bin file. + +@firmware_name: fireware name +@firmware_buf: data buf of fireware + +note:the firmware default path is sdcard. + if you want to change the dir, please modify by yourself. +*/ +static int fts_ReadFirmware(char *firmware_name, + unsigned char *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s", firmware_name); + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, firmware_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + return 0; +} + + + +/* +upgrade with *.bin file +*/ + +int fts_ctpm_fw_upgrade_with_app_file(struct i2c_client *client, + char *firmware_name) +{ + u8 *pbt_buf = NULL; + int i_ret=0; + int fwsize = fts_GetFirmwareSize(firmware_name); + + if (fwsize <= 0) { + dev_err(&client->dev, "%s ERROR:Get firmware size failed\n", + __func__); + return -EIO; + } + + if (fwsize < 8 || fwsize > 32 * 1024) { + dev_dbg(&client->dev, "%s:FW length error\n", __func__); + return -EIO; + } + + + /*=========FW upgrade========================*/ + pbt_buf = kmalloc(fwsize + 1, GFP_ATOMIC); + + if (fts_ReadFirmware(firmware_name, pbt_buf)) { + dev_err(&client->dev, "%s() - ERROR: request_firmware failed\n", + __func__); + kfree(pbt_buf); + pbt_buf = NULL; + //return -EIO; + i_ret = -EIO; + goto err_ret; + } + + /*call the upgrade function */ + i_ret = fts_ctpm_fw_upgrade(client, pbt_buf, fwsize); + if (i_ret != 0) + dev_err(&client->dev, "%s() - ERROR:[FTS] upgrade failed..\n", + __func__); + else if(fts_updateinfo_curr.AUTO_CLB==AUTO_CLB_NEED) + fts_ctpm_auto_clb(client); + +err_ret: + + + if(pbt_buf != NULL) + kfree(pbt_buf); + + return i_ret; +} + +static ssize_t fts_tpfwver_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + ssize_t num_read_chars = 0; + u8 fwver = 0; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&g_device_mutex); + + if (fts_read_reg(client, FT_REG_FW_VER, &fwver) < 0) + num_read_chars = snprintf(buf, PAGE_SIZE, + "get tp fw version fail!\n"); + else + num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver); + + mutex_unlock(&g_device_mutex); + + return num_read_chars; +} + +static ssize_t fts_tpfwver_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + /*place holder for future use*/ + return -EPERM; +} + + + +static ssize_t fts_tprwreg_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + /*place holder for future use*/ + return -EPERM; +} + +static ssize_t fts_tprwreg_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t num_read_chars = 0; + int retval; + long unsigned int wmreg = 0; + u8 regaddr = 0xff, regvalue = 0xff; + u8 valbuf[5] = {0}; + + memset(valbuf, 0, sizeof(valbuf)); + mutex_lock(&g_device_mutex); + num_read_chars = count - 1; + + if (num_read_chars != 2) { + if (num_read_chars != 4) { + pr_info("please input 2 or 4 character\n"); + goto error_return; + } + } + + memcpy(valbuf, buf, num_read_chars); + retval = strict_strtoul(valbuf, 16, &wmreg); + + if (0 != retval) { + dev_err(&client->dev, "%s() - ERROR: Could not convert the "\ + "given input to a number." \ + "The given input was: \"%s\"\n", + __func__, buf); + goto error_return; + } + + if (2 == num_read_chars) { + /*read register*/ + regaddr = wmreg; + if (fts_read_reg(client, regaddr, ®value) < 0) + dev_err(&client->dev, "Could not read the register(0x%02x)\n", + regaddr); + else + pr_info("the register(0x%02x) is 0x%02x\n", + regaddr, regvalue); + } else { + regaddr = wmreg >> 8; + regvalue = wmreg; + if (fts_write_reg(client, regaddr, regvalue) < 0) + dev_err(&client->dev, "Could not write the register(0x%02x)\n", + regaddr); + else + dev_err(&client->dev, "Write 0x%02x into register(0x%02x) successful\n", + regvalue, regaddr); + } + +error_return: + mutex_unlock(&g_device_mutex); + + return count; +} + +static ssize_t fts_fwupdate_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/*upgrade from *.i*/ +static ssize_t fts_fwupdate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + //struct fts_ts_data *data = NULL; + u8 uc_host_fm_ver; + int i_ret; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + //data = (struct fts_ts_data *)i2c_get_clientdata(client); + + mutex_lock(&g_device_mutex); + + disable_irq(client->irq); + //mt65xx_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + i_ret = fts_ctpm_fw_upgrade_with_i_file(client); + if (i_ret == 0) { + msleep(300); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(); + pr_info("%s [FTS] upgrade to new version 0x%x\n", __func__, + uc_host_fm_ver); + } else + dev_err(&client->dev, "%s ERROR:[FTS] upgrade failed.\n", + __func__); + + enable_irq(client->irq); + //mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + mutex_unlock(&g_device_mutex); + + return count; +} + +static ssize_t fts_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + /*place holder for future use*/ + return -EPERM; +} + + +/*upgrade from app.bin*/ +static ssize_t fts_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + ssize_t num_read_chars = 0; + char fwname[128]; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count - 1] = '\0'; + + mutex_lock(&g_device_mutex); + disable_irq(client->irq); + //mt65xx_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + if(0==fts_ctpm_fw_upgrade_with_app_file(client, fwname)) + { + num_read_chars = snprintf(buf, PAGE_SIZE, + "FTP firmware upgrade success!\n"); + } + else + { + num_read_chars = snprintf(buf, PAGE_SIZE, + "FTP firmware upgrade fail!\n"); + } + + enable_irq(client->irq); + //mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + mutex_unlock(&g_device_mutex); + + return num_read_chars; +} + + +/*sysfs */ +/*get the fw version +*example:cat ftstpfwver +*/ +static DEVICE_ATTR(ftstpfwver, S_IRUGO | S_IWUSR, fts_tpfwver_show, + fts_tpfwver_store); + +/*upgrade from *.i +*example: echo 1 > ftsfwupdate +*/ +static DEVICE_ATTR(ftsfwupdate, S_IRUGO | S_IWUSR, fts_fwupdate_show, + fts_fwupdate_store); + +/*read and write register +*read example: echo 88 > ftstprwreg ---read register 0x88 +*write example:echo 8807 > ftstprwreg ---write 0x07 into register 0x88 +* +*note:the number of input must be 2 or 4.if it not enough,please fill in the 0. +*/ +static DEVICE_ATTR(ftstprwreg, S_IRUGO | S_IWUSR, fts_tprwreg_show, + fts_tprwreg_store); + + +/*upgrade from app.bin +*example:echo "*_app.bin" > ftsfwupgradeapp +*/ +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO | S_IWUSR, fts_fwupgradeapp_show, + fts_fwupgradeapp_store); + + +/*add your attr in here*/ +static struct attribute *fts_attributes[] = { + &dev_attr_ftstpfwver.attr, + &dev_attr_ftsfwupdate.attr, + &dev_attr_ftstprwreg.attr, + &dev_attr_ftsfwupgradeapp.attr, + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/*create sysfs for debug*/ +int fts_create_sysfs(struct i2c_client *client) +{ + int err; + + err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (0 != err) { + dev_err(&client->dev, + "%s() - ERROR: sysfs_create_group() failed.\n", + __func__); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -EIO; + } else { + mutex_init(&g_device_mutex); + pr_info("ft6x06:%s() - sysfs_create_group() succeeded.\n", + __func__); + } + return err; +} + +void fts_release_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + mutex_destroy(&g_device_mutex); + + +} +/*create apk debug channel*/ + +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_RAWDATA 3 +#define PROC_AUTOCLB 4 + +#define PROC_NAME "ft5x0x-debug" +static unsigned char proc_operate_mode = PROC_RAWDATA; +static struct proc_dir_entry *ft5x0x_proc_entry; +/*interface of write proc*/ +static ssize_t ft5x0x_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *ops) +{ + struct i2c_client *client = (struct i2c_client *)PDE_DATA(file_inode(filp)); + unsigned char writebuf[FTS_PACKET_LENGTH]; + int buflen = len; + int writelen = 0; + int ret = 0; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&client->dev, "%s:copy from user error\n", __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + printk("%s\n", upgrade_file_path); + disable_irq(client->irq); + + ret = fts_ctpm_fw_upgrade_with_app_file(client, upgrade_file_path); + + enable_irq(client->irq); + if (ret < 0) { + dev_err(&client->dev, "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + case PROC_READ_REGISTER: + writelen = 1; + printk("%s:register addr=0x%02x\n", __func__, writebuf[1]); + ret = fts_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_RAWDATA: + break; + case PROC_AUTOCLB: + fts_ctpm_auto_clb(client); + break; + + default: + break; + } + + + return len; +} + +/*interface of read proc*/ +static ssize_t ft5x0x_debug_read(struct file *filp, char __user *page, size_t len, loff_t *pos) +{ + struct i2c_client *client = (struct i2c_client *)PDE_DATA(file_inode(filp)); + int ret = 0; + + //u8 tx = 0, rx = 0; + //int i, j; + + unsigned char buf[PAGE_SIZE]; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling ft5x0x_debug_write to upgrade*/ + regaddr = 0xA6; + ret = fts_read_reg(client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_Read(client, NULL, 0, buf, readlen); + if (ret < 0) { + dev_err(&client->dev, "%s:read iic error\n", __func__); + return ret; + } else + printk("%s:value=0x%02x\n", __func__, buf[0]); + num_read_chars = 1; + break; + case PROC_RAWDATA: + break; + default: + break; + } + + memcpy(page, buf, num_read_chars); + + return num_read_chars; +} +static struct file_operations proc_ops = { + .read = ft5x0x_debug_read, + .write = ft5x0x_debug_write, +}; +int ft5x0x_create_apk_debug_channel(struct i2c_client * client) +{ + ft5x0x_proc_entry = proc_create_data(PROC_NAME, 0777 | S_IFREG, NULL, &proc_ops, (void *)client); + if (NULL == ft5x0x_proc_entry) { + dev_err(&client->dev, "Couldn't create proc entry!\n"); + return -ENOMEM; + } + return 0; +} + +void ft5x0x_release_apk_debug_channel(void) +{ +#if 0 + if (ft5x0x_proc_entry) + remove_proc_entry(PROC_NAME, NULL); +#endif +} + diff --git a/drivers/input/touchscreen/ft5x0x_ts_v1.c b/drivers/input/touchscreen/ft5x0x_ts_v1.c new file mode 100644 index 00000000..135b79d2 --- /dev/null +++ b/drivers/input/touchscreen/ft5x0x_ts_v1.c @@ -0,0 +1,1691 @@ +/* + * Copyright (C) 2012 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +/*********************************Bee-0928-TOP****************************************/ + +static unsigned char debug_level=PIXCIR_DEBUG; + +#define CONFIG_FT5X0X_MULTITOUCH + +#define PIXCIR_DBG(format, ...) \ + if(debug_level == 1) \ + printk(KERN_INFO "PIXCIR " format "\n", ## __VA_ARGS__) + +static struct i2c_client *this_client; +static struct ft5x0x_ts_struct *g_ft5x0x_ts; +static unsigned char status_reg = 0; +static struct point_node_t point_slot[MAX_FINGER_NUM*2]; +static struct point_node_t point_slot_back[MAX_FINGER_NUM*2]; +static int distance[5]={0}; +static int touch_flage[5]={0}; +static struct i2c_driver ft5x0x_i2c_ts_driver; +static struct class *i2c_dev_class; +static LIST_HEAD( i2c_dev_list); +static DEFINE_SPINLOCK( i2c_dev_list_lock); + + +static ssize_t ft5x0x_set_calibrate(struct device* cd, struct device_attribute *attr,const char* buf, size_t len); +static ssize_t ft5x0x_show_suspend(struct device* cd,struct device_attribute *attr, char* buf); +static ssize_t ft5x0x_store_suspend(struct device* cd, struct device_attribute *attr,const char* buf, size_t len); + + +static int ft5x0x_read_data(struct ft5x0x_ts_struct *data); +static void ft5x0x_report_value(struct ft5x0x_ts_struct *data); + +static void ft5x0x_reset(int reset_pin); +static void ft5x0x_ts_suspend(struct early_suspend *handler); +static void ft5x0x_ts_resume(struct early_suspend *handler); +static void ft5x0x_ts_pwron(struct regulator *reg_vdd); +static void ft5x0x_ts_pwroff(struct regulator *reg_vdd); +static int ft5x0x_tx_config(void); +//static DEVICE_ATTR(calibrate, S_IRUGO | S_IWUSR, NULL, pixcir_set_calibrate); +//static DEVICE_ATTR(suspend, S_IRUGO | S_IWUSR, pixcir_show_suspend, pixcir_store_suspend); +//static DEVICE_ATTR(debug, S_IRUGO | S_IWUSR, pixcir_show_debug, pixcir_store_debug); + +#define FTS_FW_DOWNLOAD +#ifdef FTS_FW_DOWNLOAD +#define FTS_PACKET_LENGTH 128 +#define FT5x0x_TX_NUM 28 +#define FT5x0x_RX_NUM 16 +static unsigned char CTPM_FW[]= +{ + #include "ft5x0x_fw_0x16.dat" +}; +#endif + + +/* pixcir_i2c_rxdata -- read data from i2c + * @rxdata: read buffer, first output variable + * @length: read length, second input variable + * @return: eror value, 0 means successful + */ +static int ft5x0x_i2c_rxdata(char *rxdata, int length) +{ + int ret; + struct i2c_msg msgs[] = { + { + .addr = g_ft5x0x_ts->client->addr, + .flags = 0, + .len = 1, + .buf = rxdata, + }, + { + .addr = g_ft5x0x_ts->client->addr, + .flags = I2C_M_RD, + .len = length, + .buf = rxdata, + }, + }; + + ret = i2c_transfer(g_ft5x0x_ts->client->adapter, msgs,2); + if (ret < 0) + pr_err("%s i2c read error: %d\n", __func__, ret); + + return ret; +} + +/* pixcir_i2c_txdata -- write data to i2c + * @rxdata: write buffer, first input variable + * @length: length length, second input variable + * @return: eror value, 0 means successful + */ +static int ft5x0x_i2c_txdata(char *txdata, int length) +{ + int ret; + struct i2c_msg msg[] = { + { + .addr = g_ft5x0x_ts->client->addr, + .flags = 0, + .len = length, + .buf = txdata, + }, + }; + + ret = i2c_transfer(g_ft5x0x_ts->client->adapter, msg, 1); + if (ret < 0) + pr_err("%s i2c write error: %d\n", __func__, ret); + + return ret; +} + + +/* pixcir_i2c_write_data -- write one byte to i2c + * @rxdata: the register address of the i2c device , first input variable + * @length: the data to write , second input variable + * @return: eror value, 0 means successful + */ +static int ft5x0x_i2c_write_data(unsigned char addr, unsigned char data) +{ + unsigned char buf[2]; + buf[0]=addr; + buf[1]=data; + return ft5x0x_i2c_txdata(buf, 2); +} + +static DEVICE_ATTR(calibrate, S_IRUGO | S_IWUSR, NULL, ft5x0x_set_calibrate); +static DEVICE_ATTR(suspend, S_IRUGO | S_IWUSR, ft5x0x_show_suspend, ft5x0x_store_suspend); + +static ssize_t ft5x0x_set_calibrate(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + + if(on_off==1) + { + PIXCIR_DBG("%s: PIXCIR calibrate\n",__func__); + ft5x0x_i2c_write_data(0x3a , 0x03); + msleep(5*1000); + } + + return len; +} + + +/* pixcir_show_suspend -- for suspend/resume debug + * show current status + * params: no care + * @return: len + */ +static ssize_t ft5x0x_show_suspend(struct device* cd, + struct device_attribute *attr, char* buf) +{ + ssize_t ret = 0; + + if(g_ft5x0x_ts->suspend_flag==1) + sprintf(buf, "Pixcir Suspend\n"); + else + sprintf(buf, "Pixcir Resume\n"); + + ret = strlen(buf) + 1; + + return ret; +} + + +/* pixcir_store_suspend -- for suspend/resume debug + * set suspend/resume + * params: no care + * @return: len + */ +static ssize_t ft5x0x_store_suspend(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + g_ft5x0x_ts->suspend_flag= on_off; + + if(on_off==1) + { + PIXCIR_DBG(KERN_INFO "Pixcir Entry Suspend\n"); + ft5x0x_ts_suspend(NULL); + } + else + { + PIXCIR_DBG(KERN_INFO "Pixcir Entry Resume\n"); + ft5x0x_ts_resume(NULL); + } + + return len; +} + + +/* pixcir_create_sysfs -- create sysfs attribute + * client: i2c client + * @return: len + */ +static int ft5x0x_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + PIXCIR_DBG("%s", __func__); + + err = device_create_file(dev, &dev_attr_calibrate); + err = device_create_file(dev, &dev_attr_suspend); + + return err; +} + +/* pixcir_ts_sleep -- set pixicir into sleep mode + * @return: none + */ +static void ft5x0x_ts_sleep(void) +{ + PIXCIR_DBG(KERN_INFO "==%s==\n", __func__); + //pixcir_i2c_write_data(PIXCIR_PWR_MODE_REG , PIXCIR_PWR_SLEEP_MODE); +} + +/* pixcir_ts_suspend -- set pixicr into suspend + * @return: none + */ +static void ft5x0x_ts_suspend(struct early_suspend *handler) +{ + disable_irq_nosync(g_ft5x0x_ts->ft5x0x_irq); + ft5x0x_ts_pwroff(g_ft5x0x_ts->reg_vdd); +} + +/* pixcir_ts_resume -- set pixicr to resume + * @return: none + */ +static void ft5x0x_ts_resume(struct early_suspend *handler) +{ + ft5x0x_ts_pwron(g_ft5x0x_ts->reg_vdd); + gpio_direction_input(g_ft5x0x_ts->platform_data->irq_gpio_number); + ft5x0x_reset(g_ft5x0x_ts->platform_data->reset_gpio_number); + msleep(100); + //pixcir_tx_config(); + enable_irq(g_ft5x0x_ts->ft5x0x_irq); +} + + +#ifdef TOUCH_VIRTUAL_KEYS +#define SC8810_KEY_HOME 102 +#define SC8810_KEY_MENU 30 +#define SC8810_KEY_BACK 17 +#define SC8810_KEY_SEARCH 217 + +static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, + __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":120:500:50:100" + ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":40:500:50:100" + ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":200:500:50:100" + ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":280:500:50:100" + "\n"); +} + +static struct kobj_attribute virtual_keys_attr = { + .attr = { + .name = "virtualkeys.ft5x0x_ts", + .mode = S_IRUGO, + }, + .show = &virtual_keys_show, +}; + +static struct attribute *properties_attrs[] = { + &virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group properties_attr_group = { + .attrs = properties_attrs, +}; + + +/* pixcir_ts_virtual_keys_init -- register virutal keys to system + * @return: none + */ +static void ft5x0x_ts_virtual_keys_init(void) +{ + int ret; + struct kobject *properties_kobj; + + PIXCIR_DBG("%s\n",__func__); + + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &properties_attr_group); + if (!properties_kobj || ret) + pr_err("failed to create board_properties\n"); +} + + +#endif + + +/* pxicir_ts_pininit -- gpio request + * irq_pin: irq gpio number + * rst_pin: reset gpio number + * @return: none + */ +static void pxicir_ts_pininit(int irq_pin, int rst_pin) +{ + gpio_request(irq_pin, TS_IRQ_PIN); + gpio_request(rst_pin, TS_RESET_PIN); + gpio_direction_input(irq_pin); +} + +/* pixcir_ts_pwron -- power on pixcir chip + * reg_vdd: regulator + * @return: none + */ +struct regulator *tsp_regulator_33 = NULL; +static void ft5x0x_ts_pwroff(struct regulator *reg_vdd) +{ + PIXCIR_DBG(KERN_INFO "%s\n",__func__); + regulator_disable(tsp_regulator_33); + msleep(20); +} +static void ft5x0x_ts_pwron(struct regulator *reg_vdd) +{ + int err = 0; + PIXCIR_DBG(KERN_INFO "%s\n",__func__); + tsp_regulator_33 = regulator_get(NULL, REGU_NAME_TP); + if (IS_ERR(tsp_regulator_33)) { + pr_err("zinitix:could not get 3.3v regulator\n"); + return; + } + err =regulator_set_voltage(tsp_regulator_33,3000000,3000000); + if (err) + pr_err("zinitix:could not set to 3300mv.\n"); + //regulator_set_voltage(reg_vdd, 3000000, 3000000); + regulator_enable(tsp_regulator_33); + //__raw_writel(((__raw_readl(0x82000628) &0xfffff0ff)|(0x00000900)), 0x82000628); + + msleep(20); +} + +/* attb_read_val -- read the interrupt pin level + * gpio_pin: pin number + * @return: 1 or 0 + */ +static int attb_read_val(int gpio_pin) +{ + return gpio_get_value(gpio_pin); +} + +/* pixcir_reset -- set pixcir reset + * reset_pin: pin number + * @return: none + */ +static void ft5x0x_reset(int reset_pin) +{ + PIXCIR_DBG(KERN_INFO "%s\n",__func__); + #if 0 + gpio_direction_output(reset_pin, 0); + msleep(3); + gpio_set_value(reset_pin, 1); + msleep(10); + gpio_set_value(reset_pin,0); + msleep(10); + #endif +} + +/* pixcir_tx_config -- initialize the pixcir register + * @return: error code + */ +static int ft5x0x_tx_config(void) +{ + int error; + unsigned char buf; +#if 0 + error=pixcir_i2c_write_data(PIXCIR_INT_MODE_REG, PIXCIR_INT_MODE); + buf = PIXCIR_INT_MODE_REG; + error=pixcir_i2c_rxdata(&buf, 1); + PIXCIR_DBG("%s: buf=0x%x",__func__, buf); + return error; +#endif + return 0; +} + + +static void return_i2c_dev(struct i2c_dev *i2c_dev) +{ + spin_lock(&i2c_dev_list_lock); + list_del(&i2c_dev->list); + spin_unlock(&i2c_dev_list_lock); + kfree(i2c_dev); +} + +static struct i2c_dev *i2c_dev_get_by_minor(unsigned index) +{ + struct i2c_dev *i2c_dev; + i2c_dev = NULL; + + spin_lock(&i2c_dev_list_lock); + list_for_each_entry(i2c_dev, &i2c_dev_list, list) + { + if (i2c_dev->adap->nr == index) + goto found; + } + i2c_dev = NULL; + found: spin_unlock(&i2c_dev_list_lock); + return i2c_dev; +} + +static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap) +{ + struct i2c_dev *i2c_dev; + + if (adap->nr >= I2C_MINORS) { + printk(KERN_ERR "%s: i2c-dev: Out of device minors\n",__func__); + return ERR_PTR(-ENODEV); + } + + i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL); + if (!i2c_dev) + return ERR_PTR(-ENOMEM); + + i2c_dev->adap = adap; + + spin_lock(&i2c_dev_list_lock); + list_add_tail(&i2c_dev->list, &i2c_dev_list); + spin_unlock(&i2c_dev_list_lock); + return i2c_dev; +} +/*********************************Bee-0928-bottom**************************************/ + + +/* pixcir_ts_poscheck -- check it finger on TP and it's position, + * report event to input system + * pixcir_ts_struct: pixicir data struct + * @return: none + */ +static void ft5x0x_ts_poscheck(struct ft5x0x_ts_struct *data) +{ + int ret = 0; + struct ft5x0x_ts_struct *tsdata = data; + PIXCIR_DBG("%s\n", __func__); + ret = ft5x0x_read_data(tsdata); + if (ret == 0) { + ft5x0x_report_value(tsdata); + } +} +static void ft5x0x_ts_release(struct ft5x0x_ts_struct *data) +{ +#ifdef CONFIG_FT5X0X_MULTITOUCH + input_report_key(data->input, BTN_TOUCH, 0); + input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, 0); +#else + input_report_abs(data->input, ABS_PRESSURE, 0); + input_report_key(data->input, BTN_TOUCH, 0); +#endif + input_sync(data->input); +} +static int ft5x0x_read_data(struct ft5x0x_ts_struct *data) +{ + struct ts_event *event = &data->event; + u8 buf[32] = {0}; + int ret = -1; + int touch_point = 0; + + /*printk("==read data=\n"); */ +#ifdef CONFIG_FT5X0X_MULTITOUCH + ret = ft5x0x_i2c_rxdata(buf, 31); +#else + ret = ft5x0x_i2c_rxdata(buf, 7); +#endif + if (ret < 0) { + printk("%s read_data i2c_rxdata failed: %d\n", __func__, ret); + return ret; + } +#if 0 + event->touch_point = buf[2] & 0x03;/* 0000 0011*/ +#endif + touch_point = buf[2] & 0x07;// 000 0111 + + if (touch_point == 0) { + ft5x0x_ts_release(data); + return 1; + } + memset(event, 0, sizeof(struct ts_event)); + event->touch_point = touch_point; +#ifdef CONFIG_FT5X0X_MULTITOUCH + switch (event->touch_point) { +#ifdef CONFIG_TOUCHSCREEN_FT5206_WVGA +//jixwei_add for Q100 ft5x06 convert from WVGA to HVGA + case 5: + event->x5 = (s16)(buf[0x1b] & 0x0F)<<8 | (s16)buf[0x1c]; + event->y5 = (s16)(buf[0x1d] & 0x0F)<<8 | (s16)buf[0x1e]; + event->x5 = event->x5*2/3; + event->y5 = event->y5*3/5; + case 4: + event->x4 = (s16)(buf[0x15] & 0x0F)<<8 | (s16)buf[0x16]; + event->y4 = (s16)(buf[0x17] & 0x0F)<<8 | (s16)buf[0x18]; + event->x4 = event->x4*2/3; + event->y4 = event->y4*3/5; + case 3: + event->x3 = (s16)(buf[0x0f] & 0x0F)<<8 | (s16)buf[0x10]; + event->y3 = (s16)(buf[0x11] & 0x0F)<<8 | (s16)buf[0x12]; + event->x3 = event->x3*2/3; + event->y3 = event->y3*3/5; + case 2: + event->x2 = (s16)(buf[9] & 0x0F)<<8 | (s16)buf[10]; + event->y2 = (s16)(buf[11] & 0x0F)<<8 | (s16)buf[12]; + event->x2 = event->x2*2/3; + event->y2 = event->y2*3/5; + case 1: + event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4]; + event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6]; + event->x1 = event->x1*2/3; + event->y1 = event->y1*3/5; +#else + case 5: + event->x5 = (s16)(buf[0x1b] & 0x0F)<<8 | (s16)buf[0x1c]; + event->y5 = (s16)(buf[0x1d] & 0x0F)<<8 | (s16)buf[0x1e]; + case 4: + event->x4 = (s16)(buf[0x15] & 0x0F)<<8 | (s16)buf[0x16]; + event->y4 = (s16)(buf[0x17] & 0x0F)<<8 | (s16)buf[0x18]; + case 3: + event->x3 = (s16)(buf[0x0f] & 0x0F)<<8 | (s16)buf[0x10]; + event->y3 = (s16)(buf[0x11] & 0x0F)<<8 | (s16)buf[0x12]; + case 2: + event->x2 = (s16)(buf[9] & 0x0F)<<8 | (s16)buf[10]; + event->y2 = (s16)(buf[11] & 0x0F)<<8 | (s16)buf[12]; + case 1: + event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4]; + event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6]; +#endif + break; + default: + return -1; + } +#else + if (event->touch_point == 1) { + event->x1 = (s16)(buf[3] & 0x0F)<<8 | (s16)buf[4]; + event->y1 = (s16)(buf[5] & 0x0F)<<8 | (s16)buf[6]; + } +#endif + event->pressure = 200; + + PIXCIR_DBG("%d (%d, %d), (%d, %d)\n", event->touch_point, event->x1, event->y1, event->x2, event->y2); + + return 0; +} +static void ft5x0x_report_value(struct ft5x0x_ts_struct *data) +{ + struct ts_event *event = &data->event; + /*lilonghui delet the log for debug2011-12-26*/ + PIXCIR_DBG("==ft5x0x_report_value =\n"); +#ifdef CONFIG_FT5X0X_MULTITOUCH + input_report_key(data->input, BTN_TOUCH, 1); + switch(event->touch_point) { + case 5: + input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, event->pressure); + input_report_abs(data->input, ABS_MT_POSITION_X, event->x5); + input_report_abs(data->input, ABS_MT_POSITION_Y, event->y5); + input_report_abs(data->input, ABS_MT_WIDTH_MAJOR, 1); + input_mt_sync(data->input); + PIXCIR_DBG("===x5 = %d,y5 = %d ====\n",event->x5,event->y5); + case 4: + input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, event->pressure); + input_report_abs(data->input, ABS_MT_POSITION_X, event->x4); + input_report_abs(data->input, ABS_MT_POSITION_Y, event->y4); + input_report_abs(data->input, ABS_MT_WIDTH_MAJOR, 1); + input_mt_sync(data->input); + PIXCIR_DBG("===x4 = %d,y4 = %d ====\n",event->x4,event->y4); + case 3: + input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, event->pressure); + input_report_abs(data->input, ABS_MT_POSITION_X, event->x3); + input_report_abs(data->input, ABS_MT_POSITION_Y, event->y3); + input_report_abs(data->input, ABS_MT_WIDTH_MAJOR, 1); + input_mt_sync(data->input); + PIXCIR_DBG("===x3 = %d,y3 = %d ====\n",event->x3,event->y3); + case 2: + input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, event->pressure); + input_report_abs(data->input, ABS_MT_POSITION_X, event->x2); + input_report_abs(data->input, ABS_MT_POSITION_Y, event->y2); + input_report_abs(data->input, ABS_MT_WIDTH_MAJOR, 1); + input_mt_sync(data->input); + PIXCIR_DBG("===x2 = %d,y2 = %d ====\n",event->x2,event->y2); + case 1: + input_report_abs(data->input, ABS_MT_TOUCH_MAJOR, event->pressure); + input_report_abs(data->input, ABS_MT_POSITION_X, event->x1); + input_report_abs(data->input, ABS_MT_POSITION_Y, event->y1); + input_report_abs(data->input, ABS_MT_WIDTH_MAJOR, 1); + input_mt_sync(data->input); + PIXCIR_DBG("===x1 = %d,y1 = %d ====\n",event->x1,event->y1); + default: + PIXCIR_DBG("==touch_point default =\n"); + break; + } + + input_report_abs(data->input, ABS_PRESSURE, event->pressure); +#if 0 + input_report_key(data->input, BTN_TOUCH, 1); +#endif +#else /* CONFIG_FT5X0X_MULTITOUCH*/ + if (event->touch_point == 1) { + input_report_abs(data->input, ABS_X, event->x1); + input_report_abs(data->input, ABS_Y, event->y1); + input_report_abs(data->input, ABS_PRESSURE, event->pressure); + } + input_report_key(data->input, BTN_TOUCH, 1); +#endif /* CONFIG_FT5X0X_MULTITOUCH*/ + input_sync(data->input); + + dev_dbg(&this_client->dev, "%s: 1:%d %d 2:%d %d \n", __func__, + event->x1, event->y1, event->x2, event->y2); +} +/* pixcir_ts_isr -- disable irq, and schedule + * irq: irq number + * dev_id: param when request_irq + * @return: IRQ status + */ +static irqreturn_t ft5x0x_ts_isr(int irq, void *dev_id) +{ + int ret = 0; + struct ft5x0x_ts_struct *tsdata = (struct ft5x0x_ts_struct *)dev_id; + PIXCIR_DBG("%s\n", __func__); + /*disable irq*/ + disable_irq_nosync(irq); +#if 1 + if (!work_pending(&tsdata->pen_event_work)) { + queue_work(tsdata->ts_workqueue, &tsdata->pen_event_work); + } +#else + { + ret = ft5x0x_read_data(tsdata); + if (ret == 0) { + ft5x0x_report_value(tsdata); + } +#if 0 + if (attb_read_val()) { + PIXCIR_DBG("%s: release\n",__func__); + input_report_key(tsdata->input, BTN_TOUCH, 0); + input_report_abs(tsdata->input, ABS_MT_TOUCH_MAJOR, 0); + input_sync(tsdata->input); + break; + } +#endif + } + enable_irq(irq); +#endif + return IRQ_HANDLED; + +} + + +/* pixcir_ts_irq_work -- read tp register and report event + + * @return: none + */ + #if 1 +static void ft5x0x_ts_irq_work(struct work_struct *work) +{ + struct ft5x0x_ts_struct *tsdata = g_ft5x0x_ts; + ft5x0x_ts_poscheck(tsdata); + enable_irq(tsdata->client->irq); +} +#endif +#ifdef CONFIG_PM_SLEEP +static int ft5x0x_i2c_ts_suspend(struct device *dev) +{ +#if 1 + struct i2c_client *client = to_i2c_client(dev); + unsigned char wrbuf[2] = { 0 }; + int ret; + + //wrbuf[0] = 0x33; + //wrbuf[1] = 0x03; //enter into freeze mode; + /************************************************************** + wrbuf[1]: 0x00: Active mode + 0x01: Sleep mode + 0xA4: Sleep mode automatically switch + 0x03: Freeze mode + More details see application note 710 power manangement section + ****************************************************************/ +/* + ret = i2c_master_send(client, wrbuf, 2); + if(ret!=2) { + dev_err(&client->dev, + "%s: i2c_master_send failed(), ret=%d\n", + __func__, ret); + } +*/ + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); +#endif + return 0; +} + +static int ft5x0x_i2c_ts_resume(struct device *dev) +{ +#if 1 + struct i2c_client *client = to_i2c_client(dev); + + PIXCIR_DBG(KERN_INFO "%s\n",__func__); + ft5x0x_reset(g_ft5x0x_ts->platform_data->reset_gpio_number); + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); +#endif + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ft5x0x_dev_pm_ops, + ft5x0x_i2c_ts_suspend, ft5x0x_i2c_ts_resume); + + +#ifdef FTS_FW_DOWNLOAD +void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) + { + for (j = 0; j < 1000; j++) + { + udelay(1); + } + } +} + +int ft5x0x_i2c_Write(char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(this_client->adapter, msg, 1); + if (ret < 0) + printk("[FTS] %s i2c write error: %d\n", __func__, ret); + + return ret; +}EXPORT_SYMBOL(ft5x0x_i2c_Write); + +int ft5x0x_write_reg(unsigned char regaddr, unsigned char regvalue) +{ + unsigned char buf[2]; + buf[0] = regaddr; + buf[1] = regvalue; + return ft5x0x_i2c_Write(buf, sizeof(buf)); +} + +int ft5x0x_i2c_Read(char * writebuf, int writelen, char *readbuf, int readlen) +{ + int ret; + + if(writelen > 0) + { + struct i2c_msg msgs[] = { + { + .addr = this_client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = this_client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(this_client->adapter, msgs, 2); + if (ret < 0) + printk("[FTS] msg %s i2c read error: %d\n", __func__, ret); + } + else + { + struct i2c_msg msgs[] = { + { + .addr = this_client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(this_client->adapter, msgs, 1); + if (ret < 0) + printk("[FTS] msg %s i2c read error: %d\n", __func__, ret); + } + return ret; +}EXPORT_SYMBOL(ft5x0x_i2c_Read); + +int ft5x0x_read_reg(unsigned char regaddr, unsigned char * regvalue) +{ + return ft5x0x_i2c_Read(®addr, 1, regvalue, 1); +} + +int fts_ctpm_auto_clb(void) +{ + unsigned char uc_temp; + unsigned char i ; + + printk("[FTS] start auto CLB.\n"); + msleep(200); + ft5x0x_write_reg(0, 0x40); + delay_qt_ms(100); //make sure already enter factory mode + ft5x0x_write_reg(2, 0x4); //write command to start calibration + delay_qt_ms(300); + for(i=0;i<100;i++) + { + ft5x0x_read_reg(0,&uc_temp); + if ( ((uc_temp&0x70)>>4) == 0x0) //return to normal mode, calibration finish + { + break; + } + delay_qt_ms(200); + printk("[FTS] waiting calibration %d\n",i); + } + + printk("[FTS] calibration OK.\n"); + + msleep(300); + ft5x0x_write_reg(0, 0x40); //goto factory mode + delay_qt_ms(100); //make sure already enter factory mode + ft5x0x_write_reg(2, 0x5); //store CLB result + delay_qt_ms(300); + ft5x0x_write_reg(0, 0x0); //return to normal mode + msleep(300); + printk("[FTS] store CLB result OK.\n"); + return 0; +} +unsigned char fts_ctpm_get_i_file_ver(void) +{ + unsigned int ui_sz; + ui_sz = sizeof(CTPM_FW); + if (ui_sz > 2) + { + return CTPM_FW[ui_sz - 2]; + } + else + { + //TBD, error handling? + return 0xff; //default value + } +} +E_UPGRADE_ERR_TYPE fts_ctpm_fw_upgrade(FTS_BYTE* pbt_buf, FTS_DWRD dw_lenth) +{ + + FTS_BYTE reg_val[2] = {0}; + FTS_DWRD i = 0; + + FTS_DWRD packet_number; + FTS_DWRD j; + FTS_DWRD temp; + FTS_DWRD lenght; + FTS_BYTE packet_buf[FTS_PACKET_LENGTH + 6]; + FTS_BYTE auc_i2c_write_buf[10]; + FTS_BYTE bt_ecc; + int i_ret; + + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register 0xfc*/ + ft5x0x_write_reg(0xfc,0xaa); + delay_qt_ms(50); + /*write 0x55 to register 0xfc*/ + ft5x0x_write_reg(0xfc,0x55); + printk("[FTS] Step 1: Reset CTPM test\n"); + + delay_qt_ms(30); + + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = 0x55; + auc_i2c_write_buf[1] = 0xaa; + do + { + i ++; + i_ret = ft5x0x_i2c_Write(auc_i2c_write_buf, 2); + delay_qt_ms(5); + }while(i_ret <= 0 && i < 5 ); + + /*********Step 3:check READ-ID***********************/ + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] = 0x00; + //ft5x0x_i2c_Write(auc_i2c_write_buf, 4); + + ft5x0x_i2c_Read(auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == 0x79 && reg_val[1] == 0x3) + { + printk("[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0],reg_val[1]); + } + else + { + return ERR_READID; + } + auc_i2c_write_buf[0] = 0xcd; + ft5x0x_i2c_Read(auc_i2c_write_buf, 1, reg_val, 1); + printk("[FTS] bootloader version = 0x%x\n", reg_val[0]); + + /*********Step 4:erase app and panel paramenter area ********************/ + auc_i2c_write_buf[0] = 0x61; + ft5x0x_i2c_Write(auc_i2c_write_buf, 1); //erase app area + delay_qt_ms(1500); + + auc_i2c_write_buf[0] = 0x63; + ft5x0x_i2c_Write(auc_i2c_write_buf, 1); //erase panel parameter area + delay_qt_ms(100); + printk("[FTS] Step 4: erase. \n"); + + /*********Step 5:write firmware(FW) to ctpm flash*********/ + bt_ecc = 0; + printk("[FTS] Step 5: start upgrade. \n"); + dw_lenth = dw_lenth - 8; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = 0xbf; + packet_buf[1] = 0x00; + for (j=0;j>8); + packet_buf[3] = (FTS_BYTE)temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (FTS_BYTE)(lenght>>8); + packet_buf[5] = (FTS_BYTE)lenght; + + for (i=0;i 0) + { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (FTS_BYTE)(temp>>8); + packet_buf[3] = (FTS_BYTE)temp; + + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (FTS_BYTE)(temp>>8); + packet_buf[5] = (FTS_BYTE)temp; + + for (i=0;i>8); + packet_buf[3] = (FTS_BYTE)temp; + temp =1; + packet_buf[4] = (FTS_BYTE)(temp>>8); + packet_buf[5] = (FTS_BYTE)temp; + packet_buf[6] = pbt_buf[ dw_lenth + i]; + bt_ecc ^= packet_buf[6]; + + ft5x0x_i2c_Write(packet_buf, 7); + delay_qt_ms(20); + } + + /*********Step 6: read out checksum***********************/ + /*send the opration head*/ + auc_i2c_write_buf[0] = 0xcc; + ft5x0x_i2c_Read(auc_i2c_write_buf, 1, reg_val, 1); + + printk("[FTS] Step 6: ecc read 0x%x, new firmware 0x%x. \n", reg_val[0], bt_ecc); + if(reg_val[0] != bt_ecc) + { + return ERR_ECC; + } + + /*********Step 7: reset the new FW***********************/ + auc_i2c_write_buf[0] = 0x07; + ft5x0x_i2c_Write(auc_i2c_write_buf, 1); + msleep(300); //make sure CTP startup normally + + return ERR_OK; +} + +int fts_ctpm_fw_upgrade_with_i_file(void) +{ + FTS_BYTE* pbt_buf = NULL; + int i_ret; + + //=========FW upgrade========================*/ + pbt_buf = CTPM_FW; + /*call the upgrade function*/ + i_ret = fts_ctpm_fw_upgrade(pbt_buf,sizeof(CTPM_FW)); + if (i_ret != 0) + { + printk("[FTS] upgrade failed i_ret = %d.\n", i_ret); + //error handling ... + //TBD + } + else + { + printk("[FTS] upgrade successfully.\n"); + fts_ctpm_auto_clb(); //start auto CLB + } + + return i_ret; +} +int fts_ctpm_auto_upg(void) +{ + unsigned char uc_host_fm_ver=FT5x0x_REG_FW_VER; + unsigned char uc_tp_fm_ver; + int i_ret; + + ft5x0x_read_reg(FT5x0x_REG_FW_VER, &uc_tp_fm_ver); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(); + if ( uc_tp_fm_ver == FT5x0x_REG_FW_VER || //the firmware in touch panel maybe corrupted + uc_tp_fm_ver < uc_host_fm_ver //the firmware in host flash is new, need upgrade + ) + { + msleep(100); + printk("[FTS] uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x\n", + uc_tp_fm_ver, uc_host_fm_ver); + i_ret = fts_ctpm_fw_upgrade_with_i_file(); + if (i_ret == 0) + { + msleep(300); + uc_host_fm_ver = fts_ctpm_get_i_file_ver(); + printk("[FTS] upgrade to new version 0x%x\n", uc_host_fm_ver); + } + else + { + printk("[FTS] upgrade failed ret=%d.\n", i_ret); + } + } + + return 0; +} +#define FTS_SETTING_BUF_LEN 128 + +unsigned char FTS_CTPM_GetVendorID_Info(void) +{ + unsigned char buf[FTS_SETTING_BUF_LEN]; + unsigned char reg_val[2] = {0}; + unsigned char auc_i2c_write_buf[10]; + unsigned char packet_buf[FTS_SETTING_BUF_LEN + 6]; + unsigned int i = 0; + int i_ret; + + /*********Step 1:Reset CTPM *****/ + /*write 0xaa to register 0xfc*/ + ft5x0x_write_reg(0xfc,0xaa); + delay_qt_ms(50); + /*write 0x55 to register 0xfc*/ + ft5x0x_write_reg(0xfc,0x55); + printk("[FTS] Step 1: GetVendorID Reset CTPM test\n"); + + delay_qt_ms(30); + + /*********Step 2:Enter upgrade mode *****/ + auc_i2c_write_buf[0] = 0x55; + auc_i2c_write_buf[1] = 0xaa; + do + { + i ++; + //i_ret = ft5x0x_i2c_txdata(auc_i2c_write_buf, 2); + i_ret = ft5x0x_i2c_Write(auc_i2c_write_buf, 2); + delay_qt_ms(5); + }while(i_ret <= 0 && i < 5 ); + + /*********Step 3:check READ-ID***********************/ + auc_i2c_write_buf[0] = 0x90; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] = 0x00; + ft5x0x_i2c_Read(auc_i2c_write_buf, 4, reg_val, 2); + if (reg_val[0] == 0x79 && reg_val[1] == 0x3) + { + printk("[FTS] Step 3: CTPM ID,ID1 = 0x%x,ID2 = 0x%x\n",reg_val[0],reg_val[1]); + } + else + { + return ERR_READID; + } + auc_i2c_write_buf[0] = 0xcd; + ft5x0x_i2c_Read(auc_i2c_write_buf, 1, reg_val, 1); + printk("bootloader version = 0x%x\n", reg_val[0]); + + /* --------- read current project setting ---------- */ + //set read start address + buf[0] = 0x3; + buf[1] = 0x0; + buf[2] = 0x78; + buf[3] = 0x4; + //ft5x0x_i2c_Write(buf, 4); + //byte_read(buf, FTS_SETTING_BUF_LEN); + ft5x0x_i2c_Read(buf, 4, buf, 1); + //I2C slave address (8 bit address) + //IO Voltage 0---3.3v; 1----1.8v + //TP panel factory ID + printk("[FTS] old setting: uc_panel_factory_id = 0x%x\n", buf[0]); + + /********* reset the new FW***********************/ + auc_i2c_write_buf[0] = 0x07; + ft5x0x_i2c_Write(auc_i2c_write_buf, 1); + + msleep(300); + + return buf[0]; //TP panel factory ID +} +#endif + + +/* pixcir_i2c_ts_probe -- pixcir probe function + * initalize PIXCIR hardware configuration + * register input system, and request irq + * @return: error code; 0: successful + */ +static int __devinit ft5x0x_i2c_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct ft5x0x_ts_platform_data *pdata = client->dev.platform_data; + struct ft5x0x_ts_struct *tsdata; + struct input_dev *input; + struct device *dev; + struct i2c_dev *i2c_dev; + int i, error; + + PIXCIR_DBG(KERN_INFO "%s: probe\n",__func__); + + for(i=0; idev, "Failed to allocate driver data!\n"); + error = -ENOMEM; + goto err_free_mem; + } + g_ft5x0x_ts = tsdata; + + PIXCIR_DBG("%s: irq_pin=%d; reset_pin=%d", \ + __func__, pdata->irq_gpio_number,pdata->reset_gpio_number); + + tsdata->platform_data = pdata; + + /*pin init*/ + pxicir_ts_pininit(pdata->irq_gpio_number,pdata->reset_gpio_number); +#if 0 + /*get regulator*/ + tsdata->reg_vdd = regulator_get(&client->dev, REGU_NAME_TP); +#endif + /*enable VDD*/ + ft5x0x_ts_pwron(tsdata->reg_vdd); + + /*reset TP chip*/ + ft5x0x_reset(pdata->reset_gpio_number); + //msleep(100); + msleep(300); + + //get irq number + client->irq = gpio_to_irq(pdata->irq_gpio_number); + tsdata->ft5x0x_irq = client->irq; + PIXCIR_DBG("%s: irq=%d",__func__, client->irq); + + //register virtual keys +#ifdef TOUCH_VIRTUAL_KEYS + ft5x0x_ts_virtual_keys_init(); +#endif + + tsdata->client = client; + tsdata->input = input; + + input->name = client->name; + input->id.bustype = BUS_I2C; + input->dev.parent = &client->dev; + + __set_bit(EV_KEY, input->evbit); + __set_bit(EV_ABS, input->evbit); + __set_bit(EV_SYN, input->evbit); + __set_bit(BTN_TOUCH, input->keybit); + + __set_bit(ABS_MT_TOUCH_MAJOR, input->absbit); + __set_bit(ABS_MT_POSITION_X, input->absbit); + __set_bit(ABS_MT_POSITION_Y, input->absbit); + __set_bit(ABS_MT_WIDTH_MAJOR, input->absbit); + + __set_bit(KEY_MENU, input->keybit); + __set_bit(KEY_BACK, input->keybit); + __set_bit(KEY_HOME, input->keybit); + __set_bit(KEY_SEARCH, input->keybit); + + input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_X, 0, X_MAX, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, Y_MAX, 0, 0); + input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0, 200, 0, 0); + + + input_set_drvdata(input, tsdata); +#if 1 + INIT_WORK(&tsdata->pen_event_work, ft5x0x_ts_irq_work); + tsdata->ts_workqueue = create_singlethread_workqueue(dev_name(&client->dev)); +#endif + error = request_irq(client->irq, ft5x0x_ts_isr, IRQF_TRIGGER_FALLING, client->name, tsdata); + if (error) { + printk(KERN_ERR "%s:Unable to request touchscreen IRQ.\n",__func__); + goto err_free_mem; + } + + disable_irq_nosync(client->irq); + + error = input_register_device(input); + if (error) + goto err_free_irq; + i2c_set_clientdata(client, tsdata); + device_init_wakeup(&client->dev, 1); + +#ifdef FTS_FW_DOWNLOAD +{ + unsigned char uc_reg_addr; + unsigned char uc_reg_value; + unsigned char vendor_ID = ERR_READID; + vendor_ID = FTS_CTPM_GetVendorID_Info(); + printk("[FTS] FTS_CTPM_GetVendorID_Info = 0x%x\n", vendor_ID); + + if(vendor_ID != ERR_READID) + { + if(vendor_ID == 0x57) + fts_ctpm_auto_upg(); + } + + uc_reg_addr = FT5x0x_REG_FW_VER; + ft5x0x_i2c_Read(&uc_reg_addr, 1, &uc_reg_value, 1); + printk("[FTS] Firmware version = 0x%x\n", uc_reg_value); + } +#endif + + + /*********************************Bee-0928-TOP****************************************/ + i2c_dev = get_free_i2c_dev(client->adapter); + if (IS_ERR(i2c_dev)) { + error = PTR_ERR(i2c_dev); + return error; + } + dev = device_create(i2c_dev_class, &client->adapter->dev, MKDEV(I2C_MAJOR, + client->adapter->nr), NULL, "ft5x0x_i2c_ts%d", 0); + if (IS_ERR(dev)) { + error = PTR_ERR(dev); + return error; + } + /*********************************Bee-0928-BOTTOM****************************************/ + tsdata->ft5x0x_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + tsdata->ft5x0x_early_suspend.suspend = ft5x0x_ts_suspend; + tsdata->ft5x0x_early_suspend.resume = ft5x0x_ts_resume; + register_early_suspend(&tsdata->ft5x0x_early_suspend); + + if((error=ft5x0x_tx_config())<0) { + printk(KERN_ERR "%s: I2C error\n",__func__); + goto err_i2c; + } + ft5x0x_create_sysfs(client); + + PIXCIR_DBG(KERN_INFO "%s:insmod successfully!\n",__func__); + + enable_irq(client->irq); + return 0; + + printk(KERN_ERR "%s:insmod Fail!\n",__func__); + +err_i2c: + unregister_early_suspend(&tsdata->ft5x0x_early_suspend); +err_free_irq: + free_irq(client->irq, tsdata); +err_free_mem: + input_free_device(input); + kfree(tsdata); + return error; +} + + +/* pixcir_i2c_ts_remove -- remove pixcir from device list + * @return: error code; 0: successful + */ +static int __devexit ft5x0x_i2c_ts_remove(struct i2c_client *client) +{ + int error; + struct i2c_dev *i2c_dev; + struct ft5x0x_ts_struct *tsdata = i2c_get_clientdata(client); + + device_init_wakeup(&client->dev, 0); + + tsdata->exiting = true; + mb(); + free_irq(client->irq, tsdata); + + /*********************************Bee-0928-TOP****************************************/ + i2c_dev = get_free_i2c_dev(client->adapter); + if (IS_ERR(i2c_dev)) { + error = PTR_ERR(i2c_dev); + return error; + } + + return_i2c_dev(i2c_dev); + device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, client->adapter->nr)); + /*********************************Bee-0928-BOTTOM****************************************/ + unregister_early_suspend(&tsdata->ft5x0x_early_suspend); + //sprd_free_gpio_irq(pixcir_irq); + input_unregister_device(tsdata->input); + kfree(tsdata); + + return 0; +} + +/*************************************Bee-0928****************************************/ +/* pixcir_open */ +/*************************************Bee-0928****************************************/ +static int ft5x0x_open(struct inode *inode, struct file *file) +{ + int subminor; + struct i2c_client *client; + struct i2c_adapter *adapter; + struct i2c_dev *i2c_dev; + int ret = 0; + PIXCIR_DBG("enter ft5x0x_open function\n"); + + subminor = iminor(inode); + + i2c_dev = i2c_dev_get_by_minor(subminor); + if (!i2c_dev) { + printk(KERN_ERR "error i2c_dev\n"); + return -ENODEV; + } + + adapter = i2c_get_adapter(i2c_dev->adap->nr); + if (!adapter) { + return -ENODEV; + } + + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client) { + i2c_put_adapter(adapter); + ret = -ENOMEM; + } + + snprintf(client->name, I2C_NAME_SIZE, "ft5x0x_i2c_ts%d", adapter->nr); + client->driver = &ft5x0x_i2c_ts_driver; + client->adapter = adapter; + + file->private_data = client; + + return 0; +} + +/*************************************Bee-0928****************************************/ +/* pixcir_ioctl */ +/*************************************Bee-0928****************************************/ +static long ft5x0x_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct i2c_client *client = (struct i2c_client *) file->private_data; + + PIXCIR_DBG("ft5x0x_ioctl(),cmd = %d,arg = %ld\n", cmd, arg); + + + switch (cmd) + { + case CALIBRATION_FLAG: //CALIBRATION_FLAG = 1 + client->addr = SLAVE_ADDR; + status_reg = CALIBRATION_FLAG; + break; + + case BOOTLOADER: //BOOTLOADER = 7 + client->addr = BOOTLOADER_ADDR; + status_reg = BOOTLOADER; + + ft5x0x_reset(g_ft5x0x_ts->platform_data->reset_gpio_number); + mdelay(5); + break; + + case RESET_TP: //RESET_TP = 9 + ft5x0x_reset(g_ft5x0x_ts->platform_data->reset_gpio_number); + break; + + case ENABLE_IRQ: //ENABLE_IRQ = 10 + status_reg = 0; + enable_irq(g_ft5x0x_ts->client->irq); + break; + + case DISABLE_IRQ: //DISABLE_IRQ = 11 + disable_irq_nosync(g_ft5x0x_ts->client->irq); + break; + + case BOOTLOADER_STU: //BOOTLOADER_STU = 12 + client->addr = BOOTLOADER_ADDR; + status_reg = BOOTLOADER_STU; + + ft5x0x_reset(g_ft5x0x_ts->platform_data->reset_gpio_number); + mdelay(5); + + case ATTB_VALUE: //ATTB_VALUE = 13 + client->addr = SLAVE_ADDR; + status_reg = ATTB_VALUE; + break; + + default: + client->addr = SLAVE_ADDR; + status_reg = 0; + break; + } + return 0; +} + +/***********************************Bee-0928****************************************/ +/* pixcir_read */ +/***********************************Bee-0928****************************************/ +static ssize_t ft5x0x_read (struct file *file, char __user *buf, size_t count,loff_t *offset) +{ + struct i2c_client *client = (struct i2c_client *)file->private_data; + unsigned char *tmp, bootloader_stu[4], attb_value[1]; + int ret = 0; + + switch(status_reg) + { + case BOOTLOADER_STU: + i2c_master_recv(client, bootloader_stu, sizeof(bootloader_stu)); + if (ret!=sizeof(bootloader_stu)) { + dev_err(&client->dev, + "%s: BOOTLOADER_STU: i2c_master_recv() failed, ret=%d\n", + __func__, ret); + return -EFAULT; + } + + ret = copy_to_user(buf, bootloader_stu, sizeof(bootloader_stu)); + if(ret) { + dev_err(&client->dev, + "%s: BOOTLOADER_STU: copy_to_user() failed.\n", __func__); + return -EFAULT; + }else { + ret = 4; + } + break; + + case ATTB_VALUE: + attb_value[0] = attb_read_val(g_ft5x0x_ts->platform_data->irq_gpio_number); + if(copy_to_user(buf, attb_value, sizeof(attb_value))) { + dev_err(&client->dev, + "%s: ATTB_VALUE: copy_to_user() failed.\n", __func__); + return -EFAULT; + }else { + ret = 1; + } + break; + + default: + tmp = kmalloc(count,GFP_KERNEL); + if (tmp==NULL) + return -ENOMEM; + + ret = i2c_master_recv(client, tmp, count); + if (ret != count) { + dev_err(&client->dev, + "%s: default: i2c_master_recv() failed, ret=%d\n", + __func__, ret); + return -EFAULT; + } + + if(copy_to_user(buf, tmp, count)) { + dev_err(&client->dev, + "%s: default: copy_to_user() failed.\n", __func__); + kfree(tmp); + return -EFAULT; + } + kfree(tmp); + break; + } + return ret; +} + +/***********************************Bee-0928****************************************/ +/* ft5x0x_write */ +/***********************************Bee-0928****************************************/ +static ssize_t ft5x0x_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos) +{ + struct i2c_client *client; + unsigned char *tmp, bootload_data[143]; + int ret=0, i=0; + + client = file->private_data; + + switch(status_reg) + { + case CALIBRATION_FLAG: //CALIBRATION_FLAG=1 +#if 0 + tmp = kmalloc(count,GFP_KERNEL); + if (tmp==NULL) + return -ENOMEM; + + if (copy_from_user(tmp,buf,count)) { + dev_err(&client->dev, + "%s: CALIBRATION_FLAG: copy_from_user() failed.\n", __func__); + kfree(tmp); + return -EFAULT; + } + + ret = i2c_master_send(client,tmp,count); + if (ret!=count ) { + dev_err(&client->dev, + "%s: CALIBRATION: i2c_master_send() failed, ret=%d\n", + __func__, ret); + kfree(tmp); + return -EFAULT; + } + + while(!attb_read_val(g_pixcir_ts->platform_data->irq_gpio_number)) { + msleep(100); + i++; + if(i>99) + break; //10s no high aatb break + } //waiting to finish the calibration.(pixcir application_note_710_v3 p43) + + kfree(tmp); +#endif + break; + + case BOOTLOADER: +#if 0 + memset(bootload_data, 0, sizeof(bootload_data)); + + if (copy_from_user(bootload_data, buf, count)) { + dev_err(&client->dev, + "%s: BOOTLOADER: copy_from_user() failed.\n", __func__); + return -EFAULT; + } + + ret = i2c_master_send(client, bootload_data, count); + if(ret!=count) { + dev_err(&client->dev, + "%s: BOOTLOADER: i2c_master_send() failed, ret = %d\n", + __func__, ret); + return -EFAULT; + } +#endif + break; + + default: + tmp = kmalloc(count,GFP_KERNEL); + if (tmp==NULL) + return -ENOMEM; + + if (copy_from_user(tmp,buf,count)) { + dev_err(&client->dev, + "%s: default: copy_from_user() failed.\n", __func__); + kfree(tmp); + return -EFAULT; + } + + ret = i2c_master_send(client,tmp,count); + if (ret!=count ) { + dev_err(&client->dev, + "%s: default: i2c_master_send() failed, ret=%d\n", + __func__, ret); + kfree(tmp); + return -EFAULT; + } + kfree(tmp); + break; + } + return ret; +} + +/***********************************Bee-0928****************************************/ +/* pixcir_release */ +/***********************************Bee-0928****************************************/ +static int ft5x0x_release(struct inode *inode, struct file *file) +{ + struct i2c_client *client = file->private_data; + + PIXCIR_DBG("enter ft5x0x_release funtion\n"); + + i2c_put_adapter(client->adapter); + kfree(client); + file->private_data = NULL; + + return 0; +} + +/*********************************Bee-0928-TOP****************************************/ +static const struct file_operations ft5x0x_i2c_ts_fops = +{ .owner = THIS_MODULE, + .read = ft5x0x_read, + .write = ft5x0x_write, + .open = ft5x0x_open, + .unlocked_ioctl = ft5x0x_ioctl, + .release = ft5x0x_release, +}; +/*********************************Bee-0928-BOTTOM****************************************/ + + +static const struct i2c_device_id ft5x0x_i2c_ts_id[] = { + { FT5X0X_DEVICE_NAME, 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, ft5x0x_i2c_ts_id); + +static struct i2c_driver ft5x0x_i2c_ts_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "ft5x0x_i2c_ts_v3.2.0A", + }, + .probe = ft5x0x_i2c_ts_probe, + .remove = __devexit_p(ft5x0x_i2c_ts_remove), + .id_table = ft5x0x_i2c_ts_id, +}; + +static int __init ft5x0x_i2c_ts_init(void) +{ + int ret; + PIXCIR_DBG("%s",__func__); + /*********************************Bee-0928-TOP****************************************/ + ret = register_chrdev(I2C_MAJOR,"ft5x0x_i2c_ts",&ft5x0x_i2c_ts_fops); + if (ret) { + printk(KERN_ERR "%s:register chrdev failed\n",__func__); + return ret; + } + + i2c_dev_class = class_create(THIS_MODULE, "ft5x0x_i2c_dev"); + if (IS_ERR(i2c_dev_class)) { + ret = PTR_ERR(i2c_dev_class); + class_destroy(i2c_dev_class); + } + /********************************Bee-0928-BOTTOM******************************************/ + return i2c_add_driver(&ft5x0x_i2c_ts_driver); +} + +static void __exit ft5x0x_i2c_ts_exit(void) +{ + i2c_del_driver(&ft5x0x_i2c_ts_driver); + /********************************Bee-0928-TOP******************************************/ + class_destroy(i2c_dev_class); + unregister_chrdev(I2C_MAJOR,"ft5x0x_i2c_ts"); + /********************************Bee-0928-BOTTOM******************************************/ +} + +module_init(ft5x0x_i2c_ts_init); +module_exit(ft5x0x_i2c_ts_exit); + +MODULE_AUTHOR("Yunlong wang "); +MODULE_DESCRIPTION("Pixcir I2C Touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/fujitsu_ts.c b/drivers/input/touchscreen/fujitsu_ts.c new file mode 100644 index 00000000..10794ddb --- /dev/null +++ b/drivers/input/touchscreen/fujitsu_ts.c @@ -0,0 +1,178 @@ +/* + * Fujitsu serial touchscreen driver + * + * Copyright (c) Dmitry Torokhov + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Fujitsu serial touchscreen driver" + +MODULE_AUTHOR("Dmitry Torokhov "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define FUJITSU_LENGTH 5 + +/* + * Per-touchscreen data. + */ +struct fujitsu { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[FUJITSU_LENGTH]; + char phys[32]; +}; + +/* + * Decode serial data (5 bytes per packet) + * First byte + * 1 C 0 0 R S S S + * Where C is 1 while in calibration mode (which we don't use) + * R is 1 when no coordinate corection was done. + * S are button state + */ +static irqreturn_t fujitsu_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + struct input_dev *dev = fujitsu->dev; + + if (fujitsu->idx == 0) { + /* resync skip until start of frame */ + if ((data & 0xf0) != 0x80) + return IRQ_HANDLED; + } else { + /* resync skip garbage */ + if (data & 0x80) { + fujitsu->idx = 0; + return IRQ_HANDLED; + } + } + + fujitsu->data[fujitsu->idx++] = data; + if (fujitsu->idx == FUJITSU_LENGTH) { + input_report_abs(dev, ABS_X, + (fujitsu->data[2] << 7) | fujitsu->data[1]); + input_report_abs(dev, ABS_Y, + (fujitsu->data[4] << 7) | fujitsu->data[3]); + input_report_key(dev, BTN_TOUCH, + (fujitsu->data[0] & 0x03) != 2); + input_sync(dev); + fujitsu->idx = 0; + } + + return IRQ_HANDLED; +} + +/* + * fujitsu_disconnect() is the opposite of fujitsu_connect() + */ +static void fujitsu_disconnect(struct serio *serio) +{ + struct fujitsu *fujitsu = serio_get_drvdata(serio); + + input_get_device(fujitsu->dev); + input_unregister_device(fujitsu->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(fujitsu->dev); + kfree(fujitsu); +} + +/* + * fujitsu_connect() is the routine that is called when someone adds a + * new serio device that supports the Fujitsu protocol and registers it + * as input device. + */ +static int fujitsu_connect(struct serio *serio, struct serio_driver *drv) +{ + struct fujitsu *fujitsu; + struct input_dev *input_dev; + int err; + + fujitsu = kzalloc(sizeof(struct fujitsu), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!fujitsu || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + fujitsu->serio = serio; + fujitsu->dev = input_dev; + snprintf(fujitsu->phys, sizeof(fujitsu->phys), + "%s/input0", serio->phys); + + input_dev->name = "Fujitsu Serial Touchscreen"; + input_dev->phys = fujitsu->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_FUJITSU; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, 0, 4096, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 4096, 0, 0); + serio_set_drvdata(serio, fujitsu); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(fujitsu->dev); + if (err) + goto fail3; + + return 0; + + fail3: + serio_close(serio); + fail2: + serio_set_drvdata(serio, NULL); + fail1: + input_free_device(input_dev); + kfree(fujitsu); + return err; +} + +/* + * The serio driver structure. + */ +static struct serio_device_id fujitsu_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_FUJITSU, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, fujitsu_serio_ids); + +static struct serio_driver fujitsu_drv = { + .driver = { + .name = "fujitsu_ts", + }, + .description = DRIVER_DESC, + .id_table = fujitsu_serio_ids, + .interrupt = fujitsu_interrupt, + .connect = fujitsu_connect, + .disconnect = fujitsu_disconnect, +}; + +module_serio_driver(fujitsu_drv); diff --git a/drivers/input/touchscreen/goodix/Makefile b/drivers/input/touchscreen/goodix/Makefile new file mode 100644 index 00000000..2fb522e6 --- /dev/null +++ b/drivers/input/touchscreen/goodix/Makefile @@ -0,0 +1,5 @@ +obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix_ts.o + +goodix_ts-objs := gt9xx.o +goodix_ts-objs += gt9xx_update.o +goodix_ts-objs += goodix_tool.o diff --git a/drivers/input/touchscreen/goodix/goodix_tool.c b/drivers/input/touchscreen/goodix/goodix_tool.c new file mode 100644 index 00000000..586aac34 --- /dev/null +++ b/drivers/input/touchscreen/goodix/goodix_tool.c @@ -0,0 +1,548 @@ +/* drivers/input/touchscreen/goodix_tool.c + * + * 2010 - 2012 Goodix Technology. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version:1.6 + * V1.0:2012/05/01,create file. + * V1.2:2012/06/08,modify some warning. + * V1.4:2012/08/28,modified to support GT9XX + * V1.6:new proc name + */ + +#include "gt9xx.h" + +#define DATA_LENGTH_UINT 512 +#define CMD_HEAD_LENGTH (sizeof(st_cmd_head) - sizeof(u8*)) +static char procname[20] = {0}; + +#define UPDATE_FUNCTIONS + +#ifdef UPDATE_FUNCTIONS +extern s32 gup_enter_update_mode(struct i2c_client *client); +extern void gup_leave_update_mode(void); +extern s32 gup_update_proc(void *dir); +#endif + +extern void gtp_irq_disable(struct goodix_ts_data *); +extern void gtp_irq_enable(struct goodix_ts_data *); + +#pragma pack(1) +typedef struct { + u8 wr; //write read flag£¬0:R 1:W 2:PID 3: + u8 flag; //0:no need flag/int 1: need flag 2:need int + u8 flag_addr[2]; //flag address + u8 flag_val; //flag val + u8 flag_relation; //flag_val:flag 0:not equal 1:equal 2:> 3:< + u16 circle; //polling cycle + u8 times; //plling times + u8 retry; //I2C retry times + u16 delay; //delay befor read or after write + u16 data_len; //data length + u8 addr_len; //address length + u8 addr[2]; //address + u8 res[3]; //reserved + u8* data; //data pointer +} st_cmd_head; +#pragma pack() +st_cmd_head cmd_head; + +static struct i2c_client *gt_client = NULL; + +static struct proc_dir_entry *goodix_proc_entry; + +static s32 goodix_tool_write(struct file *filp, const char __user *buff, unsigned long len, void *data); +static s32 goodix_tool_read( char *page, char **start, off_t off, int count, int *eof, void *data ); +static s32 (*tool_i2c_read)(u8 *, u16); +static s32 (*tool_i2c_write)(u8 *, u16); + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif +s32 DATA_LENGTH = 0; +s8 IC_TYPE[16] = "GT9XX"; + +static void tool_set_proc_name(char * procname) +{ + char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" + }; + char date[20] = {0}; + char month[4] = {0}; + int i = 0, n_month = 1, n_day = 0, n_year = 0; + + sprintf(date, "%s", __DATE__); + + //GTP_DEBUG("compile date: %s", date); + + sscanf(date, "%s %d %d", month, &n_day, &n_year); + + for (i = 0; i < 12; ++i) { + if (!memcmp(months[i], month, 3)) { + n_month = i+1; + break; + } + } + + sprintf(procname, "gmnode%04d%02d%02d", n_year, n_month, n_day); + + //GTP_DEBUG("procname = %s", procname); +} + + +static s32 tool_i2c_read_no_extra(u8* buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msgs[2]; + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = gt_client->addr; + msgs[0].len = cmd_head.addr_len; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = gt_client->addr; + msgs[1].len = len; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + for (i = 0; i < cmd_head.retry; i++) { + ret=i2c_transfer(gt_client->adapter, msgs, 2); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_write_no_extra(u8* buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msg; + + msg.flags = !I2C_M_RD; + msg.addr = gt_client->addr; + msg.len = len; + msg.buf = buf; + + for (i = 0; i < cmd_head.retry; i++) { + ret=i2c_transfer(gt_client->adapter, &msg, 1); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_read_with_extra(u8* buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_read_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static s32 tool_i2c_write_with_extra(u8* buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_write_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static void register_i2c_func(void) +{ +// if (!strncmp(IC_TYPE, "GT818", 5) || !strncmp(IC_TYPE, "GT816", 5) +// || !strncmp(IC_TYPE, "GT811", 5) || !strncmp(IC_TYPE, "GT818F", 6) +// || !strncmp(IC_TYPE, "GT827", 5) || !strncmp(IC_TYPE,"GT828", 5) +// || !strncmp(IC_TYPE, "GT813", 5)) + if (strncmp(IC_TYPE, "GT8110", 6) && strncmp(IC_TYPE, "GT8105", 6) + && strncmp(IC_TYPE, "GT801", 5) && strncmp(IC_TYPE, "GT800", 5) + && strncmp(IC_TYPE, "GT801PLUS", 9) && strncmp(IC_TYPE, "GT811", 5) + && strncmp(IC_TYPE, "GTxxx", 5) && strncmp(IC_TYPE, "GT9XX", 5)) { + tool_i2c_read = tool_i2c_read_with_extra; + tool_i2c_write = tool_i2c_write_with_extra; + GTP_DEBUG("I2C function: with pre and end cmd!"); + } else { + tool_i2c_read = tool_i2c_read_no_extra; + tool_i2c_write = tool_i2c_write_no_extra; + GTP_INFO("I2C function: without pre and end cmd!"); + } +} + +static void unregister_i2c_func(void) +{ + tool_i2c_read = NULL; + tool_i2c_write = NULL; + GTP_INFO("I2C function: unregister i2c transfer function!"); +} + + +static const struct file_operations goodix_ops = { + .owner = THIS_MODULE, + .read = goodix_tool_read, + .write = goodix_tool_write, +}; + +s32 init_wr_node(struct i2c_client *client) +{ + s32 i; + + gt_client = client; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.data = NULL; + + i = 5; + while ((!cmd_head.data) && i) { + cmd_head.data = kzalloc(i * DATA_LENGTH_UINT, GFP_KERNEL); + if (NULL != cmd_head.data) { + break; + } + i--; + } + if (i) { + DATA_LENGTH = i * DATA_LENGTH_UINT + GTP_ADDR_LENGTH; + GTP_INFO("Applied memory size:%d.", DATA_LENGTH); + } else { + GTP_ERROR("Apply for memory failed."); + return FAIL; + } + + cmd_head.addr_len = 2; + cmd_head.retry = 5; + + register_i2c_func(); + + tool_set_proc_name(procname); + goodix_proc_entry = proc_create(procname, 0666, NULL,&goodix_ops); /*create_proc_entry(procname, 0666, NULL);*/ + if (goodix_proc_entry == NULL) { + GTP_ERROR("Couldn't create proc entry!"); + return FAIL; + } else { + GTP_INFO("Create proc entry success!"); + //goodix_proc_entry->write_proc = goodix_tool_write; + //goodix_proc_entry->read_proc = goodix_tool_read; + } + + return SUCCESS; +} + +void uninit_wr_node(void) +{ + kfree(cmd_head.data); + cmd_head.data = NULL; + unregister_i2c_func(); + remove_proc_entry(procname, NULL); +} + +static u8 relation(u8 src, u8 dst, u8 rlt) +{ + u8 ret = 0; + + switch (rlt) { + case 0: + ret = (src != dst) ? true : false; + break; + + case 1: + ret = (src == dst) ? true : false; + GTP_DEBUG("equal:src:0x%02x dst:0x%02x ret:%d.", src, dst, (s32)ret); + break; + + case 2: + ret = (src > dst) ? true : false; + break; + + case 3: + ret = (src < dst) ? true : false; + break; + + case 4: + ret = (src & dst) ? true : false; + break; + + case 5: + ret = (!(src | dst)) ? true : false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/******************************************************* +Function: + Comfirm function. +Input: + None. +Output: + Return write length. +********************************************************/ +static u8 comfirm(void) +{ + s32 i = 0; + u8 buf[32]; + +// memcpy(&buf[GTP_ADDR_LENGTH - cmd_head.addr_len], &cmd_head.flag_addr, cmd_head.addr_len); +// memcpy(buf, &cmd_head.flag_addr, cmd_head.addr_len);//Modified by Scott, 2012-02-17 + memcpy(buf, cmd_head.flag_addr, cmd_head.addr_len); + + for (i = 0; i < cmd_head.times; i++) { + if (tool_i2c_read(buf, 1) <= 0) { + GTP_ERROR("Read flag data failed!"); + return FAIL; + } + if (true == relation(buf[GTP_ADDR_LENGTH], cmd_head.flag_val, cmd_head.flag_relation)) { + GTP_DEBUG("value at flag addr:0x%02x.", buf[GTP_ADDR_LENGTH]); + GTP_DEBUG("flag value:0x%02x.", cmd_head.flag_val); + break; + } + + msleep(cmd_head.circle); + } + + if (i >= cmd_head.times) { + GTP_ERROR("Didn't get the flag to continue!"); + return FAIL; + } + + return SUCCESS; +} + +/******************************************************* +Function: + Goodix tool write function. +Input: + standard proc write function param. +Output: + Return write length. +********************************************************/ +static s32 goodix_tool_write(struct file *filp, const char __user *buff, unsigned long len, void *data) +{ + s32 ret = 0; + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8*)buff, len); + + ret = copy_from_user(&cmd_head, buff, CMD_HEAD_LENGTH); + if(ret) { + GTP_ERROR("copy_from_user failed."); + } + + GTP_DEBUG("wr :0x%02x.", cmd_head.wr); + GTP_DEBUG("flag:0x%02x.", cmd_head.flag); + GTP_DEBUG("flag addr:0x%02x%02x.", cmd_head.flag_addr[0], cmd_head.flag_addr[1]); + GTP_DEBUG("flag val:0x%02x.", cmd_head.flag_val); + GTP_DEBUG("flag rel:0x%02x.", cmd_head.flag_relation); + GTP_DEBUG("circle :%d.", (s32)cmd_head.circle); + GTP_DEBUG("times :%d.", (s32)cmd_head.times); + GTP_DEBUG("retry :%d.", (s32)cmd_head.retry); + GTP_DEBUG("delay :%d.", (s32)cmd_head.delay); + GTP_DEBUG("data len:%d.", (s32)cmd_head.data_len); + GTP_DEBUG("addr len:%d.", (s32)cmd_head.addr_len); + GTP_DEBUG("addr:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + GTP_DEBUG("len:%d.", (s32)len); + GTP_DEBUG("buf[20]:0x%02x.", buff[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + // copy_from_user(&cmd_head.data[cmd_head.addr_len], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if(ret) { + GTP_ERROR("copy_from_user failed."); + } + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8*)&buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return FAIL; + } + } else if (2 == cmd_head.flag) { + //Need interrupt! + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return FAIL; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len],cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + return cmd_head.data_len + CMD_HEAD_LENGTH; + } else if (3 == cmd_head.wr) { //Write ic type + ret = copy_from_user(&cmd_head.data[0], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if(ret) { + GTP_ERROR("copy_from_user failed."); + } + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + + return cmd_head.data_len + CMD_HEAD_LENGTH; + } else if (5 == cmd_head.wr) { + //memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + return cmd_head.data_len + CMD_HEAD_LENGTH; + } else if (7 == cmd_head.wr) { //disable irq! + gtp_irq_disable(i2c_get_clientdata(gt_client)); + +#if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); +#endif + return CMD_HEAD_LENGTH; + } else if (9 == cmd_head.wr) { //enable irq! + gtp_irq_enable(i2c_get_clientdata(gt_client)); + +#if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); +#endif + return CMD_HEAD_LENGTH; + } else if(17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if(ret) { + GTP_DEBUG("copy_from_user failed."); + } + if(cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_DEBUG("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_DEBUG("gtp leave rawdiff."); + } + return CMD_HEAD_LENGTH; + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { //Enter update mode! + if (FAIL == gup_enter_update_mode(gt_client)) { + return FAIL; + } + } else if (13 == cmd_head.wr) { //Leave update mode! + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { //Update firmware! + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void*)cmd_head.data)) { + return FAIL; + } + } +#endif + + return CMD_HEAD_LENGTH; +} + +/******************************************************* +Function: + Goodix tool read function. +Input: + standard proc read function param. +Output: + Return read length. +********************************************************/ +static s32 goodix_tool_read( char *page, char **start, off_t off, int count, int *eof, void *data ) +{ + GTP_DEBUG_FUNC(); + + if (cmd_head.wr % 2) { + return FAIL; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return FAIL; + } + } else if (2 == cmd_head.flag) { + //Need interrupt! + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + while(data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= DATA_LENGTH; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return FAIL; + } + memcpy(&page[loc], &cmd_head.data[GTP_ADDR_LENGTH], len); + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(page, len); + } + } else if (2 == cmd_head.wr) { + // memcpy(page, "gt8", cmd_head.data_len); + // memcpy(page, "GT818", 5); + // page[5] = 0; + + GTP_DEBUG("Return ic type:%s len:%d.", page, (s32)cmd_head.data_len); + return cmd_head.data_len; + //return sizeof(IC_TYPE_NAME); + } else if (4 == cmd_head.wr) { + page[0] = show_len >> 8; + page[1] = show_len & 0xff; + page[2] = total_len >> 8; + page[3] = total_len & 0xff; + + return cmd_head.data_len; + } else if (6 == cmd_head.wr) { + //Read error code! + } else if (8 == cmd_head.wr) { //Read driver version + // memcpy(page, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + s32 tmp_len; + tmp_len = strlen(GTP_DRIVER_VERSION); + memcpy(page, GTP_DRIVER_VERSION, tmp_len); + page[tmp_len] = 0; + } + + return cmd_head.data_len; +} diff --git a/drivers/input/touchscreen/goodix/gt9xx.c b/drivers/input/touchscreen/goodix/gt9xx.c new file mode 100644 index 00000000..71befd38 --- /dev/null +++ b/drivers/input/touchscreen/goodix/gt9xx.c @@ -0,0 +1,2408 @@ +/* drivers/input/touchscreen/gt9xx.c + * + * 2010 - 2013 Goodix Technology. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Version: 2.0 + * Authors: andrew@goodix.com, meta@goodix.com + * Release Date: 2013/04/25 + * Revision record: + * V1.0: + * first Release. By Andrew, 2012/08/31 + * V1.2: + * modify gtp_reset_guitar,slot report,tracking_id & 0x0F. By Andrew, 2012/10/15 + * V1.4: + * modify gt9xx_update.c. By Andrew, 2012/12/12 + * V1.6: + * 1. new heartbeat/esd_protect mechanism(add external watchdog) + * 2. doze mode, sliding wakeup + * 3. 3 more cfg_group(GT9 Sensor_ID: 0~5) + * 3. config length verification + * 4. names & comments + * By Meta, 2013/03/11 + * V1.8: + * 1. pen/stylus identification + * 2. read double check & fixed config support + * 3. new esd & slide wakeup optimization + * By Meta, 2013/06/08 + * V2.0: + * 1. compatible with GT9XXF + * 2. send config after resume + * By Meta, 2013/08/06 + */ + +#include +#include "gt9xx.h" + +#if GTP_ICS_SLOT_REPORT +#include +#endif + +static const char *goodix_ts_name = GTP_I2C_NAME; +static struct workqueue_struct *goodix_wq; +struct i2c_client * i2c_connect_client = NULL; +u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] += {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + +#if GTP_HAVE_TOUCH_KEY +static const u16 touch_key_array[] = GTP_KEY_TAB; +#define GTP_MAX_KEY_NUM (sizeof(touch_key_array)/sizeof(touch_key_array[0])) + +#if GTP_DEBUG_ON +static const int key_codes[] = {KEY_HOME, KEY_BACK, KEY_MENU, KEY_SEARCH}; +static const char *key_names[] = {"Key_Home", "Key_Back", "Key_Menu", "Key_Search"}; +#endif + +#endif + +static s8 gtp_i2c_test(struct i2c_client *client); +void gtp_reset_guitar(struct i2c_client *client, s32 ms); +s32 gtp_send_cfg(struct i2c_client *client); +void gtp_int_sync(s32 ms); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void goodix_ts_early_suspend(struct early_suspend *h); +static void goodix_ts_late_resume(struct early_suspend *h); +#endif + +#if GTP_CREATE_WR_NODE +extern s32 init_wr_node(struct i2c_client*); +extern void uninit_wr_node(void); +#endif + +#if GTP_AUTO_UPDATE +extern u8 gup_init_update_proc(struct goodix_ts_data *); +#endif + +#if GTP_ESD_PROTECT +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct * gtp_esd_check_workqueue = NULL; +static void gtp_esd_check_func(struct work_struct *); +static s32 gtp_init_ext_watchdog(struct i2c_client *client); +void gtp_esd_switch(struct i2c_client *, s32); +#endif + +//*********** For GT9XXF Start **********// +#if GTP_COMPATIBLE_MODE +extern s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 gup_clk_calibration(void); +extern s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +extern u8 gup_check_fs_mounted(char *path_name); + +void gtp_recovery_reset(struct i2c_client *client); +static s32 gtp_esd_recovery(struct i2c_client *client); +s32 gtp_fw_startup(struct i2c_client *client); +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts); +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode); +#endif +//********** For GT9XXF End **********// + +#if GTP_SLIDE_WAKEUP +typedef enum { + DOZE_DISABLED = 0, + DOZE_ENABLED = 1, + DOZE_WAKEUP = 2, +} DOZE_T; +static DOZE_T doze_status = DOZE_DISABLED; +static s8 gtp_enter_doze(struct goodix_ts_data *ts); +#endif + +static u8 chip_gt9xxs = 0; // true if ic is gt9xxs, like gt915s +u8 grp_cfg_version = 0; + +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret=-1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + //msgs[0].scl_rate = 300 * 1000; // for Rockchip, etc. + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + //msgs[1].scl_rate = 300 * 1000; + + while(retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if(ret == 2)break; + retries++; + } + if((retries >= 5)) { +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + +#if GTP_SLIDE_WAKEUP + // reset chip would quit doze mode + if (DOZE_ENABLED == doze_status) { + return ret; + } +#endif + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else +#endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_write(struct i2c_client *client,u8 *buf,s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + //msg.scl_rate = 300 * 1000; // for Rockchip, etc + + while(retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1)break; + retries++; + } + if((retries >= 5)) { +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + +#if GTP_SLIDE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } +#endif + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else +#endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + +/******************************************************* +Function: + i2c read twice, compare the results +Input: + client: i2c device + addr: operate address + rxbuf: read data to store, if compare successful + len: bytes to read +Output: + FAIL: read failed + SUCCESS: read successful +*********************************************************/ +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buf[16] = {0}; + u8 confirm_buf[16] = {0}; + u8 retry = 0; + + while (retry++ < 3) { + memset(buf, 0xAA, 16); + buf[0] = (u8)(addr >> 8); + buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, buf, len + 2); + + memset(confirm_buf, 0xAB, 16); + confirm_buf[0] = (u8)(addr >> 8); + confirm_buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, confirm_buf, len + 2); + + if (!memcmp(buf, confirm_buf, len+2)) { + memcpy(rxbuf, confirm_buf+2, len); + return SUCCESS; + } + } + GTP_ERROR("I2C read 0x%04X, %d bytes, double check failed!", addr, len); + return FAIL; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->fixed_cfg) { + GTP_INFO("Ic fixed config, no config sent!"); + return 0; + } else if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} +/******************************************************* +Function: + Disable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_disable(struct goodix_ts_data *ts) +{ + unsigned long irqflags; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (!ts->irq_is_disable) { + ts->irq_is_disable = 1; + disable_irq_nosync(ts->client->irq); + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + +/******************************************************* +Function: + Enable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_enable(struct goodix_ts_data *ts) +{ + unsigned long irqflags = 0; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (ts->irq_is_disable) { + enable_irq(ts->client->irq); + ts->irq_is_disable = 0; + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + + +/******************************************************* +Function: + Report touch point event +Input: + ts: goodix i2c_client private data + id: trackId + x: input x coordinate + y: input y coordinate + w: input pressure +Output: + None. +*********************************************************/ +static void gtp_touch_down(struct goodix_ts_data* ts,s32 id,s32 x,s32 y,s32 w) +{ +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + +#if GTP_ICS_SLOT_REPORT + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); +#else + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->input_dev); +#endif + + GTP_DEBUG("ID:%d, X:%d, Y:%d, W:%d", id, x, y, w); +} + +/******************************************************* +Function: + Report touch release event +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +static void gtp_touch_up(struct goodix_ts_data* ts, s32 id) +{ +#if GTP_ICS_SLOT_REPORT + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1); + GTP_DEBUG("Touch id[%2d] release!", id); +#else + //input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0); + //input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0); + input_mt_sync(ts->input_dev); +#endif +} + + +/******************************************************* +Function: + Goodix touchscreen work function +Input: + work: work struct of goodix_workqueue +Output: + None. +*********************************************************/ +static void goodix_ts_work_func(struct work_struct *work) +{ + u8 end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0}; + u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1]= {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF}; + u8 touch_num = 0; + u8 finger = 0; + static u16 pre_touch = 0; + static u8 pre_key = 0; +#if GTP_WITH_PEN + static u8 pre_pen = 0; +#endif + u8 key_value = 0; + u8* coor_data = NULL; + s32 input_x = 0; + s32 input_y = 0; + s32 input_w = 0; + s32 id = 0; + s32 i = 0; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + +#if GTP_COMPATIBLE_MODE + u8 rqst_buf[3] = {0x80, 0x43}; // for GT9XXF +#endif + +#if GTP_SLIDE_WAKEUP + u8 doze_buf[3] = {0x81, 0x4B}; +#endif + + GTP_DEBUG_FUNC(); + ts = container_of(work, struct goodix_ts_data, work); + if (ts->enter_update) { + return; + } +#if GTP_SLIDE_WAKEUP + if (DOZE_ENABLED == doze_status) { + ret = gtp_i2c_read(i2c_connect_client, doze_buf, 3); + GTP_DEBUG("0x814B = 0x%02X", doze_buf[2]); + if (ret > 0) { + if (doze_buf[2] == 0xAA) { + GTP_INFO("Forward slide to light up the screen!"); + doze_status = DOZE_WAKEUP; + input_report_key(ts->input_dev, KEY_POWER, 1); + input_sync(ts->input_dev); + input_report_key(ts->input_dev, KEY_POWER, 0); + input_sync(ts->input_dev); + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if (doze_buf[2] == 0xBB) { + GTP_INFO("Backward slide to light up the screen!"); + doze_status = DOZE_WAKEUP; + input_report_key(ts->input_dev, KEY_POWER, 1); + input_sync(ts->input_dev); + input_report_key(ts->input_dev, KEY_POWER, 0); + input_sync(ts->input_dev); + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if (0xC0 == (doze_buf[2] & 0xC0)) { + GTP_INFO("Double click to light up the screen!"); + doze_status = DOZE_WAKEUP; + input_report_key(ts->input_dev, KEY_POWER, 1); + input_sync(ts->input_dev); + input_report_key(ts->input_dev, KEY_POWER, 0); + input_sync(ts->input_dev); + // clear 0x814B + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else { + gtp_enter_doze(ts); + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } +#endif + + ret = gtp_i2c_read(ts->client, point_data, 12); + if (ret < 0) { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + goto exit_work_func; + } + + finger = point_data[GTP_ADDR_LENGTH]; + +#if GTP_COMPATIBLE_MODE + // GT9XXF + if ((finger == 0x00) && (CHIP_TYPE_GT9F == ts->chip_type)) { // request arrived + ret = gtp_i2c_read(ts->client, rqst_buf, 3); + if (ret < 0) { + GTP_ERROR("Read request status error!"); + goto exit_work_func; + } + + switch (rqst_buf[2] & 0x0F) { + case GTP_RQST_CONFIG: + GTP_INFO("Request for config."); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Request for config unresponded!"); + } else { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + GTP_INFO("Request for config responded!"); + } + break; + + case GTP_RQST_BAK_REF: + GTP_INFO("Request for backup reference."); + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_SEND); + if (SUCCESS == ret) { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + GTP_INFO("Request for backup reference responded!"); + } else { + GTP_ERROR("Requeset for backup reference unresponed!"); + } + break; + + case GTP_RQST_RESET: + GTP_INFO("Request for reset."); + gtp_recovery_reset(ts->client); + break; + + case GTP_RQST_MAIN_CLOCK: + GTP_INFO("Request for main clock."); + ts->rqst_processing = 1; + ret = gtp_main_clk_proc(ts); + if (FAIL == ret) { + GTP_ERROR("Request for main clock unresponded!"); + } else { + GTP_INFO("Request for main clock responded!"); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + ts->clk_chk_fs_times = 0; + } + break; + + case GTP_RQST_IDLE: + default: + break; + } + } +#endif + + if((finger & 0x80) == 0) { + goto exit_work_func; + } + + touch_num = finger & 0x0f; + if (touch_num > GTP_MAX_TOUCH) { + goto exit_work_func; + } + + if (touch_num > 1) { + u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff}; + + ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); + memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1)); + } + +#if GTP_HAVE_TOUCH_KEY + key_value = point_data[3 + 8 * touch_num]; + + if(key_value || pre_key) { + for (i = 0; i < GTP_MAX_KEY_NUM; i++) { +#if GTP_DEBUG_ON + for (ret = 0; ret < 4; ++ret) { + if (key_codes[ret] == touch_key_array[i]) { + GTP_DEBUG("Key: %s %s", key_names[ret], (key_value & (0x01 << i)) ? "Down" : "Up"); + break; + } + } +#endif + input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<input_dev, BTN_TOOL_PEN, 0); + input_mt_slot(ts->input_dev, 5); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1); + pre_pen = 0; + } +#endif + if (pre_touch || touch_num) { + s32 pos = 0; + u16 touch_index = 0; + u8 report_num = 0; + coor_data = &point_data[3]; + + if(touch_num) { + id = coor_data[pos] & 0x0F; + +#if GTP_WITH_PEN + id = coor_data[pos]; + if ((id & 0x80)) { + GTP_DEBUG("Pen touch DOWN(Slot)!"); + input_x = coor_data[pos + 1] | (coor_data[pos + 2] << 8); + input_y = coor_data[pos + 3] | (coor_data[pos + 4] << 8); + input_w = coor_data[pos + 5] | (coor_data[pos + 6] << 8); + + input_report_key(ts->input_dev, BTN_TOOL_PEN, 1); + input_mt_slot(ts->input_dev, 5); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, 5); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, input_x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, input_y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, input_w); + GTP_DEBUG("Pen/Stylus: (%d, %d)[%d]", input_x, input_y, input_w); + pre_pen = 1; + pre_touch = 0; + } +#endif + + touch_index |= (0x01<input_dev, BTN_TOUCH, (touch_num || key_value)); + if (touch_num) { + for (i = 0; i < touch_num; i++) { + coor_data = &point_data[i * 8 + 3]; + + id = coor_data[0] & 0x0F; + input_x = coor_data[1] | (coor_data[2] << 8); + input_y = coor_data[3] | (coor_data[4] << 8); + input_w = coor_data[5] | (coor_data[6] << 8); + +#if GTP_WITH_PEN + id = coor_data[0]; + if (id & 0x80) { + GTP_DEBUG("Pen touch DOWN!"); + input_report_key(ts->input_dev, BTN_TOOL_PEN, 1); + pre_pen = 1; + id = 0; + } +#endif + + gtp_touch_down(ts, id, input_x, input_y, input_w); + } + } else if (pre_touch) { + +#if GTP_WITH_PEN + if (pre_pen == 1) { + GTP_DEBUG("Pen touch UP!"); + input_report_key(ts->input_dev, BTN_TOOL_PEN, 0); + pre_pen = 0; + } +#endif + + GTP_DEBUG("Touch Release!"); + gtp_touch_up(ts, 0); + } + + pre_touch = touch_num; +#endif + + input_sync(ts->input_dev); + +exit_work_func: + if(!ts->gtp_rawdiff_mode) { + ret = gtp_i2c_write(ts->client, end_cmd, 3); + if (ret < 0) { + GTP_INFO("I2C write end_cmd error!"); + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } +} + +/******************************************************* +Function: + Timer interrupt service routine for polling mode. +Input: + timer: timer struct pointer +Output: + Timer work mode. + HRTIMER_NORESTART: no restart mode +*********************************************************/ +static enum hrtimer_restart goodix_ts_timer_handler(struct hrtimer *timer) +{ + struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer); + + GTP_DEBUG_FUNC(); + + queue_work(goodix_wq, &ts->work); + hrtimer_start(&ts->timer, ktime_set(0, (GTP_POLL_TIME+6)*1000000), HRTIMER_MODE_REL); + return HRTIMER_NORESTART; +} + +/******************************************************* +Function: + External interrupt service routine for interrupt mode. +Input: + irq: interrupt number. + dev_id: private data pointer +Output: + Handle Result. + IRQ_HANDLED: interrupt handled successfully +*********************************************************/ +static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id) +{ + struct goodix_ts_data *ts = dev_id; + + GTP_DEBUG_FUNC(); + + gtp_irq_disable(ts); + + queue_work(goodix_wq, &ts->work); + + return IRQ_HANDLED; +} +/******************************************************* +Function: + Synchronization. +Input: + ms: synchronization time in millisecond. +Output: + None. +*******************************************************/ +void gtp_int_sync(s32 ms) +{ + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(ms); + GTP_GPIO_AS_INT(GTP_INT_PORT); +} + + +/******************************************************* +Function: + Reset chip. +Input: + ms: reset time in millisecond +Output: + None. +*******************************************************/ +void gtp_reset_guitar(struct i2c_client *client, s32 ms) +{ +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + + GTP_DEBUG_FUNC(); + GTP_INFO("Guitar reset"); + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); // begin select I2C slave addr + msleep(ms); // T2: > 10ms + // HIGH: 0x28/0x29, LOW: 0xBA/0xBB + GTP_GPIO_OUTPUT(GTP_INT_PORT, client->addr == 0x14); + + msleep(2); // T3: > 100us + GTP_GPIO_OUTPUT(GTP_RST_PORT, 1); + + msleep(6); // T4: > 5ms + + GTP_GPIO_AS_INPUT(GTP_RST_PORT); // end select I2C slave addr + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return; + } +#endif + + gtp_int_sync(50); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(client); +#endif +} + +#if GTP_SLIDE_WAKEUP +/******************************************************* +Function: + Enter doze mode for sliding wakeup. +Input: + ts: goodix tp private data +Output: + 1: succeed, otherwise failed +*******************************************************/ +static s8 gtp_enter_doze(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 8}; + + GTP_DEBUG_FUNC(); + +#if GTP_DBL_CLK_WAKEUP + i2c_control_buf[2] = 0x09; +#endif + + gtp_irq_disable(ts); + + GTP_DEBUG("Entering doze mode."); + while(retry++ < 5) { + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x46; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret < 0) { + GTP_DEBUG("failed to set doze flag into 0x8046, %d", retry); + continue; + } + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x40; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + doze_status = DOZE_ENABLED; + GTP_INFO("GTP has been working in doze mode!"); + gtp_irq_enable(ts); + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send doze cmd failed."); + gtp_irq_enable(ts); + return ret; +} +#else +/******************************************************* +Function: + Enter sleep mode. +Input: + ts: private data. +Output: + Executive outcomes. + 1: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_enter_sleep(struct goodix_ts_data * ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5}; + +#if GTP_COMPATIBLE_MODE + u8 status_buf[3] = {0x80, 0x44}; +#endif + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + // GT9XXF: host interact with ic + ret = gtp_i2c_read(ts->client, status_buf, 3); + if (ret < 0) { + GTP_ERROR("failed to get backup-reference status"); + } + + if (status_buf[2] & 0x80) { + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_STORE); + if (FAIL == ret) { + GTP_ERROR("failed to store bak_ref"); + } + } + } +#endif + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(5); + + while(retry++ < 5) { + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + GTP_INFO("GTP enter sleep!"); + + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send sleep cmd failed."); + return ret; +} +#endif +/******************************************************* +Function: + Wakeup from sleep. +Input: + ts: private data. +Output: + Executive outcomes. + >0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_wakeup_sleep(struct goodix_ts_data * ts) +{ + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 opr_buf[3] = {0x41, 0x80}; + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + msleep(5); + + for (retry = 0; retry < 20; ++retry) { + // hold ss51 & dsp + opr_buf[2] = 0x0C; + ret = gtp_i2c_write(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to hold ss51 & dsp!"); + continue; + } + opr_buf[2] = 0x00; + ret = gtp_i2c_read(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to get ss51 & dsp status!"); + continue; + } + if (0x0C != opr_buf[2]) { + GTP_DEBUG("ss51 & dsp not been hold, %d", retry+1); + continue; + } + GTP_DEBUG("ss51 & dsp confirmed hold"); + + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("failed to startup GT9XXF, process recovery"); + gtp_esd_recovery(ts->client); + } + break; + } + if (retry >= 10) { + GTP_ERROR("failed to wakeup, processing esd recovery"); + gtp_esd_recovery(ts->client); + } else { + GTP_INFO("GT9XXF gtp wakeup success"); + } + return ret; + } +#endif + +#if GTP_POWER_CTRL_SLEEP + while(retry++ < 5) { + gtp_reset_guitar(ts->client, 20); + + GTP_INFO("GTP wakeup sleep."); + return 1; + } +#else + while(retry++ < 10) { +#if GTP_SLIDE_WAKEUP + if (DOZE_WAKEUP != doze_status) { // wakeup not by slide + GTP_DEBUG("wakeup by power, reset guitar"); + doze_status = DOZE_DISABLED; + gtp_irq_disable(ts); + gtp_reset_guitar(ts->client, 10); + gtp_irq_enable(ts); + } else { // wakeup by slide + GTP_DEBUG("wakeup by slide/double-click, no reset guitar"); + doze_status = DOZE_DISABLED; +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(ts->client); +#endif + } + +#else + if (chip_gt9xxs == 1) { + gtp_reset_guitar(ts->client, 10); + } else { + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + msleep(5); + } +#endif + + ret = gtp_i2c_test(ts->client); + if (ret > 0) { + GTP_INFO("GTP wakeup sleep."); + +#if (!GTP_SLIDE_WAKEUP) + if (chip_gt9xxs == 0) { + gtp_int_sync(25); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(ts->client); +#endif + } +#endif + + return ret; + } + gtp_reset_guitar(ts->client, 20); + } +#endif + + GTP_ERROR("GTP wakeup sleep failed."); + return ret; +} +#if GTP_DRIVER_SEND_CFG +static s32 gtp_get_info(struct goodix_ts_data *ts) +{ + u8 opr_buf[6] = {0}; + s32 ret = 0; + + opr_buf[0] = (u8)((GTP_REG_CONFIG_DATA+1) >> 8); + opr_buf[1] = (u8)((GTP_REG_CONFIG_DATA+1) & 0xFF); + + ret = gtp_i2c_read(ts->client, opr_buf, 6); + if (ret < 0) { + return FAIL; + } + + ts->abs_x_max = (opr_buf[3] << 8) + opr_buf[2]; + ts->abs_y_max = (opr_buf[5] << 8) + opr_buf[4]; + + opr_buf[0] = (u8)((GTP_REG_CONFIG_DATA+6) >> 8); + opr_buf[1] = (u8)((GTP_REG_CONFIG_DATA+6) & 0xFF); + + ret = gtp_i2c_read(ts->client, opr_buf, 3); + if (ret < 0) { + return FAIL; + } + ts->int_trigger_type = opr_buf[2] & 0x03; + + GTP_INFO("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + + return SUCCESS; +} +#endif + +/******************************************************* +Function: + Initialize gtp. +Input: + ts: goodix private data +Output: + Executive outcomes. + 0: succeed, otherwise: failed +*******************************************************/ +static s32 gtp_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = -1; + +#if GTP_DRIVER_SEND_CFG + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16] = {0}; + u8 sensor_id = 0; + + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 cfg_info_group6[] = CTP_CFG_GROUP6; + u8 *send_cfg_buf[] = {cfg_info_group1, cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5, cfg_info_group6 + }; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5), + CFG_GROUP_LEN(cfg_info_group6) + }; + + GTP_DEBUG_FUNC(); + GTP_DEBUG("Config Groups\' Lengths: %d, %d, %d, %d, %d, %d", + cfg_info_len[0], cfg_info_len[1], cfg_info_len[2], cfg_info_len[3], + cfg_info_len[4], cfg_info_len[5]); + + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ts->fw_error = 0; + } else +#endif + { + ret = gtp_i2c_read_dbl_check(ts->client, 0x41E4, opr_buf, 1); + if (SUCCESS == ret) { + if (opr_buf[0] != 0xBE) { + ts->fw_error = 1; + GTP_ERROR("Firmware error, no config sent!"); + return -1; + } + } + } + + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } else { +#if GTP_COMPATIBLE_MODE + msleep(50); +#endif + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + ts->pnl_init_error = 1; +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return -1; + } else +#endif + { + gtp_get_info(ts); + } + return 0; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + ts->pnl_init_error = 1; + return -1; + } + GTP_INFO("Sensor_ID: %d", sensor_id); + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + GTP_INFO("CTP_CONFIG_GROUP%d used, config length: %d", sensor_id + 1, ts->gtp_cfg_len); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Config Group%d is INVALID CONFIG GROUP(Len: %d)! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id+1, ts->gtp_cfg_len); + ts->pnl_init_error = 1; + return -1; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ts->fixed_cfg = 0; + } else +#endif + { + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + + if (ret == SUCCESS) { + GTP_DEBUG("CFG_GROUP%d Config Version: %d, 0x%02X; IC Config Version: %d, 0x%02X", sensor_id+1, + send_cfg_buf[sensor_id][0], send_cfg_buf[sensor_id][0], opr_buf[0], opr_buf[0]); + + if (opr_buf[0] < 90) { + grp_cfg_version = send_cfg_buf[sensor_id][0]; // backup group config version + send_cfg_buf[sensor_id][0] = 0x00; + ts->fixed_cfg = 0; + } else { // treated as fixed config, not send config + GTP_INFO("Ic fixed config with config version(%d, 0x%02X)", opr_buf[0], opr_buf[0]); + ts->fixed_cfg = 1; + gtp_get_info(ts); + return 0; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -1; + } + } + + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); + +#if GTP_CUSTOM_CFG + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { //RISING + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { //FALLING + config[TRIGGER_LOC] |= 0x01; + } +#endif // GTP_CUSTOM_CFG + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + +#else // driver not send config + + ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH; + ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH); + if (ret < 0) { + GTP_ERROR("Read Config Failed, Using Default Resolution & INT Trigger!"); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + +#endif // GTP_DRIVER_SEND_CFG + + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 sensor_num = 0; + u8 driver_num = 0; + u8 have_key = 0; + + have_key = (config[GTP_REG_HAVE_KEY - GTP_REG_CONFIG_DATA + 2] & 0x01); + + if (1 == ts->is_950) { + driver_num = config[GTP_REG_MATRIX_DRVNUM - GTP_REG_CONFIG_DATA + 2]; + sensor_num = config[GTP_REG_MATRIX_SENNUM - GTP_REG_CONFIG_DATA + 2]; + if (have_key) { + driver_num--; + } + ts->bak_ref_len = (driver_num * (sensor_num - 1) + 2) * 2 * 6; + } else { + driver_num = (config[CFG_LOC_DRVA_NUM] & 0x1F) + (config[CFG_LOC_DRVB_NUM]&0x1F); + if (have_key) { + driver_num--; + } + sensor_num = (config[CFG_LOC_SENS_NUM] & 0x0F) + ((config[CFG_LOC_SENS_NUM] >> 4) & 0x0F); + ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; + } + + GTP_INFO("Drv * Sen: %d * %d(key: %d), X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", + driver_num, sensor_num, have_key, ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + return 0; + } else +#endif + { +#if GTP_DRIVER_SEND_CFG + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } + // set config version to CTP_CFG_GROUP, for resume to send config + config[GTP_ADDR_LENGTH] = grp_cfg_version; + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; +#endif + GTP_INFO("X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + } + + msleep(10); + return 0; +} + +/******************************************************* +Function: + Read chip version. +Input: + client: i2c device + version: buffer to keep ic firmware version +Output: + read operation return. + 2: succeed, otherwise: failed +*******************************************************/ +s32 gtp_read_version(struct i2c_client *client, u16* version) +{ + s32 ret = -1; + u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff}; + + GTP_DEBUG_FUNC(); + + ret = gtp_i2c_read(client, buf, sizeof(buf)); + if (ret < 0) { + GTP_ERROR("GTP read version failed"); + return ret; + } + + if (version) { + *version = (buf[7] << 8) | buf[6]; + } + + if (buf[5] == 0x00) { + GTP_INFO("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]); + } else { + if (buf[5] == 'S' || buf[5] == 's') { + chip_gt9xxs = 1; + } + GTP_INFO("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]); + } + return ret; +} + +/******************************************************* +Function: + I2c test Function. +Input: + client:i2c client. +Output: + Executive outcomes. + 2: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_i2c_test(struct i2c_client *client) +{ + u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + + while(retry++ < 5) { + ret = gtp_i2c_read(client, test, 3); + if (ret > 0) { + return ret; + } + GTP_ERROR("GTP i2c test failed time %d.",retry); + msleep(10); + } + return ret; +} + +/******************************************************* +Function: + Request gpio(INT & RST) ports. +Input: + ts: private data. +Output: + Executive outcomes. + >= 0: succeed, < 0: failed +*******************************************************/ +static s8 gtp_request_io_port(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + ret = GTP_GPIO_REQUEST(GTP_INT_PORT, "GTP_INT_IRQ"); + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)GTP_INT_PORT, ret); + ret = -ENODEV; + } else { + GTP_GPIO_AS_INT(GTP_INT_PORT); + ts->client->irq = GTP_INT_IRQ; + } + + ret = GTP_GPIO_REQUEST(GTP_RST_PORT, "GTP_RST_PORT"); + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d",(s32)GTP_RST_PORT,ret); + ret = -ENODEV; + } + + GTP_GPIO_AS_INPUT(GTP_RST_PORT); + + gtp_reset_guitar(ts->client, 20); + + if(ret < 0) { + GTP_GPIO_FREE(GTP_RST_PORT); + GTP_GPIO_FREE(GTP_INT_PORT); + } + + return ret; +} + +/******************************************************* +Function: + Request interrupt. +Input: + ts: private data. +Output: + Executive outcomes. + 0: succeed, -1: failed. +*******************************************************/ +static s8 gtp_request_irq(struct goodix_ts_data *ts) +{ + s32 ret = -1; + const u8 irq_table[] = GTP_IRQ_TAB; + + GTP_DEBUG_FUNC(); + GTP_DEBUG("INT trigger type:%x", ts->int_trigger_type); + + ret = request_irq(ts->client->irq, + goodix_ts_irq_handler, + irq_table[ts->int_trigger_type], + ts->client->name, + ts); + if (ret) { + GTP_ERROR("Request IRQ failed!ERRNO:%d.", ret); + GTP_GPIO_AS_INPUT(GTP_INT_PORT); + GTP_GPIO_FREE(GTP_INT_PORT); + + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = goodix_ts_timer_handler; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + return -1; + } else { + gtp_irq_disable(ts); + ts->use_irq = 1; + return 0; + } +} + +/******************************************************* +Function: + Request input device Function. +Input: + ts:private data. +Output: + Executive outcomes. + 0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_request_input_dev(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 phys[32]; +#if GTP_HAVE_TOUCH_KEY + u8 index = 0; +#endif + + GTP_DEBUG_FUNC(); + + ts->input_dev = input_allocate_device(); + if (ts->input_dev == NULL) { + GTP_ERROR("Failed to allocate input device."); + return -ENOMEM; + } + + ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; +#if GTP_ICS_SLOT_REPORT + __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); + input_mt_init_slots(ts->input_dev, 16); // in case of "out of memory" +#else + ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); +#endif + +#if GTP_HAVE_TOUCH_KEY + for (index = 0; index < GTP_MAX_KEY_NUM; index++) { + input_set_capability(ts->input_dev, EV_KEY, touch_key_array[index]); + } +#endif + +#if GTP_SLIDE_WAKEUP + input_set_capability(ts->input_dev, EV_KEY, KEY_POWER); +#endif + +#if GTP_WITH_PEN + // pen support + __set_bit(BTN_TOOL_PEN, ts->input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); + //__set_bit(INPUT_PROP_POINTER, ts->input_dev->propbit); +#endif + +#if GTP_CHANGE_X2Y + GTP_SWAP(ts->abs_x_max, ts->abs_y_max); +#endif + + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + sprintf(phys, "input/ts"); + ts->input_dev->name = goodix_ts_name; + ts->input_dev->phys = phys; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->id.vendor = 0xDEAD; + ts->input_dev->id.product = 0xBEEF; + ts->input_dev->id.version = 10427; + + ret = input_register_device(ts->input_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->input_dev->name); + return -ENODEV; + } + + return 0; +} + +//************** For GT9XXF Start *************// +#if GTP_COMPATIBLE_MODE + +s32 gtp_fw_startup(struct i2c_client *client) +{ + u8 opr_buf[4]; + s32 ret = 0; + + //init sw WDT + opr_buf[0] = 0xAA; + ret = i2c_write_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + //release SS51 & DSP + opr_buf[0] = 0x00; + ret = i2c_write_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + //int sync + gtp_int_sync(25); + + //check fw run status + ret = i2c_read_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + if(0xAA == opr_buf[0]) { + GTP_ERROR("IC works abnormally,startup failed."); + return FAIL; + } else { + GTP_INFO("IC works normally, Startup success."); + opr_buf[0] = 0xAA; + i2c_write_bytes(client, 0x8041, opr_buf, 1); + return SUCCESS; + } +} + +static s32 gtp_esd_recovery(struct i2c_client *client) +{ + s32 retry = 0; + s32 ret = 0; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + + gtp_irq_disable(ts); + + GTP_INFO("GT9XXF esd recovery mode"); + gtp_reset_guitar(client, 20); // reset & select I2C addr + for (retry = 0; retry < 5; ++retry) { + ret = gup_fw_download_proc(NULL, GTP_FL_ESD_RECOVERY); + if (FAIL == ret) { + GTP_ERROR("esd recovery failed %d", retry+1); + continue; + } + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("GT9XXF start up failed %d", retry+1); + continue; + } + break; + } + gtp_irq_enable(ts); + + if (retry >= 5) { + GTP_ERROR("failed to esd recovery"); + return FAIL; + } + + GTP_INFO("Esd recovery successful"); + return SUCCESS; +} + +void gtp_recovery_reset(struct i2c_client *client) +{ +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + GTP_DEBUG_FUNC(); + + gtp_esd_recovery(client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif +} + +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode) +{ + s32 ret = 0; + s32 i = 0; + s32 j = 0; + u16 ref_sum = 0; + u16 learn_cnt = 0; + u16 chksum = 0; + s32 ref_seg_len = 0; + s32 ref_grps = 0; + struct file *ref_filp = NULL; + u8 *p_bak_ref; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->ref_chk_fs_times++; + GTP_DEBUG("Ref check /data times/MAX_TIMES: %d / %d", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->ref_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("check /data mount timeout..."); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + p_bak_ref = (u8 *)kzalloc(ts->bak_ref_len, GFP_KERNEL); + + if (NULL == p_bak_ref) { + GTP_ERROR("Allocate memory for p_bak_ref failed!"); + return FAIL; + } + + if (ts->is_950) { + ref_seg_len = ts->bak_ref_len / 6; + ref_grps = 6; + } else { + ref_seg_len = ts->bak_ref_len; + ref_grps = 1; + } + ref_filp = filp_open(GTP_BAK_REF_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(ref_filp)) { + GTP_INFO("%s is unavailable, default backup-reference used", GTP_BAK_REF_PATH); + goto bak_ref_default; + } + + switch (mode) { + case GTP_BAK_REF_SEND: + GTP_INFO("Send backup-reference"); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ret = ref_filp->f_op->read(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info from file, sending defualt bak_ref"); + goto bak_ref_default; + } + for (j = 0; j < ref_grps; ++j) { + ref_sum = 0; + for (i = 0; i < (ref_seg_len); i += 2) { + ref_sum += (p_bak_ref[i + j * ref_seg_len] << 8) + p_bak_ref[i+1 + j * ref_seg_len]; + } + learn_cnt = (p_bak_ref[j * ref_seg_len + ref_seg_len -4] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len -3]); + chksum = (p_bak_ref[j * ref_seg_len + ref_seg_len -2] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len -1]); + GTP_DEBUG("learn count = %d", learn_cnt); + GTP_DEBUG("chksum = %d", chksum); + GTP_DEBUG("ref_sum = 0x%04X", ref_sum & 0xFFFF); + // Sum(1~ref_seg_len) == 1 + if (1 != ref_sum) { + GTP_INFO("wrong chksum for bak_ref, reset to 0x00 bak_ref"); + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[ref_seg_len + j * ref_seg_len - 1] = 0x01; + } else { + if (j == (ref_grps - 1)) { + GTP_INFO("backup-reference data in %s used", GTP_BAK_REF_PATH); + } + } + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (FAIL == ret) { + GTP_ERROR("failed to send bak_ref because of iic comm error"); + filp_close(ref_filp, NULL); + return FAIL; + } + break; + + case GTP_BAK_REF_STORE: + GTP_INFO("Store backup-reference"); + ret = i2c_read_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info, sending default back-reference"); + goto bak_ref_default; + } + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + break; + + default: + GTP_ERROR("invalid backup-reference request"); + break; + } + filp_close(ref_filp, NULL); + return SUCCESS; + +bak_ref_default: + + for (j = 0; j < ref_grps; ++j) { + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[j * ref_seg_len + ref_seg_len - 1] = 0x01; // checksum = 1 + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (!IS_ERR(ref_filp)) { + GTP_INFO("write backup-reference data into %s", GTP_BAK_REF_PATH); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + filp_close(ref_filp, NULL); + } + if (ret == FAIL) { + GTP_ERROR("failed to load the default backup reference"); + return FAIL; + } + return SUCCESS; +} + + +static s32 gtp_verify_main_clk(u8 *p_main_clk) +{ + u8 chksum = 0; + u8 main_clock = p_main_clk[0]; + s32 i = 0; + + if (main_clock < 50 || main_clock > 120) { + return FAIL; + } + + for (i = 0; i < 5; ++i) { + if (main_clock != p_main_clk[i]) { + return FAIL; + } + chksum += p_main_clk[i]; + } + chksum += p_main_clk[5]; + if ( (chksum) == 0) { + return SUCCESS; + } else { + return FAIL; + } +} + +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + s32 clk_chksum = 0; + struct file *clk_filp = NULL; + u8 p_main_clk[6] = {0}; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->clk_chk_fs_times++; + GTP_DEBUG("Clock check /data times/MAX_TIMES: %d / %d", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->clk_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("Check /data mount timeout!"); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + clk_filp = filp_open(GTP_MAIN_CLK_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(clk_filp)) { + GTP_ERROR("%s is unavailable, calculate main clock", GTP_MAIN_CLK_PATH); + } else { + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->read(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + + ret = gtp_verify_main_clk(p_main_clk); + if (FAIL == ret) { + // recalculate main clock & rewrite main clock data to file + GTP_ERROR("main clock data in %s is wrong, recalculate main clock", GTP_MAIN_CLK_PATH); + } else { + GTP_INFO("main clock data in %s used, main clock freq: %d", GTP_MAIN_CLK_PATH, p_main_clk[0]); + filp_close(clk_filp, NULL); + goto update_main_clk; + } + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_clk_calibration(); + gtp_esd_recovery(ts->client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + + GTP_INFO("calibrate main clock: %d", ret); + if (ret < 50 || ret > 120) { + GTP_ERROR("wrong main clock: %d", ret); + goto exit_main_clk; + } + + // Sum{0x8020~0x8025} = 0 + for (i = 0; i < 5; ++i) { + p_main_clk[i] = ret; + clk_chksum += p_main_clk[i]; + } + p_main_clk[5] = 0 - clk_chksum; + + if (!IS_ERR(clk_filp)) { + GTP_DEBUG("write main clock data into %s", GTP_MAIN_CLK_PATH); + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->write(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + filp_close(clk_filp, NULL); + } + +update_main_clk: + ret = i2c_write_bytes(ts->client, GTP_REG_MAIN_CLK, p_main_clk, 6); + if (FAIL == ret) { + GTP_ERROR("update main clock failed!"); + return FAIL; + } + return SUCCESS; + +exit_main_clk: + if (!IS_ERR(clk_filp)) { + filp_close(clk_filp, NULL); + } + return FAIL; +} + +s32 gtp_gt9xxf_init(struct i2c_client *client) +{ + s32 ret = 0; + + ret = gup_fw_download_proc(NULL, GTP_FL_FW_BURN); + if (FAIL == ret) { + return FAIL; + } + + ret = gtp_fw_startup(client); + if (FAIL == ret) { + return FAIL; + } + return SUCCESS; +} + +void gtp_get_chip_type(struct goodix_ts_data *ts) +{ + u8 opr_buf[10] = {0x00}; + s32 ret = 0; + + msleep(10); + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CHIP_TYPE, opr_buf, 10); + + if (FAIL == ret) { + GTP_ERROR("Failed to get chip-type, set chip type default: GOODIX_GT9"); + ts->chip_type = CHIP_TYPE_GT9; + return; + } + + if (!memcmp(opr_buf, "GOODIX_GT9", 10)) { + ts->chip_type = CHIP_TYPE_GT9; + } else { // GT9XXF + ts->chip_type = CHIP_TYPE_GT9F; + } + GTP_INFO("Chip Type: %s", (ts->chip_type == CHIP_TYPE_GT9) ? "GOODIX_GT9" : "GOODIX_GT9F"); +} + +#endif +//************* For GT9XXF End ************// + +/******************************************************* +Function: + I2c probe. +Input: + client: i2c device struct. + id: device id. +Output: + Executive outcomes. + 0: succeed. +*******************************************************/ +static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + s32 ret = -1; + struct goodix_ts_data *ts; + u16 version_info; + + GTP_DEBUG_FUNC(); + + //do NOT remove these logs + GTP_INFO("GTP Driver Version: %s", GTP_DRIVER_VERSION); + GTP_INFO("GTP Driver Built@%s, %s", __TIME__, __DATE__); + GTP_INFO("GTP I2C Address: 0x%02x", client->addr); + + i2c_connect_client = client; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + GTP_ERROR("I2C check functionality failed."); + return -ENODEV; + } + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (ts == NULL) { + GTP_ERROR("Alloc GFP_KERNEL memory failed."); + return -ENOMEM; + } + + memset(ts, 0, sizeof(*ts)); + INIT_WORK(&ts->work, goodix_ts_work_func); + ts->client = client; + spin_lock_init(&ts->irq_lock); // 2.6.39 later + // ts->irq_lock = SPIN_LOCK_UNLOCKED; // 2.6.39 & before +#if GTP_ESD_PROTECT + ts->clk_tick_cnt = 2 * HZ; // HZ: clock ticks in 1 second generated by system + GTP_DEBUG("Clock ticks for an esd cycle: %d", ts->clk_tick_cnt); + spin_lock_init(&ts->esd_lock); + // ts->esd_lock = SPIN_LOCK_UNLOCKED; +#endif + i2c_set_clientdata(client, ts); + + ts->gtp_rawdiff_mode = 0; + + ret = gtp_request_io_port(ts); + if (ret < 0) { + GTP_ERROR("GTP request IO port failed."); + kfree(ts); + return ret; + } + +#if GTP_COMPATIBLE_MODE + gtp_get_chip_type(ts); + + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_gt9xxf_init(ts->client); + if (FAIL == ret) { + GTP_INFO("Failed to init GT9XXF."); + } + } +#endif + + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + } + + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + } + + ret = gtp_init_panel(ts); + if (ret < 0) { + GTP_ERROR("GTP init panel failed."); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + +#if GTP_AUTO_UPDATE + ret = gup_init_update_proc(ts); + if (ret < 0) { + GTP_ERROR("Create update thread error."); + } +#endif + + ret = gtp_request_input_dev(ts); + if (ret < 0) { + GTP_ERROR("GTP request input dev failed"); + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = goodix_ts_early_suspend; + ts->early_suspend.resume = goodix_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + ret = gtp_request_irq(ts); + if (ret < 0) { + GTP_INFO("GTP works in polling mode."); + } else { + GTP_INFO("GTP works in interrupt mode."); + } + + if (ts->use_irq) { + gtp_irq_enable(ts); + } + +#if GTP_CREATE_WR_NODE + init_wr_node(client); +#endif + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + return 0; +} + + +/******************************************************* +Function: + Goodix touchscreen driver release function. +Input: + client: i2c device struct. +Output: + Executive outcomes. 0---succeed. +*******************************************************/ +static int goodix_ts_remove(struct i2c_client *client) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + GTP_DEBUG_FUNC(); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&ts->early_suspend); +#endif + +#if GTP_CREATE_WR_NODE + uninit_wr_node(); +#endif + +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif + + if (ts) { + if (ts->use_irq) { + GTP_GPIO_AS_INPUT(GTP_INT_PORT); + GTP_GPIO_FREE(GTP_INT_PORT); + free_irq(client->irq, ts); + } else { + hrtimer_cancel(&ts->timer); + } + } + + GTP_INFO("GTP driver removing..."); + i2c_set_clientdata(client, NULL); + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +/******************************************************* +Function: + Early suspend function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_early_suspend(struct early_suspend *h) +{ + struct goodix_ts_data *ts; + s8 ret = -1; + ts = container_of(h, struct goodix_ts_data, early_suspend); + + GTP_DEBUG_FUNC(); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ts->gtp_is_suspend = 1; + +#if GTP_SLIDE_WAKEUP + ret = gtp_enter_doze(ts); +#else + if (ts->use_irq) { + gtp_irq_disable(ts); + } else { + hrtimer_cancel(&ts->timer); + } + ret = gtp_enter_sleep(ts); +#endif + if (ret < 0) { + GTP_ERROR("GTP early suspend failed."); + } + // to avoid waking up while not sleeping + // delay 48 + 10ms to ensure reliability + msleep(58); +} + +/******************************************************* +Function: + Late resume function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_late_resume(struct early_suspend *h) +{ + struct goodix_ts_data *ts; + s8 ret = -1; + ts = container_of(h, struct goodix_ts_data, early_suspend); + + GTP_DEBUG_FUNC(); + + ret = gtp_wakeup_sleep(ts); + +#if GTP_SLIDE_WAKEUP + doze_status = DOZE_DISABLED; +#endif + + if (ret < 0) { + GTP_ERROR("GTP later resume failed."); + } +#if (GTP_COMPATIBLE_MODE) + if (CHIP_TYPE_GT9F == ts->chip_type) { + // do nothing + } else +#endif + { + gtp_send_cfg(ts->client); + } + + if (ts->use_irq) { + gtp_irq_enable(ts); + } else { + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + } + + ts->gtp_is_suspend = 0; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif +} +#endif + +#if GTP_ESD_PROTECT +s32 gtp_i2c_read_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret=-1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + //msgs[0].scl_rate = 300 * 1000; // for Rockchip, etc. + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + //msgs[1].scl_rate = 300 * 1000; + + while(retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if(ret == 2)break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} + +s32 gtp_i2c_write_no_rst(struct i2c_client *client,u8 *buf,s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + //msg.scl_rate = 300 * 1000; // for Rockchip, etc + + while(retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1)break; + retries++; + } + if((retries >= 5)) { + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} +/******************************************************* +Function: + switch on & off esd delayed work +Input: + client: i2c device + on: SWITCH_ON / SWITCH_OFF +Output: + void +*********************************************************/ +void gtp_esd_switch(struct i2c_client *client, s32 on) +{ + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + spin_lock(&ts->esd_lock); + + if (SWITCH_ON == on) { // switch on esd + if (!ts->esd_running) { + ts->esd_running = 1; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd started"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + spin_unlock(&ts->esd_lock); + } + } else { // switch off esd + if (ts->esd_running) { + ts->esd_running = 0; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd cancelled"); + cancel_delayed_work_sync(>p_esd_check_work); + } else { + spin_unlock(&ts->esd_lock); + } + } +} + +/******************************************************* +Function: + Initialize external watchdog for esd protect +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ +static s32 gtp_init_ext_watchdog(struct i2c_client *client) +{ + u8 opr_buffer[3] = {0x80, 0x41, 0xAA}; + GTP_DEBUG("[Esd]Init external watchdog"); + return gtp_i2c_write_no_rst(client, opr_buffer, 3); +} + +/******************************************************* +Function: + Esd protect function. + External watchdog added by meta, 2013/03/07 +Input: + work: delayed work +Output: + None. +*******************************************************/ +static void gtp_esd_check_func(struct work_struct *work) +{ + s32 i; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + u8 esd_buf[4] = {0x80, 0x40}; + + GTP_DEBUG_FUNC(); + + ts = i2c_get_clientdata(i2c_connect_client); + + if (ts->gtp_is_suspend) { + GTP_INFO("Esd suspended!"); + return; + } + + for (i = 0; i < 3; i++) { + ret = gtp_i2c_read_no_rst(ts->client, esd_buf, 4); + + GTP_DEBUG("[Esd]0x8040 = 0x%02X, 0x8041 = 0x%02X", esd_buf[2], esd_buf[3]); + if ((ret < 0)) { + // IIC communication problem + continue; + } else { + if ((esd_buf[2] == 0xAA) || (esd_buf[3] != 0xAA)) { + // IC works abnormally.. + u8 chk_buf[4] = {0x80, 0x40}; + + gtp_i2c_read_no_rst(ts->client, chk_buf, 4); + + GTP_DEBUG("[Check]0x8040 = 0x%02X, 0x8041 = 0x%02X", chk_buf[2], chk_buf[3]); + + if ((chk_buf[2] == 0xAA) || (chk_buf[3] != 0xAA)) { + i = 3; + break; + } else { + continue; + } + } else { + // IC works normally, Write 0x8040 0xAA, feed the dog + esd_buf[2] = 0xAA; + gtp_i2c_write_no_rst(ts->client, esd_buf, 3); + break; + } + } + } + if (i >= 3) { +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + if (ts->rqst_processing) { + GTP_INFO("Request processing, no esd recovery"); + } else { + GTP_ERROR("IC working abnormally! Process esd recovery."); + gtp_esd_recovery(ts->client); + } + } else +#endif + { + GTP_ERROR("IC working abnormally! Process reset guitar."); + gtp_reset_guitar(ts->client, 50); + } + } + + if(!ts->gtp_is_suspend) { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + GTP_INFO("Esd suspended!"); + } + return; +} +#endif + +static const struct i2c_device_id goodix_ts_id[] = { + { GTP_I2C_NAME, 0 }, + { } +}; + +static struct i2c_driver goodix_ts_driver = { + .probe = goodix_ts_probe, + .remove = goodix_ts_remove, +#ifndef CONFIG_HAS_EARLYSUSPEND + .suspend = goodix_ts_early_suspend, + .resume = goodix_ts_late_resume, +#endif + .id_table = goodix_ts_id, + .driver = { + .name = GTP_I2C_NAME, + .owner = THIS_MODULE, + }, +}; + +/******************************************************* +Function: + Driver Install function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ +static int /*__devinit*/ goodix_ts_init(void) +{ + s32 ret; + + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver installing..."); + goodix_wq = create_singlethread_workqueue("goodix_wq"); + if (!goodix_wq) { + GTP_ERROR("Creat workqueue failed."); + return -ENOMEM; + } +#if GTP_ESD_PROTECT + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); +#endif + ret = i2c_add_driver(&goodix_ts_driver); + return ret; +} + +/******************************************************* +Function: + Driver uninstall function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ +static void __exit goodix_ts_exit(void) +{ + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver exited."); + i2c_del_driver(&goodix_ts_driver); + if (goodix_wq) { + destroy_workqueue(goodix_wq); + } +} + +late_initcall(goodix_ts_init); +module_exit(goodix_ts_exit); + +MODULE_DESCRIPTION("GTP Series Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/goodix/gt9xx.h b/drivers/input/touchscreen/goodix/gt9xx.h new file mode 100644 index 00000000..8dac7063 --- /dev/null +++ b/drivers/input/touchscreen/goodix/gt9xx.h @@ -0,0 +1,340 @@ +/* drivers/input/touchscreen/gt9xx.h + * + * 2010 - 2013 Goodix Technology. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + */ + +#ifndef _GOODIX_GT9XX_H_ +#define _GOODIX_GT9XX_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//***************************PART1:ON/OFF define******************************* +#define GTP_CUSTOM_CFG 0 +#define GTP_CHANGE_X2Y 0 +#define GTP_DRIVER_SEND_CFG 1 +#define GTP_HAVE_TOUCH_KEY 0 +#define GTP_POWER_CTRL_SLEEP 0 +#define GTP_ICS_SLOT_REPORT 0 + +#define GTP_AUTO_UPDATE 1 // auto update fw by .bin file as default +#define GTP_HEADER_FW_UPDATE 0 // auto update fw by gtp_default_FW in gt9xx_firmware.h, function together with GTP_AUTO_UPDATE +#define GTP_AUTO_UPDATE_CFG 0 // auto update config by .cfg file, function together with GTP_AUTO_UPDATE + +#define GTP_COMPATIBLE_MODE 0 // compatible with GT9XXF + +#define GTP_CREATE_WR_NODE 1 +#define GTP_ESD_PROTECT 0 // esd protection with a cycle of 2 seconds +#define GTP_WITH_PEN 0 + +#define GTP_SLIDE_WAKEUP 0 +#define GTP_DBL_CLK_WAKEUP 0 // double-click wakeup, function together with GTP_SLIDE_WAKEUP + +#define GTP_DEBUG_ON 0 +#define GTP_DEBUG_ARRAY_ON 0 +#define GTP_DEBUG_FUNC_ON 0 + +#if GTP_COMPATIBLE_MODE +typedef enum { + CHIP_TYPE_GT9 = 0, + CHIP_TYPE_GT9F = 1, +} CHIP_TYPE_T; +#endif + +struct goodix_ts_data { + spinlock_t irq_lock; + struct i2c_client *client; + struct input_dev *input_dev; + struct hrtimer timer; + struct work_struct work; + struct early_suspend early_suspend; + s32 irq_is_disable; + s32 use_irq; + u16 abs_x_max; + u16 abs_y_max; + u8 max_touch_num; + u8 int_trigger_type; + u8 green_wake_mode; + u8 enter_update; + u8 gtp_is_suspend; + u8 gtp_rawdiff_mode; + u8 gtp_cfg_len; + u8 fixed_cfg; + u8 fw_error; + u8 pnl_init_error; + +#if GTP_ESD_PROTECT + spinlock_t esd_lock; + u8 esd_running; + s32 clk_tick_cnt; +#endif + +#if GTP_COMPATIBLE_MODE + u16 bak_ref_len; + s32 ref_chk_fs_times; + s32 clk_chk_fs_times; + CHIP_TYPE_T chip_type; + u8 rqst_processing; + u8 is_950; +#endif + +}; + +extern u16 show_len; +extern u16 total_len; + + +//*************************** PART2:TODO define ********************************** +// STEP_1(REQUIRED): Define Configuration Information Group(s) +// Sensor_ID Map: +/* sensor_opt1 sensor_opt2 Sensor_ID + GND GND 0 + VDDIO GND 1 + NC GND 2 + GND NC/300K 3 + VDDIO NC/300K 4 + NC NC/300K 5 +*/ +// TODO: define your own default or for Sensor_ID == 0 config here. +// unused group7: GT911_Config_20130701_185822_QDTP.cfg +#define CTP_CFG_GROUP7 {\ + 0x42,0xFC,0x03,0x00,0x03,0x05,0x39,0x00,0x01,0x3F,\ + 0x1C,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x17,0x19,0x1C,0x14,0x8C,0x2E,0x0E,\ + 0x28,0x2A,0x7C,0x08,0x00,0x00,0x00,0x9B,0x02,0x1D,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x1E,0x46,0x94,0x05,0x02,0x08,0x00,0x00,0xF9,\ + 0x08,0x1C,0xA2,0x09,0x1E,0x22,0x0A,0x23,0xFC,0x0A,\ + 0x26,0xA5,0x0C,0x26,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x1C,0x1A,0x18,0x16,0x14,0x12,0x10,0x0E,\ + 0x0C,0x0A,0x08,0x06,0x04,0x02,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0x2A,0x29,0x28,0x26,0x24,0x22,0x21,0x20,\ + 0x1F,0x1E,0x1D,0x1C,0x18,0x16,0x14,0x13,0x12,0x10,\ + 0x0F,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0xFF,0xFF,\ + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\ + 0xFF,0xFF,0xFF,0xFF,0x92,0x01\ + } + +// TODO: define your config for Sensor_ID == 1 here, if needed +// unused group8: GT911_Config_20130701_185822_QDTP.cfg (mirror_x_y) +#define CTP_CFG_GROUP8 {\ + 0x42,0xFC,0x03,0x00,0x03,0x05,0x39,0x00,0x01,0x3F,\ + 0x1C,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x17,0x19,0x1C,0x14,0x8C,0x2E,0x0E,\ + 0x28,0x2A,0x7C,0x08,0x00,0x00,0x00,0x9B,0x02,0x1D,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x1E,0x46,0x94,0x05,0x02,0x08,0x00,0x00,0xF9,\ + 0x08,0x1C,0xA2,0x09,0x1E,0x22,0x0A,0x23,0xFC,0x0A,\ + 0x26,0xA5,0x0C,0x26,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,\ + 0x12,0x14,0x16,0x18,0x1A,0x1C,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0F,\ + 0x10,0x12,0x13,0x14,0x16,0x18,0x1C,0x1D,0x1E,0x1F,\ + 0x20,0x21,0x22,0x24,0x26,0x28,0x29,0x2A,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x72,0x01\ + } + +// TODO: define your config for Sensor_ID == 1 here, if needed +// group1 is in use: GT911_Config_20130701_185822_QDTP.cfg (mirror_x_y & x_2_y) +#define CTP_CFG_GROUP1 {\ + 0x42,0xFC,0x03,0x00,0x03,0x05,0x35,0x00,0x01,0x3F,\ + 0x1C,0x0F,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x17,0x19,0x1C,0x14,0x8C,0x2E,0x0E,\ + 0x28,0x2A,0x7C,0x08,0x00,0x00,0x00,0x9B,0x02,0x1D,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x1E,0x46,0x94,0x05,0x02,0x08,0x00,0x00,0xF9,\ + 0x08,0x1C,0xA2,0x09,0x1E,0x22,0x0A,0x23,0xFC,0x0A,\ + 0x26,0xA5,0x0C,0x26,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,\ + 0x12,0x14,0x16,0x18,0x1A,0x1C,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0F,\ + 0x10,0x12,0x13,0x14,0x16,0x18,0x1C,0x1D,0x1E,0x1F,\ + 0x20,0x21,0x22,0x24,0x26,0x28,0x29,0x2A,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\ + 0x00,0x00,0x00,0x00,0x76,0x01\ + } + +// TODO: define your config for Sensor_ID == 2 here, if needed +#define CTP_CFG_GROUP2 {\ + } + +// TODO: define your config for Sensor_ID == 2 here, if needed +#define CTP_CFG_GROUP3 {\ + } + +// TODO: define your config for Sensor_ID == 3 here, if needed +#define CTP_CFG_GROUP4 {\ + } + +// TODO: define your config for Sensor_ID == 4 here, if needed +#define CTP_CFG_GROUP5 {\ + } + +// TODO: define your config for Sensor_ID == 5 here, if needed +#define CTP_CFG_GROUP6 {\ + } + +// STEP_2(REQUIRED): Customize your I/O ports & I/O operations +#define GTP_RST_PORT GPIO_TOUCH_RESET +#define GTP_INT_PORT GPIO_TOUCH_IRQ +#define GTP_INT_IRQ gpio_to_irq(GTP_INT_PORT) + +#define GTP_GPIO_AS_INPUT(pin) do{\ + gpio_direction_input(pin);\ + }while(0) +#define GTP_GPIO_AS_INT(pin) do{\ + GTP_GPIO_AS_INPUT(pin);\ + }while(0) +#define GTP_GPIO_GET_VALUE(pin) gpio_get_value(pin) +#define GTP_GPIO_OUTPUT(pin,level) gpio_direction_output(pin,level) +#define GTP_GPIO_REQUEST(pin, label) gpio_request(pin, label) +#define GTP_GPIO_FREE(pin) gpio_free(pin) +#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH} + +// STEP_3(optional): Specify your special config info if needed +#if GTP_CUSTOM_CFG +#define GTP_MAX_HEIGHT 800 +#define GTP_MAX_WIDTH 480 +#define GTP_INT_TRIGGER 0 // 0: Rising 1: Falling +#else +#define GTP_MAX_HEIGHT 4096 +#define GTP_MAX_WIDTH 4096 +#define GTP_INT_TRIGGER 1 +#endif +#define GTP_MAX_TOUCH 5 + +// STEP_4(optional): If keys are available and reported as keys, config your key info here +#if GTP_HAVE_TOUCH_KEY +#define GTP_KEY_TAB {KEY_MENU, KEY_HOME, KEY_BACK} +#endif + +//***************************PART3:OTHER define********************************* +#define GTP_DRIVER_VERSION "V2.0<2013/08/28>" +#define GTP_I2C_NAME "goodix_ts" +#define GTP_POLL_TIME 10 +#define GTP_ADDR_LENGTH 2 +#define GTP_CONFIG_MIN_LENGTH 186 +#define GTP_CONFIG_MAX_LENGTH 240 +#define FAIL 0 +#define SUCCESS 1 +#define SWITCH_OFF 0 +#define SWITCH_ON 1 + +//******************** For GT9XXF Start **********************// +#define GTP_REG_BAK_REF 0x99D0 +#define GTP_REG_MAIN_CLK 0x8020 +#define GTP_REG_CHIP_TYPE 0x8000 +#define GTP_REG_HAVE_KEY 0x804E +#define GTP_REG_MATRIX_DRVNUM 0x8069 +#define GTP_REG_MATRIX_SENNUM 0x806A + +#define GTP_FL_FW_BURN 0x00 +#define GTP_FL_ESD_RECOVERY 0x01 +#define GTP_FL_READ_REPAIR 0x02 + +#define GTP_BAK_REF_SEND 0 +#define GTP_BAK_REF_STORE 1 +#define CFG_LOC_DRVA_NUM 29 +#define CFG_LOC_DRVB_NUM 30 +#define CFG_LOC_SENS_NUM 31 + +#define GTP_CHK_FW_MAX 40 +#define GTP_CHK_FS_MNT_MAX 300 +#define GTP_BAK_REF_PATH "/data/gtp_ref.bin" +#define GTP_MAIN_CLK_PATH "/data/gtp_clk.bin" +#define GTP_RQST_CONFIG 0x01 +#define GTP_RQST_BAK_REF 0x02 +#define GTP_RQST_RESET 0x03 +#define GTP_RQST_MAIN_CLOCK 0x04 +#define GTP_RQST_RESPONDED 0x00 +#define GTP_RQST_IDLE 0xFF + +//******************** For GT9XXF End **********************// +// Registers define +#define GTP_READ_COOR_ADDR 0x814E +#define GTP_REG_SLEEP 0x8040 +#define GTP_REG_SENSOR_ID 0x814A +#define GTP_REG_CONFIG_DATA 0x8047 +#define GTP_REG_VERSION 0x8140 + +#define RESOLUTION_LOC 3 +#define TRIGGER_LOC 8 + +#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0])) +// Log define +#define GTP_INFO(fmt,arg...) printk("<<-GTP-INFO->> "fmt"\n",##arg) +#define GTP_ERROR(fmt,arg...) printk("<<-GTP-ERROR->> "fmt"\n",##arg) +#define GTP_DEBUG(fmt,arg...) do{\ + if(GTP_DEBUG_ON)\ + printk("<<-GTP-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\ + }while(0) +#define GTP_DEBUG_ARRAY(array, num) do{\ + s32 i;\ + u8* a = array;\ + if(GTP_DEBUG_ARRAY_ON)\ + {\ + printk("<<-GTP-DEBUG-ARRAY->>\n");\ + for (i = 0; i < (num); i++)\ + {\ + printk("%02x ", (a)[i]);\ + if ((i + 1 ) %10 == 0)\ + {\ + printk("\n");\ + }\ + }\ + printk("\n");\ + }\ + }while(0) +#define GTP_DEBUG_FUNC() do{\ + if(GTP_DEBUG_FUNC_ON)\ + printk("<<-GTP-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\ + }while(0) +#define GTP_SWAP(x, y) do{\ + typeof(x) z = x;\ + x = y;\ + y = z;\ + }while (0) + +//*****************************End of Part III******************************** + +#endif /* _GOODIX_GT9XX_H_ */ diff --git a/drivers/input/touchscreen/goodix/gt9xx_update.c b/drivers/input/touchscreen/goodix/gt9xx_update.c new file mode 100644 index 00000000..9413fc1b --- /dev/null +++ b/drivers/input/touchscreen/goodix/gt9xx_update.c @@ -0,0 +1,2716 @@ +/* drivers/input/touchscreen/gt9xx_update.c + * + * 2010 - 2012 Goodix Technology. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Latest Version:1.6 + * Author: andrew@goodix.com + * Revision Record: + * V1.0: + * first release. By Andrew, 2012/08/31 + * V1.2: + * add force update,GT9110P pid map. By Andrew, 2012/10/15 + * V1.4: + * 1. add config auto update function; + * 2. modify enter_update_mode; + * 3. add update file cal checksum. + * By Andrew, 2012/12/12 + * V1.6: + * 1. replace guitar_client with i2c_connect_client; + * 2. support firmware header array update. + * By Meta, 2013/03/11 + */ +#include +#include +#include +#include +#include "gt9xx.h" +#if ((GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) || GTP_COMPATIBLE_MODE) +#include "gt9xx_firmware.h" +#endif + +#define GUP_REG_HW_INFO 0x4220 +#define GUP_REG_FW_MSG 0x41E4 +#define GUP_REG_PID_VID 0x8140 + +#define GUP_SEARCH_FILE_TIMES 50 + +#define UPDATE_FILE_PATH_1 "/data/_goodix_update_.bin" +#define UPDATE_FILE_PATH_2 "/sdcard/_goodix_update_.bin" + +#define CONFIG_FILE_PATH_1 "/data/_goodix_config_.cfg" +#define CONFIG_FILE_PATH_2 "/sdcard/_goodix_config_.cfg" + +#define FW_HEAD_LENGTH 14 +#define FW_SECTION_LENGTH 0x2000 +#define FW_DSP_ISP_LENGTH 0x1000 +#define FW_DSP_LENGTH 0x1000 +#define FW_BOOT_LENGTH 0x800 + +#define PACK_SIZE 256 +#define MAX_FRAME_CHECK_TIME 5 + + +#define _bRW_MISCTL__SRAM_BANK 0x4048 +#define _bRW_MISCTL__MEM_CD_EN 0x4049 +#define _bRW_MISCTL__CACHE_EN 0x404B +#define _bRW_MISCTL__TMR0_EN 0x40B0 +#define _rRW_MISCTL__SWRST_B0_ 0x4180 +#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184 +#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190 +#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218 +#define _rRW_MISCTL__BOOT_CTL_ 0x5094 + +#define AUTO_SEARCH_BIN 0x01 +#define AUTO_SEARCH_CFG 0x02 +#define BIN_FILE_READY 0x80 +#define CFG_FILE_READY 0x08 +#define HEADER_FW_READY 0x00 + +#pragma pack(1) +typedef struct { + u8 hw_info[4]; //hardware info// + u8 pid[8]; //product id // + u16 vid; //version id // +} st_fw_head; +#pragma pack() + +typedef struct { + u8 force_update; + u8 fw_flag; + struct file *file; + struct file *cfg_file; + st_fw_head ic_fw_msg; + mm_segment_t old_fs; +} st_update_msg; + +st_update_msg update_msg; +u16 show_len; +u16 total_len; +u8 got_file_flag = 0; +u8 searching_file = 0; + +extern u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]; +extern void gtp_reset_guitar(struct i2c_client *client, s32 ms); +extern s32 gtp_send_cfg(struct i2c_client *client); +extern s32 gtp_read_version(struct i2c_client *, u16* ); +extern struct i2c_client * i2c_connect_client; +extern void gtp_irq_enable(struct goodix_ts_data *ts); +extern void gtp_irq_disable(struct goodix_ts_data *ts); +extern s32 gtp_i2c_read_dbl_check(struct i2c_client *, u16, u8 *, int); + +#define _CLOSE_FILE(p_file) if (p_file && !IS_ERR(p_file)) \ + { \ + filp_close(p_file, NULL); \ + } + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +#endif +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret=-1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + //msgs[0].scl_rate = 300 * 1000; // for Rockchip, etc + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + //msgs[1].scl_rate = 300 * 1000; // for Rockchip, etc. + + while(retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if(ret == 2)break; + retries++; + } + + return ret; +} + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_write(struct i2c_client *client,u8 *buf,s32 len) +{ + struct i2c_msg msg; + s32 ret=-1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + //msg.scl_rate = 300 * 1000; // for Rockchip, etc + + while(retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1)break; + retries++; + } + + return ret; +} + +static s32 gup_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16]; + u8 sensor_id = 0; + u16 version = 0; + + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 cfg_info_group6[] = CTP_CFG_GROUP6; + u8 *send_cfg_buf[] = {cfg_info_group1, cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5, cfg_info_group6 + }; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5), + CFG_GROUP_LEN(cfg_info_group6) + }; + + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } else { + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + return -1; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + return -1; + } + } + + GTP_DEBUG("Sensor_ID: %d", sensor_id); + + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Sensor_ID(%d) matches with NULL or INVALID CONFIG GROUP! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id); + return -1; + } + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + + if (ret == SUCCESS) { + GTP_DEBUG("CFG_GROUP%d Config Version: %d, IC Config Version: %d", sensor_id+1, + send_cfg_buf[sensor_id][0], opr_buf[0]); + + send_cfg_buf[sensor_id][0] = opr_buf[0]; + ts->fixed_cfg = 0; + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -1; + } + + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); + + GTP_DEBUG("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { //RISING + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { //FALLING + config[TRIGGER_LOC] |= 0x01; + } + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + + GTP_DEBUG_FUNC(); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } + gtp_read_version(ts->client, &version); + msleep(10); + return 0; +} + + +static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8* msg, s32 len) +{ + s32 i = 0; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + + for (i = 0; i < 5; i++) { + if (gup_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Read data from 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val) +{ + s32 i = 0; + u8 msg[3]; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + msg[2] = val; + + for (i = 0; i < 5; i++) { + if (gup_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Set data to 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_get_ic_fw_msg(struct i2c_client *client) +{ + s32 ret = -1; + u8 retry = 0; + u8 buf[16]; + u8 i; + + // step1:get hardware info + ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO, &buf[GTP_ADDR_LENGTH], 4); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get hw_info failed,exit"); + return FAIL; + } + + // buf[2~5]: 00 06 90 00 + // hw_info: 00 90 06 00 + for(i=0; i<4; i++) { + update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i]; + } + GTP_DEBUG("IC Hardware info:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + // step2:get firmware message + for(retry=0; retry<2; retry++) { + ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1); + if(FAIL == ret) { + GTP_ERROR("Read firmware message fail."); + return ret; + } + + update_msg.force_update = buf[GTP_ADDR_LENGTH]; + if((0xBE != update_msg.force_update)&&(!retry)) { + GTP_INFO("The check sum in ic is error."); + GTP_INFO("The IC will be updated by force."); + continue; + } + break; + } + GTP_DEBUG("IC force update flag:0x%x", update_msg.force_update); + + // step3:get pid & vid + ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID, &buf[GTP_ADDR_LENGTH], 6); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get pid & vid failed,exit"); + return FAIL; + } + + memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid)); + memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4); + GTP_DEBUG("IC Product id:%s", update_msg.ic_fw_msg.pid); + + //GT9XX PID MAPPING + /*|-----FLASH-----RAM-----| + |------918------918-----| + |------968------968-----| + |------913------913-----| + |------913P-----913P----| + |------927------927-----| + |------927P-----927P----| + |------9110-----9110----| + |------9110P----9111----|*/ + if(update_msg.ic_fw_msg.pid[0] != 0) { + if(!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) { + GTP_DEBUG("IC Mapping Product id:%s", update_msg.ic_fw_msg.pid); + memcpy(update_msg.ic_fw_msg.pid, "9110P", 5); + } + } + + update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH+4] + (buf[GTP_ADDR_LENGTH+5]<<8); + GTP_DEBUG("IC version id:%04x", update_msg.ic_fw_msg.vid); + + return SUCCESS; +} + +s32 gup_enter_update_mode(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + //step1:RST output low last at least 2ms + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + msleep(2); + + //step2:select I2C slave addr,INT:0--0xBA;1--0x28. + GTP_GPIO_OUTPUT(GTP_INT_PORT, (client->addr == 0x14)); + msleep(2); + + //step3:RST output high reset guitar + GTP_GPIO_OUTPUT(GTP_RST_PORT, 1); + + //20121211 modify start + msleep(5); + while(retry++ < 200) { + //step4:Hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + //step5:Confirm hold + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if(ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if(0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if(retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + //step6:DSP_CK and DSP_ALU_CK PowerOn + ret = gup_set_ic_msg(client, 0x4010, 0x00); + + //20121211 modify end + return ret; +} + +void gup_leave_update_mode(void) +{ + GTP_GPIO_AS_INT(GTP_INT_PORT); + + GTP_DEBUG("[leave_update_mode]reset chip."); + gtp_reset_guitar(i2c_connect_client, 20); +} + +// Get the correct nvram data +// The correct conditions: +// 1. the hardware info is the same +// 2. the product id is the same +// 3. the firmware version in update file is greater than the firmware version in ic +// or the check sum in ic is wrong +/* Update Conditions: + 1. Same hardware info + 2. Same PID + 3. File VID > IC VID + Force Update Conditions: + 1. Wrong ic firmware checksum + 2. INVALID IC PID or VID + 3. (IC PID == 91XX || File PID == 91XX) && (File VID > IC VID) +*/ + +static u8 gup_enter_update_judge(st_fw_head *fw_head) +{ + u16 u16_tmp; + s32 i = 0; + s32 pid_cmp_len = 0; + u16_tmp = fw_head->vid; + fw_head->vid = (u16)(u16_tmp>>8) + (u16)(u16_tmp<<8); + + GTP_DEBUG("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_DEBUG("FILE PID:%s", fw_head->pid); + GTP_DEBUG("FILE VID:%04x", fw_head->vid); + + GTP_DEBUG("IC HARDWARE INFO:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + GTP_DEBUG("IC PID:%s", update_msg.ic_fw_msg.pid); + GTP_DEBUG("IC VID:%04x", update_msg.ic_fw_msg.vid); + + //First two conditions + if ( !memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info, sizeof(update_msg.ic_fw_msg.hw_info))) { + GTP_DEBUG("Get the same hardware info."); + if( update_msg.force_update != 0xBE ) { + GTP_INFO("FW chksum error,need enter update."); + return SUCCESS; + } + + // 20130523 start + if (strlen(update_msg.ic_fw_msg.pid) < 3) { + GTP_INFO("Illegal IC pid, need enter update"); + return SUCCESS; + } else { + for (i = 0; i < 3; i++) { + if ((update_msg.ic_fw_msg.pid[i] < 0x30) || (update_msg.ic_fw_msg.pid[i] > 0x39)) { + GTP_INFO("Illegal IC pid, out of bound, need enter update"); + return SUCCESS; + } + } + } + // 20130523 end + + // avoid situations like gt9xx to gt9xxP, gt9xxS etc. + pid_cmp_len = strlen(fw_head->pid); + if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid)) { + pid_cmp_len = strlen(update_msg.ic_fw_msg.pid); + } + + if (( !memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) || + (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4))|| + (!memcmp(fw_head->pid, "91XX", 4))) { + if(!memcmp(fw_head->pid, "91XX", 4)) { + GTP_DEBUG("Force none same pid update mode."); + } else { + GTP_DEBUG("Get the same pid."); + } + //The third condition + if (fw_head->vid > update_msg.ic_fw_msg.vid) { + GTP_INFO("Need enter update."); + return SUCCESS; + } + GTP_ERROR("Don't meet the third condition."); + GTP_ERROR("File VID <= Ic VID, update aborted!"); + } else { + GTP_ERROR("File PID != Ic PID, update aborted!"); + } + } else { + GTP_ERROR("Different Hardware, update aborted!"); + } + return FAIL; +} + + + +#if GTP_AUTO_UPDATE_CFG +static u8 ascii2hex(u8 a) +{ + s8 value = 0; + + if(a >= '0' && a <= '9') { + value = a - '0'; + } else if(a >= 'A' && a <= 'F') { + value = a - 'A' + 0x0A; + } else if(a >= 'a' && a <= 'f') { + value = a - 'a' + 0x0A; + } else { + value = 0xff; + } + + return value; +} + +static s8 gup_update_config(struct i2c_client *client) +{ + s32 file_len = 0; + s32 ret = 0; + s32 i = 0; + s32 file_cfg_len = 0; + s32 chip_cfg_len = 0; + s32 count = 0; + u8 *buf; + u8 *pre_buf; + u8 *file_config; + //u8 checksum = 0; + u8 pid[8]; + + if(NULL == update_msg.cfg_file) { + GTP_ERROR("[update_cfg]No need to upgrade config!"); + return FAIL; + } + file_len = update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_END); + + ret = gup_get_ic_msg(client, GUP_REG_PID_VID, pid, 6); + if(FAIL == ret) { + GTP_ERROR("[update_cfg]Read product id & version id fail."); + return FAIL; + } + pid[5] = '\0'; + GTP_DEBUG("update cfg get pid:%s", &pid[GTP_ADDR_LENGTH]); + + chip_cfg_len = 186; + if(!memcmp(&pid[GTP_ADDR_LENGTH], "968", 3) || + !memcmp(&pid[GTP_ADDR_LENGTH], "910", 3) || + !memcmp(&pid[GTP_ADDR_LENGTH], "960", 3)) { + chip_cfg_len = 228; + } + GTP_DEBUG("[update_cfg]config file len:%d", file_len); + GTP_DEBUG("[update_cfg]need config len:%d",chip_cfg_len); + if((file_len+5) < chip_cfg_len*5) { + GTP_ERROR("Config length error"); + return -1; + } + + buf = (u8*)kzalloc(file_len, GFP_KERNEL); + pre_buf = (u8*)kzalloc(file_len, GFP_KERNEL); + file_config = (u8*)kzalloc(chip_cfg_len + GTP_ADDR_LENGTH, GFP_KERNEL); + update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_SET); + + GTP_DEBUG("[update_cfg]Read config from file."); + ret = update_msg.cfg_file->f_op->read(update_msg.cfg_file, (char*)pre_buf, file_len, &update_msg.cfg_file->f_pos); + if(ret<0) { + GTP_ERROR("[update_cfg]Read config file failed."); + goto update_cfg_file_failed; + } + + GTP_DEBUG("[update_cfg]Delete illgal charactor."); + for(i=0,count=0; i> 8; + file_config[1] = GTP_REG_CONFIG_DATA & 0xff; + for(i=0,file_cfg_len=GTP_ADDR_LENGTH; i 0) { + GTP_INFO("[update_cfg]Send config SUCCESS."); + break; + } + GTP_ERROR("[update_cfg]Send config i2c error."); + } + +update_cfg_file_failed: + kfree(pre_buf); + kfree(buf); + kfree(file_config); + return ret; +} + +#endif + +#if GTP_AUTO_UPDATE +static void gup_search_file(s32 search_type) +{ + s32 i = 0; + struct file *pfile = NULL; + + got_file_flag = 0x00; + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force exiting file searching"); + got_file_flag = 0x00; + return; + } + + if (search_type & AUTO_SEARCH_BIN) { + + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", UPDATE_FILE_PATH_1, UPDATE_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(UPDATE_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(UPDATE_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_2); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + } else { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_1); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + if (got_file_flag & BIN_FILE_READY) { +#if GTP_AUTO_UPDATE_CFG + if (search_type & AUTO_SEARCH_CFG) { + i = GUP_SEARCH_FILE_TIMES; // Bin & Cfg File required to be in the same directory + } else +#endif + { + searching_file = 0; + return; + } + } + } + +#if GTP_AUTO_UPDATE_CFG + if ( (search_type & AUTO_SEARCH_CFG) && !(got_file_flag & CFG_FILE_READY) ) { + GTP_DEBUG("Search for %s, %s for config update.(%d/%d)", CONFIG_FILE_PATH_1, CONFIG_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(CONFIG_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(CONFIG_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_2); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + } else { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_1); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + if (got_file_flag & CFG_FILE_READY) { + searching_file = 0; + return; + } + } +#endif + msleep(3000); + } + searching_file = 0; +} +#endif + + +static u8 gup_check_update_file(struct i2c_client *client, st_fw_head* fw_head, u8* path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + u8 buf[FW_HEAD_LENGTH]; + + if (path) { + GTP_DEBUG("Update File path:%s, %d", path, strlen(path)); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + got_file_flag = BIN_FILE_READY; + } else { +#if GTP_AUTO_UPDATE +#if GTP_HEADER_FW_UPDATE + if (sizeof(gtp_default_FW) < (FW_HEAD_LENGTH+FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID header_fw_array, check your gt9xx_firmware.h file!"); + return FAIL; + } + + got_file_flag = HEADER_FW_READY; + + memcpy(fw_head, >p_default_FW[0], FW_HEAD_LENGTH); + + //check firmware legality + fw_checksum = 0; + for(i=0; if_op->llseek(update_msg.file, 0, SEEK_SET); + + ret = update_msg.file->f_op->read(update_msg.file, (char*)buf, FW_HEAD_LENGTH, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware head in update file error."); + goto load_failed; + } + memcpy(fw_head, buf, FW_HEAD_LENGTH); + + //check firmware legality + fw_checksum = 0; + for(i=0; if_op->read(update_msg.file, (char*)buf, 2, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware file error."); + goto load_failed; + } + //GTP_DEBUG("BUF[0]:%x", buf[0]); + temp = (buf[0]<<8) + buf[1]; + fw_checksum += temp; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if(fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + goto load_failed; + } + + return SUCCESS; + +load_failed: + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + + return FAIL; +} + + + +static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf, u16 start_addr, u16 total_length) +{ + s32 ret = 0; + u16 burn_addr = start_addr; + u16 frame_length = 0; + u16 burn_length = 0; + u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 retry = 0; + + GTP_DEBUG("Begin burn %dk data to addr 0x%x", (total_length/1024), start_addr); + while(burn_length < total_length) { + GTP_DEBUG("B/T:%04d/%04d", burn_length, total_length); + frame_length = ((total_length - burn_length) > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length); + wr_buf[0] = (u8)(burn_addr>>8); + rd_buf[0] = wr_buf[0]; + wr_buf[1] = (u8)burn_addr; + rd_buf[1] = wr_buf[1]; + memcpy(&wr_buf[GTP_ADDR_LENGTH], &burn_buf[burn_length], frame_length); + + for(retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) { + ret = gup_i2c_write(client, wr_buf, GTP_ADDR_LENGTH + frame_length); + if(ret <= 0) { + GTP_ERROR("Write frame data i2c error."); + continue; + } + ret = gup_i2c_read(client, rd_buf, GTP_ADDR_LENGTH + frame_length); + if(ret <= 0) { + GTP_ERROR("Read back frame data i2c error."); + continue; + } + + if(memcmp(&wr_buf[GTP_ADDR_LENGTH], &rd_buf[GTP_ADDR_LENGTH], frame_length)) { + GTP_ERROR("Check frame data fail,not equal."); + GTP_DEBUG("write array:"); + GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH], frame_length); + GTP_DEBUG("read array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + continue; + } else { + //GTP_DEBUG("Check frame data success."); + break; + } + } + if(retry >= MAX_FRAME_CHECK_TIME) { + GTP_ERROR("Burn frame data time out,exit."); + return FAIL; + } + burn_length += frame_length; + burn_addr += frame_length; + } + return SUCCESS; +} + +static u8 gup_load_section_file(u8* buf, u16 offset, u16 length) +{ + s32 ret = 0; + +#if GTP_HEADER_FW_UPDATE + if (got_file_flag == HEADER_FW_READY) { + memcpy(buf, >p_default_FW[FW_HEAD_LENGTH + offset], length); + return SUCCESS; + } +#endif + if( (update_msg.file == NULL) || IS_ERR(update_msg.file) ) { + GTP_ERROR("cannot find update file,load section file fail."); + return FAIL; + } + update_msg.file->f_pos = FW_HEAD_LENGTH + offset; + + ret = update_msg.file->f_op->read(update_msg.file, (char*)buf, length, &update_msg.file->f_pos); + if(ret < 0) { + GTP_ERROR("Read update file fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_recall_check(struct i2c_client *client, u8* chk_src, u16 start_rd_addr, u16 chk_length) +{ + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + s32 ret = 0; + u16 recall_addr = start_rd_addr; + u16 recall_length = 0; + u16 frame_length = 0; + + while(recall_length < chk_length) { + frame_length = ((chk_length - recall_length) > PACK_SIZE) ? PACK_SIZE : (chk_length - recall_length); + ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length); + if(ret <= 0) { + GTP_ERROR("recall i2c error,exit"); + return FAIL; + } + + if(memcmp(&rd_buf[GTP_ADDR_LENGTH], &chk_src[recall_length], frame_length)) { + GTP_ERROR("Recall frame data fail,not equal."); + GTP_DEBUG("chk_src array:"); + GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length); + GTP_DEBUG("recall array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + return FAIL; + } + + recall_length += frame_length; + recall_addr += frame_length; + } + GTP_DEBUG("Recall check %dk firmware success.", (chk_length/1024)); + + return SUCCESS; +} + +static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u8 bank_cmd ) +{ + s32 ret = 0; + u8 rd_buf[5]; + + //step1:hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & dsp fail."); + return FAIL; + } + + //step2:set scramble + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]set scramble fail."); + return FAIL; + } + + //step3:select bank + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + //step4:enable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + //step5:burn 8k fw section + ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_section]burn fw_section fail."); + return FAIL; + } + + //step6:hold ss51 & release dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & release dsp fail."); + return FAIL; + } + //must delay + msleep(1); + + //step7:send burn cmd to move data to flash from sram + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0f); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]Get burn state fail"); + return FAIL; + } + msleep(10); + //GTP_DEBUG("[burn_fw_section]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + } while(rd_buf[GTP_ADDR_LENGTH]); + + //step8:select bank + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + //step9:enable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + //step10:recall 8k fw section + ret = gup_recall_check(client, fw_section, start_addr, FW_SECTION_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_section]recall check 8k firmware fail."); + return FAIL; + } + + //step11:disable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_fw_section]disable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_dsp_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8* fw_dsp_isp = NULL; + u8 retry = 0; + + GTP_DEBUG("[burn_dsp_isp]Begin burn dsp isp---->>"); + + //step1:alloc memory + GTP_DEBUG("[burn_dsp_isp]step1:alloc memory"); + while(retry++ < 5) { + fw_dsp_isp = (u8*)kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL); + if(fw_dsp_isp == NULL) { + continue; + } else { + GTP_INFO("[burn_dsp_isp]Alloc %dk byte memory success.", (FW_DSP_ISP_LENGTH/1024)); + break; + } + } + if(retry >= 5) { + GTP_ERROR("[burn_dsp_isp]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load dsp isp file data + GTP_DEBUG("[burn_dsp_isp]step2:load dsp isp file data"); + ret = gup_load_section_file(fw_dsp_isp, (4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH), FW_DSP_ISP_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]load firmware dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + //step3:disable wdt,clear cache enable + GTP_DEBUG("[burn_dsp_isp]step3:disable wdt,clear cache enable"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]disable wdt fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]clear cache enable fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step4:hold ss51 & dsp + GTP_DEBUG("[burn_dsp_isp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step5:set boot from sram + GTP_DEBUG("[burn_dsp_isp]step5:set boot from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set boot from sram fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step6:software reboot + GTP_DEBUG("[burn_dsp_isp]step6:software reboot"); + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]software reboot fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step7:select bank2 + GTP_DEBUG("[burn_dsp_isp]step7:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]select bank2 fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step8:enable accessing code + GTP_DEBUG("[burn_dsp_isp]step8:enable accessing code"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]enable accessing code fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + //step9:burn 4k dsp_isp + GTP_DEBUG("[burn_dsp_isp]step9:burn 4k dsp_isp"); + ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]burn dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + //step10:set scramble + GTP_DEBUG("[burn_dsp_isp]step10:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + ret = SUCCESS; + +exit_burn_dsp_isp: + kfree(fw_dsp_isp); + return ret; +} + +static u8 gup_burn_fw_ss51(struct i2c_client *client) +{ + u8* fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_DEBUG("[burn_fw_ss51]Begin burn ss51 firmware---->>"); + + //step1:alloc memory + GTP_DEBUG("[burn_fw_ss51]step1:alloc memory"); + while(retry++ < 5) { + fw_ss51 = (u8*)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if(fw_ss51 == NULL) { + continue; + } else { + GTP_INFO("[burn_fw_ss51]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if(retry >= 5) { + GTP_ERROR("[burn_fw_ss51]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load ss51 firmware section 1 file data + GTP_DEBUG("[burn_fw_ss51]step2:load ss51 firmware section 1 file data"); + ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + //step3:clear control flag + GTP_DEBUG("[burn_fw_ss51]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_fw_ss51]clear control flag fail."); + ret = FAIL; + goto exit_burn_fw_ss51; + } + + //step4:burn ss51 firmware section 1 + GTP_DEBUG("[burn_fw_ss51]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + //step5:load ss51 firmware section 2 file data + GTP_DEBUG("[burn_fw_ss51]step5:load ss51 firmware section 2 file data"); + ret = gup_load_section_file(fw_ss51, FW_SECTION_LENGTH, FW_SECTION_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + //step6:burn ss51 firmware section 2 + GTP_DEBUG("[burn_fw_ss51]step6:burn ss51 firmware section 2"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + //step7:load ss51 firmware section 3 file data + GTP_DEBUG("[burn_fw_ss51]step7:load ss51 firmware section 3 file data"); + ret = gup_load_section_file(fw_ss51, 2*FW_SECTION_LENGTH, FW_SECTION_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + //step8:burn ss51 firmware section 3 + GTP_DEBUG("[burn_fw_ss51]step8:burn ss51 firmware section 3"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + //step9:load ss51 firmware section 4 file data + GTP_DEBUG("[burn_fw_ss51]step9:load ss51 firmware section 4 file data"); + ret = gup_load_section_file(fw_ss51, 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + //step10:burn ss51 firmware section 4 + GTP_DEBUG("[burn_fw_ss51]step10:burn ss51 firmware section 4"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + ret = SUCCESS; + +exit_burn_fw_ss51: + kfree(fw_ss51); + return ret; +} + +static u8 gup_burn_fw_dsp(struct i2c_client *client) +{ + s32 ret = 0; + u8* fw_dsp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_DEBUG("[burn_fw_dsp]Begin burn dsp firmware---->>"); + //step1:alloc memory + GTP_DEBUG("[burn_fw_dsp]step1:alloc memory"); + while(retry++ < 5) { + fw_dsp = (u8*)kzalloc(FW_DSP_LENGTH, GFP_KERNEL); + if(fw_dsp == NULL) { + continue; + } else { + GTP_INFO("[burn_fw_dsp]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if(retry >= 5) { + GTP_ERROR("[burn_fw_dsp]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load firmware dsp + GTP_DEBUG("[burn_fw_dsp]step2:load firmware dsp"); + ret = gup_load_section_file(fw_dsp, 4*FW_SECTION_LENGTH, FW_DSP_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]load firmware dsp fail."); + goto exit_burn_fw_dsp; + } + + //step3:select bank3 + GTP_DEBUG("[burn_fw_dsp]step3:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if(ret <= 0) { + GTP_ERROR("[burn_fw_dsp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //step4:hold ss51 & dsp + GTP_DEBUG("[burn_fw_dsp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) { + GTP_ERROR("[burn_fw_dsp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //step5:set scramble + GTP_DEBUG("[burn_fw_dsp]step5:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_fw_dsp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + //step6:release ss51 & dsp + GTP_DEBUG("[burn_fw_dsp]step6:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); //20121211 + if(ret <= 0) { + GTP_ERROR("[burn_fw_dsp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + //must delay + msleep(1); + + //step7:burn 4k dsp firmware + GTP_DEBUG("[burn_fw_dsp]step7:burn 4k dsp firmware"); + ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]burn fw_section fail."); + goto exit_burn_fw_dsp; + } + + //step8:send burn cmd to move data to flash from sram + GTP_DEBUG("[burn_fw_dsp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05); + if(ret <= 0) { + GTP_ERROR("[burn_fw_dsp]send burn cmd fail."); + goto exit_burn_fw_dsp; + } + GTP_DEBUG("[burn_fw_dsp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if(ret <= 0) { + GTP_ERROR("[burn_fw_dsp]Get burn state fail"); + goto exit_burn_fw_dsp; + } + msleep(10); + //GTP_DEBUG("[burn_fw_dsp]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + } while(rd_buf[GTP_ADDR_LENGTH]); + + //step9:recall check 4k dsp firmware + GTP_DEBUG("[burn_fw_dsp]step9:recall check 4k dsp firmware"); + ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]recall check 4k dsp firmware fail."); + goto exit_burn_fw_dsp; + } + + ret = SUCCESS; + +exit_burn_fw_dsp: + kfree(fw_dsp); + return ret; +} + +static u8 gup_burn_fw_boot(struct i2c_client *client) +{ + s32 ret = 0; + u8* fw_boot = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_DEBUG("[burn_fw_boot]Begin burn bootloader firmware---->>"); + + //step1:Alloc memory + GTP_DEBUG("[burn_fw_boot]step1:Alloc memory"); + while(retry++ < 5) { + fw_boot = (u8*)kzalloc(FW_BOOT_LENGTH, GFP_KERNEL); + if(fw_boot == NULL) { + continue; + } else { + GTP_INFO("[burn_fw_boot]Alloc %dk byte memory success.", (FW_BOOT_LENGTH/1024)); + break; + } + } + if(retry >= 5) { + GTP_ERROR("[burn_fw_boot]Alloc memory fail,exit."); + return FAIL; + } + + //step2:load firmware bootloader + GTP_DEBUG("[burn_fw_boot]step2:load firmware bootloader"); + ret = gup_load_section_file(fw_boot, (4*FW_SECTION_LENGTH+FW_DSP_LENGTH), FW_BOOT_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_boot]load firmware dsp fail."); + goto exit_burn_fw_boot; + } + + //step3:hold ss51 & dsp + GTP_DEBUG("[burn_fw_boot]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step4:set scramble + GTP_DEBUG("[burn_fw_boot]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step5:release ss51 & dsp + GTP_DEBUG("[burn_fw_boot]step5:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); //20121211 + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + //must delay + msleep(1); + + //step6:select bank3 + GTP_DEBUG("[burn_fw_boot]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step7:burn 2k bootloader firmware + GTP_DEBUG("[burn_fw_boot]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_boot]burn fw_section fail."); + goto exit_burn_fw_boot; + } + + //step7:send burn cmd to move data to flash from sram + GTP_DEBUG("[burn_fw_boot]step7:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]send burn cmd fail."); + goto exit_burn_fw_boot; + } + GTP_DEBUG("[burn_fw_boot]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]Get burn state fail"); + goto exit_burn_fw_boot; + } + msleep(10); + //GTP_DEBUG("[burn_fw_boot]Get burn state:%d.", rd_buf[GTP_ADDR_LENGTH]); + } while(rd_buf[GTP_ADDR_LENGTH]); + + //step8:recall check 2k bootloader firmware + GTP_DEBUG("[burn_fw_boot]step8:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if(FAIL == ret) { + GTP_ERROR("[burn_fw_boot]recall check 4k dsp firmware fail."); + goto exit_burn_fw_boot; + } + + //step9:enable download DSP code + GTP_DEBUG("[burn_fw_boot]step9:enable download DSP code "); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]enable download DSP code fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + //step10:release ss51 & hold dsp + GTP_DEBUG("[burn_fw_boot]step10:release ss51 & hold dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08); + if(ret <= 0) { + GTP_ERROR("[burn_fw_boot]release ss51 & hold dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + ret = SUCCESS; + +exit_burn_fw_boot: + kfree(fw_boot); + return ret; +} + +s32 gup_update_proc(void *dir) +{ + s32 ret = 0; + s32 update_ret = FAIL; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts = NULL; + + GTP_DEBUG("[update_proc]Begin update ......"); + + ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_AUTO_UPDATE + if (searching_file) { + u8 timeout = 0; + searching_file = 0; // exit .bin update file searching + GTP_INFO("Exiting searching .bin update file..."); + while ((show_len != 200) && (show_len != 100) && (timeout++ < 100)) { // wait for auto update quitted completely + msleep(100); + } + } +#endif + + show_len = 1; + total_len = 100; + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return gup_fw_download_proc(dir, GTP_FL_FW_BURN); + } +#endif + + update_msg.file = NULL; + ret = gup_check_update_file(i2c_connect_client, &fw_head, (u8*)dir); //20121211 + if(FAIL == ret) { + GTP_ERROR("[update_proc]check update file fail."); + goto file_fail; + } + + ret = gup_get_ic_fw_msg(i2c_connect_client); + if(FAIL == ret) { + GTP_ERROR("[update_proc]get ic message fail."); + goto file_fail; + } + + ret = gup_enter_update_judge(&fw_head); + if(FAIL == ret) { + GTP_ERROR("[update_proc]Check *.bin file fail."); + goto file_fail; + } + + ts->enter_update = 1; + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_enter_update_mode(i2c_connect_client); + if(FAIL == ret) { + GTP_ERROR("[update_proc]enter update mode fail."); + goto update_fail; + } + + while(retry++ < 5) { + show_len = 10; + total_len = 100; + ret = gup_burn_dsp_isp(i2c_connect_client); + if(FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp isp fail."); + continue; + } + + show_len += 10; + ret = gup_burn_fw_ss51(i2c_connect_client); + if(FAIL == ret) { + GTP_ERROR("[update_proc]burn ss51 firmware fail."); + continue; + } + + show_len += 40; + ret = gup_burn_fw_dsp(i2c_connect_client); + if(FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp firmware fail."); + continue; + } + + show_len += 20; + ret = gup_burn_fw_boot(i2c_connect_client); + if(FAIL == ret) { + GTP_ERROR("[update_proc]burn bootloader firmware fail."); + continue; + } + show_len += 10; + GTP_INFO("[update_proc]UPDATE SUCCESS."); + break; + } + + if (retry >= 5) { + GTP_ERROR("[update_proc]retry timeout,UPDATE FAIL."); + update_ret = FAIL; + } else { + update_ret = SUCCESS; + } + +update_fail: + if (got_file_flag & BIN_FILE_READY) { + if (update_msg.old_fs) { + set_fs(update_msg.old_fs); + } + } + GTP_DEBUG("[update_proc]leave update mode."); + gup_leave_update_mode(); + + if (SUCCESS == update_ret) { + if (ts->fw_error) { + GTP_INFO("firmware error auto update, resent config!"); + gup_init_panel(ts); + } else { + GTP_DEBUG("[update_proc]send config."); + ret = gtp_send_cfg(i2c_connect_client); + if (ret < 0) { + GTP_ERROR("[update_proc]send config fail."); + } else { + msleep(100); + } + } + } + ts->enter_update = 0; + gtp_irq_enable(ts); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + +file_fail: + _CLOSE_FILE(update_msg.file); + +#if (GTP_AUTO_UPDATE && GTP_AUTO_UPDATE_CFG && GTP_HEADER_FW_UPDATE) + if (NULL == dir) { + gup_search_file(AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if(ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); //waiting config to be stored in FLASH. + } + } +#endif + + total_len = 100; + if (SUCCESS == update_ret) { + show_len = 100; + return SUCCESS; + } else { + show_len = 200; + return FAIL; + } +} + +#if GTP_AUTO_UPDATE +u8 gup_init_update_proc(struct goodix_ts_data *ts) +{ + struct task_struct *thread = NULL; + + GTP_INFO("Ready to run update thread."); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + thread = kthread_run(gup_update_proc, "update", "fl update"); + } else +#endif + { + thread = kthread_run(gup_update_proc, (void*)NULL, "guitar_update"); + } + if (IS_ERR(thread)) { + GTP_ERROR("Failed to create update thread.\n"); + return -1; + } + + return 0; +} +#endif + + +//************************** For GT9XXF Start ***********************// +#define FW_DOWNLOAD_LENGTH 0x4000 +#define FW_SS51_SECTION_LEN 0x2000 // 4 section, each 8k +#define FL_PACK_SIZE 1024 +#define GUP_FW_CHK_SIZE FL_PACK_SIZE //FL_PACK_SIZE + +#define FL_UPDATE_PATH "/data/_fl_update_.bin" +#define FL_UPDATE_PATH_SD "/sdcard/_fl_update_.bin" +//for clk cal +#define PULSE_LENGTH (200) +#define INIT_CLK_DAC (50) +#define MAX_CLK_DAC (120) +#define CLK_AVG_TIME (1) +#define MILLION 1000000 + +#define _wRW_MISCTL__RG_DMY 0x4282 +#define _bRW_MISCTL__RG_OSC_CALIB 0x4268 +#define _fRW_MISCTL__GIO0 0x41e9 +#define _fRW_MISCTL__GIO1 0x41ed +#define _fRW_MISCTL__GIO2 0x41f1 +#define _fRW_MISCTL__GIO3 0x41f5 +#define _fRW_MISCTL__GIO4 0x41f9 +#define _fRW_MISCTL__GIO5 0x41fd +#define _fRW_MISCTL__GIO6 0x4201 +#define _fRW_MISCTL__GIO7 0x4205 +#define _fRW_MISCTL__GIO8 0x4209 +#define _fRW_MISCTL__GIO9 0x420d +#define _fRW_MISCTL__MEA 0x41a0 +#define _bRW_MISCTL__MEA_MODE 0x41a1 +#define _wRW_MISCTL__MEA_MAX_NUM 0x41a4 +#define _dRO_MISCTL__MEA_VAL 0x41b0 +#define _bRW_MISCTL__MEA_SRCSEL 0x41a3 +#define _bRO_MISCTL__MEA_RDY 0x41a8 +#define _rRW_MISCTL__ANA_RXADC_B0_ 0x4250 +#define _bRW_MISCTL__RG_LDO_A18_PWD 0x426f +#define _bRW_MISCTL__RG_BG_PWD 0x426a +#define _bRW_MISCTL__RG_CLKGEN_PWD 0x4269 +#define _fRW_MISCTL__RG_RXADC_PWD 0x426a +#define _bRW_MISCTL__OSC_CK_SEL 0x4030 +#define _rRW_MISCTL_RG_DMY83 0x4283 +#define _rRW_MISCTL__GIO1CTL_B2_ 0x41ee +#define _rRW_MISCTL__GIO1CTL_B1_ 0x41ed + + +#if GTP_COMPATIBLE_MODE + +u8 i2c_opr_buf[GTP_ADDR_LENGTH + FL_PACK_SIZE] = {0}; +u8 chk_cmp_buf[FL_PACK_SIZE] = {0}; + +extern s32 gtp_fw_startup(struct i2c_client *client); +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode); +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len); +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len); + + +u8 gup_check_fs_mounted(char *path_name) +{ + struct path root_path; + struct path path; + int err; + err = kern_path("/", LOOKUP_FOLLOW, &root_path); + + if (err) { + GTP_DEBUG("\"/\" NOT Mounted: %d", err); + return FAIL; + } + err = kern_path(path_name, LOOKUP_FOLLOW, &path); + + if (err) { + GTP_DEBUG("%s NOT Mounted: %d", path_name, err); + return FAIL; + } + +#if 1 + return SUCCESS; +#else + if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) { + //-- not mounted + return FAIL; + } else { + return SUCCESS; + } +#endif +} + +s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 write_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + write_bytes = FL_PACK_SIZE; + } else { + write_bytes = len; + } + memcpy(i2c_opr_buf + 2, tx_buf, write_bytes); + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_write(client, i2c_opr_buf, write_bytes + GTP_ADDR_LENGTH); + if (ret == 1) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C write 0x%04X %d bytes failed!", addr, write_bytes); + return -1; + } + addr += write_bytes; + len -= write_bytes; + tx_buf += write_bytes; + } + + return 1; +} + +s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 read_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + read_bytes = FL_PACK_SIZE; + } else { + read_bytes = len; + } + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_read(client, i2c_opr_buf, read_bytes + GTP_ADDR_LENGTH); + if (ret == 2) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C read 0x%04X %d bytes failed!", addr, read_bytes); + return -1; + } + memcpy(tx_buf, i2c_opr_buf + 2, read_bytes); + addr += read_bytes; + len -= read_bytes; + tx_buf += read_bytes; + } + return 2; +} + + + +// main clock calibration +// bit: 0~7, val: 0/1 +static void gup_bit_write(s32 addr, s32 bit, s32 val) +{ + u8 buf; + i2c_read_bytes(i2c_connect_client, addr, &buf, 1); + + buf = (buf & (~((u8)1 << bit))) | ((u8)val << bit); + + i2c_write_bytes(i2c_connect_client, addr, &buf, 1); +} + +static void gup_clk_count_init(s32 bCh, s32 bCNT) +{ + u8 buf; + + //_fRW_MISCTL__MEA_EN = 0; //Frequency measure enable + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + //_fRW_MISCTL__MEA_CLR = 1; //Frequency measure clear + gup_bit_write(_fRW_MISCTL__MEA, 1, 1); + //_bRW_MISCTL__MEA_MODE = 0; //Pulse mode + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_MODE, &buf, 1); + //_bRW_MISCTL__MEA_SRCSEL = 8 + bCh; //From GIO1 + buf = 8 + bCh; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_SRCSEL, &buf, 1); + //_wRW_MISCTL__MEA_MAX_NUM = bCNT; //Set the Measure Counts = 1 + buf = bCNT; + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__MEA_MAX_NUM, &buf, 1); + //_fRW_MISCTL__MEA_CLR = 0; //Frequency measure not clear + gup_bit_write(_fRW_MISCTL__MEA, 1, 0); + //_fRW_MISCTL__MEA_EN = 1; + gup_bit_write(_fRW_MISCTL__MEA, 0, 1); +} + +static u32 gup_clk_count_get(void) +{ + s32 ready = 0; + s32 temp; + s8 buf[4]; + + while ((ready == 0)) { //Wait for measurement complete + i2c_read_bytes(i2c_connect_client, _bRO_MISCTL__MEA_RDY, buf, 1); + ready = buf[0]; + } + + msleep(50); + + //_fRW_MISCTL__MEA_EN = 0; + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + i2c_read_bytes(i2c_connect_client, _dRO_MISCTL__MEA_VAL, buf, 4); + GTP_DEBUG("Clk_count 0: %2X", buf[0]); + GTP_DEBUG("Clk_count 1: %2X", buf[1]); + GTP_DEBUG("Clk_count 2: %2X", buf[2]); + GTP_DEBUG("Clk_count 3: %2X", buf[3]); + + temp = (s32)buf[0] + ((s32)buf[1] << 8) + ((s32)buf[2] << 16) + ((s32)buf[3] << 24); + GTP_INFO("Clk_count : %d", temp); + return temp; +} +u8 gup_clk_dac_setting(int dac) +{ + s8 buf1, buf2; + + i2c_read_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_read_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + buf1 = (buf1 & 0xFFCF) | ((dac & 0x03) << 4); + buf2 = (dac >> 2) & 0x3f; + + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + return 0; +} + +static u8 gup_clk_calibration_pin_select(s32 bCh) +{ + s32 i2c_addr; + + switch (bCh) { + case 0: + i2c_addr = _fRW_MISCTL__GIO0; + break; + + case 1: + i2c_addr = _fRW_MISCTL__GIO1; + break; + + case 2: + i2c_addr = _fRW_MISCTL__GIO2; + break; + + case 3: + i2c_addr = _fRW_MISCTL__GIO3; + break; + + case 4: + i2c_addr = _fRW_MISCTL__GIO4; + break; + + case 5: + i2c_addr = _fRW_MISCTL__GIO5; + break; + + case 6: + i2c_addr = _fRW_MISCTL__GIO6; + break; + + case 7: + i2c_addr = _fRW_MISCTL__GIO7; + break; + + case 8: + i2c_addr = _fRW_MISCTL__GIO8; + break; + + case 9: + i2c_addr = _fRW_MISCTL__GIO9; + break; + } + + gup_bit_write(i2c_addr, 1, 0); + + return 0; +} + +void gup_output_pulse(int t) +{ + unsigned long flags; + //s32 i; + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(10); + + local_irq_save(flags); + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + msleep(50); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(t - 50); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + + local_irq_restore(flags); + + msleep(20); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); +} + +static void gup_sys_clk_init(void) +{ + u8 buf; + + //_fRW_MISCTL__RG_RXADC_CKMUX = 0; + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 5, 0); + //_bRW_MISCTL__RG_LDO_A18_PWD = 0; //DrvMISCTL_A18_PowerON + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_LDO_A18_PWD, &buf, 1); + //_bRW_MISCTL__RG_BG_PWD = 0; //DrvMISCTL_BG_PowerON + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_BG_PWD, &buf, 1); + //_bRW_MISCTL__RG_CLKGEN_PWD = 0; //DrvMISCTL_CLKGEN_PowerON + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_CLKGEN_PWD, &buf, 1); + //_fRW_MISCTL__RG_RXADC_PWD = 0; //DrvMISCTL_RX_ADC_PowerON + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 0, 0); + //_fRW_MISCTL__RG_RXADC_REF_PWD = 0; //DrvMISCTL_RX_ADCREF_PowerON + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 1, 0); + //gup_clk_dac_setting(60); + //_bRW_MISCTL__OSC_CK_SEL = 1;; + buf = 1; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__OSC_CK_SEL, &buf, 1); +} + +s32 gup_clk_calibration(void) +{ + u8 buf; + //u8 trigger; + s32 i; + struct timeval start, end; + s32 count; + s32 count_ref; + s32 sec; + s32 usec; + //unsigned long flags; + struct goodix_ts_data *ts; + + buf = 0x0C; // hold ss51 and dsp + i2c_write_bytes(i2c_connect_client, _rRW_MISCTL__SWRST_B0_, &buf, 1); + + //_fRW_MISCTL__CLK_BIAS = 0; //disable clock bias + gup_bit_write(_rRW_MISCTL_RG_DMY83, 7, 0); + + //_fRW_MISCTL__GIO1_PU = 0; //set TOUCH INT PIN MODE as input + gup_bit_write(_rRW_MISCTL__GIO1CTL_B2_, 0, 0); + + //_fRW_MISCTL__GIO1_OE = 0; //set TOUCH INT PIN MODE as input + gup_bit_write(_rRW_MISCTL__GIO1CTL_B1_, 1, 0); + + //buf = 0x00; + //i2c_write_bytes(i2c_connect_client, _rRW_MISCTL__SWRST_B0_, &buf, 1); + //msleep(1000); + + GTP_INFO("CLK calibration GO"); + gup_sys_clk_init(); + gup_clk_calibration_pin_select(1);//use GIO1 to do the calibration + + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + + ts = i2c_get_clientdata(i2c_connect_client); + + for (i = INIT_CLK_DAC; i < MAX_CLK_DAC; i++) { + GTP_INFO("CLK calibration DAC %d", i); + + if (ts->gtp_is_suspend) { + i = 80; // if sleeping while calibrating main clock, set it default 80 + break; + } + + gup_clk_dac_setting(i); + gup_clk_count_init(1, CLK_AVG_TIME); + +#if 0 + gup_output_pulse(PULSE_LENGTH); + count = gup_clk_count_get(); + + if (count > PULSE_LENGTH * 60) { //60= 60Mhz * 1us + break; + } + +#else + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + + //local_irq_save(flags); + do_gettimeofday(&start); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + //local_irq_restore(flags); + + msleep(1); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + msleep(1); + + //local_irq_save(flags); + do_gettimeofday(&end); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 1); + //local_irq_restore(flags); + + count = gup_clk_count_get(); + msleep(20); + GTP_GPIO_OUTPUT(GTP_INT_PORT, 0); + + usec = end.tv_usec - start.tv_usec; + sec = end.tv_sec - start.tv_sec; + count_ref = 60 * (usec+ sec * MILLION);//60= 60Mhz * 1us + + GTP_DEBUG("== time %d, %d, %d", sec, usec, count_ref); + + if (count > count_ref) { + GTP_DEBUG("== count_diff %d", count - count_ref); + break; + } + +#endif + } + + //clk_dac = i; + + gtp_reset_guitar(i2c_connect_client, 20); + +#if 0//for debug + //-- ouput clk to GPIO 4 + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x41FA, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4104, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4105, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4106, &buf, 1); + buf = 0x01; + i2c_write_bytes(i2c_connect_client, 0x4107, &buf, 1); + buf = 0x06; + i2c_write_bytes(i2c_connect_client, 0x41F8, &buf, 1); + buf = 0x02; + i2c_write_bytes(i2c_connect_client, 0x41F9, &buf, 1); +#endif + + GTP_GPIO_AS_INT(GTP_INT_PORT); + return i; +} + + + +s32 gup_hold_ss51_dsp(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + while(retry++ < 200) { + // step4:Hold ss51 & dsp + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if(ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + // step5:Confirm hold + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("[enter_update_mode]Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if(retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + //DSP_CK and DSP_ALU_CK PowerOn + ret = gup_set_ic_msg(client, 0x4010, 0x00); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]DSP_CK and DSP_ALU_CK PowerOn fail."); + return FAIL; + } + + //disable wdt + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]disable wdt fail."); + return FAIL; + } + + //clear cache enable + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear cache enable fail."); + return FAIL; + } + + //set boot from sram + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set boot from sram fail."); + return FAIL; + } + + //software reboot + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]software reboot fail."); + return FAIL; + } + + return SUCCESS; +} + +s32 gup_enter_update_mode_fl(struct i2c_client *client) +{ + s32 ret = -1; + //s32 retry = 0; + //u8 rd_buf[3]; + + //step1:RST output low last at least 2ms + GTP_GPIO_OUTPUT(GTP_RST_PORT, 0); + msleep(2); + + //step2:select I2C slave addr,INT:0--0xBA;1--0x28. + GTP_GPIO_OUTPUT(GTP_INT_PORT, (client->addr == 0x14)); + msleep(2); + + //step3:RST output high reset guitar + GTP_GPIO_OUTPUT(GTP_RST_PORT, 1); + + msleep(5); + + //select addr & hold ss51_dsp + ret = gup_hold_ss51_dsp(client); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]hold ss51 & dsp failed."); + return FAIL; + } + + //clear control flag + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear control flag fail."); + return FAIL; + } + + //set scramble + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set scramble fail."); + return FAIL; + } + + //enable accessing code + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]enable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + //step1:select bank2 + GTP_DEBUG("[download_fw_dsp]step1:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret == FAIL) { + GTP_ERROR("select bank 2 fail"); + return FAIL; + } + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin download dsp fw---->>"); + + if (ret <= 0) { + GTP_ERROR("[download_fw_dsp]select bank2 fail."); + return FAIL; + } + GTP_DEBUG("burn fw dsp"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); // write the second ban + if (FAIL == ret) { + GTP_ERROR("[download_fw_dsp]download FW dsp fail."); + return FAIL; + } + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin esd check dsp fw---->>"); + //GTP_INFO("esd recovery: check fw dsp"); + //ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + + //if(FAIL == ret) + { + //GTP_ERROR("[download_fw_dsp]Checked FW dsp fail, redownload fw dsp"); + GTP_INFO("esd recovery redownload firmware dsp code"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("redownload fw dsp failed!"); + return FAIL; + } + } + } else { + //msleep(100); + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } + return SUCCESS; +} + +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len) +{ + s32 ret = 0; + + GTP_DEBUG("burn firmware: 0x%04X, %d bytes, start_index: 0x%04X", start_addr, burn_len, start_index); + + ret = i2c_write_bytes(client, start_addr, (u8*)>p_default_FW_fl[FW_HEAD_LENGTH + start_index], burn_len); + if (ret < 0) { + GTP_ERROR("burn 0x%04X, %d bytes failed!", start_addr, burn_len); + return FAIL; + } + return SUCCESS; +} + +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len) +{ + s32 ret = 0; + s32 cmp_len = 0; + u16 cmp_addr = start_addr; + s32 i = 0; + s32 chked_times = 0; + u8 chk_fail = 0; + + GTP_DEBUG("check firmware: start 0x%04X, %d bytes", start_addr, chk_len); + while ((chk_len > 0) && (chked_times < GTP_CHK_FW_MAX)) { + if (chk_len >= GUP_FW_CHK_SIZE) { + cmp_len = GUP_FW_CHK_SIZE; + } else { + cmp_len = chk_len; + } + ret = i2c_read_bytes(client, cmp_addr, chk_cmp_buf, cmp_len); + if (ret < 0) { + chk_fail = 1; + break; + } + for (i = 0; i < cmp_len; ++i) { + if (chk_cmp_buf[i] != gtp_default_FW_fl[FW_HEAD_LENGTH + start_index +i]) { + chk_fail = 1; + i2c_write_bytes(client, cmp_addr+i, >p_default_FW_fl[FW_HEAD_LENGTH + start_index + i], cmp_len-i); + GTP_ERROR("Check failed index: %d(%d != %d), redownload chuck", i, chk_cmp_buf[i], + gtp_default_FW_fl[FW_HEAD_LENGTH + start_index +i]); + break; + } + } + if (chk_fail == 1) { + chk_fail = 0; + chked_times++; + } else { + cmp_addr += cmp_len; + start_index += cmp_len; + chk_len -= cmp_len; + } + } + if (chk_len > 0) { + GTP_ERROR("cmp_addr: 0x%04X, start_index: 0x%02X, chk_len: 0x%04X", cmp_addr, + start_index, chk_len); + return FAIL; + } + return SUCCESS; +} + +static u8 gup_download_fw_ss51(struct i2c_client *client, u8 dwn_mode) +{ + s32 section = 0; + s32 ret = 0; + s32 start_index = 0; + u8 bank = 0; + u16 burn_addr = 0xC000; + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("download firmware ss51"); + } else { + GTP_INFO("check firmware ss51"); + } + for (section = 1; section <= 4; section += 2) { + switch (section) { + case 1: + bank = 0x00; + burn_addr = (section - 1) * FW_SS51_SECTION_LEN + 0xC000; + break; + case 3: + bank = 0x01; + burn_addr = (section - 3) * FW_SS51_SECTION_LEN + 0xC000; + break; + } + start_index = (section - 1) * FW_SS51_SECTION_LEN; + + GTP_DEBUG("download firmware ss51: select bank%d", bank); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, bank); + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("download firmware ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + GTP_INFO("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { // esd recovery mode + // GTP_INFO("esd recovery check ss51 section%d & %d", section, section+1); + // ret = gup_check_and_repair(client, burn_addr, start_index, FW_SS51_SECTION_LEN); + // if (ret == FAIL) + { + // GTP_ERROR("check ss51 section%d failed, redownload section%d", section, section); + GTP_INFO("esd recovery redownload ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d failed!", section); + return FAIL; + } + } + } else { + GTP_INFO("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } + } + + return SUCCESS; +} + + +static s32 gup_prepare_fl_fw(char *path, st_fw_head *fw_head) +{ + s32 ret = 0; + s32 i = 0; + s32 timeout = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + if (!memcmp(path, "update", 6)) { + GTP_INFO("Search for GT9XXF firmware file to update"); + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force terminate auto update for GT9XXF..."); + return FAIL; + } + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", FL_UPDATE_PATH, FL_UPDATE_PATH_SD, i+1, GUP_SEARCH_FILE_TIMES); + update_msg.file = filp_open(FL_UPDATE_PATH, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + update_msg.file = filp_open(FL_UPDATE_PATH_SD, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + msleep(3000); + continue; + } else { + path = FL_UPDATE_PATH_SD; + break; + } + } else { + path = FL_UPDATE_PATH; + break; + } + } + searching_file = 0; + if (i == 50) { + GTP_INFO("Search timeout, update aborted"); + return FAIL; + } else { + GTP_INFO("GT9XXF firmware file %s found!", path); + _CLOSE_FILE(update_msg.file); + } + while (ts->rqst_processing && (timeout++ < 5)) { + GTP_DEBUG("request processing, waiting for accomplishment"); + msleep(1000); + } + } + GTP_INFO("Firmware update file path: %s", path); + + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + ret = gup_get_ic_fw_msg(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("failed to get ic firmware info"); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.file->f_op->read(update_msg.file, (char*)fw_head, FW_HEAD_LENGTH, &update_msg.file->f_pos); + + update_msg.force_update = 0xBE; // GT9XXF ignore the 0xBE + + ret = gup_enter_update_judge(fw_head); + if (FAIL == ret) { + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char*)gtp_default_FW_fl, + FW_HEAD_LENGTH+2*FW_DOWNLOAD_LENGTH+FW_DSP_LENGTH, + &update_msg.file->f_pos); + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + + if (ret < 0) { + GTP_ERROR("read %s failed, err-code: %d", path, ret); + return FAIL; + } + return SUCCESS; +} +static u8 gup_check_update_file_fl(struct i2c_client *client, st_fw_head* fw_head, char* path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + + if (NULL != path) { + ret = gup_prepare_fl_fw(path, fw_head); + if (FAIL == ret) { + return FAIL; + } + } else { + memcpy(fw_head, gtp_default_FW_fl, FW_HEAD_LENGTH); + GTP_INFO("FILE HARDWARE INFO: %02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID: %s", fw_head->pid); + fw_head->vid = ((fw_head->vid & 0xFF00) >> 8) + ((fw_head->vid & 0x00FF) << 8); + GTP_INFO("FILE VID: %04x", fw_head->vid); + } + + //check firmware legality + fw_checksum = 0; + for(i = FW_HEAD_LENGTH; i < (FW_HEAD_LENGTH+FW_SECTION_LENGTH*4+FW_DSP_LENGTH); i += 2) { + fw_checksum += (gtp_default_FW_fl[i] << 8) + gtp_default_FW_fl[i+1]; + } + ret = SUCCESS; + + GTP_DEBUG("firmware checksum: %x", fw_checksum&0xFFFF); + if (fw_checksum & 0xFFFF) { + GTP_ERROR("Illegal firmware file."); + ret = FAIL; + } + + return ret; +} + + + +s32 gup_fw_download_proc(void *dir, u8 dwn_mode) +{ + s32 ret = 0; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(i2c_connect_client); + if (NULL == dir) { + if(GTP_FL_FW_BURN == dwn_mode) { // GT9XXF firmware burn mode + GTP_INFO("[fw_download_proc]Begin fw download ......"); + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { // GTP_FL_ESD_RECOVERY: GT9XXF esd recovery mode + GTP_INFO("[fw_download_proc]Begin fw esd recovery check ......"); + } else { + GTP_INFO("[fw_download_proc]Being fw repair check......"); + } + } else { + GTP_INFO("[fw_download_proc]Begin firmware update by bin file"); + } + + total_len = 100; + show_len = 0; + + ret = gup_check_update_file_fl(i2c_connect_client, &fw_head, (char *)dir); + show_len = 10; + + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]check update file fail."); + goto file_fail; + } + + if (!memcmp(fw_head.pid, "950", 3)) { + ts->is_950 = 1; + GTP_DEBUG("GT9XXF Ic Type: gt950"); + } else { + ts->is_950 = 0; + } + + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + if (NULL != dir) { + gtp_esd_switch(ts->client, SWITCH_OFF); + } +#endif + + ret = gup_enter_update_mode_fl(i2c_connect_client); + show_len = 20; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]enter update mode fail."); + goto download_fail; + } + + while (retry++ < 5) { + ret = gup_download_fw_ss51(i2c_connect_client, dwn_mode); + show_len = 60; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn ss51 firmware fail."); + continue; + } + + ret = gup_download_fw_dsp(i2c_connect_client, dwn_mode); + show_len = 80; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn dsp firmware fail."); + continue; + } + + GTP_INFO("[fw_download_proc]UPDATE SUCCESS."); + break; + } + + if (retry >= 5) { + GTP_ERROR("[fw_download_proc]retry timeout,UPDATE FAIL."); + goto download_fail; + } + + if (NULL != dir) { + gtp_fw_startup(ts->client); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + } + gtp_irq_enable(ts); + show_len = 100; + return SUCCESS; + +download_fail: + if (NULL != dir) { + gtp_fw_startup(ts->client); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + } + gtp_irq_enable(ts); +file_fail: + show_len = 200; + + //ts->enter_udpate = 0; + return FAIL; +} + +#endif + +//**************** For GT9XXF End ********************// \ No newline at end of file diff --git a/drivers/input/touchscreen/gunze.c b/drivers/input/touchscreen/gunze.c new file mode 100644 index 00000000..41c71766 --- /dev/null +++ b/drivers/input/touchscreen/gunze.c @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2000-2001 Vojtech Pavlik + */ + +/* + * Gunze AHL-51S touchscreen driver for Linux + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Should you need to contact me, the author, you can do so either by + * e-mail - mail your message to , or by paper mail: + * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Gunze AHL-51S touchscreen driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define GUNZE_MAX_LENGTH 10 + +/* + * Per-touchscreen data. + */ + +struct gunze { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[GUNZE_MAX_LENGTH]; + char phys[32]; +}; + +static void gunze_process_packet(struct gunze* gunze) +{ + struct input_dev *dev = gunze->dev; + + if (gunze->idx != GUNZE_MAX_LENGTH || gunze->data[5] != ',' || + (gunze->data[0] != 'T' && gunze->data[0] != 'R')) { + printk(KERN_WARNING "gunze.c: bad packet: >%.*s<\n", GUNZE_MAX_LENGTH, gunze->data); + return; + } + + input_report_abs(dev, ABS_X, simple_strtoul(gunze->data + 1, NULL, 10)); + input_report_abs(dev, ABS_Y, 1024 - simple_strtoul(gunze->data + 6, NULL, 10)); + input_report_key(dev, BTN_TOUCH, gunze->data[0] == 'T'); + input_sync(dev); +} + +static irqreturn_t gunze_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct gunze* gunze = serio_get_drvdata(serio); + + if (data == '\r') { + gunze_process_packet(gunze); + gunze->idx = 0; + } else { + if (gunze->idx < GUNZE_MAX_LENGTH) + gunze->data[gunze->idx++] = data; + } + return IRQ_HANDLED; +} + +/* + * gunze_disconnect() is the opposite of gunze_connect() + */ + +static void gunze_disconnect(struct serio *serio) +{ + struct gunze *gunze = serio_get_drvdata(serio); + + input_get_device(gunze->dev); + input_unregister_device(gunze->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(gunze->dev); + kfree(gunze); +} + +/* + * gunze_connect() is the routine that is called when someone adds a + * new serio device that supports Gunze protocol and registers it as + * an input device. + */ + +static int gunze_connect(struct serio *serio, struct serio_driver *drv) +{ + struct gunze *gunze; + struct input_dev *input_dev; + int err; + + gunze = kzalloc(sizeof(struct gunze), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!gunze || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + gunze->serio = serio; + gunze->dev = input_dev; + snprintf(gunze->phys, sizeof(serio->phys), "%s/input0", serio->phys); + + input_dev->name = "Gunze AHL-51S TouchScreen"; + input_dev->phys = gunze->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_GUNZE; + input_dev->id.product = 0x0051; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, 24, 1000, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 24, 1000, 0, 0); + + serio_set_drvdata(serio, gunze); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(gunze->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(gunze); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id gunze_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_GUNZE, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, gunze_serio_ids); + +static struct serio_driver gunze_drv = { + .driver = { + .name = "gunze", + }, + .description = DRIVER_DESC, + .id_table = gunze_serio_ids, + .interrupt = gunze_interrupt, + .connect = gunze_connect, + .disconnect = gunze_disconnect, +}; + +module_serio_driver(gunze_drv); diff --git a/drivers/input/touchscreen/hampshire.c b/drivers/input/touchscreen/hampshire.c new file mode 100644 index 00000000..0cc47ea9 --- /dev/null +++ b/drivers/input/touchscreen/hampshire.c @@ -0,0 +1,190 @@ +/* + * Hampshire serial touchscreen driver + * + * Copyright (c) 2010 Adam Bennett + * Based on the dynapro driver (c) Tias Guns + * + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * 2010/04/08 Adam Bennett + * Copied dynapro.c and edited for Hampshire 4-byte protocol + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Hampshire serial touchscreen driver" + +MODULE_AUTHOR("Adam Bennett "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define HAMPSHIRE_FORMAT_TOUCH_BIT 0x40 +#define HAMPSHIRE_FORMAT_LENGTH 4 +#define HAMPSHIRE_RESPONSE_BEGIN_BYTE 0x80 + +#define HAMPSHIRE_MIN_XC 0 +#define HAMPSHIRE_MAX_XC 0x1000 +#define HAMPSHIRE_MIN_YC 0 +#define HAMPSHIRE_MAX_YC 0x1000 + +#define HAMPSHIRE_GET_XC(data) (((data[3] & 0x0c) >> 2) | (data[1] << 2) | ((data[0] & 0x38) << 6)) +#define HAMPSHIRE_GET_YC(data) ((data[3] & 0x03) | (data[2] << 2) | ((data[0] & 0x07) << 9)) +#define HAMPSHIRE_GET_TOUCHED(data) (HAMPSHIRE_FORMAT_TOUCH_BIT & data[0]) + +/* + * Per-touchscreen data. + */ + +struct hampshire { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[HAMPSHIRE_FORMAT_LENGTH]; + char phys[32]; +}; + +static void hampshire_process_data(struct hampshire *phampshire) +{ + struct input_dev *dev = phampshire->dev; + + if (HAMPSHIRE_FORMAT_LENGTH == ++phampshire->idx) { + input_report_abs(dev, ABS_X, HAMPSHIRE_GET_XC(phampshire->data)); + input_report_abs(dev, ABS_Y, HAMPSHIRE_GET_YC(phampshire->data)); + input_report_key(dev, BTN_TOUCH, + HAMPSHIRE_GET_TOUCHED(phampshire->data)); + input_sync(dev); + + phampshire->idx = 0; + } +} + +static irqreturn_t hampshire_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct hampshire *phampshire = serio_get_drvdata(serio); + + phampshire->data[phampshire->idx] = data; + + if (HAMPSHIRE_RESPONSE_BEGIN_BYTE & phampshire->data[0]) + hampshire_process_data(phampshire); + else + dev_dbg(&serio->dev, "unknown/unsynchronized data: %x\n", + phampshire->data[0]); + + return IRQ_HANDLED; +} + +static void hampshire_disconnect(struct serio *serio) +{ + struct hampshire *phampshire = serio_get_drvdata(serio); + + input_get_device(phampshire->dev); + input_unregister_device(phampshire->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(phampshire->dev); + kfree(phampshire); +} + +/* + * hampshire_connect() is the routine that is called when someone adds a + * new serio device that supports hampshire protocol and registers it as + * an input device. This is usually accomplished using inputattach. + */ + +static int hampshire_connect(struct serio *serio, struct serio_driver *drv) +{ + struct hampshire *phampshire; + struct input_dev *input_dev; + int err; + + phampshire = kzalloc(sizeof(struct hampshire), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!phampshire || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + phampshire->serio = serio; + phampshire->dev = input_dev; + snprintf(phampshire->phys, sizeof(phampshire->phys), + "%s/input0", serio->phys); + + input_dev->name = "Hampshire Serial TouchScreen"; + input_dev->phys = phampshire->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_HAMPSHIRE; + input_dev->id.product = 0; + input_dev->id.version = 0x0001; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(phampshire->dev, ABS_X, + HAMPSHIRE_MIN_XC, HAMPSHIRE_MAX_XC, 0, 0); + input_set_abs_params(phampshire->dev, ABS_Y, + HAMPSHIRE_MIN_YC, HAMPSHIRE_MAX_YC, 0, 0); + + serio_set_drvdata(serio, phampshire); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(phampshire->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(phampshire); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id hampshire_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_HAMPSHIRE, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, hampshire_serio_ids); + +static struct serio_driver hampshire_drv = { + .driver = { + .name = "hampshire", + }, + .description = DRIVER_DESC, + .id_table = hampshire_serio_ids, + .interrupt = hampshire_interrupt, + .connect = hampshire_connect, + .disconnect = hampshire_disconnect, +}; + +module_serio_driver(hampshire_drv); diff --git a/drivers/input/touchscreen/hp680_ts_input.c b/drivers/input/touchscreen/hp680_ts_input.c new file mode 100644 index 00000000..85cf9bee --- /dev/null +++ b/drivers/input/touchscreen/hp680_ts_input.c @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MODNAME "hp680_ts_input" + +#define HP680_TS_ABS_X_MIN 40 +#define HP680_TS_ABS_X_MAX 950 +#define HP680_TS_ABS_Y_MIN 80 +#define HP680_TS_ABS_Y_MAX 910 + +#define PHDR 0xa400012e +#define SCPDR 0xa4000136 + +static void do_softint(struct work_struct *work); + +static struct input_dev *hp680_ts_dev; +static DECLARE_DELAYED_WORK(work, do_softint); + +static void do_softint(struct work_struct *work) +{ + int absx = 0, absy = 0; + u8 scpdr; + int touched = 0; + + if (__raw_readb(PHDR) & PHDR_TS_PEN_DOWN) { + scpdr = __raw_readb(SCPDR); + scpdr |= SCPDR_TS_SCAN_ENABLE; + scpdr &= ~SCPDR_TS_SCAN_Y; + __raw_writeb(scpdr, SCPDR); + udelay(30); + + absy = adc_single(ADC_CHANNEL_TS_Y); + + scpdr = __raw_readb(SCPDR); + scpdr |= SCPDR_TS_SCAN_Y; + scpdr &= ~SCPDR_TS_SCAN_X; + __raw_writeb(scpdr, SCPDR); + udelay(30); + + absx = adc_single(ADC_CHANNEL_TS_X); + + scpdr = __raw_readb(SCPDR); + scpdr |= SCPDR_TS_SCAN_X; + scpdr &= ~SCPDR_TS_SCAN_ENABLE; + __raw_writeb(scpdr, SCPDR); + udelay(100); + touched = __raw_readb(PHDR) & PHDR_TS_PEN_DOWN; + } + + if (touched) { + input_report_key(hp680_ts_dev, BTN_TOUCH, 1); + input_report_abs(hp680_ts_dev, ABS_X, absx); + input_report_abs(hp680_ts_dev, ABS_Y, absy); + } else { + input_report_key(hp680_ts_dev, BTN_TOUCH, 0); + } + + input_sync(hp680_ts_dev); + enable_irq(HP680_TS_IRQ); +} + +static irqreturn_t hp680_ts_interrupt(int irq, void *dev) +{ + disable_irq_nosync(irq); + schedule_delayed_work(&work, HZ / 20); + + return IRQ_HANDLED; +} + +static int __init hp680_ts_init(void) +{ + int err; + + hp680_ts_dev = input_allocate_device(); + if (!hp680_ts_dev) + return -ENOMEM; + + hp680_ts_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); + hp680_ts_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(hp680_ts_dev, ABS_X, + HP680_TS_ABS_X_MIN, HP680_TS_ABS_X_MAX, 0, 0); + input_set_abs_params(hp680_ts_dev, ABS_Y, + HP680_TS_ABS_Y_MIN, HP680_TS_ABS_Y_MAX, 0, 0); + + hp680_ts_dev->name = "HP Jornada touchscreen"; + hp680_ts_dev->phys = "hp680_ts/input0"; + + if (request_irq(HP680_TS_IRQ, hp680_ts_interrupt, + 0, MODNAME, NULL) < 0) { + printk(KERN_ERR "hp680_touchscreen.c: Can't allocate irq %d\n", + HP680_TS_IRQ); + err = -EBUSY; + goto fail1; + } + + err = input_register_device(hp680_ts_dev); + if (err) + goto fail2; + + return 0; + + fail2: free_irq(HP680_TS_IRQ, NULL); + cancel_delayed_work_sync(&work); + fail1: input_free_device(hp680_ts_dev); + return err; +} + +static void __exit hp680_ts_exit(void) +{ + free_irq(HP680_TS_IRQ, NULL); + cancel_delayed_work_sync(&work); + input_unregister_device(hp680_ts_dev); +} + +module_init(hp680_ts_init); +module_exit(hp680_ts_exit); + +MODULE_AUTHOR("Andriy Skulysh, askulysh@image.kiev.ua"); +MODULE_DESCRIPTION("HP Jornada 680 touchscreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/htcpen.c b/drivers/input/touchscreen/htcpen.c new file mode 100644 index 00000000..6c4fb843 --- /dev/null +++ b/drivers/input/touchscreen/htcpen.c @@ -0,0 +1,250 @@ +/* + * HTC Shift touchscreen driver + * + * Copyright (C) 2008 Pau Oliva Fora + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Pau Oliva Fora "); +MODULE_DESCRIPTION("HTC Shift touchscreen driver"); +MODULE_LICENSE("GPL"); + +#define HTCPEN_PORT_IRQ_CLEAR 0x068 +#define HTCPEN_PORT_INIT 0x06c +#define HTCPEN_PORT_INDEX 0x0250 +#define HTCPEN_PORT_DATA 0x0251 +#define HTCPEN_IRQ 3 + +#define DEVICE_ENABLE 0xa2 +#define DEVICE_DISABLE 0xa3 + +#define X_INDEX 3 +#define Y_INDEX 5 +#define TOUCH_INDEX 0xb +#define LSB_XY_INDEX 0xc +#define X_AXIS_MAX 2040 +#define Y_AXIS_MAX 2040 + +static bool invert_x; +module_param(invert_x, bool, 0644); +MODULE_PARM_DESC(invert_x, "If set, X axis is inverted"); +static bool invert_y; +module_param(invert_y, bool, 0644); +MODULE_PARM_DESC(invert_y, "If set, Y axis is inverted"); + +static irqreturn_t htcpen_interrupt(int irq, void *handle) +{ + struct input_dev *htcpen_dev = handle; + unsigned short x, y, xy; + + /* 0 = press; 1 = release */ + outb_p(TOUCH_INDEX, HTCPEN_PORT_INDEX); + + if (inb_p(HTCPEN_PORT_DATA)) { + input_report_key(htcpen_dev, BTN_TOUCH, 0); + } else { + outb_p(X_INDEX, HTCPEN_PORT_INDEX); + x = inb_p(HTCPEN_PORT_DATA); + + outb_p(Y_INDEX, HTCPEN_PORT_INDEX); + y = inb_p(HTCPEN_PORT_DATA); + + outb_p(LSB_XY_INDEX, HTCPEN_PORT_INDEX); + xy = inb_p(HTCPEN_PORT_DATA); + + /* get high resolution value of X and Y using LSB */ + x = X_AXIS_MAX - ((x * 8) + ((xy >> 4) & 0xf)); + y = (y * 8) + (xy & 0xf); + if (invert_x) + x = X_AXIS_MAX - x; + if (invert_y) + y = Y_AXIS_MAX - y; + + if (x != X_AXIS_MAX && x != 0) { + input_report_key(htcpen_dev, BTN_TOUCH, 1); + input_report_abs(htcpen_dev, ABS_X, x); + input_report_abs(htcpen_dev, ABS_Y, y); + } + } + + input_sync(htcpen_dev); + + inb_p(HTCPEN_PORT_IRQ_CLEAR); + + return IRQ_HANDLED; +} + +static int htcpen_open(struct input_dev *dev) +{ + outb_p(DEVICE_ENABLE, HTCPEN_PORT_INIT); + + return 0; +} + +static void htcpen_close(struct input_dev *dev) +{ + outb_p(DEVICE_DISABLE, HTCPEN_PORT_INIT); + synchronize_irq(HTCPEN_IRQ); +} + +static int htcpen_isa_probe(struct device *dev, unsigned int id) +{ + struct input_dev *htcpen_dev; + int err = -EBUSY; + + if (!request_region(HTCPEN_PORT_IRQ_CLEAR, 1, "htcpen")) { + printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n", + HTCPEN_PORT_IRQ_CLEAR); + goto request_region1_failed; + } + + if (!request_region(HTCPEN_PORT_INIT, 1, "htcpen")) { + printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n", + HTCPEN_PORT_INIT); + goto request_region2_failed; + } + + if (!request_region(HTCPEN_PORT_INDEX, 2, "htcpen")) { + printk(KERN_ERR "htcpen: unable to get IO region 0x%x\n", + HTCPEN_PORT_INDEX); + goto request_region3_failed; + } + + htcpen_dev = input_allocate_device(); + if (!htcpen_dev) { + printk(KERN_ERR "htcpen: can't allocate device\n"); + err = -ENOMEM; + goto input_alloc_failed; + } + + htcpen_dev->name = "HTC Shift EC TouchScreen"; + htcpen_dev->id.bustype = BUS_ISA; + + htcpen_dev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); + htcpen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(htcpen_dev, ABS_X, 0, X_AXIS_MAX, 0, 0); + input_set_abs_params(htcpen_dev, ABS_Y, 0, Y_AXIS_MAX, 0, 0); + + htcpen_dev->open = htcpen_open; + htcpen_dev->close = htcpen_close; + + err = request_irq(HTCPEN_IRQ, htcpen_interrupt, 0, "htcpen", + htcpen_dev); + if (err) { + printk(KERN_ERR "htcpen: irq busy\n"); + goto request_irq_failed; + } + + inb_p(HTCPEN_PORT_IRQ_CLEAR); + + err = input_register_device(htcpen_dev); + if (err) + goto input_register_failed; + + dev_set_drvdata(dev, htcpen_dev); + + return 0; + + input_register_failed: + free_irq(HTCPEN_IRQ, htcpen_dev); + request_irq_failed: + input_free_device(htcpen_dev); + input_alloc_failed: + release_region(HTCPEN_PORT_INDEX, 2); + request_region3_failed: + release_region(HTCPEN_PORT_INIT, 1); + request_region2_failed: + release_region(HTCPEN_PORT_IRQ_CLEAR, 1); + request_region1_failed: + return err; +} + +static int htcpen_isa_remove(struct device *dev, unsigned int id) +{ + struct input_dev *htcpen_dev = dev_get_drvdata(dev); + + input_unregister_device(htcpen_dev); + + free_irq(HTCPEN_IRQ, htcpen_dev); + + release_region(HTCPEN_PORT_INDEX, 2); + release_region(HTCPEN_PORT_INIT, 1); + release_region(HTCPEN_PORT_IRQ_CLEAR, 1); + + dev_set_drvdata(dev, NULL); + + return 0; +} + +#ifdef CONFIG_PM +static int htcpen_isa_suspend(struct device *dev, unsigned int n, + pm_message_t state) +{ + outb_p(DEVICE_DISABLE, HTCPEN_PORT_INIT); + + return 0; +} + +static int htcpen_isa_resume(struct device *dev, unsigned int n) +{ + outb_p(DEVICE_ENABLE, HTCPEN_PORT_INIT); + + return 0; +} +#endif + +static struct isa_driver htcpen_isa_driver = { + .probe = htcpen_isa_probe, + .remove = htcpen_isa_remove, +#ifdef CONFIG_PM + .suspend = htcpen_isa_suspend, + .resume = htcpen_isa_resume, +#endif + .driver = { + .owner = THIS_MODULE, + .name = "htcpen", + } +}; + +static struct dmi_system_id __initdata htcshift_dmi_table[] = { + { + .ident = "Shift", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "High Tech Computer Corp"), + DMI_MATCH(DMI_PRODUCT_NAME, "Shift"), + }, + }, + { } +}; +MODULE_DEVICE_TABLE(dmi, htcshift_dmi_table); + +static int __init htcpen_isa_init(void) +{ + if (!dmi_check_system(htcshift_dmi_table)) + return -ENODEV; + + return isa_register_driver(&htcpen_isa_driver, 1); +} + +static void __exit htcpen_isa_exit(void) +{ + isa_unregister_driver(&htcpen_isa_driver); +} + +module_init(htcpen_isa_init); +module_exit(htcpen_isa_exit); diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c new file mode 100644 index 00000000..1418bdda --- /dev/null +++ b/drivers/input/touchscreen/ili210x.c @@ -0,0 +1,360 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_TOUCHES 2 +#define DEFAULT_POLL_PERIOD 20 + +/* Touchscreen commands */ +#define REG_TOUCHDATA 0x10 +#define REG_PANEL_INFO 0x20 +#define REG_FIRMWARE_VERSION 0x40 +#define REG_CALIBRATE 0xcc + +struct finger { + u8 x_low; + u8 x_high; + u8 y_low; + u8 y_high; +} __packed; + +struct touchdata { + u8 status; + struct finger finger[MAX_TOUCHES]; +} __packed; + +struct panel_info { + struct finger finger_max; + u8 xchannel_num; + u8 ychannel_num; +} __packed; + +struct firmware_version { + u8 id; + u8 major; + u8 minor; +} __packed; + +struct ili210x { + struct i2c_client *client; + struct input_dev *input; + bool (*get_pendown_state)(void); + unsigned int poll_period; + struct delayed_work dwork; +}; + +static int ili210x_read_reg(struct i2c_client *client, u8 reg, void *buf, + size_t len) +{ + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + .len = 1, + .buf = ®, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len, + .buf = buf, + } + }; + + if (i2c_transfer(client->adapter, msg, 2) != 2) { + dev_err(&client->dev, "i2c transfer failed\n"); + return -EIO; + } + + return 0; +} + +static void ili210x_report_events(struct input_dev *input, + const struct touchdata *touchdata) +{ + int i; + bool touch; + unsigned int x, y; + const struct finger *finger; + + for (i = 0; i < MAX_TOUCHES; i++) { + input_mt_slot(input, i); + + finger = &touchdata->finger[i]; + + touch = touchdata->status & (1 << i); + input_mt_report_slot_state(input, MT_TOOL_FINGER, touch); + if (touch) { + x = finger->x_low | (finger->x_high << 8); + y = finger->y_low | (finger->y_high << 8); + + input_report_abs(input, ABS_MT_POSITION_X, x); + input_report_abs(input, ABS_MT_POSITION_Y, y); + } + } + + input_mt_report_pointer_emulation(input, false); + input_sync(input); +} + +static bool get_pendown_state(const struct ili210x *priv) +{ + bool state = false; + + if (priv->get_pendown_state) + state = priv->get_pendown_state(); + + return state; +} + +static void ili210x_work(struct work_struct *work) +{ + struct ili210x *priv = container_of(work, struct ili210x, + dwork.work); + struct i2c_client *client = priv->client; + struct touchdata touchdata; + int error; + + error = ili210x_read_reg(client, REG_TOUCHDATA, + &touchdata, sizeof(touchdata)); + if (error) { + dev_err(&client->dev, + "Unable to get touchdata, err = %d\n", error); + return; + } + + ili210x_report_events(priv->input, &touchdata); + + if ((touchdata.status & 0xf3) || get_pendown_state(priv)) + schedule_delayed_work(&priv->dwork, + msecs_to_jiffies(priv->poll_period)); +} + +static irqreturn_t ili210x_irq(int irq, void *irq_data) +{ + struct ili210x *priv = irq_data; + + schedule_delayed_work(&priv->dwork, 0); + + return IRQ_HANDLED; +} + +static ssize_t ili210x_calibrate(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ili210x *priv = i2c_get_clientdata(client); + unsigned long calibrate; + int rc; + u8 cmd = REG_CALIBRATE; + + if (kstrtoul(buf, 10, &calibrate)) + return -EINVAL; + + if (calibrate > 1) + return -EINVAL; + + if (calibrate) { + rc = i2c_master_send(priv->client, &cmd, sizeof(cmd)); + if (rc != sizeof(cmd)) + return -EIO; + } + + return count; +} +static DEVICE_ATTR(calibrate, 0644, NULL, ili210x_calibrate); + +static struct attribute *ili210x_attributes[] = { + &dev_attr_calibrate.attr, + NULL, +}; + +static const struct attribute_group ili210x_attr_group = { + .attrs = ili210x_attributes, +}; + +static int ili210x_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct device *dev = &client->dev; + const struct ili210x_platform_data *pdata = dev->platform_data; + struct ili210x *priv; + struct input_dev *input; + struct panel_info panel; + struct firmware_version firmware; + int xmax, ymax; + int error; + + dev_dbg(dev, "Probing for ILI210X I2C Touschreen driver"); + + if (!pdata) { + dev_err(dev, "No platform data!\n"); + return -EINVAL; + } + + if (client->irq <= 0) { + dev_err(dev, "No IRQ!\n"); + return -EINVAL; + } + + /* Get firmware version */ + error = ili210x_read_reg(client, REG_FIRMWARE_VERSION, + &firmware, sizeof(firmware)); + if (error) { + dev_err(dev, "Failed to get firmware version, err: %d\n", + error); + return error; + } + + /* get panel info */ + error = ili210x_read_reg(client, REG_PANEL_INFO, &panel, sizeof(panel)); + if (error) { + dev_err(dev, "Failed to get panel informations, err: %d\n", + error); + return error; + } + + xmax = panel.finger_max.x_low | (panel.finger_max.x_high << 8); + ymax = panel.finger_max.y_low | (panel.finger_max.y_high << 8); + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + input = input_allocate_device(); + if (!priv || !input) { + error = -ENOMEM; + goto err_free_mem; + } + + priv->client = client; + priv->input = input; + priv->get_pendown_state = pdata->get_pendown_state; + priv->poll_period = pdata->poll_period ? : DEFAULT_POLL_PERIOD; + INIT_DELAYED_WORK(&priv->dwork, ili210x_work); + + /* Setup input device */ + input->name = "ILI210x Touchscreen"; + input->id.bustype = BUS_I2C; + input->dev.parent = dev; + + __set_bit(EV_SYN, input->evbit); + __set_bit(EV_KEY, input->evbit); + __set_bit(EV_ABS, input->evbit); + __set_bit(BTN_TOUCH, input->keybit); + + /* Single touch */ + input_set_abs_params(input, ABS_X, 0, xmax, 0, 0); + input_set_abs_params(input, ABS_Y, 0, ymax, 0, 0); + + /* Multi touch */ + input_mt_init_slots(input, MAX_TOUCHES, 0); + input_set_abs_params(input, ABS_MT_POSITION_X, 0, xmax, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, ymax, 0, 0); + + input_set_drvdata(input, priv); + i2c_set_clientdata(client, priv); + + error = request_irq(client->irq, ili210x_irq, pdata->irq_flags, + client->name, priv); + if (error) { + dev_err(dev, "Unable to request touchscreen IRQ, err: %d\n", + error); + goto err_free_mem; + } + + error = sysfs_create_group(&dev->kobj, &ili210x_attr_group); + if (error) { + dev_err(dev, "Unable to create sysfs attributes, err: %d\n", + error); + goto err_free_irq; + } + + error = input_register_device(priv->input); + if (error) { + dev_err(dev, "Cannot regiser input device, err: %d\n", error); + goto err_remove_sysfs; + } + + device_init_wakeup(&client->dev, 1); + + dev_dbg(dev, + "ILI210x initialized (IRQ: %d), firmware version %d.%d.%d", + client->irq, firmware.id, firmware.major, firmware.minor); + + return 0; + +err_remove_sysfs: + sysfs_remove_group(&dev->kobj, &ili210x_attr_group); +err_free_irq: + free_irq(client->irq, priv); +err_free_mem: + input_free_device(input); + kfree(priv); + return error; +} + +static int ili210x_i2c_remove(struct i2c_client *client) +{ + struct ili210x *priv = i2c_get_clientdata(client); + + sysfs_remove_group(&client->dev.kobj, &ili210x_attr_group); + free_irq(priv->client->irq, priv); + cancel_delayed_work_sync(&priv->dwork); + input_unregister_device(priv->input); + kfree(priv); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int ili210x_i2c_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int ili210x_i2c_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ili210x_i2c_pm, + ili210x_i2c_suspend, ili210x_i2c_resume); + +static const struct i2c_device_id ili210x_i2c_id[] = { + { "ili210x", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, ili210x_i2c_id); + +static struct i2c_driver ili210x_ts_driver = { + .driver = { + .name = "ili210x_i2c", + .owner = THIS_MODULE, + .pm = &ili210x_i2c_pm, + }, + .id_table = ili210x_i2c_id, + .probe = ili210x_i2c_probe, + .remove = ili210x_i2c_remove, +}; + +module_i2c_driver(ili210x_ts_driver); + +MODULE_AUTHOR("Olivier Sobrie "); +MODULE_DESCRIPTION("ILI210X I2C Touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/inexio.c b/drivers/input/touchscreen/inexio.c new file mode 100644 index 00000000..a29c99c3 --- /dev/null +++ b/drivers/input/touchscreen/inexio.c @@ -0,0 +1,192 @@ +/* + * iNexio serial touchscreen driver + * + * Copyright (c) 2008 Richard Lemon + * Based on the mtouch driver (c) Vojtech Pavlik and Dan Streetman + * + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * 2008/06/19 Richard Lemon + * Copied mtouch.c and edited for iNexio protocol + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "iNexio serial touchscreen driver" + +MODULE_AUTHOR("Richard Lemon "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define INEXIO_FORMAT_TOUCH_BIT 0x01 +#define INEXIO_FORMAT_LENGTH 5 +#define INEXIO_RESPONSE_BEGIN_BYTE 0x80 + +/* todo: check specs for max length of all responses */ +#define INEXIO_MAX_LENGTH 16 + +#define INEXIO_MIN_XC 0 +#define INEXIO_MAX_XC 0x3fff +#define INEXIO_MIN_YC 0 +#define INEXIO_MAX_YC 0x3fff + +#define INEXIO_GET_XC(data) (((data[1])<<7) | data[2]) +#define INEXIO_GET_YC(data) (((data[3])<<7) | data[4]) +#define INEXIO_GET_TOUCHED(data) (INEXIO_FORMAT_TOUCH_BIT & data[0]) + +/* + * Per-touchscreen data. + */ + +struct inexio { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[INEXIO_MAX_LENGTH]; + char phys[32]; +}; + +static void inexio_process_data(struct inexio *pinexio) +{ + struct input_dev *dev = pinexio->dev; + + if (INEXIO_FORMAT_LENGTH == ++pinexio->idx) { + input_report_abs(dev, ABS_X, INEXIO_GET_XC(pinexio->data)); + input_report_abs(dev, ABS_Y, INEXIO_GET_YC(pinexio->data)); + input_report_key(dev, BTN_TOUCH, INEXIO_GET_TOUCHED(pinexio->data)); + input_sync(dev); + + pinexio->idx = 0; + } +} + +static irqreturn_t inexio_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct inexio* pinexio = serio_get_drvdata(serio); + + pinexio->data[pinexio->idx] = data; + + if (INEXIO_RESPONSE_BEGIN_BYTE&pinexio->data[0]) + inexio_process_data(pinexio); + else + printk(KERN_DEBUG "inexio.c: unknown/unsynchronized data from device, byte %x\n",pinexio->data[0]); + + return IRQ_HANDLED; +} + +/* + * inexio_disconnect() is the opposite of inexio_connect() + */ + +static void inexio_disconnect(struct serio *serio) +{ + struct inexio* pinexio = serio_get_drvdata(serio); + + input_get_device(pinexio->dev); + input_unregister_device(pinexio->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(pinexio->dev); + kfree(pinexio); +} + +/* + * inexio_connect() is the routine that is called when someone adds a + * new serio device that supports iNexio protocol and registers it as + * an input device. This is usually accomplished using inputattach. + */ + +static int inexio_connect(struct serio *serio, struct serio_driver *drv) +{ + struct inexio *pinexio; + struct input_dev *input_dev; + int err; + + pinexio = kzalloc(sizeof(struct inexio), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!pinexio || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + pinexio->serio = serio; + pinexio->dev = input_dev; + snprintf(pinexio->phys, sizeof(pinexio->phys), "%s/input0", serio->phys); + + input_dev->name = "iNexio Serial TouchScreen"; + input_dev->phys = pinexio->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_INEXIO; + input_dev->id.product = 0; + input_dev->id.version = 0x0001; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(pinexio->dev, ABS_X, INEXIO_MIN_XC, INEXIO_MAX_XC, 0, 0); + input_set_abs_params(pinexio->dev, ABS_Y, INEXIO_MIN_YC, INEXIO_MAX_YC, 0, 0); + + serio_set_drvdata(serio, pinexio); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(pinexio->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(pinexio); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id inexio_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_INEXIO, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, inexio_serio_ids); + +static struct serio_driver inexio_drv = { + .driver = { + .name = "inexio", + }, + .description = DRIVER_DESC, + .id_table = inexio_serio_ids, + .interrupt = inexio_interrupt, + .connect = inexio_connect, + .disconnect = inexio_disconnect, +}; + +module_serio_driver(inexio_drv); diff --git a/drivers/input/touchscreen/intel-mid-touch.c b/drivers/input/touchscreen/intel-mid-touch.c new file mode 100644 index 00000000..465db5db --- /dev/null +++ b/drivers/input/touchscreen/intel-mid-touch.c @@ -0,0 +1,671 @@ +/* + * Intel MID Resistive Touch Screen Driver + * + * Copyright (C) 2008 Intel Corp + * + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + * + * Questions/Comments/Bug fixes to Sreedhara (sreedhara.ds@intel.com) + * Ramesh Agarwal (ramesh.agarwal@intel.com) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * + * TODO: + * review conversion of r/m/w sequences + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* PMIC Interrupt registers */ +#define PMIC_REG_ID1 0x00 /* PMIC ID1 register */ + +/* PMIC Interrupt registers */ +#define PMIC_REG_INT 0x04 /* PMIC interrupt register */ +#define PMIC_REG_MINT 0x05 /* PMIC interrupt mask register */ + +/* ADC Interrupt registers */ +#define PMIC_REG_ADCINT 0x5F /* ADC interrupt register */ +#define PMIC_REG_MADCINT 0x60 /* ADC interrupt mask register */ + +/* ADC Control registers */ +#define PMIC_REG_ADCCNTL1 0x61 /* ADC control register */ + +/* ADC Channel Selection registers */ +#define PMICADDR0 0xA4 +#define END_OF_CHANNEL 0x1F + +/* ADC Result register */ +#define PMIC_REG_ADCSNS0H 0x64 + +/* ADC channels for touch screen */ +#define MRST_TS_CHAN10 0xA /* Touch screen X+ connection */ +#define MRST_TS_CHAN11 0xB /* Touch screen X- connection */ +#define MRST_TS_CHAN12 0xC /* Touch screen Y+ connection */ +#define MRST_TS_CHAN13 0xD /* Touch screen Y- connection */ + +/* Touch screen channel BIAS constants */ +#define MRST_XBIAS 0x20 +#define MRST_YBIAS 0x40 +#define MRST_ZBIAS 0x80 + +/* Touch screen coordinates */ +#define MRST_X_MIN 10 +#define MRST_X_MAX 1024 +#define MRST_X_FUZZ 5 +#define MRST_Y_MIN 10 +#define MRST_Y_MAX 1024 +#define MRST_Y_FUZZ 5 +#define MRST_PRESSURE_MIN 0 +#define MRST_PRESSURE_NOMINAL 50 +#define MRST_PRESSURE_MAX 100 + +#define WAIT_ADC_COMPLETION 10 /* msec */ + +/* PMIC ADC round robin delays */ +#define ADC_LOOP_DELAY0 0x0 /* Continuous loop */ +#define ADC_LOOP_DELAY1 0x1 /* 4.5 ms approximate */ + +/* PMIC Vendor Identifiers */ +#define PMIC_VENDOR_FS 0 /* PMIC vendor FreeScale */ +#define PMIC_VENDOR_MAXIM 1 /* PMIC vendor MAXIM */ +#define PMIC_VENDOR_NEC 2 /* PMIC vendor NEC */ +#define MRSTOUCH_MAX_CHANNELS 32 /* Maximum ADC channels */ + +/* Touch screen device structure */ +struct mrstouch_dev { + struct device *dev; /* device associated with touch screen */ + struct input_dev *input; + char phys[32]; + u16 asr; /* Address selection register */ + int irq; + unsigned int vendor; /* PMIC vendor */ + unsigned int rev; /* PMIC revision */ + + int (*read_prepare)(struct mrstouch_dev *tsdev); + int (*read)(struct mrstouch_dev *tsdev, u16 *x, u16 *y, u16 *z); + int (*read_finish)(struct mrstouch_dev *tsdev); +}; + + +/*************************** NEC and Maxim Interface ************************/ + +static int mrstouch_nec_adc_read_prepare(struct mrstouch_dev *tsdev) +{ + return intel_scu_ipc_update_register(PMIC_REG_MADCINT, 0, 0x20); +} + +/* + * Enables PENDET interrupt. + */ +static int mrstouch_nec_adc_read_finish(struct mrstouch_dev *tsdev) +{ + int err; + + err = intel_scu_ipc_update_register(PMIC_REG_MADCINT, 0x20, 0x20); + if (!err) + err = intel_scu_ipc_update_register(PMIC_REG_ADCCNTL1, 0, 0x05); + + return err; +} + +/* + * Reads PMIC ADC touch screen result + * Reads ADC storage registers for higher 7 and lower 3 bits and + * converts the two readings into a single value and turns off gain bit + */ +static int mrstouch_ts_chan_read(u16 offset, u16 chan, u16 *vp, u16 *vm) +{ + int err; + u16 result; + u32 res; + + result = PMIC_REG_ADCSNS0H + offset; + + if (chan == MRST_TS_CHAN12) + result += 4; + + err = intel_scu_ipc_ioread32(result, &res); + if (err) + return err; + + /* Mash the bits up */ + + *vp = (res & 0xFF) << 3; /* Highest 7 bits */ + *vp |= (res >> 8) & 0x07; /* Lower 3 bits */ + *vp &= 0x3FF; + + res >>= 16; + + *vm = (res & 0xFF) << 3; /* Highest 7 bits */ + *vm |= (res >> 8) & 0x07; /* Lower 3 bits */ + *vm &= 0x3FF; + + return 0; +} + +/* + * Enables X, Y and Z bias values + * Enables YPYM for X channels and XPXM for Y channels + */ +static int mrstouch_ts_bias_set(uint offset, uint bias) +{ + int count; + u16 chan, start; + u16 reg[4]; + u8 data[4]; + + chan = PMICADDR0 + offset; + start = MRST_TS_CHAN10; + + for (count = 0; count <= 3; count++) { + reg[count] = chan++; + data[count] = bias | (start + count); + } + + return intel_scu_ipc_writev(reg, data, 4); +} + +/* To read touch screen channel values */ +static int mrstouch_nec_adc_read(struct mrstouch_dev *tsdev, + u16 *x, u16 *y, u16 *z) +{ + int err; + u16 xm, ym, zm; + + /* configure Y bias for X channels */ + err = mrstouch_ts_bias_set(tsdev->asr, MRST_YBIAS); + if (err) + goto ipc_error; + + msleep(WAIT_ADC_COMPLETION); + + /* read x+ and x- channels */ + err = mrstouch_ts_chan_read(tsdev->asr, MRST_TS_CHAN10, x, &xm); + if (err) + goto ipc_error; + + /* configure x bias for y channels */ + err = mrstouch_ts_bias_set(tsdev->asr, MRST_XBIAS); + if (err) + goto ipc_error; + + msleep(WAIT_ADC_COMPLETION); + + /* read y+ and y- channels */ + err = mrstouch_ts_chan_read(tsdev->asr, MRST_TS_CHAN12, y, &ym); + if (err) + goto ipc_error; + + /* configure z bias for x and y channels */ + err = mrstouch_ts_bias_set(tsdev->asr, MRST_ZBIAS); + if (err) + goto ipc_error; + + msleep(WAIT_ADC_COMPLETION); + + /* read z+ and z- channels */ + err = mrstouch_ts_chan_read(tsdev->asr, MRST_TS_CHAN10, z, &zm); + if (err) + goto ipc_error; + + return 0; + +ipc_error: + dev_err(tsdev->dev, "ipc error during adc read\n"); + return err; +} + + +/*************************** Freescale Interface ************************/ + +static int mrstouch_fs_adc_read_prepare(struct mrstouch_dev *tsdev) +{ + int err, count; + u16 chan; + u16 reg[5]; + u8 data[5]; + + /* Stop the ADC */ + err = intel_scu_ipc_update_register(PMIC_REG_MADCINT, 0x00, 0x02); + if (err) + goto ipc_error; + + chan = PMICADDR0 + tsdev->asr; + + /* Set X BIAS */ + for (count = 0; count <= 3; count++) { + reg[count] = chan++; + data[count] = 0x2A; + } + reg[count] = chan++; /* Dummy */ + data[count] = 0; + + err = intel_scu_ipc_writev(reg, data, 5); + if (err) + goto ipc_error; + + msleep(WAIT_ADC_COMPLETION); + + /* Set Y BIAS */ + for (count = 0; count <= 3; count++) { + reg[count] = chan++; + data[count] = 0x4A; + } + reg[count] = chan++; /* Dummy */ + data[count] = 0; + + err = intel_scu_ipc_writev(reg, data, 5); + if (err) + goto ipc_error; + + msleep(WAIT_ADC_COMPLETION); + + /* Set Z BIAS */ + err = intel_scu_ipc_iowrite32(chan + 2, 0x8A8A8A8A); + if (err) + goto ipc_error; + + msleep(WAIT_ADC_COMPLETION); + + return 0; + +ipc_error: + dev_err(tsdev->dev, "ipc error during %s\n", __func__); + return err; +} + +static int mrstouch_fs_adc_read(struct mrstouch_dev *tsdev, + u16 *x, u16 *y, u16 *z) +{ + int err; + u16 result; + u16 reg[4]; + u8 data[4]; + + result = PMIC_REG_ADCSNS0H + tsdev->asr; + + reg[0] = result + 4; + reg[1] = result + 5; + reg[2] = result + 16; + reg[3] = result + 17; + + err = intel_scu_ipc_readv(reg, data, 4); + if (err) + goto ipc_error; + + *x = data[0] << 3; /* Higher 7 bits */ + *x |= data[1] & 0x7; /* Lower 3 bits */ + *x &= 0x3FF; + + *y = data[2] << 3; /* Higher 7 bits */ + *y |= data[3] & 0x7; /* Lower 3 bits */ + *y &= 0x3FF; + + /* Read Z value */ + reg[0] = result + 28; + reg[1] = result + 29; + + err = intel_scu_ipc_readv(reg, data, 4); + if (err) + goto ipc_error; + + *z = data[0] << 3; /* Higher 7 bits */ + *z |= data[1] & 0x7; /* Lower 3 bits */ + *z &= 0x3FF; + + return 0; + +ipc_error: + dev_err(tsdev->dev, "ipc error during %s\n", __func__); + return err; +} + +static int mrstouch_fs_adc_read_finish(struct mrstouch_dev *tsdev) +{ + int err, count; + u16 chan; + u16 reg[5]; + u8 data[5]; + + /* Clear all TS channels */ + chan = PMICADDR0 + tsdev->asr; + for (count = 0; count <= 4; count++) { + reg[count] = chan++; + data[count] = 0; + } + err = intel_scu_ipc_writev(reg, data, 5); + if (err) + goto ipc_error; + + for (count = 0; count <= 4; count++) { + reg[count] = chan++; + data[count] = 0; + } + err = intel_scu_ipc_writev(reg, data, 5); + if (err) + goto ipc_error; + + err = intel_scu_ipc_iowrite32(chan + 2, 0x00000000); + if (err) + goto ipc_error; + + /* Start ADC */ + err = intel_scu_ipc_update_register(PMIC_REG_MADCINT, 0x02, 0x02); + if (err) + goto ipc_error; + + return 0; + +ipc_error: + dev_err(tsdev->dev, "ipc error during %s\n", __func__); + return err; +} + +static void mrstouch_report_event(struct input_dev *input, + unsigned int x, unsigned int y, unsigned int z) +{ + if (z > MRST_PRESSURE_NOMINAL) { + /* Pen touched, report button touch and coordinates */ + input_report_key(input, BTN_TOUCH, 1); + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + } else { + input_report_key(input, BTN_TOUCH, 0); + } + + input_report_abs(input, ABS_PRESSURE, z); + input_sync(input); +} + +/* PENDET interrupt handler */ +static irqreturn_t mrstouch_pendet_irq(int irq, void *dev_id) +{ + struct mrstouch_dev *tsdev = dev_id; + u16 x, y, z; + + /* + * Should we lower thread priority? Probably not, since we are + * not spinning but sleeping... + */ + + if (tsdev->read_prepare(tsdev)) + goto out; + + do { + if (tsdev->read(tsdev, &x, &y, &z)) + break; + + mrstouch_report_event(tsdev->input, x, y, z); + } while (z > MRST_PRESSURE_NOMINAL); + + tsdev->read_finish(tsdev); + +out: + return IRQ_HANDLED; +} + +/* Utility to read PMIC ID */ +static int mrstouch_read_pmic_id(uint *vendor, uint *rev) +{ + int err; + u8 r; + + err = intel_scu_ipc_ioread8(PMIC_REG_ID1, &r); + if (err) + return err; + + *vendor = r & 0x7; + *rev = (r >> 3) & 0x7; + + return 0; +} + +/* + * Parse ADC channels to find end of the channel configured by other ADC user + * NEC and MAXIM requires 4 channels and FreeScale needs 18 channels + */ +static int mrstouch_chan_parse(struct mrstouch_dev *tsdev) +{ + int found = 0; + int err, i; + u8 r8; + + for (i = 0; i < MRSTOUCH_MAX_CHANNELS; i++) { + err = intel_scu_ipc_ioread8(PMICADDR0 + i, &r8); + if (err) + return err; + + if (r8 == END_OF_CHANNEL) { + found = i; + break; + } + } + + if (tsdev->vendor == PMIC_VENDOR_FS) { + if (found > MRSTOUCH_MAX_CHANNELS - 18) + return -ENOSPC; + } else { + if (found > MRSTOUCH_MAX_CHANNELS - 4) + return -ENOSPC; + } + + return found; +} + + +/* + * Writes touch screen channels to ADC address selection registers + */ +static int mrstouch_ts_chan_set(uint offset) +{ + u16 chan; + + int ret, count; + + chan = PMICADDR0 + offset; + for (count = 0; count <= 3; count++) { + ret = intel_scu_ipc_iowrite8(chan++, MRST_TS_CHAN10 + count); + if (ret) + return ret; + } + return intel_scu_ipc_iowrite8(chan++, END_OF_CHANNEL); +} + +/* Initialize ADC */ +static int mrstouch_adc_init(struct mrstouch_dev *tsdev) +{ + int err, start; + u8 ra, rm; + + err = mrstouch_read_pmic_id(&tsdev->vendor, &tsdev->rev); + if (err) { + dev_err(tsdev->dev, "Unable to read PMIC id\n"); + return err; + } + + switch (tsdev->vendor) { + case PMIC_VENDOR_NEC: + case PMIC_VENDOR_MAXIM: + tsdev->read_prepare = mrstouch_nec_adc_read_prepare; + tsdev->read = mrstouch_nec_adc_read; + tsdev->read_finish = mrstouch_nec_adc_read_finish; + break; + + case PMIC_VENDOR_FS: + tsdev->read_prepare = mrstouch_fs_adc_read_prepare; + tsdev->read = mrstouch_fs_adc_read; + tsdev->read_finish = mrstouch_fs_adc_read_finish; + break; + + default: + dev_err(tsdev->dev, + "Unsupported touchscreen: %d\n", tsdev->vendor); + return -ENXIO; + } + + start = mrstouch_chan_parse(tsdev); + if (start < 0) { + dev_err(tsdev->dev, "Unable to parse channels\n"); + return start; + } + + tsdev->asr = start; + + /* + * ADC power on, start, enable PENDET and set loop delay + * ADC loop delay is set to 4.5 ms approximately + * Loop delay more than this results in jitter in adc readings + * Setting loop delay to 0 (continuous loop) in MAXIM stops PENDET + * interrupt generation sometimes. + */ + + if (tsdev->vendor == PMIC_VENDOR_FS) { + ra = 0xE0 | ADC_LOOP_DELAY0; + rm = 0x5; + } else { + /* NEC and MAXIm not consistent with loop delay 0 */ + ra = 0xE0 | ADC_LOOP_DELAY1; + rm = 0x0; + + /* configure touch screen channels */ + err = mrstouch_ts_chan_set(tsdev->asr); + if (err) + return err; + } + + err = intel_scu_ipc_update_register(PMIC_REG_ADCCNTL1, ra, 0xE7); + if (err) + return err; + + err = intel_scu_ipc_update_register(PMIC_REG_MADCINT, rm, 0x03); + if (err) + return err; + + return 0; +} + + +/* Probe function for touch screen driver */ +static int mrstouch_probe(struct platform_device *pdev) +{ + struct mrstouch_dev *tsdev; + struct input_dev *input; + int err; + int irq; + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "no interrupt assigned\n"); + return -EINVAL; + } + + tsdev = kzalloc(sizeof(struct mrstouch_dev), GFP_KERNEL); + input = input_allocate_device(); + if (!tsdev || !input) { + dev_err(&pdev->dev, "unable to allocate memory\n"); + err = -ENOMEM; + goto err_free_mem; + } + + tsdev->dev = &pdev->dev; + tsdev->input = input; + tsdev->irq = irq; + + snprintf(tsdev->phys, sizeof(tsdev->phys), + "%s/input0", dev_name(tsdev->dev)); + + err = mrstouch_adc_init(tsdev); + if (err) { + dev_err(&pdev->dev, "ADC initialization failed\n"); + goto err_free_mem; + } + + input->name = "mrst_touchscreen"; + input->phys = tsdev->phys; + input->dev.parent = tsdev->dev; + + input->id.vendor = tsdev->vendor; + input->id.version = tsdev->rev; + + input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(tsdev->input, ABS_X, + MRST_X_MIN, MRST_X_MAX, MRST_X_FUZZ, 0); + input_set_abs_params(tsdev->input, ABS_Y, + MRST_Y_MIN, MRST_Y_MAX, MRST_Y_FUZZ, 0); + input_set_abs_params(tsdev->input, ABS_PRESSURE, + MRST_PRESSURE_MIN, MRST_PRESSURE_MAX, 0, 0); + + err = request_threaded_irq(tsdev->irq, NULL, mrstouch_pendet_irq, + IRQF_ONESHOT, "mrstouch", tsdev); + if (err) { + dev_err(tsdev->dev, "unable to allocate irq\n"); + goto err_free_mem; + } + + err = input_register_device(tsdev->input); + if (err) { + dev_err(tsdev->dev, "unable to register input device\n"); + goto err_free_irq; + } + + platform_set_drvdata(pdev, tsdev); + return 0; + +err_free_irq: + free_irq(tsdev->irq, tsdev); +err_free_mem: + input_free_device(input); + kfree(tsdev); + return err; +} + +static int mrstouch_remove(struct platform_device *pdev) +{ + struct mrstouch_dev *tsdev = platform_get_drvdata(pdev); + + free_irq(tsdev->irq, tsdev); + input_unregister_device(tsdev->input); + kfree(tsdev); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver mrstouch_driver = { + .driver = { + .name = "pmic_touch", + .owner = THIS_MODULE, + }, + .probe = mrstouch_probe, + .remove = mrstouch_remove, +}; +module_platform_driver(mrstouch_driver); + +MODULE_AUTHOR("Sreedhara Murthy. D.S, sreedhara.ds@intel.com"); +MODULE_DESCRIPTION("Intel Moorestown Resistive Touch Screen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ist30xx/Makefile b/drivers/input/touchscreen/ist30xx/Makefile new file mode 100644 index 00000000..e233462a --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for the imagis kanas driver. +# + +# Each configuration option enables a list of files. + +obj-y += ist30xx.o ist30xx_misc.o ist30xx_sec.o ist30xx_sys.o ist30xx_tracking.o ist30xx_update.o diff --git a/drivers/input/touchscreen/ist30xx/firmware/IST3038_FW_KANAS.h b/drivers/input/touchscreen/ist30xx/firmware/IST3038_FW_KANAS.h new file mode 100644 index 00000000..f227bc28 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/IST3038_FW_KANAS.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS_GF , f/w 15(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xAD,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x39,0x4A,0x37,0x48,0x37,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x35,0x48,0x01,0x21,0x89,0x07,0xC8,0x61, + 0x34,0x48,0xC9,0x14,0x01,0x62,0x00,0x21,0x01,0x62,0x01,0x62,0x32,0x49,0x33,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x2D,0x4B, + 0x9F,0x6A,0x2F,0x48,0x00,0x69,0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61, + 0xFF,0xF7,0xE2,0xFF,0x58,0x69,0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x29,0x48, + 0x29,0x4C,0x20,0x60,0xFF,0x20,0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68, + 0xA6,0x15,0x30,0x43,0xA0,0x60,0x21,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x23,0x4F, + 0x21,0xE0,0x68,0x68,0x00,0x07,0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61, + 0x68,0x69,0x18,0x42,0xFC,0xD1,0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69, + 0x18,0x42,0xFC,0xD1,0x0D,0xE0,0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69, + 0x80,0x06,0xFC,0xD4,0x68,0x68,0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0xFF,0xF7,0xA9,0xFF,0xE0,0x68,0x11,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7, + 0xA3,0xFF,0xA0,0x68,0xB0,0x43,0xA0,0x60,0x00,0xF0,0x3A,0xF9,0xF8,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0x00,0x00,0x10,0x84,0x02,0x00,0x00,0xEC,0x00,0x00,0x00, + 0x5C,0x0A,0x00,0x00,0x40,0x00,0x00,0x40,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F, + 0x50,0xC3,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61, + 0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4, + 0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22, + 0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2, + 0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06, + 0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF, + 0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21, + 0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06, + 0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0xFF,0x20,0x00,0xF0,0x6E,0xFE, + 0x03,0x25,0x0F,0x4E,0x2D,0x07,0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B, + 0xE9,0x68,0x80,0x08,0x3C,0x00,0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42, + 0x00,0xD0,0x34,0x63,0x81,0x00,0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x08,0xF0, + 0x3A,0xFD,0xE8,0x68,0xA0,0x43,0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x30,0x70,0x06,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x54,0x4A,0x51,0x48,0x52,0x49,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0, + 0x52,0x1E,0xFB,0xD2,0x00,0xF0,0x16,0xFE,0x07,0x00,0x03,0xF0,0xB1,0xFF,0x03,0xF0, + 0xA3,0xFF,0x04,0xF0,0x35,0xF8,0x4C,0x4A,0x4C,0x49,0x4D,0x48,0x00,0xF0,0x00,0xFA, + 0x05,0x21,0x49,0x03,0x00,0x20,0x00,0xF0,0x01,0xFA,0x4A,0x4C,0x4A,0x49,0xA0,0x62, + 0x00,0x20,0x00,0xF0,0xFB,0xF9,0x49,0x4B,0x49,0x49,0xD8,0x63,0x49,0x48,0x00,0xF0, + 0xF5,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0xF5,0xFF,0x46,0x4A, + 0x46,0x48,0x00,0x21,0x00,0xF0,0xF2,0xF9,0x07,0xF0,0x88,0xFF,0x04,0xF0,0xA4,0xF8, + 0x43,0x48,0x00,0x26,0x81,0x7A,0x01,0x25,0x6D,0x07,0xE1,0x73,0xC1,0x7A,0x21,0x74, + 0x41,0x7A,0x61,0x74,0xA6,0x73,0xA6,0x74,0xE6,0x74,0x26,0x75,0x66,0x75,0xA6,0x75, + 0xE6,0x75,0x01,0x8F,0x61,0x83,0xC0,0x8E,0xA0,0x83,0x38,0x48,0x68,0x63,0xFF,0x20, + 0xE8,0x63,0xE8,0x14,0x00,0xF0,0xAA,0xFD,0x36,0x48,0x06,0x70,0xFF,0x20,0x81,0x30, + 0x00,0xF0,0xA4,0xFD,0x34,0x49,0x02,0x20,0x08,0xF0,0x0A,0xFB,0x02,0x20,0x08,0xF0, + 0x0F,0xFB,0x60,0x7C,0x00,0x28,0x01,0xD0,0x08,0xF0,0x74,0xFC,0x00,0x2F,0x1F,0xD1, + 0x2E,0x4E,0xB7,0x15,0x60,0x7C,0x00,0x28,0x02,0xD0,0x2D,0x49,0xE0,0x6F,0x88,0x60, + 0xE8,0x6B,0x0B,0x28,0x14,0xD0,0x2B,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0, + 0x3D,0xFD,0xF0,0x68,0x28,0x49,0x88,0x42,0xEC,0xD9,0x28,0x48,0xC0,0x68,0xFF,0x28, + 0x06,0xD1,0xB0,0x68,0xB8,0x43,0xB0,0x60,0xB0,0x68,0x38,0x43,0xB0,0x60,0xE1,0xE7, + 0x20,0x7C,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x67,0xFD,0x60,0x7C, + 0x00,0x28,0x01,0xD0,0x08,0xF0,0x4E,0xFC,0x02,0x20,0x08,0xF0,0xE9,0xFA,0xFF,0x20, + 0x81,0x30,0x00,0xF0,0x5B,0xFD,0x1A,0x49,0x05,0x20,0x03,0xF0,0x71,0xFD,0x0B,0x20, + 0xE8,0x63,0x03,0xF0,0x27,0xFE,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x05,0x00,0x10, + 0x40,0x90,0x00,0x00,0x80,0x01,0x00,0x00,0x28,0x00,0x00,0x00,0x18,0x90,0x00,0x00, + 0x00,0x00,0x00,0x10,0x8C,0x05,0x00,0x20,0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20, + 0x00,0x9D,0x00,0x00,0x00,0x93,0x00,0x00,0x4C,0x05,0x00,0x00,0x40,0x00,0x00,0x20, + 0x00,0x93,0x00,0x00,0xF5,0x06,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40, + 0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00, + 0x65,0x8B,0x00,0x00,0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A, + 0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0,0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0, + 0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0, + 0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0,0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1, + 0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3,0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21, + 0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A,0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A, + 0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0,0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0, + 0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0,0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0, + 0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0, + 0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0, + 0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21,0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3, + 0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0, + 0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3, + 0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3, + 0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3, + 0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A, + 0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5,0x02,0x20,0x08,0xF0,0x2B,0xFB,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0, + 0xA0,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0, + 0x83,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0,0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x48,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10,0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0xF0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x28,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10,0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xF0,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0xA8,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0xC6,0xFD,0xFF,0xEA, + 0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40, + 0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60, + 0x0B,0x24,0x02,0xF0,0x1D,0xFB,0x64,0x1E,0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27, + 0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x79,0xC0,0x07,0x26,0xD0,0x70,0x78,0x00,0x28, + 0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04, + 0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24, + 0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18,0x28,0x19,0x07,0xF0, + 0x3B,0xFE,0x64,0x1C,0x70,0x78,0xA0,0x42,0xF3,0xDA,0x70,0x78,0x01,0x28,0x02,0xD1, + 0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x78,0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xD2,0x04,0x00,0x00, + 0x70,0xB4,0x1C,0x4B,0xDA,0x88,0xD2,0x07,0x2F,0xD1,0x1B,0x4A,0x05,0x78,0x54,0x78, + 0xE4,0x00,0xE6,0x18,0x13,0x24,0xA4,0x01,0x36,0x19,0xB5,0x76,0x56,0x78,0x45,0x88, + 0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x83,0x56,0x78,0x85,0x88,0xF6,0x00,0xF6,0x18, + 0x34,0x19,0xE5,0x83,0x54,0x78,0xE4,0x00,0xE5,0x18,0x27,0x24,0x64,0x01,0x2D,0x19, + 0x29,0x70,0x55,0x78,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19,0x59,0x70,0x51,0x78, + 0x00,0x23,0x49,0x1C,0x51,0x70,0xC0,0x79,0x01,0x21,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x93,0x70,0xD1,0x70,0x70,0xBC,0x70,0x47,0x91,0x70, + 0xD3,0x70,0xFA,0xE7,0x40,0x00,0x00,0x20,0xE0,0x04,0x00,0x20,0xF0,0x00,0x2D,0xE9, + 0x70,0x60,0x9F,0xE5,0x01,0xC1,0x81,0xE0,0x8C,0xC0,0x86,0xE0,0x81,0x40,0x86,0xE0, + 0x84,0x21,0xCC,0xE5,0xB4,0x5F,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x05,0x05,0xE0,0xA5,0x79,0xA0,0xE1,0x01,0x5C,0x8C,0xE2,0x01,0x4C,0x84,0xE2, + 0xB6,0x78,0xC5,0xE1,0xB6,0x40,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x04,0x04,0xE0,0xA4,0x49,0xA0,0xE1,0xB8,0x48,0xC5,0xE1,0x01,0x40,0x86,0xE0, + 0x38,0x41,0xD4,0xE5,0x85,0x41,0xCC,0xE5,0x8A,0x31,0xCC,0xE5,0x01,0x20,0xC0,0xE7, + 0x02,0x00,0x86,0xE0,0x9B,0x12,0xC0,0xE5,0x00,0x10,0xA0,0xE3,0x92,0x12,0xC0,0xE5, + 0xF0,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x08,0x4A,0x07,0x49, + 0x12,0x78,0x08,0x68,0x0F,0x23,0x40,0x1C,0x12,0x07,0x12,0x0A,0x9B,0x06,0xD2,0x18, + 0x00,0x03,0x00,0x0B,0x02,0x43,0x0A,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x6C,0x06,0x00,0x20,0xF1,0xB5,0x78,0x20,0x94,0xB0,0x07,0x90,0xE2,0x48,0x13,0x90, + 0x40,0x7C,0x03,0x90,0x13,0x98,0xC0,0x7C,0x02,0x90,0x13,0x98,0x00,0x7C,0x01,0x90, + 0xDE,0x48,0x00,0x68,0x00,0x88,0x00,0x05,0x7E,0xD5,0x14,0x98,0x01,0x28,0x00,0xD0, + 0x02,0x20,0x04,0x90,0x00,0x20,0x08,0x90,0xA6,0xE1,0x04,0x98,0x81,0x00,0x01,0x20, + 0x40,0x07,0x08,0x18,0x12,0x90,0x00,0x68,0x81,0x00,0x11,0x90,0x0C,0x0F,0x80,0x0F, + 0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x37,0xFD,0x8E,0xE1,0xD0,0x48,0xA5,0x00, + 0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x11,0x98,0xCD,0x49,0x80,0x01,0x80,0x0D, + 0x48,0x53,0x11,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80,0x4A,0x5B,0x24,0x31, + 0x4A,0x53,0x69,0x18,0x48,0x80,0x78,0xE1,0x03,0x9F,0xC5,0x49,0x00,0x20,0x7F,0x1E, + 0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52, + 0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x11,0x98,0x62,0x46,0x80,0x01,0x80,0x0D, + 0x82,0x1A,0x10,0x90,0x03,0x98,0xBA,0x4B,0x80,0x00,0x08,0x18,0x20,0x38,0x82,0x83, + 0x11,0x9A,0xEB,0x18,0x92,0x05,0x92,0x0D,0x0E,0x93,0x0F,0x92,0x5B,0x88,0xD2,0x1A, + 0xC2,0x83,0x00,0x20,0x07,0x00,0x02,0x00,0x07,0xE0,0x93,0x00,0xCE,0x5E,0x30,0x18, + 0xCE,0x18,0x02,0x23,0xF3,0x5E,0xDF,0x19,0x52,0x1C,0x03,0x9B,0x9A,0x42,0xF4,0xDB, + 0x19,0x00,0xFF,0xF7,0xFF,0xFC,0x06,0x90,0x03,0x99,0x38,0x00,0xFF,0xF7,0xFA,0xFC, + 0x05,0x90,0x06,0x98,0x00,0x28,0x00,0xDC,0x40,0x42,0x13,0x99,0x89,0x7C,0x88,0x42, + 0x14,0xDA,0x05,0x98,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x0E,0xDA,0xA0,0x4B, + 0x60,0x00,0x1C,0x3B,0x19,0x5E,0x00,0xE0,0x32,0xE1,0x13,0x9A,0x02,0x9E,0x12,0x7D, + 0xB6,0x1A,0xB1,0x42,0x0A,0xDA,0x89,0x18,0x19,0x52,0x07,0xE0,0x98,0x49,0x13,0x9B, + 0x60,0x00,0x1C,0x39,0x0A,0x5A,0x5B,0x7D,0xD2,0x1A,0x0A,0x52,0x94,0x49,0x60,0x00, + 0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E,0x02,0x99, + 0x88,0x42,0x0D,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0,0x88,0x00,0x05,0x21,0xFF,0xF7, + 0xF1,0xFD,0x0D,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x02,0x98,0x41,0x00, + 0x40,0x18,0x05,0x21,0xFF,0xF7,0xE6,0xFD,0x0D,0x99,0x88,0x42,0x01,0xDC,0x03,0x20, + 0x14,0xE0,0x02,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7,0xDC,0xFD,0x0D,0x99,0x88,0x42, + 0x01,0xDC,0x02,0x20,0x0A,0xE0,0x02,0x98,0x05,0x21,0xFF,0xF7,0xD3,0xFD,0x0D,0x99, + 0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x78,0x49,0x0A,0x39, + 0x08,0x55,0x77,0x49,0x10,0x9A,0x24,0x31,0x48,0x5F,0x17,0x1A,0x0C,0x90,0x68,0x18, + 0x02,0x21,0x0B,0x90,0x41,0x5E,0x0F,0x9A,0x71,0x48,0x56,0x1A,0x0A,0x38,0x0A,0x91, + 0x01,0x5D,0x13,0x98,0x80,0x7D,0x81,0x42,0x27,0xD3,0x00,0x2F,0x01,0xD1,0x00,0x24, + 0x0D,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x01,0x99,0x88,0x42,0x01,0xDA,0x01,0x24, + 0x05,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7,0x74,0xFC,0x04,0x00,0x00,0x2E, + 0x01,0xD1,0x00,0x20,0x0C,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x01,0x99,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x04,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7,0x62,0xFC, + 0x0C,0x99,0x00,0x2F,0x1D,0xDB,0x09,0x19,0x1C,0xE0,0x0D,0x98,0xFF,0x21,0x91,0x31, + 0x48,0x43,0x05,0x21,0xFF,0xF7,0x56,0xFC,0x02,0x99,0xFF,0xF7,0x53,0xFC,0x64,0x21, + 0x08,0x1A,0x39,0x1E,0x09,0x90,0x00,0xDC,0x79,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7, + 0x49,0xFC,0x09,0x9A,0x04,0x00,0x30,0x1E,0x00,0xDC,0x70,0x42,0x50,0x43,0x64,0x21, + 0xDC,0xE7,0x09,0x1B,0x0C,0x00,0x0A,0x99,0x00,0x2E,0x01,0xDB,0x08,0x18,0x00,0xE0, + 0x08,0x1A,0x05,0x2F,0x01,0xDC,0x05,0x2E,0x5F,0xDD,0x14,0x99,0x01,0x29,0x5C,0xD1, + 0x43,0x49,0x6C,0x31,0x8A,0x68,0x92,0x19,0x8A,0x60,0x0A,0x68,0x92,0x00,0x52,0x18, + 0x97,0x81,0x0A,0x68,0x92,0x00,0x52,0x18,0xD6,0x81,0x49,0x68,0x0E,0x00,0x02,0x29, + 0x41,0xD9,0x3B,0x4A,0x6C,0x32,0x91,0x68,0x00,0x29,0x00,0xDC,0x49,0x42,0x64,0x29, + 0x39,0xDA,0x00,0x20,0x81,0x00,0x89,0x18,0x0C,0x23,0xCB,0x5E,0x06,0x9C,0x40,0x1C, + 0x1B,0x19,0x06,0x93,0x0E,0x23,0xCB,0x5E,0x05,0x99,0x59,0x18,0x03,0x28,0x05,0x91, + 0xF0,0xDB,0x10,0x98,0x3C,0x28,0x0E,0xD3,0x2B,0x49,0x02,0x00,0xA0,0x39,0x08,0x8C, + 0x3C,0x38,0x82,0x42,0x07,0xDB,0x0F,0x98,0x3C,0x28,0x04,0xD3,0x02,0x00,0x48,0x8C, + 0x3C,0x38,0x82,0x42,0x01,0xDA,0xC8,0x20,0x07,0x90,0x06,0x98,0x64,0x21,0x48,0x43, + 0x03,0x21,0xFF,0xF7,0xEF,0xFB,0x07,0x99,0xFF,0xF7,0xEC,0xFB,0x0C,0x99,0x44,0x18, + 0x05,0x98,0x64,0x21,0x48,0x43,0x03,0x21,0xFF,0xF7,0xE4,0xFB,0x07,0x99,0xFF,0xF7, + 0xE1,0xFB,0x0A,0x99,0x40,0x18,0x1A,0x4B,0x00,0x21,0x6C,0x33,0x1A,0x68,0x02,0x2A, + 0x00,0xD0,0x51,0x1C,0x19,0x60,0x71,0x1C,0x59,0x60,0x15,0x49,0x10,0x9A,0x4A,0x53, + 0x0E,0x9A,0x0F,0x99,0x51,0x80,0x12,0x4A,0x24,0x32,0x54,0x53,0x0B,0x99,0x11,0x4A, + 0x48,0x80,0x11,0x99,0x80,0x05,0x11,0x40,0xA2,0x05,0x92,0x09,0x11,0x43,0x89,0x0A, + 0x89,0x02,0x80,0x0D,0x01,0x43,0x12,0x98,0x01,0x60,0x08,0x98,0x40,0x1C,0x08,0x90, + 0x04,0x98,0x40,0x1C,0x04,0x90,0x08,0x98,0x14,0x99,0x88,0x42,0x00,0xDA,0x54,0xE6, + 0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xF8,0x09,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4,0x15,0x21,0xDA,0x88, + 0x89,0x01,0x80,0x24,0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x0D,0x80, + 0xC5,0x89,0x4D,0x80,0x05,0x8A,0x8D,0x80,0x40,0x8A,0xC8,0x80,0x08,0x48,0x20,0x30, + 0x00,0x89,0x22,0x43,0x08,0x81,0x06,0xE0,0x00,0x20,0x08,0x80,0x48,0x80,0x88,0x80, + 0xC8,0x80,0xA2,0x43,0x08,0x81,0xDA,0x80,0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20, + 0x80,0x93,0x00,0x00,0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A, + 0x00,0x28,0x09,0xD1,0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x02,0xF0,0x34,0xF8, + 0x64,0x1E,0xFB,0xD2,0xFF,0x24,0x12,0xE0,0x06,0xF0,0x4C,0xFC,0x01,0xF0,0xFA,0xFE, + 0x01,0xF0,0x00,0xFF,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x05,0xF0,0xB3,0xF9,0x04,0x00, + 0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20, + 0x07,0xF0,0x06,0xFE,0x02,0x20,0x07,0xF0,0xF3,0xFD,0x12,0x49,0xE8,0x68,0xC8,0x61, + 0x28,0x69,0xC8,0x61,0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B, + 0x0F,0x48,0x02,0xE0,0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5, + 0x48,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x1F,0xF8,0x01,0x20,0x00,0xF0,0x6E,0xF8, + 0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0xAA,0xF8, + 0x1C,0x48,0x03,0x27,0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0x72,0xFC,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x74,0xFC, + 0x16,0x49,0x40,0x22,0x01,0xA8,0xFF,0xF7,0x53,0xFC,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x07,0xF0,0xCA,0xFE,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x65,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0x68,0x01,0x8D,0xE5,0x0C,0x08,0x9F,0xE5,0x0C,0x28,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xB0,0x24,0xD2,0xE1,0x78,0x10,0xD0,0xE5,0x77,0x70,0xD0,0xE5,0xFC,0x97,0x9F,0xE5, + 0x02,0x10,0x81,0xE0,0xFF,0x80,0x01,0xE2,0x79,0x10,0xD0,0xE5,0x00,0x50,0xE0,0xE3, + 0x00,0xB0,0xA0,0xE3,0x08,0x10,0x8D,0xE5,0x7A,0x00,0xD0,0xE5,0x04,0x00,0x8D,0xE5, + 0xDC,0x07,0x9F,0xE5,0x04,0x40,0xD9,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x00,0x1A,0xCC,0x07,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xFA,0x00,0x50,0xE3, + 0x02,0x00,0x00,0x9A,0x03,0x80,0xA0,0xE3,0x08,0x80,0x8D,0xE5,0x0A,0x00,0x00,0xEA, + 0xB4,0x07,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x01,0x00,0x50,0xE3,0x02,0x80,0xA0,0x03, + 0x03,0x00,0xA0,0x03,0x03,0x00,0x00,0x0A,0xC8,0x02,0xD9,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x0A,0x00,0x00,0xA0,0xE3,0x08,0x00,0x8D,0xE5,0x82,0x01,0xD9,0xE5, + 0x01,0x60,0xA0,0xE3,0x01,0x00,0x50,0xE3,0x0E,0x00,0x00,0xBA,0x06,0x01,0x86,0xE0, + 0x80,0x00,0x89,0xE0,0x38,0x12,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A, + 0x02,0x0C,0x80,0xE2,0x3E,0x00,0x80,0xE2,0x3C,0x0C,0x00,0xEB,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x8B,0x12,0xFF,0xB0,0x00,0x12,0x82,0x01,0xD9,0xE5,0x01,0x60,0x86,0xE2, + 0x06,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA,0x40,0x07,0x9F,0xE5,0x00,0xA0,0xA0,0xE3, + 0xB4,0x3B,0xD0,0xE1,0xB8,0x2B,0xD0,0xE1,0x01,0x60,0xA0,0xE3,0x02,0x10,0x43,0xE0, + 0x00,0x00,0x51,0xE3,0x03,0x10,0x42,0xD0,0x01,0x28,0xA0,0xE1,0xB6,0x1B,0xD0,0xE1, + 0xBA,0x3B,0xD0,0xE1,0x22,0x28,0xA0,0xE1,0xB3,0xA2,0xC9,0xE5,0x03,0x00,0x41,0xE0, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x43,0xD0,0x00,0x00,0x5B,0xE3,0x00,0x08,0xA0,0xE1, + 0x28,0x00,0x52,0x13,0x20,0x08,0xA0,0xE1,0x06,0x00,0x00,0x2A,0x32,0x00,0x50,0xE3, + 0xB3,0x62,0xC9,0x35,0x03,0x00,0x00,0x3A,0x64,0x00,0x50,0xE3,0x03,0x00,0xA0,0x23, + 0x02,0x00,0xA0,0x33,0xB3,0x02,0xC9,0xE5,0xB2,0x02,0xD9,0xE5,0x00,0x00,0x50,0xE3, + 0x0B,0x00,0x00,0x1A,0xB3,0x02,0xD9,0xE5,0x01,0x00,0x50,0xE3,0x01,0x00,0x87,0x02, + 0xFF,0x70,0x00,0x02,0x06,0x00,0x00,0x0A,0x02,0x00,0x50,0xE3,0x02,0x00,0x87,0x02, + 0x02,0x00,0x00,0x0A,0x03,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x03,0x00,0x87,0xE2, + 0xFF,0x70,0x00,0xE2,0x09,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0x8C,0xFD,0xFF,0xEB,0xB6,0x00,0xD9,0xE1,0x84,0xB6,0x9F,0xE5,0x46,0x0F,0x10,0xE3, + 0x04,0x00,0x00,0x0A,0xD8,0x04,0x00,0xEB,0x00,0x60,0xCB,0xE5,0x65,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x50,0x06,0x9F,0xE5,0x00,0xA0,0xCB,0xE5, + 0x83,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3,0x40,0x16,0x9F,0x15,0x01,0x00,0x40,0x12, + 0x83,0x01,0xC1,0x15,0x00,0x00,0x54,0xE3,0x04,0x00,0x00,0x1A,0x2C,0x06,0x9F,0xE5, + 0x81,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3,0x7C,0x01,0x00,0x0A,0x17,0x00,0x00,0xEA, + 0x18,0x96,0x9F,0xE5,0x81,0x01,0xD9,0xE5,0x00,0x00,0x50,0xE3,0x13,0x00,0x00,0x1A, + 0x20,0x06,0x9F,0xE5,0x5A,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x6D,0xFD,0xFF,0xEB, + 0x83,0x01,0xD9,0xE5,0x00,0x00,0x50,0xE3,0x70,0x01,0x00,0x1A,0x01,0x00,0x54,0xE3, + 0x01,0x50,0xA0,0xE3,0x07,0x00,0x00,0xBA,0xFF,0x20,0x05,0xE2,0xFF,0x10,0x05,0xE2, + 0x14,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0xC7,0xFD,0xFF,0xEB,0x01,0x50,0x85,0xE2, + 0x04,0x00,0x55,0xE1,0xF7,0xFF,0xFF,0xDA,0x80,0x41,0xC9,0xE5,0x63,0x01,0x00,0xEA, + 0x09,0x20,0xA0,0xE3,0x01,0x10,0xA0,0xE3,0x15,0x0E,0x8D,0xE2,0x59,0xFD,0xFF,0xEB, + 0x01,0x00,0x87,0xE2,0x90,0x01,0x8D,0xE5,0x02,0x00,0x88,0xE2,0x8C,0x01,0x8D,0xE5, + 0xB4,0x05,0x9F,0xE5,0x01,0x60,0xA0,0xE3,0x88,0x01,0x8D,0xE5,0x09,0x00,0x40,0xE2, + 0x84,0x01,0x8D,0xE5,0x08,0x70,0xA0,0xE3,0x0C,0x80,0x8D,0xE2,0x87,0x01,0x87,0xE0, + 0x0C,0x10,0x8D,0xE2,0x00,0x01,0x81,0xE0,0x24,0x20,0xA0,0xE3,0x00,0x10,0xE0,0xE3, + 0x48,0xFD,0xFF,0xEB,0x01,0x70,0x57,0xE2,0xF7,0xFF,0xFF,0x5A,0x06,0x00,0xA0,0xE1, + 0x5F,0x06,0x00,0xEB,0x01,0x00,0x54,0xE3,0x00,0x80,0xA0,0xE1,0x01,0x90,0xA0,0xE3, + 0x47,0x00,0x00,0xBA,0x44,0x05,0x9F,0xE5,0x08,0xA0,0xA0,0xE1,0x82,0x11,0xD0,0xE5, + 0x01,0x70,0xA0,0xE3,0x01,0x00,0x51,0xE3,0x3E,0x00,0x00,0xBA,0x89,0x00,0x80,0xE0, + 0x80,0x01,0x8D,0xE5,0x01,0x0C,0x80,0xE2,0x7C,0x01,0x8D,0xE5,0x89,0x01,0x89,0xE0, + 0x0C,0x10,0x8D,0xE2,0x78,0x01,0x8D,0xE5,0x00,0x01,0x81,0xE0,0x74,0x01,0x8D,0xE5, + 0x08,0x15,0x9F,0xE5,0x07,0x01,0x87,0xE0,0x80,0xB0,0x81,0xE0,0x38,0x02,0xDB,0xE5, + 0x00,0x00,0x50,0xE3,0x2A,0x00,0x00,0x0A,0x02,0x0C,0x8B,0xE2,0x3E,0x00,0x80,0xE2, + 0x70,0x01,0x8D,0xE5,0xA1,0x0B,0x00,0xEB,0x06,0x00,0x90,0xE1,0x04,0x00,0x00,0x0A, + 0x70,0x01,0x9D,0xE5,0x9D,0x0B,0x00,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x56,0x13, + 0x1F,0x00,0x00,0x0A,0x80,0x01,0x9D,0xE5,0xCD,0x10,0xA0,0xE3,0xB4,0x0F,0xD0,0xE1, + 0x33,0x1B,0x81,0xE2,0x91,0x00,0x00,0xE0,0xA0,0x29,0xA0,0xE1,0x02,0x0C,0x8B,0xE2, + 0xBA,0x33,0xD0,0xE1,0x02,0x10,0x43,0xE0,0x00,0x00,0x51,0xE3,0x03,0x10,0x42,0xD0, + 0x7C,0x21,0x9D,0xE5,0xCD,0x30,0xA0,0xE3,0xB6,0x20,0xD2,0xE1,0x33,0x3B,0x83,0xE2, + 0x93,0x02,0x02,0xE0,0xBC,0x33,0xD0,0xE1,0xA2,0x29,0xA0,0xE1,0x02,0x00,0x43,0xE0, + 0x00,0x00,0x50,0xE3,0x03,0x00,0x42,0xD0,0x91,0x01,0x02,0xE0,0x00,0x10,0xA0,0xE1, + 0x91,0x20,0x20,0xE0,0x0A,0x00,0x50,0xE1,0x03,0x00,0x00,0xAA,0x78,0x11,0x9D,0xE5, + 0x0C,0x20,0x8D,0xE2,0x00,0xA0,0xA0,0xE1,0x01,0x71,0x82,0xE7,0x74,0x11,0x9D,0xE5, + 0x07,0x01,0x81,0xE7,0x44,0x04,0x9F,0xE5,0x01,0x70,0x87,0xE2,0x82,0x01,0xD0,0xE5, + 0x07,0x00,0x50,0xE1,0xC9,0xFF,0xFF,0xAA,0x01,0x90,0x89,0xE2,0x04,0x00,0x59,0xE1, + 0xB7,0xFF,0xFF,0xDA,0x01,0x00,0xA0,0xE3,0x01,0x00,0x54,0xE3,0x6C,0x01,0x8D,0xE5, + 0x7D,0x00,0x00,0xBA,0x0C,0x70,0x8D,0xE2,0x01,0xC0,0xA0,0xE3,0x01,0x00,0x54,0xE3, + 0x08,0x30,0xA0,0xE1,0x0C,0x00,0xA0,0xE1,0x72,0x00,0x00,0xBA,0x57,0x1F,0x8D,0xE2, + 0x00,0x10,0xD1,0xE7,0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0x1A,0x80,0x11,0x80,0xE0, + 0x01,0x21,0x97,0xE7,0x01,0x91,0x87,0xE0,0x02,0x11,0x99,0xE7,0x03,0x00,0x51,0xE1, + 0x05,0x00,0x00,0xAA,0x00,0x00,0x51,0xE3,0x00,0x00,0x52,0xA3,0x02,0x00,0x00,0xBA, + 0x00,0x50,0xA0,0xE1,0x01,0x30,0xA0,0xE1,0x00,0xC0,0xA0,0xE3,0x01,0x00,0x80,0xE2, + 0x04,0x00,0x50,0xE1,0xEC,0xFF,0xFF,0xDA,0x00,0x00,0x5C,0xE3,0x5D,0x00,0x00,0x1A, + 0x68,0x01,0x9D,0xE5,0x85,0x91,0x85,0xE0,0x01,0x00,0x80,0xE2,0x68,0x01,0x8D,0xE5, + 0x09,0x01,0x97,0xE7,0x94,0xB3,0x9F,0xE5,0x00,0x01,0x80,0xE0,0x80,0x00,0x8B,0xE0, + 0x01,0x1C,0x80,0xE2,0x05,0x01,0x85,0xE0,0x80,0xA0,0x8B,0xE0,0xDE,0x10,0x81,0xE2, + 0x61,0x0F,0x8A,0xE2,0x0A,0x20,0xA0,0xE3,0xCC,0xFC,0xFF,0xEB,0x85,0x00,0x8B,0xE0, + 0xB4,0x1F,0xD0,0xE1,0xCD,0x20,0xA0,0xE3,0x33,0x2B,0x82,0xE2,0x92,0x01,0x01,0xE0, + 0xA1,0x29,0xA0,0xE1,0x01,0x1C,0x8A,0xE2,0x01,0x0C,0x80,0xE2,0xB6,0x28,0xC1,0xE1, + 0xB6,0x00,0xD0,0xE1,0xCD,0x20,0xA0,0xE3,0x33,0x2B,0x82,0xE2,0x92,0x00,0x00,0xE0, + 0xA0,0x09,0xA0,0xE1,0xB8,0x08,0xC1,0xE1,0x05,0x00,0x8B,0xE0,0x38,0x01,0xD0,0xE5, + 0x85,0x01,0xCA,0xE5,0x8A,0x01,0xDA,0xE5,0x90,0x11,0x9D,0xE5,0x01,0x00,0x50,0xE1, + 0x01,0x00,0x80,0x32,0x8A,0x01,0xCA,0x35,0x8A,0x01,0xDA,0xE5,0x13,0x00,0x50,0xE3, + 0x06,0x00,0x00,0x9A,0xCD,0x10,0xA0,0xE3,0x90,0x01,0x01,0xE0,0x8C,0x21,0x9D,0xE5, + 0x21,0x16,0xA0,0xE1,0x02,0x00,0x51,0xE1,0x14,0x00,0x80,0x32,0x8A,0x01,0xCA,0x35, + 0x84,0x01,0xDA,0xE5,0x57,0xEF,0x8D,0xE2,0x01,0x00,0x54,0xE3,0x05,0x00,0xCE,0xE7, + 0x88,0x11,0x9D,0xE5,0x01,0x50,0xC0,0xE7,0x84,0x21,0xDA,0xE5,0x84,0x11,0x9D,0xE5, + 0x00,0x00,0xA0,0xE3,0x01,0x00,0xC2,0xE7,0x09,0x11,0x97,0xE7,0x15,0x2E,0x8D,0xE2, + 0x01,0x00,0xC2,0xE7,0x01,0x00,0xA0,0xE3,0x19,0x00,0x00,0xBA,0xAC,0x12,0x9F,0xE5, + 0x82,0xC1,0xD1,0xE5,0x09,0x21,0x97,0xE7,0x80,0xA1,0x80,0xE0,0x00,0x10,0xE0,0xE3, + 0x0A,0xB1,0x87,0xE0,0x02,0x11,0x8B,0xE7,0x00,0x10,0xDE,0xE7,0x08,0x30,0xA0,0xE1, + 0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0x1A,0x01,0x00,0x5C,0xE3,0x01,0x10,0xA0,0xE3, + 0x08,0x00,0x00,0xBA,0x01,0x21,0x9B,0xE7,0x01,0x00,0x72,0xE3,0x02,0x00,0x00,0xDA, + 0x03,0x00,0x52,0xE1,0x02,0x30,0xA0,0xB1,0x0A,0x11,0x87,0xB7,0x01,0x10,0x81,0xE2, + 0x01,0x00,0x5C,0xE1,0xF6,0xFF,0xFF,0xAA,0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1, + 0xE7,0xFF,0xFF,0xDA,0x44,0x02,0x9F,0xE5,0x68,0x11,0x9D,0xE5,0x82,0x01,0xD0,0xE5, + 0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA,0x6C,0x01,0x9D,0xE5,0x01,0x00,0x80,0xE2, + 0x04,0x00,0x50,0xE1,0x6C,0x01,0x8D,0xE5,0x82,0xFF,0xFF,0xDA,0x06,0x00,0xB0,0xE1, + 0x01,0x10,0x46,0xE2,0xFF,0x60,0x01,0xE2,0x21,0xFF,0xFF,0x1A,0x0C,0x82,0x9F,0xE5, + 0x01,0x60,0xA0,0xE3,0x82,0x01,0xD8,0xE5,0x00,0x70,0xA0,0xE3,0x06,0xA0,0xA0,0xE1, + 0x01,0x00,0x50,0xE3,0x43,0x00,0x00,0xBA,0x15,0x0E,0x8D,0xE2,0x06,0x00,0xD0,0xE7, + 0x00,0x00,0x50,0xE3,0x3B,0x00,0x00,0x0A,0x06,0x01,0x86,0xE0,0x80,0x50,0x88,0xE0, + 0x38,0x02,0xD5,0xE5,0x84,0x11,0x9D,0xE5,0x0A,0x90,0x84,0xE0,0x01,0x00,0xD0,0xE7, + 0x08,0x10,0x9D,0xE5,0x01,0x00,0x50,0xE1,0x23,0x00,0x00,0x2A,0x08,0x00,0x59,0xE3, + 0x21,0x00,0x00,0xCA,0x02,0x0C,0x85,0xE2,0x3E,0x00,0x80,0xE2,0xD3,0x0A,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x1C,0x00,0x00,0x0A,0x38,0x02,0xD5,0xE5,0x84,0x11,0x9D,0xE5, + 0x84,0x21,0x9D,0xE5,0x01,0x10,0xD0,0xE7,0x01,0x10,0x81,0xE2,0x02,0x10,0xC0,0xE7, + 0x09,0x01,0x89,0xE0,0x80,0xB0,0x88,0xE0,0x8E,0x1F,0x85,0xE2,0x61,0x0F,0x8B,0xE2, + 0x0A,0x20,0xA0,0xE3,0x4D,0xFC,0xFF,0xEB,0xE5,0x01,0xD5,0xE5,0x57,0x1F,0x8D,0xE2, + 0x01,0xA0,0x8A,0xE2,0x8B,0x01,0xCB,0xE5,0xE6,0x01,0xD5,0xE5,0x01,0x70,0x87,0xE2, + 0x8C,0x01,0xCB,0xE5,0x38,0x02,0xD5,0xE5,0x09,0x00,0xC1,0xE7,0x88,0x11,0x9D,0xE5, + 0x01,0x90,0xC0,0xE7,0x64,0x01,0x9F,0xE5,0x00,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x10,0xA0,0x03,0x00,0x10,0xC0,0x05,0x0E,0x00,0x00,0xEA,0x02,0x0C,0x85,0xE2, + 0x3E,0x00,0x80,0xE2,0xB1,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3,0x09,0x00,0x00,0x0A, + 0x01,0x00,0xA0,0xE3,0xB1,0x02,0xC8,0xE5,0x3E,0x02,0xD5,0xE5,0x13,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x9A,0x81,0x01,0xD8,0xE5,0x01,0x00,0x50,0xE3,0xB6,0x00,0xD8,0x01, + 0x04,0x00,0x80,0x03,0xB6,0x00,0xC8,0x01,0x82,0x01,0xD8,0xE5,0x01,0x60,0x86,0xE2, + 0x06,0x00,0x50,0xE1,0xBB,0xFF,0xFF,0xAA,0xB6,0x00,0xD8,0xE1,0x04,0x00,0x10,0xE3, + 0x03,0x00,0x00,0x0A,0x04,0x10,0x9D,0xE5,0x04,0x00,0xC0,0xE3,0x83,0x11,0xC8,0xE5, + 0xB6,0x00,0xC8,0xE1,0x01,0x00,0x54,0xE3,0x01,0x50,0xA0,0xE3,0x21,0x00,0x00,0xBA, + 0x57,0x6F,0x8D,0xE2,0x01,0x90,0xA0,0xE3,0x05,0x00,0xD6,0xE7,0x00,0x00,0x50,0xE3, + 0x0F,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,0x00,0x10,0x88,0xE0,0x9B,0x22,0xD1,0xE5, + 0x00,0x00,0x52,0xE3,0xA4,0x12,0xD1,0x05,0x00,0x00,0x51,0x03,0x05,0x00,0x00,0x1A, + 0xFF,0x20,0x00,0xE2,0xFF,0x10,0x05,0xE2,0x01,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0x71,0xFC,0xFF,0xEB,0x02,0x00,0x00,0xEA,0x01,0x00,0x80,0xE2,0x09,0x00,0x50,0xE3, + 0xF0,0xFF,0xFF,0xBA,0x83,0x01,0xD8,0xE5,0x00,0x00,0x50,0xE3,0x06,0x00,0x00,0x0A, + 0x05,0x01,0x85,0xE0,0x80,0xA0,0x88,0xE0,0x01,0x0C,0x8A,0xE2,0x8A,0x00,0x80,0xE2, + 0x7A,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3,0x8A,0x91,0xCA,0x05,0x01,0x50,0x85,0xE2, + 0x04,0x00,0x55,0xE1,0xDF,0xFF,0xFF,0xDA,0x07,0x00,0x84,0xE0,0x80,0x01,0xC8,0xE5, + 0x28,0x00,0x9F,0xE5,0x5A,0x20,0xA0,0xE3,0x80,0x11,0xD0,0xE5,0x82,0x11,0xC0,0xE5, + 0x61,0x1F,0x80,0xE2,0x8E,0x0F,0x80,0xE2,0xF4,0xFB,0xFF,0xEB,0x65,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xF0,0x06,0x00,0x20,0x40,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0xA3,0x05,0x00,0x20,0xDC,0x05,0x00,0x20,0x95,0x05,0x00,0x20, + 0x40,0x02,0x00,0x20,0x8E,0x05,0x00,0x20,0x1E,0x02,0x00,0x20,0xDB,0x02,0x00,0x20, + 0x6C,0x06,0x00,0x20,0xF1,0xB5,0x38,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90, + 0x36,0x48,0x41,0x7F,0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21, + 0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29, + 0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x6C,0xF9, + 0x01,0xF0,0xD8,0xF9,0x00,0x24,0x27,0x00,0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0, + 0x6F,0xF9,0x00,0x28,0x28,0xD0,0x0E,0x21,0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D, + 0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x06,0xF0,0xA8,0xFE,0x40,0x1C,0x14,0xD1, + 0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x06,0xF0,0x9A,0xFE,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A, + 0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3, + 0x7F,0x1C,0x15,0x2F,0xC8,0xD3,0x20,0x00,0xFF,0x38,0x27,0x38,0x04,0xD1,0x04,0x98, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0xB2,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0, + 0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00, + 0xF0,0xB5,0x7B,0x4A,0xFF,0xB0,0xBC,0xB0,0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18, + 0xB8,0x90,0x48,0x42,0xB7,0x90,0x77,0x48,0x77,0x4E,0x07,0x7D,0x02,0xA8,0x01,0x90, + 0x76,0x48,0xBA,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90, + 0x73,0x4A,0x00,0x21,0x30,0x00,0xFE,0xF7,0x3F,0xFF,0x00,0x25,0x00,0x24,0x6F,0x48, + 0x20,0x38,0x01,0x7D,0xC9,0x07,0x14,0xD0,0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0, + 0xBD,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0, + 0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42, + 0x16,0xD1,0xB7,0x9A,0x21,0x00,0x28,0x00,0x06,0xF0,0x30,0xFE,0x10,0xE0,0xBC,0x42, + 0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E, + 0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0, + 0x64,0x1C,0x0E,0x2C,0xCB,0xD3,0x6D,0x1C,0x15,0x2D,0xC7,0xD3,0x01,0xF0,0xBC,0xF8, + 0x01,0xF0,0x28,0xF9,0x00,0x25,0x00,0x24,0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00, + 0x28,0x00,0x02,0xF0,0xBD,0xF8,0x00,0x28,0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00, + 0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD, + 0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0, + 0xED,0xF8,0x39,0x19,0x01,0x9A,0x49,0x00,0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3, + 0x6D,0x1C,0x15,0x2D,0xD7,0xD3,0x00,0x20,0x00,0x90,0x01,0xF0,0xFB,0xF8,0x00,0x25, + 0x00,0x24,0x21,0x00,0x28,0x00,0x02,0xF0,0x93,0xF8,0x00,0x28,0x3E,0xD0,0x0E,0x21, + 0x69,0x43,0xB9,0x9B,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00, + 0xF1,0x5B,0x00,0x04,0x00,0x0C,0x81,0x42,0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00, + 0x02,0xF0,0xBC,0xF8,0x01,0x99,0xC8,0x53,0x00,0x98,0x03,0x21,0xFE,0xF7,0x6A,0xFE, + 0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1, + 0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0, + 0x85,0xFD,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0, + 0x7D,0xFD,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C, + 0xB7,0xD3,0x6D,0x1C,0x15,0x2D,0xB3,0xD3,0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98, + 0x40,0x1E,0xB8,0x90,0x18,0xD2,0x00,0x25,0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43, + 0x01,0x99,0x30,0x19,0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00,0x06,0xF0,0x7A,0xFD, + 0x64,0x1C,0x0E,0x2C,0xF4,0xD3,0x6D,0x1C,0x15,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0, + 0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x01,0xF0,0x1E,0xF8,0x8D,0xE7,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x00,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00, + 0xD2,0x02,0x00,0x00,0x99,0x05,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68, + 0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48, + 0x00,0x90,0x80,0x7D,0x00,0x28,0x3C,0xD0,0x00,0x21,0x05,0x25,0x1F,0x4F,0x2D,0x02, + 0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7D,0x1B,0x0F,0x21,0xE0,0x84,0x00, + 0xE4,0x19,0x64,0x19,0xA4,0x69,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00, + 0xC0,0x19,0x40,0x19,0x80,0x69,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43, + 0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02, + 0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0, + 0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49, + 0x40,0x8C,0x01,0x91,0x4B,0x8A,0x20,0x39,0x00,0x91,0x89,0x79,0x00,0x25,0x2F,0x00, + 0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99, + 0x09,0x7C,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29, + 0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00, + 0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42, + 0x5C,0xDC,0x82,0x42,0x5A,0xDB,0x8C,0x45,0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25, + 0x72,0x46,0x00,0x2A,0x7B,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0, + 0x03,0x2A,0x76,0xD1,0xE2,0x79,0xD3,0x07,0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A, + 0x27,0xD1,0x09,0x20,0x00,0x25,0xE0,0x71,0x6B,0xE0,0x00,0x9A,0x92,0x78,0x00,0x2A, + 0x67,0xD1,0x00,0xF0,0x79,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72, + 0x5F,0xE0,0xE2,0x79,0xD3,0x07,0xE8,0xD1,0x92,0x07,0x5A,0xD5,0x00,0xF0,0x6C,0xF8, + 0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71, + 0xFE,0xF7,0x1E,0xFE,0xEB,0xE7,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0x18,0xFE, + 0x47,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x55,0xF8,0x21,0x7A, + 0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0x05,0xFE,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20, + 0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28, + 0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79, + 0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xE1,0xFD,0xE6,0x71, + 0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xD5,0xFD,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20, + 0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F, + 0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x00,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x79, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x23,0xD0,0x1B,0x78,0x00,0x2B,0x20,0xD1,0x12,0x4F, + 0x1C,0xE0,0xD3,0x00,0xDD,0x19,0x25,0x23,0x5B,0x01,0xEB,0x18,0x08,0x25,0x5D,0x5F, + 0xA5,0x42,0x0E,0xDC,0x0C,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB,0x0A,0x25,0x5D,0x5F, + 0x8D,0x42,0x06,0xDC,0x0E,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06, + 0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8, + 0xF0,0xBC,0x70,0x47,0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0x8F,0xB0,0xB5,0x4D,0x0D,0x90,0x0C,0x90,0x29,0x68,0x08,0x88,0x0B,0x90,0x08,0x00, + 0x40,0x30,0xC2,0x7F,0x60,0x31,0x0A,0x92,0x82,0x7F,0x09,0x92,0x49,0x78,0x08,0x91, + 0x81,0x7D,0x07,0x91,0xAD,0x49,0xCA,0x88,0x09,0x79,0x13,0x07,0x05,0xD5,0xAB,0x4B, + 0x00,0x29,0x02,0xD1,0x08,0x24,0xA2,0x43,0xDA,0x80,0xA9,0x4A,0x12,0x78,0x00,0x2A, + 0x07,0xD0,0xFF,0x20,0x06,0x90,0x05,0x90,0x08,0x20,0x04,0x90,0xA5,0x4F,0x96,0x20, + 0x07,0xE0,0x02,0x7C,0x47,0x8B,0x06,0x92,0x42,0x7C,0x05,0x92,0x82,0x7C,0x04,0x92, + 0xC0,0x7C,0x03,0x90,0x0B,0x98,0x80,0x04,0x7E,0xD5,0x9F,0x4A,0x00,0x20,0x52,0x78, + 0x00,0x2A,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0,0x3C,0xF9, + 0x96,0x48,0x9A,0x4C,0x00,0x79,0x00,0x28,0x0E,0x90,0x4A,0xD0,0x93,0x49,0x01,0x20, + 0x0E,0x89,0xBE,0x42,0x00,0xD3,0x00,0x20,0x02,0x90,0x30,0x00,0x0A,0x22,0x1A,0x21, + 0x50,0x43,0x61,0x5E,0x0F,0x00,0xFE,0xF7,0x3D,0xFB,0x06,0x99,0x88,0x42,0x01,0xDA, + 0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0xF0,0x1B,0x0A,0x21,0xFE,0xF7,0x32,0xFB, + 0x05,0x99,0x88,0x42,0x01,0xDA,0x01,0x21,0x00,0xE0,0x00,0x21,0xA3,0x8A,0x04,0x9E, + 0x01,0x22,0x10,0x00,0xB3,0x42,0x00,0xD8,0x00,0x20,0xE3,0x69,0x03,0x9E,0xB3,0x42, + 0x00,0xDB,0x00,0x22,0x02,0x9B,0x00,0x2B,0x1B,0xD0,0x01,0x9B,0x00,0x2B,0x18,0xD0, + 0x00,0x29,0x16,0xD0,0x00,0x28,0x14,0xD0,0x00,0x2A,0x12,0xD0,0x77,0x48,0xC0,0x30, + 0xC0,0x6A,0x00,0x28,0x0D,0xD1,0x7A,0x48,0x00,0x88,0x1E,0x28,0x09,0xD2,0x60,0x7E, + 0x00,0x28,0x1C,0xD0,0x29,0x68,0x40,0x31,0x49,0x7E,0x88,0x42,0x17,0xD8,0x40,0x1E, + 0x14,0xE0,0x29,0x68,0xE0,0x69,0x40,0x31,0x0A,0x7D,0x90,0x42,0x0F,0xDB,0x0E,0x98, + 0x6A,0x4A,0x00,0x28,0x0B,0xD0,0xD0,0x88,0xC0,0x06,0x08,0xD4,0x60,0x7E,0xC9,0x7D, + 0x88,0x42,0x04,0xD2,0x07,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C,0x60,0x76,0x60,0x7E, + 0x07,0x99,0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98,0x00,0x28,0x0A,0xD1,0x5F,0x48, + 0xC1,0x88,0x11,0x43,0xC1,0x80,0x00,0xE0,0x11,0xE0,0x28,0x68,0x40,0x30,0x00,0x7E, + 0x20,0x76,0x0F,0xE0,0x59,0x4B,0xD8,0x88,0xC1,0x06,0x0B,0xD5,0x21,0x7E,0x00,0x29, + 0x06,0xD1,0x90,0x43,0xD8,0x80,0x28,0x68,0x40,0x30,0x40,0x7D,0x60,0x76,0x01,0xE0, + 0x49,0x1E,0x21,0x76,0x51,0x4F,0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06, + 0x09,0xD5,0x08,0x99,0x09,0x98,0x88,0x42,0x03,0xD9,0x40,0x1A,0x00,0x06,0x00,0x0E, + 0x00,0xE0,0x01,0x20,0x09,0x90,0x01,0x22,0x50,0x00,0xC0,0x19,0x84,0x46,0xFF,0x30, + 0x61,0x30,0xC1,0x89,0x03,0x00,0x00,0x29,0x77,0xD0,0x0B,0x9C,0x00,0x20,0xA4,0x07, + 0x10,0xD5,0x43,0x4C,0x24,0x78,0x00,0x2C,0x03,0xD1,0x0A,0x9C,0xA1,0x42,0x09,0xD9, + 0x01,0xE0,0x0F,0x29,0x06,0xD9,0x00,0x20,0x38,0x71,0xF8,0x88,0x08,0x21,0x08,0x43, + 0xF8,0x80,0x01,0x20,0x0B,0x99,0x49,0x07,0x5F,0xD5,0x00,0x28,0x5D,0xD1,0xD8,0x89, + 0x09,0x99,0x88,0x42,0x59,0xD3,0x3B,0x48,0x00,0x88,0x00,0x28,0x55,0xD0,0x00,0x23, + 0x01,0x20,0x29,0xE0,0xFF,0x24,0x39,0x18,0x66,0x34,0x64,0x5C,0x94,0x42,0x22,0xD1, + 0x5B,0x1C,0xFF,0x31,0x21,0x31,0x09,0x7E,0x0D,0x91,0x01,0x00,0x14,0xE0,0x4C,0x00, + 0xE4,0x19,0x25,0x00,0xE0,0x35,0xEE,0x8A,0xFF,0x34,0x01,0x34,0xAE,0x82,0x26,0x89, + 0xE6,0x80,0x7C,0x18,0x25,0x00,0xFF,0x35,0x21,0x35,0x6E,0x7E,0xFF,0x34,0x61,0x34, + 0x2E,0x76,0xA6,0x79,0x49,0x1C,0x66,0x71,0x3C,0x79,0x8C,0x42,0xE7,0xDA,0x39,0x79, + 0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD2,0xDA,0x00,0x2B, + 0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x0C,0x90,0xF8,0x88,0x20,0x21,0x08,0x43, + 0xF8,0x80,0x39,0x79,0x60,0x46,0xFF,0x30,0x49,0x1C,0x41,0x30,0x09,0x06,0xC3,0x88, + 0x09,0x0E,0x39,0x71,0x49,0x00,0xC9,0x19,0x01,0xE0,0x19,0xE0,0x0D,0xE0,0xE0,0x31, + 0x8B,0x82,0xC1,0x8A,0x38,0x79,0x40,0x00,0xC0,0x19,0xFF,0x30,0x01,0x30,0xC1,0x80, + 0x3B,0x79,0x0D,0x49,0x0D,0x98,0x48,0x39,0x58,0x54,0x52,0x1C,0x08,0x2A,0x00,0xDA, + 0x7A,0xE7,0x0C,0x98,0x00,0x28,0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43,0xF8,0x80, + 0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xA3,0x05,0x00,0x20,0xDC,0x05,0x00,0x00,0xC0,0x01,0x00,0x20,0xC0,0x04,0x00,0x20, + 0xAE,0x05,0x00,0x20,0x18,0x06,0x00,0x20,0xF0,0xB5,0x60,0x48,0x60,0x4C,0x01,0x78, + 0x20,0x68,0x05,0x22,0x60,0x30,0x00,0x29,0xB7,0xB0,0x00,0xD1,0x02,0x79,0x33,0x92, + 0x02,0x22,0x00,0x29,0x00,0xD1,0x42,0x79,0x5A,0x4E,0x00,0x20,0x32,0x92,0x70,0x83, + 0xF0,0x61,0x31,0x90,0x30,0x90,0x60,0x21,0x18,0xA8,0xFE,0xF7,0x73,0xFB,0x60,0x21, + 0x68,0x46,0xFE,0xF7,0x6F,0xFB,0x20,0x68,0x71,0x7E,0x40,0x30,0xC0,0x7D,0x81,0x42, + 0x78,0xD0,0x32,0x9D,0x0E,0x21,0x48,0x1B,0x34,0x90,0x5D,0xE0,0x33,0x98,0x15,0x22, + 0x11,0x1A,0x36,0x91,0x32,0x99,0x69,0x1A,0x8C,0x00,0x1A,0xE0,0x4A,0x4F,0x6A,0x00, + 0xD2,0x19,0xB8,0x23,0xD3,0x5E,0x0E,0x21,0x42,0x00,0x41,0x43,0xD2,0x19,0x88,0x27, + 0xD7,0x5F,0x49,0x19,0x09,0x04,0xDA,0x19,0x44,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E, + 0x51,0x18,0x31,0x9A,0x52,0x18,0x31,0x92,0x18,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C, + 0x11,0x51,0x36,0x99,0x81,0x42,0xE1,0xDC,0x33,0x98,0x15,0x21,0x40,0x00,0x09,0x1A, + 0x18,0xAF,0x35,0x90,0x38,0x59,0xFE,0xF7,0xBD,0xF9,0x38,0x51,0x33,0x99,0x84,0x46, + 0x1A,0xE0,0x0E,0x20,0x48,0x43,0x35,0x4A,0x40,0x19,0x40,0x00,0x12,0x5E,0x60,0x46, + 0x31,0x4B,0x12,0x1A,0x68,0x00,0xC0,0x18,0xB8,0x23,0xC3,0x5E,0x2E,0x48,0x4F,0x00, + 0x3F,0x18,0x88,0x20,0x38,0x5E,0x18,0x18,0x12,0x18,0x17,0x00,0x57,0x43,0x68,0x46, + 0x03,0x59,0xDA,0x19,0x49,0x1C,0x02,0x51,0x36,0x98,0x88,0x42,0xE1,0xDC,0x35,0x98, + 0x14,0x21,0x09,0x1A,0x6F,0x46,0x38,0x59,0xFE,0xF7,0x94,0xF9,0x38,0x51,0x30,0x99, + 0x40,0x18,0x30,0x90,0x34,0x98,0x6D,0x1C,0xA8,0x42,0x9F,0xDC,0x33,0x98,0x41,0x00, + 0x15,0x20,0x41,0x1A,0x32,0x98,0x45,0x00,0x0E,0x20,0x44,0x1B,0x61,0x43,0x31,0x98, + 0xFE,0xF7,0x80,0xF9,0x70,0x83,0x30,0x98,0x21,0x00,0xFE,0xF7,0x7B,0xF9,0x00,0x21, + 0x6B,0x46,0x09,0xE0,0x18,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x17,0x00,0x57,0x43, + 0xF2,0x69,0xBA,0x18,0x49,0x1C,0xF2,0x61,0x8C,0x42,0xF4,0xDC,0x0D,0x20,0x41,0x1B, + 0xF0,0x69,0xFE,0xF7,0x67,0xF9,0x33,0x9B,0x15,0x22,0x34,0x99,0xD2,0x1A,0x12,0x03, + 0x51,0x43,0xFE,0xF7,0x5F,0xF9,0xF0,0x61,0x1A,0x20,0x30,0x5E,0x00,0x28,0x01,0xD1, + 0x40,0x1C,0x70,0x83,0x37,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA3,0x05,0x00,0x20, + 0xF0,0x06,0x00,0x20,0xC0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0x10,0xB5,0x00,0x28,0x06,0xD1,0x14,0x48,0x00,0x69,0x00,0x04,0x00,0x0E,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x11,0x49,0x09,0x6B,0x11,0x4A,0x12,0x4B,0x8A,0x18,0x9A,0x42, + 0x16,0xD2,0x00,0x04,0x00,0x0C,0x48,0x43,0x59,0x1E,0xFE,0xF7,0x63,0xFA,0x04,0x00, + 0x0A,0x21,0xFE,0xF7,0x5F,0xFA,0x04,0x29,0x00,0xD9,0x0A,0x34,0x0A,0x21,0x20,0x00, + 0xFE,0xF7,0x58,0xFA,0x08,0x49,0x49,0x7C,0x08,0x18,0xFF,0x28,0x00,0xD9,0xFF,0x20, + 0x00,0x06,0x00,0x0E,0xDB,0xE7,0x00,0x00,0x00,0x90,0x00,0x40,0x00,0x70,0x00,0x40, + 0x90,0x6B,0xFF,0xFF,0xA1,0x0F,0x00,0x00,0x60,0x93,0x00,0x00,0xF8,0xB5,0x74,0x4C, + 0x00,0x25,0x60,0x7C,0x00,0x28,0x06,0xD0,0xE0,0x6F,0x00,0x04,0x00,0x0C,0x06,0xF0, + 0x21,0xFD,0x06,0xF0,0x0F,0xFD,0x01,0x20,0x40,0x03,0xFE,0xF7,0x2F,0xFE,0xFE,0xF7, + 0xA9,0xFA,0x05,0xF0,0x9B,0xFF,0x05,0xF0,0xAF,0xFF,0x06,0xF0,0xF7,0xF9,0x69,0x48, + 0x01,0x26,0x86,0x60,0x1F,0x20,0x01,0xF0,0x19,0xFE,0x67,0x48,0x67,0x4F,0x00,0x90, + 0xB7,0xE0,0x67,0x48,0x41,0x68,0x09,0x07,0x0B,0xD5,0xC1,0x68,0x00,0x29,0x08,0xD0, + 0xC0,0x68,0x07,0x28,0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0xAE,0xE0,0x05,0xF0, + 0x51,0xFB,0x60,0x7C,0x00,0x28,0x04,0xD0,0xE0,0x6F,0x00,0x04,0x00,0x0C,0x06,0xF0, + 0xF1,0xFC,0x80,0x20,0xFE,0xF7,0x02,0xFE,0x03,0x20,0x06,0xF0,0x71,0xFB,0x01,0x20, + 0x40,0x03,0xFE,0xF7,0xFB,0xFD,0xE0,0x7D,0x00,0x28,0x01,0xD0,0x06,0x20,0x0A,0xE0, + 0x54,0x48,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5, + 0x04,0x20,0x00,0xE0,0x02,0x20,0x06,0xF0,0xCB,0xF9,0x00,0xF0,0x17,0xFC,0x00,0xF0, + 0xD3,0xFB,0x00,0xF0,0xE1,0xFB,0x3E,0x61,0x00,0xF0,0x4C,0xFC,0x00,0xF0,0xC4,0xFB, + 0x01,0x20,0x80,0x03,0xFE,0xF7,0xDA,0xFD,0x00,0xF0,0xD6,0xFB,0x00,0xF0,0x42,0xFC, + 0xFE,0xF7,0x1C,0xFB,0xA0,0x7D,0x00,0x28,0x05,0xD1,0x00,0x98,0x00,0x7B,0x00,0x28, + 0x01,0xD0,0x05,0xF0,0x8B,0xF9,0x03,0xF0,0xC1,0xFE,0x00,0x28,0x00,0xD0,0x26,0x70, + 0x20,0x8C,0x3D,0x49,0x88,0x42,0x01,0xD2,0x40,0x1C,0x20,0x84,0x20,0x78,0x00,0x28, + 0x05,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x01,0x23,0x00,0xF0,0x73,0xF9,0x03,0x20, + 0x40,0x03,0xFE,0xF7,0xAB,0xFD,0x20,0x78,0x00,0x28,0x05,0xD0,0xA0,0x7D,0x00,0x09, + 0x04,0x28,0x4B,0xD1,0x00,0x20,0x20,0x70,0x03,0x20,0x06,0xF0,0xF3,0xFA,0xA0,0x67, + 0x03,0x20,0x06,0xF0,0x25,0xFB,0x80,0x20,0xFE,0xF7,0x98,0xFD,0x29,0x49,0xC8,0x8B, + 0x00,0x28,0x02,0xD0,0x40,0x1E,0xC8,0x83,0x33,0xE0,0xA0,0x7B,0x00,0x28,0x30,0xD1, + 0x60,0x6B,0x00,0x28,0x2D,0xD0,0x25,0x49,0x28,0x00,0x6D,0x1C,0x88,0x42,0xA0,0x6F, + 0x01,0xD3,0x23,0x49,0x00,0xE0,0x23,0x49,0x0C,0x1A,0xFF,0x20,0x91,0x30,0x84,0x42, + 0x1F,0xDD,0xFF,0x20,0x01,0x30,0xFE,0xF7,0x81,0xFD,0x02,0x20,0x06,0xF0,0x00,0xFB, + 0x0A,0x21,0x20,0x00,0xFE,0xF7,0x4E,0xF8,0x41,0x11,0x02,0x20,0x06,0xF0,0xE0,0xFA, + 0x04,0x20,0xFE,0xF7,0xAB,0xFD,0x02,0x20,0x06,0xF0,0xE2,0xFA,0x3E,0x61,0xFF,0x20, + 0xFE,0xF7,0xA4,0xFD,0x02,0x20,0x06,0xF0,0xEB,0xFA,0xFF,0x20,0x01,0x30,0xFE,0xF7, + 0x5D,0xFD,0x07,0x4C,0x20,0x78,0x00,0x28,0x00,0xD1,0x42,0xE7,0x04,0x48,0x40,0x7C, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0x3E,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x8C,0x05,0x00,0x20,0x00,0x90,0x00,0x40,0x80,0x93,0x00,0x00,0x40,0x00,0x00,0x40, + 0x00,0x40,0x00,0x30,0x40,0x00,0x00,0x20,0x10,0x27,0x00,0x00,0x01,0x03,0x00,0x00, + 0x30,0x75,0x00,0x00,0xC8,0x32,0x00,0x00,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43, + 0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x24,0x33,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52,0x22,0x00,0x12,0x32, + 0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E, + 0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xF8,0x09,0x00,0x20,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21,0xFE,0xF7,0x3E,0xF9, + 0x0A,0x48,0x5A,0x22,0x00,0x21,0xFE,0xF7,0x39,0xF9,0x08,0x48,0x00,0x24,0x00,0x1F, + 0x04,0x70,0x07,0x48,0x28,0x22,0x21,0x00,0xFE,0xF7,0x30,0xF9,0x04,0x48,0x3A,0x38, + 0x44,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0xDB,0x02,0x00,0x20,0xC4,0x01,0x00,0x20, + 0x1A,0x05,0x00,0x20,0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21,0xFE,0xF7,0x1E,0xF9, + 0x14,0x48,0x12,0x22,0x00,0x21,0x12,0x30,0xFE,0xF7,0x18,0xF9,0x11,0x48,0x09,0x22, + 0x00,0x21,0x44,0x30,0xFE,0xF7,0x12,0xF9,0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30, + 0xFE,0xF7,0x0C,0xF9,0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30,0xFE,0xF7,0x06,0xF9, + 0x08,0x48,0x10,0x22,0x00,0x21,0x62,0x30,0xFE,0xF7,0x00,0xF9,0x05,0x49,0x00,0x20, + 0x6C,0x31,0xC8,0x83,0xFF,0x39,0x61,0x39,0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20,0x8C,0x10,0x9F,0xE5,0x10,0x40,0x2D,0xE9, + 0x00,0x10,0x91,0xE5,0x84,0xC0,0x9F,0xE5,0x7E,0xE0,0xD1,0xE5,0x08,0x10,0xA0,0xE3, + 0x00,0x30,0xA0,0xE3,0x01,0x22,0x8C,0xE0,0x80,0x20,0x82,0xE0,0xB5,0x4F,0xA0,0xE3, + 0xB2,0x30,0x84,0xE1,0x03,0x2C,0x82,0xE2,0x01,0x10,0x51,0xE2,0xB4,0x36,0xC2,0xE1, + 0xF7,0xFF,0xFF,0x5A,0x01,0x20,0xA0,0xE3,0x00,0x10,0x8C,0xE0,0xCC,0x22,0xC1,0xE5, + 0x80,0x20,0x8C,0xE0,0x03,0x2C,0x82,0xE2,0xB4,0x3F,0xC2,0xE1,0x04,0xE4,0xC1,0xE5, + 0x0C,0x34,0xC1,0xE5,0x05,0x10,0xA0,0xE3,0x01,0x22,0x8C,0xE0,0x80,0x20,0x82,0xE0, + 0x01,0x2B,0x82,0xE2,0x01,0x10,0x51,0xE2,0xB4,0x31,0xC2,0xE1,0xF9,0xFF,0xFF,0x5A, + 0x00,0x01,0x8C,0xE0,0x00,0x10,0xE0,0xE3,0x01,0x0B,0x80,0xE2,0xB4,0x17,0xC0,0xE1, + 0xB6,0x17,0xC0,0xE1,0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xF0,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48,0x1E,0x22,0x00,0x21,0xFE,0xF7,0x9E,0xF8, + 0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xEE,0x02,0x00,0x20,0x20,0x01,0x00,0x20,0x10,0xB5,0x06,0xF0,0x21,0xFA,0x05,0xF0, + 0x9B,0xF8,0xFF,0xF7,0x47,0xFF,0x05,0xF0,0xFD,0xF9,0x01,0xF0,0x71,0xFE,0x01,0xF0, + 0xE9,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33, + 0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD, + 0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47, + 0xF0,0x06,0x00,0x20,0xFF,0xB5,0x8A,0x48,0xFF,0xB0,0x00,0x7D,0xC2,0xB0,0x00,0x28, + 0x03,0xD0,0x01,0x20,0xBC,0x90,0x00,0x20,0x02,0xE0,0x00,0x20,0xBC,0x90,0x01,0x20, + 0xBB,0x90,0x84,0x48,0x00,0x26,0xBE,0x90,0x83,0x48,0x35,0x00,0x01,0x8B,0x05,0x91, + 0x41,0x8B,0x04,0x91,0x81,0x8A,0x03,0x91,0xC0,0x8A,0x02,0x90,0x7F,0x48,0x00,0x7D, + 0x01,0x90,0x00,0x24,0x0E,0x20,0x68,0x43,0xC0,0x90,0x00,0x19,0xBD,0x90,0x21,0x00, + 0x28,0x00,0x01,0xF0,0x25,0xFA,0x7A,0x49,0x07,0x00,0xC9,0x7D,0x00,0x29,0xBF,0x91, + 0x05,0xD0,0xFF,0x21,0x2D,0x31,0xC8,0x22,0xFF,0x23,0xF5,0x33,0x02,0xE0,0x00,0x21, + 0x0A,0x00,0x0B,0x00,0x04,0x2D,0x05,0xD1,0x01,0x2C,0x0D,0xDB,0x0B,0x2C,0x0B,0xDC, + 0x47,0x18,0x0C,0xE0,0x03,0x2D,0x01,0xD0,0x05,0x2D,0x03,0xD1,0x01,0x2C,0x01,0xDB, + 0x0B,0x2C,0x04,0xDD,0x11,0x2D,0x01,0xDC,0xC7,0x1A,0x00,0xE0,0x87,0x1A,0x00,0x20, + 0x00,0x90,0x63,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x29,0xD0,0x64,0x49,0x49,0x7B, + 0x00,0x29,0x01,0x99,0x11,0xD0,0x8D,0x42,0x22,0xD1,0x81,0x7D,0xA1,0x42,0x1D,0xD0, + 0xC1,0x7D,0xA1,0x42,0x1A,0xD0,0x01,0x7E,0xA1,0x42,0x17,0xD0,0x41,0x7E,0xA1,0x42, + 0x14,0xD0,0x80,0x7E,0xA0,0x42,0x62,0xD1,0x10,0xE0,0x8C,0x42,0x10,0xD1,0x81,0x7D, + 0xA9,0x42,0x0B,0xD0,0xC1,0x7D,0xA9,0x42,0x08,0xD0,0x01,0x7E,0xA9,0x42,0x05,0xD0, + 0x41,0x7E,0xA9,0x42,0x02,0xD0,0x80,0x7E,0xA8,0x42,0x50,0xD1,0x01,0x20,0x00,0x90, + 0xC3,0x98,0x00,0x28,0x14,0xD0,0x4E,0x48,0xAF,0x21,0x00,0x8C,0x89,0x00,0x88,0x42, + 0x0E,0xD3,0x11,0x2D,0x0C,0xDB,0x00,0x2C,0x01,0xD0,0x0C,0x2C,0x08,0xD1,0x02,0x98, + 0x14,0x21,0x48,0x43,0x0A,0x21,0xFD,0xF7,0xB5,0xFF,0x00,0x04,0x00,0x0C,0x00,0xE0, + 0x02,0x98,0xBF,0x9A,0x03,0x99,0x00,0x2A,0x01,0xD0,0x96,0x21,0x32,0x20,0x00,0x9A, + 0x01,0x2A,0x05,0xD1,0x05,0x98,0x38,0x18,0x01,0x04,0x04,0x98,0x09,0x0C,0x02,0xE0, + 0x79,0x18,0x09,0x04,0x09,0x0C,0x38,0x1A,0x02,0x04,0xBD,0x98,0xBE,0x9B,0x80,0x00, + 0x18,0x58,0xC2,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0, + 0x00,0x01,0x00,0x0D,0xC4,0x9B,0x00,0x2B,0x0C,0xD0,0x90,0x42,0x02,0xDA,0xC1,0x9B, + 0xBC,0x9A,0x03,0xE0,0x88,0x42,0x0A,0xDD,0xC1,0x9B,0xBB,0x9A,0x21,0x00,0x28,0x00, + 0x00,0xF0,0x7E,0xF8,0xBD,0x98,0x71,0x00,0x06,0xAA,0x76,0x1C,0x50,0x52,0x64,0x1C, + 0x0E,0x2C,0x01,0xDA,0xC0,0x98,0x50,0xE7,0x6D,0x1C,0x15,0x2D,0x00,0xDA,0x48,0xE7, + 0x00,0x2E,0x38,0xDD,0xC3,0x98,0x00,0x28,0x35,0xD1,0x00,0xF0,0x4D,0xF9,0x00,0xF0, + 0x63,0xF9,0x00,0xF0,0xCF,0xF9,0x2C,0xE0,0x70,0x00,0x06,0xA9,0x08,0x5A,0x87,0x00, + 0xBE,0x98,0xC0,0x59,0x01,0x01,0x05,0x05,0xC4,0x98,0x0C,0x0D,0x2D,0x0D,0x02,0x28, + 0x01,0xD1,0x64,0x21,0x04,0xE0,0x01,0x28,0x01,0xD1,0x1E,0x21,0x00,0xE0,0x00,0x21, + 0xAC,0x42,0x06,0xD2,0x28,0x1B,0x64,0x21,0x48,0x43,0xFD,0xF7,0x1B,0xFE,0x00,0x19, + 0x05,0xE0,0x60,0x1B,0x48,0x43,0x64,0x21,0xFD,0xF7,0x14,0xFE,0x20,0x1A,0x0D,0x49, + 0x00,0x04,0x00,0x0C,0x88,0x42,0x00,0xD9,0x08,0x00,0xBE,0x99,0x00,0x04,0x28,0x43, + 0xC8,0x51,0x76,0x1E,0xD0,0xD5,0x7F,0xB0,0x46,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00,0x00,0x05,0x00,0x20, + 0x8C,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00,0x7C,0xB5,0x01,0x25,0x6D,0x07,0x28,0x68, + 0x02,0x28,0x17,0xD1,0xAC,0x68,0x69,0x46,0x20,0x05,0x00,0x0D,0x00,0x90,0x20,0x02, + 0x00,0x0D,0x01,0x90,0x01,0xA8,0x05,0xF0,0x1F,0xFA,0x08,0x48,0x00,0x99,0x04,0x40, + 0x01,0x98,0x09,0x05,0x00,0x05,0x00,0x0A,0x04,0x43,0x20,0x0B,0x00,0x03,0x09,0x0D, + 0x08,0x43,0xA8,0x60,0x7C,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFF,0x0F,0x00,0xFF, + 0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06, + 0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18, + 0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD, + 0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0, + 0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02, + 0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0xF0,0xB5,0x8B,0xB0, + 0x0E,0x27,0x15,0x20,0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48,0x53,0x49,0x0A,0x90, + 0x80,0x79,0x09,0x91,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x0D,0x20,0x03,0x21, + 0x05,0x90,0x02,0xE0,0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98,0x01,0x74,0x4C,0x48, + 0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90, + 0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98,0x00,0x28,0x7F,0xD0, + 0x05,0x98,0x41,0x00,0x30,0x00,0xFD,0xF7,0x75,0xFD,0x05,0x04,0x2D,0x0C,0x00,0x24, + 0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43,0x05,0x99,0xFD,0xF7,0x6B,0xFD,0x3D,0x4A, + 0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42,0xF2,0xDB,0x04,0x98, + 0x41,0x00,0x01,0x98,0xFD,0xF7,0x5E,0xFD,0x06,0x9F,0x06,0x04,0x36,0x0C,0x00,0x24, + 0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7,0x53,0xFD,0x31,0x4A, + 0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82,0xBC,0x42,0xF1,0xDB, + 0x0A,0x98,0x80,0x79,0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0,0x29,0x4A,0x13,0x21, + 0x10,0x19,0x89,0x01,0x40,0x18,0x41,0x7D,0x0A,0x98,0x80,0x79,0x80,0x07,0x03,0xD5, + 0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99,0x02,0x96,0x03,0x91, + 0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7, + 0x29,0xFD,0x1C,0x4A,0xE1,0x00,0x89,0x18,0x25,0x22,0x52,0x01,0x8F,0x18,0x38,0x81, + 0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90,0x80,0x8A,0x0A,0x21, + 0x80,0x1B,0xFD,0xF7,0x17,0xFD,0x78,0x81,0x08,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19, + 0xFD,0xF7,0x40,0xFE,0xB8,0x81,0x07,0x98,0x0A,0x21,0x80,0x8A,0x80,0x19,0xFD,0xF7, + 0x39,0xFE,0xF8,0x81,0x02,0x98,0x0A,0x21,0x40,0x00,0xFD,0xF7,0x33,0xFE,0x09,0x99, + 0x64,0x1C,0x48,0x82,0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x79,0xA0,0x42,0xB5,0xDC, + 0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x04,0x00,0x20,0x00,0x05,0x00,0x20, + 0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43, + 0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48,0x92,0x00,0xFD,0xF7, + 0x07,0xFE,0x07,0x48,0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43,0x06,0x48,0xFD,0xF7, + 0x2B,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40,0x02,0x48,0x81,0x6B, + 0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49, + 0x0A,0x48,0xFC,0x22,0xFD,0xF7,0xDC,0xFD,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32, + 0xFD,0xF7,0xD6,0xFD,0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00,0xFD,0xF7,0xD0,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00,0x04,0x90,0x00,0x40, + 0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40, + 0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x70,0x47,0x00,0x00, + 0x00,0x90,0x00,0x40,0xF0,0x47,0x2D,0xE9,0x00,0x80,0xA0,0xE1,0x1C,0x02,0x9F,0xE5, + 0x1C,0x72,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x00,0x40,0xA0,0xE3,0xB4,0x67,0xD0,0xE1, + 0x76,0x00,0xD0,0xE5,0x01,0x50,0xA0,0xE3,0x90,0x00,0x01,0xE0,0x82,0x01,0xD7,0xE5, + 0xFF,0x90,0x01,0xE2,0x01,0x00,0x50,0xE3,0x0E,0x00,0x00,0xBA,0x05,0x01,0x85,0xE0, + 0x80,0x00,0x87,0xE0,0x38,0x12,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A, + 0x02,0x0C,0x80,0xE2,0x3E,0x00,0x80,0xE2,0x48,0x05,0x00,0xEB,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x84,0x12,0xFF,0x40,0x00,0x12,0x82,0x01,0xD7,0xE5,0x01,0x50,0x85,0xE2, + 0x05,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA,0xB8,0x01,0x9F,0xE5,0x00,0x40,0x80,0xE5, + 0xB4,0x01,0x9F,0xE5,0xBC,0x1B,0xD0,0xE1,0xB0,0x3C,0xD0,0xE1,0xBE,0xCB,0xD0,0xE1, + 0x03,0x20,0x41,0xE0,0x00,0x00,0x52,0xE3,0x01,0x20,0x43,0xD0,0xB2,0x3C,0xD0,0xE1, + 0x02,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1,0x03,0x20,0x4C,0xE0,0x00,0x00,0x52,0xE3, + 0x0C,0x20,0x43,0xD0,0xC8,0x32,0xD7,0xE5,0x02,0x28,0xA0,0xE1,0x22,0x28,0xA0,0xE1, + 0x00,0x00,0x53,0xE3,0xCB,0x32,0xD7,0x15,0xC8,0x00,0x53,0x13,0x01,0x00,0x00,0x2A, + 0x01,0x30,0x83,0xE2,0xCB,0x32,0xC7,0xE5,0xBE,0x3A,0xD0,0xE1,0x01,0xC0,0xA0,0xE3, + 0x14,0x00,0x53,0xE3,0x02,0x00,0x00,0x2A,0xB1,0x32,0xD7,0xE5,0x00,0x00,0x53,0xE3, + 0xB2,0xC2,0xC7,0x15,0x19,0x00,0x51,0xE3,0x19,0x00,0x52,0x93,0x03,0x00,0x00,0x9A, + 0xB0,0x32,0xD7,0xE5,0xC8,0x00,0x53,0xE3,0x01,0x30,0x83,0x32,0xB0,0x32,0xC7,0x35, + 0xF6,0x3C,0xD0,0xE1,0x02,0x00,0x54,0xE3,0x19,0x00,0x51,0x33,0x19,0x00,0x52,0x33, + 0x03,0x00,0x00,0x2A,0x04,0x00,0x53,0xE3,0x05,0x00,0x00,0xAA,0x01,0x30,0x83,0xE2, + 0x02,0x00,0x00,0xEA,0x03,0x00,0x73,0xE3,0x01,0x00,0x00,0xDA,0x01,0x30,0x43,0xE2, + 0xB6,0x3C,0xC0,0xE1,0xCB,0x32,0xD7,0xE5,0x01,0x00,0x53,0xE3,0x78,0x10,0xA0,0x83, + 0x0D,0x00,0x00,0x8A,0x02,0x00,0x54,0xE3,0x0C,0x00,0x00,0x2A,0xF6,0x3C,0xD0,0xE1, + 0x02,0x00,0x53,0xE3,0x09,0x00,0x00,0xDA,0xB0,0x32,0xD7,0xE5,0x14,0x00,0x53,0xE3, + 0x06,0x00,0x00,0x2A,0x47,0x10,0x41,0xE2,0x95,0x00,0x51,0xE3,0x47,0x10,0x42,0x22, + 0x95,0x00,0x51,0x23,0x01,0x00,0x00,0x2A,0x77,0x10,0xE0,0xE3,0xB4,0x1C,0xC0,0xE1, + 0x00,0x10,0xA0,0xE3,0x02,0x00,0x54,0xE3,0xCA,0x12,0xC7,0xE5,0x0A,0x00,0x00,0x2A, + 0xF4,0x1C,0xD0,0xE1,0x78,0x00,0x71,0xE3,0x03,0x00,0x00,0x1A,0xC9,0x12,0xD7,0xE5, + 0xC8,0x00,0x51,0xE3,0x01,0x10,0x81,0x32,0xC9,0x12,0xC7,0x35,0xC9,0x12,0xD7,0xE5, + 0x02,0x00,0x51,0xE3,0xCA,0xC2,0xC7,0x05,0x01,0x00,0x00,0xEA,0x3B,0x10,0xE0,0x83, + 0xB4,0x1C,0xC0,0x81,0xF4,0x0C,0xD0,0xE1,0x06,0x10,0x80,0xE0,0x91,0x01,0x00,0xE0, + 0x58,0x10,0x9F,0xE5,0x00,0x10,0xD1,0xE5,0x00,0x00,0x51,0xE3,0x50,0x10,0x9F,0xE5, + 0x96,0x06,0x00,0x10,0x00,0x10,0xD1,0xE5,0x01,0x00,0x51,0xE3,0xF0,0x47,0xBD,0x08, + 0x64,0x00,0xA0,0x03,0x1E,0xFF,0x2F,0x01,0x00,0x00,0x58,0xE3,0xF0,0x47,0xBD,0x18, + 0x1E,0xFF,0x2F,0x11,0x04,0x10,0xD7,0xE5,0x01,0x00,0x51,0xE3,0xF0,0x47,0xBD,0x08, + 0x1E,0xFF,0x2F,0x01,0x09,0x10,0xA0,0xE1,0xF0,0x47,0xBD,0xE8,0xA5,0xF5,0xFF,0xEA, + 0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xE0,0x05,0x00,0x20,0x40,0x02,0x00,0x20, + 0xA3,0x05,0x00,0x20,0x95,0x05,0x00,0x20,0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3, + 0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2, + 0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43, + 0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40,0x70,0x47,0x00,0x00,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0xAF,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x04,0xF0,0x75,0xFD,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x40,0x7C,0x00,0x28, + 0x01,0xD0,0x05,0xF0,0xFF,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0x8C,0x05,0x00,0x20,0xF1,0xB5,0x44,0x48,0x2E,0x21,0x41,0x60, + 0x41,0x69,0x89,0x06,0xFC,0xD4,0x00,0x99,0x01,0x26,0x76,0x07,0xF1,0x63,0x84,0x69, + 0x3E,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x04,0xF0,0x4C,0xFD,0x3C,0x4D,0x68,0x7C, + 0x00,0x28,0x01,0xD0,0x05,0xF0,0xE6,0xFE,0x00,0x9B,0x00,0x20,0x9B,0x1E,0xFF,0x27, + 0x42,0x1E,0x01,0x21,0x05,0xF0,0x18,0xFF,0x1E,0x15,0x15,0x15,0x15,0x15,0x13,0x15, + 0x15,0x17,0x10,0x15,0x15,0x26,0x15,0x37,0x1B,0x3D,0x43,0x49,0x15,0x4F,0x15,0x55, + 0x5B,0x1B,0x15,0x15,0x15,0x15,0x61,0x15,0x0B,0x20,0xF0,0x63,0x1D,0xE0,0x00,0xF0, + 0xD7,0xF8,0xF7,0x63,0x19,0xE0,0x2A,0x48,0x80,0x30,0x04,0x60,0xF9,0xE7,0x03,0x20, + 0x00,0x07,0xC2,0x60,0x01,0x20,0x40,0x03,0xFD,0xF7,0xD8,0xFF,0x00,0x98,0xFD,0xF7, + 0x29,0xFF,0x0A,0xE0,0x03,0x20,0x00,0x07,0xC2,0x60,0x01,0x20,0x40,0x03,0xFD,0xF7, + 0xCD,0xFF,0x00,0xF0,0x9D,0xFE,0x00,0xF0,0xD7,0xF8,0x1C,0x48,0x41,0x68,0x41,0x60, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C,0x01,0xD0,0xA9,0x73,0xD9,0xE7,0xA8,0x73, + 0xD7,0xE7,0x00,0x2C,0x01,0xD0,0xE9,0x73,0xD3,0xE7,0xE8,0x73,0xD1,0xE7,0x00,0x2C, + 0x01,0xD0,0x29,0x74,0xCD,0xE7,0x28,0x74,0xCB,0xE7,0x00,0x2C,0x01,0xD0,0x69,0x74, + 0xC7,0xE7,0x68,0x74,0xC5,0xE7,0x00,0x2C,0x01,0xD0,0xE9,0x74,0xC1,0xE7,0xE8,0x74, + 0xBF,0xE7,0x00,0x2C,0x01,0xD0,0x29,0x75,0xBB,0xE7,0x28,0x75,0xB9,0xE7,0x00,0x2C, + 0x01,0xD0,0x69,0x75,0xB5,0xE7,0x68,0x75,0xB3,0xE7,0x00,0x2C,0x01,0xD0,0xAC,0x75, + 0x00,0xE0,0xA8,0x75,0x05,0xF0,0xFA,0xF9,0xAB,0xE7,0x00,0x00,0x00,0x40,0x00,0x30, + 0x8C,0x05,0x00,0x20,0xF0,0xB5,0x34,0x4C,0x30,0x38,0x34,0x4A,0x34,0x4E,0x35,0x4F, + 0x35,0x49,0x25,0x68,0x03,0x00,0x05,0xF0,0x9F,0xFE,0x12,0x0A,0x0C,0x0E,0x12,0x16, + 0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16,0x3E,0x43,0x47,0x4D,0x50,0x0A,0xCD,0x61, + 0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C, + 0x52,0x8C,0x00,0x04,0x34,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68, + 0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48,0x03,0x7D,0x10,0x7D, + 0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43, + 0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06, + 0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7, + 0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7, + 0x38,0x69,0x40,0x08,0x00,0x02,0xC8,0xE7,0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04, + 0x10,0x43,0xC2,0xE7,0x38,0x69,0x40,0x08,0xBF,0xE7,0x10,0x48,0x80,0x6A,0xBC,0xE7, + 0x48,0x69,0x10,0x42,0xFC,0xD1,0x04,0xF0,0x6D,0xFC,0xFF,0x20,0x01,0x21,0x49,0x07, + 0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x92,0x00,0x00,0x00,0x93,0x00,0x00, + 0x15,0x00,0x0E,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20, + 0x00,0x05,0x00,0x20,0x00,0x96,0x00,0x00,0xE0,0x95,0x00,0x00,0x8C,0x05,0x00,0x20, + 0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60,0xFD,0xF7, + 0x23,0xFF,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFD,0xF7,0x00,0xFF,0x04,0xF0,0xB2,0xFA, + 0x00,0xF0,0xF8,0xFD,0x04,0xF0,0xA4,0xFA,0x30,0x00,0xFD,0xF7,0x29,0xFF,0xE5,0x60, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43, + 0x09,0x07,0xC8,0x60,0x04,0xF0,0x9E,0xFA,0xFF,0xF7,0x4C,0xFD,0x05,0x48,0xC1,0x68, + 0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x05,0xF0,0xFD,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xFF,0xB5,0x00,0x20,0x02,0x90,0x23,0x20, + 0x01,0x90,0xFF,0x20,0xBE,0x30,0x00,0x90,0x4C,0x48,0x00,0x68,0x00,0x88,0xC0,0x06, + 0x7E,0xD5,0x4B,0x4E,0x00,0x20,0x31,0x78,0x72,0x78,0x01,0x29,0x02,0xD1,0x00,0x2A, + 0x00,0xD1,0x01,0x20,0x47,0x4B,0x00,0x28,0x18,0x60,0x08,0xD0,0x01,0x29,0x06,0xD1, + 0x43,0x48,0x0A,0x30,0xC1,0x88,0x18,0x00,0x08,0x30,0x81,0x80,0x01,0xE0,0x00,0x29, + 0x79,0xD0,0x00,0x2A,0x77,0xD0,0x01,0x25,0x67,0xE0,0x0A,0x22,0x6A,0x43,0x3E,0x4F, + 0x01,0x20,0xD4,0x19,0xFF,0x34,0x71,0x78,0x81,0x34,0x5B,0xE0,0x0A,0x22,0x42,0x43, + 0xD2,0x19,0xFF,0x32,0xC1,0x32,0x23,0x79,0x92,0x7F,0x93,0x42,0x51,0xD1,0x0A,0x23, + 0x58,0x43,0xC7,0x19,0xFF,0x37,0x06,0x21,0xE1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E, + 0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21,0x61,0x5E,0x89,0x1A,0x03,0x91,0x3A,0x88, + 0xE1,0x88,0xFF,0xF7,0x31,0xFA,0xE0,0x80,0x7A,0x88,0x21,0x89,0x03,0x98,0xFF,0xF7, + 0x2B,0xFA,0x20,0x81,0x30,0x78,0x01,0x28,0x0A,0xD1,0x26,0x49,0x04,0x20,0x08,0x31, + 0x08,0x5E,0xE1,0x88,0x40,0x1A,0x0C,0x30,0x18,0x28,0x01,0xD9,0x00,0x20,0x25,0xE0, + 0xE0,0x88,0xFF,0x21,0xE1,0x31,0x88,0x42,0x26,0xD2,0xFF,0x21,0xAF,0x31,0x88,0x42, + 0x0A,0xD9,0x21,0x89,0xA5,0x22,0x92,0x00,0x91,0x42,0x05,0xD9,0x1B,0x4A,0x91,0x42, + 0x02,0xD2,0xFF,0x21,0xCD,0x31,0x00,0x91,0x01,0x99,0x88,0x42,0x02,0xD3,0x00,0x99, + 0x88,0x42,0x11,0xD9,0x39,0x88,0x08,0x1A,0x09,0x30,0x12,0x28,0x0C,0xD8,0x78,0x88, + 0x21,0x89,0x40,0x1A,0x00,0x1D,0x08,0x28,0x06,0xD8,0x01,0x20,0x02,0x90,0x03,0xE0, + 0x11,0xE0,0x40,0x1C,0x81,0x42,0xA1,0xDA,0x6D,0x1C,0x30,0x78,0xA8,0x42,0x94,0xDA, + 0x02,0x98,0x08,0x49,0x00,0x28,0x48,0x68,0x01,0xD0,0x40,0x1C,0x02,0xE0,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0x48,0x60,0xFF,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x06,0x00,0x20, + 0xC0,0x01,0x00,0x20,0xF8,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xCB,0x02,0x00,0x00, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x9C,0xD0,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0x34,0x00,0x8D,0xE5,0x30,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5, + 0x3C,0x08,0x9F,0xE5,0xB0,0x12,0xD0,0xE1,0x20,0x10,0x8D,0xE5,0xB2,0x02,0xD0,0xE1, + 0x1C,0x00,0x8D,0xE5,0x2C,0x08,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x8A,0x20,0xD0,0xE5, + 0x7C,0x10,0xD0,0xE5,0x7D,0xB0,0xD0,0xE5,0x18,0x20,0x8D,0xE5,0x89,0x20,0xD0,0xE5, + 0x14,0x20,0x8D,0xE5,0xB0,0x20,0xD0,0xE1,0x08,0x00,0x12,0xE3,0x23,0x00,0x00,0x0A, + 0x7F,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x88,0x20,0x8D,0xE5,0x80,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x84,0x20,0x8D,0xE5,0x81,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x80,0x20,0x8D,0xE5,0x82,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x7C,0x20,0x8D,0xE5, + 0x83,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x78,0x20,0x8D,0xE5,0x84,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x74,0x20,0x8D,0xE5,0x85,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x70,0x20,0x8D,0xE5,0x86,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x6C,0x20,0x8D,0xE5, + 0x87,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x68,0x20,0x8D,0xE5,0x88,0x00,0xD0,0xE5, + 0x91,0x00,0x00,0xE0,0x64,0x00,0x8D,0xE5,0x8C,0x07,0x9F,0xE5,0x80,0x11,0xD0,0xE5, + 0x00,0x00,0x51,0xE3,0x00,0x60,0xA0,0x13,0x03,0x00,0x00,0x1A,0xE4,0x03,0x00,0xEB, + 0x9C,0xD0,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x68,0xA7,0x9F,0xE5, + 0x06,0x50,0x8A,0xE0,0x9C,0x42,0xD5,0xE5,0x00,0x00,0x54,0xE3,0x0C,0x00,0x00,0x0A, + 0x18,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x06,0x00,0x00,0x1A,0x04,0x01,0x84,0xE0, + 0x80,0x00,0x8A,0xE0,0x01,0x0C,0x80,0xE2,0x8A,0x00,0x80,0xE2,0x63,0x03,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x02,0x00,0x00,0x0A,0xCA,0x02,0xDA,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x0A,0x06,0x00,0xA0,0xE1,0x18,0x00,0x00,0xEA,0x07,0x00,0xA0,0xE3, + 0x00,0x12,0x8A,0xE0,0x86,0x10,0x81,0xE0,0x02,0x2C,0x81,0xE2,0xB4,0x3D,0xD2,0xE1, + 0x03,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE2,0xB4,0x3E,0xC2,0xE1,0xB4,0x26,0xD1,0xE1, + 0xB4,0x27,0xC1,0xE1,0xF5,0xFF,0xFF,0x5A,0x04,0x01,0x84,0xE0,0x80,0x80,0x8A,0xE0, + 0x01,0x7C,0x88,0xE2,0xB6,0x08,0xD7,0xE1,0x20,0x10,0x9D,0xE5,0x01,0x10,0x41,0xE2, + 0x01,0x00,0x50,0xE1,0xB8,0x18,0xD7,0xD1,0x1C,0x00,0x9D,0xD5,0x01,0x00,0x40,0xD2, + 0x00,0x00,0x51,0xD1,0x03,0x00,0x00,0xDA,0x84,0x01,0xD8,0xE5,0x01,0x00,0x40,0xE2, + 0x44,0xFC,0xFF,0xEB,0x84,0x01,0x00,0xEA,0xB6,0x18,0xD7,0xE1,0x86,0x00,0x8A,0xE0, + 0x02,0x9C,0x80,0xE2,0x98,0x00,0x8D,0xE5,0xB4,0x1D,0xC9,0xE1,0xB8,0x18,0xD7,0xE1, + 0x03,0x4C,0x80,0xE2,0x00,0x30,0xA0,0xE3,0x02,0xCB,0xA0,0xE3,0xB4,0x16,0xC4,0xE1, + 0x03,0x10,0xA0,0xE1,0x0C,0x20,0xA0,0xE1,0x07,0x00,0xA0,0xE3,0x78,0xE6,0x9F,0xE5, + 0x00,0xE2,0x8E,0xE0,0x86,0xE0,0x8E,0xE0,0x94,0xE0,0x8D,0xE5,0x02,0xEC,0x8E,0xE2, + 0xF4,0xAD,0xDE,0xE1,0x00,0x00,0x5A,0xE3,0x03,0x00,0x00,0xDA,0x03,0x00,0x5A,0xE1, + 0xB4,0x3D,0xDE,0xC1,0x0C,0x00,0x5A,0xE1,0xB4,0xCD,0xDE,0xB1,0x94,0xE0,0x9D,0xE5, + 0x03,0xEC,0x8E,0xE2,0xF4,0xA6,0xDE,0xE1,0x00,0x00,0x5A,0xE3,0x03,0x00,0x00,0xDA, + 0x01,0x00,0x5A,0xE1,0xB4,0x16,0xDE,0xC1,0x02,0x00,0x5A,0xE1,0xB4,0x26,0xDE,0xB1, + 0x01,0x00,0x50,0xE2,0xE8,0xFF,0xFF,0x5A,0x0C,0x00,0x43,0xE0,0xF0,0x00,0x50,0xE3, + 0x02,0x30,0x41,0xD0,0xF0,0x00,0x53,0xD3,0x0C,0xC6,0x9F,0xC5,0x01,0x30,0xA0,0xC3, + 0xC8,0x32,0xCC,0xC5,0x1E,0x00,0x50,0xE3,0x02,0x00,0x41,0xB0,0x1E,0x00,0x50,0xB3, + 0xF4,0x15,0x9F,0xA5,0x00,0x00,0xA0,0xA3,0xF1,0x00,0xC1,0xA5,0xE8,0x05,0x9F,0xB5, + 0x01,0x10,0xA0,0xB3,0xF1,0x10,0xC0,0xB5,0xCC,0x02,0xD5,0xE5,0x01,0x00,0x50,0xE3, + 0x64,0xA0,0xA0,0x93,0x24,0xA0,0x8D,0x95,0x0E,0x00,0x00,0x9A,0xF4,0x2D,0xD9,0xE1, + 0xF4,0x3E,0xD9,0xE1,0x03,0x00,0x42,0xE0,0x00,0x00,0x50,0xE3,0x02,0x00,0x43,0xD0, + 0xF4,0x36,0xD4,0xE1,0xF4,0x27,0xD4,0xE1,0x00,0xA8,0xA0,0xE1,0x4A,0xA8,0xA0,0xE1, + 0x02,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3,0x03,0x00,0x42,0xD0,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x24,0x00,0x8D,0xE5,0xF4,0x1E,0xD9,0xE1,0xF4,0x0D,0xD9,0xE1, + 0x06,0x11,0x00,0xEB,0x3C,0x00,0x8D,0xE5,0xF4,0x17,0xD4,0xE1,0xF4,0x06,0xD4,0xE1, + 0x02,0x11,0x00,0xEB,0x38,0x00,0x8D,0xE5,0xF4,0x1F,0xD9,0xE1,0x3C,0x00,0x9D,0xE5, + 0xFE,0x10,0x00,0xEB,0x44,0x00,0x8D,0xE5,0xF4,0x18,0xD4,0xE1,0x38,0x00,0x9D,0xE5, + 0xFA,0x10,0x00,0xEB,0x40,0x00,0x8D,0xE5,0xF4,0x21,0xD4,0xE1,0xF4,0x10,0xD4,0xE1, + 0x44,0x00,0x9D,0xE5,0xF8,0x10,0x00,0xEB,0x4C,0x00,0x8D,0xE5,0xF4,0x2A,0xD4,0xE1, + 0xF4,0x19,0xD4,0xE1,0x40,0x00,0x9D,0xE5,0xF3,0x10,0x00,0xEB,0x48,0x00,0x8D,0xE5, + 0xF4,0x23,0xD4,0xE1,0xF4,0x12,0xD4,0xE1,0x4C,0x00,0x9D,0xE5,0xEE,0x10,0x00,0xEB, + 0x54,0x00,0x8D,0xE5,0xF4,0x2C,0xD4,0xE1,0xF4,0x1B,0xD4,0xE1,0x48,0x00,0x9D,0xE5, + 0xE9,0x10,0x00,0xEB,0x50,0x00,0x8D,0xE5,0xF4,0x25,0xD4,0xE1,0xF4,0x14,0xD4,0xE1, + 0x54,0x00,0x9D,0xE5,0xE4,0x10,0x00,0xEB,0x5C,0x00,0x8D,0xE5,0xF4,0x2E,0xD4,0xE1, + 0xF4,0x1D,0xD4,0xE1,0x50,0x00,0x9D,0xE5,0xDF,0x10,0x00,0xEB,0x58,0x00,0x8D,0xE5, + 0x24,0x10,0x9D,0xE5,0x0A,0x00,0xA0,0xE1,0x32,0x04,0x00,0xEB,0xC8,0x34,0x9F,0xE5, + 0x04,0x10,0xA0,0xE3,0x01,0x22,0x83,0xE0,0x86,0x20,0x82,0xE0,0x01,0x2B,0x82,0xE2, + 0xB4,0xC1,0xD2,0xE1,0x01,0x10,0x51,0xE2,0xB4,0xC2,0xC2,0xE1,0xF8,0xFF,0xFF,0x5A, + 0x98,0x10,0x9D,0xE5,0x01,0x1B,0x81,0xE2,0xB4,0x01,0xC1,0xE1,0x0C,0x14,0xD5,0xE5, + 0x00,0x00,0xA0,0xE3,0x00,0x20,0x51,0xE2,0x06,0x00,0x00,0xBA,0x01,0xC2,0x83,0xE0, + 0x86,0xC0,0x8C,0xE0,0x01,0xCB,0x8C,0xE2,0xF4,0xC1,0xDC,0xE1,0x01,0x10,0x51,0xE2, + 0x0C,0x00,0x80,0xE0,0xF8,0xFF,0xFF,0x5A,0x01,0x10,0x82,0xE2,0x81,0xF3,0xFF,0xEB, + 0x84,0x10,0x9D,0xE5,0x00,0xA0,0xA0,0xE1,0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0xD3, + 0x0B,0x00,0x00,0xDA,0x7C,0x00,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x02,0x00,0xA0,0xD3, + 0x07,0x00,0x00,0xDA,0x74,0x00,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x03,0x00,0xA0,0xD3, + 0x03,0x00,0x00,0xDA,0x6C,0x00,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x05,0x00,0xA0,0xC3, + 0x04,0x00,0xA0,0xD3,0x04,0x14,0xD5,0xE5,0x01,0x10,0x40,0xE0,0x00,0x00,0x51,0xE3, + 0x00,0x00,0x6B,0xE2,0x06,0x00,0x00,0xDA,0xF4,0x1F,0xD4,0xE1,0x0B,0x00,0x51,0xE1, + 0x01,0x00,0x00,0x1A,0x00,0x10,0xA0,0xE3,0x06,0x00,0x00,0xEA,0x01,0x10,0x81,0xE2, + 0x04,0x00,0x00,0xEA,0xF4,0x1F,0xD4,0xE1,0x04,0x00,0x00,0xAA,0x00,0x00,0x51,0xE1, + 0xF7,0xFF,0xFF,0x0A,0x01,0x10,0x41,0xE2,0xB4,0x1F,0xC4,0xE1,0x02,0x00,0x00,0xEA, + 0x00,0x00,0x51,0xE3,0xFA,0xFF,0xFF,0xCA,0xF3,0xFF,0xFF,0xBA,0xF4,0x3F,0xD4,0xE1, + 0x0B,0x00,0x53,0xE1,0x03,0x00,0x00,0x1A,0x04,0x14,0xD5,0xE5,0x05,0x00,0x51,0xE3, + 0x01,0x00,0x81,0x32,0x05,0x00,0x00,0x3A,0x00,0x00,0x53,0xE1,0x04,0x00,0x00,0x1A, + 0x04,0x04,0xD5,0xE5,0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0x40,0xE2, + 0x04,0x04,0xC5,0xE5,0x58,0x30,0x8D,0xE2,0x09,0x00,0x93,0xE8,0x60,0x00,0x8D,0xE5, + 0xCC,0x02,0xD5,0xE5,0x00,0x10,0xA0,0xE1,0x90,0x00,0x8D,0xE5,0x8C,0x00,0x8D,0xE5, + 0x03,0x00,0xA0,0xE1,0x43,0xF3,0xFF,0xEB,0x34,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5, + 0x60,0x00,0x9D,0xE5,0x8C,0x10,0x9D,0xE5,0x3E,0xF3,0xFF,0xEB,0x30,0x00,0x8D,0xE5, + 0x28,0x00,0x8D,0xE5,0x04,0x04,0xD5,0xE5,0x01,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A, + 0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5, + 0x5C,0x20,0x9D,0xE5,0x58,0x30,0x9D,0xE5,0x09,0x10,0xA0,0xE3,0x0D,0x13,0x00,0xEB, + 0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xCC,0x02,0xD5,0xE5, + 0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5,0x07,0x10,0xA0,0xE3,0x05,0x13,0x00,0xEB, + 0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1, + 0x0F,0x00,0x8D,0xE8,0x88,0x20,0x9D,0xE5,0x84,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2, + 0x60,0x00,0x00,0xEA,0x02,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2, + 0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x54,0x20,0x9D,0xE5, + 0x50,0x30,0x9D,0xE5,0x07,0x10,0xA0,0xE3,0xF2,0x12,0x00,0xEB,0x30,0x30,0x8D,0xE2, + 0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xCC,0x02,0xD5,0xE5,0x4C,0x20,0x9D,0xE5, + 0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3,0xEA,0x12,0x00,0xEB,0xF4,0x03,0xDD,0xE1, + 0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8, + 0x80,0x20,0x9D,0xE5,0x7C,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2,0x45,0x00,0x00,0xEA, + 0x03,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x4C,0x20,0x9D,0xE5,0x48,0x30,0x9D,0xE5, + 0x05,0x10,0xA0,0xE3,0xD7,0x12,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0xCC,0x02,0xD5,0xE5,0x44,0x20,0x9D,0xE5,0x40,0x30,0x9D,0xE5, + 0x03,0x10,0xA0,0xE3,0xCF,0x12,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1, + 0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x78,0x20,0x9D,0xE5, + 0x74,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2,0x2A,0x00,0x00,0xEA,0x04,0x00,0x50,0xE3, + 0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0x90,0x00,0x9D,0xE5,0x44,0x20,0x9D,0xE5,0x40,0x30,0x9D,0xE5,0x03,0x10,0xA0,0xE3, + 0xBC,0x12,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0xCC,0x02,0xD5,0xE5,0x3C,0x20,0x9D,0xE5,0x38,0x30,0x9D,0xE5,0x02,0x10,0xA0,0xE3, + 0xB4,0x12,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1, + 0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x70,0x20,0x9D,0xE5,0x6C,0x30,0x9D,0xE5, + 0x61,0x0F,0x88,0xE2,0x0F,0x00,0x00,0xEA,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x3C,0x20,0x9D,0xE5,0x38,0x30,0x9D,0xE5, + 0x02,0x10,0xA0,0xE3,0xA3,0x12,0x00,0xEB,0xF4,0x0D,0xD9,0xE1,0xF4,0x16,0xD4,0xE1, + 0xF0,0x33,0xDD,0xE1,0xF4,0x23,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x68,0x20,0x9D,0xE5, + 0x64,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2,0x0A,0x10,0xA0,0xE1,0xAB,0x12,0x00,0xEB, + 0xCC,0x02,0xD5,0xE5,0x50,0x11,0x9F,0xE5,0x09,0x00,0x50,0xE3,0x01,0x00,0x80,0x32, + 0xCC,0x02,0xC5,0x35,0x0C,0x04,0xD5,0xE5,0x05,0x00,0x50,0xE3,0x01,0x00,0x80,0x32, + 0x0C,0x04,0xC5,0x35,0x84,0x01,0xD8,0xE5,0x01,0x00,0x40,0xE2,0x00,0x01,0x81,0xE0, + 0x01,0x4B,0x80,0xE2,0xF4,0x07,0xD4,0xE1,0x01,0x00,0x70,0xE3,0xF6,0x17,0xD4,0xC1, + 0x01,0x00,0x71,0xC3,0x18,0x00,0x00,0xDA,0x14,0x10,0x9D,0xE5,0x64,0x50,0x61,0xE2, + 0x95,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0xA6,0xF2,0xFF,0xEB,0x00,0x80,0xA0,0xE1, + 0xB6,0x08,0xD7,0xE1,0x14,0x10,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3, + 0x38,0xF3,0xFF,0xEB,0x08,0x00,0x80,0xE0,0xB6,0x08,0xC7,0xE1,0xF6,0x07,0xD4,0xE1, + 0x64,0x10,0xA0,0xE3,0x95,0x00,0x00,0xE0,0x9A,0xF2,0xFF,0xEB,0x00,0x50,0xA0,0xE1, + 0xB8,0x08,0xD7,0xE1,0x14,0x10,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3, + 0x2C,0xF3,0xFF,0xEB,0x05,0x00,0x80,0xE0,0xB8,0x08,0xC7,0xE1,0xB6,0x08,0xD7,0xE1, + 0xB4,0x07,0xC4,0xE1,0xB8,0x08,0xD7,0xE1,0xB6,0x07,0xC4,0xE1,0x01,0x60,0x86,0xE2, + 0x08,0x00,0x56,0xE3,0x48,0xFE,0xFF,0xBA,0x8C,0x30,0x9F,0xE5,0x80,0x21,0xD3,0xE5, + 0x00,0x00,0x83,0xE2,0x01,0x1C,0x80,0xE2,0x01,0x00,0x52,0xE3,0x02,0x0C,0x80,0xE2, + 0x10,0x00,0x00,0x1A,0x8E,0x21,0xD3,0xE5,0x82,0x30,0x83,0xE0,0x02,0x2C,0x83,0xE2, + 0xB2,0xCD,0xD2,0xE1,0x03,0x3C,0x83,0xE2,0xBC,0xCB,0xC0,0xE1,0xB2,0xC6,0xD3,0xE1, + 0xBE,0xCB,0xC0,0xE1,0xB2,0x2E,0xD2,0xE1,0xB0,0x2C,0xC0,0xE1,0xB2,0x27,0xD3,0xE1, + 0xB2,0x2C,0xC0,0xE1,0xB0,0x29,0xD1,0xE1,0xB4,0x2B,0xC0,0xE1,0xB2,0x19,0xD1,0xE1, + 0xB6,0x1B,0xC0,0xE1,0x2D,0xFE,0xFF,0xEA,0x02,0x00,0x52,0xE3,0x2B,0xFE,0xFF,0x1A, + 0xB0,0x29,0xD1,0xE1,0xB4,0x2B,0xC0,0xE1,0xB2,0x29,0xD1,0xE1,0xB6,0x2B,0xC0,0xE1, + 0xBA,0x29,0xD1,0xE1,0xB8,0x2B,0xC0,0xE1,0xBC,0x19,0xD1,0xE1,0xBA,0x1B,0xC0,0xE1, + 0x22,0xFE,0xFF,0xEA,0x00,0x93,0x00,0x00,0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF8,0xB5,0x1E,0x4B,0x1C,0x4A,0x1B,0x7D,0x12,0x88,0xDB,0x07,0x32,0xD0,0x1C,0x4B, + 0x1C,0x88,0x1C,0x4B,0x1B,0x7D,0x9E,0x46,0x1B,0x4B,0x1E,0x78,0x17,0x4B,0x9D,0x7D, + 0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E, + 0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0, + 0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0, + 0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42, + 0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0xA8,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0xA6,0x05,0x00,0x20,0x00,0x05,0x00,0x20,0x99,0x05,0x00,0x20,0x0E,0x23,0x58,0x43, + 0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x70,0xB5,0x2E,0x49,0x00,0x20,0x4A,0x78,0x2D,0x49,0x00,0x2A,0x15,0xD1,0x0A,0x89, + 0x00,0x2A,0x0F,0xD0,0x2B,0x49,0x8A,0x42,0x0C,0xD0,0x10,0x00,0x32,0x21,0x48,0x43, + 0x64,0x21,0xFC,0xF7,0x97,0xFD,0xFF,0x30,0x4B,0x21,0x7D,0x30,0xC9,0x00,0x88,0x42, + 0x00,0xD9,0x08,0x00,0x70,0xBC,0x08,0xBC,0x18,0x47,0x88,0x89,0x01,0x21,0x49,0x07, + 0x89,0x68,0x21,0x4C,0x89,0x00,0x0A,0x0F,0x1D,0x49,0x89,0x89,0xFF,0x39,0xE2,0x39, + 0x01,0x2A,0x16,0xD1,0x1D,0x4A,0x1E,0x4D,0x91,0x42,0x07,0xD8,0x29,0x1A,0x08,0x00, + 0x48,0x43,0x51,0x1C,0xFC,0xF7,0x76,0xFD,0x28,0x1A,0x06,0xE0,0xA8,0x42,0x04,0xD9, + 0x17,0x49,0x49,0x42,0x40,0x18,0x80,0x08,0x40,0x19,0xA0,0x42,0xDA,0xD9,0x0D,0x21, + 0x18,0xE0,0x02,0x2A,0xD6,0xD1,0x12,0x4A,0x11,0x4D,0xE7,0x3A,0xFA,0x35,0x91,0x42, + 0x07,0xD8,0x29,0x1A,0x08,0x00,0x48,0x43,0x51,0x1C,0xFC,0xF7,0x5B,0xFD,0x28,0x1A, + 0x05,0xE0,0xA8,0x42,0x03,0xD9,0x0B,0x49,0x40,0x18,0x80,0x08,0x40,0x19,0xA0,0x42, + 0xC0,0xD9,0x11,0x21,0xFC,0xF7,0x4E,0xFD,0x60,0x1A,0xBB,0xE7,0xE0,0x04,0x00,0x20, + 0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00,0x10,0x27,0x00,0x00,0xC9,0x03,0x00,0x00, + 0xAA,0x05,0x00,0x00,0x5C,0xF9,0xFF,0xFF,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5, + 0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30, + 0x70,0xB5,0x12,0x4D,0x00,0x24,0x01,0x21,0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4, + 0xE8,0x68,0x6A,0x68,0x6A,0x60,0x05,0xE0,0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69, + 0x04,0xC1,0xA4,0x18,0x02,0x00,0x40,0x1E,0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60, + 0x68,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0,0x55,0xFE,0x05,0x48,0xE8,0x61,0xEC,0x61, + 0x68,0x69,0x80,0x06,0xFC,0xD4,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0xAB,0xFC,0xFF,0x8F,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5, + 0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A, + 0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3, + 0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5, + 0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2, + 0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A, + 0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A, + 0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5, + 0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08,0xFB,0x0E,0x00,0x0A,0x14,0x10,0x94,0xE5, + 0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A, + 0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A,0xF2,0x0E,0x00,0xEB, + 0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30,0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29, + 0x80,0x7D,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25, + 0x00,0x28,0x0B,0xD0,0x00,0x21,0x05,0x27,0x3F,0x02,0x3B,0xE0,0x00,0x28,0x05,0xD1, + 0x34,0x48,0x09,0x22,0x00,0x21,0x00,0x1D,0xFC,0xF7,0xA8,0xFC,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19, + 0x36,0x79,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C,0x08,0x28,0xF4,0xD9, + 0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x79,0x00,0x2E,0x03,0xD1, + 0x24,0x18,0xE4,0x19,0x23,0x71,0xED,0xE7,0x40,0x1C,0x08,0x28,0xF3,0xD9,0x60,0x46, + 0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21, + 0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07, + 0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x79, + 0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x71,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C,0x08,0x28,0xEC,0xD9, + 0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8, + 0x9C,0xE7,0x00,0x00,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0x03,0x22,0x12,0x07, + 0xD3,0x68,0x01,0x21,0x81,0x40,0x0B,0x43,0xD3,0x60,0x50,0x68,0x08,0x42,0x01,0xD0, + 0x01,0x48,0x01,0x63,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x30,0x03,0x23,0x1B,0x07, + 0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24, + 0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20, + 0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30, + 0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47, + 0x70,0x06,0x00,0x20,0xF0,0xB5,0x87,0xB0,0xFE,0xF7,0xE4,0xFA,0xFE,0xF7,0xC2,0xFA, + 0x02,0xF0,0x5C,0xF9,0x03,0xF0,0xAA,0xFB,0x00,0xF0,0xAE,0xFE,0x00,0xF0,0xFA,0xFB, + 0xFD,0xF7,0x14,0xFF,0xFD,0xF7,0x1C,0xF8,0x47,0x48,0x00,0x68,0x80,0x30,0x40,0x7B, + 0x00,0x28,0x04,0xD1,0xFF,0xF7,0x9C,0xF9,0xFF,0xF7,0xEE,0xF8,0x03,0xE0,0xFF,0xF7, + 0xEB,0xF8,0xFF,0xF7,0x95,0xF9,0x01,0x25,0x6D,0x07,0x68,0x68,0x6B,0x46,0x03,0x90, + 0x00,0x20,0xD8,0x73,0x03,0x98,0x68,0x60,0x03,0xF0,0x10,0xFF,0x03,0xF0,0x52,0xFD, + 0x28,0x68,0x00,0x28,0x07,0xD0,0x68,0x68,0x80,0x0F,0x80,0x07,0x03,0xD5,0x2E,0x68, + 0x02,0x24,0x76,0x1C,0x4F,0xE0,0x01,0x24,0x26,0x00,0xA0,0x00,0x40,0x19,0x06,0x90, + 0x07,0x68,0xB8,0x01,0x80,0x0D,0x05,0x90,0xB8,0x05,0x80,0x0D,0x04,0x90,0x2F,0x48, + 0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9,0x05,0xA8,0x03,0xF0,0x79,0xFD,0x2C,0x4B, + 0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C, + 0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04,0x1B,0x0C,0x05,0xA8,0x04,0xF0,0x8D,0xFE, + 0x04,0xA9,0x05,0xA8,0x04,0xF0,0xB0,0xFC,0x05,0x98,0x22,0x49,0x80,0x05,0x04,0x9A, + 0x0F,0x40,0x80,0x09,0x07,0x43,0xB8,0x0A,0x92,0x05,0x80,0x02,0x92,0x0D,0x10,0x43, + 0x1D,0x4A,0x12,0x78,0x00,0x2A,0x13,0xD0,0x82,0x01,0x92,0x0D,0x9B,0x2A,0x03,0xD2, + 0x73,0x22,0x08,0x40,0x12,0x04,0x80,0x18,0x82,0x01,0xFF,0x23,0x92,0x0D,0x46,0x33, + 0x9A,0x42,0x02,0xD9,0x08,0x40,0x15,0x49,0x40,0x18,0x80,0x0A,0x80,0x02,0x9E,0x30, + 0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42,0xAF,0xD9,0xFD,0xF7,0x45,0xFD,0x03,0xF0, + 0xC1,0xFC,0x01,0x24,0x28,0x68,0xFC,0xF7,0xAD,0xFC,0x64,0x1E,0xFA,0xD2,0xFF,0xF7, + 0xB1,0xFE,0xFC,0xF7,0xDB,0xFB,0x04,0xF0,0x2B,0xFD,0x09,0x48,0x40,0x79,0x07,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x06,0x00,0x20,0xA0,0x05,0x00,0x20, + 0x00,0x93,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xA3,0x05,0x00,0x20,0x00,0x00,0x6D,0x01, + 0x40,0x00,0x00,0x20,0xF8,0xB5,0x03,0xF0,0xE5,0xFA,0x04,0xF0,0x99,0xFB,0x2C,0x48, + 0x2C,0x4D,0x00,0x7C,0x41,0x1E,0xFF,0x29,0x00,0xD3,0x00,0x20,0xFE,0xF7,0xB0,0xF8, + 0x28,0x73,0x29,0x48,0x01,0x69,0xFF,0x22,0x12,0x02,0x91,0x43,0x01,0x61,0x01,0x69, + 0x2A,0x7B,0x12,0x02,0x11,0x43,0x01,0x61,0xFE,0xF7,0xFE,0xFC,0xFE,0xF7,0x7A,0xFD, + 0xFE,0xF7,0x80,0xFD,0x1E,0x48,0xE9,0x7D,0x60,0x38,0xC0,0x7F,0x00,0x29,0x03,0xD0, + 0x03,0x21,0xFC,0xF7,0x0F,0xFB,0xFF,0xE7,0x04,0xF0,0xBA,0xFB,0x1B,0x4F,0xFC,0x03, + 0x00,0x20,0x28,0x70,0xE8,0x62,0x28,0x7C,0x00,0x28,0x1D,0xD0,0x01,0x26,0x18,0xE0, + 0x78,0x68,0x00,0x07,0x15,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x09,0xD1,0x78,0x68, + 0x80,0x07,0xFC,0xD5,0x03,0xF0,0x36,0xFC,0xFE,0xF7,0xE2,0xFF,0xFF,0x20,0xE0,0x63, + 0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0, + 0x29,0xFC,0xE0,0x6B,0x0B,0x28,0xE3,0xD1,0xFE,0xF7,0xA0,0xF8,0x28,0x78,0x00,0x28, + 0xD6,0xD0,0x02,0xF0,0x9D,0xFE,0xD3,0xE7,0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7, + 0x60,0x93,0x00,0x00,0x8C,0x05,0x00,0x20,0x00,0x90,0x00,0x40,0x00,0x40,0x00,0x30, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x70,0xB5,0x06,0x00,0x23,0x48,0x24,0x4A, + 0x00,0x68,0x12,0x88,0x60,0x30,0x01,0x7E,0xC0,0x7D,0x34,0x78,0x89,0x18,0x0D,0x06, + 0x20,0x49,0x2D,0x0E,0x09,0x78,0x00,0x29,0x05,0xD1,0x1F,0x49,0xFF,0x22,0x09,0x68, + 0x2D,0x32,0x91,0x42,0x01,0xD9,0x03,0x25,0x04,0xE0,0x1C,0x49,0x09,0x78,0x01,0x29, + 0x00,0xD1,0x02,0x25,0x1A,0x49,0x8A,0x7C,0x00,0x2A,0x0D,0xD1,0xC9,0x7C,0x01,0x29, + 0x01,0xD1,0x40,0x1C,0x06,0xE0,0x02,0x29,0x01,0xD1,0x80,0x1C,0x02,0xE0,0x03,0x29, + 0x02,0xD1,0xC0,0x1C,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3, + 0x14,0x21,0x20,0x00,0xFC,0xF7,0x96,0xFA,0x6D,0x1C,0xA8,0x42,0x05,0xD2,0x14,0x2C, + 0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20, + 0x00,0xE0,0x13,0x20,0x30,0x70,0x01,0x20,0xF4,0xE7,0x00,0x00,0xF0,0x06,0x00,0x20, + 0x80,0x05,0x00,0x20,0xA3,0x05,0x00,0x20,0xDC,0x05,0x00,0x20,0x95,0x05,0x00,0x20, + 0xE0,0x02,0x00,0x20,0x10,0xB5,0x08,0x24,0x20,0x00,0xFE,0xF7,0x2D,0xF9,0x64,0x1E, + 0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1, + 0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0x10,0xB5,0x07,0x4C, + 0x07,0x48,0x22,0x00,0x00,0x21,0xFC,0xF7,0x81,0xFA,0x06,0x48,0x22,0x00,0x00,0x21, + 0xFC,0xF7,0x7C,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x00,0x00,0x00,0x10,0x08,0x07,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21, + 0x20,0x00,0xFC,0xF7,0x6B,0xFA,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0xFC,0xF7,0x88,0xFA, + 0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19, + 0x0E,0x48,0x00,0x19,0xFC,0xF7,0x82,0xFA,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48, + 0xA2,0x00,0xFC,0xF7,0x69,0xFA,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21, + 0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0xFC,0xF7,0x40,0xFA,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x91,0x00,0x00,0x40,0x00,0x00,0x20, + 0x3C,0x0A,0x00,0x00,0x40,0x00,0x00,0x20,0x33,0x21,0x09,0x05,0x01,0x20,0x80,0x07, + 0x41,0x62,0x04,0x49,0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61, + 0x70,0x47,0x00,0x00,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE3,0x04,0x00,0xA0,0xE1, + 0x8C,0xF8,0xFF,0xEB,0x01,0x40,0x84,0xE2,0x08,0x00,0x54,0xE3,0xFA,0xFF,0xFF,0xBA, + 0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00, + 0xFC,0xF7,0xD4,0xFD,0xFE,0xF7,0x02,0xFC,0xFE,0xF7,0xDC,0xFB,0xFE,0xF7,0x06,0xFC, + 0xFE,0xF7,0xFC,0xFB,0xFE,0xF7,0xCE,0xFB,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43, + 0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFC,0xF7, + 0xB5,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x93,0x00,0x00, + 0x10,0xB5,0x03,0xF0,0x51,0xF9,0x03,0xF0,0x43,0xF9,0x03,0xF0,0x39,0xF9,0xFF,0x20, + 0xFC,0xF7,0xE4,0xFD,0xFF,0xF7,0xA0,0xFF,0x13,0x48,0x80,0x22,0x00,0x21,0xFC,0xF7, + 0xEB,0xF9,0x08,0x20,0xFC,0xF7,0xA2,0xFD,0x00,0x22,0x10,0x49,0xD2,0x43,0x00,0x20, + 0xFF,0xF7,0x9C,0xFD,0x00,0xF0,0x20,0xF8,0x0D,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0, + 0x40,0x20,0xFC,0xF7,0x93,0xFD,0x00,0xF0,0x53,0xF8,0x00,0xF0,0x3D,0xF8,0x10,0x20, + 0x03,0xF0,0x23,0xF9,0x07,0x49,0xC8,0x69,0xCA,0x13,0x90,0x43,0xC8,0x61,0xFE,0xF7, + 0x33,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x70,0x06,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x93,0x00,0x00,0x00,0x70,0x00,0x40,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25, + 0x30,0x00,0xFC,0xF7,0x73,0xFD,0x20,0x02,0xFC,0xF7,0x9A,0xFD,0x0C,0x48,0x0A,0x21, + 0x00,0x6B,0xFC,0xF7,0x6F,0xF9,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23, + 0x00,0x95,0x04,0xF0,0xBD,0xFA,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94, + 0x04,0xF0,0xB6,0xFA,0x30,0x00,0xFC,0xF7,0x51,0xFD,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x07,0x49,0x00,0x20,0xFF,0xF7, + 0x5F,0xFD,0x04,0xF0,0x4B,0xFC,0x05,0x48,0x04,0xF0,0x42,0xFC,0x00,0x20,0xFF,0xF7, + 0x3D,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA5,0x8E,0x00,0x00,0xC8,0x32,0x00,0x00, + 0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21, + 0xC9,0x00,0xFC,0xF7,0x37,0xF9,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0xE0,0x67, + 0x04,0xF0,0xFC,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x07,0xA5,0x07,0x00,0x8C,0x05,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xBF,0xFE,0x11,0x48, + 0x00,0x7A,0x04,0xF0,0xB1,0xF9,0xFF,0xF7,0x2B,0xFF,0x0E,0x48,0x0E,0x4A,0xA0,0x30, + 0x41,0x89,0xD1,0x83,0x0D,0x49,0x0E,0x4A,0x09,0x68,0x40,0x31,0x49,0x7D,0x51,0x76, + 0x01,0x00,0x20,0x39,0x0A,0x8B,0x0A,0x49,0x80,0x31,0x8A,0x63,0x00,0x88,0xC8,0x63, + 0xFF,0xF7,0x90,0xFE,0xFE,0xF7,0x32,0xFA,0x06,0x49,0x00,0x20,0x08,0x70,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0xF0,0x06,0x00,0x20, + 0xC0,0x04,0x00,0x20,0x8D,0x05,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90, + 0x00,0x20,0x2B,0x4E,0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0xE4,0xFA, + 0xFE,0xF7,0x50,0xFB,0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F, + 0x00,0x25,0x00,0x90,0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0xE1,0xFA,0x00,0x28, + 0x1B,0xD0,0x0E,0x21,0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98, + 0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42, + 0x03,0xDD,0x06,0x00,0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3, + 0x6D,0x1C,0x15,0x2D,0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69, + 0xC0,0x07,0x05,0xD0,0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0, + 0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0, + 0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46, + 0xF8,0xC0,0x9F,0xE5,0x00,0x00,0x9C,0xE5,0xF4,0x30,0x9F,0xE5,0xA6,0x04,0xD3,0xE5, + 0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xA7,0x14,0xD3,0x15,0x00,0x00,0xA0,0x13, + 0x00,0x00,0x51,0x13,0x1E,0xFF,0x2F,0x91,0xF0,0x03,0x2D,0xE9,0xD4,0x50,0x9F,0xE5, + 0xD4,0x60,0x9F,0xE5,0xD4,0x40,0x9F,0xE5,0xB7,0x70,0xA0,0xE3,0xEE,0x8E,0xA0,0xE3, + 0x0B,0x7C,0x87,0xE2,0x02,0x8A,0x88,0xE2,0xA6,0x24,0xD3,0xE5,0x00,0x10,0x83,0xE0, + 0xD5,0x14,0xD1,0xE5,0x02,0x00,0x12,0xE3,0xD4,0x24,0xD3,0xE5,0x82,0x21,0x62,0x00, + 0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10,0x81,0x10,0x82,0x10,0x00,0x20,0xD5,0xE5, + 0x00,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A,0x01,0x11,0x9C,0xE7,0x80,0x20,0x83,0xE0, + 0x02,0x19,0xC1,0xE3,0xB0,0x11,0xC2,0xE1,0x03,0x00,0x00,0xEA,0x81,0x10,0x86,0xE0, + 0xB0,0x10,0xD1,0xE1,0x80,0x20,0x83,0xE0,0xB0,0x11,0xC2,0xE1,0x80,0x10,0x83,0xE0, + 0xB0,0x21,0xD1,0xE1,0x23,0x9C,0x42,0xE2,0x29,0x90,0x49,0xE2,0x07,0x00,0x59,0xE1, + 0x04,0x00,0x00,0x2A,0x02,0x21,0x82,0xE0,0x02,0x22,0xA0,0xE1,0x94,0x92,0x82,0xE0, + 0xA2,0x22,0xA0,0xE1,0xB0,0x21,0xC1,0xE1,0xB0,0x21,0xD1,0xE1,0x08,0x00,0x52,0xE1, + 0x04,0x00,0x00,0x3A,0x46,0x90,0xA0,0xE3,0x99,0x02,0x02,0xE0,0x94,0x92,0x82,0xE0, + 0xA2,0x22,0xA0,0xE1,0xB0,0x21,0xC1,0xE1,0xA7,0x14,0xD3,0xE5,0x01,0x00,0x80,0xE2, + 0x00,0x00,0x51,0xE1,0xD3,0xFF,0xFF,0x8A,0xF0,0x03,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20,0x8C,0x05,0x00,0x20,0x08,0x07,0x00,0x20, + 0x1F,0x85,0xEB,0x51,0x03,0x49,0x30,0x20,0xC8,0x75,0x02,0x49,0x20,0x31,0x48,0x71, + 0x70,0x47,0x00,0x00,0x78,0x09,0x10,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42, + 0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00, + 0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x85,0xDF,0x4D,0xE2, + 0x00,0x00,0xA0,0xE3,0xF8,0x01,0x8D,0xE5,0x24,0x05,0x9F,0xE5,0x6C,0x60,0x8D,0xE2, + 0xBE,0x03,0x90,0xE8,0xBE,0x03,0x86,0xE8,0x18,0x05,0x9F,0xE5,0x69,0x20,0xA0,0xE3, + 0x00,0x00,0x90,0xE5,0x01,0x2C,0x82,0xE2,0xBC,0x45,0xD0,0xE1,0x62,0x50,0xD0,0xE5, + 0x04,0x05,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x32,0x40,0xA0,0x13,0x8C,0x00,0x8D,0xE2,0xF6,0xEF,0xFF,0xEB,0xEC,0x04,0x9F,0xE5, + 0x08,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xF2,0xEF,0xFF,0xEB,0xE0,0x04,0x9F,0xE5, + 0x10,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xEE,0xEF,0xFF,0xEB,0x24,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x48,0x00,0x8D,0xE2,0xEA,0xEF,0xFF,0xEB,0x24,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x24,0x00,0x8D,0xE2,0xE6,0xEF,0xFF,0xEB,0x24,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x0D,0x00,0xA0,0xE1,0xE2,0xEF,0xFF,0xEB,0xA4,0x14,0x9F,0xE5, + 0x04,0x00,0xD1,0xE5,0x00,0x00,0x50,0xE3,0x85,0xDF,0x8D,0x02,0xF0,0x4F,0xBD,0x08, + 0x1E,0xFF,0x2F,0x01,0xB6,0x00,0xD1,0xE1,0x20,0x00,0x10,0xE3,0x05,0x00,0x44,0x10, + 0x00,0x48,0xA0,0x11,0xB8,0x00,0xD1,0xE1,0x24,0x48,0xA0,0x11,0x78,0x24,0x9F,0xE5, + 0x94,0x00,0x00,0xE0,0x92,0x30,0xC0,0xE0,0xC0,0x22,0xA0,0xE1,0xC0,0x0F,0x42,0xE0, + 0x68,0x24,0x9F,0xE5,0x00,0x40,0xA0,0xE3,0x10,0x22,0x8D,0xE5,0xBE,0x20,0xD1,0xE1, + 0x02,0x00,0x80,0xE0,0x10,0x22,0x9D,0xE5,0xBE,0x07,0xC2,0xE1,0x04,0x00,0xA0,0xE1, + 0x04,0x42,0x8D,0xE5,0x80,0x01,0x60,0xE0,0x00,0x70,0xA0,0xE3,0x0C,0x02,0x8D,0xE5, + 0x0C,0x12,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x81,0x20,0x87,0xE0,0x30,0x14,0x9F,0xE5, + 0x82,0xC0,0x81,0xE0,0x10,0x12,0x9D,0xE5,0xF0,0x30,0xDC,0xE1,0xFE,0x17,0xD1,0xE1, + 0x01,0x00,0x53,0xE1,0x01,0x00,0x43,0xC0,0x00,0x08,0xA0,0xC1,0x40,0x08,0xA0,0xC1, + 0x00,0x00,0x57,0xE3,0x06,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0x83,0x00,0x00,0x0A, + 0x8C,0x00,0x8D,0xE2,0x02,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3,0x7F,0x00,0x00,0x1A, + 0x0C,0x00,0x00,0xEA,0xF2,0x30,0x5C,0xE1,0x01,0x00,0x53,0xE1,0x03,0x00,0x00,0xDA, + 0x01,0x10,0x43,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xB0,0xE1,0x77,0x00,0x00,0x1A, + 0x00,0x00,0x50,0xE3,0x75,0x00,0x00,0x0A,0x8C,0x00,0x8D,0xE2,0x02,0x00,0xD0,0xE7, + 0x00,0x00,0x50,0xE3,0x71,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5,0x07,0x38,0xA0,0xE1, + 0x00,0xC8,0xA0,0xE1,0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1, + 0x08,0x00,0x54,0xE3,0x43,0x38,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1,0x04,0x10,0xA0,0xE3, + 0x00,0x60,0xA0,0xD3,0x00,0x32,0x8D,0xE5,0xFC,0xC1,0x8D,0xE5,0x03,0x00,0x00,0xDA, + 0x01,0x00,0x44,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1,0x6A,0x00,0x00,0xEA, + 0x04,0x0C,0xA0,0xE1,0x40,0x0C,0xA0,0xE1,0x08,0x02,0x8D,0xE5,0x54,0x03,0x9F,0xE5, + 0x84,0x00,0x80,0xE0,0x01,0xAC,0x80,0xE2,0x01,0x00,0x86,0xE2,0x00,0x68,0xA0,0xE1, + 0x46,0x68,0xA0,0xE1,0x09,0x0D,0x56,0xE3,0x00,0x80,0xA0,0xE3,0x53,0x00,0x00,0xCA, + 0x10,0x02,0x9D,0xE5,0x00,0x90,0xA0,0xE3,0xFE,0x57,0xD0,0xE1,0x6C,0x00,0x8D,0xE2, + 0x01,0x01,0x80,0xE0,0xB2,0x20,0xD0,0xE1,0xB0,0x00,0xD0,0xE1,0x0C,0x20,0x82,0xE0, + 0x02,0x28,0xA0,0xE1,0x03,0x00,0x80,0xE0,0x42,0x28,0xA0,0xE1,0x00,0x08,0xA0,0xE1, + 0x15,0x00,0x52,0xE3,0x40,0x08,0xA0,0xE1,0x15,0x00,0x00,0x2A,0x00,0x00,0x50,0xE3, + 0x13,0x00,0x00,0xBA,0x0E,0x00,0x50,0xE3,0x11,0x00,0x00,0xAA,0xF0,0xE2,0x9F,0xE5, + 0x82,0xB1,0x62,0xE0,0x8B,0xB0,0x80,0xE0,0x8B,0xE0,0x8E,0xE0,0xF0,0xE0,0xDE,0xE1, + 0x05,0x00,0x5E,0xE1,0x0A,0x00,0x00,0xDA,0x8C,0xE0,0x8D,0xE2,0xDB,0xB0,0x9E,0xE1, + 0x04,0x00,0x5B,0xE1,0x00,0x00,0x5B,0x13,0x05,0x00,0x00,0x1A,0xFC,0x91,0x9D,0xE5, + 0x09,0x00,0x52,0xE1,0x00,0x92,0x9D,0x05,0x09,0x00,0x50,0x01,0x01,0x80,0xA0,0x13, + 0x04,0x00,0x00,0xEA,0x01,0x90,0x89,0xE2,0x01,0x10,0x81,0xE2,0x08,0x00,0x59,0xE3, + 0x07,0x10,0x01,0xE2,0xD8,0xFF,0xFF,0xBA,0x8C,0x91,0x6C,0xE0,0x89,0x90,0x83,0xE0, + 0x8C,0xE0,0x8D,0xE2,0x09,0xB0,0xDE,0xE7,0x00,0x00,0x5B,0xE3,0x1C,0x00,0x00,0x1A, + 0x08,0xB2,0x9D,0xE5,0x09,0xB0,0xCE,0xE7,0x74,0xB2,0x9F,0xE5,0x48,0xE0,0x8D,0xE2, + 0x89,0x90,0x8B,0xE0,0xF0,0x90,0xD9,0xE1,0x04,0xB1,0x9E,0xE7,0x05,0x00,0x59,0xE1, + 0x05,0x50,0x49,0xC0,0x4C,0x92,0x9F,0xE5,0x05,0x58,0xA0,0xC1,0x83,0x30,0x89,0xE0, + 0xB0,0x32,0xD3,0xE1,0x00,0x50,0xA0,0xD3,0x25,0x58,0xA0,0xC1,0x95,0xB3,0x23,0xE0, + 0x04,0x31,0x8E,0xE7,0x8C,0xC0,0x89,0xE0,0xB4,0xC5,0xDC,0xE1,0x24,0x30,0x8D,0xE2, + 0x04,0xB1,0x93,0xE7,0x95,0xBC,0x2C,0xE0,0x04,0xC1,0x83,0xE7,0x04,0xC1,0x9D,0xE7, + 0x05,0xC0,0x8C,0xE0,0x04,0xC1,0x8D,0xE7,0xBE,0x36,0xDA,0xE1,0x01,0x30,0x83,0xE2, + 0xBE,0x36,0xCA,0xE1,0x00,0x00,0x58,0xE3,0x04,0x00,0x00,0x0A,0xFF,0x30,0x00,0xE2, + 0x05,0x00,0x81,0xE2,0xFF,0xC0,0x02,0xE2,0x07,0x10,0x00,0xE2,0xA5,0xFF,0xFF,0xEA, + 0x01,0x70,0x87,0xE2,0x0E,0x00,0x57,0xE3,0x68,0xFF,0xFF,0xBA,0xF8,0x01,0x9D,0xE5, + 0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5,0x01,0x00,0x80,0xE2, + 0x15,0x00,0x50,0xE3,0x04,0x02,0x8D,0xE5,0x5D,0xFF,0xFF,0xBA,0x00,0x00,0x54,0xE3, + 0x49,0x00,0x00,0xDA,0xAC,0x51,0x9F,0xE5,0x00,0x30,0xA0,0xE3,0x48,0x60,0x8D,0xE2, + 0x24,0xE0,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x83,0xA0,0x85,0xE0,0x83,0xB1,0x63,0xE0, + 0x9C,0x01,0x9F,0xE5,0x8B,0xC0,0x82,0xE0,0x8C,0x70,0x80,0xE0,0x10,0x02,0x9D,0xE5, + 0xF2,0x70,0xD7,0xE1,0xFE,0x07,0xD0,0xE1,0x00,0x10,0xA0,0xE3,0x00,0x00,0x57,0xE1, + 0x00,0x00,0x47,0xC0,0x00,0x18,0xA0,0xC1,0x8C,0x70,0x8D,0xE2,0xDC,0x00,0x97,0xE1, + 0x07,0xC0,0x8C,0xE0,0x01,0x70,0xDC,0xE5,0x41,0x18,0xA0,0xC1,0x00,0x00,0x57,0xE3, + 0x14,0x00,0x00,0x1A,0x00,0x00,0x51,0xE3,0x00,0x00,0x50,0x13,0x11,0x00,0x00,0x0A, + 0x82,0x80,0x85,0xE0,0xB2,0x82,0xD8,0xE1,0x00,0x71,0x96,0xE7,0x91,0x78,0x27,0xE0, + 0x00,0x71,0x86,0xE7,0xB4,0x85,0xDA,0xE1,0x00,0x71,0x9E,0xE7,0x91,0x78,0x27,0xE0, + 0x00,0x71,0x8E,0xE7,0x00,0x81,0x9D,0xE7,0x08,0x10,0x81,0xE0,0x00,0x11,0x8D,0xE7, + 0x80,0x10,0x85,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x76,0xD1,0xE1,0x01,0x70,0x87,0xE2, + 0xBE,0x76,0xC1,0xE1,0x01,0x00,0xCC,0xE5,0x01,0x20,0x82,0xE2,0x0E,0x00,0x52,0xE3, + 0xD6,0xFF,0xFF,0xBA,0x01,0x30,0x83,0xE2,0x15,0x00,0x53,0xE3,0xD0,0xFF,0xFF,0xBA, + 0x01,0x00,0x54,0xE3,0x01,0x70,0xA0,0xE3,0x13,0x00,0x00,0xBA,0x0D,0x90,0xA0,0xE1, + 0x0E,0xA0,0xA0,0xE1,0x07,0x81,0x99,0xE7,0x07,0x01,0x96,0xE7,0x00,0x00,0x58,0xE3, + 0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0xCA,0xEE,0xFF,0xEB,0x87,0x10,0x85,0xE0, + 0x01,0xBC,0x81,0xE2,0x00,0x00,0x58,0xE3,0xB6,0x04,0xCB,0xE1,0x07,0x01,0x9A,0xE7, + 0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0xC2,0xEE,0xFF,0xEB,0x01,0x70,0x87,0xE2, + 0x04,0x00,0x57,0xE1,0xB6,0x05,0xCB,0xE1,0xED,0xFF,0xFF,0xDA,0x84,0x30,0x9F,0xE5, + 0x04,0x00,0xD3,0xE5,0x01,0x00,0x50,0xE3,0x85,0xDF,0x8D,0xB2,0xF0,0x4F,0xBD,0xB8, + 0x1E,0xFF,0x2F,0xB1,0x8C,0xC0,0x8D,0xE2,0x00,0x11,0x83,0xE0,0x01,0x2C,0x81,0xE2, + 0xF6,0x11,0xD2,0xE1,0xF4,0x21,0xD2,0xE1,0x81,0x11,0x61,0xE0,0x81,0x10,0x82,0xE0, + 0x01,0x10,0xDC,0xE7,0x00,0x20,0x83,0xE0,0x01,0x00,0x40,0xE2,0x65,0x11,0xC2,0xE5, + 0x81,0x10,0x83,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x16,0xD1,0xE1,0xFF,0x10,0x01,0xE2, + 0x38,0x11,0xC2,0xE5,0xBC,0x21,0xD3,0xE1,0x02,0x00,0x51,0xE1,0xBC,0x11,0xC3,0x81, + 0x01,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xAA,0x85,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0xF8,0x8F,0x00,0x00,0xF0,0x06,0x00,0x20,0xA3,0x05,0x00,0x20, + 0xA6,0x01,0x00,0x20,0xAE,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x1F,0x85,0xEB,0x51, + 0x40,0x01,0x00,0x20,0x00,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x00,0x00,0xA0,0xE3,0x5B,0xDF,0x4D,0xE2,0x00,0x10,0xA0,0xE1,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x2E,0x20,0xA0,0xE3, + 0x34,0x00,0x8D,0xE2,0xA7,0xEE,0xFF,0xEB,0x9C,0x9F,0x9F,0xE5,0x0F,0x0A,0xE0,0xE3, + 0x00,0x80,0xA0,0xE3,0xB8,0x00,0xC9,0xE1,0xBC,0x80,0xC9,0xE1,0xBA,0x8E,0xC9,0xE1, + 0x81,0x11,0xD9,0xE5,0x84,0x7F,0x9F,0xE5,0x05,0x0C,0x89,0xE2,0x02,0x00,0x51,0xE3, + 0x00,0x10,0x97,0x85,0xB2,0x12,0xD1,0x81,0x0B,0x00,0x00,0x8A,0x00,0x10,0x97,0x05, + 0xB6,0x24,0xD0,0x01,0xB0,0x12,0xD1,0x01,0x06,0x00,0x00,0x0A,0x60,0x1F,0x9F,0xE5, + 0x00,0x10,0xD1,0xE5,0x00,0x00,0x51,0xE3,0x38,0x00,0x00,0x0A,0x54,0x1F,0x9F,0xE5, + 0xB4,0x24,0xD0,0xE1,0xBC,0x1A,0xD1,0xE1,0x02,0x10,0x81,0xE0,0x10,0x10,0x8D,0xE5, + 0x44,0x1F,0x9F,0xE5,0x68,0x11,0x8D,0xE5,0xB4,0x24,0xD1,0xE1,0x10,0x10,0x9D,0xE5, + 0xB8,0x04,0xD0,0xE1,0x02,0x10,0x81,0xE0,0x00,0x20,0x97,0xE5,0xA6,0xC4,0xD9,0xE5, + 0xBA,0x34,0xD2,0xE1,0xFE,0x60,0xD9,0xE1,0x03,0x00,0x80,0xE0,0x01,0x00,0x50,0xE1, + 0x01,0x30,0xA0,0xE1,0x01,0x00,0x1C,0xE3,0x00,0x10,0xA0,0x31,0x03,0x00,0x00,0x0A, + 0x02,0x00,0x1C,0xE3,0x02,0xC0,0xA0,0x03,0x01,0xC0,0xA0,0x13,0x08,0xC0,0x8D,0xE5, + 0xF8,0x4E,0x9F,0xE5,0xF8,0xAE,0x9F,0xE5,0x64,0x41,0x8D,0xE5,0xB4,0x89,0xC4,0xE1, + 0xBA,0x40,0xD9,0xE1,0x4E,0xC0,0xD2,0xE5,0x01,0x18,0xA0,0xE1,0x00,0x08,0xA0,0xE1, + 0x94,0x0C,0x0C,0xE0,0x9A,0x4C,0x8C,0xE0,0x64,0x41,0x9D,0xE5,0x8C,0xC5,0xA0,0xE1, + 0x4C,0xC8,0xA0,0xE1,0xB6,0xC9,0xC4,0xE1,0xBC,0x44,0xD2,0xE1,0x41,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x04,0x00,0x5C,0xE1,0xBC,0x24,0xD2,0xB1,0x64,0xC1,0x9D,0xB5, + 0x00,0x50,0xA0,0xE3,0xB6,0x29,0xCC,0xB1,0xA8,0x2E,0x9F,0xE5,0xA8,0xCE,0x9F,0xE5, + 0x00,0x80,0x82,0xE5,0x57,0x2F,0x8D,0xE2,0x00,0x80,0x8C,0xE5,0x03,0x00,0x82,0xE8, + 0x03,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x58,0x01,0x8D,0xE5,0x04,0x00,0x00,0xEA, + 0x00,0x10,0x97,0xE5,0xBE,0x21,0xD1,0xE1,0xB4,0x14,0xD0,0xE1,0x02,0x10,0x81,0xE0, + 0xC5,0xFF,0xFF,0xEA,0x85,0x01,0x65,0xE0,0x54,0x01,0x8D,0xE5,0x48,0x0E,0x9F,0xE5, + 0x00,0x40,0xA0,0xE3,0x85,0x00,0x80,0xE0,0x50,0x01,0x8D,0xE5,0x54,0x01,0x9D,0xE5, + 0x58,0x2E,0x9F,0xE5,0x80,0x00,0x84,0xE0,0x00,0x38,0xA0,0xE1,0x64,0x11,0x9D,0xE5, + 0x43,0x38,0xA0,0xE1,0x83,0x00,0x82,0xE0,0xF0,0x00,0xD0,0xE1,0xF6,0x19,0xD1,0xE1, + 0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA,0x64,0x11,0x9D,0xE5,0x64,0xC1,0x9D,0xE5, + 0xB4,0x19,0xD1,0xE1,0x01,0x10,0x81,0xE2,0xB4,0x19,0xCC,0xE1,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x00,0xDA,0x18,0x1E,0x9F,0xE5,0xB0,0x00,0xD1,0xE1,0x01,0x00,0x80,0xE2, + 0xB0,0x00,0xC1,0xE1,0x0C,0xBE,0x9F,0xE5,0x83,0x00,0x8B,0xE0,0xF0,0xA0,0xD0,0xE1, + 0x60,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0xAB,0x03,0x00,0xBA,0x00,0x00,0x55,0xE3, + 0x00,0x00,0xA0,0xE3,0x15,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x0E,0x00,0x43,0xE2, + 0xC0,0x11,0xD2,0xE7,0x07,0x00,0x00,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x00,0x01,0xE0, + 0x00,0x00,0x54,0xE3,0x05,0x00,0x00,0xDA,0x0F,0x10,0x43,0xE2,0xC1,0x71,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x1C,0x11,0x07,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2, + 0x0D,0x00,0x54,0xE3,0x07,0x00,0x00,0xAA,0x0D,0x10,0x43,0xE2,0xC1,0x21,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x1C,0x11,0x02,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2, + 0x00,0x00,0x54,0xE3,0x07,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x01,0x10,0x43,0xE2, + 0xC1,0x21,0xD2,0xE7,0x07,0x10,0x01,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x11,0x02,0xE0, + 0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0x86,0x03,0x00,0x1A, + 0x00,0xC0,0xA0,0xE3,0x0C,0x70,0xA0,0xE1,0x0E,0x90,0xA0,0xE3,0x00,0x00,0xA0,0xE3, + 0x07,0x80,0x85,0xE0,0x00,0x10,0x84,0xE0,0x01,0x20,0x58,0xE2,0x01,0x10,0x41,0xE2, + 0x0B,0x00,0x00,0x4A,0x15,0x00,0x52,0xE3,0x09,0x00,0x00,0xCA,0x00,0x00,0x51,0xE3, + 0x07,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3,0x0E,0x90,0xA0,0xE3,0x04,0x00,0x00,0xCA, + 0x92,0x19,0x21,0xE0,0x81,0x10,0x8B,0xE0,0xF0,0x10,0xD1,0xE1,0x0C,0x00,0x51,0xE1, + 0x01,0xC0,0xA0,0xC1,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x03,0x00,0x50,0xE3,0xEA,0xFF,0xFF,0xBA,0x01,0x00,0x87,0xE2,0x00,0x78,0xA0,0xE1, + 0x47,0x78,0xA0,0xE1,0x03,0x00,0x57,0xE3,0xE3,0xFF,0xFF,0xBA,0x0C,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x00,0x5A,0xE1,0x63,0x03,0x00,0x1A,0xA8,0x1C,0x9F,0xE5, + 0xBC,0x10,0xD1,0xE1,0x00,0x00,0x51,0xE1,0x05,0x00,0x00,0xCA,0x98,0x1C,0x9F,0xE5, + 0xBC,0x00,0xC1,0xE1,0x04,0x00,0xD1,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0x18,0x00,0x8D,0xE5,0x34,0x10,0x8D,0xE2,0xC3,0x21,0xD1,0xE7,0x07,0xC0,0x03,0xE2, + 0x01,0x00,0xA0,0xE3,0x10,0x0C,0x82,0xE1,0xC3,0x01,0xC1,0xE7,0x08,0x00,0x9D,0xE5, + 0x00,0x70,0xA0,0xE3,0x01,0x00,0x10,0xE3,0x05,0x00,0x00,0x0A,0x0D,0x00,0x54,0xE3, + 0x0D,0x70,0xA0,0x03,0x07,0x00,0x00,0x0A,0x0C,0x00,0x54,0xE3,0x03,0x77,0x87,0x03, + 0x04,0x00,0x00,0xEA,0x14,0x00,0x55,0xE3,0x14,0x70,0xA0,0x03,0x01,0x00,0x00,0x0A, + 0x13,0x00,0x55,0xE3,0x13,0x78,0x87,0x03,0x07,0x08,0xB0,0xE1,0x03,0x00,0x00,0x0A, + 0x5C,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x3F,0x03,0x00,0xBA,0x02,0x00,0x00,0xEA, + 0x58,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x3B,0x03,0x00,0xBA,0x0C,0x0C,0x9F,0xE5, + 0x00,0x30,0xA0,0xE3,0x00,0x90,0x90,0xE5,0x03,0x10,0x85,0xE0,0x02,0xB0,0x41,0xE2, + 0x03,0x11,0x83,0xE0,0x0B,0xCC,0xA0,0xE1,0xEC,0x20,0x8D,0xE2,0x4C,0xCC,0xA0,0xE1, + 0x88,0x80,0x8D,0xE2,0x00,0x00,0xA0,0xE3,0x01,0x21,0x82,0xE0,0x8C,0xC1,0x6C,0xE0, + 0x01,0x81,0x88,0xE0,0x00,0x10,0x84,0xE0,0x0B,0xAC,0xA0,0xE1,0x02,0x10,0x41,0xE2, + 0x4A,0xAC,0xA0,0xE1,0x01,0x1C,0xA0,0xE1,0x15,0x00,0x5A,0xE3,0x41,0x1C,0xA0,0xE1, + 0x03,0x00,0x00,0x2A,0x00,0x00,0x51,0xE3,0x01,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3, + 0x02,0x00,0x00,0xBA,0x00,0x10,0xA0,0xE3,0x00,0x11,0x82,0xE7,0x23,0x00,0x00,0xEA, + 0xB0,0xA0,0xD9,0xE1,0x01,0x09,0x1A,0xE3,0x8C,0xA0,0x81,0xE0,0x05,0x00,0x00,0x0A, + 0xB0,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0,0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0, + 0x00,0xA1,0x82,0xE7,0x04,0x00,0x00,0xEA,0x90,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0, + 0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0,0x00,0xA1,0x82,0xE7,0x00,0x00,0x5A,0xE3, + 0x00,0xA0,0xA0,0xB3,0x00,0xA1,0x82,0xB7,0xB0,0xA0,0xD9,0xE1,0x8C,0x10,0x81,0xE0, + 0x02,0x09,0x1A,0xE3,0x05,0x00,0x00,0x0A,0x68,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0, + 0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0,0x00,0x11,0x88,0xE7,0x04,0x00,0x00,0xEA, + 0x48,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0,0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0, + 0x00,0x11,0x88,0xE7,0x00,0x00,0x51,0xE3,0x00,0x10,0xA0,0xB3,0x00,0x11,0x88,0xB7, + 0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x05,0x00,0x50,0xE3, + 0xC7,0xFF,0xFF,0xBA,0x01,0x00,0x83,0xE2,0x00,0x38,0xA0,0xE1,0x43,0x38,0xA0,0xE1, + 0x05,0x00,0x53,0xE3,0xB7,0xFF,0xFF,0xBA,0x0C,0x0B,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0xBE,0x00,0x00,0x1A,0x00,0x0B,0x9F,0xE5,0x00,0x20,0xD0,0xE5, + 0x00,0x00,0x52,0xE3,0x16,0x00,0x00,0x0A,0x01,0x00,0x44,0xE2,0x02,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x8A,0x04,0x00,0x55,0xE3,0x05,0x00,0x55,0x13,0xE0,0x1A,0x9F,0x05, + 0x01,0x00,0xA0,0x03,0x00,0x00,0xC1,0x05,0x09,0x00,0x44,0xE2,0x02,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x8A,0x04,0x00,0x55,0xE3,0x05,0x00,0x55,0x13,0xC4,0x0A,0x9F,0x05, + 0x01,0x10,0xA0,0x03,0x00,0x10,0xC0,0x05,0xB4,0x0A,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0xAC,0x0A,0x9F,0x05,0x00,0x00,0xD0,0x05,0x00,0x00,0x50,0x03, + 0xD1,0x02,0x00,0x0A,0x11,0x00,0x55,0xE3,0x12,0x00,0x55,0x13,0x2F,0x00,0x00,0x1A, + 0x00,0x00,0x54,0xE3,0x01,0x00,0x54,0x13,0x2C,0x00,0x00,0x1A,0x88,0x0A,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0xC8,0x00,0x50,0xE3,0x80,0x0A,0x9F,0x35,0x00,0x00,0x90,0x35, + 0xC8,0x00,0x50,0x33,0x78,0x0A,0x9F,0x35,0x00,0x00,0x90,0x35,0xC8,0x00,0x50,0x33, + 0x22,0x00,0x00,0x2A,0x6C,0x0A,0x9F,0xE5,0x1C,0x31,0x9D,0xE5,0x00,0x10,0x90,0xE5, + 0x01,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3,0x03,0x00,0x41,0xD0,0xC8,0x00,0x50,0xE3, + 0x1A,0x00,0x00,0xAA,0x50,0x1A,0x9F,0xE5,0x00,0x10,0x91,0xE5,0x01,0x00,0x43,0xE0, + 0x00,0x00,0x50,0xE3,0x03,0x00,0x41,0xD0,0xC8,0x00,0x50,0xE3,0x13,0x00,0x00,0xAA, + 0x38,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xC0,0x1F,0xA0,0xE1,0x21,0x1F,0x80,0xE0, + 0x41,0x01,0x43,0xE0,0x00,0x00,0x50,0xE3,0x41,0x01,0x63,0xD0,0xC8,0x00,0x50,0xE3, + 0x0A,0x00,0x00,0xAA,0x64,0x00,0x53,0xE3,0x03,0x00,0xA0,0xE1,0x07,0x00,0x00,0xDA, + 0xFA,0x00,0x50,0xE3,0x05,0x00,0x00,0xAA,0x04,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0x32,0x00,0x50,0xE3,0xBC,0x19,0x9F,0x35,0x01,0x00,0xA0,0x33,0x00,0x00,0x81,0x35, + 0xF0,0x09,0x9F,0xE5,0xEE,0x1F,0xA0,0xE3,0x00,0x00,0x90,0xE5,0x02,0x1B,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0x0A,0x00,0x00,0x9A,0x11,0x00,0x55,0xE3,0x12,0x00,0x55,0x13, + 0x13,0x00,0x55,0x13,0x06,0x00,0x00,0x1A,0x0C,0x00,0x54,0xE3,0x04,0x00,0x00,0x1A, + 0x1C,0x01,0x9D,0xE5,0x4B,0x0F,0x50,0xE3,0x7C,0x19,0x9F,0xB5,0x01,0x00,0xA0,0xB3, + 0x00,0x00,0x81,0xB5,0x13,0x00,0x55,0xE3,0x14,0x00,0x55,0x13,0x2F,0x00,0x00,0x1A, + 0x0B,0x00,0x54,0xE3,0x0C,0x00,0x54,0x13,0x2C,0x00,0x00,0x1A,0x98,0x09,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0x96,0x00,0x50,0xE3,0x90,0x09,0x9F,0x35,0x00,0x00,0x90,0x35, + 0x96,0x00,0x50,0x33,0x68,0x09,0x9F,0x35,0x00,0x00,0x90,0x35,0xC8,0x00,0x50,0x33, + 0x22,0x00,0x00,0x2A,0x78,0x09,0x9F,0xE5,0x1C,0x31,0x9D,0xE5,0x00,0x10,0x90,0xE5, + 0x01,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3,0x03,0x00,0x41,0xD0,0x96,0x00,0x50,0xE3, + 0x1A,0x00,0x00,0xAA,0x5C,0x09,0x9F,0xE5,0x00,0x10,0x90,0xE5,0x01,0x00,0x43,0xE0, + 0x00,0x00,0x50,0xE3,0x03,0x00,0x41,0xD0,0x96,0x00,0x50,0xE3,0x13,0x00,0x00,0xAA, + 0x44,0x09,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xC0,0x1F,0xA0,0xE1,0x21,0x1F,0x80,0xE0, + 0x41,0x01,0x43,0xE0,0x00,0x00,0x50,0xE3,0x41,0x01,0x63,0xD0,0x96,0x00,0x50,0xE3, + 0x0A,0x00,0x00,0xAA,0x64,0x00,0x53,0xE3,0x03,0x00,0xA0,0xE1,0x07,0x00,0x00,0xDA, + 0xC8,0x00,0x50,0xE3,0x05,0x00,0x00,0xAA,0x10,0x09,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0x32,0x00,0x50,0xE3,0xB0,0x18,0x9F,0x35,0x01,0x00,0xA0,0x33,0x00,0x00,0x81,0x35, + 0x11,0x00,0x55,0xE3,0x0E,0x00,0x00,0xBA,0x00,0x00,0x54,0xE3,0x0C,0x00,0x54,0x13, + 0x0B,0x00,0x00,0x1A,0xE8,0x08,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x4B,0x0F,0x50,0xE3, + 0x07,0x00,0x00,0x3A,0x1C,0x01,0x9D,0xE5,0x4B,0x0F,0x50,0xE3,0x04,0x00,0x00,0xAA, + 0x70,0x18,0x9F,0xE5,0x01,0x00,0xA0,0xE3,0x00,0x00,0x81,0xE5,0x68,0x18,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x00,0x00,0x52,0xE3,0x09,0x00,0x00,0x1A,0x54,0x08,0x9F,0xE5, + 0x54,0x18,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x00,0x10,0x91,0xE5,0x01,0x00,0x80,0xE1, + 0x00,0x00,0x50,0xE3,0x9C,0x08,0x9F,0x15,0xB0,0x00,0xD0,0x11,0xAF,0x0F,0x50,0x13, + 0x3D,0x02,0x00,0x3A,0x12,0x00,0x55,0xE3,0x05,0x00,0x00,0x1A,0x00,0x00,0x54,0xE3, + 0x01,0x00,0x54,0x13,0x0A,0x00,0x00,0x1A,0x7C,0x18,0x9F,0xE5,0x01,0x00,0xA0,0xE3, + 0x06,0x00,0x00,0xEA,0x13,0x00,0x55,0xE3,0x05,0x00,0x00,0x1A,0x0B,0x00,0x54,0xE3, + 0x0C,0x00,0x54,0x13,0x02,0x00,0x00,0x1A,0x60,0x18,0x9F,0xE5,0x01,0x00,0xA0,0xE3, + 0x00,0x00,0x81,0xE5,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x64,0x00,0x8D,0xE2, + 0xB0,0xEC,0xFF,0xEB,0xA0,0x00,0x9D,0xE5,0xC0,0x17,0x9F,0xE5,0x64,0x00,0x8D,0xE5, + 0xA4,0x00,0x9D,0xE5,0xC8,0x37,0x9F,0xE5,0x68,0x00,0x8D,0xE5,0xA8,0x00,0x9D,0xE5, + 0x00,0x00,0x54,0xE3,0x6C,0x00,0x8D,0xE5,0xB4,0x00,0x9D,0xE5,0x70,0x00,0x8D,0xE5, + 0xBC,0x00,0x9D,0xE5,0x78,0x00,0x8D,0xE5,0xC8,0x00,0x9D,0xE5,0x7C,0x00,0x8D,0xE5, + 0xCC,0x00,0x9D,0xE5,0x80,0x00,0x8D,0xE5,0xD0,0x00,0x9D,0xE5,0x84,0x00,0x8D,0xE5, + 0x00,0x10,0x91,0xE5,0xB8,0x00,0x9D,0xE5,0xBC,0x11,0xD1,0xE1,0x91,0x00,0x00,0xE0, + 0x93,0x10,0xC0,0xE0,0xC0,0x12,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x74,0x00,0x8D,0xE5, + 0x0D,0x00,0x00,0x1A,0x42,0x1F,0x8D,0xE2,0x03,0x00,0x91,0xE8,0x1C,0x21,0x9D,0xE5, + 0x02,0x10,0x81,0xE0,0x80,0x00,0x81,0xE0,0x20,0x11,0x9D,0xE5,0x02,0x00,0x80,0xE0, + 0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0, + 0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x1D,0x00,0x00,0xEA,0x41,0x1F,0x8D,0xE2, + 0x03,0x00,0x91,0xE8,0x0C,0x00,0x54,0xE3,0x01,0x00,0x80,0xE0,0x0A,0x00,0x00,0x1A, + 0x18,0x21,0x9D,0xE5,0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0,0x1C,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x0C,0x00,0x00,0xEA,0x0C,0x11,0x9D,0xE5, + 0x18,0x21,0x9D,0xE5,0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0,0x1C,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x20,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x2C,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x34,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x28,0x17,0x9F,0xE5,0x91,0x20,0xC0,0xE0,0xC0,0x10,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0xC4,0x16,0x9F,0xE5,0x00,0x10,0xD1,0xE5,0x00,0x00,0x51,0xE3, + 0x89,0x00,0x00,0x1A,0x80,0x16,0x9F,0xE5,0xB6,0x10,0xD1,0xE1,0x40,0x00,0x11,0xE3, + 0x45,0x00,0x00,0x0A,0xEE,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0xF0,0x26,0x9F,0xA5,0x06,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x20,0x00,0x00,0xAA, + 0x71,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0xD4,0x26,0x9F,0xA5, + 0x05,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x1E,0x00,0x00,0xAA,0x7D,0x0E,0x50,0xE3, + 0xC0,0x16,0x9F,0xA5,0x04,0x00,0xA0,0xA3,0x00,0x00,0xC1,0xA5,0x72,0x00,0x00,0xAA, + 0x77,0x1F,0xA0,0xE3,0x01,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0xA4,0x26,0x9F,0xA5, + 0x03,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x1E,0x00,0x00,0xAA,0xFA,0x0F,0x50,0xE3, + 0x90,0x26,0x9F,0xA5,0x02,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x1E,0x00,0x00,0xAA, + 0x7D,0x0F,0x50,0xE3,0x7C,0x26,0x9F,0xA5,0x01,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5, + 0x1E,0x00,0x00,0xAA,0x6C,0x16,0x9F,0xE5,0x00,0x10,0xD1,0xE5,0x06,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x1A,0xFA,0x0F,0x50,0xE3,0xAB,0x01,0x00,0xBA,0x5A,0x00,0x00,0xEA, + 0x05,0x00,0x51,0xE3,0x04,0x00,0x00,0x1A,0xEE,0x10,0xA0,0xE3,0x02,0x1C,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0xA4,0x01,0x00,0xBA,0x53,0x00,0x00,0xEA,0x04,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x1A,0x7D,0x0F,0x50,0xE3,0x9F,0x01,0x00,0xBA,0x4E,0x00,0x00,0xEA, + 0x03,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3,0x9A,0x01,0x00,0xBA, + 0x49,0x00,0x00,0xEA,0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x96,0x00,0x50,0xE3, + 0x95,0x01,0x00,0xBA,0x44,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3,0x42,0x00,0x00,0x1A, + 0x4B,0x00,0x50,0xE3,0x90,0x01,0x00,0xBA,0x3F,0x00,0x00,0xEA,0x71,0x1F,0xA0,0xE3, + 0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0xD8,0x25,0x9F,0xA5,0x06,0x10,0xA0,0xA3, + 0x00,0x10,0xC2,0xA5,0x1B,0x00,0x00,0xAA,0xD6,0x10,0xA0,0xE3,0x06,0x1C,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0xBC,0x25,0x9F,0xA5,0x05,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5, + 0x19,0x00,0x00,0xAA,0x6B,0x10,0xA0,0xE3,0x03,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0xA0,0x25,0x9F,0xA5,0x04,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x19,0x00,0x00,0xAA, + 0x7D,0x0F,0x50,0xE3,0x8C,0x05,0x9F,0xA5,0x03,0x10,0xA0,0xA3,0x00,0x10,0xC0,0xA5, + 0x25,0x00,0x00,0xAA,0x4B,0x0F,0x50,0xE3,0x78,0x25,0x9F,0xA5,0x02,0x10,0xA0,0xA3, + 0x00,0x10,0xC2,0xA5,0x19,0x00,0x00,0xAA,0x68,0x15,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x7D,0x0F,0x50,0xE3,0x6A,0x01,0x00,0xBA, + 0x19,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3,0x04,0x00,0x00,0x1A,0x5E,0x10,0xA0,0xE3, + 0x01,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0x63,0x01,0x00,0xBA,0x12,0x00,0x00,0xEA, + 0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3,0x5E,0x01,0x00,0xBA, + 0x0D,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x96,0x00,0x50,0xE3, + 0x59,0x01,0x00,0xBA,0x08,0x00,0x00,0xEA,0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x64,0x00,0x50,0xE3,0x54,0x01,0x00,0xBA,0x03,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3, + 0x01,0x00,0x00,0x1A,0x32,0x00,0x50,0xE3,0x4F,0x01,0x00,0xBA,0x14,0x00,0x55,0xE3, + 0x10,0x00,0x00,0x1A,0x01,0xCA,0xA0,0xE3,0x04,0x00,0xA0,0xE3,0x01,0xC0,0x4C,0xE2, + 0xEC,0x80,0x8D,0xE2,0x00,0x11,0x88,0xE0,0x28,0x20,0x91,0xE5,0x01,0x00,0x40,0xE2, + 0x02,0x24,0x62,0xE0,0x93,0x92,0xC2,0xE0,0xC2,0x92,0xA0,0xE1,0xC2,0x2F,0x49,0xE0, + 0x0C,0x00,0x52,0xE1,0x28,0x20,0x81,0xE5,0x00,0x08,0xA0,0xE1,0x28,0xC0,0x81,0xA5, + 0x40,0x08,0xB0,0xE1,0xF2,0xFF,0xFF,0x5A,0x00,0x00,0x57,0xE3,0x1F,0x00,0x00,0x0A, + 0x08,0x00,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x04,0x00,0xA0,0xE3,0x0D,0x00,0x00,0x0A, + 0xEC,0x30,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x07,0x18,0xB0,0xE1,0x00,0x11,0x80,0xE0, + 0x01,0x21,0x83,0x17,0x01,0x11,0x83,0xE0,0x0C,0x20,0x81,0x05,0x01,0x00,0x40,0xE2, + 0x10,0x20,0x81,0x05,0x00,0x08,0xA0,0xE1,0x04,0x20,0x81,0x15,0x40,0x08,0xB0,0xE1, + 0xF4,0xFF,0xFF,0x5A,0x0D,0x00,0x00,0xEA,0xEC,0x30,0x8D,0xE2,0x00,0x20,0xA0,0xE3, + 0x07,0x18,0xB0,0xE1,0x00,0x11,0x83,0x10,0x00,0x21,0x83,0x17,0x14,0x20,0x81,0x15, + 0x02,0x00,0x00,0x1A,0x00,0x11,0x83,0xE0,0x3C,0x20,0x81,0xE5,0x50,0x20,0x81,0xE5, + 0x01,0x00,0x40,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xF3,0xFF,0xFF,0x5A, + 0xA8,0xA3,0x9F,0xE5,0x00,0xC0,0xA0,0xE3,0x0C,0x70,0xA0,0xE1,0x0E,0x90,0xA0,0xE3, + 0x00,0x00,0xA0,0xE3,0x07,0x80,0x85,0xE0,0x00,0x10,0x84,0xE0,0x01,0x20,0x58,0xE2, + 0x01,0x10,0x41,0xE2,0x0A,0x00,0x00,0x4A,0x15,0x00,0x52,0xE3,0x08,0x00,0x00,0xCA, + 0x00,0x00,0x51,0xE3,0x06,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3,0x04,0x00,0x00,0xCA, + 0x92,0x19,0x21,0xE0,0x81,0x10,0x8A,0xE0,0xF0,0x30,0xD1,0xE1,0x0C,0x00,0x53,0xE1, + 0x03,0xC0,0xA0,0xC1,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x03,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xBA,0x01,0x00,0x87,0xE2,0x00,0x78,0xA0,0xE1, + 0x47,0x78,0xA0,0xE1,0x03,0x00,0x57,0xE3,0xE4,0xFF,0xFF,0xBA,0x08,0x73,0x9F,0xE5, + 0x0C,0x08,0xA0,0xE1,0xB8,0x10,0xD7,0xE1,0x40,0x08,0xA0,0xE1,0x70,0x20,0x8D,0xE2, + 0x00,0x00,0x51,0xE1,0xB8,0x00,0xC7,0xC1,0xBA,0x10,0xD7,0xE1,0xEC,0x30,0x8D,0xE2, + 0x00,0x00,0x51,0xE1,0xBA,0x00,0xC7,0xB1,0x04,0x00,0xD7,0xE5,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0x04,0x00,0xC7,0xE5,0x00,0x01,0x87,0xE0,0x01,0x0C,0x80,0xE2, + 0xB4,0x41,0xC0,0xE1,0x04,0x00,0xD7,0xE5,0x00,0x01,0x87,0xE0,0x01,0x0C,0x80,0xE2, + 0xB6,0x51,0xC0,0xE1,0x06,0x00,0x92,0xE8,0x00,0x00,0xA0,0xE3,0x02,0x00,0x51,0xE1, + 0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x7C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x78,0x10,0x9D,0xE5,0xC0,0x00,0xA0,0xC3,0x02,0x00,0x51,0xE1,0x6C,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x68,0x10,0x9D,0xE5, + 0x30,0x00,0x80,0xC3,0x02,0x00,0x51,0xE1,0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x6C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x80,0x10,0x9D,0xE5,0x0C,0x00,0x80,0xC3, + 0x02,0x00,0x51,0xE1,0x7C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x03,0x00,0x80,0xC3,0x04,0x10,0xA0,0xE3,0x00,0x20,0xA0,0xE3, + 0xC0,0x00,0x10,0xE3,0x01,0xC1,0x81,0x00,0x0C,0x21,0x83,0x07,0x30,0x00,0x10,0xE3, + 0x01,0xC1,0x81,0x00,0x0C,0xC1,0x83,0x00,0x10,0x20,0x8C,0x05,0x0C,0x00,0x10,0xE3, + 0x01,0x21,0x83,0x07,0x03,0x00,0x10,0xE3,0x01,0xC1,0x83,0x00,0x01,0x10,0x41,0xE2, + 0x01,0x18,0xA0,0xE1,0x50,0x20,0x8C,0x05,0x41,0x18,0xB0,0xE1,0xEF,0xFF,0xFF,0x5A, + 0xFC,0x30,0x9D,0xE5,0x00,0x30,0x8D,0xE5,0xEC,0x30,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xC9,0x07,0x00,0xEB,0x10,0x31,0x9D,0xE5,0x00,0xA0,0xA0,0xE1,0x00,0x30,0x8D,0xE5, + 0x01,0x3C,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xC3,0x07,0x00,0xEB,0x24,0x31,0x9D,0xE5, + 0x00,0xB0,0xA0,0xE1,0x00,0x30,0x8D,0xE5,0x45,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xBD,0x07,0x00,0xEB,0x38,0x31,0x9D,0xE5,0x00,0x90,0xA0,0xE1,0x00,0x30,0x8D,0xE5, + 0x4A,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xB7,0x07,0x00,0xEB,0x4C,0x31,0x9D,0xE5, + 0x30,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0x4F,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xB1,0x07,0x00,0xEB,0x2C,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5,0x30,0x30,0x9D,0xE5, + 0x09,0x20,0xA0,0xE1,0x0B,0x10,0xA0,0xE1,0x0A,0x00,0xA0,0xE1,0xAA,0x07,0x00,0xEB, + 0x00,0x80,0xB0,0xE1,0x06,0x00,0x00,0x1A,0x64,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0xEC,0x00,0x8D,0xE2,0x13,0xEB,0xFF,0xEB,0x0A,0x90,0xA0,0xE3,0x09,0x80,0xA0,0xE1, + 0x1C,0x91,0x8D,0xE5,0x3C,0x31,0x9D,0xE5,0xEC,0x00,0x9D,0xE5,0x00,0x30,0x8D,0xE5, + 0x00,0x11,0x9D,0xE5,0x14,0x21,0x9D,0xE5,0x28,0x31,0x9D,0xE5,0x9A,0x07,0x00,0xEB, + 0x24,0x11,0x9F,0xE5,0x84,0x70,0x81,0xE0,0xBE,0x11,0xD7,0xE1,0x91,0x00,0x00,0xE0, + 0x28,0x00,0x8D,0xE5,0x40,0x31,0x9D,0xE5,0x00,0x30,0x8D,0xE5,0xF0,0x00,0x9D,0xE5, + 0x04,0x11,0x9D,0xE5,0x18,0x21,0x9D,0xE5,0x2C,0x31,0x9D,0xE5,0x8E,0x07,0x00,0xEB, + 0xB0,0x12,0xD7,0xE1,0x44,0x31,0x9D,0xE5,0x1C,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x24,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0xF4,0x00,0x9D,0xE5,0x08,0x11,0x9D,0xE5, + 0x30,0x31,0x9D,0xE5,0x84,0x07,0x00,0xEB,0xB2,0x12,0xD7,0xE1,0x48,0x31,0x9D,0xE5, + 0x20,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x20,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0xF8,0x00,0x9D,0xE5,0x0C,0x11,0x9D,0xE5,0x34,0x31,0x9D,0xE5,0x7A,0x07,0x00,0xEB, + 0xB4,0x12,0xD7,0xE1,0x4C,0x31,0x9D,0xE5,0x24,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x1C,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0xFC,0x00,0x9D,0xE5,0x10,0x11,0x9D,0xE5, + 0x38,0x31,0x9D,0xE5,0x70,0x07,0x00,0xEB,0xB6,0x12,0xD7,0xE1,0x20,0x20,0x9D,0xE5, + 0x90,0x01,0x03,0xE0,0x00,0x30,0x8D,0xE5,0x28,0x00,0x9D,0xE5,0x24,0x10,0x9D,0xE5, + 0x1C,0x30,0x9D,0xE5,0x68,0x07,0x00,0xEB,0x08,0x10,0xA0,0xE1,0x21,0xEA,0xFF,0xEB, + 0x54,0x10,0x9F,0xE5,0x50,0x70,0x9F,0xE5,0xB0,0x12,0xD1,0xE1,0x00,0x10,0x61,0xE2, + 0x81,0x00,0x90,0xE0,0x04,0x10,0xD7,0xE5,0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0, + 0xB4,0x0F,0xC1,0xE1,0x50,0x01,0x9D,0xE5,0x50,0x11,0x9D,0xE5,0x50,0x21,0x9D,0xE5, + 0x50,0x31,0x9D,0xE5,0xB2,0x05,0xD0,0xE1,0xB4,0x15,0xD1,0xE1,0xB6,0x25,0xD2,0xE1, + 0xB8,0x35,0xD3,0xE1,0x30,0xC0,0x9D,0xE5,0x9A,0x00,0x00,0xE0,0x9B,0x01,0x01,0xE0, + 0x99,0x02,0x02,0xE0,0x93,0x0C,0x0C,0xE0,0x23,0x00,0x00,0xEA,0x40,0x00,0x00,0x20, + 0xF0,0x06,0x00,0x20,0xA1,0x05,0x00,0x20,0x00,0x95,0x00,0x00,0x40,0x01,0x00,0x20, + 0x40,0x04,0x00,0x20,0x1F,0x85,0xEB,0x51,0xE8,0x05,0x00,0x20,0xEC,0x05,0x00,0x20, + 0x00,0x00,0x00,0x10,0x18,0x06,0x00,0x20,0x08,0x07,0x00,0x20,0xA2,0x05,0x00,0x20, + 0xA3,0x05,0x00,0x20,0x93,0x05,0x00,0x20,0x94,0x05,0x00,0x20,0x28,0x06,0x00,0x20, + 0x2C,0x06,0x00,0x20,0xD8,0x05,0x00,0x20,0x20,0x06,0x00,0x20,0x24,0x06,0x00,0x20, + 0x40,0x06,0x00,0x20,0x48,0x06,0x00,0x20,0x1C,0x06,0x00,0x20,0x30,0x06,0x00,0x20, + 0x34,0x06,0x00,0x20,0x38,0x06,0x00,0x20,0x3C,0x06,0x00,0x20,0x44,0x06,0x00,0x20, + 0x4C,0x06,0x00,0x20,0x60,0x06,0x00,0x20,0xAC,0x05,0x00,0x20,0xF8,0x05,0x00,0x20, + 0xFC,0x05,0x00,0x20,0x39,0x8E,0xE3,0x38,0x8F,0x05,0x00,0x20,0x50,0x31,0x9D,0xE5, + 0x2C,0x90,0x9D,0xE5,0xBA,0x35,0xD3,0xE1,0x99,0x03,0x03,0xE0,0x00,0x30,0x8D,0xE5, + 0x0C,0x30,0xA0,0xE1,0x24,0x07,0x00,0xEB,0x08,0x10,0xA0,0xE1,0xDD,0xE9,0xFF,0xEB, + 0xB4,0x15,0xD7,0xE1,0x00,0x10,0x61,0xE2,0x81,0x00,0x90,0xE0,0x04,0x10,0xD7,0xE5, + 0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0,0x01,0x1C,0x81,0xE2,0xB6,0x00,0xC1,0xE1, + 0x04,0x00,0xD7,0xE5,0x08,0x00,0x50,0xE3,0x0C,0x00,0x00,0x2A,0x01,0x00,0x84,0xE2, + 0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1,0x0E,0x00,0x54,0xE3,0x32,0xFC,0xFF,0xBA, + 0x14,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x01,0x00,0x85,0xE2, + 0x00,0x58,0xA0,0xE1,0x45,0x58,0xA0,0xE1,0x15,0x00,0x55,0xE3,0x24,0xFC,0xFF,0xBA, + 0x18,0x01,0x1F,0xE5,0x00,0x40,0x90,0xE5,0xB0,0x00,0xD4,0xE1,0x80,0x00,0x10,0xE3, + 0x3F,0x00,0x00,0x0A,0x30,0x51,0x1F,0xE5,0x04,0x00,0xD5,0xE5,0x00,0x00,0x50,0xE3, + 0x08,0x00,0x00,0x1A,0x68,0x01,0x9D,0xE5,0xB4,0x04,0xD0,0xE1,0x00,0x00,0x50,0xE3, + 0x41,0x01,0xD5,0x15,0x3C,0x10,0xD4,0x15,0x01,0x00,0x50,0x11,0x2F,0x00,0x00,0x2A, + 0x01,0x00,0x80,0xE2,0x2B,0x00,0x00,0xEA,0x42,0x01,0xD5,0xE5,0x34,0x10,0xD4,0xE5, + 0x01,0x00,0x50,0xE1,0x26,0x00,0x00,0x8A,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0x42,0x01,0xC5,0xE5,0x35,0x10,0xD4,0xE5,0x00,0x00,0x51,0xE1,0x03,0x00,0x00,0x2A, + 0xBC,0x30,0xD5,0xE1,0x0C,0x20,0x9D,0xE5,0x03,0x20,0x82,0xE0,0x0C,0x20,0x8D,0xE5, + 0x34,0x20,0xD4,0xE5,0x02,0x00,0x50,0xE1,0x19,0x00,0x00,0x1A,0x01,0x00,0x50,0xE1, + 0x17,0x00,0x00,0x0A,0x01,0x10,0x40,0xE0,0x0C,0x00,0x9D,0xE5,0x35,0xEA,0xFF,0xEB, + 0x68,0x11,0x9D,0xE5,0x00,0x20,0xA0,0xE3,0xB4,0x24,0xC1,0xE1,0xB8,0x13,0xD4,0xE1, + 0x00,0x00,0x51,0xE1,0x0E,0x00,0x00,0x2A,0x10,0x10,0x9D,0xE5,0x01,0x00,0x40,0xE0, + 0x36,0x10,0xD4,0xE5,0x90,0x01,0x01,0xE0,0xCC,0x01,0x1F,0xE5,0x90,0x21,0x81,0xE0, + 0xA1,0x02,0xA0,0xE1,0x68,0x11,0x9D,0xE5,0xB4,0x04,0xC1,0xE1,0x68,0x01,0x9D,0xE5, + 0xB4,0x14,0xD0,0xE1,0xBA,0x03,0xD4,0xE1,0x00,0x00,0x51,0xE1,0x68,0x11,0x9D,0x85, + 0xB4,0x04,0xC1,0x81,0x00,0x00,0xA0,0xE3,0x41,0x01,0xC5,0xE5,0x04,0x00,0x00,0xEA, + 0x00,0x00,0xA0,0xE3,0x42,0x01,0xC5,0xE5,0x41,0x01,0xC5,0xE5,0x68,0x11,0x9D,0xE5, + 0xB4,0x04,0xC1,0xE1,0x30,0x52,0x1F,0xE5,0x00,0xC0,0xA0,0xE3,0x04,0xA0,0xD5,0xE5, + 0x0C,0x80,0xA0,0xE1,0x01,0x20,0xA0,0xE3,0x01,0x00,0x5A,0xE3,0x37,0x00,0x00,0xBA, + 0xA7,0x94,0xD5,0xE5,0x2C,0xB2,0x1F,0xE5,0x01,0xE0,0xA0,0xE3,0x82,0x00,0x85,0xE0, + 0xB4,0x1F,0xD0,0xE1,0xCD,0x30,0xA0,0xE3,0x33,0x3B,0x83,0xE2,0x01,0x0C,0x80,0xE2, + 0xB6,0x00,0xD0,0xE1,0x93,0x01,0x01,0xE0,0x93,0x00,0x00,0xE0,0xA0,0x79,0xA0,0xE1, + 0x00,0x80,0xA0,0xE3,0x00,0x00,0x59,0xE3,0xA1,0x69,0xA0,0xE1,0x08,0x00,0xA0,0xE1, + 0x21,0x00,0x00,0xDA,0x02,0x11,0x85,0xE0,0x01,0x4C,0x81,0xE2,0x80,0x11,0x85,0xE0, + 0x01,0x1B,0x81,0xE2,0xF8,0x3A,0xD1,0xE1,0x06,0x00,0x53,0xE1,0x15,0x00,0x00,0xCA, + 0xFC,0x3A,0xD1,0xE1,0x06,0x00,0x53,0xE1,0x12,0x00,0x00,0xBA,0xFA,0x3A,0xD1,0xE1, + 0x07,0x00,0x53,0xE1,0x0F,0x00,0x00,0xCA,0xFE,0x1A,0xD1,0xE1,0x07,0x00,0x51,0xE1, + 0x0C,0x00,0x00,0xBA,0xF6,0x11,0xD4,0xE1,0xF4,0x31,0xD4,0xE1,0x81,0x11,0x61,0xE0, + 0x81,0x10,0x83,0xE0,0x81,0x10,0x8B,0xE0,0xF0,0x30,0xD1,0xE1,0x0C,0x00,0x53,0xE1, + 0x04,0x00,0x00,0xDA,0x74,0x11,0x9F,0xE5,0x03,0xC0,0xA0,0xE1,0x00,0xE0,0xC1,0xE5, + 0xFF,0x80,0x02,0xE2,0xA5,0x04,0xC5,0xE5,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x00,0x59,0xE1,0xDF,0xFF,0xFF,0xCA,0x01,0x00,0x82,0xE2, + 0x00,0x28,0xA0,0xE1,0x42,0x28,0xA0,0xE1,0x02,0x00,0x5A,0xE1,0xCA,0xFF,0xFF,0xAA, + 0x2C,0x03,0x1F,0xE5,0xBA,0x10,0xD5,0xE1,0x01,0x6C,0x80,0xE2,0x01,0x4C,0x80,0xE2, + 0x0C,0x00,0x51,0xE1,0x06,0x60,0x86,0xE2,0x02,0x40,0x84,0xE2,0x13,0x00,0x00,0xCA, + 0x00,0x00,0x58,0xE3,0x11,0x00,0x00,0x0A,0x88,0x00,0x85,0xE0,0xB4,0x7F,0xD0,0xE1, + 0x01,0x0C,0x80,0xE2,0xB6,0x80,0xD0,0xE1,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0xF4,0x00,0x85,0xE2,0xE3,0xE9,0xFF,0xEB,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x06,0x00,0xA0,0xE1,0xDF,0xE9,0xFF,0xEB,0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5, + 0x8C,0x03,0x1F,0xE5,0xB6,0x7F,0xC0,0xE1,0xB6,0x80,0xC4,0xE1,0x1C,0x00,0x00,0xEA, + 0x05,0x00,0xD5,0xE5,0x00,0x00,0x50,0xE3,0x19,0x00,0x00,0x1A,0x01,0x00,0x5A,0xE3, + 0x17,0x00,0x00,0x9A,0x82,0x01,0xD5,0xE5,0x00,0x00,0x50,0xE3,0x14,0x00,0x00,0x1A, + 0x18,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x11,0x00,0x00,0x0A,0x18,0x10,0x9D,0xE5, + 0x12,0x20,0xA0,0xE3,0x81,0x00,0x85,0xE0,0xB4,0x7F,0xD0,0xE1,0x01,0x0C,0x80,0xE2, + 0xB6,0x80,0xD0,0xE1,0x00,0x10,0xA0,0xE3,0xF4,0x00,0x85,0xE2,0xC5,0xE9,0xFF,0xEB, + 0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1,0xC1,0xE9,0xFF,0xEB, + 0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5,0x04,0x04,0x1F,0xE5,0xB6,0x7F,0xC0,0xE1, + 0xB6,0x80,0xC4,0xE1,0xA3,0x04,0xD5,0xE5,0x05,0x30,0xA0,0xE1,0x00,0x00,0x50,0xE3, + 0x0B,0x00,0x00,0x0A,0x44,0x00,0x9F,0xE5,0x00,0x20,0xA0,0xE3,0x04,0x20,0xC3,0xE5, + 0x3C,0xC0,0x9F,0xE5,0x00,0x20,0xC0,0xE5,0xA4,0x04,0xD3,0xE5,0x1E,0xC0,0xDC,0xE5, + 0x03,0x10,0xA0,0xE1,0x0C,0x00,0x50,0xE1,0x01,0x00,0x80,0xE2,0xA3,0x24,0xC1,0x25, + 0xA4,0x04,0xC1,0xE5,0x04,0x00,0xD3,0xE5,0x18,0x10,0x9F,0xE5,0x05,0x00,0xC3,0xE5, + 0x00,0x00,0xC1,0xE5,0x5B,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x95,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0x6C,0x06,0x00,0x20,0x10,0xB5,0x0F,0x48, + 0x0F,0x49,0x80,0x88,0x49,0x88,0x00,0x24,0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0x0D,0x49,0x49,0x89,0x02,0xE0,0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18, + 0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7, + 0x5D,0xFA,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x01,0x00,0x20, + 0x80,0x05,0x00,0x20,0xA1,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xC0,0x90,0x00,0x40,0xF7,0xB5,0x27,0x4B,0x27,0x49,0x18,0x8F,0x82,0xB0,0x1E,0x00, + 0x08,0x80,0xD8,0x8E,0x25,0x49,0x20,0x36,0x08,0x80,0xB0,0x7F,0xF1,0x7F,0x00,0x02, + 0x08,0x43,0x02,0xF0,0x8F,0xFA,0x18,0x7D,0xC0,0x07,0x0A,0xD0,0x20,0x48,0x01,0x78, + 0x20,0x48,0x00,0x7D,0x00,0x29,0x02,0xD0,0x02,0xF0,0x34,0xFA,0x01,0xE0,0x02,0xF0, + 0x59,0xFA,0x18,0x49,0x01,0x25,0x08,0x00,0xC0,0x30,0x01,0x90,0x05,0x20,0xC0,0x01, + 0x19,0x4F,0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62,0x01,0x98,0x80,0x68,0x38,0x62, + 0x00,0x98,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFB,0xF7,0x1A,0xFB, + 0x64,0x1E,0xF9,0xD5,0x02,0x20,0xF8,0x62,0x30,0x7F,0x01,0x00,0xFB,0xF7,0x88,0xFB, + 0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7,0xA7,0xF9,0x00,0x28,0x01,0xD1,0x00,0x24, + 0x25,0x00,0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5,0x05,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0xA6,0x05,0x00,0x20,0xA8,0x05,0x00,0x20, + 0x99,0x05,0x00,0x20,0x00,0x05,0x00,0x20,0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46, + 0xF0,0x4F,0x2D,0xE9,0x00,0x40,0xA0,0xE3,0x77,0xDF,0x4D,0xE2,0xCC,0x41,0x8D,0xE5, + 0xC8,0x41,0x8D,0xE5,0x3C,0x40,0x8D,0xE5,0x38,0x40,0x8D,0xE5,0x34,0x40,0x8D,0xE5, + 0x2C,0x40,0x8D,0xE5,0x28,0x40,0x8D,0xE5,0x01,0x00,0xA0,0xE3,0x0C,0x10,0x8D,0xE2, + 0x30,0x40,0x8D,0xE5,0x24,0x40,0x8D,0xE5,0x20,0x40,0x8D,0xE5,0x18,0x40,0x8D,0xE5, + 0x14,0x40,0x8D,0xE5,0x11,0x00,0x81,0xE8,0x00,0x00,0xA0,0xE3,0x7C,0x9B,0x9F,0xE5, + 0x00,0x10,0xA0,0xE1,0x08,0x00,0x8D,0xE5,0x04,0x00,0x8D,0xE5,0x04,0x50,0xA0,0xE1, + 0x04,0x70,0xA0,0xE1,0x04,0x80,0xA0,0xE1,0x30,0x20,0xA0,0xE3,0x88,0x00,0x89,0xE2, + 0x40,0xE9,0xFF,0xEB,0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xB8,0x00,0x89,0xE2, + 0x3C,0xE9,0xFF,0xEB,0x00,0x60,0xA0,0xE3,0x60,0x10,0xA0,0xE3,0x16,0x0E,0x8D,0xE2, + 0xB8,0x6E,0xC9,0xE1,0x47,0xE9,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x01,0x0C,0x8D,0xE2, + 0x44,0xE9,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0xA0,0x00,0x8D,0xE2,0x41,0xE9,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0x40,0x00,0x8D,0xE2,0x3E,0xE9,0xFF,0xEB,0x10,0x0B,0x9F,0xE5, + 0x10,0x1B,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0xD8,0x11,0x8D,0xE5,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x00,0x0A,0xF8,0x0A,0xD1,0xE1,0xC4,0x01,0x8D,0xE5,0xB6,0x0A,0xD1,0xE1, + 0x04,0x00,0x00,0xEA,0xF0,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xF6,0x12,0xD0,0xE1, + 0xC4,0x11,0x8D,0xE5,0xB4,0x02,0xD0,0xE1,0xD8,0x11,0x9D,0xE5,0x1C,0x3B,0x9F,0xE5, + 0xC0,0x01,0x8D,0xE5,0xC4,0x0A,0x9F,0xE5,0x14,0xCB,0x9F,0xE5,0xB6,0x00,0xD0,0xE1, + 0x10,0xAB,0x9F,0xE5,0x10,0x2B,0x9F,0xE5,0x40,0x00,0x10,0xE3,0xB0,0xB8,0xD1,0x01, + 0xB0,0x18,0xD1,0x11,0x01,0x08,0xE0,0xE3,0x00,0x90,0xA0,0xE3,0x81,0xB0,0x00,0x10, + 0x8B,0x00,0x00,0xE0,0xA4,0x1A,0x9F,0xE5,0x1C,0x00,0x8D,0xE5,0x00,0x00,0xA0,0xE3, + 0x00,0x00,0xC1,0xE5,0x98,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x94,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x90,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x8C,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x88,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x84,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x80,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x7C,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x78,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x74,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x70,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x6C,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x68,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x64,0x1A,0x9F,0xE5, + 0x00,0x00,0x81,0xE5,0x60,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x00,0x00,0x83,0xE5, + 0x00,0x00,0x8C,0xE5,0x00,0x00,0x8A,0xE5,0x00,0x00,0x82,0xE5,0x5C,0x2A,0x9F,0xE5, + 0x00,0x00,0x82,0xE5,0x58,0x2A,0x9F,0xE5,0x00,0x00,0x82,0xE5,0x54,0x2A,0x9F,0xE5, + 0x01,0x00,0xA0,0xE3,0x00,0x00,0x82,0xE5,0x4C,0x2A,0x9F,0xE5,0x00,0x00,0x82,0xE5, + 0x09,0x20,0xA0,0xE1,0x00,0x00,0xA0,0xE3,0x40,0x1A,0x9F,0xE5,0x89,0x10,0x81,0xE0, + 0xD4,0x11,0x8D,0xE5,0xB0,0x10,0xD1,0xE1,0x01,0xCA,0xA0,0xE1,0x30,0x1A,0x9F,0xE5, + 0x2C,0xCA,0xA0,0xE1,0x89,0x10,0x81,0xE0,0xB0,0x10,0xD1,0xE1,0x0F,0x3A,0xC1,0xE3, + 0x03,0x10,0x4C,0xE0,0x06,0x00,0x51,0xE1,0x0C,0x30,0x43,0xE0,0x3C,0x00,0x8D,0xC5, + 0x38,0x20,0x8D,0xC5,0x01,0x60,0xA0,0xC1,0x01,0xCC,0x8D,0xE2,0x00,0xA1,0x9C,0xE7, + 0x00,0x00,0x51,0xE3,0x00,0x10,0xA0,0xB3,0x01,0xA0,0x8A,0xE0,0x00,0xA1,0x8C,0xE7, + 0x16,0xAE,0x8D,0xE2,0x02,0xC1,0x9A,0xE7,0x00,0x00,0x53,0xE3,0x01,0xC0,0x8C,0xE0, + 0x02,0xC1,0x8A,0xE7,0x40,0xC0,0x8D,0xE2,0x00,0xA1,0x9C,0xE7,0x00,0x30,0xA0,0xB3, + 0x03,0xA0,0x8A,0xE0,0x00,0xA1,0x8C,0xE7,0xA0,0xC0,0x8D,0xE2,0x02,0xA1,0x9C,0xE7, + 0x0D,0x00,0x50,0xE3,0x03,0xA0,0x8A,0xE0,0x02,0xA1,0x8C,0xE7,0x04,0x00,0x00,0x2A, + 0xCC,0xC1,0x9D,0xE5,0x01,0x00,0x5C,0xE1,0xCC,0x11,0x8D,0x35,0x03,0x00,0x54,0xE1, + 0x03,0x40,0xA0,0x31,0x8F,0xC0,0xA0,0xE3,0x65,0xA0,0x41,0xE2,0x01,0xCC,0x8C,0xE2, + 0x0C,0x00,0x5A,0xE1,0x00,0xC0,0xA0,0x23,0x64,0xC0,0xA0,0x33,0x11,0x00,0x52,0xE3, + 0x07,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0x0C,0x00,0x50,0x13,0x22,0x00,0x00,0x2A, + 0x40,0xE9,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0xC0,0x8C,0xE0,0x34,0xE9,0x9F,0xE5, + 0x1C,0x00,0x00,0xEA,0x12,0x00,0x52,0xE3,0x07,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3, + 0x0C,0x00,0x50,0x13,0x18,0x00,0x00,0x2A,0x1C,0xE9,0x9F,0xE5,0x00,0xE0,0x9E,0xE5, + 0x0E,0xC0,0x8C,0xE0,0x10,0xE9,0x9F,0xE5,0x12,0x00,0x00,0xEA,0x13,0x00,0x52,0xE3, + 0x07,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0x0C,0x00,0x50,0x13,0x0E,0x00,0x00,0x2A, + 0xF8,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0xC0,0x8C,0xE0,0xEC,0xE8,0x9F,0xE5, + 0x08,0x00,0x00,0xEA,0x14,0x00,0x52,0xE3,0x07,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3, + 0x0C,0x00,0x50,0x13,0x04,0x00,0x00,0x2A,0xD4,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5, + 0x0E,0xC0,0x8C,0xE0,0xC8,0xE8,0x9F,0xE5,0x00,0xC0,0x8E,0xE5,0x57,0xC0,0xA0,0xE3, + 0x02,0xCC,0x8C,0xE2,0x0C,0x00,0x5A,0xE1,0xB8,0xE8,0x9F,0xE5,0x00,0xC0,0xA0,0x23, + 0x64,0xC0,0xA0,0x33,0x00,0xE0,0x9E,0xE5,0x03,0x00,0x54,0xE1,0x0E,0xC0,0x8C,0xE0, + 0xA0,0xE8,0x9F,0xE5,0x03,0x40,0xA0,0x31,0x00,0xC0,0x8E,0xE5,0xC7,0x00,0x5A,0xE3, + 0x01,0xC0,0xA0,0xE1,0x64,0xC0,0xA0,0x33,0x11,0x00,0x52,0xE3,0x56,0x00,0x00,0x3A, + 0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x58,0xE8,0x9F,0xE5,0x00,0xA0,0x9E,0xE5, + 0x0A,0xC0,0x8C,0xE0,0x00,0xC0,0x8E,0xE5,0x08,0x00,0x00,0xEA,0x0C,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x1A,0x40,0xE8,0x9F,0xE5,0x00,0xA0,0x9E,0xE5,0x0A,0xC0,0x8C,0xE0, + 0x00,0xC0,0x8E,0xE5,0x08,0x00,0x00,0xEA,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0x28,0xC8,0x9F,0xE5,0x00,0xA0,0x9C,0xE5,0x03,0xA0,0x8A,0xE0,0x00,0xA0,0x8C,0xE5, + 0x05,0x00,0x00,0xEA,0x0C,0x00,0x50,0xE3,0x03,0x00,0x00,0x1A,0x10,0xC8,0x9F,0xE5, + 0x00,0xA0,0x9C,0xE5,0x03,0xA0,0x8A,0xE0,0x00,0xA0,0x8C,0xE5,0x11,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0xC8,0xC7,0x9F,0x05,0x35,0x00,0x00,0x0A, + 0x1F,0x00,0x00,0xEA,0x14,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3, + 0xB4,0xC7,0x9F,0x05,0x2F,0x00,0x00,0x0A,0x07,0x00,0x00,0xEA,0x13,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0x01,0x00,0x50,0xE3,0xA0,0xC7,0x9F,0x05,0x29,0x00,0x00,0x0A, + 0x07,0x00,0x00,0xEA,0x14,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A,0x01,0x00,0x50,0xE3, + 0x8C,0xC7,0x9F,0x05,0x23,0x00,0x00,0x0A,0x07,0x00,0x00,0xEA,0x13,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0x0B,0x00,0x50,0xE3,0x78,0xC7,0x9F,0x05,0x1D,0x00,0x00,0x0A, + 0x13,0x00,0x00,0xEA,0x14,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A,0x0B,0x00,0x50,0xE3, + 0x64,0xC7,0x9F,0x05,0x17,0x00,0x00,0x0A,0x07,0x00,0x00,0xEA,0x11,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0x0C,0x00,0x50,0xE3,0x13,0x00,0x00,0x1A,0x4C,0xC7,0x9F,0xE5, + 0x10,0x00,0x00,0xEA,0x14,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A,0x0C,0x00,0x50,0xE3, + 0x3C,0xC7,0x9F,0x05,0x0B,0x00,0x00,0x0A,0x07,0x00,0x00,0xEA,0x13,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x1A,0x64,0xC7,0x9F,0xE5, + 0x04,0x00,0x00,0xEA,0x14,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A,0x0D,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x1A,0x50,0xC7,0x9F,0xE5,0x00,0x10,0x8C,0xE5,0x0B,0x00,0x53,0xE1, + 0x01,0xC0,0x85,0xC2,0x01,0x58,0xCC,0xC3,0x0B,0x00,0x51,0xE1,0x01,0xC0,0x87,0xC2, + 0x01,0x78,0xCC,0xC3,0x1C,0xC0,0x9D,0xE5,0x0C,0x00,0x53,0xE1,0x01,0xC0,0x88,0xC2, + 0x01,0x88,0xCC,0xC3,0x1C,0xC0,0x9D,0xE5,0x0C,0x00,0x51,0xE1,0x03,0x00,0x00,0xDA, + 0x18,0xC0,0x9D,0xE5,0x01,0xC0,0x8C,0xE2,0x01,0xC8,0xCC,0xE3,0x18,0xC0,0x8D,0xE5, + 0x14,0xC0,0x9D,0xE5,0x96,0x00,0x53,0xE3,0x01,0xC0,0x8C,0xE0,0x14,0xC0,0x8D,0xE5, + 0x10,0xC0,0x9D,0xE5,0x03,0xC0,0x8C,0xE0,0x10,0xC0,0x8D,0xE5,0x03,0x00,0x00,0xDA, + 0xE8,0xC6,0x9F,0xE5,0xB0,0x30,0xDC,0xE1,0x01,0x30,0x83,0xE2,0xB0,0x30,0xCC,0xE1, + 0xD4,0x31,0x9D,0xE5,0x01,0x00,0x80,0xE2,0xB0,0x10,0xC3,0xE1,0xC4,0x31,0x9D,0xE5, + 0x0E,0x00,0x50,0xE3,0x03,0x10,0x81,0xE0,0xC8,0x31,0x9D,0xE5,0x01,0x90,0x89,0xE2, + 0x03,0x10,0x81,0xE0,0xC8,0x11,0x8D,0xE5,0x16,0xFF,0xFF,0x3A,0x01,0x20,0x82,0xE2, + 0x15,0x00,0x52,0xE3,0x12,0xFF,0xFF,0x3A,0x7C,0x16,0x9F,0xE5,0x74,0x00,0x9D,0xE5, + 0x2C,0x26,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x70,0x16,0x9F,0xE5,0xCC,0x01,0x9D,0xE5, + 0x00,0x00,0x81,0xE5,0x68,0x16,0x9F,0xE5,0xFA,0x0F,0x50,0xE3,0x00,0x40,0x81,0xE5, + 0x10,0x10,0x9D,0xE5,0x00,0x10,0x82,0xE5,0x48,0x16,0x9F,0x85,0x00,0x20,0xA0,0x83, + 0x00,0x20,0x81,0x85,0x2C,0x16,0x9F,0xE5,0x00,0x10,0x91,0xE5,0xAF,0x2F,0x41,0xE2, + 0x45,0x1F,0xA0,0xE3,0x01,0x1B,0x81,0xE2,0x01,0x00,0x52,0xE1,0x0E,0x00,0x00,0x9A, + 0x14,0x26,0x9F,0xE5,0x00,0x20,0x92,0xE5,0xAF,0x2F,0x42,0xE2,0x01,0x00,0x52,0xE1, + 0x09,0x00,0x00,0x9A,0x04,0x26,0x9F,0xE5,0x00,0x20,0x92,0xE5,0xAF,0x2F,0x42,0xE2, + 0x01,0x00,0x52,0xE1,0x04,0x00,0x00,0x9A,0xF4,0x25,0x9F,0xE5,0x00,0x20,0x92,0xE5, + 0xAF,0x2F,0x42,0xE2,0x01,0x00,0x52,0xE1,0x0A,0x00,0x00,0x8A,0x7D,0x0F,0x50,0xE3, + 0x08,0x00,0x00,0x2A,0x08,0x06,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x1A,0xFC,0x15,0x9F,0xE5,0x00,0x00,0x91,0xE5,0xC8,0x00,0x50,0xE3, + 0x01,0x00,0x80,0x32,0x00,0x00,0x81,0x35,0xEC,0x05,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0x03,0x00,0x50,0xE3,0x15,0x00,0x00,0x2A,0xE0,0x15,0x9F,0xE5,0x96,0x00,0x54,0xE3, + 0x00,0x00,0x91,0x35,0xFA,0x00,0x50,0x33,0x03,0x00,0x00,0x2A,0x00,0x00,0x50,0xE3, + 0x0E,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2,0x0B,0x00,0x00,0xEA,0xFA,0x00,0x54,0xE3, + 0x03,0x00,0x00,0x9A,0x00,0x00,0x91,0xE5,0x7D,0x0F,0x50,0xE3,0x07,0x00,0x00,0x2A, + 0x04,0x00,0x00,0xEA,0xC8,0x00,0x54,0xE3,0x04,0x00,0x00,0x9A,0x00,0x00,0x91,0xE5, + 0x4B,0x0F,0x50,0xE3,0x01,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x00,0x00,0x81,0xE5, + 0x42,0xF7,0xFF,0xEB,0x88,0x05,0x9F,0xE5,0xD5,0x9A,0xD0,0xE1,0x00,0x00,0x59,0xE3, + 0x2D,0x00,0x00,0xBA,0x01,0x3B,0x40,0xE2,0xD5,0x04,0xD3,0xE5,0xA7,0x34,0xD3,0xE5, + 0x0D,0x10,0xA0,0xE3,0x80,0x01,0x60,0xE0,0x80,0x00,0x81,0xE0,0x00,0x00,0x53,0xE3, + 0x00,0x10,0xA0,0xE1,0x00,0x20,0xA0,0xE3,0x11,0x00,0x00,0x9A,0x2C,0xA5,0x9F,0xE5, + 0x0C,0xB0,0x9D,0xE5,0x80,0x40,0x8A,0xE0,0xF0,0xC0,0xD4,0xE1,0x0B,0x00,0x5C,0xE1, + 0x03,0x00,0x00,0xDA,0x08,0xB0,0x9D,0xE5,0x01,0xB0,0x8B,0xE2,0xFF,0xB0,0x0B,0xE2, + 0x08,0xB0,0x8D,0xE5,0x04,0xB0,0x9D,0xE5,0x01,0x20,0x82,0xE2,0x0B,0x00,0x5C,0xE1, + 0xB0,0xC0,0xD4,0xC1,0x0E,0x00,0x80,0xE2,0x04,0xC0,0x8D,0xC5,0x02,0x00,0x53,0xE1, + 0xEE,0xFF,0xFF,0x8A,0x08,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x00,0x00,0xA0,0x13, + 0x00,0x00,0x53,0x13,0x0C,0x00,0x00,0x9A,0x04,0x20,0x9D,0xE5,0xCC,0xC4,0x9F,0xE5, + 0x02,0x28,0xA0,0xE1,0x42,0x28,0xA0,0xE1,0x00,0x40,0xA0,0xE3,0x00,0x00,0x59,0xE1, + 0x81,0xA0,0x8C,0xE0,0xB0,0x20,0xCA,0x01,0x01,0x00,0x80,0xE2,0xB0,0x40,0xCA,0x11, + 0x00,0x00,0x53,0xE1,0x0E,0x10,0x81,0xE2,0xF7,0xFF,0xFF,0x8A,0x38,0x04,0x9F,0xE5, + 0x28,0x94,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xC9,0xE1, + 0xB0,0x00,0xD4,0xE1,0x01,0x00,0x10,0xE3,0x08,0x00,0x00,0x0A,0xC0,0x01,0x9D,0xE5, + 0xC8,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x98,0x14,0x9F,0xE5,0x91,0x20,0x80,0xE0, + 0xB4,0x10,0xD4,0xE1,0x20,0x06,0xA0,0xE1,0x00,0x00,0x51,0xE1,0xBE,0x00,0xC9,0x81, + 0x84,0xA4,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x16,0xBE,0x8D,0xE2,0xA0,0xE0,0x8D,0xE2, + 0x08,0x20,0xD4,0xE5,0x00,0x11,0x9B,0xE7,0x92,0x01,0x01,0xE0,0x9A,0x31,0x82,0xE0, + 0xA2,0x34,0xA0,0xE1,0xB0,0x21,0xD4,0xE1,0x02,0x00,0x53,0xE1,0x9A,0x21,0x81,0x90, + 0x09,0x30,0xD4,0xE5,0xA1,0x24,0xA0,0x91,0x00,0x11,0x9E,0xE7,0x91,0x03,0x03,0xE0, + 0x9A,0xC3,0x81,0xE0,0xA1,0xC4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x5C,0xE1, + 0x9A,0x33,0x81,0x90,0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1, + 0x92,0x01,0x01,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0, + 0x02,0x21,0x82,0xE0,0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0, + 0x80,0x20,0x89,0xE0,0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0xB8,0x18,0xC2,0xE1, + 0xDE,0xFF,0xFF,0x3A,0xF4,0x33,0x9F,0xE5,0x00,0xA0,0xA0,0xE3,0x01,0x2C,0x8D,0xE2, + 0x0A,0x10,0xD4,0xE5,0x0A,0x01,0x92,0xE7,0x91,0x00,0x00,0xE0,0x93,0xC0,0x81,0xE0, + 0xA1,0xC5,0xA0,0xE1,0xB4,0x11,0xD4,0xE1,0x01,0x00,0x5C,0xE1,0x93,0x10,0x80,0x90, + 0xA0,0x15,0xA0,0x91,0x0B,0xC0,0xD4,0xE5,0x40,0x00,0x8D,0xE2,0x0A,0x01,0x90,0xE7, + 0x90,0x0C,0x0C,0xE0,0x93,0xBC,0x80,0xE0,0xA0,0xB5,0xA0,0xE1,0xB6,0x01,0xD4,0xE1, + 0x00,0x00,0x5B,0xE1,0x93,0xCC,0x80,0x90,0xA0,0x05,0xA0,0x91,0x00,0x00,0x41,0xE0, + 0xBE,0x10,0xD4,0xE1,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x8A,0x10,0x89,0xE0,0x01,0xA0,0x8A,0xE2,0x0D,0x00,0x5A,0xE3, + 0xB8,0x0B,0xC1,0xE1,0xDD,0xFF,0xFF,0x3A,0x0A,0x10,0xD4,0xE5,0x0A,0x01,0x92,0xE7, + 0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x54,0x13,0x9F,0xE5,0x15,0x10,0xD1,0xE5, + 0x92,0x01,0x01,0xE0,0xD0,0x11,0x8D,0xE5,0xF6,0xE6,0xFF,0xEB,0xB4,0x11,0xD4,0xE1, + 0x01,0x00,0x50,0xE1,0x00,0xB0,0xA0,0x91,0x01,0xB0,0xA0,0x81,0x0B,0x10,0xD4,0xE5, + 0x40,0x00,0x8D,0xE2,0x0A,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0,0xD0,0x11,0x9D,0xE5, + 0xEC,0xE6,0xFF,0xEB,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0x81, + 0xBE,0x10,0xD4,0xE1,0x00,0x00,0x4B,0xE0,0x00,0x00,0x56,0xE3,0x91,0x00,0x00,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0, + 0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x8A,0x10,0x89,0xE0, + 0xB8,0x0B,0xC1,0xE1,0x0C,0x00,0x00,0xDA,0x3C,0x00,0x9D,0xE5,0x38,0x10,0x9D,0xE5, + 0x80,0x00,0x89,0xE0,0x81,0x10,0x89,0xE0,0xB8,0x0B,0xD0,0xE1,0xB8,0x18,0xD1,0xE1, + 0x01,0x00,0x80,0xE0,0x00,0x00,0x46,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1, + 0xB8,0x0E,0xC9,0xE1,0x00,0x00,0xA0,0x43,0xB8,0x0E,0xC9,0x41,0x11,0x60,0xA0,0xE3, + 0x01,0x6C,0x86,0xE2,0x10,0x00,0x9D,0xE5,0x06,0x10,0xA0,0xE1,0xC9,0xE6,0xFF,0xEB, + 0x00,0x40,0xA0,0xE1,0x14,0x00,0x9D,0xE5,0x06,0x10,0xA0,0xE1,0xC5,0xE6,0xFF,0xEB, + 0x00,0x10,0xA0,0xE1,0xB6,0x00,0xD9,0xE1,0x40,0x00,0x10,0xE3,0x0F,0x00,0x00,0x0A, + 0x87,0x00,0x55,0xE1,0x01,0x20,0xA0,0x83,0x30,0x20,0x8D,0x85,0x4B,0x0F,0x54,0xE3, + 0x01,0x20,0xA0,0x83,0x2C,0x20,0x8D,0x85,0x28,0x00,0x58,0xE3,0x01,0x20,0xA0,0x83, + 0x28,0x20,0x8D,0x85,0x18,0x20,0x9D,0xE5,0x28,0x00,0x52,0xE3,0x01,0x20,0xA0,0x33, + 0x24,0x20,0x8D,0x35,0x14,0x00,0x55,0xE3,0x12,0x00,0x00,0x9A,0x0F,0x00,0x00,0xEA, + 0x07,0x00,0x55,0xE1,0x08,0x00,0x55,0x83,0x01,0x20,0xA0,0x83,0x30,0x20,0x8D,0x85, + 0x96,0x00,0x54,0xE3,0x01,0x20,0xA0,0x83,0x2C,0x20,0x8D,0x85,0x14,0x00,0x58,0xE3, + 0x01,0x20,0xA0,0x83,0x28,0x20,0x8D,0x85,0x18,0x20,0x9D,0xE5,0x14,0x00,0x52,0xE3, + 0x01,0x20,0xA0,0x33,0x24,0x20,0x8D,0x35,0x0A,0x00,0x55,0xE3,0x01,0x00,0x00,0x9A, + 0x01,0x20,0xA0,0xE3,0x20,0x20,0x8D,0xE5,0xF1,0x20,0xD9,0xE5,0x00,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0xB8,0x21,0x9F,0xE5,0x00,0x20,0xD2,0xE5,0x01,0x00,0x52,0xE3, + 0x04,0x00,0x00,0x1A,0xF2,0x20,0xD9,0xE5,0xFA,0x00,0x52,0xE3,0x06,0x00,0x00,0x2A, + 0x01,0x20,0x82,0xE2,0x03,0x00,0x00,0xEA,0xF2,0x20,0xD9,0xE5,0x00,0x00,0x52,0xE3, + 0x01,0x00,0x00,0x0A,0x01,0x20,0x42,0xE2,0xF2,0x20,0xC9,0xE5,0x2C,0x30,0x8D,0xE2, + 0x0C,0x00,0x93,0xE8,0x10,0x00,0x10,0xE3,0x20,0x00,0x9D,0x15,0x02,0x30,0x83,0xE1, + 0x28,0x20,0x9D,0xE5,0x24,0xC0,0x9D,0xE5,0x00,0x00,0x50,0x13,0x0C,0x20,0x02,0xE0, + 0x03,0x20,0x82,0xE1,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1, + 0x00,0x00,0x50,0xE3,0xF2,0x00,0xD9,0x15,0x05,0x00,0x50,0x13,0x08,0x00,0x00,0x9A, + 0x60,0x01,0x9F,0xE5,0x81,0x10,0x81,0xE0,0x90,0x21,0x81,0xE0,0xA1,0x01,0xA0,0xE1, + 0x04,0x00,0x50,0xE1,0x50,0x01,0x9F,0x35,0xB0,0x00,0xD0,0x31,0xAF,0x0F,0x50,0x33, + 0x02,0x00,0x00,0x3A,0x34,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A, + 0xEC,0x00,0x99,0xE5,0x01,0x00,0x80,0xE2,0xEC,0x00,0x89,0xE5,0xF0,0x00,0xD9,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xF0,0x00,0xC9,0x15,0x0D,0x00,0x00,0xEA, + 0xF0,0x00,0xD9,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0xF0,0x00,0xC9,0xE5, + 0xD8,0x11,0x9D,0xE5,0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1,0x05,0x00,0x00,0x1A, + 0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC9,0xE5,0xEC,0x00,0x99,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x40,0xC2,0xEC,0x00,0x89,0xC5,0xF2,0x00,0xD9,0xE5,0x0A,0x00,0x50,0xE3, + 0x77,0xDF,0x8D,0x22,0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21,0xEC,0x00,0x99,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0xA0,0xC3,0xEC,0x00,0x89,0xC5,0x00,0x00,0xA0,0xE3, + 0xF0,0x00,0xC9,0xE5,0x77,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x40,0x00,0x00,0x20,0xA1,0x05,0x00,0x20,0x00,0x95,0x00,0x00,0xF0,0x06,0x00,0x20, + 0x6D,0x06,0x00,0x20,0x1C,0x06,0x00,0x20,0x20,0x06,0x00,0x20,0x24,0x06,0x00,0x20, + 0x28,0x06,0x00,0x20,0x2C,0x06,0x00,0x20,0x30,0x06,0x00,0x20,0x34,0x06,0x00,0x20, + 0x38,0x06,0x00,0x20,0x3C,0x06,0x00,0x20,0x40,0x06,0x00,0x20,0x44,0x06,0x00,0x20, + 0x48,0x06,0x00,0x20,0x4C,0x06,0x00,0x20,0x50,0x06,0x00,0x20,0x54,0x06,0x00,0x20, + 0x58,0x06,0x00,0x20,0x5C,0x06,0x00,0x20,0xC8,0x05,0x00,0x20,0x60,0x06,0x00,0x20, + 0xD4,0x05,0x00,0x20,0xD8,0x05,0x00,0x20,0x64,0x06,0x00,0x20,0x68,0x06,0x00,0x20, + 0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10,0xCC,0x05,0x00,0x20,0xD0,0x05,0x00,0x20, + 0xAE,0x05,0x00,0x20,0x8E,0x05,0x00,0x20,0xE4,0x05,0x00,0x20,0xE0,0x05,0x00,0x20, + 0xDC,0x05,0x00,0x20,0x40,0x04,0x00,0x20,0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D, + 0x2D,0x34,0xA9,0xF9,0x00,0x93,0x00,0x00,0xCD,0xCC,0xCC,0xCC,0xAC,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0x8D,0xB0,0x06,0x00,0x06,0x90,0x05,0x90,0xFF,0x48,0x00,0x68, + 0x80,0x79,0x03,0x90,0xFE,0x48,0x42,0x79,0x04,0x00,0xC0,0x34,0x00,0x92,0x82,0x79, + 0x80,0x30,0x01,0x7B,0xC0,0x38,0xA3,0x7A,0x00,0x7A,0xFD,0xF7,0x3C,0xFC,0x00,0x06, + 0x61,0x7A,0x00,0x0E,0xFD,0xF7,0x2C,0xFC,0x21,0x00,0x20,0x39,0x0A,0x7A,0x00,0x06, + 0xC0,0x39,0x09,0x79,0x00,0x0E,0xFD,0xF7,0x27,0xFC,0x21,0x00,0x80,0x39,0x8A,0x7D, + 0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E,0xFD,0xF7,0x1E,0xFC,0x00,0x06,0x00,0x0E, + 0x02,0x90,0xEC,0x48,0x00,0x27,0x05,0x00,0x80,0x3D,0x87,0x60,0x68,0x7D,0x00,0x28, + 0x03,0xD0,0x20,0x00,0x80,0x30,0x40,0x89,0x07,0xE0,0xE4,0x48,0xE6,0x49,0x00,0x68, + 0x49,0x88,0x40,0x88,0x40,0x18,0x00,0x04,0x00,0x0C,0x04,0x90,0x6F,0x62,0x0F,0x20, + 0xA8,0x72,0xE2,0x48,0x18,0x22,0x00,0x21,0xF9,0xF7,0x18,0xFC,0xE0,0x48,0x08,0x22, + 0x00,0x21,0xF9,0xF7,0x13,0xFC,0xDF,0x48,0x07,0x60,0x68,0x7C,0x00,0x28,0x06,0xD0, + 0xE8,0x6F,0x00,0x04,0x00,0x0C,0x01,0xF0,0xCD,0xFE,0x01,0xF0,0xBB,0xFE,0x01,0x24, + 0x2C,0x63,0xFB,0xF7,0x5F,0xFB,0x00,0x27,0x2F,0x71,0x6F,0x71,0xEF,0x70,0xAF,0x65, + 0xC8,0x20,0x6F,0x65,0x28,0x65,0xEF,0x83,0xEF,0x65,0x2F,0x66,0xCE,0x48,0x6F,0x66, + 0xAF,0x66,0xA0,0x38,0x6F,0x72,0xFF,0x21,0x0C,0x90,0x41,0x71,0x2F,0x64,0x6F,0x64, + 0xEF,0x66,0x2F,0x67,0x6F,0x67,0xCC,0x4A,0xEF,0x71,0x2F,0x72,0xD0,0x88,0x08,0x21, + 0x88,0x43,0xD0,0x80,0x88,0x02,0xF9,0xF7,0xB9,0xFF,0xF9,0xF7,0x33,0xFC,0xF9,0xF7, + 0x17,0xFC,0x01,0xF0,0x39,0xF9,0x01,0xF0,0x81,0xFB,0x01,0xF0,0x9F,0xF8,0xC3,0x48, + 0x87,0x60,0xE8,0x7D,0x00,0x28,0x01,0xD0,0x0A,0x20,0x02,0x90,0xBE,0x49,0x05,0x22, + 0x08,0x00,0xC0,0x30,0x0A,0x90,0xBE,0x48,0xD2,0x01,0x82,0x18,0x80,0x30,0x08,0xAB, + 0x05,0xC3,0x02,0x98,0xC0,0x1C,0x07,0x90,0x15,0x20,0x40,0x01,0x0F,0x18,0xF4,0xE2, + 0x68,0x7C,0x00,0x28,0x04,0xD0,0xE8,0x6F,0x00,0x04,0x00,0x0C,0x01,0xF0,0x7A,0xFE, + 0x80,0x20,0xF9,0xF7,0x8B,0xFF,0x03,0x20,0x01,0xF0,0xFA,0xFC,0x01,0x20,0x40,0x03, + 0xF9,0xF7,0x84,0xFF,0xF9,0xF7,0xEA,0xFB,0xA6,0x48,0x80,0x38,0xC0,0x7D,0x00,0x28, + 0x01,0xD0,0x06,0x20,0x3A,0xE0,0xA8,0x48,0xC0,0x88,0x01,0x06,0x06,0xD4,0xA1,0x49, + 0x80,0x39,0x09,0x6D,0x64,0x29,0x03,0xD2,0x42,0x06,0x01,0xD4,0x01,0x20,0x2D,0xE0, + 0xFF,0x22,0xC3,0x32,0x91,0x42,0x0E,0xD9,0x40,0x06,0x05,0xD5,0x9F,0x48,0xA1,0x49, + 0x80,0x30,0x01,0x62,0x27,0x21,0x18,0xE0,0x9C,0x48,0xFF,0x21,0x01,0x31,0x80,0x30, + 0x01,0x62,0x2B,0x21,0x11,0xE0,0xFF,0x22,0x5F,0x32,0x91,0x42,0x11,0xD9,0x40,0x06, + 0x05,0xD5,0x96,0x48,0x97,0x49,0x80,0x30,0x01,0x62,0x26,0x21,0x05,0xE0,0x93,0x48, + 0xFF,0x21,0x01,0x31,0x80,0x30,0x01,0x62,0x2A,0x21,0x41,0x62,0x05,0x21,0xC1,0x62, + 0x06,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0x20,0xFB, + 0x84,0x48,0x80,0x68,0x00,0x28,0x01,0xD1,0xFB,0xF7,0x60,0xFD,0x8A,0x48,0x04,0x99, + 0x80,0x88,0x85,0x4D,0x40,0x18,0xA9,0x89,0x88,0x42,0x12,0xD9,0x86,0x48,0x40,0x30, + 0x40,0x78,0x00,0x28,0x0D,0xD1,0xE8,0x88,0xFF,0x21,0x19,0x31,0x08,0x42,0x08,0xD1, + 0x03,0x98,0x76,0x1C,0x86,0x42,0x05,0xDD,0xFB,0xF7,0x50,0xFD,0x01,0x20,0x05,0x90, + 0x00,0xE0,0x00,0x26,0x01,0xF0,0x8A,0xF8,0x77,0x48,0x09,0x99,0xC0,0x88,0x49,0x88, + 0x40,0x06,0x00,0x28,0x0A,0x98,0xC0,0x6A,0x01,0xDA,0x49,0x00,0xFF,0xE7,0x88,0x42, + 0x02,0xDB,0x6C,0x48,0x80,0x38,0x44,0x70,0x05,0x98,0x00,0x28,0x03,0xD0,0xF9,0xF7, + 0x67,0xFB,0x00,0x20,0x05,0x90,0xFB,0xF7,0xEF,0xFC,0xFB,0xF7,0xFD,0xFC,0x65,0x48, + 0x00,0x25,0x80,0x38,0x45,0x84,0xFC,0xF7,0x15,0xFF,0x00,0x28,0x6B,0x48,0x06,0xD0, + 0x45,0x62,0xF8,0x89,0xC8,0x28,0x35,0xD2,0x40,0x1C,0xF8,0x81,0x32,0xE0,0x41,0x6A, + 0x49,0x1C,0x41,0x62,0x41,0x6A,0x01,0x29,0x02,0xD1,0x45,0x72,0x05,0x64,0x45,0x64, + 0x41,0x6A,0x02,0x29,0x04,0xD9,0x0C,0x9A,0xFF,0x21,0x51,0x71,0xC5,0x71,0x05,0x72, + 0x41,0x6A,0x01,0x29,0x02,0xD1,0x5E,0x49,0x8D,0x72,0x45,0x65,0x5B,0x48,0x40,0x6A, + 0x05,0x28,0x02,0xD9,0xFB,0xF7,0x56,0xFA,0xFD,0x81,0x58,0x48,0x42,0x6A,0x02,0x99, + 0x49,0x1C,0x8A,0x42,0x0E,0xD1,0xC5,0x70,0x85,0x65,0xC5,0x83,0xC5,0x65,0x05,0x66, + 0x45,0x66,0xC8,0x21,0x85,0x66,0x01,0x65,0x05,0x71,0x45,0x71,0xC5,0x66,0x05,0x67, + 0x45,0x67,0x10,0xE0,0x4D,0x49,0xC8,0x6E,0x00,0x28,0x07,0xD0,0x08,0x6F,0x00,0x28, + 0x04,0xD0,0x48,0x6F,0xC8,0x28,0x06,0xD2,0x40,0x1C,0x03,0xE0,0x48,0x6F,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0x48,0x67,0x45,0x49,0x0A,0x6E,0xC8,0x6D,0x10,0x43,0x88,0x6E, + 0x0E,0xD1,0x03,0x28,0x01,0xD1,0x8D,0x66,0x13,0xE0,0x40,0x1C,0x03,0x28,0x88,0x66, + 0x0F,0xD1,0x8D,0x66,0x48,0x6E,0x00,0x28,0x0B,0xD0,0x40,0x1E,0x48,0x66,0x08,0xE0, + 0x00,0x28,0x01,0xD0,0x40,0x1E,0x88,0x66,0x48,0x6E,0xFA,0x28,0x01,0xD2,0x40,0x1C, + 0xF4,0xE7,0x38,0x48,0xCA,0x6B,0x10,0x18,0x7D,0x22,0x12,0x01,0x90,0x42,0x07,0xD8, + 0x88,0x6C,0x92,0x10,0x90,0x42,0x03,0xD2,0x96,0x28,0x08,0xD9,0x0C,0x71,0x09,0xE0, + 0x88,0x6C,0xFF,0x22,0xF5,0x32,0x90,0x42,0x01,0xD3,0x0D,0x71,0x08,0xE0,0x08,0x79, + 0x00,0x28,0x05,0xD0,0x48,0x79,0xFF,0x28,0x03,0xD2,0x40,0x1C,0x48,0x71,0x00,0xE0, + 0x4D,0x71,0x08,0x8C,0x28,0x4A,0x90,0x42,0x01,0xD2,0x40,0x1C,0x08,0x84,0x22,0x48, + 0x60,0x38,0x40,0x7C,0x00,0x28,0x88,0x79,0x03,0xD0,0xFA,0x28,0x05,0xD2,0x40,0x1C, + 0x02,0xE0,0x00,0x28,0x01,0xD0,0x40,0x1E,0x88,0x71,0x88,0x78,0xCA,0x8B,0x00,0x28, + 0x03,0xD0,0x64,0x2A,0x05,0xD2,0x52,0x1C,0x02,0xE0,0x00,0x2A,0x01,0xD0,0x52,0x1E, + 0xCA,0x83,0x16,0x49,0x09,0x8C,0x23,0x29,0x04,0xD2,0x14,0x4A,0x93,0x79,0x19,0x2B, + 0x00,0xD9,0x54,0x70,0x0C,0x4A,0x40,0x23,0xD2,0x88,0x0B,0x92,0x1A,0x40,0x0F,0x4B, + 0xDB,0x7D,0x1A,0x43,0x9C,0x46,0x37,0xD1,0x0C,0x4B,0x1F,0xE0,0xF0,0x06,0x00,0x20, + 0x60,0x94,0x00,0x00,0x0C,0x06,0x00,0x20,0x80,0x05,0x00,0x20,0x64,0x0A,0x00,0x20, + 0x00,0x07,0x00,0x20,0xF8,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x90,0x00,0x40, + 0x00,0x93,0x00,0x00,0x01,0x02,0x00,0x00,0x80,0x01,0x00,0x20,0x8C,0x05,0x00,0x20, + 0x00,0x03,0x00,0x20,0x48,0xF4,0xFF,0xFF,0x10,0x27,0x00,0x00,0x1A,0x79,0x00,0x2A, + 0x12,0xD0,0x5A,0x79,0x8C,0x2A,0x0F,0xD9,0x1A,0x00,0x92,0x6C,0xAF,0x23,0x9B,0x00, + 0x9A,0x42,0x01,0xD2,0xC0,0x4B,0x5C,0x70,0xAF,0x23,0x9B,0x00,0x9A,0x42,0x03,0xD2, + 0xBD,0x4A,0x00,0x28,0x00,0xD0,0x54,0x70,0x62,0x46,0x00,0x2A,0x5D,0xD1,0x00,0x28, + 0x25,0xD0,0xB9,0x4A,0x92,0x79,0x46,0x2A,0x0E,0xD9,0xAF,0x22,0x92,0x00,0x91,0x42, + 0x0A,0xD2,0xB5,0x4A,0xAF,0x23,0x92,0x6C,0x9B,0x00,0x9A,0x42,0x04,0xD2,0xB2,0x4A, + 0xD3,0x6C,0x96,0x2B,0x00,0xD9,0x54,0x70,0xAF,0x4B,0xDA,0x8B,0x46,0x2A,0x0E,0xD9, + 0xAF,0x22,0x92,0x00,0x91,0x42,0x0A,0xD2,0x1A,0x00,0x92,0x6C,0xAF,0x23,0x9B,0x00, + 0x9A,0x42,0x04,0xD2,0xA8,0x4A,0xD3,0x6C,0x96,0x2B,0x00,0xD9,0x54,0x70,0xA6,0x4A, + 0x52,0x6E,0x14,0x2A,0x0A,0xD9,0xA4,0x4A,0xFF,0x23,0x92,0x6C,0x2D,0x33,0x9A,0x42, + 0x04,0xD2,0xA1,0x4A,0x13,0x6D,0xFA,0x2B,0x00,0xD2,0x54,0x70,0x9E,0x4A,0x93,0x6D, + 0x46,0x2B,0x04,0xD9,0xAF,0x23,0x9B,0x00,0x99,0x42,0x00,0xD2,0x54,0x70,0x00,0x28, + 0x0E,0xD0,0xD0,0x8B,0x32,0x28,0x0B,0xD9,0x50,0x6F,0x32,0x28,0x08,0xD9,0x90,0x79, + 0x46,0x28,0x05,0xD9,0x90,0x6C,0xAF,0x21,0x89,0x00,0x88,0x42,0x00,0xD2,0x54,0x70, + 0x50,0x6F,0x64,0x28,0x1A,0xD9,0x90,0x79,0x64,0x28,0x17,0xD9,0x90,0x6C,0xAF,0x21, + 0x89,0x00,0x88,0x42,0x12,0xD2,0x54,0x70,0x10,0xE0,0x8B,0x49,0x00,0x28,0x0D,0xD0, + 0x4C,0x70,0x0B,0x99,0x89,0x48,0x08,0x22,0x91,0x43,0xC1,0x80,0xC1,0x88,0x52,0x01, + 0x91,0x43,0xC1,0x80,0xC1,0x88,0x10,0x22,0x91,0x43,0xC1,0x80,0x83,0x48,0xC0,0x88, + 0x01,0x07,0x0C,0xD5,0x80,0x4A,0x80,0x32,0x51,0x68,0x49,0x1C,0x32,0x29,0x51,0x60, + 0x08,0xD9,0x7E,0x49,0x08,0x22,0xC8,0x88,0x90,0x43,0xC8,0x80,0xE3,0xE0,0x7A,0x49, + 0x80,0x31,0x4D,0x60,0x40,0x06,0x08,0xD4,0x79,0x48,0x01,0x68,0x46,0x29,0x04,0xD9, + 0x75,0x49,0x05,0x60,0x41,0x20,0x80,0x31,0x88,0x60,0x73,0x4D,0x68,0x78,0x00,0x28, + 0x10,0xD0,0xFB,0xF7,0xD7,0xFB,0xFB,0xF7,0x4F,0xFB,0x01,0x20,0x80,0x03,0xF9,0xF7, + 0x65,0xFD,0xFB,0xF7,0x61,0xFB,0xFB,0xF7,0xCD,0xFB,0xF9,0xF7,0xA7,0xFA,0xFB,0xF7, + 0xF3,0xF8,0x31,0xE0,0x6B,0x48,0x41,0x68,0x09,0x07,0x0C,0xD5,0xC1,0x68,0x00,0x29, + 0x09,0xD0,0xC0,0x68,0x07,0x28,0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0x09,0xE0, + 0x00,0xF0,0x90,0xFA,0x06,0xE0,0x01,0xF0,0x77,0xF9,0xA8,0x7D,0x80,0x28,0x01,0xD1, + 0xFB,0xF7,0x22,0xFA,0xFB,0xF7,0xAE,0xFB,0x5B,0x49,0x80,0x31,0x88,0x68,0x00,0x28, + 0x03,0xD0,0x40,0x1E,0x88,0x60,0xFB,0xF7,0x69,0xFB,0xFB,0xF7,0x1D,0xFB,0x01,0x20, + 0x80,0x03,0xF9,0xF7,0x33,0xFD,0xFB,0xF7,0x2F,0xFB,0x00,0xF0,0x65,0xF9,0x06,0x90, + 0xFB,0xF7,0x98,0xFB,0xF9,0xF7,0x72,0xFA,0x68,0x78,0x00,0x28,0x23,0xD0,0xFB,0xF7, + 0x55,0xFB,0x00,0x22,0x01,0x21,0x10,0x00,0x13,0x00,0xFB,0xF7,0xDB,0xF8,0xFB,0xF7, + 0x45,0xFB,0x49,0x49,0x00,0x20,0x48,0x70,0x08,0x84,0x88,0x71,0xC8,0x70,0xC8,0x83, + 0xC8,0x65,0x08,0x66,0x48,0x66,0x88,0x66,0xC8,0x66,0x08,0x67,0xC8,0x22,0x48,0x67, + 0x0A,0x65,0x42,0x4A,0x88,0x65,0x48,0x72,0xD1,0x88,0x08,0x23,0x99,0x43,0xD1,0x80, + 0x0A,0x99,0xC8,0x62,0x67,0xE0,0x08,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x68,0x7D, + 0x00,0x28,0x01,0xD1,0x00,0xF0,0xBA,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28, + 0x59,0xD1,0x03,0x20,0x40,0x03,0xF9,0xF7,0xE9,0xFC,0x03,0x20,0x01,0xF0,0x3A,0xFA, + 0xA8,0x67,0x03,0x20,0x01,0xF0,0x6C,0xFA,0x80,0x20,0xF9,0xF7,0xDF,0xFC,0x06,0x98, + 0x00,0x28,0x0D,0xD0,0x0A,0x21,0x48,0x43,0xA9,0x6F,0x08,0x1A,0xA8,0x67,0x06,0x98, + 0xFF,0x21,0x41,0x31,0x48,0x43,0xA9,0x6F,0x40,0x18,0xFF,0x38,0x7D,0x38,0xA8,0x67, + 0x29,0x48,0x00,0x78,0xA9,0x7B,0x08,0x43,0x2F,0xD1,0xA8,0x6B,0x00,0x28,0x2C,0xD0, + 0x22,0x48,0xC0,0x88,0x40,0x06,0xA8,0x6F,0x24,0x49,0x0D,0x1A,0xFF,0x20,0x91,0x30, + 0x85,0x42,0x22,0xDD,0xFF,0x20,0x01,0x30,0xF9,0xF7,0xC0,0xFC,0x02,0x20,0x01,0xF0, + 0x3F,0xFA,0x0A,0x21,0x28,0x00,0xF8,0xF7,0x8D,0xFF,0x41,0x11,0x02,0x20,0x01,0xF0, + 0x1F,0xFA,0x04,0x20,0xF9,0xF7,0xEA,0xFC,0x19,0x49,0x88,0x68,0x8A,0x15,0x10,0x43, + 0x88,0x60,0x18,0x48,0x04,0x61,0xFF,0x20,0xF9,0xF7,0xE0,0xFC,0x02,0x20,0x01,0xF0, + 0x27,0xFA,0xFF,0x20,0x01,0x30,0xF9,0xF7,0x99,0xFC,0x0B,0x4D,0x68,0x6A,0x07,0x99, + 0x88,0x42,0x00,0xD2,0x04,0xE5,0x10,0x48,0x10,0x49,0x00,0x68,0x40,0x30,0x40,0x7D, + 0x48,0x76,0x05,0x48,0x40,0x7C,0x00,0x28,0x01,0xD0,0x01,0xF0,0x73,0xFB,0x0D,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x8C,0x05,0x00,0x20,0x40,0x00,0x00,0x20, + 0xFC,0x06,0x00,0x20,0x00,0x40,0x00,0x30,0xF5,0x06,0x00,0x20,0x8C,0x3C,0x00,0x00, + 0x00,0x40,0x00,0x40,0x40,0x00,0x00,0x40,0xF0,0x06,0x00,0x20,0xC0,0x04,0x00,0x20, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47, + 0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x00,0x00,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A, + 0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00, + 0x10,0xB5,0xF9,0xF7,0xC5,0xF8,0x03,0x20,0x40,0x03,0xF9,0xF7,0x47,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xF9,0xF7,0x47,0xFC,0xF9,0xF7, + 0xC1,0xF8,0xFB,0xF7,0x39,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0x85,0xFC,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xF9,0xF7, + 0x63,0xFB,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1, + 0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5,0xA0,0xB0,0x9F,0xE5, + 0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2,0x14,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3, + 0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0, + 0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1, + 0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A, + 0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA, + 0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3, + 0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3, + 0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1, + 0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A, + 0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0x6D,0x06,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0x7C,0x4C,0x00,0x26,0x00,0x96, + 0xE0,0x68,0x07,0x28,0x03,0xD0,0xE0,0x03,0x05,0x68,0x00,0x2D,0x03,0xD1,0x00,0x20, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0xFF,0x20,0x01,0x30,0xF9,0xF7,0xB7,0xFB,0x02,0x20, + 0x01,0xF0,0x36,0xF9,0x00,0xF0,0xF6,0xF8,0x71,0x4F,0x05,0x2D,0xB8,0x7C,0x50,0xD8, + 0x00,0x28,0x50,0xD1,0x01,0x20,0x41,0x07,0x04,0xE0,0x82,0x00,0x52,0x18,0x12,0x68, + 0xE2,0x61,0x40,0x1C,0xA8,0x42,0xF8,0xD9,0x6A,0x48,0x20,0x60,0x21,0x20,0x80,0x02, + 0x20,0x61,0x03,0x20,0xFC,0xF7,0x92,0xFB,0x67,0x48,0x0A,0x21,0x00,0x6B,0xF8,0xF7, + 0x99,0xFF,0x41,0x09,0x02,0x20,0x01,0xF0,0xFB,0xF8,0x64,0x4D,0xE8,0x68,0x40,0x08, + 0x40,0x00,0xE8,0x60,0x02,0x20,0x01,0xF0,0xFB,0xF8,0x04,0x20,0xF9,0xF7,0xBE,0xFB, + 0x5F,0x48,0x01,0x26,0x06,0x61,0x03,0x21,0x09,0x07,0xC8,0x68,0x08,0x22,0x10,0x43, + 0xC8,0x60,0x02,0x20,0x01,0xF0,0xC6,0xF8,0x00,0x90,0x60,0x68,0x60,0x60,0x60,0x69, + 0x60,0x61,0xFC,0xF7,0x7B,0xFD,0x02,0x20,0x01,0xF0,0xF2,0xF8,0x03,0x20,0xFC,0xF7, + 0x55,0xFB,0xE8,0x68,0x30,0x43,0xE8,0x60,0x52,0x48,0x00,0x78,0x00,0x28,0x07,0xD0, + 0x78,0x7C,0x00,0x28,0xFB,0xD0,0xF8,0x6F,0x00,0x04,0x00,0x0C,0x01,0xF0,0x4A,0xFA, + 0x86,0xE0,0x00,0x28,0x03,0xD0,0x6D,0x1C,0xFC,0xF7,0xB2,0xF9,0x06,0x00,0x4A,0x48, + 0x01,0x68,0x42,0x48,0xC1,0x61,0x44,0x48,0x02,0x24,0x00,0x6B,0x0A,0x21,0xF8,0xF7, + 0x51,0xFF,0x01,0x00,0x02,0x20,0x01,0xF0,0xB3,0xF8,0x02,0x20,0x01,0xF0,0xB8,0xF8, + 0x3E,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x39,0x48,0x37,0x4F,0x80,0x7C, + 0x21,0x07,0x1D,0xE0,0x7A,0x69,0x52,0x06,0x0A,0xD4,0x00,0x28,0x01,0xD0,0xAC,0x42, + 0x04,0xD2,0xA2,0x00,0x52,0x18,0x12,0x68,0xFA,0x61,0x00,0xE0,0xFE,0x61,0x64,0x1C, + 0x34,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0,0xFC,0xF7,0x86,0xFA,0x2C,0x48,0x41,0x7C, + 0x00,0x29,0x07,0xD0,0xC0,0x6F,0x00,0x04,0x00,0x0C,0x01,0xF0,0x0B,0xFA,0x01,0xE0, + 0xAC,0x42,0xDF,0xD9,0x02,0x20,0x01,0xF0,0x9B,0xF8,0x2A,0x4D,0x28,0x78,0x00,0x28, + 0x37,0xD1,0xFC,0xF7,0xD9,0xF9,0x00,0x28,0x33,0xD0,0x23,0x48,0x0A,0x21,0x00,0x6B, + 0xF8,0xF7,0x10,0xFF,0x01,0x00,0x02,0x20,0x01,0xF0,0x72,0xF8,0x02,0x20,0x01,0xF0, + 0x77,0xF8,0x1B,0x4C,0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFC,0xF7,0x5C,0xFA, + 0x60,0x7C,0x00,0x28,0x04,0xD0,0xE0,0x6F,0x00,0x04,0x00,0x0C,0x01,0xF0,0xE2,0xF9, + 0xFC,0xF7,0xBA,0xF9,0x00,0x28,0xEE,0xD1,0x78,0x68,0x78,0x60,0x0B,0xE0,0x28,0x78, + 0x00,0x28,0x08,0xD0,0x60,0x7C,0x00,0x28,0x08,0xD0,0xE0,0x6F,0x00,0x04,0x00,0x0C, + 0x01,0xF0,0xD0,0xF9,0x02,0xE0,0x78,0x68,0xC0,0x03,0xF0,0xD5,0x02,0x20,0x01,0xF0, + 0x5F,0xF8,0x00,0xF0,0x1F,0xF8,0x09,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60, + 0xFF,0x20,0x01,0x30,0xF9,0xF7,0xCA,0xFA,0x00,0x98,0x11,0xE7,0x00,0x40,0x00,0x30, + 0x8C,0x05,0x00,0x20,0xD0,0x10,0x05,0x00,0x00,0x93,0x00,0x00,0x00,0x20,0x00,0x40, + 0x40,0x00,0x00,0x40,0xF5,0x06,0x00,0x20,0x04,0x00,0x00,0x20,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21, + 0x01,0x62,0xFC,0xF7,0xBB,0xFC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x70,0x47,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x80,0x18,0x70,0x47,0x00,0x00,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19, + 0x10,0xBC,0x70,0x47,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A, + 0x90,0x75,0x90,0x7D,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9, + 0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21,0x18,0x30,0xF8,0xF7, + 0xA5,0xFE,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x05,0x25,0x08,0x4C,0x2D,0x02, + 0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19, + 0x40,0x1C,0xBE,0x61,0x96,0x7D,0x86,0x42,0xF3,0xD8,0xEA,0xE7,0x40,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0x70,0xB5,0x1F,0x49,0x1D,0x4C,0x0D,0x00,0x20,0x78,0xA9,0x22, + 0xFF,0x35,0x92,0x00,0xDF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0,0x5A,0x22,0x21,0x1D, + 0x28,0x00,0xF8,0xF7,0xAB,0xFE,0x18,0x49,0x09,0x22,0x30,0x00,0xF8,0xF7,0xA6,0xFE, + 0x20,0x78,0x60,0x70,0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21,0x30,0x00, + 0xF8,0xF7,0x6C,0xFE,0x5A,0x22,0x00,0x21,0x28,0x00,0xF8,0xF7,0x67,0xFE,0x0E,0x48, + 0x5A,0x22,0x00,0x21,0x63,0x38,0xF8,0xF7,0x61,0xFE,0x0B,0x48,0x09,0x22,0x00,0x21, + 0x09,0x38,0xF8,0xF7,0x5B,0xFE,0x00,0x21,0x06,0x48,0x61,0x70,0xA1,0x70,0xC2,0x88, + 0x23,0x23,0x9A,0x43,0xC2,0x80,0x05,0x48,0x81,0x70,0xC1,0x70,0xDA,0xE7,0x00,0x00, + 0xC0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0xDB,0x02,0x00,0x20,0xE0,0x04,0x00,0x20, + 0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48,0x00,0x78,0x00,0x28, + 0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8C,0x4A,0x1A,0x26, + 0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E, + 0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F, + 0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91, + 0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49,0x20,0x39,0x8A,0x5E, + 0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22, + 0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60, + 0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E, + 0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x01,0xF0,0xD0,0xF8,0x20,0x8C,0x64,0x21,0x0A,0x90, + 0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38, + 0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28, + 0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x15,0x20,0x08,0x90,0x5D,0x48,0x0E,0x21, + 0x80,0x79,0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21,0x01,0xE0,0x14,0x20, + 0x08,0x90,0x20,0x00,0xF8,0xF7,0x76,0xFC,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90, + 0x08,0x99,0x28,0x00,0xF8,0xF7,0x6E,0xFC,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E, + 0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90, + 0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B, + 0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00, + 0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43, + 0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xF8,0xF7,0x43,0xFC,0xC7,0x19, + 0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00, + 0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xF8,0xF7,0x34,0xFC,0x07,0x99,0xC9,0x07, + 0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0, + 0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB, + 0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21, + 0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98, + 0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99, + 0x49,0x1B,0x89,0x1A,0xF8,0xF7,0x06,0xFC,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1, + 0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B, + 0x64,0x21,0xF8,0xF7,0xF7,0xFB,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB, + 0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60, + 0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99, + 0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x01,0xF0,0x08,0xF8,0x13,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0xA1,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0xE0,0x95,0x00,0x00,0xE0,0x04,0x00,0x20,0xF3,0xB5,0x23,0x4E,0x05,0x68,0x00,0x22, + 0x81,0xB0,0x86,0x46,0x20,0x4B,0x00,0x21,0x2A,0x3B,0x50,0x00,0x1F,0x5A,0x84,0x46, + 0xBD,0x42,0x2F,0xD9,0x1C,0x4B,0x64,0x46,0x0E,0x3B,0x1B,0x5B,0x9D,0x42,0x29,0xD2, + 0x02,0x98,0x4C,0x00,0x03,0x68,0x30,0x5B,0x83,0x42,0x23,0xD9,0x16,0x48,0x2C,0x30, + 0x00,0x5B,0x83,0x42,0x1E,0xD2,0x50,0x00,0x13,0x4A,0x1C,0x3A,0x10,0x5A,0x42,0x00, + 0x80,0x18,0x40,0x19,0x82,0x08,0x70,0x46,0x02,0x60,0x48,0x00,0x0E,0x49,0x16,0x31, + 0x08,0x5A,0x41,0x00,0x02,0x98,0x00,0x68,0x08,0x18,0x03,0x21,0xF8,0xF7,0xC2,0xFC, + 0x09,0x49,0x42,0x31,0x09,0x5F,0x41,0x18,0x02,0x98,0x01,0x60,0x01,0x20,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0x49,0x1C,0x0B,0x29,0xCA,0xD3,0x52,0x1C,0x07,0x2A,0xC1,0xD3, + 0x00,0x20,0xC0,0x43,0xF3,0xE7,0x00,0x00,0x9E,0x8F,0x00,0x00,0xFE,0xB5,0x74,0x4D, + 0x72,0x48,0x00,0x26,0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x7B,0x81,0x31,0x08,0x78, + 0x33,0x00,0x00,0x2A,0x33,0xD1,0x00,0x28,0x31,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43, + 0x47,0x19,0x38,0x00,0xFF,0x30,0x8B,0x30,0xFC,0xF7,0xC6,0xF9,0x00,0x28,0x22,0xD0, + 0x68,0x48,0x00,0x78,0x00,0x28,0x04,0xD0,0x00,0x98,0x40,0x1C,0x02,0x28,0x1D,0xD8, + 0x05,0xE0,0x65,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42,0x16,0xD3,0x00,0x98, + 0xA9,0x19,0x40,0x1C,0x05,0x22,0x00,0x90,0xFF,0x20,0x12,0x02,0x85,0x30,0x89,0x18, + 0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x73,0x76,0x1C,0x85,0x32,0x03,0x20,0x01,0x23, + 0x69,0x46,0x00,0xF0,0x55,0xFA,0x64,0x1C,0x09,0x2C,0xCF,0xDB,0xA0,0xE0,0x49,0x78, + 0x00,0x29,0x01,0xD1,0x00,0x28,0x7E,0xD0,0x0B,0x20,0x80,0x01,0x00,0x24,0x2E,0x18, + 0x05,0x27,0x3F,0x02,0x28,0x19,0xC0,0x19,0x40,0x7B,0x00,0x28,0x3F,0xD0,0x05,0x21, + 0x28,0x18,0xC9,0x01,0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0,0xB2,0x7A,0x00,0x2A, + 0x14,0xD0,0x15,0x21,0x49,0x01,0x40,0x18,0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xDF,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0x26,0xFA,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x8B,0x30,0xFC,0xF7,0x66,0xF9,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x85,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0x0D,0xFA,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x7B,0x40,0x1C, + 0x4A,0x73,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24, + 0x2B,0x49,0x05,0x22,0x08,0x19,0xD2,0x01,0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92, + 0x00,0x28,0x3E,0xD0,0xB2,0x7A,0x00,0x2A,0x3B,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x8B,0x30,0xFC,0xF7,0x37,0xF9,0x00,0x28,0x31,0xD0,0x21,0x48, + 0x00,0x78,0x00,0x28,0x04,0xD0,0x00,0x98,0x40,0x1C,0x02,0x28,0x30,0xD8,0x05,0xE0, + 0x1D,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42,0x29,0xD3,0x18,0x4A,0x00,0x20, + 0x11,0x18,0xC9,0x19,0x49,0x7B,0xA1,0x42,0x0D,0xD0,0x00,0x29,0x08,0xD1,0xFF,0x21, + 0x85,0x31,0x49,0x5D,0x00,0xE0,0x18,0xE0,0x10,0x18,0xC0,0x19,0x41,0x73,0x05,0xE0, + 0x40,0x1C,0x08,0x28,0xEC,0xDB,0x01,0x98,0x00,0x28,0x0A,0xD0,0x00,0x98,0x2A,0x00, + 0x40,0x1C,0xFF,0x32,0x00,0x90,0x85,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0, + 0xB7,0xF9,0x64,0x1C,0x09,0x2C,0xB3,0xDB,0x02,0xE0,0x01,0x20,0x40,0x07,0x43,0x60, + 0x00,0x98,0x00,0xF0,0x51,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x40,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0xA3,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0xFC,0xB5,0x4E,0x48, + 0x4E,0x4F,0x80,0x8B,0x00,0x26,0x0E,0x24,0x05,0x04,0x15,0x20,0x84,0x46,0x4C,0x48, + 0x2D,0x14,0x82,0x7D,0x86,0x46,0x4B,0x48,0x81,0x79,0xC8,0x07,0x05,0xD0,0x88,0x07, + 0x01,0xD5,0x0D,0x24,0x01,0xE0,0x14,0x20,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20, + 0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42, + 0x19,0xD3,0x63,0x46,0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3, + 0x8B,0x42,0x03,0xD2,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x0B,0x00,0x63,0x43, + 0x1B,0x18,0x9B,0x00,0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00, + 0xAB,0x42,0x00,0xDA,0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45, + 0xD5,0xD3,0x1E,0x24,0x70,0x46,0x04,0x5F,0x2D,0x4B,0x2F,0x48,0x20,0x33,0xC0,0x88, + 0x06,0x22,0x9A,0x5E,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04, + 0x10,0x1A,0x24,0x14,0x02,0x04,0x12,0x14,0x26,0x48,0x60,0x30,0x81,0x6B,0xA6,0x42, + 0x05,0xDD,0x74,0x46,0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29, + 0x01,0xDD,0x49,0x1E,0x81,0x63,0x1F,0x49,0x60,0x31,0xC9,0x6B,0x95,0x42,0x04,0xDA, + 0x5A,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E, + 0xC1,0x63,0x74,0x46,0xA4,0x8B,0x85,0x6B,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC, + 0x00,0x21,0x9B,0x88,0xC0,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46, + 0x18,0x70,0x59,0x70,0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20, + 0x6B,0x46,0x11,0x43,0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46, + 0x18,0x71,0x70,0x46,0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20, + 0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x8C,0x05,0x00,0x20,0xD4,0x02,0x10,0x40, + 0x80,0x93,0x00,0x00,0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x34,0x4D, + 0x01,0x21,0x2C,0x00,0xFF,0x34,0x81,0x34,0x20,0x6A,0x49,0x05,0x88,0x43,0x86,0x46, + 0x09,0x20,0x80,0x01,0x29,0x18,0x48,0x6B,0xFF,0x27,0x84,0x46,0xA8,0x6A,0x41,0x37, + 0x2A,0x4E,0x78,0x43,0xF3,0x7D,0xE2,0x69,0x00,0x2B,0x0D,0xD0,0x29,0x4B,0x2A,0x49, + 0x4B,0x61,0x2A,0x4B,0x8B,0x61,0x73,0x46,0xCB,0x61,0x29,0x4B,0x0B,0x62,0xCA,0x60, + 0x62,0x46,0x0A,0x61,0x27,0x4A,0x27,0xE0,0x27,0x4B,0xDB,0x88,0x5B,0x06,0x16,0xD5, + 0x21,0x48,0x8A,0x69,0x42,0x61,0xCA,0x69,0x82,0x61,0x4A,0x6A,0x01,0x23,0x5B,0x05, + 0x9A,0x43,0xC2,0x61,0x8A,0x6A,0x02,0x62,0x0A,0x6A,0xC2,0x60,0x89,0x6B,0x01,0x61, + 0x1E,0x49,0x81,0x62,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x0D,0xE0,0x16,0x49, + 0x63,0x69,0x4B,0x61,0xA3,0x69,0x8B,0x61,0x73,0x46,0xCB,0x61,0x63,0x6A,0x0B,0x62, + 0xCA,0x60,0x62,0x46,0x0A,0x61,0x16,0x4A,0x8A,0x62,0x16,0x49,0xF8,0xF7,0xC2,0xFA, + 0xB0,0x63,0x70,0x7D,0x00,0x28,0x05,0xD0,0x13,0x49,0x0B,0x48,0xC1,0x60,0x01,0x21, + 0x09,0x05,0x01,0x61,0x68,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x0D,0x49,0xF8,0xF7, + 0xB1,0xFA,0x70,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x8C,0x05,0x00,0x20, + 0x00,0x93,0x00,0x00,0x90,0x01,0x50,0x00,0xC0,0x90,0x00,0x40,0x20,0x03,0x58,0x02, + 0x10,0x3F,0x10,0x3F,0x00,0x00,0x01,0x80,0x40,0x00,0x00,0x20,0x00,0x00,0x08,0x84, + 0x00,0x00,0x04,0x82,0x10,0x27,0x00,0x00,0x41,0x40,0x01,0x00,0x07,0x48,0x41,0x78, + 0x07,0x48,0x02,0x29,0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29,0x01,0xD1,0xC0,0x69, + 0x00,0xE0,0x80,0x69,0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00,0xC0,0x01,0x00,0x20, + 0xC0,0x94,0x00,0x00,0xC0,0x90,0x00,0x40,0x16,0x48,0x30,0xB4,0xC5,0x7D,0x01,0x22, + 0x15,0x4C,0x16,0x4B,0x16,0x48,0x00,0x21,0x12,0x04,0x00,0x2D,0x09,0xD0,0x03,0x61, + 0x44,0x61,0x53,0x10,0x83,0x61,0x13,0x4B,0xC3,0x61,0x02,0x62,0x0E,0x4A,0xFA,0x3A, + 0x12,0xE0,0x11,0x4D,0xED,0x88,0x03,0x61,0x6D,0x06,0x05,0xD5,0x44,0x61,0x81,0x61, + 0xC1,0x61,0x02,0x62,0x44,0x62,0x08,0xE0,0x07,0x4B,0x64,0x3B,0x43,0x61,0x81,0x61, + 0xC1,0x61,0x02,0x62,0x04,0x4A,0xC8,0x3A,0x42,0x62,0x81,0x62,0xC1,0x62,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x8C,0x05,0x00,0x20,0x2C,0x01,0x01,0x00,0x00,0x00,0x01,0x03, + 0x40,0xA1,0x00,0x40,0x64,0x80,0x00,0x00,0x40,0x00,0x00,0x20,0x10,0x49,0x10,0xB4, + 0x0A,0x7D,0x10,0x48,0x82,0x71,0x4A,0x7D,0xC2,0x71,0x82,0x79,0x0E,0x48,0xD3,0x07, + 0x0A,0xD0,0x93,0x07,0x0D,0x4A,0x03,0xD5,0x0D,0x23,0x03,0x75,0x00,0x23,0x02,0xE0, + 0x14,0x23,0x03,0x75,0x01,0x23,0x53,0x73,0x8A,0x7D,0x42,0x75,0xCA,0x7D,0x82,0x75, + 0x0A,0x7E,0xC2,0x75,0x4A,0x7E,0x02,0x76,0x89,0x7E,0x41,0x76,0x10,0xBC,0x70,0x47, + 0x00,0x93,0x00,0x00,0xE0,0x04,0x00,0x20,0x00,0x05,0x00,0x20,0x8C,0x05,0x00,0x20, + 0xFF,0xB5,0x05,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0x81,0xB0,0xF9,0xF7,0x52,0xFC, + 0x00,0x28,0x08,0xD0,0x02,0x98,0x02,0x99,0x00,0x68,0x40,0x1E,0x08,0x60,0x05,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x29,0x48,0x80,0x79,0xC0,0x07,0x23,0xD0,0xE0,0x79, + 0x05,0x28,0x1E,0xD0,0x09,0x28,0x1E,0xD1,0x6D,0x08,0x6D,0x00,0x23,0x78,0x24,0x4F, + 0x01,0x20,0x12,0xE0,0x0A,0x21,0x41,0x43,0x22,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32, + 0xC1,0x32,0x96,0x7F,0xB3,0x42,0x07,0xD1,0xFF,0x31,0xE1,0x31,0x0E,0x88,0x66,0x80, + 0xD2,0x7F,0x62,0x70,0x49,0x88,0xA1,0x80,0x40,0x1C,0x79,0x78,0x81,0x42,0xE9,0xDA, + 0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x21,0xA8,0x07,0x89,0x06,0x88,0x43,0x21,0x78, + 0x62,0x78,0x09,0x07,0x89,0x08,0x08,0x43,0x13,0x49,0x92,0x06,0x08,0x40,0x61,0x88, + 0x12,0x0C,0x89,0x05,0x89,0x09,0x08,0x43,0x3F,0x21,0x89,0x02,0x88,0x43,0x10,0x43, + 0x02,0x04,0x92,0x0E,0x0F,0x2A,0x03,0xD9,0x88,0x43,0x0F,0x21,0x89,0x02,0x40,0x18, + 0xA1,0x88,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x02,0x99,0x01,0x22, + 0x09,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60,0xA8,0xE7,0xE0,0x04,0x00,0x20, + 0xC0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x00,0x28,0x07,0xD0, + 0x04,0x48,0x05,0x49,0x00,0x22,0x08,0xC8,0x52,0x1C,0x08,0xC1,0x15,0x2A,0xFA,0xD3, + 0x70,0x47,0x00,0x00,0x20,0x8F,0x00,0x00,0x78,0x08,0x10,0x40,0x10,0x49,0x10,0xB5, + 0x88,0x7D,0x00,0x28,0x14,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28, + 0x0B,0xD0,0x80,0x28,0x0C,0xD1,0x8A,0x74,0xCA,0x74,0x0A,0x48,0x0A,0x75,0x0A,0x74, + 0x00,0x78,0x00,0x28,0x07,0xD1,0x4B,0x75,0x06,0xE0,0xCB,0x73,0x0A,0x74,0x4B,0x74, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x75,0x00,0x20,0x00,0xF0,0x0D,0xFA,0xF7,0xE7, + 0x8C,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0xF0,0x41,0x2D,0xE9,0x00,0xC0,0xA0,0xE1, + 0x1C,0x50,0x9D,0xE5,0x18,0x60,0x9D,0xE5,0x01,0x00,0x5C,0xE1,0x01,0x40,0xA0,0xE1, + 0x02,0x00,0xA0,0xE1,0x03,0x70,0xA0,0xE1,0x06,0x00,0x00,0x3A,0x04,0x10,0xA0,0xE1, + 0x18,0xE0,0xFF,0xEB,0xB0,0x00,0xC6,0xE1,0x04,0x10,0xA0,0xE1,0x07,0x00,0xA0,0xE1, + 0x14,0xE0,0xFF,0xEB,0xB0,0x00,0xC5,0xE1,0xF0,0x41,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0xF0,0x47,0x2D,0xE9,0x00,0x40,0xA0,0xE1,0x20,0x80,0x8D,0xE2,0x28,0x60,0x8D,0xE2, + 0x01,0x01,0x98,0xE8,0x60,0x00,0x96,0xE8,0x02,0x00,0x51,0xE1,0xB2,0x50,0xC4,0xB1, + 0xB4,0x60,0xC4,0xB1,0x11,0x00,0x00,0xBA,0x03,0x00,0x51,0xE1,0xB2,0x00,0xC4,0xA1, + 0xB4,0x80,0xC4,0xA1,0x0D,0x00,0x00,0xAA,0x02,0x70,0x41,0xE0,0x05,0x00,0x40,0xE0, + 0x97,0x00,0x00,0xE0,0x02,0x90,0x43,0xE0,0x09,0x10,0xA0,0xE1,0xFD,0xDF,0xFF,0xEB, + 0x05,0x00,0x80,0xE0,0xB2,0x00,0xC4,0xE1,0x06,0x00,0x48,0xE0,0x97,0x00,0x00,0xE0, + 0x09,0x10,0xA0,0xE1,0xF7,0xDF,0xFF,0xEB,0x06,0x00,0x80,0xE0,0xB4,0x00,0xC4,0xE1, + 0xF0,0x47,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x30,0xB4,0x8A,0x79,0x12,0x4B,0x00,0x25, + 0x12,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5C,0x07,0x06,0xD5, + 0x0E,0x4C,0xA4,0x89,0x00,0x2C,0x02,0xD0,0xA4,0x05,0xA4,0x0D,0x22,0x43,0x3F,0x24, + 0xA4,0x02,0x9B,0x06,0xA2,0x43,0x1B,0x0C,0x1A,0x43,0x01,0x23,0x80,0x00,0x5B,0x07, + 0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21, + 0xC1,0x70,0x05,0x71,0x30,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20, + 0xE0,0x04,0x00,0x20,0x00,0xB5,0x0E,0x28,0x0B,0xDA,0x0B,0x28,0x09,0xDD,0x0C,0x28, + 0x01,0xD0,0x0D,0x28,0x05,0xD1,0x04,0x49,0xE1,0x20,0x80,0x00,0x48,0x83,0xFC,0xF7, + 0xD1,0xF8,0x08,0xBC,0x18,0x47,0x00,0x00,0x8C,0x05,0x00,0x20,0x30,0xB4,0x0E,0x25, + 0x68,0x43,0x0B,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E, + 0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E, + 0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0x10,0xB4,0x0E,0x24,0x60,0x43,0x03,0x4B,0x40,0x18,0x40,0x00, + 0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x0E,0x23,0x58,0x43, + 0x30,0xB4,0x0B,0x4C,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18, + 0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E, + 0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0x70,0xB4,0x12,0x4A,0x11,0x4D,0x52,0x7D,0x00,0x21,0x20,0x3D, + 0x14,0x02,0x14,0x43,0x0E,0x22,0x50,0x43,0x0C,0x4B,0x86,0x18,0x12,0xE0,0xAA,0x7D, + 0x8A,0x42,0x0D,0xD0,0xEA,0x7D,0x8A,0x42,0x0A,0xD0,0x2A,0x7E,0x8A,0x42,0x07,0xD0, + 0x6A,0x7E,0x8A,0x42,0x04,0xD0,0xAA,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0x9C,0x52, + 0x40,0x1C,0x49,0x1C,0x86,0x42,0xEA,0xD8,0x70,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0x20,0x93,0x00,0x00,0x70,0xB4,0x12,0x4A,0x11,0x4B,0x52,0x7D,0x00,0x21,0x20,0x3B, + 0x15,0x02,0x15,0x43,0xFF,0x26,0x0D,0x4C,0x27,0x36,0x12,0xE0,0x9A,0x7D,0x8A,0x42, + 0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E, + 0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52,0x0E,0x30, + 0x49,0x1C,0xB0,0x42,0xEA,0xD3,0x70,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x20,0x93,0x00,0x00,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1, + 0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x05,0x48,0x07,0x49, + 0xC0,0x88,0x42,0x06,0x04,0x48,0x01,0xD5,0x40,0x68,0x00,0xE0,0x00,0x68,0x48,0x60, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xC0,0x93,0x00,0x00,0x00,0x90,0x00,0x40, + 0xF0,0xB5,0x03,0x00,0x22,0x49,0x05,0x20,0xC0,0x01,0x0C,0x18,0x0B,0x20,0x80,0x01, + 0x0D,0x18,0xC0,0x31,0x1D,0x4A,0x4F,0x6A,0x0E,0x6A,0x88,0x6A,0x00,0xF0,0x2C,0xFB, + 0x07,0x05,0x0B,0x15,0x19,0x21,0x25,0x2C,0x12,0x00,0xC8,0x68,0x10,0x62,0x60,0x6B, + 0x50,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x10,0x62,0x68,0x68,0x50,0x62,0x04,0x20, + 0xD0,0x62,0x56,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x08,0x69,0x10,0x62,0xA0,0x6B, + 0x02,0xE0,0x48,0x69,0x10,0x62,0xE0,0x6B,0x50,0x62,0x04,0x20,0xD0,0x62,0x57,0x63, + 0xF0,0xE7,0x0C,0x49,0x11,0x62,0x24,0x21,0x02,0xE0,0x89,0x69,0x11,0x62,0x29,0x68, + 0x51,0x62,0x05,0x21,0xD1,0x62,0x07,0xE0,0x06,0x48,0x10,0x62,0x26,0x20,0x50,0x62, + 0x05,0x20,0xD0,0x62,0xF5,0x20,0x00,0x01,0x50,0x63,0xDB,0xE7,0x80,0x90,0x00,0x40, + 0x00,0x93,0x00,0x00,0x01,0x02,0x00,0x00,0x70,0xB4,0x01,0x23,0x5B,0x07,0x58,0x68, + 0x59,0x68,0xC0,0x02,0xC0,0x0E,0x09,0x02,0x4C,0x0F,0x18,0x49,0x01,0x26,0x00,0x22, + 0x00,0x2C,0x10,0xD0,0xCC,0x7A,0x35,0x00,0x00,0x2C,0x00,0xD0,0x00,0x25,0x85,0x42, + 0x07,0xD0,0x45,0x08,0x64,0x08,0xA5,0x42,0x03,0xD1,0xC8,0x72,0x1A,0x60,0x70,0xBC, + 0x70,0x47,0xC8,0x72,0x00,0xE0,0xCA,0x72,0x58,0x68,0x00,0x04,0x00,0x0F,0x58,0x68, + 0x03,0xD0,0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E,0x01,0xD0, + 0x01,0x20,0x07,0xE0,0x88,0x7A,0x00,0x28,0x02,0xD1,0x01,0x20,0x8E,0x72,0x02,0xE0, + 0x0F,0x22,0x00,0x20,0x8A,0x72,0x18,0x60,0xE1,0xE7,0x00,0x00,0x8C,0x05,0x00,0x20, + 0x70,0xB5,0x12,0x48,0x04,0x68,0xE0,0x07,0x05,0xD0,0x11,0x48,0x00,0x7E,0x00,0x28, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x00,0xF0,0x1E,0xF8,0x0D,0x4D,0x60,0x07, + 0x08,0xD5,0x01,0x20,0xFF,0xF7,0xDA,0xFD,0x01,0x20,0xE8,0x75,0x00,0x20,0x00,0xF0, + 0x13,0xF8,0x04,0xE0,0x00,0x20,0xFF,0xF7,0xD1,0xFD,0x00,0x20,0xE8,0x75,0x20,0x0C, + 0xFF,0xF7,0x90,0xFE,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x0C,0x06,0x00,0x20, + 0xA0,0x93,0x00,0x00,0x8C,0x05,0x00,0x20,0x0A,0x4A,0x10,0xB5,0xD1,0x88,0x0A,0x4B, + 0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43,0x08,0x48,0xD1,0x80,0x03,0xE0,0x07,0x48, + 0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60,0xFF,0xF7,0x48,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xF0,0x06,0x00,0x20,0xB0,0x94,0x00,0x00, + 0xFE,0xB5,0x04,0x00,0x39,0x48,0x07,0x6A,0x41,0x6A,0x02,0x91,0x41,0x6B,0x01,0x91, + 0xC0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x23,0xFF,0xFA,0xF7,0x6F,0xF9,0x34,0x4E, + 0x25,0x00,0x42,0xE0,0x68,0x1E,0x84,0x42,0x01,0xD1,0xFA,0xF7,0x91,0xF9,0xFA,0xF7, + 0x33,0xF9,0xFA,0xF7,0x9F,0xF9,0xF0,0x7D,0x00,0x28,0x07,0xD0,0x68,0x00,0xA0,0x42, + 0x29,0xD9,0x01,0x22,0x11,0x00,0x00,0x20,0x02,0x23,0x2C,0xE0,0xA8,0x00,0x05,0x21, + 0xF7,0xF7,0x28,0xFF,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0xF3,0xE7, + 0x68,0x00,0x28,0x18,0x05,0x21,0xF7,0xF7,0x1D,0xFF,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x03,0x20,0xE8,0xE7,0x68,0x00,0x05,0x21,0xF7,0xF7,0x13,0xFF,0xA0,0x42, + 0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0xDE,0xE7,0x05,0x21,0x28,0x00,0xF7,0xF7, + 0x09,0xFF,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x10,0x00,0xD4,0xE7,0x01,0x22, + 0x11,0x00,0x00,0x20,0x13,0x00,0xF9,0xF7,0xB5,0xFE,0x64,0x1E,0xBA,0xD2,0x11,0x48, + 0x44,0x88,0x03,0xE0,0xFA,0xF7,0xF0,0xF8,0xFA,0xF7,0x5C,0xF9,0x64,0x1E,0xF9,0xD2, + 0xFA,0xF7,0x14,0xF9,0x09,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63, + 0x00,0x99,0xC1,0x62,0x00,0x20,0x30,0x84,0xB0,0x71,0xF0,0x70,0xC8,0x21,0xF0,0x83, + 0x31,0x65,0x30,0x71,0x70,0x71,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x80,0x90,0x00,0x40, + 0x8C,0x05,0x00,0x20,0xE0,0x95,0x00,0x00,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C, + 0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E, + 0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60, + 0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x93,0x00,0x00,0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xF5,0x06,0x00,0x20, + 0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B, + 0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x05,0x49,0x00,0x03,0x40,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60, + 0x02,0x49,0x00,0x20,0x08,0x70,0x70,0x47,0x00,0x20,0x00,0x40,0xF5,0x06,0x00,0x20, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x13,0x49,0x01,0x22,0x09,0x78,0x52,0x07, + 0x00,0x29,0x03,0xD0,0x02,0x28,0x06,0xD9,0x02,0x20,0x15,0xE0,0x0F,0x49,0x89,0x7B, + 0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0xA3,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0x38,0xB5,0x00,0x24,0x71,0x20,0x6B,0x46,0x00,0x94,0xD8,0x70,0x00,0x98,0x01,0x25, + 0x6D,0x07,0x68,0x60,0x0D,0x48,0x09,0x22,0x21,0x00,0xF7,0xF7,0x5F,0xFE,0x0B,0x48, + 0x09,0x22,0x00,0x21,0x09,0x38,0xF7,0xF7,0x59,0xFE,0x08,0x49,0x0D,0x39,0x88,0x7D, + 0x00,0x28,0x08,0xD0,0x00,0x20,0x03,0xE0,0x82,0x00,0x52,0x19,0x94,0x60,0x40,0x1C, + 0x8A,0x7D,0x82,0x42,0xF8,0xDC,0x38,0xBC,0x08,0xBC,0x18,0x47,0x4D,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00,0x01,0x21,0x89,0xB0,0x49,0x07,0x08,0x94, + 0x4F,0x68,0x61,0x4E,0xB9,0x0F,0x89,0x07,0x7E,0xD5,0x20,0x22,0x00,0x21,0x68,0x46, + 0xF7,0xF7,0x34,0xFE,0x07,0x21,0xB8,0x01,0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00, + 0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43,0x08,0x90,0x00,0x20,0x33,0xE0,0x01,0x22, + 0x81,0x00,0x52,0x07,0x89,0x18,0x89,0x68,0x8E,0x00,0x32,0x0F,0x2A,0xD0,0x32,0x0F, + 0x94,0x46,0x92,0x00,0x6B,0x46,0xD2,0x18,0x40,0x3A,0xD3,0x6B,0x36,0x0F,0x1B,0x01, + 0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27,0x3F,0x06,0x0E,0x04,0xB6,0x08,0xBB,0x43, + 0x3E,0x40,0x33,0x43,0x49,0x4E,0x33,0x40,0x8E,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43, + 0x1B,0x0B,0x89,0x05,0x1B,0x03,0x89,0x0D,0x0B,0x43,0xD3,0x63,0x62,0x46,0x52,0x1E, + 0x01,0x23,0x93,0x40,0x9A,0x05,0x92,0x0D,0x71,0x46,0x11,0x43,0x6D,0x1C,0x2D,0x06, + 0x2D,0x0E,0x08,0x91,0x40,0x1C,0x08,0x99,0x8E,0x46,0x09,0x04,0x09,0x0F,0x81,0x42, + 0xC5,0xD8,0x08,0x98,0x01,0x27,0x00,0x04,0x00,0x0F,0x7B,0x07,0x0F,0xE0,0x82,0x00, + 0xD2,0x18,0x92,0x68,0x3E,0x00,0x92,0x00,0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06, + 0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06,0x24,0x0E,0x40,0x1C,0x08,0x91,0x08,0x99, + 0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F,0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x21, + 0x08,0x00,0x6E,0x46,0x82,0x00,0xB2,0x58,0x00,0x2A,0x03,0xD0,0x8F,0x00,0xFF,0x18, + 0xBA,0x60,0x49,0x1C,0x40,0x1C,0x08,0x28,0xF4,0xD3,0x23,0x49,0x08,0x98,0x88,0x43, + 0x29,0x07,0x09,0x0C,0x08,0x43,0x00,0xE0,0x07,0xE0,0x07,0x21,0x49,0x05,0x88,0x43, + 0x61,0x07,0x09,0x0A,0x08,0x43,0x08,0x90,0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0, + 0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C,0x82,0x00,0x11,0x0F,0x09,0x07,0x21,0x40, + 0x84,0x01,0xA4,0x0D,0x24,0x03,0x21,0x43,0x84,0x05,0x09,0x0B,0x09,0x03,0xA4,0x0D, + 0x21,0x43,0x0F,0x24,0x24,0x06,0x00,0x04,0x80,0x08,0xA1,0x43,0x20,0x40,0x01,0x43, + 0x08,0x0F,0x09,0xD0,0x12,0x0F,0x52,0x1E,0x01,0x20,0x90,0x40,0x80,0x05,0x80,0x0D, + 0xB0,0x43,0x5A,0x14,0x80,0x18,0x08,0x90,0x99,0x60,0x02,0xE0,0x01,0x21,0x49,0x07, + 0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x70,0x08,0x99,0x40,0x07,0x41,0x60,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF, + 0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00, + 0xF7,0xF7,0x72,0xFD,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23,0xF7,0xF7,0x74,0xFD, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0x02,0x4B,0x58,0x60, + 0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5, + 0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xF4,0x06,0x00,0x20, + 0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47,0x01,0x21,0x89,0x07, + 0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC, + 0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD, + 0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD, + 0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5, + 0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF7,0xF7,0x3F,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x18,0x18,0x18,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x3F,0x01,0x00,0x4B,0x00,0x95,0x00,0xD5,0x00,0x0C,0x01,0x4D,0x01, + 0x97,0x01,0x25,0x00,0x6F,0x00,0xB9,0x00,0xF0,0x00,0x27,0x01,0x71,0x01,0xBB,0x01, + 0x49,0x00,0x93,0x00,0xD4,0x00,0x0B,0x01,0x4B,0x01,0x95,0x01,0xDF,0x01,0x01,0x00, + 0x46,0x00,0x92,0x00,0xDE,0x00,0x2A,0x01,0x6D,0x01,0xA6,0x01,0xE9,0x01,0x35,0x02, + 0x81,0x02,0xCD,0x02,0x20,0x00,0x6C,0x00,0xB8,0x00,0x04,0x01,0x50,0x01,0x89,0x01, + 0xC2,0x01,0x0E,0x02,0x5A,0x02,0xA6,0x02,0xF2,0x02,0x45,0x00,0x91,0x00,0xDD,0x00, + 0x29,0x01,0x6B,0x01,0xA4,0x01,0xE7,0x01,0x33,0x02,0x7F,0x02,0xCB,0x02,0x17,0x03, + 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0xFF,0xFD,0xFF,0xFC,0xFF, + 0x00,0x00,0xFE,0xFF,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00, + 0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x89,0x08,0x49,0x1E,0x49,0x04,0x01,0x22, + 0x49,0x08,0xD2,0x07,0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43,0x03,0x48,0x41,0x61, + 0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2, + 0x01,0x10,0xC0,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0xB2,0x10,0xC0,0xE0,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2, + 0x04,0x10,0x80,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0x1E,0xFF,0x2F,0x31,0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x70,0x20,0x9F,0xE5,0x30,0x00,0x2D,0xE9, + 0x64,0xC0,0x9F,0xE5,0x00,0x00,0x92,0xE5,0x64,0x40,0x9F,0xE5,0x64,0x30,0x9F,0xE5, + 0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x11,0x92,0xE7,0x80,0x50,0x84,0xE0, + 0xB0,0x10,0xC5,0xE1,0x00,0x11,0x9C,0xE7,0x80,0x50,0x83,0xE0,0x01,0x00,0x50,0xE2, + 0xB0,0x10,0xC5,0xE1,0xF7,0xFF,0xFF,0x5A,0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x24,0x20,0x9F,0xE5,0x30,0x10,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2, + 0x00,0x31,0x92,0xE7,0x80,0xC0,0x81,0xE0,0x23,0x38,0xA0,0xE1,0x01,0x00,0x50,0xE2, + 0xB0,0x30,0xCC,0xE1,0xF9,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40, + 0x00,0x10,0x10,0x40,0x08,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x15,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0xC8,0x32,0x00,0x00,0x8C,0x3C,0x00,0x00,0x8C,0x3C,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0xE8,0x03,0x1A,0x04,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x78,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x66,0x00,0x67,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x14,0x00,0x00,0x00,0x00,0x00, + 0x05,0x02,0x05,0x0A,0x01,0x01,0x04,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x80,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9F,0xB9,0x5E,0x01, + 0x01,0x00,0x14,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00,0x32,0x00,0x05,0x00, + 0x19,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x90,0x01,0x90,0x01,0x90,0x01, + 0x2C,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x0A,0x01,0x32,0x00,0x88,0x13,0xE8,0x03,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0x96, + 0x96,0x96,0xB4,0x00,0xFF,0x0F,0x90,0x01,0x50,0x00,0x0A,0x00,0xFF,0xFF,0x14,0x96, + 0x00,0x05,0x04,0x0A,0x0A,0x06,0xF4,0x01,0x3C,0x00,0x03,0x23,0x00,0x02,0x14,0x00, + 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x02,0x01,0x00,0x02,0x04,0x03,0x00,0x05,0x05,0x0A,0x0A, + 0x0F,0x0F,0x14,0x14,0x64,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0x42,0x01,0x00, + 0x18,0x18,0x88,0x00,0x30,0x7F,0x10,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x9F,0x99,0x5E,0x01,0x01,0x00,0x14,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00, + 0x96,0x00,0x14,0x00,0x32,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x90,0x01, + 0x90,0x01,0x90,0x01,0x90,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x0A,0x01,0x32,0x00,0x88,0x13,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x90,0x01,0xC8,0x00,0x1E,0x00, + 0xFA,0xFA,0x0D,0xA0,0x00,0x05,0x04,0x0A,0x02,0x06,0xE8,0x03,0x3C,0x00,0x03,0x28, + 0x00,0x02,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x06,0x01,0x02,0x01,0x00,0x03,0x04,0x03,0x00, + 0x05,0x05,0x0A,0x0A,0x0F,0x0F,0x14,0x14,0x64,0x5A,0x01,0x00,0x03,0x00,0x00,0x00, + 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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x22,0x01,0x00,0x10,0x10,0x88,0x00,0x30,0x7F,0x10,0x3F,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x8C,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x2C,0x01,0x00,0x00,0x2C,0x01,0x5E,0x01,0x00,0x00, + 0x21,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x28,0x00,0x00,0x00, + 0x25,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0A,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x32,0x00,0x50,0x00,0x32,0x00,0x50,0x00,0x0A,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00, + 0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x1C,0x1C,0xA8,0x00, + 0x30,0x3F,0x30,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x04,0x81,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x20, + 0x11,0x30,0x10,0x00,0x61,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x01,0x03,0x02,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x37,0x20,0x07,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x03,0xC8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26, + 0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x3F, + 0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x3F,0x26,0x26, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x3F,0x26,0x26,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x26,0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x26,0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26, + 0x26,0x3F,0x26,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x26,0x3F, + 0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x3F,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x3F,0x28,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x28,0x3F,0x2C,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x22,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x26,0x26,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x14,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0xA1,0x5F, + 0x21,0x2C,0xA2,0x5F,0x42,0xBC,0xA2,0x5F,0x63,0x28,0xA3,0x5F,0x84,0xB8,0xA3,0x5F, + 0xA5,0x24,0xA4,0x5F,0xC6,0xB4,0xA4,0x5F,0xE7,0x20,0xA5,0x5F,0x08,0xB1,0xA5,0x5F, + 0x29,0x9D,0xA8,0x5F,0x4A,0x01,0xA9,0x5F,0x6B,0x99,0xA9,0x5F,0x8C,0x05,0xAA,0x5F, + 0xAD,0x95,0xAA,0x5F,0xCE,0x09,0xA0,0x5F,0xEF,0x11,0xA0,0x5F,0x10,0x0E,0xA0,0x5F, + 0x31,0x46,0xA0,0x5F,0x52,0x52,0xA0,0x5F,0x73,0x4A,0xA0,0x5F,0x94,0x4E,0xA0,0x5F, + 0xB5,0x02,0xA0,0x5F,0xD6,0x02,0xA0,0x5F,0xF7,0x02,0xA0,0x5F,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x6F,0x68,0x07,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x60,0x30,0x60,0x30, + 0x00,0x00,0x00,0x00,0x57,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0x0B,0x00,0xBE,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140225.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140225.h new file mode 100644 index 00000000..7eff4e55 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140225.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS MELFAS, f/w 1(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x00,0x00,0x00,0x10,0x94,0x02,0x00,0x00,0xEC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61, + 0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4, + 0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22, + 0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2, + 0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06, + 0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF, + 0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21, + 0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06, + 0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x07,0xF0,0x30,0xFA,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x4C,0x07,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x55,0xFD,0x07,0x00,0x03,0xF0,0x48,0xFC,0x03,0xF0,0x3A,0xFC, + 0x03,0xF0,0xC4,0xFC,0x47,0x4A,0x48,0x49,0x48,0x48,0x05,0xF0,0x7D,0xF9,0x48,0x4D, + 0x00,0x26,0x05,0x21,0x49,0x03,0x30,0x00,0x2E,0x82,0x00,0xF0,0xEF,0xF9,0xA8,0x61, + 0x44,0x49,0x00,0x20,0x00,0xF0,0xEA,0xF9,0x43,0x4B,0x44,0x49,0xD8,0x63,0x44,0x48, + 0x00,0xF0,0xE4,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x82,0xFC, + 0x40,0x4A,0x41,0x48,0x00,0x21,0x05,0xF0,0x71,0xF9,0x06,0xF0,0x07,0xFD,0x03,0xF0, + 0x29,0xFD,0x3E,0x48,0x01,0x24,0x81,0x7A,0x64,0x07,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0x6E,0x71,0x6E,0x72,0xAE,0x72,0xEE,0x72,0x36,0x48,0x2E,0x73, + 0x6E,0x73,0x60,0x63,0xFF,0x20,0xE0,0x63,0xE0,0x14,0x00,0xF0,0xED,0xFC,0x34,0x48, + 0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0xE7,0xFC,0x32,0x49,0x02,0x20,0x06,0xF0, + 0xED,0xFF,0x02,0x20,0x06,0xF0,0xF2,0xFF,0x28,0x7A,0x00,0x28,0x01,0xD0,0x07,0xF0, + 0x6D,0xF9,0x00,0x2F,0x1F,0xD1,0x2C,0x4F,0xBE,0x15,0x28,0x7A,0x00,0x28,0x02,0xD0, + 0x2A,0x49,0x28,0x6B,0x88,0x60,0xE0,0x6B,0x0B,0x28,0x14,0xD0,0x28,0x48,0x40,0x68, + 0x00,0x07,0x01,0xD5,0x02,0xF0,0xFC,0xFA,0xF8,0x68,0x26,0x49,0x88,0x42,0xEC,0xD9, + 0x25,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB8,0x68,0xB0,0x43,0xB8,0x60,0xB8,0x68, + 0x30,0x43,0xB8,0x60,0xE1,0xE7,0xE8,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02, + 0x00,0xF0,0xAA,0xFC,0x28,0x7A,0x00,0x28,0x01,0xD0,0x07,0xF0,0x47,0xF9,0x02,0x20, + 0x06,0xF0,0xC8,0xFF,0xFF,0x20,0x81,0x30,0x00,0xF0,0x9E,0xFC,0x17,0x49,0x05,0x20, + 0x03,0xF0,0x6A,0xFA,0x0B,0x20,0xE0,0x63,0x03,0xF0,0x00,0xFB,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x28,0x00,0x00,0x00,0xDC,0x79,0x00,0x00,0x00,0x00,0x00,0x10, + 0x14,0x07,0x00,0x20,0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20,0x00,0x9D,0x00,0x00, + 0x00,0x93,0x00,0x00,0xD4,0x06,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0xD1,0x07,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40, + 0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00,0x11,0x75,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3, + 0xA0,0x30,0x71,0xE0,0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x34,0x00,0x00,0x3A, + 0x20,0x34,0x71,0xE0,0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0,0x17,0x00,0x00,0x3A, + 0x20,0x38,0x71,0xE0,0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1,0x20,0x38,0x71,0xE0, + 0xFF,0x24,0x82,0xE3,0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21,0x20,0x36,0x71,0xE0, + 0x0E,0x00,0x00,0x3A,0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A,0x21,0x14,0xA0,0x21, + 0xA0,0x37,0x71,0xE0,0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x37,0x71,0xE0, + 0x01,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0,0x81,0x06,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x35,0x71,0xE0,0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x35,0x71,0xE0, + 0x01,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0,0x81,0x04,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xE5,0xFF,0xFF,0x2A,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0, + 0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31, + 0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0,0x01,0x00,0xA0,0x23, + 0x1E,0xFF,0x2F,0x21,0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3,0x1E,0xFF,0x2F,0xE1, + 0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22, + 0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21, + 0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0, + 0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31, + 0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22, + 0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9, + 0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB, + 0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x01,0x00,0x10,0xB5,0x02,0x20,0x07,0xF0,0x67,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA0,0xFF,0xFF,0x3A, + 0x20,0x34,0x71,0xE0,0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0,0x83,0xFF,0xFF,0x3A, + 0x20,0x38,0x71,0xE0,0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0xED,0xFD,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47, + 0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A, + 0x10,0x43,0x08,0x60,0x0B,0x24,0x02,0xF0,0xCF,0xF8,0x64,0x1E,0x00,0x2C,0xFA,0xDC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00, + 0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7B,0xC0,0x07,0x26,0xD0, + 0x70,0x7A,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43, + 0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43, + 0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18, + 0x28,0x19,0x06,0xF0,0xC7,0xFB,0x64,0x1C,0x70,0x7A,0xA0,0x42,0xF3,0xDA,0x70,0x7A, + 0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7A,0x45,0x19,0x3D,0x60, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x3A,0x06,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A, + 0x05,0x78,0x54,0x7A,0xE4,0x00,0xE6,0x18,0x19,0x24,0xA4,0x01,0x36,0x19,0xB5,0x70, + 0x56,0x7A,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x80,0x56,0x7A,0x85,0x88, + 0xF6,0x00,0xF6,0x18,0x36,0x19,0xF5,0x80,0x55,0x7A,0xED,0x00,0xED,0x18,0x2D,0x19, + 0x29,0x72,0x55,0x7A,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19,0x59,0x72,0x51,0x7A, + 0x49,0x1C,0x51,0x72,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28, + 0x01,0xD1,0x00,0x20,0x90,0x72,0x70,0xBC,0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00, + 0x40,0x00,0x00,0x20,0x40,0x06,0x00,0x20,0xFF,0xB5,0x0A,0x20,0x48,0x43,0x16,0x4F, + 0x81,0xB0,0xC5,0x19,0xFF,0x35,0x48,0x00,0xC1,0x35,0xC0,0x19,0x2A,0x73,0x00,0x90, + 0x0C,0x00,0xE0,0x30,0x80,0x8A,0x16,0x00,0x0A,0x21,0xFF,0xF7,0x29,0xFF,0xE8,0x81, + 0x00,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x21,0xFF,0x28,0x82, + 0x38,0x19,0xFF,0x30,0x41,0x30,0x00,0x7E,0xB9,0x19,0x68,0x73,0x04,0x98,0xA8,0x74, + 0x01,0x98,0x06,0x55,0x0D,0x20,0x80,0x01,0x08,0x18,0x00,0x21,0xC4,0x77,0x81,0x74, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x06,0x48,0x0F,0x23, + 0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A,0xD2,0x18,0x09,0x03, + 0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0x40,0x00,0x00,0x20,0xF1,0xB5,0xB1,0x48, + 0x90,0xB0,0x0F,0x90,0x40,0x7C,0x02,0x90,0x0F,0x98,0xC0,0x7C,0x01,0x90,0x0F,0x98, + 0x00,0x7C,0x00,0x90,0xAC,0x48,0x00,0x68,0x00,0x88,0x00,0x05,0x7E,0xD5,0x10,0x98, + 0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x41,0xE1,0x03,0x98, + 0x81,0x00,0x01,0x20,0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90, + 0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x05,0xFB,0x29,0xE1, + 0x9E,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9B,0x49, + 0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80, + 0x4A,0x5B,0x34,0x31,0x4A,0x53,0x69,0x18,0x48,0x80,0x13,0xE1,0x02,0x9F,0x93,0x49, + 0x00,0x20,0x7F,0x1E,0x68,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88, + 0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46, + 0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A,0x02,0x9A,0x88,0x4E,0x92,0x00,0x8B,0x18, + 0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90, + 0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00, + 0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B, + 0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7,0x53,0xFD,0x07,0x00,0x02,0x99,0x30,0x00, + 0xFF,0xF7,0x4E,0xFD,0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42, + 0x17,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21, + 0x48,0x43,0x0A,0x21,0xFF,0xF7,0x6C,0xFE,0x62,0x00,0x00,0xE0,0xCD,0xE0,0x6B,0x4B, + 0x28,0x3B,0x99,0x5E,0x88,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x08,0x18,0x98,0x52, + 0x07,0xE0,0x66,0x49,0x0F,0x9B,0x60,0x00,0x28,0x39,0x0A,0x5A,0x5B,0x7D,0xD2,0x1A, + 0x0A,0x52,0x62,0x49,0x60,0x00,0x28,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22, + 0x0A,0x52,0x08,0x5E,0x01,0x99,0x88,0x42,0x09,0x90,0x04,0xDB,0x5B,0x48,0x05,0x21, + 0x0E,0x38,0x01,0x55,0x2B,0xE0,0x88,0x00,0x05,0x21,0xFF,0xF7,0x41,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18,0x05,0x21, + 0xFF,0xF7,0x36,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0,0x01,0x98, + 0x05,0x21,0x40,0x00,0xFF,0xF7,0x2C,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20, + 0x0A,0xE0,0x01,0x98,0x05,0x21,0xFF,0xF7,0x23,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC, + 0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x44,0x49,0x0E,0x39,0x08,0x55,0x43,0x49, + 0x0C,0x9A,0x34,0x31,0x48,0x5F,0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90, + 0x41,0x5E,0x0B,0x9A,0x3D,0x48,0x57,0x1A,0x0E,0x38,0x06,0x91,0x01,0x5D,0x0F,0x98, + 0x80,0x7D,0x81,0x42,0x27,0xD3,0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E, + 0x00,0xDC,0x70,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E, + 0x00,0xDC,0x70,0x42,0xFF,0xF7,0xC4,0xFC,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20, + 0x0C,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20, + 0x04,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7,0xB2,0xFC,0x08,0x99,0x00,0x2E, + 0x19,0xDB,0x09,0x19,0x18,0xE0,0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99,0xFF,0xF7, + 0xA7,0xFC,0x64,0x21,0x08,0x1A,0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42,0x48,0x43, + 0x64,0x21,0xFF,0xF7,0x9D,0xFC,0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC,0x78,0x42, + 0x50,0x43,0x64,0x21,0xE0,0xE7,0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB,0x10,0x18, + 0x00,0xE0,0x10,0x1A,0x15,0x4A,0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A,0x5A,0x80, + 0x12,0x4A,0x13,0x4B,0x34,0x32,0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80,0x0D,0x9A, + 0x89,0x09,0x1A,0x40,0x0A,0x43,0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D,0x01,0x43, + 0x0E,0x98,0x01,0x60,0x04,0x98,0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C,0x03,0x90, + 0x04,0x98,0x10,0x99,0x88,0x42,0x00,0xDA,0xB9,0xE6,0x11,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0xCC,0x07,0x00,0x20,0xCC,0x0A,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4,0x1B,0x21,0xDA,0x88,0x89,0x01,0x80,0x24, + 0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x0D,0x80,0xC5,0x89,0x4D,0x80, + 0x05,0x8A,0x8D,0x80,0x40,0x8A,0xC8,0x80,0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43, + 0x08,0x81,0x06,0xE0,0x00,0x20,0x08,0x80,0x48,0x80,0x88,0x80,0xC8,0x80,0xA2,0x43, + 0x08,0x81,0xDA,0x80,0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20,0x80,0x93,0x00,0x00, + 0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A,0x00,0x28,0x09,0xD1, + 0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x01,0xF0,0x62,0xFE,0x64,0x1E,0xFB,0xD2, + 0xFF,0x24,0x12,0xE0,0x05,0xF0,0x62,0xFB,0x01,0xF0,0x5A,0xFD,0x01,0xF0,0xA2,0xFD, + 0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x45,0xFD,0x04,0x00,0x03,0x00,0x01,0x9A, + 0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20,0x06,0xF0,0xA2,0xFB, + 0x02,0x20,0x06,0xF0,0x93,0xFB,0x12,0x49,0xE8,0x68,0xC8,0x61,0x28,0x69,0xC8,0x61, + 0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B,0x0F,0x48,0x02,0xE0, + 0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5,0x48,0x68,0x80,0x07, + 0xFC,0xD5,0x01,0xF0,0x4D,0xFE,0x01,0x20,0x00,0xF0,0x6E,0xF8,0x20,0x00,0x04,0xB0, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0xE7,0x03,0x00,0x00, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00, + 0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x74,0xF9,0x1C,0x48,0x03,0x27, + 0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD, + 0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22, + 0x01,0xA8,0x04,0xF0,0x91,0xFC,0x14,0x99,0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49, + 0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49, + 0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42, + 0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1, + 0x0A,0x90,0x01,0xA8,0x06,0xF0,0x80,0xFC,0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00,0xAB,0x0C,0x00,0x80, + 0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3, + 0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5, + 0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62, + 0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20, + 0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43, + 0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40,0xF0,0xB5,0xFF,0xB0, + 0x00,0x20,0xCC,0xB0,0xBC,0x90,0x40,0x1E,0xB8,0x90,0xFF,0x48,0xFF,0x4A,0x00,0x68, + 0xFF,0x4F,0x60,0x30,0xC1,0x7D,0xFF,0x4C,0x05,0x91,0x01,0x7E,0x12,0x88,0x89,0x18, + 0x09,0x06,0x09,0x0E,0x04,0x91,0x41,0x7E,0x03,0x91,0x80,0x7E,0x02,0x90,0x00,0x20, + 0x3D,0x79,0x01,0x26,0x01,0x90,0x14,0xE0,0x0A,0x20,0x70,0x43,0x0B,0x21,0xC0,0x19, + 0x89,0x01,0x41,0x18,0x09,0x7C,0x00,0x29,0x0A,0xD0,0xF3,0x49,0x40,0x18,0x02,0xF0, + 0x31,0xFE,0x00,0x28,0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90, + 0x76,0x1C,0xA0,0x7A,0xB0,0x42,0xE7,0xDA,0xEC,0x48,0x01,0x88,0x82,0x88,0x8E,0x1A, + 0x00,0x2E,0x00,0xDC,0x56,0x1A,0x41,0x88,0xC0,0x88,0x36,0x04,0x36,0x0C,0x0A,0x1A, + 0x00,0x2A,0x00,0xDC,0x42,0x1A,0xE5,0x49,0x10,0x04,0x20,0x39,0x00,0x22,0xCA,0x91, + 0x8A,0x77,0x01,0x99,0x00,0x0C,0x00,0x29,0x0C,0xD0,0x1E,0x2E,0x0A,0xD2,0x32,0x28, + 0x01,0xD2,0x01,0x21,0x04,0xE0,0x64,0x28,0x01,0xD2,0x02,0x21,0x00,0xE0,0x03,0x21, + 0xCA,0x98,0x81,0x77,0xCA,0x98,0x40,0x7F,0x00,0x28,0x12,0xD1,0xCA,0x98,0x80,0x7F, + 0x01,0x28,0x02,0xD1,0x05,0x98,0x80,0x1C,0x08,0xE0,0x02,0x28,0x02,0xD1,0x05,0x98, + 0x00,0x1D,0x03,0xE0,0x03,0x28,0x04,0xD1,0x05,0x98,0x80,0x1D,0x00,0x06,0x00,0x0E, + 0x05,0x90,0x0D,0x22,0x00,0x21,0xB4,0xA8,0x04,0xF0,0xA8,0xFB,0xF8,0x88,0xFF,0x21, + 0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x06,0xD5,0x01,0xF0,0x47,0xF8,0x7F,0xB0, + 0x4C,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x7A,0x00,0x28,0x01,0xD0,0x40,0x1E, + 0xE0,0x72,0x60,0x7A,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0,0x18,0xE0,0x00,0x28, + 0x16,0xD1,0xBC,0x48,0x82,0x22,0x00,0x21,0x8E,0x30,0x04,0xF0,0x87,0xFB,0xE0,0x7A, + 0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E,0x0A,0x00,0x14,0x23, + 0xB4,0xA8,0xFF,0xF7,0x91,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD,0x25,0x72,0xE6,0xE1, + 0x0D,0x22,0x01,0x21,0xB0,0xA8,0x04,0xF0,0x71,0xFB,0x02,0x20,0xAE,0x49,0x06,0x90, + 0xAB,0x48,0x89,0x31,0x41,0x18,0xC9,0x91,0xAB,0x49,0x7C,0x31,0x40,0x18,0xC8,0x90, + 0x14,0xE1,0x0C,0x26,0x07,0xAF,0x34,0x20,0x70,0x43,0x07,0xA9,0x40,0x18,0x00,0x21, + 0x34,0x22,0xC9,0x43,0x04,0xF0,0x5A,0xFB,0x76,0x1E,0xF4,0xD5,0x06,0x98,0x01,0xF0, + 0x05,0xFC,0x01,0x27,0xB9,0x90,0x54,0xE0,0xB9,0x98,0x01,0x26,0xBA,0x90,0x4C,0xE0, + 0x0A,0x20,0x70,0x43,0x9A,0x4A,0x0B,0x21,0x80,0x18,0x89,0x01,0x41,0x18,0xC7,0x91, + 0x09,0x7C,0x00,0x29,0x40,0xD0,0x98,0x49,0x40,0x18,0xC6,0x90,0x02,0xF0,0x7A,0xFD, + 0x06,0x99,0x08,0x43,0x07,0xD0,0xC6,0x98,0x02,0xF0,0x74,0xFD,0x00,0x28,0x33,0xD0, + 0x06,0x98,0x00,0x28,0x30,0xD0,0x8E,0x49,0x78,0x00,0x40,0x18,0xC5,0x90,0xE0,0x30, + 0x80,0x8A,0x0A,0x21,0xFF,0xF7,0x7C,0xFB,0xC7,0x99,0x49,0x8A,0x0A,0x1A,0x00,0x2A, + 0x00,0xDC,0x42,0x1A,0xBB,0x92,0xC5,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89, + 0xFF,0xF7,0x6E,0xFB,0xC7,0x99,0x8A,0x8A,0x11,0x1A,0x00,0x29,0x00,0xDC,0x81,0x1A, + 0xBB,0x9A,0x10,0x00,0x50,0x43,0x0A,0x00,0x4A,0x43,0xBA,0x99,0x80,0x18,0x88,0x42, + 0x04,0xDA,0x34,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0xBA,0x90,0x34,0x21,0x79,0x43, + 0x07,0xAA,0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x7A,0xB0,0x42,0xAF,0xDA, + 0x7F,0x1C,0xAF,0x42,0xA8,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x22,0xB9,0x99,0x10,0x00, + 0x15,0xE0,0xB4,0xAE,0x33,0x5C,0x00,0x2B,0x10,0xD1,0x34,0x23,0x06,0x00,0x5E,0x43, + 0x07,0xAB,0xF7,0x18,0x9E,0x59,0xB3,0x00,0xFF,0x58,0x8F,0x42,0x06,0xDA,0x00,0x2F, + 0x04,0xDB,0x00,0x2E,0x02,0xDB,0x39,0x00,0x00,0x22,0xB8,0x90,0x40,0x1C,0xA8,0x42, + 0xE7,0xDD,0x00,0x2A,0x7E,0xD1,0xBC,0x98,0x34,0x21,0x40,0x1C,0xBC,0x90,0xB8,0x98, + 0x5F,0x4F,0x48,0x43,0x07,0xA9,0xC4,0x90,0x08,0x58,0x0A,0x21,0x48,0x43,0x5E,0x49, + 0xC0,0x19,0x88,0x39,0x41,0x18,0xB8,0x98,0x0A,0x22,0x50,0x43,0xC6,0x19,0x30,0x00, + 0xFF,0x30,0xCD,0x30,0x04,0xF0,0x8E,0xFA,0xB8,0x98,0x0A,0x21,0x40,0x00,0xC0,0x19, + 0xC3,0x90,0xE0,0x30,0x80,0x8A,0xFF,0xF7,0x0B,0xFB,0xFF,0x36,0xC1,0x36,0xF0,0x81, + 0xC3,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x01,0xFB,0x30,0x82, + 0xB8,0x98,0x38,0x18,0xFF,0x30,0x41,0x30,0x00,0x7E,0x70,0x73,0xB0,0x7C,0x05,0x99, + 0x49,0x1C,0x88,0x42,0x01,0xD2,0x40,0x1C,0xB0,0x74,0xB7,0x7C,0x13,0x2F,0x09,0xD9, + 0x14,0x21,0x38,0x00,0xFF,0xF7,0xEC,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42,0x01,0xD2, + 0x14,0x37,0xB7,0x74,0x30,0x7B,0xB8,0x9A,0xB4,0xA9,0x88,0x54,0xC9,0x9A,0xB8,0x99, + 0x81,0x54,0x31,0x7B,0xC8,0x9A,0x00,0x20,0x88,0x54,0xC4,0x99,0x07,0xAA,0x51,0x58, + 0xB0,0xAA,0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x34,0x23,0x58,0x43,0xC4,0x9B, + 0x07,0xAE,0xC2,0x90,0xF3,0x58,0x00,0x22,0x80,0x19,0xD2,0x43,0x9B,0x00,0x84,0x46, + 0xC2,0x50,0xB4,0xA8,0x40,0x5C,0xB9,0x9E,0x00,0x28,0x10,0xD1,0xA7,0x7A,0x01,0x20, + 0x0B,0xE0,0x83,0x00,0x62,0x46,0xD2,0x58,0x00,0x2A,0x05,0xDB,0xB2,0x42,0x03,0xDA, + 0xC2,0x9B,0x07,0xAE,0xF0,0x50,0x16,0x00,0x40,0x1C,0x87,0x42,0xF1,0xDA,0x49,0x1C, + 0xA9,0x42,0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x7A,0xBC,0x99,0x88,0x42,0x05,0xDD, + 0xBE,0x98,0x40,0x1C,0xA8,0x42,0xBE,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98,0x41,0x1E, + 0x09,0x06,0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE2,0xE6,0x01,0x26,0xBF,0x96, + 0xBD,0x90,0x6E,0xE0,0xB0,0xA8,0x80,0x5D,0x00,0x28,0x69,0xD0,0xBF,0x98,0x14,0x49, + 0x28,0x18,0xBE,0x90,0x0A,0x20,0x70,0x43,0x47,0x18,0x0B,0x20,0x80,0x01,0x38,0x18, + 0xC1,0x90,0x00,0x7C,0xC8,0x99,0x40,0x5C,0x03,0x99,0x88,0x42,0x43,0xD2,0xBE,0x98, + 0x0C,0x28,0x40,0xDC,0x0C,0x48,0x38,0x18,0x02,0xF0,0x64,0xFC,0x00,0x28,0x3A,0xD0, + 0xC1,0x98,0xC8,0x99,0x00,0x7C,0xC8,0x9B,0x05,0x4A,0x41,0x5C,0x49,0x1C,0xC1,0x54, + 0x2D,0x20,0x00,0x01,0x39,0x18,0x0B,0xE0,0xCC,0x07,0x00,0x20,0x00,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0xD6,0x02,0x00,0x00,0xC0,0x03,0x00,0x20, + 0xBE,0x98,0x0A,0x23,0x58,0x43,0x80,0x18,0xC0,0x90,0xFF,0x30,0xCD,0x30,0x1A,0x00, + 0x04,0xF0,0xD0,0xF9,0x09,0x20,0x80,0x01,0x39,0x18,0xC0,0x98,0x4A,0x7D,0xFF,0x30, + 0xC1,0x30,0xC2,0x74,0x89,0x7D,0x01,0x75,0xC1,0x98,0xBE,0x9A,0x00,0x7C,0xB4,0xA9, + 0x88,0x54,0xC9,0x9A,0xBE,0x99,0x81,0x54,0xBF,0x98,0x40,0x1C,0xBF,0x90,0xBD,0x98, + 0x40,0x1C,0xBD,0x90,0x14,0xE0,0x32,0x48,0x38,0x18,0x02,0xF0,0x23,0xFC,0x00,0x28, + 0x0E,0xD0,0xCA,0x99,0x01,0x20,0x08,0x77,0xC1,0x99,0x2E,0x48,0x89,0x7D,0x13,0x29, + 0x06,0xD9,0x61,0x7A,0x01,0x29,0x03,0xD1,0xC1,0x88,0x04,0x22,0x11,0x43,0xC1,0x80, + 0x76,0x1C,0xA0,0x7A,0xB0,0x42,0x8D,0xDA,0x26,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5, + 0x02,0x99,0x04,0x22,0xE1,0x72,0x23,0x49,0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0, + 0xB4,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x0D,0x22,0x01,0x20,0x92,0x01,0x1B,0x27, + 0x7F,0x01,0x1C,0x49,0x09,0x18,0x8B,0x18,0xDB,0x7F,0x00,0x2B,0x0C,0xD1,0xC9,0x19, + 0x09,0x7B,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23, + 0xB4,0xA8,0xFF,0xF7,0xC1,0xFA,0x02,0xE0,0x40,0x1C,0x0D,0x28,0xE9,0xDB,0xE0,0x7A, + 0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18,0x38,0x00,0xFF,0x30, + 0xD3,0x30,0x02,0xF0,0xD7,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20,0xFF,0x37,0xC1,0x37, + 0xB8,0x74,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0xBD,0x98,0x28,0x18,0x20,0x72,0x20,0x7A, + 0x05,0x49,0x82,0x22,0xA0,0x72,0xC8,0x1D,0xFD,0x30,0x04,0xF0,0x53,0xF9,0xE6,0xE5, + 0xD6,0x02,0x00,0x00,0x40,0x00,0x00,0x20,0x0C,0x02,0x00,0x20,0xF1,0xB5,0x38,0x48, + 0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x36,0x48,0x41,0x7F,0x01,0x91,0x01,0x00, + 0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43, + 0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29, + 0xFB,0xD1,0x03,0x90,0x01,0xF0,0x2E,0xF9,0x01,0xF0,0x04,0xFA,0x00,0x24,0x27,0x00, + 0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0,0xA1,0xF8,0x00,0x28,0x28,0xD0,0x0E,0x21, + 0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A, + 0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x05,0xF0,0x2A,0xFE,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20, + 0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x1C,0xFE, + 0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90, + 0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3,0x7F,0x1C,0x15,0x2F,0xC8,0xD3,0x20,0x00, + 0xFF,0x38,0x27,0x38,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xB2,0xD9,0x06,0x98, + 0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00,0xF0,0xB5,0x7B,0x4A,0xFF,0xB0,0xBC,0xB0, + 0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18,0xB8,0x90,0x48,0x42,0xB7,0x90,0x77,0x48, + 0x77,0x4E,0x07,0x7F,0x02,0xA8,0x01,0x90,0x76,0x48,0xBA,0x90,0x00,0x7D,0x00,0x28, + 0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90,0x73,0x4A,0x00,0x21,0x30,0x00,0x04,0xF0, + 0xFD,0xF8,0x00,0x25,0x00,0x24,0x6F,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x14,0xD0, + 0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0,0xBD,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42, + 0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E, + 0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0xB7,0x9A,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xB2,0xFD,0x10,0xE0,0xBC,0x42,0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0, + 0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42, + 0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x0E,0x2C,0xCB,0xD3,0x6D,0x1C, + 0x15,0x2D,0xC7,0xD3,0x01,0xF0,0x7E,0xF8,0x01,0xF0,0x54,0xF9,0x00,0x25,0x00,0x24, + 0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00,0x28,0x00,0x01,0xF0,0xEF,0xFF,0x00,0x28, + 0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x19,0xF8,0x39,0x19,0x01,0x9A,0x49,0x00, + 0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3,0x6D,0x1C,0x15,0x2D,0xD7,0xD3,0x00,0x20, + 0x00,0x90,0x01,0xF0,0x27,0xF9,0x00,0x25,0x00,0x24,0x21,0x00,0x28,0x00,0x01,0xF0, + 0xC5,0xFF,0x00,0x28,0x3E,0xD0,0x0E,0x21,0x69,0x43,0xB9,0x9B,0x0A,0x19,0x91,0x00, + 0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD, + 0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00,0xF1,0x5B,0x00,0x04,0x00,0x0C,0x81,0x42, + 0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00,0x01,0xF0,0xE8,0xFF,0x01,0x99,0xC8,0x53, + 0x00,0x98,0x03,0x21,0xFF,0xF7,0xAC,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1, + 0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22, + 0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0x07,0xFD,0x0B,0xE0,0x00,0x22,0xD2,0x43, + 0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0xFF,0xFC,0x00,0x28,0x02,0xD1,0x00,0x22, + 0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C,0xB7,0xD3,0x6D,0x1C,0x15,0x2D,0xB3,0xD3, + 0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98,0x40,0x1E,0xB8,0x90,0x18,0xD2,0x00,0x25, + 0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43,0x01,0x99,0x30,0x19,0x40,0x00,0x0A,0x5A, + 0x21,0x00,0x28,0x00,0x05,0xF0,0xFC,0xFC,0x64,0x1C,0x0E,0x2C,0xF4,0xD3,0x6D,0x1C, + 0x15,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0,0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47, + 0x00,0xF0,0xE0,0xFF,0x8D,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x60,0x06,0x00,0x20, + 0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00,0xD2,0x02,0x00,0x00,0x18,0x07,0x00,0x20, + 0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28, + 0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x79,0x00,0x28,0x3C,0xD0, + 0x00,0x21,0x0D,0x25,0x1F,0x4F,0xED,0x01,0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00, + 0xA6,0x79,0x1B,0x0F,0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19,0xA4,0x68,0xA4,0x00, + 0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19,0x80,0x68,0x92,0x0A, + 0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D, + 0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02, + 0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C, + 0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00, + 0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49,0x40,0x8C,0x01,0x91,0x4B,0x8B,0x20,0x39, + 0x00,0x91,0x89,0x7B,0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46, + 0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99,0x09,0x7E,0x00,0x29,0x0D,0xD0,0x01,0x29, + 0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04, + 0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04, + 0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42,0x5C,0xDC,0x82,0x42,0x5A,0xDB,0x8C,0x45, + 0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A,0x7B,0xD0,0x06,0x27, + 0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0,0x03,0x2A,0x76,0xD1,0xE2,0x79,0xD3,0x07, + 0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A,0x27,0xD1,0x09,0x20,0x00,0x25,0xE0,0x71, + 0x6B,0xE0,0x00,0x9A,0x92,0x7A,0x00,0x2A,0x67,0xD1,0x00,0xF0,0x9D,0xF8,0x06,0x00, + 0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72,0x5F,0xE0,0xE2,0x79,0xD3,0x07,0xE8,0xD1, + 0x92,0x07,0x5A,0xD5,0x00,0xF0,0x90,0xF8,0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28, + 0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71,0xFF,0xF7,0x24,0xF8,0xEB,0xE7,0x31,0x00, + 0x20,0x00,0xE7,0x71,0xFF,0xF7,0x1E,0xF8,0x47,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07, + 0x43,0xD5,0x00,0xF0,0x79,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0, + 0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFF,0xF7,0x0B,0xF8,0xA6,0x71, + 0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20, + 0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28, + 0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0, + 0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xE7,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xDB,0xFF,0x01,0x25, + 0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07, + 0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x03,0x48,0xC0,0x68,0x40,0x07,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47, + 0x00,0x90,0x00,0x40,0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88, + 0x00,0x06,0x80,0x0F,0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00, + 0xA0,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x48,0xC0,0x68,0xC0,0x07,0x00,0xD0, + 0x01,0x20,0x70,0x47,0x00,0x90,0x00,0x40,0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x7B, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x23,0xD0,0x1B,0x7A,0x00,0x2B,0x20,0xD1,0x12,0x4F, + 0x1C,0xE0,0xD3,0x00,0xDD,0x19,0x03,0x23,0x5B,0x02,0xEB,0x18,0x10,0x25,0x5D,0x5F, + 0xA5,0x42,0x0E,0xDC,0x14,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB,0x12,0x25,0x5D,0x5F, + 0x8D,0x42,0x06,0xDC,0x16,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06, + 0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8, + 0xF0,0xBC,0x70,0x47,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0x8D,0xB0,0xBB,0x4E,0x0A,0x90,0x09,0x90,0x30,0x68,0x01,0x88,0x08,0x91,0x01,0x00, + 0x40,0x31,0xCA,0x7F,0x60,0x30,0x07,0x92,0x8A,0x7F,0x06,0x92,0x40,0x78,0x05,0x90, + 0x88,0x7D,0x04,0x90,0xB3,0x48,0xC1,0x88,0x00,0x79,0x0A,0x07,0x05,0xD5,0xB1,0x4A, + 0x00,0x28,0x02,0xD1,0x08,0x23,0x99,0x43,0xD1,0x80,0xAF,0x4D,0x00,0x21,0x69,0x5E, + 0xFF,0x22,0x01,0x32,0x28,0x29,0x03,0xDD,0x02,0x21,0x69,0x5E,0x1E,0x29,0x03,0xDC, + 0x04,0x21,0x69,0x5E,0x28,0x29,0x05,0xDD,0xA6,0x49,0xCB,0x88,0x13,0x43,0xCB,0x80, + 0x00,0x21,0x04,0xE0,0x06,0x21,0x69,0x5E,0x00,0x29,0x02,0xD0,0x49,0x1E,0xE9,0x80, + 0x03,0xE0,0xA0,0x4B,0xD9,0x88,0x91,0x43,0xD9,0x80,0x08,0x99,0x89,0x04,0x7E,0xD5, + 0x6A,0x7A,0x00,0x21,0x00,0x2A,0x02,0xD1,0x00,0x28,0x00,0xD1,0x01,0x21,0x01,0x91, + 0x00,0xF0,0x40,0xF9,0x97,0x48,0x99,0x4C,0x00,0x79,0x01,0x28,0x0C,0x90,0x4D,0xD1, + 0x94,0x49,0x09,0x89,0x0B,0x91,0x35,0x68,0x40,0x35,0x6A,0x8B,0x91,0x42,0x00,0xD3, + 0x00,0x20,0x03,0x90,0x0B,0x98,0x0A,0x22,0x02,0x21,0x50,0x43,0x61,0x5E,0x0F,0x00, + 0xFE,0xF7,0x4E,0xFD,0x29,0x7C,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20, + 0x02,0x90,0x0B,0x98,0x0A,0x21,0xC0,0x1B,0xFE,0xF7,0x42,0xFD,0x69,0x7C,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x07,0x00,0x84,0x48,0xAB,0x7C,0x20,0x38, + 0x80,0x8B,0x01,0x21,0x98,0x42,0x00,0xD8,0x00,0x21,0xEB,0x7C,0x62,0x68,0x01,0x20, + 0x9A,0x42,0x00,0xDB,0x00,0x20,0x03,0x9A,0x00,0x2A,0x2A,0xD0,0x02,0x9A,0x00,0x2A, + 0x27,0xD0,0x00,0x2F,0x25,0xD0,0x00,0x29,0x23,0xD0,0x76,0x4A,0x01,0x21,0xC0,0x32, + 0xD2,0x6A,0x00,0x2A,0x00,0xD0,0x00,0x21,0x01,0x42,0x1A,0xD0,0x60,0x78,0x00,0x28, + 0x2F,0xD0,0x69,0x7E,0x88,0x42,0x2C,0xD8,0x40,0x1E,0x29,0xE0,0x01,0x28,0x10,0xD9, + 0x68,0x7A,0x01,0x28,0x0D,0xD9,0x31,0x68,0x60,0x78,0x40,0x31,0xC9,0x7D,0x88,0x42, + 0x01,0xD2,0x40,0x1C,0x60,0x70,0x60,0x78,0x00,0x28,0x02,0xD0,0x20,0x78,0x40,0x1E, + 0x20,0x70,0x31,0x68,0x60,0x68,0x40,0x31,0x0A,0x7D,0x90,0x42,0x11,0xDB,0x0C,0x9A, + 0x60,0x48,0x00,0x2A,0x0D,0xD0,0xC0,0x88,0xC0,0x06,0x0A,0xD4,0x00,0xE0,0x25,0xE0, + 0x60,0x78,0xC9,0x7D,0x88,0x42,0x04,0xD2,0x04,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C, + 0x60,0x70,0x60,0x78,0x04,0x99,0x10,0x23,0x88,0x42,0x0A,0xD8,0x01,0x98,0x00,0x28, + 0x07,0xD1,0x54,0x49,0xC8,0x88,0x18,0x43,0xC8,0x80,0x30,0x68,0x40,0x30,0x00,0x7E, + 0x0E,0xE0,0x50,0x4A,0xD1,0x88,0xC8,0x06,0x0B,0xD5,0x20,0x78,0x00,0x28,0x06,0xD1, + 0x99,0x43,0xD1,0x80,0x30,0x68,0x40,0x30,0x40,0x7D,0x60,0x70,0x01,0xE0,0x40,0x1E, + 0x20,0x70,0x48,0x4F,0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5, + 0x05,0x99,0x06,0x98,0x40,0x1A,0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x50,0x00, + 0xC0,0x19,0x84,0x46,0xFF,0x30,0xA1,0x30,0xC0,0x88,0x00,0x28,0x68,0xD0,0x07,0x99, + 0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07,0x62,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88, + 0x08,0x21,0x08,0x43,0xF8,0x80,0x5B,0xE0,0x06,0x99,0x88,0x42,0x58,0xD3,0x08,0x98, + 0x40,0x07,0x55,0xD5,0x00,0x23,0x01,0x20,0x29,0xE0,0xFF,0x24,0x39,0x18,0x9A,0x34, + 0x64,0x5C,0x94,0x42,0x22,0xD1,0x5B,0x1C,0xFF,0x31,0x41,0x31,0x09,0x7E,0x0A,0x91, + 0x01,0x00,0x14,0xE0,0x4C,0x00,0xE4,0x19,0x25,0x00,0xE0,0x35,0xEE,0x8A,0xFF,0x34, + 0x01,0x34,0xAE,0x82,0x26,0x8A,0xE6,0x81,0x7C,0x18,0x25,0x00,0xFF,0x35,0x41,0x35, + 0x6E,0x7E,0xFF,0x34,0x81,0x34,0x2E,0x76,0xA6,0x7E,0x49,0x1C,0x66,0x76,0x3C,0x79, + 0x8C,0x42,0xE7,0xDA,0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79, + 0x81,0x42,0xD2,0xDA,0x00,0x2B,0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x09,0x90, + 0xF8,0x88,0x20,0x21,0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30,0x61,0x30,0x41,0x89, + 0x38,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xE0,0x30, + 0x81,0x82,0x60,0x46,0xFF,0x30,0x81,0x30,0x41,0x88,0x38,0x79,0x40,0x00,0xC0,0x19, + 0xFF,0x30,0x01,0x30,0xC1,0x81,0x3B,0x79,0x0B,0x49,0x0A,0x98,0x68,0x39,0x58,0x54, + 0x52,0x1C,0x0C,0x2A,0x8B,0xDB,0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1, + 0xF8,0x88,0x20,0x21,0x88,0x43,0xF8,0x80,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xCC,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x06,0x00,0x20, + 0x03,0x48,0xC0,0x68,0x00,0x03,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47, + 0x00,0x90,0x00,0x40,0xF0,0xB5,0x59,0x48,0xB7,0xB0,0x00,0x68,0x00,0x21,0x60,0x30, + 0x45,0x79,0x07,0x79,0x56,0x48,0x31,0x95,0x36,0x90,0x41,0x80,0x36,0x98,0x41,0x60, + 0x30,0x91,0x60,0x21,0x18,0xA8,0x03,0xF0,0xAB,0xFC,0x60,0x21,0x68,0x46,0x03,0xF0, + 0xA7,0xFC,0x31,0x9D,0x0E,0x21,0x48,0x1B,0x33,0x90,0x58,0xE0,0x15,0x21,0xC9,0x1B, + 0x35,0x91,0x31,0x99,0x38,0x00,0x69,0x1A,0x8C,0x00,0x17,0xE0,0x49,0x4A,0x6B,0x00, + 0x9E,0x18,0xB8,0x23,0xF3,0x5E,0x0E,0x21,0x46,0x00,0x41,0x43,0xB2,0x18,0x88,0x26, + 0x96,0x5F,0x49,0x19,0x09,0x04,0x9A,0x19,0x43,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E, + 0x51,0x18,0x18,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51,0x35,0x99,0x81,0x42, + 0xE4,0xDC,0x78,0x00,0x15,0x21,0x09,0x1A,0x18,0xAE,0x34,0x90,0x30,0x59,0xFE,0xF7, + 0xDF,0xFB,0x30,0x51,0x3E,0x00,0x84,0x46,0x19,0xE0,0x0E,0x20,0x70,0x43,0x36,0x49, + 0x40,0x19,0x40,0x00,0x09,0x5E,0x60,0x46,0x6A,0x00,0x09,0x1A,0x31,0x48,0x13,0x18, + 0xB8,0x22,0x9A,0x5E,0x73,0x00,0x1B,0x18,0x88,0x20,0x18,0x5E,0x10,0x18,0x09,0x18, + 0x0B,0x00,0x4B,0x43,0x68,0x46,0x02,0x59,0xD1,0x18,0x76,0x1C,0x01,0x51,0x35,0x98, + 0xB0,0x42,0xE2,0xDC,0x34,0x98,0x14,0x21,0x09,0x1A,0x6E,0x46,0x30,0x59,0xFE,0xF7, + 0xB7,0xFB,0x30,0x51,0x30,0x99,0x40,0x18,0x30,0x90,0x33,0x98,0x6D,0x1C,0xA8,0x42, + 0xA4,0xDC,0x79,0x00,0x15,0x20,0x41,0x1A,0x31,0x98,0x0E,0x22,0x40,0x00,0x14,0x1A, + 0x61,0x43,0x32,0x90,0x30,0x98,0xFE,0xF7,0xA3,0xFB,0x05,0x04,0x36,0x98,0x2D,0x14, + 0x45,0x80,0x30,0x98,0x21,0x00,0xFE,0xF7,0x9B,0xFB,0x00,0x21,0x6B,0x46,0x0A,0xE0, + 0x8A,0x00,0x9A,0x58,0x82,0x1A,0x16,0x00,0x56,0x43,0x36,0x9A,0x52,0x68,0xB2,0x18, + 0x36,0x9E,0x49,0x1C,0x72,0x60,0x8C,0x42,0xF2,0xDC,0x32,0x98,0x0D,0x21,0x09,0x1A, + 0x36,0x98,0x40,0x68,0xFE,0xF7,0x84,0xFB,0x15,0x22,0x33,0x99,0xD2,0x1B,0x92,0x02, + 0x51,0x43,0xFE,0xF7,0x7D,0xFB,0x36,0x99,0x00,0x2D,0x48,0x60,0x02,0xD1,0x36,0x98, + 0x6D,0x1C,0x45,0x80,0x37,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20, + 0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0x5E,0x4D, + 0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x76,0xFC, + 0x05,0xF0,0x64,0xFC,0x04,0xF0,0x9A,0xFA,0x04,0xF0,0x9A,0xFF,0x57,0x4E,0x01,0x27, + 0x9D,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0, + 0xC0,0x68,0x07,0x28,0x05,0xD1,0x52,0x48,0xC0,0x68,0x01,0x21,0x49,0x07,0xC8,0x63, + 0x91,0xE0,0x04,0xF0,0xCB,0xFB,0x28,0x7A,0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04, + 0x00,0x0C,0x05,0xF0,0x53,0xFC,0xFF,0x20,0x81,0x30,0xFE,0xF7,0xAD,0xFF,0x03,0x20, + 0x05,0xF0,0xBC,0xFA,0x47,0x4C,0xE0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0, + 0x40,0x06,0x01,0xD5,0x04,0x20,0x00,0xE0,0x02,0x20,0x05,0xF0,0x77,0xF9,0x00,0xF0, + 0x1F,0xFC,0x04,0xF0,0x7B,0xFF,0x05,0xF0,0x5F,0xF9,0x00,0xF0,0xCB,0xFB,0x00,0xF0, + 0xA1,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1,0x30,0x7B,0x00,0x28,0x01,0xD0,0x04,0xF0, + 0x61,0xFA,0x03,0xF0,0x13,0xFC,0x00,0x28,0x00,0xD0,0x2F,0x70,0x28,0x78,0x00,0x28, + 0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x90,0xF9,0x28,0x78,0x00,0x28, + 0x05,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x4D,0xD1,0x00,0x20,0x28,0x70,0x03,0x20, + 0x05,0xF0,0x5E,0xFA,0xE8,0x62,0x03,0x20,0x05,0xF0,0x8C,0xFA,0xFF,0x20,0x81,0x30, + 0xFE,0xF7,0x62,0xFF,0xE0,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xE0,0x83,0x36,0xE0, + 0xFF,0xF7,0xF0,0xFC,0x00,0x28,0x32,0xD0,0x68,0x79,0x00,0x28,0x2F,0xD1,0x6C,0x6A, + 0x00,0x2C,0x2C,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x1E,0x49,0xFE,0xF7, + 0x0F,0xFC,0x24,0x1A,0x14,0x2C,0x22,0xDD,0x04,0xF0,0x0C,0xFA,0x20,0x00,0x05,0xF0, + 0xFB,0xFB,0x05,0xF0,0xFF,0xFB,0xA8,0x79,0x00,0x28,0x0D,0xD0,0x04,0xF0,0xE0,0xF9, + 0x04,0xF0,0xE3,0xF9,0x04,0xF0,0xEB,0xF9,0x14,0x4C,0x67,0x60,0x01,0x20,0xFE,0xF7, + 0x43,0xFF,0x13,0x48,0x60,0x60,0x03,0xE0,0x12,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0, + 0x05,0xF0,0xEF,0xFB,0x0F,0x48,0x00,0x21,0x01,0x70,0x04,0xF0,0xF7,0xF9,0x28,0x78, + 0x00,0x28,0x00,0xD1,0x5D,0xE7,0x28,0x7A,0x00,0x28,0x01,0xD0,0x05,0xF0,0xBE,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x14,0x07,0x00,0x20,0x80,0x93,0x00,0x00, + 0x00,0x40,0x00,0x30,0x40,0x00,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xD0,0x07,0x00,0x20,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43, + 0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x34,0x33,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x28,0x3C,0xA3,0x52,0x22,0x00,0x1A,0x32, + 0x13,0x54,0x18,0x00,0x76,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E, + 0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCC,0x0A,0x00,0x20,0x10,0xB5,0x0C,0x48, + 0x0D,0x22,0x00,0x21,0x03,0xF0,0x52,0xFB,0x0A,0x48,0x82,0x22,0x00,0x21,0x03,0xF0, + 0x4D,0xFB,0x08,0x48,0x00,0x24,0x0C,0x38,0x04,0x72,0x07,0x48,0x28,0x22,0x21,0x00, + 0x03,0xF0,0x44,0xFB,0x04,0x48,0x42,0x38,0x44,0x72,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x9F,0x03,0x00,0x20,0x0C,0x02,0x00,0x20,0x82,0x06,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x1A,0x22,0x00,0x21,0x03,0xF0,0x32,0xFB,0x14,0x48,0x1A,0x22,0x00,0x21,0x1A,0x30, + 0x03,0xF0,0x2C,0xFB,0x11,0x48,0x0D,0x22,0x00,0x21,0x64,0x30,0x03,0xF0,0x26,0xFB, + 0x0E,0x48,0x30,0x22,0x00,0x21,0x34,0x30,0x03,0xF0,0x20,0xFB,0x0B,0x48,0x18,0x22, + 0x00,0x21,0x76,0x30,0x03,0xF0,0x1A,0xFB,0x08,0x48,0x18,0x22,0x00,0x21,0x8E,0x30, + 0x03,0xF0,0x14,0xFB,0x05,0x49,0x00,0x20,0xAC,0x31,0xC8,0x83,0xFF,0x39,0xA1,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20, + 0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x09,0x68,0x00,0x24,0x60,0x31,0x8F,0x7F,0x08,0x21, + 0x42,0x00,0x18,0x23,0x4B,0x43,0x9B,0x19,0x1D,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19, + 0x6C,0x80,0x23,0x25,0x6D,0x01,0x5B,0x19,0x49,0x1E,0x5C,0x83,0xF1,0xD5,0x07,0x25, + 0x31,0x18,0xED,0x01,0x01,0x23,0x4D,0x19,0xAB,0x75,0x15,0x25,0x93,0x19,0xAD,0x01, + 0x5B,0x19,0x5C,0x82,0x2B,0x23,0x5B,0x01,0xC9,0x18,0x8F,0x72,0x8C,0x75,0x02,0x21, + 0x0B,0x23,0xDB,0x01,0x18,0x25,0x4D,0x43,0xAD,0x19,0xAD,0x18,0xED,0x18,0x49,0x1E, + 0x6C,0x80,0xF7,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x17,0x20,0xC9,0x43,0x80,0x01, + 0x10,0x18,0x41,0x81,0x81,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00,0xCC,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48,0x1C,0x22,0x00,0x21,0x03,0xF0,0xBE,0xFA, + 0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBA,0x03,0x00,0x20,0x20,0x01,0x00,0x20,0x10,0xB5,0x05,0xF0,0x91,0xF9,0x04,0xF0, + 0x8F,0xF9,0xFF,0xF7,0x53,0xFF,0x04,0xF0,0xA7,0xFA,0x01,0xF0,0xA7,0xFD,0x01,0xF0, + 0x1F,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x20,0x30,0x9F,0xE5, + 0x20,0x20,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x11,0x93,0xE7, + 0x80,0xC0,0x82,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1,0xFA,0xFF,0xFF,0x5A, + 0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xD2,0x07,0x00,0x20,0x78,0x47,0xC0,0x46, + 0x20,0x30,0x9F,0xE5,0x20,0x20,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2, + 0x00,0x11,0x93,0xE7,0x80,0xC0,0x82,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1, + 0xFA,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40,0x00,0x00,0x00,0x10, + 0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33,0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42, + 0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04, + 0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0xCC,0x07,0x00,0x20,0xF7,0xB5,0x61,0x48, + 0xE6,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0,0x01,0x20,0x62,0x90,0x00,0x20,0x02,0xE0, + 0x00,0x20,0x62,0x90,0x01,0x20,0x61,0x90,0x5B,0x48,0x00,0x26,0x64,0x90,0x5B,0x48, + 0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A, + 0x01,0x91,0x80,0x8B,0x60,0x90,0x56,0x48,0x00,0x7F,0x63,0x96,0x00,0x90,0x00,0x24, + 0x0E,0x20,0x68,0x43,0x65,0x90,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x76,0xF9, + 0x4C,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4E,0x4A,0x12,0x79,0x00,0x2A, + 0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D, + 0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0, + 0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42, + 0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E, + 0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18, + 0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x80,0x1A,0x64,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0x67,0x9B,0x12,0x0C,0x00,0x2B, + 0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x66,0x9B,0x05,0x2B, + 0x0E,0xD8,0x90,0x42,0x01,0xDA,0x62,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x61,0x9A, + 0x21,0x00,0x28,0x00,0x00,0xF0,0x7E,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0, + 0x63,0x99,0x05,0xA8,0x47,0x54,0x63,0x98,0x40,0x1C,0x63,0x90,0x64,0x1C,0x0E,0x2C, + 0x01,0xDA,0x65,0x98,0x97,0xE7,0x6D,0x1C,0x15,0x2D,0x90,0xDB,0x66,0x98,0x05,0x28, + 0x03,0xD9,0x00,0x04,0x63,0x9E,0x00,0x0C,0x60,0x90,0x00,0x2E,0x25,0xDD,0x68,0x98, + 0x00,0x28,0x22,0xD1,0x00,0xF0,0x4A,0xF9,0x00,0xF0,0x84,0xF9,0x00,0xF0,0x5A,0xFA, + 0x76,0x1E,0x14,0xD4,0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00,0x64,0x98,0x80,0x58, + 0x01,0x05,0x60,0x98,0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C,0xA0,0x42,0x00,0xD9, + 0x20,0x00,0x00,0x04,0x08,0x43,0x64,0x99,0x76,0x1E,0x88,0x50,0xEC,0xD5,0x00,0xF0, + 0x25,0xF9,0x00,0xF0,0x67,0xF9,0x00,0xF0,0x3D,0xFA,0x69,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00, + 0x60,0x06,0x00,0x20,0x14,0x07,0x00,0x20,0xFF,0x0F,0x00,0x00,0xF0,0xB5,0x01,0x26, + 0x76,0x07,0x30,0x68,0x02,0x28,0x1D,0xD1,0xB4,0x68,0x20,0x02,0x27,0x05,0x05,0x0D, + 0x3F,0x0D,0x39,0x00,0x28,0x00,0x04,0xF0,0xE9,0xFA,0x41,0x1C,0x12,0xD0,0x0B,0x4A, + 0x80,0x00,0x83,0x18,0x5B,0x88,0x10,0x5A,0x21,0x0B,0xDB,0x19,0xDB,0x04,0x09,0x03, + 0x1B,0x0D,0x19,0x43,0x40,0x19,0x06,0x4B,0x40,0x08,0x00,0x05,0x19,0x40,0x00,0x0A, + 0x01,0x43,0xB1,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x74,0x79,0x00,0x00, + 0xFF,0x0F,0x00,0xFF,0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00, + 0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0, + 0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0, + 0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD, + 0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A, + 0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0xF0,0xB5,0x8B,0xB0,0x0E,0x27,0x15,0x20,0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48, + 0x53,0x49,0x0A,0x90,0x80,0x7B,0x09,0x91,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5, + 0x0D,0x20,0x03,0x21,0x05,0x90,0x02,0xE0,0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98, + 0x01,0x76,0x4C,0x48,0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04, + 0x00,0x0C,0x01,0x90,0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98, + 0x00,0x28,0x7F,0xD0,0x05,0x98,0x41,0x00,0x30,0x00,0xFE,0xF7,0x21,0xF8,0x05,0x04, + 0x2D,0x0C,0x00,0x24,0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43,0x05,0x99,0xFE,0xF7, + 0x17,0xF8,0x3D,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42, + 0xF2,0xDB,0x04,0x98,0x41,0x00,0x01,0x98,0xFE,0xF7,0x0A,0xF8,0x06,0x9F,0x06,0x04, + 0x36,0x0C,0x00,0x24,0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7, + 0xFF,0xFF,0x31,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82, + 0xBC,0x42,0xF1,0xDB,0x0A,0x98,0x80,0x7B,0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0, + 0x29,0x4A,0x31,0x21,0x10,0x19,0x49,0x01,0x40,0x18,0x41,0x7F,0x0A,0x98,0x80,0x7B, + 0x80,0x07,0x03,0xD5,0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99, + 0x02,0x96,0x03,0x91,0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21, + 0x40,0x1B,0xFD,0xF7,0xD5,0xFF,0x1C,0x4A,0xE1,0x00,0x89,0x18,0x03,0x22,0x52,0x02, + 0x8F,0x18,0x38,0x82,0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90, + 0x80,0x8A,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xC3,0xFF,0x78,0x82,0x08,0x98,0x0A,0x21, + 0x00,0x8C,0x40,0x19,0xFE,0xF7,0xEC,0xF8,0xB8,0x82,0x07,0x98,0x0A,0x21,0x80,0x8A, + 0x80,0x19,0xFE,0xF7,0xE5,0xF8,0xF8,0x82,0x02,0x98,0x0A,0x21,0x40,0x00,0xFE,0xF7, + 0xDF,0xF8,0x09,0x99,0x64,0x1C,0x48,0x83,0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x7B, + 0xA0,0x42,0xB5,0xDC,0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x06,0x00,0x20, + 0x60,0x06,0x00,0x20,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68, + 0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68, + 0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0x49,0x08,0x49,0x00,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0xFF,0x20,0x06,0x49, + 0x06,0x4A,0x6A,0x30,0x03,0xE0,0x0B,0x88,0x13,0x80,0x92,0x1C,0x09,0x1D,0x03,0x00, + 0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40,0xD2,0x02,0x00,0x10, + 0xFF,0x20,0x06,0x49,0x06,0x4A,0x6A,0x30,0x03,0xE0,0x13,0x88,0x92,0x1C,0x0B,0x80, + 0x09,0x1D,0x03,0x00,0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40, + 0xD2,0x02,0x00,0x10,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x04,0x49,0x40,0x22,0x00,0x28,0x48,0x6A,0x01,0xD0,0x10,0x43,0x00,0xE0,0x90,0x43, + 0x48,0x62,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48, + 0x92,0x00,0x03,0xF0,0x01,0xF8,0x07,0x48,0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43, + 0x06,0x48,0x03,0xF0,0x1B,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00, + 0x00,0x00,0x10,0x40,0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x06,0x49,0x00,0x28,0x08,0x69,0x03,0xD0,0x13,0x22,0x12,0x06,0x10,0x43,0x02,0xE0, + 0x03,0x22,0x12,0x06,0x90,0x43,0x08,0x61,0x70,0x47,0x00,0x00,0x40,0xA1,0x00,0x40, + 0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40, + 0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40, + 0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22,0x02,0xF0,0xC6,0xFF,0xFF,0x22,0x09,0x49, + 0x09,0x48,0xF1,0x32,0x02,0xF0,0xC0,0xFF,0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00, + 0x02,0xF0,0xBA,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00, + 0x04,0x90,0x00,0x40,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x04,0x49,0x02,0x22,0x00,0x28,0x08,0x68,0x01,0xD0,0x10,0x43, + 0x00,0xE0,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xFF,0xFF,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFE,0xF7,0x01,0xF8,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xF0,0xFF,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xF2,0xFF,0x0C,0x48,0x6D,0x00,0x04,0x04,0x24,0x0C, + 0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xE1,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00, + 0x00,0x23,0xFD,0xF7,0xE3,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0x00,0x96,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7, + 0x9D,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x4F,0x48, + 0x82,0xB0,0x00,0x68,0x00,0x25,0x60,0x30,0x81,0x8A,0x2E,0x00,0x4C,0x4F,0x01,0x91, + 0x80,0x7D,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0x00,0x90,0x13,0xE0, + 0x0A,0x20,0x60,0x43,0x47,0x49,0x40,0x18,0x0B,0x21,0x89,0x01,0x41,0x18,0x09,0x7C, + 0x00,0x29,0x08,0xD0,0x44,0x49,0x40,0x18,0x01,0xF0,0x6C,0xF9,0x00,0x28,0x02,0xD0, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x7A,0xA0,0x42,0xE8,0xDA,0x3F,0x48, + 0x03,0x89,0x81,0x89,0x5A,0x1A,0x00,0x2A,0x00,0xDC,0xCA,0x1A,0x41,0x89,0xC3,0x89, + 0x12,0x04,0x12,0x0C,0xCC,0x1A,0x00,0x2C,0x00,0xDC,0x5C,0x1A,0x81,0x7C,0x23,0x04, + 0x1B,0x0C,0x00,0x29,0x04,0xD0,0x41,0x7D,0xC8,0x29,0x01,0xD2,0x49,0x1C,0x41,0x75, + 0x32,0x49,0x20,0x39,0x8C,0x7E,0x14,0x2C,0x04,0xD2,0x0C,0x7F,0x00,0x2C,0x01,0xD0, + 0x01,0x24,0x4C,0x77,0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7E,0xC8,0x2C, + 0x01,0xD2,0x64,0x1C,0xCC,0x76,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B, + 0x05,0xD2,0x10,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x10,0x24, + 0x04,0x5F,0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x04,0x82,0x44,0x7D,0x01,0x2C,0x01,0xD9, + 0x78,0x26,0x10,0xE0,0x02,0x2D,0x0E,0xD2,0x10,0x24,0x04,0x5F,0x02,0x2C,0x0A,0xDD, + 0xC9,0x7E,0x14,0x29,0x07,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B, + 0x01,0xD2,0x77,0x26,0xF6,0x43,0x00,0x21,0x02,0x2D,0x01,0x75,0x0D,0xD2,0x31,0x00, + 0x78,0x31,0x04,0xD1,0xC1,0x7C,0xC8,0x29,0x01,0xD2,0x49,0x1C,0xC1,0x74,0xC1,0x7C, + 0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x75,0x01,0x98,0x81,0x19,0x08,0x00, + 0x48,0x43,0x02,0x99,0x00,0x29,0x06,0xD1,0x06,0x49,0x09,0x79,0x01,0x29,0x02,0xD0, + 0x00,0x99,0xFD,0xF7,0xD5,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20, + 0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xD6,0x02,0x00,0x00,0xC0,0x03,0x00,0x20, + 0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2, + 0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3, + 0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0xFE,0xB5,0x1B,0x48,0x1B,0x49,0x00,0x68,0x09,0x88,0x60,0x30, + 0x00,0x7E,0x00,0x25,0x2E,0x00,0x40,0x18,0x01,0x06,0x18,0x48,0x2F,0x00,0x00,0x7A, + 0x09,0x0E,0x00,0x28,0x01,0x90,0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0, + 0x0A,0x20,0x60,0x43,0x12,0x49,0x40,0x18,0xFF,0x30,0xC1,0x30,0x80,0x7C,0x14,0x28, + 0x01,0xD2,0x01,0x26,0x07,0xE0,0x01,0x27,0x14,0x21,0xFD,0xF7,0xB1,0xFE,0x00,0x99, + 0x88,0x42,0x00,0xD3,0x01,0x25,0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F, + 0x02,0xD1,0x00,0x2E,0x00,0xD0,0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xCC,0x07,0x00,0x20,0x00,0x07,0x00,0x20,0x00,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0xFF,0xF7,0x0D,0xFE,0x04,0x49,0x08,0x68,0x06,0x22, + 0x90,0x43,0x08,0x60,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29, + 0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40, + 0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0xC7,0xFD,0x09,0x48, + 0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48, + 0x00,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x39,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x14,0x07,0x00,0x20,0xF1,0xB5,0x61,0x48, + 0x2E,0x21,0x90,0xB0,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26, + 0x76,0x07,0xF1,0x63,0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0, + 0x9D,0xFD,0x59,0x4D,0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x1F,0xFE,0x10,0x9B, + 0x00,0x21,0x01,0x20,0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0x7E,0xFE, + 0x1E,0x16,0x40,0x40,0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x68, + 0x4F,0x6F,0x76,0x7D,0x40,0x84,0x40,0x8B,0x92,0x4F,0x40,0x40,0x40,0x40,0x99,0x40, + 0x0B,0x20,0xF0,0x63,0x4D,0xE0,0x00,0xF0,0x28,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x61,0xF9,0x00,0xF0,0x35,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68, + 0x52,0x68,0x91,0x42,0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18, + 0x49,0x1C,0xC1,0x83,0xFD,0xF7,0x76,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7, + 0x17,0xFE,0xA8,0x78,0x80,0x07,0x01,0xD5,0x04,0xF0,0x96,0xFD,0x3A,0x49,0x40,0x22, + 0x68,0x46,0x02,0xF0,0x99,0xFD,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0xA4,0xFD, + 0xF7,0x63,0x1E,0xE0,0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x04,0xF0,0x6A,0xFB,0xF0,0xE7,0x03,0x21, + 0x09,0x07,0xCA,0x60,0xFE,0xF7,0x28,0xF9,0x10,0x98,0xFE,0xF7,0x79,0xF8,0x08,0xE0, + 0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x1F,0xF9,0x00,0xF0,0x67,0xFD,0x00,0xF0, + 0xF7,0xF8,0x20,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x71,0xD2,0xE7,0x69,0x71,0xD0,0xE7,0x00,0x2C, + 0x02,0xD0,0x01,0x20,0xA8,0x71,0xCB,0xE7,0xA9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xE8,0x71,0xC4,0xE7,0xE9,0x71,0xC2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0x28,0x72,0xBD,0xE7,0x29,0x72,0xBB,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72, + 0xB6,0xE7,0xA9,0x72,0xB4,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xAF,0xE7, + 0xE9,0x72,0xAD,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA8,0xE7,0x29,0x73, + 0xA6,0xE7,0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x04,0xF0,0x78,0xF9, + 0x9E,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0x14,0x07,0x00,0x20,0x00,0x00,0x00,0x10, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0xC0,0x92,0x00,0x00,0xF0,0xB5,0x36,0x4C, + 0x03,0x00,0x36,0x4A,0x36,0x4E,0x37,0x4F,0x37,0x48,0x38,0x49,0x25,0x68,0x30,0x3B, + 0x04,0xF0,0xC4,0xFD,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x2E, + 0x3A,0x16,0x3D,0x42,0x4A,0x50,0x53,0x0A,0xCD,0x61,0x3B,0xE0,0x60,0x68,0x01,0xE0, + 0x2F,0x48,0xC0,0x6B,0xC8,0x61,0x35,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x37,0xE0, + 0xCE,0x61,0x2F,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7, + 0xD0,0x7B,0xEF,0xE7,0x27,0x48,0x03,0x7F,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09, + 0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0x09,0xE0, + 0x90,0x7D,0x53,0x7E,0x00,0x06,0x03,0x43,0xD0,0x7D,0x12,0x7E,0x00,0x04,0x12,0x02, + 0x10,0x43,0x03,0x43,0xCB,0x61,0x0D,0xE0,0x90,0x7E,0x00,0x06,0xD2,0xE7,0x1A,0x48, + 0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCD,0xE7,0x3A,0x69,0x00,0x8A,0x52,0x08,0x12,0x02, + 0x02,0x43,0xCA,0x61,0x5F,0x22,0x0A,0xE0,0x14,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04, + 0x10,0x43,0xBF,0xE7,0x38,0x69,0x40,0x08,0xBC,0xE7,0x80,0x69,0xBA,0xE7,0x48,0x69, + 0x10,0x42,0xFC,0xD1,0x03,0xF0,0x7A,0xFC,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0x00,0x93,0x00,0x00, + 0x15,0x00,0x0E,0x00,0x00,0x20,0x00,0x40,0x14,0x07,0x00,0x20,0x00,0x40,0x00,0x30, + 0xC0,0x0F,0x00,0x20,0x60,0x06,0x00,0x20,0x00,0x96,0x00,0x00,0xE0,0x95,0x00,0x00, + 0x10,0xB5,0x00,0x20,0xFF,0xF7,0x84,0xFC,0x01,0x20,0xFF,0xF7,0xF3,0xFC,0x01,0x20, + 0xFF,0xF7,0xAE,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x70,0xB5,0x03,0x24,0x24,0x07, + 0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x54,0xF8,0x06,0x00,0xCB,0x20, + 0xC0,0x01,0xFE,0xF7,0x31,0xF8,0x03,0xF0,0xF9,0xFA,0x00,0xF0,0xA1,0xFC,0x03,0xF0, + 0xE9,0xFA,0x30,0x00,0xFE,0xF7,0x5A,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x03,0xF0,0xE6,0xFA, + 0xFF,0xF7,0xDE,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07, + 0x04,0xF0,0xEC,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0xF8,0xB5,0x23,0x48,0x00,0x68,0x00,0x88,0xC0,0x06,0x3E,0xD5,0x21,0x4E,0x30,0x7A, + 0x00,0x28,0x3A,0xD0,0x70,0x7A,0x00,0x28,0x37,0xD0,0x01,0x25,0x32,0xE0,0x71,0x7A, + 0x1D,0x4F,0x09,0x23,0x8C,0x46,0x0A,0x21,0x69,0x43,0xCC,0x19,0x01,0x20,0x9B,0x01, + 0xFF,0x34,0xC1,0x34,0x23,0xE0,0x0A,0x22,0x42,0x43,0xD2,0x19,0xD2,0x18,0x21,0x7B, + 0x92,0x7B,0x91,0x42,0x1A,0xD1,0x0A,0x22,0x50,0x43,0xC0,0x19,0xC7,0x18,0x0E,0x21, + 0x10,0x20,0x61,0x5E,0x38,0x5E,0x12,0x22,0xBA,0x5E,0x08,0x1A,0x10,0x21,0x61,0x5E, + 0x89,0x1A,0x00,0x91,0x3A,0x8A,0xE1,0x89,0xFF,0xF7,0xD2,0xF9,0xE0,0x81,0x7A,0x8A, + 0x21,0x8A,0x00,0x98,0xFF,0xF7,0xCC,0xF9,0x20,0x82,0x02,0xE0,0x40,0x1C,0x84,0x45, + 0xD9,0xDA,0x6D,0x1C,0x30,0x7A,0xA8,0x42,0xC9,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xCC,0x07,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0xB1,0xB0,0x10,0x90,0x0F,0x90,0x0E,0x90,0x0D,0x90,0xFC,0x48,0x01,0x8C,0x0A,0x91, + 0x40,0x8C,0x09,0x90,0xFA,0x48,0x02,0x68,0x13,0x00,0x60,0x33,0x59,0x7F,0x18,0x7F, + 0x08,0x91,0x11,0x00,0x80,0x31,0x8C,0x7A,0x07,0x94,0x4C,0x7A,0x06,0x94,0x12,0x88, + 0x12,0x07,0x24,0xD5,0xDA,0x7F,0x42,0x43,0x24,0x92,0x0A,0x78,0x42,0x43,0x23,0x92, + 0x4A,0x78,0x42,0x43,0x22,0x92,0x8A,0x78,0x42,0x43,0x21,0x92,0xCA,0x78,0x42,0x43, + 0x20,0x92,0x0A,0x79,0x42,0x43,0x1F,0x92,0x4A,0x79,0x42,0x43,0x1E,0x92,0x8A,0x79, + 0x42,0x43,0x1D,0x92,0xCA,0x79,0x42,0x43,0x1C,0x92,0x09,0x7A,0x41,0x43,0xE5,0x48, + 0x1B,0x91,0x30,0x90,0x00,0x7A,0x00,0x28,0x05,0xD1,0x00,0xF0,0xE7,0xFE,0x31,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x25,0x90,0xDE,0x48,0xE0,0x38,0x2F,0x90, + 0xDD,0x48,0x2E,0x90,0xDD,0x4D,0x25,0x98,0x1B,0x21,0x28,0x18,0x49,0x01,0x2D,0x90, + 0x40,0x18,0x04,0x78,0x00,0x2C,0x0F,0xD0,0x07,0x98,0x00,0x28,0x08,0xD1,0x0A,0x20, + 0x60,0x43,0x40,0x19,0xFF,0x30,0xD3,0x30,0x00,0xF0,0x04,0xFE,0x00,0x28,0x03,0xD0, + 0x2E,0x98,0x00,0x7D,0x00,0x28,0x03,0xD0,0x25,0x98,0xFF,0xF7,0xB9,0xF8,0xC2,0xE2, + 0x25,0x99,0x1D,0x27,0x07,0x20,0x7F,0x01,0x4E,0x00,0x18,0x21,0x41,0x43,0x49,0x19, + 0x89,0x19,0xCA,0x19,0x53,0x88,0x53,0x83,0x23,0x22,0x52,0x01,0x8A,0x18,0x09,0x23, + 0x52,0x8B,0xDB,0x01,0xC9,0x18,0x40,0x1E,0x4A,0x82,0xEE,0xD5,0x0A,0x20,0x44,0x43, + 0x65,0x19,0x2C,0x95,0xFF,0x35,0xC1,0x35,0xEA,0x89,0x0A,0x98,0x40,0x1E,0x82,0x42, + 0xDD,0xDC,0x2A,0x8A,0x09,0x98,0x40,0x1E,0x82,0x42,0xD8,0xDC,0xBB,0x48,0xE9,0x89, + 0x34,0x18,0xE0,0x19,0x2B,0x90,0x23,0x23,0x41,0x80,0x5B,0x01,0x29,0x8A,0xE0,0x18, + 0x2A,0x90,0x41,0x83,0x00,0x20,0x01,0x22,0xD2,0x02,0x01,0x00,0x05,0x90,0x07,0x20, + 0x04,0x92,0x18,0x23,0x43,0x43,0xB1,0x4F,0xDB,0x19,0x9B,0x19,0x1D,0x27,0x7F,0x01, + 0xDF,0x19,0x29,0x93,0x02,0x23,0xFB,0x5E,0xBC,0x46,0x00,0x2B,0x0B,0xDD,0x05,0x9F, + 0xBB,0x42,0x02,0xDD,0x67,0x46,0x7F,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x02,0xDA, + 0x63,0x46,0x5B,0x88,0x04,0x93,0x29,0x9F,0x23,0x23,0x5B,0x01,0xFF,0x18,0x1A,0x23, + 0xFB,0x5E,0x00,0x2B,0x05,0xDD,0x8B,0x42,0x00,0xDD,0x79,0x8B,0x93,0x42,0x00,0xDA, + 0x7A,0x8B,0x40,0x1E,0xD5,0xD5,0x04,0x9B,0x05,0x98,0xC0,0x1A,0xF0,0x28,0x02,0xDC, + 0x8B,0x1A,0xF0,0x2B,0x02,0xDD,0x2E,0x9F,0x01,0x23,0xBB,0x74,0x14,0x28,0x04,0xDA, + 0x88,0x1A,0x14,0x28,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x2F,0x99,0x48,0x74, + 0x2D,0x99,0x07,0x20,0xC0,0x01,0x08,0x18,0x28,0x90,0x80,0x7D,0x01,0x28,0x1B,0xD9, + 0x2B,0x98,0x02,0x21,0x1A,0x23,0x41,0x5E,0xC3,0x5E,0xC8,0x1A,0x00,0x28,0x00,0xDC, + 0x58,0x1A,0x00,0x04,0x00,0x14,0x0C,0x90,0x2A,0x99,0x1A,0x20,0x08,0x5E,0x09,0x21, + 0xC9,0x01,0x63,0x18,0x12,0x21,0x59,0x5E,0x43,0x1A,0x00,0x2B,0x00,0xDC,0x0B,0x1A, + 0x18,0x04,0x00,0x14,0x0B,0x90,0x02,0xE0,0x64,0x20,0x0B,0x90,0x0C,0x90,0x2B,0x98, + 0x1A,0x21,0x41,0x5E,0x02,0x00,0x02,0x20,0x10,0x5E,0x03,0xF0,0xD7,0xFA,0x12,0x90, + 0x09,0x20,0xC0,0x01,0x20,0x18,0x12,0x21,0x41,0x5E,0x2A,0x9A,0x1A,0x20,0x10,0x5E, + 0x03,0xF0,0xCC,0xFA,0x11,0x90,0x0F,0x20,0x80,0x01,0x20,0x18,0x12,0x21,0x41,0x5E, + 0x12,0x98,0x03,0xF0,0xC3,0xFA,0x14,0x90,0x25,0x20,0x40,0x01,0x20,0x18,0x0A,0x21, + 0x41,0x5E,0x11,0x98,0x03,0xF0,0xBA,0xFA,0x13,0x90,0x01,0x20,0x80,0x02,0x27,0x18, + 0x1F,0x20,0x40,0x01,0x20,0x18,0x0A,0x21,0x41,0x5E,0x02,0x22,0xBA,0x5E,0x14,0x98, + 0x03,0xF0,0xAE,0xFA,0x00,0x04,0x00,0x14,0x16,0x90,0x13,0x20,0x80,0x01,0x20,0x18, + 0x1A,0x22,0x02,0x21,0x82,0x5E,0x41,0x5E,0x13,0x98,0x03,0xF0,0xA1,0xFA,0x00,0x04, + 0x00,0x14,0x15,0x90,0x21,0x20,0x40,0x01,0x20,0x18,0x12,0x22,0x82,0x5E,0x1A,0x21, + 0x79,0x5E,0x16,0x98,0x03,0xF0,0x94,0xFA,0x00,0x04,0x00,0x14,0x18,0x90,0x05,0x20, + 0x00,0x02,0x20,0x18,0x0A,0x22,0x82,0x5E,0x27,0x20,0x40,0x01,0x20,0x18,0x12,0x21, + 0x41,0x5E,0x15,0x98,0x03,0xF0,0x84,0xFA,0x00,0x04,0x00,0x14,0x17,0x90,0x2A,0x98, + 0x02,0x22,0x82,0x5E,0x11,0x20,0x80,0x01,0x20,0x18,0x0A,0x21,0x41,0x5E,0x18,0x98, + 0x03,0xF0,0x76,0xFA,0x00,0x04,0x00,0x14,0x1A,0x90,0x29,0x20,0x40,0x01,0x20,0x18, + 0x1A,0x22,0x02,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x03,0xF0,0x69,0xFA,0x00,0x04, + 0x00,0x14,0x19,0x90,0x0B,0x99,0x0C,0x98,0x00,0xF0,0xB8,0xFF,0x3F,0x4F,0x01,0x21, + 0x18,0x22,0x4A,0x43,0xD2,0x19,0x0B,0x23,0x92,0x19,0xDB,0x01,0xD2,0x18,0x53,0x88, + 0x49,0x1E,0x53,0x83,0xF4,0xD5,0x0B,0x21,0xC9,0x01,0x61,0x18,0x48,0x80,0x2D,0x9A, + 0x2B,0x21,0x49,0x01,0x57,0x18,0xBA,0x7D,0x00,0x20,0x00,0x2A,0x94,0x46,0x0D,0xDB, + 0x18,0x21,0x13,0x00,0x4B,0x43,0x31,0x49,0x59,0x18,0x8B,0x19,0x0B,0x21,0xC9,0x01, + 0x5B,0x18,0x02,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF1,0xD5,0x61,0x46,0x49,0x1C, + 0xFD,0xF7,0x96,0xF9,0x23,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0, + 0x21,0x98,0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC, + 0x03,0x20,0x05,0xE0,0x1D,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20, + 0xB9,0x7A,0x40,0x1A,0x08,0x99,0x49,0x42,0x00,0x28,0x0B,0xDD,0x15,0x20,0x80,0x01, + 0x20,0x18,0x12,0x22,0x82,0x5E,0x08,0x9B,0x9A,0x42,0x01,0xD1,0x00,0x22,0x0A,0xE0, + 0x52,0x1C,0x08,0xE0,0x00,0x28,0x16,0x48,0x07,0xDA,0x20,0x18,0x12,0x22,0x82,0x5E, + 0x8A,0x42,0xF3,0xD0,0x52,0x1E,0x42,0x82,0x0A,0xE0,0x22,0x18,0x12,0x20,0x10,0x5E, + 0x00,0x28,0x01,0xDD,0x40,0x1E,0x02,0xE0,0x00,0x28,0x01,0xDA,0x40,0x1C,0x50,0x82, + 0x0B,0x48,0x22,0x18,0x12,0x20,0x10,0x5E,0x08,0x9A,0x90,0x42,0x12,0xD1,0xBA,0x7A, + 0x05,0x2A,0x0F,0xD2,0x52,0x1C,0xBA,0x72,0x13,0xE0,0x00,0x00,0x00,0x93,0x00,0x00, + 0xCC,0x07,0x00,0x20,0x00,0x02,0x00,0x20,0xC0,0x03,0x00,0x20,0x40,0x00,0x00,0x20, + 0x40,0x05,0x00,0x00,0x88,0x42,0x04,0xD1,0xB8,0x7A,0x01,0x28,0x01,0xD9,0x40,0x1E, + 0xB8,0x72,0x28,0x98,0x1A,0x9A,0x80,0x7D,0x19,0x9C,0x01,0x00,0x27,0x90,0x26,0x90, + 0x10,0x00,0xFD,0xF7,0x2D,0xF9,0x10,0x90,0x0E,0x90,0x26,0x99,0x20,0x00,0xFD,0xF7, + 0x27,0xF9,0x0F,0x90,0x0D,0x90,0xB8,0x7A,0x01,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9, + 0x6B,0x46,0x06,0xC3,0x19,0x9B,0x1A,0x9A,0x27,0x98,0x09,0x21,0x03,0xF0,0x4A,0xFE, + 0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x17,0x9B,0x80,0x7D,0x18,0x9A, + 0x07,0x21,0x03,0xF0,0x3F,0xFE,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E, + 0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98, + 0x00,0x92,0xFF,0x30,0x23,0x9B,0x24,0x9A,0xCD,0x30,0x9B,0xE0,0x02,0x28,0x27,0xD1, + 0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3,0x17,0x9B,0x18,0x9A,0x27,0x98,0x07,0x21, + 0x03,0xF0,0x20,0xFE,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x15,0x9B, + 0x80,0x7D,0x16,0x9A,0x05,0x21,0x03,0xF0,0x15,0xFE,0x3C,0x20,0x6B,0x46,0x18,0x5E, + 0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB, + 0x9A,0x5E,0x2C,0x98,0x21,0x9B,0xFF,0x30,0x00,0x92,0x22,0x9A,0xCD,0x30,0x71,0xE0, + 0x03,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3,0x15,0x9B,0x16,0x9A, + 0x27,0x98,0x05,0x21,0x03,0xF0,0xF6,0xFD,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0, + 0x28,0x98,0x13,0x9B,0x80,0x7D,0x14,0x9A,0x03,0x21,0x03,0xF0,0xEB,0xFD,0x3C,0x20, + 0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4, + 0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x1F,0x9B,0xFF,0x30,0x00,0x92,0x20,0x9A, + 0xCD,0x30,0x47,0xE0,0x04,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0, + 0x13,0x9B,0x14,0x9A,0x27,0x98,0x03,0x21,0x03,0xF0,0xCC,0xFD,0x0F,0xAA,0x10,0xA9, + 0x68,0x46,0x06,0xC0,0x28,0x98,0x11,0x9B,0x80,0x7D,0x12,0x9A,0x02,0x21,0x03,0xF0, + 0xC1,0xFD,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E, + 0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x1D,0x9B,0xFF,0x30, + 0x00,0x92,0x1E,0x9A,0xCD,0x30,0x1D,0xE0,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0, + 0x11,0x9B,0x12,0x9A,0x27,0x98,0x02,0x21,0x03,0xF0,0xA4,0xFD,0x3C,0x22,0x6B,0x46, + 0x9A,0x5E,0x00,0x21,0x10,0xAB,0x59,0x5E,0x2A,0x9B,0x1A,0x20,0x18,0x5E,0x01,0xAB, + 0x07,0xC3,0x2B,0x98,0x02,0x22,0x82,0x5E,0x2C,0x98,0x1B,0x9B,0x00,0x92,0x1C,0x9A, + 0xFF,0x30,0xCD,0x30,0x31,0x00,0x03,0xF0,0xA1,0xFD,0x28,0x98,0x3D,0x49,0x80,0x7D, + 0x09,0x28,0x02,0xD2,0x28,0x9A,0x40,0x1C,0x90,0x75,0xB8,0x7D,0x02,0x28,0x01,0xD2, + 0x40,0x1C,0xB8,0x75,0x28,0x7B,0x40,0x1E,0x80,0x00,0x40,0x18,0x17,0x21,0x89,0x01, + 0x44,0x18,0x0A,0x20,0x20,0x5E,0x00,0x28,0x21,0xDB,0x0C,0x21,0x61,0x5E,0x00,0x29, + 0x1D,0xDB,0x06,0x9A,0x64,0x21,0x8E,0x1A,0x70,0x43,0xFD,0xF7,0x39,0xF8,0x07,0x00, + 0xE8,0x89,0x06,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x62,0xF9,0x38,0x18,0xE8,0x81, + 0x0C,0x20,0x20,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x2A,0xF8,0x06,0x00,0x28,0x8A, + 0x06,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x53,0xF9,0x30,0x18,0x28,0x82,0xE8,0x89, + 0x60,0x81,0x28,0x8A,0xA0,0x81,0x25,0x98,0x40,0x1C,0x0C,0x28,0x25,0x90,0x00,0xDA, + 0x18,0xE5,0x30,0x98,0x00,0x7A,0x01,0x28,0x22,0xD1,0x30,0x98,0x2E,0x9A,0x80,0x7D, + 0x41,0x00,0x18,0x48,0x08,0x18,0x1D,0x21,0x49,0x01,0x41,0x18,0x0B,0x88,0x13,0x81, + 0x23,0x22,0x52,0x01,0x82,0x18,0x12,0x8B,0x2E,0x9B,0x5A,0x81,0x0A,0x8B,0x2E,0x99, + 0x8A,0x81,0x09,0x21,0xC9,0x01,0x40,0x18,0x00,0x8A,0x2E,0x99,0xC8,0x81,0x30,0x98, + 0x01,0x8B,0x2E,0x98,0x01,0x80,0x30,0x98,0x41,0x8B,0x2E,0x98,0x41,0x80,0xE6,0xE4, + 0x02,0x28,0xFC,0xD1,0x30,0x98,0x01,0x8B,0x2E,0x98,0x01,0x80,0x30,0x98,0x41,0x8B, + 0x2E,0x98,0x41,0x80,0x04,0x48,0x2E,0x99,0x42,0x88,0x8A,0x80,0x81,0x88,0x2E,0x98, + 0xC1,0x80,0xD4,0xE4,0x40,0x00,0x00,0x20,0x20,0x02,0x00,0x20,0xF8,0xB5,0x1C,0x4B, + 0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B,0x1B,0x7F,0x9E,0x46, + 0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D, + 0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45, + 0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0, + 0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7, + 0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42, + 0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7, + 0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x18,0x07,0x00,0x20,0x0E,0x23,0x58,0x43, + 0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x1C,0x49,0x10,0xB5,0x4A,0x7A,0x1C,0x49,0x00,0x20,0x00,0x2A,0x15,0xD1,0x0A,0x89, + 0x00,0x2A,0x0F,0xD0,0x19,0x49,0x8A,0x42,0x0C,0xD0,0x10,0x00,0x1E,0x21,0x48,0x43, + 0x64,0x21,0xFD,0xF7,0xAD,0xF8,0xFF,0x30,0x4B,0x21,0x91,0x30,0xC9,0x00,0x88,0x42, + 0x00,0xD9,0x08,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x0F,0x4C,0x88,0x89,0xA4,0x89, + 0x0F,0x4A,0x01,0x00,0xA2,0x18,0x0E,0x4C,0xFF,0x39,0x7D,0x23,0xA6,0x39,0xDB,0x00, + 0x64,0x42,0x99,0x42,0x06,0xD8,0x10,0x00,0x50,0x43,0x59,0x1C,0xFD,0xF7,0x90,0xF8, + 0x20,0x1A,0xE7,0xE7,0xA0,0x42,0xE5,0xD9,0x03,0x21,0x10,0x00,0xFD,0xF7,0x88,0xF8, + 0x00,0x19,0xDF,0xE7,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x73,0xFA,0xFF,0xFF,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47, + 0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D, + 0x00,0x24,0x01,0x21,0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68, + 0x6A,0x60,0x05,0xE0,0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18, + 0x02,0x00,0x40,0x1E,0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0xAB,0xFF,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06, + 0xFC,0xD4,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5, + 0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5, + 0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5, + 0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A, + 0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA, + 0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5, + 0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3, + 0x10,0x40,0xBD,0x08,0xA6,0x0B,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3, + 0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A,0x9D,0x0B,0x00,0xEB,0xD2,0xFF,0xFF,0xEA, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69, + 0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48, + 0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E, + 0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1, + 0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0, + 0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0x0D,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69, + 0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5, + 0x02,0xF0,0xFC,0xFE,0xC3,0xE7,0x00,0x00,0x16,0x07,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29,0x80,0x79,0x01,0xD1,0x01,0x25,0x03,0xE0, + 0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x33,0x27, + 0x7F,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1,0x34,0x48,0x0D,0x22,0x00,0x21,0x14,0x38, + 0x01,0xF0,0x24,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00, + 0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19,0x36,0x7B,0x9E,0x42,0x01,0xD1,0x04,0x00, + 0x02,0xE0,0x40,0x1C,0x0C,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18, + 0xF6,0x19,0x36,0x7B,0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x73,0xED,0xE7, + 0x40,0x1C,0x0C,0x28,0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18, + 0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00, + 0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7B,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23, + 0xE4,0x19,0x23,0x73,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x02,0xE0,0x40,0x1C,0x0C,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20, + 0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xC0,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43, + 0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C, + 0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60, + 0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50, + 0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47,0x4C,0x07,0x00,0x20,0xF0,0xB5,0x87,0xB0, + 0xFE,0xF7,0x5C,0xFB,0xFE,0xF7,0x3A,0xFB,0x01,0xF0,0x2E,0xFF,0x02,0xF0,0x0A,0xFD, + 0x00,0xF0,0xBA,0xFD,0x00,0xF0,0xC8,0xFB,0xFD,0xF7,0xF8,0xFF,0xFD,0xF7,0x66,0xFA, + 0x39,0x48,0x00,0x68,0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x56,0xFA, + 0xFF,0xF7,0x06,0xFA,0x03,0xE0,0xFF,0xF7,0x03,0xFA,0xFF,0xF7,0x4F,0xFA,0x01,0x27, + 0x7F,0x07,0x78,0x68,0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x78,0x60, + 0x02,0xF0,0xF8,0xFF,0x02,0xF0,0x68,0xFE,0x38,0x68,0x00,0x28,0x07,0xD0,0x78,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x3E,0x68,0x02,0x24,0x76,0x1C,0x37,0xE0,0x01,0x24, + 0x26,0x00,0xA0,0x00,0xC0,0x19,0x06,0x90,0x05,0x68,0xA8,0x01,0x80,0x0D,0x05,0x90, + 0xA8,0x05,0x80,0x0D,0x04,0x90,0x21,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9, + 0x05,0xA8,0x02,0xF0,0x8F,0xFE,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x05,0xA8,0x03,0xF0,0x94,0xFE,0x04,0xA9,0x05,0xA8,0x03,0xF0,0x9A,0xFC, + 0x14,0x48,0x04,0x99,0x05,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x05,0x43, + 0xA8,0x0A,0x80,0x02,0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42, + 0xC7,0xD9,0x38,0x68,0xFC,0xF7,0x7A,0xFF,0xFD,0xF7,0x1A,0xFE,0x02,0xF0,0xEC,0xFD, + 0xFF,0xF7,0xDC,0xFE,0xFC,0xF7,0xBC,0xFE,0x03,0xF0,0x2E,0xFD,0x06,0x48,0x40,0x79, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20,0x1F,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xF8,0xB5,0x02,0xF0, + 0x65,0xFC,0xFE,0xF7,0x8B,0xFD,0xFE,0xF7,0x5B,0xFE,0xFE,0xF7,0xA3,0xFE,0x1A,0x48, + 0x00,0x21,0xC0,0x7F,0x03,0xF0,0xE8,0xFB,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20, + 0x28,0x70,0xE8,0x61,0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68, + 0x00,0x07,0x12,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x8E,0xFD, + 0xFF,0xF7,0x3B,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x81,0xFD,0xE0,0x6B,0x0B,0x28,0xE6,0xD1, + 0xFE,0xF7,0x8C,0xF9,0x28,0x78,0x00,0x28,0xD9,0xD0,0x02,0xF0,0x27,0xFA,0xD6,0xE7, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x93,0x00,0x00,0x00,0x40,0x00,0x30, + 0x14,0x07,0x00,0x20,0x70,0xB5,0x05,0x00,0x1A,0x48,0x1B,0x4A,0x00,0x68,0x12,0x88, + 0x60,0x30,0x01,0x7E,0xC0,0x7D,0x2C,0x78,0x89,0x18,0x0E,0x06,0x17,0x49,0x36,0x0E, + 0x4A,0x7F,0x00,0x2A,0x0D,0xD1,0x89,0x7F,0x01,0x29,0x01,0xD1,0x80,0x1C,0x06,0xE0, + 0x02,0x29,0x01,0xD1,0x00,0x1D,0x02,0xE0,0x03,0x29,0x02,0xD1,0x80,0x1D,0x00,0x06, + 0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7, + 0xEF,0xFD,0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70, + 0x01,0x20,0xF4,0xE7,0xCC,0x07,0x00,0x20,0x00,0x07,0x00,0x20,0xA0,0x03,0x00,0x20, + 0x10,0xB5,0x0C,0x24,0x20,0x00,0xFE,0xF7,0x07,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48, + 0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0x10,0xB5,0x07,0x4C,0x07,0x48,0x22,0x00, + 0x00,0x21,0x01,0xF0,0x6B,0xFD,0x06,0x48,0x22,0x00,0x00,0x21,0x01,0xF0,0x66,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00,0x00,0x00,0x00,0x10, + 0xD2,0x07,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0, + 0x55,0xFD,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5, + 0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0x01,0xF0,0x24,0xFD,0x10,0x48,0xC0,0x07, + 0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19, + 0x01,0xF0,0x08,0xFD,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0, + 0x45,0xFD,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48, + 0x92,0x0F,0x00,0x19,0x01,0xF0,0x2A,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x00,0x00,0x00,0x04,0x7A,0x00,0x00,0x40,0x00,0x00,0x20,0x28,0x0B,0x00,0x00, + 0x40,0x00,0x00,0x20,0x05,0x49,0xC8,0x05,0x41,0x62,0x05,0x49,0x81,0x62,0x05,0x48, + 0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00,0x80,0x88,0x3C,0x03, + 0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21, + 0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24, + 0x20,0x00,0xFE,0xF7,0xF5,0xF9,0x64,0x1C,0x0C,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00,0xFD,0xF7,0x84,0xF8, + 0xFE,0xF7,0x06,0xFD,0xFE,0xF7,0xD0,0xFC,0xFE,0xF7,0x0A,0xFD,0xFE,0xF7,0x00,0xFD, + 0xFE,0xF7,0xC2,0xFC,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B, + 0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7,0x65,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x93,0x00,0x00,0x10,0xB5,0x02,0xF0, + 0x15,0xFB,0x02,0xF0,0xF5,0xFA,0xFF,0x20,0xFD,0xF7,0x96,0xF8,0xFF,0xF7,0xAA,0xFF, + 0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0,0xD1,0xFC,0x08,0x20,0xFD,0xF7,0x54,0xF8, + 0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x04,0xFE,0x00,0xF0,0x1A,0xF8, + 0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7,0x45,0xF8,0x00,0xF0, + 0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20,0x02,0xF0,0xE3,0xFA,0xFE,0xF7,0x18,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x4C,0x07,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x93,0x00,0x00,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFD,0xF7, + 0x2B,0xF8,0x20,0x02,0xFD,0xF7,0x52,0xF8,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7, + 0xDF,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0, + 0x15,0xFB,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x03,0xF0,0x0E,0xFB, + 0x30,0x00,0xFD,0xF7,0x09,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCD,0xFD,0x03,0xF0, + 0xC0,0xFC,0x7D,0x20,0xC0,0x00,0x03,0xF0,0xAF,0xFC,0x00,0x20,0xFF,0xF7,0xAA,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7D,0x78,0x00,0x00,0x0A,0x48,0x10,0xB5, + 0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7, + 0xA7,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0x6A,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0x07,0xA5,0x07,0x00, + 0x14,0x07,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xCF,0xFE,0x14,0x48,0x00,0x7A,0x03,0xF0, + 0x0F,0xFA,0xFF,0xF7,0x3B,0xFF,0x11,0x48,0x11,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24, + 0xD1,0x83,0x10,0x49,0x0F,0x4A,0xCC,0x60,0x0C,0x61,0x0F,0x49,0xC0,0x3A,0x09,0x68, + 0x40,0x31,0x49,0x7D,0x51,0x70,0x01,0x00,0x20,0x39,0x0A,0x8B,0x09,0x49,0x40,0x39, + 0x8A,0x63,0x00,0x88,0xC8,0x63,0xFF,0xF7,0x9B,0xFE,0x08,0x48,0xC4,0x80,0xFE,0xF7, + 0xEF,0xFA,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x40,0x00,0x00,0x20,0x00,0x07,0x00,0x20,0xCC,0x07,0x00,0x20,0x00,0x02,0x00,0x20, + 0x15,0x07,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90,0x00,0x20,0x2B,0x4E, + 0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0xCC,0xFB,0xFE,0xF7,0xA2,0xFC, + 0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F,0x00,0x25,0x00,0x90, + 0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0x39,0xFB,0x00,0x28,0x1B,0xD0,0x0E,0x21, + 0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A, + 0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98, + 0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00, + 0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3,0x6D,0x1C,0x15,0x2D, + 0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0,0x07,0x98,0x07,0x60, + 0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF, + 0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x68,0x30,0x9F,0xE5, + 0x60,0xC0,0x9F,0xE5,0x0E,0x06,0xD3,0xE5,0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3, + 0x0F,0x16,0xD3,0x15,0x00,0x00,0xA0,0x13,0x00,0x00,0x51,0x13,0x1E,0xFF,0x2F,0x91, + 0x0E,0x26,0xD3,0xE5,0x00,0x10,0x83,0xE0,0x3D,0x16,0xD1,0xE5,0x02,0x00,0x12,0xE3, + 0x3C,0x26,0xD3,0xE5,0x82,0x21,0x62,0x00,0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10, + 0x81,0x10,0x82,0x10,0x01,0x11,0x9C,0xE7,0x80,0x20,0x83,0xE0,0x02,0x19,0xC1,0xE3, + 0xB0,0x11,0xC2,0xE1,0x0F,0x16,0xD3,0xE5,0x01,0x00,0x80,0xE2,0x00,0x00,0x51,0xE1, + 0xEE,0xFF,0xFF,0x8A,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20, + 0x10,0xB4,0x0E,0x24,0x62,0x43,0x51,0x18,0x0A,0x4A,0x49,0x00,0x52,0x5E,0x0A,0x49, + 0x1E,0x24,0x0C,0x5F,0xA2,0x42,0x0B,0xDD,0x01,0x78,0x00,0x29,0x08,0xD1,0x03,0x70, + 0x06,0x48,0x59,0x00,0x08,0x18,0xFF,0x30,0xA1,0x30,0xC1,0x88,0x49,0x1C,0xC1,0x80, + 0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x10,0xE0,0x01,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF0,0xB4,0x9D,0x00,0x2E,0x4B,0x0A,0x27,0xEB,0x18,0xFF,0x33,0x21,0x33,0x08,0x25, + 0x5D,0x5F,0xDF,0x5F,0x00,0x24,0x84,0x46,0x04,0x9E,0x05,0x98,0x23,0x00,0x01,0x2A, + 0x0E,0xD0,0x02,0x2A,0x3A,0xD0,0x03,0x2A,0x3E,0xD0,0x04,0x2A,0x11,0xD1,0xAB,0x19, + 0x1B,0x06,0x1B,0x16,0x0E,0x2B,0x3B,0xDC,0x0E,0x24,0x67,0x43,0xFC,0x18,0x06,0xE0, + 0xBB,0x1B,0x1B,0x06,0x1B,0x16,0x33,0xD4,0x0E,0x24,0x5C,0x43,0x64,0x19,0x24,0x06, + 0x24,0x0E,0x1C,0x4D,0x64,0x00,0x2D,0x5F,0x1B,0x4C,0x1E,0x26,0xA6,0x5F,0xB5,0x42, + 0x26,0xDD,0x64,0x46,0x24,0x78,0x00,0x2C,0x22,0xD1,0x84,0x00,0x01,0x2A,0x21,0xD0, + 0x84,0x00,0x61,0x18,0x02,0x2A,0x1F,0xD0,0x03,0x2A,0x1F,0xD0,0x04,0x2A,0x00,0xD1, + 0xCB,0x70,0x61,0x46,0x08,0x70,0x41,0x00,0x0D,0x48,0x08,0x18,0xFF,0x30,0xA1,0x30, + 0xC1,0x88,0x49,0x1C,0xC1,0x80,0x01,0x20,0xF0,0xBC,0x70,0x47,0xBB,0x19,0x1B,0x06, + 0x1B,0x16,0x15,0x2B,0xD0,0xDD,0x03,0xE0,0xAB,0x1B,0x1B,0x06,0x1B,0x16,0xC3,0xD5, + 0x00,0x20,0xF1,0xE7,0x0B,0x55,0xE4,0xE7,0x4B,0x70,0xE2,0xE7,0x8B,0x70,0xE0,0xE7, + 0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xE0,0x01,0x00,0x20,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x22,0x03,0xE0,0x03,0x78,0x40,0x1C,0x9A,0x18,0x49,0x1E,0x00,0x29,0xF9,0xDC, + 0x10,0x06,0x00,0x0E,0x70,0x47,0x00,0x00,0xF0,0xB5,0xF3,0x48,0xFF,0xB0,0x00,0x68, + 0x9E,0xB0,0x40,0x30,0x85,0x8B,0x00,0x20,0x96,0x90,0x15,0x20,0x95,0x90,0xEF,0x48, + 0x0C,0x22,0x00,0x21,0x01,0xF0,0xB2,0xFA,0xEC,0x48,0x18,0x22,0x00,0x21,0x0C,0x30, + 0x01,0xF0,0xAC,0xFA,0xFF,0x22,0x6A,0x32,0x00,0x21,0x36,0xA8,0x01,0xF0,0xA6,0xFA, + 0x34,0x22,0x00,0x21,0x29,0xA8,0x01,0xF0,0xA1,0xFA,0x34,0x22,0x00,0x21,0x1C,0xA8, + 0x01,0xF0,0x9C,0xFA,0x34,0x22,0x00,0x21,0x0F,0xA8,0x01,0xF0,0x97,0xFA,0x34,0x22, + 0x00,0x21,0x02,0xA8,0x01,0xF0,0x92,0xFA,0xDD,0x4C,0x64,0x21,0x20,0x89,0x68,0x43, + 0xFC,0xF7,0xAE,0xF9,0xD9,0x49,0x89,0x1D,0x9C,0x91,0xE1,0x89,0x40,0x18,0x9C,0x99, + 0xC8,0x83,0x20,0x79,0x00,0x28,0x7E,0xD0,0x00,0x26,0xF7,0xE0,0xB3,0x00,0x9B,0x18, + 0xFF,0x33,0x21,0x33,0x08,0x22,0x9A,0x5E,0x00,0x21,0x08,0x00,0x00,0x2A,0x03,0xDB, + 0x0E,0x20,0x0E,0x2A,0x00,0xDC,0x10,0x00,0x04,0x06,0x0A,0x20,0x18,0x5E,0x24,0x0E, + 0x00,0x28,0x03,0xDB,0x15,0x21,0x15,0x28,0x00,0xDC,0x01,0x00,0x0D,0x06,0x2D,0x0E, + 0x28,0x00,0x0E,0x21,0x48,0x43,0x9B,0x90,0x00,0x19,0x36,0xA9,0x08,0x5C,0x00,0x28, + 0x04,0xD1,0x96,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x96,0x90,0x01,0x20,0x91,0x90, + 0x94,0x90,0x93,0x90,0x96,0x98,0x29,0xAF,0x83,0x00,0x9A,0x93,0xD8,0x19,0xFD,0x54, + 0x99,0x90,0x45,0x70,0x84,0x70,0xC4,0x70,0x96,0x9A,0x00,0x21,0x68,0x46,0x06,0xC0, + 0xF8,0x5C,0x0E,0x21,0x33,0x00,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x01,0x22, + 0x29,0xA9,0xFF,0xF7,0xED,0xFE,0x00,0x2D,0x92,0x90,0x1D,0xD0,0x00,0x2C,0x0D,0xD0, + 0x68,0x1E,0x0E,0x21,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1E, + 0x6A,0x1E,0x61,0x1E,0xFF,0xF7,0xBC,0xFE,0x0E,0x2C,0x0B,0xD2,0x68,0x1E,0x0E,0x21, + 0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1C,0x6A,0x1E,0x61,0x1C, + 0xFF,0xF7,0xAE,0xFE,0x15,0x2D,0x1D,0xD2,0x00,0x2C,0x0D,0xD0,0x68,0x1C,0x0E,0x21, + 0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1E,0x6A,0x1C,0x61,0x1E, + 0xFF,0xF7,0x9E,0xFE,0x0E,0x2C,0x0D,0xD2,0x68,0x1C,0x0E,0x21,0x48,0x43,0x00,0x19, + 0x36,0xA9,0x40,0x18,0x00,0xE0,0x22,0xE1,0x96,0x9B,0x40,0x1C,0x6A,0x1C,0x61,0x1C, + 0xFF,0xF7,0x8E,0xFE,0x01,0x27,0x6B,0xE0,0x92,0x98,0x00,0x28,0x13,0xD0,0xBC,0x42, + 0x11,0xD3,0x96,0x9A,0x9A,0x98,0x01,0x92,0x29,0xA9,0x00,0x97,0x08,0x5C,0x0E,0x21, + 0x33,0x00,0x40,0x1E,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x01,0x22,0x29,0xA9, + 0xFF,0xF7,0x96,0xFE,0x00,0xE0,0x00,0x20,0x92,0x90,0x91,0x98,0x00,0x28,0x13,0xD0, + 0xE8,0x19,0x15,0x28,0x10,0xD2,0x96,0x9A,0x99,0x98,0x01,0x92,0x00,0x97,0x40,0x78, + 0x0E,0x21,0x33,0x00,0x40,0x1C,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x02,0x22, + 0x29,0xA9,0xFF,0xF7,0x7D,0xFE,0x00,0xE0,0x00,0x20,0x91,0x90,0x94,0x98,0x00,0x28, + 0x11,0xD0,0xBC,0x42,0x0F,0xD3,0x96,0x9A,0x99,0x98,0x00,0x97,0x01,0x92,0x80,0x78, + 0x36,0xA9,0x33,0x00,0x41,0x18,0x9B,0x98,0x03,0x22,0x40,0x1E,0x08,0x18,0x29,0xA9, + 0xFF,0xF7,0x66,0xFE,0x00,0xE0,0x00,0x20,0x94,0x90,0x93,0x98,0x00,0x28,0x12,0xD0, + 0xE0,0x19,0x0E,0x28,0x0F,0xD2,0x96,0x9A,0x99,0x98,0x00,0x97,0x01,0x92,0xC0,0x78, + 0x36,0xA9,0x33,0x00,0x41,0x18,0x9B,0x98,0x04,0x22,0x40,0x1C,0x08,0x18,0x29,0xA9, + 0xFF,0xF7,0x4E,0xFE,0x00,0xE0,0x00,0x20,0x93,0x90,0x91,0x99,0x92,0x98,0x40,0x18, + 0x94,0x99,0x40,0x18,0x93,0x99,0x40,0x18,0x05,0xD0,0x7F,0x1C,0x3F,0x06,0x3F,0x0E, + 0x95,0x98,0x87,0x42,0x90,0xD3,0x76,0x1C,0x36,0x06,0x36,0x0E,0x58,0x4A,0x10,0x79, + 0xB0,0x42,0x00,0xD9,0x02,0xE7,0x14,0x00,0x20,0x79,0x35,0xE0,0x83,0x00,0x1D,0x19, + 0xFF,0x35,0x21,0x35,0x06,0x23,0xEB,0x5E,0x00,0x22,0x11,0x00,0x00,0x2B,0x03,0xDB, + 0x15,0x21,0x15,0x2B,0x00,0xDC,0x19,0x00,0x0B,0x06,0x04,0x21,0x69,0x5E,0x1B,0x0E, + 0x00,0x29,0x03,0xDB,0x0E,0x22,0x0E,0x29,0x00,0xDC,0x0A,0x00,0x11,0x06,0x0E,0x22, + 0x53,0x43,0x09,0x0E,0x59,0x18,0x36,0xAA,0x51,0x5C,0x22,0x18,0x13,0x00,0xFF,0x32, + 0x81,0x32,0x51,0x76,0x51,0x7E,0xFF,0x22,0x59,0x32,0x49,0x00,0x09,0x19,0xFF,0x31, + 0xA1,0x31,0xC9,0x88,0x09,0x06,0x09,0x0E,0xD1,0x54,0xA2,0x8B,0x91,0x42,0x00,0xD9, + 0xA1,0x83,0x40,0x1E,0x00,0x06,0x00,0x0E,0x00,0x28,0xC7,0xD1,0x01,0x25,0x62,0xE0, + 0xAC,0x00,0x29,0xA8,0x01,0x5D,0x20,0x18,0x84,0x46,0x40,0x78,0x97,0x90,0x39,0xE0, + 0x62,0x46,0xD2,0x78,0x60,0x46,0x80,0x78,0x98,0x92,0x2D,0xE0,0x0E,0x22,0x4A,0x43, + 0x12,0x18,0x36,0xAB,0x9B,0x5C,0xAB,0x42,0x22,0xD1,0x2E,0x4B,0x52,0x00,0x9A,0x5E, + 0x9C,0x9E,0x1E,0x23,0xF3,0x5E,0x9A,0x42,0x1A,0xDD,0x29,0x4F,0xD2,0x1A,0x46,0x00, + 0xF6,0x19,0x36,0x8C,0x12,0x04,0x12,0x0C,0x56,0x43,0x1C,0xAB,0x1B,0x59,0x9B,0x19, + 0x1C,0xAE,0x33,0x51,0x4E,0x00,0xF6,0x19,0x40,0x36,0xB6,0x8A,0x0F,0xAB,0x1B,0x59, + 0x56,0x43,0x9B,0x19,0x0F,0xAE,0x33,0x51,0x02,0xAE,0x33,0x59,0x9A,0x18,0x32,0x51, + 0x40,0x1C,0x98,0x9A,0x00,0x06,0x00,0x0E,0x82,0x42,0xCF,0xD2,0x49,0x1C,0x97,0x98, + 0x09,0x06,0x09,0x0E,0x88,0x42,0xC3,0xD2,0x02,0xA8,0x06,0x59,0x00,0x2E,0x12,0xD0, + 0x1C,0xA8,0x00,0x59,0x31,0x00,0xFC,0xF7,0x4B,0xF9,0x11,0x49,0x6A,0x00,0x57,0x18, + 0xFF,0x21,0x6B,0x31,0xC8,0x53,0x0F,0xA8,0x00,0x59,0x31,0x00,0xFC,0xF7,0x40,0xF9, + 0xFF,0x37,0x81,0x37,0x78,0x80,0x0A,0x48,0x40,0x19,0xFF,0x30,0x81,0x30,0x45,0x76, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x06,0x48,0x00,0x79,0xA8,0x42,0x98,0xD2,0x7F,0xB0, + 0x1E,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20,0xDA,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x0E,0x90, + 0x01,0x24,0x0F,0x90,0x0B,0x90,0x09,0x90,0xFF,0x4D,0x07,0x90,0x28,0x78,0xFF,0x4F, + 0x00,0x28,0x0A,0xD0,0xFE,0x48,0x01,0x79,0x06,0x91,0x41,0x79,0x05,0x91,0x81,0x79, + 0x04,0x91,0xC1,0x79,0x03,0x91,0x00,0x7A,0x0C,0xE0,0x38,0x68,0x01,0x00,0x20,0x30, + 0x42,0x7F,0x40,0x31,0x06,0x92,0x82,0x7F,0x05,0x92,0xC0,0x7F,0x04,0x90,0x08,0x78, + 0x03,0x90,0x48,0x78,0x2E,0x22,0x00,0x21,0x02,0x90,0x1C,0xA8,0x01,0xF0,0xA6,0xF8, + 0xF0,0x48,0xF1,0x49,0x00,0x22,0x08,0x81,0xF0,0x48,0x8A,0x81,0x72,0x90,0x42,0x81, + 0xEF,0x48,0xF0,0x4A,0x71,0x90,0x40,0x7A,0x70,0x92,0x02,0x28,0x02,0xD9,0x3A,0x68, + 0x52,0x8C,0x10,0xE0,0x02,0x28,0x06,0xD1,0x3A,0x68,0x70,0x9B,0x12,0x8C,0xDB,0x88, + 0xD2,0x18,0x0C,0x92,0x0F,0xE0,0x2A,0x78,0x00,0x2A,0x06,0xD0,0xE6,0x4A,0x70,0x9B, + 0x92,0x89,0x9B,0x88,0xD2,0x18,0x0C,0x92,0x05,0xE0,0x3A,0x68,0x70,0x9B,0xD2,0x8B, + 0x9B,0x88,0xD2,0x18,0x0C,0x92,0xE1,0x4A,0x0C,0x9B,0x6F,0x92,0x12,0x89,0xDA,0x49, + 0x0E,0x26,0xD2,0x18,0x0D,0x92,0x8E,0x5F,0x01,0x28,0x06,0xD9,0x39,0x68,0xC9,0x7E, + 0x48,0x43,0x04,0x06,0x24,0x0E,0x00,0xD1,0x01,0x24,0x72,0x99,0x3D,0x68,0x08,0x20, + 0x08,0x5E,0xA9,0x7E,0x48,0x43,0x03,0xF0,0xD3,0xF8,0x08,0x04,0x29,0x8B,0x00,0x0C, + 0x81,0x42,0x00,0xD9,0x08,0x00,0x21,0x00,0xFC,0xF7,0xAA,0xF8,0x72,0x99,0x48,0x81, + 0x21,0x00,0x30,0x00,0xFB,0xF7,0x74,0xFF,0x00,0x04,0x00,0x14,0x70,0x99,0x0A,0x90, + 0x40,0x35,0x68,0x89,0x09,0x89,0x0D,0x9E,0x44,0x18,0xB4,0x42,0x00,0xD2,0x0D,0x94, + 0xC7,0x48,0x6E,0x90,0x80,0x7B,0xC1,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x01,0x20, + 0x00,0xE0,0x02,0x20,0x09,0x90,0xC3,0x49,0x00,0x20,0x6D,0x91,0xBA,0x4F,0x88,0x83, + 0x78,0x89,0xA9,0x7B,0x48,0x43,0x03,0xF0,0xD7,0xF8,0x08,0x04,0x6D,0x99,0x00,0x14, + 0xC8,0x83,0xA9,0x89,0x88,0x42,0x02,0xDA,0xA8,0x89,0x6D,0x99,0xC8,0x83,0x0D,0x98, + 0x0C,0x21,0x00,0x04,0x00,0x14,0x6C,0x90,0x20,0x04,0x00,0x14,0x6B,0x90,0x30,0x04, + 0x00,0x14,0x6A,0x90,0x09,0x98,0x00,0x25,0xC0,0x07,0xC0,0x0F,0x09,0x1A,0x69,0x91, + 0x0D,0x21,0x08,0x1A,0x68,0x90,0x09,0x98,0x13,0x21,0x80,0x07,0xC0,0x0F,0x09,0x1A, + 0x67,0x91,0x14,0x21,0x08,0x1A,0x66,0x90,0xAB,0x48,0x65,0x90,0x0E,0x20,0x68,0x43, + 0xA1,0x49,0x64,0x90,0x68,0x00,0x00,0x24,0x40,0x18,0x40,0x30,0x63,0x90,0x64,0x98, + 0xA6,0x49,0x00,0x19,0x00,0x04,0x00,0x14,0x1B,0x90,0x40,0x00,0x62,0x90,0x08,0x5E, + 0x6D,0x99,0x1E,0x22,0x8A,0x5E,0x90,0x42,0x02,0xDD,0x88,0x8B,0x40,0x1C,0x88,0x83, + 0x9F,0x49,0x62,0x98,0x08,0x5E,0x6C,0x99,0x88,0x42,0x61,0x90,0x00,0xDA,0xFE,0xE3, + 0x00,0x20,0x00,0x2D,0x25,0xDD,0x1B,0x99,0x01,0x26,0x0E,0x39,0xC8,0x10,0x4B,0x07, + 0x1C,0xAA,0x10,0x5C,0x5B,0x0F,0x31,0x00,0x99,0x40,0x08,0x40,0x00,0x2C,0x0B,0xDD, + 0x1B,0x99,0x0F,0x39,0xCB,0x10,0xD7,0x5C,0x49,0x07,0x49,0x0F,0x33,0x00,0x8B,0x40, + 0x1F,0x40,0x38,0x18,0x00,0x06,0x00,0x0E,0x0D,0x2C,0x0C,0xDA,0x1B,0x99,0x0D,0x39, + 0xCB,0x10,0x49,0x07,0xD2,0x5C,0x49,0x0F,0x8E,0x40,0x32,0x40,0x10,0x18,0x00,0x06, + 0x00,0x0E,0x00,0x2C,0x0C,0xDD,0x1B,0x99,0x1C,0xAB,0x49,0x1E,0xCA,0x10,0x9A,0x5C, + 0x4B,0x07,0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40,0x10,0x18,0x00,0x06,0x00,0x0E, + 0x00,0x28,0x00,0xD0,0xC3,0xE3,0x7F,0x48,0x00,0x7D,0x80,0x07,0x06,0xD5,0x0D,0x2C, + 0x0E,0xD1,0x7D,0x48,0x00,0x78,0x01,0x28,0x0A,0xD1,0x05,0xE0,0x14,0x2D,0x07,0xD1, + 0x79,0x48,0x00,0x78,0x01,0x28,0x03,0xD1,0x74,0x4A,0x62,0x99,0x00,0x20,0x50,0x52, + 0x00,0x26,0x37,0x00,0xE9,0x19,0x8C,0x46,0x00,0x20,0x49,0x1E,0x0E,0x22,0x51,0x43, + 0x60,0x91,0x21,0x18,0x62,0x46,0x52,0x1E,0x49,0x1E,0x00,0x2A,0x0D,0xDB,0x15,0x2A, + 0x0B,0xDC,0x00,0x29,0x09,0xDB,0x0E,0x29,0x07,0xDC,0x60,0x9A,0x51,0x18,0x4A,0x00, + 0x67,0x49,0x89,0x5E,0xB1,0x42,0x00,0xDD,0x0E,0x00,0x40,0x1C,0x00,0x04,0x00,0x14, + 0x03,0x28,0xE6,0xDB,0x7F,0x1C,0x3F,0x04,0x3F,0x14,0x03,0x2F,0xDA,0xDB,0x61,0x99, + 0x30,0x04,0x00,0x14,0x81,0x42,0x00,0xD0,0x81,0xE3,0x53,0x49,0x89,0x89,0x81,0x42, + 0x06,0xDC,0x51,0x49,0x88,0x81,0x08,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x0F,0x90, + 0x1B,0x98,0x1B,0x99,0xC0,0x10,0x4B,0x07,0x1C,0xAA,0x16,0x5C,0x5B,0x0F,0x01,0x21, + 0x99,0x40,0x0E,0x43,0x16,0x54,0x00,0x20,0x08,0x90,0x09,0x98,0xC0,0x07,0x0A,0xD0, + 0x0D,0x2C,0x01,0xD1,0x0D,0x20,0x09,0xE0,0x0C,0x2C,0x0F,0xD1,0x08,0x98,0x21,0x04, + 0x08,0x43,0x08,0x90,0x0A,0xE0,0x14,0x2D,0x02,0xD1,0x14,0x20,0x08,0x90,0x05,0xE0, + 0x13,0x2D,0x03,0xD1,0x08,0x98,0x29,0x04,0x08,0x43,0x08,0x90,0x08,0x98,0x00,0x04, + 0x61,0x98,0x04,0xD0,0x6B,0x99,0x88,0x42,0x00,0xDA,0x48,0xE3,0x03,0xE0,0x6A,0x99, + 0x88,0x42,0x00,0xDA,0x43,0xE3,0x31,0x49,0x08,0x68,0x5F,0x90,0x00,0x88,0x40,0x04, + 0x04,0xD5,0x31,0x4A,0x61,0x98,0xD2,0x89,0x80,0x1A,0x05,0xE0,0x37,0x4A,0x62,0x98, + 0x10,0x5E,0x2D,0x4A,0xD2,0x89,0x80,0x1A,0x00,0x28,0x00,0xDC,0x2F,0xE3,0x72,0x9B, + 0x0A,0x22,0x9A,0x5E,0x82,0x42,0x00,0xDB,0x29,0xE3,0x00,0x20,0x84,0x46,0x10,0x90, + 0x61,0x46,0x69,0x18,0x89,0x1E,0x09,0x06,0x09,0x16,0x0E,0x22,0x5E,0x91,0x51,0x43, + 0x5D,0x91,0x0A,0x23,0x61,0x46,0x59,0x43,0x2D,0xAA,0x8A,0x18,0x5C,0x92,0x00,0x20, + 0x3A,0xAA,0x8E,0x18,0x21,0x18,0x89,0x1E,0x5E,0x9A,0x09,0x06,0x09,0x16,0x16,0x2A, + 0x03,0xD2,0x00,0x29,0x01,0xDB,0x0E,0x29,0x03,0xDD,0x00,0x21,0x42,0x00,0xB1,0x52, + 0x69,0xE0,0x5F,0x9A,0x12,0x88,0x52,0x04,0x5D,0x9A,0x08,0xD5,0x1C,0x4B,0x52,0x18, + 0x52,0x00,0x9A,0x5A,0x0A,0x9B,0xD2,0x1A,0x43,0x00,0xF2,0x52,0x07,0xE0,0x17,0x4B, + 0x52,0x18,0x52,0x00,0x9A,0x5A,0x0A,0x9B,0xD2,0x1A,0x43,0x00,0xF2,0x52,0x42,0x00, + 0xB3,0x5E,0x00,0x2B,0x01,0xDA,0x00,0x27,0xB7,0x52,0x5F,0x9B,0x5D,0x9F,0x1B,0x88, + 0x1B,0x04,0x2B,0xD5,0x79,0x18,0x21,0xE0,0x20,0x07,0x00,0x20,0xCC,0x07,0x00,0x20, + 0xE0,0x95,0x00,0x00,0xFF,0x0F,0x00,0x00,0x40,0x00,0x00,0x20,0x20,0x01,0x00,0x20, + 0x00,0x02,0x00,0x20,0x00,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0xA0,0x01,0x00,0x20, + 0x40,0x06,0x00,0x20,0x20,0x06,0x00,0x20,0x80,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0xD2,0x07,0x00,0x20,0x00,0x93,0x00,0x00,0x48,0x07,0x00,0x20,0xFF,0x4B,0x49,0x00, + 0x59,0x5A,0x0A,0x9B,0x5C,0x9F,0xC9,0x1A,0xB9,0x52,0x07,0xE0,0xFC,0x4B,0x79,0x18, + 0x49,0x00,0x59,0x5A,0x0A,0x9B,0x5C,0x9F,0xC9,0x1A,0xB9,0x52,0x5C,0x99,0x89,0x5E, + 0x00,0x29,0x02,0xDA,0x5C,0x9F,0x00,0x21,0xB9,0x52,0x61,0x46,0x00,0x29,0x0A,0xD0, + 0x04,0x29,0x08,0xD0,0x00,0x28,0x06,0xD0,0x04,0x28,0x04,0xD0,0x10,0x99,0x49,0x1C, + 0x09,0x06,0x09,0x0E,0x10,0x91,0x40,0x1C,0x00,0x04,0x00,0x14,0x05,0x28,0x81,0xDB, + 0x60,0x46,0x40,0x1C,0x00,0x04,0x00,0x14,0x05,0x28,0x84,0x46,0x00,0xDA,0x67,0xE7, + 0xE8,0x48,0x00,0x78,0x00,0x28,0x39,0xD1,0x10,0x98,0x40,0x1E,0x07,0x06,0x3F,0x0E, + 0x00,0xD1,0x01,0x27,0x02,0x22,0x40,0xAB,0x9A,0x5E,0x30,0xAB,0x3E,0x26,0x00,0x92, + 0x9E,0x5F,0x38,0x22,0x36,0x21,0x34,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00, + 0x01,0xF0,0x21,0xFE,0x40,0xAB,0x06,0x00,0x0C,0x22,0x0A,0x21,0x08,0x20,0x9A,0x5E, + 0x59,0x5E,0x18,0x5E,0x01,0xF0,0x14,0xFE,0x30,0x18,0x39,0x00,0xFB,0xF7,0x70,0xFD, + 0x01,0x04,0x00,0x20,0x40,0xAB,0x18,0x5E,0x09,0x0C,0x42,0x1A,0x00,0x2A,0x00,0xDC, + 0x0A,0x1A,0xD1,0x49,0x09,0x68,0xC0,0x31,0x0B,0x88,0x9A,0x42,0x06,0xDA,0x49,0x88, + 0x88,0x42,0x03,0xDA,0x08,0x98,0x00,0x04,0x00,0xD1,0x50,0xE2,0x12,0x22,0x00,0x21, + 0x28,0xA8,0x00,0xF0,0x33,0xFE,0x30,0xAB,0x18,0x88,0x20,0xAB,0xC6,0x49,0x18,0x84, + 0x30,0xAB,0x58,0x88,0x20,0xAB,0x58,0x84,0x30,0xAB,0x98,0x88,0x20,0xAB,0x98,0x84, + 0x30,0xAB,0x58,0x89,0x20,0xAB,0xD8,0x84,0x30,0xAB,0xD8,0x89,0x20,0xAB,0x58,0x85, + 0x30,0xAB,0x98,0x8A,0x20,0xAB,0x98,0x85,0x30,0xAB,0xD8,0x8A,0x20,0xAB,0xD8,0x85, + 0x30,0xAB,0x18,0x8B,0x20,0xAB,0x18,0x86,0x09,0x68,0x0C,0x20,0x30,0xAB,0x18,0x5E, + 0x89,0x8B,0x48,0x43,0x02,0xF0,0x7C,0xFE,0x20,0xAB,0x19,0x85,0x02,0x22,0x40,0xAB, + 0x9A,0x5E,0x30,0xAB,0x3E,0x26,0x00,0x92,0x9E,0x5F,0x38,0x22,0x36,0x21,0x34,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0xFF,0xF7,0x1B,0xFB,0x40,0xAB,0x06,0x00, + 0x0C,0x22,0x0A,0x21,0x08,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0xFF,0xF7,0x0A,0xFB, + 0x01,0x00,0x30,0x00,0xFF,0xF7,0x02,0xFB,0x00,0x21,0x40,0xAB,0x59,0x5E,0x7D,0x22, + 0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42,0x05,0xDD,0x08,0x1A,0x51,0x10,0x88,0x42, + 0x01,0xDD,0x01,0x20,0x07,0x90,0x9D,0x48,0xFF,0x21,0xC0,0x88,0x09,0x31,0x08,0x42, + 0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20,0x07,0x90,0x68,0x98,0x04,0x26,0x14,0x90, + 0x66,0x98,0x13,0x90,0x06,0x98,0x80,0x07,0x42,0xD5,0x00,0x2C,0x1E,0xD1,0x0A,0x20, + 0x70,0x43,0x3A,0xA9,0x47,0x18,0x04,0x21,0x79,0x5E,0x06,0x20,0x64,0x22,0x5B,0x91, + 0x38,0x5E,0x49,0x1C,0x50,0x43,0xFB,0xF7,0xDB,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04, + 0x09,0x14,0x00,0xD5,0x00,0x21,0x03,0x9A,0x5B,0x98,0x51,0x43,0x48,0x43,0x02,0xF0, + 0x31,0xFE,0x02,0x20,0x38,0x5E,0x88,0x42,0x00,0xDA,0x79,0x80,0x14,0x98,0x84,0x42, + 0x1E,0xD1,0x0A,0x20,0x70,0x43,0x3A,0xA9,0x47,0x18,0x04,0x21,0x79,0x5E,0x02,0x20, + 0x64,0x22,0x5A,0x91,0x38,0x5E,0x49,0x1C,0x50,0x43,0xFB,0xF7,0xB9,0xFC,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x02,0x9A,0x5A,0x98,0x51,0x43, + 0x48,0x43,0x02,0xF0,0x0F,0xFE,0x06,0x20,0x38,0x5E,0x88,0x42,0x00,0xDA,0xF9,0x80, + 0x06,0x98,0xC0,0x07,0x40,0xD0,0x00,0x2D,0x1D,0xD1,0x70,0x00,0x3A,0xA9,0x47,0x18, + 0x14,0x21,0x79,0x5E,0x1E,0x20,0x64,0x22,0x59,0x91,0x38,0x5E,0x49,0x1C,0x50,0x43, + 0xFB,0xF7,0x96,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21, + 0x05,0x9A,0x59,0x98,0x51,0x43,0x48,0x43,0x02,0xF0,0xEC,0xFD,0x0A,0x20,0x38,0x5E, + 0x88,0x42,0x00,0xDA,0x79,0x81,0x13,0x98,0x85,0x42,0x1D,0xD1,0x70,0x00,0x3A,0xA9, + 0x47,0x18,0x14,0x21,0x79,0x5E,0x0A,0x20,0x64,0x22,0x58,0x91,0x38,0x5E,0x49,0x1C, + 0x50,0x43,0xFB,0xF7,0x75,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5, + 0x00,0x21,0x04,0x9A,0x58,0x98,0x51,0x43,0x48,0x43,0x02,0xF0,0xCB,0xFD,0x1E,0x20, + 0x38,0x5E,0x88,0x42,0x00,0xDA,0xF9,0x83,0x76,0x1E,0x36,0x04,0x36,0x14,0x00,0xD4, + 0x70,0xE7,0x06,0x98,0x00,0x26,0x80,0x07,0x00,0xD5,0xF0,0x26,0x06,0x98,0xC0,0x07, + 0x01,0xD0,0x3C,0x20,0x06,0x43,0xB0,0x09,0x1F,0xD0,0x14,0x98,0x84,0x42,0x1C,0xD1, + 0x00,0x2D,0x1A,0xD1,0x40,0xAB,0x08,0x20,0x18,0x5E,0x64,0x22,0x5F,0x5F,0x50,0x43, + 0x79,0x1C,0xFB,0xF7,0x45,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5, + 0x00,0x21,0x02,0x9A,0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0x9B,0xFD,0x38,0x20, + 0x30,0xAB,0x18,0x5E,0x88,0x42,0x00,0xDA,0x19,0x87,0xB0,0x06,0x80,0x0F,0x22,0xD0, + 0x14,0x98,0x84,0x42,0x1F,0xD1,0x13,0x98,0x85,0x42,0x1C,0xD1,0x00,0x27,0x40,0xAB, + 0xDF,0x5F,0x34,0x20,0x30,0xAB,0x18,0x5E,0x64,0x22,0x79,0x1C,0x50,0x43,0xFB,0xF7, + 0x1F,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x02,0x9A, + 0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0x75,0xFD,0x0C,0x20,0x40,0xAB,0x18,0x5E, + 0x88,0x42,0x00,0xDA,0x99,0x81,0x30,0x07,0x80,0x0F,0x20,0xD0,0x13,0x98,0x85,0x42, + 0x1D,0xD1,0x00,0x2C,0x1B,0xD1,0x40,0xAB,0x1E,0x5F,0x38,0x20,0x30,0xAB,0x18,0x5E, + 0x64,0x22,0x71,0x1C,0x50,0x43,0xFB,0xF7,0xFB,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04, + 0x09,0x14,0x00,0xD5,0x00,0x21,0x04,0x9A,0x30,0x00,0x51,0x43,0x48,0x43,0x02,0xF0, + 0x51,0xFD,0x08,0x20,0x40,0xAB,0x18,0x5E,0x88,0x42,0x00,0xDA,0x19,0x81,0x12,0x48, + 0x04,0x27,0x06,0x68,0x40,0x36,0xB0,0x78,0x80,0x06,0x31,0xD5,0x00,0x2C,0x2F,0xD1, + 0x0A,0x20,0x78,0x43,0x3A,0xA9,0x40,0x18,0x57,0x90,0x04,0x21,0x06,0x22,0x41,0x5E, + 0x82,0x5E,0x64,0x20,0x49,0x1C,0x50,0x43,0x56,0x92,0xFB,0xF7,0xD1,0xFB,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x09,0xE0,0xD2,0x07,0x00,0x20, + 0x00,0x00,0x00,0x10,0x21,0x07,0x00,0x20,0xCC,0x07,0x00,0x20,0x40,0x00,0x00,0x20, + 0x72,0x79,0x56,0x98,0x50,0x43,0x48,0x43,0x02,0xF0,0x1C,0xFD,0x56,0x98,0x40,0x1A, + 0x57,0x99,0x00,0x04,0x00,0x14,0xC8,0x80,0x02,0xD5,0x57,0x99,0x00,0x20,0xC8,0x80, + 0xB0,0x78,0xC0,0x06,0x24,0xD5,0x01,0x2C,0x22,0xD1,0x0A,0x20,0x78,0x43,0x3A,0xA9, + 0x40,0x18,0x72,0x79,0x06,0x21,0x55,0x90,0x41,0x5E,0x4A,0x43,0x04,0x21,0x41,0x5E, + 0x10,0x00,0x49,0x1C,0xFB,0xF7,0x9C,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14, + 0x00,0xD5,0x00,0x21,0x55,0x9A,0x02,0x20,0x10,0x5E,0x48,0x43,0x02,0xF0,0xE0,0xFC, + 0x08,0x04,0x55,0x99,0x00,0x14,0x48,0x80,0x02,0xD5,0x55,0x99,0x00,0x20,0x48,0x80, + 0xB0,0x78,0x40,0x06,0x25,0xD5,0x69,0x98,0xA0,0x42,0x22,0xD1,0x0A,0x20,0x78,0x43, + 0x3A,0xA9,0x40,0x18,0xB2,0x79,0x02,0x21,0x54,0x90,0x41,0x5E,0x4A,0x43,0x04,0x21, + 0x41,0x5E,0x10,0x00,0x49,0x1C,0xFB,0xF7,0x73,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04, + 0x09,0x14,0x00,0xD5,0x00,0x21,0x54,0x9A,0x06,0x20,0x10,0x5E,0x48,0x43,0x02,0xF0, + 0xB7,0xFC,0x08,0x04,0x54,0x99,0x00,0x14,0xC8,0x80,0x02,0xD5,0x54,0x99,0x00,0x20, + 0xC8,0x80,0xB0,0x78,0x00,0x06,0x27,0xD5,0x68,0x98,0xA0,0x42,0x24,0xD1,0x0A,0x20, + 0x78,0x43,0x3A,0xA9,0x40,0x18,0x53,0x90,0x04,0x21,0x02,0x22,0x41,0x5E,0x82,0x5E, + 0x64,0x20,0x49,0x1C,0x50,0x43,0x52,0x92,0xFB,0xF7,0x4A,0xFB,0x64,0x21,0x08,0x1A, + 0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0xB2,0x79,0x52,0x98,0x50,0x43,0x48,0x43, + 0x02,0xF0,0xA0,0xFC,0x52,0x98,0x40,0x1A,0x53,0x99,0x00,0x04,0x00,0x14,0x48,0x80, + 0x02,0xD5,0x53,0x99,0x00,0x20,0x48,0x80,0xB0,0x78,0x80,0x07,0x25,0xD5,0x00,0x2D, + 0x23,0xD1,0x79,0x00,0x3A,0xA8,0x08,0x18,0x51,0x90,0x14,0x21,0x1E,0x22,0x41,0x5E, + 0x82,0x5E,0x64,0x20,0x49,0x1C,0x50,0x43,0x50,0x92,0xFB,0xF7,0x21,0xFB,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0xF2,0x78,0x50,0x98,0x50,0x43, + 0x48,0x43,0x02,0xF0,0x77,0xFC,0x50,0x98,0x40,0x1A,0x51,0x99,0x00,0x04,0x00,0x14, + 0xC8,0x83,0x02,0xD5,0x51,0x99,0x00,0x20,0xC8,0x83,0xB0,0x78,0x00,0xE0,0x59,0xE2, + 0xC0,0x07,0x23,0xD0,0x01,0x2D,0x21,0xD1,0x79,0x00,0x3A,0xA8,0x08,0x18,0xF2,0x78, + 0x1E,0x21,0x4F,0x90,0x41,0x5E,0x4A,0x43,0x14,0x21,0x41,0x5E,0x10,0x00,0x49,0x1C, + 0xFB,0xF7,0xF6,0xFA,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21, + 0x4F,0x9A,0x0A,0x20,0x10,0x5E,0x48,0x43,0x02,0xF0,0x3A,0xFC,0x08,0x04,0x4F,0x99, + 0x00,0x14,0x48,0x81,0x02,0xD5,0x4F,0x99,0x00,0x20,0x48,0x81,0xB0,0x78,0x40,0x07, + 0x24,0xD5,0x67,0x98,0xA8,0x42,0x21,0xD1,0x78,0x00,0x3A,0xA9,0x40,0x18,0x32,0x79, + 0x0A,0x21,0x4E,0x90,0x41,0x5E,0x4A,0x43,0x14,0x21,0x41,0x5E,0x10,0x00,0x49,0x1C, + 0xFB,0xF7,0xCE,0xFA,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21, + 0x4E,0x9A,0x1E,0x20,0x10,0x5E,0x48,0x43,0x02,0xF0,0x12,0xFC,0x08,0x04,0x4E,0x99, + 0x00,0x14,0xC8,0x83,0x02,0xD5,0x4E,0x99,0x00,0x20,0xC8,0x83,0xB0,0x78,0x00,0x07, + 0x26,0xD5,0x66,0x98,0xA8,0x42,0x23,0xD1,0x78,0x00,0x3A,0xA9,0x40,0x18,0x4D,0x90, + 0x14,0x21,0x0A,0x22,0x41,0x5E,0x82,0x5E,0x64,0x20,0x49,0x1C,0x50,0x43,0x4C,0x92, + 0xFB,0xF7,0xA6,0xFA,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21, + 0x32,0x79,0x4C,0x98,0x50,0x43,0x48,0x43,0x02,0xF0,0xFC,0xFB,0x4C,0x98,0x40,0x1A, + 0x4D,0x99,0x00,0x04,0x00,0x14,0x48,0x81,0x02,0xD5,0x4D,0x99,0x00,0x20,0x48,0x81, + 0x7F,0x1E,0x3F,0x04,0x3F,0x14,0x00,0xD4,0xA5,0xE6,0x08,0x98,0x00,0x28,0x2C,0xD0, + 0x09,0x98,0xC0,0x07,0x16,0xD0,0x04,0x20,0x00,0x22,0x3A,0xAE,0x08,0x99,0x09,0x04, + 0x06,0xD0,0x0A,0x23,0x01,0x00,0x59,0x43,0x72,0x52,0x89,0x19,0x4A,0x80,0x04,0xE0, + 0x0A,0x21,0x41,0x43,0x89,0x19,0xCA,0x80,0x0A,0x81,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xEC,0xD5,0x12,0xE0,0x04,0x20,0x00,0x22,0x3A,0xAE,0x08,0x99,0x09,0x04,0x04,0xD0, + 0x41,0x00,0x72,0x52,0x89,0x19,0x4A,0x81,0x03,0xE0,0x41,0x00,0x89,0x19,0xCA,0x83, + 0x0A,0x85,0x40,0x1E,0x00,0x04,0x00,0x14,0xEF,0xD5,0x00,0x26,0x37,0x00,0xE9,0x19, + 0x4B,0x91,0x00,0x20,0x49,0x1E,0x0E,0x22,0x51,0x43,0x8C,0x46,0x4B,0x9A,0x21,0x18, + 0x52,0x1E,0x49,0x1E,0x00,0x2A,0x0C,0xDB,0x15,0x2A,0x0A,0xDC,0x00,0x29,0x08,0xDB, + 0x0E,0x29,0x06,0xDC,0xF9,0x4A,0x61,0x44,0x49,0x00,0x51,0x5E,0xB1,0x42,0x00,0xDD, + 0x0E,0x00,0x40,0x1C,0x00,0x04,0x00,0x14,0x03,0x28,0xE7,0xDB,0x7F,0x1C,0x3F,0x04, + 0x3F,0x14,0x03,0x2F,0xDB,0xDB,0xF2,0x49,0x30,0x04,0x0A,0x89,0x00,0x14,0x82,0x42, + 0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81,0xEC,0x49,0x20,0xAB, + 0x08,0x79,0x26,0x22,0x40,0x1C,0x00,0x06,0x00,0x0E,0x08,0x71,0x80,0x00,0x40,0x18, + 0xFF,0x30,0x21,0x30,0x84,0x80,0x08,0x79,0x80,0x00,0x40,0x18,0xFF,0x30,0x21,0x30, + 0xC5,0x80,0x28,0x20,0x9A,0x5E,0x18,0x5E,0x00,0x21,0x82,0x42,0x07,0xDC,0x20,0x22, + 0x9A,0x5E,0x82,0x42,0x03,0xDC,0x2C,0x22,0x9A,0x5E,0x82,0x42,0x00,0xDD,0xC0,0x21, + 0x2A,0x22,0x20,0xAB,0x9A,0x5E,0x82,0x42,0x07,0xDC,0x24,0x22,0x9A,0x5E,0x82,0x42, + 0x03,0xDC,0x30,0x22,0x9A,0x5E,0x82,0x42,0x01,0xDD,0x30,0x22,0x11,0x43,0x22,0x22, + 0x20,0xAB,0x9A,0x5E,0x82,0x42,0x07,0xDC,0x20,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC, + 0x24,0x22,0x9A,0x5E,0x82,0x42,0x01,0xDD,0x0C,0x22,0x11,0x43,0x2E,0x22,0x20,0xAB, + 0x9A,0x5E,0x82,0x42,0x07,0xDC,0x2C,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC,0x30,0x22, + 0x9A,0x5E,0x82,0x42,0x01,0xDD,0x03,0x20,0x01,0x43,0x8F,0x06,0x0A,0x07,0x04,0x20, + 0x94,0x46,0x00,0x22,0x8B,0x09,0x04,0xD1,0x0A,0x26,0x03,0x00,0x73,0x43,0x3A,0xAE, + 0xF2,0x52,0xBB,0x0F,0x05,0xD1,0x0A,0x26,0x03,0x00,0x73,0x43,0x3A,0xAE,0x9B,0x19, + 0x1A,0x81,0x63,0x46,0x9B,0x0F,0x02,0xD1,0x43,0x00,0x3A,0xAE,0xF2,0x52,0x8B,0x07, + 0x03,0xD1,0x43,0x00,0x3A,0xAE,0x9B,0x19,0x1A,0x85,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xE0,0xD5,0x30,0x22,0x30,0xAB,0x9A,0x5E,0x2E,0x26,0x2A,0x21,0x00,0x92,0x9E,0x5F, + 0x2C,0x22,0x28,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x4B,0xFA, + 0x3A,0x22,0x30,0xAB,0x19,0x90,0x9A,0x5E,0x38,0x26,0x34,0x21,0x00,0x92,0x9E,0x5F, + 0x36,0x22,0x32,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x3B,0xFA, + 0x04,0x22,0x40,0xAB,0x18,0x90,0x9A,0x5E,0x02,0x26,0x3E,0x21,0x00,0x92,0x00,0x22, + 0x9E,0x5F,0x9A,0x5E,0x30,0xAB,0x3C,0x20,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0, + 0x2A,0xFA,0x0E,0x22,0x40,0xAB,0x17,0x90,0x9A,0x5E,0x0C,0x26,0x08,0x21,0x00,0x92, + 0x9E,0x5F,0x0A,0x22,0x06,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0, + 0x1A,0xFA,0x18,0x22,0x40,0xAB,0x16,0x90,0x9A,0x5E,0x16,0x26,0x12,0x21,0x00,0x92, + 0x9E,0x5F,0x14,0x22,0x10,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0, + 0x0A,0xFA,0x15,0x90,0x00,0x90,0x16,0x9B,0x17,0x9A,0x18,0x99,0x19,0x98,0x01,0xF0, + 0x02,0xFA,0x00,0x28,0x1A,0x90,0x09,0xD1,0x32,0x22,0x00,0x21,0x3A,0xA8,0x00,0xF0, + 0x35,0xFA,0x0A,0x20,0x40,0xAB,0x17,0x90,0x18,0x80,0x1A,0x90,0x10,0x22,0x40,0xAB, + 0x9A,0x5E,0x06,0x26,0x32,0x21,0x00,0x92,0x9E,0x5F,0x30,0xAB,0x3C,0x22,0x28,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0xE5,0xF9,0x78,0x4A,0x61,0x00, + 0x8E,0x18,0xF1,0x8B,0x12,0x22,0x40,0xAB,0x48,0x43,0x14,0x90,0x9A,0x5E,0x08,0x27, + 0x34,0x21,0x00,0x92,0xDF,0x5F,0x30,0xAB,0x3E,0x22,0x2A,0x20,0x9A,0x5E,0x59,0x5E, + 0x18,0x5E,0x3B,0x00,0x01,0xF0,0xCF,0xF9,0x31,0x8C,0x14,0x22,0x40,0xAB,0x48,0x43, + 0x13,0x90,0x9A,0x5E,0x0A,0x27,0x36,0x21,0x00,0x92,0x00,0x22,0xDF,0x5F,0x9A,0x5E, + 0x30,0xAB,0x2C,0x20,0x59,0x5E,0x18,0x5E,0x3B,0x00,0x01,0xF0,0xBC,0xF9,0x71,0x8C, + 0x16,0x22,0x40,0xAB,0x48,0x43,0x12,0x90,0x9A,0x5E,0x0C,0x27,0x38,0x21,0x00,0x92, + 0x02,0x22,0xDF,0x5F,0x9A,0x5E,0x30,0xAB,0x2E,0x20,0x59,0x5E,0x18,0x5E,0x3B,0x00, + 0x01,0xF0,0xA9,0xF9,0xB1,0x8C,0x07,0x00,0x18,0x22,0x4F,0x43,0x40,0xAB,0x11,0x97, + 0x9A,0x5E,0x0E,0x27,0x3A,0x21,0x00,0x92,0x04,0x22,0xDF,0x5F,0x9A,0x5E,0x30,0xAB, + 0x30,0x20,0x59,0x5E,0x18,0x5E,0x3B,0x00,0x01,0xF0,0x95,0xF9,0xF1,0x8C,0x11,0x9B, + 0x12,0x9A,0x48,0x43,0x00,0x90,0x13,0x99,0x14,0x98,0x01,0xF0,0x8C,0xF9,0x1A,0x99, + 0xFB,0xF7,0xE6,0xF8,0x4A,0x49,0x09,0x8C,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20, + 0x47,0x4F,0x39,0x79,0x49,0x00,0xC9,0x19,0xE0,0x31,0x88,0x82,0x63,0x98,0x19,0x99, + 0x40,0x8A,0x18,0x9A,0x17,0x9B,0x48,0x43,0x63,0x99,0x89,0x8A,0x51,0x43,0x63,0x9A, + 0xD2,0x8A,0x5A,0x43,0x94,0x46,0x63,0x9A,0x15,0x9B,0x16,0x8B,0x16,0x9A,0x56,0x43, + 0x63,0x9A,0x52,0x8B,0x5A,0x43,0x00,0x92,0x33,0x00,0x62,0x46,0x01,0xF0,0x63,0xF9, + 0x1A,0x99,0xFB,0xF7,0xBD,0xF8,0x65,0x99,0x89,0x8A,0x49,0x00,0x40,0x1A,0x00,0xD5, + 0x00,0x20,0x39,0x79,0x49,0x00,0xC9,0x19,0xFF,0x31,0x01,0x31,0xC8,0x81,0x38,0x79, + 0x0C,0x28,0x10,0xD2,0x64,0x1C,0x24,0x04,0x24,0x14,0x0E,0x2C,0x01,0xDA,0xFF,0xF7, + 0x86,0xF9,0x0E,0x98,0x00,0x28,0x06,0xD1,0x6D,0x1C,0x2D,0x04,0x2D,0x14,0x15,0x2D, + 0x01,0xDA,0xFF,0xF7,0x73,0xF9,0x27,0x48,0x04,0x68,0x20,0x88,0x00,0x06,0x52,0xD5, + 0x23,0x4A,0x10,0x79,0x00,0x28,0x6F,0x98,0x0C,0xD1,0x00,0x89,0x00,0x28,0x43,0xD0, + 0x6F,0x98,0x20,0x34,0x40,0x79,0x21,0x7F,0x88,0x42,0x3D,0xD2,0x6F,0x99,0x40,0x1C, + 0x48,0x71,0x40,0xE0,0x25,0x00,0x20,0x35,0x80,0x79,0x29,0x7D,0x88,0x42,0x29,0xD8, + 0x40,0x1C,0x6F,0x99,0x00,0x06,0x00,0x0E,0x88,0x71,0x69,0x7D,0x81,0x42,0x03,0xD2, + 0x92,0x89,0x0B,0x9B,0xD2,0x18,0x0B,0x92,0x2A,0x7D,0x90,0x42,0x1A,0xD1,0x88,0x42, + 0x18,0xD0,0x41,0x1A,0x0B,0x98,0xFB,0xF7,0x9B,0xF9,0x6F,0x9A,0x00,0x21,0x11,0x81, + 0x21,0x8F,0x81,0x42,0x0E,0xD2,0x0C,0x99,0x40,0x1A,0xA9,0x7D,0x48,0x43,0x02,0xF0, + 0xE3,0xF9,0x08,0x04,0x6F,0x99,0x00,0x0C,0x08,0x81,0x61,0x8F,0x88,0x42,0x01,0xD9, + 0x6F,0x98,0x01,0x81,0x6F,0x98,0x00,0x21,0x41,0x71,0x0C,0xE0,0x00,0x00,0x00,0x10, + 0x40,0x00,0x00,0x20,0xCC,0x07,0x00,0x20,0x6F,0x99,0x00,0x20,0x88,0x71,0x6F,0x99, + 0x48,0x71,0x6F,0x99,0x08,0x81,0x00,0x20,0x84,0x46,0x09,0x90,0x67,0x48,0x01,0x22, + 0x00,0x79,0x01,0x28,0x4A,0x90,0x4E,0xDB,0x6E,0x98,0xC0,0x7B,0x49,0x90,0x63,0x49, + 0x50,0x00,0x40,0x18,0xF4,0x23,0x1B,0x5A,0x61,0x4C,0xFF,0x30,0x63,0x43,0x01,0x30, + 0xC0,0x89,0xDD,0x0C,0x23,0x00,0x58,0x43,0xC6,0x0C,0x49,0x9B,0x00,0x20,0x00,0x2B, + 0x09,0x90,0x32,0xDD,0x14,0x06,0x59,0x4B,0x24,0x0E,0x91,0x00,0x48,0x94,0xCC,0x18, + 0xFF,0x34,0x21,0x34,0x55,0x49,0xC3,0x00,0x59,0x18,0x03,0x23,0x5B,0x02,0xC9,0x18, + 0x10,0x27,0xCF,0x5F,0xAF,0x42,0x1A,0xDC,0x14,0x27,0xCF,0x5F,0xAF,0x42,0x16,0xDB, + 0x12,0x27,0xCF,0x5F,0xB7,0x42,0x12,0xDC,0x16,0x27,0xCF,0x5F,0xB7,0x42,0x0E,0xDB, + 0x06,0x21,0x61,0x5E,0x0E,0x23,0x59,0x43,0x04,0x23,0xE3,0x5E,0xC9,0x18,0x4B,0x00, + 0x48,0x49,0xC9,0x5E,0x61,0x45,0x02,0xDD,0x8C,0x46,0x48,0x99,0x09,0x91,0x40,0x1C, + 0x49,0x99,0x00,0x04,0x00,0x14,0x81,0x42,0xD4,0xDC,0x52,0x1C,0x4A,0x98,0x12,0x04, + 0x12,0x14,0x90,0x42,0xB3,0xDA,0x3D,0x48,0x41,0x89,0x05,0x00,0x28,0x00,0xF4,0x30, + 0x04,0x00,0x1A,0x34,0xAD,0x1C,0x47,0x94,0x2C,0x00,0xFF,0x35,0xE0,0x34,0x01,0x35, + 0x61,0x45,0x19,0xDC,0x09,0x99,0x00,0x29,0x16,0xD0,0x34,0x4A,0x49,0x00,0x89,0x18, + 0xF4,0x22,0x56,0x5A,0xFF,0x31,0x01,0x31,0xCF,0x89,0x1A,0x22,0x00,0x21,0x00,0xF0, + 0xAD,0xF8,0x47,0x98,0x1A,0x22,0x00,0x21,0x00,0xF0,0xA8,0xF8,0x2B,0x49,0x01,0x20, + 0x08,0x71,0xA6,0x82,0xEF,0x81,0x22,0xE0,0x28,0x49,0x4A,0x79,0x00,0x2A,0x1E,0xD1, + 0x4A,0x9A,0x01,0x2A,0x1B,0xD9,0x71,0x9A,0x92,0x7A,0x00,0x2A,0x17,0xD1,0x0F,0x9A, + 0x00,0x2A,0x14,0xD0,0x52,0x00,0x51,0x18,0xF4,0x22,0x56,0x5A,0xFF,0x31,0x01,0x31, + 0xCF,0x89,0x1A,0x22,0x00,0x21,0x00,0xF0,0x89,0xF8,0x47,0x98,0x1A,0x22,0x00,0x21, + 0x00,0xF0,0x84,0xF8,0x19,0x49,0x01,0x20,0x08,0x71,0xA6,0x82,0xEF,0x81,0x6E,0x98, + 0xC0,0x7A,0x00,0x28,0x0D,0xD0,0x15,0x48,0x00,0x21,0x01,0x71,0x6E,0x98,0x16,0x4A, + 0x00,0x7B,0x92,0x7F,0x90,0x42,0x01,0xD3,0x6E,0x9A,0xD1,0x72,0x6E,0x99,0x40,0x1C, + 0x08,0x73,0x07,0x98,0x00,0x28,0x0E,0xD0,0x0C,0x48,0x00,0x79,0x00,0x28,0x0A,0xD0, + 0x0E,0x49,0x70,0x98,0x49,0x89,0xC0,0x68,0x0A,0x31,0x88,0x42,0x06,0xDA,0x70,0x99, + 0x40,0x1C,0xC8,0x60,0x02,0xE0,0x70,0x98,0x00,0x21,0xC1,0x60,0x03,0x48,0x01,0x79, + 0x41,0x71,0x73,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xCD,0xCC,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x93,0x00,0x00,0x80,0x95,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2,0x1E,0xFF,0x2F,0x31, + 0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x42,0x21,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2, + 0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2, + 0x01,0x10,0xC0,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2, + 0x04,0x10,0x80,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x0F,0x48, + 0x0F,0x49,0x00,0x89,0x49,0x88,0x00,0x24,0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0x0D,0x49,0x49,0x89,0x02,0xE0,0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18, + 0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7, + 0x1B,0xFC,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x01,0x00,0x20, + 0x00,0x07,0x00,0x20,0x20,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0xCC,0x07,0x00,0x20, + 0xC0,0x90,0x00,0x40,0xF7,0xB5,0x24,0x4E,0x82,0xB0,0xB0,0x7F,0xF1,0x7F,0x00,0x02, + 0x08,0x43,0x01,0xF0,0xFD,0xFC,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0, + 0x1E,0x48,0x01,0x78,0x1E,0x48,0x00,0x7F,0x00,0x29,0x02,0xD0,0x01,0xF0,0xA0,0xFC, + 0x01,0xE0,0x01,0xF0,0xC5,0xFC,0x18,0x49,0x01,0x25,0x20,0x39,0x08,0x00,0xC0,0x30, + 0x01,0x90,0x05,0x20,0xC0,0x01,0x17,0x4F,0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62, + 0x01,0x98,0x80,0x68,0x38,0x62,0x00,0x98,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07, + 0xC0,0x0F,0xFB,0xF7,0x03,0xFE,0x64,0x1E,0xF9,0xD5,0x01,0x20,0xF8,0x62,0x30,0x7F, + 0x01,0x00,0xFB,0xF7,0x71,0xFE,0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7,0x6A,0xFB, + 0x00,0x28,0x01,0xD1,0x00,0x24,0x25,0x00,0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00,0x18,0x07,0x00,0x20, + 0x60,0x06,0x00,0x20,0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x00,0x00,0xA0,0xE3,0x73,0xDF,0x4D,0xE2,0xB8,0x01,0x8D,0xE5,0x2C,0x00,0x8D,0xE5, + 0x28,0x00,0x8D,0xE5,0x24,0x00,0x8D,0xE5,0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x00,0x50,0xA0,0xE1,0x00,0x70,0xA0,0xE1,0x00,0x80,0xA0,0xE1, + 0x00,0x90,0xA0,0xE1,0x00,0xA0,0xA0,0xE1,0x00,0x10,0xA0,0xE1,0x20,0x00,0x8D,0xE5, + 0x10,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x04,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5, + 0x7C,0x06,0x9F,0xE5,0x7C,0x46,0x9F,0xE5,0xC8,0x01,0x8D,0xE5,0xB0,0x1C,0xC0,0xE1, + 0xC8,0x01,0x9D,0xE5,0x30,0x20,0xA0,0xE3,0xB2,0x1C,0xC0,0xE1,0xC8,0x01,0x9D,0xE5, + 0xB4,0x1C,0xC0,0xE1,0x00,0x10,0xA0,0xE3,0x88,0x00,0x84,0xE2,0x8F,0xFF,0xFF,0xEB, + 0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xB8,0x00,0x84,0xE2,0x8B,0xFF,0xFF,0xEB, + 0x00,0x60,0xA0,0xE3,0x60,0x10,0xA0,0xE3,0x15,0x0E,0x8D,0xE2,0xB8,0x6E,0xC4,0xE1, + 0x63,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0xF0,0x00,0x8D,0xE2,0x60,0xFF,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0x90,0x00,0x8D,0xE2,0x5D,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3, + 0x30,0x00,0x8D,0xE2,0x5A,0xFF,0xFF,0xEB,0x0C,0x06,0x9F,0xE5,0x0C,0x16,0x9F,0xE5, + 0x00,0x00,0xD0,0xE5,0xC4,0x11,0x8D,0xE5,0x00,0x00,0x50,0xE3,0x03,0x00,0x00,0x0A, + 0xF8,0x0A,0xD1,0xE1,0xB4,0x01,0x8D,0xE5,0xB6,0x0A,0xD1,0xE1,0x04,0x00,0x00,0xEA, + 0xEC,0x05,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xF6,0x12,0xD0,0xE1,0xB4,0x11,0x8D,0xE5, + 0xB4,0x02,0xD0,0xE1,0x01,0x18,0xE0,0xE3,0xB0,0x01,0x8D,0xE5,0xC4,0x05,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x40,0x00,0x10,0xE3,0xC4,0x01,0x9D,0xE5,0xB0,0xB8,0xD0,0x01, + 0xB0,0x08,0xD0,0x11,0x80,0xB0,0x01,0x10,0x8B,0x00,0x01,0xE0,0x0C,0x00,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0xAC,0x15,0x9F,0xE5,0x00,0x30,0xA0,0xE1,0x00,0x20,0xA0,0xE1, + 0x00,0x00,0xC1,0xE5,0x00,0x10,0xA0,0xE3,0x9C,0x05,0x9F,0xE5,0x9C,0xC5,0x9F,0xE5, + 0x83,0x00,0x80,0xE0,0xC0,0x01,0x8D,0xE5,0xB0,0x00,0xD0,0xE1,0x83,0xC0,0x8C,0xE0, + 0xB0,0xC0,0xDC,0xE1,0x00,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0x0F,0xCA,0xCC,0xE3, + 0x0C,0x40,0x40,0xE0,0x06,0x00,0x54,0xE1,0x04,0x60,0xA0,0xC1,0x2C,0x10,0x8D,0xC5, + 0x28,0x20,0x8D,0xC5,0xC8,0x00,0x54,0xE3,0x00,0x00,0x4C,0xE0,0x01,0xA0,0x8A,0xC2, + 0x96,0x00,0x50,0xE3,0x04,0xC0,0x9D,0xC5,0x01,0x30,0x83,0xE2,0x01,0xC0,0x8C,0xC2, + 0x04,0xC0,0x8D,0xC5,0x19,0x0E,0x54,0xE3,0x00,0xC0,0x9D,0xC5,0x01,0xC0,0x8C,0xC2, + 0x00,0xC0,0x8D,0xC5,0xF0,0xC0,0x8D,0xE2,0x01,0xE1,0x9C,0xE7,0x00,0x00,0x54,0xE3, + 0x00,0x40,0xA0,0xB3,0x04,0xE0,0x8E,0xE0,0x01,0xE1,0x8C,0xE7,0x15,0xCE,0x8D,0xE2, + 0x02,0xE1,0x9C,0xE7,0x00,0x00,0x50,0xE3,0x04,0xE0,0x8E,0xE0,0x02,0xE1,0x8C,0xE7, + 0x30,0xC0,0x8D,0xE2,0x01,0xE1,0x9C,0xE7,0x00,0x00,0xA0,0xB3,0x00,0xE0,0x8E,0xE0, + 0x01,0xE1,0x8C,0xE7,0x90,0xC0,0x8D,0xE2,0x02,0xE1,0x9C,0xE7,0x0B,0x00,0x50,0xE1, + 0x00,0xE0,0x8E,0xE0,0x02,0xE1,0x8C,0xE7,0x01,0xC0,0x85,0xC2,0x01,0x58,0xCC,0xC3, + 0x0B,0x00,0x54,0xE1,0x01,0xC0,0x87,0xC2,0x01,0x78,0xCC,0xC3,0x0C,0xC0,0x9D,0xE5, + 0x01,0x10,0x81,0xE2,0x0C,0x00,0x50,0xE1,0x01,0xC0,0x88,0xC2,0x01,0x88,0xCC,0xC3, + 0x0C,0xC0,0x9D,0xE5,0x0C,0x00,0x54,0xE1,0x01,0xC0,0x89,0xC2,0x01,0x98,0xCC,0xC3, + 0x08,0xC0,0x9D,0xE5,0x0E,0x00,0x51,0xE3,0x0C,0x00,0x80,0xE0,0x08,0x00,0x8D,0xE5, + 0xC0,0x01,0x9D,0xE5,0xB0,0x40,0xC0,0xE1,0xB4,0x01,0x9D,0xE5,0xB8,0xC1,0x9D,0xE5, + 0x04,0x00,0x80,0xE0,0x0C,0x00,0x80,0xE0,0xB8,0x01,0x8D,0xE5,0xB5,0xFF,0xFF,0x3A, + 0x01,0x20,0x82,0xE2,0x15,0x00,0x52,0xE3,0xB1,0xFF,0xFF,0x3A,0x70,0xC4,0x9F,0xE5, + 0x64,0x44,0x9F,0xE5,0x01,0xEA,0xA0,0xE3,0x0E,0x00,0x43,0xE2,0x00,0x10,0xA0,0xE3, + 0x01,0xE0,0x4E,0xE2,0x80,0x20,0x84,0xE0,0xF0,0x30,0xD2,0xE1,0x01,0x10,0x81,0xE2, + 0x01,0x00,0x80,0xE2,0x03,0x31,0x83,0xE0,0x03,0x32,0xA0,0xE1,0x9C,0xB3,0xC3,0xE0, + 0xC3,0xB2,0xA0,0xE1,0xC3,0x3F,0x4B,0xE0,0x01,0x0A,0x53,0xE3,0x0E,0x30,0xA0,0xA1, + 0x0E,0x00,0x51,0xE3,0xB0,0x30,0xC2,0xE1,0xF1,0xFF,0xFF,0x3A,0xC8,0x01,0x9D,0xE5, + 0xB0,0xAC,0xC0,0xE1,0x04,0x00,0x9D,0xE5,0xC8,0x11,0x9D,0xE5,0xB2,0x0C,0xC1,0xE1, + 0xC8,0x01,0x9D,0xE5,0x00,0x10,0x9D,0xE5,0xB4,0x1C,0xC0,0xE1,0x1E,0xF9,0xFF,0xEB, + 0xEC,0x03,0x9F,0xE5,0xDC,0xC3,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1, + 0xBE,0x00,0xCC,0xE1,0xB0,0x00,0xD4,0xE1,0x01,0x00,0x10,0xE3,0x08,0x00,0x00,0x0A, + 0xB8,0x01,0x9D,0xE5,0xB0,0x11,0x9D,0xE5,0x90,0x01,0x01,0xE0,0xD4,0x03,0x9F,0xE5, + 0x90,0x21,0x81,0xE0,0x21,0x06,0xA0,0xE1,0xB4,0x10,0xD4,0xE1,0x00,0x00,0x51,0xE1, + 0xBE,0x00,0xCC,0x81,0xC0,0xA3,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x90,0xE0,0x8D,0xE2, + 0x08,0x20,0xD4,0xE5,0x15,0x1E,0x8D,0xE2,0x00,0x11,0x91,0xE7,0x92,0x01,0x01,0xE0, + 0x9A,0x31,0x82,0xE0,0xA2,0x34,0xA0,0xE1,0xB0,0x21,0xD4,0xE1,0x02,0x00,0x53,0xE1, + 0x9A,0x21,0x81,0x90,0x09,0x30,0xD4,0xE5,0xA1,0x24,0xA0,0x91,0x00,0x11,0x9E,0xE7, + 0x91,0x03,0x03,0xE0,0x9A,0xB3,0x81,0xE0,0xA1,0xB4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1, + 0x01,0x00,0x5B,0xE1,0x9A,0x33,0x81,0x90,0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0, + 0xBC,0x20,0xD4,0xE1,0x92,0x01,0x01,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1, + 0x01,0x25,0x61,0xE0,0x02,0x21,0x82,0xE0,0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1, + 0xC1,0x1F,0x42,0xE0,0x80,0x20,0x8C,0xE0,0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3, + 0xB8,0x18,0xC2,0xE1,0xDD,0xFF,0xFF,0x3A,0x30,0x23,0x9F,0xE5,0x00,0xA0,0xA0,0xE3, + 0xF0,0xB0,0x8D,0xE2,0x0A,0x10,0xD4,0xE5,0x0A,0x01,0x9B,0xE7,0x90,0x01,0x01,0xE0, + 0x92,0x31,0x80,0xE0,0xA0,0x35,0xA0,0xE1,0xB4,0x01,0xD4,0xE1,0x00,0x00,0x53,0xE1, + 0x92,0x11,0x80,0x90,0x0B,0x30,0xD4,0xE5,0x30,0x10,0x8D,0xE2,0x0A,0x11,0x91,0xE7, + 0xA0,0x05,0xA0,0x91,0x91,0x03,0x03,0xE0,0x92,0xC3,0x81,0xE0,0xA1,0xC5,0xA0,0xE1, + 0xB6,0x11,0xD4,0xE1,0x01,0x00,0x5C,0xE1,0x92,0x33,0x81,0x90,0xA1,0x15,0xA0,0x91, + 0x01,0x00,0x40,0xE0,0xBE,0x10,0xD4,0xE1,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0, + 0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x88,0x12,0x9F,0xE5,0x8A,0x10,0x81,0xE0, + 0x01,0xA0,0x8A,0xE2,0x0D,0x00,0x5A,0xE3,0xB8,0x0B,0xC1,0xE1,0xDC,0xFF,0xFF,0x3A, + 0x0A,0x00,0xD4,0xE5,0x0A,0x11,0x9B,0xE7,0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0, + 0x8C,0x12,0x9F,0xE5,0x15,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0,0xBC,0x11,0x8D,0xE5, + 0xB7,0xEA,0xFF,0xEB,0xB4,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x00,0xB0,0xA0,0x91, + 0x01,0xB0,0xA0,0x81,0x0B,0x10,0xD4,0xE5,0x30,0x00,0x8D,0xE2,0x0A,0x01,0x90,0xE7, + 0x91,0x00,0x00,0xE0,0xBC,0x11,0x9D,0xE5,0xAD,0xEA,0xFF,0xEB,0xB6,0x11,0xD4,0xE1, + 0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0x81,0xBE,0x10,0xD4,0xE1,0x00,0x00,0x4B,0xE0, + 0x10,0x42,0x9F,0xE5,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x8A,0x10,0x84,0xE0,0x00,0x00,0x56,0xE3,0xB8,0x0B,0xC1,0xE1, + 0x0C,0x00,0x00,0xDA,0x2C,0x00,0x9D,0xE5,0x80,0x00,0x84,0xE0,0xB8,0x1B,0xD0,0xE1, + 0x28,0x00,0x9D,0xE5,0x80,0x00,0x84,0xE0,0xB8,0x08,0xD0,0xE1,0x01,0x00,0x80,0xE0, + 0x00,0x00,0x46,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB8,0x0E,0xC4,0xE1, + 0x00,0x00,0xA0,0x43,0xB8,0x0E,0xC4,0x41,0x11,0x10,0xA0,0xE3,0x08,0x00,0x9D,0xE5, + 0x01,0x1C,0x81,0xE2,0x8A,0xEA,0xFF,0xEB,0xB6,0x10,0xD4,0xE1,0x40,0x00,0x11,0xE3, + 0x0E,0x00,0x00,0x0A,0x87,0x00,0x55,0xE1,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85, + 0xFA,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x23,0x00,0x58,0xE3, + 0x01,0x00,0xA0,0x83,0x18,0x00,0x8D,0x85,0x23,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33, + 0x14,0x00,0x8D,0x35,0x14,0x00,0x55,0xE3,0x11,0x00,0x00,0x9A,0x0E,0x00,0x00,0xEA, + 0x07,0x00,0x55,0xE1,0x08,0x00,0x55,0x83,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85, + 0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x14,0x00,0x58,0xE3, + 0x01,0x00,0xA0,0x83,0x18,0x00,0x8D,0x85,0x14,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33, + 0x14,0x00,0x8D,0x35,0x0A,0x00,0x55,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3, + 0x10,0x00,0x8D,0xE5,0xF1,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0xE5, + 0x03,0x00,0x00,0x0A,0xFA,0x00,0x50,0xE3,0x05,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2, + 0x02,0x00,0x00,0xEA,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2, + 0xF2,0x00,0xC4,0xE5,0x1C,0x20,0x8D,0xE2,0x05,0x00,0x92,0xE8,0x14,0x30,0x9D,0xE5, + 0x00,0x20,0x82,0xE1,0x18,0x00,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x03,0x00,0x00,0xE0, + 0x00,0x20,0x82,0xE1,0x10,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03, + 0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1,0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0x15, + 0x05,0x00,0x50,0x13,0x02,0x00,0x00,0x8A,0x24,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x07,0x00,0x00,0x0A,0xEC,0x00,0x94,0xE5,0x01,0x00,0x80,0xE2,0xEC,0x00,0x84,0xE5, + 0xF0,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xF0,0x00,0xC4,0x15, + 0x0D,0x00,0x00,0xEA,0xF0,0x00,0xD4,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0xF0,0x00,0xC4,0xE5,0xC4,0x11,0x9D,0xE5,0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1, + 0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC4,0xE5,0xEC,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xEC,0x00,0x84,0xC5,0xF2,0x00,0xD4,0xE5, + 0x0A,0x00,0x50,0xE3,0x73,0xDF,0x8D,0x22,0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21, + 0xEC,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0xA0,0xC3,0xEC,0x00,0x84,0xC5, + 0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC4,0xE5,0x73,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x40,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x07,0x00,0x20, + 0x00,0x95,0x00,0x00,0xCC,0x07,0x00,0x20,0x48,0x07,0x00,0x20,0x00,0x00,0x00,0x10, + 0xD2,0x02,0x00,0x10,0x1F,0x85,0xEB,0x51,0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D, + 0x2D,0x34,0xA9,0xF9,0x00,0x93,0x00,0x00,0x10,0xB5,0x16,0x4C,0xA0,0x7B,0x00,0x28, + 0x07,0xD1,0xFB,0xF7,0xED,0xFC,0x00,0x28,0x0F,0xD0,0xFC,0xF7,0x19,0xFF,0x01,0x20, + 0x0A,0xE0,0x01,0x28,0x0C,0xD1,0xFB,0xF7,0xFF,0xFC,0x00,0x28,0x05,0xD0,0xFC,0xF7, + 0x7F,0xFB,0x00,0xF0,0x79,0xFB,0x02,0x20,0xA0,0x73,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x02,0x28,0x07,0xD1,0xFB,0xF7,0xAC,0xFE,0x00,0x28,0xF6,0xD0,0xFC,0xF7,0x72,0xFD, + 0x03,0x20,0xF1,0xE7,0x03,0x28,0xF0,0xD1,0x03,0x48,0xC0,0x68,0xC0,0x07,0xEC,0xD0, + 0x04,0x20,0xE9,0xE7,0x14,0x07,0x00,0x20,0x00,0x90,0x00,0x40,0xF0,0xB5,0xD9,0x48, + 0x8B,0xB0,0x00,0x68,0x00,0x27,0x80,0x79,0x3D,0x00,0x02,0x90,0xD6,0x48,0x42,0x79, + 0x04,0x00,0xC0,0x34,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xA3,0x7A, + 0x00,0x7A,0xFE,0xF7,0xB6,0xF8,0x00,0x06,0x61,0x7A,0x00,0x0E,0xFE,0xF7,0xA6,0xF8, + 0x21,0x00,0x20,0x39,0x0A,0x7A,0x00,0x06,0xC0,0x39,0x09,0x79,0x00,0x0E,0xFE,0xF7, + 0xA1,0xF8,0x21,0x00,0x80,0x39,0x8A,0x7D,0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E, + 0xFE,0xF7,0x98,0xF8,0x00,0x06,0xC5,0x4E,0x00,0x0E,0x01,0x90,0x30,0x7B,0xC4,0x4C, + 0x00,0x28,0x02,0xD0,0xC3,0x48,0x40,0x89,0x06,0xE0,0xBE,0x48,0x61,0x88,0x00,0x68, + 0x40,0x88,0x40,0x18,0x00,0x04,0x00,0x0C,0x03,0x90,0x00,0x20,0x70,0x61,0x0F,0x20, + 0xF0,0x70,0x30,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0x95,0xFB,0x01,0xF0,0x83,0xFB,0x01,0x20,0x30,0x62,0xFC,0xF7,0x93,0xF8,0x00,0xF0, + 0xB5,0xF9,0xFC,0xF7,0xFB,0xFA,0xB4,0x48,0x05,0x21,0x09,0x90,0xB3,0x48,0xC9,0x01, + 0x41,0x18,0x08,0x91,0xB2,0x49,0x80,0x30,0x06,0xAA,0x03,0xC2,0x01,0x98,0xC0,0x1C, + 0x05,0x90,0xB0,0x48,0x04,0x90,0x36,0xE1,0x30,0x7A,0x00,0x28,0x04,0xD0,0x30,0x6B, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0x72,0xFB,0xFF,0x20,0x81,0x30,0xFA,0xF7,0xCC,0xFE, + 0x03,0x20,0x01,0xF0,0xDB,0xF9,0xFC,0xF7,0xA9,0xF8,0xFC,0xF7,0x8D,0xF8,0xA4,0x48, + 0xC0,0x38,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5, + 0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0x91,0xF8,0xFC,0xF7,0x31,0xFB,0x9A,0x48, + 0x03,0x99,0x60,0x38,0x00,0x89,0x40,0x18,0x99,0x49,0xC0,0x39,0x89,0x89,0x88,0x42, + 0x12,0xD9,0x09,0x98,0x40,0x7A,0x00,0x28,0x0E,0xD1,0x95,0x48,0xFF,0x21,0xC0,0x38, + 0xC0,0x88,0x19,0x31,0x08,0x42,0x07,0xD1,0x02,0x98,0x6D,0x1C,0x85,0x42,0x04,0xDD, + 0xFC,0xF7,0x1E,0xFB,0x01,0x27,0x00,0xE0,0x00,0x25,0x00,0xF0,0x77,0xFE,0x01,0xF0, + 0x5B,0xF8,0x00,0xF0,0x07,0xFE,0x00,0xF0,0x5B,0xFE,0x08,0x99,0x07,0x98,0x49,0x88, + 0xC0,0x6A,0x88,0x42,0x0B,0xDB,0x09,0x98,0x40,0x7A,0x00,0x28,0x05,0xD1,0x84,0x48, + 0x46,0x21,0xC0,0x38,0xC0,0x88,0x08,0x42,0x01,0xD0,0x01,0x20,0x70,0x70,0x00,0x2F, + 0x02,0xD0,0xFC,0xF7,0x8B,0xFA,0x00,0x27,0xFC,0xF7,0x70,0xFA,0x00,0x20,0xFC,0xF7, + 0xDF,0xFA,0xFC,0xF7,0xA7,0xFA,0x01,0x20,0xB0,0x73,0xFD,0xF7,0x3F,0xFC,0x00,0x28, + 0x09,0xD0,0x00,0x20,0x70,0x61,0x04,0x98,0x80,0x7E,0xC8,0x28,0x12,0xD2,0x04,0x99, + 0x40,0x1C,0x88,0x76,0x0E,0xE0,0x70,0x69,0x40,0x1C,0x70,0x61,0x70,0x69,0x01,0x28, + 0x03,0xD1,0x70,0x49,0x00,0x20,0x20,0x31,0x08,0x75,0x70,0x69,0x05,0x28,0x01,0xD9, + 0xFB,0xF7,0xF8,0xFF,0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x20,0x69, + 0xFF,0x21,0xFF,0x31,0x88,0x42,0x04,0xDA,0x40,0x1C,0x20,0x61,0x01,0xE0,0x00,0x20, + 0xFB,0xE7,0x08,0x99,0xE0,0x68,0x49,0x89,0x88,0x42,0x0C,0xDD,0x20,0x69,0xFF,0x21, + 0xF5,0x31,0x88,0x42,0x07,0xDD,0x01,0x21,0x00,0x20,0x71,0x70,0xE0,0x60,0x20,0x61, + 0x07,0x98,0xC1,0x62,0x02,0xE0,0x70,0x78,0x00,0x28,0x02,0xD0,0xFB,0xF7,0xE4,0xFF, + 0x20,0xE0,0x59,0x48,0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0, + 0xC1,0x68,0x07,0x29,0x04,0xD1,0xC0,0x68,0x01,0x21,0x49,0x07,0xC8,0x63,0x0E,0xE0, + 0x00,0xF0,0x2C,0xFA,0x0B,0xE0,0x01,0xF0,0x33,0xF8,0x70,0x7B,0x80,0x28,0x01,0xD1, + 0xFC,0xF7,0xF4,0xF8,0x00,0xF0,0x5C,0xF9,0x01,0xE0,0xFF,0xF7,0x9D,0xFE,0xB0,0x7B, + 0x03,0x28,0xFA,0xD1,0xFC,0xF7,0x16,0xFB,0x70,0x78,0x00,0x28,0x0B,0xD0,0x43,0x48, + 0x01,0x21,0xC0,0x7F,0x40,0x08,0x01,0xF0,0x57,0xF8,0x3C,0x49,0x00,0x20,0x48,0x70, + 0x07,0x99,0xC8,0x62,0x5D,0xE0,0x06,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B, + 0x00,0x28,0x01,0xD1,0x00,0xF0,0xC6,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28, + 0x4F,0xD1,0x03,0x20,0x01,0xF0,0xD4,0xF8,0xF0,0x62,0x03,0x20,0x01,0xF0,0x02,0xF9, + 0xFF,0x20,0x81,0x30,0xFA,0xF7,0xD8,0xFD,0x34,0x48,0x00,0x78,0x00,0x28,0x3A,0xD1, + 0xFC,0xF7,0xC0,0xFB,0x00,0x28,0x36,0xD0,0x70,0x79,0x00,0x28,0x33,0xD1,0xB0,0x6A, + 0x00,0x28,0x0A,0x90,0x2F,0xD0,0x25,0x48,0xC0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43, + 0x2B,0x49,0xFA,0xF7,0x85,0xFA,0x0A,0x99,0x0E,0x1A,0x32,0x2E,0x23,0xDD,0x00,0xF0, + 0x81,0xF8,0x30,0x00,0x01,0xF0,0x70,0xFA,0x01,0xF0,0x74,0xFA,0x1B,0x48,0x80,0x79, + 0x00,0x28,0x0D,0xD0,0x00,0xF0,0x54,0xF8,0x00,0xF0,0x57,0xF8,0x00,0xF0,0x5F,0xF8, + 0x20,0x4E,0x01,0x20,0x70,0x60,0xFA,0xF7,0xB7,0xFD,0x1F,0x48,0x70,0x60,0x03,0xE0, + 0x1E,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0x63,0xFA,0x1B,0x49,0x00,0x20, + 0x08,0x70,0x00,0xF0,0x6B,0xF8,0x0D,0x4E,0x70,0x69,0x05,0x99,0x88,0x42,0x00,0xD2, + 0xC2,0xE6,0x08,0x48,0x0A,0x49,0x00,0x68,0xC0,0x39,0x40,0x30,0x40,0x7D,0x48,0x70, + 0x06,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x01,0xF0,0x28,0xFA,0x0B,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20,0x60,0x94,0x00,0x00,0x14,0x07,0x00,0x20, + 0x00,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x93,0x00,0x00, + 0x00,0x01,0x00,0x20,0xA0,0x03,0x00,0x20,0x00,0x40,0x00,0x30,0xD1,0x07,0x00,0x20, + 0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xD0,0x07,0x00,0x20, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47, + 0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20,0x81,0x06,0x48,0x60, + 0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60,0x70,0x47,0x01,0x20, + 0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47,0x01,0x20,0x80,0x07, + 0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47, + 0x00,0x93,0x00,0x00,0x10,0xB5,0xFC,0xF7,0x41,0xF9,0xFA,0xF7,0x2B,0xFA,0x03,0x20, + 0x40,0x03,0xFA,0xF7,0x31,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5, + 0x40,0x03,0xFA,0xF7,0x31,0xFD,0xFA,0xF7,0x27,0xFA,0xFC,0xF7,0x37,0xF9,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0,0xF7,0xFB,0x05,0x49,0x80,0x22,0xC9,0x88, + 0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7,0x4D,0xFC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5, + 0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1,0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5, + 0x14,0x80,0xD0,0xE5,0xA0,0xB0,0x9F,0xE5,0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2, + 0x14,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3,0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0, + 0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0,0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1, + 0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1,0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3, + 0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A,0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A, + 0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA,0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5, + 0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3,0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1, + 0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1,0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A, + 0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A,0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0x48,0x07,0x00,0x20,0x00,0x00,0x00,0x10, + 0xF8,0xB5,0xFD,0xF7,0xAD,0xF8,0x06,0x00,0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D, + 0x71,0xD0,0x55,0x48,0x00,0x21,0x01,0x70,0x02,0x20,0x00,0xF0,0xC3,0xFF,0x53,0x48, + 0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x5C,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0,0xA6,0xFF, + 0x60,0x68,0x00,0x02,0x00,0x0A,0x60,0x60,0xA9,0x00,0x20,0x1D,0xFD,0xF7,0x30,0xFE, + 0x61,0x68,0x00,0x06,0x01,0x43,0x61,0x60,0x49,0x4F,0x78,0x7A,0x00,0x28,0x00,0xD0, + 0x6D,0x1C,0xF8,0x79,0x00,0x28,0x04,0xD1,0x46,0x49,0x48,0x69,0x0A,0x15,0x10,0x43, + 0x48,0x61,0x00,0xF0,0x93,0xF8,0x44,0x48,0x01,0x68,0x44,0x48,0xC1,0x61,0x02,0x24, + 0x20,0x00,0x00,0xF0,0x8B,0xFF,0x42,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60, + 0x79,0x7A,0x02,0x04,0x1D,0xE0,0x3D,0x48,0x43,0x69,0x5B,0x06,0x0A,0xD4,0x00,0x29, + 0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA3,0x00,0x9B,0x18,0x1B,0x68,0xC3,0x61,0x00,0xE0, + 0xC6,0x61,0x64,0x1C,0x30,0x48,0x00,0x78,0x00,0x28,0x0A,0xD0,0xFD,0xF7,0x80,0xF9, + 0x38,0x7A,0x00,0x28,0x07,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xF6,0xF8, + 0x01,0xE0,0xAC,0x42,0xDF,0xD9,0x02,0x20,0x00,0xF0,0x6C,0xFF,0x26,0x4C,0x20,0x78, + 0x00,0x28,0x38,0xD1,0xFD,0xF7,0x86,0xF8,0x00,0x28,0x34,0xD0,0x23,0x48,0x0A,0x21, + 0x00,0x6B,0xFA,0xF7,0xFD,0xF8,0x01,0x00,0x02,0x20,0x00,0xF0,0x47,0xFF,0x02,0x20, + 0x00,0xF0,0x4C,0xFF,0x0D,0xE0,0x33,0xE0,0x20,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7, + 0x57,0xF9,0x38,0x7A,0x00,0x28,0x04,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0xCD,0xF8,0xFD,0xF7,0x67,0xF8,0x00,0x28,0xEE,0xD1,0x18,0x49,0x48,0x68,0x48,0x60, + 0x0B,0xE0,0x20,0x78,0x00,0x28,0x08,0xD0,0x38,0x7A,0x00,0x28,0x08,0xD0,0x38,0x6B, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0xBA,0xF8,0x02,0xE0,0x48,0x68,0xC0,0x03,0xF0,0xD5, + 0x02,0x20,0x00,0xF0,0x2F,0xFF,0x00,0xF0,0x21,0xF8,0x0D,0x48,0xC1,0x68,0x01,0x22, + 0x11,0x43,0xC1,0x60,0xF8,0x79,0x00,0x28,0x02,0xD1,0x90,0x02,0xFA,0xF7,0xFC,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD1,0x07,0x00,0x20,0x00,0x93,0x00,0x00, + 0x14,0x07,0x00,0x20,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21, + 0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0x45,0xFB,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x10,0xB5,0x01,0x20,0xFC,0xF7,0x8A,0xF8, + 0x01,0x20,0xFC,0xF7,0x45,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x40,0x18,0x70,0x47, + 0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18, + 0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07, + 0x18,0x68,0x13,0x4A,0x90,0x71,0x90,0x79,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0, + 0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x30,0x22,0x00,0x21, + 0x08,0x30,0xFF,0xF7,0x1B,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x0D,0x25, + 0x08,0x4C,0xED,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00, + 0x3F,0x19,0x7F,0x19,0x40,0x1C,0xBE,0x60,0x96,0x79,0x86,0x42,0xF3,0xD8,0xEA,0xE7, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x70,0xB5,0x1E,0x4A,0x1E,0x48,0x1C,0x4C, + 0x85,0x18,0x21,0x7A,0xDB,0x22,0x92,0x00,0x86,0x18,0x00,0x29,0x0F,0xD0,0x21,0x00, + 0x82,0x22,0x0C,0x31,0x28,0x00,0xFE,0xF7,0xBD,0xFF,0x18,0x49,0x0D,0x22,0x30,0x00, + 0xFE,0xF7,0xB8,0xFF,0x20,0x7A,0x60,0x72,0x70,0xBC,0x08,0xBC,0x18,0x47,0x0D,0x22, + 0x00,0x21,0x30,0x00,0xFE,0xF7,0xE2,0xFF,0x82,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7, + 0xDD,0xFF,0x0E,0x48,0x82,0x22,0x00,0x21,0x8F,0x38,0xFE,0xF7,0xD7,0xFF,0x0B,0x48, + 0x0D,0x22,0x00,0x21,0x0D,0x38,0xFE,0xF7,0xD1,0xFF,0x00,0x20,0x06,0x49,0x60,0x72, + 0xA0,0x72,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x05,0x49,0x88,0x72,0xDB,0xE7, + 0x00,0x02,0x00,0x20,0x4E,0x02,0x00,0x00,0x40,0x00,0x00,0x20,0x9F,0x03,0x00,0x20, + 0x40,0x06,0x00,0x20,0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48, + 0x00,0x78,0x00,0x28,0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A, + 0x8C,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91, + 0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22, + 0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22, + 0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49, + 0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F, + 0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18, + 0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C, + 0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00, + 0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0xC1,0xFF,0x20,0x8C, + 0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08, + 0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98, + 0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x15,0x20,0x08,0x90, + 0x5D,0x48,0x0E,0x21,0x80,0x7B,0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21, + 0x01,0xE0,0x14,0x20,0x08,0x90,0x20,0x00,0xF9,0xF7,0x62,0xFE,0x0A,0x99,0x08,0x1A, + 0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xF9,0xF7,0x5A,0xFE,0x09,0x99,0x08,0x1A, + 0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD, + 0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B, + 0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00, + 0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19, + 0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xF9,0xF7, + 0x2F,0xFE,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28, + 0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xF9,0xF7,0x20,0xFE, + 0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98, + 0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68, + 0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC, + 0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD, + 0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99, + 0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xF9,0xF7,0xF2,0xFD,0x86,0x19,0x03,0x98, + 0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0, + 0x60,0x00,0x80,0x1B,0x64,0x21,0xF9,0xF7,0xE3,0xFD,0x07,0x99,0x89,0x07,0x09,0xD5, + 0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A, + 0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E, + 0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A, + 0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0xF9,0xFE,0x13,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0x20,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0x40,0x06,0x00,0x20,0xF0,0xB4,0x05,0x00, + 0x0B,0x4C,0x00,0x20,0xFF,0x26,0x91,0x36,0x82,0x00,0xA3,0x5A,0x12,0x19,0x52,0x88, + 0x5B,0x1B,0x1F,0x00,0x5F,0x43,0x52,0x1A,0x13,0x00,0x53,0x43,0xFA,0x18,0xB2,0x42, + 0x04,0xDB,0x40,0x1C,0x1A,0x28,0xEF,0xD3,0x00,0x20,0xC0,0x43,0xF0,0xBC,0x70,0x47, + 0x74,0x79,0x00,0x00,0xFE,0xB5,0x69,0x4D,0x67,0x48,0x00,0x26,0x29,0x00,0xFF,0x31, + 0x00,0x96,0x42,0x7E,0xC1,0x31,0x08,0x7A,0x33,0x00,0x00,0x2A,0x28,0xD1,0x00,0x28, + 0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0xD3,0x30, + 0xFD,0xF7,0x98,0xF8,0x00,0x28,0x17,0xD0,0x5D,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C, + 0x81,0x42,0x14,0xD3,0xA9,0x19,0x33,0x22,0x00,0x90,0xFF,0x20,0x52,0x01,0xCD,0x30, + 0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x76,0x76,0x1C,0xCD,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0x06,0xFA,0x64,0x1C,0x0D,0x2C,0xDA,0xDB,0x94,0xE0, + 0x49,0x7A,0x00,0x29,0x01,0xD1,0x00,0x28,0x78,0xD0,0x07,0x20,0xC0,0x01,0x00,0x24, + 0x2E,0x18,0x33,0x27,0x7F,0x01,0x28,0x19,0xC0,0x19,0x40,0x7E,0x00,0x28,0x3F,0xD0, + 0x0D,0x21,0x28,0x18,0x89,0x01,0x41,0x18,0xC9,0x7F,0x00,0x29,0x02,0xD0,0x32,0x7D, + 0x00,0x2A,0x14,0xD0,0x1B,0x21,0x49,0x01,0x40,0x18,0x00,0x99,0x00,0x7B,0x49,0x1C, + 0x00,0x91,0x0A,0x21,0x48,0x43,0x3F,0x49,0x40,0x19,0x42,0x18,0x02,0x20,0x03,0x23, + 0x69,0x46,0x00,0xF0,0xD7,0xF9,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20, + 0x41,0x43,0x48,0x19,0x02,0x90,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0x43,0xF8,0x00,0x28, + 0x13,0xD0,0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0xCD,0x32,0x03,0x20, + 0x02,0x23,0x69,0x46,0x00,0xF0,0xBE,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x7E, + 0x40,0x1C,0x4A,0x76,0x0C,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x0C,0x2C,0xBA,0xDB, + 0x01,0x24,0x26,0x49,0x0D,0x20,0x0A,0x19,0x80,0x01,0x10,0x18,0xC0,0x7F,0x00,0x22, + 0x01,0x92,0x00,0x28,0x32,0xD0,0x32,0x7D,0x00,0x2A,0x2F,0xD1,0x0A,0x22,0x50,0x43, + 0x45,0x18,0x28,0x00,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0x14,0xF8,0x00,0x28,0x25,0xD0, + 0x1B,0x48,0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x26,0xD3,0x17,0x4A,0x00,0x20, + 0x11,0x18,0xC9,0x19,0x49,0x7E,0xA1,0x42,0x0C,0xD0,0x00,0x29,0x07,0xD1,0xFF,0x21, + 0xCD,0x31,0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x76,0x06,0xE0,0x12,0xE0,0x40,0x1C, + 0x0C,0x28,0xED,0xDB,0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93, + 0xCD,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x74,0xF9,0x64,0x1C,0x0D,0x2C, + 0xBF,0xDB,0x02,0xE0,0x01,0x20,0x40,0x07,0x43,0x60,0x00,0x98,0x00,0xF0,0x66,0xFC, + 0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x00,0x93,0x00,0x00,0x4E,0x02,0x00,0x00,0xFC,0xB5,0x4E,0x48,0x36,0x25,0x45,0x5F, + 0x15,0x20,0x84,0x46,0x4B,0x48,0x4C,0x4F,0x80,0x30,0x82,0x7D,0x86,0x46,0x4B,0x48, + 0x00,0x26,0x81,0x7B,0x0E,0x24,0xC8,0x07,0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24, + 0x01,0xE0,0x14,0x20,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42, + 0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46, + 0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2, + 0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00, + 0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA, + 0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24, + 0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E, + 0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14, + 0x02,0x04,0x12,0x14,0x25,0x48,0x80,0x30,0x81,0x6B,0xA6,0x42,0x05,0xDD,0x74,0x46, + 0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E, + 0x81,0x63,0x1E,0x49,0x80,0x31,0xC9,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42, + 0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x63,0x74,0x46, + 0xA4,0x8B,0x85,0x6B,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88, + 0xC0,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70, + 0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43, + 0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46, + 0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0x40,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D, + 0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29, + 0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61, + 0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0, + 0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61, + 0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xF9,0xF7,0x13,0xFD,0xB0,0x62,0x30,0x7B,0x00,0x28, + 0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x39,0x00,0xF9,0xF7,0x04,0xFD,0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00, + 0x14,0x07,0x00,0x20,0x80,0x94,0x00,0x00,0x41,0xA0,0x00,0x00,0x10,0x00,0x10,0x00, + 0x07,0x48,0x41,0x7A,0x07,0x48,0x02,0x29,0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29, + 0x01,0xD1,0xC0,0x69,0x00,0xE0,0x80,0x69,0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00, + 0x00,0x02,0x00,0x20,0xC0,0x94,0x00,0x00,0xC0,0x90,0x00,0x40,0xF0,0xB4,0x0B,0x48, + 0x0D,0x4B,0xC0,0x88,0x0A,0x49,0x0C,0x4F,0x42,0x06,0x0A,0x48,0x01,0x24,0xE4,0x03, + 0x32,0x25,0x5E,0x00,0x32,0x3F,0x01,0x61,0x43,0x61,0x84,0x61,0xC5,0x61,0x04,0x62, + 0x46,0x62,0x84,0x62,0xC7,0x62,0xF0,0xBC,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x00,0x80,0x00,0x03,0x40,0xA1,0x00,0x40,0x64,0x40,0x00,0x00,0x11,0x49,0x10,0xB4, + 0x0A,0x7D,0x11,0x48,0x82,0x73,0x4A,0x7D,0xC2,0x73,0x82,0x7B,0x0F,0x48,0xD3,0x07, + 0x0A,0xD0,0x93,0x07,0x0E,0x4A,0x03,0xD5,0x0D,0x23,0x03,0x77,0x00,0x23,0x02,0xE0, + 0x14,0x23,0x03,0x77,0x01,0x23,0x13,0x71,0x8A,0x7D,0x42,0x77,0xCA,0x7D,0x82,0x77, + 0x0A,0x7E,0xC2,0x77,0x4A,0x7E,0x05,0x48,0x20,0x30,0x02,0x70,0x89,0x7E,0x41,0x70, + 0x10,0xBC,0x70,0x47,0x00,0x93,0x00,0x00,0x40,0x06,0x00,0x20,0x60,0x06,0x00,0x20, + 0x14,0x07,0x00,0x20,0xFF,0xB5,0x05,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0x81,0xB0, + 0xFA,0xF7,0x84,0xFC,0x00,0x28,0x08,0xD0,0x02,0x98,0x02,0x99,0x00,0x68,0x40,0x1E, + 0x08,0x60,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x29,0x48,0x80,0x7B,0xC0,0x07, + 0x22,0xD0,0xE0,0x79,0x05,0x28,0x1D,0xD0,0x09,0x28,0x1D,0xD1,0x6D,0x08,0x6D,0x00, + 0x01,0x20,0x09,0x27,0x22,0x78,0x23,0x4E,0xBF,0x01,0x0F,0xE0,0x0A,0x23,0x01,0x00, + 0x59,0x43,0x21,0x4B,0xC9,0x18,0xC9,0x19,0x8B,0x7B,0x9A,0x42,0x05,0xD1,0x0B,0x8A, + 0x63,0x80,0xCB,0x7B,0x63,0x70,0x49,0x8A,0xA1,0x80,0x40,0x1C,0x71,0x7A,0x81,0x42, + 0xEC,0xDA,0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x21,0xA8,0x07,0x89,0x06,0x88,0x43, + 0x21,0x78,0x62,0x78,0x09,0x07,0x89,0x08,0x08,0x43,0x14,0x49,0x92,0x06,0x08,0x40, + 0x61,0x88,0x12,0x0C,0x89,0x05,0x89,0x09,0x08,0x43,0x3F,0x21,0x89,0x02,0x88,0x43, + 0x10,0x43,0x02,0x04,0x92,0x0E,0x0F,0x2A,0x03,0xD9,0x88,0x43,0x0F,0x21,0x89,0x02, + 0x40,0x18,0xA1,0x88,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x02,0x99, + 0x01,0x22,0x09,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60,0xA9,0xE7,0x00,0x00, + 0x40,0x06,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23, + 0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72,0x8A,0x72,0x08,0x48, + 0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73,0x10,0xBC,0x70,0x47, + 0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7,0x14,0x07,0x00,0x20, + 0xA0,0x95,0x00,0x00,0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42, + 0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7,0xC3,0xFA,0x38,0x80,0x21,0x00,0x30,0x00, + 0xF9,0xF7,0xBE,0xFA,0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD, + 0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A, + 0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91,0xF9,0xF7,0xA2,0xFA,0x40,0x19,0x60,0x80, + 0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43,0xF9,0xF7,0x9A,0xFA,0x80,0x19,0xA0,0x80, + 0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79,0x14,0x4B,0x00,0x26,0x22,0x07,0x92,0x08, + 0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5B,0x07,0x09,0xD5,0x10,0x4D,0xAB,0x89, + 0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D,0x3A,0x43,0x64,0x00,0x64,0x19,0xE3,0x81, + 0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79,0x80,0x00,0x9B,0x06,0x1B,0x0C,0x1A,0x43, + 0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0, + 0x04,0x48,0x01,0x21,0xC1,0x72,0x06,0x73,0xF0,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC, + 0x40,0x00,0x00,0x20,0x40,0x06,0x00,0x20,0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C, + 0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18, + 0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2, + 0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0x10,0xB4,0x0E,0x24,0x60,0x43,0x03,0x4B,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C, + 0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18, + 0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2, + 0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0x70,0xB4,0x12,0x4A,0x11,0x4D,0x52,0x7D,0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43, + 0x0E,0x22,0x50,0x43,0x0C,0x4B,0x86,0x18,0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0, + 0xEA,0x7D,0x8A,0x42,0x0A,0xD0,0x2A,0x7E,0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42, + 0x04,0xD0,0xAA,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C, + 0x86,0x42,0xEA,0xD8,0x70,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00, + 0x70,0xB4,0x12,0x4A,0x11,0x4B,0x52,0x7D,0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43, + 0xFF,0x26,0x0D,0x4C,0x27,0x36,0x12,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D, + 0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0, + 0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42, + 0xEA,0xD3,0x70,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00, + 0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06, + 0x04,0x48,0x01,0xD5,0x40,0x68,0x00,0xE0,0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x20,0xC0,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x03,0x00, + 0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31, + 0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68,0x00,0xF0,0x16,0xFB, + 0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62,0x50,0x6B,0x60,0x62, + 0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x26,0x62, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7,0x89,0x69,0x21,0x62, + 0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40,0x00,0x93,0x00,0x00, + 0x01,0x21,0x49,0x07,0x48,0x68,0x00,0x23,0x00,0x04,0x00,0x0F,0x00,0x28,0x0B,0x4A, + 0x48,0x68,0x03,0xD0,0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E, + 0x01,0xD0,0x01,0x20,0x07,0xE0,0xD0,0x78,0x00,0x28,0x02,0xD1,0x01,0x20,0x03,0x00, + 0x01,0xE0,0x0F,0x23,0x00,0x20,0xD3,0x70,0x08,0x60,0x70,0x47,0x14,0x07,0x00,0x20, + 0x0A,0x4A,0x10,0xB5,0xD1,0x88,0x0A,0x4B,0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43, + 0x08,0x48,0xD1,0x80,0x03,0xE0,0x07,0x48,0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60, + 0xFF,0xF7,0x28,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xCC,0x07,0x00,0x20,0xB0,0x94,0x00,0x00,0xFE,0xB5,0x04,0x00,0x37,0x48,0x0E,0x00, + 0x07,0x6A,0x41,0x6A,0x02,0x91,0x41,0x6B,0x01,0x91,0xC0,0x6A,0x00,0x90,0x00,0x20, + 0xFF,0xF7,0x74,0xFF,0xFB,0xF7,0x1C,0xFA,0x25,0x00,0x46,0xE0,0x68,0x1E,0x84,0x42, + 0x01,0xD1,0xFB,0xF7,0x4B,0xFA,0xFB,0xF7,0xC5,0xF9,0xFB,0xF7,0x9B,0xFA,0x00,0x2E, + 0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x43,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7,0x38,0xFA, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21, + 0xF9,0xF7,0x2E,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0, + 0x05,0x21,0x28,0x00,0xF9,0xF7,0x24,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFA,0xF7,0x6F,0xFF,0x0C,0xE0, + 0x68,0x00,0x03,0x21,0xF9,0xF7,0x14,0xFA,0xA0,0x42,0xDB,0xD9,0x03,0x21,0x28,0x00, + 0xF9,0xF7,0x0E,0xFA,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2,0x0C,0x48, + 0x44,0x88,0x03,0xE0,0xFB,0xF7,0x7E,0xF9,0xFB,0xF7,0x54,0xFA,0x64,0x1E,0xF9,0xD2, + 0xFB,0xF7,0xBE,0xF9,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63, + 0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40, + 0xE0,0x95,0x00,0x00,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68, + 0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B, + 0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07, + 0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xD1,0x07,0x00,0x20,0x30,0xB4,0x05,0x03, + 0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61, + 0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03, + 0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48, + 0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32, + 0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B, + 0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68, + 0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0, + 0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07, + 0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x93,0x00,0x00, + 0xF8,0xB5,0x17,0x4B,0x00,0x24,0x98,0x79,0x00,0x28,0x25,0xD0,0x00,0x20,0x0D,0x26, + 0x14,0x4D,0xF6,0x01,0x12,0xE0,0x81,0x00,0x49,0x19,0x89,0x19,0x8A,0x68,0x97,0x0F, + 0xFF,0x07,0x0A,0xD0,0x92,0x00,0x01,0x27,0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C, + 0x8A,0x60,0xA1,0x00,0xBF,0x08,0xC9,0x19,0x4A,0x60,0x40,0x1C,0x99,0x79,0x81,0x42, + 0xE9,0xDC,0x07,0x48,0x0D,0x22,0x00,0x21,0xC0,0x1F,0xFE,0xF7,0xF7,0xF8,0x20,0x00, + 0xFF,0xF7,0xB4,0xFF,0xFC,0xF7,0xB2,0xF9,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00, + 0x01,0x21,0x8D,0xB0,0x49,0x07,0x0C,0x94,0x4F,0x68,0x61,0x4E,0xB9,0x0F,0x89,0x07, + 0x7E,0xD5,0x30,0x22,0x00,0x21,0x68,0x46,0xFE,0xF7,0xD8,0xF8,0x07,0x21,0xB8,0x01, + 0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00,0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43, + 0x0C,0x90,0x00,0x20,0x33,0xE0,0x01,0x22,0x81,0x00,0x52,0x07,0x89,0x18,0x89,0x68, + 0x8E,0x00,0x32,0x0F,0x2A,0xD0,0x32,0x0F,0x94,0x46,0x92,0x00,0x6B,0x46,0xD2,0x18, + 0x40,0x3A,0xD3,0x6B,0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27, + 0x3F,0x06,0x0E,0x04,0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43,0x49,0x4E,0x33,0x40, + 0x8E,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43,0x1B,0x0B,0x89,0x05,0x1B,0x03,0x89,0x0D, + 0x0B,0x43,0xD3,0x63,0x62,0x46,0x52,0x1E,0x01,0x23,0x93,0x40,0x9A,0x05,0x92,0x0D, + 0x71,0x46,0x11,0x43,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x0C,0x91,0x40,0x1C,0x0C,0x99, + 0x8E,0x46,0x09,0x04,0x09,0x0F,0x81,0x42,0xC5,0xD8,0x0C,0x98,0x01,0x27,0x00,0x04, + 0x00,0x0F,0x7B,0x07,0x0F,0xE0,0x82,0x00,0xD2,0x18,0x92,0x68,0x3E,0x00,0x92,0x00, + 0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06, + 0x24,0x0E,0x40,0x1C,0x0C,0x91,0x0C,0x99,0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F, + 0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x21,0x08,0x00,0x6E,0x46,0x82,0x00,0xB2,0x58, + 0x00,0x2A,0x03,0xD0,0x8F,0x00,0xFF,0x18,0xBA,0x60,0x49,0x1C,0x40,0x1C,0x0C,0x28, + 0xF4,0xD3,0x23,0x49,0x0C,0x98,0x88,0x43,0x29,0x07,0x09,0x0C,0x08,0x43,0x00,0xE0, + 0x07,0xE0,0x07,0x21,0x49,0x05,0x88,0x43,0x61,0x07,0x09,0x0A,0x08,0x43,0x0C,0x90, + 0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0,0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C, + 0x82,0x00,0x11,0x0F,0x09,0x07,0x21,0x40,0x84,0x01,0xA4,0x0D,0x24,0x03,0x21,0x43, + 0x84,0x05,0x09,0x0B,0x09,0x03,0xA4,0x0D,0x21,0x43,0x0F,0x24,0x24,0x06,0x00,0x04, + 0x80,0x08,0xA1,0x43,0x20,0x40,0x01,0x43,0x08,0x0F,0x09,0xD0,0x12,0x0F,0x52,0x1E, + 0x01,0x20,0x90,0x40,0x80,0x05,0x80,0x0D,0xB0,0x43,0x5A,0x14,0x80,0x18,0x0C,0x90, + 0x99,0x60,0x02,0xE0,0x01,0x21,0x49,0x07,0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x74, + 0x0C,0x99,0x40,0x07,0x41,0x60,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7,0x81,0xF8,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF9,0xF7,0x83,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF9,0xF7,0x68,0xF8,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF9,0xF7,0x6A,0xF8,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xD0,0x07,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60, + 0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47, + 0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0, + 0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60, + 0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x14,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1,0x93,0xC0,0xC1,0xE0, + 0x63,0x30,0xE0,0xE3,0xC1,0x12,0x62,0xE0,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x1F,0x85,0xEB,0x51,0x78,0x47,0xC0,0x46,0x18,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1, + 0x93,0xC0,0xC1,0xE0,0x0F,0x30,0xE0,0xE3,0x27,0x3C,0x43,0xE2,0x41,0x16,0x62,0xE0, + 0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1,0xAD,0x8B,0xDB,0x68,0x78,0x47,0xC0,0x46, + 0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27, + 0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x10,0x30,0x9F,0xE5, + 0x93,0x10,0x82,0xE0,0x63,0x30,0xE0,0xE3,0xA2,0x12,0xA0,0xE1,0x93,0x01,0x20,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x1F,0x85,0xEB,0x51,0x10,0xB5,0xF8,0xF7,0xC7,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x13,0x00,0x13,0x00,0xA0,0x00,0x13,0x00,0x2D,0x01,0x13,0x00, + 0x2B,0x01,0x41,0x00,0x2B,0x01,0x70,0x00,0x5A,0x00,0x82,0x00,0xA0,0x00,0x82,0x00, + 0x2B,0x01,0xA0,0x00,0x2B,0x01,0xD0,0x00,0xA0,0x00,0xF0,0x00,0x2D,0x01,0x00,0x01, + 0x13,0x00,0x20,0x01,0x13,0x00,0x50,0x01,0xA0,0x00,0x5E,0x01,0xE6,0x00,0x5E,0x01, + 0x13,0x00,0x80,0x01,0x13,0x00,0xCA,0x01,0x30,0x00,0xA7,0x01,0x50,0x00,0xCA,0x01, + 0x70,0x00,0xA7,0x01,0x90,0x00,0xCA,0x01,0xB0,0x00,0xA7,0x01,0xD0,0x00,0xCA,0x01, + 0xF0,0x00,0xA7,0x01,0x10,0x01,0xCA,0x01,0x2D,0x01,0xA7,0x01,0x89,0x08,0x49,0x1E, + 0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07,0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43, + 0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0xE8,0x03,0x00,0x00,0xE8,0x03,0x00,0x00,0xE8,0x03,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x14,0x05,0x14,0x05,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x7A,0x00,0x01,0x00,0x04,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x15,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0xFA,0x00, + 0x28,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x1E,0x00,0x46,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x5E,0x01,0x90,0x01,0x90,0x01, + 0x90,0x01,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0xFF, + 0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x2C,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0xC2,0x00,0x00, + 0x1F,0x1F,0xB8,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x99,0x19,0x90,0x01,0x32,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x23,0x00,0x41,0x00, + 0x46,0x00,0x05,0x00,0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0xF4,0x01, + 0xF4,0x01,0xF4,0x01,0x90,0x01,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00, + 0x64,0x3C,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0xC2,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x80,0x00,0x00,0x18,0x10,0xB8,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x19,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0xB4,0x00,0xFA,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x14,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xF0,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x8D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xC2,0x00,0x00, + 0x20,0x00,0x20,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x1F,0x1F,0xB8,0x00, + 0x10,0x3F,0x10,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0xFF,0x0F, + 0x00,0x00,0x00,0x00,0xFF,0x07,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x20, + 0x11,0x30,0x10,0x00,0x41,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x60,0x38,0x30,0x08,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00, + 0x58,0x30,0x28,0x00,0x56,0x31,0x26,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x58,0x31,0x28,0x01, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x31,0x20,0x01, + 0x60,0x30,0x30,0x00,0x48,0x31,0x18,0x01,0x48,0x31,0x18,0x01,0x60,0x37,0x30,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x20,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x20,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x24,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x24,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0x91,0xE7, + 0x21,0x2C,0x92,0xE7,0x42,0xBC,0x92,0xE7,0x63,0x28,0x93,0xE7,0x84,0xB8,0x93,0xE7, + 0xA5,0x24,0x94,0xE7,0xC6,0xB4,0x94,0xE7,0xE7,0x20,0x95,0xE7,0x08,0xB1,0x95,0xE7, + 0x29,0x9D,0x98,0xE7,0x4A,0x01,0x99,0xE7,0x6B,0x99,0x99,0xE7,0x8C,0x05,0x9A,0xE7, + 0xAD,0x95,0x9A,0xE7,0xCE,0x09,0x90,0xE7,0xEF,0x11,0x90,0xE7,0x10,0x0E,0x90,0xE7, + 0x31,0x46,0x90,0xE7,0x52,0x52,0x90,0xE7,0x73,0x4A,0x90,0xE7,0x94,0x4E,0x90,0xE7, + 0xB5,0x02,0x90,0xE7,0xD6,0x02,0x90,0xE7,0xF7,0x02,0x90,0xE7,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x33,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x30,0x68,0x30,0x68,0x70,0x28,0x70,0x28, + 0x32,0x30,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,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0x20,0x00,0x94,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140226.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140226.h new file mode 100644 index 00000000..322b7f5f --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0001_20140226.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS_GF MELFAS, f/w 1(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x00,0x00,0x00,0x10,0x94,0x02,0x00,0x00,0xEC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61, + 0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4, + 0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22, + 0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2, + 0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06, + 0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF, + 0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21, + 0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06, + 0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x07,0xF0,0x18,0xFA,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x4C,0x07,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x55,0xFD,0x07,0x00,0x03,0xF0,0x48,0xFC,0x03,0xF0,0x3A,0xFC, + 0x03,0xF0,0xC4,0xFC,0x47,0x4A,0x48,0x49,0x48,0x48,0x05,0xF0,0x71,0xF9,0x48,0x4D, + 0x00,0x26,0x05,0x21,0x49,0x03,0x30,0x00,0x2E,0x82,0x00,0xF0,0xEF,0xF9,0xA8,0x61, + 0x44,0x49,0x00,0x20,0x00,0xF0,0xEA,0xF9,0x43,0x4B,0x44,0x49,0xD8,0x63,0x44,0x48, + 0x00,0xF0,0xE4,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x82,0xFC, + 0x40,0x4A,0x41,0x48,0x00,0x21,0x05,0xF0,0x65,0xF9,0x06,0xF0,0xEF,0xFC,0x03,0xF0, + 0x29,0xFD,0x3E,0x48,0x01,0x24,0x81,0x7A,0x64,0x07,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0x6E,0x71,0x6E,0x72,0xAE,0x72,0xEE,0x72,0x36,0x48,0x2E,0x73, + 0x6E,0x73,0x60,0x63,0xFF,0x20,0xE0,0x63,0xE0,0x14,0x00,0xF0,0xED,0xFC,0x34,0x48, + 0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0xE7,0xFC,0x32,0x49,0x02,0x20,0x06,0xF0, + 0xD5,0xFF,0x02,0x20,0x06,0xF0,0xDA,0xFF,0x28,0x7A,0x00,0x28,0x01,0xD0,0x07,0xF0, + 0x55,0xF9,0x00,0x2F,0x1F,0xD1,0x2C,0x4F,0xBE,0x15,0x28,0x7A,0x00,0x28,0x02,0xD0, + 0x2A,0x49,0x28,0x6B,0x88,0x60,0xE0,0x6B,0x0B,0x28,0x14,0xD0,0x28,0x48,0x40,0x68, + 0x00,0x07,0x01,0xD5,0x02,0xF0,0xFC,0xFA,0xF8,0x68,0x26,0x49,0x88,0x42,0xEC,0xD9, + 0x25,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB8,0x68,0xB0,0x43,0xB8,0x60,0xB8,0x68, + 0x30,0x43,0xB8,0x60,0xE1,0xE7,0xE8,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02, + 0x00,0xF0,0xAA,0xFC,0x28,0x7A,0x00,0x28,0x01,0xD0,0x07,0xF0,0x2F,0xF9,0x02,0x20, + 0x06,0xF0,0xB0,0xFF,0xFF,0x20,0x81,0x30,0x00,0xF0,0x9E,0xFC,0x17,0x49,0x05,0x20, + 0x03,0xF0,0x6A,0xFA,0x0B,0x20,0xE0,0x63,0x03,0xF0,0x00,0xFB,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x28,0x00,0x00,0x00,0xAC,0x79,0x00,0x00,0x00,0x00,0x00,0x10, + 0x14,0x07,0x00,0x20,0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20,0x00,0x9D,0x00,0x00, + 0x00,0x93,0x00,0x00,0xD4,0x06,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0xD1,0x07,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40, + 0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00,0xE1,0x74,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3, + 0xA0,0x30,0x71,0xE0,0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x34,0x00,0x00,0x3A, + 0x20,0x34,0x71,0xE0,0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0,0x17,0x00,0x00,0x3A, + 0x20,0x38,0x71,0xE0,0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1,0x20,0x38,0x71,0xE0, + 0xFF,0x24,0x82,0xE3,0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21,0x20,0x36,0x71,0xE0, + 0x0E,0x00,0x00,0x3A,0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A,0x21,0x14,0xA0,0x21, + 0xA0,0x37,0x71,0xE0,0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x37,0x71,0xE0, + 0x01,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0,0x81,0x06,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x35,0x71,0xE0,0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x35,0x71,0xE0, + 0x01,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0,0x81,0x04,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xE5,0xFF,0xFF,0x2A,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0, + 0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31, + 0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0,0x01,0x00,0xA0,0x23, + 0x1E,0xFF,0x2F,0x21,0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3,0x1E,0xFF,0x2F,0xE1, + 0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22, + 0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21, + 0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0, + 0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31, + 0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22, + 0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9, + 0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB, + 0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x01,0x00,0x10,0xB5,0x02,0x20,0x07,0xF0,0x4F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA0,0xFF,0xFF,0x3A, + 0x20,0x34,0x71,0xE0,0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0,0x83,0xFF,0xFF,0x3A, + 0x20,0x38,0x71,0xE0,0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0xED,0xFD,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47, + 0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A, + 0x10,0x43,0x08,0x60,0x0B,0x24,0x02,0xF0,0xCF,0xF8,0x64,0x1E,0x00,0x2C,0xFA,0xDC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00, + 0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7B,0xC0,0x07,0x26,0xD0, + 0x70,0x7A,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43, + 0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43, + 0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18, + 0x28,0x19,0x06,0xF0,0xAF,0xFB,0x64,0x1C,0x70,0x7A,0xA0,0x42,0xF3,0xDA,0x70,0x7A, + 0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7A,0x45,0x19,0x3D,0x60, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x3A,0x06,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A, + 0x05,0x78,0x54,0x7A,0xE4,0x00,0xE6,0x18,0x19,0x24,0xA4,0x01,0x36,0x19,0xB5,0x70, + 0x56,0x7A,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x80,0x56,0x7A,0x85,0x88, + 0xF6,0x00,0xF6,0x18,0x36,0x19,0xF5,0x80,0x55,0x7A,0xED,0x00,0xED,0x18,0x2D,0x19, + 0x29,0x72,0x55,0x7A,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19,0x59,0x72,0x51,0x7A, + 0x49,0x1C,0x51,0x72,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28, + 0x01,0xD1,0x00,0x20,0x90,0x72,0x70,0xBC,0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00, + 0x40,0x00,0x00,0x20,0x40,0x06,0x00,0x20,0xFF,0xB5,0x0A,0x20,0x48,0x43,0x16,0x4F, + 0x81,0xB0,0xC5,0x19,0xFF,0x35,0x48,0x00,0xC1,0x35,0xC0,0x19,0x2A,0x73,0x00,0x90, + 0x0C,0x00,0xE0,0x30,0x80,0x8A,0x16,0x00,0x0A,0x21,0xFF,0xF7,0x29,0xFF,0xE8,0x81, + 0x00,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x21,0xFF,0x28,0x82, + 0x38,0x19,0xFF,0x30,0x41,0x30,0x00,0x7E,0xB9,0x19,0x68,0x73,0x04,0x98,0xA8,0x74, + 0x01,0x98,0x06,0x55,0x0D,0x20,0x80,0x01,0x08,0x18,0x00,0x21,0xC4,0x77,0x81,0x74, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x06,0x48,0x0F,0x23, + 0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A,0xD2,0x18,0x09,0x03, + 0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0x40,0x00,0x00,0x20,0xF1,0xB5,0xB1,0x48, + 0x90,0xB0,0x0F,0x90,0x40,0x7C,0x02,0x90,0x0F,0x98,0xC0,0x7C,0x01,0x90,0x0F,0x98, + 0x00,0x7C,0x00,0x90,0xAC,0x48,0x00,0x68,0x00,0x88,0x00,0x05,0x7E,0xD5,0x10,0x98, + 0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x41,0xE1,0x03,0x98, + 0x81,0x00,0x01,0x20,0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90, + 0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x05,0xFB,0x29,0xE1, + 0x9E,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9B,0x49, + 0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80, + 0x4A,0x5B,0x34,0x31,0x4A,0x53,0x69,0x18,0x48,0x80,0x13,0xE1,0x02,0x9F,0x93,0x49, + 0x00,0x20,0x7F,0x1E,0x68,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88, + 0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46, + 0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A,0x02,0x9A,0x88,0x4E,0x92,0x00,0x8B,0x18, + 0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90, + 0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00, + 0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B, + 0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7,0x53,0xFD,0x07,0x00,0x02,0x99,0x30,0x00, + 0xFF,0xF7,0x4E,0xFD,0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42, + 0x17,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21, + 0x48,0x43,0x0A,0x21,0xFF,0xF7,0x6C,0xFE,0x62,0x00,0x00,0xE0,0xCD,0xE0,0x6B,0x4B, + 0x28,0x3B,0x99,0x5E,0x88,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x08,0x18,0x98,0x52, + 0x07,0xE0,0x66,0x49,0x0F,0x9B,0x60,0x00,0x28,0x39,0x0A,0x5A,0x5B,0x7D,0xD2,0x1A, + 0x0A,0x52,0x62,0x49,0x60,0x00,0x28,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22, + 0x0A,0x52,0x08,0x5E,0x01,0x99,0x88,0x42,0x09,0x90,0x04,0xDB,0x5B,0x48,0x05,0x21, + 0x0E,0x38,0x01,0x55,0x2B,0xE0,0x88,0x00,0x05,0x21,0xFF,0xF7,0x41,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18,0x05,0x21, + 0xFF,0xF7,0x36,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0,0x01,0x98, + 0x05,0x21,0x40,0x00,0xFF,0xF7,0x2C,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20, + 0x0A,0xE0,0x01,0x98,0x05,0x21,0xFF,0xF7,0x23,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC, + 0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x44,0x49,0x0E,0x39,0x08,0x55,0x43,0x49, + 0x0C,0x9A,0x34,0x31,0x48,0x5F,0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90, + 0x41,0x5E,0x0B,0x9A,0x3D,0x48,0x57,0x1A,0x0E,0x38,0x06,0x91,0x01,0x5D,0x0F,0x98, + 0x80,0x7D,0x81,0x42,0x27,0xD3,0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E, + 0x00,0xDC,0x70,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E, + 0x00,0xDC,0x70,0x42,0xFF,0xF7,0xC4,0xFC,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20, + 0x0C,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20, + 0x04,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7,0xB2,0xFC,0x08,0x99,0x00,0x2E, + 0x19,0xDB,0x09,0x19,0x18,0xE0,0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99,0xFF,0xF7, + 0xA7,0xFC,0x64,0x21,0x08,0x1A,0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42,0x48,0x43, + 0x64,0x21,0xFF,0xF7,0x9D,0xFC,0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC,0x78,0x42, + 0x50,0x43,0x64,0x21,0xE0,0xE7,0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB,0x10,0x18, + 0x00,0xE0,0x10,0x1A,0x15,0x4A,0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A,0x5A,0x80, + 0x12,0x4A,0x13,0x4B,0x34,0x32,0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80,0x0D,0x9A, + 0x89,0x09,0x1A,0x40,0x0A,0x43,0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D,0x01,0x43, + 0x0E,0x98,0x01,0x60,0x04,0x98,0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C,0x03,0x90, + 0x04,0x98,0x10,0x99,0x88,0x42,0x00,0xDA,0xB9,0xE6,0x11,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0xCC,0x07,0x00,0x20,0xCC,0x0A,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4,0x1B,0x21,0xDA,0x88,0x89,0x01,0x80,0x24, + 0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x0D,0x80,0xC5,0x89,0x4D,0x80, + 0x05,0x8A,0x8D,0x80,0x40,0x8A,0xC8,0x80,0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43, + 0x08,0x81,0x06,0xE0,0x00,0x20,0x08,0x80,0x48,0x80,0x88,0x80,0xC8,0x80,0xA2,0x43, + 0x08,0x81,0xDA,0x80,0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20,0x80,0x93,0x00,0x00, + 0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A,0x00,0x28,0x09,0xD1, + 0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x01,0xF0,0x62,0xFE,0x64,0x1E,0xFB,0xD2, + 0xFF,0x24,0x12,0xE0,0x05,0xF0,0x56,0xFB,0x01,0xF0,0x5A,0xFD,0x01,0xF0,0xA2,0xFD, + 0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x39,0xFD,0x04,0x00,0x03,0x00,0x01,0x9A, + 0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20,0x06,0xF0,0x8A,0xFB, + 0x02,0x20,0x06,0xF0,0x7B,0xFB,0x12,0x49,0xE8,0x68,0xC8,0x61,0x28,0x69,0xC8,0x61, + 0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B,0x0F,0x48,0x02,0xE0, + 0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5,0x48,0x68,0x80,0x07, + 0xFC,0xD5,0x01,0xF0,0x4D,0xFE,0x01,0x20,0x00,0xF0,0x6E,0xF8,0x20,0x00,0x04,0xB0, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0xE7,0x03,0x00,0x00, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00, + 0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x74,0xF9,0x1C,0x48,0x03,0x27, + 0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD, + 0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22, + 0x01,0xA8,0x04,0xF0,0x85,0xFC,0x14,0x99,0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49, + 0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49, + 0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42, + 0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1, + 0x0A,0x90,0x01,0xA8,0x06,0xF0,0x68,0xFC,0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00,0xAB,0x0C,0x00,0x80, + 0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3, + 0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5, + 0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62, + 0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20, + 0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43, + 0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40,0xF0,0xB5,0xFF,0xB0, + 0x00,0x20,0xCC,0xB0,0xBC,0x90,0x40,0x1E,0xB8,0x90,0xFF,0x48,0xFF,0x4A,0x00,0x68, + 0xFF,0x4F,0x60,0x30,0xC1,0x7D,0xFF,0x4C,0x05,0x91,0x01,0x7E,0x12,0x88,0x89,0x18, + 0x09,0x06,0x09,0x0E,0x04,0x91,0x41,0x7E,0x03,0x91,0x80,0x7E,0x02,0x90,0x00,0x20, + 0x3D,0x79,0x01,0x26,0x01,0x90,0x14,0xE0,0x0A,0x20,0x70,0x43,0x0B,0x21,0xC0,0x19, + 0x89,0x01,0x41,0x18,0x09,0x7C,0x00,0x29,0x0A,0xD0,0xF3,0x49,0x40,0x18,0x02,0xF0, + 0x31,0xFE,0x00,0x28,0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90, + 0x76,0x1C,0xA0,0x7A,0xB0,0x42,0xE7,0xDA,0xEC,0x48,0x01,0x88,0x82,0x88,0x8E,0x1A, + 0x00,0x2E,0x00,0xDC,0x56,0x1A,0x41,0x88,0xC0,0x88,0x36,0x04,0x36,0x0C,0x0A,0x1A, + 0x00,0x2A,0x00,0xDC,0x42,0x1A,0xE5,0x49,0x10,0x04,0x20,0x39,0x00,0x22,0xCA,0x91, + 0x8A,0x77,0x01,0x99,0x00,0x0C,0x00,0x29,0x0C,0xD0,0x1E,0x2E,0x0A,0xD2,0x32,0x28, + 0x01,0xD2,0x01,0x21,0x04,0xE0,0x64,0x28,0x01,0xD2,0x02,0x21,0x00,0xE0,0x03,0x21, + 0xCA,0x98,0x81,0x77,0xCA,0x98,0x40,0x7F,0x00,0x28,0x12,0xD1,0xCA,0x98,0x80,0x7F, + 0x01,0x28,0x02,0xD1,0x05,0x98,0x80,0x1C,0x08,0xE0,0x02,0x28,0x02,0xD1,0x05,0x98, + 0x00,0x1D,0x03,0xE0,0x03,0x28,0x04,0xD1,0x05,0x98,0x80,0x1D,0x00,0x06,0x00,0x0E, + 0x05,0x90,0x0D,0x22,0x00,0x21,0xB4,0xA8,0x04,0xF0,0x9C,0xFB,0xF8,0x88,0xFF,0x21, + 0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x06,0xD5,0x01,0xF0,0x47,0xF8,0x7F,0xB0, + 0x4C,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x7A,0x00,0x28,0x01,0xD0,0x40,0x1E, + 0xE0,0x72,0x60,0x7A,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0,0x18,0xE0,0x00,0x28, + 0x16,0xD1,0xBC,0x48,0x82,0x22,0x00,0x21,0x8E,0x30,0x04,0xF0,0x7B,0xFB,0xE0,0x7A, + 0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E,0x0A,0x00,0x14,0x23, + 0xB4,0xA8,0xFF,0xF7,0x91,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD,0x25,0x72,0xE6,0xE1, + 0x0D,0x22,0x01,0x21,0xB0,0xA8,0x04,0xF0,0x65,0xFB,0x02,0x20,0xAE,0x49,0x06,0x90, + 0xAB,0x48,0x89,0x31,0x41,0x18,0xC9,0x91,0xAB,0x49,0x7C,0x31,0x40,0x18,0xC8,0x90, + 0x14,0xE1,0x0C,0x26,0x07,0xAF,0x34,0x20,0x70,0x43,0x07,0xA9,0x40,0x18,0x00,0x21, + 0x34,0x22,0xC9,0x43,0x04,0xF0,0x4E,0xFB,0x76,0x1E,0xF4,0xD5,0x06,0x98,0x01,0xF0, + 0x05,0xFC,0x01,0x27,0xB9,0x90,0x54,0xE0,0xB9,0x98,0x01,0x26,0xBA,0x90,0x4C,0xE0, + 0x0A,0x20,0x70,0x43,0x9A,0x4A,0x0B,0x21,0x80,0x18,0x89,0x01,0x41,0x18,0xC7,0x91, + 0x09,0x7C,0x00,0x29,0x40,0xD0,0x98,0x49,0x40,0x18,0xC6,0x90,0x02,0xF0,0x7A,0xFD, + 0x06,0x99,0x08,0x43,0x07,0xD0,0xC6,0x98,0x02,0xF0,0x74,0xFD,0x00,0x28,0x33,0xD0, + 0x06,0x98,0x00,0x28,0x30,0xD0,0x8E,0x49,0x78,0x00,0x40,0x18,0xC5,0x90,0xE0,0x30, + 0x80,0x8A,0x0A,0x21,0xFF,0xF7,0x7C,0xFB,0xC7,0x99,0x49,0x8A,0x0A,0x1A,0x00,0x2A, + 0x00,0xDC,0x42,0x1A,0xBB,0x92,0xC5,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89, + 0xFF,0xF7,0x6E,0xFB,0xC7,0x99,0x8A,0x8A,0x11,0x1A,0x00,0x29,0x00,0xDC,0x81,0x1A, + 0xBB,0x9A,0x10,0x00,0x50,0x43,0x0A,0x00,0x4A,0x43,0xBA,0x99,0x80,0x18,0x88,0x42, + 0x04,0xDA,0x34,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0xBA,0x90,0x34,0x21,0x79,0x43, + 0x07,0xAA,0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x7A,0xB0,0x42,0xAF,0xDA, + 0x7F,0x1C,0xAF,0x42,0xA8,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x22,0xB9,0x99,0x10,0x00, + 0x15,0xE0,0xB4,0xAE,0x33,0x5C,0x00,0x2B,0x10,0xD1,0x34,0x23,0x06,0x00,0x5E,0x43, + 0x07,0xAB,0xF7,0x18,0x9E,0x59,0xB3,0x00,0xFF,0x58,0x8F,0x42,0x06,0xDA,0x00,0x2F, + 0x04,0xDB,0x00,0x2E,0x02,0xDB,0x39,0x00,0x00,0x22,0xB8,0x90,0x40,0x1C,0xA8,0x42, + 0xE7,0xDD,0x00,0x2A,0x7E,0xD1,0xBC,0x98,0x34,0x21,0x40,0x1C,0xBC,0x90,0xB8,0x98, + 0x5F,0x4F,0x48,0x43,0x07,0xA9,0xC4,0x90,0x08,0x58,0x0A,0x21,0x48,0x43,0x5E,0x49, + 0xC0,0x19,0x88,0x39,0x41,0x18,0xB8,0x98,0x0A,0x22,0x50,0x43,0xC6,0x19,0x30,0x00, + 0xFF,0x30,0xCD,0x30,0x04,0xF0,0x82,0xFA,0xB8,0x98,0x0A,0x21,0x40,0x00,0xC0,0x19, + 0xC3,0x90,0xE0,0x30,0x80,0x8A,0xFF,0xF7,0x0B,0xFB,0xFF,0x36,0xC1,0x36,0xF0,0x81, + 0xC3,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x01,0xFB,0x30,0x82, + 0xB8,0x98,0x38,0x18,0xFF,0x30,0x41,0x30,0x00,0x7E,0x70,0x73,0xB0,0x7C,0x05,0x99, + 0x49,0x1C,0x88,0x42,0x01,0xD2,0x40,0x1C,0xB0,0x74,0xB7,0x7C,0x13,0x2F,0x09,0xD9, + 0x14,0x21,0x38,0x00,0xFF,0xF7,0xEC,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42,0x01,0xD2, + 0x14,0x37,0xB7,0x74,0x30,0x7B,0xB8,0x9A,0xB4,0xA9,0x88,0x54,0xC9,0x9A,0xB8,0x99, + 0x81,0x54,0x31,0x7B,0xC8,0x9A,0x00,0x20,0x88,0x54,0xC4,0x99,0x07,0xAA,0x51,0x58, + 0xB0,0xAA,0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x34,0x23,0x58,0x43,0xC4,0x9B, + 0x07,0xAE,0xC2,0x90,0xF3,0x58,0x00,0x22,0x80,0x19,0xD2,0x43,0x9B,0x00,0x84,0x46, + 0xC2,0x50,0xB4,0xA8,0x40,0x5C,0xB9,0x9E,0x00,0x28,0x10,0xD1,0xA7,0x7A,0x01,0x20, + 0x0B,0xE0,0x83,0x00,0x62,0x46,0xD2,0x58,0x00,0x2A,0x05,0xDB,0xB2,0x42,0x03,0xDA, + 0xC2,0x9B,0x07,0xAE,0xF0,0x50,0x16,0x00,0x40,0x1C,0x87,0x42,0xF1,0xDA,0x49,0x1C, + 0xA9,0x42,0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x7A,0xBC,0x99,0x88,0x42,0x05,0xDD, + 0xBE,0x98,0x40,0x1C,0xA8,0x42,0xBE,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98,0x41,0x1E, + 0x09,0x06,0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE2,0xE6,0x01,0x26,0xBF,0x96, + 0xBD,0x90,0x6E,0xE0,0xB0,0xA8,0x80,0x5D,0x00,0x28,0x69,0xD0,0xBF,0x98,0x14,0x49, + 0x28,0x18,0xBE,0x90,0x0A,0x20,0x70,0x43,0x47,0x18,0x0B,0x20,0x80,0x01,0x38,0x18, + 0xC1,0x90,0x00,0x7C,0xC8,0x99,0x40,0x5C,0x03,0x99,0x88,0x42,0x43,0xD2,0xBE,0x98, + 0x0C,0x28,0x40,0xDC,0x0C,0x48,0x38,0x18,0x02,0xF0,0x64,0xFC,0x00,0x28,0x3A,0xD0, + 0xC1,0x98,0xC8,0x99,0x00,0x7C,0xC8,0x9B,0x05,0x4A,0x41,0x5C,0x49,0x1C,0xC1,0x54, + 0x2D,0x20,0x00,0x01,0x39,0x18,0x0B,0xE0,0xCC,0x07,0x00,0x20,0x00,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0xD6,0x02,0x00,0x00,0xC0,0x03,0x00,0x20, + 0xBE,0x98,0x0A,0x23,0x58,0x43,0x80,0x18,0xC0,0x90,0xFF,0x30,0xCD,0x30,0x1A,0x00, + 0x04,0xF0,0xC4,0xF9,0x09,0x20,0x80,0x01,0x39,0x18,0xC0,0x98,0x4A,0x7D,0xFF,0x30, + 0xC1,0x30,0xC2,0x74,0x89,0x7D,0x01,0x75,0xC1,0x98,0xBE,0x9A,0x00,0x7C,0xB4,0xA9, + 0x88,0x54,0xC9,0x9A,0xBE,0x99,0x81,0x54,0xBF,0x98,0x40,0x1C,0xBF,0x90,0xBD,0x98, + 0x40,0x1C,0xBD,0x90,0x14,0xE0,0x32,0x48,0x38,0x18,0x02,0xF0,0x23,0xFC,0x00,0x28, + 0x0E,0xD0,0xCA,0x99,0x01,0x20,0x08,0x77,0xC1,0x99,0x2E,0x48,0x89,0x7D,0x13,0x29, + 0x06,0xD9,0x61,0x7A,0x01,0x29,0x03,0xD1,0xC1,0x88,0x04,0x22,0x11,0x43,0xC1,0x80, + 0x76,0x1C,0xA0,0x7A,0xB0,0x42,0x8D,0xDA,0x26,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5, + 0x02,0x99,0x04,0x22,0xE1,0x72,0x23,0x49,0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0, + 0xB4,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x0D,0x22,0x01,0x20,0x92,0x01,0x1B,0x27, + 0x7F,0x01,0x1C,0x49,0x09,0x18,0x8B,0x18,0xDB,0x7F,0x00,0x2B,0x0C,0xD1,0xC9,0x19, + 0x09,0x7B,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23, + 0xB4,0xA8,0xFF,0xF7,0xC1,0xFA,0x02,0xE0,0x40,0x1C,0x0D,0x28,0xE9,0xDB,0xE0,0x7A, + 0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18,0x38,0x00,0xFF,0x30, + 0xD3,0x30,0x02,0xF0,0xD7,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20,0xFF,0x37,0xC1,0x37, + 0xB8,0x74,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0xBD,0x98,0x28,0x18,0x20,0x72,0x20,0x7A, + 0x05,0x49,0x82,0x22,0xA0,0x72,0xC8,0x1D,0xFD,0x30,0x04,0xF0,0x47,0xF9,0xE6,0xE5, + 0xD6,0x02,0x00,0x00,0x40,0x00,0x00,0x20,0x0C,0x02,0x00,0x20,0xF1,0xB5,0x38,0x48, + 0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x36,0x48,0x41,0x7F,0x01,0x91,0x01,0x00, + 0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43, + 0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29, + 0xFB,0xD1,0x03,0x90,0x01,0xF0,0x2E,0xF9,0x01,0xF0,0x04,0xFA,0x00,0x24,0x27,0x00, + 0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0,0xA1,0xF8,0x00,0x28,0x28,0xD0,0x0E,0x21, + 0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A, + 0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x05,0xF0,0x12,0xFE,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20, + 0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x04,0xFE, + 0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90, + 0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3,0x7F,0x1C,0x15,0x2F,0xC8,0xD3,0x20,0x00, + 0xFF,0x38,0x27,0x38,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xB2,0xD9,0x06,0x98, + 0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00,0xF0,0xB5,0x7B,0x4A,0xFF,0xB0,0xBC,0xB0, + 0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18,0xB8,0x90,0x48,0x42,0xB7,0x90,0x77,0x48, + 0x77,0x4E,0x07,0x7F,0x02,0xA8,0x01,0x90,0x76,0x48,0xBA,0x90,0x00,0x7D,0x00,0x28, + 0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90,0x73,0x4A,0x00,0x21,0x30,0x00,0x04,0xF0, + 0xF1,0xF8,0x00,0x25,0x00,0x24,0x6F,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x14,0xD0, + 0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0,0xBD,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42, + 0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E, + 0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0xB7,0x9A,0x21,0x00,0x28,0x00, + 0x05,0xF0,0x9A,0xFD,0x10,0xE0,0xBC,0x42,0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0, + 0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42, + 0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x0E,0x2C,0xCB,0xD3,0x6D,0x1C, + 0x15,0x2D,0xC7,0xD3,0x01,0xF0,0x7E,0xF8,0x01,0xF0,0x54,0xF9,0x00,0x25,0x00,0x24, + 0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00,0x28,0x00,0x01,0xF0,0xEF,0xFF,0x00,0x28, + 0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x19,0xF8,0x39,0x19,0x01,0x9A,0x49,0x00, + 0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3,0x6D,0x1C,0x15,0x2D,0xD7,0xD3,0x00,0x20, + 0x00,0x90,0x01,0xF0,0x27,0xF9,0x00,0x25,0x00,0x24,0x21,0x00,0x28,0x00,0x01,0xF0, + 0xC5,0xFF,0x00,0x28,0x3E,0xD0,0x0E,0x21,0x69,0x43,0xB9,0x9B,0x0A,0x19,0x91,0x00, + 0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD, + 0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00,0xF1,0x5B,0x00,0x04,0x00,0x0C,0x81,0x42, + 0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00,0x01,0xF0,0xE8,0xFF,0x01,0x99,0xC8,0x53, + 0x00,0x98,0x03,0x21,0xFF,0xF7,0xAC,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1, + 0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22, + 0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0xEF,0xFC,0x0B,0xE0,0x00,0x22,0xD2,0x43, + 0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0xE7,0xFC,0x00,0x28,0x02,0xD1,0x00,0x22, + 0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C,0xB7,0xD3,0x6D,0x1C,0x15,0x2D,0xB3,0xD3, + 0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98,0x40,0x1E,0xB8,0x90,0x18,0xD2,0x00,0x25, + 0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43,0x01,0x99,0x30,0x19,0x40,0x00,0x0A,0x5A, + 0x21,0x00,0x28,0x00,0x05,0xF0,0xE4,0xFC,0x64,0x1C,0x0E,0x2C,0xF4,0xD3,0x6D,0x1C, + 0x15,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0,0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47, + 0x00,0xF0,0xE0,0xFF,0x8D,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x60,0x06,0x00,0x20, + 0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00,0xD2,0x02,0x00,0x00,0x18,0x07,0x00,0x20, + 0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28, + 0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x79,0x00,0x28,0x3C,0xD0, + 0x00,0x21,0x0D,0x25,0x1F,0x4F,0xED,0x01,0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00, + 0xA6,0x79,0x1B,0x0F,0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19,0xA4,0x68,0xA4,0x00, + 0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19,0x80,0x68,0x92,0x0A, + 0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D, + 0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02, + 0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C, + 0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00, + 0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49,0x40,0x8C,0x01,0x91,0x4B,0x8B,0x20,0x39, + 0x00,0x91,0x89,0x7B,0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46, + 0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99,0x09,0x7E,0x00,0x29,0x0D,0xD0,0x01,0x29, + 0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04, + 0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04, + 0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42,0x5C,0xDC,0x82,0x42,0x5A,0xDB,0x8C,0x45, + 0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A,0x7B,0xD0,0x06,0x27, + 0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0,0x03,0x2A,0x76,0xD1,0xE2,0x79,0xD3,0x07, + 0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A,0x27,0xD1,0x09,0x20,0x00,0x25,0xE0,0x71, + 0x6B,0xE0,0x00,0x9A,0x92,0x7A,0x00,0x2A,0x67,0xD1,0x00,0xF0,0x9D,0xF8,0x06,0x00, + 0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72,0x5F,0xE0,0xE2,0x79,0xD3,0x07,0xE8,0xD1, + 0x92,0x07,0x5A,0xD5,0x00,0xF0,0x90,0xF8,0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28, + 0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71,0xFF,0xF7,0x24,0xF8,0xEB,0xE7,0x31,0x00, + 0x20,0x00,0xE7,0x71,0xFF,0xF7,0x1E,0xF8,0x47,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07, + 0x43,0xD5,0x00,0xF0,0x79,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0, + 0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFF,0xF7,0x0B,0xF8,0xA6,0x71, + 0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20, + 0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28, + 0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0, + 0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xE7,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xDB,0xFF,0x01,0x25, + 0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07, + 0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x03,0x48,0xC0,0x68,0x40,0x07,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47, + 0x00,0x90,0x00,0x40,0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88, + 0x00,0x06,0x80,0x0F,0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00, + 0xA0,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x48,0xC0,0x68,0xC0,0x07,0x00,0xD0, + 0x01,0x20,0x70,0x47,0x00,0x90,0x00,0x40,0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x7B, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x23,0xD0,0x1B,0x7A,0x00,0x2B,0x20,0xD1,0x12,0x4F, + 0x1C,0xE0,0xD3,0x00,0xDD,0x19,0x03,0x23,0x5B,0x02,0xEB,0x18,0x10,0x25,0x5D,0x5F, + 0xA5,0x42,0x0E,0xDC,0x14,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB,0x12,0x25,0x5D,0x5F, + 0x8D,0x42,0x06,0xDC,0x16,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06, + 0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8, + 0xF0,0xBC,0x70,0x47,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0x8D,0xB0,0xBB,0x4E,0x0A,0x90,0x09,0x90,0x30,0x68,0x01,0x88,0x08,0x91,0x01,0x00, + 0x40,0x31,0xCA,0x7F,0x60,0x30,0x07,0x92,0x8A,0x7F,0x06,0x92,0x40,0x78,0x05,0x90, + 0x88,0x7D,0x04,0x90,0xB3,0x48,0xC1,0x88,0x00,0x79,0x0A,0x07,0x05,0xD5,0xB1,0x4A, + 0x00,0x28,0x02,0xD1,0x08,0x23,0x99,0x43,0xD1,0x80,0xAF,0x4D,0x00,0x21,0x69,0x5E, + 0xFF,0x22,0x01,0x32,0x28,0x29,0x03,0xDD,0x02,0x21,0x69,0x5E,0x1E,0x29,0x03,0xDC, + 0x04,0x21,0x69,0x5E,0x28,0x29,0x05,0xDD,0xA6,0x49,0xCB,0x88,0x13,0x43,0xCB,0x80, + 0x00,0x21,0x04,0xE0,0x06,0x21,0x69,0x5E,0x00,0x29,0x02,0xD0,0x49,0x1E,0xE9,0x80, + 0x03,0xE0,0xA0,0x4B,0xD9,0x88,0x91,0x43,0xD9,0x80,0x08,0x99,0x89,0x04,0x7E,0xD5, + 0x6A,0x7A,0x00,0x21,0x00,0x2A,0x02,0xD1,0x00,0x28,0x00,0xD1,0x01,0x21,0x01,0x91, + 0x00,0xF0,0x40,0xF9,0x97,0x48,0x99,0x4C,0x00,0x79,0x01,0x28,0x0C,0x90,0x4D,0xD1, + 0x94,0x49,0x09,0x89,0x0B,0x91,0x35,0x68,0x40,0x35,0x6A,0x8B,0x91,0x42,0x00,0xD3, + 0x00,0x20,0x03,0x90,0x0B,0x98,0x0A,0x22,0x02,0x21,0x50,0x43,0x61,0x5E,0x0F,0x00, + 0xFE,0xF7,0x4E,0xFD,0x29,0x7C,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20, + 0x02,0x90,0x0B,0x98,0x0A,0x21,0xC0,0x1B,0xFE,0xF7,0x42,0xFD,0x69,0x7C,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x07,0x00,0x84,0x48,0xAB,0x7C,0x20,0x38, + 0x80,0x8B,0x01,0x21,0x98,0x42,0x00,0xD8,0x00,0x21,0xEB,0x7C,0x62,0x68,0x01,0x20, + 0x9A,0x42,0x00,0xDB,0x00,0x20,0x03,0x9A,0x00,0x2A,0x2A,0xD0,0x02,0x9A,0x00,0x2A, + 0x27,0xD0,0x00,0x2F,0x25,0xD0,0x00,0x29,0x23,0xD0,0x76,0x4A,0x01,0x21,0xC0,0x32, + 0xD2,0x6A,0x00,0x2A,0x00,0xD0,0x00,0x21,0x01,0x42,0x1A,0xD0,0x60,0x78,0x00,0x28, + 0x2F,0xD0,0x69,0x7E,0x88,0x42,0x2C,0xD8,0x40,0x1E,0x29,0xE0,0x01,0x28,0x10,0xD9, + 0x68,0x7A,0x01,0x28,0x0D,0xD9,0x31,0x68,0x60,0x78,0x40,0x31,0xC9,0x7D,0x88,0x42, + 0x01,0xD2,0x40,0x1C,0x60,0x70,0x60,0x78,0x00,0x28,0x02,0xD0,0x20,0x78,0x40,0x1E, + 0x20,0x70,0x31,0x68,0x60,0x68,0x40,0x31,0x0A,0x7D,0x90,0x42,0x11,0xDB,0x0C,0x9A, + 0x60,0x48,0x00,0x2A,0x0D,0xD0,0xC0,0x88,0xC0,0x06,0x0A,0xD4,0x00,0xE0,0x25,0xE0, + 0x60,0x78,0xC9,0x7D,0x88,0x42,0x04,0xD2,0x04,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C, + 0x60,0x70,0x60,0x78,0x04,0x99,0x10,0x23,0x88,0x42,0x0A,0xD8,0x01,0x98,0x00,0x28, + 0x07,0xD1,0x54,0x49,0xC8,0x88,0x18,0x43,0xC8,0x80,0x30,0x68,0x40,0x30,0x00,0x7E, + 0x0E,0xE0,0x50,0x4A,0xD1,0x88,0xC8,0x06,0x0B,0xD5,0x20,0x78,0x00,0x28,0x06,0xD1, + 0x99,0x43,0xD1,0x80,0x30,0x68,0x40,0x30,0x40,0x7D,0x60,0x70,0x01,0xE0,0x40,0x1E, + 0x20,0x70,0x48,0x4F,0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5, + 0x05,0x99,0x06,0x98,0x40,0x1A,0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x50,0x00, + 0xC0,0x19,0x84,0x46,0xFF,0x30,0xA1,0x30,0xC0,0x88,0x00,0x28,0x68,0xD0,0x07,0x99, + 0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07,0x62,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88, + 0x08,0x21,0x08,0x43,0xF8,0x80,0x5B,0xE0,0x06,0x99,0x88,0x42,0x58,0xD3,0x08,0x98, + 0x40,0x07,0x55,0xD5,0x00,0x23,0x01,0x20,0x29,0xE0,0xFF,0x24,0x39,0x18,0x9A,0x34, + 0x64,0x5C,0x94,0x42,0x22,0xD1,0x5B,0x1C,0xFF,0x31,0x41,0x31,0x09,0x7E,0x0A,0x91, + 0x01,0x00,0x14,0xE0,0x4C,0x00,0xE4,0x19,0x25,0x00,0xE0,0x35,0xEE,0x8A,0xFF,0x34, + 0x01,0x34,0xAE,0x82,0x26,0x8A,0xE6,0x81,0x7C,0x18,0x25,0x00,0xFF,0x35,0x41,0x35, + 0x6E,0x7E,0xFF,0x34,0x81,0x34,0x2E,0x76,0xA6,0x7E,0x49,0x1C,0x66,0x76,0x3C,0x79, + 0x8C,0x42,0xE7,0xDA,0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79, + 0x81,0x42,0xD2,0xDA,0x00,0x2B,0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x09,0x90, + 0xF8,0x88,0x20,0x21,0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30,0x61,0x30,0x41,0x89, + 0x38,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xE0,0x30, + 0x81,0x82,0x60,0x46,0xFF,0x30,0x81,0x30,0x41,0x88,0x38,0x79,0x40,0x00,0xC0,0x19, + 0xFF,0x30,0x01,0x30,0xC1,0x81,0x3B,0x79,0x0B,0x49,0x0A,0x98,0x68,0x39,0x58,0x54, + 0x52,0x1C,0x0C,0x2A,0x8B,0xDB,0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1, + 0xF8,0x88,0x20,0x21,0x88,0x43,0xF8,0x80,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xCC,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x06,0x00,0x20, + 0x03,0x48,0xC0,0x68,0x00,0x03,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47, + 0x00,0x90,0x00,0x40,0xF0,0xB5,0x59,0x48,0xB7,0xB0,0x00,0x68,0x00,0x21,0x60,0x30, + 0x45,0x79,0x07,0x79,0x56,0x48,0x31,0x95,0x36,0x90,0x41,0x80,0x36,0x98,0x41,0x60, + 0x30,0x91,0x60,0x21,0x18,0xA8,0x03,0xF0,0x9F,0xFC,0x60,0x21,0x68,0x46,0x03,0xF0, + 0x9B,0xFC,0x31,0x9D,0x0E,0x21,0x48,0x1B,0x33,0x90,0x58,0xE0,0x15,0x21,0xC9,0x1B, + 0x35,0x91,0x31,0x99,0x38,0x00,0x69,0x1A,0x8C,0x00,0x17,0xE0,0x49,0x4A,0x6B,0x00, + 0x9E,0x18,0xB8,0x23,0xF3,0x5E,0x0E,0x21,0x46,0x00,0x41,0x43,0xB2,0x18,0x88,0x26, + 0x96,0x5F,0x49,0x19,0x09,0x04,0x9A,0x19,0x43,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E, + 0x51,0x18,0x18,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51,0x35,0x99,0x81,0x42, + 0xE4,0xDC,0x78,0x00,0x15,0x21,0x09,0x1A,0x18,0xAE,0x34,0x90,0x30,0x59,0xFE,0xF7, + 0xDF,0xFB,0x30,0x51,0x3E,0x00,0x84,0x46,0x19,0xE0,0x0E,0x20,0x70,0x43,0x36,0x49, + 0x40,0x19,0x40,0x00,0x09,0x5E,0x60,0x46,0x6A,0x00,0x09,0x1A,0x31,0x48,0x13,0x18, + 0xB8,0x22,0x9A,0x5E,0x73,0x00,0x1B,0x18,0x88,0x20,0x18,0x5E,0x10,0x18,0x09,0x18, + 0x0B,0x00,0x4B,0x43,0x68,0x46,0x02,0x59,0xD1,0x18,0x76,0x1C,0x01,0x51,0x35,0x98, + 0xB0,0x42,0xE2,0xDC,0x34,0x98,0x14,0x21,0x09,0x1A,0x6E,0x46,0x30,0x59,0xFE,0xF7, + 0xB7,0xFB,0x30,0x51,0x30,0x99,0x40,0x18,0x30,0x90,0x33,0x98,0x6D,0x1C,0xA8,0x42, + 0xA4,0xDC,0x79,0x00,0x15,0x20,0x41,0x1A,0x31,0x98,0x0E,0x22,0x40,0x00,0x14,0x1A, + 0x61,0x43,0x32,0x90,0x30,0x98,0xFE,0xF7,0xA3,0xFB,0x05,0x04,0x36,0x98,0x2D,0x14, + 0x45,0x80,0x30,0x98,0x21,0x00,0xFE,0xF7,0x9B,0xFB,0x00,0x21,0x6B,0x46,0x0A,0xE0, + 0x8A,0x00,0x9A,0x58,0x82,0x1A,0x16,0x00,0x56,0x43,0x36,0x9A,0x52,0x68,0xB2,0x18, + 0x36,0x9E,0x49,0x1C,0x72,0x60,0x8C,0x42,0xF2,0xDC,0x32,0x98,0x0D,0x21,0x09,0x1A, + 0x36,0x98,0x40,0x68,0xFE,0xF7,0x84,0xFB,0x15,0x22,0x33,0x99,0xD2,0x1B,0x92,0x02, + 0x51,0x43,0xFE,0xF7,0x7D,0xFB,0x36,0x99,0x00,0x2D,0x48,0x60,0x02,0xD1,0x36,0x98, + 0x6D,0x1C,0x45,0x80,0x37,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20, + 0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0x5E,0x4D, + 0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x5E,0xFC, + 0x05,0xF0,0x4C,0xFC,0x04,0xF0,0x8E,0xFA,0x04,0xF0,0x82,0xFF,0x57,0x4E,0x01,0x27, + 0x9D,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0, + 0xC0,0x68,0x07,0x28,0x05,0xD1,0x52,0x48,0xC0,0x68,0x01,0x21,0x49,0x07,0xC8,0x63, + 0x91,0xE0,0x04,0xF0,0xB3,0xFB,0x28,0x7A,0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04, + 0x00,0x0C,0x05,0xF0,0x3B,0xFC,0xFF,0x20,0x81,0x30,0xFE,0xF7,0xAD,0xFF,0x03,0x20, + 0x05,0xF0,0xA4,0xFA,0x47,0x4C,0xE0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0, + 0x40,0x06,0x01,0xD5,0x04,0x20,0x00,0xE0,0x02,0x20,0x05,0xF0,0x5F,0xF9,0x00,0xF0, + 0x1F,0xFC,0x04,0xF0,0x63,0xFF,0x05,0xF0,0x47,0xF9,0x00,0xF0,0xCB,0xFB,0x00,0xF0, + 0xA1,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1,0x30,0x7B,0x00,0x28,0x01,0xD0,0x04,0xF0, + 0x55,0xFA,0x03,0xF0,0x07,0xFC,0x00,0x28,0x00,0xD0,0x2F,0x70,0x28,0x78,0x00,0x28, + 0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x90,0xF9,0x28,0x78,0x00,0x28, + 0x05,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x4D,0xD1,0x00,0x20,0x28,0x70,0x03,0x20, + 0x05,0xF0,0x46,0xFA,0xE8,0x62,0x03,0x20,0x05,0xF0,0x74,0xFA,0xFF,0x20,0x81,0x30, + 0xFE,0xF7,0x62,0xFF,0xE0,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xE0,0x83,0x36,0xE0, + 0xFF,0xF7,0xF0,0xFC,0x00,0x28,0x32,0xD0,0x68,0x79,0x00,0x28,0x2F,0xD1,0x6C,0x6A, + 0x00,0x2C,0x2C,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x1E,0x49,0xFE,0xF7, + 0x0F,0xFC,0x24,0x1A,0x14,0x2C,0x22,0xDD,0x04,0xF0,0x00,0xFA,0x20,0x00,0x05,0xF0, + 0xE3,0xFB,0x05,0xF0,0xE7,0xFB,0xA8,0x79,0x00,0x28,0x0D,0xD0,0x04,0xF0,0xD4,0xF9, + 0x04,0xF0,0xD7,0xF9,0x04,0xF0,0xDF,0xF9,0x14,0x4C,0x67,0x60,0x01,0x20,0xFE,0xF7, + 0x43,0xFF,0x13,0x48,0x60,0x60,0x03,0xE0,0x12,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0, + 0x05,0xF0,0xD7,0xFB,0x0F,0x48,0x00,0x21,0x01,0x70,0x04,0xF0,0xEB,0xF9,0x28,0x78, + 0x00,0x28,0x00,0xD1,0x5D,0xE7,0x28,0x7A,0x00,0x28,0x01,0xD0,0x05,0xF0,0xA6,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x14,0x07,0x00,0x20,0x80,0x93,0x00,0x00, + 0x00,0x40,0x00,0x30,0x40,0x00,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xD0,0x07,0x00,0x20,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43, + 0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x34,0x33,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x28,0x3C,0xA3,0x52,0x22,0x00,0x1A,0x32, + 0x13,0x54,0x18,0x00,0x76,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E, + 0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCC,0x0A,0x00,0x20,0x10,0xB5,0x0C,0x48, + 0x0D,0x22,0x00,0x21,0x03,0xF0,0x46,0xFB,0x0A,0x48,0x82,0x22,0x00,0x21,0x03,0xF0, + 0x41,0xFB,0x08,0x48,0x00,0x24,0x0C,0x38,0x04,0x72,0x07,0x48,0x28,0x22,0x21,0x00, + 0x03,0xF0,0x38,0xFB,0x04,0x48,0x42,0x38,0x44,0x72,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x9F,0x03,0x00,0x20,0x0C,0x02,0x00,0x20,0x82,0x06,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x1A,0x22,0x00,0x21,0x03,0xF0,0x26,0xFB,0x14,0x48,0x1A,0x22,0x00,0x21,0x1A,0x30, + 0x03,0xF0,0x20,0xFB,0x11,0x48,0x0D,0x22,0x00,0x21,0x64,0x30,0x03,0xF0,0x1A,0xFB, + 0x0E,0x48,0x30,0x22,0x00,0x21,0x34,0x30,0x03,0xF0,0x14,0xFB,0x0B,0x48,0x18,0x22, + 0x00,0x21,0x76,0x30,0x03,0xF0,0x0E,0xFB,0x08,0x48,0x18,0x22,0x00,0x21,0x8E,0x30, + 0x03,0xF0,0x08,0xFB,0x05,0x49,0x00,0x20,0xAC,0x31,0xC8,0x83,0xFF,0x39,0xA1,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20, + 0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x09,0x68,0x00,0x24,0x60,0x31,0x8F,0x7F,0x08,0x21, + 0x42,0x00,0x18,0x23,0x4B,0x43,0x9B,0x19,0x1D,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19, + 0x6C,0x80,0x23,0x25,0x6D,0x01,0x5B,0x19,0x49,0x1E,0x5C,0x83,0xF1,0xD5,0x07,0x25, + 0x31,0x18,0xED,0x01,0x01,0x23,0x4D,0x19,0xAB,0x75,0x15,0x25,0x93,0x19,0xAD,0x01, + 0x5B,0x19,0x5C,0x82,0x2B,0x23,0x5B,0x01,0xC9,0x18,0x8F,0x72,0x8C,0x75,0x02,0x21, + 0x0B,0x23,0xDB,0x01,0x18,0x25,0x4D,0x43,0xAD,0x19,0xAD,0x18,0xED,0x18,0x49,0x1E, + 0x6C,0x80,0xF7,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x17,0x20,0xC9,0x43,0x80,0x01, + 0x10,0x18,0x41,0x81,0x81,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00,0xCC,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48,0x1C,0x22,0x00,0x21,0x03,0xF0,0xB2,0xFA, + 0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBA,0x03,0x00,0x20,0x20,0x01,0x00,0x20,0x10,0xB5,0x05,0xF0,0x79,0xF9,0x04,0xF0, + 0x83,0xF9,0xFF,0xF7,0x53,0xFF,0x04,0xF0,0x8F,0xFA,0x01,0xF0,0xA7,0xFD,0x01,0xF0, + 0x1F,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x20,0x30,0x9F,0xE5, + 0x20,0x20,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x11,0x93,0xE7, + 0x80,0xC0,0x82,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1,0xFA,0xFF,0xFF,0x5A, + 0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xD2,0x07,0x00,0x20,0x78,0x47,0xC0,0x46, + 0x20,0x30,0x9F,0xE5,0x20,0x20,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2, + 0x00,0x11,0x93,0xE7,0x80,0xC0,0x82,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1, + 0xFA,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40,0x00,0x00,0x00,0x10, + 0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33,0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42, + 0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04, + 0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0xCC,0x07,0x00,0x20,0xF7,0xB5,0x61,0x48, + 0xE6,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0,0x01,0x20,0x62,0x90,0x00,0x20,0x02,0xE0, + 0x00,0x20,0x62,0x90,0x01,0x20,0x61,0x90,0x5B,0x48,0x00,0x26,0x64,0x90,0x5B,0x48, + 0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A, + 0x01,0x91,0x80,0x8B,0x60,0x90,0x56,0x48,0x00,0x7F,0x63,0x96,0x00,0x90,0x00,0x24, + 0x0E,0x20,0x68,0x43,0x65,0x90,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x76,0xF9, + 0x4C,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4E,0x4A,0x12,0x79,0x00,0x2A, + 0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D, + 0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0, + 0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42, + 0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E, + 0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18, + 0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x80,0x1A,0x64,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0x67,0x9B,0x12,0x0C,0x00,0x2B, + 0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x66,0x9B,0x05,0x2B, + 0x0E,0xD8,0x90,0x42,0x01,0xDA,0x62,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x61,0x9A, + 0x21,0x00,0x28,0x00,0x00,0xF0,0x7E,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0, + 0x63,0x99,0x05,0xA8,0x47,0x54,0x63,0x98,0x40,0x1C,0x63,0x90,0x64,0x1C,0x0E,0x2C, + 0x01,0xDA,0x65,0x98,0x97,0xE7,0x6D,0x1C,0x15,0x2D,0x90,0xDB,0x66,0x98,0x05,0x28, + 0x03,0xD9,0x00,0x04,0x63,0x9E,0x00,0x0C,0x60,0x90,0x00,0x2E,0x25,0xDD,0x68,0x98, + 0x00,0x28,0x22,0xD1,0x00,0xF0,0x4A,0xF9,0x00,0xF0,0x84,0xF9,0x00,0xF0,0x5A,0xFA, + 0x76,0x1E,0x14,0xD4,0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00,0x64,0x98,0x80,0x58, + 0x01,0x05,0x60,0x98,0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C,0xA0,0x42,0x00,0xD9, + 0x20,0x00,0x00,0x04,0x08,0x43,0x64,0x99,0x76,0x1E,0x88,0x50,0xEC,0xD5,0x00,0xF0, + 0x25,0xF9,0x00,0xF0,0x67,0xF9,0x00,0xF0,0x3D,0xFA,0x69,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00, + 0x60,0x06,0x00,0x20,0x14,0x07,0x00,0x20,0xFF,0x0F,0x00,0x00,0xF0,0xB5,0x01,0x26, + 0x76,0x07,0x30,0x68,0x02,0x28,0x1D,0xD1,0xB4,0x68,0x20,0x02,0x27,0x05,0x05,0x0D, + 0x3F,0x0D,0x39,0x00,0x28,0x00,0x04,0xF0,0xD1,0xFA,0x41,0x1C,0x12,0xD0,0x0B,0x4A, + 0x80,0x00,0x83,0x18,0x5B,0x88,0x10,0x5A,0x21,0x0B,0xDB,0x19,0xDB,0x04,0x09,0x03, + 0x1B,0x0D,0x19,0x43,0x40,0x19,0x06,0x4B,0x40,0x08,0x00,0x05,0x19,0x40,0x00,0x0A, + 0x01,0x43,0xB1,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x44,0x79,0x00,0x00, + 0xFF,0x0F,0x00,0xFF,0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00, + 0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0, + 0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0, + 0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD, + 0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A, + 0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0xF0,0xB5,0x8B,0xB0,0x0E,0x27,0x15,0x20,0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48, + 0x53,0x49,0x0A,0x90,0x80,0x7B,0x09,0x91,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5, + 0x0D,0x20,0x03,0x21,0x05,0x90,0x02,0xE0,0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98, + 0x01,0x76,0x4C,0x48,0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04, + 0x00,0x0C,0x01,0x90,0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98, + 0x00,0x28,0x7F,0xD0,0x05,0x98,0x41,0x00,0x30,0x00,0xFE,0xF7,0x21,0xF8,0x05,0x04, + 0x2D,0x0C,0x00,0x24,0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43,0x05,0x99,0xFE,0xF7, + 0x17,0xF8,0x3D,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42, + 0xF2,0xDB,0x04,0x98,0x41,0x00,0x01,0x98,0xFE,0xF7,0x0A,0xF8,0x06,0x9F,0x06,0x04, + 0x36,0x0C,0x00,0x24,0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7, + 0xFF,0xFF,0x31,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82, + 0xBC,0x42,0xF1,0xDB,0x0A,0x98,0x80,0x7B,0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0, + 0x29,0x4A,0x31,0x21,0x10,0x19,0x49,0x01,0x40,0x18,0x41,0x7F,0x0A,0x98,0x80,0x7B, + 0x80,0x07,0x03,0xD5,0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99, + 0x02,0x96,0x03,0x91,0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21, + 0x40,0x1B,0xFD,0xF7,0xD5,0xFF,0x1C,0x4A,0xE1,0x00,0x89,0x18,0x03,0x22,0x52,0x02, + 0x8F,0x18,0x38,0x82,0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90, + 0x80,0x8A,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xC3,0xFF,0x78,0x82,0x08,0x98,0x0A,0x21, + 0x00,0x8C,0x40,0x19,0xFE,0xF7,0xEC,0xF8,0xB8,0x82,0x07,0x98,0x0A,0x21,0x80,0x8A, + 0x80,0x19,0xFE,0xF7,0xE5,0xF8,0xF8,0x82,0x02,0x98,0x0A,0x21,0x40,0x00,0xFE,0xF7, + 0xDF,0xF8,0x09,0x99,0x64,0x1C,0x48,0x83,0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x7B, + 0xA0,0x42,0xB5,0xDC,0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x06,0x00,0x20, + 0x60,0x06,0x00,0x20,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68, + 0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68, + 0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0x49,0x08,0x49,0x00,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0xFF,0x20,0x06,0x49, + 0x06,0x4A,0x6A,0x30,0x03,0xE0,0x0B,0x88,0x13,0x80,0x92,0x1C,0x09,0x1D,0x03,0x00, + 0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40,0xD2,0x02,0x00,0x10, + 0xFF,0x20,0x06,0x49,0x06,0x4A,0x6A,0x30,0x03,0xE0,0x13,0x88,0x92,0x1C,0x0B,0x80, + 0x09,0x1D,0x03,0x00,0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40, + 0xD2,0x02,0x00,0x10,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x04,0x49,0x40,0x22,0x00,0x28,0x48,0x6A,0x01,0xD0,0x10,0x43,0x00,0xE0,0x90,0x43, + 0x48,0x62,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48, + 0x92,0x00,0x02,0xF0,0xF5,0xFF,0x07,0x48,0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43, + 0x06,0x48,0x03,0xF0,0x0F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00, + 0x00,0x00,0x10,0x40,0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x06,0x49,0x00,0x28,0x08,0x69,0x03,0xD0,0x13,0x22,0x12,0x06,0x10,0x43,0x02,0xE0, + 0x03,0x22,0x12,0x06,0x90,0x43,0x08,0x61,0x70,0x47,0x00,0x00,0x40,0xA1,0x00,0x40, + 0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40, + 0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40, + 0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22,0x02,0xF0,0xBA,0xFF,0xFF,0x22,0x09,0x49, + 0x09,0x48,0xF1,0x32,0x02,0xF0,0xB4,0xFF,0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00, + 0x02,0xF0,0xAE,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00, + 0x04,0x90,0x00,0x40,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x04,0x49,0x02,0x22,0x00,0x28,0x08,0x68,0x01,0xD0,0x10,0x43, + 0x00,0xE0,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xFF,0xFF,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFE,0xF7,0x01,0xF8,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xF0,0xFF,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xF2,0xFF,0x0C,0x48,0x6D,0x00,0x04,0x04,0x24,0x0C, + 0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xE1,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00, + 0x00,0x23,0xFD,0xF7,0xE3,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0x00,0x96,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7, + 0x9D,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x4F,0x48, + 0x82,0xB0,0x00,0x68,0x00,0x25,0x60,0x30,0x81,0x8A,0x2E,0x00,0x4C,0x4F,0x01,0x91, + 0x80,0x7D,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0x00,0x90,0x13,0xE0, + 0x0A,0x20,0x60,0x43,0x47,0x49,0x40,0x18,0x0B,0x21,0x89,0x01,0x41,0x18,0x09,0x7C, + 0x00,0x29,0x08,0xD0,0x44,0x49,0x40,0x18,0x01,0xF0,0x6C,0xF9,0x00,0x28,0x02,0xD0, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x7A,0xA0,0x42,0xE8,0xDA,0x3F,0x48, + 0x03,0x89,0x81,0x89,0x5A,0x1A,0x00,0x2A,0x00,0xDC,0xCA,0x1A,0x41,0x89,0xC3,0x89, + 0x12,0x04,0x12,0x0C,0xCC,0x1A,0x00,0x2C,0x00,0xDC,0x5C,0x1A,0x81,0x7C,0x23,0x04, + 0x1B,0x0C,0x00,0x29,0x04,0xD0,0x41,0x7D,0xC8,0x29,0x01,0xD2,0x49,0x1C,0x41,0x75, + 0x32,0x49,0x20,0x39,0x8C,0x7E,0x14,0x2C,0x04,0xD2,0x0C,0x7F,0x00,0x2C,0x01,0xD0, + 0x01,0x24,0x4C,0x77,0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7E,0xC8,0x2C, + 0x01,0xD2,0x64,0x1C,0xCC,0x76,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B, + 0x05,0xD2,0x10,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x10,0x24, + 0x04,0x5F,0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x04,0x82,0x44,0x7D,0x01,0x2C,0x01,0xD9, + 0x78,0x26,0x10,0xE0,0x02,0x2D,0x0E,0xD2,0x10,0x24,0x04,0x5F,0x02,0x2C,0x0A,0xDD, + 0xC9,0x7E,0x14,0x29,0x07,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B, + 0x01,0xD2,0x77,0x26,0xF6,0x43,0x00,0x21,0x02,0x2D,0x01,0x75,0x0D,0xD2,0x31,0x00, + 0x78,0x31,0x04,0xD1,0xC1,0x7C,0xC8,0x29,0x01,0xD2,0x49,0x1C,0xC1,0x74,0xC1,0x7C, + 0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x75,0x01,0x98,0x81,0x19,0x08,0x00, + 0x48,0x43,0x02,0x99,0x00,0x29,0x06,0xD1,0x06,0x49,0x09,0x79,0x01,0x29,0x02,0xD0, + 0x00,0x99,0xFD,0xF7,0xD5,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20, + 0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xD6,0x02,0x00,0x00,0xC0,0x03,0x00,0x20, + 0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2, + 0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3, + 0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0xFE,0xB5,0x1B,0x48,0x1B,0x49,0x00,0x68,0x09,0x88,0x60,0x30, + 0x00,0x7E,0x00,0x25,0x2E,0x00,0x40,0x18,0x01,0x06,0x18,0x48,0x2F,0x00,0x00,0x7A, + 0x09,0x0E,0x00,0x28,0x01,0x90,0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0, + 0x0A,0x20,0x60,0x43,0x12,0x49,0x40,0x18,0xFF,0x30,0xC1,0x30,0x80,0x7C,0x14,0x28, + 0x01,0xD2,0x01,0x26,0x07,0xE0,0x01,0x27,0x14,0x21,0xFD,0xF7,0xB1,0xFE,0x00,0x99, + 0x88,0x42,0x00,0xD3,0x01,0x25,0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F, + 0x02,0xD1,0x00,0x2E,0x00,0xD0,0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xCC,0x07,0x00,0x20,0x00,0x07,0x00,0x20,0x00,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0xFF,0xF7,0x0D,0xFE,0x04,0x49,0x08,0x68,0x06,0x22, + 0x90,0x43,0x08,0x60,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29, + 0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40, + 0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0xAF,0xFD,0x09,0x48, + 0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48, + 0x00,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x21,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x14,0x07,0x00,0x20,0xF1,0xB5,0x61,0x48, + 0x2E,0x21,0x90,0xB0,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26, + 0x76,0x07,0xF1,0x63,0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0, + 0x85,0xFD,0x59,0x4D,0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x07,0xFE,0x10,0x9B, + 0x00,0x21,0x01,0x20,0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0x66,0xFE, + 0x1E,0x16,0x40,0x40,0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x68, + 0x4F,0x6F,0x76,0x7D,0x40,0x84,0x40,0x8B,0x92,0x4F,0x40,0x40,0x40,0x40,0x99,0x40, + 0x0B,0x20,0xF0,0x63,0x4D,0xE0,0x00,0xF0,0x28,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x61,0xF9,0x00,0xF0,0x35,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68, + 0x52,0x68,0x91,0x42,0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18, + 0x49,0x1C,0xC1,0x83,0xFD,0xF7,0x76,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7, + 0x17,0xFE,0xA8,0x78,0x80,0x07,0x01,0xD5,0x04,0xF0,0x7E,0xFD,0x3A,0x49,0x40,0x22, + 0x68,0x46,0x02,0xF0,0x8D,0xFD,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0x8C,0xFD, + 0xF7,0x63,0x1E,0xE0,0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x04,0xF0,0x52,0xFB,0xF0,0xE7,0x03,0x21, + 0x09,0x07,0xCA,0x60,0xFE,0xF7,0x28,0xF9,0x10,0x98,0xFE,0xF7,0x79,0xF8,0x08,0xE0, + 0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x1F,0xF9,0x00,0xF0,0x67,0xFD,0x00,0xF0, + 0xF7,0xF8,0x20,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x71,0xD2,0xE7,0x69,0x71,0xD0,0xE7,0x00,0x2C, + 0x02,0xD0,0x01,0x20,0xA8,0x71,0xCB,0xE7,0xA9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xE8,0x71,0xC4,0xE7,0xE9,0x71,0xC2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0x28,0x72,0xBD,0xE7,0x29,0x72,0xBB,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72, + 0xB6,0xE7,0xA9,0x72,0xB4,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xAF,0xE7, + 0xE9,0x72,0xAD,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA8,0xE7,0x29,0x73, + 0xA6,0xE7,0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x04,0xF0,0x60,0xF9, + 0x9E,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0x14,0x07,0x00,0x20,0x00,0x00,0x00,0x10, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0xC0,0x92,0x00,0x00,0xF0,0xB5,0x36,0x4C, + 0x03,0x00,0x36,0x4A,0x36,0x4E,0x37,0x4F,0x37,0x48,0x38,0x49,0x25,0x68,0x30,0x3B, + 0x04,0xF0,0xAC,0xFD,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x2E, + 0x3A,0x16,0x3D,0x42,0x4A,0x50,0x53,0x0A,0xCD,0x61,0x3B,0xE0,0x60,0x68,0x01,0xE0, + 0x2F,0x48,0xC0,0x6B,0xC8,0x61,0x35,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x37,0xE0, + 0xCE,0x61,0x2F,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7, + 0xD0,0x7B,0xEF,0xE7,0x27,0x48,0x03,0x7F,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09, + 0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0x09,0xE0, + 0x90,0x7D,0x53,0x7E,0x00,0x06,0x03,0x43,0xD0,0x7D,0x12,0x7E,0x00,0x04,0x12,0x02, + 0x10,0x43,0x03,0x43,0xCB,0x61,0x0D,0xE0,0x90,0x7E,0x00,0x06,0xD2,0xE7,0x1A,0x48, + 0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCD,0xE7,0x3A,0x69,0x00,0x8A,0x52,0x08,0x12,0x02, + 0x02,0x43,0xCA,0x61,0x5F,0x22,0x0A,0xE0,0x14,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04, + 0x10,0x43,0xBF,0xE7,0x38,0x69,0x40,0x08,0xBC,0xE7,0x80,0x69,0xBA,0xE7,0x48,0x69, + 0x10,0x42,0xFC,0xD1,0x03,0xF0,0x62,0xFC,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0x00,0x93,0x00,0x00, + 0x15,0x00,0x0E,0x00,0x00,0x20,0x00,0x40,0x14,0x07,0x00,0x20,0x00,0x40,0x00,0x30, + 0xC0,0x0F,0x00,0x20,0x60,0x06,0x00,0x20,0x00,0x96,0x00,0x00,0xE0,0x95,0x00,0x00, + 0x10,0xB5,0x00,0x20,0xFF,0xF7,0x84,0xFC,0x01,0x20,0xFF,0xF7,0xF3,0xFC,0x01,0x20, + 0xFF,0xF7,0xAE,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x70,0xB5,0x03,0x24,0x24,0x07, + 0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x54,0xF8,0x06,0x00,0xCB,0x20, + 0xC0,0x01,0xFE,0xF7,0x31,0xF8,0x03,0xF0,0xED,0xFA,0x00,0xF0,0xA1,0xFC,0x03,0xF0, + 0xDD,0xFA,0x30,0x00,0xFE,0xF7,0x5A,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x03,0xF0,0xDA,0xFA, + 0xFF,0xF7,0xDE,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07, + 0x04,0xF0,0xD4,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0xF8,0xB5,0x23,0x48,0x00,0x68,0x00,0x88,0xC0,0x06,0x3E,0xD5,0x21,0x4E,0x30,0x7A, + 0x00,0x28,0x3A,0xD0,0x70,0x7A,0x00,0x28,0x37,0xD0,0x01,0x25,0x32,0xE0,0x71,0x7A, + 0x1D,0x4F,0x09,0x23,0x8C,0x46,0x0A,0x21,0x69,0x43,0xCC,0x19,0x01,0x20,0x9B,0x01, + 0xFF,0x34,0xC1,0x34,0x23,0xE0,0x0A,0x22,0x42,0x43,0xD2,0x19,0xD2,0x18,0x21,0x7B, + 0x92,0x7B,0x91,0x42,0x1A,0xD1,0x0A,0x22,0x50,0x43,0xC0,0x19,0xC7,0x18,0x0E,0x21, + 0x10,0x20,0x61,0x5E,0x38,0x5E,0x12,0x22,0xBA,0x5E,0x08,0x1A,0x10,0x21,0x61,0x5E, + 0x89,0x1A,0x00,0x91,0x3A,0x8A,0xE1,0x89,0xFF,0xF7,0xD2,0xF9,0xE0,0x81,0x7A,0x8A, + 0x21,0x8A,0x00,0x98,0xFF,0xF7,0xCC,0xF9,0x20,0x82,0x02,0xE0,0x40,0x1C,0x84,0x45, + 0xD9,0xDA,0x6D,0x1C,0x30,0x7A,0xA8,0x42,0xC9,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xCC,0x07,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0xB1,0xB0,0x10,0x90,0x0F,0x90,0x0E,0x90,0x0D,0x90,0xFC,0x48,0x01,0x8C,0x0A,0x91, + 0x40,0x8C,0x09,0x90,0xFA,0x48,0x02,0x68,0x13,0x00,0x60,0x33,0x59,0x7F,0x18,0x7F, + 0x08,0x91,0x11,0x00,0x80,0x31,0x8C,0x7A,0x07,0x94,0x4C,0x7A,0x06,0x94,0x12,0x88, + 0x12,0x07,0x24,0xD5,0xDA,0x7F,0x42,0x43,0x24,0x92,0x0A,0x78,0x42,0x43,0x23,0x92, + 0x4A,0x78,0x42,0x43,0x22,0x92,0x8A,0x78,0x42,0x43,0x21,0x92,0xCA,0x78,0x42,0x43, + 0x20,0x92,0x0A,0x79,0x42,0x43,0x1F,0x92,0x4A,0x79,0x42,0x43,0x1E,0x92,0x8A,0x79, + 0x42,0x43,0x1D,0x92,0xCA,0x79,0x42,0x43,0x1C,0x92,0x09,0x7A,0x41,0x43,0xE5,0x48, + 0x1B,0x91,0x30,0x90,0x00,0x7A,0x00,0x28,0x05,0xD1,0x00,0xF0,0xE7,0xFE,0x31,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x25,0x90,0xDE,0x48,0xE0,0x38,0x2F,0x90, + 0xDD,0x48,0x2E,0x90,0xDD,0x4D,0x25,0x98,0x1B,0x21,0x28,0x18,0x49,0x01,0x2D,0x90, + 0x40,0x18,0x04,0x78,0x00,0x2C,0x0F,0xD0,0x07,0x98,0x00,0x28,0x08,0xD1,0x0A,0x20, + 0x60,0x43,0x40,0x19,0xFF,0x30,0xD3,0x30,0x00,0xF0,0x04,0xFE,0x00,0x28,0x03,0xD0, + 0x2E,0x98,0x00,0x7D,0x00,0x28,0x03,0xD0,0x25,0x98,0xFF,0xF7,0xB9,0xF8,0xC2,0xE2, + 0x25,0x99,0x1D,0x27,0x07,0x20,0x7F,0x01,0x4E,0x00,0x18,0x21,0x41,0x43,0x49,0x19, + 0x89,0x19,0xCA,0x19,0x53,0x88,0x53,0x83,0x23,0x22,0x52,0x01,0x8A,0x18,0x09,0x23, + 0x52,0x8B,0xDB,0x01,0xC9,0x18,0x40,0x1E,0x4A,0x82,0xEE,0xD5,0x0A,0x20,0x44,0x43, + 0x65,0x19,0x2C,0x95,0xFF,0x35,0xC1,0x35,0xEA,0x89,0x0A,0x98,0x40,0x1E,0x82,0x42, + 0xDD,0xDC,0x2A,0x8A,0x09,0x98,0x40,0x1E,0x82,0x42,0xD8,0xDC,0xBB,0x48,0xE9,0x89, + 0x34,0x18,0xE0,0x19,0x2B,0x90,0x23,0x23,0x41,0x80,0x5B,0x01,0x29,0x8A,0xE0,0x18, + 0x2A,0x90,0x41,0x83,0x00,0x20,0x01,0x22,0xD2,0x02,0x01,0x00,0x05,0x90,0x07,0x20, + 0x04,0x92,0x18,0x23,0x43,0x43,0xB1,0x4F,0xDB,0x19,0x9B,0x19,0x1D,0x27,0x7F,0x01, + 0xDF,0x19,0x29,0x93,0x02,0x23,0xFB,0x5E,0xBC,0x46,0x00,0x2B,0x0B,0xDD,0x05,0x9F, + 0xBB,0x42,0x02,0xDD,0x67,0x46,0x7F,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x02,0xDA, + 0x63,0x46,0x5B,0x88,0x04,0x93,0x29,0x9F,0x23,0x23,0x5B,0x01,0xFF,0x18,0x1A,0x23, + 0xFB,0x5E,0x00,0x2B,0x05,0xDD,0x8B,0x42,0x00,0xDD,0x79,0x8B,0x93,0x42,0x00,0xDA, + 0x7A,0x8B,0x40,0x1E,0xD5,0xD5,0x04,0x9B,0x05,0x98,0xC0,0x1A,0xF0,0x28,0x02,0xDC, + 0x8B,0x1A,0xF0,0x2B,0x02,0xDD,0x2E,0x9F,0x01,0x23,0xBB,0x74,0x14,0x28,0x04,0xDA, + 0x88,0x1A,0x14,0x28,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x2F,0x99,0x48,0x74, + 0x2D,0x99,0x07,0x20,0xC0,0x01,0x08,0x18,0x28,0x90,0x80,0x7D,0x01,0x28,0x1B,0xD9, + 0x2B,0x98,0x02,0x21,0x1A,0x23,0x41,0x5E,0xC3,0x5E,0xC8,0x1A,0x00,0x28,0x00,0xDC, + 0x58,0x1A,0x00,0x04,0x00,0x14,0x0C,0x90,0x2A,0x99,0x1A,0x20,0x08,0x5E,0x09,0x21, + 0xC9,0x01,0x63,0x18,0x12,0x21,0x59,0x5E,0x43,0x1A,0x00,0x2B,0x00,0xDC,0x0B,0x1A, + 0x18,0x04,0x00,0x14,0x0B,0x90,0x02,0xE0,0x64,0x20,0x0B,0x90,0x0C,0x90,0x2B,0x98, + 0x1A,0x21,0x41,0x5E,0x02,0x00,0x02,0x20,0x10,0x5E,0x03,0xF0,0xBF,0xFA,0x12,0x90, + 0x09,0x20,0xC0,0x01,0x20,0x18,0x12,0x21,0x41,0x5E,0x2A,0x9A,0x1A,0x20,0x10,0x5E, + 0x03,0xF0,0xB4,0xFA,0x11,0x90,0x0F,0x20,0x80,0x01,0x20,0x18,0x12,0x21,0x41,0x5E, + 0x12,0x98,0x03,0xF0,0xAB,0xFA,0x14,0x90,0x25,0x20,0x40,0x01,0x20,0x18,0x0A,0x21, + 0x41,0x5E,0x11,0x98,0x03,0xF0,0xA2,0xFA,0x13,0x90,0x01,0x20,0x80,0x02,0x27,0x18, + 0x1F,0x20,0x40,0x01,0x20,0x18,0x0A,0x21,0x41,0x5E,0x02,0x22,0xBA,0x5E,0x14,0x98, + 0x03,0xF0,0x96,0xFA,0x00,0x04,0x00,0x14,0x16,0x90,0x13,0x20,0x80,0x01,0x20,0x18, + 0x1A,0x22,0x02,0x21,0x82,0x5E,0x41,0x5E,0x13,0x98,0x03,0xF0,0x89,0xFA,0x00,0x04, + 0x00,0x14,0x15,0x90,0x21,0x20,0x40,0x01,0x20,0x18,0x12,0x22,0x82,0x5E,0x1A,0x21, + 0x79,0x5E,0x16,0x98,0x03,0xF0,0x7C,0xFA,0x00,0x04,0x00,0x14,0x18,0x90,0x05,0x20, + 0x00,0x02,0x20,0x18,0x0A,0x22,0x82,0x5E,0x27,0x20,0x40,0x01,0x20,0x18,0x12,0x21, + 0x41,0x5E,0x15,0x98,0x03,0xF0,0x6C,0xFA,0x00,0x04,0x00,0x14,0x17,0x90,0x2A,0x98, + 0x02,0x22,0x82,0x5E,0x11,0x20,0x80,0x01,0x20,0x18,0x0A,0x21,0x41,0x5E,0x18,0x98, + 0x03,0xF0,0x5E,0xFA,0x00,0x04,0x00,0x14,0x1A,0x90,0x29,0x20,0x40,0x01,0x20,0x18, + 0x1A,0x22,0x02,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x03,0xF0,0x51,0xFA,0x00,0x04, + 0x00,0x14,0x19,0x90,0x0B,0x99,0x0C,0x98,0x00,0xF0,0xB8,0xFF,0x3F,0x4F,0x01,0x21, + 0x18,0x22,0x4A,0x43,0xD2,0x19,0x0B,0x23,0x92,0x19,0xDB,0x01,0xD2,0x18,0x53,0x88, + 0x49,0x1E,0x53,0x83,0xF4,0xD5,0x0B,0x21,0xC9,0x01,0x61,0x18,0x48,0x80,0x2D,0x9A, + 0x2B,0x21,0x49,0x01,0x57,0x18,0xBA,0x7D,0x00,0x20,0x00,0x2A,0x94,0x46,0x0D,0xDB, + 0x18,0x21,0x13,0x00,0x4B,0x43,0x31,0x49,0x59,0x18,0x8B,0x19,0x0B,0x21,0xC9,0x01, + 0x5B,0x18,0x02,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF1,0xD5,0x61,0x46,0x49,0x1C, + 0xFD,0xF7,0x96,0xF9,0x23,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0, + 0x21,0x98,0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC, + 0x03,0x20,0x05,0xE0,0x1D,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20, + 0xB9,0x7A,0x40,0x1A,0x08,0x99,0x49,0x42,0x00,0x28,0x0B,0xDD,0x15,0x20,0x80,0x01, + 0x20,0x18,0x12,0x22,0x82,0x5E,0x08,0x9B,0x9A,0x42,0x01,0xD1,0x00,0x22,0x0A,0xE0, + 0x52,0x1C,0x08,0xE0,0x00,0x28,0x16,0x48,0x07,0xDA,0x20,0x18,0x12,0x22,0x82,0x5E, + 0x8A,0x42,0xF3,0xD0,0x52,0x1E,0x42,0x82,0x0A,0xE0,0x22,0x18,0x12,0x20,0x10,0x5E, + 0x00,0x28,0x01,0xDD,0x40,0x1E,0x02,0xE0,0x00,0x28,0x01,0xDA,0x40,0x1C,0x50,0x82, + 0x0B,0x48,0x22,0x18,0x12,0x20,0x10,0x5E,0x08,0x9A,0x90,0x42,0x12,0xD1,0xBA,0x7A, + 0x05,0x2A,0x0F,0xD2,0x52,0x1C,0xBA,0x72,0x13,0xE0,0x00,0x00,0x00,0x93,0x00,0x00, + 0xCC,0x07,0x00,0x20,0x00,0x02,0x00,0x20,0xC0,0x03,0x00,0x20,0x40,0x00,0x00,0x20, + 0x40,0x05,0x00,0x00,0x88,0x42,0x04,0xD1,0xB8,0x7A,0x01,0x28,0x01,0xD9,0x40,0x1E, + 0xB8,0x72,0x28,0x98,0x1A,0x9A,0x80,0x7D,0x19,0x9C,0x01,0x00,0x27,0x90,0x26,0x90, + 0x10,0x00,0xFD,0xF7,0x2D,0xF9,0x10,0x90,0x0E,0x90,0x26,0x99,0x20,0x00,0xFD,0xF7, + 0x27,0xF9,0x0F,0x90,0x0D,0x90,0xB8,0x7A,0x01,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9, + 0x6B,0x46,0x06,0xC3,0x19,0x9B,0x1A,0x9A,0x27,0x98,0x09,0x21,0x03,0xF0,0x32,0xFE, + 0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x17,0x9B,0x80,0x7D,0x18,0x9A, + 0x07,0x21,0x03,0xF0,0x27,0xFE,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E, + 0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98, + 0x00,0x92,0xFF,0x30,0x23,0x9B,0x24,0x9A,0xCD,0x30,0x9B,0xE0,0x02,0x28,0x27,0xD1, + 0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3,0x17,0x9B,0x18,0x9A,0x27,0x98,0x07,0x21, + 0x03,0xF0,0x08,0xFE,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x15,0x9B, + 0x80,0x7D,0x16,0x9A,0x05,0x21,0x03,0xF0,0xFD,0xFD,0x3C,0x20,0x6B,0x46,0x18,0x5E, + 0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB, + 0x9A,0x5E,0x2C,0x98,0x21,0x9B,0xFF,0x30,0x00,0x92,0x22,0x9A,0xCD,0x30,0x71,0xE0, + 0x03,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3,0x15,0x9B,0x16,0x9A, + 0x27,0x98,0x05,0x21,0x03,0xF0,0xDE,0xFD,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0, + 0x28,0x98,0x13,0x9B,0x80,0x7D,0x14,0x9A,0x03,0x21,0x03,0xF0,0xD3,0xFD,0x3C,0x20, + 0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4, + 0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x1F,0x9B,0xFF,0x30,0x00,0x92,0x20,0x9A, + 0xCD,0x30,0x47,0xE0,0x04,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0, + 0x13,0x9B,0x14,0x9A,0x27,0x98,0x03,0x21,0x03,0xF0,0xB4,0xFD,0x0F,0xAA,0x10,0xA9, + 0x68,0x46,0x06,0xC0,0x28,0x98,0x11,0x9B,0x80,0x7D,0x12,0x9A,0x02,0x21,0x03,0xF0, + 0xA9,0xFD,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E, + 0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x1D,0x9B,0xFF,0x30, + 0x00,0x92,0x1E,0x9A,0xCD,0x30,0x1D,0xE0,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0, + 0x11,0x9B,0x12,0x9A,0x27,0x98,0x02,0x21,0x03,0xF0,0x8C,0xFD,0x3C,0x22,0x6B,0x46, + 0x9A,0x5E,0x00,0x21,0x10,0xAB,0x59,0x5E,0x2A,0x9B,0x1A,0x20,0x18,0x5E,0x01,0xAB, + 0x07,0xC3,0x2B,0x98,0x02,0x22,0x82,0x5E,0x2C,0x98,0x1B,0x9B,0x00,0x92,0x1C,0x9A, + 0xFF,0x30,0xCD,0x30,0x31,0x00,0x03,0xF0,0x89,0xFD,0x28,0x98,0x3D,0x49,0x80,0x7D, + 0x09,0x28,0x02,0xD2,0x28,0x9A,0x40,0x1C,0x90,0x75,0xB8,0x7D,0x02,0x28,0x01,0xD2, + 0x40,0x1C,0xB8,0x75,0x28,0x7B,0x40,0x1E,0x80,0x00,0x40,0x18,0x17,0x21,0x89,0x01, + 0x44,0x18,0x0A,0x20,0x20,0x5E,0x00,0x28,0x21,0xDB,0x0C,0x21,0x61,0x5E,0x00,0x29, + 0x1D,0xDB,0x06,0x9A,0x64,0x21,0x8E,0x1A,0x70,0x43,0xFD,0xF7,0x39,0xF8,0x07,0x00, + 0xE8,0x89,0x06,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x62,0xF9,0x38,0x18,0xE8,0x81, + 0x0C,0x20,0x20,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x2A,0xF8,0x06,0x00,0x28,0x8A, + 0x06,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x53,0xF9,0x30,0x18,0x28,0x82,0xE8,0x89, + 0x60,0x81,0x28,0x8A,0xA0,0x81,0x25,0x98,0x40,0x1C,0x0C,0x28,0x25,0x90,0x00,0xDA, + 0x18,0xE5,0x30,0x98,0x00,0x7A,0x01,0x28,0x22,0xD1,0x30,0x98,0x2E,0x9A,0x80,0x7D, + 0x41,0x00,0x18,0x48,0x08,0x18,0x1D,0x21,0x49,0x01,0x41,0x18,0x0B,0x88,0x13,0x81, + 0x23,0x22,0x52,0x01,0x82,0x18,0x12,0x8B,0x2E,0x9B,0x5A,0x81,0x0A,0x8B,0x2E,0x99, + 0x8A,0x81,0x09,0x21,0xC9,0x01,0x40,0x18,0x00,0x8A,0x2E,0x99,0xC8,0x81,0x30,0x98, + 0x01,0x8B,0x2E,0x98,0x01,0x80,0x30,0x98,0x41,0x8B,0x2E,0x98,0x41,0x80,0xE6,0xE4, + 0x02,0x28,0xFC,0xD1,0x30,0x98,0x01,0x8B,0x2E,0x98,0x01,0x80,0x30,0x98,0x41,0x8B, + 0x2E,0x98,0x41,0x80,0x04,0x48,0x2E,0x99,0x42,0x88,0x8A,0x80,0x81,0x88,0x2E,0x98, + 0xC1,0x80,0xD4,0xE4,0x40,0x00,0x00,0x20,0x20,0x02,0x00,0x20,0xF8,0xB5,0x1C,0x4B, + 0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B,0x1B,0x7F,0x9E,0x46, + 0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D, + 0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45, + 0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0, + 0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7, + 0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42, + 0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7, + 0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x18,0x07,0x00,0x20,0x0E,0x23,0x58,0x43, + 0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x1C,0x49,0x10,0xB5,0x4A,0x7A,0x1C,0x49,0x00,0x20,0x00,0x2A,0x15,0xD1,0x0A,0x89, + 0x00,0x2A,0x0F,0xD0,0x19,0x49,0x8A,0x42,0x0C,0xD0,0x10,0x00,0x1E,0x21,0x48,0x43, + 0x64,0x21,0xFD,0xF7,0xAD,0xF8,0xFF,0x30,0x4B,0x21,0x91,0x30,0xC9,0x00,0x88,0x42, + 0x00,0xD9,0x08,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x0F,0x4C,0x88,0x89,0xA4,0x89, + 0x0F,0x4A,0x01,0x00,0xA2,0x18,0x0E,0x4C,0xFF,0x39,0x7D,0x23,0xA6,0x39,0xDB,0x00, + 0x64,0x42,0x99,0x42,0x06,0xD8,0x10,0x00,0x50,0x43,0x59,0x1C,0xFD,0xF7,0x90,0xF8, + 0x20,0x1A,0xE7,0xE7,0xA0,0x42,0xE5,0xD9,0x03,0x21,0x10,0x00,0xFD,0xF7,0x88,0xF8, + 0x00,0x19,0xDF,0xE7,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x73,0xFA,0xFF,0xFF,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47, + 0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D, + 0x00,0x24,0x01,0x21,0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68, + 0x6A,0x60,0x05,0xE0,0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18, + 0x02,0x00,0x40,0x1E,0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0x93,0xFF,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06, + 0xFC,0xD4,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5, + 0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5, + 0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5, + 0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A, + 0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA, + 0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5, + 0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3, + 0x10,0x40,0xBD,0x08,0x9A,0x0B,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3, + 0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A,0x91,0x0B,0x00,0xEB,0xD2,0xFF,0xFF,0xEA, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69, + 0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48, + 0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E, + 0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1, + 0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0, + 0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0xF5,0xFE,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69, + 0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5, + 0x02,0xF0,0xE4,0xFE,0xC3,0xE7,0x00,0x00,0x16,0x07,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29,0x80,0x79,0x01,0xD1,0x01,0x25,0x03,0xE0, + 0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x33,0x27, + 0x7F,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1,0x34,0x48,0x0D,0x22,0x00,0x21,0x14,0x38, + 0x01,0xF0,0x18,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00, + 0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19,0x36,0x7B,0x9E,0x42,0x01,0xD1,0x04,0x00, + 0x02,0xE0,0x40,0x1C,0x0C,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18, + 0xF6,0x19,0x36,0x7B,0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x73,0xED,0xE7, + 0x40,0x1C,0x0C,0x28,0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18, + 0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00, + 0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7B,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23, + 0xE4,0x19,0x23,0x73,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x02,0xE0,0x40,0x1C,0x0C,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20, + 0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xC0,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43, + 0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C, + 0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60, + 0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50, + 0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47,0x4C,0x07,0x00,0x20,0xF0,0xB5,0x87,0xB0, + 0xFE,0xF7,0x5C,0xFB,0xFE,0xF7,0x3A,0xFB,0x01,0xF0,0x22,0xFF,0x02,0xF0,0xFE,0xFC, + 0x00,0xF0,0xAE,0xFD,0x00,0xF0,0xBC,0xFB,0xFD,0xF7,0xF8,0xFF,0xFD,0xF7,0x66,0xFA, + 0x39,0x48,0x00,0x68,0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x56,0xFA, + 0xFF,0xF7,0x06,0xFA,0x03,0xE0,0xFF,0xF7,0x03,0xFA,0xFF,0xF7,0x4F,0xFA,0x01,0x27, + 0x7F,0x07,0x78,0x68,0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x78,0x60, + 0x02,0xF0,0xE0,0xFF,0x02,0xF0,0x50,0xFE,0x38,0x68,0x00,0x28,0x07,0xD0,0x78,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x3E,0x68,0x02,0x24,0x76,0x1C,0x37,0xE0,0x01,0x24, + 0x26,0x00,0xA0,0x00,0xC0,0x19,0x06,0x90,0x05,0x68,0xA8,0x01,0x80,0x0D,0x05,0x90, + 0xA8,0x05,0x80,0x0D,0x04,0x90,0x21,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9, + 0x05,0xA8,0x02,0xF0,0x77,0xFE,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x05,0xA8,0x03,0xF0,0x7C,0xFE,0x04,0xA9,0x05,0xA8,0x03,0xF0,0x82,0xFC, + 0x14,0x48,0x04,0x99,0x05,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x05,0x43, + 0xA8,0x0A,0x80,0x02,0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42, + 0xC7,0xD9,0x38,0x68,0xFC,0xF7,0x7A,0xFF,0xFD,0xF7,0x1A,0xFE,0x02,0xF0,0xD4,0xFD, + 0xFF,0xF7,0xDC,0xFE,0xFC,0xF7,0xBC,0xFE,0x03,0xF0,0x16,0xFD,0x06,0x48,0x40,0x79, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20,0x1F,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xF8,0xB5,0x02,0xF0, + 0x59,0xFC,0xFE,0xF7,0x8B,0xFD,0xFE,0xF7,0x5B,0xFE,0xFE,0xF7,0xA3,0xFE,0x1A,0x48, + 0x00,0x21,0xC0,0x7F,0x03,0xF0,0xD0,0xFB,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20, + 0x28,0x70,0xE8,0x61,0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68, + 0x00,0x07,0x12,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x76,0xFD, + 0xFF,0xF7,0x3B,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x69,0xFD,0xE0,0x6B,0x0B,0x28,0xE6,0xD1, + 0xFE,0xF7,0x8C,0xF9,0x28,0x78,0x00,0x28,0xD9,0xD0,0x02,0xF0,0x1B,0xFA,0xD6,0xE7, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x93,0x00,0x00,0x00,0x40,0x00,0x30, + 0x14,0x07,0x00,0x20,0x70,0xB5,0x05,0x00,0x1A,0x48,0x1B,0x4A,0x00,0x68,0x12,0x88, + 0x60,0x30,0x01,0x7E,0xC0,0x7D,0x2C,0x78,0x89,0x18,0x0E,0x06,0x17,0x49,0x36,0x0E, + 0x4A,0x7F,0x00,0x2A,0x0D,0xD1,0x89,0x7F,0x01,0x29,0x01,0xD1,0x80,0x1C,0x06,0xE0, + 0x02,0x29,0x01,0xD1,0x00,0x1D,0x02,0xE0,0x03,0x29,0x02,0xD1,0x80,0x1D,0x00,0x06, + 0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7, + 0xEF,0xFD,0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70, + 0x01,0x20,0xF4,0xE7,0xCC,0x07,0x00,0x20,0x00,0x07,0x00,0x20,0xA0,0x03,0x00,0x20, + 0x10,0xB5,0x0C,0x24,0x20,0x00,0xFE,0xF7,0x07,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48, + 0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0x10,0xB5,0x07,0x4C,0x07,0x48,0x22,0x00, + 0x00,0x21,0x01,0xF0,0x5F,0xFD,0x06,0x48,0x22,0x00,0x00,0x21,0x01,0xF0,0x5A,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00,0x00,0x00,0x00,0x10, + 0xD2,0x07,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0, + 0x49,0xFD,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5, + 0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0x01,0xF0,0x18,0xFD,0x10,0x48,0xC0,0x07, + 0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19, + 0x01,0xF0,0xFC,0xFC,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0, + 0x39,0xFD,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48, + 0x92,0x0F,0x00,0x19,0x01,0xF0,0x1E,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x00,0x00,0x00,0xD4,0x79,0x00,0x00,0x40,0x00,0x00,0x20,0x28,0x0B,0x00,0x00, + 0x40,0x00,0x00,0x20,0x05,0x49,0xC8,0x05,0x41,0x62,0x05,0x49,0x81,0x62,0x05,0x48, + 0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00,0x80,0x88,0x3C,0x03, + 0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21, + 0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24, + 0x20,0x00,0xFE,0xF7,0xF5,0xF9,0x64,0x1C,0x0C,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00,0xFD,0xF7,0x84,0xF8, + 0xFE,0xF7,0x06,0xFD,0xFE,0xF7,0xD0,0xFC,0xFE,0xF7,0x0A,0xFD,0xFE,0xF7,0x00,0xFD, + 0xFE,0xF7,0xC2,0xFC,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B, + 0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7,0x65,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x93,0x00,0x00,0x10,0xB5,0x02,0xF0, + 0x09,0xFB,0x02,0xF0,0xE9,0xFA,0xFF,0x20,0xFD,0xF7,0x96,0xF8,0xFF,0xF7,0xAA,0xFF, + 0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0,0xC5,0xFC,0x08,0x20,0xFD,0xF7,0x54,0xF8, + 0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x04,0xFE,0x00,0xF0,0x1A,0xF8, + 0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7,0x45,0xF8,0x00,0xF0, + 0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20,0x02,0xF0,0xD7,0xFA,0xFE,0xF7,0x18,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x4C,0x07,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x93,0x00,0x00,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFD,0xF7, + 0x2B,0xF8,0x20,0x02,0xFD,0xF7,0x52,0xF8,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7, + 0xDF,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0, + 0xFD,0xFA,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x03,0xF0,0xF6,0xFA, + 0x30,0x00,0xFD,0xF7,0x09,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCD,0xFD,0x03,0xF0, + 0xA8,0xFC,0x7D,0x20,0xC0,0x00,0x03,0xF0,0x97,0xFC,0x00,0x20,0xFF,0xF7,0xAA,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x4D,0x78,0x00,0x00,0x0A,0x48,0x10,0xB5, + 0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7, + 0xA7,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0x52,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0x07,0xA5,0x07,0x00, + 0x14,0x07,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xCF,0xFE,0x14,0x48,0x00,0x7A,0x03,0xF0, + 0xF7,0xF9,0xFF,0xF7,0x3B,0xFF,0x11,0x48,0x11,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24, + 0xD1,0x83,0x10,0x49,0x0F,0x4A,0xCC,0x60,0x0C,0x61,0x0F,0x49,0xC0,0x3A,0x09,0x68, + 0x40,0x31,0x49,0x7D,0x51,0x70,0x01,0x00,0x20,0x39,0x0A,0x8B,0x09,0x49,0x40,0x39, + 0x8A,0x63,0x00,0x88,0xC8,0x63,0xFF,0xF7,0x9B,0xFE,0x08,0x48,0xC4,0x80,0xFE,0xF7, + 0xEF,0xFA,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x40,0x00,0x00,0x20,0x00,0x07,0x00,0x20,0xCC,0x07,0x00,0x20,0x00,0x02,0x00,0x20, + 0x15,0x07,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90,0x00,0x20,0x2B,0x4E, + 0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0xCC,0xFB,0xFE,0xF7,0xA2,0xFC, + 0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F,0x00,0x25,0x00,0x90, + 0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0x39,0xFB,0x00,0x28,0x1B,0xD0,0x0E,0x21, + 0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A, + 0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98, + 0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00, + 0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3,0x6D,0x1C,0x15,0x2D, + 0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0,0x07,0x98,0x07,0x60, + 0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF, + 0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x68,0x30,0x9F,0xE5, + 0x60,0xC0,0x9F,0xE5,0x0E,0x06,0xD3,0xE5,0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3, + 0x0F,0x16,0xD3,0x15,0x00,0x00,0xA0,0x13,0x00,0x00,0x51,0x13,0x1E,0xFF,0x2F,0x91, + 0x0E,0x26,0xD3,0xE5,0x00,0x10,0x83,0xE0,0x3D,0x16,0xD1,0xE5,0x02,0x00,0x12,0xE3, + 0x3C,0x26,0xD3,0xE5,0x82,0x21,0x62,0x00,0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10, + 0x81,0x10,0x82,0x10,0x01,0x11,0x9C,0xE7,0x80,0x20,0x83,0xE0,0x02,0x19,0xC1,0xE3, + 0xB0,0x11,0xC2,0xE1,0x0F,0x16,0xD3,0xE5,0x01,0x00,0x80,0xE2,0x00,0x00,0x51,0xE1, + 0xEE,0xFF,0xFF,0x8A,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20, + 0x10,0xB4,0x0E,0x24,0x62,0x43,0x51,0x18,0x0A,0x4A,0x49,0x00,0x52,0x5E,0x0A,0x49, + 0x1E,0x24,0x0C,0x5F,0xA2,0x42,0x0B,0xDD,0x01,0x78,0x00,0x29,0x08,0xD1,0x03,0x70, + 0x06,0x48,0x59,0x00,0x08,0x18,0xFF,0x30,0xA1,0x30,0xC1,0x88,0x49,0x1C,0xC1,0x80, + 0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x10,0xE0,0x01,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF0,0xB4,0x9D,0x00,0x2E,0x4B,0x0A,0x27,0xEB,0x18,0xFF,0x33,0x21,0x33,0x08,0x25, + 0x5D,0x5F,0xDF,0x5F,0x00,0x24,0x84,0x46,0x04,0x9E,0x05,0x98,0x23,0x00,0x01,0x2A, + 0x0E,0xD0,0x02,0x2A,0x3A,0xD0,0x03,0x2A,0x3E,0xD0,0x04,0x2A,0x11,0xD1,0xAB,0x19, + 0x1B,0x06,0x1B,0x16,0x0E,0x2B,0x3B,0xDC,0x0E,0x24,0x67,0x43,0xFC,0x18,0x06,0xE0, + 0xBB,0x1B,0x1B,0x06,0x1B,0x16,0x33,0xD4,0x0E,0x24,0x5C,0x43,0x64,0x19,0x24,0x06, + 0x24,0x0E,0x1C,0x4D,0x64,0x00,0x2D,0x5F,0x1B,0x4C,0x1E,0x26,0xA6,0x5F,0xB5,0x42, + 0x26,0xDD,0x64,0x46,0x24,0x78,0x00,0x2C,0x22,0xD1,0x84,0x00,0x01,0x2A,0x21,0xD0, + 0x84,0x00,0x61,0x18,0x02,0x2A,0x1F,0xD0,0x03,0x2A,0x1F,0xD0,0x04,0x2A,0x00,0xD1, + 0xCB,0x70,0x61,0x46,0x08,0x70,0x41,0x00,0x0D,0x48,0x08,0x18,0xFF,0x30,0xA1,0x30, + 0xC1,0x88,0x49,0x1C,0xC1,0x80,0x01,0x20,0xF0,0xBC,0x70,0x47,0xBB,0x19,0x1B,0x06, + 0x1B,0x16,0x15,0x2B,0xD0,0xDD,0x03,0xE0,0xAB,0x1B,0x1B,0x06,0x1B,0x16,0xC3,0xD5, + 0x00,0x20,0xF1,0xE7,0x0B,0x55,0xE4,0xE7,0x4B,0x70,0xE2,0xE7,0x8B,0x70,0xE0,0xE7, + 0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xE0,0x01,0x00,0x20,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xF0,0xB5,0xF3,0x48,0xFF,0xB0,0x00,0x68,0x9E,0xB0,0x40,0x30,0x85,0x8B,0x00,0x20, + 0x96,0x90,0x15,0x20,0x95,0x90,0xEF,0x48,0x0C,0x22,0x00,0x21,0x01,0xF0,0xB2,0xFA, + 0xEC,0x48,0x18,0x22,0x00,0x21,0x0C,0x30,0x01,0xF0,0xAC,0xFA,0xFF,0x22,0x6A,0x32, + 0x00,0x21,0x36,0xA8,0x01,0xF0,0xA6,0xFA,0x34,0x22,0x00,0x21,0x29,0xA8,0x01,0xF0, + 0xA1,0xFA,0x34,0x22,0x00,0x21,0x1C,0xA8,0x01,0xF0,0x9C,0xFA,0x34,0x22,0x00,0x21, + 0x0F,0xA8,0x01,0xF0,0x97,0xFA,0x34,0x22,0x00,0x21,0x02,0xA8,0x01,0xF0,0x92,0xFA, + 0xDD,0x4C,0x64,0x21,0x20,0x89,0x68,0x43,0xFC,0xF7,0xBA,0xF9,0xD9,0x49,0x89,0x1D, + 0x9C,0x91,0xE1,0x89,0x40,0x18,0x9C,0x99,0xC8,0x83,0x20,0x79,0x00,0x28,0x7E,0xD0, + 0x00,0x26,0xF7,0xE0,0xB3,0x00,0x9B,0x18,0xFF,0x33,0x21,0x33,0x08,0x22,0x9A,0x5E, + 0x00,0x21,0x08,0x00,0x00,0x2A,0x03,0xDB,0x0E,0x20,0x0E,0x2A,0x00,0xDC,0x10,0x00, + 0x04,0x06,0x0A,0x20,0x18,0x5E,0x24,0x0E,0x00,0x28,0x03,0xDB,0x15,0x21,0x15,0x28, + 0x00,0xDC,0x01,0x00,0x0D,0x06,0x2D,0x0E,0x28,0x00,0x0E,0x21,0x48,0x43,0x9B,0x90, + 0x00,0x19,0x36,0xA9,0x08,0x5C,0x00,0x28,0x04,0xD1,0x96,0x98,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x96,0x90,0x01,0x20,0x91,0x90,0x94,0x90,0x93,0x90,0x96,0x98,0x29,0xAF, + 0x83,0x00,0x9A,0x93,0xD8,0x19,0xFD,0x54,0x99,0x90,0x45,0x70,0x84,0x70,0xC4,0x70, + 0x96,0x9A,0x00,0x21,0x68,0x46,0x06,0xC0,0xF8,0x5C,0x0E,0x21,0x33,0x00,0x48,0x43, + 0x00,0x19,0x36,0xA9,0x40,0x18,0x01,0x22,0x29,0xA9,0xFF,0xF7,0xF9,0xFE,0x00,0x2D, + 0x92,0x90,0x1D,0xD0,0x00,0x2C,0x0D,0xD0,0x68,0x1E,0x0E,0x21,0x48,0x43,0x00,0x19, + 0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1E,0x6A,0x1E,0x61,0x1E,0xFF,0xF7,0xC8,0xFE, + 0x0E,0x2C,0x0B,0xD2,0x68,0x1E,0x0E,0x21,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18, + 0x96,0x9B,0x40,0x1C,0x6A,0x1E,0x61,0x1C,0xFF,0xF7,0xBA,0xFE,0x15,0x2D,0x1D,0xD2, + 0x00,0x2C,0x0D,0xD0,0x68,0x1C,0x0E,0x21,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18, + 0x96,0x9B,0x40,0x1E,0x6A,0x1C,0x61,0x1E,0xFF,0xF7,0xAA,0xFE,0x0E,0x2C,0x0D,0xD2, + 0x68,0x1C,0x0E,0x21,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x00,0xE0,0x22,0xE1, + 0x96,0x9B,0x40,0x1C,0x6A,0x1C,0x61,0x1C,0xFF,0xF7,0x9A,0xFE,0x01,0x27,0x6B,0xE0, + 0x92,0x98,0x00,0x28,0x13,0xD0,0xBC,0x42,0x11,0xD3,0x96,0x9A,0x9A,0x98,0x01,0x92, + 0x29,0xA9,0x00,0x97,0x08,0x5C,0x0E,0x21,0x33,0x00,0x40,0x1E,0x48,0x43,0x00,0x19, + 0x36,0xA9,0x40,0x18,0x01,0x22,0x29,0xA9,0xFF,0xF7,0xA2,0xFE,0x00,0xE0,0x00,0x20, + 0x92,0x90,0x91,0x98,0x00,0x28,0x13,0xD0,0xE8,0x19,0x15,0x28,0x10,0xD2,0x96,0x9A, + 0x99,0x98,0x01,0x92,0x00,0x97,0x40,0x78,0x0E,0x21,0x33,0x00,0x40,0x1C,0x48,0x43, + 0x00,0x19,0x36,0xA9,0x40,0x18,0x02,0x22,0x29,0xA9,0xFF,0xF7,0x89,0xFE,0x00,0xE0, + 0x00,0x20,0x91,0x90,0x94,0x98,0x00,0x28,0x11,0xD0,0xBC,0x42,0x0F,0xD3,0x96,0x9A, + 0x99,0x98,0x00,0x97,0x01,0x92,0x80,0x78,0x36,0xA9,0x33,0x00,0x41,0x18,0x9B,0x98, + 0x03,0x22,0x40,0x1E,0x08,0x18,0x29,0xA9,0xFF,0xF7,0x72,0xFE,0x00,0xE0,0x00,0x20, + 0x94,0x90,0x93,0x98,0x00,0x28,0x12,0xD0,0xE0,0x19,0x0E,0x28,0x0F,0xD2,0x96,0x9A, + 0x99,0x98,0x00,0x97,0x01,0x92,0xC0,0x78,0x36,0xA9,0x33,0x00,0x41,0x18,0x9B,0x98, + 0x04,0x22,0x40,0x1C,0x08,0x18,0x29,0xA9,0xFF,0xF7,0x5A,0xFE,0x00,0xE0,0x00,0x20, + 0x93,0x90,0x91,0x99,0x92,0x98,0x40,0x18,0x94,0x99,0x40,0x18,0x93,0x99,0x40,0x18, + 0x05,0xD0,0x7F,0x1C,0x3F,0x06,0x3F,0x0E,0x95,0x98,0x87,0x42,0x90,0xD3,0x76,0x1C, + 0x36,0x06,0x36,0x0E,0x58,0x4A,0x10,0x79,0xB0,0x42,0x00,0xD9,0x02,0xE7,0x14,0x00, + 0x20,0x79,0x35,0xE0,0x83,0x00,0x1D,0x19,0xFF,0x35,0x21,0x35,0x06,0x23,0xEB,0x5E, + 0x00,0x22,0x11,0x00,0x00,0x2B,0x03,0xDB,0x15,0x21,0x15,0x2B,0x00,0xDC,0x19,0x00, + 0x0B,0x06,0x04,0x21,0x69,0x5E,0x1B,0x0E,0x00,0x29,0x03,0xDB,0x0E,0x22,0x0E,0x29, + 0x00,0xDC,0x0A,0x00,0x11,0x06,0x0E,0x22,0x53,0x43,0x09,0x0E,0x59,0x18,0x36,0xAA, + 0x51,0x5C,0x22,0x18,0x13,0x00,0xFF,0x32,0x81,0x32,0x51,0x76,0x51,0x7E,0xFF,0x22, + 0x59,0x32,0x49,0x00,0x09,0x19,0xFF,0x31,0xA1,0x31,0xC9,0x88,0x09,0x06,0x09,0x0E, + 0xD1,0x54,0xA2,0x8B,0x91,0x42,0x00,0xD9,0xA1,0x83,0x40,0x1E,0x00,0x06,0x00,0x0E, + 0x00,0x28,0xC7,0xD1,0x01,0x25,0x62,0xE0,0xAC,0x00,0x29,0xA8,0x01,0x5D,0x20,0x18, + 0x84,0x46,0x40,0x78,0x97,0x90,0x39,0xE0,0x62,0x46,0xD2,0x78,0x60,0x46,0x80,0x78, + 0x98,0x92,0x2D,0xE0,0x0E,0x22,0x4A,0x43,0x12,0x18,0x36,0xAB,0x9B,0x5C,0xAB,0x42, + 0x22,0xD1,0x2E,0x4B,0x52,0x00,0x9A,0x5E,0x9C,0x9E,0x1E,0x23,0xF3,0x5E,0x9A,0x42, + 0x1A,0xDD,0x29,0x4F,0xD2,0x1A,0x46,0x00,0xF6,0x19,0x36,0x8C,0x12,0x04,0x12,0x0C, + 0x56,0x43,0x1C,0xAB,0x1B,0x59,0x9B,0x19,0x1C,0xAE,0x33,0x51,0x4E,0x00,0xF6,0x19, + 0x40,0x36,0xB6,0x8A,0x0F,0xAB,0x1B,0x59,0x56,0x43,0x9B,0x19,0x0F,0xAE,0x33,0x51, + 0x02,0xAE,0x33,0x59,0x9A,0x18,0x32,0x51,0x40,0x1C,0x98,0x9A,0x00,0x06,0x00,0x0E, + 0x82,0x42,0xCF,0xD2,0x49,0x1C,0x97,0x98,0x09,0x06,0x09,0x0E,0x88,0x42,0xC3,0xD2, + 0x02,0xA8,0x06,0x59,0x00,0x2E,0x12,0xD0,0x1C,0xA8,0x00,0x59,0x31,0x00,0xFC,0xF7, + 0x57,0xF9,0x11,0x49,0x6A,0x00,0x57,0x18,0xFF,0x21,0x6B,0x31,0xC8,0x53,0x0F,0xA8, + 0x00,0x59,0x31,0x00,0xFC,0xF7,0x4C,0xF9,0xFF,0x37,0x81,0x37,0x78,0x80,0x0A,0x48, + 0x40,0x19,0xFF,0x30,0x81,0x30,0x45,0x76,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x06,0x48, + 0x00,0x79,0xA8,0x42,0x98,0xD2,0x7F,0xB0,0x1E,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xCC,0x07,0x00,0x20,0xDA,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x0E,0x90,0x01,0x24,0x0F,0x90,0x0B,0x90,0x09,0x90, + 0xFF,0x4D,0x07,0x90,0x28,0x78,0xFF,0x4F,0x00,0x28,0x0A,0xD0,0xFE,0x48,0x01,0x79, + 0x06,0x91,0x41,0x79,0x05,0x91,0x81,0x79,0x04,0x91,0xC1,0x79,0x03,0x91,0x00,0x7A, + 0x0C,0xE0,0x38,0x68,0x01,0x00,0x20,0x30,0x42,0x7F,0x40,0x31,0x06,0x92,0x82,0x7F, + 0x05,0x92,0xC0,0x7F,0x04,0x90,0x08,0x78,0x03,0x90,0x48,0x78,0x2E,0x22,0x00,0x21, + 0x02,0x90,0x1C,0xA8,0x01,0xF0,0xA6,0xF8,0xF0,0x48,0xF1,0x49,0x00,0x22,0x08,0x81, + 0xF0,0x48,0x8A,0x81,0x72,0x90,0x42,0x81,0xEF,0x48,0xF0,0x4A,0x71,0x90,0x40,0x7A, + 0x70,0x92,0x02,0x28,0x02,0xD9,0x3A,0x68,0x52,0x8C,0x10,0xE0,0x02,0x28,0x06,0xD1, + 0x3A,0x68,0x70,0x9B,0x12,0x8C,0xDB,0x88,0xD2,0x18,0x0C,0x92,0x0F,0xE0,0x2A,0x78, + 0x00,0x2A,0x06,0xD0,0xE6,0x4A,0x70,0x9B,0x92,0x89,0x9B,0x88,0xD2,0x18,0x0C,0x92, + 0x05,0xE0,0x3A,0x68,0x70,0x9B,0xD2,0x8B,0x9B,0x88,0xD2,0x18,0x0C,0x92,0xE1,0x4A, + 0x0C,0x9B,0x6F,0x92,0x12,0x89,0xDA,0x49,0x0E,0x26,0xD2,0x18,0x0D,0x92,0x8E,0x5F, + 0x01,0x28,0x06,0xD9,0x39,0x68,0xC9,0x7E,0x48,0x43,0x04,0x06,0x24,0x0E,0x00,0xD1, + 0x01,0x24,0x72,0x99,0x3D,0x68,0x08,0x20,0x08,0x5E,0xA9,0x7E,0x48,0x43,0x03,0xF0, + 0xC7,0xF8,0x08,0x04,0x29,0x8B,0x00,0x0C,0x81,0x42,0x00,0xD9,0x08,0x00,0x21,0x00, + 0xFC,0xF7,0xB6,0xF8,0x72,0x99,0x48,0x81,0x21,0x00,0x30,0x00,0xFB,0xF7,0x80,0xFF, + 0x00,0x04,0x00,0x14,0x70,0x99,0x0A,0x90,0x40,0x35,0x68,0x89,0x09,0x89,0x0D,0x9E, + 0x44,0x18,0xB4,0x42,0x00,0xD2,0x0D,0x94,0xC7,0x48,0x6E,0x90,0x80,0x7B,0xC1,0x07, + 0x05,0xD0,0x80,0x07,0x01,0xD5,0x01,0x20,0x00,0xE0,0x02,0x20,0x09,0x90,0xC3,0x49, + 0x00,0x20,0x6D,0x91,0xBA,0x4F,0x88,0x83,0x78,0x89,0xA9,0x7B,0x48,0x43,0x03,0xF0, + 0xCB,0xF8,0x08,0x04,0x6D,0x99,0x00,0x14,0xC8,0x83,0xA9,0x89,0x88,0x42,0x02,0xDA, + 0xA8,0x89,0x6D,0x99,0xC8,0x83,0x0D,0x98,0x0C,0x21,0x00,0x04,0x00,0x14,0x6C,0x90, + 0x20,0x04,0x00,0x14,0x6B,0x90,0x30,0x04,0x00,0x14,0x6A,0x90,0x09,0x98,0x00,0x25, + 0xC0,0x07,0xC0,0x0F,0x09,0x1A,0x69,0x91,0x0D,0x21,0x08,0x1A,0x68,0x90,0x09,0x98, + 0x13,0x21,0x80,0x07,0xC0,0x0F,0x09,0x1A,0x67,0x91,0x14,0x21,0x08,0x1A,0x66,0x90, + 0xAB,0x48,0x65,0x90,0x0E,0x20,0x68,0x43,0xA1,0x49,0x64,0x90,0x68,0x00,0x00,0x24, + 0x40,0x18,0x40,0x30,0x63,0x90,0x64,0x98,0xA6,0x49,0x00,0x19,0x00,0x04,0x00,0x14, + 0x1B,0x90,0x40,0x00,0x62,0x90,0x08,0x5E,0x6D,0x99,0x1E,0x22,0x8A,0x5E,0x90,0x42, + 0x02,0xDD,0x88,0x8B,0x40,0x1C,0x88,0x83,0x9F,0x49,0x62,0x98,0x08,0x5E,0x6C,0x99, + 0x88,0x42,0x61,0x90,0x00,0xDA,0xFE,0xE3,0x00,0x20,0x00,0x2D,0x25,0xDD,0x1B,0x99, + 0x01,0x26,0x0E,0x39,0xC8,0x10,0x4B,0x07,0x1C,0xAA,0x10,0x5C,0x5B,0x0F,0x31,0x00, + 0x99,0x40,0x08,0x40,0x00,0x2C,0x0B,0xDD,0x1B,0x99,0x0F,0x39,0xCB,0x10,0xD7,0x5C, + 0x49,0x07,0x49,0x0F,0x33,0x00,0x8B,0x40,0x1F,0x40,0x38,0x18,0x00,0x06,0x00,0x0E, + 0x0D,0x2C,0x0C,0xDA,0x1B,0x99,0x0D,0x39,0xCB,0x10,0x49,0x07,0xD2,0x5C,0x49,0x0F, + 0x8E,0x40,0x32,0x40,0x10,0x18,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0C,0xDD,0x1B,0x99, + 0x1C,0xAB,0x49,0x1E,0xCA,0x10,0x9A,0x5C,0x4B,0x07,0x5B,0x0F,0x01,0x21,0x99,0x40, + 0x0A,0x40,0x10,0x18,0x00,0x06,0x00,0x0E,0x00,0x28,0x00,0xD0,0xC3,0xE3,0x7F,0x48, + 0x00,0x7D,0x80,0x07,0x06,0xD5,0x0D,0x2C,0x0E,0xD1,0x7D,0x48,0x00,0x78,0x01,0x28, + 0x0A,0xD1,0x05,0xE0,0x14,0x2D,0x07,0xD1,0x79,0x48,0x00,0x78,0x01,0x28,0x03,0xD1, + 0x74,0x4A,0x62,0x99,0x00,0x20,0x50,0x52,0x00,0x26,0x37,0x00,0xE9,0x19,0x8C,0x46, + 0x00,0x20,0x49,0x1E,0x0E,0x22,0x51,0x43,0x60,0x91,0x21,0x18,0x62,0x46,0x52,0x1E, + 0x49,0x1E,0x00,0x2A,0x0D,0xDB,0x15,0x2A,0x0B,0xDC,0x00,0x29,0x09,0xDB,0x0E,0x29, + 0x07,0xDC,0x60,0x9A,0x51,0x18,0x4A,0x00,0x67,0x49,0x89,0x5E,0xB1,0x42,0x00,0xDD, + 0x0E,0x00,0x40,0x1C,0x00,0x04,0x00,0x14,0x03,0x28,0xE6,0xDB,0x7F,0x1C,0x3F,0x04, + 0x3F,0x14,0x03,0x2F,0xDA,0xDB,0x61,0x99,0x30,0x04,0x00,0x14,0x81,0x42,0x00,0xD0, + 0x81,0xE3,0x53,0x49,0x89,0x89,0x81,0x42,0x06,0xDC,0x51,0x49,0x88,0x81,0x08,0x79, + 0x40,0x1C,0x00,0x06,0x00,0x0E,0x0F,0x90,0x1B,0x98,0x1B,0x99,0xC0,0x10,0x4B,0x07, + 0x1C,0xAA,0x16,0x5C,0x5B,0x0F,0x01,0x21,0x99,0x40,0x0E,0x43,0x16,0x54,0x00,0x20, + 0x08,0x90,0x09,0x98,0xC0,0x07,0x0A,0xD0,0x0D,0x2C,0x01,0xD1,0x0D,0x20,0x09,0xE0, + 0x0C,0x2C,0x0F,0xD1,0x08,0x98,0x21,0x04,0x08,0x43,0x08,0x90,0x0A,0xE0,0x14,0x2D, + 0x02,0xD1,0x14,0x20,0x08,0x90,0x05,0xE0,0x13,0x2D,0x03,0xD1,0x08,0x98,0x29,0x04, + 0x08,0x43,0x08,0x90,0x08,0x98,0x00,0x04,0x61,0x98,0x04,0xD0,0x6B,0x99,0x88,0x42, + 0x00,0xDA,0x48,0xE3,0x03,0xE0,0x6A,0x99,0x88,0x42,0x00,0xDA,0x43,0xE3,0x31,0x49, + 0x08,0x68,0x5F,0x90,0x00,0x88,0x40,0x04,0x04,0xD5,0x31,0x4A,0x61,0x98,0xD2,0x89, + 0x80,0x1A,0x05,0xE0,0x37,0x4A,0x62,0x98,0x10,0x5E,0x2D,0x4A,0xD2,0x89,0x80,0x1A, + 0x00,0x28,0x00,0xDC,0x2F,0xE3,0x72,0x9B,0x0A,0x22,0x9A,0x5E,0x82,0x42,0x00,0xDB, + 0x29,0xE3,0x00,0x20,0x84,0x46,0x10,0x90,0x61,0x46,0x69,0x18,0x89,0x1E,0x09,0x06, + 0x09,0x16,0x0E,0x22,0x5E,0x91,0x51,0x43,0x5D,0x91,0x0A,0x23,0x61,0x46,0x59,0x43, + 0x2D,0xAA,0x8A,0x18,0x5C,0x92,0x00,0x20,0x3A,0xAA,0x8E,0x18,0x21,0x18,0x89,0x1E, + 0x5E,0x9A,0x09,0x06,0x09,0x16,0x16,0x2A,0x03,0xD2,0x00,0x29,0x01,0xDB,0x0E,0x29, + 0x03,0xDD,0x00,0x21,0x42,0x00,0xB1,0x52,0x69,0xE0,0x5F,0x9A,0x12,0x88,0x52,0x04, + 0x5D,0x9A,0x08,0xD5,0x1C,0x4B,0x52,0x18,0x52,0x00,0x9A,0x5A,0x0A,0x9B,0xD2,0x1A, + 0x43,0x00,0xF2,0x52,0x07,0xE0,0x17,0x4B,0x52,0x18,0x52,0x00,0x9A,0x5A,0x0A,0x9B, + 0xD2,0x1A,0x43,0x00,0xF2,0x52,0x42,0x00,0xB3,0x5E,0x00,0x2B,0x01,0xDA,0x00,0x27, + 0xB7,0x52,0x5F,0x9B,0x5D,0x9F,0x1B,0x88,0x1B,0x04,0x2B,0xD5,0x79,0x18,0x21,0xE0, + 0x20,0x07,0x00,0x20,0xCC,0x07,0x00,0x20,0xE0,0x95,0x00,0x00,0xFF,0x0F,0x00,0x00, + 0x40,0x00,0x00,0x20,0x20,0x01,0x00,0x20,0x00,0x02,0x00,0x20,0x00,0x07,0x00,0x20, + 0xA0,0x95,0x00,0x00,0xA0,0x01,0x00,0x20,0x40,0x06,0x00,0x20,0x20,0x06,0x00,0x20, + 0x80,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x07,0x00,0x20,0x00,0x93,0x00,0x00, + 0x48,0x07,0x00,0x20,0xFF,0x4B,0x49,0x00,0x59,0x5A,0x0A,0x9B,0x5C,0x9F,0xC9,0x1A, + 0xB9,0x52,0x07,0xE0,0xFC,0x4B,0x79,0x18,0x49,0x00,0x59,0x5A,0x0A,0x9B,0x5C,0x9F, + 0xC9,0x1A,0xB9,0x52,0x5C,0x99,0x89,0x5E,0x00,0x29,0x02,0xDA,0x5C,0x9F,0x00,0x21, + 0xB9,0x52,0x61,0x46,0x00,0x29,0x0A,0xD0,0x04,0x29,0x08,0xD0,0x00,0x28,0x06,0xD0, + 0x04,0x28,0x04,0xD0,0x10,0x99,0x49,0x1C,0x09,0x06,0x09,0x0E,0x10,0x91,0x40,0x1C, + 0x00,0x04,0x00,0x14,0x05,0x28,0x81,0xDB,0x60,0x46,0x40,0x1C,0x00,0x04,0x00,0x14, + 0x05,0x28,0x84,0x46,0x00,0xDA,0x67,0xE7,0xE8,0x48,0x00,0x78,0x00,0x28,0x39,0xD1, + 0x10,0x98,0x40,0x1E,0x07,0x06,0x3F,0x0E,0x00,0xD1,0x01,0x27,0x02,0x22,0x40,0xAB, + 0x9A,0x5E,0x30,0xAB,0x3E,0x26,0x00,0x92,0x9E,0x5F,0x38,0x22,0x36,0x21,0x34,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x15,0xFE,0x40,0xAB,0x06,0x00, + 0x0C,0x22,0x0A,0x21,0x08,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x01,0xF0,0x08,0xFE, + 0x30,0x18,0x39,0x00,0xFB,0xF7,0x7C,0xFD,0x01,0x04,0x00,0x20,0x40,0xAB,0x18,0x5E, + 0x09,0x0C,0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A,0xD1,0x49,0x09,0x68,0xC0,0x31, + 0x0B,0x88,0x9A,0x42,0x06,0xDA,0x49,0x88,0x88,0x42,0x03,0xDA,0x08,0x98,0x00,0x04, + 0x00,0xD1,0x50,0xE2,0x12,0x22,0x00,0x21,0x28,0xA8,0x00,0xF0,0x33,0xFE,0x30,0xAB, + 0x18,0x88,0x20,0xAB,0xC6,0x49,0x18,0x84,0x30,0xAB,0x58,0x88,0x20,0xAB,0x58,0x84, + 0x30,0xAB,0x98,0x88,0x20,0xAB,0x98,0x84,0x30,0xAB,0x58,0x89,0x20,0xAB,0xD8,0x84, + 0x30,0xAB,0xD8,0x89,0x20,0xAB,0x58,0x85,0x30,0xAB,0x98,0x8A,0x20,0xAB,0x98,0x85, + 0x30,0xAB,0xD8,0x8A,0x20,0xAB,0xD8,0x85,0x30,0xAB,0x18,0x8B,0x20,0xAB,0x18,0x86, + 0x09,0x68,0x0C,0x20,0x30,0xAB,0x18,0x5E,0x89,0x8B,0x48,0x43,0x02,0xF0,0x70,0xFE, + 0x20,0xAB,0x19,0x85,0x02,0x22,0x40,0xAB,0x9A,0x5E,0x30,0xAB,0x3E,0x26,0x00,0x92, + 0x9E,0x5F,0x38,0x22,0x36,0x21,0x34,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00, + 0xFF,0xF7,0x27,0xFB,0x40,0xAB,0x06,0x00,0x0C,0x22,0x0A,0x21,0x08,0x20,0x9A,0x5E, + 0x59,0x5E,0x18,0x5E,0xFF,0xF7,0x16,0xFB,0x01,0x00,0x30,0x00,0xFF,0xF7,0x0E,0xFB, + 0x00,0x21,0x40,0xAB,0x59,0x5E,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42, + 0x05,0xDD,0x08,0x1A,0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x07,0x90,0x9D,0x48, + 0xFF,0x21,0xC0,0x88,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20, + 0x07,0x90,0x68,0x98,0x04,0x26,0x14,0x90,0x66,0x98,0x13,0x90,0x06,0x98,0x80,0x07, + 0x42,0xD5,0x00,0x2C,0x1E,0xD1,0x0A,0x20,0x70,0x43,0x3A,0xA9,0x47,0x18,0x04,0x21, + 0x79,0x5E,0x06,0x20,0x64,0x22,0x5B,0x91,0x38,0x5E,0x49,0x1C,0x50,0x43,0xFB,0xF7, + 0xE7,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x03,0x9A, + 0x5B,0x98,0x51,0x43,0x48,0x43,0x02,0xF0,0x25,0xFE,0x02,0x20,0x38,0x5E,0x88,0x42, + 0x00,0xDA,0x79,0x80,0x14,0x98,0x84,0x42,0x1E,0xD1,0x0A,0x20,0x70,0x43,0x3A,0xA9, + 0x47,0x18,0x04,0x21,0x79,0x5E,0x02,0x20,0x64,0x22,0x5A,0x91,0x38,0x5E,0x49,0x1C, + 0x50,0x43,0xFB,0xF7,0xC5,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5, + 0x00,0x21,0x02,0x9A,0x5A,0x98,0x51,0x43,0x48,0x43,0x02,0xF0,0x03,0xFE,0x06,0x20, + 0x38,0x5E,0x88,0x42,0x00,0xDA,0xF9,0x80,0x06,0x98,0xC0,0x07,0x40,0xD0,0x00,0x2D, + 0x1D,0xD1,0x70,0x00,0x3A,0xA9,0x47,0x18,0x14,0x21,0x79,0x5E,0x1E,0x20,0x64,0x22, + 0x59,0x91,0x38,0x5E,0x49,0x1C,0x50,0x43,0xFB,0xF7,0xA2,0xFC,0x64,0x21,0x08,0x1A, + 0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x05,0x9A,0x59,0x98,0x51,0x43,0x48,0x43, + 0x02,0xF0,0xE0,0xFD,0x0A,0x20,0x38,0x5E,0x88,0x42,0x00,0xDA,0x79,0x81,0x13,0x98, + 0x85,0x42,0x1D,0xD1,0x70,0x00,0x3A,0xA9,0x47,0x18,0x14,0x21,0x79,0x5E,0x0A,0x20, + 0x64,0x22,0x58,0x91,0x38,0x5E,0x49,0x1C,0x50,0x43,0xFB,0xF7,0x81,0xFC,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x04,0x9A,0x58,0x98,0x51,0x43, + 0x48,0x43,0x02,0xF0,0xBF,0xFD,0x1E,0x20,0x38,0x5E,0x88,0x42,0x00,0xDA,0xF9,0x83, + 0x76,0x1E,0x36,0x04,0x36,0x14,0x00,0xD4,0x70,0xE7,0x06,0x98,0x00,0x26,0x80,0x07, + 0x00,0xD5,0xF0,0x26,0x06,0x98,0xC0,0x07,0x01,0xD0,0x3C,0x20,0x06,0x43,0xB0,0x09, + 0x1F,0xD0,0x14,0x98,0x84,0x42,0x1C,0xD1,0x00,0x2D,0x1A,0xD1,0x40,0xAB,0x08,0x20, + 0x18,0x5E,0x64,0x22,0x5F,0x5F,0x50,0x43,0x79,0x1C,0xFB,0xF7,0x51,0xFC,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x02,0x9A,0x38,0x00,0x51,0x43, + 0x48,0x43,0x02,0xF0,0x8F,0xFD,0x38,0x20,0x30,0xAB,0x18,0x5E,0x88,0x42,0x00,0xDA, + 0x19,0x87,0xB0,0x06,0x80,0x0F,0x22,0xD0,0x14,0x98,0x84,0x42,0x1F,0xD1,0x13,0x98, + 0x85,0x42,0x1C,0xD1,0x00,0x27,0x40,0xAB,0xDF,0x5F,0x34,0x20,0x30,0xAB,0x18,0x5E, + 0x64,0x22,0x79,0x1C,0x50,0x43,0xFB,0xF7,0x2B,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04, + 0x09,0x14,0x00,0xD5,0x00,0x21,0x02,0x9A,0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0, + 0x69,0xFD,0x0C,0x20,0x40,0xAB,0x18,0x5E,0x88,0x42,0x00,0xDA,0x99,0x81,0x30,0x07, + 0x80,0x0F,0x20,0xD0,0x13,0x98,0x85,0x42,0x1D,0xD1,0x00,0x2C,0x1B,0xD1,0x40,0xAB, + 0x1E,0x5F,0x38,0x20,0x30,0xAB,0x18,0x5E,0x64,0x22,0x71,0x1C,0x50,0x43,0xFB,0xF7, + 0x07,0xFC,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x04,0x9A, + 0x30,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0x45,0xFD,0x08,0x20,0x40,0xAB,0x18,0x5E, + 0x88,0x42,0x00,0xDA,0x19,0x81,0x12,0x48,0x04,0x27,0x06,0x68,0x40,0x36,0xB0,0x78, + 0x80,0x06,0x31,0xD5,0x00,0x2C,0x2F,0xD1,0x0A,0x20,0x78,0x43,0x3A,0xA9,0x40,0x18, + 0x57,0x90,0x04,0x21,0x06,0x22,0x41,0x5E,0x82,0x5E,0x64,0x20,0x49,0x1C,0x50,0x43, + 0x56,0x92,0xFB,0xF7,0xDD,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5, + 0x00,0x21,0x09,0xE0,0xD2,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0x21,0x07,0x00,0x20, + 0xCC,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x72,0x79,0x56,0x98,0x50,0x43,0x48,0x43, + 0x02,0xF0,0x10,0xFD,0x56,0x98,0x40,0x1A,0x57,0x99,0x00,0x04,0x00,0x14,0xC8,0x80, + 0x02,0xD5,0x57,0x99,0x00,0x20,0xC8,0x80,0xB0,0x78,0xC0,0x06,0x24,0xD5,0x01,0x2C, + 0x22,0xD1,0x0A,0x20,0x78,0x43,0x3A,0xA9,0x40,0x18,0x72,0x79,0x06,0x21,0x55,0x90, + 0x41,0x5E,0x4A,0x43,0x04,0x21,0x41,0x5E,0x10,0x00,0x49,0x1C,0xFB,0xF7,0xA8,0xFB, + 0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x55,0x9A,0x02,0x20, + 0x10,0x5E,0x48,0x43,0x02,0xF0,0xD4,0xFC,0x08,0x04,0x55,0x99,0x00,0x14,0x48,0x80, + 0x02,0xD5,0x55,0x99,0x00,0x20,0x48,0x80,0xB0,0x78,0x40,0x06,0x25,0xD5,0x69,0x98, + 0xA0,0x42,0x22,0xD1,0x0A,0x20,0x78,0x43,0x3A,0xA9,0x40,0x18,0xB2,0x79,0x02,0x21, + 0x54,0x90,0x41,0x5E,0x4A,0x43,0x04,0x21,0x41,0x5E,0x10,0x00,0x49,0x1C,0xFB,0xF7, + 0x7F,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x54,0x9A, + 0x06,0x20,0x10,0x5E,0x48,0x43,0x02,0xF0,0xAB,0xFC,0x08,0x04,0x54,0x99,0x00,0x14, + 0xC8,0x80,0x02,0xD5,0x54,0x99,0x00,0x20,0xC8,0x80,0xB0,0x78,0x00,0x06,0x27,0xD5, + 0x68,0x98,0xA0,0x42,0x24,0xD1,0x0A,0x20,0x78,0x43,0x3A,0xA9,0x40,0x18,0x53,0x90, + 0x04,0x21,0x02,0x22,0x41,0x5E,0x82,0x5E,0x64,0x20,0x49,0x1C,0x50,0x43,0x52,0x92, + 0xFB,0xF7,0x56,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21, + 0xB2,0x79,0x52,0x98,0x50,0x43,0x48,0x43,0x02,0xF0,0x94,0xFC,0x52,0x98,0x40,0x1A, + 0x53,0x99,0x00,0x04,0x00,0x14,0x48,0x80,0x02,0xD5,0x53,0x99,0x00,0x20,0x48,0x80, + 0xB0,0x78,0x80,0x07,0x25,0xD5,0x00,0x2D,0x23,0xD1,0x79,0x00,0x3A,0xA8,0x08,0x18, + 0x51,0x90,0x14,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x64,0x20,0x49,0x1C,0x50,0x43, + 0x50,0x92,0xFB,0xF7,0x2D,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5, + 0x00,0x21,0xF2,0x78,0x50,0x98,0x50,0x43,0x48,0x43,0x02,0xF0,0x6B,0xFC,0x50,0x98, + 0x40,0x1A,0x51,0x99,0x00,0x04,0x00,0x14,0xC8,0x83,0x02,0xD5,0x51,0x99,0x00,0x20, + 0xC8,0x83,0xB0,0x78,0x00,0xE0,0x59,0xE2,0xC0,0x07,0x23,0xD0,0x01,0x2D,0x21,0xD1, + 0x79,0x00,0x3A,0xA8,0x08,0x18,0xF2,0x78,0x1E,0x21,0x4F,0x90,0x41,0x5E,0x4A,0x43, + 0x14,0x21,0x41,0x5E,0x10,0x00,0x49,0x1C,0xFB,0xF7,0x02,0xFB,0x64,0x21,0x08,0x1A, + 0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x4F,0x9A,0x0A,0x20,0x10,0x5E,0x48,0x43, + 0x02,0xF0,0x2E,0xFC,0x08,0x04,0x4F,0x99,0x00,0x14,0x48,0x81,0x02,0xD5,0x4F,0x99, + 0x00,0x20,0x48,0x81,0xB0,0x78,0x40,0x07,0x24,0xD5,0x67,0x98,0xA8,0x42,0x21,0xD1, + 0x78,0x00,0x3A,0xA9,0x40,0x18,0x32,0x79,0x0A,0x21,0x4E,0x90,0x41,0x5E,0x4A,0x43, + 0x14,0x21,0x41,0x5E,0x10,0x00,0x49,0x1C,0xFB,0xF7,0xDA,0xFA,0x64,0x21,0x08,0x1A, + 0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x4E,0x9A,0x1E,0x20,0x10,0x5E,0x48,0x43, + 0x02,0xF0,0x06,0xFC,0x08,0x04,0x4E,0x99,0x00,0x14,0xC8,0x83,0x02,0xD5,0x4E,0x99, + 0x00,0x20,0xC8,0x83,0xB0,0x78,0x00,0x07,0x26,0xD5,0x66,0x98,0xA8,0x42,0x23,0xD1, + 0x78,0x00,0x3A,0xA9,0x40,0x18,0x4D,0x90,0x14,0x21,0x0A,0x22,0x41,0x5E,0x82,0x5E, + 0x64,0x20,0x49,0x1C,0x50,0x43,0x4C,0x92,0xFB,0xF7,0xB2,0xFA,0x64,0x21,0x08,0x1A, + 0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x32,0x79,0x4C,0x98,0x50,0x43,0x48,0x43, + 0x02,0xF0,0xF0,0xFB,0x4C,0x98,0x40,0x1A,0x4D,0x99,0x00,0x04,0x00,0x14,0x48,0x81, + 0x02,0xD5,0x4D,0x99,0x00,0x20,0x48,0x81,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0x00,0xD4, + 0xA5,0xE6,0x08,0x98,0x00,0x28,0x2C,0xD0,0x09,0x98,0xC0,0x07,0x16,0xD0,0x04,0x20, + 0x00,0x22,0x3A,0xAE,0x08,0x99,0x09,0x04,0x06,0xD0,0x0A,0x23,0x01,0x00,0x59,0x43, + 0x72,0x52,0x89,0x19,0x4A,0x80,0x04,0xE0,0x0A,0x21,0x41,0x43,0x89,0x19,0xCA,0x80, + 0x0A,0x81,0x40,0x1E,0x00,0x04,0x00,0x14,0xEC,0xD5,0x12,0xE0,0x04,0x20,0x00,0x22, + 0x3A,0xAE,0x08,0x99,0x09,0x04,0x04,0xD0,0x41,0x00,0x72,0x52,0x89,0x19,0x4A,0x81, + 0x03,0xE0,0x41,0x00,0x89,0x19,0xCA,0x83,0x0A,0x85,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xEF,0xD5,0x00,0x26,0x37,0x00,0xE9,0x19,0x4B,0x91,0x00,0x20,0x49,0x1E,0x0E,0x22, + 0x51,0x43,0x8C,0x46,0x4B,0x9A,0x21,0x18,0x52,0x1E,0x49,0x1E,0x00,0x2A,0x0C,0xDB, + 0x15,0x2A,0x0A,0xDC,0x00,0x29,0x08,0xDB,0x0E,0x29,0x06,0xDC,0xF9,0x4A,0x61,0x44, + 0x49,0x00,0x51,0x5E,0xB1,0x42,0x00,0xDD,0x0E,0x00,0x40,0x1C,0x00,0x04,0x00,0x14, + 0x03,0x28,0xE7,0xDB,0x7F,0x1C,0x3F,0x04,0x3F,0x14,0x03,0x2F,0xDB,0xDB,0xF2,0x49, + 0x30,0x04,0x0A,0x89,0x00,0x14,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42, + 0x00,0xDA,0x48,0x81,0xEC,0x49,0x20,0xAB,0x08,0x79,0x26,0x22,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x08,0x71,0x80,0x00,0x40,0x18,0xFF,0x30,0x21,0x30,0x84,0x80,0x08,0x79, + 0x80,0x00,0x40,0x18,0xFF,0x30,0x21,0x30,0xC5,0x80,0x28,0x20,0x9A,0x5E,0x18,0x5E, + 0x00,0x21,0x82,0x42,0x07,0xDC,0x20,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC,0x2C,0x22, + 0x9A,0x5E,0x82,0x42,0x00,0xDD,0xC0,0x21,0x2A,0x22,0x20,0xAB,0x9A,0x5E,0x82,0x42, + 0x07,0xDC,0x24,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC,0x30,0x22,0x9A,0x5E,0x82,0x42, + 0x01,0xDD,0x30,0x22,0x11,0x43,0x22,0x22,0x20,0xAB,0x9A,0x5E,0x82,0x42,0x07,0xDC, + 0x20,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC,0x24,0x22,0x9A,0x5E,0x82,0x42,0x01,0xDD, + 0x0C,0x22,0x11,0x43,0x2E,0x22,0x20,0xAB,0x9A,0x5E,0x82,0x42,0x07,0xDC,0x2C,0x22, + 0x9A,0x5E,0x82,0x42,0x03,0xDC,0x30,0x22,0x9A,0x5E,0x82,0x42,0x01,0xDD,0x03,0x20, + 0x01,0x43,0x8F,0x06,0x0A,0x07,0x04,0x20,0x94,0x46,0x00,0x22,0x8B,0x09,0x04,0xD1, + 0x0A,0x26,0x03,0x00,0x73,0x43,0x3A,0xAE,0xF2,0x52,0xBB,0x0F,0x05,0xD1,0x0A,0x26, + 0x03,0x00,0x73,0x43,0x3A,0xAE,0x9B,0x19,0x1A,0x81,0x63,0x46,0x9B,0x0F,0x02,0xD1, + 0x43,0x00,0x3A,0xAE,0xF2,0x52,0x8B,0x07,0x03,0xD1,0x43,0x00,0x3A,0xAE,0x9B,0x19, + 0x1A,0x85,0x40,0x1E,0x00,0x04,0x00,0x14,0xE0,0xD5,0x30,0x22,0x30,0xAB,0x9A,0x5E, + 0x2E,0x26,0x2A,0x21,0x00,0x92,0x9E,0x5F,0x2C,0x22,0x28,0x20,0x9A,0x5E,0x59,0x5E, + 0x18,0x5E,0x33,0x00,0x01,0xF0,0x3F,0xFA,0x3A,0x22,0x30,0xAB,0x19,0x90,0x9A,0x5E, + 0x38,0x26,0x34,0x21,0x00,0x92,0x9E,0x5F,0x36,0x22,0x32,0x20,0x9A,0x5E,0x59,0x5E, + 0x18,0x5E,0x33,0x00,0x01,0xF0,0x2F,0xFA,0x04,0x22,0x40,0xAB,0x18,0x90,0x9A,0x5E, + 0x02,0x26,0x3E,0x21,0x00,0x92,0x00,0x22,0x9E,0x5F,0x9A,0x5E,0x30,0xAB,0x3C,0x20, + 0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x1E,0xFA,0x0E,0x22,0x40,0xAB,0x17,0x90, + 0x9A,0x5E,0x0C,0x26,0x08,0x21,0x00,0x92,0x9E,0x5F,0x0A,0x22,0x06,0x20,0x9A,0x5E, + 0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x0E,0xFA,0x18,0x22,0x40,0xAB,0x16,0x90, + 0x9A,0x5E,0x16,0x26,0x12,0x21,0x00,0x92,0x9E,0x5F,0x14,0x22,0x10,0x20,0x9A,0x5E, + 0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0xFE,0xF9,0x15,0x90,0x00,0x90,0x16,0x9B, + 0x17,0x9A,0x18,0x99,0x19,0x98,0x01,0xF0,0xF6,0xF9,0x00,0x28,0x1A,0x90,0x09,0xD1, + 0x32,0x22,0x00,0x21,0x3A,0xA8,0x00,0xF0,0x35,0xFA,0x0A,0x20,0x40,0xAB,0x17,0x90, + 0x18,0x80,0x1A,0x90,0x10,0x22,0x40,0xAB,0x9A,0x5E,0x06,0x26,0x32,0x21,0x00,0x92, + 0x9E,0x5F,0x30,0xAB,0x3C,0x22,0x28,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00, + 0x01,0xF0,0xD9,0xF9,0x78,0x4A,0x61,0x00,0x8E,0x18,0xF1,0x8B,0x12,0x22,0x40,0xAB, + 0x48,0x43,0x14,0x90,0x9A,0x5E,0x08,0x27,0x34,0x21,0x00,0x92,0xDF,0x5F,0x30,0xAB, + 0x3E,0x22,0x2A,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x3B,0x00,0x01,0xF0,0xC3,0xF9, + 0x31,0x8C,0x14,0x22,0x40,0xAB,0x48,0x43,0x13,0x90,0x9A,0x5E,0x0A,0x27,0x36,0x21, + 0x00,0x92,0x00,0x22,0xDF,0x5F,0x9A,0x5E,0x30,0xAB,0x2C,0x20,0x59,0x5E,0x18,0x5E, + 0x3B,0x00,0x01,0xF0,0xB0,0xF9,0x71,0x8C,0x16,0x22,0x40,0xAB,0x48,0x43,0x12,0x90, + 0x9A,0x5E,0x0C,0x27,0x38,0x21,0x00,0x92,0x02,0x22,0xDF,0x5F,0x9A,0x5E,0x30,0xAB, + 0x2E,0x20,0x59,0x5E,0x18,0x5E,0x3B,0x00,0x01,0xF0,0x9D,0xF9,0xB1,0x8C,0x07,0x00, + 0x18,0x22,0x4F,0x43,0x40,0xAB,0x11,0x97,0x9A,0x5E,0x0E,0x27,0x3A,0x21,0x00,0x92, + 0x04,0x22,0xDF,0x5F,0x9A,0x5E,0x30,0xAB,0x30,0x20,0x59,0x5E,0x18,0x5E,0x3B,0x00, + 0x01,0xF0,0x89,0xF9,0xF1,0x8C,0x11,0x9B,0x12,0x9A,0x48,0x43,0x00,0x90,0x13,0x99, + 0x14,0x98,0x01,0xF0,0x80,0xF9,0x1A,0x99,0xFB,0xF7,0xF2,0xF8,0x4A,0x49,0x09,0x8C, + 0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20,0x47,0x4F,0x39,0x79,0x49,0x00,0xC9,0x19, + 0xE0,0x31,0x88,0x82,0x63,0x98,0x19,0x99,0x40,0x8A,0x18,0x9A,0x17,0x9B,0x48,0x43, + 0x63,0x99,0x89,0x8A,0x51,0x43,0x63,0x9A,0xD2,0x8A,0x5A,0x43,0x94,0x46,0x63,0x9A, + 0x15,0x9B,0x16,0x8B,0x16,0x9A,0x56,0x43,0x63,0x9A,0x52,0x8B,0x5A,0x43,0x00,0x92, + 0x33,0x00,0x62,0x46,0x01,0xF0,0x57,0xF9,0x1A,0x99,0xFB,0xF7,0xC9,0xF8,0x65,0x99, + 0x89,0x8A,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20,0x39,0x79,0x49,0x00,0xC9,0x19, + 0xFF,0x31,0x01,0x31,0xC8,0x81,0x38,0x79,0x0C,0x28,0x10,0xD2,0x64,0x1C,0x24,0x04, + 0x24,0x14,0x0E,0x2C,0x01,0xDA,0xFF,0xF7,0x86,0xF9,0x0E,0x98,0x00,0x28,0x06,0xD1, + 0x6D,0x1C,0x2D,0x04,0x2D,0x14,0x15,0x2D,0x01,0xDA,0xFF,0xF7,0x73,0xF9,0x27,0x48, + 0x04,0x68,0x20,0x88,0x00,0x06,0x52,0xD5,0x23,0x4A,0x10,0x79,0x00,0x28,0x6F,0x98, + 0x0C,0xD1,0x00,0x89,0x00,0x28,0x43,0xD0,0x6F,0x98,0x20,0x34,0x40,0x79,0x21,0x7F, + 0x88,0x42,0x3D,0xD2,0x6F,0x99,0x40,0x1C,0x48,0x71,0x40,0xE0,0x25,0x00,0x20,0x35, + 0x80,0x79,0x29,0x7D,0x88,0x42,0x29,0xD8,0x40,0x1C,0x6F,0x99,0x00,0x06,0x00,0x0E, + 0x88,0x71,0x69,0x7D,0x81,0x42,0x03,0xD2,0x92,0x89,0x0B,0x9B,0xD2,0x18,0x0B,0x92, + 0x2A,0x7D,0x90,0x42,0x1A,0xD1,0x88,0x42,0x18,0xD0,0x41,0x1A,0x0B,0x98,0xFB,0xF7, + 0xA7,0xF9,0x6F,0x9A,0x00,0x21,0x11,0x81,0x21,0x8F,0x81,0x42,0x0E,0xD2,0x0C,0x99, + 0x40,0x1A,0xA9,0x7D,0x48,0x43,0x02,0xF0,0xD7,0xF9,0x08,0x04,0x6F,0x99,0x00,0x0C, + 0x08,0x81,0x61,0x8F,0x88,0x42,0x01,0xD9,0x6F,0x98,0x01,0x81,0x6F,0x98,0x00,0x21, + 0x41,0x71,0x0C,0xE0,0x00,0x00,0x00,0x10,0x40,0x00,0x00,0x20,0xCC,0x07,0x00,0x20, + 0x6F,0x99,0x00,0x20,0x88,0x71,0x6F,0x99,0x48,0x71,0x6F,0x99,0x08,0x81,0x00,0x20, + 0x84,0x46,0x09,0x90,0x67,0x48,0x01,0x22,0x00,0x79,0x01,0x28,0x4A,0x90,0x4E,0xDB, + 0x6E,0x98,0xC0,0x7B,0x49,0x90,0x63,0x49,0x50,0x00,0x40,0x18,0xF4,0x23,0x1B,0x5A, + 0x61,0x4C,0xFF,0x30,0x63,0x43,0x01,0x30,0xC0,0x89,0xDD,0x0C,0x23,0x00,0x58,0x43, + 0xC6,0x0C,0x49,0x9B,0x00,0x20,0x00,0x2B,0x09,0x90,0x32,0xDD,0x14,0x06,0x59,0x4B, + 0x24,0x0E,0x91,0x00,0x48,0x94,0xCC,0x18,0xFF,0x34,0x21,0x34,0x55,0x49,0xC3,0x00, + 0x59,0x18,0x03,0x23,0x5B,0x02,0xC9,0x18,0x10,0x27,0xCF,0x5F,0xAF,0x42,0x1A,0xDC, + 0x14,0x27,0xCF,0x5F,0xAF,0x42,0x16,0xDB,0x12,0x27,0xCF,0x5F,0xB7,0x42,0x12,0xDC, + 0x16,0x27,0xCF,0x5F,0xB7,0x42,0x0E,0xDB,0x06,0x21,0x61,0x5E,0x0E,0x23,0x59,0x43, + 0x04,0x23,0xE3,0x5E,0xC9,0x18,0x4B,0x00,0x48,0x49,0xC9,0x5E,0x61,0x45,0x02,0xDD, + 0x8C,0x46,0x48,0x99,0x09,0x91,0x40,0x1C,0x49,0x99,0x00,0x04,0x00,0x14,0x81,0x42, + 0xD4,0xDC,0x52,0x1C,0x4A,0x98,0x12,0x04,0x12,0x14,0x90,0x42,0xB3,0xDA,0x3D,0x48, + 0x41,0x89,0x05,0x00,0x28,0x00,0xF4,0x30,0x04,0x00,0x1A,0x34,0xAD,0x1C,0x47,0x94, + 0x2C,0x00,0xFF,0x35,0xE0,0x34,0x01,0x35,0x61,0x45,0x19,0xDC,0x09,0x99,0x00,0x29, + 0x16,0xD0,0x34,0x4A,0x49,0x00,0x89,0x18,0xF4,0x22,0x56,0x5A,0xFF,0x31,0x01,0x31, + 0xCF,0x89,0x1A,0x22,0x00,0x21,0x00,0xF0,0xAD,0xF8,0x47,0x98,0x1A,0x22,0x00,0x21, + 0x00,0xF0,0xA8,0xF8,0x2B,0x49,0x01,0x20,0x08,0x71,0xA6,0x82,0xEF,0x81,0x22,0xE0, + 0x28,0x49,0x4A,0x79,0x00,0x2A,0x1E,0xD1,0x4A,0x9A,0x01,0x2A,0x1B,0xD9,0x71,0x9A, + 0x92,0x7A,0x00,0x2A,0x17,0xD1,0x0F,0x9A,0x00,0x2A,0x14,0xD0,0x52,0x00,0x51,0x18, + 0xF4,0x22,0x56,0x5A,0xFF,0x31,0x01,0x31,0xCF,0x89,0x1A,0x22,0x00,0x21,0x00,0xF0, + 0x89,0xF8,0x47,0x98,0x1A,0x22,0x00,0x21,0x00,0xF0,0x84,0xF8,0x19,0x49,0x01,0x20, + 0x08,0x71,0xA6,0x82,0xEF,0x81,0x6E,0x98,0xC0,0x7A,0x00,0x28,0x0D,0xD0,0x15,0x48, + 0x00,0x21,0x01,0x71,0x6E,0x98,0x16,0x4A,0x00,0x7B,0x92,0x7F,0x90,0x42,0x01,0xD3, + 0x6E,0x9A,0xD1,0x72,0x6E,0x99,0x40,0x1C,0x08,0x73,0x07,0x98,0x00,0x28,0x0E,0xD0, + 0x0C,0x48,0x00,0x79,0x00,0x28,0x0A,0xD0,0x0E,0x49,0x70,0x98,0x49,0x89,0xC0,0x68, + 0x0A,0x31,0x88,0x42,0x06,0xDA,0x70,0x99,0x40,0x1C,0xC8,0x60,0x02,0xE0,0x70,0x98, + 0x00,0x21,0xC1,0x60,0x03,0x48,0x01,0x79,0x41,0x71,0x73,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xCD,0xCC,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x93,0x00,0x00,0x80,0x95,0x00,0x00,0x78,0x47,0xC0,0x46,0x41,0x11,0xA0,0xE1, + 0x01,0x10,0x51,0xE2,0x1E,0xFF,0x2F,0x31,0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2, + 0x04,0x20,0x80,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2, + 0x01,0x30,0xC0,0xE4,0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0, + 0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0,0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2,0x01,0x10,0xC0,0xE4,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2,0x04,0x10,0x80,0xE4,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x0F,0x48,0x0F,0x49,0x00,0x89,0x49,0x88,0x00,0x24, + 0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29,0x02,0xD0,0x0D,0x49,0x49,0x89,0x02,0xE0, + 0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18,0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C, + 0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7,0x27,0xFC,0x20,0x00,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x01,0x00,0x20,0x00,0x07,0x00,0x20,0x20,0x07,0x00,0x20, + 0xA0,0x95,0x00,0x00,0xCC,0x07,0x00,0x20,0xC0,0x90,0x00,0x40,0xF7,0xB5,0x24,0x4E, + 0x82,0xB0,0xB0,0x7F,0xF1,0x7F,0x00,0x02,0x08,0x43,0x01,0xF0,0xF1,0xFC,0x30,0x00, + 0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x1E,0x48,0x01,0x78,0x1E,0x48,0x00,0x7F, + 0x00,0x29,0x02,0xD0,0x01,0xF0,0x94,0xFC,0x01,0xE0,0x01,0xF0,0xB9,0xFC,0x18,0x49, + 0x01,0x25,0x20,0x39,0x08,0x00,0xC0,0x30,0x01,0x90,0x05,0x20,0xC0,0x01,0x17,0x4F, + 0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62,0x01,0x98,0x80,0x68,0x38,0x62,0x00,0x98, + 0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFB,0xF7,0x0F,0xFE,0x64,0x1E, + 0xF9,0xD5,0x01,0x20,0xF8,0x62,0x30,0x7F,0x01,0x00,0xFB,0xF7,0x7D,0xFE,0x01,0x24, + 0x02,0xA8,0x07,0xC8,0xFE,0xF7,0x76,0xFB,0x00,0x28,0x01,0xD1,0x00,0x24,0x25,0x00, + 0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x20,0x93,0x00,0x00,0x18,0x07,0x00,0x20,0x60,0x06,0x00,0x20,0x80,0x90,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x00,0x00,0xA0,0xE3,0x73,0xDF,0x4D,0xE2, + 0xB8,0x01,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x24,0x00,0x8D,0xE5, + 0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5,0x14,0x00,0x8D,0xE5,0x00,0x50,0xA0,0xE1, + 0x00,0x70,0xA0,0xE1,0x00,0x80,0xA0,0xE1,0x00,0x90,0xA0,0xE1,0x00,0xA0,0xA0,0xE1, + 0x00,0x10,0xA0,0xE1,0x20,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x04,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5,0x7C,0x06,0x9F,0xE5,0x7C,0x46,0x9F,0xE5, + 0xC8,0x01,0x8D,0xE5,0xB0,0x1C,0xC0,0xE1,0xC8,0x01,0x9D,0xE5,0x30,0x20,0xA0,0xE3, + 0xB2,0x1C,0xC0,0xE1,0xC8,0x01,0x9D,0xE5,0xB4,0x1C,0xC0,0xE1,0x00,0x10,0xA0,0xE3, + 0x88,0x00,0x84,0xE2,0x8F,0xFF,0xFF,0xEB,0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0xB8,0x00,0x84,0xE2,0x8B,0xFF,0xFF,0xEB,0x00,0x60,0xA0,0xE3,0x60,0x10,0xA0,0xE3, + 0x15,0x0E,0x8D,0xE2,0xB8,0x6E,0xC4,0xE1,0x63,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3, + 0xF0,0x00,0x8D,0xE2,0x60,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x90,0x00,0x8D,0xE2, + 0x5D,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x30,0x00,0x8D,0xE2,0x5A,0xFF,0xFF,0xEB, + 0x0C,0x06,0x9F,0xE5,0x0C,0x16,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0xC4,0x11,0x8D,0xE5, + 0x00,0x00,0x50,0xE3,0x03,0x00,0x00,0x0A,0xF8,0x0A,0xD1,0xE1,0xB4,0x01,0x8D,0xE5, + 0xB6,0x0A,0xD1,0xE1,0x04,0x00,0x00,0xEA,0xEC,0x05,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xF6,0x12,0xD0,0xE1,0xB4,0x11,0x8D,0xE5,0xB4,0x02,0xD0,0xE1,0x01,0x18,0xE0,0xE3, + 0xB0,0x01,0x8D,0xE5,0xC4,0x05,0x9F,0xE5,0xB6,0x00,0xD0,0xE1,0x40,0x00,0x10,0xE3, + 0xC4,0x01,0x9D,0xE5,0xB0,0xB8,0xD0,0x01,0xB0,0x08,0xD0,0x11,0x80,0xB0,0x01,0x10, + 0x8B,0x00,0x01,0xE0,0x0C,0x00,0x8D,0xE5,0x00,0x00,0xA0,0xE3,0xAC,0x15,0x9F,0xE5, + 0x00,0x30,0xA0,0xE1,0x00,0x20,0xA0,0xE1,0x00,0x00,0xC1,0xE5,0x00,0x10,0xA0,0xE3, + 0x9C,0x05,0x9F,0xE5,0x9C,0xC5,0x9F,0xE5,0x83,0x00,0x80,0xE0,0xC0,0x01,0x8D,0xE5, + 0xB0,0x00,0xD0,0xE1,0x83,0xC0,0x8C,0xE0,0xB0,0xC0,0xDC,0xE1,0x00,0x0A,0xA0,0xE1, + 0x20,0x0A,0xA0,0xE1,0x0F,0xCA,0xCC,0xE3,0x0C,0x40,0x40,0xE0,0x06,0x00,0x54,0xE1, + 0x04,0x60,0xA0,0xC1,0x2C,0x10,0x8D,0xC5,0x28,0x20,0x8D,0xC5,0xC8,0x00,0x54,0xE3, + 0x00,0x00,0x4C,0xE0,0x01,0xA0,0x8A,0xC2,0x96,0x00,0x50,0xE3,0x04,0xC0,0x9D,0xC5, + 0x01,0x30,0x83,0xE2,0x01,0xC0,0x8C,0xC2,0x04,0xC0,0x8D,0xC5,0x19,0x0E,0x54,0xE3, + 0x00,0xC0,0x9D,0xC5,0x01,0xC0,0x8C,0xC2,0x00,0xC0,0x8D,0xC5,0xF0,0xC0,0x8D,0xE2, + 0x01,0xE1,0x9C,0xE7,0x00,0x00,0x54,0xE3,0x00,0x40,0xA0,0xB3,0x04,0xE0,0x8E,0xE0, + 0x01,0xE1,0x8C,0xE7,0x15,0xCE,0x8D,0xE2,0x02,0xE1,0x9C,0xE7,0x00,0x00,0x50,0xE3, + 0x04,0xE0,0x8E,0xE0,0x02,0xE1,0x8C,0xE7,0x30,0xC0,0x8D,0xE2,0x01,0xE1,0x9C,0xE7, + 0x00,0x00,0xA0,0xB3,0x00,0xE0,0x8E,0xE0,0x01,0xE1,0x8C,0xE7,0x90,0xC0,0x8D,0xE2, + 0x02,0xE1,0x9C,0xE7,0x0B,0x00,0x50,0xE1,0x00,0xE0,0x8E,0xE0,0x02,0xE1,0x8C,0xE7, + 0x01,0xC0,0x85,0xC2,0x01,0x58,0xCC,0xC3,0x0B,0x00,0x54,0xE1,0x01,0xC0,0x87,0xC2, + 0x01,0x78,0xCC,0xC3,0x0C,0xC0,0x9D,0xE5,0x01,0x10,0x81,0xE2,0x0C,0x00,0x50,0xE1, + 0x01,0xC0,0x88,0xC2,0x01,0x88,0xCC,0xC3,0x0C,0xC0,0x9D,0xE5,0x0C,0x00,0x54,0xE1, + 0x01,0xC0,0x89,0xC2,0x01,0x98,0xCC,0xC3,0x08,0xC0,0x9D,0xE5,0x0E,0x00,0x51,0xE3, + 0x0C,0x00,0x80,0xE0,0x08,0x00,0x8D,0xE5,0xC0,0x01,0x9D,0xE5,0xB0,0x40,0xC0,0xE1, + 0xB4,0x01,0x9D,0xE5,0xB8,0xC1,0x9D,0xE5,0x04,0x00,0x80,0xE0,0x0C,0x00,0x80,0xE0, + 0xB8,0x01,0x8D,0xE5,0xB5,0xFF,0xFF,0x3A,0x01,0x20,0x82,0xE2,0x15,0x00,0x52,0xE3, + 0xB1,0xFF,0xFF,0x3A,0x70,0xC4,0x9F,0xE5,0x64,0x44,0x9F,0xE5,0x01,0xEA,0xA0,0xE3, + 0x0E,0x00,0x43,0xE2,0x00,0x10,0xA0,0xE3,0x01,0xE0,0x4E,0xE2,0x80,0x20,0x84,0xE0, + 0xF0,0x30,0xD2,0xE1,0x01,0x10,0x81,0xE2,0x01,0x00,0x80,0xE2,0x03,0x31,0x83,0xE0, + 0x03,0x32,0xA0,0xE1,0x9C,0xB3,0xC3,0xE0,0xC3,0xB2,0xA0,0xE1,0xC3,0x3F,0x4B,0xE0, + 0x01,0x0A,0x53,0xE3,0x0E,0x30,0xA0,0xA1,0x0E,0x00,0x51,0xE3,0xB0,0x30,0xC2,0xE1, + 0xF1,0xFF,0xFF,0x3A,0xC8,0x01,0x9D,0xE5,0xB0,0xAC,0xC0,0xE1,0x04,0x00,0x9D,0xE5, + 0xC8,0x11,0x9D,0xE5,0xB2,0x0C,0xC1,0xE1,0xC8,0x01,0x9D,0xE5,0x00,0x10,0x9D,0xE5, + 0xB4,0x1C,0xC0,0xE1,0x24,0xF9,0xFF,0xEB,0xEC,0x03,0x9F,0xE5,0xDC,0xC3,0x9F,0xE5, + 0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xCC,0xE1,0xB0,0x00,0xD4,0xE1, + 0x01,0x00,0x10,0xE3,0x08,0x00,0x00,0x0A,0xB8,0x01,0x9D,0xE5,0xB0,0x11,0x9D,0xE5, + 0x90,0x01,0x01,0xE0,0xD4,0x03,0x9F,0xE5,0x90,0x21,0x81,0xE0,0x21,0x06,0xA0,0xE1, + 0xB4,0x10,0xD4,0xE1,0x00,0x00,0x51,0xE1,0xBE,0x00,0xCC,0x81,0xC0,0xA3,0x9F,0xE5, + 0x00,0x00,0xA0,0xE3,0x90,0xE0,0x8D,0xE2,0x08,0x20,0xD4,0xE5,0x15,0x1E,0x8D,0xE2, + 0x00,0x11,0x91,0xE7,0x92,0x01,0x01,0xE0,0x9A,0x31,0x82,0xE0,0xA2,0x34,0xA0,0xE1, + 0xB0,0x21,0xD4,0xE1,0x02,0x00,0x53,0xE1,0x9A,0x21,0x81,0x90,0x09,0x30,0xD4,0xE5, + 0xA1,0x24,0xA0,0x91,0x00,0x11,0x9E,0xE7,0x91,0x03,0x03,0xE0,0x9A,0xB3,0x81,0xE0, + 0xA1,0xB4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x5B,0xE1,0x9A,0x33,0x81,0x90, + 0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1,0x92,0x01,0x01,0xE0, + 0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0,0x02,0x21,0x82,0xE0, + 0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0,0x80,0x20,0x8C,0xE0, + 0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0xB8,0x18,0xC2,0xE1,0xDD,0xFF,0xFF,0x3A, + 0x30,0x23,0x9F,0xE5,0x00,0xA0,0xA0,0xE3,0xF0,0xB0,0x8D,0xE2,0x0A,0x10,0xD4,0xE5, + 0x0A,0x01,0x9B,0xE7,0x90,0x01,0x01,0xE0,0x92,0x31,0x80,0xE0,0xA0,0x35,0xA0,0xE1, + 0xB4,0x01,0xD4,0xE1,0x00,0x00,0x53,0xE1,0x92,0x11,0x80,0x90,0x0B,0x30,0xD4,0xE5, + 0x30,0x10,0x8D,0xE2,0x0A,0x11,0x91,0xE7,0xA0,0x05,0xA0,0x91,0x91,0x03,0x03,0xE0, + 0x92,0xC3,0x81,0xE0,0xA1,0xC5,0xA0,0xE1,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x5C,0xE1, + 0x92,0x33,0x81,0x90,0xA1,0x15,0xA0,0x91,0x01,0x00,0x40,0xE0,0xBE,0x10,0xD4,0xE1, + 0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0, + 0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0, + 0x88,0x12,0x9F,0xE5,0x8A,0x10,0x81,0xE0,0x01,0xA0,0x8A,0xE2,0x0D,0x00,0x5A,0xE3, + 0xB8,0x0B,0xC1,0xE1,0xDC,0xFF,0xFF,0x3A,0x0A,0x00,0xD4,0xE5,0x0A,0x11,0x9B,0xE7, + 0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x8C,0x12,0x9F,0xE5,0x15,0x10,0xD1,0xE5, + 0x92,0x01,0x01,0xE0,0xBC,0x11,0x8D,0xE5,0xBD,0xEA,0xFF,0xEB,0xB4,0x11,0xD4,0xE1, + 0x01,0x00,0x50,0xE1,0x00,0xB0,0xA0,0x91,0x01,0xB0,0xA0,0x81,0x0B,0x10,0xD4,0xE5, + 0x30,0x00,0x8D,0xE2,0x0A,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0,0xBC,0x11,0x9D,0xE5, + 0xB3,0xEA,0xFF,0xEB,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0x81, + 0xBE,0x10,0xD4,0xE1,0x00,0x00,0x4B,0xE0,0x10,0x42,0x9F,0xE5,0x91,0x00,0x00,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0, + 0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x8A,0x10,0x84,0xE0, + 0x00,0x00,0x56,0xE3,0xB8,0x0B,0xC1,0xE1,0x0C,0x00,0x00,0xDA,0x2C,0x00,0x9D,0xE5, + 0x80,0x00,0x84,0xE0,0xB8,0x1B,0xD0,0xE1,0x28,0x00,0x9D,0xE5,0x80,0x00,0x84,0xE0, + 0xB8,0x08,0xD0,0xE1,0x01,0x00,0x80,0xE0,0x00,0x00,0x46,0xE0,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xB0,0xE1,0xB8,0x0E,0xC4,0xE1,0x00,0x00,0xA0,0x43,0xB8,0x0E,0xC4,0x41, + 0x11,0x10,0xA0,0xE3,0x08,0x00,0x9D,0xE5,0x01,0x1C,0x81,0xE2,0x90,0xEA,0xFF,0xEB, + 0xB6,0x10,0xD4,0xE1,0x40,0x00,0x11,0xE3,0x0E,0x00,0x00,0x0A,0x87,0x00,0x55,0xE1, + 0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83, + 0x1C,0x00,0x8D,0x85,0x23,0x00,0x58,0xE3,0x01,0x00,0xA0,0x83,0x18,0x00,0x8D,0x85, + 0x23,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33,0x14,0x00,0x8D,0x35,0x14,0x00,0x55,0xE3, + 0x11,0x00,0x00,0x9A,0x0E,0x00,0x00,0xEA,0x07,0x00,0x55,0xE1,0x08,0x00,0x55,0x83, + 0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83, + 0x1C,0x00,0x8D,0x85,0x14,0x00,0x58,0xE3,0x01,0x00,0xA0,0x83,0x18,0x00,0x8D,0x85, + 0x14,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33,0x14,0x00,0x8D,0x35,0x0A,0x00,0x55,0xE3, + 0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x10,0x00,0x8D,0xE5,0xF1,0x00,0xD4,0xE5, + 0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0xE5,0x03,0x00,0x00,0x0A,0xFA,0x00,0x50,0xE3, + 0x05,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x02,0x00,0x00,0xEA,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2,0xF2,0x00,0xC4,0xE5,0x1C,0x20,0x8D,0xE2, + 0x05,0x00,0x92,0xE8,0x14,0x30,0x9D,0xE5,0x00,0x20,0x82,0xE1,0x18,0x00,0x9D,0xE5, + 0x10,0x00,0x11,0xE3,0x03,0x00,0x00,0xE0,0x00,0x20,0x82,0xE1,0x10,0x00,0x9D,0x15, + 0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1, + 0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0x15,0x05,0x00,0x50,0x13,0x02,0x00,0x00,0x8A, + 0x24,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xEC,0x00,0x94,0xE5, + 0x01,0x00,0x80,0xE2,0xEC,0x00,0x84,0xE5,0xF0,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x40,0x12,0xF0,0x00,0xC4,0x15,0x0D,0x00,0x00,0xEA,0xF0,0x00,0xD4,0xE5, + 0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0xF0,0x00,0xC4,0xE5,0xC4,0x11,0x9D,0xE5, + 0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1,0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3, + 0xF0,0x00,0xC4,0xE5,0xEC,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2, + 0xEC,0x00,0x84,0xC5,0xF2,0x00,0xD4,0xE5,0x0A,0x00,0x50,0xE3,0x73,0xDF,0x8D,0x22, + 0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21,0xEC,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0xC3,0xEC,0x00,0x84,0xC5,0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC4,0xE5, + 0x73,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x20,0x07,0x00,0x20,0x00,0x95,0x00,0x00,0xCC,0x07,0x00,0x20, + 0x48,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10,0x1F,0x85,0xEB,0x51, + 0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D,0x2D,0x34,0xA9,0xF9,0x00,0x93,0x00,0x00, + 0x10,0xB5,0x16,0x4C,0xA0,0x7B,0x00,0x28,0x07,0xD1,0xFB,0xF7,0xF9,0xFC,0x00,0x28, + 0x0F,0xD0,0xFC,0xF7,0x25,0xFF,0x01,0x20,0x0A,0xE0,0x01,0x28,0x0C,0xD1,0xFB,0xF7, + 0x0B,0xFD,0x00,0x28,0x05,0xD0,0xFC,0xF7,0x8B,0xFB,0x00,0xF0,0x6D,0xFB,0x02,0x20, + 0xA0,0x73,0x10,0xBC,0x08,0xBC,0x18,0x47,0x02,0x28,0x07,0xD1,0xFB,0xF7,0xB8,0xFE, + 0x00,0x28,0xF6,0xD0,0xFC,0xF7,0x7E,0xFD,0x03,0x20,0xF1,0xE7,0x03,0x28,0xF0,0xD1, + 0x03,0x48,0xC0,0x68,0xC0,0x07,0xEC,0xD0,0x04,0x20,0xE9,0xE7,0x14,0x07,0x00,0x20, + 0x00,0x90,0x00,0x40,0xF0,0xB5,0xD9,0x48,0x8B,0xB0,0x00,0x68,0x00,0x27,0x80,0x79, + 0x3D,0x00,0x02,0x90,0xD6,0x48,0x42,0x79,0x04,0x00,0xC0,0x34,0x00,0x92,0x82,0x79, + 0x80,0x30,0x01,0x7B,0xC0,0x38,0xA3,0x7A,0x00,0x7A,0xFE,0xF7,0xC2,0xF8,0x00,0x06, + 0x61,0x7A,0x00,0x0E,0xFE,0xF7,0xB2,0xF8,0x21,0x00,0x20,0x39,0x0A,0x7A,0x00,0x06, + 0xC0,0x39,0x09,0x79,0x00,0x0E,0xFE,0xF7,0xAD,0xF8,0x21,0x00,0x80,0x39,0x8A,0x7D, + 0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E,0xFE,0xF7,0xA4,0xF8,0x00,0x06,0xC5,0x4E, + 0x00,0x0E,0x01,0x90,0x30,0x7B,0xC4,0x4C,0x00,0x28,0x02,0xD0,0xC3,0x48,0x40,0x89, + 0x06,0xE0,0xBE,0x48,0x61,0x88,0x00,0x68,0x40,0x88,0x40,0x18,0x00,0x04,0x00,0x0C, + 0x03,0x90,0x00,0x20,0x70,0x61,0x0F,0x20,0xF0,0x70,0x30,0x7A,0x00,0x28,0x06,0xD0, + 0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x89,0xFB,0x01,0xF0,0x77,0xFB,0x01,0x20, + 0x30,0x62,0xFC,0xF7,0x9F,0xF8,0x00,0xF0,0xB5,0xF9,0xFC,0xF7,0x07,0xFB,0xB4,0x48, + 0x05,0x21,0x09,0x90,0xB3,0x48,0xC9,0x01,0x41,0x18,0x08,0x91,0xB2,0x49,0x80,0x30, + 0x06,0xAA,0x03,0xC2,0x01,0x98,0xC0,0x1C,0x05,0x90,0xB0,0x48,0x04,0x90,0x36,0xE1, + 0x30,0x7A,0x00,0x28,0x04,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x66,0xFB, + 0xFF,0x20,0x81,0x30,0xFA,0xF7,0xD8,0xFE,0x03,0x20,0x01,0xF0,0xCF,0xF9,0xFC,0xF7, + 0xB5,0xF8,0xFC,0xF7,0x99,0xF8,0xA4,0x48,0xC0,0x38,0xC0,0x88,0x01,0x06,0x01,0xD5, + 0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0, + 0x85,0xF8,0xFC,0xF7,0x3D,0xFB,0x9A,0x48,0x03,0x99,0x60,0x38,0x00,0x89,0x40,0x18, + 0x99,0x49,0xC0,0x39,0x89,0x89,0x88,0x42,0x12,0xD9,0x09,0x98,0x40,0x7A,0x00,0x28, + 0x0E,0xD1,0x95,0x48,0xFF,0x21,0xC0,0x38,0xC0,0x88,0x19,0x31,0x08,0x42,0x07,0xD1, + 0x02,0x98,0x6D,0x1C,0x85,0x42,0x04,0xDD,0xFC,0xF7,0x2A,0xFB,0x01,0x27,0x00,0xE0, + 0x00,0x25,0x00,0xF0,0x6B,0xFE,0x01,0xF0,0x4F,0xF8,0x00,0xF0,0xFB,0xFD,0x00,0xF0, + 0x4F,0xFE,0x08,0x99,0x07,0x98,0x49,0x88,0xC0,0x6A,0x88,0x42,0x0B,0xDB,0x09,0x98, + 0x40,0x7A,0x00,0x28,0x05,0xD1,0x84,0x48,0x46,0x21,0xC0,0x38,0xC0,0x88,0x08,0x42, + 0x01,0xD0,0x01,0x20,0x70,0x70,0x00,0x2F,0x02,0xD0,0xFC,0xF7,0x97,0xFA,0x00,0x27, + 0xFC,0xF7,0x7C,0xFA,0x00,0x20,0xFC,0xF7,0xEB,0xFA,0xFC,0xF7,0xB3,0xFA,0x01,0x20, + 0xB0,0x73,0xFD,0xF7,0x4B,0xFC,0x00,0x28,0x09,0xD0,0x00,0x20,0x70,0x61,0x04,0x98, + 0x80,0x7E,0xC8,0x28,0x12,0xD2,0x04,0x99,0x40,0x1C,0x88,0x76,0x0E,0xE0,0x70,0x69, + 0x40,0x1C,0x70,0x61,0x70,0x69,0x01,0x28,0x03,0xD1,0x70,0x49,0x00,0x20,0x20,0x31, + 0x08,0x75,0x70,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7,0x04,0xF8,0x01,0x20,0x40,0x07, + 0x00,0x68,0x00,0x28,0x07,0xD1,0x20,0x69,0xFF,0x21,0xFF,0x31,0x88,0x42,0x04,0xDA, + 0x40,0x1C,0x20,0x61,0x01,0xE0,0x00,0x20,0xFB,0xE7,0x08,0x99,0xE0,0x68,0x49,0x89, + 0x88,0x42,0x0C,0xDD,0x20,0x69,0xFF,0x21,0xF5,0x31,0x88,0x42,0x07,0xDD,0x01,0x21, + 0x00,0x20,0x71,0x70,0xE0,0x60,0x20,0x61,0x07,0x98,0xC1,0x62,0x02,0xE0,0x70,0x78, + 0x00,0x28,0x02,0xD0,0xFB,0xF7,0xF0,0xFF,0x20,0xE0,0x59,0x48,0x41,0x68,0x09,0x07, + 0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0,0xC1,0x68,0x07,0x29,0x04,0xD1,0xC0,0x68, + 0x01,0x21,0x49,0x07,0xC8,0x63,0x0E,0xE0,0x00,0xF0,0x20,0xFA,0x0B,0xE0,0x01,0xF0, + 0x27,0xF8,0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0x00,0xF9,0x00,0xF0,0x5C,0xF9, + 0x01,0xE0,0xFF,0xF7,0x9D,0xFE,0xB0,0x7B,0x03,0x28,0xFA,0xD1,0xFC,0xF7,0x22,0xFB, + 0x70,0x78,0x00,0x28,0x0B,0xD0,0x43,0x48,0x01,0x21,0xC0,0x7F,0x40,0x08,0x01,0xF0, + 0x4B,0xF8,0x3C,0x49,0x00,0x20,0x48,0x70,0x07,0x99,0xC8,0x62,0x5D,0xE0,0x06,0x98, + 0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B,0x00,0x28,0x01,0xD1,0x00,0xF0,0xC6,0xF8, + 0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28,0x4F,0xD1,0x03,0x20,0x01,0xF0,0xC8,0xF8, + 0xF0,0x62,0x03,0x20,0x01,0xF0,0xF6,0xF8,0xFF,0x20,0x81,0x30,0xFA,0xF7,0xE4,0xFD, + 0x34,0x48,0x00,0x78,0x00,0x28,0x3A,0xD1,0xFC,0xF7,0xCC,0xFB,0x00,0x28,0x36,0xD0, + 0x70,0x79,0x00,0x28,0x33,0xD1,0xB0,0x6A,0x00,0x28,0x0A,0x90,0x2F,0xD0,0x25,0x48, + 0xC0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x2B,0x49,0xFA,0xF7,0x91,0xFA,0x0A,0x99, + 0x0E,0x1A,0x32,0x2E,0x23,0xDD,0x00,0xF0,0x81,0xF8,0x30,0x00,0x01,0xF0,0x64,0xFA, + 0x01,0xF0,0x68,0xFA,0x1B,0x48,0x80,0x79,0x00,0x28,0x0D,0xD0,0x00,0xF0,0x54,0xF8, + 0x00,0xF0,0x57,0xF8,0x00,0xF0,0x5F,0xF8,0x20,0x4E,0x01,0x20,0x70,0x60,0xFA,0xF7, + 0xC3,0xFD,0x1F,0x48,0x70,0x60,0x03,0xE0,0x1E,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0, + 0x01,0xF0,0x57,0xFA,0x1B,0x49,0x00,0x20,0x08,0x70,0x00,0xF0,0x6B,0xF8,0x0D,0x4E, + 0x70,0x69,0x05,0x99,0x88,0x42,0x00,0xD2,0xC2,0xE6,0x08,0x48,0x0A,0x49,0x00,0x68, + 0xC0,0x39,0x40,0x30,0x40,0x7D,0x48,0x70,0x06,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0, + 0x01,0xF0,0x1C,0xFA,0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xCC,0x07,0x00,0x20, + 0x60,0x94,0x00,0x00,0x14,0x07,0x00,0x20,0x00,0x07,0x00,0x20,0xA0,0x95,0x00,0x00, + 0x00,0x02,0x00,0x20,0x00,0x93,0x00,0x00,0x00,0x01,0x00,0x20,0xA0,0x03,0x00,0x20, + 0x00,0x40,0x00,0x30,0xD1,0x07,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xD0,0x07,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22, + 0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60, + 0x70,0x47,0x10,0x20,0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43, + 0x41,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B, + 0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00,0x10,0xB5,0xFC,0xF7, + 0x4D,0xF9,0xFA,0xF7,0x37,0xFA,0x03,0x20,0x40,0x03,0xFA,0xF7,0x3D,0xFD,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFA,0xF7,0x3D,0xFD,0xFA,0xF7, + 0x33,0xFA,0xFC,0xF7,0x43,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0xEB,0xFB,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7, + 0x59,0xFC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1, + 0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5,0xA0,0xB0,0x9F,0xE5, + 0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2,0x14,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3, + 0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0, + 0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1, + 0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A, + 0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA, + 0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3, + 0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3, + 0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1, + 0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A, + 0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0x48,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0xFD,0xF7,0xB9,0xF8,0x06,0x00, + 0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7A,0xD0,0x4F,0x48,0x00,0x21,0x01,0x70, + 0x02,0x20,0x00,0xF0,0xB7,0xFF,0x4D,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x68,0xF9, + 0x01,0x00,0x02,0x20,0x00,0xF0,0x9A,0xFF,0x49,0x4F,0x78,0x7A,0x00,0x28,0x00,0xD0, + 0x6D,0x1C,0xF8,0x79,0x00,0x28,0x04,0xD1,0x46,0x49,0x48,0x69,0x0A,0x15,0x10,0x43, + 0x48,0x61,0x00,0xF0,0x93,0xF8,0x44,0x48,0x01,0x68,0x44,0x48,0xC1,0x61,0x02,0x24, + 0x20,0x00,0x00,0xF0,0x8B,0xFF,0x42,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60, + 0x79,0x7A,0x02,0x04,0x1D,0xE0,0x3D,0x48,0x43,0x69,0x5B,0x06,0x0A,0xD4,0x00,0x29, + 0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA3,0x00,0x9B,0x18,0x1B,0x68,0xC3,0x61,0x00,0xE0, + 0xC6,0x61,0x64,0x1C,0x30,0x48,0x00,0x78,0x00,0x28,0x0A,0xD0,0xFD,0xF7,0x98,0xF9, + 0x38,0x7A,0x00,0x28,0x07,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xF6,0xF8, + 0x01,0xE0,0xAC,0x42,0xDF,0xD9,0x02,0x20,0x00,0xF0,0x6C,0xFF,0x26,0x4C,0x20,0x78, + 0x00,0x28,0x38,0xD1,0xFD,0xF7,0x9E,0xF8,0x00,0x28,0x34,0xD0,0x23,0x48,0x0A,0x21, + 0x00,0x6B,0xFA,0xF7,0x15,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0,0x47,0xFF,0x02,0x20, + 0x00,0xF0,0x4C,0xFF,0x0C,0xE0,0x20,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7,0x70,0xF9, + 0x38,0x7A,0x00,0x28,0x04,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xCE,0xF8, + 0xFD,0xF7,0x80,0xF8,0x00,0x28,0xEE,0xD1,0x18,0x48,0x41,0x68,0x41,0x60,0x0C,0xE0, + 0x1E,0xE0,0x21,0x78,0x00,0x29,0x08,0xD0,0x38,0x7A,0x00,0x28,0x08,0xD0,0x38,0x6B, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0xBA,0xF8,0x02,0xE0,0x41,0x68,0xC9,0x03,0xF0,0xD5, + 0x02,0x20,0x00,0xF0,0x2F,0xFF,0x00,0xF0,0x21,0xF8,0x0D,0x49,0xC8,0x68,0x01,0x22, + 0x10,0x43,0xC8,0x60,0xF8,0x79,0x00,0x28,0x02,0xD1,0x08,0x15,0xFA,0xF7,0x14,0xFC, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD1,0x07,0x00,0x20,0x00,0x93,0x00,0x00, + 0x14,0x07,0x00,0x20,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21, + 0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0x5D,0xFB,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x10,0xB5,0x01,0x20,0xFC,0xF7,0xA2,0xF8, + 0x01,0x20,0xFC,0xF7,0x5D,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x40,0x18,0x70,0x47, + 0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18, + 0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07, + 0x18,0x68,0x13,0x4A,0x90,0x71,0x90,0x79,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0, + 0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x30,0x22,0x00,0x21, + 0x08,0x30,0xFF,0xF7,0x27,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x0D,0x25, + 0x08,0x4C,0xED,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00, + 0x3F,0x19,0x7F,0x19,0x40,0x1C,0xBE,0x60,0x96,0x79,0x86,0x42,0xF3,0xD8,0xEA,0xE7, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x70,0xB5,0x1E,0x4A,0x1E,0x48,0x1C,0x4C, + 0x85,0x18,0x21,0x7A,0xDB,0x22,0x92,0x00,0x86,0x18,0x00,0x29,0x0F,0xD0,0x21,0x00, + 0x82,0x22,0x0C,0x31,0x28,0x00,0xFE,0xF7,0xC9,0xFF,0x18,0x49,0x0D,0x22,0x30,0x00, + 0xFE,0xF7,0xC4,0xFF,0x20,0x7A,0x60,0x72,0x70,0xBC,0x08,0xBC,0x18,0x47,0x0D,0x22, + 0x00,0x21,0x30,0x00,0xFE,0xF7,0xEE,0xFF,0x82,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7, + 0xE9,0xFF,0x0E,0x48,0x82,0x22,0x00,0x21,0x8F,0x38,0xFE,0xF7,0xE3,0xFF,0x0B,0x48, + 0x0D,0x22,0x00,0x21,0x0D,0x38,0xFE,0xF7,0xDD,0xFF,0x00,0x20,0x06,0x49,0x60,0x72, + 0xA0,0x72,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x05,0x49,0x88,0x72,0xDB,0xE7, + 0x00,0x02,0x00,0x20,0x4E,0x02,0x00,0x00,0x40,0x00,0x00,0x20,0x9F,0x03,0x00,0x20, + 0x40,0x06,0x00,0x20,0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48, + 0x00,0x78,0x00,0x28,0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A, + 0x8C,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91, + 0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22, + 0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22, + 0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49, + 0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F, + 0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18, + 0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C, + 0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00, + 0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0xC1,0xFF,0x20,0x8C, + 0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08, + 0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98, + 0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x15,0x20,0x08,0x90, + 0x5D,0x48,0x0E,0x21,0x80,0x7B,0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21, + 0x01,0xE0,0x14,0x20,0x08,0x90,0x20,0x00,0xF9,0xF7,0x7A,0xFE,0x0A,0x99,0x08,0x1A, + 0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xF9,0xF7,0x72,0xFE,0x09,0x99,0x08,0x1A, + 0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD, + 0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B, + 0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00, + 0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19, + 0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xF9,0xF7, + 0x47,0xFE,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28, + 0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xF9,0xF7,0x38,0xFE, + 0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98, + 0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68, + 0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC, + 0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD, + 0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99, + 0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xF9,0xF7,0x0A,0xFE,0x86,0x19,0x03,0x98, + 0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0, + 0x60,0x00,0x80,0x1B,0x64,0x21,0xF9,0xF7,0xFB,0xFD,0x07,0x99,0x89,0x07,0x09,0xD5, + 0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A, + 0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E, + 0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A, + 0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0xF9,0xFE,0x13,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0x20,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0x40,0x06,0x00,0x20,0xF0,0xB4,0x05,0x00, + 0x0B,0x4C,0x00,0x20,0xFF,0x26,0x91,0x36,0x82,0x00,0xA3,0x5A,0x12,0x19,0x52,0x88, + 0x5B,0x1B,0x1F,0x00,0x5F,0x43,0x52,0x1A,0x13,0x00,0x53,0x43,0xFA,0x18,0xB2,0x42, + 0x04,0xDB,0x40,0x1C,0x1A,0x28,0xEF,0xD3,0x00,0x20,0xC0,0x43,0xF0,0xBC,0x70,0x47, + 0x44,0x79,0x00,0x00,0xFE,0xB5,0x69,0x4D,0x67,0x48,0x00,0x26,0x29,0x00,0xFF,0x31, + 0x00,0x96,0x42,0x7E,0xC1,0x31,0x08,0x7A,0x33,0x00,0x00,0x2A,0x28,0xD1,0x00,0x28, + 0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0xD3,0x30, + 0xFD,0xF7,0xB0,0xF8,0x00,0x28,0x17,0xD0,0x5D,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C, + 0x81,0x42,0x14,0xD3,0xA9,0x19,0x33,0x22,0x00,0x90,0xFF,0x20,0x52,0x01,0xCD,0x30, + 0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x76,0x76,0x1C,0xCD,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0x06,0xFA,0x64,0x1C,0x0D,0x2C,0xDA,0xDB,0x94,0xE0, + 0x49,0x7A,0x00,0x29,0x01,0xD1,0x00,0x28,0x78,0xD0,0x07,0x20,0xC0,0x01,0x00,0x24, + 0x2E,0x18,0x33,0x27,0x7F,0x01,0x28,0x19,0xC0,0x19,0x40,0x7E,0x00,0x28,0x3F,0xD0, + 0x0D,0x21,0x28,0x18,0x89,0x01,0x41,0x18,0xC9,0x7F,0x00,0x29,0x02,0xD0,0x32,0x7D, + 0x00,0x2A,0x14,0xD0,0x1B,0x21,0x49,0x01,0x40,0x18,0x00,0x99,0x00,0x7B,0x49,0x1C, + 0x00,0x91,0x0A,0x21,0x48,0x43,0x3F,0x49,0x40,0x19,0x42,0x18,0x02,0x20,0x03,0x23, + 0x69,0x46,0x00,0xF0,0xD7,0xF9,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20, + 0x41,0x43,0x48,0x19,0x02,0x90,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0x5B,0xF8,0x00,0x28, + 0x13,0xD0,0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0xCD,0x32,0x03,0x20, + 0x02,0x23,0x69,0x46,0x00,0xF0,0xBE,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x7E, + 0x40,0x1C,0x4A,0x76,0x0C,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x0C,0x2C,0xBA,0xDB, + 0x01,0x24,0x26,0x49,0x0D,0x20,0x0A,0x19,0x80,0x01,0x10,0x18,0xC0,0x7F,0x00,0x22, + 0x01,0x92,0x00,0x28,0x32,0xD0,0x32,0x7D,0x00,0x2A,0x2F,0xD1,0x0A,0x22,0x50,0x43, + 0x45,0x18,0x28,0x00,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0x2C,0xF8,0x00,0x28,0x25,0xD0, + 0x1B,0x48,0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x26,0xD3,0x17,0x4A,0x00,0x20, + 0x11,0x18,0xC9,0x19,0x49,0x7E,0xA1,0x42,0x0C,0xD0,0x00,0x29,0x07,0xD1,0xFF,0x21, + 0xCD,0x31,0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x76,0x06,0xE0,0x12,0xE0,0x40,0x1C, + 0x0C,0x28,0xED,0xDB,0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93, + 0xCD,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x74,0xF9,0x64,0x1C,0x0D,0x2C, + 0xBF,0xDB,0x02,0xE0,0x01,0x20,0x40,0x07,0x43,0x60,0x00,0x98,0x00,0xF0,0x66,0xFC, + 0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x00,0x93,0x00,0x00,0x4E,0x02,0x00,0x00,0xFC,0xB5,0x4E,0x48,0x36,0x25,0x45,0x5F, + 0x15,0x20,0x84,0x46,0x4B,0x48,0x4C,0x4F,0x80,0x30,0x82,0x7D,0x86,0x46,0x4B,0x48, + 0x00,0x26,0x81,0x7B,0x0E,0x24,0xC8,0x07,0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24, + 0x01,0xE0,0x14,0x20,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42, + 0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46, + 0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2, + 0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00, + 0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA, + 0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24, + 0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E, + 0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14, + 0x02,0x04,0x12,0x14,0x25,0x48,0x80,0x30,0x81,0x6B,0xA6,0x42,0x05,0xDD,0x74,0x46, + 0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E, + 0x81,0x63,0x1E,0x49,0x80,0x31,0xC9,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42, + 0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x63,0x74,0x46, + 0xA4,0x8B,0x85,0x6B,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88, + 0xC0,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70, + 0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43, + 0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46, + 0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0x40,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D, + 0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29, + 0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61, + 0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0, + 0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61, + 0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xF9,0xF7,0x2B,0xFD,0xB0,0x62,0x30,0x7B,0x00,0x28, + 0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x39,0x00,0xF9,0xF7,0x1C,0xFD,0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00, + 0x14,0x07,0x00,0x20,0x80,0x94,0x00,0x00,0x41,0xA0,0x00,0x00,0x10,0x00,0x10,0x00, + 0x07,0x48,0x41,0x7A,0x07,0x48,0x02,0x29,0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29, + 0x01,0xD1,0xC0,0x69,0x00,0xE0,0x80,0x69,0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00, + 0x00,0x02,0x00,0x20,0xC0,0x94,0x00,0x00,0xC0,0x90,0x00,0x40,0xF0,0xB4,0x0B,0x48, + 0x0D,0x4B,0xC0,0x88,0x0A,0x49,0x0C,0x4F,0x42,0x06,0x0A,0x48,0x01,0x24,0xE4,0x03, + 0x32,0x25,0x5E,0x00,0x32,0x3F,0x01,0x61,0x43,0x61,0x84,0x61,0xC5,0x61,0x04,0x62, + 0x46,0x62,0x84,0x62,0xC7,0x62,0xF0,0xBC,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x00,0x80,0x00,0x03,0x40,0xA1,0x00,0x40,0x64,0x40,0x00,0x00,0x11,0x49,0x10,0xB4, + 0x0A,0x7D,0x11,0x48,0x82,0x73,0x4A,0x7D,0xC2,0x73,0x82,0x7B,0x0F,0x48,0xD3,0x07, + 0x0A,0xD0,0x93,0x07,0x0E,0x4A,0x03,0xD5,0x0D,0x23,0x03,0x77,0x00,0x23,0x02,0xE0, + 0x14,0x23,0x03,0x77,0x01,0x23,0x13,0x71,0x8A,0x7D,0x42,0x77,0xCA,0x7D,0x82,0x77, + 0x0A,0x7E,0xC2,0x77,0x4A,0x7E,0x05,0x48,0x20,0x30,0x02,0x70,0x89,0x7E,0x41,0x70, + 0x10,0xBC,0x70,0x47,0x00,0x93,0x00,0x00,0x40,0x06,0x00,0x20,0x60,0x06,0x00,0x20, + 0x14,0x07,0x00,0x20,0xFF,0xB5,0x05,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0x81,0xB0, + 0xFA,0xF7,0x9C,0xFC,0x00,0x28,0x08,0xD0,0x02,0x98,0x02,0x99,0x00,0x68,0x40,0x1E, + 0x08,0x60,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x29,0x48,0x80,0x7B,0xC0,0x07, + 0x22,0xD0,0xE0,0x79,0x05,0x28,0x1D,0xD0,0x09,0x28,0x1D,0xD1,0x6D,0x08,0x6D,0x00, + 0x01,0x20,0x09,0x27,0x22,0x78,0x23,0x4E,0xBF,0x01,0x0F,0xE0,0x0A,0x23,0x01,0x00, + 0x59,0x43,0x21,0x4B,0xC9,0x18,0xC9,0x19,0x8B,0x7B,0x9A,0x42,0x05,0xD1,0x0B,0x8A, + 0x63,0x80,0xCB,0x7B,0x63,0x70,0x49,0x8A,0xA1,0x80,0x40,0x1C,0x71,0x7A,0x81,0x42, + 0xEC,0xDA,0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x21,0xA8,0x07,0x89,0x06,0x88,0x43, + 0x21,0x78,0x62,0x78,0x09,0x07,0x89,0x08,0x08,0x43,0x14,0x49,0x92,0x06,0x08,0x40, + 0x61,0x88,0x12,0x0C,0x89,0x05,0x89,0x09,0x08,0x43,0x3F,0x21,0x89,0x02,0x88,0x43, + 0x10,0x43,0x02,0x04,0x92,0x0E,0x0F,0x2A,0x03,0xD9,0x88,0x43,0x0F,0x21,0x89,0x02, + 0x40,0x18,0xA1,0x88,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x02,0x99, + 0x01,0x22,0x09,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60,0xA9,0xE7,0x00,0x00, + 0x40,0x06,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23, + 0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72,0x8A,0x72,0x08,0x48, + 0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73,0x10,0xBC,0x70,0x47, + 0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7,0x14,0x07,0x00,0x20, + 0xA0,0x95,0x00,0x00,0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42, + 0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7,0xDB,0xFA,0x38,0x80,0x21,0x00,0x30,0x00, + 0xF9,0xF7,0xD6,0xFA,0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD, + 0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A, + 0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91,0xF9,0xF7,0xBA,0xFA,0x40,0x19,0x60,0x80, + 0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43,0xF9,0xF7,0xB2,0xFA,0x80,0x19,0xA0,0x80, + 0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79,0x14,0x4B,0x00,0x26,0x22,0x07,0x92,0x08, + 0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5B,0x07,0x09,0xD5,0x10,0x4D,0xAB,0x89, + 0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D,0x3A,0x43,0x64,0x00,0x64,0x19,0xE3,0x81, + 0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79,0x80,0x00,0x9B,0x06,0x1B,0x0C,0x1A,0x43, + 0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0, + 0x04,0x48,0x01,0x21,0xC1,0x72,0x06,0x73,0xF0,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC, + 0x40,0x00,0x00,0x20,0x40,0x06,0x00,0x20,0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C, + 0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18, + 0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2, + 0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0x10,0xB4,0x0E,0x24,0x60,0x43,0x03,0x4B,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C, + 0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18, + 0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2, + 0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0x70,0xB4,0x12,0x4A,0x11,0x4D,0x52,0x7D,0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43, + 0x0E,0x22,0x50,0x43,0x0C,0x4B,0x86,0x18,0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0, + 0xEA,0x7D,0x8A,0x42,0x0A,0xD0,0x2A,0x7E,0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42, + 0x04,0xD0,0xAA,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C, + 0x86,0x42,0xEA,0xD8,0x70,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00, + 0x70,0xB4,0x12,0x4A,0x11,0x4B,0x52,0x7D,0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43, + 0xFF,0x26,0x0D,0x4C,0x27,0x36,0x12,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D, + 0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0, + 0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42, + 0xEA,0xD3,0x70,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00, + 0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06, + 0x04,0x48,0x01,0xD5,0x40,0x68,0x00,0xE0,0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x20,0xC0,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x03,0x00, + 0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31, + 0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68,0x00,0xF0,0x16,0xFB, + 0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62,0x50,0x6B,0x60,0x62, + 0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x26,0x62, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7,0x89,0x69,0x21,0x62, + 0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40,0x00,0x93,0x00,0x00, + 0x01,0x21,0x49,0x07,0x48,0x68,0x00,0x23,0x00,0x04,0x00,0x0F,0x00,0x28,0x0B,0x4A, + 0x48,0x68,0x03,0xD0,0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E, + 0x01,0xD0,0x01,0x20,0x07,0xE0,0xD0,0x78,0x00,0x28,0x02,0xD1,0x01,0x20,0x03,0x00, + 0x01,0xE0,0x0F,0x23,0x00,0x20,0xD3,0x70,0x08,0x60,0x70,0x47,0x14,0x07,0x00,0x20, + 0x0A,0x4A,0x10,0xB5,0xD1,0x88,0x0A,0x4B,0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43, + 0x08,0x48,0xD1,0x80,0x03,0xE0,0x07,0x48,0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60, + 0xFF,0xF7,0x28,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xCC,0x07,0x00,0x20,0xB0,0x94,0x00,0x00,0xFE,0xB5,0x04,0x00,0x37,0x48,0x0E,0x00, + 0x07,0x6A,0x41,0x6A,0x02,0x91,0x41,0x6B,0x01,0x91,0xC0,0x6A,0x00,0x90,0x00,0x20, + 0xFF,0xF7,0x74,0xFF,0xFB,0xF7,0x34,0xFA,0x25,0x00,0x46,0xE0,0x68,0x1E,0x84,0x42, + 0x01,0xD1,0xFB,0xF7,0x63,0xFA,0xFB,0xF7,0xDD,0xF9,0xFB,0xF7,0xB3,0xFA,0x00,0x2E, + 0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x5B,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7,0x50,0xFA, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21, + 0xF9,0xF7,0x46,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0, + 0x05,0x21,0x28,0x00,0xF9,0xF7,0x3C,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFA,0xF7,0x87,0xFF,0x0C,0xE0, + 0x68,0x00,0x03,0x21,0xF9,0xF7,0x2C,0xFA,0xA0,0x42,0xDB,0xD9,0x03,0x21,0x28,0x00, + 0xF9,0xF7,0x26,0xFA,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2,0x0C,0x48, + 0x44,0x88,0x03,0xE0,0xFB,0xF7,0x96,0xF9,0xFB,0xF7,0x6C,0xFA,0x64,0x1E,0xF9,0xD2, + 0xFB,0xF7,0xD6,0xF9,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63, + 0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40, + 0xE0,0x95,0x00,0x00,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68, + 0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B, + 0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07, + 0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xD1,0x07,0x00,0x20,0x30,0xB4,0x05,0x03, + 0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61, + 0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03, + 0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48, + 0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32, + 0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B, + 0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68, + 0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0, + 0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07, + 0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x93,0x00,0x00, + 0xF8,0xB5,0x17,0x4B,0x00,0x24,0x98,0x79,0x00,0x28,0x25,0xD0,0x00,0x20,0x0D,0x26, + 0x14,0x4D,0xF6,0x01,0x12,0xE0,0x81,0x00,0x49,0x19,0x89,0x19,0x8A,0x68,0x97,0x0F, + 0xFF,0x07,0x0A,0xD0,0x92,0x00,0x01,0x27,0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C, + 0x8A,0x60,0xA1,0x00,0xBF,0x08,0xC9,0x19,0x4A,0x60,0x40,0x1C,0x99,0x79,0x81,0x42, + 0xE9,0xDC,0x07,0x48,0x0D,0x22,0x00,0x21,0xC0,0x1F,0xFE,0xF7,0x03,0xF9,0x20,0x00, + 0xFF,0xF7,0xB4,0xFF,0xFC,0xF7,0xCA,0xF9,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00, + 0x01,0x21,0x8D,0xB0,0x49,0x07,0x0C,0x94,0x4F,0x68,0x61,0x4E,0xB9,0x0F,0x89,0x07, + 0x7E,0xD5,0x30,0x22,0x00,0x21,0x68,0x46,0xFE,0xF7,0xE4,0xF8,0x07,0x21,0xB8,0x01, + 0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00,0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43, + 0x0C,0x90,0x00,0x20,0x33,0xE0,0x01,0x22,0x81,0x00,0x52,0x07,0x89,0x18,0x89,0x68, + 0x8E,0x00,0x32,0x0F,0x2A,0xD0,0x32,0x0F,0x94,0x46,0x92,0x00,0x6B,0x46,0xD2,0x18, + 0x40,0x3A,0xD3,0x6B,0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27, + 0x3F,0x06,0x0E,0x04,0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43,0x49,0x4E,0x33,0x40, + 0x8E,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43,0x1B,0x0B,0x89,0x05,0x1B,0x03,0x89,0x0D, + 0x0B,0x43,0xD3,0x63,0x62,0x46,0x52,0x1E,0x01,0x23,0x93,0x40,0x9A,0x05,0x92,0x0D, + 0x71,0x46,0x11,0x43,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x0C,0x91,0x40,0x1C,0x0C,0x99, + 0x8E,0x46,0x09,0x04,0x09,0x0F,0x81,0x42,0xC5,0xD8,0x0C,0x98,0x01,0x27,0x00,0x04, + 0x00,0x0F,0x7B,0x07,0x0F,0xE0,0x82,0x00,0xD2,0x18,0x92,0x68,0x3E,0x00,0x92,0x00, + 0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06, + 0x24,0x0E,0x40,0x1C,0x0C,0x91,0x0C,0x99,0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F, + 0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x21,0x08,0x00,0x6E,0x46,0x82,0x00,0xB2,0x58, + 0x00,0x2A,0x03,0xD0,0x8F,0x00,0xFF,0x18,0xBA,0x60,0x49,0x1C,0x40,0x1C,0x0C,0x28, + 0xF4,0xD3,0x23,0x49,0x0C,0x98,0x88,0x43,0x29,0x07,0x09,0x0C,0x08,0x43,0x00,0xE0, + 0x07,0xE0,0x07,0x21,0x49,0x05,0x88,0x43,0x61,0x07,0x09,0x0A,0x08,0x43,0x0C,0x90, + 0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0,0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C, + 0x82,0x00,0x11,0x0F,0x09,0x07,0x21,0x40,0x84,0x01,0xA4,0x0D,0x24,0x03,0x21,0x43, + 0x84,0x05,0x09,0x0B,0x09,0x03,0xA4,0x0D,0x21,0x43,0x0F,0x24,0x24,0x06,0x00,0x04, + 0x80,0x08,0xA1,0x43,0x20,0x40,0x01,0x43,0x08,0x0F,0x09,0xD0,0x12,0x0F,0x52,0x1E, + 0x01,0x20,0x90,0x40,0x80,0x05,0x80,0x0D,0xB0,0x43,0x5A,0x14,0x80,0x18,0x0C,0x90, + 0x99,0x60,0x02,0xE0,0x01,0x21,0x49,0x07,0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x74, + 0x0C,0x99,0x40,0x07,0x41,0x60,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7,0x99,0xF8,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF9,0xF7,0x9B,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF9,0xF7,0x80,0xF8,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF9,0xF7,0x82,0xF8,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xD0,0x07,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60, + 0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47, + 0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0, + 0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60, + 0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x14,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1,0x93,0xC0,0xC1,0xE0, + 0x63,0x30,0xE0,0xE3,0xC1,0x12,0x62,0xE0,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x1F,0x85,0xEB,0x51,0x78,0x47,0xC0,0x46,0x18,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1, + 0x93,0xC0,0xC1,0xE0,0x0F,0x30,0xE0,0xE3,0x27,0x3C,0x43,0xE2,0x41,0x16,0x62,0xE0, + 0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1,0xAD,0x8B,0xDB,0x68,0x78,0x47,0xC0,0x46, + 0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27, + 0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x10,0x30,0x9F,0xE5, + 0x93,0x10,0x82,0xE0,0x63,0x30,0xE0,0xE3,0xA2,0x12,0xA0,0xE1,0x93,0x01,0x20,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x1F,0x85,0xEB,0x51,0x10,0xB5,0xF8,0xF7,0xDF,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x13,0x00,0x13,0x00,0xA0,0x00,0x13,0x00,0x2D,0x01,0x13,0x00, + 0x2B,0x01,0x41,0x00,0x2B,0x01,0x70,0x00,0x5A,0x00,0x82,0x00,0xA0,0x00,0x82,0x00, + 0x2B,0x01,0xA0,0x00,0x2B,0x01,0xD0,0x00,0xA0,0x00,0xF0,0x00,0x2D,0x01,0x00,0x01, + 0x13,0x00,0x20,0x01,0x13,0x00,0x50,0x01,0xA0,0x00,0x5E,0x01,0xE6,0x00,0x5E,0x01, + 0x13,0x00,0x80,0x01,0x13,0x00,0xCA,0x01,0x30,0x00,0xA7,0x01,0x50,0x00,0xCA,0x01, + 0x70,0x00,0xA7,0x01,0x90,0x00,0xCA,0x01,0xB0,0x00,0xA7,0x01,0xD0,0x00,0xCA,0x01, + 0xF0,0x00,0xA7,0x01,0x10,0x01,0xCA,0x01,0x2D,0x01,0xA7,0x01,0x89,0x08,0x49,0x1E, + 0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07,0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43, + 0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0xE8,0x03,0x00,0x00,0xE8,0x03,0x00,0x00,0xE8,0x03,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x14,0x05,0x14,0x05,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x7A,0x00,0x01,0x00,0x04,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x15,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0xFA,0x00, + 0x28,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x1E,0x00,0x46,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x5E,0x01,0x90,0x01,0x90,0x01, + 0x90,0x01,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0xFF, + 0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x2C,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0xC2,0x00,0x00, + 0x1F,0x1F,0xB8,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x99,0x19,0x90,0x01,0x32,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x23,0x00,0x41,0x00, + 0x46,0x00,0x05,0x00,0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0xF4,0x01, + 0xF4,0x01,0xF4,0x01,0x90,0x01,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00, + 0x64,0x3C,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0xC2,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x80,0x00,0x00,0x18,0x10,0xB8,0x00,0x00,0x3F,0x00,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x19,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0xB4,0x00,0xFA,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x14,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xF0,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x8D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xC2,0x00,0x00, + 0x20,0x00,0x20,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x1F,0x1F,0xB8,0x00, + 0x10,0x3F,0x10,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0xFF,0x0F, + 0x00,0x00,0x00,0x00,0xFF,0x07,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x20, + 0x11,0x30,0x10,0x00,0x41,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x60,0x38,0x30,0x08,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00, + 0x58,0x30,0x28,0x00,0x56,0x31,0x26,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x58,0x31,0x28,0x01, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x31,0x20,0x01, + 0x60,0x30,0x30,0x00,0x48,0x31,0x18,0x01,0x48,0x31,0x18,0x01,0x60,0x37,0x30,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x20,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x20,0x22,0x22,0x22,0x22,0x22,0x22, + 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x24,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x24,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0x91,0xE7, + 0x21,0x2C,0x92,0xE7,0x42,0xBC,0x92,0xE7,0x63,0x28,0x93,0xE7,0x84,0xB8,0x93,0xE7, + 0xA5,0x24,0x94,0xE7,0xC6,0xB4,0x94,0xE7,0xE7,0x20,0x95,0xE7,0x08,0xB1,0x95,0xE7, + 0x29,0x9D,0x98,0xE7,0x4A,0x01,0x99,0xE7,0x6B,0x99,0x99,0xE7,0x8C,0x05,0x9A,0xE7, + 0xAD,0x95,0x9A,0xE7,0xCE,0x09,0x90,0xE7,0xEF,0x11,0x90,0xE7,0x10,0x0E,0x90,0xE7, + 0x31,0x46,0x90,0xE7,0x52,0x52,0x90,0xE7,0x73,0x4A,0x90,0xE7,0x94,0x4E,0x90,0xE7, + 0xB5,0x02,0x90,0xE7,0xD6,0x02,0x90,0xE7,0xF7,0x02,0x90,0xE7,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x33,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x30,0x68,0x30,0x68,0x70,0x28,0x70,0x28, + 0x32,0x30,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,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0x01,0x00,0x94,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0002_20140301.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0002_20140301.h new file mode 100644 index 00000000..fa177ac2 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0002_20140301.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS_GF MELFAS, f/w 2(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x38,0x4A,0x36,0x48,0x36,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x34,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x32,0x49,0x32,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x2C,0x4B,0x9F,0x6A,0x2E,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x28,0x48,0x29,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x20,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x22,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x11,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0x00, + 0x00,0x00,0x00,0x10,0x7C,0x02,0x00,0x00,0xEC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x38,0x48,0x41,0x6B, + 0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48, + 0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61,0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69, + 0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4,0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1, + 0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF,0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C, + 0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68, + 0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0, + 0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09, + 0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06,0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7, + 0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x07,0xF0,0xBE,0xF9,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x48,0x07,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x53,0xFD,0x07,0x00,0x03,0xF0,0x5A,0xFC,0x03,0xF0,0x4C,0xFC, + 0x03,0xF0,0xD6,0xFC,0x46,0x4A,0x47,0x49,0x47,0x48,0x05,0xF0,0xCF,0xF8,0x05,0x21, + 0x49,0x03,0x00,0x20,0x00,0xF0,0xF0,0xF9,0x44,0x4C,0x45,0x49,0x60,0x61,0x00,0x20, + 0x00,0xF0,0xEA,0xF9,0x43,0x4B,0x44,0x49,0xD8,0x63,0x44,0x48,0x00,0xF0,0xE4,0xF9, + 0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x96,0xFC,0x40,0x4A,0x41,0x48, + 0x00,0x21,0x05,0xF0,0xC5,0xF8,0x06,0xF0,0x8F,0xFC,0x03,0xF0,0x3D,0xFD,0x3E,0x48, + 0x00,0x26,0x81,0x7A,0x01,0x25,0x6D,0x07,0xA1,0x71,0xC1,0x7A,0xE1,0x71,0x40,0x7A, + 0x20,0x72,0x66,0x71,0x66,0x72,0xA6,0x72,0xE6,0x72,0x36,0x48,0x26,0x73,0x66,0x73, + 0x68,0x63,0xFF,0x20,0xE8,0x63,0xE8,0x14,0x00,0xF0,0xEC,0xFC,0x33,0x48,0x06,0x70, + 0xFF,0x20,0x81,0x30,0x00,0xF0,0xE6,0xFC,0x31,0x49,0x02,0x20,0x06,0xF0,0x7C,0xFF, + 0x02,0x20,0x06,0xF0,0x81,0xFF,0x20,0x7A,0x00,0x28,0x01,0xD0,0x07,0xF0,0xFC,0xF8, + 0x00,0x2F,0x1F,0xD1,0x2B,0x4E,0xB7,0x15,0x20,0x7A,0x00,0x28,0x02,0xD0,0x2A,0x49, + 0xE0,0x6A,0x88,0x60,0xE8,0x6B,0x0B,0x28,0x14,0xD0,0x28,0x48,0x40,0x68,0x00,0x07, + 0x01,0xD5,0x02,0xF0,0x15,0xFB,0xF0,0x68,0x25,0x49,0x88,0x42,0xEC,0xD9,0x25,0x48, + 0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB0,0x68,0xB8,0x43,0xB0,0x60,0xB0,0x68,0x38,0x43, + 0xB0,0x60,0xE1,0xE7,0xE0,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0, + 0xA9,0xFC,0x20,0x7A,0x00,0x28,0x01,0xD0,0x07,0xF0,0xD6,0xF8,0x02,0x20,0x06,0xF0, + 0x57,0xFF,0xFF,0x20,0x81,0x30,0x00,0xF0,0x9D,0xFC,0x17,0x49,0x05,0x20,0x03,0xF0, + 0x79,0xFA,0x0B,0x20,0xE8,0x63,0x03,0xF0,0x0F,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x28,0x00,0x00,0x00,0xCC,0x78,0x00,0x00,0x00,0x00,0x00,0x10,0x14,0x07,0x00,0x20, + 0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20,0x00,0x9D,0x00,0x00,0x00,0x93,0x00,0x00, + 0xD4,0x06,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xCD,0x07,0x00,0x20, + 0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30, + 0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00,0x2D,0x74,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0, + 0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0,0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0, + 0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1,0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3, + 0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21,0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A, + 0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A,0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0, + 0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0,0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0, + 0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0,0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0,0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21, + 0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3,0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2, + 0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0, + 0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23, + 0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1, + 0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5, + 0x02,0x20,0x06,0xF0,0xF7,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46, + 0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA0,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0, + 0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0,0x83,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0, + 0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0xEE,0xFD,0xFF,0xEA, + 0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40, + 0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60, + 0x0B,0x24,0x02,0xF0,0x29,0xF9,0x64,0x1E,0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27, + 0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7B,0xC0,0x07,0x26,0xD0,0x70,0x7A,0x00,0x28, + 0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04, + 0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24, + 0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0, + 0x4F,0xFB,0x64,0x1C,0x70,0x7A,0xA0,0x42,0xF3,0xDA,0x70,0x7A,0x01,0x28,0x02,0xD1, + 0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7A,0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x3A,0x06,0x00,0x00, + 0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7A, + 0xE4,0x00,0xE6,0x18,0x19,0x24,0xA4,0x01,0x36,0x19,0xB5,0x70,0x56,0x7A,0x45,0x88, + 0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x80,0x56,0x7A,0x85,0x88,0xF6,0x00,0xF6,0x18, + 0x36,0x19,0xF5,0x80,0x55,0x7A,0xED,0x00,0xED,0x18,0x2D,0x19,0x29,0x72,0x55,0x7A, + 0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19,0x59,0x72,0x51,0x7A,0x49,0x1C,0x51,0x72, + 0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20, + 0x90,0x72,0x70,0xBC,0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00,0x40,0x00,0x00,0x20, + 0x40,0x06,0x00,0x20,0xFF,0xB5,0x0A,0x20,0x48,0x43,0x16,0x4F,0x81,0xB0,0xC5,0x19, + 0xFF,0x35,0x48,0x00,0xC1,0x35,0xC0,0x19,0x2A,0x73,0x00,0x90,0x0C,0x00,0xE0,0x30, + 0x80,0x8A,0x16,0x00,0x0A,0x21,0xFF,0xF7,0x29,0xFF,0xE8,0x81,0x00,0x98,0x0A,0x21, + 0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x21,0xFF,0x28,0x82,0x38,0x19,0xFF,0x30, + 0x41,0x30,0x00,0x7E,0xB9,0x19,0x68,0x73,0x04,0x98,0xA8,0x74,0x01,0x98,0x06,0x55, + 0x0D,0x20,0x80,0x01,0x08,0x18,0x00,0x21,0xC4,0x77,0x81,0x74,0x05,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x06,0x48,0x0F,0x23,0x42,0x79,0x01,0x68, + 0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A,0xD2,0x18,0x09,0x03,0x09,0x0B,0x0A,0x43, + 0x02,0x60,0x70,0x47,0x40,0x00,0x00,0x20,0xF1,0xB5,0xB1,0x48,0x90,0xB0,0x0F,0x90, + 0x40,0x7C,0x02,0x90,0x0F,0x98,0xC0,0x7C,0x01,0x90,0x0F,0x98,0x00,0x7C,0x00,0x90, + 0xAC,0x48,0x00,0x68,0x00,0x88,0x00,0x05,0x7E,0xD5,0x10,0x98,0x01,0x28,0x00,0xD0, + 0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x41,0xE1,0x03,0x98,0x81,0x00,0x01,0x20, + 0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90,0x0C,0x0F,0x80,0x0F, + 0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x47,0xFB,0x29,0xE1,0x9E,0x48,0xA5,0x00, + 0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9B,0x49,0x80,0x01,0x80,0x0D, + 0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80,0x4A,0x5B,0x34,0x31, + 0x4A,0x53,0x69,0x18,0x48,0x80,0x13,0xE1,0x02,0x9F,0x93,0x49,0x00,0x20,0x7F,0x1E, + 0x68,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52, + 0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46,0x80,0x01,0x80,0x0D, + 0x0C,0x90,0x80,0x1A,0x02,0x9A,0x88,0x4E,0x92,0x00,0x8B,0x18,0x20,0x3B,0x98,0x83, + 0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90,0x52,0x88,0x80,0x1A, + 0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00,0xCF,0x5E,0x38,0x18, + 0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B,0x9A,0x42,0xF4,0xDB, + 0x19,0x00,0xFF,0xF7,0x53,0xFD,0x07,0x00,0x02,0x99,0x30,0x00,0xFF,0xF7,0x4E,0xFD, + 0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42,0x17,0xDA,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21,0x48,0x43,0x0A,0x21, + 0xFF,0xF7,0x6C,0xFE,0x62,0x00,0x00,0xE0,0xCD,0xE0,0x6B,0x4B,0x28,0x3B,0x99,0x5E, + 0x88,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x08,0x18,0x98,0x52,0x07,0xE0,0x66,0x49, + 0x0F,0x9B,0x60,0x00,0x28,0x39,0x0A,0x5A,0x5B,0x7D,0xD2,0x1A,0x0A,0x52,0x62,0x49, + 0x60,0x00,0x28,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E, + 0x01,0x99,0x88,0x42,0x09,0x90,0x04,0xDB,0x5B,0x48,0x05,0x21,0x0E,0x38,0x01,0x55, + 0x2B,0xE0,0x88,0x00,0x05,0x21,0xFF,0xF7,0x41,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC, + 0x04,0x20,0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x36,0xFE, + 0x09,0x99,0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0,0x01,0x98,0x05,0x21,0x40,0x00, + 0xFF,0xF7,0x2C,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98, + 0x05,0x21,0xFF,0xF7,0x23,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0, + 0x08,0x00,0x02,0xD1,0x44,0x49,0x0E,0x39,0x08,0x55,0x43,0x49,0x0C,0x9A,0x34,0x31, + 0x48,0x5F,0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A, + 0x3D,0x48,0x57,0x1A,0x0E,0x38,0x06,0x91,0x01,0x5D,0x0F,0x98,0x80,0x7D,0x81,0x42, + 0x27,0xD3,0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42, + 0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42, + 0xFF,0xF7,0xC4,0xFC,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E, + 0x00,0xDC,0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E, + 0x00,0xDC,0x78,0x42,0xFF,0xF7,0xB2,0xFC,0x08,0x99,0x00,0x2E,0x19,0xDB,0x09,0x19, + 0x18,0xE0,0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99,0xFF,0xF7,0xA7,0xFC,0x64,0x21, + 0x08,0x1A,0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7, + 0x9D,0xFC,0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21, + 0xE0,0xE7,0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A, + 0x15,0x4A,0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A,0x5A,0x80,0x12,0x4A,0x13,0x4B, + 0x34,0x32,0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40, + 0x0A,0x43,0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60, + 0x04,0x98,0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99, + 0x88,0x42,0x00,0xDA,0xB9,0xE6,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xA0,0x93,0x00,0x00,0xC8,0x07,0x00,0x20,0xC8,0x0A,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x10,0x4B,0x30,0xB4,0x1B,0x21,0xDA,0x88,0x89,0x01,0x80,0x24,0x59,0x18,0x00,0x28, + 0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x0D,0x80,0xC5,0x89,0x4D,0x80,0x05,0x8A,0x8D,0x80, + 0x40,0x8A,0xC8,0x80,0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43,0x08,0x81,0x06,0xE0, + 0x00,0x20,0x08,0x80,0x48,0x80,0x88,0x80,0xC8,0x80,0xA2,0x43,0x08,0x81,0xDA,0x80, + 0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20,0x80,0x93,0x00,0x00,0x7F,0xB5,0x25,0x4D, + 0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A,0x00,0x28,0x09,0xD1,0x68,0x6A,0x00,0x28, + 0x06,0xD1,0x21,0x4C,0x01,0xF0,0xBC,0xFE,0x64,0x1E,0xFB,0xD2,0xFF,0x24,0x12,0xE0, + 0x05,0xF0,0xD2,0xFA,0x01,0xF0,0xB2,0xFD,0x01,0xF0,0xFA,0xFD,0x03,0xAA,0x01,0xA9, + 0x02,0xA8,0x04,0xF0,0xB5,0xFC,0x04,0x00,0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98, + 0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20,0x06,0xF0,0x32,0xFB,0x02,0x20,0x06,0xF0, + 0x23,0xFB,0x12,0x49,0xE8,0x68,0xC8,0x61,0x28,0x69,0xC8,0x61,0x10,0x48,0xC2,0x68, + 0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B,0x0F,0x48,0x02,0xE0,0xDA,0x68,0x82,0x42, + 0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5,0x48,0x68,0x80,0x07,0xFC,0xD5,0x01,0xF0, + 0xA7,0xFE,0x01,0x20,0x00,0xF0,0x6E,0xF8,0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00, + 0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x76,0xF9,0x1C,0x48,0x03,0x27,0x04,0x04,0x24,0x0C, + 0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00, + 0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0, + 0xE5,0xFB,0x14,0x99,0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90, + 0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90, + 0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1, + 0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8, + 0x06,0xF0,0x10,0xFC,0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00, + 0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00,0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20, + 0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5, + 0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA, + 0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20, + 0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20, + 0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40,0xF0,0xB5,0xFF,0xB0,0x00,0x20,0xCC,0xB0, + 0xBC,0x90,0x40,0x1E,0xB8,0x90,0xFF,0x48,0xFF,0x4A,0x00,0x68,0xFF,0x4F,0x60,0x30, + 0xC1,0x7D,0xFF,0x4C,0x05,0x91,0x01,0x7E,0x12,0x88,0x89,0x18,0x09,0x06,0x09,0x0E, + 0x04,0x91,0x41,0x7E,0x03,0x91,0x80,0x7E,0x02,0x90,0x00,0x20,0x3D,0x79,0x01,0x26, + 0x01,0x90,0x14,0xE0,0x0A,0x20,0x70,0x43,0x0B,0x21,0xC0,0x19,0x89,0x01,0x41,0x18, + 0x09,0x7C,0x00,0x29,0x0A,0xD0,0xF3,0x49,0x40,0x18,0x02,0xF0,0x45,0xFE,0x00,0x28, + 0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x7A, + 0xB0,0x42,0xE7,0xDA,0xEC,0x48,0x01,0x88,0x82,0x88,0x8E,0x1A,0x00,0x2E,0x00,0xDC, + 0x56,0x1A,0x41,0x88,0xC0,0x88,0x36,0x04,0x36,0x0C,0x0A,0x1A,0x00,0x2A,0x00,0xDC, + 0x42,0x1A,0xE5,0x49,0x10,0x04,0x20,0x39,0x00,0x22,0xCA,0x91,0x8A,0x77,0x01,0x99, + 0x00,0x0C,0x00,0x29,0x0C,0xD0,0x1E,0x2E,0x0A,0xD2,0x32,0x28,0x01,0xD2,0x01,0x21, + 0x04,0xE0,0x64,0x28,0x01,0xD2,0x02,0x21,0x00,0xE0,0x03,0x21,0xCA,0x98,0x81,0x77, + 0xCA,0x98,0x40,0x7F,0x00,0x28,0x12,0xD1,0xCA,0x98,0x80,0x7F,0x01,0x28,0x02,0xD1, + 0x05,0x98,0x80,0x1C,0x08,0xE0,0x02,0x28,0x02,0xD1,0x05,0x98,0x00,0x1D,0x03,0xE0, + 0x03,0x28,0x04,0xD1,0x05,0x98,0x80,0x1D,0x00,0x06,0x00,0x0E,0x05,0x90,0x0D,0x22, + 0x00,0x21,0xB4,0xA8,0x04,0xF0,0xFC,0xFA,0xF8,0x88,0xFF,0x21,0x09,0x31,0x08,0x42, + 0x01,0xD1,0xC0,0x06,0x06,0xD5,0x01,0xF0,0x89,0xF8,0x7F,0xB0,0x4C,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xE0,0x7A,0x00,0x28,0x01,0xD0,0x40,0x1E,0xE0,0x72,0x60,0x7A, + 0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0,0x18,0xE0,0x00,0x28,0x16,0xD1,0xBC,0x48, + 0x82,0x22,0x00,0x21,0x8E,0x30,0x04,0xF0,0xDB,0xFA,0xE0,0x7A,0x00,0x28,0x0C,0xD1, + 0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E,0x0A,0x00,0x14,0x23,0xB4,0xA8,0xFF,0xF7, + 0x91,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD,0x25,0x72,0xE6,0xE1,0x0D,0x22,0x01,0x21, + 0xB0,0xA8,0x04,0xF0,0xC5,0xFA,0x02,0x20,0xAE,0x49,0x06,0x90,0xAB,0x48,0x89,0x31, + 0x41,0x18,0xC9,0x91,0xAB,0x49,0x7C,0x31,0x40,0x18,0xC8,0x90,0x14,0xE1,0x0C,0x26, + 0x07,0xAF,0x34,0x20,0x70,0x43,0x07,0xA9,0x40,0x18,0x00,0x21,0x34,0x22,0xC9,0x43, + 0x04,0xF0,0xAE,0xFA,0x76,0x1E,0xF4,0xD5,0x06,0x98,0x01,0xF0,0x5D,0xFC,0x01,0x27, + 0xB9,0x90,0x54,0xE0,0xB9,0x98,0x01,0x26,0xBA,0x90,0x4C,0xE0,0x0A,0x20,0x70,0x43, + 0x9A,0x4A,0x0B,0x21,0x80,0x18,0x89,0x01,0x41,0x18,0xC7,0x91,0x09,0x7C,0x00,0x29, + 0x40,0xD0,0x98,0x49,0x40,0x18,0xC6,0x90,0x02,0xF0,0x8E,0xFD,0x06,0x99,0x08,0x43, + 0x07,0xD0,0xC6,0x98,0x02,0xF0,0x88,0xFD,0x00,0x28,0x33,0xD0,0x06,0x98,0x00,0x28, + 0x30,0xD0,0x8E,0x49,0x78,0x00,0x40,0x18,0xC5,0x90,0xE0,0x30,0x80,0x8A,0x0A,0x21, + 0xFF,0xF7,0x7C,0xFB,0xC7,0x99,0x49,0x8A,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A, + 0xBB,0x92,0xC5,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x6E,0xFB, + 0xC7,0x99,0x8A,0x8A,0x11,0x1A,0x00,0x29,0x00,0xDC,0x81,0x1A,0xBB,0x9A,0x10,0x00, + 0x50,0x43,0x0A,0x00,0x4A,0x43,0xBA,0x99,0x80,0x18,0x88,0x42,0x04,0xDA,0x34,0x21, + 0x79,0x43,0x07,0xAA,0x56,0x50,0xBA,0x90,0x34,0x21,0x79,0x43,0x07,0xAA,0x89,0x18, + 0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x7A,0xB0,0x42,0xAF,0xDA,0x7F,0x1C,0xAF,0x42, + 0xA8,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x22,0xB9,0x99,0x10,0x00,0x15,0xE0,0xB4,0xAE, + 0x33,0x5C,0x00,0x2B,0x10,0xD1,0x34,0x23,0x06,0x00,0x5E,0x43,0x07,0xAB,0xF7,0x18, + 0x9E,0x59,0xB3,0x00,0xFF,0x58,0x8F,0x42,0x06,0xDA,0x00,0x2F,0x04,0xDB,0x00,0x2E, + 0x02,0xDB,0x39,0x00,0x00,0x22,0xB8,0x90,0x40,0x1C,0xA8,0x42,0xE7,0xDD,0x00,0x2A, + 0x7E,0xD1,0xBC,0x98,0x34,0x21,0x40,0x1C,0xBC,0x90,0xB8,0x98,0x5F,0x4F,0x48,0x43, + 0x07,0xA9,0xC4,0x90,0x08,0x58,0x0A,0x21,0x48,0x43,0x5E,0x49,0xC0,0x19,0x88,0x39, + 0x41,0x18,0xB8,0x98,0x0A,0x22,0x50,0x43,0xC6,0x19,0x30,0x00,0xFF,0x30,0xCD,0x30, + 0x04,0xF0,0xE2,0xF9,0xB8,0x98,0x0A,0x21,0x40,0x00,0xC0,0x19,0xC3,0x90,0xE0,0x30, + 0x80,0x8A,0xFF,0xF7,0x0B,0xFB,0xFF,0x36,0xC1,0x36,0xF0,0x81,0xC3,0x98,0x0A,0x21, + 0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7,0x01,0xFB,0x30,0x82,0xB8,0x98,0x38,0x18, + 0xFF,0x30,0x41,0x30,0x00,0x7E,0x70,0x73,0xB0,0x7C,0x05,0x99,0x49,0x1C,0x88,0x42, + 0x01,0xD2,0x40,0x1C,0xB0,0x74,0xB7,0x7C,0x13,0x2F,0x09,0xD9,0x14,0x21,0x38,0x00, + 0xFF,0xF7,0xEC,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42,0x01,0xD2,0x14,0x37,0xB7,0x74, + 0x30,0x7B,0xB8,0x9A,0xB4,0xA9,0x88,0x54,0xC9,0x9A,0xB8,0x99,0x81,0x54,0x31,0x7B, + 0xC8,0x9A,0x00,0x20,0x88,0x54,0xC4,0x99,0x07,0xAA,0x51,0x58,0xB0,0xAA,0x50,0x54, + 0x01,0x21,0x23,0xE0,0x08,0x00,0x34,0x23,0x58,0x43,0xC4,0x9B,0x07,0xAE,0xC2,0x90, + 0xF3,0x58,0x00,0x22,0x80,0x19,0xD2,0x43,0x9B,0x00,0x84,0x46,0xC2,0x50,0xB4,0xA8, + 0x40,0x5C,0xB9,0x9E,0x00,0x28,0x10,0xD1,0xA7,0x7A,0x01,0x20,0x0B,0xE0,0x83,0x00, + 0x62,0x46,0xD2,0x58,0x00,0x2A,0x05,0xDB,0xB2,0x42,0x03,0xDA,0xC2,0x9B,0x07,0xAE, + 0xF0,0x50,0x16,0x00,0x40,0x1C,0x87,0x42,0xF1,0xDA,0x49,0x1C,0xA9,0x42,0x00,0xE0, + 0x04,0xE0,0xD7,0xDD,0xA0,0x7A,0xBC,0x99,0x88,0x42,0x05,0xDD,0xBE,0x98,0x40,0x1C, + 0xA8,0x42,0xBE,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98,0x41,0x1E,0x09,0x06,0x09,0x0E, + 0x00,0x28,0x06,0x91,0x00,0xD0,0xE2,0xE6,0x01,0x26,0xBF,0x96,0xBD,0x90,0x6E,0xE0, + 0xB0,0xA8,0x80,0x5D,0x00,0x28,0x69,0xD0,0xBF,0x98,0x14,0x49,0x28,0x18,0xBE,0x90, + 0x0A,0x20,0x70,0x43,0x47,0x18,0x0B,0x20,0x80,0x01,0x38,0x18,0xC1,0x90,0x00,0x7C, + 0xC8,0x99,0x40,0x5C,0x03,0x99,0x88,0x42,0x43,0xD2,0xBE,0x98,0x0C,0x28,0x40,0xDC, + 0x0C,0x48,0x38,0x18,0x02,0xF0,0x78,0xFC,0x00,0x28,0x3A,0xD0,0xC1,0x98,0xC8,0x99, + 0x00,0x7C,0xC8,0x9B,0x05,0x4A,0x41,0x5C,0x49,0x1C,0xC1,0x54,0x2D,0x20,0x00,0x01, + 0x39,0x18,0x0B,0xE0,0xC8,0x07,0x00,0x20,0x00,0x07,0x00,0x20,0x40,0x00,0x00,0x20, + 0x00,0x02,0x00,0x20,0xD6,0x02,0x00,0x00,0xC0,0x03,0x00,0x20,0xBE,0x98,0x0A,0x23, + 0x58,0x43,0x80,0x18,0xC0,0x90,0xFF,0x30,0xCD,0x30,0x1A,0x00,0x04,0xF0,0x24,0xF9, + 0x09,0x20,0x80,0x01,0x39,0x18,0xC0,0x98,0x4A,0x7D,0xFF,0x30,0xC1,0x30,0xC2,0x74, + 0x89,0x7D,0x01,0x75,0xC1,0x98,0xBE,0x9A,0x00,0x7C,0xB4,0xA9,0x88,0x54,0xC9,0x9A, + 0xBE,0x99,0x81,0x54,0xBF,0x98,0x40,0x1C,0xBF,0x90,0xBD,0x98,0x40,0x1C,0xBD,0x90, + 0x14,0xE0,0x32,0x48,0x38,0x18,0x02,0xF0,0x37,0xFC,0x00,0x28,0x0E,0xD0,0xCA,0x99, + 0x01,0x20,0x08,0x77,0xC1,0x99,0x2E,0x48,0x89,0x7D,0x13,0x29,0x06,0xD9,0x61,0x7A, + 0x01,0x29,0x03,0xD1,0xC1,0x88,0x04,0x22,0x11,0x43,0xC1,0x80,0x76,0x1C,0xA0,0x7A, + 0xB0,0x42,0x8D,0xDA,0x26,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5,0x02,0x99,0x04,0x22, + 0xE1,0x72,0x23,0x49,0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0,0xB4,0xA8,0x80,0x5D, + 0x00,0x28,0x1A,0xD1,0x0D,0x22,0x01,0x20,0x92,0x01,0x1B,0x27,0x7F,0x01,0x1C,0x49, + 0x09,0x18,0x8B,0x18,0xDB,0x7F,0x00,0x2B,0x0C,0xD1,0xC9,0x19,0x09,0x7B,0x00,0x29, + 0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23,0xB4,0xA8,0xFF,0xF7, + 0xC1,0xFA,0x02,0xE0,0x40,0x1C,0x0D,0x28,0xE9,0xDB,0xE0,0x7A,0x00,0x28,0x0E,0xD0, + 0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18,0x38,0x00,0xFF,0x30,0xD3,0x30,0x02,0xF0, + 0xEB,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20,0xFF,0x37,0xC1,0x37,0xB8,0x74,0x76,0x1C, + 0xAE,0x42,0xCB,0xDD,0xBD,0x98,0x28,0x18,0x20,0x72,0x20,0x7A,0x05,0x49,0x82,0x22, + 0xA0,0x72,0xC8,0x1D,0xFD,0x30,0x04,0xF0,0xA7,0xF8,0xE6,0xE5,0xD6,0x02,0x00,0x00, + 0x40,0x00,0x00,0x20,0x0C,0x02,0x00,0x20,0xF1,0xB5,0x38,0x48,0x86,0xB0,0x05,0x90, + 0x00,0x20,0x04,0x90,0x36,0x48,0x41,0x7F,0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F, + 0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99, + 0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90, + 0x01,0xF0,0x86,0xF9,0x01,0xF0,0x5C,0xFA,0x00,0x24,0x27,0x00,0x00,0x26,0x31,0x00, + 0x38,0x00,0x02,0xF0,0xB3,0xF8,0x00,0x28,0x28,0xD0,0x0E,0x21,0x79,0x43,0x05,0x9A, + 0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28, + 0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0xB2,0xFD, + 0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D, + 0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0xA4,0xFD,0x40,0x1C,0x06,0xD1, + 0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C, + 0x0E,0x2E,0xCC,0xD3,0x7F,0x1C,0x15,0x2F,0xC8,0xD3,0x20,0x00,0xFF,0x38,0x27,0x38, + 0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C, + 0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xB2,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0, + 0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x20,0x93,0x00,0x00,0xF0,0xB5,0x7B,0x4A,0xFF,0xB0,0xBC,0xB0,0x40,0x18,0xB9,0x92, + 0x42,0x00,0x80,0x18,0xB8,0x90,0x48,0x42,0xB7,0x90,0x77,0x48,0x77,0x4E,0x07,0x7F, + 0x02,0xA8,0x01,0x90,0x76,0x48,0xBA,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0xB7,0x98, + 0x40,0x42,0xB7,0x90,0x73,0x4A,0x00,0x21,0x30,0x00,0x04,0xF0,0x51,0xF8,0x00,0x25, + 0x00,0x24,0x6F,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x14,0xD0,0x6E,0x49,0x09,0x78, + 0x00,0x29,0x16,0xD0,0xBD,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D, + 0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0, + 0x80,0x7E,0xA0,0x42,0x16,0xD1,0xB7,0x9A,0x21,0x00,0x28,0x00,0x05,0xF0,0x3A,0xFD, + 0x10,0xE0,0xBC,0x42,0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42, + 0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E, + 0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x0E,0x2C,0xCB,0xD3,0x6D,0x1C,0x15,0x2D,0xC7,0xD3, + 0x01,0xF0,0xD6,0xF8,0x01,0xF0,0xAC,0xF9,0x00,0x25,0x00,0x24,0x0E,0x20,0x2F,0x00, + 0x47,0x43,0x21,0x00,0x28,0x00,0x02,0xF0,0x01,0xF8,0x00,0x28,0x0F,0xD0,0xB9,0x9B, + 0x3A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A, + 0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00, + 0x28,0x00,0x02,0xF0,0x2B,0xF8,0x39,0x19,0x01,0x9A,0x49,0x00,0x64,0x1C,0x0E,0x2C, + 0x50,0x52,0xDE,0xD3,0x6D,0x1C,0x15,0x2D,0xD7,0xD3,0x00,0x20,0x00,0x90,0x01,0xF0, + 0x7F,0xF9,0x00,0x25,0x00,0x24,0x21,0x00,0x28,0x00,0x01,0xF0,0xD7,0xFF,0x00,0x28, + 0x3E,0xD0,0x0E,0x21,0x69,0x43,0xB9,0x9B,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04, + 0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0, + 0x40,0x1A,0x57,0x00,0xF1,0x5B,0x00,0x04,0x00,0x0C,0x81,0x42,0x06,0xD9,0xF0,0x53, + 0x21,0x00,0x28,0x00,0x01,0xF0,0xFA,0xFF,0x01,0x99,0xC8,0x53,0x00,0x98,0x03,0x21, + 0xFF,0xF7,0xAC,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0xBA,0x98,0x00,0x7D, + 0x00,0x28,0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00, + 0x28,0x00,0x05,0xF0,0x8F,0xFC,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00, + 0x28,0x00,0x05,0xF0,0x87,0xFC,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7, + 0x64,0x1C,0x0E,0x2C,0xB7,0xD3,0x6D,0x1C,0x15,0x2D,0xB3,0xD3,0x00,0x98,0x40,0x1C, + 0x00,0x90,0xB8,0x98,0x40,0x1E,0xB8,0x90,0x18,0xD2,0x00,0x25,0x00,0x24,0x0E,0x20, + 0x2E,0x00,0x46,0x43,0x01,0x99,0x30,0x19,0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00, + 0x05,0xF0,0x84,0xFC,0x64,0x1C,0x0E,0x2C,0xF4,0xD3,0x6D,0x1C,0x15,0x2D,0xED,0xD3, + 0x7F,0xB0,0x3C,0xB0,0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x01,0xF0,0x38,0xF8, + 0x8D,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x60,0x06,0x00,0x20,0x00,0x00,0x00,0x10, + 0x20,0x93,0x00,0x00,0xD2,0x02,0x00,0x00,0x18,0x07,0x00,0x20,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20, + 0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x79,0x00,0x28,0x3C,0xD0,0x00,0x21,0x0D,0x25, + 0x1F,0x4F,0xED,0x01,0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x79,0x1B,0x0F, + 0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19,0xA4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42, + 0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19,0x80,0x68,0x92,0x0A,0x83,0x05,0x92,0x02, + 0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43, + 0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46, + 0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x60,0x48,0x8E,0x46, + 0x02,0x8C,0x60,0x49,0x40,0x8C,0x01,0x91,0x4B,0x8B,0x20,0x39,0x00,0x91,0x89,0x7B, + 0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71, + 0xAA,0xE0,0x01,0x99,0x09,0x7E,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29, + 0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00, + 0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88, + 0xA1,0x88,0x87,0x42,0x5C,0xDC,0x82,0x42,0x5A,0xDB,0x8C,0x45,0x58,0xDC,0x8B,0x42, + 0x56,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A,0x7B,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0, + 0x02,0x2A,0x18,0xD0,0x03,0x2A,0x76,0xD1,0xE2,0x79,0xD3,0x07,0x2D,0xD0,0x01,0x2A, + 0x01,0xD0,0x05,0x2A,0x27,0xD1,0x09,0x20,0x00,0x25,0xE0,0x71,0x6B,0xE0,0x00,0x9A, + 0x92,0x7A,0x00,0x2A,0x67,0xD1,0x00,0xF0,0x8B,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20, + 0xE0,0x71,0x26,0x72,0x5F,0xE0,0xE2,0x79,0xD3,0x07,0xE8,0xD1,0x92,0x07,0x5A,0xD5, + 0x00,0xF0,0x7E,0xF8,0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00, + 0x20,0x00,0xE7,0x71,0xFF,0xF7,0x24,0xF8,0xEB,0xE7,0x31,0x00,0x20,0x00,0xE7,0x71, + 0xFF,0xF7,0x1E,0xF8,0x47,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0, + 0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1, + 0x0A,0x20,0xE0,0x71,0x20,0x00,0xFF,0xF7,0x0B,0xF8,0xA6,0x71,0x05,0xE0,0x00,0x29, + 0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0, + 0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28, + 0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07, + 0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0xE7,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xDB,0xFF,0x01,0x25,0xA6,0x71,0x02,0xE0, + 0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79, + 0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x03,0x48,0xC0,0x68, + 0x40,0x07,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0xC0,0x68,0xC0,0x07,0x00,0xD0,0x01,0x20,0x70,0x47,0x00,0x90,0x00,0x40, + 0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x7B,0x00,0x22,0x10,0x00,0x00,0x2E,0x23,0xD0, + 0x1B,0x7A,0x00,0x2B,0x20,0xD1,0x12,0x4F,0x1C,0xE0,0xD3,0x00,0xDD,0x19,0x03,0x23, + 0x5B,0x02,0xEB,0x18,0x10,0x25,0x5D,0x5F,0xA5,0x42,0x0E,0xDC,0x14,0x25,0x5D,0x5F, + 0xA5,0x42,0x0A,0xDB,0x12,0x25,0x5D,0x5F,0x8D,0x42,0x06,0xDC,0x16,0x25,0x5D,0x5F, + 0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C, + 0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8,0xF0,0xBC,0x70,0x47,0x40,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8D,0xB0,0xBC,0x4E,0x0A,0x90,0x09,0x90, + 0x30,0x68,0x01,0x88,0x08,0x91,0x01,0x00,0x40,0x31,0xCA,0x7F,0x60,0x30,0x07,0x92, + 0x8A,0x7F,0x06,0x92,0x40,0x78,0x05,0x90,0x88,0x7D,0x04,0x90,0xB4,0x48,0xC1,0x88, + 0x00,0x79,0x0A,0x07,0x05,0xD5,0xB2,0x4A,0x00,0x28,0x02,0xD1,0x08,0x23,0x99,0x43, + 0xD1,0x80,0xB0,0x4D,0x00,0x21,0x69,0x5E,0xFF,0x22,0x01,0x32,0x28,0x29,0x03,0xDD, + 0x02,0x21,0x69,0x5E,0x1E,0x29,0x03,0xDC,0x04,0x21,0x69,0x5E,0x28,0x29,0x05,0xDD, + 0xA7,0x4B,0xD9,0x88,0x11,0x43,0xD9,0x80,0x0F,0x21,0x04,0xE0,0x06,0x21,0x69,0x5E, + 0x00,0x29,0x02,0xD0,0x49,0x1E,0xE9,0x80,0x03,0xE0,0xA1,0x4B,0xD9,0x88,0x91,0x43, + 0xD9,0x80,0x08,0x99,0x89,0x04,0x7E,0xD5,0x6A,0x7A,0x00,0x21,0x00,0x2A,0x02,0xD1, + 0x00,0x28,0x00,0xD1,0x01,0x21,0x01,0x91,0x00,0xF0,0x42,0xF9,0x98,0x48,0x9A,0x4C, + 0x00,0x79,0x01,0x28,0x0C,0x90,0x4D,0xD1,0x95,0x49,0x09,0x89,0x0B,0x91,0x35,0x68, + 0x40,0x35,0x6A,0x8B,0x91,0x42,0x00,0xD3,0x00,0x20,0x03,0x90,0x0B,0x98,0x0A,0x22, + 0x02,0x21,0x50,0x43,0x61,0x5E,0x0F,0x00,0xFE,0xF7,0x60,0xFD,0x29,0x7C,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x02,0x90,0x0B,0x98,0x0A,0x21,0xC0,0x1B, + 0xFE,0xF7,0x54,0xFD,0x69,0x7C,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20, + 0x07,0x00,0x85,0x48,0xAB,0x7C,0x20,0x38,0x80,0x8B,0x01,0x21,0x98,0x42,0x00,0xD8, + 0x00,0x21,0xEB,0x7C,0x62,0x68,0x01,0x20,0x9A,0x42,0x00,0xDB,0x00,0x20,0x03,0x9A, + 0x00,0x2A,0x2A,0xD0,0x02,0x9A,0x00,0x2A,0x27,0xD0,0x00,0x2F,0x25,0xD0,0x00,0x29, + 0x23,0xD0,0x77,0x4A,0x01,0x21,0xC0,0x32,0xD2,0x6A,0x00,0x2A,0x00,0xD0,0x00,0x21, + 0x01,0x42,0x1A,0xD0,0x60,0x78,0x00,0x28,0x2F,0xD0,0x69,0x7E,0x88,0x42,0x2C,0xD8, + 0x40,0x1E,0x29,0xE0,0x01,0x28,0x10,0xD9,0x68,0x7A,0x01,0x28,0x0D,0xD9,0x31,0x68, + 0x60,0x78,0x40,0x31,0xC9,0x7D,0x88,0x42,0x01,0xD2,0x40,0x1C,0x60,0x70,0x60,0x78, + 0x00,0x28,0x02,0xD0,0x20,0x78,0x40,0x1E,0x20,0x70,0x31,0x68,0x60,0x68,0x40,0x31, + 0x0A,0x7D,0x90,0x42,0x11,0xDB,0x0C,0x98,0x61,0x4A,0x00,0x28,0x0D,0xD0,0xD0,0x88, + 0xC0,0x06,0x0A,0xD4,0x00,0xE0,0x26,0xE0,0x60,0x78,0xC9,0x7D,0x88,0x42,0x04,0xD2, + 0x04,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C,0x60,0x70,0x60,0x78,0x04,0x99,0x10,0x23, + 0x88,0x42,0x0B,0xD8,0x01,0x98,0x00,0x28,0x08,0xD1,0x55,0x49,0xC8,0x88,0x18,0x43, + 0xC8,0x80,0x30,0x68,0x40,0x30,0x00,0x7E,0x20,0x70,0x0F,0xE0,0x50,0x4A,0xD0,0x88, + 0xC1,0x06,0x0B,0xD5,0x21,0x78,0x00,0x29,0x06,0xD1,0x98,0x43,0xD0,0x80,0x30,0x68, + 0x40,0x30,0x40,0x7D,0x60,0x70,0x01,0xE0,0x49,0x1E,0x21,0x70,0x48,0x4F,0x38,0x79, + 0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5,0x05,0x99,0x06,0x98,0x40,0x1A, + 0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x50,0x00,0xC0,0x19,0x84,0x46,0xFF,0x30, + 0xA1,0x30,0xC0,0x88,0x00,0x28,0x68,0xD0,0x07,0x99,0x88,0x42,0x09,0xD9,0x08,0x98, + 0x80,0x07,0x62,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88,0x08,0x21,0x08,0x43,0xF8,0x80, + 0x5B,0xE0,0x06,0x99,0x88,0x42,0x58,0xD3,0x08,0x98,0x40,0x07,0x55,0xD5,0x00,0x23, + 0x01,0x20,0x29,0xE0,0xFF,0x24,0x39,0x18,0x9A,0x34,0x64,0x5C,0x94,0x42,0x22,0xD1, + 0x5B,0x1C,0xFF,0x31,0x41,0x31,0x09,0x7E,0x0A,0x91,0x01,0x00,0x14,0xE0,0x4C,0x00, + 0xE4,0x19,0x25,0x00,0xE0,0x35,0xEE,0x8A,0xFF,0x34,0x01,0x34,0xAE,0x82,0x26,0x8A, + 0xE6,0x81,0x7C,0x18,0x25,0x00,0xFF,0x35,0x41,0x35,0x6E,0x7E,0xFF,0x34,0x81,0x34, + 0x2E,0x76,0xA6,0x7E,0x49,0x1C,0x66,0x76,0x3C,0x79,0x8C,0x42,0xE7,0xDA,0x39,0x79, + 0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD2,0xDA,0x00,0x2B, + 0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21,0x08,0x43, + 0xF8,0x80,0x60,0x46,0xFF,0x30,0x61,0x30,0x41,0x89,0x38,0x79,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xE0,0x30,0x81,0x82,0x60,0x46,0xFF,0x30, + 0x81,0x30,0x41,0x88,0x38,0x79,0x40,0x00,0xC0,0x19,0xFF,0x30,0x01,0x30,0xC1,0x81, + 0x3B,0x79,0x0C,0x49,0x0A,0x98,0x68,0x39,0x58,0x54,0x52,0x1C,0x0C,0x2A,0x8B,0xDB, + 0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43, + 0xF8,0x80,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC8,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x06,0x00,0x20,0x03,0x48,0xC0,0x68, + 0x00,0x03,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47,0x00,0x90,0x00,0x40, + 0xF0,0xB5,0x59,0x48,0xB7,0xB0,0x00,0x68,0x00,0x21,0x60,0x30,0x45,0x79,0x07,0x79, + 0x56,0x48,0x31,0x95,0x36,0x90,0x41,0x80,0x36,0x98,0x41,0x60,0x30,0x91,0x60,0x21, + 0x18,0xA8,0x03,0xF0,0x0F,0xFC,0x60,0x21,0x68,0x46,0x03,0xF0,0x0B,0xFC,0x31,0x9D, + 0x0E,0x21,0x48,0x1B,0x33,0x90,0x58,0xE0,0x15,0x21,0xC9,0x1B,0x35,0x91,0x31,0x99, + 0x38,0x00,0x69,0x1A,0x8C,0x00,0x17,0xE0,0x49,0x4A,0x6B,0x00,0x9E,0x18,0xB8,0x23, + 0xF3,0x5E,0x0E,0x21,0x46,0x00,0x41,0x43,0xB2,0x18,0x88,0x26,0x96,0x5F,0x49,0x19, + 0x09,0x04,0x9A,0x19,0x43,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E,0x51,0x18,0x18,0xAA, + 0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51,0x35,0x99,0x81,0x42,0xE4,0xDC,0x78,0x00, + 0x15,0x21,0x09,0x1A,0x18,0xAE,0x34,0x90,0x30,0x59,0xFE,0xF7,0xEF,0xFB,0x30,0x51, + 0x3E,0x00,0x84,0x46,0x19,0xE0,0x0E,0x20,0x70,0x43,0x36,0x49,0x40,0x19,0x40,0x00, + 0x09,0x5E,0x60,0x46,0x6A,0x00,0x09,0x1A,0x31,0x48,0x13,0x18,0xB8,0x22,0x9A,0x5E, + 0x73,0x00,0x1B,0x18,0x88,0x20,0x18,0x5E,0x10,0x18,0x09,0x18,0x0B,0x00,0x4B,0x43, + 0x68,0x46,0x02,0x59,0xD1,0x18,0x76,0x1C,0x01,0x51,0x35,0x98,0xB0,0x42,0xE2,0xDC, + 0x34,0x98,0x14,0x21,0x09,0x1A,0x6E,0x46,0x30,0x59,0xFE,0xF7,0xC7,0xFB,0x30,0x51, + 0x30,0x99,0x40,0x18,0x30,0x90,0x33,0x98,0x6D,0x1C,0xA8,0x42,0xA4,0xDC,0x79,0x00, + 0x15,0x20,0x41,0x1A,0x31,0x98,0x0E,0x22,0x40,0x00,0x14,0x1A,0x61,0x43,0x32,0x90, + 0x30,0x98,0xFE,0xF7,0xB3,0xFB,0x05,0x04,0x36,0x98,0x2D,0x14,0x45,0x80,0x30,0x98, + 0x21,0x00,0xFE,0xF7,0xAB,0xFB,0x00,0x21,0x6B,0x46,0x0A,0xE0,0x8A,0x00,0x9A,0x58, + 0x82,0x1A,0x16,0x00,0x56,0x43,0x36,0x9A,0x52,0x68,0xB2,0x18,0x36,0x9E,0x49,0x1C, + 0x72,0x60,0x8C,0x42,0xF2,0xDC,0x32,0x98,0x0D,0x21,0x09,0x1A,0x36,0x98,0x40,0x68, + 0xFE,0xF7,0x94,0xFB,0x15,0x22,0x33,0x99,0xD2,0x1B,0x92,0x02,0x51,0x43,0xFE,0xF7, + 0x8D,0xFB,0x36,0x99,0x00,0x2D,0x48,0x60,0x02,0xD1,0x36,0x98,0x6D,0x1C,0x45,0x80, + 0x37,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC8,0x07,0x00,0x20,0x40,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0x00,0x25,0x01,0x26,0x76,0x07, + 0x34,0x68,0x1B,0x48,0x00,0x68,0x00,0x88,0xC0,0x05,0x24,0xD5,0x19,0x48,0x00,0x78, + 0x00,0x28,0x20,0xD1,0x01,0x2C,0x01,0xD1,0x01,0x27,0x02,0xE0,0x01,0x2C,0x1B,0xD9, + 0x02,0x27,0x15,0x48,0x80,0x79,0xA0,0x42,0x15,0xD1,0x00,0x23,0x10,0xE0,0xD8,0x19, + 0x80,0x00,0x80,0x19,0x00,0x68,0x11,0x49,0x00,0x90,0x98,0x00,0x40,0x18,0xD1,0x21, + 0xC9,0x00,0x40,0x18,0x69,0x46,0x00,0xF0,0xCF,0xF9,0x01,0x28,0x03,0xD0,0x5B,0x1C, + 0xA3,0x42,0xEC,0xD3,0x00,0xE0,0x01,0x25,0x04,0xF0,0x58,0xFB,0x00,0x2D,0x03,0xD0, + 0x34,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x30,0x60,0xF9,0xE7,0x00,0x00, + 0xC8,0x07,0x00,0x20,0x1E,0x07,0x00,0x20,0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF8,0xB5,0x64,0x4E,0x00,0x25,0x30,0x7A,0x00,0x28,0x06,0xD0,0xF0,0x6A,0x00,0x04, + 0x00,0x0C,0x05,0xF0,0xD1,0xFB,0x05,0xF0,0xBF,0xFB,0x04,0xF0,0xD5,0xF9,0x04,0xF0, + 0xED,0xFE,0x5D,0x4F,0xAA,0xE0,0x5D,0x48,0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68, + 0x00,0x29,0x0A,0xD0,0xC0,0x68,0x07,0x28,0x05,0xD1,0x58,0x48,0xC0,0x68,0x01,0x21, + 0x49,0x07,0xC8,0x63,0x9E,0xE0,0x04,0xF0,0xFB,0xFA,0x30,0x7A,0x00,0x28,0x04,0xD0, + 0xF0,0x6A,0x00,0x04,0x00,0x0C,0x05,0xF0,0xAF,0xFB,0xFF,0x20,0x81,0x30,0xFE,0xF7, + 0x79,0xFF,0x03,0x20,0x05,0xF0,0x18,0xFA,0x4D,0x4C,0xE0,0x88,0x01,0x06,0x01,0xD5, + 0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x04,0x20,0x00,0xE0,0x02,0x20,0x05,0xF0, + 0xCB,0xF8,0x00,0xF0,0x43,0xFC,0x04,0xF0,0xCF,0xFE,0x05,0xF0,0xB3,0xF8,0x00,0xF0, + 0xEF,0xFB,0x00,0xF0,0xC5,0xFC,0x70,0x7B,0x00,0x28,0x04,0xD1,0x38,0x7B,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x9D,0xF9,0x38,0x7A,0x00,0x28,0x01,0xD0,0x03,0xF0,0x30,0xFB, + 0x03,0xF0,0x4A,0xFB,0x00,0x28,0x01,0xD0,0x01,0x20,0x30,0x70,0x30,0x78,0x00,0x28, + 0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0xA6,0xF9,0x30,0x78,0x00,0x28, + 0x05,0xD0,0x70,0x7B,0x00,0x09,0x04,0x28,0x54,0xD1,0x00,0x20,0x30,0x70,0x03,0x20, + 0x05,0xF0,0xB4,0xF9,0xB0,0x62,0x03,0x20,0x05,0xF0,0xE2,0xF9,0xFF,0x20,0x81,0x30, + 0xFE,0xF7,0x28,0xFF,0xE0,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xE0,0x83,0x3D,0xE0, + 0x70,0x79,0x00,0x28,0x3A,0xD1,0x34,0x6A,0x00,0x2C,0x37,0xD0,0x28,0x00,0x6D,0x1C, + 0x64,0x28,0xB0,0x6A,0x23,0x49,0x07,0xDB,0x48,0x43,0x23,0x49,0xFE,0xF7,0xD6,0xFB, + 0x0F,0x21,0xC9,0x01,0x0C,0x1A,0x04,0xE0,0x48,0x43,0x1F,0x49,0xFE,0xF7,0xCE,0xFB, + 0x24,0x1A,0x14,0x2C,0x22,0xDD,0x04,0xF0,0x3B,0xF9,0x20,0x00,0x05,0xF0,0x4A,0xFB, + 0x05,0xF0,0x4E,0xFB,0xB0,0x79,0x00,0x28,0x0D,0xD0,0x04,0xF0,0x0F,0xF9,0x04,0xF0, + 0x12,0xF9,0x04,0xF0,0x1A,0xF9,0x15,0x4C,0x01,0x20,0x60,0x60,0xFE,0xF7,0x02,0xFF, + 0x13,0x48,0x60,0x60,0x03,0xE0,0x13,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x05,0xF0, + 0x3E,0xFB,0x10,0x49,0x00,0x20,0x08,0x70,0x04,0xF0,0x26,0xF9,0x30,0x78,0x00,0x28, + 0x00,0xD1,0x50,0xE7,0x30,0x7A,0x00,0x28,0x01,0xD0,0x05,0xF0,0x0D,0xFB,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x07,0x00,0x20,0x80,0x93,0x00,0x00,0x00,0x40,0x00,0x30, + 0x40,0x00,0x00,0x20,0x40,0x01,0x00,0x00,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xCC,0x07,0x00,0x20,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43, + 0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x34,0x33,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x28,0x3C,0xA3,0x52,0x22,0x00,0x1A,0x32, + 0x13,0x54,0x18,0x00,0x76,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E, + 0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xC8,0x0A,0x00,0x20,0x10,0xB5,0x0C,0x48, + 0x0D,0x22,0x00,0x21,0x03,0xF0,0x64,0xFA,0x0A,0x48,0x82,0x22,0x00,0x21,0x03,0xF0, + 0x5F,0xFA,0x08,0x48,0x00,0x24,0x0C,0x38,0x04,0x72,0x07,0x48,0x28,0x22,0x21,0x00, + 0x03,0xF0,0x56,0xFA,0x04,0x48,0x42,0x38,0x44,0x72,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x9F,0x03,0x00,0x20,0x0C,0x02,0x00,0x20,0x82,0x06,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x1A,0x22,0x00,0x21,0x03,0xF0,0x44,0xFA,0x14,0x48,0x1A,0x22,0x00,0x21,0x1A,0x30, + 0x03,0xF0,0x3E,0xFA,0x11,0x48,0x0D,0x22,0x00,0x21,0x64,0x30,0x03,0xF0,0x38,0xFA, + 0x0E,0x48,0x30,0x22,0x00,0x21,0x34,0x30,0x03,0xF0,0x32,0xFA,0x0B,0x48,0x18,0x22, + 0x00,0x21,0x76,0x30,0x03,0xF0,0x2C,0xFA,0x08,0x48,0x18,0x22,0x00,0x21,0x8E,0x30, + 0x03,0xF0,0x26,0xFA,0x05,0x49,0x00,0x20,0xAC,0x31,0xC8,0x83,0xFF,0x39,0xA1,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20, + 0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x09,0x68,0x00,0x24,0x60,0x31,0x8F,0x7F,0x08,0x21, + 0x42,0x00,0x18,0x23,0x4B,0x43,0x9B,0x19,0x1D,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19, + 0xAC,0x80,0x23,0x25,0x6D,0x01,0x5B,0x19,0x49,0x1E,0x9C,0x83,0xF1,0xD5,0x07,0x25, + 0x31,0x18,0xED,0x01,0x01,0x23,0x4D,0x19,0x2B,0x76,0x15,0x25,0x93,0x19,0xAD,0x01, + 0x5B,0x19,0x9C,0x82,0x2B,0x23,0x5B,0x01,0xC9,0x18,0x0F,0x73,0x0C,0x76,0x02,0x21, + 0x0B,0x23,0xDB,0x01,0x18,0x25,0x4D,0x43,0xAD,0x19,0xAD,0x18,0xED,0x18,0x49,0x1E, + 0xAC,0x80,0xF7,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x17,0x20,0xC9,0x43,0x80,0x01, + 0x10,0x18,0x81,0x81,0xC1,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00,0xC8,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48,0x1E,0x22,0x00,0x21,0x03,0xF0,0xD0,0xF9, + 0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBA,0x03,0x00,0x20,0x20,0x01,0x00,0x20,0x10,0xB5,0x05,0xF0,0xDF,0xF8,0x04,0xF0, + 0xBD,0xF8,0xFF,0xF7,0x53,0xFF,0x04,0xF0,0xC9,0xF9,0x01,0xF0,0x79,0xFD,0x01,0xF0, + 0xF1,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x02,0x68,0x3F,0x20,0x09,0x68,0x80,0x02, + 0x82,0x43,0x81,0x43,0x8A,0x42,0x01,0xD1,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47, + 0x78,0x47,0xC0,0x46,0x24,0x20,0x9F,0xE5,0x00,0x00,0x92,0xE5,0x20,0x30,0x9F,0xE5, + 0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x11,0x92,0xE7,0x80,0xC0,0x83,0xE0, + 0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1,0xFA,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1, + 0x00,0x10,0x10,0x40,0xCE,0x07,0x00,0x20,0x78,0x47,0xC0,0x46,0x20,0x30,0x9F,0xE5, + 0x20,0x20,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x11,0x93,0xE7, + 0x80,0xC0,0x82,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1,0xFA,0xFF,0xFF,0x5A, + 0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40,0x00,0x00,0x00,0x10,0x09,0x4B,0x10,0xB4, + 0x1B,0x68,0x80,0x33,0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD, + 0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC, + 0x10,0x00,0x70,0x47,0xC8,0x07,0x00,0x20,0xF7,0xB5,0x61,0x48,0xE6,0xB0,0x00,0x7D, + 0x00,0x28,0x03,0xD0,0x01,0x20,0x62,0x90,0x00,0x20,0x02,0xE0,0x00,0x20,0x62,0x90, + 0x01,0x20,0x61,0x90,0x5B,0x48,0x00,0x26,0x64,0x90,0x5B,0x48,0x35,0x00,0x01,0x8B, + 0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A,0x01,0x91,0x80,0x8B, + 0x60,0x90,0x56,0x48,0x00,0x7F,0x63,0x96,0x00,0x90,0x00,0x24,0x0E,0x20,0x68,0x43, + 0x65,0x90,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x38,0xF9,0x4C,0x49,0x20,0x39, + 0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4E,0x4A,0x12,0x79,0x00,0x2A,0x00,0x9A,0x11,0xD0, + 0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0, + 0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42, + 0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42,0x0B,0xD0,0xCA,0x7D, + 0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E,0xAA,0x42,0x02,0xD0, + 0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x80,0x1A,0x64,0x9B, + 0x02,0x04,0xB8,0x00,0x18,0x58,0x67,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05, + 0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x66,0x9B,0x05,0x2B,0x0E,0xD8,0x90,0x42, + 0x01,0xDA,0x62,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x61,0x9A,0x21,0x00,0x28,0x00, + 0x00,0xF0,0x86,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0,0x63,0x99,0x05,0xA8, + 0x47,0x54,0x63,0x98,0x40,0x1C,0x63,0x90,0x64,0x1C,0x0E,0x2C,0x01,0xDA,0x65,0x98, + 0x97,0xE7,0x6D,0x1C,0x15,0x2D,0x90,0xDB,0x66,0x98,0x05,0x28,0x03,0xD9,0x00,0x04, + 0x63,0x9E,0x00,0x0C,0x60,0x90,0x00,0x2E,0x25,0xDD,0x68,0x98,0x00,0x28,0x22,0xD1, + 0x00,0xF0,0x52,0xF9,0x00,0xF0,0x8C,0xF9,0x00,0xF0,0x62,0xFA,0x76,0x1E,0x14,0xD4, + 0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00,0x64,0x98,0x80,0x58,0x01,0x05,0x60,0x98, + 0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C,0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04, + 0x08,0x43,0x64,0x99,0x76,0x1E,0x88,0x50,0xEC,0xD5,0x00,0xF0,0x2D,0xF9,0x00,0xF0, + 0x6F,0xF9,0x00,0xF0,0x45,0xFA,0x69,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00,0x60,0x06,0x00,0x20, + 0x14,0x07,0x00,0x20,0xFF,0x0F,0x00,0x00,0x7F,0xB5,0x01,0x25,0x6D,0x07,0x28,0x68, + 0x02,0x28,0x27,0xD1,0xAC,0x68,0x01,0xAA,0x20,0x05,0x00,0x0D,0x02,0x90,0x20,0x02, + 0x00,0x0D,0x03,0x90,0x02,0xA9,0x03,0xA8,0x6B,0x46,0x04,0xF0,0xF9,0xF9,0x40,0x1C, + 0x18,0xD0,0x01,0x98,0x03,0x99,0x40,0x00,0x40,0x18,0x03,0x21,0xFE,0xF7,0x6E,0xF9, + 0x00,0x05,0x06,0x0A,0x09,0x48,0x02,0x99,0x04,0x40,0x00,0x98,0x26,0x43,0x40,0x00, + 0x40,0x18,0x03,0x21,0xFE,0xF7,0x62,0xF9,0x00,0x05,0x00,0x0D,0x31,0x0B,0x09,0x03, + 0x08,0x43,0xA8,0x60,0x7F,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFF,0x0F,0x00,0xFF, + 0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06, + 0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18, + 0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD, + 0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0, + 0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02, + 0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0xF0,0xB5,0x8B,0xB0, + 0x0E,0x27,0x15,0x20,0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48,0x53,0x49,0x0A,0x90, + 0x80,0x7B,0x09,0x91,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x0D,0x20,0x03,0x21, + 0x05,0x90,0x02,0xE0,0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98,0x01,0x76,0x4C,0x48, + 0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90, + 0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98,0x00,0x28,0x7F,0xD0, + 0x05,0x98,0x41,0x00,0x30,0x00,0xFD,0xF7,0xC9,0xFF,0x05,0x04,0x2D,0x0C,0x00,0x24, + 0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43,0x05,0x99,0xFD,0xF7,0xBF,0xFF,0x3D,0x4A, + 0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42,0xF2,0xDB,0x04,0x98, + 0x41,0x00,0x01,0x98,0xFD,0xF7,0xB2,0xFF,0x06,0x9F,0x06,0x04,0x36,0x0C,0x00,0x24, + 0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7,0xA7,0xFF,0x31,0x4A, + 0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82,0xBC,0x42,0xF1,0xDB, + 0x0A,0x98,0x80,0x7B,0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0,0x29,0x4A,0x31,0x21, + 0x10,0x19,0x49,0x01,0x40,0x18,0x41,0x7F,0x0A,0x98,0x80,0x7B,0x80,0x07,0x03,0xD5, + 0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99,0x02,0x96,0x03,0x91, + 0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7, + 0x7D,0xFF,0x1C,0x4A,0xE1,0x00,0x89,0x18,0x03,0x22,0x52,0x02,0x8F,0x18,0x38,0x82, + 0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90,0x80,0x8A,0x0A,0x21, + 0x80,0x1B,0xFD,0xF7,0x6B,0xFF,0x78,0x82,0x08,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19, + 0xFE,0xF7,0x94,0xF8,0xB8,0x82,0x07,0x98,0x0A,0x21,0x80,0x8A,0x80,0x19,0xFE,0xF7, + 0x8D,0xF8,0xF8,0x82,0x02,0x98,0x0A,0x21,0x40,0x00,0xFE,0xF7,0x87,0xF8,0x09,0x99, + 0x64,0x1C,0x48,0x83,0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x7B,0xA0,0x42,0xB5,0xDC, + 0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x06,0x00,0x20,0x60,0x06,0x00,0x20, + 0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43, + 0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0xFF,0x20,0x06,0x49,0x06,0x4A,0x6A,0x30, + 0x03,0xE0,0x0B,0x88,0x13,0x80,0x92,0x1C,0x09,0x1D,0x03,0x00,0x40,0x1E,0x00,0x2B, + 0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40,0xD2,0x02,0x00,0x10,0xFF,0x20,0x06,0x49, + 0x06,0x4A,0x6A,0x30,0x03,0xE0,0x13,0x88,0x92,0x1C,0x0B,0x80,0x09,0x1D,0x03,0x00, + 0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40,0xD2,0x02,0x00,0x10, + 0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x04,0x49,0x40,0x22, + 0x00,0x28,0x48,0x6A,0x01,0xD0,0x10,0x43,0x00,0xE0,0x90,0x43,0x48,0x62,0x70,0x47, + 0x80,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48,0x92,0x00,0x02,0xF0, + 0xFD,0xFE,0x07,0x48,0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43,0x06,0x48,0x02,0xF0, + 0x17,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40,0x06,0x49,0x00,0x28, + 0x08,0x69,0x03,0xD0,0x13,0x22,0x12,0x06,0x10,0x43,0x02,0xE0,0x03,0x22,0x12,0x06, + 0x90,0x43,0x08,0x61,0x70,0x47,0x00,0x00,0x40,0xA1,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49, + 0x0A,0x48,0xFC,0x22,0x02,0xF0,0xC2,0xFE,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32, + 0x02,0xF0,0xBC,0xFE,0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00,0x02,0xF0,0xB6,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00,0x04,0x90,0x00,0x40, + 0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40, + 0x04,0x49,0x02,0x22,0x00,0x28,0x08,0x68,0x01,0xD0,0x10,0x43,0x00,0xE0,0x90,0x43, + 0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04, + 0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x70,0xB5,0x1A,0x4C, + 0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15,0x05,0x04,0x2D,0x0C, + 0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xA7,0xFF,0x32,0x00,0x21,0x00,0x28,0x00, + 0x00,0x23,0xFD,0xF7,0xA9,0xFF,0x12,0x48,0x75,0x00,0x04,0x04,0x24,0x0C,0x00,0x22, + 0x29,0x00,0x20,0x00,0xFD,0xF7,0x98,0xFF,0x0E,0x49,0x2A,0x00,0x20,0x00,0x00,0x23, + 0xFD,0xF7,0x9A,0xFF,0x0C,0x48,0x6D,0x00,0x04,0x04,0x24,0x0C,0x00,0x22,0x29,0x00, + 0x20,0x00,0xFD,0xF7,0x89,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00,0x00,0x23,0xFD,0xF7, + 0x8B,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0x00,0x96,0x00,0x00, + 0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40, + 0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7,0x45,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x51,0x48,0x82,0xB0,0x00,0x68, + 0x50,0x4E,0x60,0x30,0x81,0x8A,0x37,0x00,0x00,0x25,0x01,0x91,0x80,0x7D,0x01,0x24, + 0xFF,0x37,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0xC1,0x37,0x00,0x90,0x12,0xE0, + 0x0A,0x20,0x60,0x43,0x0B,0x21,0x80,0x19,0x89,0x01,0x41,0x18,0x09,0x7C,0x00,0x29, + 0x08,0xD0,0x45,0x49,0x40,0x18,0x01,0xF0,0x27,0xF9,0x00,0x28,0x02,0xD0,0x6D,0x1C, + 0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x7A,0xA0,0x42,0xE9,0xDA,0x3F,0x48,0x03,0x89, + 0x81,0x89,0x5A,0x1A,0x00,0x2A,0x00,0xDC,0xCA,0x1A,0x41,0x89,0xC3,0x89,0x12,0x04, + 0x12,0x0C,0xCC,0x1A,0x00,0x2C,0x00,0xDC,0x5C,0x1A,0x01,0x7D,0x23,0x04,0x1B,0x0C, + 0x00,0x29,0x04,0xD0,0xC1,0x7D,0xC8,0x29,0x01,0xD2,0x49,0x1C,0xC1,0x75,0x33,0x49, + 0x20,0x39,0x8C,0x7E,0x14,0x2C,0x04,0xD2,0x0C,0x7F,0x00,0x2C,0x01,0xD0,0x01,0x24, + 0x4C,0x77,0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7E,0xC8,0x2C,0x01,0xD2, + 0x64,0x1C,0xCC,0x76,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B,0x05,0xD2, + 0x12,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x12,0x24,0x04,0x5F, + 0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x44,0x82,0xC4,0x7D,0x01,0x2C,0x01,0xD9,0x78,0x21, + 0x10,0xE0,0x02,0x2D,0x0F,0xD2,0x12,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD,0xC9,0x7E, + 0x14,0x29,0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B,0x02,0xD2, + 0x77,0x21,0xC9,0x43,0x01,0x82,0x00,0x21,0x02,0x2D,0x81,0x75,0x0E,0xD2,0x10,0x21, + 0x41,0x5E,0x78,0x31,0x04,0xD1,0x41,0x7D,0xC8,0x29,0x01,0xD2,0x49,0x1C,0x41,0x75, + 0x41,0x7D,0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x81,0x75,0x10,0x21,0x41,0x5E, + 0x01,0x98,0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1,0x31,0x79, + 0x01,0x29,0x02,0xD0,0x00,0x99,0xFD,0xF7,0x79,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0xC8,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0xD6,0x02,0x00,0x00,0xC0,0x03,0x00,0x20, + 0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2, + 0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3, + 0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0x10,0xB5,0xFF,0xF7,0x4B,0xFE,0x04,0x49,0x08,0x68,0x06,0x22, + 0x90,0x43,0x08,0x60,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29, + 0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40, + 0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0x11,0xFD,0x09,0x48, + 0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48, + 0x00,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0xAF,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x14,0x07,0x00,0x20,0xF1,0xB5,0x61,0x48, + 0x2E,0x21,0x90,0xB0,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26, + 0x76,0x07,0xF1,0x63,0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0, + 0xE7,0xFC,0x59,0x4D,0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x95,0xFD,0x10,0x9B, + 0x00,0x21,0x01,0x20,0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0xF4,0xFD, + 0x1E,0x16,0x40,0x40,0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x68, + 0x4F,0x6F,0x76,0x7D,0x40,0x84,0x40,0x8B,0x92,0x4F,0x40,0x40,0x40,0x40,0x99,0x40, + 0x0B,0x20,0xF0,0x63,0x4D,0xE0,0x00,0xF0,0x24,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x47,0xF9,0x00,0xF0,0x2B,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68, + 0x52,0x68,0x91,0x42,0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18, + 0x49,0x1C,0xC1,0x83,0xFD,0xF7,0x5E,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7, + 0x55,0xFE,0xA8,0x78,0x80,0x07,0x01,0xD5,0x04,0xF0,0x0C,0xFD,0x3A,0x49,0x40,0x22, + 0x68,0x46,0x02,0xF0,0xD3,0xFC,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0x1A,0xFD, + 0xF7,0x63,0x1E,0xE0,0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x04,0xF0,0xD8,0xFA,0xF0,0xE7,0x03,0x21, + 0x09,0x07,0xCA,0x60,0xFE,0xF7,0x0E,0xF9,0x10,0x98,0xFE,0xF7,0x5F,0xF8,0x08,0xE0, + 0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x05,0xF9,0x00,0xF0,0x5D,0xFD,0x00,0xF0, + 0xF3,0xF8,0x20,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x71,0xD2,0xE7,0x69,0x71,0xD0,0xE7,0x00,0x2C, + 0x02,0xD0,0x01,0x20,0xA8,0x71,0xCB,0xE7,0xA9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xE8,0x71,0xC4,0xE7,0xE9,0x71,0xC2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0x28,0x72,0xBD,0xE7,0x29,0x72,0xBB,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72, + 0xB6,0xE7,0xA9,0x72,0xB4,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xAF,0xE7, + 0xE9,0x72,0xAD,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA8,0xE7,0x29,0x73, + 0xA6,0xE7,0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x04,0xF0,0xE6,0xF8, + 0x9E,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0x14,0x07,0x00,0x20,0x00,0x00,0x00,0x10, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0xC0,0x92,0x00,0x00,0xF0,0xB5,0x34,0x4C, + 0x30,0x38,0x34,0x4A,0x34,0x4E,0x35,0x4F,0x35,0x49,0x25,0x68,0x03,0x00,0x04,0xF0, + 0x3B,0xFD,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16, + 0x3E,0x43,0x47,0x4D,0x50,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48, + 0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x34,0xE0,0xCE,0x61, + 0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B, + 0xEF,0xE7,0x25,0x48,0x03,0x7F,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07, + 0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22, + 0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04, + 0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48, + 0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7,0x38,0x69,0x40,0x08,0x00,0x02,0xC8,0xE7, + 0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43,0xC2,0xE7,0x38,0x69,0x40,0x08, + 0xBF,0xE7,0x10,0x48,0x40,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42,0xFC,0xD1,0x03,0xF0, + 0xC7,0xFB,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x92,0x00,0x00,0x00,0x93,0x00,0x00,0x15,0x00,0x0E,0x00,0x00,0x20,0x00,0x40, + 0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20,0x60,0x06,0x00,0x20,0x00,0x96,0x00,0x00, + 0xE0,0x95,0x00,0x00,0x14,0x07,0x00,0x20,0x10,0xB5,0x00,0x20,0xFF,0xF7,0xC6,0xFC, + 0x01,0x20,0xFF,0xF7,0x35,0xFD,0x01,0x20,0xFF,0xF7,0xF0,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60, + 0xFE,0xF7,0x3E,0xF8,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFE,0xF7,0x1B,0xF8,0x03,0xF0, + 0x53,0xFA,0x00,0xF0,0x9B,0xFC,0x03,0xF0,0x43,0xFA,0x30,0x00,0xFE,0xF7,0x44,0xF8, + 0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43, + 0x09,0x07,0xC8,0x60,0x03,0xF0,0x40,0xFA,0xFF,0xF7,0x20,0xFD,0x05,0x48,0xC1,0x68, + 0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x04,0xF0,0x66,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x23,0x48,0x00,0x68,0x00,0x88, + 0xC0,0x06,0x3E,0xD5,0x21,0x4E,0x30,0x7A,0x00,0x28,0x3A,0xD0,0x70,0x7A,0x00,0x28, + 0x37,0xD0,0x01,0x25,0x32,0xE0,0x71,0x7A,0x1D,0x4F,0x09,0x23,0x8C,0x46,0x0A,0x21, + 0x69,0x43,0xCC,0x19,0x01,0x20,0x9B,0x01,0xFF,0x34,0xC1,0x34,0x23,0xE0,0x0A,0x22, + 0x42,0x43,0xD2,0x19,0xD2,0x18,0x21,0x7B,0x92,0x7B,0x91,0x42,0x1A,0xD1,0x0A,0x22, + 0x50,0x43,0xC0,0x19,0xC7,0x18,0x0E,0x21,0x10,0x20,0x61,0x5E,0x38,0x5E,0x12,0x22, + 0xBA,0x5E,0x08,0x1A,0x10,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x8A,0xE1,0x89, + 0xFF,0xF7,0x0C,0xFA,0xE0,0x81,0x7A,0x8A,0x21,0x8A,0x00,0x98,0xFF,0xF7,0x06,0xFA, + 0x20,0x82,0x02,0xE0,0x40,0x1C,0x84,0x45,0xD9,0xDA,0x6D,0x1C,0x30,0x7A,0xA8,0x42, + 0xC9,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xC8,0x07,0x00,0x20,0x00,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20,0xB1,0xB0,0x10,0x90,0x0F,0x90,0x0E,0x90, + 0x0D,0x90,0xFC,0x48,0x01,0x8C,0x0A,0x91,0x40,0x8C,0x09,0x90,0xFA,0x48,0x02,0x68, + 0x13,0x00,0x60,0x33,0x59,0x7F,0x18,0x7F,0x08,0x91,0x11,0x00,0x80,0x31,0x8C,0x7A, + 0x07,0x94,0x4C,0x7A,0x06,0x94,0x12,0x88,0x12,0x07,0x24,0xD5,0xDA,0x7F,0x42,0x43, + 0x24,0x92,0x0A,0x78,0x42,0x43,0x23,0x92,0x4A,0x78,0x42,0x43,0x22,0x92,0x8A,0x78, + 0x42,0x43,0x21,0x92,0xCA,0x78,0x42,0x43,0x20,0x92,0x0A,0x79,0x42,0x43,0x1F,0x92, + 0x4A,0x79,0x42,0x43,0x1E,0x92,0x8A,0x79,0x42,0x43,0x1D,0x92,0xCA,0x79,0x42,0x43, + 0x1C,0x92,0x09,0x7A,0x41,0x43,0xE5,0x48,0x1B,0x91,0x30,0x90,0x00,0x7A,0x00,0x28, + 0x05,0xD1,0x00,0xF0,0xE5,0xFE,0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20, + 0x25,0x90,0xDE,0x48,0xE0,0x38,0x2F,0x90,0xDD,0x48,0x2E,0x90,0xDD,0x4D,0x25,0x98, + 0x1B,0x21,0x28,0x18,0x49,0x01,0x2D,0x90,0x40,0x18,0x04,0x78,0x00,0x2C,0x0F,0xD0, + 0x07,0x98,0x00,0x28,0x08,0xD1,0x0A,0x20,0x60,0x43,0x40,0x19,0xFF,0x30,0xD3,0x30, + 0x00,0xF0,0x02,0xFE,0x00,0x28,0x03,0xD0,0x2E,0x98,0x80,0x7D,0x00,0x28,0x03,0xD0, + 0x25,0x98,0xFF,0xF7,0xE5,0xF8,0xC2,0xE2,0x25,0x99,0x1D,0x27,0x07,0x20,0x7F,0x01, + 0x4E,0x00,0x18,0x21,0x41,0x43,0x49,0x19,0x89,0x19,0xCA,0x19,0x93,0x88,0x93,0x83, + 0x23,0x22,0x52,0x01,0x8A,0x18,0x09,0x23,0x92,0x8B,0xDB,0x01,0xC9,0x18,0x40,0x1E, + 0x8A,0x82,0xEE,0xD5,0x0A,0x20,0x44,0x43,0x65,0x19,0x2C,0x95,0xFF,0x35,0xC1,0x35, + 0xEA,0x89,0x0A,0x98,0x40,0x1E,0x82,0x42,0xDD,0xDC,0x2A,0x8A,0x09,0x98,0x40,0x1E, + 0x82,0x42,0xD8,0xDC,0xBB,0x48,0xE9,0x89,0x34,0x18,0xE0,0x19,0x2B,0x90,0x23,0x23, + 0x81,0x80,0x5B,0x01,0x29,0x8A,0xE0,0x18,0x2A,0x90,0x81,0x83,0x00,0x20,0x01,0x22, + 0xD2,0x02,0x01,0x00,0x05,0x90,0x07,0x20,0x04,0x92,0x18,0x23,0x43,0x43,0xB1,0x4F, + 0xDB,0x19,0x9B,0x19,0x1D,0x27,0x7F,0x01,0xDF,0x19,0x29,0x93,0x04,0x23,0xFB,0x5E, + 0xBC,0x46,0x00,0x2B,0x0B,0xDD,0x05,0x9F,0xBB,0x42,0x02,0xDD,0x67,0x46,0xBF,0x88, + 0x05,0x97,0x04,0x9F,0xBB,0x42,0x02,0xDA,0x63,0x46,0x9B,0x88,0x04,0x93,0x29,0x9B, + 0x23,0x27,0x7F,0x01,0xDF,0x19,0x1C,0x23,0xFB,0x5E,0x00,0x2B,0x05,0xDD,0x8B,0x42, + 0x00,0xDD,0xB9,0x8B,0x93,0x42,0x00,0xDA,0xBA,0x8B,0x40,0x1E,0xD5,0xD5,0x04,0x9B, + 0x05,0x98,0xC0,0x1A,0xF0,0x28,0x02,0xDC,0x8B,0x1A,0xF0,0x2B,0x02,0xDD,0x2E,0x9F, + 0x01,0x23,0x3B,0x75,0x14,0x28,0x04,0xDA,0x88,0x1A,0x14,0x28,0x01,0xDA,0x01,0x20, + 0x00,0xE0,0x00,0x20,0x2F,0x99,0x48,0x74,0x2D,0x98,0x07,0x21,0xC9,0x01,0x40,0x18, + 0x28,0x90,0x00,0x7E,0x01,0x28,0x1C,0xD9,0x2B,0x99,0x04,0x20,0x08,0x5E,0x0A,0x00, + 0x1C,0x21,0x51,0x5E,0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A,0x10,0x04,0x00,0x14, + 0x0C,0x90,0x2A,0x98,0x1C,0x21,0x41,0x5E,0x09,0x20,0xC0,0x01,0x20,0x18,0x14,0x22, + 0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14,0x0B,0x90, + 0x02,0xE0,0x64,0x20,0x0B,0x90,0x0C,0x90,0x2B,0x98,0x1C,0x21,0x41,0x5E,0x02,0x00, + 0x04,0x20,0x10,0x5E,0x03,0xF0,0x24,0xFA,0x12,0x90,0x09,0x20,0xC0,0x01,0x20,0x18, + 0x14,0x21,0x41,0x5E,0x2A,0x9A,0x1C,0x20,0x10,0x5E,0x03,0xF0,0x19,0xFA,0x11,0x90, + 0x0F,0x20,0x80,0x01,0x20,0x18,0x14,0x21,0x41,0x5E,0x12,0x98,0x03,0xF0,0x10,0xFA, + 0x14,0x90,0x25,0x20,0x40,0x01,0x20,0x18,0x0C,0x21,0x41,0x5E,0x11,0x98,0x03,0xF0, + 0x07,0xFA,0x13,0x90,0x01,0x20,0x80,0x02,0x27,0x18,0x1F,0x20,0x40,0x01,0x20,0x18, + 0x0C,0x21,0x41,0x5E,0x04,0x22,0xBA,0x5E,0x14,0x98,0x03,0xF0,0xFB,0xF9,0x00,0x04, + 0x00,0x14,0x16,0x90,0x13,0x20,0x80,0x01,0x20,0x18,0x1C,0x22,0x04,0x21,0x82,0x5E, + 0x41,0x5E,0x13,0x98,0x03,0xF0,0xEE,0xF9,0x00,0x04,0x00,0x14,0x15,0x90,0x21,0x20, + 0x40,0x01,0x20,0x18,0x14,0x22,0x82,0x5E,0x1C,0x21,0x79,0x5E,0x16,0x98,0x03,0xF0, + 0xE1,0xF9,0x00,0x04,0x00,0x14,0x18,0x90,0x05,0x20,0x00,0x02,0x20,0x18,0x0C,0x22, + 0x82,0x5E,0x27,0x20,0x40,0x01,0x20,0x18,0x14,0x21,0x41,0x5E,0x15,0x98,0x03,0xF0, + 0xD1,0xF9,0x00,0x04,0x00,0x14,0x17,0x90,0x2A,0x98,0x04,0x22,0x82,0x5E,0x11,0x20, + 0x80,0x01,0x20,0x18,0x0C,0x21,0x41,0x5E,0x18,0x98,0x03,0xF0,0xC3,0xF9,0x00,0x04, + 0x00,0x14,0x1A,0x90,0x29,0x20,0x40,0x01,0x20,0x18,0x1C,0x22,0x04,0x21,0x82,0x5E, + 0x41,0x5E,0x17,0x98,0x03,0xF0,0xB6,0xF9,0x00,0x04,0x00,0x14,0x19,0x90,0x0B,0x99, + 0x0C,0x98,0x00,0xF0,0xB7,0xFF,0x3F,0x4F,0x01,0x21,0x18,0x22,0x4A,0x43,0xD2,0x19, + 0x0B,0x23,0x92,0x19,0xDB,0x01,0xD2,0x18,0x93,0x88,0x49,0x1E,0x93,0x83,0xF4,0xD5, + 0x0B,0x21,0xC9,0x01,0x61,0x18,0x88,0x80,0x2D,0x9A,0x2B,0x21,0x49,0x01,0x57,0x18, + 0x3A,0x7E,0x00,0x20,0x00,0x2A,0x94,0x46,0x0D,0xDB,0x18,0x21,0x13,0x00,0x4B,0x43, + 0x30,0x49,0x59,0x18,0x8B,0x19,0x0B,0x21,0xC9,0x01,0x5B,0x18,0x04,0x21,0x59,0x5E, + 0x08,0x18,0x52,0x1E,0xF1,0xD5,0x61,0x46,0x49,0x1C,0xFD,0xF7,0x7F,0xF9,0x23,0x99, + 0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0,0x21,0x98,0x86,0x42,0x01,0xDC, + 0x02,0x20,0x0A,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC,0x03,0x20,0x05,0xE0,0x1D,0x98, + 0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20,0x39,0x7B,0x40,0x1A,0x08,0x99, + 0x49,0x42,0x00,0x28,0x0B,0xDD,0x15,0x20,0x80,0x01,0x20,0x18,0x14,0x22,0x82,0x5E, + 0x08,0x9B,0x9A,0x42,0x01,0xD1,0x00,0x22,0x0A,0xE0,0x52,0x1C,0x08,0xE0,0x00,0x28, + 0x15,0x48,0x07,0xDA,0x20,0x18,0x14,0x22,0x82,0x5E,0x8A,0x42,0xF3,0xD0,0x52,0x1E, + 0x82,0x82,0x0A,0xE0,0x22,0x18,0x14,0x20,0x10,0x5E,0x00,0x28,0x01,0xDD,0x40,0x1E, + 0x02,0xE0,0x00,0x28,0x01,0xDA,0x40,0x1C,0x90,0x82,0x0B,0x48,0x22,0x18,0x14,0x20, + 0x10,0x5E,0x08,0x9A,0x90,0x42,0x11,0xD1,0x3A,0x7B,0x05,0x2A,0x0E,0xD2,0x52,0x1C, + 0x3A,0x73,0x12,0xE0,0x00,0x93,0x00,0x00,0xC8,0x07,0x00,0x20,0x00,0x02,0x00,0x20, + 0xC0,0x03,0x00,0x20,0x40,0x00,0x00,0x20,0x40,0x05,0x00,0x00,0x88,0x42,0x04,0xD1, + 0x38,0x7B,0x01,0x28,0x01,0xD9,0x40,0x1E,0x38,0x73,0x28,0x98,0x1A,0x9A,0x00,0x7E, + 0x19,0x9C,0x01,0x00,0x27,0x90,0x26,0x90,0x10,0x00,0xFD,0xF7,0x17,0xF9,0x10,0x90, + 0x0E,0x90,0x26,0x99,0x20,0x00,0xFD,0xF7,0x11,0xF9,0x0F,0x90,0x0D,0x90,0x38,0x7B, + 0x01,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3,0x19,0x9B,0x1A,0x9A, + 0x27,0x98,0x09,0x21,0x03,0xF0,0xBC,0xFD,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0, + 0x28,0x98,0x17,0x9B,0x00,0x7E,0x18,0x9A,0x07,0x21,0x03,0xF0,0xB1,0xFD,0x3C,0x20, + 0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4, + 0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x00,0x92,0xFF,0x30,0x23,0x9B,0x24,0x9A, + 0xCD,0x30,0x9B,0xE0,0x02,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3, + 0x17,0x9B,0x18,0x9A,0x27,0x98,0x07,0x21,0x03,0xF0,0x92,0xFD,0x0F,0xAA,0x10,0xA9, + 0x68,0x46,0x06,0xC0,0x28,0x98,0x15,0x9B,0x00,0x7E,0x16,0x9A,0x05,0x21,0x03,0xF0, + 0x87,0xFD,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E, + 0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x21,0x9B,0xFF,0x30, + 0x00,0x92,0x22,0x9A,0xCD,0x30,0x71,0xE0,0x03,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9, + 0x6B,0x46,0x06,0xC3,0x15,0x9B,0x16,0x9A,0x27,0x98,0x05,0x21,0x03,0xF0,0x68,0xFD, + 0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x13,0x9B,0x00,0x7E,0x14,0x9A, + 0x03,0x21,0x03,0xF0,0x5D,0xFD,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E, + 0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98, + 0x1F,0x9B,0xFF,0x30,0x00,0x92,0x20,0x9A,0xCD,0x30,0x47,0xE0,0x04,0x28,0x27,0xD1, + 0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0,0x13,0x9B,0x14,0x9A,0x27,0x98,0x03,0x21, + 0x03,0xF0,0x3E,0xFD,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x11,0x9B, + 0x00,0x7E,0x12,0x9A,0x02,0x21,0x03,0xF0,0x33,0xFD,0x3C,0x20,0x6B,0x46,0x18,0x5E, + 0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB, + 0x9A,0x5E,0x2C,0x98,0x1D,0x9B,0xFF,0x30,0x00,0x92,0x1E,0x9A,0xCD,0x30,0x1D,0xE0, + 0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x11,0x9B,0x12,0x9A,0x27,0x98,0x02,0x21, + 0x03,0xF0,0x16,0xFD,0x3C,0x22,0x6B,0x46,0x9A,0x5E,0x00,0x21,0x10,0xAB,0x59,0x5E, + 0x2A,0x9B,0x1C,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3,0x2B,0x98,0x04,0x22,0x82,0x5E, + 0x2C,0x98,0x1B,0x9B,0x00,0x92,0x1C,0x9A,0xFF,0x30,0xCD,0x30,0x31,0x00,0x03,0xF0, + 0x13,0xFD,0x28,0x98,0x3B,0x49,0x00,0x7E,0x09,0x28,0x02,0xD2,0x28,0x9A,0x40,0x1C, + 0x10,0x76,0x38,0x7E,0x02,0x28,0x01,0xD2,0x40,0x1C,0x38,0x76,0x28,0x7B,0x40,0x1E, + 0x80,0x00,0x41,0x18,0x17,0x20,0x80,0x01,0x0C,0x18,0x0C,0x20,0x20,0x5E,0x00,0x28, + 0x21,0xDB,0x0E,0x21,0x61,0x5E,0x00,0x29,0x1D,0xDB,0x06,0x9A,0x64,0x21,0x8E,0x1A, + 0x70,0x43,0xFD,0xF7,0x23,0xF8,0x07,0x00,0xE8,0x89,0x06,0x99,0x48,0x43,0x64,0x21, + 0xFD,0xF7,0x4C,0xF9,0x38,0x18,0xE8,0x81,0x0E,0x20,0x20,0x5E,0x64,0x21,0x70,0x43, + 0xFD,0xF7,0x14,0xF8,0x06,0x00,0x28,0x8A,0x06,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7, + 0x3D,0xF9,0x30,0x18,0x28,0x82,0xE8,0x89,0xA0,0x81,0x28,0x8A,0xE0,0x81,0x25,0x98, + 0x40,0x1C,0x0C,0x28,0x25,0x90,0x00,0xDA,0x18,0xE5,0x30,0x98,0x01,0x7A,0x00,0x29, + 0x00,0xD1,0x08,0xE5,0x80,0x7D,0x2E,0x9C,0x42,0x00,0x16,0x48,0x10,0x18,0x1D,0x22, + 0x52,0x01,0x82,0x18,0x53,0x88,0x23,0x81,0x23,0x23,0x5B,0x01,0xC3,0x18,0x5B,0x8B, + 0x2E,0x9C,0x63,0x81,0x53,0x8B,0x2E,0x9A,0x93,0x81,0x09,0x22,0xD2,0x01,0x80,0x18, + 0x42,0x8A,0x2E,0x98,0x02,0x29,0xC2,0x81,0x30,0x98,0x2E,0x9A,0x00,0x8B,0x10,0x80, + 0x30,0x9A,0x2E,0x9B,0x52,0x8B,0x5A,0x80,0xDB,0xD1,0x2E,0x99,0x08,0x80,0x2E,0x98, + 0x42,0x80,0x05,0x48,0x2E,0x99,0x42,0x88,0x8A,0x80,0x81,0x88,0x2E,0x98,0xC1,0x80, + 0xD9,0xE4,0x00,0x00,0x40,0x00,0x00,0x20,0x20,0x02,0x00,0x20,0xF8,0xB5,0x1C,0x4B, + 0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B,0x1B,0x7F,0x9E,0x46, + 0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D, + 0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45, + 0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0, + 0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7, + 0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42, + 0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7, + 0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x18,0x07,0x00,0x20,0x0E,0x23,0x58,0x43, + 0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x1C,0x49,0x10,0xB5,0x4A,0x7A,0x1C,0x49,0x00,0x20,0x00,0x2A,0x15,0xD1,0x0A,0x89, + 0x00,0x2A,0x0F,0xD0,0x19,0x49,0x8A,0x42,0x0C,0xD0,0x10,0x00,0x1E,0x21,0x48,0x43, + 0x64,0x21,0xFD,0xF7,0x9B,0xF8,0xFF,0x30,0x4B,0x21,0x91,0x30,0xC9,0x00,0x88,0x42, + 0x00,0xD9,0x08,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x88,0x89,0x0E,0x4A,0xE1,0x24, + 0x92,0x89,0x01,0x00,0xFF,0x39,0xFF,0x23,0xA4,0x00,0xA6,0x39,0xE0,0x33,0x12,0x1B, + 0x99,0x42,0x06,0xD8,0x10,0x00,0x50,0x43,0x59,0x1C,0xFD,0xF7,0x7F,0xF8,0x20,0x1A, + 0xE8,0xE7,0xA0,0x42,0xE6,0xD9,0x03,0x21,0x10,0x00,0xFD,0xF7,0x77,0xF8,0x00,0x19, + 0xE0,0xE7,0x00,0x00,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06, + 0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D,0x00,0x24,0x01,0x21, + 0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68,0x6A,0x60,0x05,0xE0, + 0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18,0x02,0x00,0x40,0x1E, + 0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0xFF,0xFE,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06,0xFC,0xD4,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0x50,0x0B,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x47,0x0B,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4, + 0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0, + 0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25, + 0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C, + 0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1, + 0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x61,0xFE,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E, + 0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x50,0xFE, + 0xC3,0xE7,0x00,0x00,0x16,0x07,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x49,0x20,0x20, + 0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68, + 0x3D,0x48,0x01,0x29,0x80,0x79,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29, + 0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x33,0x27,0x7F,0x01,0x3B,0xE0, + 0x00,0x28,0x05,0xD1,0x34,0x48,0x0D,0x22,0x00,0x21,0x14,0x38,0x01,0xF0,0x68,0xFE, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E, + 0x36,0x18,0xF6,0x19,0x36,0x7B,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C, + 0x0C,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43, + 0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7B, + 0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x73,0xED,0xE7,0x40,0x1C,0x0C,0x28, + 0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46, + 0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18, + 0xDB,0x19,0x1B,0x7B,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x73, + 0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C, + 0x0C,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68, + 0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47, + 0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61, + 0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47, + 0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF, + 0x08,0xBC,0x18,0x47,0x48,0x07,0x00,0x20,0xF0,0xB5,0x87,0xB0,0xFE,0xF7,0x8E,0xFB, + 0xFE,0xF7,0x6C,0xFB,0x01,0xF0,0x8E,0xFE,0x02,0xF0,0x6A,0xFC,0x00,0xF0,0xB4,0xFD, + 0x00,0xF0,0xC2,0xFB,0xFD,0xF7,0xD6,0xFF,0xFD,0xF7,0x56,0xFA,0x39,0x48,0x00,0x68, + 0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x5C,0xFA,0xFF,0xF7,0x0C,0xFA, + 0x03,0xE0,0xFF,0xF7,0x09,0xFA,0xFF,0xF7,0x55,0xFA,0x01,0x27,0x7F,0x07,0x78,0x68, + 0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x78,0x60,0x02,0xF0,0x70,0xFF, + 0x02,0xF0,0xBC,0xFD,0x38,0x68,0x00,0x28,0x07,0xD0,0x78,0x68,0x80,0x0F,0x80,0x07, + 0x03,0xD5,0x3E,0x68,0x02,0x24,0x76,0x1C,0x37,0xE0,0x01,0x24,0x26,0x00,0xA0,0x00, + 0xC0,0x19,0x06,0x90,0x05,0x68,0xA8,0x01,0x80,0x0D,0x05,0x90,0xA8,0x05,0x80,0x0D, + 0x04,0x90,0x21,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9,0x05,0xA8,0x02,0xF0, + 0xE3,0xFD,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46, + 0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04,0x1B,0x0C,0x05,0xA8, + 0x03,0xF0,0x14,0xFE,0x04,0xA9,0x05,0xA8,0x03,0xF0,0x1A,0xFC,0x14,0x48,0x04,0x99, + 0x05,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x05,0x43,0xA8,0x0A,0x80,0x02, + 0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42,0xC7,0xD9,0xFD,0xF7, + 0x0D,0xFE,0xFE,0xF7,0xB9,0xF9,0x38,0x68,0xFC,0xF7,0x66,0xFF,0xFF,0xF7,0xDC,0xFE, + 0xFC,0xF7,0xAC,0xFE,0x03,0xF0,0xAE,0xFC,0x06,0x48,0x40,0x79,0x07,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xC8,0x07,0x00,0x20,0x1F,0x07,0x00,0x20,0x00,0x93,0x00,0x00, + 0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xF8,0xB5,0x02,0xF0,0xC5,0xFB,0xFE,0xF7, + 0xD3,0xFD,0xFE,0xF7,0xA3,0xFE,0xFE,0xF7,0xEB,0xFE,0x1C,0x48,0x00,0x21,0xC0,0x7F, + 0x03,0xF0,0x60,0xFB,0x1A,0x4F,0x1B,0x4D,0xFC,0x03,0x00,0x20,0x28,0x70,0xA8,0x61, + 0xE8,0x79,0x00,0x28,0x1D,0xD0,0x01,0x26,0x18,0xE0,0x78,0x68,0x00,0x07,0x15,0xD5, + 0xA6,0x63,0xF8,0x68,0x07,0x28,0x09,0xD1,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0xDF,0xFC,0xFF,0xF7,0x3E,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1, + 0xE0,0x63,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xD2,0xFC,0xE0,0x6B,0x0B,0x28, + 0xE3,0xD1,0xFE,0xF7,0xAD,0xF9,0x28,0x78,0x00,0x28,0xD6,0xD0,0x02,0xF0,0x84,0xF9, + 0xD3,0xE7,0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x00,0x00,0x93,0x00,0x00, + 0x00,0x40,0x00,0x30,0x14,0x07,0x00,0x20,0x70,0xB5,0x05,0x00,0x1A,0x48,0x1B,0x4A, + 0x00,0x68,0x12,0x88,0x60,0x30,0x01,0x7E,0xC0,0x7D,0x2C,0x78,0x89,0x18,0x0E,0x06, + 0x17,0x49,0x36,0x0E,0x4A,0x7F,0x00,0x2A,0x0D,0xD1,0x89,0x7F,0x01,0x29,0x01,0xD1, + 0x80,0x1C,0x06,0xE0,0x02,0x29,0x01,0xD1,0x00,0x1D,0x02,0xE0,0x03,0x29,0x02,0xD1, + 0x80,0x1D,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21, + 0x20,0x00,0xFC,0xF7,0xDB,0xFD,0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3, + 0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0, + 0x13,0x20,0x28,0x70,0x01,0x20,0xF4,0xE7,0xC8,0x07,0x00,0x20,0x00,0x07,0x00,0x20, + 0xA0,0x03,0x00,0x20,0x10,0xB5,0x0C,0x24,0x20,0x00,0xFE,0xF7,0x35,0xFA,0x64,0x1E, + 0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1, + 0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0x10,0xB5,0x07,0x4C, + 0x07,0x48,0x22,0x00,0x00,0x21,0x01,0xF0,0xAB,0xFC,0x06,0x48,0x22,0x00,0x00,0x21, + 0x01,0xF0,0xA6,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x00,0x00,0x00,0x10,0xCE,0x07,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21, + 0x20,0x00,0x01,0xF0,0x95,0xFC,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0x01,0xF0,0x64,0xFC, + 0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19, + 0x0E,0x48,0x00,0x19,0x01,0xF0,0x48,0xFC,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48, + 0xA2,0x00,0x01,0xF0,0x85,0xFC,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21, + 0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0x6A,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xF4,0x78,0x00,0x00,0x40,0x00,0x00,0x20, + 0x24,0x0B,0x00,0x00,0x40,0x00,0x00,0x20,0x05,0x49,0xC8,0x05,0x41,0x62,0x05,0x49, + 0x81,0x62,0x05,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00, + 0x80,0x88,0x3C,0x03,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0x23,0xFA,0x64,0x1C,0x0C,0x2C,0xF9,0xDB, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00, + 0xFD,0xF7,0x70,0xF8,0xFE,0xF7,0x4A,0xFD,0xFE,0xF7,0x14,0xFD,0xFE,0xF7,0x4E,0xFD, + 0xFE,0xF7,0x44,0xFD,0xFE,0xF7,0x06,0xFD,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43, + 0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7, + 0x51,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x93,0x00,0x00, + 0x10,0xB5,0x02,0xF0,0x71,0xFA,0x02,0xF0,0x51,0xFA,0xFF,0x20,0xFD,0xF7,0x82,0xF8, + 0xFF,0xF7,0xAA,0xFF,0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0,0x11,0xFC,0x08,0x20, + 0xFD,0xF7,0x40,0xF8,0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x00,0xFE, + 0x00,0xF0,0x1A,0xF8,0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7, + 0x31,0xF8,0x00,0xF0,0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20,0x02,0xF0,0x3F,0xFA, + 0xFE,0xF7,0x5E,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x48,0x07,0x00,0x20, + 0x02,0x03,0x0F,0x0F,0x00,0x93,0x00,0x00,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25, + 0x30,0x00,0xFD,0xF7,0x17,0xF8,0x20,0x02,0xFD,0xF7,0x3E,0xF8,0x0C,0x48,0x0A,0x21, + 0x00,0x6B,0xFC,0xF7,0xCB,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23, + 0x00,0x95,0x03,0xF0,0x91,0xFA,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94, + 0x03,0xF0,0x8A,0xFA,0x30,0x00,0xFC,0xF7,0xF5,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x07,0x49,0x00,0x20,0xFF,0xF7, + 0xC9,0xFD,0x03,0xF0,0x3C,0xFC,0x05,0x48,0x03,0xF0,0x2C,0xFC,0x00,0x20,0xFF,0xF7, + 0xA7,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x99,0x77,0x00,0x00,0x50,0x46,0x00,0x00, + 0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21, + 0xC9,0x00,0xFC,0xF7,0x93,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0xE0,0x62, + 0x03,0xF0,0xE6,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x07,0xA5,0x07,0x00,0x14,0x07,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xCF,0xFE,0x14,0x48, + 0x00,0x7A,0x03,0xF0,0x83,0xF9,0xFF,0xF7,0x3B,0xFF,0x11,0x48,0x11,0x4A,0xA0,0x30, + 0x41,0x89,0x00,0x24,0xD1,0x83,0x10,0x49,0x0F,0x4A,0xCC,0x60,0x0C,0x61,0x0F,0x49, + 0xC0,0x3A,0x09,0x68,0x40,0x31,0x49,0x7D,0x51,0x70,0x01,0x00,0x20,0x39,0x0A,0x8B, + 0x09,0x49,0x40,0x39,0x8A,0x63,0x00,0x88,0xC8,0x63,0xFF,0xF7,0x9B,0xFE,0x08,0x48, + 0xC4,0x80,0xFE,0xF7,0x33,0xFB,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x07,0x00,0x20,0xC8,0x07,0x00,0x20, + 0x00,0x02,0x00,0x20,0x15,0x07,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90, + 0x00,0x20,0x2B,0x4E,0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0x10,0xFC, + 0xFE,0xF7,0xE6,0xFC,0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F, + 0x00,0x25,0x00,0x90,0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0x37,0xFB,0x00,0x28, + 0x1B,0xD0,0x0E,0x21,0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98, + 0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42, + 0x03,0xDD,0x06,0x00,0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3, + 0x6D,0x1C,0x15,0x2D,0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69, + 0xC0,0x07,0x05,0xD0,0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0, + 0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0, + 0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x68,0xC0,0x9F,0xE5,0x00,0x00,0x9C,0xE5,0x64,0x30,0x9F,0xE5,0x0E,0x06,0xD3,0xE5, + 0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0x0F,0x16,0xD3,0x15,0x00,0x00,0xA0,0x13, + 0x00,0x00,0x51,0x13,0x1E,0xFF,0x2F,0x91,0x0E,0x26,0xD3,0xE5,0x00,0x10,0x83,0xE0, + 0x3D,0x16,0xD1,0xE5,0x02,0x00,0x12,0xE3,0x3C,0x26,0xD3,0xE5,0x82,0x21,0x62,0x00, + 0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10,0x81,0x10,0x82,0x10,0x01,0x11,0x9C,0xE7, + 0x80,0x20,0x83,0xE0,0x02,0x19,0xC1,0xE3,0xB0,0x11,0xC2,0xE1,0x0F,0x16,0xD3,0xE5, + 0x01,0x00,0x80,0xE2,0x00,0x00,0x51,0xE1,0xEE,0xFF,0xFF,0x8A,0x1E,0xFF,0x2F,0xE1, + 0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20,0x10,0xB4,0x0E,0x24,0x62,0x43,0x51,0x18, + 0x0A,0x4A,0x49,0x00,0x52,0x5E,0x0A,0x49,0x1E,0x24,0x0C,0x5F,0xA2,0x42,0x0B,0xDD, + 0x01,0x78,0x00,0x29,0x08,0xD1,0x03,0x70,0x06,0x48,0x59,0x00,0x08,0x18,0xFF,0x30, + 0xA1,0x30,0xC1,0x88,0x49,0x1C,0xC1,0x80,0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x10, + 0xE0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB4,0x9D,0x00,0x2E,0x4B,0x0A,0x27, + 0xEB,0x18,0xFF,0x33,0x21,0x33,0x08,0x25,0x5D,0x5F,0xDF,0x5F,0x00,0x24,0x84,0x46, + 0x04,0x9E,0x05,0x98,0x23,0x00,0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x3A,0xD0,0x03,0x2A, + 0x3E,0xD0,0x04,0x2A,0x11,0xD1,0xAB,0x19,0x1B,0x06,0x1B,0x16,0x0E,0x2B,0x3B,0xDC, + 0x0E,0x24,0x67,0x43,0xFC,0x18,0x06,0xE0,0xBB,0x1B,0x1B,0x06,0x1B,0x16,0x33,0xD4, + 0x0E,0x24,0x5C,0x43,0x64,0x19,0x24,0x06,0x24,0x0E,0x1C,0x4D,0x64,0x00,0x2D,0x5F, + 0x1B,0x4C,0x1E,0x26,0xA6,0x5F,0xB5,0x42,0x26,0xDD,0x64,0x46,0x24,0x78,0x00,0x2C, + 0x22,0xD1,0x84,0x00,0x01,0x2A,0x21,0xD0,0x84,0x00,0x61,0x18,0x02,0x2A,0x1F,0xD0, + 0x03,0x2A,0x1F,0xD0,0x04,0x2A,0x00,0xD1,0xCB,0x70,0x61,0x46,0x08,0x70,0x41,0x00, + 0x0D,0x48,0x08,0x18,0xFF,0x30,0xA1,0x30,0xC1,0x88,0x49,0x1C,0xC1,0x80,0x01,0x20, + 0xF0,0xBC,0x70,0x47,0xBB,0x19,0x1B,0x06,0x1B,0x16,0x15,0x2B,0xD0,0xDD,0x03,0xE0, + 0xAB,0x1B,0x1B,0x06,0x1B,0x16,0xC3,0xD5,0x00,0x20,0xF1,0xE7,0x0B,0x55,0xE4,0xE7, + 0x4B,0x70,0xE2,0xE7,0x8B,0x70,0xE0,0xE7,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0xE0,0x01,0x00,0x20,0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42, + 0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7, + 0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF0,0xB5,0xF3,0x48,0xFF,0xB0,0x00,0x68, + 0x9E,0xB0,0x40,0x30,0x85,0x8B,0x00,0x20,0x96,0x90,0x15,0x20,0x95,0x90,0xEF,0x48, + 0x0C,0x22,0x00,0x21,0x01,0xF0,0xFC,0xF9,0xEC,0x48,0x18,0x22,0x00,0x21,0x0C,0x30, + 0x01,0xF0,0xF6,0xF9,0xFF,0x22,0x6A,0x32,0x00,0x21,0x36,0xA8,0x01,0xF0,0xF0,0xF9, + 0x34,0x22,0x00,0x21,0x29,0xA8,0x01,0xF0,0xEB,0xF9,0x34,0x22,0x00,0x21,0x1C,0xA8, + 0x01,0xF0,0xE6,0xF9,0x34,0x22,0x00,0x21,0x0F,0xA8,0x01,0xF0,0xE1,0xF9,0x34,0x22, + 0x00,0x21,0x02,0xA8,0x01,0xF0,0xDC,0xF9,0xDD,0x4C,0x64,0x21,0x20,0x89,0x68,0x43, + 0xFC,0xF7,0xA4,0xF9,0xD9,0x49,0x89,0x1D,0x9C,0x91,0xE1,0x89,0x40,0x18,0x9C,0x99, + 0xC8,0x83,0x20,0x79,0x00,0x28,0x7E,0xD0,0x00,0x26,0xF7,0xE0,0xB3,0x00,0x9B,0x18, + 0xFF,0x33,0x21,0x33,0x08,0x22,0x9A,0x5E,0x00,0x21,0x08,0x00,0x00,0x2A,0x03,0xDB, + 0x0E,0x20,0x0E,0x2A,0x00,0xDC,0x10,0x00,0x04,0x06,0x0A,0x20,0x18,0x5E,0x24,0x0E, + 0x00,0x28,0x03,0xDB,0x15,0x21,0x15,0x28,0x00,0xDC,0x01,0x00,0x0D,0x06,0x2D,0x0E, + 0x28,0x00,0x0E,0x21,0x48,0x43,0x9B,0x90,0x00,0x19,0x36,0xA9,0x08,0x5C,0x00,0x28, + 0x04,0xD1,0x96,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x96,0x90,0x01,0x20,0x91,0x90, + 0x94,0x90,0x93,0x90,0x96,0x98,0x29,0xAF,0x83,0x00,0x9A,0x93,0xD8,0x19,0xFD,0x54, + 0x99,0x90,0x45,0x70,0x84,0x70,0xC4,0x70,0x96,0x9A,0x00,0x21,0x68,0x46,0x06,0xC0, + 0xF8,0x5C,0x0E,0x21,0x33,0x00,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x01,0x22, + 0x29,0xA9,0xFF,0xF7,0xF9,0xFE,0x00,0x2D,0x92,0x90,0x1D,0xD0,0x00,0x2C,0x0D,0xD0, + 0x68,0x1E,0x0E,0x21,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1E, + 0x6A,0x1E,0x61,0x1E,0xFF,0xF7,0xC8,0xFE,0x0E,0x2C,0x0B,0xD2,0x68,0x1E,0x0E,0x21, + 0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1C,0x6A,0x1E,0x61,0x1C, + 0xFF,0xF7,0xBA,0xFE,0x15,0x2D,0x1D,0xD2,0x00,0x2C,0x0D,0xD0,0x68,0x1C,0x0E,0x21, + 0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x96,0x9B,0x40,0x1E,0x6A,0x1C,0x61,0x1E, + 0xFF,0xF7,0xAA,0xFE,0x0E,0x2C,0x0D,0xD2,0x68,0x1C,0x0E,0x21,0x48,0x43,0x00,0x19, + 0x36,0xA9,0x40,0x18,0x00,0xE0,0x22,0xE1,0x96,0x9B,0x40,0x1C,0x6A,0x1C,0x61,0x1C, + 0xFF,0xF7,0x9A,0xFE,0x01,0x27,0x6B,0xE0,0x92,0x98,0x00,0x28,0x13,0xD0,0xBC,0x42, + 0x11,0xD3,0x96,0x9A,0x9A,0x98,0x01,0x92,0x29,0xA9,0x00,0x97,0x08,0x5C,0x0E,0x21, + 0x33,0x00,0x40,0x1E,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x01,0x22,0x29,0xA9, + 0xFF,0xF7,0xA2,0xFE,0x00,0xE0,0x00,0x20,0x92,0x90,0x91,0x98,0x00,0x28,0x13,0xD0, + 0xE8,0x19,0x15,0x28,0x10,0xD2,0x96,0x9A,0x99,0x98,0x01,0x92,0x00,0x97,0x40,0x78, + 0x0E,0x21,0x33,0x00,0x40,0x1C,0x48,0x43,0x00,0x19,0x36,0xA9,0x40,0x18,0x02,0x22, + 0x29,0xA9,0xFF,0xF7,0x89,0xFE,0x00,0xE0,0x00,0x20,0x91,0x90,0x94,0x98,0x00,0x28, + 0x11,0xD0,0xBC,0x42,0x0F,0xD3,0x96,0x9A,0x99,0x98,0x00,0x97,0x01,0x92,0x80,0x78, + 0x36,0xA9,0x33,0x00,0x41,0x18,0x9B,0x98,0x03,0x22,0x40,0x1E,0x08,0x18,0x29,0xA9, + 0xFF,0xF7,0x72,0xFE,0x00,0xE0,0x00,0x20,0x94,0x90,0x93,0x98,0x00,0x28,0x12,0xD0, + 0xE0,0x19,0x0E,0x28,0x0F,0xD2,0x96,0x9A,0x99,0x98,0x00,0x97,0x01,0x92,0xC0,0x78, + 0x36,0xA9,0x33,0x00,0x41,0x18,0x9B,0x98,0x04,0x22,0x40,0x1C,0x08,0x18,0x29,0xA9, + 0xFF,0xF7,0x5A,0xFE,0x00,0xE0,0x00,0x20,0x93,0x90,0x91,0x99,0x92,0x98,0x40,0x18, + 0x94,0x99,0x40,0x18,0x93,0x99,0x40,0x18,0x05,0xD0,0x7F,0x1C,0x3F,0x06,0x3F,0x0E, + 0x95,0x98,0x87,0x42,0x90,0xD3,0x76,0x1C,0x36,0x06,0x36,0x0E,0x58,0x4A,0x10,0x79, + 0xB0,0x42,0x00,0xD9,0x02,0xE7,0x14,0x00,0x20,0x79,0x35,0xE0,0x83,0x00,0x1D,0x19, + 0xFF,0x35,0x21,0x35,0x06,0x23,0xEB,0x5E,0x00,0x22,0x11,0x00,0x00,0x2B,0x03,0xDB, + 0x15,0x21,0x15,0x2B,0x00,0xDC,0x19,0x00,0x0B,0x06,0x04,0x21,0x69,0x5E,0x1B,0x0E, + 0x00,0x29,0x03,0xDB,0x0E,0x22,0x0E,0x29,0x00,0xDC,0x0A,0x00,0x11,0x06,0x0E,0x22, + 0x53,0x43,0x09,0x0E,0x59,0x18,0x36,0xAA,0x51,0x5C,0x22,0x18,0x13,0x00,0xFF,0x32, + 0x81,0x32,0x51,0x76,0x51,0x7E,0xFF,0x22,0x59,0x32,0x49,0x00,0x09,0x19,0xFF,0x31, + 0xA1,0x31,0xC9,0x88,0x09,0x06,0x09,0x0E,0xD1,0x54,0xA2,0x8B,0x91,0x42,0x00,0xD9, + 0xA1,0x83,0x40,0x1E,0x00,0x06,0x00,0x0E,0x00,0x28,0xC7,0xD1,0x01,0x25,0x62,0xE0, + 0xAC,0x00,0x29,0xA8,0x01,0x5D,0x20,0x18,0x84,0x46,0x40,0x78,0x97,0x90,0x39,0xE0, + 0x62,0x46,0xD2,0x78,0x60,0x46,0x80,0x78,0x98,0x92,0x2D,0xE0,0x0E,0x22,0x4A,0x43, + 0x12,0x18,0x36,0xAB,0x9B,0x5C,0xAB,0x42,0x22,0xD1,0x2E,0x4B,0x52,0x00,0x9A,0x5E, + 0x9C,0x9E,0x1E,0x23,0xF3,0x5E,0x9A,0x42,0x1A,0xDD,0x29,0x4F,0xD2,0x1A,0x46,0x00, + 0xF6,0x19,0x36,0x8C,0x12,0x04,0x12,0x0C,0x56,0x43,0x1C,0xAB,0x1B,0x59,0x9B,0x19, + 0x1C,0xAE,0x33,0x51,0x4E,0x00,0xF6,0x19,0x40,0x36,0xB6,0x8A,0x0F,0xAB,0x1B,0x59, + 0x56,0x43,0x9B,0x19,0x0F,0xAE,0x33,0x51,0x02,0xAE,0x33,0x59,0x9A,0x18,0x32,0x51, + 0x40,0x1C,0x98,0x9A,0x00,0x06,0x00,0x0E,0x82,0x42,0xCF,0xD2,0x49,0x1C,0x97,0x98, + 0x09,0x06,0x09,0x0E,0x88,0x42,0xC3,0xD2,0x02,0xA8,0x06,0x59,0x00,0x2E,0x12,0xD0, + 0x1C,0xA8,0x00,0x59,0x31,0x00,0xFC,0xF7,0x41,0xF9,0x11,0x49,0x6A,0x00,0x57,0x18, + 0xFF,0x21,0x6B,0x31,0xC8,0x53,0x0F,0xA8,0x00,0x59,0x31,0x00,0xFC,0xF7,0x36,0xF9, + 0xFF,0x37,0x81,0x37,0x78,0x80,0x0A,0x48,0x40,0x19,0xFF,0x30,0x81,0x30,0x45,0x76, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x06,0x48,0x00,0x79,0xA8,0x42,0x98,0xD2,0x7F,0xB0, + 0x1E,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC8,0x07,0x00,0x20,0xDA,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xF0,0xB5,0x00,0x20,0xFF,0xB0,0x92,0xB0, + 0x0E,0x90,0x01,0x24,0x0F,0x90,0x0B,0x90,0x09,0x90,0x07,0x90,0xFF,0x4D,0x06,0x90, + 0x28,0x78,0xFF,0x4F,0x00,0x28,0x0A,0xD0,0xFE,0x48,0x01,0x79,0x05,0x91,0x41,0x79, + 0x04,0x91,0x81,0x79,0x03,0x91,0xC1,0x79,0x02,0x91,0x00,0x7A,0x0C,0xE0,0x38,0x68, + 0x01,0x00,0x20,0x30,0x42,0x7F,0x40,0x31,0x05,0x92,0x82,0x7F,0x04,0x92,0xC0,0x7F, + 0x03,0x90,0x08,0x78,0x02,0x90,0x48,0x78,0x2E,0x22,0x00,0x21,0x01,0x90,0x1C,0xA8, + 0x00,0xF0,0xEE,0xFF,0xF0,0x48,0xF1,0x49,0x00,0x22,0x08,0x81,0xF0,0x48,0x8A,0x81, + 0x90,0x90,0x42,0x81,0xEF,0x48,0xF0,0x4A,0x8F,0x90,0x40,0x7A,0x8E,0x92,0x02,0x28, + 0x02,0xD9,0x3A,0x68,0x52,0x8C,0x10,0xE0,0x02,0x28,0x06,0xD1,0x3A,0x68,0x8E,0x9B, + 0x12,0x8C,0xDB,0x88,0xD2,0x18,0x0C,0x92,0x0F,0xE0,0x2A,0x78,0x00,0x2A,0x06,0xD0, + 0xE6,0x4A,0x8E,0x9B,0x92,0x89,0x9B,0x88,0xD2,0x18,0x0C,0x92,0x05,0xE0,0x3A,0x68, + 0x8E,0x9B,0xD2,0x8B,0x9B,0x88,0xD2,0x18,0x0C,0x92,0xE1,0x4A,0x0C,0x9B,0x8D,0x92, + 0x12,0x89,0xDA,0x49,0x0E,0x26,0xD2,0x18,0x0D,0x92,0x8E,0x5F,0x01,0x28,0x06,0xD9, + 0x39,0x68,0xC9,0x7E,0x48,0x43,0x04,0x06,0x24,0x0E,0x00,0xD1,0x01,0x24,0x90,0x99, + 0x3D,0x68,0x08,0x20,0x08,0x5E,0xA9,0x7E,0x48,0x43,0x03,0xF0,0x57,0xF8,0x08,0x04, + 0x29,0x8B,0x00,0x0C,0x81,0x42,0x00,0xD9,0x08,0x00,0x21,0x00,0xFC,0xF7,0x9E,0xF8, + 0x90,0x99,0x48,0x81,0x21,0x00,0x30,0x00,0xFB,0xF7,0x68,0xFF,0x00,0x04,0x00,0x14, + 0x8E,0x99,0x0A,0x90,0x40,0x35,0x68,0x89,0x09,0x89,0x0D,0x9E,0x44,0x18,0xB4,0x42, + 0x00,0xD2,0x0D,0x94,0xC7,0x48,0x8C,0x90,0x80,0x7B,0xC1,0x07,0x05,0xD0,0x80,0x07, + 0x01,0xD5,0x01,0x20,0x00,0xE0,0x02,0x20,0x09,0x90,0xC3,0x49,0x00,0x20,0x8B,0x91, + 0xBA,0x4F,0x88,0x83,0x78,0x89,0xA9,0x7B,0x48,0x43,0x03,0xF0,0x5B,0xF8,0x08,0x04, + 0x8B,0x99,0x00,0x14,0xC8,0x83,0xA9,0x89,0x88,0x42,0x02,0xDA,0xA8,0x89,0x8B,0x99, + 0xC8,0x83,0x0D,0x98,0x0C,0x21,0x00,0x04,0x00,0x14,0x8A,0x90,0x20,0x04,0x00,0x14, + 0x89,0x90,0x30,0x04,0x00,0x14,0x88,0x90,0x09,0x98,0x00,0x25,0xC0,0x07,0xC0,0x0F, + 0x09,0x1A,0x87,0x91,0x0D,0x21,0x08,0x1A,0x86,0x90,0x09,0x98,0x13,0x21,0x80,0x07, + 0xC0,0x0F,0x09,0x1A,0x85,0x91,0x14,0x21,0x08,0x1A,0x84,0x90,0xAB,0x48,0x83,0x90, + 0x0E,0x20,0x68,0x43,0xA1,0x49,0x82,0x90,0x68,0x00,0x00,0x24,0x40,0x18,0x40,0x30, + 0x81,0x90,0x82,0x98,0xA6,0x49,0x00,0x19,0x00,0x04,0x00,0x14,0x1B,0x90,0x40,0x00, + 0x80,0x90,0x08,0x5E,0x8B,0x99,0x1E,0x22,0x8A,0x5E,0x90,0x42,0x02,0xDD,0x88,0x8B, + 0x40,0x1C,0x88,0x83,0x9F,0x49,0x80,0x98,0x08,0x5E,0x8A,0x99,0x88,0x42,0x7F,0x90, + 0x00,0xDA,0xFE,0xE3,0x00,0x20,0x00,0x2D,0x25,0xDD,0x1B,0x99,0x01,0x22,0x0E,0x39, + 0xC8,0x10,0x4B,0x07,0x1C,0xAF,0x38,0x5C,0x5B,0x0F,0x11,0x00,0x99,0x40,0x08,0x40, + 0x00,0x2C,0x0B,0xDD,0x1B,0x99,0x0F,0x39,0xCB,0x10,0xFE,0x5C,0x4B,0x07,0x5B,0x0F, + 0x11,0x00,0x99,0x40,0x0E,0x40,0x30,0x18,0x00,0x06,0x00,0x0E,0x0D,0x2C,0x0C,0xDA, + 0x1B,0x99,0x0D,0x39,0xCB,0x10,0x49,0x07,0xFE,0x5C,0x49,0x0F,0x8A,0x40,0x16,0x40, + 0x30,0x18,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0C,0xDD,0x1B,0x99,0x1C,0xAB,0x49,0x1E, + 0xCA,0x10,0x9A,0x5C,0x4B,0x07,0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40,0x10,0x18, + 0x00,0x06,0x00,0x0E,0x00,0x28,0x00,0xD0,0xC3,0xE3,0x7F,0x48,0x00,0x7D,0x80,0x07, + 0x06,0xD5,0x0D,0x2C,0x0E,0xD1,0x7D,0x48,0x00,0x78,0x01,0x28,0x0A,0xD1,0x05,0xE0, + 0x14,0x2D,0x07,0xD1,0x79,0x48,0x00,0x78,0x01,0x28,0x03,0xD1,0x74,0x4A,0x80,0x99, + 0x00,0x20,0x50,0x52,0x00,0x26,0x37,0x00,0xE9,0x19,0x8C,0x46,0x00,0x20,0x49,0x1E, + 0x0E,0x22,0x51,0x43,0x7E,0x91,0x21,0x18,0x62,0x46,0x52,0x1E,0x49,0x1E,0x00,0x2A, + 0x0D,0xDB,0x15,0x2A,0x0B,0xDC,0x00,0x29,0x09,0xDB,0x0E,0x29,0x07,0xDC,0x7E,0x9A, + 0x51,0x18,0x68,0x4A,0x49,0x00,0x51,0x5E,0xB1,0x42,0x00,0xDD,0x0E,0x00,0x40,0x1C, + 0x00,0x04,0x00,0x14,0x03,0x28,0xE6,0xDB,0x7F,0x1C,0x3F,0x04,0x3F,0x14,0x03,0x2F, + 0xDA,0xDB,0x7F,0x99,0x30,0x04,0x00,0x14,0x81,0x42,0x00,0xD0,0x81,0xE3,0x53,0x49, + 0x89,0x89,0x81,0x42,0x06,0xDC,0x51,0x49,0x88,0x81,0x08,0x79,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x0F,0x90,0x1B,0x98,0x1B,0x9B,0xC0,0x10,0x5E,0x07,0x1C,0xAA,0x11,0x5C, + 0x76,0x0F,0x01,0x23,0xB3,0x40,0x19,0x43,0x11,0x54,0x00,0x20,0x08,0x90,0x09,0x98, + 0xC0,0x07,0x0A,0xD0,0x0D,0x2C,0x01,0xD1,0x0D,0x20,0x09,0xE0,0x0C,0x2C,0x0F,0xD1, + 0x08,0x98,0x21,0x04,0x08,0x43,0x08,0x90,0x0A,0xE0,0x14,0x2D,0x02,0xD1,0x14,0x20, + 0x08,0x90,0x05,0xE0,0x13,0x2D,0x03,0xD1,0x08,0x98,0x29,0x04,0x08,0x43,0x08,0x90, + 0x08,0x98,0x00,0x04,0x7F,0x98,0x04,0xD0,0x89,0x99,0x88,0x42,0x00,0xDA,0x48,0xE3, + 0x03,0xE0,0x88,0x99,0x88,0x42,0x00,0xDA,0x43,0xE3,0x31,0x49,0x08,0x68,0x7D,0x90, + 0x00,0x88,0x40,0x04,0x04,0xD5,0x31,0x4A,0x7F,0x98,0xD2,0x89,0x80,0x1A,0x05,0xE0, + 0x37,0x4A,0x80,0x98,0x10,0x5E,0x2D,0x4A,0xD2,0x89,0x80,0x1A,0x00,0x28,0x00,0xDC, + 0x2F,0xE3,0x90,0x9B,0x0A,0x22,0x9A,0x5E,0x82,0x42,0x00,0xDB,0x29,0xE3,0x00,0x20, + 0x84,0x46,0x10,0x90,0x7D,0x98,0x40,0x30,0x7C,0x90,0x61,0x46,0x69,0x18,0x89,0x1E, + 0x09,0x06,0x09,0x16,0x0E,0x22,0x7B,0x91,0x51,0x43,0x7A,0x91,0x14,0x23,0x61,0x46, + 0x59,0x43,0x31,0xAA,0x8A,0x18,0x79,0x92,0x00,0x20,0x4A,0xAA,0x8A,0x18,0x23,0x18, + 0x9B,0x1E,0x7B,0x99,0x1E,0x06,0x36,0x16,0x16,0x29,0x03,0xD2,0x00,0x2E,0x01,0xDB, + 0x0E,0x2E,0x03,0xDD,0x00,0x21,0x83,0x00,0xD1,0x50,0x6F,0xE0,0x7D,0x99,0x09,0x88, + 0x49,0x04,0x7A,0x99,0x08,0xD5,0x1B,0x4B,0x89,0x19,0x49,0x00,0x59,0x5E,0x0A,0x9B, + 0xC9,0x1A,0x83,0x00,0xD1,0x50,0x07,0xE0,0x15,0x4B,0x89,0x19,0x49,0x00,0x59,0x5E, + 0x0A,0x9B,0xC9,0x1A,0x83,0x00,0xD1,0x50,0x81,0x00,0x53,0x58,0x00,0x2B,0x01,0xDA, + 0x00,0x27,0x57,0x50,0x7D,0x9B,0x1B,0x88,0x1B,0x04,0x21,0xE0,0x20,0x07,0x00,0x20, + 0xC8,0x07,0x00,0x20,0xE0,0x95,0x00,0x00,0xFF,0x0F,0x00,0x00,0x40,0x00,0x00,0x20, + 0x20,0x01,0x00,0x20,0x00,0x02,0x00,0x20,0x00,0x07,0x00,0x20,0xA0,0x95,0x00,0x00, + 0xA0,0x01,0x00,0x20,0x40,0x06,0x00,0x20,0x20,0x06,0x00,0x20,0x80,0x00,0x00,0x20, + 0x00,0x00,0x00,0x10,0xCE,0x07,0x00,0x20,0x00,0x93,0x00,0x00,0x44,0x07,0x00,0x20, + 0x7A,0x9F,0x08,0xD5,0xBB,0x19,0x5B,0x00,0xFF,0x4E,0x79,0x9F,0xF6,0x5E,0x0A,0x9B, + 0xF6,0x1A,0x7E,0x50,0x07,0xE0,0xBB,0x19,0xFC,0x4E,0x5B,0x00,0xF6,0x5E,0x0A,0x9B, + 0x79,0x9F,0xF6,0x1A,0x7E,0x50,0x79,0x9E,0x73,0x58,0x00,0x2B,0x02,0xDA,0x79,0x9F, + 0x00,0x26,0x7E,0x50,0x7C,0x9B,0x57,0x58,0x1E,0x89,0xB7,0x42,0x00,0xDD,0x56,0x50, + 0x61,0x46,0x00,0x29,0x0A,0xD0,0x04,0x29,0x08,0xD0,0x00,0x28,0x06,0xD0,0x04,0x28, + 0x04,0xD0,0x10,0x99,0x49,0x1C,0x09,0x06,0x09,0x0E,0x10,0x91,0x40,0x1C,0x00,0x04, + 0x00,0x14,0x05,0x28,0x00,0xDA,0x7A,0xE7,0x60,0x46,0x40,0x1C,0x00,0x04,0x00,0x14, + 0x05,0x28,0x84,0x46,0x00,0xDA,0x60,0xE7,0xE5,0x48,0x00,0x78,0x00,0x28,0x29,0xD1, + 0x10,0x98,0x40,0x1E,0x07,0x06,0x3F,0x0E,0x00,0xD1,0x01,0x27,0x57,0x9A,0x50,0xA8, + 0x00,0x92,0x07,0xC8,0x55,0x9B,0x01,0xF0,0x78,0xFD,0x06,0x00,0x5A,0xA8,0x07,0xC8, + 0x01,0xF0,0x70,0xFD,0x30,0x18,0x39,0x00,0xFB,0xF7,0x68,0xFD,0x56,0x99,0x09,0x1A, + 0x00,0x29,0x01,0xDC,0x56,0x99,0x41,0x1A,0xD6,0x48,0x00,0x68,0xC0,0x30,0x02,0x88, + 0x91,0x42,0x07,0xDA,0x40,0x88,0x56,0x99,0x81,0x42,0x03,0xDA,0x08,0x98,0x00,0x04, + 0x00,0xD1,0xF1,0xE3,0x12,0x22,0x00,0x21,0x28,0xA8,0x00,0xF0,0x81,0xFD,0x37,0x98, + 0xCC,0x49,0x28,0x90,0x38,0x98,0x29,0x90,0x39,0x98,0x2A,0x90,0x3C,0x98,0x2B,0x90, + 0x3E,0x98,0x2D,0x90,0x41,0x98,0x2E,0x90,0x42,0x98,0x2F,0x90,0x43,0x98,0x30,0x90, + 0x09,0x68,0x3D,0x98,0x89,0x8B,0x48,0x43,0x02,0xF0,0x18,0xFE,0x57,0x98,0x2C,0x91, + 0x02,0x04,0x12,0x14,0x00,0x92,0x55,0x98,0x06,0x04,0x52,0x98,0x33,0x14,0x02,0x04, + 0x51,0x98,0x12,0x14,0x01,0x04,0x50,0x98,0x09,0x14,0x00,0x04,0x00,0x14,0xFF,0xF7, + 0x3C,0xFB,0x06,0x00,0x5C,0x98,0x02,0x04,0x5B,0x98,0x12,0x14,0x01,0x04,0x5A,0x98, + 0x09,0x14,0x00,0x04,0x00,0x14,0xFF,0xF7,0x29,0xFB,0x01,0x00,0x30,0x00,0xFF,0xF7, + 0x21,0xFB,0x56,0x99,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42,0x05,0xDD, + 0x08,0x1A,0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x06,0x90,0xAA,0x48,0xFF,0x21, + 0xC0,0x88,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20,0x06,0x90, + 0x86,0x98,0x04,0x26,0x14,0x90,0x84,0x98,0x13,0x90,0x05,0x98,0x80,0x07,0x3C,0xD5, + 0x00,0x2C,0x1B,0xD1,0x14,0x20,0x70,0x43,0x4A,0xA9,0x40,0x18,0x78,0x90,0x87,0x68, + 0xC0,0x68,0x64,0x22,0x50,0x43,0x79,0x1C,0xFB,0xF7,0xE8,0xFC,0x64,0x21,0x09,0x1A, + 0x00,0xD5,0x00,0x21,0x02,0x9A,0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0xD0,0xFD, + 0x78,0x98,0x40,0x68,0x88,0x42,0x01,0xDA,0x78,0x98,0x41,0x60,0x14,0x98,0x84,0x42, + 0x1B,0xD1,0x14,0x20,0x70,0x43,0x4A,0xA9,0x40,0x18,0x77,0x90,0x87,0x68,0x40,0x68, + 0x64,0x22,0x50,0x43,0x79,0x1C,0xFB,0xF7,0xC9,0xFC,0x64,0x21,0x09,0x1A,0x00,0xD5, + 0x00,0x21,0x01,0x9A,0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0xB1,0xFD,0x77,0x98, + 0xC0,0x68,0x88,0x42,0x01,0xDA,0x77,0x98,0xC1,0x60,0x05,0x98,0xC0,0x07,0x3A,0xD0, + 0x00,0x2D,0x1A,0xD1,0xB0,0x00,0x4A,0xA9,0x40,0x18,0x76,0x90,0x87,0x6A,0xC0,0x6B, + 0x64,0x22,0x50,0x43,0x79,0x1C,0xFB,0xF7,0xA9,0xFC,0x64,0x21,0x09,0x1A,0x00,0xD5, + 0x00,0x21,0x04,0x9A,0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0x91,0xFD,0x76,0x98, + 0x40,0x69,0x88,0x42,0x01,0xDA,0x76,0x98,0x41,0x61,0x13,0x98,0x85,0x42,0x1A,0xD1, + 0xB0,0x00,0x4A,0xA9,0x40,0x18,0x75,0x90,0x87,0x6A,0x40,0x69,0x64,0x22,0x50,0x43, + 0x79,0x1C,0xFB,0xF7,0x8B,0xFC,0x64,0x21,0x09,0x1A,0x00,0xD5,0x00,0x21,0x03,0x9A, + 0x38,0x00,0x51,0x43,0x48,0x43,0x02,0xF0,0x73,0xFD,0x75,0x98,0xC0,0x6B,0x88,0x42, + 0x01,0xDA,0x75,0x98,0xC1,0x63,0x76,0x1E,0x36,0x04,0x36,0x14,0x00,0xD4,0x7C,0xE7, + 0x05,0x98,0x00,0x26,0x80,0x07,0x00,0xD5,0xF0,0x26,0x05,0x98,0xC0,0x07,0x01,0xD0, + 0x3C,0x20,0x06,0x43,0xB0,0x09,0x19,0xD0,0x14,0x98,0x84,0x42,0x16,0xD1,0x00,0x2D, + 0x14,0xD1,0x5A,0x98,0x64,0x22,0x50,0x43,0x56,0x99,0x49,0x1C,0xFB,0xF7,0x5E,0xFC, + 0x64,0x21,0x09,0x1A,0x00,0xD5,0x00,0x21,0x01,0x9A,0x56,0x98,0x51,0x43,0x48,0x43, + 0x02,0xF0,0x46,0xFD,0x52,0x98,0x88,0x42,0x00,0xDA,0x52,0x91,0xB0,0x06,0x80,0x0F, + 0x1A,0xD0,0x14,0x98,0x84,0x42,0x17,0xD1,0x13,0x98,0x85,0x42,0x14,0xD1,0x50,0x98, + 0x64,0x22,0x50,0x43,0x56,0x99,0x49,0x1C,0xFB,0xF7,0x40,0xFC,0x64,0x21,0x09,0x1A, + 0x00,0xD5,0x00,0x21,0x01,0x9A,0x56,0x98,0x51,0x43,0x48,0x43,0x02,0xF0,0x28,0xFD, + 0x5C,0x98,0x88,0x42,0x00,0xDA,0x5C,0x91,0x30,0x07,0x80,0x0F,0x19,0xD0,0x13,0x98, + 0x85,0x42,0x16,0xD1,0x00,0x2C,0x14,0xD1,0x52,0x98,0x64,0x22,0x50,0x43,0x56,0x99, + 0x49,0x1C,0xFB,0xF7,0x23,0xFC,0x64,0x21,0x09,0x1A,0x00,0xD5,0x00,0x21,0x03,0x9A, + 0x56,0x98,0x51,0x43,0x48,0x43,0x02,0xF0,0x0B,0xFD,0x5A,0x98,0x88,0x42,0x00,0xDA, + 0x5A,0x91,0x30,0x48,0x04,0x27,0x06,0x68,0x40,0x36,0xB0,0x78,0x80,0x06,0x22,0xD5, + 0x00,0x2C,0x20,0xD1,0x14,0x20,0x78,0x43,0x4A,0xA9,0x40,0x18,0x74,0x90,0x81,0x68, + 0xC0,0x68,0x64,0x22,0x73,0x90,0x50,0x43,0x49,0x1C,0xFB,0xF7,0xFF,0xFB,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x72,0x79,0x73,0x98,0x50,0x43, + 0x48,0x43,0x02,0xF0,0xE5,0xFC,0x73,0x98,0x40,0x1A,0x74,0x99,0xC8,0x60,0x02,0xD5, + 0x74,0x99,0x00,0x20,0xC8,0x60,0xB0,0x78,0xC0,0x06,0x20,0xD5,0x01,0x2C,0x1E,0xD1, + 0x14,0x20,0x78,0x43,0x4A,0xA9,0x72,0x79,0x40,0x18,0x72,0x90,0xC1,0x68,0x4A,0x43, + 0x81,0x68,0x10,0x00,0x49,0x1C,0xFB,0xF7,0xD9,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04, + 0x09,0x14,0x00,0xD5,0x00,0x21,0x72,0x98,0x40,0x68,0x48,0x43,0x02,0xF0,0xAE,0xFC, + 0x72,0x98,0x00,0x29,0x41,0x60,0x02,0xDA,0x72,0x99,0x00,0x20,0x48,0x60,0xB0,0x78, + 0x40,0x06,0x2C,0xD5,0x87,0x98,0xA0,0x42,0x29,0xD1,0x14,0x20,0x78,0x43,0x4A,0xA9, + 0xB2,0x79,0x40,0x18,0x71,0x90,0x09,0xE0,0xCE,0x07,0x00,0x20,0x00,0x00,0x00,0x10, + 0x21,0x07,0x00,0x20,0xC8,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x41,0x68,0x4A,0x43, + 0x81,0x68,0x10,0x00,0x49,0x1C,0xFB,0xF7,0xA9,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04, + 0x09,0x14,0x00,0xD5,0x00,0x21,0x71,0x98,0xC0,0x68,0x48,0x43,0x02,0xF0,0x7E,0xFC, + 0x71,0x98,0x00,0x29,0xC1,0x60,0x02,0xDA,0x71,0x99,0x00,0x20,0xC8,0x60,0xB0,0x78, + 0x00,0x06,0x23,0xD5,0x86,0x98,0xA0,0x42,0x20,0xD1,0x14,0x20,0x78,0x43,0x4A,0xA9, + 0x40,0x18,0x70,0x90,0x81,0x68,0x40,0x68,0x64,0x22,0x6F,0x90,0x50,0x43,0x49,0x1C, + 0xFB,0xF7,0x84,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21, + 0xB2,0x79,0x6F,0x98,0x50,0x43,0x48,0x43,0x02,0xF0,0x6A,0xFC,0x6F,0x98,0x40,0x1A, + 0x70,0x99,0x48,0x60,0x02,0xD5,0x70,0x99,0x00,0x20,0x48,0x60,0xB0,0x78,0x80,0x07, + 0x21,0xD5,0x00,0x2D,0x1F,0xD1,0xB8,0x00,0x4A,0xA9,0x40,0x18,0x6E,0x90,0x81,0x6A, + 0xC0,0x6B,0x64,0x22,0x6D,0x90,0x50,0x43,0x49,0x1C,0xFB,0xF7,0x5F,0xFB,0x64,0x21, + 0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0xF2,0x78,0x6D,0x98,0x50,0x43, + 0x48,0x43,0x02,0xF0,0x45,0xFC,0x6D,0x98,0x40,0x1A,0x6E,0x99,0xC8,0x63,0x02,0xD5, + 0x6E,0x99,0x00,0x20,0xC8,0x63,0xB0,0x78,0xC0,0x07,0x1F,0xD0,0x01,0x2D,0x1D,0xD1, + 0xB8,0x00,0x4A,0xA9,0xF2,0x78,0x40,0x18,0x6C,0x90,0xC1,0x6B,0x4A,0x43,0x81,0x6A, + 0x10,0x00,0x49,0x1C,0xFB,0xF7,0x3A,0xFB,0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14, + 0x00,0xD5,0x00,0x21,0x6C,0x98,0x40,0x69,0x48,0x43,0x02,0xF0,0x0F,0xFC,0x6C,0x98, + 0x00,0x29,0x41,0x61,0x02,0xDA,0x6C,0x99,0x00,0x20,0x48,0x61,0xB0,0x78,0x40,0x07, + 0x20,0xD5,0x85,0x98,0xA8,0x42,0x1D,0xD1,0xB8,0x00,0x4A,0xA9,0x32,0x79,0x40,0x18, + 0x6B,0x90,0x41,0x69,0x4A,0x43,0x81,0x6A,0x10,0x00,0x49,0x1C,0xFB,0xF7,0x16,0xFB, + 0x64,0x21,0x08,0x1A,0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x6B,0x98,0xC0,0x6B, + 0x48,0x43,0x02,0xF0,0xEB,0xFB,0x6B,0x98,0x00,0x29,0xC1,0x63,0x02,0xDA,0x6B,0x99, + 0x00,0x20,0xC8,0x63,0xB0,0x78,0x00,0x07,0x24,0xD5,0x84,0x98,0xA8,0x42,0x21,0xD1, + 0x00,0xE0,0x99,0xE1,0xB8,0x00,0x4A,0xA9,0x40,0x18,0x6A,0x90,0x81,0x6A,0x40,0x69, + 0x64,0x22,0x69,0x90,0x50,0x43,0x49,0x1C,0xFB,0xF7,0xF0,0xFA,0x64,0x21,0x08,0x1A, + 0x01,0x04,0x09,0x14,0x00,0xD5,0x00,0x21,0x32,0x79,0x69,0x98,0x50,0x43,0x48,0x43, + 0x02,0xF0,0xD6,0xFB,0x69,0x98,0x40,0x1A,0x6A,0x99,0x48,0x61,0x02,0xD5,0x6A,0x99, + 0x00,0x20,0x48,0x61,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0x00,0xD4,0xC5,0xE6,0x08,0x98, + 0x00,0x28,0x2C,0xD0,0x09,0x98,0xC0,0x07,0x16,0xD0,0x04,0x20,0x00,0x22,0x4A,0xAE, + 0x08,0x99,0x09,0x04,0x06,0xD0,0x14,0x23,0x01,0x00,0x59,0x43,0x72,0x50,0x89,0x19, + 0x4A,0x60,0x04,0xE0,0x14,0x21,0x41,0x43,0x89,0x19,0xCA,0x60,0x0A,0x61,0x40,0x1E, + 0x00,0x04,0x00,0x14,0xEC,0xD5,0x12,0xE0,0x04,0x20,0x00,0x22,0x4A,0xAE,0x08,0x99, + 0x09,0x04,0x04,0xD0,0x81,0x00,0x72,0x50,0x89,0x19,0x4A,0x61,0x03,0xE0,0x81,0x00, + 0x89,0x19,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xEF,0xD5,0x00,0x26, + 0x37,0x00,0xE9,0x19,0x68,0x91,0x00,0x20,0x49,0x1E,0x0E,0x22,0x51,0x43,0x8C,0x46, + 0x68,0x9A,0x21,0x18,0x52,0x1E,0x49,0x1E,0x00,0x2A,0x0C,0xDB,0x15,0x2A,0x0A,0xDC, + 0x00,0x29,0x08,0xDB,0x0E,0x29,0x06,0xDC,0x61,0x44,0x49,0x00,0xFF,0x4A,0x51,0x5E, + 0xB1,0x42,0x00,0xDD,0x0E,0x00,0x40,0x1C,0x00,0x04,0x00,0x14,0x03,0x28,0xE7,0xDB, + 0x7F,0x1C,0x3F,0x04,0x3F,0x14,0x03,0x2F,0xDB,0xDB,0xF9,0x49,0x30,0x04,0x0A,0x89, + 0x00,0x14,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81, + 0xF3,0x49,0x08,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x08,0x71,0x80,0x00,0x40,0x18, + 0xFF,0x30,0x21,0x30,0x84,0x80,0x08,0x79,0x80,0x00,0x40,0x18,0xFF,0x30,0x21,0x30, + 0xC5,0x80,0x2B,0xA8,0x05,0xC8,0x00,0x21,0x90,0x42,0x05,0xDC,0x28,0x98,0x90,0x42, + 0x02,0xDC,0x2E,0x98,0x90,0x42,0x00,0xDD,0xC0,0x21,0x2D,0x98,0x90,0x42,0x05,0xDC, + 0x2A,0x98,0x90,0x42,0x02,0xDC,0x30,0x98,0x90,0x42,0x01,0xDD,0x30,0x20,0x01,0x43, + 0x29,0x98,0x90,0x42,0x05,0xDC,0x28,0x98,0x90,0x42,0x02,0xDC,0x2A,0x98,0x90,0x42, + 0x01,0xDD,0x0C,0x20,0x01,0x43,0x2F,0x98,0x90,0x42,0x05,0xDC,0x2E,0x98,0x90,0x42, + 0x02,0xDC,0x30,0x98,0x90,0x42,0x01,0xDD,0x03,0x20,0x01,0x43,0x8F,0x06,0x0A,0x07, + 0x04,0x20,0x94,0x46,0x00,0x22,0x8B,0x09,0x04,0xD1,0x14,0x26,0x03,0x00,0x73,0x43, + 0x4A,0xAE,0xF2,0x50,0xBB,0x0F,0x05,0xD1,0x14,0x26,0x03,0x00,0x73,0x43,0x4A,0xAE, + 0x9B,0x19,0x1A,0x61,0x63,0x46,0x9B,0x0F,0x02,0xD1,0x83,0x00,0x4A,0xAE,0xF2,0x50, + 0x8B,0x07,0x03,0xD1,0x83,0x00,0x4A,0xAE,0x9B,0x19,0x1A,0x65,0x40,0x1E,0x00,0x04, + 0x00,0x14,0xE0,0xD5,0x4E,0x9A,0x4A,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0x15,0xFA, + 0x53,0x9A,0x19,0x90,0x4F,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0x0E,0xFA,0x58,0x9A, + 0x18,0x90,0x54,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0x07,0xFA,0x17,0x90,0x5D,0x9A, + 0x59,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0x00,0xFA,0x62,0x9A,0x16,0x90,0x5E,0xA8, + 0x00,0x92,0x0F,0xC8,0x01,0xF0,0xF9,0xF9,0x15,0x90,0x00,0x90,0x16,0x9B,0x17,0x9A, + 0x18,0x99,0x19,0x98,0x01,0xF0,0xF1,0xF9,0x00,0x28,0x1A,0x90,0x08,0xD1,0x64,0x22, + 0x00,0x21,0x4A,0xA8,0x00,0xF0,0x14,0xFA,0x0A,0x20,0x56,0x90,0x17,0x90,0x1A,0x90, + 0x5E,0x9A,0x59,0x9B,0x00,0x92,0x54,0x9A,0x4F,0x99,0x4A,0x98,0x01,0xF0,0xDD,0xF9, + 0xA3,0x4A,0x61,0x00,0x8E,0x18,0xF1,0x8B,0x48,0x43,0x14,0x90,0x5F,0x9A,0x00,0x92, + 0x5A,0x9B,0x55,0x9A,0x50,0x99,0x4B,0x98,0x01,0xF0,0xCF,0xF9,0x31,0x8C,0x60,0x9A, + 0x5B,0x9B,0x48,0x43,0x13,0x90,0x00,0x92,0x56,0x9A,0x51,0x99,0x4C,0x98,0x01,0xF0, + 0xC4,0xF9,0x71,0x8C,0x61,0x9A,0x5C,0x9B,0x48,0x43,0x12,0x90,0x00,0x92,0x57,0x9A, + 0x52,0x99,0x4D,0x98,0x01,0xF0,0xB9,0xF9,0xB1,0x8C,0x07,0x00,0x62,0x9A,0x4F,0x43, + 0x00,0x92,0x5D,0x9B,0x58,0x9A,0x53,0x99,0x4E,0x98,0x11,0x97,0x01,0xF0,0xAD,0xF9, + 0xF1,0x8C,0x11,0x9B,0x12,0x9A,0x48,0x43,0x00,0x90,0x13,0x99,0x14,0x98,0x01,0xF0, + 0xA4,0xF9,0x1A,0x99,0xFB,0xF7,0x9A,0xF9,0x85,0x49,0x09,0x8C,0x49,0x00,0x40,0x1A, + 0x00,0xD5,0x00,0x20,0x82,0x4F,0x39,0x79,0x49,0x00,0xC9,0x19,0xE0,0x31,0x88,0x82, + 0x81,0x98,0x19,0x99,0x40,0x8A,0x18,0x9A,0x17,0x9B,0x48,0x43,0x81,0x99,0x89,0x8A, + 0x51,0x43,0x81,0x9A,0xD2,0x8A,0x5A,0x43,0x94,0x46,0x81,0x9A,0x15,0x9B,0x16,0x8B, + 0x16,0x9A,0x56,0x43,0x81,0x9A,0x52,0x8B,0x5A,0x43,0x00,0x92,0x33,0x00,0x62,0x46, + 0x01,0xF0,0x7B,0xF9,0x1A,0x99,0xFB,0xF7,0x71,0xF9,0x83,0x99,0x89,0x8A,0x49,0x00, + 0x40,0x1A,0x00,0xD5,0x00,0x20,0x39,0x79,0x49,0x00,0xC9,0x19,0xFF,0x31,0x01,0x31, + 0xC8,0x81,0x38,0x79,0x0C,0x28,0x10,0xD2,0x64,0x1C,0x24,0x04,0x24,0x14,0x0E,0x2C, + 0x01,0xDA,0xFF,0xF7,0x46,0xFA,0x0E,0x98,0x00,0x28,0x06,0xD1,0x6D,0x1C,0x2D,0x04, + 0x2D,0x14,0x15,0x2D,0x01,0xDA,0xFF,0xF7,0x33,0xFA,0x62,0x48,0x04,0x68,0x20,0x88, + 0x00,0x06,0x4C,0xD5,0x5E,0x4A,0x10,0x79,0x00,0x28,0x8D,0x98,0x0C,0xD1,0x00,0x89, + 0x00,0x28,0x3D,0xD0,0x8D,0x98,0x20,0x34,0x40,0x79,0x21,0x7F,0x88,0x42,0x37,0xD2, + 0x8D,0x99,0x40,0x1C,0x48,0x71,0x3A,0xE0,0x25,0x00,0x20,0x35,0x80,0x79,0x29,0x7D, + 0x88,0x42,0x29,0xD8,0x40,0x1C,0x8D,0x99,0x00,0x06,0x00,0x0E,0x88,0x71,0x69,0x7D, + 0x81,0x42,0x03,0xD2,0x92,0x89,0x0B,0x9B,0xD2,0x18,0x0B,0x92,0x2A,0x7D,0x90,0x42, + 0x1A,0xD1,0x88,0x42,0x18,0xD0,0x41,0x1A,0x0B,0x98,0xFB,0xF7,0x4F,0xFA,0x8D,0x9A, + 0x00,0x21,0x11,0x81,0x21,0x8F,0x81,0x42,0x0E,0xD2,0x0C,0x99,0x40,0x1A,0xA9,0x7D, + 0x48,0x43,0x02,0xF0,0x27,0xFA,0x8D,0x98,0x09,0x04,0x09,0x0C,0x01,0x81,0x60,0x8F, + 0x81,0x42,0x01,0xD9,0x8D,0x99,0x08,0x81,0x8D,0x98,0x00,0x21,0x41,0x71,0x06,0xE0, + 0x8D,0x99,0x00,0x20,0x88,0x71,0x8D,0x99,0x48,0x71,0x8D,0x99,0x08,0x81,0x00,0x20, + 0x84,0x46,0x09,0x90,0x36,0x48,0x01,0x22,0x00,0x79,0x01,0x28,0x67,0x90,0x53,0xDB, + 0x8C,0x98,0xC0,0x7B,0x66,0x90,0x32,0x49,0x50,0x00,0x40,0x18,0xF4,0x23,0x1B,0x5A, + 0x31,0x4C,0xFF,0x30,0x63,0x43,0x01,0x30,0xC0,0x89,0xDD,0x0C,0x23,0x00,0x58,0x43, + 0xC6,0x0C,0x66,0x9B,0x00,0x20,0x00,0x2B,0x09,0x90,0x37,0xDD,0x14,0x06,0x28,0x4B, + 0x24,0x0E,0x91,0x00,0x65,0x94,0xCC,0x18,0xFF,0x34,0x21,0x34,0x24,0x4B,0xC1,0x00, + 0xCB,0x18,0x03,0x21,0x49,0x02,0x59,0x18,0x10,0x27,0xCF,0x5F,0xAF,0x42,0x1D,0xDC, + 0x14,0x27,0xCF,0x5F,0xAF,0x42,0x19,0xDB,0x12,0x27,0xCF,0x5F,0xB7,0x42,0x15,0xDC, + 0x16,0x27,0xCF,0x5F,0xB7,0x42,0x11,0xDB,0x06,0x21,0x61,0x5E,0x0E,0x23,0x59,0x43, + 0x04,0x23,0xE3,0x5E,0xC9,0x18,0x4B,0x00,0x14,0x49,0xC9,0x5E,0x61,0x45,0x07,0xDD, + 0x8C,0x46,0x65,0x99,0x09,0x91,0x00,0x21,0x07,0x91,0x01,0xE0,0x01,0x21,0xFB,0xE7, + 0x40,0x1C,0x66,0x99,0x00,0x04,0x00,0x14,0x81,0x42,0xCF,0xDC,0x52,0x1C,0x67,0x98, + 0x12,0x04,0x12,0x14,0x90,0x42,0xAE,0xDA,0x09,0x48,0x41,0x89,0x05,0x00,0x28,0x00, + 0xF4,0x30,0x04,0x00,0x1A,0x34,0xAD,0x1C,0x64,0x94,0x2C,0x00,0xFF,0x35,0xE0,0x34, + 0x01,0x35,0x61,0x45,0x22,0xDC,0x09,0x99,0x00,0x29,0x07,0xE0,0x00,0x00,0x00,0x10, + 0x40,0x00,0x00,0x20,0xC8,0x07,0x00,0x20,0xCD,0xCC,0x00,0x00,0x16,0xD0,0x36,0x4A, + 0x49,0x00,0x89,0x18,0xF4,0x22,0x56,0x5A,0xFF,0x31,0x01,0x31,0xCF,0x89,0x1A,0x22, + 0x00,0x21,0x00,0xF0,0xAD,0xF8,0x64,0x98,0x1A,0x22,0x00,0x21,0x00,0xF0,0xA8,0xF8, + 0x2D,0x49,0x01,0x20,0x08,0x71,0xA6,0x82,0xEF,0x81,0x23,0xE0,0x2A,0x4F,0x79,0x79, + 0x00,0x29,0x1F,0xD1,0x67,0x99,0x01,0x29,0x1C,0xD9,0x8F,0x99,0x89,0x7A,0x00,0x29, + 0x18,0xD1,0x0F,0x99,0x00,0x29,0x15,0xD0,0x49,0x00,0xC9,0x19,0xF4,0x22,0x52,0x5A, + 0xFF,0x31,0x01,0x31,0x63,0x92,0xCE,0x89,0x1A,0x22,0x00,0x21,0x00,0xF0,0x88,0xF8, + 0x64,0x98,0x1A,0x22,0x00,0x21,0x00,0xF0,0x83,0xF8,0x01,0x20,0x38,0x71,0x63,0x9A, + 0xA2,0x82,0xEE,0x81,0x8C,0x98,0x80,0x7A,0x00,0x28,0x10,0xD0,0x07,0x98,0x00,0x28, + 0x0D,0xD0,0x15,0x48,0x00,0x21,0x01,0x71,0x8C,0x98,0x14,0x4A,0x00,0x7B,0x92,0x7F, + 0x90,0x42,0x01,0xD3,0x8C,0x9A,0xD1,0x72,0x8C,0x99,0x40,0x1C,0x08,0x73,0x06,0x98, + 0x00,0x28,0x0E,0xD0,0x0C,0x48,0x00,0x79,0x00,0x28,0x0A,0xD0,0x0C,0x49,0x8E,0x98, + 0x49,0x89,0xC0,0x68,0x0A,0x31,0x88,0x42,0x06,0xDA,0x8E,0x99,0x40,0x1C,0xC8,0x60, + 0x02,0xE0,0x8E,0x98,0x00,0x21,0xC1,0x60,0x03,0x48,0x01,0x79,0x41,0x71,0x7F,0xB0, + 0x12,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0x80,0x95,0x00,0x00,0x78,0x47,0xC0,0x46,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0x1E,0xFF,0x2F,0x31,0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0xC2,0x20,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2, + 0xB2,0x30,0xC0,0xE0,0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x04,0x30,0x91,0xE4, + 0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2, + 0x01,0x20,0x52,0xE2,0x01,0x10,0xC0,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x01,0x20,0x52,0xE2,0x04,0x10,0x80,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x0A,0x49,0x00,0x20,0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5,0xC8,0x7A,0x89,0x7A, + 0x08,0x18,0x00,0x06,0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23,0x1B,0x02,0x9A,0x43, + 0x02,0x61,0x02,0x69,0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x80,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x10,0xB5,0x0F,0x48,0x0F,0x49,0x00,0x89, + 0x49,0x88,0x00,0x24,0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29,0x02,0xD0,0x0D,0x49, + 0x49,0x89,0x02,0xE0,0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18,0x0B,0x49,0xC9,0x6B, + 0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7,0xBF,0xFC,0x20,0x00, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x01,0x00,0x20,0x00,0x07,0x00,0x20, + 0x20,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0xC8,0x07,0x00,0x20,0xC0,0x90,0x00,0x40, + 0xF7,0xB5,0x24,0x4E,0x82,0xB0,0xB0,0x7F,0xF1,0x7F,0x00,0x02,0x08,0x43,0x01,0xF0, + 0x15,0xFD,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x1E,0x48,0x01,0x78, + 0x1E,0x48,0x00,0x7F,0x00,0x29,0x02,0xD0,0x01,0xF0,0xB8,0xFC,0x01,0xE0,0x01,0xF0, + 0xDD,0xFC,0x18,0x49,0x01,0x25,0x20,0x39,0x08,0x00,0xC0,0x30,0x01,0x90,0x05,0x20, + 0xC0,0x01,0x17,0x4F,0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62,0x01,0x98,0x80,0x68, + 0x38,0x62,0x00,0x98,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFB,0xF7, + 0x93,0xFE,0x64,0x1E,0xF9,0xD5,0x01,0x20,0xF8,0x62,0x30,0x7F,0x01,0x00,0xFB,0xF7, + 0x01,0xFF,0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7,0x0E,0xFC,0x00,0x28,0x01,0xD1, + 0x00,0x24,0x25,0x00,0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5,0x05,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00,0x18,0x07,0x00,0x20,0x60,0x06,0x00,0x20, + 0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x00,0x00,0xA0,0xE3, + 0x73,0xDF,0x4D,0xE2,0xB8,0x01,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5, + 0x24,0x00,0x8D,0xE5,0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5,0x14,0x00,0x8D,0xE5, + 0x00,0x50,0xA0,0xE1,0x00,0x70,0xA0,0xE1,0x00,0x80,0xA0,0xE1,0x00,0x90,0xA0,0xE1, + 0x00,0xA0,0xA0,0xE1,0x00,0x10,0xA0,0xE1,0x20,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5, + 0x08,0x00,0x8D,0xE5,0x04,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5,0x7C,0x06,0x9F,0xE5, + 0x7C,0x46,0x9F,0xE5,0xC8,0x01,0x8D,0xE5,0xB0,0x1C,0xC0,0xE1,0xC8,0x01,0x9D,0xE5, + 0x30,0x20,0xA0,0xE3,0xB2,0x1C,0xC0,0xE1,0xC8,0x01,0x9D,0xE5,0xB4,0x1C,0xC0,0xE1, + 0x00,0x10,0xA0,0xE3,0x88,0x00,0x84,0xE2,0x81,0xFF,0xFF,0xEB,0x30,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0xB8,0x00,0x84,0xE2,0x7D,0xFF,0xFF,0xEB,0x00,0x60,0xA0,0xE3, + 0x60,0x10,0xA0,0xE3,0x15,0x0E,0x8D,0xE2,0xB8,0x6E,0xC4,0xE1,0x55,0xFF,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0xF0,0x00,0x8D,0xE2,0x52,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3, + 0x90,0x00,0x8D,0xE2,0x4F,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x30,0x00,0x8D,0xE2, + 0x4C,0xFF,0xFF,0xEB,0x0C,0x06,0x9F,0xE5,0x0C,0x16,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0xC4,0x11,0x8D,0xE5,0x00,0x00,0x50,0xE3,0x03,0x00,0x00,0x0A,0xF8,0x0A,0xD1,0xE1, + 0xB4,0x01,0x8D,0xE5,0xB6,0x0A,0xD1,0xE1,0x04,0x00,0x00,0xEA,0xEC,0x05,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0xF6,0x12,0xD0,0xE1,0xB4,0x11,0x8D,0xE5,0xB4,0x02,0xD0,0xE1, + 0x01,0x18,0xE0,0xE3,0xB0,0x01,0x8D,0xE5,0xC4,0x05,0x9F,0xE5,0xB6,0x00,0xD0,0xE1, + 0x40,0x00,0x10,0xE3,0xC4,0x01,0x9D,0xE5,0xB0,0xB8,0xD0,0x01,0xB0,0x08,0xD0,0x11, + 0x80,0xB0,0x01,0x10,0x8B,0x00,0x01,0xE0,0x0C,0x00,0x8D,0xE5,0x00,0x00,0xA0,0xE3, + 0xAC,0x15,0x9F,0xE5,0x00,0x30,0xA0,0xE1,0x00,0x20,0xA0,0xE1,0x00,0x00,0xC1,0xE5, + 0x00,0x10,0xA0,0xE3,0x9C,0x05,0x9F,0xE5,0x9C,0xC5,0x9F,0xE5,0x83,0x00,0x80,0xE0, + 0xC0,0x01,0x8D,0xE5,0xB0,0x00,0xD0,0xE1,0x83,0xC0,0x8C,0xE0,0xB0,0xC0,0xDC,0xE1, + 0x00,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0x0F,0xCA,0xCC,0xE3,0x0C,0x40,0x40,0xE0, + 0x06,0x00,0x54,0xE1,0x04,0x60,0xA0,0xC1,0x2C,0x10,0x8D,0xC5,0x28,0x20,0x8D,0xC5, + 0xC8,0x00,0x54,0xE3,0x00,0x00,0x4C,0xE0,0x01,0xA0,0x8A,0xC2,0x96,0x00,0x50,0xE3, + 0x04,0xC0,0x9D,0xC5,0x01,0x30,0x83,0xE2,0x01,0xC0,0x8C,0xC2,0x04,0xC0,0x8D,0xC5, + 0x19,0x0E,0x54,0xE3,0x00,0xC0,0x9D,0xC5,0x01,0xC0,0x8C,0xC2,0x00,0xC0,0x8D,0xC5, + 0xF0,0xC0,0x8D,0xE2,0x01,0xE1,0x9C,0xE7,0x00,0x00,0x54,0xE3,0x00,0x40,0xA0,0xB3, + 0x04,0xE0,0x8E,0xE0,0x01,0xE1,0x8C,0xE7,0x15,0xCE,0x8D,0xE2,0x02,0xE1,0x9C,0xE7, + 0x00,0x00,0x50,0xE3,0x04,0xE0,0x8E,0xE0,0x02,0xE1,0x8C,0xE7,0x30,0xC0,0x8D,0xE2, + 0x01,0xE1,0x9C,0xE7,0x00,0x00,0xA0,0xB3,0x00,0xE0,0x8E,0xE0,0x01,0xE1,0x8C,0xE7, + 0x90,0xC0,0x8D,0xE2,0x02,0xE1,0x9C,0xE7,0x0B,0x00,0x50,0xE1,0x00,0xE0,0x8E,0xE0, + 0x02,0xE1,0x8C,0xE7,0x01,0xC0,0x85,0xC2,0x01,0x58,0xCC,0xC3,0x0B,0x00,0x54,0xE1, + 0x01,0xC0,0x87,0xC2,0x01,0x78,0xCC,0xC3,0x0C,0xC0,0x9D,0xE5,0x01,0x10,0x81,0xE2, + 0x0C,0x00,0x50,0xE1,0x01,0xC0,0x88,0xC2,0x01,0x88,0xCC,0xC3,0x0C,0xC0,0x9D,0xE5, + 0x0C,0x00,0x54,0xE1,0x01,0xC0,0x89,0xC2,0x01,0x98,0xCC,0xC3,0x08,0xC0,0x9D,0xE5, + 0x0E,0x00,0x51,0xE3,0x0C,0x00,0x80,0xE0,0x08,0x00,0x8D,0xE5,0xC0,0x01,0x9D,0xE5, + 0xB0,0x40,0xC0,0xE1,0xB4,0x01,0x9D,0xE5,0xB8,0xC1,0x9D,0xE5,0x04,0x00,0x80,0xE0, + 0x0C,0x00,0x80,0xE0,0xB8,0x01,0x8D,0xE5,0xB5,0xFF,0xFF,0x3A,0x01,0x20,0x82,0xE2, + 0x15,0x00,0x52,0xE3,0xB1,0xFF,0xFF,0x3A,0x70,0xC4,0x9F,0xE5,0x64,0x44,0x9F,0xE5, + 0x01,0xEA,0xA0,0xE3,0x0E,0x00,0x43,0xE2,0x00,0x10,0xA0,0xE3,0x01,0xE0,0x4E,0xE2, + 0x80,0x20,0x84,0xE0,0xF0,0x30,0xD2,0xE1,0x01,0x10,0x81,0xE2,0x01,0x00,0x80,0xE2, + 0x03,0x31,0x83,0xE0,0x03,0x32,0xA0,0xE1,0x9C,0xB3,0xC3,0xE0,0xC3,0xB2,0xA0,0xE1, + 0xC3,0x3F,0x4B,0xE0,0x01,0x0A,0x53,0xE3,0x0E,0x30,0xA0,0xA1,0x0E,0x00,0x51,0xE3, + 0xB0,0x30,0xC2,0xE1,0xF1,0xFF,0xFF,0x3A,0xC8,0x01,0x9D,0xE5,0xB0,0xAC,0xC0,0xE1, + 0x04,0x00,0x9D,0xE5,0xC8,0x11,0x9D,0xE5,0xB2,0x0C,0xC1,0xE1,0xC8,0x01,0x9D,0xE5, + 0x00,0x10,0x9D,0xE5,0xB4,0x1C,0xC0,0xE1,0x70,0xF9,0xFF,0xEB,0xEC,0x03,0x9F,0xE5, + 0xDC,0xC3,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xCC,0xE1, + 0xB0,0x00,0xD4,0xE1,0x01,0x00,0x10,0xE3,0x08,0x00,0x00,0x0A,0xB8,0x01,0x9D,0xE5, + 0xB0,0x11,0x9D,0xE5,0x90,0x01,0x01,0xE0,0xD4,0x03,0x9F,0xE5,0x90,0x21,0x81,0xE0, + 0x21,0x06,0xA0,0xE1,0xB4,0x10,0xD4,0xE1,0x00,0x00,0x51,0xE1,0xBE,0x00,0xCC,0x81, + 0xC0,0xA3,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x90,0xE0,0x8D,0xE2,0x08,0x20,0xD4,0xE5, + 0x15,0x1E,0x8D,0xE2,0x00,0x11,0x91,0xE7,0x92,0x01,0x01,0xE0,0x9A,0x31,0x82,0xE0, + 0xA2,0x34,0xA0,0xE1,0xB0,0x21,0xD4,0xE1,0x02,0x00,0x53,0xE1,0x9A,0x21,0x81,0x90, + 0x09,0x30,0xD4,0xE5,0xA1,0x24,0xA0,0x91,0x00,0x11,0x9E,0xE7,0x91,0x03,0x03,0xE0, + 0x9A,0xB3,0x81,0xE0,0xA1,0xB4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x5B,0xE1, + 0x9A,0x33,0x81,0x90,0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1, + 0x92,0x01,0x01,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0, + 0x02,0x21,0x82,0xE0,0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0, + 0x80,0x20,0x8C,0xE0,0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0xB8,0x18,0xC2,0xE1, + 0xDD,0xFF,0xFF,0x3A,0x30,0x23,0x9F,0xE5,0x00,0xA0,0xA0,0xE3,0xF0,0xB0,0x8D,0xE2, + 0x0A,0x10,0xD4,0xE5,0x0A,0x01,0x9B,0xE7,0x90,0x01,0x01,0xE0,0x92,0x31,0x80,0xE0, + 0xA0,0x35,0xA0,0xE1,0xB4,0x01,0xD4,0xE1,0x00,0x00,0x53,0xE1,0x92,0x11,0x80,0x90, + 0x0B,0x30,0xD4,0xE5,0x30,0x10,0x8D,0xE2,0x0A,0x11,0x91,0xE7,0xA0,0x05,0xA0,0x91, + 0x91,0x03,0x03,0xE0,0x92,0xC3,0x81,0xE0,0xA1,0xC5,0xA0,0xE1,0xB6,0x11,0xD4,0xE1, + 0x01,0x00,0x5C,0xE1,0x92,0x33,0x81,0x90,0xA1,0x15,0xA0,0x91,0x01,0x00,0x40,0xE0, + 0xBE,0x10,0xD4,0xE1,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x88,0x12,0x9F,0xE5,0x8A,0x10,0x81,0xE0,0x01,0xA0,0x8A,0xE2, + 0x0D,0x00,0x5A,0xE3,0xB8,0x0B,0xC1,0xE1,0xDC,0xFF,0xFF,0x3A,0x0A,0x00,0xD4,0xE5, + 0x0A,0x11,0x9B,0xE7,0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x8C,0x12,0x9F,0xE5, + 0x15,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0,0xBC,0x11,0x8D,0xE5,0xFF,0xEA,0xFF,0xEB, + 0xB4,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x00,0xB0,0xA0,0x91,0x01,0xB0,0xA0,0x81, + 0x0B,0x10,0xD4,0xE5,0x30,0x00,0x8D,0xE2,0x0A,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0, + 0xBC,0x11,0x9D,0xE5,0xF5,0xEA,0xFF,0xEB,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1, + 0x01,0x00,0xA0,0x81,0xBE,0x10,0xD4,0xE1,0x00,0x00,0x4B,0xE0,0x10,0x42,0x9F,0xE5, + 0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0, + 0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0, + 0x8A,0x10,0x84,0xE0,0x00,0x00,0x56,0xE3,0xB8,0x0B,0xC1,0xE1,0x0C,0x00,0x00,0xDA, + 0x2C,0x00,0x9D,0xE5,0x80,0x00,0x84,0xE0,0xB8,0x1B,0xD0,0xE1,0x28,0x00,0x9D,0xE5, + 0x80,0x00,0x84,0xE0,0xB8,0x08,0xD0,0xE1,0x01,0x00,0x80,0xE0,0x00,0x00,0x46,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB8,0x0E,0xC4,0xE1,0x00,0x00,0xA0,0x43, + 0xB8,0x0E,0xC4,0x41,0x11,0x10,0xA0,0xE3,0x08,0x00,0x9D,0xE5,0x01,0x1C,0x81,0xE2, + 0xD2,0xEA,0xFF,0xEB,0xB6,0x10,0xD4,0xE1,0x40,0x00,0x11,0xE3,0x0E,0x00,0x00,0x0A, + 0x87,0x00,0x55,0xE1,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x23,0x00,0x58,0xE3,0x01,0x00,0xA0,0x83, + 0x18,0x00,0x8D,0x85,0x23,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33,0x14,0x00,0x8D,0x35, + 0x14,0x00,0x55,0xE3,0x11,0x00,0x00,0x9A,0x0E,0x00,0x00,0xEA,0x07,0x00,0x55,0xE1, + 0x08,0x00,0x55,0x83,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x14,0x00,0x58,0xE3,0x01,0x00,0xA0,0x83, + 0x18,0x00,0x8D,0x85,0x14,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33,0x14,0x00,0x8D,0x35, + 0x0A,0x00,0x55,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x10,0x00,0x8D,0xE5, + 0xF1,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0xE5,0x03,0x00,0x00,0x0A, + 0xFA,0x00,0x50,0xE3,0x05,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x02,0x00,0x00,0xEA, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2,0xF2,0x00,0xC4,0xE5, + 0x1C,0x20,0x8D,0xE2,0x05,0x00,0x92,0xE8,0x14,0x30,0x9D,0xE5,0x00,0x20,0x82,0xE1, + 0x18,0x00,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x03,0x00,0x00,0xE0,0x00,0x20,0x82,0xE1, + 0x10,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13, + 0x02,0x00,0x80,0xE1,0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0x15,0x05,0x00,0x50,0x13, + 0x02,0x00,0x00,0x8A,0x24,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A, + 0xEC,0x00,0x94,0xE5,0x01,0x00,0x80,0xE2,0xEC,0x00,0x84,0xE5,0xF0,0x00,0xD4,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xF0,0x00,0xC4,0x15,0x0D,0x00,0x00,0xEA, + 0xF0,0x00,0xD4,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0xF0,0x00,0xC4,0xE5, + 0xC4,0x11,0x9D,0xE5,0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1,0x05,0x00,0x00,0x1A, + 0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC4,0xE5,0xEC,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x40,0xC2,0xEC,0x00,0x84,0xC5,0xF2,0x00,0xD4,0xE5,0x0A,0x00,0x50,0xE3, + 0x73,0xDF,0x8D,0x22,0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21,0xEC,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0xA0,0xC3,0xEC,0x00,0x84,0xC5,0x00,0x00,0xA0,0xE3, + 0xF0,0x00,0xC4,0xE5,0x73,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x40,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x07,0x00,0x20,0x00,0x95,0x00,0x00, + 0xC8,0x07,0x00,0x20,0x44,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10, + 0x1F,0x85,0xEB,0x51,0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D,0x2D,0x34,0xA9,0xF9, + 0x00,0x93,0x00,0x00,0x10,0xB5,0x16,0x4C,0xA0,0x7B,0x00,0x28,0x07,0xD1,0xFB,0xF7, + 0x7D,0xFD,0x00,0x28,0x0F,0xD0,0xFC,0xF7,0xBF,0xFF,0x01,0x20,0x0A,0xE0,0x01,0x28, + 0x0C,0xD1,0xFB,0xF7,0x7D,0xFD,0x00,0x28,0x05,0xD0,0xFC,0xF7,0x67,0xFC,0x00,0xF0, + 0x6D,0xFB,0x02,0x20,0xA0,0x73,0x10,0xBC,0x08,0xBC,0x18,0x47,0x02,0x28,0x07,0xD1, + 0xFB,0xF7,0x2C,0xFF,0x00,0x28,0xF6,0xD0,0xFC,0xF7,0x1C,0xFE,0x03,0x20,0xF1,0xE7, + 0x03,0x28,0xF0,0xD1,0x03,0x48,0xC0,0x68,0xC0,0x07,0xEC,0xD0,0x04,0x20,0xE9,0xE7, + 0x14,0x07,0x00,0x20,0x00,0x90,0x00,0x40,0xF0,0xB5,0xD9,0x48,0x8B,0xB0,0x00,0x68, + 0x00,0x27,0x80,0x79,0x3D,0x00,0x02,0x90,0xD6,0x48,0x42,0x79,0x04,0x00,0xC0,0x34, + 0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xA3,0x7A,0x00,0x7A,0xFE,0xF7, + 0x5C,0xF9,0x00,0x06,0x61,0x7A,0x00,0x0E,0xFE,0xF7,0x4C,0xF9,0x21,0x00,0x20,0x39, + 0x0A,0x7A,0x00,0x06,0xC0,0x39,0x09,0x79,0x00,0x0E,0xFE,0xF7,0x47,0xF9,0x21,0x00, + 0x80,0x39,0x8A,0x7D,0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E,0xFE,0xF7,0x3E,0xF9, + 0x00,0x06,0xC5,0x4E,0x00,0x0E,0x01,0x90,0x30,0x7B,0xC4,0x4C,0x00,0x28,0x02,0xD0, + 0xC3,0x48,0x40,0x89,0x06,0xE0,0xBE,0x48,0x61,0x88,0x00,0x68,0x40,0x88,0x40,0x18, + 0x00,0x04,0x00,0x0C,0x03,0x90,0x00,0x20,0x30,0x61,0x0F,0x20,0xF0,0x70,0x30,0x7A, + 0x00,0x28,0x06,0xD0,0xF0,0x6A,0x00,0x04,0x00,0x0C,0x01,0xF0,0xB5,0xFB,0x01,0xF0, + 0xA3,0xFB,0x01,0x20,0xF0,0x61,0xFC,0xF7,0x65,0xF9,0x00,0xF0,0xB5,0xF9,0xFC,0xF7, + 0xE3,0xFB,0xB4,0x48,0x05,0x21,0x09,0x90,0xB3,0x48,0xC9,0x01,0x41,0x18,0x08,0x91, + 0xB2,0x49,0x80,0x30,0x06,0xAA,0x03,0xC2,0x01,0x98,0xC0,0x1C,0x05,0x90,0xB0,0x48, + 0x04,0x90,0x36,0xE1,0x30,0x7A,0x00,0x28,0x04,0xD0,0xF0,0x6A,0x00,0x04,0x00,0x0C, + 0x01,0xF0,0x92,0xFB,0xFF,0x20,0x81,0x30,0xFA,0xF7,0x5C,0xFF,0x03,0x20,0x01,0xF0, + 0xFB,0xF9,0xFC,0xF7,0x89,0xF9,0xFC,0xF7,0x6B,0xF9,0xA4,0x48,0xC0,0x38,0xC0,0x88, + 0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0, + 0x03,0x20,0x01,0xF0,0xA9,0xF8,0xFC,0xF7,0x19,0xFC,0x9A,0x48,0x03,0x99,0x60,0x38, + 0x00,0x89,0x40,0x18,0x99,0x49,0xC0,0x39,0x89,0x89,0x88,0x42,0x12,0xD9,0x09,0x98, + 0x40,0x7A,0x00,0x28,0x0E,0xD1,0x95,0x48,0xFF,0x21,0xC0,0x38,0xC0,0x88,0x19,0x31, + 0x08,0x42,0x07,0xD1,0x02,0x98,0x6D,0x1C,0x85,0x42,0x04,0xDD,0xFC,0xF7,0x06,0xFC, + 0x01,0x27,0x00,0xE0,0x00,0x25,0x00,0xF0,0x8F,0xFE,0x01,0xF0,0x73,0xF8,0x00,0xF0, + 0x1F,0xFE,0x00,0xF0,0x73,0xFE,0x08,0x99,0x07,0x98,0x49,0x88,0xC0,0x6A,0x88,0x42, + 0x0B,0xDB,0x09,0x98,0x40,0x7A,0x00,0x28,0x05,0xD1,0x84,0x48,0x46,0x21,0xC0,0x38, + 0xC0,0x88,0x08,0x42,0x01,0xD0,0x01,0x20,0x70,0x70,0x00,0x2F,0x02,0xD0,0xFC,0xF7, + 0x73,0xFB,0x00,0x27,0xFC,0xF7,0x58,0xFB,0x00,0x20,0xFC,0xF7,0xC7,0xFB,0xFC,0xF7, + 0x8F,0xFB,0x01,0x20,0xB0,0x73,0xFD,0xF7,0xDF,0xFC,0x00,0x28,0x09,0xD0,0x00,0x20, + 0x30,0x61,0x04,0x98,0x80,0x7E,0xC8,0x28,0x12,0xD2,0x04,0x99,0x40,0x1C,0x88,0x76, + 0x0E,0xE0,0x30,0x69,0x40,0x1C,0x30,0x61,0x30,0x69,0x01,0x28,0x03,0xD1,0x70,0x49, + 0x00,0x20,0x20,0x31,0x88,0x75,0x30,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7,0xCA,0xF8, + 0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x20,0x69,0xFF,0x21,0xFF,0x31, + 0x88,0x42,0x04,0xDA,0x40,0x1C,0x20,0x61,0x01,0xE0,0x00,0x20,0xFB,0xE7,0x08,0x98, + 0xE1,0x68,0x40,0x89,0x81,0x42,0x0C,0xDD,0x20,0x69,0xFF,0x21,0xF5,0x31,0x88,0x42, + 0x07,0xDD,0x01,0x21,0x00,0x20,0x71,0x70,0xE0,0x60,0x20,0x61,0x07,0x98,0xC1,0x62, + 0x02,0xE0,0x70,0x78,0x00,0x28,0x02,0xD0,0xFC,0xF7,0xB6,0xF8,0x20,0xE0,0x59,0x48, + 0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0,0xC1,0x68,0x07,0x29, + 0x04,0xD1,0xC0,0x68,0x01,0x21,0x49,0x07,0xC8,0x63,0x0E,0xE0,0x00,0xF0,0x20,0xFA, + 0x0B,0xE0,0x01,0xF0,0x4B,0xF8,0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0xD4,0xF9, + 0x00,0xF0,0x5C,0xF9,0x01,0xE0,0xFF,0xF7,0x9D,0xFE,0xB0,0x7B,0x03,0x28,0xFA,0xD1, + 0xFC,0xF7,0xFE,0xFB,0x70,0x78,0x00,0x28,0x0B,0xD0,0x43,0x48,0x01,0x21,0xC0,0x7F, + 0x40,0x08,0x01,0xF0,0x6F,0xF8,0x3C,0x49,0x00,0x20,0x48,0x70,0x07,0x99,0xC8,0x62, + 0x5D,0xE0,0x06,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B,0x00,0x28,0x01,0xD1, + 0x00,0xF0,0xC6,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28,0x4F,0xD1,0x06,0x98, + 0x00,0x7A,0x00,0x28,0x01,0xD0,0xFF,0xF7,0x53,0xFA,0x03,0x20,0x01,0xF0,0xEE,0xF8, + 0xB0,0x62,0x03,0x20,0x01,0xF0,0x1C,0xF9,0xFF,0x20,0x81,0x30,0xFA,0xF7,0x62,0xFE, + 0x31,0x48,0x00,0x78,0x71,0x79,0x08,0x43,0x33,0xD1,0x70,0x6A,0x00,0x28,0x0A,0x90, + 0x2F,0xD0,0x25,0x48,0x80,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x2B,0x49,0xFA,0xF7, + 0x15,0xFB,0x0A,0x99,0x0E,0x1A,0x32,0x2E,0x23,0xDD,0x00,0xF0,0x81,0xF8,0x30,0x00, + 0x01,0xF0,0x90,0xFA,0x01,0xF0,0x94,0xFA,0x1B,0x48,0x80,0x79,0x00,0x28,0x0D,0xD0, + 0x00,0xF0,0x54,0xF8,0x00,0xF0,0x57,0xF8,0x00,0xF0,0x5F,0xF8,0x20,0x4E,0x01,0x20, + 0x70,0x60,0xFA,0xF7,0x47,0xFE,0x1F,0x48,0x70,0x60,0x03,0xE0,0x1E,0x48,0x01,0x78, + 0x00,0x29,0xFC,0xD0,0x01,0xF0,0x83,0xFA,0x1B,0x49,0x00,0x20,0x08,0x70,0x00,0xF0, + 0x6B,0xF8,0x0D,0x4E,0x30,0x69,0x05,0x99,0x88,0x42,0x00,0xD2,0xC2,0xE6,0x08,0x48, + 0x0A,0x49,0x00,0x68,0xC0,0x39,0x40,0x30,0x40,0x7D,0x48,0x70,0x06,0x48,0x00,0x7A, + 0x00,0x28,0x01,0xD0,0x01,0xF0,0x48,0xFA,0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xC8,0x07,0x00,0x20,0x60,0x94,0x00,0x00,0x14,0x07,0x00,0x20,0x00,0x07,0x00,0x20, + 0xA0,0x95,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x93,0x00,0x00,0x00,0x01,0x00,0x20, + 0xA0,0x03,0x00,0x20,0x00,0x40,0x00,0x30,0xCD,0x07,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xCC,0x07,0x00,0x20,0x01,0x20,0x80,0x07, + 0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21, + 0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20,0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22, + 0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68, + 0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A, + 0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00, + 0x10,0xB5,0xFC,0xF7,0x29,0xFA,0xFA,0xF7,0xBB,0xFA,0x03,0x20,0x40,0x03,0xFA,0xF7, + 0xC1,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFA,0xF7, + 0xC1,0xFD,0xFA,0xF7,0xB7,0xFA,0xFC,0xF7,0x1F,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0xB5,0x00,0xF0,0x0F,0xFC,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42, + 0x01,0xD0,0xFA,0xF7,0xDD,0xFC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3, + 0xBA,0x00,0xC6,0xE1,0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5, + 0xA0,0xB0,0x9F,0xE5,0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2,0x14,0x10,0xA0,0xE3, + 0x01,0x90,0xA0,0xE3,0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2, + 0x80,0x40,0x86,0xE0,0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0, + 0xF0,0xC0,0xD3,0xE1,0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0, + 0x04,0x00,0x00,0x0A,0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3, + 0x05,0x00,0x00,0xBA,0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A, + 0xC8,0x00,0x5C,0xE3,0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3, + 0x00,0xC0,0xA0,0xB3,0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1, + 0xBA,0xC0,0xC6,0xB1,0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2, + 0xDF,0xFF,0xFF,0x5A,0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20, + 0x00,0x93,0x00,0x00,0x44,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0xFD,0xF7, + 0x4F,0xF9,0x06,0x00,0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7A,0xD0,0x4F,0x48, + 0x00,0x21,0x01,0x70,0x02,0x20,0x00,0xF0,0xE3,0xFF,0x4D,0x48,0x0A,0x21,0x00,0x6B, + 0xFA,0xF7,0xEC,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0,0xC6,0xFF,0x49,0x4F,0x78,0x7A, + 0x00,0x28,0x00,0xD0,0x6D,0x1C,0xF8,0x79,0x00,0x28,0x04,0xD1,0x46,0x49,0x48,0x69, + 0x0A,0x15,0x10,0x43,0x48,0x61,0x00,0xF0,0x93,0xF8,0x44,0x48,0x01,0x68,0x44,0x48, + 0xC1,0x61,0x02,0x24,0x20,0x00,0x00,0xF0,0xB7,0xFF,0x42,0x48,0xC1,0x68,0x49,0x08, + 0x49,0x00,0xC1,0x60,0x79,0x7A,0x02,0x04,0x1D,0xE0,0x3D,0x48,0x43,0x69,0x5B,0x06, + 0x0A,0xD4,0x00,0x29,0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA3,0x00,0x9B,0x18,0x1B,0x68, + 0xC3,0x61,0x00,0xE0,0xC6,0x61,0x64,0x1C,0x30,0x48,0x00,0x78,0x00,0x28,0x0A,0xD0, + 0xFD,0xF7,0x2C,0xFA,0x38,0x7A,0x00,0x28,0x07,0xD0,0xF8,0x6A,0x00,0x04,0x00,0x0C, + 0x01,0xF0,0x22,0xF9,0x01,0xE0,0xAC,0x42,0xDF,0xD9,0x02,0x20,0x00,0xF0,0x98,0xFF, + 0x26,0x4C,0x20,0x78,0x00,0x28,0x38,0xD1,0xFD,0xF7,0x32,0xF9,0x00,0x28,0x34,0xD0, + 0x23,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x99,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0, + 0x73,0xFF,0x02,0x20,0x00,0xF0,0x78,0xFF,0x0C,0xE0,0x20,0x78,0x00,0x28,0x09,0xD0, + 0xFD,0xF7,0x04,0xFA,0x38,0x7A,0x00,0x28,0x04,0xD0,0xF8,0x6A,0x00,0x04,0x00,0x0C, + 0x01,0xF0,0xFA,0xF8,0xFD,0xF7,0x14,0xF9,0x00,0x28,0xEE,0xD1,0x18,0x48,0x41,0x68, + 0x41,0x60,0x0C,0xE0,0x1E,0xE0,0x21,0x78,0x00,0x29,0x08,0xD0,0x38,0x7A,0x00,0x28, + 0x08,0xD0,0xF8,0x6A,0x00,0x04,0x00,0x0C,0x01,0xF0,0xE6,0xF8,0x02,0xE0,0x41,0x68, + 0xC9,0x03,0xF0,0xD5,0x02,0x20,0x00,0xF0,0x5B,0xFF,0x00,0xF0,0x21,0xF8,0x0D,0x49, + 0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60,0xF8,0x79,0x00,0x28,0x02,0xD1,0x08,0x15, + 0xFA,0xF7,0x98,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xCD,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0x14,0x07,0x00,0x20,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7, + 0xF5,0xFB,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x10,0xB5,0x01,0x20, + 0xFC,0xF7,0x7E,0xF9,0x01,0x20,0xFC,0xF7,0x39,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x18,0x70,0x47,0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C, + 0x80,0x18,0xC0,0x18,0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21, + 0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A,0x90,0x71,0x90,0x79,0x01,0x28,0x01,0xD1, + 0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48, + 0x30,0x22,0x00,0x21,0x08,0x30,0xFF,0xF7,0x0B,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x0D,0x25,0x08,0x4C,0xED,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18, + 0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19,0x40,0x1C,0xBE,0x60,0x96,0x79,0x86,0x42, + 0xF3,0xD8,0xEA,0xE7,0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x70,0xB5,0x1E,0x4A, + 0x1E,0x48,0x1C,0x4C,0x85,0x18,0x21,0x7A,0xDB,0x22,0x92,0x00,0x86,0x18,0x00,0x29, + 0x0F,0xD0,0x21,0x00,0x82,0x22,0x0C,0x31,0x28,0x00,0xFE,0xF7,0xAD,0xFF,0x18,0x49, + 0x0D,0x22,0x30,0x00,0xFE,0xF7,0xA8,0xFF,0x20,0x7A,0x60,0x72,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x0D,0x22,0x00,0x21,0x30,0x00,0xFE,0xF7,0xD2,0xFF,0x82,0x22,0x00,0x21, + 0x28,0x00,0xFE,0xF7,0xCD,0xFF,0x0E,0x48,0x82,0x22,0x00,0x21,0x8F,0x38,0xFE,0xF7, + 0xC7,0xFF,0x0B,0x48,0x0D,0x22,0x00,0x21,0x0D,0x38,0xFE,0xF7,0xC1,0xFF,0x00,0x20, + 0x06,0x49,0x60,0x72,0xA0,0x72,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x05,0x49, + 0x88,0x72,0xDB,0xE7,0x00,0x02,0x00,0x20,0x4E,0x02,0x00,0x00,0x40,0x00,0x00,0x20, + 0x9F,0x03,0x00,0x20,0x40,0x06,0x00,0x20,0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E, + 0x02,0x90,0x8F,0x48,0x00,0x78,0x00,0x28,0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01, + 0x40,0x18,0x01,0x8A,0x8C,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91, + 0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91, + 0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30, + 0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B, + 0x05,0x91,0x7A,0x49,0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92, + 0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C, + 0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98, + 0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0, + 0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0, + 0xED,0xFF,0x20,0x8C,0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08, + 0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A, + 0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90, + 0x15,0x20,0x08,0x90,0x5D,0x48,0x0E,0x21,0x80,0x7B,0xC2,0x07,0x05,0xD0,0x80,0x07, + 0x01,0xD5,0x0D,0x21,0x01,0xE0,0x14,0x20,0x08,0x90,0x20,0x00,0xF9,0xF7,0xFE,0xFE, + 0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xF9,0xF7,0xF6,0xFE, + 0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F, + 0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90, + 0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42, + 0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98, + 0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B, + 0x51,0x1A,0xF9,0xF7,0xCB,0xFE,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00, + 0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21, + 0xF9,0xF7,0xBC,0xFE,0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB, + 0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60, + 0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C, + 0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00, + 0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00, + 0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xF9,0xF7,0x8E,0xFE, + 0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1, + 0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21,0xF9,0xF7,0x7F,0xFE,0x07,0x99, + 0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0, + 0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46, + 0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98, + 0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0, + 0x25,0xFF,0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00, + 0x20,0x07,0x00,0x20,0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0x40,0x06,0x00,0x20, + 0xFF,0xB5,0x00,0x68,0x8E,0x46,0x84,0x46,0x70,0x46,0x1B,0x4B,0x1B,0x49,0x05,0x68, + 0x00,0x22,0x19,0x4E,0x54,0x00,0x24,0x3E,0x34,0x5B,0x66,0x46,0x00,0x20,0x34,0x1B, + 0x26,0x00,0x74,0x43,0x46,0x00,0x9E,0x5B,0xAE,0x1B,0x37,0x00,0x77,0x43,0xE6,0x19, + 0x8E,0x42,0x18,0xD2,0x51,0x00,0x10,0x4A,0x40,0x00,0x24,0x3A,0x52,0x5A,0x02,0x99, + 0x0A,0x60,0x0D,0x49,0x03,0x9A,0x16,0x39,0x0C,0x5A,0x14,0x60,0x09,0x5A,0x72,0x46, + 0x12,0x68,0x18,0x5A,0x51,0x18,0x09,0x1A,0x70,0x46,0x01,0x60,0x01,0x20,0x04,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x1C,0x0B,0x28,0xDB,0xD3,0x52,0x1C,0x07,0x2A, + 0xCF,0xD3,0x00,0x20,0xC0,0x43,0xF2,0xE7,0xB4,0x78,0x00,0x00,0x11,0x02,0x00,0x00, + 0xFE,0xB5,0x69,0x4D,0x67,0x48,0x00,0x26,0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x7E, + 0xC1,0x31,0x08,0x7A,0x33,0x00,0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0,0x01,0x24, + 0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0x24,0xF9, + 0x00,0x28,0x17,0xD0,0x5D,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42,0x14,0xD3, + 0xA9,0x19,0x33,0x22,0x00,0x90,0xFF,0x20,0x52,0x01,0xCD,0x30,0x89,0x18,0xC0,0x5D, + 0x3A,0x00,0xFF,0x32,0x48,0x76,0x76,0x1C,0xCD,0x32,0x03,0x20,0x01,0x23,0x69,0x46, + 0x00,0xF0,0x06,0xFA,0x64,0x1C,0x0D,0x2C,0xDA,0xDB,0x94,0xE0,0x49,0x7A,0x00,0x29, + 0x01,0xD1,0x00,0x28,0x78,0xD0,0x07,0x20,0xC0,0x01,0x00,0x24,0x2E,0x18,0x33,0x27, + 0x7F,0x01,0x28,0x19,0xC0,0x19,0x40,0x7E,0x00,0x28,0x3F,0xD0,0x0D,0x21,0x28,0x18, + 0x89,0x01,0x41,0x18,0xC9,0x7F,0x00,0x29,0x02,0xD0,0xB2,0x7D,0x00,0x2A,0x14,0xD0, + 0x1B,0x21,0x49,0x01,0x40,0x18,0x00,0x99,0x00,0x7B,0x49,0x1C,0x00,0x91,0x0A,0x21, + 0x48,0x43,0x3F,0x49,0x40,0x19,0x42,0x18,0x02,0x20,0x03,0x23,0x69,0x46,0x00,0xF0, + 0xD7,0xF9,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43,0x48,0x19, + 0x02,0x90,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0xCF,0xF8,0x00,0x28,0x13,0xD0,0x00,0x98, + 0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0xCD,0x32,0x03,0x20,0x02,0x23,0x69,0x46, + 0x00,0xF0,0xBE,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x7E,0x40,0x1C,0x4A,0x76, + 0x0C,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x0C,0x2C,0xBA,0xDB,0x01,0x24,0x26,0x49, + 0x0D,0x20,0x0A,0x19,0x80,0x01,0x10,0x18,0xC0,0x7F,0x00,0x22,0x01,0x92,0x00,0x28, + 0x32,0xD0,0xB2,0x7D,0x00,0x2A,0x2F,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18,0x28,0x00, + 0xFF,0x30,0xD3,0x30,0xFD,0xF7,0xA0,0xF8,0x00,0x28,0x25,0xD0,0x1B,0x48,0x00,0x9B, + 0x80,0x7B,0x5B,0x1C,0x98,0x42,0x26,0xD3,0x17,0x4A,0x00,0x20,0x11,0x18,0xC9,0x19, + 0x49,0x7E,0xA1,0x42,0x0C,0xD0,0x00,0x29,0x07,0xD1,0xFF,0x21,0xCD,0x31,0x49,0x5D, + 0x10,0x18,0xC0,0x19,0x41,0x76,0x06,0xE0,0x12,0xE0,0x40,0x1C,0x0C,0x28,0xED,0xDB, + 0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0xCD,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0x74,0xF9,0x64,0x1C,0x0D,0x2C,0xBF,0xDB,0x02,0xE0, + 0x01,0x20,0x40,0x07,0x43,0x60,0x00,0x98,0x00,0xF0,0x6E,0xFC,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0x4E,0x02,0x00,0x00,0xFC,0xB5,0x4E,0x48,0x36,0x25,0x45,0x5F,0x15,0x20,0x84,0x46, + 0x4B,0x48,0x4C,0x4F,0x80,0x30,0x82,0x7D,0x86,0x46,0x4B,0x48,0x00,0x26,0x81,0x7B, + 0x0E,0x24,0xC8,0x07,0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24,0x01,0xE0,0x14,0x20, + 0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42, + 0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A,0x5B,0x1E, + 0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A,0x5B,0x1E, + 0x83,0x42,0x0C,0xD3,0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58,0x1B,0x01, + 0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00,0x40,0x1C, + 0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46,0x04,0x5F, + 0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06,0x07,0xD5, + 0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04,0x12,0x14, + 0x25,0x48,0x80,0x30,0x81,0x6B,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B,0xA1,0x42, + 0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x81,0x63,0x1E,0x49, + 0x80,0x31,0xC9,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C, + 0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x63,0x74,0x46,0xA4,0x8B,0x85,0x6B, + 0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0xC0,0x6B,0x98,0x42, + 0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29,0x9A,0x70, + 0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70,0x01,0xD0, + 0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B,0x69,0x46, + 0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D,0x41,0x06,0x09,0x20, + 0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29,0x0E,0xDA,0x81,0x69, + 0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62, + 0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0,0x18,0x49,0x4A,0x69, + 0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62, + 0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43, + 0x39,0x00,0xF9,0xF7,0x8B,0xFD,0x70,0x62,0x30,0x7B,0x00,0x28,0x03,0xD0,0x0D,0x48, + 0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00, + 0xF9,0xF7,0x7C,0xFD,0x30,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20, + 0x00,0x93,0x00,0x00,0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00,0x14,0x07,0x00,0x20, + 0x80,0x94,0x00,0x00,0x41,0xA0,0x00,0x00,0x10,0x00,0x10,0x00,0x07,0x48,0x41,0x7A, + 0x07,0x48,0x02,0x29,0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29,0x01,0xD1,0xC0,0x69, + 0x00,0xE0,0x80,0x69,0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00,0x00,0x02,0x00,0x20, + 0xC0,0x94,0x00,0x00,0xC0,0x90,0x00,0x40,0xF0,0xB4,0x0B,0x48,0x0D,0x4B,0xC0,0x88, + 0x0A,0x49,0x0C,0x4F,0x42,0x06,0x0A,0x48,0x01,0x24,0xE4,0x03,0x32,0x25,0x5E,0x00, + 0x32,0x3F,0x01,0x61,0x43,0x61,0x84,0x61,0xC5,0x61,0x04,0x62,0x46,0x62,0x84,0x62, + 0xC7,0x62,0xF0,0xBC,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x80,0x00,0x03, + 0x40,0xA1,0x00,0x40,0x64,0x40,0x00,0x00,0x11,0x49,0x10,0xB4,0x0A,0x7D,0x11,0x48, + 0x82,0x73,0x4A,0x7D,0xC2,0x73,0x82,0x7B,0x0F,0x48,0xD3,0x07,0x0A,0xD0,0x93,0x07, + 0x0E,0x4A,0x03,0xD5,0x0D,0x23,0x03,0x77,0x00,0x23,0x02,0xE0,0x14,0x23,0x03,0x77, + 0x01,0x23,0x13,0x71,0x8A,0x7D,0x42,0x77,0xCA,0x7D,0x82,0x77,0x0A,0x7E,0xC2,0x77, + 0x4A,0x7E,0x05,0x48,0x20,0x30,0x02,0x70,0x89,0x7E,0x41,0x70,0x10,0xBC,0x70,0x47, + 0x00,0x93,0x00,0x00,0x40,0x06,0x00,0x20,0x60,0x06,0x00,0x20,0x14,0x07,0x00,0x20, + 0xFF,0xB5,0x05,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0x81,0xB0,0xFA,0xF7,0xFC,0xFC, + 0x00,0x28,0x08,0xD0,0x02,0x98,0x02,0x99,0x00,0x68,0x40,0x1E,0x08,0x60,0x05,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x29,0x48,0x80,0x7B,0xC0,0x07,0x22,0xD0,0xE0,0x79, + 0x05,0x28,0x1D,0xD0,0x09,0x28,0x1D,0xD1,0x6D,0x08,0x6D,0x00,0x01,0x20,0x09,0x27, + 0x22,0x78,0x23,0x4E,0xBF,0x01,0x0F,0xE0,0x0A,0x23,0x01,0x00,0x59,0x43,0x21,0x4B, + 0xC9,0x18,0xC9,0x19,0x8B,0x7B,0x9A,0x42,0x05,0xD1,0x0B,0x8A,0x63,0x80,0xCB,0x7B, + 0x63,0x70,0x49,0x8A,0xA1,0x80,0x40,0x1C,0x71,0x7A,0x81,0x42,0xEC,0xDA,0x01,0xE0, + 0x01,0x20,0x05,0x43,0x0F,0x21,0xA8,0x07,0x89,0x06,0x88,0x43,0x21,0x78,0x62,0x78, + 0x09,0x07,0x89,0x08,0x08,0x43,0x14,0x49,0x92,0x06,0x08,0x40,0x61,0x88,0x12,0x0C, + 0x89,0x05,0x89,0x09,0x08,0x43,0x3F,0x21,0x89,0x02,0x88,0x43,0x10,0x43,0x02,0x04, + 0x92,0x0E,0x0F,0x2A,0x03,0xD9,0x88,0x43,0x0F,0x21,0x89,0x02,0x40,0x18,0xA1,0x88, + 0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x02,0x99,0x01,0x22,0x09,0x68, + 0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60,0xA9,0xE7,0x00,0x00,0x40,0x06,0x00,0x20, + 0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4, + 0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28, + 0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72,0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71, + 0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73,0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71, + 0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7,0x14,0x07,0x00,0x20,0xA0,0x95,0x00,0x00, + 0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00, + 0x10,0x00,0xF9,0xF7,0x3B,0xFB,0x38,0x80,0x21,0x00,0x30,0x00,0xF9,0xF7,0x36,0xFB, + 0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00, + 0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43, + 0x99,0x1A,0x00,0x91,0xF9,0xF7,0x1A,0xFB,0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99, + 0x80,0x1B,0x78,0x43,0xF9,0xF7,0x12,0xFB,0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00, + 0xF0,0xB4,0x8C,0x79,0x14,0x4B,0x00,0x26,0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79, + 0x92,0x0A,0x92,0x02,0x5B,0x07,0x09,0xD5,0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0, + 0x9F,0x05,0xBF,0x0D,0x3A,0x43,0x64,0x00,0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02, + 0x9A,0x43,0xCB,0x79,0x80,0x00,0x9B,0x06,0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07, + 0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21, + 0xC1,0x72,0x06,0x73,0xF0,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20, + 0x40,0x06,0x00,0x20,0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C,0x40,0x18,0x45,0x00, + 0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E, + 0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43, + 0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x10,0xB4,0x0E,0x24, + 0x60,0x43,0x03,0x4B,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C,0x40,0x18,0x43,0x00, + 0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E, + 0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43, + 0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x70,0xB4,0x12,0x4A, + 0x11,0x4D,0x52,0x7D,0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43,0x0E,0x22,0x50,0x43, + 0x0C,0x4B,0x86,0x18,0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0,0xEA,0x7D,0x8A,0x42, + 0x0A,0xD0,0x2A,0x7E,0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42,0x04,0xD0,0xAA,0x7E, + 0x8A,0x42,0x01,0xD0,0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C,0x86,0x42,0xEA,0xD8, + 0x70,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x70,0xB4,0x12,0x4A, + 0x11,0x4B,0x52,0x7D,0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43,0xFF,0x26,0x0D,0x4C, + 0x27,0x36,0x12,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0, + 0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42, + 0x01,0xD0,0x42,0x00,0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42,0xEA,0xD3,0x70,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x02,0x04,0x04,0x49, + 0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06,0x04,0x48,0x01,0xD5, + 0x40,0x68,0x00,0xE0,0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xC0,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x03,0x00,0x1E,0x49,0x05,0x20, + 0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31,0x08,0x6A,0x19,0x4C, + 0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68,0x00,0xF0,0x1E,0xFB,0x06,0x04,0x0A,0x12, + 0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62,0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0, + 0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62,0x04,0x20,0xE0,0x62,0x00,0x98,0x11,0xE0, + 0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B,0x60,0x62,0x04,0x20, + 0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x26,0x62,0x60,0x62,0x04,0x20, + 0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7,0x89,0x69,0x21,0x62,0x60,0x62,0x05,0x20, + 0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40,0x00,0x93,0x00,0x00,0x01,0x21,0x49,0x07, + 0x48,0x68,0x00,0x23,0x00,0x04,0x00,0x0F,0x00,0x28,0x0B,0x4A,0x48,0x68,0x03,0xD0, + 0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E,0x01,0xD0,0x01,0x20, + 0x07,0xE0,0xD0,0x78,0x00,0x28,0x02,0xD1,0x01,0x20,0x03,0x00,0x01,0xE0,0x0F,0x23, + 0x00,0x20,0xD3,0x70,0x08,0x60,0x70,0x47,0x14,0x07,0x00,0x20,0x0A,0x4A,0x10,0xB5, + 0xD1,0x88,0x0A,0x4B,0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43,0x08,0x48,0xD1,0x80, + 0x03,0xE0,0x07,0x48,0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60,0xFF,0xF7,0x28,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xC8,0x07,0x00,0x20, + 0xB0,0x94,0x00,0x00,0xFE,0xB5,0x04,0x00,0x3A,0x48,0x0E,0x00,0x07,0x6A,0x41,0x6A, + 0x02,0x91,0x41,0x6B,0x01,0x91,0xC0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x74,0xFF, + 0x35,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0xFE,0xF7,0xEA,0xF9,0xFB,0xF7,0xE6,0xFA, + 0x25,0x00,0x46,0xE0,0x68,0x1E,0x84,0x42,0x01,0xD1,0xFB,0xF7,0x15,0xFB,0xFB,0xF7, + 0x8F,0xFA,0xFB,0xF7,0x65,0xFB,0x00,0x2E,0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7, + 0xB5,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00, + 0x28,0x18,0x05,0x21,0xF9,0xF7,0xAA,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21,0xF9,0xF7,0xA0,0xFA,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0,0x05,0x21,0x28,0x00,0xF9,0xF7,0x96,0xFA, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00, + 0x00,0x20,0xFB,0xF7,0x31,0xF8,0x0C,0xE0,0x68,0x00,0x03,0x21,0xF9,0xF7,0x86,0xFA, + 0xA0,0x42,0xDB,0xD9,0x03,0x21,0x28,0x00,0xF9,0xF7,0x80,0xFA,0xA0,0x42,0xE9,0xD8, + 0xDE,0xE7,0x64,0x1E,0xB6,0xD2,0x0D,0x48,0x44,0x88,0x03,0xE0,0xFB,0xF7,0x48,0xFA, + 0xFB,0xF7,0x1E,0xFB,0x64,0x1E,0xF9,0xD2,0xFB,0xF7,0x88,0xFA,0x05,0x48,0x07,0x62, + 0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63,0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40,0x80,0x93,0x00,0x00,0xE0,0x95,0x00,0x00, + 0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07, + 0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5, + 0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60, + 0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0x02,0x49,0x00,0x03, + 0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xCD,0x07,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C, + 0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68, + 0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2, + 0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x93,0x00,0x00,0xF8,0xB5,0x17,0x4B, + 0x00,0x24,0x98,0x79,0x00,0x28,0x25,0xD0,0x00,0x20,0x0D,0x26,0x14,0x4D,0xF6,0x01, + 0x12,0xE0,0x81,0x00,0x49,0x19,0x89,0x19,0x8A,0x68,0x97,0x0F,0xFF,0x07,0x0A,0xD0, + 0x92,0x00,0x01,0x27,0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C,0x8A,0x60,0xA1,0x00, + 0xBF,0x08,0xC9,0x19,0x4A,0x60,0x40,0x1C,0x99,0x79,0x81,0x42,0xE9,0xDC,0x07,0x48, + 0x0D,0x22,0x00,0x21,0xC0,0x1F,0xFE,0xF7,0xBB,0xF8,0x20,0x00,0xFF,0xF7,0xB4,0xFF, + 0xFC,0xF7,0x32,0xFA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00,0x01,0x21,0x8D,0xB0, + 0x49,0x07,0x0C,0x94,0x4F,0x68,0x61,0x4E,0xB9,0x0F,0x89,0x07,0x7E,0xD5,0x30,0x22, + 0x00,0x21,0x68,0x46,0xFE,0xF7,0x9C,0xF8,0x07,0x21,0xB8,0x01,0x49,0x05,0x40,0x08, + 0x08,0x40,0x31,0x00,0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43,0x0C,0x90,0x00,0x20, + 0x33,0xE0,0x01,0x22,0x81,0x00,0x52,0x07,0x89,0x18,0x89,0x68,0x8E,0x00,0x32,0x0F, + 0x2A,0xD0,0x32,0x0F,0x94,0x46,0x92,0x00,0x6B,0x46,0xD2,0x18,0x40,0x3A,0xD3,0x6B, + 0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27,0x3F,0x06,0x0E,0x04, + 0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43,0x49,0x4E,0x33,0x40,0x8E,0x01,0xB6,0x0D, + 0x36,0x03,0x33,0x43,0x1B,0x0B,0x89,0x05,0x1B,0x03,0x89,0x0D,0x0B,0x43,0xD3,0x63, + 0x62,0x46,0x52,0x1E,0x01,0x23,0x93,0x40,0x9A,0x05,0x92,0x0D,0x71,0x46,0x11,0x43, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x0C,0x91,0x40,0x1C,0x0C,0x99,0x8E,0x46,0x09,0x04, + 0x09,0x0F,0x81,0x42,0xC5,0xD8,0x0C,0x98,0x01,0x27,0x00,0x04,0x00,0x0F,0x7B,0x07, + 0x0F,0xE0,0x82,0x00,0xD2,0x18,0x92,0x68,0x3E,0x00,0x92,0x00,0x12,0x0F,0x52,0x1E, + 0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06,0x24,0x0E,0x40,0x1C, + 0x0C,0x91,0x0C,0x99,0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F,0x92,0x19,0x82,0x42, + 0xE7,0xD8,0x00,0x21,0x08,0x00,0x6E,0x46,0x82,0x00,0xB2,0x58,0x00,0x2A,0x03,0xD0, + 0x8F,0x00,0xFF,0x18,0xBA,0x60,0x49,0x1C,0x40,0x1C,0x0C,0x28,0xF4,0xD3,0x23,0x49, + 0x0C,0x98,0x88,0x43,0x29,0x07,0x09,0x0C,0x08,0x43,0x00,0xE0,0x07,0xE0,0x07,0x21, + 0x49,0x05,0x88,0x43,0x61,0x07,0x09,0x0A,0x08,0x43,0x0C,0x90,0x2B,0xE0,0xB9,0x0F, + 0xC9,0x07,0x25,0xD0,0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C,0x82,0x00,0x11,0x0F, + 0x09,0x07,0x21,0x40,0x84,0x01,0xA4,0x0D,0x24,0x03,0x21,0x43,0x84,0x05,0x09,0x0B, + 0x09,0x03,0xA4,0x0D,0x21,0x43,0x0F,0x24,0x24,0x06,0x00,0x04,0x80,0x08,0xA1,0x43, + 0x20,0x40,0x01,0x43,0x08,0x0F,0x09,0xD0,0x12,0x0F,0x52,0x1E,0x01,0x20,0x90,0x40, + 0x80,0x05,0x80,0x0D,0xB0,0x43,0x5A,0x14,0x80,0x18,0x0C,0x90,0x99,0x60,0x02,0xE0, + 0x01,0x21,0x49,0x07,0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x74,0x0C,0x99,0x40,0x07, + 0x41,0x60,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xF0,0x00,0x00, + 0xFF,0x0F,0x00,0xFF,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C,0x07,0x49,0x00,0x22, + 0x20,0x00,0xF9,0xF7,0xF1,0xF8,0x05,0x4A,0x05,0x49,0x20,0x00,0x00,0x23,0xF9,0xF7, + 0xF3,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x00,0x00,0x10,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C, + 0x40,0x21,0x20,0x00,0xF9,0xF7,0xD8,0xF8,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23, + 0xF9,0xF7,0xDA,0xF8,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40, + 0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00, + 0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60, + 0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47, + 0xCC,0x07,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47, + 0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60,0x70,0x47,0x01,0x21, + 0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47,0x70,0xB4,0x03,0xAC, + 0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0,0x02,0x60,0x9A,0x42, + 0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60,0x08,0x68,0xA8,0x42, + 0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x14,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1,0x93,0xC0,0xC1,0xE0,0x63,0x30,0xE0,0xE3, + 0xC1,0x12,0x62,0xE0,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1,0x1F,0x85,0xEB,0x51, + 0x78,0x47,0xC0,0x46,0x18,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1,0x93,0xC0,0xC1,0xE0, + 0x0F,0x30,0xE0,0xE3,0x27,0x3C,0x43,0xE2,0x41,0x16,0x62,0xE0,0x93,0x01,0x20,0xE0, + 0x1E,0xFF,0x2F,0xE1,0xAD,0x8B,0xDB,0x68,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5, + 0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0, + 0x1C,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x10,0x30,0x9F,0xE5,0x93,0x10,0x82,0xE0, + 0x63,0x30,0xE0,0xE3,0xA2,0x12,0xA0,0xE1,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x1F,0x85,0xEB,0x51,0x10,0xB5,0xF9,0xF7,0x37,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x25,0x00,0x6F,0x00,0xB9,0x00,0xF0,0x00,0x27,0x01,0x71,0x01,0xBB,0x01,0x20,0x00, + 0x6C,0x00,0xB8,0x00,0x04,0x01,0x50,0x01,0x89,0x01,0xC2,0x01,0x0E,0x02,0x5A,0x02, + 0xA6,0x02,0xF2,0x02,0x26,0x00,0x72,0x00,0xC0,0x00,0x0C,0x01,0x5A,0x01,0x93,0x01, + 0xD1,0x01,0x28,0x02,0x5D,0x02,0xA6,0x02,0xE1,0x02,0x00,0x00,0x89,0x08,0x49,0x1E, + 0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07,0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43, + 0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x01,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0x50,0x46,0x00,0x00,0x78,0x37,0x00,0x00,0xE8,0x03,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x14,0x05,0x14,0x05,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x7A,0x00,0x01,0x00,0x04,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0xFA,0x00, + 0x28,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x1E,0x00,0x46,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x5E,0x01,0x90,0x01,0x90,0x01, + 0x90,0x01,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0xFF, + 0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x2C,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x50,0x01,0x00,0x03,0x00,0x00,0x00,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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0xC2,0x00,0x00, + 0x10,0x10,0xB8,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x99,0x19,0x90,0x01,0x32,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x23,0x00,0x41,0x00, + 0x46,0x00,0x05,0x00,0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0xF4,0x01, + 0xF4,0x01,0xF4,0x01,0x90,0x01,0x00,0x00,0x64,0x3C,0x00,0x00,0x64,0x3C,0x00,0x00, + 0x64,0x3C,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0xC2,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x80,0x00,0x00,0x18,0x10,0xB8,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x19,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0xB4,0x00,0xFA,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x14,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xF0,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x8D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xC2,0x00,0x00, + 0x20,0x00,0x20,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x10,0x10,0xA8,0x00, + 0x10,0x3F,0x10,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x10,0x08,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x07,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x20, + 0x11,0x30,0x10,0x00,0x41,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x60,0x38,0x30,0x08,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x58,0x30,0x28,0x00,0x58,0x30,0x28,0x00,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x60,0x30,0x30,0x00,0x48,0x31,0x18,0x01,0x48,0x31,0x18,0x01,0x60,0x37,0x30,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x20,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x18,0x18,0x18,0x18, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x20,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x20,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1E,0x1E,0x1E,0x1E, + 0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x20, + 0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x20,0x1B,0x1B, + 0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x1B,0x20,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x20,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x16,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A,0x1A, + 0x1A,0x1A,0x1A,0x1A,0x1A,0x16,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x24,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x24,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0x91,0xE7, + 0x21,0x2C,0x92,0xE7,0x42,0xBC,0x92,0xE7,0x63,0x28,0x93,0xE7,0x84,0xB8,0x93,0xE7, + 0xA5,0x24,0x94,0xE7,0xC6,0xB4,0x94,0xE7,0xE7,0x20,0x95,0xE7,0x08,0xB1,0x95,0xE7, + 0x29,0x9D,0x98,0xE7,0x4A,0x01,0x99,0xE7,0x6B,0x99,0x99,0xE7,0x8C,0x05,0x9A,0xE7, + 0xAD,0x95,0x9A,0xE7,0xCE,0x09,0x90,0xE7,0xEF,0x11,0x90,0xE7,0x10,0x0E,0x90,0xE7, + 0x31,0x46,0x90,0xE7,0x52,0x52,0x90,0xE7,0x73,0x4A,0x90,0xE7,0x94,0x4E,0x90,0xE7, + 0xB5,0x02,0x90,0xE7,0xD6,0x02,0x90,0xE7,0xF7,0x02,0x90,0xE7,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x33,0x30,0x03,0x00,0x00,0x00,0x00,0x00,0x30,0x68,0x30,0x68,0x70,0x28,0x70,0x28, + 0x32,0x30,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,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0xC4,0x00,0x82,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0003_20140310.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0003_20140310.h new file mode 100644 index 00000000..b1d3fe21 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0003_20140310.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS_GF MELFAS, f/w 3(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x38,0x4A,0x36,0x48,0x36,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x34,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x32,0x49,0x32,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x2C,0x4B,0x9F,0x6A,0x2E,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x28,0x48,0x29,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x20,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x22,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x11,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0x00, + 0x00,0x00,0x00,0x10,0x7C,0x02,0x00,0x00,0xEC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x38,0x48,0x41,0x6B, + 0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48, + 0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61,0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69, + 0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4,0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1, + 0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF,0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C, + 0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68, + 0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0, + 0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09, + 0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06,0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7, + 0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0xC2,0xFE,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x54,0x07,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x87,0xFD,0x07,0x00,0x03,0xF0,0x3C,0xFC,0x03,0xF0,0x2E,0xFC, + 0x03,0xF0,0xB8,0xFC,0x46,0x4A,0x47,0x49,0x47,0x48,0x04,0xF0,0xDB,0xFD,0x05,0x21, + 0x49,0x03,0x00,0x20,0x00,0xF0,0x24,0xFA,0x44,0x4C,0x45,0x49,0xA0,0x61,0x00,0x20, + 0x00,0xF0,0x1E,0xFA,0x43,0x4B,0x44,0x49,0xD8,0x63,0x44,0x48,0x00,0xF0,0x18,0xFA, + 0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x78,0xFC,0x40,0x4A,0x41,0x48, + 0x00,0x21,0x04,0xF0,0xD1,0xFD,0x06,0xF0,0xA5,0xF9,0x03,0xF0,0x1F,0xFD,0x3E,0x48, + 0x00,0x26,0x81,0x7A,0x01,0x25,0x6D,0x07,0xE1,0x71,0xC1,0x7A,0x21,0x72,0x40,0x7A, + 0x60,0x72,0xA6,0x71,0xA6,0x72,0xE6,0x72,0x26,0x73,0x36,0x48,0x66,0x73,0xA6,0x73, + 0x68,0x63,0xFF,0x20,0xE8,0x63,0xE8,0x14,0x00,0xF0,0x20,0xFD,0x33,0x48,0x06,0x70, + 0xFF,0x20,0x81,0x30,0x00,0xF0,0x1A,0xFD,0x31,0x49,0x02,0x20,0x06,0xF0,0x8C,0xFC, + 0x02,0x20,0x06,0xF0,0x91,0xFC,0x60,0x7A,0x00,0x28,0x01,0xD0,0x06,0xF0,0x00,0xFE, + 0x00,0x2F,0x1F,0xD1,0x2B,0x4E,0xB7,0x15,0x60,0x7A,0x00,0x28,0x02,0xD0,0x2A,0x49, + 0x20,0x6B,0x88,0x60,0xE8,0x6B,0x0B,0x28,0x14,0xD0,0x28,0x48,0x40,0x68,0x00,0x07, + 0x01,0xD5,0x02,0xF0,0xF7,0xFA,0xF0,0x68,0x25,0x49,0x88,0x42,0xEC,0xD9,0x25,0x48, + 0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB0,0x68,0xB8,0x43,0xB0,0x60,0xB0,0x68,0x38,0x43, + 0xB0,0x60,0xE1,0xE7,0x20,0x7A,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0, + 0xDD,0xFC,0x60,0x7A,0x00,0x28,0x01,0xD0,0x06,0xF0,0xDA,0xFD,0x02,0x20,0x06,0xF0, + 0x67,0xFC,0xFF,0x20,0x81,0x30,0x00,0xF0,0xD1,0xFC,0x17,0x49,0x05,0x20,0x03,0xF0, + 0x5B,0xFA,0x0B,0x20,0xE8,0x63,0x03,0xF0,0xF1,0xFA,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x28,0x00,0x00,0x00,0xCC,0x72,0x00,0x00,0x00,0x00,0x00,0x10,0x0C,0x07,0x00,0x20, + 0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20,0x00,0x9D,0x00,0x00,0x00,0x93,0x00,0x00, + 0xCC,0x06,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xD9,0x07,0x00,0x20, + 0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30, + 0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00,0x4D,0x6E,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0x20,0x20,0x52,0xE2,0x05,0x00,0x00,0x3A,0x18,0x50,0xB1,0xE8, + 0x20,0x20,0x52,0xE2,0x18,0x50,0xA0,0xE8,0x18,0x50,0xB1,0xE8,0x18,0x50,0xA0,0xE8, + 0xF9,0xFF,0xFF,0x2A,0x02,0xCE,0xB0,0xE1,0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28, + 0x18,0x00,0xB1,0x48,0x18,0x00,0xA0,0x48,0x10,0x40,0xBD,0xE8,0x02,0xCF,0xB0,0xE1, + 0x04,0x30,0x91,0x24,0x04,0x30,0x80,0x24,0x1E,0xFF,0x2F,0x01,0x82,0x2F,0xB0,0xE1, + 0xB2,0x30,0xD1,0x20,0x01,0x20,0xD1,0x44,0xB2,0x30,0xC0,0x20,0x01,0x20,0xC0,0x44, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A, + 0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0,0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0, + 0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0, + 0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0,0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1, + 0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3,0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21, + 0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A,0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A, + 0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0,0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0, + 0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0,0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0, + 0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0, + 0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0, + 0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21,0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3, + 0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0, + 0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3, + 0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3, + 0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3, + 0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A, + 0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5,0x02,0x20,0x06,0xF0,0xB3,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0, + 0xA0,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0, + 0x83,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0,0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10, + 0x78,0x47,0xC0,0x46,0xD4,0xFD,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40, + 0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5, + 0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0B,0x24,0x02,0xF0,0xD7,0xF8,0x64,0x1E, + 0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7B, + 0xC0,0x07,0x26,0xD0,0x70,0x7A,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1, + 0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05, + 0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18, + 0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0,0x31,0xF8,0x64,0x1C,0x70,0x7A,0xA0,0x42, + 0xF3,0xDA,0x70,0x7A,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7A, + 0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x3A,0x06,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07, + 0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7A,0xE4,0x00,0xE6,0x18,0x19,0x24,0xA4,0x01, + 0x36,0x19,0xB5,0x70,0x56,0x7A,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x80, + 0x56,0x7A,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xF5,0x80,0x55,0x7A,0xED,0x00, + 0xED,0x18,0x2D,0x19,0x29,0x72,0x55,0x7A,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19, + 0x59,0x72,0x51,0x7A,0x49,0x1C,0x51,0x72,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x72,0x70,0xBC,0x70,0x47,0x01,0x20, + 0xFA,0xE7,0x00,0x00,0x40,0x00,0x00,0x20,0x40,0x06,0x00,0x20,0xFF,0xB5,0x0A,0x20, + 0x48,0x43,0x16,0x4F,0x81,0xB0,0xC5,0x19,0xFF,0x35,0x48,0x00,0xC1,0x35,0xC0,0x19, + 0x2A,0x73,0x00,0x90,0x0C,0x00,0xE0,0x30,0x80,0x8A,0x16,0x00,0x0A,0x21,0xFF,0xF7, + 0x29,0xFF,0xE8,0x81,0x00,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7, + 0x21,0xFF,0x28,0x82,0x38,0x19,0xFF,0x30,0x41,0x30,0x00,0x7E,0xB9,0x19,0x68,0x73, + 0x04,0x98,0xA8,0x74,0x01,0x98,0x06,0x55,0x0D,0x20,0x80,0x01,0x08,0x18,0x00,0x21, + 0xC4,0x77,0x81,0x74,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20, + 0x06,0x48,0x0F,0x23,0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A, + 0xD2,0x18,0x09,0x03,0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0x40,0x00,0x00,0x20, + 0xF1,0xB5,0xB1,0x48,0x90,0xB0,0x0F,0x90,0x40,0x7C,0x02,0x90,0x0F,0x98,0xC0,0x7C, + 0x01,0x90,0x0F,0x98,0x00,0x7C,0x00,0x90,0xAC,0x48,0x00,0x68,0x00,0x88,0x00,0x05, + 0x7E,0xD5,0x10,0x98,0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90, + 0x41,0xE1,0x03,0x98,0x01,0x21,0x80,0x00,0x49,0x07,0x40,0x18,0x0E,0x90,0x00,0x68, + 0x81,0x00,0x0D,0x90,0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0, + 0x03,0xFB,0x29,0xE1,0x9E,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA, + 0x0D,0x98,0x9B,0x49,0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05, + 0x80,0x0D,0x50,0x80,0x4A,0x5B,0x34,0x31,0x4A,0x53,0x69,0x18,0x48,0x80,0x13,0xE1, + 0x02,0x9F,0x93,0x49,0x00,0x20,0x7F,0x1E,0x68,0x31,0x69,0x18,0x06,0xE0,0x83,0x00, + 0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB, + 0x0D,0x98,0x62,0x46,0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A,0x02,0x9A,0x88,0x4E, + 0x92,0x00,0x8B,0x18,0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D, + 0x0A,0x92,0x0B,0x90,0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00, + 0x07,0xE0,0x93,0x00,0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19, + 0x52,0x1C,0x02,0x9B,0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7,0x53,0xFD,0x07,0x00, + 0x02,0x99,0x30,0x00,0xFF,0xF7,0x4E,0xFD,0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99, + 0x89,0x7C,0x8F,0x42,0x13,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x0E,0xDA, + 0x6F,0x4B,0x0F,0x9A,0x61,0x00,0x28,0x3B,0x58,0x5E,0x12,0x7D,0x01,0x9E,0x00,0xE0, + 0xCD,0xE0,0xB6,0x1A,0xB0,0x42,0x0A,0xDA,0x80,0x18,0x58,0x52,0x07,0xE0,0x68,0x49, + 0x0F,0x9B,0x60,0x00,0x28,0x39,0x0A,0x5A,0x5B,0x7D,0xD2,0x1A,0x0A,0x52,0x64,0x49, + 0x60,0x00,0x28,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E, + 0x01,0x99,0x88,0x42,0x09,0x90,0x01,0xDB,0x05,0x20,0x2B,0xE0,0x88,0x00,0x05,0x21, + 0xFF,0xF7,0x48,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x22,0xE0,0x01,0x98, + 0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x3D,0xFE,0x09,0x99,0x88,0x42,0x04,0xDC, + 0x53,0x48,0x03,0x21,0x0E,0x38,0x01,0x55,0x17,0xE0,0x01,0x98,0x05,0x21,0x40,0x00, + 0xFF,0xF7,0x30,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98, + 0x05,0x21,0xFF,0xF7,0x27,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0, + 0x08,0x00,0x02,0xD1,0x46,0x49,0x0E,0x39,0x08,0x55,0x45,0x49,0x0C,0x9A,0x34,0x31, + 0x48,0x5F,0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A, + 0x3F,0x48,0x57,0x1A,0x0E,0x38,0x06,0x91,0x01,0x5D,0x0F,0x98,0x80,0x7D,0x81,0x42, + 0x27,0xD3,0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42, + 0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42, + 0xFF,0xF7,0xC8,0xFC,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E, + 0x00,0xDC,0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E, + 0x00,0xDC,0x78,0x42,0xFF,0xF7,0xB6,0xFC,0x08,0x99,0x00,0x2E,0x1D,0xDB,0x09,0x19, + 0x1C,0xE0,0x09,0x98,0xFF,0x21,0x91,0x31,0x48,0x43,0x05,0x21,0xFF,0xF7,0xAA,0xFC, + 0x01,0x99,0xFF,0xF7,0xA7,0xFC,0x64,0x21,0x08,0x1A,0x31,0x1E,0x05,0x90,0x00,0xDC, + 0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7,0x9D,0xFC,0x05,0x9A,0x04,0x00,0x38,0x1E, + 0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21,0xDC,0xE7,0x09,0x1B,0x06,0x9A,0x00,0x2F, + 0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A,0x15,0x4A,0x0C,0x9B,0x53,0x53,0x0A,0x9B, + 0x0B,0x9A,0x5A,0x80,0x12,0x4A,0x13,0x4B,0x34,0x32,0x51,0x53,0x07,0x9A,0x89,0x05, + 0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43,0x91,0x0A,0x89,0x02,0x80,0x05, + 0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98,0x40,0x1C,0x04,0x90,0x03,0x98, + 0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42,0x00,0xDA,0xB9,0xE6,0x11,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0xD4,0x07,0x00,0x20, + 0xD4,0x0A,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4,0x1B,0x21,0xDA,0x88, + 0x89,0x01,0x80,0x24,0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x0D,0x80, + 0xC5,0x89,0x4D,0x80,0x05,0x8A,0x8D,0x80,0x40,0x8A,0xC8,0x80,0x08,0x48,0x20,0x30, + 0x00,0x89,0x22,0x43,0x08,0x81,0x06,0xE0,0x00,0x20,0x08,0x80,0x48,0x80,0x88,0x80, + 0xC8,0x80,0xA2,0x43,0x08,0x81,0xDA,0x80,0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20, + 0x80,0x93,0x00,0x00,0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A, + 0x00,0x28,0x09,0xD1,0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x01,0xF0,0x6A,0xFE, + 0x64,0x1E,0xFB,0xD2,0xFF,0x24,0x12,0xE0,0x04,0xF0,0xA4,0xFF,0x01,0xF0,0x60,0xFD, + 0x01,0xF0,0xA8,0xFD,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x71,0xF9,0x04,0x00, + 0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20, + 0x06,0xF0,0x0E,0xF8,0x02,0x20,0x05,0xF0,0xFF,0xFF,0x12,0x49,0xE8,0x68,0xC8,0x61, + 0x28,0x69,0xC8,0x61,0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B, + 0x0F,0x48,0x02,0xE0,0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5, + 0x48,0x68,0x80,0x07,0xFC,0xD5,0x01,0xF0,0x55,0xFE,0x01,0x20,0x00,0xF0,0x6E,0xF8, + 0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x42,0xF9, + 0x1C,0x48,0x03,0x27,0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD, + 0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0,0xBD,0xF8,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x06,0xF0,0xE0,0xF8,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0xF0,0xB5,0xFF,0xB0,0x00,0x20,0xCC,0xB0,0xBB,0x90,0x40,0x1E,0xB7,0x90,0xFF,0x48, + 0xFF,0x4A,0x00,0x68,0xFF,0x4F,0x60,0x30,0xC1,0x7D,0xFF,0x4C,0x04,0x91,0x01,0x7E, + 0x12,0x88,0x89,0x18,0x09,0x06,0x09,0x0E,0x03,0x91,0x41,0x7E,0x02,0x91,0x80,0x7E, + 0x01,0x90,0x00,0x20,0x3D,0x79,0x01,0x26,0x00,0x90,0x14,0xE0,0x0A,0x20,0x70,0x43, + 0x0B,0x21,0xC0,0x19,0x89,0x01,0x41,0x18,0x09,0x7C,0x00,0x29,0x0A,0xD0,0xF3,0x49, + 0x40,0x18,0x02,0xF0,0xF3,0xFD,0x00,0x28,0x04,0xD0,0x00,0x98,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x00,0x90,0x76,0x1C,0xA0,0x7A,0xB0,0x42,0xE7,0xDA,0xEC,0x48,0x01,0x88, + 0x82,0x88,0x8E,0x1A,0x00,0x2E,0x00,0xDC,0x56,0x1A,0x42,0x88,0xC0,0x88,0x31,0x04, + 0x09,0x0C,0x8C,0x46,0x11,0x1A,0x00,0x29,0x00,0xDC,0x81,0x1A,0x08,0x04,0xE4,0x49, + 0x00,0x26,0x20,0x39,0xCA,0x91,0x8E,0x77,0x00,0x99,0x00,0x0C,0x00,0x29,0x0D,0xD0, + 0x61,0x46,0x1E,0x29,0x0A,0xD2,0x32,0x28,0x01,0xD2,0x01,0x20,0x04,0xE0,0x64,0x28, + 0x01,0xD2,0x02,0x20,0x00,0xE0,0x03,0x20,0xCA,0x99,0x88,0x77,0xCA,0x98,0x40,0x7F, + 0x00,0x28,0x12,0xD1,0xCA,0x98,0x80,0x7F,0x01,0x28,0x02,0xD1,0x04,0x98,0x80,0x1C, + 0x08,0xE0,0x02,0x28,0x02,0xD1,0x04,0x98,0x00,0x1D,0x03,0xE0,0x03,0x28,0x04,0xD1, + 0x04,0x98,0x80,0x1D,0x00,0x06,0x00,0x0E,0x04,0x90,0x0D,0x22,0x00,0x21,0xB3,0xA8, + 0x03,0xF0,0xD2,0xFF,0xF8,0x88,0xFF,0x21,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06, + 0x09,0xD5,0x01,0xF0,0x43,0xF8,0xC7,0x49,0x01,0x20,0x08,0x70,0x7F,0xB0,0x4C,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC3,0x49,0x00,0x20,0x08,0x70,0xE0,0x7A,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0xE0,0x72,0x60,0x7A,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0, + 0x18,0xE0,0x00,0x28,0x16,0xD1,0xB8,0x48,0x82,0x22,0x00,0x21,0x8E,0x30,0x03,0xF0, + 0xAB,0xFF,0xE0,0x7A,0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E, + 0x0A,0x00,0x14,0x23,0xB3,0xA8,0xFF,0xF7,0x89,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD, + 0x25,0x72,0xE8,0xE1,0x0D,0x22,0x01,0x21,0xAF,0xA8,0x03,0xF0,0x95,0xFF,0x02,0x20, + 0xAA,0x49,0x05,0x90,0xA7,0x48,0x89,0x31,0x41,0x18,0xC9,0x91,0xA7,0x49,0x7C,0x31, + 0x40,0x18,0xC8,0x90,0x14,0xE1,0x0C,0x26,0x06,0xAF,0x34,0x20,0x70,0x43,0x06,0xA9, + 0x40,0x18,0x00,0x21,0x34,0x22,0xC9,0x43,0x03,0xF0,0x7E,0xFF,0x76,0x1E,0xF4,0xD5, + 0x05,0x98,0x01,0xF0,0x03,0xFC,0x01,0x27,0xB8,0x90,0x54,0xE0,0xB8,0x98,0x01,0x26, + 0xB9,0x90,0x4C,0xE0,0x0A,0x20,0x70,0x43,0x96,0x4A,0x0B,0x21,0x80,0x18,0x89,0x01, + 0x41,0x18,0xC7,0x91,0x09,0x7C,0x00,0x29,0x40,0xD0,0x94,0x49,0x40,0x18,0xC6,0x90, + 0x02,0xF0,0x34,0xFD,0x05,0x99,0x08,0x43,0x07,0xD0,0xC6,0x98,0x02,0xF0,0x2E,0xFD, + 0x00,0x28,0x33,0xD0,0x05,0x98,0x00,0x28,0x30,0xD0,0x8A,0x49,0x78,0x00,0x40,0x18, + 0xC5,0x90,0xE0,0x30,0x80,0x8A,0x0A,0x21,0xFF,0xF7,0x74,0xFB,0xC7,0x99,0x4A,0x8A, + 0x11,0x1A,0x00,0x29,0x00,0xDC,0x81,0x1A,0xC5,0x98,0xBA,0x91,0xFF,0x30,0x01,0x30, + 0xC0,0x89,0x0A,0x21,0xFF,0xF7,0x66,0xFB,0xC7,0x99,0x8A,0x8A,0x11,0x1A,0x00,0x29, + 0x00,0xDC,0x81,0x1A,0xBA,0x9A,0x10,0x00,0x50,0x43,0x0A,0x00,0x4A,0x43,0xB9,0x99, + 0x80,0x18,0x88,0x42,0x04,0xDA,0x34,0x21,0x79,0x43,0x06,0xAA,0x56,0x50,0xB9,0x90, + 0x34,0x21,0x79,0x43,0x06,0xAA,0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x7A, + 0xB0,0x42,0xAF,0xDA,0x7F,0x1C,0xAF,0x42,0xA8,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x22, + 0xB8,0x99,0x10,0x00,0x15,0xE0,0xB3,0xAE,0x33,0x5C,0x00,0x2B,0x10,0xD1,0x34,0x23, + 0x06,0x00,0x5E,0x43,0x06,0xAB,0xF7,0x18,0x9E,0x59,0xB3,0x00,0xFF,0x58,0x8F,0x42, + 0x06,0xDA,0x00,0x2F,0x04,0xDB,0x00,0x2E,0x02,0xDB,0x39,0x00,0x00,0x22,0xB7,0x90, + 0x40,0x1C,0xA8,0x42,0xE7,0xDD,0x00,0x2A,0x7E,0xD1,0xBB,0x98,0x34,0x21,0x40,0x1C, + 0xBB,0x90,0xB7,0x98,0x5B,0x4F,0x48,0x43,0x06,0xA9,0xC4,0x90,0x08,0x58,0x0A,0x21, + 0x48,0x43,0x5A,0x49,0xC0,0x19,0x88,0x39,0x41,0x18,0xB7,0x98,0x0A,0x22,0x50,0x43, + 0xC6,0x19,0x30,0x00,0xFF,0x30,0xCD,0x30,0x03,0xF0,0xB2,0xFE,0xB7,0x98,0x0A,0x21, + 0x40,0x00,0xC0,0x19,0xC3,0x90,0xE0,0x30,0x80,0x8A,0xFF,0xF7,0x03,0xFB,0xFF,0x36, + 0xC1,0x36,0xF0,0x81,0xC3,0x98,0x0A,0x21,0xFF,0x30,0x01,0x30,0xC0,0x89,0xFF,0xF7, + 0xF9,0xFA,0x30,0x82,0xB7,0x98,0x38,0x18,0xFF,0x30,0x41,0x30,0x00,0x7E,0x70,0x73, + 0xB0,0x7C,0x04,0x99,0x49,0x1C,0x88,0x42,0x01,0xD2,0x40,0x1C,0xB0,0x74,0xB7,0x7C, + 0x13,0x2F,0x09,0xD9,0x14,0x21,0x38,0x00,0xFF,0xF7,0xE4,0xFA,0x03,0x99,0x89,0x1C, + 0x88,0x42,0x01,0xD2,0x14,0x37,0xB7,0x74,0x30,0x7B,0xB7,0x9A,0xB3,0xA9,0x88,0x54, + 0xC9,0x9A,0xB7,0x99,0x81,0x54,0x31,0x7B,0xC8,0x9A,0x00,0x20,0x88,0x54,0xC4,0x99, + 0x06,0xAA,0x51,0x58,0xAF,0xAA,0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x34,0x23, + 0x58,0x43,0xC4,0x9B,0x06,0xAE,0xC2,0x90,0xF3,0x58,0x00,0x22,0x80,0x19,0xD2,0x43, + 0x9B,0x00,0x84,0x46,0xC2,0x50,0xB3,0xA8,0x40,0x5C,0xB8,0x9E,0x00,0x28,0x10,0xD1, + 0xA7,0x7A,0x01,0x20,0x0B,0xE0,0x83,0x00,0x62,0x46,0xD2,0x58,0x00,0x2A,0x05,0xDB, + 0xB2,0x42,0x03,0xDA,0xC2,0x9B,0x06,0xAE,0xF0,0x50,0x16,0x00,0x40,0x1C,0x87,0x42, + 0xF1,0xDA,0x49,0x1C,0xA9,0x42,0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x7A,0xBB,0x99, + 0x88,0x42,0x05,0xDD,0xBD,0x98,0x40,0x1C,0xA8,0x42,0xBD,0x90,0x00,0xDC,0x56,0xE7, + 0x05,0x98,0x41,0x1E,0x09,0x06,0x09,0x0E,0x00,0x28,0x05,0x91,0x00,0xD0,0xE2,0xE6, + 0x01,0x26,0xBE,0x96,0xBC,0x90,0x70,0xE0,0xAF,0xA8,0x80,0x5D,0x00,0x28,0x6B,0xD0, + 0xBE,0x98,0x10,0x49,0x2F,0x18,0x0A,0x20,0x70,0x43,0x40,0x18,0x0B,0x21,0x89,0x01, + 0xC1,0x90,0x40,0x18,0xC0,0x90,0x01,0x7C,0xC8,0x98,0x08,0x5C,0x02,0x99,0x88,0x42, + 0x44,0xD2,0x0C,0x2F,0x42,0xDC,0x09,0x49,0xC1,0x98,0x40,0x18,0x02,0xF0,0x1E,0xFC, + 0x00,0x28,0x3B,0xD0,0xC0,0x98,0x03,0x4A,0x00,0x7C,0x0D,0xE0,0xD4,0x07,0x00,0x20, + 0x00,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0xD6,0x02,0x00,0x00, + 0xC0,0x03,0x00,0x20,0x40,0x07,0x00,0x20,0xC8,0x99,0xC8,0x9B,0x41,0x5C,0x49,0x1C, + 0xC1,0x54,0xC1,0x98,0x2D,0x21,0x09,0x01,0x41,0x18,0x0A,0x20,0x78,0x43,0x80,0x18, + 0xBF,0x90,0xFF,0x30,0xCD,0x30,0x0A,0x22,0x03,0xF0,0xF2,0xFD,0xC1,0x98,0x09,0x21, + 0x89,0x01,0x41,0x18,0xBF,0x98,0x4A,0x7D,0xFF,0x30,0xC1,0x30,0xC2,0x74,0x89,0x7D, + 0x01,0x75,0xC0,0x98,0xB3,0xA9,0x00,0x7C,0xC8,0x55,0xC9,0x99,0x47,0x54,0xBE,0x98, + 0x40,0x1C,0xBE,0x90,0xBC,0x98,0x40,0x1C,0xBC,0x90,0x15,0xE0,0x33,0x49,0xC1,0x98, + 0x31,0x4F,0x40,0x18,0x02,0xF0,0xDA,0xFB,0x00,0x28,0x0D,0xD0,0xCA,0x98,0x01,0x21, + 0x01,0x77,0xC0,0x98,0x80,0x7D,0x13,0x28,0x06,0xD9,0x60,0x7A,0x01,0x28,0x03,0xD1, + 0xF8,0x88,0x04,0x21,0x08,0x43,0xF8,0x80,0x76,0x1C,0xA0,0x7A,0xB0,0x42,0x8B,0xDA, + 0x25,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5,0x01,0x99,0x04,0x22,0xE1,0x72,0x22,0x49, + 0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0,0xB3,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1, + 0x1D,0x4F,0x01,0x20,0x0D,0x22,0x92,0x01,0x39,0x18,0x8B,0x18,0xDB,0x7F,0x00,0x2B, + 0x0E,0xD1,0x1B,0x23,0x5B,0x01,0xC9,0x18,0x09,0x7B,0x00,0x29,0x08,0xD1,0x02,0x06, + 0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23,0xB3,0xA8,0xFF,0xF7,0xB7,0xFA,0x02,0xE0, + 0x40,0x1C,0x0D,0x28,0xE8,0xDB,0xE0,0x7A,0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43, + 0x0D,0x49,0x47,0x18,0x38,0x00,0xFF,0x30,0xD3,0x30,0x02,0xF0,0x8F,0xFB,0x00,0x28, + 0x03,0xD1,0x01,0x20,0xFF,0x37,0xC1,0x37,0xB8,0x74,0x76,0x1C,0xAE,0x42,0xCB,0xDD, + 0xBC,0x98,0x28,0x18,0x20,0x72,0x20,0x7A,0x05,0x49,0x82,0x22,0xA0,0x72,0xC8,0x1D, + 0xFD,0x30,0x03,0xF0,0x75,0xFD,0xE1,0xE5,0x40,0x00,0x00,0x20,0xD6,0x02,0x00,0x00, + 0x0C,0x02,0x00,0x20,0xF1,0xB5,0x38,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90, + 0x36,0x48,0x41,0x7F,0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21, + 0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29, + 0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x2A,0xF9, + 0x01,0xF0,0x00,0xFA,0x00,0x24,0x27,0x00,0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0, + 0x57,0xF8,0x00,0x28,0x28,0xD0,0x0E,0x21,0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D, + 0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x8A,0xFA,0x40,0x1C,0x14,0xD1, + 0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x05,0xF0,0x7C,0xFA,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A, + 0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3, + 0x7F,0x1C,0x15,0x2F,0xC8,0xD3,0x20,0x00,0xFF,0x38,0x27,0x38,0x04,0xD1,0x04,0x98, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0xB2,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0, + 0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00, + 0xF0,0xB5,0x7B,0x4A,0xFF,0xB0,0xBC,0xB0,0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18, + 0xB8,0x90,0x48,0x42,0xB7,0x90,0x77,0x48,0x77,0x4E,0x07,0x7F,0x02,0xA8,0x01,0x90, + 0x76,0x48,0xBA,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90, + 0x73,0x4A,0x00,0x21,0x30,0x00,0x03,0xF0,0x1F,0xFD,0x00,0x25,0x00,0x24,0x6F,0x48, + 0x20,0x38,0x01,0x7D,0xC9,0x07,0x14,0xD0,0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0, + 0xBD,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0, + 0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42, + 0x16,0xD1,0xB7,0x9A,0x21,0x00,0x28,0x00,0x05,0xF0,0x12,0xFA,0x10,0xE0,0xBC,0x42, + 0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E, + 0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0, + 0x64,0x1C,0x0E,0x2C,0xCB,0xD3,0x6D,0x1C,0x15,0x2D,0xC7,0xD3,0x01,0xF0,0x7A,0xF8, + 0x01,0xF0,0x50,0xF9,0x00,0x25,0x00,0x24,0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00, + 0x28,0x00,0x01,0xF0,0xA5,0xFF,0x00,0x28,0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00, + 0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD, + 0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00,0x28,0x00,0x01,0xF0, + 0xCF,0xFF,0x39,0x19,0x01,0x9A,0x49,0x00,0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3, + 0x6D,0x1C,0x15,0x2D,0xD7,0xD3,0x00,0x20,0x00,0x90,0x01,0xF0,0x23,0xF9,0x00,0x25, + 0x00,0x24,0x21,0x00,0x28,0x00,0x01,0xF0,0x7B,0xFF,0x00,0x28,0x3E,0xD0,0x0E,0x21, + 0x69,0x43,0xB9,0x9B,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00, + 0xF1,0x5B,0x00,0x04,0x00,0x0C,0x81,0x42,0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00, + 0x01,0xF0,0x9E,0xFF,0x01,0x99,0xC8,0x53,0x00,0x98,0x03,0x21,0xFF,0xF7,0xA2,0xF8, + 0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1, + 0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0, + 0x67,0xF9,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0, + 0x5F,0xF9,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C, + 0xB7,0xD3,0x6D,0x1C,0x15,0x2D,0xB3,0xD3,0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98, + 0x40,0x1E,0xB8,0x90,0x18,0xD2,0x00,0x25,0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43, + 0x01,0x99,0x30,0x19,0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00,0x05,0xF0,0x5C,0xF9, + 0x64,0x1C,0x0E,0x2C,0xF4,0xD3,0x6D,0x1C,0x15,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0, + 0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0xF0,0xDC,0xFF,0x8D,0xE7,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x60,0x06,0x00,0x20,0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00, + 0xD2,0x02,0x00,0x00,0x11,0x07,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68, + 0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48, + 0x00,0x90,0x80,0x79,0x00,0x28,0x3C,0xD0,0x00,0x21,0x0D,0x25,0x1F,0x4F,0xED,0x01, + 0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x79,0x1B,0x0F,0x21,0xE0,0x84,0x00, + 0xE4,0x19,0x64,0x19,0xA4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00, + 0xC0,0x19,0x40,0x19,0x80,0x68,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43, + 0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02, + 0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0, + 0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49, + 0x40,0x8C,0x01,0x91,0x4B,0x8B,0x20,0x39,0x00,0x91,0x89,0x7B,0x00,0x25,0x2F,0x00, + 0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99, + 0x09,0x7E,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29, + 0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00, + 0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42, + 0x5C,0xDC,0x82,0x42,0x5A,0xDB,0x8C,0x45,0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25, + 0x72,0x46,0x00,0x2A,0x7B,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0, + 0x03,0x2A,0x76,0xD1,0xE2,0x79,0xD3,0x07,0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A, + 0x27,0xD1,0x09,0x20,0x00,0x25,0xE0,0x71,0x6B,0xE0,0x00,0x9A,0x92,0x7A,0x00,0x2A, + 0x67,0xD1,0x00,0xF0,0x8B,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72, + 0x5F,0xE0,0xE2,0x79,0xD3,0x07,0xE8,0xD1,0x92,0x07,0x5A,0xD5,0x00,0xF0,0x7E,0xF8, + 0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71, + 0xFF,0xF7,0x1A,0xF8,0xEB,0xE7,0x31,0x00,0x20,0x00,0xE7,0x71,0xFF,0xF7,0x14,0xF8, + 0x47,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x67,0xF8,0x21,0x7A, + 0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71, + 0x20,0x00,0xFF,0xF7,0x01,0xF8,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20, + 0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28, + 0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79, + 0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xDD,0xFF,0xE6,0x71, + 0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xD1,0xFF,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20, + 0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F, + 0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x60,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x03,0x48,0xC0,0x68,0x40,0x07,0x01,0xD5, + 0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC0,0x68, + 0xC0,0x07,0x00,0xD0,0x01,0x20,0x70,0x47,0x00,0x90,0x00,0x40,0xF0,0xB4,0x16,0x4B, + 0x04,0x00,0xDE,0x7B,0x00,0x22,0x10,0x00,0x00,0x2E,0x23,0xD0,0x1B,0x7A,0x00,0x2B, + 0x20,0xD1,0x12,0x4F,0x1C,0xE0,0xD3,0x00,0xDD,0x19,0x03,0x23,0x5B,0x02,0xEB,0x18, + 0x10,0x25,0x5D,0x5F,0xA5,0x42,0x0E,0xDC,0x14,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB, + 0x12,0x25,0x5D,0x5F,0x8D,0x42,0x06,0xDC,0x16,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB, + 0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E, + 0x96,0x42,0xE0,0xD8,0xF0,0xBC,0x70,0x47,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0x8D,0xB0,0x0A,0x90,0x09,0x90,0xB0,0x48,0xB0,0x4C,0x00,0x68, + 0x01,0x88,0x08,0x91,0x01,0x00,0x40,0x31,0xCA,0x7F,0x60,0x30,0x07,0x92,0x8A,0x7F, + 0x06,0x92,0x40,0x78,0x05,0x90,0x88,0x7D,0xA9,0x49,0x04,0x90,0xE0,0x88,0x09,0x79, + 0x02,0x07,0x04,0xD5,0x00,0x29,0x02,0xD1,0x08,0x22,0x90,0x43,0xE0,0x80,0xA5,0x48, + 0x00,0x22,0x82,0x5E,0xFF,0x23,0x01,0x33,0x0F,0x2A,0x03,0xDD,0x02,0x22,0x82,0x5E, + 0x0F,0x2A,0x03,0xDC,0x04,0x22,0x82,0x5E,0x1E,0x2A,0x04,0xDD,0xE2,0x88,0x1A,0x43, + 0xE2,0x80,0x0A,0x22,0x04,0xE0,0x06,0x22,0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E, + 0xC2,0x80,0x02,0xE0,0xE2,0x88,0x9A,0x43,0xE2,0x80,0x08,0x9A,0x92,0x04,0x7E,0xD5, + 0x40,0x7A,0x00,0x22,0x00,0x28,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x22,0x01,0x92, + 0x00,0xF0,0x30,0xF9,0x20,0x79,0x90,0x4D,0x00,0x28,0x0C,0x90,0x4F,0xD0,0x21,0x89, + 0x8A,0x4A,0x01,0x20,0x0B,0x91,0x16,0x68,0x40,0x36,0x72,0x8B,0x91,0x42,0x00,0xD3, + 0x00,0x20,0x03,0x90,0x0B,0x98,0x0A,0x22,0x02,0x21,0x50,0x43,0x69,0x5E,0x0F,0x00, + 0xFE,0xF7,0x58,0xFD,0x31,0x7C,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20, + 0x02,0x90,0x0B,0x98,0x0A,0x21,0xC0,0x1B,0xFE,0xF7,0x4C,0xFD,0x71,0x7C,0x88,0x42, + 0x01,0xDA,0x01,0x27,0x00,0xE0,0x00,0x27,0x7B,0x4A,0xB3,0x7C,0x20,0x3A,0x92,0x8B, + 0x01,0x20,0x01,0x00,0x9A,0x42,0x00,0xD8,0x00,0x21,0xF3,0x7C,0x6A,0x68,0x9A,0x42, + 0x00,0xDB,0x00,0x20,0x03,0x9A,0x00,0x2A,0x19,0xD0,0x02,0x9A,0x00,0x2A,0x16,0xD0, + 0x00,0x2F,0x14,0xD0,0x00,0x29,0x12,0xD0,0x00,0x28,0x10,0xD0,0x6C,0x48,0xC0,0x30, + 0xC0,0x6A,0x00,0x28,0x0B,0xD1,0x6D,0x48,0x00,0x88,0x1E,0x28,0x07,0xD2,0x68,0x78, + 0x00,0x28,0x1A,0xD0,0x71,0x7E,0x88,0x42,0x17,0xD8,0x40,0x1E,0x14,0xE0,0x63,0x48, + 0x6A,0x68,0x01,0x68,0x40,0x31,0x08,0x7D,0x82,0x42,0x0E,0xDB,0x0C,0x98,0x00,0x28, + 0x0B,0xD0,0xE0,0x88,0xC0,0x06,0x08,0xD4,0x68,0x78,0xC9,0x7D,0x88,0x42,0x04,0xD2, + 0x04,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C,0x68,0x70,0x68,0x78,0x04,0x99,0x10,0x22, + 0x88,0x42,0x0C,0xD8,0x01,0x98,0x00,0x28,0x09,0xD1,0xE0,0x88,0x00,0xE0,0x13,0xE0, + 0x10,0x43,0xE0,0x80,0x51,0x48,0x00,0x68,0x40,0x30,0x00,0x7E,0x0E,0xE0,0xE1,0x88, + 0xC8,0x06,0x0C,0xD5,0x28,0x78,0x00,0x28,0x07,0xD1,0x4C,0x48,0x91,0x43,0xE1,0x80, + 0x00,0x68,0x40,0x30,0x40,0x7D,0x68,0x70,0x01,0xE0,0x40,0x1E,0x28,0x70,0x20,0x79, + 0x00,0x28,0x7E,0xD0,0xE0,0x88,0x80,0x06,0x05,0xD5,0x05,0x99,0x06,0x98,0x40,0x1A, + 0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x50,0x00,0x00,0x19,0x84,0x46,0xFF,0x30, + 0xA1,0x30,0xC0,0x88,0x00,0x28,0x68,0xD0,0x07,0x99,0x88,0x42,0x09,0xD9,0x08,0x98, + 0x80,0x07,0x62,0xD5,0x00,0x20,0x20,0x71,0xE0,0x88,0x08,0x21,0x08,0x43,0xE0,0x80, + 0x5B,0xE0,0x06,0x99,0x88,0x42,0x58,0xD3,0x08,0x98,0x40,0x07,0x55,0xD5,0x00,0x23, + 0x01,0x20,0x29,0xE0,0xFF,0x25,0x21,0x18,0x9A,0x35,0x6D,0x5C,0x95,0x42,0x22,0xD1, + 0x5B,0x1C,0xFF,0x31,0x41,0x31,0x09,0x7E,0x0A,0x91,0x01,0x00,0x14,0xE0,0x4D,0x00, + 0x2D,0x19,0x2E,0x00,0xE0,0x36,0xF7,0x8A,0xFF,0x35,0x01,0x35,0xB7,0x82,0x2F,0x8A, + 0xEF,0x81,0x65,0x18,0x2E,0x00,0xFF,0x36,0x41,0x36,0x77,0x7E,0xFF,0x35,0x81,0x35, + 0x37,0x76,0xAF,0x7E,0x49,0x1C,0x6F,0x76,0x25,0x79,0x8D,0x42,0xE7,0xDA,0x21,0x79, + 0x49,0x1E,0x40,0x1E,0x21,0x71,0x40,0x1C,0x21,0x79,0x81,0x42,0xD2,0xDA,0x00,0x2B, + 0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x09,0x90,0xE0,0x88,0x20,0x21,0x08,0x43, + 0xE0,0x80,0x60,0x46,0xFF,0x30,0x61,0x30,0x41,0x89,0x20,0x79,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x20,0x71,0x40,0x00,0x00,0x19,0xE0,0x30,0x81,0x82,0x60,0x46,0xFF,0x30, + 0x81,0x30,0x41,0x88,0x20,0x79,0x40,0x00,0x00,0x19,0xFF,0x30,0x01,0x30,0xC1,0x81, + 0x23,0x79,0x0C,0x49,0x0A,0x98,0x68,0x39,0x58,0x54,0x52,0x1C,0x0C,0x2A,0x8B,0xDB, + 0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1,0xE0,0x88,0x20,0x21,0x88,0x43, + 0xE0,0x80,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x02,0x00,0x20,0x40,0x06,0x00,0x20,0x1C,0x07,0x00,0x20, + 0x03,0x48,0xC0,0x68,0x00,0x03,0x01,0xD5,0x01,0x20,0x70,0x47,0x00,0x20,0x70,0x47, + 0x00,0x90,0x00,0x40,0xF0,0xB5,0x5C,0x4C,0xB7,0xB0,0x20,0x68,0x5B,0x4E,0x60,0x30, + 0x01,0x79,0x33,0x91,0x40,0x79,0x60,0x21,0x32,0x90,0x00,0x20,0x70,0x80,0x70,0x60, + 0x31,0x90,0x30,0x90,0x18,0xA8,0x03,0xF0,0xF1,0xF8,0x60,0x21,0x68,0x46,0x03,0xF0, + 0xED,0xF8,0x20,0x68,0x71,0x78,0x40,0x30,0xC0,0x7D,0x81,0x42,0x78,0xD0,0x32,0x9D, + 0x0E,0x21,0x48,0x1B,0x34,0x90,0x5D,0xE0,0x33,0x98,0x15,0x22,0x11,0x1A,0x36,0x91, + 0x32,0x99,0x69,0x1A,0x8C,0x00,0x1A,0xE0,0x49,0x4F,0x6A,0x00,0xD2,0x19,0xB8,0x23, + 0xD3,0x5E,0x0E,0x21,0x42,0x00,0x41,0x43,0xD2,0x19,0x88,0x27,0xD7,0x5F,0x49,0x19, + 0x09,0x04,0xDA,0x19,0x43,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E,0x51,0x18,0x31,0x9A, + 0x52,0x18,0x31,0x92,0x18,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51,0x36,0x99, + 0x81,0x42,0xE1,0xDC,0x33,0x98,0x15,0x21,0x40,0x00,0x09,0x1A,0x18,0xAF,0x35,0x90, + 0x38,0x59,0xFE,0xF7,0xEF,0xFB,0x38,0x51,0x33,0x99,0x84,0x46,0x1A,0xE0,0x0E,0x20, + 0x48,0x43,0x34,0x4A,0x40,0x19,0x40,0x00,0x12,0x5E,0x60,0x46,0x30,0x4B,0x12,0x1A, + 0x68,0x00,0xC0,0x18,0xB8,0x23,0xC3,0x5E,0x2D,0x48,0x4F,0x00,0x3F,0x18,0x88,0x20, + 0x38,0x5E,0x18,0x18,0x12,0x18,0x17,0x00,0x57,0x43,0x68,0x46,0x03,0x59,0xDA,0x19, + 0x49,0x1C,0x02,0x51,0x36,0x98,0x88,0x42,0xE1,0xDC,0x35,0x98,0x14,0x21,0x09,0x1A, + 0x6F,0x46,0x38,0x59,0xFE,0xF7,0xC6,0xFB,0x38,0x51,0x30,0x99,0x40,0x18,0x30,0x90, + 0x34,0x98,0x6D,0x1C,0xA8,0x42,0x9F,0xDC,0x33,0x98,0x15,0x21,0x40,0x00,0x09,0x1A, + 0x32,0x98,0x45,0x00,0x0E,0x20,0x44,0x1B,0x61,0x43,0x31,0x98,0xFE,0xF7,0xB2,0xFB, + 0x70,0x80,0x30,0x98,0x21,0x00,0xFE,0xF7,0xAD,0xFB,0x00,0x21,0x6B,0x46,0x09,0xE0, + 0x18,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x17,0x00,0x57,0x43,0x72,0x68,0xBA,0x18, + 0x49,0x1C,0x72,0x60,0x8C,0x42,0xF4,0xDC,0x0D,0x20,0x41,0x1B,0x70,0x68,0xFE,0xF7, + 0x99,0xFB,0x33,0x9A,0x15,0x23,0x34,0x99,0x9A,0x1A,0x92,0x02,0x51,0x43,0xFE,0xF7, + 0x91,0xFB,0x70,0x60,0x02,0x20,0x30,0x5E,0x00,0x28,0x01,0xD1,0x40,0x1C,0x70,0x80, + 0x37,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xD4,0x07,0x00,0x20,0x40,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xFE,0xB5,0x66,0x4C,0x60,0x7A,0x00,0x28, + 0x06,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0xEA,0xF8,0x05,0xF0,0xD8,0xF8, + 0x03,0xF0,0xF0,0xFE,0x04,0xF0,0x10,0xFC,0x5F,0x48,0x01,0x90,0xAB,0xE0,0x5F,0x48, + 0x41,0x68,0x09,0x07,0x0C,0xD5,0xC1,0x68,0x00,0x29,0x09,0xD0,0xC0,0x68,0x07,0x28, + 0x04,0xD1,0x5A,0x48,0xC1,0x68,0xC0,0x03,0xC1,0x63,0xA1,0xE0,0x04,0xF0,0x16,0xF8, + 0x60,0x7A,0x00,0x28,0x04,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0xC8,0xF8, + 0xFF,0x20,0x81,0x30,0xFE,0xF7,0xC2,0xFF,0x03,0x20,0x04,0xF0,0x3D,0xFF,0x50,0x48, + 0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x04,0x20, + 0x00,0xE0,0x02,0x20,0x04,0xF0,0xF6,0xFD,0x00,0xF0,0x3A,0xFC,0x04,0xF0,0xF2,0xFB, + 0x04,0xF0,0xDE,0xFD,0x00,0xF0,0xE6,0xFB,0x00,0xF0,0xBC,0xFC,0xA0,0x7B,0x00,0x28, + 0x05,0xD1,0x01,0x98,0x00,0x7B,0x00,0x28,0x01,0xD0,0x03,0xF0,0xB7,0xFE,0x03,0xF0, + 0x53,0xF8,0x00,0x28,0x01,0xD0,0x01,0x20,0x20,0x70,0x3A,0x48,0x00,0x78,0x00,0x28, + 0x12,0xD1,0x3C,0x4C,0x26,0x6A,0x65,0x6A,0x67,0x6B,0xE0,0x6A,0x00,0x90,0x00,0x20, + 0x04,0xF0,0xD0,0xFD,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x99,0xF9,0x26,0x62, + 0x65,0x62,0x67,0x63,0x00,0x98,0xE0,0x62,0x2E,0x4D,0x28,0x78,0x00,0x28,0x05,0xD0, + 0xA8,0x7B,0x00,0x09,0x04,0x28,0x4B,0xD1,0x00,0x20,0x28,0x70,0x03,0x20,0x04,0xF0, + 0xCD,0xFE,0xE8,0x62,0x03,0x20,0x04,0xF0,0xFB,0xFE,0xFF,0x20,0x81,0x30,0xFE,0xF7, + 0x65,0xFF,0x27,0x49,0xC8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xC8,0x83,0x32,0xE0, + 0xA8,0x79,0x00,0x28,0x2F,0xD1,0x6C,0x6A,0x00,0x2C,0x2C,0xD0,0xE8,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x20,0x49,0xFE,0xF7,0x15,0xFC,0x24,0x1A,0x14,0x2C,0x22,0xDD, + 0x03,0xF0,0x54,0xFE,0x20,0x00,0x05,0xF0,0x61,0xF8,0x05,0xF0,0x65,0xF8,0xE8,0x79, + 0x00,0x28,0x0D,0xD0,0x03,0xF0,0x28,0xFE,0x03,0xF0,0x2B,0xFE,0x03,0xF0,0x33,0xFE, + 0x16,0x4C,0x01,0x20,0x60,0x60,0xFE,0xF7,0x49,0xFF,0x15,0x48,0x60,0x60,0x03,0xE0, + 0x14,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x05,0xF0,0x55,0xF8,0x11,0x49,0x00,0x20, + 0x08,0x70,0x03,0xF0,0x3F,0xFE,0x07,0x4C,0x20,0x78,0x00,0x28,0x00,0xD1,0x4E,0xE7, + 0x04,0x48,0x40,0x7A,0x00,0x28,0x01,0xD0,0x05,0xF0,0x22,0xF8,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x0C,0x07,0x00,0x20,0x80,0x93,0x00,0x00,0x00,0x40,0x00,0x30, + 0x40,0x00,0x00,0x20,0x80,0x90,0x00,0x40,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xD8,0x07,0x00,0x20,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43, + 0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x34,0x33,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x28,0x3C,0xA3,0x52,0x22,0x00,0x1A,0x32, + 0x13,0x54,0x18,0x00,0x76,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E, + 0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xD4,0x0A,0x00,0x20,0x10,0xB5,0x0C,0x48, + 0x0D,0x22,0x00,0x21,0x02,0xF0,0x80,0xFF,0x0A,0x48,0x82,0x22,0x00,0x21,0x02,0xF0, + 0x7B,0xFF,0x08,0x48,0x00,0x24,0x0C,0x38,0x04,0x72,0x07,0x48,0x28,0x22,0x21,0x00, + 0x02,0xF0,0x72,0xFF,0x04,0x48,0x42,0x38,0x44,0x72,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x9F,0x03,0x00,0x20,0x0C,0x02,0x00,0x20,0x82,0x06,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x1A,0x22,0x00,0x21,0x02,0xF0,0x60,0xFF,0x14,0x48,0x1A,0x22,0x00,0x21,0x1A,0x30, + 0x02,0xF0,0x5A,0xFF,0x11,0x48,0x0D,0x22,0x00,0x21,0x64,0x30,0x02,0xF0,0x54,0xFF, + 0x0E,0x48,0x30,0x22,0x00,0x21,0x34,0x30,0x02,0xF0,0x4E,0xFF,0x0B,0x48,0x18,0x22, + 0x00,0x21,0x76,0x30,0x02,0xF0,0x48,0xFF,0x08,0x48,0x18,0x22,0x00,0x21,0x8E,0x30, + 0x02,0xF0,0x42,0xFF,0x05,0x49,0x00,0x20,0xAC,0x31,0xC8,0x83,0xFF,0x39,0xA1,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20, + 0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x09,0x68,0x00,0x24,0x60,0x31,0x8F,0x7F,0x08,0x21, + 0x42,0x00,0x18,0x23,0x4B,0x43,0x9B,0x19,0x1D,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19, + 0xAC,0x80,0x23,0x25,0x6D,0x01,0x5B,0x19,0x49,0x1E,0x9C,0x83,0xF1,0xD5,0x07,0x25, + 0x31,0x18,0xED,0x01,0x01,0x23,0x4D,0x19,0x2B,0x76,0x15,0x25,0x93,0x19,0xAD,0x01, + 0x5B,0x19,0x9C,0x82,0x2B,0x23,0x5B,0x01,0xC9,0x18,0x0F,0x73,0x0C,0x76,0x02,0x21, + 0x0B,0x23,0xDB,0x01,0x18,0x25,0x4D,0x43,0xAD,0x19,0xAD,0x18,0xED,0x18,0x49,0x1E, + 0xAC,0x80,0xF7,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x17,0x20,0xC9,0x43,0x80,0x01, + 0x10,0x18,0x81,0x81,0xC1,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00,0xD4,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48,0x1E,0x22,0x00,0x21,0x02,0xF0,0xEC,0xFE, + 0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBA,0x03,0x00,0x20,0x20,0x01,0x00,0x20,0x10,0xB5,0x04,0xF0,0xFF,0xFD,0x03,0xF0, + 0xD3,0xFD,0xFF,0xF7,0x53,0xFF,0x03,0xF0,0xDF,0xFE,0x01,0xF0,0x6B,0xFD,0x01,0xF0, + 0xE3,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x24,0x20,0x9F,0xE5, + 0x00,0x00,0x92,0xE5,0x20,0x30,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2, + 0x00,0x11,0x92,0xE7,0x80,0xC0,0x83,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xCC,0xE1, + 0xFA,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xDA,0x07,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x20,0x30,0x9F,0xE5,0x20,0x20,0x9F,0xE5,0x25,0x00,0xA0,0xE3, + 0x01,0x0C,0x80,0xE2,0x00,0x11,0x93,0xE7,0x80,0xC0,0x82,0xE0,0x01,0x00,0x50,0xE2, + 0xB0,0x10,0xCC,0xE1,0xFA,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40, + 0x00,0x00,0x00,0x10,0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33,0x1B,0x7B,0x04,0x1E, + 0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0, + 0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0xD4,0x07,0x00,0x20, + 0xF7,0xB5,0x60,0x48,0xE6,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0,0x01,0x20,0x62,0x90, + 0x00,0x20,0x02,0xE0,0x00,0x20,0x62,0x90,0x01,0x20,0x61,0x90,0x5A,0x48,0x00,0x26, + 0x64,0x90,0x5A,0x48,0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A, + 0x02,0x91,0xC1,0x8A,0x01,0x91,0x80,0x8B,0x60,0x90,0x55,0x48,0x00,0x7F,0x63,0x96, + 0x00,0x90,0x00,0x24,0x0E,0x20,0x68,0x43,0x65,0x90,0x07,0x19,0x21,0x00,0x28,0x00, + 0x01,0xF0,0x36,0xF9,0x4B,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4D,0x4A, + 0x52,0x79,0x00,0x2A,0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42, + 0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E, + 0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1, + 0x8A,0x7D,0xAA,0x42,0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42, + 0x05,0xD0,0x4A,0x7E,0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99, + 0x03,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18, + 0x09,0x04,0x09,0x0C,0x80,0x1A,0x64,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0x67,0x9B, + 0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D, + 0x66,0x9B,0x05,0x2B,0x0E,0xD8,0x90,0x42,0x01,0xDA,0x62,0x9A,0x02,0xE0,0x88,0x42, + 0x0E,0xDD,0x61,0x9A,0x21,0x00,0x28,0x00,0x00,0xF0,0x84,0xF8,0x05,0xA8,0x87,0x55, + 0x76,0x1C,0x05,0xE0,0x63,0x99,0x05,0xA8,0x47,0x54,0x63,0x98,0x40,0x1C,0x63,0x90, + 0x64,0x1C,0x0E,0x2C,0x01,0xDA,0x65,0x98,0x97,0xE7,0x6D,0x1C,0x15,0x2D,0x90,0xDB, + 0x66,0x98,0x05,0x28,0x03,0xD9,0x00,0x04,0x63,0x9E,0x00,0x0C,0x60,0x90,0x00,0x2E, + 0x24,0xDD,0x68,0x98,0x00,0x28,0x21,0xD1,0x00,0xF0,0x48,0xF9,0x00,0xF0,0x8A,0xF9, + 0x00,0xF0,0x60,0xFA,0x10,0x4B,0x76,0x1E,0x12,0xD4,0x13,0x4D,0x05,0xAC,0xA0,0x5D, + 0x81,0x00,0x58,0x58,0x02,0x05,0x60,0x98,0x12,0x0D,0x10,0x18,0x00,0x04,0x00,0x0C, + 0xA8,0x42,0x00,0xD9,0x28,0x00,0x00,0x04,0x10,0x43,0x76,0x1E,0x58,0x50,0xEE,0xD5, + 0x00,0xF0,0x2C,0xF9,0x00,0xF0,0x6E,0xF9,0x00,0xF0,0x44,0xFA,0x69,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00, + 0x60,0x06,0x00,0x20,0x0C,0x07,0x00,0x20,0xFF,0x0F,0x00,0x00,0x7F,0xB5,0x01,0x25, + 0x6D,0x07,0x28,0x68,0x02,0x28,0x27,0xD1,0xAC,0x68,0x01,0xAA,0x20,0x05,0x00,0x0D, + 0x02,0x90,0x20,0x02,0x00,0x0D,0x03,0x90,0x02,0xA9,0x03,0xA8,0x6B,0x46,0x03,0xF0, + 0x1D,0xFF,0x40,0x1C,0x18,0xD0,0x01,0x98,0x03,0x99,0x40,0x00,0x40,0x18,0x03,0x21, + 0xFE,0xF7,0xC0,0xF9,0x00,0x05,0x06,0x0A,0x09,0x48,0x02,0x99,0x04,0x40,0x00,0x98, + 0x26,0x43,0x40,0x00,0x40,0x18,0x03,0x21,0xFE,0xF7,0xB4,0xF9,0x00,0x05,0x00,0x0D, + 0x31,0x0B,0x09,0x03,0x08,0x43,0xA8,0x60,0x7F,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xFF,0x0F,0x00,0xFF,0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00, + 0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0, + 0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0, + 0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD, + 0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A, + 0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0xF0,0xB5,0x8B,0xB0,0x0E,0x27,0x15,0x20,0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48, + 0x53,0x49,0x0A,0x90,0x80,0x7B,0x09,0x91,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5, + 0x0D,0x20,0x03,0x21,0x05,0x90,0x02,0xE0,0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98, + 0x01,0x76,0x4C,0x48,0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04, + 0x00,0x0C,0x01,0x90,0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98, + 0x00,0x28,0x7F,0xD0,0x05,0x98,0x41,0x00,0x30,0x00,0xFE,0xF7,0x1B,0xF8,0x05,0x04, + 0x2D,0x0C,0x00,0x24,0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43,0x05,0x99,0xFE,0xF7, + 0x11,0xF8,0x3D,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42, + 0xF2,0xDB,0x04,0x98,0x41,0x00,0x01,0x98,0xFE,0xF7,0x04,0xF8,0x06,0x9F,0x06,0x04, + 0x36,0x0C,0x00,0x24,0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7, + 0xF9,0xFF,0x31,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82, + 0xBC,0x42,0xF1,0xDB,0x0A,0x98,0x80,0x7B,0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0, + 0x29,0x4A,0x31,0x21,0x10,0x19,0x49,0x01,0x40,0x18,0x41,0x7F,0x0A,0x98,0x80,0x7B, + 0x80,0x07,0x03,0xD5,0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99, + 0x02,0x96,0x03,0x91,0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21, + 0x40,0x1B,0xFD,0xF7,0xCF,0xFF,0x1C,0x4A,0xE1,0x00,0x89,0x18,0x03,0x22,0x52,0x02, + 0x8F,0x18,0x38,0x82,0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90, + 0x80,0x8A,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xBD,0xFF,0x78,0x82,0x08,0x98,0x0A,0x21, + 0x00,0x8C,0x40,0x19,0xFE,0xF7,0xE6,0xF8,0xB8,0x82,0x07,0x98,0x0A,0x21,0x80,0x8A, + 0x80,0x19,0xFE,0xF7,0xDF,0xF8,0xF8,0x82,0x02,0x98,0x0A,0x21,0x40,0x00,0xFE,0xF7, + 0xD9,0xF8,0x09,0x99,0x64,0x1C,0x48,0x83,0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x7B, + 0xA0,0x42,0xB5,0xDC,0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x06,0x00,0x20, + 0x60,0x06,0x00,0x20,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68, + 0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68, + 0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0x49,0x08,0x49,0x00,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0xFF,0x20,0x06,0x49, + 0x06,0x4A,0x6A,0x30,0x03,0xE0,0x0B,0x88,0x13,0x80,0x92,0x1C,0x09,0x1D,0x03,0x00, + 0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40,0xD2,0x02,0x00,0x10, + 0xFF,0x20,0x06,0x49,0x06,0x4A,0x6A,0x30,0x03,0xE0,0x13,0x88,0x92,0x1C,0x0B,0x80, + 0x09,0x1D,0x03,0x00,0x40,0x1E,0x00,0x2B,0xF7,0xDC,0x70,0x47,0xD6,0x02,0x10,0x40, + 0xD2,0x02,0x00,0x10,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x04,0x49,0x40,0x22,0x00,0x28,0x48,0x6A,0x01,0xD0,0x10,0x43,0x00,0xE0,0x90,0x43, + 0x48,0x62,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48, + 0x92,0x00,0x02,0xF0,0x27,0xFC,0x07,0x48,0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43, + 0x06,0x48,0x02,0xF0,0x41,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00, + 0x00,0x00,0x10,0x40,0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x06,0x49,0x00,0x28,0x08,0x69,0x03,0xD0,0x13,0x22,0x12,0x06,0x10,0x43,0x02,0xE0, + 0x03,0x22,0x12,0x06,0x90,0x43,0x08,0x61,0x70,0x47,0x00,0x00,0x40,0xA1,0x00,0x40, + 0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40, + 0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40, + 0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22,0x02,0xF0,0xEC,0xFB,0xFF,0x22,0x09,0x49, + 0x09,0x48,0xF1,0x32,0x02,0xF0,0xE6,0xFB,0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00, + 0x02,0xF0,0xE0,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00, + 0x04,0x90,0x00,0x40,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x04,0x49,0x02,0x22,0x00,0x28,0x08,0x68,0x01,0xD0,0x10,0x43, + 0x00,0xE0,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xF9,0xFF,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0xFB,0xFF,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xEA,0xFF,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xEC,0xFF,0x0C,0x48,0x6D,0x00,0x04,0x04,0x24,0x0C, + 0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xDB,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00, + 0x00,0x23,0xFD,0xF7,0xDD,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0x00,0x96,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7, + 0x97,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x51,0x48, + 0x82,0xB0,0x00,0x68,0x50,0x4E,0x60,0x30,0x81,0x8A,0x37,0x00,0x00,0x25,0x01,0x91, + 0x80,0x7D,0x01,0x24,0xFF,0x37,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0xC1,0x37, + 0x00,0x90,0x12,0xE0,0x0A,0x20,0x60,0x43,0x0B,0x21,0x80,0x19,0x89,0x01,0x41,0x18, + 0x09,0x7C,0x00,0x29,0x08,0xD0,0x45,0x49,0x40,0x18,0x01,0xF0,0x27,0xF9,0x00,0x28, + 0x02,0xD0,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x7A,0xA0,0x42,0xE9,0xDA, + 0x3F,0x48,0x03,0x89,0x81,0x89,0x5A,0x1A,0x00,0x2A,0x00,0xDC,0xCA,0x1A,0x41,0x89, + 0xC3,0x89,0x12,0x04,0x12,0x0C,0xCC,0x1A,0x00,0x2C,0x00,0xDC,0x5C,0x1A,0x01,0x7D, + 0x23,0x04,0x1B,0x0C,0x00,0x29,0x04,0xD0,0xC1,0x7D,0xC8,0x29,0x01,0xD2,0x49,0x1C, + 0xC1,0x75,0x33,0x49,0x20,0x39,0x8C,0x7E,0x14,0x2C,0x04,0xD2,0x0C,0x7F,0x00,0x2C, + 0x01,0xD0,0x01,0x24,0x4C,0x77,0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7E, + 0xC8,0x2C,0x01,0xD2,0x64,0x1C,0xCC,0x76,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2, + 0x14,0x2B,0x05,0xD2,0x12,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0, + 0x12,0x24,0x04,0x5F,0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x44,0x82,0xC4,0x7D,0x01,0x2C, + 0x01,0xD9,0x78,0x21,0x10,0xE0,0x02,0x2D,0x0F,0xD2,0x12,0x24,0x04,0x5F,0x02,0x2C, + 0x0B,0xDD,0xC9,0x7E,0x14,0x29,0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B, + 0x8B,0x2B,0x02,0xD2,0x77,0x21,0xC9,0x43,0x01,0x82,0x00,0x21,0x02,0x2D,0x81,0x75, + 0x0E,0xD2,0x10,0x21,0x41,0x5E,0x78,0x31,0x04,0xD1,0x41,0x7D,0xC8,0x29,0x01,0xD2, + 0x49,0x1C,0x41,0x75,0x41,0x7D,0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x81,0x75, + 0x10,0x21,0x41,0x5E,0x01,0x98,0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29, + 0x05,0xD1,0x31,0x79,0x01,0x29,0x02,0xD0,0x00,0x99,0xFD,0xF7,0xCB,0xFD,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0xD4,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0xD6,0x02,0x00,0x00, + 0xC0,0x03,0x00,0x20,0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1, + 0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x11,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A, + 0x1E,0xFF,0x2F,0xE1,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47, + 0x00,0x70,0x00,0x40,0x70,0x47,0x00,0x00,0x10,0xB5,0xFF,0xF7,0x4B,0xFE,0x04,0x49, + 0x08,0x68,0x06,0x22,0x90,0x43,0x08,0x60,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x90,0x00,0x40,0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06, + 0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0, + 0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0, + 0x35,0xFA,0x09,0x48,0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43, + 0x82,0x60,0x06,0x48,0x40,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0xD1,0xFA,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x0C,0x07,0x00,0x20, + 0xF1,0xB5,0x61,0x48,0x2E,0x21,0x90,0xB0,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4, + 0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63,0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07, + 0xFB,0xD5,0x03,0xF0,0x0B,0xFA,0x59,0x4D,0x68,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0, + 0xB7,0xFA,0x10,0x9B,0x00,0x21,0x01,0x20,0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03, + 0x04,0xF0,0x02,0xFB,0x1E,0x16,0x40,0x40,0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40, + 0x40,0x58,0x40,0x68,0x4F,0x6F,0x76,0x7D,0x40,0x84,0x40,0x8B,0x92,0x4F,0x40,0x40, + 0x40,0x40,0x99,0x40,0x0B,0x20,0xF0,0x63,0x4D,0xE0,0x00,0xF0,0x24,0xF9,0x29,0xE0, + 0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x99,0xF9,0x00,0xF0,0x2B,0xFE,0x44,0x48, + 0x44,0x4A,0x41,0x68,0x52,0x68,0x91,0x42,0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B, + 0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83,0xFD,0xF7,0x7C,0xFA,0xA8,0x78,0xC0,0x07, + 0x01,0xD0,0xFF,0xF7,0x55,0xFE,0xA8,0x78,0x80,0x07,0x01,0xD5,0x04,0xF0,0x2E,0xFA, + 0x3A,0x49,0x40,0x22,0x68,0x46,0x02,0xF0,0xFD,0xF9,0x01,0x20,0x08,0x90,0x68,0x46, + 0x04,0xF0,0x3C,0xFA,0xF7,0x63,0x1E,0xE0,0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28, + 0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x04,0xF0,0x0E,0xF8, + 0xF0,0xE7,0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x60,0xF9,0x10,0x98,0xFE,0xF7, + 0xB1,0xF8,0x08,0xE0,0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x57,0xF9,0x00,0xF0, + 0x5D,0xFD,0x00,0xF0,0xF3,0xF8,0x20,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x71,0xD2,0xE7,0xA9,0x71, + 0xD0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x71,0xCB,0xE7,0xE9,0x71,0xC9,0xE7, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x72,0xC4,0xE7,0x29,0x72,0xC2,0xE7,0x00,0x2C, + 0x02,0xD0,0x01,0x20,0x68,0x72,0xBD,0xE7,0x69,0x72,0xBB,0xE7,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xE8,0x72,0xB6,0xE7,0xE9,0x72,0xB4,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0x28,0x73,0xAF,0xE7,0x29,0x73,0xAD,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x73, + 0xA8,0xE7,0x69,0x73,0xA6,0xE7,0x00,0x2C,0x01,0xD0,0xAC,0x73,0x00,0xE0,0xA9,0x73, + 0x03,0xF0,0x1A,0xFE,0x9E,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0x0C,0x07,0x00,0x20, + 0x00,0x00,0x00,0x10,0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xF0,0xB5,0x34,0x4C,0x30,0x38,0x34,0x4A,0x34,0x4E,0x35,0x4F,0x35,0x49,0x25,0x68, + 0x03,0x00,0x04,0xF0,0x49,0xFA,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E, + 0x20,0x30,0x3B,0x16,0x3E,0x43,0x47,0x4D,0x50,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68, + 0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04, + 0x34,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68, + 0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48,0x03,0x7F,0x10,0x7D,0x52,0x7D,0xC4,0x07, + 0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43, + 0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D, + 0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06, + 0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7,0x38,0x69,0x40,0x08, + 0x00,0x02,0xC8,0xE7,0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43,0xC2,0xE7, + 0x38,0x69,0x40,0x08,0xBF,0xE7,0x10,0x48,0x80,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42, + 0xFC,0xD1,0x03,0xF0,0xEB,0xF8,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xC0,0x92,0x00,0x00,0x00,0x93,0x00,0x00,0x15,0x00,0x0E,0x00, + 0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20,0x60,0x06,0x00,0x20, + 0x00,0x96,0x00,0x00,0xE0,0x95,0x00,0x00,0x0C,0x07,0x00,0x20,0x10,0xB5,0x00,0x20, + 0xFF,0xF7,0xC6,0xFC,0x01,0x20,0xFF,0xF7,0x35,0xFD,0x01,0x20,0xFF,0xF7,0xF0,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20, + 0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x90,0xF8,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFE,0xF7, + 0x6D,0xF8,0x02,0xF0,0x77,0xFF,0x00,0xF0,0x9B,0xFC,0x02,0xF0,0x67,0xFF,0x30,0x00, + 0xFE,0xF7,0x96,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21, + 0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x02,0xF0,0x64,0xFF,0xFF,0xF7,0x20,0xFD, + 0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x04,0xF0,0x88,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x23,0x48, + 0x00,0x68,0x00,0x88,0xC0,0x06,0x3E,0xD5,0x21,0x4E,0x30,0x7A,0x00,0x28,0x3A,0xD0, + 0x70,0x7A,0x00,0x28,0x37,0xD0,0x01,0x25,0x32,0xE0,0x71,0x7A,0x1D,0x4F,0x09,0x23, + 0x8C,0x46,0x0A,0x21,0x69,0x43,0xCC,0x19,0x01,0x20,0x9B,0x01,0xFF,0x34,0xC1,0x34, + 0x23,0xE0,0x0A,0x22,0x42,0x43,0xD2,0x19,0xD2,0x18,0x21,0x7B,0x92,0x7B,0x91,0x42, + 0x1A,0xD1,0x0A,0x22,0x50,0x43,0xC0,0x19,0xC7,0x18,0x0E,0x21,0x10,0x20,0x61,0x5E, + 0x38,0x5E,0x12,0x22,0xBA,0x5E,0x08,0x1A,0x10,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91, + 0x3A,0x8A,0xE1,0x89,0xFF,0xF7,0x0E,0xFA,0xE0,0x81,0x7A,0x8A,0x21,0x8A,0x00,0x98, + 0xFF,0xF7,0x08,0xFA,0x20,0x82,0x02,0xE0,0x40,0x1C,0x84,0x45,0xD9,0xDA,0x6D,0x1C, + 0x30,0x7A,0xA8,0x42,0xC9,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xD4,0x07,0x00,0x20, + 0x00,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20,0xB1,0xB0,0x10,0x90, + 0x0F,0x90,0x0E,0x90,0x0D,0x90,0xFC,0x48,0x01,0x8C,0x0A,0x91,0x40,0x8C,0x09,0x90, + 0xFA,0x48,0x02,0x68,0x13,0x00,0x60,0x33,0x59,0x7F,0x18,0x7F,0x08,0x91,0x11,0x00, + 0x80,0x31,0x8C,0x7A,0x07,0x94,0x4C,0x7A,0x06,0x94,0x12,0x88,0x12,0x07,0x24,0xD5, + 0xDA,0x7F,0x42,0x43,0x24,0x92,0x0A,0x78,0x42,0x43,0x23,0x92,0x4A,0x78,0x42,0x43, + 0x22,0x92,0x8A,0x78,0x42,0x43,0x21,0x92,0xCA,0x78,0x42,0x43,0x20,0x92,0x0A,0x79, + 0x42,0x43,0x1F,0x92,0x4A,0x79,0x42,0x43,0x1E,0x92,0x8A,0x79,0x42,0x43,0x1D,0x92, + 0xCA,0x79,0x42,0x43,0x1C,0x92,0x09,0x7A,0x41,0x43,0xE5,0x48,0x1B,0x91,0x30,0x90, + 0x00,0x7A,0x00,0x28,0x05,0xD1,0x00,0xF0,0xE5,0xFE,0x31,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x20,0x25,0x90,0xDE,0x48,0xE0,0x38,0x2F,0x90,0xDD,0x48,0x2E,0x90, + 0xDD,0x4D,0x25,0x98,0x1B,0x21,0x28,0x18,0x49,0x01,0x2D,0x90,0x40,0x18,0x04,0x78, + 0x00,0x2C,0x0F,0xD0,0x07,0x98,0x00,0x28,0x08,0xD1,0x0A,0x20,0x60,0x43,0x40,0x19, + 0xFF,0x30,0xD3,0x30,0x00,0xF0,0x02,0xFE,0x00,0x28,0x03,0xD0,0x2E,0x98,0x80,0x7D, + 0x00,0x28,0x03,0xD0,0x25,0x98,0xFF,0xF7,0xF3,0xF8,0xC2,0xE2,0x25,0x99,0x1D,0x27, + 0x07,0x20,0x7F,0x01,0x4E,0x00,0x18,0x21,0x41,0x43,0x49,0x19,0x89,0x19,0xCA,0x19, + 0x93,0x88,0x93,0x83,0x23,0x22,0x52,0x01,0x8A,0x18,0x09,0x23,0x92,0x8B,0xDB,0x01, + 0xC9,0x18,0x40,0x1E,0x8A,0x82,0xEE,0xD5,0x0A,0x20,0x44,0x43,0x65,0x19,0x2C,0x95, + 0xFF,0x35,0xC1,0x35,0xEA,0x89,0x0A,0x98,0x40,0x1E,0x82,0x42,0xDD,0xDC,0x2A,0x8A, + 0x09,0x98,0x40,0x1E,0x82,0x42,0xD8,0xDC,0xBB,0x48,0xE9,0x89,0x34,0x18,0xE0,0x19, + 0x2B,0x90,0x23,0x23,0x81,0x80,0x5B,0x01,0x29,0x8A,0xE0,0x18,0x2A,0x90,0x81,0x83, + 0x00,0x20,0x01,0x22,0xD2,0x02,0x01,0x00,0x05,0x90,0x07,0x20,0x04,0x92,0x18,0x23, + 0x43,0x43,0xB1,0x4F,0xDB,0x19,0x9B,0x19,0x1D,0x27,0x7F,0x01,0xDF,0x19,0x29,0x93, + 0x04,0x23,0xFB,0x5E,0xBC,0x46,0x00,0x2B,0x0B,0xDD,0x05,0x9F,0xBB,0x42,0x02,0xDD, + 0x67,0x46,0xBF,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x02,0xDA,0x63,0x46,0x9B,0x88, + 0x04,0x93,0x29,0x9B,0x23,0x27,0x7F,0x01,0xDF,0x19,0x1C,0x23,0xFB,0x5E,0x00,0x2B, + 0x05,0xDD,0x8B,0x42,0x00,0xDD,0xB9,0x8B,0x93,0x42,0x00,0xDA,0xBA,0x8B,0x40,0x1E, + 0xD5,0xD5,0x04,0x9B,0x05,0x98,0xC0,0x1A,0xF0,0x28,0x02,0xDC,0x8B,0x1A,0xF0,0x2B, + 0x02,0xDD,0x2E,0x9F,0x01,0x23,0x3B,0x75,0x1E,0x28,0x04,0xDA,0x88,0x1A,0x1E,0x28, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x2F,0x99,0x48,0x74,0x2D,0x98,0x07,0x21, + 0xC9,0x01,0x40,0x18,0x28,0x90,0x00,0x7E,0x01,0x28,0x1C,0xD9,0x2B,0x99,0x04,0x20, + 0x08,0x5E,0x0A,0x00,0x1C,0x21,0x51,0x5E,0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A, + 0x10,0x04,0x00,0x14,0x0C,0x90,0x2A,0x98,0x1C,0x21,0x41,0x5E,0x09,0x20,0xC0,0x01, + 0x20,0x18,0x14,0x22,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A,0x00,0x04, + 0x00,0x14,0x0B,0x90,0x02,0xE0,0x64,0x20,0x0B,0x90,0x0C,0x90,0x2B,0x98,0x1C,0x21, + 0x41,0x5E,0x02,0x00,0x04,0x20,0x10,0x5E,0x02,0xF0,0x48,0xFF,0x12,0x90,0x09,0x20, + 0xC0,0x01,0x20,0x18,0x14,0x21,0x41,0x5E,0x2A,0x9A,0x1C,0x20,0x10,0x5E,0x02,0xF0, + 0x3D,0xFF,0x11,0x90,0x0F,0x20,0x80,0x01,0x20,0x18,0x14,0x21,0x41,0x5E,0x12,0x98, + 0x02,0xF0,0x34,0xFF,0x14,0x90,0x25,0x20,0x40,0x01,0x20,0x18,0x0C,0x21,0x41,0x5E, + 0x11,0x98,0x02,0xF0,0x2B,0xFF,0x13,0x90,0x01,0x20,0x80,0x02,0x27,0x18,0x1F,0x20, + 0x40,0x01,0x20,0x18,0x0C,0x21,0x41,0x5E,0x04,0x22,0xBA,0x5E,0x14,0x98,0x02,0xF0, + 0x1F,0xFF,0x00,0x04,0x00,0x14,0x16,0x90,0x13,0x20,0x80,0x01,0x20,0x18,0x1C,0x22, + 0x04,0x21,0x82,0x5E,0x41,0x5E,0x13,0x98,0x02,0xF0,0x12,0xFF,0x00,0x04,0x00,0x14, + 0x15,0x90,0x21,0x20,0x40,0x01,0x20,0x18,0x14,0x22,0x82,0x5E,0x1C,0x21,0x79,0x5E, + 0x16,0x98,0x02,0xF0,0x05,0xFF,0x00,0x04,0x00,0x14,0x18,0x90,0x05,0x20,0x00,0x02, + 0x20,0x18,0x0C,0x22,0x82,0x5E,0x27,0x20,0x40,0x01,0x20,0x18,0x14,0x21,0x41,0x5E, + 0x15,0x98,0x02,0xF0,0xF5,0xFE,0x00,0x04,0x00,0x14,0x17,0x90,0x2A,0x98,0x04,0x22, + 0x82,0x5E,0x11,0x20,0x80,0x01,0x20,0x18,0x0C,0x21,0x41,0x5E,0x18,0x98,0x02,0xF0, + 0xE7,0xFE,0x00,0x04,0x00,0x14,0x1A,0x90,0x29,0x20,0x40,0x01,0x20,0x18,0x1C,0x22, + 0x04,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x02,0xF0,0xDA,0xFE,0x00,0x04,0x00,0x14, + 0x19,0x90,0x0B,0x99,0x0C,0x98,0x00,0xF0,0x2D,0xFF,0x3F,0x4F,0x01,0x21,0x18,0x22, + 0x4A,0x43,0xD2,0x19,0x0B,0x23,0x92,0x19,0xDB,0x01,0xD2,0x18,0x93,0x88,0x49,0x1E, + 0x93,0x83,0xF4,0xD5,0x0B,0x21,0xC9,0x01,0x61,0x18,0x88,0x80,0x2D,0x9A,0x2B,0x21, + 0x49,0x01,0x57,0x18,0x3A,0x7E,0x00,0x20,0x00,0x2A,0x94,0x46,0x0D,0xDB,0x18,0x21, + 0x13,0x00,0x4B,0x43,0x30,0x49,0x59,0x18,0x8B,0x19,0x0B,0x21,0xC9,0x01,0x5B,0x18, + 0x04,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF1,0xD5,0x61,0x46,0x49,0x1C,0xFD,0xF7, + 0xD1,0xF9,0x23,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0,0x21,0x98, + 0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC,0x03,0x20, + 0x05,0xE0,0x1D,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20,0x39,0x7B, + 0x40,0x1A,0x08,0x99,0x49,0x42,0x00,0x28,0x0B,0xDD,0x15,0x20,0x80,0x01,0x20,0x18, + 0x14,0x22,0x82,0x5E,0x08,0x9B,0x9A,0x42,0x01,0xD1,0x00,0x22,0x0A,0xE0,0x52,0x1C, + 0x08,0xE0,0x00,0x28,0x15,0x48,0x07,0xDA,0x20,0x18,0x14,0x22,0x82,0x5E,0x8A,0x42, + 0xF3,0xD0,0x52,0x1E,0x82,0x82,0x0A,0xE0,0x22,0x18,0x14,0x20,0x10,0x5E,0x00,0x28, + 0x01,0xDD,0x40,0x1E,0x02,0xE0,0x00,0x28,0x01,0xDA,0x40,0x1C,0x90,0x82,0x0B,0x48, + 0x22,0x18,0x14,0x20,0x10,0x5E,0x08,0x9A,0x90,0x42,0x11,0xD1,0x3A,0x7B,0x05,0x2A, + 0x0E,0xD2,0x52,0x1C,0x3A,0x73,0x12,0xE0,0x00,0x93,0x00,0x00,0xD4,0x07,0x00,0x20, + 0x00,0x02,0x00,0x20,0xC0,0x03,0x00,0x20,0x40,0x00,0x00,0x20,0x40,0x05,0x00,0x00, + 0x88,0x42,0x04,0xD1,0x38,0x7B,0x01,0x28,0x01,0xD9,0x40,0x1E,0x38,0x73,0x28,0x98, + 0x1A,0x9A,0x00,0x7E,0x19,0x9C,0x01,0x00,0x27,0x90,0x26,0x90,0x10,0x00,0xFD,0xF7, + 0x69,0xF9,0x10,0x90,0x0E,0x90,0x26,0x99,0x20,0x00,0xFD,0xF7,0x63,0xF9,0x0F,0x90, + 0x0D,0x90,0x38,0x7B,0x01,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3, + 0x19,0x9B,0x1A,0x9A,0x27,0x98,0x09,0x21,0x03,0xF0,0xF0,0xFA,0x0F,0xAA,0x10,0xA9, + 0x68,0x46,0x06,0xC0,0x28,0x98,0x17,0x9B,0x00,0x7E,0x18,0x9A,0x07,0x21,0x03,0xF0, + 0xE5,0xFA,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E, + 0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x00,0x92,0xFF,0x30, + 0x23,0x9B,0x24,0x9A,0xCD,0x30,0x9B,0xE0,0x02,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9, + 0x6B,0x46,0x06,0xC3,0x17,0x9B,0x18,0x9A,0x27,0x98,0x07,0x21,0x03,0xF0,0xC6,0xFA, + 0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x15,0x9B,0x00,0x7E,0x16,0x9A, + 0x05,0x21,0x03,0xF0,0xBB,0xFA,0x3C,0x20,0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E, + 0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98, + 0x21,0x9B,0xFF,0x30,0x00,0x92,0x22,0x9A,0xCD,0x30,0x71,0xE0,0x03,0x28,0x27,0xD1, + 0x0D,0xAA,0x0E,0xA9,0x6B,0x46,0x06,0xC3,0x15,0x9B,0x16,0x9A,0x27,0x98,0x05,0x21, + 0x03,0xF0,0x9C,0xFA,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x28,0x98,0x13,0x9B, + 0x00,0x7E,0x14,0x9A,0x03,0x21,0x03,0xF0,0x91,0xFA,0x3C,0x20,0x6B,0x46,0x18,0x5E, + 0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4,0x00,0x22,0x10,0xAB, + 0x9A,0x5E,0x2C,0x98,0x1F,0x9B,0xFF,0x30,0x00,0x92,0x20,0x9A,0xCD,0x30,0x47,0xE0, + 0x04,0x28,0x27,0xD1,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0,0x13,0x9B,0x14,0x9A, + 0x27,0x98,0x03,0x21,0x03,0xF0,0x72,0xFA,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0, + 0x28,0x98,0x11,0x9B,0x00,0x7E,0x12,0x9A,0x02,0x21,0x03,0xF0,0x67,0xFA,0x3C,0x20, + 0x6B,0x46,0x18,0x5E,0x38,0x21,0x59,0x5E,0x34,0x22,0x9A,0x5E,0x01,0xAC,0x07,0xC4, + 0x00,0x22,0x10,0xAB,0x9A,0x5E,0x2C,0x98,0x1D,0x9B,0xFF,0x30,0x00,0x92,0x1E,0x9A, + 0xCD,0x30,0x1D,0xE0,0x0F,0xAA,0x10,0xA9,0x68,0x46,0x06,0xC0,0x11,0x9B,0x12,0x9A, + 0x27,0x98,0x02,0x21,0x03,0xF0,0x4A,0xFA,0x3C,0x22,0x6B,0x46,0x9A,0x5E,0x00,0x21, + 0x10,0xAB,0x59,0x5E,0x2A,0x9B,0x1C,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3,0x2B,0x98, + 0x04,0x22,0x82,0x5E,0x2C,0x98,0x1B,0x9B,0x00,0x92,0x1C,0x9A,0xFF,0x30,0xCD,0x30, + 0x31,0x00,0x03,0xF0,0x47,0xFA,0x28,0x98,0x3B,0x49,0x00,0x7E,0x09,0x28,0x02,0xD2, + 0x28,0x9A,0x40,0x1C,0x10,0x76,0x38,0x7E,0x02,0x28,0x01,0xD2,0x40,0x1C,0x38,0x76, + 0x28,0x7B,0x40,0x1E,0x80,0x00,0x41,0x18,0x17,0x20,0x80,0x01,0x0C,0x18,0x0C,0x20, + 0x20,0x5E,0x00,0x28,0x21,0xDB,0x0E,0x21,0x61,0x5E,0x00,0x29,0x1D,0xDB,0x06,0x9A, + 0x64,0x21,0x8E,0x1A,0x70,0x43,0xFD,0xF7,0x75,0xF8,0x07,0x00,0xE8,0x89,0x06,0x99, + 0x48,0x43,0x64,0x21,0xFD,0xF7,0x9E,0xF9,0x38,0x18,0xE8,0x81,0x0E,0x20,0x20,0x5E, + 0x64,0x21,0x70,0x43,0xFD,0xF7,0x66,0xF8,0x06,0x00,0x28,0x8A,0x06,0x99,0x48,0x43, + 0x64,0x21,0xFD,0xF7,0x8F,0xF9,0x30,0x18,0x28,0x82,0xE8,0x89,0xA0,0x81,0x28,0x8A, + 0xE0,0x81,0x25,0x98,0x40,0x1C,0x0C,0x28,0x25,0x90,0x00,0xDA,0x18,0xE5,0x30,0x98, + 0x01,0x7A,0x00,0x29,0x00,0xD1,0x08,0xE5,0x80,0x7D,0x2E,0x9C,0x42,0x00,0x16,0x48, + 0x10,0x18,0x1D,0x22,0x52,0x01,0x82,0x18,0x53,0x88,0x23,0x81,0x23,0x23,0x5B,0x01, + 0xC3,0x18,0x5B,0x8B,0x2E,0x9C,0x63,0x81,0x53,0x8B,0x2E,0x9A,0x93,0x81,0x09,0x22, + 0xD2,0x01,0x80,0x18,0x42,0x8A,0x2E,0x98,0x02,0x29,0xC2,0x81,0x30,0x98,0x2E,0x9A, + 0x00,0x8B,0x10,0x80,0x30,0x9A,0x2E,0x9B,0x52,0x8B,0x5A,0x80,0xDB,0xD1,0x2E,0x99, + 0x08,0x80,0x2E,0x98,0x42,0x80,0x05,0x48,0x2E,0x99,0x42,0x88,0x8A,0x80,0x81,0x88, + 0x2E,0x98,0xC1,0x80,0xD9,0xE4,0x00,0x00,0x40,0x00,0x00,0x20,0x20,0x02,0x00,0x20, + 0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B, + 0x1B,0x7F,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42, + 0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42, + 0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7, + 0x10,0x00,0xEA,0xE7,0x00,0x93,0x00,0x00,0x60,0x06,0x00,0x20,0x11,0x07,0x00,0x20, + 0x0E,0x23,0x58,0x43,0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x1B,0x49,0x10,0xB5,0x4A,0x7A,0x1B,0x49,0x00,0x20,0x00,0x2A, + 0x15,0xD1,0x0A,0x89,0x00,0x2A,0x0F,0xD0,0x18,0x49,0x8A,0x42,0x0C,0xD0,0x10,0x00, + 0x1E,0x21,0x48,0x43,0x64,0x21,0xFD,0xF7,0xED,0xF8,0xFF,0x30,0x4B,0x21,0x91,0x30, + 0xC9,0x00,0x88,0x42,0x00,0xD9,0x08,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x88,0x89, + 0x0D,0x4A,0x73,0x24,0x92,0x89,0x01,0x00,0x0D,0x4B,0xFF,0x39,0xE4,0x00,0x6A,0x39, + 0x12,0x1B,0x99,0x42,0x06,0xD8,0x10,0x00,0x50,0x43,0x59,0x1C,0xFD,0xF7,0xD2,0xF8, + 0x20,0x1A,0xE9,0xE7,0xA0,0x42,0xE7,0xD9,0x03,0x21,0x10,0x00,0xFD,0xF7,0xCA,0xF8, + 0x00,0x19,0xE1,0xE7,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x2F,0x02,0x00,0x00,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47, + 0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D, + 0x00,0x24,0x01,0x21,0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68, + 0x6A,0x60,0x05,0xE0,0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18, + 0x02,0x00,0x40,0x1E,0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0x23,0xFC,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06, + 0xFC,0xD4,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5, + 0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5, + 0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5, + 0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A, + 0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA, + 0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5, + 0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3, + 0x10,0x40,0xBD,0x08,0xE2,0x09,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3, + 0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A,0xD9,0x09,0x00,0xEB,0xD2,0xFF,0xFF,0xEA, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69, + 0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48, + 0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E, + 0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1, + 0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0, + 0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0x85,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69, + 0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5, + 0x02,0xF0,0x74,0xFB,0xC3,0xE7,0x00,0x00,0x0E,0x07,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29,0x80,0x79,0x01,0xD1,0x01,0x25,0x03,0xE0, + 0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x33,0x27, + 0x7F,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1,0x34,0x48,0x0D,0x22,0x00,0x21,0x14,0x38, + 0x01,0xF0,0x92,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00, + 0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19,0x36,0x7B,0x9E,0x42,0x01,0xD1,0x04,0x00, + 0x02,0xE0,0x40,0x1C,0x0C,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18, + 0xF6,0x19,0x36,0x7B,0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x73,0xED,0xE7, + 0x40,0x1C,0x0C,0x28,0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18, + 0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00, + 0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7B,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23, + 0xE4,0x19,0x23,0x73,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x02,0xE0,0x40,0x1C,0x0C,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20, + 0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xC0,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43, + 0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C, + 0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60, + 0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50, + 0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47,0x54,0x07,0x00,0x20,0xF0,0xB5,0x87,0xB0, + 0xFE,0xF7,0x9C,0xFB,0xFE,0xF7,0x7A,0xFB,0x01,0xF0,0x9C,0xFB,0x02,0xF0,0x8E,0xF9, + 0x00,0xF0,0x0E,0xFD,0x00,0xF0,0x38,0xFB,0xFE,0xF7,0x32,0xF8,0xFD,0xF7,0xA8,0xFA, + 0x39,0x48,0x00,0x68,0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x5C,0xFA, + 0xFF,0xF7,0x0C,0xFA,0x03,0xE0,0xFF,0xF7,0x09,0xFA,0xFF,0xF7,0x55,0xFA,0x01,0x27, + 0x7F,0x07,0x78,0x68,0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x78,0x60, + 0x02,0xF0,0x94,0xFC,0x02,0xF0,0xE0,0xFA,0x38,0x68,0x00,0x28,0x07,0xD0,0x78,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x3E,0x68,0x02,0x24,0x76,0x1C,0x37,0xE0,0x01,0x24, + 0x26,0x00,0xA0,0x00,0xC0,0x19,0x06,0x90,0x05,0x68,0xA8,0x01,0x80,0x0D,0x05,0x90, + 0xA8,0x05,0x80,0x0D,0x04,0x90,0x21,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9, + 0x05,0xA8,0x02,0xF0,0x07,0xFB,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x05,0xA8,0x03,0xF0,0x36,0xFB,0x04,0xA9,0x05,0xA8,0x03,0xF0,0x48,0xF9, + 0x14,0x48,0x04,0x99,0x05,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x05,0x43, + 0xA8,0x0A,0x80,0x02,0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42, + 0xC7,0xD9,0xFD,0xF7,0x69,0xFE,0x02,0xF0,0x67,0xFA,0x38,0x68,0xFC,0xF7,0xB8,0xFF, + 0xFF,0xF7,0xDC,0xFE,0xFC,0xF7,0xFE,0xFE,0x03,0xF0,0xD0,0xF9,0x06,0x48,0x40,0x79, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xD4,0x07,0x00,0x20,0x18,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xF8,0xB5,0x02,0xF0, + 0xE9,0xF8,0xFE,0xF7,0xD3,0xFD,0xFE,0xF7,0xA3,0xFE,0xFE,0xF7,0xEB,0xFE,0x1C,0x48, + 0x00,0x21,0xC0,0x7F,0x03,0xF0,0x96,0xF8,0x1A,0x4F,0x1B,0x4D,0xFC,0x03,0x00,0x20, + 0x28,0x70,0xE8,0x61,0x28,0x7A,0x00,0x28,0x1D,0xD0,0x01,0x26,0x18,0xE0,0x78,0x68, + 0x00,0x07,0x15,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x09,0xD1,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0x03,0xFA,0xFF,0xF7,0x3E,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0, + 0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xF6,0xF9, + 0xE0,0x6B,0x0B,0x28,0xE3,0xD1,0xFE,0xF7,0xB7,0xF9,0x28,0x78,0x00,0x28,0xD6,0xD0, + 0x01,0xF0,0xBC,0xFE,0xD3,0xE7,0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x00, + 0x00,0x93,0x00,0x00,0x00,0x40,0x00,0x30,0x0C,0x07,0x00,0x20,0x70,0xB5,0x05,0x00, + 0x1A,0x48,0x1B,0x4A,0x00,0x68,0x12,0x88,0x60,0x30,0x01,0x7E,0xC0,0x7D,0x2C,0x78, + 0x89,0x18,0x0E,0x06,0x17,0x49,0x36,0x0E,0x4A,0x7F,0x00,0x2A,0x0D,0xD1,0x89,0x7F, + 0x01,0x29,0x01,0xD1,0x80,0x1C,0x06,0xE0,0x02,0x29,0x01,0xD1,0x00,0x1D,0x02,0xE0, + 0x03,0x29,0x02,0xD1,0x80,0x1D,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42, + 0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7,0x2D,0xFE,0x76,0x1C,0xB0,0x42,0x05,0xD2, + 0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3, + 0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70,0x01,0x20,0xF4,0xE7,0xD4,0x07,0x00,0x20, + 0x00,0x07,0x00,0x20,0xA0,0x03,0x00,0x20,0x10,0xB5,0x0C,0x24,0x20,0x00,0xFE,0xF7, + 0x43,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8, + 0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00, + 0x10,0xB5,0x07,0x4C,0x07,0x48,0x22,0x00,0x00,0x21,0x01,0xF0,0xD5,0xF9,0x06,0x48, + 0x22,0x00,0x00,0x21,0x01,0xF0,0xD0,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xD2,0x02,0x00,0x00,0x00,0x00,0x00,0x10,0xDA,0x07,0x00,0x20,0x10,0xB5,0x40,0x22, + 0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0,0xBF,0xF9,0x01,0x20,0xA0,0x63,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00, + 0x01,0xF0,0x8E,0xF9,0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48, + 0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19,0x01,0xF0,0x72,0xF9,0x0D,0x48,0x00,0x21, + 0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0,0xAF,0xF9,0x0A,0x48,0x80,0x07,0x07,0xD0, + 0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0x94,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xF4,0x72,0x00,0x00, + 0x40,0x00,0x00,0x20,0x30,0x0B,0x00,0x00,0x40,0x00,0x00,0x20,0x05,0x49,0xC8,0x05, + 0x41,0x62,0x05,0x49,0x81,0x62,0x05,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61, + 0x70,0x47,0x00,0x00,0x80,0x88,0x3C,0x03,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40, + 0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00, + 0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0x31,0xFA,0x64,0x1C, + 0x0C,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24, + 0x64,0x03,0x20,0x00,0xFD,0xF7,0xC2,0xF8,0xFE,0xF7,0x4A,0xFD,0xFE,0xF7,0x14,0xFD, + 0xFE,0xF7,0x4E,0xFD,0xFE,0xF7,0x44,0xFD,0xFE,0xF7,0x06,0xFD,0x07,0x48,0x01,0x68, + 0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60, + 0x20,0x00,0xFD,0xF7,0xA3,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40, + 0x00,0x93,0x00,0x00,0x10,0xB5,0x01,0xF0,0x95,0xFF,0x01,0xF0,0x75,0xFF,0xFF,0x20, + 0xFD,0xF7,0xD4,0xF8,0xFF,0xF7,0xAA,0xFF,0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0, + 0x3B,0xF9,0x08,0x20,0xFD,0xF7,0x92,0xF8,0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20, + 0xFF,0xF7,0x00,0xFE,0x00,0xF0,0x1A,0xF8,0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0, + 0x40,0x20,0xFD,0xF7,0x83,0xF8,0x00,0xF0,0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20, + 0x01,0xF0,0x63,0xFF,0xFE,0xF7,0x5E,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x54,0x07,0x00,0x20,0x02,0x03,0x0F,0x0F,0x00,0x93,0x00,0x00,0xF8,0xB5,0x03,0x24, + 0xE6,0x01,0x13,0x25,0x30,0x00,0xFD,0xF7,0x69,0xF8,0x20,0x02,0xFD,0xF7,0x90,0xF8, + 0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7,0x1D,0xFD,0x02,0x00,0xFF,0x21,0x90,0x31, + 0x02,0x20,0x00,0x23,0x00,0x95,0x02,0xF0,0xBF,0xFF,0x07,0x4A,0x27,0x21,0x03,0x20, + 0x00,0x23,0x00,0x94,0x02,0xF0,0xB8,0xFF,0x30,0x00,0xFD,0xF7,0x47,0xF8,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x07,0x49, + 0x00,0x20,0xFF,0xF7,0xC9,0xFD,0x03,0xF0,0x5E,0xF9,0x05,0x48,0x03,0xF0,0x4E,0xF9, + 0x00,0x20,0xFF,0xF7,0xA7,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA1,0x71,0x00,0x00, + 0x78,0x37,0x00,0x00,0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42, + 0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7,0xE5,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20, + 0xF5,0x30,0x20,0x63,0x03,0xF0,0x08,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x93,0x00,0x00,0x07,0xA5,0x07,0x00,0x0C,0x07,0x00,0x20,0x10,0xB5,0xFF,0xF7, + 0xCF,0xFE,0x12,0x48,0x00,0x7A,0x02,0xF0,0xB9,0xFE,0xFF,0xF7,0x3B,0xFF,0x0F,0x48, + 0x0F,0x4A,0xA0,0x30,0x41,0x89,0xD1,0x83,0x0E,0x49,0x0F,0x4A,0x09,0x68,0x40,0x31, + 0x49,0x7D,0x51,0x70,0x01,0x00,0x20,0x39,0x0A,0x8B,0x0B,0x49,0x80,0x31,0x8A,0x63, + 0x00,0x88,0xC8,0x63,0xFF,0xF7,0xA0,0xFE,0x08,0x48,0x00,0x24,0xC4,0x80,0xFE,0xF7, + 0x37,0xFB,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x40,0x00,0x00,0x20,0xD4,0x07,0x00,0x20,0x40,0x06,0x00,0x20,0x00,0x02,0x00,0x20, + 0x0D,0x07,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90,0x00,0x20,0x2B,0x4E, + 0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0x14,0xFC,0xFE,0xF7,0xEA,0xFC, + 0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F,0x00,0x25,0x00,0x90, + 0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0x3B,0xFB,0x00,0x28,0x1B,0xD0,0x0E,0x21, + 0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A, + 0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98, + 0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00, + 0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3,0x6D,0x1C,0x15,0x2D, + 0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0,0x07,0x98,0x07,0x60, + 0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF, + 0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x68,0xC0,0x9F,0xE5, + 0x00,0x00,0x9C,0xE5,0x64,0x30,0x9F,0xE5,0x0E,0x06,0xD3,0xE5,0x01,0x00,0x00,0xE2, + 0x00,0x00,0x50,0xE3,0x0F,0x16,0xD3,0x15,0x00,0x00,0xA0,0x13,0x00,0x00,0x51,0x13, + 0x1E,0xFF,0x2F,0x91,0x0E,0x26,0xD3,0xE5,0x00,0x10,0x83,0xE0,0x3D,0x16,0xD1,0xE5, + 0x02,0x00,0x12,0xE3,0x3C,0x26,0xD3,0xE5,0x82,0x21,0x62,0x00,0x82,0x10,0x81,0x00, + 0x81,0x11,0x61,0x10,0x81,0x10,0x82,0x10,0x01,0x11,0x9C,0xE7,0x80,0x20,0x83,0xE0, + 0x02,0x19,0xC1,0xE3,0xB0,0x11,0xC2,0xE1,0x0F,0x16,0xD3,0xE5,0x01,0x00,0x80,0xE2, + 0x00,0x00,0x51,0xE1,0xEE,0xFF,0xFF,0x8A,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40, + 0x40,0x00,0x00,0x20,0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42, + 0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7, + 0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF0,0xB5,0xFF,0xB0,0x00,0x20,0x9A,0xB0, + 0x8D,0x90,0xE2,0x49,0x20,0x22,0x28,0xA8,0xFC,0xF7,0x78,0xFA,0xE0,0x48,0x5C,0x21, + 0x00,0x68,0xFF,0x22,0x0C,0x5A,0x60,0x30,0x85,0x78,0x6A,0x32,0x00,0x21,0x30,0xA8, + 0x00,0xF0,0xAA,0xFF,0xDB,0x48,0x0C,0x22,0x00,0x21,0x00,0xF0,0xA5,0xFF,0xD9,0x48, + 0x18,0x22,0x00,0x21,0x0C,0x30,0x00,0xF0,0x9F,0xFF,0x34,0x22,0x00,0x21,0x1B,0xA8, + 0x00,0xF0,0x9A,0xFF,0x34,0x22,0x00,0x21,0x0E,0xA8,0x00,0xF0,0x95,0xFF,0x34,0x22, + 0x00,0x21,0x01,0xA8,0x00,0xF0,0x90,0xFF,0xCF,0x48,0x01,0x79,0x00,0x29,0x7E,0xD0, + 0xC1,0x88,0x89,0x06,0x02,0xD5,0x61,0x1B,0x0C,0x04,0x24,0x0C,0xCA,0x4D,0x64,0x21, + 0x28,0x89,0x60,0x43,0xFC,0xF7,0x76,0xFA,0xC6,0x49,0x89,0x1D,0x98,0x91,0xE9,0x89, + 0x40,0x18,0x98,0x99,0x00,0x24,0xC8,0x83,0x91,0x94,0x00,0x20,0x92,0x90,0x91,0x98, + 0x0E,0x21,0x48,0x43,0x97,0x90,0x92,0x9A,0x97,0x99,0x98,0x9E,0x8B,0x18,0xBF,0x49, + 0x5D,0x00,0x4A,0x5F,0x1E,0x21,0x71,0x5E,0x00,0x20,0x8A,0x42,0x02,0xDD,0x50,0x1A, + 0x00,0x04,0x00,0x14,0x92,0x9A,0x00,0x2A,0x05,0xD1,0x00,0x28,0x7E,0xD0,0x97,0x98, + 0x30,0xA9,0x08,0x5C,0x0E,0xE0,0xB5,0x4A,0xAD,0x18,0x20,0x3D,0x1E,0x22,0xAA,0x5E, + 0x8A,0x42,0x03,0xDD,0x51,0x1A,0x09,0x04,0x09,0x14,0x6F,0xD1,0x00,0x28,0xED,0xD0, + 0x30,0xA8,0xC0,0x5C,0x00,0x28,0xF8,0xD1,0x92,0x98,0x64,0x1C,0x06,0x04,0x91,0x98, + 0x36,0x14,0x00,0x04,0x00,0x14,0x24,0x04,0x04,0x21,0x24,0x14,0x0C,0x2C,0x90,0x96, + 0x8F,0x90,0x8C,0x90,0x03,0xDD,0x64,0x1E,0x24,0x04,0x24,0x14,0x9F,0xE0,0x00,0x20, + 0x8B,0x90,0x00,0x20,0x8E,0x90,0x8B,0x98,0x09,0x22,0x40,0x1C,0x00,0x04,0x00,0x14, + 0x92,0x01,0x90,0x42,0x8B,0x90,0x49,0xDC,0x00,0x20,0x84,0x46,0x88,0x00,0x28,0xAA, + 0x83,0x18,0x5B,0x88,0x10,0x5A,0x8C,0x9D,0x5B,0x19,0x80,0x19,0x1B,0x04,0x00,0x04, + 0x1B,0x14,0x00,0x14,0x15,0x2B,0x21,0xD2,0x00,0x28,0x1F,0xDB,0x0E,0x28,0x1D,0xDA, + 0x0E,0x22,0x5A,0x43,0x12,0x18,0x96,0x92,0x90,0x4D,0x52,0x00,0x00,0xE0,0x10,0xE1, + 0xAA,0x5E,0x98,0x9D,0x1E,0x27,0xEF,0x5F,0xBA,0x42,0x0F,0xDD,0x96,0x9A,0x30,0xAD, + 0xAA,0x56,0xA2,0x42,0x01,0xD0,0x00,0x2A,0x08,0xD1,0x8F,0x9A,0x93,0x42,0x02,0xD1, + 0x90,0x9A,0x90,0x42,0x0A,0xD0,0x01,0x22,0x8E,0x92,0x07,0xE0,0x49,0x1C,0x62,0x46, + 0x52,0x1C,0x49,0x07,0x49,0x0F,0x08,0x2A,0x94,0x46,0xC7,0xDB,0x8C,0x9A,0x0E,0x25, + 0x6A,0x43,0x92,0x19,0x30,0xAD,0xAF,0x5C,0x00,0x2F,0x35,0xD1,0xAC,0x54,0x7B,0x4D, + 0x52,0x00,0xAA,0x5E,0x98,0x9F,0x1E,0x25,0x7D,0x5F,0x00,0xE0,0x38,0xE0,0xAA,0x42, + 0x03,0xDD,0x52,0x1B,0x12,0x04,0x12,0x0C,0x00,0xE0,0x00,0x22,0x72,0x4F,0x76,0x00, + 0x94,0x46,0xF6,0x19,0x36,0x8C,0x67,0x46,0xA2,0x00,0x7E,0x43,0x1B,0xAD,0xAD,0x58, + 0x6D,0x4F,0xAD,0x19,0x1B,0xAE,0xB5,0x50,0x8C,0x9E,0x0E,0xAD,0x76,0x00,0xF6,0x19, + 0x40,0x36,0xB6,0x8A,0x67,0x46,0xAD,0x58,0x7E,0x43,0xAD,0x19,0x0E,0xAE,0xB5,0x50, + 0x01,0xAD,0xAE,0x58,0x66,0x44,0xAE,0x50,0x63,0x4D,0x62,0x00,0x52,0x19,0xFF,0x32, + 0xA1,0x32,0xD5,0x88,0x6D,0x1C,0xD5,0x80,0x8E,0x9A,0x00,0x2A,0x08,0xD0,0x1A,0x06, + 0x12,0x0E,0x06,0x06,0x49,0x1D,0x36,0x0E,0x49,0x07,0x49,0x0F,0x8C,0x92,0x70,0xE7, + 0x92,0x98,0x40,0x1C,0x0E,0x28,0x92,0x90,0x00,0xDA,0x2C,0xE7,0x8D,0x98,0x00,0x28, + 0x05,0xD1,0x91,0x98,0x40,0x1C,0x15,0x28,0x91,0x90,0x00,0xDA,0x1D,0xE7,0x00,0x2C, + 0x70,0xDD,0x00,0x20,0x84,0x46,0x00,0x22,0x0E,0x21,0x60,0x46,0x48,0x43,0x95,0x90, + 0x95,0x99,0x98,0x9E,0x4D,0x4D,0x89,0x18,0x1E,0x23,0xF3,0x5E,0x4F,0x00,0x7E,0x19, + 0x02,0x25,0x75,0x5F,0x00,0x20,0x9D,0x42,0x02,0xDD,0xE8,0x1A,0x00,0x04,0x00,0x14, + 0x30,0xAD,0x6B,0x56,0x49,0x19,0x94,0x91,0x4D,0x78,0x00,0x2D,0x26,0xD1,0x00,0x28, + 0x24,0xD0,0x00,0x2B,0x22,0xD0,0x40,0x4F,0x56,0x00,0xF6,0x19,0x76,0x8C,0x99,0x00, + 0x1B,0xAD,0x46,0x43,0x6D,0x58,0xAD,0x19,0x1B,0xAE,0x75,0x50,0x66,0x46,0x76,0x00, + 0xF6,0x19,0x40,0x36,0xB6,0x8A,0x0E,0xAD,0x6D,0x58,0x46,0x43,0xAD,0x19,0x0E,0xAE, + 0x75,0x50,0x01,0xAD,0x6E,0x58,0x30,0x18,0x68,0x50,0x58,0x00,0xC0,0x19,0xFF,0x30, + 0xA1,0x30,0xC1,0x88,0x49,0x1C,0xC1,0x80,0x94,0x98,0x43,0x70,0x52,0x1C,0x0E,0x2A, + 0xBE,0xDB,0x60,0x46,0x40,0x1C,0x15,0x28,0x84,0x46,0xB4,0xDB,0x01,0x25,0x1F,0xE0, + 0xAF,0x00,0x01,0xA9,0xCE,0x59,0x01,0x20,0x00,0x2E,0x00,0xD0,0x30,0x00,0x01,0x00, + 0x1B,0xA8,0xC0,0x59,0xFC,0xF7,0x5E,0xFA,0x23,0x49,0x6A,0x00,0x51,0x18,0x93,0x91, + 0xFF,0x31,0x61,0x31,0x48,0x81,0x01,0x21,0x00,0x2E,0x00,0xD0,0x31,0x00,0x0E,0xA8, + 0xC0,0x59,0xFC,0xF7,0x4F,0xFA,0x93,0x99,0xFF,0x31,0x81,0x31,0x6D,0x1C,0x48,0x80, + 0xA5,0x42,0xDD,0xDD,0x18,0x4B,0x18,0x79,0x21,0xE0,0x81,0x00,0xC9,0x18,0xFF,0x31, + 0x21,0x31,0x06,0x24,0x0C,0x5F,0x04,0x22,0x8A,0x5E,0x0E,0x21,0x4C,0x43,0xA1,0x18, + 0x30,0xAA,0x51,0x5C,0x1A,0x18,0x14,0x00,0xFF,0x32,0x81,0x32,0x51,0x76,0x51,0x7E, + 0xFF,0x22,0x59,0x32,0x49,0x00,0xC9,0x18,0xFF,0x31,0xA1,0x31,0xC9,0x88,0x09,0x06, + 0x09,0x0E,0x11,0x55,0x9A,0x8B,0x91,0x42,0x00,0xD9,0x99,0x83,0x40,0x1E,0x01,0x28, + 0xDB,0xDA,0x7F,0xB0,0x1A,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xAC,0x72,0x00,0x00, + 0xD4,0x07,0x00,0x20,0xDA,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0xF0,0xB5,0x00,0x20,0xEF,0xB0,0x0C,0x90,0x01,0x00,0x0B,0x90,0x08,0x90,0x02,0x90, + 0x2E,0x22,0x15,0xA8,0x00,0xF0,0xE0,0xFD,0xFE,0x48,0xFF,0x4E,0x00,0x21,0x30,0x81, + 0xFE,0x48,0xB1,0x81,0x41,0x81,0xFE,0x48,0xFF,0x4B,0x6E,0x90,0x42,0x7A,0xFD,0x48, + 0x02,0x2A,0x02,0xD9,0x1A,0x68,0x52,0x8C,0x0F,0xE0,0x02,0x2A,0x05,0xD1,0x1A,0x68, + 0xC4,0x88,0x12,0x8C,0x12,0x19,0x0A,0x92,0x0E,0xE0,0xF8,0x4A,0x12,0x78,0x00,0x2A, + 0x05,0xD0,0xF7,0x4A,0x84,0x88,0x92,0x89,0x12,0x19,0x0A,0x92,0x04,0xE0,0x1A,0x68, + 0x84,0x88,0xD2,0x8B,0x12,0x19,0x0A,0x92,0xF2,0x4A,0x0A,0x9C,0x6D,0x92,0x12,0x89, + 0x14,0x19,0x0E,0x22,0xB2,0x5E,0x07,0x92,0x1D,0x68,0x00,0x89,0x40,0x35,0x6A,0x89, + 0x09,0x94,0x17,0x18,0xA7,0x42,0x00,0xD2,0x3C,0x00,0xEB,0x48,0x6C,0x90,0x80,0x7B, + 0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x01,0x20,0x00,0xE0,0x02,0x20,0x02,0x90, + 0xE6,0x49,0x00,0x20,0x6B,0x91,0x88,0x83,0x70,0x89,0xA9,0x7B,0x48,0x43,0x02,0xF0, + 0x59,0xFE,0x08,0x04,0x6B,0x99,0x00,0x14,0xC8,0x83,0xA9,0x89,0x88,0x42,0x02,0xDA, + 0xA9,0x89,0x6B,0x98,0xC1,0x83,0x00,0x20,0x5C,0x90,0x20,0x04,0x00,0x14,0x6A,0x90, + 0x38,0x04,0x00,0x14,0x69,0x90,0x09,0x98,0x00,0x04,0x00,0x14,0x68,0x90,0xD8,0x48, + 0x67,0x90,0x5C,0x98,0x0E,0x21,0x48,0x43,0x66,0x90,0x5C,0x98,0xCA,0x49,0x40,0x00, + 0x00,0x24,0x40,0x18,0x40,0x30,0x65,0x90,0x66,0x98,0xD2,0x49,0x00,0x19,0x00,0x04, + 0x00,0x14,0x6B,0x9A,0x84,0x46,0x40,0x00,0x1E,0x23,0x09,0x5E,0xD3,0x5E,0x99,0x42, + 0x02,0xDD,0x91,0x8B,0x49,0x1C,0x91,0x83,0xCB,0x49,0x08,0x5E,0x6A,0x99,0x88,0x42, + 0x64,0x90,0x00,0xDA,0xE7,0xE3,0x5C,0x99,0x00,0x20,0x00,0x29,0x25,0xDD,0x61,0x46, + 0x0E,0x39,0xC8,0x10,0x4D,0x07,0x01,0x23,0x15,0xAA,0x10,0x5C,0x6D,0x0F,0x19,0x00, + 0xA9,0x40,0x08,0x40,0x00,0x2C,0x0B,0xDD,0x61,0x46,0x0F,0x39,0xCD,0x10,0x4E,0x07, + 0x55,0x5D,0x76,0x0F,0x19,0x00,0xB1,0x40,0x0D,0x40,0x28,0x18,0x00,0x06,0x00,0x0E, + 0x0D,0x2C,0x0C,0xDA,0x61,0x46,0x0D,0x39,0xCD,0x10,0x49,0x07,0x52,0x5D,0x49,0x0F, + 0x8B,0x40,0x1A,0x40,0x10,0x18,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0C,0xDD,0x61,0x46, + 0x49,0x1E,0xCA,0x10,0x15,0xAB,0x9A,0x5C,0x4B,0x07,0x5B,0x0F,0x01,0x21,0x99,0x40, + 0x0A,0x40,0x10,0x18,0x00,0x06,0x00,0x0E,0x00,0x28,0x00,0xD0,0xAB,0xE3,0xAB,0x48, + 0x00,0x7D,0x80,0x07,0x09,0xD5,0x0D,0x2C,0x07,0xD1,0x5C,0x98,0x14,0x28,0x04,0xDB, + 0xA7,0x48,0x00,0x78,0x01,0x28,0x00,0xD1,0x9D,0xE3,0x00,0x23,0x1D,0x00,0x5C,0x99, + 0x0E,0x22,0x4E,0x19,0x71,0x1E,0x51,0x43,0x00,0x20,0x0F,0x00,0x21,0x18,0x72,0x1E, + 0x49,0x1E,0x00,0x2A,0x0C,0xDB,0x15,0x2A,0x0A,0xDC,0x00,0x29,0x08,0xDB,0x0E,0x29, + 0x06,0xDC,0x99,0x4A,0x79,0x18,0x49,0x00,0x51,0x5E,0x99,0x42,0x00,0xDD,0x0B,0x00, + 0x40,0x1C,0x00,0x04,0x00,0x14,0x03,0x28,0xE8,0xDB,0x6D,0x1C,0x2D,0x04,0x2D,0x14, + 0x03,0x2D,0xDC,0xDB,0x64,0x9A,0x18,0x04,0x00,0x14,0x82,0x42,0x00,0xD0,0x72,0xE3, + 0x81,0x4A,0x92,0x89,0x82,0x42,0x06,0xDC,0x7F,0x4A,0x90,0x81,0x10,0x79,0x40,0x1C, + 0x00,0x06,0x00,0x0E,0x0C,0x90,0x60,0x46,0x63,0x46,0xC0,0x10,0x5E,0x07,0x15,0xAD, + 0x2A,0x5C,0x76,0x0F,0x01,0x23,0xB3,0x40,0x1A,0x43,0x2A,0x54,0x00,0x20,0x01,0x90, + 0x02,0x98,0xC0,0x07,0x0A,0xD0,0x0D,0x2C,0x01,0xD1,0x0D,0x20,0x09,0xE0,0x0C,0x2C, + 0x10,0xD1,0x01,0x98,0x22,0x04,0x10,0x43,0x01,0x90,0x0B,0xE0,0x5C,0x98,0x14,0x28, + 0x01,0xD1,0x01,0x90,0x06,0xE0,0x13,0x28,0x04,0xD1,0x01,0x98,0x13,0x22,0x12,0x04, + 0x10,0x43,0x01,0x90,0x01,0x98,0x00,0x04,0x64,0x98,0x04,0xD0,0x69,0x9A,0x90,0x42, + 0x00,0xDA,0x38,0xE3,0x03,0xE0,0x68,0x9A,0x90,0x42,0x00,0xDA,0x33,0xE3,0x66,0x48, + 0x00,0x25,0x00,0x68,0x63,0x90,0x5C,0x99,0x0E,0x22,0x49,0x19,0x89,0x1E,0x09,0x06, + 0x09,0x16,0x62,0x91,0x51,0x43,0x8C,0x46,0x29,0x00,0x14,0x23,0x59,0x43,0x2A,0xAA, + 0x8F,0x18,0x00,0x20,0x43,0xAA,0x8B,0x18,0x21,0x18,0x89,0x1E,0x62,0x9A,0x09,0x06, + 0x09,0x16,0x15,0x2A,0x03,0xD2,0x00,0x29,0x01,0xDB,0x0E,0x29,0x03,0xDB,0x00,0x21, + 0x82,0x00,0x99,0x50,0x33,0xE0,0x63,0x9A,0x12,0x88,0x52,0x04,0x62,0x46,0x08,0xD5, + 0x59,0x4E,0x52,0x18,0x52,0x00,0xB2,0x5E,0x07,0x9E,0x92,0x1B,0x86,0x00,0x9A,0x51, + 0x07,0xE0,0x54,0x4E,0x52,0x18,0x52,0x00,0xB2,0x5E,0x07,0x9E,0x92,0x1B,0x86,0x00, + 0x9A,0x51,0x82,0x00,0x9E,0x58,0x00,0x2E,0x01,0xDA,0x00,0x26,0x9E,0x50,0x63,0x9E, + 0x36,0x88,0x36,0x04,0x66,0x46,0x07,0xD5,0x71,0x18,0x4B,0x4E,0x49,0x00,0x71,0x5E, + 0x07,0x9E,0x89,0x1B,0xB9,0x50,0x06,0xE0,0x71,0x18,0x46,0x4E,0x49,0x00,0x71,0x5E, + 0x07,0x9E,0x89,0x1B,0xB9,0x50,0x00,0x29,0x01,0xDA,0x00,0x21,0xB9,0x50,0x40,0x1C, + 0x00,0x04,0x00,0x14,0x05,0x28,0xB7,0xDB,0x6D,0x1C,0x2D,0x04,0x2D,0x14,0x05,0x2D, + 0xA1,0xDB,0x40,0x48,0x00,0x78,0x00,0x28,0x24,0xD1,0x5C,0x98,0x13,0x28,0x34,0xDB, + 0x00,0x2C,0x01,0xD0,0x0C,0x2C,0x1D,0xD1,0x3B,0x48,0x00,0x68,0x64,0x28,0x06,0xD3, + 0x3A,0x49,0x09,0x68,0x64,0x29,0x02,0xD3,0x4F,0x99,0xFA,0x29,0x72,0xDB,0x00,0x2C, + 0x01,0xD0,0x0C,0x2C,0x0E,0xD1,0x64,0x28,0x0C,0xD3,0x34,0x48,0x00,0x68,0x64,0x28, + 0x08,0xD3,0x33,0x48,0x00,0x68,0x64,0x28,0x04,0xD3,0x4F,0x98,0xFF,0x21,0xF5,0x31, + 0x88,0x42,0x5F,0xDB,0x5C,0x98,0x14,0x28,0x0F,0xD1,0x04,0x25,0x43,0xAF,0x14,0x20, + 0x68,0x43,0xC6,0x19,0xB0,0x68,0xFF,0x21,0x2D,0x31,0x48,0x43,0x02,0xF0,0xB2,0xFC, + 0x6D,0x1E,0x2D,0x04,0x2D,0x14,0xB1,0x60,0xF1,0xD5,0x12,0x22,0x00,0x21,0x21,0xA8, + 0x00,0xF0,0x02,0xFC,0x30,0x98,0x14,0x49,0x21,0x90,0x31,0x98,0x22,0x90,0x32,0x98, + 0x23,0x90,0x35,0x98,0x24,0x90,0x37,0x98,0x26,0x90,0x3A,0x98,0x27,0x90,0x3B,0x98, + 0x28,0x90,0x3C,0x98,0x29,0x90,0x09,0x68,0x36,0x98,0x89,0x8B,0x48,0x43,0x02,0xF0, + 0x91,0xFC,0x00,0x23,0x18,0x00,0x03,0x25,0x43,0xAF,0x25,0x91,0x03,0x21,0x14,0x22, + 0x6A,0x43,0x28,0xE0,0xFF,0x0F,0x00,0x00,0x40,0x00,0x00,0x20,0x20,0x01,0x00,0x20, + 0x00,0x02,0x00,0x20,0x00,0x07,0x00,0x20,0xD4,0x07,0x00,0x20,0x19,0x07,0x00,0x20, + 0xA0,0x95,0x00,0x00,0xA0,0x01,0x00,0x20,0x40,0x06,0x00,0x20,0x20,0x06,0x00,0x20, + 0x80,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xDA,0x07,0x00,0x20,0x00,0x93,0x00,0x00, + 0x50,0x07,0x00,0x20,0x1A,0x07,0x00,0x20,0x44,0x07,0x00,0x20,0x48,0x07,0x00,0x20, + 0x4C,0x07,0x00,0x20,0xAB,0xE0,0xD6,0x19,0x8A,0x00,0xB2,0x58,0x9A,0x42,0x01,0xDA, + 0x13,0x04,0x1B,0x0C,0x10,0x18,0x49,0x1E,0x00,0x04,0x09,0x04,0x00,0x0C,0x09,0x14, + 0x01,0x29,0xF1,0xDA,0x6D,0x1E,0x2D,0x04,0x2D,0x14,0x01,0x2D,0xBE,0xDA,0xFF,0x49, + 0xFF,0x22,0x41,0x43,0xC9,0x0C,0x2D,0x32,0x91,0x42,0x03,0xD3,0xFC,0x4B,0x03,0x22, + 0x1A,0x70,0x0A,0xE0,0xC8,0x29,0x03,0xD3,0xF9,0x4B,0x02,0x22,0x1A,0x70,0x04,0xE0, + 0x64,0x29,0x02,0xD3,0xF6,0x4B,0x01,0x22,0x1A,0x70,0xF6,0x4A,0xD2,0x88,0x52,0x06, + 0x03,0xD5,0xF3,0x4A,0x00,0x21,0x11,0x70,0x0F,0xE0,0xF1,0x4A,0x12,0x78,0x03,0x2A, + 0x02,0xD1,0xC8,0x29,0x73,0xD3,0x08,0xE0,0x02,0x2A,0x02,0xD1,0x64,0x29,0x6E,0xD3, + 0x03,0xE0,0x01,0x2A,0x01,0xD1,0x32,0x29,0x69,0xD3,0x5C,0x99,0x07,0x29,0x01,0xDD, + 0x11,0x29,0x06,0xDB,0x50,0x25,0x32,0x21,0x2E,0x00,0x2A,0x00,0x04,0x95,0x05,0x91, + 0x05,0xE0,0x64,0x21,0x0D,0x00,0x0E,0x00,0x0A,0x00,0x05,0x91,0x04,0x91,0x03,0x92, + 0x7D,0x22,0x12,0x01,0x90,0x42,0x7C,0xD2,0x48,0x43,0x02,0xF0,0x03,0xFC,0x0F,0x04, + 0x05,0x99,0x4F,0x98,0x3F,0x0C,0x48,0x43,0x02,0xF0,0xFC,0xFB,0x4F,0x91,0x4A,0x98, + 0x68,0x43,0x02,0xF0,0xF7,0xFB,0x4A,0x91,0x54,0x98,0x70,0x43,0x02,0xF0,0xF2,0xFB, + 0x54,0x91,0x45,0x98,0x1E,0x21,0x48,0x43,0x02,0xF0,0xEC,0xFB,0x45,0x91,0x59,0x98, + 0x1E,0x21,0x48,0x43,0x02,0xF0,0xE6,0xFB,0x4E,0x98,0x59,0x91,0xB8,0x42,0x01,0xDB, + 0x06,0x98,0x06,0xE0,0x04,0x99,0x48,0x43,0x02,0xF0,0xDC,0xFB,0x08,0x04,0x00,0x0C, + 0x06,0x90,0xB8,0x42,0x00,0xD2,0x4E,0x90,0x50,0x98,0xB8,0x42,0x01,0xDB,0x06,0x98, + 0x06,0xE0,0x04,0x99,0x48,0x43,0x02,0xF0,0xCD,0xFB,0x08,0x04,0x00,0x0C,0x06,0x90, + 0xB8,0x42,0x00,0xD2,0x50,0x90,0x49,0x98,0xB8,0x42,0x01,0xDB,0x06,0x98,0x06,0xE0, + 0x03,0x99,0x48,0x43,0x02,0xF0,0xBE,0xFB,0x08,0x04,0x00,0x0C,0x06,0x90,0xB8,0x42, + 0x00,0xD2,0x49,0x90,0x4B,0x98,0xB8,0x42,0x02,0xDB,0x06,0x98,0x07,0xE0,0x9A,0xE1, + 0x03,0x99,0x48,0x43,0x02,0xF0,0xAE,0xFB,0x08,0x04,0x00,0x0C,0x06,0x90,0xB8,0x42, + 0x00,0xD2,0x4B,0x90,0x53,0x98,0xB8,0x42,0x01,0xDB,0x06,0x98,0x06,0xE0,0x03,0x99, + 0x48,0x43,0x02,0xF0,0x9F,0xFB,0x08,0x04,0x00,0x0C,0x06,0x90,0xB8,0x42,0x00,0xD2, + 0x53,0x90,0x55,0x98,0xB8,0x42,0x02,0xDB,0x06,0x98,0x07,0xE0,0x09,0xE0,0x03,0x99, + 0x48,0x43,0x02,0xF0,0x8F,0xFB,0x08,0x04,0x00,0x0C,0x06,0x90,0xB8,0x42,0x00,0xD2, + 0x55,0x90,0x01,0x98,0x00,0x28,0x2B,0xD0,0x02,0x98,0xC0,0x07,0x15,0xD0,0x04,0x20, + 0x00,0x23,0x43,0xAA,0x01,0x99,0x09,0x04,0x05,0xD0,0x14,0x21,0x41,0x43,0x53,0x50, + 0x89,0x18,0x4B,0x60,0x04,0xE0,0x14,0x21,0x41,0x43,0x89,0x18,0xCB,0x60,0x0B,0x61, + 0x40,0x1E,0x00,0x04,0x00,0x14,0xED,0xD5,0x12,0xE0,0x04,0x20,0x00,0x22,0x43,0xAB, + 0x01,0x99,0x09,0x04,0x04,0xD0,0x81,0x00,0x5A,0x50,0xC9,0x18,0x4A,0x61,0x03,0xE0, + 0x81,0x00,0xC9,0x18,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xEF,0xD5, + 0x00,0x23,0x1D,0x00,0x5C,0x99,0x00,0x20,0x4E,0x19,0x77,0x1E,0x0E,0x21,0x4F,0x43, + 0x21,0x18,0x72,0x1E,0x49,0x1E,0x00,0x2A,0x0C,0xDB,0x15,0x2A,0x0A,0xDC,0x00,0x29, + 0x08,0xDB,0x0E,0x29,0x06,0xDC,0x80,0x4A,0x79,0x18,0x49,0x00,0x51,0x5E,0x99,0x42, + 0x00,0xDD,0x0B,0x00,0x40,0x1C,0x00,0x04,0x00,0x14,0x03,0x28,0xE8,0xDB,0x6D,0x1C, + 0x2D,0x04,0x2D,0x14,0x03,0x2D,0xDD,0xDB,0x76,0x49,0x18,0x04,0x0A,0x89,0x00,0x14, + 0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81,0x71,0x49, + 0x08,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x08,0x71,0x80,0x00,0x40,0x18,0xFF,0x30, + 0x21,0x30,0x84,0x80,0x08,0x79,0x5C,0x9A,0x80,0x00,0x40,0x18,0xFF,0x30,0x21,0x30, + 0xC2,0x80,0x24,0xA8,0x05,0xC8,0x00,0x21,0x90,0x42,0x05,0xDC,0x21,0x98,0x90,0x42, + 0x02,0xDC,0x27,0x98,0x90,0x42,0x00,0xDD,0xC0,0x21,0x26,0x98,0x90,0x42,0x05,0xDC, + 0x23,0x98,0x90,0x42,0x02,0xDC,0x29,0x98,0x90,0x42,0x01,0xDD,0x30,0x20,0x01,0x43, + 0x22,0x98,0x90,0x42,0x05,0xDC,0x21,0x98,0x90,0x42,0x02,0xDC,0x23,0x98,0x90,0x42, + 0x01,0xDD,0x0C,0x20,0x01,0x43,0x28,0x98,0x90,0x42,0x05,0xDC,0x27,0x98,0x90,0x42, + 0x02,0xDC,0x29,0x98,0x90,0x42,0x01,0xDD,0x03,0x20,0x01,0x43,0x04,0x20,0x8E,0x06, + 0x0F,0x07,0x43,0xAD,0x8A,0x09,0x02,0xD1,0x14,0x23,0x43,0x43,0xEA,0x50,0xB2,0x0F, + 0x03,0xD1,0x14,0x23,0x43,0x43,0x5B,0x19,0x1A,0x61,0xBA,0x0F,0x01,0xD1,0x83,0x00, + 0xEA,0x50,0x8A,0x07,0x02,0xD1,0x83,0x00,0x5B,0x19,0x1A,0x65,0x40,0x1E,0x00,0x04, + 0x00,0x14,0xE7,0xD5,0x47,0x9A,0x43,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xF3,0xF9, + 0x4C,0x9A,0x13,0x90,0x48,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xEC,0xF9,0x51,0x9A, + 0x12,0x90,0x4D,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xE5,0xF9,0x56,0x9A,0x11,0x90, + 0x52,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xDE,0xF9,0x10,0x90,0x5B,0x9A,0x57,0xA8, + 0x00,0x92,0x0F,0xC8,0x01,0xF0,0xD7,0xF9,0x0F,0x90,0x00,0x90,0x10,0x9B,0x11,0x9A, + 0x12,0x99,0x13,0x98,0x01,0xF0,0xCF,0xF9,0x00,0x28,0x14,0x90,0x08,0xD1,0x64,0x22, + 0x00,0x21,0x43,0xA8,0x00,0xF0,0xF8,0xF9,0x0A,0x20,0x11,0x90,0x4F,0x90,0x14,0x90, + 0x57,0x9A,0x52,0x9B,0x00,0x92,0x4D,0x9A,0x48,0x99,0x43,0x98,0x01,0xF0,0xBB,0xF9, + 0x24,0x4A,0x61,0x00,0x8D,0x18,0xE9,0x8B,0x58,0x9A,0x53,0x9B,0x48,0x43,0x0E,0x90, + 0x00,0x92,0x4E,0x9A,0x49,0x99,0x44,0x98,0x01,0xF0,0xAD,0xF9,0x29,0x8C,0x59,0x9A, + 0x54,0x9B,0x48,0x43,0x0D,0x90,0x00,0x92,0x4F,0x9A,0x4A,0x99,0x45,0x98,0x01,0xF0, + 0xA2,0xF9,0x69,0x8C,0x5A,0x9A,0x48,0x43,0x00,0x92,0x07,0x00,0x55,0x9B,0x50,0x9A, + 0x4B,0x99,0x46,0x98,0x01,0xF0,0x97,0xF9,0xA9,0x8C,0x03,0x00,0x5B,0x9A,0x4B,0x43, + 0x1E,0x00,0x00,0x92,0x56,0x9B,0x51,0x9A,0x4C,0x99,0x47,0x98,0x01,0xF0,0x8B,0xF9, + 0xE9,0x8C,0x33,0x00,0x3A,0x00,0x48,0x43,0x00,0x90,0x0D,0x99,0x0E,0x98,0x01,0xF0, + 0x82,0xF9,0x14,0x99,0xFB,0xF7,0xA6,0xFC,0x06,0x49,0x09,0x8C,0x49,0x00,0x40,0x1A, + 0x00,0xD5,0x00,0x20,0x03,0x4F,0x3A,0x79,0x52,0x00,0x07,0xE0,0x8F,0xE3,0x00,0x00, + 0x0F,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10,0xD1,0x19,0xE0,0x31, + 0x88,0x82,0x65,0x98,0x13,0x99,0x40,0x8A,0x12,0x9A,0x0F,0x9E,0x48,0x43,0x65,0x99, + 0x89,0x8A,0x51,0x43,0x65,0x9A,0xD5,0x8A,0x11,0x9A,0x55,0x43,0x65,0x9A,0x13,0x8B, + 0x10,0x9A,0x53,0x43,0x65,0x9A,0x52,0x8B,0x72,0x43,0x00,0x92,0x2A,0x00,0x01,0xF0, + 0x52,0xF9,0x14,0x99,0xFB,0xF7,0x76,0xFC,0x67,0x99,0x89,0x8A,0x49,0x00,0x40,0x1A, + 0x00,0xD5,0x00,0x20,0x3A,0x79,0x52,0x00,0xD2,0x19,0xFF,0x32,0x01,0x32,0xD0,0x81, + 0x38,0x79,0x0C,0x28,0x12,0xD2,0x64,0x1C,0x24,0x04,0x24,0x14,0x0E,0x2C,0x01,0xDA, + 0xFF,0xF7,0xFA,0xFB,0x0B,0x98,0x00,0x28,0x08,0xD1,0x5C,0x98,0x40,0x1C,0x00,0x04, + 0x00,0x14,0x15,0x28,0x5C,0x90,0x01,0xDA,0xFF,0xF7,0xE3,0xFB,0x86,0x48,0x04,0x68, + 0x20,0x88,0x00,0x06,0x4C,0xD5,0x85,0x4A,0x10,0x79,0x00,0x28,0x6D,0x98,0x0C,0xD1, + 0x00,0x89,0x00,0x28,0x3D,0xD0,0x6D,0x98,0x20,0x34,0x40,0x79,0x21,0x7F,0x88,0x42, + 0x37,0xD2,0x6D,0x99,0x40,0x1C,0x48,0x71,0x3A,0xE0,0x25,0x00,0x20,0x35,0x80,0x79, + 0x29,0x7D,0x88,0x42,0x29,0xD8,0x40,0x1C,0x6D,0x99,0x00,0x06,0x00,0x0E,0x88,0x71, + 0x69,0x7D,0x81,0x42,0x03,0xD2,0x92,0x89,0x08,0x9B,0xD2,0x18,0x08,0x92,0x2A,0x7D, + 0x90,0x42,0x1A,0xD1,0x88,0x42,0x18,0xD0,0x41,0x1A,0x08,0x98,0xFB,0xF7,0x52,0xFD, + 0x6D,0x99,0x00,0x22,0x0A,0x81,0x21,0x8F,0x81,0x42,0x0E,0xD2,0x0A,0x99,0x40,0x1A, + 0xA9,0x7D,0x48,0x43,0x02,0xF0,0xE6,0xF9,0x6D,0x98,0x09,0x04,0x09,0x0C,0x01,0x81, + 0x60,0x8F,0x81,0x42,0x01,0xD9,0x6D,0x99,0x08,0x81,0x6D,0x99,0x00,0x20,0x48,0x71, + 0x06,0xE0,0x6D,0x99,0x00,0x20,0x88,0x71,0x6D,0x99,0x48,0x71,0x6D,0x99,0x08,0x81, + 0x5E,0x48,0x00,0x26,0x00,0x79,0x01,0x22,0xB4,0x46,0x01,0x28,0x61,0x90,0x4E,0xDB, + 0x6C,0x98,0xC0,0x7B,0x60,0x90,0x59,0x49,0x50,0x00,0x40,0x18,0xF4,0x23,0x1B,0x5A, + 0x57,0x4C,0xFF,0x30,0x63,0x43,0x01,0x30,0xC0,0x89,0xDC,0x0C,0x54,0x4B,0x58,0x43, + 0xC5,0x0C,0x60,0x9B,0x00,0x20,0x00,0x2B,0x84,0x46,0x32,0xDD,0x13,0x06,0x1B,0x0E, + 0x5F,0x93,0x4E,0x4B,0x91,0x00,0xCB,0x18,0xFF,0x33,0x21,0x33,0x4B,0x4F,0xC1,0x00, + 0xC9,0x19,0x03,0x27,0x7F,0x02,0xC9,0x19,0x10,0x27,0xCF,0x5F,0xA7,0x42,0x1A,0xDC, + 0x14,0x27,0xCF,0x5F,0xA7,0x42,0x16,0xDB,0x12,0x27,0xCF,0x5F,0xAF,0x42,0x12,0xDC, + 0x16,0x27,0xCF,0x5F,0xAF,0x42,0x0E,0xDB,0x06,0x21,0x59,0x5E,0x0E,0x27,0x79,0x43, + 0x04,0x27,0xDF,0x5F,0xC9,0x19,0x3F,0x4F,0x49,0x00,0x79,0x5E,0xB1,0x42,0x02,0xDD, + 0x0E,0x00,0x5F,0x99,0x8C,0x46,0x40,0x1C,0x60,0x99,0x00,0x04,0x00,0x14,0x81,0x42, + 0xD4,0xDC,0x52,0x1C,0x61,0x98,0x12,0x04,0x12,0x14,0x90,0x42,0xB3,0xDA,0x33,0x4D, + 0x2F,0x00,0x3B,0x00,0xBF,0x1C,0xF4,0x33,0x3C,0x00,0x68,0x89,0x19,0x00,0x1A,0x31, + 0xFF,0x37,0xE0,0x34,0x01,0x37,0xB0,0x42,0x5E,0x91,0x1A,0xDC,0x60,0x46,0x00,0x28, + 0x17,0xD0,0x40,0x00,0x40,0x19,0xF4,0x21,0x09,0x5A,0xFF,0x30,0x01,0x30,0x5D,0x91, + 0xC6,0x89,0x1A,0x22,0x00,0x21,0x18,0x00,0x00,0xF0,0x96,0xF8,0x5E,0x98,0x1A,0x22, + 0x00,0x21,0x00,0xF0,0x91,0xF8,0x01,0x20,0x28,0x71,0x5D,0x99,0xA1,0x82,0xFE,0x81, + 0x23,0xE0,0x68,0x79,0x00,0x28,0x20,0xD1,0x61,0x98,0x01,0x28,0x1D,0xD9,0x6E,0x98, + 0x80,0x7A,0x00,0x28,0x19,0xD1,0x0C,0x98,0x00,0x28,0x16,0xD0,0x41,0x00,0x48,0x19, + 0xF4,0x21,0x09,0x5A,0xFF,0x30,0x01,0x30,0x5D,0x91,0xC6,0x89,0x1A,0x22,0x00,0x21, + 0x18,0x00,0x00,0xF0,0x71,0xF8,0x5E,0x98,0x1A,0x22,0x00,0x21,0x00,0xF0,0x6C,0xF8, + 0x01,0x20,0x28,0x71,0x5D,0x99,0xA1,0x82,0xFE,0x81,0x6C,0x98,0xC0,0x7A,0x00,0x28, + 0x0C,0xD0,0x00,0x21,0x29,0x71,0x6C,0x98,0x0B,0x4A,0x00,0x7B,0x92,0x7F,0x90,0x42, + 0x01,0xD3,0x6C,0x9A,0xD1,0x72,0x6C,0x99,0x40,0x1C,0x08,0x73,0x28,0x79,0x68,0x71, + 0x6F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xD4,0x07,0x00,0x20,0x40,0x00,0x00,0x20, + 0xCD,0xCC,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x93,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2,0x1E,0xFF,0x2F,0x31,0x00,0x20,0xA0,0xE3, + 0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x30,0xD1,0xE4, + 0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4,0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2,0x01,0x10,0xC0,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x42,0x21,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2,0x04,0x10,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x0F,0x48,0x0F,0x49,0x00,0x89, + 0x49,0x88,0x00,0x24,0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29,0x02,0xD0,0x0D,0x49, + 0x49,0x89,0x02,0xE0,0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18,0x0B,0x49,0xC9,0x6B, + 0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7,0xAD,0xFF,0x20,0x00, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x01,0x00,0x20,0x00,0x07,0x00,0x20, + 0x19,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0xD4,0x07,0x00,0x20,0xC0,0x90,0x00,0x40, + 0xF7,0xB5,0x24,0x4E,0x82,0xB0,0xB0,0x7F,0xF1,0x7F,0x00,0x02,0x08,0x43,0x01,0xF0, + 0x3B,0xFD,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x1E,0x48,0x01,0x78, + 0x1E,0x48,0x00,0x7F,0x00,0x29,0x02,0xD0,0x01,0xF0,0xDE,0xFC,0x01,0xE0,0x01,0xF0, + 0x03,0xFD,0x18,0x49,0x01,0x25,0x20,0x39,0x08,0x00,0xC0,0x30,0x01,0x90,0x05,0x20, + 0xC0,0x01,0x17,0x4F,0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62,0x01,0x98,0x80,0x68, + 0x38,0x62,0x00,0x98,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFC,0xF7, + 0xE1,0xF9,0x64,0x1E,0xF9,0xD5,0x02,0x20,0xF8,0x62,0x30,0x7F,0x01,0x00,0xFC,0xF7, + 0x4F,0xFA,0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7,0xFC,0xFE,0x00,0x28,0x01,0xD1, + 0x00,0x24,0x25,0x00,0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5,0x05,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00,0x11,0x07,0x00,0x20,0x60,0x06,0x00,0x20, + 0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x00,0xA0,0xA0,0xE3, + 0x75,0xDF,0x4D,0xE2,0x08,0x07,0x9F,0xE5,0x2C,0xA0,0x8D,0xE5,0x34,0xA0,0x8D,0xE5, + 0x30,0xA0,0x8D,0xE5,0x18,0xA0,0x8D,0xE5,0x24,0xA0,0x8D,0xE5,0x20,0xA0,0x8D,0xE5, + 0x1C,0xA0,0x8D,0xE5,0xD0,0x01,0x8D,0xE5,0x00,0x10,0xA0,0xE3,0x28,0xA0,0x8D,0xE5, + 0x10,0xA0,0x8D,0xE5,0x0C,0xA0,0x8D,0xE5,0x08,0xA0,0x8D,0xE5,0x04,0xA0,0x8D,0xE5, + 0xB0,0x1C,0xC0,0xE1,0xD0,0x01,0x9D,0xE5,0xC8,0x46,0x9F,0xE5,0xB2,0x1C,0xC0,0xE1, + 0xD0,0x01,0x9D,0xE5,0x0A,0x50,0xA0,0xE1,0xB4,0x1C,0xC0,0xE1,0x0A,0x70,0xA0,0xE1, + 0x0A,0x80,0xA0,0xE1,0x0A,0x90,0xA0,0xE1,0x30,0x20,0xA0,0xE3,0x88,0x00,0x84,0xE2, + 0x91,0xFF,0xFF,0xEB,0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xB8,0x00,0x84,0xE2, + 0x8D,0xFF,0xFF,0xEB,0x00,0x60,0xA0,0xE3,0x60,0x10,0xA0,0xE3,0x56,0x0F,0x8D,0xE2, + 0xB8,0x6E,0xC4,0xE1,0x65,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0xF8,0x00,0x8D,0xE2, + 0x62,0xFF,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x98,0x00,0x8D,0xE2,0x5F,0xFF,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0x38,0x00,0x8D,0xE2,0x5C,0xFF,0xFF,0xEB,0x58,0x06,0x9F,0xE5, + 0x00,0x10,0xD0,0xE5,0x54,0x06,0x9F,0xE5,0x00,0x00,0x51,0xE3,0xCC,0x01,0x8D,0xE5, + 0x04,0x00,0x00,0x0A,0xF8,0x0A,0xD0,0xE1,0xBC,0x01,0x8D,0xE5,0xCC,0x01,0x9D,0xE5, + 0xB6,0x0A,0xD0,0xE1,0x04,0x00,0x00,0xEA,0x34,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xF6,0x12,0xD0,0xE1,0xBC,0x11,0x8D,0xE5,0xB4,0x02,0xD0,0xE1,0xB8,0x01,0x8D,0xE5, + 0xB6,0x00,0xD4,0xE1,0xCC,0x11,0x9D,0xE5,0x40,0x00,0x10,0xE3,0xB0,0xB8,0xD1,0x01, + 0xB0,0x18,0xD1,0x11,0x01,0x08,0xE0,0xE3,0x81,0xB0,0x00,0x10,0x8B,0x00,0x00,0xE0, + 0x00,0x16,0x9F,0xE5,0x14,0x00,0x8D,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00,0xC1,0xE5, + 0xF4,0x15,0x9F,0xE5,0x00,0x30,0xA0,0xE1,0x00,0x00,0x81,0xE5,0xEC,0x15,0x9F,0xE5, + 0x00,0x20,0xA0,0xE1,0x00,0x00,0x81,0xE5,0xE4,0x15,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xC0,0x05,0x9F,0xE5,0xBC,0x00,0xD0,0xE1,0xC8,0x01,0x8D,0xE5,0x00,0x10,0xA0,0xE3, + 0xD0,0x05,0x9F,0xE5,0xD0,0xC5,0x9F,0xE5,0x83,0x00,0x80,0xE0,0xC4,0x01,0x8D,0xE5, + 0xB0,0x00,0xD0,0xE1,0x83,0xC0,0x8C,0xE0,0xB0,0xC0,0xDC,0xE1,0x00,0x0A,0xA0,0xE1, + 0x20,0x0A,0xA0,0xE1,0x0F,0xCA,0xCC,0xE3,0x0C,0x40,0x40,0xE0,0x06,0x00,0x54,0xE1, + 0x04,0x60,0xA0,0xC1,0x34,0x10,0x8D,0xC5,0x30,0x20,0x8D,0xC5,0x64,0x00,0x54,0xE3, + 0x00,0x00,0x4C,0xE0,0x0C,0xC0,0x9D,0xC5,0x01,0xC0,0x8C,0xC2,0x0C,0xC0,0x8D,0xC5, + 0x64,0x00,0x50,0xE3,0x08,0xC0,0x9D,0xC5,0x01,0xC0,0x8C,0xC2,0x08,0xC0,0x8D,0xC5, + 0xC8,0xC1,0x9D,0xE5,0xFA,0x0F,0x5C,0xE3,0x4B,0xCF,0xA0,0x93,0x04,0x00,0x00,0x9A, + 0x77,0xEF,0xA0,0xE3,0x01,0xEB,0x8E,0xE2,0x0E,0x00,0x5C,0xE1,0x7D,0xCF,0xA0,0x83, + 0x19,0xCE,0xA0,0x93,0x0C,0x00,0x54,0xE1,0x04,0xC0,0x9D,0xC5,0xF8,0xE0,0x8D,0xE2, + 0x01,0xC0,0x8C,0xC2,0x04,0xC0,0x8D,0xC5,0x01,0xC1,0x9E,0xE7,0x00,0x00,0x54,0xE3, + 0x00,0x40,0xA0,0xB3,0x04,0xC0,0x8C,0xE0,0x01,0xC1,0x8E,0xE7,0x56,0xEF,0x8D,0xE2, + 0x02,0xC1,0x9E,0xE7,0x00,0x00,0x50,0xE3,0x04,0xC0,0x8C,0xE0,0x02,0xC1,0x8E,0xE7, + 0x38,0xE0,0x8D,0xE2,0x01,0xC1,0x9E,0xE7,0x00,0x00,0xA0,0xB3,0x00,0xC0,0x8C,0xE0, + 0x01,0xC1,0x8E,0xE7,0x98,0xE0,0x8D,0xE2,0x02,0xC1,0x9E,0xE7,0x0B,0x00,0x50,0xE1, + 0x00,0xC0,0x8C,0xE0,0x02,0xC1,0x8E,0xE7,0x01,0xC0,0x85,0xC2,0x01,0x58,0xCC,0xC3, + 0x0B,0x00,0x54,0xE1,0x01,0xC0,0x87,0xC2,0x01,0x78,0xCC,0xC3,0x14,0xC0,0x9D,0xE5, + 0x0C,0x00,0x50,0xE1,0x01,0xC0,0x88,0xC2,0x01,0x88,0xCC,0xC3,0x14,0xC0,0x9D,0xE5, + 0x0C,0x00,0x54,0xE1,0x01,0xC0,0x89,0xC2,0x01,0x98,0xCC,0xC3,0x10,0xC0,0x9D,0xE5, + 0x96,0x00,0x50,0xE3,0x00,0xC0,0x8C,0xE0,0x10,0xC0,0x8D,0xE5,0x03,0x00,0x00,0xDA, + 0xA8,0x04,0x9F,0xE5,0xB0,0xC0,0xD0,0xE1,0x01,0xC0,0x8C,0xE2,0xB0,0xC0,0xC0,0xE1, + 0xC4,0x01,0x9D,0xE5,0x01,0x10,0x81,0xE2,0xB0,0x40,0xC0,0xE1,0xBC,0x01,0x9D,0xE5, + 0x0E,0x00,0x51,0xE3,0x04,0x00,0x80,0xE0,0x00,0xA0,0x8A,0xE0,0x01,0x30,0x83,0xE2, + 0xA6,0xFF,0xFF,0x3A,0x01,0x20,0x82,0xE2,0x15,0x00,0x52,0xE3,0xA2,0xFF,0xFF,0x3A, + 0x54,0x14,0x9F,0xE5,0x38,0x00,0x9D,0xE5,0x00,0x00,0x81,0xE5,0x4C,0x14,0x9F,0xE5, + 0x68,0x00,0x9D,0xE5,0x00,0x00,0x81,0xE5,0x44,0x04,0x9F,0xE5,0x6C,0x10,0x9D,0xE5, + 0x00,0x10,0x80,0xE5,0x0C,0x00,0x9D,0xE5,0xD0,0x11,0x9D,0xE5,0xB0,0x0C,0xC1,0xE1, + 0x08,0x00,0x9D,0xE5,0xD0,0x11,0x9D,0xE5,0xB2,0x0C,0xC1,0xE1,0xD0,0x01,0x9D,0xE5, + 0x04,0x10,0x9D,0xE5,0xB4,0x1C,0xC0,0xE1,0xDB,0xFA,0xFF,0xEB,0x00,0x04,0x9F,0xE5, + 0xF0,0x13,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xC1,0xE1, + 0xB0,0x00,0xD4,0xE1,0x01,0x00,0x10,0xE3,0x07,0x00,0x00,0x0A,0xB8,0x01,0x9D,0xE5, + 0x9A,0x00,0x02,0xE0,0xF8,0x03,0x9F,0xE5,0x90,0x32,0x82,0xE0,0x22,0x06,0xA0,0xE1, + 0xB4,0x20,0xD4,0xE1,0x00,0x00,0x52,0xE1,0xBE,0x00,0xC1,0x81,0xE4,0xA3,0x9F,0xE5, + 0x00,0x00,0xA0,0xE3,0x56,0xCF,0x8D,0xE2,0x01,0xE0,0xA0,0xE1,0x08,0x20,0xD4,0xE5, + 0x00,0x11,0x9C,0xE7,0x92,0x01,0x01,0xE0,0x9A,0x31,0x82,0xE0,0xA2,0x34,0xA0,0xE1, + 0xB0,0x21,0xD4,0xE1,0x02,0x00,0x53,0xE1,0x9A,0x21,0x81,0x90,0xA1,0x24,0xA0,0x91, + 0x09,0x30,0xD4,0xE5,0x98,0x10,0x8D,0xE2,0x00,0x11,0x91,0xE7,0x91,0x03,0x03,0xE0, + 0x9A,0xB3,0x81,0xE0,0xA1,0xB4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x5B,0xE1, + 0x9A,0x33,0x81,0x90,0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1, + 0x80,0x30,0x8E,0xE0,0x01,0x00,0x80,0xE2,0x92,0x01,0x01,0xE0,0x01,0x18,0xA0,0xE1, + 0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0,0x02,0x21,0x82,0xE0,0x81,0x13,0x82,0xE0, + 0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0,0x15,0x00,0x50,0xE3,0xB8,0x18,0xC3,0xE1, + 0xDD,0xFF,0xFF,0x3A,0x50,0xC3,0x9F,0xE5,0x00,0xA0,0xA0,0xE3,0xF8,0x30,0x8D,0xE2, + 0x0A,0x10,0xD4,0xE5,0x0A,0x01,0x93,0xE7,0x90,0x01,0x01,0xE0,0x9C,0x21,0x80,0xE0, + 0xA0,0x25,0xA0,0xE1,0xB4,0x01,0xD4,0xE1,0x00,0x00,0x52,0xE1,0x9C,0x11,0x80,0x90, + 0x0B,0x20,0xD4,0xE5,0x38,0x10,0x8D,0xE2,0x0A,0x11,0x91,0xE7,0xA0,0x05,0xA0,0x91, + 0x92,0x01,0x01,0xE0,0x9C,0xB1,0x82,0xE0,0xA2,0xB5,0xA0,0xE1,0xB6,0x21,0xD4,0xE1, + 0x02,0x00,0x5B,0xE1,0x9C,0x21,0x81,0x90,0xA1,0x25,0xA0,0x91,0xBE,0x10,0xD4,0xE1, + 0x02,0x00,0x40,0xE0,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x9C,0x12,0x9F,0xE5,0x8A,0x10,0x81,0xE0,0x01,0xA0,0x8A,0xE2, + 0x0D,0x00,0x5A,0xE3,0xB8,0x0B,0xC1,0xE1,0xDC,0xFF,0xFF,0x3A,0x0A,0x10,0xD4,0xE5, + 0x0A,0x01,0x93,0xE7,0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0xAC,0x12,0x9F,0xE5, + 0x15,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0,0xC0,0x11,0x8D,0xE5,0x95,0xEC,0xFF,0xEB, + 0xB4,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x00,0xB0,0xA0,0x91,0x01,0xB0,0xA0,0x81, + 0x0B,0x10,0xD4,0xE5,0x38,0x00,0x8D,0xE2,0x0A,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0, + 0xC0,0x11,0x9D,0xE5,0x8B,0xEC,0xFF,0xEB,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1, + 0x01,0x00,0xA0,0x81,0xBE,0x10,0xD4,0xE1,0x00,0x00,0x4B,0xE0,0x24,0x42,0x9F,0xE5, + 0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0, + 0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0, + 0x8A,0x10,0x84,0xE0,0x00,0x00,0x56,0xE3,0xB8,0x0B,0xC1,0xE1,0x0C,0x00,0x00,0xDA, + 0x34,0x00,0x9D,0xE5,0x80,0x00,0x84,0xE0,0xB8,0x1B,0xD0,0xE1,0x30,0x00,0x9D,0xE5, + 0x80,0x00,0x84,0xE0,0xB8,0x08,0xD0,0xE1,0x01,0x00,0x80,0xE0,0x00,0x00,0x46,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB8,0x0E,0xC4,0xE1,0x00,0x00,0xA0,0x43, + 0xB8,0x0E,0xC4,0x41,0x11,0x10,0xA0,0xE3,0x10,0x00,0x9D,0xE5,0x01,0x1C,0x81,0xE2, + 0x68,0xEC,0xFF,0xEB,0xB6,0x10,0xD4,0xE1,0x40,0x00,0x11,0xE3,0x0E,0x00,0x00,0x0A, + 0x87,0x00,0x55,0xE1,0x01,0x20,0xA0,0x83,0x28,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x24,0x00,0x8D,0x85,0x23,0x00,0x58,0xE3,0x01,0x00,0xA0,0x83, + 0x20,0x00,0x8D,0x85,0x23,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33,0x1C,0x00,0x8D,0x35, + 0x14,0x00,0x55,0xE3,0x11,0x00,0x00,0x9A,0x0E,0x00,0x00,0xEA,0x07,0x00,0x55,0xE1, + 0x08,0x00,0x55,0x83,0x01,0x20,0xA0,0x83,0x28,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x24,0x00,0x8D,0x85,0x14,0x00,0x58,0xE3,0x01,0x00,0xA0,0x83, + 0x20,0x00,0x8D,0x85,0x14,0x00,0x59,0xE3,0x01,0x00,0xA0,0x33,0x1C,0x00,0x8D,0x35, + 0x0A,0x00,0x55,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x18,0x00,0x8D,0xE5, + 0xF1,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3,0x03,0x00,0x00,0x1A,0x50,0x01,0x9F,0xE5, + 0x00,0x00,0xD0,0xE5,0x01,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0xF2,0x00,0xD4,0xE5, + 0xFA,0x00,0x50,0xE3,0x06,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x03,0x00,0x00,0xEA, + 0xF2,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2, + 0xF2,0x00,0xC4,0xE5,0x28,0x00,0x9D,0xE5,0x24,0x20,0x9D,0xE5,0x1C,0x30,0x9D,0xE5, + 0x02,0x00,0x80,0xE1,0x20,0x20,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x03,0x20,0x02,0xE0, + 0x00,0x20,0x82,0xE1,0x18,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03, + 0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1,0x00,0x00,0x50,0xE3,0xF2,0x00,0xD4,0x15, + 0x05,0x00,0x50,0x13,0x02,0x00,0x00,0x8A,0x2C,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x07,0x00,0x00,0x0A,0xEC,0x00,0x94,0xE5,0x01,0x00,0x80,0xE2,0xEC,0x00,0x84,0xE5, + 0xF0,0x00,0xD4,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xF0,0x00,0xC4,0x15, + 0x0D,0x00,0x00,0xEA,0xF0,0x00,0xD4,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0xF0,0x00,0xC4,0xE5,0xCC,0x11,0x9D,0xE5,0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1, + 0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC4,0xE5,0xEC,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xEC,0x00,0x84,0xC5,0xF2,0x00,0xD4,0xE5, + 0x0A,0x00,0x50,0xE3,0x75,0xDF,0x8D,0x22,0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21, + 0xEC,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0xA0,0xC3,0xEC,0x00,0x84,0xC5, + 0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC4,0xE5,0x75,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x40,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x19,0x07,0x00,0x20, + 0x00,0x95,0x00,0x00,0xD4,0x07,0x00,0x20,0x50,0x07,0x00,0x20,0x44,0x07,0x00,0x20, + 0x48,0x07,0x00,0x20,0x4C,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10, + 0x1C,0x07,0x00,0x20,0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D,0x2D,0x34,0xA9,0xF9, + 0x00,0x93,0x00,0x00,0x40,0x07,0x00,0x20,0x10,0xB5,0x16,0x4C,0xE0,0x7B,0x00,0x28, + 0x07,0xD1,0xFC,0xF7,0xA1,0xF8,0x00,0x28,0x0F,0xD0,0xFD,0xF7,0x87,0xFA,0x01,0x20, + 0x0A,0xE0,0x01,0x28,0x0C,0xD1,0xFC,0xF7,0xA1,0xF8,0x00,0x28,0x05,0xD0,0xFC,0xF7, + 0x2F,0xFF,0x00,0xF0,0x59,0xFB,0x02,0x20,0xE0,0x73,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x02,0x28,0x07,0xD1,0xFC,0xF7,0x3C,0xFA,0x00,0x28,0xF6,0xD0,0xFD,0xF7,0xE4,0xF8, + 0x03,0x20,0xF1,0xE7,0x03,0x28,0xF0,0xD1,0x03,0x48,0xC0,0x68,0xC0,0x07,0xEC,0xD0, + 0x04,0x20,0xE9,0xE7,0x0C,0x07,0x00,0x20,0x00,0x90,0x00,0x40,0xF0,0xB5,0xCF,0x48, + 0x89,0xB0,0x00,0x68,0x00,0x25,0x80,0x79,0x2C,0x00,0x02,0x90,0xCC,0x48,0x42,0x79, + 0x06,0x00,0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xB3,0x7A, + 0x00,0x7A,0xFE,0xF7,0x9A,0xFB,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7,0x8A,0xFB, + 0x31,0x00,0x20,0x39,0x0A,0x7A,0x00,0x06,0xC0,0x39,0x09,0x79,0x00,0x0E,0xFE,0xF7, + 0x85,0xFB,0x31,0x00,0x80,0x39,0x8A,0x7D,0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E, + 0xFE,0xF7,0x7C,0xFB,0xBB,0x4E,0x07,0x06,0x70,0x7B,0x3F,0x0E,0x00,0x28,0x02,0xD0, + 0xB9,0x48,0x40,0x89,0x07,0xE0,0xB5,0x48,0xB8,0x49,0x00,0x68,0x49,0x88,0x40,0x88, + 0x40,0x18,0x00,0x04,0x00,0x0C,0x03,0x90,0x00,0x20,0x70,0x61,0x0F,0x20,0x30,0x71, + 0x70,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xA0,0xFB, + 0x01,0xF0,0x8E,0xFB,0x01,0x20,0x30,0x62,0xFC,0xF7,0x3C,0xFC,0x00,0x20,0xF0,0x70, + 0x00,0xF0,0xA0,0xF9,0xFC,0xF7,0xAA,0xFE,0xA9,0x48,0x08,0x90,0xA7,0x48,0xC0,0x38, + 0x07,0x90,0xA3,0x48,0xE0,0x38,0x06,0x90,0xA6,0x48,0xFF,0x1C,0x05,0x97,0x04,0x90, + 0x0F,0xE1,0x78,0x7A,0x00,0x28,0x04,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0x7F,0xFB,0xFF,0x20,0x81,0x30,0xFB,0xF7,0x79,0xFA,0x03,0x20,0x01,0xF0,0xF4,0xF9, + 0xFC,0xF7,0x56,0xFC,0xFC,0xF7,0x38,0xFC,0x99,0x4E,0xC0,0x3E,0xF0,0x88,0x01,0x06, + 0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20, + 0x01,0xF0,0xA8,0xF8,0xFC,0xF7,0xE4,0xFE,0x91,0x48,0xA0,0x30,0x01,0x89,0x03,0x98, + 0x08,0x18,0xB1,0x89,0x88,0x42,0x10,0xD9,0x8F,0x48,0x40,0x7A,0x00,0x28,0x0C,0xD1, + 0xF0,0x88,0xFF,0x21,0x19,0x31,0x08,0x42,0x07,0xD1,0x02,0x98,0x64,0x1C,0x84,0x42, + 0x04,0xDD,0xFC,0xF7,0xD5,0xFE,0x01,0x25,0x00,0xE0,0x00,0x24,0x00,0xF0,0x8A,0xFE, + 0x01,0xF0,0x76,0xF8,0x00,0xF0,0x12,0xFE,0x00,0xF0,0x6E,0xFE,0x7E,0x49,0x08,0x98, + 0x20,0x39,0x49,0x88,0xC0,0x6A,0x88,0x42,0x01,0xDB,0x01,0x20,0x78,0x70,0x00,0x2D, + 0x02,0xD0,0xFC,0xF7,0x4B,0xFE,0x00,0x25,0xFC,0xF7,0x30,0xFE,0x00,0x20,0xFC,0xF7, + 0x9F,0xFE,0xFC,0xF7,0x67,0xFE,0x01,0x20,0x00,0x26,0xF8,0x73,0x3E,0x82,0xFD,0xF7, + 0xB5,0xFF,0x00,0x28,0x08,0xD0,0x7E,0x61,0x04,0x98,0x80,0x7E,0xC8,0x28,0x11,0xD2, + 0x04,0x99,0x40,0x1C,0x88,0x76,0x0D,0xE0,0x78,0x69,0x40,0x1C,0x78,0x61,0x78,0x69, + 0x01,0x28,0x02,0xD1,0x6B,0x48,0x20,0x30,0x86,0x75,0x78,0x69,0x05,0x28,0x01,0xD9, + 0xFC,0xF7,0xB0,0xFB,0x78,0x78,0x00,0x28,0x02,0xD0,0xFC,0xF7,0xBD,0xFB,0x20,0xE0, + 0x66,0x48,0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0,0xC1,0x68, + 0x07,0x29,0x04,0xD1,0xC0,0x68,0x01,0x21,0x49,0x07,0xC8,0x63,0x0E,0xE0,0x00,0xF0, + 0x3D,0xFA,0x0B,0xE0,0x01,0xF0,0x7A,0xF8,0xB8,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7, + 0xCD,0xFC,0x00,0xF0,0x79,0xF9,0x01,0xE0,0xFF,0xF7,0xCE,0xFE,0xF8,0x7B,0x03,0x28, + 0xFA,0xD1,0xFC,0xF7,0xF7,0xFE,0x78,0x78,0x00,0x28,0x1B,0xD0,0x54,0x48,0x01,0x21, + 0xC0,0x7F,0x40,0x08,0x01,0xF0,0x9E,0xF8,0x4A,0x48,0x00,0x21,0x41,0x70,0x4C,0x48, + 0x08,0x23,0xC0,0x38,0xC2,0x88,0x9A,0x43,0xC2,0x80,0xC2,0x88,0x5B,0x01,0x9A,0x43, + 0xC2,0x80,0xC2,0x88,0x10,0x23,0x9A,0x43,0xC2,0x80,0x07,0x98,0x41,0x70,0x08,0x98, + 0xC1,0x62,0x54,0xE0,0x06,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x78,0x7B,0x00,0x28, + 0x01,0xD1,0x00,0xF0,0xD3,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28,0x46,0xD1, + 0x03,0x20,0x01,0xF0,0x0B,0xF9,0xF8,0x62,0x03,0x20,0x01,0xF0,0x39,0xF9,0xFF,0x20, + 0x81,0x30,0xFB,0xF7,0xA3,0xF9,0x3B,0x48,0x00,0x78,0xB9,0x79,0x08,0x43,0x30,0xD1, + 0xB8,0x6A,0x07,0x00,0x2D,0xD0,0x2F,0x48,0xC0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43, + 0x35,0x49,0xFA,0xF7,0x57,0xFE,0x3F,0x1A,0x32,0x2F,0x22,0xDD,0x00,0xF0,0x96,0xF8, + 0x38,0x00,0x01,0xF0,0xA3,0xFA,0x01,0xF0,0xA7,0xFA,0x26,0x48,0xC0,0x79,0x00,0x28, + 0x0D,0xD0,0x00,0xF0,0x69,0xF8,0x00,0xF0,0x6C,0xF8,0x00,0xF0,0x74,0xF8,0x2B,0x4F, + 0x01,0x20,0x78,0x60,0xFB,0xF7,0x8A,0xF9,0x29,0x48,0x78,0x60,0x03,0xE0,0x29,0x48, + 0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0x96,0xFA,0x26,0x48,0x06,0x70,0x00,0xF0, + 0x81,0xF8,0x18,0x4F,0x78,0x69,0x05,0x99,0x88,0x42,0x00,0xD2,0xE9,0xE6,0x15,0x4D, + 0x05,0x24,0xE8,0x78,0x00,0x28,0x12,0xD0,0xFC,0xF7,0xF2,0xFD,0xFC,0xF7,0x26,0xFE, + 0x03,0xE0,0xFC,0xF7,0x9F,0xFD,0xFC,0xF7,0x75,0xFE,0x20,0x00,0x64,0x1E,0x24,0x06, + 0x24,0x0E,0x00,0x28,0xF5,0xD1,0xFC,0xF7,0xDB,0xFD,0x00,0x20,0xE8,0x70,0x07,0x48, + 0x00,0x68,0x40,0x30,0x41,0x7D,0x07,0x98,0x41,0x70,0x68,0x7A,0x00,0x28,0x01,0xD0, + 0x01,0xF0,0x46,0xFA,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xD4,0x07,0x00,0x20, + 0x60,0x94,0x00,0x00,0x0C,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0x00,0x07,0x00,0x20, + 0x00,0x01,0x00,0x20,0xA0,0x03,0x00,0x20,0x00,0x02,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x93,0x00,0x00,0xD9,0x07,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xD8,0x07,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22, + 0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60, + 0x70,0x47,0x10,0x20,0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43, + 0x41,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B, + 0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00,0x10,0xB5,0xFC,0xF7, + 0x05,0xFD,0xFA,0xF7,0xE9,0xFD,0x03,0x20,0x40,0x03,0xFB,0xF7,0xEF,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFB,0xF7,0xEF,0xF8,0xFA,0xF7, + 0xE5,0xFD,0xFC,0xF7,0xFB,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0x0F,0xFC,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFB,0xF7, + 0x0B,0xF8,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1, + 0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5,0xA0,0xB0,0x9F,0xE5, + 0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2,0x14,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3, + 0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0, + 0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1, + 0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A, + 0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA, + 0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3, + 0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3, + 0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1, + 0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A, + 0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0x50,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0xFD,0xF7,0x2B,0xFC,0x06,0x00, + 0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7A,0xD0,0x4F,0x48,0x00,0x21,0x01,0x70, + 0x02,0x20,0x00,0xF0,0xED,0xFF,0x4D,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x1A,0xFD, + 0x01,0x00,0x02,0x20,0x00,0xF0,0xD0,0xFF,0x49,0x4F,0xB8,0x7A,0x00,0x28,0x00,0xD0, + 0x6D,0x1C,0x38,0x7A,0x00,0x28,0x04,0xD1,0x46,0x49,0x48,0x69,0x0A,0x15,0x10,0x43, + 0x48,0x61,0x00,0xF0,0x93,0xF8,0x44,0x48,0x01,0x68,0x44,0x48,0xC1,0x61,0x02,0x24, + 0x20,0x00,0x00,0xF0,0xC1,0xFF,0x42,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60, + 0xB9,0x7A,0x02,0x04,0x1D,0xE0,0x3D,0x48,0x43,0x69,0x5B,0x06,0x0A,0xD4,0x00,0x29, + 0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA3,0x00,0x9B,0x18,0x1B,0x68,0xC3,0x61,0x00,0xE0, + 0xC6,0x61,0x64,0x1C,0x30,0x48,0x00,0x78,0x00,0x28,0x0A,0xD0,0xFD,0xF7,0x08,0xFD, + 0x78,0x7A,0x00,0x28,0x07,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x20,0xF9, + 0x01,0xE0,0xAC,0x42,0xDF,0xD9,0x02,0x20,0x00,0xF0,0xA2,0xFF,0x26,0x4C,0x20,0x78, + 0x00,0x28,0x38,0xD1,0xFD,0xF7,0x0E,0xFC,0x00,0x28,0x34,0xD0,0x23,0x48,0x0A,0x21, + 0x00,0x6B,0xFA,0xF7,0xC7,0xFC,0x01,0x00,0x02,0x20,0x00,0xF0,0x7D,0xFF,0x02,0x20, + 0x00,0xF0,0x82,0xFF,0x0C,0xE0,0x20,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7,0xE0,0xFC, + 0x78,0x7A,0x00,0x28,0x04,0xD0,0x38,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xF8,0xF8, + 0xFD,0xF7,0xF0,0xFB,0x00,0x28,0xEE,0xD1,0x18,0x48,0x41,0x68,0x41,0x60,0x0C,0xE0, + 0x1E,0xE0,0x21,0x78,0x00,0x29,0x08,0xD0,0x78,0x7A,0x00,0x28,0x08,0xD0,0x38,0x6B, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0xE4,0xF8,0x02,0xE0,0x41,0x68,0xC9,0x03,0xF0,0xD5, + 0x02,0x20,0x00,0xF0,0x65,0xFF,0x00,0xF0,0x21,0xF8,0x0D,0x49,0xC8,0x68,0x01,0x22, + 0x10,0x43,0xC8,0x60,0x38,0x7A,0x00,0x28,0x02,0xD1,0x08,0x15,0xFA,0xF7,0xC6,0xFF, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD9,0x07,0x00,0x20,0x00,0x93,0x00,0x00, + 0x0C,0x07,0x00,0x20,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21, + 0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0xD1,0xFE,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x10,0xB5,0x01,0x20,0xFC,0xF7,0x5A,0xFC, + 0x01,0x20,0xFC,0xF7,0x15,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x40,0x18,0x70,0x47, + 0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18, + 0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07, + 0x18,0x68,0x13,0x4A,0x90,0x71,0x90,0x79,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0, + 0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x30,0x22,0x00,0x21, + 0x08,0x30,0xFF,0xF7,0x11,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x0D,0x25, + 0x08,0x4C,0xED,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00, + 0x3F,0x19,0x7F,0x19,0x40,0x1C,0xBE,0x60,0x96,0x79,0x86,0x42,0xF3,0xD8,0xEA,0xE7, + 0xC0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x70,0xB5,0x1E,0x4A,0x1E,0x48,0x1C,0x4C, + 0x85,0x18,0x21,0x7A,0xDB,0x22,0x92,0x00,0x86,0x18,0x00,0x29,0x0F,0xD0,0x21,0x00, + 0x82,0x22,0x0C,0x31,0x28,0x00,0xFE,0xF7,0xB3,0xFF,0x18,0x49,0x0D,0x22,0x30,0x00, + 0xFE,0xF7,0xAE,0xFF,0x20,0x7A,0x60,0x72,0x70,0xBC,0x08,0xBC,0x18,0x47,0x0D,0x22, + 0x00,0x21,0x30,0x00,0xFE,0xF7,0xD8,0xFF,0x82,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7, + 0xD3,0xFF,0x0E,0x48,0x82,0x22,0x00,0x21,0x8F,0x38,0xFE,0xF7,0xCD,0xFF,0x0B,0x48, + 0x0D,0x22,0x00,0x21,0x0D,0x38,0xFE,0xF7,0xC7,0xFF,0x00,0x20,0x06,0x49,0x60,0x72, + 0xA0,0x72,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x05,0x49,0x88,0x72,0xDB,0xE7, + 0x00,0x02,0x00,0x20,0x4E,0x02,0x00,0x00,0x40,0x00,0x00,0x20,0x9F,0x03,0x00,0x20, + 0x40,0x06,0x00,0x20,0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48, + 0x00,0x78,0x00,0x28,0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A, + 0x8C,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91, + 0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22, + 0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22, + 0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49, + 0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F, + 0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18, + 0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C, + 0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00, + 0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0xEB,0xFF,0x20,0x8C, + 0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08, + 0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98, + 0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x15,0x20,0x08,0x90, + 0x5D,0x48,0x0E,0x21,0x80,0x7B,0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21, + 0x01,0xE0,0x14,0x20,0x08,0x90,0x20,0x00,0xFA,0xF7,0x2C,0xFA,0x0A,0x99,0x08,0x1A, + 0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xFA,0xF7,0x24,0xFA,0x09,0x99,0x08,0x1A, + 0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD, + 0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B, + 0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00, + 0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19, + 0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xFA,0xF7, + 0xF9,0xF9,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28, + 0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7,0xEA,0xF9, + 0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98, + 0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68, + 0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC, + 0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD, + 0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99, + 0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xFA,0xF7,0xBC,0xF9,0x86,0x19,0x03,0x98, + 0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0, + 0x60,0x00,0x80,0x1B,0x64,0x21,0xFA,0xF7,0xAD,0xF9,0x07,0x99,0x89,0x07,0x09,0xD5, + 0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A, + 0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E, + 0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A, + 0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x23,0xFF,0x13,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0x19,0x07,0x00,0x20, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0x40,0x06,0x00,0x20,0xFF,0xB5,0x00,0x68, + 0x8E,0x46,0x84,0x46,0x70,0x46,0x1B,0x4B,0x1B,0x49,0x05,0x68,0x00,0x22,0x19,0x4E, + 0x54,0x00,0x24,0x3E,0x34,0x5B,0x66,0x46,0x00,0x20,0x34,0x1B,0x26,0x00,0x74,0x43, + 0x46,0x00,0x9E,0x5B,0xAE,0x1B,0x37,0x00,0x77,0x43,0xE6,0x19,0x8E,0x42,0x18,0xD2, + 0x51,0x00,0x10,0x4A,0x40,0x00,0x24,0x3A,0x52,0x5A,0x02,0x99,0x0A,0x60,0x0D,0x49, + 0x03,0x9A,0x16,0x39,0x0C,0x5A,0x14,0x60,0x09,0x5A,0x72,0x46,0x12,0x68,0x18,0x5A, + 0x51,0x18,0x09,0x1A,0x70,0x46,0x01,0x60,0x01,0x20,0x04,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x40,0x1C,0x0B,0x28,0xDB,0xD3,0x52,0x1C,0x07,0x2A,0xCF,0xD3,0x00,0x20, + 0xC0,0x43,0xF2,0xE7,0x94,0x72,0x00,0x00,0x11,0x02,0x00,0x00,0xFE,0xB5,0x69,0x4D, + 0x67,0x48,0x00,0x26,0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x7E,0xC1,0x31,0x08,0x7A, + 0x33,0x00,0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43, + 0x47,0x19,0x38,0x00,0xFF,0x30,0xD3,0x30,0xFD,0xF7,0x00,0xFC,0x00,0x28,0x17,0xD0, + 0x5D,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42,0x14,0xD3,0xA9,0x19,0x33,0x22, + 0x00,0x90,0xFF,0x20,0x52,0x01,0xCD,0x30,0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32, + 0x48,0x76,0x76,0x1C,0xCD,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x16,0xFA, + 0x64,0x1C,0x0D,0x2C,0xDA,0xDB,0x94,0xE0,0x49,0x7A,0x00,0x29,0x01,0xD1,0x00,0x28, + 0x78,0xD0,0x07,0x20,0xC0,0x01,0x00,0x24,0x2E,0x18,0x33,0x27,0x7F,0x01,0x28,0x19, + 0xC0,0x19,0x40,0x7E,0x00,0x28,0x3F,0xD0,0x0D,0x21,0x28,0x18,0x89,0x01,0x41,0x18, + 0xC9,0x7F,0x00,0x29,0x02,0xD0,0xB2,0x7D,0x00,0x2A,0x14,0xD0,0x1B,0x21,0x49,0x01, + 0x40,0x18,0x00,0x99,0x00,0x7B,0x49,0x1C,0x00,0x91,0x0A,0x21,0x48,0x43,0x3F,0x49, + 0x40,0x19,0x42,0x18,0x02,0x20,0x03,0x23,0x69,0x46,0x00,0xF0,0xE7,0xF9,0x20,0x00, + 0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43,0x48,0x19,0x02,0x90,0xFF,0x30, + 0xD3,0x30,0xFD,0xF7,0xAB,0xFB,0x00,0x28,0x13,0xD0,0x00,0x98,0x02,0x9A,0x40,0x1C, + 0xFF,0x32,0x00,0x90,0xCD,0x32,0x03,0x20,0x02,0x23,0x69,0x46,0x00,0xF0,0xCE,0xF9, + 0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x7E,0x40,0x1C,0x4A,0x76,0x0C,0x28,0xF8,0xDB, + 0x64,0x1E,0x64,0x1C,0x0C,0x2C,0xBA,0xDB,0x01,0x24,0x26,0x49,0x0D,0x20,0x0A,0x19, + 0x80,0x01,0x10,0x18,0xC0,0x7F,0x00,0x22,0x01,0x92,0x00,0x28,0x32,0xD0,0xB2,0x7D, + 0x00,0x2A,0x2F,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18,0x28,0x00,0xFF,0x30,0xD3,0x30, + 0xFD,0xF7,0x7C,0xFB,0x00,0x28,0x25,0xD0,0x1B,0x48,0x00,0x9B,0x80,0x7B,0x5B,0x1C, + 0x98,0x42,0x26,0xD3,0x17,0x4A,0x00,0x20,0x11,0x18,0xC9,0x19,0x49,0x7E,0xA1,0x42, + 0x0C,0xD0,0x00,0x29,0x07,0xD1,0xFF,0x21,0xCD,0x31,0x49,0x5D,0x10,0x18,0xC0,0x19, + 0x41,0x76,0x06,0xE0,0x12,0xE0,0x40,0x1C,0x0C,0x28,0xED,0xDB,0x01,0x98,0x00,0x28, + 0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0xCD,0x32,0x03,0x20,0x01,0x23,0x69,0x46, + 0x00,0xF0,0x84,0xF9,0x64,0x1C,0x0D,0x2C,0xBF,0xDB,0x02,0xE0,0x01,0x20,0x40,0x07, + 0x43,0x60,0x00,0x98,0x00,0xF0,0x78,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xA0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0x4E,0x02,0x00,0x00, + 0xFC,0xB5,0x4E,0x48,0x36,0x25,0x45,0x5F,0x15,0x20,0x84,0x46,0x4B,0x48,0x4C,0x4F, + 0x80,0x30,0x82,0x7D,0x86,0x46,0x4B,0x48,0x00,0x26,0x81,0x7B,0x0E,0x24,0xC8,0x07, + 0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24,0x01,0xE0,0x14,0x20,0x84,0x46,0x00,0x21, + 0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A, + 0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2, + 0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3, + 0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42, + 0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3, + 0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48, + 0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A, + 0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04,0x12,0x14,0x25,0x48,0x80,0x30, + 0x81,0x6B,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C, + 0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x81,0x63,0x1E,0x49,0x80,0x31,0xC9,0x6B, + 0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29, + 0x01,0xDD,0x49,0x1E,0xC1,0x63,0x74,0x46,0xA4,0x8B,0x85,0x6B,0x01,0x22,0x11,0x00, + 0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0xC0,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22, + 0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A, + 0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0, + 0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28, + 0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x40,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x25,0x48, + 0x25,0x4C,0xC0,0x88,0x01,0x23,0x25,0x4D,0x41,0x06,0x09,0x20,0x80,0x01,0x24,0x4F, + 0x24,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29,0x10,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69, + 0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60, + 0x80,0x6B,0x28,0x61,0x1C,0x48,0xA8,0x62,0xE0,0x6A,0x10,0xE0,0x1B,0x49,0x4A,0x69, + 0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62, + 0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0x15,0x48,0xA8,0x62,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0xB5,0xF8,0xB0,0x62,0x70,0x7B,0x00,0x28, + 0x04,0xD0,0x10,0x48,0xE8,0x60,0x03,0x20,0xC0,0x04,0x28,0x61,0x60,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0xA5,0xF8,0x70,0x62,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xC0,0x90,0x00,0x40, + 0x10,0x27,0x00,0x00,0x0C,0x07,0x00,0x20,0x00,0x00,0x08,0x84,0x80,0x94,0x00,0x00, + 0x00,0x00,0x04,0x82,0x41,0x20,0x01,0x00,0x07,0x48,0x41,0x7A,0x07,0x48,0x02,0x29, + 0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29,0x01,0xD1,0xC0,0x69,0x00,0xE0,0x80,0x69, + 0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00,0x00,0x02,0x00,0x20,0xC0,0x94,0x00,0x00, + 0xC0,0x90,0x00,0x40,0x0F,0x48,0x30,0xB4,0xC0,0x88,0x0F,0x4A,0x01,0x23,0x45,0x06, + 0x0E,0x48,0x0F,0x4C,0x00,0x21,0x1B,0x04,0x00,0x2D,0x02,0x61,0x07,0xDA,0x0C,0x4A, + 0x64,0x32,0x42,0x61,0x81,0x61,0xC1,0x61,0x03,0x62,0x44,0x62,0x06,0xE0,0x44,0x61, + 0x81,0x61,0xC1,0x61,0x03,0x62,0x06,0x4A,0x64,0x3A,0x42,0x62,0x81,0x62,0xC1,0x62, + 0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20,0x00,0x00,0x01,0x03,0x40,0xA1,0x00,0x40, + 0xC8,0x00,0x01,0x00,0x11,0x49,0x10,0xB4,0x0A,0x7D,0x11,0x48,0x82,0x73,0x4A,0x7D, + 0xC2,0x73,0x82,0x7B,0x0F,0x48,0xD3,0x07,0x0A,0xD0,0x93,0x07,0x0E,0x4A,0x03,0xD5, + 0x0D,0x23,0x03,0x77,0x00,0x23,0x02,0xE0,0x14,0x23,0x03,0x77,0x01,0x23,0x53,0x71, + 0x8A,0x7D,0x42,0x77,0xCA,0x7D,0x82,0x77,0x0A,0x7E,0xC2,0x77,0x4A,0x7E,0x05,0x48, + 0x20,0x30,0x02,0x70,0x89,0x7E,0x41,0x70,0x10,0xBC,0x70,0x47,0x00,0x93,0x00,0x00, + 0x40,0x06,0x00,0x20,0x60,0x06,0x00,0x20,0x0C,0x07,0x00,0x20,0xFF,0xB5,0x05,0x00, + 0x14,0x00,0x19,0x00,0x10,0x00,0x81,0xB0,0xFB,0xF7,0x24,0xF8,0x00,0x28,0x08,0xD0, + 0x02,0x98,0x02,0x99,0x00,0x68,0x40,0x1E,0x08,0x60,0x05,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x29,0x48,0x80,0x7B,0xC0,0x07,0x22,0xD0,0xE0,0x79,0x05,0x28,0x1D,0xD0, + 0x09,0x28,0x1D,0xD1,0x6D,0x08,0x6D,0x00,0x01,0x20,0x09,0x27,0x22,0x78,0x23,0x4E, + 0xBF,0x01,0x0F,0xE0,0x0A,0x23,0x01,0x00,0x59,0x43,0x21,0x4B,0xC9,0x18,0xC9,0x19, + 0x8B,0x7B,0x9A,0x42,0x05,0xD1,0x0B,0x8A,0x63,0x80,0xCB,0x7B,0x63,0x70,0x49,0x8A, + 0xA1,0x80,0x40,0x1C,0x71,0x7A,0x81,0x42,0xEC,0xDA,0x01,0xE0,0x01,0x20,0x05,0x43, + 0x0F,0x21,0xA8,0x07,0x89,0x06,0x88,0x43,0x21,0x78,0x62,0x78,0x09,0x07,0x89,0x08, + 0x08,0x43,0x14,0x49,0x92,0x06,0x08,0x40,0x61,0x88,0x12,0x0C,0x89,0x05,0x89,0x09, + 0x08,0x43,0x3F,0x21,0x89,0x02,0x88,0x43,0x10,0x43,0x02,0x04,0x92,0x0E,0x0F,0x2A, + 0x03,0xD9,0x88,0x43,0x0F,0x21,0x89,0x02,0x40,0x18,0xA1,0x88,0x80,0x0A,0x80,0x02, + 0x89,0x05,0x89,0x0D,0x08,0x43,0x02,0x99,0x01,0x22,0x09,0x68,0x52,0x07,0x89,0x00, + 0x89,0x18,0x48,0x60,0xA9,0xE7,0x00,0x00,0x40,0x06,0x00,0x20,0x00,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4,0x88,0x7B,0x00,0x28, + 0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28, + 0x08,0xD1,0x8A,0x72,0xCA,0x72,0x08,0x48,0x0A,0x73,0x0A,0x72,0x00,0x78,0x00,0x28, + 0x06,0xD1,0x4B,0x73,0x10,0xBC,0x70,0x47,0xCB,0x71,0x0A,0x72,0x4B,0x72,0xF9,0xE7, + 0x4A,0x73,0xF7,0xE7,0x0C,0x07,0x00,0x20,0xA0,0x95,0x00,0x00,0xF8,0xB5,0x06,0x9F, + 0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7, + 0x59,0xFE,0x38,0x80,0x21,0x00,0x30,0x00,0xF9,0xF7,0x54,0xFE,0x28,0x80,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42, + 0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB, + 0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91, + 0xF9,0xF7,0x38,0xFE,0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43, + 0xF9,0xF7,0x30,0xFE,0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79, + 0x14,0x4B,0x00,0x26,0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02, + 0x5B,0x07,0x09,0xD5,0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D, + 0x3A,0x43,0x64,0x00,0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79, + 0x80,0x00,0x9B,0x06,0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60, + 0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x72,0x06,0x73, + 0xF0,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0x40,0x06,0x00,0x20, + 0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06, + 0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B, + 0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x10,0xB4,0x0E,0x24,0x60,0x43,0x03,0x4B, + 0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06, + 0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D, + 0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x70,0xB4,0x12,0x4A,0x11,0x4D,0x52,0x7D, + 0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43,0x0E,0x22,0x50,0x43,0x0C,0x4B,0x86,0x18, + 0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0,0xEA,0x7D,0x8A,0x42,0x0A,0xD0,0x2A,0x7E, + 0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42,0x04,0xD0,0xAA,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C,0x86,0x42,0xEA,0xD8,0x70,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x70,0xB4,0x12,0x4A,0x11,0x4B,0x52,0x7D, + 0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43,0xFF,0x26,0x0D,0x4C,0x27,0x36,0x12,0xE0, + 0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42, + 0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00, + 0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42,0xEA,0xD3,0x70,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06,0x04,0x48,0x01,0xD5,0x40,0x68,0x00,0xE0, + 0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xC0,0x93,0x00,0x00, + 0x00,0x90,0x00,0x40,0x03,0x00,0xF0,0xB5,0x1F,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18, + 0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31,0x1A,0x4C,0x4F,0x6A,0x0E,0x6A,0x88,0x6A, + 0x00,0xF0,0xFA,0xFA,0x06,0x04,0x0A,0x14,0x1A,0x22,0x27,0x11,0xC8,0x68,0x20,0x62, + 0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62, + 0x03,0x20,0xE0,0x62,0x66,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x08,0x69,0x20,0x62, + 0x90,0x6B,0x60,0x62,0x03,0x20,0x04,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B,0x60,0x62, + 0x04,0x20,0xE0,0x62,0x67,0x63,0xEE,0xE7,0xFF,0x21,0x01,0x31,0x21,0x62,0x2A,0x21, + 0x02,0xE0,0x89,0x69,0x21,0x62,0x29,0x68,0x61,0x62,0x05,0x21,0xE1,0x62,0x60,0x63, + 0xE1,0xE7,0x00,0x00,0x80,0x90,0x00,0x40,0x00,0x93,0x00,0x00,0x01,0x21,0x49,0x07, + 0x48,0x68,0x00,0x23,0x00,0x04,0x00,0x0F,0x00,0x28,0x0B,0x4A,0x48,0x68,0x03,0xD0, + 0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E,0x01,0xD0,0x01,0x20, + 0x07,0xE0,0x10,0x79,0x00,0x28,0x02,0xD1,0x01,0x20,0x03,0x00,0x01,0xE0,0x0F,0x23, + 0x00,0x20,0x13,0x71,0x08,0x60,0x70,0x47,0x0C,0x07,0x00,0x20,0x0A,0x4A,0x10,0xB5, + 0xD1,0x88,0x0A,0x4B,0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43,0x08,0x48,0xD1,0x80, + 0x03,0xE0,0x07,0x48,0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60,0xFF,0xF7,0x16,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xD4,0x07,0x00,0x20, + 0xB0,0x94,0x00,0x00,0xFE,0xB5,0x04,0x00,0x37,0x48,0x0E,0x00,0x07,0x6A,0x41,0x6A, + 0x02,0x91,0x41,0x6B,0x01,0x91,0xC0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x72,0xFF, + 0xFB,0xF7,0xB6,0xFD,0x25,0x00,0x46,0xE0,0x68,0x1E,0x84,0x42,0x01,0xD1,0xFB,0xF7, + 0xE5,0xFD,0xFB,0xF7,0x5F,0xFD,0xFB,0xF7,0x35,0xFE,0x00,0x2E,0x2E,0xD1,0xA8,0x00, + 0x05,0x21,0xF9,0xF7,0xD7,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20, + 0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7,0xCC,0xFD,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21,0xF9,0xF7,0xC2,0xFD, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0,0x05,0x21,0x28,0x00, + 0xF9,0xF7,0xB8,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x10,0x00,0x02,0xE0, + 0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7,0x03,0xFB,0x0C,0xE0,0x68,0x00,0x03,0x21, + 0xF9,0xF7,0xA8,0xFD,0xA0,0x42,0xDB,0xD9,0x03,0x21,0x28,0x00,0xF9,0xF7,0xA2,0xFD, + 0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2,0x0C,0x48,0x44,0x88,0x03,0xE0, + 0xFB,0xF7,0x18,0xFD,0xFB,0xF7,0xEE,0xFD,0x64,0x1E,0xF9,0xD2,0xFB,0xF7,0x58,0xFD, + 0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63,0x00,0x99,0xC1,0x62, + 0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40,0xE0,0x95,0x00,0x00, + 0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07, + 0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5, + 0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60, + 0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0x02,0x49,0x00,0x03, + 0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xD9,0x07,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C, + 0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68, + 0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2, + 0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x93,0x00,0x00,0x38,0xB5,0x00,0x24, + 0x71,0x20,0x6B,0x46,0x00,0x94,0xD8,0x70,0x00,0x98,0x01,0x25,0x6D,0x07,0x68,0x60, + 0x0D,0x48,0x0D,0x22,0x21,0x00,0xFE,0xF7,0xCF,0xF8,0x0B,0x48,0x0D,0x22,0x00,0x21, + 0x0D,0x38,0xFE,0xF7,0xC9,0xF8,0x08,0x49,0xC9,0x1D,0x88,0x79,0x00,0x28,0x08,0xD0, + 0x00,0x20,0x03,0xE0,0x82,0x00,0x52,0x19,0x94,0x60,0x40,0x1C,0x8A,0x79,0x82,0x42, + 0xF8,0xDC,0x38,0xBC,0x08,0xBC,0x18,0x47,0xB9,0x06,0x00,0x20,0xF0,0xB5,0x00,0x24, + 0x25,0x00,0x20,0x00,0x01,0x21,0x8D,0xB0,0x49,0x07,0x0C,0x94,0x4F,0x68,0x61,0x4E, + 0xB9,0x0F,0x89,0x07,0x7E,0xD5,0x30,0x22,0x00,0x21,0x68,0x46,0xFE,0xF7,0xA4,0xF8, + 0x07,0x21,0xB8,0x01,0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00,0x88,0x43,0x39,0x07, + 0x09,0x0C,0x08,0x43,0x0C,0x90,0x00,0x20,0x33,0xE0,0x01,0x22,0x81,0x00,0x52,0x07, + 0x89,0x18,0x89,0x68,0x8E,0x00,0x32,0x0F,0x2A,0xD0,0x32,0x0F,0x94,0x46,0x92,0x00, + 0x6B,0x46,0xD2,0x18,0x40,0x3A,0xD3,0x6B,0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07, + 0x33,0x43,0x0F,0x27,0x3F,0x06,0x0E,0x04,0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43, + 0x49,0x4E,0x33,0x40,0x8E,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43,0x1B,0x0B,0x89,0x05, + 0x1B,0x03,0x89,0x0D,0x0B,0x43,0xD3,0x63,0x62,0x46,0x52,0x1E,0x01,0x23,0x93,0x40, + 0x9A,0x05,0x92,0x0D,0x71,0x46,0x11,0x43,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x0C,0x91, + 0x40,0x1C,0x0C,0x99,0x8E,0x46,0x09,0x04,0x09,0x0F,0x81,0x42,0xC5,0xD8,0x0C,0x98, + 0x01,0x27,0x00,0x04,0x00,0x0F,0x7B,0x07,0x0F,0xE0,0x82,0x00,0xD2,0x18,0x92,0x68, + 0x3E,0x00,0x92,0x00,0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C, + 0x11,0x43,0x24,0x06,0x24,0x0E,0x40,0x1C,0x0C,0x91,0x0C,0x99,0x0A,0x04,0x0E,0x02, + 0x12,0x0F,0x76,0x0F,0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x21,0x08,0x00,0x6E,0x46, + 0x82,0x00,0xB2,0x58,0x00,0x2A,0x03,0xD0,0x8F,0x00,0xFF,0x18,0xBA,0x60,0x49,0x1C, + 0x40,0x1C,0x0C,0x28,0xF4,0xD3,0x23,0x49,0x0C,0x98,0x88,0x43,0x29,0x07,0x09,0x0C, + 0x08,0x43,0x00,0xE0,0x07,0xE0,0x07,0x21,0x49,0x05,0x88,0x43,0x61,0x07,0x09,0x0A, + 0x08,0x43,0x0C,0x90,0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0,0x01,0x23,0x5B,0x07, + 0x58,0x68,0x19,0x4C,0x82,0x00,0x11,0x0F,0x09,0x07,0x21,0x40,0x84,0x01,0xA4,0x0D, + 0x24,0x03,0x21,0x43,0x84,0x05,0x09,0x0B,0x09,0x03,0xA4,0x0D,0x21,0x43,0x0F,0x24, + 0x24,0x06,0x00,0x04,0x80,0x08,0xA1,0x43,0x20,0x40,0x01,0x43,0x08,0x0F,0x09,0xD0, + 0x12,0x0F,0x52,0x1E,0x01,0x20,0x90,0x40,0x80,0x05,0x80,0x0D,0xB0,0x43,0x5A,0x14, + 0x80,0x18,0x0C,0x90,0x99,0x60,0x02,0xE0,0x01,0x21,0x49,0x07,0x88,0x60,0x71,0x20, + 0x08,0xAB,0xD8,0x74,0x0C,0x99,0x40,0x07,0x41,0x60,0x0D,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x08,0x48,0x10,0xB5, + 0x04,0x04,0x24,0x0C,0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7,0x21,0xFC,0x05,0x4A, + 0x05,0x49,0x20,0x00,0x00,0x23,0xF9,0xF7,0x23,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x70,0xB5,0x05,0x00, + 0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF9,0xF7,0x08,0xFC, + 0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23,0xF9,0xF7,0x0A,0xFC,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60, + 0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22, + 0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40, + 0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40, + 0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40, + 0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xD8,0x07,0x00,0x20,0x00,0x04,0x00,0x0C, + 0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15, + 0x11,0x43,0x81,0x60,0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43, + 0x88,0x60,0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB, + 0x32,0x00,0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42, + 0x00,0xDA,0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47, + 0x00,0x47,0x00,0x00,0x78,0x47,0xC0,0x46,0x14,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1, + 0x93,0xC0,0xC1,0xE0,0x63,0x30,0xE0,0xE3,0xC1,0x12,0x62,0xE0,0x93,0x01,0x20,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x1F,0x85,0xEB,0x51,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5, + 0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0, + 0x1C,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x10,0x30,0x9F,0xE5,0x93,0x10,0x82,0xE0, + 0x63,0x30,0xE0,0xE3,0xA2,0x12,0xA0,0xE1,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x1F,0x85,0xEB,0x51,0x10,0xB5,0xF9,0xF7,0x7B,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x25,0x00,0x6F,0x00,0xB9,0x00,0xF0,0x00,0x27,0x01,0x71,0x01,0xBB,0x01,0x20,0x00, + 0x6C,0x00,0xB8,0x00,0x04,0x01,0x50,0x01,0x89,0x01,0xC2,0x01,0x0E,0x02,0x5A,0x02, + 0xA6,0x02,0xF2,0x02,0x24,0x00,0x72,0x00,0xBD,0x00,0x09,0x01,0x55,0x01,0x90,0x01, + 0xCC,0x01,0x19,0x02,0x59,0x02,0xAE,0x02,0xF4,0x02,0x00,0x00,0x01,0x00,0x00,0x00, + 0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + 0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x89,0x08,0x49,0x1E, + 0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07,0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43, + 0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0x64,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0x78,0x37,0x00,0x00,0x78,0x37,0x00,0x00,0x78,0x37,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x40,0x06,0x14,0x05,0x00,0x00,0x04,0x64,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x66,0x00,0x66,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1D,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x14,0x00,0x00,0x00,0x00,0x00, + 0x05,0x02,0x0A,0x0A,0x01,0x01,0x04,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x80,0x8F,0x40,0x0F,0x80,0x8F,0x9D,0xB9,0x2C,0x01, + 0x0A,0x00,0x1E,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00,0x32,0x00,0x05,0x00, + 0x19,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x5E,0x01,0x90,0x01,0x90,0x01, + 0x2C,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x05,0x01,0x32,0x00,0xDC,0x05,0xE8,0x03,0x14,0x00,0x96,0x96,0x96,0x96,0x00,0x96, + 0x96,0x96,0xB4,0x00,0xFF,0x0F,0x58,0x02,0x32,0x00,0x14,0x00,0xFA,0xFA,0x19,0xA0, + 0x00,0x05,0x04,0x0A,0x0A,0x06,0xE8,0x03,0x46,0x00,0x06,0xFF,0x00,0x05,0x1E,0x00, + 0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x02,0x01,0x00,0x01,0x03,0x01,0x00,0x05,0x05,0x0A,0x0A, + 0x0F,0x0F,0x14,0x14,0x64,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0x82,0x01,0x00, + 0x1C,0x1F,0x98,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x9D,0x99,0x2C,0x01,0x0A,0x00,0x1E,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00, + 0x96,0x00,0x14,0x00,0x32,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x46,0x00,0x5E,0x01, + 0x90,0x01,0x90,0x01,0x90,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x04,0x01,0x32,0x00,0xDC,0x05,0x2C,0x01,0x14,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x20,0x03,0xC8,0x00,0x1E,0x00, + 0xFA,0xFA,0x0D,0xA0,0x00,0x05,0x04,0x0A,0x02,0x06,0xE8,0x03,0x46,0x00,0x05,0x28, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x03,0x05,0x03,0x00, + 0x05,0x05,0x0A,0x0A,0x0F,0x0F,0x14,0x14,0x64,0x55,0x01,0x00,0x03,0x00,0x00,0x00, + 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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x82,0x01,0x00,0x1C,0x1F,0xA8,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x64,0x00,0x0A,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x96,0x00,0xFA,0x00,0x00,0x00, + 0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x00, + 0x2A,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0A,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x32,0x00,0x32,0x00,0x32,0x00,0x32,0x00,0x0A,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xF0,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x8D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00, + 0x00,0x00,0x18,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x1C,0x18,0x98,0x00, + 0x30,0x3F,0x30,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x00, + 0x21,0x00,0x10,0x00,0x61,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x68,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x01,0x03,0x02,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x50,0x30,0x20,0x00,0x50,0x37,0x20,0x07,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x03,0xC8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00, + 0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00,0x50,0x30,0x20,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x3F,0x2C,0x20,0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x22, + 0x20,0x20,0x22,0x3F,0x22,0x20,0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x20,0x20, + 0x24,0x3F,0x36,0x24,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x24,0x3F, + 0x24,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x34,0x3F,0x3F,0x30, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3F,0x2C,0x2C,0x2C,0x2C, + 0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x34,0x3F,0x2C,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x14,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0x91,0xEB, + 0x21,0x2C,0x92,0xEB,0x42,0xBC,0x92,0xEB,0x63,0x28,0x93,0xEB,0x84,0xB8,0x93,0xEB, + 0xA5,0x24,0x94,0xEB,0xC6,0xB4,0x94,0xEB,0xE7,0x20,0x95,0xEB,0x08,0xB1,0x95,0xEB, + 0x29,0x9D,0x98,0xEB,0x4A,0x01,0x99,0xEB,0x6B,0x99,0x99,0xEB,0x8C,0x05,0x9A,0xEB, + 0xAD,0x95,0x9A,0xEB,0xCE,0x09,0x90,0xEB,0xEF,0x11,0x90,0xEB,0x10,0x0E,0x90,0xEB, + 0x31,0x46,0x90,0xEB,0x52,0x52,0x90,0xEB,0x73,0x4A,0x90,0xEB,0x94,0x4E,0x90,0xEB, + 0xB5,0x02,0x90,0xEB,0xD6,0x02,0x90,0xEB,0xF7,0x02,0x90,0xEB,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x40, + 0x67,0x60,0x07,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x60,0x30,0x60,0x30, + 0x66,0x60,0x06,0x00,0x63,0x60,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0xA5,0x00,0xB3,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0005_20140323.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0005_20140323.h new file mode 100644 index 00000000..16a43cc1 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0005_20140323.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS MELFAS, f/w 5(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xAD,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x39,0x4A,0x37,0x48,0x37,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x35,0x48,0x01,0x21,0x89,0x07,0xC8,0x61, + 0x34,0x48,0xC9,0x14,0x01,0x62,0x00,0x21,0x01,0x62,0x01,0x62,0x32,0x49,0x33,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x2D,0x4B, + 0x9F,0x6A,0x2F,0x48,0x00,0x69,0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61, + 0xFF,0xF7,0xE2,0xFF,0x58,0x69,0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x29,0x48, + 0x29,0x4C,0x20,0x60,0xFF,0x20,0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68, + 0xA6,0x15,0x30,0x43,0xA0,0x60,0x21,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x23,0x4F, + 0x21,0xE0,0x68,0x68,0x00,0x07,0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61, + 0x68,0x69,0x18,0x42,0xFC,0xD1,0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69, + 0x18,0x42,0xFC,0xD1,0x0D,0xE0,0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69, + 0x80,0x06,0xFC,0xD4,0x68,0x68,0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0xFF,0xF7,0xA9,0xFF,0xE0,0x68,0x11,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7, + 0xA3,0xFF,0xA0,0x68,0xB0,0x43,0xA0,0x60,0x00,0xF0,0x3A,0xF9,0xF8,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0x00,0x00,0x10,0x84,0x02,0x00,0x00,0xEC,0x00,0x00,0x00, + 0x5C,0x0A,0x00,0x00,0x40,0x00,0x00,0x40,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F, + 0x50,0xC3,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61, + 0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4, + 0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22, + 0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2, + 0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06, + 0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF, + 0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21, + 0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06, + 0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0xFF,0x20,0x00,0xF0,0x26,0xFF, + 0x03,0x25,0x0F,0x4E,0x2D,0x07,0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B, + 0xE9,0x68,0x80,0x08,0x3C,0x00,0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42, + 0x00,0xD0,0x34,0x63,0x81,0x00,0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x08,0xF0, + 0x26,0xFA,0xE8,0x68,0xA0,0x43,0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x30,0xF8,0x05,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x52,0x4A,0x4F,0x48,0x50,0x49,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0, + 0x52,0x1E,0xFB,0xD2,0x00,0xF0,0xCE,0xFE,0x07,0x00,0x04,0xF0,0x41,0xF8,0x04,0xF0, + 0x33,0xF8,0x04,0xF0,0xC5,0xF8,0x4A,0x4A,0x4A,0x49,0x4B,0x48,0x00,0xF0,0xFC,0xF9, + 0x05,0x21,0x49,0x03,0x00,0x20,0x00,0xF0,0xFD,0xF9,0x48,0x4C,0x48,0x49,0x20,0x62, + 0x00,0x20,0x00,0xF0,0xF7,0xF9,0x47,0x4B,0x47,0x49,0xD8,0x63,0x47,0x48,0x00,0xF0, + 0xF1,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x04,0xF0,0x85,0xF8,0x44,0x4A, + 0x44,0x48,0x00,0x21,0x00,0xF0,0xEE,0xF9,0x07,0xF0,0xBC,0xFC,0x04,0xF0,0x34,0xF9, + 0x41,0x48,0x00,0x26,0x81,0x7A,0x01,0x25,0x6D,0x07,0xE1,0x72,0xC1,0x7A,0x21,0x73, + 0x40,0x7A,0x60,0x73,0xA6,0x72,0xA6,0x73,0xE6,0x73,0x26,0x74,0x39,0x48,0x66,0x74, + 0xA6,0x74,0x68,0x63,0xFF,0x20,0xE8,0x63,0xE8,0x14,0x00,0xF0,0x67,0xFE,0x37,0x48, + 0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0x61,0xFE,0x35,0x49,0x02,0x20,0x07,0xF0, + 0xED,0xFF,0x02,0x20,0x07,0xF0,0xF2,0xFF,0x60,0x7B,0x00,0x28,0x01,0xD0,0x08,0xF0, + 0x65,0xF9,0x00,0x2F,0x1F,0xD1,0x2F,0x4E,0xB7,0x15,0x60,0x7B,0x00,0x28,0x02,0xD0, + 0x2D,0x49,0xA0,0x6D,0x88,0x60,0xE8,0x6B,0x0B,0x28,0x14,0xD0,0x2B,0x48,0x40,0x68, + 0x00,0x07,0x01,0xD5,0x02,0xF0,0xA2,0xFD,0xF0,0x68,0x29,0x49,0x88,0x42,0xEC,0xD9, + 0x28,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB0,0x68,0xB8,0x43,0xB0,0x60,0xB0,0x68, + 0x38,0x43,0xB0,0x60,0xE1,0xE7,0x20,0x7B,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02, + 0x00,0xF0,0x24,0xFE,0x60,0x7B,0x00,0x28,0x01,0xD0,0x08,0xF0,0x3F,0xF9,0x02,0x20, + 0x07,0xF0,0xCC,0xFF,0xFF,0x20,0x81,0x30,0x00,0xF0,0x18,0xFE,0x1A,0x49,0x05,0x20, + 0x03,0xF0,0x08,0xFE,0x0B,0x20,0xE8,0x63,0x03,0xF0,0x9E,0xFE,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xB0,0x05,0x00,0x10,0x7C,0x89,0x00,0x00,0x80,0x01,0x00,0x00, + 0x28,0x00,0x00,0x00,0x54,0x89,0x00,0x00,0x00,0x00,0x00,0x10,0x64,0x05,0x00,0x20, + 0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20,0x00,0x9D,0x00,0x00,0x00,0x93,0x00,0x00, + 0x24,0x05,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0x7D,0x06,0x00,0x20, + 0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30, + 0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00,0x21,0x85,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0, + 0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0,0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0, + 0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1,0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3, + 0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21,0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A, + 0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A,0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0, + 0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0,0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0, + 0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0,0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0,0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21, + 0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3,0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2, + 0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0, + 0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23, + 0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1, + 0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5, + 0x02,0x20,0x08,0xF0,0x1B,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46, + 0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA0,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0, + 0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0,0x83,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0, + 0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x48,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10,0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xF0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x28,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0xF0,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xA8,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0xC8,0xFD,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40, + 0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5, + 0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0B,0x24,0x02,0xF0,0x81,0xFB,0x64,0x1E, + 0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7F, + 0xC0,0x07,0x26,0xD0,0x70,0x7E,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1, + 0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05, + 0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18, + 0x0C,0x49,0x41,0x18,0x28,0x19,0x07,0xF0,0x61,0xFB,0x64,0x1C,0x70,0x7E,0xA0,0x42, + 0xF3,0xDA,0x70,0x7E,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7E, + 0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x04,0x00,0x20, + 0x40,0x00,0x00,0x20,0xAA,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07, + 0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7E,0xE4,0x00,0xE6,0x18,0x25,0x24,0x64,0x01, + 0x36,0x19,0xB5,0x74,0x56,0x7E,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x82, + 0x56,0x7E,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xF5,0x82,0x55,0x7E,0xED,0x00, + 0xED,0x18,0x2D,0x19,0x29,0x76,0x55,0x7E,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19, + 0x59,0x76,0x51,0x7E,0x49,0x1C,0x51,0x76,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x76,0x70,0xBC,0x70,0x47,0x01,0x20, + 0xFA,0xE7,0x00,0x00,0x40,0x00,0x00,0x20,0xA0,0x04,0x00,0x20,0xF0,0x00,0x2D,0xE9, + 0x70,0x60,0x9F,0xE5,0x01,0xC1,0x81,0xE0,0x8C,0xC0,0x86,0xE0,0x81,0x40,0x86,0xE0, + 0x8C,0x21,0xCC,0xE5,0xB4,0x5F,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x05,0x05,0xE0,0xA5,0x79,0xA0,0xE1,0x01,0x5C,0x8C,0xE2,0x01,0x4C,0x84,0xE2, + 0xBE,0x78,0xC5,0xE1,0xB6,0x40,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x04,0x04,0xE0,0xA4,0x49,0xA0,0xE1,0xB0,0x49,0xC5,0xE1,0x01,0x40,0x86,0xE0, + 0x38,0x41,0xD4,0xE5,0x8D,0x41,0xCC,0xE5,0x92,0x31,0xCC,0xE5,0x01,0x20,0xC0,0xE7, + 0x02,0x00,0x86,0xE0,0xA3,0x12,0xC0,0xE5,0x00,0x10,0xA0,0xE3,0x9A,0x12,0xC0,0xE5, + 0xF0,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x08,0x4A,0x07,0x49, + 0x12,0x78,0x08,0x68,0x0F,0x23,0x40,0x1C,0x12,0x07,0x12,0x0A,0x9B,0x06,0xD2,0x18, + 0x00,0x03,0x00,0x0B,0x02,0x43,0x0A,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xF4,0x05,0x00,0x20,0x78,0x47,0xC0,0x46,0xF1,0x4F,0x2D,0xE9,0xE8,0x14,0x9F,0xE5, + 0x38,0xD0,0x4D,0xE2,0xB0,0x00,0xD1,0xE5,0xB1,0x90,0xD1,0xE5,0xB3,0xA0,0xD1,0xE5, + 0x00,0x00,0x8D,0xE5,0xD4,0x04,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xB0,0x00,0xD0,0xE1, + 0x02,0x0B,0x10,0xE3,0x3C,0xD0,0x8D,0x02,0xF0,0x4F,0xBD,0x08,0x1E,0xFF,0x2F,0x01, + 0x38,0x00,0x9D,0xE5,0x00,0xB0,0xA0,0xE3,0x01,0x00,0x50,0xE3,0x02,0x00,0xA0,0x13, + 0x04,0x00,0x8D,0xE5,0x38,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x3C,0xD0,0x8D,0xD2, + 0xF0,0x4F,0xBD,0xD8,0x1E,0xFF,0x2F,0xD1,0x01,0x00,0x49,0xE2,0x34,0x00,0x8D,0xE5, + 0x0A,0x01,0xA0,0xE1,0xCD,0x20,0xA0,0xE3,0x92,0x00,0x00,0xE0,0x20,0x05,0xA0,0xE1, + 0x30,0x00,0x8D,0xE5,0x8A,0x00,0x8A,0xE0,0x92,0x00,0x00,0xE0,0x20,0x05,0xA0,0xE1, + 0x2C,0x00,0x8D,0xE5,0x8A,0x00,0xA0,0xE1,0x92,0x00,0x00,0xE0,0x20,0x05,0xA0,0xE1, + 0x28,0x00,0x8D,0xE5,0x9A,0x02,0x00,0xE0,0x20,0x05,0xA0,0xE1,0x24,0x00,0x8D,0xE5, + 0x04,0x10,0x9D,0xE5,0x02,0x02,0xA0,0xE3,0x01,0x01,0x80,0xE0,0x20,0x00,0x8D,0xE5, + 0x00,0x70,0x90,0xE5,0x07,0x01,0xA0,0xE1,0x01,0x01,0x17,0xE3,0x20,0x4E,0xA0,0xE1, + 0x17,0x00,0x00,0x1A,0x28,0x04,0x9F,0xE5,0x00,0x10,0xE0,0xE3,0x04,0x01,0x80,0xE0, + 0xB0,0x10,0xC0,0xE1,0xB2,0x10,0xC0,0xE1,0x18,0x04,0x9F,0xE5,0x00,0x20,0xA0,0xE3, + 0x04,0x01,0x80,0xE0,0xB0,0x10,0xC0,0xE1,0xB2,0x10,0xC0,0xE1,0x08,0x04,0x9F,0xE5, + 0x0C,0x14,0x9F,0xE5,0x84,0x00,0x80,0xE0,0xB0,0x20,0xC0,0xE1,0xFC,0x03,0x9F,0xE5, + 0x04,0x31,0x81,0xE0,0x04,0x20,0xC0,0xE7,0x02,0x00,0xA0,0xE1,0x00,0x11,0x83,0xE0, + 0xB0,0x20,0xC1,0xE1,0x01,0x00,0x50,0xE2,0xB2,0x20,0xC1,0xE1,0xFA,0xFF,0xFF,0x5A, + 0xE7,0x00,0x00,0xEA,0xC8,0x03,0x9F,0xE5,0x04,0x81,0x80,0xE0,0xF0,0x30,0xD8,0xE1, + 0x00,0x00,0x53,0xE3,0x09,0x00,0x00,0xAA,0x07,0x03,0xA0,0xE1,0xB4,0x23,0x9F,0xE5, + 0x20,0x0B,0xA0,0xE1,0x3F,0x1B,0xC7,0xE3,0xB0,0x00,0xC8,0xE1,0x04,0x21,0x82,0xE0, + 0xB2,0x10,0xC8,0xE1,0xB0,0x00,0xC2,0xE1,0xB2,0x10,0xC2,0xE1,0xD8,0x00,0x00,0xEA, + 0x34,0x10,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00,0x51,0xE3,0x0A,0x00,0x00,0xDA, + 0x8C,0x13,0x9F,0xE5,0x04,0x21,0x81,0xE0,0x00,0x11,0x82,0xE0,0xB4,0xC0,0xD1,0xE1, + 0x01,0x00,0x80,0xE2,0xB0,0xC0,0xC1,0xE1,0xB6,0xC0,0xD1,0xE1,0xB2,0xC0,0xC1,0xE1, + 0x34,0x10,0x9D,0xE5,0x01,0x00,0x50,0xE1,0xF6,0xFF,0xFF,0xBA,0x07,0x03,0xA0,0xE1, + 0x20,0x1B,0x63,0xE0,0x1C,0x00,0x8D,0xE5,0x54,0x03,0x9F,0xE5,0x00,0x00,0x59,0xE3, + 0x04,0x31,0x80,0xE0,0x09,0x01,0x83,0xE0,0xB4,0x10,0x40,0xE1,0x07,0x1B,0xA0,0xE1, + 0x21,0x1B,0xA0,0xE1,0x18,0x10,0x8D,0xE5,0xB2,0x20,0xD8,0xE1,0x02,0x10,0x41,0xE0, + 0xB2,0x10,0x40,0xE1,0x00,0x00,0xA0,0xE3,0x00,0x50,0xA0,0xE1,0x00,0x10,0xA0,0xE1, + 0x07,0x00,0x00,0xDA,0x01,0x21,0x83,0xE0,0xF0,0xC0,0xD2,0xE1,0xF2,0x20,0xD2,0xE1, + 0x01,0x10,0x81,0xE2,0x09,0x00,0x51,0xE1,0x0C,0x00,0x80,0xE0,0x02,0x50,0x85,0xE0, + 0xF7,0xFF,0xFF,0xBA,0x09,0x10,0xA0,0xE1,0x38,0xFE,0xFF,0xEB,0x00,0x60,0xA0,0xE1, + 0x09,0x10,0xA0,0xE1,0x05,0x00,0xA0,0xE1,0x34,0xFE,0xFF,0xEB,0xC8,0x22,0x9F,0xE5, + 0x00,0x00,0x56,0xE3,0xB2,0x10,0xD2,0xE5,0x00,0x60,0x66,0xD2,0x01,0x00,0x56,0xE1, + 0x0C,0x00,0x00,0xAA,0x00,0x00,0x50,0xE3,0x00,0x00,0x60,0xD2,0x01,0x00,0x50,0xE1, + 0x08,0x00,0x00,0xAA,0xB0,0x02,0x9F,0xE5,0x84,0x10,0x80,0xE0,0xB4,0x00,0xD2,0xE5, + 0xF0,0x30,0xD1,0xE1,0x00,0xC0,0x4A,0xE0,0x0C,0x00,0x53,0xE1,0x03,0x00,0x80,0xB0, + 0xB0,0x00,0xC1,0xB1,0x05,0x00,0x00,0xEA,0x8C,0x02,0x9F,0xE5,0xB5,0x30,0xD2,0xE5, + 0x84,0x00,0x80,0xE0,0xB0,0x10,0xD0,0xE1,0x03,0x10,0x41,0xE0,0xB0,0x10,0xC0,0xE1, + 0x74,0x02,0x9F,0xE5,0x84,0x00,0x80,0xE0,0xF0,0x10,0xD0,0xE1,0x00,0x00,0x51,0xE3, + 0x00,0x10,0xA0,0xD3,0xB0,0x10,0xC0,0xD1,0xF0,0x00,0xD0,0xE1,0x0A,0x00,0x50,0xE1, + 0x58,0x32,0x9F,0xA5,0x05,0x10,0xA0,0xA3,0x04,0x10,0xC3,0xA7,0x1B,0x00,0x00,0xAA, + 0x30,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1,0x40,0x32,0x9F,0xD5,0x04,0x10,0xA0,0xD3, + 0x04,0x10,0xC3,0xD7,0x15,0x00,0x00,0xDA,0x2C,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0x28,0x32,0x9F,0xD5,0x03,0x10,0xA0,0xD3,0x04,0x10,0xC3,0xD7,0x0F,0x00,0x00,0xDA, + 0x28,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1,0x10,0x32,0x9F,0xD5,0x02,0x10,0xA0,0xD3, + 0x04,0x10,0xC3,0xD7,0x09,0x00,0x00,0xDA,0x24,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0xF8,0x31,0x9F,0xD5,0x01,0x10,0xA0,0xD3,0x04,0x10,0xC3,0xD7,0x03,0x00,0x00,0xDA, + 0x00,0x00,0x50,0xE3,0xE4,0x31,0x9F,0x05,0x00,0x10,0xA0,0x03,0x04,0x10,0xC3,0x07, + 0xD0,0x11,0x9F,0xE5,0x1C,0xC0,0x9D,0xE5,0x04,0x11,0x81,0xE0,0x14,0x10,0x8D,0xE5, + 0xF0,0x30,0xD1,0xE1,0x10,0x30,0x8D,0xE5,0xF2,0x10,0xD1,0xE1,0x2C,0x5B,0x63,0xE0, + 0x18,0x30,0x9D,0xE5,0x0C,0x10,0x8D,0xE5,0x01,0x60,0x43,0xE0,0xAC,0x11,0x9F,0xE5, + 0xB6,0x20,0xD2,0xE5,0x04,0x10,0xD1,0xE7,0x02,0x00,0x51,0xE1,0x1B,0x00,0x00,0x3A, + 0x00,0x00,0x55,0xE3,0x00,0x40,0xA0,0x03,0x0A,0x00,0x00,0x0A,0x00,0x10,0x9D,0xE5, + 0x00,0x00,0x65,0xD2,0x05,0x00,0xA0,0xC1,0x01,0x00,0x50,0xE1,0x01,0x40,0xA0,0xB3, + 0x04,0x00,0x00,0xBA,0x00,0x00,0x55,0xE3,0x00,0x00,0x65,0xD2,0x05,0x00,0xA0,0xC1, + 0xD6,0xFD,0xFF,0xEB,0x00,0x40,0xA0,0xE1,0x00,0x00,0x56,0xE3,0x00,0x00,0xA0,0x03, + 0x2C,0x00,0x00,0x0A,0x00,0x10,0x9D,0xE5,0x00,0x00,0x66,0xD2,0x06,0x00,0xA0,0xC1, + 0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0xB3,0x26,0x00,0x00,0xBA,0x00,0x00,0x56,0xE3, + 0x00,0x00,0x66,0xD2,0x06,0x00,0xA0,0xC1,0xC8,0xFD,0xFF,0xEB,0x21,0x00,0x00,0xEA, + 0x19,0x1E,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x28,0x11,0x9F,0xE5,0x08,0x00,0x8D,0xE5, + 0x91,0x20,0xC0,0xE0,0xC0,0x10,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x0A,0x10,0xA0,0xE1, + 0xBE,0xFD,0xFF,0xEB,0x00,0x00,0x55,0xE3,0x64,0x10,0x60,0xE2,0x00,0x00,0x65,0xD2, + 0x05,0x00,0xA0,0xC1,0x91,0x00,0x00,0xE0,0xFC,0x10,0x9F,0xE5,0x91,0x20,0xC0,0xE0, + 0xC0,0x12,0xA0,0xE1,0xC0,0x4F,0x41,0xE0,0x08,0x00,0x9D,0xE5,0xE4,0x10,0x9F,0xE5, + 0x91,0x20,0xC0,0xE0,0xC0,0x10,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x0A,0x10,0xA0,0xE1, + 0xAE,0xFD,0xFF,0xEB,0x00,0x00,0x56,0xE3,0x64,0x10,0x60,0xE2,0x00,0x00,0x66,0xD2, + 0x06,0x00,0xA0,0xC1,0x91,0x00,0x00,0xE0,0xBC,0x10,0x9F,0xE5,0x91,0x20,0xC0,0xE0, + 0xC0,0x12,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x10,0x10,0x9D,0xE5,0x00,0x00,0x55,0xE3, + 0x04,0x10,0x41,0xB0,0x0C,0x20,0x9D,0xE5,0x04,0x10,0x81,0xA0,0x00,0x00,0x56,0xE3, + 0x00,0x00,0x42,0xB0,0x02,0x00,0x80,0xA0,0x1C,0x20,0x9D,0xE5,0x3F,0x33,0xE0,0xE3, + 0x22,0x2B,0xA0,0xE1,0xB0,0x20,0xC8,0xE1,0x18,0x20,0x9D,0xE5,0xB2,0x20,0xC8,0xE1, + 0x14,0x20,0x9D,0xE5,0xB0,0x10,0xC2,0xE1,0x14,0x20,0x9D,0xE5,0x01,0x18,0x03,0xE0, + 0xB2,0x00,0xC2,0xE1,0x03,0x24,0xC7,0xE3,0xFF,0x28,0xC2,0xE3,0x02,0x10,0x81,0xE1, + 0x03,0x15,0x01,0xE0,0x43,0x08,0x00,0xE0,0x01,0x00,0x80,0xE1,0x20,0x10,0x9D,0xE5, + 0x00,0x00,0x81,0xE5,0x04,0x00,0x9D,0xE5,0x01,0xB0,0x8B,0xE2,0x01,0x00,0x80,0xE2, + 0x04,0x00,0x8D,0xE5,0x38,0x00,0x9D,0xE5,0x00,0x00,0x5B,0xE1,0xEF,0xFE,0xFF,0xBA, + 0x3C,0xD0,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x93,0x00,0x00, + 0x78,0x06,0x00,0x20,0x6C,0x09,0x00,0x20,0x90,0x09,0x00,0x20,0x50,0x09,0x00,0x20, + 0x62,0x09,0x00,0x20,0xB4,0x09,0x00,0x20,0x67,0x66,0x66,0x66,0x1F,0x85,0xEB,0x51, + 0x12,0x4A,0x29,0x21,0x49,0x01,0x70,0xB4,0x53,0x18,0x05,0x21,0xD4,0x88,0x09,0x02, + 0x80,0x25,0x51,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x46,0x7B,0x0E,0x83,0xC6,0x89, + 0x4E,0x83,0x06,0x8A,0x8E,0x83,0x40,0x8A,0xC8,0x83,0x09,0x48,0x20,0x30,0x00,0x89, + 0x2C,0x43,0x18,0x80,0x06,0xE0,0x00,0x20,0x08,0x83,0x48,0x83,0x88,0x83,0xC8,0x83, + 0xAC,0x43,0x18,0x80,0xD4,0x80,0x70,0xBC,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x80,0x93,0x00,0x00,0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A, + 0x00,0x28,0x09,0xD1,0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x01,0xF0,0xDC,0xFF, + 0x64,0x1E,0xFB,0xD2,0xFF,0x24,0x12,0xE0,0x06,0xF0,0x24,0xF9,0x01,0xF0,0x78,0xFE, + 0x01,0xF0,0xC0,0xFE,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x05,0xF0,0x2B,0xF8,0x04,0x00, + 0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20, + 0x07,0xF0,0x2C,0xFA,0x02,0x20,0x07,0xF0,0x19,0xFA,0x12,0x49,0xE8,0x68,0xC8,0x61, + 0x28,0x69,0xC8,0x61,0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B, + 0x0F,0x48,0x02,0xE0,0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5, + 0x48,0x68,0x80,0x07,0xFC,0xD5,0x01,0xF0,0xC7,0xFF,0x01,0x20,0x00,0xF0,0x6E,0xF8, + 0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFE,0xF7,0xF2,0xFF, + 0x1C,0x48,0x03,0x27,0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0xB6,0xFB,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0xB8,0xFB, + 0x16,0x49,0x40,0x22,0x01,0xA8,0xFF,0xF7,0x97,0xFB,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x07,0xF0,0xFE,0xFA,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x65,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0x68,0x01,0x8D,0xE5,0xB4,0x07,0x9F,0xE5,0xB4,0x27,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xB8,0x21,0xD2,0xE1,0x78,0x10,0xD0,0xE5,0x77,0x70,0xD0,0xE5,0xA4,0x97,0x9F,0xE5, + 0x02,0x10,0x81,0xE0,0xFF,0x80,0x01,0xE2,0x79,0x10,0xD0,0xE5,0x00,0x50,0xE0,0xE3, + 0x00,0xB0,0xA0,0xE3,0x08,0x10,0x8D,0xE5,0x7A,0x00,0xD0,0xE5,0x01,0x60,0xA0,0xE3, + 0x04,0x00,0x8D,0xE5,0x8A,0x01,0xD9,0xE5,0x04,0x40,0xD9,0xE5,0x01,0x00,0x50,0xE3, + 0x0E,0x00,0x00,0xBA,0x06,0x01,0x86,0xE0,0x80,0x00,0x89,0xE0,0x40,0x12,0xD0,0xE5, + 0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A,0x02,0x0C,0x80,0xE2,0x46,0x00,0x80,0xE2, + 0x2B,0x0C,0x00,0xEB,0x00,0x00,0x50,0xE3,0x01,0x00,0x8B,0x12,0xFF,0xB0,0x00,0x12, + 0x8A,0x01,0xD9,0xE5,0x01,0x60,0x86,0xE2,0x06,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA, + 0x34,0x07,0x9F,0xE5,0x00,0xA0,0xA0,0xE3,0xBC,0x3B,0xD0,0xE1,0xB0,0x2C,0xD0,0xE1, + 0x01,0x60,0xA0,0xE3,0x02,0x10,0x43,0xE0,0x00,0x00,0x51,0xE3,0x03,0x10,0x42,0xD0, + 0x01,0x28,0xA0,0xE1,0xBE,0x1B,0xD0,0xE1,0xB2,0x3C,0xD0,0xE1,0x22,0x28,0xA0,0xE1, + 0xBB,0xA2,0xC9,0xE5,0x03,0x00,0x41,0xE0,0x00,0x00,0x50,0xE3,0x01,0x00,0x43,0xD0, + 0x00,0x00,0x5B,0xE3,0x00,0x08,0xA0,0xE1,0x28,0x00,0x52,0x13,0x20,0x08,0xA0,0xE1, + 0x06,0x00,0x00,0x2A,0x32,0x00,0x50,0xE3,0xBB,0x62,0xC9,0x35,0x03,0x00,0x00,0x3A, + 0x64,0x00,0x50,0xE3,0x03,0x00,0xA0,0x23,0x02,0x00,0xA0,0x33,0xBB,0x02,0xC9,0xE5, + 0xBA,0x02,0xD9,0xE5,0x00,0x00,0x50,0xE3,0x0B,0x00,0x00,0x1A,0xBB,0x02,0xD9,0xE5, + 0x01,0x00,0x50,0xE3,0x05,0x00,0x87,0x02,0xFF,0x70,0x00,0x02,0x06,0x00,0x00,0x0A, + 0x02,0x00,0x50,0xE3,0x0A,0x00,0x87,0x02,0x02,0x00,0x00,0x0A,0x03,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x1A,0x0F,0x00,0x87,0xE2,0xFF,0x70,0x00,0xE2,0x09,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0x44,0xFD,0xFF,0xEB,0xB6,0x00,0xD9,0xE1, + 0x78,0xB6,0x9F,0xE5,0x46,0x0F,0x10,0xE3,0x04,0x00,0x00,0x0A,0xC6,0x04,0x00,0xEB, + 0x00,0x60,0xCB,0xE5,0x65,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x50,0x06,0x9F,0xE5,0x00,0xA0,0xCB,0xE5,0x8B,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x40,0x16,0x9F,0x15,0x01,0x00,0x40,0x12,0x8B,0x01,0xC1,0x15,0x00,0x00,0x54,0xE3, + 0x04,0x00,0x00,0x1A,0x2C,0x06,0x9F,0xE5,0x89,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x7C,0x01,0x00,0x0A,0x17,0x00,0x00,0xEA,0x18,0x96,0x9F,0xE5,0x89,0x01,0xD9,0xE5, + 0x00,0x00,0x50,0xE3,0x13,0x00,0x00,0x1A,0x14,0x06,0x9F,0xE5,0x5A,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x25,0xFD,0xFF,0xEB,0x8B,0x01,0xD9,0xE5,0x00,0x00,0x50,0xE3, + 0x70,0x01,0x00,0x1A,0x01,0x00,0x54,0xE3,0x01,0x50,0xA0,0xE3,0x07,0x00,0x00,0xBA, + 0xFF,0x20,0x05,0xE2,0xFF,0x10,0x05,0xE2,0x14,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0x7D,0xFD,0xFF,0xEB,0x01,0x50,0x85,0xE2,0x04,0x00,0x55,0xE1,0xF7,0xFF,0xFF,0xDA, + 0x88,0x41,0xC9,0xE5,0x63,0x01,0x00,0xEA,0x09,0x20,0xA0,0xE3,0x01,0x10,0xA0,0xE3, + 0x15,0x0E,0x8D,0xE2,0x11,0xFD,0xFF,0xEB,0x01,0x00,0x87,0xE2,0x90,0x01,0x8D,0xE5, + 0x02,0x00,0x88,0xE2,0x8C,0x01,0x8D,0xE5,0xA8,0x05,0x9F,0xE5,0x01,0x60,0xA0,0xE3, + 0x88,0x01,0x8D,0xE5,0x09,0x00,0x40,0xE2,0x84,0x01,0x8D,0xE5,0x08,0x70,0xA0,0xE3, + 0x0C,0x80,0x8D,0xE2,0x87,0x01,0x87,0xE0,0x0C,0x10,0x8D,0xE2,0x00,0x01,0x81,0xE0, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xE0,0xE3,0x00,0xFD,0xFF,0xEB,0x01,0x70,0x57,0xE2, + 0xF7,0xFF,0xFF,0x5A,0x06,0x00,0xA0,0xE1,0x55,0x06,0x00,0xEB,0x01,0x00,0x54,0xE3, + 0x00,0x80,0xA0,0xE1,0x01,0x90,0xA0,0xE3,0x47,0x00,0x00,0xBA,0x44,0x05,0x9F,0xE5, + 0x08,0xA0,0xA0,0xE1,0x8A,0x11,0xD0,0xE5,0x01,0x70,0xA0,0xE3,0x01,0x00,0x51,0xE3, + 0x3E,0x00,0x00,0xBA,0x89,0x00,0x80,0xE0,0x80,0x01,0x8D,0xE5,0x01,0x0C,0x80,0xE2, + 0x7C,0x01,0x8D,0xE5,0x89,0x01,0x89,0xE0,0x0C,0x10,0x8D,0xE2,0x78,0x01,0x8D,0xE5, + 0x00,0x01,0x81,0xE0,0x74,0x01,0x8D,0xE5,0x08,0x15,0x9F,0xE5,0x07,0x01,0x87,0xE0, + 0x80,0xB0,0x81,0xE0,0x40,0x02,0xDB,0xE5,0x00,0x00,0x50,0xE3,0x2A,0x00,0x00,0x0A, + 0x02,0x0C,0x8B,0xE2,0x46,0x00,0x80,0xE2,0x70,0x01,0x8D,0xE5,0x90,0x0B,0x00,0xEB, + 0x06,0x00,0x90,0xE1,0x04,0x00,0x00,0x0A,0x70,0x01,0x9D,0xE5,0x8C,0x0B,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x00,0x00,0x56,0x13,0x1F,0x00,0x00,0x0A,0x80,0x01,0x9D,0xE5, + 0xCD,0x10,0xA0,0xE3,0xB4,0x0F,0xD0,0xE1,0x33,0x1B,0x81,0xE2,0x02,0x3C,0x8B,0xE2, + 0x91,0x00,0x00,0xE0,0xB2,0x24,0xD3,0xE1,0xA0,0x09,0xA0,0xE1,0xB4,0x34,0xD3,0xE1, + 0x00,0x10,0x42,0xE0,0x00,0x00,0x51,0xE3,0x02,0x10,0x40,0xD0,0x7C,0x01,0x9D,0xE5, + 0xCD,0x20,0xA0,0xE3,0xB6,0x00,0xD0,0xE1,0x33,0x2B,0x82,0xE2,0x92,0x00,0x00,0xE0, + 0xA0,0x29,0xA0,0xE1,0x02,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3,0x03,0x00,0x42,0xD0, + 0x91,0x01,0x02,0xE0,0x00,0x10,0xA0,0xE1,0x91,0x20,0x20,0xE0,0x0A,0x00,0x50,0xE1, + 0x03,0x00,0x00,0xAA,0x78,0x11,0x9D,0xE5,0x0C,0x20,0x8D,0xE2,0x00,0xA0,0xA0,0xE1, + 0x01,0x71,0x82,0xE7,0x74,0x11,0x9D,0xE5,0x07,0x01,0x81,0xE7,0x44,0x04,0x9F,0xE5, + 0x01,0x70,0x87,0xE2,0x8A,0x01,0xD0,0xE5,0x07,0x00,0x50,0xE1,0xC9,0xFF,0xFF,0xAA, + 0x01,0x90,0x89,0xE2,0x04,0x00,0x59,0xE1,0xB7,0xFF,0xFF,0xDA,0x01,0x00,0xA0,0xE3, + 0x01,0x00,0x54,0xE3,0x6C,0x01,0x8D,0xE5,0x7D,0x00,0x00,0xBA,0x0C,0x70,0x8D,0xE2, + 0x01,0xC0,0xA0,0xE3,0x01,0x00,0x54,0xE3,0x08,0x30,0xA0,0xE1,0x0C,0x00,0xA0,0xE1, + 0x72,0x00,0x00,0xBA,0x57,0x1F,0x8D,0xE2,0x00,0x10,0xD1,0xE7,0x00,0x00,0x51,0xE3, + 0x0B,0x00,0x00,0x1A,0x80,0x11,0x80,0xE0,0x01,0x21,0x97,0xE7,0x01,0x91,0x87,0xE0, + 0x02,0x11,0x99,0xE7,0x03,0x00,0x51,0xE1,0x05,0x00,0x00,0xAA,0x00,0x00,0x51,0xE3, + 0x00,0x00,0x52,0xA3,0x02,0x00,0x00,0xBA,0x00,0x50,0xA0,0xE1,0x01,0x30,0xA0,0xE1, + 0x00,0xC0,0xA0,0xE3,0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1,0xEC,0xFF,0xFF,0xDA, + 0x00,0x00,0x5C,0xE3,0x5D,0x00,0x00,0x1A,0x68,0x01,0x9D,0xE5,0x85,0x91,0x85,0xE0, + 0x01,0x00,0x80,0xE2,0x68,0x01,0x8D,0xE5,0x09,0x01,0x97,0xE7,0x94,0xB3,0x9F,0xE5, + 0x00,0x01,0x80,0xE0,0x80,0x00,0x8B,0xE0,0x01,0x1C,0x80,0xE2,0x05,0x01,0x85,0xE0, + 0x80,0xA0,0x8B,0xE0,0xE6,0x10,0x81,0xE2,0x63,0x0F,0x8A,0xE2,0x0A,0x20,0xA0,0xE3, + 0x84,0xFC,0xFF,0xEB,0x85,0x00,0x8B,0xE0,0xB4,0x1F,0xD0,0xE1,0xCD,0x20,0xA0,0xE3, + 0x33,0x2B,0x82,0xE2,0x92,0x01,0x01,0xE0,0xA1,0x29,0xA0,0xE1,0x01,0x1C,0x8A,0xE2, + 0x01,0x0C,0x80,0xE2,0xBE,0x28,0xC1,0xE1,0xB6,0x00,0xD0,0xE1,0xCD,0x20,0xA0,0xE3, + 0x33,0x2B,0x82,0xE2,0x92,0x00,0x00,0xE0,0xA0,0x09,0xA0,0xE1,0xB0,0x09,0xC1,0xE1, + 0x05,0x00,0x8B,0xE0,0x38,0x01,0xD0,0xE5,0x8D,0x01,0xCA,0xE5,0x92,0x01,0xDA,0xE5, + 0x90,0x11,0x9D,0xE5,0x01,0x00,0x50,0xE1,0x01,0x00,0x80,0x32,0x92,0x01,0xCA,0x35, + 0x92,0x01,0xDA,0xE5,0x13,0x00,0x50,0xE3,0x06,0x00,0x00,0x9A,0xCD,0x10,0xA0,0xE3, + 0x90,0x01,0x01,0xE0,0x8C,0x21,0x9D,0xE5,0x21,0x16,0xA0,0xE1,0x02,0x00,0x51,0xE1, + 0x14,0x00,0x80,0x32,0x92,0x01,0xCA,0x35,0x8C,0x01,0xDA,0xE5,0x57,0xEF,0x8D,0xE2, + 0x01,0x00,0x54,0xE3,0x05,0x00,0xCE,0xE7,0x88,0x11,0x9D,0xE5,0x01,0x50,0xC0,0xE7, + 0x8C,0x11,0xDA,0xE5,0x84,0x21,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x02,0x00,0xC1,0xE7, + 0x09,0x11,0x97,0xE7,0x15,0x2E,0x8D,0xE2,0x01,0x00,0xC2,0xE7,0x01,0x00,0xA0,0xE3, + 0x19,0x00,0x00,0xBA,0xAC,0x12,0x9F,0xE5,0x8A,0xC1,0xD1,0xE5,0x09,0x21,0x97,0xE7, + 0x80,0xA1,0x80,0xE0,0x00,0x10,0xE0,0xE3,0x0A,0xB1,0x87,0xE0,0x02,0x11,0x8B,0xE7, + 0x00,0x10,0xDE,0xE7,0x08,0x30,0xA0,0xE1,0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0x1A, + 0x01,0x00,0x5C,0xE3,0x01,0x10,0xA0,0xE3,0x08,0x00,0x00,0xBA,0x01,0x21,0x9B,0xE7, + 0x01,0x00,0x72,0xE3,0x02,0x00,0x00,0xDA,0x03,0x00,0x52,0xE1,0x02,0x30,0xA0,0xB1, + 0x0A,0x11,0x87,0xB7,0x01,0x10,0x81,0xE2,0x01,0x00,0x5C,0xE1,0xF6,0xFF,0xFF,0xAA, + 0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1,0xE7,0xFF,0xFF,0xDA,0x44,0x02,0x9F,0xE5, + 0x68,0x11,0x9D,0xE5,0x8A,0x01,0xD0,0xE5,0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA, + 0x6C,0x01,0x9D,0xE5,0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1,0x6C,0x01,0x8D,0xE5, + 0x82,0xFF,0xFF,0xDA,0x06,0x00,0xB0,0xE1,0x01,0x10,0x46,0xE2,0xFF,0x60,0x01,0xE2, + 0x21,0xFF,0xFF,0x1A,0x0C,0x82,0x9F,0xE5,0x01,0x60,0xA0,0xE3,0x8A,0x01,0xD8,0xE5, + 0x00,0x70,0xA0,0xE3,0x06,0xA0,0xA0,0xE1,0x01,0x00,0x50,0xE3,0x43,0x00,0x00,0xBA, + 0x15,0x0E,0x8D,0xE2,0x06,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3,0x3B,0x00,0x00,0x0A, + 0x06,0x01,0x86,0xE0,0x80,0x50,0x88,0xE0,0x40,0x12,0xD5,0xE5,0x84,0x01,0x9D,0xE5, + 0x0A,0x90,0x84,0xE0,0x00,0x10,0xD1,0xE7,0x08,0x00,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0x23,0x00,0x00,0x2A,0x08,0x00,0x59,0xE3,0x21,0x00,0x00,0xCA,0x02,0x0C,0x85,0xE2, + 0x46,0x00,0x80,0xE2,0xC2,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3,0x1C,0x00,0x00,0x0A, + 0x40,0x02,0xD5,0xE5,0x84,0x11,0x9D,0xE5,0x84,0x21,0x9D,0xE5,0x01,0x10,0xD0,0xE7, + 0x01,0x10,0x81,0xE2,0x02,0x10,0xC0,0xE7,0x09,0x01,0x89,0xE0,0x80,0xB0,0x88,0xE0, + 0x09,0x1D,0x85,0xE2,0x63,0x0F,0x8B,0xE2,0x0A,0x20,0xA0,0xE3,0x05,0xFC,0xFF,0xEB, + 0xED,0x01,0xD5,0xE5,0x57,0x1F,0x8D,0xE2,0x01,0xA0,0x8A,0xE2,0x93,0x01,0xCB,0xE5, + 0xEE,0x01,0xD5,0xE5,0x01,0x70,0x87,0xE2,0x94,0x01,0xCB,0xE5,0x40,0x02,0xD5,0xE5, + 0x09,0x00,0xC1,0xE7,0x88,0x11,0x9D,0xE5,0x01,0x90,0xC0,0xE7,0x58,0x01,0x9F,0xE5, + 0x00,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x01,0x10,0xA0,0x03,0x00,0x10,0xC0,0x05, + 0x0E,0x00,0x00,0xEA,0x02,0x0C,0x85,0xE2,0x46,0x00,0x80,0xE2,0xA0,0x0A,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x09,0x00,0x00,0x0A,0x01,0x00,0xA0,0xE3,0xB9,0x02,0xC8,0xE5, + 0x46,0x02,0xD5,0xE5,0x13,0x00,0x50,0xE3,0x04,0x00,0x00,0x9A,0x89,0x01,0xD8,0xE5, + 0x01,0x00,0x50,0xE3,0xB6,0x00,0xD8,0x01,0x04,0x00,0x80,0x03,0xB6,0x00,0xC8,0x01, + 0x8A,0x01,0xD8,0xE5,0x01,0x60,0x86,0xE2,0x06,0x00,0x50,0xE1,0xBB,0xFF,0xFF,0xAA, + 0xB6,0x00,0xD8,0xE1,0x04,0x00,0x10,0xE3,0x03,0x00,0x00,0x0A,0x04,0x10,0x9D,0xE5, + 0x04,0x00,0xC0,0xE3,0x8B,0x11,0xC8,0xE5,0xB6,0x00,0xC8,0xE1,0x01,0x00,0x54,0xE3, + 0x01,0x50,0xA0,0xE3,0x21,0x00,0x00,0xBA,0x57,0x6F,0x8D,0xE2,0x01,0x90,0xA0,0xE3, + 0x05,0x00,0xD6,0xE7,0x00,0x00,0x50,0xE3,0x0F,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3, + 0x00,0x10,0x88,0xE0,0xA3,0x22,0xD1,0xE5,0x00,0x00,0x52,0xE3,0xAC,0x12,0xD1,0x05, + 0x00,0x00,0x51,0x03,0x05,0x00,0x00,0x1A,0xFF,0x20,0x00,0xE2,0xFF,0x10,0x05,0xE2, + 0x01,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0x27,0xFC,0xFF,0xEB,0x02,0x00,0x00,0xEA, + 0x01,0x00,0x80,0xE2,0x09,0x00,0x50,0xE3,0xF0,0xFF,0xFF,0xBA,0x8B,0x01,0xD8,0xE5, + 0x00,0x00,0x50,0xE3,0x06,0x00,0x00,0x0A,0x05,0x01,0x85,0xE0,0x80,0xA0,0x88,0xE0, + 0x01,0x0C,0x8A,0xE2,0x92,0x00,0x80,0xE2,0x69,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3, + 0x92,0x91,0xCA,0x05,0x01,0x50,0x85,0xE2,0x04,0x00,0x55,0xE1,0xDF,0xFF,0xFF,0xDA, + 0x07,0x00,0x84,0xE0,0x88,0x01,0xC8,0xE5,0x28,0x00,0x9F,0xE5,0x5A,0x20,0xA0,0xE3, + 0x88,0x11,0xD0,0xE5,0x8A,0x11,0xC0,0xE5,0x63,0x1F,0x80,0xE2,0x09,0x0D,0x80,0xE2, + 0xAC,0xFB,0xFF,0xEB,0x65,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x78,0x06,0x00,0x20,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0x40,0x02,0x00,0x20, + 0x67,0x05,0x00,0x20,0x26,0x02,0x00,0x20,0xE3,0x02,0x00,0x20,0xF4,0x05,0x00,0x20, + 0xF1,0xB5,0x38,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x36,0x48,0x41,0x7F, + 0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D, + 0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20, + 0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x1C,0xF9,0x01,0xF0,0xCA,0xF9, + 0x00,0x24,0x27,0x00,0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0,0x2B,0xF9,0x00,0x28, + 0x28,0xD0,0x0E,0x21,0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x06,0xF0,0x34,0xFB,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18, + 0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x06,0xF0,0x26,0xFB,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD, + 0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3,0x7F,0x1C,0x15,0x2F, + 0xC8,0xD3,0x20,0x00,0xFF,0x38,0x27,0x38,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42, + 0xB2,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90, + 0xEC,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00,0xF0,0xB5,0x7B,0x4A, + 0xFF,0xB0,0xBC,0xB0,0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18,0xB8,0x90,0x48,0x42, + 0xB7,0x90,0x77,0x48,0x77,0x4E,0x07,0x7B,0x02,0xA8,0x01,0x90,0x76,0x48,0xBA,0x90, + 0x00,0x7D,0x00,0x28,0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90,0x73,0x4A,0x00,0x21, + 0x30,0x00,0xFE,0xF7,0xB5,0xFE,0x00,0x25,0x00,0x24,0x6F,0x48,0x20,0x38,0x01,0x7D, + 0xC9,0x07,0x14,0xD0,0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0,0xBD,0x42,0x0E,0xD1, + 0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42, + 0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0xB7,0x9A, + 0x21,0x00,0x28,0x00,0x06,0xF0,0xBC,0xFA,0x10,0xE0,0xBC,0x42,0xF7,0xD1,0x81,0x7D, + 0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0, + 0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x0E,0x2C, + 0xCB,0xD3,0x6D,0x1C,0x15,0x2D,0xC7,0xD3,0x01,0xF0,0x6C,0xF8,0x01,0xF0,0x1A,0xF9, + 0x00,0x25,0x00,0x24,0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00,0x28,0x00,0x02,0xF0, + 0x79,0xF8,0x00,0x28,0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00,0x59,0x58,0x03,0x04, + 0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0, + 0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0xA3,0xF8,0x39,0x19, + 0x01,0x9A,0x49,0x00,0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3,0x6D,0x1C,0x15,0x2D, + 0xD7,0xD3,0x00,0x20,0x00,0x90,0x01,0xF0,0xED,0xF8,0x00,0x25,0x00,0x24,0x21,0x00, + 0x28,0x00,0x02,0xF0,0x4F,0xF8,0x00,0x28,0x3E,0xD0,0x0E,0x21,0x69,0x43,0xB9,0x9B, + 0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A, + 0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00,0xF1,0x5B,0x00,0x04, + 0x00,0x0C,0x81,0x42,0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00,0x02,0xF0,0x72,0xF8, + 0x01,0x99,0xC8,0x53,0x00,0x98,0x03,0x21,0xFE,0xF7,0xE0,0xFD,0x00,0x29,0x01,0xD0, + 0x02,0x29,0x0D,0xD1,0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22,0x43,0x1E, + 0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0,0x11,0xFA,0x0B,0xE0, + 0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0,0x09,0xFA,0x00,0x28, + 0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C,0xB7,0xD3,0x6D,0x1C, + 0x15,0x2D,0xB3,0xD3,0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98,0x40,0x1E,0xB8,0x90, + 0x18,0xD2,0x00,0x25,0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43,0x01,0x99,0x30,0x19, + 0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00,0x06,0xF0,0x06,0xFA,0x64,0x1C,0x0E,0x2C, + 0xF4,0xD3,0x6D,0x1C,0x15,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0,0xF0,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0xF0,0xCE,0xFF,0x8D,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40, + 0xE0,0x04,0x00,0x20,0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x6D,0x05,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0, + 0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x7B, + 0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25,0x1F,0x4F,0xAD,0x01,0x32,0xE0,0x72,0x46, + 0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1, + 0x00,0x9C,0x93,0x00,0xA6,0x7B,0x1B,0x0F,0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19, + 0x24,0x6B,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19, + 0x00,0x6B,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40, + 0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E, + 0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42, + 0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0xFC,0xB5,0x04,0x00,0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49,0x40,0x8C,0x01,0x91, + 0x4B,0x89,0x40,0x39,0x00,0x91,0x89,0x7F,0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26, + 0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99,0x09,0x7A,0x00,0x29, + 0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00, + 0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46, + 0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42,0x5C,0xDC,0x82,0x42, + 0x5A,0xDB,0x8C,0x45,0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A, + 0x7B,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0,0x03,0x2A,0x76,0xD1, + 0xE2,0x79,0xD3,0x07,0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A,0x27,0xD1,0x09,0x20, + 0x00,0x25,0xE0,0x71,0x6B,0xE0,0x00,0x9A,0x92,0x7E,0x00,0x2A,0x67,0xD1,0x00,0xF0, + 0x79,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72,0x5F,0xE0,0xE2,0x79, + 0xD3,0x07,0xE8,0xD1,0x92,0x07,0x5A,0xD5,0x00,0xF0,0x6C,0xF8,0x06,0x00,0x08,0xD0, + 0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0x94,0xFD, + 0xEB,0xE7,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0x8E,0xFD,0x47,0xE0,0x11,0x20, + 0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x55,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0, + 0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x7B,0xFD,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20, + 0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28, + 0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4, + 0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0x57,0xFD,0xE6,0x71,0x09,0xE0,0x02,0x20, + 0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x4B,0xFD,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49, + 0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80, + 0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0xE0,0x04,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x7F,0x00,0x22,0x10,0x00, + 0x00,0x2E,0x23,0xD0,0x1B,0x7E,0x00,0x2B,0x20,0xD1,0x12,0x4F,0x1C,0xE0,0xD3,0x00, + 0xDD,0x19,0x09,0x23,0xDB,0x01,0xEB,0x18,0x00,0x25,0x5D,0x5F,0xA5,0x42,0x0E,0xDC, + 0x04,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB,0x02,0x25,0x5D,0x5F,0x8D,0x42,0x06,0xDC, + 0x06,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28, + 0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8,0xF0,0xBC,0x70,0x47, + 0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8D,0xB0,0x09,0x90, + 0x08,0x90,0xBA,0x48,0xBA,0x4C,0x00,0x68,0x01,0x88,0x07,0x91,0x01,0x00,0x40,0x31, + 0xCA,0x7F,0x60,0x30,0x06,0x92,0x8A,0x7F,0x05,0x92,0x40,0x78,0x04,0x90,0x88,0x7D, + 0xB3,0x49,0x03,0x90,0xE0,0x88,0x09,0x79,0x02,0x07,0x04,0xD5,0x00,0x29,0x02,0xD1, + 0x08,0x22,0x90,0x43,0xE0,0x80,0xAF,0x48,0x00,0x25,0x45,0x5F,0xFF,0x22,0xFF,0x23, + 0x2D,0x32,0x01,0x33,0x95,0x42,0x03,0xDD,0x02,0x25,0x45,0x5F,0x95,0x42,0x03,0xDC, + 0x04,0x22,0x82,0x5E,0x0A,0x2A,0x04,0xDD,0xE2,0x88,0x1A,0x43,0xE2,0x80,0x0A,0x22, + 0x04,0xE0,0x06,0x22,0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E,0xC2,0x80,0x02,0xE0, + 0xE2,0x88,0x9A,0x43,0xE2,0x80,0x07,0x9A,0x92,0x04,0x7E,0xD5,0x40,0x7A,0x00,0x22, + 0x00,0x28,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x22,0x00,0x92,0x00,0xF0,0x38,0xF9, + 0x97,0x49,0x11,0x22,0x20,0x79,0x92,0x01,0x8A,0x18,0x0B,0x92,0x23,0x22,0x52,0x01, + 0x8D,0x18,0x00,0x28,0x0C,0x90,0x4F,0xD0,0x21,0x89,0x90,0x4A,0x01,0x20,0x0A,0x91, + 0x16,0x68,0x40,0x36,0x72,0x8B,0x91,0x42,0x00,0xD3,0x00,0x20,0x02,0x90,0x0A,0x98, + 0x0A,0x22,0x12,0x21,0x50,0x43,0x69,0x5E,0x0F,0x00,0xFE,0xF7,0x9F,0xFA,0x31,0x7C, + 0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0x0A,0x98,0x0A,0x21, + 0xC0,0x1B,0xFE,0xF7,0x93,0xFA,0x71,0x7C,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0, + 0x00,0x20,0xAA,0x89,0xB3,0x7C,0x07,0x00,0x01,0x21,0x08,0x00,0x9A,0x42,0x00,0xD8, + 0x00,0x20,0x0B,0x9A,0xF3,0x7C,0x52,0x6B,0x9A,0x42,0x00,0xDB,0x00,0x21,0x02,0x9A, + 0x00,0x2A,0x19,0xD0,0x01,0x9A,0x00,0x2A,0x16,0xD0,0x00,0x2F,0x14,0xD0,0x00,0x28, + 0x12,0xD0,0x00,0x29,0x10,0xD0,0x72,0x48,0xC0,0x30,0xC0,0x6A,0x00,0x28,0x0B,0xD1, + 0x71,0x48,0x00,0x88,0x1E,0x28,0x07,0xD2,0x68,0x7C,0x00,0x28,0x1B,0xD0,0x71,0x7E, + 0x88,0x42,0x18,0xD8,0x40,0x1E,0x15,0xE0,0x68,0x49,0x0B,0x98,0x09,0x68,0x40,0x6B, + 0x40,0x31,0x0A,0x7D,0x90,0x42,0x0E,0xDB,0x0C,0x98,0x00,0x28,0x0B,0xD0,0xE0,0x88, + 0xC0,0x06,0x08,0xD4,0x68,0x7C,0xC9,0x7D,0x88,0x42,0x04,0xD2,0x03,0x99,0x88,0x42, + 0x01,0xD9,0x40,0x1C,0x68,0x74,0x68,0x7C,0x00,0xE0,0x1B,0xE0,0x03,0x99,0x10,0x22, + 0x88,0x42,0x0A,0xD8,0x00,0x98,0x00,0x28,0x07,0xD1,0xE0,0x88,0x10,0x43,0xE0,0x80, + 0x56,0x48,0x00,0x68,0x40,0x30,0x00,0x7E,0x0E,0xE0,0xE1,0x88,0xC8,0x06,0x0C,0xD5, + 0x28,0x7C,0x00,0x28,0x07,0xD1,0x51,0x48,0x91,0x43,0xE1,0x80,0x00,0x68,0x40,0x30, + 0x40,0x7D,0x68,0x74,0x01,0xE0,0x40,0x1E,0x28,0x74,0x20,0x79,0x00,0x28,0x7E,0xD0, + 0xE0,0x88,0x80,0x06,0x0B,0xD5,0x04,0xA8,0x03,0xC8,0x81,0x42,0x05,0xD9,0x08,0x00, + 0x04,0x99,0x40,0x1A,0x00,0x06,0x00,0x0E,0x00,0xE0,0x01,0x20,0x05,0x90,0x01,0x22, + 0x50,0x00,0x01,0x19,0x8C,0x46,0xFF,0x31,0x61,0x31,0xCB,0x89,0x00,0x2B,0x6F,0xD0, + 0x07,0x9D,0x00,0x20,0xAD,0x07,0x08,0xD5,0x06,0x9D,0xAB,0x42,0x05,0xD9,0x20,0x71, + 0xE0,0x88,0x08,0x23,0x18,0x43,0xE0,0x80,0x01,0x20,0x07,0x9B,0x5B,0x07,0x5F,0xD5, + 0x00,0x28,0x5D,0xD1,0xC8,0x89,0x05,0x99,0x88,0x42,0x59,0xD3,0x37,0x48,0x00,0x88, + 0x06,0x28,0x55,0xD9,0x00,0x23,0x01,0x20,0x29,0xE0,0xFF,0x25,0x21,0x18,0x66,0x35, + 0x6D,0x5C,0x95,0x42,0x22,0xD1,0x5B,0x1C,0xFF,0x31,0x21,0x31,0x09,0x7E,0x09,0x91, + 0x01,0x00,0x14,0xE0,0x4D,0x00,0x2D,0x19,0x2E,0x00,0xE0,0x36,0xF7,0x8A,0xFF,0x35, + 0x01,0x35,0xB7,0x82,0x2F,0x89,0xEF,0x80,0x65,0x18,0x2E,0x00,0xFF,0x36,0x21,0x36, + 0x77,0x7E,0xFF,0x35,0x61,0x35,0x37,0x76,0xAF,0x79,0x49,0x1C,0x6F,0x71,0x25,0x79, + 0x8D,0x42,0xE7,0xDA,0x21,0x79,0x49,0x1E,0x40,0x1E,0x21,0x71,0x40,0x1C,0x21,0x79, + 0x81,0x42,0xD2,0xDA,0x00,0x2B,0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x08,0x90, + 0xE0,0x88,0x20,0x21,0x08,0x43,0xE0,0x80,0x21,0x79,0x60,0x46,0xFF,0x30,0x49,0x1C, + 0x41,0x30,0x09,0x06,0xC3,0x88,0x09,0x0E,0x21,0x71,0x49,0x00,0x09,0x19,0xE0,0x31, + 0x8B,0x82,0xC1,0x8A,0x20,0x79,0x40,0x00,0x00,0x19,0xFF,0x30,0x01,0xE0,0x11,0xE0, + 0x06,0xE0,0x01,0x30,0xC1,0x80,0x23,0x79,0x0A,0x49,0x09,0x98,0x48,0x39,0x58,0x54, + 0x52,0x1C,0x08,0x2A,0x84,0xDB,0x08,0x98,0x00,0x28,0x03,0xD1,0xE0,0x88,0x20,0x21, + 0x88,0x43,0xE0,0x80,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x78,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xC0,0x01,0x00,0x20,0x7C,0x05,0x00,0x20,0xC0,0x05,0x00,0x20, + 0xF0,0xB5,0x5F,0x4C,0xB9,0xB0,0x20,0x68,0x00,0x21,0x60,0x30,0x07,0x79,0x40,0x79, + 0x33,0x90,0x5C,0x48,0x38,0x90,0x41,0x82,0x20,0x38,0x37,0x90,0x41,0x63,0x32,0x91, + 0x31,0x91,0x60,0x21,0x19,0xA8,0xFE,0xF7,0xE9,0xFA,0x60,0x21,0x01,0xA8,0xFE,0xF7, + 0xE5,0xFA,0x38,0x98,0x41,0x7C,0x20,0x68,0x40,0x30,0xC0,0x7D,0x81,0x42,0x77,0xD0, + 0x33,0x9D,0x0E,0x21,0x48,0x1B,0x34,0x90,0x5B,0xE0,0x15,0x21,0xC9,0x1B,0x36,0x91, + 0x33,0x99,0x38,0x00,0x69,0x1A,0x8C,0x00,0x1A,0xE0,0x4B,0x4A,0x6B,0x00,0x9E,0x18, + 0xB8,0x23,0xF3,0x5E,0x0E,0x21,0x46,0x00,0x41,0x43,0xB2,0x18,0x88,0x26,0x96,0x5F, + 0x49,0x19,0x09,0x04,0x9A,0x19,0x45,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E,0x51,0x18, + 0x32,0x9A,0x52,0x18,0x32,0x92,0x19,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51, + 0x36,0x99,0x81,0x42,0xE1,0xDC,0x78,0x00,0x15,0x21,0x09,0x1A,0x19,0xAE,0x35,0x90, + 0x30,0x59,0xFE,0xF7,0x33,0xF9,0x30,0x51,0x3E,0x00,0x84,0x46,0x19,0xE0,0x0E,0x20, + 0x70,0x43,0x36,0x49,0x40,0x19,0x40,0x00,0x09,0x5E,0x60,0x46,0x6A,0x00,0x09,0x1A, + 0x31,0x48,0x13,0x18,0xB8,0x22,0x9A,0x5E,0x73,0x00,0x1B,0x18,0x88,0x20,0x18,0x5E, + 0x10,0x18,0x09,0x18,0x0B,0x00,0x4B,0x43,0x01,0xA8,0x02,0x59,0xD1,0x18,0x76,0x1C, + 0x01,0x51,0x36,0x98,0xB0,0x42,0xE2,0xDC,0x35,0x98,0x14,0x21,0x09,0x1A,0x01,0xAE, + 0x30,0x59,0xFE,0xF7,0x0B,0xF9,0x30,0x51,0x31,0x99,0x40,0x18,0x31,0x90,0x34,0x98, + 0x6D,0x1C,0xA8,0x42,0xA1,0xDC,0x78,0x00,0x15,0x21,0x09,0x1A,0x33,0x98,0x0E,0x22, + 0x40,0x00,0x14,0x1A,0x61,0x43,0x06,0x00,0x32,0x98,0xFE,0xF7,0xF7,0xF8,0x38,0x99, + 0x48,0x82,0x31,0x98,0x21,0x00,0xFE,0xF7,0xF1,0xF8,0x00,0x21,0x01,0xAB,0x0B,0xE0, + 0x1B,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x15,0x00,0x55,0x43,0x37,0x9A,0x52,0x6B, + 0xAA,0x18,0x37,0x9D,0x49,0x1C,0x6A,0x63,0x8C,0x42,0xF2,0xDC,0x37,0x98,0x0D,0x21, + 0x40,0x6B,0x89,0x1B,0xFE,0xF7,0xDA,0xF8,0x15,0x22,0x34,0x99,0xD2,0x1B,0x92,0x02, + 0x51,0x43,0xFE,0xF7,0xD3,0xF8,0x37,0x99,0x48,0x63,0x38,0x99,0x12,0x20,0x08,0x5E, + 0x00,0x28,0x01,0xD1,0x40,0x1C,0x48,0x82,0x39,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x06,0x00,0x20,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0x10,0xB5,0x00,0x28,0x06,0xD1,0x14,0x48,0x00,0x69,0x00,0x04,0x00,0x0E,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x11,0x49,0x09,0x6B,0x11,0x4A,0x12,0x4B,0x8A,0x18,0x9A,0x42, + 0x16,0xD2,0x00,0x04,0x00,0x0C,0x48,0x43,0x59,0x1E,0xFE,0xF7,0xD7,0xF9,0x04,0x00, + 0x0A,0x21,0xFE,0xF7,0xD3,0xF9,0x04,0x29,0x00,0xD9,0x0A,0x34,0x0A,0x21,0x20,0x00, + 0xFE,0xF7,0xCC,0xF9,0x08,0x49,0x49,0x7C,0x08,0x18,0xFF,0x28,0x00,0xD9,0xFF,0x20, + 0x00,0x06,0x00,0x0E,0xDB,0xE7,0x00,0x00,0x00,0x90,0x00,0x40,0x00,0x70,0x00,0x40, + 0x90,0x6B,0xFF,0xFF,0xA1,0x0F,0x00,0x00,0x60,0x93,0x00,0x00,0xFE,0xB5,0x77,0x4C, + 0x60,0x7B,0x00,0x28,0x06,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C,0x06,0xF0,0x86,0xF9, + 0x06,0xF0,0x74,0xF9,0x01,0x20,0x40,0x03,0xFE,0xF7,0x60,0xFE,0xFE,0xF7,0x1E,0xFA, + 0x05,0xF0,0x5A,0xFC,0x05,0xF0,0x6E,0xFC,0x05,0xF0,0x82,0xFE,0x6C,0x48,0x01,0x25, + 0x85,0x60,0x1F,0x20,0x01,0xF0,0x24,0xFE,0x6A,0x48,0x02,0x90,0xC0,0xE0,0x6A,0x48, + 0x41,0x68,0x09,0x07,0x0B,0xD5,0xC1,0x68,0x00,0x29,0x08,0xD0,0xC0,0x68,0x07,0x28, + 0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0xB7,0xE0,0x05,0xF0,0x5B,0xF8,0x60,0x7B, + 0x00,0x28,0x04,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C,0x06,0xF0,0x57,0xF9,0x80,0x20, + 0xFE,0xF7,0x34,0xFE,0x03,0x20,0x05,0xF0,0xC9,0xFF,0x01,0x20,0x40,0x03,0xFE,0xF7, + 0x2D,0xFE,0x5A,0x48,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06, + 0x01,0xD5,0x04,0x20,0x00,0xE0,0x02,0x20,0x05,0xF0,0x5C,0xFE,0x00,0xF0,0xCC,0xFB, + 0x00,0xF0,0x88,0xFB,0x00,0xF0,0x96,0xFB,0x51,0x48,0x05,0x61,0x00,0xF0,0x42,0xFC, + 0x00,0xF0,0x78,0xFB,0x01,0x20,0x80,0x03,0xFE,0xF7,0x10,0xFE,0x00,0xF0,0x8A,0xFB, + 0x00,0xF0,0x38,0xFC,0xFE,0xF7,0x92,0xFA,0xA0,0x7C,0x00,0x28,0x05,0xD1,0x02,0x98, + 0x00,0x7B,0x00,0x28,0x01,0xD0,0x04,0xF0,0x99,0xFE,0x03,0xF0,0x6F,0xFD,0x00,0x28, + 0x00,0xD0,0x25,0x70,0xE0,0x8A,0x43,0x49,0x88,0x42,0x01,0xD2,0x40,0x1C,0xE0,0x82, + 0x3A,0x48,0x00,0x78,0x00,0x28,0x16,0xD1,0x39,0x4C,0x80,0x34,0x26,0x6A,0x67,0x6A, + 0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20,0x05,0xF0,0x23,0xFE,0x00,0x22, + 0x11,0x00,0x10,0x00,0x13,0x00,0x00,0xF0,0x4D,0xF9,0x26,0x62,0x67,0x62,0x01,0x98, + 0x60,0x63,0x00,0x98,0xE0,0x62,0x03,0x20,0x40,0x03,0xFE,0xF7,0xCF,0xFD,0x2B,0x4C, + 0x20,0x78,0x00,0x28,0x05,0xD0,0xA0,0x7C,0x00,0x09,0x04,0x28,0x45,0xD1,0x00,0x20, + 0x20,0x70,0x03,0x20,0x05,0xF0,0x3C,0xFF,0x60,0x65,0x03,0x20,0x05,0xF0,0x6E,0xFF, + 0x80,0x20,0xFE,0xF7,0xBB,0xFD,0x25,0x49,0xC8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E, + 0xC8,0x83,0x2D,0xE0,0xA0,0x7A,0x00,0x28,0x2A,0xD1,0xE0,0x6A,0x00,0x28,0x27,0xD0, + 0x60,0x6D,0x21,0x49,0x0C,0x1A,0xFF,0x20,0x91,0x30,0x84,0x42,0x20,0xDD,0xFF,0x26, + 0x01,0x36,0x30,0x00,0xFE,0xF7,0xAA,0xFD,0x02,0x20,0x05,0xF0,0x4F,0xFF,0x0A,0x21, + 0x20,0x00,0xFD,0xF7,0xBB,0xFF,0x41,0x11,0x02,0x20,0x05,0xF0,0x2F,0xFF,0x04,0x20, + 0xFE,0xF7,0xD4,0xFD,0x02,0x20,0x05,0xF0,0x31,0xFF,0x11,0x48,0x05,0x61,0xFF,0x20, + 0xFE,0xF7,0xCC,0xFD,0x02,0x20,0x05,0xF0,0x39,0xFF,0x30,0x00,0xFE,0xF7,0x86,0xFD, + 0x06,0x4C,0x20,0x78,0x00,0x28,0x00,0xD1,0x39,0xE7,0x04,0x48,0x40,0x7B,0x00,0x28, + 0x01,0xD0,0x06,0xF0,0x9B,0xF8,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x64,0x05,0x00,0x20, + 0x00,0x90,0x00,0x40,0x80,0x93,0x00,0x00,0x00,0x40,0x00,0x30,0x40,0x00,0x00,0x20, + 0x40,0x00,0x00,0x40,0x10,0x27,0x00,0x00,0xFC,0x3A,0x00,0x00,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21,0xFE,0xF7,0xD2,0xF8, + 0x0A,0x48,0x5A,0x22,0x00,0x21,0xFE,0xF7,0xCD,0xF8,0x08,0x48,0x00,0x24,0x0C,0x38, + 0x04,0x72,0x07,0x48,0x28,0x22,0x21,0x00,0xFE,0xF7,0xC4,0xF8,0x04,0x48,0x52,0x38, + 0x44,0x76,0x10,0xBC,0x08,0xBC,0x18,0x47,0xE3,0x02,0x00,0x20,0xCC,0x01,0x00,0x20, + 0xF2,0x04,0x00,0x20,0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21,0xFE,0xF7,0xB2,0xF8, + 0x14,0x48,0x12,0x22,0x00,0x21,0x12,0x30,0xFE,0xF7,0xAC,0xF8,0x11,0x48,0x09,0x22, + 0x00,0x21,0x44,0x30,0xFE,0xF7,0xA6,0xF8,0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30, + 0xFE,0xF7,0xA0,0xF8,0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30,0xFE,0xF7,0x9A,0xF8, + 0x08,0x48,0x10,0x22,0x00,0x21,0x62,0x30,0xFE,0xF7,0x94,0xF8,0x05,0x49,0x00,0x20, + 0x6C,0x31,0xC8,0x83,0xFF,0x39,0x61,0x39,0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20,0x8C,0x10,0x9F,0xE5,0x10,0x40,0x2D,0xE9, + 0x00,0x10,0x91,0xE5,0x84,0xC0,0x9F,0xE5,0x7E,0xE0,0xD1,0xE5,0x08,0x10,0xA0,0xE3, + 0x00,0x30,0xA0,0xE3,0x01,0x22,0x8C,0xE0,0x80,0x20,0x82,0xE0,0xB7,0x4F,0xA0,0xE3, + 0xB2,0x30,0x84,0xE1,0x03,0x2C,0x82,0xE2,0x01,0x10,0x51,0xE2,0xBC,0x36,0xC2,0xE1, + 0xF7,0xFF,0xFF,0x5A,0x01,0x20,0xA0,0xE3,0x00,0x10,0x8C,0xE0,0xD4,0x22,0xC1,0xE5, + 0x80,0x20,0x8C,0xE0,0x03,0x2C,0x82,0xE2,0xBC,0x3F,0xC2,0xE1,0x0C,0xE4,0xC1,0xE5, + 0x14,0x34,0xC1,0xE5,0x02,0x10,0xA0,0xE3,0x01,0x22,0x8C,0xE0,0x80,0x20,0x82,0xE0, + 0x01,0x2B,0x82,0xE2,0x01,0x10,0x51,0xE2,0xBC,0x31,0xC2,0xE1,0xF9,0xFF,0xFF,0x5A, + 0x00,0x01,0x8C,0xE0,0x00,0x10,0xE0,0xE3,0x01,0x0B,0x80,0xE2,0xBC,0x14,0xC0,0xE1, + 0xBE,0x14,0xC0,0xE1,0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x78,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48,0x1E,0x22,0x00,0x21,0xFE,0xF7,0x32,0xF8, + 0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF6,0x02,0x00,0x20,0x20,0x01,0x00,0x20,0x10,0xB5,0x05,0xF0,0x8D,0xFE,0x04,0xF0, + 0xC3,0xFD,0xFF,0xF7,0x47,0xFF,0x04,0xF0,0x25,0xFF,0x01,0xF0,0x99,0xFE,0x01,0xF0, + 0xD3,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33, + 0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD, + 0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47, + 0x78,0x06,0x00,0x20,0xFF,0xB5,0x69,0x48,0xE7,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0, + 0x01,0x20,0x62,0x90,0x00,0x20,0x02,0xE0,0x00,0x20,0x62,0x90,0x01,0x20,0x61,0x90, + 0x63,0x48,0x00,0x26,0x64,0x90,0x63,0x48,0x35,0x00,0x01,0x8B,0x05,0x91,0x41,0x8B, + 0x04,0x91,0x81,0x8A,0x03,0x91,0xC0,0x8A,0x02,0x90,0x5F,0x48,0x00,0x7B,0x63,0x96, + 0x01,0x90,0x00,0x24,0x28,0x00,0x0E,0x21,0x48,0x43,0x66,0x90,0x07,0x19,0x21,0x00, + 0x28,0x00,0x01,0xF0,0xFF,0xF9,0x55,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0, + 0x56,0x4A,0x52,0x7A,0x00,0x2A,0x01,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D, + 0xA2,0x42,0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0, + 0x4A,0x7E,0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42, + 0x14,0xD1,0x8A,0x7D,0xAA,0x42,0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E, + 0xAA,0x42,0x05,0xD0,0x4A,0x7E,0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1, + 0x05,0x99,0x04,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x04,0xE0,0x03,0x99,0x02,0x9A, + 0x41,0x18,0x09,0x04,0x09,0x0C,0x80,0x1A,0x64,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58, + 0x68,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01, + 0x00,0x0D,0x67,0x9B,0x05,0x2B,0x0E,0xD8,0x90,0x42,0x01,0xDA,0x62,0x9A,0x02,0xE0, + 0x88,0x42,0x0E,0xDD,0x61,0x9A,0x21,0x00,0x28,0x00,0x00,0xF0,0x97,0xF8,0x06,0xA8, + 0x87,0x55,0x76,0x1C,0x05,0xE0,0x63,0x99,0x06,0xA8,0x47,0x54,0x63,0x98,0x40,0x1C, + 0x63,0x90,0x64,0x1C,0x0E,0x2C,0x01,0xDA,0x66,0x98,0x97,0xE7,0x6D,0x1C,0x15,0x2D, + 0x8F,0xDB,0x67,0x98,0x05,0x28,0x00,0xD9,0x63,0x9E,0x00,0x2E,0x3A,0xDD,0x69,0x98, + 0x00,0x28,0x37,0xD1,0x00,0xF0,0x5E,0xF9,0x00,0xF0,0x74,0xF9,0x00,0xF0,0x22,0xFA, + 0x1B,0x4D,0x27,0xE0,0x06,0xA8,0x80,0x5D,0x80,0x00,0x65,0x90,0x28,0x58,0x01,0x01, + 0x07,0x05,0x6A,0x98,0x0C,0x0D,0x3F,0x0D,0x00,0x28,0x01,0xD0,0x64,0x21,0x00,0xE0, + 0x32,0x21,0xBC,0x42,0x06,0xD9,0xE0,0x1B,0x48,0x43,0x64,0x21,0xFD,0xF7,0xF6,0xFD, + 0x20,0x1A,0x05,0xE0,0x38,0x1B,0x64,0x21,0x48,0x43,0xFD,0xF7,0xEF,0xFD,0x00,0x19, + 0x0F,0x49,0x00,0x04,0x00,0x0C,0x88,0x42,0x00,0xD9,0x08,0x00,0x65,0x99,0x00,0x04, + 0x38,0x43,0x68,0x50,0x76,0x1E,0xD5,0xD5,0x00,0xF0,0x2C,0xF9,0x00,0xF0,0x42,0xF9, + 0x00,0xF0,0xF0,0xF9,0x6B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00, + 0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00,0xE0,0x04,0x00,0x20,0x64,0x05,0x00,0x20, + 0xFF,0x0F,0x00,0x00,0x7F,0xB5,0x01,0x25,0x6D,0x07,0x28,0x68,0x02,0x28,0x27,0xD1, + 0xAC,0x68,0x01,0xAA,0x20,0x05,0x00,0x0D,0x02,0x90,0x20,0x02,0x00,0x0D,0x03,0x90, + 0x02,0xA9,0x03,0xA8,0x6B,0x46,0x04,0xF0,0x87,0xFF,0x40,0x1C,0x18,0xD0,0x01,0x98, + 0x03,0x99,0x40,0x00,0x40,0x18,0x03,0x21,0xFD,0xF7,0xE0,0xFE,0x00,0x05,0x06,0x0A, + 0x09,0x48,0x02,0x99,0x04,0x40,0x00,0x98,0x26,0x43,0x40,0x00,0x40,0x18,0x03,0x21, + 0xFD,0xF7,0xD4,0xFE,0x00,0x05,0x00,0x0D,0x31,0x0B,0x09,0x03,0x08,0x43,0xA8,0x60, + 0x7F,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x30,0xB4,0x0E,0x25, + 0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A, + 0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A, + 0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0, + 0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E, + 0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0xF0,0xB5,0x8B,0xB0,0x0E,0x27,0x15,0x20, + 0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48,0x53,0x49,0x0A,0x90,0x80,0x7F,0x09,0x91, + 0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x0D,0x20,0x03,0x21,0x05,0x90,0x02,0xE0, + 0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98,0x01,0x72,0x4C,0x48,0x0A,0x22,0x01,0x8C, + 0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x0E,0x04, + 0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98,0x00,0x28,0x7F,0xD0,0x05,0x98,0x41,0x00, + 0x30,0x00,0xFD,0xF7,0x3B,0xFD,0x05,0x04,0x2D,0x0C,0x00,0x24,0xBF,0x1C,0x0A,0xE0, + 0x30,0x00,0x60,0x43,0x05,0x99,0xFD,0xF7,0x31,0xFD,0x3D,0x4A,0x61,0x00,0x40,0x19, + 0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42,0xF2,0xDB,0x04,0x98,0x41,0x00,0x01,0x98, + 0xFD,0xF7,0x24,0xFD,0x06,0x9F,0x06,0x04,0x36,0x0C,0x00,0x24,0xBF,0x1C,0x0B,0xE0, + 0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7,0x19,0xFD,0x31,0x4A,0x81,0x19,0x60,0x00, + 0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82,0xBC,0x42,0xF1,0xDB,0x0A,0x98,0x80,0x7F, + 0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0,0x29,0x4A,0x25,0x21,0x10,0x19,0x49,0x01, + 0x40,0x18,0x41,0x7B,0x0A,0x98,0x80,0x7F,0x80,0x07,0x03,0xD5,0x05,0x98,0x02,0x95, + 0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99,0x02,0x96,0x03,0x91,0x20,0x49,0x40,0x00, + 0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7,0xEF,0xFC,0x1C,0x4A, + 0xE1,0x00,0x89,0x18,0x09,0x22,0xD2,0x01,0x8F,0x18,0x38,0x80,0x03,0x98,0x18,0x49, + 0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90,0x80,0x8A,0x0A,0x21,0x80,0x1B,0xFD,0xF7, + 0xDD,0xFC,0x78,0x80,0x08,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19,0xFD,0xF7,0x06,0xFE, + 0xB8,0x80,0x07,0x98,0x0A,0x21,0x80,0x8A,0x80,0x19,0xFD,0xF7,0xFF,0xFD,0xF8,0x80, + 0x02,0x98,0x0A,0x21,0x40,0x00,0xFD,0xF7,0xF9,0xFD,0x09,0x99,0x64,0x1C,0x48,0x81, + 0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x7F,0xA0,0x42,0xB5,0xDC,0x0B,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xA0,0x04,0x00,0x20,0xE0,0x04,0x00,0x20,0x00,0x93,0x00,0x00, + 0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48,0x92,0x00,0xFD,0xF7,0xCD,0xFD,0x07,0x48, + 0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43,0x06,0x48,0xFD,0xF7,0xF1,0xFD,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x93,0x00,0x00, + 0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40,0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22, + 0xFD,0xF7,0xA2,0xFD,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32,0xFD,0xF7,0x9C,0xFD, + 0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00,0xFD,0xF7,0x96,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00,0x04,0x90,0x00,0x40,0x00,0x97,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0x79,0xFD,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0x7B,0xFD,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0x6A,0xFD,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0x6C,0xFD,0x0C,0x48,0x6D,0x00,0x04,0x04,0x24,0x0C, + 0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0x5B,0xFD,0x09,0x49,0x2A,0x00,0x20,0x00, + 0x00,0x23,0xFD,0xF7,0x5D,0xFD,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0x00,0x96,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00, + 0x78,0x08,0x10,0x40,0x02,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x70,0x47,0x00,0x00, + 0x00,0x90,0x00,0x40,0xF0,0x47,0x2D,0xE9,0x00,0x80,0xA0,0xE1,0xF4,0x01,0x9F,0xE5, + 0xF4,0x71,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x00,0x50,0xA0,0xE3,0xB4,0x67,0xD0,0xE1, + 0x76,0x00,0xD0,0xE5,0x01,0x40,0xA0,0xE3,0x90,0x00,0x01,0xE0,0x8A,0x01,0xD7,0xE5, + 0xFF,0x90,0x01,0xE2,0x01,0x00,0x50,0xE3,0x0E,0x00,0x00,0xBA,0x04,0x01,0x84,0xE0, + 0x80,0x00,0x87,0xE0,0x40,0x12,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A, + 0x02,0x0C,0x80,0xE2,0x46,0x00,0x80,0xE2,0x41,0x05,0x00,0xEB,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x85,0x12,0xFF,0x50,0x00,0x12,0x8A,0x01,0xD7,0xE5,0x01,0x40,0x84,0xE2, + 0x04,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA,0x90,0x01,0x9F,0xE5,0x00,0x50,0x80,0xE5, + 0x8C,0x01,0x9F,0xE5,0xB4,0x2C,0xD0,0xE1,0xB8,0x3C,0xD0,0xE1,0xBA,0xCC,0xD0,0xE1, + 0x03,0x10,0x42,0xE0,0x00,0x00,0x51,0xE3,0x02,0x10,0x43,0xD0,0xB6,0x3C,0xD0,0xE1, + 0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1,0x0C,0x20,0x43,0xE0,0x00,0x00,0x52,0xE3, + 0x03,0x20,0x4C,0xD0,0xD0,0x32,0xD7,0xE5,0x02,0x28,0xA0,0xE1,0x22,0x28,0xA0,0xE1, + 0x00,0x00,0x53,0xE3,0xD3,0x32,0xD7,0x15,0xC8,0x00,0x53,0x13,0x01,0x00,0x00,0x2A, + 0x01,0x30,0x83,0xE2,0xD3,0x32,0xC7,0xE5,0xB6,0x3B,0xD0,0xE1,0x01,0xC0,0xA0,0xE3, + 0x14,0x00,0x53,0xE3,0x02,0x00,0x00,0x2A,0xB9,0x32,0xD7,0xE5,0x00,0x00,0x53,0xE3, + 0xBA,0xC2,0xC7,0x15,0x19,0x00,0x51,0xE3,0x19,0x00,0x52,0x93,0x03,0x00,0x00,0x9A, + 0xB8,0x32,0xD7,0xE5,0xC8,0x00,0x53,0xE3,0x01,0x30,0x83,0x32,0xB8,0x32,0xC7,0x35, + 0xFE,0x3C,0xD0,0xE1,0x02,0x00,0x55,0xE3,0x19,0x00,0x51,0x33,0x19,0x00,0x52,0x33, + 0x03,0x00,0x00,0x2A,0x04,0x00,0x53,0xE3,0x05,0x00,0x00,0xAA,0x01,0x30,0x83,0xE2, + 0x02,0x00,0x00,0xEA,0x03,0x00,0x73,0xE3,0x01,0x00,0x00,0xDA,0x01,0x30,0x43,0xE2, + 0xBE,0x3C,0xC0,0xE1,0xD3,0x32,0xD7,0xE5,0x01,0x00,0x53,0xE3,0x78,0x10,0xA0,0x83, + 0x0D,0x00,0x00,0x8A,0x02,0x00,0x55,0xE3,0x0C,0x00,0x00,0x2A,0xFE,0x3C,0xD0,0xE1, + 0x02,0x00,0x53,0xE3,0x09,0x00,0x00,0xDA,0xB8,0x32,0xD7,0xE5,0x14,0x00,0x53,0xE3, + 0x06,0x00,0x00,0x2A,0x47,0x10,0x41,0xE2,0x95,0x00,0x51,0xE3,0x47,0x10,0x42,0x22, + 0x95,0x00,0x51,0x23,0x01,0x00,0x00,0x2A,0x77,0x10,0xE0,0xE3,0xBC,0x1C,0xC0,0xE1, + 0x00,0x10,0xA0,0xE3,0x02,0x00,0x55,0xE3,0xD2,0x12,0xC7,0xE5,0x0A,0x00,0x00,0x2A, + 0xFC,0x1C,0xD0,0xE1,0x78,0x00,0x71,0xE3,0x03,0x00,0x00,0x1A,0xD1,0x12,0xD7,0xE5, + 0xC8,0x00,0x51,0xE3,0x01,0x10,0x81,0x32,0xD1,0x12,0xC7,0x35,0xD1,0x12,0xD7,0xE5, + 0x02,0x00,0x51,0xE3,0xD2,0xC2,0xC7,0x05,0x01,0x00,0x00,0xEA,0x3B,0x10,0xE0,0x83, + 0xBC,0x1C,0xC0,0x81,0xFC,0x0C,0xD0,0xE1,0x00,0x00,0x58,0xE3,0x06,0x10,0x80,0xE0, + 0xF0,0x47,0xBD,0x18,0x91,0x01,0x00,0xE0,0x1E,0xFF,0x2F,0x11,0x04,0x10,0xD7,0xE5, + 0x01,0x00,0x51,0xE3,0xF0,0x47,0xBD,0x08,0x1E,0xFF,0x2F,0x01,0x09,0x10,0xA0,0xE1, + 0xF0,0x47,0xBD,0xE8,0x71,0xF5,0xFF,0xEA,0x78,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xA0,0x05,0x00,0x20,0x40,0x02,0x00,0x20,0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3, + 0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2, + 0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43, + 0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40,0x70,0x47,0x00,0x00,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x04,0xF0,0xA5,0xFA,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x40,0x7B,0x00,0x28, + 0x01,0xD0,0x05,0xF0,0x8B,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0x64,0x05,0x00,0x20,0xF1,0xB5,0x61,0x48,0x2E,0x21,0x90,0xB0, + 0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63, + 0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x04,0xF0,0x7B,0xFA,0x59,0x4D, + 0x68,0x7B,0x00,0x28,0x01,0xD0,0x05,0xF0,0x71,0xFB,0x10,0x9B,0x00,0x21,0x01,0x20, + 0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x05,0xF0,0xA2,0xFB,0x1E,0x16,0x40,0x40, + 0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x68,0x4F,0x6F,0x76,0x7D, + 0x40,0x84,0x40,0x8B,0x92,0x4F,0x40,0x40,0x40,0x40,0x99,0x40,0x0B,0x20,0xF0,0x63, + 0x4D,0xE0,0x00,0xF0,0x17,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7, + 0x35,0xF8,0x00,0xF0,0x1D,0xFF,0x44,0x48,0x44,0x4A,0x41,0x68,0x52,0x68,0x91,0x42, + 0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83, + 0xFC,0xF7,0xC8,0xFF,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7,0x09,0xFE,0xA8,0x78, + 0x80,0x07,0x01,0xD5,0x05,0xF0,0xE8,0xFA,0x3A,0x49,0x40,0x22,0x68,0x46,0xFD,0xF7, + 0x73,0xFB,0x01,0x20,0x08,0x90,0x68,0x46,0x05,0xF0,0xF6,0xFA,0xF7,0x63,0x1E,0xE0, + 0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20, + 0x00,0xE0,0x00,0x20,0x05,0xF0,0xBC,0xF8,0xF0,0xE7,0x03,0x21,0x09,0x07,0xCA,0x60, + 0xFD,0xF7,0xFC,0xFF,0x10,0x98,0xFD,0xF7,0x4D,0xFF,0x08,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFD,0xF7,0xF3,0xFF,0x00,0xF0,0x4F,0xFE,0x00,0xF0,0xE7,0xF8,0x20,0x48, + 0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xA8,0x72,0xD2,0xE7,0xA9,0x72,0xD0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0xE8,0x72,0xCB,0xE7,0xE9,0x72,0xC9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73, + 0xC4,0xE7,0x29,0x73,0xC2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x73,0xBD,0xE7, + 0x69,0x73,0xBB,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x73,0xB6,0xE7,0xE9,0x73, + 0xB4,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x74,0xAF,0xE7,0x29,0x74,0xAD,0xE7, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x74,0xA8,0xE7,0x69,0x74,0xA6,0xE7,0x00,0x2C, + 0x01,0xD0,0xAC,0x74,0x00,0xE0,0xA9,0x74,0x04,0xF0,0x82,0xFE,0x9E,0xE7,0x00,0x00, + 0x00,0x40,0x00,0x30,0x64,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0x00,0x93,0x00,0x00, + 0xE0,0x95,0x00,0x00,0xC0,0x92,0x00,0x00,0xF0,0xB5,0x34,0x4C,0x30,0x38,0x34,0x4A, + 0x34,0x4E,0x35,0x4F,0x35,0x49,0x25,0x68,0x03,0x00,0x05,0xF0,0xE9,0xFA,0x12,0x0A, + 0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16,0x3E,0x43,0x47,0x4D, + 0x50,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61, + 0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x34,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68, + 0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48, + 0x03,0x7B,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F, + 0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D, + 0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43, + 0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07, + 0xC0,0x0F,0xCC,0xE7,0x38,0x69,0x40,0x08,0x00,0x02,0xC8,0xE7,0x13,0x48,0xA2,0x69, + 0xC0,0x8B,0x00,0x04,0x10,0x43,0xC2,0xE7,0x38,0x69,0x40,0x08,0xBF,0xE7,0x10,0x48, + 0x00,0x6A,0xBC,0xE7,0x48,0x69,0x10,0x42,0xFC,0xD1,0x04,0xF0,0x5B,0xF9,0xFF,0x20, + 0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x92,0x00,0x00, + 0x00,0x93,0x00,0x00,0x15,0x00,0x0E,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30, + 0xC0,0x0F,0x00,0x20,0xE0,0x04,0x00,0x20,0x00,0x96,0x00,0x00,0xE0,0x95,0x00,0x00, + 0x64,0x05,0x00,0x20,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43, + 0xE0,0x60,0xFD,0xF7,0x39,0xFF,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFD,0xF7,0x16,0xFF, + 0x03,0xF0,0xA0,0xFF,0x00,0xF0,0x9A,0xFD,0x03,0xF0,0x92,0xFF,0x30,0x00,0xFD,0xF7, + 0x3F,0xFF,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x20,0x03,0x21, + 0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x03,0xF0,0x8C,0xFF,0xFF,0xF7,0xE0,0xFC, + 0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x05,0xF0,0x47,0xFA, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x22,0x48, + 0x00,0x68,0x00,0x88,0xC0,0x06,0x3C,0xD5,0x20,0x4E,0x30,0x7A,0x00,0x28,0x38,0xD0, + 0x70,0x7A,0x00,0x28,0x35,0xD0,0x01,0x25,0x30,0xE0,0x0A,0x21,0x69,0x43,0x1C,0x4B, + 0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x7A,0x81,0x34,0x24,0xE0,0x0A,0x22,0x42,0x43, + 0xD2,0x18,0xFF,0x32,0xE1,0x32,0x21,0x7B,0x92,0x79,0x91,0x42,0x1A,0xD1,0x0A,0x22, + 0x50,0x43,0xC7,0x18,0xFF,0x37,0x0E,0x21,0xE1,0x37,0x08,0x20,0x61,0x5E,0x38,0x5E, + 0xBA,0x5E,0x08,0x1A,0x10,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x89,0xE1,0x89, + 0xFF,0xF7,0x12,0xFA,0xE0,0x81,0x7A,0x89,0x21,0x8A,0x00,0x98,0xFF,0xF7,0x0C,0xFA, + 0x20,0x82,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD8,0xDA,0x6D,0x1C,0x30,0x7A,0xA8,0x42, + 0xCB,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x06,0x00,0x20,0xC0,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x9C,0xD0,0x4D,0xE2, + 0x00,0x00,0xA0,0xE3,0x34,0x00,0x8D,0xE5,0x30,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5, + 0x28,0x00,0x8D,0xE5,0x3C,0x08,0x9F,0xE5,0xB0,0x12,0xD0,0xE1,0x20,0x10,0x8D,0xE5, + 0xB2,0x02,0xD0,0xE1,0x1C,0x00,0x8D,0xE5,0x2C,0x08,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0x8A,0x20,0xD0,0xE5,0x7C,0x10,0xD0,0xE5,0x7D,0xB0,0xD0,0xE5,0x18,0x20,0x8D,0xE5, + 0x89,0x20,0xD0,0xE5,0x14,0x20,0x8D,0xE5,0xB0,0x20,0xD0,0xE1,0x08,0x00,0x12,0xE3, + 0x23,0x00,0x00,0x0A,0x7F,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x88,0x20,0x8D,0xE5, + 0x80,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x84,0x20,0x8D,0xE5,0x81,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x80,0x20,0x8D,0xE5,0x82,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x7C,0x20,0x8D,0xE5,0x83,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x78,0x20,0x8D,0xE5, + 0x84,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x74,0x20,0x8D,0xE5,0x85,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x70,0x20,0x8D,0xE5,0x86,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x6C,0x20,0x8D,0xE5,0x87,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x68,0x20,0x8D,0xE5, + 0x88,0x00,0xD0,0xE5,0x91,0x00,0x00,0xE0,0x64,0x00,0x8D,0xE5,0x8C,0x07,0x9F,0xE5, + 0x88,0x11,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x00,0x60,0xA0,0x13,0x03,0x00,0x00,0x1A, + 0x0B,0x04,0x00,0xEB,0x9C,0xD0,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x68,0xA7,0x9F,0xE5,0x06,0x50,0x8A,0xE0,0xA4,0x42,0xD5,0xE5,0x00,0x00,0x54,0xE3, + 0x0C,0x00,0x00,0x0A,0x18,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x06,0x00,0x00,0x1A, + 0x04,0x01,0x84,0xE0,0x80,0x00,0x8A,0xE0,0x01,0x0C,0x80,0xE2,0x92,0x00,0x80,0xE2, + 0x77,0x03,0x00,0xEB,0x00,0x00,0x50,0xE3,0x02,0x00,0x00,0x0A,0xD2,0x02,0xDA,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x06,0x00,0xA0,0xE1,0x18,0x00,0x00,0xEA, + 0x07,0x00,0xA0,0xE3,0x00,0x12,0x8A,0xE0,0x86,0x10,0x81,0xE0,0x02,0x2C,0x81,0xE2, + 0xBC,0x3D,0xD2,0xE1,0x03,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE2,0xBC,0x3E,0xC2,0xE1, + 0xBC,0x26,0xD1,0xE1,0xBC,0x27,0xC1,0xE1,0xF5,0xFF,0xFF,0x5A,0x04,0x01,0x84,0xE0, + 0x80,0x80,0x8A,0xE0,0x01,0x7C,0x88,0xE2,0xBE,0x08,0xD7,0xE1,0x20,0x10,0x9D,0xE5, + 0x01,0x10,0x41,0xE2,0x01,0x00,0x50,0xE1,0xB0,0x19,0xD7,0xD1,0x1C,0x00,0x9D,0xD5, + 0x01,0x00,0x40,0xD2,0x00,0x00,0x51,0xD1,0x03,0x00,0x00,0xDA,0x8C,0x01,0xD8,0xE5, + 0x01,0x00,0x40,0xE2,0x57,0xFC,0xFF,0xEB,0x84,0x01,0x00,0xEA,0xBE,0x18,0xD7,0xE1, + 0x86,0x00,0x8A,0xE0,0x02,0x9C,0x80,0xE2,0x98,0x00,0x8D,0xE5,0xBC,0x1D,0xC9,0xE1, + 0xB0,0x19,0xD7,0xE1,0x03,0x4C,0x80,0xE2,0x00,0x30,0xA0,0xE3,0x02,0xCB,0xA0,0xE3, + 0xBC,0x16,0xC4,0xE1,0x03,0x10,0xA0,0xE1,0x0C,0x20,0xA0,0xE1,0x07,0x00,0xA0,0xE3, + 0x78,0xE6,0x9F,0xE5,0x00,0xE2,0x8E,0xE0,0x86,0xE0,0x8E,0xE0,0x94,0xE0,0x8D,0xE5, + 0x02,0xEC,0x8E,0xE2,0xFC,0xAD,0xDE,0xE1,0x00,0x00,0x5A,0xE3,0x03,0x00,0x00,0xDA, + 0x03,0x00,0x5A,0xE1,0xBC,0x3D,0xDE,0xC1,0x0C,0x00,0x5A,0xE1,0xBC,0xCD,0xDE,0xB1, + 0x94,0xE0,0x9D,0xE5,0x03,0xEC,0x8E,0xE2,0xFC,0xA6,0xDE,0xE1,0x00,0x00,0x5A,0xE3, + 0x03,0x00,0x00,0xDA,0x01,0x00,0x5A,0xE1,0xBC,0x16,0xDE,0xC1,0x02,0x00,0x5A,0xE1, + 0xBC,0x26,0xDE,0xB1,0x01,0x00,0x50,0xE2,0xE8,0xFF,0xFF,0x5A,0x0C,0x00,0x43,0xE0, + 0xF0,0x00,0x50,0xE3,0x02,0x30,0x41,0xD0,0xF0,0x00,0x53,0xD3,0x0C,0xC6,0x9F,0xC5, + 0x01,0x30,0xA0,0xC3,0xD0,0x32,0xCC,0xC5,0x1E,0x00,0x50,0xE3,0x02,0x00,0x41,0xB0, + 0x1E,0x00,0x50,0xB3,0xF4,0x15,0x9F,0xA5,0x00,0x00,0xA0,0xA3,0xF1,0x00,0xC1,0xA5, + 0xE8,0x05,0x9F,0xB5,0x01,0x10,0xA0,0xB3,0xF1,0x10,0xC0,0xB5,0xD4,0x02,0xD5,0xE5, + 0x01,0x00,0x50,0xE3,0x64,0xA0,0xA0,0x93,0x24,0xA0,0x8D,0x95,0x0E,0x00,0x00,0x9A, + 0xFC,0x2D,0xD9,0xE1,0xFC,0x3E,0xD9,0xE1,0x03,0x00,0x42,0xE0,0x00,0x00,0x50,0xE3, + 0x02,0x00,0x43,0xD0,0xFC,0x36,0xD4,0xE1,0xFC,0x27,0xD4,0xE1,0x00,0xA8,0xA0,0xE1, + 0x4A,0xA8,0xA0,0xE1,0x02,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3,0x03,0x00,0x42,0xD0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x24,0x00,0x8D,0xE5,0xFC,0x1E,0xD9,0xE1, + 0xFC,0x0D,0xD9,0xE1,0xAD,0x0F,0x00,0xEB,0x3C,0x00,0x8D,0xE5,0xFC,0x17,0xD4,0xE1, + 0xFC,0x06,0xD4,0xE1,0xA9,0x0F,0x00,0xEB,0x38,0x00,0x8D,0xE5,0xFC,0x1F,0xD9,0xE1, + 0x3C,0x00,0x9D,0xE5,0xA5,0x0F,0x00,0xEB,0x44,0x00,0x8D,0xE5,0xFC,0x18,0xD4,0xE1, + 0x38,0x00,0x9D,0xE5,0xA1,0x0F,0x00,0xEB,0x40,0x00,0x8D,0xE5,0xFC,0x21,0xD4,0xE1, + 0xFC,0x10,0xD4,0xE1,0x44,0x00,0x9D,0xE5,0x9F,0x0F,0x00,0xEB,0x4C,0x00,0x8D,0xE5, + 0xFC,0x2A,0xD4,0xE1,0xFC,0x19,0xD4,0xE1,0x40,0x00,0x9D,0xE5,0x9A,0x0F,0x00,0xEB, + 0x48,0x00,0x8D,0xE5,0xFC,0x23,0xD4,0xE1,0xFC,0x12,0xD4,0xE1,0x4C,0x00,0x9D,0xE5, + 0x95,0x0F,0x00,0xEB,0x54,0x00,0x8D,0xE5,0xFC,0x2C,0xD4,0xE1,0xFC,0x1B,0xD4,0xE1, + 0x48,0x00,0x9D,0xE5,0x90,0x0F,0x00,0xEB,0x50,0x00,0x8D,0xE5,0xFC,0x25,0xD4,0xE1, + 0xFC,0x14,0xD4,0xE1,0x54,0x00,0x9D,0xE5,0x8B,0x0F,0x00,0xEB,0x5C,0x00,0x8D,0xE5, + 0xFC,0x2E,0xD4,0xE1,0xFC,0x1D,0xD4,0xE1,0x50,0x00,0x9D,0xE5,0x86,0x0F,0x00,0xEB, + 0x58,0x00,0x8D,0xE5,0x24,0x10,0x9D,0xE5,0x0A,0x00,0xA0,0xE1,0x3D,0x04,0x00,0xEB, + 0xC8,0x34,0x9F,0xE5,0x01,0x10,0xA0,0xE3,0x01,0x22,0x83,0xE0,0x86,0x20,0x82,0xE0, + 0x01,0x2B,0x82,0xE2,0xBC,0xC1,0xD2,0xE1,0x01,0x10,0x51,0xE2,0xBC,0xC2,0xC2,0xE1, + 0xF8,0xFF,0xFF,0x5A,0x98,0x10,0x9D,0xE5,0x01,0x1B,0x81,0xE2,0xBC,0x01,0xC1,0xE1, + 0x14,0x14,0xD5,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x20,0x51,0xE2,0x06,0x00,0x00,0xBA, + 0x01,0xC2,0x83,0xE0,0x86,0xC0,0x8C,0xE0,0x01,0xCB,0x8C,0xE2,0xFC,0xC1,0xDC,0xE1, + 0x01,0x10,0x51,0xE2,0x0C,0x00,0x80,0xE0,0xF8,0xFF,0xFF,0x5A,0x01,0x10,0x82,0xE2, + 0x5E,0xF3,0xFF,0xEB,0x84,0x10,0x9D,0xE5,0x00,0xA0,0xA0,0xE1,0x01,0x00,0x50,0xE1, + 0x01,0x00,0xA0,0xD3,0x0B,0x00,0x00,0xDA,0x7C,0x00,0x9D,0xE5,0x00,0x00,0x5A,0xE1, + 0x02,0x00,0xA0,0xD3,0x07,0x00,0x00,0xDA,0x74,0x00,0x9D,0xE5,0x00,0x00,0x5A,0xE1, + 0x03,0x00,0xA0,0xD3,0x03,0x00,0x00,0xDA,0x6C,0x00,0x9D,0xE5,0x00,0x00,0x5A,0xE1, + 0x05,0x00,0xA0,0xC3,0x04,0x00,0xA0,0xD3,0x0C,0x14,0xD5,0xE5,0x01,0x10,0x40,0xE0, + 0x00,0x00,0x51,0xE3,0x00,0x00,0x6B,0xE2,0x06,0x00,0x00,0xDA,0xFC,0x1F,0xD4,0xE1, + 0x0B,0x00,0x51,0xE1,0x01,0x00,0x00,0x1A,0x00,0x10,0xA0,0xE3,0x06,0x00,0x00,0xEA, + 0x01,0x10,0x81,0xE2,0x04,0x00,0x00,0xEA,0xFC,0x1F,0xD4,0xE1,0x04,0x00,0x00,0xAA, + 0x00,0x00,0x51,0xE1,0xF7,0xFF,0xFF,0x0A,0x01,0x10,0x41,0xE2,0xBC,0x1F,0xC4,0xE1, + 0x02,0x00,0x00,0xEA,0x00,0x00,0x51,0xE3,0xFA,0xFF,0xFF,0xCA,0xF3,0xFF,0xFF,0xBA, + 0xFC,0x3F,0xD4,0xE1,0x0B,0x00,0x53,0xE1,0x03,0x00,0x00,0x1A,0x0C,0x14,0xD5,0xE5, + 0x05,0x00,0x51,0xE3,0x01,0x00,0x81,0x32,0x05,0x00,0x00,0x3A,0x00,0x00,0x53,0xE1, + 0x04,0x00,0x00,0x1A,0x0C,0x04,0xD5,0xE5,0x01,0x00,0x50,0xE3,0x01,0x00,0x00,0x9A, + 0x01,0x00,0x40,0xE2,0x0C,0x04,0xC5,0xE5,0x58,0x30,0x8D,0xE2,0x09,0x00,0x93,0xE8, + 0x60,0x00,0x8D,0xE5,0xD4,0x02,0xD5,0xE5,0x00,0x10,0xA0,0xE1,0x90,0x00,0x8D,0xE5, + 0x8C,0x00,0x8D,0xE5,0x03,0x00,0xA0,0xE1,0x20,0xF3,0xFF,0xEB,0x34,0x00,0x8D,0xE5, + 0x2C,0x00,0x8D,0xE5,0x60,0x00,0x9D,0xE5,0x8C,0x10,0x9D,0xE5,0x1B,0xF3,0xFF,0xEB, + 0x30,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x0C,0x04,0xD5,0xE5,0x01,0x00,0x50,0xE3, + 0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0x90,0x00,0x9D,0xE5,0x5C,0x20,0x9D,0xE5,0x58,0x30,0x9D,0xE5,0x09,0x10,0xA0,0xE3, + 0x7D,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0xD4,0x02,0xD5,0xE5,0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5,0x07,0x10,0xA0,0xE3, + 0x75,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1, + 0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x88,0x20,0x9D,0xE5,0x84,0x30,0x9D,0xE5, + 0x63,0x0F,0x88,0xE2,0x60,0x00,0x00,0xEA,0x02,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A, + 0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5, + 0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5,0x07,0x10,0xA0,0xE3,0x62,0x11,0x00,0xEB, + 0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xD4,0x02,0xD5,0xE5, + 0x4C,0x20,0x9D,0xE5,0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3,0x5A,0x11,0x00,0xEB, + 0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1, + 0x0F,0x00,0x8D,0xE8,0x80,0x20,0x9D,0xE5,0x7C,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2, + 0x45,0x00,0x00,0xEA,0x03,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2, + 0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x4C,0x20,0x9D,0xE5, + 0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3,0x47,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2, + 0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xD4,0x02,0xD5,0xE5,0x44,0x20,0x9D,0xE5, + 0x40,0x30,0x9D,0xE5,0x03,0x10,0xA0,0xE3,0x3F,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1, + 0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8, + 0x78,0x20,0x9D,0xE5,0x74,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2,0x2A,0x00,0x00,0xEA, + 0x04,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x44,0x20,0x9D,0xE5,0x40,0x30,0x9D,0xE5, + 0x03,0x10,0xA0,0xE3,0x2C,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0xD4,0x02,0xD5,0xE5,0x3C,0x20,0x9D,0xE5,0x38,0x30,0x9D,0xE5, + 0x02,0x10,0xA0,0xE3,0x24,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1, + 0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x70,0x20,0x9D,0xE5, + 0x6C,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2,0x0F,0x00,0x00,0xEA,0x30,0x30,0x8D,0xE2, + 0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x3C,0x20,0x9D,0xE5, + 0x38,0x30,0x9D,0xE5,0x02,0x10,0xA0,0xE3,0x13,0x11,0x00,0xEB,0xFC,0x0D,0xD9,0xE1, + 0xFC,0x16,0xD4,0xE1,0xF0,0x33,0xDD,0xE1,0xF4,0x23,0xDD,0xE1,0x0F,0x00,0x8D,0xE8, + 0x68,0x20,0x9D,0xE5,0x64,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2,0x0A,0x10,0xA0,0xE1, + 0x1B,0x11,0x00,0xEB,0xD4,0x02,0xD5,0xE5,0x50,0x11,0x9F,0xE5,0x09,0x00,0x50,0xE3, + 0x01,0x00,0x80,0x32,0xD4,0x02,0xC5,0x35,0x14,0x04,0xD5,0xE5,0x02,0x00,0x50,0xE3, + 0x01,0x00,0x80,0x32,0x14,0x04,0xC5,0x35,0x8C,0x01,0xD8,0xE5,0x01,0x00,0x40,0xE2, + 0x00,0x01,0x81,0xE0,0x01,0x4B,0x80,0xE2,0xFC,0x04,0xD4,0xE1,0x01,0x00,0x70,0xE3, + 0xFE,0x14,0xD4,0xC1,0x01,0x00,0x71,0xC3,0x18,0x00,0x00,0xDA,0x14,0x10,0x9D,0xE5, + 0x64,0x50,0x61,0xE2,0x95,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x83,0xF2,0xFF,0xEB, + 0x00,0x80,0xA0,0xE1,0xBE,0x08,0xD7,0xE1,0x14,0x10,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x64,0x10,0xA0,0xE3,0x15,0xF3,0xFF,0xEB,0x08,0x00,0x80,0xE0,0xBE,0x08,0xC7,0xE1, + 0xFE,0x04,0xD4,0xE1,0x64,0x10,0xA0,0xE3,0x95,0x00,0x00,0xE0,0x77,0xF2,0xFF,0xEB, + 0x00,0x50,0xA0,0xE1,0xB0,0x09,0xD7,0xE1,0x14,0x10,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x64,0x10,0xA0,0xE3,0x09,0xF3,0xFF,0xEB,0x05,0x00,0x80,0xE0,0xB0,0x09,0xC7,0xE1, + 0xBE,0x08,0xD7,0xE1,0xBC,0x04,0xC4,0xE1,0xB0,0x09,0xD7,0xE1,0xBE,0x04,0xC4,0xE1, + 0x01,0x60,0x86,0xE2,0x08,0x00,0x56,0xE3,0x48,0xFE,0xFF,0xBA,0x8C,0x30,0x9F,0xE5, + 0x88,0x21,0xD3,0xE5,0x00,0x00,0x83,0xE2,0x01,0x1C,0x80,0xE2,0x01,0x00,0x52,0xE3, + 0x02,0x0C,0x80,0xE2,0x10,0x00,0x00,0x1A,0x96,0x21,0xD3,0xE5,0x82,0x30,0x83,0xE0, + 0x02,0x2C,0x83,0xE2,0xBA,0xCD,0xD2,0xE1,0x03,0x3C,0x83,0xE2,0xB4,0xCC,0xC0,0xE1, + 0xBA,0xC6,0xD3,0xE1,0xB6,0xCC,0xC0,0xE1,0xBA,0x2E,0xD2,0xE1,0xB8,0x2C,0xC0,0xE1, + 0xBA,0x27,0xD3,0xE1,0xBA,0x2C,0xC0,0xE1,0xB8,0x29,0xD1,0xE1,0xBC,0x2B,0xC0,0xE1, + 0xBA,0x19,0xD1,0xE1,0xBE,0x1B,0xC0,0xE1,0x2D,0xFE,0xFF,0xEA,0x02,0x00,0x52,0xE3, + 0x2B,0xFE,0xFF,0x1A,0xB8,0x29,0xD1,0xE1,0xBC,0x2B,0xC0,0xE1,0xBA,0x29,0xD1,0xE1, + 0xBE,0x2B,0xC0,0xE1,0xB2,0x2A,0xD1,0xE1,0xB0,0x2C,0xC0,0xE1,0xB4,0x1A,0xD1,0xE1, + 0xB2,0x1C,0xC0,0xE1,0x22,0xFE,0xFF,0xEA,0x00,0x93,0x00,0x00,0x78,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0, + 0x1C,0x8F,0x1A,0x4B,0x1B,0x7B,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D, + 0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E, + 0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0, + 0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0, + 0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42, + 0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0x00,0x93,0x00,0x00,0xE0,0x04,0x00,0x20, + 0x6D,0x05,0x00,0x20,0x0E,0x23,0x58,0x43,0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x31,0x49,0x10,0xB5,0x4A,0x7E,0x31,0x49, + 0x00,0x20,0x00,0x2A,0x15,0xD1,0x0A,0x89,0x00,0x2A,0x0F,0xD0,0x2E,0x49,0x8A,0x42, + 0x0C,0xD0,0x10,0x00,0x1E,0x21,0x48,0x43,0x64,0x21,0xFC,0xF7,0x57,0xFD,0xFF,0x30, + 0x4B,0x21,0x91,0x30,0xC9,0x00,0x88,0x42,0x00,0xD9,0x08,0x00,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x88,0x89,0x01,0x21,0x49,0x07,0x89,0x68,0x22,0x4B,0x89,0x00,0x9B,0x89, + 0x0A,0x0F,0x22,0x49,0x59,0x18,0x01,0x2A,0x1A,0xD1,0x21,0x4A,0x21,0x4C,0x91,0x42, + 0x07,0xD8,0x21,0x1A,0x08,0x00,0x48,0x43,0x51,0x1C,0xFC,0xF7,0x37,0xFD,0x20,0x1A, + 0x08,0xE0,0xA0,0x42,0x06,0xD9,0x1B,0x4A,0x03,0x21,0x52,0x42,0x80,0x18,0xFC,0xF7, + 0x2D,0xFD,0x00,0x19,0x7D,0x24,0x24,0x01,0xA0,0x42,0xD7,0xD9,0x0D,0x21,0x1B,0xE0, + 0x02,0x2A,0xD3,0xD1,0x13,0x4A,0x14,0x4C,0x15,0x3A,0x91,0x42,0x07,0xD8,0x21,0x1A, + 0x08,0x00,0x48,0x43,0x51,0x1C,0xFC,0xF7,0x19,0xFD,0x20,0x1A,0x08,0xE0,0xA0,0x42, + 0x06,0xD9,0x0D,0x4A,0x03,0x21,0x52,0x42,0x80,0x18,0xFC,0xF7,0x0F,0xFD,0x00,0x19, + 0x0A,0x4C,0xA0,0x42,0xBA,0xD9,0x11,0x21,0xFC,0xF7,0x08,0xFD,0x60,0x1A,0xB5,0xE7, + 0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00,0x2F,0xFD,0xFF,0xFF, + 0x0B,0x03,0x00,0x00,0xDC,0x05,0x00,0x00,0x98,0x08,0x00,0x00,0xB8,0x0B,0x00,0x00, + 0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06, + 0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D,0x00,0x24,0x01,0x21, + 0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68,0x6A,0x60,0x05,0xE0, + 0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18,0x02,0x00,0x40,0x1E, + 0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0, + 0xA1,0xFB,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06,0xFC,0xD4,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0xA1,0x0D,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x98,0x0D,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4, + 0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0, + 0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25, + 0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C, + 0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1, + 0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0,0x03,0xFB,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E, + 0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0,0xF2,0xFA, + 0xC3,0xE7,0x00,0x00,0x66,0x05,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x01,0x49,0x20,0x20, + 0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68, + 0x3D,0x48,0x01,0x29,0x80,0x7B,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29, + 0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x13,0x27,0xBF,0x01,0x3B,0xE0, + 0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x00,0x1F,0xFC,0xF7,0x12,0xFC, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E, + 0x36,0x18,0xF6,0x19,0x36,0x7F,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43, + 0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7F, + 0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x77,0xED,0xE7,0x40,0x1C,0x08,0x28, + 0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46, + 0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18, + 0xDB,0x19,0x1B,0x7F,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x77, + 0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68, + 0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0x20,0x05,0x00,0x20,0x40,0x00,0x00,0x20, + 0x03,0x22,0x12,0x07,0xD3,0x68,0x01,0x21,0x81,0x40,0x0B,0x43,0xD3,0x60,0x50,0x68, + 0x08,0x42,0x01,0xD0,0x01,0x48,0x01,0x63,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47, + 0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61, + 0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47, + 0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF, + 0x08,0xBC,0x18,0x47,0xF8,0x05,0x00,0x20,0xF0,0xB5,0x87,0xB0,0xFE,0xF7,0xBA,0xFA, + 0xFE,0xF7,0x98,0xFA,0x01,0xF0,0xF0,0xFF,0x03,0xF0,0xA8,0xF8,0x00,0xF0,0x6A,0xFE, + 0x00,0xF0,0xC0,0xFB,0xFD,0xF7,0x08,0xFF,0xFD,0xF7,0x42,0xF8,0x39,0x48,0x00,0x68, + 0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x4C,0xF9,0xFF,0xF7,0xFE,0xF8, + 0x03,0xE0,0xFF,0xF7,0xFB,0xF8,0xFF,0xF7,0x45,0xF9,0x01,0x27,0x7F,0x07,0x78,0x68, + 0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x78,0x60,0x03,0xF0,0x04,0xFC, + 0x03,0xF0,0x50,0xFA,0x38,0x68,0x00,0x28,0x07,0xD0,0x78,0x68,0x80,0x0F,0x80,0x07, + 0x03,0xD5,0x3E,0x68,0x02,0x24,0x76,0x1C,0x37,0xE0,0x01,0x24,0x26,0x00,0xA0,0x00, + 0xC0,0x19,0x06,0x90,0x05,0x68,0xA8,0x01,0x80,0x0D,0x05,0x90,0xA8,0x05,0x80,0x0D, + 0x04,0x90,0x21,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9,0x05,0xA8,0x03,0xF0, + 0x77,0xFA,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46, + 0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04,0x1B,0x0C,0x05,0xA8, + 0x04,0xF0,0xE7,0xFA,0x04,0xA9,0x05,0xA8,0x04,0xF0,0xFC,0xF8,0x14,0x48,0x04,0x99, + 0x05,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x05,0x43,0xA8,0x0A,0x80,0x02, + 0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42,0xC7,0xD9,0xFD,0xF7, + 0x51,0xFD,0x03,0xF0,0xD7,0xF9,0x38,0x68,0xFC,0xF7,0x2C,0xFC,0xFF,0xF7,0xCC,0xFE, + 0xFC,0xF7,0x60,0xFB,0x04,0xF0,0x88,0xF9,0x06,0x48,0x40,0x79,0x07,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x06,0x00,0x20,0x74,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xF8,0xB5,0x03,0xF0,0x03,0xF8,0x29,0x48, + 0x29,0x4D,0x00,0x7C,0x41,0x1E,0xFF,0x29,0x00,0xD3,0x00,0x20,0xFE,0xF7,0xC8,0xF8, + 0x28,0x72,0x26,0x48,0x01,0x69,0xFF,0x22,0x12,0x02,0x91,0x43,0x01,0x61,0x01,0x69, + 0x2A,0x7A,0x12,0x02,0x11,0x43,0x01,0x61,0xFE,0xF7,0xC4,0xFC,0xFE,0xF7,0x40,0xFD, + 0xFE,0xF7,0x88,0xFD,0x1B,0x48,0x00,0x21,0x60,0x38,0xC0,0x7F,0x04,0xF0,0x2C,0xF8, + 0x1B,0x4F,0xFC,0x03,0x00,0x20,0x28,0x70,0x68,0x62,0x28,0x7B,0x00,0x28,0x1D,0xD0, + 0x01,0x26,0x18,0xE0,0x78,0x68,0x00,0x07,0x15,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28, + 0x09,0xD1,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0,0x5C,0xF9,0xFF,0xF7,0x1A,0xF8, + 0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0x03,0xF0,0x4F,0xF9,0xE0,0x6B,0x0B,0x28,0xE3,0xD1,0xFE,0xF7,0xBE,0xF8, + 0x28,0x78,0x00,0x28,0xD6,0xD0,0x02,0xF0,0x05,0xFD,0xD3,0xE7,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0xEE,0xE7,0x60,0x93,0x00,0x00,0x64,0x05,0x00,0x20,0x00,0x90,0x00,0x40, + 0x00,0x40,0x00,0x30,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x70,0xB5,0x05,0x00, + 0x1A,0x48,0x1B,0x4A,0x00,0x68,0x12,0x8B,0x60,0x30,0x01,0x7E,0xC0,0x7D,0x2C,0x78, + 0x89,0x18,0x0E,0x06,0x17,0x49,0x36,0x0E,0x8A,0x7E,0x00,0x2A,0x0D,0xD1,0xC9,0x7E, + 0x01,0x29,0x01,0xD1,0x40,0x1D,0x06,0xE0,0x02,0x29,0x01,0xD1,0x0A,0x30,0x02,0xE0, + 0x03,0x29,0x02,0xD1,0x0F,0x30,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42, + 0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7,0x39,0xFA,0x76,0x1C,0xB0,0x42,0x05,0xD2, + 0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3, + 0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70,0x01,0x20,0xF4,0xE7,0x78,0x06,0x00,0x20, + 0x40,0x05,0x00,0x20,0xE0,0x02,0x00,0x20,0x78,0x47,0xC0,0x46,0xF0,0x03,0x2D,0xE9, + 0x8C,0x50,0x9F,0xE5,0x08,0x10,0xA0,0xE3,0x24,0x60,0x85,0xE2,0x40,0x70,0x46,0xE2, + 0x12,0x80,0x87,0xE2,0x00,0x40,0xE0,0xE3,0x00,0x30,0xA0,0xE3,0x52,0x90,0x88,0xE2, + 0x01,0x01,0x85,0xE0,0xB0,0x40,0xC0,0xE1,0xB2,0x40,0xC0,0xE1,0x01,0x01,0x86,0xE0, + 0xB0,0x40,0xC0,0xE1,0xB2,0x40,0xC0,0xE1,0x81,0x00,0x87,0xE0,0xB0,0x30,0xC0,0xE1, + 0x00,0x00,0xA0,0xE3,0x01,0xC1,0x89,0xE0,0x01,0x30,0xC8,0xE7,0x00,0x21,0x8C,0xE0, + 0xB0,0x30,0xC2,0xE1,0x01,0x00,0x50,0xE2,0xB2,0x30,0xC2,0xE1,0xFA,0xFF,0xFF,0x5A, + 0x01,0x10,0x51,0xE2,0xED,0xFF,0xFF,0x5A,0x28,0x20,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0xB1,0x00,0xD2,0xE5,0x01,0x00,0x50,0xE3,0x02,0x00,0x00,0x8A,0x00,0x00,0x50,0xE3, + 0xF0,0x03,0xBD,0x18,0x1E,0xFF,0x2F,0x11,0xB1,0x10,0xC2,0xE5,0xF0,0x03,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x6C,0x09,0x00,0x20,0x00,0x93,0x00,0x00,0x10,0xB5,0x07,0x4C, + 0x07,0x48,0x22,0x00,0x00,0x21,0xFC,0xF7,0xED,0xF9,0x06,0x48,0x22,0x00,0x00,0x21, + 0xFC,0xF7,0xE8,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x00,0x00,0x00,0x10,0x7E,0x06,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21, + 0x20,0x00,0xFC,0xF7,0xD7,0xF9,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0xFC,0xF7,0xF4,0xF9, + 0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19, + 0x0E,0x48,0x00,0x19,0xFC,0xF7,0xEE,0xF9,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48, + 0xA2,0x00,0xFC,0xF7,0xD5,0xF9,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21, + 0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0xFC,0xF7,0xAC,0xF9,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x8A,0x00,0x00,0x40,0x00,0x00,0x20, + 0x98,0x09,0x00,0x00,0x40,0x00,0x00,0x20,0x05,0x49,0xC8,0x05,0x41,0x62,0x05,0x49, + 0x81,0x62,0x05,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00, + 0x80,0x88,0x3C,0x03,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE3,0x04,0x00,0xA0,0xE1, + 0x78,0xF8,0xFF,0xEB,0x01,0x40,0x84,0xE2,0x08,0x00,0x54,0xE3,0xFA,0xFF,0xFF,0xBA, + 0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00, + 0xFC,0xF7,0xFC,0xFD,0xFE,0xF7,0xA8,0xFB,0xFE,0xF7,0x82,0xFB,0xFE,0xF7,0xAC,0xFB, + 0xFE,0xF7,0xA2,0xFB,0xFE,0xF7,0x74,0xFB,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43, + 0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFC,0xF7, + 0xDD,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x93,0x00,0x00, + 0x10,0xB5,0x02,0xF0,0x51,0xFE,0x02,0xF0,0x43,0xFE,0x02,0xF0,0x39,0xFE,0xFF,0x20, + 0xFC,0xF7,0x0C,0xFE,0xFF,0xF7,0xA0,0xFF,0x13,0x48,0x80,0x22,0x00,0x21,0xFC,0xF7, + 0x57,0xF9,0x08,0x20,0xFC,0xF7,0xCA,0xFD,0x00,0x22,0x10,0x49,0xD2,0x43,0x00,0x20, + 0xFF,0xF7,0x9E,0xFD,0x00,0xF0,0x20,0xF8,0x0D,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0, + 0x40,0x20,0xFC,0xF7,0xBB,0xFD,0x00,0xF0,0x53,0xF8,0x00,0xF0,0x3D,0xF8,0x10,0x20, + 0x02,0xF0,0x23,0xFE,0x07,0x49,0xC8,0x69,0xCA,0x13,0x90,0x43,0xC8,0x61,0xFE,0xF7, + 0x03,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x05,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x93,0x00,0x00,0x00,0x70,0x00,0x40,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25, + 0x30,0x00,0xFC,0xF7,0x9B,0xFD,0x20,0x02,0xFC,0xF7,0xC2,0xFD,0x0C,0x48,0x0A,0x21, + 0x00,0x6B,0xFC,0xF7,0xDB,0xF8,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23, + 0x00,0x95,0x03,0xF0,0x0B,0xFF,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94, + 0x03,0xF0,0x04,0xFF,0x30,0x00,0xFC,0xF7,0x79,0xFD,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x07,0x49,0x00,0x20,0xFF,0xF7, + 0x61,0xFD,0x04,0xF0,0xA7,0xF8,0x05,0x48,0x04,0xF0,0x9E,0xF8,0x00,0x20,0xFF,0xF7, + 0x3F,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x7D,0x88,0x00,0x00,0xFC,0x3A,0x00,0x00, + 0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21, + 0xC9,0x00,0xFC,0xF7,0xA3,0xF8,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0xA0,0x65, + 0x04,0xF0,0x58,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x07,0xA5,0x07,0x00,0x64,0x05,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xBF,0xFE,0x12,0x48, + 0x00,0x7A,0x03,0xF0,0xFD,0xFD,0xFF,0xF7,0x2B,0xFF,0x0F,0x48,0x0F,0x4A,0xA0,0x30, + 0x41,0x89,0xD1,0x83,0x0E,0x49,0x0F,0x4A,0x09,0x68,0x40,0x31,0x49,0x7D,0x51,0x74, + 0x01,0x00,0x20,0x39,0x0A,0x8B,0x0B,0x49,0xA0,0x31,0x0A,0x61,0x00,0x88,0x48,0x61, + 0xFF,0xF7,0x52,0xFE,0x08,0x48,0x00,0x24,0xC4,0x80,0xFE,0xF7,0xD5,0xF9,0x07,0x48, + 0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20, + 0x78,0x06,0x00,0x20,0xA0,0x04,0x00,0x20,0xC0,0x01,0x00,0x20,0x65,0x05,0x00,0x20, + 0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90,0x00,0x20,0x2B,0x4E,0x07,0x00,0x02,0x90, + 0x03,0x90,0x05,0x90,0xFE,0xF7,0x86,0xFA,0xFE,0xF7,0x34,0xFB,0x27,0x48,0x40,0x7F, + 0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F,0x00,0x25,0x00,0x90,0x00,0x24,0x21,0x00, + 0x28,0x00,0xFF,0xF7,0x8F,0xFA,0x00,0x28,0x1B,0xD0,0x0E,0x21,0x69,0x43,0x04,0x9A, + 0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC, + 0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD, + 0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x2F,0x00,0x02,0x94, + 0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3,0x6D,0x1C,0x15,0x2D,0xD6,0xD3,0x03,0x99, + 0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0,0x07,0x99,0x02,0x98, + 0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0,0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98, + 0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF,0x20,0x93,0x00,0x00, + 0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x98,0xC0,0x9F,0xE5,0x00,0x00,0x9C,0xE5, + 0x94,0x30,0x9F,0xE5,0x7E,0x04,0xD3,0xE5,0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3, + 0x7F,0x14,0xD3,0x15,0x00,0x00,0xA0,0x13,0x00,0x00,0x51,0x13,0x1E,0xFF,0x2F,0x91, + 0x30,0x00,0x2D,0xE9,0x74,0x50,0x9F,0xE5,0x74,0x40,0x9F,0xE5,0x7E,0x24,0xD3,0xE5, + 0x00,0x10,0x83,0xE0,0xAD,0x14,0xD1,0xE5,0x02,0x00,0x12,0xE3,0xAC,0x24,0xD3,0xE5, + 0x82,0x21,0x62,0x00,0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10,0x81,0x10,0x82,0x10, + 0x00,0x20,0xD5,0xE5,0x00,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A,0x01,0x11,0x9C,0xE7, + 0x80,0x20,0x83,0xE0,0x02,0x19,0xC1,0xE3,0xB0,0x11,0xC2,0xE1,0x03,0x00,0x00,0xEA, + 0x81,0x10,0x84,0xE0,0xB0,0x10,0xD1,0xE1,0x80,0x20,0x83,0xE0,0xB0,0x11,0xC2,0xE1, + 0x7F,0x14,0xD3,0xE5,0x01,0x00,0x80,0xE2,0x00,0x00,0x51,0xE1,0xE6,0xFF,0xFF,0x8A, + 0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20, + 0x64,0x05,0x00,0x20,0x7E,0x06,0x00,0x20,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42, + 0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00, + 0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x85,0xDF,0x4D,0xE2, + 0x00,0x00,0xA0,0xE3,0xF8,0x01,0x8D,0xE5,0x14,0x05,0x9F,0xE5,0x6C,0x60,0x8D,0xE2, + 0xBE,0x03,0x90,0xE8,0xBE,0x03,0x86,0xE8,0x08,0x05,0x9F,0xE5,0x69,0x20,0xA0,0xE3, + 0x00,0x00,0x90,0xE5,0x01,0x2C,0x82,0xE2,0xBC,0x45,0xD0,0xE1,0x62,0x50,0xD0,0xE5, + 0x00,0x10,0xA0,0xE3,0x8C,0x00,0x8D,0xE2,0xCC,0xEF,0xFF,0xEB,0xE8,0x04,0x9F,0xE5, + 0x08,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xC8,0xEF,0xFF,0xEB,0xDC,0x04,0x9F,0xE5, + 0x10,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xC4,0xEF,0xFF,0xEB,0x24,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x48,0x00,0x8D,0xE2,0xC0,0xEF,0xFF,0xEB,0x24,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x24,0x00,0x8D,0xE2,0xBC,0xEF,0xFF,0xEB,0x24,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x0D,0x00,0xA0,0xE1,0xB8,0xEF,0xFF,0xEB,0xA0,0x14,0x9F,0xE5, + 0x04,0x00,0xD1,0xE5,0x00,0x00,0x50,0xE3,0x85,0xDF,0x8D,0x02,0xF0,0x4F,0xBD,0x08, + 0x1E,0xFF,0x2F,0x01,0xB6,0x00,0xD1,0xE1,0x20,0x00,0x10,0xE3,0x05,0x00,0x44,0x10, + 0x00,0x48,0xA0,0x11,0xB8,0x00,0xD1,0xE1,0x24,0x48,0xA0,0x11,0x74,0x24,0x9F,0xE5, + 0x94,0x00,0x00,0xE0,0x92,0x30,0xC0,0xE0,0xC0,0x22,0xA0,0xE1,0xC0,0x0F,0x42,0xE0, + 0x64,0x24,0x9F,0xE5,0x00,0x40,0xA0,0xE3,0x10,0x22,0x8D,0xE5,0xBE,0x20,0xD1,0xE1, + 0x02,0x00,0x80,0xE0,0x10,0x22,0x9D,0xE5,0xBE,0x07,0xC2,0xE1,0x04,0x00,0xA0,0xE1, + 0x04,0x42,0x8D,0xE5,0x80,0x01,0x60,0xE0,0x00,0x70,0xA0,0xE3,0x0C,0x02,0x8D,0xE5, + 0x0C,0x12,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x81,0x20,0x87,0xE0,0x2C,0x14,0x9F,0xE5, + 0x82,0xC0,0x81,0xE0,0x10,0x12,0x9D,0xE5,0xF0,0x30,0xDC,0xE1,0xFE,0x17,0xD1,0xE1, + 0x01,0x00,0x53,0xE1,0x01,0x00,0x43,0xC0,0x00,0x08,0xA0,0xC1,0x40,0x08,0xA0,0xC1, + 0x00,0x00,0x57,0xE3,0x06,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0x83,0x00,0x00,0x0A, + 0x8C,0x00,0x8D,0xE2,0x02,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3,0x7F,0x00,0x00,0x1A, + 0x0C,0x00,0x00,0xEA,0xF2,0x30,0x5C,0xE1,0x01,0x00,0x53,0xE1,0x03,0x00,0x00,0xDA, + 0x01,0x10,0x43,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xB0,0xE1,0x77,0x00,0x00,0x1A, + 0x00,0x00,0x50,0xE3,0x75,0x00,0x00,0x0A,0x8C,0x00,0x8D,0xE2,0x02,0x00,0xD0,0xE7, + 0x00,0x00,0x50,0xE3,0x71,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5,0x07,0x38,0xA0,0xE1, + 0x00,0xC8,0xA0,0xE1,0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1, + 0x08,0x00,0x54,0xE3,0x43,0x38,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1,0x04,0x10,0xA0,0xE3, + 0x00,0x60,0xA0,0xD3,0x00,0x32,0x8D,0xE5,0xFC,0xC1,0x8D,0xE5,0x03,0x00,0x00,0xDA, + 0x01,0x00,0x44,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1,0x6A,0x00,0x00,0xEA, + 0x04,0x0C,0xA0,0xE1,0x40,0x0C,0xA0,0xE1,0x08,0x02,0x8D,0xE5,0x50,0x03,0x9F,0xE5, + 0x84,0x00,0x80,0xE0,0x01,0xAC,0x80,0xE2,0x01,0x00,0x86,0xE2,0x00,0x68,0xA0,0xE1, + 0x46,0x68,0xA0,0xE1,0x09,0x0D,0x56,0xE3,0x00,0x80,0xA0,0xE3,0x53,0x00,0x00,0xCA, + 0x10,0x02,0x9D,0xE5,0x00,0x90,0xA0,0xE3,0xFE,0x57,0xD0,0xE1,0x6C,0x00,0x8D,0xE2, + 0x01,0x01,0x80,0xE0,0xB2,0x20,0xD0,0xE1,0xB0,0x00,0xD0,0xE1,0x0C,0x20,0x82,0xE0, + 0x02,0x28,0xA0,0xE1,0x03,0x00,0x80,0xE0,0x42,0x28,0xA0,0xE1,0x00,0x08,0xA0,0xE1, + 0x15,0x00,0x52,0xE3,0x40,0x08,0xA0,0xE1,0x15,0x00,0x00,0x2A,0x00,0x00,0x50,0xE3, + 0x13,0x00,0x00,0xBA,0x0E,0x00,0x50,0xE3,0x11,0x00,0x00,0xAA,0xEC,0xE2,0x9F,0xE5, + 0x82,0xB1,0x62,0xE0,0x8B,0xB0,0x80,0xE0,0x8B,0xE0,0x8E,0xE0,0xF0,0xE0,0xDE,0xE1, + 0x05,0x00,0x5E,0xE1,0x0A,0x00,0x00,0xDA,0x8C,0xE0,0x8D,0xE2,0xDB,0xB0,0x9E,0xE1, + 0x04,0x00,0x5B,0xE1,0x00,0x00,0x5B,0x13,0x05,0x00,0x00,0x1A,0xFC,0x91,0x9D,0xE5, + 0x09,0x00,0x52,0xE1,0x00,0x92,0x9D,0x05,0x09,0x00,0x50,0x01,0x01,0x80,0xA0,0x13, + 0x04,0x00,0x00,0xEA,0x01,0x90,0x89,0xE2,0x01,0x10,0x81,0xE2,0x08,0x00,0x59,0xE3, + 0x07,0x10,0x01,0xE2,0xD8,0xFF,0xFF,0xBA,0x8C,0x91,0x6C,0xE0,0x89,0x90,0x83,0xE0, + 0x8C,0xE0,0x8D,0xE2,0x09,0xB0,0xDE,0xE7,0x00,0x00,0x5B,0xE3,0x1C,0x00,0x00,0x1A, + 0x08,0xB2,0x9D,0xE5,0x09,0xB0,0xCE,0xE7,0x70,0xB2,0x9F,0xE5,0x48,0xE0,0x8D,0xE2, + 0x89,0x90,0x8B,0xE0,0xF0,0x90,0xD9,0xE1,0x04,0xB1,0x9E,0xE7,0x05,0x00,0x59,0xE1, + 0x05,0x50,0x49,0xC0,0x48,0x92,0x9F,0xE5,0x05,0x58,0xA0,0xC1,0x83,0x30,0x89,0xE0, + 0xB0,0x32,0xD3,0xE1,0x00,0x50,0xA0,0xD3,0x25,0x58,0xA0,0xC1,0x95,0xB3,0x23,0xE0, + 0x04,0x31,0x8E,0xE7,0x8C,0xC0,0x89,0xE0,0xB4,0xC5,0xDC,0xE1,0x24,0x30,0x8D,0xE2, + 0x04,0xB1,0x93,0xE7,0x95,0xBC,0x2C,0xE0,0x04,0xC1,0x83,0xE7,0x04,0xC1,0x9D,0xE7, + 0x05,0xC0,0x8C,0xE0,0x04,0xC1,0x8D,0xE7,0xBE,0x36,0xDA,0xE1,0x01,0x30,0x83,0xE2, + 0xBE,0x36,0xCA,0xE1,0x00,0x00,0x58,0xE3,0x04,0x00,0x00,0x0A,0xFF,0x30,0x00,0xE2, + 0x05,0x00,0x81,0xE2,0xFF,0xC0,0x02,0xE2,0x07,0x10,0x00,0xE2,0xA5,0xFF,0xFF,0xEA, + 0x01,0x70,0x87,0xE2,0x0E,0x00,0x57,0xE3,0x68,0xFF,0xFF,0xBA,0xF8,0x01,0x9D,0xE5, + 0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5,0x01,0x00,0x80,0xE2, + 0x15,0x00,0x50,0xE3,0x04,0x02,0x8D,0xE5,0x5D,0xFF,0xFF,0xBA,0x00,0x00,0x54,0xE3, + 0x49,0x00,0x00,0xDA,0xA8,0x51,0x9F,0xE5,0x00,0x30,0xA0,0xE3,0x48,0x60,0x8D,0xE2, + 0x24,0xE0,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x83,0xA0,0x85,0xE0,0x83,0xB1,0x63,0xE0, + 0x98,0x01,0x9F,0xE5,0x8B,0xC0,0x82,0xE0,0x8C,0x70,0x80,0xE0,0x10,0x02,0x9D,0xE5, + 0xF2,0x70,0xD7,0xE1,0xFE,0x07,0xD0,0xE1,0x00,0x10,0xA0,0xE3,0x00,0x00,0x57,0xE1, + 0x00,0x00,0x47,0xC0,0x00,0x18,0xA0,0xC1,0x8C,0x70,0x8D,0xE2,0xDC,0x00,0x97,0xE1, + 0x07,0xC0,0x8C,0xE0,0x01,0x70,0xDC,0xE5,0x41,0x18,0xA0,0xC1,0x00,0x00,0x57,0xE3, + 0x14,0x00,0x00,0x1A,0x00,0x00,0x51,0xE3,0x00,0x00,0x50,0x13,0x11,0x00,0x00,0x0A, + 0x82,0x80,0x85,0xE0,0xB2,0x82,0xD8,0xE1,0x00,0x71,0x96,0xE7,0x91,0x78,0x27,0xE0, + 0x00,0x71,0x86,0xE7,0xB4,0x85,0xDA,0xE1,0x00,0x71,0x9E,0xE7,0x91,0x78,0x27,0xE0, + 0x00,0x71,0x8E,0xE7,0x00,0x81,0x9D,0xE7,0x08,0x10,0x81,0xE0,0x00,0x11,0x8D,0xE7, + 0x80,0x10,0x85,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x76,0xD1,0xE1,0x01,0x70,0x87,0xE2, + 0xBE,0x76,0xC1,0xE1,0x01,0x00,0xCC,0xE5,0x01,0x20,0x82,0xE2,0x0E,0x00,0x52,0xE3, + 0xD6,0xFF,0xFF,0xBA,0x01,0x30,0x83,0xE2,0x15,0x00,0x53,0xE3,0xD0,0xFF,0xFF,0xBA, + 0x01,0x00,0x54,0xE3,0x01,0x70,0xA0,0xE3,0x13,0x00,0x00,0xBA,0x0D,0x90,0xA0,0xE1, + 0x0E,0xA0,0xA0,0xE1,0x07,0x81,0x99,0xE7,0x07,0x01,0x96,0xE7,0x00,0x00,0x58,0xE3, + 0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0xA0,0xEE,0xFF,0xEB,0x87,0x10,0x85,0xE0, + 0x01,0xBC,0x81,0xE2,0x00,0x00,0x58,0xE3,0xB6,0x04,0xCB,0xE1,0x07,0x01,0x9A,0xE7, + 0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0x98,0xEE,0xFF,0xEB,0x01,0x70,0x87,0xE2, + 0x04,0x00,0x57,0xE1,0xB6,0x05,0xCB,0xE1,0xED,0xFF,0xFF,0xDA,0x80,0x30,0x9F,0xE5, + 0x04,0x00,0xD3,0xE5,0x01,0x00,0x50,0xE3,0x85,0xDF,0x8D,0xB2,0xF0,0x4F,0xBD,0xB8, + 0x1E,0xFF,0x2F,0xB1,0x8C,0xC0,0x8D,0xE2,0x00,0x11,0x83,0xE0,0x01,0x2C,0x81,0xE2, + 0xF6,0x11,0xD2,0xE1,0xF4,0x21,0xD2,0xE1,0x81,0x11,0x61,0xE0,0x81,0x10,0x82,0xE0, + 0x01,0x10,0xDC,0xE7,0x00,0x20,0x83,0xE0,0x01,0x00,0x40,0xE2,0x65,0x11,0xC2,0xE5, + 0x81,0x10,0x83,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x16,0xD1,0xE1,0xFF,0x10,0x01,0xE2, + 0x38,0x11,0xC2,0xE5,0xBC,0x21,0xD3,0xE1,0x02,0x00,0x51,0xE1,0xBC,0x11,0xC3,0x81, + 0x01,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xAA,0x85,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x34,0x89,0x00,0x00,0x78,0x06,0x00,0x20,0xA6,0x01,0x00,0x20, + 0xAE,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x1F,0x85,0xEB,0x51,0x40,0x01,0x00,0x20, + 0x00,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x00,0x00,0xA0,0xE3, + 0x5B,0xDF,0x4D,0xE2,0x00,0x10,0xA0,0xE1,0x18,0x00,0x8D,0xE5,0x14,0x00,0x8D,0xE5, + 0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x2E,0x20,0xA0,0xE3,0x34,0x00,0x8D,0xE2, + 0x7E,0xEE,0xFF,0xEB,0x54,0x9F,0x9F,0xE5,0x0F,0x0A,0xE0,0xE3,0x00,0x80,0xA0,0xE3, + 0xB8,0x00,0xC9,0xE1,0xBC,0x80,0xC9,0xE1,0xBA,0x8E,0xC9,0xE1,0x89,0x11,0xD9,0xE5, + 0x3C,0x7F,0x9F,0xE5,0x05,0x0C,0x89,0xE2,0x02,0x00,0x51,0xE3,0x00,0x10,0x97,0x85, + 0xB2,0x12,0xD1,0x81,0x0B,0x00,0x00,0x8A,0x00,0x10,0x97,0x05,0xB0,0x22,0xD1,0x01, + 0xBE,0x11,0xD0,0x01,0x3B,0x00,0x00,0x0A,0x18,0x1F,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x00,0x00,0x51,0xE3,0x34,0x00,0x00,0x0A,0x0C,0x1F,0x9F,0xE5,0xBC,0x21,0xD0,0xE1, + 0xBC,0x1A,0xD1,0xE1,0x02,0x10,0x81,0xE0,0x10,0x10,0x8D,0xE5,0xFC,0x1E,0x9F,0xE5, + 0x68,0x11,0x8D,0xE5,0xB4,0x24,0xD1,0xE1,0x10,0x10,0x9D,0xE5,0xB0,0x02,0xD0,0xE1, + 0x02,0x10,0x81,0xE0,0x00,0x20,0x97,0xE5,0x7E,0xC4,0xD9,0xE5,0xBA,0x34,0xD2,0xE1, + 0xFE,0x60,0xD9,0xE1,0x03,0x00,0x80,0xE0,0x01,0x00,0x50,0xE1,0x01,0x30,0xA0,0xE1, + 0x01,0x00,0x1C,0xE3,0x00,0x10,0xA0,0x31,0x03,0x00,0x00,0x0A,0x02,0x00,0x1C,0xE3, + 0x02,0xC0,0xA0,0x03,0x01,0xC0,0xA0,0x13,0x08,0xC0,0x8D,0xE5,0xB0,0x4E,0x9F,0xE5, + 0xB0,0xAE,0x9F,0xE5,0x64,0x41,0x8D,0xE5,0xBC,0x86,0xC4,0xE1,0xBA,0x40,0xD9,0xE1, + 0x4E,0xC0,0xD2,0xE5,0x01,0x18,0xA0,0xE1,0x00,0x08,0xA0,0xE1,0x94,0x0C,0x0C,0xE0, + 0x9A,0x4C,0x8C,0xE0,0x64,0x41,0x9D,0xE5,0x8C,0xC5,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1, + 0xBE,0xC6,0xC4,0xE1,0xBC,0x44,0xD2,0xE1,0x41,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x04,0x00,0x5C,0xE1,0xBC,0x24,0xD2,0xB1,0x64,0xC1,0x9D,0xB5,0x00,0x50,0xA0,0xE3, + 0xBE,0x26,0xCC,0xB1,0x57,0x2F,0x8D,0xE2,0x03,0x00,0x82,0xE8,0x03,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x58,0x01,0x8D,0xE5,0x04,0x00,0x00,0xEA,0x00,0x10,0x97,0xE5, + 0xBE,0x21,0xD1,0xE1,0xBC,0x11,0xD0,0xE1,0x02,0x10,0x81,0xE0,0xC9,0xFF,0xFF,0xEA, + 0x85,0x01,0x65,0xE0,0x54,0x01,0x8D,0xE5,0x10,0x0E,0x9F,0xE5,0x00,0x40,0xA0,0xE3, + 0x85,0x00,0x80,0xE0,0x50,0x01,0x8D,0xE5,0x54,0x01,0x9D,0xE5,0x18,0x2E,0x9F,0xE5, + 0x80,0x00,0x84,0xE0,0x00,0x38,0xA0,0xE1,0x64,0x11,0x9D,0xE5,0x43,0x38,0xA0,0xE1, + 0x83,0x00,0x82,0xE0,0xF0,0x00,0xD0,0xE1,0xFE,0x16,0xD1,0xE1,0x01,0x00,0x50,0xE1, + 0x04,0x00,0x00,0xDA,0x64,0x11,0x9D,0xE5,0x64,0xC1,0x9D,0xE5,0xBC,0x16,0xD1,0xE1, + 0x01,0x10,0x81,0xE2,0xBC,0x16,0xCC,0xE1,0x7D,0x0E,0x50,0xE3,0x03,0x00,0x00,0xDA, + 0xD8,0x1D,0x9F,0xE5,0xB0,0x00,0xD1,0xE1,0x01,0x00,0x80,0xE2,0xB0,0x00,0xC1,0xE1, + 0xCC,0xBD,0x9F,0xE5,0x83,0x00,0x8B,0xE0,0xF0,0xA0,0xD0,0xE1,0x60,0x01,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x17,0x03,0x00,0xBA,0x00,0x00,0x55,0xE3,0x00,0x00,0xA0,0xE3, + 0x15,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x0E,0x00,0x43,0xE2,0xC0,0x11,0xD2,0xE7, + 0x07,0x00,0x00,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x00,0x01,0xE0,0x00,0x00,0x54,0xE3, + 0x05,0x00,0x00,0xDA,0x0F,0x10,0x43,0xE2,0xC1,0x71,0xD2,0xE7,0x07,0x10,0x01,0xE2, + 0x1C,0x11,0x07,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2,0x0D,0x00,0x54,0xE3, + 0x07,0x00,0x00,0xAA,0x0D,0x10,0x43,0xE2,0xC1,0x21,0xD2,0xE7,0x07,0x10,0x01,0xE2, + 0x1C,0x11,0x02,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2,0x00,0x00,0x54,0xE3, + 0x07,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x01,0x10,0x43,0xE2,0xC1,0x21,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x11,0x02,0xE0,0x01,0x00,0x80,0xE0, + 0xFF,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xF2,0x02,0x00,0x1A,0x00,0xC0,0xA0,0xE3, + 0x0C,0x70,0xA0,0xE1,0x0E,0x90,0xA0,0xE3,0x00,0x00,0xA0,0xE3,0x07,0x80,0x85,0xE0, + 0x00,0x10,0x84,0xE0,0x01,0x20,0x58,0xE2,0x01,0x10,0x41,0xE2,0x0B,0x00,0x00,0x4A, + 0x15,0x00,0x52,0xE3,0x09,0x00,0x00,0xCA,0x00,0x00,0x51,0xE3,0x07,0x00,0x00,0xBA, + 0x0E,0x00,0x51,0xE3,0x0E,0x90,0xA0,0xE3,0x04,0x00,0x00,0xCA,0x92,0x19,0x21,0xE0, + 0x81,0x10,0x8B,0xE0,0xF0,0x10,0xD1,0xE1,0x0C,0x00,0x51,0xE1,0x01,0xC0,0xA0,0xC1, + 0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x03,0x00,0x50,0xE3, + 0xEA,0xFF,0xFF,0xBA,0x01,0x00,0x87,0xE2,0x00,0x78,0xA0,0xE1,0x47,0x78,0xA0,0xE1, + 0x03,0x00,0x57,0xE3,0xE3,0xFF,0xFF,0xBA,0x0C,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x00,0x5A,0xE1,0xCF,0x02,0x00,0x1A,0x70,0x1C,0x9F,0xE5,0xBC,0x10,0xD1,0xE1, + 0x00,0x00,0x51,0xE1,0x05,0x00,0x00,0xCA,0x60,0x1C,0x9F,0xE5,0xBC,0x00,0xC1,0xE1, + 0x04,0x00,0xD1,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0x18,0x00,0x8D,0xE5, + 0x34,0x00,0x8D,0xE2,0xC3,0x11,0xD0,0xE7,0x07,0x20,0x03,0xE2,0x01,0xC0,0xA0,0xE3, + 0x1C,0x12,0x81,0xE1,0xC3,0x11,0xC0,0xE7,0x08,0x00,0x9D,0xE5,0x00,0x70,0xA0,0xE3, + 0x01,0x00,0x10,0xE3,0x05,0x00,0x00,0x0A,0x0D,0x00,0x54,0xE3,0x0D,0x70,0xA0,0x03, + 0x07,0x00,0x00,0x0A,0x0C,0x00,0x54,0xE3,0x03,0x77,0x87,0x03,0x04,0x00,0x00,0xEA, + 0x14,0x00,0x55,0xE3,0x14,0x70,0xA0,0x03,0x01,0x00,0x00,0x0A,0x13,0x00,0x55,0xE3, + 0x13,0x78,0x87,0x03,0x07,0x08,0xB0,0xE1,0x03,0x00,0x00,0x0A,0x5C,0x01,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0xAB,0x02,0x00,0xBA,0x02,0x00,0x00,0xEA,0x58,0x01,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0xA7,0x02,0x00,0xBA,0xD4,0x0B,0x9F,0xE5,0x00,0x30,0xA0,0xE3, + 0x00,0x90,0x90,0xE5,0x03,0x10,0x85,0xE0,0x02,0xB0,0x41,0xE2,0x03,0x11,0x83,0xE0, + 0x0B,0xCC,0xA0,0xE1,0xEC,0x20,0x8D,0xE2,0x4C,0xCC,0xA0,0xE1,0x88,0x80,0x8D,0xE2, + 0x00,0x00,0xA0,0xE3,0x01,0x21,0x82,0xE0,0x8C,0xC1,0x6C,0xE0,0x01,0x81,0x88,0xE0, + 0x00,0x10,0x84,0xE0,0x0B,0xAC,0xA0,0xE1,0x02,0x10,0x41,0xE2,0x4A,0xAC,0xA0,0xE1, + 0x01,0x1C,0xA0,0xE1,0x15,0x00,0x5A,0xE3,0x41,0x1C,0xA0,0xE1,0x03,0x00,0x00,0x2A, + 0x00,0x00,0x51,0xE3,0x01,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3,0x02,0x00,0x00,0xBA, + 0x00,0x10,0xA0,0xE3,0x00,0x11,0x82,0xE7,0x23,0x00,0x00,0xEA,0xB0,0xA0,0xD9,0xE1, + 0x01,0x09,0x1A,0xE3,0x8C,0xA0,0x81,0xE0,0x05,0x00,0x00,0x0A,0x70,0xEB,0x9F,0xE5, + 0x8A,0xA0,0x8E,0xE0,0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0,0x00,0xA1,0x82,0xE7, + 0x04,0x00,0x00,0xEA,0x50,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0,0xF0,0xA0,0xDA,0xE1, + 0x06,0xA0,0x4A,0xE0,0x00,0xA1,0x82,0xE7,0x00,0x00,0x5A,0xE3,0x00,0xA0,0xA0,0xB3, + 0x00,0xA1,0x82,0xB7,0xB0,0xA0,0xD9,0xE1,0x8C,0x10,0x81,0xE0,0x02,0x09,0x1A,0xE3, + 0x05,0x00,0x00,0x0A,0x28,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0,0xF0,0x10,0xD1,0xE1, + 0x06,0x10,0x41,0xE0,0x00,0x11,0x88,0xE7,0x04,0x00,0x00,0xEA,0x08,0xAB,0x9F,0xE5, + 0x81,0x10,0x8A,0xE0,0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0,0x00,0x11,0x88,0xE7, + 0x00,0x00,0x51,0xE3,0x00,0x10,0xA0,0xB3,0x00,0x11,0x88,0xB7,0x01,0x00,0x80,0xE2, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x05,0x00,0x50,0xE3,0xC7,0xFF,0xFF,0xBA, + 0x01,0x00,0x83,0xE2,0x00,0x38,0xA0,0xE1,0x43,0x38,0xA0,0xE1,0x05,0x00,0x53,0xE3, + 0xB7,0xFF,0xFF,0xBA,0xCC,0x0A,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x49,0x00,0x00,0x1A,0x13,0x00,0x55,0xE3,0x00,0x00,0x54,0x03,0x0F,0x00,0x00,0x1A, + 0xB4,0x0A,0x9F,0xE5,0x1C,0x11,0x9D,0xE5,0x00,0x00,0x90,0xE5,0xC0,0x2F,0xA0,0xE1, + 0x22,0x0F,0x80,0xE0,0x40,0x01,0x41,0xE0,0xC8,0x00,0x50,0xE3,0x07,0x00,0x00,0xAA, + 0x32,0x00,0x51,0xE3,0x01,0x00,0xA0,0xE1,0x04,0x00,0x00,0xDA,0x19,0x0E,0x50,0xE3, + 0x88,0x0A,0x9F,0xB5,0x01,0x10,0xA0,0xB3,0x00,0x10,0x80,0xB5,0x02,0x00,0x00,0xBA, + 0x78,0x1A,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00,0x81,0xE5,0x14,0x00,0x55,0xE3, + 0x0C,0x00,0x54,0x03,0x0F,0x00,0x00,0x1A,0x64,0x0A,0x9F,0xE5,0x1C,0x11,0x9D,0xE5, + 0x00,0x00,0x90,0xE5,0xC0,0x2F,0xA0,0xE1,0x22,0x0F,0x80,0xE0,0x40,0x01,0x41,0xE0, + 0xC8,0x00,0x50,0xE3,0x07,0x00,0x00,0xAA,0x32,0x00,0x51,0xE3,0x01,0x00,0xA0,0xE1, + 0x04,0x00,0x00,0xDA,0x19,0x0E,0x50,0xE3,0x38,0x1A,0x9F,0xB5,0x01,0x00,0xA0,0xB3, + 0x00,0x00,0x81,0xB5,0x07,0x00,0x00,0xBA,0x28,0x1A,0x9F,0xE5,0x00,0x00,0xA0,0xE3, + 0x11,0x00,0x55,0xE3,0x00,0x00,0x81,0xE5,0x1B,0x00,0x00,0xBA,0x00,0x00,0x54,0xE3, + 0x0C,0x00,0x54,0x13,0x06,0x00,0x00,0x1A,0x0C,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0x4B,0x0F,0x50,0xE3,0x02,0x00,0x00,0x3A,0x1C,0x01,0x9D,0xE5,0x7D,0x0F,0x50,0xE3, + 0x20,0x02,0x00,0xBA,0x13,0x00,0x55,0xE3,0x07,0x00,0x00,0x1A,0x0D,0x00,0x54,0xE3, + 0x0D,0x00,0x00,0x1A,0x1C,0x01,0x9D,0xE5,0x7D,0x0F,0x50,0xE3,0x30,0x01,0x9D,0xC5, + 0x4B,0x0F,0x50,0xC3,0x17,0x02,0x00,0xCA,0x07,0x00,0x00,0xEA,0x14,0x00,0x55,0xE3, + 0x0D,0x00,0x54,0x03,0x04,0x00,0x00,0x1A,0x1C,0x01,0x9D,0xE5,0x7D,0x0F,0x50,0xE3, + 0x08,0x01,0x9D,0xC5,0x4B,0x0F,0x50,0xC3,0x0E,0x02,0x00,0xCA,0x12,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x64,0x00,0x8D,0xE2,0x00,0xED,0xFF,0xEB,0xA0,0x00,0x9D,0xE5, + 0x5C,0x19,0x9F,0xE5,0x64,0x00,0x8D,0xE5,0xA4,0x00,0x9D,0xE5,0x64,0x39,0x9F,0xE5, + 0x68,0x00,0x8D,0xE5,0xA8,0x00,0x9D,0xE5,0x00,0x00,0x54,0xE3,0x6C,0x00,0x8D,0xE5, + 0xB4,0x00,0x9D,0xE5,0x70,0x00,0x8D,0xE5,0xBC,0x00,0x9D,0xE5,0x78,0x00,0x8D,0xE5, + 0xC8,0x00,0x9D,0xE5,0x7C,0x00,0x8D,0xE5,0xCC,0x00,0x9D,0xE5,0x80,0x00,0x8D,0xE5, + 0xD0,0x00,0x9D,0xE5,0x84,0x00,0x8D,0xE5,0x00,0x10,0x91,0xE5,0xB8,0x00,0x9D,0xE5, + 0xBC,0x11,0xD1,0xE1,0x91,0x00,0x00,0xE0,0x93,0x10,0xC0,0xE0,0xC0,0x12,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x74,0x00,0x8D,0xE5,0x0F,0x00,0x00,0x1A,0x42,0x1F,0x8D,0xE2, + 0x03,0x00,0x91,0xE8,0x1C,0x21,0x9D,0xE5,0x02,0x10,0x81,0xE0,0x80,0x00,0x81,0xE0, + 0x20,0x11,0x9D,0xE5,0x02,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x00,0x08,0xA0,0xE1,0x20,0x08,0xA0,0xE1,0x22,0x00,0x00,0xEA,0x41,0x1F,0x8D,0xE2, + 0x03,0x00,0x91,0xE8,0x0C,0x00,0x54,0xE3,0x01,0x00,0x80,0xE0,0x0D,0x00,0x00,0x1A, + 0x18,0x21,0x9D,0xE5,0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0,0x1C,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x00,0x08,0xA0,0xE1, + 0x20,0x08,0xA0,0xE1,0x0F,0x00,0x00,0xEA,0x0C,0x11,0x9D,0xE5,0x18,0x21,0x9D,0xE5, + 0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0,0x1C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x20,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x00,0x08,0xA0,0xE1,0x20,0x08,0xA0,0xE1,0x8F,0x10,0xA0,0xE3,0xE3,0x1C,0x81,0xE2, + 0x91,0x00,0x00,0xE0,0x14,0xA8,0x9F,0xE5,0xA0,0x09,0xA0,0xE1,0xB6,0x10,0xDA,0xE1, + 0x40,0x00,0x11,0xE3,0x45,0x00,0x00,0x0A,0xEE,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0x34,0x28,0x9F,0x25,0x06,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25, + 0x20,0x00,0x00,0x2A,0x71,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0x18,0x18,0x9F,0x25,0x05,0x20,0xA0,0x23,0x00,0x20,0xC1,0x25,0x1E,0x00,0x00,0x2A, + 0x7D,0x0E,0x50,0xE3,0x04,0x08,0x9F,0x25,0x04,0x10,0xA0,0x23,0x00,0x10,0xC0,0x25, + 0x75,0x00,0x00,0x2A,0x77,0x1F,0xA0,0xE3,0x01,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0xE8,0x27,0x9F,0x25,0x03,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A, + 0xFA,0x0F,0x50,0xE3,0xD4,0x27,0x9F,0x25,0x02,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25, + 0x1E,0x00,0x00,0x2A,0x7D,0x0F,0x50,0xE3,0xC0,0x27,0x9F,0x25,0x01,0x10,0xA0,0x23, + 0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A,0xB0,0x17,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x0F,0x50,0xE3,0x89,0x01,0x00,0x3A, + 0x5D,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3,0x04,0x00,0x00,0x1A,0xEE,0x10,0xA0,0xE3, + 0x02,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0x82,0x01,0x00,0x3A,0x56,0x00,0x00,0xEA, + 0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x7D,0x0F,0x50,0xE3,0x7D,0x01,0x00,0x3A, + 0x51,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3, + 0x78,0x01,0x00,0x3A,0x4C,0x00,0x00,0xEA,0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x96,0x00,0x50,0xE3,0x73,0x01,0x00,0x3A,0x47,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3, + 0x45,0x00,0x00,0x1A,0x4B,0x00,0x50,0xE3,0x6E,0x01,0x00,0x3A,0x42,0x00,0x00,0xEA, + 0x71,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0x1C,0x27,0x9F,0x25, + 0x06,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x20,0x00,0x00,0x2A,0xD6,0x10,0xA0,0xE3, + 0x06,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0x00,0x27,0x9F,0x25,0x05,0x10,0xA0,0x23, + 0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A,0x6B,0x10,0xA0,0xE3,0x03,0x1C,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0xE4,0x26,0x9F,0x25,0x04,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25, + 0x1C,0x00,0x00,0x2A,0x7D,0x0F,0x50,0xE3,0xD0,0x26,0x9F,0x25,0x03,0x10,0xA0,0x23, + 0x00,0x10,0xC2,0x25,0x1C,0x00,0x00,0x2A,0x4B,0x0F,0x50,0xE3,0xBC,0x26,0x9F,0x25, + 0x02,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1C,0x00,0x00,0x2A,0x96,0x00,0x50,0xE3, + 0xA8,0x26,0x9F,0x25,0x01,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1C,0x00,0x00,0x2A, + 0x98,0x16,0x9F,0xE5,0x00,0x10,0xD1,0xE5,0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x7D,0x0F,0x50,0xE3,0x43,0x01,0x00,0x3A,0x17,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3,0x3E,0x01,0x00,0x3A,0x12,0x00,0x00,0xEA, + 0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xAF,0x00,0x50,0xE3,0x39,0x01,0x00,0x3A, + 0x0D,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x55,0x00,0x50,0xE3, + 0x34,0x01,0x00,0x3A,0x08,0x00,0x00,0xEA,0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x32,0x00,0x50,0xE3,0x2F,0x01,0x00,0x3A,0x03,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3, + 0x01,0x00,0x00,0x1A,0x14,0x00,0x50,0xE3,0x2A,0x01,0x00,0x3A,0x14,0x00,0x55,0xE3, + 0x10,0x00,0x00,0x1A,0x01,0xCA,0xA0,0xE3,0x04,0x00,0xA0,0xE3,0x01,0xC0,0x4C,0xE2, + 0xEC,0x80,0x8D,0xE2,0x00,0x11,0x88,0xE0,0x28,0x20,0x91,0xE5,0x01,0x00,0x40,0xE2, + 0x02,0x24,0x62,0xE0,0x93,0x92,0xC2,0xE0,0xC2,0x92,0xA0,0xE1,0xC2,0x2F,0x49,0xE0, + 0x0C,0x00,0x52,0xE1,0x28,0x20,0x81,0xE5,0x00,0x08,0xA0,0xE1,0x28,0xC0,0x81,0xA5, + 0x40,0x08,0xB0,0xE1,0xF2,0xFF,0xFF,0x5A,0x00,0x00,0x57,0xE3,0x1F,0x00,0x00,0x0A, + 0x08,0x00,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x04,0x00,0xA0,0xE3,0x0D,0x00,0x00,0x0A, + 0xEC,0x20,0x8D,0xE2,0x00,0x30,0xA0,0xE3,0x07,0x18,0xB0,0xE1,0x00,0x11,0x80,0xE0, + 0x01,0x31,0x82,0x17,0x01,0x11,0x82,0xE0,0x0C,0x30,0x81,0x05,0x01,0x00,0x40,0xE2, + 0x10,0x30,0x81,0x05,0x00,0x08,0xA0,0xE1,0x04,0x30,0x81,0x15,0x40,0x08,0xB0,0xE1, + 0xF4,0xFF,0xFF,0x5A,0x0D,0x00,0x00,0xEA,0xEC,0x30,0x8D,0xE2,0x00,0x20,0xA0,0xE3, + 0x07,0x18,0xB0,0xE1,0x00,0x11,0x83,0x10,0x00,0x21,0x83,0x17,0x14,0x20,0x81,0x15, + 0x02,0x00,0x00,0x1A,0x00,0x11,0x83,0xE0,0x3C,0x20,0x81,0xE5,0x50,0x20,0x81,0xE5, + 0x01,0x00,0x40,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xF3,0xFF,0xFF,0x5A, + 0x24,0x95,0x9F,0xE5,0x00,0x30,0xA0,0xE3,0x03,0xC0,0xA0,0xE1,0x0E,0x80,0xA0,0xE3, + 0x00,0x00,0xA0,0xE3,0x0C,0x70,0x85,0xE0,0x00,0x10,0x84,0xE0,0x01,0x20,0x57,0xE2, + 0x01,0x10,0x41,0xE2,0x0A,0x00,0x00,0x4A,0x15,0x00,0x52,0xE3,0x08,0x00,0x00,0xCA, + 0x00,0x00,0x51,0xE3,0x06,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3,0x04,0x00,0x00,0xCA, + 0x92,0x18,0x21,0xE0,0x81,0x10,0x89,0xE0,0xF0,0x10,0xD1,0xE1,0x03,0x00,0x51,0xE1, + 0x01,0x30,0xA0,0xC1,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x03,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xBA,0x01,0x00,0x8C,0xE2,0x00,0xC8,0xA0,0xE1, + 0x4C,0xC8,0xA0,0xE1,0x03,0x00,0x5C,0xE3,0xE4,0xFF,0xFF,0xBA,0xB8,0x10,0xDA,0xE1, + 0x03,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x00,0x51,0xE1,0xB8,0x00,0xCA,0xC1, + 0xBA,0x10,0xDA,0xE1,0x70,0x20,0x8D,0xE2,0x0A,0x70,0xA0,0xE1,0x00,0x00,0x51,0xE1, + 0xBA,0x00,0xCA,0xB1,0x04,0x00,0xDA,0xE5,0xEC,0x30,0x8D,0xE2,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0x04,0x00,0xCA,0xE5,0x00,0x01,0x8A,0xE0,0x01,0x0C,0x80,0xE2, + 0xB4,0x41,0xC0,0xE1,0x04,0x00,0xDA,0xE5,0x00,0x01,0x8A,0xE0,0x01,0x0C,0x80,0xE2, + 0xB6,0x51,0xC0,0xE1,0x06,0x00,0x92,0xE8,0x00,0x00,0xA0,0xE3,0x02,0x00,0x51,0xE1, + 0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x7C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x78,0x10,0x9D,0xE5,0xC0,0x00,0xA0,0xC3,0x02,0x00,0x51,0xE1,0x6C,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x68,0x10,0x9D,0xE5, + 0x30,0x00,0x80,0xC3,0x02,0x00,0x51,0xE1,0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x6C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x80,0x10,0x9D,0xE5,0x0C,0x00,0x80,0xC3, + 0x02,0x00,0x51,0xE1,0x7C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x03,0x00,0x80,0xC3,0x04,0x10,0xA0,0xE3,0x00,0x20,0xA0,0xE3, + 0xC0,0x00,0x10,0xE3,0x01,0xC1,0x81,0x00,0x0C,0x21,0x83,0x07,0x30,0x00,0x10,0xE3, + 0x01,0xC1,0x81,0x00,0x0C,0xC1,0x83,0x00,0x10,0x20,0x8C,0x05,0x0C,0x00,0x10,0xE3, + 0x01,0x21,0x83,0x07,0x03,0x00,0x10,0xE3,0x01,0xC1,0x83,0x00,0x01,0x10,0x41,0xE2, + 0x01,0x18,0xA0,0xE1,0x50,0x20,0x8C,0x05,0x41,0x18,0xB0,0xE1,0xEF,0xFF,0xFF,0x5A, + 0xFC,0x30,0x9D,0xE5,0x00,0x30,0x8D,0xE5,0xEC,0x30,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xDD,0x06,0x00,0xEB,0x10,0x31,0x9D,0xE5,0x00,0xA0,0xA0,0xE1,0x00,0x30,0x8D,0xE5, + 0x01,0x3C,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xD7,0x06,0x00,0xEB,0x24,0x31,0x9D,0xE5, + 0x00,0xB0,0xA0,0xE1,0x00,0x30,0x8D,0xE5,0x45,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xD1,0x06,0x00,0xEB,0x38,0x31,0x9D,0xE5,0x00,0x90,0xA0,0xE1,0x00,0x30,0x8D,0xE5, + 0x4A,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xCB,0x06,0x00,0xEB,0x4C,0x31,0x9D,0xE5, + 0x30,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0x4F,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xC5,0x06,0x00,0xEB,0x2C,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5,0x30,0x30,0x9D,0xE5, + 0x09,0x20,0xA0,0xE1,0x0B,0x10,0xA0,0xE1,0x0A,0x00,0xA0,0xE1,0xBE,0x06,0x00,0xEB, + 0x00,0x80,0xB0,0xE1,0x06,0x00,0x00,0x1A,0x64,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0xEC,0x00,0x8D,0xE2,0x5D,0xEB,0xFF,0xEB,0x0A,0x90,0xA0,0xE3,0x09,0x80,0xA0,0xE1, + 0x1C,0x91,0x8D,0xE5,0x3C,0x31,0x9D,0xE5,0xEC,0x00,0x9D,0xE5,0x00,0x30,0x8D,0xE5, + 0x00,0x11,0x9D,0xE5,0x14,0x21,0x9D,0xE5,0x28,0x31,0x9D,0xE5,0xAE,0x06,0x00,0xEB, + 0xA8,0x12,0x9F,0xE5,0x84,0x70,0x81,0xE0,0xBE,0x11,0xD7,0xE1,0x91,0x00,0x00,0xE0, + 0x28,0x00,0x8D,0xE5,0x40,0x31,0x9D,0xE5,0x00,0x30,0x8D,0xE5,0xF0,0x00,0x9D,0xE5, + 0x04,0x11,0x9D,0xE5,0x18,0x21,0x9D,0xE5,0x2C,0x31,0x9D,0xE5,0xA2,0x06,0x00,0xEB, + 0xB0,0x12,0xD7,0xE1,0x44,0x31,0x9D,0xE5,0x1C,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x24,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0xF4,0x00,0x9D,0xE5,0x08,0x11,0x9D,0xE5, + 0x30,0x31,0x9D,0xE5,0x98,0x06,0x00,0xEB,0xB2,0x12,0xD7,0xE1,0x48,0x31,0x9D,0xE5, + 0x20,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x20,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0xF8,0x00,0x9D,0xE5,0x0C,0x11,0x9D,0xE5,0x34,0x31,0x9D,0xE5,0x8E,0x06,0x00,0xEB, + 0xB4,0x12,0xD7,0xE1,0x4C,0x31,0x9D,0xE5,0x24,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x1C,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0xFC,0x00,0x9D,0xE5,0x10,0x11,0x9D,0xE5, + 0x38,0x31,0x9D,0xE5,0x84,0x06,0x00,0xEB,0xB6,0x12,0xD7,0xE1,0x20,0x20,0x9D,0xE5, + 0x90,0x01,0x03,0xE0,0x00,0x30,0x8D,0xE5,0x28,0x00,0x9D,0xE5,0x24,0x10,0x9D,0xE5, + 0x1C,0x30,0x9D,0xE5,0x7C,0x06,0x00,0xEB,0x08,0x10,0xA0,0xE1,0x6B,0xEA,0xFF,0xEB, + 0xD8,0x11,0x9F,0xE5,0xD4,0x71,0x9F,0xE5,0xB0,0x12,0xD1,0xE1,0x00,0x10,0x61,0xE2, + 0x81,0x00,0x90,0xE0,0x04,0x10,0xD7,0xE5,0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0, + 0xB4,0x0F,0xC1,0xE1,0x50,0x31,0x9D,0xE5,0x50,0x21,0x9D,0xE5,0xB8,0x35,0xD3,0xE1, + 0x30,0xC0,0x9D,0xE5,0xB6,0x25,0xD2,0xE1,0x93,0x0C,0x0C,0xE0,0x99,0x02,0x02,0xE0, + 0x50,0x01,0x9D,0xE5,0x50,0x11,0x9D,0xE5,0x50,0x31,0x9D,0xE5,0xB2,0x05,0xD0,0xE1, + 0xB4,0x15,0xD1,0xE1,0xBA,0x35,0xD3,0xE1,0x2C,0x90,0x9D,0xE5,0x9A,0x00,0x00,0xE0, + 0x99,0x03,0x03,0xE0,0x9B,0x01,0x01,0xE0,0x00,0x30,0x8D,0xE5,0x0C,0x30,0xA0,0xE1, + 0x5D,0x06,0x00,0xEB,0x08,0x10,0xA0,0xE1,0x4C,0xEA,0xFF,0xEB,0xB4,0x15,0xD7,0xE1, + 0x00,0x10,0x61,0xE2,0x81,0x00,0x90,0xE0,0x04,0x10,0xD7,0xE5,0x00,0x00,0xA0,0x43, + 0x81,0x10,0x87,0xE0,0x01,0x1C,0x81,0xE2,0xB6,0x00,0xC1,0xE1,0x04,0x00,0xD7,0xE5, + 0x08,0x00,0x50,0xE3,0x0C,0x00,0x00,0x2A,0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1, + 0x44,0x48,0xA0,0xE1,0x0E,0x00,0x54,0xE3,0xC6,0xFC,0xFF,0xBA,0x14,0x00,0x9D,0xE5, + 0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x01,0x00,0x85,0xE2,0x00,0x58,0xA0,0xE1, + 0x45,0x58,0xA0,0xE1,0x15,0x00,0x55,0xE3,0xB8,0xFC,0xFF,0xBA,0x00,0x01,0x9F,0xE5, + 0x00,0x40,0x90,0xE5,0xB0,0x00,0xD4,0xE1,0x80,0x00,0x10,0xE3,0x51,0x00,0x00,0x0A, + 0xE8,0x50,0x9F,0xE5,0x04,0x00,0xD5,0xE5,0x00,0x00,0x50,0xE3,0x08,0x00,0x00,0x1A, + 0x68,0x01,0x9D,0xE5,0xB4,0x04,0xD0,0xE1,0x00,0x00,0x50,0xE3,0x41,0x01,0xD5,0x15, + 0x3C,0x10,0xD4,0x15,0x01,0x00,0x50,0x11,0x41,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2, + 0x2C,0x00,0x00,0xEA,0x42,0x01,0xD5,0xE5,0x34,0x10,0xD4,0xE5,0x01,0x00,0x50,0xE1, + 0x27,0x00,0x00,0x8A,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0x42,0x01,0xC5,0xE5, + 0x35,0x10,0xD4,0xE5,0x05,0x20,0xA0,0xE1,0x00,0x00,0x51,0xE1,0x03,0x00,0x00,0x2A, + 0xBC,0x30,0xD2,0xE1,0x0C,0x20,0x9D,0xE5,0x03,0x20,0x82,0xE0,0x0C,0x20,0x8D,0xE5, + 0x34,0x20,0xD4,0xE5,0x02,0x00,0x50,0xE1,0x19,0x00,0x00,0x1A,0x01,0x00,0x50,0xE1, + 0x17,0x00,0x00,0x0A,0x01,0x10,0x40,0xE0,0x0C,0x00,0x9D,0xE5,0xA3,0xEA,0xFF,0xEB, + 0x68,0x21,0x9D,0xE5,0x00,0x10,0xA0,0xE3,0xB4,0x14,0xC2,0xE1,0xB8,0x13,0xD4,0xE1, + 0x00,0x00,0x51,0xE1,0x0E,0x00,0x00,0x2A,0x10,0x10,0x9D,0xE5,0x01,0x00,0x40,0xE0, + 0x36,0x10,0xD4,0xE5,0x90,0x01,0x01,0xE0,0x48,0x00,0x9F,0xE5,0x90,0x21,0x81,0xE0, + 0xA1,0x02,0xA0,0xE1,0x68,0x11,0x9D,0xE5,0xB4,0x04,0xC1,0xE1,0x68,0x01,0x9D,0xE5, + 0xB4,0x14,0xD0,0xE1,0xBA,0x03,0xD4,0xE1,0x00,0x00,0x51,0xE1,0x68,0x11,0x9D,0x85, + 0xB4,0x04,0xC1,0x81,0x00,0x00,0xA0,0xE3,0x41,0x01,0xC5,0xE5,0x15,0x00,0x00,0xEA, + 0x40,0x00,0x00,0x20,0x78,0x06,0x00,0x20,0x75,0x05,0x00,0x20,0x00,0x95,0x00,0x00, + 0x40,0x01,0x00,0x20,0x40,0x04,0x00,0x20,0x1F,0x85,0xEB,0x51,0x00,0x00,0x00,0x10, + 0xC0,0x05,0x00,0x20,0x7E,0x06,0x00,0x20,0x76,0x05,0x00,0x20,0xC4,0x05,0x00,0x20, + 0xAC,0x05,0x00,0x20,0xC8,0x05,0x00,0x20,0xB0,0x05,0x00,0x20,0xEC,0x05,0x00,0x20, + 0x68,0x05,0x00,0x20,0x00,0x00,0xA0,0xE3,0x42,0x01,0xC5,0xE5,0x41,0x01,0xC5,0xE5, + 0x68,0x11,0x9D,0xE5,0xB4,0x04,0xC1,0xE1,0x60,0x50,0x1F,0xE5,0x00,0xC0,0xA0,0xE3, + 0x04,0xA0,0xD5,0xE5,0x0C,0x80,0xA0,0xE1,0x01,0x20,0xA0,0xE3,0x01,0x00,0x5A,0xE3, + 0x32,0x00,0x00,0xBA,0x7F,0x94,0xD5,0xE5,0x64,0xB0,0x1F,0xE5,0x82,0x00,0x85,0xE0, + 0xB4,0x1F,0xD0,0xE1,0xCD,0x30,0xA0,0xE3,0x33,0x3B,0x83,0xE2,0x01,0x0C,0x80,0xE2, + 0xB6,0x00,0xD0,0xE1,0x93,0x01,0x01,0xE0,0x93,0x00,0x00,0xE0,0xA0,0x79,0xA0,0xE1, + 0x00,0x80,0xA0,0xE3,0x00,0x00,0x59,0xE3,0xA1,0x69,0xA0,0xE1,0x08,0x00,0xA0,0xE1, + 0x1D,0x00,0x00,0xDA,0x02,0x11,0x85,0xE0,0x01,0x4C,0x81,0xE2,0x80,0x11,0x85,0xE0, + 0x01,0x1B,0x81,0xE2,0xF0,0x38,0xD1,0xE1,0x06,0x00,0x53,0xE1,0x11,0x00,0x00,0xCA, + 0xF4,0x38,0xD1,0xE1,0x06,0x00,0x53,0xE1,0x0E,0x00,0x00,0xBA,0xF2,0x38,0xD1,0xE1, + 0x07,0x00,0x53,0xE1,0x0B,0x00,0x00,0xCA,0xF6,0x18,0xD1,0xE1,0x07,0x00,0x51,0xE1, + 0x08,0x00,0x00,0xBA,0xF6,0x11,0xD4,0xE1,0xF4,0x31,0xD4,0xE1,0x81,0x11,0x61,0xE0, + 0x81,0x10,0x83,0xE0,0x81,0x10,0x8B,0xE0,0xF0,0x30,0xD1,0xE1,0x0C,0x00,0x53,0xE1, + 0x03,0xC0,0xA0,0xC1,0xFF,0x80,0x02,0xC2,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x00,0x59,0xE1,0xE3,0xFF,0xFF,0xCA,0x01,0x00,0x82,0xE2, + 0x00,0x28,0xA0,0xE1,0x42,0x28,0xA0,0xE1,0x02,0x00,0x5A,0xE1,0xCE,0xFF,0xFF,0xAA, + 0x48,0x01,0x1F,0xE5,0xBA,0x10,0xD5,0xE1,0x01,0x6C,0x80,0xE2,0x01,0x4C,0x80,0xE2, + 0x0C,0x00,0x51,0xE1,0x06,0x60,0x86,0xE2,0x02,0x40,0x84,0xE2,0x12,0x00,0x00,0xCA, + 0x00,0x00,0x58,0xE3,0x10,0x00,0x00,0x0A,0x88,0x00,0x85,0xE0,0xB4,0x8F,0xD0,0xE1, + 0x01,0x0C,0x80,0xE2,0xB6,0x70,0xD0,0xE1,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0xF4,0x00,0x85,0xE2,0x45,0xEA,0xFF,0xEB,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x06,0x00,0xA0,0xE1,0x41,0xEA,0xFF,0xEB,0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5, + 0xA8,0x01,0x1F,0xE5,0xB6,0x8F,0xC0,0xE1,0x1B,0x00,0x00,0xEA,0x05,0x00,0xD5,0xE5, + 0x00,0x00,0x50,0xE3,0x19,0x00,0x00,0x1A,0x01,0x00,0x5A,0xE3,0x17,0x00,0x00,0x9A, + 0x8A,0x01,0xD5,0xE5,0x00,0x00,0x50,0xE3,0x14,0x00,0x00,0x1A,0x18,0x00,0x9D,0xE5, + 0x00,0x00,0x50,0xE3,0x11,0x00,0x00,0x0A,0x18,0x10,0x9D,0xE5,0x12,0x20,0xA0,0xE3, + 0x81,0x00,0x85,0xE0,0xB4,0x9F,0xD0,0xE1,0x01,0x0C,0x80,0xE2,0xB6,0x70,0xD0,0xE1, + 0x00,0x10,0xA0,0xE3,0xF4,0x00,0x85,0xE2,0x28,0xEA,0xFF,0xEB,0x12,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1,0x24,0xEA,0xFF,0xEB,0x01,0x00,0xA0,0xE3, + 0x04,0x00,0xC5,0xE5,0x1C,0x02,0x1F,0xE5,0xB6,0x9F,0xC0,0xE1,0xB6,0x70,0xC4,0xE1, + 0x7B,0x04,0xD5,0xE5,0x05,0x30,0xA0,0xE1,0x00,0x00,0x50,0xE3,0x09,0x00,0x00,0x0A, + 0x00,0x20,0xA0,0xE3,0x38,0xC0,0x9F,0xE5,0x04,0x20,0xC3,0xE5,0x7C,0x04,0xD3,0xE5, + 0x1E,0xC0,0xDC,0xE5,0x03,0x10,0xA0,0xE1,0x0C,0x00,0x50,0xE1,0x01,0x00,0x80,0xE2, + 0x7B,0x24,0xC1,0x25,0x7C,0x04,0xC1,0xE5,0x04,0x00,0xD3,0xE5,0x14,0x10,0x9F,0xE5, + 0x05,0x00,0xC3,0xE5,0x00,0x00,0xC1,0xE5,0x5B,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x93,0x00,0x00,0xF4,0x05,0x00,0x20,0x10,0xB5,0x0F,0x48, + 0x0F,0x49,0x80,0x88,0x49,0x8B,0x00,0x24,0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0x0D,0x49,0x49,0x89,0x02,0xE0,0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18, + 0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7, + 0xC1,0xFB,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x01,0x00,0x20, + 0x40,0x05,0x00,0x20,0x75,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0x78,0x06,0x00,0x20, + 0xC0,0x90,0x00,0x40,0xF7,0xB5,0x24,0x4E,0x82,0xB0,0xB0,0x7F,0xF1,0x7F,0x00,0x02, + 0x08,0x43,0x02,0xF0,0x79,0xF8,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0, + 0x1E,0x48,0x01,0x78,0x1E,0x48,0x00,0x7B,0x00,0x29,0x02,0xD0,0x02,0xF0,0x1C,0xF8, + 0x01,0xE0,0x02,0xF0,0x41,0xF8,0x18,0x49,0x01,0x25,0x20,0x39,0x08,0x00,0xC0,0x30, + 0x01,0x90,0x05,0x20,0xC0,0x01,0x17,0x4F,0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62, + 0x01,0x98,0x80,0x68,0x38,0x62,0x00,0x98,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07, + 0xC0,0x0F,0xFB,0xF7,0x75,0xFC,0x64,0x1E,0xF9,0xD5,0x02,0x20,0xF8,0x62,0x30,0x7F, + 0x01,0x00,0xFB,0xF7,0xE3,0xFC,0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7,0x10,0xFB, + 0x00,0x28,0x01,0xD1,0x00,0x24,0x25,0x00,0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00,0x6D,0x05,0x00,0x20, + 0xE0,0x04,0x00,0x20,0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x00,0x60,0xA0,0xE3,0x7D,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0x30,0x60,0x8D,0xE5, + 0xC8,0x61,0x8D,0xE5,0x2C,0x60,0x8D,0xE5,0x1C,0x60,0x8D,0xE5,0x00,0x50,0xA0,0xE1, + 0x00,0x10,0xA0,0xE1,0xC4,0x61,0x8D,0xE5,0x38,0x60,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x04,0x00,0x8D,0xE5,0x10,0x0B,0x9F,0xE5,0x34,0x60,0x8D,0xE5,0x24,0x60,0x8D,0xE5, + 0x28,0x60,0x8D,0xE5,0x20,0x60,0x8D,0xE5,0x10,0x60,0x8D,0xE5,0x14,0x60,0x8D,0xE5, + 0x0C,0x60,0x8D,0xE5,0xF0,0x01,0x8D,0xE5,0xB0,0x18,0xC0,0xE1,0xF0,0x01,0x9D,0xE5, + 0xE8,0x4A,0x9F,0xE5,0xB2,0x18,0xC0,0xE1,0xF0,0x01,0x9D,0xE5,0x06,0x70,0xA0,0xE1, + 0xB4,0x18,0xC0,0xE1,0x06,0x90,0xA0,0xE1,0x06,0xA0,0xA0,0xE1,0x30,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x88,0x00,0x84,0xE2,0xA4,0xE9,0xFF,0xEB,0x30,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0xB8,0x00,0x84,0xE2,0xA0,0xE9,0xFF,0xEB,0x00,0x80,0xA0,0xE3, + 0x60,0x10,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0xB8,0x8E,0xC4,0xE1,0xAB,0xE9,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0xFC,0x00,0x8D,0xE2,0xA8,0xE9,0xFF,0xEB,0x60,0x10,0xA0,0xE3, + 0x9C,0x00,0x8D,0xE2,0xA5,0xE9,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x3C,0x00,0x8D,0xE2, + 0xA2,0xE9,0xFF,0xEB,0x78,0x0A,0x9F,0xE5,0x00,0x10,0xD0,0xE5,0x74,0x0A,0x9F,0xE5, + 0x00,0x00,0x51,0xE3,0xEC,0x01,0x8D,0xE5,0x04,0x00,0x00,0x0A,0xF8,0x0A,0xD0,0xE1, + 0xC0,0x01,0x8D,0xE5,0xEC,0x01,0x9D,0xE5,0xB6,0x0A,0xD0,0xE1,0x04,0x00,0x00,0xEA, + 0x54,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xF6,0x12,0xD0,0xE1,0xC0,0x11,0x8D,0xE5, + 0xB4,0x02,0xD0,0xE1,0xEC,0x11,0x9D,0xE5,0x60,0x2A,0x9F,0xE5,0xBC,0x01,0x8D,0xE5, + 0x28,0x0A,0x9F,0xE5,0x58,0x3A,0x9F,0xE5,0xB6,0x00,0xD0,0xE1,0x58,0xCA,0x9F,0xE5, + 0x40,0x00,0x10,0xE3,0xB0,0xB8,0xD1,0x01,0xB0,0x18,0xD1,0x11,0x01,0x08,0xE0,0xE3, + 0x81,0xB0,0x00,0x10,0x8B,0x00,0x00,0xE0,0x10,0x1A,0x9F,0xE5,0x18,0x00,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0x00,0x00,0xC1,0xE5,0x04,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x00,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xFC,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xF8,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xF4,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xF0,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xEC,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xF0,0x19,0x9F,0xE5,0x00,0x00,0x82,0xE5,0x00,0x00,0x83,0xE5,0x00,0x00,0x81,0xE5, + 0x00,0x00,0x8C,0xE5,0xE4,0xC9,0x9F,0xE5,0x00,0x00,0x8C,0xE5,0xE0,0xC9,0x9F,0xE5, + 0x00,0x00,0x8C,0xE5,0x00,0xC0,0xA0,0xE3,0x0C,0x00,0xA0,0xE1,0x00,0x20,0xA0,0xE3, + 0xD0,0x19,0x9F,0xE5,0x8C,0x10,0x81,0xE0,0xE8,0x11,0x8D,0xE5,0xB0,0x10,0xD1,0xE1, + 0x01,0x3A,0xA0,0xE1,0xC0,0x19,0x9F,0xE5,0x23,0x3A,0xA0,0xE1,0x8C,0x10,0x81,0xE0, + 0xB0,0x10,0xD1,0xE1,0x0F,0x1A,0xC1,0xE3,0x01,0x40,0x43,0xE0,0x08,0x00,0x54,0xE1, + 0x03,0x10,0x41,0xE0,0x34,0x30,0x8D,0xC2,0x05,0x00,0x83,0xC8,0x04,0x80,0xA0,0xC1, + 0xFC,0x30,0x8D,0xE2,0x02,0xE1,0x93,0xE7,0x00,0x00,0x54,0xE3,0x00,0x40,0xA0,0xB3, + 0x04,0xE0,0x8E,0xE0,0x02,0xE1,0x83,0xE7,0x57,0xEF,0x8D,0xE2,0x00,0x31,0x9E,0xE7, + 0x00,0x00,0x51,0xE3,0x04,0x30,0x83,0xE0,0x00,0x31,0x8E,0xE7,0x3C,0x30,0x8D,0xE2, + 0x02,0xE1,0x93,0xE7,0x00,0x10,0xA0,0xB3,0x01,0xE0,0x8E,0xE0,0x02,0xE1,0x83,0xE7, + 0x9C,0xE0,0x8D,0xE2,0x00,0x31,0x9E,0xE7,0x01,0x30,0x83,0xE0,0x00,0x31,0x8E,0xE7, + 0xC8,0x31,0x9D,0xE5,0x04,0x00,0x53,0xE1,0xC8,0x41,0x8D,0x35,0x01,0x00,0x56,0xE1, + 0x01,0x60,0xA0,0x31,0x64,0x00,0x54,0xE3,0x04,0x30,0xA0,0xE1,0x64,0x30,0xA0,0xC3, + 0x11,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0xEC,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5, + 0x0E,0x30,0x83,0xE0,0xE0,0xE8,0x9F,0xE5,0x13,0x00,0x00,0xEA,0x12,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x1A,0xD4,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0, + 0xC8,0xE8,0x9F,0xE5,0x0C,0x00,0x00,0xEA,0x13,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0xBC,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0xB0,0xE8,0x9F,0xE5, + 0x05,0x00,0x00,0xEA,0x14,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0xA4,0xE8,0x9F,0xE5, + 0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0x98,0xE8,0x9F,0xE5,0x00,0x30,0x8E,0xE5, + 0x32,0x00,0x54,0xE3,0x04,0x30,0xA0,0xE1,0x32,0x30,0xA0,0xC3,0x11,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x1A,0x80,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0, + 0x74,0xE8,0x9F,0xE5,0x13,0x00,0x00,0xEA,0x12,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0x68,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0x5C,0xE8,0x9F,0xE5, + 0x0C,0x00,0x00,0xEA,0x13,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x50,0xE8,0x9F,0xE5, + 0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0x44,0xE8,0x9F,0xE5,0x05,0x00,0x00,0xEA, + 0x14,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x38,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5, + 0x0E,0x30,0x83,0xE0,0x2C,0xE8,0x9F,0xE5,0x00,0x30,0x8E,0xE5,0x01,0x00,0x56,0xE1, + 0x01,0x60,0xA0,0x31,0x11,0x00,0x50,0xE3,0x12,0x00,0x50,0x13,0x14,0x00,0x50,0x13, + 0x09,0x00,0x00,0x1A,0x00,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A,0xE0,0x37,0x9F,0xE5, + 0xDC,0xE7,0x9F,0xE5,0x00,0x30,0x93,0xE5,0x04,0x30,0x83,0xE0,0x00,0x30,0x8E,0xE5, + 0x11,0x00,0x50,0xE3,0x12,0x00,0x50,0x13,0x01,0x00,0x00,0x0A,0x13,0x00,0x50,0xE3, + 0x06,0x00,0x00,0x1A,0x0C,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A,0xB4,0x37,0x9F,0xE5, + 0xB0,0xE7,0x9F,0xE5,0x00,0x30,0x93,0xE5,0x04,0x30,0x83,0xE0,0x00,0x30,0x8E,0xE5, + 0x0B,0x00,0x51,0xE1,0x01,0x30,0x87,0xC2,0x01,0x78,0xC3,0xC3,0x0B,0x00,0x54,0xE1, + 0x01,0x30,0x89,0xC2,0x01,0x98,0xC3,0xC3,0x18,0x30,0x9D,0xE5,0x03,0x00,0x51,0xE1, + 0x03,0x00,0x00,0xDA,0x0C,0x30,0x9D,0xE5,0x01,0x30,0x83,0xE2,0x01,0x38,0xC3,0xE3, + 0x0C,0x30,0x8D,0xE5,0x18,0x30,0x9D,0xE5,0x03,0x00,0x54,0xE1,0x01,0x30,0x8A,0xC2, + 0x01,0xA8,0xC3,0xC3,0x14,0x30,0x9D,0xE5,0x96,0x00,0x51,0xE3,0x04,0x30,0x83,0xE0, + 0x14,0x30,0x8D,0xE5,0x10,0x30,0x9D,0xE5,0x01,0x30,0x83,0xE0,0x10,0x30,0x8D,0xE5, + 0x03,0x00,0x00,0xDA,0x74,0xE7,0x9F,0xE5,0xB0,0x30,0xDE,0xE1,0x01,0x30,0x83,0xE2, + 0xB0,0x30,0xCE,0xE1,0xE8,0x31,0x9D,0xE5,0x01,0x20,0x82,0xE2,0xB0,0x40,0xC3,0xE1, + 0xC0,0x31,0x9D,0xE5,0x0E,0x00,0x52,0xE3,0x04,0x30,0x83,0xE0,0xC4,0x41,0x9D,0xE5, + 0x01,0xC0,0x8C,0xE2,0x04,0x30,0x83,0xE0,0xC4,0x31,0x8D,0xE5,0x57,0xFF,0xFF,0x3A, + 0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0x53,0xFF,0xFF,0x3A,0x18,0x27,0x9F,0xE5, + 0x70,0x00,0x9D,0xE5,0x00,0x00,0x82,0xE5,0x10,0x07,0x9F,0xE5,0xC8,0x21,0x9D,0xE5, + 0x00,0x20,0x80,0xE5,0x08,0x07,0x9F,0xE5,0x00,0x60,0x80,0xE5,0xD8,0x06,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0x7D,0x0F,0x50,0xE3,0xD0,0x06,0x9F,0x25,0x00,0x00,0x90,0x25, + 0x7D,0x0F,0x50,0x23,0xC8,0x06,0x9F,0x25,0x00,0x00,0x90,0x25,0x7D,0x0F,0x50,0x23, + 0x08,0x00,0x00,0x3A,0xBC,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x7D,0x0F,0x50,0xE3, + 0x04,0x00,0x00,0x3A,0xD8,0x36,0x9F,0xE5,0x00,0x00,0x93,0xE5,0xC8,0x00,0x50,0xE3, + 0x01,0x00,0x80,0x32,0x00,0x00,0x83,0x35,0x9C,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xC8,0x00,0x50,0xE3,0x94,0x06,0x9F,0x25,0x00,0x00,0x90,0x25,0xC8,0x00,0x50,0x23, + 0x8C,0x06,0x9F,0x25,0x00,0x00,0x90,0x25,0xC8,0x00,0x50,0x23,0x08,0x00,0x00,0x3A, + 0x80,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xC8,0x00,0x50,0xE3,0x04,0x00,0x00,0x3A, + 0x90,0x36,0x9F,0xE5,0x00,0x00,0x93,0xE5,0xC8,0x00,0x50,0xE3,0x01,0x00,0x80,0x32, + 0x00,0x00,0x83,0x35,0x80,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x03,0x00,0x50,0xE3, + 0xE4,0x01,0x8D,0xE5,0x14,0x00,0x00,0x2A,0x70,0x36,0x9F,0xE5,0x64,0x00,0x56,0xE3, + 0x04,0x00,0x00,0x2A,0x00,0x00,0x93,0xE5,0x00,0x00,0x50,0xE3,0x0E,0x00,0x00,0x0A, + 0x01,0x00,0x40,0xE2,0x0B,0x00,0x00,0xEA,0xC8,0x00,0x56,0xE3,0x03,0x00,0x00,0x9A, + 0x00,0x00,0x93,0xE5,0x7D,0x0F,0x50,0xE3,0x07,0x00,0x00,0x2A,0x04,0x00,0x00,0xEA, + 0x96,0x00,0x56,0xE3,0x04,0x00,0x00,0x9A,0x00,0x00,0x93,0xE5,0x4B,0x0F,0x50,0xE3, + 0x01,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x00,0x00,0x83,0xE5,0x04,0x06,0x9F,0xE5, + 0x1C,0x46,0x9F,0xE5,0x8C,0x00,0x80,0xE0,0xB0,0x00,0xD0,0xE1,0x00,0xE0,0xA0,0xE3, + 0x00,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0xE0,0x01,0x8D,0xE5,0x02,0x02,0x62,0xE0, + 0x00,0x61,0xA0,0xE1,0x02,0x02,0x62,0xE0,0x80,0x00,0x80,0xE0,0xDC,0x01,0x8D,0xE5, + 0x02,0x02,0x62,0xE0,0x80,0x00,0xA0,0xE1,0xD8,0x01,0x8D,0xE5,0x02,0x01,0x82,0xE0, + 0x00,0x01,0xA0,0xE1,0xD4,0x01,0x8D,0xE5,0x02,0x02,0x62,0xE0,0xD0,0x01,0x8D,0xE5, + 0x00,0x30,0xA0,0xE3,0xE4,0xC1,0x9D,0xE5,0x00,0x00,0x51,0xE3,0xE0,0x01,0x9D,0xE5, + 0x00,0x10,0xA0,0xB3,0x03,0x00,0x5C,0xE3,0x36,0x00,0x00,0x2A,0xEE,0xCF,0xA0,0xE3, + 0x02,0xCB,0x8C,0xE2,0x0C,0x00,0x52,0xE1,0x07,0x00,0x00,0x9A,0x94,0xB6,0xCC,0xE0, + 0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1,0x2F,0x00,0x00,0xAA, + 0x4B,0x0F,0x50,0xE3,0x2D,0x00,0x00,0xDA,0x28,0x00,0x00,0xEA,0x7D,0x0E,0x52,0xE3, + 0x08,0x00,0x00,0x9A,0xDC,0xC1,0x9D,0xE5,0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1, + 0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1,0x24,0x00,0x00,0xAA,0xC8,0x00,0x50,0xE3, + 0x22,0x00,0x00,0xDA,0x1D,0x00,0x00,0xEA,0xFA,0x0F,0x52,0xE3,0x08,0x00,0x00,0x9A, + 0xD8,0xC1,0x9D,0xE5,0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0, + 0x00,0x00,0x5C,0xE1,0x19,0x00,0x00,0xAA,0x64,0x00,0x50,0xE3,0x17,0x00,0x00,0xDA, + 0x12,0x00,0x00,0xEA,0x7D,0x0F,0x52,0xE3,0x08,0x00,0x00,0x9A,0xD4,0xC1,0x9D,0xE5, + 0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1, + 0x0E,0x00,0x00,0xAA,0x64,0x00,0x50,0xE3,0x0C,0x00,0x00,0xDA,0x07,0x00,0x00,0xEA, + 0xD0,0xC1,0x9D,0xE5,0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0, + 0x00,0x00,0x5C,0xE1,0x05,0x00,0x00,0xAA,0x64,0x00,0x50,0xE3,0x03,0x00,0x00,0xDA, + 0x01,0x50,0x85,0xE2,0x01,0x00,0x00,0xEA,0x00,0x00,0x55,0xE3,0x01,0x50,0x45,0x12, + 0x01,0x30,0x83,0xE2,0x0E,0x00,0x53,0xE3,0xBD,0xFF,0xFF,0x3A,0x01,0xE0,0x8E,0xE2, + 0x15,0x00,0x5E,0xE3,0xB9,0xFF,0xFF,0x3A,0x08,0x00,0x9D,0xE5,0xF0,0x11,0x9D,0xE5, + 0xB0,0x08,0xC1,0xE1,0x04,0x00,0x9D,0xE5,0xF0,0x11,0x9D,0xE5,0xB2,0x08,0xC1,0xE1, + 0xF0,0x01,0x9D,0xE5,0xB4,0x58,0xC0,0xE1,0xE6,0xF7,0xFF,0xEB,0x38,0x04,0x9F,0xE5, + 0x28,0x64,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xC6,0xE1, + 0xB0,0x00,0xD4,0xE1,0x01,0x00,0x10,0xE3,0x08,0x00,0x00,0x0A,0xC4,0x01,0x9D,0xE5, + 0xBC,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x68,0x14,0x9F,0xE5,0x91,0x20,0x80,0xE0, + 0xB4,0x10,0xD4,0xE1,0x20,0x06,0xA0,0xE1,0x00,0x00,0x51,0xE1,0xBE,0x00,0xC6,0x81, + 0x54,0xC4,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x57,0xEF,0x8D,0xE2,0x9C,0x30,0x8D,0xE2, + 0x08,0x20,0xD4,0xE5,0x00,0x11,0x9E,0xE7,0x92,0x01,0x01,0xE0,0x9C,0x51,0x82,0xE0, + 0xA2,0x54,0xA0,0xE1,0xB0,0x21,0xD4,0xE1,0x02,0x00,0x55,0xE1,0x9C,0x21,0x81,0x90, + 0x09,0x50,0xD4,0xE5,0xA1,0x24,0xA0,0x91,0x00,0x11,0x93,0xE7,0x91,0x05,0x05,0xE0, + 0x9C,0xB5,0x81,0xE0,0xA1,0xB4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x5B,0xE1, + 0x9C,0x55,0x81,0x90,0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1, + 0x92,0x01,0x01,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0, + 0x02,0x21,0x82,0xE0,0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0, + 0x80,0x20,0x86,0xE0,0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0xB8,0x18,0xC2,0xE1, + 0xDE,0xFF,0xFF,0x3A,0xC4,0xC3,0x9F,0xE5,0x00,0x50,0xA0,0xE3,0xFC,0x30,0x8D,0xE2, + 0x0A,0x10,0xD4,0xE5,0x05,0x01,0x93,0xE7,0x91,0x00,0x00,0xE0,0x9C,0x20,0x81,0xE0, + 0xA1,0x25,0xA0,0xE1,0xB4,0x11,0xD4,0xE1,0x01,0x00,0x52,0xE1,0x9C,0x10,0x80,0x90, + 0xA0,0x15,0xA0,0x91,0x0B,0x20,0xD4,0xE5,0x3C,0x00,0x8D,0xE2,0x05,0x01,0x90,0xE7, + 0x90,0x02,0x02,0xE0,0x9C,0xB2,0x80,0xE0,0xA0,0xB5,0xA0,0xE1,0xB6,0x01,0xD4,0xE1, + 0x00,0x00,0x5B,0xE1,0x9C,0x22,0x80,0x90,0xA0,0x05,0xA0,0x91,0x00,0x00,0x41,0xE0, + 0xBE,0x10,0xD4,0xE1,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x85,0x10,0x86,0xE0,0x01,0x50,0x85,0xE2,0x0D,0x00,0x55,0xE3, + 0xB8,0x0B,0xC1,0xE1,0xDD,0xFF,0xFF,0x3A,0x0A,0x10,0xD4,0xE5,0x05,0x01,0x93,0xE7, + 0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x24,0x13,0x9F,0xE5,0x15,0x10,0xD1,0xE5, + 0x92,0x01,0x01,0xE0,0xCC,0x11,0x8D,0xE5,0x80,0xE7,0xFF,0xEB,0xB4,0x11,0xD4,0xE1, + 0x01,0x00,0x50,0xE1,0x00,0xB0,0xA0,0x91,0x01,0xB0,0xA0,0x81,0x0B,0x10,0xD4,0xE5, + 0x3C,0x00,0x8D,0xE2,0x05,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0,0xCC,0x11,0x9D,0xE5, + 0x76,0xE7,0xFF,0xEB,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0x81, + 0xBE,0x10,0xD4,0xE1,0x00,0x00,0x4B,0xE0,0x00,0x00,0x58,0xE3,0x91,0x00,0x00,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0, + 0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x85,0x10,0x86,0xE0, + 0xB8,0x0B,0xC1,0xE1,0x0C,0x00,0x00,0xDA,0x38,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0, + 0xB8,0x1B,0xD0,0xE1,0x34,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0,0xB8,0x08,0xD0,0xE1, + 0x01,0x00,0x80,0xE0,0x00,0x00,0x48,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1, + 0xB8,0x0E,0xC6,0xE1,0x00,0x00,0xA0,0x43,0xB8,0x0E,0xC6,0x41,0x11,0x50,0xA0,0xE3, + 0x01,0x5C,0x85,0xE2,0x10,0x00,0x9D,0xE5,0x05,0x10,0xA0,0xE1,0x53,0xE7,0xFF,0xEB, + 0x00,0x40,0xA0,0xE1,0x14,0x00,0x9D,0xE5,0x05,0x10,0xA0,0xE1,0x4F,0xE7,0xFF,0xEB, + 0xB6,0x10,0xD6,0xE1,0x40,0x00,0x11,0xE3,0x0F,0x00,0x00,0x0A,0x89,0x00,0x57,0xE1, + 0x01,0x20,0xA0,0x83,0x2C,0x20,0x8D,0x85,0x4B,0x0F,0x54,0xE3,0x01,0x20,0xA0,0x83, + 0x28,0x20,0x8D,0x85,0x0C,0x20,0x9D,0xE5,0x28,0x00,0x52,0xE3,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0x28,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x33,0x20,0x20,0x8D,0x35, + 0x14,0x00,0x57,0xE3,0x12,0x00,0x00,0x9A,0x0F,0x00,0x00,0xEA,0x09,0x00,0x57,0xE1, + 0x08,0x00,0x57,0x83,0x01,0x20,0xA0,0x83,0x2C,0x20,0x8D,0x85,0x96,0x00,0x54,0xE3, + 0x01,0x20,0xA0,0x83,0x28,0x20,0x8D,0x85,0x0C,0x20,0x9D,0xE5,0x14,0x00,0x52,0xE3, + 0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0x14,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x33, + 0x20,0x20,0x8D,0x35,0x0A,0x00,0x57,0xE3,0x01,0x00,0x00,0x9A,0x01,0x20,0xA0,0xE3, + 0x1C,0x20,0x8D,0xE5,0xF1,0x20,0xD6,0xE5,0x00,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A, + 0xB0,0x21,0x9F,0xE5,0x00,0x20,0xD2,0xE5,0x01,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A, + 0xF2,0x20,0xD6,0xE5,0xFA,0x00,0x52,0xE3,0x06,0x00,0x00,0x2A,0x01,0x20,0x82,0xE2, + 0x03,0x00,0x00,0xEA,0xF2,0x20,0xD6,0xE5,0x00,0x00,0x52,0xE3,0x01,0x00,0x00,0x0A, + 0x01,0x20,0x42,0xE2,0xF2,0x20,0xC6,0xE5,0x2C,0x20,0x9D,0xE5,0x28,0x30,0x9D,0xE5, + 0x10,0x00,0x11,0xE3,0x1C,0x10,0x9D,0x15,0x02,0x30,0x83,0xE1,0x24,0x20,0x9D,0xE5, + 0x20,0xC0,0x9D,0xE5,0x00,0x00,0x51,0x13,0x0C,0x20,0x02,0xE0,0x03,0x20,0x82,0xE1, + 0x00,0x10,0xA0,0x03,0x01,0x10,0xA0,0x13,0x02,0x10,0x81,0xE1,0x00,0x00,0x51,0xE3, + 0xF2,0x10,0xD6,0x15,0x05,0x00,0x51,0x13,0x08,0x00,0x00,0x9A,0x80,0x10,0x80,0xE0, + 0x34,0x01,0x9F,0xE5,0x90,0x21,0x81,0xE0,0xA1,0x01,0xA0,0xE1,0x04,0x00,0x50,0xE1, + 0x28,0x01,0x9F,0x35,0xB0,0x00,0xD0,0x31,0xAF,0x0F,0x50,0x33,0x02,0x00,0x00,0x3A, + 0x30,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xEC,0x00,0x96,0xE5, + 0x01,0x00,0x80,0xE2,0xEC,0x00,0x86,0xE5,0xF0,0x00,0xD6,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x40,0x12,0xF0,0x00,0xC6,0x15,0x0D,0x00,0x00,0xEA,0xF0,0x00,0xD6,0xE5, + 0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0xF0,0x00,0xC6,0xE5,0xEC,0x11,0x9D,0xE5, + 0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1,0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3, + 0xF0,0x00,0xC6,0xE5,0xEC,0x00,0x96,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2, + 0xEC,0x00,0x86,0xC5,0xF2,0x00,0xD6,0xE5,0x0A,0x00,0x50,0xE3,0x7D,0xDF,0x8D,0x22, + 0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21,0xEC,0x00,0x96,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0xC3,0xEC,0x00,0x86,0xC5,0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC6,0xE5, + 0x7D,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x75,0x05,0x00,0x20,0x00,0x95,0x00,0x00,0x78,0x06,0x00,0x20, + 0xF5,0x05,0x00,0x20,0xC4,0x05,0x00,0x20,0xC8,0x05,0x00,0x20,0xCC,0x05,0x00,0x20, + 0xD0,0x05,0x00,0x20,0xD4,0x05,0x00,0x20,0xD8,0x05,0x00,0x20,0xDC,0x05,0x00,0x20, + 0xE0,0x05,0x00,0x20,0xE4,0x05,0x00,0x20,0xE8,0x05,0x00,0x20,0xEC,0x05,0x00,0x20, + 0x98,0x05,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10, + 0x7C,0x05,0x00,0x20,0xA4,0x05,0x00,0x20,0xA8,0x05,0x00,0x20,0xA0,0x05,0x00,0x20, + 0x9C,0x05,0x00,0x20,0x1F,0x85,0xEB,0x51,0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D, + 0x2D,0x34,0xA9,0xF9,0x00,0x93,0x00,0x00,0x67,0x05,0x00,0x20,0xCD,0xCC,0xCC,0xCC, + 0x7A,0x05,0x00,0x20,0xF0,0xB5,0x00,0x27,0x3C,0x00,0x8B,0xB0,0xFF,0x48,0x04,0x97, + 0x00,0x68,0x80,0x79,0x02,0x90,0xFE,0x48,0x42,0x79,0x05,0x00,0xC0,0x35,0x00,0x92, + 0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xAB,0x7A,0x00,0x7A,0xFD,0xF7,0xC3,0xFD, + 0x00,0x06,0x69,0x7A,0x00,0x0E,0xFD,0xF7,0xB3,0xFD,0x29,0x00,0x20,0x39,0x0A,0x7A, + 0x00,0x06,0xC0,0x39,0x09,0x79,0x00,0x0E,0xFD,0xF7,0xAE,0xFD,0x29,0x00,0x80,0x39, + 0x8A,0x7D,0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E,0xFD,0xF7,0xA5,0xFD,0x00,0x06, + 0xEC,0x4E,0x00,0x0E,0x01,0x90,0x70,0x7C,0x00,0x28,0x03,0xD0,0x28,0x00,0x80,0x30, + 0x40,0x89,0x07,0xE0,0xE5,0x48,0xE8,0x49,0x00,0x68,0x49,0x8B,0x40,0x88,0x40,0x18, + 0x00,0x04,0x00,0x0C,0x03,0x90,0x00,0x20,0xF0,0x61,0x0F,0x20,0xB0,0x71,0x70,0x7B, + 0x00,0x28,0x06,0xD0,0xB0,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0xF7,0xFC,0x01,0xF0, + 0xE5,0xFC,0x01,0x25,0xB5,0x62,0xFB,0xF7,0x05,0xFD,0x00,0x20,0x30,0x71,0x30,0x64, + 0x70,0x64,0xC8,0x20,0xB0,0x63,0x00,0x20,0xF0,0x63,0xB0,0x82,0xB0,0x64,0xF0,0x64, + 0x30,0x65,0x68,0x03,0xFA,0xF7,0xC2,0xF9,0xF9,0xF7,0x80,0xFD,0xF9,0xF7,0x64,0xFD, + 0x00,0xF0,0xD0,0xFF,0x01,0xF0,0xE4,0xF9,0x00,0xF0,0x58,0xFF,0xCF,0x48,0x00,0x21, + 0x81,0x60,0xCF,0x48,0x05,0x21,0x0A,0x90,0xCE,0x48,0xC9,0x01,0x41,0x18,0x09,0x91, + 0xC9,0x49,0x80,0x30,0xA0,0x39,0x07,0xAA,0x03,0xC2,0x01,0x98,0xC0,0x1C,0x06,0x90, + 0xC9,0x48,0x05,0x90,0xDE,0xE1,0x70,0x7B,0x00,0x28,0x04,0xD0,0xB0,0x6D,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0xBB,0xFC,0x80,0x20,0xFA,0xF7,0x98,0xF9,0x03,0x20,0x01,0xF0, + 0x2D,0xFB,0x01,0x20,0x40,0x03,0xFA,0xF7,0x91,0xF9,0xF9,0xF7,0x3B,0xFD,0xBC,0x48, + 0xC0,0x38,0xC0,0x88,0x01,0x06,0x04,0xD4,0xB1,0x6B,0x64,0x29,0x03,0xD2,0x42,0x06, + 0x01,0xD4,0x01,0x20,0x25,0xE0,0xFF,0x22,0xC3,0x32,0x91,0x42,0x0D,0xD9,0x40,0x06, + 0x05,0xD5,0xB2,0x48,0xB5,0x49,0x80,0x30,0x01,0x62,0x27,0x21,0x10,0xE0,0xAF,0x48, + 0xB2,0x49,0x80,0x30,0x01,0x62,0x26,0x21,0x0A,0xE0,0xFF,0x22,0x5F,0x32,0x91,0x42, + 0x0A,0xD9,0x40,0x06,0xF3,0xD4,0xA9,0x48,0xAC,0x49,0x80,0x30,0x01,0x62,0x25,0x21, + 0x41,0x62,0x05,0x21,0xC1,0x62,0x06,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0, + 0x03,0x20,0x01,0xF0,0x97,0xF9,0xFB,0xF7,0xFF,0xFE,0xA1,0x48,0x03,0x99,0x80,0x30, + 0x80,0x88,0x40,0x18,0x9E,0x49,0xC0,0x39,0x89,0x89,0x88,0x42,0x14,0xD9,0x9C,0x48, + 0xC0,0x30,0x40,0x7A,0x00,0x28,0x0F,0xD1,0x99,0x48,0xFF,0x21,0xC0,0x38,0xC0,0x88, + 0x19,0x31,0x08,0x42,0x08,0xD1,0x02,0x98,0x64,0x1C,0x84,0x42,0x05,0xDD,0xFB,0xF7, + 0xEB,0xFE,0x01,0x20,0x04,0x90,0x00,0xE0,0x00,0x24,0x00,0xF0,0x35,0xFF,0x90,0x48, + 0x09,0x99,0xC0,0x38,0xC0,0x88,0x49,0x88,0x40,0x06,0x00,0x28,0x0A,0x98,0xC0,0x6A, + 0x01,0xDA,0x49,0x00,0xFF,0xE7,0x88,0x42,0x00,0xDB,0x75,0x70,0x04,0x98,0x00,0x28, + 0x03,0xD0,0xF9,0xF7,0xC9,0xFC,0x00,0x20,0x04,0x90,0xFB,0xF7,0x8B,0xFE,0xFB,0xF7, + 0x99,0xFE,0x00,0x20,0x30,0x83,0xFD,0xF7,0x0F,0xF9,0x00,0x28,0x09,0xD0,0x00,0x20, + 0xF0,0x61,0x05,0x98,0xC0,0x8A,0xC8,0x28,0x25,0xD2,0x05,0x99,0x40,0x1C,0xC8,0x82, + 0x21,0xE0,0xF0,0x69,0x40,0x1C,0xF0,0x61,0xF0,0x69,0x01,0x28,0x04,0xD1,0x7A,0x49, + 0x00,0x20,0x20,0x31,0x88,0x74,0xF0,0x63,0xF0,0x69,0x05,0x28,0x04,0xD9,0xFB,0xF7, + 0x31,0xFC,0x05,0x99,0x00,0x20,0xC8,0x82,0xF1,0x69,0x01,0x98,0x40,0x1C,0x81,0x42, + 0x09,0xD1,0x00,0x20,0x30,0x71,0x30,0x64,0x70,0x64,0xB0,0x82,0xB0,0x64,0xF0,0x64, + 0x30,0x65,0xC8,0x20,0xB0,0x63,0xF1,0x6C,0xB0,0x6C,0x08,0x43,0x04,0xD0,0x30,0x6D, + 0xFA,0x28,0x01,0xD2,0x40,0x1C,0x30,0x65,0xF0,0x8A,0x69,0x49,0x88,0x42,0x01,0xD2, + 0x40,0x1C,0xF0,0x82,0x62,0x48,0x20,0x30,0x40,0x7C,0x00,0x28,0x70,0x79,0x03,0xD0, + 0xFA,0x28,0x05,0xD2,0x40,0x1C,0x02,0xE0,0x00,0x28,0x01,0xD0,0x40,0x1E,0x70,0x71, + 0xF1,0x78,0xB0,0x8A,0x00,0x29,0x05,0xD0,0x7D,0x22,0xD2,0x00,0x90,0x42,0x05,0xD2, + 0x40,0x1C,0x02,0xE0,0x00,0x28,0x01,0xD0,0x40,0x1E,0xB0,0x82,0xF0,0x8A,0x23,0x28, + 0x03,0xD2,0x72,0x79,0x19,0x2A,0x00,0xD9,0x75,0x70,0x00,0x29,0x0F,0xD0,0x71,0x79, + 0x4B,0x29,0x04,0xD9,0xAF,0x21,0x89,0x00,0x88,0x42,0x00,0xD2,0x75,0x70,0xB1,0x8A, + 0x4B,0x29,0x04,0xD9,0xAF,0x21,0x89,0x00,0x88,0x42,0x00,0xD2,0x75,0x70,0x30,0x6D, + 0x14,0x28,0x0B,0xD9,0x70,0x6B,0xFF,0x21,0x91,0x31,0x88,0x42,0x06,0xD2,0xB0,0x6B, + 0xFF,0x21,0x2D,0x31,0x88,0x42,0x01,0xD2,0x75,0x70,0x02,0xE0,0x70,0x78,0x00,0x28, + 0x10,0xD0,0xFB,0xF7,0xBF,0xFE,0xFB,0xF7,0xF5,0xFD,0x01,0x20,0x80,0x03,0xFA,0xF7, + 0x8D,0xF8,0xFB,0xF7,0x07,0xFE,0xFB,0xF7,0xB5,0xFE,0xF9,0xF7,0x0F,0xFD,0xFB,0xF7, + 0xCB,0xFB,0x28,0xE0,0x3B,0x48,0x41,0x68,0x09,0x07,0x0C,0xD5,0xC1,0x68,0x00,0x29, + 0x09,0xD0,0xC0,0x68,0x07,0x28,0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0x09,0xE0, + 0x00,0xF0,0x90,0xFA,0x06,0xE0,0x01,0xF0,0xEF,0xF8,0xB0,0x7C,0x80,0x28,0x01,0xD1, + 0xFB,0xF7,0xB8,0xFC,0xFB,0xF7,0x96,0xFE,0xFB,0xF7,0xCC,0xFD,0x01,0x20,0x80,0x03, + 0xFA,0xF7,0x64,0xF8,0xFB,0xF7,0xDE,0xFD,0x00,0xF0,0x6E,0xF9,0x07,0x00,0xFB,0xF7, + 0x89,0xFE,0xF9,0xF7,0xE3,0xFC,0x70,0x78,0x00,0x28,0x1B,0xD0,0x21,0x48,0x01,0x21, + 0xC0,0x7F,0x40,0x08,0x01,0xF0,0x28,0xF9,0x1A,0x48,0x00,0x21,0x41,0x70,0x1C,0x48, + 0x08,0x23,0xC0,0x38,0xC2,0x88,0x9A,0x43,0xC2,0x80,0xC2,0x88,0x5B,0x01,0x9A,0x43, + 0xC2,0x80,0xC2,0x88,0x10,0x23,0x9A,0x43,0xC2,0x80,0x08,0x98,0x41,0x74,0x0A,0x98, + 0xC1,0x62,0x7E,0xE0,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x70,0x7C,0x00,0x28, + 0x01,0xD1,0x00,0xF0,0xCB,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28,0x70,0xD1, + 0x03,0x20,0x40,0x03,0xFA,0xF7,0x22,0xF8,0x03,0x20,0x01,0xF0,0x99,0xF9,0x70,0x65, + 0x03,0x20,0x01,0xF0,0xCB,0xF9,0x80,0x20,0x16,0xE0,0x00,0x00,0x78,0x06,0x00,0x20, + 0x60,0x94,0x00,0x00,0x64,0x05,0x00,0x20,0x40,0x05,0x00,0x20,0x00,0x90,0x00,0x40, + 0x00,0x01,0x00,0x20,0x00,0x93,0x00,0x00,0xE0,0x02,0x00,0x20,0x01,0x02,0x00,0x00, + 0x10,0x27,0x00,0x00,0x00,0x40,0x00,0x30,0xFA,0xF7,0x00,0xF8,0x00,0x2F,0x0C,0xD0, + 0x0A,0x20,0x78,0x43,0x71,0x6D,0x08,0x1A,0x70,0x65,0xFF,0x20,0x41,0x30,0x78,0x43, + 0x71,0x6D,0x40,0x18,0xFF,0x38,0x7D,0x38,0x70,0x65,0x26,0x48,0x00,0x78,0xB1,0x7A, + 0x08,0x43,0x2F,0xD1,0x30,0x6B,0x00,0x28,0x2C,0xD0,0x23,0x48,0xC0,0x88,0x40,0x06, + 0x70,0x6D,0x22,0x49,0x0E,0x1A,0xFF,0x20,0x91,0x30,0x86,0x42,0x22,0xDD,0xFF,0x20, + 0x01,0x30,0xF9,0xF7,0xE3,0xFF,0x02,0x20,0x01,0xF0,0x88,0xF9,0x0A,0x21,0x30,0x00, + 0xF9,0xF7,0xF4,0xF9,0x41,0x11,0x02,0x20,0x01,0xF0,0x68,0xF9,0x04,0x20,0xFA,0xF7, + 0x0D,0xF8,0x17,0x49,0x88,0x68,0x8A,0x15,0x10,0x43,0x88,0x60,0x15,0x48,0x05,0x61, + 0xFF,0x20,0xFA,0xF7,0x03,0xF8,0x02,0x20,0x01,0xF0,0x70,0xF9,0xFF,0x20,0x01,0x30, + 0xF9,0xF7,0xBC,0xFF,0x10,0x4E,0xF0,0x69,0x06,0x99,0x88,0x42,0x01,0xD2,0x1A,0xE6, + 0xFF,0xE7,0x0E,0x48,0x00,0x68,0x40,0x30,0x41,0x7D,0x08,0x98,0x41,0x74,0x0A,0x48, + 0x40,0x7B,0x00,0x28,0x01,0xD0,0x01,0xF0,0xC9,0xFA,0x0B,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x7D,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xFC,0x3A,0x00,0x00, + 0x00,0x40,0x00,0x40,0x40,0x00,0x00,0x40,0x64,0x05,0x00,0x20,0x78,0x06,0x00,0x20, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47, + 0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x00,0x00,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A, + 0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00, + 0x10,0xB5,0xF9,0xF7,0x31,0xFB,0x03,0x20,0x40,0x03,0xF9,0xF7,0x6F,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xF9,0xF7,0x6F,0xFF,0xF9,0xF7, + 0x2D,0xFB,0xFB,0xF7,0xDF,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0x5F,0xFC,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xF9,0xF7, + 0x87,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1, + 0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5,0xA0,0xB0,0x9F,0xE5, + 0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2,0x14,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3, + 0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0, + 0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1, + 0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A, + 0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA, + 0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3, + 0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3, + 0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1, + 0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A, + 0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0xF5,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0x7C,0x4C,0x00,0x26,0x00,0x96, + 0xE0,0x68,0x07,0x28,0x03,0xD0,0xE0,0x03,0x05,0x68,0x00,0x2D,0x03,0xD1,0x00,0x20, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0xFF,0x20,0x01,0x30,0xF9,0xF7,0xDF,0xFE,0x02,0x20, + 0x01,0xF0,0x84,0xF8,0x00,0xF0,0xF6,0xF8,0x71,0x4F,0x05,0x2D,0xB8,0x7B,0x50,0xD8, + 0x00,0x28,0x50,0xD1,0x01,0x20,0x41,0x07,0x04,0xE0,0x82,0x00,0x52,0x18,0x12,0x68, + 0xE2,0x61,0x40,0x1C,0xA8,0x42,0xF8,0xD9,0x6A,0x48,0x20,0x60,0x21,0x20,0x80,0x02, + 0x20,0x61,0x03,0x20,0xFC,0xF7,0x94,0xFE,0x67,0x48,0x0A,0x21,0x00,0x6B,0xF9,0xF7, + 0x05,0xFA,0x41,0x09,0x02,0x20,0x01,0xF0,0x49,0xF8,0x64,0x4D,0xE8,0x68,0x40,0x08, + 0x40,0x00,0xE8,0x60,0x02,0x20,0x01,0xF0,0x49,0xF8,0x04,0x20,0xF9,0xF7,0xE6,0xFE, + 0x5F,0x48,0x01,0x26,0x06,0x61,0x03,0x21,0x09,0x07,0xC8,0x68,0x08,0x22,0x10,0x43, + 0xC8,0x60,0x02,0x20,0x01,0xF0,0x14,0xF8,0x00,0x90,0x60,0x68,0x60,0x60,0x60,0x69, + 0x60,0x61,0xFD,0xF7,0x7B,0xF8,0x02,0x20,0x01,0xF0,0x40,0xF8,0x03,0x20,0xFC,0xF7, + 0x57,0xFE,0xE8,0x68,0x30,0x43,0xE8,0x60,0x52,0x48,0x00,0x78,0x00,0x28,0x07,0xD0, + 0x78,0x7B,0x00,0x28,0xFB,0xD0,0xB8,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0xA6,0xF9, + 0x86,0xE0,0x00,0x28,0x03,0xD0,0x6D,0x1C,0xFC,0xF7,0x5E,0xFC,0x06,0x00,0x4A,0x48, + 0x01,0x68,0x42,0x48,0xC1,0x61,0x44,0x48,0x02,0x24,0x00,0x6B,0x0A,0x21,0xF9,0xF7, + 0xBD,0xF9,0x01,0x00,0x02,0x20,0x01,0xF0,0x01,0xF8,0x02,0x20,0x01,0xF0,0x06,0xF8, + 0x3E,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x39,0x48,0x37,0x4F,0x80,0x7B, + 0x21,0x07,0x1D,0xE0,0x7A,0x69,0x52,0x06,0x0A,0xD4,0x00,0x28,0x01,0xD0,0xAC,0x42, + 0x04,0xD2,0xA2,0x00,0x52,0x18,0x12,0x68,0xFA,0x61,0x00,0xE0,0xFE,0x61,0x64,0x1C, + 0x34,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0,0xFC,0xF7,0x88,0xFD,0x2C,0x48,0x41,0x7B, + 0x00,0x29,0x07,0xD0,0x80,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0x67,0xF9,0x01,0xE0, + 0xAC,0x42,0xDF,0xD9,0x02,0x20,0x00,0xF0,0xE9,0xFF,0x2A,0x4D,0x28,0x78,0x00,0x28, + 0x37,0xD1,0xFC,0xF7,0x8D,0xFC,0x00,0x28,0x33,0xD0,0x23,0x48,0x0A,0x21,0x00,0x6B, + 0xF9,0xF7,0x7C,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0,0xC0,0xFF,0x02,0x20,0x00,0xF0, + 0xC5,0xFF,0x1B,0x4C,0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFC,0xF7,0x5E,0xFD, + 0x60,0x7B,0x00,0x28,0x04,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0x3E,0xF9, + 0xFC,0xF7,0x6E,0xFC,0x00,0x28,0xEE,0xD1,0x78,0x68,0x78,0x60,0x0B,0xE0,0x28,0x78, + 0x00,0x28,0x08,0xD0,0x60,0x7B,0x00,0x28,0x08,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C, + 0x01,0xF0,0x2C,0xF9,0x02,0xE0,0x78,0x68,0xC0,0x03,0xF0,0xD5,0x02,0x20,0x00,0xF0, + 0xAD,0xFF,0x00,0xF0,0x1F,0xF8,0x09,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60, + 0xFF,0x20,0x01,0x30,0xF9,0xF7,0xF2,0xFD,0x00,0x98,0x11,0xE7,0x00,0x40,0x00,0x30, + 0x64,0x05,0x00,0x20,0xD0,0x10,0x05,0x00,0x00,0x93,0x00,0x00,0x00,0x20,0x00,0x40, + 0x40,0x00,0x00,0x40,0x7D,0x06,0x00,0x20,0x04,0x00,0x00,0x20,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21, + 0x01,0x62,0xFC,0xF7,0xBB,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x70,0x47,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x80,0x18,0x70,0x47,0x00,0x00,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19, + 0x10,0xBC,0x70,0x47,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A, + 0x90,0x73,0x90,0x7B,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9, + 0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21,0x10,0x30,0xF9,0xF7, + 0x11,0xF9,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25,0x08,0x4C,0xAD,0x01, + 0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19, + 0x40,0x1C,0x3E,0x63,0x96,0x7B,0x86,0x42,0xF3,0xD8,0xEA,0xE7,0x20,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0x70,0xB5,0x1F,0x49,0x1D,0x4C,0x0D,0x00,0x20,0x7A,0xAB,0x22, + 0xFF,0x35,0x92,0x00,0xE7,0x35,0x8E,0x18,0x00,0x28,0x0F,0xD0,0xFF,0x31,0x5A,0x22, + 0x8D,0x31,0x28,0x00,0xF9,0xF7,0x16,0xF9,0x17,0x49,0x09,0x22,0x30,0x00,0xF9,0xF7, + 0x11,0xF9,0x20,0x7A,0x60,0x72,0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21, + 0x30,0x00,0xF9,0xF7,0xD7,0xF8,0x5A,0x22,0x00,0x21,0x28,0x00,0xF9,0xF7,0xD2,0xF8, + 0x0D,0x48,0x5A,0x22,0x00,0x21,0x63,0x38,0xF9,0xF7,0xCC,0xF8,0x0A,0x48,0x09,0x22, + 0x00,0x21,0x09,0x38,0xF9,0xF7,0xC6,0xF8,0x00,0x20,0x06,0x49,0x60,0x72,0xA0,0x72, + 0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x04,0x49,0x88,0x76,0xDB,0xE7,0x00,0x00, + 0xC0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0xE3,0x02,0x00,0x20,0xA0,0x04,0x00,0x20, + 0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48,0x00,0x78,0x00,0x28, + 0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8C,0x4A,0x1A,0x26, + 0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E, + 0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F, + 0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91, + 0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49,0x20,0x39,0x8A,0x5E, + 0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22, + 0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60, + 0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E, + 0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x01,0xF0,0x2C,0xF8,0x20,0x8C,0x64,0x21,0x0A,0x90, + 0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38, + 0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28, + 0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x15,0x20,0x08,0x90,0x5D,0x48,0x0E,0x21, + 0x80,0x7F,0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21,0x01,0xE0,0x14,0x20, + 0x08,0x90,0x20,0x00,0xF8,0xF7,0xE2,0xFE,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90, + 0x08,0x99,0x28,0x00,0xF8,0xF7,0xDA,0xFE,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E, + 0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90, + 0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B, + 0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00, + 0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43, + 0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xF8,0xF7,0xAF,0xFE,0xC7,0x19, + 0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00, + 0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xF8,0xF7,0xA0,0xFE,0x07,0x99,0xC9,0x07, + 0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0, + 0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB, + 0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21, + 0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98, + 0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99, + 0x49,0x1B,0x89,0x1A,0xF8,0xF7,0x72,0xFE,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1, + 0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B, + 0x64,0x21,0xF8,0xF7,0x63,0xFE,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB, + 0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60, + 0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99, + 0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x64,0xFF,0x13,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0x75,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0xE0,0x95,0x00,0x00,0xA0,0x04,0x00,0x20,0xFF,0xB5,0x00,0x68,0x8E,0x46,0x84,0x46, + 0x70,0x46,0x1B,0x4B,0x1B,0x49,0x05,0x68,0x00,0x22,0x19,0x4E,0x54,0x00,0x24,0x3E, + 0x34,0x5B,0x66,0x46,0x00,0x20,0x34,0x1B,0x26,0x00,0x74,0x43,0x46,0x00,0x9E,0x5B, + 0xAE,0x1B,0x37,0x00,0x77,0x43,0xE6,0x19,0x8E,0x42,0x18,0xD2,0x51,0x00,0x10,0x4A, + 0x40,0x00,0x24,0x3A,0x52,0x5A,0x02,0x99,0x0A,0x60,0x0D,0x49,0x03,0x9A,0x16,0x39, + 0x0C,0x5A,0x14,0x60,0x09,0x5A,0x72,0x46,0x12,0x68,0x18,0x5A,0x51,0x18,0x09,0x1A, + 0x70,0x46,0x01,0x60,0x01,0x20,0x04,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x1C, + 0x0B,0x28,0xDB,0xD3,0x52,0x1C,0x07,0x2A,0xCF,0xD3,0x00,0x20,0xC0,0x43,0xF2,0xE7, + 0x1C,0x89,0x00,0x00,0x11,0x02,0x00,0x00,0xFE,0xB5,0x67,0x4D,0x65,0x48,0x00,0x26, + 0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x79,0x81,0x31,0x08,0x7A,0x33,0x00,0x00,0x2A, + 0x28,0xD1,0x00,0x28,0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00, + 0xFF,0x30,0x93,0x30,0xFC,0xF7,0xAA,0xFC,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B, + 0x00,0x98,0x40,0x1C,0x81,0x42,0x14,0xD3,0xA9,0x19,0x27,0x22,0x00,0x90,0xFF,0x20, + 0x52,0x01,0x8D,0x30,0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x71,0x76,0x1C, + 0x8D,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x0E,0xFA,0x64,0x1C,0x09,0x2C, + 0xDA,0xDB,0x91,0xE0,0x49,0x7A,0x00,0x29,0x01,0xD1,0x00,0x28,0x75,0xD0,0x0B,0x20, + 0x80,0x01,0x00,0x24,0x2E,0x18,0x27,0x27,0x7F,0x01,0x28,0x19,0xC0,0x19,0x40,0x79, + 0x00,0x28,0x3C,0xD0,0x29,0x18,0x15,0x20,0x40,0x01,0x08,0x18,0xC1,0x78,0x00,0x29, + 0x02,0xD0,0xB2,0x7C,0x00,0x2A,0x11,0xD0,0x00,0x99,0x00,0x7B,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xE7,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0xE2,0xF9,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x93,0x30,0xFC,0xF7,0x58,0xFC,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x8D,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0xC9,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x79,0x40,0x1C, + 0x4A,0x71,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBD,0xDB,0x01,0x24, + 0x25,0x49,0x15,0x20,0x0A,0x19,0x40,0x01,0x10,0x18,0xC0,0x78,0x00,0x22,0x01,0x92, + 0x00,0x28,0x32,0xD0,0xB2,0x7C,0x00,0x2A,0x2F,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x93,0x30,0xFC,0xF7,0x29,0xFC,0x00,0x28,0x25,0xD0,0x1B,0x48, + 0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x26,0xD3,0x17,0x4A,0x00,0x20,0x11,0x18, + 0xC9,0x19,0x49,0x79,0xA1,0x42,0x0C,0xD0,0x00,0x29,0x07,0xD1,0xFF,0x21,0x8D,0x31, + 0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x71,0x06,0xE0,0x12,0xE0,0x40,0x1C,0x08,0x28, + 0xED,0xDB,0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0x8D,0x32, + 0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x7F,0xF9,0x64,0x1C,0x09,0x2C,0xBF,0xDB, + 0x02,0xE0,0x01,0x20,0x40,0x07,0x43,0x60,0x00,0x98,0x00,0xF0,0xC3,0xFC,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0xFC,0xB5,0x4E,0x48,0x36,0x25,0x45,0x5F,0x15,0x20,0x84,0x46,0x4B,0x48,0x4C,0x4F, + 0x80,0x30,0x82,0x7D,0x86,0x46,0x4B,0x48,0x00,0x26,0x81,0x7F,0x0E,0x24,0xC8,0x07, + 0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24,0x01,0xE0,0x14,0x20,0x84,0x46,0x00,0x21, + 0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A, + 0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2, + 0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3, + 0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42, + 0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3, + 0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48, + 0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A, + 0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04,0x12,0x14,0x25,0x48,0xA0,0x30, + 0x01,0x69,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C, + 0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x01,0x61,0x1E,0x49,0xA0,0x31,0x49,0x69, + 0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29, + 0x01,0xDD,0x49,0x1E,0x41,0x61,0x74,0x46,0xA4,0x8B,0x05,0x69,0x01,0x22,0x11,0x00, + 0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0x40,0x69,0x98,0x42,0x00,0xDC,0x00,0x22, + 0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A, + 0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0, + 0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28, + 0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0xD4,0x02,0x10,0x40,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x25,0x48, + 0x25,0x4C,0xC0,0x88,0x01,0x23,0x25,0x4D,0x41,0x06,0x09,0x20,0x80,0x01,0x24,0x4F, + 0x24,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29,0x10,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69, + 0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60, + 0x80,0x6B,0x28,0x61,0x1C,0x48,0xA8,0x62,0xE0,0x6A,0x10,0xE0,0x1B,0x49,0x4A,0x69, + 0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62, + 0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0x15,0x48,0xA8,0x62,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xF8,0xF7,0x71,0xFD,0x30,0x63,0x70,0x7C,0x00,0x28, + 0x04,0xD0,0x10,0x48,0xE8,0x60,0x01,0x20,0x00,0x05,0x28,0x61,0x60,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xF8,0xF7,0x61,0xFD,0xF0,0x62,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xC0,0x90,0x00,0x40, + 0x10,0x27,0x00,0x00,0x64,0x05,0x00,0x20,0x00,0x00,0x08,0x84,0x80,0x94,0x00,0x00, + 0x00,0x00,0x04,0x82,0x41,0x20,0x01,0x00,0x07,0x48,0x41,0x7A,0x07,0x48,0x02,0x29, + 0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29,0x01,0xD1,0xC0,0x69,0x00,0xE0,0x80,0x69, + 0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00,0xC0,0x01,0x00,0x20,0xC0,0x94,0x00,0x00, + 0xC0,0x90,0x00,0x40,0x0F,0x48,0x10,0xB4,0xC0,0x88,0x0F,0x4A,0x01,0x23,0x44,0x06, + 0x0E,0x48,0x00,0x21,0x1B,0x04,0x00,0x2C,0x02,0x61,0x05,0xDA,0x0C,0x4A,0x42,0x61, + 0x81,0x61,0xC1,0x61,0x03,0x62,0x07,0xE0,0x09,0x4A,0x64,0x3A,0x42,0x61,0x81,0x61, + 0xC1,0x61,0x03,0x62,0x06,0x4A,0xC8,0x3A,0x42,0x62,0x81,0x62,0xC1,0x62,0x10,0xBC, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x01,0x03,0x40,0xA1,0x00,0x40, + 0x2C,0x01,0x01,0x00,0x10,0x49,0x10,0xB4,0x0A,0x7D,0x10,0x48,0x82,0x77,0x4A,0x7D, + 0xC2,0x77,0x82,0x7F,0x0E,0x48,0xD3,0x07,0x0A,0xD0,0x93,0x07,0x0D,0x4A,0x03,0xD5, + 0x0D,0x23,0x03,0x73,0x00,0x23,0x02,0xE0,0x14,0x23,0x03,0x73,0x01,0x23,0x53,0x72, + 0x8A,0x7D,0x42,0x73,0xCA,0x7D,0x82,0x73,0x0A,0x7E,0xC2,0x73,0x4A,0x7E,0x02,0x74, + 0x89,0x7E,0x41,0x74,0x10,0xBC,0x70,0x47,0x00,0x93,0x00,0x00,0xA0,0x04,0x00,0x20, + 0xE0,0x04,0x00,0x20,0x64,0x05,0x00,0x20,0xFF,0xB5,0x05,0x00,0x14,0x00,0x19,0x00, + 0x10,0x00,0x81,0xB0,0xF9,0xF7,0xA4,0xFF,0x00,0x28,0x08,0xD0,0x02,0x98,0x02,0x99, + 0x00,0x68,0x40,0x1E,0x08,0x60,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x29,0x48, + 0x80,0x7F,0xC0,0x07,0x22,0xD0,0xE0,0x79,0x05,0x28,0x1D,0xD0,0x09,0x28,0x1D,0xD1, + 0x25,0x4F,0x6D,0x08,0x3E,0x00,0x6D,0x00,0x01,0x20,0xFF,0x36,0x22,0x78,0x81,0x36, + 0x0E,0xE0,0x0A,0x21,0x41,0x43,0xC9,0x19,0xFF,0x31,0xE1,0x31,0x8B,0x79,0x9A,0x42, + 0x05,0xD1,0x0B,0x89,0x63,0x80,0xCB,0x79,0x63,0x70,0x49,0x89,0xA1,0x80,0x40,0x1C, + 0x71,0x7A,0x81,0x42,0xED,0xDA,0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x21,0xA8,0x07, + 0x89,0x06,0x88,0x43,0x21,0x78,0x62,0x78,0x09,0x07,0x89,0x08,0x08,0x43,0x13,0x49, + 0x92,0x06,0x08,0x40,0x61,0x88,0x12,0x0C,0x89,0x05,0x89,0x09,0x08,0x43,0x3F,0x21, + 0x89,0x02,0x88,0x43,0x10,0x43,0x02,0x04,0x92,0x0E,0x0F,0x2A,0x03,0xD9,0x88,0x43, + 0x0F,0x21,0x89,0x02,0x40,0x18,0xA1,0x88,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D, + 0x08,0x43,0x02,0x99,0x01,0x22,0x09,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60, + 0xA9,0xE7,0x00,0x00,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x10,0x49,0x10,0xB5,0x88,0x7C,0x00,0x28,0x14,0xD0,0x00,0x09,0x00,0x01,0x00,0x23, + 0x01,0x22,0x40,0x28,0x0B,0xD0,0x80,0x28,0x0C,0xD1,0x8A,0x73,0xCA,0x73,0x0A,0x48, + 0x0A,0x74,0x0A,0x73,0x00,0x78,0x00,0x28,0x07,0xD1,0x4B,0x74,0x06,0xE0,0xCB,0x72, + 0x0A,0x73,0x4B,0x73,0x10,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x74,0x00,0x20,0x00,0xF0, + 0xC7,0xF9,0xF7,0xE7,0x64,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0xF0,0x41,0x2D,0xE9, + 0x00,0xC0,0xA0,0xE1,0x1C,0x50,0x9D,0xE5,0x18,0x60,0x9D,0xE5,0x01,0x00,0x5C,0xE1, + 0x01,0x40,0xA0,0xE1,0x02,0x00,0xA0,0xE1,0x03,0x70,0xA0,0xE1,0x06,0x00,0x00,0x3A, + 0x04,0x10,0xA0,0xE1,0x85,0xE1,0xFF,0xEB,0xB0,0x00,0xC6,0xE1,0x04,0x10,0xA0,0xE1, + 0x07,0x00,0xA0,0xE1,0x81,0xE1,0xFF,0xEB,0xB0,0x00,0xC5,0xE1,0xF0,0x41,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0xF0,0x47,0x2D,0xE9,0x00,0x40,0xA0,0xE1,0x20,0x80,0x8D,0xE2, + 0x28,0x60,0x8D,0xE2,0x01,0x01,0x98,0xE8,0x60,0x00,0x96,0xE8,0x02,0x00,0x51,0xE1, + 0xB2,0x50,0xC4,0xB1,0xB4,0x60,0xC4,0xB1,0x11,0x00,0x00,0xBA,0x03,0x00,0x51,0xE1, + 0xB2,0x00,0xC4,0xA1,0xB4,0x80,0xC4,0xA1,0x0D,0x00,0x00,0xAA,0x02,0x70,0x41,0xE0, + 0x05,0x00,0x40,0xE0,0x97,0x00,0x00,0xE0,0x02,0x90,0x43,0xE0,0x09,0x10,0xA0,0xE1, + 0x6A,0xE1,0xFF,0xEB,0x05,0x00,0x80,0xE0,0xB2,0x00,0xC4,0xE1,0x06,0x00,0x48,0xE0, + 0x97,0x00,0x00,0xE0,0x09,0x10,0xA0,0xE1,0x64,0xE1,0xFF,0xEB,0x06,0x00,0x80,0xE0, + 0xB4,0x00,0xC4,0xE1,0xF0,0x47,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xF0,0xB4,0x8C,0x79, + 0x14,0x4B,0x00,0x26,0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02, + 0x5B,0x07,0x09,0xD5,0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D, + 0x3A,0x43,0x64,0x00,0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79, + 0x80,0x00,0x9B,0x06,0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60, + 0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x76,0x06,0x77, + 0xF0,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xA0,0x04,0x00,0x20, + 0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06, + 0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B, + 0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x10,0xB4,0x0E,0x24,0x60,0x43,0x03,0x4B, + 0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06, + 0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D, + 0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x70,0xB4,0x12,0x4A,0x11,0x4D,0x52,0x7D, + 0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43,0x0E,0x22,0x50,0x43,0x0C,0x4B,0x86,0x18, + 0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0,0xEA,0x7D,0x8A,0x42,0x0A,0xD0,0x2A,0x7E, + 0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42,0x04,0xD0,0xAA,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C,0x86,0x42,0xEA,0xD8,0x70,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x70,0xB4,0x12,0x4A,0x11,0x4B,0x52,0x7D, + 0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43,0xFF,0x26,0x0D,0x4C,0x27,0x36,0x12,0xE0, + 0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42, + 0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00, + 0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42,0xEA,0xD3,0x70,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06,0x04,0x48,0x01,0xD5,0x40,0x68,0x00,0xE0, + 0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xC0,0x93,0x00,0x00, + 0x00,0x90,0x00,0x40,0x03,0x00,0xF0,0xB5,0x1D,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18, + 0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31,0x18,0x4C,0x4F,0x6A,0x0E,0x6A,0x88,0x6A, + 0x00,0xF0,0x06,0xFB,0x06,0x04,0x0A,0x14,0x18,0x20,0x24,0x11,0xC8,0x68,0x20,0x62, + 0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62, + 0x04,0x20,0xE0,0x62,0x66,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x08,0x69,0x20,0x62, + 0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x67,0x63,0xF0,0xE7,0x07,0x49,0x21,0x62,0x25,0x21,0x02,0xE0,0x89,0x69,0x21,0x62, + 0x29,0x68,0x61,0x62,0x05,0x21,0xE1,0x62,0x60,0x63,0xE4,0xE7,0x80,0x90,0x00,0x40, + 0x00,0x93,0x00,0x00,0x01,0x02,0x00,0x00,0x70,0xB4,0x01,0x23,0x5B,0x07,0x58,0x68, + 0x59,0x68,0xC0,0x02,0xC0,0x0E,0x09,0x02,0x4C,0x0F,0x18,0x49,0x01,0x26,0x00,0x22, + 0x00,0x2C,0x10,0xD0,0xCC,0x79,0x35,0x00,0x00,0x2C,0x00,0xD0,0x00,0x25,0x85,0x42, + 0x07,0xD0,0x45,0x08,0x64,0x08,0xA5,0x42,0x03,0xD1,0xC8,0x71,0x1A,0x60,0x70,0xBC, + 0x70,0x47,0xC8,0x71,0x00,0xE0,0xCA,0x71,0x58,0x68,0x00,0x04,0x00,0x0F,0x58,0x68, + 0x03,0xD0,0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E,0x01,0xD0, + 0x01,0x20,0x07,0xE0,0x88,0x79,0x00,0x28,0x02,0xD1,0x01,0x20,0x8E,0x71,0x02,0xE0, + 0x0F,0x22,0x00,0x20,0x8A,0x71,0x18,0x60,0xE1,0xE7,0x00,0x00,0x64,0x05,0x00,0x20, + 0x0A,0x4A,0x10,0xB5,0xD1,0x88,0x0A,0x4B,0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43, + 0x08,0x48,0xD1,0x80,0x03,0xE0,0x07,0x48,0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60, + 0xFF,0xF7,0xD4,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x78,0x06,0x00,0x20,0xB0,0x94,0x00,0x00,0xFE,0xB5,0x04,0x00,0x3A,0x48,0x0E,0x00, + 0x07,0x6A,0x41,0x6A,0x02,0x91,0x41,0x6B,0x01,0x91,0xC0,0x6A,0x00,0x90,0x00,0x20, + 0xFF,0xF7,0x58,0xFF,0xFA,0xF7,0xC8,0xFC,0x25,0x00,0x47,0xE0,0x68,0x1E,0x84,0x42, + 0x01,0xD1,0xFA,0xF7,0xEB,0xFC,0xFA,0xF7,0x8D,0xFC,0xFA,0xF7,0x3B,0xFD,0x00,0x2E, + 0x2F,0xD1,0xA8,0x00,0x05,0x21,0xF8,0xF7,0x51,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF8,0xF7,0x46,0xFA, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21, + 0xF8,0xF7,0x3C,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0, + 0x05,0x21,0x28,0x00,0xF8,0xF7,0x32,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0x01,0x23,0xFA,0xF7,0x4A,0xFA, + 0x0C,0xE0,0x68,0x00,0x03,0x21,0xF8,0xF7,0x21,0xFA,0xA0,0x42,0xDA,0xD9,0x03,0x21, + 0x28,0x00,0xF8,0xF7,0x1B,0xFA,0xA0,0x42,0xE8,0xD8,0xDD,0xE7,0x64,0x1E,0xB5,0xD2, + 0x0E,0x48,0x44,0x88,0x03,0xE0,0xFA,0xF7,0x45,0xFC,0xFA,0xF7,0xF3,0xFC,0x64,0x1E, + 0xF9,0xD2,0xFA,0xF7,0x69,0xFC,0x08,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99, + 0x41,0x63,0x00,0x99,0xC1,0x62,0x06,0x49,0x00,0x20,0xC8,0x82,0x48,0x71,0x08,0x71, + 0x88,0x82,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x80,0x90,0x00,0x40,0xE0,0x95,0x00,0x00, + 0x64,0x05,0x00,0x20,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68, + 0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B, + 0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07, + 0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0x7D,0x06,0x00,0x20,0x30,0xB4,0x05,0x03, + 0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61, + 0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03, + 0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x05,0x49,0x00,0x03, + 0x40,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x02,0x49,0x00,0x20, + 0x08,0x70,0x70,0x47,0x00,0x20,0x00,0x40,0x7D,0x06,0x00,0x20,0x01,0x03,0x04,0x48, + 0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22, + 0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00, + 0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0, + 0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7, + 0x10,0x60,0x70,0x47,0x00,0x93,0x00,0x00,0x38,0xB5,0x00,0x24,0x71,0x20,0x6B,0x46, + 0x00,0x94,0xD8,0x70,0x00,0x98,0x01,0x25,0x6D,0x07,0x68,0x60,0x0D,0x48,0x09,0x22, + 0x21,0x00,0xF8,0xF7,0x87,0xF9,0x0B,0x48,0x09,0x22,0x00,0x21,0x09,0x38,0xF8,0xF7, + 0x81,0xF9,0x08,0x49,0x49,0x1F,0x88,0x7B,0x00,0x28,0x08,0xD0,0x00,0x20,0x03,0xE0, + 0x82,0x00,0x52,0x19,0x94,0x60,0x40,0x1C,0x8A,0x7B,0x82,0x42,0xF8,0xDC,0x38,0xBC, + 0x08,0xBC,0x18,0x47,0x25,0x05,0x00,0x20,0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00, + 0x01,0x21,0x89,0xB0,0x49,0x07,0x08,0x94,0x4F,0x68,0x61,0x4E,0xB9,0x0F,0x89,0x07, + 0x7E,0xD5,0x20,0x22,0x00,0x21,0x68,0x46,0xF8,0xF7,0x5C,0xF9,0x07,0x21,0xB8,0x01, + 0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00,0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43, + 0x08,0x90,0x00,0x20,0x33,0xE0,0x01,0x22,0x81,0x00,0x52,0x07,0x89,0x18,0x89,0x68, + 0x8E,0x00,0x32,0x0F,0x2A,0xD0,0x32,0x0F,0x94,0x46,0x92,0x00,0x6B,0x46,0xD2,0x18, + 0x40,0x3A,0xD3,0x6B,0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27, + 0x3F,0x06,0x0E,0x04,0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43,0x49,0x4E,0x33,0x40, + 0x8E,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43,0x1B,0x0B,0x89,0x05,0x1B,0x03,0x89,0x0D, + 0x0B,0x43,0xD3,0x63,0x62,0x46,0x52,0x1E,0x01,0x23,0x93,0x40,0x9A,0x05,0x92,0x0D, + 0x71,0x46,0x11,0x43,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x08,0x91,0x40,0x1C,0x08,0x99, + 0x8E,0x46,0x09,0x04,0x09,0x0F,0x81,0x42,0xC5,0xD8,0x08,0x98,0x01,0x27,0x00,0x04, + 0x00,0x0F,0x7B,0x07,0x0F,0xE0,0x82,0x00,0xD2,0x18,0x92,0x68,0x3E,0x00,0x92,0x00, + 0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06, + 0x24,0x0E,0x40,0x1C,0x08,0x91,0x08,0x99,0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F, + 0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x21,0x08,0x00,0x6E,0x46,0x82,0x00,0xB2,0x58, + 0x00,0x2A,0x03,0xD0,0x8F,0x00,0xFF,0x18,0xBA,0x60,0x49,0x1C,0x40,0x1C,0x08,0x28, + 0xF4,0xD3,0x23,0x49,0x08,0x98,0x88,0x43,0x29,0x07,0x09,0x0C,0x08,0x43,0x00,0xE0, + 0x07,0xE0,0x07,0x21,0x49,0x05,0x88,0x43,0x61,0x07,0x09,0x0A,0x08,0x43,0x08,0x90, + 0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0,0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C, + 0x82,0x00,0x11,0x0F,0x09,0x07,0x21,0x40,0x84,0x01,0xA4,0x0D,0x24,0x03,0x21,0x43, + 0x84,0x05,0x09,0x0B,0x09,0x03,0xA4,0x0D,0x21,0x43,0x0F,0x24,0x24,0x06,0x00,0x04, + 0x80,0x08,0xA1,0x43,0x20,0x40,0x01,0x43,0x08,0x0F,0x09,0xD0,0x12,0x0F,0x52,0x1E, + 0x01,0x20,0x90,0x40,0x80,0x05,0x80,0x0D,0xB0,0x43,0x5A,0x14,0x80,0x18,0x08,0x90, + 0x99,0x60,0x02,0xE0,0x01,0x21,0x49,0x07,0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x70, + 0x08,0x99,0x40,0x07,0x41,0x60,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF8,0xF7,0x9B,0xF8,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF8,0xF7,0x9D,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF8,0xF7,0x82,0xF8,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF8,0xF7,0x84,0xF8,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0x7C,0x06,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60, + 0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00, + 0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA, + 0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47, + 0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37, + 0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF8,0xF7, + 0x4F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x25,0x00,0x6F,0x00,0xB9,0x00,0xF0,0x00, + 0x27,0x01,0x71,0x01,0xBB,0x01,0x20,0x00,0x6C,0x00,0xB8,0x00,0x04,0x01,0x50,0x01, + 0x89,0x01,0xC2,0x01,0x0E,0x02,0x5A,0x02,0xA6,0x02,0xF2,0x02,0x24,0x00,0x72,0x00, + 0xBD,0x00,0x09,0x01,0x55,0x01,0x90,0x01,0xCC,0x01,0x19,0x02,0x59,0x02,0xAE,0x02, + 0xF4,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0x00, + 0x01,0x00,0x01,0x00,0x89,0x08,0x49,0x1E,0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07, + 0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29, + 0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2,0x01,0x10,0xC0,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0xB2,0x10,0xC0,0xE0,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2,0x04,0x10,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2,0x1E,0xFF,0x2F,0x31, + 0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x70,0x20,0x9F,0xE5,0x30,0x00,0x2D,0xE9,0x64,0xC0,0x9F,0xE5, + 0x00,0x00,0x92,0xE5,0x64,0x40,0x9F,0xE5,0x64,0x30,0x9F,0xE5,0x25,0x00,0xA0,0xE3, + 0x01,0x0C,0x80,0xE2,0x00,0x11,0x92,0xE7,0x80,0x50,0x84,0xE0,0xB0,0x10,0xC5,0xE1, + 0x00,0x11,0x9C,0xE7,0x80,0x50,0x83,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xC5,0xE1, + 0xF7,0xFF,0xFF,0x5A,0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x24,0x20,0x9F,0xE5, + 0x30,0x10,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x31,0x92,0xE7, + 0x80,0xC0,0x81,0xE0,0x23,0x38,0xA0,0xE1,0x01,0x00,0x50,0xE2,0xB0,0x30,0xCC,0xE1, + 0xF9,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40,0x00,0x10,0x10,0x40, + 0x7E,0x06,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x05,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0xFC,0x3A,0x00,0x00,0xFC,0x3A,0x00,0x00,0xFC,0x3A,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0xB0,0x04,0xB0,0x04,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x78,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x66,0x00,0x67,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1D,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x14,0x00,0x00,0x00,0x00,0x00, + 0x05,0x02,0x06,0x0A,0x01,0x01,0x04,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x80,0x0F,0xA0,0x8F,0x60,0x0F,0x80,0x8F,0x9F,0xB9,0x2C,0x01, + 0x14,0x00,0x14,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00,0x32,0x00,0x05,0x00, + 0x19,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x46,0x00,0x5E,0x01,0x90,0x01,0x90,0x01, + 0x2C,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x0A,0x01,0x32,0x00,0x88,0x13,0x90,0x01,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0x96, + 0x96,0x96,0xB4,0x00,0xFF,0x0F,0xF4,0x01,0x50,0x00,0x1E,0x00,0xFA,0xFA,0x19,0xAA, + 0x00,0x05,0x04,0x0A,0x0A,0x06,0x20,0x03,0x46,0x00,0x03,0x19,0x00,0x02,0x0F,0x00, + 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x02,0x01,0x00,0x02,0x03,0x01,0x00,0x05,0x05,0x0A,0x0A, + 0x0F,0x0F,0x14,0x14,0x64,0x5A,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0x22,0x01,0x00, + 0x1C,0x1C,0x88,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x9F,0x99,0x5E,0x01,0x14,0x00,0x19,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00, + 0x96,0x00,0x14,0x00,0x32,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x90,0x01, + 0x90,0x01,0x90,0x01,0x90,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x0A,0x01,0x32,0x00,0x88,0x13,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0xF4,0x01,0xC8,0x00,0x1E,0x00, + 0xFA,0xFA,0x0D,0xA0,0x00,0x05,0x04,0x0A,0x02,0x06,0xE8,0x03,0x46,0x00,0x05,0x1E, + 0x00,0x02,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x06,0x01,0x02,0x01,0x00,0x03,0x03,0x03,0x00, + 0x05,0x05,0x0A,0x0A,0x0F,0x0F,0x14,0x14,0x64,0x5A,0x01,0x00,0x03,0x00,0x00,0x00, + 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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x22,0x01,0x00,0x12,0x12,0x88,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0A,0x00,0x04,0x00,0x00,0x00,0x0A,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x96,0x00,0xFA,0x00,0x00,0x00, + 0x21,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x00, + 0x25,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0A,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x32,0x00,0x50,0x00,0x32,0x00,0x50,0x00,0x0A,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xF0,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x8D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00, + 0x00,0x00,0x18,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x00,0x00,0x20,0x00, + 0x30,0x3F,0x30,0x3F,0x64,0x14,0x20,0x00,0x00,0x00,0x04,0x81,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x00, + 0x51,0x30,0x10,0x00,0x61,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x01,0x03,0x02,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x58,0x31,0x28,0x01,0x58,0x37,0x28,0x07,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x03,0xC8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01,0x58,0x31,0x28,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26, + 0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F, + 0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x22,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x22,0x22,0x24,0x3F,0x24,0x22,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x22,0x22, + 0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C, + 0x1C,0x1C,0x1C,0x1C,0x1C,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x14,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0x91,0xA7, + 0x21,0x2C,0x92,0xC7,0x42,0xBC,0x92,0xC7,0x63,0x28,0x93,0xC7,0x84,0xB8,0x93,0xC7, + 0xA5,0x24,0x94,0xC7,0xC6,0xB4,0x94,0xC7,0xE7,0x20,0x95,0xC7,0x08,0xB1,0x95,0xC7, + 0x29,0x9D,0x98,0xC7,0x4A,0x01,0x99,0xC7,0x6B,0x99,0x99,0xC7,0x8C,0x05,0x9A,0xC7, + 0xAD,0x95,0x9A,0xC7,0xCE,0x09,0x90,0xC7,0xEF,0x11,0x90,0xC7,0x10,0x0E,0x90,0xC7, + 0x31,0x46,0x90,0xC7,0x52,0x52,0x90,0xC7,0x73,0x4A,0x90,0xC7,0x94,0x4E,0x90,0xC7, + 0xB5,0x02,0x90,0xC7,0xD6,0x02,0x90,0xC7,0xF7,0x02,0x90,0xC7,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x6F,0x67,0x08,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x60,0x30,0x60,0x30, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0x40,0x00,0xD8,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0006_20140401.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0006_20140401.h new file mode 100644 index 00000000..a1c4c724 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_kanas_ver0006_20140401.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: KANAS_GF MELFAS, f/w 6(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xAD,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x39,0x4A,0x37,0x48,0x37,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x35,0x48,0x01,0x21,0x89,0x07,0xC8,0x61, + 0x34,0x48,0xC9,0x14,0x01,0x62,0x00,0x21,0x01,0x62,0x01,0x62,0x32,0x49,0x33,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x2D,0x4B, + 0x9F,0x6A,0x2F,0x48,0x00,0x69,0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61, + 0xFF,0xF7,0xE2,0xFF,0x58,0x69,0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x29,0x48, + 0x29,0x4C,0x20,0x60,0xFF,0x20,0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68, + 0xA6,0x15,0x30,0x43,0xA0,0x60,0x21,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x23,0x4F, + 0x21,0xE0,0x68,0x68,0x00,0x07,0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61, + 0x68,0x69,0x18,0x42,0xFC,0xD1,0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69, + 0x18,0x42,0xFC,0xD1,0x0D,0xE0,0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69, + 0x80,0x06,0xFC,0xD4,0x68,0x68,0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0xFF,0xF7,0xA9,0xFF,0xE0,0x68,0x11,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7, + 0xA3,0xFF,0xA0,0x68,0xB0,0x43,0xA0,0x60,0x00,0xF0,0x3A,0xF9,0xF8,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0x00,0x00,0x10,0x84,0x02,0x00,0x00,0xEC,0x00,0x00,0x00, + 0x5C,0x0A,0x00,0x00,0x40,0x00,0x00,0x40,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F, + 0x50,0xC3,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61, + 0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4, + 0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22, + 0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2, + 0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06, + 0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF, + 0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21, + 0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06, + 0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0xFF,0x20,0x00,0xF0,0x26,0xFF, + 0x03,0x25,0x0F,0x4E,0x2D,0x07,0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B, + 0xE9,0x68,0x80,0x08,0x3C,0x00,0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42, + 0x00,0xD0,0x34,0x63,0x81,0x00,0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x08,0xF0, + 0x1E,0xFA,0xE8,0x68,0xA0,0x43,0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x30,0xF8,0x05,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x52,0x4A,0x4F,0x48,0x50,0x49,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0, + 0x52,0x1E,0xFB,0xD2,0x00,0xF0,0xCE,0xFE,0x07,0x00,0x04,0xF0,0x23,0xF8,0x04,0xF0, + 0x15,0xF8,0x04,0xF0,0xA7,0xF8,0x4A,0x4A,0x4A,0x49,0x4B,0x48,0x00,0xF0,0xFC,0xF9, + 0x05,0x21,0x49,0x03,0x00,0x20,0x00,0xF0,0xFD,0xF9,0x48,0x4C,0x48,0x49,0x20,0x62, + 0x00,0x20,0x00,0xF0,0xF7,0xF9,0x47,0x4B,0x47,0x49,0xD8,0x63,0x47,0x48,0x00,0xF0, + 0xF1,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x04,0xF0,0x67,0xF8,0x44,0x4A, + 0x44,0x48,0x00,0x21,0x00,0xF0,0xEE,0xF9,0x07,0xF0,0xC4,0xFC,0x04,0xF0,0x16,0xF9, + 0x41,0x48,0x00,0x26,0x81,0x7A,0x01,0x25,0x6D,0x07,0xE1,0x72,0xC1,0x7A,0x21,0x73, + 0x40,0x7A,0x60,0x73,0xA6,0x72,0xA6,0x73,0xE6,0x73,0x26,0x74,0x39,0x48,0x66,0x74, + 0xA6,0x74,0x68,0x63,0xFF,0x20,0xE8,0x63,0xE8,0x14,0x00,0xF0,0x67,0xFE,0x37,0x48, + 0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0x61,0xFE,0x35,0x49,0x02,0x20,0x07,0xF0, + 0xE5,0xFF,0x02,0x20,0x07,0xF0,0xEA,0xFF,0x60,0x7B,0x00,0x28,0x01,0xD0,0x08,0xF0, + 0x5D,0xF9,0x00,0x2F,0x1F,0xD1,0x2F,0x4E,0xB7,0x15,0x60,0x7B,0x00,0x28,0x02,0xD0, + 0x2D,0x49,0xA0,0x6D,0x88,0x60,0xE8,0x6B,0x0B,0x28,0x14,0xD0,0x2B,0x48,0x40,0x68, + 0x00,0x07,0x01,0xD5,0x02,0xF0,0x84,0xFD,0xF0,0x68,0x29,0x49,0x88,0x42,0xEC,0xD9, + 0x28,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB0,0x68,0xB8,0x43,0xB0,0x60,0xB0,0x68, + 0x38,0x43,0xB0,0x60,0xE1,0xE7,0x20,0x7B,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02, + 0x00,0xF0,0x24,0xFE,0x60,0x7B,0x00,0x28,0x01,0xD0,0x08,0xF0,0x37,0xF9,0x02,0x20, + 0x07,0xF0,0xC4,0xFF,0xFF,0x20,0x81,0x30,0x00,0xF0,0x18,0xFE,0x1A,0x49,0x05,0x20, + 0x03,0xF0,0xEA,0xFD,0x0B,0x20,0xE8,0x63,0x03,0xF0,0x80,0xFE,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xB0,0x05,0x00,0x10,0x6C,0x89,0x00,0x00,0x80,0x01,0x00,0x00, + 0x28,0x00,0x00,0x00,0x44,0x89,0x00,0x00,0x00,0x00,0x00,0x10,0x64,0x05,0x00,0x20, + 0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20,0x00,0x9D,0x00,0x00,0x00,0x93,0x00,0x00, + 0x24,0x05,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0x7D,0x06,0x00,0x20, + 0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30, + 0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00,0x11,0x85,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0, + 0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0,0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0, + 0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1,0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3, + 0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21,0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A, + 0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A,0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0, + 0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0,0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0, + 0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0,0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0,0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21, + 0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3,0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2, + 0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0, + 0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23, + 0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1, + 0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5, + 0x02,0x20,0x08,0xF0,0x13,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46, + 0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA0,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0, + 0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0,0x83,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0, + 0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x48,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10,0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xF0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x28,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0xF0,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xA8,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0xC8,0xFD,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40, + 0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5, + 0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0B,0x24,0x02,0xF0,0x63,0xFB,0x64,0x1E, + 0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7F, + 0xC0,0x07,0x26,0xD0,0x70,0x7E,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1, + 0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05, + 0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18, + 0x0C,0x49,0x41,0x18,0x28,0x19,0x07,0xF0,0x69,0xFB,0x64,0x1C,0x70,0x7E,0xA0,0x42, + 0xF3,0xDA,0x70,0x7E,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7E, + 0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x04,0x00,0x20, + 0x40,0x00,0x00,0x20,0xAA,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07, + 0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7E,0xE4,0x00,0xE6,0x18,0x25,0x24,0x64,0x01, + 0x36,0x19,0xB5,0x74,0x56,0x7E,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x82, + 0x56,0x7E,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0xF5,0x82,0x55,0x7E,0xED,0x00, + 0xED,0x18,0x2D,0x19,0x29,0x76,0x55,0x7E,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19, + 0x59,0x76,0x51,0x7E,0x49,0x1C,0x51,0x76,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x76,0x70,0xBC,0x70,0x47,0x01,0x20, + 0xFA,0xE7,0x00,0x00,0x40,0x00,0x00,0x20,0xA0,0x04,0x00,0x20,0xF0,0x00,0x2D,0xE9, + 0x70,0x60,0x9F,0xE5,0x01,0xC1,0x81,0xE0,0x8C,0xC0,0x86,0xE0,0x81,0x40,0x86,0xE0, + 0x8C,0x21,0xCC,0xE5,0xB4,0x5F,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x05,0x05,0xE0,0xA5,0x79,0xA0,0xE1,0x01,0x5C,0x8C,0xE2,0x01,0x4C,0x84,0xE2, + 0xBE,0x78,0xC5,0xE1,0xB6,0x40,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x04,0x04,0xE0,0xA4,0x49,0xA0,0xE1,0xB0,0x49,0xC5,0xE1,0x01,0x40,0x86,0xE0, + 0x38,0x41,0xD4,0xE5,0x8D,0x41,0xCC,0xE5,0x92,0x31,0xCC,0xE5,0x01,0x20,0xC0,0xE7, + 0x02,0x00,0x86,0xE0,0xA3,0x12,0xC0,0xE5,0x00,0x10,0xA0,0xE3,0x9A,0x12,0xC0,0xE5, + 0xF0,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x08,0x4A,0x07,0x49, + 0x12,0x78,0x08,0x68,0x0F,0x23,0x40,0x1C,0x12,0x07,0x12,0x0A,0x9B,0x06,0xD2,0x18, + 0x00,0x03,0x00,0x0B,0x02,0x43,0x0A,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xF4,0x05,0x00,0x20,0x78,0x47,0xC0,0x46,0xF1,0x4F,0x2D,0xE9,0xE8,0x14,0x9F,0xE5, + 0x38,0xD0,0x4D,0xE2,0xB0,0x00,0xD1,0xE5,0xB1,0x90,0xD1,0xE5,0xB3,0xA0,0xD1,0xE5, + 0x00,0x00,0x8D,0xE5,0xD4,0x04,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xB0,0x00,0xD0,0xE1, + 0x02,0x0B,0x10,0xE3,0x3C,0xD0,0x8D,0x02,0xF0,0x4F,0xBD,0x08,0x1E,0xFF,0x2F,0x01, + 0x38,0x00,0x9D,0xE5,0x00,0xB0,0xA0,0xE3,0x01,0x00,0x50,0xE3,0x02,0x00,0xA0,0x13, + 0x04,0x00,0x8D,0xE5,0x38,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x3C,0xD0,0x8D,0xD2, + 0xF0,0x4F,0xBD,0xD8,0x1E,0xFF,0x2F,0xD1,0x01,0x00,0x49,0xE2,0x34,0x00,0x8D,0xE5, + 0x0A,0x01,0xA0,0xE1,0xCD,0x20,0xA0,0xE3,0x92,0x00,0x00,0xE0,0x20,0x05,0xA0,0xE1, + 0x30,0x00,0x8D,0xE5,0x8A,0x00,0x8A,0xE0,0x92,0x00,0x00,0xE0,0x20,0x05,0xA0,0xE1, + 0x2C,0x00,0x8D,0xE5,0x8A,0x00,0xA0,0xE1,0x92,0x00,0x00,0xE0,0x20,0x05,0xA0,0xE1, + 0x28,0x00,0x8D,0xE5,0x9A,0x02,0x00,0xE0,0x20,0x05,0xA0,0xE1,0x24,0x00,0x8D,0xE5, + 0x04,0x10,0x9D,0xE5,0x02,0x02,0xA0,0xE3,0x01,0x01,0x80,0xE0,0x20,0x00,0x8D,0xE5, + 0x00,0x70,0x90,0xE5,0x07,0x01,0xA0,0xE1,0x01,0x01,0x17,0xE3,0x20,0x4E,0xA0,0xE1, + 0x17,0x00,0x00,0x1A,0x28,0x04,0x9F,0xE5,0x00,0x10,0xE0,0xE3,0x04,0x01,0x80,0xE0, + 0xB0,0x10,0xC0,0xE1,0xB2,0x10,0xC0,0xE1,0x18,0x04,0x9F,0xE5,0x00,0x20,0xA0,0xE3, + 0x04,0x01,0x80,0xE0,0xB0,0x10,0xC0,0xE1,0xB2,0x10,0xC0,0xE1,0x08,0x04,0x9F,0xE5, + 0x0C,0x14,0x9F,0xE5,0x84,0x00,0x80,0xE0,0xB0,0x20,0xC0,0xE1,0xFC,0x03,0x9F,0xE5, + 0x04,0x31,0x81,0xE0,0x04,0x20,0xC0,0xE7,0x02,0x00,0xA0,0xE1,0x00,0x11,0x83,0xE0, + 0xB0,0x20,0xC1,0xE1,0x01,0x00,0x50,0xE2,0xB2,0x20,0xC1,0xE1,0xFA,0xFF,0xFF,0x5A, + 0xE7,0x00,0x00,0xEA,0xC8,0x03,0x9F,0xE5,0x04,0x81,0x80,0xE0,0xF0,0x30,0xD8,0xE1, + 0x00,0x00,0x53,0xE3,0x09,0x00,0x00,0xAA,0x07,0x03,0xA0,0xE1,0xB4,0x23,0x9F,0xE5, + 0x20,0x0B,0xA0,0xE1,0x3F,0x1B,0xC7,0xE3,0xB0,0x00,0xC8,0xE1,0x04,0x21,0x82,0xE0, + 0xB2,0x10,0xC8,0xE1,0xB0,0x00,0xC2,0xE1,0xB2,0x10,0xC2,0xE1,0xD8,0x00,0x00,0xEA, + 0x34,0x10,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00,0x51,0xE3,0x0A,0x00,0x00,0xDA, + 0x8C,0x13,0x9F,0xE5,0x04,0x21,0x81,0xE0,0x00,0x11,0x82,0xE0,0xB4,0xC0,0xD1,0xE1, + 0x01,0x00,0x80,0xE2,0xB0,0xC0,0xC1,0xE1,0xB6,0xC0,0xD1,0xE1,0xB2,0xC0,0xC1,0xE1, + 0x34,0x10,0x9D,0xE5,0x01,0x00,0x50,0xE1,0xF6,0xFF,0xFF,0xBA,0x07,0x03,0xA0,0xE1, + 0x20,0x1B,0x63,0xE0,0x1C,0x00,0x8D,0xE5,0x54,0x03,0x9F,0xE5,0x00,0x00,0x59,0xE3, + 0x04,0x31,0x80,0xE0,0x09,0x01,0x83,0xE0,0xB4,0x10,0x40,0xE1,0x07,0x1B,0xA0,0xE1, + 0x21,0x1B,0xA0,0xE1,0x18,0x10,0x8D,0xE5,0xB2,0x20,0xD8,0xE1,0x02,0x10,0x41,0xE0, + 0xB2,0x10,0x40,0xE1,0x00,0x00,0xA0,0xE3,0x00,0x50,0xA0,0xE1,0x00,0x10,0xA0,0xE1, + 0x07,0x00,0x00,0xDA,0x01,0x21,0x83,0xE0,0xF0,0xC0,0xD2,0xE1,0xF2,0x20,0xD2,0xE1, + 0x01,0x10,0x81,0xE2,0x09,0x00,0x51,0xE1,0x0C,0x00,0x80,0xE0,0x02,0x50,0x85,0xE0, + 0xF7,0xFF,0xFF,0xBA,0x09,0x10,0xA0,0xE1,0x38,0xFE,0xFF,0xEB,0x00,0x60,0xA0,0xE1, + 0x09,0x10,0xA0,0xE1,0x05,0x00,0xA0,0xE1,0x34,0xFE,0xFF,0xEB,0xC8,0x22,0x9F,0xE5, + 0x00,0x00,0x56,0xE3,0xB2,0x10,0xD2,0xE5,0x00,0x60,0x66,0xD2,0x01,0x00,0x56,0xE1, + 0x0C,0x00,0x00,0xAA,0x00,0x00,0x50,0xE3,0x00,0x00,0x60,0xD2,0x01,0x00,0x50,0xE1, + 0x08,0x00,0x00,0xAA,0xB0,0x02,0x9F,0xE5,0x84,0x10,0x80,0xE0,0xB4,0x00,0xD2,0xE5, + 0xF0,0x30,0xD1,0xE1,0x00,0xC0,0x4A,0xE0,0x0C,0x00,0x53,0xE1,0x03,0x00,0x80,0xB0, + 0xB0,0x00,0xC1,0xB1,0x05,0x00,0x00,0xEA,0x8C,0x02,0x9F,0xE5,0xB5,0x30,0xD2,0xE5, + 0x84,0x00,0x80,0xE0,0xB0,0x10,0xD0,0xE1,0x03,0x10,0x41,0xE0,0xB0,0x10,0xC0,0xE1, + 0x74,0x02,0x9F,0xE5,0x84,0x00,0x80,0xE0,0xF0,0x10,0xD0,0xE1,0x00,0x00,0x51,0xE3, + 0x00,0x10,0xA0,0xD3,0xB0,0x10,0xC0,0xD1,0xF0,0x00,0xD0,0xE1,0x0A,0x00,0x50,0xE1, + 0x58,0x32,0x9F,0xA5,0x05,0x10,0xA0,0xA3,0x04,0x10,0xC3,0xA7,0x1B,0x00,0x00,0xAA, + 0x30,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1,0x40,0x32,0x9F,0xD5,0x04,0x10,0xA0,0xD3, + 0x04,0x10,0xC3,0xD7,0x15,0x00,0x00,0xDA,0x2C,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0x28,0x32,0x9F,0xD5,0x03,0x10,0xA0,0xD3,0x04,0x10,0xC3,0xD7,0x0F,0x00,0x00,0xDA, + 0x28,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1,0x10,0x32,0x9F,0xD5,0x02,0x10,0xA0,0xD3, + 0x04,0x10,0xC3,0xD7,0x09,0x00,0x00,0xDA,0x24,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0xF8,0x31,0x9F,0xD5,0x01,0x10,0xA0,0xD3,0x04,0x10,0xC3,0xD7,0x03,0x00,0x00,0xDA, + 0x00,0x00,0x50,0xE3,0xE4,0x31,0x9F,0x05,0x00,0x10,0xA0,0x03,0x04,0x10,0xC3,0x07, + 0xD0,0x11,0x9F,0xE5,0x1C,0xC0,0x9D,0xE5,0x04,0x11,0x81,0xE0,0x14,0x10,0x8D,0xE5, + 0xF0,0x30,0xD1,0xE1,0x10,0x30,0x8D,0xE5,0xF2,0x10,0xD1,0xE1,0x2C,0x5B,0x63,0xE0, + 0x18,0x30,0x9D,0xE5,0x0C,0x10,0x8D,0xE5,0x01,0x60,0x43,0xE0,0xAC,0x11,0x9F,0xE5, + 0xB6,0x20,0xD2,0xE5,0x04,0x10,0xD1,0xE7,0x02,0x00,0x51,0xE1,0x1B,0x00,0x00,0x3A, + 0x00,0x00,0x55,0xE3,0x00,0x40,0xA0,0x03,0x0A,0x00,0x00,0x0A,0x00,0x10,0x9D,0xE5, + 0x00,0x00,0x65,0xD2,0x05,0x00,0xA0,0xC1,0x01,0x00,0x50,0xE1,0x01,0x40,0xA0,0xB3, + 0x04,0x00,0x00,0xBA,0x00,0x00,0x55,0xE3,0x00,0x00,0x65,0xD2,0x05,0x00,0xA0,0xC1, + 0xD6,0xFD,0xFF,0xEB,0x00,0x40,0xA0,0xE1,0x00,0x00,0x56,0xE3,0x00,0x00,0xA0,0x03, + 0x2C,0x00,0x00,0x0A,0x00,0x10,0x9D,0xE5,0x00,0x00,0x66,0xD2,0x06,0x00,0xA0,0xC1, + 0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0xB3,0x26,0x00,0x00,0xBA,0x00,0x00,0x56,0xE3, + 0x00,0x00,0x66,0xD2,0x06,0x00,0xA0,0xC1,0xC8,0xFD,0xFF,0xEB,0x21,0x00,0x00,0xEA, + 0x19,0x1E,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x28,0x11,0x9F,0xE5,0x08,0x00,0x8D,0xE5, + 0x91,0x20,0xC0,0xE0,0xC0,0x10,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x0A,0x10,0xA0,0xE1, + 0xBE,0xFD,0xFF,0xEB,0x00,0x00,0x55,0xE3,0x64,0x10,0x60,0xE2,0x00,0x00,0x65,0xD2, + 0x05,0x00,0xA0,0xC1,0x91,0x00,0x00,0xE0,0xFC,0x10,0x9F,0xE5,0x91,0x20,0xC0,0xE0, + 0xC0,0x12,0xA0,0xE1,0xC0,0x4F,0x41,0xE0,0x08,0x00,0x9D,0xE5,0xE4,0x10,0x9F,0xE5, + 0x91,0x20,0xC0,0xE0,0xC0,0x10,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x0A,0x10,0xA0,0xE1, + 0xAE,0xFD,0xFF,0xEB,0x00,0x00,0x56,0xE3,0x64,0x10,0x60,0xE2,0x00,0x00,0x66,0xD2, + 0x06,0x00,0xA0,0xC1,0x91,0x00,0x00,0xE0,0xBC,0x10,0x9F,0xE5,0x91,0x20,0xC0,0xE0, + 0xC0,0x12,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x10,0x10,0x9D,0xE5,0x00,0x00,0x55,0xE3, + 0x04,0x10,0x41,0xB0,0x0C,0x20,0x9D,0xE5,0x04,0x10,0x81,0xA0,0x00,0x00,0x56,0xE3, + 0x00,0x00,0x42,0xB0,0x02,0x00,0x80,0xA0,0x1C,0x20,0x9D,0xE5,0x3F,0x33,0xE0,0xE3, + 0x22,0x2B,0xA0,0xE1,0xB0,0x20,0xC8,0xE1,0x18,0x20,0x9D,0xE5,0xB2,0x20,0xC8,0xE1, + 0x14,0x20,0x9D,0xE5,0xB0,0x10,0xC2,0xE1,0x14,0x20,0x9D,0xE5,0x01,0x18,0x03,0xE0, + 0xB2,0x00,0xC2,0xE1,0x03,0x24,0xC7,0xE3,0xFF,0x28,0xC2,0xE3,0x02,0x10,0x81,0xE1, + 0x03,0x15,0x01,0xE0,0x43,0x08,0x00,0xE0,0x01,0x00,0x80,0xE1,0x20,0x10,0x9D,0xE5, + 0x00,0x00,0x81,0xE5,0x04,0x00,0x9D,0xE5,0x01,0xB0,0x8B,0xE2,0x01,0x00,0x80,0xE2, + 0x04,0x00,0x8D,0xE5,0x38,0x00,0x9D,0xE5,0x00,0x00,0x5B,0xE1,0xEF,0xFE,0xFF,0xBA, + 0x3C,0xD0,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x93,0x00,0x00, + 0x78,0x06,0x00,0x20,0x6C,0x09,0x00,0x20,0x90,0x09,0x00,0x20,0x50,0x09,0x00,0x20, + 0x62,0x09,0x00,0x20,0xB4,0x09,0x00,0x20,0x67,0x66,0x66,0x66,0x1F,0x85,0xEB,0x51, + 0x12,0x4A,0x29,0x21,0x49,0x01,0x70,0xB4,0x53,0x18,0x05,0x21,0xD4,0x88,0x09,0x02, + 0x80,0x25,0x51,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x46,0x7B,0x0E,0x83,0xC6,0x89, + 0x4E,0x83,0x06,0x8A,0x8E,0x83,0x40,0x8A,0xC8,0x83,0x09,0x48,0x20,0x30,0x00,0x89, + 0x2C,0x43,0x18,0x80,0x06,0xE0,0x00,0x20,0x08,0x83,0x48,0x83,0x88,0x83,0xC8,0x83, + 0xAC,0x43,0x18,0x80,0xD4,0x80,0x70,0xBC,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x80,0x93,0x00,0x00,0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A, + 0x00,0x28,0x09,0xD1,0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x01,0xF0,0xBE,0xFF, + 0x64,0x1E,0xFB,0xD2,0xFF,0x24,0x12,0xE0,0x06,0xF0,0x2C,0xF9,0x01,0xF0,0x5A,0xFE, + 0x01,0xF0,0xA2,0xFE,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x05,0xF0,0x1F,0xF8,0x04,0x00, + 0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20, + 0x07,0xF0,0x24,0xFA,0x02,0x20,0x07,0xF0,0x11,0xFA,0x12,0x49,0xE8,0x68,0xC8,0x61, + 0x28,0x69,0xC8,0x61,0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B, + 0x0F,0x48,0x02,0xE0,0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5, + 0x48,0x68,0x80,0x07,0xFC,0xD5,0x01,0xF0,0xA9,0xFF,0x01,0x20,0x00,0xF0,0x6E,0xF8, + 0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFE,0xF7,0xF2,0xFF, + 0x1C,0x48,0x03,0x27,0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0xB6,0xFB,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0xB8,0xFB, + 0x16,0x49,0x40,0x22,0x01,0xA8,0xFF,0xF7,0x97,0xFB,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x07,0xF0,0xF6,0xFA,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x65,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0x68,0x01,0x8D,0xE5,0xB4,0x07,0x9F,0xE5,0xB4,0x27,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xB8,0x21,0xD2,0xE1,0x78,0x10,0xD0,0xE5,0x77,0x70,0xD0,0xE5,0xA4,0x97,0x9F,0xE5, + 0x02,0x10,0x81,0xE0,0xFF,0x80,0x01,0xE2,0x79,0x10,0xD0,0xE5,0x00,0x50,0xE0,0xE3, + 0x00,0xB0,0xA0,0xE3,0x08,0x10,0x8D,0xE5,0x7A,0x00,0xD0,0xE5,0x01,0x60,0xA0,0xE3, + 0x04,0x00,0x8D,0xE5,0x8A,0x01,0xD9,0xE5,0x04,0x40,0xD9,0xE5,0x01,0x00,0x50,0xE3, + 0x0E,0x00,0x00,0xBA,0x06,0x01,0x86,0xE0,0x80,0x00,0x89,0xE0,0x40,0x12,0xD0,0xE5, + 0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A,0x02,0x0C,0x80,0xE2,0x46,0x00,0x80,0xE2, + 0x1C,0x0C,0x00,0xEB,0x00,0x00,0x50,0xE3,0x01,0x00,0x8B,0x12,0xFF,0xB0,0x00,0x12, + 0x8A,0x01,0xD9,0xE5,0x01,0x60,0x86,0xE2,0x06,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA, + 0x34,0x07,0x9F,0xE5,0x00,0xA0,0xA0,0xE3,0xBC,0x3B,0xD0,0xE1,0xB0,0x2C,0xD0,0xE1, + 0x01,0x60,0xA0,0xE3,0x02,0x10,0x43,0xE0,0x00,0x00,0x51,0xE3,0x03,0x10,0x42,0xD0, + 0x01,0x28,0xA0,0xE1,0xBE,0x1B,0xD0,0xE1,0xB2,0x3C,0xD0,0xE1,0x22,0x28,0xA0,0xE1, + 0xBB,0xA2,0xC9,0xE5,0x03,0x00,0x41,0xE0,0x00,0x00,0x50,0xE3,0x01,0x00,0x43,0xD0, + 0x00,0x00,0x5B,0xE3,0x00,0x08,0xA0,0xE1,0x28,0x00,0x52,0x13,0x20,0x08,0xA0,0xE1, + 0x06,0x00,0x00,0x2A,0x32,0x00,0x50,0xE3,0xBB,0x62,0xC9,0x35,0x03,0x00,0x00,0x3A, + 0x64,0x00,0x50,0xE3,0x03,0x00,0xA0,0x23,0x02,0x00,0xA0,0x33,0xBB,0x02,0xC9,0xE5, + 0xBA,0x02,0xD9,0xE5,0x00,0x00,0x50,0xE3,0x0B,0x00,0x00,0x1A,0xBB,0x02,0xD9,0xE5, + 0x01,0x00,0x50,0xE3,0x05,0x00,0x87,0x02,0xFF,0x70,0x00,0x02,0x06,0x00,0x00,0x0A, + 0x02,0x00,0x50,0xE3,0x0A,0x00,0x87,0x02,0x02,0x00,0x00,0x0A,0x03,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x1A,0x0F,0x00,0x87,0xE2,0xFF,0x70,0x00,0xE2,0x09,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0x44,0xFD,0xFF,0xEB,0xB6,0x00,0xD9,0xE1, + 0x78,0xB6,0x9F,0xE5,0x46,0x0F,0x10,0xE3,0x04,0x00,0x00,0x0A,0xBC,0x04,0x00,0xEB, + 0x00,0x60,0xCB,0xE5,0x65,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x50,0x06,0x9F,0xE5,0x00,0xA0,0xCB,0xE5,0x8B,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x40,0x16,0x9F,0x15,0x01,0x00,0x40,0x12,0x8B,0x01,0xC1,0x15,0x00,0x00,0x54,0xE3, + 0x04,0x00,0x00,0x1A,0x2C,0x06,0x9F,0xE5,0x89,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x7C,0x01,0x00,0x0A,0x17,0x00,0x00,0xEA,0x18,0x96,0x9F,0xE5,0x89,0x01,0xD9,0xE5, + 0x00,0x00,0x50,0xE3,0x13,0x00,0x00,0x1A,0x14,0x06,0x9F,0xE5,0x5A,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x25,0xFD,0xFF,0xEB,0x8B,0x01,0xD9,0xE5,0x00,0x00,0x50,0xE3, + 0x70,0x01,0x00,0x1A,0x01,0x00,0x54,0xE3,0x01,0x50,0xA0,0xE3,0x07,0x00,0x00,0xBA, + 0xFF,0x20,0x05,0xE2,0xFF,0x10,0x05,0xE2,0x14,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0x7D,0xFD,0xFF,0xEB,0x01,0x50,0x85,0xE2,0x04,0x00,0x55,0xE1,0xF7,0xFF,0xFF,0xDA, + 0x88,0x41,0xC9,0xE5,0x63,0x01,0x00,0xEA,0x09,0x20,0xA0,0xE3,0x01,0x10,0xA0,0xE3, + 0x15,0x0E,0x8D,0xE2,0x11,0xFD,0xFF,0xEB,0x01,0x00,0x87,0xE2,0x90,0x01,0x8D,0xE5, + 0x02,0x00,0x88,0xE2,0x8C,0x01,0x8D,0xE5,0xA8,0x05,0x9F,0xE5,0x01,0x60,0xA0,0xE3, + 0x88,0x01,0x8D,0xE5,0x09,0x00,0x40,0xE2,0x84,0x01,0x8D,0xE5,0x08,0x70,0xA0,0xE3, + 0x0C,0x80,0x8D,0xE2,0x87,0x01,0x87,0xE0,0x0C,0x10,0x8D,0xE2,0x00,0x01,0x81,0xE0, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xE0,0xE3,0x00,0xFD,0xFF,0xEB,0x01,0x70,0x57,0xE2, + 0xF7,0xFF,0xFF,0x5A,0x06,0x00,0xA0,0xE1,0x46,0x06,0x00,0xEB,0x01,0x00,0x54,0xE3, + 0x00,0x80,0xA0,0xE1,0x01,0x90,0xA0,0xE3,0x47,0x00,0x00,0xBA,0x44,0x05,0x9F,0xE5, + 0x08,0xA0,0xA0,0xE1,0x8A,0x11,0xD0,0xE5,0x01,0x70,0xA0,0xE3,0x01,0x00,0x51,0xE3, + 0x3E,0x00,0x00,0xBA,0x89,0x00,0x80,0xE0,0x80,0x01,0x8D,0xE5,0x01,0x0C,0x80,0xE2, + 0x7C,0x01,0x8D,0xE5,0x89,0x01,0x89,0xE0,0x0C,0x10,0x8D,0xE2,0x78,0x01,0x8D,0xE5, + 0x00,0x01,0x81,0xE0,0x74,0x01,0x8D,0xE5,0x08,0x15,0x9F,0xE5,0x07,0x01,0x87,0xE0, + 0x80,0xB0,0x81,0xE0,0x40,0x02,0xDB,0xE5,0x00,0x00,0x50,0xE3,0x2A,0x00,0x00,0x0A, + 0x02,0x0C,0x8B,0xE2,0x46,0x00,0x80,0xE2,0x70,0x01,0x8D,0xE5,0x81,0x0B,0x00,0xEB, + 0x06,0x00,0x90,0xE1,0x04,0x00,0x00,0x0A,0x70,0x01,0x9D,0xE5,0x7D,0x0B,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x00,0x00,0x56,0x13,0x1F,0x00,0x00,0x0A,0x80,0x01,0x9D,0xE5, + 0xCD,0x10,0xA0,0xE3,0xB4,0x0F,0xD0,0xE1,0x33,0x1B,0x81,0xE2,0x02,0x3C,0x8B,0xE2, + 0x91,0x00,0x00,0xE0,0xB2,0x24,0xD3,0xE1,0xA0,0x09,0xA0,0xE1,0xB4,0x34,0xD3,0xE1, + 0x00,0x10,0x42,0xE0,0x00,0x00,0x51,0xE3,0x02,0x10,0x40,0xD0,0x7C,0x01,0x9D,0xE5, + 0xCD,0x20,0xA0,0xE3,0xB6,0x00,0xD0,0xE1,0x33,0x2B,0x82,0xE2,0x92,0x00,0x00,0xE0, + 0xA0,0x29,0xA0,0xE1,0x02,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3,0x03,0x00,0x42,0xD0, + 0x91,0x01,0x02,0xE0,0x00,0x10,0xA0,0xE1,0x91,0x20,0x20,0xE0,0x0A,0x00,0x50,0xE1, + 0x03,0x00,0x00,0xAA,0x78,0x11,0x9D,0xE5,0x0C,0x20,0x8D,0xE2,0x00,0xA0,0xA0,0xE1, + 0x01,0x71,0x82,0xE7,0x74,0x11,0x9D,0xE5,0x07,0x01,0x81,0xE7,0x44,0x04,0x9F,0xE5, + 0x01,0x70,0x87,0xE2,0x8A,0x01,0xD0,0xE5,0x07,0x00,0x50,0xE1,0xC9,0xFF,0xFF,0xAA, + 0x01,0x90,0x89,0xE2,0x04,0x00,0x59,0xE1,0xB7,0xFF,0xFF,0xDA,0x01,0x00,0xA0,0xE3, + 0x01,0x00,0x54,0xE3,0x6C,0x01,0x8D,0xE5,0x7D,0x00,0x00,0xBA,0x0C,0x70,0x8D,0xE2, + 0x01,0xC0,0xA0,0xE3,0x01,0x00,0x54,0xE3,0x08,0x30,0xA0,0xE1,0x0C,0x00,0xA0,0xE1, + 0x72,0x00,0x00,0xBA,0x57,0x1F,0x8D,0xE2,0x00,0x10,0xD1,0xE7,0x00,0x00,0x51,0xE3, + 0x0B,0x00,0x00,0x1A,0x80,0x11,0x80,0xE0,0x01,0x21,0x97,0xE7,0x01,0x91,0x87,0xE0, + 0x02,0x11,0x99,0xE7,0x03,0x00,0x51,0xE1,0x05,0x00,0x00,0xAA,0x00,0x00,0x51,0xE3, + 0x00,0x00,0x52,0xA3,0x02,0x00,0x00,0xBA,0x00,0x50,0xA0,0xE1,0x01,0x30,0xA0,0xE1, + 0x00,0xC0,0xA0,0xE3,0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1,0xEC,0xFF,0xFF,0xDA, + 0x00,0x00,0x5C,0xE3,0x5D,0x00,0x00,0x1A,0x68,0x01,0x9D,0xE5,0x85,0x91,0x85,0xE0, + 0x01,0x00,0x80,0xE2,0x68,0x01,0x8D,0xE5,0x09,0x01,0x97,0xE7,0x94,0xB3,0x9F,0xE5, + 0x00,0x01,0x80,0xE0,0x80,0x00,0x8B,0xE0,0x01,0x1C,0x80,0xE2,0x05,0x01,0x85,0xE0, + 0x80,0xA0,0x8B,0xE0,0xE6,0x10,0x81,0xE2,0x63,0x0F,0x8A,0xE2,0x0A,0x20,0xA0,0xE3, + 0x84,0xFC,0xFF,0xEB,0x85,0x00,0x8B,0xE0,0xB4,0x1F,0xD0,0xE1,0xCD,0x20,0xA0,0xE3, + 0x33,0x2B,0x82,0xE2,0x92,0x01,0x01,0xE0,0xA1,0x29,0xA0,0xE1,0x01,0x1C,0x8A,0xE2, + 0x01,0x0C,0x80,0xE2,0xBE,0x28,0xC1,0xE1,0xB6,0x00,0xD0,0xE1,0xCD,0x20,0xA0,0xE3, + 0x33,0x2B,0x82,0xE2,0x92,0x00,0x00,0xE0,0xA0,0x09,0xA0,0xE1,0xB0,0x09,0xC1,0xE1, + 0x05,0x00,0x8B,0xE0,0x38,0x01,0xD0,0xE5,0x8D,0x01,0xCA,0xE5,0x92,0x01,0xDA,0xE5, + 0x90,0x11,0x9D,0xE5,0x01,0x00,0x50,0xE1,0x01,0x00,0x80,0x32,0x92,0x01,0xCA,0x35, + 0x92,0x01,0xDA,0xE5,0x13,0x00,0x50,0xE3,0x06,0x00,0x00,0x9A,0xCD,0x10,0xA0,0xE3, + 0x90,0x01,0x01,0xE0,0x8C,0x21,0x9D,0xE5,0x21,0x16,0xA0,0xE1,0x02,0x00,0x51,0xE1, + 0x14,0x00,0x80,0x32,0x92,0x01,0xCA,0x35,0x8C,0x01,0xDA,0xE5,0x57,0xEF,0x8D,0xE2, + 0x01,0x00,0x54,0xE3,0x05,0x00,0xCE,0xE7,0x88,0x11,0x9D,0xE5,0x01,0x50,0xC0,0xE7, + 0x8C,0x11,0xDA,0xE5,0x84,0x21,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x02,0x00,0xC1,0xE7, + 0x09,0x11,0x97,0xE7,0x15,0x2E,0x8D,0xE2,0x01,0x00,0xC2,0xE7,0x01,0x00,0xA0,0xE3, + 0x19,0x00,0x00,0xBA,0xAC,0x12,0x9F,0xE5,0x8A,0xC1,0xD1,0xE5,0x09,0x21,0x97,0xE7, + 0x80,0xA1,0x80,0xE0,0x00,0x10,0xE0,0xE3,0x0A,0xB1,0x87,0xE0,0x02,0x11,0x8B,0xE7, + 0x00,0x10,0xDE,0xE7,0x08,0x30,0xA0,0xE1,0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0x1A, + 0x01,0x00,0x5C,0xE3,0x01,0x10,0xA0,0xE3,0x08,0x00,0x00,0xBA,0x01,0x21,0x9B,0xE7, + 0x01,0x00,0x72,0xE3,0x02,0x00,0x00,0xDA,0x03,0x00,0x52,0xE1,0x02,0x30,0xA0,0xB1, + 0x0A,0x11,0x87,0xB7,0x01,0x10,0x81,0xE2,0x01,0x00,0x5C,0xE1,0xF6,0xFF,0xFF,0xAA, + 0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1,0xE7,0xFF,0xFF,0xDA,0x44,0x02,0x9F,0xE5, + 0x68,0x11,0x9D,0xE5,0x8A,0x01,0xD0,0xE5,0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA, + 0x6C,0x01,0x9D,0xE5,0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1,0x6C,0x01,0x8D,0xE5, + 0x82,0xFF,0xFF,0xDA,0x06,0x00,0xB0,0xE1,0x01,0x10,0x46,0xE2,0xFF,0x60,0x01,0xE2, + 0x21,0xFF,0xFF,0x1A,0x0C,0x82,0x9F,0xE5,0x01,0x60,0xA0,0xE3,0x8A,0x01,0xD8,0xE5, + 0x00,0x70,0xA0,0xE3,0x06,0xA0,0xA0,0xE1,0x01,0x00,0x50,0xE3,0x43,0x00,0x00,0xBA, + 0x15,0x0E,0x8D,0xE2,0x06,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3,0x3B,0x00,0x00,0x0A, + 0x06,0x01,0x86,0xE0,0x80,0x50,0x88,0xE0,0x40,0x12,0xD5,0xE5,0x84,0x01,0x9D,0xE5, + 0x0A,0x90,0x84,0xE0,0x00,0x10,0xD1,0xE7,0x08,0x00,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0x23,0x00,0x00,0x2A,0x08,0x00,0x59,0xE3,0x21,0x00,0x00,0xCA,0x02,0x0C,0x85,0xE2, + 0x46,0x00,0x80,0xE2,0xB3,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3,0x1C,0x00,0x00,0x0A, + 0x40,0x02,0xD5,0xE5,0x84,0x11,0x9D,0xE5,0x84,0x21,0x9D,0xE5,0x01,0x10,0xD0,0xE7, + 0x01,0x10,0x81,0xE2,0x02,0x10,0xC0,0xE7,0x09,0x01,0x89,0xE0,0x80,0xB0,0x88,0xE0, + 0x09,0x1D,0x85,0xE2,0x63,0x0F,0x8B,0xE2,0x0A,0x20,0xA0,0xE3,0x05,0xFC,0xFF,0xEB, + 0xED,0x01,0xD5,0xE5,0x57,0x1F,0x8D,0xE2,0x01,0xA0,0x8A,0xE2,0x93,0x01,0xCB,0xE5, + 0xEE,0x01,0xD5,0xE5,0x01,0x70,0x87,0xE2,0x94,0x01,0xCB,0xE5,0x40,0x02,0xD5,0xE5, + 0x09,0x00,0xC1,0xE7,0x88,0x11,0x9D,0xE5,0x01,0x90,0xC0,0xE7,0x58,0x01,0x9F,0xE5, + 0x00,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x01,0x10,0xA0,0x03,0x00,0x10,0xC0,0x05, + 0x0E,0x00,0x00,0xEA,0x02,0x0C,0x85,0xE2,0x46,0x00,0x80,0xE2,0x91,0x0A,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x09,0x00,0x00,0x0A,0x01,0x00,0xA0,0xE3,0xB9,0x02,0xC8,0xE5, + 0x46,0x02,0xD5,0xE5,0x13,0x00,0x50,0xE3,0x04,0x00,0x00,0x9A,0x89,0x01,0xD8,0xE5, + 0x01,0x00,0x50,0xE3,0xB6,0x00,0xD8,0x01,0x04,0x00,0x80,0x03,0xB6,0x00,0xC8,0x01, + 0x8A,0x01,0xD8,0xE5,0x01,0x60,0x86,0xE2,0x06,0x00,0x50,0xE1,0xBB,0xFF,0xFF,0xAA, + 0xB6,0x00,0xD8,0xE1,0x04,0x00,0x10,0xE3,0x03,0x00,0x00,0x0A,0x04,0x10,0x9D,0xE5, + 0x04,0x00,0xC0,0xE3,0x8B,0x11,0xC8,0xE5,0xB6,0x00,0xC8,0xE1,0x01,0x00,0x54,0xE3, + 0x01,0x50,0xA0,0xE3,0x21,0x00,0x00,0xBA,0x57,0x6F,0x8D,0xE2,0x01,0x90,0xA0,0xE3, + 0x05,0x00,0xD6,0xE7,0x00,0x00,0x50,0xE3,0x0F,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3, + 0x00,0x10,0x88,0xE0,0xA3,0x22,0xD1,0xE5,0x00,0x00,0x52,0xE3,0xAC,0x12,0xD1,0x05, + 0x00,0x00,0x51,0x03,0x05,0x00,0x00,0x1A,0xFF,0x20,0x00,0xE2,0xFF,0x10,0x05,0xE2, + 0x01,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0x27,0xFC,0xFF,0xEB,0x02,0x00,0x00,0xEA, + 0x01,0x00,0x80,0xE2,0x09,0x00,0x50,0xE3,0xF0,0xFF,0xFF,0xBA,0x8B,0x01,0xD8,0xE5, + 0x00,0x00,0x50,0xE3,0x06,0x00,0x00,0x0A,0x05,0x01,0x85,0xE0,0x80,0xA0,0x88,0xE0, + 0x01,0x0C,0x8A,0xE2,0x92,0x00,0x80,0xE2,0x5A,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3, + 0x92,0x91,0xCA,0x05,0x01,0x50,0x85,0xE2,0x04,0x00,0x55,0xE1,0xDF,0xFF,0xFF,0xDA, + 0x07,0x00,0x84,0xE0,0x88,0x01,0xC8,0xE5,0x28,0x00,0x9F,0xE5,0x5A,0x20,0xA0,0xE3, + 0x88,0x11,0xD0,0xE5,0x8A,0x11,0xC0,0xE5,0x63,0x1F,0x80,0xE2,0x09,0x0D,0x80,0xE2, + 0xAC,0xFB,0xFF,0xEB,0x65,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x78,0x06,0x00,0x20,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0x40,0x02,0x00,0x20, + 0x67,0x05,0x00,0x20,0x26,0x02,0x00,0x20,0xE3,0x02,0x00,0x20,0xF4,0x05,0x00,0x20, + 0xF1,0xB5,0x38,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x36,0x48,0x41,0x7F, + 0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D, + 0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20, + 0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0xFE,0xF8,0x01,0xF0,0xAC,0xF9, + 0x00,0x24,0x27,0x00,0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0,0x0D,0xF9,0x00,0x28, + 0x28,0xD0,0x0E,0x21,0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x06,0xF0,0x3C,0xFB,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18, + 0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x06,0xF0,0x2E,0xFB,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD, + 0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3,0x7F,0x1C,0x15,0x2F, + 0xC8,0xD3,0x20,0x00,0xFF,0x38,0x27,0x38,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42, + 0xB2,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90, + 0xEC,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00,0xF0,0xB5,0x7B,0x4A, + 0xFF,0xB0,0xBC,0xB0,0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18,0xB8,0x90,0x48,0x42, + 0xB7,0x90,0x77,0x48,0x77,0x4E,0x07,0x7B,0x02,0xA8,0x01,0x90,0x76,0x48,0xBA,0x90, + 0x00,0x7D,0x00,0x28,0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90,0x73,0x4A,0x00,0x21, + 0x30,0x00,0xFE,0xF7,0xB5,0xFE,0x00,0x25,0x00,0x24,0x6F,0x48,0x20,0x38,0x01,0x7D, + 0xC9,0x07,0x14,0xD0,0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0,0xBD,0x42,0x0E,0xD1, + 0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42, + 0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0xB7,0x9A, + 0x21,0x00,0x28,0x00,0x06,0xF0,0xC4,0xFA,0x10,0xE0,0xBC,0x42,0xF7,0xD1,0x81,0x7D, + 0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0, + 0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x0E,0x2C, + 0xCB,0xD3,0x6D,0x1C,0x15,0x2D,0xC7,0xD3,0x01,0xF0,0x4E,0xF8,0x01,0xF0,0xFC,0xF8, + 0x00,0x25,0x00,0x24,0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00,0x28,0x00,0x02,0xF0, + 0x5B,0xF8,0x00,0x28,0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00,0x59,0x58,0x03,0x04, + 0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0, + 0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x85,0xF8,0x39,0x19, + 0x01,0x9A,0x49,0x00,0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3,0x6D,0x1C,0x15,0x2D, + 0xD7,0xD3,0x00,0x20,0x00,0x90,0x01,0xF0,0xCF,0xF8,0x00,0x25,0x00,0x24,0x21,0x00, + 0x28,0x00,0x02,0xF0,0x31,0xF8,0x00,0x28,0x3E,0xD0,0x0E,0x21,0x69,0x43,0xB9,0x9B, + 0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A, + 0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00,0xF1,0x5B,0x00,0x04, + 0x00,0x0C,0x81,0x42,0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00,0x02,0xF0,0x54,0xF8, + 0x01,0x99,0xC8,0x53,0x00,0x98,0x03,0x21,0xFE,0xF7,0xE0,0xFD,0x00,0x29,0x01,0xD0, + 0x02,0x29,0x0D,0xD1,0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22,0x43,0x1E, + 0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0,0x19,0xFA,0x0B,0xE0, + 0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0,0x11,0xFA,0x00,0x28, + 0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C,0xB7,0xD3,0x6D,0x1C, + 0x15,0x2D,0xB3,0xD3,0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98,0x40,0x1E,0xB8,0x90, + 0x18,0xD2,0x00,0x25,0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43,0x01,0x99,0x30,0x19, + 0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00,0x06,0xF0,0x0E,0xFA,0x64,0x1C,0x0E,0x2C, + 0xF4,0xD3,0x6D,0x1C,0x15,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0,0xF0,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0xF0,0xB0,0xFF,0x8D,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40, + 0xE0,0x04,0x00,0x20,0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x6D,0x05,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0, + 0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x7B, + 0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25,0x1F,0x4F,0xAD,0x01,0x32,0xE0,0x72,0x46, + 0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1, + 0x00,0x9C,0x93,0x00,0xA6,0x7B,0x1B,0x0F,0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19, + 0x24,0x6B,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19, + 0x00,0x6B,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40, + 0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E, + 0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42, + 0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0xFC,0xB5,0x04,0x00,0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49,0x40,0x8C,0x01,0x91, + 0x4B,0x89,0x40,0x39,0x00,0x91,0x89,0x7F,0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26, + 0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99,0x09,0x7A,0x00,0x29, + 0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00, + 0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46, + 0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42,0x5C,0xDC,0x82,0x42, + 0x5A,0xDB,0x8C,0x45,0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A, + 0x7B,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0,0x03,0x2A,0x76,0xD1, + 0xE2,0x79,0xD3,0x07,0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A,0x27,0xD1,0x09,0x20, + 0x00,0x25,0xE0,0x71,0x6B,0xE0,0x00,0x9A,0x92,0x7E,0x00,0x2A,0x67,0xD1,0x00,0xF0, + 0x79,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72,0x5F,0xE0,0xE2,0x79, + 0xD3,0x07,0xE8,0xD1,0x92,0x07,0x5A,0xD5,0x00,0xF0,0x6C,0xF8,0x06,0x00,0x08,0xD0, + 0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0x94,0xFD, + 0xEB,0xE7,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0x8E,0xFD,0x47,0xE0,0x11,0x20, + 0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x55,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0, + 0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x7B,0xFD,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20, + 0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28, + 0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4, + 0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0x57,0xFD,0xE6,0x71,0x09,0xE0,0x02,0x20, + 0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x4B,0xFD,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49, + 0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80, + 0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0xE0,0x04,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x7F,0x00,0x22,0x10,0x00, + 0x00,0x2E,0x23,0xD0,0x1B,0x7E,0x00,0x2B,0x20,0xD1,0x12,0x4F,0x1C,0xE0,0xD3,0x00, + 0xDD,0x19,0x09,0x23,0xDB,0x01,0xEB,0x18,0x00,0x25,0x5D,0x5F,0xA5,0x42,0x0E,0xDC, + 0x04,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB,0x02,0x25,0x5D,0x5F,0x8D,0x42,0x06,0xDC, + 0x06,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28, + 0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8,0xF0,0xBC,0x70,0x47, + 0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8D,0xB0,0x09,0x90, + 0x08,0x90,0xBA,0x48,0xBA,0x4C,0x00,0x68,0x01,0x88,0x07,0x91,0x01,0x00,0x40,0x31, + 0xCA,0x7F,0x60,0x30,0x06,0x92,0x8A,0x7F,0x05,0x92,0x40,0x78,0x04,0x90,0x88,0x7D, + 0xB3,0x49,0x03,0x90,0xE0,0x88,0x09,0x79,0x02,0x07,0x04,0xD5,0x00,0x29,0x02,0xD1, + 0x08,0x22,0x90,0x43,0xE0,0x80,0xAF,0x48,0x00,0x25,0x45,0x5F,0xFF,0x22,0xFF,0x23, + 0x2D,0x32,0x01,0x33,0x95,0x42,0x03,0xDD,0x02,0x25,0x45,0x5F,0x95,0x42,0x03,0xDC, + 0x04,0x22,0x82,0x5E,0x0A,0x2A,0x04,0xDD,0xE2,0x88,0x1A,0x43,0xE2,0x80,0x0A,0x22, + 0x04,0xE0,0x06,0x22,0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E,0xC2,0x80,0x02,0xE0, + 0xE2,0x88,0x9A,0x43,0xE2,0x80,0x07,0x9A,0x92,0x04,0x7E,0xD5,0x40,0x7A,0x00,0x22, + 0x00,0x28,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x22,0x00,0x92,0x00,0xF0,0x38,0xF9, + 0x97,0x49,0x11,0x22,0x20,0x79,0x92,0x01,0x8A,0x18,0x0B,0x92,0x23,0x22,0x52,0x01, + 0x8D,0x18,0x00,0x28,0x0C,0x90,0x4F,0xD0,0x21,0x89,0x90,0x4A,0x01,0x20,0x0A,0x91, + 0x16,0x68,0x40,0x36,0x72,0x8B,0x91,0x42,0x00,0xD3,0x00,0x20,0x02,0x90,0x0A,0x98, + 0x0A,0x22,0x12,0x21,0x50,0x43,0x69,0x5E,0x0F,0x00,0xFE,0xF7,0x9F,0xFA,0x31,0x7C, + 0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0x0A,0x98,0x0A,0x21, + 0xC0,0x1B,0xFE,0xF7,0x93,0xFA,0x71,0x7C,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0, + 0x00,0x20,0xAA,0x89,0xB3,0x7C,0x07,0x00,0x01,0x21,0x08,0x00,0x9A,0x42,0x00,0xD8, + 0x00,0x20,0x0B,0x9A,0xF3,0x7C,0x52,0x6B,0x9A,0x42,0x00,0xDB,0x00,0x21,0x02,0x9A, + 0x00,0x2A,0x19,0xD0,0x01,0x9A,0x00,0x2A,0x16,0xD0,0x00,0x2F,0x14,0xD0,0x00,0x28, + 0x12,0xD0,0x00,0x29,0x10,0xD0,0x72,0x48,0xC0,0x30,0xC0,0x6A,0x00,0x28,0x0B,0xD1, + 0x71,0x48,0x00,0x88,0x1E,0x28,0x07,0xD2,0x68,0x7C,0x00,0x28,0x1B,0xD0,0x71,0x7E, + 0x88,0x42,0x18,0xD8,0x40,0x1E,0x15,0xE0,0x68,0x49,0x0B,0x98,0x09,0x68,0x40,0x6B, + 0x40,0x31,0x0A,0x7D,0x90,0x42,0x0E,0xDB,0x0C,0x98,0x00,0x28,0x0B,0xD0,0xE0,0x88, + 0xC0,0x06,0x08,0xD4,0x68,0x7C,0xC9,0x7D,0x88,0x42,0x04,0xD2,0x03,0x99,0x88,0x42, + 0x01,0xD9,0x40,0x1C,0x68,0x74,0x68,0x7C,0x00,0xE0,0x1B,0xE0,0x03,0x99,0x10,0x22, + 0x88,0x42,0x0A,0xD8,0x00,0x98,0x00,0x28,0x07,0xD1,0xE0,0x88,0x10,0x43,0xE0,0x80, + 0x56,0x48,0x00,0x68,0x40,0x30,0x00,0x7E,0x0E,0xE0,0xE1,0x88,0xC8,0x06,0x0C,0xD5, + 0x28,0x7C,0x00,0x28,0x07,0xD1,0x51,0x48,0x91,0x43,0xE1,0x80,0x00,0x68,0x40,0x30, + 0x40,0x7D,0x68,0x74,0x01,0xE0,0x40,0x1E,0x28,0x74,0x20,0x79,0x00,0x28,0x7E,0xD0, + 0xE0,0x88,0x80,0x06,0x0B,0xD5,0x04,0xA8,0x03,0xC8,0x81,0x42,0x05,0xD9,0x08,0x00, + 0x04,0x99,0x40,0x1A,0x00,0x06,0x00,0x0E,0x00,0xE0,0x01,0x20,0x05,0x90,0x01,0x22, + 0x50,0x00,0x01,0x19,0x8C,0x46,0xFF,0x31,0x61,0x31,0xCB,0x89,0x00,0x2B,0x6F,0xD0, + 0x07,0x9D,0x00,0x20,0xAD,0x07,0x08,0xD5,0x06,0x9D,0xAB,0x42,0x05,0xD9,0x20,0x71, + 0xE0,0x88,0x08,0x23,0x18,0x43,0xE0,0x80,0x01,0x20,0x07,0x9B,0x5B,0x07,0x5F,0xD5, + 0x00,0x28,0x5D,0xD1,0xC8,0x89,0x05,0x99,0x88,0x42,0x59,0xD3,0x37,0x48,0x00,0x88, + 0x00,0x28,0x55,0xD0,0x00,0x23,0x01,0x20,0x29,0xE0,0xFF,0x25,0x21,0x18,0x66,0x35, + 0x6D,0x5C,0x95,0x42,0x22,0xD1,0x5B,0x1C,0xFF,0x31,0x21,0x31,0x09,0x7E,0x09,0x91, + 0x01,0x00,0x14,0xE0,0x4D,0x00,0x2D,0x19,0x2E,0x00,0xE0,0x36,0xF7,0x8A,0xFF,0x35, + 0x01,0x35,0xB7,0x82,0x2F,0x89,0xEF,0x80,0x65,0x18,0x2E,0x00,0xFF,0x36,0x21,0x36, + 0x77,0x7E,0xFF,0x35,0x61,0x35,0x37,0x76,0xAF,0x79,0x49,0x1C,0x6F,0x71,0x25,0x79, + 0x8D,0x42,0xE7,0xDA,0x21,0x79,0x49,0x1E,0x40,0x1E,0x21,0x71,0x40,0x1C,0x21,0x79, + 0x81,0x42,0xD2,0xDA,0x00,0x2B,0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x08,0x90, + 0xE0,0x88,0x20,0x21,0x08,0x43,0xE0,0x80,0x21,0x79,0x60,0x46,0xFF,0x30,0x49,0x1C, + 0x41,0x30,0x09,0x06,0xC3,0x88,0x09,0x0E,0x21,0x71,0x49,0x00,0x09,0x19,0xE0,0x31, + 0x8B,0x82,0xC1,0x8A,0x20,0x79,0x40,0x00,0x00,0x19,0xFF,0x30,0x01,0xE0,0x11,0xE0, + 0x06,0xE0,0x01,0x30,0xC1,0x80,0x23,0x79,0x0A,0x49,0x09,0x98,0x48,0x39,0x58,0x54, + 0x52,0x1C,0x08,0x2A,0x84,0xDB,0x08,0x98,0x00,0x28,0x03,0xD1,0xE0,0x88,0x20,0x21, + 0x88,0x43,0xE0,0x80,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x78,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xC0,0x01,0x00,0x20,0x7C,0x05,0x00,0x20,0xC0,0x05,0x00,0x20, + 0xF0,0xB5,0x5F,0x4C,0xB9,0xB0,0x20,0x68,0x00,0x21,0x60,0x30,0x07,0x79,0x40,0x79, + 0x33,0x90,0x5C,0x48,0x38,0x90,0x41,0x82,0x20,0x38,0x37,0x90,0x41,0x63,0x32,0x91, + 0x31,0x91,0x60,0x21,0x19,0xA8,0xFE,0xF7,0xE9,0xFA,0x60,0x21,0x01,0xA8,0xFE,0xF7, + 0xE5,0xFA,0x38,0x98,0x41,0x7C,0x20,0x68,0x40,0x30,0xC0,0x7D,0x81,0x42,0x77,0xD0, + 0x33,0x9D,0x0E,0x21,0x48,0x1B,0x34,0x90,0x5B,0xE0,0x15,0x21,0xC9,0x1B,0x36,0x91, + 0x33,0x99,0x38,0x00,0x69,0x1A,0x8C,0x00,0x1A,0xE0,0x4B,0x4A,0x6B,0x00,0x9E,0x18, + 0xB8,0x23,0xF3,0x5E,0x0E,0x21,0x46,0x00,0x41,0x43,0xB2,0x18,0x88,0x26,0x96,0x5F, + 0x49,0x19,0x09,0x04,0x9A,0x19,0x45,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E,0x51,0x18, + 0x32,0x9A,0x52,0x18,0x32,0x92,0x19,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51, + 0x36,0x99,0x81,0x42,0xE1,0xDC,0x78,0x00,0x15,0x21,0x09,0x1A,0x19,0xAE,0x35,0x90, + 0x30,0x59,0xFE,0xF7,0x33,0xF9,0x30,0x51,0x3E,0x00,0x84,0x46,0x19,0xE0,0x0E,0x20, + 0x70,0x43,0x36,0x49,0x40,0x19,0x40,0x00,0x09,0x5E,0x60,0x46,0x6A,0x00,0x09,0x1A, + 0x31,0x48,0x13,0x18,0xB8,0x22,0x9A,0x5E,0x73,0x00,0x1B,0x18,0x88,0x20,0x18,0x5E, + 0x10,0x18,0x09,0x18,0x0B,0x00,0x4B,0x43,0x01,0xA8,0x02,0x59,0xD1,0x18,0x76,0x1C, + 0x01,0x51,0x36,0x98,0xB0,0x42,0xE2,0xDC,0x35,0x98,0x14,0x21,0x09,0x1A,0x01,0xAE, + 0x30,0x59,0xFE,0xF7,0x0B,0xF9,0x30,0x51,0x31,0x99,0x40,0x18,0x31,0x90,0x34,0x98, + 0x6D,0x1C,0xA8,0x42,0xA1,0xDC,0x78,0x00,0x15,0x21,0x09,0x1A,0x33,0x98,0x0E,0x22, + 0x40,0x00,0x14,0x1A,0x61,0x43,0x06,0x00,0x32,0x98,0xFE,0xF7,0xF7,0xF8,0x38,0x99, + 0x48,0x82,0x31,0x98,0x21,0x00,0xFE,0xF7,0xF1,0xF8,0x00,0x21,0x01,0xAB,0x0B,0xE0, + 0x1B,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x15,0x00,0x55,0x43,0x37,0x9A,0x52,0x6B, + 0xAA,0x18,0x37,0x9D,0x49,0x1C,0x6A,0x63,0x8C,0x42,0xF2,0xDC,0x37,0x98,0x0D,0x21, + 0x40,0x6B,0x89,0x1B,0xFE,0xF7,0xDA,0xF8,0x15,0x22,0x34,0x99,0xD2,0x1B,0x92,0x02, + 0x51,0x43,0xFE,0xF7,0xD3,0xF8,0x37,0x99,0x48,0x63,0x38,0x99,0x12,0x20,0x08,0x5E, + 0x00,0x28,0x01,0xD1,0x40,0x1C,0x48,0x82,0x39,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x06,0x00,0x20,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0x10,0xB5,0x00,0x28,0x06,0xD1,0x14,0x48,0x00,0x69,0x00,0x04,0x00,0x0E,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x11,0x49,0x09,0x6B,0x11,0x4A,0x12,0x4B,0x8A,0x18,0x9A,0x42, + 0x16,0xD2,0x00,0x04,0x00,0x0C,0x48,0x43,0x59,0x1E,0xFE,0xF7,0xD7,0xF9,0x04,0x00, + 0x0A,0x21,0xFE,0xF7,0xD3,0xF9,0x04,0x29,0x00,0xD9,0x0A,0x34,0x0A,0x21,0x20,0x00, + 0xFE,0xF7,0xCC,0xF9,0x08,0x49,0x49,0x7C,0x08,0x18,0xFF,0x28,0x00,0xD9,0xFF,0x20, + 0x00,0x06,0x00,0x0E,0xDB,0xE7,0x00,0x00,0x00,0x90,0x00,0x40,0x00,0x70,0x00,0x40, + 0x90,0x6B,0xFF,0xFF,0xA1,0x0F,0x00,0x00,0x60,0x93,0x00,0x00,0xF8,0xB5,0x6D,0x4C, + 0x60,0x7B,0x00,0x28,0x06,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C,0x06,0xF0,0x7E,0xF9, + 0x06,0xF0,0x6C,0xF9,0x01,0x20,0x40,0x03,0xFE,0xF7,0x60,0xFE,0xFE,0xF7,0x1E,0xFA, + 0x05,0xF0,0x62,0xFC,0x05,0xF0,0x76,0xFC,0x05,0xF0,0x8A,0xFE,0x62,0x48,0x01,0x25, + 0x85,0x60,0x1F,0x20,0x01,0xF0,0x06,0xFE,0x60,0x48,0x61,0x4E,0x00,0x90,0xAA,0xE0, + 0x60,0x48,0x41,0x68,0x09,0x07,0x0B,0xD5,0xC1,0x68,0x00,0x29,0x08,0xD0,0xC0,0x68, + 0x07,0x28,0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0xA1,0xE0,0x05,0xF0,0x62,0xF8, + 0x60,0x7B,0x00,0x28,0x04,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C,0x06,0xF0,0x4E,0xF9, + 0x80,0x20,0xFE,0xF7,0x33,0xFE,0x03,0x20,0x05,0xF0,0xC0,0xFF,0x01,0x20,0x40,0x03, + 0xFE,0xF7,0x2C,0xFE,0x50,0x4F,0xF8,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0, + 0x40,0x06,0x01,0xD5,0x04,0x20,0x00,0xE0,0x02,0x20,0x05,0xF0,0x63,0xFE,0x00,0xF0, + 0xAD,0xFB,0x00,0xF0,0x69,0xFB,0x00,0xF0,0x77,0xFB,0x35,0x61,0x00,0xF0,0x24,0xFC, + 0x00,0xF0,0x5A,0xFB,0x01,0x20,0x80,0x03,0xFE,0xF7,0x10,0xFE,0x00,0xF0,0x6C,0xFB, + 0x00,0xF0,0x1A,0xFC,0xFE,0xF7,0x92,0xFA,0xA0,0x7C,0x00,0x28,0x05,0xD1,0x00,0x98, + 0x00,0x7B,0x00,0x28,0x01,0xD0,0x04,0xF0,0xA1,0xFE,0x03,0xF0,0x63,0xFD,0x00,0x28, + 0x00,0xD0,0x25,0x70,0xE0,0x8A,0x39,0x49,0x88,0x42,0x01,0xD2,0x40,0x1C,0xE0,0x82, + 0x20,0x78,0x00,0x28,0x05,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x01,0x23,0x00,0xF0, + 0x45,0xF9,0x03,0x20,0x40,0x03,0xFE,0xF7,0xE1,0xFD,0x20,0x78,0x00,0x28,0x05,0xD0, + 0xA0,0x7C,0x00,0x09,0x04,0x28,0x43,0xD1,0x00,0x20,0x20,0x70,0x03,0x20,0x05,0xF0, + 0x47,0xFF,0x60,0x65,0x03,0x20,0x05,0xF0,0x79,0xFF,0x80,0x20,0xFE,0xF7,0xCE,0xFD, + 0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xF8,0x83,0x2C,0xE0,0xA0,0x7A,0x00,0x28, + 0x29,0xD1,0xE0,0x6A,0x00,0x28,0x26,0xD0,0x60,0x6D,0x21,0x49,0x0C,0x1A,0xFF,0x20, + 0x91,0x30,0x84,0x42,0x1F,0xDD,0xFF,0x27,0x01,0x37,0x38,0x00,0xFE,0xF7,0xBE,0xFD, + 0x02,0x20,0x05,0xF0,0x5B,0xFF,0x0A,0x21,0x20,0x00,0xFD,0xF7,0xCF,0xFF,0x41,0x11, + 0x02,0x20,0x05,0xF0,0x3B,0xFF,0x04,0x20,0xFE,0xF7,0xE8,0xFD,0x02,0x20,0x05,0xF0, + 0x3D,0xFF,0x35,0x61,0xFF,0x20,0xFE,0xF7,0xE1,0xFD,0x02,0x20,0x05,0xF0,0x46,0xFF, + 0x38,0x00,0xFE,0xF7,0x9B,0xFD,0x07,0x4C,0x20,0x78,0x00,0x28,0x00,0xD1,0x4F,0xE7, + 0x04,0x48,0x40,0x7B,0x00,0x28,0x01,0xD0,0x06,0xF0,0xA8,0xF8,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x64,0x05,0x00,0x20,0x00,0x90,0x00,0x40,0x80,0x93,0x00,0x00, + 0x40,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x40,0x00,0x00,0x20,0x10,0x27,0x00,0x00, + 0xC8,0x32,0x00,0x00,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0x0C,0x48, + 0x09,0x22,0x00,0x21,0xFE,0xF7,0xE6,0xF8,0x0A,0x48,0x5A,0x22,0x00,0x21,0xFE,0xF7, + 0xE1,0xF8,0x08,0x48,0x00,0x24,0x0C,0x38,0x04,0x72,0x07,0x48,0x28,0x22,0x21,0x00, + 0xFE,0xF7,0xD8,0xF8,0x04,0x48,0x52,0x38,0x44,0x76,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xE3,0x02,0x00,0x20,0xCC,0x01,0x00,0x20,0xF2,0x04,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x12,0x22,0x00,0x21,0xFE,0xF7,0xC6,0xF8,0x14,0x48,0x12,0x22,0x00,0x21,0x12,0x30, + 0xFE,0xF7,0xC0,0xF8,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30,0xFE,0xF7,0xBA,0xF8, + 0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0xFE,0xF7,0xB4,0xF8,0x0B,0x48,0x10,0x22, + 0x00,0x21,0x52,0x30,0xFE,0xF7,0xAE,0xF8,0x08,0x48,0x10,0x22,0x00,0x21,0x62,0x30, + 0xFE,0xF7,0xA8,0xF8,0x05,0x49,0x00,0x20,0x6C,0x31,0xC8,0x83,0xFF,0x39,0x61,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20, + 0x8C,0x10,0x9F,0xE5,0x10,0x40,0x2D,0xE9,0x00,0x10,0x91,0xE5,0x84,0xC0,0x9F,0xE5, + 0x7E,0xE0,0xD1,0xE5,0x08,0x10,0xA0,0xE3,0x00,0x30,0xA0,0xE3,0x01,0x22,0x8C,0xE0, + 0x80,0x20,0x82,0xE0,0xB7,0x4F,0xA0,0xE3,0xB2,0x30,0x84,0xE1,0x03,0x2C,0x82,0xE2, + 0x01,0x10,0x51,0xE2,0xBC,0x36,0xC2,0xE1,0xF7,0xFF,0xFF,0x5A,0x01,0x20,0xA0,0xE3, + 0x00,0x10,0x8C,0xE0,0xD4,0x22,0xC1,0xE5,0x80,0x20,0x8C,0xE0,0x03,0x2C,0x82,0xE2, + 0xBC,0x3F,0xC2,0xE1,0x0C,0xE4,0xC1,0xE5,0x14,0x34,0xC1,0xE5,0x02,0x10,0xA0,0xE3, + 0x01,0x22,0x8C,0xE0,0x80,0x20,0x82,0xE0,0x01,0x2B,0x82,0xE2,0x01,0x10,0x51,0xE2, + 0xBC,0x31,0xC2,0xE1,0xF9,0xFF,0xFF,0x5A,0x00,0x01,0x8C,0xE0,0x00,0x10,0xE0,0xE3, + 0x01,0x0B,0x80,0xE2,0xBC,0x14,0xC0,0xE1,0xBE,0x14,0xC0,0xE1,0x10,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x78,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48, + 0x1E,0x22,0x00,0x21,0xFE,0xF7,0x46,0xF8,0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF6,0x02,0x00,0x20,0x20,0x01,0x00,0x20, + 0x10,0xB5,0x05,0xF0,0x99,0xFE,0x04,0xF0,0xDF,0xFD,0xFF,0xF7,0x47,0xFF,0x04,0xF0, + 0x41,0xFF,0x01,0xF0,0x8F,0xFE,0x01,0xF0,0xC9,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33,0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42, + 0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04, + 0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0x78,0x06,0x00,0x20,0xFF,0xB5,0x64,0x48, + 0xFF,0xB0,0x00,0x7D,0xC0,0xB0,0x00,0x28,0x03,0xD0,0x01,0x20,0xBC,0x90,0x00,0x20, + 0x02,0xE0,0x00,0x20,0xBC,0x90,0x01,0x20,0xBB,0x90,0x5E,0x48,0x00,0x25,0xBD,0x90, + 0x5D,0x48,0x2E,0x00,0x01,0x8B,0x05,0x91,0x41,0x8B,0x04,0x91,0x81,0x8A,0x03,0x91, + 0xC0,0x8A,0x02,0x90,0x59,0x48,0x00,0x7B,0x01,0x90,0x00,0x24,0x0E,0x20,0x70,0x43, + 0xBE,0x90,0x07,0x19,0x21,0x00,0x30,0x00,0x01,0xF0,0xF6,0xF9,0x50,0x49,0x20,0x39, + 0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x52,0x4A,0x52,0x7A,0x00,0x2A,0x01,0x9A,0x11,0xD0, + 0x96,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0, + 0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42, + 0x3E,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xB2,0x42,0x0B,0xD0,0xCA,0x7D, + 0xB2,0x42,0x08,0xD0,0x0A,0x7E,0xB2,0x42,0x05,0xD0,0x4A,0x7E,0xB2,0x42,0x02,0xD0, + 0x89,0x7E,0xB1,0x42,0x2C,0xD1,0x05,0x99,0x04,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x04,0xE0,0x03,0x99,0x02,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x80,0x1A,0xBD,0x9B, + 0x02,0x04,0xB8,0x00,0x18,0x58,0xC0,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05, + 0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0xC2,0x9B,0x00,0x2B,0x0C,0xD0,0x90,0x42, + 0x02,0xDA,0xBF,0x9B,0xBC,0x9A,0x03,0xE0,0x88,0x42,0x09,0xDD,0xBF,0x9B,0xBB,0x9A, + 0x21,0x00,0x30,0x00,0x00,0xF0,0x8C,0xF8,0x68,0x00,0x06,0xA9,0x6D,0x1C,0x0F,0x52, + 0x64,0x1C,0x0E,0x2C,0x01,0xDA,0xBE,0x98,0x9B,0xE7,0x76,0x1C,0x15,0x2E,0x94,0xDB, + 0x00,0x2D,0x38,0xDD,0xC1,0x98,0x00,0x28,0x35,0xD1,0x00,0xF0,0x5D,0xF9,0x00,0xF0, + 0x73,0xF9,0x00,0xF0,0x21,0xFA,0x2C,0xE0,0x68,0x00,0x06,0xA9,0x08,0x5A,0x87,0x00, + 0xBD,0x98,0xC0,0x59,0x01,0x01,0x06,0x05,0xC2,0x98,0x0C,0x0D,0x36,0x0D,0x02,0x28, + 0x01,0xD1,0x64,0x21,0x04,0xE0,0x01,0x28,0x01,0xD1,0x32,0x21,0x00,0xE0,0x00,0x21, + 0xB4,0x42,0x06,0xD2,0x30,0x1B,0x64,0x21,0x48,0x43,0xFD,0xF7,0x0F,0xFE,0x00,0x19, + 0x05,0xE0,0xA0,0x1B,0x48,0x43,0x64,0x21,0xFD,0xF7,0x08,0xFE,0x20,0x1A,0x0D,0x49, + 0x00,0x04,0x00,0x0C,0x88,0x42,0x00,0xD9,0x08,0x00,0xBD,0x99,0x00,0x04,0x30,0x43, + 0xC8,0x51,0x6D,0x1E,0xD0,0xD5,0x7F,0xB0,0x44,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40,0xE0,0x95,0x00,0x00,0xE0,0x04,0x00,0x20, + 0x64,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00,0x7F,0xB5,0x01,0x25,0x6D,0x07,0x28,0x68, + 0x02,0x28,0x27,0xD1,0xAC,0x68,0x01,0xAA,0x20,0x05,0x00,0x0D,0x02,0x90,0x20,0x02, + 0x00,0x0D,0x03,0x90,0x02,0xA9,0x03,0xA8,0x6B,0x46,0x04,0xF0,0xAD,0xFF,0x40,0x1C, + 0x18,0xD0,0x01,0x98,0x03,0x99,0x40,0x00,0x40,0x18,0x03,0x21,0xFD,0xF7,0xFE,0xFE, + 0x00,0x05,0x06,0x0A,0x09,0x48,0x02,0x99,0x04,0x40,0x00,0x98,0x26,0x43,0x40,0x00, + 0x40,0x18,0x03,0x21,0xFD,0xF7,0xF2,0xFE,0x00,0x05,0x00,0x0D,0x31,0x0B,0x09,0x03, + 0x08,0x43,0xA8,0x60,0x7F,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFF,0x0F,0x00,0xFF, + 0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06, + 0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18, + 0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD, + 0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0, + 0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02, + 0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0xF0,0xB5,0x8B,0xB0, + 0x0E,0x27,0x15,0x20,0x04,0xA9,0x81,0xC1,0x06,0x90,0x53,0x48,0x53,0x49,0x0A,0x90, + 0x80,0x7F,0x09,0x91,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x0D,0x20,0x03,0x21, + 0x05,0x90,0x02,0xE0,0x14,0x20,0x00,0x21,0x04,0x90,0x09,0x98,0x01,0x72,0x4C,0x48, + 0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90, + 0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28,0x7E,0xD0,0x04,0x98,0x00,0x28,0x7F,0xD0, + 0x05,0x98,0x41,0x00,0x30,0x00,0xFD,0xF7,0x59,0xFD,0x05,0x04,0x2D,0x0C,0x00,0x24, + 0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43,0x05,0x99,0xFD,0xF7,0x4F,0xFD,0x3D,0x4A, + 0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xBC,0x42,0xF2,0xDB,0x04,0x98, + 0x41,0x00,0x01,0x98,0xFD,0xF7,0x42,0xFD,0x06,0x9F,0x06,0x04,0x36,0x0C,0x00,0x24, + 0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7,0x37,0xFD,0x31,0x4A, + 0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x64,0x1C,0x81,0x82,0xBC,0x42,0xF1,0xDB, + 0x0A,0x98,0x80,0x7F,0xC0,0x07,0x4B,0xD0,0x00,0x24,0x43,0xE0,0x29,0x4A,0x25,0x21, + 0x10,0x19,0x49,0x01,0x40,0x18,0x41,0x7B,0x0A,0x98,0x80,0x7F,0x80,0x07,0x03,0xD5, + 0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99,0x02,0x96,0x03,0x91, + 0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7, + 0x0D,0xFD,0x1C,0x4A,0xE1,0x00,0x89,0x18,0x09,0x22,0xD2,0x01,0x8F,0x18,0x38,0x80, + 0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x07,0x90,0x80,0x8A,0x0A,0x21, + 0x80,0x1B,0xFD,0xF7,0xFB,0xFC,0x78,0x80,0x08,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19, + 0xFD,0xF7,0x24,0xFE,0xB8,0x80,0x07,0x98,0x0A,0x21,0x80,0x8A,0x80,0x19,0xFD,0xF7, + 0x1D,0xFE,0xF8,0x80,0x02,0x98,0x0A,0x21,0x40,0x00,0xFD,0xF7,0x17,0xFE,0x09,0x99, + 0x64,0x1C,0x48,0x81,0x0A,0x98,0x00,0xE0,0x02,0xE0,0xC0,0x7F,0xA0,0x42,0xB5,0xDC, + 0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x04,0x00,0x20,0xE0,0x04,0x00,0x20, + 0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43, + 0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48,0x92,0x00,0xFD,0xF7, + 0xEB,0xFD,0x07,0x48,0x07,0x4A,0xC0,0x8E,0x01,0x04,0x01,0x43,0x06,0x48,0xFD,0xF7, + 0x0F,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40,0x02,0x48,0x81,0x6B, + 0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49, + 0x0A,0x48,0xFC,0x22,0xFD,0xF7,0xC0,0xFD,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32, + 0xFD,0xF7,0xBA,0xFD,0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00,0xFD,0xF7,0xB4,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x96,0x00,0x00,0x04,0x90,0x00,0x40, + 0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40, + 0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60, + 0x18,0x48,0xA6,0x15,0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7, + 0x97,0xFD,0x32,0x00,0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0x99,0xFD,0x12,0x48, + 0x75,0x00,0x04,0x04,0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0x88,0xFD, + 0x0E,0x49,0x2A,0x00,0x20,0x00,0x00,0x23,0xFD,0xF7,0x8A,0xFD,0x0C,0x48,0x6D,0x00, + 0x04,0x04,0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0x79,0xFD,0x09,0x49, + 0x2A,0x00,0x20,0x00,0x00,0x23,0xFD,0xF7,0x7B,0xFD,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x90,0x00,0x40,0x00,0x96,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40,0x02,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0, + 0x70,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xF0,0x47,0x2D,0xE9,0x00,0x80,0xA0,0xE1, + 0xF4,0x01,0x9F,0xE5,0xF4,0x71,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x00,0x50,0xA0,0xE3, + 0xB4,0x67,0xD0,0xE1,0x76,0x00,0xD0,0xE5,0x01,0x40,0xA0,0xE3,0x90,0x00,0x01,0xE0, + 0x8A,0x01,0xD7,0xE5,0xFF,0x90,0x01,0xE2,0x01,0x00,0x50,0xE3,0x0E,0x00,0x00,0xBA, + 0x04,0x01,0x84,0xE0,0x80,0x00,0x87,0xE0,0x40,0x12,0xD0,0xE5,0x00,0x00,0x51,0xE3, + 0x05,0x00,0x00,0x0A,0x02,0x0C,0x80,0xE2,0x46,0x00,0x80,0xE2,0x41,0x05,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x85,0x12,0xFF,0x50,0x00,0x12,0x8A,0x01,0xD7,0xE5, + 0x01,0x40,0x84,0xE2,0x04,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA,0x90,0x01,0x9F,0xE5, + 0x00,0x50,0x80,0xE5,0x8C,0x01,0x9F,0xE5,0xB4,0x2C,0xD0,0xE1,0xB8,0x3C,0xD0,0xE1, + 0xBA,0xCC,0xD0,0xE1,0x03,0x10,0x42,0xE0,0x00,0x00,0x51,0xE3,0x02,0x10,0x43,0xD0, + 0xB6,0x3C,0xD0,0xE1,0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1,0x0C,0x20,0x43,0xE0, + 0x00,0x00,0x52,0xE3,0x03,0x20,0x4C,0xD0,0xD0,0x32,0xD7,0xE5,0x02,0x28,0xA0,0xE1, + 0x22,0x28,0xA0,0xE1,0x00,0x00,0x53,0xE3,0xD3,0x32,0xD7,0x15,0xC8,0x00,0x53,0x13, + 0x01,0x00,0x00,0x2A,0x01,0x30,0x83,0xE2,0xD3,0x32,0xC7,0xE5,0xB6,0x3B,0xD0,0xE1, + 0x01,0xC0,0xA0,0xE3,0x14,0x00,0x53,0xE3,0x02,0x00,0x00,0x2A,0xB9,0x32,0xD7,0xE5, + 0x00,0x00,0x53,0xE3,0xBA,0xC2,0xC7,0x15,0x19,0x00,0x51,0xE3,0x19,0x00,0x52,0x93, + 0x03,0x00,0x00,0x9A,0xB8,0x32,0xD7,0xE5,0xC8,0x00,0x53,0xE3,0x01,0x30,0x83,0x32, + 0xB8,0x32,0xC7,0x35,0xFE,0x3C,0xD0,0xE1,0x02,0x00,0x55,0xE3,0x19,0x00,0x51,0x33, + 0x19,0x00,0x52,0x33,0x03,0x00,0x00,0x2A,0x04,0x00,0x53,0xE3,0x05,0x00,0x00,0xAA, + 0x01,0x30,0x83,0xE2,0x02,0x00,0x00,0xEA,0x03,0x00,0x73,0xE3,0x01,0x00,0x00,0xDA, + 0x01,0x30,0x43,0xE2,0xBE,0x3C,0xC0,0xE1,0xD3,0x32,0xD7,0xE5,0x01,0x00,0x53,0xE3, + 0x78,0x10,0xA0,0x83,0x0D,0x00,0x00,0x8A,0x02,0x00,0x55,0xE3,0x0C,0x00,0x00,0x2A, + 0xFE,0x3C,0xD0,0xE1,0x02,0x00,0x53,0xE3,0x09,0x00,0x00,0xDA,0xB8,0x32,0xD7,0xE5, + 0x14,0x00,0x53,0xE3,0x06,0x00,0x00,0x2A,0x47,0x10,0x41,0xE2,0x95,0x00,0x51,0xE3, + 0x47,0x10,0x42,0x22,0x95,0x00,0x51,0x23,0x01,0x00,0x00,0x2A,0x77,0x10,0xE0,0xE3, + 0xBC,0x1C,0xC0,0xE1,0x00,0x10,0xA0,0xE3,0x02,0x00,0x55,0xE3,0xD2,0x12,0xC7,0xE5, + 0x0A,0x00,0x00,0x2A,0xFC,0x1C,0xD0,0xE1,0x78,0x00,0x71,0xE3,0x03,0x00,0x00,0x1A, + 0xD1,0x12,0xD7,0xE5,0xC8,0x00,0x51,0xE3,0x01,0x10,0x81,0x32,0xD1,0x12,0xC7,0x35, + 0xD1,0x12,0xD7,0xE5,0x02,0x00,0x51,0xE3,0xD2,0xC2,0xC7,0x05,0x01,0x00,0x00,0xEA, + 0x3B,0x10,0xE0,0x83,0xBC,0x1C,0xC0,0x81,0xFC,0x0C,0xD0,0xE1,0x00,0x00,0x58,0xE3, + 0x06,0x10,0x80,0xE0,0xF0,0x47,0xBD,0x18,0x91,0x01,0x00,0xE0,0x1E,0xFF,0x2F,0x11, + 0x04,0x10,0xD7,0xE5,0x01,0x00,0x51,0xE3,0xF0,0x47,0xBD,0x08,0x1E,0xFF,0x2F,0x01, + 0x09,0x10,0xA0,0xE1,0xF0,0x47,0xBD,0xE8,0x80,0xF5,0xFF,0xEA,0x78,0x06,0x00,0x20, + 0x40,0x00,0x00,0x20,0xA0,0x05,0x00,0x20,0x40,0x02,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xD2,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1, + 0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x02,0x48,0x41,0x6B, + 0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40,0x70,0x47,0x00,0x00, + 0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29, + 0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40, + 0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x04,0xF0,0xCB,0xFA,0x09,0x48, + 0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48, + 0x40,0x7B,0x00,0x28,0x01,0xD0,0x05,0xF0,0xA1,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x64,0x05,0x00,0x20,0xF1,0xB5,0x61,0x48, + 0x2E,0x21,0x90,0xB0,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26, + 0x76,0x07,0xF1,0x63,0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x04,0xF0, + 0xA1,0xFA,0x59,0x4D,0x68,0x7B,0x00,0x28,0x01,0xD0,0x05,0xF0,0x87,0xFB,0x10,0x9B, + 0x00,0x21,0x01,0x20,0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x05,0xF0,0xB8,0xFB, + 0x1E,0x16,0x40,0x40,0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x68, + 0x4F,0x6F,0x76,0x7D,0x40,0x84,0x40,0x8B,0x92,0x4F,0x40,0x40,0x40,0x40,0x99,0x40, + 0x0B,0x20,0xF0,0x63,0x4D,0xE0,0x00,0xF0,0x17,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x53,0xF8,0x00,0xF0,0x1D,0xFF,0x44,0x48,0x44,0x4A,0x41,0x68, + 0x52,0x68,0x91,0x42,0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18, + 0x49,0x1C,0xC1,0x83,0xFC,0xF7,0xE6,0xFF,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7, + 0x09,0xFE,0xA8,0x78,0x80,0x07,0x01,0xD5,0x05,0xF0,0xFE,0xFA,0x3A,0x49,0x40,0x22, + 0x68,0x46,0xFD,0xF7,0x91,0xFB,0x01,0x20,0x08,0x90,0x68,0x46,0x05,0xF0,0x0C,0xFB, + 0xF7,0x63,0x1E,0xE0,0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x05,0xF0,0xE2,0xF8,0xF0,0xE7,0x03,0x21, + 0x09,0x07,0xCA,0x60,0xFE,0xF7,0x1A,0xF8,0x10,0x98,0xFD,0xF7,0x6B,0xFF,0x08,0xE0, + 0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0x11,0xF8,0x00,0xF0,0x4F,0xFE,0x00,0xF0, + 0xE7,0xF8,0x20,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72,0xD2,0xE7,0xA9,0x72,0xD0,0xE7,0x00,0x2C, + 0x02,0xD0,0x01,0x20,0xE8,0x72,0xCB,0xE7,0xE9,0x72,0xC9,0xE7,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0x28,0x73,0xC4,0xE7,0x29,0x73,0xC2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0x68,0x73,0xBD,0xE7,0x69,0x73,0xBB,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x73, + 0xB6,0xE7,0xE9,0x73,0xB4,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x74,0xAF,0xE7, + 0x29,0x74,0xAD,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x68,0x74,0xA8,0xE7,0x69,0x74, + 0xA6,0xE7,0x00,0x2C,0x01,0xD0,0xAC,0x74,0x00,0xE0,0xA9,0x74,0x04,0xF0,0xA8,0xFE, + 0x9E,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0x64,0x05,0x00,0x20,0x00,0x00,0x00,0x10, + 0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00,0xC0,0x92,0x00,0x00,0xF0,0xB5,0x34,0x4C, + 0x30,0x38,0x34,0x4A,0x34,0x4E,0x35,0x4F,0x35,0x49,0x25,0x68,0x03,0x00,0x05,0xF0, + 0xFF,0xFA,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16, + 0x3E,0x43,0x47,0x4D,0x50,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48, + 0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x34,0xE0,0xCE,0x61, + 0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B, + 0xEF,0xE7,0x25,0x48,0x03,0x7B,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07, + 0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22, + 0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04, + 0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48, + 0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7,0x38,0x69,0x40,0x08,0x00,0x02,0xC8,0xE7, + 0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43,0xC2,0xE7,0x38,0x69,0x40,0x08, + 0xBF,0xE7,0x10,0x48,0x00,0x6A,0xBC,0xE7,0x48,0x69,0x10,0x42,0xFC,0xD1,0x04,0xF0, + 0x81,0xF9,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x92,0x00,0x00,0x00,0x93,0x00,0x00,0x15,0x00,0x0E,0x00,0x00,0x20,0x00,0x40, + 0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20,0xE0,0x04,0x00,0x20,0x00,0x96,0x00,0x00, + 0xE0,0x95,0x00,0x00,0x64,0x05,0x00,0x20,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68, + 0x00,0x20,0xC0,0x43,0xE0,0x60,0xFD,0xF7,0x57,0xFF,0x06,0x00,0xCB,0x20,0xC0,0x01, + 0xFD,0xF7,0x34,0xFF,0x03,0xF0,0xC6,0xFF,0x00,0xF0,0x9A,0xFD,0x03,0xF0,0xB8,0xFF, + 0x30,0x00,0xFD,0xF7,0x5D,0xFF,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x03,0xF0,0xB2,0xFF, + 0xFF,0xF7,0xE0,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07, + 0x05,0xF0,0x5D,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0xF8,0xB5,0x22,0x48,0x00,0x68,0x00,0x88,0xC0,0x06,0x3C,0xD5,0x20,0x4E,0x30,0x7A, + 0x00,0x28,0x38,0xD0,0x70,0x7A,0x00,0x28,0x35,0xD0,0x01,0x25,0x30,0xE0,0x0A,0x21, + 0x69,0x43,0x1C,0x4B,0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x7A,0x81,0x34,0x24,0xE0, + 0x0A,0x22,0x42,0x43,0xD2,0x18,0xFF,0x32,0xE1,0x32,0x21,0x7B,0x92,0x79,0x91,0x42, + 0x1A,0xD1,0x0A,0x22,0x50,0x43,0xC7,0x18,0xFF,0x37,0x0E,0x21,0xE1,0x37,0x08,0x20, + 0x61,0x5E,0x38,0x5E,0xBA,0x5E,0x08,0x1A,0x10,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91, + 0x3A,0x89,0xE1,0x89,0xFF,0xF7,0x1C,0xFA,0xE0,0x81,0x7A,0x89,0x21,0x8A,0x00,0x98, + 0xFF,0xF7,0x16,0xFA,0x20,0x82,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD8,0xDA,0x6D,0x1C, + 0x30,0x7A,0xA8,0x42,0xCB,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x06,0x00,0x20, + 0xC0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x9C,0xD0,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0x34,0x00,0x8D,0xE5,0x30,0x00,0x8D,0xE5, + 0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x3C,0x08,0x9F,0xE5,0xB0,0x12,0xD0,0xE1, + 0x20,0x10,0x8D,0xE5,0xB2,0x02,0xD0,0xE1,0x1C,0x00,0x8D,0xE5,0x2C,0x08,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0x8A,0x20,0xD0,0xE5,0x7C,0x10,0xD0,0xE5,0x7D,0xB0,0xD0,0xE5, + 0x18,0x20,0x8D,0xE5,0x89,0x20,0xD0,0xE5,0x14,0x20,0x8D,0xE5,0xB0,0x20,0xD0,0xE1, + 0x08,0x00,0x12,0xE3,0x23,0x00,0x00,0x0A,0x7F,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x88,0x20,0x8D,0xE5,0x80,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x84,0x20,0x8D,0xE5, + 0x81,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x80,0x20,0x8D,0xE5,0x82,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x7C,0x20,0x8D,0xE5,0x83,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x78,0x20,0x8D,0xE5,0x84,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x74,0x20,0x8D,0xE5, + 0x85,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x70,0x20,0x8D,0xE5,0x86,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x6C,0x20,0x8D,0xE5,0x87,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x68,0x20,0x8D,0xE5,0x88,0x00,0xD0,0xE5,0x91,0x00,0x00,0xE0,0x64,0x00,0x8D,0xE5, + 0x8C,0x07,0x9F,0xE5,0x88,0x11,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x00,0x60,0xA0,0x13, + 0x03,0x00,0x00,0x1A,0x0B,0x04,0x00,0xEB,0x9C,0xD0,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x68,0xA7,0x9F,0xE5,0x06,0x50,0x8A,0xE0,0xA4,0x42,0xD5,0xE5, + 0x00,0x00,0x54,0xE3,0x0C,0x00,0x00,0x0A,0x18,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x06,0x00,0x00,0x1A,0x04,0x01,0x84,0xE0,0x80,0x00,0x8A,0xE0,0x01,0x0C,0x80,0xE2, + 0x92,0x00,0x80,0xE2,0x77,0x03,0x00,0xEB,0x00,0x00,0x50,0xE3,0x02,0x00,0x00,0x0A, + 0xD2,0x02,0xDA,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x06,0x00,0xA0,0xE1, + 0x18,0x00,0x00,0xEA,0x07,0x00,0xA0,0xE3,0x00,0x12,0x8A,0xE0,0x86,0x10,0x81,0xE0, + 0x02,0x2C,0x81,0xE2,0xBC,0x3D,0xD2,0xE1,0x03,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE2, + 0xBC,0x3E,0xC2,0xE1,0xBC,0x26,0xD1,0xE1,0xBC,0x27,0xC1,0xE1,0xF5,0xFF,0xFF,0x5A, + 0x04,0x01,0x84,0xE0,0x80,0x80,0x8A,0xE0,0x01,0x7C,0x88,0xE2,0xBE,0x08,0xD7,0xE1, + 0x20,0x10,0x9D,0xE5,0x01,0x10,0x41,0xE2,0x01,0x00,0x50,0xE1,0xB0,0x19,0xD7,0xD1, + 0x1C,0x00,0x9D,0xD5,0x01,0x00,0x40,0xD2,0x00,0x00,0x51,0xD1,0x03,0x00,0x00,0xDA, + 0x8C,0x01,0xD8,0xE5,0x01,0x00,0x40,0xE2,0x5C,0xFC,0xFF,0xEB,0x84,0x01,0x00,0xEA, + 0xBE,0x18,0xD7,0xE1,0x86,0x00,0x8A,0xE0,0x02,0x9C,0x80,0xE2,0x98,0x00,0x8D,0xE5, + 0xBC,0x1D,0xC9,0xE1,0xB0,0x19,0xD7,0xE1,0x03,0x4C,0x80,0xE2,0x00,0x30,0xA0,0xE3, + 0x02,0xCB,0xA0,0xE3,0xBC,0x16,0xC4,0xE1,0x03,0x10,0xA0,0xE1,0x0C,0x20,0xA0,0xE1, + 0x07,0x00,0xA0,0xE3,0x78,0xE6,0x9F,0xE5,0x00,0xE2,0x8E,0xE0,0x86,0xE0,0x8E,0xE0, + 0x94,0xE0,0x8D,0xE5,0x02,0xEC,0x8E,0xE2,0xFC,0xAD,0xDE,0xE1,0x00,0x00,0x5A,0xE3, + 0x03,0x00,0x00,0xDA,0x03,0x00,0x5A,0xE1,0xBC,0x3D,0xDE,0xC1,0x0C,0x00,0x5A,0xE1, + 0xBC,0xCD,0xDE,0xB1,0x94,0xE0,0x9D,0xE5,0x03,0xEC,0x8E,0xE2,0xFC,0xA6,0xDE,0xE1, + 0x00,0x00,0x5A,0xE3,0x03,0x00,0x00,0xDA,0x01,0x00,0x5A,0xE1,0xBC,0x16,0xDE,0xC1, + 0x02,0x00,0x5A,0xE1,0xBC,0x26,0xDE,0xB1,0x01,0x00,0x50,0xE2,0xE8,0xFF,0xFF,0x5A, + 0x0C,0x00,0x43,0xE0,0xF0,0x00,0x50,0xE3,0x02,0x30,0x41,0xD0,0xF0,0x00,0x53,0xD3, + 0x0C,0xC6,0x9F,0xC5,0x01,0x30,0xA0,0xC3,0xD0,0x32,0xCC,0xC5,0x1E,0x00,0x50,0xE3, + 0x02,0x00,0x41,0xB0,0x1E,0x00,0x50,0xB3,0xF4,0x15,0x9F,0xA5,0x00,0x00,0xA0,0xA3, + 0xF1,0x00,0xC1,0xA5,0xE8,0x05,0x9F,0xB5,0x01,0x10,0xA0,0xB3,0xF1,0x10,0xC0,0xB5, + 0xD4,0x02,0xD5,0xE5,0x01,0x00,0x50,0xE3,0x64,0xA0,0xA0,0x93,0x24,0xA0,0x8D,0x95, + 0x0E,0x00,0x00,0x9A,0xFC,0x2D,0xD9,0xE1,0xFC,0x3E,0xD9,0xE1,0x03,0x00,0x42,0xE0, + 0x00,0x00,0x50,0xE3,0x02,0x00,0x43,0xD0,0xFC,0x36,0xD4,0xE1,0xFC,0x27,0xD4,0xE1, + 0x00,0xA8,0xA0,0xE1,0x4A,0xA8,0xA0,0xE1,0x02,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x42,0xD0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x24,0x00,0x8D,0xE5, + 0xFC,0x1E,0xD9,0xE1,0xFC,0x0D,0xD9,0xE1,0xC0,0x0F,0x00,0xEB,0x3C,0x00,0x8D,0xE5, + 0xFC,0x17,0xD4,0xE1,0xFC,0x06,0xD4,0xE1,0xBC,0x0F,0x00,0xEB,0x38,0x00,0x8D,0xE5, + 0xFC,0x1F,0xD9,0xE1,0x3C,0x00,0x9D,0xE5,0xB8,0x0F,0x00,0xEB,0x44,0x00,0x8D,0xE5, + 0xFC,0x18,0xD4,0xE1,0x38,0x00,0x9D,0xE5,0xB4,0x0F,0x00,0xEB,0x40,0x00,0x8D,0xE5, + 0xFC,0x21,0xD4,0xE1,0xFC,0x10,0xD4,0xE1,0x44,0x00,0x9D,0xE5,0xB2,0x0F,0x00,0xEB, + 0x4C,0x00,0x8D,0xE5,0xFC,0x2A,0xD4,0xE1,0xFC,0x19,0xD4,0xE1,0x40,0x00,0x9D,0xE5, + 0xAD,0x0F,0x00,0xEB,0x48,0x00,0x8D,0xE5,0xFC,0x23,0xD4,0xE1,0xFC,0x12,0xD4,0xE1, + 0x4C,0x00,0x9D,0xE5,0xA8,0x0F,0x00,0xEB,0x54,0x00,0x8D,0xE5,0xFC,0x2C,0xD4,0xE1, + 0xFC,0x1B,0xD4,0xE1,0x48,0x00,0x9D,0xE5,0xA3,0x0F,0x00,0xEB,0x50,0x00,0x8D,0xE5, + 0xFC,0x25,0xD4,0xE1,0xFC,0x14,0xD4,0xE1,0x54,0x00,0x9D,0xE5,0x9E,0x0F,0x00,0xEB, + 0x5C,0x00,0x8D,0xE5,0xFC,0x2E,0xD4,0xE1,0xFC,0x1D,0xD4,0xE1,0x50,0x00,0x9D,0xE5, + 0x99,0x0F,0x00,0xEB,0x58,0x00,0x8D,0xE5,0x24,0x10,0x9D,0xE5,0x0A,0x00,0xA0,0xE1, + 0x3D,0x04,0x00,0xEB,0xC8,0x34,0x9F,0xE5,0x01,0x10,0xA0,0xE3,0x01,0x22,0x83,0xE0, + 0x86,0x20,0x82,0xE0,0x01,0x2B,0x82,0xE2,0xBC,0xC1,0xD2,0xE1,0x01,0x10,0x51,0xE2, + 0xBC,0xC2,0xC2,0xE1,0xF8,0xFF,0xFF,0x5A,0x98,0x10,0x9D,0xE5,0x01,0x1B,0x81,0xE2, + 0xBC,0x01,0xC1,0xE1,0x14,0x14,0xD5,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x20,0x51,0xE2, + 0x06,0x00,0x00,0xBA,0x01,0xC2,0x83,0xE0,0x86,0xC0,0x8C,0xE0,0x01,0xCB,0x8C,0xE2, + 0xFC,0xC1,0xDC,0xE1,0x01,0x10,0x51,0xE2,0x0C,0x00,0x80,0xE0,0xF8,0xFF,0xFF,0x5A, + 0x01,0x10,0x82,0xE2,0x6D,0xF3,0xFF,0xEB,0x84,0x10,0x9D,0xE5,0x00,0xA0,0xA0,0xE1, + 0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0xD3,0x0B,0x00,0x00,0xDA,0x7C,0x00,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x02,0x00,0xA0,0xD3,0x07,0x00,0x00,0xDA,0x74,0x00,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x03,0x00,0xA0,0xD3,0x03,0x00,0x00,0xDA,0x6C,0x00,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x05,0x00,0xA0,0xC3,0x04,0x00,0xA0,0xD3,0x0C,0x14,0xD5,0xE5, + 0x01,0x10,0x40,0xE0,0x00,0x00,0x51,0xE3,0x00,0x00,0x6B,0xE2,0x06,0x00,0x00,0xDA, + 0xFC,0x1F,0xD4,0xE1,0x0B,0x00,0x51,0xE1,0x01,0x00,0x00,0x1A,0x00,0x10,0xA0,0xE3, + 0x06,0x00,0x00,0xEA,0x01,0x10,0x81,0xE2,0x04,0x00,0x00,0xEA,0xFC,0x1F,0xD4,0xE1, + 0x04,0x00,0x00,0xAA,0x00,0x00,0x51,0xE1,0xF7,0xFF,0xFF,0x0A,0x01,0x10,0x41,0xE2, + 0xBC,0x1F,0xC4,0xE1,0x02,0x00,0x00,0xEA,0x00,0x00,0x51,0xE3,0xFA,0xFF,0xFF,0xCA, + 0xF3,0xFF,0xFF,0xBA,0xFC,0x3F,0xD4,0xE1,0x0B,0x00,0x53,0xE1,0x03,0x00,0x00,0x1A, + 0x0C,0x14,0xD5,0xE5,0x05,0x00,0x51,0xE3,0x01,0x00,0x81,0x32,0x05,0x00,0x00,0x3A, + 0x00,0x00,0x53,0xE1,0x04,0x00,0x00,0x1A,0x0C,0x04,0xD5,0xE5,0x01,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x9A,0x01,0x00,0x40,0xE2,0x0C,0x04,0xC5,0xE5,0x58,0x30,0x8D,0xE2, + 0x09,0x00,0x93,0xE8,0x60,0x00,0x8D,0xE5,0xD4,0x02,0xD5,0xE5,0x00,0x10,0xA0,0xE1, + 0x90,0x00,0x8D,0xE5,0x8C,0x00,0x8D,0xE5,0x03,0x00,0xA0,0xE1,0x2F,0xF3,0xFF,0xEB, + 0x34,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x60,0x00,0x9D,0xE5,0x8C,0x10,0x9D,0xE5, + 0x2A,0xF3,0xFF,0xEB,0x30,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x0C,0x04,0xD5,0xE5, + 0x01,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x5C,0x20,0x9D,0xE5,0x58,0x30,0x9D,0xE5, + 0x09,0x10,0xA0,0xE3,0x90,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0xD4,0x02,0xD5,0xE5,0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5, + 0x07,0x10,0xA0,0xE3,0x88,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1, + 0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x88,0x20,0x9D,0xE5, + 0x84,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2,0x60,0x00,0x00,0xEA,0x02,0x00,0x50,0xE3, + 0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0x90,0x00,0x9D,0xE5,0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5,0x07,0x10,0xA0,0xE3, + 0x75,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0xD4,0x02,0xD5,0xE5,0x4C,0x20,0x9D,0xE5,0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3, + 0x6D,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1, + 0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x80,0x20,0x9D,0xE5,0x7C,0x30,0x9D,0xE5, + 0x63,0x0F,0x88,0xE2,0x45,0x00,0x00,0xEA,0x03,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A, + 0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5, + 0x4C,0x20,0x9D,0xE5,0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3,0x5A,0x11,0x00,0xEB, + 0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xD4,0x02,0xD5,0xE5, + 0x44,0x20,0x9D,0xE5,0x40,0x30,0x9D,0xE5,0x03,0x10,0xA0,0xE3,0x52,0x11,0x00,0xEB, + 0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1, + 0x0F,0x00,0x8D,0xE8,0x78,0x20,0x9D,0xE5,0x74,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2, + 0x2A,0x00,0x00,0xEA,0x04,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2, + 0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x44,0x20,0x9D,0xE5, + 0x40,0x30,0x9D,0xE5,0x03,0x10,0xA0,0xE3,0x3F,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2, + 0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xD4,0x02,0xD5,0xE5,0x3C,0x20,0x9D,0xE5, + 0x38,0x30,0x9D,0xE5,0x02,0x10,0xA0,0xE3,0x37,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1, + 0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8, + 0x70,0x20,0x9D,0xE5,0x6C,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2,0x0F,0x00,0x00,0xEA, + 0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5, + 0x3C,0x20,0x9D,0xE5,0x38,0x30,0x9D,0xE5,0x02,0x10,0xA0,0xE3,0x26,0x11,0x00,0xEB, + 0xFC,0x0D,0xD9,0xE1,0xFC,0x16,0xD4,0xE1,0xF0,0x33,0xDD,0xE1,0xF4,0x23,0xDD,0xE1, + 0x0F,0x00,0x8D,0xE8,0x68,0x20,0x9D,0xE5,0x64,0x30,0x9D,0xE5,0x63,0x0F,0x88,0xE2, + 0x0A,0x10,0xA0,0xE1,0x2E,0x11,0x00,0xEB,0xD4,0x02,0xD5,0xE5,0x50,0x11,0x9F,0xE5, + 0x09,0x00,0x50,0xE3,0x01,0x00,0x80,0x32,0xD4,0x02,0xC5,0x35,0x14,0x04,0xD5,0xE5, + 0x02,0x00,0x50,0xE3,0x01,0x00,0x80,0x32,0x14,0x04,0xC5,0x35,0x8C,0x01,0xD8,0xE5, + 0x01,0x00,0x40,0xE2,0x00,0x01,0x81,0xE0,0x01,0x4B,0x80,0xE2,0xFC,0x04,0xD4,0xE1, + 0x01,0x00,0x70,0xE3,0xFE,0x14,0xD4,0xC1,0x01,0x00,0x71,0xC3,0x18,0x00,0x00,0xDA, + 0x14,0x10,0x9D,0xE5,0x64,0x50,0x61,0xE2,0x95,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3, + 0x92,0xF2,0xFF,0xEB,0x00,0x80,0xA0,0xE1,0xBE,0x08,0xD7,0xE1,0x14,0x10,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x24,0xF3,0xFF,0xEB,0x08,0x00,0x80,0xE0, + 0xBE,0x08,0xC7,0xE1,0xFE,0x04,0xD4,0xE1,0x64,0x10,0xA0,0xE3,0x95,0x00,0x00,0xE0, + 0x86,0xF2,0xFF,0xEB,0x00,0x50,0xA0,0xE1,0xB0,0x09,0xD7,0xE1,0x14,0x10,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x18,0xF3,0xFF,0xEB,0x05,0x00,0x80,0xE0, + 0xB0,0x09,0xC7,0xE1,0xBE,0x08,0xD7,0xE1,0xBC,0x04,0xC4,0xE1,0xB0,0x09,0xD7,0xE1, + 0xBE,0x04,0xC4,0xE1,0x01,0x60,0x86,0xE2,0x08,0x00,0x56,0xE3,0x48,0xFE,0xFF,0xBA, + 0x8C,0x30,0x9F,0xE5,0x88,0x21,0xD3,0xE5,0x00,0x00,0x83,0xE2,0x01,0x1C,0x80,0xE2, + 0x01,0x00,0x52,0xE3,0x02,0x0C,0x80,0xE2,0x10,0x00,0x00,0x1A,0x96,0x21,0xD3,0xE5, + 0x82,0x30,0x83,0xE0,0x02,0x2C,0x83,0xE2,0xBA,0xCD,0xD2,0xE1,0x03,0x3C,0x83,0xE2, + 0xB4,0xCC,0xC0,0xE1,0xBA,0xC6,0xD3,0xE1,0xB6,0xCC,0xC0,0xE1,0xBA,0x2E,0xD2,0xE1, + 0xB8,0x2C,0xC0,0xE1,0xBA,0x27,0xD3,0xE1,0xBA,0x2C,0xC0,0xE1,0xB8,0x29,0xD1,0xE1, + 0xBC,0x2B,0xC0,0xE1,0xBA,0x19,0xD1,0xE1,0xBE,0x1B,0xC0,0xE1,0x2D,0xFE,0xFF,0xEA, + 0x02,0x00,0x52,0xE3,0x2B,0xFE,0xFF,0x1A,0xB8,0x29,0xD1,0xE1,0xBC,0x2B,0xC0,0xE1, + 0xBA,0x29,0xD1,0xE1,0xBE,0x2B,0xC0,0xE1,0xB2,0x2A,0xD1,0xE1,0xB0,0x2C,0xC0,0xE1, + 0xB4,0x1A,0xD1,0xE1,0xB2,0x1C,0xC0,0xE1,0x22,0xFE,0xFF,0xEA,0x00,0x93,0x00,0x00, + 0x78,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E, + 0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B,0x1B,0x7B,0x9E,0x46,0x19,0x4B,0x1E,0x78, + 0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E, + 0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98, + 0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1, + 0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1, + 0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42, + 0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0x00,0x93,0x00,0x00, + 0xE0,0x04,0x00,0x20,0x6D,0x05,0x00,0x20,0x0E,0x23,0x58,0x43,0x02,0x4A,0x40,0x18, + 0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x31,0x49,0x10,0xB5, + 0x4A,0x7E,0x31,0x49,0x00,0x20,0x00,0x2A,0x15,0xD1,0x0A,0x89,0x00,0x2A,0x0F,0xD0, + 0x2E,0x49,0x8A,0x42,0x0C,0xD0,0x10,0x00,0x1E,0x21,0x48,0x43,0x64,0x21,0xFC,0xF7, + 0x75,0xFD,0xFF,0x30,0x4B,0x21,0x91,0x30,0xC9,0x00,0x88,0x42,0x00,0xD9,0x08,0x00, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x88,0x89,0x01,0x21,0x49,0x07,0x89,0x68,0x22,0x4B, + 0x89,0x00,0x9B,0x89,0x0A,0x0F,0x22,0x49,0x59,0x18,0x01,0x2A,0x1A,0xD1,0x21,0x4A, + 0x21,0x4C,0x91,0x42,0x07,0xD8,0x21,0x1A,0x08,0x00,0x48,0x43,0x51,0x1C,0xFC,0xF7, + 0x55,0xFD,0x20,0x1A,0x08,0xE0,0xA0,0x42,0x06,0xD9,0x1B,0x4A,0x03,0x21,0x52,0x42, + 0x80,0x18,0xFC,0xF7,0x4B,0xFD,0x00,0x19,0x7D,0x24,0x24,0x01,0xA0,0x42,0xD7,0xD9, + 0x0D,0x21,0x1B,0xE0,0x02,0x2A,0xD3,0xD1,0x13,0x4A,0x14,0x4C,0x15,0x3A,0x91,0x42, + 0x07,0xD8,0x21,0x1A,0x08,0x00,0x48,0x43,0x51,0x1C,0xFC,0xF7,0x37,0xFD,0x20,0x1A, + 0x08,0xE0,0xA0,0x42,0x06,0xD9,0x0D,0x4A,0x03,0x21,0x52,0x42,0x80,0x18,0xFC,0xF7, + 0x2D,0xFD,0x00,0x19,0x0A,0x4C,0xA0,0x42,0xBA,0xD9,0x11,0x21,0xFC,0xF7,0x26,0xFD, + 0x60,0x1A,0xB5,0xE7,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x2F,0xFD,0xFF,0xFF,0x0B,0x03,0x00,0x00,0xDC,0x05,0x00,0x00,0x98,0x08,0x00,0x00, + 0xB8,0x0B,0x00,0x00,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47, + 0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D, + 0x00,0x24,0x01,0x21,0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68, + 0x6A,0x60,0x05,0xE0,0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18, + 0x02,0x00,0x40,0x1E,0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0x03,0xF0,0xC7,0xFB,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06, + 0xFC,0xD4,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5, + 0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5, + 0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5, + 0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A, + 0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA, + 0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5, + 0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3, + 0x10,0x40,0xBD,0x08,0xB4,0x0D,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3, + 0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A,0xAB,0x0D,0x00,0xEB,0xD2,0xFF,0xFF,0xEA, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69, + 0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48, + 0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E, + 0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1, + 0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0, + 0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0, + 0x29,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69, + 0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5, + 0x03,0xF0,0x18,0xFB,0xC3,0xE7,0x00,0x00,0x66,0x05,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29,0x80,0x7B,0x01,0xD1,0x01,0x25,0x03,0xE0, + 0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x13,0x27, + 0xBF,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x00,0x1F, + 0xFC,0xF7,0x30,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00, + 0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19,0x36,0x7F,0x9E,0x42,0x01,0xD1,0x04,0x00, + 0x02,0xE0,0x40,0x1C,0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18, + 0xF6,0x19,0x36,0x7F,0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x77,0xED,0xE7, + 0x40,0x1C,0x08,0x28,0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18, + 0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00, + 0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7F,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23, + 0xE4,0x19,0x23,0x77,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x02,0xE0,0x40,0x1C,0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20, + 0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0x20,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0x03,0x22,0x12,0x07,0xD3,0x68,0x01,0x21,0x81,0x40,0x0B,0x43, + 0xD3,0x60,0x50,0x68,0x08,0x42,0x01,0xD0,0x01,0x48,0x01,0x63,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x30,0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43, + 0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C, + 0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60, + 0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50, + 0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47,0xF8,0x05,0x00,0x20,0xF0,0xB5,0x87,0xB0, + 0xFE,0xF7,0xC4,0xFA,0xFE,0xF7,0xA2,0xFA,0x02,0xF0,0x02,0xF8,0x03,0xF0,0xCE,0xF8, + 0x00,0xF0,0x6A,0xFE,0x00,0xF0,0xC0,0xFB,0xFD,0xF7,0x26,0xFF,0xFD,0xF7,0x60,0xF8, + 0x39,0x48,0x00,0x68,0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x4C,0xF9, + 0xFF,0xF7,0xFE,0xF8,0x03,0xE0,0xFF,0xF7,0xFB,0xF8,0xFF,0xF7,0x45,0xF9,0x01,0x27, + 0x7F,0x07,0x78,0x68,0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x78,0x60, + 0x03,0xF0,0x2A,0xFC,0x03,0xF0,0x76,0xFA,0x38,0x68,0x00,0x28,0x07,0xD0,0x78,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x3E,0x68,0x02,0x24,0x76,0x1C,0x37,0xE0,0x01,0x24, + 0x26,0x00,0xA0,0x00,0xC0,0x19,0x06,0x90,0x05,0x68,0xA8,0x01,0x80,0x0D,0x05,0x90, + 0xA8,0x05,0x80,0x0D,0x04,0x90,0x21,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9, + 0x05,0xA8,0x03,0xF0,0x9D,0xFA,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x05,0xA8,0x04,0xF0,0xFD,0xFA,0x04,0xA9,0x05,0xA8,0x04,0xF0,0x12,0xF9, + 0x14,0x48,0x04,0x99,0x05,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x05,0x43, + 0xA8,0x0A,0x80,0x02,0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xB4,0x42, + 0xC7,0xD9,0xFD,0xF7,0x6F,0xFD,0x03,0xF0,0xFD,0xF9,0x38,0x68,0xFC,0xF7,0x4A,0xFC, + 0xFF,0xF7,0xCC,0xFE,0xFC,0xF7,0x7E,0xFB,0x04,0xF0,0x9E,0xF9,0x06,0x48,0x40,0x79, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x78,0x06,0x00,0x20,0x74,0x05,0x00,0x20, + 0x00,0x93,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xF8,0xB5,0x03,0xF0, + 0x29,0xF8,0x29,0x48,0x29,0x4D,0x00,0x7C,0x41,0x1E,0xFF,0x29,0x00,0xD3,0x00,0x20, + 0xFE,0xF7,0xE6,0xF8,0x28,0x72,0x26,0x48,0x01,0x69,0xFF,0x22,0x12,0x02,0x91,0x43, + 0x01,0x61,0x01,0x69,0x2A,0x7A,0x12,0x02,0x11,0x43,0x01,0x61,0xFE,0xF7,0xC4,0xFC, + 0xFE,0xF7,0x40,0xFD,0xFE,0xF7,0x88,0xFD,0x1B,0x48,0x60,0x38,0xC0,0x7F,0x04,0xF0, + 0x53,0xF8,0x1C,0x4F,0xFC,0x03,0x00,0x20,0x28,0x70,0x68,0x62,0x28,0x7B,0x00,0x28, + 0x1D,0xD0,0x01,0x26,0x18,0xE0,0x78,0x68,0x00,0x07,0x15,0xD5,0xA6,0x63,0xF8,0x68, + 0x07,0x28,0x09,0xD1,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0,0x83,0xF9,0xFF,0xF7, + 0x1B,0xF8,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68, + 0x80,0x07,0xFC,0xD5,0x03,0xF0,0x76,0xF9,0xE0,0x6B,0x0B,0x28,0xE3,0xD1,0xFE,0xF7, + 0xDD,0xF8,0x28,0x78,0x00,0x28,0xD6,0xD0,0x02,0xF0,0x1C,0xFD,0xD3,0xE7,0x78,0x68, + 0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x00,0x60,0x93,0x00,0x00,0x64,0x05,0x00,0x20, + 0x00,0x90,0x00,0x40,0x00,0x40,0x00,0x30,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x70,0xB5,0x05,0x00,0x1A,0x48,0x1B,0x4A,0x00,0x68,0x12,0x8B,0x60,0x30,0x01,0x7E, + 0xC0,0x7D,0x2C,0x78,0x89,0x18,0x0E,0x06,0x17,0x49,0x36,0x0E,0x8A,0x7E,0x00,0x2A, + 0x0D,0xD1,0xC9,0x7E,0x01,0x29,0x01,0xD1,0x40,0x1D,0x06,0xE0,0x02,0x29,0x01,0xD1, + 0x0A,0x30,0x02,0xE0,0x03,0x29,0x02,0xD1,0x0F,0x30,0x00,0x06,0x00,0x0E,0x00,0x2C, + 0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7,0x57,0xFA,0x76,0x1C, + 0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70,0x01,0x20,0xF4,0xE7, + 0x78,0x06,0x00,0x20,0x40,0x05,0x00,0x20,0xE0,0x02,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x03,0x2D,0xE9,0x8C,0x50,0x9F,0xE5,0x08,0x10,0xA0,0xE3,0x24,0x60,0x85,0xE2, + 0x40,0x70,0x46,0xE2,0x12,0x80,0x87,0xE2,0x00,0x40,0xE0,0xE3,0x00,0x30,0xA0,0xE3, + 0x52,0x90,0x88,0xE2,0x01,0x01,0x85,0xE0,0xB0,0x40,0xC0,0xE1,0xB2,0x40,0xC0,0xE1, + 0x01,0x01,0x86,0xE0,0xB0,0x40,0xC0,0xE1,0xB2,0x40,0xC0,0xE1,0x81,0x00,0x87,0xE0, + 0xB0,0x30,0xC0,0xE1,0x00,0x00,0xA0,0xE3,0x01,0xC1,0x89,0xE0,0x01,0x30,0xC8,0xE7, + 0x00,0x21,0x8C,0xE0,0xB0,0x30,0xC2,0xE1,0x01,0x00,0x50,0xE2,0xB2,0x30,0xC2,0xE1, + 0xFA,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xED,0xFF,0xFF,0x5A,0x28,0x20,0x9F,0xE5, + 0x01,0x10,0xA0,0xE3,0xB1,0x00,0xD2,0xE5,0x01,0x00,0x50,0xE3,0x02,0x00,0x00,0x8A, + 0x00,0x00,0x50,0xE3,0xF0,0x03,0xBD,0x18,0x1E,0xFF,0x2F,0x11,0xB1,0x10,0xC2,0xE5, + 0xF0,0x03,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x6C,0x09,0x00,0x20,0x00,0x93,0x00,0x00, + 0x10,0xB5,0x07,0x4C,0x07,0x48,0x22,0x00,0x00,0x21,0xFC,0xF7,0x0B,0xFA,0x06,0x48, + 0x22,0x00,0x00,0x21,0xFC,0xF7,0x06,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xD2,0x02,0x00,0x00,0x00,0x00,0x00,0x10,0x7E,0x06,0x00,0x20,0x10,0xB5,0x40,0x22, + 0xD4,0x05,0x00,0x21,0x20,0x00,0xFC,0xF7,0xF5,0xF9,0x01,0x20,0xA0,0x63,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00, + 0xFC,0xF7,0x12,0xFA,0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48, + 0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19,0xFC,0xF7,0x0C,0xFA,0x0D,0x48,0x00,0x21, + 0x84,0x08,0x0D,0x48,0xA2,0x00,0xFC,0xF7,0xF3,0xF9,0x0A,0x48,0x80,0x07,0x07,0xD0, + 0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0xFC,0xF7,0xCA,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xEC,0x8A,0x00,0x00, + 0x40,0x00,0x00,0x20,0x98,0x09,0x00,0x00,0x40,0x00,0x00,0x20,0x05,0x49,0xC8,0x05, + 0x41,0x62,0x05,0x49,0x81,0x62,0x05,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61, + 0x70,0x47,0x00,0x00,0x80,0x88,0x3C,0x03,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40, + 0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00, + 0x00,0x40,0x00,0x30,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE3, + 0x04,0x00,0xA0,0xE1,0x7D,0xF8,0xFF,0xEB,0x01,0x40,0x84,0xE2,0x08,0x00,0x54,0xE3, + 0xFA,0xFF,0xFF,0xBA,0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x01,0x24, + 0x64,0x03,0x20,0x00,0xFC,0xF7,0x1A,0xFE,0xFE,0xF7,0xA8,0xFB,0xFE,0xF7,0x82,0xFB, + 0xFE,0xF7,0xAC,0xFB,0xFE,0xF7,0xA2,0xFB,0xFE,0xF7,0x74,0xFB,0x07,0x48,0x01,0x68, + 0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60, + 0x20,0x00,0xFC,0xF7,0xFB,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40, + 0x00,0x93,0x00,0x00,0x10,0xB5,0x02,0xF0,0x77,0xFE,0x02,0xF0,0x69,0xFE,0x02,0xF0, + 0x5F,0xFE,0xFF,0x20,0xFC,0xF7,0x2A,0xFE,0xFF,0xF7,0xA0,0xFF,0x13,0x48,0x80,0x22, + 0x00,0x21,0xFC,0xF7,0x75,0xF9,0x08,0x20,0xFC,0xF7,0xE8,0xFD,0x00,0x22,0x10,0x49, + 0xD2,0x43,0x00,0x20,0xFF,0xF7,0x9E,0xFD,0x00,0xF0,0x20,0xF8,0x0D,0x48,0x40,0x7A, + 0x00,0x28,0x04,0xD0,0x40,0x20,0xFC,0xF7,0xD9,0xFD,0x00,0xF0,0x53,0xF8,0x00,0xF0, + 0x3D,0xF8,0x10,0x20,0x02,0xF0,0x49,0xFE,0x07,0x49,0xC8,0x69,0xCA,0x13,0x90,0x43, + 0xC8,0x61,0xFE,0xF7,0x03,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x05,0x00,0x20, + 0x02,0x03,0x0F,0x0F,0x00,0x93,0x00,0x00,0x00,0x70,0x00,0x40,0xF8,0xB5,0x03,0x24, + 0xE6,0x01,0x13,0x25,0x30,0x00,0xFC,0xF7,0xB9,0xFD,0x20,0x02,0xFC,0xF7,0xE0,0xFD, + 0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7,0xF9,0xF8,0x02,0x00,0xFF,0x21,0x90,0x31, + 0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0,0x21,0xFF,0x07,0x4A,0x27,0x21,0x03,0x20, + 0x00,0x23,0x00,0x94,0x03,0xF0,0x1A,0xFF,0x30,0x00,0xFC,0xF7,0x97,0xFD,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x07,0x49, + 0x00,0x20,0xFF,0xF7,0x61,0xFD,0x04,0xF0,0xBD,0xF8,0x05,0x48,0x04,0xF0,0xB4,0xF8, + 0x00,0x20,0xFF,0xF7,0x3F,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x6D,0x88,0x00,0x00, + 0xC8,0x32,0x00,0x00,0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42, + 0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7,0xC1,0xF8,0x64,0x30,0x01,0xE0,0xFF,0x20, + 0xF5,0x30,0xA0,0x65,0x04,0xF0,0x6E,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x93,0x00,0x00,0x07,0xA5,0x07,0x00,0x64,0x05,0x00,0x20,0x10,0xB5,0xFF,0xF7, + 0xBF,0xFE,0x12,0x48,0x00,0x7A,0x03,0xF0,0x23,0xFE,0xFF,0xF7,0x2B,0xFF,0x0F,0x48, + 0x0F,0x4A,0xA0,0x30,0x41,0x89,0xD1,0x83,0x0E,0x49,0x0F,0x4A,0x09,0x68,0x40,0x31, + 0x49,0x7D,0x51,0x74,0x01,0x00,0x20,0x39,0x0A,0x8B,0x0B,0x49,0xA0,0x31,0x0A,0x61, + 0x00,0x88,0x48,0x61,0xFF,0xF7,0x52,0xFE,0x08,0x48,0x00,0x24,0xC4,0x80,0xFE,0xF7, + 0xD5,0xF9,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x40,0x00,0x00,0x20,0x78,0x06,0x00,0x20,0xA0,0x04,0x00,0x20,0xC0,0x01,0x00,0x20, + 0x65,0x05,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90,0x00,0x20,0x2B,0x4E, + 0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0x86,0xFA,0xFE,0xF7,0x34,0xFB, + 0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F,0x00,0x25,0x00,0x90, + 0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0x8F,0xFA,0x00,0x28,0x1B,0xD0,0x0E,0x21, + 0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A, + 0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98, + 0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00, + 0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3,0x6D,0x1C,0x15,0x2D, + 0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0,0x07,0x98,0x07,0x60, + 0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF, + 0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x98,0xC0,0x9F,0xE5, + 0x00,0x00,0x9C,0xE5,0x94,0x30,0x9F,0xE5,0x7E,0x04,0xD3,0xE5,0x01,0x00,0x00,0xE2, + 0x00,0x00,0x50,0xE3,0x7F,0x14,0xD3,0x15,0x00,0x00,0xA0,0x13,0x00,0x00,0x51,0x13, + 0x1E,0xFF,0x2F,0x91,0x30,0x00,0x2D,0xE9,0x74,0x50,0x9F,0xE5,0x74,0x40,0x9F,0xE5, + 0x7E,0x24,0xD3,0xE5,0x00,0x10,0x83,0xE0,0xAD,0x14,0xD1,0xE5,0x02,0x00,0x12,0xE3, + 0xAC,0x24,0xD3,0xE5,0x82,0x21,0x62,0x00,0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10, + 0x81,0x10,0x82,0x10,0x00,0x20,0xD5,0xE5,0x00,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A, + 0x01,0x11,0x9C,0xE7,0x80,0x20,0x83,0xE0,0x02,0x19,0xC1,0xE3,0xB0,0x11,0xC2,0xE1, + 0x03,0x00,0x00,0xEA,0x81,0x10,0x84,0xE0,0xB0,0x10,0xD1,0xE1,0x80,0x20,0x83,0xE0, + 0xB0,0x11,0xC2,0xE1,0x7F,0x14,0xD3,0xE5,0x01,0x00,0x80,0xE2,0x00,0x00,0x51,0xE1, + 0xE6,0xFF,0xFF,0x8A,0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40, + 0x40,0x00,0x00,0x20,0x64,0x05,0x00,0x20,0x7E,0x06,0x00,0x20,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42, + 0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7, + 0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x85,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0xF8,0x01,0x8D,0xE5,0x14,0x05,0x9F,0xE5, + 0x6C,0x60,0x8D,0xE2,0xBE,0x03,0x90,0xE8,0xBE,0x03,0x86,0xE8,0x08,0x05,0x9F,0xE5, + 0x69,0x20,0xA0,0xE3,0x00,0x00,0x90,0xE5,0x01,0x2C,0x82,0xE2,0xBC,0x45,0xD0,0xE1, + 0x62,0x50,0xD0,0xE5,0x00,0x10,0xA0,0xE3,0x8C,0x00,0x8D,0xE2,0xDB,0xEF,0xFF,0xEB, + 0xE8,0x04,0x9F,0xE5,0x08,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD7,0xEF,0xFF,0xEB, + 0xDC,0x04,0x9F,0xE5,0x10,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD3,0xEF,0xFF,0xEB, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x48,0x00,0x8D,0xE2,0xCF,0xEF,0xFF,0xEB, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x24,0x00,0x8D,0xE2,0xCB,0xEF,0xFF,0xEB, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x0D,0x00,0xA0,0xE1,0xC7,0xEF,0xFF,0xEB, + 0xA0,0x14,0x9F,0xE5,0x04,0x00,0xD1,0xE5,0x00,0x00,0x50,0xE3,0x85,0xDF,0x8D,0x02, + 0xF0,0x4F,0xBD,0x08,0x1E,0xFF,0x2F,0x01,0xB6,0x00,0xD1,0xE1,0x20,0x00,0x10,0xE3, + 0x05,0x00,0x44,0x10,0x00,0x48,0xA0,0x11,0xB8,0x00,0xD1,0xE1,0x24,0x48,0xA0,0x11, + 0x74,0x24,0x9F,0xE5,0x94,0x00,0x00,0xE0,0x92,0x30,0xC0,0xE0,0xC0,0x22,0xA0,0xE1, + 0xC0,0x0F,0x42,0xE0,0x64,0x24,0x9F,0xE5,0x00,0x40,0xA0,0xE3,0x10,0x22,0x8D,0xE5, + 0xBE,0x20,0xD1,0xE1,0x02,0x00,0x80,0xE0,0x10,0x22,0x9D,0xE5,0xBE,0x07,0xC2,0xE1, + 0x04,0x00,0xA0,0xE1,0x04,0x42,0x8D,0xE5,0x80,0x01,0x60,0xE0,0x00,0x70,0xA0,0xE3, + 0x0C,0x02,0x8D,0xE5,0x0C,0x12,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x81,0x20,0x87,0xE0, + 0x2C,0x14,0x9F,0xE5,0x82,0xC0,0x81,0xE0,0x10,0x12,0x9D,0xE5,0xF0,0x30,0xDC,0xE1, + 0xFE,0x17,0xD1,0xE1,0x01,0x00,0x53,0xE1,0x01,0x00,0x43,0xC0,0x00,0x08,0xA0,0xC1, + 0x40,0x08,0xA0,0xC1,0x00,0x00,0x57,0xE3,0x06,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3, + 0x83,0x00,0x00,0x0A,0x8C,0x00,0x8D,0xE2,0x02,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3, + 0x7F,0x00,0x00,0x1A,0x0C,0x00,0x00,0xEA,0xF2,0x30,0x5C,0xE1,0x01,0x00,0x53,0xE1, + 0x03,0x00,0x00,0xDA,0x01,0x10,0x43,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xB0,0xE1, + 0x77,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0x75,0x00,0x00,0x0A,0x8C,0x00,0x8D,0xE2, + 0x02,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3,0x71,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5, + 0x07,0x38,0xA0,0xE1,0x00,0xC8,0xA0,0xE1,0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1, + 0x44,0x48,0xA0,0xE1,0x08,0x00,0x54,0xE3,0x43,0x38,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1, + 0x04,0x10,0xA0,0xE3,0x00,0x60,0xA0,0xD3,0x00,0x32,0x8D,0xE5,0xFC,0xC1,0x8D,0xE5, + 0x03,0x00,0x00,0xDA,0x01,0x00,0x44,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1, + 0x6A,0x00,0x00,0xEA,0x04,0x0C,0xA0,0xE1,0x40,0x0C,0xA0,0xE1,0x08,0x02,0x8D,0xE5, + 0x50,0x03,0x9F,0xE5,0x84,0x00,0x80,0xE0,0x01,0xAC,0x80,0xE2,0x01,0x00,0x86,0xE2, + 0x00,0x68,0xA0,0xE1,0x46,0x68,0xA0,0xE1,0x09,0x0D,0x56,0xE3,0x00,0x80,0xA0,0xE3, + 0x53,0x00,0x00,0xCA,0x10,0x02,0x9D,0xE5,0x00,0x90,0xA0,0xE3,0xFE,0x57,0xD0,0xE1, + 0x6C,0x00,0x8D,0xE2,0x01,0x01,0x80,0xE0,0xB2,0x20,0xD0,0xE1,0xB0,0x00,0xD0,0xE1, + 0x0C,0x20,0x82,0xE0,0x02,0x28,0xA0,0xE1,0x03,0x00,0x80,0xE0,0x42,0x28,0xA0,0xE1, + 0x00,0x08,0xA0,0xE1,0x15,0x00,0x52,0xE3,0x40,0x08,0xA0,0xE1,0x15,0x00,0x00,0x2A, + 0x00,0x00,0x50,0xE3,0x13,0x00,0x00,0xBA,0x0E,0x00,0x50,0xE3,0x11,0x00,0x00,0xAA, + 0xEC,0xE2,0x9F,0xE5,0x82,0xB1,0x62,0xE0,0x8B,0xB0,0x80,0xE0,0x8B,0xE0,0x8E,0xE0, + 0xF0,0xE0,0xDE,0xE1,0x05,0x00,0x5E,0xE1,0x0A,0x00,0x00,0xDA,0x8C,0xE0,0x8D,0xE2, + 0xDB,0xB0,0x9E,0xE1,0x04,0x00,0x5B,0xE1,0x00,0x00,0x5B,0x13,0x05,0x00,0x00,0x1A, + 0xFC,0x91,0x9D,0xE5,0x09,0x00,0x52,0xE1,0x00,0x92,0x9D,0x05,0x09,0x00,0x50,0x01, + 0x01,0x80,0xA0,0x13,0x04,0x00,0x00,0xEA,0x01,0x90,0x89,0xE2,0x01,0x10,0x81,0xE2, + 0x08,0x00,0x59,0xE3,0x07,0x10,0x01,0xE2,0xD8,0xFF,0xFF,0xBA,0x8C,0x91,0x6C,0xE0, + 0x89,0x90,0x83,0xE0,0x8C,0xE0,0x8D,0xE2,0x09,0xB0,0xDE,0xE7,0x00,0x00,0x5B,0xE3, + 0x1C,0x00,0x00,0x1A,0x08,0xB2,0x9D,0xE5,0x09,0xB0,0xCE,0xE7,0x70,0xB2,0x9F,0xE5, + 0x48,0xE0,0x8D,0xE2,0x89,0x90,0x8B,0xE0,0xF0,0x90,0xD9,0xE1,0x04,0xB1,0x9E,0xE7, + 0x05,0x00,0x59,0xE1,0x05,0x50,0x49,0xC0,0x48,0x92,0x9F,0xE5,0x05,0x58,0xA0,0xC1, + 0x83,0x30,0x89,0xE0,0xB0,0x32,0xD3,0xE1,0x00,0x50,0xA0,0xD3,0x25,0x58,0xA0,0xC1, + 0x95,0xB3,0x23,0xE0,0x04,0x31,0x8E,0xE7,0x8C,0xC0,0x89,0xE0,0xB4,0xC5,0xDC,0xE1, + 0x24,0x30,0x8D,0xE2,0x04,0xB1,0x93,0xE7,0x95,0xBC,0x2C,0xE0,0x04,0xC1,0x83,0xE7, + 0x04,0xC1,0x9D,0xE7,0x05,0xC0,0x8C,0xE0,0x04,0xC1,0x8D,0xE7,0xBE,0x36,0xDA,0xE1, + 0x01,0x30,0x83,0xE2,0xBE,0x36,0xCA,0xE1,0x00,0x00,0x58,0xE3,0x04,0x00,0x00,0x0A, + 0xFF,0x30,0x00,0xE2,0x05,0x00,0x81,0xE2,0xFF,0xC0,0x02,0xE2,0x07,0x10,0x00,0xE2, + 0xA5,0xFF,0xFF,0xEA,0x01,0x70,0x87,0xE2,0x0E,0x00,0x57,0xE3,0x68,0xFF,0xFF,0xBA, + 0xF8,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5, + 0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0x04,0x02,0x8D,0xE5,0x5D,0xFF,0xFF,0xBA, + 0x00,0x00,0x54,0xE3,0x49,0x00,0x00,0xDA,0xA8,0x51,0x9F,0xE5,0x00,0x30,0xA0,0xE3, + 0x48,0x60,0x8D,0xE2,0x24,0xE0,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x83,0xA0,0x85,0xE0, + 0x83,0xB1,0x63,0xE0,0x98,0x01,0x9F,0xE5,0x8B,0xC0,0x82,0xE0,0x8C,0x70,0x80,0xE0, + 0x10,0x02,0x9D,0xE5,0xF2,0x70,0xD7,0xE1,0xFE,0x07,0xD0,0xE1,0x00,0x10,0xA0,0xE3, + 0x00,0x00,0x57,0xE1,0x00,0x00,0x47,0xC0,0x00,0x18,0xA0,0xC1,0x8C,0x70,0x8D,0xE2, + 0xDC,0x00,0x97,0xE1,0x07,0xC0,0x8C,0xE0,0x01,0x70,0xDC,0xE5,0x41,0x18,0xA0,0xC1, + 0x00,0x00,0x57,0xE3,0x14,0x00,0x00,0x1A,0x00,0x00,0x51,0xE3,0x00,0x00,0x50,0x13, + 0x11,0x00,0x00,0x0A,0x82,0x80,0x85,0xE0,0xB2,0x82,0xD8,0xE1,0x00,0x71,0x96,0xE7, + 0x91,0x78,0x27,0xE0,0x00,0x71,0x86,0xE7,0xB4,0x85,0xDA,0xE1,0x00,0x71,0x9E,0xE7, + 0x91,0x78,0x27,0xE0,0x00,0x71,0x8E,0xE7,0x00,0x81,0x9D,0xE7,0x08,0x10,0x81,0xE0, + 0x00,0x11,0x8D,0xE7,0x80,0x10,0x85,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x76,0xD1,0xE1, + 0x01,0x70,0x87,0xE2,0xBE,0x76,0xC1,0xE1,0x01,0x00,0xCC,0xE5,0x01,0x20,0x82,0xE2, + 0x0E,0x00,0x52,0xE3,0xD6,0xFF,0xFF,0xBA,0x01,0x30,0x83,0xE2,0x15,0x00,0x53,0xE3, + 0xD0,0xFF,0xFF,0xBA,0x01,0x00,0x54,0xE3,0x01,0x70,0xA0,0xE3,0x13,0x00,0x00,0xBA, + 0x0D,0x90,0xA0,0xE1,0x0E,0xA0,0xA0,0xE1,0x07,0x81,0x99,0xE7,0x07,0x01,0x96,0xE7, + 0x00,0x00,0x58,0xE3,0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0xAF,0xEE,0xFF,0xEB, + 0x87,0x10,0x85,0xE0,0x01,0xBC,0x81,0xE2,0x00,0x00,0x58,0xE3,0xB6,0x04,0xCB,0xE1, + 0x07,0x01,0x9A,0xE7,0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0xA7,0xEE,0xFF,0xEB, + 0x01,0x70,0x87,0xE2,0x04,0x00,0x57,0xE1,0xB6,0x05,0xCB,0xE1,0xED,0xFF,0xFF,0xDA, + 0x80,0x30,0x9F,0xE5,0x04,0x00,0xD3,0xE5,0x01,0x00,0x50,0xE3,0x85,0xDF,0x8D,0xB2, + 0xF0,0x4F,0xBD,0xB8,0x1E,0xFF,0x2F,0xB1,0x8C,0xC0,0x8D,0xE2,0x00,0x11,0x83,0xE0, + 0x01,0x2C,0x81,0xE2,0xF6,0x11,0xD2,0xE1,0xF4,0x21,0xD2,0xE1,0x81,0x11,0x61,0xE0, + 0x81,0x10,0x82,0xE0,0x01,0x10,0xDC,0xE7,0x00,0x20,0x83,0xE0,0x01,0x00,0x40,0xE2, + 0x65,0x11,0xC2,0xE5,0x81,0x10,0x83,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x16,0xD1,0xE1, + 0xFF,0x10,0x01,0xE2,0x38,0x11,0xC2,0xE5,0xBC,0x21,0xD3,0xE1,0x02,0x00,0x51,0xE1, + 0xBC,0x11,0xC3,0x81,0x01,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xAA,0x85,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x24,0x89,0x00,0x00,0x78,0x06,0x00,0x20, + 0xA6,0x01,0x00,0x20,0xAE,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x1F,0x85,0xEB,0x51, + 0x40,0x01,0x00,0x20,0x00,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x00,0x00,0xA0,0xE3,0x5B,0xDF,0x4D,0xE2,0x00,0x10,0xA0,0xE1,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x2E,0x20,0xA0,0xE3, + 0x34,0x00,0x8D,0xE2,0x8D,0xEE,0xFF,0xEB,0x78,0x9F,0x9F,0xE5,0x0F,0x0A,0xE0,0xE3, + 0x00,0x80,0xA0,0xE3,0xB8,0x00,0xC9,0xE1,0xBC,0x80,0xC9,0xE1,0xBA,0x8E,0xC9,0xE1, + 0x89,0x11,0xD9,0xE5,0x60,0x7F,0x9F,0xE5,0x05,0x0C,0x89,0xE2,0x02,0x00,0x51,0xE3, + 0x00,0x10,0x97,0x85,0xB2,0x12,0xD1,0x81,0x0B,0x00,0x00,0x8A,0x00,0x10,0x97,0x05, + 0xB0,0x22,0xD1,0x01,0xBE,0x11,0xD0,0x01,0x3B,0x00,0x00,0x0A,0x3C,0x1F,0x9F,0xE5, + 0x00,0x10,0xD1,0xE5,0x00,0x00,0x51,0xE3,0x34,0x00,0x00,0x0A,0x30,0x1F,0x9F,0xE5, + 0xBC,0x21,0xD0,0xE1,0xBC,0x1A,0xD1,0xE1,0x02,0x10,0x81,0xE0,0x10,0x10,0x8D,0xE5, + 0x20,0x1F,0x9F,0xE5,0x68,0x11,0x8D,0xE5,0xB4,0x24,0xD1,0xE1,0x10,0x10,0x9D,0xE5, + 0xB0,0x02,0xD0,0xE1,0x02,0x10,0x81,0xE0,0x00,0x20,0x97,0xE5,0x7E,0xC4,0xD9,0xE5, + 0xBA,0x34,0xD2,0xE1,0xFE,0x60,0xD9,0xE1,0x03,0x00,0x80,0xE0,0x01,0x00,0x50,0xE1, + 0x01,0x30,0xA0,0xE1,0x01,0x00,0x1C,0xE3,0x00,0x10,0xA0,0x31,0x03,0x00,0x00,0x0A, + 0x02,0x00,0x1C,0xE3,0x02,0xC0,0xA0,0x03,0x01,0xC0,0xA0,0x13,0x08,0xC0,0x8D,0xE5, + 0xD4,0x4E,0x9F,0xE5,0xD4,0xAE,0x9F,0xE5,0x64,0x41,0x8D,0xE5,0xBC,0x86,0xC4,0xE1, + 0xBA,0x40,0xD9,0xE1,0x4E,0xC0,0xD2,0xE5,0x01,0x18,0xA0,0xE1,0x00,0x08,0xA0,0xE1, + 0x94,0x0C,0x0C,0xE0,0x9A,0x4C,0x8C,0xE0,0x64,0x41,0x9D,0xE5,0x8C,0xC5,0xA0,0xE1, + 0x4C,0xC8,0xA0,0xE1,0xBE,0xC6,0xC4,0xE1,0xBC,0x44,0xD2,0xE1,0x41,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x04,0x00,0x5C,0xE1,0xBC,0x24,0xD2,0xB1,0x64,0xC1,0x9D,0xB5, + 0x00,0x50,0xA0,0xE3,0xBE,0x26,0xCC,0xB1,0x57,0x2F,0x8D,0xE2,0x03,0x00,0x82,0xE8, + 0x03,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x58,0x01,0x8D,0xE5,0x04,0x00,0x00,0xEA, + 0x00,0x10,0x97,0xE5,0xBE,0x21,0xD1,0xE1,0xBC,0x11,0xD0,0xE1,0x02,0x10,0x81,0xE0, + 0xC9,0xFF,0xFF,0xEA,0x85,0x01,0x65,0xE0,0x54,0x01,0x8D,0xE5,0x34,0x0E,0x9F,0xE5, + 0x00,0x40,0xA0,0xE3,0x85,0x00,0x80,0xE0,0x50,0x01,0x8D,0xE5,0x54,0x01,0x9D,0xE5, + 0x3C,0x2E,0x9F,0xE5,0x80,0x00,0x84,0xE0,0x00,0x38,0xA0,0xE1,0x64,0x11,0x9D,0xE5, + 0x43,0x38,0xA0,0xE1,0x83,0x00,0x82,0xE0,0xF0,0x00,0xD0,0xE1,0xFE,0x16,0xD1,0xE1, + 0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA,0x64,0x11,0x9D,0xE5,0x64,0xC1,0x9D,0xE5, + 0xBC,0x16,0xD1,0xE1,0x01,0x10,0x81,0xE2,0xBC,0x16,0xCC,0xE1,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x00,0xDA,0xFC,0x1D,0x9F,0xE5,0xB0,0x00,0xD1,0xE1,0x01,0x00,0x80,0xE2, + 0xB0,0x00,0xC1,0xE1,0xF0,0xBD,0x9F,0xE5,0x83,0x00,0x8B,0xE0,0xF0,0xA0,0xD0,0xE1, + 0x60,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x20,0x03,0x00,0xBA,0x00,0x00,0x55,0xE3, + 0x00,0x00,0xA0,0xE3,0x15,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x0E,0x00,0x43,0xE2, + 0xC0,0x11,0xD2,0xE7,0x07,0x00,0x00,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x00,0x01,0xE0, + 0x00,0x00,0x54,0xE3,0x05,0x00,0x00,0xDA,0x0F,0x10,0x43,0xE2,0xC1,0x71,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x1C,0x11,0x07,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2, + 0x0D,0x00,0x54,0xE3,0x07,0x00,0x00,0xAA,0x0D,0x10,0x43,0xE2,0xC1,0x21,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x1C,0x11,0x02,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2, + 0x00,0x00,0x54,0xE3,0x07,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x01,0x10,0x43,0xE2, + 0xC1,0x21,0xD2,0xE7,0x07,0x10,0x01,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x11,0x02,0xE0, + 0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xFB,0x02,0x00,0x1A, + 0x00,0xC0,0xA0,0xE3,0x0C,0x70,0xA0,0xE1,0x0E,0x90,0xA0,0xE3,0x00,0x00,0xA0,0xE3, + 0x07,0x80,0x85,0xE0,0x00,0x10,0x84,0xE0,0x01,0x20,0x58,0xE2,0x01,0x10,0x41,0xE2, + 0x0B,0x00,0x00,0x4A,0x15,0x00,0x52,0xE3,0x09,0x00,0x00,0xCA,0x00,0x00,0x51,0xE3, + 0x07,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3,0x0E,0x90,0xA0,0xE3,0x04,0x00,0x00,0xCA, + 0x92,0x19,0x21,0xE0,0x81,0x10,0x8B,0xE0,0xF0,0x10,0xD1,0xE1,0x0C,0x00,0x51,0xE1, + 0x01,0xC0,0xA0,0xC1,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x03,0x00,0x50,0xE3,0xEA,0xFF,0xFF,0xBA,0x01,0x00,0x87,0xE2,0x00,0x78,0xA0,0xE1, + 0x47,0x78,0xA0,0xE1,0x03,0x00,0x57,0xE3,0xE3,0xFF,0xFF,0xBA,0x0C,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x00,0x5A,0xE1,0xD8,0x02,0x00,0x1A,0x94,0x1C,0x9F,0xE5, + 0xBC,0x10,0xD1,0xE1,0x00,0x00,0x51,0xE1,0x05,0x00,0x00,0xCA,0x84,0x1C,0x9F,0xE5, + 0xBC,0x00,0xC1,0xE1,0x04,0x00,0xD1,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0x18,0x00,0x8D,0xE5,0x34,0x00,0x8D,0xE2,0xC3,0x11,0xD0,0xE7,0x07,0x20,0x03,0xE2, + 0x01,0xC0,0xA0,0xE3,0x1C,0x12,0x81,0xE1,0xC3,0x11,0xC0,0xE7,0x08,0x00,0x9D,0xE5, + 0x00,0x70,0xA0,0xE3,0x01,0x00,0x10,0xE3,0x05,0x00,0x00,0x0A,0x0D,0x00,0x54,0xE3, + 0x0D,0x70,0xA0,0x03,0x07,0x00,0x00,0x0A,0x0C,0x00,0x54,0xE3,0x03,0x77,0x87,0x03, + 0x04,0x00,0x00,0xEA,0x14,0x00,0x55,0xE3,0x14,0x70,0xA0,0x03,0x01,0x00,0x00,0x0A, + 0x13,0x00,0x55,0xE3,0x13,0x78,0x87,0x03,0x07,0x08,0xB0,0xE1,0x03,0x00,0x00,0x0A, + 0x5C,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0xB4,0x02,0x00,0xBA,0x02,0x00,0x00,0xEA, + 0x58,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0xB0,0x02,0x00,0xBA,0xF8,0x0B,0x9F,0xE5, + 0x00,0x30,0xA0,0xE3,0x00,0x90,0x90,0xE5,0x03,0x10,0x85,0xE0,0x02,0xB0,0x41,0xE2, + 0x03,0x11,0x83,0xE0,0x0B,0xCC,0xA0,0xE1,0xEC,0x20,0x8D,0xE2,0x4C,0xCC,0xA0,0xE1, + 0x88,0x80,0x8D,0xE2,0x00,0x00,0xA0,0xE3,0x01,0x21,0x82,0xE0,0x8C,0xC1,0x6C,0xE0, + 0x01,0x81,0x88,0xE0,0x00,0x10,0x84,0xE0,0x0B,0xAC,0xA0,0xE1,0x02,0x10,0x41,0xE2, + 0x4A,0xAC,0xA0,0xE1,0x01,0x1C,0xA0,0xE1,0x15,0x00,0x5A,0xE3,0x41,0x1C,0xA0,0xE1, + 0x03,0x00,0x00,0x2A,0x00,0x00,0x51,0xE3,0x01,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3, + 0x02,0x00,0x00,0xBA,0x00,0x10,0xA0,0xE3,0x00,0x11,0x82,0xE7,0x23,0x00,0x00,0xEA, + 0xB0,0xA0,0xD9,0xE1,0x01,0x09,0x1A,0xE3,0x8C,0xA0,0x81,0xE0,0x05,0x00,0x00,0x0A, + 0x94,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0,0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0, + 0x00,0xA1,0x82,0xE7,0x04,0x00,0x00,0xEA,0x74,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0, + 0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0,0x00,0xA1,0x82,0xE7,0x00,0x00,0x5A,0xE3, + 0x00,0xA0,0xA0,0xB3,0x00,0xA1,0x82,0xB7,0xB0,0xA0,0xD9,0xE1,0x8C,0x10,0x81,0xE0, + 0x02,0x09,0x1A,0xE3,0x05,0x00,0x00,0x0A,0x4C,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0, + 0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0,0x00,0x11,0x88,0xE7,0x04,0x00,0x00,0xEA, + 0x2C,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0,0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0, + 0x00,0x11,0x88,0xE7,0x00,0x00,0x51,0xE3,0x00,0x10,0xA0,0xB3,0x00,0x11,0x88,0xB7, + 0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x05,0x00,0x50,0xE3, + 0xC7,0xFF,0xFF,0xBA,0x01,0x00,0x83,0xE2,0x00,0x38,0xA0,0xE1,0x43,0x38,0xA0,0xE1, + 0x05,0x00,0x53,0xE3,0xB7,0xFF,0xFF,0xBA,0xF0,0x0A,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0x4E,0x00,0x00,0x1A,0x12,0x00,0x55,0xE3,0x13,0x00,0x55,0x13, + 0x11,0x00,0x00,0x1A,0x00,0x00,0x54,0xE3,0x0F,0x00,0x00,0x1A,0xD0,0x0A,0x9F,0xE5, + 0x1C,0x11,0x9D,0xE5,0x00,0x00,0x90,0xE5,0xC0,0x2F,0xA0,0xE1,0x22,0x0F,0x80,0xE0, + 0x40,0x01,0x41,0xE0,0x32,0x00,0x50,0xE3,0x07,0x00,0x00,0xAA,0x64,0x00,0x51,0xE3, + 0x01,0x00,0xA0,0xE1,0x04,0x00,0x00,0xDA,0xFA,0x00,0x50,0xE3,0xA4,0x1A,0x9F,0xB5, + 0x01,0x00,0xA0,0xB3,0x00,0x00,0x81,0xB5,0x02,0x00,0x00,0xBA,0x94,0x0A,0x9F,0xE5, + 0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x12,0x00,0x55,0xE3,0x13,0x00,0x55,0x13, + 0x14,0x00,0x55,0x13,0x11,0x00,0x00,0x1A,0x0C,0x00,0x54,0xE3,0x0F,0x00,0x00,0x1A, + 0x74,0x0A,0x9F,0xE5,0x1C,0x11,0x9D,0xE5,0x00,0x00,0x90,0xE5,0xC0,0x2F,0xA0,0xE1, + 0x22,0x0F,0x80,0xE0,0x40,0x01,0x41,0xE0,0x32,0x00,0x50,0xE3,0x07,0x00,0x00,0xAA, + 0x64,0x00,0x51,0xE3,0x01,0x00,0xA0,0xE1,0x04,0x00,0x00,0xDA,0xFA,0x00,0x50,0xE3, + 0x48,0x1A,0x9F,0xB5,0x01,0x00,0xA0,0xB3,0x00,0x00,0x81,0xB5,0x02,0x00,0x00,0xBA, + 0x38,0x1A,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00,0x81,0xE5,0x11,0x00,0x55,0xE3, + 0x1B,0x00,0x00,0xBA,0x00,0x00,0x54,0xE3,0x0C,0x00,0x54,0x13,0x06,0x00,0x00,0x1A, + 0x1C,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x4B,0x0F,0x50,0xE3,0x02,0x00,0x00,0x3A, + 0x1C,0x01,0x9D,0xE5,0x7D,0x0F,0x50,0xE3,0x24,0x02,0x00,0xBA,0x13,0x00,0x55,0xE3, + 0x07,0x00,0x00,0x1A,0x0D,0x00,0x54,0xE3,0x0D,0x00,0x00,0x1A,0x1C,0x01,0x9D,0xE5, + 0x7D,0x0F,0x50,0xE3,0x30,0x01,0x9D,0xC5,0x4B,0x0F,0x50,0xC3,0x1B,0x02,0x00,0xCA, + 0x07,0x00,0x00,0xEA,0x14,0x00,0x55,0xE3,0x0D,0x00,0x54,0x03,0x04,0x00,0x00,0x1A, + 0x1C,0x01,0x9D,0xE5,0x7D,0x0F,0x50,0xE3,0x08,0x01,0x9D,0xC5,0x4B,0x0F,0x50,0xC3, + 0x12,0x02,0x00,0xCA,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x64,0x00,0x8D,0xE2, + 0x0A,0xED,0xFF,0xEB,0xA0,0x00,0x9D,0xE5,0x6C,0x19,0x9F,0xE5,0x64,0x00,0x8D,0xE5, + 0xA4,0x00,0x9D,0xE5,0x74,0x39,0x9F,0xE5,0x68,0x00,0x8D,0xE5,0xA8,0x00,0x9D,0xE5, + 0x00,0x00,0x54,0xE3,0x6C,0x00,0x8D,0xE5,0xB4,0x00,0x9D,0xE5,0x70,0x00,0x8D,0xE5, + 0xBC,0x00,0x9D,0xE5,0x78,0x00,0x8D,0xE5,0xC8,0x00,0x9D,0xE5,0x7C,0x00,0x8D,0xE5, + 0xCC,0x00,0x9D,0xE5,0x80,0x00,0x8D,0xE5,0xD0,0x00,0x9D,0xE5,0x84,0x00,0x8D,0xE5, + 0x00,0x10,0x91,0xE5,0xB8,0x00,0x9D,0xE5,0xBC,0x11,0xD1,0xE1,0x91,0x00,0x00,0xE0, + 0x93,0x10,0xC0,0xE0,0xC0,0x12,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x74,0x00,0x8D,0xE5, + 0x0F,0x00,0x00,0x1A,0x42,0x1F,0x8D,0xE2,0x03,0x00,0x91,0xE8,0x1C,0x21,0x9D,0xE5, + 0x02,0x10,0x81,0xE0,0x80,0x00,0x81,0xE0,0x20,0x11,0x9D,0xE5,0x02,0x00,0x80,0xE0, + 0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0, + 0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x00,0x08,0xA0,0xE1,0x20,0x08,0xA0,0xE1, + 0x26,0x00,0x00,0xEA,0x0C,0x00,0x54,0xE3,0x11,0x00,0x00,0x1A,0x08,0x01,0x9D,0xE5, + 0x04,0x11,0x9D,0xE5,0x18,0x21,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x08,0x11,0x9D,0xE5, + 0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0,0x1C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x01,0x00,0x80,0xE0,0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x00,0x08,0xA0,0xE1,0x20,0x08,0xA0,0xE1, + 0x12,0x00,0x00,0xEA,0x41,0x1F,0x8D,0xE2,0x03,0x00,0x91,0xE8,0x18,0x21,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x0C,0x11,0x9D,0xE5,0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0, + 0x1C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x20,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x00,0x08,0xA0,0xE1,0x20,0x08,0xA0,0xE1, + 0x8F,0x10,0xA0,0xE3,0xE3,0x1C,0x81,0xE2,0x91,0x00,0x00,0xE0,0x14,0xA8,0x9F,0xE5, + 0xA0,0x09,0xA0,0xE1,0xB6,0x10,0xDA,0xE1,0x40,0x00,0x11,0xE3,0x45,0x00,0x00,0x0A, + 0xEE,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0x34,0x28,0x9F,0x25, + 0x06,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x20,0x00,0x00,0x2A,0x71,0x1F,0xA0,0xE3, + 0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0x18,0x28,0x9F,0x25,0x05,0x10,0xA0,0x23, + 0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A,0x7D,0x0E,0x50,0xE3,0x04,0x18,0x9F,0x25, + 0x04,0x00,0xA0,0x23,0x00,0x00,0xC1,0x25,0x75,0x00,0x00,0x2A,0x77,0x1F,0xA0,0xE3, + 0x01,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0xE8,0x27,0x9F,0x25,0x03,0x10,0xA0,0x23, + 0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A,0xFA,0x0F,0x50,0xE3,0xD4,0x27,0x9F,0x25, + 0x02,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A,0x7D,0x0F,0x50,0xE3, + 0xC0,0x27,0x9F,0x25,0x01,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1E,0x00,0x00,0x2A, + 0xB0,0x17,0x9F,0xE5,0x00,0x10,0xD1,0xE5,0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0xFA,0x0F,0x50,0xE3,0x89,0x01,0x00,0x3A,0x5D,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3, + 0x04,0x00,0x00,0x1A,0xEE,0x10,0xA0,0xE3,0x02,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0x82,0x01,0x00,0x3A,0x56,0x00,0x00,0xEA,0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x7D,0x0F,0x50,0xE3,0x7D,0x01,0x00,0x3A,0x51,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3,0x78,0x01,0x00,0x3A,0x4C,0x00,0x00,0xEA, + 0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x96,0x00,0x50,0xE3,0x73,0x01,0x00,0x3A, + 0x47,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3,0x45,0x00,0x00,0x1A,0x4B,0x00,0x50,0xE3, + 0x6E,0x01,0x00,0x3A,0x42,0x00,0x00,0xEA,0x71,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0x1C,0x27,0x9F,0x25,0x06,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25, + 0x20,0x00,0x00,0x2A,0xD6,0x10,0xA0,0xE3,0x06,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0x00,0x17,0x9F,0x25,0x05,0x20,0xA0,0x23,0x00,0x20,0xC1,0x25,0x1E,0x00,0x00,0x2A, + 0x6B,0x10,0xA0,0xE3,0x03,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0xE4,0x26,0x9F,0x25, + 0x04,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1C,0x00,0x00,0x2A,0x7D,0x0F,0x50,0xE3, + 0xD0,0x26,0x9F,0x25,0x03,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25,0x1C,0x00,0x00,0x2A, + 0x4B,0x0F,0x50,0xE3,0xBC,0x26,0x9F,0x25,0x02,0x10,0xA0,0x23,0x00,0x10,0xC2,0x25, + 0x1C,0x00,0x00,0x2A,0x96,0x00,0x50,0xE3,0xA8,0x26,0x9F,0x25,0x01,0x10,0xA0,0x23, + 0x00,0x10,0xC2,0x25,0x1C,0x00,0x00,0x2A,0x98,0x16,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x7D,0x0F,0x50,0xE3,0x43,0x01,0x00,0x3A, + 0x17,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3, + 0x3E,0x01,0x00,0x3A,0x12,0x00,0x00,0xEA,0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0xAF,0x00,0x50,0xE3,0x39,0x01,0x00,0x3A,0x0D,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x1A,0x55,0x00,0x50,0xE3,0x34,0x01,0x00,0x3A,0x08,0x00,0x00,0xEA, + 0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x32,0x00,0x50,0xE3,0x2F,0x01,0x00,0x3A, + 0x03,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3,0x01,0x00,0x00,0x1A,0x14,0x00,0x50,0xE3, + 0x2A,0x01,0x00,0x3A,0x14,0x00,0x55,0xE3,0x10,0x00,0x00,0x1A,0x01,0xCA,0xA0,0xE3, + 0x04,0x00,0xA0,0xE3,0x01,0xC0,0x4C,0xE2,0xEC,0x80,0x8D,0xE2,0x00,0x11,0x88,0xE0, + 0x28,0x20,0x91,0xE5,0x01,0x00,0x40,0xE2,0x02,0x24,0x62,0xE0,0x93,0x92,0xC2,0xE0, + 0xC2,0x92,0xA0,0xE1,0xC2,0x2F,0x49,0xE0,0x0C,0x00,0x52,0xE1,0x28,0x20,0x81,0xE5, + 0x00,0x08,0xA0,0xE1,0x28,0xC0,0x81,0xA5,0x40,0x08,0xB0,0xE1,0xF2,0xFF,0xFF,0x5A, + 0x00,0x00,0x57,0xE3,0x1F,0x00,0x00,0x0A,0x08,0x00,0x9D,0xE5,0x01,0x00,0x10,0xE3, + 0x04,0x00,0xA0,0xE3,0x0D,0x00,0x00,0x0A,0xEC,0x30,0x8D,0xE2,0x00,0x20,0xA0,0xE3, + 0x07,0x18,0xB0,0xE1,0x00,0x11,0x80,0xE0,0x01,0x21,0x83,0x17,0x01,0x11,0x83,0xE0, + 0x0C,0x20,0x81,0x05,0x01,0x00,0x40,0xE2,0x10,0x20,0x81,0x05,0x00,0x08,0xA0,0xE1, + 0x04,0x20,0x81,0x15,0x40,0x08,0xB0,0xE1,0xF4,0xFF,0xFF,0x5A,0x0D,0x00,0x00,0xEA, + 0xEC,0x30,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x07,0x18,0xB0,0xE1,0x00,0x11,0x83,0x10, + 0x00,0x21,0x83,0x17,0x14,0x20,0x81,0x15,0x02,0x00,0x00,0x1A,0x00,0x11,0x83,0xE0, + 0x3C,0x20,0x81,0xE5,0x50,0x20,0x81,0xE5,0x01,0x00,0x40,0xE2,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xB0,0xE1,0xF3,0xFF,0xFF,0x5A,0x24,0x95,0x9F,0xE5,0x00,0x30,0xA0,0xE3, + 0x03,0xC0,0xA0,0xE1,0x0E,0x80,0xA0,0xE3,0x00,0x00,0xA0,0xE3,0x0C,0x70,0x85,0xE0, + 0x00,0x10,0x84,0xE0,0x01,0x20,0x57,0xE2,0x01,0x10,0x41,0xE2,0x0A,0x00,0x00,0x4A, + 0x15,0x00,0x52,0xE3,0x08,0x00,0x00,0xCA,0x00,0x00,0x51,0xE3,0x06,0x00,0x00,0xBA, + 0x0E,0x00,0x51,0xE3,0x04,0x00,0x00,0xCA,0x92,0x18,0x21,0xE0,0x81,0x10,0x89,0xE0, + 0xF0,0x10,0xD1,0xE1,0x03,0x00,0x51,0xE1,0x01,0x30,0xA0,0xC1,0x01,0x00,0x80,0xE2, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x03,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xBA, + 0x01,0x00,0x8C,0xE2,0x00,0xC8,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1,0x03,0x00,0x5C,0xE3, + 0xE4,0xFF,0xFF,0xBA,0xB8,0x10,0xDA,0xE1,0x03,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x00,0x51,0xE1,0xB8,0x00,0xCA,0xC1,0xBA,0x10,0xDA,0xE1,0x70,0x20,0x8D,0xE2, + 0x0A,0x70,0xA0,0xE1,0x00,0x00,0x51,0xE1,0xBA,0x00,0xCA,0xB1,0x04,0x00,0xDA,0xE5, + 0xEC,0x30,0x8D,0xE2,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0x04,0x00,0xCA,0xE5, + 0x00,0x01,0x8A,0xE0,0x01,0x0C,0x80,0xE2,0xB4,0x41,0xC0,0xE1,0x04,0x00,0xDA,0xE5, + 0x00,0x01,0x8A,0xE0,0x01,0x0C,0x80,0xE2,0xB6,0x51,0xC0,0xE1,0x06,0x00,0x92,0xE8, + 0x00,0x00,0xA0,0xE3,0x02,0x00,0x51,0xE1,0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x7C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x78,0x10,0x9D,0xE5,0xC0,0x00,0xA0,0xC3, + 0x02,0x00,0x51,0xE1,0x6C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x68,0x10,0x9D,0xE5,0x30,0x00,0x80,0xC3,0x02,0x00,0x51,0xE1, + 0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x6C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x80,0x10,0x9D,0xE5,0x0C,0x00,0x80,0xC3,0x02,0x00,0x51,0xE1,0x7C,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x03,0x00,0x80,0xC3, + 0x04,0x10,0xA0,0xE3,0x00,0x20,0xA0,0xE3,0xC0,0x00,0x10,0xE3,0x01,0xC1,0x81,0x00, + 0x0C,0x21,0x83,0x07,0x30,0x00,0x10,0xE3,0x01,0xC1,0x81,0x00,0x0C,0xC1,0x83,0x00, + 0x10,0x20,0x8C,0x05,0x0C,0x00,0x10,0xE3,0x01,0x21,0x83,0x07,0x03,0x00,0x10,0xE3, + 0x01,0xC1,0x83,0x00,0x01,0x10,0x41,0xE2,0x01,0x18,0xA0,0xE1,0x50,0x20,0x8C,0x05, + 0x41,0x18,0xB0,0xE1,0xEF,0xFF,0xFF,0x5A,0xFC,0x30,0x9D,0xE5,0x00,0x30,0x8D,0xE5, + 0xEC,0x30,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xE7,0x06,0x00,0xEB,0x10,0x31,0x9D,0xE5, + 0x00,0xA0,0xA0,0xE1,0x00,0x30,0x8D,0xE5,0x01,0x3C,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xE1,0x06,0x00,0xEB,0x24,0x31,0x9D,0xE5,0x00,0xB0,0xA0,0xE1,0x00,0x30,0x8D,0xE5, + 0x45,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xDB,0x06,0x00,0xEB,0x38,0x31,0x9D,0xE5, + 0x00,0x90,0xA0,0xE1,0x00,0x30,0x8D,0xE5,0x4A,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0xD5,0x06,0x00,0xEB,0x4C,0x31,0x9D,0xE5,0x30,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0x4F,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0xCF,0x06,0x00,0xEB,0x2C,0x00,0x8D,0xE5, + 0x00,0x00,0x8D,0xE5,0x30,0x30,0x9D,0xE5,0x09,0x20,0xA0,0xE1,0x0B,0x10,0xA0,0xE1, + 0x0A,0x00,0xA0,0xE1,0xC8,0x06,0x00,0xEB,0x00,0x80,0xB0,0xE1,0x06,0x00,0x00,0x1A, + 0x64,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xEC,0x00,0x8D,0xE2,0x63,0xEB,0xFF,0xEB, + 0x0A,0x90,0xA0,0xE3,0x09,0x80,0xA0,0xE1,0x1C,0x91,0x8D,0xE5,0x3C,0x31,0x9D,0xE5, + 0xEC,0x00,0x9D,0xE5,0x00,0x30,0x8D,0xE5,0x00,0x11,0x9D,0xE5,0x14,0x21,0x9D,0xE5, + 0x28,0x31,0x9D,0xE5,0xB8,0x06,0x00,0xEB,0xA8,0x12,0x9F,0xE5,0x84,0x70,0x81,0xE0, + 0xBE,0x11,0xD7,0xE1,0x91,0x00,0x00,0xE0,0x28,0x00,0x8D,0xE5,0x40,0x31,0x9D,0xE5, + 0x00,0x30,0x8D,0xE5,0xF0,0x00,0x9D,0xE5,0x04,0x11,0x9D,0xE5,0x18,0x21,0x9D,0xE5, + 0x2C,0x31,0x9D,0xE5,0xAC,0x06,0x00,0xEB,0xB0,0x12,0xD7,0xE1,0x44,0x31,0x9D,0xE5, + 0x1C,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x24,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0xF4,0x00,0x9D,0xE5,0x08,0x11,0x9D,0xE5,0x30,0x31,0x9D,0xE5,0xA2,0x06,0x00,0xEB, + 0xB2,0x12,0xD7,0xE1,0x48,0x31,0x9D,0xE5,0x20,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x20,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0xF8,0x00,0x9D,0xE5,0x0C,0x11,0x9D,0xE5, + 0x34,0x31,0x9D,0xE5,0x98,0x06,0x00,0xEB,0xB4,0x12,0xD7,0xE1,0x4C,0x31,0x9D,0xE5, + 0x24,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x1C,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0xFC,0x00,0x9D,0xE5,0x10,0x11,0x9D,0xE5,0x38,0x31,0x9D,0xE5,0x8E,0x06,0x00,0xEB, + 0xB6,0x12,0xD7,0xE1,0x20,0x20,0x9D,0xE5,0x90,0x01,0x03,0xE0,0x00,0x30,0x8D,0xE5, + 0x28,0x00,0x9D,0xE5,0x24,0x10,0x9D,0xE5,0x1C,0x30,0x9D,0xE5,0x86,0x06,0x00,0xEB, + 0x08,0x10,0xA0,0xE1,0x71,0xEA,0xFF,0xEB,0xD8,0x11,0x9F,0xE5,0xD4,0x71,0x9F,0xE5, + 0xB0,0x12,0xD1,0xE1,0x00,0x10,0x61,0xE2,0x81,0x00,0x90,0xE0,0x04,0x10,0xD7,0xE5, + 0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0,0xB4,0x0F,0xC1,0xE1,0x50,0x31,0x9D,0xE5, + 0x50,0x21,0x9D,0xE5,0xB8,0x35,0xD3,0xE1,0x30,0xC0,0x9D,0xE5,0xB6,0x25,0xD2,0xE1, + 0x93,0x0C,0x0C,0xE0,0x99,0x02,0x02,0xE0,0x50,0x01,0x9D,0xE5,0x50,0x11,0x9D,0xE5, + 0x50,0x31,0x9D,0xE5,0xB2,0x05,0xD0,0xE1,0xB4,0x15,0xD1,0xE1,0xBA,0x35,0xD3,0xE1, + 0x2C,0x90,0x9D,0xE5,0x9A,0x00,0x00,0xE0,0x99,0x03,0x03,0xE0,0x9B,0x01,0x01,0xE0, + 0x00,0x30,0x8D,0xE5,0x0C,0x30,0xA0,0xE1,0x67,0x06,0x00,0xEB,0x08,0x10,0xA0,0xE1, + 0x52,0xEA,0xFF,0xEB,0xB4,0x15,0xD7,0xE1,0x00,0x10,0x61,0xE2,0x81,0x00,0x90,0xE0, + 0x04,0x10,0xD7,0xE5,0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0,0x01,0x1C,0x81,0xE2, + 0xB6,0x00,0xC1,0xE1,0x04,0x00,0xD7,0xE5,0x08,0x00,0x50,0xE3,0x0C,0x00,0x00,0x2A, + 0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1,0x0E,0x00,0x54,0xE3, + 0xBD,0xFC,0xFF,0xBA,0x14,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0x01,0x00,0x85,0xE2,0x00,0x58,0xA0,0xE1,0x45,0x58,0xA0,0xE1,0x15,0x00,0x55,0xE3, + 0xAF,0xFC,0xFF,0xBA,0x00,0x01,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB0,0x00,0xD4,0xE1, + 0x80,0x00,0x10,0xE3,0x51,0x00,0x00,0x0A,0xE8,0x50,0x9F,0xE5,0x04,0x00,0xD5,0xE5, + 0x00,0x00,0x50,0xE3,0x08,0x00,0x00,0x1A,0x68,0x01,0x9D,0xE5,0xB4,0x04,0xD0,0xE1, + 0x00,0x00,0x50,0xE3,0x41,0x01,0xD5,0x15,0x3C,0x10,0xD4,0x15,0x01,0x00,0x50,0x11, + 0x41,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x2C,0x00,0x00,0xEA,0x42,0x01,0xD5,0xE5, + 0x34,0x10,0xD4,0xE5,0x01,0x00,0x50,0xE1,0x27,0x00,0x00,0x8A,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0x42,0x01,0xC5,0xE5,0x35,0x10,0xD4,0xE5,0x05,0x20,0xA0,0xE1, + 0x00,0x00,0x51,0xE1,0x03,0x00,0x00,0x2A,0xBC,0x30,0xD2,0xE1,0x0C,0x20,0x9D,0xE5, + 0x03,0x20,0x82,0xE0,0x0C,0x20,0x8D,0xE5,0x34,0x20,0xD4,0xE5,0x02,0x00,0x50,0xE1, + 0x19,0x00,0x00,0x1A,0x01,0x00,0x50,0xE1,0x17,0x00,0x00,0x0A,0x01,0x10,0x40,0xE0, + 0x0C,0x00,0x9D,0xE5,0xA9,0xEA,0xFF,0xEB,0x68,0x21,0x9D,0xE5,0x00,0x10,0xA0,0xE3, + 0xB4,0x14,0xC2,0xE1,0xB8,0x13,0xD4,0xE1,0x00,0x00,0x51,0xE1,0x0E,0x00,0x00,0x2A, + 0x10,0x10,0x9D,0xE5,0x01,0x00,0x40,0xE0,0x36,0x10,0xD4,0xE5,0x90,0x01,0x01,0xE0, + 0x48,0x00,0x9F,0xE5,0x90,0x21,0x81,0xE0,0xA1,0x02,0xA0,0xE1,0x68,0x11,0x9D,0xE5, + 0xB4,0x04,0xC1,0xE1,0x68,0x01,0x9D,0xE5,0xB4,0x14,0xD0,0xE1,0xBA,0x03,0xD4,0xE1, + 0x00,0x00,0x51,0xE1,0x68,0x11,0x9D,0x85,0xB4,0x04,0xC1,0x81,0x00,0x00,0xA0,0xE3, + 0x41,0x01,0xC5,0xE5,0x15,0x00,0x00,0xEA,0x40,0x00,0x00,0x20,0x78,0x06,0x00,0x20, + 0x75,0x05,0x00,0x20,0x00,0x95,0x00,0x00,0x40,0x01,0x00,0x20,0x40,0x04,0x00,0x20, + 0x1F,0x85,0xEB,0x51,0x00,0x00,0x00,0x10,0xC0,0x05,0x00,0x20,0x7E,0x06,0x00,0x20, + 0x76,0x05,0x00,0x20,0xC4,0x05,0x00,0x20,0xAC,0x05,0x00,0x20,0xC8,0x05,0x00,0x20, + 0xB0,0x05,0x00,0x20,0xEC,0x05,0x00,0x20,0x68,0x05,0x00,0x20,0x00,0x00,0xA0,0xE3, + 0x42,0x01,0xC5,0xE5,0x41,0x01,0xC5,0xE5,0x68,0x11,0x9D,0xE5,0xB4,0x04,0xC1,0xE1, + 0x60,0x50,0x1F,0xE5,0x00,0xC0,0xA0,0xE3,0x04,0xA0,0xD5,0xE5,0x0C,0x80,0xA0,0xE1, + 0x01,0x20,0xA0,0xE3,0x01,0x00,0x5A,0xE3,0x32,0x00,0x00,0xBA,0x7F,0x94,0xD5,0xE5, + 0x64,0xB0,0x1F,0xE5,0x82,0x00,0x85,0xE0,0xB4,0x1F,0xD0,0xE1,0xCD,0x30,0xA0,0xE3, + 0x33,0x3B,0x83,0xE2,0x01,0x0C,0x80,0xE2,0xB6,0x00,0xD0,0xE1,0x93,0x01,0x01,0xE0, + 0x93,0x00,0x00,0xE0,0xA0,0x79,0xA0,0xE1,0x00,0x80,0xA0,0xE3,0x00,0x00,0x59,0xE3, + 0xA1,0x69,0xA0,0xE1,0x08,0x00,0xA0,0xE1,0x1D,0x00,0x00,0xDA,0x02,0x11,0x85,0xE0, + 0x01,0x4C,0x81,0xE2,0x80,0x11,0x85,0xE0,0x01,0x1B,0x81,0xE2,0xF0,0x38,0xD1,0xE1, + 0x06,0x00,0x53,0xE1,0x11,0x00,0x00,0xCA,0xF4,0x38,0xD1,0xE1,0x06,0x00,0x53,0xE1, + 0x0E,0x00,0x00,0xBA,0xF2,0x38,0xD1,0xE1,0x07,0x00,0x53,0xE1,0x0B,0x00,0x00,0xCA, + 0xF6,0x18,0xD1,0xE1,0x07,0x00,0x51,0xE1,0x08,0x00,0x00,0xBA,0xF6,0x11,0xD4,0xE1, + 0xF4,0x31,0xD4,0xE1,0x81,0x11,0x61,0xE0,0x81,0x10,0x83,0xE0,0x81,0x10,0x8B,0xE0, + 0xF0,0x30,0xD1,0xE1,0x0C,0x00,0x53,0xE1,0x03,0xC0,0xA0,0xC1,0xFF,0x80,0x02,0xC2, + 0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x00,0x59,0xE1, + 0xE3,0xFF,0xFF,0xCA,0x01,0x00,0x82,0xE2,0x00,0x28,0xA0,0xE1,0x42,0x28,0xA0,0xE1, + 0x02,0x00,0x5A,0xE1,0xCE,0xFF,0xFF,0xAA,0x48,0x01,0x1F,0xE5,0xBA,0x10,0xD5,0xE1, + 0x01,0x6C,0x80,0xE2,0x01,0x4C,0x80,0xE2,0x0C,0x00,0x51,0xE1,0x06,0x60,0x86,0xE2, + 0x02,0x40,0x84,0xE2,0x12,0x00,0x00,0xCA,0x00,0x00,0x58,0xE3,0x10,0x00,0x00,0x0A, + 0x88,0x00,0x85,0xE0,0xB4,0x8F,0xD0,0xE1,0x01,0x0C,0x80,0xE2,0xB6,0x70,0xD0,0xE1, + 0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xF4,0x00,0x85,0xE2,0x4B,0xEA,0xFF,0xEB, + 0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1,0x47,0xEA,0xFF,0xEB, + 0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5,0xA8,0x01,0x1F,0xE5,0xB6,0x8F,0xC0,0xE1, + 0x1B,0x00,0x00,0xEA,0x05,0x00,0xD5,0xE5,0x00,0x00,0x50,0xE3,0x19,0x00,0x00,0x1A, + 0x01,0x00,0x5A,0xE3,0x17,0x00,0x00,0x9A,0x8A,0x01,0xD5,0xE5,0x00,0x00,0x50,0xE3, + 0x14,0x00,0x00,0x1A,0x18,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x11,0x00,0x00,0x0A, + 0x18,0x10,0x9D,0xE5,0x12,0x20,0xA0,0xE3,0x81,0x00,0x85,0xE0,0xB4,0x9F,0xD0,0xE1, + 0x01,0x0C,0x80,0xE2,0xB6,0x70,0xD0,0xE1,0x00,0x10,0xA0,0xE3,0xF4,0x00,0x85,0xE2, + 0x2E,0xEA,0xFF,0xEB,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1, + 0x2A,0xEA,0xFF,0xEB,0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5,0x1C,0x02,0x1F,0xE5, + 0xB6,0x9F,0xC0,0xE1,0xB6,0x70,0xC4,0xE1,0x7B,0x04,0xD5,0xE5,0x05,0x30,0xA0,0xE1, + 0x00,0x00,0x50,0xE3,0x09,0x00,0x00,0x0A,0x00,0x20,0xA0,0xE3,0x38,0xC0,0x9F,0xE5, + 0x04,0x20,0xC3,0xE5,0x7C,0x04,0xD3,0xE5,0x1E,0xC0,0xDC,0xE5,0x03,0x10,0xA0,0xE1, + 0x0C,0x00,0x50,0xE1,0x01,0x00,0x80,0xE2,0x7B,0x24,0xC1,0x25,0x7C,0x04,0xC1,0xE5, + 0x04,0x00,0xD3,0xE5,0x14,0x10,0x9F,0xE5,0x05,0x00,0xC3,0xE5,0x00,0x00,0xC1,0xE5, + 0x5B,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x93,0x00,0x00, + 0xF4,0x05,0x00,0x20,0x10,0xB5,0x0F,0x48,0x0F,0x49,0x80,0x88,0x49,0x8B,0x00,0x24, + 0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29,0x02,0xD0,0x0D,0x49,0x49,0x89,0x02,0xE0, + 0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18,0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C, + 0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7,0xAF,0xFB,0x20,0x00,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x80,0x01,0x00,0x20,0x40,0x05,0x00,0x20,0x75,0x05,0x00,0x20, + 0xA0,0x95,0x00,0x00,0x78,0x06,0x00,0x20,0xC0,0x90,0x00,0x40,0xF7,0xB5,0x24,0x4E, + 0x82,0xB0,0xB0,0x7F,0xF1,0x7F,0x00,0x02,0x08,0x43,0x02,0xF0,0x8D,0xF8,0x30,0x00, + 0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x1E,0x48,0x01,0x78,0x1E,0x48,0x00,0x7B, + 0x00,0x29,0x02,0xD0,0x02,0xF0,0x30,0xF8,0x01,0xE0,0x02,0xF0,0x55,0xF8,0x18,0x49, + 0x01,0x25,0x20,0x39,0x08,0x00,0xC0,0x30,0x01,0x90,0x05,0x20,0xC0,0x01,0x17,0x4F, + 0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62,0x01,0x98,0x80,0x68,0x38,0x62,0x00,0x98, + 0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFB,0xF7,0x81,0xFC,0x64,0x1E, + 0xF9,0xD5,0x02,0x20,0xF8,0x62,0x30,0x7F,0x01,0x00,0xFB,0xF7,0xEF,0xFC,0x01,0x24, + 0x02,0xA8,0x07,0xC8,0xFE,0xF7,0xFE,0xFA,0x00,0x28,0x01,0xD1,0x00,0x24,0x25,0x00, + 0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x20,0x93,0x00,0x00,0x6D,0x05,0x00,0x20,0xE0,0x04,0x00,0x20,0x80,0x90,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x00,0x60,0xA0,0xE3,0x7D,0xDF,0x4D,0xE2, + 0x00,0x00,0xA0,0xE3,0x30,0x60,0x8D,0xE5,0xC8,0x61,0x8D,0xE5,0x2C,0x60,0x8D,0xE5, + 0x1C,0x60,0x8D,0xE5,0x00,0x50,0xA0,0xE1,0x00,0x10,0xA0,0xE1,0xC4,0x61,0x8D,0xE5, + 0x38,0x60,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x04,0x00,0x8D,0xE5,0x18,0x0B,0x9F,0xE5, + 0x34,0x60,0x8D,0xE5,0x24,0x60,0x8D,0xE5,0x28,0x60,0x8D,0xE5,0x20,0x60,0x8D,0xE5, + 0x10,0x60,0x8D,0xE5,0x14,0x60,0x8D,0xE5,0x0C,0x60,0x8D,0xE5,0xF0,0x01,0x8D,0xE5, + 0xB0,0x18,0xC0,0xE1,0xF0,0x01,0x9D,0xE5,0xF0,0x4A,0x9F,0xE5,0xB2,0x18,0xC0,0xE1, + 0xF0,0x01,0x9D,0xE5,0x06,0x70,0xA0,0xE1,0xB4,0x18,0xC0,0xE1,0x06,0x90,0xA0,0xE1, + 0x06,0xA0,0xA0,0xE1,0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x88,0x00,0x84,0xE2, + 0xAA,0xE9,0xFF,0xEB,0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xB8,0x00,0x84,0xE2, + 0xA6,0xE9,0xFF,0xEB,0x00,0x80,0xA0,0xE3,0x60,0x10,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0xB8,0x8E,0xC4,0xE1,0xB1,0xE9,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0xFC,0x00,0x8D,0xE2, + 0xAE,0xE9,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x9C,0x00,0x8D,0xE2,0xAB,0xE9,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0x3C,0x00,0x8D,0xE2,0xA8,0xE9,0xFF,0xEB,0x80,0x0A,0x9F,0xE5, + 0x00,0x10,0xD0,0xE5,0x7C,0x0A,0x9F,0xE5,0x00,0x00,0x51,0xE3,0xEC,0x01,0x8D,0xE5, + 0x04,0x00,0x00,0x0A,0xF8,0x0A,0xD0,0xE1,0xC0,0x01,0x8D,0xE5,0xEC,0x01,0x9D,0xE5, + 0xB6,0x0A,0xD0,0xE1,0x04,0x00,0x00,0xEA,0x5C,0x0A,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xF6,0x12,0xD0,0xE1,0xC0,0x11,0x8D,0xE5,0xB4,0x02,0xD0,0xE1,0xEC,0x11,0x9D,0xE5, + 0x6C,0x3A,0x9F,0xE5,0xBC,0x01,0x8D,0xE5,0x30,0x0A,0x9F,0xE5,0x64,0x2A,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x60,0xCA,0x9F,0xE5,0x40,0x00,0x10,0xE3,0xB0,0xB8,0xD1,0x01, + 0xB0,0x18,0xD1,0x11,0x01,0x08,0xE0,0xE3,0x81,0xB0,0x00,0x10,0x8B,0x00,0x00,0xE0, + 0x18,0x1A,0x9F,0xE5,0x18,0x00,0x8D,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00,0xC1,0xE5, + 0x0C,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x08,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x04,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x00,0x1A,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xFC,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xF8,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xF4,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xF0,0x19,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x00,0x00,0x83,0xE5,0x00,0x00,0x82,0xE5,0x00,0x00,0x8C,0xE5,0xEC,0xC9,0x9F,0xE5, + 0x00,0x00,0x8C,0xE5,0xE8,0xC9,0x9F,0xE5,0x00,0x00,0x8C,0xE5,0x00,0xC0,0xA0,0xE3, + 0x0C,0x00,0xA0,0xE1,0x00,0x20,0xA0,0xE3,0xD8,0x19,0x9F,0xE5,0x8C,0x10,0x81,0xE0, + 0xE8,0x11,0x8D,0xE5,0xB0,0x10,0xD1,0xE1,0x01,0x3A,0xA0,0xE1,0xC8,0x19,0x9F,0xE5, + 0x23,0x3A,0xA0,0xE1,0x8C,0x10,0x81,0xE0,0xB0,0x10,0xD1,0xE1,0x0F,0x1A,0xC1,0xE3, + 0x01,0x40,0x43,0xE0,0x08,0x00,0x54,0xE1,0x03,0x10,0x41,0xE0,0x34,0x30,0x8D,0xC2, + 0x05,0x00,0x83,0xC8,0x04,0x80,0xA0,0xC1,0xFC,0x30,0x8D,0xE2,0x02,0xE1,0x93,0xE7, + 0x00,0x00,0x54,0xE3,0x00,0x40,0xA0,0xB3,0x04,0xE0,0x8E,0xE0,0x02,0xE1,0x83,0xE7, + 0x57,0xEF,0x8D,0xE2,0x00,0x31,0x9E,0xE7,0x00,0x00,0x51,0xE3,0x04,0x30,0x83,0xE0, + 0x00,0x31,0x8E,0xE7,0x3C,0x30,0x8D,0xE2,0x02,0xE1,0x93,0xE7,0x00,0x10,0xA0,0xB3, + 0x01,0xE0,0x8E,0xE0,0x02,0xE1,0x83,0xE7,0x9C,0xE0,0x8D,0xE2,0x00,0x31,0x9E,0xE7, + 0x01,0x30,0x83,0xE0,0x00,0x31,0x8E,0xE7,0xC8,0x31,0x9D,0xE5,0x04,0x00,0x53,0xE1, + 0xC8,0x41,0x8D,0x35,0x01,0x00,0x56,0xE1,0x01,0x60,0xA0,0x31,0x64,0x00,0x54,0xE3, + 0x04,0x30,0xA0,0xE1,0x64,0x30,0xA0,0xC3,0x11,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0xF4,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0xE8,0xE8,0x9F,0xE5, + 0x13,0x00,0x00,0xEA,0x12,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0xDC,0xE8,0x9F,0xE5, + 0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0xD0,0xE8,0x9F,0xE5,0x0C,0x00,0x00,0xEA, + 0x13,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0xC4,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5, + 0x0E,0x30,0x83,0xE0,0xB8,0xE8,0x9F,0xE5,0x05,0x00,0x00,0xEA,0x14,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x1A,0xAC,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0, + 0xA0,0xE8,0x9F,0xE5,0x00,0x30,0x8E,0xE5,0x32,0x00,0x54,0xE3,0x04,0x30,0xA0,0xE1, + 0x32,0x30,0xA0,0xC3,0x11,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x88,0xE8,0x9F,0xE5, + 0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0x7C,0xE8,0x9F,0xE5,0x13,0x00,0x00,0xEA, + 0x12,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x70,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5, + 0x0E,0x30,0x83,0xE0,0x64,0xE8,0x9F,0xE5,0x0C,0x00,0x00,0xEA,0x13,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x1A,0x58,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0, + 0x4C,0xE8,0x9F,0xE5,0x05,0x00,0x00,0xEA,0x14,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0x40,0xE8,0x9F,0xE5,0x00,0xE0,0x9E,0xE5,0x0E,0x30,0x83,0xE0,0x34,0xE8,0x9F,0xE5, + 0x00,0x30,0x8E,0xE5,0x01,0x00,0x56,0xE1,0x01,0x60,0xA0,0x31,0x11,0x00,0x50,0xE3, + 0x12,0x00,0x50,0x13,0x14,0x00,0x50,0x13,0x09,0x00,0x00,0x1A,0x00,0x00,0x52,0xE3, + 0x04,0x00,0x00,0x1A,0xE8,0x37,0x9F,0xE5,0xE4,0xE7,0x9F,0xE5,0x00,0x30,0x93,0xE5, + 0x04,0x30,0x83,0xE0,0x00,0x30,0x8E,0xE5,0x11,0x00,0x50,0xE3,0x12,0x00,0x50,0x13, + 0x01,0x00,0x00,0x0A,0x13,0x00,0x50,0xE3,0x06,0x00,0x00,0x1A,0x0C,0x00,0x52,0xE3, + 0x04,0x00,0x00,0x1A,0xBC,0x37,0x9F,0xE5,0xB8,0xE7,0x9F,0xE5,0x00,0x30,0x93,0xE5, + 0x04,0x30,0x83,0xE0,0x00,0x30,0x8E,0xE5,0x0B,0x00,0x51,0xE1,0x01,0x30,0x87,0xC2, + 0x01,0x78,0xC3,0xC3,0x0B,0x00,0x54,0xE1,0x01,0x30,0x89,0xC2,0x01,0x98,0xC3,0xC3, + 0x18,0x30,0x9D,0xE5,0x03,0x00,0x51,0xE1,0x03,0x00,0x00,0xDA,0x0C,0x30,0x9D,0xE5, + 0x01,0x30,0x83,0xE2,0x01,0x38,0xC3,0xE3,0x0C,0x30,0x8D,0xE5,0x18,0x30,0x9D,0xE5, + 0x03,0x00,0x54,0xE1,0x01,0x30,0x8A,0xC2,0x01,0xA8,0xC3,0xC3,0x14,0x30,0x9D,0xE5, + 0x96,0x00,0x51,0xE3,0x04,0x30,0x83,0xE0,0x14,0x30,0x8D,0xE5,0x10,0x30,0x9D,0xE5, + 0x01,0x30,0x83,0xE0,0x10,0x30,0x8D,0xE5,0x03,0x00,0x00,0xDA,0x7C,0xE7,0x9F,0xE5, + 0xB0,0x30,0xDE,0xE1,0x01,0x30,0x83,0xE2,0xB0,0x30,0xCE,0xE1,0xE8,0x31,0x9D,0xE5, + 0x01,0x20,0x82,0xE2,0xB0,0x40,0xC3,0xE1,0xC0,0x31,0x9D,0xE5,0x0E,0x00,0x52,0xE3, + 0x04,0x30,0x83,0xE0,0xC4,0x41,0x9D,0xE5,0x01,0xC0,0x8C,0xE2,0x04,0x30,0x83,0xE0, + 0xC4,0x31,0x8D,0xE5,0x57,0xFF,0xFF,0x3A,0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3, + 0x53,0xFF,0xFF,0x3A,0x20,0x07,0x9F,0xE5,0x70,0x20,0x9D,0xE5,0x00,0x20,0x80,0xE5, + 0x18,0x07,0x9F,0xE5,0xC8,0x21,0x9D,0xE5,0x00,0x20,0x80,0xE5,0x10,0x07,0x9F,0xE5, + 0x00,0x60,0x80,0xE5,0xE0,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x7D,0x0F,0x50,0xE3, + 0xD8,0x06,0x9F,0x25,0x00,0x00,0x90,0x25,0x7D,0x0F,0x50,0x23,0xD0,0x06,0x9F,0x25, + 0x00,0x00,0x90,0x25,0x7D,0x0F,0x50,0x23,0x08,0x00,0x00,0x3A,0xC4,0x06,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0x7D,0x0F,0x50,0xE3,0x04,0x00,0x00,0x3A,0xE0,0x36,0x9F,0xE5, + 0x00,0x00,0x93,0xE5,0xC8,0x00,0x50,0xE3,0x01,0x00,0x80,0x32,0x00,0x00,0x83,0x35, + 0xA4,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xC8,0x00,0x50,0xE3,0x9C,0x06,0x9F,0x25, + 0x00,0x00,0x90,0x25,0xC8,0x00,0x50,0x23,0x94,0x06,0x9F,0x25,0x00,0x00,0x90,0x25, + 0xC8,0x00,0x50,0x23,0x08,0x00,0x00,0x3A,0x88,0x06,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xC8,0x00,0x50,0xE3,0x04,0x00,0x00,0x3A,0x98,0x36,0x9F,0xE5,0x00,0x00,0x93,0xE5, + 0xC8,0x00,0x50,0xE3,0x01,0x00,0x80,0x32,0x00,0x00,0x83,0x35,0x88,0x06,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0x03,0x00,0x50,0xE3,0xE4,0x01,0x8D,0xE5,0x15,0x00,0x00,0x2A, + 0x78,0x36,0x9F,0xE5,0x64,0x00,0x56,0xE3,0x00,0x00,0x93,0x35,0xFA,0x00,0x50,0x33, + 0x03,0x00,0x00,0x2A,0x00,0x00,0x50,0xE3,0x0E,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2, + 0x0B,0x00,0x00,0xEA,0xC8,0x00,0x56,0xE3,0x03,0x00,0x00,0x9A,0x00,0x00,0x93,0xE5, + 0x7D,0x0F,0x50,0xE3,0x07,0x00,0x00,0x2A,0x04,0x00,0x00,0xEA,0x96,0x00,0x56,0xE3, + 0x04,0x00,0x00,0x9A,0x00,0x00,0x93,0xE5,0x4B,0x0F,0x50,0xE3,0x01,0x00,0x00,0x2A, + 0x01,0x00,0x80,0xE2,0x00,0x00,0x83,0xE5,0x08,0x06,0x9F,0xE5,0x20,0x46,0x9F,0xE5, + 0x8C,0x00,0x80,0xE0,0xB0,0x00,0xD0,0xE1,0x00,0xE0,0xA0,0xE3,0x00,0x0A,0xA0,0xE1, + 0x20,0x0A,0xA0,0xE1,0xE0,0x01,0x8D,0xE5,0x02,0x02,0x62,0xE0,0x00,0x61,0xA0,0xE1, + 0x02,0x02,0x62,0xE0,0x80,0x00,0x80,0xE0,0xDC,0x01,0x8D,0xE5,0x02,0x02,0x62,0xE0, + 0x80,0x00,0xA0,0xE1,0xD8,0x01,0x8D,0xE5,0x02,0x01,0x82,0xE0,0x00,0x01,0xA0,0xE1, + 0xD4,0x01,0x8D,0xE5,0x02,0x02,0x62,0xE0,0xD0,0x01,0x8D,0xE5,0x00,0x30,0xA0,0xE3, + 0xE4,0xC1,0x9D,0xE5,0x00,0x00,0x51,0xE3,0xE0,0x01,0x9D,0xE5,0x00,0x10,0xA0,0xB3, + 0x03,0x00,0x5C,0xE3,0x36,0x00,0x00,0x2A,0xEE,0xCF,0xA0,0xE3,0x02,0xCB,0x8C,0xE2, + 0x0C,0x00,0x52,0xE1,0x07,0x00,0x00,0x9A,0x94,0xB6,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1, + 0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1,0x2F,0x00,0x00,0xAA,0x4B,0x0F,0x50,0xE3, + 0x2D,0x00,0x00,0xDA,0x28,0x00,0x00,0xEA,0x7D,0x0E,0x52,0xE3,0x08,0x00,0x00,0x9A, + 0xDC,0xC1,0x9D,0xE5,0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0, + 0x00,0x00,0x5C,0xE1,0x24,0x00,0x00,0xAA,0xC8,0x00,0x50,0xE3,0x22,0x00,0x00,0xDA, + 0x1D,0x00,0x00,0xEA,0xFA,0x0F,0x52,0xE3,0x08,0x00,0x00,0x9A,0xD8,0xC1,0x9D,0xE5, + 0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1, + 0x19,0x00,0x00,0xAA,0x64,0x00,0x50,0xE3,0x17,0x00,0x00,0xDA,0x12,0x00,0x00,0xEA, + 0x7D,0x0F,0x52,0xE3,0x08,0x00,0x00,0x9A,0xD4,0xC1,0x9D,0xE5,0x94,0xBC,0xCC,0xE0, + 0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1,0x0E,0x00,0x00,0xAA, + 0x64,0x00,0x50,0xE3,0x0C,0x00,0x00,0xDA,0x07,0x00,0x00,0xEA,0xD0,0xC1,0x9D,0xE5, + 0x94,0xBC,0xCC,0xE0,0xCC,0xB2,0xA0,0xE1,0xCC,0xCF,0x4B,0xE0,0x00,0x00,0x5C,0xE1, + 0x05,0x00,0x00,0xAA,0x64,0x00,0x50,0xE3,0x03,0x00,0x00,0xDA,0x01,0x50,0x85,0xE2, + 0x01,0x00,0x00,0xEA,0x00,0x00,0x55,0xE3,0x01,0x50,0x45,0x12,0x01,0x30,0x83,0xE2, + 0x0E,0x00,0x53,0xE3,0xBD,0xFF,0xFF,0x3A,0x01,0xE0,0x8E,0xE2,0x15,0x00,0x5E,0xE3, + 0xB9,0xFF,0xFF,0x3A,0x08,0x00,0x9D,0xE5,0xF0,0x11,0x9D,0xE5,0xB0,0x08,0xC1,0xE1, + 0x04,0x00,0x9D,0xE5,0xF0,0x11,0x9D,0xE5,0xB2,0x08,0xC1,0xE1,0xF0,0x01,0x9D,0xE5, + 0xB4,0x58,0xC0,0xE1,0xDC,0xF7,0xFF,0xEB,0x3C,0x04,0x9F,0xE5,0x2C,0x64,0x9F,0xE5, + 0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xC6,0xE1,0xB0,0x00,0xD4,0xE1, + 0x01,0x00,0x10,0xE3,0x08,0x00,0x00,0x0A,0xC4,0x01,0x9D,0xE5,0xBC,0x11,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x6C,0x14,0x9F,0xE5,0x91,0x20,0x80,0xE0,0xB4,0x10,0xD4,0xE1, + 0x20,0x06,0xA0,0xE1,0x00,0x00,0x51,0xE1,0xBE,0x00,0xC6,0x81,0x58,0xC4,0x9F,0xE5, + 0x00,0x00,0xA0,0xE3,0x57,0xEF,0x8D,0xE2,0x9C,0x30,0x8D,0xE2,0x08,0x20,0xD4,0xE5, + 0x00,0x11,0x9E,0xE7,0x92,0x01,0x01,0xE0,0x9C,0x51,0x82,0xE0,0xA2,0x54,0xA0,0xE1, + 0xB0,0x21,0xD4,0xE1,0x02,0x00,0x55,0xE1,0x9C,0x21,0x81,0x90,0x09,0x50,0xD4,0xE5, + 0xA1,0x24,0xA0,0x91,0x00,0x11,0x93,0xE7,0x91,0x05,0x05,0xE0,0x9C,0xB5,0x81,0xE0, + 0xA1,0xB4,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x5B,0xE1,0x9C,0x55,0x81,0x90, + 0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1,0x92,0x01,0x01,0xE0, + 0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0,0x02,0x21,0x82,0xE0, + 0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0,0x80,0x20,0x86,0xE0, + 0x01,0x00,0x80,0xE2,0x15,0x00,0x50,0xE3,0xB8,0x18,0xC2,0xE1,0xDE,0xFF,0xFF,0x3A, + 0xC8,0x33,0x9F,0xE5,0x00,0x50,0xA0,0xE3,0xFC,0x20,0x8D,0xE2,0x0A,0x10,0xD4,0xE5, + 0x05,0x01,0x92,0xE7,0x91,0x00,0x00,0xE0,0x93,0xC0,0x81,0xE0,0xA1,0xC5,0xA0,0xE1, + 0xB4,0x11,0xD4,0xE1,0x01,0x00,0x5C,0xE1,0x93,0x10,0x80,0x90,0xA0,0x15,0xA0,0x91, + 0x0B,0xC0,0xD4,0xE5,0x3C,0x00,0x8D,0xE2,0x05,0x01,0x90,0xE7,0x90,0x0C,0x0C,0xE0, + 0x93,0xBC,0x80,0xE0,0xA0,0xB5,0xA0,0xE1,0xB6,0x01,0xD4,0xE1,0x00,0x00,0x5B,0xE1, + 0x93,0xCC,0x80,0x90,0xA0,0x05,0xA0,0x91,0x00,0x00,0x41,0xE0,0xBE,0x10,0xD4,0xE1, + 0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0, + 0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0, + 0x85,0x10,0x86,0xE0,0x01,0x50,0x85,0xE2,0x0D,0x00,0x55,0xE3,0xB8,0x0B,0xC1,0xE1, + 0xDD,0xFF,0xFF,0x3A,0x0A,0x10,0xD4,0xE5,0x05,0x01,0x92,0xE7,0x64,0x20,0xA0,0xE3, + 0x91,0x00,0x00,0xE0,0x28,0x13,0x9F,0xE5,0x15,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0, + 0xCC,0x11,0x8D,0xE5,0x85,0xE7,0xFF,0xEB,0xB4,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1, + 0x00,0xB0,0xA0,0x91,0x01,0xB0,0xA0,0x81,0x0B,0x10,0xD4,0xE5,0x3C,0x00,0x8D,0xE2, + 0x05,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0,0xCC,0x11,0x9D,0xE5,0x7B,0xE7,0xFF,0xEB, + 0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0x81,0xBE,0x10,0xD4,0xE1, + 0x00,0x00,0x4B,0xE0,0x00,0x00,0x58,0xE3,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0, + 0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x85,0x10,0x86,0xE0,0xB8,0x0B,0xC1,0xE1, + 0x0C,0x00,0x00,0xDA,0x38,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0,0xB8,0x1B,0xD0,0xE1, + 0x34,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0,0xB8,0x08,0xD0,0xE1,0x01,0x00,0x80,0xE0, + 0x00,0x00,0x48,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB8,0x0E,0xC6,0xE1, + 0x00,0x00,0xA0,0x43,0xB8,0x0E,0xC6,0x41,0x11,0x50,0xA0,0xE3,0x01,0x5C,0x85,0xE2, + 0x10,0x00,0x9D,0xE5,0x05,0x10,0xA0,0xE1,0x58,0xE7,0xFF,0xEB,0x00,0x40,0xA0,0xE1, + 0x14,0x00,0x9D,0xE5,0x05,0x10,0xA0,0xE1,0x54,0xE7,0xFF,0xEB,0x00,0x10,0xA0,0xE1, + 0xB6,0x00,0xD6,0xE1,0x40,0x00,0x10,0xE3,0x0F,0x00,0x00,0x0A,0x89,0x00,0x57,0xE1, + 0x01,0x20,0xA0,0x83,0x2C,0x20,0x8D,0x85,0x4B,0x0F,0x54,0xE3,0x01,0x20,0xA0,0x83, + 0x28,0x20,0x8D,0x85,0x0C,0x20,0x9D,0xE5,0x28,0x00,0x52,0xE3,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0x28,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x33,0x20,0x20,0x8D,0x35, + 0x14,0x00,0x57,0xE3,0x12,0x00,0x00,0x9A,0x0F,0x00,0x00,0xEA,0x09,0x00,0x57,0xE1, + 0x08,0x00,0x57,0x83,0x01,0x20,0xA0,0x83,0x2C,0x20,0x8D,0x85,0x96,0x00,0x54,0xE3, + 0x01,0x20,0xA0,0x83,0x28,0x20,0x8D,0x85,0x0C,0x20,0x9D,0xE5,0x14,0x00,0x52,0xE3, + 0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0x14,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x33, + 0x20,0x20,0x8D,0x35,0x0A,0x00,0x57,0xE3,0x01,0x00,0x00,0x9A,0x01,0x20,0xA0,0xE3, + 0x1C,0x20,0x8D,0xE5,0xF1,0x20,0xD6,0xE5,0x00,0x00,0x52,0xE3,0x03,0x00,0x00,0x1A, + 0xB0,0x21,0x9F,0xE5,0x00,0x20,0xD2,0xE5,0x01,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A, + 0xF2,0x20,0xD6,0xE5,0xFA,0x00,0x52,0xE3,0x06,0x00,0x00,0x2A,0x01,0x20,0x82,0xE2, + 0x03,0x00,0x00,0xEA,0xF2,0x20,0xD6,0xE5,0x00,0x00,0x52,0xE3,0x01,0x00,0x00,0x0A, + 0x01,0x20,0x42,0xE2,0xF2,0x20,0xC6,0xE5,0x28,0x30,0x8D,0xE2,0x0C,0x00,0x93,0xE8, + 0x10,0x00,0x10,0xE3,0x1C,0x00,0x9D,0x15,0x02,0x30,0x83,0xE1,0x24,0x20,0x9D,0xE5, + 0x20,0xC0,0x9D,0xE5,0x00,0x00,0x50,0x13,0x0C,0x20,0x02,0xE0,0x03,0x20,0x82,0xE1, + 0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1,0x00,0x00,0x50,0xE3, + 0xF2,0x00,0xD6,0x15,0x05,0x00,0x50,0x13,0x08,0x00,0x00,0x9A,0x38,0x01,0x9F,0xE5, + 0x81,0x10,0x81,0xE0,0x90,0x21,0x81,0xE0,0xA1,0x01,0xA0,0xE1,0x04,0x00,0x50,0xE1, + 0x28,0x01,0x9F,0x35,0xB0,0x00,0xD0,0x31,0xAF,0x0F,0x50,0x33,0x02,0x00,0x00,0x3A, + 0x30,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xEC,0x00,0x96,0xE5, + 0x01,0x00,0x80,0xE2,0xEC,0x00,0x86,0xE5,0xF0,0x00,0xD6,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x40,0x12,0xF0,0x00,0xC6,0x15,0x0D,0x00,0x00,0xEA,0xF0,0x00,0xD6,0xE5, + 0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0xF0,0x00,0xC6,0xE5,0xEC,0x11,0x9D,0xE5, + 0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1,0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3, + 0xF0,0x00,0xC6,0xE5,0xEC,0x00,0x96,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2, + 0xEC,0x00,0x86,0xC5,0xF2,0x00,0xD6,0xE5,0x0A,0x00,0x50,0xE3,0x7D,0xDF,0x8D,0x22, + 0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21,0xEC,0x00,0x96,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0xC3,0xEC,0x00,0x86,0xC5,0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC6,0xE5, + 0x7D,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x75,0x05,0x00,0x20,0x00,0x95,0x00,0x00,0x78,0x06,0x00,0x20, + 0xF5,0x05,0x00,0x20,0xC4,0x05,0x00,0x20,0xC8,0x05,0x00,0x20,0xCC,0x05,0x00,0x20, + 0xD0,0x05,0x00,0x20,0xD4,0x05,0x00,0x20,0xD8,0x05,0x00,0x20,0xDC,0x05,0x00,0x20, + 0xE0,0x05,0x00,0x20,0xE4,0x05,0x00,0x20,0xE8,0x05,0x00,0x20,0xEC,0x05,0x00,0x20, + 0x98,0x05,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10, + 0x7C,0x05,0x00,0x20,0xA4,0x05,0x00,0x20,0xA8,0x05,0x00,0x20,0xA0,0x05,0x00,0x20, + 0x9C,0x05,0x00,0x20,0x1F,0x85,0xEB,0x51,0x2B,0x75,0xAA,0x23,0x91,0x73,0x9F,0x5D, + 0x2D,0x34,0xA9,0xF9,0x00,0x93,0x00,0x00,0x67,0x05,0x00,0x20,0xCD,0xCC,0xCC,0xCC, + 0x7A,0x05,0x00,0x20,0xF0,0xB5,0xFD,0x48,0x00,0x27,0x8B,0xB0,0x04,0x97,0x00,0x68, + 0x3C,0x00,0x80,0x79,0x02,0x90,0xFA,0x48,0x42,0x79,0x05,0x00,0xC0,0x35,0x00,0x92, + 0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xAB,0x7A,0x00,0x7A,0xFD,0xF7,0xAD,0xFD, + 0x00,0x06,0x69,0x7A,0x00,0x0E,0xFD,0xF7,0x9D,0xFD,0x29,0x00,0x20,0x39,0x0A,0x7A, + 0x00,0x06,0xC0,0x39,0x09,0x79,0x00,0x0E,0xFD,0xF7,0x98,0xFD,0x29,0x00,0x80,0x39, + 0x8A,0x7D,0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E,0xFD,0xF7,0x8F,0xFD,0x00,0x06, + 0xE8,0x4E,0x00,0x0E,0x01,0x90,0x70,0x7C,0x00,0x28,0x03,0xD0,0x28,0x00,0x80,0x30, + 0x40,0x89,0x07,0xE0,0xE1,0x48,0xE4,0x49,0x00,0x68,0x49,0x8B,0x40,0x88,0x40,0x18, + 0x00,0x04,0x00,0x0C,0x03,0x90,0x00,0x20,0xF0,0x61,0x0F,0x20,0xB0,0x71,0x70,0x7B, + 0x00,0x28,0x06,0xD0,0xB0,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0xF7,0xFC,0x01,0xF0, + 0xE5,0xFC,0x01,0x25,0xB5,0x62,0xFB,0xF7,0xF9,0xFC,0x00,0x20,0x30,0x71,0x30,0x64, + 0x70,0x64,0xC8,0x20,0xB0,0x63,0x00,0x20,0xF0,0x63,0xB0,0x82,0xB0,0x64,0xF0,0x64, + 0x30,0x65,0x68,0x03,0xFA,0xF7,0xCA,0xF9,0xF9,0xF7,0x88,0xFD,0xF9,0xF7,0x6C,0xFD, + 0x00,0xF0,0xE0,0xFF,0x01,0xF0,0xF4,0xF9,0x00,0xF0,0x68,0xFF,0xCB,0x49,0x00,0x20, + 0x88,0x60,0xCB,0x48,0x05,0x21,0x0A,0x90,0xCA,0x48,0xC9,0x01,0x41,0x18,0x09,0x91, + 0xC5,0x49,0x80,0x30,0xA0,0x39,0x07,0xAA,0x03,0xC2,0x01,0x98,0xC0,0x1C,0x06,0x90, + 0xC5,0x48,0x05,0x90,0xF0,0xE1,0x70,0x7B,0x00,0x28,0x04,0xD0,0xB0,0x6D,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0xBB,0xFC,0x80,0x20,0xFA,0xF7,0xA0,0xF9,0x03,0x20,0x01,0xF0, + 0x2D,0xFB,0x01,0x20,0x40,0x03,0xFA,0xF7,0x99,0xF9,0xF9,0xF7,0x43,0xFD,0xB8,0x48, + 0xC0,0x38,0xC0,0x88,0x01,0x06,0x04,0xD4,0xB1,0x6B,0x64,0x29,0x03,0xD2,0x42,0x06, + 0x01,0xD4,0x01,0x20,0x2D,0xE0,0xFF,0x22,0xC3,0x32,0x91,0x42,0x0E,0xD9,0x40,0x06, + 0x05,0xD5,0xAE,0x48,0xB1,0x49,0x80,0x30,0x01,0x62,0x27,0x21,0x18,0xE0,0xAB,0x48, + 0xFF,0x21,0x01,0x31,0x80,0x30,0x01,0x62,0x2B,0x21,0x11,0xE0,0xFF,0x22,0x5F,0x32, + 0x91,0x42,0x11,0xD9,0x40,0x06,0x05,0xD5,0xA4,0x48,0xA8,0x49,0x80,0x30,0x01,0x62, + 0x26,0x21,0x05,0xE0,0xA1,0x48,0xFF,0x21,0x01,0x31,0x80,0x30,0x01,0x62,0x2A,0x21, + 0x41,0x62,0x05,0x21,0xC1,0x62,0x06,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0, + 0x03,0x20,0x01,0xF0,0x9F,0xF9,0xFB,0xF7,0xE1,0xFE,0x99,0x48,0x03,0x99,0x80,0x30, + 0x80,0x88,0x40,0x18,0x96,0x49,0xC0,0x39,0x89,0x89,0x88,0x42,0x14,0xD9,0x94,0x48, + 0xC0,0x30,0x40,0x7A,0x00,0x28,0x0F,0xD1,0x91,0x48,0xFF,0x21,0xC0,0x38,0xC0,0x88, + 0x19,0x31,0x08,0x42,0x08,0xD1,0x02,0x98,0x64,0x1C,0x84,0x42,0x05,0xDD,0xFB,0xF7, + 0xCD,0xFE,0x01,0x20,0x04,0x90,0x00,0xE0,0x00,0x24,0x00,0xF0,0x3D,0xFF,0x88,0x48, + 0x09,0x99,0xC0,0x38,0xC0,0x88,0x49,0x88,0x40,0x06,0x00,0x28,0x0A,0x98,0xC0,0x6A, + 0x01,0xDA,0x49,0x00,0xFF,0xE7,0x88,0x42,0x00,0xDB,0x75,0x70,0x04,0x98,0x00,0x28, + 0x03,0xD0,0xF9,0xF7,0xC9,0xFC,0x00,0x20,0x04,0x90,0xFB,0xF7,0x6D,0xFE,0xFB,0xF7, + 0x7B,0xFE,0x00,0x20,0x30,0x83,0xFD,0xF7,0xF1,0xF8,0x00,0x28,0x09,0xD0,0x00,0x20, + 0xF0,0x61,0x05,0x98,0xC0,0x8A,0xC8,0x28,0x25,0xD2,0x05,0x99,0x40,0x1C,0xC8,0x82, + 0x21,0xE0,0xF0,0x69,0x40,0x1C,0xF0,0x61,0xF0,0x69,0x01,0x28,0x04,0xD1,0x72,0x49, + 0x00,0x20,0x20,0x31,0x88,0x74,0xF0,0x63,0xF0,0x69,0x05,0x28,0x04,0xD9,0xFB,0xF7, + 0x1D,0xFC,0x05,0x99,0x00,0x20,0xC8,0x82,0xF1,0x69,0x01,0x98,0x40,0x1C,0x81,0x42, + 0x09,0xD1,0x00,0x20,0x30,0x71,0x30,0x64,0x70,0x64,0xB0,0x82,0xB0,0x64,0xF0,0x64, + 0x30,0x65,0xDC,0x20,0xB0,0x63,0xF1,0x6C,0xB0,0x6C,0x08,0x43,0x04,0xD0,0x30,0x6D, + 0xFA,0x28,0x01,0xD2,0x40,0x1C,0x30,0x65,0xF0,0x8A,0x61,0x49,0x88,0x42,0x01,0xD2, + 0x40,0x1C,0xF0,0x82,0x5A,0x48,0x20,0x30,0x40,0x7C,0x00,0x28,0x70,0x79,0x03,0xD0, + 0xFA,0x28,0x05,0xD2,0x40,0x1C,0x02,0xE0,0x00,0x28,0x01,0xD0,0x40,0x1E,0x70,0x71, + 0xF1,0x78,0xB0,0x8A,0x00,0x29,0x05,0xD0,0x7D,0x22,0xD2,0x00,0x90,0x42,0x05,0xD2, + 0x40,0x1C,0x02,0xE0,0x00,0x28,0x01,0xD0,0x40,0x1E,0xB0,0x82,0xF0,0x8A,0x23,0x28, + 0x03,0xD2,0x72,0x79,0x19,0x2A,0x00,0xD9,0x75,0x70,0x00,0x29,0x0F,0xD0,0x71,0x79, + 0x4B,0x29,0x04,0xD9,0xAF,0x21,0x89,0x00,0x88,0x42,0x00,0xD2,0x75,0x70,0xB1,0x8A, + 0x4B,0x29,0x04,0xD9,0xAF,0x21,0x89,0x00,0x88,0x42,0x00,0xD2,0x75,0x70,0x30,0x6D, + 0x14,0x28,0x09,0xD9,0x70,0x6B,0xFF,0x21,0x91,0x31,0x88,0x42,0x04,0xD2,0xB0,0x6B, + 0xC8,0x28,0x01,0xD2,0x75,0x70,0x02,0xE0,0x70,0x78,0x00,0x28,0x10,0xD0,0xFB,0xF7, + 0xA3,0xFE,0xFB,0xF7,0xD9,0xFD,0x01,0x20,0x80,0x03,0xFA,0xF7,0x8F,0xF8,0xFB,0xF7, + 0xEB,0xFD,0xFB,0xF7,0x99,0xFE,0xF9,0xF7,0x11,0xFD,0xFB,0xF7,0xB9,0xFB,0x28,0xE0, + 0x34,0x48,0x41,0x68,0x09,0x07,0x0C,0xD5,0xC1,0x68,0x00,0x29,0x09,0xD0,0xC0,0x68, + 0x07,0x28,0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0x09,0xE0,0x00,0xF0,0x9A,0xFA, + 0x06,0xE0,0x01,0xF0,0xF9,0xF8,0xB0,0x7C,0x80,0x28,0x01,0xD1,0xFB,0xF7,0x9C,0xFC, + 0xFB,0xF7,0x7A,0xFE,0xFB,0xF7,0xB0,0xFD,0x01,0x20,0x80,0x03,0xFA,0xF7,0x66,0xF8, + 0xFB,0xF7,0xC2,0xFD,0x00,0xF0,0x78,0xF9,0x07,0x00,0xFB,0xF7,0x6D,0xFE,0xF9,0xF7, + 0xE5,0xFC,0x70,0x78,0x00,0x28,0x3F,0xD0,0xFB,0xF7,0xE8,0xFD,0x00,0x22,0x01,0x21, + 0x10,0x00,0x13,0x00,0xFB,0xF7,0xAA,0xFB,0xFB,0xF7,0xD8,0xFD,0x11,0x49,0x00,0x20, + 0x48,0x70,0xC8,0x82,0x48,0x71,0x08,0x71,0x88,0x82,0x88,0x64,0xDC,0x22,0xC8,0x64, + 0x8A,0x63,0x08,0x65,0x0E,0x49,0x08,0x23,0xC0,0x39,0xCA,0x88,0x9A,0x43,0xCA,0x80, + 0xCA,0x88,0x5B,0x01,0x9A,0x43,0xCA,0x80,0xCA,0x88,0x10,0x23,0x9A,0x43,0xCA,0x80, + 0x08,0x99,0x48,0x74,0x0A,0x99,0xC8,0x62,0x7C,0xE0,0x00,0x00,0x78,0x06,0x00,0x20, + 0x60,0x94,0x00,0x00,0x64,0x05,0x00,0x20,0x40,0x05,0x00,0x20,0x00,0x90,0x00,0x40, + 0x00,0x01,0x00,0x20,0x00,0x93,0x00,0x00,0xE0,0x02,0x00,0x20,0x01,0x02,0x00,0x00, + 0x10,0x27,0x00,0x00,0x00,0x40,0x00,0x30,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0, + 0x70,0x7C,0x00,0x28,0x01,0xD1,0x00,0xF0,0xB1,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B, + 0x0B,0x28,0x57,0xD1,0x03,0x20,0x40,0x03,0xFA,0xF7,0x00,0xF8,0x03,0x20,0x01,0xF0, + 0x6F,0xF9,0x70,0x65,0x03,0x20,0x01,0xF0,0xA1,0xF9,0x80,0x20,0xF9,0xF7,0xF6,0xFF, + 0x00,0x2F,0x0C,0xD0,0x0A,0x20,0x78,0x43,0x71,0x6D,0x08,0x1A,0x70,0x65,0xFF,0x20, + 0x41,0x30,0x78,0x43,0x71,0x6D,0x40,0x18,0xFF,0x38,0x7D,0x38,0x70,0x65,0x25,0x48, + 0x00,0x78,0xB1,0x7A,0x08,0x43,0x2F,0xD1,0x30,0x6B,0x00,0x28,0x2C,0xD0,0x22,0x48, + 0xC0,0x88,0x40,0x06,0x70,0x6D,0x21,0x49,0x0E,0x1A,0xFF,0x20,0x91,0x30,0x86,0x42, + 0x22,0xDD,0xFF,0x20,0x01,0x30,0xF9,0xF7,0xD9,0xFF,0x02,0x20,0x01,0xF0,0x76,0xF9, + 0x0A,0x21,0x30,0x00,0xF9,0xF7,0xEA,0xF9,0x41,0x11,0x02,0x20,0x01,0xF0,0x56,0xF9, + 0x04,0x20,0xFA,0xF7,0x03,0xF8,0x16,0x48,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60, + 0x14,0x48,0x05,0x61,0xFF,0x20,0xF9,0xF7,0xF9,0xFF,0x02,0x20,0x01,0xF0,0x5E,0xF9, + 0xFF,0x20,0x01,0x30,0xF9,0xF7,0xB2,0xFF,0x0F,0x4E,0xF0,0x69,0x06,0x99,0x88,0x42, + 0x00,0xD2,0x08,0xE6,0x0D,0x48,0x00,0x68,0x40,0x30,0x41,0x7D,0x08,0x98,0x41,0x74, + 0x09,0x48,0x40,0x7B,0x00,0x28,0x01,0xD0,0x01,0xF0,0xB8,0xFA,0x0B,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x7D,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x8C,0x3C,0x00,0x00, + 0x00,0x40,0x00,0x40,0x40,0x00,0x00,0x40,0x64,0x05,0x00,0x20,0x78,0x06,0x00,0x20, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47, + 0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x00,0x00,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A, + 0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00, + 0x10,0xB5,0xF9,0xF7,0x29,0xFB,0x03,0x20,0x40,0x03,0xF9,0xF7,0x67,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xF9,0xF7,0x67,0xFF,0xF9,0xF7, + 0x25,0xFB,0xFB,0xF7,0xB9,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0x5F,0xFC,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xF9,0xF7, + 0x7F,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x0F,0x2D,0xE9,0xAC,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1, + 0xA4,0x00,0x9F,0xE5,0xA4,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5,0xA0,0xB0,0x9F,0xE5, + 0x26,0x20,0xA0,0xE3,0x01,0x2C,0x82,0xE2,0x14,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3, + 0x0D,0x00,0xA0,0xE3,0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0, + 0xF8,0x4B,0xD4,0xE1,0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1, + 0x05,0x40,0x84,0xE0,0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A, + 0x0D,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA, + 0x03,0x00,0x00,0xEA,0x14,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3, + 0x00,0x00,0x00,0xBA,0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3, + 0xB0,0xC0,0xC3,0xE1,0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1, + 0x01,0x00,0x50,0xE2,0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A, + 0xF0,0x0F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0xF5,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0xF8,0xB5,0x7C,0x4C,0x00,0x26,0x00,0x96, + 0xE0,0x68,0x07,0x28,0x03,0xD0,0xE0,0x03,0x05,0x68,0x00,0x2D,0x03,0xD1,0x00,0x20, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0xFF,0x20,0x01,0x30,0xF9,0xF7,0xD7,0xFE,0x02,0x20, + 0x01,0xF0,0x74,0xF8,0x00,0xF0,0xF6,0xF8,0x71,0x4F,0x05,0x2D,0xB8,0x7B,0x50,0xD8, + 0x00,0x28,0x50,0xD1,0x01,0x20,0x41,0x07,0x04,0xE0,0x82,0x00,0x52,0x18,0x12,0x68, + 0xE2,0x61,0x40,0x1C,0xA8,0x42,0xF8,0xD9,0x6A,0x48,0x20,0x60,0x21,0x20,0x80,0x02, + 0x20,0x61,0x03,0x20,0xFC,0xF7,0x6E,0xFE,0x67,0x48,0x0A,0x21,0x00,0x6B,0xF9,0xF7, + 0xFD,0xF9,0x41,0x09,0x02,0x20,0x01,0xF0,0x39,0xF8,0x64,0x4D,0xE8,0x68,0x40,0x08, + 0x40,0x00,0xE8,0x60,0x02,0x20,0x01,0xF0,0x39,0xF8,0x04,0x20,0xF9,0xF7,0xDE,0xFE, + 0x5F,0x48,0x01,0x26,0x06,0x61,0x03,0x21,0x09,0x07,0xC8,0x68,0x08,0x22,0x10,0x43, + 0xC8,0x60,0x02,0x20,0x01,0xF0,0x04,0xF8,0x00,0x90,0x60,0x68,0x60,0x60,0x60,0x69, + 0x60,0x61,0xFD,0xF7,0x55,0xF8,0x02,0x20,0x01,0xF0,0x30,0xF8,0x03,0x20,0xFC,0xF7, + 0x31,0xFE,0xE8,0x68,0x30,0x43,0xE8,0x60,0x52,0x48,0x00,0x78,0x00,0x28,0x07,0xD0, + 0x78,0x7B,0x00,0x28,0xFB,0xD0,0xB8,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0x96,0xF9, + 0x86,0xE0,0x00,0x28,0x03,0xD0,0x6D,0x1C,0xFC,0xF7,0x38,0xFC,0x06,0x00,0x4A,0x48, + 0x01,0x68,0x42,0x48,0xC1,0x61,0x44,0x48,0x02,0x24,0x00,0x6B,0x0A,0x21,0xF9,0xF7, + 0xB5,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0,0xF1,0xFF,0x02,0x20,0x00,0xF0,0xF6,0xFF, + 0x3E,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x39,0x48,0x37,0x4F,0x80,0x7B, + 0x21,0x07,0x1D,0xE0,0x7A,0x69,0x52,0x06,0x0A,0xD4,0x00,0x28,0x01,0xD0,0xAC,0x42, + 0x04,0xD2,0xA2,0x00,0x52,0x18,0x12,0x68,0xFA,0x61,0x00,0xE0,0xFE,0x61,0x64,0x1C, + 0x34,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0,0xFC,0xF7,0x62,0xFD,0x2C,0x48,0x41,0x7B, + 0x00,0x29,0x07,0xD0,0x80,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0x57,0xF9,0x01,0xE0, + 0xAC,0x42,0xDF,0xD9,0x02,0x20,0x00,0xF0,0xD9,0xFF,0x2A,0x4D,0x28,0x78,0x00,0x28, + 0x37,0xD1,0xFC,0xF7,0x67,0xFC,0x00,0x28,0x33,0xD0,0x23,0x48,0x0A,0x21,0x00,0x6B, + 0xF9,0xF7,0x74,0xF9,0x01,0x00,0x02,0x20,0x00,0xF0,0xB0,0xFF,0x02,0x20,0x00,0xF0, + 0xB5,0xFF,0x1B,0x4C,0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFC,0xF7,0x38,0xFD, + 0x60,0x7B,0x00,0x28,0x04,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C,0x01,0xF0,0x2E,0xF9, + 0xFC,0xF7,0x48,0xFC,0x00,0x28,0xEE,0xD1,0x78,0x68,0x78,0x60,0x0B,0xE0,0x28,0x78, + 0x00,0x28,0x08,0xD0,0x60,0x7B,0x00,0x28,0x08,0xD0,0xA0,0x6D,0x00,0x04,0x00,0x0C, + 0x01,0xF0,0x1C,0xF9,0x02,0xE0,0x78,0x68,0xC0,0x03,0xF0,0xD5,0x02,0x20,0x00,0xF0, + 0x9D,0xFF,0x00,0xF0,0x1F,0xF8,0x09,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60, + 0xFF,0x20,0x01,0x30,0xF9,0xF7,0xEA,0xFD,0x00,0x98,0x11,0xE7,0x00,0x40,0x00,0x30, + 0x64,0x05,0x00,0x20,0xD0,0x10,0x05,0x00,0x00,0x93,0x00,0x00,0x00,0x20,0x00,0x40, + 0x40,0x00,0x00,0x40,0x7D,0x06,0x00,0x20,0x04,0x00,0x00,0x20,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21, + 0x01,0x62,0xFC,0xF7,0x95,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x70,0x47,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x80,0x18,0x70,0x47,0x00,0x00,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19, + 0x10,0xBC,0x70,0x47,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A, + 0x90,0x73,0x90,0x7B,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9, + 0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21,0x10,0x30,0xF9,0xF7, + 0x09,0xF9,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25,0x08,0x4C,0xAD,0x01, + 0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19, + 0x40,0x1C,0x3E,0x63,0x96,0x7B,0x86,0x42,0xF3,0xD8,0xEA,0xE7,0x20,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0x70,0xB5,0x1F,0x49,0x1D,0x4C,0x0D,0x00,0x20,0x7A,0xAB,0x22, + 0xFF,0x35,0x92,0x00,0xE7,0x35,0x8E,0x18,0x00,0x28,0x0F,0xD0,0xFF,0x31,0x5A,0x22, + 0x8D,0x31,0x28,0x00,0xF9,0xF7,0x0E,0xF9,0x17,0x49,0x09,0x22,0x30,0x00,0xF9,0xF7, + 0x09,0xF9,0x20,0x7A,0x60,0x72,0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21, + 0x30,0x00,0xF9,0xF7,0xCF,0xF8,0x5A,0x22,0x00,0x21,0x28,0x00,0xF9,0xF7,0xCA,0xF8, + 0x0D,0x48,0x5A,0x22,0x00,0x21,0x63,0x38,0xF9,0xF7,0xC4,0xF8,0x0A,0x48,0x09,0x22, + 0x00,0x21,0x09,0x38,0xF9,0xF7,0xBE,0xF8,0x00,0x20,0x06,0x49,0x60,0x72,0xA0,0x72, + 0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x04,0x49,0x88,0x76,0xDB,0xE7,0x00,0x00, + 0xC0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0xE3,0x02,0x00,0x20,0xA0,0x04,0x00,0x20, + 0xF3,0xB5,0x90,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48,0x00,0x78,0x00,0x28, + 0x8E,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8C,0x4A,0x1A,0x26, + 0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E, + 0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F, + 0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91, + 0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49,0x20,0x39,0x8A,0x5E, + 0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22, + 0x41,0x5E,0x82,0x5E,0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60, + 0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E, + 0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x01,0xF0,0x1C,0xF8,0x20,0x8C,0x64,0x21,0x0A,0x90, + 0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38, + 0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28, + 0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x15,0x20,0x08,0x90,0x5D,0x48,0x0E,0x21, + 0x80,0x7F,0xC2,0x07,0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21,0x01,0xE0,0x14,0x20, + 0x08,0x90,0x20,0x00,0xF8,0xF7,0xDA,0xFE,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90, + 0x08,0x99,0x28,0x00,0xF8,0xF7,0xD2,0xFE,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E, + 0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90, + 0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B, + 0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00, + 0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43, + 0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xF8,0xF7,0xA7,0xFE,0xC7,0x19, + 0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00, + 0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xF8,0xF7,0x98,0xFE,0x07,0x99,0xC9,0x07, + 0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0, + 0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB, + 0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21, + 0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98, + 0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99, + 0x49,0x1B,0x89,0x1A,0xF8,0xF7,0x6A,0xFE,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1, + 0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B, + 0x64,0x21,0xF8,0xF7,0x5B,0xFE,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB, + 0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60, + 0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99, + 0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x54,0xFF,0x13,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x93,0x00,0x00,0x75,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0xE0,0x95,0x00,0x00,0xA0,0x04,0x00,0x20,0xFF,0xB5,0x00,0x68,0x8E,0x46,0x84,0x46, + 0x70,0x46,0x1B,0x4B,0x1B,0x49,0x05,0x68,0x00,0x22,0x19,0x4E,0x54,0x00,0x24,0x3E, + 0x34,0x5B,0x66,0x46,0x00,0x20,0x34,0x1B,0x26,0x00,0x74,0x43,0x46,0x00,0x9E,0x5B, + 0xAE,0x1B,0x37,0x00,0x77,0x43,0xE6,0x19,0x8E,0x42,0x18,0xD2,0x51,0x00,0x10,0x4A, + 0x40,0x00,0x24,0x3A,0x52,0x5A,0x02,0x99,0x0A,0x60,0x0D,0x49,0x03,0x9A,0x16,0x39, + 0x0C,0x5A,0x14,0x60,0x09,0x5A,0x72,0x46,0x12,0x68,0x18,0x5A,0x51,0x18,0x09,0x1A, + 0x70,0x46,0x01,0x60,0x01,0x20,0x04,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x1C, + 0x0B,0x28,0xDB,0xD3,0x52,0x1C,0x07,0x2A,0xCF,0xD3,0x00,0x20,0xC0,0x43,0xF2,0xE7, + 0x0C,0x89,0x00,0x00,0x11,0x02,0x00,0x00,0xFE,0xB5,0x67,0x4D,0x65,0x48,0x00,0x26, + 0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x79,0x81,0x31,0x08,0x7A,0x33,0x00,0x00,0x2A, + 0x28,0xD1,0x00,0x28,0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00, + 0xFF,0x30,0x93,0x30,0xFC,0xF7,0x84,0xFC,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B, + 0x00,0x98,0x40,0x1C,0x81,0x42,0x14,0xD3,0xA9,0x19,0x27,0x22,0x00,0x90,0xFF,0x20, + 0x52,0x01,0x8D,0x30,0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x71,0x76,0x1C, + 0x8D,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x0E,0xFA,0x64,0x1C,0x09,0x2C, + 0xDA,0xDB,0x91,0xE0,0x49,0x7A,0x00,0x29,0x01,0xD1,0x00,0x28,0x75,0xD0,0x0B,0x20, + 0x80,0x01,0x00,0x24,0x2E,0x18,0x27,0x27,0x7F,0x01,0x28,0x19,0xC0,0x19,0x40,0x79, + 0x00,0x28,0x3C,0xD0,0x29,0x18,0x15,0x20,0x40,0x01,0x08,0x18,0xC1,0x78,0x00,0x29, + 0x02,0xD0,0xB2,0x7C,0x00,0x2A,0x11,0xD0,0x00,0x99,0x00,0x7B,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xE7,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0xE2,0xF9,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x93,0x30,0xFC,0xF7,0x32,0xFC,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x8D,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0xC9,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x79,0x40,0x1C, + 0x4A,0x71,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBD,0xDB,0x01,0x24, + 0x25,0x49,0x15,0x20,0x0A,0x19,0x40,0x01,0x10,0x18,0xC0,0x78,0x00,0x22,0x01,0x92, + 0x00,0x28,0x32,0xD0,0xB2,0x7C,0x00,0x2A,0x2F,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x93,0x30,0xFC,0xF7,0x03,0xFC,0x00,0x28,0x25,0xD0,0x1B,0x48, + 0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x26,0xD3,0x17,0x4A,0x00,0x20,0x11,0x18, + 0xC9,0x19,0x49,0x79,0xA1,0x42,0x0C,0xD0,0x00,0x29,0x07,0xD1,0xFF,0x21,0x8D,0x31, + 0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x71,0x06,0xE0,0x12,0xE0,0x40,0x1C,0x08,0x28, + 0xED,0xDB,0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0x8D,0x32, + 0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x7F,0xF9,0x64,0x1C,0x09,0x2C,0xBF,0xDB, + 0x02,0xE0,0x01,0x20,0x40,0x07,0x43,0x60,0x00,0x98,0x00,0xF0,0xB3,0xFC,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00, + 0xFC,0xB5,0x4E,0x48,0x36,0x25,0x45,0x5F,0x15,0x20,0x84,0x46,0x4B,0x48,0x4C,0x4F, + 0x80,0x30,0x82,0x7D,0x86,0x46,0x4B,0x48,0x00,0x26,0x81,0x7F,0x0E,0x24,0xC8,0x07, + 0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24,0x01,0xE0,0x14,0x20,0x84,0x46,0x00,0x21, + 0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A, + 0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2, + 0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3, + 0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42, + 0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3, + 0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48, + 0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A, + 0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04,0x12,0x14,0x25,0x48,0xA0,0x30, + 0x01,0x69,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C, + 0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x01,0x61,0x1E,0x49,0xA0,0x31,0x49,0x69, + 0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29, + 0x01,0xDD,0x49,0x1E,0x41,0x61,0x74,0x46,0xA4,0x8B,0x05,0x69,0x01,0x22,0x11,0x00, + 0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0x40,0x69,0x98,0x42,0x00,0xDC,0x00,0x22, + 0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A, + 0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0, + 0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28, + 0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0xD4,0x02,0x10,0x40,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x25,0x48, + 0x25,0x4C,0xC0,0x88,0x01,0x23,0x25,0x4D,0x41,0x06,0x09,0x20,0x80,0x01,0x24,0x4F, + 0x24,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29,0x10,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69, + 0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60, + 0x80,0x6B,0x28,0x61,0x1C,0x48,0xA8,0x62,0xE0,0x6A,0x10,0xE0,0x1B,0x49,0x4A,0x69, + 0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62, + 0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0x15,0x48,0xA8,0x62,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xF8,0xF7,0x69,0xFD,0x30,0x63,0x70,0x7C,0x00,0x28, + 0x04,0xD0,0x10,0x48,0xE8,0x60,0x01,0x20,0x00,0x05,0x28,0x61,0x60,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xF8,0xF7,0x59,0xFD,0xF0,0x62,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0xC0,0x90,0x00,0x40, + 0x10,0x27,0x00,0x00,0x64,0x05,0x00,0x20,0x00,0x00,0x08,0x84,0x80,0x94,0x00,0x00, + 0x00,0x00,0x04,0x82,0x41,0x20,0x01,0x00,0x07,0x48,0x41,0x7A,0x07,0x48,0x02,0x29, + 0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29,0x01,0xD1,0xC0,0x69,0x00,0xE0,0x80,0x69, + 0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00,0xC0,0x01,0x00,0x20,0xC0,0x94,0x00,0x00, + 0xC0,0x90,0x00,0x40,0x0F,0x48,0x10,0xB4,0xC0,0x88,0x0F,0x4A,0x01,0x23,0x44,0x06, + 0x0E,0x48,0x00,0x21,0x1B,0x04,0x00,0x2C,0x02,0x61,0x05,0xDA,0x0C,0x4A,0x42,0x61, + 0x81,0x61,0xC1,0x61,0x03,0x62,0x07,0xE0,0x09,0x4A,0x64,0x3A,0x42,0x61,0x81,0x61, + 0xC1,0x61,0x03,0x62,0x06,0x4A,0xC8,0x3A,0x42,0x62,0x81,0x62,0xC1,0x62,0x10,0xBC, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x00,0x00,0x01,0x03,0x40,0xA1,0x00,0x40, + 0x2C,0x01,0x01,0x00,0x10,0x49,0x10,0xB4,0x0A,0x7D,0x10,0x48,0x82,0x77,0x4A,0x7D, + 0xC2,0x77,0x82,0x7F,0x0E,0x48,0xD3,0x07,0x0A,0xD0,0x93,0x07,0x0D,0x4A,0x03,0xD5, + 0x0D,0x23,0x03,0x73,0x00,0x23,0x02,0xE0,0x14,0x23,0x03,0x73,0x01,0x23,0x53,0x72, + 0x8A,0x7D,0x42,0x73,0xCA,0x7D,0x82,0x73,0x0A,0x7E,0xC2,0x73,0x4A,0x7E,0x02,0x74, + 0x89,0x7E,0x41,0x74,0x10,0xBC,0x70,0x47,0x00,0x93,0x00,0x00,0xA0,0x04,0x00,0x20, + 0xE0,0x04,0x00,0x20,0x64,0x05,0x00,0x20,0xFF,0xB5,0x05,0x00,0x14,0x00,0x19,0x00, + 0x10,0x00,0x81,0xB0,0xF9,0xF7,0x9C,0xFF,0x00,0x28,0x08,0xD0,0x02,0x98,0x02,0x99, + 0x00,0x68,0x40,0x1E,0x08,0x60,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x29,0x48, + 0x80,0x7F,0xC0,0x07,0x22,0xD0,0xE0,0x79,0x05,0x28,0x1D,0xD0,0x09,0x28,0x1D,0xD1, + 0x25,0x4F,0x6D,0x08,0x3E,0x00,0x6D,0x00,0x01,0x20,0xFF,0x36,0x22,0x78,0x81,0x36, + 0x0E,0xE0,0x0A,0x21,0x41,0x43,0xC9,0x19,0xFF,0x31,0xE1,0x31,0x8B,0x79,0x9A,0x42, + 0x05,0xD1,0x0B,0x89,0x63,0x80,0xCB,0x79,0x63,0x70,0x49,0x89,0xA1,0x80,0x40,0x1C, + 0x71,0x7A,0x81,0x42,0xED,0xDA,0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x21,0xA8,0x07, + 0x89,0x06,0x88,0x43,0x21,0x78,0x62,0x78,0x09,0x07,0x89,0x08,0x08,0x43,0x13,0x49, + 0x92,0x06,0x08,0x40,0x61,0x88,0x12,0x0C,0x89,0x05,0x89,0x09,0x08,0x43,0x3F,0x21, + 0x89,0x02,0x88,0x43,0x10,0x43,0x02,0x04,0x92,0x0E,0x0F,0x2A,0x03,0xD9,0x88,0x43, + 0x0F,0x21,0x89,0x02,0x40,0x18,0xA1,0x88,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D, + 0x08,0x43,0x02,0x99,0x01,0x22,0x09,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60, + 0xA9,0xE7,0x00,0x00,0xA0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x10,0x49,0x10,0xB5,0x88,0x7C,0x00,0x28,0x14,0xD0,0x00,0x09,0x00,0x01,0x00,0x23, + 0x01,0x22,0x40,0x28,0x0B,0xD0,0x80,0x28,0x0C,0xD1,0x8A,0x73,0xCA,0x73,0x0A,0x48, + 0x0A,0x74,0x0A,0x73,0x00,0x78,0x00,0x28,0x07,0xD1,0x4B,0x74,0x06,0xE0,0xCB,0x72, + 0x0A,0x73,0x4B,0x73,0x10,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x74,0x00,0x20,0x00,0xF0, + 0xC7,0xF9,0xF7,0xE7,0x64,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0xF0,0x41,0x2D,0xE9, + 0x00,0xC0,0xA0,0xE1,0x1C,0x50,0x9D,0xE5,0x18,0x60,0x9D,0xE5,0x01,0x00,0x5C,0xE1, + 0x01,0x40,0xA0,0xE1,0x02,0x00,0xA0,0xE1,0x03,0x70,0xA0,0xE1,0x06,0x00,0x00,0x3A, + 0x04,0x10,0xA0,0xE1,0x81,0xE1,0xFF,0xEB,0xB0,0x00,0xC6,0xE1,0x04,0x10,0xA0,0xE1, + 0x07,0x00,0xA0,0xE1,0x7D,0xE1,0xFF,0xEB,0xB0,0x00,0xC5,0xE1,0xF0,0x41,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0xF0,0x47,0x2D,0xE9,0x00,0x40,0xA0,0xE1,0x20,0x80,0x8D,0xE2, + 0x28,0x60,0x8D,0xE2,0x01,0x01,0x98,0xE8,0x60,0x00,0x96,0xE8,0x02,0x00,0x51,0xE1, + 0xB2,0x50,0xC4,0xB1,0xB4,0x60,0xC4,0xB1,0x11,0x00,0x00,0xBA,0x03,0x00,0x51,0xE1, + 0xB2,0x00,0xC4,0xA1,0xB4,0x80,0xC4,0xA1,0x0D,0x00,0x00,0xAA,0x02,0x70,0x41,0xE0, + 0x05,0x00,0x40,0xE0,0x97,0x00,0x00,0xE0,0x02,0x90,0x43,0xE0,0x09,0x10,0xA0,0xE1, + 0x66,0xE1,0xFF,0xEB,0x05,0x00,0x80,0xE0,0xB2,0x00,0xC4,0xE1,0x06,0x00,0x48,0xE0, + 0x97,0x00,0x00,0xE0,0x09,0x10,0xA0,0xE1,0x60,0xE1,0xFF,0xEB,0x06,0x00,0x80,0xE0, + 0xB4,0x00,0xC4,0xE1,0xF0,0x47,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xF0,0xB4,0x8C,0x79, + 0x14,0x4B,0x00,0x26,0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02, + 0x5B,0x07,0x09,0xD5,0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D, + 0x3A,0x43,0x64,0x00,0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79, + 0x80,0x00,0x9B,0x06,0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60, + 0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x76,0x06,0x77, + 0xF0,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xA0,0x04,0x00,0x20, + 0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06, + 0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B, + 0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x10,0xB4,0x0E,0x24,0x60,0x43,0x03,0x4B, + 0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06, + 0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D, + 0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20, + 0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x70,0xB4,0x12,0x4A,0x11,0x4D,0x52,0x7D, + 0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43,0x0E,0x22,0x50,0x43,0x0C,0x4B,0x86,0x18, + 0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0,0xEA,0x7D,0x8A,0x42,0x0A,0xD0,0x2A,0x7E, + 0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42,0x04,0xD0,0xAA,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C,0x86,0x42,0xEA,0xD8,0x70,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x70,0xB4,0x12,0x4A,0x11,0x4B,0x52,0x7D, + 0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43,0xFF,0x26,0x0D,0x4C,0x27,0x36,0x12,0xE0, + 0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42, + 0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00, + 0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42,0xEA,0xD3,0x70,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06,0x04,0x48,0x01,0xD5,0x40,0x68,0x00,0xE0, + 0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xC0,0x93,0x00,0x00, + 0x00,0x90,0x00,0x40,0x03,0x00,0xF0,0xB5,0x1D,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18, + 0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31,0x18,0x4C,0x4F,0x6A,0x0E,0x6A,0x88,0x6A, + 0x00,0xF0,0xF6,0xFA,0x06,0x04,0x0A,0x14,0x18,0x20,0x24,0x11,0xC8,0x68,0x20,0x62, + 0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62, + 0x04,0x20,0xE0,0x62,0x66,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x08,0x69,0x20,0x62, + 0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x67,0x63,0xF0,0xE7,0x07,0x49,0x21,0x62,0x24,0x21,0x02,0xE0,0x89,0x69,0x21,0x62, + 0x29,0x68,0x61,0x62,0x05,0x21,0xE1,0x62,0x60,0x63,0xE4,0xE7,0x80,0x90,0x00,0x40, + 0x00,0x93,0x00,0x00,0x01,0x02,0x00,0x00,0x70,0xB4,0x01,0x23,0x5B,0x07,0x58,0x68, + 0x59,0x68,0xC0,0x02,0xC0,0x0E,0x09,0x02,0x4C,0x0F,0x18,0x49,0x01,0x26,0x00,0x22, + 0x00,0x2C,0x10,0xD0,0xCC,0x79,0x35,0x00,0x00,0x2C,0x00,0xD0,0x00,0x25,0x85,0x42, + 0x07,0xD0,0x45,0x08,0x64,0x08,0xA5,0x42,0x03,0xD1,0xC8,0x71,0x1A,0x60,0x70,0xBC, + 0x70,0x47,0xC8,0x71,0x00,0xE0,0xCA,0x71,0x58,0x68,0x00,0x04,0x00,0x0F,0x58,0x68, + 0x03,0xD0,0x00,0x04,0x00,0x0F,0x40,0x1C,0x0C,0xE0,0xC0,0x02,0xC0,0x0E,0x01,0xD0, + 0x01,0x20,0x07,0xE0,0x88,0x79,0x00,0x28,0x02,0xD1,0x01,0x20,0x8E,0x71,0x02,0xE0, + 0x0F,0x22,0x00,0x20,0x8A,0x71,0x18,0x60,0xE1,0xE7,0x00,0x00,0x64,0x05,0x00,0x20, + 0x0A,0x4A,0x10,0xB5,0xD1,0x88,0x0A,0x4B,0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43, + 0x08,0x48,0xD1,0x80,0x03,0xE0,0x07,0x48,0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60, + 0xFF,0xF7,0xD4,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x78,0x06,0x00,0x20,0xB0,0x94,0x00,0x00,0xFE,0xB5,0x04,0x00,0x32,0x48,0x06,0x6A, + 0x47,0x6A,0x41,0x6B,0x01,0x91,0xC0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x5A,0xFF, + 0xFA,0xF7,0xA4,0xFC,0x25,0x00,0x37,0xE0,0x68,0x1E,0x84,0x42,0x01,0xD1,0xFA,0xF7, + 0xC7,0xFC,0xFA,0xF7,0x69,0xFC,0xFA,0xF7,0x17,0xFD,0xA8,0x00,0x05,0x21,0xF8,0xF7, + 0x4D,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00, + 0x28,0x18,0x05,0x21,0xF8,0xF7,0x42,0xFA,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21,0xF8,0xF7,0x38,0xFA,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0,0x05,0x21,0x28,0x00,0xF8,0xF7,0x2E,0xFA, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00, + 0x00,0x20,0x02,0x23,0xFA,0xF7,0x32,0xFA,0x64,0x1E,0xC5,0xD2,0x0F,0x48,0x44,0x88, + 0x03,0xE0,0xFA,0xF7,0x31,0xFC,0xFA,0xF7,0xDF,0xFC,0x64,0x1E,0xF9,0xD2,0xFA,0xF7, + 0x55,0xFC,0x09,0x48,0x06,0x62,0x47,0x62,0x01,0x99,0x41,0x63,0x00,0x99,0xC1,0x62, + 0x07,0x48,0x00,0x21,0xC1,0x82,0x41,0x71,0x01,0x71,0x81,0x82,0xC8,0x21,0x81,0x63, + 0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40,0xE0,0x95,0x00,0x00, + 0x64,0x05,0x00,0x20,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68, + 0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B, + 0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07, + 0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0x7D,0x06,0x00,0x20,0x30,0xB4,0x05,0x03, + 0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61, + 0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03, + 0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x05,0x49,0x00,0x03, + 0x40,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x02,0x49,0x00,0x20, + 0x08,0x70,0x70,0x47,0x00,0x20,0x00,0x40,0x7D,0x06,0x00,0x20,0x01,0x03,0x04,0x48, + 0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22, + 0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00, + 0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0, + 0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7, + 0x10,0x60,0x70,0x47,0x00,0x93,0x00,0x00,0x38,0xB5,0x00,0x24,0x71,0x20,0x6B,0x46, + 0x00,0x94,0xD8,0x70,0x00,0x98,0x01,0x25,0x6D,0x07,0x68,0x60,0x0D,0x48,0x09,0x22, + 0x21,0x00,0xF8,0xF7,0x8F,0xF9,0x0B,0x48,0x09,0x22,0x00,0x21,0x09,0x38,0xF8,0xF7, + 0x89,0xF9,0x08,0x49,0x49,0x1F,0x88,0x7B,0x00,0x28,0x08,0xD0,0x00,0x20,0x03,0xE0, + 0x82,0x00,0x52,0x19,0x94,0x60,0x40,0x1C,0x8A,0x7B,0x82,0x42,0xF8,0xDC,0x38,0xBC, + 0x08,0xBC,0x18,0x47,0x25,0x05,0x00,0x20,0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00, + 0x01,0x21,0x89,0xB0,0x49,0x07,0x08,0x94,0x4F,0x68,0x61,0x4E,0xB9,0x0F,0x89,0x07, + 0x7E,0xD5,0x20,0x22,0x00,0x21,0x68,0x46,0xF8,0xF7,0x64,0xF9,0x07,0x21,0xB8,0x01, + 0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00,0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43, + 0x08,0x90,0x00,0x20,0x33,0xE0,0x01,0x22,0x81,0x00,0x52,0x07,0x89,0x18,0x89,0x68, + 0x8E,0x00,0x32,0x0F,0x2A,0xD0,0x32,0x0F,0x94,0x46,0x92,0x00,0x6B,0x46,0xD2,0x18, + 0x40,0x3A,0xD3,0x6B,0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27, + 0x3F,0x06,0x0E,0x04,0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43,0x49,0x4E,0x33,0x40, + 0x8E,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43,0x1B,0x0B,0x89,0x05,0x1B,0x03,0x89,0x0D, + 0x0B,0x43,0xD3,0x63,0x62,0x46,0x52,0x1E,0x01,0x23,0x93,0x40,0x9A,0x05,0x92,0x0D, + 0x71,0x46,0x11,0x43,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x08,0x91,0x40,0x1C,0x08,0x99, + 0x8E,0x46,0x09,0x04,0x09,0x0F,0x81,0x42,0xC5,0xD8,0x08,0x98,0x01,0x27,0x00,0x04, + 0x00,0x0F,0x7B,0x07,0x0F,0xE0,0x82,0x00,0xD2,0x18,0x92,0x68,0x3E,0x00,0x92,0x00, + 0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06, + 0x24,0x0E,0x40,0x1C,0x08,0x91,0x08,0x99,0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F, + 0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x21,0x08,0x00,0x6E,0x46,0x82,0x00,0xB2,0x58, + 0x00,0x2A,0x03,0xD0,0x8F,0x00,0xFF,0x18,0xBA,0x60,0x49,0x1C,0x40,0x1C,0x08,0x28, + 0xF4,0xD3,0x23,0x49,0x08,0x98,0x88,0x43,0x29,0x07,0x09,0x0C,0x08,0x43,0x00,0xE0, + 0x07,0xE0,0x07,0x21,0x49,0x05,0x88,0x43,0x61,0x07,0x09,0x0A,0x08,0x43,0x08,0x90, + 0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0,0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C, + 0x82,0x00,0x11,0x0F,0x09,0x07,0x21,0x40,0x84,0x01,0xA4,0x0D,0x24,0x03,0x21,0x43, + 0x84,0x05,0x09,0x0B,0x09,0x03,0xA4,0x0D,0x21,0x43,0x0F,0x24,0x24,0x06,0x00,0x04, + 0x80,0x08,0xA1,0x43,0x20,0x40,0x01,0x43,0x08,0x0F,0x09,0xD0,0x12,0x0F,0x52,0x1E, + 0x01,0x20,0x90,0x40,0x80,0x05,0x80,0x0D,0xB0,0x43,0x5A,0x14,0x80,0x18,0x08,0x90, + 0x99,0x60,0x02,0xE0,0x01,0x21,0x49,0x07,0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x70, + 0x08,0x99,0x40,0x07,0x41,0x60,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF8,0xF7,0xA3,0xF8,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF8,0xF7,0xA5,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x10,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF8,0xF7,0x8A,0xF8,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF8,0xF7,0x8C,0xF8,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0x7C,0x06,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60, + 0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00, + 0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA, + 0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47, + 0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37, + 0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF8,0xF7, + 0x57,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x25,0x00,0x6F,0x00,0xB9,0x00,0xF0,0x00, + 0x27,0x01,0x71,0x01,0xBB,0x01,0x20,0x00,0x6C,0x00,0xB8,0x00,0x04,0x01,0x50,0x01, + 0x89,0x01,0xC2,0x01,0x0E,0x02,0x5A,0x02,0xA6,0x02,0xF2,0x02,0x24,0x00,0x72,0x00, + 0xBD,0x00,0x09,0x01,0x55,0x01,0x90,0x01,0xCC,0x01,0x19,0x02,0x59,0x02,0xAE,0x02, + 0xF4,0x02,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0x00, + 0x01,0x00,0x01,0x00,0x89,0x08,0x49,0x1E,0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07, + 0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29, + 0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2,0x01,0x10,0xC0,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0xB2,0x10,0xC0,0xE0,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2,0x04,0x10,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2,0x1E,0xFF,0x2F,0x31, + 0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x70,0x20,0x9F,0xE5,0x30,0x00,0x2D,0xE9,0x64,0xC0,0x9F,0xE5, + 0x00,0x00,0x92,0xE5,0x64,0x40,0x9F,0xE5,0x64,0x30,0x9F,0xE5,0x25,0x00,0xA0,0xE3, + 0x01,0x0C,0x80,0xE2,0x00,0x11,0x92,0xE7,0x80,0x50,0x84,0xE0,0xB0,0x10,0xC5,0xE1, + 0x00,0x11,0x9C,0xE7,0x80,0x50,0x83,0xE0,0x01,0x00,0x50,0xE2,0xB0,0x10,0xC5,0xE1, + 0xF7,0xFF,0xFF,0x5A,0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x24,0x20,0x9F,0xE5, + 0x30,0x10,0x9F,0xE5,0x25,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x31,0x92,0xE7, + 0x80,0xC0,0x81,0xE0,0x23,0x38,0xA0,0xE1,0x01,0x00,0x50,0xE2,0xB0,0x30,0xCC,0xE1, + 0xF9,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40,0x00,0x10,0x10,0x40, + 0x7E,0x06,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x08,0x05,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x13,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0xC8,0x32,0x00,0x00,0x8C,0x3C,0x00,0x00,0x8C,0x3C,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x1A,0x04,0x1A,0x04,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x78,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x66,0x00,0x67,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x14,0x00,0x00,0x00,0x00,0x00, + 0x05,0x02,0x05,0x0A,0x01,0x01,0x04,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x80,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9F,0xB9,0x2C,0x01, + 0x14,0x00,0x14,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00,0x32,0x00,0x05,0x00, + 0x19,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x46,0x00,0x5E,0x01,0x90,0x01,0x90,0x01, + 0x2C,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x0A,0x01,0x32,0x00,0x88,0x13,0xE8,0x03,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0x96, + 0x96,0x96,0xB4,0x00,0xFF,0x0F,0x90,0x01,0x50,0x00,0x1E,0x00,0xFA,0xFA,0x19,0x96, + 0x00,0x05,0x04,0x0A,0x0A,0x06,0x20,0x03,0x46,0x00,0x05,0x19,0x00,0x02,0x0F,0x00, + 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x01,0x00,0x05,0x05,0x0A,0x0A, + 0x0F,0x0F,0x14,0x14,0x64,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0x22,0x01,0x00, + 0x1C,0x1C,0x88,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x9F,0x99,0x5E,0x01,0x14,0x00,0x19,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00, + 0x96,0x00,0x14,0x00,0x32,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x90,0x01, + 0x90,0x01,0x90,0x01,0x90,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x0A,0x01,0x32,0x00,0x88,0x13,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x90,0x01,0xC8,0x00,0x1E,0x00, + 0xFA,0xFA,0x0D,0xA0,0x00,0x05,0x04,0x0A,0x02,0x06,0xE8,0x03,0x46,0x00,0x05,0x1E, + 0x00,0x02,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x06,0x01,0x01,0x01,0x00,0x03,0x03,0x03,0x00, + 0x05,0x05,0x0A,0x0A,0x0F,0x0F,0x14,0x14,0x64,0x5A,0x01,0x00,0x03,0x00,0x00,0x00, + 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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x22,0x01,0x00,0x12,0x12,0x88,0x00,0x10,0x3F,0x10,0x3F,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x8C,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x96,0x00,0xFA,0x00,0x00,0x00, + 0x21,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x29,0x00,0x00,0x00, + 0x25,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0A,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x32,0x00,0x50,0x00,0x32,0x00,0x50,0x00,0x0A,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x00,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x8D,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00, + 0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x1C,0x1C,0x88,0x00, + 0x30,0x3F,0x30,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x04,0x81,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x00, + 0x11,0x30,0x10,0x00,0x61,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x01,0x03,0x02,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x50,0x31,0x20,0x01,0x52,0x38,0x22,0x08,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x03,0xC8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x24,0x24, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x24,0x3F,0x24,0x24,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x24,0x3F,0x24,0x24,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x26,0x24,0x24,0x3F,0x24,0x24,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x26,0x24,0x24,0x3F,0x24,0x24,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x26,0x24,0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26, + 0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F, + 0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x26,0x24,0x3F,0x24,0x24,0x24,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x24,0x24, + 0x24,0x3F,0x24,0x26,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x26,0x24,0x3F, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x28,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x14,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0x91,0x5F, + 0x21,0x2C,0x92,0x5F,0x42,0xBC,0x92,0x5F,0x63,0x28,0x93,0x5F,0x84,0xB8,0x93,0x5F, + 0xA5,0x24,0x94,0x5F,0xC6,0xB4,0x94,0x5F,0xE7,0x20,0x95,0x5F,0x08,0xB1,0x95,0x5F, + 0x29,0x9D,0x98,0x5F,0x4A,0x01,0x99,0x5F,0x6B,0x99,0x99,0x5F,0x8C,0x05,0x9A,0x5F, + 0xAD,0x95,0x9A,0x5F,0xCE,0x09,0x90,0x5F,0xEF,0x11,0x90,0x5F,0x10,0x0E,0x90,0x5F, + 0x31,0x46,0x90,0x5F,0x52,0x52,0x90,0x5F,0x73,0x4A,0x90,0x5F,0x94,0x4E,0x90,0x5F, + 0xB5,0x02,0x90,0x5F,0xD6,0x02,0x90,0x5F,0xF7,0x02,0x90,0x5F,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x6F,0x67,0x08,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x60,0x30,0x60,0x30, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0x9C,0x00,0x63,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_tshark_ver0007.h b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_tshark_ver0007.h new file mode 100644 index 00000000..19c92564 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/firmware/ist3038_fw_tshark_ver0007.h @@ -0,0 +1,2572 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: O-Film , f/w 7(00040000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xAD,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x39,0x4A,0x37,0x48,0x37,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x35,0x48,0x01,0x21,0x89,0x07,0xC8,0x61, + 0x34,0x48,0xC9,0x14,0x01,0x62,0x00,0x21,0x01,0x62,0x01,0x62,0x32,0x49,0x33,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x2D,0x4B, + 0x9F,0x6A,0x2F,0x48,0x00,0x69,0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61, + 0xFF,0xF7,0xE2,0xFF,0x58,0x69,0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x29,0x48, + 0x29,0x4C,0x20,0x60,0xFF,0x20,0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68, + 0xA6,0x15,0x30,0x43,0xA0,0x60,0x21,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x23,0x4F, + 0x21,0xE0,0x68,0x68,0x00,0x07,0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61, + 0x68,0x69,0x18,0x42,0xFC,0xD1,0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69, + 0x18,0x42,0xFC,0xD1,0x0D,0xE0,0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69, + 0x80,0x06,0xFC,0xD4,0x68,0x68,0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07, + 0xFC,0xD5,0xFF,0xF7,0xA9,0xFF,0xE0,0x68,0x11,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7, + 0xA3,0xFF,0xA0,0x68,0xB0,0x43,0xA0,0x60,0x00,0xF0,0x3A,0xF9,0xF8,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0x00,0x00,0x10,0x84,0x02,0x00,0x00,0xEC,0x00,0x00,0x00, + 0x5C,0x0A,0x00,0x00,0x40,0x00,0x00,0x40,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F, + 0x50,0xC3,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14,0x8A,0x43,0xC2,0x61, + 0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61,0x70,0x47,0x10,0xB4, + 0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22, + 0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2, + 0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06, + 0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00, + 0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xC2,0xFF, + 0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02,0x08,0x43,0xA4,0x21, + 0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48,0x10,0xD1,0x89,0x06, + 0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0xFF,0x20,0x00,0xF0,0x6E,0xFE, + 0x03,0x25,0x0F,0x4E,0x2D,0x07,0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B, + 0xE9,0x68,0x80,0x08,0x3C,0x00,0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42, + 0x00,0xD0,0x34,0x63,0x81,0x00,0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x08,0xF0, + 0x8C,0xF8,0xE8,0x68,0xA0,0x43,0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x30,0x70,0x06,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x54,0x4A,0x51,0x48,0x52,0x49,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0, + 0x52,0x1E,0xFB,0xD2,0x00,0xF0,0x16,0xFE,0x07,0x00,0x03,0xF0,0xE9,0xFE,0x03,0xF0, + 0xDB,0xFE,0x03,0xF0,0x6D,0xFF,0x4C,0x4A,0x4C,0x49,0x4D,0x48,0x00,0xF0,0x00,0xFA, + 0x05,0x21,0x49,0x03,0x00,0x20,0x00,0xF0,0x01,0xFA,0x4A,0x4C,0x4A,0x49,0xA0,0x62, + 0x00,0x20,0x00,0xF0,0xFB,0xF9,0x49,0x4B,0x49,0x49,0xD8,0x63,0x49,0x48,0x00,0xF0, + 0xF5,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x2D,0xFF,0x46,0x4A, + 0x46,0x48,0x00,0x21,0x00,0xF0,0xF2,0xF9,0x07,0xF0,0xEE,0xFA,0x03,0xF0,0xDC,0xFF, + 0x43,0x48,0x00,0x26,0x81,0x7A,0x01,0x25,0x6D,0x07,0xE1,0x73,0xC1,0x7A,0x21,0x74, + 0x41,0x7A,0x61,0x74,0xA6,0x73,0xA6,0x74,0xE6,0x74,0x26,0x75,0x66,0x75,0xA6,0x75, + 0xE6,0x75,0x01,0x8F,0x61,0x83,0xC0,0x8E,0xA0,0x83,0x38,0x48,0x68,0x63,0xFF,0x20, + 0xE8,0x63,0xE8,0x14,0x00,0xF0,0xAA,0xFD,0x36,0x48,0x06,0x70,0xFF,0x20,0x81,0x30, + 0x00,0xF0,0xA4,0xFD,0x34,0x49,0x02,0x20,0x07,0xF0,0x4A,0xFE,0x02,0x20,0x07,0xF0, + 0x4F,0xFE,0x60,0x7C,0x00,0x28,0x01,0xD0,0x07,0xF0,0xC6,0xFF,0x00,0x2F,0x1F,0xD1, + 0x2E,0x4E,0xB7,0x15,0x60,0x7C,0x00,0x28,0x02,0xD0,0x2D,0x49,0xA0,0x6E,0x88,0x60, + 0xE8,0x6B,0x0B,0x28,0x14,0xD0,0x2B,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0, + 0xF1,0xFC,0xF0,0x68,0x28,0x49,0x88,0x42,0xEC,0xD9,0x28,0x48,0xC0,0x68,0xFF,0x28, + 0x06,0xD1,0xB0,0x68,0xB8,0x43,0xB0,0x60,0xB0,0x68,0x38,0x43,0xB0,0x60,0xE1,0xE7, + 0x20,0x7C,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x67,0xFD,0x60,0x7C, + 0x00,0x28,0x01,0xD0,0x07,0xF0,0xA0,0xFF,0x02,0x20,0x07,0xF0,0x29,0xFE,0xFF,0x20, + 0x81,0x30,0x00,0xF0,0x5B,0xFD,0x1A,0x49,0x05,0x20,0x03,0xF0,0xC5,0xFC,0x0B,0x20, + 0xE8,0x63,0x03,0xF0,0x5F,0xFD,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x05,0x00,0x10, + 0x90,0x86,0x00,0x00,0x80,0x01,0x00,0x00,0x28,0x00,0x00,0x00,0x68,0x86,0x00,0x00, + 0x00,0x00,0x00,0x10,0x8C,0x05,0x00,0x20,0xC0,0x92,0x00,0x00,0xC0,0x0F,0x00,0x20, + 0x00,0x9D,0x00,0x00,0x00,0x93,0x00,0x00,0x4C,0x05,0x00,0x00,0x40,0x00,0x00,0x20, + 0x00,0x93,0x00,0x00,0xF5,0x06,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40, + 0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xE5,0x81,0x00,0x00,0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x4C,0x00,0x00,0x4A, + 0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0,0x43,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0, + 0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x26,0x00,0x00,0x3A,0x20,0x36,0x71,0xE0, + 0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0,0x09,0x00,0x00,0x3A,0x01,0x14,0xA0,0xE1, + 0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3,0xFF,0x28,0x82,0x23,0x01,0x14,0xA0,0x21, + 0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A,0x00,0x30,0x71,0xE2,0x6F,0x00,0x00,0x2A, + 0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0,0x81,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x36,0x71,0xE0, + 0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x36,0x71,0xE0,0x01,0x06,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0,0x81,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x34,0x71,0xE0, + 0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x34,0x71,0xE0,0x01,0x04,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0, + 0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x01,0x10,0x50,0xE0, + 0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21,0x00,0x10,0xA0,0xE1,0x00,0x00,0xB0,0xE3, + 0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0, + 0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3, + 0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3, + 0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3, + 0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A, + 0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5,0x02,0x20,0x07,0xF0,0x7D,0xFE,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0, + 0xA0,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0x92,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0, + 0x83,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0,0x75,0xFF,0xFF,0x3A,0x6A,0xFF,0xFF,0xEA, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x48,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10,0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0xF0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x28,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10,0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xF0,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0xA8,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0xC6,0xFD,0xFF,0xEA, + 0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40, + 0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60, + 0x0B,0x24,0x02,0xF0,0xD1,0xFA,0x64,0x1E,0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27, + 0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x79,0xC0,0x07,0x26,0xD0,0x70,0x78,0x00,0x28, + 0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04, + 0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24, + 0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18,0x28,0x19,0x07,0xF0, + 0x91,0xF9,0x64,0x1C,0x70,0x78,0xA0,0x42,0xF3,0xDA,0x70,0x78,0x01,0x28,0x02,0xD1, + 0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x78,0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xD2,0x04,0x00,0x00, + 0x70,0xB4,0x1C,0x4B,0xDA,0x88,0xD2,0x07,0x2F,0xD1,0x1B,0x4A,0x05,0x78,0x54,0x78, + 0xE4,0x00,0xE6,0x18,0x13,0x24,0xA4,0x01,0x36,0x19,0xB5,0x76,0x56,0x78,0x45,0x88, + 0xF6,0x00,0xF6,0x18,0x36,0x19,0xB5,0x83,0x56,0x78,0x85,0x88,0xF6,0x00,0xF6,0x18, + 0x34,0x19,0xE5,0x83,0x54,0x78,0xE4,0x00,0xE5,0x18,0x27,0x24,0x64,0x01,0x2D,0x19, + 0x29,0x70,0x55,0x78,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19,0x59,0x70,0x51,0x78, + 0x00,0x23,0x49,0x1C,0x51,0x70,0xC0,0x79,0x01,0x21,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x93,0x70,0xD1,0x70,0x70,0xBC,0x70,0x47,0x91,0x70, + 0xD3,0x70,0xFA,0xE7,0x40,0x00,0x00,0x20,0xE0,0x04,0x00,0x20,0xF0,0x00,0x2D,0xE9, + 0x70,0x60,0x9F,0xE5,0x01,0xC1,0x81,0xE0,0x8C,0xC0,0x86,0xE0,0x81,0x40,0x86,0xE0, + 0x84,0x21,0xCC,0xE5,0xB4,0x5F,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x05,0x05,0xE0,0xA5,0x79,0xA0,0xE1,0x01,0x5C,0x8C,0xE2,0x01,0x4C,0x84,0xE2, + 0xB6,0x78,0xC5,0xE1,0xB6,0x40,0xD4,0xE1,0xCD,0x70,0xA0,0xE3,0x33,0x7B,0x87,0xE2, + 0x97,0x04,0x04,0xE0,0xA4,0x49,0xA0,0xE1,0xB8,0x48,0xC5,0xE1,0x01,0x40,0x86,0xE0, + 0x38,0x41,0xD4,0xE5,0x85,0x41,0xCC,0xE5,0x8A,0x31,0xCC,0xE5,0x01,0x20,0xC0,0xE7, + 0x02,0x00,0x86,0xE0,0x9B,0x12,0xC0,0xE5,0x00,0x10,0xA0,0xE3,0x92,0x12,0xC0,0xE5, + 0xF0,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x08,0x4A,0x07,0x49, + 0x12,0x78,0x08,0x68,0x0F,0x23,0x40,0x1C,0x12,0x07,0x12,0x0A,0x9B,0x06,0xD2,0x18, + 0x00,0x03,0x00,0x0B,0x02,0x43,0x0A,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x6C,0x06,0x00,0x20,0xF1,0xB5,0x78,0x20,0x94,0xB0,0x07,0x90,0xE2,0x48,0x13,0x90, + 0x40,0x7C,0x03,0x90,0x13,0x98,0xC0,0x7C,0x02,0x90,0x13,0x98,0x00,0x7C,0x01,0x90, + 0xDE,0x48,0x00,0x68,0x00,0x88,0x00,0x05,0x7E,0xD5,0x14,0x98,0x01,0x28,0x00,0xD0, + 0x02,0x20,0x04,0x90,0x00,0x20,0x08,0x90,0xA6,0xE1,0x04,0x98,0x81,0x00,0x01,0x20, + 0x40,0x07,0x08,0x18,0x12,0x90,0x00,0x68,0x81,0x00,0x11,0x90,0x0C,0x0F,0x80,0x0F, + 0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x33,0xFD,0x8E,0xE1,0xD0,0x48,0xA5,0x00, + 0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x11,0x98,0xCD,0x49,0x80,0x01,0x80,0x0D, + 0x48,0x53,0x11,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80,0x4A,0x5B,0x24,0x31, + 0x4A,0x53,0x69,0x18,0x48,0x80,0x78,0xE1,0x03,0x9F,0xC5,0x49,0x00,0x20,0x7F,0x1E, + 0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52, + 0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x11,0x98,0x62,0x46,0x80,0x01,0x80,0x0D, + 0x82,0x1A,0x10,0x90,0x03,0x98,0xBA,0x4B,0x80,0x00,0x08,0x18,0x20,0x38,0x82,0x83, + 0x11,0x9A,0xEB,0x18,0x92,0x05,0x92,0x0D,0x0E,0x93,0x0F,0x92,0x5B,0x88,0xD2,0x1A, + 0xC2,0x83,0x00,0x20,0x07,0x00,0x02,0x00,0x07,0xE0,0x93,0x00,0xCE,0x5E,0x30,0x18, + 0xCE,0x18,0x02,0x23,0xF3,0x5E,0xDF,0x19,0x52,0x1C,0x03,0x9B,0x9A,0x42,0xF4,0xDB, + 0x19,0x00,0xFF,0xF7,0xFF,0xFC,0x06,0x90,0x03,0x99,0x38,0x00,0xFF,0xF7,0xFA,0xFC, + 0x05,0x90,0x06,0x98,0x00,0x28,0x00,0xDC,0x40,0x42,0x13,0x99,0x89,0x7C,0x88,0x42, + 0x14,0xDA,0x05,0x98,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x0E,0xDA,0xA0,0x4B, + 0x60,0x00,0x1C,0x3B,0x19,0x5E,0x00,0xE0,0x32,0xE1,0x13,0x9A,0x02,0x9E,0x12,0x7D, + 0xB6,0x1A,0xB1,0x42,0x0A,0xDA,0x89,0x18,0x19,0x52,0x07,0xE0,0x98,0x49,0x13,0x9B, + 0x60,0x00,0x1C,0x39,0x0A,0x5A,0x5B,0x7D,0xD2,0x1A,0x0A,0x52,0x94,0x49,0x60,0x00, + 0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E,0x02,0x99, + 0x88,0x42,0x0D,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0,0x88,0x00,0x05,0x21,0xFF,0xF7, + 0xF1,0xFD,0x0D,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x02,0x98,0x41,0x00, + 0x40,0x18,0x05,0x21,0xFF,0xF7,0xE6,0xFD,0x0D,0x99,0x88,0x42,0x01,0xDC,0x03,0x20, + 0x14,0xE0,0x02,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7,0xDC,0xFD,0x0D,0x99,0x88,0x42, + 0x01,0xDC,0x02,0x20,0x0A,0xE0,0x02,0x98,0x05,0x21,0xFF,0xF7,0xD3,0xFD,0x0D,0x99, + 0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x78,0x49,0x0A,0x39, + 0x08,0x55,0x77,0x49,0x10,0x9A,0x24,0x31,0x48,0x5F,0x17,0x1A,0x0C,0x90,0x68,0x18, + 0x02,0x21,0x0B,0x90,0x41,0x5E,0x0F,0x9A,0x71,0x48,0x56,0x1A,0x0A,0x38,0x0A,0x91, + 0x01,0x5D,0x13,0x98,0x80,0x7D,0x81,0x42,0x27,0xD3,0x00,0x2F,0x01,0xD1,0x00,0x24, + 0x0D,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x01,0x99,0x88,0x42,0x01,0xDA,0x01,0x24, + 0x05,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7,0x74,0xFC,0x04,0x00,0x00,0x2E, + 0x01,0xD1,0x00,0x20,0x0C,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x01,0x99,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x04,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7,0x62,0xFC, + 0x0C,0x99,0x00,0x2F,0x1D,0xDB,0x09,0x19,0x1C,0xE0,0x0D,0x98,0xFF,0x21,0x91,0x31, + 0x48,0x43,0x05,0x21,0xFF,0xF7,0x56,0xFC,0x02,0x99,0xFF,0xF7,0x53,0xFC,0x64,0x21, + 0x08,0x1A,0x39,0x1E,0x09,0x90,0x00,0xDC,0x79,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7, + 0x49,0xFC,0x09,0x9A,0x04,0x00,0x30,0x1E,0x00,0xDC,0x70,0x42,0x50,0x43,0x64,0x21, + 0xDC,0xE7,0x09,0x1B,0x0C,0x00,0x0A,0x99,0x00,0x2E,0x01,0xDB,0x08,0x18,0x00,0xE0, + 0x08,0x1A,0x05,0x2F,0x01,0xDC,0x05,0x2E,0x5F,0xDD,0x14,0x99,0x01,0x29,0x5C,0xD1, + 0x43,0x49,0x6C,0x31,0x8A,0x68,0x92,0x19,0x8A,0x60,0x0A,0x68,0x92,0x00,0x52,0x18, + 0x97,0x81,0x0A,0x68,0x92,0x00,0x52,0x18,0xD6,0x81,0x49,0x68,0x0E,0x00,0x02,0x29, + 0x41,0xD9,0x3B,0x4A,0x6C,0x32,0x91,0x68,0x00,0x29,0x00,0xDC,0x49,0x42,0x64,0x29, + 0x39,0xDA,0x00,0x20,0x81,0x00,0x89,0x18,0x0C,0x23,0xCB,0x5E,0x06,0x9C,0x40,0x1C, + 0x1B,0x19,0x06,0x93,0x0E,0x23,0xCB,0x5E,0x05,0x99,0x59,0x18,0x03,0x28,0x05,0x91, + 0xF0,0xDB,0x10,0x98,0x3C,0x28,0x0E,0xD3,0x2B,0x49,0x02,0x00,0xA0,0x39,0x08,0x8C, + 0x3C,0x38,0x82,0x42,0x07,0xDB,0x0F,0x98,0x3C,0x28,0x04,0xD3,0x02,0x00,0x48,0x8C, + 0x3C,0x38,0x82,0x42,0x01,0xDA,0xC8,0x20,0x07,0x90,0x06,0x98,0x64,0x21,0x48,0x43, + 0x03,0x21,0xFF,0xF7,0xEF,0xFB,0x07,0x99,0xFF,0xF7,0xEC,0xFB,0x0C,0x99,0x44,0x18, + 0x05,0x98,0x64,0x21,0x48,0x43,0x03,0x21,0xFF,0xF7,0xE4,0xFB,0x07,0x99,0xFF,0xF7, + 0xE1,0xFB,0x0A,0x99,0x40,0x18,0x1A,0x4B,0x00,0x21,0x6C,0x33,0x1A,0x68,0x02,0x2A, + 0x00,0xD0,0x51,0x1C,0x19,0x60,0x71,0x1C,0x59,0x60,0x15,0x49,0x10,0x9A,0x4A,0x53, + 0x0E,0x9A,0x0F,0x99,0x51,0x80,0x12,0x4A,0x24,0x32,0x54,0x53,0x0B,0x99,0x11,0x4A, + 0x48,0x80,0x11,0x99,0x80,0x05,0x11,0x40,0xA2,0x05,0x92,0x09,0x11,0x43,0x89,0x0A, + 0x89,0x02,0x80,0x0D,0x01,0x43,0x12,0x98,0x01,0x60,0x08,0x98,0x40,0x1C,0x08,0x90, + 0x04,0x98,0x40,0x1C,0x04,0x90,0x08,0x98,0x14,0x99,0x88,0x42,0x00,0xDA,0x54,0xE6, + 0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xE4,0x09,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4,0x15,0x21,0xDA,0x88, + 0x89,0x01,0x80,0x24,0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x0D,0x80, + 0xC5,0x89,0x4D,0x80,0x05,0x8A,0x8D,0x80,0x40,0x8A,0xC8,0x80,0x08,0x48,0x20,0x30, + 0x00,0x89,0x22,0x43,0x08,0x81,0x06,0xE0,0x00,0x20,0x08,0x80,0x48,0x80,0x88,0x80, + 0xC8,0x80,0xA2,0x43,0x08,0x81,0xDA,0x80,0x30,0xBC,0x70,0x47,0x40,0x00,0x00,0x20, + 0x80,0x93,0x00,0x00,0x7F,0xB5,0x25,0x4D,0x06,0x00,0x1A,0x28,0x0C,0xD1,0x28,0x6A, + 0x00,0x28,0x09,0xD1,0x68,0x6A,0x00,0x28,0x06,0xD1,0x21,0x4C,0x01,0xF0,0xE8,0xFF, + 0x64,0x1E,0xFB,0xD2,0xFF,0x24,0x12,0xE0,0x05,0xF0,0xA4,0xFF,0x01,0xF0,0xAE,0xFE, + 0x01,0xF0,0xB4,0xFE,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x93,0xFF,0x04,0x00, + 0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x96,0x00,0xF0,0x33,0xF8,0x02,0x20, + 0x07,0xF0,0x46,0xF9,0x02,0x20,0x07,0xF0,0x33,0xF9,0x12,0x49,0xE8,0x68,0xC8,0x61, + 0x28,0x69,0xC8,0x61,0x10,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x0F,0x4B, + 0x0F,0x48,0x02,0xE0,0xDA,0x68,0x82,0x42,0x02,0xD8,0x4A,0x69,0x92,0x06,0xF9,0xD5, + 0x48,0x68,0x80,0x07,0xFC,0xD5,0x01,0xF0,0xD3,0xFF,0x01,0x20,0x00,0xF0,0x6E,0xF8, + 0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0xAA,0xF8, + 0x1C,0x48,0x03,0x27,0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0x72,0xFC,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x74,0xFC, + 0x16,0x49,0x40,0x22,0x01,0xA8,0xFF,0xF7,0x53,0xFC,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x07,0xF0,0x1C,0xFA,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x92,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x65,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0x68,0x01,0x8D,0xE5,0x0C,0x08,0x9F,0xE5,0x0C,0x28,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xB0,0x24,0xD2,0xE1,0x78,0x10,0xD0,0xE5,0x77,0x70,0xD0,0xE5,0xFC,0x97,0x9F,0xE5, + 0x02,0x10,0x81,0xE0,0xFF,0x80,0x01,0xE2,0x79,0x10,0xD0,0xE5,0x00,0x50,0xE0,0xE3, + 0x00,0xB0,0xA0,0xE3,0x08,0x10,0x8D,0xE5,0x7A,0x00,0xD0,0xE5,0x04,0x00,0x8D,0xE5, + 0xDC,0x07,0x9F,0xE5,0x04,0x40,0xD9,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x00,0x1A,0xCC,0x07,0x9F,0xE5,0x00,0x00,0x90,0xE5,0xFA,0x00,0x50,0xE3, + 0x02,0x00,0x00,0x9A,0x03,0x80,0xA0,0xE3,0x08,0x80,0x8D,0xE5,0x0A,0x00,0x00,0xEA, + 0xB4,0x07,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x01,0x00,0x50,0xE3,0x02,0x80,0xA0,0x03, + 0x03,0x00,0xA0,0x03,0x03,0x00,0x00,0x0A,0xC8,0x02,0xD9,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x0A,0x00,0x00,0xA0,0xE3,0x08,0x00,0x8D,0xE5,0x82,0x01,0xD9,0xE5, + 0x01,0x60,0xA0,0xE3,0x01,0x00,0x50,0xE3,0x0E,0x00,0x00,0xBA,0x06,0x01,0x86,0xE0, + 0x80,0x00,0x89,0xE0,0x38,0x12,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A, + 0x02,0x0C,0x80,0xE2,0x3E,0x00,0x80,0xE2,0xD8,0x0B,0x00,0xEB,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x8B,0x12,0xFF,0xB0,0x00,0x12,0x82,0x01,0xD9,0xE5,0x01,0x60,0x86,0xE2, + 0x06,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA,0x40,0x07,0x9F,0xE5,0x00,0xA0,0xA0,0xE3, + 0xB4,0x3B,0xD0,0xE1,0xB8,0x2B,0xD0,0xE1,0x01,0x60,0xA0,0xE3,0x02,0x10,0x43,0xE0, + 0x00,0x00,0x51,0xE3,0x03,0x10,0x42,0xD0,0x01,0x28,0xA0,0xE1,0xB6,0x1B,0xD0,0xE1, + 0xBA,0x3B,0xD0,0xE1,0x22,0x28,0xA0,0xE1,0xB3,0xA2,0xC9,0xE5,0x03,0x00,0x41,0xE0, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x43,0xD0,0x00,0x00,0x5B,0xE3,0x00,0x08,0xA0,0xE1, + 0x28,0x00,0x52,0x13,0x20,0x08,0xA0,0xE1,0x06,0x00,0x00,0x2A,0x32,0x00,0x50,0xE3, + 0xB3,0x62,0xC9,0x35,0x03,0x00,0x00,0x3A,0x64,0x00,0x50,0xE3,0x03,0x00,0xA0,0x23, + 0x02,0x00,0xA0,0x33,0xB3,0x02,0xC9,0xE5,0xB2,0x02,0xD9,0xE5,0x00,0x00,0x50,0xE3, + 0x0B,0x00,0x00,0x1A,0xB3,0x02,0xD9,0xE5,0x01,0x00,0x50,0xE3,0x01,0x00,0x87,0x02, + 0xFF,0x70,0x00,0x02,0x06,0x00,0x00,0x0A,0x02,0x00,0x50,0xE3,0x02,0x00,0x87,0x02, + 0x02,0x00,0x00,0x0A,0x03,0x00,0x50,0xE3,0x01,0x00,0x00,0x1A,0x03,0x00,0x87,0xE2, + 0xFF,0x70,0x00,0xE2,0x09,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0x8C,0xFD,0xFF,0xEB,0xB6,0x00,0xD9,0xE1,0x84,0xB6,0x9F,0xE5,0x46,0x0F,0x10,0xE3, + 0x04,0x00,0x00,0x0A,0xD6,0x04,0x00,0xEB,0x00,0x60,0xCB,0xE5,0x65,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x50,0x06,0x9F,0xE5,0x00,0xA0,0xCB,0xE5, + 0x83,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3,0x40,0x16,0x9F,0x15,0x01,0x00,0x40,0x12, + 0x83,0x01,0xC1,0x15,0x00,0x00,0x54,0xE3,0x04,0x00,0x00,0x1A,0x2C,0x06,0x9F,0xE5, + 0x81,0x01,0xD0,0xE5,0x00,0x00,0x50,0xE3,0x7C,0x01,0x00,0x0A,0x17,0x00,0x00,0xEA, + 0x18,0x96,0x9F,0xE5,0x81,0x01,0xD9,0xE5,0x00,0x00,0x50,0xE3,0x13,0x00,0x00,0x1A, + 0x20,0x06,0x9F,0xE5,0x5A,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x6D,0xFD,0xFF,0xEB, + 0x83,0x01,0xD9,0xE5,0x00,0x00,0x50,0xE3,0x70,0x01,0x00,0x1A,0x01,0x00,0x54,0xE3, + 0x01,0x50,0xA0,0xE3,0x07,0x00,0x00,0xBA,0xFF,0x20,0x05,0xE2,0xFF,0x10,0x05,0xE2, + 0x14,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2,0xC7,0xFD,0xFF,0xEB,0x01,0x50,0x85,0xE2, + 0x04,0x00,0x55,0xE1,0xF7,0xFF,0xFF,0xDA,0x80,0x41,0xC9,0xE5,0x63,0x01,0x00,0xEA, + 0x09,0x20,0xA0,0xE3,0x01,0x10,0xA0,0xE3,0x15,0x0E,0x8D,0xE2,0x59,0xFD,0xFF,0xEB, + 0x01,0x00,0x87,0xE2,0x90,0x01,0x8D,0xE5,0x02,0x00,0x88,0xE2,0x8C,0x01,0x8D,0xE5, + 0xB4,0x05,0x9F,0xE5,0x01,0x60,0xA0,0xE3,0x88,0x01,0x8D,0xE5,0x09,0x00,0x40,0xE2, + 0x84,0x01,0x8D,0xE5,0x08,0x70,0xA0,0xE3,0x0C,0x80,0x8D,0xE2,0x87,0x01,0x87,0xE0, + 0x0C,0x10,0x8D,0xE2,0x00,0x01,0x81,0xE0,0x24,0x20,0xA0,0xE3,0x00,0x10,0xE0,0xE3, + 0x48,0xFD,0xFF,0xEB,0x01,0x70,0x57,0xE2,0xF7,0xFF,0xFF,0x5A,0x06,0x00,0xA0,0xE1, + 0x39,0x06,0x00,0xEB,0x01,0x00,0x54,0xE3,0x00,0x80,0xA0,0xE1,0x01,0x90,0xA0,0xE3, + 0x47,0x00,0x00,0xBA,0x44,0x05,0x9F,0xE5,0x08,0xA0,0xA0,0xE1,0x82,0x11,0xD0,0xE5, + 0x01,0x70,0xA0,0xE3,0x01,0x00,0x51,0xE3,0x3E,0x00,0x00,0xBA,0x89,0x00,0x80,0xE0, + 0x80,0x01,0x8D,0xE5,0x01,0x0C,0x80,0xE2,0x7C,0x01,0x8D,0xE5,0x89,0x01,0x89,0xE0, + 0x0C,0x10,0x8D,0xE2,0x78,0x01,0x8D,0xE5,0x00,0x01,0x81,0xE0,0x74,0x01,0x8D,0xE5, + 0x08,0x15,0x9F,0xE5,0x07,0x01,0x87,0xE0,0x80,0xB0,0x81,0xE0,0x38,0x02,0xDB,0xE5, + 0x00,0x00,0x50,0xE3,0x2A,0x00,0x00,0x0A,0x02,0x0C,0x8B,0xE2,0x3E,0x00,0x80,0xE2, + 0x70,0x01,0x8D,0xE5,0x3D,0x0B,0x00,0xEB,0x06,0x00,0x90,0xE1,0x04,0x00,0x00,0x0A, + 0x70,0x01,0x9D,0xE5,0x39,0x0B,0x00,0xEB,0x00,0x00,0x50,0xE3,0x00,0x00,0x56,0x13, + 0x1F,0x00,0x00,0x0A,0x80,0x01,0x9D,0xE5,0xCD,0x10,0xA0,0xE3,0xB4,0x0F,0xD0,0xE1, + 0x33,0x1B,0x81,0xE2,0x91,0x00,0x00,0xE0,0xA0,0x29,0xA0,0xE1,0x02,0x0C,0x8B,0xE2, + 0xBA,0x33,0xD0,0xE1,0x02,0x10,0x43,0xE0,0x00,0x00,0x51,0xE3,0x03,0x10,0x42,0xD0, + 0x7C,0x21,0x9D,0xE5,0xCD,0x30,0xA0,0xE3,0xB6,0x20,0xD2,0xE1,0x33,0x3B,0x83,0xE2, + 0x93,0x02,0x02,0xE0,0xBC,0x33,0xD0,0xE1,0xA2,0x29,0xA0,0xE1,0x02,0x00,0x43,0xE0, + 0x00,0x00,0x50,0xE3,0x03,0x00,0x42,0xD0,0x91,0x01,0x02,0xE0,0x00,0x10,0xA0,0xE1, + 0x91,0x20,0x20,0xE0,0x0A,0x00,0x50,0xE1,0x03,0x00,0x00,0xAA,0x78,0x11,0x9D,0xE5, + 0x0C,0x20,0x8D,0xE2,0x00,0xA0,0xA0,0xE1,0x01,0x71,0x82,0xE7,0x74,0x11,0x9D,0xE5, + 0x07,0x01,0x81,0xE7,0x44,0x04,0x9F,0xE5,0x01,0x70,0x87,0xE2,0x82,0x01,0xD0,0xE5, + 0x07,0x00,0x50,0xE1,0xC9,0xFF,0xFF,0xAA,0x01,0x90,0x89,0xE2,0x04,0x00,0x59,0xE1, + 0xB7,0xFF,0xFF,0xDA,0x01,0x00,0xA0,0xE3,0x01,0x00,0x54,0xE3,0x6C,0x01,0x8D,0xE5, + 0x7D,0x00,0x00,0xBA,0x0C,0x70,0x8D,0xE2,0x01,0xC0,0xA0,0xE3,0x01,0x00,0x54,0xE3, + 0x08,0x30,0xA0,0xE1,0x0C,0x00,0xA0,0xE1,0x72,0x00,0x00,0xBA,0x57,0x1F,0x8D,0xE2, + 0x00,0x10,0xD1,0xE7,0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0x1A,0x80,0x11,0x80,0xE0, + 0x01,0x21,0x97,0xE7,0x01,0x91,0x87,0xE0,0x02,0x11,0x99,0xE7,0x03,0x00,0x51,0xE1, + 0x05,0x00,0x00,0xAA,0x00,0x00,0x51,0xE3,0x00,0x00,0x52,0xA3,0x02,0x00,0x00,0xBA, + 0x00,0x50,0xA0,0xE1,0x01,0x30,0xA0,0xE1,0x00,0xC0,0xA0,0xE3,0x01,0x00,0x80,0xE2, + 0x04,0x00,0x50,0xE1,0xEC,0xFF,0xFF,0xDA,0x00,0x00,0x5C,0xE3,0x5D,0x00,0x00,0x1A, + 0x68,0x01,0x9D,0xE5,0x85,0x91,0x85,0xE0,0x01,0x00,0x80,0xE2,0x68,0x01,0x8D,0xE5, + 0x09,0x01,0x97,0xE7,0x94,0xB3,0x9F,0xE5,0x00,0x01,0x80,0xE0,0x80,0x00,0x8B,0xE0, + 0x01,0x1C,0x80,0xE2,0x05,0x01,0x85,0xE0,0x80,0xA0,0x8B,0xE0,0xDE,0x10,0x81,0xE2, + 0x61,0x0F,0x8A,0xE2,0x0A,0x20,0xA0,0xE3,0xCC,0xFC,0xFF,0xEB,0x85,0x00,0x8B,0xE0, + 0xB4,0x1F,0xD0,0xE1,0xCD,0x20,0xA0,0xE3,0x33,0x2B,0x82,0xE2,0x92,0x01,0x01,0xE0, + 0xA1,0x29,0xA0,0xE1,0x01,0x1C,0x8A,0xE2,0x01,0x0C,0x80,0xE2,0xB6,0x28,0xC1,0xE1, + 0xB6,0x00,0xD0,0xE1,0xCD,0x20,0xA0,0xE3,0x33,0x2B,0x82,0xE2,0x92,0x00,0x00,0xE0, + 0xA0,0x09,0xA0,0xE1,0xB8,0x08,0xC1,0xE1,0x05,0x00,0x8B,0xE0,0x38,0x01,0xD0,0xE5, + 0x85,0x01,0xCA,0xE5,0x8A,0x01,0xDA,0xE5,0x90,0x11,0x9D,0xE5,0x01,0x00,0x50,0xE1, + 0x01,0x00,0x80,0x32,0x8A,0x01,0xCA,0x35,0x8A,0x01,0xDA,0xE5,0x13,0x00,0x50,0xE3, + 0x06,0x00,0x00,0x9A,0xCD,0x10,0xA0,0xE3,0x90,0x01,0x01,0xE0,0x8C,0x21,0x9D,0xE5, + 0x21,0x16,0xA0,0xE1,0x02,0x00,0x51,0xE1,0x14,0x00,0x80,0x32,0x8A,0x01,0xCA,0x35, + 0x84,0x01,0xDA,0xE5,0x57,0xEF,0x8D,0xE2,0x01,0x00,0x54,0xE3,0x05,0x00,0xCE,0xE7, + 0x88,0x11,0x9D,0xE5,0x01,0x50,0xC0,0xE7,0x84,0x21,0xDA,0xE5,0x84,0x11,0x9D,0xE5, + 0x00,0x00,0xA0,0xE3,0x01,0x00,0xC2,0xE7,0x09,0x11,0x97,0xE7,0x15,0x2E,0x8D,0xE2, + 0x01,0x00,0xC2,0xE7,0x01,0x00,0xA0,0xE3,0x19,0x00,0x00,0xBA,0xAC,0x12,0x9F,0xE5, + 0x82,0xC1,0xD1,0xE5,0x09,0x21,0x97,0xE7,0x80,0xA1,0x80,0xE0,0x00,0x10,0xE0,0xE3, + 0x0A,0xB1,0x87,0xE0,0x02,0x11,0x8B,0xE7,0x00,0x10,0xDE,0xE7,0x08,0x30,0xA0,0xE1, + 0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0x1A,0x01,0x00,0x5C,0xE3,0x01,0x10,0xA0,0xE3, + 0x08,0x00,0x00,0xBA,0x01,0x21,0x9B,0xE7,0x01,0x00,0x72,0xE3,0x02,0x00,0x00,0xDA, + 0x03,0x00,0x52,0xE1,0x02,0x30,0xA0,0xB1,0x0A,0x11,0x87,0xB7,0x01,0x10,0x81,0xE2, + 0x01,0x00,0x5C,0xE1,0xF6,0xFF,0xFF,0xAA,0x01,0x00,0x80,0xE2,0x04,0x00,0x50,0xE1, + 0xE7,0xFF,0xFF,0xDA,0x44,0x02,0x9F,0xE5,0x68,0x11,0x9D,0xE5,0x82,0x01,0xD0,0xE5, + 0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA,0x6C,0x01,0x9D,0xE5,0x01,0x00,0x80,0xE2, + 0x04,0x00,0x50,0xE1,0x6C,0x01,0x8D,0xE5,0x82,0xFF,0xFF,0xDA,0x06,0x00,0xB0,0xE1, + 0x01,0x10,0x46,0xE2,0xFF,0x60,0x01,0xE2,0x21,0xFF,0xFF,0x1A,0x0C,0x82,0x9F,0xE5, + 0x01,0x60,0xA0,0xE3,0x82,0x01,0xD8,0xE5,0x00,0x70,0xA0,0xE3,0x06,0xA0,0xA0,0xE1, + 0x01,0x00,0x50,0xE3,0x43,0x00,0x00,0xBA,0x15,0x0E,0x8D,0xE2,0x06,0x00,0xD0,0xE7, + 0x00,0x00,0x50,0xE3,0x3B,0x00,0x00,0x0A,0x06,0x01,0x86,0xE0,0x80,0x50,0x88,0xE0, + 0x38,0x02,0xD5,0xE5,0x84,0x11,0x9D,0xE5,0x0A,0x90,0x84,0xE0,0x01,0x00,0xD0,0xE7, + 0x08,0x10,0x9D,0xE5,0x01,0x00,0x50,0xE1,0x23,0x00,0x00,0x2A,0x08,0x00,0x59,0xE3, + 0x21,0x00,0x00,0xCA,0x02,0x0C,0x85,0xE2,0x3E,0x00,0x80,0xE2,0x6F,0x0A,0x00,0xEB, + 0x00,0x00,0x50,0xE3,0x1C,0x00,0x00,0x0A,0x38,0x02,0xD5,0xE5,0x84,0x11,0x9D,0xE5, + 0x84,0x21,0x9D,0xE5,0x01,0x10,0xD0,0xE7,0x01,0x10,0x81,0xE2,0x02,0x10,0xC0,0xE7, + 0x09,0x01,0x89,0xE0,0x80,0xB0,0x88,0xE0,0x8E,0x1F,0x85,0xE2,0x61,0x0F,0x8B,0xE2, + 0x0A,0x20,0xA0,0xE3,0x4D,0xFC,0xFF,0xEB,0xE5,0x01,0xD5,0xE5,0x57,0x1F,0x8D,0xE2, + 0x01,0xA0,0x8A,0xE2,0x8B,0x01,0xCB,0xE5,0xE6,0x01,0xD5,0xE5,0x01,0x70,0x87,0xE2, + 0x8C,0x01,0xCB,0xE5,0x38,0x02,0xD5,0xE5,0x09,0x00,0xC1,0xE7,0x88,0x11,0x9D,0xE5, + 0x01,0x90,0xC0,0xE7,0x64,0x01,0x9F,0xE5,0x00,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x10,0xA0,0x03,0x00,0x10,0xC0,0x05,0x0E,0x00,0x00,0xEA,0x02,0x0C,0x85,0xE2, + 0x3E,0x00,0x80,0xE2,0x4D,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3,0x09,0x00,0x00,0x0A, + 0x01,0x00,0xA0,0xE3,0xB1,0x02,0xC8,0xE5,0x3E,0x02,0xD5,0xE5,0x13,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x9A,0x81,0x01,0xD8,0xE5,0x01,0x00,0x50,0xE3,0xB6,0x00,0xD8,0x01, + 0x04,0x00,0x80,0x03,0xB6,0x00,0xC8,0x01,0x82,0x01,0xD8,0xE5,0x01,0x60,0x86,0xE2, + 0x06,0x00,0x50,0xE1,0xBB,0xFF,0xFF,0xAA,0xB6,0x00,0xD8,0xE1,0x04,0x00,0x10,0xE3, + 0x03,0x00,0x00,0x0A,0x04,0x10,0x9D,0xE5,0x04,0x00,0xC0,0xE3,0x83,0x11,0xC8,0xE5, + 0xB6,0x00,0xC8,0xE1,0x01,0x00,0x54,0xE3,0x01,0x50,0xA0,0xE3,0x21,0x00,0x00,0xBA, + 0x57,0x6F,0x8D,0xE2,0x01,0x90,0xA0,0xE3,0x05,0x00,0xD6,0xE7,0x00,0x00,0x50,0xE3, + 0x0F,0x00,0x00,0x1A,0x01,0x00,0xA0,0xE3,0x00,0x10,0x88,0xE0,0x9B,0x22,0xD1,0xE5, + 0x00,0x00,0x52,0xE3,0xA4,0x12,0xD1,0x05,0x00,0x00,0x51,0x03,0x05,0x00,0x00,0x1A, + 0xFF,0x20,0x00,0xE2,0xFF,0x10,0x05,0xE2,0x01,0x30,0xA0,0xE3,0x57,0x0F,0x8D,0xE2, + 0x71,0xFC,0xFF,0xEB,0x02,0x00,0x00,0xEA,0x01,0x00,0x80,0xE2,0x09,0x00,0x50,0xE3, + 0xF0,0xFF,0xFF,0xBA,0x83,0x01,0xD8,0xE5,0x00,0x00,0x50,0xE3,0x06,0x00,0x00,0x0A, + 0x05,0x01,0x85,0xE0,0x80,0xA0,0x88,0xE0,0x01,0x0C,0x8A,0xE2,0x8A,0x00,0x80,0xE2, + 0x16,0x0A,0x00,0xEB,0x00,0x00,0x50,0xE3,0x8A,0x91,0xCA,0x05,0x01,0x50,0x85,0xE2, + 0x04,0x00,0x55,0xE1,0xDF,0xFF,0xFF,0xDA,0x07,0x00,0x84,0xE0,0x80,0x01,0xC8,0xE5, + 0x28,0x00,0x9F,0xE5,0x5A,0x20,0xA0,0xE3,0x80,0x11,0xD0,0xE5,0x82,0x11,0xC0,0xE5, + 0x61,0x1F,0x80,0xE2,0x8E,0x0F,0x80,0xE2,0xF4,0xFB,0xFF,0xEB,0x65,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xF0,0x06,0x00,0x20,0x40,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0xA3,0x05,0x00,0x20,0xD0,0x05,0x00,0x20,0x95,0x05,0x00,0x20, + 0x40,0x02,0x00,0x20,0x8E,0x05,0x00,0x20,0x1E,0x02,0x00,0x20,0xDB,0x02,0x00,0x20, + 0x6C,0x06,0x00,0x20,0xF1,0xB5,0x38,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90, + 0x36,0x48,0x41,0x7F,0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21, + 0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29, + 0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x20,0xF9, + 0x01,0xF0,0x8C,0xF9,0x00,0x24,0x27,0x00,0x00,0x26,0x31,0x00,0x38,0x00,0x02,0xF0, + 0xC3,0xF8,0x00,0x28,0x28,0xD0,0x0E,0x21,0x79,0x43,0x05,0x9A,0x89,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D, + 0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x06,0xF0,0xFC,0xF9,0x40,0x1C,0x14,0xD1, + 0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x06,0xF0,0xEE,0xF9,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A, + 0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x0E,0x2E,0xCC,0xD3, + 0x7F,0x1C,0x16,0x2F,0xC8,0xD3,0x20,0x00,0xFF,0x38,0x35,0x38,0x04,0xD1,0x04,0x98, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0xB2,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0, + 0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0x20,0x93,0x00,0x00, + 0xF0,0xB5,0x7B,0x4A,0xFF,0xB0,0xBC,0xB0,0x40,0x18,0xB9,0x92,0x42,0x00,0x80,0x18, + 0xB8,0x90,0x48,0x42,0xB7,0x90,0x77,0x48,0x77,0x4E,0x07,0x7D,0x02,0xA8,0x01,0x90, + 0x76,0x48,0xBA,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0xB7,0x98,0x40,0x42,0xB7,0x90, + 0x73,0x4A,0x00,0x21,0x30,0x00,0xFE,0xF7,0x3F,0xFF,0x00,0x25,0x00,0x24,0x6F,0x48, + 0x20,0x38,0x01,0x7D,0xC9,0x07,0x14,0xD0,0x6E,0x49,0x09,0x78,0x00,0x29,0x16,0xD0, + 0xBD,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0, + 0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42, + 0x16,0xD1,0xB7,0x9A,0x21,0x00,0x28,0x00,0x06,0xF0,0x84,0xF9,0x10,0xE0,0xBC,0x42, + 0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E, + 0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0, + 0x64,0x1C,0x0E,0x2C,0xCB,0xD3,0x6D,0x1C,0x16,0x2D,0xC7,0xD3,0x01,0xF0,0x70,0xF8, + 0x01,0xF0,0xDC,0xF8,0x00,0x25,0x00,0x24,0x0E,0x20,0x2F,0x00,0x47,0x43,0x21,0x00, + 0x28,0x00,0x02,0xF0,0x11,0xF8,0x00,0x28,0x0F,0xD0,0xB9,0x9B,0x3A,0x19,0x91,0x00, + 0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD, + 0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0, + 0x41,0xF8,0x39,0x19,0x01,0x9A,0x49,0x00,0x64,0x1C,0x0E,0x2C,0x50,0x52,0xDE,0xD3, + 0x6D,0x1C,0x16,0x2D,0xD7,0xD3,0x00,0x20,0x00,0x90,0x01,0xF0,0xAF,0xF8,0x00,0x25, + 0x00,0x24,0x21,0x00,0x28,0x00,0x01,0xF0,0xE7,0xFF,0x00,0x28,0x3E,0xD0,0x0E,0x21, + 0x69,0x43,0xB9,0x9B,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x57,0x00, + 0xF1,0x5B,0x00,0x04,0x00,0x0C,0x81,0x42,0x06,0xD9,0xF0,0x53,0x21,0x00,0x28,0x00, + 0x02,0xF0,0x10,0xF8,0x01,0x99,0xC8,0x53,0x00,0x98,0x03,0x21,0xFE,0xF7,0x6A,0xFE, + 0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0xBA,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1, + 0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0, + 0xD9,0xF8,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x06,0xF0, + 0xD1,0xF8,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x0E,0x2C, + 0xB7,0xD3,0x6D,0x1C,0x16,0x2D,0xB3,0xD3,0x00,0x98,0x40,0x1C,0x00,0x90,0xB8,0x98, + 0x40,0x1E,0xB8,0x90,0x18,0xD2,0x00,0x25,0x00,0x24,0x0E,0x20,0x2E,0x00,0x46,0x43, + 0x01,0x99,0x30,0x19,0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00,0x06,0xF0,0xCE,0xF8, + 0x64,0x1C,0x0E,0x2C,0xF4,0xD3,0x6D,0x1C,0x16,0x2D,0xED,0xD3,0x7F,0xB0,0x3C,0xB0, + 0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0xF0,0xD2,0xFF,0x8D,0xE7,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x00,0x05,0x00,0x20,0x00,0x00,0x00,0x10,0x20,0x93,0x00,0x00, + 0xD2,0x02,0x00,0x00,0x99,0x05,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68, + 0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48, + 0x00,0x90,0x80,0x7D,0x00,0x28,0x3C,0xD0,0x00,0x21,0x05,0x25,0x1F,0x4F,0x2D,0x02, + 0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7D,0x1B,0x0F,0x21,0xE0,0x84,0x00, + 0xE4,0x19,0x64,0x19,0xA4,0x69,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00, + 0xC0,0x19,0x40,0x19,0x80,0x69,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43, + 0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02, + 0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0, + 0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x60,0x48,0x8E,0x46,0x02,0x8C,0x60,0x49, + 0x40,0x8C,0x01,0x91,0x4B,0x8A,0x20,0x39,0x00,0x91,0x89,0x79,0x00,0x25,0x2F,0x00, + 0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xAA,0xE0,0x01,0x99, + 0x09,0x7C,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29, + 0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00, + 0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42, + 0x5C,0xDC,0x82,0x42,0x5A,0xDB,0x8C,0x45,0x58,0xDC,0x8B,0x42,0x56,0xDB,0x01,0x25, + 0x72,0x46,0x00,0x2A,0x7B,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x02,0x2A,0x18,0xD0, + 0x03,0x2A,0x76,0xD1,0xE2,0x79,0xD3,0x07,0x2D,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A, + 0x27,0xD1,0x09,0x20,0x00,0x25,0xE0,0x71,0x6B,0xE0,0x00,0x9A,0x92,0x78,0x00,0x2A, + 0x67,0xD1,0x00,0xF0,0x79,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72, + 0x5F,0xE0,0xE2,0x79,0xD3,0x07,0xE8,0xD1,0x92,0x07,0x5A,0xD5,0x00,0xF0,0x6C,0xF8, + 0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71, + 0xFE,0xF7,0x1E,0xFE,0xEB,0xE7,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0x18,0xFE, + 0x47,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x55,0xF8,0x21,0x7A, + 0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0x05,0xFE,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20, + 0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28, + 0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79, + 0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xE1,0xFD,0xE6,0x71, + 0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xD5,0xFD,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20, + 0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F, + 0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00, + 0x00,0x05,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB4,0x16,0x4B,0x04,0x00,0xDE,0x79, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x23,0xD0,0x1B,0x78,0x00,0x2B,0x20,0xD1,0x12,0x4F, + 0x1C,0xE0,0xD3,0x00,0xDD,0x19,0x25,0x23,0x5B,0x01,0xEB,0x18,0x08,0x25,0x5D,0x5F, + 0xA5,0x42,0x0E,0xDC,0x0C,0x25,0x5D,0x5F,0xA5,0x42,0x0A,0xDB,0x0A,0x25,0x5D,0x5F, + 0x8D,0x42,0x06,0xDC,0x0E,0x25,0x5D,0x5F,0x8D,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06, + 0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xE0,0xD8, + 0xF0,0xBC,0x70,0x47,0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0x8F,0xB0,0xB5,0x4D,0x0D,0x90,0x0C,0x90,0x29,0x68,0x08,0x88,0x0B,0x90,0x08,0x00, + 0x40,0x30,0xC2,0x7F,0x60,0x31,0x0A,0x92,0x82,0x7F,0x09,0x92,0x49,0x78,0x08,0x91, + 0x81,0x7D,0x07,0x91,0xAD,0x49,0xCA,0x88,0x09,0x79,0x13,0x07,0x05,0xD5,0xAB,0x4B, + 0x00,0x29,0x02,0xD1,0x08,0x24,0xA2,0x43,0xDA,0x80,0xA9,0x4A,0x12,0x78,0x00,0x2A, + 0x07,0xD0,0xFF,0x20,0x06,0x90,0x05,0x90,0x08,0x20,0x04,0x90,0xA5,0x4F,0x96,0x20, + 0x07,0xE0,0x02,0x7C,0x47,0x8B,0x06,0x92,0x42,0x7C,0x05,0x92,0x82,0x7C,0x04,0x92, + 0xC0,0x7C,0x03,0x90,0x0B,0x98,0x80,0x04,0x7E,0xD5,0x9F,0x4A,0x00,0x20,0x52,0x78, + 0x00,0x2A,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0,0x3C,0xF9, + 0x96,0x48,0x9A,0x4C,0x00,0x79,0x00,0x28,0x0E,0x90,0x4A,0xD0,0x93,0x49,0x01,0x20, + 0x0E,0x89,0xBE,0x42,0x00,0xD3,0x00,0x20,0x02,0x90,0x30,0x00,0x0A,0x22,0x1A,0x21, + 0x50,0x43,0x61,0x5E,0x0F,0x00,0xFE,0xF7,0x3D,0xFB,0x06,0x99,0x88,0x42,0x01,0xDA, + 0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0xF0,0x1B,0x0A,0x21,0xFE,0xF7,0x32,0xFB, + 0x05,0x99,0x88,0x42,0x01,0xDA,0x01,0x21,0x00,0xE0,0x00,0x21,0xA3,0x8A,0x04,0x9E, + 0x01,0x22,0x10,0x00,0xB3,0x42,0x00,0xD8,0x00,0x20,0xE3,0x69,0x03,0x9E,0xB3,0x42, + 0x00,0xDB,0x00,0x22,0x02,0x9B,0x00,0x2B,0x1B,0xD0,0x01,0x9B,0x00,0x2B,0x18,0xD0, + 0x00,0x29,0x16,0xD0,0x00,0x28,0x14,0xD0,0x00,0x2A,0x12,0xD0,0x77,0x48,0xC0,0x30, + 0xC0,0x6A,0x00,0x28,0x0D,0xD1,0x7A,0x48,0x00,0x88,0x1E,0x28,0x09,0xD2,0x60,0x7E, + 0x00,0x28,0x1C,0xD0,0x29,0x68,0x40,0x31,0x49,0x7E,0x88,0x42,0x17,0xD8,0x40,0x1E, + 0x14,0xE0,0x29,0x68,0xE0,0x69,0x40,0x31,0x0A,0x7D,0x90,0x42,0x0F,0xDB,0x0E,0x98, + 0x6A,0x4A,0x00,0x28,0x0B,0xD0,0xD0,0x88,0xC0,0x06,0x08,0xD4,0x60,0x7E,0xC9,0x7D, + 0x88,0x42,0x04,0xD2,0x07,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C,0x60,0x76,0x60,0x7E, + 0x07,0x99,0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98,0x00,0x28,0x0A,0xD1,0x5F,0x48, + 0xC1,0x88,0x11,0x43,0xC1,0x80,0x00,0xE0,0x11,0xE0,0x28,0x68,0x40,0x30,0x00,0x7E, + 0x20,0x76,0x0F,0xE0,0x59,0x4B,0xD8,0x88,0xC1,0x06,0x0B,0xD5,0x21,0x7E,0x00,0x29, + 0x06,0xD1,0x90,0x43,0xD8,0x80,0x28,0x68,0x40,0x30,0x40,0x7D,0x60,0x76,0x01,0xE0, + 0x49,0x1E,0x21,0x76,0x51,0x4F,0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06, + 0x09,0xD5,0x08,0x99,0x09,0x98,0x88,0x42,0x03,0xD9,0x40,0x1A,0x00,0x06,0x00,0x0E, + 0x00,0xE0,0x01,0x20,0x09,0x90,0x01,0x22,0x50,0x00,0xC0,0x19,0x84,0x46,0xFF,0x30, + 0x61,0x30,0xC1,0x89,0x03,0x00,0x00,0x29,0x77,0xD0,0x0B,0x9C,0x00,0x20,0xA4,0x07, + 0x10,0xD5,0x43,0x4C,0x24,0x78,0x00,0x2C,0x03,0xD1,0x0A,0x9C,0xA1,0x42,0x09,0xD9, + 0x01,0xE0,0x0F,0x29,0x06,0xD9,0x00,0x20,0x38,0x71,0xF8,0x88,0x08,0x21,0x08,0x43, + 0xF8,0x80,0x01,0x20,0x0B,0x99,0x49,0x07,0x5F,0xD5,0x00,0x28,0x5D,0xD1,0xD8,0x89, + 0x09,0x99,0x88,0x42,0x59,0xD3,0x3B,0x48,0x00,0x88,0x00,0x28,0x55,0xD0,0x00,0x23, + 0x01,0x20,0x29,0xE0,0xFF,0x24,0x39,0x18,0x66,0x34,0x64,0x5C,0x94,0x42,0x22,0xD1, + 0x5B,0x1C,0xFF,0x31,0x21,0x31,0x09,0x7E,0x0D,0x91,0x01,0x00,0x14,0xE0,0x4C,0x00, + 0xE4,0x19,0x25,0x00,0xE0,0x35,0xEE,0x8A,0xFF,0x34,0x01,0x34,0xAE,0x82,0x26,0x89, + 0xE6,0x80,0x7C,0x18,0x25,0x00,0xFF,0x35,0x21,0x35,0x6E,0x7E,0xFF,0x34,0x61,0x34, + 0x2E,0x76,0xA6,0x79,0x49,0x1C,0x66,0x71,0x3C,0x79,0x8C,0x42,0xE7,0xDA,0x39,0x79, + 0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD2,0xDA,0x00,0x2B, + 0x23,0xDD,0x01,0x2B,0x05,0xDD,0x01,0x20,0x0C,0x90,0xF8,0x88,0x20,0x21,0x08,0x43, + 0xF8,0x80,0x39,0x79,0x60,0x46,0xFF,0x30,0x49,0x1C,0x41,0x30,0x09,0x06,0xC3,0x88, + 0x09,0x0E,0x39,0x71,0x49,0x00,0xC9,0x19,0x01,0xE0,0x19,0xE0,0x0D,0xE0,0xE0,0x31, + 0x8B,0x82,0xC1,0x8A,0x38,0x79,0x40,0x00,0xC0,0x19,0xFF,0x30,0x01,0x30,0xC1,0x80, + 0x3B,0x79,0x0D,0x49,0x0D,0x98,0x48,0x39,0x58,0x54,0x52,0x1C,0x08,0x2A,0x00,0xDA, + 0x7A,0xE7,0x0C,0x98,0x00,0x28,0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43,0xF8,0x80, + 0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xA3,0x05,0x00,0x20,0xDC,0x05,0x00,0x00,0xC0,0x01,0x00,0x20,0xC0,0x04,0x00,0x20, + 0xAE,0x05,0x00,0x20,0x0C,0x06,0x00,0x20,0xF0,0xB5,0x60,0x48,0x60,0x4C,0x01,0x78, + 0x20,0x68,0x05,0x22,0x60,0x30,0x00,0x29,0xB7,0xB0,0x00,0xD1,0x02,0x79,0x33,0x92, + 0x02,0x22,0x00,0x29,0x00,0xD1,0x42,0x79,0x5A,0x4E,0x00,0x20,0x32,0x92,0x70,0x83, + 0xF0,0x61,0x31,0x90,0x30,0x90,0x60,0x21,0x18,0xA8,0xFE,0xF7,0x73,0xFB,0x60,0x21, + 0x68,0x46,0xFE,0xF7,0x6F,0xFB,0x20,0x68,0x71,0x7E,0x40,0x30,0xC0,0x7D,0x81,0x42, + 0x78,0xD0,0x32,0x9D,0x0E,0x21,0x48,0x1B,0x34,0x90,0x5D,0xE0,0x33,0x98,0x16,0x22, + 0x11,0x1A,0x36,0x91,0x32,0x99,0x69,0x1A,0x8C,0x00,0x1A,0xE0,0x4A,0x4F,0x6A,0x00, + 0xD2,0x19,0xB8,0x23,0xD3,0x5E,0x0E,0x21,0x42,0x00,0x41,0x43,0xD2,0x19,0x88,0x27, + 0xD7,0x5F,0x49,0x19,0x09,0x04,0xDA,0x19,0x44,0x4B,0x09,0x14,0x49,0x00,0x59,0x5E, + 0x51,0x18,0x31,0x9A,0x52,0x18,0x31,0x92,0x18,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C, + 0x11,0x51,0x36,0x99,0x81,0x42,0xE1,0xDC,0x33,0x98,0x16,0x21,0x40,0x00,0x09,0x1A, + 0x18,0xAF,0x35,0x90,0x38,0x59,0xFE,0xF7,0xBD,0xF9,0x38,0x51,0x33,0x99,0x84,0x46, + 0x1A,0xE0,0x0E,0x20,0x48,0x43,0x35,0x4A,0x40,0x19,0x40,0x00,0x12,0x5E,0x60,0x46, + 0x31,0x4B,0x12,0x1A,0x68,0x00,0xC0,0x18,0xB8,0x23,0xC3,0x5E,0x2E,0x48,0x4F,0x00, + 0x3F,0x18,0x88,0x20,0x38,0x5E,0x18,0x18,0x12,0x18,0x17,0x00,0x57,0x43,0x68,0x46, + 0x03,0x59,0xDA,0x19,0x49,0x1C,0x02,0x51,0x36,0x98,0x88,0x42,0xE1,0xDC,0x35,0x98, + 0x15,0x21,0x09,0x1A,0x6F,0x46,0x38,0x59,0xFE,0xF7,0x94,0xF9,0x38,0x51,0x30,0x99, + 0x40,0x18,0x30,0x90,0x34,0x98,0x6D,0x1C,0xA8,0x42,0x9F,0xDC,0x33,0x98,0x41,0x00, + 0x16,0x20,0x41,0x1A,0x32,0x98,0x45,0x00,0x0E,0x20,0x44,0x1B,0x61,0x43,0x31,0x98, + 0xFE,0xF7,0x80,0xF9,0x70,0x83,0x30,0x98,0x21,0x00,0xFE,0xF7,0x7B,0xF9,0x00,0x21, + 0x6B,0x46,0x09,0xE0,0x18,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x17,0x00,0x57,0x43, + 0xF2,0x69,0xBA,0x18,0x49,0x1C,0xF2,0x61,0x8C,0x42,0xF4,0xDC,0x0D,0x20,0x41,0x1B, + 0xF0,0x69,0xFE,0xF7,0x67,0xF9,0x33,0x9B,0x16,0x22,0x34,0x99,0xD2,0x1A,0x12,0x03, + 0x51,0x43,0xFE,0xF7,0x5F,0xF9,0xF0,0x61,0x1A,0x20,0x30,0x5E,0x00,0x28,0x01,0xD1, + 0x40,0x1C,0x70,0x83,0x37,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA3,0x05,0x00,0x20, + 0xF0,0x06,0x00,0x20,0xC0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x00,0x00,0x10, + 0x10,0xB5,0x00,0x28,0x06,0xD1,0x14,0x48,0x00,0x69,0x00,0x04,0x00,0x0E,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x11,0x49,0x09,0x6B,0x11,0x4A,0x12,0x4B,0x8A,0x18,0x9A,0x42, + 0x16,0xD2,0x00,0x04,0x00,0x0C,0x48,0x43,0x59,0x1E,0xFE,0xF7,0x63,0xFA,0x04,0x00, + 0x0A,0x21,0xFE,0xF7,0x5F,0xFA,0x04,0x29,0x00,0xD9,0x0A,0x34,0x0A,0x21,0x20,0x00, + 0xFE,0xF7,0x58,0xFA,0x08,0x49,0x49,0x7C,0x08,0x18,0xFF,0x28,0x00,0xD9,0xFF,0x20, + 0x00,0x06,0x00,0x0E,0xDB,0xE7,0x00,0x00,0x00,0x90,0x00,0x40,0x00,0x70,0x00,0x40, + 0x90,0x6B,0xFF,0xFF,0xA1,0x0F,0x00,0x00,0x60,0x93,0x00,0x00,0xF8,0xB5,0x74,0x4C, + 0x00,0x25,0x60,0x7C,0x00,0x28,0x06,0xD0,0xA0,0x6E,0x00,0x04,0x00,0x0C,0x06,0xF0, + 0x73,0xF8,0x06,0xF0,0x61,0xF8,0x01,0x20,0x40,0x03,0xFE,0xF7,0x2F,0xFE,0xFE,0xF7, + 0xA9,0xFA,0x05,0xF0,0x01,0xFB,0x05,0xF0,0x15,0xFB,0x05,0xF0,0x4B,0xFD,0x69,0x48, + 0x01,0x26,0x86,0x60,0x1F,0x20,0x01,0xF0,0x6D,0xFD,0x67,0x48,0x00,0x90,0xB9,0xE0, + 0x66,0x48,0x41,0x68,0x09,0x07,0x0B,0xD5,0xC1,0x68,0x00,0x29,0x08,0xD0,0xC0,0x68, + 0x07,0x28,0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0xB0,0xE0,0x04,0xF0,0xB8,0xFE, + 0x60,0x7C,0x00,0x28,0x04,0xD0,0xA0,0x6E,0x00,0x04,0x00,0x0C,0x06,0xF0,0x44,0xF8, + 0x80,0x20,0xFE,0xF7,0x03,0xFE,0x03,0x20,0x05,0xF0,0xB2,0xFE,0x01,0x20,0x40,0x03, + 0xFE,0xF7,0xFC,0xFD,0xE0,0x7D,0x00,0x28,0x01,0xD0,0x06,0x20,0x0A,0xE0,0x54,0x48, + 0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x04,0x20, + 0x00,0xE0,0x02,0x20,0x05,0xF0,0x20,0xFD,0x00,0xF0,0xCC,0xFB,0x00,0xF0,0x88,0xFB, + 0x00,0xF0,0x96,0xFB,0x4B,0x48,0x06,0x61,0x00,0xF0,0x00,0xFC,0x00,0xF0,0x78,0xFB, + 0x01,0x20,0x80,0x03,0xFE,0xF7,0xDA,0xFD,0x00,0xF0,0x8A,0xFB,0x00,0xF0,0xF6,0xFB, + 0xFE,0xF7,0x1C,0xFB,0xA0,0x7D,0x00,0x28,0x05,0xD1,0x00,0x98,0x00,0x7B,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0xE3,0xFC,0x03,0xF0,0xA1,0xFC,0x00,0x28,0x00,0xD0,0x26,0x70, + 0x20,0x8C,0x3D,0x4F,0xB8,0x42,0x01,0xD2,0x40,0x1C,0x20,0x84,0x20,0x78,0x00,0x28, + 0x05,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x01,0x23,0x00,0xF0,0x6F,0xF9,0x03,0x20, + 0x40,0x03,0xFE,0xF7,0xAB,0xFD,0x20,0x78,0x00,0x28,0x05,0xD0,0xA0,0x7D,0x00,0x09, + 0x04,0x28,0x4C,0xD1,0x00,0x20,0x20,0x70,0x03,0x20,0x05,0xF0,0x33,0xFE,0x60,0x66, + 0x03,0x20,0x05,0xF0,0x65,0xFE,0x80,0x20,0xFE,0xF7,0x98,0xFD,0x28,0x49,0xC8,0x8B, + 0x00,0x28,0x02,0xD0,0x40,0x1E,0xC8,0x83,0x34,0xE0,0xA0,0x7B,0x00,0x28,0x31,0xD1, + 0x60,0x6B,0x00,0x28,0x2E,0xD0,0x28,0x00,0x6D,0x1C,0xB8,0x42,0x60,0x6E,0x01,0xD3, + 0x22,0x49,0x01,0xE0,0x7D,0x21,0xC9,0x00,0x0C,0x1A,0xFF,0x20,0x91,0x30,0x84,0x42, + 0x20,0xDD,0xFF,0x27,0x01,0x37,0x38,0x00,0xFE,0xF7,0x80,0xFD,0x02,0x20,0x05,0xF0, + 0x3F,0xFE,0x0A,0x21,0x20,0x00,0xFE,0xF7,0x4D,0xF8,0x41,0x11,0x02,0x20,0x05,0xF0, + 0x1F,0xFE,0x04,0x20,0xFE,0xF7,0xAA,0xFD,0x02,0x20,0x05,0xF0,0x21,0xFE,0x11,0x48, + 0x06,0x61,0xFF,0x20,0xFE,0xF7,0xA2,0xFD,0x02,0x20,0x05,0xF0,0x29,0xFE,0x38,0x00, + 0xFE,0xF7,0x5C,0xFD,0x06,0x4C,0x20,0x78,0x00,0x28,0x00,0xD1,0x40,0xE7,0x04,0x48, + 0x40,0x7C,0x00,0x28,0x01,0xD0,0x05,0xF0,0x8F,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x8C,0x05,0x00,0x20,0x00,0x90,0x00,0x40,0x80,0x93,0x00,0x00,0x00,0x40,0x00,0x30, + 0x40,0x00,0x00,0x20,0x40,0x00,0x00,0x40,0x10,0x27,0x00,0x00,0x30,0x75,0x00,0x00, + 0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43,0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80, + 0x0B,0x4B,0x0B,0x4C,0x24,0x33,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00, + 0x1C,0x3C,0xA3,0x52,0x22,0x00,0x12,0x32,0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18, + 0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E,0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47, + 0xE4,0x09,0x00,0x20,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0x0C,0x48, + 0x09,0x22,0x00,0x21,0xFE,0xF7,0x42,0xF9,0x0A,0x48,0x5A,0x22,0x00,0x21,0xFE,0xF7, + 0x3D,0xF9,0x08,0x48,0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48,0x28,0x22,0x21,0x00, + 0xFE,0xF7,0x34,0xF9,0x04,0x48,0x3A,0x38,0x44,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xDB,0x02,0x00,0x20,0xC4,0x01,0x00,0x20,0x1A,0x05,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x12,0x22,0x00,0x21,0xFE,0xF7,0x22,0xF9,0x14,0x48,0x12,0x22,0x00,0x21,0x12,0x30, + 0xFE,0xF7,0x1C,0xF9,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30,0xFE,0xF7,0x16,0xF9, + 0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0xFE,0xF7,0x10,0xF9,0x0B,0x48,0x10,0x22, + 0x00,0x21,0x52,0x30,0xFE,0xF7,0x0A,0xF9,0x08,0x48,0x10,0x22,0x00,0x21,0x62,0x30, + 0xFE,0xF7,0x04,0xF9,0x05,0x49,0x00,0x20,0x6C,0x31,0xC8,0x83,0xFF,0x39,0x61,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x34,0x01,0x00,0x20, + 0x8C,0x10,0x9F,0xE5,0x10,0x40,0x2D,0xE9,0x00,0x10,0x91,0xE5,0x84,0xC0,0x9F,0xE5, + 0x7E,0xE0,0xD1,0xE5,0x08,0x10,0xA0,0xE3,0x00,0x30,0xA0,0xE3,0x01,0x22,0x8C,0xE0, + 0x80,0x20,0x82,0xE0,0xB5,0x4F,0xA0,0xE3,0xB2,0x30,0x84,0xE1,0x03,0x2C,0x82,0xE2, + 0x01,0x10,0x51,0xE2,0xB4,0x36,0xC2,0xE1,0xF7,0xFF,0xFF,0x5A,0x01,0x20,0xA0,0xE3, + 0x00,0x10,0x8C,0xE0,0xCC,0x22,0xC1,0xE5,0x80,0x20,0x8C,0xE0,0x03,0x2C,0x82,0xE2, + 0xB4,0x3F,0xC2,0xE1,0x04,0xE4,0xC1,0xE5,0x0C,0x34,0xC1,0xE5,0x05,0x10,0xA0,0xE3, + 0x01,0x22,0x8C,0xE0,0x80,0x20,0x82,0xE0,0x01,0x2B,0x82,0xE2,0x01,0x10,0x51,0xE2, + 0xB4,0x31,0xC2,0xE1,0xF9,0xFF,0xFF,0x5A,0x00,0x01,0x8C,0xE0,0x00,0x10,0xE0,0xE3, + 0x01,0x0B,0x80,0xE2,0xB4,0x17,0xC0,0xE1,0xB6,0x17,0xC0,0xE1,0x10,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x48, + 0x1E,0x22,0x00,0x21,0xFE,0xF7,0xA2,0xF8,0x04,0x48,0x00,0x21,0x81,0x74,0x41,0x74, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xEE,0x02,0x00,0x20,0x20,0x01,0x00,0x20, + 0x10,0xB5,0x05,0xF0,0x65,0xFD,0x04,0xF0,0xF5,0xFB,0xFF,0xF7,0x47,0xFF,0x04,0xF0, + 0x67,0xFD,0x01,0xF0,0xAD,0xFD,0x01,0xF0,0x25,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x09,0x4B,0x10,0xB4,0x1B,0x68,0x80,0x33,0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42, + 0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04, + 0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0xF0,0x06,0x00,0x20,0xFF,0xB5,0x66,0x48, + 0xFF,0xB0,0x00,0x7D,0xC0,0xB0,0x00,0x28,0x03,0xD0,0x01,0x20,0xBC,0x90,0x00,0x20, + 0x02,0xE0,0x00,0x20,0xBC,0x90,0x01,0x20,0xBB,0x90,0x60,0x48,0x00,0x25,0xBD,0x90, + 0x5F,0x48,0x2E,0x00,0x01,0x8B,0x05,0x91,0x41,0x8B,0x04,0x91,0x81,0x8A,0x03,0x91, + 0xC0,0x8A,0x02,0x90,0x5B,0x48,0x00,0x7D,0x01,0x90,0x00,0x24,0x0E,0x20,0x70,0x43, + 0xBE,0x90,0x07,0x19,0x21,0x00,0x30,0x00,0x01,0xF0,0x7E,0xF9,0x52,0x4A,0x00,0x21, + 0x20,0x3A,0x13,0x7D,0xDB,0x07,0x28,0xD0,0x53,0x4B,0x5B,0x7B,0x00,0x2B,0x01,0x9B, + 0x11,0xD0,0x9E,0x42,0x21,0xD1,0x91,0x7D,0xA1,0x42,0x1D,0xD0,0xD1,0x7D,0xA1,0x42, + 0x1A,0xD0,0x11,0x7E,0xA1,0x42,0x17,0xD0,0x51,0x7E,0xA1,0x42,0x14,0xD0,0x91,0x7E, + 0xA1,0x42,0x41,0xD1,0x10,0xE0,0x9C,0x42,0x0F,0xD1,0x91,0x7D,0xB1,0x42,0x0B,0xD0, + 0xD1,0x7D,0xB1,0x42,0x08,0xD0,0x11,0x7E,0xB1,0x42,0x05,0xD0,0x51,0x7E,0xB1,0x42, + 0x02,0xD0,0x91,0x7E,0xB1,0x42,0x2F,0xD1,0x01,0x21,0x02,0xAA,0x0C,0xCA,0x01,0x29, + 0x05,0xD1,0x05,0x99,0x04,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x02,0xE0,0xC1,0x18, + 0x09,0x04,0x09,0x0C,0x80,0x1A,0xBD,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0xC0,0x9B, + 0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D, + 0xC2,0x9B,0x00,0x2B,0x0C,0xD0,0x90,0x42,0x02,0xDA,0xBF,0x9B,0xBC,0x9A,0x03,0xE0, + 0x88,0x42,0x09,0xDD,0xBF,0x9B,0xBB,0x9A,0x21,0x00,0x30,0x00,0x00,0xF0,0x7C,0xF8, + 0x68,0x00,0x06,0xA9,0x6D,0x1C,0x0F,0x52,0x64,0x1C,0x0E,0x2C,0x01,0xDA,0xBE,0x98, + 0x97,0xE7,0x76,0x1C,0x16,0x2E,0x90,0xDB,0x00,0x2D,0x38,0xDD,0xC1,0x98,0x00,0x28, + 0x35,0xD1,0x00,0xF0,0x4D,0xF9,0x00,0xF0,0x63,0xF9,0x00,0xF0,0xCF,0xF9,0x2C,0xE0, + 0x68,0x00,0x06,0xA9,0x08,0x5A,0x87,0x00,0xBD,0x98,0xC0,0x59,0x01,0x01,0x06,0x05, + 0xC2,0x98,0x0C,0x0D,0x36,0x0D,0x02,0x28,0x01,0xD1,0x64,0x21,0x04,0xE0,0x01,0x28, + 0x01,0xD1,0x1E,0x21,0x00,0xE0,0x00,0x21,0xB4,0x42,0x06,0xD2,0x30,0x1B,0x64,0x21, + 0x48,0x43,0xFD,0xF7,0x67,0xFE,0x00,0x19,0x05,0xE0,0xA0,0x1B,0x48,0x43,0x64,0x21, + 0xFD,0xF7,0x60,0xFE,0x20,0x1A,0x0D,0x49,0x00,0x04,0x00,0x0C,0x88,0x42,0x00,0xD9, + 0x08,0x00,0xBD,0x99,0x00,0x04,0x30,0x43,0xC8,0x51,0x6D,0x1E,0xD0,0xD5,0x7F,0xB0, + 0x44,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x93,0x00,0x00,0xD4,0x02,0x10,0x40, + 0xE0,0x95,0x00,0x00,0x00,0x05,0x00,0x20,0x8C,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x7C,0xB5,0x01,0x25,0x6D,0x07,0x28,0x68,0x02,0x28,0x17,0xD1,0xAC,0x68,0x69,0x46, + 0x20,0x05,0x00,0x0D,0x00,0x90,0x20,0x02,0x00,0x0D,0x01,0x90,0x01,0xA8,0x04,0xF0, + 0xD1,0xFD,0x08,0x48,0x00,0x99,0x04,0x40,0x01,0x98,0x09,0x05,0x00,0x05,0x00,0x0A, + 0x04,0x43,0x20,0x0B,0x00,0x03,0x09,0x0D,0x08,0x43,0xA8,0x60,0x7C,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x30,0xB4,0x0E,0x25,0x68,0x43,0x14,0x4C, + 0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0, + 0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0, + 0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0, + 0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2, + 0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0xF0,0xB5,0x8B,0xB0,0x0E,0x27,0x16,0x20,0x04,0xA9,0x81,0xC1, + 0x06,0x90,0x53,0x48,0x53,0x49,0x0A,0x90,0x80,0x79,0x09,0x91,0xC2,0x07,0x0A,0xD0, + 0x80,0x07,0x03,0xD5,0x0D,0x20,0x03,0x21,0x05,0x90,0x02,0xE0,0x15,0x20,0x00,0x21, + 0x04,0x90,0x09,0x98,0x01,0x74,0x4C,0x48,0x0A,0x22,0x01,0x8C,0x40,0x8C,0x51,0x43, + 0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x0E,0x04,0x36,0x0C,0x00,0x28, + 0x7E,0xD0,0x04,0x98,0x00,0x28,0x7F,0xD0,0x05,0x98,0x41,0x00,0x30,0x00,0xFD,0xF7, + 0xC1,0xFD,0x05,0x04,0x2D,0x0C,0x00,0x24,0xBF,0x1C,0x0A,0xE0,0x30,0x00,0x60,0x43, + 0x05,0x99,0xFD,0xF7,0xB7,0xFD,0x3D,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C, + 0x08,0x84,0xBC,0x42,0xF2,0xDB,0x04,0x98,0x41,0x00,0x01,0x98,0xFD,0xF7,0xAA,0xFD, + 0x06,0x9F,0x06,0x04,0x36,0x0C,0x00,0x24,0xBF,0x1C,0x0B,0xE0,0x01,0x98,0x04,0x99, + 0x60,0x43,0xFD,0xF7,0x9F,0xFD,0x31,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30, + 0x64,0x1C,0x81,0x82,0xBC,0x42,0xF1,0xDB,0x0A,0x98,0x80,0x79,0xC0,0x07,0x4B,0xD0, + 0x00,0x24,0x43,0xE0,0x29,0x4A,0x13,0x21,0x10,0x19,0x89,0x01,0x40,0x18,0x41,0x7D, + 0x0A,0x98,0x80,0x79,0x80,0x07,0x03,0xD5,0x05,0x98,0x02,0x95,0x03,0x91,0x03,0xE0, + 0x08,0x00,0x04,0x99,0x02,0x96,0x03,0x91,0x20,0x49,0x40,0x00,0x40,0x18,0x08,0x90, + 0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7,0x75,0xFD,0x1C,0x4A,0xE1,0x00,0x89,0x18, + 0x25,0x22,0x52,0x01,0x8F,0x18,0x38,0x81,0x03,0x98,0x18,0x49,0x40,0x00,0x40,0x18, + 0x40,0x30,0x07,0x90,0x80,0x8A,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0x63,0xFD,0x78,0x81, + 0x08,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19,0xFD,0xF7,0x8C,0xFE,0xB8,0x81,0x07,0x98, + 0x0A,0x21,0x80,0x8A,0x80,0x19,0xFD,0xF7,0x85,0xFE,0xF8,0x81,0x02,0x98,0x0A,0x21, + 0x40,0x00,0xFD,0xF7,0x7F,0xFE,0x09,0x99,0x64,0x1C,0x48,0x82,0x0A,0x98,0x00,0xE0, + 0x02,0xE0,0xC0,0x79,0xA0,0x42,0xB5,0xDC,0x0B,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xE0,0x04,0x00,0x20,0x00,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20, + 0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40, + 0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68, + 0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0xB5,0x22,0x10,0xB5, + 0x07,0x49,0x08,0x48,0x92,0x00,0xFD,0xF7,0x53,0xFE,0x07,0x48,0x07,0x4A,0xC0,0x8E, + 0x01,0x04,0x01,0x43,0x06,0x48,0xFD,0xF7,0x77,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x9D,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x93,0x00,0x00,0xA4,0x05,0x00,0x00, + 0xD4,0x02,0x10,0x40,0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47, + 0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47, + 0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22,0xFD,0xF7,0x28,0xFE, + 0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32,0xFD,0xF7,0x22,0xFE,0x71,0x22,0x08,0x49, + 0x08,0x48,0xD2,0x00,0xFD,0xF7,0x1C,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x04,0x96,0x00,0x00,0x04,0x90,0x00,0x40,0x00,0x97,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x00,0x99,0x00,0x00,0x78,0x08,0x10,0x40,0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04, + 0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68, + 0xC9,0x07,0xFC,0xD0,0x70,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xF0,0x47,0x2D,0xE9, + 0x00,0x80,0xA0,0xE1,0x1C,0x02,0x9F,0xE5,0x1C,0x72,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0x00,0x40,0xA0,0xE3,0xB4,0x67,0xD0,0xE1,0x76,0x00,0xD0,0xE5,0x01,0x50,0xA0,0xE3, + 0x90,0x00,0x01,0xE0,0x82,0x01,0xD7,0xE5,0xFF,0x90,0x01,0xE2,0x01,0x00,0x50,0xE3, + 0x0E,0x00,0x00,0xBA,0x05,0x01,0x85,0xE0,0x80,0x00,0x87,0xE0,0x38,0x12,0xD0,0xE5, + 0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A,0x02,0x0C,0x80,0xE2,0x3E,0x00,0x80,0xE2, + 0x0A,0x05,0x00,0xEB,0x00,0x00,0x50,0xE3,0x01,0x00,0x84,0x12,0xFF,0x40,0x00,0x12, + 0x82,0x01,0xD7,0xE5,0x01,0x50,0x85,0xE2,0x05,0x00,0x50,0xE1,0xF0,0xFF,0xFF,0xAA, + 0xB8,0x01,0x9F,0xE5,0x00,0x40,0x80,0xE5,0xB4,0x01,0x9F,0xE5,0xBC,0x1B,0xD0,0xE1, + 0xB0,0x3C,0xD0,0xE1,0xBE,0xCB,0xD0,0xE1,0x03,0x20,0x41,0xE0,0x00,0x00,0x52,0xE3, + 0x01,0x20,0x43,0xD0,0xB2,0x3C,0xD0,0xE1,0x02,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1, + 0x03,0x20,0x4C,0xE0,0x00,0x00,0x52,0xE3,0x0C,0x20,0x43,0xD0,0xC8,0x32,0xD7,0xE5, + 0x02,0x28,0xA0,0xE1,0x22,0x28,0xA0,0xE1,0x00,0x00,0x53,0xE3,0xCB,0x32,0xD7,0x15, + 0xC8,0x00,0x53,0x13,0x01,0x00,0x00,0x2A,0x01,0x30,0x83,0xE2,0xCB,0x32,0xC7,0xE5, + 0xBE,0x3A,0xD0,0xE1,0x01,0xC0,0xA0,0xE3,0x14,0x00,0x53,0xE3,0x02,0x00,0x00,0x2A, + 0xB1,0x32,0xD7,0xE5,0x00,0x00,0x53,0xE3,0xB2,0xC2,0xC7,0x15,0x19,0x00,0x51,0xE3, + 0x19,0x00,0x52,0x93,0x03,0x00,0x00,0x9A,0xB0,0x32,0xD7,0xE5,0xC8,0x00,0x53,0xE3, + 0x01,0x30,0x83,0x32,0xB0,0x32,0xC7,0x35,0xF6,0x3C,0xD0,0xE1,0x02,0x00,0x54,0xE3, + 0x19,0x00,0x51,0x33,0x19,0x00,0x52,0x33,0x03,0x00,0x00,0x2A,0x04,0x00,0x53,0xE3, + 0x05,0x00,0x00,0xAA,0x01,0x30,0x83,0xE2,0x02,0x00,0x00,0xEA,0x03,0x00,0x73,0xE3, + 0x01,0x00,0x00,0xDA,0x01,0x30,0x43,0xE2,0xB6,0x3C,0xC0,0xE1,0xCB,0x32,0xD7,0xE5, + 0x01,0x00,0x53,0xE3,0x78,0x10,0xA0,0x83,0x0D,0x00,0x00,0x8A,0x02,0x00,0x54,0xE3, + 0x0C,0x00,0x00,0x2A,0xF6,0x3C,0xD0,0xE1,0x02,0x00,0x53,0xE3,0x09,0x00,0x00,0xDA, + 0xB0,0x32,0xD7,0xE5,0x14,0x00,0x53,0xE3,0x06,0x00,0x00,0x2A,0x47,0x10,0x41,0xE2, + 0x95,0x00,0x51,0xE3,0x47,0x10,0x42,0x22,0x95,0x00,0x51,0x23,0x01,0x00,0x00,0x2A, + 0x77,0x10,0xE0,0xE3,0xB4,0x1C,0xC0,0xE1,0x00,0x10,0xA0,0xE3,0x02,0x00,0x54,0xE3, + 0xCA,0x12,0xC7,0xE5,0x0A,0x00,0x00,0x2A,0xF4,0x1C,0xD0,0xE1,0x78,0x00,0x71,0xE3, + 0x03,0x00,0x00,0x1A,0xC9,0x12,0xD7,0xE5,0xC8,0x00,0x51,0xE3,0x01,0x10,0x81,0x32, + 0xC9,0x12,0xC7,0x35,0xC9,0x12,0xD7,0xE5,0x02,0x00,0x51,0xE3,0xCA,0xC2,0xC7,0x05, + 0x01,0x00,0x00,0xEA,0x3B,0x10,0xE0,0x83,0xB4,0x1C,0xC0,0x81,0xF4,0x0C,0xD0,0xE1, + 0x06,0x10,0x80,0xE0,0x91,0x01,0x00,0xE0,0x58,0x10,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x00,0x00,0x51,0xE3,0x50,0x10,0x9F,0xE5,0x96,0x06,0x00,0x10,0x00,0x10,0xD1,0xE5, + 0x01,0x00,0x51,0xE3,0xF0,0x47,0xBD,0x08,0x64,0x00,0xA0,0x03,0x1E,0xFF,0x2F,0x01, + 0x00,0x00,0x58,0xE3,0xF0,0x47,0xBD,0x18,0x1E,0xFF,0x2F,0x11,0x04,0x10,0xD7,0xE5, + 0x01,0x00,0x51,0xE3,0xF0,0x47,0xBD,0x08,0x1E,0xFF,0x2F,0x01,0x09,0x10,0xA0,0xE1, + 0xF0,0x47,0xBD,0xE8,0xCB,0xF5,0xFF,0xEA,0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20, + 0xD4,0x05,0x00,0x20,0x40,0x02,0x00,0x20,0xA3,0x05,0x00,0x20,0x95,0x05,0x00,0x20, + 0x78,0x47,0xC0,0x46,0xD2,0x10,0xA0,0xE3,0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2, + 0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x11,0x10,0xA0,0xE3, + 0x01,0x00,0xB0,0xE1,0x01,0x10,0x41,0xE2,0xFC,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06, + 0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xAD,0xF8,0x08,0xE0, + 0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x04,0xF0, + 0x27,0xF9,0x09,0x48,0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43, + 0x82,0x60,0x06,0x48,0x40,0x7C,0x00,0x28,0x01,0xD0,0x05,0xF0,0x9D,0xFA,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0x8C,0x05,0x00,0x20, + 0xF1,0xB5,0x43,0x48,0x2E,0x21,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x00,0x99, + 0x01,0x26,0x76,0x07,0xF1,0x63,0x84,0x69,0x3D,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5, + 0x04,0xF0,0xFE,0xF8,0x3B,0x4D,0x68,0x7C,0x00,0x28,0x01,0xD0,0x05,0xF0,0x84,0xFA, + 0x00,0x9B,0x00,0x20,0x9B,0x1E,0xFF,0x27,0x42,0x1E,0x01,0x21,0x05,0xF0,0xB6,0xFA, + 0x1E,0x15,0x15,0x15,0x15,0x15,0x13,0x15,0x15,0x17,0x10,0x15,0x15,0x24,0x15,0x35, + 0x19,0x3B,0x41,0x47,0x15,0x4D,0x15,0x53,0x59,0x19,0x15,0x15,0x15,0x15,0x5F,0x15, + 0x0B,0x20,0xF0,0x63,0x1B,0xE0,0x00,0xF0,0xD5,0xF8,0xF7,0x63,0x17,0xE0,0xEC,0x66, + 0xFB,0xE7,0x03,0x20,0x00,0x07,0xC2,0x60,0x01,0x20,0x40,0x03,0xFE,0xF7,0x26,0xF8, + 0x00,0x98,0xFD,0xF7,0x77,0xFF,0x0A,0xE0,0x03,0x20,0x00,0x07,0xC2,0x60,0x01,0x20, + 0x40,0x03,0xFE,0xF7,0x1B,0xF8,0x00,0xF0,0x3F,0xFE,0x00,0xF0,0xD7,0xF8,0x1C,0x48, + 0x41,0x68,0x41,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C,0x01,0xD0,0xA9,0x73, + 0xDB,0xE7,0xA8,0x73,0xD9,0xE7,0x00,0x2C,0x01,0xD0,0xE9,0x73,0xD5,0xE7,0xE8,0x73, + 0xD3,0xE7,0x00,0x2C,0x01,0xD0,0x29,0x74,0xCF,0xE7,0x28,0x74,0xCD,0xE7,0x00,0x2C, + 0x01,0xD0,0x69,0x74,0xC9,0xE7,0x68,0x74,0xC7,0xE7,0x00,0x2C,0x01,0xD0,0xE9,0x74, + 0xC3,0xE7,0xE8,0x74,0xC1,0xE7,0x00,0x2C,0x01,0xD0,0x29,0x75,0xBD,0xE7,0x28,0x75, + 0xBB,0xE7,0x00,0x2C,0x01,0xD0,0x69,0x75,0xB7,0xE7,0x68,0x75,0xB5,0xE7,0x00,0x2C, + 0x01,0xD0,0xAC,0x75,0x00,0xE0,0xA8,0x75,0x04,0xF0,0x9E,0xFD,0xAD,0xE7,0x00,0x00, + 0x00,0x40,0x00,0x30,0x8C,0x05,0x00,0x20,0xF0,0xB5,0x34,0x4C,0x30,0x38,0x34,0x4A, + 0x34,0x4E,0x35,0x4F,0x35,0x49,0x25,0x68,0x03,0x00,0x05,0xF0,0x3F,0xFA,0x12,0x0A, + 0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16,0x3E,0x43,0x47,0x4D, + 0x50,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61, + 0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x34,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68, + 0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48, + 0x03,0x7D,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F, + 0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D, + 0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43, + 0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07, + 0xC0,0x0F,0xCC,0xE7,0x38,0x69,0x40,0x08,0x00,0x02,0xC8,0xE7,0x13,0x48,0xA2,0x69, + 0xC0,0x8B,0x00,0x04,0x10,0x43,0xC2,0xE7,0x38,0x69,0x40,0x08,0xBF,0xE7,0x10,0x48, + 0x80,0x6A,0xBC,0xE7,0x48,0x69,0x10,0x42,0xFC,0xD1,0x04,0xF0,0x21,0xF8,0xFF,0x20, + 0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x92,0x00,0x00, + 0x00,0x93,0x00,0x00,0x16,0x00,0x0E,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30, + 0xC0,0x0F,0x00,0x20,0x00,0x05,0x00,0x20,0x00,0x96,0x00,0x00,0xE0,0x95,0x00,0x00, + 0x8C,0x05,0x00,0x20,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43, + 0xE0,0x60,0xFD,0xF7,0x71,0xFF,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFD,0xF7,0x4E,0xFF, + 0x03,0xF0,0x58,0xFE,0x00,0xF0,0x9A,0xFD,0x03,0xF0,0x4A,0xFE,0x30,0x00,0xFD,0xF7, + 0x77,0xFF,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x20,0x03,0x21, + 0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x03,0xF0,0x44,0xFE,0xFF,0xF7,0x4E,0xFD, + 0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x05,0xF0,0x9D,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xF8,0xB5,0x23,0x48, + 0x00,0x68,0x00,0x88,0xC0,0x06,0x3D,0xD5,0x21,0x4E,0x30,0x78,0x00,0x28,0x39,0xD0, + 0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25,0x31,0xE0,0x0A,0x21,0x69,0x43,0x1D,0x4B, + 0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78,0x81,0x34,0x25,0xE0,0x0A,0x22,0x42,0x43, + 0xD2,0x18,0xFF,0x32,0xC1,0x32,0x21,0x79,0x92,0x7F,0x91,0x42,0x1B,0xD1,0x0A,0x22, + 0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21,0xE1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E, + 0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x88, + 0xE1,0x88,0xFF,0xF7,0x95,0xFA,0xE0,0x80,0x7A,0x88,0x21,0x89,0x00,0x98,0xFF,0xF7, + 0x8F,0xFA,0x20,0x81,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD7,0xDA,0x6D,0x1C,0x30,0x78, + 0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xC0,0x01,0x00,0x20,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x9C,0xD0,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0x34,0x00,0x8D,0xE5,0x30,0x00,0x8D,0xE5, + 0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x3C,0x08,0x9F,0xE5,0xB0,0x12,0xD0,0xE1, + 0x20,0x10,0x8D,0xE5,0xB2,0x02,0xD0,0xE1,0x1C,0x00,0x8D,0xE5,0x2C,0x08,0x9F,0xE5, + 0x00,0x00,0x90,0xE5,0x8A,0x20,0xD0,0xE5,0x7C,0x10,0xD0,0xE5,0x7D,0xB0,0xD0,0xE5, + 0x18,0x20,0x8D,0xE5,0x89,0x20,0xD0,0xE5,0x14,0x20,0x8D,0xE5,0xB0,0x20,0xD0,0xE1, + 0x08,0x00,0x12,0xE3,0x23,0x00,0x00,0x0A,0x7F,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x88,0x20,0x8D,0xE5,0x80,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x84,0x20,0x8D,0xE5, + 0x81,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x80,0x20,0x8D,0xE5,0x82,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x7C,0x20,0x8D,0xE5,0x83,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x78,0x20,0x8D,0xE5,0x84,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x74,0x20,0x8D,0xE5, + 0x85,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0,0x70,0x20,0x8D,0xE5,0x86,0x20,0xD0,0xE5, + 0x91,0x02,0x02,0xE0,0x6C,0x20,0x8D,0xE5,0x87,0x20,0xD0,0xE5,0x91,0x02,0x02,0xE0, + 0x68,0x20,0x8D,0xE5,0x88,0x00,0xD0,0xE5,0x91,0x00,0x00,0xE0,0x64,0x00,0x8D,0xE5, + 0x8C,0x07,0x9F,0xE5,0x80,0x11,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x00,0x60,0xA0,0x13, + 0x03,0x00,0x00,0x1A,0xD6,0x03,0x00,0xEB,0x9C,0xD0,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x68,0xA7,0x9F,0xE5,0x06,0x50,0x8A,0xE0,0x9C,0x42,0xD5,0xE5, + 0x00,0x00,0x54,0xE3,0x0C,0x00,0x00,0x0A,0x18,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x06,0x00,0x00,0x1A,0x04,0x01,0x84,0xE0,0x80,0x00,0x8A,0xE0,0x01,0x0C,0x80,0xE2, + 0x8A,0x00,0x80,0xE2,0x55,0x03,0x00,0xEB,0x00,0x00,0x50,0xE3,0x02,0x00,0x00,0x0A, + 0xCA,0x02,0xDA,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A,0x06,0x00,0xA0,0xE1, + 0x18,0x00,0x00,0xEA,0x07,0x00,0xA0,0xE3,0x00,0x12,0x8A,0xE0,0x86,0x10,0x81,0xE0, + 0x02,0x2C,0x81,0xE2,0xB4,0x3D,0xD2,0xE1,0x03,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE2, + 0xB4,0x3E,0xC2,0xE1,0xB4,0x26,0xD1,0xE1,0xB4,0x27,0xC1,0xE1,0xF5,0xFF,0xFF,0x5A, + 0x04,0x01,0x84,0xE0,0x80,0x80,0x8A,0xE0,0x01,0x7C,0x88,0xE2,0xB6,0x08,0xD7,0xE1, + 0x20,0x10,0x9D,0xE5,0x01,0x10,0x41,0xE2,0x01,0x00,0x50,0xE1,0xB8,0x18,0xD7,0xD1, + 0x1C,0x00,0x9D,0xD5,0x01,0x00,0x40,0xD2,0x00,0x00,0x51,0xD1,0x03,0x00,0x00,0xDA, + 0x84,0x01,0xD8,0xE5,0x01,0x00,0x40,0xE2,0x98,0xFC,0xFF,0xEB,0x84,0x01,0x00,0xEA, + 0xB6,0x18,0xD7,0xE1,0x86,0x00,0x8A,0xE0,0x02,0x9C,0x80,0xE2,0x98,0x00,0x8D,0xE5, + 0xB4,0x1D,0xC9,0xE1,0xB8,0x18,0xD7,0xE1,0x03,0x4C,0x80,0xE2,0x00,0x30,0xA0,0xE3, + 0x02,0xCB,0xA0,0xE3,0xB4,0x16,0xC4,0xE1,0x03,0x10,0xA0,0xE1,0x0C,0x20,0xA0,0xE1, + 0x07,0x00,0xA0,0xE3,0x78,0xE6,0x9F,0xE5,0x00,0xE2,0x8E,0xE0,0x86,0xE0,0x8E,0xE0, + 0x94,0xE0,0x8D,0xE5,0x02,0xEC,0x8E,0xE2,0xF4,0xAD,0xDE,0xE1,0x00,0x00,0x5A,0xE3, + 0x03,0x00,0x00,0xDA,0x03,0x00,0x5A,0xE1,0xB4,0x3D,0xDE,0xC1,0x0C,0x00,0x5A,0xE1, + 0xB4,0xCD,0xDE,0xB1,0x94,0xE0,0x9D,0xE5,0x03,0xEC,0x8E,0xE2,0xF4,0xA6,0xDE,0xE1, + 0x00,0x00,0x5A,0xE3,0x03,0x00,0x00,0xDA,0x01,0x00,0x5A,0xE1,0xB4,0x16,0xDE,0xC1, + 0x02,0x00,0x5A,0xE1,0xB4,0x26,0xDE,0xB1,0x01,0x00,0x50,0xE2,0xE8,0xFF,0xFF,0x5A, + 0x0C,0x00,0x43,0xE0,0xF0,0x00,0x50,0xE3,0x02,0x30,0x41,0xD0,0xF0,0x00,0x53,0xD3, + 0x0C,0xC6,0x9F,0xC5,0x01,0x30,0xA0,0xC3,0xC8,0x32,0xCC,0xC5,0x1E,0x00,0x50,0xE3, + 0x02,0x00,0x41,0xB0,0x1E,0x00,0x50,0xB3,0xF4,0x15,0x9F,0xA5,0x00,0x00,0xA0,0xA3, + 0xF1,0x00,0xC1,0xA5,0xE8,0x05,0x9F,0xB5,0x01,0x10,0xA0,0xB3,0xF1,0x10,0xC0,0xB5, + 0xCC,0x02,0xD5,0xE5,0x01,0x00,0x50,0xE3,0x64,0xA0,0xA0,0x93,0x24,0xA0,0x8D,0x95, + 0x0E,0x00,0x00,0x9A,0xF4,0x2D,0xD9,0xE1,0xF4,0x3E,0xD9,0xE1,0x03,0x00,0x42,0xE0, + 0x00,0x00,0x50,0xE3,0x02,0x00,0x43,0xD0,0xF4,0x36,0xD4,0xE1,0xF4,0x27,0xD4,0xE1, + 0x00,0xA8,0xA0,0xE1,0x4A,0xA8,0xA0,0xE1,0x02,0x00,0x43,0xE0,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x42,0xD0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x24,0x00,0x8D,0xE5, + 0xF4,0x1E,0xD9,0xE1,0xF4,0x0D,0xD9,0xE1,0x0F,0x0F,0x00,0xEB,0x3C,0x00,0x8D,0xE5, + 0xF4,0x17,0xD4,0xE1,0xF4,0x06,0xD4,0xE1,0x0B,0x0F,0x00,0xEB,0x38,0x00,0x8D,0xE5, + 0xF4,0x1F,0xD9,0xE1,0x3C,0x00,0x9D,0xE5,0x07,0x0F,0x00,0xEB,0x44,0x00,0x8D,0xE5, + 0xF4,0x18,0xD4,0xE1,0x38,0x00,0x9D,0xE5,0x03,0x0F,0x00,0xEB,0x40,0x00,0x8D,0xE5, + 0xF4,0x21,0xD4,0xE1,0xF4,0x10,0xD4,0xE1,0x44,0x00,0x9D,0xE5,0x01,0x0F,0x00,0xEB, + 0x4C,0x00,0x8D,0xE5,0xF4,0x2A,0xD4,0xE1,0xF4,0x19,0xD4,0xE1,0x40,0x00,0x9D,0xE5, + 0xFC,0x0E,0x00,0xEB,0x48,0x00,0x8D,0xE5,0xF4,0x23,0xD4,0xE1,0xF4,0x12,0xD4,0xE1, + 0x4C,0x00,0x9D,0xE5,0xF7,0x0E,0x00,0xEB,0x54,0x00,0x8D,0xE5,0xF4,0x2C,0xD4,0xE1, + 0xF4,0x1B,0xD4,0xE1,0x48,0x00,0x9D,0xE5,0xF2,0x0E,0x00,0xEB,0x50,0x00,0x8D,0xE5, + 0xF4,0x25,0xD4,0xE1,0xF4,0x14,0xD4,0xE1,0x54,0x00,0x9D,0xE5,0xED,0x0E,0x00,0xEB, + 0x5C,0x00,0x8D,0xE5,0xF4,0x2E,0xD4,0xE1,0xF4,0x1D,0xD4,0xE1,0x50,0x00,0x9D,0xE5, + 0xE8,0x0E,0x00,0xEB,0x58,0x00,0x8D,0xE5,0x24,0x10,0x9D,0xE5,0x0A,0x00,0xA0,0xE1, + 0x23,0x04,0x00,0xEB,0xC8,0x34,0x9F,0xE5,0x04,0x10,0xA0,0xE3,0x01,0x22,0x83,0xE0, + 0x86,0x20,0x82,0xE0,0x01,0x2B,0x82,0xE2,0xB4,0xC1,0xD2,0xE1,0x01,0x10,0x51,0xE2, + 0xB4,0xC2,0xC2,0xE1,0xF8,0xFF,0xFF,0x5A,0x98,0x10,0x9D,0xE5,0x01,0x1B,0x81,0xE2, + 0xB4,0x01,0xC1,0xE1,0x0C,0x14,0xD5,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x20,0x51,0xE2, + 0x06,0x00,0x00,0xBA,0x01,0xC2,0x83,0xE0,0x86,0xC0,0x8C,0xE0,0x01,0xCB,0x8C,0xE2, + 0xF4,0xC1,0xDC,0xE1,0x01,0x10,0x51,0xE2,0x0C,0x00,0x80,0xE0,0xF8,0xFF,0xFF,0x5A, + 0x01,0x10,0x82,0xE2,0xD7,0xF3,0xFF,0xEB,0x84,0x10,0x9D,0xE5,0x00,0xA0,0xA0,0xE1, + 0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0xD3,0x0B,0x00,0x00,0xDA,0x7C,0x00,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x02,0x00,0xA0,0xD3,0x07,0x00,0x00,0xDA,0x74,0x00,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x03,0x00,0xA0,0xD3,0x03,0x00,0x00,0xDA,0x6C,0x00,0x9D,0xE5, + 0x00,0x00,0x5A,0xE1,0x05,0x00,0xA0,0xC3,0x04,0x00,0xA0,0xD3,0x04,0x14,0xD5,0xE5, + 0x01,0x10,0x40,0xE0,0x00,0x00,0x51,0xE3,0x00,0x00,0x6B,0xE2,0x06,0x00,0x00,0xDA, + 0xF4,0x1F,0xD4,0xE1,0x0B,0x00,0x51,0xE1,0x01,0x00,0x00,0x1A,0x00,0x10,0xA0,0xE3, + 0x06,0x00,0x00,0xEA,0x01,0x10,0x81,0xE2,0x04,0x00,0x00,0xEA,0xF4,0x1F,0xD4,0xE1, + 0x04,0x00,0x00,0xAA,0x00,0x00,0x51,0xE1,0xF7,0xFF,0xFF,0x0A,0x01,0x10,0x41,0xE2, + 0xB4,0x1F,0xC4,0xE1,0x02,0x00,0x00,0xEA,0x00,0x00,0x51,0xE3,0xFA,0xFF,0xFF,0xCA, + 0xF3,0xFF,0xFF,0xBA,0xF4,0x3F,0xD4,0xE1,0x0B,0x00,0x53,0xE1,0x03,0x00,0x00,0x1A, + 0x04,0x14,0xD5,0xE5,0x05,0x00,0x51,0xE3,0x01,0x00,0x81,0x32,0x05,0x00,0x00,0x3A, + 0x00,0x00,0x53,0xE1,0x04,0x00,0x00,0x1A,0x04,0x04,0xD5,0xE5,0x01,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x9A,0x01,0x00,0x40,0xE2,0x04,0x04,0xC5,0xE5,0x58,0x30,0x8D,0xE2, + 0x09,0x00,0x93,0xE8,0x60,0x00,0x8D,0xE5,0xCC,0x02,0xD5,0xE5,0x00,0x10,0xA0,0xE1, + 0x90,0x00,0x8D,0xE5,0x8C,0x00,0x8D,0xE5,0x03,0x00,0xA0,0xE1,0x99,0xF3,0xFF,0xEB, + 0x34,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x60,0x00,0x9D,0xE5,0x8C,0x10,0x9D,0xE5, + 0x94,0xF3,0xFF,0xEB,0x30,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x04,0x04,0xD5,0xE5, + 0x01,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x5C,0x20,0x9D,0xE5,0x58,0x30,0x9D,0xE5, + 0x09,0x10,0xA0,0xE3,0x0E,0x11,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2, + 0x0C,0x00,0x8D,0xE8,0xCC,0x02,0xD5,0xE5,0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5, + 0x07,0x10,0xA0,0xE3,0x06,0x11,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1, + 0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x88,0x20,0x9D,0xE5, + 0x84,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2,0x60,0x00,0x00,0xEA,0x02,0x00,0x50,0xE3, + 0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0x90,0x00,0x9D,0xE5,0x54,0x20,0x9D,0xE5,0x50,0x30,0x9D,0xE5,0x07,0x10,0xA0,0xE3, + 0xF3,0x10,0x00,0xEB,0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8, + 0xCC,0x02,0xD5,0xE5,0x4C,0x20,0x9D,0xE5,0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3, + 0xEB,0x10,0x00,0xEB,0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1, + 0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8,0x80,0x20,0x9D,0xE5,0x7C,0x30,0x9D,0xE5, + 0x61,0x0F,0x88,0xE2,0x45,0x00,0x00,0xEA,0x03,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A, + 0x28,0x30,0x8D,0xE2,0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5, + 0x4C,0x20,0x9D,0xE5,0x48,0x30,0x9D,0xE5,0x05,0x10,0xA0,0xE3,0xD8,0x10,0x00,0xEB, + 0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xCC,0x02,0xD5,0xE5, + 0x44,0x20,0x9D,0xE5,0x40,0x30,0x9D,0xE5,0x03,0x10,0xA0,0xE3,0xD0,0x10,0x00,0xEB, + 0xF4,0x03,0xDD,0xE1,0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1, + 0x0F,0x00,0x8D,0xE8,0x78,0x20,0x9D,0xE5,0x74,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2, + 0x2A,0x00,0x00,0xEA,0x04,0x00,0x50,0xE3,0x18,0x00,0x00,0x1A,0x28,0x30,0x8D,0xE2, + 0x2C,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5,0x44,0x20,0x9D,0xE5, + 0x40,0x30,0x9D,0xE5,0x03,0x10,0xA0,0xE3,0xBD,0x10,0x00,0xEB,0x30,0x30,0x8D,0xE2, + 0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0xCC,0x02,0xD5,0xE5,0x3C,0x20,0x9D,0xE5, + 0x38,0x30,0x9D,0xE5,0x02,0x10,0xA0,0xE3,0xB5,0x10,0x00,0xEB,0xF4,0x03,0xDD,0xE1, + 0xF0,0x13,0xDD,0xE1,0xF8,0x32,0xDD,0xE1,0xFC,0x22,0xDD,0xE1,0x0F,0x00,0x8D,0xE8, + 0x70,0x20,0x9D,0xE5,0x6C,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2,0x0F,0x00,0x00,0xEA, + 0x30,0x30,0x8D,0xE2,0x34,0x20,0x8D,0xE2,0x0C,0x00,0x8D,0xE8,0x90,0x00,0x9D,0xE5, + 0x3C,0x20,0x9D,0xE5,0x38,0x30,0x9D,0xE5,0x02,0x10,0xA0,0xE3,0xA4,0x10,0x00,0xEB, + 0xF4,0x0D,0xD9,0xE1,0xF4,0x16,0xD4,0xE1,0xF0,0x33,0xDD,0xE1,0xF4,0x23,0xDD,0xE1, + 0x0F,0x00,0x8D,0xE8,0x68,0x20,0x9D,0xE5,0x64,0x30,0x9D,0xE5,0x61,0x0F,0x88,0xE2, + 0x0A,0x10,0xA0,0xE1,0xAC,0x10,0x00,0xEB,0xCC,0x02,0xD5,0xE5,0x50,0x11,0x9F,0xE5, + 0x09,0x00,0x50,0xE3,0x01,0x00,0x80,0x32,0xCC,0x02,0xC5,0x35,0x0C,0x04,0xD5,0xE5, + 0x05,0x00,0x50,0xE3,0x01,0x00,0x80,0x32,0x0C,0x04,0xC5,0x35,0x84,0x01,0xD8,0xE5, + 0x01,0x00,0x40,0xE2,0x00,0x01,0x81,0xE0,0x01,0x4B,0x80,0xE2,0xF4,0x07,0xD4,0xE1, + 0x01,0x00,0x70,0xE3,0xF6,0x17,0xD4,0xC1,0x01,0x00,0x71,0xC3,0x18,0x00,0x00,0xDA, + 0x14,0x10,0x9D,0xE5,0x64,0x50,0x61,0xE2,0x95,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3, + 0xFC,0xF2,0xFF,0xEB,0x00,0x80,0xA0,0xE1,0xB6,0x08,0xD7,0xE1,0x14,0x10,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x8E,0xF3,0xFF,0xEB,0x08,0x00,0x80,0xE0, + 0xB6,0x08,0xC7,0xE1,0xF6,0x07,0xD4,0xE1,0x64,0x10,0xA0,0xE3,0x95,0x00,0x00,0xE0, + 0xF0,0xF2,0xFF,0xEB,0x00,0x50,0xA0,0xE1,0xB8,0x08,0xD7,0xE1,0x14,0x10,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x82,0xF3,0xFF,0xEB,0x05,0x00,0x80,0xE0, + 0xB8,0x08,0xC7,0xE1,0xB6,0x08,0xD7,0xE1,0xB4,0x07,0xC4,0xE1,0xB8,0x08,0xD7,0xE1, + 0xB6,0x07,0xC4,0xE1,0x01,0x60,0x86,0xE2,0x08,0x00,0x56,0xE3,0x48,0xFE,0xFF,0xBA, + 0x8C,0x30,0x9F,0xE5,0x80,0x21,0xD3,0xE5,0x00,0x00,0x83,0xE2,0x01,0x1C,0x80,0xE2, + 0x01,0x00,0x52,0xE3,0x02,0x0C,0x80,0xE2,0x10,0x00,0x00,0x1A,0x8E,0x21,0xD3,0xE5, + 0x82,0x30,0x83,0xE0,0x02,0x2C,0x83,0xE2,0xB2,0xCD,0xD2,0xE1,0x03,0x3C,0x83,0xE2, + 0xBC,0xCB,0xC0,0xE1,0xB2,0xC6,0xD3,0xE1,0xBE,0xCB,0xC0,0xE1,0xB2,0x2E,0xD2,0xE1, + 0xB0,0x2C,0xC0,0xE1,0xB2,0x27,0xD3,0xE1,0xB2,0x2C,0xC0,0xE1,0xB0,0x29,0xD1,0xE1, + 0xB4,0x2B,0xC0,0xE1,0xB2,0x19,0xD1,0xE1,0xB6,0x1B,0xC0,0xE1,0x2D,0xFE,0xFF,0xEA, + 0x02,0x00,0x52,0xE3,0x2B,0xFE,0xFF,0x1A,0xB0,0x29,0xD1,0xE1,0xB4,0x2B,0xC0,0xE1, + 0xB2,0x29,0xD1,0xE1,0xB6,0x2B,0xC0,0xE1,0xBA,0x29,0xD1,0xE1,0xB8,0x2B,0xC0,0xE1, + 0xBC,0x19,0xD1,0xE1,0xBA,0x1B,0xC0,0xE1,0x22,0xFE,0xFF,0xEA,0x00,0x93,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x1E,0x4B,0x1C,0x4A,0x1B,0x7D, + 0x12,0x88,0xDB,0x07,0x32,0xD0,0x1C,0x4B,0x1C,0x88,0x1C,0x4B,0x1B,0x7D,0x9E,0x46, + 0x1B,0x4B,0x1E,0x78,0x17,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D, + 0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45, + 0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0, + 0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7, + 0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42, + 0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7, + 0xA8,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0xA6,0x05,0x00,0x20,0x00,0x05,0x00,0x20, + 0x99,0x05,0x00,0x20,0x0E,0x23,0x58,0x43,0x02,0x4A,0x40,0x18,0x40,0x00,0x10,0x5A, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x70,0xB5,0x2E,0x49,0x00,0x20,0x4A,0x78, + 0x2D,0x49,0x00,0x2A,0x15,0xD1,0x0A,0x89,0x00,0x2A,0x0F,0xD0,0x2B,0x49,0x8A,0x42, + 0x0C,0xD0,0x10,0x00,0x32,0x21,0x48,0x43,0x64,0x21,0xFC,0xF7,0x43,0xFE,0xFF,0x30, + 0x4B,0x21,0x7D,0x30,0xC9,0x00,0x88,0x42,0x00,0xD9,0x08,0x00,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x88,0x89,0x01,0x21,0x49,0x07,0x89,0x68,0x21,0x4C,0x89,0x00,0x0A,0x0F, + 0x1D,0x49,0x89,0x89,0xFF,0x39,0xE2,0x39,0x01,0x2A,0x16,0xD1,0x1D,0x4A,0x1E,0x4D, + 0x91,0x42,0x07,0xD8,0x29,0x1A,0x08,0x00,0x48,0x43,0x51,0x1C,0xFC,0xF7,0x22,0xFE, + 0x28,0x1A,0x06,0xE0,0xA8,0x42,0x04,0xD9,0x17,0x49,0x49,0x42,0x40,0x18,0x80,0x08, + 0x40,0x19,0xA0,0x42,0xDA,0xD9,0x0D,0x21,0x18,0xE0,0x02,0x2A,0xD6,0xD1,0x12,0x4A, + 0x11,0x4D,0xE7,0x3A,0xFA,0x35,0x91,0x42,0x07,0xD8,0x29,0x1A,0x08,0x00,0x48,0x43, + 0x51,0x1C,0xFC,0xF7,0x07,0xFE,0x28,0x1A,0x05,0xE0,0xA8,0x42,0x03,0xD9,0x0B,0x49, + 0x40,0x18,0x80,0x08,0x40,0x19,0xA0,0x42,0xC0,0xD9,0x11,0x21,0xFC,0xF7,0xFA,0xFD, + 0x60,0x1A,0xBB,0xE7,0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x10,0x27,0x00,0x00,0xC9,0x03,0x00,0x00,0xAA,0x05,0x00,0x00,0x5C,0xF9,0xFF,0xFF, + 0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06, + 0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D,0x00,0x24,0x01,0x21, + 0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68,0x6A,0x60,0x05,0xE0, + 0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18,0x02,0x00,0x40,0x1E, + 0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0, + 0x67,0xFA,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06,0xFC,0xD4,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0x04,0x0D,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0xFB,0x0C,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29,0x80,0x7D,0x01,0xD1,0x01,0x25,0x03,0xE0, + 0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x05,0x27, + 0x3F,0x02,0x3B,0xE0,0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x00,0x1D, + 0xFC,0xF7,0x54,0xFD,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00, + 0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19,0x36,0x79,0x9E,0x42,0x01,0xD1,0x04,0x00, + 0x02,0xE0,0x40,0x1C,0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18, + 0xF6,0x19,0x36,0x79,0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x71,0xED,0xE7, + 0x40,0x1C,0x08,0x28,0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18, + 0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00, + 0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x79,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23, + 0xE4,0x19,0x23,0x71,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x02,0xE0,0x40,0x1C,0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20, + 0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0x40,0x05,0x00,0x20, + 0x40,0x00,0x00,0x20,0x03,0x22,0x12,0x07,0xD3,0x68,0x01,0x21,0x81,0x40,0x0B,0x43, + 0xD3,0x60,0x50,0x68,0x08,0x42,0x01,0xD0,0x01,0x48,0x01,0x63,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x30,0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43, + 0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C, + 0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60, + 0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50, + 0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47,0x70,0x06,0x00,0x20,0xF0,0xB5,0x87,0xB0, + 0xFE,0xF7,0x8C,0xFB,0xFE,0xF7,0x6A,0xFB,0x01,0xF0,0xE8,0xFF,0x02,0xF0,0xAE,0xFF, + 0x00,0xF0,0x9C,0xFE,0x00,0xF0,0xE8,0xFB,0xFD,0xF7,0xC0,0xFF,0xFD,0xF7,0xC8,0xF8, + 0x3B,0x48,0x00,0x68,0x80,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x9C,0xF9, + 0xFF,0xF7,0x4C,0xF9,0x03,0xE0,0xFF,0xF7,0x49,0xF9,0xFF,0xF7,0x95,0xF9,0x01,0x25, + 0x6D,0x07,0x68,0x68,0x6B,0x46,0x03,0x90,0x00,0x20,0xD8,0x73,0x03,0x98,0x68,0x60, + 0x03,0xF0,0x22,0xFB,0x03,0xF0,0x64,0xF9,0x28,0x68,0x00,0x28,0x07,0xD0,0x68,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x2F,0x68,0x02,0x24,0x7F,0x1C,0x37,0xE0,0x01,0x24, + 0x27,0x00,0xA0,0x00,0x40,0x19,0x06,0x90,0x06,0x68,0xB0,0x01,0x80,0x0D,0x05,0x90, + 0xB0,0x05,0x80,0x0D,0x04,0x90,0x23,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x04,0xA9, + 0x05,0xA8,0x03,0xF0,0x8B,0xF9,0x20,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x04,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x05,0xA8,0x04,0xF0,0x8B,0xFA,0x04,0xA9,0x05,0xA8,0x04,0xF0,0x9C,0xF8, + 0x16,0x48,0x04,0x99,0x06,0x40,0x05,0x98,0x89,0x05,0x80,0x05,0x80,0x09,0x06,0x43, + 0xB0,0x0A,0x80,0x02,0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xBC,0x42, + 0xC7,0xD9,0xFD,0xF7,0x09,0xFE,0x03,0xF0,0xEB,0xF8,0x01,0x24,0x28,0x68,0xFC,0xF7, + 0x71,0xFD,0x64,0x1E,0xFA,0xD2,0xFF,0xF7,0xC9,0xFE,0xFC,0xF7,0x9F,0xFC,0x04,0xF0, + 0x2F,0xF9,0x07,0x48,0x40,0x79,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x06,0x00,0x20,0xA0,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0xFF,0xFF,0x00,0xFC, + 0x40,0x00,0x00,0x20,0xF8,0xB5,0x02,0xF0,0x05,0xFF,0x03,0xF0,0xB5,0xFF,0x2C,0x48, + 0x2C,0x4D,0x00,0x7C,0x41,0x1E,0xFF,0x29,0x00,0xD3,0x00,0x20,0xFE,0xF7,0x78,0xF9, + 0x28,0x73,0x29,0x48,0x01,0x69,0xFF,0x22,0x12,0x02,0x91,0x43,0x01,0x61,0x01,0x69, + 0x2A,0x7B,0x12,0x02,0x11,0x43,0x01,0x61,0xFE,0xF7,0x7A,0xFD,0xFE,0xF7,0xF6,0xFD, + 0xFE,0xF7,0xFC,0xFD,0x1E,0x48,0xE9,0x7D,0x60,0x38,0xC0,0x7F,0x00,0x29,0x03,0xD0, + 0x03,0x21,0xFC,0xF7,0xD7,0xFB,0xFF,0xE7,0x03,0xF0,0xC2,0xFF,0x1B,0x4F,0xFC,0x03, + 0x00,0x20,0x28,0x70,0xE8,0x62,0x28,0x7C,0x00,0x28,0x1D,0xD0,0x01,0x26,0x18,0xE0, + 0x78,0x68,0x00,0x07,0x15,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x09,0xD1,0x78,0x68, + 0x80,0x07,0xFC,0xD5,0x03,0xF0,0x64,0xF8,0xFF,0xF7,0x5C,0xF8,0xFF,0x20,0xE0,0x63, + 0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0, + 0x57,0xF8,0xE0,0x6B,0x0B,0x28,0xE3,0xD1,0xFE,0xF7,0x68,0xF9,0x28,0x78,0x00,0x28, + 0xD6,0xD0,0x02,0xF0,0xD7,0xFB,0xD3,0xE7,0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7, + 0x60,0x93,0x00,0x00,0x8C,0x05,0x00,0x20,0x00,0x90,0x00,0x40,0x00,0x40,0x00,0x30, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x70,0xB5,0x06,0x00,0x23,0x48,0x24,0x4A, + 0x00,0x68,0x12,0x88,0x60,0x30,0x01,0x7E,0xC0,0x7D,0x34,0x78,0x89,0x18,0x0D,0x06, + 0x20,0x49,0x2D,0x0E,0x09,0x78,0x00,0x29,0x05,0xD1,0x1F,0x49,0xFF,0x22,0x09,0x68, + 0x2D,0x32,0x91,0x42,0x01,0xD9,0x03,0x25,0x04,0xE0,0x1C,0x49,0x09,0x78,0x01,0x29, + 0x00,0xD1,0x02,0x25,0x1A,0x49,0x8A,0x7C,0x00,0x2A,0x0D,0xD1,0xC9,0x7C,0x01,0x29, + 0x01,0xD1,0x40,0x1C,0x06,0xE0,0x02,0x29,0x01,0xD1,0x80,0x1C,0x02,0xE0,0x03,0x29, + 0x02,0xD1,0xC0,0x1C,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3, + 0x14,0x21,0x20,0x00,0xFC,0xF7,0x5E,0xFB,0x6D,0x1C,0xA8,0x42,0x05,0xD2,0x14,0x2C, + 0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20, + 0x00,0xE0,0x13,0x20,0x30,0x70,0x01,0x20,0xF4,0xE7,0x00,0x00,0xF0,0x06,0x00,0x20, + 0x80,0x05,0x00,0x20,0xA3,0x05,0x00,0x20,0xD0,0x05,0x00,0x20,0x95,0x05,0x00,0x20, + 0xE0,0x02,0x00,0x20,0x10,0xB5,0x08,0x24,0x20,0x00,0xFE,0xF7,0xF1,0xF9,0x64,0x1E, + 0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1, + 0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x93,0x00,0x00,0x10,0xB5,0x07,0x4C, + 0x07,0x48,0x22,0x00,0x00,0x21,0xFC,0xF7,0x49,0xFB,0x06,0x48,0x22,0x00,0x00,0x21, + 0xFC,0xF7,0x44,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x00,0x00,0x00,0x10,0xF6,0x06,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21, + 0x20,0x00,0xFC,0xF7,0x33,0xFB,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0xFC,0xF7,0x50,0xFB, + 0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19, + 0x0E,0x48,0x00,0x19,0xFC,0xF7,0x4A,0xFB,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48, + 0xA2,0x00,0xFC,0xF7,0x31,0xFB,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21, + 0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0xFC,0xF7,0x08,0xFB,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x88,0x00,0x00,0x40,0x00,0x00,0x20, + 0x28,0x0A,0x00,0x00,0x40,0x00,0x00,0x20,0x33,0x21,0x09,0x05,0x01,0x20,0x80,0x07, + 0x41,0x62,0x04,0x49,0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61, + 0x70,0x47,0x00,0x00,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x00,0x40,0xA0,0xE3,0x04,0x00,0xA0,0xE1, + 0xEE,0xF8,0xFF,0xEB,0x01,0x40,0x84,0xE2,0x08,0x00,0x54,0xE3,0xFA,0xFF,0xFF,0xBA, + 0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00, + 0xFC,0xF7,0x9C,0xFE,0xFE,0xF7,0x7E,0xFC,0xFE,0xF7,0x58,0xFC,0xFE,0xF7,0x82,0xFC, + 0xFE,0xF7,0x78,0xFC,0xFE,0xF7,0x4A,0xFC,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43, + 0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFC,0xF7, + 0x7D,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x93,0x00,0x00, + 0x10,0xB5,0x02,0xF0,0x71,0xFD,0x02,0xF0,0x63,0xFD,0x02,0xF0,0x59,0xFD,0xFF,0x20, + 0xFC,0xF7,0xAC,0xFE,0xFF,0xF7,0xA0,0xFF,0x13,0x48,0x80,0x22,0x00,0x21,0xFC,0xF7, + 0xB3,0xFA,0x08,0x20,0xFC,0xF7,0x6A,0xFE,0x00,0x22,0x10,0x49,0xD2,0x43,0x00,0x20, + 0xFF,0xF7,0xB8,0xFD,0x00,0xF0,0x20,0xF8,0x0D,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0, + 0x40,0x20,0xFC,0xF7,0x5B,0xFE,0x00,0xF0,0x53,0xF8,0x00,0xF0,0x3D,0xF8,0x10,0x20, + 0x02,0xF0,0x43,0xFD,0x07,0x49,0xC8,0x69,0xCA,0x13,0x90,0x43,0xC8,0x61,0xFE,0xF7, + 0xAF,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x70,0x06,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x93,0x00,0x00,0x00,0x70,0x00,0x40,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25, + 0x30,0x00,0xFC,0xF7,0x3B,0xFE,0x20,0x02,0xFC,0xF7,0x62,0xFE,0x0C,0x48,0x0A,0x21, + 0x00,0x6B,0xFC,0xF7,0x37,0xFA,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23, + 0x00,0x95,0x03,0xF0,0xC5,0xFE,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94, + 0x03,0xF0,0xBE,0xFE,0x30,0x00,0xFC,0xF7,0x19,0xFE,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x93,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7, + 0x7B,0xFD,0x04,0xF0,0x65,0xF8,0x7D,0x20,0xC0,0x00,0x04,0xF0,0x5B,0xF8,0x00,0x20, + 0xFF,0xF7,0x58,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x49,0x85,0x00,0x00, + 0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21, + 0xC9,0x00,0xFC,0xF7,0xFF,0xF9,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0xA0,0x66, + 0x04,0xF0,0x16,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00, + 0x07,0xA5,0x07,0x00,0x8C,0x05,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xBF,0xFE,0x11,0x48, + 0x00,0x7A,0x03,0xF0,0xB9,0xFD,0xFF,0xF7,0x2B,0xFF,0x0E,0x48,0x0E,0x4A,0xA0,0x30, + 0x41,0x89,0xD1,0x83,0x0D,0x49,0x0E,0x4A,0x09,0x68,0x40,0x31,0x49,0x7D,0x51,0x76, + 0x01,0x00,0x20,0x39,0x0A,0x8B,0x0A,0x49,0x80,0x31,0x8A,0x63,0x00,0x88,0xC8,0x63, + 0xFF,0xF7,0x90,0xFE,0xFE,0xF7,0xAE,0xFA,0x06,0x49,0x00,0x20,0x08,0x70,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x93,0x00,0x00,0x40,0x00,0x00,0x20,0xF0,0x06,0x00,0x20, + 0xC0,0x04,0x00,0x20,0x8D,0x05,0x00,0x20,0xF7,0xB5,0x2C,0x48,0x86,0xB0,0x04,0x90, + 0x00,0x20,0x2B,0x4E,0x07,0x00,0x02,0x90,0x03,0x90,0x05,0x90,0xFE,0xF7,0x60,0xFB, + 0xFE,0xF7,0xCC,0xFB,0x27,0x48,0x40,0x7F,0x01,0x90,0x26,0x48,0x20,0x38,0x40,0x7F, + 0x00,0x25,0x00,0x90,0x00,0x24,0x21,0x00,0x28,0x00,0xFF,0xF7,0xFD,0xFA,0x00,0x28, + 0x1B,0xD0,0x0E,0x21,0x69,0x43,0x04,0x9A,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98, + 0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42, + 0x03,0xDD,0x06,0x00,0x2F,0x00,0x02,0x94,0x03,0x91,0x64,0x1C,0x0E,0x2C,0xDA,0xD3, + 0x6D,0x1C,0x16,0x2D,0xD6,0xD3,0x03,0x99,0x08,0x98,0x01,0x60,0x0E,0x48,0x00,0x69, + 0xC0,0x07,0x05,0xD0,0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x04,0xE0, + 0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x05,0x98,0x00,0x28,0x00,0xD0, + 0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD4,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0x20,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46, + 0xF8,0xC0,0x9F,0xE5,0x00,0x00,0x9C,0xE5,0xF4,0x30,0x9F,0xE5,0xA6,0x04,0xD3,0xE5, + 0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xA7,0x14,0xD3,0x15,0x00,0x00,0xA0,0x13, + 0x00,0x00,0x51,0x13,0x1E,0xFF,0x2F,0x91,0xF0,0x03,0x2D,0xE9,0xD4,0x50,0x9F,0xE5, + 0xD4,0x60,0x9F,0xE5,0xD4,0x40,0x9F,0xE5,0xB7,0x70,0xA0,0xE3,0xEE,0x8E,0xA0,0xE3, + 0x0B,0x7C,0x87,0xE2,0x02,0x8A,0x88,0xE2,0xA6,0x24,0xD3,0xE5,0x00,0x10,0x83,0xE0, + 0xD5,0x14,0xD1,0xE5,0x02,0x00,0x12,0xE3,0xD4,0x24,0xD3,0xE5,0x82,0x21,0x62,0x00, + 0x82,0x10,0x81,0x00,0x81,0x11,0x61,0x10,0x81,0x10,0x82,0x10,0x00,0x20,0xD5,0xE5, + 0x00,0x00,0x52,0xE3,0x04,0x00,0x00,0x1A,0x01,0x11,0x9C,0xE7,0x80,0x20,0x83,0xE0, + 0x02,0x19,0xC1,0xE3,0xB0,0x11,0xC2,0xE1,0x03,0x00,0x00,0xEA,0x81,0x10,0x86,0xE0, + 0xB0,0x10,0xD1,0xE1,0x80,0x20,0x83,0xE0,0xB0,0x11,0xC2,0xE1,0x80,0x10,0x83,0xE0, + 0xB0,0x21,0xD1,0xE1,0x23,0x9C,0x42,0xE2,0x29,0x90,0x49,0xE2,0x07,0x00,0x59,0xE1, + 0x04,0x00,0x00,0x2A,0x02,0x21,0x82,0xE0,0x02,0x22,0xA0,0xE1,0x94,0x92,0x82,0xE0, + 0xA2,0x22,0xA0,0xE1,0xB0,0x21,0xC1,0xE1,0xB0,0x21,0xD1,0xE1,0x08,0x00,0x52,0xE1, + 0x04,0x00,0x00,0x3A,0x46,0x90,0xA0,0xE3,0x99,0x02,0x02,0xE0,0x94,0x92,0x82,0xE0, + 0xA2,0x22,0xA0,0xE1,0xB0,0x21,0xC1,0xE1,0xA7,0x14,0xD3,0xE5,0x01,0x00,0x80,0xE2, + 0x00,0x00,0x51,0xE1,0xD3,0xFF,0xFF,0x8A,0xF0,0x03,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20,0x8C,0x05,0x00,0x20,0xF6,0x06,0x00,0x20, + 0x1F,0x85,0xEB,0x51,0x02,0x49,0x30,0x20,0xC8,0x74,0x48,0x71,0x70,0x47,0x00,0x00, + 0x98,0x09,0x10,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x22,0x03,0xE0,0x03,0x78,0x40,0x1C,0x9A,0x18,0x49,0x1E,0x00,0x29,0xF9,0xDC, + 0x10,0x06,0x00,0x0E,0x70,0x47,0x00,0x00,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x85,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0xF8,0x01,0x8D,0xE5,0x24,0x05,0x9F,0xE5, + 0x6C,0x60,0x8D,0xE2,0xBE,0x03,0x90,0xE8,0xBE,0x03,0x86,0xE8,0x18,0x05,0x9F,0xE5, + 0x69,0x20,0xA0,0xE3,0x00,0x00,0x90,0xE5,0x01,0x2C,0x82,0xE2,0xBC,0x45,0xD0,0xE1, + 0x62,0x50,0xD0,0xE5,0x04,0x05,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0x32,0x40,0xA0,0x13,0x8C,0x00,0x8D,0xE2,0x55,0xF0,0xFF,0xEB, + 0xEC,0x04,0x9F,0xE5,0x08,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x51,0xF0,0xFF,0xEB, + 0xE0,0x04,0x9F,0xE5,0x10,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x4D,0xF0,0xFF,0xEB, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x48,0x00,0x8D,0xE2,0x49,0xF0,0xFF,0xEB, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x24,0x00,0x8D,0xE2,0x45,0xF0,0xFF,0xEB, + 0x24,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x0D,0x00,0xA0,0xE1,0x41,0xF0,0xFF,0xEB, + 0xA4,0x14,0x9F,0xE5,0x04,0x00,0xD1,0xE5,0x00,0x00,0x50,0xE3,0x85,0xDF,0x8D,0x02, + 0xF0,0x4F,0xBD,0x08,0x1E,0xFF,0x2F,0x01,0xB6,0x00,0xD1,0xE1,0x20,0x00,0x10,0xE3, + 0x05,0x00,0x44,0x10,0x00,0x48,0xA0,0x11,0xB8,0x00,0xD1,0xE1,0x24,0x48,0xA0,0x11, + 0x78,0x24,0x9F,0xE5,0x94,0x00,0x00,0xE0,0x92,0x30,0xC0,0xE0,0xC0,0x22,0xA0,0xE1, + 0xC0,0x0F,0x42,0xE0,0x68,0x24,0x9F,0xE5,0x00,0x40,0xA0,0xE3,0x10,0x22,0x8D,0xE5, + 0xBE,0x20,0xD1,0xE1,0x02,0x00,0x80,0xE0,0x10,0x22,0x9D,0xE5,0xBE,0x07,0xC2,0xE1, + 0x04,0x00,0xA0,0xE1,0x04,0x42,0x8D,0xE5,0x80,0x01,0x60,0xE0,0x00,0x70,0xA0,0xE3, + 0x0C,0x02,0x8D,0xE5,0x0C,0x12,0x9D,0xE5,0x00,0x00,0xA0,0xE3,0x81,0x20,0x87,0xE0, + 0x30,0x14,0x9F,0xE5,0x82,0xC0,0x81,0xE0,0x10,0x12,0x9D,0xE5,0xF0,0x30,0xDC,0xE1, + 0xFE,0x17,0xD1,0xE1,0x01,0x00,0x53,0xE1,0x01,0x00,0x43,0xC0,0x00,0x08,0xA0,0xC1, + 0x40,0x08,0xA0,0xC1,0x00,0x00,0x57,0xE3,0x06,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3, + 0x83,0x00,0x00,0x0A,0x8C,0x00,0x8D,0xE2,0x02,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3, + 0x7F,0x00,0x00,0x1A,0x0C,0x00,0x00,0xEA,0xF2,0x30,0x5C,0xE1,0x01,0x00,0x53,0xE1, + 0x03,0x00,0x00,0xDA,0x01,0x10,0x43,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xB0,0xE1, + 0x77,0x00,0x00,0x1A,0x00,0x00,0x50,0xE3,0x75,0x00,0x00,0x0A,0x8C,0x00,0x8D,0xE2, + 0x02,0x00,0xD0,0xE7,0x00,0x00,0x50,0xE3,0x71,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5, + 0x07,0x38,0xA0,0xE1,0x00,0xC8,0xA0,0xE1,0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1, + 0x44,0x48,0xA0,0xE1,0x08,0x00,0x54,0xE3,0x43,0x38,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1, + 0x04,0x10,0xA0,0xE3,0x00,0x60,0xA0,0xD3,0x00,0x32,0x8D,0xE5,0xFC,0xC1,0x8D,0xE5, + 0x03,0x00,0x00,0xDA,0x01,0x00,0x44,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1, + 0x6A,0x00,0x00,0xEA,0x04,0x0C,0xA0,0xE1,0x40,0x0C,0xA0,0xE1,0x08,0x02,0x8D,0xE5, + 0x54,0x03,0x9F,0xE5,0x84,0x00,0x80,0xE0,0x01,0xAC,0x80,0xE2,0x01,0x00,0x86,0xE2, + 0x00,0x68,0xA0,0xE1,0x46,0x68,0xA0,0xE1,0x09,0x0D,0x56,0xE3,0x00,0x80,0xA0,0xE3, + 0x53,0x00,0x00,0xCA,0x10,0x02,0x9D,0xE5,0x00,0x90,0xA0,0xE3,0xFE,0x57,0xD0,0xE1, + 0x6C,0x00,0x8D,0xE2,0x01,0x01,0x80,0xE0,0xB2,0x20,0xD0,0xE1,0xB0,0x00,0xD0,0xE1, + 0x0C,0x20,0x82,0xE0,0x02,0x28,0xA0,0xE1,0x03,0x00,0x80,0xE0,0x42,0x28,0xA0,0xE1, + 0x00,0x08,0xA0,0xE1,0x16,0x00,0x52,0xE3,0x40,0x08,0xA0,0xE1,0x15,0x00,0x00,0x2A, + 0x00,0x00,0x50,0xE3,0x13,0x00,0x00,0xBA,0x0E,0x00,0x50,0xE3,0x11,0x00,0x00,0xAA, + 0xF0,0xE2,0x9F,0xE5,0x82,0xB1,0x62,0xE0,0x8B,0xB0,0x80,0xE0,0x8B,0xE0,0x8E,0xE0, + 0xF0,0xE0,0xDE,0xE1,0x05,0x00,0x5E,0xE1,0x0A,0x00,0x00,0xDA,0x8C,0xE0,0x8D,0xE2, + 0xDB,0xB0,0x9E,0xE1,0x04,0x00,0x5B,0xE1,0x00,0x00,0x5B,0x13,0x05,0x00,0x00,0x1A, + 0xFC,0x91,0x9D,0xE5,0x09,0x00,0x52,0xE1,0x00,0x92,0x9D,0x05,0x09,0x00,0x50,0x01, + 0x01,0x80,0xA0,0x13,0x04,0x00,0x00,0xEA,0x01,0x90,0x89,0xE2,0x01,0x10,0x81,0xE2, + 0x08,0x00,0x59,0xE3,0x07,0x10,0x01,0xE2,0xD8,0xFF,0xFF,0xBA,0x8C,0x91,0x6C,0xE0, + 0x89,0x90,0x83,0xE0,0x8C,0xE0,0x8D,0xE2,0x09,0xB0,0xDE,0xE7,0x00,0x00,0x5B,0xE3, + 0x1C,0x00,0x00,0x1A,0x08,0xB2,0x9D,0xE5,0x09,0xB0,0xCE,0xE7,0x74,0xB2,0x9F,0xE5, + 0x48,0xE0,0x8D,0xE2,0x89,0x90,0x8B,0xE0,0xF0,0x90,0xD9,0xE1,0x04,0xB1,0x9E,0xE7, + 0x05,0x00,0x59,0xE1,0x05,0x50,0x49,0xC0,0x4C,0x92,0x9F,0xE5,0x05,0x58,0xA0,0xC1, + 0x83,0x30,0x89,0xE0,0xB0,0x32,0xD3,0xE1,0x00,0x50,0xA0,0xD3,0x25,0x58,0xA0,0xC1, + 0x95,0xB3,0x23,0xE0,0x04,0x31,0x8E,0xE7,0x8C,0xC0,0x89,0xE0,0xB4,0xC5,0xDC,0xE1, + 0x24,0x30,0x8D,0xE2,0x04,0xB1,0x93,0xE7,0x95,0xBC,0x2C,0xE0,0x04,0xC1,0x83,0xE7, + 0x04,0xC1,0x9D,0xE7,0x05,0xC0,0x8C,0xE0,0x04,0xC1,0x8D,0xE7,0xBE,0x36,0xDA,0xE1, + 0x01,0x30,0x83,0xE2,0xBE,0x36,0xCA,0xE1,0x00,0x00,0x58,0xE3,0x04,0x00,0x00,0x0A, + 0xFF,0x30,0x00,0xE2,0x05,0x00,0x81,0xE2,0xFF,0xC0,0x02,0xE2,0x07,0x10,0x00,0xE2, + 0xA5,0xFF,0xFF,0xEA,0x01,0x70,0x87,0xE2,0x0E,0x00,0x57,0xE3,0x68,0xFF,0xFF,0xBA, + 0xF8,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A,0x04,0x02,0x9D,0xE5, + 0x01,0x00,0x80,0xE2,0x16,0x00,0x50,0xE3,0x04,0x02,0x8D,0xE5,0x5D,0xFF,0xFF,0xBA, + 0x00,0x00,0x54,0xE3,0x49,0x00,0x00,0xDA,0xAC,0x51,0x9F,0xE5,0x00,0x30,0xA0,0xE3, + 0x48,0x60,0x8D,0xE2,0x24,0xE0,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x83,0xA0,0x85,0xE0, + 0x83,0xB1,0x63,0xE0,0x9C,0x01,0x9F,0xE5,0x8B,0xC0,0x82,0xE0,0x8C,0x70,0x80,0xE0, + 0x10,0x02,0x9D,0xE5,0xF2,0x70,0xD7,0xE1,0xFE,0x07,0xD0,0xE1,0x00,0x10,0xA0,0xE3, + 0x00,0x00,0x57,0xE1,0x00,0x00,0x47,0xC0,0x00,0x18,0xA0,0xC1,0x8C,0x70,0x8D,0xE2, + 0xDC,0x00,0x97,0xE1,0x07,0xC0,0x8C,0xE0,0x01,0x70,0xDC,0xE5,0x41,0x18,0xA0,0xC1, + 0x00,0x00,0x57,0xE3,0x14,0x00,0x00,0x1A,0x00,0x00,0x51,0xE3,0x00,0x00,0x50,0x13, + 0x11,0x00,0x00,0x0A,0x82,0x80,0x85,0xE0,0xB2,0x82,0xD8,0xE1,0x00,0x71,0x96,0xE7, + 0x91,0x78,0x27,0xE0,0x00,0x71,0x86,0xE7,0xB4,0x85,0xDA,0xE1,0x00,0x71,0x9E,0xE7, + 0x91,0x78,0x27,0xE0,0x00,0x71,0x8E,0xE7,0x00,0x81,0x9D,0xE7,0x08,0x10,0x81,0xE0, + 0x00,0x11,0x8D,0xE7,0x80,0x10,0x85,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x76,0xD1,0xE1, + 0x01,0x70,0x87,0xE2,0xBE,0x76,0xC1,0xE1,0x01,0x00,0xCC,0xE5,0x01,0x20,0x82,0xE2, + 0x0E,0x00,0x52,0xE3,0xD6,0xFF,0xFF,0xBA,0x01,0x30,0x83,0xE2,0x16,0x00,0x53,0xE3, + 0xD0,0xFF,0xFF,0xBA,0x01,0x00,0x54,0xE3,0x01,0x70,0xA0,0xE3,0x13,0x00,0x00,0xBA, + 0x0D,0x90,0xA0,0xE1,0x0E,0xA0,0xA0,0xE1,0x07,0x81,0x99,0xE7,0x07,0x01,0x96,0xE7, + 0x00,0x00,0x58,0xE3,0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0x29,0xEF,0xFF,0xEB, + 0x87,0x10,0x85,0xE0,0x01,0xBC,0x81,0xE2,0x00,0x00,0x58,0xE3,0xB6,0x04,0xCB,0xE1, + 0x07,0x01,0x9A,0xE7,0x01,0x10,0xA0,0x03,0x08,0x10,0xA0,0x11,0x21,0xEF,0xFF,0xEB, + 0x01,0x70,0x87,0xE2,0x04,0x00,0x57,0xE1,0xB6,0x05,0xCB,0xE1,0xED,0xFF,0xFF,0xDA, + 0x84,0x30,0x9F,0xE5,0x04,0x00,0xD3,0xE5,0x01,0x00,0x50,0xE3,0x85,0xDF,0x8D,0xB2, + 0xF0,0x4F,0xBD,0xB8,0x1E,0xFF,0x2F,0xB1,0x8C,0xC0,0x8D,0xE2,0x00,0x11,0x83,0xE0, + 0x01,0x2C,0x81,0xE2,0xF6,0x11,0xD2,0xE1,0xF4,0x21,0xD2,0xE1,0x81,0x11,0x61,0xE0, + 0x81,0x10,0x82,0xE0,0x01,0x10,0xDC,0xE7,0x00,0x20,0x83,0xE0,0x01,0x00,0x40,0xE2, + 0x65,0x11,0xC2,0xE5,0x81,0x10,0x83,0xE0,0x01,0x1C,0x81,0xE2,0xBE,0x16,0xD1,0xE1, + 0xFF,0x10,0x01,0xE2,0x38,0x11,0xC2,0xE5,0xBC,0x21,0xD3,0xE1,0x02,0x00,0x51,0xE1, + 0xBC,0x11,0xC3,0x81,0x01,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xAA,0x85,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x48,0x86,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xA3,0x05,0x00,0x20,0xA6,0x01,0x00,0x20,0xAE,0x01,0x00,0x20,0x40,0x00,0x00,0x20, + 0x1F,0x85,0xEB,0x51,0x40,0x01,0x00,0x20,0x00,0x00,0x00,0x10,0x78,0x47,0xC0,0x46, + 0xF0,0x4F,0x2D,0xE9,0x00,0x00,0xA0,0xE3,0x5B,0xDF,0x4D,0xE2,0x00,0x10,0xA0,0xE1, + 0x18,0x00,0x8D,0xE5,0x14,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x2E,0x20,0xA0,0xE3,0x34,0x00,0x8D,0xE2,0x06,0xEF,0xFF,0xEB,0xD8,0x9F,0x9F,0xE5, + 0x0F,0x0A,0xE0,0xE3,0x00,0x80,0xA0,0xE3,0xB8,0x00,0xC9,0xE1,0xBC,0x80,0xC9,0xE1, + 0xBA,0x8E,0xC9,0xE1,0x81,0x11,0xD9,0xE5,0xC0,0x7F,0x9F,0xE5,0x05,0x0C,0x89,0xE2, + 0x02,0x00,0x51,0xE3,0x00,0x10,0x97,0x85,0xB2,0x12,0xD1,0x81,0x0E,0x00,0x00,0x8A, + 0x05,0x00,0x00,0x1A,0x00,0x10,0x97,0xE5,0xB6,0x24,0xD0,0xE1,0xB0,0x12,0xD1,0xE1, + 0x02,0x10,0x81,0xE0,0x10,0x10,0x8D,0xE5,0x0E,0x00,0x00,0xEA,0x90,0x1F,0x9F,0xE5, + 0x00,0x10,0xD1,0xE5,0x00,0x00,0x51,0xE3,0x05,0x00,0x00,0x0A,0x84,0x1F,0x9F,0xE5, + 0xB4,0x24,0xD0,0xE1,0xBC,0x1A,0xD1,0xE1,0x02,0x10,0x81,0xE0,0x10,0x10,0x8D,0xE5, + 0x04,0x00,0x00,0xEA,0x00,0x10,0x97,0xE5,0xB4,0x24,0xD0,0xE1,0xBE,0x11,0xD1,0xE1, + 0x02,0x10,0x81,0xE0,0x10,0x10,0x8D,0xE5,0x5C,0x1F,0x9F,0xE5,0x68,0x11,0x8D,0xE5, + 0xB4,0x24,0xD1,0xE1,0x10,0x10,0x9D,0xE5,0xB8,0x04,0xD0,0xE1,0x02,0x10,0x81,0xE0, + 0x00,0x20,0x97,0xE5,0xA6,0xC4,0xD9,0xE5,0xBA,0x34,0xD2,0xE1,0xFE,0x60,0xD9,0xE1, + 0x03,0x00,0x80,0xE0,0x01,0x00,0x50,0xE1,0x01,0x30,0xA0,0xE1,0x01,0x00,0x1C,0xE3, + 0x00,0x10,0xA0,0x31,0x03,0x00,0x00,0x0A,0x02,0x00,0x1C,0xE3,0x02,0xC0,0xA0,0x03, + 0x01,0xC0,0xA0,0x13,0x08,0xC0,0x8D,0xE5,0x10,0x4F,0x9F,0xE5,0x10,0xAF,0x9F,0xE5, + 0x64,0x41,0x8D,0xE5,0xB4,0x89,0xC4,0xE1,0xBA,0xC0,0xD9,0xE1,0x4E,0x40,0xD2,0xE5, + 0x01,0x18,0xA0,0xE1,0x00,0x08,0xA0,0xE1,0x94,0x0C,0x0C,0xE0,0x9A,0x4C,0x8C,0xE0, + 0x64,0x41,0x9D,0xE5,0x8C,0xC5,0xA0,0xE1,0x4C,0xC8,0xA0,0xE1,0xB6,0xC9,0xC4,0xE1, + 0xBC,0x44,0xD2,0xE1,0x41,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x04,0x00,0x5C,0xE1, + 0xBC,0xC4,0xD2,0xB1,0x64,0x21,0x9D,0xB5,0x00,0x50,0xA0,0xE3,0xB6,0xC9,0xC2,0xB1, + 0xC0,0x2E,0x9F,0xE5,0x00,0x80,0x82,0xE5,0xBC,0x2E,0x9F,0xE5,0x00,0x80,0x82,0xE5, + 0x57,0x2F,0x8D,0xE2,0x03,0x00,0x82,0xE8,0x03,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x58,0x01,0x8D,0xE5,0x85,0x01,0x65,0xE0,0x54,0x01,0x8D,0xE5,0x78,0x0E,0x9F,0xE5, + 0x00,0x40,0xA0,0xE3,0x85,0x00,0x80,0xE0,0x50,0x01,0x8D,0xE5,0x54,0x01,0x9D,0xE5, + 0x88,0x2E,0x9F,0xE5,0x80,0x00,0x84,0xE0,0x00,0x38,0xA0,0xE1,0x64,0x11,0x9D,0xE5, + 0x43,0x38,0xA0,0xE1,0x83,0x00,0x82,0xE0,0xF0,0x00,0xD0,0xE1,0xF6,0x19,0xD1,0xE1, + 0x01,0x00,0x50,0xE1,0x04,0x00,0x00,0xDA,0x64,0x11,0x9D,0xE5,0x64,0xC1,0x9D,0xE5, + 0xB4,0x19,0xD1,0xE1,0x01,0x10,0x81,0xE2,0xB4,0x19,0xCC,0xE1,0x00,0x00,0x50,0xE3, + 0x03,0x00,0x00,0xDA,0x48,0x0E,0x9F,0xE5,0xB0,0x10,0xD0,0xE1,0x01,0x10,0x81,0xE2, + 0xB0,0x10,0xC0,0xE1,0x3C,0xBE,0x9F,0xE5,0x83,0x00,0x8B,0xE0,0xF0,0xA0,0xD0,0xE1, + 0x60,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0xE4,0x02,0x00,0xBA,0x00,0x00,0x55,0xE3, + 0x00,0x00,0xA0,0xE3,0x15,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x0E,0x00,0x43,0xE2, + 0xC0,0x11,0xD2,0xE7,0x07,0x00,0x00,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x00,0x01,0xE0, + 0x00,0x00,0x54,0xE3,0x05,0x00,0x00,0xDA,0x0F,0x10,0x43,0xE2,0xC1,0x71,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x1C,0x11,0x07,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2, + 0x0D,0x00,0x54,0xE3,0x07,0x00,0x00,0xAA,0x0D,0x10,0x43,0xE2,0xC1,0x21,0xD2,0xE7, + 0x07,0x10,0x01,0xE2,0x1C,0x11,0x02,0xE0,0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2, + 0x00,0x00,0x54,0xE3,0x07,0x00,0x00,0xDA,0x34,0x20,0x8D,0xE2,0x01,0x10,0x43,0xE2, + 0xC1,0x21,0xD2,0xE7,0x07,0x10,0x01,0xE2,0x01,0xC0,0xA0,0xE3,0x1C,0x11,0x02,0xE0, + 0x01,0x00,0x80,0xE0,0xFF,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xBF,0x02,0x00,0x1A, + 0x00,0xC0,0xA0,0xE3,0x0C,0x70,0xA0,0xE1,0x0E,0x90,0xA0,0xE3,0x00,0x00,0xA0,0xE3, + 0x07,0x80,0x85,0xE0,0x00,0x10,0x84,0xE0,0x01,0x20,0x58,0xE2,0x01,0x10,0x41,0xE2, + 0x0B,0x00,0x00,0x4A,0x16,0x00,0x52,0xE3,0x09,0x00,0x00,0xCA,0x00,0x00,0x51,0xE3, + 0x07,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3,0x0E,0x90,0xA0,0xE3,0x04,0x00,0x00,0xCA, + 0x92,0x19,0x21,0xE0,0x81,0x10,0x8B,0xE0,0xF0,0x10,0xD1,0xE1,0x0C,0x00,0x51,0xE1, + 0x01,0xC0,0xA0,0xC1,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x03,0x00,0x50,0xE3,0xEA,0xFF,0xFF,0xBA,0x01,0x00,0x87,0xE2,0x00,0x78,0xA0,0xE1, + 0x47,0x78,0xA0,0xE1,0x03,0x00,0x57,0xE3,0xE3,0xFF,0xFF,0xBA,0x0C,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x00,0x00,0x5A,0xE1,0x9C,0x02,0x00,0x1A,0xD8,0x1C,0x9F,0xE5, + 0xBC,0x10,0xD1,0xE1,0x00,0x00,0x51,0xE1,0x05,0x00,0x00,0xCA,0xC8,0x1C,0x9F,0xE5, + 0xBC,0x00,0xC1,0xE1,0x04,0x00,0xD1,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0x18,0x00,0x8D,0xE5,0x34,0x00,0x8D,0xE2,0xC3,0x11,0xD0,0xE7,0x07,0x20,0x03,0xE2, + 0x01,0xC0,0xA0,0xE3,0x1C,0x12,0x81,0xE1,0xC3,0x11,0xC0,0xE7,0x08,0x00,0x9D,0xE5, + 0x00,0x70,0xA0,0xE3,0x01,0x00,0x10,0xE3,0x05,0x00,0x00,0x0A,0x0D,0x00,0x54,0xE3, + 0x0D,0x70,0xA0,0x03,0x07,0x00,0x00,0x0A,0x0C,0x00,0x54,0xE3,0x03,0x77,0x87,0x03, + 0x04,0x00,0x00,0xEA,0x15,0x00,0x55,0xE3,0x15,0x70,0xA0,0x03,0x01,0x00,0x00,0x0A, + 0x14,0x00,0x55,0xE3,0x05,0x77,0x87,0x03,0x07,0x08,0xB0,0xE1,0x03,0x00,0x00,0x0A, + 0x5C,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x78,0x02,0x00,0xBA,0x02,0x00,0x00,0xEA, + 0x58,0x01,0x9D,0xE5,0x00,0x00,0x5A,0xE1,0x74,0x02,0x00,0xBA,0x3C,0x0C,0x9F,0xE5, + 0x00,0x30,0xA0,0xE3,0x00,0x90,0x90,0xE5,0x03,0x10,0x85,0xE0,0x02,0xB0,0x41,0xE2, + 0x03,0x11,0x83,0xE0,0x0B,0xCC,0xA0,0xE1,0xEC,0x20,0x8D,0xE2,0x4C,0xCC,0xA0,0xE1, + 0x88,0x80,0x8D,0xE2,0x00,0x00,0xA0,0xE3,0x01,0x21,0x82,0xE0,0x8C,0xC1,0x6C,0xE0, + 0x01,0x81,0x88,0xE0,0x00,0x10,0x84,0xE0,0x0B,0xAC,0xA0,0xE1,0x02,0x10,0x41,0xE2, + 0x4A,0xAC,0xA0,0xE1,0x01,0x1C,0xA0,0xE1,0x16,0x00,0x5A,0xE3,0x41,0x1C,0xA0,0xE1, + 0x03,0x00,0x00,0x2A,0x00,0x00,0x51,0xE3,0x01,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3, + 0x02,0x00,0x00,0xBA,0x00,0x10,0xA0,0xE3,0x00,0x11,0x82,0xE7,0x23,0x00,0x00,0xEA, + 0xB0,0xA0,0xD9,0xE1,0x01,0x09,0x1A,0xE3,0x8C,0xA0,0x81,0xE0,0x05,0x00,0x00,0x0A, + 0xE0,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0,0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0, + 0x00,0xA1,0x82,0xE7,0x04,0x00,0x00,0xEA,0xC0,0xEB,0x9F,0xE5,0x8A,0xA0,0x8E,0xE0, + 0xF0,0xA0,0xDA,0xE1,0x06,0xA0,0x4A,0xE0,0x00,0xA1,0x82,0xE7,0x00,0x00,0x5A,0xE3, + 0x00,0xA0,0xA0,0xB3,0x00,0xA1,0x82,0xB7,0xB0,0xA0,0xD9,0xE1,0x8C,0x10,0x81,0xE0, + 0x02,0x09,0x1A,0xE3,0x05,0x00,0x00,0x0A,0x98,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0, + 0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0,0x00,0x11,0x88,0xE7,0x04,0x00,0x00,0xEA, + 0x78,0xAB,0x9F,0xE5,0x81,0x10,0x8A,0xE0,0xF0,0x10,0xD1,0xE1,0x06,0x10,0x41,0xE0, + 0x00,0x11,0x88,0xE7,0x00,0x00,0x51,0xE3,0x00,0x10,0xA0,0xB3,0x00,0x11,0x88,0xB7, + 0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x05,0x00,0x50,0xE3, + 0xC7,0xFF,0xFF,0xBA,0x01,0x00,0x83,0xE2,0x00,0x38,0xA0,0xE1,0x43,0x38,0xA0,0xE1, + 0x05,0x00,0x53,0xE3,0xB7,0xFF,0xFF,0xBA,0x3C,0x0B,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0x1A,0x00,0x00,0x1A,0x30,0x0B,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0x16,0x00,0x00,0x0A,0x01,0x00,0x44,0xE2,0x02,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x8A,0x04,0x00,0x55,0xE3,0x05,0x00,0x55,0x13,0x10,0x1B,0x9F,0x05, + 0x01,0x00,0xA0,0x03,0x00,0x00,0xC1,0x05,0x09,0x00,0x44,0xE2,0x02,0x00,0x50,0xE3, + 0x04,0x00,0x00,0x8A,0x04,0x00,0x55,0xE3,0x05,0x00,0x55,0x13,0xF4,0x1A,0x9F,0x05, + 0x01,0x00,0xA0,0x03,0x00,0x00,0xC1,0x05,0xE4,0x0A,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0xDC,0x0A,0x9F,0x05,0x00,0x00,0xD0,0x05,0x00,0x00,0x50,0x03, + 0x0A,0x02,0x00,0x0A,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x64,0x00,0x8D,0xE2, + 0xB0,0xED,0xFF,0xEB,0xA0,0x00,0x9D,0xE5,0x80,0x1A,0x9F,0xE5,0x64,0x00,0x8D,0xE5, + 0xA4,0x00,0x9D,0xE5,0x88,0x3A,0x9F,0xE5,0x68,0x00,0x8D,0xE5,0xA8,0x00,0x9D,0xE5, + 0x00,0x00,0x54,0xE3,0x6C,0x00,0x8D,0xE5,0xB4,0x00,0x9D,0xE5,0x70,0x00,0x8D,0xE5, + 0xBC,0x00,0x9D,0xE5,0x78,0x00,0x8D,0xE5,0xC8,0x00,0x9D,0xE5,0x7C,0x00,0x8D,0xE5, + 0xCC,0x00,0x9D,0xE5,0x80,0x00,0x8D,0xE5,0xD0,0x00,0x9D,0xE5,0x84,0x00,0x8D,0xE5, + 0x00,0x10,0x91,0xE5,0xB8,0x00,0x9D,0xE5,0xBC,0x11,0xD1,0xE1,0x91,0x00,0x00,0xE0, + 0x93,0x10,0xC0,0xE0,0xC0,0x12,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x74,0x00,0x8D,0xE5, + 0x0D,0x00,0x00,0x1A,0x42,0x1F,0x8D,0xE2,0x03,0x00,0x91,0xE8,0x1C,0x21,0x9D,0xE5, + 0x02,0x10,0x81,0xE0,0x80,0x00,0x81,0xE0,0x20,0x11,0x9D,0xE5,0x02,0x00,0x80,0xE0, + 0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0, + 0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x1E,0x00,0x00,0xEA,0x41,0x1F,0x8D,0xE2, + 0x03,0x00,0x91,0xE8,0x0C,0x00,0x54,0xE3,0x0B,0x00,0x00,0x1A,0x18,0x21,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x02,0x10,0x81,0xE0,0x01,0x00,0x80,0xE0,0x1C,0x11,0x9D,0xE5, + 0x01,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0,0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x0D,0x00,0x00,0xEA,0x00,0x10,0x81,0xE0, + 0x0C,0x01,0x9D,0xE5,0x18,0x21,0x9D,0xE5,0x02,0x00,0x80,0xE0,0x01,0x00,0x80,0xE0, + 0x1C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x20,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x2C,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x30,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0, + 0x34,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0x9C,0x19,0x9F,0xE5,0x91,0x20,0xC0,0xE0, + 0xC0,0x10,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x80,0x19,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x00,0x00,0x51,0xE3,0x89,0x00,0x00,0x1A,0x3C,0x19,0x9F,0xE5,0xB6,0x10,0xD1,0xE1, + 0x40,0x00,0x11,0xE3,0x45,0x00,0x00,0x0A,0xEE,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0x64,0x19,0x9F,0xA5,0x06,0x20,0xA0,0xA3,0x00,0x20,0xC1,0xA5, + 0x20,0x00,0x00,0xAA,0x71,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0x48,0x29,0x9F,0xA5,0x05,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x1E,0x00,0x00,0xAA, + 0x7D,0x0E,0x50,0xE3,0x34,0x19,0x9F,0xA5,0x04,0x00,0xA0,0xA3,0x00,0x00,0xC1,0xA5, + 0x72,0x00,0x00,0xAA,0x77,0x1F,0xA0,0xE3,0x01,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1, + 0x18,0x29,0x9F,0xA5,0x03,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x1E,0x00,0x00,0xAA, + 0xFA,0x0F,0x50,0xE3,0x04,0x19,0x9F,0xA5,0x02,0x20,0xA0,0xA3,0x00,0x20,0xC1,0xA5, + 0x1E,0x00,0x00,0xAA,0x7D,0x0F,0x50,0xE3,0xF0,0x28,0x9F,0xA5,0x01,0x10,0xA0,0xA3, + 0x00,0x10,0xC2,0xA5,0x1E,0x00,0x00,0xAA,0xE0,0x18,0x9F,0xE5,0x00,0x10,0xD1,0xE5, + 0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x0F,0x50,0xE3,0x87,0x01,0x00,0xBA, + 0x5A,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3,0x04,0x00,0x00,0x1A,0xEE,0x10,0xA0,0xE3, + 0x02,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0x80,0x01,0x00,0xBA,0x53,0x00,0x00,0xEA, + 0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x7D,0x0F,0x50,0xE3,0x7B,0x01,0x00,0xBA, + 0x4E,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3, + 0x76,0x01,0x00,0xBA,0x49,0x00,0x00,0xEA,0x02,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x96,0x00,0x50,0xE3,0x71,0x01,0x00,0xBA,0x44,0x00,0x00,0xEA,0x01,0x00,0x51,0xE3, + 0x42,0x00,0x00,0x1A,0x4B,0x00,0x50,0xE3,0x6C,0x01,0x00,0xBA,0x3F,0x00,0x00,0xEA, + 0x71,0x1F,0xA0,0xE3,0x02,0x1B,0x81,0xE2,0x01,0x00,0x50,0xE1,0x4C,0x18,0x9F,0xA5, + 0x06,0x20,0xA0,0xA3,0x00,0x20,0xC1,0xA5,0x1B,0x00,0x00,0xAA,0xD6,0x10,0xA0,0xE3, + 0x06,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0x30,0x18,0x9F,0xA5,0x05,0x20,0xA0,0xA3, + 0x00,0x20,0xC1,0xA5,0x19,0x00,0x00,0xAA,0x6B,0x10,0xA0,0xE3,0x03,0x1C,0x81,0xE2, + 0x01,0x00,0x50,0xE1,0x14,0x28,0x9F,0xA5,0x04,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5, + 0x19,0x00,0x00,0xAA,0x7D,0x0F,0x50,0xE3,0x00,0x08,0x9F,0xA5,0x03,0x10,0xA0,0xA3, + 0x00,0x10,0xC0,0xA5,0x25,0x00,0x00,0xAA,0x4B,0x0F,0x50,0xE3,0xEC,0x27,0x9F,0xA5, + 0x02,0x10,0xA0,0xA3,0x00,0x10,0xC2,0xA5,0x19,0x00,0x00,0xAA,0xDC,0x17,0x9F,0xE5, + 0x00,0x10,0xD1,0xE5,0x06,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0x7D,0x0F,0x50,0xE3, + 0x46,0x01,0x00,0xBA,0x19,0x00,0x00,0xEA,0x05,0x00,0x51,0xE3,0x04,0x00,0x00,0x1A, + 0x5E,0x10,0xA0,0xE3,0x01,0x1C,0x81,0xE2,0x01,0x00,0x50,0xE1,0x3F,0x01,0x00,0xBA, + 0x12,0x00,0x00,0xEA,0x04,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A,0xFA,0x00,0x50,0xE3, + 0x3A,0x01,0x00,0xBA,0x0D,0x00,0x00,0xEA,0x03,0x00,0x51,0xE3,0x02,0x00,0x00,0x1A, + 0x96,0x00,0x50,0xE3,0x35,0x01,0x00,0xBA,0x08,0x00,0x00,0xEA,0x02,0x00,0x51,0xE3, + 0x02,0x00,0x00,0x1A,0x64,0x00,0x50,0xE3,0x30,0x01,0x00,0xBA,0x03,0x00,0x00,0xEA, + 0x01,0x00,0x51,0xE3,0x01,0x00,0x00,0x1A,0x32,0x00,0x50,0xE3,0x2B,0x01,0x00,0xBA, + 0x15,0x00,0x55,0xE3,0x10,0x00,0x00,0x1A,0x01,0xCA,0xA0,0xE3,0x04,0x00,0xA0,0xE3, + 0x01,0xC0,0x4C,0xE2,0xEC,0x80,0x8D,0xE2,0x00,0x11,0x88,0xE0,0x28,0x20,0x91,0xE5, + 0x01,0x00,0x40,0xE2,0x02,0x24,0x62,0xE0,0x93,0x92,0xC2,0xE0,0xC2,0x92,0xA0,0xE1, + 0xC2,0x2F,0x49,0xE0,0x0C,0x00,0x52,0xE1,0x28,0x20,0x81,0xE5,0x00,0x08,0xA0,0xE1, + 0x28,0xC0,0x81,0xA5,0x40,0x08,0xB0,0xE1,0xF2,0xFF,0xFF,0x5A,0x00,0x00,0x57,0xE3, + 0x1F,0x00,0x00,0x0A,0x08,0x00,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x04,0x00,0xA0,0xE3, + 0x0D,0x00,0x00,0x0A,0xEC,0x30,0x8D,0xE2,0x00,0x20,0xA0,0xE3,0x07,0x18,0xB0,0xE1, + 0x00,0x11,0x80,0xE0,0x01,0x21,0x83,0x17,0x01,0x11,0x83,0xE0,0x0C,0x20,0x81,0x05, + 0x01,0x00,0x40,0xE2,0x10,0x20,0x81,0x05,0x00,0x08,0xA0,0xE1,0x04,0x20,0x81,0x15, + 0x40,0x08,0xB0,0xE1,0xF4,0xFF,0xFF,0x5A,0x0D,0x00,0x00,0xEA,0xEC,0x30,0x8D,0xE2, + 0x00,0x20,0xA0,0xE3,0x07,0x18,0xB0,0xE1,0x00,0x11,0x83,0x10,0x00,0x21,0x83,0x17, + 0x14,0x20,0x81,0x15,0x02,0x00,0x00,0x1A,0x00,0x11,0x83,0xE0,0x3C,0x20,0x81,0xE5, + 0x50,0x20,0x81,0xE5,0x01,0x00,0x40,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1, + 0xF3,0xFF,0xFF,0x5A,0x64,0xA6,0x9F,0xE5,0x00,0xC0,0xA0,0xE3,0x0C,0x70,0xA0,0xE1, + 0x0E,0x90,0xA0,0xE3,0x00,0x00,0xA0,0xE3,0x07,0x80,0x85,0xE0,0x00,0x10,0x84,0xE0, + 0x01,0x20,0x58,0xE2,0x01,0x10,0x41,0xE2,0x0A,0x00,0x00,0x4A,0x16,0x00,0x52,0xE3, + 0x08,0x00,0x00,0xCA,0x00,0x00,0x51,0xE3,0x06,0x00,0x00,0xBA,0x0E,0x00,0x51,0xE3, + 0x04,0x00,0x00,0xCA,0x92,0x19,0x21,0xE0,0x81,0x10,0x8A,0xE0,0xF0,0x30,0xD1,0xE1, + 0x0C,0x00,0x53,0xE1,0x03,0xC0,0xA0,0xC1,0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x03,0x00,0x50,0xE3,0xEB,0xFF,0xFF,0xBA,0x01,0x00,0x87,0xE2, + 0x00,0x78,0xA0,0xE1,0x47,0x78,0xA0,0xE1,0x03,0x00,0x57,0xE3,0xE4,0xFF,0xFF,0xBA, + 0xC4,0x15,0x9F,0xE5,0x0C,0x08,0xA0,0xE1,0xB8,0x20,0xD1,0xE1,0x40,0x08,0xA0,0xE1, + 0x01,0x70,0xA0,0xE1,0x00,0x00,0x52,0xE1,0xB8,0x00,0xC1,0xC1,0xBA,0x20,0xD1,0xE1, + 0xEC,0x30,0x8D,0xE2,0x00,0x00,0x52,0xE1,0xBA,0x00,0xC1,0xB1,0x04,0x00,0xD1,0xE5, + 0x70,0x20,0x8D,0xE2,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0x04,0x00,0xC1,0xE5, + 0x00,0x01,0x81,0xE0,0x01,0x0C,0x80,0xE2,0xB4,0x41,0xC0,0xE1,0x04,0x00,0xD1,0xE5, + 0x00,0x01,0x81,0xE0,0x01,0x0C,0x80,0xE2,0xB6,0x51,0xC0,0xE1,0x06,0x00,0x92,0xE8, + 0x00,0x00,0xA0,0xE3,0x02,0x00,0x51,0xE1,0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x7C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x78,0x10,0x9D,0xE5,0xC0,0x00,0xA0,0xC3, + 0x02,0x00,0x51,0xE1,0x6C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x68,0x10,0x9D,0xE5,0x30,0x00,0x80,0xC3,0x02,0x00,0x51,0xE1, + 0x64,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x6C,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1, + 0x80,0x10,0x9D,0xE5,0x0C,0x00,0x80,0xC3,0x02,0x00,0x51,0xE1,0x7C,0x10,0x9D,0xD5, + 0x02,0x00,0x51,0xD1,0x84,0x10,0x9D,0xD5,0x02,0x00,0x51,0xD1,0x03,0x00,0x80,0xC3, + 0x04,0x10,0xA0,0xE3,0x00,0x20,0xA0,0xE3,0xC0,0x00,0x10,0xE3,0x01,0xC1,0x81,0x00, + 0x0C,0x21,0x83,0x07,0x30,0x00,0x10,0xE3,0x01,0xC1,0x81,0x00,0x0C,0xC1,0x83,0x00, + 0x10,0x20,0x8C,0x05,0x0C,0x00,0x10,0xE3,0x01,0x21,0x83,0x07,0x03,0x00,0x10,0xE3, + 0x01,0xC1,0x83,0x00,0x01,0x10,0x41,0xE2,0x01,0x18,0xA0,0xE1,0x50,0x20,0x8C,0x05, + 0x41,0x18,0xB0,0xE1,0xEF,0xFF,0xFF,0x5A,0xFC,0x30,0x9D,0xE5,0x00,0x30,0x8D,0xE5, + 0xEC,0x30,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0x7A,0x06,0x00,0xEB,0x10,0x31,0x9D,0xE5, + 0x00,0xA0,0xA0,0xE1,0x00,0x30,0x8D,0xE5,0x01,0x3C,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0x74,0x06,0x00,0xEB,0x24,0x31,0x9D,0xE5,0x00,0xB0,0xA0,0xE1,0x00,0x30,0x8D,0xE5, + 0x45,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0x6E,0x06,0x00,0xEB,0x38,0x31,0x9D,0xE5, + 0x00,0x90,0xA0,0xE1,0x00,0x30,0x8D,0xE5,0x4A,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8, + 0x68,0x06,0x00,0xEB,0x4C,0x31,0x9D,0xE5,0x30,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0x4F,0x3F,0x8D,0xE2,0x0F,0x00,0x93,0xE8,0x62,0x06,0x00,0xEB,0x2C,0x00,0x8D,0xE5, + 0x00,0x00,0x8D,0xE5,0x30,0x30,0x9D,0xE5,0x09,0x20,0xA0,0xE1,0x0B,0x10,0xA0,0xE1, + 0x0A,0x00,0xA0,0xE1,0x5B,0x06,0x00,0xEB,0x00,0x80,0xB0,0xE1,0x06,0x00,0x00,0x1A, + 0x64,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xEC,0x00,0x8D,0xE2,0x11,0xEC,0xFF,0xEB, + 0x0A,0x90,0xA0,0xE3,0x09,0x80,0xA0,0xE1,0x1C,0x91,0x8D,0xE5,0x3C,0x31,0x9D,0xE5, + 0xEC,0x00,0x9D,0xE5,0x00,0x30,0x8D,0xE5,0x00,0x11,0x9D,0xE5,0x14,0x21,0x9D,0xE5, + 0x28,0x31,0x9D,0xE5,0x4B,0x06,0x00,0xEB,0xDC,0x13,0x9F,0xE5,0x84,0x70,0x81,0xE0, + 0xBE,0x11,0xD7,0xE1,0x91,0x00,0x00,0xE0,0x28,0x00,0x8D,0xE5,0x40,0x31,0x9D,0xE5, + 0x00,0x30,0x8D,0xE5,0xF0,0x00,0x9D,0xE5,0x04,0x11,0x9D,0xE5,0x18,0x21,0x9D,0xE5, + 0x2C,0x31,0x9D,0xE5,0x3F,0x06,0x00,0xEB,0xB0,0x12,0xD7,0xE1,0x44,0x31,0x9D,0xE5, + 0x1C,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x24,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0xF4,0x00,0x9D,0xE5,0x08,0x11,0x9D,0xE5,0x30,0x31,0x9D,0xE5,0x35,0x06,0x00,0xEB, + 0xB2,0x12,0xD7,0xE1,0x48,0x31,0x9D,0xE5,0x20,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x20,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5,0xF8,0x00,0x9D,0xE5,0x0C,0x11,0x9D,0xE5, + 0x34,0x31,0x9D,0xE5,0x2B,0x06,0x00,0xEB,0xB4,0x12,0xD7,0xE1,0x4C,0x31,0x9D,0xE5, + 0x24,0x21,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x1C,0x00,0x8D,0xE5,0x00,0x30,0x8D,0xE5, + 0xFC,0x00,0x9D,0xE5,0x10,0x11,0x9D,0xE5,0x38,0x31,0x9D,0xE5,0x21,0x06,0x00,0xEB, + 0xB6,0x12,0xD7,0xE1,0x20,0x20,0x9D,0xE5,0x90,0x01,0x03,0xE0,0x00,0x30,0x8D,0xE5, + 0x28,0x00,0x9D,0xE5,0x24,0x10,0x9D,0xE5,0x1C,0x30,0x9D,0xE5,0x19,0x06,0x00,0xEB, + 0x08,0x10,0xA0,0xE1,0x1F,0xEB,0xFF,0xEB,0x0C,0x13,0x9F,0xE5,0x08,0x73,0x9F,0xE5, + 0xB0,0x12,0xD1,0xE1,0x00,0x10,0x61,0xE2,0x81,0x00,0x90,0xE0,0x04,0x10,0xD7,0xE5, + 0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0,0xB4,0x0F,0xC1,0xE1,0x50,0x31,0x9D,0xE5, + 0x50,0x21,0x9D,0xE5,0xB8,0x35,0xD3,0xE1,0x30,0xC0,0x9D,0xE5,0xB6,0x25,0xD2,0xE1, + 0x93,0x0C,0x0C,0xE0,0x99,0x02,0x02,0xE0,0x50,0x01,0x9D,0xE5,0x50,0x11,0x9D,0xE5, + 0x50,0x31,0x9D,0xE5,0xB2,0x05,0xD0,0xE1,0xB4,0x15,0xD1,0xE1,0xBA,0x35,0xD3,0xE1, + 0x2C,0x90,0x9D,0xE5,0x9A,0x00,0x00,0xE0,0x99,0x03,0x03,0xE0,0x9B,0x01,0x01,0xE0, + 0x00,0x30,0x8D,0xE5,0x0C,0x30,0xA0,0xE1,0xFA,0x05,0x00,0xEB,0x08,0x10,0xA0,0xE1, + 0x00,0xEB,0xFF,0xEB,0xB4,0x15,0xD7,0xE1,0x00,0x10,0x61,0xE2,0x81,0x00,0x90,0xE0, + 0x04,0x10,0xD7,0xE5,0x00,0x00,0xA0,0x43,0x81,0x10,0x87,0xE0,0x01,0x1C,0x81,0xE2, + 0xB6,0x00,0xC1,0xE1,0x04,0x00,0xD7,0xE5,0x08,0x00,0x50,0xE3,0x0C,0x00,0x00,0x2A, + 0x01,0x00,0x84,0xE2,0x00,0x48,0xA0,0xE1,0x44,0x48,0xA0,0xE1,0x0E,0x00,0x54,0xE3, + 0xF9,0xFC,0xFF,0xBA,0x14,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x1A, + 0x01,0x00,0x85,0xE2,0x00,0x58,0xA0,0xE1,0x45,0x58,0xA0,0xE1,0x16,0x00,0x55,0xE3, + 0xEB,0xFC,0xFF,0xBA,0x34,0x02,0x9F,0xE5,0x00,0x40,0x90,0xE5,0xB0,0x00,0xD4,0xE1, + 0x80,0x00,0x10,0xE3,0x40,0x00,0x00,0x0A,0x1C,0x52,0x9F,0xE5,0x04,0x00,0xD5,0xE5, + 0x00,0x00,0x50,0xE3,0x08,0x00,0x00,0x1A,0x68,0x01,0x9D,0xE5,0xB4,0x04,0xD0,0xE1, + 0x00,0x00,0x50,0xE3,0x41,0x01,0xD5,0x15,0x3C,0x10,0xD4,0x15,0x01,0x00,0x50,0x11, + 0x30,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x2C,0x00,0x00,0xEA,0x42,0x01,0xD5,0xE5, + 0x34,0x10,0xD4,0xE5,0x01,0x00,0x50,0xE1,0x27,0x00,0x00,0x8A,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0x42,0x01,0xC5,0xE5,0x35,0x10,0xD4,0xE5,0x05,0x20,0xA0,0xE1, + 0x00,0x00,0x51,0xE1,0x03,0x00,0x00,0x2A,0xBC,0x30,0xD2,0xE1,0x0C,0x20,0x9D,0xE5, + 0x03,0x20,0x82,0xE0,0x0C,0x20,0x8D,0xE5,0x34,0x20,0xD4,0xE5,0x02,0x00,0x50,0xE1, + 0x19,0x00,0x00,0x1A,0x01,0x00,0x50,0xE1,0x17,0x00,0x00,0x0A,0x01,0x10,0x40,0xE0, + 0x0C,0x00,0x9D,0xE5,0x57,0xEB,0xFF,0xEB,0x68,0x11,0x9D,0xE5,0x00,0x20,0xA0,0xE3, + 0xB4,0x24,0xC1,0xE1,0xB8,0x13,0xD4,0xE1,0x00,0x00,0x51,0xE1,0x0E,0x00,0x00,0x2A, + 0x10,0x10,0x9D,0xE5,0x01,0x00,0x40,0xE0,0x36,0x10,0xD4,0xE5,0x90,0x01,0x01,0xE0, + 0x7C,0x01,0x9F,0xE5,0x90,0x21,0x81,0xE0,0xA1,0x02,0xA0,0xE1,0x68,0x11,0x9D,0xE5, + 0xB4,0x04,0xC1,0xE1,0x68,0x01,0x9D,0xE5,0xB4,0x14,0xD0,0xE1,0xBA,0x03,0xD4,0xE1, + 0x00,0x00,0x51,0xE1,0x68,0x11,0x9D,0x85,0xB4,0x04,0xC1,0x81,0x00,0x00,0xA0,0xE3, + 0x41,0x01,0xC5,0xE5,0x04,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE3,0x42,0x01,0xC5,0xE5, + 0x41,0x01,0xC5,0xE5,0x68,0x11,0x9D,0xE5,0xB4,0x04,0xC1,0xE1,0x18,0x51,0x9F,0xE5, + 0x00,0xC0,0xA0,0xE3,0x04,0xA0,0xD5,0xE5,0x0C,0x80,0xA0,0xE1,0x01,0x20,0xA0,0xE3, + 0x01,0x00,0x5A,0xE3,0x37,0x00,0x00,0xBA,0xA7,0x94,0xD5,0xE5,0x1C,0xB1,0x9F,0xE5, + 0x01,0xE0,0xA0,0xE3,0x82,0x00,0x85,0xE0,0xB4,0x1F,0xD0,0xE1,0xCD,0x30,0xA0,0xE3, + 0x33,0x3B,0x83,0xE2,0x01,0x0C,0x80,0xE2,0xB6,0x00,0xD0,0xE1,0x93,0x01,0x01,0xE0, + 0x93,0x00,0x00,0xE0,0xA0,0x79,0xA0,0xE1,0x00,0x80,0xA0,0xE3,0x00,0x00,0x59,0xE3, + 0xA1,0x69,0xA0,0xE1,0x08,0x00,0xA0,0xE1,0x21,0x00,0x00,0xDA,0x02,0x11,0x85,0xE0, + 0x01,0x4C,0x81,0xE2,0x80,0x11,0x85,0xE0,0x01,0x1B,0x81,0xE2,0xF8,0x3A,0xD1,0xE1, + 0x06,0x00,0x53,0xE1,0x15,0x00,0x00,0xCA,0xFC,0x3A,0xD1,0xE1,0x06,0x00,0x53,0xE1, + 0x12,0x00,0x00,0xBA,0xFA,0x3A,0xD1,0xE1,0x07,0x00,0x53,0xE1,0x0F,0x00,0x00,0xCA, + 0xFE,0x1A,0xD1,0xE1,0x07,0x00,0x51,0xE1,0x0C,0x00,0x00,0xBA,0xF6,0x11,0xD4,0xE1, + 0xF4,0x31,0xD4,0xE1,0x81,0x11,0x61,0xE0,0x81,0x10,0x83,0xE0,0x81,0x10,0x8B,0xE0, + 0xF0,0x30,0xD1,0xE1,0x0C,0x00,0x53,0xE1,0x04,0x00,0x00,0xDA,0xA0,0x10,0x9F,0xE5, + 0x03,0xC0,0xA0,0xE1,0x00,0xE0,0xC1,0xE5,0xFF,0x80,0x02,0xE2,0xA5,0x04,0xC5,0xE5, + 0x01,0x00,0x80,0xE2,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x00,0x59,0xE1, + 0xDF,0xFF,0xFF,0xCA,0x01,0x00,0x82,0xE2,0x00,0x28,0xA0,0xE1,0x42,0x28,0xA0,0xE1, + 0x02,0x00,0x5A,0xE1,0xCA,0xFF,0xFF,0xAA,0x1C,0x00,0x9F,0xE5,0xBA,0x10,0xD5,0xE1, + 0x01,0x6C,0x80,0xE2,0x01,0x4C,0x80,0xE2,0x0C,0x00,0x51,0xE1,0x06,0x60,0x86,0xE2, + 0x02,0x40,0x84,0xE2,0x27,0x00,0x00,0xCA,0x12,0x00,0x00,0xEA,0x40,0x00,0x00,0x20, + 0xF0,0x06,0x00,0x20,0xA1,0x05,0x00,0x20,0x00,0x95,0x00,0x00,0x40,0x01,0x00,0x20, + 0x40,0x04,0x00,0x20,0x1F,0x85,0xEB,0x51,0xDC,0x05,0x00,0x20,0xE0,0x05,0x00,0x20, + 0x00,0x00,0x00,0x10,0x0C,0x06,0x00,0x20,0xF6,0x06,0x00,0x20,0xA2,0x05,0x00,0x20, + 0xA3,0x05,0x00,0x20,0x93,0x05,0x00,0x20,0x94,0x05,0x00,0x20,0x39,0x8E,0xE3,0x38, + 0x8F,0x05,0x00,0x20,0x95,0x05,0x00,0x20,0x00,0x00,0x58,0xE3,0x11,0x00,0x00,0x0A, + 0x88,0x00,0x85,0xE0,0xB4,0x8F,0xD0,0xE1,0x01,0x0C,0x80,0xE2,0xB6,0x70,0xD0,0xE1, + 0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xF4,0x00,0x85,0xE2,0xF1,0xEA,0xFF,0xEB, + 0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1,0xED,0xEA,0xFF,0xEB, + 0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5,0x94,0x00,0x1F,0xE5,0xB6,0x8F,0xC0,0xE1, + 0xB6,0x70,0xC4,0xE1,0x1B,0x00,0x00,0xEA,0x05,0x10,0xD5,0xE5,0x00,0x00,0x51,0xE3, + 0x18,0x00,0x00,0x1A,0x01,0x00,0x5A,0xE3,0x16,0x00,0x00,0x9A,0x82,0x11,0xD5,0xE5, + 0x00,0x00,0x51,0xE3,0x13,0x00,0x00,0x1A,0x18,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE3, + 0x10,0x00,0x00,0x0A,0x81,0x00,0x85,0xE0,0xB4,0x7F,0xD0,0xE1,0x01,0x0C,0x80,0xE2, + 0xB6,0x80,0xD0,0xE1,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xF4,0x00,0x85,0xE2, + 0xD4,0xEA,0xFF,0xEB,0x12,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1, + 0xD0,0xEA,0xFF,0xEB,0x01,0x00,0xA0,0xE3,0x04,0x00,0xC5,0xE5,0x08,0x01,0x1F,0xE5, + 0xB6,0x7F,0xC0,0xE1,0xB6,0x80,0xC4,0xE1,0xA3,0x04,0xD5,0xE5,0x05,0x30,0xA0,0xE1, + 0x00,0x00,0x50,0xE3,0x0B,0x00,0x00,0x0A,0xDC,0x00,0x1F,0xE5,0x00,0x20,0xA0,0xE3, + 0x04,0x20,0xC3,0xE5,0x38,0xC0,0x9F,0xE5,0x00,0x20,0xC0,0xE5,0xA4,0x04,0xD3,0xE5, + 0x1E,0xC0,0xDC,0xE5,0x03,0x10,0xA0,0xE1,0x0C,0x00,0x50,0xE1,0x01,0x00,0x80,0xE2, + 0xA3,0x24,0xC1,0x25,0xA4,0x04,0xC1,0xE5,0x04,0x00,0xD3,0xE5,0x14,0x10,0x9F,0xE5, + 0x05,0x00,0xC3,0xE5,0x00,0x00,0xC1,0xE5,0x5B,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x93,0x00,0x00,0x6C,0x06,0x00,0x20,0x10,0xB5,0x0F,0x48, + 0x0F,0x49,0x80,0x88,0x49,0x88,0x00,0x24,0x40,0x18,0x0E,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0x0D,0x49,0x49,0x89,0x02,0xE0,0x0C,0x49,0x09,0x68,0x49,0x88,0x08,0x18, + 0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7, + 0xB5,0xFB,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x01,0x00,0x20, + 0x80,0x05,0x00,0x20,0xA1,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xC0,0x90,0x00,0x40,0xF7,0xB5,0x27,0x4B,0x27,0x49,0x18,0x8F,0x82,0xB0,0x1E,0x00, + 0x08,0x80,0xD8,0x8E,0x25,0x49,0x20,0x36,0x08,0x80,0xB0,0x7F,0xF1,0x7F,0x00,0x02, + 0x08,0x43,0x02,0xF0,0x03,0xF8,0x18,0x7D,0xC0,0x07,0x0A,0xD0,0x20,0x48,0x01,0x78, + 0x20,0x48,0x00,0x7D,0x00,0x29,0x02,0xD0,0x01,0xF0,0xA8,0xFF,0x01,0xE0,0x01,0xF0, + 0xCD,0xFF,0x18,0x49,0x01,0x25,0x08,0x00,0xC0,0x30,0x01,0x90,0x05,0x20,0xC0,0x01, + 0x19,0x4F,0x08,0x18,0x00,0x90,0x00,0x20,0xF8,0x62,0x01,0x98,0x80,0x68,0x38,0x62, + 0x00,0x98,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFB,0xF7,0x3A,0xFD, + 0x64,0x1E,0xF9,0xD5,0x02,0x20,0xF8,0x62,0x30,0x7F,0x01,0x00,0xFB,0xF7,0xA8,0xFD, + 0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7,0xFF,0xFA,0x00,0x28,0x01,0xD1,0x00,0x24, + 0x25,0x00,0x64,0x1E,0xF5,0xD5,0x6D,0x1E,0xDD,0xD5,0x05,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x93,0x00,0x00,0xA6,0x05,0x00,0x20,0xA8,0x05,0x00,0x20, + 0x99,0x05,0x00,0x20,0x00,0x05,0x00,0x20,0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46, + 0xF0,0x4F,0x2D,0xE9,0x00,0x70,0xA0,0xE3,0x75,0xDF,0x4D,0xE2,0xC4,0x71,0x8D,0xE5, + 0xC0,0x71,0x8D,0xE5,0x34,0x70,0x8D,0xE5,0x30,0x70,0x8D,0xE5,0x2C,0x70,0x8D,0xE5, + 0x24,0x70,0x8D,0xE5,0x01,0x00,0xA0,0xE3,0x08,0x10,0x8D,0xE2,0x28,0x70,0x8D,0xE5, + 0x20,0x70,0x8D,0xE5,0x1C,0x70,0x8D,0xE5,0x18,0x70,0x8D,0xE5,0x10,0x70,0x8D,0xE5, + 0x81,0x00,0x81,0xE8,0x00,0x00,0xA0,0xE3,0xB4,0x48,0x9F,0xE5,0x00,0x10,0xA0,0xE1, + 0x04,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5,0x07,0x60,0xA0,0xE1,0x07,0x90,0xA0,0xE1, + 0x07,0xA0,0xA0,0xE1,0x07,0xB0,0xA0,0xE1,0x30,0x20,0xA0,0xE3,0x88,0x00,0x84,0xE2, + 0x50,0xEA,0xFF,0xEB,0x30,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xB8,0x00,0x84,0xE2, + 0x4C,0xEA,0xFF,0xEB,0x00,0x80,0xA0,0xE3,0x60,0x10,0xA0,0xE3,0x56,0x0F,0x8D,0xE2, + 0xB8,0x8E,0xC4,0xE1,0x57,0xEA,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0xF8,0x00,0x8D,0xE2, + 0x54,0xEA,0xFF,0xEB,0x60,0x10,0xA0,0xE3,0x98,0x00,0x8D,0xE2,0x51,0xEA,0xFF,0xEB, + 0x60,0x10,0xA0,0xE3,0x38,0x00,0x8D,0xE2,0x4E,0xEA,0xFF,0xEB,0x44,0x08,0x9F,0xE5, + 0x00,0x10,0xD0,0xE5,0x40,0x08,0x9F,0xE5,0x00,0x00,0x51,0xE3,0xD0,0x01,0x8D,0xE5, + 0x04,0x00,0x00,0x0A,0xF8,0x0A,0xD0,0xE1,0xBC,0x01,0x8D,0xE5,0xD0,0x01,0x9D,0xE5, + 0xB6,0x0A,0xD0,0xE1,0x04,0x00,0x00,0xEA,0x20,0x08,0x9F,0xE5,0x00,0x00,0x90,0xE5, + 0xF6,0x12,0xD0,0xE1,0xBC,0x11,0x8D,0xE5,0xB4,0x02,0xD0,0xE1,0xD0,0x11,0x9D,0xE5, + 0x00,0x20,0xA0,0xE3,0xB8,0x01,0x8D,0xE5,0xF4,0x07,0x9F,0xE5,0xB6,0x00,0xD0,0xE1, + 0x40,0x00,0x10,0xE3,0xB0,0xE8,0xD1,0x01,0xB0,0x18,0xD1,0x11,0x01,0x08,0xE0,0xE3, + 0x81,0xE0,0x00,0x10,0x8E,0x00,0x00,0xE0,0xE4,0x17,0x9F,0xE5,0x14,0x00,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0x00,0x00,0xC1,0xE5,0xD8,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xD4,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xD0,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xCC,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xC8,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xC4,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xC0,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xBC,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xB8,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xB4,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xB0,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xAC,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xA8,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0xA4,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0xA0,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x9C,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x98,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x94,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x90,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x8C,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x88,0x17,0x9F,0xE5,0x00,0x00,0x81,0xE5, + 0x84,0x07,0x9F,0xE5,0x01,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x7C,0x07,0x9F,0xE5, + 0x00,0x10,0x80,0xE5,0x02,0x10,0xA0,0xE1,0x00,0x00,0xA0,0xE3,0x70,0x37,0x9F,0xE5, + 0x70,0xC7,0x9F,0xE5,0x82,0x30,0x83,0xE0,0xCC,0x31,0x8D,0xE5,0xB0,0x30,0xD3,0xE1, + 0x82,0xC0,0x8C,0xE0,0xB0,0xC0,0xDC,0xE1,0x03,0x3A,0xA0,0xE1,0x23,0x3A,0xA0,0xE1, + 0x0F,0xCA,0xCC,0xE3,0x0C,0x40,0x43,0xE0,0x08,0x00,0x54,0xE1,0x03,0x50,0x4C,0xE0, + 0x34,0x00,0x8D,0xC5,0x30,0x10,0x8D,0xC5,0x04,0x80,0xA0,0xC1,0xF8,0x30,0x8D,0xE2, + 0x00,0xC1,0x93,0xE7,0x00,0x00,0x54,0xE3,0x00,0x40,0xA0,0xB3,0x04,0xC0,0x8C,0xE0, + 0x00,0xC1,0x83,0xE7,0x56,0x3F,0x8D,0xE2,0x01,0xC1,0x93,0xE7,0x00,0x00,0x55,0xE3, + 0x04,0xC0,0x8C,0xE0,0x01,0xC1,0x83,0xE7,0x38,0x30,0x8D,0xE2,0x00,0xC1,0x93,0xE7, + 0x00,0x50,0xA0,0xB3,0x05,0xC0,0x8C,0xE0,0x00,0xC1,0x83,0xE7,0x98,0x30,0x8D,0xE2, + 0x01,0xC1,0x93,0xE7,0x0D,0x00,0x50,0xE3,0x05,0xC0,0x8C,0xE0,0x01,0xC1,0x83,0xE7, + 0x04,0x00,0x00,0x2A,0xC4,0x31,0x9D,0xE5,0x04,0x00,0x53,0xE1,0xC4,0x41,0x8D,0x35, + 0x05,0x00,0x57,0xE1,0x05,0x70,0xA0,0x31,0x0E,0x00,0x55,0xE1,0x01,0x30,0x86,0xC2, + 0x01,0x68,0xC3,0xC3,0x0E,0x00,0x54,0xE1,0x01,0x30,0x89,0xC2,0x01,0x98,0xC3,0xC3, + 0x14,0x30,0x9D,0xE5,0x03,0x00,0x55,0xE1,0x01,0x30,0x8A,0xC2,0x01,0xA8,0xC3,0xC3, + 0x14,0x30,0x9D,0xE5,0x03,0x00,0x54,0xE1,0x01,0x30,0x8B,0xC2,0x01,0xB8,0xC3,0xC3, + 0x10,0x30,0x9D,0xE5,0x96,0x00,0x55,0xE3,0x04,0x30,0x83,0xE0,0x10,0x30,0x8D,0xE5, + 0x0C,0x30,0x9D,0xE5,0x05,0x30,0x83,0xE0,0x0C,0x30,0x8D,0xE5,0x03,0x00,0x00,0xDA, + 0x74,0x36,0x9F,0xE5,0xB0,0xC0,0xD3,0xE1,0x01,0xC0,0x8C,0xE2,0xB0,0xC0,0xC3,0xE1, + 0xCC,0x31,0x9D,0xE5,0x01,0x00,0x80,0xE2,0xB0,0x40,0xC3,0xE1,0xBC,0x31,0x9D,0xE5, + 0xC0,0xC1,0x9D,0xE5,0x04,0x30,0x83,0xE0,0x0C,0x30,0x83,0xE0,0x0E,0x00,0x50,0xE3, + 0x01,0x20,0x82,0xE2,0xC0,0x31,0x8D,0xE5,0xAF,0xFF,0xFF,0x3A,0x01,0x10,0x81,0xE2, + 0x16,0x00,0x51,0xE3,0xAB,0xFF,0xFF,0x3A,0x10,0x16,0x9F,0xE5,0x6C,0x00,0x9D,0xE5, + 0xC0,0x25,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x04,0x16,0x9F,0xE5,0xC4,0x01,0x9D,0xE5, + 0x00,0x00,0x81,0xE5,0xFC,0x15,0x9F,0xE5,0xFA,0x0F,0x50,0xE3,0x00,0x70,0x81,0xE5, + 0x0C,0x10,0x9D,0xE5,0x00,0x00,0xA0,0x83,0x00,0x10,0x82,0xE5,0xD8,0x15,0x9F,0x85, + 0x00,0x00,0x81,0x85,0xF4,0x05,0x9F,0xE5,0x00,0x00,0x90,0xE5,0x03,0x00,0x50,0xE3, + 0x15,0x00,0x00,0x2A,0xE8,0x15,0x9F,0xE5,0x50,0x00,0x57,0xE3,0x00,0x00,0x91,0x35, + 0xFA,0x00,0x50,0x33,0x03,0x00,0x00,0x2A,0x00,0x00,0x50,0xE3,0x0E,0x00,0x00,0x0A, + 0x01,0x00,0x40,0xE2,0x0B,0x00,0x00,0xEA,0x82,0x00,0x57,0xE3,0x03,0x00,0x00,0x9A, + 0x00,0x00,0x91,0xE5,0x7D,0x0F,0x50,0xE3,0x07,0x00,0x00,0x2A,0x04,0x00,0x00,0xEA, + 0x50,0x00,0x57,0xE3,0x04,0x00,0x00,0x9A,0x00,0x00,0x91,0xE5,0x4B,0x0F,0x50,0xE3, + 0x01,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x00,0x00,0x81,0xE5,0xA7,0xF8,0xFF,0xEB, + 0x90,0x05,0x9F,0xE5,0xD5,0x5A,0xD0,0xE1,0x00,0x00,0x55,0xE3,0x2D,0x00,0x00,0xBA, + 0x01,0x3B,0x40,0xE2,0xD5,0x04,0xD3,0xE5,0xA7,0x34,0xD3,0xE5,0x0D,0x10,0xA0,0xE3, + 0x80,0x01,0x60,0xE0,0x80,0x00,0x81,0xE0,0x00,0x00,0x53,0xE3,0x00,0x10,0xA0,0xE1, + 0x00,0x20,0xA0,0xE3,0x11,0x00,0x00,0x9A,0x44,0xE5,0x9F,0xE5,0x08,0x70,0x9D,0xE5, + 0x80,0xC0,0x8E,0xE0,0xF0,0x40,0xDC,0xE1,0x07,0x00,0x54,0xE1,0x03,0x00,0x00,0xDA, + 0x04,0x70,0x9D,0xE5,0x01,0x70,0x87,0xE2,0xFF,0x70,0x07,0xE2,0x04,0x70,0x8D,0xE5, + 0x00,0x70,0x9D,0xE5,0x01,0x20,0x82,0xE2,0x07,0x00,0x54,0xE1,0xB0,0xC0,0xDC,0xC1, + 0x0E,0x00,0x80,0xE2,0x00,0xC0,0x8D,0xC5,0x02,0x00,0x53,0xE1,0xEE,0xFF,0xFF,0x8A, + 0x04,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x00,0x00,0xA0,0x13,0x00,0x00,0x53,0x13, + 0x0C,0x00,0x00,0x9A,0x00,0xC0,0x9D,0xE5,0xE4,0x24,0x9F,0xE5,0x0C,0x48,0xA0,0xE1, + 0x44,0x48,0xA0,0xE1,0x00,0xC0,0xA0,0xE3,0x00,0x00,0x55,0xE1,0x81,0x70,0x82,0xE0, + 0xB0,0x40,0xC7,0x01,0x01,0x00,0x80,0xE2,0xB0,0xC0,0xC7,0x11,0x00,0x00,0x53,0xE1, + 0x0E,0x10,0x81,0xE2,0xF7,0xFF,0xFF,0x8A,0x50,0x04,0x9F,0xE5,0x40,0xC4,0x9F,0xE5, + 0x00,0x40,0x90,0xE5,0xB4,0x00,0xD4,0xE1,0xBE,0x00,0xCC,0xE1,0xB0,0x00,0xD4,0xE1, + 0x01,0x00,0x10,0xE3,0x09,0x00,0x00,0x0A,0xB8,0x01,0x9D,0xE5,0xC0,0x11,0x9D,0xE5, + 0x91,0x00,0x02,0xE0,0xA0,0x04,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x92,0x00,0xA1,0xE0, + 0xA1,0x06,0xA0,0xE1,0xB4,0x10,0xD4,0xE1,0x00,0x00,0x51,0xE1,0xBE,0x00,0xCC,0x81, + 0x88,0x54,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x98,0xE0,0x8D,0xE2,0x08,0x20,0xD4,0xE5, + 0x56,0x1F,0x8D,0xE2,0x00,0x11,0x91,0xE7,0x92,0x01,0x01,0xE0,0x95,0x31,0x82,0xE0, + 0xA2,0x34,0xA0,0xE1,0xB0,0x21,0xD4,0xE1,0x02,0x00,0x53,0xE1,0x95,0x21,0x81,0x90, + 0x09,0x30,0xD4,0xE5,0xA1,0x24,0xA0,0x91,0x00,0x11,0x9E,0xE7,0x91,0x03,0x03,0xE0, + 0x95,0x73,0x81,0xE0,0xA1,0x74,0xA0,0xE1,0xB2,0x11,0xD4,0xE1,0x01,0x00,0x57,0xE1, + 0x95,0x33,0x81,0x90,0xA1,0x14,0xA0,0x91,0x01,0x10,0x42,0xE0,0xBC,0x20,0xD4,0xE1, + 0x92,0x01,0x01,0xE0,0x01,0x18,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x01,0x25,0x61,0xE0, + 0x02,0x21,0x82,0xE0,0x81,0x13,0x82,0xE0,0xC1,0x29,0xA0,0xE1,0xC1,0x1F,0x42,0xE0, + 0x80,0x20,0x8C,0xE0,0x01,0x00,0x80,0xE2,0x16,0x00,0x50,0xE3,0xB8,0x18,0xC2,0xE1, + 0xDD,0xFF,0xFF,0x3A,0x00,0x50,0xA0,0xE3,0xF8,0xE0,0x8D,0xE2,0x0A,0x10,0xD4,0xE5, + 0x05,0x01,0x9E,0xE7,0xE8,0x33,0x9F,0xE5,0x90,0x01,0x01,0xE0,0x00,0xC0,0xA0,0xE3, + 0x03,0x00,0xA0,0xE1,0x0C,0x20,0xA0,0xE1,0x91,0x03,0xA2,0xE0,0xB4,0x01,0xD4,0xE1, + 0xA2,0x25,0xA0,0xE1,0x00,0x00,0x52,0xE1,0x03,0x00,0x00,0x8A,0x03,0x00,0xA0,0xE1, + 0x0C,0x20,0xA0,0xE1,0x91,0x03,0xA2,0xE0,0xA2,0x05,0xA0,0xE1,0x0B,0x20,0xD4,0xE5, + 0x38,0x10,0x8D,0xE2,0x05,0x11,0x91,0xE7,0x0C,0x70,0xA0,0xE1,0x91,0x02,0x02,0xE0, + 0x03,0x10,0xA0,0xE1,0x92,0x13,0xA7,0xE0,0xB6,0x11,0xD4,0xE1,0xA7,0x75,0xA0,0xE1, + 0x01,0x00,0x57,0xE1,0x92,0x33,0xAC,0x90,0xAC,0x15,0xA0,0x91,0x01,0x00,0x40,0xE0, + 0xBE,0x10,0xD4,0xE1,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0xC8,0x12,0x9F,0xE5,0x85,0x10,0x81,0xE0,0x01,0x50,0x85,0xE2, + 0x0D,0x00,0x55,0xE3,0xB8,0x0B,0xC1,0xE1,0xD3,0xFF,0xFF,0x3A,0x0A,0x00,0xD4,0xE5, + 0x05,0x11,0x9E,0xE7,0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x34,0x13,0x9F,0xE5, + 0x15,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0,0xC8,0x11,0x8D,0xE5,0xB5,0xE8,0xFF,0xEB, + 0xB4,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1,0x00,0x70,0xA0,0x91,0x01,0x70,0xA0,0x81, + 0x0B,0x10,0xD4,0xE5,0x38,0x00,0x8D,0xE2,0x05,0x01,0x90,0xE7,0x91,0x00,0x00,0xE0, + 0xC8,0x11,0x9D,0xE5,0xAB,0xE8,0xFF,0xEB,0xB6,0x11,0xD4,0xE1,0x01,0x00,0x50,0xE1, + 0x01,0x00,0xA0,0x81,0xBE,0x10,0xD4,0xE1,0x00,0x00,0x47,0xE0,0x50,0x72,0x9F,0xE5, + 0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0, + 0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0, + 0x85,0x10,0x87,0xE0,0x00,0x00,0x58,0xE3,0xB8,0x0B,0xC1,0xE1,0x0C,0x00,0x00,0xDA, + 0x34,0x00,0x9D,0xE5,0x80,0x00,0x87,0xE0,0xB8,0x1B,0xD0,0xE1,0x30,0x00,0x9D,0xE5, + 0x80,0x00,0x87,0xE0,0xB8,0x08,0xD0,0xE1,0x01,0x00,0x80,0xE0,0x00,0x00,0x48,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB8,0x0E,0xC7,0xE1,0x00,0x00,0xA0,0x43, + 0xB8,0x0E,0xC7,0x41,0x1E,0x50,0xA0,0xE3,0x01,0x5C,0x85,0xE2,0x0C,0x00,0x9D,0xE5, + 0x05,0x10,0xA0,0xE1,0x87,0xE8,0xFF,0xEB,0x00,0x40,0xA0,0xE1,0x10,0x00,0x9D,0xE5, + 0x05,0x10,0xA0,0xE1,0x83,0xE8,0xFF,0xEB,0x00,0x10,0xA0,0xE1,0xB6,0x00,0xD7,0xE1, + 0x40,0x00,0x10,0xE3,0x0E,0x00,0x00,0x0A,0x89,0x00,0x56,0xE1,0x01,0x20,0xA0,0x83, + 0x28,0x20,0x8D,0x85,0x4B,0x0F,0x54,0xE3,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85, + 0x28,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0x28,0x00,0x5B,0xE3, + 0x01,0x20,0xA0,0x33,0x1C,0x20,0x8D,0x35,0x14,0x00,0x56,0xE3,0x11,0x00,0x00,0x9A, + 0x0E,0x00,0x00,0xEA,0x09,0x00,0x56,0xE1,0x08,0x00,0x56,0x83,0x01,0x20,0xA0,0x83, + 0x28,0x20,0x8D,0x85,0x96,0x00,0x54,0xE3,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85, + 0x14,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0x14,0x00,0x5B,0xE3, + 0x01,0x20,0xA0,0x33,0x1C,0x20,0x8D,0x35,0x0A,0x00,0x56,0xE3,0x01,0x00,0x00,0x9A, + 0x01,0x20,0xA0,0xE3,0x18,0x20,0x8D,0xE5,0xF1,0x20,0xD7,0xE5,0x00,0x00,0x52,0xE3, + 0x03,0x00,0x00,0x1A,0xC0,0x21,0x9F,0xE5,0x00,0x20,0xD2,0xE5,0x01,0x00,0x52,0xE3, + 0x04,0x00,0x00,0x1A,0xF2,0x20,0xD7,0xE5,0xFA,0x00,0x52,0xE3,0x06,0x00,0x00,0x2A, + 0x01,0x20,0x82,0xE2,0x03,0x00,0x00,0xEA,0xF2,0x20,0xD7,0xE5,0x00,0x00,0x52,0xE3, + 0x01,0x00,0x00,0x0A,0x01,0x20,0x42,0xE2,0xF2,0x20,0xC7,0xE5,0x24,0x30,0x8D,0xE2, + 0x0C,0x00,0x93,0xE8,0x10,0x00,0x10,0xE3,0x02,0x30,0x83,0xE1,0x1C,0xC0,0x8D,0xE2, + 0x04,0x10,0x9C,0xE8,0x18,0x00,0x9D,0x15,0x0C,0x20,0x02,0xE0,0x00,0x00,0x50,0x13, + 0x03,0x20,0x82,0xE1,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1, + 0x00,0x00,0x50,0xE3,0xF2,0x00,0xD7,0x15,0x05,0x00,0x50,0x13,0x05,0x00,0x00,0x9A, + 0x48,0x01,0x9F,0xE5,0x81,0x10,0x81,0xE0,0x90,0x21,0x81,0xE0,0xA1,0x01,0xA0,0xE1, + 0x04,0x00,0x50,0xE1,0x02,0x00,0x00,0x3A,0x2C,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x07,0x00,0x00,0x0A,0xEC,0x00,0x97,0xE5,0x01,0x00,0x80,0xE2,0xEC,0x00,0x87,0xE5, + 0xF0,0x00,0xD7,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xF0,0x00,0xC7,0x15, + 0x0D,0x00,0x00,0xEA,0xF0,0x00,0xD7,0xE5,0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2, + 0xF0,0x00,0xC7,0xE5,0xD0,0x11,0x9D,0xE5,0xB4,0x18,0xD1,0xE1,0x01,0x00,0x50,0xE1, + 0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC7,0xE5,0xEC,0x00,0x97,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xEC,0x00,0x87,0xC5,0xF2,0x00,0xD7,0xE5, + 0x0A,0x00,0x50,0xE3,0x75,0xDF,0x8D,0x22,0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21, + 0xEC,0x00,0x97,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0xA0,0xC3,0xEC,0x00,0x87,0xC5, + 0x00,0x00,0xA0,0xE3,0xF0,0x00,0xC7,0xE5,0x75,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0xA1,0x05,0x00,0x20,0x00,0x95,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x6D,0x06,0x00,0x20,0x10,0x06,0x00,0x20,0x14,0x06,0x00,0x20, + 0x18,0x06,0x00,0x20,0x1C,0x06,0x00,0x20,0x20,0x06,0x00,0x20,0x24,0x06,0x00,0x20, + 0x28,0x06,0x00,0x20,0x2C,0x06,0x00,0x20,0x30,0x06,0x00,0x20,0x34,0x06,0x00,0x20, + 0x38,0x06,0x00,0x20,0x3C,0x06,0x00,0x20,0x40,0x06,0x00,0x20,0x44,0x06,0x00,0x20, + 0x48,0x06,0x00,0x20,0x4C,0x06,0x00,0x20,0x50,0x06,0x00,0x20,0x54,0x06,0x00,0x20, + 0x58,0x06,0x00,0x20,0x5C,0x06,0x00,0x20,0x60,0x06,0x00,0x20,0x64,0x06,0x00,0x20, + 0x68,0x06,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10,0xAE,0x05,0x00,0x20, + 0xD4,0x05,0x00,0x20,0xD0,0x05,0x00,0x20,0x40,0x04,0x00,0x20,0xAF,0xDF,0x16,0x44, + 0x91,0x73,0x9F,0x5D,0xE5,0x0E,0x50,0xEE,0x00,0x93,0x00,0x00,0x8E,0x05,0x00,0x20, + 0xCD,0xCC,0xCC,0xCC,0xF0,0xB5,0x00,0x27,0x3E,0x00,0x8B,0xB0,0xFF,0x48,0x05,0x97, + 0x00,0x68,0x80,0x79,0x03,0x90,0xFE,0x48,0x42,0x79,0x04,0x00,0xC0,0x34,0x00,0x92, + 0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xA3,0x7A,0x00,0x7A,0xFD,0xF7,0x01,0xFF, + 0x00,0x06,0x61,0x7A,0x00,0x0E,0xFD,0xF7,0xF1,0xFE,0x21,0x00,0x20,0x39,0x0A,0x7A, + 0x00,0x06,0xC0,0x39,0x09,0x79,0x00,0x0E,0xFD,0xF7,0xEC,0xFE,0x21,0x00,0x80,0x39, + 0x8A,0x7D,0x00,0x06,0xC0,0x39,0x89,0x7C,0x00,0x0E,0xFD,0xF7,0xE3,0xFE,0x00,0x06, + 0xEC,0x4C,0x00,0x0E,0x00,0x25,0x02,0x90,0xE5,0x67,0x60,0x7D,0x00,0x28,0x02,0xD0, + 0xE9,0x48,0x40,0x89,0x07,0xE0,0xE5,0x48,0xE8,0x49,0x00,0x68,0x49,0x88,0x40,0x88, + 0x40,0x18,0x00,0x04,0x00,0x0C,0x04,0x90,0x65,0x62,0x0F,0x20,0xA0,0x72,0xE4,0x48, + 0x18,0x22,0x00,0x21,0xF9,0xF7,0xAA,0xFF,0x60,0x7C,0x00,0x28,0x06,0xD0,0xA0,0x6E, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0xB8,0xFD,0x01,0xF0,0xA6,0xFD,0x01,0x20,0x20,0x63, + 0xFB,0xF7,0xF4,0xFE,0x00,0x25,0x25,0x71,0x65,0x71,0xE5,0x70,0xE5,0x64,0xC8,0x20, + 0xA5,0x64,0x60,0x64,0xE5,0x83,0x25,0x65,0x65,0x65,0xD4,0x48,0xA5,0x65,0xE5,0x65, + 0xA0,0x38,0x65,0x72,0xFF,0x21,0x0A,0x90,0x41,0x71,0xE5,0x63,0x25,0x64,0x25,0x67, + 0x65,0x67,0x25,0x66,0xCF,0x4A,0xE5,0x71,0x25,0x72,0xD0,0x88,0x08,0x21,0x88,0x43, + 0xD0,0x80,0x88,0x02,0xFA,0xF7,0x52,0xFB,0xF9,0xF7,0xCC,0xFF,0xF9,0xF7,0xB0,0xFF, + 0x01,0xF0,0x38,0xF8,0x01,0xF0,0x6E,0xFA,0x00,0xF0,0x9E,0xFF,0xC6,0x48,0x85,0x60, + 0xE0,0x7D,0x00,0x28,0x01,0xD0,0x0A,0x20,0x02,0x90,0xC2,0x4A,0x05,0x21,0x10,0x00, + 0xC0,0x30,0x09,0x90,0xC1,0x48,0xC9,0x01,0x41,0x18,0x80,0x30,0x07,0xAB,0x03,0xC3, + 0x02,0x98,0xC0,0x1C,0x06,0x90,0x15,0x20,0x40,0x01,0x15,0x18,0xEB,0xE1,0x60,0x7C, + 0x00,0x28,0x04,0xD0,0xA0,0x6E,0x00,0x04,0x00,0x0C,0x01,0xF0,0x65,0xFD,0x80,0x20, + 0xFA,0xF7,0x24,0xFB,0x03,0x20,0x01,0xF0,0xD3,0xFB,0x01,0x20,0x40,0x03,0xFA,0xF7, + 0x1D,0xFB,0xF9,0xF7,0x83,0xFF,0xE0,0x7D,0x00,0x28,0x01,0xD0,0x06,0x20,0x38,0xE0, + 0xAC,0x48,0xC0,0x88,0x01,0x06,0x04,0xD4,0x61,0x6C,0x64,0x29,0x03,0xD2,0x42,0x06, + 0x01,0xD4,0x01,0x20,0x2D,0xE0,0xFF,0x22,0x91,0x32,0x91,0x42,0x0E,0xD9,0x40,0x06, + 0x05,0xD5,0xA5,0x48,0xA6,0x49,0x80,0x30,0x01,0x62,0x27,0x21,0x18,0xE0,0xA2,0x48, + 0xFF,0x21,0x01,0x31,0x80,0x30,0x01,0x62,0x2D,0x21,0x11,0xE0,0xFF,0x22,0x2D,0x32, + 0x91,0x42,0x11,0xD9,0x40,0x06,0x05,0xD5,0x9B,0x48,0x9D,0x49,0x80,0x30,0x01,0x62, + 0x26,0x21,0x05,0xE0,0x98,0x48,0xFF,0x21,0x01,0x31,0x80,0x30,0x01,0x62,0x2C,0x21, + 0x41,0x62,0x05,0x21,0xC1,0x62,0x06,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0, + 0x03,0x20,0x01,0xF0,0x11,0xFA,0x8B,0x48,0xC0,0x6F,0x00,0x28,0x01,0xD1,0xFC,0xF7, + 0xB1,0xF8,0x90,0x48,0x04,0x99,0x80,0x88,0x8A,0x4A,0x40,0x18,0x91,0x89,0x88,0x42, + 0x10,0xD9,0x8C,0x48,0x40,0x30,0x40,0x78,0x00,0x28,0x0B,0xD1,0xD0,0x88,0xFF,0x21, + 0x19,0x31,0x08,0x42,0x06,0xD1,0x03,0x98,0x76,0x1C,0x86,0x42,0x03,0xDD,0x01,0x20, + 0x05,0x90,0x00,0xE0,0x00,0x26,0x00,0xF0,0x8F,0xFF,0x7E,0x48,0x08,0x99,0xC0,0x88, + 0x49,0x88,0x40,0x06,0x00,0x28,0x09,0x98,0xC0,0x6A,0x01,0xDA,0x49,0x00,0xFF,0xE7, + 0x88,0x42,0x02,0xDB,0x73,0x49,0x01,0x20,0x48,0x70,0x05,0x98,0x00,0x28,0x03,0xD0, + 0xF9,0xF7,0x06,0xFF,0x00,0x20,0x05,0x90,0xFC,0xF7,0x42,0xF8,0xFC,0xF7,0x50,0xF8, + 0x6C,0x48,0x00,0x24,0x44,0x84,0xFD,0xF7,0x09,0xFA,0x00,0x28,0x69,0x48,0x06,0xD0, + 0x44,0x62,0xE8,0x89,0xC8,0x28,0x34,0xD2,0x40,0x1C,0xE8,0x81,0x31,0xE0,0x41,0x6A, + 0x49,0x1C,0x41,0x62,0x41,0x6A,0x01,0x29,0x02,0xD1,0x44,0x72,0xC4,0x63,0x04,0x64, + 0x41,0x6A,0x02,0x29,0x04,0xD9,0x0A,0x9A,0xFF,0x21,0x51,0x71,0xC4,0x71,0x04,0x72, + 0x41,0x6A,0x01,0x29,0x02,0xD1,0x64,0x49,0x8C,0x72,0x84,0x64,0x59,0x48,0x40,0x6A, + 0x05,0x28,0x02,0xD9,0xFB,0xF7,0xF2,0xFD,0xEC,0x81,0x56,0x48,0x42,0x6A,0x02,0x99, + 0x49,0x1C,0x8A,0x42,0x0D,0xD1,0xC4,0x70,0xC4,0x64,0xC4,0x83,0x04,0x65,0x44,0x65, + 0x84,0x65,0xC8,0x21,0xC4,0x65,0x41,0x64,0x04,0x71,0x44,0x71,0x04,0x67,0x44,0x67, + 0x04,0x66,0x4C,0x48,0x55,0x4A,0x01,0x8C,0x91,0x42,0x01,0xD2,0x49,0x1C,0x01,0x84, + 0x50,0x49,0x60,0x39,0x49,0x7C,0x00,0x29,0x81,0x79,0x03,0xD0,0xFA,0x29,0x05,0xD2, + 0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xD0,0x49,0x1E,0x81,0x71,0x81,0x78,0x00,0x29, + 0xC1,0x8B,0x03,0xD0,0x64,0x29,0x05,0xD2,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xD0, + 0x49,0x1E,0xC1,0x83,0x3F,0x49,0xC9,0x88,0x09,0x07,0x0A,0xD5,0x81,0x6F,0x49,0x1C, + 0x32,0x29,0x81,0x67,0x06,0xD9,0x3B,0x49,0x08,0x22,0xC8,0x88,0x90,0x43,0xC8,0x80, + 0xEF,0xE0,0x84,0x67,0x04,0x00,0x40,0x78,0x00,0x28,0x10,0xD0,0xFC,0xF7,0x46,0xF8, + 0xFB,0xF7,0xBE,0xFF,0x01,0x20,0x80,0x03,0xFA,0xF7,0x20,0xFA,0xFB,0xF7,0xD0,0xFF, + 0xFC,0xF7,0x3C,0xF8,0xF9,0xF7,0x62,0xFF,0xFB,0xF7,0xAA,0xFD,0x2D,0xE0,0x34,0x48, + 0x41,0x68,0x09,0x07,0x0C,0xD5,0xC1,0x68,0x00,0x29,0x09,0xD0,0xC0,0x68,0x07,0x28, + 0x03,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0x09,0xE0,0x00,0xF0,0xB1,0xFA,0x06,0xE0, + 0x01,0xF0,0x86,0xF9,0xA0,0x7D,0x80,0x28,0x01,0xD1,0xFB,0xF7,0x91,0xFE,0xFC,0xF7, + 0x1D,0xF8,0xE0,0x6F,0x00,0x28,0x01,0xD0,0x40,0x1E,0xE0,0x67,0xFB,0xF7,0x90,0xFF, + 0x01,0x20,0x80,0x03,0xFA,0xF7,0xF2,0xF9,0xFB,0xF7,0xA2,0xFF,0x00,0xF0,0x7A,0xF9, + 0x07,0x00,0xFC,0xF7,0x0B,0xF8,0xF9,0xF7,0x31,0xFF,0x60,0x78,0x00,0x28,0x40,0xD0, + 0xFB,0xF7,0xC8,0xFF,0x00,0x22,0x01,0x21,0x10,0x00,0x13,0x00,0xFB,0xF7,0x96,0xFD, + 0xFB,0xF7,0xB8,0xFF,0x0B,0x49,0x00,0x20,0x48,0x70,0x08,0x84,0x88,0x71,0xC8,0x70, + 0xC8,0x83,0x08,0x65,0x48,0x65,0x88,0x65,0xC8,0x65,0x08,0x67,0x48,0x67,0xC8,0x22, + 0x08,0x66,0x4A,0x64,0xC8,0x64,0x07,0x4A,0x48,0x72,0x1B,0xE0,0xF0,0x06,0x00,0x20, + 0x60,0x94,0x00,0x00,0x8C,0x05,0x00,0x20,0xA0,0x95,0x00,0x00,0x80,0x05,0x00,0x20, + 0x50,0x0A,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x90,0x00,0x40,0x00,0x93,0x00,0x00, + 0x01,0x02,0x00,0x00,0x80,0x01,0x00,0x20,0x00,0x03,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x40,0x00,0x30,0xD1,0x88,0x08,0x23,0x99,0x43,0xD1,0x80,0x09,0x99,0xC8,0x62, + 0x67,0xE0,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x60,0x7D,0x00,0x28,0x01,0xD1, + 0x00,0xF0,0xB4,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28,0x59,0xD1,0x03,0x20, + 0x40,0x03,0xFA,0xF7,0x8B,0xF9,0x03,0x20,0x01,0xF0,0x1C,0xFA,0x60,0x66,0x03,0x20, + 0x01,0xF0,0x4E,0xFA,0x80,0x20,0xFA,0xF7,0x81,0xF9,0x00,0x2F,0x0C,0xD0,0x0A,0x20, + 0x78,0x43,0x61,0x6E,0x08,0x1A,0x60,0x66,0xFF,0x20,0x41,0x30,0x78,0x43,0x61,0x6E, + 0x40,0x18,0xFF,0x38,0x7D,0x38,0x60,0x66,0x26,0x48,0x00,0x78,0xA1,0x7B,0x08,0x43, + 0x31,0xD1,0xA0,0x6B,0x00,0x28,0x2E,0xD0,0x23,0x48,0xC0,0x88,0x40,0x06,0x60,0x6E, + 0x7D,0x21,0xC9,0x00,0x0C,0x1A,0xFF,0x20,0x91,0x30,0x84,0x42,0x23,0xDD,0xFF,0x20, + 0x01,0x30,0xFA,0xF7,0x63,0xF9,0x02,0x20,0x01,0xF0,0x22,0xFA,0x0A,0x21,0x20,0x00, + 0xF9,0xF7,0x30,0xFC,0x41,0x11,0x02,0x20,0x01,0xF0,0x02,0xFA,0x04,0x20,0xFA,0xF7, + 0x8D,0xF9,0x16,0x48,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60,0x14,0x49,0x01,0x20, + 0x08,0x61,0xFF,0x20,0xFA,0xF7,0x82,0xF9,0x02,0x20,0x01,0xF0,0x09,0xFA,0xFF,0x20, + 0x01,0x30,0xFA,0xF7,0x3B,0xF9,0x0F,0x4C,0x60,0x6A,0x06,0x99,0x88,0x42,0x00,0xD2, + 0x0D,0xE6,0x0D,0x48,0x0D,0x49,0x00,0x68,0x40,0x30,0x40,0x7D,0x48,0x76,0x09,0x48, + 0x40,0x7C,0x00,0x28,0x01,0xD0,0x01,0xF0,0x67,0xFB,0x0B,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF5,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0x00,0x40,0x00,0x40, + 0x40,0x00,0x00,0x40,0x8C,0x05,0x00,0x20,0xF0,0x06,0x00,0x20,0xC0,0x04,0x00,0x20, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47, + 0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x00,0x00,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A, + 0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x93,0x00,0x00, + 0x10,0xB5,0xF9,0xF7,0x6D,0xFD,0x03,0x20,0x40,0x03,0xFA,0xF7,0xEF,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFA,0xF7,0xEF,0xF8,0xF9,0xF7, + 0x69,0xFD,0xFB,0xF7,0x95,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0x93,0xFC,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7, + 0x0B,0xF8,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0xF0,0x0F,0x2D,0xE9,0xA8,0x60,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0xBA,0x00,0xC6,0xE1, + 0xA0,0x00,0x9F,0xE5,0xA0,0xA0,0x9F,0xE5,0x14,0x80,0xD0,0xE5,0x9C,0xB0,0x9F,0xE5, + 0x4D,0x2F,0xA0,0xE3,0x15,0x10,0xA0,0xE3,0x01,0x90,0xA0,0xE3,0x0D,0x00,0xA0,0xE3, + 0x81,0x70,0x86,0xE0,0x01,0x20,0x42,0xE2,0x80,0x40,0x86,0xE0,0xF8,0x4B,0xD4,0xE1, + 0xF8,0x58,0xD7,0xE1,0x82,0x30,0x8B,0xE0,0xF0,0xC0,0xD3,0xE1,0x05,0x40,0x84,0xE0, + 0x02,0x00,0x18,0xE3,0x04,0xC0,0x4C,0xE0,0x04,0x00,0x00,0x0A,0x0D,0x00,0x50,0xE3, + 0x07,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x05,0x00,0x00,0xBA,0x03,0x00,0x00,0xEA, + 0x15,0x00,0x51,0xE3,0x02,0x00,0x00,0x0A,0xC8,0x00,0x5C,0xE3,0x00,0x00,0x00,0xBA, + 0x00,0x90,0xCA,0xE5,0x00,0x00,0x5C,0xE3,0x00,0xC0,0xA0,0xB3,0xB0,0xC0,0xC3,0xE1, + 0xBA,0x30,0xD6,0xE1,0x0C,0x00,0x53,0xE1,0xBA,0xC0,0xC6,0xB1,0x01,0x00,0x50,0xE2, + 0xE3,0xFF,0xFF,0x5A,0x01,0x10,0x51,0xE2,0xDF,0xFF,0xFF,0x5A,0xF0,0x0F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x00,0x93,0x00,0x00,0x6D,0x06,0x00,0x20, + 0x00,0x00,0x00,0x10,0xF8,0xB5,0x84,0x4F,0x00,0x26,0x00,0x96,0xF8,0x68,0x07,0x28, + 0x03,0xD0,0xFC,0x03,0x25,0x68,0x00,0x2D,0x03,0xD1,0x00,0x20,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0xFF,0x20,0x01,0x30,0xFA,0xF7,0x61,0xF8,0x02,0x20,0x01,0xF0,0x20,0xF9, + 0x60,0x68,0x03,0x21,0x89,0x02,0x08,0x43,0x60,0x60,0x60,0x68,0x00,0x02,0x00,0x0A, + 0x60,0x60,0x76,0x48,0xA9,0x00,0xFD,0xF7,0xAB,0xFB,0x61,0x68,0x00,0x06,0x01,0x43, + 0x61,0x60,0x00,0xF0,0xF5,0xF8,0x05,0x2D,0x51,0xD8,0x71,0x4E,0xB0,0x7C,0x00,0x28, + 0x51,0xD1,0x01,0x20,0x04,0xE0,0x81,0x00,0x09,0x19,0x09,0x68,0xF9,0x61,0x40,0x1C, + 0xA8,0x42,0xF8,0xD9,0x6B,0x48,0x38,0x60,0x21,0x20,0x80,0x02,0x38,0x61,0x03,0x20, + 0xFC,0xF7,0x80,0xFF,0x68,0x48,0x0A,0x21,0x00,0x6B,0xF9,0xF7,0x33,0xFC,0x41,0x09, + 0x02,0x20,0x01,0xF0,0xD5,0xF8,0x65,0x4C,0xE0,0x68,0x40,0x08,0x40,0x00,0xE0,0x60, + 0x02,0x20,0x01,0xF0,0xD5,0xF8,0x04,0x20,0xFA,0xF7,0x58,0xF8,0x60,0x48,0x01,0x25, + 0x05,0x61,0x03,0x20,0x00,0x07,0xC1,0x68,0x08,0x22,0x11,0x43,0xC1,0x60,0x02,0x20, + 0x01,0xF0,0xA0,0xF8,0x00,0x90,0x78,0x68,0x78,0x60,0x78,0x69,0x78,0x61,0xFD,0xF7, + 0x4D,0xF9,0x02,0x20,0x01,0xF0,0xCC,0xF8,0x03,0x20,0xFC,0xF7,0x43,0xFF,0xE0,0x68, + 0x28,0x43,0xE0,0x60,0x53,0x48,0x00,0x78,0x00,0x28,0x07,0xD0,0x70,0x7C,0x00,0x28, + 0xFB,0xD0,0xB0,0x6E,0x00,0x04,0x00,0x0C,0x01,0xF0,0x36,0xFA,0x86,0xE0,0x48,0x48, + 0x80,0x7C,0x00,0x28,0x03,0xD0,0x6D,0x1C,0xFC,0xF7,0x9E,0xFD,0x06,0x00,0x43,0x48, + 0x00,0x68,0xF8,0x61,0x44,0x48,0x02,0x24,0x00,0x6B,0x0A,0x21,0xF9,0xF7,0xEA,0xFB, + 0x01,0x00,0x02,0x20,0x01,0xF0,0x8C,0xF8,0x02,0x20,0x01,0xF0,0x91,0xF8,0x3F,0x48, + 0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x39,0x48,0x21,0x07,0x80,0x7C,0x1D,0xE0, + 0x7A,0x69,0x52,0x06,0x0A,0xD4,0x00,0x28,0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA2,0x00, + 0x52,0x18,0x12,0x68,0xFA,0x61,0x00,0xE0,0xFE,0x61,0x64,0x1C,0x35,0x4A,0x12,0x78, + 0x00,0x2A,0x0B,0xD0,0xFC,0xF7,0x74,0xFE,0x2D,0x48,0x41,0x7C,0x00,0x29,0x07,0xD0, + 0x80,0x6E,0x00,0x04,0x00,0x0C,0x01,0xF0,0xF7,0xF9,0x01,0xE0,0xAC,0x42,0xDF,0xD9, + 0x02,0x20,0x01,0xF0,0x75,0xF8,0x2B,0x4D,0x28,0x78,0x00,0x28,0x37,0xD1,0xFC,0xF7, + 0xC7,0xFD,0x00,0x28,0x33,0xD0,0x24,0x48,0x0A,0x21,0x00,0x6B,0xF9,0xF7,0xAA,0xFB, + 0x01,0x00,0x02,0x20,0x01,0xF0,0x4C,0xF8,0x02,0x20,0x01,0xF0,0x51,0xF8,0x1C,0x4C, + 0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFC,0xF7,0x4A,0xFE,0x60,0x7C,0x00,0x28, + 0x04,0xD0,0xA0,0x6E,0x00,0x04,0x00,0x0C,0x01,0xF0,0xCE,0xF9,0xFC,0xF7,0xA8,0xFD, + 0x00,0x28,0xEE,0xD1,0x78,0x68,0x78,0x60,0x0B,0xE0,0x28,0x78,0x00,0x28,0x08,0xD0, + 0x60,0x7C,0x00,0x28,0x08,0xD0,0xA0,0x6E,0x00,0x04,0x00,0x0C,0x01,0xF0,0xBC,0xF9, + 0x02,0xE0,0x78,0x68,0xC0,0x03,0xF0,0xD5,0x02,0x20,0x01,0xF0,0x39,0xF8,0x00,0xF0, + 0x1F,0xF8,0x0A,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60,0xFF,0x20,0x01,0x30, + 0xF9,0xF7,0x64,0xFF,0x00,0x98,0x01,0xE7,0x00,0x40,0x00,0x30,0x04,0x00,0x00,0x20, + 0x8C,0x05,0x00,0x20,0xD0,0x10,0x05,0x00,0x00,0x93,0x00,0x00,0x00,0x20,0x00,0x40, + 0x40,0x00,0x00,0x40,0xF5,0x06,0x00,0x20,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7, + 0x8D,0xF8,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x40,0x18,0x70,0x47,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x40,0x18,0x80,0x18,0x70,0x47,0x00,0x00,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19,0x10,0xBC,0x70,0x47, + 0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A,0x90,0x75,0x90,0x7D, + 0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28, + 0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21,0x18,0x30,0xF9,0xF7,0x3F,0xFB,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x05,0x25,0x08,0x4C,0x2D,0x02,0x08,0xE0,0x46,0x18, + 0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19,0x40,0x1C,0xBE,0x61, + 0x96,0x7D,0x86,0x42,0xF3,0xD8,0xEA,0xE7,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20, + 0x70,0xB5,0x1F,0x49,0x1D,0x4C,0x0D,0x00,0x20,0x78,0xA9,0x22,0xFF,0x35,0x92,0x00, + 0xDF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0,0x5A,0x22,0x21,0x1D,0x28,0x00,0xF9,0xF7, + 0x45,0xFB,0x18,0x49,0x09,0x22,0x30,0x00,0xF9,0xF7,0x40,0xFB,0x20,0x78,0x60,0x70, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21,0x30,0x00,0xF9,0xF7,0x06,0xFB, + 0x5A,0x22,0x00,0x21,0x28,0x00,0xF9,0xF7,0x01,0xFB,0x0E,0x48,0x5A,0x22,0x00,0x21, + 0x63,0x38,0xF9,0xF7,0xFB,0xFA,0x0B,0x48,0x09,0x22,0x00,0x21,0x09,0x38,0xF9,0xF7, + 0xF5,0xFA,0x00,0x21,0x06,0x48,0x61,0x70,0xA1,0x70,0xC2,0x88,0x23,0x23,0x9A,0x43, + 0xC2,0x80,0x05,0x48,0x81,0x70,0xC1,0x70,0xDA,0xE7,0x00,0x00,0xC0,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0xDB,0x02,0x00,0x20,0xE0,0x04,0x00,0x20,0xF3,0xB5,0x90,0x48, + 0x91,0xB0,0x40,0x7E,0x02,0x90,0x8F,0x48,0x00,0x78,0x00,0x28,0x8E,0x48,0x18,0xD0, + 0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8C,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A, + 0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21, + 0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E, + 0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27, + 0x06,0x91,0x41,0x8B,0x05,0x91,0x7A,0x49,0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22, + 0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E, + 0x11,0x98,0x75,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68, + 0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C, + 0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8, + 0x1B,0x0C,0x01,0xF0,0xBC,0xF8,0x20,0x8C,0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90, + 0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC, + 0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98, + 0x08,0x1A,0x0E,0x90,0x16,0x20,0x08,0x90,0x5D,0x48,0x0E,0x21,0x80,0x79,0xC2,0x07, + 0x05,0xD0,0x80,0x07,0x01,0xD5,0x0D,0x21,0x01,0xE0,0x15,0x20,0x08,0x90,0x20,0x00, + 0xF9,0xF7,0x10,0xF9,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00, + 0xF9,0xF7,0x08,0xF9,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD, + 0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68, + 0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD, + 0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43, + 0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xF9,0xF7,0xDD,0xF8,0xC7,0x19,0x04,0x98,0x00,0x28, + 0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00, + 0xC0,0x1B,0x64,0x21,0xF9,0xF7,0xCE,0xF8,0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99, + 0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A, + 0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0, + 0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43, + 0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43, + 0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A, + 0xF9,0xF7,0xA0,0xF8,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0, + 0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21,0xF9,0xF7, + 0x91,0xF8,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98, + 0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99, + 0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3, + 0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8, + 0x1B,0x0C,0x00,0xF0,0xF4,0xFF,0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xA0,0x93,0x00,0x00,0xA1,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0xE0,0x95,0x00,0x00, + 0xE0,0x04,0x00,0x20,0xF3,0xB5,0x23,0x4E,0x05,0x68,0x00,0x22,0x81,0xB0,0x86,0x46, + 0x20,0x4B,0x00,0x21,0x2A,0x3B,0x50,0x00,0x1F,0x5A,0x84,0x46,0xBD,0x42,0x2F,0xD9, + 0x1C,0x4B,0x64,0x46,0x0E,0x3B,0x1B,0x5B,0x9D,0x42,0x29,0xD2,0x02,0x98,0x4C,0x00, + 0x03,0x68,0x30,0x5B,0x83,0x42,0x23,0xD9,0x16,0x48,0x2C,0x30,0x00,0x5B,0x83,0x42, + 0x1E,0xD2,0x50,0x00,0x13,0x4A,0x1C,0x3A,0x10,0x5A,0x42,0x00,0x80,0x18,0x40,0x19, + 0x82,0x08,0x70,0x46,0x02,0x60,0x48,0x00,0x0E,0x49,0x16,0x31,0x08,0x5A,0x41,0x00, + 0x02,0x98,0x00,0x68,0x08,0x18,0x03,0x21,0xF9,0xF7,0x5C,0xF9,0x09,0x49,0x42,0x31, + 0x09,0x5F,0x41,0x18,0x02,0x98,0x01,0x60,0x01,0x20,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x49,0x1C,0x0B,0x29,0xCA,0xD3,0x52,0x1C,0x07,0x2A,0xC1,0xD3,0x00,0x20,0xC0,0x43, + 0xF3,0xE7,0x00,0x00,0xEE,0x85,0x00,0x00,0xFE,0xB5,0x74,0x4D,0x72,0x48,0x00,0x26, + 0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x7B,0x81,0x31,0x08,0x78,0x33,0x00,0x00,0x2A, + 0x33,0xD1,0x00,0x28,0x31,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00, + 0xFF,0x30,0x8B,0x30,0xFC,0xF7,0x98,0xFD,0x00,0x28,0x22,0xD0,0x68,0x48,0x00,0x78, + 0x00,0x28,0x04,0xD0,0x00,0x98,0x40,0x1C,0x02,0x28,0x1D,0xD8,0x05,0xE0,0x65,0x48, + 0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42,0x16,0xD3,0x00,0x98,0xA9,0x19,0x40,0x1C, + 0x05,0x22,0x00,0x90,0xFF,0x20,0x12,0x02,0x85,0x30,0x89,0x18,0xC0,0x5D,0x3A,0x00, + 0xFF,0x32,0x48,0x73,0x76,0x1C,0x85,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0, + 0x55,0xFA,0x64,0x1C,0x09,0x2C,0xCF,0xDB,0xA0,0xE0,0x49,0x78,0x00,0x29,0x01,0xD1, + 0x00,0x28,0x7E,0xD0,0x0B,0x20,0x80,0x01,0x00,0x24,0x2E,0x18,0x05,0x27,0x3F,0x02, + 0x28,0x19,0xC0,0x19,0x40,0x7B,0x00,0x28,0x3F,0xD0,0x05,0x21,0x28,0x18,0xC9,0x01, + 0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0,0xB2,0x7A,0x00,0x2A,0x14,0xD0,0x15,0x21, + 0x49,0x01,0x40,0x18,0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91,0x0A,0x21,0x48,0x43, + 0x42,0x19,0xFF,0x32,0xDF,0x32,0x02,0x20,0x03,0x23,0x69,0x46,0x00,0xF0,0x26,0xFA, + 0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43,0x48,0x19,0x02,0x90, + 0xFF,0x30,0x8B,0x30,0xFC,0xF7,0x38,0xFD,0x00,0x28,0x13,0xD0,0x00,0x98,0x02,0x9A, + 0x40,0x1C,0xFF,0x32,0x00,0x90,0x85,0x32,0x03,0x20,0x02,0x23,0x69,0x46,0x00,0xF0, + 0x0D,0xFA,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x7B,0x40,0x1C,0x4A,0x73,0x08,0x28, + 0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24,0x2B,0x49,0x05,0x22, + 0x08,0x19,0xD2,0x01,0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92,0x00,0x28,0x3E,0xD0, + 0xB2,0x7A,0x00,0x2A,0x3B,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18,0x28,0x00,0xFF,0x30, + 0x8B,0x30,0xFC,0xF7,0x09,0xFD,0x00,0x28,0x31,0xD0,0x21,0x48,0x00,0x78,0x00,0x28, + 0x04,0xD0,0x00,0x98,0x40,0x1C,0x02,0x28,0x30,0xD8,0x05,0xE0,0x1D,0x48,0x81,0x7B, + 0x00,0x98,0x40,0x1C,0x81,0x42,0x29,0xD3,0x18,0x4A,0x00,0x20,0x11,0x18,0xC9,0x19, + 0x49,0x7B,0xA1,0x42,0x0D,0xD0,0x00,0x29,0x08,0xD1,0xFF,0x21,0x85,0x31,0x49,0x5D, + 0x00,0xE0,0x18,0xE0,0x10,0x18,0xC0,0x19,0x41,0x73,0x05,0xE0,0x40,0x1C,0x08,0x28, + 0xEC,0xDB,0x01,0x98,0x00,0x28,0x0A,0xD0,0x00,0x98,0x2A,0x00,0x40,0x1C,0xFF,0x32, + 0x00,0x90,0x85,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0xB7,0xF9,0x64,0x1C, + 0x09,0x2C,0xB3,0xDB,0x02,0xE0,0x01,0x20,0x40,0x07,0x43,0x60,0x00,0x98,0x00,0xF0, + 0x2B,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x40,0x05,0x00,0x20,0x40,0x00,0x00,0x20, + 0xA3,0x05,0x00,0x20,0x00,0x93,0x00,0x00,0xFC,0xB5,0x4E,0x48,0x4E,0x4F,0x80,0x8B, + 0x00,0x26,0x0E,0x24,0x05,0x04,0x16,0x20,0x84,0x46,0x4C,0x48,0x2D,0x14,0x82,0x7D, + 0x86,0x46,0x4B,0x48,0x81,0x79,0xC8,0x07,0x05,0xD0,0x88,0x07,0x01,0xD5,0x0D,0x24, + 0x01,0xE0,0x15,0x20,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42, + 0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46, + 0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2, + 0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x0B,0x00,0x63,0x43,0x1B,0x18,0x9B,0x00, + 0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA, + 0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24, + 0x70,0x46,0x04,0x5F,0x2D,0x4B,0x2F,0x48,0x20,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E, + 0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14, + 0x02,0x04,0x12,0x14,0x26,0x48,0x60,0x30,0x81,0x6B,0xA6,0x42,0x05,0xDD,0x74,0x46, + 0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E, + 0x81,0x63,0x1F,0x49,0x60,0x31,0xC9,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42, + 0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x63,0x74,0x46, + 0xA4,0x8B,0x85,0x6B,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88, + 0xC0,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70, + 0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43, + 0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46, + 0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFC,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x8C,0x05,0x00,0x20,0xD4,0x02,0x10,0x40,0x80,0x93,0x00,0x00, + 0xE0,0x04,0x00,0x20,0x40,0x00,0x00,0x20,0xF8,0xB5,0x34,0x4D,0x01,0x21,0x2C,0x00, + 0xFF,0x34,0x81,0x34,0x20,0x6A,0x49,0x05,0x88,0x43,0x86,0x46,0x09,0x20,0x80,0x01, + 0x29,0x18,0x48,0x6B,0xFF,0x27,0x84,0x46,0xA8,0x6A,0x41,0x37,0x2A,0x4E,0x78,0x43, + 0xF3,0x7D,0xE2,0x69,0x00,0x2B,0x0D,0xD0,0x29,0x4B,0x2A,0x49,0x4B,0x61,0x2A,0x4B, + 0x8B,0x61,0x73,0x46,0xCB,0x61,0x29,0x4B,0x0B,0x62,0xCA,0x60,0x62,0x46,0x0A,0x61, + 0x27,0x4A,0x27,0xE0,0x27,0x4B,0xDB,0x88,0x5B,0x06,0x16,0xD5,0x21,0x48,0x8A,0x69, + 0x42,0x61,0xCA,0x69,0x82,0x61,0x4A,0x6A,0x01,0x23,0x5B,0x05,0x9A,0x43,0xC2,0x61, + 0x8A,0x6A,0x02,0x62,0x0A,0x6A,0xC2,0x60,0x89,0x6B,0x01,0x61,0x1E,0x49,0x81,0x62, + 0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x0D,0xE0,0x16,0x49,0x63,0x69,0x4B,0x61, + 0xA3,0x69,0x8B,0x61,0x73,0x46,0xCB,0x61,0x63,0x6A,0x0B,0x62,0xCA,0x60,0x62,0x46, + 0x0A,0x61,0x16,0x4A,0x8A,0x62,0x16,0x49,0xF8,0xF7,0x5C,0xFF,0xB0,0x63,0x70,0x7D, + 0x00,0x28,0x05,0xD0,0x13,0x49,0x0B,0x48,0xC1,0x60,0x01,0x21,0x09,0x05,0x01,0x61, + 0x68,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x0D,0x49,0xF8,0xF7,0x4B,0xFF,0x70,0x63, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x8C,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0x90,0x01,0x50,0x00,0xC0,0x90,0x00,0x40,0x20,0x03,0x58,0x02,0x10,0x3F,0x10,0x3F, + 0x00,0x00,0x01,0x80,0x40,0x00,0x00,0x20,0x00,0x00,0x08,0x84,0x00,0x00,0x04,0x82, + 0x10,0x27,0x00,0x00,0x41,0x40,0x01,0x00,0x07,0x48,0x41,0x78,0x07,0x48,0x02,0x29, + 0x01,0xD9,0x00,0x6A,0x04,0xE0,0x02,0x29,0x01,0xD1,0xC0,0x69,0x00,0xE0,0x80,0x69, + 0x03,0x49,0x48,0x62,0x70,0x47,0x00,0x00,0xC0,0x01,0x00,0x20,0xC0,0x94,0x00,0x00, + 0xC0,0x90,0x00,0x40,0x16,0x48,0x30,0xB4,0xC5,0x7D,0x01,0x22,0x15,0x4C,0x16,0x4B, + 0x16,0x48,0x00,0x21,0x12,0x04,0x00,0x2D,0x09,0xD0,0x03,0x61,0x44,0x61,0x53,0x10, + 0x83,0x61,0x13,0x4B,0xC3,0x61,0x02,0x62,0x0E,0x4A,0xFA,0x3A,0x12,0xE0,0x11,0x4D, + 0xED,0x88,0x03,0x61,0x6D,0x06,0x05,0xD5,0x44,0x61,0x81,0x61,0xC1,0x61,0x02,0x62, + 0x44,0x62,0x08,0xE0,0x07,0x4B,0x64,0x3B,0x43,0x61,0x81,0x61,0xC1,0x61,0x02,0x62, + 0x04,0x4A,0xC8,0x3A,0x42,0x62,0x81,0x62,0xC1,0x62,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x8C,0x05,0x00,0x20,0x2C,0x01,0x01,0x00,0x00,0x00,0x01,0x03,0x40,0xA1,0x00,0x40, + 0x64,0x80,0x00,0x00,0x40,0x00,0x00,0x20,0x10,0x49,0x10,0xB4,0x0A,0x7D,0x10,0x48, + 0x82,0x71,0x4A,0x7D,0xC2,0x71,0x82,0x79,0x0E,0x48,0xD3,0x07,0x0A,0xD0,0x93,0x07, + 0x0D,0x4A,0x03,0xD5,0x0D,0x23,0x03,0x75,0x00,0x23,0x02,0xE0,0x15,0x23,0x03,0x75, + 0x01,0x23,0x53,0x73,0x8A,0x7D,0x42,0x75,0xCA,0x7D,0x82,0x75,0x0A,0x7E,0xC2,0x75, + 0x4A,0x7E,0x02,0x76,0x89,0x7E,0x41,0x76,0x10,0xBC,0x70,0x47,0x00,0x93,0x00,0x00, + 0xE0,0x04,0x00,0x20,0x00,0x05,0x00,0x20,0x8C,0x05,0x00,0x20,0xFF,0xB5,0x05,0x00, + 0x14,0x00,0x19,0x00,0x10,0x00,0x81,0xB0,0xFA,0xF7,0xEC,0xF8,0x00,0x28,0x08,0xD0, + 0x02,0x98,0x02,0x99,0x00,0x68,0x40,0x1E,0x08,0x60,0x05,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x29,0x48,0x80,0x79,0xC0,0x07,0x23,0xD0,0xE0,0x79,0x05,0x28,0x1E,0xD0, + 0x09,0x28,0x1E,0xD1,0x6D,0x08,0x6D,0x00,0x23,0x78,0x24,0x4F,0x01,0x20,0x12,0xE0, + 0x0A,0x21,0x41,0x43,0x22,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32,0xC1,0x32,0x96,0x7F, + 0xB3,0x42,0x07,0xD1,0xFF,0x31,0xE1,0x31,0x0E,0x88,0x66,0x80,0xD2,0x7F,0x62,0x70, + 0x49,0x88,0xA1,0x80,0x40,0x1C,0x79,0x78,0x81,0x42,0xE9,0xDA,0x01,0xE0,0x01,0x20, + 0x05,0x43,0x0F,0x21,0xA8,0x07,0x89,0x06,0x88,0x43,0x21,0x78,0x62,0x78,0x09,0x07, + 0x89,0x08,0x08,0x43,0x13,0x49,0x92,0x06,0x08,0x40,0x61,0x88,0x12,0x0C,0x89,0x05, + 0x89,0x09,0x08,0x43,0x3F,0x21,0x89,0x02,0x88,0x43,0x10,0x43,0x02,0x04,0x92,0x0E, + 0x0F,0x2A,0x03,0xD9,0x88,0x43,0x0F,0x21,0x89,0x02,0x40,0x18,0xA1,0x88,0x80,0x0A, + 0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x02,0x99,0x01,0x22,0x09,0x68,0x52,0x07, + 0x89,0x00,0x89,0x18,0x48,0x60,0xA8,0xE7,0xE0,0x04,0x00,0x20,0xC0,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x49,0x10,0xB5,0x88,0x7D,0x00,0x28, + 0x14,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0B,0xD0,0x80,0x28, + 0x0C,0xD1,0x8A,0x74,0xCA,0x74,0x0A,0x48,0x0A,0x75,0x0A,0x74,0x00,0x78,0x00,0x28, + 0x07,0xD1,0x4B,0x75,0x06,0xE0,0xCB,0x73,0x0A,0x74,0x4B,0x74,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x4A,0x75,0x00,0x20,0x00,0xF0,0xF7,0xF9,0xF7,0xE7,0x8C,0x05,0x00,0x20, + 0xA0,0x95,0x00,0x00,0xF0,0x41,0x2D,0xE9,0x00,0xC0,0xA0,0xE1,0x1C,0x50,0x9D,0xE5, + 0x18,0x60,0x9D,0xE5,0x01,0x00,0x5C,0xE1,0x01,0x40,0xA0,0xE1,0x02,0x00,0xA0,0xE1, + 0x03,0x70,0xA0,0xE1,0x06,0x00,0x00,0x3A,0x04,0x10,0xA0,0xE1,0x6D,0xE2,0xFF,0xEB, + 0xB0,0x00,0xC6,0xE1,0x04,0x10,0xA0,0xE1,0x07,0x00,0xA0,0xE1,0x69,0xE2,0xFF,0xEB, + 0xB0,0x00,0xC5,0xE1,0xF0,0x41,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xF0,0x47,0x2D,0xE9, + 0x00,0x40,0xA0,0xE1,0x20,0x80,0x8D,0xE2,0x28,0x60,0x8D,0xE2,0x01,0x01,0x98,0xE8, + 0x60,0x00,0x96,0xE8,0x02,0x00,0x51,0xE1,0xB2,0x50,0xC4,0xB1,0xB4,0x60,0xC4,0xB1, + 0x11,0x00,0x00,0xBA,0x03,0x00,0x51,0xE1,0xB2,0x00,0xC4,0xA1,0xB4,0x80,0xC4,0xA1, + 0x0D,0x00,0x00,0xAA,0x02,0x70,0x41,0xE0,0x05,0x00,0x40,0xE0,0x97,0x00,0x00,0xE0, + 0x02,0x90,0x43,0xE0,0x09,0x10,0xA0,0xE1,0x52,0xE2,0xFF,0xEB,0x05,0x00,0x80,0xE0, + 0xB2,0x00,0xC4,0xE1,0x06,0x00,0x48,0xE0,0x97,0x00,0x00,0xE0,0x09,0x10,0xA0,0xE1, + 0x4C,0xE2,0xFF,0xEB,0x06,0x00,0x80,0xE0,0xB4,0x00,0xC4,0xE1,0xF0,0x47,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x30,0xB4,0x8A,0x79,0x12,0x4B,0x00,0x25,0x12,0x07,0x92,0x08, + 0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5C,0x07,0x06,0xD5,0x0E,0x4C,0xA4,0x89, + 0x00,0x2C,0x02,0xD0,0xA4,0x05,0xA4,0x0D,0x22,0x43,0x3F,0x24,0xA4,0x02,0x9B,0x06, + 0xA2,0x43,0x1B,0x0C,0x1A,0x43,0x01,0x23,0x80,0x00,0x5B,0x07,0xC0,0x18,0x42,0x60, + 0xC8,0x79,0xC0,0x06,0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x70,0x05,0x71, + 0x30,0xBC,0x70,0x47,0xFF,0xFF,0x00,0xFC,0x40,0x00,0x00,0x20,0xE0,0x04,0x00,0x20, + 0x00,0xB5,0x0E,0x28,0x09,0xDD,0x16,0x28,0x07,0xDA,0x0F,0x28,0x05,0xD1,0x04,0x49, + 0xE1,0x20,0x80,0x00,0x48,0x83,0xFC,0xF7,0xB5,0xFC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x8C,0x05,0x00,0x20,0x30,0xB4,0x0E,0x25,0x68,0x43,0x0B,0x4C,0x40,0x18,0x45,0x00, + 0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E, + 0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43, + 0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x10,0xB4,0x0E,0x24, + 0x60,0x43,0x03,0x4B,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x0E,0x23,0x58,0x43,0x30,0xB4,0x0B,0x4C,0x40,0x18,0x43,0x00, + 0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E, + 0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43, + 0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x70,0xB4,0x12,0x4A, + 0x11,0x4D,0x52,0x7D,0x00,0x21,0x20,0x3D,0x14,0x02,0x14,0x43,0x0E,0x22,0x50,0x43, + 0x0C,0x4B,0x86,0x18,0x12,0xE0,0xAA,0x7D,0x8A,0x42,0x0D,0xD0,0xEA,0x7D,0x8A,0x42, + 0x0A,0xD0,0x2A,0x7E,0x8A,0x42,0x07,0xD0,0x6A,0x7E,0x8A,0x42,0x04,0xD0,0xAA,0x7E, + 0x8A,0x42,0x01,0xD0,0x42,0x00,0x9C,0x52,0x40,0x1C,0x49,0x1C,0x86,0x42,0xEA,0xD8, + 0x70,0xBC,0x70,0x47,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x70,0xB4,0x12,0x4A, + 0x11,0x4B,0x52,0x7D,0x00,0x21,0x20,0x3B,0x15,0x02,0x15,0x43,0xFF,0x26,0x0D,0x4C, + 0x35,0x36,0x12,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0, + 0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42, + 0x01,0xD0,0x42,0x00,0xA5,0x52,0x0E,0x30,0x49,0x1C,0xB0,0x42,0xEA,0xD3,0x70,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x93,0x00,0x00,0x02,0x04,0x04,0x49, + 0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x05,0x48,0x07,0x49,0xC0,0x88,0x42,0x06,0x04,0x48,0x01,0xD5, + 0x40,0x68,0x00,0xE0,0x00,0x68,0x48,0x60,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0xC0,0x93,0x00,0x00,0x00,0x90,0x00,0x40,0xF0,0xB5,0x03,0x00,0x22,0x49,0x05,0x20, + 0xC0,0x01,0x0C,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31,0x1D,0x4A,0x4F,0x6A, + 0x0E,0x6A,0x88,0x6A,0x00,0xF0,0x2A,0xFB,0x07,0x05,0x0B,0x15,0x19,0x21,0x25,0x2C, + 0x12,0x00,0xC8,0x68,0x10,0x62,0x60,0x6B,0x50,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69, + 0x10,0x62,0x68,0x68,0x50,0x62,0x04,0x20,0xD0,0x62,0x56,0x63,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x08,0x69,0x10,0x62,0xA0,0x6B,0x02,0xE0,0x48,0x69,0x10,0x62,0xE0,0x6B, + 0x50,0x62,0x04,0x20,0xD0,0x62,0x57,0x63,0xF0,0xE7,0x0C,0x49,0x11,0x62,0x24,0x21, + 0x02,0xE0,0x89,0x69,0x11,0x62,0x29,0x68,0x51,0x62,0x05,0x21,0xD1,0x62,0x07,0xE0, + 0x06,0x48,0x10,0x62,0x26,0x20,0x50,0x62,0x05,0x20,0xD0,0x62,0xF5,0x20,0x00,0x01, + 0x50,0x63,0xDB,0xE7,0x80,0x90,0x00,0x40,0x00,0x93,0x00,0x00,0x01,0x02,0x00,0x00, + 0x70,0xB4,0x01,0x23,0x5B,0x07,0x58,0x68,0x59,0x68,0xC0,0x02,0xC0,0x0E,0x09,0x02, + 0x4C,0x0F,0x18,0x49,0x01,0x26,0x00,0x22,0x00,0x2C,0x10,0xD0,0xCC,0x7A,0x35,0x00, + 0x00,0x2C,0x00,0xD0,0x00,0x25,0x85,0x42,0x07,0xD0,0x45,0x08,0x64,0x08,0xA5,0x42, + 0x03,0xD1,0xC8,0x72,0x1A,0x60,0x70,0xBC,0x70,0x47,0xC8,0x72,0x00,0xE0,0xCA,0x72, + 0x58,0x68,0x00,0x04,0x00,0x0F,0x58,0x68,0x03,0xD0,0x00,0x04,0x00,0x0F,0x40,0x1C, + 0x0C,0xE0,0xC0,0x02,0xC0,0x0E,0x01,0xD0,0x01,0x20,0x07,0xE0,0x88,0x7A,0x00,0x28, + 0x02,0xD1,0x01,0x20,0x8E,0x72,0x02,0xE0,0x0F,0x22,0x00,0x20,0x8A,0x72,0x18,0x60, + 0xE1,0xE7,0x00,0x00,0x8C,0x05,0x00,0x20,0x09,0x48,0x10,0xB5,0xC4,0x6E,0xE0,0x07, + 0x05,0xD0,0x08,0x48,0x00,0x7E,0x00,0x28,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20, + 0x00,0xF0,0x0A,0xF8,0x20,0x0C,0xFF,0xF7,0xA3,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x8C,0x05,0x00,0x20,0xA0,0x93,0x00,0x00,0x0A,0x4A,0x10,0xB5,0xD1,0x88,0x0A,0x4B, + 0x40,0x24,0x00,0x28,0x03,0xD0,0x21,0x43,0x08,0x48,0xD1,0x80,0x03,0xE0,0x07,0x48, + 0xA1,0x43,0xC4,0x38,0xD1,0x80,0x18,0x60,0xFF,0xF7,0x6E,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xF0,0x06,0x00,0x20,0xB0,0x94,0x00,0x00, + 0xFE,0xB5,0x04,0x00,0x39,0x48,0x07,0x6A,0x41,0x6A,0x02,0x91,0x41,0x6B,0x01,0x91, + 0xC0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x37,0xFF,0xFA,0xF7,0xE3,0xFD,0x34,0x4E, + 0x25,0x00,0x42,0xE0,0x68,0x1E,0x84,0x42,0x01,0xD1,0xFA,0xF7,0x05,0xFE,0xFA,0xF7, + 0xA7,0xFD,0xFA,0xF7,0x13,0xFE,0xF0,0x7D,0x00,0x28,0x07,0xD0,0x68,0x00,0xA0,0x42, + 0x29,0xD9,0x01,0x22,0x11,0x00,0x00,0x20,0x02,0x23,0x2C,0xE0,0xA8,0x00,0x05,0x21, + 0xF8,0xF7,0xE8,0xFB,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0xF3,0xE7, + 0x68,0x00,0x28,0x18,0x05,0x21,0xF8,0xF7,0xDD,0xFB,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x03,0x20,0xE8,0xE7,0x68,0x00,0x05,0x21,0xF8,0xF7,0xD3,0xFB,0xA0,0x42, + 0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0xDE,0xE7,0x05,0x21,0x28,0x00,0xF8,0xF7, + 0xC9,0xFB,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x10,0x00,0xD4,0xE7,0x01,0x22, + 0x11,0x00,0x00,0x20,0x13,0x00,0xFA,0xF7,0x71,0xFB,0x64,0x1E,0xBA,0xD2,0x11,0x48, + 0x44,0x88,0x03,0xE0,0xFA,0xF7,0x64,0xFD,0xFA,0xF7,0xD0,0xFD,0x64,0x1E,0xF9,0xD2, + 0xFA,0xF7,0x88,0xFD,0x09,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63, + 0x00,0x99,0xC1,0x62,0x00,0x20,0x30,0x84,0xB0,0x71,0xF0,0x70,0xC8,0x21,0xF0,0x83, + 0x71,0x64,0x30,0x71,0x70,0x71,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x80,0x90,0x00,0x40, + 0x8C,0x05,0x00,0x20,0xE0,0x95,0x00,0x00,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C, + 0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E, + 0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60, + 0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x93,0x00,0x00,0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xF5,0x06,0x00,0x20, + 0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B, + 0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x05,0x49,0x00,0x03,0x40,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60, + 0x02,0x49,0x00,0x20,0x08,0x70,0x70,0x47,0x00,0x20,0x00,0x40,0xF5,0x06,0x00,0x20, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x13,0x49,0x01,0x22,0x09,0x78,0x52,0x07, + 0x00,0x29,0x03,0xD0,0x02,0x28,0x06,0xD9,0x02,0x20,0x15,0xE0,0x0F,0x49,0x89,0x7B, + 0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0xA3,0x05,0x00,0x20,0x00,0x93,0x00,0x00, + 0x38,0xB5,0x00,0x24,0x71,0x20,0x6B,0x46,0x00,0x94,0xD8,0x70,0x00,0x98,0x01,0x25, + 0x6D,0x07,0x68,0x60,0x0D,0x48,0x09,0x22,0x21,0x00,0xF8,0xF7,0x1F,0xFB,0x0B,0x48, + 0x09,0x22,0x00,0x21,0x09,0x38,0xF8,0xF7,0x19,0xFB,0x08,0x49,0x0D,0x39,0x88,0x7D, + 0x00,0x28,0x08,0xD0,0x00,0x20,0x03,0xE0,0x82,0x00,0x52,0x19,0x94,0x60,0x40,0x1C, + 0x8A,0x7D,0x82,0x42,0xF8,0xDC,0x38,0xBC,0x08,0xBC,0x18,0x47,0x4D,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x24,0x25,0x00,0x20,0x00,0x01,0x21,0x89,0xB0,0x49,0x07,0x08,0x94, + 0x4F,0x68,0x69,0x4E,0xB9,0x0F,0x89,0x07,0x7E,0xD5,0x20,0x22,0x00,0x21,0x68,0x46, + 0xF8,0xF7,0xF4,0xFA,0x07,0x21,0xB8,0x01,0x49,0x05,0x40,0x08,0x08,0x40,0x31,0x00, + 0x88,0x43,0x39,0x07,0x09,0x0C,0x08,0x43,0x00,0x21,0x08,0x90,0x41,0xE0,0x01,0x23, + 0x88,0x00,0x5B,0x07,0xC0,0x18,0x80,0x68,0x86,0x00,0x33,0x0F,0x38,0xD0,0x83,0x0F, + 0xDB,0x07,0x2C,0xD0,0x33,0x0F,0x9E,0x46,0x9B,0x00,0x6F,0x46,0xDB,0x19,0x40,0x3B, + 0x9C,0x46,0xDB,0x6B,0x36,0x0F,0x1B,0x01,0x1B,0x09,0x36,0x07,0x33,0x43,0x0F,0x27, + 0x3F,0x06,0x06,0x04,0xB6,0x08,0xBB,0x43,0x3E,0x40,0x33,0x43,0x4F,0x4E,0x33,0x40, + 0x86,0x01,0xB6,0x0D,0x36,0x03,0x33,0x43,0x1E,0x0B,0x80,0x05,0x36,0x03,0x80,0x0D, + 0x06,0x43,0x63,0x46,0xDE,0x63,0x73,0x46,0x5B,0x1E,0x01,0x20,0x98,0x40,0x80,0x05, + 0x80,0x0D,0x02,0x43,0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x08,0x92,0x08,0xE0,0x30,0x0F, + 0x40,0x1E,0x01,0x23,0x83,0x40,0xD8,0x43,0x41,0x4B,0x18,0x43,0x02,0x40,0x08,0x92, + 0x49,0x1C,0x08,0x9A,0x10,0x04,0x00,0x0F,0x88,0x42,0xB8,0xD8,0x10,0x04,0x00,0x0F, + 0x01,0x23,0x5F,0x07,0x0F,0xE0,0x82,0x00,0xD2,0x19,0x92,0x68,0x1E,0x00,0x92,0x00, + 0x12,0x0F,0x52,0x1E,0x96,0x40,0xF2,0x06,0xD2,0x0A,0x64,0x1C,0x11,0x43,0x24,0x06, + 0x24,0x0E,0x40,0x1C,0x08,0x91,0x08,0x99,0x0A,0x04,0x0E,0x02,0x12,0x0F,0x76,0x0F, + 0x92,0x19,0x82,0x42,0xE7,0xD8,0x00,0x22,0x10,0x00,0x83,0x00,0x6E,0x46,0xF6,0x58, + 0x00,0x2E,0x0A,0xD0,0x01,0x23,0x00,0xE0,0x17,0xE0,0x83,0x40,0x0B,0x40,0x9B,0x05, + 0x03,0xD0,0x93,0x00,0xDB,0x19,0x9E,0x60,0x52,0x1C,0x40,0x1C,0x08,0x28,0xEC,0xD3, + 0x21,0x48,0x81,0x43,0x28,0x07,0x00,0x0C,0x01,0x43,0x07,0x20,0x40,0x05,0x81,0x43, + 0x60,0x07,0x00,0x0A,0x01,0x43,0x08,0x91,0x2B,0xE0,0xB9,0x0F,0xC9,0x07,0x25,0xD0, + 0x01,0x23,0x5B,0x07,0x58,0x68,0x19,0x4C,0x81,0x00,0x0A,0x0F,0x12,0x07,0x22,0x40, + 0x84,0x01,0xA4,0x0D,0x24,0x03,0x22,0x43,0x84,0x05,0x12,0x0B,0x12,0x03,0xA4,0x0D, + 0x22,0x43,0x0F,0x24,0x24,0x06,0x00,0x04,0x80,0x08,0xA2,0x43,0x20,0x40,0x02,0x43, + 0x10,0x0F,0x09,0xD0,0x08,0x0F,0x40,0x1E,0x01,0x21,0x81,0x40,0x88,0x05,0x80,0x0D, + 0xB0,0x43,0x59,0x14,0x40,0x18,0x08,0x90,0x9A,0x60,0x02,0xE0,0x01,0x21,0x49,0x07, + 0x88,0x60,0x71,0x20,0x08,0xAB,0xD8,0x70,0x08,0x99,0x40,0x07,0x41,0x60,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xF0,0x00,0x00,0xFF,0x0F,0x00,0xFF, + 0x00,0xFC,0xFF,0xFF,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C, + 0x40,0x21,0x20,0x00,0xF8,0xF7,0x20,0xFA,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23, + 0xF8,0xF7,0x22,0xFA,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x92,0x00,0x00, + 0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40, + 0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00, + 0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60, + 0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47, + 0xF4,0x06,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47, + 0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47,0x70,0xB4, + 0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0,0x02,0x60, + 0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60,0x08,0x68, + 0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x78,0x47,0xC0,0x46, + 0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27, + 0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF8,0xF7,0xED,0xF9,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x01,0x00,0x4B,0x00,0x95,0x00,0xD5,0x00,0x0C,0x01,0x4D,0x01, + 0x97,0x01,0x25,0x00,0x6F,0x00,0xB9,0x00,0xF0,0x00,0x27,0x01,0x71,0x01,0xBB,0x01, + 0x49,0x00,0x93,0x00,0xD4,0x00,0x0B,0x01,0x4B,0x01,0x95,0x01,0xDF,0x01,0x01,0x00, + 0x46,0x00,0x92,0x00,0xDE,0x00,0x2A,0x01,0x6D,0x01,0xA6,0x01,0xE9,0x01,0x35,0x02, + 0x81,0x02,0xCD,0x02,0x20,0x00,0x6C,0x00,0xB8,0x00,0x04,0x01,0x50,0x01,0x89,0x01, + 0xC2,0x01,0x0E,0x02,0x5A,0x02,0xA6,0x02,0xF2,0x02,0x45,0x00,0x91,0x00,0xDD,0x00, + 0x29,0x01,0x6B,0x01,0xA4,0x01,0xE7,0x01,0x33,0x02,0x7F,0x02,0xCB,0x02,0x17,0x03, + 0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFD,0xFF,0xFD,0xFF,0xFC,0xFF, + 0x00,0x00,0xFE,0xFF,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF, + 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00, + 0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x89,0x08,0x49,0x1E,0x49,0x04,0x01,0x22, + 0x49,0x08,0xD2,0x07,0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43,0x03,0x48,0x41,0x61, + 0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2, + 0x01,0x10,0xC0,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0xB2,0x10,0xC0,0xE0,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1, + 0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2, + 0x04,0x10,0x80,0xE4,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4, + 0xFB,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0x1E,0xFF,0x2F,0x31,0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x70,0x20,0x9F,0xE5,0x30,0x00,0x2D,0xE9, + 0x64,0xC0,0x9F,0xE5,0x00,0x00,0x92,0xE5,0x64,0x40,0x9F,0xE5,0x64,0x30,0x9F,0xE5, + 0x33,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2,0x00,0x11,0x92,0xE7,0x80,0x50,0x84,0xE0, + 0xB0,0x10,0xC5,0xE1,0x00,0x11,0x9C,0xE7,0x80,0x50,0x83,0xE0,0x01,0x00,0x50,0xE2, + 0xB0,0x10,0xC5,0xE1,0xF7,0xFF,0xFF,0x5A,0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x24,0x20,0x9F,0xE5,0x30,0x10,0x9F,0xE5,0x33,0x00,0xA0,0xE3,0x01,0x0C,0x80,0xE2, + 0x00,0x31,0x92,0xE7,0x80,0xC0,0x81,0xE0,0x23,0x38,0xA0,0xE1,0x01,0x00,0x50,0xE2, + 0xB0,0x30,0xCC,0xE1,0xF9,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40, + 0x00,0x10,0x10,0x40,0xF6,0x06,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x38,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x01,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x15,0x14,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0x1C,0x02,0xC0,0x03,0xE8,0x03,0x00,0x00,0xE8,0x03,0x00,0x00,0xE8,0x03,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x1A,0x04,0x4C,0x04,0x00,0x00,0x04,0xC8,0x97,0x97, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x78,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x66,0x00,0x68,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x14,0x00,0x00,0x00,0x00,0x00, + 0x05,0x02,0x05,0x0A,0x01,0x01,0x04,0x00,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x80,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9F,0xB9,0x5E,0x01, + 0x01,0x00,0x14,0x00,0x64,0x64,0x64,0x64,0x1E,0x00,0x96,0x00,0x19,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x32,0x00,0x90,0x01,0x90,0x01,0x90,0x01, + 0x2C,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x0A,0x01,0x32,0x00,0x88,0x13,0xE8,0x03,0x0A,0x00,0x96,0x96,0x96,0x96,0x00,0x96, + 0x96,0x96,0xB4,0x00,0xFF,0x0F,0x90,0x01,0x50,0x00,0x0A,0x00,0xFF,0xFF,0x14,0x96, + 0x00,0x05,0x04,0x0A,0x0A,0x06,0xF4,0x01,0x3C,0x00,0x03,0x2D,0x00,0x02,0x14,0x00, + 0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x02,0x01,0x00,0x02,0x04,0x03,0x00,0x05,0x05,0x0A,0x0A, + 0x0F,0x0F,0x14,0x14,0x64,0x55,0x01,0x00,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,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x41,0x42,0x01,0x00, + 0x18,0x18,0x88,0x00,0x30,0x7F,0x10,0x3F,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00, + 0x9F,0x99,0x5E,0x01,0x01,0x00,0x14,0x00,0x64,0x64,0x64,0x64,0x46,0x00,0x32,0x00, + 0x96,0x00,0x14,0x00,0x32,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x90,0x01, + 0x90,0x01,0x90,0x01,0x90,0x01,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x0A,0x01,0x32,0x00,0x88,0x13,0xF4,0x01,0x0A,0x00,0x96,0x96, + 0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x0F,0x90,0x01,0xC8,0x00,0x1E,0x00, + 0xFA,0xFA,0x0D,0xA0,0x00,0x05,0x04,0x0A,0x02,0x06,0xE8,0x03,0x3C,0x00,0x03,0x28, + 0x00,0x02,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x05,0x01,0x02,0x01,0x00,0x03,0x04,0x03,0x00, + 0x05,0x05,0x0A,0x0A,0x0F,0x0F,0x14,0x14,0x64,0x5A,0x01,0x00,0x03,0x00,0x00,0x00, + 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,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x41,0x22,0x01,0x00,0x10,0x10,0x88,0x00,0x30,0x7F,0x10,0x3F,0x00,0x00,0x00,0x00, + 0x01,0x00,0x01,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x8C,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x2C,0x01,0x00,0x00,0x2C,0x01,0x5E,0x01,0x00,0x00, + 0x21,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x28,0x00,0x00,0x00, + 0x25,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0A,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x32,0x00,0x50,0x00,0x32,0x00,0x50,0x00,0x0A,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x16,0x0E,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x00,0x00,0x27,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0xFF,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x42,0x01,0x00, + 0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x18,0x18,0x88,0x00, + 0x30,0x7F,0x10,0x3F,0x64,0x14,0x10,0x00,0x00,0x00,0x04,0x82,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0xC8,0x00,0x40,0x06,0x00,0x00,0x08,0x00, + 0x11,0x30,0x10,0x00,0x61,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x01,0x03,0x02,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x03,0xC8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x39,0x20,0x09, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x3F,0x2A,0x2A, + 0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x2A,0x3F,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x20,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44, + 0xC8,0x61,0x14,0x44,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xB0,0xAA,0xAB, + 0x21,0x2C,0xAA,0xAB,0x42,0xB4,0xA9,0xAB,0x63,0x28,0xA9,0xAB,0x84,0xB8,0xA8,0xAB, + 0xA5,0xA4,0xA5,0xAB,0xC6,0x3C,0xA5,0xAB,0xE7,0xA0,0xA4,0xAB,0x08,0x41,0xA4,0xAB, + 0x29,0x9D,0xA3,0xAB,0x4A,0x45,0xA3,0xAB,0x6B,0x99,0xA2,0xAB,0x8C,0x49,0xA2,0xAB, + 0xAD,0x95,0xA1,0xAB,0xCE,0x4D,0xA0,0xAB,0xEF,0x11,0xA0,0xAB,0x10,0x52,0xA0,0xAB, + 0x31,0x0E,0xA0,0xAB,0x52,0x56,0xA0,0xAB,0x73,0x0A,0xA0,0xAB,0x94,0x5A,0xA0,0xAB, + 0xB5,0x06,0xA0,0xAB,0xD6,0x02,0xA0,0xAB,0xF7,0x02,0xA0,0xAB,0x00,0x08,0x00,0x00, + 0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x80,0x01,0x00,0x00, + 0x00,0x00,0x03,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x60,0x00,0x00,0x00, + 0x00,0x00,0x0C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x00,0x00, + 0x00,0x00,0x30,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x06,0x00,0x00,0x00, + 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x3E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x6C,0x68,0x04,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x60,0x30,0x60,0x30, + 0x00,0x00,0x00,0x00,0x57,0x50,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x9B,0x00,0x00, + 0xC0,0x92,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x99,0x00,0x00,0x00,0x04,0x00,0x00,0x7D,0x00,0x44,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xx/ist30xx.c b/drivers/input/touchscreen/ist30xx/ist30xx.c new file mode 100644 index 00000000..81c6f297 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx.c @@ -0,0 +1,1625 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_tracking.h" + +#ifdef CONFIG_OF +#include +#include +#endif + +#if IST30XX_DEBUG +#include "ist30xx_misc.h" +#endif +#if SEC_FACTORY_MODE +#include "ist30xx_sec.h" +extern int sec_touch_sysfs(struct ist30xx_data *data); +extern int sec_fac_cmd_init(struct ist30xx_data *data); +#endif + +#define TOUCH_BOOSTER 0 +#define MAX_ERR_CNT (100) + +#if TOUCH_BOOSTER +#include +//#include +extern int _store_cpu_num_min_limit(unsigned int input); +struct cpufreq_limit_handle *min_handle = NULL; +static const unsigned long touch_cpufreq_lock = 1200000; +#endif + +#if IST30XX_USE_KEY +int ist30xx_key_code[] = { 0, KEY_MENU, KEY_BACK }; +#endif + +DEFINE_MUTEX(ist30xx_mutex); + +volatile bool ist30xx_irq_working = false; +static bool ist30xx_initialized = 0; +struct ist30xx_data *ts_data; +static struct delayed_work work_reset_check; +#if IST30XX_EVENT_MODE +static struct delayed_work work_noise_protect, work_debug_algorithm; +#endif + +static int ist30xx_ta_status = -1; +static int ist30xx_noise_mode = -1; + +#if IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +static struct delayed_work work_fw_update; +#endif + +int ist30xx_report_rate = -1; +int ist30xx_idle_rate = -1; + +u32 event_ms = 0, timer_ms = 0; +int ist30xx_scan_retry = 0; + +#if IST30XX_EVENT_MODE +static struct timer_list event_timer; +static struct timespec t_current; // ns +int timer_period_ms = 500; // 0.5sec +# define EVENT_TIMER_INTERVAL (HZ * timer_period_ms / 1000) +#endif // IST30XX_EVENT_MODE + +#if IST30XX_DEBUG +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; +#endif + +int ist30xx_dbg_level = IST30XX_DEBUG_LEVEL; +void tsp_printk(int level, const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + int r; + + if (ist30xx_dbg_level < level) + return; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + r = printk("%s %pV", IST30XX_DEBUG_TAG, &vaf); + + va_end(args); +} + +long get_milli_second(void) +{ +#if IST30XX_EVENT_MODE + ktime_get_ts(&t_current); + + return t_current.tv_sec * 1000 + t_current.tv_nsec / 1000000; +#else + return 0; +#endif // IST30XX_EVENT_MODE +} + +int ist30xx_intr_wait(long ms) +{ + long start_ms = get_milli_second(); + long curr_ms = 0; + + while (1) { + if (!ist30xx_irq_working) + break; + + curr_ms = get_milli_second(); + if ((curr_ms < 0) || (start_ms < 0) || (curr_ms - start_ms > ms)) { + tsp_info("%s() timeout(%dms)\n", __func__, ms); + return -EPERM; + } + + msleep(2); + } + return 0; +} + + +void ist30xx_disable_irq(struct ist30xx_data *data) +{ + if (likely(data->irq_enabled)) { + ist30xx_tracking(TRACK_INTR_DISABLE); + disable_irq(data->client->irq); + data->irq_enabled = 0; + data->status.event_mode = false; + } +} + +void ist30xx_enable_irq(struct ist30xx_data *data) +{ + if (likely(!data->irq_enabled)) { + ist30xx_tracking(TRACK_INTR_ENABLE); + enable_irq(data->client->irq); + msleep(10); + data->irq_enabled = 1; + data->status.event_mode = true; + } +} + + +int ist30xx_max_error_cnt = MAX_ERR_CNT; +int ist30xx_error_cnt = 0; +void ist30xx_scheduled_reset(void) +{ + if (ist30xx_initialized) + schedule_delayed_work(&work_reset_check, 0); +} + +static void ist30xx_request_reset(void) +{ + ist30xx_error_cnt++; + if (unlikely(ist30xx_error_cnt >= ist30xx_max_error_cnt)) { + tsp_info("%s()\n", __func__); + ist30xx_scheduled_reset(); + ist30xx_error_cnt = 0; + } +} + + +#define NOISE_MODE_TA (0) +#define NOISE_MODE_CALL (1) +#define NOISE_MODE_COVER (2) +void ist30xx_start(struct ist30xx_data *data) +{ + if (ist30xx_initialized) { + ist30xx_noise_mode &= ~(1 << NOISE_MODE_TA); + ist30xx_noise_mode |= (ist30xx_ta_status << NOISE_MODE_TA); + + ist30xx_tracking(ist30xx_ta_status ? + TRACK_CMD_TACON : TRACK_CMD_TADISCON); + + ist30xx_write_cmd(data->client, CMD_SET_NOISE_MODE, ist30xx_noise_mode); + +#if IST30XX_EVENT_MODE + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +#endif + } + tsp_info("%s(), mode : 0x%x\n", __func__, ist30xx_noise_mode); + + if (ist30xx_report_rate >= 0) { + ist30xx_write_cmd(data->client, CMD_SET_REPORT_RATE, ist30xx_report_rate); + tsp_info(" reporting rate : %dus\n", ist30xx_report_rate); + } + + if (ist30xx_idle_rate >= 0) { + ist30xx_write_cmd(data->client, CMD_SET_IDLE_TIME, ist30xx_idle_rate); + tsp_info(" reporting rate : %dus\n", ist30xx_idle_rate); + } + + ist30xx_cmd_start_scan(data->client); +} + + +int ist30xx_get_ver_info(struct ist30xx_data *data) +{ + int ret; + + data->fw.prev_core_ver = data->fw.core_ver; + data->fw.prev_param_ver = data->fw.param_ver; + data->fw.core_ver = data->fw.param_ver = 0; + + ret = ist30xx_read_cmd(data->client, CMD_GET_FW_VER, &data->fw.core_ver); + if (unlikely(ret)) + return ret; + + ret = ist30xx_read_cmd(data->client, CMD_GET_PARAM_VER, &data->fw.param_ver); + if (unlikely(ret)) + return ret; + + ret = ist30xx_read_cmd(data->client, CMD_GET_SUB_VER, &data->fw.sub_ver); + if (unlikely(ret)) + return ret; + + tsp_info("IC version read core: %x, param: %x, sub: %x\n", + data->fw.core_ver, data->fw.param_ver, data->fw.sub_ver); + + return 0; +} + + +int ist30xx_init_touch_driver(struct ist30xx_data *data) +{ + int ret = 0; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + + ret = ist30xx_cmd_run_device(data->client, true); + if (unlikely(ret)) + goto init_touch_end; + + ist30xx_get_ver_info(data); + +init_touch_end: + ist30xx_start(data); + + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return ret; +} + + +#if IST30XX_DEBUG +void ist30xx_print_info(void) +{ + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + + tsp_info("*** TSP/TKEY info ***\n"); + tsp_info("tscn dir swap: %d, flip x: %d, y: %d\n", + tsp->dir.swap_xy, tsp->dir.flip_x, tsp->dir.flip_y); + tsp_info("tscn ch_num tx: %d, rx: %d\n", + tsp->ch_num.tx, tsp->ch_num.rx); + tsp_info("tscn width: %d, height: %d\n", + tsp->width, tsp->height); + tsp_info("tkey enable: %d, key num: %d, axis rx: %d \n", + tkey->enable, tkey->key_num, tkey->axis_rx); + tsp_info("tkey ch_num[0] %d, [1] %d, [2] %d, [3] %d, [4] %d\n", + tkey->ch_num[0], tkey->ch_num[1], tkey->ch_num[2], + tkey->ch_num[3], tkey->ch_num[4]); +} +#endif + +#define CALIB_MSG_MASK (0xF0000FFF) +#define CALIB_MSG_VALID (0x80000CAB) +#define TRACKING_INTR_VALID (0x127EA597) +u32 tracking_intr_value = TRACKING_INTR_VALID; +extern const u8 *ts_fw; +extern u32 ts_fw_size; +int ist30xx_get_info(struct ist30xx_data *data) +{ + int ret; + u32 calib_msg; + u32 ms; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + +#if IST30XX_INTERNAL_BIN +# if IST30XX_DEBUG + ist30xx_get_tsp_info(data); + ist30xx_get_tkey_info(data); +#endif // IST30XX_DEBUG +#else + ret = ist30xx_cmd_run_device(data->client, false); + if (unlikely(ret)) + goto get_info_end; + + ret = ist30xx_get_ver_info(data); + if (unlikely(ret)) + goto get_info_end; + +#if IST30XX_DEBUG + ret = ist30xx_tsp_update_info(); + if (unlikely(ret)) + goto get_info_end; + + ret = ist30xx_tkey_update_info(); + if (unlikely(ret)) + goto get_info_end; +#endif // IST30XX_DEBUG +#endif // IST30XX_INTERNAL_BIN + +#if IST30XX_DEBUG + ist30xx_print_info(); + data->max_fingers = ist30xx_tsp_info.finger_num; + data->max_keys = ist30xx_tkey_info.key_num; +#endif // IST30XX_DEBUG + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &calib_msg); + if (likely(ret == 0)) { + tsp_info("calib status: 0x%08x\n", calib_msg); + ms = get_milli_second(); + ist30xx_put_track_ms(ms); + ist30xx_put_track(&tracking_intr_value, 1); + ist30xx_put_track(&calib_msg, 1); + if ((calib_msg & CALIB_MSG_MASK) != CALIB_MSG_VALID || + CALIB_TO_STATUS(calib_msg) > 0) { + ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY); + + ist30xx_cmd_run_device(data->client, true); + } + } + +#if (IST30XX_EVENT_MODE && IST30XX_CHECK_CALIB) + if (likely(!data->status.update)) { + ret = ist30xx_cmd_check_calib(data->client); + if (likely(!ret)) { + data->status.calib = 1; + data->status.calib_msg = 0; + event_ms = (u32)get_milli_second(); + data->status.event_mode = true; + } + } +#else + ist30xx_start(ts_data); +#endif + +#if !(IST30XX_INTERNAL_BIN) +get_info_end: +#endif + if (likely(ret == 0)) + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return ret; +} + + +#define PRESS_MSG_MASK (0x01) +#define MULTI_MSG_MASK (0x02) +#define PRESS_MSG_KEY (0x6) + +#define TOUCH_DOWN_MESSAGE ("p") +#define TOUCH_UP_MESSAGE ("r") +#define TOUCH_MOVE_MESSAGE (" ") +bool tsp_touched[IST30XX_MAX_MT_FINGERS] = { false, }; +bool tkey_pressed[IST30XX_MAX_KEYS] = { false, }; + +void print_tsp_event(finger_info *finger) +{ + int idx = finger->bit_field.id - 1; + bool press; +#if TOUCH_BOOSTER + static finger_cnt = 0; +#endif + +#if IST30XX_EXTEND_COORD + press = PRESSED_FINGER(ts_data->t_status, finger->bit_field.id); +#else + press = (finger->bit_field.udmg & PRESS_MSG_MASK) ? true : false; +#endif + if(idx < 0){ + tsp_info("id value is minus! something is wrong...please check FW status!\n"); + return; + } + if (press) { + if (tsp_touched[idx] == false) { // touch down +#if TOUCH_BOOSTER + //if(!finger_cnt) + { + if(!min_handle) + { + min_handle = cpufreq_limit_min_freq(touch_cpufreq_lock, "TSP"); + if (IS_ERR(min_handle)) { + printk(KERN_ERR "[TSP] cannot get cpufreq_min lock %lu(%d)\n", + touch_cpufreq_lock, PTR_ERR(min_handle)); + min_handle = NULL; + } + _store_cpu_num_min_limit(2); + tsp_info("cpu freq on\n"); + } + } + finger_cnt ++; +#endif +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + tsp_info("%s%d (%d, %d)\n", + TOUCH_DOWN_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); +#else + tsp_info("touch down\n"); +#endif + tsp_touched[idx] = true; + } else { // touch move +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + tsp_info("%s%d (%d, %d)\n", + TOUCH_MOVE_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); +#else + tsp_info("touch move\n"); +#endif + } + } else { + if (tsp_touched[idx] == true) { // touch up +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + tsp_info("%s%d (%d, %d)\n", + TOUCH_UP_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); +#else + tsp_info("touch up\n"); +#endif + tsp_touched[idx] = false; +#if TOUCH_BOOSTER + finger_cnt --; + if(!finger_cnt) + { + //printk(KERN_ERR "[TOUCH_BOOSTER]%s %d\n",__func__,__LINE__); + cpufreq_limit_put(min_handle); + min_handle = NULL; + _store_cpu_num_min_limit(1); + tsp_info("cpu freq off\n"); + } +#endif + } + } +} + +void print_tkey_event(int id) +{ +#if IST30XX_EXTEND_COORD + int idx = id - 1; + bool press = PRESSED_KEY(ts_data->t_status, id); + + if (press) { + if (tkey_pressed[idx] == false) { // tkey down + tsp_info("k %s%d \n", TOUCH_DOWN_MESSAGE, id); + tkey_pressed[idx] = true; + } + } else { + if (tkey_pressed[idx] == true) { // tkey up + tsp_info("k %s%d \n", TOUCH_UP_MESSAGE, id); + tkey_pressed[idx] = false; + } + } +#endif +} + + +#if IST30XX_EXTEND_COORD +static void release_finger(int id) +{ + input_mt_slot(ts_data->input_dev, id - 1); + input_mt_report_slot_state(ts_data->input_dev, MT_TOOL_FINGER, false); + + ist30xx_tracking(TRACK_POS_FINGER + id); + tsp_info("%s() %d\n", __func__, id); + + tsp_touched[id - 1] = false; + + input_sync(ts_data->input_dev); +} +#else +static void release_finger(finger_info *finger) +{ + input_mt_slot(ts_data->input_dev, finger->bit_field.id - 1); + input_mt_report_slot_state(ts_data->input_dev, MT_TOOL_FINGER, false); + + ist30xx_tracking(TRACK_POS_FINGER + finger->bit_field.id); +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + tsp_info("%s() %d(%d, %d)\n", __func__, + finger->bit_field.id, finger->bit_field.x, finger->bit_field.y); +#else + tsp_info("%s\n",__func__); +#endif + finger->bit_field.udmg &= ~(PRESS_MSG_MASK); + print_tsp_event(finger); + + finger->bit_field.id = 0; + + input_sync(ts_data->input_dev); +} +#endif + + +#define CANCEL_KEY (0xff) +#define RELEASE_KEY (0) +#if IST30XX_EXTEND_COORD +static void release_key(int id, u8 key_status) +{ + input_report_key(ts_data->input_dev, ist30xx_key_code[id], key_status); + + ist30xx_tracking(TRACK_POS_KEY + id); + tsp_debug("%s() key%d, status: %d\n", __func__, id, key_status); + + tkey_pressed[id - 1] = false; + + input_sync(ts_data->input_dev); +} +#else +static void release_key(finger_info *key, u8 key_status) +{ + int id = key->bit_field.id; + + input_report_key(ts_data->input_dev, ist30xx_key_code[id], key_status); + + ist30xx_tracking(TRACK_POS_KEY + id); +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + tsp_info("%s() key%d, event: %d, status: %d\n", __func__, + id, key->bit_field.w, key_status); +#else + tsp_info("%s\n",__func__); +#endif + key->bit_field.id = 0; + + input_sync(ts_data->input_dev); +} +#endif + +static void clear_input_data(struct ist30xx_data *data) +{ +#if IST30XX_EXTEND_COORD + int id = 1; + u32 status; + + status = PARSE_FINGER_STATUS(data->t_status); + while (status) { + if (status & 1) + release_finger(id); + status >>= 1; + id++; + } + + id = 1; + status = PARSE_KEY_STATUS(data->t_status); + while (status) { + if (status & 1) + release_key(id, RELEASE_KEY); + status >>= 1; + id++; + } + data->t_status = 0; +#else + int i; + finger_info *fingers = (finger_info *)data->prev_fingers; + finger_info *keys = (finger_info *)data->prev_keys; + + for (i = 0; i < data->num_fingers; i++) { + if (fingers[i].bit_field.id == 0) + continue; + + if (fingers[i].bit_field.udmg & PRESS_MSG_MASK) + release_finger(&fingers[i]); + } + + for (i = 0; i < data->num_keys; i++) { + if (keys[i].bit_field.id == 0) + continue; + + if (keys[i].bit_field.w == PRESS_MSG_KEY) + release_key(&keys[i], RELEASE_KEY); + } +#endif +} + +static int check_report_fingers(struct ist30xx_data *data, int finger_counts) +{ + int i; + finger_info *fingers = (finger_info *)data->fingers; + +#if IST30XX_EXTEND_COORD + /* current finger info */ + for (i = 0; i < finger_counts; i++) { + if (unlikely((fingers[i].bit_field.x > IST30XX_MAX_X) || + (fingers[i].bit_field.y > IST30XX_MAX_Y))) { + tsp_warn("Invalid touch data - %d: %d(%d, %d), 0x%08x\n", i, + fingers[i].bit_field.id, + fingers[i].bit_field.x, + fingers[i].bit_field.y, + fingers[i].full_field); + + fingers[i].bit_field.id = 0; + ist30xx_tracking(TRACK_POS_UNKNOWN); + return -EPERM; + } + } +#else + int j; + bool valid_id; + finger_info *prev_fingers = (finger_info *)data->prev_fingers; + + /* current finger info */ + for (i = 0; i < finger_counts; i++) { + if (unlikely((fingers[i].bit_field.id == 0) || + (fingers[i].bit_field.id > data->max_fingers) || + (fingers[i].bit_field.x > IST30XX_MAX_X) || + (fingers[i].bit_field.y > IST30XX_MAX_Y))) { + tsp_warn("Invalid touch data - %d: %d(%d, %d), 0x%08x\n", i, + fingers[i].bit_field.id, + fingers[i].bit_field.x, + fingers[i].bit_field.y, + fingers[i].full_field); + + fingers[i].bit_field.id = 0; + ist30xx_tracking(TRACK_POS_UNKNOWN); + return -EPERM; + } + } + + /* previous finger info */ + if (data->num_fingers >= finger_counts) { + for (i = 0; i < data->max_fingers; i++) { // prev_fingers + if (prev_fingers[i].bit_field.id != 0 && + (prev_fingers[i].bit_field.udmg & PRESS_MSG_MASK)) { + valid_id = false; + for (j = 0; j < data->max_fingers; j++) { // fingers + if ((prev_fingers[i].bit_field.id) == + (fingers[j].bit_field.id)) { + valid_id = true; + break; + } + } + if (valid_id == false) + release_finger(&prev_fingers[i]); + } + } + } +#endif + + return 0; +} + +#if IST30XX_EXTEND_COORD +static int check_valid_coord(u32 *msg, int cnt) +{ + int ret = 0; + u8 *buf = (u8 *)msg; + u8 chksum1 = msg[0] >> 24; + u8 chksum2 = 0; + + msg[0] &= 0x00FFFFFF; + + cnt *= IST30XX_DATA_LEN; + + while (cnt--) + chksum2 += *buf++; + + if (chksum1 != chksum2) { + tsp_err("intr chksum: %02x, %02x\n", chksum1, chksum2); + ret = -EPERM; + } + + return (chksum1 == chksum2) ? 0 : -EPERM; +} +#endif + + +static void report_input_data(struct ist30xx_data *data, int finger_counts, int key_counts) +{ + int id; + bool press = false; + finger_info *fingers = (finger_info *)data->fingers; + +#if IST30XX_EXTEND_COORD + int idx = 0; + u32 status; + + status = PARSE_FINGER_STATUS(data->t_status); + for (id = 0; id < data->max_fingers; id++) { + press = (status & (1 << id)) ? true : false; + + input_mt_slot(data->input_dev, id); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, press); + + fingers[idx].bit_field.id = id + 1; + print_tsp_event(&fingers[idx]); + + if (press == false) + continue; + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, + fingers[idx].bit_field.x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, + fingers[idx].bit_field.y); + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, + fingers[idx].bit_field.area); + idx++; + } + +#if IST30XX_USE_KEY + status = PARSE_KEY_STATUS(data->t_status); + for (id = 0; id < data->max_keys; id++) { + press = (status & (1 << id)) ? true : false; + + input_report_key(data->input_dev, ist30xx_key_code[id+1], press); + + print_tkey_event(id + 1); + } +#endif // IST30XX_USE_KEY + +#else // IST30XX_EXTEND_COORD + int i; + + memset(data->prev_fingers, 0, sizeof(data->prev_fingers)); + + for (i = 0; i < finger_counts; i++) { + press = (fingers[i].bit_field.udmg & PRESS_MSG_MASK) ? true : false; + + print_tsp_event(&fingers[i]); + + input_mt_slot(data->input_dev, fingers[i].bit_field.id - 1); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, press); + + if (press) { + input_report_abs(data->input_dev, ABS_MT_POSITION_X, + fingers[i].bit_field.x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, + fingers[i].bit_field.y); + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, + fingers[i].bit_field.w); + } + + data->prev_fingers[i] = fingers[i]; + } + +#if IST30XX_USE_KEY + for (i = finger_counts; i < finger_counts + key_counts; i++) { + id = fingers[i].bit_field.id; + press = (fingers[i].bit_field.w == PRESS_MSG_KEY) ? true : false; +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + tsp_info("key(%08x) id: %d, press: %d, val: (%d, %d)\n", + fingers[i].full_field, id, press, + fingers[i].bit_field.x, fingers[i].bit_field.y); +#else + tsp_info("key press: %d\n",press); +#endif + input_report_key(data->input_dev, ist30xx_key_code[id], press); + + data->prev_keys[id - 1] = fingers[i]; + } +#endif // IST30XX_USE_KEY + + data->num_fingers = finger_counts; + data->num_keys = key_counts; +#endif // IST30XX_EXTEND_COORD + + ist30xx_error_cnt = 0; + ist30xx_scan_retry = 0; + + input_sync(data->input_dev); +} + +/* + * CMD : CMD_GET_COORD + * + * IST30XX_EXTEND_COORD == 0 (IST3026, IST3032, IST3026B, IST3032B) + * + * [31:30] [29:26] [25:16] [15:10] [9:0] + * Multi(1st) UDMG Rsvd. NumOfKey Rsvd. NumOfFinger + * Single & UDMG ID X Area Y + * Multi(2nd) + * + * UDMG [31] 0/1 : single/multi + * UDMG [30] 0/1 : unpress/press + * + * IST30XX_EXTEND_COORD == 1 (IST3038, IST3044) + * + * 1st [31:24] [23:21] [20:16] [15:12] [11:10] [9:0] + * '0x71' KeyCnt KeyStatus FingerCnt Rsvd. FingerStatus + * 2nd [31:28] [27:24] [23:12] [11:0] + * ID Area X Y + */ +u32 intr_debug_addr = 0; +u32 intr_debug_size = 0; +static irqreturn_t ist30xx_irq_thread(int irq, void *ptr) +{ + int i, ret; + int key_cnt, finger_cnt, read_cnt; + struct ist30xx_data *data = ts_data; + +#if EXTEND_COORD_CHECKSUM + u32 msg[IST30XX_MAX_MT_FINGERS + 1]; + int offset = 1; +#else + u32 msg[IST30XX_MAX_MT_FINGERS]; + int offset = 0; +#endif + u32 ms; + + ist30xx_irq_working = true; + + if (unlikely(!data->irq_enabled)) + goto irq_end; + + ms = get_milli_second(); +#if (EXTEND_COORD_CHECKSUM == 0) + if (unlikely((ms >= event_ms) && (ms - event_ms < 6))) // Noise detect + goto irq_end; +#endif + + memset(msg, 0, sizeof(msg)); + + ret = ist30xx_get_position(data->client, msg, 1); + if (unlikely(ret)) + goto irq_err; + + tsp_verb("intr msg: 0x%08x\n", *msg); + + if (unlikely(*msg == 0xE11CE970)) // TSP IC Exception + goto irq_ic_err; + +#if (IST30XX_EXTEND_COORD == 0) + if (unlikely(*msg == 0 || *msg == 0xFFFFFFFF || *msg == 0x2FFF03FF || + *msg == 0x30003000 || *msg == 0x300B300B)) // Unknown CMD + goto irq_err; +#endif + + event_ms = ms; + ist30xx_put_track_ms(event_ms); + ist30xx_put_track(&tracking_intr_value, 1); + ist30xx_put_track(msg, 1); + + if (unlikely((*msg & CALIB_MSG_MASK) == CALIB_MSG_VALID)) { + data->status.calib_msg = *msg; + tsp_info("calib status: 0x%08x\n", data->status.calib_msg); + goto irq_end; + } + + memset(data->fingers, 0, sizeof(data->fingers)); + +#if IST30XX_EXTEND_COORD + /* Unknown interrupt data for extend coordinate */ +#if EXTEND_COORD_CHECKSUM + if (unlikely(!CHECK_INTR_STATUS3(*msg))) + goto irq_err; +#else + if (unlikely(!CHECK_INTR_STATUS1(*msg) || !CHECK_INTR_STATUS2(*msg))) + goto irq_err; +#endif + + data->t_status = *msg; + key_cnt = PARSE_KEY_CNT(data->t_status); + finger_cnt = PARSE_FINGER_CNT(data->t_status); +#else + data->fingers[0].full_field = *msg; + key_cnt = 0; + finger_cnt = 1; +#endif + + read_cnt = finger_cnt; + +#if (IST30XX_EXTEND_COORD == 0) + if (data->fingers[0].bit_field.udmg & MULTI_MSG_MASK) { + key_cnt = data->fingers[0].bit_field.x; + finger_cnt = data->fingers[0].bit_field.y; + read_cnt = finger_cnt + key_cnt; +#endif + { + if (unlikely((finger_cnt > data->max_fingers) || + (key_cnt > data->max_keys))) { + tsp_warn("Invalid touch count - finger: %d(%d), key: %d(%d)\n", + finger_cnt, data->max_fingers, key_cnt, data->max_keys); + goto irq_err; + } + + //tsp_info("read: %d (f:%d, k:%d)\n", read_cnt, finger_cnt, key_cnt); + if (read_cnt > 0) { +#if I2C_BURST_MODE + ret = ist30xx_get_position(data->client, &msg[offset], read_cnt); + if (unlikely(ret)) + goto irq_err; + + for (i = 0; i < read_cnt; i++) + data->fingers[i].full_field = msg[i + offset]; +#else + for (i = 0; i < read_cnt; i++) { + ret = ist30xx_get_position(data->client, &msg[i + offset], 1); + if (unlikely(ret)) + goto irq_err; + + data->fingers[i].full_field = msg[i + offset]; + } +#endif // I2C_BURST_MODE + + ist30xx_put_track(msg, read_cnt); + } + } + +#if (IST30XX_EXTEND_COORD == 0) + } +#endif + +#if EXTEND_COORD_CHECKSUM + ret = check_valid_coord(&msg[0], read_cnt + 1); + if (unlikely(ret < 0)) + goto irq_err; +#endif + + if (unlikely(check_report_fingers(data, finger_cnt))) + goto irq_end; + +#if IST30XX_EXTEND_COORD + report_input_data(data, finger_cnt, key_cnt); +#else + if (likely(read_cnt > 0)) + report_input_data(data, finger_cnt, key_cnt); +#endif + + if (intr_debug_addr > 0 && intr_debug_size > 0) { + ret = ist30xxb_burst_read(ts_data->client, + intr_debug_addr, &msg[0], intr_debug_size); + for (i = 0; i < intr_debug_size; i++) + tsp_debug("\t%08x\n", msg[i]); + } + + goto irq_end; + +irq_err: + tsp_err("intr msg: 0x%08x, ret: %d\n", msg[0], ret); + ist30xx_request_reset(); +irq_end: + ist30xx_irq_working = false; + event_ms = (u32)get_milli_second(); + return IRQ_HANDLED; + +irq_ic_err: + tsp_err("Occured IC exception\n"); + ist30xx_scheduled_reset(); + ist30xx_irq_working = false; + event_ms = (u32)get_milli_second(); + return IRQ_HANDLED; +} + + +#ifdef CONFIG_HAS_EARLYSUSPEND +#define ist30xx_suspend NULL +#define ist30xx_resume NULL +static void ist30xx_early_suspend(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + +#if IST30XX_EVENT_MODE + del_timer_sync(&event_timer); +#endif + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + clear_input_data(data); + +#if TOUCH_BOOSTER + if(min_handle) + { + printk(KERN_ERR"[TSP] %s %d:: OOPs, Cpu was not in Normal Freq..\n", __func__, __LINE__); + + if (cpufreq_limit_put(min_handle) < 0) { + printk(KERN_ERR "[TSP] Error in scaling down cpu frequency\n"); + } + + min_handle = NULL; + tsp_info("cpu freq off\n"); + } +#endif + + mutex_unlock(&ist30xx_mutex); +} +static void ist30xx_late_resume(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(data); + ist30xx_start(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); +} +#else +static int ist30xx_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + ist30xx_internal_suspend(data); +#if TOUCH_BOOSTER + if(min_handle) + { + printk(KERN_ERR"[TSP] %s %d:: OOPs, Cpu was not in Normal Freq..\n", __func__, __LINE__); + + if (cpufreq_limit_put(min_handle) < 0) { + printk(KERN_ERR "[TSP] Error in scaling down cpu frequency\n"); + } + + min_handle = NULL; + tsp_info("cpu freq off\n"); + } +#endif + + return 0; +} +static int ist30xx_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + return ist30xx_internal_resume(data); +} +#endif // CONFIG_HAS_EARLYSUSPEND + +static void ist30xx_shutdown(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + + if(ist30xx_initialized) + { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + mutex_unlock(&ist30xx_mutex); + + del_timer_sync(&event_timer); + } + +} + +/* Enable the ta mode in mfd and enable in driver*/ +void ist30xx_set_ta_mode(bool charging) +{ + tsp_info("%s(), charging = %d\n", __func__, charging); + + if (unlikely(charging == ist30xx_ta_status)) + return; + + if (unlikely(ist30xx_noise_mode == -1)) { + ist30xx_ta_status = charging ? 1 : 0; + return; + } + + ist30xx_ta_status = charging ? 1 : 0; + + ist30xx_scheduled_reset(); +} +EXPORT_SYMBOL(ist30xx_set_ta_mode); + +void ist30xx_set_call_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ist30xx_noise_mode >> NOISE_MODE_CALL) & 1))) + return; + + ist30xx_noise_mode &= ~(1 << NOISE_MODE_CALL); + if (mode) + ist30xx_noise_mode |= (1 << NOISE_MODE_CALL); + + ist30xx_scheduled_reset(); + } +EXPORT_SYMBOL(ist30xx_set_call_mode); + +void ist30xx_set_cover_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ist30xx_noise_mode >> NOISE_MODE_COVER) & 1))) + return; + + ist30xx_noise_mode &= ~(1 << NOISE_MODE_COVER); + if (mode) + ist30xx_noise_mode |= (1 << NOISE_MODE_COVER); + + ist30xx_scheduled_reset(); +} +EXPORT_SYMBOL(ist30xx_set_cover_mode); + +static void reset_work_func(struct work_struct *work) +{ + if (unlikely((ts_data == NULL) || (ts_data->client == NULL))) + return; + + tsp_info("Request reset function\n"); + + if (likely((ist30xx_initialized == 1) && (ts_data->status.power == 1) && + (ts_data->status.update != 1) && (ts_data->status.calib != 1))) { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + + clear_input_data(ts_data); + + ist30xx_cmd_run_device(ts_data->client, true); + + ist30xx_start(ts_data); + + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + } +} + +#if IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +static void fw_update_func(struct work_struct *work) +{ + if (unlikely((ts_data == NULL) || (ts_data->client == NULL))) + return; + + tsp_info("FW update function\n"); + + if (likely(ist30xx_auto_bin_update(ts_data))) + ist30xx_disable_irq(ts_data); +} +#endif // IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE + + +#if IST30XX_EVENT_MODE +u32 ist30xx_max_scan_retry = 2; +u32 ist30xx_scan_count = 0; +u32 ist30xx_algr_addr = 0, ist30xx_algr_size = 0; + +#define SCAN_STATUS_MAGIC (0x3C000000) +#define SCAN_STATUS_MASK (0xFF000000) +#define FINGER_CNT_MASK (0x00F00000) +#define SCAN_CNT_MASK (0x000FFFFF) +#define GET_FINGER_CNT(k) ((k & FINGER_CNT_MASK) >> 20) +#define GET_SCAN_CNT(k) (k & SCAN_CNT_MASK) + +static void noise_work_func(struct work_struct *work) +{ +#if IST30XX_NOISE_MODE + int ret; + u32 scan_status = 0; +#if (IST30XX_EXTEND_COORD == 0) + int i; +#endif + + ret = ist30xx_read_cmd(ts_data->client, IST30XXB_MEM_COUNT, &scan_status); + if (unlikely(ret)) { + tsp_warn("Mem scan count read fail!\n"); + goto retry_timer; + } + + ist30xx_put_track_ms(timer_ms); + ist30xx_put_track(&scan_status, 1); + + tsp_verb("scan status: 0x%x\n", scan_status); + + /* Check valid scan count */ + if (unlikely((scan_status & SCAN_STATUS_MASK) != SCAN_STATUS_MAGIC)) { + tsp_warn("Scan status is not corrected! (0x%08x)\n", scan_status); + goto retry_timer; + } + + /* Status of IC is idle */ + if (GET_FINGER_CNT(scan_status) == 0) { +#if IST30XX_EXTEND_COORD + if ((PARSE_FINGER_CNT(ts_data->t_status) > 0) || + (PARSE_KEY_CNT(ts_data->t_status) > 0)) + clear_input_data(ts_data); +#else + for (i = 0; i < IST30XX_MAX_MT_FINGERS; i++) { + if (ts_data->prev_fingers[i].bit_field.id == 0) + continue; + + if (ts_data->prev_fingers[i].bit_field.udmg & PRESS_MSG_MASK) { + tsp_warn("prev_fingers: 0x%08x\n", + ts_data->prev_fingers[i].full_field); + release_finger(&ts_data->prev_fingers[i]); + } + } + + for (i = 0; i < IST30XX_MAX_MT_FINGERS; i++) { + if (ts_data->prev_keys[i].bit_field.id == 0) + continue; + + if (ts_data->prev_keys[i].bit_field.w == PRESS_MSG_KEY) { + tsp_warn("prev_keys: 0x%08x\n", + ts_data->prev_keys[i].full_field); + release_key(&ts_data->prev_keys[i], RELEASE_KEY); + } + } +#endif + } + + scan_status &= SCAN_CNT_MASK; + + /* Status of IC is lock-up */ + if (unlikely(scan_status == ist30xx_scan_count)) { + tsp_warn("TSP IC is not responded! (0x%08x)\n", scan_status); + goto retry_timer; + } else { + ist30xx_scan_retry = 0; + } + + ist30xx_scan_count = scan_status; + + return; + +retry_timer: + ist30xx_scan_retry++; + tsp_warn("Retry scan status!(%d)\n", ist30xx_scan_retry); + + if (unlikely(ist30xx_scan_retry == ist30xx_max_scan_retry)) { + ist30xx_scheduled_reset(); + ist30xx_scan_retry = 0; + } +#endif // IST30XX_NOISE_MODE +} + +static void debug_work_func(struct work_struct *work) +{ + int ret = -EPERM; + ALGR_INFO algr; + u32 *buf32 = (u32 *)&algr; + + ret = ist30xxb_burst_read(ts_data->client, + ist30xx_algr_addr, (u32 *)&algr, ist30xx_algr_size); + if (unlikely(ret)) { + tsp_warn("Algorithm mem addr read fail!\n"); + return; + } + + ist30xx_put_track(buf32, ist30xx_algr_size); + + tsp_debug(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", + buf32[0], buf32[1], buf32[2], buf32[3], buf32[4]); + + tsp_debug(" Scanstatus: %x\n", algr.scan_status); + tsp_debug(" TouchCnt: %d\n", algr.touch_cnt); + tsp_debug(" IntlTouchCnt: %d\n", algr.intl_touch_cnt); + tsp_debug(" StatusFlag: %d\n", algr.status_flag); + tsp_debug(" RAWPeakMax: %d\n", algr.raw_peak_max); + tsp_debug(" RAWPeakMin: %d\n", algr.raw_peak_min); + tsp_debug(" FLTPeakMax: %d\n", algr.flt_peak_max); + tsp_debug(" AdptThreshold: %d\n", algr.adpt_threshold); + tsp_debug(" KeyRawData0: %d\n", algr.key_raw_data[0]); + tsp_debug(" KeyRawData1: %d\n", algr.key_raw_data[1]); +} + +void timer_handler(unsigned long data) +{ + struct ist30xx_status *status = &ts_data->status; + + if (ist30xx_irq_working) + goto restart_timer; + + if (status->event_mode) { + if (likely((status->power == 1) && (status->update != 1))) { + timer_ms = (u32)get_milli_second(); + if (unlikely(status->calib == 1)) { + if (timer_ms - event_ms >= 3000) { // 3second + tsp_debug("calibration timeout over 3sec\n"); + schedule_delayed_work(&work_reset_check, 0); + status->calib = 0; + } + } else if (likely(status->noise_mode)) { + if (timer_ms - event_ms > 100) // 100ms after last interrupt + schedule_delayed_work(&work_noise_protect, 0); + } + + if ((ist30xx_algr_addr >= IST30XXB_ACCESS_ADDR) && + (ist30xx_algr_size > 0)) + schedule_delayed_work(&work_debug_algorithm, 0); + } + } + +restart_timer: + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +} +#endif // IST30XX_EVENT_MODE + + +static int __init ist30xx_probe(struct i2c_client * client, + const struct i2c_device_id * id) +{ + int ret; + int retry = 3; + struct ist30xx_data *data; + struct input_dev *input_dev; + int ist_gpio = 0; + + tsp_info ("IST3038 Probe Called\n"); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_INFO "i2c_check_functionality error\n"); + return -EIO; + } + + tsp_info("%s(), the i2c addr=0x%x", __func__, client->addr); + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + +#ifdef CONFIG_OF + + struct device_node *np = client->dev.of_node; + + tsp_info("[TSP] the client->dev.of_node=0x%x\n", client->dev.of_node); + + if (client->dev.of_node){ + ist_gpio = of_get_gpio(np, 0); + printk("[TSP] gpio id=%d", ist_gpio); + } +#endif + + input_dev = input_allocate_device(); + if (unlikely(!input_dev)) { + ret = -ENOMEM; + tsp_err("%s(), input_allocate_device failed (%d)\n", __func__, ret); + goto err_alloc_dev; + } + +#ifndef CONFIG_OF + ist_gpio = 82; +#endif + + /* configure touchscreen interrupt gpio */ + ret = gpio_request(ist_gpio, "ist30xx_irq_gpio"); + printk("[TSP]request gpio id = %d\n", ist_gpio); + if (ret) { + tsp_err("unable to request gpio.(%s)\r\n",input_dev->name); + goto err_init_drv; + } + + client->irq = gpio_to_irq(ist_gpio); + printk("[TSP] client->irq : %d\n", client->irq); + + data->max_fingers = data->max_keys = IST30XX_MAX_MT_FINGERS; + data->irq_enabled = 1; + data->client = client; + data->input_dev = input_dev; + i2c_set_clientdata(client, data); + + input_mt_init_slots(input_dev, IST30XX_MAX_MT_FINGERS,0); + + input_dev->name = "ist30xx_ts_input"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + set_bit(EV_ABS, input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, IST30XX_MAX_X, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, IST30XX_MAX_Y, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, IST30XX_MAX_W, 0, 0); + +#if IST30XX_USE_KEY + { + int i; + set_bit(EV_KEY, input_dev->evbit); + set_bit(EV_SYN, input_dev->evbit); + for (i = 1; i < ARRAY_SIZE(ist30xx_key_code); i++) + set_bit(ist30xx_key_code[i], input_dev->keybit); + } +#endif + + input_set_drvdata(input_dev, data); + ret = input_register_device(input_dev); + if (unlikely(ret)) { + input_free_device(input_dev); + goto err_reg_dev; + } + + + ts_data = data; + + ret = ist30xx_init_system(); + if (unlikely(ret)) { + dev_err(&client->dev, "chip initialization failed\n"); + goto err_init_drv; + } + + ret = ist30xx_init_update_sysfs(); + if (unlikely(ret)) + goto err_init_drv; + +#if IST30XX_DEBUG + ret = ist30xx_init_misc_sysfs(); + if (unlikely(ret)) + goto err_init_drv; +#endif + +#if SEC_FACTORY_MODE + ret = sec_fac_cmd_init(data); + if (unlikely(ret)) + goto err_init_drv; + ret = sec_touch_sysfs(data); + if (unlikely(ret)) + goto err_init_drv; +#endif + +#if IST30XX_TRACKING_MODE + ret = ist30xx_init_tracking_sysfs(); + if (unlikely(ret)) + goto err_init_drv; +#endif + + ret = request_threaded_irq(client->irq, NULL, ist30xx_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "ist30xx_ts", data); + if (unlikely(ret)) + goto err_irq; + //sprd_i2c_ctl_chg_clk(1, 400000); // up h/w i2c 1 400k + ist30xx_disable_irq(data); + + while ((data->chip_id != IST30XXB_CHIP_ID) && + (data->chip_id != IST3038_CHIP_ID)) { + ret = ist30xx_read_cmd(data->client, IST30XXB_REG_CHIPID, &data->chip_id); + if (unlikely(ret)) { + tsp_info("tspid: %x\n", data->chip_id); + ist30xx_reset(); + } + + if (data->chip_id == 0x3000B) data->chip_id = IST30XXB_CHIP_ID; + + if (retry-- == 0) + break; + } + + retry = 3; + while (retry-- > 0) { + ret = ist30xx_read_cmd(data->client, IST30XXB_REG_TSPTYPE, + &data->tsp_type); + + tsp_info("tsptype: %x\n", data->tsp_type); + data->tsp_type = IST30XXB_PARSE_TSPTYPE(data->tsp_type); + + if (likely(ret == 0)) + break; + + data->tsp_type = TSP_TYPE_UNKNOWN; + } + + tsp_info("TSP IC: %x, TSP Vendor: %x\n", data->chip_id, data->tsp_type); + + data->status.event_mode = false; + +#if IST30XX_INTERNAL_BIN +# if IST30XX_UPDATE_BY_WORKQUEUE + INIT_DELAYED_WORK(&work_fw_update, fw_update_func); + schedule_delayed_work(&work_fw_update, IST30XX_UPDATE_DELAY); +# else + ret = ist30xx_auto_bin_update(data); + if (unlikely(ret != 0)) + goto err_irq; +# endif +#endif // IST30XX_INTERNAL_BIN + + if (ist30xx_ta_status < 0) + ist30xx_ta_status = 0; + + if (ist30xx_noise_mode < 0) + ist30xx_noise_mode = 0; + + ret = ist30xx_get_info(data); + tsp_info("Get info: %s\n", (ret == 0 ? "success" : "fail")); + if (ret) + goto err_irq; + + INIT_DELAYED_WORK(&work_reset_check, reset_work_func); +#if IST30XX_EVENT_MODE + INIT_DELAYED_WORK(&work_noise_protect, noise_work_func); + INIT_DELAYED_WORK(&work_debug_algorithm, debug_work_func); +#endif + +#if IST30XX_EVENT_MODE + init_timer(&event_timer); + event_timer.function = timer_handler; + event_timer.expires = jiffies_64 + (EVENT_TIMER_INTERVAL); + + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + data->early_suspend.suspend = ist30xx_early_suspend; + data->early_suspend.resume = ist30xx_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + ist30xx_initialized = 1; + printk("[TSP] Probe end\n"); + return 0; + +err_irq: + tsp_debug("ChipID: %x\n", data->chip_id); + ist30xx_disable_irq(data); + free_irq(client->irq, data); +err_init_drv: + data->status.event_mode = false; + tsp_err("Error, ist30xx init driver\n"); + ist30xx_power_off(); + input_unregister_device(input_dev); + kfree(data); + kfree(input_dev); + return 0; + +err_reg_dev: +err_alloc_dev: + tsp_err("Error, ist30xx mem free\n"); + kfree(data); + return 0; +} + + +static int __exit ist30xx_remove(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + + free_irq(client->irq, data); + ist30xx_power_off(); + + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + + +static struct i2c_device_id ist30xx_idtable[] = { + { IST30XX_DEV_NAME, 0 }, + {}, +}; + + +MODULE_DEVICE_TABLE(i2c, ist30xx_idtable); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static const struct dev_pm_ops ist30xx_pm_ops = { + .suspend = ist30xx_suspend, + .resume = ist30xx_resume, +}; +#endif + +#ifdef CONFIG_OF +static const struct of_device_id ist30xxb_ts_of_match[] = { + { .compatible = "Imagis,IST30XX", }, + { } +}; +#endif + +static struct i2c_driver ist30xx_i2c_driver = { + .id_table = ist30xx_idtable, + .probe = ist30xx_probe, + .remove = __exit_p(ist30xx_remove), + .shutdown = ist30xx_shutdown, + .driver = { + .owner = THIS_MODULE, + .name = IST30XX_DEV_NAME, +#ifdef CONFIG_HAS_EARLYSUSPEND + .pm = &ist30xx_pm_ops, +#endif + +#ifdef CONFIG_OF + .of_match_table = ist30xxb_ts_of_match, +#endif + }, +}; + +//extern unsigned int lpm_charge; +static int __init ist30xx_init(void) +{ + //if ( !lpm_charge) + { + printk("[TSP] Imagis init called\n"); + return i2c_add_driver(&ist30xx_i2c_driver); +} + //else + // return 0; +} + + +static void __exit ist30xx_exit(void) +{ + //if ( !lpm_charge) + i2c_del_driver(&ist30xx_i2c_driver); + +} + +module_init(ist30xx_init); +module_exit(ist30xx_exit); + +MODULE_DESCRIPTION("Imagis IST30XX touch driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ist30xx/ist30xx.h b/drivers/input/touchscreen/ist30xx/ist30xx.h new file mode 100644 index 00000000..27b1fd4a --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx.h @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_H__ +#define __IST30XX_H__ + +/* + * Support F/W ver : IST30xxB v3.3 (included tag) + * Support IC : IST3026B, IST3032B, IST3038 + * Release : 2014.01.07 by Ian Bae + */ + +#define IMAGIS_IST30XX (1) /* 3026, 3032 */ +#define IMAGIS_IST30XXB (2) /* 3026B, 3032B */ +#define IMAGIS_IST3038 (3) /* 3038 */ +#define IMAGIS_IST3044 (4) /* 3044 */ + +#define IMAGIS_TSP_IC IMAGIS_IST3038 + +#if ((IMAGIS_TSP_IC == IMAGIS_IST30XX) || (IMAGIS_TSP_IC == IMAGIS_IST30XXB)) +#define IST30XX_EXTEND_COORD (0) /* IST3026, IST3032, IST3038 */ +#elif ((IMAGIS_TSP_IC == IMAGIS_IST3038) || (IMAGIS_TSP_IC == IMAGIS_IST3044)) +#define IST30XX_EXTEND_COORD (1) /* IST3038, IST3044 */ +#endif + +#define I2C_BURST_MODE (1) +#define I2C_MONOPOLY_MODE (0) + +#define IST30XX_EVENT_MODE (1) +#if IST30XX_EVENT_MODE +# define IST30XX_NOISE_MODE (1) +# define IST30XX_TRACKING_MODE (1) +#else +# define IST30XX_NOISE_MODE (0) +# define IST30XX_TRACKING_MODE (0) +#endif + +#define IST30XX_USE_KEY (1) +#define IST30XX_DEBUG (1) + +#define SEC_FACTORY_MODE (1) + +#define IST30XX_DEV_NAME "IST30XX" +#define IST30XX_CHIP_ID (0x30003000) +#define IST30XXA_CHIP_ID (0x300a300a) +#define IST30XXB_CHIP_ID (0x300b300b) +#define IST3038_CHIP_ID (0x30383038) + +#define IST30XX_DEV_ID (0xA0 >> 1) +#define IST30XX_FW_DEV_ID (0xA4 >> 1) + +#define IST30XX_ADDR_LEN (4) +#define IST30XX_DATA_LEN (4) + +#define IST30XX_ISP_CMD_LEN (3) + +#define IST30XX_MAX_MT_FINGERS (10) +#define IST30XX_MAX_KEYS (5) + +#if defined(CONFIG_MACH_TSHARKWSAMSUNG) +#define IST30XX_MAX_X (540) +#define IST30XX_MAX_Y (960) +#elif defined(CONFIG_MACH_CORE3) +#define IST30XX_MAX_X (480) +#define IST30XX_MAX_Y (800) +#else +#define IST30XX_MAX_X (480) +#define IST30XX_MAX_Y (800) +#endif +#define IST30XX_MAX_W (15) + +#define IST30XX (1) +#define IST30XXB (2) + +/* I2C Transfer msg number */ +#define WRITE_CMD_MSG_LEN (1) +#define READ_CMD_MSG_LEN (2) + +#define NORMAL_TEMPERATURE (0) +#define LOW_TEMPERATURE (1) +#define HIGH_TEMPERATURE (2) + +/* Debug message */ +#define DEV_ERR (1) +#define DEV_WARN (2) +#define DEV_INFO (3) +#define DEV_DEBUG (4) +#define DEV_VERB (5) + +#define IST30XX_DEBUG_TAG "[ TSP ]" +//#define IST30XX_DEBUG_LEVEL DEV_INFO +#define IST30XX_DEBUG_LEVEL DEV_VERB + +#define tsp_err(fmt, ...) tsp_printk(DEV_ERR, fmt, ## __VA_ARGS__) +#define tsp_warn(fmt, ...) tsp_printk(DEV_WARN, fmt, ## __VA_ARGS__) +#define tsp_info(fmt, ...) tsp_printk(DEV_INFO, fmt, ## __VA_ARGS__) +#define tsp_debug(fmt, ...) tsp_printk(DEV_DEBUG, fmt, ## __VA_ARGS__) +#define tsp_verb(fmt, ...) tsp_printk(DEV_VERB, fmt, ## __VA_ARGS__) + + +enum ist30xx_commands { + CMD_ENTER_UPDATE = 0x02, + CMD_EXIT_UPDATE = 0x03, + CMD_UPDATE_SENSOR = 0x04, + CMD_UPDATE_CONFIG = 0x05, + CMD_ENTER_REG_ACCESS = 0x07, + CMD_EXIT_REG_ACCESS = 0x08, + CMD_SET_NOISE_MODE = 0x0A, + CMD_START_SCAN = 0x0B, + CMD_ENTER_FW_UPDATE = 0x0C, + CMD_RUN_DEVICE = 0x0D, + CMD_EXEC_MEM_CODE = 0x0E, + CMD_SET_TEST_MODE = 0x0F, + + CMD_CALIBRATE = 0x11, + CMD_USE_IDLE = 0x12, + CMD_USE_DEBUG = 0x13, + CMD_ZVALUE_MODE = 0x15, + CMD_SAME_POSITION = 0x16, + CMD_CHECK_CALIB = 0x1A, + CMD_SET_TEMPER_MODE = 0x1B, + CMD_USE_CORRECT_CP = 0x1C, + CMD_SET_REPORT_RATE = 0x1D, + CMD_SET_IDLE_TIME = 0x1E, + + CMD_GET_COORD = 0x20, + + CMD_GET_CHIP_ID = 0x30, + CMD_GET_FW_VER = 0x31, + CMD_GET_CHECKSUM = 0x32, + CMD_GET_LCD_RESOLUTION = 0x33, + CMD_GET_TSP_CHNUM1 = 0x34, + CMD_GET_PARAM_VER = 0x35, + CMD_GET_SUB_VER = 0x36, + CMD_GET_CALIB_RESULT = 0x37, + CMD_GET_TSP_SWAP_INFO = 0x38, + CMD_GET_KEY_INFO1 = 0x39, + CMD_GET_KEY_INFO2 = 0x3A, + CMD_GET_KEY_INFO3 = 0x3B, + CMD_GET_TSP_CHNUM2 = 0x3C, + CMD_GET_TSP_DIRECTION = 0x3D, + + CMD_GET_TSP_VENDOR = 0x3E, + CMD_GET_TSP_PANNEL_TYPE = 0x40, + + CMD_GET_CHECKSUM_ALL = 0x41, +}; + +#define CMD_FW_UPDATE_MAGIC (0x85FDAE8A) + + +typedef struct _ALGR_INFO { + u32 scan_status; + u8 touch_cnt; + u8 intl_touch_cnt; + u16 status_flag; + + u16 raw_peak_min; + u16 raw_peak_max; + u16 flt_peak_max; + u16 adpt_threshold; + + u16 key_raw_data[6]; +} ALGR_INFO; + +#if IST30XX_EXTEND_COORD +#ifdef defined(CONFIG_MACH_TSHARKWSAMSUNG) //only Tshark0.0 use this +#define EXTEND_COORD_CHECKSUM (1) +#else +#define EXTEND_COORD_CHECKSUM (0) +#endif +#define IST30XX_INTR_STATUS1 (0x71000000) +#define IST30XX_INTR_STATUS2 (0x00000C00) +#define CHECK_INTR_STATUS1(n) (((n & IST30XX_INTR_STATUS1) == IST30XX_INTR_STATUS1) ? 1 : 0) +#define CHECK_INTR_STATUS2(n) (((n & IST30XX_INTR_STATUS2) > 0) ? 0 : 1) +#define CHECK_INTR_STATUS3(n) (((n & IST30XX_INTR_STATUS2) == IST30XX_INTR_STATUS2) ? 1 : 0) +#define PARSE_FINGER_CNT(n) ((n >> 12) & 0xF) +#define PARSE_KEY_CNT(n) ((n >> 21) & 0x7) +#define PARSE_FINGER_STATUS(n) (n & 0x3FF) /* Finger status: [9:0] */ +#define PARSE_KEY_STATUS(n) ((n >> 16) & 0x1F) /* Key status: [20:16] */ + +#define PRESSED_FINGER(s, id) ((s & (1 << (id - 1))) ? true : false) +#define PRESSED_KEY(s, id) ((s & (1 << (16 + id - 1))) ? true : false) +typedef union { + struct { + u32 y : 12; + u32 x : 12; + u32 area : 4; + u32 id : 4; + } bit_field; + u32 full_field; +} finger_info; +#else +#define EXTEND_COORD_CHECKSUM (0) +typedef union { + struct { + u32 y : 10; + u32 w : 6; + u32 x : 10; + u32 id : 4; + u32 udmg : 2; + } bit_field; + u32 full_field; +} finger_info; +#endif // IST30XX_EXTEND_COORD + + +struct ist30xx_status { + int power; + int update; + int calib; + int calib_msg; + bool event_mode; + bool noise_mode; +}; + +struct ist30xx_fw { + u32 prev_core_ver; + u32 prev_param_ver; + u32 core_ver; + u32 param_ver; + u32 sub_ver; + u32 index; + u32 size; + u32 chksum; + u32 buf_size; + u8 * buf; +}; + +struct ist30xx_os { + u32 bin_size; + u32 curve_size; + u8 * bin_buf; + u8 * curve_buf; + u16 open_buf[16 * 16]; // 32channel + u16 short1_buf[16 * 16]; // 32channel + u16 short2_buf[16 * 16]; // 32channel +}; + +#define IST30XX_TAG_MAGIC "ISTV1TAG" +struct ist30xx_tags { + char magic1[8]; + u32 fw_addr; + u32 fw_size; + u32 flag_addr; + u32 flag_size; + u32 cfg_addr; + u32 cfg_size; + u32 sensor1_addr; + u32 sensor1_size; + u32 sensor2_addr; + u32 sensor2_size; + u32 sensor3_addr; + u32 sensor3_size; + u32 chksum; + u32 reserved2; + char magic2[8]; +}; + +struct tsp_platform_data { + int gpio; +}; + +#include "ist30xx_sec.h" +#include +struct ist30xx_data { + struct i2c_client * client; + struct input_dev * input_dev; + struct early_suspend early_suspend; + struct ist30xx_status status; + struct ist30xx_fw fw; + struct ist30xx_tags tags; +#if SEC_FACTORY_MODE + struct sec_factory sec; +#endif + u32 chip_id; + u32 tsp_type; + u32 max_fingers; + u32 max_keys; + u32 irq_enabled; +#if IST30XX_EXTEND_COORD + u32 t_status; +#else + u32 num_fingers; + u32 num_keys; + finger_info prev_fingers[IST30XX_MAX_MT_FINGERS]; + finger_info prev_keys[IST30XX_MAX_MT_FINGERS]; +#endif + finger_info fingers[IST30XX_MAX_MT_FINGERS]; +}; + + +extern struct mutex ist30xx_mutex; +extern int ist30xx_dbg_level; + +void tsp_printk(int level, const char *fmt, ...); +int ist30xx_intr_wait(long ms); + +void ist30xx_enable_irq(struct ist30xx_data *data); +void ist30xx_disable_irq(struct ist30xx_data *data); +void ist30xx_set_ta_mode(bool charging); +void ist30xx_set_cover_mode(int mode); +void ist30xx_start(struct ist30xx_data *data); +int ist30xx_get_ver_info(struct ist30xx_data *data); +int ist30xx_init_touch_driver(struct ist30xx_data *data); + +int ist30xx_get_position(struct i2c_client *client, u32 *buf, u16 len); + +int ist30xx_read_cmd(struct i2c_client *client, u32 cmd, u32 *buf); +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val); + +int ist30xx_cmd_run_device(struct i2c_client *client, bool is_reset); +int ist30xx_cmd_start_scan(struct i2c_client *client); +int ist30xx_cmd_calibrate(struct i2c_client *client); +int ist30xx_cmd_check_calib(struct i2c_client *client); +int ist30xx_cmd_update(struct i2c_client *client, int cmd); +int ist30xx_cmd_reg(struct i2c_client *client, int cmd); + +int ist30xx_power_on(void); +int ist30xx_power_off(void); +int ist30xx_reset(void); + +int ist30xx_internal_suspend(struct ist30xx_data *data); +int ist30xx_internal_resume(struct ist30xx_data *data); + +int __init ist30xx_init_system(void); + +#endif // __IST30XX_H__ diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_misc.c b/drivers/input/touchscreen/ist30xx/ist30xx_misc.c new file mode 100644 index 00000000..15d8c4a9 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_misc.c @@ -0,0 +1,1284 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include + +/* Including the definition of S_IRWXUGO */ +// Can use S_IRUGO for better security. Verify the same. +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" + +#define TSP_CH_SCREEN (1) +#define TSP_CH_KEY (2) + +#define TOUCH_NODE_PARSING_DEBUG (0) + +extern struct ist30xx_data *ts_data; + +TSP_INFO ist30xx_tsp_info; +TKEY_INFO ist30xx_tkey_info; + +static u32 *ist30xx_frame_buf; +static u32 *ist30xx_frame_rawbuf; +static u32 *ist30xx_frame_fltbuf; + + +int ist30xx_tkey_update_info(void) +{ + int ret = 0; + u32 tkey_info1, tkey_info2, tkey_info3; + TKEY_INFO *tkey = &ist30xx_tkey_info; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO1, &tkey_info1); + if (unlikely(ret)) return ret; + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO2, &tkey_info2); + if (unlikely(ret)) return ret; + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO3, &tkey_info3); + if (unlikely(ret)) return ret; + + tkey->enable = ((tkey_info1 & (0xFF << 24)) ? true : false); + tkey->key_num = (tkey_info1 >> 16) & 0xFF; + tkey->ch_num[0] = (tkey_info2 >> 24) & 0xFF; + tkey->ch_num[1] = (tkey_info2 >> 16) & 0xFF; + tkey->ch_num[2] = (tkey_info2 >> 8) & 0xFF; + tkey->ch_num[3] = tkey_info2 & 0xFF; + tkey->ch_num[4] = (tkey_info3 >> 24) & 0xFF; + + return ret; +} + + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +int ist30xx_tsp_update_info(void) +{ + int ret = 0; + u32 tsp_ch_num, tsp_swap, tsp_dir; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_SWAP_INFO, &tsp_swap); + if (unlikely(ret)) return ret; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_DIRECTION, &tsp_dir); + if (unlikely(ret)) return ret; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_CHNUM1, &tsp_ch_num); + if (unlikely(ret || !tsp_ch_num)) return ret; + + tsp->finger_num = IST30XX_MAX_MT_FINGERS; + + tsp->ch_num.rx = tsp_ch_num >> 16; + tsp->ch_num.tx = tsp_ch_num & 0xFFFF; + + tsp->dir.swap_xy = (tsp_swap & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (tsp_swap & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (tsp_swap & TSP_INFO_FLIP_Y ? true : false); + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + tsp->height = (tsp->dir.swap_xy ? tsp->ch_num.rx : tsp->ch_num.tx); + tsp->width = (tsp->dir.swap_xy ? tsp->ch_num.tx : tsp->ch_num.rx); + + return ret; +} + + +int ist30xx_check_valid_ch(int ch_tx, int ch_rx) +{ + TKEY_INFO *tkey = &ist30xx_tkey_info; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (unlikely((ch_tx > tsp->ch_num.tx) || (ch_rx > tsp->ch_num.rx))) + return 0; + + if (tkey->enable) { + if (tkey->axis_rx) { + tsp_verb("tx: %d, rx: %d\n", ch_tx, ch_rx); + if (ch_rx == tsp->ch_num.rx - 1) { + tsp_verb("ch_tx: %d\n", ch_tx); + if ((ch_tx == tkey->ch_num[0]) || (ch_tx == tkey->ch_num[1]) || + (ch_tx == tkey->ch_num[2]) || (ch_tx == tkey->ch_num[3]) || + (ch_tx == tkey->ch_num[4])) + return TSP_CH_KEY; + else + return 0; + } + } else { + if (ch_tx == tsp->ch_num.tx - 1) { + if ((ch_rx == tkey->ch_num[0]) || (ch_rx == tkey->ch_num[1]) || + (ch_rx == tkey->ch_num[2]) || (ch_rx == tkey->ch_num[3]) || + (ch_rx == tkey->ch_num[4])) + return TSP_CH_KEY; + else + return 0; + } + } + } + + return TSP_CH_SCREEN; +} + + +int ist30xx_parse_touch_node(u8 flag, struct TSP_NODE_BUF *node) +{ +#if TOUCH_NODE_PARSING_DEBUG + int j; + TSP_INFO *tsp = &ist30xx_tsp_info; +#endif + int i,k; + u16 *raw = (u16 *)&node->raw; + u16 *base = (u16 *)&node->base; + u16 *filter = (u16 *)&node->filter; + + for (i = 0,k = 0; i < node->len; i++) { + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + *raw++ = ist30xx_frame_rawbuf[i] & 0xFFF; + *base++ = (ist30xx_frame_rawbuf[i] >> 16) & 0xFFF; + } + if (flag & NODE_FLAG_FILTER){ + *filter++ = ist30xx_frame_fltbuf[k++] & 0xFFF; + + } + } + +#if TOUCH_NODE_PARSING_DEBUG + tsp_info("RAW - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->raw[i][j]); + } + + tsp_info("BASE - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->base[i][j]); + } + + tsp_info("FILTER - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->filter[i][j]); + } +#endif + + return 0; +} + +int print_touch_node(u8 flag, struct TSP_NODE_BUF *node, char *buf, bool ch_tsp) +{ + int i, j; + int count = 0; + int val = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (tsp->dir.swap_xy) { + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (ch_tsp && (ist30xx_check_valid_ch(i, j) != TSP_CH_SCREEN)) + continue; + + if (flag == NODE_FLAG_RAW) + val = (int)node->raw[i][j]; + else if (flag == NODE_FLAG_BASE) + val = (int)node->base[i][j]; + else if (flag == NODE_FLAG_FILTER) + val = (int)node->filter[i][j]; + else if (flag == NODE_FLAG_DIFF) + val = (int)(node->raw[i][j] - node->base[i][j]); + else + return 0; + + if (val < 0) val = 0; + + count += snprintf(msg, msg_len, "%4d ", val); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + } + + return count; +} + +int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16) +{ + int i, j; + s16 val = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (unlikely((flag != NODE_FLAG_RAW) && (flag != NODE_FLAG_BASE) && + (flag != NODE_FLAG_FILTER) && (flag != NODE_FLAG_DIFF))) + return -EPERM; + + if (tsp->dir.swap_xy) { + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (ist30xx_check_valid_ch(i, j) != TSP_CH_SCREEN) + continue; + + switch ((int)flag) { + case NODE_FLAG_RAW: + val = (s16)node->raw[i][j]; + break; + case NODE_FLAG_BASE: + val = (s16)node->base[i][j]; + break; + case NODE_FLAG_FILTER: + val = (s16)node->filter[i][j]; + break; + case NODE_FLAG_DIFF: + val = (s16)(node->raw[i][j] - node->base[i][j]); + break; + } + + if (val < 0) val = 0; + + *buf16++ = val; + } + } + } + + return 0; +} + + +int ist30xx_read_touch_node(u8 flag, struct TSP_NODE_BUF *node) +{ + int ret = 0; + u32 addr = IST30XXB_RAW_ADDR; + + if (ts_data->chip_id == IST3038_CHIP_ID) + addr += 0xD4; + + ist30xx_disable_irq(ts_data); + + if (flag & NODE_FLAG_NO_CCP) { + ret = ist30xx_cmd_run_device(ts_data->client, true); + if (unlikely(ret)) goto read_tsp_node_end; + + ret = ist30xx_write_cmd(ts_data->client, CMD_USE_CORRECT_CP, 0); + if (unlikely(ret)) goto read_tsp_node_end; + } + + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret)) goto read_tsp_node_end; + + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, node->len); + if (unlikely(ret)) goto read_tsp_node_end; + + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + tsp_debug("Reg addr: %x, size: %d\n", addr, node->len); + ret = ist30xx_read_buf(ts_data->client, addr, + ist30xx_frame_rawbuf, node->len); + if (unlikely(ret)) goto read_tsp_node_end; + } + if (flag & NODE_FLAG_FILTER) { + tsp_debug("Reg addr: %x, size: %d\n", IST30XXB_FILTER_ADDR, node->len); + ret = ist30xx_read_buf(ts_data->client, IST30XXB_FILTER_ADDR, + ist30xx_frame_fltbuf, node->len); + if (unlikely(ret)) goto read_tsp_node_end; + } + + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (unlikely(ret)) goto read_tsp_node_end; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (unlikely(ret)) goto read_tsp_node_end; + +read_tsp_node_end: + ist30xx_enable_irq(ts_data); + + return ret; +} + + +/* sysfs: /sys/class/touch/node/refresh */ +ssize_t ist30xx_frame_refresh(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER; + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (unlikely(ret)) + ret = sprintf(buf, "cmd 1frame raw update fail\n"); + + ret = ist30xx_parse_touch_node(flag, &tsp->node); + + return ret; +} + + +/* sysfs: /sys/class/touch/node/read_nocp */ +ssize_t ist30xx_frame_nocp(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER | + NODE_FLAG_NO_CCP; + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (unlikely(ret)) + ret = sprintf(buf, "cmd 1frame raw update fail\n"); + + ret = ist30xx_parse_touch_node(flag, &tsp->node); + + return ret; +} + + +/* sysfs: /sys/class/touch/node/base */ +ssize_t ist30xx_base_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb baseline(%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_BASE, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/raw */ +ssize_t ist30xx_raw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb raw(%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_RAW, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/diff */ +ssize_t ist30xx_diff_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb difference (%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_DIFF, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/filter */ +ssize_t ist30xx_filter_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb filter (%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_FILTER, &tsp->node, buf, false); + + return count; +} + + +extern int calib_ms_delay; +/* sysfs: /sys/class/touch/sys/clb */ +ssize_t ist30xx_calib_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -1; + int ms_delay; + + sscanf(buf, "%d", &ms_delay); + + if (ms_delay > 10 && ms_delay < 1000) // 1sec ~ 100sec + calib_ms_delay = ms_delay; + + tsp_info("Calibration wait time %dsec\n", calib_ms_delay / 10); + + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client, true); + if (unlikely(ret)) { + ist30xx_enable_irq(ts_data); + return size; + } + ist30xx_calibrate(1); + + ist30xx_start(ts_data); + + return size; +} + +ssize_t ist30xx_calib_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int count = 0; + u32 value; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client, true); + if (unlikely(ret)) + goto calib_show_end; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &value); + if (unlikely(ret)) { + count = sprintf(buf, "Error Read Calibration Result\n"); + goto calib_show_end; + } + + count = sprintf(buf, + "Calibration Status : %d, Max raw gap : %d - (raw: %08x)\n", + CALIB_TO_STATUS(value), CALIB_TO_GAP(value), value); + +calib_show_end: + ist30xx_start(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + return count; +} + + +/* sysfs: /sys/class/touch/sys/power */ +ssize_t ist30xx_power_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + u32 power_en; + + sscanf(buf, "%d", &power_en); + + tsp_info("Power enable: %d\n", power_en); + if (unlikely(power_en > 1)) { + tsp_err("Unknown argument value, %d\n", power_en); + return size; + } + + if (power_en) { + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + } else { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ist30xx_internal_suspend(ts_data); + mutex_unlock(&ist30xx_mutex); + } + + return size; +} + +extern int ist30xx_max_error_cnt; +/* sysfs: /sys/class/touch/sys/errcnt */ +ssize_t ist30xx_errcnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int err_cnt; + + sscanf(buf, "%d", &err_cnt); + + if (unlikely(err_cnt < 0)) return size; + + tsp_info("Request reset error count: %d\n", err_cnt); + + ist30xx_max_error_cnt = err_cnt; + + return size; +} + +#if IST30XX_EVENT_MODE +extern int ist30xx_max_scan_retry; +/* sysfs: /sys/class/touch/sys/scancnt */ +ssize_t ist30xx_scancnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int retry; + + sscanf(buf, "%d", &retry); + + if (unlikely(retry < 0)) return size; + + tsp_info("Timer scan count retry: %d\n", retry); + + ist30xx_max_scan_retry = retry; + + return size; +} + +extern int timer_period_ms; +/* sysfs: /sys/class/touch/sys/timerms */ +ssize_t ist30xx_timerms_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ms; + + sscanf(buf, "%d", &ms); + + if (unlikely((ms < 0) || (ms > 10000))) return size; + + tsp_info("Timer period ms: %dms\n", ms); + + timer_period_ms = ms; + + return size; +} +#endif + +extern int ist30xx_dbg_level; +/* sysfs: /sys/class/touch/sys/printk */ +ssize_t ist30xx_printk_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int level; + + sscanf(buf, "%d", &level); + + if (unlikely((level < DEV_ERR) || (level > DEV_VERB))) return size; + + tsp_info("prink log level: %d\n", level); + + ist30xx_dbg_level = level; + + return size; +} + +ssize_t ist30xx_printk_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "prink log level: %d\n", ist30xx_dbg_level); +} + +extern void ist30xx_scheduled_reset(void); +extern int ist30xx_report_rate; +/* sysfs: /sys/class/touch/sys/touch_rate */ +ssize_t ist30xx_touch_rate_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int rate; + + sscanf(buf, "%d", &rate); // us + + if (unlikely(rate > 0xFFFF)) return size; // over 65.5ms + + tsp_info("touch reporting rate: %d\n", rate); + + ist30xx_report_rate = rate; + + ist30xx_scheduled_reset(); + + return size; +} + +extern int ist30xx_idle_rate; +/* sysfs: /sys/class/touch/sys/idle_rate */ +ssize_t ist30xx_idle_scan_rate_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int rate; + + sscanf(buf, "%d", &rate); // us + + if (unlikely(rate > 0xFFFF)) return size; // over 65.5ms + + tsp_info("touch idle scan rate: %d\n", rate); + + ist30xx_idle_rate = rate; + + ist30xx_scheduled_reset(); + + return size; +} + +extern void ist30xx_set_ta_mode(bool charging); +/* sysfs: /sys/class/touch/sys/mode_ta */ +ssize_t ist30xx_ta_mode_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) return size; // enable/disable + + ist30xx_set_ta_mode(mode); + + return size; +} + +extern void ist30xx_set_call_mode(int mode); +/* sysfs: /sys/class/touch/sys/mode_call */ +ssize_t ist30xx_call_mode_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) return size; // enable/disable + + ist30xx_set_call_mode(mode); + + return size; +} + +extern void ist30xx_set_cover_mode(int mode); +/* sysfs: /sys/class/touch/sys/mode_cover */ +ssize_t ist30xx_cover_mode_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) return size; // enable/disable + + ist30xx_set_cover_mode(mode); + + return size; +} + + +#define TUNES_CMD_WRITE (1) +#define TUNES_CMD_READ (2) +#define TUNES_CMD_REG_ENTER (3) +#define TUNES_CMD_REG_EXIT (4) +#define TUNES_CMD_UPDATE_PARAM (5) +#define TUNES_CMD_UPDATE_FW (6) + +#define DIRECT_ADDR(n) (IST30XXB_DA_ADDR(n)) +#define DIRECT_CMD_WRITE ('w') +#define DIRECT_CMD_READ ('r') + +#pragma pack(1) +typedef struct { + u8 cmd; + u32 addr; + u16 len; +} TUNES_INFO; +#pragma pack() +#pragma pack(1) +typedef struct { + char cmd; + u32 addr; + u32 val; +} DIRECT_INFO; +#pragma pack() + +static TUNES_INFO ist30xx_tunes; +static DIRECT_INFO ist30xx_direct; +static bool tunes_cmd_done = false; +static bool ist30xx_reg_mode = false; + +/* sysfs: /sys/class/touch/sys/direct */ +ssize_t ist30xxb_direct_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -EPERM; + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + sscanf(buf, "%c %x %x", &direct->cmd, &direct->addr, &direct->val); + + tsp_debug("Direct cmd: %c, addr: %x, val: %x\n", + direct->cmd, direct->addr, direct->val); + + if (unlikely((direct->cmd != DIRECT_CMD_WRITE) && + (direct->cmd != DIRECT_CMD_READ))) { + tsp_warn("Direct cmd is not correct!\n"); + return size; + } + + if (ist30xx_intr_wait(30) < 0) return size; + + ts_data->status.event_mode = false; + if (direct->cmd == DIRECT_CMD_WRITE) { + ret = ist30xx_write_cmd(ts_data->client, DIRECT_ADDR(direct->addr), + direct->val); + ret = ist30xx_read_cmd(ts_data->client, DIRECT_ADDR(direct->addr), + &direct->val); + tsp_debug("Direct write addr: %x, val: %x\n", + direct->addr, direct->val); + } + ts_data->status.event_mode = true; + + return size; +} + +#define DIRECT_BUF_COUNT (4) +ssize_t ist30xxb_direct_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i, ret, count = 0; + int len; + u32 addr; + u32 buf32[DIRECT_BUF_COUNT]; + int max_len = DIRECT_BUF_COUNT; + const int msg_len = 256; + char msg[msg_len]; + + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + if (unlikely(direct->cmd != DIRECT_CMD_READ)) + return sprintf(buf, "ex) echo r addr len > direct\n"); + + len = direct->val; + addr = DIRECT_ADDR(direct->addr); + + if (ist30xx_intr_wait(30) < 0) return 0; + ts_data->status.event_mode = false; + while (len > 0) { + if (len < max_len) max_len = len; + + memset(buf32, 0, sizeof(buf32)); + ret = ist30xxb_burst_read(ts_data->client, addr, buf32, max_len); + if (unlikely(ret)) { + count = sprintf(buf, "I2C Burst read fail, addr: %x\n", addr); + break; + } + + for (i = 0; i < max_len; i++) { + count += snprintf(msg, msg_len, "0x%08x ", buf32[i]); + strncat(buf, msg, msg_len); + } + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + + addr += max_len * IST30XX_DATA_LEN; + len -= max_len; + } + ts_data->status.event_mode = true; + + tsp_debug("%s", buf); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/regcmd */ +ssize_t tunes_regcmd_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -1; + u32 *buf32; + + memcpy(&ist30xx_tunes, buf, sizeof(ist30xx_tunes)); + buf += sizeof(ist30xx_tunes); + buf32 = (u32 *)buf; + + tunes_cmd_done = false; + + switch (ist30xx_tunes.cmd) { + case TUNES_CMD_WRITE: + break; + case TUNES_CMD_READ: + break; + case TUNES_CMD_REG_ENTER: + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client, true); + if (unlikely(ret)) goto regcmd_fail; + + /* enter reg access mode */ + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret)) goto regcmd_fail; + + ist30xx_reg_mode = true; + + break; + case TUNES_CMD_REG_EXIT: + /* exit reg access mode */ + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (unlikely(ret)) goto regcmd_fail; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (unlikely(ret)) goto regcmd_fail; + + ist30xx_reg_mode = false; + + ist30xx_enable_irq(ts_data); + break; + default: + ist30xx_enable_irq(ts_data); + return size; + } + tunes_cmd_done = true; + + return size; + +regcmd_fail: + tsp_err("Tunes regcmd i2c_fail, ret=%d\n", ret); + return size; +} + +ssize_t tunes_regcmd_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int size; + + size = sprintf(buf, "cmd: 0x%02x, addr: 0x%08x, len: 0x%04x\n", + ist30xx_tunes.cmd, ist30xx_tunes.addr, ist30xx_tunes.len); + + return size; +} + +#define MAX_WRITE_LEN (1) +/* sysfs: /sys/class/touch/tunes/reg */ +ssize_t tunes_reg_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + u32 *buf32 = (u32 *)buf; + int waddr, wcnt = 0, len = 0; + + if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_WRITE)) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return size; + } + + if (unlikely(!ist30xx_reg_mode)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + if (unlikely(!tunes_cmd_done)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + waddr = ist30xx_tunes.addr; + if (ist30xx_tunes.len >= MAX_WRITE_LEN) + len = MAX_WRITE_LEN; + else + len = ist30xx_tunes.len; + + while (wcnt < ist30xx_tunes.len) { + ret = ist30xx_write_buf(ts_data->client, waddr, buf32, len); + if (unlikely(ret)) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + wcnt += len; + + if ((ist30xx_tunes.len - wcnt) < MAX_WRITE_LEN) + len = ist30xx_tunes.len - wcnt; + + buf32 += MAX_WRITE_LEN; + waddr += MAX_WRITE_LEN * IST30XX_DATA_LEN; + } + + tunes_cmd_done = false; + + return size; +} + +ssize_t tunes_reg_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int size; + u32 *buf32 = (u32 *)buf; + +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + + if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_READ)) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return 0; + } + + if (unlikely(!tunes_cmd_done)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return 0; + } + + size = ist30xx_tunes.len; + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, size); + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return 0; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); // Activated only when the GPIO I2C is used +#endif + ret = ist30xx_read_buf(ts_data->client, ist30xx_tunes.addr, buf32, size); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); // Activated only when the GPIO I2C is used +#endif + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = ist30xx_tunes.len * IST30XX_DATA_LEN; + + tunes_cmd_done = false; + + return size; +} + + +/* sysfs: /sys/class/touch/tunes/firmware */ +ssize_t tunes_fw_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + ist30xx_get_update_info(ts_data, buf, size); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, buf, size, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(ts_data); + + return size; +} + + +/* sysfs: /sys/class/touch/tunes/adb */ +ssize_t tunes_adb_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + char *tmp, *ptr; + char token[9]; + u32 cmd, addr, len, val; + int write_len; + + sscanf(buf, "%x %x %x", &cmd, &addr, &len); + + switch (cmd) { + case TUNES_CMD_WRITE: /* write cmd */ + write_len = 0; + ptr = (char *)(buf + 15); + + while (write_len < len) { + memcpy(token, ptr, 8); + token[8] = 0; + val = simple_strtoul(token, &tmp, 16); + ret = ist30xx_write_buf(ts_data->client, addr, &val, 1); + if (unlikely(ret)) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + ptr += 8; + write_len++; + addr += 4; + } + break; + + case TUNES_CMD_READ: /* read cmd */ + ist30xx_tunes.cmd = cmd; + ist30xx_tunes.addr = addr; + ist30xx_tunes.len = len; + break; + + case TUNES_CMD_REG_ENTER: /* enter */ + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client, true); + if (unlikely(ret < 0)) goto cmd_fail; + + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret < 0)) goto cmd_fail; + ist30xx_reg_mode = true; + break; + + case TUNES_CMD_REG_EXIT: /* exit */ + if (ist30xx_reg_mode == true) { + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (unlikely(ret < 0)) goto cmd_fail; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (unlikely(ret < 0)) goto cmd_fail; + ist30xx_reg_mode = false; + ist30xx_enable_irq(ts_data); + } + break; + + default: + break; + } + + return size; + +cmd_fail: + tsp_err("Tunes adb i2c_fail\n"); + return size; +} + +ssize_t tunes_adb_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int i, len, size = 0; + char reg_val[10]; + +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, ist30xx_tunes.len); + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); +#endif + ret = ist30xx_read_buf(ts_data->client, ist30xx_tunes.addr, + ist30xx_frame_buf, ist30xx_tunes.len); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); +#endif + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = 0; + buf[0] = 0; + len = sprintf(reg_val, "%08x", ist30xx_tunes.addr); + strcat(buf, reg_val); + size += len; + for (i = 0; i < ist30xx_tunes.len; i++) { + len = sprintf(reg_val, "%08x", ist30xx_frame_buf[i]); + strcat(buf, reg_val); + size += len; + } + + return size; +} + +/* sysfs: /sys/class/touch/tunes/algorithm */ +#if IST30XX_EVENT_MODE +extern u32 ist30xx_algr_addr, ist30xx_algr_size; +#endif +ssize_t ist30xx_algr_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ +#if IST30XX_EVENT_MODE + sscanf(buf, "%x %d", &ist30xx_algr_addr, &ist30xx_algr_size); + tsp_info("Algorithm addr: 0x%x, count: %d\n", + ist30xx_algr_addr, ist30xx_algr_size); + + ist30xx_algr_addr |= IST30XXB_ACCESS_ADDR; +#endif + + return size; +} + +ssize_t ist30xx_algr_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + u32 algr_addr; + int count = 0; + + ret = ist30xx_read_cmd(ts_data->client, IST30XXB_MEM_ALGORITHM, &algr_addr); + if (unlikely(ret)) { + tsp_warn("Algorithm mem addr read fail!\n"); + return 0; + } + + tsp_info("algr_addr(0x%x): 0x%x\n", IST30XXB_MEM_ALGORITHM, algr_addr); + + count = sprintf(buf, "Algorithm addr : 0x%x\n", algr_addr); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/intr_debug */ +extern u32 intr_debug_addr, intr_debug_size; +ssize_t intr_debug_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug_addr, &intr_debug_size); + tsp_info("Interrupt debug addr: 0x%x, count: %d\n", + intr_debug_addr, intr_debug_size); + + intr_debug_addr |= IST30XXB_ACCESS_ADDR; + + return size; +} + +ssize_t intr_debug_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug_addr(0x%x): %d\n", intr_debug_addr, intr_debug_size); + + count = sprintf(buf, "intr_debug_addr(0x%x): %d\n", + intr_debug_addr, intr_debug_size); + + return count; +} + +#define MISC_DEFAULT_ATTR (0644) +/* sysfs : node */ +static DEVICE_ATTR(refresh, MISC_DEFAULT_ATTR, ist30xx_frame_refresh, NULL); +static DEVICE_ATTR(nocp, MISC_DEFAULT_ATTR, ist30xx_frame_nocp, NULL); +static DEVICE_ATTR(filter, MISC_DEFAULT_ATTR, ist30xx_filter_show, NULL); +static DEVICE_ATTR(raw, MISC_DEFAULT_ATTR, ist30xx_raw_show, NULL); +static DEVICE_ATTR(base, MISC_DEFAULT_ATTR, ist30xx_base_show, NULL); +static DEVICE_ATTR(diff, MISC_DEFAULT_ATTR, ist30xx_diff_show, NULL); + +/* sysfs : sys */ +static DEVICE_ATTR(printk, MISC_DEFAULT_ATTR, ist30xx_printk_show, ist30xx_printk_store); +static DEVICE_ATTR(direct, MISC_DEFAULT_ATTR, ist30xxb_direct_show, ist30xxb_direct_store); +static DEVICE_ATTR(clb, MISC_DEFAULT_ATTR, ist30xx_calib_show, ist30xx_calib_store); +static DEVICE_ATTR(tsp_power, MISC_DEFAULT_ATTR, NULL, ist30xx_power_store); +static DEVICE_ATTR(errcnt, MISC_DEFAULT_ATTR, NULL, ist30xx_errcnt_store); +#if IST30XX_EVENT_MODE +static DEVICE_ATTR(scancnt, MISC_DEFAULT_ATTR, NULL, ist30xx_scancnt_store); +static DEVICE_ATTR(timerms, MISC_DEFAULT_ATTR, NULL, ist30xx_timerms_store); +#endif +static DEVICE_ATTR(report_rate, MISC_DEFAULT_ATTR, NULL, ist30xx_touch_rate_store); +static DEVICE_ATTR(idle_rate, MISC_DEFAULT_ATTR, NULL, ist30xx_idle_scan_rate_store); +static DEVICE_ATTR(mode_ta, MISC_DEFAULT_ATTR, NULL, ist30xx_ta_mode_store); +static DEVICE_ATTR(mode_call, MISC_DEFAULT_ATTR, NULL, ist30xx_call_mode_store); +static DEVICE_ATTR(mode_cover, MISC_DEFAULT_ATTR, NULL, ist30xx_cover_mode_store); + +/* sysfs : tunes */ +static DEVICE_ATTR(regcmd, MISC_DEFAULT_ATTR, tunes_regcmd_show, tunes_regcmd_store); +static DEVICE_ATTR(reg, MISC_DEFAULT_ATTR, tunes_reg_show, tunes_reg_store); +static DEVICE_ATTR(tunes_fw, MISC_DEFAULT_ATTR, NULL, tunes_fw_store); +static DEVICE_ATTR(adb, MISC_DEFAULT_ATTR, tunes_adb_show, tunes_adb_store); +static DEVICE_ATTR(algorithm, MISC_DEFAULT_ATTR, ist30xx_algr_show, ist30xx_algr_store); +static DEVICE_ATTR(intr_debug, MISC_DEFAULT_ATTR, intr_debug_show, intr_debug_store); + +static struct attribute *node_attributes[] = { + &dev_attr_refresh.attr, + &dev_attr_nocp.attr, + &dev_attr_filter.attr, + &dev_attr_raw.attr, + &dev_attr_base.attr, + &dev_attr_diff.attr, + NULL, +}; + +static struct attribute *sys_attributes[] = { + &dev_attr_printk.attr, + &dev_attr_direct.attr, + &dev_attr_clb.attr, + &dev_attr_tsp_power.attr, + &dev_attr_errcnt.attr, +#if IST30XX_EVENT_MODE + &dev_attr_scancnt.attr, + &dev_attr_timerms.attr, +#endif + &dev_attr_report_rate.attr, + &dev_attr_idle_rate.attr, + &dev_attr_mode_ta.attr, + &dev_attr_mode_call.attr, + &dev_attr_mode_cover.attr, + NULL, +}; + +static struct attribute *tunes_attributes[] = { + &dev_attr_regcmd.attr, + &dev_attr_reg.attr, + &dev_attr_tunes_fw.attr, + &dev_attr_adb.attr, + &dev_attr_algorithm.attr, + &dev_attr_intr_debug.attr, + NULL, +}; + +static struct attribute_group node_attr_group = { + .attrs = node_attributes, +}; + +static struct attribute_group sys_attr_group = { + .attrs = sys_attributes, +}; + +static struct attribute_group tunes_attr_group = { + .attrs = tunes_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_sys_dev; +struct device *ist30xx_tunes_dev; +struct device *ist30xx_node_dev; + + +int ist30xx_init_misc_sysfs(void) +{ + /* /sys/class/touch/sys */ + ist30xx_sys_dev = device_create(ist30xx_class, NULL, 0, NULL, "sys"); + + /* /sys/class/touch/sys/... */ + if (unlikely(sysfs_create_group(&ist30xx_sys_dev->kobj, + &sys_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "sys"); + + /* /sys/class/touch/tunes */ + ist30xx_tunes_dev = device_create(ist30xx_class, NULL, 0, NULL, "tunes"); + + /* /sys/class/touch/tunes/... */ + if (unlikely(sysfs_create_group(&ist30xx_tunes_dev->kobj, + &tunes_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "tunes"); + + /* /sys/class/touch/node */ + ist30xx_node_dev = device_create(ist30xx_class, NULL, 0, NULL, "node"); + + /* /sys/class/touch/node/... */ + if (unlikely(sysfs_create_group(&ist30xx_node_dev->kobj, + &node_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "node"); + + ist30xx_frame_buf = kmalloc(4096, GFP_KERNEL); + ist30xx_frame_rawbuf = kmalloc(4096, GFP_KERNEL); + ist30xx_frame_fltbuf = kmalloc(4096, GFP_KERNEL); + if (!ist30xx_frame_buf || !ist30xx_frame_rawbuf || !ist30xx_frame_fltbuf) + return -ENOMEM; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_misc.h b/drivers/input/touchscreen/ist30xx/ist30xx_misc.h new file mode 100644 index 00000000..7b4a596e --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_misc.h @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_MISC_H__ +#define __IST30XX_MISC_H__ + +#include "ist30xx_tsp.h" + + +#define IST30XXB_RAW_ADDR (0x40100200) +#define IST30XXB_FILTER_ADDR (0x40101000) + +#define IST30XX_RX_CNT_ADDR (0x20000038) +#define IST30XX_CONFIG_ADDR (0x20000040) + +#define NODE_FLAG_RAW (1) +#define NODE_FLAG_BASE (1 << 1) +#define NODE_FLAG_FILTER (1 << 2) +#define NODE_FLAG_DIFF (1 << 3) +#define NODE_FLAG_ALL (0xF) +#define NODE_FLAG_NO_CCP (1 << 7) + +struct TSP_CH_NUM { + u8 tx; + u8 rx; +}; +struct TSP_NODE_BUF { + u16 raw[NODE_TX_NUM][NODE_RX_NUM]; + u16 base[NODE_TX_NUM][NODE_RX_NUM]; + u16 filter[NODE_TX_NUM][NODE_RX_NUM]; + u16 min_raw; + u16 max_raw; + u16 min_base; + u16 max_base; + u16 len; +}; +struct TSP_DIRECTION { + bool swap_xy; + bool flip_x; + bool flip_y; +}; +typedef struct _TSP_INFO { + struct TSP_CH_NUM ch_num; + struct TSP_DIRECTION dir; + struct TSP_NODE_BUF node; + int height; + int width; + int finger_num; +} TSP_INFO; +typedef struct _TKEY_INFO { + int key_num; + bool enable; + bool axis_rx; + u8 axis_chnum; + u8 ch_num[5]; +} TKEY_INFO; + +int ist30xx_parse_touch_node(u8 flag, struct TSP_NODE_BUF *node); +int ist30xx_read_touch_node(u8 flag, struct TSP_NODE_BUF *node); + +int ist30xx_tsp_update_info(void); +int ist30xx_tkey_update_info(void); + +int ist30xx_get_tsp_info(struct ist30xx_data *data); +int ist30xx_get_tkey_info(struct ist30xx_data *data); + +int ist30xx_init_misc_sysfs(void); + +#endif // __IST30XX_MISC_H__ diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_sec.c b/drivers/input/touchscreen/ist30xx/ist30xx_sec.c new file mode 100644 index 00000000..d18c3b4b --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_sec.c @@ -0,0 +1,913 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#include +#include +#include +#include +#include +#include +#include + + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" + + + +static char IsfwUpdate[20] = { 0 }; + +#define FW_DOWNLOADING "Downloading" +#define FW_DOWNLOAD_COMPLETE "Complete" +#define FW_DOWNLOAD_FAIL "FAIL" + +#define FACTORY_BUF_SIZE (1024) +#define BUILT_IN (0) +#define UMS (1) + +#define CMD_STATE_WAITING (0) +#define CMD_STATE_RUNNING (1) +#define CMD_STATE_OK (2) +#define CMD_STATE_FAIL (3) +#define CMD_STATE_NA (4) + +#define TSP_NODE_DEBUG (1) + +static u16 node_value[TSP_TOTAL_NUM]; + +extern struct ist30xx_data *ts_data; +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; + + +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func +struct tsp_cmd { + struct list_head list; + const char * cmd_name; + void (*cmd_func)(void *dev_data); +}; + +u32 ist30xxb_get_fw_ver(struct ist30xx_data *data) +{ + u32 addr = data->tags.cfg_addr + 4; + u32 len = 1; + u32 ver = 0; + int ret = -EPERM; + + ist30xx_disable_irq(data); + ret = ist30xx_cmd_reg(data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret)) goto get_fw_ver_fail; + + ret = ist30xx_write_cmd(data->client, IST30XX_RX_CNT_ADDR, len); + if (unlikely(ret)) goto get_fw_ver_fail; + + ret = ist30xx_read_cmd(data->client, addr, &ver); + if (unlikely(ret)) goto get_fw_ver_fail; + + tsp_debug("Reg addr: %x, ver: %x\n", addr, ver); + + ret = ist30xx_cmd_reg(data->client, CMD_EXIT_REG_ACCESS); + if (likely(ret == 0)) + goto get_fw_ver_end; + +get_fw_ver_fail: + ist30xx_cmd_run_device(data->client, true); + +get_fw_ver_end: + ist30xx_cmd_start_scan(data->client); + ist30xx_enable_irq(data); + + return ver; +} + +int ist30xxb_get_key_sensitivity(struct ist30xx_data *data, int id) +{ + u32 addr = IST30XXB_MEM_COUNT + 4 * sizeof(u32); + u32 val = 0; + static u32 key_sensitivity = 0; + int ret = -EPERM; + + if (unlikely(id >= ist30xx_tkey_info.key_num)) + return 0; + + if (ist30xx_intr_wait(30) < 0) return 0; + + ret = ist30xx_read_cmd(data->client, addr, &val); + if ((val & 0xFFF) == 0xFFF) + return (key_sensitivity >> (16 * id)) & 0xFFFF; + + key_sensitivity = val; + + tsp_debug("Reg addr: %x, val: %8x\n", addr, val); + + val >>= (16 * id); + + return (int)(val & 0xFFFF); +} + + +/* Factory CMD function */ +static void set_default_result(struct sec_factory *sec) +{ + char delim = ':'; + + memset(sec->cmd_result, 0, ARRAY_SIZE(sec->cmd_result)); + memcpy(sec->cmd_result, sec->cmd, strlen(sec->cmd)); + strncat(sec->cmd_result, &delim, CMD_STATE_RUNNING); +} + +static void set_cmd_result(struct sec_factory *sec, char *buf, int len) +{ + strncat(sec->cmd_result, buf, len); +} + +static void not_support_cmd(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", "NA"); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_NA; + dev_info(&data->client->dev, "%s: \"%s(%d)\"\n", __func__, + buf, strnlen(buf, sizeof(buf))); + return; +} + +static void get_chip_vendor(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_VENDOR); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_name(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_NAME); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_id(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%#02x", data->chip_id); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} +#include +#define MAX_FW_PATH 255 +static void fw_update(void *dev_data) +{ + int ret; + char buf[16] = { 0 }; + mm_segment_t old_fs = {0}; + struct file *fp = NULL; + long fsize = 0, nread = 0; + u8 *fw; + char fw_path[MAX_FW_PATH+1]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case BUILT_IN: + sec->cmd_state = CMD_STATE_OK; + ret = ist30xx_fw_recovery(data); + if (ret < 0) { + sec->cmd_state = CMD_STATE_FAIL; + } + break; + case UMS: + sec->cmd_state = CMD_STATE_OK; + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FW_PATH, "/sdcard/%s", IST30XXB_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_warn("[TSP] %s(), file %s open error:%d\n", __func__, fw_path, (s32)fp); + sec->cmd_state= CMD_STATE_FAIL; + set_fs(old_fs); + break; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + if(fsize != data->fw.buf_size) { + tsp_warn("[TSP] %s(), invalid fw size!!\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + set_fs(old_fs); + break; + } + fw = kzalloc((size_t)fsize, GFP_KERNEL); + if (!fw) { + tsp_warn("[TSP] failed to alloc buffer for fw\n"); + sec->cmd_state = CMD_STATE_FAIL; + filp_close(fp, NULL); + set_fs(old_fs); + break; + } + nread = vfs_read(fp, (char __user *)fw, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_warn("[TSP] failed to read fw\n"); + sec->cmd_state = CMD_STATE_FAIL; + filp_close(fp, NULL); + set_fs(old_fs); + break; + } + + filp_close(fp, current->files); + set_fs(old_fs); + tsp_info("[TSP] %s(), ums fw is loaded!!\n", __func__); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(data->client, fw, fsize, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + ist30xx_init_touch_driver(data); + break; + + default: + tsp_warn("%s(), Invalid fw file type!\n", __func__); + break; + } + + if (sec->cmd_state == CMD_STATE_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); +} + + +static void get_fw_ver_bin(void *dev_data) +{ + u32 ver = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + ver = ist30xx_parse_ver(FLAG_PARAM, data->fw.buf); + snprintf(buf, sizeof(buf), "IM00%04x", ver); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_fw_ver_ic(void *dev_data) +{ + u32 ver = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->status.power == 1) + ver = ist30xxb_get_fw_ver(ts_data); + + snprintf(buf, sizeof(buf), "IM00%04x", ver & 0xFFFF); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_threshold(void *dev_data) +{ + char buf[16] = { 0 }; + int threshold; + u32 *cfg_buf; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + cfg_buf = (u32 *)&data->fw.buf[data->tags.cfg_addr]; + + threshold = (int)(cfg_buf[0x108 / IST30XX_DATA_LEN] >> 16); + + snprintf(buf, sizeof(buf), "%d", threshold); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_x_num(void *dev_data) +{ + int val = ist30xx_tsp_info.width; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +static void get_y_num(void *dev_data) +{ + int val = ist30xx_tsp_info.height; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +int check_tsp_channel(void *dev_data) +{ + int node = -EPERM; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= tsp->width) || + (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= tsp->height)) { + dev_info(&data->client->dev, "%s: parameter error: %u,%u\n", + __func__, sec->cmd_param[0], sec->cmd_param[1]); + } else { + node = sec->cmd_param[0] + sec->cmd_param[1] * tsp->width; + dev_info(&data->client->dev, "%s: node = %d\n", __func__, node); + } + + return node; +} + + +extern int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16); +void run_reference_read(void *dev_data) +{ + int i, ret; + int min_val, max_val; + char buf[16] = { 0 }; + u8 flag = NODE_FLAG_RAW; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &ist30xx_tsp_info; + + set_default_result(sec); + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node read fail!\n", __func__); + return; + } + ist30xx_parse_touch_node(flag, &tsp->node); + + ret = parse_tsp_node(flag, &tsp->node, node_value); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag); + return; + } + + min_val = max_val = node_value[0]; + for (i = 0; i < tsp->width * tsp->height; i++) { +#if TSP_NODE_DEBUG + if ((i % tsp->width) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", node_value[i]); +#endif + + max_val = max(max_val, (int)node_value[i]); + min_val = min(min_val, (int)node_value[i]); + } + + snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val); + tsp_info("%s(), %s\n", __func__, buf); + + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void get_reference(void *dev_data) +{ + int idx = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + idx = check_tsp_channel(data); + if (idx < 0) { // Parameter parsing fail + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + } else { + snprintf(buf, sizeof(buf), "%d", node_value[idx]); + sec->cmd_state = CMD_STATE_OK; + } + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), [%d][%d]: %s\n", __func__, + sec->cmd_param[0], sec->cmd_param[1], buf); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + + + +/* sysfs: /sys/class/sec/tsp/close_tsp_test */ +static ssize_t show_close_tsp_test(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0); +} + +/* sysfs: /sys/class/sec/tsp/cmd */ +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + struct i2c_client *client = data->client; + + char *cur, *start, *end; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + int ret; + + if (sec->cmd_is_running == true) { + dev_err(&client->dev, "tsp_cmd: other cmd is running.\n"); + tsp_err("tsp_cmd: other cmd is running.\n"); + goto err_out; + } + + /* check lock */ + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = true; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_RUNNING; + + for (i = 0; i < ARRAY_SIZE(sec->cmd_param); i++) + sec->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + memset(sec->cmd, 0, ARRAY_SIZE(sec->cmd)); + memcpy(sec->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(msg, buf, cur - buf); + else + memcpy(msg, buf, len); + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp(msg, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(msg, 0, ARRAY_SIZE(msg)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(msg, start, end - start); + *(msg + strlen(msg)) = '\0'; + ret = kstrtoint(msg, 10, \ + sec->cmd_param + param_cnt); + start = cur + 1; + memset(msg, 0, ARRAY_SIZE(msg)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + tsp_info("SEC CMD = %s\n", tsp_cmd_ptr->cmd_name); + + for (i = 0; i < param_cnt; i++) + dev_info(&client->dev, "cmd param %d= %d\n", i, sec->cmd_param[i]); + + tsp_cmd_ptr->cmd_func(data); + +err_out: + return count; +} + +/* sysfs: /sys/class/sec/tsp/cmd_status */ +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + char msg[16] = { 0 }; + + dev_info(&data->client->dev, "tsp cmd: status:%d\n", sec->cmd_state); + + if (sec->cmd_state == CMD_STATE_WAITING) + snprintf(msg, sizeof(msg), "WAITING"); + + else if (sec->cmd_state == CMD_STATE_RUNNING) + snprintf(msg, sizeof(msg), "RUNNING"); + + else if (sec->cmd_state == CMD_STATE_OK) + snprintf(msg, sizeof(msg), "OK"); + + else if (sec->cmd_state == CMD_STATE_FAIL) + snprintf(msg, sizeof(msg), "FAIL"); + + else if (sec->cmd_state == CMD_STATE_NA) + snprintf(msg, sizeof(msg), "NOT_APPLICABLE"); + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", msg); +} + +/* sysfs: /sys/class/sec/tsp/result */ +static ssize_t show_cmd_result(struct device *dev, struct device_attribute + *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + dev_info(&data->client->dev, "tsp cmd: result: %s\n", sec->cmd_result); + + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = false; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_WAITING; + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", sec->cmd_result); +} + + + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_version_phone */ +static ssize_t phone_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + u32 ver = ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_version_panel */ +static ssize_t part_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + u32 ver = 0; + + if (ts_data->status.power == 1) + ver = ist30xxb_get_fw_ver(ts_data); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_threshold */ +static ssize_t threshold_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int threshold; + u32 *cfg_buf; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + cfg_buf = (u32 *)&ts_data->fw.buf[ts_data->tags.cfg_addr]; + + threshold = (int)(cfg_buf[0x108 / IST30XX_DATA_LEN] >> 16); + + tsp_info("%s(), %d\n", __func__, threshold); + + return sprintf(buf, "%d", threshold); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_update */ +static ssize_t firmware_update(struct device *dev, struct device_attribute *attr, char *buf) +{ + bool ret; + + sprintf(IsfwUpdate, "%s\n", FW_DOWNLOADING); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + ret = ist30xx_fw_recovery(ts_data); + ret = (ret == 0 ? 1 : -1); + + sprintf(IsfwUpdate, "%s\n", + (ret > 0 ? FW_DOWNLOAD_COMPLETE : FW_DOWNLOAD_FAIL)); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%d", ret); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_update_status */ +static ssize_t firmware_update_status(struct device *dev, struct device_attribute *attr, char *buf) +{ + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%s\n", IsfwUpdate); +} + + +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_recent */ +static ssize_t recent_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 0); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d\n", sensitivity); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_back */ +static ssize_t back_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 1); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d\n", sensitivity); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_threshold */ +static ssize_t touchkey_threshold_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int threshold; + u32 *cfg_buf; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + cfg_buf = (u32 *)&ts_data->fw.buf[ts_data->tags.cfg_addr]; + + threshold = (int)(cfg_buf[0x134 / IST30XX_DATA_LEN] >> 16); + + tsp_info("%s(), %d\n", __func__, threshold); + + return snprintf(buf, sizeof(int), "%d\n", threshold); +} +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_dummy_btn1 */ +static ssize_t touchkey_dummy_btn1_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk("[TSP]Hidden btn 1 not supported\n"); + return 0; +} +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_dummy_btn3 */ +static ssize_t touchkey_dummy_btn3_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk("[TSP]Hidden btn 3 not supported\n"); + return 0; +} +struct tsp_cmd tsp_cmd[] = { + { TSP_CMD("get_chip_vendor", get_chip_vendor), }, + { TSP_CMD("get_chip_name", get_chip_name), }, + { TSP_CMD("get_chip_id", get_chip_id), }, + { TSP_CMD("fw_update", fw_update), }, + { TSP_CMD("get_fw_ver_bin", get_fw_ver_bin), }, + { TSP_CMD("get_fw_ver_ic", get_fw_ver_ic), }, + { TSP_CMD("get_threshold", get_threshold), }, + { TSP_CMD("get_x_num", get_x_num), }, + { TSP_CMD("get_y_num", get_y_num), }, + { TSP_CMD("run_reference_read", run_reference_read),}, + { TSP_CMD("get_reference", get_reference), }, + { TSP_CMD("not_support_cmd", not_support_cmd), }, +}; + +#define SEC_DEFAULT_ATTR (S_IRUGO | S_IWUSR | S_IWGRP) +/* sysfs - touchscreen */ +static DEVICE_ATTR(tsp_firm_version_phone, SEC_DEFAULT_ATTR, + phone_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_version_panel, SEC_DEFAULT_ATTR, + part_firmware_show, NULL); +static DEVICE_ATTR(tsp_threshold, SEC_DEFAULT_ATTR, + threshold_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_update, SEC_DEFAULT_ATTR, + firmware_update, NULL); +static DEVICE_ATTR(tsp_firm_update_status, SEC_DEFAULT_ATTR, + firmware_update_status, NULL); + +/* sysfs - touchkey */ +static DEVICE_ATTR(touchkey_recent, SEC_DEFAULT_ATTR, + recent_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_back, SEC_DEFAULT_ATTR, + back_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_threshold, SEC_DEFAULT_ATTR, + touchkey_threshold_show, NULL); +static DEVICE_ATTR(touchkey_dummy_btn1, SEC_DEFAULT_ATTR, + touchkey_dummy_btn1_show,NULL); +static DEVICE_ATTR(touchkey_dummy_btn3, SEC_DEFAULT_ATTR, + touchkey_dummy_btn3_show,NULL); + +/* sysfs - tsp */ +static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *sec_tsp_attributes[] = { + &dev_attr_tsp_firm_version_phone.attr, + &dev_attr_tsp_firm_version_panel.attr, + &dev_attr_tsp_threshold.attr, + &dev_attr_tsp_firm_update.attr, + &dev_attr_tsp_firm_update_status.attr, + NULL, +}; + +static struct attribute *sec_tkey_attributes[] = { + &dev_attr_touchkey_recent.attr, + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_threshold.attr, + &dev_attr_touchkey_dummy_btn1.attr, + &dev_attr_touchkey_dummy_btn3.attr, + NULL, +}; + +static struct attribute *sec_touch_facotry_attributes[] = { + &dev_attr_close_tsp_test.attr, + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group sec_tsp_attr_group = { + .attrs = sec_tsp_attributes, +}; + +static struct attribute_group sec_tkey_attr_group = { + .attrs = sec_tkey_attributes, +}; + +static struct attribute_group sec_touch_factory_attr_group = { + .attrs = sec_touch_facotry_attributes, +}; + +extern struct class *sec_class; +struct device *sec_touchscreen; +EXPORT_SYMBOL(sec_touchscreen); +struct device *sec_touchkey; +EXPORT_SYMBOL(sec_touchkey); +struct device *sec_fac_dev; + + +int sec_touch_sysfs(struct ist30xx_data *data) +{ + /* /sys/class/sec/sec_touchscreen */ + sec_touchscreen = device_create(sec_class, NULL, 0, NULL, "sec_touchscreen"); + if (IS_ERR(sec_touchscreen)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchscreen"); + return -ENODEV; + } + /* /sys/class/sec/sec_touchscreen/... */ + if (sysfs_create_group(&sec_touchscreen->kobj, &sec_tsp_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchscreen"); + + /* /sys/class/sec/sec_touchkey */ + sec_touchkey = device_create(sec_class, NULL, 0, NULL, "sec_touchkey"); + if (IS_ERR(sec_touchkey)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchkey"); + return -ENODEV; + } + /* /sys/class/sec/sec_touchkey/... */ + if (sysfs_create_group(&sec_touchkey->kobj, &sec_tkey_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchkey"); + + /* /sys/class/sec/tsp */ + sec_fac_dev = device_create(sec_class, NULL, 0, data, "tsp"); + if (IS_ERR(sec_fac_dev)) { + tsp_err("Failed to create device (%s)!\n", "tsp"); + return -ENODEV; + } + /* /sys/class/sec/tsp/... */ + if (sysfs_create_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "tsp"); + + return 0; +} + +int sec_fac_cmd_init(struct ist30xx_data *data) +{ + int i; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + INIT_LIST_HEAD(&sec->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmd); i++) + list_add_tail(&tsp_cmd[i].list, &sec->cmd_list_head); + + mutex_init(&sec->cmd_lock); + sec->cmd_is_running = false; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_sec.h b/drivers/input/touchscreen/ist30xx/ist30xx_sec.h new file mode 100644 index 00000000..517e14b8 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_sec.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_SEC_H__ +#define __IST30XX_SEC_H__ + + +#define SEC_CMD_STR_LEN 32 +#define SEC_CMD_RESULT_STR_LEN 512 +#define SEC_CMD_PARAM_NUM 8 + +#include "ist30xx_tsp.h" + +struct sec_factory { + struct list_head cmd_list_head; + unsigned char cmd_state; + char cmd[SEC_CMD_STR_LEN]; + int cmd_param[SEC_CMD_PARAM_NUM]; + char cmd_result[SEC_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; +}; + +#endif // __IST30XX_SEC_H__ diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_sys.c b/drivers/input/touchscreen/ist30xx/ist30xx_sys.c new file mode 100644 index 00000000..0db0f318 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_sys.c @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +/* Removing the error for finding mach/vreg.h +#include +*/ +#include "ist30xx.h" +#include "ist30xx_tracking.h" +/*For regulators*/ +#include + + + + + + + +/****************************************************************************** + * Return value of Error + * EPERM : 1 (Operation not permitted) + * ENOENT : 2 (No such file or directory) + * EIO : 5 (I/O error) + * ENXIO : 6 (No such device or address) + * EINVAL : 22 (Invalid argument) + *****************************************************************************/ + +extern struct ist30xx_data *ts_data; +const u32 pos_cmd = cpu_to_be32(CMD_GET_COORD); +struct i2c_msg pos_msg[READ_CMD_MSG_LEN] = { + { + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&pos_cmd, + }, + { .flags = I2C_M_RD, }, +}; + +int ist30xx_get_position(struct i2c_client *client, u32 *buf, u16 len) +{ + int ret, i; + + pos_msg[0].addr = client->addr; + pos_msg[1].addr = client->addr; + pos_msg[1].len = len * IST30XX_DATA_LEN, + pos_msg[1].buf = (u8 *)buf, + + ret = i2c_transfer(client->adapter, pos_msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d)\n", __func__, ret); + return -EIO; + } + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_cmd_run_device(struct i2c_client *client, bool is_reset) +{ + int ret = -EIO; + + if (is_reset == true) ist30xx_reset(); + ret = ist30xx_write_cmd(client, CMD_RUN_DEVICE, 0); + + ist30xx_tracking(TRACK_CMD_RUN_DEVICE); + + msleep(10); + + return ret; +} + +int ist30xx_cmd_start_scan(struct i2c_client *client) +{ + int ret; + + ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0); + + ist30xx_tracking(TRACK_CMD_SCAN); + + msleep(100); + + ts_data->status.noise_mode = true; + + return ret; +} + +int ist30xx_cmd_calibrate(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, CMD_CALIBRATE, 0); + + ist30xx_tracking(TRACK_CMD_CALIB); + + tsp_info("%s\n", __func__); + + msleep(100); + + return ret; +} + +int ist30xx_cmd_check_calib(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, CMD_CHECK_CALIB, 0); + + ist30xx_tracking(TRACK_CMD_CHECK_CALIB); + + tsp_info("*** Check Calibration cmd ***\n"); + + msleep(20); + + return ret; +} + +int ist30xx_cmd_update(struct i2c_client *client, int cmd) +{ + u32 val = (cmd == CMD_ENTER_FW_UPDATE ? CMD_FW_UPDATE_MAGIC : 0); + int ret = ist30xx_write_cmd(client, cmd, val); + + ist30xx_tracking(TRACK_CMD_FWUPDATE); + + msleep(10); + + return ret; +} + +int ist30xx_cmd_reg(struct i2c_client *client, int cmd) +{ + int ret = ist30xx_write_cmd(client, cmd, 0); + + if (cmd == CMD_ENTER_REG_ACCESS) { + ist30xx_tracking(TRACK_CMD_ENTER_REG); + msleep(100); + } else if (cmd == CMD_EXIT_REG_ACCESS) { + ist30xx_tracking(TRACK_CMD_EXIT_REG); + msleep(10); + } + + return ret; +} + + +int ist30xx_read_cmd(struct i2c_client *client, u32 cmd, u32 *buf) +{ + int ret,count=0; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; +retry: + ret = i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + if(count++ < 3) + goto retry; + tsp_err("%s: i2c failed (%d), cmd: %x\n", __func__, ret, cmd); + return -EIO; + } + *buf = cpu_to_be32(*buf); + + return 0; +} + + +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val) +{ + int ret,count=0; + struct i2c_msg msg; + u8 msg_buf[IST30XX_ADDR_LEN + IST30XX_DATA_LEN]; + + put_unaligned_be32(cmd, msg_buf); + put_unaligned_be32(val, msg_buf + IST30XX_ADDR_LEN); + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_ADDR_LEN + IST30XX_DATA_LEN; + msg.buf = msg_buf; +retry: + ret = i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN); + if (ret != WRITE_CMD_MSG_LEN) { + if(count++ < 3) + goto retry; + tsp_err("%s: i2c failed (%d), cmd: %x(%x)\n", __func__, ret, cmd, val); + return -EIO; + } + + return 0; +} + +static void ts_power_enable(int en) +{ + + + static struct regulator *ts_vdd = NULL; + + if (ts_vdd == NULL) { + ts_vdd = regulator_get(NULL, "vddsim2"); + + if (IS_ERR(ts_vdd)) { + pr_err("Get regulator of TSP error!\n"); + return; + } + } + if (en) { + regulator_set_voltage(ts_vdd, 3000000, 3000000); + regulator_enable(ts_vdd); + } + else if (regulator_is_enabled(ts_vdd)) { + regulator_disable(ts_vdd); + } + + + printk(KERN_INFO "%s %s\n", __func__, (en) ? "on" : "off"); + printk("%s: TS power change to %d.\n", __func__, en); +} + +int ist30xx_power_on(void) +{ + if (ts_data->status.power != 1) { + tsp_info("%s()\n", __func__); + /* VDD enable */ + /* VDDIO enable */ + ist30xx_tracking(TRACK_PWR_ON); + ts_power_enable(1); + msleep(100); + ts_data->status.power = 1; + printk("[ TSP ] %s\n", __func__); + } + + return 0; +} + + +int ist30xx_power_off(void) +{ + if (ts_data->status.power != 0) { + tsp_info("%s()\n", __func__); + /* VDDIO disable */ + /* VDD disable */ + ist30xx_tracking(TRACK_PWR_OFF); + ts_power_enable(0); + msleep(50); + ts_data->status.power = 0; + ts_data->status.noise_mode = false; + printk("[ TSP ] %s\n", __func__); + } + + return 0; +} + + +int ist30xx_reset(void) +{ + tsp_info("%s()\n", __func__); + ist30xx_power_off(); + msleep(10); + ist30xx_power_on(); + + ts_data->status.power = 1; + return 0; +} + + +int ist30xx_internal_suspend(struct ist30xx_data *data) +{ + ist30xx_power_off(); + return 0; +} + + +int ist30xx_internal_resume(struct ist30xx_data *data) +{ + ist30xx_power_on(); + ist30xx_cmd_run_device(data->client, false); + return 0; +} + + +int ist30xx_init_system(void) +{ + int ret; + + // TODO : place additional code here. + ret = ist30xx_power_on(); + if (ret) { + tsp_err("%s: ist30xx_power_on failed (%d)\n", __func__, ret); + return -EIO; + } +#if 0 + ret = ist30xx_reset(); + if (ret) { + tsp_err("%s: ist30xx_reset failed (%d)\n", __func__, ret); + return -EIO; + } +#endif + return 0; +} diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_tracking.c b/drivers/input/touchscreen/ist30xx/ist30xx_tracking.c new file mode 100644 index 00000000..b3f153e1 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_tracking.c @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +/* Including the definition of S_IRWXUGO */ +// Can use S_IRUGO for better security. Verify the same. +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" +#include "ist30xx_tracking.h" + + +IST30XX_RING_BUF TrackBuf; +IST30XX_RING_BUF *pTrackBuf; + +bool tracking_initialize = false; + +void ist30xx_tracking_init(void) +{ + if (tracking_initialize) + return; + + pTrackBuf = &TrackBuf; + + pTrackBuf->RingBufCtr = 0; + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->RingBufOutIdx = 0; + + tracking_initialize = true; +} + +void ist30xx_tracking_deinit(void) +{ +} + +int ist30xx_get_track(u32 *track, int cnt) +{ + int i; + u8 *buf = (u8 *)track; + unsigned long flags; + spinlock_t mr_lock = __SPIN_LOCK_UNLOCKED(); + + cnt *= sizeof(track[0]); + + if (pTrackBuf->RingBufCtr < (u16)cnt) + return IST30XX_RINGBUF_NOT_ENOUGH; + + spin_lock_irqsave(&mr_lock, flags); + + for (i = 0; i < cnt; i++) { + if (pTrackBuf->RingBufOutIdx == IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufOutIdx = 0; + + *buf++ = (u8)pTrackBuf->LogBuf[pTrackBuf->RingBufOutIdx++]; + pTrackBuf->RingBufCtr--; + } + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +u32 ist30xx_get_track_cnt(void) +{ + return pTrackBuf->RingBufCtr; +} + +#if IST30XX_TRACKING_MODE +int ist30xx_put_track(u32 *track, int cnt) +{ + int i; + u8 *buf = (u8 *)track; + unsigned long flags; + spinlock_t mr_lock = __SPIN_LOCK_UNLOCKED(); + + spin_lock_irqsave(&mr_lock, flags); + + cnt *= sizeof(track[0]); + + pTrackBuf->RingBufCtr += cnt; + if (pTrackBuf->RingBufCtr > IST30XX_MAX_LOG_SIZE) { + pTrackBuf->RingBufOutIdx += + (pTrackBuf->RingBufCtr - IST30XX_MAX_LOG_SIZE); + if (pTrackBuf->RingBufOutIdx >= IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufOutIdx -= IST30XX_MAX_LOG_SIZE; + + pTrackBuf->RingBufCtr = IST30XX_MAX_LOG_SIZE; + } + + for (i = 0; i < cnt; i++) { + if (pTrackBuf->RingBufInIdx == IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->LogBuf[pTrackBuf->RingBufInIdx++] = *buf++; + } + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +int ist30xx_put_track_ms(u32 ms) +{ + ms &= 0x0000FFFF; + ms |= IST30XX_TRACKING_MAGIC; + + return ist30xx_put_track(&ms, 1); +} + +static struct timespec t_track; +int ist30xx_tracking(u32 status) +{ + u32 ms; + + if (!tracking_initialize) + ist30xx_tracking_init(); + + ktime_get_ts(&t_track); + ms = t_track.tv_sec * 1000 + t_track.tv_nsec / 1000000; + + ist30xx_put_track_ms(ms); + ist30xx_put_track(&status, 1); + + return 0; +} +#else +int ist30xx_put_track(u32 *track, int cnt) +{ + return 0; +} +int ist30xx_put_track_ms(u32 ms) +{ + return 0; +} +int ist30xx_tracking(u32 status) +{ + return 0; +} +#endif // IST30XX_TRACKING_MODE + +#define MAX_TRACKING_COUNT (1024) +struct timespec t_curr; // ns + +/* sysfs: /sys/class/touch/tracking/track_frame */ +ssize_t ist30xx_track_frame_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i, buf_cnt = 0; + u32 track_cnt = MAX_TRACKING_COUNT; + u32 track; + char msg[10]; + + mutex_lock(&ist30xx_mutex); + + buf[0] = '\0'; + + if (track_cnt > ist30xx_get_track_cnt()) + track_cnt = ist30xx_get_track_cnt(); + + track_cnt /= sizeof(track); + + tsp_verb("num: %d of %d\n", track_cnt, ist30xx_get_track_cnt()); + + for (i = 0; i < track_cnt; i++) { + ist30xx_get_track(&track, 1); + + tsp_verb("%08X\n", track); + + buf_cnt += sprintf(msg, "%08x", track); + strcat(buf, msg); + } + + mutex_unlock(&ist30xx_mutex); + + return buf_cnt; +} + +/* sysfs: /sys/class/touch/tracking/track_cnt */ +ssize_t ist30xx_track_cnt_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + u32 val = (u32)ist30xx_get_track_cnt(); + + tsp_verb("tracking cnt: %d\n", val); + + return sprintf(buf, "%08x", val); +} + + +/* sysfs */ +static DEVICE_ATTR(track_frame, S_IRUGO, ist30xx_track_frame_show, NULL); +static DEVICE_ATTR(track_cnt, S_IRUGO, ist30xx_track_cnt_show, NULL); + +static struct attribute *tracking_attributes[] = { + &dev_attr_track_frame.attr, + &dev_attr_track_cnt.attr, + NULL, +}; + +static struct attribute_group tracking_attr_group = { + .attrs = tracking_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_tracking_dev; + +int ist30xx_init_tracking_sysfs(void) +{ + /* /sys/class/touch/tracking */ + ist30xx_tracking_dev = device_create(ist30xx_class, NULL, 0, NULL, "tracking"); + + /* /sys/class/touch/tracking/... */ + if (sysfs_create_group(&ist30xx_tracking_dev->kobj, &tracking_attr_group)) + tsp_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tracking"); + + ist30xx_tracking_init(); + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_tracking.h b/drivers/input/touchscreen/ist30xx/ist30xx_tracking.h new file mode 100644 index 00000000..8655090e --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_tracking.h @@ -0,0 +1,57 @@ +#ifndef __IST30XX_TRACKING_H__ +#define __IST30XX_TRACKING_H__ + + +#define IST30XX_RINGBUF_NO_ERR (0) +#define IST30XX_RINGBUF_NOT_ENOUGH (1) +#define IST30XX_RINGBUF_EMPTY (2) +#define IST30XX_RINGBUF_FULL (3) +#define IST30XX_RINGBUF_TIMEOUT (4) +#define IST30XX_MAX_LOG_SIZE (4 * 100 * 1024) // 4bytes * 100Kbytes, Single touch: about 12minutes + +#define TRACK_PWR_OFF (0x0) +#define TRACK_PWR_ON (0x1) +#define TRACK_PWR_RESET (0x3) +#define TRACK_INTR_ENABLE (0x4) +#define TRACK_INTR_DISABLE (0x5) +#define TRACK_CMD_RUN_DEVICE (0x10) +#define TRACK_CMD_SCAN (0x11) +#define TRACK_CMD_TACON (0x12) +#define TRACK_CMD_TADISCON (0x13) +#define TRACK_CMD_FWUPDATE (0x14) +#define TRACK_CMD_PRUPDATE (0x15) +#define TRACK_CMD_CALIB (0x16) +#define TRACK_CMD_CHECK_CALIB (0x17) +#define TRACK_CMD_CHKSUM (0x18) +#define TRACK_CMD_CHKSUM_ALL (0x19) +#define TRACK_CMD_ENTER_REG (0x1A) +#define TRACK_CMD_EXIT_REG (0x1B) +#define TRACK_POS_FINGER (0x20) +#define TRACK_POS_KEY (0x30) +#define TRACK_POS_UNKNOWN (0x3F) + +#define IST30XX_TRACKING_MAGIC (0x7750 << 16) + + +typedef struct _IST30XX_RINGBUF { + u32 RingBufCtr; // Number of characters in the ring buffer + u32 RingBufInIdx; + u32 RingBufOutIdx; + u8 LogBuf[IST30XX_MAX_LOG_SIZE]; // Ring buffer for status +} IST30XX_RING_BUF; + + +void ist30xx_tracking_init(void); +void ist30xx_tracking_deinit(void); + +int ist30xx_get_track(u32 *track, int cnt); +int ist30xx_put_track(u32 *track, int cnt); +int ist30xx_put_track_ms(u32 ms); + +u32 ist30xx_get_track_cnt(void); + +int ist30xx_tracking(u32 status); + +int ist30xx_init_tracking_sysfs(void); + +#endif // __IST30XX_TRACKING_H__ diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_tsp.h b/drivers/input/touchscreen/ist30xx/ist30xx_tsp.h new file mode 100644 index 00000000..aca0a629 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_tsp.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_TSP_H__ +#define __IST30XX_TSP_H__ + +#define IST30XX_DD_VERSION (3) +// Multi TSP not yet enabled in imagis 3038. +#define IST30XX_MULTIPLE_TSP (0) + +#define TSP_CHIP_VENDOR ("IMAGIS") +#define TSP_CHIP_NAME ("IST3038") + +#define FLAG_NODE_Y (0) +#define FLAG_NODE_X (1) + +#define NODE_TX_NUM (22) +#define NODE_RX_NUM (14) +#define NODE_TOTAL_NUM (NODE_TX_NUM * NODE_RX_NUM) + +#define TSP_TX_NUM (21) +#define TSP_RX_NUM (13) +#define TSP_TOTAL_NUM (TSP_TX_NUM * TSP_RX_NUM) + +#define TSP_THRESHOLD (30) +#define TKEY_THRESHOLD (600) + +#define IST30XXB_PARSE_TSPTYPE(k) ((k >> 1) & 0xF) + +#define TSP_TYPE_UNKNOWN (0xF0) +#define TSP_TYPE_ALPS (0xF) +#define TSP_TYPE_EELY (0xE) +#define TSP_TYPE_TOP (0xD) +#define TSP_TYPE_MELFAS (0xC) +#define TSP_TYPE_ILJIN (0xB) +#define TSP_TYPE_SYNOPEX (0xA) +#define TSP_TYPE_SMAC (0x9) +#define TSP_TYPE_OTHERS (0x8) + +#endif // __IST30XX_TSP_H__ diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_update.c b/drivers/input/touchscreen/ist30xx/ist30xx_update.c new file mode 100644 index 00000000..17379061 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_update.c @@ -0,0 +1,1449 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +/* Including the definition of S_IRWXUGO */ +// Can use S_IRUGO for better security. Verify the same. +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_tracking.h" + +#if IST30XX_DEBUG +#include "ist30xx_misc.h" +#endif + +#if IST30XX_INTERNAL_BIN +#if defined(CONFIG_MACH_KANAS) +#include "./firmware/IST3038_FW_KANAS.h" +#elif defined(CONFIG_MACH_TSHARKWSAMSUNG) +#include "./firmware/ist3038_fw_tshark_ver0007.h" +#elif defined(CONFIG_MACH_CORE3) +#include "./firmware/ist3038_fw_kanas_ver0006_20140401.h" +#else +#include "./firmware/ist3038_fw_kanas_ver0006_20140401.h" +#endif +# if IST30XX_MULTIPLE_TSP +# include "./firmware/ist3038_fw_kanas_ver0001_20140225.h" //Not proper file +# include "./firmware/ist3038_fw_kanas_ver0001_20140225.h" //Not proper file +# endif +#endif // IST30XX_INTERNAL_BIN + +struct ist30xx_tags *ts_tags; + +u32 ist30xx_fw_ver = 0; +u32 ist30xx_param_ver = 0; +u32 ist30xx_sub_ver = 0; + +extern struct ist30xx_data *ts_data; + +extern void ist30xx_disable_irq(struct ist30xx_data *data); +extern void ist30xx_enable_irq(struct ist30xx_data *data); + + +int ist30xx_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + int msg_num, u8 *cmd_buf) +{ + int ret = 0; + int idx = msg_num - 1; + int size = msgs[idx].len; + u8 *msg_buf = NULL; + u8 *pbuf = NULL; + int max_size = 0; + + if (msg_num == WRITE_CMD_MSG_LEN) + max_size = I2C_MAX_WRITE_SIZE; + else if (msg_num == READ_CMD_MSG_LEN) + max_size = I2C_MAX_READ_SIZE; + + if (unlikely(max_size == 0)) { + tsp_err("%s() : transaction size(%d)\n", __func__, max_size); + return -EINVAL; + } + + if (msg_num == WRITE_CMD_MSG_LEN) { + msg_buf = kmalloc(max_size + IST30XX_ADDR_LEN, GFP_KERNEL); + if (!msg_buf) + return -ENOMEM; + memcpy(msg_buf, cmd_buf, IST30XX_ADDR_LEN); + pbuf = msgs[idx].buf; + } + + while (size > 0) { + int trans_size = (size >= max_size ? max_size : size); + + msgs[idx].len = trans_size; + if (msg_num == WRITE_CMD_MSG_LEN) { + memcpy(&msg_buf[IST30XX_ADDR_LEN], pbuf, trans_size); + msgs[idx].buf = msg_buf; + msgs[idx].len += IST30XX_ADDR_LEN; + } + ret = i2c_transfer(adap, msgs, msg_num); + if (unlikely(ret != msg_num)) { + tsp_err("%s() : i2c_transfer failed(%d), num=%d\n", + __func__, ret, msg_num); + break; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + pbuf += trans_size; + else + msgs[idx].buf += trans_size; + + size -= trans_size; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + kfree(msg_buf); + + return ret; +} + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int ret, i; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len * IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = ist30xx_i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN, NULL); + if (unlikely(ret != READ_CMD_MSG_LEN)) + return -EIO; + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int ret; + struct i2c_msg msg; + u8 cmd_buf[IST30XX_ADDR_LEN]; + u8 msg_buf[IST30XX_DATA_LEN * (len + 1)]; + + put_unaligned_be32(cmd, cmd_buf); + + if (likely(len > 0)) { + int i; + for (i = 0; i < len; i++) + put_unaligned_be32(buf[i], msg_buf + (i * IST30XX_DATA_LEN)); + } else { + /* then add dummy data(4byte) */ + put_unaligned_be32(0, msg_buf); + len = 1; + } + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_DATA_LEN * len; + msg.buf = msg_buf; + + ret = ist30xx_i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN, cmd_buf); + if (unlikely(ret != WRITE_CMD_MSG_LEN)) + return -EIO; + + return 0; +} + +int ist30xxb_burst_read(struct i2c_client *client, u32 addr, + u32 *buf32, int len) +{ + int i; + int max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + + addr |= IST30XXB_BURST_ACCESS; + + for (i = 0; i < len; i += max_len) { + int ret = 0; + if (len < max_len) max_len = len; + + ret = ist30xx_read_buf(client, addr, buf32, max_len); + if (unlikely(ret)) { + tsp_err("Burst fail, addr: %x\n", __func__, addr); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + } + + return 0; +} + +#define IST30XXB_ISP_READ (1) +#define IST30XXB_ISP_WRITE (2) +#define IST30XXB_ISP_ERASE_ALL (3) +#define IST30XXB_ISP_ERASE_PAGE (4) + +int ist30xxb_isp_reset(void) +{ + int ret = 0; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPPWRCTRL, 0xB200); + if (unlikely(ret)) return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPPWRCTRL, 0x9200); + if (unlikely(ret)) return ret; + + msleep(1); + + return ret; +} + +int ist30xxb_isp_enable(bool enable) +{ + int ret = 0; + + if (enable) { + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPISPEN, 0x3); + if (unlikely(ret)) return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_LDOOSC, 0xF4C8); + if (unlikely(ret)) return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_CLKDIV, 0x3); + if (unlikely(ret)) return ret; + + msleep(5); + } else { + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPISPEN, 0x2); + if (unlikely(ret)) return ret; + + msleep(1); + } + + return 0; +} + +int ist30xxb_isp_mode(int mode) +{ + int ret = 0; + u32 val = 0; + + switch (mode) { + case IST30XXB_ISP_READ: + val = 0x1C0; + break; + case IST30XXB_ISP_WRITE: + val = 0x1A8; + break; + case IST30XXB_ISP_ERASE_ALL: + val = 0x1A7; + break; + case IST30XXB_ISP_ERASE_PAGE: + val = 0x1A3; + break; + default: + tsp_err("ISP fail, unknown mode\n"); + return -EINVAL; + } + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPMODE, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPMODE\n"); + return ret; + } + + return 0; +} + +int ist30xxb_isp_erase(struct i2c_client *client, int mode, u32 addr) +{ + int ret = 0; + u32 val = 0x1A0; + u8 buf[EEPROM_PAGE_SIZE] = { 0, }; + + ret = ist30xxb_isp_mode(mode); + if (unlikely(ret)) return ret; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + val = (EEPROM_PAGE_SIZE / IST30XX_DATA_LEN); + ret = ist30xx_write_buf(client, IST30XXB_REG_EEPWDAT, (u32 *)buf, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + msleep(30); + + ist30xxb_isp_reset(); + + return 0; +} + +int ist30xxb_isp_write(struct i2c_client *client, u32 addr, + const u32 *buf32, int len) +{ + int ret = 0; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + ret = ist30xx_write_buf(client, IST30XXB_REG_EEPWDAT, (u32 *)buf32, len); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + return 0; +} + +int ist30xxb_isp_read(struct i2c_client *client, u32 addr, + u32 *buf32, int len) +{ + int i; + int max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + + for (i = 0; i < len; i += max_len) { + int ret = 0; + if (len < max_len) max_len = len; + + /* IST30xxB ISP read mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_READ); + if (unlikely(ret)) return ret; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + ret = ist30xx_read_buf(client, IST30XXB_REG_EEPRDAT, buf32, max_len); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + } + + return 0; +} + +int ist30xxb_cmd_read_chksum(struct i2c_client *client, + u32 start_addr, u32 end_addr, u32 *chksum) +{ + int ret = 0; + u32 val = (1 << 31); // Chkecksum enable + + val |= start_addr; + val |= (end_addr / IST30XX_DATA_LEN - 1) << 16; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_CHKSMOD, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_CHKSMOD (%x)\n", val); + return ret; + } + + msleep(10); + + ret = ist30xx_read_cmd(client, IST30XXB_REG_CHKSDAT, chksum); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_CHKSDAT (%x)\n", chksum); + return ret; + } + + tsp_verb("chksum: %x (%x~%x)\n", *chksum, start_addr, end_addr); + + return 0; +} + +int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum) +{ + int ret = 0; + u32 start_addr, end_addr; + u32 chksum1 = 0, chksum2 = 0; + + start_addr = 0; + end_addr = ts_data->tags.flag_addr; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, &chksum1); + if (unlikely(ret)) return ret; + + start_addr = ts_data->tags.flag_addr + ts_data->tags.flag_size; + end_addr = ts_data->tags.sensor2_addr + ts_data->tags.sensor2_size; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, &chksum2); + if (unlikely(ret)) return ret; + + *chksum = chksum1 | (chksum2 << 16); + + tsp_info("Chksum: %x(%x~%x, %x~%x)\n", *chksum, 0, ts_data->tags.flag_addr, + start_addr, end_addr); + + return 0; +} + + +int ist30xxb_isp_fw_read(struct i2c_client *client, u32 *buf32) +{ + int ret = 0; + int i; + + u16 addr = EEPROM_BASE_ADDR; + int len = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + ist30xx_reset(); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (unlikely(ret)) return ret; + + for (i = 0; i < IST30XX_EEPROM_SIZE; i += EEPROM_PAGE_SIZE) { + ret = ist30xxb_isp_read(client, addr, buf32, len); + if (unlikely(ret)) goto isp_fw_read_end; + + addr += EEPROM_PAGE_SIZE; + buf32 += len; + } + +isp_fw_read_end: + /* IST30xxB ISP disable */ + ist30xxb_isp_enable(false); + return ret; +} + +int ist30xxb_isp_fw_update(struct i2c_client *client, const u8 *buf, u32 *chksum) +{ + int ret = 0; + int i; + u32 page_cnt = IST30XX_EEPROM_SIZE / EEPROM_PAGE_SIZE; + u16 addr = EEPROM_BASE_ADDR; + int len = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + ist30xx_tracking(TRACK_CMD_FWUPDATE); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (unlikely(ret)) goto isp_fw_update_end; + + ret = ist30xxb_isp_erase(client, IST30XXB_ISP_ERASE_ALL, 0); + if (unlikely(ret)) goto isp_fw_update_end; + + for (i = 0; i < page_cnt; i++) { + /* IST30xxB ISP write mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_WRITE); + if (unlikely(ret)) goto isp_fw_update_end; + + ret = ist30xxb_isp_write(client, addr, (u32 *)buf, len); + if (unlikely(ret)) goto isp_fw_update_end; + + addr += EEPROM_PAGE_SIZE; + buf += EEPROM_PAGE_SIZE; + + msleep(5); + + ist30xxb_isp_reset(); + } + +isp_fw_update_end: + /* IST30xxB ISP disable */ + ist30xxb_isp_enable(false); + return ret; +} + +int ist30xxb_isp_bootloader(struct i2c_client *client, const u8 *buf) +{ + int ret = 0; + int i; + u16 addr = EEPROM_BASE_ADDR; + u32 page_cnt = (ts_data->fw.index) / EEPROM_PAGE_SIZE; + int buf_cnt = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + tsp_info("*** Bootloader update (0x%x~0x%x) ***\n", + EEPROM_BASE_ADDR, ts_data->fw.index); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (unlikely(ret)) goto isp_bootldr_end; + + ret = ist30xxb_isp_erase(client, IST30XXB_ISP_ERASE_ALL, 0); + if (unlikely(ret)) goto isp_bootldr_end; + + for (i = 0; i < page_cnt; i++) { + /* IST30xxB ISP write mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_WRITE); + if (unlikely(ret)) goto isp_bootldr_end; + + ret = ist30xxb_isp_write(client, addr, (u32 *)buf, buf_cnt); + if (unlikely(ret)) goto isp_bootldr_end; + + addr += EEPROM_PAGE_SIZE; + buf += EEPROM_PAGE_SIZE; + + msleep(5); + + ist30xxb_isp_reset(); + } + +isp_bootldr_end: + /* IST30xxB ISP disable */ + ist30xxb_isp_enable(false); + return ret; +} + + +int ist30xx_fw_write(struct i2c_client *client, const u8 *buf) +{ + u32 *buf32 = (u32 *)(buf + ts_data->fw.index); + u32 size = ts_data->fw.size; + + if (unlikely(size == 0 || size > IST30XX_EEPROM_SIZE)) + return -ENOEXEC; + + while (size > 0) { + int len = (size >= EEPROM_PAGE_SIZE ? EEPROM_PAGE_SIZE : size); + + int ret = ist30xx_write_buf(client, CMD_ENTER_FW_UPDATE, buf32, (len >> 2)); + if (unlikely(ret)) + return ret; + + buf32 += (len >> 2); + size -= len; + + msleep(5); + } + return 0; +} + + +u32 ist30xx_parse_ver(int flag, const u8 *buf) +{ + u32 ver = 0; + u32 *buf32 = (u32 *)buf; + + if (flag == FLAG_FW) + ver = (u32)buf32[(ts_data->tags.flag_addr + 4) >> 2]; + else if (flag == FLAG_SUB) + ver = (u32)buf32[(ts_data->tags.flag_addr + 8) >> 2]; + else if (flag == FLAG_PARAM) + ver = (u32)(buf32[(ts_data->tags.cfg_addr + 4) >> 2] & 0xFFFF); + else + tsp_warn("Parsing ver's flag is not corrent!\n"); + + return ver; +} + + +int calib_ms_delay = WAIT_CALIB_CNT; +int ist30xx_calib_wait(void) +{ + int cnt = calib_ms_delay; + + ts_data->status.calib_msg = 0; + while (cnt-- > 0) { + msleep(100); + + if (ts_data->status.calib_msg) { + tsp_info("Calibration status : %d, Max raw gap : %d - (%08x)\n", + CALIB_TO_STATUS(ts_data->status.calib_msg), + CALIB_TO_GAP(ts_data->status.calib_msg), + ts_data->status.calib_msg); + + if (CALIB_TO_OS_VALUE(ts_data->status.calib_msg) == 0xFFFF) + return 1; + else if (CALIB_TO_STATUS(ts_data->status.calib_msg) == 0) + return 0; // Calibrate success + else + return -EAGAIN; + } + } + tsp_warn("Calibration time out\n"); + + return -EPERM; +} + +int ist30xx_calibrate(int wait_cnt) +{ + int ret = -ENOEXEC; + + tsp_info("*** Calibrate %ds ***\n", calib_ms_delay / 10); + + ts_data->status.update = 1; + while (wait_cnt--) { + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client, true); + if (unlikely(ret)) continue; + + ret = ist30xx_cmd_calibrate(ts_data->client); + if (unlikely(ret)) continue; + + ist30xx_enable_irq(ts_data); + ret = ist30xx_calib_wait(); + if (likely(ret == 0)) break; + } + + ist30xx_disable_irq(ts_data); + ist30xx_cmd_run_device(ts_data->client, true); + + ts_data->status.update = 2; + + ist30xx_enable_irq(ts_data); + + return ret; +} + + +int ist30xx_parse_tags(struct ist30xx_data *data, const u8 *buf, const u32 size) +{ + int ret = -EPERM; + + ts_tags = (struct ist30xx_tags *)(&buf[size - sizeof(struct ist30xx_tags)]); + + if (!strncmp(ts_tags->magic1, IST30XX_TAG_MAGIC, sizeof(ts_tags->magic1)) + && !strncmp(ts_tags->magic2, IST30XX_TAG_MAGIC, sizeof(ts_tags->magic2))) { + data->fw.index = ts_tags->fw_addr; + data->fw.size = ts_tags->flag_addr - ts_tags->fw_addr + + ts_tags->flag_size; + data->fw.chksum = ts_tags->chksum; + data->tags = *ts_tags; + + ret = 0; + } + + tsp_verb("Tagts magic1: %s, magic2: %s\n", + ts_tags->magic1, ts_tags->magic2); + tsp_verb(" fw: %x(%x)\n", ts_tags->fw_addr, ts_tags->fw_size); + tsp_verb(" flag: %x(%x)\n", ts_tags->flag_addr, ts_tags->flag_size); + tsp_verb(" cfg: %x(%x)\n", ts_tags->cfg_addr, ts_tags->cfg_size); + tsp_verb(" sensor1: %x(%x)\n", ts_tags->sensor1_addr, ts_tags->sensor1_size); + tsp_verb(" sensor2: %x(%x)\n", ts_tags->sensor2_addr, ts_tags->sensor2_size); + tsp_verb(" sensor3: %x(%x)\n", ts_tags->sensor3_addr, ts_tags->sensor3_size); + tsp_verb(" chksum: %x\n", ts_tags->chksum); + + return ret; +} + +void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, const u32 size) +{ + int ret; + + ret = ist30xx_parse_tags(data, buf, size); + if (unlikely(ret != TAGS_PARSE_OK)) + tsp_warn("Cannot find tags of F/W, make a tags by 'tagts.exe'\n"); +} + +#if (IST30XX_DEBUG) && (IST30XX_INTERNAL_BIN) +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; +int ist30xx_get_tkey_info(struct ist30xx_data *data) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + u8 *cfg_buf; + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + + tkey->enable = (bool)(cfg_buf[0x14] & 1); + tkey->axis_rx = (bool)((cfg_buf[0x14] >> 1) & 1); + tkey->key_num = (u8)cfg_buf[0x15]; + tkey->ch_num[0] = (u8)cfg_buf[0x16]; + tkey->ch_num[1] = (u8)cfg_buf[0x17]; + tkey->ch_num[2] = (u8)cfg_buf[0x18]; + tkey->ch_num[3] = (u8)cfg_buf[0x19]; + tkey->ch_num[4] = (u8)cfg_buf[0x1A]; + + if (tkey->axis_rx) { + if (tsp->dir.swap_xy) tsp->height -= 1; + else tsp->width -= 1; + } else { + if (tsp->dir.swap_xy) tsp->width -= 1; + else tsp->height -= 1; + } + + return ret; +} + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +int ist30xx_get_tsp_info(struct ist30xx_data *data) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 *cfg_buf, *sensor_buf; + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + sensor_buf = (u8 *)&data->fw.buf[data->tags.sensor1_addr]; + + tsp->finger_num = (u8)cfg_buf[0x0E]; + tsp->dir.swap_xy = (bool)(cfg_buf[0xF] & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (bool)(cfg_buf[0xF] & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (bool)(cfg_buf[0xF] & TSP_INFO_FLIP_Y ? true : false); + + tsp->ch_num.tx = (u8)sensor_buf[0x40]; + tsp->ch_num.rx = (u8)sensor_buf[0x41]; + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + tsp->height = (tsp->dir.swap_xy ? tsp->ch_num.rx : tsp->ch_num.tx); + tsp->width = (tsp->dir.swap_xy ? tsp->ch_num.tx : tsp->ch_num.rx); + + return ret; +} +#endif // (IST30XX_DEBUG) && (IST30XX_INTERNAL_BIN) + + +#define update_next_step(ret) { if (unlikely(ret)) goto end; } +int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, bool mode) +{ + int ret = 0; + u32 chksum = 0; + struct ist30xx_fw *fw = &ts_data->fw; + + tsp_info("*** Firmware update ***\n"); + tsp_info(" core: %x, param: %x, sub: %x (addr: 0x%x ~ 0x%x)\n", + ist30xx_fw_ver, ist30xx_param_ver, ist30xx_sub_ver, + fw->index, (fw->index + fw->size)); + + ts_data->status.update = 1; + + ist30xx_disable_irq(ts_data); + + ist30xx_reset(); + + if (mode) { /* ISP Mode */ + ret = ist30xxb_isp_fw_update(client, buf, &chksum); + update_next_step(ret); + } else { /* I2C SW Mode */ + ret = ist30xx_cmd_update(client, CMD_ENTER_FW_UPDATE); + update_next_step(ret); + + ret = ist30xx_fw_write(client, buf); + update_next_step(ret); + } + msleep(50); + + buf += IST30XX_EEPROM_SIZE; + size -= IST30XX_EEPROM_SIZE; + + ret = ist30xx_cmd_run_device(client, true); + update_next_step(ret); + + ret = ist30xx_read_cmd(client, CMD_GET_CHECKSUM, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) + goto end; + + ret = ist30xx_get_ver_info(ts_data); + update_next_step(ret); + +end: + if (unlikely(ret)) { + tsp_warn("Firmware update Fail!, ret=%d\n", ret); + } else if (unlikely(chksum != fw->chksum)) { + tsp_warn("Error CheckSum: %x(%x)\n", chksum, fw->chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + + ts_data->status.update = 2; + + return ret; +} + +int ist30xx_fw_recovery(struct ist30xx_data *data) +{ + int ret; + u8 *fw = data->fw.buf; + int fw_size = data->fw.buf_size; + + ist30xx_get_update_info(data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_fw_update(data->client, fw, fw_size, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(data); + + return ret; +} + + +#define fw_update_next_step(ret) { if (unlikely(ret)) \ + { step = 1; goto end; } } +#define param_update_next_step(ret) { if (unlikely(ret)) \ + { step = 2; goto end; } } +int ist30xx_fw_param_update(struct i2c_client *client, const u8 *buf) +{ + int ret = 0; + int step = 0; + u16 len = 0; + int size = IST30XX_EEPROM_SIZE; + u32 chksum = 0, ver = 0; + u32 *param = (u32 *)buf; + struct ist30xx_fw *fw = &ts_data->fw; + + tsp_info("*** FW param update ***\n"); + tsp_info(" core: %x, param: %x, sub: %x (addr: 0x%x ~ 0x%x)\n", + ist30xx_fw_ver, ist30xx_param_ver, ist30xx_sub_ver, + fw->index, (fw->index + fw->size)); + + ts_data->status.update = 1; + + ist30xx_disable_irq(ts_data); + ist30xx_reset(); + + /* FW update by SW */ + ret = ist30xx_cmd_update(client, CMD_ENTER_FW_UPDATE); + fw_update_next_step(ret); + + ret = ist30xx_fw_write(client, buf); + fw_update_next_step(ret); + + msleep(50); + + param = (u32 *)(buf + (fw->index + fw->size)); + size -= fw->size; + + ret = ist30xx_cmd_run_device(client, true); + fw_update_next_step(ret); + + ret = ist30xx_read_cmd(client, CMD_GET_CHECKSUM, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) + goto end; + + ret = ist30xx_read_cmd(client, CMD_GET_FW_VER, &ver); + update_next_step(ret); + fw->prev_core_ver = fw->core_ver; + fw->core_ver = ver; + tsp_info("F/W core version : %x\n", fw->core_ver); + + /* update parameters */ + ret = ist30xx_cmd_update(client, CMD_ENTER_UPDATE); + param_update_next_step(ret); + + /* config */ + len = (ts_data->tags.cfg_size >> 2); + ret = ist30xx_write_buf(client, CMD_UPDATE_CONFIG, param, len); + param_update_next_step(ret); + msleep(10); + + param += len; + size -= (len << 2); + + /* sensor */ + len = ((ts_data->tags.sensor1_size + ts_data->tags.sensor2_size) >> 2); + ret = ist30xx_write_buf(client, CMD_UPDATE_SENSOR, param, len); + param_update_next_step(ret); + msleep(10); + + param += len; + size -= (len << 2); + + ret = ist30xx_cmd_update(client, CMD_EXIT_UPDATE); + param_update_next_step(ret); + msleep(120); + + ret = ist30xx_cmd_run_device(client, true); + update_next_step(ret); + + ret = ist30xx_read_cmd(client, CMD_GET_PARAM_VER, &ver); + update_next_step(ret); + fw->prev_param_ver = fw->param_ver; + fw->param_ver = ver; + + ret = ist30xx_read_cmd(client, CMD_GET_SUB_VER, &ver); + update_next_step(ret); + fw->sub_ver = ver; + + tsp_info("Param version : %x, (sub: %x)\n", fw->param_ver, fw->sub_ver); + +end: + if (unlikely(ret)) { + if (unlikely(step == 1)) + tsp_warn("Firmware update Fail!, ret=%d", ret); + else if (unlikely(step == 2)) + tsp_warn("Parameters update Fail!, ret=%d", ret); + } else if (unlikely(chksum != fw->chksum)) { + tsp_warn("Error CheckSum: %08x(%08x)\n", chksum, fw->chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + ts_data->status.update = 2; + + return ret; +} + + +#if IST30XX_INTERNAL_BIN +int ist30xx_check_fw(struct ist30xx_data *data, const u8 *buf) +{ + int ret; + u32 chksum; + + ret = ist30xx_read_cmd(data->client, CMD_GET_CHECKSUM, &chksum); + if (unlikely(ret)) return ret; + + if (unlikely(chksum != data->fw.chksum)) { + tsp_warn("Checksum compare error, (IC: %08x, Bin: %08x)\n", + chksum, data->fw.chksum); + return -EPERM; + } + + return 0; +} + +bool ist30xx_check_valid_vendor(u32 tsp_vendor) +{ + switch (tsp_vendor) { + case TSP_TYPE_ALPS: + case TSP_TYPE_EELY: + case TSP_TYPE_TOP: + case TSP_TYPE_MELFAS: + case TSP_TYPE_ILJIN: + case TSP_TYPE_SYNOPEX: + case TSP_TYPE_SMAC: + case TSP_TYPE_OTHERS: + return true; + default: + return false; + } + + return false; +} + +#if IST30XX_MULTIPLE_TSP +void ist30xx_set_tsp_fw(struct ist30xx_data *data) +{ + char *str; + struct ist30xx_fw *fw = &data->fw; + + switch (data->tsp_type) { + case TSP_TYPE_ALPS: + case TSP_TYPE_ILJIN: + str = "ALPS/ILJIN"; + fw->buf = (u8 *)ist30xxb_fw; + fw->buf_size = sizeof(ist30xxb_fw); + break; + case TSP_TYPE_EELY: + str = "EELY"; + fw->buf = (u8 *)ist30xxb_fw2; + fw->buf_size = sizeof(ist30xxb_fw2); + break; + case TSP_TYPE_TOP: + str = "TopTouch"; + fw->buf = (u8 *)ist30xxb_fw1; + fw->buf_size = sizeof(ist30xxb_fw1); + break; + case TSP_TYPE_UNKNOWN: + default: + str = "Unknown"; + tsp_warn("Unknown TSP vendor(0x%x)\n", data->tsp_type); + break; + } + tsp_info("TSP vendor : %s(%x)\n", str, data->tsp_type); + + ist30xx_get_update_info(ts_data, fw->buf, fw->buf_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw->buf); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw->buf); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw->buf); +} +#endif // IST30XX_MULTIPLE_TSP + + +int ist30xx_check_auto_update(struct ist30xx_data *data) +{ + int ret = 0; + int retry = IST30XX_FW_UPDATE_RETRY; + u32 tsp_type = TSP_TYPE_UNKNOWN; + u32 chksum; + bool tsp_check = false; + struct ist30xx_fw *fw = &data->fw; + + while (retry--) { + ret = ist30xx_read_cmd(data->client, + CMD_GET_TSP_PANNEL_TYPE, &tsp_type); + if (likely(ret == 0)) { + if (likely(ist30xx_check_valid_vendor(tsp_type) == true)) + tsp_check = true; + break; + } + } + + retry = IST30XX_FW_UPDATE_RETRY; + + if (unlikely(!tsp_check)) { + while (retry--) { + /* FW recovery */ + tsp_info("tsp type: %x\n", tsp_type); + ret = ist30xxb_isp_bootloader(data->client, fw->buf); + if (likely(ret == 0)) { + ist30xx_reset(); + ret = ist30xx_read_cmd(data->client, + CMD_GET_TSP_PANNEL_TYPE, &tsp_type); + tsp_info("tsp type: %x\n", tsp_type); + if (likely(ret == 0)) // recovery OK + if (ist30xx_check_valid_vendor(tsp_type) == true) { + data->tsp_type = tsp_type; +#if IST30XX_MULTIPLE_TSP + ist30xx_set_tsp_fw(data); +#endif + break; + } + } + + if (retry == 0) return 1; /* TSP is not connected */ + } + } + + ist30xx_cmd_run_device(data->client, false); + + ist30xx_get_ver_info(data); + + if (likely((fw->param_ver > 0) && (fw->param_ver < 0xFFFFFFFF))) { + if (unlikely(((fw->core_ver & MASK_FW_VER) != IST30XX_FW_VER3) && + ((fw->core_ver & MASK_FW_VER) != IST30XX_FW_VER4))) + goto fw_check_end; + + tsp_info("Version compare IC: %x(%x), BIN: %x(%x)\n", + fw->param_ver, fw->core_ver, ist30xx_param_ver, ist30xx_fw_ver); + + /* If FW version is same, check FW checksum */ + if (likely((fw->core_ver == ist30xx_fw_ver) && + (fw->param_ver == ist30xx_param_ver))) { + ret = ist30xx_read_cmd(data->client, CMD_GET_CHECKSUM, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) { + tsp_warn("Checksum error, IC: %x, Bin: %x (ret: %d)\n", + chksum, fw->chksum, ret); + goto fw_check_end; + } + } + + /* + * fw->core_ver : FW core version in TSP IC + * fw->param_ver : FW version if TSP IC + * ist30xx_fw_ver : FW core version in FW Binary + * ist30xx_fw_ver : FW version in FW Binary + */ + /* If the ver of binary is higher than ver of IC, FW update operate. */ + + if (likely((fw->core_ver >= ist30xx_fw_ver) && + (fw->param_ver >= ist30xx_param_ver))) + return 0; + } + +fw_check_end: + return -EAGAIN; +} + +int ist30xx_auto_bin_update(struct ist30xx_data *data) +{ + int ret = 0; + int retry = IST30XX_FW_UPDATE_RETRY; + struct ist30xx_fw *fw = &data->fw; + + fw->buf = (u8 *)ist30xxb_fw; + fw->buf_size = sizeof(ist30xxb_fw); + +#if IST30XX_MULTIPLE_TSP + ist30xx_set_tsp_fw(data); +#else + ist30xx_get_update_info(data, fw->buf, fw->buf_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw->buf); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw->buf); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw->buf); +#endif + + tsp_info("IC: %x, Binary ver core: %x, param: %x, sub: %x\n", + data->chip_id, ist30xx_fw_ver, ist30xx_param_ver, ist30xx_sub_ver); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_check_auto_update(data); + mutex_unlock(&ist30xx_mutex); + if (likely(ret >= 0)) + return ret; + +update_bin: // TSP is not ready / FW update + tsp_info("Update version. param(core): %x(%x, %x) -> %x(%x, %x)\n", + fw->param_ver, fw->core_ver, fw->sub_ver, + ist30xx_param_ver, ist30xx_fw_ver, ist30xx_sub_ver); + + mutex_lock(&ist30xx_mutex); + while (retry--) { + ret = ist30xx_fw_update(data->client, fw->buf, fw->buf_size, true); + if (unlikely(!ret)) break; + } + mutex_unlock(&ist30xx_mutex); + + if (unlikely(ret)) + return ret; + + if (unlikely(retry > 0 && ist30xx_check_fw(data, fw->buf))) + goto update_bin; + + ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY); + + return ret; +} +#endif // IST30XX_INTERNAL_BIN + + +/* sysfs: /sys/class/touch/firmware/boot */ +ssize_t ist30xx_boot_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) { + int ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + if (mode == 3) { + tsp_info("EEPROM all erase test\n"); + ist30xx_disable_irq(ts_data); + mutex_lock(&ist30xx_mutex); + + ist30xxb_isp_enable(true); + ist30xxb_isp_erase(ts_data->client, IST30XXB_ISP_ERASE_ALL, 0); + ist30xxb_isp_enable(false); + + mutex_unlock(&ist30xx_mutex); + ist30xx_enable_irq(ts_data); + } else { + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + + ist30xx_disable_irq(ts_data); + + mutex_lock(&ist30xx_mutex); + ist30xxb_isp_bootloader(ts_data->client, fw); + mutex_unlock(&ist30xx_mutex); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) + release_firmware(request_fw); + } + + return size; +} + +u32 buf32_eeprom[IST30XX_EEPROM_SIZE / IST30XX_DATA_LEN]; +ssize_t ist30xx_fw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i; + u8 *buf8 = (u8 *)buf32_eeprom;; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + + ist30xxb_isp_fw_read(ts_data->client, buf32_eeprom); + for (i = 0; i < IST30XX_EEPROM_SIZE; i += 16) { + tsp_debug("%07x: %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x\n", i, + buf8[i], buf8[i + 1], buf8[i + 2], buf8[i + 3], + buf8[i + 4], buf8[i + 5], buf8[i + 6], buf8[i + 7], + buf8[i + 8], buf8[i + 9], buf8[i + 10], buf8[i + 11], + buf8[i + 12], buf8[i + 13], buf8[i + 14], buf8[i + 15]); + } + + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} + +/* sysfs: /sys/class/touch/firmware/fw_only */ +ssize_t ist30xx_fw_only_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + bool isp_mode = false; + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) { + ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + isp_mode = (mode == MASK_UPDATE_ISP ? true : false); + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, fw, fw_size, isp_mode); + mutex_unlock(&ist30xx_mutex); + + ist30xx_init_touch_driver(ts_data); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) + release_firmware(request_fw); + + return size; +} + +/* sysfs: /sys/class/touch/firmware/firmware */ +ssize_t ist30xx_fw_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + bool isp_mode = false; + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) { + int ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + isp_mode = (mode == MASK_UPDATE_ISP ? true : false); + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, fw, fw_size, isp_mode); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(ts_data); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) + release_firmware(request_fw); + + return size; +} + +ssize_t ist30xx_fw_status(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count; + + switch (ts_data->status.update) { + case 1: + count = sprintf(buf, "Downloading\n"); + break; + case 2: + count = sprintf(buf, "Update success, ver %x(%x) -> %x(%x, %x), status : %d, gap : %d\n", + ts_data->fw.prev_param_ver, ts_data->fw.prev_core_ver, + ts_data->fw.param_ver, ts_data->fw.core_ver, ts_data->fw.sub_ver, + CALIB_TO_STATUS(ts_data->status.calib_msg), + CALIB_TO_GAP(ts_data->status.calib_msg)); + break; + default: + count = sprintf(buf, "Pass\n"); + } + + return count; +} + + +/* sysfs: /sys/class/touch/firmware/fwparam */ +ssize_t ist30xx_fwparam_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_FW) { + int ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (unlikely(ret)) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_param_update(ts_data->client, fw); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(ts_data); + + if (mode == MASK_UPDATE_FW) + release_firmware(request_fw); + + return size; +} + + +/* sysfs: /sys/class/touch/firmware/viersion */ +ssize_t ist30xx_fw_version(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count; + + count = sprintf(buf, "ID: %x, f/w core: %x, param: %x, sub: %x\n", + ts_data->chip_id, ts_data->fw.core_ver, + ts_data->fw.param_ver, ts_data->fw.sub_ver); + +#if IST30XX_INTERNAL_BIN + { + char msg[128]; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + + count += snprintf(msg, sizeof(msg), + " Header - f/w ver: %x, param: %x, sub: %x\r\n", + ist30xx_parse_ver(FLAG_FW, ts_data->fw.buf), + ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf), + ist30xx_parse_ver(FLAG_SUB, ts_data->fw.buf)); + strncat(buf, msg, sizeof(msg)); + } +#endif + + return count; +} + + +/* sysfs */ +static DEVICE_ATTR(fw_only, S_IWUSR | S_IWGRP | S_IRUGO, ist30xx_fw_status, ist30xx_fw_only_store); +static DEVICE_ATTR(firmware, S_IWUSR | S_IWGRP | S_IRUGO, ist30xx_fw_status, ist30xx_fw_store); +static DEVICE_ATTR(fwparam, S_IWUSR | S_IWGRP, NULL, ist30xx_fwparam_store); +static DEVICE_ATTR(boot, S_IWUSR | S_IWGRP | S_IRUGO, ist30xx_fw_show, ist30xx_boot_store); +static DEVICE_ATTR(version, S_IRUGO, ist30xx_fw_version, NULL); + +struct class *ist30xx_class; +struct device *ist30xx_fw_dev; + +static struct attribute *fw_attributes[] = { + &dev_attr_fw_only.attr, + &dev_attr_firmware.attr, + &dev_attr_fwparam.attr, + &dev_attr_boot.attr, + &dev_attr_version.attr, + NULL, +}; + +static struct attribute_group fw_attr_group = { + .attrs = fw_attributes, +}; + +int ist30xx_init_update_sysfs(void) +{ + /* /sys/class/touch */ + ist30xx_class = class_create(THIS_MODULE, "touch"); + + /* /sys/class/touch/firmware */ + ist30xx_fw_dev = device_create(ist30xx_class, NULL, 0, NULL, "firmware"); + + /* /sys/class/touch/firmware/... */ + if (unlikely(sysfs_create_group(&ist30xx_fw_dev->kobj, + &fw_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "firmware"); + + ts_data->status.update = 0; + ts_data->status.calib = 0; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xx/ist30xx_update.h b/drivers/input/touchscreen/ist30xx/ist30xx_update.h new file mode 100644 index 00000000..f941e896 --- /dev/null +++ b/drivers/input/touchscreen/ist30xx/ist30xx_update.h @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_UPDATE_H__ +#define __IST30XX_UPDATE_H__ + +#include "ist30xx_tsp.h" + +#define IST30XX_INTERNAL_BIN (1) +#define IST30XX_CHECK_CALIB (0) + +#if IST30XX_INTERNAL_BIN +#define IST30XX_UPDATE_BY_WORKQUEUE (0) +#define IST30XX_UPDATE_DELAY (3 * HZ) +#endif // IST30XX_INTERNAL_BIN + +#if ((IMAGIS_TSP_IC == IMAGIS_IST30XX) || (IMAGIS_TSP_IC == IMAGIS_IST30XXB)) +#define IST30XX_EEPROM_SIZE (0x8000) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3038) +#define IST30XX_EEPROM_SIZE (0xA000) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3044) +#define IST30XX_EEPROM_SIZE (0x10000) +#endif +#define EEPROM_PAGE_SIZE (64) +#define EEPROM_BASE_ADDR (0) + +#define IST30XXB_ACCESS_ADDR (1 << 31) +#define IST30XXB_BURST_ACCESS (1 << 27) +#define IST30XXB_DA_ADDR(n) (n | IST30XXB_ACCESS_ADDR) + +#define IST30XXB_REG_TSPTYPE IST30XXB_DA_ADDR(0x40002010) + +#define IST30XXB_REG_EEPMODE IST30XXB_DA_ADDR(0x40007000) +#define IST30XXB_REG_EEPADDR IST30XXB_DA_ADDR(0x40007004) +#define IST30XXB_REG_EEPWDAT IST30XXB_DA_ADDR(0x40007008) +#define IST30XXB_REG_EEPRDAT IST30XXB_DA_ADDR(0x4000700C) +#define IST30XXB_REG_EEPISPEN IST30XXB_DA_ADDR(0x40007010) +#define IST30XXB_REG_CHKSMOD IST30XXB_DA_ADDR(0x40007014) +#define IST30XXB_REG_EEPPWRCTRL IST30XXB_DA_ADDR(0x4000701C) +#define IST30XXB_REG_CHKSDAT IST30XXB_DA_ADDR(0x40007038) + +#define IST30XXB_REG_CHIPID IST30XXB_DA_ADDR(0x40000000) +#define IST30XXB_REG_LDOOSC IST30XXB_DA_ADDR(0x40000030) +#define IST30XXB_REG_CLKDIV IST30XXB_DA_ADDR(0x4000004C) + +#define IST30XXB_MEM_ADDR (0x20000000) +#define IST30XXB_MEM_ALGORITHM IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x34) +#define IST30XXB_MEM_CMD IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x3C) +#define IST30XXB_MEM_FINGERS IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x4) + +#if (IMAGIS_TSP_IC == IMAGIS_IST30XXB) +#define IST30XXB_MEM_COUNT IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x5F0) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3038) +#define IST30XXB_MEM_COUNT IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x40) +#else +#error "Unknown IMAGIS_TSP_IC" +#endif + +#define IST30XX_FW_NAME "ist30xx.fw" +#define IST30XXB_FW_NAME "ist30xxb.fw" +#define IST30XXB_CURVE_NAME "ist30xxb.cv" + +#define MASK_FW_VER (0xFFFF0000) +#define IST30XX_FW_VER1 (0x00010000) +#define IST30XX_FW_VER2 (0x00020000) +#define IST30XX_FW_VER3 (0x00030000) +#define IST30XX_FW_VER4 (0x00040000) + +#define IST30XX_FW_UPDATE_RETRY (3) + +#define WAIT_CALIB_CNT (50) +#define CALIB_THRESHOLD (100) + +#define CALIB_TO_GAP(n) ((n >> 16) & 0xFFF) +#define CALIB_TO_STATUS(n) ((n >> 12) & 0xF) + +#define CALIB_TO_OS_VALUE(n) ((n >> 12) & 0xFFFF) + +#define MASK_UPDATE_BIN (1) +#define MASK_UPDATE_FW (1) +#define MASK_UPDATE_ISP (2) +#define MASK_UPDATE_ALL (3) + +#define CHKSUM_FW (1) +#define CHKSUM_ALL (2) + +#define FLAG_FW (1) +#define FLAG_PARAM (2) +#define FLAG_SUB (3) + +#define TAGS_PARSE_OK (0) + +/* I2C Transaction size */ +#define I2C_MAX_WRITE_SIZE (64) /* bytes */ +#define I2C_MAX_READ_SIZE (8) /* bytes */ + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); + +int ist30xxb_burst_read(struct i2c_client *client, u32 addr, u32 *buf32, int len); + +int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum); + +void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, const u32 size); + +u32 ist30xx_parse_ver(int flag, const u8 *buf); + +int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, bool mode); +int ist30xx_fw_param_update(struct i2c_client *client, const u8 *buf); +int ist30xx_fw_recovery(struct ist30xx_data *data); + +int ist30xx_auto_fw_update(struct ist30xx_data *data); +int ist30xx_auto_param_update(struct ist30xx_data *data); +int ist30xx_auto_bin_update(struct ist30xx_data *data); + +int ist30xx_calibrate(int wait_cnt); +int ist30xx_calib_wait(void); + +int ist30xx_init_update_sysfs(void); + +#endif // __IST30XX_UPDATE_H__ diff --git a/drivers/input/touchscreen/ist30xxa/Makefile b/drivers/input/touchscreen/ist30xxa/Makefile new file mode 100644 index 00000000..afb71927 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for the imagis kanas driver. +# + +# Each configuration option enables a list of files. + +obj-y += ist30xx.o ist30xx_misc.o ist30xx_sec.o ist30xx_sys.o ist30xx_tracking.o ist30xx_update.o ist30xx_cmcs.o diff --git a/drivers/input/touchscreen/ist30xxa/firmware/core_prime.h b/drivers/input/touchscreen/ist30xxa/firmware/core_prime.h new file mode 100644 index 00000000..3e2a6f7f --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/firmware/core_prime.h @@ -0,0 +1,2573 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: Core-Prime EELY, f/w 3(00050000) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x1D,0x00,0x00,0xEA,0x1C,0x00,0x00,0xEA,0x1B,0x00,0x00,0xEA, + 0x1A,0x00,0x00,0xEA,0x19,0x00,0x00,0xEA,0x18,0x00,0x00,0xEA,0x29,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x00,0x00,0x0F,0xE1,0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1, + 0x1C,0xD0,0x9F,0xE5,0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5, + 0x00,0x00,0x0F,0xE1,0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5, + 0x10,0xFF,0x2F,0xE1,0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xBD,0x3C,0x00,0x00, + 0x50,0x30,0x9F,0xE5,0x50,0x40,0x9F,0xE5,0x00,0x40,0x83,0xE5,0x58,0x00,0x1F,0xE5, + 0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3,0x01,0x20,0x52,0xE2, + 0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9,0x37,0x0C,0x00,0xEB, + 0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30,0x70,0xE9,0x1C,0xE1, + 0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1,0x1E,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x03,0x00,0x52,0xE3,0x2A,0x00,0x00,0x9A,0x03,0xC0,0x10,0xE2, + 0x08,0x00,0x00,0x0A,0x01,0x30,0xD1,0xE4,0x02,0x00,0x5C,0xE3,0x0C,0x20,0x82,0xE0, + 0x01,0xC0,0xD1,0x94,0x01,0x30,0xC0,0xE4,0x01,0x30,0xD1,0x34,0x01,0xC0,0xC0,0x94, + 0x04,0x20,0x42,0xE2,0x01,0x30,0xC0,0x34,0x03,0x30,0x11,0xE2,0xB2,0x00,0x00,0x0A, + 0x04,0x20,0x52,0xE2,0x1B,0x00,0x00,0x3A,0x03,0xC0,0x31,0xE7,0x02,0x00,0x53,0xE3, + 0x08,0x00,0x00,0x0A,0x0F,0x00,0x00,0x8A,0x2C,0x34,0xA0,0xE1,0x04,0xC0,0xB1,0xE5, + 0x04,0x20,0x52,0xE2,0x0C,0x3C,0x83,0xE1,0x04,0x30,0x80,0xE4,0xF9,0xFF,0xFF,0x2A, + 0x01,0x10,0x81,0xE2,0x0F,0x00,0x00,0xEA,0x2C,0x38,0xA0,0xE1,0x04,0xC0,0xB1,0xE5, + 0x04,0x20,0x52,0xE2,0x0C,0x38,0x83,0xE1,0x04,0x30,0x80,0xE4,0xF9,0xFF,0xFF,0x2A, + 0x02,0x10,0x81,0xE2,0x07,0x00,0x00,0xEA,0x2C,0x3C,0xA0,0xE1,0x04,0xC0,0xB1,0xE5, + 0x04,0x20,0x52,0xE2,0x0C,0x34,0x83,0xE1,0x04,0x30,0x80,0xE4,0xF9,0xFF,0xFF,0x2A, + 0x03,0x10,0x81,0xE2,0x00,0x00,0xA0,0xE1,0x82,0x2F,0xB0,0xE1,0x01,0x30,0xD1,0x24, + 0x01,0xC0,0xD1,0x24,0x01,0x20,0xD1,0x44,0x01,0x30,0xC0,0x24,0x01,0xC0,0xC0,0x24, + 0x01,0x20,0xC0,0x44,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1, + 0x4C,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0,0x43,0x00,0x00,0x3A, + 0x20,0x32,0x71,0xE0,0x34,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x26,0x00,0x00,0x3A, + 0x20,0x36,0x71,0xE0,0x17,0x00,0x00,0x3A,0x20,0x38,0x71,0xE0,0x09,0x00,0x00,0x3A, + 0x01,0x14,0xA0,0xE1,0x20,0x38,0x71,0xE0,0xFF,0x24,0x82,0xE3,0xFF,0x28,0x82,0x23, + 0x01,0x14,0xA0,0x21,0x20,0x36,0x71,0xE0,0x0E,0x00,0x00,0x3A,0x00,0x30,0x71,0xE2, + 0x6F,0x00,0x00,0x2A,0x21,0x14,0xA0,0x21,0xA0,0x37,0x71,0xE0,0x81,0x07,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x37,0x71,0xE0,0x01,0x07,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x36,0x71,0xE0,0x81,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x36,0x71,0xE0, + 0x01,0x06,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x35,0x71,0xE0,0x81,0x05,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x35,0x71,0xE0,0x01,0x05,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x34,0x71,0xE0,0x81,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x34,0x71,0xE0, + 0x01,0x04,0x40,0x20,0x02,0x20,0xB2,0xE0,0xE5,0xFF,0xFF,0x2A,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x01,0x10,0x50,0xE0,0x01,0x00,0xA0,0x23,0x1E,0xFF,0x2F,0x21,0x00,0x10,0xA0,0xE1, + 0x00,0x00,0xB0,0xE3,0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42, + 0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A, + 0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0, + 0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0, + 0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0, + 0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2, + 0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0, + 0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1, + 0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1, + 0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB, + 0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x18,0x00,0x00,0xEA,0x10,0x40,0x2D,0xE9, + 0x20,0x20,0x52,0xE2,0x05,0x00,0x00,0x3A,0x18,0x50,0xB1,0xE8,0x20,0x20,0x52,0xE2, + 0x18,0x50,0xA0,0xE8,0x18,0x50,0xB1,0xE8,0x18,0x50,0xA0,0xE8,0xF9,0xFF,0xFF,0x2A, + 0x02,0xCE,0xB0,0xE1,0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28,0x18,0x00,0xB1,0x48, + 0x18,0x00,0xA0,0x48,0x10,0x40,0xBD,0xE8,0x02,0xCF,0xB0,0xE1,0x04,0x30,0x91,0x24, + 0x04,0x30,0x80,0x24,0x1E,0xFF,0x2F,0x01,0x82,0x2F,0xB0,0xE1,0xB2,0x30,0xD1,0x20, + 0x01,0x20,0xD1,0x44,0xB2,0x30,0xC0,0x20,0x01,0x20,0xC0,0x44,0x1E,0xFF,0x2F,0xE1, + 0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5, + 0x02,0x20,0x06,0xF0,0x25,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46, + 0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0x87,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0, + 0x79,0xFF,0xFF,0x3A,0x20,0x36,0x71,0xE0,0x6A,0xFF,0xFF,0x3A,0x20,0x38,0x71,0xE0, + 0x5C,0xFF,0xFF,0x3A,0x51,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0xAD,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x51,0x00,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x48,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10, + 0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0x0C,0x06,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0xF0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x88,0x06,0x00,0x10,0x04,0xF0,0x1F,0xE5,0xB0,0x05,0x00,0x10,0x78,0x47,0xC0,0x46, + 0x04,0xF0,0x1F,0xE5,0x28,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x00,0x10,0x04,0xF0,0x1F,0xE5,0x48,0x06,0x00,0x10, + 0x04,0xF0,0x1F,0xE5,0x88,0x06,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5, + 0x04,0x07,0x00,0x10,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xA8,0x06,0x00,0x10, + 0x78,0x47,0xC0,0x46,0xB9,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40, + 0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5, + 0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0B,0x24,0x02,0xF0,0xD3,0xF8,0x64,0x1E, + 0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x01,0x00,0x10,0x00,0x04,0x49,0x0A,0x68,0xF0,0x23,0x00,0x07,0x9A,0x43,0x00,0x0E, + 0x02,0x43,0x0A,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0xF8,0xB5,0x24,0x4D, + 0x24,0x48,0x2E,0x18,0xE3,0x20,0xC0,0x00,0x2F,0x18,0x0D,0x20,0xC0,0x01,0x28,0x18, + 0x00,0x7B,0xC0,0x07,0x26,0xD0,0x30,0x00,0x40,0x30,0x00,0x90,0x40,0x7F,0x00,0x28, + 0x15,0xD0,0x01,0x24,0x05,0xE0,0xE0,0x00,0x80,0x19,0x2C,0x30,0x06,0xF0,0xE6,0xF8, + 0x64,0x1C,0x00,0x98,0x40,0x7F,0xA0,0x42,0xF5,0xDA,0x38,0x68,0x00,0x02,0x40,0x0F, + 0x10,0xD0,0x38,0x00,0x20,0x30,0x81,0x7D,0x00,0x29,0x0B,0xD1,0x08,0xE0,0x38,0x00, + 0x20,0x30,0x81,0x7D,0x00,0x29,0x05,0xD1,0x00,0x99,0x89,0x7F,0x00,0x29,0x01,0xD0, + 0x01,0x21,0x81,0x75,0x40,0x36,0x70,0x7F,0xB0,0x77,0x38,0x68,0x01,0x04,0x00,0x02, + 0x09,0x0F,0x40,0x0F,0x08,0x18,0x08,0x49,0x01,0xD1,0x69,0x18,0x03,0xE0,0x69,0x18, + 0x0A,0x7F,0x90,0x42,0x00,0xD9,0x08,0x77,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x40,0x00,0x00,0x20,0x64,0x06,0x00,0x00,0x20,0x03,0x00,0x00,0x15,0x4A,0x70,0xB4, + 0x13,0x00,0x40,0x33,0x5C,0x7F,0xE4,0x00,0xA2,0x18,0x13,0x4C,0x34,0x32,0xE4,0x88, + 0xE4,0x07,0x17,0xD1,0x04,0x79,0x14,0x71,0x04,0x88,0x14,0x80,0x44,0x88,0x54,0x80, + 0x51,0x71,0xC1,0x79,0x91,0x71,0x59,0x7F,0x49,0x1C,0x59,0x77,0xC0,0x79,0x81,0x07, + 0x08,0xD5,0x08,0x49,0x45,0x07,0x01,0x22,0x00,0x24,0x60,0x31,0x00,0x2D,0x03,0xDA, + 0xDA,0x77,0x0C,0x70,0x70,0xBC,0x70,0x47,0xC0,0x06,0x80,0x0F,0xFA,0xD0,0xDC,0x77, + 0x0A,0x70,0xF7,0xE7,0xA4,0x06,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB4,0x0A,0x24, + 0x0F,0x00,0x67,0x43,0x0C,0x4D,0x84,0x46,0xE8,0x1F,0x7C,0x19,0xFB,0x38,0x56,0x1C, + 0x3F,0x18,0x26,0x71,0xF8,0x89,0x20,0x80,0x38,0x8A,0x60,0x80,0xB8,0x7C,0x60,0x71, + 0x60,0x46,0xA3,0x71,0x46,0x54,0x49,0x1C,0xA8,0x18,0xE0,0x30,0x01,0x77,0x00,0x21, + 0x01,0x74,0xF0,0xBC,0x70,0x47,0x00,0x00,0x64,0x02,0x00,0x20,0x08,0x49,0x0F,0x23, + 0x0A,0x68,0x88,0x7E,0x52,0x1C,0x9B,0x06,0x00,0x07,0x00,0x0A,0x12,0x03,0xC0,0x18, + 0x12,0x0B,0x10,0x43,0x08,0x60,0x01,0x21,0x49,0x07,0x08,0x63,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0xBB,0x4A,0xAF,0x23,0x12,0x68,0x99,0xB0,0x9B,0x5C, + 0xE3,0x24,0xE4,0x00,0x04,0x93,0xB8,0x4B,0x03,0x93,0x1B,0x19,0x02,0x93,0xB7,0x4C, + 0x03,0x9B,0x12,0x68,0x1D,0x19,0x12,0x05,0x10,0xD5,0x04,0x9A,0x01,0x2A,0x01,0xD8, + 0x00,0x2A,0x01,0xD1,0x01,0x22,0x04,0x92,0x00,0x28,0x0B,0xD1,0x00,0x29,0x05,0xD1, + 0x02,0x98,0x80,0x8E,0x00,0x28,0x01,0xD1,0x02,0xF0,0xF6,0xFF,0x19,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x6B,0x46,0xA9,0x4A,0x18,0x84,0x98,0x84,0x91,0x8B, + 0x49,0x1E,0xD9,0x84,0xD1,0x8B,0x64,0x22,0x49,0x1E,0x59,0x84,0x14,0x21,0x29,0x71, + 0x2A,0x80,0x69,0x71,0xC8,0x21,0x69,0x80,0x58,0x83,0x00,0x26,0x18,0x83,0x02,0x98, + 0x80,0x8E,0xF0,0x40,0xC0,0x07,0x03,0xD1,0x30,0x00,0x01,0xF0,0x41,0xFB,0x23,0xE1, + 0x02,0x99,0xB0,0x00,0x40,0x18,0x18,0x90,0x41,0x68,0x6B,0x46,0x08,0x02,0x00,0x0D, + 0x18,0x87,0x17,0x90,0x08,0x05,0x00,0x0D,0x58,0x87,0x16,0x90,0x15,0x90,0x0C,0x20, + 0x70,0x43,0x03,0x99,0x40,0x18,0x91,0x49,0x78,0x39,0x44,0x18,0x00,0x20,0x20,0x5E, + 0x00,0x28,0x07,0xDA,0x18,0x8F,0x20,0x80,0x15,0x99,0x61,0x80,0xA0,0x80,0x15,0x98, + 0xE0,0x80,0x01,0xE1,0x04,0x9A,0x00,0x20,0x52,0x1E,0x06,0xE0,0x81,0x00,0x09,0x19, + 0x8B,0x89,0x40,0x1C,0x0B,0x81,0xCB,0x89,0x4B,0x81,0x90,0x42,0xF6,0xDB,0x21,0x88, + 0x17,0x98,0x41,0x1A,0x04,0x98,0x80,0x00,0x00,0x19,0x81,0x80,0x62,0x88,0x16,0x99, + 0x89,0x1A,0x00,0x22,0x17,0x00,0xC1,0x80,0x10,0x00,0x08,0xE0,0x81,0x00,0x09,0x19, + 0x08,0x23,0xCB,0x5E,0xD2,0x18,0x0A,0x23,0xCB,0x5E,0xFF,0x18,0x40,0x1C,0x04,0x99, + 0x88,0x42,0xF3,0xDB,0x04,0x21,0x61,0x5E,0x17,0x98,0x47,0x1A,0x06,0x21,0x61,0x5E, + 0x16,0x98,0x40,0x1A,0x0C,0x90,0x38,0x1E,0x00,0xDC,0x78,0x42,0x0A,0x90,0x0C,0x98, + 0x00,0x28,0x00,0xDC,0x40,0x42,0x0B,0x90,0x06,0x22,0x29,0x00,0x68,0x46,0xFF,0xF7, + 0x3F,0xFC,0x0A,0x98,0x02,0x04,0x68,0x46,0x03,0xC8,0x12,0x14,0x05,0xF0,0x7D,0xFF, + 0x6B,0x46,0x98,0x83,0x14,0x90,0x06,0x22,0x29,0x00,0x68,0x46,0xFF,0xF7,0x30,0xFC, + 0x0B,0x98,0x02,0x04,0x68,0x46,0x03,0xC8,0x12,0x14,0x05,0xF0,0x6E,0xFF,0x6B,0x46, + 0xD8,0x83,0x13,0x90,0x03,0x98,0x0D,0x21,0x89,0x01,0x40,0x18,0x00,0x7C,0x02,0x28, + 0x05,0xD2,0x64,0x20,0x28,0x81,0xE8,0x80,0x32,0x20,0xA8,0x81,0x68,0x81,0x14,0x98, + 0x0A,0x21,0x48,0x43,0x06,0x21,0x0A,0x22,0x69,0x5E,0xAA,0x5E,0x00,0x04,0x00,0x14, + 0x89,0x18,0x2D,0x22,0x51,0x43,0x08,0x18,0x64,0x21,0xFF,0xF7,0x75,0xFC,0x01,0x04, + 0x09,0x14,0x6B,0x46,0x99,0x83,0x12,0x91,0x11,0x91,0x13,0x98,0x0A,0x21,0x48,0x43, + 0x08,0x21,0x0C,0x22,0x69,0x5E,0xAA,0x5E,0x00,0x04,0x00,0x14,0x89,0x18,0x2D,0x22, + 0x51,0x43,0x08,0x18,0x64,0x21,0xFF,0xF7,0x5F,0xFC,0x01,0x04,0x09,0x14,0x6B,0x46, + 0xD9,0x83,0x0F,0x91,0x10,0x91,0x11,0x99,0x0A,0x98,0x48,0x43,0x64,0x21,0xFF,0xF7, + 0x53,0xFC,0x0A,0x90,0x0F,0x99,0x0B,0x98,0x48,0x43,0x64,0x21,0xFF,0xF7,0x4C,0xFC, + 0x18,0x22,0x6B,0x46,0x9A,0x5E,0x11,0x99,0x91,0x42,0x01,0xDD,0x12,0x99,0x19,0x83, + 0x1A,0x22,0x6B,0x46,0x9A,0x5E,0x10,0x99,0x91,0x42,0x00,0xDD,0x59,0x83,0x01,0x21, + 0x0A,0x00,0x00,0x2F,0x00,0xDA,0x8A,0x1E,0x6B,0x46,0x1A,0x75,0x0C,0x9B,0x00,0x2B, + 0x01,0xDA,0x00,0x21,0xC9,0x43,0x6B,0x46,0x59,0x75,0x8C,0x46,0x71,0x00,0x49,0x19, + 0x0E,0x23,0xCB,0x56,0x9A,0x42,0x00,0xD1,0x17,0x00,0x0F,0x23,0xCB,0x56,0x9C,0x45, + 0x01,0xD1,0x62,0x46,0x0C,0x92,0x6B,0x46,0x9A,0x8A,0xCA,0x81,0xA1,0x88,0x34,0x22, + 0x00,0x2F,0x99,0x86,0xE1,0x88,0xD9,0x86,0x9A,0x5E,0x0A,0x99,0x00,0xDA,0x49,0x42, + 0x51,0x18,0x6B,0x46,0x99,0x86,0x36,0x21,0x59,0x5E,0x0C,0x9A,0x00,0x2A,0x00,0xDA, + 0x40,0x42,0x08,0x18,0x6B,0x46,0xD8,0x86,0x08,0xA9,0x06,0xC9,0x0D,0xA8,0x06,0xF0, + 0x3B,0xFB,0x6B,0x46,0x18,0x8F,0x17,0x49,0x20,0x80,0x15,0x98,0x60,0x80,0x98,0x8E, + 0xA0,0x80,0xD8,0x8E,0xE0,0x80,0x18,0x98,0x40,0x68,0x08,0x40,0x99,0x8E,0x09,0x05, + 0x09,0x0A,0x08,0x43,0x18,0x99,0x48,0x60,0xD9,0x8E,0x00,0x0B,0x00,0x03,0x09,0x05, + 0x09,0x0D,0x08,0x43,0x18,0x99,0x48,0x60,0x76,0x1C,0x0A,0x2E,0x00,0xDA,0xCE,0xE6, + 0xE8,0x88,0x6B,0x46,0x68,0x81,0x28,0x89,0xA8,0x81,0x18,0x8B,0xE8,0x80,0x58,0x8B, + 0x28,0x81,0xAB,0xE6,0xE8,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x42,0x06,0x00,0x00, + 0x9C,0x94,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x7F,0xB5,0x05,0x00,0x1A,0x28,0x0A,0xD1, + 0x13,0x48,0x00,0x68,0x00,0x28,0x06,0xD1,0x12,0x4C,0x01,0xF0,0x71,0xFE,0x64,0x1E, + 0xFB,0xD2,0xFF,0x24,0x14,0xE0,0x04,0xF0,0x95,0xFF,0x05,0xF0,0xBF,0xFF,0x01,0xF0, + 0x9B,0xFD,0x01,0xF0,0xA1,0xFD,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0xA8,0xF9, + 0x04,0x00,0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x95,0x00,0xF0,0x0C,0xF8, + 0x05,0xF0,0xFA,0xF8,0x20,0x00,0x04,0xB0,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x9F,0x00,0x00,0xE7,0x03,0x00,0x00,0xFF,0xB5,0x06,0x00,0x0D,0x00,0x91,0xB0, + 0x03,0xF0,0xBC,0xF8,0x1A,0x48,0x03,0x27,0x04,0x04,0x24,0x0C,0x3F,0x02,0x00,0x22, + 0x39,0x00,0x20,0x00,0xFF,0xF7,0x08,0xFD,0x16,0x49,0x3A,0x00,0x20,0x00,0x00,0x23, + 0xFF,0xF7,0x0A,0xFD,0x14,0x49,0x40,0x22,0x01,0xA8,0xFF,0xF7,0x0D,0xFD,0x14,0x99, + 0x30,0x04,0x09,0x03,0x08,0x43,0x11,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x28,0x04, + 0x08,0x43,0x02,0x90,0x0E,0x48,0x00,0x68,0x05,0x90,0x0B,0x48,0x80,0x68,0x40,0x1C, + 0x03,0x90,0x1A,0x98,0x1A,0x28,0x01,0xD1,0x00,0x20,0x01,0x90,0x01,0xA8,0x02,0xF0, + 0xB5,0xFB,0x01,0xA8,0x06,0xF0,0xEC,0xF9,0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x9C,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x9F,0x00,0x00,0xAB,0x0C,0x00,0x80, + 0x08,0x08,0x00,0x20,0x04,0x49,0x0A,0x6A,0x02,0x60,0x4A,0x6A,0x42,0x60,0x4A,0x6B, + 0x82,0x60,0xC9,0x6A,0xC1,0x60,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x11,0x69, + 0x01,0x43,0x11,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x48,0x40,0x69, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47, + 0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47, + 0x40,0x00,0x00,0x40,0xF0,0xB5,0x00,0x20,0xFF,0xB0,0xC0,0x43,0xB2,0xB0,0xA9,0x90, + 0x00,0x20,0xA7,0x90,0xFF,0x48,0x00,0x27,0x00,0x68,0x3E,0x00,0x60,0x30,0x41,0x7E, + 0x08,0x91,0x81,0x7E,0x07,0x91,0xC1,0x7E,0x06,0x91,0x00,0x7F,0x89,0x21,0x89,0x00, + 0x05,0x90,0xF9,0x48,0x45,0x18,0x03,0x90,0xFF,0x30,0x23,0x30,0x02,0x90,0xF7,0x49, + 0x03,0x98,0xEC,0x1D,0x40,0x18,0xF9,0x34,0x01,0x90,0x0D,0xE0,0x0A,0x20,0x70,0x43, + 0x40,0x19,0x7C,0x21,0x09,0x5C,0x00,0x29,0x05,0xD0,0x7E,0x30,0x02,0xF0,0x6E,0xFD, + 0x00,0x28,0x00,0xD0,0x7F,0x1C,0x76,0x1C,0x60,0x7D,0xB0,0x42,0xEE,0xDC,0x01,0x98, + 0x00,0x22,0x04,0x21,0x82,0x5E,0x41,0x5E,0x50,0x1A,0x00,0x28,0x00,0xDC,0x88,0x1A, + 0x02,0x04,0x12,0x14,0x6B,0x46,0x1A,0x80,0x01,0x98,0x02,0x21,0x06,0x23,0x41,0x5E, + 0xC3,0x5E,0xC8,0x1A,0x00,0x28,0x00,0xDC,0x58,0x1A,0x00,0x04,0x00,0x14,0x6B,0x46, + 0x58,0x80,0x01,0x99,0x00,0x26,0x00,0x2F,0x8E,0x75,0x12,0xD0,0xD9,0x49,0x09,0x68, + 0x80,0x31,0x0B,0x89,0x9A,0x42,0x0C,0xDA,0x4A,0x89,0x90,0x42,0x01,0xDA,0x01,0x21, + 0x05,0xE0,0x89,0x89,0x88,0x42,0x01,0xDA,0x02,0x21,0x00,0xE0,0x03,0x21,0x01,0x98, + 0x81,0x75,0x01,0x98,0x40,0x7D,0x00,0x28,0x1C,0xD1,0x01,0x98,0x80,0x7D,0x01,0x28, + 0x04,0xD1,0xCC,0x48,0x00,0x68,0x80,0x30,0x41,0x7D,0x05,0xE0,0x02,0x28,0x06,0xD1, + 0xC8,0x48,0x00,0x68,0x80,0x30,0x81,0x7D,0x08,0x98,0x08,0x18,0x07,0xE0,0x03,0x28, + 0x08,0xD1,0xC4,0x48,0x08,0x99,0x00,0x68,0x80,0x30,0xC0,0x7D,0x40,0x18,0x00,0x06, + 0x00,0x0E,0x08,0x90,0x0C,0x22,0x00,0x21,0xA2,0xA8,0xFF,0xF7,0x0B,0xFC,0x03,0x98, + 0xC0,0x88,0x00,0x06,0x40,0x0F,0x0D,0xD0,0x06,0xF0,0xD0,0xF8,0x01,0xF0,0xDA,0xF8, + 0x01,0xF0,0x08,0xF9,0x02,0xF0,0x38,0xFD,0x03,0x98,0x01,0x21,0xE0,0x30,0x81,0x74, + 0x30,0x00,0x27,0xE0,0x03,0x98,0x00,0x21,0xE0,0x30,0x81,0x74,0xA0,0x7D,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0xA0,0x75,0x03,0x98,0x06,0x79,0x60,0x7D,0x00,0x2E,0x02,0xD1, + 0x00,0x28,0x16,0xD0,0x1C,0xE0,0x00,0x28,0x1A,0xD1,0x78,0x22,0x00,0x21,0xA8,0x18, + 0xFF,0xF7,0xE0,0xFB,0xA0,0x7D,0x00,0x28,0x0B,0xD1,0x00,0x25,0x06,0xE0,0x2A,0x00, + 0x29,0x00,0x14,0x23,0xA2,0xA8,0xFF,0xF7,0xC1,0xFC,0x6D,0x1C,0xB5,0x42,0xF6,0xDB, + 0x26,0x75,0x00,0x20,0xE0,0x75,0x7F,0xB0,0x32,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x0D,0x22,0x01,0x21,0x9E,0xA8,0xFF,0xF7,0xC5,0xFB,0x02,0x20,0x09,0x90,0x01,0xF0, + 0x23,0xFC,0xA5,0x90,0xE0,0x7D,0x00,0x28,0x05,0xD0,0x20,0x7E,0x01,0x28,0x02,0xD1, + 0xA5,0x98,0x40,0x00,0xA5,0x90,0xF9,0xE0,0x00,0x27,0x09,0x22,0xFF,0x43,0x92,0x01, + 0x39,0x00,0x0E,0xA8,0xFF,0xF7,0xAE,0xFB,0x0C,0x22,0x39,0x00,0x0B,0xA8,0xFF,0xF7, + 0xA9,0xFB,0x09,0x98,0x00,0x28,0x0B,0xD1,0x8A,0x48,0x00,0x68,0x60,0x30,0x07,0x7E, + 0xA5,0x98,0x39,0x00,0xFF,0xF7,0x10,0xFA,0x39,0x00,0xFF,0xF7,0x0D,0xFA,0xA5,0x90, + 0x00,0x20,0x44,0xE0,0xA5,0x98,0x00,0x27,0xA6,0x90,0x3B,0xE0,0x0A,0x20,0x78,0x43, + 0x40,0x19,0x78,0x30,0x04,0x90,0x00,0x79,0x00,0x28,0x32,0xD0,0x04,0x98,0x80,0x1D, + 0x02,0xF0,0x8C,0xFC,0x09,0x99,0x88,0x42,0x2B,0xD1,0x04,0x99,0x00,0x20,0x08,0x5E, + 0xAC,0x99,0x0A,0x22,0x51,0x43,0x02,0x9A,0x8B,0x18,0x0E,0x21,0x59,0x5E,0x42,0x1A, + 0x00,0x2A,0x00,0xDC,0x0A,0x1A,0x04,0x99,0x02,0x20,0x08,0x5E,0x10,0x21,0x59,0x5E, + 0x43,0x1A,0x00,0x2B,0x00,0xDC,0x0B,0x1A,0x10,0x00,0x19,0x00,0x50,0x43,0x59,0x43, + 0x40,0x18,0xA6,0x99,0x88,0x42,0x04,0xDA,0xAC,0x9B,0x79,0x1C,0x0B,0xAA,0xD1,0x54, + 0xA6,0x90,0xAC,0x99,0x30,0x22,0x51,0x43,0x0E,0xAA,0x89,0x18,0xBA,0x00,0x89,0x18, + 0x48,0x60,0x7F,0x1C,0x60,0x7D,0xB8,0x42,0xC0,0xDC,0xAC,0x98,0x40,0x1C,0xB0,0x42, + 0xAC,0x90,0xB7,0xDB,0x00,0x20,0x8D,0xE0,0x01,0x20,0x84,0x46,0xA5,0x9B,0x00,0x20, + 0x16,0xE0,0xA2,0xA9,0x09,0x5C,0x00,0x29,0x11,0xD1,0x0B,0xA9,0x0A,0x56,0x30,0x21, + 0x41,0x43,0x0E,0xAF,0xC9,0x19,0x97,0x00,0xC9,0x59,0x99,0x42,0x07,0xDA,0x00,0x29, + 0x05,0xDB,0x00,0x2A,0x03,0xDB,0x0B,0x00,0x00,0x21,0x8C,0x46,0xA9,0x90,0x40,0x1C, + 0xB0,0x42,0xE6,0xDB,0x60,0x46,0x00,0x28,0x6A,0xD1,0xA7,0x98,0x0A,0x21,0x40,0x1C, + 0xA7,0x90,0xA9,0x98,0x48,0x43,0x47,0x19,0xB0,0x90,0x38,0x79,0x00,0x28,0x5F,0xD1, + 0xA9,0x99,0x0B,0xA8,0x40,0x56,0x0A,0x21,0x0A,0x22,0x0A,0x90,0x48,0x43,0x41,0x19, + 0x6E,0x31,0x38,0x00,0xFF,0xF7,0x1C,0xFB,0x02,0x99,0xB0,0x98,0x40,0x18,0xC1,0x89, + 0x39,0x80,0x01,0x8A,0x79,0x80,0x80,0x7C,0x78,0x71,0xB8,0x79,0x08,0x99,0x49,0x1C, + 0x88,0x42,0x01,0xD2,0x40,0x1C,0xB8,0x71,0xB8,0x79,0x14,0x28,0x07,0xD3,0x07,0x99, + 0x14,0x22,0x89,0x1C,0x51,0x43,0x88,0x42,0x01,0xD2,0x14,0x30,0xB8,0x71,0x38,0x79, + 0xA9,0x9A,0xA2,0xA9,0x88,0x54,0xA9,0x98,0x3A,0x79,0x29,0x00,0x40,0x1C,0xFB,0x31, + 0x50,0x54,0x3A,0x79,0x00,0x20,0x0C,0x39,0x50,0x54,0x0A,0x9A,0x9E,0xA9,0x88,0x54, + 0x01,0x00,0x1F,0xE0,0x30,0x20,0x48,0x43,0x0E,0xAB,0xC0,0x18,0x0A,0x9B,0x00,0x22, + 0xD2,0x43,0x9B,0x00,0x84,0x46,0xC2,0x50,0xA2,0xA8,0x40,0x5C,0xA5,0x9B,0x00,0x28, + 0x0F,0xD1,0x0B,0xE0,0x82,0x00,0x62,0x44,0x52,0x68,0x00,0x2A,0x05,0xDB,0x9A,0x42, + 0x03,0xDA,0x43,0x1C,0x0B,0xAF,0x7B,0x54,0x13,0x00,0x40,0x1C,0x62,0x7D,0x82,0x42, + 0xF0,0xDC,0x49,0x1C,0xB1,0x42,0xDD,0xDB,0x60,0x7D,0xA7,0x99,0x88,0x42,0x05,0xDD, + 0xAA,0x98,0x40,0x1C,0xB0,0x42,0xAA,0x90,0x00,0xDA,0x6D,0xE7,0x09,0x98,0x41,0x1E, + 0x09,0x06,0x09,0x0E,0x00,0x28,0x09,0x91,0x00,0xD0,0xFD,0xE6,0xE0,0x75,0xA8,0x90, + 0xAB,0x90,0xAC,0x90,0x6B,0xE0,0x08,0x00,0x0A,0x21,0x48,0x43,0x47,0x19,0xAB,0x98, + 0x9E,0xA9,0x08,0x18,0x40,0x78,0x78,0x37,0x00,0x28,0x5D,0xD0,0xAC,0x98,0x30,0x18, + 0x0C,0x28,0xAA,0x90,0x5F,0xDA,0x39,0x79,0x28,0x00,0xEF,0x30,0xAF,0x90,0x08,0x5C, + 0x06,0x99,0x88,0x42,0x3C,0xD2,0xAC,0x98,0x0C,0x28,0x39,0xDA,0xB8,0x1D,0x02,0xF0, + 0x95,0xFB,0x05,0xE0,0xE8,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0x3E,0x03,0x00,0x00, + 0x00,0x28,0x2D,0xD0,0x38,0x79,0xAF,0x99,0xAF,0x9A,0x41,0x5C,0x49,0x1C,0x81,0x54, + 0xAA,0x98,0x0A,0x21,0x48,0x43,0x40,0x19,0x0A,0x00,0x39,0x00,0xAE,0x90,0xFF,0xF7, + 0x7F,0xFA,0xF9,0x79,0xAE,0x98,0xC1,0x71,0x39,0x7A,0xAE,0x98,0x01,0x72,0x38,0x79, + 0xAA,0x9A,0xA2,0xA9,0x88,0x54,0xAA,0x98,0x3A,0x79,0x29,0x00,0x40,0x1C,0xFB,0x31, + 0x50,0x54,0xAC,0x98,0x40,0x1C,0xAC,0x90,0xA8,0x98,0x40,0x1C,0xA8,0x90,0x01,0x20, + 0xE0,0x75,0x03,0x99,0x89,0x7E,0x00,0x29,0x16,0xD1,0x03,0x99,0x88,0x76,0x13,0xE0, + 0xB8,0x1D,0x02,0xF0,0x5B,0xFB,0x00,0x28,0x0E,0xD0,0x01,0x99,0x01,0x20,0x08,0x75, + 0xB8,0x79,0x13,0x28,0x08,0xD9,0x60,0x7D,0x01,0x28,0x05,0xD1,0x03,0x98,0x04,0x21, + 0xC0,0x88,0x08,0x43,0x03,0x99,0xC8,0x80,0xAB,0x98,0x40,0x1C,0xAB,0x90,0x60,0x7D, + 0xAB,0x99,0x88,0x42,0x8F,0xDC,0x03,0x98,0xC0,0x88,0x40,0x07,0x07,0xD5,0x05,0x98, + 0x04,0x21,0xA0,0x75,0x03,0x98,0xC0,0x88,0x88,0x43,0x03,0x99,0xC8,0x80,0x00,0x27, + 0x27,0xE0,0xA2,0xA8,0xC0,0x5D,0x00,0x28,0x13,0xD1,0x00,0x22,0xA8,0x18,0xFC,0x21, + 0x09,0x5C,0x00,0x29,0x0A,0xD1,0xFF,0x30,0x01,0x30,0x00,0x7A,0x00,0x28,0x05,0xD1, + 0x39,0x00,0x01,0x23,0xA2,0xA8,0xFF,0xF7,0x09,0xFB,0x02,0xE0,0x52,0x1C,0x0C,0x2A, + 0xEC,0xDB,0xA0,0x7D,0x00,0x28,0x0B,0xD0,0x0A,0x20,0x78,0x43,0x40,0x19,0xAD,0x90, + 0x80,0x1D,0x02,0xF0,0x13,0xFB,0x00,0x28,0x02,0xD1,0xAD,0x99,0x01,0x20,0x88,0x71, + 0x7F,0x1C,0xB7,0x42,0xD5,0xDB,0xA8,0x98,0x30,0x18,0x20,0x75,0x33,0xE6,0x00,0x00, + 0xF3,0xB5,0x3A,0x48,0x85,0xB0,0x04,0x90,0x00,0x20,0x03,0x90,0x38,0x48,0xC0,0x7F, + 0x01,0x90,0x37,0x48,0x20,0x30,0x01,0x78,0x00,0x91,0x00,0x21,0x02,0x91,0xC0,0x78, + 0x00,0x28,0x02,0xD0,0x06,0x98,0x40,0x42,0x06,0x90,0x05,0xF0,0x91,0xFF,0x01,0xF0, + 0xC9,0xF9,0x01,0xF0,0x41,0xFA,0x00,0x24,0x27,0x00,0x38,0xE0,0x00,0x26,0x30,0xE0, + 0x31,0x00,0x38,0x00,0x02,0xF0,0x58,0xF8,0x00,0x28,0x28,0xD0,0x29,0x78,0x04,0x9A, + 0x79,0x43,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x05,0x98, + 0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x06,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0, + 0x7B,0xFB,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0, + 0x00,0x2D,0x0C,0xDD,0x06,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x6D,0xFB,0x40,0x1C, + 0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD,0x03,0x20,0x03,0x90,0x64,0x1C, + 0x76,0x1C,0x13,0x4D,0x20,0x3D,0x28,0x78,0xB0,0x42,0xC9,0xD8,0x7F,0x1C,0x10,0x48, + 0x20,0x38,0x41,0x78,0xB9,0x42,0xC1,0xD8,0x01,0x00,0x48,0x78,0x09,0x78,0x48,0x43, + 0xA0,0x42,0x04,0xD1,0x03,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98, + 0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xA6,0xD9,0x05,0x98,0x00,0x28, + 0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x03,0x90,0xEC,0xE7,0xD4,0x02,0x10,0x40, + 0xBC,0x94,0x00,0x00,0xF0,0xB5,0x90,0x4A,0x87,0xB0,0x40,0x18,0x06,0x92,0x42,0x00, + 0x80,0x18,0x05,0x90,0x48,0x42,0x04,0x90,0x8C,0x48,0x8F,0x4C,0x80,0x7C,0x8C,0x4F, + 0x03,0x90,0x8C,0x48,0x01,0x90,0xE0,0x78,0x00,0x28,0x02,0xD1,0x04,0x98,0x40,0x42, + 0x04,0x90,0x8A,0x4A,0x00,0x21,0x38,0x00,0xFF,0xF7,0x78,0xF9,0x00,0x26,0x38,0xE0, + 0x00,0x25,0x30,0xE0,0x60,0x79,0xC0,0x07,0x15,0xD0,0x85,0x48,0x00,0x78,0x00,0x28, + 0x03,0x98,0x16,0xD0,0x86,0x42,0x0E,0xD1,0xA0,0x7A,0xA8,0x42,0x0B,0xD0,0xE0,0x7A, + 0xA8,0x42,0x08,0xD0,0x20,0x7B,0xA8,0x42,0x05,0xD0,0x60,0x7B,0xA8,0x42,0x02,0xD0, + 0xA0,0x7B,0xA8,0x42,0x16,0xD1,0x04,0x9A,0x29,0x00,0x30,0x00,0x05,0xF0,0xFC,0xFA, + 0x10,0xE0,0x85,0x42,0xF7,0xD1,0xA0,0x7A,0xB0,0x42,0xF4,0xD0,0xE0,0x7A,0xB0,0x42, + 0xF1,0xD0,0x20,0x7B,0xB0,0x42,0xEE,0xD0,0x60,0x7B,0xB0,0x42,0xEB,0xD0,0xA0,0x7B, + 0xB0,0x42,0xE8,0xD0,0x6D,0x1C,0x6C,0x48,0x40,0x38,0x00,0x78,0xA8,0x42,0xC9,0xD8, + 0x76,0x1C,0x69,0x48,0x40,0x38,0x40,0x78,0xB0,0x42,0xC1,0xD8,0x05,0xF0,0xD0,0xFE, + 0x01,0xF0,0x08,0xF9,0x01,0xF0,0x80,0xF9,0x00,0x26,0x2E,0xE0,0x00,0x25,0x26,0xE0, + 0x29,0x00,0x30,0x00,0x01,0xF0,0x98,0xFF,0x00,0x28,0x13,0xD0,0x5E,0x49,0x06,0x9B, + 0x40,0x39,0x09,0x78,0x71,0x43,0x4A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05, + 0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A, + 0x51,0x00,0x78,0x52,0x29,0x00,0x30,0x00,0x01,0xF0,0xC2,0xFF,0x52,0x49,0x01,0x9A, + 0x40,0x39,0x09,0x78,0x71,0x43,0x49,0x19,0x49,0x00,0x6D,0x1C,0x50,0x52,0x4E,0x48, + 0x40,0x38,0x00,0x78,0xA8,0x42,0xD3,0xD8,0x76,0x1C,0x4B,0x48,0x40,0x38,0x41,0x78, + 0xB1,0x42,0xCB,0xD8,0x00,0x21,0x02,0x91,0x01,0xF0,0x46,0xF9,0x00,0x26,0x54,0xE0, + 0x00,0x25,0x4C,0xE0,0x29,0x00,0x30,0x00,0x01,0xF0,0x5E,0xFF,0x00,0x28,0x45,0xD0, + 0x41,0x49,0x06,0x9B,0x40,0x39,0x09,0x78,0x71,0x43,0x4A,0x19,0x91,0x00,0x59,0x58, + 0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A, + 0x00,0xE0,0x40,0x1A,0x51,0x00,0x7A,0x5A,0x00,0x04,0x00,0x0C,0x82,0x42,0x0C,0xD9, + 0x78,0x52,0x29,0x00,0x30,0x00,0x01,0xF0,0x83,0xFF,0x33,0x49,0x01,0x9A,0x40,0x39, + 0x09,0x78,0x71,0x43,0x49,0x19,0x49,0x00,0x50,0x52,0x02,0x98,0x03,0x21,0xFF,0xF7, + 0x8D,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0C,0xD1,0xE0,0x78,0x00,0x28,0x02,0xD1, + 0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x29,0x00,0x30,0x00,0x05,0xF0, + 0x2D,0xFA,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x29,0x00,0x30,0x00,0x05,0xF0, + 0x25,0xFA,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x6D,0x1C,0x1E,0x48, + 0x40,0x38,0x00,0x78,0xA8,0x42,0xAD,0xD8,0x76,0x1C,0x1B,0x48,0x40,0x38,0x41,0x78, + 0xB1,0x42,0xA5,0xD8,0x02,0x99,0x49,0x1C,0x02,0x91,0x05,0x99,0x49,0x1E,0x05,0x91, + 0x1C,0xD2,0x00,0x25,0x06,0x00,0x0F,0xE0,0x00,0x24,0x09,0xE0,0x69,0x43,0x08,0x19, + 0x01,0x99,0x40,0x00,0x0A,0x5A,0x21,0x00,0x28,0x00,0x05,0xF0,0x1F,0xFA,0x64,0x1C, + 0x31,0x78,0xA1,0x42,0xF2,0xD8,0x6D,0x1C,0x70,0x78,0xA8,0x42,0xEC,0xD8,0x05,0xF0, + 0x17,0xFE,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x05,0xF0,0x10,0xFE, + 0x01,0xF0,0x48,0xF8,0x78,0xE7,0x00,0x00,0xD4,0x02,0x10,0x40,0xC0,0x06,0x00,0x20, + 0x00,0x00,0x00,0x10,0x2A,0x08,0x00,0x20,0xDC,0x94,0x00,0x00,0xD2,0x02,0x00,0x00, + 0xF4,0x07,0x00,0x20,0x1F,0xB5,0x68,0x46,0xFF,0xF7,0x6C,0xFB,0x00,0x20,0x05,0xF0, + 0x87,0xFA,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x1C,0xFE,0x68,0x46,0x04,0xF0, + 0x63,0xFD,0x1F,0xBC,0x08,0xBC,0x18,0x47,0x15,0x48,0x10,0xB5,0x01,0x78,0x15,0x48, + 0x00,0x68,0x00,0x29,0x02,0xD0,0x14,0x49,0x49,0x89,0x00,0xE0,0x81,0x8B,0x13,0x4A, + 0x92,0x8B,0x53,0x18,0x12,0x49,0x13,0x4A,0x8C,0x89,0xA3,0x42,0x14,0xD9,0x12,0x4B, + 0x5B,0x7E,0x00,0x2B,0x10,0xD1,0xC9,0x88,0x17,0x23,0x5B,0x01,0x19,0x42,0x0B,0xD1, + 0xD1,0x68,0x49,0x1C,0xD1,0x60,0x80,0x7F,0x88,0x42,0x07,0xD2,0x01,0xF0,0x34,0xF8, + 0x01,0x20,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xD0,0x60,0x00,0x20,0xF8,0xE7, + 0xFA,0x07,0x00,0x20,0xE8,0x07,0x00,0x20,0x1C,0x95,0x00,0x00,0xC0,0x01,0x00,0x20, + 0x40,0x00,0x00,0x20,0x18,0x08,0x00,0x20,0x60,0x03,0x00,0x20,0xF3,0xB5,0x04,0x00, + 0x75,0x48,0x00,0x26,0x01,0x00,0x20,0x31,0x0A,0x7A,0x01,0x25,0x82,0xB0,0xD2,0x07, + 0x00,0x2A,0x86,0x46,0x01,0xD1,0xE5,0x71,0x5F,0xE0,0x80,0x8D,0x6F,0x4A,0x84,0x46, + 0x88,0x7A,0x1C,0x21,0x51,0x5E,0x13,0x00,0x1E,0x22,0x9A,0x5E,0x00,0x28,0x21,0xD0, + 0x69,0x4B,0x9B,0x8D,0x1F,0x04,0x3F,0x14,0x01,0x28,0x0F,0xD0,0x02,0x28,0x14,0xD0, + 0x03,0x28,0x4A,0xD1,0x65,0x48,0x6B,0x46,0x99,0x80,0x81,0x8B,0x60,0x46,0x08,0x18, + 0xD8,0x80,0x00,0x20,0x6B,0x46,0x18,0x80,0x5A,0x80,0x15,0xE0,0x00,0x20,0x6B,0x46, + 0x98,0x80,0xD9,0x80,0x18,0x80,0x5F,0x80,0x0E,0xE0,0x00,0x20,0x6B,0x46,0x98,0x80, + 0xDF,0x80,0xEF,0xE7,0x00,0x20,0x6B,0x46,0x98,0x80,0x58,0x48,0xD9,0x80,0x1A,0x80, + 0xC1,0x8B,0x60,0x46,0x08,0x18,0x58,0x80,0x00,0x20,0x04,0x22,0x6B,0x46,0x20,0x5E, + 0x9A,0x5E,0x02,0x21,0x61,0x5E,0x02,0x27,0x82,0x42,0x69,0xDC,0x06,0x22,0x9A,0x5E, + 0x90,0x42,0x65,0xDC,0x00,0x22,0x9A,0x5E,0x8A,0x42,0x61,0xDC,0xDA,0x5F,0x91,0x42, + 0x5E,0xDC,0x03,0x9A,0xFE,0x1E,0x00,0x2A,0x75,0xD0,0x01,0x2A,0x12,0xD0,0x02,0x2A, + 0x23,0xD0,0x04,0x2A,0x7C,0xD1,0xE2,0x79,0xD3,0x07,0x37,0xD0,0x50,0x07,0x80,0x0F, + 0x2B,0xD0,0x0A,0x20,0x00,0x26,0xE0,0x71,0x72,0xE0,0x00,0x20,0x04,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x72,0x46,0x40,0x32,0xD2,0x7F,0x00,0x2A,0x68,0xD1,0x00,0xF0, + 0x79,0xF8,0x05,0x00,0x06,0xD0,0x06,0x20,0xE0,0x71,0x29,0x00,0x20,0x00,0xFF,0xF7, + 0x45,0xF8,0x00,0xE0,0xE7,0x71,0x25,0x72,0x5A,0xE0,0xE2,0x79,0xD3,0x07,0xDD,0xD1, + 0x92,0x07,0x55,0xD5,0x00,0xF0,0x66,0xF8,0x00,0x28,0x09,0xD0,0x21,0x7A,0x00,0x29, + 0x06,0xD1,0x06,0x21,0xE1,0x71,0x20,0x72,0x03,0xE0,0x12,0x20,0xE0,0x71,0x47,0xE0, + 0xE7,0x71,0x01,0x00,0x20,0x00,0xFF,0xF7,0x29,0xF8,0x41,0xE0,0x92,0x07,0x3F,0xD5, + 0x00,0xF0,0x50,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0,0x81,0x42, + 0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFF,0xF7,0x18,0xF8,0xA5,0x71,0x04,0xE0, + 0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0xE7,0x71,0x00,0x20,0x20,0x72,0x27,0xE0, + 0x03,0x98,0x00,0x28,0x23,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28,0x06,0xD0,0x04,0x28, + 0x1E,0xD1,0xE0,0x79,0x80,0x07,0x0F,0xD4,0xE5,0x71,0x19,0xE0,0xE0,0x79,0x80,0x07, + 0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0xF5,0xFF,0xE5,0x71,0x09,0xE0,0x0A,0xE0,0xE7,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xE9,0xFF,0xA5,0x71,0x00,0xE0,0xE7,0x71, + 0x07,0x49,0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43, + 0xC8,0x80,0x30,0x00,0x82,0xE7,0x00,0x00,0xA4,0x06,0x00,0x20,0x9C,0x94,0x00,0x00, + 0x40,0x00,0x00,0x20,0xF0,0xB4,0x13,0x4C,0x29,0x22,0x17,0x5D,0x00,0x2F,0x1F,0xD0, + 0x5C,0x22,0x12,0x5D,0x00,0x2A,0x1B,0xD1,0x18,0xE0,0xD5,0x00,0x2B,0x19,0x04,0x26, + 0x9E,0x5F,0xB0,0x42,0x0F,0xDB,0x06,0x26,0x9E,0x5F,0xB0,0x42,0x0B,0xDC,0x65,0x5F, + 0xA9,0x42,0x08,0xDB,0x02,0x25,0x5D,0x5F,0xA9,0x42,0x04,0xDC,0x52,0x1C,0x10,0x06, + 0x00,0x0E,0xF0,0xBC,0x70,0x47,0x52,0x1C,0x12,0x06,0x12,0x0E,0x97,0x42,0xE4,0xD8, + 0x00,0x20,0xF6,0xE7,0xA4,0x06,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8F,0xB0,0x07,0x90, + 0xBB,0x48,0xBC,0x4C,0x00,0x68,0x26,0x00,0x01,0x68,0xFF,0x36,0x09,0x04,0x09,0x0C, + 0x06,0x91,0x5A,0x21,0x09,0x5C,0xA5,0x36,0x35,0x00,0x02,0x91,0x01,0x21,0x01,0x91, + 0x85,0x21,0x89,0x00,0x67,0x18,0x89,0x21,0x89,0x00,0x61,0x18,0x8E,0x46,0xE1,0x88, + 0x82,0x3D,0x8A,0x06,0x05,0xD5,0x22,0x79,0x00,0x2A,0x02,0xD1,0x20,0x22,0x91,0x43, + 0xE1,0x80,0x31,0x00,0x60,0x31,0x60,0x30,0x0E,0x91,0x02,0x8A,0xC9,0x88,0x94,0x46, + 0x91,0x42,0x04,0xD9,0x0E,0x9A,0x43,0x8A,0x12,0x89,0x9A,0x42,0x0D,0xD8,0x0E,0x9A, + 0x83,0x8A,0x52,0x89,0x9A,0x42,0x08,0xD8,0x61,0x45,0x04,0xD9,0x62,0x89,0x7D,0x23, + 0xDB,0x00,0x9A,0x42,0x01,0xD8,0x50,0x29,0x06,0xD9,0xE1,0x88,0x40,0x22,0x11,0x43, + 0xE1,0x80,0xC0,0x89,0x0E,0x99,0x05,0xE0,0x0E,0x99,0x0C,0x20,0x08,0x56,0x00,0x28, + 0x02,0xDD,0x40,0x1E,0x08,0x73,0x03,0xE0,0xE0,0x88,0x40,0x21,0x88,0x43,0xE0,0x80, + 0x06,0x98,0x80,0x04,0x7B,0xD5,0x70,0x46,0xFF,0x30,0x01,0x30,0x40,0x7D,0x00,0x28, + 0x03,0xD1,0x20,0x79,0x00,0x28,0x00,0xD1,0x01,0x90,0x00,0xF0,0x1D,0xF9,0x20,0x79, + 0x00,0x28,0x0D,0x90,0x34,0xD0,0x20,0x89,0x89,0x49,0x0C,0x90,0x09,0x68,0x40,0x31, + 0x0B,0x91,0x49,0x8A,0x88,0x42,0x2B,0xD2,0x0A,0x22,0x06,0x21,0x50,0x43,0x79,0x5E, + 0x0A,0x91,0xFE,0xF7,0xE9,0xFC,0x0B,0x99,0x09,0x7D,0x88,0x42,0x20,0xDA,0x0A,0x99, + 0x0C,0x98,0x40,0x1A,0x0A,0x21,0xFE,0xF7,0xDF,0xFC,0x0B,0x99,0x49,0x7D,0x88,0x42, + 0x16,0xDA,0x0B,0x98,0x39,0x88,0x80,0x7D,0x81,0x42,0x11,0xD9,0x0B,0x98,0xB9,0x68, + 0xC0,0x7D,0x81,0x42,0x0C,0xDA,0xEE,0x20,0x00,0x5D,0x00,0x28,0x08,0xD1,0x78,0x79, + 0x00,0x28,0x1B,0xD0,0x0B,0x99,0x49,0x7F,0x88,0x42,0x17,0xD8,0x40,0x1E,0x14,0xE0, + 0x6F,0x49,0xB8,0x68,0x09,0x68,0x40,0x31,0x0A,0x7E,0x90,0x42,0x0E,0xDB,0x0D,0x98, + 0x00,0x28,0x0B,0xD0,0xE0,0x88,0x00,0x06,0x08,0xD4,0x78,0x79,0xC9,0x7E,0x88,0x42, + 0x04,0xD2,0x02,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C,0x78,0x71,0x78,0x79,0x02,0x99, + 0x80,0x22,0x88,0x42,0x0B,0xD8,0x01,0x98,0x01,0x28,0x08,0xD1,0xE0,0x88,0x10,0x43, + 0xE0,0x80,0x5F,0x48,0x00,0x68,0x40,0x30,0x00,0x7F,0x38,0x71,0x0F,0xE0,0xE0,0x88, + 0x01,0x06,0x0C,0xD5,0x39,0x79,0x00,0x29,0x07,0xD1,0x90,0x43,0xE0,0x80,0x58,0x48, + 0x00,0x68,0x40,0x30,0x40,0x7E,0x78,0x71,0x01,0xE0,0x49,0x1E,0x39,0x71,0x20,0x79, + 0x00,0x28,0x7E,0xD0,0x52,0x48,0x00,0x68,0x60,0x30,0x01,0x79,0x05,0x91,0xC1,0x78, + 0x04,0x91,0xE1,0x88,0x40,0x79,0xC9,0x06,0x08,0xD5,0x04,0x99,0x81,0x42,0x03,0xD9, + 0x08,0x1A,0x00,0x06,0x00,0x0E,0x00,0xE0,0x01,0x20,0x04,0x90,0x00,0x20,0x03,0x90, + 0x08,0x90,0xC0,0x00,0x84,0x46,0x80,0x19,0x09,0x90,0x81,0x88,0x00,0x29,0x74,0xD0, + 0x06,0x9A,0x00,0x20,0x92,0x07,0x08,0xD5,0x05,0x9A,0x91,0x42,0x05,0xD9,0x20,0x71, + 0xE0,0x88,0x20,0x21,0x08,0x43,0xE0,0x80,0x01,0x20,0x06,0x99,0x49,0x07,0x64,0xD5, + 0x00,0x28,0x62,0xD1,0x09,0x98,0x04,0x99,0x80,0x88,0x88,0x42,0x5D,0xD3,0x0E,0x98, + 0x81,0x88,0x37,0x48,0x00,0x68,0x60,0x30,0x80,0x78,0x81,0x42,0x55,0xD9,0x00,0x27, + 0x38,0x00,0x29,0xE0,0xC1,0x00,0x89,0x19,0x89,0x79,0x08,0x9A,0x49,0x1E,0x91,0x42, + 0x21,0xD1,0x0E,0x99,0x09,0x88,0xC1,0x40,0xC9,0x07,0x1C,0xD0,0x0A,0x21,0x41,0x43, + 0x7F,0x1C,0x49,0x19,0x89,0x7C,0x07,0x91,0x01,0x00,0x0D,0xE0,0x0A,0x22,0x4A,0x43, + 0x52,0x19,0x13,0x8B,0xD3,0x81,0x53,0x8B,0x13,0x82,0x13,0x7F,0x93,0x74,0xCA,0x00, + 0x92,0x19,0x93,0x7B,0x49,0x1C,0x93,0x71,0x22,0x79,0x8A,0x42,0xEE,0xDC,0x21,0x79, + 0x49,0x1E,0x40,0x1E,0x21,0x71,0x40,0x1C,0x21,0x79,0x81,0x42,0xD2,0xDC,0x00,0x2F, + 0x23,0xD0,0x01,0x2F,0x01,0xDD,0x01,0x20,0x03,0x90,0x20,0x79,0x0A,0x21,0x40,0x1C, + 0x07,0x06,0x3F,0x0E,0x60,0x46,0x27,0x71,0x30,0x5E,0xFE,0xF7,0x0D,0xFC,0x0A,0x21, + 0x00,0xE0,0x21,0xE0,0x4F,0x43,0x79,0x19,0x88,0x80,0x09,0x99,0x02,0x20,0x08,0x5E, + 0x0A,0x21,0xFE,0xF7,0x01,0xFC,0x21,0x79,0x0A,0x22,0x51,0x43,0x49,0x19,0xC8,0x80, + 0x20,0x79,0x07,0x99,0x50,0x43,0x40,0x19,0x01,0x72,0x08,0x98,0x40,0x1C,0x0C,0x28, + 0x08,0x90,0x00,0xDA,0x7D,0xE7,0x03,0x99,0x10,0x20,0x00,0x29,0xE1,0x88,0x01,0xD0, + 0x01,0x43,0x00,0xE0,0x81,0x43,0xE1,0x80,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xE8,0x07,0x00,0x20,0x40,0x00,0x00,0x20,0xF0,0xB5,0x5F,0x48,0xBD,0xB0,0x01,0x90, + 0x5F,0x48,0x60,0x4C,0x00,0x68,0x5D,0x4E,0x40,0x30,0x01,0x7B,0x37,0x91,0x45,0x7B, + 0x49,0x00,0x36,0x95,0x60,0x78,0x40,0x1A,0x35,0x90,0x21,0x78,0x68,0x00,0x3C,0x90, + 0x08,0x1A,0x34,0x90,0x01,0x98,0x00,0x21,0xC1,0x80,0x01,0x98,0x81,0x60,0x33,0x91, + 0x32,0x91,0x60,0x21,0x1A,0xA8,0xFE,0xF7,0x5F,0xFD,0x60,0x21,0x02,0xA8,0xFE,0xF7, + 0x5B,0xFD,0x20,0x00,0x00,0x78,0x36,0x9D,0x39,0x90,0x40,0x1B,0x38,0x90,0x50,0xE0, + 0x69,0x00,0x3B,0x91,0x61,0x78,0x37,0x98,0x09,0x1A,0x3A,0x91,0x36,0x99,0x69,0x1A, + 0x8C,0x00,0x15,0xE0,0x39,0x99,0x43,0x00,0x41,0x43,0x9B,0x19,0x30,0x27,0x3B,0x9A, + 0xDF,0x5F,0x45,0x4B,0x49,0x19,0xB2,0x5E,0x49,0x00,0x59,0x5E,0xD2,0x19,0x51,0x18, + 0x33,0x9A,0x52,0x18,0x33,0x92,0x1A,0xAA,0x13,0x59,0x59,0x18,0x40,0x1C,0x11,0x51, + 0x3A,0x99,0x81,0x42,0xE6,0xDC,0x1A,0xAF,0x38,0x59,0x35,0x99,0xFE,0xF7,0x8C,0xFB, + 0x38,0x51,0x37,0x99,0x84,0x46,0x16,0xE0,0x39,0x98,0x37,0x4A,0x48,0x43,0x40,0x19, + 0x40,0x00,0x12,0x5E,0x60,0x46,0x12,0x1A,0x3B,0x98,0x33,0x5E,0x48,0x00,0x87,0x19, + 0x30,0x20,0x38,0x5E,0x18,0x18,0x12,0x18,0x17,0x00,0x57,0x43,0x02,0xA8,0x03,0x59, + 0xDA,0x19,0x49,0x1C,0x02,0x51,0x3A,0x98,0x88,0x42,0xE5,0xDC,0x35,0x99,0x02,0xAF, + 0x38,0x59,0x49,0x1E,0xFE,0xF7,0x68,0xFB,0x38,0x51,0x32,0x99,0x40,0x18,0x6D,0x1C, + 0x32,0x90,0x38,0x98,0x23,0x4C,0xA8,0x42,0xAA,0xDC,0x34,0x99,0x32,0x98,0xFE,0xF7, + 0x5B,0xFB,0x06,0x00,0x34,0xA8,0x03,0xC8,0x41,0x43,0x33,0x98,0xFE,0xF7,0x54,0xFB, + 0x05,0x04,0x01,0x98,0x2D,0x14,0x00,0x21,0x02,0xAA,0xC5,0x80,0x0A,0xE0,0x88,0x00, + 0x10,0x58,0x30,0x1A,0x03,0x00,0x43,0x43,0x01,0x98,0x80,0x68,0x18,0x18,0x01,0x9B, + 0x49,0x1C,0x98,0x60,0x20,0x78,0x3C,0x9B,0xC0,0x1A,0x88,0x42,0xEF,0xDC,0x01,0x98, + 0x34,0x99,0x80,0x68,0x49,0x1E,0xFE,0xF7,0x37,0xFB,0x01,0x99,0x88,0x60,0x22,0x78, + 0x36,0x99,0x63,0x78,0x51,0x1A,0x37,0x9A,0x9A,0x1A,0x92,0x02,0x51,0x43,0xFE,0xF7, + 0x2B,0xFB,0x01,0x99,0x00,0x2D,0x88,0x60,0x02,0xD1,0x01,0x98,0x6D,0x1C,0xC5,0x80, + 0x3D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x54,0x02,0x00,0x20,0xCA,0x00,0x00,0x20, + 0xE8,0x07,0x00,0x20,0x9C,0x94,0x00,0x00,0x00,0x00,0x00,0x10,0x0A,0x48,0x00,0xB5, + 0x41,0x68,0x09,0x07,0x0D,0xD5,0xC1,0x68,0x00,0x29,0x0A,0xD0,0xC0,0x68,0x07,0x28, + 0x05,0xD1,0x01,0x21,0x49,0x07,0xC8,0x63,0x01,0x20,0x08,0xBC,0x18,0x47,0x04,0xF0, + 0x9B,0xF9,0x00,0x20,0xF9,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x70,0x47, + 0xF8,0xB5,0x40,0x4C,0x20,0x68,0x00,0x04,0x00,0x0C,0x05,0xF0,0xBF,0xF9,0x05,0xF0, + 0xA1,0xF9,0x01,0x27,0x7F,0x03,0x38,0x00,0xFE,0xF7,0xA8,0xFF,0xFE,0xF7,0xC6,0xFC, + 0x00,0x20,0x04,0xF0,0xD3,0xFC,0x01,0x20,0x04,0xF0,0x64,0xFC,0x00,0xF0,0xB4,0xFC, + 0x1F,0x20,0x01,0xF0,0x43,0xFC,0x34,0x4D,0x34,0x4E,0x5B,0xE0,0x20,0x68,0x00,0x04, + 0x00,0x0C,0x05,0xF0,0xA3,0xF9,0x80,0x20,0xFE,0xF7,0x90,0xFF,0x03,0x20,0x05,0xF0, + 0xD7,0xF8,0x38,0x00,0xFE,0xF7,0x8A,0xFF,0x00,0xF0,0x6E,0xFC,0x00,0xF0,0x2A,0xFC, + 0x00,0xF0,0x38,0xFC,0x01,0x20,0xFE,0xF7,0x89,0xFF,0x00,0xF0,0xAD,0xFC,0x00,0xF0, + 0x19,0xFC,0x01,0x20,0x80,0x03,0xFE,0xF7,0x79,0xFF,0x00,0xF0,0x2B,0xFC,0x00,0xF0, + 0xA3,0xFC,0xFE,0xF7,0x53,0xFD,0xFF,0xF7,0xA1,0xFF,0x00,0x28,0x35,0xD1,0x03,0xF0, + 0x81,0xF8,0x00,0x28,0x02,0xD0,0x01,0x20,0x30,0x70,0x01,0xE0,0xFF,0xF7,0xE2,0xFB, + 0x03,0x20,0x40,0x03,0xFE,0xF7,0x5A,0xFF,0x30,0x78,0x00,0x28,0x06,0xD0,0x18,0x48, + 0x00,0x78,0x00,0x09,0x04,0x28,0x20,0xD1,0x00,0x20,0x30,0x70,0x03,0x20,0x05,0xF0, + 0x79,0xF8,0x00,0x90,0x03,0x20,0x05,0xF0,0xAD,0xF8,0x80,0x20,0xFE,0xF7,0x46,0xFF, + 0x28,0x8C,0x00,0x28,0x02,0xD0,0x40,0x1E,0x28,0x84,0x0B,0xE0,0x0D,0x48,0x00,0x78, + 0x00,0x28,0x07,0xD1,0x0C,0x48,0x00,0x68,0x00,0x28,0x03,0xD0,0x00,0x99,0x00,0x20, + 0x03,0xF0,0xF4,0xFE,0x30,0x78,0x00,0x28,0xA0,0xD0,0x05,0xF0,0x39,0xF9,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x08,0x00,0x20,0x40,0x00,0x00,0x20,0x18,0x08,0x00,0x20, + 0xFB,0x07,0x00,0x20,0xF5,0x07,0x00,0x20,0x0C,0x08,0x00,0x20,0xF0,0xB5,0x4F,0x49, + 0x0C,0x23,0x08,0x79,0x0A,0x00,0xFF,0x32,0x00,0x24,0x23,0x32,0x85,0xB0,0x00,0x28, + 0x84,0x46,0x00,0x93,0x10,0xD1,0x0A,0x23,0x43,0x43,0x9B,0x18,0x1C,0x88,0x40,0x1C, + 0x00,0x06,0x5C,0x80,0x00,0x9B,0x00,0x0E,0x98,0x42,0xF4,0xDB,0x08,0x79,0xC8,0x76, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x7E,0x20,0x80,0x5A,0x00,0x28,0x04,0x90, + 0x3A,0xD0,0xCB,0x7E,0x00,0x20,0x00,0x2B,0x03,0x93,0x35,0xD9,0x43,0x1C,0x01,0x26, + 0x04,0x9D,0x9E,0x40,0x35,0x42,0x02,0x93,0x28,0xD0,0x0A,0x23,0x58,0x43,0x86,0x18, + 0xB6,0x1C,0x00,0x20,0x63,0x46,0x00,0x2B,0x20,0xD9,0x33,0x78,0x01,0x93,0x5B,0x1E, + 0x9E,0x46,0x0A,0x23,0x43,0x43,0x9B,0x18,0x1D,0x78,0xAE,0x45,0x11,0xDC,0x01,0x9F, + 0x7F,0x1C,0xAF,0x42,0x0D,0xD3,0x75,0x78,0x5B,0x78,0x6F,0x1E,0x9F,0x42,0x08,0xDC, + 0x6D,0x1C,0x9D,0x42,0x05,0xD3,0x43,0x1C,0x01,0x25,0x9D,0x40,0x25,0x43,0x2C,0x04, + 0x24,0x0C,0x40,0x1C,0x00,0x06,0x00,0x0E,0x84,0x45,0xE2,0xD8,0x02,0x98,0x03,0x9B, + 0x00,0x06,0x00,0x0E,0x83,0x42,0xC9,0xD8,0x00,0x9B,0x00,0x20,0x00,0x2B,0x0A,0xDD, + 0x0A,0x23,0x43,0x43,0x9B,0x18,0x1D,0x88,0x40,0x1C,0x00,0x06,0x5D,0x80,0x00,0x9B, + 0x00,0x0E,0x98,0x42,0xF4,0xDB,0x0D,0x79,0x00,0x2D,0xCD,0x76,0x23,0xD0,0x20,0x00, + 0xE8,0x40,0xC0,0x07,0x1B,0xD0,0x60,0x46,0x00,0x28,0x03,0xD0,0x40,0x1E,0x00,0x06, + 0x00,0x0E,0x84,0x46,0x0B,0x79,0x28,0x00,0xAB,0x42,0x10,0xD9,0x0A,0x23,0x43,0x43, + 0x9B,0x18,0x1F,0x88,0x1E,0x00,0x40,0x3E,0xF7,0x86,0xDF,0x89,0x40,0x1C,0x00,0x06, + 0x9F,0x80,0x1E,0x8A,0x00,0x0E,0xDE,0x80,0x0B,0x79,0x83,0x42,0xEE,0xD8,0x6D,0x1E, + 0x2D,0x06,0x2D,0x0E,0xDB,0xD1,0x60,0x46,0x08,0x71,0x08,0x79,0x00,0x28,0x00,0xD0, + 0x7E,0xE7,0x88,0x81,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20, + 0x0C,0x21,0x48,0x43,0x10,0x49,0x70,0xB5,0x40,0x18,0x10,0x49,0x10,0x4D,0x44,0x18, + 0x00,0x20,0xC0,0x43,0x20,0x80,0x60,0x80,0xA0,0x80,0xE0,0x80,0x08,0x22,0x00,0x21, + 0xA8,0x1D,0xFE,0xF7,0x47,0xFB,0x28,0x00,0x14,0x22,0x00,0x21,0x0E,0x30,0xFE,0xF7, + 0x41,0xFB,0x00,0x20,0x02,0x00,0x81,0x00,0x09,0x19,0x0A,0x81,0x40,0x1E,0x4A,0x81, + 0xF9,0xD5,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0xCA,0x05,0x00,0x00, + 0x82,0x06,0x00,0x20,0x10,0xB5,0x00,0xF0,0xA7,0xF8,0x00,0xF0,0x87,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0xB5,0x15,0x4D,0x15,0x4E,0x28,0x00,0x34,0x00,0xB4,0x34, + 0x0C,0x22,0x00,0x21,0xFC,0x30,0xFE,0xF7,0x1D,0xFB,0x78,0x22,0x00,0x21,0x28,0x00, + 0xFE,0xF7,0x18,0xFB,0x00,0x27,0xFF,0x20,0x15,0x30,0x47,0x55,0x30,0x00,0x28,0x22, + 0x39,0x00,0x34,0x30,0xFE,0xF7,0x0E,0xFB,0x5D,0x20,0x87,0x55,0x04,0x22,0x00,0x21, + 0x20,0x00,0xFE,0xF7,0x07,0xFB,0x30,0x22,0x00,0x21,0x20,0x1D,0xFE,0xF7,0x02,0xFB, + 0x36,0x20,0x07,0x55,0xA7,0x86,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x64,0x02,0x00,0x20, + 0xA4,0x06,0x00,0x20,0x10,0xB5,0x00,0x24,0x20,0x00,0x00,0xF0,0x07,0xF8,0x64,0x1C, + 0x0C,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x12,0x49,0x10,0xB4, + 0x09,0x68,0x80,0x31,0xCC,0x7F,0x34,0x21,0x48,0x43,0x10,0x49,0x40,0x18,0x10,0x49, + 0x40,0x18,0x08,0x21,0x00,0x23,0x8A,0x00,0x12,0x18,0x93,0x80,0x49,0x1E,0xD3,0x80, + 0xF9,0xD5,0x01,0x00,0x01,0x22,0x20,0x31,0x0A,0x72,0x43,0x85,0x0C,0x73,0x4B,0x73, + 0x02,0x21,0x4A,0x00,0x12,0x18,0x49,0x1E,0xD3,0x85,0xFA,0xD5,0x00,0x21,0xC9,0x43, + 0x01,0x80,0x41,0x80,0x10,0xBC,0x70,0x47,0xE8,0x07,0x00,0x20,0x40,0x00,0x00,0x20, + 0x5A,0x03,0x00,0x00,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x24,0x40,0x9F,0xE5, + 0x60,0x20,0xA0,0xE3,0x69,0x0F,0x84,0xE2,0x00,0x10,0xA0,0xE3,0x64,0xF9,0xFF,0xEB, + 0x00,0x00,0xA0,0xE3,0x22,0x1E,0xA0,0xE3,0xBE,0x01,0xC4,0xE1,0xB4,0x00,0x81,0xE1, + 0x10,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0x0C,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0xF1,0x10,0xC0,0xE5,0xF0,0x10,0xC0,0xE5, + 0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x10,0xB5,0x06,0x4C,0x78,0x22,0x20,0x00, + 0xFF,0x30,0x23,0x30,0x00,0x21,0xFE,0xF7,0x8D,0xFA,0x00,0x20,0x20,0x71,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x10,0xB5,0x04,0x48,0x1C,0x22,0x00,0x21, + 0xFE,0xF7,0x80,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7E,0x03,0x00,0x20, + 0x10,0xB5,0x04,0xF0,0x43,0xFF,0x01,0xF0,0x67,0xFC,0x03,0xF0,0xDF,0xFF,0xFF,0xF7, + 0x79,0xFF,0x01,0xF0,0xA9,0xFB,0x03,0x49,0x00,0x20,0x48,0x71,0x88,0x76,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x70,0xB5,0x01,0x25,0x6D,0x07,0x0D,0x4C, + 0x1C,0x21,0x28,0x00,0xFE,0xF7,0x70,0xFA,0x20,0x68,0x68,0x60,0x00,0x20,0x02,0x21, + 0x82,0x00,0x12,0x19,0x52,0x68,0x00,0x2A,0x03,0xD0,0x8B,0x00,0x5B,0x19,0x1A,0x60, + 0x49,0x1C,0x40,0x1C,0x0A,0x28,0xF3,0xD3,0x20,0x34,0xA0,0x7D,0x28,0x60,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x58,0x07,0x00,0x20,0x09,0x4B,0x10,0xB4,0x1B,0x68,0xA0,0x33, + 0x1B,0x7B,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD, + 0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47, + 0xE8,0x07,0x00,0x20,0xF7,0xB5,0x66,0x48,0xFF,0xB0,0x00,0x78,0xC1,0xB0,0x00,0x28, + 0x75,0xD0,0x64,0x4C,0xE0,0x78,0x00,0x28,0x03,0xD0,0x01,0x20,0xBC,0x90,0x00,0x20, + 0x02,0xE0,0x00,0x20,0xBC,0x90,0x01,0x20,0xBB,0x90,0x5F,0x48,0x00,0x27,0xBF,0x90, + 0x5C,0x48,0x20,0x30,0x41,0x8B,0x3E,0x00,0x04,0x91,0x81,0x8B,0x03,0x91,0xC1,0x8A, + 0x02,0x91,0x01,0x8B,0x01,0x91,0x80,0x8A,0xBA,0x90,0x58,0x48,0x80,0x7C,0xBE,0x97, + 0x00,0x90,0x71,0xE0,0x00,0x25,0x69,0xE0,0x70,0x43,0x40,0x19,0xBD,0x90,0x29,0x00, + 0x30,0x00,0x01,0xF0,0x79,0xF8,0x61,0x79,0xC9,0x07,0x2D,0xD0,0x50,0x49,0x09,0x78, + 0x00,0x29,0x00,0x99,0x11,0xD0,0x8E,0x42,0x26,0xD1,0xA1,0x7A,0xA9,0x42,0x1D,0xD0, + 0xE1,0x7A,0xA9,0x42,0x1A,0xD0,0x21,0x7B,0xA9,0x42,0x17,0xD0,0x61,0x7B,0xA9,0x42, + 0x14,0xD0,0xA1,0x7B,0xA9,0x42,0x48,0xD1,0x10,0xE0,0x8D,0x42,0x14,0xD1,0xA1,0x7A, + 0xB1,0x42,0x0B,0xD0,0xE1,0x7A,0xB1,0x42,0x08,0xD0,0x21,0x7B,0xB1,0x42,0x05,0xD0, + 0x61,0x7B,0xB1,0x42,0x02,0xD0,0xA1,0x7B,0xB1,0x42,0x36,0xD1,0x04,0x99,0x03,0x9A, + 0x41,0x18,0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04, + 0x09,0x0C,0x80,0x1A,0x02,0x04,0xBD,0x98,0xBF,0x9B,0x80,0x00,0x18,0x58,0xC1,0x9B, + 0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D, + 0xC0,0x9B,0x05,0x2B,0x11,0xD8,0x90,0x42,0x02,0xDA,0xBC,0x9A,0x03,0xE0,0x4A,0xE0, + 0x88,0x42,0x12,0xDD,0xBB,0x9A,0x29,0x00,0x30,0x00,0x00,0xF0,0x8B,0xF8,0xBD,0x98, + 0x79,0x00,0x05,0xAA,0x7F,0x1C,0x50,0x52,0x07,0xE0,0xBD,0xA8,0x03,0xC8,0x05,0xAA, + 0x49,0x00,0x50,0x52,0xBE,0x98,0x40,0x1C,0xBE,0x90,0x6D,0x1C,0x1D,0x48,0x40,0x38, + 0x00,0x78,0xA8,0x42,0x90,0xDC,0x76,0x1C,0x1A,0x48,0x40,0x38,0x41,0x78,0xB1,0x42, + 0x88,0xDC,0xC0,0x98,0x05,0x28,0x03,0xD9,0x00,0x04,0xBE,0x9F,0x00,0x0C,0xBA,0x90, + 0x00,0x2F,0x20,0xDD,0x04,0xF0,0x2C,0xFF,0xC2,0x98,0x00,0x28,0x1B,0xD1,0x00,0xF0, + 0x61,0xF9,0x00,0xF0,0xD9,0xF9,0x7F,0x1E,0x15,0xD4,0x12,0x4C,0x05,0xAB,0x78,0x00, + 0x18,0x5A,0x82,0x00,0xBF,0x98,0x80,0x58,0x01,0x05,0xBA,0x98,0x09,0x0D,0x08,0x18, + 0x00,0x04,0x00,0x0C,0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04,0x08,0x43,0xBF,0x99, + 0x7F,0x1E,0x88,0x50,0xEB,0xD5,0x7F,0xB0,0x44,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xFC,0x07,0x00,0x20,0xDC,0x94,0x00,0x00,0xD4,0x02,0x10,0x40,0xC0,0x06,0x00,0x20, + 0xF4,0x07,0x00,0x20,0xFF,0x0F,0x00,0x00,0x7F,0xB5,0x18,0x48,0x00,0x78,0x80,0x28, + 0x28,0xD1,0x85,0x05,0x28,0x68,0x02,0x28,0x24,0xD1,0xAC,0x68,0x01,0xAA,0x20,0x05, + 0x00,0x0D,0x02,0x90,0x20,0x02,0x00,0x0D,0x03,0x90,0x02,0xA9,0x03,0xA8,0x6B,0x46, + 0x03,0xF0,0xFC,0xFF,0x40,0x1C,0x15,0xD0,0x0D,0x48,0x03,0x99,0x04,0x40,0x01,0x98, + 0x40,0x18,0x40,0x08,0x00,0x05,0x00,0x0A,0x04,0x43,0x00,0x98,0x02,0x99,0x40,0x00, + 0x40,0x18,0x03,0x21,0xFE,0xF7,0x02,0xF9,0x00,0x05,0x00,0x0D,0x21,0x0B,0x09,0x03, + 0x08,0x43,0xA8,0x60,0x7F,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFB,0x07,0x00,0x20, + 0xFF,0x0F,0x00,0xFF,0x30,0xB4,0x17,0x4D,0x15,0x4C,0x2D,0x78,0x45,0x43,0x68,0x18, + 0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A, + 0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A, + 0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42, + 0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E, + 0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x9C,0x94,0x00,0x00,0xF0,0xB5,0x58,0x49,0x8D,0xB0,0x0F,0x78, + 0x55,0x4D,0x05,0x97,0x48,0x78,0x04,0x90,0x06,0x90,0x28,0x00,0x20,0x30,0x0C,0x90, + 0x00,0x7A,0xC2,0x07,0x0B,0xD0,0x80,0x07,0x03,0xD5,0x78,0x1E,0x03,0x22,0x05,0x90, + 0x03,0xE0,0x04,0x98,0x40,0x1E,0x00,0x22,0x04,0x90,0x0C,0x98,0x82,0x72,0x88,0x8B, + 0x0A,0x22,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90,0xC8,0x8B,0x50,0x43,0x00,0x04, + 0x00,0x0C,0x00,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0,0x04,0x98,0x00,0x28,0x7E,0xD0, + 0x05,0x98,0x41,0x00,0x01,0x98,0xFD,0xF7,0x2F,0xFF,0x06,0x04,0x36,0x0C,0x00,0x24, + 0xBF,0x1C,0x0A,0xE0,0x01,0x98,0x05,0x99,0x60,0x43,0xFD,0xF7,0x25,0xFF,0x3C,0x4A, + 0x61,0x00,0x80,0x19,0x89,0x18,0x64,0x1C,0x48,0x84,0xBC,0x42,0xF2,0xDB,0x04,0x98, + 0x41,0x00,0x00,0x98,0xFD,0xF7,0x18,0xFF,0x07,0x04,0x06,0x98,0x3F,0x0C,0x00,0x24, + 0x80,0x1C,0x0B,0x90,0x0C,0xE0,0x00,0x98,0x04,0x99,0x60,0x43,0xFD,0xF7,0x0C,0xFF, + 0x2F,0x4A,0xC1,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0xC1,0x82,0x0B,0x98,0x64,0x1C, + 0x84,0x42,0xF0,0xDB,0x0C,0x98,0x00,0x7A,0xC0,0x07,0x48,0xD0,0x00,0x24,0x40,0xE0, + 0x28,0x19,0x20,0x30,0xC1,0x7B,0x0C,0x98,0x00,0x7A,0x80,0x07,0x03,0xD5,0x05,0x98, + 0x02,0x96,0x03,0x91,0x03,0xE0,0x08,0x00,0x04,0x99,0x02,0x97,0x03,0x91,0x20,0x49, + 0x40,0x00,0x40,0x18,0x0A,0x90,0x40,0x8C,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xE4,0xFE, + 0xE1,0x00,0x09,0x91,0x49,0x19,0x08,0x91,0x88,0x80,0x03,0x98,0x18,0x49,0x40,0x00, + 0x40,0x18,0x40,0x30,0x07,0x90,0xC0,0x8A,0x0A,0x21,0xC0,0x1B,0xFD,0xF7,0xD4,0xFE, + 0x09,0x99,0x68,0x52,0x0A,0x98,0x0A,0x21,0x40,0x8C,0x80,0x19,0xFE,0xF7,0x2E,0xF8, + 0x08,0x99,0xC8,0x80,0x07,0x98,0x0A,0x21,0xC0,0x8A,0xC0,0x19,0xFE,0xF7,0x26,0xF8, + 0x08,0x99,0x48,0x80,0x02,0x98,0x0A,0x21,0x40,0x00,0xFE,0xF7,0x1F,0xF8,0x64,0x1C, + 0xA8,0x85,0x0C,0x98,0x40,0x7A,0x00,0xE0,0x01,0xE0,0xA0,0x42,0xB8,0xDC,0x0D,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA4,0x06,0x00,0x20,0x9C,0x94,0x00,0x00, + 0x40,0x00,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0xB5,0x22,0x10,0xB5,0x07,0x49,0x08,0x48,0x92,0x00,0xFE,0xF7,0x05,0xF8,0x07,0x48, + 0x07,0x4A,0x80,0x8F,0x01,0x04,0x01,0x43,0x06,0x48,0xFE,0xF7,0x0F,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xC0,0x9C,0x00,0x00,0x00,0x00,0x10,0x40,0x9C,0x94,0x00,0x00, + 0xA4,0x05,0x00,0x00,0xD4,0x02,0x10,0x40,0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22, + 0xFD,0xF7,0xDA,0xFF,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32,0xFD,0xF7,0xD4,0xFF, + 0x71,0x22,0x08,0x49,0x08,0x48,0xD2,0x00,0xFD,0xF7,0xCE,0xFF,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xC4,0x95,0x00,0x00,0x04,0x90,0x00,0x40,0xC0,0x96,0x00,0x00, + 0x00,0xA0,0x00,0x40,0xC0,0x98,0x00,0x00,0x78,0x08,0x10,0x40,0x01,0x49,0x00,0x20, + 0x88,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x01,0x49,0x01,0x20,0x88,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60, + 0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43, + 0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0, + 0x70,0x47,0x00,0x00,0x00,0x90,0x00,0x40,0xFE,0xB5,0x5A,0x48,0x5A,0x4F,0x00,0x68, + 0x00,0x25,0x60,0x30,0xC0,0x8A,0x2E,0x00,0x58,0x4C,0x00,0x90,0xF8,0x1D,0xF9,0x30, + 0x01,0x90,0x10,0xE0,0x0A,0x20,0x70,0x43,0xC0,0x19,0x7C,0x21,0x09,0x5C,0x00,0x29, + 0x07,0xD0,0x7E,0x30,0x01,0xF0,0x8A,0xF8,0x00,0x28,0x02,0xD0,0x6D,0x1C,0x2D,0x06, + 0x2D,0x0E,0x01,0x98,0x76,0x1C,0x40,0x7D,0xB0,0x42,0xEB,0xDC,0x0C,0x20,0x20,0x5E, + 0x00,0x28,0x04,0xD1,0xE1,0x89,0x00,0x29,0x01,0xD1,0x0A,0x00,0x11,0xE0,0x08,0x22, + 0xA2,0x5E,0x11,0x1A,0x00,0x29,0x00,0xDC,0x81,0x1A,0x0A,0x22,0x0E,0x23,0xA2,0x5E, + 0xE3,0x5E,0x09,0x04,0x09,0x0C,0xD0,0x1A,0x00,0x28,0x00,0xDC,0x98,0x1A,0x02,0x04, + 0x12,0x0C,0x20,0x7E,0x00,0x28,0x04,0xD0,0xE0,0x7E,0xC8,0x28,0x01,0xD2,0x40,0x1C, + 0xE0,0x76,0x38,0x48,0xA6,0x7C,0x00,0x68,0x03,0x00,0x80,0x30,0x07,0x7D,0xBE,0x42, + 0x04,0xD2,0x26,0x7D,0x00,0x2E,0x01,0xD0,0x01,0x26,0x66,0x75,0x46,0x88,0x8E,0x42, + 0x01,0xD3,0x96,0x42,0x04,0xD2,0xE6,0x7C,0xC8,0x2E,0x01,0xD2,0x76,0x1C,0xE6,0x74, + 0x02,0x2D,0x0C,0xD2,0x46,0x88,0x8E,0x42,0x09,0xD9,0x96,0x42,0x07,0xD9,0x17,0x26, + 0x0F,0x27,0xA6,0x57,0xC7,0x57,0xBE,0x42,0x09,0xDA,0x76,0x1C,0x06,0xE0,0x17,0x26, + 0x10,0x27,0xA6,0x57,0xC7,0x57,0xBE,0x42,0x01,0xDD,0x76,0x1E,0xE6,0x75,0xE6,0x7E, + 0x01,0x2E,0x02,0xD9,0x7E,0x21,0xC9,0x5A,0x19,0xE0,0x02,0x2D,0x18,0xD2,0x17,0x26, + 0x11,0x27,0xA6,0x57,0xC7,0x57,0xBE,0x42,0x12,0xDD,0xE6,0x7C,0x87,0x7B,0xBE,0x42, + 0x0E,0xD2,0x86,0x88,0x8E,0x42,0x02,0xD2,0xC7,0x88,0x8F,0x42,0x04,0xD8,0x96,0x42, + 0x06,0xD2,0xC1,0x88,0x91,0x42,0x03,0xD9,0x7E,0x21,0xC9,0x5A,0x49,0x42,0x21,0x82, + 0x00,0x21,0x02,0x2D,0xA1,0x76,0x13,0xD2,0x10,0x21,0x60,0x33,0x61,0x5E,0xDA,0x8B, + 0xD1,0x42,0x04,0xD1,0x61,0x7E,0xC8,0x29,0x01,0xD2,0x49,0x1C,0x61,0x76,0x61,0x7E, + 0x82,0x7C,0x91,0x42,0x04,0xD9,0xC0,0x7C,0x81,0x42,0x01,0xD2,0x01,0x20,0xA0,0x76, + 0x10,0x21,0x61,0x5E,0x00,0x98,0x09,0x18,0x08,0x00,0x48,0x43,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xE8,0x07,0x00,0x20,0x64,0x02,0x00,0x20,0x7E,0x03,0x00,0x20, + 0x78,0x47,0xC0,0x46,0xD1,0x00,0xA0,0xE3,0x01,0x00,0x50,0xE2,0xFD,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x10,0x00,0xA0,0xE3,0x01,0x00,0x50,0xE2, + 0xFD,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43, + 0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40,0x02,0x49,0xC8,0x69,0xCA,0x13,0x90,0x43, + 0xC8,0x61,0x70,0x47,0x00,0x70,0x00,0x40,0x10,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28, + 0x19,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0, + 0xB9,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2,0x00,0xF0,0x10,0xF8, + 0x01,0xE0,0x03,0xF0,0xB1,0xFB,0x02,0x20,0x04,0xF0,0x2C,0xFB,0x02,0x20,0x04,0xF0, + 0x17,0xFB,0x04,0xF0,0xBF,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0xF1,0xB5,0x4E,0x4F,0x2E,0x20,0x78,0x60,0x78,0x69,0x80,0x06,0xFC,0xD4,0x00,0x98, + 0x01,0x25,0x6D,0x07,0xE8,0x63,0xBC,0x69,0x78,0x68,0x80,0x07,0xFC,0xD5,0x03,0xF0, + 0x93,0xFB,0x04,0xF0,0xB5,0xFB,0x00,0x98,0x45,0x49,0xFF,0x26,0x00,0x22,0x01,0x23, + 0x18,0x28,0x5E,0xD0,0x12,0xDC,0x10,0x28,0x49,0xD0,0x08,0xDC,0x07,0x28,0x21,0xD0, + 0x0A,0x28,0x22,0xD0,0x0B,0x28,0x1A,0xD0,0x0E,0x28,0x2E,0xD0,0x1E,0xE0,0x11,0x28, + 0x1E,0xD0,0x14,0x28,0x41,0xD0,0x16,0x28,0x45,0xD0,0x17,0xE0,0x1D,0x28,0x62,0xD0, + 0x06,0xDC,0x19,0x28,0x4B,0xD0,0x1A,0x28,0x12,0xD0,0x1C,0x28,0x55,0xD0,0x0D,0xE0, + 0x1E,0x28,0x5A,0xD0,0x1F,0x28,0x48,0xD0,0x50,0x28,0x58,0xD0,0x06,0xE0,0x0B,0x20, + 0xE8,0x63,0x1F,0xE0,0x00,0xF0,0xD6,0xF8,0x00,0xE0,0xCC,0x60,0xEE,0x63,0x19,0xE0, + 0x00,0x20,0xC0,0x43,0x03,0x21,0x09,0x07,0xC8,0x60,0x01,0x20,0x40,0x03,0xFE,0xF7, + 0x75,0xF9,0x00,0x98,0xFE,0xF7,0xE8,0xF8,0x0C,0xE0,0x00,0x21,0xC9,0x43,0x03,0x20, + 0x00,0x07,0xC1,0x60,0x01,0x20,0x40,0x03,0xFE,0xF7,0x68,0xF9,0x00,0xF0,0x6C,0xFD, + 0x00,0xF0,0xD3,0xF8,0x78,0x68,0x78,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C, + 0x01,0xD0,0x4B,0x70,0xDA,0xE7,0x4A,0x70,0xD8,0xE7,0x00,0x2C,0x01,0xD0,0x8B,0x70, + 0xD4,0xE7,0x8A,0x70,0xD2,0xE7,0x00,0x2C,0x01,0xD0,0x0B,0x71,0xCE,0xE7,0x0A,0x71, + 0xCC,0xE7,0x00,0x2C,0x01,0xD0,0x4B,0x71,0xC8,0xE7,0x4A,0x71,0xC6,0xE7,0x00,0x2C, + 0x01,0xD0,0x8B,0x71,0xC2,0xE7,0x8A,0x71,0xC0,0xE7,0x00,0x2C,0x01,0xD0,0xCC,0x71, + 0x00,0xE0,0xCA,0x71,0x03,0xF0,0xFE,0xFE,0xB8,0xE7,0x00,0x2C,0x01,0xD0,0x0B,0x72, + 0xB4,0xE7,0x0A,0x72,0xB2,0xE7,0xCC,0x61,0xB0,0xE7,0x8C,0x61,0xAE,0xE7,0x03,0x2C, + 0x01,0xD9,0x4A,0x72,0xAA,0xE7,0x4C,0x72,0xA8,0xE7,0x00,0x00,0x00,0x40,0x00,0x30, + 0xF4,0x07,0x00,0x20,0xF0,0xB5,0x35,0x4D,0x32,0x4E,0x29,0x78,0x03,0x00,0x32,0x4F, + 0x0C,0x04,0x69,0x78,0x32,0x48,0xB2,0x6B,0x0C,0x43,0x29,0x00,0x30,0x3B,0x40,0x31, + 0x04,0xF0,0xC0,0xFB,0x12,0x48,0x0A,0x0C,0x0E,0x12,0x16,0x19,0x14,0x1B,0x1F,0x2D, + 0x38,0x12,0x3B,0x40,0x48,0x44,0x47,0x48,0xF2,0x6B,0x3B,0xE0,0x7A,0x69,0x39,0xE0, + 0xA8,0x8B,0x02,0x04,0xE8,0x8B,0x23,0xE0,0x22,0x00,0x33,0xE0,0xF2,0x68,0x31,0xE0, + 0x24,0x48,0x42,0x68,0x2E,0xE0,0x72,0x6B,0x2C,0xE0,0x20,0x48,0x20,0x30,0x42,0x7A, + 0x28,0xE0,0x21,0x48,0x82,0x7C,0x48,0x79,0x89,0x79,0xC3,0x07,0xDB,0x09,0x80,0x07, + 0x09,0x04,0xC0,0x0F,0x00,0x02,0x1A,0x43,0x01,0x43,0x0A,0x43,0x1A,0xE0,0x88,0x7A, + 0x4A,0x7B,0x00,0x06,0x02,0x43,0xC8,0x7A,0x09,0x7B,0x00,0x04,0x09,0x02,0x08,0x43, + 0x02,0x43,0x0F,0xE0,0x88,0x7B,0x02,0x06,0x0C,0xE0,0x14,0x48,0x00,0x69,0xC2,0x07, + 0xD2,0x0F,0x07,0xE0,0x00,0x69,0x40,0x08,0x02,0x02,0x03,0xE0,0x00,0x69,0x42,0x08, + 0x00,0xE0,0x3A,0x69,0x0E,0x49,0xCA,0x61,0x5F,0x22,0x48,0x69,0x10,0x42,0xFC,0xD1, + 0x03,0xF0,0xA2,0xFA,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xC0,0x9F,0x00,0x00,0xF4,0x07,0x00,0x20,0x9C,0x94,0x00,0x00, + 0x00,0x20,0x00,0x40,0xC0,0x91,0x00,0x00,0xC0,0x06,0x00,0x20,0xC0,0x95,0x00,0x00, + 0x00,0x40,0x00,0x30,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43, + 0xE0,0x60,0xFE,0xF7,0xB3,0xF8,0x06,0x00,0xC3,0x20,0xC0,0x01,0xFE,0xF7,0x9E,0xF8, + 0x02,0xF0,0xB8,0xFF,0x00,0xF0,0xCA,0xFC,0x02,0xF0,0xAA,0xFF,0x30,0x00,0xFE,0xF7, + 0xB9,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21,0x10,0xB5, + 0xC0,0x43,0x09,0x07,0xC8,0x60,0x02,0xF0,0xA5,0xFF,0xFF,0xF7,0xAD,0xFD,0xFF,0xF7, + 0xB3,0xFD,0x01,0x20,0x40,0x07,0x04,0xF0,0x1A,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xF0,0xB5,0x00,0x20,0x87,0xB0,0x01,0x90,0x00,0x90,0x5A,0x48,0x57,0x4C,0x00,0x68, + 0x57,0x4D,0x00,0x68,0xC0,0x06,0x75,0xD5,0xE0,0x1D,0xF9,0x30,0x06,0x90,0x02,0x7D, + 0x40,0x7D,0x01,0x21,0x82,0x42,0x00,0xD1,0x00,0x21,0x29,0x71,0x28,0x79,0x00,0x28, + 0x08,0xD0,0x06,0x98,0x00,0x7D,0x01,0x28,0x04,0xD1,0x21,0x88,0xE9,0x80,0x60,0x88, + 0x28,0x81,0x03,0xE0,0x06,0x98,0x00,0x7D,0x00,0x28,0x5B,0xD0,0x06,0x98,0x40,0x7D, + 0x00,0x28,0x57,0xD0,0x00,0x20,0x6E,0xE0,0x06,0x99,0x03,0x9F,0x4B,0x7D,0x0A,0x21, + 0x4F,0x43,0x00,0x20,0x3E,0x19,0x62,0xE0,0x0A,0x22,0x42,0x43,0x12,0x19,0x60,0x32, + 0x31,0x79,0x12,0x7F,0x91,0x42,0x59,0xD1,0x0A,0x21,0x48,0x43,0x01,0x19,0xE2,0x5F, + 0x60,0x31,0x18,0x20,0x05,0x91,0x04,0x91,0x08,0x5E,0x1A,0x23,0xCB,0x5E,0x10,0x1A, + 0x02,0x22,0xB2,0x5E,0xD1,0x1A,0x02,0x91,0x04,0x99,0x0A,0x8B,0xE1,0x5B,0xFF,0xF7, + 0xBB,0xFA,0xE0,0x53,0x04,0x99,0x02,0x98,0x4A,0x8B,0x71,0x88,0xFF,0xF7,0xB4,0xFA, + 0x00,0x04,0x00,0x14,0x70,0x80,0xE1,0x5F,0xFF,0x22,0xE1,0x32,0x91,0x42,0x38,0xDA, + 0x19,0x22,0x52,0x01,0x90,0x42,0x34,0xDA,0x06,0x9A,0x12,0x7D,0x01,0x2A,0x0D,0xD1, + 0x06,0x22,0xAA,0x5E,0x52,0x1A,0x0C,0x32,0x18,0x2A,0x05,0xD8,0x08,0x22,0xAA,0x5E, + 0x12,0x1A,0x0C,0x32,0x18,0x2A,0x01,0xD9,0x00,0x20,0x1D,0xE0,0x0A,0x00,0xFF,0x23, + 0x25,0x3A,0x98,0x33,0x9A,0x42,0x06,0xD3,0x1F,0x4A,0x90,0x42,0x03,0xDD,0x01,0x22, + 0x00,0x92,0x03,0xE0,0x2E,0xE0,0x00,0x9A,0x00,0x2A,0x12,0xD0,0x05,0x9B,0x18,0x22, + 0x9A,0x5E,0x51,0x1A,0x09,0x31,0x12,0x29,0x0B,0xD8,0x1A,0x21,0x59,0x5E,0x08,0x1A, + 0x00,0x1D,0x08,0x28,0x05,0xD8,0x01,0x20,0x01,0x90,0x02,0xE0,0x40,0x1C,0x83,0x42, + 0x9A,0xDC,0x03,0x98,0x40,0x1C,0x03,0x90,0x06,0x98,0x03,0x99,0x00,0x7D,0x88,0x42, + 0x8A,0xDC,0x01,0x98,0x00,0x28,0x08,0xD0,0x0C,0x48,0xFF,0x21,0x40,0x89,0x91,0x31, + 0x88,0x42,0x02,0xD2,0x28,0x68,0x40,0x1C,0x03,0xE0,0x28,0x68,0x00,0x28,0x01,0xD0, + 0x40,0x1E,0x28,0x60,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x64,0x02,0x00,0x20, + 0xDC,0x07,0x00,0x20,0xE8,0x07,0x00,0x20,0xAB,0x02,0x00,0x00,0x40,0x00,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xA9,0xB0,0x0E,0x90,0x0D,0x90,0x0C,0x90,0xFF,0x4B,0x0B,0x90, + 0x1A,0x68,0x10,0x00,0x80,0x30,0x41,0x7F,0x80,0x7F,0x09,0x90,0x10,0x00,0xA0,0x30, + 0xC4,0x7A,0x08,0x94,0x84,0x7A,0x07,0x94,0xF9,0x4C,0x05,0x94,0xFF,0x3C,0x1B,0x3C, + 0x04,0x94,0x12,0x68,0x12,0x07,0x25,0xD5,0x02,0x78,0x4A,0x43,0x23,0x92,0x42,0x78, + 0x4A,0x43,0x22,0x92,0x82,0x78,0x4A,0x43,0x21,0x92,0xC2,0x78,0x4A,0x43,0x20,0x92, + 0x02,0x79,0x4A,0x43,0x1F,0x92,0x42,0x79,0x4A,0x43,0x1E,0x92,0x82,0x79,0x4A,0x43, + 0x1D,0x92,0xC2,0x79,0x4A,0x43,0x1C,0x92,0x02,0x7A,0x4A,0x43,0x1B,0x92,0x40,0x7A, + 0x48,0x43,0x1A,0x90,0xE0,0x1D,0xF9,0x30,0x28,0x90,0x00,0x7D,0x00,0x28,0x05,0xD1, + 0xFF,0xF7,0x58,0xF9,0x29,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x24,0x90, + 0xE0,0x48,0x27,0x90,0x24,0x99,0x04,0x98,0x04,0x9A,0x41,0x18,0xFC,0x20,0x08,0x56, + 0x0A,0x21,0x41,0x43,0x8D,0x18,0x0A,0x3D,0x00,0x28,0x0B,0xD0,0x08,0x98,0x00,0x28, + 0x04,0xD1,0xA8,0x1D,0x00,0xF0,0x3A,0xFD,0x00,0x28,0x03,0xD0,0x05,0x98,0x80,0x7E, + 0x00,0x28,0x03,0xD0,0x24,0x98,0xFF,0xF7,0x41,0xF9,0x3F,0xE2,0x24,0x98,0x34,0x21, + 0x48,0x43,0xD0,0x49,0xE0,0x39,0x40,0x18,0xCF,0x49,0x44,0x18,0x07,0x20,0x81,0x00, + 0x09,0x19,0x8A,0x88,0x40,0x1E,0x0A,0x81,0xCA,0x88,0x4A,0x81,0xF7,0xD5,0xCB,0x48, + 0x00,0x22,0x81,0x8B,0xAA,0x5E,0x49,0x1E,0x8A,0x42,0xE6,0xDC,0xC0,0x8B,0x02,0x21, + 0x69,0x5E,0x40,0x1E,0x81,0x42,0xE0,0xDC,0x28,0x88,0x01,0x23,0xDB,0x02,0xA0,0x80, + 0x68,0x88,0x9C,0x46,0xE0,0x80,0x00,0x20,0x02,0x00,0x07,0x21,0x06,0x90,0x88,0x00, + 0x00,0x19,0x04,0x26,0x86,0x5F,0x00,0x2E,0x08,0xDD,0x06,0x9F,0xBE,0x42,0x01,0xDD, + 0x87,0x88,0x06,0x97,0x66,0x45,0x01,0xDA,0x86,0x88,0xB4,0x46,0x06,0x26,0x86,0x5F, + 0x00,0x2E,0x05,0xDD,0x96,0x42,0x00,0xDD,0xC2,0x88,0x9E,0x42,0x00,0xDA,0xC3,0x88, + 0x49,0x1E,0xE4,0xD5,0x06,0x99,0x60,0x46,0x0E,0x1A,0xAC,0x48,0x01,0x68,0x80,0x20, + 0x40,0x5A,0x86,0x42,0x02,0xDC,0xD7,0x1A,0x87,0x42,0x02,0xDD,0x05,0x9F,0x01,0x20, + 0x38,0x76,0xA0,0x31,0x48,0x8B,0x86,0x42,0x04,0xDA,0xD1,0x1A,0x81,0x42,0x01,0xDA, + 0x01,0x20,0x00,0xE0,0x00,0x20,0x27,0x99,0x26,0x00,0x20,0x36,0x08,0x74,0x30,0x7A, + 0x01,0x28,0x15,0xD9,0x04,0x22,0x08,0x21,0xA2,0x5E,0x61,0x5E,0x50,0x1A,0x00,0x28, + 0x00,0xDC,0x88,0x1A,0x00,0x04,0x00,0x14,0x0A,0x90,0x06,0x20,0x0A,0x22,0x20,0x5E, + 0xA2,0x5E,0x81,0x1A,0x00,0x29,0x00,0xDC,0x11,0x1A,0x0F,0x04,0x3F,0x14,0x01,0xE0, + 0x64,0x27,0x0A,0x97,0x08,0x21,0x04,0x20,0x61,0x5E,0x20,0x5E,0x03,0xF0,0xD0,0xF8, + 0x10,0x90,0x0A,0x21,0x06,0x20,0x61,0x5E,0x20,0x5E,0x03,0xF0,0xC9,0xF8,0x0F,0x90, + 0x0C,0x21,0x61,0x5E,0x10,0x98,0x03,0xF0,0xC3,0xF8,0x12,0x90,0x0E,0x21,0x61,0x5E, + 0x0F,0x98,0x03,0xF0,0xBD,0xF8,0x11,0x90,0x14,0x22,0x10,0x21,0xA2,0x5E,0x61,0x5E, + 0x12,0x98,0x03,0xF0,0xBB,0xF8,0x00,0x04,0x00,0x14,0x14,0x90,0x16,0x22,0x12,0x21, + 0xA2,0x5E,0x61,0x5E,0x11,0x98,0x03,0xF0,0xB1,0xF8,0x00,0x04,0x00,0x14,0x13,0x90, + 0x1C,0x22,0x18,0x21,0xA2,0x5E,0x61,0x5E,0x14,0x98,0x03,0xF0,0xA7,0xF8,0x00,0x04, + 0x00,0x14,0x16,0x90,0x1E,0x22,0x1A,0x21,0xA2,0x5E,0x61,0x5E,0x13,0x98,0x03,0xF0, + 0x9D,0xF8,0x00,0x04,0x00,0x14,0x15,0x90,0x24,0x22,0x20,0x21,0xA2,0x5E,0x61,0x5E, + 0x16,0x98,0x03,0xF0,0x93,0xF8,0x00,0x04,0x00,0x14,0x18,0x90,0x26,0x22,0x22,0x21, + 0xA2,0x5E,0x61,0x5E,0x15,0x98,0x03,0xF0,0x89,0xF8,0x00,0x04,0x00,0x14,0x17,0x90, + 0x0A,0x98,0x39,0x00,0x00,0xF0,0xFA,0xFE,0x02,0x00,0x01,0x20,0x41,0x00,0x09,0x19, + 0xCB,0x8D,0x40,0x1E,0x0B,0x86,0xF9,0xD5,0xE2,0x85,0x70,0x7B,0x00,0x22,0x01,0x1E, + 0x06,0xDB,0x43,0x00,0x1F,0x19,0x2E,0x23,0xFB,0x5E,0x9A,0x18,0x40,0x1E,0xF8,0xD5, + 0x49,0x1C,0x10,0x00,0xFD,0xF7,0xB0,0xF9,0x22,0x99,0x07,0x00,0x88,0x42,0x01,0xDC, + 0x01,0x20,0x0F,0xE0,0x20,0x98,0x87,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x1E,0x98, + 0x87,0x42,0x01,0xDC,0x03,0x20,0x05,0xE0,0x1C,0x98,0x87,0x42,0x01,0xDC,0x04,0x20, + 0x00,0xE0,0x05,0x20,0x31,0x7B,0x09,0x9A,0x40,0x1A,0x52,0x42,0x00,0x28,0x08,0xDD, + 0x2A,0x20,0x20,0x5E,0x09,0x9B,0x98,0x42,0x01,0xD1,0x00,0x20,0x08,0xE0,0x40,0x1C, + 0x06,0xE0,0x00,0x28,0x4A,0x48,0x20,0x5E,0x04,0xDA,0x90,0x42,0xF5,0xD0,0x40,0x1E, + 0x60,0x85,0x02,0xE0,0x00,0x28,0xFA,0xDC,0xF1,0xDB,0x2A,0x20,0x20,0x5E,0x09,0x9B, + 0x98,0x42,0x03,0xD1,0x05,0x29,0x01,0xD2,0x49,0x1C,0x04,0xE0,0x90,0x42,0x03,0xD1, + 0x01,0x29,0x01,0xD9,0x49,0x1E,0x31,0x73,0x17,0xA8,0x05,0xC8,0x19,0x90,0x30,0x7A, + 0x01,0x00,0x26,0x90,0x25,0x90,0x10,0x00,0xFD,0xF7,0x66,0xF9,0x0C,0x90,0x0E,0x90, + 0x25,0x99,0x19,0x98,0xFD,0xF7,0x60,0xF9,0x0D,0x90,0x0B,0x90,0x30,0x7B,0x01,0x28, + 0x23,0xD1,0x0B,0xAA,0x0C,0xA9,0x6B,0x46,0x06,0xC3,0x17,0x9B,0x18,0x9A,0x26,0x98, + 0x09,0x21,0x03,0xF0,0xF3,0xFB,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0,0x30,0x7A, + 0x15,0x9B,0x16,0x9A,0x07,0x21,0x03,0xF0,0xE9,0xFB,0x2C,0x22,0x6B,0x46,0x9A,0x5E, + 0x30,0x21,0x34,0x20,0x59,0x5E,0x18,0x5E,0x03,0x92,0x01,0xAA,0x03,0xC2,0x38,0x22, + 0x9A,0x5E,0x22,0x9B,0x00,0x92,0x23,0x9A,0x96,0xE0,0x02,0x28,0x23,0xD1,0x0B,0xAA, + 0x0C,0xA9,0x6B,0x46,0x06,0xC3,0x15,0x9B,0x16,0x9A,0x26,0x98,0x07,0x21,0x03,0xF0, + 0xCD,0xFB,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0,0x30,0x7A,0x13,0x9B,0x14,0x9A, + 0x05,0x21,0x03,0xF0,0xC3,0xFB,0x2C,0x22,0x6B,0x46,0x9A,0x5E,0x30,0x21,0x34,0x20, + 0x59,0x5E,0x18,0x5E,0x03,0x92,0x01,0xAA,0x03,0xC2,0x38,0x22,0x9A,0x5E,0x20,0x9B, + 0x00,0x92,0x21,0x9A,0x70,0xE0,0x03,0x28,0x30,0xD1,0x0B,0xAA,0x0C,0xA9,0x6B,0x46, + 0x06,0xC3,0x13,0x9B,0x14,0x9A,0x26,0x98,0x05,0x21,0x03,0xF0,0xA7,0xFB,0x0D,0xAA, + 0x0E,0xA9,0x68,0x46,0x06,0xC0,0x30,0x7A,0x03,0x21,0x0B,0xE0,0xE8,0x07,0x00,0x20, + 0x7E,0x03,0x00,0x20,0x20,0x01,0x00,0x20,0x5A,0x03,0x00,0x00,0x9C,0x94,0x00,0x00, + 0x2A,0x00,0x00,0x00,0x11,0x9B,0x12,0x9A,0x03,0xF0,0x90,0xFB,0x2C,0x22,0x6B,0x46, + 0x9A,0x5E,0x30,0x21,0x34,0x20,0x59,0x5E,0x18,0x5E,0x03,0x92,0x01,0xAA,0x03,0xC2, + 0x38,0x22,0x9A,0x5E,0x00,0x92,0x1E,0x9B,0x1F,0x9A,0x3D,0xE0,0x04,0x28,0x23,0xD1, + 0x0B,0xAA,0x0C,0xA9,0x68,0x46,0x06,0xC0,0x11,0x9B,0x12,0x9A,0x26,0x98,0x03,0x21, + 0x03,0xF0,0x74,0xFB,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0,0x30,0x7A,0x0F,0x9B, + 0x10,0x9A,0x02,0x21,0x03,0xF0,0x6A,0xFB,0x2C,0x22,0x6B,0x46,0x9A,0x5E,0x30,0x21, + 0x34,0x20,0x59,0x5E,0x18,0x5E,0x03,0x92,0x01,0xAA,0x03,0xC2,0x38,0x22,0x9A,0x5E, + 0x1C,0x9B,0x00,0x92,0x1D,0x9A,0x17,0xE0,0x0D,0xAA,0x0E,0xA9,0x68,0x46,0x06,0xC0, + 0x0F,0x9B,0x10,0x9A,0x26,0x98,0x02,0x21,0x03,0xF0,0x50,0xFB,0x06,0x20,0x6B,0x46, + 0x20,0x5E,0x34,0x22,0x38,0x21,0x9A,0x5E,0x59,0x5E,0x01,0xAB,0x07,0xC3,0x04,0x22, + 0xA2,0x5E,0x1A,0x9B,0x00,0x92,0x1B,0x9A,0x39,0x00,0x28,0x00,0x03,0xF0,0x52,0xFB, + 0x30,0x7A,0x09,0x28,0x01,0xD2,0x40,0x1C,0x30,0x72,0x70,0x7B,0x02,0x28,0x01,0xD2, + 0x40,0x1C,0x70,0x73,0x28,0x79,0x34,0x21,0x40,0x1E,0x48,0x43,0x32,0x49,0x40,0x18, + 0x32,0x49,0x44,0x18,0x00,0x20,0x20,0x5E,0x00,0x28,0x23,0xDB,0x02,0x21,0x61,0x5E, + 0x00,0x29,0x1F,0xDB,0x07,0x9A,0x64,0x21,0x8E,0x1A,0x70,0x43,0xFD,0xF7,0x7C,0xF8, + 0x07,0x00,0x00,0x20,0x28,0x5E,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x74,0xF8, + 0x38,0x18,0x28,0x80,0x02,0x20,0x20,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x6C,0xF8, + 0x06,0x00,0x02,0x20,0x28,0x5E,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x64,0xF8, + 0x30,0x18,0x68,0x80,0x28,0x88,0x20,0x80,0x68,0x88,0x60,0x80,0x24,0x98,0x40,0x1C, + 0x0C,0x28,0x24,0x90,0x00,0xDA,0x9D,0xE5,0x28,0x98,0x00,0x7D,0x01,0x28,0x18,0xD1, + 0x04,0x98,0x34,0x21,0x00,0x79,0x48,0x43,0x13,0x49,0x40,0x18,0x13,0x49,0x34,0x39, + 0x40,0x18,0x82,0x88,0x05,0x99,0x0A,0x81,0xC2,0x88,0x4A,0x81,0x02,0x89,0x05,0x99, + 0x8A,0x81,0x40,0x89,0xC8,0x81,0x04,0x99,0x05,0x98,0x0A,0x88,0x02,0x80,0x49,0x88, + 0x41,0x80,0x28,0x98,0x00,0x7D,0x02,0x28,0x00,0xD0,0x73,0xE5,0x04,0x99,0x05,0x98, + 0x0A,0x88,0x02,0x80,0x49,0x88,0x41,0x80,0x04,0x99,0x05,0x98,0x4A,0x89,0x82,0x80, + 0x89,0x89,0xC1,0x80,0x66,0xE5,0x00,0x00,0x40,0x00,0x00,0x20,0x5A,0x03,0x00,0x00, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0xFF,0x20,0xFD,0xF7,0x00,0xFD, + 0x03,0x25,0x0F,0x4E,0x2D,0x07,0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B, + 0xE9,0x68,0x80,0x08,0x3C,0x00,0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42, + 0x00,0xD0,0x34,0x63,0x81,0x00,0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x03,0xF0, + 0x56,0xFF,0xE8,0x68,0xA0,0x43,0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x00,0x00,0x30,0x0C,0x71,0x00,0x00,0xF8,0xB5,0x1D,0x4A,0x93,0x8F,0x40,0x32, + 0x54,0x79,0xE4,0x07,0x32,0xD0,0x14,0x89,0x1A,0x4A,0x92,0x7C,0x96,0x46,0x1A,0x4A, + 0x16,0x78,0x17,0x4A,0x40,0x32,0x95,0x7A,0x00,0x2E,0x76,0x46,0xAC,0x46,0xD5,0x7A, + 0x00,0x95,0x15,0x7B,0x57,0x7B,0x92,0x7B,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45, + 0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0, + 0x8A,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7, + 0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42, + 0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x82,0x42,0xF0,0xD1,0xEB,0xE7,0x18,0x00,0xEA,0xE7, + 0x9C,0x94,0x00,0x00,0xC0,0x06,0x00,0x20,0xF4,0x07,0x00,0x20,0x70,0x47,0x00,0x00, + 0x04,0x4A,0x03,0x4B,0x12,0x78,0x42,0x43,0x50,0x18,0x40,0x00,0x18,0x5A,0x70,0x47, + 0x00,0x00,0x10,0x40,0x9C,0x94,0x00,0x00,0x70,0xB5,0x28,0x49,0x00,0x20,0x4A,0x78, + 0x27,0x49,0x00,0x2A,0x14,0xD1,0x0A,0x89,0x00,0x2A,0x0E,0xD0,0x25,0x49,0x8A,0x42, + 0x0B,0xD0,0x10,0x00,0x64,0x21,0x48,0x43,0xFD,0xF7,0xF8,0xF8,0x22,0x49,0x40,0x18, + 0xE1,0x21,0x89,0x00,0x88,0x42,0x00,0xD9,0x08,0x00,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x88,0x89,0x1A,0x49,0x40,0x39,0x4A,0x7F,0x19,0x49,0x89,0x89,0xFF,0x39,0x60,0x39, + 0x01,0x2A,0x0F,0xD1,0x18,0x4A,0x7D,0x25,0x63,0x32,0xED,0x00,0x91,0x42,0x04,0xD8, + 0x2C,0x1A,0x20,0x00,0x60,0x43,0x56,0x1C,0x0D,0xE0,0xA8,0x42,0xE5,0xD9,0x03,0x21, + 0x40,0x1B,0x17,0xE0,0x10,0x4A,0x11,0x4D,0xC7,0x32,0x91,0x42,0x0C,0xD8,0x2C,0x1A, + 0x20,0x00,0x60,0x43,0x56,0x1C,0x31,0x00,0xFD,0xF7,0xC8,0xF8,0x60,0x43,0x31,0x00, + 0xFD,0xF7,0xC4,0xF8,0x28,0x1A,0xD0,0xE7,0xA8,0x42,0xCE,0xD9,0x07,0x4A,0x03,0x21, + 0x52,0x42,0x80,0x18,0xFD,0xF7,0xBA,0xF8,0x40,0x19,0xC6,0xE7,0x00,0x07,0x00,0x20, + 0x40,0x00,0x00,0x20,0xFF,0x0F,0x00,0x00,0x26,0x02,0x00,0x00,0x4C,0x04,0x00,0x00, + 0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06, + 0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x70,0xB5,0x12,0x4D,0x00,0x24,0x01,0x21, + 0x49,0x07,0x68,0x69,0x80,0x06,0xFC,0xD4,0xE8,0x68,0x6A,0x68,0x6A,0x60,0x05,0xE0, + 0x6A,0x69,0x92,0x06,0xFC,0xD4,0xAA,0x69,0x04,0xC1,0xA4,0x18,0x02,0x00,0x40,0x1E, + 0x01,0x2A,0xF5,0xD8,0x2E,0x20,0x68,0x60,0x68,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0xBB,0xFD,0x05,0x48,0xE8,0x61,0xEC,0x61,0x68,0x69,0x80,0x06,0xFC,0xD4,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0xAB,0xFC,0xFF,0x8F,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0xAE,0x0A,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0xA5,0x0A,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0x03,0x22,0x12,0x07, + 0xD3,0x68,0x01,0x21,0x81,0x40,0x0B,0x43,0xD3,0x60,0x50,0x68,0x08,0x42,0x01,0xD0, + 0x01,0x48,0x01,0x63,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x30,0x03,0x23,0x1B,0x07, + 0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24, + 0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20, + 0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30, + 0x00,0xB5,0xFF,0xF7,0xE3,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xF8,0xB5,0x2A,0x4C, + 0x02,0xF0,0x5C,0xFA,0x00,0xF0,0xF8,0xF9,0x01,0xF0,0xD6,0xFC,0x03,0xF0,0x90,0xFA, + 0x02,0xF0,0x30,0xFB,0x00,0xF0,0x3A,0xFF,0x00,0xF0,0x34,0xFC,0xFE,0xF7,0x0C,0xF9, + 0xFD,0xF7,0x60,0xFB,0x19,0x20,0x40,0x01,0x20,0x18,0xC0,0x7E,0x00,0x25,0x26,0x00, + 0x00,0x28,0x04,0xD0,0x1D,0x20,0x80,0x01,0x20,0x18,0x85,0x73,0x30,0xE0,0x1B,0x48, + 0x00,0x68,0xA0,0x30,0x40,0x7B,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x51,0xFB,0xFF,0xF7, + 0x8F,0xFA,0x03,0xE0,0xFF,0xF7,0x8C,0xFA,0xFF,0xF7,0x4A,0xFB,0x02,0xF0,0xD6,0xFE, + 0x02,0xF0,0x44,0xFD,0x03,0xF0,0xAE,0xFA,0xFE,0xF7,0x48,0xFB,0x07,0x00,0x02,0xF0, + 0x13,0xFD,0x37,0x20,0x40,0x01,0x20,0x18,0x81,0x7F,0x38,0x00,0xFD,0xF7,0xEA,0xF8, + 0x00,0xF0,0x3A,0xF8,0xFD,0xF7,0x32,0xF8,0x0F,0x20,0xC0,0x01,0x20,0x18,0xC1,0x69, + 0x32,0x29,0x03,0xD9,0x06,0x49,0xC5,0x61,0x01,0x20,0x08,0x70,0x02,0xF0,0xC4,0xF9, + 0x70,0x79,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0xE8,0x07,0x00,0x20, + 0x19,0x08,0x00,0x20,0x70,0xB5,0x02,0xF0,0xF5,0xF9,0x03,0xF0,0x11,0xFB,0x03,0xF0, + 0xF3,0xFA,0x03,0xF0,0x1B,0xFA,0x02,0xF0,0x5F,0xFF,0x09,0x48,0x00,0x21,0x00,0x78, + 0x03,0xF0,0x4C,0xFB,0x07,0x4C,0x00,0x25,0x25,0x70,0x02,0xF0,0x55,0xFA,0xFE,0xF7, + 0x0F,0xFB,0x20,0x78,0x00,0x28,0xF7,0xD0,0x02,0xF0,0x96,0xF8,0xF4,0xE7,0x00,0x00, + 0x1C,0x95,0x00,0x00,0x18,0x08,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8D,0xB0,0x0C,0x90, + 0x44,0x48,0xD9,0x21,0xC9,0x00,0x44,0x18,0xE3,0x21,0xC9,0x00,0x45,0x18,0x30,0x22, + 0x00,0x21,0x68,0x46,0xFC,0xF7,0x7E,0xFF,0x28,0x00,0x20,0x30,0x07,0x00,0x80,0x7D, + 0x3D,0x4E,0x00,0x28,0x0B,0xD1,0xB0,0x7D,0x00,0x28,0x6F,0xD1,0x20,0x00,0x0C,0x22, + 0x00,0x21,0x38,0x30,0xFC,0xF7,0x6E,0xFF,0xB8,0x7D,0x00,0x28,0x66,0xD0,0xB0,0x7D, + 0x00,0x28,0x63,0xD0,0x00,0x22,0xA8,0x8E,0x00,0x23,0xD0,0x40,0xC0,0x07,0x34,0xD0, + 0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x21,0x66,0x18,0x38,0x27,0xF7,0x57,0x87,0x42, + 0x01,0xD1,0x4B,0x1C,0x02,0xE0,0x49,0x1C,0x0C,0x29,0xF5,0xD3,0x00,0x2B,0x03,0xD0, + 0x49,0x1C,0x08,0x06,0x00,0x0E,0x0C,0xE0,0x00,0x21,0x63,0x18,0x20,0x33,0x1B,0x7E, + 0x00,0x2B,0x03,0xD1,0x63,0x18,0x20,0x33,0x18,0x76,0xF1,0xE7,0x49,0x1C,0x0C,0x29, + 0xF3,0xD3,0x41,0x1E,0x01,0x23,0x8B,0x40,0x0C,0x99,0x86,0x00,0x0B,0x43,0x19,0x04, + 0x09,0x0C,0x0C,0x91,0x91,0x00,0x49,0x19,0x49,0x68,0x6B,0x46,0xF3,0x18,0x09,0x01, + 0x40,0x3B,0x09,0x09,0x00,0x07,0x01,0x43,0xD9,0x63,0x52,0x1C,0x0C,0x2A,0xC2,0xD3, + 0x00,0x21,0x0B,0x00,0xA8,0x8E,0xC8,0x40,0xC0,0x07,0x0F,0xD1,0x48,0x1C,0x02,0x06, + 0x12,0x0E,0x01,0x20,0x26,0x18,0x38,0x27,0xF7,0x57,0x97,0x42,0x03,0xD1,0x20,0x18, + 0x20,0x30,0x03,0x76,0x02,0xE0,0x40,0x1C,0x0C,0x28,0xF3,0xD9,0x49,0x1C,0x0A,0x29, + 0xE8,0xD3,0x28,0x68,0x0C,0x99,0x80,0x0A,0x89,0x05,0x80,0x02,0x89,0x0D,0x08,0x43, + 0x28,0x60,0x30,0x22,0x28,0x1D,0x69,0x46,0xFC,0xF7,0x0A,0xFF,0x0D,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x28,0x07,0x00,0x20,0x18,0x49,0x10,0xB4, + 0x09,0x68,0x18,0x4A,0x60,0x31,0x8C,0x7E,0x53,0x7D,0x49,0x7E,0x00,0x2B,0x11,0xD1, + 0x93,0x7D,0x13,0x4A,0x12,0x68,0x80,0x32,0x01,0x2B,0x01,0xD1,0x52,0x7D,0x06,0xE0, + 0x02,0x2B,0x01,0xD1,0x92,0x7D,0x02,0xE0,0x03,0x2B,0x03,0xD1,0xD2,0x7D,0x51,0x18, + 0x09,0x06,0x09,0x0E,0x02,0x78,0x00,0x2A,0x08,0xD0,0x8A,0x42,0x06,0xD3,0x14,0x2A, + 0x09,0xD3,0x64,0x1C,0x14,0x21,0x4C,0x43,0xA2,0x42,0x02,0xD2,0x00,0x20,0x10,0xBC, + 0x70,0x47,0xF0,0x21,0x00,0xE0,0x13,0x21,0x01,0x70,0x01,0x20,0xF7,0xE7,0x00,0x00, + 0xE8,0x07,0x00,0x20,0x7E,0x03,0x00,0x20,0x10,0xB5,0x09,0x24,0x20,0x00,0xFE,0xF7, + 0x67,0xFB,0x64,0x1E,0xFA,0xD5,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF5,0x22,0x10,0xB5, + 0x05,0x48,0xD2,0x00,0x00,0x21,0xFC,0xF7,0xB5,0xFE,0x02,0xF0,0xE3,0xFE,0x00,0xF0, + 0xAD,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0x10,0xB5,0x07,0x4C, + 0x07,0x48,0x22,0x00,0x00,0x21,0xFC,0xF7,0xA5,0xFE,0x06,0x48,0x22,0x00,0x00,0x21, + 0xFC,0xF7,0xA0,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xD2,0x02,0x00,0x00, + 0x00,0x00,0x00,0x10,0x2A,0x08,0x00,0x20,0xFF,0x20,0x10,0xB5,0xC9,0x30,0xFD,0xF7, + 0xBD,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49, + 0x14,0x48,0x62,0x00,0xFC,0xF7,0xA2,0xFE,0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48, + 0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19,0xFC,0xF7,0x80,0xFE, + 0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48,0xA2,0x00,0xFC,0xF7,0x7F,0xFE,0x0A,0x48, + 0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19, + 0xFC,0xF7,0x68,0xFE,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00, + 0x84,0x74,0x00,0x00,0x40,0x00,0x00,0x20,0xBC,0x0A,0x00,0x00,0x40,0x00,0x00,0x20, + 0x70,0xB5,0x00,0xF0,0x5D,0xFA,0x0F,0x48,0x01,0x25,0x41,0x7A,0x0E,0x48,0x40,0x22, + 0x81,0x70,0x00,0x21,0x41,0x70,0xC1,0x70,0x01,0x71,0x41,0x71,0x81,0x71,0xC1,0x71, + 0x05,0x72,0x41,0x72,0x09,0x49,0xD4,0x05,0x81,0x61,0xC1,0x61,0x00,0x21,0x20,0x00, + 0xFC,0xF7,0x40,0xFE,0x06,0x48,0xA5,0x63,0x60,0x63,0xFF,0x20,0xE0,0x63,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0xC0,0x91,0x00,0x00,0xF4,0x07,0x00,0x20,0xFF,0xFF,0x00,0x00, + 0x40,0x00,0x00,0x20,0x33,0x21,0x09,0x05,0x01,0x20,0x80,0x07,0x41,0x62,0x04,0x49, + 0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00, + 0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x04,0x48,0x01,0x21,0x89,0x07,0xC8,0x61, + 0x03,0x49,0x04,0x48,0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0x5C,0x0A,0x00,0x00, + 0xDE,0x10,0x05,0x00,0x00,0x40,0x00,0x30,0x10,0xB5,0xFE,0xF7,0xE3,0xFA,0xFE,0xF7, + 0x73,0xFB,0xFE,0xF7,0x47,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x70,0xB5,0x0F,0x4C, + 0xFF,0xF7,0x54,0xFF,0x0E,0x48,0x00,0x7A,0x03,0xF0,0x78,0xF9,0xFE,0xF7,0x02,0xFB, + 0x0C,0x48,0x40,0x88,0x20,0x84,0x0C,0x48,0xFF,0x34,0x00,0x68,0xFF,0x34,0x40,0x30, + 0x40,0x7E,0x02,0x34,0x60,0x76,0xFF,0xF7,0x27,0xFF,0x00,0x25,0x25,0x74,0xFE,0xF7, + 0xFB,0xFC,0x06,0x48,0x05,0x70,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20, + 0xC0,0x91,0x00,0x00,0x1C,0x95,0x00,0x00,0xE8,0x07,0x00,0x20,0x19,0x08,0x00,0x20, + 0x10,0xB5,0xFF,0x20,0xFD,0xF7,0x2C,0xF9,0x01,0xF0,0xD2,0xFF,0x01,0xF0,0xCA,0xFF, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x10,0xB5,0xFE,0xF7,0x06,0xFF,0xFE,0xF7,0xFC,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x38,0xB5,0x03,0x24,0x13,0x25,0x20,0x02, + 0xFD,0xF7,0x08,0xF9,0x0B,0x48,0x0A,0x21,0x00,0x69,0xFC,0xF7,0x8F,0xFD,0x02,0x00, + 0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0,0x11,0xFA,0x06,0x4A, + 0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x03,0xF0,0x0A,0xFA,0x38,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x9C,0x94,0x00,0x00,0xE8,0xFD,0x00,0x00,0x00,0x22,0x10,0xB5, + 0x03,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x79,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x02,0x03,0x0F,0x0F,0x0A,0x48,0x10,0xB5,0x00,0x69,0x0A,0x49,0x0A,0x4C,0x88,0x42, + 0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7,0x61,0xFD,0x64,0x30,0x01,0xE0,0xFF,0x20, + 0xF5,0x30,0x20,0x62,0x03,0xF0,0x9A,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x9C,0x94,0x00,0x00,0x07,0xA5,0x07,0x00,0xF4,0x07,0x00,0x20,0x10,0xB5,0x00,0xF0, + 0xFD,0xF8,0xFF,0xF7,0xE9,0xFE,0xFF,0xF7,0xB9,0xFE,0xFF,0xF7,0x19,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x10,0xB5,0xFE,0xF7,0x7F,0xFD,0xFE,0xF7,0x59,0xFD,0xFE,0xF7, + 0x83,0xFD,0xFE,0xF7,0x79,0xFD,0xFE,0xF7,0x4B,0xFD,0x04,0x48,0x80,0x78,0xFC,0xF7, + 0xC1,0xFD,0x02,0xF0,0x77,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x9C,0x94,0x00,0x00, + 0x10,0xB5,0xFF,0xF7,0xC1,0xFE,0xFF,0xF7,0xB1,0xFF,0xFF,0xF7,0x8D,0xFF,0xFF,0xF7, + 0xB9,0xFF,0xFF,0xF7,0x80,0xFF,0xFF,0xF7,0x73,0xFF,0xFF,0xF7,0x1B,0xFF,0x02,0xF0, + 0x53,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0xF7,0xB5,0x86,0xB0,0x00,0x27,0x2F,0x48, + 0x04,0xAB,0x02,0x97,0x03,0x97,0x81,0xC3,0x2D,0x4E,0xFE,0xF7,0x1B,0xFD,0xFE,0xF7, + 0x93,0xFD,0x2C,0x48,0xC0,0x7F,0x01,0x90,0x2A,0x48,0x20,0x30,0x00,0x78,0x00,0x25, + 0x00,0x90,0x2C,0xE0,0x00,0x24,0x24,0xE0,0x21,0x00,0x28,0x00,0xFF,0xF7,0xA4,0xFB, + 0x00,0x28,0x1D,0xD0,0x23,0x49,0x04,0x9A,0x20,0x39,0x09,0x78,0x69,0x43,0x09,0x19, + 0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42, + 0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22, + 0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95,0x03,0x91, + 0x64,0x1C,0x14,0x48,0x20,0x38,0x00,0x78,0xA0,0x42,0xD5,0xD8,0x6D,0x1C,0x11,0x48, + 0x20,0x38,0x41,0x78,0xA9,0x42,0xCD,0xD8,0x08,0x99,0x03,0x98,0x08,0x60,0x0E,0x48, + 0x00,0x69,0xC0,0x07,0x05,0xD0,0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60, + 0x04,0xE0,0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x05,0x98,0x00,0x28, + 0x00,0xD0,0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xD4,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0xBC,0x94,0x00,0x00,0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46, + 0xA0,0xC0,0x9F,0xE5,0x00,0x00,0x9C,0xE5,0x9C,0x30,0x9F,0xE5,0x8C,0x06,0xD3,0xE5, + 0x01,0x1B,0x83,0xE2,0x99,0x1F,0x81,0xE2,0x01,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3, + 0x29,0x20,0xD1,0x15,0x00,0x00,0xA0,0x13,0x00,0x00,0x52,0x13,0x1E,0xFF,0x2F,0x91, + 0xF0,0x01,0x2D,0xE9,0x74,0x50,0x9F,0xE5,0x74,0x60,0x9F,0xE5,0x74,0x40,0x9F,0xE5, + 0x28,0x70,0xD1,0xE5,0x00,0x20,0x81,0xE0,0x2F,0x20,0xD2,0xE5,0x02,0x00,0x17,0xE3, + 0x2E,0x70,0xD1,0xE5,0x00,0x80,0xD5,0xE5,0x97,0x28,0x22,0x00,0x98,0x72,0x22,0x10, + 0x00,0x70,0xD6,0xE5,0x00,0x00,0x57,0xE3,0x04,0x00,0x00,0x1A,0x02,0x21,0x9C,0xE7, + 0x80,0x70,0x83,0xE0,0x02,0x29,0xC2,0xE3,0xB0,0x21,0xC7,0xE1,0x03,0x00,0x00,0xEA, + 0x82,0x20,0x84,0xE0,0xB0,0x20,0xD2,0xE1,0x80,0x70,0x83,0xE0,0xB0,0x21,0xC7,0xE1, + 0x29,0x20,0xD1,0xE5,0x01,0x00,0x80,0xE2,0x00,0x00,0x52,0xE1,0xE7,0xFF,0xFF,0x8A, + 0xF0,0x01,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0x40,0x00,0x00,0x20, + 0x9C,0x94,0x00,0x00,0x18,0x08,0x00,0x20,0x2A,0x08,0x00,0x20,0x06,0x4A,0x04,0x48, + 0x04,0x49,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0xB0,0x05,0x00,0x10,0xDC,0x72,0x00,0x00,0xA8,0x01,0x00,0x00,0x06,0x4A,0x04,0x48, + 0x04,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9,0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0x00,0x00,0x00,0x10,0xC8,0x71,0x00,0x00,0xEC,0x00,0x00,0x00,0x78,0x47,0xC0,0x46, + 0x01,0x00,0x50,0xE1,0x01,0x00,0xA0,0xB1,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9D,0xE5,0x01,0x00,0x50,0xE1,0x02,0x00,0x00,0xBA,0x02,0x00,0x50,0xE1, + 0x00,0x20,0xA0,0xA1,0x01,0x00,0x00,0xEA,0x02,0x00,0x51,0xE1,0x01,0x20,0xA0,0xA1, + 0x03,0x00,0x52,0xE1,0x02,0x00,0xA0,0xE1,0x03,0x00,0x00,0xBA,0x0C,0x00,0x50,0xE1, + 0x1E,0xFF,0x2F,0xA1,0x0C,0x00,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0x0C,0x00,0x53,0xE1, + 0xFB,0xFF,0xFF,0xBA,0x03,0x00,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0x10,0xB5,0xFF,0xF7, + 0xAD,0xFE,0xFF,0xF7,0xB7,0xFE,0xFF,0xF7,0xCB,0xFE,0x01,0xF0,0x95,0xFE,0xFF,0xF7, + 0x71,0xFC,0x10,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0x22,0x03,0xE0,0x03,0x78, + 0x40,0x1C,0x9A,0x18,0x49,0x1E,0x00,0x29,0xF9,0xDC,0x10,0x06,0x00,0x0E,0x70,0x47, + 0x10,0xB5,0x01,0x24,0x64,0x07,0x61,0x68,0x03,0x22,0x92,0x02,0x11,0x43,0x61,0x60, + 0x61,0x68,0x09,0x02,0x09,0x0A,0x61,0x60,0x81,0x00,0x20,0x1D,0xFF,0xF7,0xE5,0xFF, + 0x61,0x68,0x00,0x06,0x01,0x43,0x61,0x60,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x10,0xB5,0x11,0x4A,0x11,0x49,0x12,0x48,0xFC,0xF7,0xEE,0xFB,0x05,0x21,0x49,0x03, + 0x00,0x20,0xFC,0xF7,0x11,0xFC,0x0F,0x4B,0x0F,0x49,0x18,0x61,0x00,0x20,0xFC,0xF7, + 0x0B,0xFC,0x58,0x61,0x0D,0x49,0x0C,0x48,0xFC,0xF7,0x06,0xFC,0x59,0x69,0x00,0x04, + 0x08,0x43,0x58,0x61,0x0A,0x48,0xC1,0x6B,0x01,0x22,0x92,0x07,0x91,0x43,0xC1,0x63, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x28,0x00,0x00,0x00,0xB4,0x72,0x00,0x00, + 0x00,0x00,0x00,0x10,0xF4,0x07,0x00,0x20,0xC0,0x91,0x00,0x00,0xC0,0x9C,0x00,0x00, + 0x00,0x70,0x00,0x40,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0xE4,0x25,0x9F,0xE5, + 0xAD,0xDF,0x4D,0xE2,0x00,0x00,0x92,0xE5,0x00,0x50,0xA0,0xE3,0x5E,0x40,0xD0,0xE5, + 0xD4,0x05,0x9F,0xE5,0xD4,0x75,0x9F,0xE5,0x69,0x6F,0x80,0xE2,0x0C,0x00,0x8D,0xE5, + 0x01,0x0C,0x80,0xE2,0x22,0x00,0x80,0xE2,0x08,0x00,0x8D,0xE5,0x0C,0x00,0x9D,0xE5, + 0x85,0x0F,0x80,0xE2,0x04,0x00,0x8D,0xE5,0xB0,0x50,0xC0,0xE1,0xA8,0x05,0x9F,0xE5, + 0x00,0x10,0x92,0xE5,0xB8,0x00,0xD0,0xE1,0x4E,0x10,0xD1,0xE5,0x91,0x00,0x00,0xE0, + 0x97,0x10,0x80,0xE0,0xA0,0x12,0xA0,0xE1,0x04,0x00,0x9D,0xE5,0xB2,0x10,0xC0,0xE1, + 0x04,0x00,0x9D,0xE5,0xB2,0x10,0xD0,0xE1,0x00,0x00,0x92,0xE5,0x0C,0x20,0xA0,0xE3, + 0xB0,0x05,0xD0,0xE1,0x00,0x00,0x51,0xE1,0x04,0x10,0x9D,0x35,0xB2,0x00,0xC1,0x31, + 0x00,0x10,0xA0,0xE3,0x12,0x0E,0x8D,0xE2,0xC9,0xF1,0xFF,0xEB,0x69,0x20,0xA0,0xE3, + 0x01,0x2C,0x82,0xE2,0x00,0x10,0xA0,0xE3,0x4B,0x0F,0x8D,0xE2,0xC4,0xF1,0xFF,0xEB, + 0xCC,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x54,0x00,0x8D,0xE2,0xC0,0xF1,0xFF,0xEB, + 0x44,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x10,0x00,0x8D,0xE2,0xBC,0xF1,0xFF,0xEB, + 0xB0,0x56,0xC6,0xE1,0x0C,0x00,0x9D,0xE5,0xB8,0x00,0xD0,0xE1,0x94,0x00,0x00,0xE0, + 0x97,0x10,0x80,0xE0,0xA0,0x02,0xA0,0xE1,0xB2,0x06,0xC6,0xE1,0x0C,0x10,0x9D,0xE5, + 0x00,0x40,0xA0,0xE3,0xBE,0x10,0xD1,0xE1,0x01,0x00,0x80,0xE0,0xB2,0x06,0xC6,0xE1, + 0x01,0x00,0xA0,0xE3,0x2A,0x1E,0x8D,0xE2,0x11,0x00,0x81,0xE8,0xF0,0x04,0x9F,0xE5, + 0x01,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3,0xBC,0x00,0x00,0xDA,0xE0,0x04,0x9F,0xE5, + 0x00,0x50,0xA0,0xE3,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3,0xAF,0x00,0x00,0xDA, + 0x0C,0x00,0x9D,0xE5,0xA4,0x12,0x9D,0xE5,0x81,0x00,0x80,0xE0,0xB0,0x02,0x8D,0xE5, + 0xFF,0x00,0x01,0xE2,0xAC,0x02,0x8D,0xE5,0xB4,0x04,0x9F,0xE5,0xA4,0x12,0x9D,0xE5, + 0x00,0x00,0xD0,0xE5,0xAC,0xA4,0x9F,0xE5,0x04,0x20,0x9D,0xE5,0x91,0x50,0x20,0xE0, + 0x00,0x08,0xA0,0xE1,0x20,0x08,0xA0,0xE1,0x9C,0x02,0x8D,0xE5,0x80,0x00,0x8A,0xE0, + 0xF0,0x10,0xD0,0xE1,0xB2,0x20,0xD2,0xE1,0x02,0x00,0x51,0xE1,0x04,0x00,0x00,0xDA, + 0x04,0x10,0x9D,0xE5,0x04,0x20,0x9D,0xE5,0xB0,0x10,0xD1,0xE1,0x01,0x10,0x81,0xE2, + 0xB0,0x10,0xC2,0xE1,0xF0,0x00,0xD0,0xE1,0xF2,0x16,0xD6,0xE1,0x01,0x00,0x50,0xE1, + 0x8D,0x00,0x00,0xDA,0x00,0x70,0xA0,0xE3,0x54,0xC4,0x9F,0xE5,0x98,0x72,0x8D,0xE5, + 0x00,0xC0,0xDC,0xE5,0x9C,0x12,0x9D,0xE5,0x07,0x90,0xA0,0xE1,0x05,0x00,0x5C,0xE1, + 0x07,0x80,0xA0,0xE1,0x07,0x20,0xA0,0xE1,0x07,0x30,0xA0,0xE1,0x07,0x00,0xA0,0xE1, + 0x5C,0x00,0x00,0xDA,0x01,0xA0,0x4C,0xE2,0xA8,0xA2,0x8D,0xE5,0x24,0xA4,0x9F,0xE5, + 0x81,0xA0,0x8A,0xE0,0xF0,0xB0,0xDA,0xE1,0xF2,0xA6,0xD6,0xE1,0x0A,0x00,0x5B,0xE1, + 0x54,0x00,0x00,0xDA,0xFF,0xE0,0x04,0xE2,0x4B,0xAF,0x8D,0xE2,0x01,0xE0,0xCA,0xE7, + 0xF2,0xA6,0xD6,0xE1,0x0A,0xA0,0x4B,0xE0,0x0C,0xB0,0x9D,0xE5,0x0A,0x90,0x89,0xE0, + 0x85,0xB0,0x8B,0xE0,0xB2,0xB2,0xDB,0xE1,0x9A,0x7B,0x27,0xE0,0xB0,0xB2,0x9D,0xE5, + 0xB6,0xB5,0xDB,0xE1,0x9A,0x8B,0x28,0xE0,0x98,0xA2,0x9D,0xE5,0x01,0xA0,0x8A,0xE2, + 0x01,0xA8,0xCA,0xE3,0x98,0xA2,0x8D,0xE5,0xA4,0xA2,0x9D,0xE5,0x00,0x00,0x5A,0xE3, + 0x3B,0x00,0x00,0x0A,0x00,0x00,0x52,0xE3,0x16,0x00,0x00,0x1A,0x0C,0xA0,0x41,0xE0, + 0x4B,0xEF,0x8D,0xE2,0x0A,0xB0,0xDE,0xE7,0x00,0x00,0x5B,0xE3,0x05,0x00,0x00,0x1A, + 0x00,0x00,0x55,0xE3,0x06,0x00,0x00,0x0A,0x0E,0xB0,0x8A,0xE0,0x01,0xB0,0x5B,0xE5, + 0x00,0x00,0x5B,0xE3,0x02,0x00,0x00,0x0A,0x01,0x20,0xA0,0xE3,0x0B,0x40,0xA0,0xE1, + 0x2B,0x00,0x00,0xEA,0xA8,0xB2,0x9D,0xE5,0x05,0x00,0x5B,0xE1,0x28,0x00,0x00,0x0A, + 0x0E,0xA0,0x8A,0xE0,0x01,0xA0,0xDA,0xE5,0x00,0x00,0x5A,0xE3,0x01,0x20,0xA0,0x13, + 0x0A,0x40,0xA0,0x11,0x22,0x00,0x00,0xEA,0x0C,0xB0,0x41,0xE0,0x4B,0xAF,0x8D,0xE2, + 0x0B,0xA0,0xDA,0xE7,0x00,0x00,0x5A,0xE3,0x04,0x00,0x5A,0x11,0x02,0x00,0x00,0x0A, + 0x01,0x30,0xA0,0xE3,0x0A,0x00,0xA0,0xE1,0x12,0x00,0x00,0xEA,0x00,0x00,0x55,0xE3, + 0x05,0x00,0x00,0x0A,0x4B,0xAF,0x8D,0xE2,0x0B,0xA0,0x8A,0xE0,0x01,0xA0,0x5A,0xE5, + 0x00,0x00,0x5A,0xE3,0x04,0x00,0x5A,0x11,0xF4,0xFF,0xFF,0x1A,0xA8,0xA2,0x9D,0xE5, + 0x05,0x00,0x5A,0xE1,0x05,0x00,0x00,0x0A,0x4B,0xAF,0x8D,0xE2,0x0B,0xA0,0x8A,0xE0, + 0x01,0xA0,0xDA,0xE5,0x00,0x00,0x5A,0xE3,0x04,0x00,0x5A,0x11,0xEB,0xFF,0xFF,0x1A, + 0x00,0x00,0x53,0xE3,0x06,0x00,0x00,0x0A,0x0C,0x00,0x50,0xE3,0x0C,0x00,0x54,0x33, + 0x03,0x00,0x00,0x2A,0x00,0x00,0x54,0xE1,0x12,0xAE,0x8D,0xE2,0x00,0xE0,0xCA,0x97, + 0x04,0x00,0xCA,0x87,0x01,0x50,0x85,0xE2,0x01,0x10,0x81,0xE2,0x05,0x00,0x5C,0xE1, + 0x01,0x18,0xC1,0xE3,0xA4,0xFF,0xFF,0xCA,0xA0,0x02,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x11,0x00,0x50,0x13,0x20,0x00,0x00,0x2A,0x00,0x00,0x52,0xE3,0x00,0x40,0xA0,0x01, + 0x01,0x00,0x80,0x02,0x9C,0x12,0x9D,0xE5,0xA0,0x02,0x8D,0x05,0x4B,0x0F,0x8D,0xE2, + 0x01,0x00,0x80,0xE0,0x04,0x1C,0xA0,0xE1,0x98,0x22,0x9D,0xE5,0x41,0x1C,0xA0,0xE1, + 0x0F,0xF1,0xFF,0xEB,0x84,0x10,0x84,0xE0,0x54,0x00,0x8D,0xE2,0x01,0x01,0x80,0xE0, + 0x0C,0x10,0x10,0xE5,0x07,0x10,0x81,0xE0,0x0C,0x10,0x00,0xE5,0x08,0x10,0x10,0xE5, + 0x08,0x10,0x81,0xE0,0x08,0x10,0x00,0xE5,0x04,0x10,0x10,0xE5,0x09,0x10,0x81,0xE0, + 0x04,0x10,0x00,0xE5,0x10,0x00,0x8D,0xE2,0x04,0x01,0x80,0xE0,0xB4,0x10,0x50,0xE1, + 0x98,0x22,0x9D,0xE5,0x02,0x10,0x81,0xE0,0xB4,0x10,0x40,0xE1,0x01,0x10,0xA0,0xE3, + 0x02,0x10,0x40,0xE5,0xAC,0x12,0x9D,0xE5,0x01,0x10,0x40,0xE5,0x20,0x02,0x9F,0xE5, + 0x01,0x50,0x85,0xE2,0x00,0x00,0xD0,0xE5,0x05,0x00,0x50,0xE1,0x55,0xFF,0xFF,0xCA, + 0xA4,0x02,0x9D,0xE5,0x01,0x00,0x80,0xE2,0xA4,0x02,0x8D,0xE5,0x00,0x02,0x9F,0xE5, + 0xA4,0x12,0x9D,0xE5,0x01,0x00,0xD0,0xE5,0x01,0x00,0x50,0xE1,0x42,0xFF,0xFF,0xCA, + 0xA0,0x02,0x9D,0xE5,0x01,0x00,0x40,0xE2,0x10,0x00,0x50,0xE3,0x2C,0x00,0x00,0x8A, + 0xA0,0x02,0x9D,0xE5,0x01,0x40,0x40,0xE2,0x00,0x00,0x54,0xE3,0x28,0x00,0x00,0xDA, + 0x12,0x7E,0x8D,0xE2,0x10,0x80,0x8D,0xE2,0x54,0x90,0x8D,0xE2,0x04,0x20,0xD7,0xE7, + 0x01,0x00,0x42,0xE2,0x10,0x00,0x50,0xE3,0x1E,0x00,0x00,0x8A,0x82,0x00,0x82,0xE0, + 0x84,0x10,0x84,0xE0,0x00,0x01,0x89,0xE0,0x01,0x11,0x89,0xE0,0x0C,0x30,0x10,0xE5, + 0x0C,0xC0,0x11,0xE5,0x04,0xA1,0x88,0xE0,0x0C,0x30,0x83,0xE0,0x0C,0x30,0x00,0xE5, + 0x08,0x30,0x10,0xE5,0x08,0xC0,0x11,0xE5,0x11,0x50,0x64,0xE2,0x0C,0x30,0x83,0xE0, + 0x08,0x30,0x00,0xE5,0x04,0x30,0x10,0xE5,0x04,0xC0,0x11,0xE5,0x0C,0x30,0x83,0xE0, + 0x04,0x30,0x00,0xE5,0x02,0x01,0x88,0xE0,0xB4,0x20,0x50,0xE1,0xB4,0x30,0x5A,0xE1, + 0x03,0x20,0x82,0xE0,0xB4,0x20,0x40,0xE1,0x85,0x00,0x85,0xE0,0x00,0x21,0xA0,0xE1, + 0x0C,0x00,0x41,0xE2,0xCB,0xF0,0xFF,0xEB,0x05,0x21,0xA0,0xE1,0x04,0x00,0x4A,0xE2, + 0x0A,0x10,0xA0,0xE1,0xC7,0xF0,0xFF,0xEB,0x01,0x40,0x44,0xE2,0x00,0x00,0x54,0xE3, + 0xD9,0xFF,0xFF,0xCA,0x0C,0x00,0x9D,0xE5,0x00,0x40,0xA0,0xE3,0x04,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0x2A,0x00,0x00,0xDA,0x14,0xA1,0x9F,0xE5,0x4B,0x8F,0x8D,0xE2, + 0x10,0x90,0x8D,0xE2,0x54,0xB0,0x8D,0xE2,0x08,0x00,0x9D,0xE5,0x04,0x11,0x84,0xE0, + 0x81,0x10,0xF0,0xE7,0x01,0x20,0xD0,0xE5,0x00,0x30,0xDA,0xE5,0x84,0x71,0x86,0xE0, + 0x92,0x13,0x21,0xE0,0x01,0x18,0xC1,0xE3,0x01,0x10,0xD8,0xE7,0x06,0x10,0xC7,0xE5, + 0x04,0x11,0x89,0xE0,0xB0,0x20,0xD1,0xE1,0xB4,0x20,0xC7,0xE1,0x0A,0x20,0x80,0xE2, + 0xB0,0x00,0xD1,0xE1,0xFF,0x00,0x00,0xE2,0x08,0x00,0xC2,0xE5,0x0C,0x10,0x9D,0xE5, + 0xBE,0x11,0xD1,0xE1,0x01,0x00,0x50,0xE1,0x0C,0x10,0x9D,0x85,0xBE,0x01,0xC1,0x81, + 0x84,0x00,0x84,0xE0,0x00,0x51,0x8B,0xE0,0x08,0x10,0x95,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x10,0xA0,0x03,0x08,0x10,0x85,0xE5,0x00,0x01,0x9B,0xE7,0x73,0xF0,0xFF,0xEB, + 0xB0,0x00,0xC7,0xE1,0x03,0x00,0x95,0xE9,0x70,0xF0,0xFF,0xEB,0xB2,0x00,0xC7,0xE1, + 0x0C,0x00,0x9D,0xE5,0x01,0x40,0x84,0xE2,0x04,0x00,0xD0,0xE5,0x04,0x00,0x50,0xE1, + 0xD8,0xFF,0xFF,0xCA,0x0C,0x00,0x9D,0xE5,0x04,0x00,0xD0,0xE5,0x01,0x00,0x50,0xE3, + 0xAD,0xDF,0x8D,0xB2,0xF0,0x4F,0xBD,0xB8,0x1E,0xFF,0x2F,0xB1,0x01,0x30,0xA0,0xE3, + 0x80,0x21,0x86,0xE0,0x02,0x10,0x52,0xE5,0x00,0x00,0x51,0xE1,0x07,0x00,0x00,0x0A, + 0xB0,0x16,0xD6,0xE1,0x01,0xC0,0x40,0xE2,0x13,0x1C,0x81,0xE1,0xB0,0x16,0xC6,0xE1, + 0x02,0x20,0x52,0xE5,0x01,0x20,0x42,0xE2,0x13,0x12,0x81,0xE1,0xB0,0x16,0xC6,0xE1, + 0x01,0x00,0x40,0xE2,0x01,0x00,0x50,0xE3,0xF0,0xFF,0xFF,0xAA,0xAD,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xE8,0x07,0x00,0x20,0x40,0x00,0x00,0x20, + 0x1F,0x85,0xEB,0x51,0x9C,0x94,0x00,0x00,0x00,0x00,0x00,0x10,0xF0,0xB5,0xD3,0xB0, + 0x37,0xA8,0x2B,0x90,0x00,0x20,0x11,0x90,0x10,0x90,0x0F,0x90,0x0D,0x90,0xFE,0x4C, + 0x0B,0x90,0x89,0x20,0x80,0x00,0x20,0x18,0x25,0x00,0x8A,0x35,0x06,0x90,0x28,0x00, + 0x98,0x30,0x05,0x90,0x2E,0x38,0x06,0x00,0x04,0x90,0xF8,0x48,0xB0,0x36,0x20,0x18, + 0x03,0x90,0x02,0x90,0x04,0x22,0x00,0x21,0x09,0xA8,0xFC,0xF7,0xA3,0xF8,0x2E,0x22, + 0x00,0x21,0x1F,0xA8,0xFC,0xF7,0x9E,0xF8,0xF1,0x48,0x00,0x21,0x20,0x81,0x61,0x81, + 0x60,0x35,0x30,0x00,0xA1,0x81,0x60,0x30,0x69,0x80,0x52,0x90,0x81,0x80,0x0E,0x20, + 0x20,0x5E,0xEC,0x49,0x0E,0x90,0x02,0x98,0x20,0x30,0x51,0x90,0x00,0x7A,0xC2,0x07, + 0x1C,0xD0,0x80,0x07,0x0D,0xD5,0x01,0x20,0x0D,0x90,0x08,0x78,0x08,0xAB,0x82,0x1E, + 0x1A,0x71,0x4A,0x78,0x52,0x1E,0x40,0x1E,0x5A,0x71,0x98,0x71,0x00,0x20,0xD8,0x71, + 0x0C,0xE0,0x02,0x20,0x0D,0x90,0x08,0x78,0x08,0xAB,0x40,0x1E,0x18,0x71,0x48,0x78, + 0x82,0x1E,0x5A,0x71,0x00,0x22,0x40,0x1E,0x9A,0x71,0xD8,0x71,0xDA,0x4B,0x18,0x68, + 0x00,0x68,0x42,0x04,0x01,0xD5,0xD9,0x4A,0x00,0xE0,0xD9,0x4A,0x00,0x04,0x08,0x92, + 0x01,0xD5,0xD6,0x48,0x00,0xE0,0xD6,0x48,0x07,0x90,0x00,0x20,0x3F,0x90,0xD1,0x48, + 0x40,0x78,0x00,0x28,0x00,0xDC,0x57,0xE3,0x20,0x00,0x40,0x30,0x50,0x90,0xCD,0x48, + 0x04,0x99,0x00,0x78,0x42,0x18,0x3F,0x99,0x08,0x31,0x51,0x5C,0x00,0x29,0x00,0xD1, + 0x3F,0xE3,0x00,0x25,0x00,0x28,0x00,0xDC,0x38,0xE3,0x3F,0x98,0x80,0x1E,0x00,0x06, + 0x00,0x16,0x4F,0x90,0x3F,0x98,0x00,0x06,0x00,0x0E,0x4E,0x90,0x3F,0x98,0x40,0x00, + 0x00,0x19,0x40,0x30,0x4D,0x90,0x04,0x98,0x40,0x19,0x00,0x7A,0x00,0x28,0x00,0xD1, + 0x1C,0xE3,0xBC,0x4E,0x3F,0x99,0x30,0x78,0x48,0x43,0x40,0x19,0x00,0x04,0x00,0x14, + 0xBB,0x49,0x1E,0x90,0x40,0x00,0x0A,0x5E,0xB7,0x49,0x09,0x68,0x60,0x31,0x09,0x88, + 0x8A,0x42,0x04,0xDD,0x52,0x99,0x52,0x9A,0x89,0x88,0x49,0x1C,0x91,0x80,0x1E,0x99, + 0x1F,0xAA,0xC9,0x10,0x4C,0x91,0x52,0x5C,0x1E,0x99,0x4B,0x07,0x5B,0x0F,0x01,0x21, + 0x99,0x40,0x0A,0x42,0x4B,0x91,0x7E,0xD1,0x0D,0x99,0x08,0xAB,0xC9,0x07,0x15,0xD0, + 0x99,0x79,0xA9,0x42,0x09,0xD1,0x01,0x21,0x0C,0x91,0xA8,0x49,0x02,0x22,0x08,0x5E, + 0x04,0x99,0x8A,0x5E,0x90,0x42,0x6E,0xDB,0x18,0xE0,0x08,0xAB,0x19,0x79,0xA9,0x42, + 0x01,0xD1,0x03,0x21,0x00,0xE0,0x02,0x21,0x0C,0x91,0x08,0xE0,0xD9,0x79,0x3F,0x9A, + 0x91,0x42,0xE8,0xD0,0x08,0xAB,0x59,0x79,0x91,0x42,0xF4,0xD1,0xF1,0xE7,0x9B,0x49, + 0x00,0x22,0x08,0x5E,0x04,0x99,0x8A,0x5E,0x90,0x42,0x54,0xDB,0x30,0x78,0x3F,0x99, + 0x4A,0x90,0x48,0x43,0x40,0x19,0x00,0x21,0x43,0x00,0x92,0x48,0x47,0x78,0x3F,0x9A, + 0x4A,0x9E,0x52,0x18,0x94,0x46,0x00,0x20,0x52,0x1E,0x56,0x43,0x49,0x96,0x2A,0x18, + 0x66,0x46,0x76,0x1E,0x52,0x1E,0x00,0x2E,0x0E,0xDB,0xB7,0x42,0x0C,0xDD,0x00,0x2A, + 0x0A,0xDB,0x4A,0x9E,0x96,0x42,0x07,0xDD,0x49,0x9E,0xB2,0x18,0x87,0x4E,0x52,0x00, + 0xB2,0x5E,0xF6,0x5E,0xB2,0x42,0x2E,0xDC,0x40,0x1C,0x00,0x04,0x00,0x14,0x03,0x28, + 0xE5,0xDB,0x49,0x1C,0x09,0x04,0x09,0x14,0x03,0x29,0xD8,0xDB,0x7F,0x48,0xA2,0x89, + 0xC0,0x5E,0x82,0x42,0x05,0xDC,0xA0,0x81,0x20,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E, + 0x11,0x90,0x4C,0x98,0x1F,0xAA,0x10,0x5C,0x4B,0x99,0x08,0x43,0x4C,0x99,0x50,0x54, + 0x74,0x48,0x00,0x78,0x41,0x1E,0xA9,0x42,0x0B,0xD0,0x1E,0x9A,0x01,0x27,0x52,0x1C, + 0xD3,0x10,0x52,0x07,0x52,0x0F,0x1F,0xAE,0xF6,0x5C,0x97,0x40,0x3E,0x43,0x1F,0xAA, + 0xD6,0x54,0x6C,0x4A,0x00,0xE0,0x30,0xE1,0x52,0x78,0x3F,0x9B,0x52,0x1E,0x9A,0x42, + 0x28,0xD0,0x1E,0x9A,0x01,0x27,0x86,0x18,0xF2,0x10,0x76,0x07,0x76,0x0F,0x1F,0xAB, + 0x9B,0x5C,0xB7,0x40,0x3B,0x43,0x1F,0xAE,0x00,0x2D,0xB3,0x54,0x0C,0xD0,0x1E,0x9A, + 0x01,0x27,0x52,0x1E,0x86,0x18,0xF2,0x10,0x76,0x07,0x76,0x0F,0x1F,0xAB,0x9B,0x5C, + 0xB7,0x40,0x3B,0x43,0x1F,0xAE,0xB3,0x54,0xA9,0x42,0x0B,0xD0,0x1E,0x99,0x1F,0xAA, + 0x49,0x1C,0x41,0x18,0xC8,0x10,0x4E,0x07,0x13,0x5C,0x76,0x0F,0x01,0x21,0xB1,0x40, + 0x0B,0x43,0x13,0x54,0x28,0x06,0x00,0x0E,0x48,0x90,0x02,0xF0,0xA5,0xFC,0x4F,0x99, + 0x00,0x20,0x8C,0x46,0x00,0x21,0x3E,0x91,0xA9,0x1E,0x09,0x06,0x09,0x16,0x1C,0x90, + 0x0A,0x90,0x31,0xA8,0x47,0x91,0x3E,0x9B,0x06,0x26,0x5B,0x1E,0x46,0x93,0x3E,0x9B, + 0x00,0x22,0x73,0x43,0x2C,0xAF,0xDB,0x19,0x45,0x93,0x63,0x46,0x00,0x2B,0x08,0xDB, + 0x44,0x4E,0x73,0x78,0x63,0x45,0x04,0xDD,0x00,0x29,0x02,0xDB,0x33,0x78,0x8B,0x42, + 0x02,0xDC,0x00,0x23,0x03,0x80,0x26,0xE0,0x66,0x46,0x73,0x43,0x5B,0x18,0x1B,0x04, + 0x1B,0x14,0x5F,0x00,0x08,0x9B,0x0E,0x9E,0xDB,0x5B,0x9B,0x1B,0x1B,0x04,0x1B,0x14, + 0x03,0x80,0x01,0xD5,0x00,0x23,0x03,0x80,0x46,0x9B,0x03,0x2B,0x13,0xD2,0x53,0x1E, + 0x03,0x2B,0x10,0xD2,0x07,0x9B,0x0E,0x9E,0xDB,0x5B,0x57,0x00,0x9B,0x1B,0x45,0x9E, + 0xF6,0x19,0x20,0x3E,0x33,0x83,0x00,0x23,0xC3,0x5E,0x1C,0x9E,0x9B,0x19,0x1C,0x93, + 0x0A,0x9B,0x5B,0x1C,0x0A,0x93,0x52,0x1C,0x49,0x1C,0x12,0x04,0x09,0x06,0x80,0x1C, + 0x12,0x14,0x09,0x16,0x05,0x2A,0xC0,0xDB,0x3E,0x99,0x49,0x1C,0x09,0x04,0x09,0x14, + 0x3E,0x91,0x61,0x46,0x49,0x1C,0x09,0x06,0x09,0x16,0x8C,0x46,0x3E,0x99,0x05,0x29, + 0x01,0xDA,0x47,0x99,0xA7,0xE7,0x23,0x48,0x00,0x78,0x00,0x28,0x16,0xD1,0x0A,0x99, + 0x49,0x1E,0x01,0x29,0x00,0xDA,0x01,0x21,0x1C,0x98,0xFB,0xF7,0xBF,0xFE,0x0C,0x99, + 0x01,0x29,0x0B,0xD1,0x2B,0x9A,0x00,0x21,0x51,0x5E,0x0A,0x1A,0x16,0x48,0x00,0x68, + 0x43,0x8E,0x9A,0x42,0x02,0xD2,0x80,0x8E,0x81,0x42,0x7E,0xDB,0x12,0x49,0x38,0x20, + 0x09,0x68,0x20,0xAB,0x18,0x5E,0xC9,0x8D,0x48,0x43,0x02,0xF0,0x99,0xFC,0x08,0x04, + 0x0C,0x99,0x00,0x14,0x02,0x29,0x40,0xD0,0x0D,0x99,0xC9,0x07,0x27,0xD0,0x04,0x21, + 0x00,0x23,0x31,0xAE,0x0C,0x9A,0x01,0x2A,0x16,0xD1,0x0A,0x27,0x0A,0x00,0x7A,0x43, + 0xB3,0x52,0x92,0x19,0x53,0x80,0x15,0xE0,0x40,0x00,0x00,0x20,0x64,0x06,0x00,0x00, + 0xFF,0x0F,0x00,0x00,0x9C,0x94,0x00,0x00,0xE8,0x07,0x00,0x20,0x2A,0x08,0x00,0x20, + 0x00,0x00,0x00,0x10,0xFB,0x07,0x00,0x20,0x0A,0x27,0x0A,0x00,0x7A,0x43,0x92,0x19, + 0xD3,0x80,0x13,0x81,0x49,0x1E,0x09,0x04,0x09,0x14,0xDB,0xD5,0x15,0xE0,0x0D,0x99, + 0x89,0x07,0x12,0xD5,0x04,0x21,0x00,0x23,0x31,0xAE,0x0C,0x9A,0x01,0x2A,0x04,0xD1, + 0x4A,0x00,0xB3,0x52,0x92,0x19,0x53,0x81,0x03,0xE0,0x4A,0x00,0x92,0x19,0xD3,0x83, + 0x13,0x85,0x49,0x1E,0x09,0x04,0x09,0x14,0xEF,0xD5,0x2B,0x9A,0x00,0x21,0x51,0x5E, + 0x22,0x89,0x8A,0x42,0x00,0xDD,0x21,0x81,0x62,0x89,0x8A,0x42,0x00,0xDA,0x61,0x81, + 0x21,0x79,0x0A,0x23,0x49,0x1C,0x09,0x06,0x09,0x0E,0x21,0x71,0x59,0x43,0x05,0x9B, + 0x48,0x9A,0xC9,0x18,0x20,0x39,0x8A,0x75,0x21,0x79,0x0A,0x23,0x4E,0x9A,0x59,0x43, + 0x05,0x9B,0xC9,0x18,0x20,0x39,0xCA,0x75,0x36,0x22,0x20,0xAB,0x9A,0x5E,0x00,0x21, + 0x82,0x42,0x07,0xDC,0x30,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC,0x3C,0x22,0x9A,0x5E, + 0x82,0x42,0x00,0xDD,0x02,0x21,0x20,0xAB,0x00,0xE0,0x47,0xE1,0x3A,0x22,0x9A,0x5E, + 0x82,0x42,0x08,0xDC,0x34,0x22,0x9A,0x5E,0x82,0x42,0x04,0xDC,0x00,0x22,0x30,0xAB, + 0x9A,0x5E,0x82,0x42,0x01,0xDD,0x04,0x22,0x11,0x43,0x32,0x22,0x20,0xAB,0x9A,0x5E, + 0x82,0x42,0x07,0xDC,0x30,0x22,0x9A,0x5E,0x82,0x42,0x03,0xDC,0x34,0x22,0x9A,0x5E, + 0x82,0x42,0x01,0xDD,0x08,0x22,0x11,0x43,0x3E,0x22,0x20,0xAB,0x9A,0x5E,0x82,0x42, + 0x08,0xDC,0x3C,0x22,0x9A,0x5E,0x82,0x42,0x04,0xDC,0x00,0x22,0x30,0xAB,0x9A,0x5E, + 0x82,0x42,0x01,0xDD,0x10,0x20,0x01,0x43,0x04,0x20,0x00,0x23,0x31,0xAA,0x8E,0x07, + 0x02,0xD4,0x0A,0x26,0x46,0x43,0x93,0x53,0x4E,0x07,0x03,0xD4,0x0A,0x26,0x46,0x43, + 0xB6,0x18,0x33,0x81,0x0E,0x07,0x01,0xD4,0x46,0x00,0x93,0x53,0xCE,0x06,0x02,0xD4, + 0x46,0x00,0xB6,0x18,0x33,0x85,0x40,0x1E,0x00,0x04,0x00,0x14,0xE7,0xD5,0x0C,0x22, + 0x30,0xAB,0x9A,0x5E,0x0A,0x26,0x06,0x21,0x00,0x92,0x9E,0x5F,0x08,0x22,0x04,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x38,0xFB,0x16,0x22,0x30,0xAB, + 0x1A,0x90,0x9A,0x5E,0x14,0x26,0x10,0x21,0x00,0x92,0x9E,0x5F,0x12,0x22,0x0E,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x28,0xFB,0x20,0x22,0x30,0xAB, + 0x19,0x90,0x9A,0x5E,0x1E,0x26,0x1A,0x21,0x00,0x92,0x9E,0x5F,0x1C,0x22,0x18,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x18,0xFB,0x2A,0x22,0x30,0xAB, + 0x18,0x90,0x9A,0x5E,0x28,0x26,0x24,0x21,0x00,0x92,0x9E,0x5F,0x26,0x22,0x22,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x08,0xFB,0x34,0x22,0x30,0xAB, + 0x17,0x90,0x9A,0x5E,0x32,0x26,0x2E,0x21,0x00,0x92,0x9E,0x5F,0x30,0x22,0x2C,0x20, + 0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0xF8,0xFA,0x00,0x90,0x16,0x90, + 0x17,0x9B,0x18,0x9A,0x19,0x99,0x1A,0x98,0x01,0xF0,0xF0,0xFA,0x00,0x28,0x1B,0x90, + 0x09,0xD1,0x32,0x22,0x00,0x21,0x31,0xA8,0xFB,0xF7,0xB4,0xFD,0x2B,0x99,0x0A,0x20, + 0x18,0x90,0x08,0x80,0x1B,0x90,0x2C,0x22,0x30,0xAB,0x9A,0x5E,0x22,0x26,0x0E,0x21, + 0x00,0x92,0x9E,0x5F,0x18,0x22,0x04,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00, + 0x01,0xF0,0xD4,0xFA,0x69,0x00,0x09,0x19,0x0F,0x00,0x09,0x8C,0x2E,0x22,0x30,0xAB, + 0x48,0x43,0x15,0x90,0x9A,0x5E,0x24,0x26,0x10,0x21,0x00,0x92,0x9E,0x5F,0x1A,0x22, + 0x06,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0xBF,0xFA,0x79,0x8C, + 0x30,0x22,0x30,0xAB,0x48,0x43,0x14,0x90,0x9A,0x5E,0x26,0x26,0x12,0x21,0x00,0x92, + 0x9E,0x5F,0x1C,0x22,0x08,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0, + 0xAD,0xFA,0xB9,0x8C,0x32,0x22,0x30,0xAB,0x48,0x43,0x13,0x90,0x9A,0x5E,0x28,0x26, + 0x14,0x21,0x00,0x92,0x9E,0x5F,0x1E,0x22,0x0A,0x20,0x9A,0x5E,0x59,0x5E,0x18,0x5E, + 0x33,0x00,0x01,0xF0,0x9B,0xFA,0xF9,0x8C,0x34,0x22,0x30,0xAB,0x48,0x43,0x12,0x90, + 0x9A,0x5E,0x2A,0x26,0x16,0x21,0x00,0x92,0x9E,0x5F,0x20,0x22,0x0C,0x20,0x9A,0x5E, + 0x59,0x5E,0x18,0x5E,0x33,0x00,0x01,0xF0,0x89,0xFA,0x39,0x8D,0x12,0x9B,0x13,0x9A, + 0x48,0x43,0x00,0x90,0x14,0x99,0x15,0x98,0x01,0xF0,0x80,0xFA,0x1B,0x99,0xFB,0xF7, + 0xBB,0xFB,0x61,0x8C,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20,0x21,0x79,0x0A,0x22, + 0x51,0x43,0x05,0x9A,0x89,0x18,0x88,0x80,0x4D,0x98,0x1A,0x99,0x80,0x8A,0x19,0x9A, + 0x16,0x9F,0x48,0x43,0x4D,0x99,0xC9,0x8A,0x51,0x43,0x4D,0x9A,0x16,0x8B,0x18,0x9A, + 0x56,0x43,0x4D,0x9A,0x53,0x8B,0x17,0x9A,0x53,0x43,0x4D,0x9A,0x92,0x8B,0x7A,0x43, + 0x00,0x92,0x32,0x00,0x01,0xF0,0x5A,0xFA,0x1B,0x99,0xFB,0xF7,0x95,0xFB,0x50,0x99, + 0xC9,0x8A,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20,0x21,0x79,0x0A,0x22,0x51,0x43, + 0x05,0x9A,0x89,0x18,0xC8,0x80,0x20,0x79,0x0C,0x28,0x15,0xD2,0xA4,0x48,0x6D,0x1C, + 0x00,0x78,0x2D,0x04,0x2D,0x14,0xA8,0x42,0x00,0xDD,0xD4,0xE4,0x10,0x98,0x00,0x28, + 0x0A,0xD1,0x3F,0x98,0x40,0x1C,0x00,0x04,0x00,0x14,0x3F,0x90,0x9C,0x48,0x3F,0x99, + 0x40,0x78,0x88,0x42,0x00,0xDD,0xAA,0xE4,0x9A,0x48,0x00,0x68,0x07,0x00,0x00,0x68, + 0x00,0x06,0x46,0xD5,0x20,0x79,0x00,0x28,0x0C,0xD1,0x05,0x98,0x60,0x30,0x41,0x8B, + 0x00,0x29,0x3A,0xD0,0x3D,0x22,0x01,0x7E,0xD2,0x5D,0x91,0x42,0x35,0xD2,0x49,0x1C, + 0x01,0x76,0x36,0xE0,0x05,0x9D,0x3E,0x00,0x60,0x35,0x20,0x36,0x68,0x7E,0xB1,0x7E, + 0x88,0x42,0x27,0xD8,0x40,0x1C,0x00,0x06,0x00,0x0E,0x68,0x76,0xF1,0x7E,0x81,0x42, + 0x03,0xD2,0xA2,0x89,0x0F,0x9B,0xD2,0x18,0x0F,0x92,0xB2,0x7E,0x90,0x42,0x19,0xD1, + 0x88,0x42,0x17,0xD0,0x41,0x1A,0x0F,0x98,0xFB,0xF7,0xA0,0xFC,0x00,0x21,0x69,0x83, + 0xF9,0x8F,0x81,0x42,0x0E,0xD2,0x04,0x99,0xC9,0x88,0x40,0x1A,0x31,0x7F,0x48,0x43, + 0x02,0xF0,0xA6,0xFA,0x09,0x04,0x09,0x0C,0x40,0x20,0x69,0x83,0xC0,0x5B,0x81,0x42, + 0x00,0xD9,0x68,0x83,0x00,0x20,0x28,0x76,0x03,0xE0,0x00,0x21,0x41,0x76,0x01,0x76, + 0x41,0x83,0xFD,0xF7,0xB3,0xF8,0x00,0x20,0x03,0x00,0x1D,0x90,0x20,0x79,0x01,0x22, + 0x01,0x28,0x57,0xDB,0x0A,0x20,0x50,0x43,0x05,0x99,0x6F,0x4B,0x41,0x18,0x04,0x20, + 0x08,0x5E,0x58,0x43,0x83,0x14,0xC0,0x17,0x18,0x1A,0x88,0x80,0x44,0x90,0x06,0x20, + 0x08,0x5E,0x69,0x4B,0x58,0x43,0x83,0x14,0xC0,0x17,0x18,0x1A,0xC8,0x80,0x51,0x9D, + 0x43,0x90,0x6D,0x7A,0x00,0x23,0x18,0x00,0x00,0x2D,0x42,0x95,0x34,0xDD,0x16,0x06, + 0x36,0x0E,0x5F,0x4D,0x20,0x39,0x8C,0x46,0x41,0x96,0x29,0x78,0x40,0x91,0x02,0x99, + 0xC6,0x00,0x71,0x18,0x04,0x27,0xCF,0x5F,0x44,0x9D,0xBD,0x42,0x1E,0xDB,0x06,0x27, + 0xCF,0x5F,0xBD,0x42,0x1A,0xDC,0x02,0x9F,0x43,0x9D,0xBE,0x5F,0xB5,0x42,0x15,0xDB, + 0x02,0x26,0x8E,0x5F,0xB5,0x42,0x11,0xDC,0x61,0x46,0xC9,0x7D,0x40,0x9D,0x69,0x43, + 0x65,0x46,0xAD,0x7D,0x49,0x19,0x51,0x4D,0x49,0x00,0x69,0x5E,0x1D,0x9D,0xA9,0x42, + 0x04,0xDD,0x1D,0x91,0x01,0x06,0x41,0x9B,0x09,0x0E,0x0B,0x91,0x40,0x1C,0x42,0x99, + 0x00,0x04,0x00,0x14,0x81,0x42,0xD2,0xDC,0x20,0x79,0x52,0x1C,0x12,0x04,0x12,0x14, + 0x90,0x42,0xA7,0xDA,0x0B,0x98,0x01,0x28,0x00,0xD0,0x00,0x20,0x18,0x42,0x1B,0xD0, + 0x3F,0x48,0x28,0x21,0x00,0x78,0x42,0x4A,0x1E,0x25,0x41,0x43,0x89,0x18,0x20,0x39, + 0x4D,0x5F,0x2A,0x21,0x48,0x43,0x80,0x18,0x20,0x38,0x1E,0x21,0x41,0x5E,0x8D,0x42, + 0x0A,0xDD,0x0A,0x20,0x58,0x43,0x05,0x99,0x40,0x18,0xC1,0x88,0x26,0x39,0xC1,0x80, + 0x20,0x38,0xC1,0x7D,0x49,0x1E,0xC1,0x75,0x61,0x89,0x1D,0x98,0x81,0x42,0x18,0xDC, + 0x00,0x2B,0x16,0xD0,0x0A,0x20,0x43,0x43,0x05,0x98,0x04,0x25,0x18,0x18,0x06,0x26, + 0x45,0x5F,0x86,0x5F,0x00,0x20,0x02,0x00,0x01,0x00,0x0A,0x23,0x59,0x43,0x05,0x9B, + 0x40,0x1C,0xC9,0x18,0x00,0x04,0x00,0x14,0x8A,0x80,0x0C,0x28,0xCA,0x80,0xF3,0xD3, + 0x24,0xE0,0x60,0x79,0x00,0x28,0x2B,0xD1,0x20,0x79,0x01,0x28,0x28,0xD9,0x06,0x98, + 0xFF,0x30,0x01,0x30,0x40,0x7D,0x00,0x28,0x22,0xD1,0x11,0x98,0x00,0x28,0x1F,0xD0, + 0x0A,0x21,0x48,0x43,0x05,0x99,0x04,0x25,0x40,0x18,0x06,0x26,0x45,0x5F,0x86,0x5F, + 0x00,0x20,0x02,0x00,0x01,0x00,0x0A,0x23,0x59,0x43,0x05,0x9B,0x40,0x1C,0xC9,0x18, + 0x00,0x04,0x00,0x14,0x8A,0x80,0x0C,0x28,0xCA,0x80,0xF3,0xD3,0x01,0x20,0x20,0x71, + 0x05,0x98,0x0A,0x21,0xC5,0x81,0x20,0x79,0x48,0x43,0x05,0x99,0x40,0x18,0xC6,0x80, + 0x03,0x98,0x60,0x30,0x01,0x78,0x00,0x29,0x0B,0xD0,0x0A,0x4A,0x00,0x23,0x23,0x71, + 0x12,0x68,0x41,0x78,0xC0,0x32,0x12,0x7B,0x91,0x42,0x00,0xD3,0x03,0x70,0x49,0x1C, + 0x41,0x70,0x20,0x79,0x60,0x71,0xA0,0x76,0x53,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x9C,0x94,0x00,0x00,0xE8,0x07,0x00,0x20,0x67,0x66,0x00,0x00,0x00,0x00,0x00,0x10, + 0x2A,0x08,0x00,0x20,0x0E,0x49,0x10,0xB5,0x0C,0x48,0x09,0x78,0x80,0x8B,0x00,0x24, + 0x00,0x29,0x02,0xD0,0x0B,0x49,0x49,0x89,0x02,0xE0,0x0B,0x49,0x09,0x68,0x89,0x8B, + 0x08,0x18,0x0A,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24, + 0xFE,0xF7,0xCC,0xFE,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x01,0x00,0x20, + 0xFA,0x07,0x00,0x20,0x1C,0x95,0x00,0x00,0xE8,0x07,0x00,0x20,0xC0,0x90,0x00,0x40, + 0xF7,0xB5,0x30,0x4B,0x00,0x20,0x82,0xB0,0x01,0x90,0x58,0x78,0x99,0x78,0x00,0x02, + 0x08,0x43,0x01,0xF0,0xB9,0xFD,0x58,0x79,0xC0,0x07,0x0A,0xD0,0x2A,0x48,0x01,0x78, + 0x2A,0x48,0x80,0x7B,0x00,0x29,0x02,0xD0,0x01,0xF0,0x56,0xFD,0x01,0xE0,0x01,0xF0, + 0x81,0xFD,0x02,0xF0,0x25,0xF9,0x00,0x26,0x77,0x1E,0x25,0x49,0x25,0x48,0x8A,0x69, + 0x02,0x62,0x49,0x6B,0x41,0x62,0x00,0x21,0xC1,0x62,0x05,0x24,0x01,0xE0,0x05,0x2C, + 0x02,0xD1,0x02,0x25,0xED,0x43,0x0E,0xE0,0x04,0x2C,0x01,0xD1,0x03,0x25,0x0A,0xE0, + 0x03,0x2C,0x03,0xD0,0x02,0x2C,0x05,0xD0,0x01,0x2C,0x01,0xD1,0x3D,0x00,0x02,0xE0, + 0x00,0x2C,0x00,0xD1,0x01,0x25,0xE0,0x07,0xC0,0x0F,0x29,0x00,0xFC,0xF7,0x58,0xF9, + 0x64,0x1E,0xE4,0xD5,0x12,0x48,0x13,0x49,0x00,0x6D,0xC8,0x62,0x0D,0x48,0x20,0x38, + 0x80,0x7F,0x01,0x00,0xFC,0xF7,0xC6,0xF9,0x01,0x24,0x02,0xA8,0x07,0xC8,0xFE,0xF7, + 0x03,0xFE,0x00,0x28,0x01,0xD1,0x00,0x24,0x26,0x00,0x64,0x1E,0xF5,0xD5,0x76,0x1E, + 0xC3,0xD5,0x01,0x99,0x00,0x29,0x00,0xD0,0x05,0x20,0x05,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xDC,0x94,0x00,0x00,0xF4,0x07,0x00,0x20,0xC4,0x06,0x00,0x20, + 0x44,0x95,0x00,0x00,0x80,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x34,0x78,0x9F,0xE5,0x34,0x08,0x9F,0xE5,0x6F,0xDF,0x4D,0xE2,0x00,0x50,0x90,0xE5, + 0x00,0x80,0xA0,0xE3,0x69,0x6F,0x87,0xE2,0xB6,0x86,0xC6,0xE1,0x01,0x4C,0x87,0xE2, + 0xB8,0x86,0xC6,0xE1,0x22,0x40,0x84,0xE2,0x04,0x20,0xA0,0xE3,0x08,0x10,0xA0,0xE1, + 0x04,0x00,0x8D,0xE2,0xBA,0x86,0xC6,0xE1,0x91,0xED,0xFF,0xEB,0xBE,0x87,0xC4,0xE1, + 0x80,0x00,0xD4,0xE5,0xF8,0xB7,0x9F,0xE5,0x00,0x80,0xA0,0xE3,0x00,0x00,0x50,0xE3, + 0xB6,0x00,0xD7,0x01,0x02,0x0C,0xC0,0x03,0xB6,0x00,0xC7,0x01,0x01,0x00,0x40,0x12, + 0x80,0x00,0xC4,0x15,0x1B,0x00,0xD7,0xE5,0x00,0x00,0x50,0xE3,0x62,0x00,0x00,0xDA, + 0xD0,0xA7,0x9F,0xE5,0xD0,0xE7,0x9F,0xE5,0x00,0x30,0xA0,0xE3,0x7C,0x30,0xC4,0xE5, + 0x08,0x01,0x88,0xE0,0x7D,0x30,0xC4,0xE5,0x80,0x10,0xD4,0xE7,0x80,0xC0,0x84,0xE0, + 0x03,0x10,0x41,0xE2,0x01,0x1C,0xA0,0xE1,0x41,0x1C,0xA0,0xE1,0x06,0x10,0xCD,0xE5, + 0x80,0x20,0xD4,0xE7,0x00,0x00,0x51,0xE3,0x03,0x20,0x82,0xE2,0x02,0x2C,0xA0,0xE1, + 0x42,0x2C,0xA0,0xE1,0x07,0x20,0xCD,0xE5,0x01,0x00,0xDC,0xE5,0x03,0x00,0x40,0xE2, + 0x00,0x0C,0xA0,0xE1,0x40,0x0C,0xA0,0xE1,0x04,0x00,0xCD,0xE5,0x01,0xC0,0xDC,0xE5, + 0x03,0xC0,0x8C,0xE2,0x0C,0xCC,0xA0,0xE1,0x4C,0xCC,0xA0,0xE1,0x05,0xC0,0xCD,0xE5, + 0x06,0x30,0xCD,0xB5,0x00,0x10,0xDE,0xE5,0x01,0x00,0x52,0xE1,0x00,0x10,0xDE,0xA5, + 0x07,0x10,0xCD,0xA5,0x00,0x00,0x50,0xE3,0x04,0x30,0xCD,0xB5,0x01,0x00,0xDE,0xE5, + 0x01,0x00,0x40,0xE2,0x00,0x00,0x5C,0xE1,0x05,0x00,0xCD,0xA5,0xD4,0x00,0xDD,0xE1, + 0xD5,0x10,0xDD,0xE1,0x01,0x00,0x50,0xE1,0x23,0x00,0x00,0xCA,0xD6,0x10,0xDD,0xE1, + 0xD4,0x90,0xDD,0xE1,0x00,0x00,0xDE,0xE5,0xD7,0x20,0xDD,0xE1,0x99,0x10,0x20,0xE0, + 0x01,0x00,0x52,0xE1,0x15,0x00,0x00,0xBA,0x80,0x20,0x8B,0xE0,0xB0,0x20,0xD2,0xE1, + 0x80,0x30,0x8A,0xE0,0xB0,0x30,0xD3,0xE1,0x02,0x2A,0xA0,0xE1,0x22,0x2A,0xA0,0xE1, + 0x0F,0x3A,0xC3,0xE3,0x03,0xC0,0x42,0xE0,0x02,0x20,0x43,0xE0,0x32,0x00,0x52,0xE3, + 0x7C,0x20,0xD4,0xC5,0x01,0x10,0x81,0xE2,0x01,0x00,0x80,0xE2,0x01,0x20,0x82,0xC2, + 0x7C,0x20,0xC4,0xC5,0x4B,0x0F,0x5C,0xE3,0x7D,0x20,0xD4,0xC5,0x01,0x20,0x82,0xC2, + 0x7D,0x20,0xC4,0xC5,0xD7,0x20,0xDD,0xE1,0x01,0x00,0x52,0xE1,0xE9,0xFF,0xFF,0xAA, + 0x01,0x00,0x89,0xE2,0x00,0x0C,0xA0,0xE1,0x40,0x0C,0xA0,0xE1,0x04,0x00,0xCD,0xE5, + 0xD5,0x10,0xDD,0xE1,0x01,0x00,0x50,0xE1,0xDB,0xFF,0xFF,0xDA,0x7C,0x00,0xD4,0xE5, + 0x02,0x00,0x50,0xE3,0x0C,0x00,0x00,0x9A,0x7D,0x00,0xD4,0xE5,0x03,0x00,0x50,0xE3, + 0x09,0x00,0x00,0x2A,0xBE,0x07,0xD4,0xE1,0x01,0x10,0x88,0xE2,0x01,0x20,0xA0,0xE3, + 0x12,0x01,0x80,0xE1,0xBE,0x07,0xC4,0xE1,0xB6,0x00,0xD7,0xE1,0x02,0x0C,0x80,0xE3, + 0xB6,0x00,0xC7,0xE1,0x0A,0x00,0xA0,0xE3,0x80,0x00,0xC4,0xE5,0x1B,0x00,0xD7,0xE5, + 0x01,0x80,0x88,0xE2,0x08,0x00,0x50,0xE1,0x9E,0xFF,0xFF,0xCA,0x4C,0x06,0x9F,0xE5, + 0x00,0x80,0xA0,0xE3,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3,0x38,0x16,0x9F,0x15, + 0xFC,0x02,0xD5,0x01,0xF8,0x08,0xD1,0x11,0xBA,0x12,0xD5,0x01,0xB6,0x18,0xD1,0x11, + 0x91,0x00,0x00,0xE0,0xA4,0x11,0x8D,0xE5,0x24,0x16,0x9F,0xE5,0x91,0x20,0xC0,0xE0, + 0xC0,0x12,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0xA8,0x01,0x8D,0xE5,0x62,0x1F,0xA0,0xE3,0x1C,0x00,0x8D,0xE2,0x1C,0x80,0xC7,0xE5, + 0x16,0xED,0xFF,0xEB,0xE0,0xA5,0x9F,0xE5,0x00,0x40,0xA0,0xE3,0x08,0x90,0xA0,0xE1, + 0x38,0x20,0xA0,0xE3,0x04,0x10,0xA0,0xE1,0x76,0x0E,0x8A,0xE2,0x18,0x80,0x8D,0xE5, + 0x14,0x80,0x8D,0xE5,0x10,0x80,0x8D,0xE5,0x0C,0x80,0x8D,0xE5,0x08,0x80,0x8D,0xE5, + 0xFF,0xEC,0xFF,0xEB,0x0E,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x75,0x0E,0x8A,0xE2, + 0xFB,0xEC,0xFF,0xEB,0xB0,0x05,0x9F,0xE5,0x00,0xC0,0xA0,0xE3,0x01,0x00,0xD0,0xE5, + 0x00,0x00,0x50,0xE3,0x76,0x00,0x00,0xDA,0x02,0x0C,0x87,0xE2,0xB8,0x01,0x8D,0xE5, + 0x94,0x05,0x9F,0xE5,0x00,0x20,0xA0,0xE3,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x60,0x00,0x00,0xDA,0x1C,0x00,0x8D,0xE2,0x0C,0x31,0x80,0xE0,0x70,0x05,0x9F,0xE5, + 0x84,0xA0,0x80,0xE0,0xB0,0x00,0xDA,0xE1,0x00,0x1A,0xA0,0xE1,0x64,0x05,0x9F,0xE5, + 0x21,0x1A,0xA0,0xE1,0x84,0x00,0x80,0xE0,0xB0,0x00,0xD0,0xE1,0x0F,0xBA,0xC0,0xE3, + 0x0B,0x00,0x41,0xE0,0x01,0x10,0x4B,0xE0,0x00,0x00,0x51,0xE3,0x0B,0x00,0x00,0xDA, + 0x32,0x00,0x51,0xE3,0x04,0x00,0x00,0xDA,0x2C,0xB5,0x9F,0xE5,0x02,0xB0,0x8B,0xE0, + 0x50,0xE7,0xDB,0xE5,0x01,0xE0,0x8E,0xE2,0x50,0xE7,0xCB,0xE5,0x18,0xB5,0x9F,0xE5, + 0x02,0xB1,0x8B,0xE0,0x60,0xE7,0x9B,0xE5,0x01,0x00,0x5E,0xE1,0x60,0x17,0x8B,0x35, + 0x00,0x00,0x50,0xE3,0x21,0x00,0x00,0xDA,0x1C,0x10,0x8D,0xE2,0xB0,0x00,0xCA,0xE1, + 0x02,0xA1,0x91,0xE7,0x00,0xA0,0x8A,0xE0,0x02,0xA1,0x81,0xE7,0x60,0x10,0x93,0xE5, + 0x00,0x10,0x81,0xE0,0x60,0x10,0x83,0xE5,0x10,0x10,0x9D,0xE5,0x00,0x00,0x51,0xE1, + 0x10,0x10,0x8D,0xB2,0x05,0x10,0x81,0xB8,0xB8,0x16,0xD5,0xE1,0x00,0x00,0x51,0xE1, + 0x07,0x00,0x00,0xAA,0xB6,0x16,0xD6,0xE1,0x01,0x10,0x81,0xE2,0xB6,0x16,0xC6,0xE1, + 0xBA,0x16,0xD5,0xE1,0x00,0x00,0x51,0xE1,0xBA,0x16,0xD6,0xB1,0x01,0x10,0x81,0xB2, + 0xBA,0x16,0xC6,0xB1,0xB6,0x1B,0xD5,0xE1,0x00,0x00,0x51,0xE1,0x23,0x00,0x00,0xAA, + 0x81,0x00,0x50,0xE1,0x08,0xA0,0x9D,0xE5,0x0C,0x00,0x9D,0xC5,0x01,0xA0,0x8A,0xE2, + 0x01,0x00,0x80,0xC2,0x08,0xA0,0x8D,0xE5,0x0C,0x00,0x8D,0xC5,0x1B,0x00,0x00,0xEA, + 0x00,0x00,0xA0,0xE3,0xB0,0x00,0xCA,0xE1,0x1C,0x00,0x8D,0xE2,0x02,0x01,0x80,0xE0, + 0xC0,0xA0,0x90,0xE5,0x01,0xA0,0x8A,0xE0,0xC0,0xA0,0x80,0xE5,0x20,0x01,0x93,0xE5, + 0x01,0x00,0x80,0xE0,0x20,0x01,0x83,0xE5,0xBC,0x06,0xD5,0xE1,0x01,0x00,0x50,0xE1, + 0xB8,0x06,0xD6,0xB1,0x01,0x00,0x80,0xB2,0xB8,0x06,0xC6,0xB1,0xB6,0x0B,0xD5,0xE1, + 0x01,0x00,0x50,0xE1,0x02,0x00,0x00,0xAA,0x80,0x00,0x51,0xE1,0x01,0x80,0x88,0xE2, + 0x01,0x90,0x89,0xC2,0x96,0x00,0x51,0xE3,0x04,0x00,0x00,0xDA,0xB8,0x01,0x9D,0xE5, + 0xB8,0x11,0x9D,0xE5,0xB0,0x02,0xD0,0xE1,0x01,0x00,0x80,0xE2,0xB0,0x02,0xC1,0xE1, + 0x14,0x04,0x9F,0xE5,0x01,0x20,0x82,0xE2,0x00,0x00,0xD0,0xE5,0x01,0x40,0x84,0xE2, + 0x02,0x00,0x50,0xE1,0xA0,0xFF,0xFF,0xCA,0x1C,0x00,0x8D,0xE2,0x0C,0x01,0x80,0xE0, + 0x9C,0x11,0x9D,0xE5,0x60,0x20,0x90,0xE5,0x01,0xC0,0x8C,0xE2,0x02,0x10,0x81,0xE0, + 0x9C,0x11,0x8D,0xE5,0xA0,0x11,0x9D,0xE5,0x20,0x01,0x90,0xE5,0x01,0x00,0x80,0xE0, + 0xA0,0x01,0x8D,0xE5,0xD0,0x03,0x9F,0xE5,0x01,0x00,0xD0,0xE5,0x0C,0x00,0x50,0xE1, + 0x8A,0xFF,0xFF,0xCA,0x05,0xFA,0xFF,0xEB,0xB8,0x02,0xD5,0xE1,0xBE,0x00,0xC7,0xE1, + 0x00,0x00,0x95,0xE5,0x01,0x00,0x10,0xE3,0x0E,0x00,0x00,0x0A,0xA4,0x01,0x9D,0xE5, + 0x9C,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x9C,0x13,0x9F,0xE5,0x01,0x20,0xD1,0xE5, + 0x00,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0,0x64,0x20,0xA0,0xE3,0x92,0x01,0x01,0xE0, + 0x4E,0xEC,0xFF,0xEB,0xA8,0x11,0x9D,0xE5,0x01,0x00,0x80,0xE0,0xB8,0x12,0xD5,0xE1, + 0x00,0x00,0x51,0xE1,0xBE,0x00,0xC7,0x81,0x8A,0x60,0x87,0xE2,0x60,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x06,0x00,0xA0,0xE1,0x65,0xEC,0xFF,0xEB,0x58,0x03,0x9F,0xE5, + 0x00,0xA0,0xA0,0xE3,0xB0,0xA6,0xC6,0xE1,0x01,0x00,0xD0,0xE5,0x0A,0x40,0xA0,0xE1, + 0x00,0x00,0x50,0xE3,0x29,0x00,0x00,0xDA,0x1C,0x00,0x8D,0xE2,0x04,0x01,0x80,0xE0, + 0xB4,0x01,0x8D,0xE5,0x08,0x10,0xD5,0xE5,0x60,0x00,0x90,0xE5,0x64,0x20,0xA0,0xE3, + 0x91,0x00,0x00,0xE0,0x20,0x13,0x9F,0xE5,0x00,0x10,0xD1,0xE5,0x92,0x01,0x01,0xE0, + 0xB0,0x11,0x8D,0xE5,0x31,0xEC,0xFF,0xEB,0x00,0xB0,0xA0,0xE1,0xB4,0x01,0x9D,0xE5, + 0x09,0x10,0xD5,0xE5,0x20,0x01,0x90,0xE5,0x91,0x00,0x00,0xE0,0xB0,0x11,0x9D,0xE5, + 0x2A,0xEC,0xFF,0xEB,0xB0,0x11,0xD5,0xE1,0x0B,0x00,0x51,0xE1,0x01,0xB0,0xA0,0xB1, + 0xB2,0x11,0xD5,0xE1,0x00,0x00,0x51,0xE1,0x01,0x00,0xA0,0xB1,0xBC,0x10,0xD5,0xE1, + 0x00,0x00,0x4B,0xE0,0x91,0x00,0x00,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0,0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1, + 0xC0,0x0F,0x41,0xE0,0x84,0x10,0x86,0xE0,0xB0,0x03,0xC1,0xE1,0xA8,0x02,0x9F,0xE5, + 0x01,0x40,0x84,0xE2,0x01,0x00,0xD0,0xE5,0x04,0x00,0x50,0xE1,0xD5,0xFF,0xFF,0xCA, + 0x94,0x02,0x9F,0xE5,0x00,0x40,0xA0,0xE3,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0x28,0x00,0x00,0xDA,0x0A,0x10,0xD5,0xE5,0x1C,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7, + 0x64,0x20,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x6C,0x12,0x9F,0xE5,0x01,0x10,0xD1,0xE5, + 0x92,0x01,0x01,0xE0,0xAC,0x11,0x8D,0xE5,0x04,0xEC,0xFF,0xEB,0x00,0xB0,0xA0,0xE1, + 0x1C,0x00,0x8D,0xE2,0x0B,0x10,0xD5,0xE5,0x04,0x01,0x80,0xE0,0xC0,0x00,0x90,0xE5, + 0x91,0x00,0x00,0xE0,0xAC,0x11,0x9D,0xE5,0xFC,0xEB,0xFF,0xEB,0xB4,0x11,0xD5,0xE1, + 0x0B,0x00,0x51,0xE1,0x01,0xB0,0xA0,0xB1,0xB6,0x11,0xD5,0xE1,0x00,0x00,0x51,0xE1, + 0x01,0x00,0xA0,0xB1,0xBE,0x10,0xD5,0xE1,0x00,0x00,0x4B,0xE0,0x91,0x00,0x00,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x00,0x15,0x60,0xE0,0x01,0x11,0x81,0xE0, + 0x80,0x03,0x81,0xE0,0xC0,0x19,0xA0,0xE1,0xC0,0x0F,0x41,0xE0,0x84,0x10,0x86,0xE0, + 0xB0,0x00,0xC1,0xE1,0xF0,0x01,0x9F,0xE5,0x01,0x40,0x84,0xE2,0x00,0x00,0xD0,0xE5, + 0x04,0x00,0x50,0xE1,0xD6,0xFF,0xFF,0xCA,0x00,0x00,0x5A,0xE3,0x08,0x00,0x00,0xDA, + 0x14,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0,0xF0,0x10,0xD0,0xE1,0x18,0x00,0x9D,0xE5, + 0x80,0x00,0x86,0xE0,0xF0,0x03,0xD0,0xE1,0x01,0x00,0x80,0xE0,0x00,0xA0,0x5A,0xE0, + 0x00,0xA0,0xA0,0x43,0xB0,0x01,0x9F,0xE5,0xB0,0xA6,0xC6,0xE1,0x01,0x10,0xD0,0xE5, + 0x00,0x00,0xD0,0xE5,0x00,0x40,0xA0,0xE3,0x01,0x00,0x40,0xE2,0x90,0x01,0x01,0xE0, + 0xA0,0x01,0x9D,0xE5,0xD1,0xEB,0xFF,0xEB,0xA0,0x01,0x8D,0xE5,0x78,0x01,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x08,0x00,0x10,0xE3,0xA0,0x01,0x9D,0xE5,0x0F,0x00,0x00,0x0A, + 0xFA,0x00,0x50,0xE3,0x08,0x00,0x9D,0xE5,0x01,0x40,0xA0,0x83,0x80,0x00,0x58,0xE1, + 0x01,0x40,0xA0,0xC3,0x23,0x00,0x59,0xE3,0x02,0x00,0x00,0xDA,0x0C,0x00,0x9D,0xE5, + 0x23,0x00,0x50,0xE3,0x01,0x40,0xA0,0xB3,0xB6,0x00,0xD7,0xE1,0x80,0x00,0x00,0xE2, + 0x00,0x00,0x50,0xE3,0x14,0x00,0x58,0x13,0x11,0x00,0x00,0xDA,0x0F,0x00,0x00,0xEA, + 0x96,0x00,0x50,0xE3,0x08,0x00,0x9D,0xE5,0x01,0x40,0xA0,0x83,0x00,0x00,0x58,0xE1, + 0x08,0x00,0x58,0xC3,0x01,0x40,0xA0,0xC3,0x14,0x00,0x59,0xE3,0x02,0x00,0x00,0xDA, + 0x0C,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x40,0xA0,0xB3,0xB6,0x00,0xD7,0xE1, + 0x80,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0x0A,0x00,0x58,0x13,0x00,0x00,0x00,0xDA, + 0x01,0x40,0xA0,0xE3,0xF0,0x10,0xD7,0xE5,0xEE,0x00,0x87,0xE2,0x00,0x00,0x51,0xE3, + 0x04,0x10,0xD0,0x05,0x00,0x00,0x51,0x03,0x03,0x10,0xD0,0xE5,0x03,0x00,0x00,0x0A, + 0xFF,0x00,0x51,0xE3,0x05,0x00,0x00,0x2A,0x01,0x10,0x81,0xE2,0x02,0x00,0x00,0xEA, + 0x00,0x00,0x51,0xE3,0x01,0x00,0x00,0x0A,0x01,0x10,0x41,0xE2,0x03,0x10,0xC0,0xE5, + 0x03,0x10,0xD0,0xE5,0xBC,0x20,0xD5,0xE5,0x02,0x00,0x51,0xE1,0x0A,0x00,0x00,0x9A, + 0x00,0x00,0x54,0xE3,0x08,0x00,0x00,0x0A,0x00,0x10,0xD0,0xE5,0xFF,0x00,0x51,0xE3, + 0x01,0x10,0x81,0x32,0x00,0x10,0xC0,0x35,0x01,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x10,0x41,0x12,0x01,0x10,0xC0,0x15,0x0C,0x00,0x00,0xEA,0x01,0x10,0xD0,0xE5, + 0x01,0x10,0x81,0xE2,0xFF,0x10,0x01,0xE2,0x01,0x10,0xC0,0xE5,0xB9,0x20,0xD5,0xE5, + 0x02,0x00,0x51,0xE1,0x05,0x00,0x00,0x1A,0x00,0x10,0xA0,0xE3,0x01,0x10,0xC0,0xE5, + 0x00,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3,0x01,0x10,0x41,0x12,0x00,0x10,0xC0,0x15, + 0x03,0x10,0xD0,0xE5,0xBD,0x20,0xD5,0xE5,0x02,0x00,0x51,0xE1,0x6F,0xDF,0x8D,0x22, + 0xF0,0x4F,0xBD,0x28,0x1E,0xFF,0x2F,0x21,0x00,0x10,0xD0,0xE5,0x00,0x00,0x51,0xE3, + 0xBE,0x10,0xD5,0x15,0x00,0x10,0xC0,0x15,0x00,0x10,0xA0,0xE3,0x01,0x10,0xC0,0xE5, + 0x6F,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20, + 0xE8,0x07,0x00,0x20,0x00,0x00,0x00,0x10,0xD2,0x02,0x00,0x10,0x9C,0x94,0x00,0x00, + 0xFA,0x07,0x00,0x20,0x1F,0x85,0xEB,0x51,0xFE,0xB5,0x01,0x20,0x6E,0x4C,0x40,0x03, + 0xFB,0xF7,0x24,0xFA,0xFA,0xF7,0x28,0xFF,0xFC,0xF7,0xC4,0xFB,0x6B,0x4F,0x00,0x25, + 0x6B,0x48,0x7D,0x60,0xFD,0x60,0x00,0x68,0x5C,0x21,0x82,0x7F,0x06,0x00,0x60,0x36, + 0x00,0x92,0x0B,0x5C,0x20,0x30,0xF2,0x7E,0x31,0x7F,0x40,0x7F,0xFE,0xF7,0x8E,0xFA, + 0x06,0x00,0x64,0x48,0x00,0x68,0x00,0x04,0x00,0x0C,0x01,0xF0,0x17,0xFC,0x01,0xF0, + 0xF9,0xFB,0x01,0x20,0x40,0x03,0xFB,0xF7,0x01,0xFA,0xFA,0xF7,0x1F,0xFF,0x01,0x20, + 0x00,0xF0,0x2C,0xFF,0xFC,0xF7,0x0A,0xFF,0x25,0x71,0xE5,0x80,0xF6,0x1C,0x25,0x81, + 0x01,0x96,0x97,0xE0,0x57,0x48,0x00,0x68,0x00,0x04,0x00,0x0C,0x01,0xF0,0xFE,0xFB, + 0x80,0x20,0xFB,0xF7,0xEB,0xF9,0x03,0x20,0x01,0xF0,0x32,0xFB,0x01,0x20,0x40,0x03, + 0xFB,0xF7,0xE4,0xF9,0xFB,0xF7,0x70,0xFE,0x00,0x28,0x02,0xD0,0xFA,0xF7,0xE4,0xFE, + 0x01,0xE0,0xFC,0xF7,0xB9,0xFE,0x03,0x20,0x00,0xF0,0x9C,0xFE,0xFA,0xF7,0xE2,0xFE, + 0x49,0x48,0xC0,0x88,0x01,0x05,0x09,0xD5,0x00,0x07,0x48,0x48,0xFF,0x21,0x01,0x31, + 0x01,0x62,0x2B,0x21,0x41,0x62,0x05,0x21,0xC1,0x62,0x06,0xE0,0x00,0x07,0x01,0xD5, + 0x04,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0xCB,0xF8,0xFC,0xF7,0x63,0xFE,0xFC,0xF7, + 0x71,0xFE,0xFD,0xF7,0x83,0xFE,0x00,0x28,0x02,0xD0,0x7D,0x60,0xBD,0x60,0x02,0xE0, + 0x78,0x68,0x40,0x1C,0x78,0x60,0xFC,0xF7,0xDF,0xFE,0xFC,0xF7,0x4B,0xFE,0x01,0x20, + 0x80,0x03,0xFB,0xF7,0xAB,0xF9,0xFC,0xF7,0x5D,0xFE,0xFC,0xF7,0x15,0xFC,0xFC,0xF7, + 0x23,0xFD,0x00,0xF0,0x51,0xFA,0x06,0x00,0xFC,0xF7,0xCE,0xFE,0xFA,0xF7,0x7E,0xFF, + 0xFC,0xF7,0xCC,0xF9,0x00,0x28,0x02,0xD0,0x28,0x48,0x45,0x70,0x40,0xE0,0x78,0x78, + 0x00,0x28,0x11,0xD0,0x27,0x48,0x00,0x68,0x00,0x04,0x00,0x0C,0x01,0xF0,0x9E,0xFB, + 0x27,0x48,0x01,0x21,0x00,0x78,0x40,0x08,0x01,0xF0,0x08,0xFA,0x1F,0x48,0x45,0x70, + 0x25,0x71,0xE5,0x80,0x25,0x81,0x2B,0xE0,0x03,0x20,0x40,0x03,0xFB,0xF7,0x76,0xF9, + 0x03,0x20,0x01,0xF0,0x9F,0xFA,0x07,0x00,0x03,0x20,0x01,0xF0,0xD3,0xFA,0x80,0x20, + 0xFB,0xF7,0x6C,0xF9,0x00,0x2E,0x07,0xD0,0x0A,0x20,0x70,0x43,0xA0,0x21,0x4E,0x43, + 0x38,0x1A,0x37,0x18,0xFF,0x3F,0x7D,0x3F,0x16,0x48,0x00,0x78,0x16,0x49,0x09,0x78, + 0x08,0x43,0x07,0xD1,0x15,0x48,0x00,0x68,0x00,0x28,0x03,0xD0,0x39,0x00,0x01,0x20, + 0x00,0xF0,0x14,0xF9,0x09,0x4F,0x01,0x99,0x78,0x68,0x88,0x42,0x00,0xD2,0x61,0xE7, + 0x07,0x48,0x00,0x68,0x40,0x30,0x41,0x7E,0x0D,0x48,0x41,0x76,0x01,0xF0,0x50,0xFB, + 0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xDC,0x07,0x00,0x20,0x18,0x08,0x00,0x20, + 0xE8,0x07,0x00,0x20,0x14,0x08,0x00,0x20,0x40,0x00,0x00,0x20,0x80,0x90,0x00,0x40, + 0x1C,0x95,0x00,0x00,0x28,0x08,0x00,0x20,0xF5,0x07,0x00,0x20,0x10,0x08,0x00,0x20, + 0x40,0x02,0x00,0x20,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x00,0x00, + 0x03,0x48,0x04,0x49,0xC0,0x78,0x08,0x43,0x01,0x21,0x89,0x07,0x08,0x63,0x70,0x47, + 0x9C,0x94,0x00,0x00,0xC0,0x74,0x00,0x00,0x70,0xB5,0x14,0x4C,0x14,0x48,0x61,0x79, + 0x20,0x18,0x00,0x25,0x00,0x29,0x05,0xD0,0x81,0x7C,0xC8,0x29,0x0C,0xD2,0x49,0x1C, + 0x81,0x74,0x09,0xE0,0x0F,0x49,0x09,0x68,0x00,0x29,0x01,0xD1,0x85,0x76,0x03,0xE0, + 0x04,0x29,0x01,0xD9,0xFC,0xF7,0xAE,0xFA,0x0B,0x48,0x00,0x78,0x00,0x28,0x09,0xD0, + 0xFC,0xF7,0x5E,0xFB,0xE0,0x88,0xE0,0x21,0x88,0x43,0xE0,0x80,0x07,0x48,0x05,0x55, + 0xE0,0x34,0xA5,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20, + 0x3E,0x03,0x00,0x00,0x1C,0x08,0x00,0x20,0x19,0x08,0x00,0x20,0x19,0x02,0x00,0x00, + 0x10,0xB5,0xFA,0xF7,0x01,0xFE,0x03,0x20,0x40,0x03,0xFB,0xF7,0xDF,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFB,0xF7,0xDF,0xF8,0xFA,0xF7, + 0xFD,0xFD,0xFC,0xF7,0x87,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x0B,0x48,0x10,0xB4, + 0x83,0x7B,0x0B,0x48,0x09,0x49,0x00,0x68,0xE0,0x39,0xA0,0x30,0x04,0x7E,0xC8,0x88, + 0xFF,0x22,0x01,0x32,0xA3,0x42,0x06,0xD3,0x10,0x43,0xC8,0x80,0x05,0x49,0x01,0x20, + 0x08,0x70,0x10,0xBC,0x70,0x47,0x90,0x43,0xC8,0x80,0xFA,0xE7,0x20,0x01,0x00,0x20, + 0xE8,0x07,0x00,0x20,0x19,0x08,0x00,0x20,0xF8,0xB5,0xFB,0xF7,0xCD,0xF8,0x00,0x28, + 0x33,0xD1,0x1B,0x49,0x02,0x20,0x01,0xF0,0xF3,0xF9,0x02,0x20,0x01,0xF0,0xF8,0xF9, + 0x01,0xF0,0xA0,0xFA,0x17,0x4D,0x18,0x4E,0x18,0x4F,0x01,0x24,0x64,0x07,0x28,0x6A, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0xB2,0xFA,0xE0,0x6B,0x0B,0x28,0x13,0xD0,0x70,0x68, + 0x00,0x07,0x01,0xD5,0xFC,0xF7,0xB0,0xFE,0xF8,0x68,0x11,0x49,0x88,0x42,0xEE,0xD9, + 0x10,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0x02,0x20,0x01,0xF0,0xEB,0xF9,0x02,0x20, + 0x01,0xF0,0xD6,0xF9,0xE3,0xE7,0x01,0xF0,0x8B,0xFA,0x02,0x20,0x01,0xF0,0xE2,0xF9, + 0x05,0x20,0xFD,0xF7,0x45,0xFD,0x0B,0x20,0xE0,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xFF,0xFF,0x00,0x00,0xF4,0x07,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xC0,0x9F,0x00,0x00,0xF8,0xB5,0x13,0x4F,0x01,0x25,0xFC,0x03, + 0xFF,0x26,0x17,0xE0,0x78,0x68,0x00,0x07,0x14,0xD5,0xA5,0x63,0xF8,0x68,0x07,0x28, + 0x08,0xD1,0x78,0x68,0x80,0x07,0xFC,0xD5,0x00,0xF0,0x3E,0xFA,0xFC,0xF7,0xB2,0xFF, + 0xE6,0x63,0x07,0xE0,0x0B,0x28,0x0B,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07,0xFC,0xD5, + 0x00,0xF0,0x32,0xFA,0xE0,0x6B,0x0B,0x28,0xE4,0xD1,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0xF3,0xE7,0x00,0x40,0x00,0x30,0x70,0xB5,0x0C,0x00, + 0x00,0x28,0x01,0xD0,0x1E,0x48,0x0D,0xE0,0x1E,0x4D,0x69,0x68,0x68,0x69,0xFA,0xF7, + 0xE5,0xFC,0x1D,0x4A,0x91,0x68,0x4B,0x1C,0x88,0x42,0x93,0x60,0x01,0xD8,0xA8,0x69, + 0x01,0xE0,0x1A,0x48,0x00,0x68,0x04,0x1B,0xFF,0x20,0x91,0x30,0x84,0x42,0x21,0xDD, + 0xFF,0x25,0x01,0x35,0x28,0x00,0xFB,0xF7,0x29,0xF8,0x02,0x20,0x01,0xF0,0x82,0xF9, + 0x0A,0x21,0x20,0x00,0xFA,0xF7,0x68,0xFB,0x41,0x11,0x02,0x20,0x01,0xF0,0x60,0xF9, + 0x04,0x20,0xFB,0xF7,0x45,0xF8,0x02,0x20,0x01,0xF0,0x62,0xF9,0x01,0x20,0xFB,0xF7, + 0x1D,0xF8,0xFF,0x20,0xFB,0xF7,0x3C,0xF8,0x02,0x20,0x01,0xF0,0x6B,0xF9,0x28,0x00, + 0xFB,0xF7,0x04,0xF8,0x06,0x49,0x00,0x20,0x08,0x70,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x10,0x08,0x00,0x20,0x9C,0x94,0x00,0x00,0x18,0x08,0x00,0x20,0x0C,0x08,0x00,0x20, + 0x28,0x08,0x00,0x20,0x78,0x47,0xC0,0x46,0xF0,0x5F,0x2D,0xE9,0x00,0x41,0x9F,0xE5, + 0x26,0x20,0xA0,0xE3,0xF4,0x50,0x84,0xE2,0x00,0x10,0xA0,0xE3,0xFC,0x00,0x84,0xE2, + 0x6B,0xEA,0xFF,0xEB,0xEC,0x90,0x9F,0xE5,0x01,0x00,0xD9,0xE5,0x00,0x10,0xD9,0xE5, + 0x01,0x30,0x50,0xE2,0xF0,0x5F,0xBD,0x48,0x90,0x01,0x01,0xE0,0x01,0x10,0x41,0xE2, + 0x1E,0xFF,0x2F,0x41,0x00,0xA0,0xA0,0xE3,0x01,0x80,0xA0,0xE3,0xC8,0xB0,0x9F,0xE5, + 0x00,0x00,0xD9,0xE5,0x01,0x00,0x50,0xE2,0x29,0x00,0x00,0x4A,0x83,0x60,0x84,0xE0, + 0x08,0x70,0x83,0xE2,0x80,0x20,0x84,0xE0,0xFA,0x28,0xD2,0xE1,0xFA,0xCB,0xD6,0xE1, + 0x0C,0x20,0x82,0xE0,0x81,0xC0,0x8B,0xE0,0xF0,0xE0,0xDC,0xE1,0x02,0x20,0x4E,0xE0, + 0x00,0x00,0x52,0xE3,0xB0,0xA0,0xCC,0xD1,0x1A,0x00,0x00,0xDA,0xB0,0x20,0xCC,0xE1, + 0x88,0xC0,0x9F,0xE5,0x00,0xC0,0x9C,0xE5,0xBA,0xCC,0xDC,0xE1,0x02,0x00,0x5C,0xE1, + 0x09,0x00,0x00,0xCA,0x45,0x20,0xD9,0xE5,0x02,0x00,0x12,0xE3,0x06,0x00,0x00,0x0A, + 0x00,0x20,0xD9,0xE5,0x01,0x20,0x42,0xE2,0x00,0x00,0x52,0xE1,0x01,0x20,0xD9,0x05, + 0x01,0x20,0x42,0x02,0x03,0x00,0x52,0x01,0x1C,0x80,0xC4,0x15,0x50,0x20,0x9F,0xE5, + 0xB4,0xC0,0xD5,0xE1,0x81,0x20,0x82,0xE0,0xF0,0x20,0xD2,0xE1,0x0C,0x00,0x52,0xE1, + 0x04,0x00,0x00,0xDA,0x00,0x20,0x85,0xE0,0x08,0x80,0xC2,0xE5,0x00,0x20,0xD9,0xE5, + 0x05,0x20,0x82,0xE0,0x07,0x80,0xC2,0xE7,0x01,0x00,0x50,0xE2,0x01,0x10,0x41,0xE2, + 0xD7,0xFF,0xFF,0x5A,0x01,0x30,0x53,0xE2,0xD0,0xFF,0xFF,0x5A,0xF0,0x5F,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x40,0x00,0x00,0x20,0x9C,0x94,0x00,0x00,0x00,0x00,0x00,0x10, + 0xE8,0x07,0x00,0x20,0x2A,0x08,0x00,0x20,0x08,0x49,0x09,0x48,0xCA,0x68,0xC2,0x61, + 0x49,0x68,0xC1,0x61,0x07,0x49,0xCA,0x68,0x52,0x08,0x52,0x00,0xCA,0x60,0x41,0x69, + 0x89,0x06,0xFC,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5,0x70,0x47,0xC0,0x9F,0x00,0x00, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x70,0xB5,0x18,0x48,0xC0,0x68,0x07,0x28, + 0x04,0xD0,0x01,0x20,0x40,0x07,0x04,0x68,0x00,0x2C,0x03,0xD1,0x00,0x20,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0xFF,0x25,0x01,0x35,0x28,0x00,0xFA,0xF7,0x3F,0xFF,0x02,0x20, + 0x01,0xF0,0x98,0xF8,0x20,0x00,0xFD,0xF7,0xFB,0xFF,0x00,0xF0,0x15,0xF9,0x05,0x2C, + 0x07,0xD8,0x0B,0x48,0x00,0x78,0x00,0x28,0x03,0xD1,0x20,0x00,0x00,0xF0,0x14,0xF8, + 0x02,0xE0,0x20,0x00,0x00,0xF0,0x70,0xF8,0x04,0x00,0x28,0x00,0xFA,0xF7,0x1E,0xFF, + 0x04,0x49,0x00,0x20,0x08,0x70,0x20,0x00,0xD9,0xE7,0x00,0x00,0x00,0x40,0x00,0x30, + 0xF7,0x07,0x00,0x20,0x28,0x08,0x00,0x20,0x70,0xB5,0x01,0x21,0x28,0x4C,0x4A,0x07, + 0x04,0xE0,0x8B,0x00,0x9B,0x18,0x1B,0x68,0xE3,0x61,0x49,0x1C,0x81,0x42,0xF8,0xD9, + 0x24,0x48,0x20,0x60,0x21,0x20,0x80,0x02,0x20,0x61,0x03,0x20,0xFD,0xF7,0xAE,0xFB, + 0x21,0x48,0x0A,0x21,0x00,0x69,0xFA,0xF7,0xA9,0xFB,0x01,0x09,0x02,0x20,0x01,0xF0, + 0x3F,0xF8,0x1E,0x4D,0xE8,0x68,0x40,0x08,0x40,0x00,0xE8,0x60,0x02,0x20,0x01,0xF0, + 0x3F,0xF8,0x03,0x20,0xFA,0xF7,0x1C,0xFF,0x01,0x20,0xFA,0xF7,0xF7,0xFE,0x03,0x21, + 0x09,0x07,0xC8,0x68,0x08,0x22,0x10,0x43,0xC8,0x60,0x02,0x20,0x01,0xF0,0x0A,0xF8, + 0x06,0x00,0x60,0x68,0x60,0x60,0x60,0x69,0x60,0x61,0xFD,0xF7,0x95,0xFD,0x02,0x20, + 0x01,0xF0,0x38,0xF8,0x03,0x20,0xFD,0xF7,0x71,0xFB,0xE8,0x68,0x01,0x21,0x08,0x43, + 0xE8,0x60,0x0B,0x48,0x00,0x78,0x00,0x28,0x05,0xD0,0x0A,0x48,0x00,0x68,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0xDB,0xF8,0x30,0x00,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x40,0x00,0x30,0xD0,0x10,0x05,0x00,0x9C,0x94,0x00,0x00,0x00,0x20,0x00,0x40, + 0x28,0x08,0x00,0x20,0x14,0x08,0x00,0x20,0xF8,0xB5,0x05,0x00,0x41,0x48,0x00,0x27, + 0x00,0x78,0x00,0x28,0x03,0xD0,0x6D,0x1C,0xFD,0xF7,0x4E,0xFA,0x07,0x00,0x3E,0x48, + 0x00,0x68,0x3E,0x4E,0xF0,0x61,0x3E,0x48,0x02,0x24,0x00,0x69,0x0A,0x21,0xFA,0xF7, + 0x4D,0xFB,0x01,0x00,0x02,0x20,0x00,0xF0,0xE3,0xFF,0x02,0x20,0x00,0xF0,0xE8,0xFF, + 0x38,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x32,0x48,0x21,0x07,0x00,0x78, + 0x1A,0xE0,0x72,0x69,0x52,0x06,0x0A,0xD4,0x00,0x28,0x01,0xD0,0xAC,0x42,0x04,0xD2, + 0xA2,0x00,0x52,0x18,0x12,0x68,0xF2,0x61,0x00,0xE0,0xF7,0x61,0x64,0x1C,0x2E,0x4A, + 0x12,0x78,0x00,0x2A,0x08,0xD0,0xFD,0xF7,0x13,0xFB,0x2C,0x48,0x00,0x68,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0x8B,0xF8,0x01,0xE0,0xAC,0x42,0xE2,0xD9,0x02,0x20,0x00,0xF0, + 0xD1,0xFF,0x25,0x4D,0x28,0x78,0x00,0x28,0x31,0xD1,0xFD,0xF7,0x69,0xFA,0x00,0x28, + 0x2D,0xD0,0x1F,0x48,0x0A,0x21,0x00,0x69,0xFA,0xF7,0x10,0xFB,0x01,0x00,0x02,0x20, + 0x00,0xF0,0xA6,0xFF,0x02,0x20,0x00,0xF0,0xAB,0xFF,0x1C,0x4C,0x09,0xE0,0x28,0x78, + 0x00,0x28,0x06,0xD0,0xFD,0xF7,0xEC,0xFA,0x20,0x68,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0x65,0xF8,0xFD,0xF7,0x4D,0xFA,0x00,0x28,0xF1,0xD1,0x70,0x68,0x70,0x60,0x08,0xE0, + 0x28,0x78,0x00,0x28,0x05,0xD0,0x20,0x68,0x00,0x04,0x00,0x0C,0x01,0xF0,0x56,0xF8, + 0x02,0xE0,0x70,0x68,0xC0,0x03,0xF3,0xD5,0x02,0x20,0x00,0xF0,0x9B,0xFF,0x00,0xF0, + 0x1B,0xF8,0x08,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0xF8,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0xF7,0x07,0x00,0x20,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30, + 0x9C,0x94,0x00,0x00,0x00,0x20,0x00,0x40,0x28,0x08,0x00,0x20,0x14,0x08,0x00,0x20, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02, + 0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0xCF,0xFC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x70,0x47,0x00,0x00,0x04,0x49,0x02,0x68,0x0A,0x62,0x42,0x68, + 0x4A,0x62,0x82,0x68,0x4A,0x63,0xC0,0x68,0xC8,0x62,0x70,0x47,0x80,0x90,0x00,0x40, + 0x78,0x47,0xC0,0x46,0x01,0x00,0x80,0xE0,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x01,0x00,0x80,0xE0,0x02,0x00,0x80,0xE0,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x01,0x00,0x80,0xE0,0x00,0xC0,0x9D,0xE5,0x02,0x00,0x80,0xE0,0x03,0x00,0x80,0xE0, + 0x0C,0x00,0x80,0xE0,0x1E,0xFF,0x2F,0xE1,0x70,0xB5,0x06,0x00,0x11,0x49,0xD9,0x20, + 0xC0,0x00,0xE3,0x22,0x08,0x18,0xD2,0x00,0x89,0x18,0x0C,0x00,0x20,0x34,0xA2,0x7D, + 0x0D,0x4D,0x92,0x19,0x08,0xD0,0x38,0x22,0xFA,0xF7,0xB2,0xFA,0xA0,0x7D,0x80,0x19, + 0xA8,0x75,0x70,0xBC,0x08,0xBC,0x18,0x47,0xAA,0x7D,0x00,0x2A,0x05,0xD0,0x38,0x22, + 0xFA,0xF7,0xA6,0xFA,0x01,0x20,0xA0,0x75,0xF3,0xE7,0x38,0x22,0x00,0x21,0xFA,0xF7, + 0x99,0xFA,0xEE,0xE7,0x40,0x00,0x00,0x20,0x28,0x07,0x00,0x20,0xF8,0xB5,0x1D,0x4C, + 0x89,0x20,0x80,0x00,0x25,0x18,0x22,0x00,0x10,0x18,0xEE,0x1D,0x07,0x00,0xF9,0x36, + 0x31,0x7D,0xFF,0x30,0x09,0x30,0x78,0x37,0x00,0x29,0x00,0x90,0x0E,0xD0,0x78,0x22, + 0x29,0x00,0x38,0x00,0xFA,0xF7,0x84,0xFA,0x00,0x98,0x0C,0x22,0x31,0x1F,0xFA,0xF7, + 0x7F,0xFA,0x30,0x7D,0x70,0x75,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x0C,0x22,0x00,0x21, + 0xFA,0xF7,0x70,0xFA,0x78,0x22,0x00,0x21,0x38,0x00,0xFA,0xF7,0x6B,0xFA,0x28,0x00, + 0x0C,0x22,0x00,0x21,0xF0,0x30,0xFA,0xF7,0x65,0xFA,0x00,0x21,0x71,0x75,0xE0,0x88, + 0x13,0x22,0x90,0x43,0xE0,0x80,0x1B,0x20,0x80,0x01,0x20,0x18,0xC1,0x70,0x01,0x71, + 0xE1,0xE7,0x00,0x00,0x40,0x00,0x00,0x20,0xF0,0xB5,0x04,0x00,0x84,0x48,0x95,0xB0, + 0x01,0x90,0x84,0x48,0x84,0x49,0x00,0x78,0x00,0x28,0x83,0x48,0x16,0xD0,0x80,0x30, + 0xC2,0x89,0x18,0x27,0x09,0x92,0x02,0x8A,0x08,0x92,0x42,0x8A,0x07,0x92,0x1C,0x22, + 0x82,0x5E,0x06,0x92,0x1E,0x22,0x82,0x5E,0x05,0x92,0x1A,0x22,0x82,0x5E,0xC7,0x5F, + 0x04,0x92,0x14,0x22,0x16,0x23,0x82,0x5E,0xC3,0x5E,0x15,0xE0,0x20,0x30,0x80,0x7A, + 0x34,0x27,0x30,0x22,0x09,0x90,0x88,0x8D,0x08,0x90,0xC8,0x8D,0x07,0x90,0x38,0x20, + 0x08,0x5E,0x06,0x90,0x3A,0x20,0x08,0x5E,0x05,0x90,0x36,0x20,0x08,0x5E,0xCF,0x5F, + 0x32,0x23,0x04,0x90,0x8A,0x5E,0xCB,0x5E,0x20,0x88,0x6B,0x4D,0x02,0xA9,0x80,0x18, + 0x20,0x80,0x60,0x88,0xC0,0x18,0x60,0x80,0x00,0x20,0x6B,0x46,0x18,0x81,0x98,0x81, + 0xA8,0x8B,0x40,0x1E,0xD8,0x81,0xE8,0x8B,0x40,0x1E,0x58,0x81,0x06,0xC9,0x20,0x00, + 0x00,0xF0,0xB2,0xFF,0xA8,0x8B,0x64,0x21,0x0C,0x90,0xE8,0x8B,0x0B,0x90,0x0C,0x98, + 0x45,0x08,0x0B,0x98,0x46,0x08,0x08,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x08,0x98, + 0x08,0x1A,0x12,0x90,0x07,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x07,0x98,0x08,0x1A, + 0x11,0x90,0x55,0x48,0x01,0x78,0x40,0x78,0x0A,0x90,0x01,0x98,0x20,0x30,0x00,0x7A, + 0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E,0x09,0x06,0x09,0x0E,0x04,0xE0, + 0x0A,0x98,0x40,0x1E,0x00,0x06,0x00,0x0E,0x0A,0x90,0x28,0x00,0xFA,0xF7,0x4C,0xF8, + 0x0C,0x99,0x08,0x1A,0x40,0x1E,0x0F,0x90,0x0A,0x99,0x30,0x00,0xFA,0xF7,0x44,0xF8, + 0x0B,0x99,0x08,0x1A,0x40,0x1E,0x39,0x1E,0x0E,0x90,0x00,0xDD,0xE9,0x1B,0x04,0x98, + 0x00,0x28,0x10,0x90,0x01,0xDD,0x30,0x1A,0x10,0x90,0x00,0x20,0x20,0x5E,0xA8,0x42, + 0x14,0x90,0x01,0xDB,0x40,0x1B,0x01,0xE0,0x40,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC, + 0x40,0x42,0x64,0x22,0x07,0x00,0x57,0x43,0x88,0x42,0x0D,0x97,0x0F,0xDD,0x42,0x1A, + 0x12,0x98,0x50,0x43,0xC7,0x19,0x10,0x00,0x50,0x43,0x12,0x9A,0x50,0x43,0x0F,0x9A, + 0x52,0x1B,0x51,0x1A,0xFA,0xF7,0x18,0xF8,0x0D,0x99,0x40,0x18,0x0D,0x90,0x06,0x98, + 0x00,0x28,0x01,0xD1,0x38,0x00,0x06,0xE0,0x01,0x28,0x01,0xD1,0x0D,0x98,0x02,0xE0, + 0x0D,0x99,0x78,0x00,0x40,0x1A,0x64,0x21,0xFA,0xF7,0x06,0xF8,0x09,0x99,0xC9,0x07, + 0x07,0xD0,0x14,0x99,0xA9,0x42,0x01,0xDB,0x28,0x18,0x01,0xE0,0x28,0x1A,0x40,0x1E, + 0x20,0x80,0x02,0x20,0x20,0x5E,0xB0,0x42,0x13,0x90,0x01,0xDB,0x80,0x1B,0x01,0xE0, + 0x80,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21,0x05,0x00,0x4D,0x43, + 0x10,0x99,0x2F,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x11,0x98,0x10,0x9A,0x48,0x43, + 0x45,0x19,0x08,0x00,0x48,0x43,0x11,0x99,0x48,0x43,0x0E,0x99,0x89,0x1B,0x89,0x1A, + 0xF9,0xF7,0xDA,0xFF,0xC7,0x19,0x05,0x98,0x00,0x28,0x01,0xD1,0x28,0x00,0x05,0xE0, + 0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0,0x68,0x00,0xC0,0x1B,0x64,0x21,0xF9,0xF7, + 0xCB,0xFF,0x09,0x99,0x89,0x07,0x07,0xD5,0x13,0x99,0xB1,0x42,0x01,0xDB,0x30,0x18, + 0x01,0xE0,0x30,0x1A,0x40,0x1E,0x60,0x80,0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xA4,0x06,0x00,0x20,0xFA,0x07,0x00,0x20,0x9C,0x94,0x00,0x00,0xFF,0xB5,0x00,0x68, + 0x8E,0x46,0x84,0x46,0x70,0x46,0x1B,0x4B,0x1B,0x49,0x05,0x68,0x00,0x22,0x19,0x4E, + 0x54,0x00,0x24,0x3E,0x34,0x5B,0x66,0x46,0x00,0x20,0x34,0x1B,0x26,0x00,0x74,0x43, + 0x46,0x00,0x9E,0x5B,0xAE,0x1B,0x37,0x00,0x77,0x43,0xE6,0x19,0x8E,0x42,0x18,0xD2, + 0x51,0x00,0x10,0x4A,0x40,0x00,0x24,0x3A,0x52,0x5A,0x02,0x99,0x0A,0x60,0x0D,0x49, + 0x03,0x9A,0x16,0x39,0x0C,0x5A,0x14,0x60,0x09,0x5A,0x72,0x46,0x12,0x68,0x18,0x5A, + 0x51,0x18,0x09,0x1A,0x70,0x46,0x01,0x60,0x01,0x20,0x04,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x40,0x1C,0x0B,0x28,0xDB,0xD3,0x52,0x1C,0x07,0x2A,0xCF,0xD3,0x00,0x20, + 0xC0,0x43,0xF2,0xE7,0xB0,0x71,0x00,0x00,0xD9,0x02,0x00,0x00,0xF0,0xB5,0x5B,0x48, + 0x89,0x21,0x89,0x00,0x46,0x18,0xD9,0x21,0xC9,0x00,0x45,0x18,0x85,0xB0,0x01,0x90, + 0x57,0x49,0x44,0x20,0x42,0x5D,0x08,0x7D,0x56,0x4B,0x00,0x24,0x00,0x2A,0x04,0x93, + 0x25,0xD1,0x00,0x28,0x23,0xD0,0x00,0x20,0x07,0x00,0x02,0x90,0x0A,0x20,0x78,0x43, + 0x80,0x19,0x00,0x90,0x80,0x1D,0xFD,0xF7,0xE9,0xF9,0x00,0x28,0x13,0xD0,0x04,0x98, + 0x00,0x7A,0xA0,0x42,0x12,0xD9,0x00,0x98,0x01,0x79,0x02,0x98,0x28,0x18,0x40,0x30, + 0x01,0x71,0x02,0x98,0x00,0x99,0x40,0x1C,0x02,0x90,0x01,0x20,0x00,0xF0,0x4E,0xF9, + 0x00,0x28,0x00,0xD1,0x64,0x1C,0x7F,0x1C,0x0C,0x2F,0xDF,0xDB,0x78,0xE0,0x49,0x7D, + 0x00,0x29,0x01,0xD1,0x00,0x28,0x73,0xD0,0x00,0x27,0xE9,0x19,0x44,0x20,0x08,0x56, + 0x40,0x1E,0x33,0xD4,0x31,0x18,0xFC,0x20,0x08,0x56,0x40,0x1E,0x06,0xD4,0x01,0x99, + 0x0D,0x22,0x92,0x01,0x89,0x18,0x09,0x7E,0x00,0x29,0x14,0xD0,0x0A,0x21,0x48,0x43, + 0x81,0x19,0x78,0x31,0x04,0x20,0x00,0xF0,0x29,0xF9,0x00,0x28,0x00,0xD1,0x64,0x1C, + 0x38,0x00,0x04,0xE0,0x29,0x18,0x40,0x31,0x4A,0x79,0x40,0x1C,0x0A,0x71,0x0C,0x28, + 0xF8,0xDB,0x7F,0x1E,0x0F,0xE0,0x0A,0x21,0x48,0x43,0x80,0x19,0x00,0x90,0x80,0x1D, + 0xFD,0xF7,0x9C,0xF9,0x00,0x28,0x06,0xD0,0x00,0x99,0x02,0x20,0x00,0xF0,0x0E,0xF9, + 0x00,0x28,0x00,0xD1,0x64,0x1C,0x7F,0x1C,0x0C,0x2F,0xC6,0xDB,0x01,0x98,0x0D,0x21, + 0x00,0x27,0x89,0x01,0x40,0x18,0x03,0x90,0x00,0x7E,0x00,0x28,0x30,0xD1,0xF1,0x19, + 0xFC,0x20,0x08,0x56,0x40,0x1E,0x25,0xD4,0x0A,0x21,0x48,0x43,0x80,0x19,0x00,0x90, + 0x80,0x1D,0xFD,0xF7,0x7B,0xF9,0x00,0x28,0x1C,0xD0,0x04,0x98,0x00,0x7A,0xA0,0x42, + 0x1E,0xD9,0x00,0x20,0x2A,0x18,0x44,0x21,0x51,0x56,0x4A,0x1E,0xBA,0x42,0x11,0xD0, + 0x49,0x1E,0x0C,0xD5,0x00,0x99,0x28,0x18,0x09,0x79,0x40,0x30,0x01,0x71,0x00,0x99, + 0x01,0x20,0x00,0xF0,0xDB,0xF8,0x00,0x28,0x04,0xD1,0x64,0x1C,0x02,0xE0,0x40,0x1C, + 0x0C,0x28,0xE7,0xDB,0x7F,0x1C,0x0C,0x2F,0x02,0xDA,0x03,0x98,0xCC,0xE7,0xFF,0xE7, + 0x00,0xF0,0xE4,0xFC,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20, + 0x64,0x03,0x00,0x20,0xBC,0x94,0x00,0x00,0x10,0xB5,0xFC,0xF7,0x0B,0xF8,0xFC,0xF7, + 0x93,0xF8,0xFC,0xF7,0x99,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x01,0x28,0x01,0xD1, + 0x0E,0x48,0x00,0xE0,0x0E,0x48,0x0F,0x49,0x00,0x68,0x82,0x68,0x4A,0x61,0xC2,0x68, + 0x8A,0x61,0x02,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0xCA,0x61,0x42,0x69,0x0A,0x62, + 0x09,0x4A,0x92,0x79,0x00,0x2A,0x03,0xD0,0x08,0x48,0xC8,0x60,0x08,0x48,0x02,0xE0, + 0x02,0x68,0xCA,0x60,0x40,0x68,0x08,0x61,0x70,0x47,0x00,0x00,0xF0,0x07,0x00,0x20, + 0xEC,0x07,0x00,0x20,0xC0,0x90,0x00,0x40,0xF4,0x07,0x00,0x20,0x41,0x42,0x01,0x00, + 0x10,0x00,0x10,0x00,0x0C,0x49,0x01,0x28,0x01,0xD1,0x0C,0x48,0x00,0xE0,0x0C,0x48, + 0xFF,0x31,0x01,0x31,0x49,0x7D,0x00,0x68,0x02,0x29,0x01,0xD9,0x01,0x6A,0x04,0xE0, + 0x02,0x29,0x01,0xD1,0xC1,0x69,0x00,0xE0,0x81,0x69,0x06,0x4A,0x51,0x62,0x41,0x6A, + 0x91,0x62,0x80,0x6A,0x10,0x63,0x70,0x47,0x64,0x02,0x00,0x20,0xF0,0x07,0x00,0x20, + 0xEC,0x07,0x00,0x20,0xC0,0x90,0x00,0x40,0x01,0x28,0x01,0xD1,0x0A,0x48,0x00,0xE0, + 0x0A,0x48,0x0B,0x49,0x00,0x68,0xC2,0x6A,0x0A,0x61,0x02,0x6B,0x4A,0x61,0x42,0x6B, + 0x8A,0x61,0x82,0x6B,0xCA,0x61,0xC2,0x6B,0x0A,0x62,0x02,0x6C,0x4A,0x62,0x42,0x6C, + 0x8A,0x62,0x80,0x6C,0xC8,0x62,0x70,0x47,0xF0,0x07,0x00,0x20,0xEC,0x07,0x00,0x20, + 0x40,0xA1,0x00,0x40,0x12,0x49,0x10,0xB4,0x4A,0x79,0x10,0x48,0x02,0x72,0x8A,0x79, + 0x42,0x72,0x02,0x7A,0xD3,0x07,0x0D,0xD0,0x94,0x07,0x0E,0x4A,0x0E,0x4B,0x04,0xD5, + 0x12,0x78,0x52,0x1E,0x82,0x73,0x00,0x22,0x03,0xE0,0x52,0x78,0x52,0x1E,0x82,0x73, + 0x01,0x22,0x1A,0x70,0x8A,0x7A,0xC2,0x73,0xCA,0x7A,0x02,0x74,0x0A,0x7B,0x42,0x74, + 0x4A,0x7B,0x82,0x74,0x89,0x7B,0xC1,0x74,0x10,0xBC,0x70,0x47,0xC4,0x06,0x00,0x20, + 0xDC,0x94,0x00,0x00,0x9C,0x94,0x00,0x00,0xF4,0x07,0x00,0x20,0x0E,0x49,0x10,0xB5, + 0xC9,0x88,0x00,0x28,0x06,0xD0,0x03,0x24,0x08,0x07,0x01,0xD5,0x04,0x20,0x07,0xE0, + 0x03,0x20,0x05,0xE0,0x01,0x24,0x08,0x07,0x01,0xD5,0x02,0x20,0x00,0xE0,0x01,0x20, + 0x00,0xF0,0xC6,0xF9,0x20,0x00,0xFF,0xF7,0x9F,0xFF,0x20,0x00,0xFF,0xF7,0x4E,0xFF, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xF3,0xB5,0x37,0x4F, + 0x89,0x20,0x80,0x00,0x3E,0x18,0xE3,0x20,0x0C,0x00,0xC0,0x00,0x3D,0x18,0x81,0xB0, + 0x01,0x99,0x20,0x00,0xFA,0xF7,0x6A,0xFF,0x00,0x28,0x5C,0xD1,0x0D,0x20,0xC0,0x01, + 0x38,0x18,0x00,0x7B,0xC0,0x07,0x01,0xD1,0x02,0x20,0xE0,0x71,0x01,0x98,0x80,0x07, + 0x80,0x0F,0x02,0xD1,0xE0,0x79,0x06,0x28,0x32,0xD1,0x20,0x79,0xA9,0x8E,0x01,0x22, + 0x40,0x1E,0x82,0x40,0x11,0x43,0xA9,0x86,0x29,0x68,0x10,0x22,0xD1,0x41,0x12,0x06, + 0x89,0x18,0x10,0x22,0xD1,0x41,0x29,0x60,0x80,0x00,0x40,0x19,0x41,0x68,0x22,0x79, + 0x09,0x01,0x09,0x09,0x12,0x07,0x11,0x43,0x1D,0x4A,0x41,0x60,0x11,0x40,0x22,0x88, + 0x12,0x05,0x12,0x0A,0x11,0x43,0x0B,0x0B,0x41,0x60,0x61,0x88,0x1B,0x03,0x09,0x05, + 0x09,0x0D,0x0B,0x43,0x0F,0x21,0x43,0x60,0x62,0x79,0x09,0x06,0x8B,0x43,0x0F,0x21, + 0x0F,0x2A,0x00,0xD9,0x11,0x00,0x09,0x07,0x09,0x09,0x0B,0x43,0x43,0x60,0x19,0xE0, + 0x0A,0x28,0x17,0xD1,0x00,0x20,0xF3,0x1D,0xF9,0x33,0x10,0xE0,0x0A,0x21,0x41,0x43, + 0x89,0x19,0x0A,0x00,0x60,0x31,0x25,0x79,0x0F,0x7F,0xBD,0x42,0x06,0xD1,0x40,0x32, + 0x15,0x8F,0x25,0x80,0x52,0x8F,0x62,0x80,0x49,0x7F,0x61,0x71,0x40,0x1C,0x59,0x7D, + 0x81,0x42,0xEB,0xDC,0x00,0x20,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20, + 0xFF,0x0F,0x00,0xFF,0x0F,0x49,0x10,0xB5,0xC8,0x79,0x00,0x28,0x11,0xD0,0x00,0x09, + 0x00,0x01,0x00,0x22,0x40,0x28,0x0B,0xD0,0x80,0x28,0x0A,0xD1,0x01,0x20,0xC8,0x70, + 0x09,0x4B,0x08,0x71,0x48,0x71,0x1B,0x79,0x00,0x2B,0x05,0xD1,0x8A,0x71,0x04,0xE0, + 0x8A,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x88,0x71,0x00,0x20,0x00,0xF0,0x6E,0xFA, + 0xF7,0xE7,0x00,0x00,0xF4,0x07,0x00,0x20,0x1C,0x95,0x00,0x00,0xF8,0xB5,0x06,0x9F, + 0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7, + 0x53,0xFD,0x38,0x80,0x21,0x00,0x30,0x00,0xF9,0xF7,0x4E,0xFD,0x28,0x80,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42, + 0x04,0xDA,0x25,0x80,0x66,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB, + 0x20,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91, + 0xF9,0xF7,0x32,0xFD,0x40,0x19,0x20,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43, + 0xF9,0xF7,0x2A,0xFD,0x80,0x19,0x60,0x80,0xE5,0xE7,0x37,0xB5,0x00,0x2A,0x02,0xDA, + 0x50,0x42,0x02,0x04,0x12,0x14,0x6B,0x46,0x1C,0x79,0x58,0x79,0x94,0x42,0x04,0xDC, + 0x19,0x88,0x91,0x42,0x04,0xDA,0x02,0x20,0x18,0x5E,0x3E,0xBC,0x08,0xBC,0x18,0x47, + 0x5B,0x88,0x12,0x1B,0x09,0x1B,0x18,0x1A,0x50,0x43,0x00,0x04,0x00,0x14,0xF9,0xF7, + 0x0B,0xFD,0x20,0x18,0x00,0x04,0x00,0x14,0xEF,0xE7,0x00,0x00,0x82,0x79,0x0A,0x49, + 0x52,0x07,0x10,0xD5,0x0A,0x68,0x18,0x23,0xDA,0x41,0x01,0x23,0x5B,0x07,0xD2,0x18, + 0x08,0x23,0xDA,0x41,0x0A,0x60,0x43,0x79,0x01,0x20,0x5B,0x1E,0x98,0x40,0xC0,0x06, + 0xC0,0x0A,0x02,0x43,0x0A,0x60,0x70,0x47,0x58,0x07,0x00,0x20,0x30,0xB4,0x0E,0x4D, + 0x0C,0x4C,0x2D,0x78,0x45,0x43,0x68,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A, + 0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2, + 0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x9C,0x94,0x00,0x00,0x10,0xB4,0x05,0x4C, + 0x03,0x4B,0x24,0x78,0x44,0x43,0x60,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0x9C,0x94,0x00,0x00,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78, + 0x43,0x43,0x58,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A, + 0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D, + 0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0x9C,0x94,0x00,0x00,0xF0,0xB4,0x15,0x4A,0x00,0x21,0x13,0x79, + 0x14,0x00,0x40,0x3C,0x1E,0x02,0x1E,0x43,0x23,0x78,0x10,0x4D,0x43,0x43,0x12,0xE0, + 0x94,0x7A,0x8C,0x42,0x0D,0xD0,0xD4,0x7A,0x8C,0x42,0x0A,0xD0,0x14,0x7B,0x8C,0x42, + 0x07,0xD0,0x54,0x7B,0x8C,0x42,0x04,0xD0,0x94,0x7B,0x8C,0x42,0x01,0xD0,0x5C,0x00, + 0x2E,0x53,0x5B,0x1C,0x49,0x1C,0x06,0x4C,0x40,0x3C,0x24,0x78,0x27,0x00,0x47,0x43, + 0x3C,0x19,0x9C,0x42,0xE4,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xDC,0x94,0x00,0x00,0xF0,0xB4,0x13,0x4A,0x00,0x21,0x14,0x79,0x15,0x00,0x10,0x4E, + 0x23,0x02,0x23,0x43,0x40,0x3D,0x13,0xE0,0x94,0x7A,0x8C,0x42,0x0D,0xD0,0xD4,0x7A, + 0x8C,0x42,0x0A,0xD0,0x14,0x7B,0x8C,0x42,0x07,0xD0,0x54,0x7B,0x8C,0x42,0x04,0xD0, + 0x94,0x7B,0x8C,0x42,0x01,0xD0,0x44,0x00,0x33,0x53,0x2C,0x78,0x20,0x18,0x49,0x1C, + 0x6C,0x78,0x2F,0x78,0x7C,0x43,0x84,0x42,0xE6,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xDC,0x94,0x00,0x00,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0xB5,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x70,0xB5,0x1C,0x49,0x1C,0x4A,0x0C,0x00,0x54,0x34,0x70,0xCC,0x03,0x00,0x00,0xF0, + 0x99,0xFB,0x06,0x04,0x0A,0x10,0x16,0x20,0x28,0x1D,0x08,0x68,0x10,0x62,0xC8,0x69, + 0x50,0x62,0x88,0x6B,0x22,0xE0,0x48,0x68,0x10,0x62,0x08,0x6A,0x50,0x62,0xC8,0x6B, + 0x0A,0xE0,0x88,0x68,0x10,0x62,0x48,0x6A,0x50,0x62,0x08,0x6C,0x0E,0xE0,0xC8,0x68, + 0x10,0x62,0x88,0x6A,0x50,0x62,0x48,0x6C,0xD0,0x62,0x55,0x63,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x08,0x69,0x10,0x62,0xC8,0x6A,0x50,0x62,0x88,0x6C,0xD0,0x62,0x56,0x63, + 0xF4,0xE7,0x48,0x69,0x10,0x62,0x08,0x6B,0x50,0x62,0xC8,0x6C,0xD0,0x62,0x54,0x63, + 0xEC,0xE7,0x00,0x00,0x44,0x95,0x00,0x00,0x80,0x90,0x00,0x40,0x0A,0x49,0x30,0xB4, + 0x0B,0x69,0xFF,0x20,0x00,0x02,0x83,0x43,0x08,0x48,0x00,0x68,0x02,0x79,0x44,0x79, + 0x85,0x79,0x12,0x02,0x1A,0x43,0x0A,0x61,0xC0,0x79,0x2A,0x04,0x23,0x02,0x1A,0x43, + 0x02,0x43,0x4A,0x60,0x30,0xBC,0x70,0x47,0x00,0x90,0x00,0x40,0xE8,0x07,0x00,0x20, + 0x70,0xB5,0x20,0x4C,0x19,0x21,0x49,0x01,0x61,0x18,0x4B,0x7E,0x1E,0x4D,0x20,0x00, + 0x29,0x68,0x00,0x22,0xF4,0x30,0x02,0x2B,0x01,0xD9,0x89,0x8C,0x02,0xE0,0x02,0x2B, + 0x15,0xD1,0x49,0x8C,0xC1,0x80,0xE1,0x88,0x89,0x05,0x00,0xD5,0x64,0x22,0xFF,0x21, + 0x9D,0x31,0xC3,0x88,0x09,0x5B,0x59,0x18,0x89,0x18,0x01,0x80,0x29,0x68,0xC9,0x8C, + 0x41,0x80,0x41,0x88,0x02,0x88,0x91,0x42,0x0A,0xD2,0x81,0x80,0x09,0xE0,0x0F,0x4B, + 0x1B,0x78,0x00,0x2B,0x02,0xD0,0x0E,0x49,0x89,0x89,0xE3,0xE7,0x09,0x8C,0xE1,0xE7, + 0x82,0x80,0x29,0x68,0x20,0x89,0x40,0x31,0x89,0x7F,0x48,0x43,0x00,0xF0,0x20,0xFB, + 0xE0,0x1D,0xFF,0x30,0xFA,0x30,0xC1,0x80,0xE2,0x89,0x89,0x18,0xC1,0x80,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x40,0x00,0x00,0x20,0xE8,0x07,0x00,0x20,0xFA,0x07,0x00,0x20, + 0x1C,0x95,0x00,0x00,0xF0,0xB5,0x33,0x4E,0xE3,0x20,0xC0,0x00,0x85,0xB0,0x30,0x18, + 0x00,0x90,0x00,0x21,0x6B,0x46,0x30,0x48,0x99,0x80,0x19,0x81,0x82,0x8B,0x52,0x1E, + 0x12,0x04,0x12,0x14,0x5A,0x81,0xC0,0x8B,0x40,0x1E,0x04,0x04,0x2B,0x48,0x24,0x14, + 0xDC,0x80,0x00,0x78,0x00,0x28,0x09,0xD1,0x27,0x48,0x20,0x30,0xC0,0x7A,0x09,0x18, + 0x19,0x81,0x11,0x1A,0x98,0x80,0x20,0x1A,0x59,0x81,0xD8,0x80,0x1D,0x20,0x00,0x24, + 0x80,0x01,0x37,0x18,0xB8,0x89,0xE0,0x40,0xC0,0x07,0x2B,0xD0,0x20,0x49,0xA0,0x00, + 0x80,0x19,0x45,0x18,0x28,0x68,0x6B,0x46,0x00,0x02,0x00,0x0D,0x98,0x81,0x28,0x68, + 0x00,0x05,0x00,0x0D,0xD8,0x81,0x19,0x48,0x00,0x78,0x00,0x28,0x02,0xD1,0x03,0xA8, + 0xFF,0xF7,0x92,0xFA,0x01,0xA9,0x06,0xC9,0x03,0xA8,0x00,0xF0,0x8D,0xFA,0x03,0xA8, + 0x00,0xF0,0x00,0xF9,0x13,0x49,0x28,0x68,0x6B,0x46,0x08,0x40,0x99,0x89,0x09,0x05, + 0x09,0x0A,0x08,0x43,0x28,0x60,0xD9,0x89,0x00,0x0B,0x00,0x03,0x09,0x05,0x09,0x0D, + 0x08,0x43,0x28,0x60,0x00,0x98,0x00,0x68,0x00,0x04,0x00,0x0F,0xA0,0x42,0x04,0xD9, + 0x64,0x1C,0x24,0x06,0x24,0x0E,0x0A,0x2C,0xC4,0xD3,0x05,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x9C,0x94,0x00,0x00,0xF9,0x07,0x00,0x20, + 0x1C,0x07,0x00,0x00,0xFF,0x0F,0x00,0xFF,0x09,0x48,0x0A,0x4A,0xC3,0x69,0x0A,0x49, + 0x93,0x42,0x07,0xD1,0x09,0x4B,0xDB,0x88,0x1B,0x07,0x01,0xD5,0xCB,0x68,0x00,0xE0, + 0x8B,0x68,0xC3,0x61,0x83,0x69,0x93,0x42,0x01,0xD1,0x49,0x68,0x81,0x61,0x70,0x47, + 0xF4,0x07,0x00,0x20,0xFF,0xFF,0x00,0x00,0x9C,0x94,0x00,0x00,0x40,0x00,0x00,0x20, + 0x08,0x48,0x10,0xB5,0xC4,0x68,0xE0,0x07,0x05,0xD0,0x07,0x48,0x40,0x78,0x00,0x28, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x00,0xF0,0x08,0xF8,0x20,0x0C,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xF4,0x07,0x00,0x20,0x1C,0x95,0x00,0x00,0x70,0xB4,0x0D,0x4A, + 0x0D,0x4C,0xD1,0x88,0x0D,0x4D,0x0E,0x4E,0x08,0x23,0x00,0x28,0x07,0xD0,0x0D,0x48, + 0x19,0x43,0xD1,0x80,0x20,0x60,0x0C,0x48,0x28,0x60,0x0C,0x48,0x06,0xE0,0x0C,0x48, + 0x99,0x43,0xD1,0x80,0x20,0x60,0x0B,0x48,0x28,0x60,0x0B,0x48,0x30,0x60,0x70,0xBC, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0xE8,0x07,0x00,0x20,0xEC,0x07,0x00,0x20, + 0xF0,0x07,0x00,0x20,0x9C,0x92,0x00,0x00,0xB8,0x93,0x00,0x00,0x50,0x94,0x00,0x00, + 0xCC,0x91,0x00,0x00,0x6C,0x93,0x00,0x00,0x04,0x94,0x00,0x00,0xF0,0xB5,0x05,0x00, + 0x85,0xB0,0x36,0x4E,0x0F,0x00,0x68,0x46,0xF9,0xF7,0x64,0xFF,0x00,0x20,0xFF,0xF7, + 0x7F,0xFE,0xFB,0xF7,0x59,0xFC,0x2C,0x00,0x68,0x00,0x04,0x90,0x46,0xE0,0x68,0x1E, + 0x84,0x42,0x01,0xD1,0xFB,0xF7,0x86,0xFC,0xFB,0xF7,0x1C,0xFC,0xFB,0xF7,0x94,0xFC, + 0x00,0x2F,0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x08,0xFC,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7, + 0xFD,0xFB,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x04,0x98, + 0x05,0x21,0xF9,0xF7,0xF3,0xFB,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20, + 0x0C,0xE0,0x05,0x21,0x28,0x00,0xF9,0xF7,0xE9,0xFB,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7,0xDA,0xF9, + 0x0C,0xE0,0x04,0x98,0x03,0x21,0xF9,0xF7,0xD9,0xFB,0xA0,0x42,0xDB,0xD9,0x03,0x21, + 0x28,0x00,0xF9,0xF7,0xD3,0xFB,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2, + 0x0B,0x48,0xC4,0x8B,0x03,0xE0,0xFB,0xF7,0xD5,0xFB,0xFB,0xF7,0x4D,0xFC,0x64,0x1E, + 0xF9,0xD2,0xFB,0xF7,0xF9,0xFB,0x68,0x46,0xFF,0xF7,0x06,0xF9,0x00,0x20,0x30,0x71, + 0xF0,0x80,0x30,0x81,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xDC,0x07,0x00,0x20, + 0xFC,0x94,0x00,0x00,0x15,0x49,0x18,0xB4,0x4A,0x7A,0x00,0x2A,0x23,0xD0,0x14,0x4B, + 0x92,0x07,0x04,0xD5,0x9A,0x8B,0x04,0x88,0x12,0x1B,0x52,0x1E,0x02,0x80,0x4A,0x7A, + 0x52,0x07,0x04,0xD5,0xDA,0x8B,0x43,0x88,0xD2,0x1A,0x52,0x1E,0x42,0x80,0x49,0x7A, + 0xC9,0x07,0x08,0xD0,0x01,0x88,0x6B,0x46,0x19,0x80,0x41,0x88,0x59,0x80,0x59,0x88, + 0x01,0x80,0x19,0x88,0x41,0x80,0x01,0x88,0x09,0x05,0x09,0x0D,0x01,0x80,0x41,0x88, + 0x09,0x05,0x09,0x0D,0x41,0x80,0x18,0xBC,0x70,0x47,0x00,0x00,0xBC,0x94,0x00,0x00, + 0x9C,0x94,0x00,0x00,0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0x28,0x08,0x00,0x20, + 0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B, + 0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x06,0x49,0x02,0x03,0x51,0x18,0x8A,0x68,0xFF,0x23,0x01,0x33,0x1A,0x43,0x8A,0x60, + 0x02,0x28,0x02,0xD1,0x02,0x49,0x00,0x20,0x08,0x70,0x70,0x47,0x00,0x20,0x00,0x40, + 0x28,0x08,0x00,0x20,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32, + 0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0xF0,0xB4,0x19,0x49, + 0x19,0x4D,0x08,0x68,0x2B,0x7A,0x00,0x04,0x00,0x22,0x00,0x0F,0x98,0x42,0x01,0xD8, + 0x08,0x68,0x1E,0xE0,0x00,0x20,0x06,0x00,0x01,0x27,0x8B,0x8E,0x1C,0x00,0xC4,0x40, + 0xE4,0x07,0x0B,0xD0,0x2C,0x7A,0x94,0x42,0x07,0xD2,0x3C,0x00,0x84,0x40,0xA3,0x43, + 0x8B,0x86,0x83,0x00,0x5B,0x18,0x9E,0x60,0x00,0xE0,0x52,0x1C,0x40,0x1C,0x0A,0x28, + 0xEB,0xD3,0x0F,0x23,0x08,0x68,0x1B,0x03,0x12,0x07,0x98,0x43,0x12,0x0C,0x10,0x43, + 0x08,0x60,0x00,0x04,0x02,0x0F,0x03,0xD0,0x00,0x0F,0x40,0x1C,0x20,0x31,0x88,0x75, + 0xF0,0xBC,0x70,0x47,0x58,0x07,0x00,0x20,0xBC,0x94,0x00,0x00,0xF8,0xB5,0x12,0x49, + 0xD9,0x20,0xC0,0x00,0x0C,0x18,0xE3,0x20,0xC0,0x00,0x0D,0x18,0x0F,0x48,0x00,0x27, + 0x0E,0x18,0xFF,0x43,0x20,0x00,0x0C,0x22,0x39,0x00,0x44,0x30,0xF9,0xF7,0x22,0xFB, + 0x20,0x00,0x0C,0x22,0x39,0x00,0x38,0x30,0xF9,0xF7,0x1C,0xFB,0x00,0x20,0x40,0x36, + 0x20,0x34,0xB0,0x77,0xA0,0x7D,0x00,0x28,0x02,0xD0,0x01,0x20,0x20,0x35,0xA8,0x75, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x20,0x64,0x06,0x00,0x00, + 0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00, + 0xF9,0xF7,0xEA,0xFA,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23,0xF9,0xF7,0xEC,0xFA, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x9F,0x00,0x00,0x02,0x4B,0x58,0x60, + 0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5, + 0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xE1,0x04,0x00,0x00,0x04,0x48,0x00,0x78,0x00,0x28,0x04,0xD0,0x03,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0xF6,0x07,0x00,0x20,0x00,0x30,0x00,0x40, + 0x04,0x48,0x00,0x78,0x00,0x28,0x04,0xD0,0x03,0x48,0x01,0x68,0x49,0x08,0x49,0x00, + 0x01,0x60,0x70,0x47,0xF6,0x07,0x00,0x20,0x00,0x30,0x00,0x40,0x04,0x49,0x09,0x78, + 0x00,0x29,0x03,0xD0,0x03,0x49,0x02,0x22,0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00, + 0xF6,0x07,0x00,0x20,0x00,0x30,0x00,0x40,0xF8,0xB5,0x84,0x46,0x29,0x48,0x00,0x21, + 0x00,0x78,0x0C,0x00,0x0D,0x00,0x80,0x1E,0x00,0x06,0x00,0x0E,0x62,0x46,0x00,0x2A, + 0x8E,0x46,0x00,0xD0,0x49,0x1E,0x24,0x48,0x24,0x4F,0xC0,0x88,0x02,0x26,0x02,0x29, + 0x00,0x90,0x2B,0xDA,0x20,0x4A,0x60,0x46,0x40,0x18,0x1D,0x23,0x82,0x18,0x9B,0x01, + 0xD2,0x18,0x12,0x7C,0x05,0x2A,0x08,0xD2,0x83,0x00,0x1B,0x48,0x1B,0x18,0x1D,0x20, + 0x80,0x01,0x18,0x18,0x03,0x6A,0x96,0x2B,0x02,0xD3,0x01,0x20,0x86,0x46,0x05,0xE0, + 0xA2,0x42,0x00,0xD9,0x14,0x00,0xAB,0x42,0x00,0xD9,0x1D,0x00,0x49,0x1C,0x09,0x06, + 0x09,0x16,0xB1,0x42,0xDE,0xDB,0x70,0x46,0x00,0x28,0x07,0xD0,0x00,0x98,0x01,0x22, + 0x0D,0x49,0xD2,0x02,0x10,0x43,0xC8,0x80,0x00,0x20,0x03,0xE0,0x38,0x7E,0x0A,0x28, + 0x04,0xD2,0x40,0x1C,0x38,0x76,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x98,0x01,0x22, + 0x05,0x49,0xD2,0x02,0x90,0x43,0xC8,0x80,0x00,0x20,0x38,0x76,0x08,0x83,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x9C,0x94,0x00,0x00,0x40,0x00,0x00,0x20,0xC0,0x07,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x1E,0xFF,0x2F,0xE1,0x07,0xB4,0x00,0x21,0x08,0x22,0x6B,0x46, + 0x41,0x5E,0x9A,0x5E,0x91,0x42,0x03,0xDB,0x0A,0x22,0x9A,0x5E,0x91,0x42,0x00,0xDD, + 0x02,0x80,0x02,0x21,0x04,0x22,0x6B,0x46,0x41,0x5E,0x9A,0x5E,0x91,0x42,0x03,0xDB, + 0x06,0x22,0x9A,0x5E,0x91,0x42,0x00,0xDD,0x42,0x80,0x03,0xB0,0x70,0x47,0x00,0x47, + 0x78,0x47,0xC0,0x46,0x14,0x30,0x9F,0xE5,0xC0,0x2F,0xA0,0xE1,0x93,0xC0,0xC1,0xE0, + 0x63,0x30,0xE0,0xE3,0xC1,0x12,0x62,0xE0,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x1F,0x85,0xEB,0x51,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1, + 0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1, + 0x78,0x47,0xC0,0x46,0x10,0x30,0x9F,0xE5,0x93,0x10,0x82,0xE0,0x63,0x30,0xE0,0xE3, + 0xA2,0x12,0xA0,0xE1,0x93,0x01,0x20,0xE0,0x1E,0xFF,0x2F,0xE1,0x1F,0x85,0xEB,0x51, + 0x10,0xB5,0xF9,0xF7,0x45,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xC5,0x6D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x00,0x6F,0x00, + 0xB9,0x00,0xF0,0x00,0x27,0x01,0x71,0x01,0xBB,0x01,0x27,0x00,0x73,0x00,0xBF,0x00, + 0x0B,0x01,0x57,0x01,0x90,0x01,0xC9,0x01,0x15,0x02,0x61,0x02,0xAD,0x02,0xF9,0x02, + 0x27,0x00,0x73,0x00,0xBF,0x00,0x0B,0x01,0x57,0x01,0x90,0x01,0xC9,0x01,0x15,0x02, + 0x61,0x02,0xAD,0x02,0xF9,0x02,0x00,0x00,0x38,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0, + 0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x34,0x48,0xC2,0x69,0x41,0x14, + 0x8A,0x43,0xC2,0x61,0xC2,0x69,0x0A,0x43,0xC2,0x61,0xC2,0x69,0x8A,0x43,0xC2,0x61, + 0x70,0x47,0x10,0xB4,0x2D,0x4C,0x40,0x23,0x60,0x60,0x20,0x68,0x80,0x0A,0x80,0x02, + 0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78,0xA0,0x60,0x49,0x1C, + 0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00,0x0E,0x00,0x1F,0x00, + 0x94,0x09,0x81,0x06,0x22,0x48,0x12,0xD1,0x91,0x06,0x10,0xD1,0x0C,0xE0,0x3A,0x00, + 0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04,0x2D,0x0C,0x40,0x36, + 0xFF,0xF7,0xC2,0xFF,0xFF,0xF7,0xC9,0xFF,0x64,0x1E,0x60,0x1C,0xEF,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x15,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0C,0x48, + 0x10,0xD1,0x89,0x06,0x0E,0xD1,0x0A,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0x97,0xFF,0xFF,0xF7,0x9E,0xFF,0x64,0x1E, + 0x60,0x1C,0xF1,0xD1,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40, + 0xFF,0xFF,0xFF,0xFF,0x89,0x08,0x49,0x1E,0x49,0x04,0x01,0x22,0x49,0x08,0xD2,0x07, + 0x89,0x18,0x00,0x04,0x00,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29, + 0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0xFF,0x10,0x01,0xE2,0x01,0x20,0x52,0xE2,0x01,0x10,0xC0,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0x1E,0xFF,0x2F,0x31,0x01,0x18,0xA0,0xE1,0x21,0x18,0xA0,0xE1,0x01,0x20,0x52,0xE2, + 0xB2,0x10,0xC0,0xE0,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1, + 0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31,0x01,0x20,0x52,0xE2,0x04,0x10,0x80,0xE4, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x01,0x30,0xD1,0xE4,0x01,0x20,0x52,0xE2,0x01,0x30,0xC0,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0xB2,0x30,0xC0,0xE0,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x42,0x21,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0x04,0x30,0x91,0xE4,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0xC2,0x20,0xA0,0xE1,0x01,0x20,0x52,0xE2,0x1E,0xFF,0x2F,0x31, + 0xB2,0x30,0xD1,0xE0,0x01,0x20,0x52,0xE2,0x04,0x30,0x80,0xE4,0xFB,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x41,0x11,0xA0,0xE1,0x01,0x10,0x51,0xE2,0x1E,0xFF,0x2F,0x31, + 0x00,0x20,0xA0,0xE3,0x01,0x10,0x51,0xE2,0x04,0x20,0x80,0xE4,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x30,0x00,0x2D,0xE9,0x90,0xC0,0x9F,0xE5,0x88,0x40,0x9F,0xE5, + 0x00,0x00,0x9C,0xE5,0x88,0x00,0x9F,0xE5,0x01,0x10,0xD0,0xE5,0x00,0x00,0xD0,0xE5, + 0x91,0x00,0x00,0xE0,0x01,0x00,0x50,0xE2,0x30,0x00,0xBD,0x48,0x1E,0xFF,0x2F,0x41, + 0x70,0x30,0x9F,0xE5,0x70,0x20,0x9F,0xE5,0x00,0x11,0x9C,0xE7,0x80,0x50,0x83,0xE0, + 0xB0,0x10,0xC5,0xE1,0x00,0x11,0x94,0xE7,0x80,0x50,0x82,0xE0,0x01,0x00,0x50,0xE2, + 0xB0,0x10,0xC5,0xE1,0xF7,0xFF,0xFF,0x5A,0x30,0x00,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x3C,0x00,0x9F,0xE5,0x30,0x20,0x9F,0xE5,0x01,0x10,0xD0,0xE5,0x00,0x00,0xD0,0xE5, + 0x91,0x00,0x00,0xE0,0x01,0x00,0x50,0xE2,0x1E,0xFF,0x2F,0x41,0x2C,0x10,0x9F,0xE5, + 0x00,0x31,0x92,0xE7,0x80,0xC0,0x81,0xE0,0x23,0x38,0xA0,0xE1,0x01,0x00,0x50,0xE2, + 0xB0,0x30,0xCC,0xE1,0xF9,0xFF,0xFF,0x5A,0x1E,0xFF,0x2F,0xE1,0xD4,0x02,0x10,0x40, + 0x00,0x10,0x10,0x40,0x9C,0x94,0x00,0x00,0x2A,0x08,0x00,0x20,0x00,0x00,0x00,0x10, + 0xD2,0x02,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x05,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x9D,0x39,0x00,0x00, + 0x78,0x79,0x7A,0x00,0x64,0x32,0x64,0x32,0x19,0x00,0x4B,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x14,0x00,0x40,0x01,0xF4,0x01, + 0xF4,0x01,0xC2,0x01,0x2D,0x00,0x64,0x00,0x00,0x00,0x4B,0x00,0xFF,0x0F,0x32,0x00, + 0x19,0x00,0x01,0x00,0x0A,0x02,0x0A,0x01,0x32,0x0A,0x88,0x13,0xE8,0x03,0x00,0x96, + 0x96,0x96,0x96,0x00,0x96,0x96,0x96,0xB4,0x01,0x01,0x0A,0x00,0x50,0x00,0xF4,0x01, + 0xFF,0xFF,0x14,0x96,0x00,0x05,0x04,0x0A,0x0A,0x06,0x3C,0x00,0x2C,0x01,0x00,0x09, + 0x28,0x05,0x28,0x00,0x96,0x00,0x58,0x02,0x96,0x00,0x32,0x00,0x28,0x00,0x28,0x00, + 0x32,0x00,0x96,0x00,0x05,0x02,0x01,0x02,0x01,0x00,0x78,0x00,0xF0,0x00,0x14,0x00, + 0x50,0x00,0xDC,0x00,0x1E,0x00,0x32,0x00,0x64,0x00,0x14,0x04,0xFD,0x02,0x00,0x03, + 0x14,0x02,0x04,0x06,0x05,0x00,0x14,0x00,0x01,0x02,0x03,0x02,0x00,0x03,0x03,0x06, + 0x06,0x09,0x09,0x0C,0x0C,0x1E,0x55,0x01,0x03,0x00,0x05,0x02,0x05,0x0A,0x01,0x01, + 0x04,0x00,0x64,0x00,0x0C,0x05,0x1E,0x00,0x05,0x0A,0x01,0x00,0xA0,0x0F,0xD0,0x07, + 0xF4,0x01,0xC8,0x00,0xFF,0x00,0xC8,0x00,0x05,0x00,0x01,0x00,0x9D,0x39,0x00,0x00, + 0x78,0x79,0x7A,0x00,0x64,0x32,0x64,0x32,0x19,0x00,0x4B,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x18,0x01,0x14,0x00,0x68,0x01,0xF4,0x01, + 0xF4,0x01,0xC2,0x01,0x32,0x00,0x64,0x00,0x00,0x00,0x50,0x00,0xFF,0x0F,0x32,0x00, + 0x19,0x00,0x01,0x00,0x0A,0x02,0x0A,0x01,0x32,0x0A,0x88,0x13,0xF4,0x01,0x00,0x96, + 0x96,0x96,0x96,0x00,0xFF,0xFF,0xFF,0xFF,0x01,0x01,0x1E,0x00,0xC8,0x00,0xF4,0x01, + 0xFA,0xFA,0x0D,0xA0,0x00,0x05,0x04,0x0A,0x02,0x06,0x3C,0x00,0x2C,0x01,0x00,0x09, + 0x28,0x05,0x28,0x00,0x96,0x00,0x58,0x02,0x96,0x00,0x32,0x00,0x28,0x00,0x28,0x00, + 0x32,0x00,0x96,0x00,0x05,0x02,0x01,0x02,0x01,0x00,0x78,0x00,0xF0,0x00,0x14,0x00, + 0x50,0x00,0xDC,0x00,0x1E,0x00,0x32,0x00,0x64,0x00,0x14,0x04,0xFD,0x02,0x00,0x03, + 0x14,0x02,0x04,0x06,0x05,0x00,0x14,0x00,0x01,0x02,0x03,0x02,0x00,0x05,0x05,0x0A, + 0x0A,0x0F,0x0F,0x14,0x14,0x19,0x55,0x01,0x05,0x00,0x05,0x02,0x05,0x0A,0x01,0x01, + 0x04,0x00,0x64,0x00,0x0C,0x05,0x1E,0x00,0x05,0x0A,0x01,0x00,0xA0,0x0F,0xD0,0x07, + 0xF4,0x01,0xC8,0x00,0xFF,0x00,0xC8,0x00,0x05,0x00,0x2C,0x01,0x41,0x22,0x01,0x00, + 0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x18,0x18,0x88,0x00, + 0x30,0x7F,0x10,0x3F,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x00,0x00,0x04,0x81,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x03,0xC8,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00,0x00,0x00,0x10,0x00, + 0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x10,0x10,0x88,0x00,0x30,0x7F,0x10,0x3F, + 0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x04,0x81, + 0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x03,0xC8,0x40,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00,0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00, + 0xFF,0x05,0xFF,0x03,0x18,0x18,0x88,0x00,0x30,0x7F,0x10,0x3F,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x04,0x81,0x01,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0xC8,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x22,0x01,0x00,0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03, + 0x10,0x10,0x88,0x00,0x30,0x7F,0x10,0x3F,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00, + 0x10,0x00,0x10,0x00,0x00,0x00,0x04,0x81,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x03, + 0xC8,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00, + 0xC8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x15,0x01,0x08, + 0x10,0x27,0x00,0x00,0x10,0x27,0x00,0x00,0x10,0x27,0x00,0x00,0xE0,0x93,0x04,0x00, + 0x80,0x96,0x98,0x00,0x30,0x75,0x00,0x00,0xE0,0x01,0x20,0x03,0x00,0x00,0x0C,0x00, + 0x00,0x00,0x05,0x00,0x05,0x00,0x03,0x02,0x7C,0x00,0x8C,0x00,0x00,0x00,0x03,0x00, + 0x30,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0xDC,0x05,0x04,0xC8,0xC8,0x97,0x97,0x01, + 0x5A,0x03,0x02,0x00,0xDC,0x05,0x13,0x14,0xFF,0xFF,0xFF,0xDC,0x44,0x36,0x16,0x07, + 0x46,0x37,0x16,0x07,0x46,0x37,0x15,0x07,0x45,0x37,0x15,0x07,0x44,0x37,0x14,0x07, + 0x46,0x38,0x14,0x07,0x46,0x38,0x13,0x07,0x45,0x38,0x13,0x07,0x00,0x00,0x00,0x00, + 0x0A,0x00,0x32,0x00,0x50,0x00,0x32,0x00,0x50,0x00,0x0A,0x00,0x1E,0x01,0x14,0x00, + 0x00,0x00,0x2C,0x01,0x00,0x00,0x2C,0x01,0x5E,0x01,0x00,0x00,0x64,0x00,0x64,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5A,0x5A,0x5A, + 0x5A,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x02,0x00,0x00, + 0x22,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00, + 0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x02,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00, + 0x04,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00, + 0x60,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x0E,0x15,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x00,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x60,0x0F,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x01,0x00, + 0x00,0x00,0x10,0x00,0xFF,0x00,0x30,0x00,0xFF,0x05,0xFF,0x03,0x18,0x18,0x88,0x00, + 0x30,0x7F,0x10,0x3F,0x10,0x00,0x10,0x00,0x00,0x00,0x04,0x81,0x00,0x00,0xFF,0x0F, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0xC8,0x00,0x00,0x01,0x00,0x00,0x08,0x00, + 0x11,0x30,0x10,0x00,0x42,0x80,0x01,0x00,0xFF,0xFF,0xFF,0x10,0xFF,0xFF,0xFF,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x01,0x03,0x02,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x0F,0xC0,0xDA,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x38,0x20,0x08,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xD0,0x07,0x08,0x00,0x12,0x12,0xC8,0x01,0x90,0x81,0x0C,0x00,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x40,0x00,0x03,0xC8,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x40,0x00,0x00,0x64,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01,0x50,0x31,0x20,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3F,0x27,0x27, + 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x3F,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x3F,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x3F,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x3F,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x3F,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23, + 0x23,0x3F,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x3F, + 0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x3F,0x27,0x27, + 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x3F,0x27,0x27,0x27,0x27, + 0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x3F,0x28,0x28,0x28,0x28,0x28,0x28, + 0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x44,0xC8,0x61,0x14,0x44, + 0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0xC8,0x61,0x14,0x04,0x00,0xC0,0xA1,0xDF, + 0x21,0x2C,0xA2,0xDF,0x42,0xBC,0xA2,0xDF,0x63,0x28,0xA3,0xDF,0x84,0xB8,0xA3,0xDF, + 0xA5,0x24,0xA4,0xDF,0xC6,0xB4,0xA4,0xDF,0xE7,0x20,0xA5,0xDF,0x08,0xB1,0xA5,0xDF, + 0x29,0x9D,0xA8,0xDF,0x4A,0x01,0xA9,0xDF,0x6B,0x99,0xA9,0xDF,0x8C,0x05,0xAA,0xDF, + 0xAD,0x95,0xAA,0xDF,0xCE,0x09,0xA0,0xDF,0xEF,0x11,0xA0,0xDF,0x10,0x0E,0xA0,0xDF, + 0x31,0x46,0xA0,0xDF,0x52,0x52,0xA0,0xDF,0x73,0x4A,0xA0,0xDF,0x94,0x4E,0xA0,0xDF, + 0xB5,0x02,0xA0,0xDF,0xD6,0x02,0xA0,0xDF,0xF7,0x02,0xA0,0xDF,0x00,0x08,0x00,0x00, + 0x00,0x80,0x01,0x00,0x00,0x0C,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x06,0x00,0x00, + 0x00,0x60,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x30,0x00,0x00,0x80,0x01,0x00,0x00, + 0x01,0x10,0x00,0x00,0xC0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x60,0x00,0x00,0x00, + 0x06,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x10,0x00,0x02,0x00, + 0x08,0x00,0x10,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,0x1E,0x00, + 0xF8,0x0F,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30, + 0x65,0x60,0x05,0x00,0x00,0x00,0x00,0x00,0x30,0x60,0x30,0x60,0x60,0x30,0x60,0x30, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, + 0x01,0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 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,0x0B,0x38,0x30,0x00,0x00,0x00,0x05,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x00,0x00,0x00,0x00,0xC0,0x91,0x00,0x00, + 0xC0,0x9F,0x00,0x00,0x40,0x00,0x00,0x00,0xC0,0x91,0x00,0x00,0x00,0x04,0x00,0x00, + 0xC0,0x95,0x00,0x00,0x00,0x01,0x00,0x00,0xC0,0x96,0x00,0x00,0x00,0x02,0x00,0x00, + 0xC0,0x98,0x00,0x00,0x00,0x04,0x00,0x00,0x4F,0x00,0x94,0x00,0x00,0x00,0x00,0x00, + 0x1F,0x07,0xDE,0x07,0x14,0x24,0x0B,0x00,0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47 +}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx.c b/drivers/input/touchscreen/ist30xxa/ist30xx.c new file mode 100644 index 00000000..21bb82ae --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx.c @@ -0,0 +1,1339 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_tracking.h" + +#ifdef CONFIG_OF +#include +#include +#endif + +#if IST30XX_DEBUG +#include "ist30xx_misc.h" +#endif +#if IST30XX_CMCS_TEST +#include "ist30xx_cmcs.h" +#endif +#if SEC_FACTORY_MODE +#include "ist30xx_sec.h" +extern int sec_touch_sysfs(struct ist30xx_data *data); +extern int sec_fac_cmd_init(struct ist30xx_data *data); +#endif + +#define MAX_ERR_CNT (100) + +#if IST30XX_USE_KEY +int ist30xx_key_code[] = { 0, KEY_MENU, KEY_BACK }; +#endif + +DEFINE_MUTEX(ist30xx_mutex); + +volatile bool ist30xx_irq_working = false; +static bool ist30xx_initialized = 0; +struct ist30xx_data *ts_data; +static struct delayed_work work_reset_check; +#if IST30XX_EVENT_MODE +static struct delayed_work work_noise_protect, work_debug_algorithm; +#endif + +static int ist30xx_power_status = -1; +static int ist30xx_ta_status = -1; +static int ist30xx_noise_mode = -1; + +#if IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +static struct delayed_work work_fw_update; +#endif + +int ist30xx_report_rate = -1; +int ist30xx_idle_rate = -1; + +u32 event_ms = 0, timer_ms = 0; +u32 ist30xx_scan_count = 0; +int ist30xx_scan_retry = 0; + +#if IST30XX_EVENT_MODE +static struct timer_list event_timer; +static struct timespec t_current; // ns +int timer_period_ms = 500; // 0.5sec +#define EVENT_TIMER_INTERVAL (HZ * timer_period_ms / 1000) +#endif // IST30XX_EVENT_MODE + +char *ist_vdd_name = "vddsim2"; + +#if IST30XX_DEBUG +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; +#endif + + +int ist30xx_dbg_level = IST30XX_DEBUG_LEVEL; +void tsp_printk(int level, const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + int r; + + if (ist30xx_dbg_level < level) + return; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + r = printk("%s %pV", IST30XX_DEBUG_TAG, &vaf); + + va_end(args); +} + +long get_milli_second(void) +{ +#if IST30XX_EVENT_MODE + ktime_get_ts(&t_current); + + return t_current.tv_sec * 1000 + t_current.tv_nsec / 1000000; +#else + return 0; +#endif // IST30XX_EVENT_MODE +} + +int ist30xx_intr_wait(long ms) +{ + long start_ms = get_milli_second(); + long curr_ms = 0; + + while (1) { + if (!ist30xx_irq_working) + break; + + curr_ms = get_milli_second(); + if ((curr_ms < 0) || (start_ms < 0) || (curr_ms - start_ms > ms)) { + tsp_info("%s() timeout(%dms)\n", __func__, ms); + return -EPERM; + } + + msleep(2); + } + return 0; +} + +void ist30xx_disable_irq(struct ist30xx_data *data) +{ + if (likely(data->irq_enabled)) { + ist30xx_tracking(TRACK_INTR_DISABLE); + disable_irq(data->client->irq); + data->irq_enabled = 0; + data->status.event_mode = false; + } +} + +void ist30xx_enable_irq(struct ist30xx_data *data) +{ + if (likely(!data->irq_enabled)) { + ist30xx_tracking(TRACK_INTR_ENABLE); + enable_irq(data->client->irq); + msleep(10); + data->irq_enabled = 1; + data->status.event_mode = true; + } +} + +int ist30xx_max_error_cnt = MAX_ERR_CNT; +int ist30xx_error_cnt = 0; +void ist30xx_scheduled_reset(void) +{ + if (likely(ist30xx_initialized)) + schedule_delayed_work(&work_reset_check, 0); +} + +static void ist30xx_request_reset(void) +{ + ist30xx_error_cnt++; + if (unlikely(ist30xx_error_cnt >= ist30xx_max_error_cnt)) { + tsp_info("%s()\n", __func__); + ist30xx_scheduled_reset(); + ist30xx_error_cnt = 0; + } +} + +#define NOISE_MODE_TA (0) +#define NOISE_MODE_CALL (1) +#define NOISE_MODE_COVER (2) +#define NOISE_MODE_POWER (8) +void ist30xx_start(struct ist30xx_data *data) +{ + if (ist30xx_initialized) { +#if IST30XX_EVENT_MODE + ist30xx_scan_count = 0; + ist30xx_scan_retry = 0; + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL * 2); +#endif + } + + ist30xx_tracking(ist30xx_ta_status ? + TRACK_CMD_TACON : TRACK_CMD_TADISCON); + + ist30xx_noise_mode &= ~(1 << NOISE_MODE_TA); + ist30xx_noise_mode |= (ist30xx_ta_status << NOISE_MODE_TA); + + ist30xx_noise_mode &= ~(1 << NOISE_MODE_POWER); + ist30xx_noise_mode |= (ist30xx_power_status << NOISE_MODE_POWER); + + ist30xx_noise_mode |= (TSP_LOCAL_CODE << 16); + ist30xx_write_cmd(data->client, CMD_SET_NOISE_MODE, ist30xx_noise_mode); + + tsp_info("%s(), local : %d, mode : 0x%x\n", __func__, + (ist30xx_noise_mode >> 16) & 0xFFFF, ist30xx_noise_mode & 0xFFFF); + + if (ist30xx_report_rate >= 0) { + ist30xx_write_cmd(data->client, CMD_SET_REPORT_RATE, + ist30xx_report_rate); + tsp_info(" reporting rate : %dus\n", ist30xx_report_rate); + } + + if (ist30xx_idle_rate >= 0) { + ist30xx_write_cmd(data->client, CMD_SET_IDLE_TIME, ist30xx_idle_rate); + tsp_info(" idle rate : %dus\n", ist30xx_idle_rate); + } + + ist30xx_cmd_start_scan(data->client); +} + + +int ist30xx_get_ver_info(struct ist30xx_data *data) +{ + int ret; + + data->fw.prev_core_ver = data->fw.core_ver; + data->fw.prev_param_ver = data->fw.param_ver; + data->fw.core_ver = data->fw.param_ver = 0; + + ret = ist30xx_read_cmd(data->client, CMD_GET_FW_VER, &data->fw.core_ver); + if (unlikely(ret)) + return ret; + + ret = ist30xx_read_cmd(data->client, CMD_GET_PARAM_VER, + &data->fw.param_ver); + if (unlikely(ret)) + return ret; + + ret = ist30xx_read_cmd(data->client, CMD_GET_SUB_VER, &data->fw.sub_ver); + if (unlikely(ret)) + return ret; + + tsp_info("IC version read core: %x, param: %x, sub: %x\n", + data->fw.core_ver, data->fw.param_ver, data->fw.sub_ver); + + return 0; +} + +#if IST30XX_DEBUG +void ist30xx_print_info(void) +{ + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + + tsp_info("*** TSP/TKEY info ***\n"); + tsp_info("tscn finger num : %d\n", tsp->finger_num); + tsp_info("tscn dir swap: %d, flip x: %d, y: %d\n", + tsp->dir.swap_xy, tsp->dir.flip_x, tsp->dir.flip_y); + tsp_info("tscn ch_num tx: %d, rx: %d\n", + tsp->ch_num.tx, tsp->ch_num.rx); + tsp_info("tscn width: %d, height: %d\n", + tsp->width, tsp->height); + tsp_info("tkey enable: %d, key num: %d, axis rx: %d \n", + tkey->enable, tkey->key_num, tkey->axis_rx); + tsp_info("tkey ch_num[0] %d, [1] %d, [2] %d, [3] %d, [4] %d\n", + tkey->ch_num[0], tkey->ch_num[1], tkey->ch_num[2], + tkey->ch_num[3], tkey->ch_num[4]); +} +#endif + +#define CALIB_MSG_MASK (0xF0000FFF) +#define CALIB_MSG_VALID (0x80000CAB) +#define TRACKING_INTR_VALID (0x127EA597) +u32 tracking_intr_value = TRACKING_INTR_VALID; +int ist30xx_get_info(struct ist30xx_data *data) +{ + int ret; + u32 calib_msg; + u32 ms; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + +#if IST30XX_INTERNAL_BIN +#if IST30XX_DEBUG +#if IST30XX_UPDATE_BY_WORKQUEUE + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); +#endif + ist30xx_get_tsp_info(data); + ist30xx_get_tkey_info(data); +#endif // IST30XX_DEBUG +#else + + ret = ist30xx_get_ver_info(data); + if (unlikely(ret)) + goto get_info_end; + +#if IST30XX_DEBUG + ret = ist30xx_tsp_update_info(); + if (unlikely(ret)) + goto get_info_end; + + ret = ist30xx_tkey_update_info(); + if (unlikely(ret)) + goto get_info_end; +#endif // IST30XX_DEBUG +#endif // IST30XX_INTERNAL_BIN + +#if IST30XX_DEBUG + ist30xx_print_info(); + data->max_fingers = ist30xx_tsp_info.finger_num; + data->max_keys = ist30xx_tkey_info.key_num; +#endif // IST30XX_DEBUG + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &calib_msg); + if (likely(ret == 0)) { + tsp_info("calib status: 0x%08x\n", calib_msg); + ms = get_milli_second(); + ist30xx_put_track_ms(ms); + ist30xx_put_track(&tracking_intr_value, 1); + ist30xx_put_track(&calib_msg, 1); + if ((calib_msg & CALIB_MSG_MASK) != CALIB_MSG_VALID || + CALIB_TO_STATUS(calib_msg) > 0) { + ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY); + ist30xx_reset(false); + } + } + +#if (IST30XX_EVENT_MODE && IST30XX_CHECK_CALIB) + if (likely(!data->status.update)) { + ret = ist30xx_cmd_check_calib(data->client); + if (likely(!ret)) { + data->status.calib = 1; + data->status.calib_msg = 0; + event_ms = (u32)get_milli_second(); + data->status.event_mode = true; + } + } +#else + ist30xx_start(ts_data); +#endif + +#if !(IST30XX_INTERNAL_BIN) +get_info_end: +#endif + if (likely(ret == 0)) + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return ret; +} + +#define PRESS_MSG_MASK (0x01) +#define MULTI_MSG_MASK (0x02) +#define PRESS_MSG_KEY (0x6) +#define TOUCH_DOWN_MESSAGE ("p") +#define TOUCH_UP_MESSAGE ("r") +#define TOUCH_MOVE_MESSAGE (" ") +bool tsp_touched[IST30XX_MAX_MT_FINGERS] = { false, }; +bool tkey_pressed[IST30XX_MAX_KEYS] = { false, }; +void print_tsp_event(finger_info *finger) +{ + int idx = finger->bit_field.id - 1; + bool press; + + press = PRESSED_FINGER(ts_data->t_status, finger->bit_field.id); + + if (press) { + if (tsp_touched[idx] == false) { // touch down + tsp_notc("%s%d (%d, %d)\n", + TOUCH_DOWN_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + tsp_touched[idx] = true; + } else { // touch move + tsp_debug("%s%d (%d, %d)\n", + TOUCH_MOVE_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + } + } else { + if (tsp_touched[idx] == true) { // touch up + tsp_notc("%s%d\n", TOUCH_UP_MESSAGE, finger->bit_field.id); + tsp_touched[idx] = false; + } + } +} + +void print_tkey_event(int id) +{ + int idx = id - 1; + bool press = PRESSED_KEY(ts_data->t_status, id); + + if (press) { + if (tkey_pressed[idx] == false) { // tkey down + tsp_notc("k %s%d\n", TOUCH_DOWN_MESSAGE, id); + tkey_pressed[idx] = true; + } + } else { + if (tkey_pressed[idx] == true) { // tkey up + tsp_notc("k %s%d\n", TOUCH_UP_MESSAGE, id); + tkey_pressed[idx] = false; + } + } +} + +static void release_finger(int id) +{ + input_mt_slot(ts_data->input_dev, id - 1); + input_mt_report_slot_state(ts_data->input_dev, MT_TOOL_FINGER, false); + + ist30xx_tracking(TRACK_POS_FINGER + id); + tsp_info("%s() %d\n", __func__, id); + + tsp_touched[id - 1] = false; + + input_sync(ts_data->input_dev); +} + +#define CANCEL_KEY (0xFF) +#define RELEASE_KEY (0) +static void release_key(int id, u8 key_status) +{ + input_report_key(ts_data->input_dev, ist30xx_key_code[id], key_status); + + ist30xx_tracking(TRACK_POS_KEY + id); + tsp_info("%s() key%d, status: %d\n", __func__, id, key_status); + + tkey_pressed[id - 1] = false; + + input_sync(ts_data->input_dev); +} + +static void clear_input_data(struct ist30xx_data *data) +{ + int id = 1; + u32 status; + + status = PARSE_FINGER_STATUS(data->t_status); + while (status) { + if (status & 1) + release_finger(id); + status >>= 1; + id++; + } + + id = 1; + status = PARSE_KEY_STATUS(data->t_status); + while (status) { + if (status & 1) + release_key(id, RELEASE_KEY); + status >>= 1; + id++; + } + data->t_status = 0; +} + +static int check_report_fingers(struct ist30xx_data *data, int finger_counts) +{ + int i; + finger_info *fingers = (finger_info *)data->fingers; + + /* current finger info */ + for (i = 0; i < finger_counts; i++) { + if (unlikely((fingers[i].bit_field.x > IST30XX_MAX_X) || + (fingers[i].bit_field.y > IST30XX_MAX_Y))) { + tsp_warn("Invalid touch data - %d: %d(%d, %d), 0x%08x\n", i, + fingers[i].bit_field.id, + fingers[i].bit_field.x, + fingers[i].bit_field.y, + fingers[i].full_field); + + fingers[i].bit_field.id = 0; + ist30xx_tracking(TRACK_POS_UNKNOWN); + return -EPERM; + } + } + + return 0; +} + +static int check_valid_coord(u32 *msg, int cnt) +{ + int ret = 0; + u8 *buf = (u8 *)msg; + u8 chksum1 = msg[0] >> 24; + u8 chksum2 = 0; + + msg[0] &= 0x00FFFFFF; + + cnt *= IST30XX_DATA_LEN; + + while (cnt--) + chksum2 += *buf++; + + if (chksum1 != chksum2) { + tsp_err("intr chksum: %02x, %02x\n", chksum1, chksum2); + ret = -EPERM; + } + + return (chksum1 == chksum2) ? 0 : -EPERM; +} + +static void report_input_data(struct ist30xx_data *data, int finger_counts, + int key_counts) +{ + int id; + bool press = false; + finger_info *fingers = (finger_info *)data->fingers; + int idx = 0; + u32 status; + + status = PARSE_FINGER_STATUS(data->t_status); + for (id = 0; id < IST30XX_MAX_MT_FINGERS; id++) { + press = (status & (1 << id)) ? true : false; + + input_mt_slot(data->input_dev, id); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, press); + + fingers[idx].bit_field.id = id + 1; + print_tsp_event(&fingers[idx]); + + if (press == false) + continue; + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, + fingers[idx].bit_field.x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, + fingers[idx].bit_field.y); + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, + fingers[idx].bit_field.area); + idx++; + } + +#if IST30XX_USE_KEY + status = PARSE_KEY_STATUS(data->t_status); + for (id = 0; id < data->max_keys; id++) { + press = (status & (1 << id)) ? true : false; + + input_report_key(data->input_dev, ist30xx_key_code[id + 1], press); + + print_tkey_event(id + 1); + } +#endif // IST30XX_USE_KEY + + ist30xx_error_cnt = 0; + ist30xx_scan_retry = 0; + + input_sync(data->input_dev); +} + +/* + * CMD : CMD_GET_COORD + * + * 1st [31:24] [23:21] [20:16] [15:12] [11:10] [9:0] + * Checksum KeyCnt KeyStatus FingerCnt Rsvd. FingerStatus + * 2nd [31:28] [27:24] [23:12] [11:0] + * ID Area X Y + */ +u32 intr_debug_addr, intr_debug2_addr, intr_debug3_addr = 0; +u32 intr_debug_size, intr_debug2_size, intr_debug3_size = 0; +static irqreturn_t ist30xx_irq_thread(int irq, void *ptr) +{ + int i, ret; + int key_cnt, finger_cnt, read_cnt; + struct ist30xx_data *data = ts_data; + int offset = 1; + u32 msg[IST30XX_MAX_MT_FINGERS + offset]; + u32 ms; + + ist30xx_irq_working = true; + + if (unlikely(!data->irq_enabled)) + goto irq_end; + + ms = get_milli_second(); + + memset(msg, 0, sizeof(msg)); + + ret = ist30xx_get_position(data->client, msg, 1); + if (unlikely(ret)) + goto irq_err; + + tsp_verb("intr msg: 0x%08x\n", *msg); + + if (unlikely(*msg == 0xE11CE970)) // TSP IC Exception + goto irq_ic_err; + + if (unlikely(*msg == 0 || *msg == 0xFFFFFFFF)) // Unknown CMD + goto irq_err; + + event_ms = ms; + ist30xx_put_track_ms(event_ms); + ist30xx_put_track(&tracking_intr_value, 1); + ist30xx_put_track(msg, 1); + + if (unlikely((*msg & CALIB_MSG_MASK) == CALIB_MSG_VALID)) { + data->status.calib_msg = *msg; + tsp_info("calib status: 0x%08x\n", data->status.calib_msg); + + goto irq_end; +#if IST30XX_CHKIC + } else if (*msg == IST30XX_CHKIC_END) { + data->status.chkic_msg = *msg; + tsp_info("IC check status: 0x%08x\n", data->status.chkic_msg); + + goto irq_end; +#endif + } + +#if IST30XX_ENABLE_GESTURE + ret = PARSE_GESTURE_MESSAGE(*msg); + if (unlikely(ret > 0)) { + tsp_info("Gesture ID: %d (0x%08x)\n", ret, *msg); + ist30xx_gesture_cmd(data, ret); + + goto irq_end; + } +#endif + + memset(data->fingers, 0, sizeof(data->fingers)); + + /* Unknown interrupt data for extend coordinate */ + if (unlikely(!CHECK_INTR_STATUS(*msg))) + goto irq_err; + + data->t_status = *msg; + key_cnt = PARSE_KEY_CNT(data->t_status); + finger_cnt = PARSE_FINGER_CNT(data->t_status); + read_cnt = finger_cnt; + + if (unlikely((finger_cnt > data->max_fingers) || + (key_cnt > data->max_keys))) { + tsp_warn("Invalid touch count - finger: %d(%d), key: %d(%d)\n", + finger_cnt, data->max_fingers, key_cnt, data->max_keys); + goto irq_err; + } + + if (read_cnt > 0) { +#if I2C_BURST_MODE + ret = ist30xx_get_position(data->client, &msg[offset], read_cnt); + if (unlikely(ret)) + goto irq_err; + + for (i = 0; i < read_cnt; i++) + data->fingers[i].full_field = msg[i + offset]; +#else + for (i = 0; i < read_cnt; i++) { + ret = ist30xx_get_position(data->client, &msg[i + offset], 1); + if (unlikely(ret)) + goto irq_err; + + data->fingers[i].full_field = msg[i + offset]; + } +#endif // I2C_BURST_MODE + + ist30xx_put_track(msg + offset, read_cnt); + for (i = 0; i < read_cnt; i++) + tsp_verb("intr msg(%d): 0x%08x\n", i + offset, msg[i + offset]); + } + + ret = check_valid_coord(&msg[0], read_cnt + 1); + if (unlikely(ret < 0)) + goto irq_err; + + if (unlikely(check_report_fingers(data, finger_cnt))) + goto irq_end; + + report_input_data(data, finger_cnt, key_cnt); + + if (intr_debug2_addr > 0 && intr_debug2_size > 0) { + tsp_notc("Intr_debug2 (addr: 0x%08x)\n", intr_debug2_addr); + for (i = 0; i < intr_debug2_size; i++) { + ist30xx_read_buf(data->client, + intr_debug2_addr + IST30XX_DATA_LEN * i, &msg[i], 1); + + tsp_notc("\t%08x\n", msg[i]); + } + ist30xx_put_track(msg, intr_debug2_size); + } + + if (intr_debug3_addr > 0 && intr_debug3_size > 0) { + tsp_notc("Intr_debug3 (addr: 0x%08x)\n", intr_debug3_addr); + for (i = 0; i < intr_debug3_size; i++) { + ist30xx_read_buf(data->client, + intr_debug3_addr + IST30XX_DATA_LEN * i, &msg[i], 1); + + tsp_notc("\t%08x\n", msg[i]); + } + ist30xx_put_track(msg, intr_debug3_size); + } + + goto irq_end; + +irq_err: + tsp_err("intr msg: 0x%08x, ret: %d\n", msg[0], ret); + ist30xx_request_reset(); +irq_end: + ist30xx_irq_working = false; + event_ms = (u32)get_milli_second(); + return IRQ_HANDLED; + +irq_ic_err: + tsp_err("Occured IC exception\n"); + ist30xx_scheduled_reset(); + ist30xx_irq_working = false; + event_ms = (u32)get_milli_second(); + return IRQ_HANDLED; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +#define ist30xx_suspend NULL +#define ist30xx_resume NULL +static void ist30xx_early_suspend(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + del_timer(&event_timer); + cancel_delayed_work_sync(&work_noise_protect); + cancel_delayed_work_sync(&work_reset_check); + cancel_delayed_work_sync(&work_debug_algorithm); + ist30xx_internal_suspend(data); + clear_input_data(data); + mutex_unlock(&ist30xx_mutex); +} +static void ist30xx_late_resume(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + ist30xx_power_status = 1; + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(data); + ist30xx_start(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); +} +#else +static int ist30xx_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + del_timer(&event_timer); + cancel_delayed_work_sync(&work_noise_protect); + cancel_delayed_work_sync(&work_reset_check); + cancel_delayed_work_sync(&work_debug_algorithm); + ist30xx_internal_suspend(data); + clear_input_data(data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} +static int ist30xx_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + ist30xx_power_status = 1; + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(data); + ist30xx_start(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} +#endif // CONFIG_HAS_EARLYSUSPEND + +static void ist30xx_shutdown(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + + if(ist30xx_initialized) + { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + mutex_unlock(&ist30xx_mutex); + + del_timer_sync(&event_timer); + } + +} + +void ist30xx_set_ta_mode(bool charging) +{ + tsp_info("%s(), charging = %d\n", __func__, charging); + + if (unlikely(charging == ist30xx_ta_status)) + return; + + if (unlikely(ist30xx_noise_mode == -1)) { + ist30xx_ta_status = charging ? 1 : 0; + return; + } + + ist30xx_ta_status = charging ? 1 : 0; + + ist30xx_scheduled_reset(); +} +EXPORT_SYMBOL(ist30xx_set_ta_mode); + +void ist30xx_set_call_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ist30xx_noise_mode >> NOISE_MODE_CALL) & 1))) + return; + + ist30xx_noise_mode &= ~(1 << NOISE_MODE_CALL); + if (mode) + ist30xx_noise_mode |= (1 << NOISE_MODE_CALL); + + ist30xx_scheduled_reset(); +} +EXPORT_SYMBOL(ist30xx_set_call_mode); + +void ist30xx_set_cover_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ist30xx_noise_mode >> NOISE_MODE_COVER) & 1))) + return; + + ist30xx_noise_mode &= ~(1 << NOISE_MODE_COVER); + if (mode) + ist30xx_noise_mode |= (1 << NOISE_MODE_COVER); + + ist30xx_scheduled_reset(); +} +EXPORT_SYMBOL(ist30xx_set_cover_mode); + +void charger_enable(int enable) +{ + bool charging = enable ? true : false; + + ist30xx_set_ta_mode(charging); +} + +static void reset_work_func(struct work_struct *work) +{ + if (unlikely((ts_data == NULL) || (ts_data->client == NULL))) + return; + + tsp_info("Request reset function\n"); + + if (likely((ist30xx_initialized == 1) && (ts_data->status.power == 1) && + (ts_data->status.update != 1) && (ts_data->status.calib != 1))) { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + clear_input_data(ts_data); + ist30xx_reset(false); + ist30xx_start(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + } +} + +#if IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +static void fw_update_func(struct work_struct *work) +{ + if (unlikely((ts_data == NULL) || (ts_data->client == NULL))) + return; + + tsp_info("FW update function\n"); + + if (likely(ist30xx_auto_bin_update(ts_data))) + ist30xx_disable_irq(ts_data); +} +#endif // IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE + + +#if IST30XX_EVENT_MODE +u32 ist30xx_max_scan_retry = 2; +u32 ist30xx_algr_addr = 0, ist30xx_algr_size = 0; + +#define SCAN_STATUS_MAGIC (0x3C000000) +#define SCAN_STATUS_MASK (0xFF000000) +#define FINGER_CNT_MASK (0x00F00000) +#define SCAN_CNT_MASK (0x000FFFFF) +#define GET_FINGER_CNT(n) ((n & FINGER_CNT_MASK) >> 20) +#define GET_SCAN_CNT(n) (n & SCAN_CNT_MASK) +static void noise_work_func(struct work_struct *work) +{ +#if IST30XX_NOISE_MODE + int ret; + u32 scan_status = 0; + + ret = ist30xx_read_cmd(ts_data->client, IST30XXB_MEM_COUNT, &scan_status); + if (unlikely(ret)) { + tsp_warn("Mem scan count read fail!\n"); + goto retry_timer; + } + + ist30xx_put_track_ms(timer_ms); + ist30xx_put_track(&scan_status, 1); + + tsp_verb("scan status: 0x%x\n", scan_status); + + /* Check valid scan count */ + if (unlikely((scan_status & SCAN_STATUS_MASK) != SCAN_STATUS_MAGIC)) { + tsp_warn("Scan status is not corrected! (0x%08x)\n", scan_status); + goto retry_timer; + } + + /* Status of IC is idle */ + if (GET_FINGER_CNT(scan_status) == 0) { + if ((PARSE_FINGER_CNT(ts_data->t_status) > 0) || + (PARSE_KEY_CNT(ts_data->t_status) > 0)) + clear_input_data(ts_data); + } + + scan_status &= SCAN_CNT_MASK; + + /* Status of IC is lock-up */ + if (unlikely(scan_status == ist30xx_scan_count)) { + tsp_warn("TSP IC is not responded! (0x%08x)\n", scan_status); + goto retry_timer; + } else { + ist30xx_scan_retry = 0; + } + + ist30xx_scan_count = scan_status; + + return; + +retry_timer: + ist30xx_scan_retry++; + tsp_warn("Retry scan status!(%d)\n", ist30xx_scan_retry); + + if (unlikely(ist30xx_scan_retry == ist30xx_max_scan_retry)) { + ist30xx_scheduled_reset(); + ist30xx_scan_retry = 0; + } +#endif // IST30XX_NOISE_MODE +} + +static void debug_work_func(struct work_struct *work) +{ +#if IST30XX_ALGORITHM_MODE + int ret = -EPERM; + int i; + u32 *buf32; + + buf32 = kzalloc(ist30xx_algr_size, GFP_KERNEL); + + for (i = 0; i < ist30xx_algr_size; i++) { + ret = ist30xx_read_buf(ts_data->client, + ist30xx_algr_addr + IST30XX_DATA_LEN * i, &buf32[i], 1); + if (ret) { + tsp_warn("Algorithm mem addr read fail!\n"); + return; + } + } + + ist30xx_put_track(buf32, ist30xx_algr_size); + + tsp_debug(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", + buf32[0], buf32[1], buf32[2], buf32[3], buf32[4]); +#endif +} + +void timer_handler(unsigned long data) +{ + struct ist30xx_status *status = &ts_data->status; + + if (ist30xx_irq_working) + goto restart_timer; + + if (status->event_mode) { + if (likely((status->power == 1) && (status->update != 1))) { + timer_ms = (u32)get_milli_second(); + if (unlikely(status->calib == 1)) { // Check calibration + if ((status->calib_msg & CALIB_MSG_MASK) == CALIB_MSG_VALID) { + tsp_info("Calibration check OK!!\n"); + schedule_delayed_work(&work_reset_check, 0); + status->calib = 0; + } else if (timer_ms - event_ms >= 3000) { // 3second + tsp_info("calibration timeout over 3sec\n"); + schedule_delayed_work(&work_reset_check, 0); + status->calib = 0; + } + } else if (likely(status->noise_mode)) { + if (timer_ms - event_ms > 100) // 100ms after last interrupt + schedule_delayed_work(&work_noise_protect, 0); + } + +#if IST30XX_ALGORITHM_MODE + if ((ist30xx_algr_addr >= IST30XXB_ACCESS_ADDR) && + (ist30xx_algr_size > 0)) { + if (timer_ms - event_ms > 100) // 100ms after last interrupt + schedule_delayed_work(&work_debug_algorithm, 0); + } +#endif + } + } + +restart_timer: + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +} +#endif // IST30XX_EVENT_MODE + +static int ist30xx_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int ret; + int retry = 3; + struct ist30xx_data *data; + struct input_dev *input_dev; + int ist_gpio = 0; + + tsp_info("##### IST30XX(Ver%d) Initialize #####\n", IST30XX_DD_VERSION); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_INFO "i2c_check_functionality error\n"); + return -EIO; + } + tsp_info("%s(), the i2c addr=0x%x\n", __func__, client->addr); + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + + tsp_info("the client->dev.of_node=0x%x\n", client->dev.of_node); + + if (client->dev.of_node){ + ist_gpio = of_get_gpio(np, 0); + of_property_read_string(np, "tsp_pwr_name", &ist_vdd_name); + tsp_info("gpio id=%d,power name:%s\n", ist_gpio,ist_vdd_name); + } +#endif + + input_dev = input_allocate_device(); + if (unlikely(!input_dev)) { + ret = -ENOMEM; + tsp_err("%s(), input_allocate_device failed (%d)\n", + __func__, ret); + goto err_alloc_dev; + } + +#ifndef CONFIG_OF + ist_gpio = 82; + ist_vdd_name = "vddsim2"; +#endif + + /* configure touchscreen interrupt gpio */ + ret = gpio_request(ist_gpio, "ist30xx_irq_gpio"); + printk("[TSP]request gpio id = %d\n", ist_gpio); + if (ret) { + tsp_err("unable to request gpio.(%s)\r\n",input_dev->name); + goto err_init_drv; + } + + client->irq = gpio_to_irq(ist_gpio); + printk("[TSP] client->irq : %d\n", client->irq); + + data->max_fingers = data->max_keys = IST30XX_MAX_MT_FINGERS; + data->irq_enabled = 1; + data->client = client; + data->input_dev = input_dev; + i2c_set_clientdata(client, data); + + input_mt_init_slots(input_dev, IST30XX_MAX_MT_FINGERS, 0); + + input_dev->name = "ist30xx_ts_input"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + set_bit(EV_ABS, input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, IST30XX_MAX_X, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, IST30XX_MAX_Y, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, IST30XX_MAX_W, 0, 0); + +#if IST30XX_USE_KEY + { + int i; + set_bit(EV_KEY, input_dev->evbit); + set_bit(EV_SYN, input_dev->evbit); + for (i = 1; i < ARRAY_SIZE(ist30xx_key_code); i++) + set_bit(ist30xx_key_code[i], input_dev->keybit); + } +#endif + + input_set_drvdata(input_dev, data); + ret = input_register_device(input_dev); + if (unlikely(ret)) { + input_free_device(input_dev); + goto err_reg_dev; + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + data->early_suspend.suspend = ist30xx_early_suspend; + data->early_suspend.resume = ist30xx_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + ts_data = data; + + ret = ist30xx_init_system(); + if (unlikely(ret)) { + tsp_err("chip initialization failed\n"); + goto err_init_drv; + } + + ret = ist30xx_init_update_sysfs(); + if (unlikely(ret)) + goto err_init_drv; + +#if IST30XX_DEBUG + ret = ist30xx_init_misc_sysfs(); + if (unlikely(ret)) + goto err_init_drv; +#endif + +#if IST30XX_CMCS_TEST + ret = ist30xx_init_cmcs_sysfs(); + if (unlikely(ret)) + goto err_init_drv; +#endif + +#if SEC_FACTORY_MODE + ret = sec_fac_cmd_init(data); + if (unlikely(ret)) + goto err_init_drv; + ret = sec_touch_sysfs(data); + if (unlikely(ret)) + goto err_init_drv; +#endif + +#if IST30XX_TRACKING_MODE + ret = ist30xx_init_tracking_sysfs(); + if (unlikely(ret)) + goto err_init_drv; +#endif + + ret = request_threaded_irq(client->irq, NULL, ist30xx_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "ist30xx_ts", data); + if (unlikely(ret)) + goto err_irq; + + ist30xx_disable_irq(data); + + while ((data->chip_id != IST30XXB_CHIP_ID) && + (data->chip_id != IST3038_CHIP_ID)) { + ret = ist30xx_read_cmd(data->client, IST30XXB_REG_CHIPID, + &data->chip_id); + if (unlikely(ret)) { + tsp_info("tspid: %x\n", data->chip_id); + ist30xx_reset(false); + } + + if (data->chip_id == 0x3000B) + data->chip_id = IST30XXB_CHIP_ID; + + if (data->chip_id == 0x3038B) + data->chip_id = IST3038_CHIP_ID; + + if (retry-- == 0) + break; + } + + retry = 3; + while (retry-- > 0) { + ret = ist30xx_read_cmd(data->client, IST30XXB_REG_TSPTYPE, + &data->tsp_type); + + tsp_info("tsptype: %x\n", data->tsp_type); + data->tsp_type = IST30XXB_PARSE_TSPTYPE(data->tsp_type); + + if (likely(ret == 0)) + break; + + if (unlikely(retry == 0)) + goto err_irq; + } + + tsp_info("TSP IC: %x, TSP Vendor: %x\n", data->chip_id, data->tsp_type); + + data->status.event_mode = false; + +#if IST30XX_INTERNAL_BIN +#if IST30XX_UPDATE_BY_WORKQUEUE + INIT_DELAYED_WORK(&work_fw_update, fw_update_func); + schedule_delayed_work(&work_fw_update, IST30XX_UPDATE_DELAY); +#else + ret = ist30xx_auto_bin_update(data); + if (unlikely(ret != 0)) + goto err_irq; +#endif +#endif // IST30XX_INTERNAL_BIN + + if (ist30xx_ta_status < 0) + ist30xx_ta_status = 0; + + if (ist30xx_power_status < 0) + ist30xx_power_status = 0; + + if (ist30xx_noise_mode < 0) + ist30xx_noise_mode = 0; + + ret = ist30xx_get_info(data); + tsp_info("Get info: %s\n", (ret == 0 ? "success" : "fail")); + + INIT_DELAYED_WORK(&work_reset_check, reset_work_func); +#if IST30XX_EVENT_MODE + INIT_DELAYED_WORK(&work_noise_protect, noise_work_func); + INIT_DELAYED_WORK(&work_debug_algorithm, debug_work_func); +#endif + +#if IST30XX_EVENT_MODE + init_timer(&event_timer); + event_timer.function = timer_handler; + event_timer.expires = jiffies_64 + (EVENT_TIMER_INTERVAL); + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +#endif + + ist30xx_initialized = 1; + tsp_info("Probe end\n"); + + return 0; + +err_irq: + tsp_info("ChipID: %x\n", data->chip_id); + ist30xx_disable_irq(data); + free_irq(client->irq, data); +err_init_drv: + data->status.event_mode = false; + tsp_err("Error, ist30xx init driver\n"); + ist30xx_power_off(); +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + input_unregister_device(input_dev); + return 0; + +err_reg_dev: +err_alloc_dev: + tsp_err("Error, ist30xx mem free\n"); + kfree(data); + return 0; +} + + +static int __exit ist30xx_remove(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + + ist30xx_disable_irq(data); + free_irq(client->irq, data); + ist30xx_power_off(); + + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + + +static struct i2c_device_id ist30xx_idtable[] = { + { IST30XX_DEV_NAME, 0 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, ist30xx_idtable); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static const struct dev_pm_ops ist30xx_pm_ops = { + .suspend = ist30xx_suspend, + .resume = ist30xx_resume, +}; +#endif + +#ifdef CONFIG_OF +static const struct of_device_id ist30xxb_ts_of_match[] = { + { .compatible = "Imagis,IST30XX", }, + { } +}; +#endif + +static struct i2c_driver ist30xx_i2c_driver = { + .id_table = ist30xx_idtable, + .probe = ist30xx_probe, + .remove = __exit_p(ist30xx_remove), + .shutdown = ist30xx_shutdown, + .driver = { + .owner = THIS_MODULE, + .name = IST30XX_DEV_NAME, +#ifdef CONFIG_HAS_EARLYSUSPEND + .pm = &ist30xx_pm_ops, +#endif + +#ifdef CONFIG_OF + .of_match_table = ist30xxb_ts_of_match, +#endif + }, +}; + +static int __init ist30xx_init(void) +{ + tsp_info("Imagis init called\n"); + return i2c_add_driver(&ist30xx_i2c_driver); +} + + +static void __exit ist30xx_exit(void) +{ + i2c_del_driver(&ist30xx_i2c_driver); +} + +module_init(ist30xx_init); +module_exit(ist30xx_exit); + +MODULE_DESCRIPTION("Imagis IST30XX touch driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx.h b/drivers/input/touchscreen/ist30xxa/ist30xx.h new file mode 100644 index 00000000..4c5bd332 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx.h @@ -0,0 +1,300 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_H__ +#define __IST30XX_H__ + +/* + * Support F/W ver : IST30xxB v5.0 + * Support IC : IST30xxB, IST3038 + * Release : 2014.06.13 by Sanghoon Kwak + */ + +#define IMAGIS_IST30XX (1) /* 3026, 3032 */ +#define IMAGIS_IST30XXB (2) /* 3026B, 3032B */ +#define IMAGIS_IST3038 (3) /* 3038 */ +#define IMAGIS_IST3044 (4) /* 3044 */ + +//#define IMAGIS_TSP_IC IMAGIS_IST30XXB +#define IMAGIS_TSP_IC IMAGIS_IST3038 + +#define I2C_BURST_MODE (1) +#define I2C_MONOPOLY_MODE (0) + +#define IST30XX_EVENT_MODE (1) +#if IST30XX_EVENT_MODE +# define IST30XX_NOISE_MODE (1) +# define IST30XX_TRACKING_MODE (1) +# define IST30XX_ALGORITHM_MODE (1) +#else +# define IST30XX_NOISE_MODE (0) +# define IST30XX_TRACKING_MODE (0) +# define IST30XX_ALGORITHM_MODE (0) +#endif + +#define IST30XX_USE_KEY (1) +#define IST30XX_DEBUG (1) +#define IST30XX_CMCS_TEST (1) +#define IST30XX_CHKIC (1) + +#define SEC_FACTORY_MODE (1) + +#define IST30XX_DEV_NAME "IST30XX" +#define IST30XX_CHIP_ID (0x30003000) +#define IST30XXA_CHIP_ID (0x300A300A) +#define IST30XXB_CHIP_ID (0x300B300B) +#define IST3038_CHIP_ID (0x30383038) + +#define IST30XX_DEV_ID (0xA0 >> 1) + +#define IST30XX_ADDR_LEN (4) +#define IST30XX_DATA_LEN (4) + +#define IST30XX_MAX_MT_FINGERS (10) +#define IST30XX_MAX_KEYS (5) + +#define IST30XX_MAX_X (480) +#define IST30XX_MAX_Y (800) +#define IST30XX_MAX_W (15) + +/* I2C Transfer msg number */ +#define WRITE_CMD_MSG_LEN (1) +#define READ_CMD_MSG_LEN (2) + +#define NORMAL_TEMPERATURE (0) +#define LOW_TEMPERATURE (1) +#define HIGH_TEMPERATURE (2) + +/* Local */ +#define TSP_LOCAL_EU (0) +#define TSP_LOCAL_EEU (1) +#define TSP_LOCAL_TD (11) +#define TSP_LOCAL_CMCC (12) +#define TSP_LOCAL_CU (13) +#define TSP_LOCAL_SPRD (14) +#define TSP_LOCAL_CTC (15) +#define TSP_LOCAL_INDIA (21) +#define TSP_LOCAL_SWASIA (22) +#define TSP_LOCAL_NA (31) +#define TSP_LOCAL_LA (32) +#define TSP_LOCAL_CODE TSP_LOCAL_EU + +/* Debug message */ +#define DEV_ERR (1) +#define DEV_WARN (2) +#define DEV_INFO (3) +#define DEV_NOTICE (4) +#define DEV_DEBUG (5) +#define DEV_VERB (6) + +#define IST30XX_DEBUG_TAG "[ TSP ]" +#define IST30XX_DEBUG_LEVEL DEV_INFO + +#define tsp_err(fmt, ...) tsp_printk(DEV_ERR, fmt, ## __VA_ARGS__) +#define tsp_warn(fmt, ...) tsp_printk(DEV_WARN, fmt, ## __VA_ARGS__) +#define tsp_info(fmt, ...) tsp_printk(DEV_INFO, fmt, ## __VA_ARGS__) +#define tsp_notc(fmt, ...) tsp_printk(DEV_NOTICE, fmt, ## __VA_ARGS__) +#define tsp_debug(fmt, ...) tsp_printk(DEV_DEBUG, fmt, ## __VA_ARGS__) +#define tsp_verb(fmt, ...) tsp_printk(DEV_VERB, fmt, ## __VA_ARGS__) + +enum ist30xx_commands { + CMD_ENTER_UPDATE = 0x02, + CMD_EXIT_UPDATE = 0x03, + CMD_UPDATE_SENSOR = 0x04, + CMD_UPDATE_CONFIG = 0x05, + CMD_ENTER_REG_ACCESS = 0x07, + CMD_EXIT_REG_ACCESS = 0x08, + CMD_SET_NOISE_MODE = 0x0A, + CMD_START_SCAN = 0x0B, + CMD_ENTER_FW_UPDATE = 0x0C, + CMD_RUN_DEVICE = 0x0D, + CMD_EXEC_MEM_CODE = 0x0E, + CMD_SET_TEST_MODE = 0x0F, + + CMD_CALIBRATE = 0x11, + CMD_USE_IDLE = 0x12, + CMD_USE_DEBUG = 0x13, + CMD_ZVALUE_MODE = 0x15, + CMD_SAME_POSITION = 0x16, + CMD_CHECK_CALIB = 0x1A, + CMD_SET_TEMPER_MODE = 0x1B, + CMD_USE_CORRECT_CP = 0x1C, + CMD_SET_REPORT_RATE = 0x1D, + CMD_SET_IDLE_TIME = 0x1E, + + CMD_GET_COORD = 0x20, + + CMD_GET_CHIP_ID = 0x30, + CMD_GET_FW_VER = 0x31, + CMD_GET_CHECKSUM = 0x32, + CMD_GET_LCD_RESOLUTION = 0x33, + CMD_GET_TSP_CHNUM1 = 0x34, + CMD_GET_PARAM_VER = 0x35, + CMD_GET_SUB_VER = 0x36, + CMD_GET_CALIB_RESULT = 0x37, + CMD_GET_TSP_SWAP_INFO = 0x38, + CMD_GET_KEY_INFO1 = 0x39, + CMD_GET_KEY_INFO2 = 0x3A, + CMD_GET_KEY_INFO3 = 0x3B, + CMD_GET_TSP_CHNUM2 = 0x3C, + CMD_GET_TSP_DIRECTION = 0x3D, + CMD_GET_TSP_VENDOR = 0x3E, + + CMD_GET_TSP_PANNEL_TYPE = 0x40, + CMD_GET_CHECKSUM_ALL = 0x41, + + CMD_SET_GESTURE_MODE = 0x50, + + CMD_DEFAULT = 0xFF, +}; + +#define CMD_FW_UPDATE_MAGIC (0x85FDAE8A) + +#define IST30XX_INTR_STATUS (0x00000C00) +#define CHECK_INTR_STATUS(n) (((n & IST30XX_INTR_STATUS) \ + == IST30XX_INTR_STATUS) ? 1 : 0) +#define PARSE_FINGER_CNT(n) ((n >> 12) & 0xF) +#define PARSE_KEY_CNT(n) ((n >> 21) & 0x7) +#define PARSE_FINGER_STATUS(n) (n & 0x3FF) /* Finger status: [9:0] */ +#define PARSE_KEY_STATUS(n) ((n >> 16) & 0x1F) /* Key status: [20:16] */ +#define PRESSED_FINGER(s, id) ((s & (1 << (id - 1))) ? true : false) +#define PRESSED_KEY(s, id) ((s & (1 << (16 + id - 1))) ? true : false) + +typedef union { + struct { + u32 y : 12; + u32 x : 12; + u32 area : 4; + u32 id : 4; + } bit_field; + u32 full_field; +} finger_info; + +struct ist30xx_status { + int power; + int update; + int calib; + int calib_msg; +#if IST30XX_CHKIC + int chkic_msg; +#endif + bool event_mode; + bool noise_mode; +}; + +struct ist30xx_fw { + u32 prev_core_ver; + u32 prev_param_ver; + u32 prev_sub_ver; + u32 core_ver; + u32 param_ver; + u32 sub_ver; + u32 index; + u32 size; + u32 chksum; + u32 buf_size; + u8 * buf; +}; + +#define IST30XX_TAG_MAGIC "ISTV1TAG" +struct ist30xx_tags { + char magic1[8]; + u32 fw_addr; + u32 fw_size; + u32 flag_addr; + u32 flag_size; + u32 cfg_addr; + u32 cfg_size; + u32 sensor1_addr; + u32 sensor1_size; + u32 sensor2_addr; + u32 sensor2_size; + u32 sensor3_addr; + u32 sensor3_size; + u32 chksum; + u32 reserved0; + u8 day; + u8 month; + u16 year; + u8 hour; + u8 min; + u8 sec; + u8 reserved1; + char magic2[8]; +}; + +#if SEC_FACTORY_MODE +#include "ist30xx_sec.h" +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +struct ist30xx_data { + struct i2c_client * client; + struct input_dev * input_dev; + struct ist30xx_platform_data * pdata; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + struct ist30xx_status status; + struct ist30xx_fw fw; + struct ist30xx_tags tags; +#if SEC_FACTORY_MODE + struct sec_factory sec; +#endif + u32 chip_id; + u32 tsp_type; + u32 max_fingers; + u32 max_keys; + u32 irq_enabled; + u32 t_status; + finger_info fingers[IST30XX_MAX_MT_FINGERS]; +}; + + +extern struct mutex ist30xx_mutex; +extern int ist30xx_dbg_level; + +void tsp_printk(int level, const char *fmt, ...); +int ist30xx_intr_wait(long ms); + +void ist30xx_enable_irq(struct ist30xx_data *data); +void ist30xx_disable_irq(struct ist30xx_data *data); +void ist30xx_set_ta_mode(bool charging); +void ist30xx_set_cover_mode(int mode); +void ist30xx_start(struct ist30xx_data *data); +int ist30xx_get_ver_info(struct ist30xx_data *data); + +int ist30xx_get_position(struct i2c_client *client, u32 *buf, u16 len); + +int ist30xx_read_cmd(struct i2c_client *client, u32 cmd, u32 *buf); +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val); + +int ist30xx_cmd_start_scan(struct i2c_client *client); +int ist30xx_cmd_calibrate(struct i2c_client *client); +int ist30xx_cmd_check_calib(struct i2c_client *client); +int ist30xx_cmd_update(struct i2c_client *client, int cmd); +int ist30xx_cmd_reg(struct i2c_client *client, int cmd); + +int ist30xx_power_on(bool download); +int ist30xx_power_off(void); +int ist30xx_reset(bool download); + +int ist30xx_internal_suspend(struct ist30xx_data *data); +int ist30xx_internal_resume(struct ist30xx_data *data); + +int ist30xx_init_system(void); + +#endif // __IST30XX_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_chkic_bin.h b/drivers/input/touchscreen/ist30xxa/ist30xx_chkic_bin.h new file mode 100644 index 00000000..d615bf37 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_chkic_bin.h @@ -0,0 +1,53 @@ + +/* IST3038 Check IC Binary */ + +unsigned char ist30xxb_chkic[] = { + 0x0D, 0x00, 0xA0, 0xE1, 0x10, 0xD0, 0x9F, 0xE5, 0x01, 0x40, 0x2D, 0xE9, 0x4E, 0x00, 0x00, 0xEB, + 0x01, 0x40, 0xBD, 0xE8, 0x00, 0xD0, 0xA0, 0xE1, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x0F, 0x00, 0x20, + 0x0C, 0x00, 0x9F, 0xE5, 0x0C, 0x00, 0x90, 0xE5, 0x02, 0x07, 0x10, 0xE2, 0x01, 0x00, 0xA0, 0x13, + 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x90, 0x00, 0x40, 0x0C, 0x00, 0x9F, 0xE5, 0x0C, 0x00, 0x90, 0xE5, + 0x02, 0x00, 0x10, 0xE2, 0x01, 0x00, 0xA0, 0x13, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x90, 0x00, 0x40, + 0x10, 0x40, 0x2D, 0xE9, 0x58, 0xE0, 0x9F, 0xE5, 0x00, 0x10, 0x9E, 0xE5, 0x54, 0x10, 0x9F, 0xE5, + 0x0F, 0xCA, 0xE0, 0xE3, 0x00, 0x10, 0x91, 0xE5, 0x01, 0x30, 0xA0, 0xE3, 0x01, 0x2A, 0xA0, 0xE1, + 0x21, 0x18, 0x0C, 0xE0, 0x22, 0x2A, 0xA0, 0xE1, 0x3C, 0xC0, 0x9F, 0xE5, 0x01, 0x40, 0x42, 0xE0, + 0x00, 0x10, 0xA0, 0xE3, 0x01, 0x21, 0x9E, 0xE7, 0x0C, 0x00, 0x51, 0xE1, 0xB2, 0x20, 0xC0, 0xE0, + 0x01, 0x00, 0x00, 0xAA, 0x04, 0x00, 0x52, 0xE1, 0xFF, 0x30, 0xA0, 0x13, 0x01, 0x10, 0x81, 0xE2, + 0x5A, 0x0F, 0x51, 0xE3, 0xF6, 0xFF, 0xFF, 0xDA, 0x10, 0x40, 0xBD, 0xE8, 0x03, 0x00, 0xA0, 0xE1, + 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x10, 0x10, 0x40, 0xF4, 0x02, 0x00, 0x20, 0x26, 0x01, 0x00, 0x00, + 0x14, 0x10, 0x9F, 0xE5, 0x00, 0x00, 0x50, 0xE3, 0x50, 0x01, 0x91, 0xE5, 0x03, 0x04, 0xC0, 0x03, + 0x13, 0x04, 0x80, 0x13, 0x50, 0x01, 0x81, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0xA0, 0x00, 0x40, + 0x14, 0x10, 0x9F, 0xE5, 0x00, 0x00, 0x50, 0xE3, 0x00, 0x00, 0x91, 0xE5, 0x02, 0x00, 0xC0, 0x03, + 0x02, 0x00, 0x80, 0x13, 0x00, 0x00, 0x81, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x90, 0x00, 0x40, + 0x0C, 0x00, 0x9F, 0xE5, 0x0C, 0x10, 0x90, 0xE5, 0x01, 0x00, 0x11, 0xE3, 0xFC, 0xFF, 0xFF, 0x0A, + 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x90, 0x00, 0x40, 0x0C, 0x00, 0x9F, 0xE5, 0xF8, 0x10, 0x90, 0xE5, + 0x0A, 0x18, 0x81, 0xE3, 0xF8, 0x10, 0x80, 0xE5, 0x1E, 0xFF, 0x2F, 0xE1, 0x00, 0x90, 0x00, 0x40, + 0x41, 0x11, 0xA0, 0xE1, 0x00, 0x20, 0xA0, 0xE3, 0x01, 0x10, 0x41, 0xE2, 0x01, 0x00, 0x71, 0xE3, + 0x04, 0x20, 0x80, 0x14, 0xFB, 0xFF, 0xFF, 0x1A, 0x1E, 0xFF, 0x2F, 0xE1, 0xF0, 0x43, 0x2D, 0xE9, + 0xF0, 0x60, 0x9F, 0xE5, 0xE9, 0xFF, 0xFF, 0xEB, 0xEC, 0x10, 0x9F, 0xE5, 0xEC, 0x00, 0x9F, 0xE5, + 0xF2, 0xFF, 0xFF, 0xEB, 0xE8, 0x10, 0x9F, 0xE5, 0x03, 0x04, 0xA0, 0xE3, 0x50, 0x01, 0x81, 0xE5, + 0x55, 0x0F, 0x81, 0xE2, 0x00, 0x10, 0xA0, 0xE3, 0x01, 0x80, 0xA0, 0xE1, 0x01, 0x10, 0x81, 0xE2, + 0x07, 0x00, 0x51, 0xE3, 0x04, 0x80, 0x80, 0xE4, 0xFB, 0xFF, 0xFF, 0xBA, 0xC4, 0x00, 0x9F, 0xE5, + 0xC4, 0x70, 0x9F, 0xE5, 0xCC, 0x00, 0x87, 0xE5, 0x41, 0x07, 0xA0, 0xE3, 0xE8, 0x00, 0x87, 0xE5, + 0xF0, 0x80, 0x87, 0xE5, 0x01, 0x40, 0xA0, 0xE3, 0xB0, 0x50, 0x9F, 0xE5, 0x04, 0x96, 0x64, 0xE0, + 0x01, 0x00, 0x00, 0xEA, 0x01, 0x00, 0x54, 0xE3, 0x01, 0x00, 0x00, 0x1A, 0x00, 0x90, 0x85, 0xE5, + 0x03, 0x00, 0x00, 0xEA, 0x02, 0x00, 0x54, 0xE3, 0x94, 0x00, 0x9F, 0x15, 0x00, 0x00, 0x85, 0x15, + 0x00, 0x80, 0x85, 0x05, 0x00, 0x00, 0xA0, 0xE3, 0x00, 0x10, 0x95, 0xE5, 0x00, 0x11, 0x86, 0xE7, + 0x01, 0x00, 0x80, 0xE2, 0x5A, 0x0F, 0x50, 0xE3, 0xFA, 0xFF, 0xFF, 0xDA, 0x3A, 0x00, 0x00, 0xEB, + 0x8A, 0xFF, 0xFF, 0xEB, 0x00, 0x00, 0x50, 0xE3, 0xFC, 0xFF, 0xFF, 0x0A, 0x0C, 0x00, 0x97, 0xE5, + 0x0C, 0x00, 0x87, 0xE5, 0xC3, 0xFF, 0xFF, 0xEB, 0x8A, 0xFF, 0xFF, 0xEB, 0x00, 0x00, 0x50, 0xE3, + 0xFC, 0xFF, 0xFF, 0x0A, 0x0C, 0x00, 0x97, 0xE5, 0x0C, 0x00, 0x87, 0xE5, 0xB5, 0x00, 0xA0, 0xE3, + 0x94, 0x00, 0x00, 0xE0, 0x24, 0x10, 0x9F, 0xE5, 0x00, 0x01, 0x81, 0xE0, 0xB5, 0x0F, 0x40, 0xE2, + 0x86, 0xFF, 0xFF, 0xEB, 0x01, 0x40, 0x84, 0xE2, 0x04, 0x00, 0x54, 0xE3, 0xDC, 0xFF, 0xFF, 0xBA, + 0xF0, 0x43, 0xBD, 0xE8, 0x07, 0x00, 0x00, 0xEA, 0xD4, 0x02, 0x10, 0x40, 0x7C, 0x08, 0x00, 0x00, + 0xF8, 0x02, 0x00, 0x20, 0x00, 0xA0, 0x00, 0x40, 0x03, 0x22, 0x01, 0x00, 0x00, 0x90, 0x00, 0x40, + 0xF4, 0x02, 0x00, 0x20, 0xFF, 0x0F, 0x00, 0xF4, 0x09, 0x28, 0xA0, 0xE3, 0x02, 0x10, 0xB0, 0xE1, + 0x01, 0x20, 0x42, 0xE2, 0xFC, 0xFF, 0xFF, 0x1A, 0x48, 0x20, 0x9F, 0xE5, 0x48, 0x10, 0x9F, 0xE5, + 0x1C, 0x20, 0x81, 0xE5, 0x1C, 0x00, 0x81, 0xE5, 0x40, 0x00, 0x9F, 0xE5, 0x0C, 0x20, 0x90, 0xE5, + 0x01, 0x20, 0xC2, 0xE3, 0x0C, 0x20, 0x80, 0xE5, 0x34, 0xC0, 0x9F, 0xE5, 0x34, 0x30, 0x9F, 0xE5, + 0x00, 0x00, 0xA0, 0xE3, 0x00, 0x21, 0x9C, 0xE7, 0x1C, 0x20, 0x81, 0xE5, 0x14, 0x20, 0x91, 0xE5, + 0x40, 0x00, 0x12, 0xE3, 0xFC, 0xFF, 0xFF, 0x1A, 0x01, 0x00, 0x80, 0xE2, 0x03, 0x00, 0x50, 0xE1, + 0xF7, 0xFF, 0xFF, 0xBA, 0xFE, 0xFF, 0xFF, 0xEA, 0xAB, 0x0F, 0xAB, 0x8F, 0x00, 0x40, 0x00, 0x30, + 0x00, 0x20, 0x00, 0x40, 0xF8, 0x02, 0x00, 0x20, 0x1F, 0x02, 0x00, 0x00, 0x01, 0x00, 0xA0, 0xE3, + 0x04, 0xE0, 0x2D, 0xE5, 0x7D, 0xFF, 0xFF, 0xEB, 0x04, 0xE0, 0x9D, 0xE4, 0x01, 0x00, 0xA0, 0xE3, + 0x72, 0xFF, 0xFF, 0xEA, 0x54, 0x29, 0xB5, 0xCB +}; diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.c b/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.c new file mode 100644 index 00000000..0b39b20f --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.c @@ -0,0 +1,1345 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" +#include "ist30xx_cmcs.h" + +#if IST30XX_INTERNAL_CMCS_BIN +#include "ist30xx_cmcs_bin.h" +#endif + +#define CMCS_PARSING_DEBUG (0) + +#define CMCS_READY (0) +#define CMCS_NOT_READY (-1) + +#define TSP_CH_UNUSED (0) +#define TSP_CH_SCREEN (1) +#define TSP_CH_KEY (2) +#define TSP_CH_UNKNOWN (-1) + +extern struct ist30xx_data *ts_data; + +int cmcs_ready = CMCS_READY; +u8 *ts_cmcs_bin = NULL; +u32 ts_cmcs_bin_size = 0; +CMCS_BIN_INFO ist30xx_cmcs_bin; +CMCS_BIN_INFO *ts_cmcs = (CMCS_BIN_INFO *)&ist30xx_cmcs_bin; +CMCS_BUF ist30xx_cmcs_buf; +CMCS_BUF *ts_cmcs_buf = (CMCS_BUF *)&ist30xx_cmcs_buf; + + +int ist30xx_parse_cmcs_bin(const u8 *buf, const u32 size) +{ + int ret = -EPERM; + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + memcpy(ts_cmcs->magic1, buf, sizeof(ts_cmcs->magic1)); + memcpy(ts_cmcs->magic2, &buf[size - sizeof(ts_cmcs->magic2)], + sizeof(ts_cmcs->magic2)); + memcpy(cmcs, &buf[sizeof(ts_cmcs->magic1)], sizeof(ts_cmcs->cmcs)); + + if (!strncmp(ts_cmcs->magic1, IST30XX_CMCS_MAGIC, sizeof(ts_cmcs->magic1)) + && !strncmp(ts_cmcs->magic2, IST30XX_CMCS_MAGIC, + sizeof(ts_cmcs->magic2))) { + int idx; + + idx = sizeof(ts_cmcs->magic1) + sizeof(ts_cmcs->cmcs); + ts_cmcs->buf_cmcs = (u8 *)&buf[idx]; + + idx += cmcs->cmd.cmcs_size; + ts_cmcs->buf_sensor = (u32 *)&buf[idx]; + + idx += (cmcs->sensor1_size + cmcs->sensor2_size + cmcs->sensor3_size); + ts_cmcs->buf_node = (u16 *)&buf[idx]; + + ret = 0; + } + + tsp_verb("Magic1: %s, Magic2: %s\n", ts_cmcs->magic1, ts_cmcs->magic2); + tsp_verb(" mode: 0x%x, base(screen: %d, key: %d)\n", + cmcs->cmd.mode, cmcs->cmd.base_screen, cmcs->cmd.base_key); + tsp_verb(" start_cp (cm: %d, cs: %d), vcmp (cm: %d, cs: %d)\n", + cmcs->cmd.start_cp_cm, cmcs->cmd.start_cp_cs, + cmcs->cmd.vcmp_cm, cmcs->cmd.vcmp_cs); + tsp_verb(" timeout: %d\n", cmcs->timeout); + tsp_verb(" baseline scrn: 0x%08x, key: 0x%08x\n", + cmcs->addr.base_screen, cmcs->addr.base_key); + tsp_verb(" start_cp: 0x%08x, vcmp: 0x%08x\n", + cmcs->addr.start_cp, cmcs->addr.vcmp); + tsp_verb(" sensor 1: 0x%08x, 2: 0x%08x, 3: 0x%08x\n", + cmcs->addr.sensor1, cmcs->addr.sensor2, cmcs->addr.sensor3); + tsp_verb(" tx: %d, rx:%d, key rx: %d, num(%d, %d, %d, %d, %d)\n", + cmcs->ch.tx_num, cmcs->ch.rx_num, cmcs->ch.key_rx, cmcs->ch.key1, + cmcs->ch.key2, cmcs->ch.key3, cmcs->ch.key4, cmcs->ch.key5); + tsp_verb(" cr: screen(%4d, %4d), key(%4d, %4d)\n", + cmcs->spec_cr.screen_min, cmcs->spec_cr.screen_max, + cmcs->spec_cr.key_min, cmcs->spec_cr.key_max); + tsp_verb(" cm: screen(%4d, %4d), key(%4d, %4d)\n", + cmcs->spec_cm.screen_min, cmcs->spec_cm.screen_max, + cmcs->spec_cm.key_min, cmcs->spec_cm.key_max); + tsp_verb(" cs0: screen(%4d, %4d), key(%4d, %4d)\n", + cmcs->spec_cs0.screen_min, cmcs->spec_cs0.screen_max, + cmcs->spec_cs0.key_min, cmcs->spec_cs0.key_max); + tsp_verb(" cs1: screen(%4d, %4d), key(%4d, %4d)\n", + cmcs->spec_cs1.screen_min, cmcs->spec_cs1.screen_max, + cmcs->spec_cs1.key_min, cmcs->spec_cs1.key_max); + tsp_verb(" slope - x(%d, %d), y(%d, %d), key(%d, %d)\n", + cmcs->slope.x_min, cmcs->slope.x_max, + cmcs->slope.y_min, cmcs->slope.y_max, + cmcs->slope.key_min, cmcs->slope.key_max); + tsp_verb(" size - cmcs(%d), sensor(%d, %d, %d)\n", + cmcs->cmd.cmcs_size, cmcs->sensor1_size, + cmcs->sensor2_size, cmcs->sensor3_size); + tsp_verb(" checksum - cmcs: 0x%08x, sensor: 0x%08x\n", + cmcs->cmcs_chksum, cmcs->sensor_chksum); + tsp_verb(" cmcs: %x, %x, %x, %x\n", ts_cmcs->buf_cmcs[0], + ts_cmcs->buf_cmcs[1], ts_cmcs->buf_cmcs[2], ts_cmcs->buf_cmcs[3]); + tsp_verb(" sensor: %x, %x, %x, %x\n", + ts_cmcs->buf_sensor[0], ts_cmcs->buf_sensor[1], + ts_cmcs->buf_sensor[2], ts_cmcs->buf_sensor[3]); + tsp_verb(" node: %x, %x, %x, %x\n", + ts_cmcs->buf_node[0], ts_cmcs->buf_node[1], + ts_cmcs->buf_node[2], ts_cmcs->buf_node[3]); + + return ret; +} + +int ist30xx_get_cmcs_info(const u8 *buf, const u32 size) +{ + int ret; + + cmcs_ready = CMCS_NOT_READY; + + ret = ist30xx_parse_cmcs_bin(buf, size); + if (unlikely(ret != TAGS_PARSE_OK)) + tsp_warn("Cannot find tags of CMCS, make a bin by 'cmcs2bin.exe'\n"); + + return ret; +} + +int ist30xx_set_cmcs_sensor(struct i2c_client *client, CMCS_INFO *cmcs, + u32 *buf32) +{ + int i, ret; + int len; + u32 waddr; + u32 *tmp32; + + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + + waddr = cmcs->addr.sensor1; + len = cmcs->sensor1_size / IST30XX_DATA_LEN; + + for (i = 0; i < len; i++) { + ret = ist30xx_write_cmd(client, waddr, *buf32++); + if (ret) + return ret; + + waddr += IST30XX_DATA_LEN; + } + + tmp32 = buf32; + tsp_verb("%08x %08x %08x %08x\n", tmp32[0], tmp32[1], tmp32[2], tmp32[3]); + + waddr = cmcs->addr.sensor2; + len = (cmcs->sensor2_size - 0x10) / IST30XX_DATA_LEN; + + for (i = 0; i < len; i++) { + ret = ist30xx_write_cmd(client, waddr, *buf32++); + if (ret) + return ret; + + waddr += IST30XX_DATA_LEN; + } + buf32 += (0x10 / IST30XX_DATA_LEN); + + tmp32 = buf32; + tsp_verb("%08x %08x %08x %08x\n", tmp32[0], tmp32[1], tmp32[2], tmp32[3]); + + waddr = cmcs->addr.sensor3; + len = cmcs->sensor3_size / IST30XX_DATA_LEN; + + for (i = 0; i < len; i++) { + ret = ist30xx_write_cmd(client, waddr, *buf32++); + if (ret) + return ret; + + waddr += IST30XX_DATA_LEN; + } + + return 0; +} + +int ist30xx_set_cmcs_cmd(struct i2c_client *client, CMCS_INFO *cmcs) +{ + int ret; + u32 val; + + val = (u32)(cmcs->cmd.base_screen | (cmcs->cmd.mode << 16)); + ret = ist30xx_write_cmd(client, cmcs->addr.base_screen, val); + if (ret) + return ret; + tsp_verb("Baseline screen(0x%08x): 0x%08x\n", cmcs->addr.base_screen, val); + + val = (u32)cmcs->cmd.base_key; + ret = ist30xx_write_cmd(client, cmcs->addr.base_key, val); + if (ret) + return ret; + tsp_verb("Baseline key(0x%08x): 0x%08x\n", cmcs->addr.base_key, val); + + val = cmcs->cmd.start_cp_cm | (cmcs->cmd.start_cp_cs << 16); + ret = ist30xx_write_cmd(client, cmcs->addr.start_cp, val); + if (ret) + return ret; + tsp_verb("StartCP(0x%08x): 0x%08x\n", cmcs->addr.start_cp, val); + + val = cmcs->cmd.vcmp_cm | (cmcs->cmd.vcmp_cs << 16); + ret = ist30xx_write_cmd(client, cmcs->addr.vcmp, val); + if (ret) + return ret; + tsp_verb("VCMP(0x%08x): 0x%08x\n", cmcs->addr.vcmp, val); + + return 0; +} + +int ist30xx_parse_cmcs_buf(CMCS_INFO *cmcs, s16 *buf) +{ + int i, j; + + tsp_info(" %d * %d\n", cmcs->ch.tx_num, cmcs->ch.rx_num); + for (i = 0; i < cmcs->ch.tx_num; i++) { + tsp_info(" "); + for (j = 0; j < cmcs->ch.rx_num; j++) + printk("%5d ", buf[i * cmcs->ch.rx_num + j]); + printk("\n"); + } + + return 0; +} + +int ist30xx_apply_cmcs_slope(CMCS_INFO *cmcs, CMCS_BUF *cmcs_buf) +{ + int i, j; + int idx1, idx2; + int ch_num = cmcs->ch.tx_num * cmcs->ch.rx_num; + int width = cmcs->ch.rx_num; + int height = cmcs->ch.tx_num; + s16 *pcm = (s16 *)cmcs_buf->cm; + s16 *pspec = (s16 *)cmcs_buf->spec; + s16 *pslope0 = (s16 *)cmcs_buf->slope0; + s16 *pslope1 = (s16 *)cmcs_buf->slope1; + + if (cmcs->ch.key_rx) + width -= 1; + else + height -= 1; + + memset(cmcs_buf->slope0, 0, sizeof(cmcs_buf->slope0)); + memset(cmcs_buf->slope1, 0, sizeof(cmcs_buf->slope1)); + + memcpy(cmcs_buf->spec, ts_cmcs->buf_node, (ch_num * sizeof(u16))); + + idx1 = 0; +#if CMCS_PARSING_DEBUG + tsp_info("# Node specific\n"); + for (i = 0; i < cmcs->ch.tx_num; i++) { + tsp_info(" "); + for (j = 0; j < cmcs->ch.rx_num; j++) + printk("%5d ", cmcs_buf->spec[idx1++]); + printk("\n"); + } +#endif + + tsp_verb("# Apply slope0_x\n"); + for (i = 0; i < height; i++) { + for (j = 0; j < width - 1; j++) { + idx1 = (i * cmcs->ch.rx_num) + j; + idx2 = idx1 + 1; + + pslope0[idx1] = (pcm[idx2] - pcm[idx1]); + pslope0[idx1] += (pspec[idx1] - pspec[idx2]); + } + } + + tsp_verb("# Apply slope1_y\n"); + for (i = 0; i < height - 1; i++) { + for (j = 0; j < width; j++) { + idx1 = (i * cmcs->ch.rx_num) + j; + idx2 = idx1 + cmcs->ch.rx_num; + + pslope1[idx1] = (pcm[idx2] - pcm[idx1]); + pslope1[idx1] += (pspec[idx1] - pspec[idx2]); + } + } + +#if CMCS_PARSING_DEBUG + tsp_info("# slope0_x\n"); + for (i = 0; i < height; i++) { + tsp_info(" "); + for (j = 0; j < width; j++) { + idx1 = (i * cmcs->ch.rx_num) + j; + printk("%5d ", pslope0[idx1]); + } + printk("\n"); + } + + tsp_info("# slope1_y\n"); + for (i = 0; i < height; i++) { + tsp_info(" "); + for (j = 0; j < width; j++) { + idx1 = (i * cmcs->ch.rx_num) + j; + printk("%5d ", pslope1[idx1]); + } + printk("\n"); + } +#endif + + return 0; +} + + +int ist30xx_get_cmcs_buf(struct i2c_client *client, CMCS_INFO *cmcs, s16 *buf) +{ + int ret; + u16 len = (IST30XX_CMCS_BUF_SIZE * sizeof(buf[0])) / IST30XX_DATA_LEN; + + ret = ist30xx_read_buf(client, CMD_DEFAULT, (u32 *)buf, len); + if (unlikely(ret)) + return ret; + +#if CMCS_PARSING_DEBUG + ret = ist30xx_parse_cmcs_buf(cmcs, buf); +#endif + + return ret; +} + + +extern int ist30xx_calib_wait(void); +#define cmcs_next_step(ret) { if (unlikely(ret)) goto end; msleep(10); } +int ist30xx_cmcs_test(const u8 *buf, int size) +{ + int ret; + int len; + u32 chksum = 0; + u32 *buf32; + struct i2c_client *client = (struct i2c_client *)ts_data->client; + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + tsp_info("*** CM/CS test ***\n"); + tsp_info(" mode: 0x%x, baseline(screen: %d, key: %d)\n", + cmcs->cmd.mode, cmcs->cmd.base_screen, cmcs->cmd.base_key); + tsp_info(" start_cp (cm: %d, cs: %d), vcmp (cm: %d, cs: %d)\n", + cmcs->cmd.start_cp_cm, cmcs->cmd.start_cp_cs, + cmcs->cmd.vcmp_cm, cmcs->cmd.vcmp_cs); + + ist30xx_disable_irq(ts_data); + + ist30xx_reset(false); + + ret = ist30xx_cmd_reg(client, CMD_ENTER_REG_ACCESS); + cmcs_next_step(ret); + + /* Set sensor register */ + buf32 = ts_cmcs->buf_sensor; + ret = ist30xx_set_cmcs_sensor(client, cmcs, buf32); + cmcs_next_step(ret); + + /* Set command */ + ret = ist30xx_set_cmcs_cmd(client, cmcs); + cmcs_next_step(ret); + + ret = ist30xx_cmd_reg(client, CMD_EXIT_REG_ACCESS); + cmcs_next_step(ret); + + /* Load cmcs test code */ + ret = ist30xx_write_cmd(client, CMD_EXEC_MEM_CODE, 0); + cmcs_next_step(ret); + + buf32 = (u32 *)ts_cmcs->buf_cmcs; + len = cmcs->cmd.cmcs_size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + ret = ist30xx_write_buf(client, len, buf32, len); + cmcs_next_step(ret); + + /* Check checksum */ + ret = ist30xx_read_cmd(client, CMD_DEFAULT, &chksum); + cmcs_next_step(ret); + if (chksum != IST30XX_CMCS_LOAD_END) + goto end; + tsp_info("CM/CS code ready!!\n"); + + /* Check checksum */ + ret = ist30xx_read_cmd(client, CMD_DEFAULT, &chksum); + cmcs_next_step(ret); + tsp_info("CM/CS code chksum: %08x, %08x\n", chksum, cmcs->cmcs_chksum); + + ist30xx_enable_irq(ts_data); + /* Wait CMCS test result */ + if (ist30xx_calib_wait() == 1) + tsp_info("CM/CS test OK.\n"); + else + tsp_info("CM/CS test fail.\n"); + ist30xx_disable_irq(ts_data); + + /* Read CM/CS data*/ + if (ENABLE_CM_MODE(cmcs->cmd.mode)) { + /* Read CM data */ + memset(ts_cmcs_buf->cm, 0, sizeof(ts_cmcs_buf->cm)); + + ret = ist30xx_get_cmcs_buf(client, cmcs, ts_cmcs_buf->cm); + cmcs_next_step(ret); + + ret = ist30xx_apply_cmcs_slope(cmcs, ts_cmcs_buf); + } + + if (ENABLE_CS_MODE(cmcs->cmd.mode)) { + /* Read CS0 data */ + memset(ts_cmcs_buf->cs0, 0, sizeof(ts_cmcs_buf->cs0)); + memset(ts_cmcs_buf->cs1, 0, sizeof(ts_cmcs_buf->cs1)); + + ret = ist30xx_get_cmcs_buf(client, cmcs, ts_cmcs_buf->cs0); + cmcs_next_step(ret); + + /* Read CS1 data */ + ret = ist30xx_get_cmcs_buf(client, cmcs, ts_cmcs_buf->cs1); + cmcs_next_step(ret); + } + + ist30xx_reset(false); + + ist30xx_start(ts_data); + + cmcs_ready = CMCS_READY; + +end: + if (unlikely(ret)) { + tsp_warn("CM/CS test Fail!, ret=%d\n", ret); + } else if (unlikely(chksum != cmcs->cmcs_chksum)) { + tsp_warn("Error CheckSum: %x(%x)\n", chksum, cmcs->cmcs_chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + + return ret; +} + + +int check_tsp_type(int tx, int rx) +{ + struct CMCS_CH_INFO *ch = (struct CMCS_CH_INFO *)&ts_cmcs->cmcs.ch; + + int last_rx_ch = (int)ch->rx_num - 1; + int last_tx_ch = (int)ch->tx_num - 1; + + if ((rx > last_rx_ch) || (rx < 0) || (tx > last_tx_ch) || (tx < 0)) { + tsp_warn("TSP channel is not correct!! (%d * %d)\n", tx, rx); + return TSP_CH_UNKNOWN; + } + + if (ch->key_rx) { // Key on RX channel + if (rx == last_rx_ch) { + if ((tx == ch->key1) || (tx == ch->key2) || (tx == ch->key3) || + (tx == ch->key4) || (tx == ch->key5)) + return TSP_CH_KEY; + else + return TSP_CH_UNUSED; + } + } // Key on TX channel + else { + if (tx == last_tx_ch) { + if ((rx == ch->key1) || (rx == ch->key2) || (rx == ch->key3) || + (rx == ch->key4) || (rx == ch->key5)) + return TSP_CH_KEY; + else + return TSP_CH_UNUSED; + } + } + + return TSP_CH_SCREEN; +} + +int print_cmcs(s16 *buf16, char *buf) +{ + int i, j; + int idx; + int count = 0; + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + int tx_num = cmcs->ch.tx_num; + int rx_num = cmcs->ch.rx_num; + + for (i = 0; i < tx_num; i++) { + for (j = 0; j < rx_num; j++) { + idx = (i * cmcs->ch.rx_num) + j; + count += sprintf(msg, "%5d ", buf16[idx]); + strcat(buf, msg); + } + + count += sprintf(msg, "\n"); + strcat(buf, msg); + } + + return count; +} + +int print_line_cmcs(int mode, s16 *buf16, char *buf) +{ + int i, j; + int idx; + int type; + int count = 0; + int key_index[5] = { 0, }; + int key_cnt = 0; + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + int tx_num = cmcs->ch.tx_num; + int rx_num = cmcs->ch.rx_num; + + if ((mode == CMCS_FLAG_CM_SLOPE0) || (mode == CMCS_FLAG_CM_SLOPE1)) { + if (cmcs->ch.key_rx) + rx_num--; + else + tx_num--; + } + + for (i = 0; i < tx_num; i++) { + for (j = 0; j < rx_num; j++) { + type = check_tsp_type(i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; // Ignore + + if ((mode == CMCS_FLAG_CM_SLOPE0) && (j == (rx_num - 1))) + continue; + else if ((mode == CMCS_FLAG_CM_SLOPE1) && (i == (tx_num - 1))) + continue; + + idx = (i * cmcs->ch.rx_num) + j; + + if (type == TSP_CH_KEY) { + key_index[key_cnt++] = idx; + continue; + } + + count += sprintf(msg, "%5d ", buf16[idx]); + strcat(buf, msg); + } + } + + tsp_info("key cnt: %d\n", key_cnt); + if ((mode != CMCS_FLAG_CM_SLOPE0) && (mode != CMCS_FLAG_CM_SLOPE1)) { + tsp_info("key cnt: %d\n", key_cnt); + for (i = 0; i < key_cnt; i++) { + count += sprintf(msg, "%5d ", buf16[key_index[i]]); + strcat(buf, msg); + } + } + + count += sprintf(msg, "\n"); + strcat(buf, msg); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/info */ +ssize_t ist30xx_cmcs_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count; + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if (cmcs == NULL) + return sprintf(buf, "Unknown cmcs bin\n"); + + /* Mode */ + count = sprintf(msg, "%d ", cmcs->cmd.mode); + strcat(buf, msg); + + /* Channel */ + count += sprintf(msg, "%d %d %d %d %d %d %d %d ", + cmcs->ch.tx_num, cmcs->ch.rx_num, cmcs->ch.key_rx, cmcs->ch.key1, + cmcs->ch.key2, cmcs->ch.key3, cmcs->ch.key4, cmcs->ch.key5); + strcat(buf, msg); + + /* Slope */ + count += sprintf(msg, "%d %d %d %d %d %d", + cmcs->slope.x_min, cmcs->slope.x_max, + cmcs->slope.y_min, cmcs->slope.y_max, + cmcs->slope.key_min, cmcs->slope.key_max); + strcat(buf, msg); + + /* CM */ + count += sprintf(msg, "%d %d %d %d ", + cmcs->spec_cm.screen_min, cmcs->spec_cm.screen_max, + cmcs->spec_cm.key_min, cmcs->spec_cm.key_max); + strcat(buf, msg); + + /* CS0 */ + count += sprintf(msg, "%d %d %d %d ", + cmcs->spec_cs0.screen_min, cmcs->spec_cs0.screen_max, + cmcs->spec_cs0.key_min, cmcs->spec_cs0.key_max); + strcat(buf, msg); + + /* CS1 */ + count += sprintf(msg, "%d %d %d %d ", + cmcs->spec_cs1.screen_min, cmcs->spec_cs1.screen_max, + cmcs->spec_cs1.key_min, cmcs->spec_cs1.key_max); + strcat(buf, msg); + + /* CR */ + count += sprintf(msg, "%d %d %d %d ", + cmcs->spec_cr.screen_min, cmcs->spec_cr.screen_max, + cmcs->spec_cr.key_min, cmcs->spec_cr.key_max); + strcat(buf, msg); + + tsp_verb("%s\n", buf); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/cmcs_binary */ +ssize_t ist30xx_cmcs_binary_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + + if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) + return sprintf(buf, "Binary is not correct(%d)\n", ts_cmcs_bin_size); + + ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(ts_cmcs_bin, ts_cmcs_bin_size); + mutex_unlock(&ist30xx_mutex); + + return sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n")); +} + +/* sysfs: /sys/class/touch/cmcs/cmcs_custom */ +ssize_t ist30xx_cmcs_custom_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + int bin_size = 0; + u8 *bin = NULL; + const struct firmware *req_bin = NULL; + + ret = request_firmware(&req_bin, IST30XXB_CMCS_NAME, &ts_data->client->dev); + if (ret) + return sprintf(buf, "File not found, %s\n", IST30XXB_CMCS_NAME); + + bin = (u8 *)req_bin->data; + bin_size = (u32)req_bin->size; + + ist30xx_get_cmcs_info(bin, bin_size); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(bin, bin_size); + mutex_unlock(&ist30xx_mutex); + + release_firmware(req_bin); + + tsp_info("size: %d\n", sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n"))); + + return sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n")); +} + +#define MAX_FILE_PATH 255 +/* sysfs: /sys/class/touch/cmcs/cmcs_sdcard */ +ssize_t ist30xx_cmcs_sdcard_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + int bin_size = 0; + u8 *bin = NULL; + const u8 *buff = 0; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FILE_PATH]; + + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/touch/firmware/%s", + IST30XXB_CMCS_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + ret = -ENOENT; + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + tsp_info("fail to alloc buffer\n"); + ret = -ENOMEM; + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_info("mismatch fw size\n"); + + goto err_fw_size; + } + + bin = (u8 *)buff; + bin_size = (u32)fsize; + + filp_close(fp, current->files); + set_fs(old_fs); + tsp_info("firmware is loaded!!\n"); + + ist30xx_get_cmcs_info(bin, bin_size); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(bin, bin_size); + mutex_unlock(&ist30xx_mutex); + + kfree(buff); + + tsp_info("size: %d\n", sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n"))); + + return sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n")); + +err_fw_size: + if (buff) + kfree(buff); +err_alloc: + if (fp) + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + + return 0; +} + +/* sysfs: /sys/class/touch/cmcs/cm */ +ssize_t ist30xx_cm_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + tsp_verb("CM (%d * %d)\n", cmcs->ch.tx_num, cmcs->ch.rx_num); + + return print_cmcs(ts_cmcs_buf->cm, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_spec */ +ssize_t ist30xx_cm_spec_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + tsp_verb("CM Spec (%d * %d)\n", cmcs->ch.tx_num, cmcs->ch.rx_num); + + return print_cmcs(ts_cmcs_buf->spec, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope0 */ +ssize_t ist30xx_cm_slope0_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + tsp_verb("CM Slope0_X (%d * %d)\n", cmcs->ch.tx_num, cmcs->ch.rx_num); + + return print_cmcs(ts_cmcs_buf->slope0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope1 */ +ssize_t ist30xx_cm_slope1_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + tsp_verb("CM Slope1_Y (%d * %d)\n", + ts_cmcs->cmcs.ch.tx_num, ts_cmcs->cmcs.ch.rx_num); + + return print_cmcs(ts_cmcs_buf->slope1, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cs0 */ +ssize_t ist30xx_cs0_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CS)) + return 0; + + tsp_verb("CS0 (%d * %d)\n", cmcs->ch.tx_num, cmcs->ch.rx_num); + + return print_cmcs(ts_cmcs_buf->cs0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cs1 */ +ssize_t ist30xx_cs1_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CS)) + return 0; + + tsp_verb("CS1 (%d * %d)\n", cmcs->ch.tx_num, cmcs->ch.rx_num); + + return print_cmcs(ts_cmcs_buf->cs1, buf); +} + + +int print_cm_slope_result(u8 flag, s16 *buf16, char *buf) +{ + int i, j; + int type, idx; + int count = 0, err_cnt = 0; + int min_spec, max_spec; + + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + struct CMCS_SLOPE_INFO *spec = (struct CMCS_SLOPE_INFO *)&cmcs->slope; + + if (flag == CMCS_FLAG_CM_SLOPE0) { + min_spec = spec->x_min; + max_spec = spec->x_max; + } else if (flag == CMCS_FLAG_CM_SLOPE1) { + min_spec = spec->y_min; + max_spec = spec->y_max; + } else { + count = sprintf(msg, "Unknown flag: %d\n", flag); + strcat(buf, msg); + return count; + } + + min_spec *= -1; + + count = sprintf(msg, "Spec: %d ~ %d\n", min_spec, max_spec); + strcat(buf, msg); + + for (i = 0; i < cmcs->ch.tx_num; i++) { + for (j = 0; j < cmcs->ch.rx_num; j++) { + idx = (i * cmcs->ch.rx_num) + j; + + type = check_tsp_type(i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; // Ignore + + if ((buf16[idx] > min_spec) && (buf16[idx] < max_spec)) + continue; // OK + + count += sprintf(msg, "%2d,%2d:%4d\n", i, j, buf16[idx]); + strcat(buf, msg); + + err_cnt++; + } + } + + /* Check error count */ + if (err_cnt == 0) + count += sprintf(msg, "OK\n"); + else + count += sprintf(msg, "Fail, node count: %d\n", err_cnt); + strcat(buf, msg); + + return count; +} + +int print_cm_key_slope_result(s16 *buf16, char *buf, bool print) +{ + int i, j; + int type, idx; + int count = 0; + int min_spec, max_spec; + int key_num = 0; + s16 key_cm[5] = { 0, }; + s16 slope_result; + + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + struct CMCS_SLOPE_INFO *spec = (struct CMCS_SLOPE_INFO *)&cmcs->slope; + + min_spec = spec->key_min; + max_spec = spec->key_max; + + min_spec *= -1; + if (print) { + count = sprintf(msg, "Spec: %d ~ %d\n", min_spec, max_spec); + strcat(buf, msg); + } + + for (i = 0; i < cmcs->ch.tx_num; i++) { + for (j = 0; j < cmcs->ch.rx_num; j++) { + idx = (i * cmcs->ch.rx_num) + j; + + type = check_tsp_type(i, j); + if (type == TSP_CH_KEY) + key_cm[key_num++] = buf16[idx]; + } + } + + /* Check key slope */ + slope_result = key_cm[0] - key_cm[1]; + + if (print) { + if ((slope_result > min_spec) && (slope_result < max_spec)) + count += sprintf(msg, "OK (%d)\n", slope_result); + else + count += sprintf(msg, "Fail (%d)\n", slope_result); + } else { + count += sprintf(msg, "%d\n", + (slope_result > 0 ? slope_result : -slope_result)); + } + + strcat(buf, msg); + + return count; +} + +int print_cs_result(s16 *buf16, char *buf, int cs_num) +{ + int i, j; + int type, idx; + int count = 0, err_cnt = 0; + int min_spec, max_spec; + + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + struct CMCS_SPEC_INFO *spec; + + if (cs_num == 0) + spec = (struct CMCS_SPEC_INFO *)&cmcs->spec_cs0; + else + spec = (struct CMCS_SPEC_INFO *)&cmcs->spec_cs1; + + count = sprintf(msg, "Spec: screen(%d~%d), key(%d~%d)\n", + spec->screen_min, spec->screen_max, spec->key_min, spec->key_max); + strcat(buf, msg); + + for (i = 0; i < cmcs->ch.tx_num; i++) { + for (j = 0; j < cmcs->ch.rx_num; j++) { + idx = (i * cmcs->ch.rx_num) + j; + + type = check_tsp_type(i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; // Ignore + + if (type == TSP_CH_SCREEN) { + min_spec = spec->screen_min; + max_spec = spec->screen_max; + } else { // TSP_CH_KEY + min_spec = spec->key_min; + max_spec = spec->key_max; + } + + if ((buf16[idx] > min_spec) && (buf16[idx] < max_spec)) + continue; // OK + + count += sprintf(msg, "%2d,%2d:%4d\n", i, j, buf16[idx]); + strcat(buf, msg); + + err_cnt++; + } + } + + /* Check error count */ + if (err_cnt == 0) + count += sprintf(msg, "OK\n"); + else + count += sprintf(msg, "Fail, node count: %d\n", err_cnt); + strcat(buf, msg); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/cm_result */ +ssize_t ist30xx_cm_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, j; + int type, idx, err_cnt = 0; + int min_spec, max_spec; + int count = 0; + short cm; + char msg[128]; + + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + for (i = 0; i < cmcs->ch.tx_num; i++) { + for (j = 0; j < cmcs->ch.rx_num; j++) { + idx = (i * cmcs->ch.rx_num) + j; + + type = check_tsp_type(i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; + + min_spec = max_spec = ts_cmcs_buf->spec[idx]; + if (type == TSP_CH_SCREEN) { + min_spec -= (min_spec * cmcs->spec_cm.screen_min / 100); + max_spec += (min_spec * cmcs->spec_cm.screen_max / 100); + } else { // TSP_CH_KEY + min_spec -= (min_spec * cmcs->spec_cm.key_min / 100); + max_spec += (min_spec * cmcs->spec_cm.key_max / 100); + } + + cm = ts_cmcs_buf->cm[idx]; + if ((cm > min_spec) && (cm < max_spec)) + continue; // OK + + count += sprintf(msg, "%2d,%2d:%4d (%4d~%4d)\n", + i, j, cm, min_spec, max_spec); + strcat(buf, msg); + + err_cnt++; + } + } + + /* Check error count */ + if (err_cnt == 0) + count += sprintf(msg, "OK\n"); + else + count += sprintf(msg, "Fail, node count: %d\n", err_cnt); + strcat(buf, msg); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope0_result */ +ssize_t ist30xx_cm_slope0_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + return print_cm_slope_result(CMCS_FLAG_CM_SLOPE0, + ts_cmcs_buf->slope0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope1_result */ +ssize_t ist30xx_cm_slope1_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + return print_cm_slope_result(CMCS_FLAG_CM_SLOPE1, + ts_cmcs_buf->slope1, buf); +} +/* sysfs: /sys/class/touch/cmcs/cm_key_slope_result */ +ssize_t ist30xx_cm_key_slope_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + return print_cm_key_slope_result(ts_cmcs_buf->cm, buf, true); +} + +/* sysfs: /sys/class/touch/cmcs/cs0_result */ +ssize_t ist30xx_cs0_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CS)) + return 0; + + return print_cs_result(ts_cmcs_buf->cs0, buf, 0); +} + +/* sysfs: /sys/class/touch/cmcs/cs1_result */ +ssize_t ist30xx_cs1_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CS)) + return 0; + + return print_cs_result(ts_cmcs_buf->cs1, buf, 1); +} + +/* sysfs: /sys/class/touch/cmcs/line_cm */ +ssize_t ist30xx_line_cm_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + return print_line_cmcs(CMCS_FLAG_CM, ts_cmcs_buf->cm, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cm_slope0 */ +ssize_t ist30xx_line_cm_slope0_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + return print_line_cmcs(CMCS_FLAG_CM_SLOPE0, ts_cmcs_buf->slope0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cm_slope1 */ +ssize_t ist30xx_line_cm_slope1_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return 0; + + return print_line_cmcs(CMCS_FLAG_CM_SLOPE1, ts_cmcs_buf->slope1, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cs0 */ +ssize_t ist30xx_line_cs0_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CS)) + return 0; + + return print_line_cmcs(CMCS_FLAG_CS0, ts_cmcs_buf->cs0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cs1 */ +ssize_t ist30xx_line_cs1_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + CMCS_INFO *cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CS)) + return 0; + + return print_line_cmcs(CMCS_FLAG_CS1, ts_cmcs_buf->cs1, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_key_slope_value */ +ssize_t ist30xx_cm_key_slope_value_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + CMCS_INFO *cmcs; + + if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) + return sprintf(buf, "%s", "FFFF"); + + ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(ts_cmcs_bin, ts_cmcs_bin_size); + mutex_unlock(&ist30xx_mutex); + + if (ret) + return sprintf(buf, "%s", "FFFF"); + + cmcs = (CMCS_INFO *)&ts_cmcs->cmcs; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "%s", "FFFF"); + + if ((cmcs->cmd.mode) && !(cmcs->cmd.mode & FLAG_ENABLE_CM)) + return sprintf(buf, "%s", "FFFF"); + + return print_cm_key_slope_result(ts_cmcs_buf->cm, buf, false); +} + +/* sysfs : cmcs */ +static DEVICE_ATTR(info, S_IRUGO, ist30xx_cmcs_info_show, NULL); +static DEVICE_ATTR(cmcs_binary, S_IRUGO, ist30xx_cmcs_binary_show, NULL); +static DEVICE_ATTR(cmcs_custom, S_IRUGO, ist30xx_cmcs_custom_show, NULL); +static DEVICE_ATTR(cmcs_sdcard, S_IRUGO, ist30xx_cmcs_sdcard_show, NULL); +static DEVICE_ATTR(cm, S_IRUGO, ist30xx_cm_show, NULL); +static DEVICE_ATTR(cm_spec, S_IRUGO, ist30xx_cm_spec_show, NULL); +static DEVICE_ATTR(cm_slope0, S_IRUGO, ist30xx_cm_slope0_show, NULL); +static DEVICE_ATTR(cm_slope1, S_IRUGO, ist30xx_cm_slope1_show, NULL); +static DEVICE_ATTR(cs0, S_IRUGO, ist30xx_cs0_show, NULL); +static DEVICE_ATTR(cs1, S_IRUGO, ist30xx_cs1_show, NULL); +static DEVICE_ATTR(cm_result, S_IRUGO, ist30xx_cm_result_show, NULL); +static DEVICE_ATTR(cm_slope0_result, S_IRUGO, + ist30xx_cm_slope0_result_show, NULL); +static DEVICE_ATTR(cm_slope1_result, S_IRUGO, + ist30xx_cm_slope1_result_show, NULL); +static DEVICE_ATTR(cm_key_slope_result, S_IRUGO, + ist30xx_cm_key_slope_result_show, NULL); +static DEVICE_ATTR(cs0_result, S_IRUGO, ist30xx_cs0_result_show, NULL); +static DEVICE_ATTR(cs1_result, S_IRUGO, ist30xx_cs1_result_show, NULL); +static DEVICE_ATTR(line_cm, S_IRUGO, ist30xx_line_cm_show, NULL); +static DEVICE_ATTR(line_cm_slope0, S_IRUGO, ist30xx_line_cm_slope0_show, NULL); +static DEVICE_ATTR(line_cm_slope1, S_IRUGO, ist30xx_line_cm_slope1_show, NULL); +static DEVICE_ATTR(line_cs0, S_IRUGO, ist30xx_line_cs0_show, NULL); +static DEVICE_ATTR(line_cs1, S_IRUGO, ist30xx_line_cs1_show, NULL); +static DEVICE_ATTR(cm_key_slope_value, S_IRUGO, + ist30xx_cm_key_slope_value_show, NULL); + +static struct attribute *cmcs_attributes[] = { + &dev_attr_info.attr, + &dev_attr_cmcs_binary.attr, + &dev_attr_cmcs_custom.attr, + &dev_attr_cmcs_sdcard.attr, + &dev_attr_cm.attr, + &dev_attr_cm_spec.attr, + &dev_attr_cm_slope0.attr, + &dev_attr_cm_slope1.attr, + &dev_attr_cs0.attr, + &dev_attr_cs1.attr, + &dev_attr_cm_result.attr, + &dev_attr_cm_slope0_result.attr, + &dev_attr_cm_slope1_result.attr, + &dev_attr_cm_key_slope_result.attr, + &dev_attr_cs0_result.attr, + &dev_attr_cs1_result.attr, + &dev_attr_line_cm.attr, + &dev_attr_line_cm_slope0.attr, + &dev_attr_line_cm_slope1.attr, + &dev_attr_line_cs0.attr, + &dev_attr_line_cs1.attr, + &dev_attr_cm_key_slope_value.attr, + NULL, +}; + +static struct attribute_group cmcs_attr_group = { + .attrs = cmcs_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_cmcs_dev; + + +int ist30xx_init_cmcs_sysfs(void) +{ + /* /sys/class/touch/cmcs */ + ist30xx_cmcs_dev = device_create(ist30xx_class, NULL, 0, NULL, "cmcs"); + + /* /sys/class/touch/cmcs/... */ + if (unlikely(sysfs_create_group(&ist30xx_cmcs_dev->kobj, + &cmcs_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "cmcs"); + +#if IST30XX_INTERNAL_CMCS_BIN + ts_cmcs_bin = (u8 *)ist30xxb_cmcs; + ts_cmcs_bin_size = sizeof(ist30xxb_cmcs); + + ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); +#endif + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.h b/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.h new file mode 100644 index 00000000..418f30e9 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs.h @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_CMCS_H__ +#define __IST30XX_CMCS_H__ + + +#define IST30XX_INTERNAL_CMCS_BIN (1) + +#define CMCS_FLAG_CM (1) +#define CMCS_FLAG_CM_SPEC (1 << 1) +#define CMCS_FLAG_CM_SLOPE0 (1 << 2) +#define CMCS_FLAG_CM_SLOPE1 (1 << 3) +#define CMCS_FLAG_CS0 (1 << 4) +#define CMCS_FLAG_CS1 (1 << 5) + +#define FLAG_ENABLE_CM (1) +#define FLAG_ENABLE_CS (2) +#define FLAG_ENABLE_CR (4) + +#define IST30XX_CMCS_LOAD_END (0x8FFFFCAB) +#if (IMAGIS_TSP_IC == IMAGIS_IST30XXB) +#define IST30XX_CMCS_BUF_SIZE (16 * 16) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3038) +#define IST30XX_CMCS_BUF_SIZE (((19 * 19) / 2 + 1) * 2) +#else +#error "Unknown TSP_IC" +#endif + +#define ENABLE_CM_MODE(n) (n & 1) +#define ENABLE_CS_MODE(n) ((n >> 1) & 1) + +#define IST30XXB_CMCS_NAME "ist30xxb.cms" + +#define IST30XX_CMCS_MAGIC "CMCS1TAG" +struct CMCS_ADDR_INFO { + u32 base_screen; + u32 base_key; + u32 start_cp; + u32 vcmp; + u32 sensor1; + u32 sensor2; + u32 sensor3; +}; +struct CMCS_CH_INFO { + u8 tx_num; + u8 rx_num; + u8 key_rx; + u8 key1; + u8 key2; + u8 key3; + u8 key4; + u8 key5; +}; +struct CMCS_SLOPE_INFO { + s16 x_min; + s16 x_max; + s16 y_min; + s16 y_max; + s16 key_min; + s16 key_max; +}; +struct CMCS_SPEC_INFO { + u16 screen_min; + u16 screen_max; + u16 key_min; + u16 key_max; +}; +struct CMCS_CMD { + u16 mode; // enable bit + u16 cmcs_size; + u16 base_screen; + u16 base_key; + u8 start_cp_cm; + u8 start_cp_cs; + u8 vcmp_cm; + u8 vcmp_cs; + u32 reserved; // for checksum of firmware +}; +typedef struct _CMCS_INFO { + u32 timeout; + struct CMCS_ADDR_INFO addr; + struct CMCS_CH_INFO ch; + struct CMCS_SPEC_INFO spec_cr; + struct CMCS_SPEC_INFO spec_cm; + struct CMCS_SPEC_INFO spec_cs0; + struct CMCS_SPEC_INFO spec_cs1; + struct CMCS_SLOPE_INFO slope; + u16 sensor1_size; + u16 sensor2_size; + u16 sensor3_size; + u16 reserved; + u32 cmcs_chksum; + u32 sensor_chksum; + struct CMCS_CMD cmd; +} CMCS_INFO; + +typedef struct _CMCS_BIN_INFO { + char magic1[8]; + CMCS_INFO cmcs; + u8 * buf_cmcs; + u32 * buf_sensor; + u16 * buf_node; + char magic2[8]; +} CMCS_BIN_INFO; + +typedef struct _CMCS_BUF { + s16 cm[IST30XX_CMCS_BUF_SIZE]; + s16 spec[IST30XX_CMCS_BUF_SIZE]; + s16 slope0[IST30XX_CMCS_BUF_SIZE]; + s16 slope1[IST30XX_CMCS_BUF_SIZE]; + s16 cs0[IST30XX_CMCS_BUF_SIZE]; + s16 cs1[IST30XX_CMCS_BUF_SIZE]; +} CMCS_BUF; + + +int ist30xx_init_cmcs_sysfs(void); + +#endif // __IST30XX_CMCS_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs_bin.h b/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs_bin.h new file mode 100644 index 00000000..b561de40 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_cmcs_bin.h @@ -0,0 +1,284 @@ +#ifndef __IST30XXB_CMCS_BIN_H__ +#define __IST30XXB_CMCS_BIN_H__ + +/* ist30xxb cmcs binary: model( ) */ +static unsigned char ist30xxb_cmcs[] = { + 0x43, 0x4d, 0x43, 0x53, 0x31, 0x54, 0x41, 0x47, 0x10, 0x27, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x20, + 0xf4, 0x0f, 0x00, 0x20, 0xf8, 0x0f, 0x00, 0x20, 0xfc, 0x0f, 0x00, 0x20, 0x00, 0x90, 0x00, 0x40, + 0x00, 0xa0, 0x00, 0x40, 0x78, 0x08, 0x10, 0x40, 0x15, 0x0e, 0x01, 0x13, 0x14, 0xff, 0xff, 0xff, + 0xdf, 0x02, 0x55, 0x05, 0xdf, 0x02, 0x55, 0x05, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, 0x19, 0x00, + 0x28, 0x0a, 0x80, 0x0c, 0x28, 0x0a, 0x80, 0x0c, 0x28, 0x0a, 0x80, 0x0c, 0x28, 0x0a, 0x80, 0x0c, + 0xc8, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x04, 0x00, 0x00, 0x8b, 0x37, 0xfa, 0x4a, 0xe3, 0xa7, 0x07, 0x3b, 0x01, 0x00, 0x64, 0x07, + 0xb8, 0x0b, 0xb8, 0x0b, 0x97, 0xc9, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xa0, 0xe1, + 0x10, 0xd0, 0x9f, 0xe5, 0x01, 0x40, 0x2d, 0xe9, 0x27, 0x01, 0x00, 0xeb, 0x01, 0x40, 0xbd, 0xe8, + 0x00, 0xd0, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, 0xf0, 0x0f, 0x00, 0x20, 0xf1, 0xb5, 0x79, 0x4c, + 0x79, 0x4d, 0x21, 0x78, 0x76, 0x4f, 0xa8, 0x6b, 0x00, 0x29, 0x83, 0xb0, 0x00, 0xd0, 0x00, 0x0c, + 0x00, 0x06, 0x00, 0x0e, 0x01, 0x02, 0x01, 0x43, 0x08, 0x04, 0x00, 0x0c, 0x00, 0xf0, 0x4c, 0xfb, + 0xe0, 0x78, 0x00, 0x28, 0x20, 0x79, 0x02, 0xd0, 0x00, 0xf0, 0x0c, 0xfb, 0x01, 0xe0, 0x00, 0xf0, + 0x27, 0xfb, 0x6e, 0x48, 0xc1, 0x6a, 0x00, 0x91, 0x00, 0x21, 0xc1, 0x62, 0x69, 0x49, 0xe8, 0x6b, + 0x0a, 0x78, 0x6b, 0x49, 0x00, 0x2a, 0x08, 0xd1, 0x6a, 0x4b, 0x1a, 0x62, 0x5a, 0x62, 0x4a, 0x68, + 0x00, 0x07, 0x12, 0x09, 0x12, 0x01, 0x00, 0x0f, 0x08, 0xe0, 0x66, 0x4b, 0x00, 0x22, 0x1a, 0x62, + 0x5a, 0x62, 0x4a, 0x68, 0x00, 0x03, 0x12, 0x09, 0x12, 0x01, 0x00, 0x0f, 0x02, 0x43, 0x4a, 0x60, + 0x03, 0x24, 0x26, 0x1f, 0x01, 0xe0, 0x03, 0x2c, 0x02, 0xd1, 0x01, 0x25, 0xed, 0x43, 0x09, 0xe0, + 0x02, 0x2c, 0x01, 0xd1, 0x01, 0x25, 0x05, 0xe0, 0x01, 0x2c, 0x01, 0xd1, 0x35, 0x00, 0x01, 0xe0, + 0x00, 0x2c, 0xf7, 0xd0, 0xe0, 0x07, 0xc0, 0x0f, 0x29, 0x00, 0x00, 0xf0, 0xb5, 0xf8, 0x64, 0x1e, + 0xe9, 0xd5, 0x02, 0x21, 0x03, 0x20, 0x00, 0xf0, 0xff, 0xf8, 0x50, 0x49, 0x00, 0x98, 0xc8, 0x62, + 0x4c, 0x48, 0x4c, 0x4d, 0x00, 0x78, 0x10, 0x35, 0x00, 0x28, 0x24, 0xd1, 0x09, 0x22, 0x00, 0xf0, + 0x07, 0xfb, 0x00, 0xf0, 0x33, 0xfb, 0x52, 0x1e, 0xf9, 0xd2, 0x46, 0x4c, 0x00, 0x21, 0x0e, 0xe0, + 0x00, 0x20, 0x08, 0xe0, 0x4a, 0x43, 0x12, 0x18, 0x93, 0x00, 0xfb, 0x58, 0x52, 0x00, 0x1b, 0x05, + 0x1b, 0x0d, 0x40, 0x1c, 0xab, 0x52, 0x62, 0x78, 0x90, 0x42, 0xf3, 0xd3, 0x49, 0x1c, 0xa0, 0x78, + 0x81, 0x42, 0xed, 0xd3, 0x20, 0x78, 0x00, 0x28, 0x05, 0xd1, 0x3e, 0x49, 0xa0, 0x68, 0x08, 0x62, + 0xe0, 0x68, 0x48, 0x62, 0x03, 0xe0, 0x37, 0x48, 0x81, 0x68, 0x3a, 0x48, 0x01, 0x62, 0x09, 0x22, + 0x00, 0xf0, 0xde, 0xfa, 0x00, 0xf0, 0x0a, 0xfb, 0x52, 0x1e, 0xf9, 0xd2, 0x36, 0x48, 0x00, 0x26, + 0x02, 0x90, 0x36, 0x48, 0x01, 0x90, 0x53, 0xe0, 0x00, 0x24, 0x4c, 0xe0, 0x21, 0x00, 0x30, 0x00, + 0x00, 0xf0, 0x78, 0xf9, 0x00, 0x28, 0x45, 0xd0, 0x2a, 0x49, 0x0a, 0x78, 0x00, 0x2a, 0x1a, 0xd1, + 0x49, 0x78, 0x71, 0x43, 0x0b, 0x19, 0x59, 0x00, 0x9b, 0x00, 0xfb, 0x58, 0x6a, 0x5a, 0x1b, 0x05, + 0x1b, 0x0d, 0x9a, 0x42, 0x01, 0xd8, 0x00, 0x20, 0x0b, 0xe0, 0x82, 0x42, 0x04, 0xd9, 0x12, 0x1a, + 0x12, 0x04, 0xd2, 0x0c, 0x80, 0x18, 0x03, 0xe0, 0x82, 0x1a, 0x12, 0x04, 0xd2, 0x0c, 0x80, 0x1a, + 0xc0, 0x1a, 0x68, 0x52, 0x26, 0xe0, 0x1b, 0x48, 0x21, 0x49, 0x40, 0x78, 0xff, 0x22, 0x91, 0x32, + 0x70, 0x43, 0x00, 0x19, 0x84, 0x46, 0x80, 0x00, 0x38, 0x58, 0x00, 0x05, 0x00, 0x0d, 0x41, 0x18, + 0x91, 0x42, 0x09, 0xd8, 0x1b, 0x4a, 0x11, 0x1a, 0x0b, 0x00, 0x4b, 0x43, 0x19, 0x0a, 0x90, 0x42, + 0x01, 0xd9, 0x88, 0x18, 0x00, 0xe0, 0x50, 0x1a, 0x03, 0x99, 0x00, 0x29, 0x03, 0xd0, 0x61, 0x46, + 0x02, 0x9a, 0x49, 0x00, 0x05, 0xe0, 0x0b, 0x49, 0x01, 0x9a, 0x89, 0x78, 0x61, 0x43, 0x89, 0x19, + 0x49, 0x00, 0x50, 0x52, 0x64, 0x1c, 0x07, 0x48, 0x40, 0x78, 0x84, 0x42, 0xae, 0xd3, 0x76, 0x1c, + 0x04, 0x48, 0x81, 0x78, 0x8e, 0x42, 0xa7, 0xd3, 0xff, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0x00, + 0xd4, 0x02, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, 0xc0, 0x0f, 0x00, 0x20, 0x80, 0x90, 0x00, 0x40, + 0x00, 0xa0, 0x00, 0x40, 0x00, 0x0b, 0x10, 0x40, 0x00, 0x00, 0x00, 0x10, 0xd4, 0x02, 0x00, 0x10, + 0x74, 0xf5, 0xff, 0xff, 0x54, 0x0b, 0x00, 0x00, 0xf3, 0xb5, 0x25, 0x48, 0x82, 0xb0, 0x0f, 0x00, + 0x01, 0x90, 0x00, 0x20, 0x00, 0x90, 0x39, 0xe0, 0x00, 0x25, 0x21, 0xe0, 0x29, 0x00, 0x30, 0x00, + 0x00, 0xf0, 0x00, 0xf9, 0x00, 0x28, 0x19, 0xd0, 0x1e, 0x49, 0x01, 0x9a, 0x49, 0x78, 0x71, 0x43, + 0x49, 0x19, 0x89, 0x00, 0x51, 0x58, 0x09, 0x05, 0x09, 0x0d, 0x08, 0x1a, 0x02, 0x99, 0x00, 0x29, + 0x02, 0xd0, 0x00, 0x28, 0x0a, 0xda, 0x01, 0xe0, 0x00, 0x28, 0x07, 0xdd, 0x3b, 0x00, 0x3a, 0x00, + 0x29, 0x00, 0x30, 0x00, 0x00, 0xf0, 0xc8, 0xf9, 0x40, 0x1c, 0x00, 0xd1, 0x64, 0x1c, 0x6d, 0x1c, + 0x10, 0x48, 0x40, 0x78, 0x85, 0x42, 0xd9, 0xd3, 0x76, 0x1c, 0x0e, 0x48, 0x81, 0x78, 0x8e, 0x42, + 0xd2, 0xd3, 0x01, 0x00, 0x88, 0x78, 0x49, 0x78, 0x48, 0x43, 0xa0, 0x42, 0x0d, 0xd0, 0x00, 0x98, + 0x41, 0x1c, 0x00, 0x91, 0x01, 0x21, 0x49, 0x02, 0x88, 0x42, 0x06, 0xd8, 0x00, 0xf0, 0x20, 0xfa, + 0x00, 0xf0, 0x4c, 0xfa, 0x00, 0x24, 0x26, 0x00, 0xe7, 0xe7, 0xff, 0xbc, 0x08, 0xbc, 0x18, 0x47, + 0xd4, 0x02, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, 0xf0, 0xb5, 0x5a, 0x4a, 0x85, 0xb0, 0x40, 0x18, + 0x04, 0x92, 0x42, 0x00, 0x80, 0x18, 0x03, 0x90, 0x57, 0x48, 0x02, 0x91, 0x00, 0x90, 0x58, 0x48, + 0x56, 0x4f, 0x81, 0x78, 0x01, 0x91, 0x46, 0x78, 0xb5, 0x21, 0x89, 0x00, 0x38, 0x00, 0x00, 0xf0, + 0x3b, 0xf9, 0x00, 0x25, 0x0b, 0xe0, 0x00, 0x24, 0x06, 0xe0, 0x02, 0x9b, 0x21, 0x00, 0x1a, 0x00, + 0x28, 0x00, 0x00, 0xf0, 0x81, 0xf9, 0x64, 0x1c, 0xb4, 0x42, 0xf6, 0xd3, 0x6d, 0x1c, 0x01, 0x98, + 0x85, 0x42, 0xf0, 0xd3, 0x00, 0xf0, 0xec, 0xf9, 0x00, 0xf0, 0x18, 0xfa, 0x00, 0x25, 0x29, 0xe0, + 0x00, 0x24, 0x24, 0xe0, 0x21, 0x00, 0x28, 0x00, 0x00, 0xf0, 0x8c, 0xf8, 0x00, 0x28, 0x12, 0xd0, + 0x43, 0x49, 0x04, 0x9b, 0x49, 0x78, 0x69, 0x43, 0x0a, 0x19, 0x91, 0x00, 0x59, 0x58, 0x03, 0x04, + 0x09, 0x05, 0x09, 0x0d, 0x1b, 0x0c, 0xcb, 0x1a, 0x00, 0x2b, 0x01, 0xdd, 0x08, 0x1a, 0x00, 0xe0, + 0x40, 0x1a, 0x51, 0x00, 0x78, 0x52, 0x21, 0x00, 0x28, 0x00, 0x00, 0xf0, 0x9b, 0xf8, 0x38, 0x49, + 0x00, 0x9a, 0x49, 0x78, 0x69, 0x43, 0x09, 0x19, 0x49, 0x00, 0x64, 0x1c, 0x50, 0x52, 0xb4, 0x42, + 0xd8, 0xd3, 0x6d, 0x1c, 0x01, 0x98, 0x85, 0x42, 0xd2, 0xd3, 0x00, 0xf0, 0xe7, 0xf9, 0x00, 0x25, + 0x34, 0xe0, 0x00, 0x24, 0x2f, 0xe0, 0x21, 0x00, 0x28, 0x00, 0x00, 0xf0, 0x5b, 0xf8, 0x00, 0x28, + 0x28, 0xd0, 0x2b, 0x49, 0x04, 0x9b, 0x49, 0x78, 0x69, 0x43, 0x09, 0x19, 0x8a, 0x00, 0x9a, 0x58, + 0x03, 0x04, 0x12, 0x05, 0x12, 0x0d, 0x1b, 0x0c, 0xd3, 0x1a, 0x00, 0x2b, 0x01, 0xdd, 0x10, 0x1a, + 0x00, 0xe0, 0x80, 0x1a, 0x49, 0x00, 0x7b, 0x5a, 0x00, 0x04, 0x00, 0x0c, 0x83, 0x42, 0x0b, 0xd9, + 0x78, 0x52, 0x21, 0x00, 0x28, 0x00, 0x00, 0xf0, 0x65, 0xf8, 0x1d, 0x49, 0x00, 0x9a, 0x49, 0x78, + 0x69, 0x43, 0x09, 0x19, 0x49, 0x00, 0x50, 0x52, 0x00, 0x22, 0x53, 0x1e, 0x21, 0x00, 0x28, 0x00, + 0x00, 0xf0, 0x12, 0xf9, 0x64, 0x1c, 0xb4, 0x42, 0xcd, 0xd3, 0x6d, 0x1c, 0x01, 0x98, 0x85, 0x42, + 0xc7, 0xd3, 0x03, 0x98, 0x40, 0x1e, 0x03, 0x90, 0x19, 0xd2, 0x11, 0x4f, 0x00, 0x25, 0x0f, 0xe0, + 0x00, 0x24, 0x0a, 0xe0, 0x78, 0x78, 0x00, 0x99, 0x68, 0x43, 0x00, 0x19, 0x40, 0x00, 0x0a, 0x5a, + 0x21, 0x00, 0x28, 0x00, 0x00, 0xf0, 0x18, 0xf9, 0x64, 0x1c, 0xb4, 0x42, 0xf2, 0xd3, 0x6d, 0x1c, + 0x01, 0x98, 0x85, 0x42, 0xec, 0xd3, 0x05, 0xb0, 0xf0, 0xbc, 0x08, 0xbc, 0x18, 0x47, 0x00, 0xf0, + 0x5f, 0xf9, 0xa2, 0xe7, 0xd4, 0x02, 0x10, 0x40, 0x44, 0x0a, 0x00, 0x20, 0xd4, 0x02, 0x00, 0x10, + 0x60, 0x07, 0x00, 0x20, 0x70, 0xb4, 0x11, 0x4c, 0x11, 0x4e, 0x23, 0x6b, 0x35, 0x79, 0xf6, 0x78, + 0x02, 0x00, 0x1b, 0x04, 0x64, 0x6b, 0x00, 0x20, 0x1b, 0x0c, 0x00, 0x2e, 0x0c, 0xd0, 0xaa, 0x42, + 0x08, 0xd1, 0x13, 0x29, 0x03, 0xd0, 0x14, 0x29, 0x01, 0xd0, 0xff, 0x29, 0x00, 0xd1, 0x20, 0x00, + 0x70, 0xbc, 0x70, 0x47, 0x18, 0x00, 0xfb, 0xe7, 0xa9, 0x42, 0xfb, 0xd1, 0x13, 0x2a, 0xf6, 0xd0, + 0x14, 0x2a, 0xf4, 0xd0, 0xff, 0x2a, 0xf2, 0xd0, 0xf2, 0xe7, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x20, + 0x60, 0x07, 0x00, 0x20, 0x04, 0x4b, 0x03, 0x4a, 0x5b, 0x78, 0x58, 0x43, 0x40, 0x18, 0x40, 0x00, + 0x10, 0x5a, 0x70, 0x47, 0x00, 0x00, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, 0x01, 0xc0, 0x8f, 0xe2, + 0x1c, 0xff, 0x2f, 0xe1, 0x70, 0xb5, 0x22, 0x48, 0x00, 0x6b, 0x04, 0x0c, 0x21, 0x48, 0x01, 0x6a, + 0x21, 0x4e, 0xb1, 0x60, 0x40, 0x6a, 0xb5, 0x21, 0xf0, 0x60, 0x20, 0x48, 0xc9, 0x00, 0x00, 0xf0, + 0x4b, 0xf8, 0xb5, 0x21, 0x30, 0x00, 0x89, 0x00, 0x10, 0x30, 0x00, 0xf0, 0x45, 0xf8, 0xe5, 0x07, + 0x00, 0x20, 0xed, 0x0f, 0x6d, 0x1e, 0x25, 0x40, 0xf0, 0x70, 0x02, 0xd1, 0x30, 0x70, 0x00, 0xf0, + 0x05, 0xf9, 0x17, 0x48, 0x17, 0x49, 0x08, 0x63, 0x00, 0x2c, 0x01, 0xd0, 0xa0, 0x07, 0x03, 0xd5, + 0x01, 0x20, 0x30, 0x70, 0x00, 0xf0, 0xfa, 0xf8, 0x13, 0x48, 0x14, 0x49, 0xc8, 0x61, 0x14, 0x48, + 0xc2, 0x68, 0x52, 0x08, 0x52, 0x00, 0xc2, 0x60, 0x00, 0x2d, 0x02, 0xd1, 0x0a, 0x48, 0x10, 0x30, + 0x00, 0xe0, 0x0a, 0x48, 0x0f, 0x4b, 0x04, 0xc8, 0xca, 0x61, 0x00, 0x2c, 0x01, 0xd0, 0x03, 0x2c, + 0x02, 0xd1, 0x98, 0x42, 0x00, 0xd1, 0x05, 0x48, 0x4a, 0x69, 0x52, 0x06, 0xfc, 0xd4, 0xf2, 0xe7, + 0xc0, 0x0f, 0x00, 0x20, 0x00, 0x0b, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, + 0x60, 0x3a, 0x30, 0x0a, 0xc0, 0xa1, 0x00, 0x40, 0xab, 0xfc, 0xff, 0x8f, 0x00, 0x40, 0x00, 0x30, + 0x00, 0x20, 0x00, 0x40, 0x44, 0x0a, 0x00, 0x20, 0x89, 0x10, 0x00, 0x22, 0x00, 0xe0, 0x04, 0xc0, + 0x49, 0x1e, 0xfc, 0xd2, 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb4, 0x19, 0x49, 0x01, 0x25, 0xc8, 0x78, + 0x18, 0x4e, 0x19, 0x4f, 0x68, 0x40, 0xc8, 0x70, 0x00, 0x20, 0x81, 0x00, 0x8c, 0x19, 0x61, 0x68, + 0x40, 0x1c, 0x0a, 0x03, 0x4b, 0x04, 0xdb, 0x0e, 0xd2, 0x0e, 0x39, 0x40, 0xdb, 0x03, 0x19, 0x43, + 0x92, 0x02, 0x11, 0x43, 0x18, 0x28, 0x61, 0x60, 0xef, 0xd3, 0x10, 0x49, 0x08, 0x69, 0x68, 0x40, + 0x08, 0x61, 0x0c, 0x48, 0x0e, 0x49, 0x40, 0x38, 0x81, 0x61, 0x0e, 0x49, 0x01, 0x63, 0x41, 0x63, + 0x08, 0x48, 0x0d, 0x49, 0xc0, 0x30, 0x41, 0x60, 0x03, 0x21, 0x89, 0x04, 0x81, 0x60, 0x07, 0x49, + 0x0a, 0x48, 0x40, 0x31, 0x08, 0x60, 0x0a, 0x48, 0x0a, 0x49, 0xc8, 0x60, 0xf0, 0xbc, 0x70, 0x47, + 0x60, 0x07, 0x00, 0x20, 0x40, 0x0a, 0x10, 0x40, 0xff, 0x03, 0xf0, 0xff, 0x00, 0x90, 0x00, 0x40, + 0xc8, 0x61, 0x14, 0x44, 0xc8, 0x61, 0x14, 0x04, 0xff, 0xff, 0x1f, 0x00, 0x0e, 0x15, 0x0e, 0x15, + 0xf8, 0x0f, 0xfe, 0x00, 0x00, 0xa0, 0x00, 0x40, 0x30, 0xb4, 0x0e, 0x4d, 0x0c, 0x4c, 0x6d, 0x78, + 0x68, 0x43, 0x40, 0x18, 0x45, 0x00, 0x60, 0x5b, 0x01, 0x06, 0x00, 0x0a, 0x09, 0x0e, 0x82, 0x18, + 0xc9, 0x18, 0x00, 0x20, 0x4b, 0x1e, 0xc0, 0x43, 0xff, 0x2b, 0x06, 0xd2, 0x53, 0x1e, 0xff, 0x2b, + 0x03, 0xd2, 0x10, 0x02, 0x08, 0x43, 0x60, 0x53, 0x00, 0x20, 0x30, 0xbc, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, 0x10, 0xb4, 0x05, 0x4c, 0x03, 0x4b, 0x64, 0x78, + 0x60, 0x43, 0x40, 0x18, 0x40, 0x00, 0x1a, 0x52, 0x10, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x10, 0x40, + 0x60, 0x07, 0x00, 0x20, 0xf0, 0xb4, 0x0d, 0x4f, 0x00, 0x21, 0x7a, 0x78, 0x1e, 0x26, 0x0a, 0x4d, + 0x42, 0x43, 0x09, 0xe0, 0x13, 0x29, 0x05, 0xd0, 0x14, 0x29, 0x03, 0xd0, 0xff, 0x29, 0x01, 0xd0, + 0x53, 0x00, 0xee, 0x52, 0x52, 0x1c, 0x49, 0x1c, 0x7b, 0x78, 0x04, 0x00, 0x5c, 0x43, 0xe3, 0x18, + 0x93, 0x42, 0xef, 0xd8, 0xf0, 0xbc, 0x70, 0x47, 0x00, 0x00, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, + 0x70, 0xb4, 0x00, 0x21, 0x0a, 0x4b, 0x0b, 0x4a, 0x1e, 0x24, 0x0a, 0xe0, 0x13, 0x29, 0x05, 0xd0, + 0x14, 0x29, 0x03, 0xd0, 0xff, 0x29, 0x01, 0xd0, 0x45, 0x00, 0x5c, 0x53, 0x55, 0x78, 0x40, 0x19, + 0x49, 0x1c, 0x95, 0x78, 0x56, 0x78, 0x75, 0x43, 0x85, 0x42, 0xef, 0xd8, 0x70, 0xbc, 0x70, 0x47, + 0x00, 0x00, 0x10, 0x40, 0x60, 0x07, 0x00, 0x20, 0x02, 0x04, 0x04, 0x49, 0x02, 0x43, 0x00, 0x20, + 0x40, 0x1c, 0x04, 0xc1, 0xb5, 0x28, 0xfb, 0xd3, 0x70, 0x47, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, + 0x01, 0x48, 0xc1, 0x68, 0xc1, 0x60, 0x70, 0x47, 0x00, 0x90, 0x00, 0x40, 0x70, 0xb5, 0x11, 0x4e, + 0x11, 0x4c, 0x01, 0x25, 0x30, 0x68, 0x00, 0x04, 0x00, 0x0c, 0x01, 0x0a, 0x00, 0x06, 0x00, 0x0e, + 0x61, 0x70, 0xa0, 0x70, 0xe2, 0x78, 0x00, 0x2a, 0x02, 0xd1, 0x49, 0x1e, 0x21, 0x71, 0x01, 0xe0, + 0x40, 0x1e, 0x20, 0x71, 0x28, 0x00, 0xff, 0xf7, 0x79, 0xfc, 0x20, 0x78, 0x00, 0x28, 0x05, 0xd0, + 0x01, 0x2d, 0x03, 0xd1, 0xff, 0xf7, 0x20, 0xff, 0x00, 0x25, 0xe3, 0xe7, 0x70, 0xbc, 0x08, 0xbc, + 0x18, 0x47, 0x00, 0x00, 0x40, 0x90, 0x00, 0x40, 0x60, 0x07, 0x00, 0x20, 0x02, 0x48, 0xc1, 0x68, + 0xc9, 0x07, 0xfc, 0xd0, 0x70, 0x47, 0x00, 0x00, 0x00, 0x90, 0x00, 0x40, 0x8b, 0x37, 0xfa, 0x4a, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x02, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x0e, 0x15, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x8d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x30, 0x00, 0xff, 0x05, 0xff, 0x03, 0x18, 0x10, 0x08, 0x00, + 0x00, 0x2c, 0x00, 0x2c, 0x64, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x10, 0x08, 0x00, 0x00, 0xff, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xc8, 0x00, 0x40, 0x06, 0x00, 0x00, 0x08, 0x20, + 0x11, 0x00, 0x10, 0x00, 0x48, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0x55, 0x45, 0x00, 0x10, 0x30, 0x00, 0x00, 0x00, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x14, 0x00, 0x00, 0x0c, 0x0c, 0x06, 0x00, + 0x00, 0x04, 0x7c, 0x78, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0xc0, 0xda, 0x00, 0x00, + 0x60, 0x30, 0x30, 0x00, 0x60, 0x3c, 0x30, 0x0c, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x08, 0x00, 0x12, 0x12, 0xc8, 0x01, 0x90, 0x81, 0x0c, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xff, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0xff, 0x0f, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x0f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, + 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, + 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, + 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, + 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, 0x60, 0x30, 0x30, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xc8, 0x61, 0x14, 0x04, + 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, + 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, + 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, + 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, + 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x44, 0xc8, 0x61, 0x14, 0x44, + 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0xc8, 0x61, 0x14, 0x04, 0x00, 0xc0, 0x91, 0xe7, + 0x21, 0x2c, 0x92, 0xe7, 0x42, 0xbc, 0x92, 0xe7, 0x63, 0x28, 0x93, 0xe7, 0x84, 0xb8, 0x93, 0xe7, + 0xa5, 0x24, 0x94, 0xe7, 0xc6, 0xb4, 0x94, 0xe7, 0xe7, 0x20, 0x95, 0xe7, 0x08, 0xb1, 0x95, 0xe7, + 0x29, 0x9d, 0x98, 0xe7, 0x4a, 0x01, 0x99, 0xe7, 0x6b, 0x99, 0x99, 0xe7, 0x8c, 0x05, 0x9a, 0xe7, + 0xad, 0x95, 0x9a, 0xe7, 0xce, 0x09, 0x90, 0xe7, 0xef, 0x11, 0x90, 0xe7, 0x10, 0x0e, 0x90, 0xe7, + 0x31, 0x46, 0x90, 0xe7, 0x52, 0x52, 0x90, 0xe7, 0x73, 0x4a, 0x90, 0xe7, 0x94, 0x4e, 0x90, 0xe7, + 0xb5, 0x02, 0x90, 0xe7, 0xd6, 0x02, 0x90, 0xe7, 0xf7, 0x02, 0x90, 0xe7, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, + 0x01, 0x10, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, + 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x1e, 0x00, + 0xf8, 0x0f, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x50, 0x30, + 0x32, 0x30, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x60, 0x30, 0x60, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x87, 0x07, 0x71, 0x07, 0x5f, 0x07, 0x47, 0x07, 0x38, 0x07, 0x1a, 0x07, 0x34, 0x07, 0x53, 0x07, + 0x64, 0x07, 0x79, 0x07, 0x8c, 0x07, 0x9c, 0x07, 0xa7, 0x07, 0x00, 0x00, 0x03, 0x08, 0xf8, 0x07, + 0xea, 0x07, 0xd8, 0x07, 0xcf, 0x07, 0xba, 0x07, 0xa0, 0x07, 0x91, 0x07, 0xb3, 0x07, 0xb5, 0x07, + 0xc4, 0x07, 0xce, 0x07, 0xc3, 0x07, 0x00, 0x00, 0xc3, 0x07, 0xd2, 0x07, 0xce, 0x07, 0xc7, 0x07, + 0xca, 0x07, 0xc2, 0x07, 0xc5, 0x07, 0xcf, 0x07, 0xd1, 0x07, 0xd6, 0x07, 0xd9, 0x07, 0xdb, 0x07, + 0xd7, 0x07, 0x00, 0x00, 0xdd, 0x07, 0xda, 0x07, 0xd7, 0x07, 0xd2, 0x07, 0xd2, 0x07, 0xcb, 0x07, + 0xc1, 0x07, 0xd0, 0x07, 0xc2, 0x07, 0xc5, 0x07, 0xc8, 0x07, 0xce, 0x07, 0xba, 0x07, 0x00, 0x00, + 0x73, 0x07, 0xa3, 0x07, 0xa9, 0x07, 0xa2, 0x07, 0xa6, 0x07, 0x9b, 0x07, 0x9f, 0x07, 0xa4, 0x07, + 0xa7, 0x07, 0xa9, 0x07, 0xaa, 0x07, 0xac, 0x07, 0xa2, 0x07, 0x00, 0x00, 0x8e, 0x07, 0x8a, 0x07, + 0x85, 0x07, 0x81, 0x07, 0x86, 0x07, 0x82, 0x07, 0x88, 0x07, 0x77, 0x07, 0x79, 0x07, 0x7b, 0x07, + 0x7d, 0x07, 0x7f, 0x07, 0x57, 0x07, 0x00, 0x00, 0x2a, 0x07, 0x54, 0x07, 0x53, 0x07, 0x50, 0x07, + 0x54, 0x07, 0x4e, 0x07, 0x46, 0x07, 0x4c, 0x07, 0x4e, 0x07, 0x55, 0x07, 0x57, 0x07, 0x53, 0x07, + 0x48, 0x07, 0x00, 0x00, 0x32, 0x07, 0x32, 0x07, 0x33, 0x07, 0x2d, 0x07, 0x33, 0x07, 0x41, 0x07, + 0x1d, 0x07, 0x22, 0x07, 0x24, 0x07, 0x25, 0x07, 0x26, 0x07, 0x24, 0x07, 0xf6, 0x06, 0x00, 0x00, + 0xf6, 0x06, 0x4c, 0x07, 0x3f, 0x07, 0x38, 0x07, 0x3f, 0x07, 0x3d, 0x07, 0x2a, 0x07, 0x2e, 0x07, + 0x32, 0x07, 0x34, 0x07, 0x33, 0x07, 0x34, 0x07, 0x2a, 0x07, 0x00, 0x00, 0x3e, 0x07, 0x38, 0x07, + 0x37, 0x07, 0x33, 0x07, 0x4b, 0x07, 0x2e, 0x07, 0x21, 0x07, 0x28, 0x07, 0x2a, 0x07, 0x2b, 0x07, + 0x2b, 0x07, 0x28, 0x07, 0xdb, 0x06, 0x00, 0x00, 0xf2, 0x06, 0x22, 0x07, 0x25, 0x07, 0x20, 0x07, + 0x25, 0x07, 0x1b, 0x07, 0x0e, 0x07, 0x13, 0x07, 0x15, 0x07, 0x16, 0x07, 0x15, 0x07, 0x13, 0x07, + 0x07, 0x07, 0x00, 0x00, 0x2c, 0x07, 0x23, 0x07, 0x27, 0x07, 0x38, 0x07, 0x26, 0x07, 0x1b, 0x07, + 0x0f, 0x07, 0x18, 0x07, 0x19, 0x07, 0x19, 0x07, 0x18, 0x07, 0x15, 0x07, 0xaf, 0x06, 0x00, 0x00, + 0xcb, 0x06, 0x2e, 0x07, 0x2f, 0x07, 0x2a, 0x07, 0x30, 0x07, 0x29, 0x07, 0x18, 0x07, 0x1e, 0x07, + 0x20, 0x07, 0x21, 0x07, 0x20, 0x07, 0x1d, 0x07, 0x19, 0x07, 0x00, 0x00, 0x4e, 0x07, 0x2c, 0x07, + 0x3f, 0x07, 0x26, 0x07, 0x2c, 0x07, 0x23, 0x07, 0x16, 0x07, 0x21, 0x07, 0x20, 0x07, 0x21, 0x07, + 0x20, 0x07, 0x1a, 0x07, 0x65, 0x06, 0x00, 0x00, 0x4a, 0x06, 0xfe, 0x06, 0x00, 0x07, 0xfc, 0x06, + 0x03, 0x07, 0xfd, 0x06, 0xec, 0x06, 0xf3, 0x06, 0xf4, 0x06, 0xf6, 0x06, 0xf5, 0x06, 0xf1, 0x06, + 0xfe, 0x06, 0x00, 0x00, 0x6d, 0x07, 0x26, 0x07, 0x0b, 0x07, 0x06, 0x07, 0x0d, 0x07, 0x04, 0x07, + 0xf7, 0x06, 0x02, 0x07, 0x00, 0x07, 0x02, 0x07, 0x00, 0x07, 0xf7, 0x06, 0xb8, 0x05, 0x00, 0x00, + 0x0a, 0x06, 0x1d, 0x07, 0x1f, 0x07, 0x1d, 0x07, 0x24, 0x07, 0x20, 0x07, 0x0e, 0x07, 0x17, 0x07, + 0x17, 0x07, 0x19, 0x07, 0x18, 0x07, 0x17, 0x07, 0x61, 0x07, 0x00, 0x00, 0xdc, 0x07, 0x09, 0x07, + 0xf8, 0x06, 0xf0, 0x06, 0xf7, 0x06, 0xf0, 0x06, 0xe2, 0x06, 0xef, 0x06, 0xf2, 0x06, 0x10, 0x07, + 0xfe, 0x06, 0xfc, 0x06, 0x47, 0x07, 0x00, 0x00, 0x0d, 0x07, 0xba, 0x06, 0xab, 0x06, 0xa2, 0x06, + 0xaa, 0x06, 0xa1, 0x06, 0x91, 0x06, 0xa0, 0x06, 0xa3, 0x06, 0xaa, 0x06, 0xac, 0x06, 0xb9, 0x06, + 0xc8, 0x07, 0x00, 0x00, 0x91, 0x07, 0xe9, 0x06, 0xe2, 0x06, 0xd9, 0x06, 0xe0, 0x06, 0xda, 0x06, + 0xc8, 0x06, 0xda, 0x06, 0xde, 0x06, 0xe5, 0x06, 0xfc, 0x06, 0xea, 0x06, 0x53, 0x07, 0xfd, 0x06, + 0x1a, 0x07, 0x88, 0x06, 0x83, 0x06, 0x79, 0x06, 0x81, 0x06, 0x78, 0x06, 0x63, 0x06, 0x73, 0x06, + 0x75, 0x06, 0x79, 0x06, 0x7f, 0x06, 0xa4, 0x06, 0x43, 0x07, 0x04, 0x07, 0x43, 0x4d, 0x43, 0x53, + 0x31, 0x54, 0x41, 0x47 +}; + +#endif // __IST30XXB_CMCS_BIN_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_misc.c b/drivers/input/touchscreen/ist30xxa/ist30xx_misc.c new file mode 100644 index 00000000..aa6f3e51 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_misc.c @@ -0,0 +1,1582 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" + +#if IST30XX_CHKIC +#include "ist30xx_chkic_bin.h" +#endif + +#define TSP_CH_SCREEN (1) +#define TSP_CH_KEY (2) + +#define TOUCH_NODE_PARSING_DEBUG (0) + +extern struct ist30xx_data *ts_data; + +TSP_INFO ist30xx_tsp_info; +TKEY_INFO ist30xx_tkey_info; + +static u32 *ist30xx_frame_buf; +static u32 *ist30xx_frame_rawbuf; +static u32 *ist30xx_frame_fltbuf; + + +int ist30xx_tkey_update_info(void) +{ + int ret = 0; + u32 tkey_info1, tkey_info2, tkey_info3; + TKEY_INFO *tkey = &ist30xx_tkey_info; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO1, &tkey_info1); + if (unlikely(ret)) + return ret; + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO2, &tkey_info2); + if (unlikely(ret)) + return ret; + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO3, &tkey_info3); + if (unlikely(ret)) + return ret; + + tkey->enable = ((tkey_info1 & (0xFF << 24)) ? true : false); + tkey->key_num = (tkey_info1 >> 16) & 0xFF; + tkey->ch_num[0] = (tkey_info2 >> 24) & 0xFF; + tkey->ch_num[1] = (tkey_info2 >> 16) & 0xFF; + tkey->ch_num[2] = (tkey_info2 >> 8) & 0xFF; + tkey->ch_num[3] = tkey_info2 & 0xFF; + tkey->ch_num[4] = (tkey_info3 >> 24) & 0xFF; + + return ret; +} + + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +int ist30xx_tsp_update_info(void) +{ + int ret = 0; + u32 tsp_ch_num, tsp_swap, tsp_dir; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_SWAP_INFO, &tsp_swap); + if (unlikely(ret)) return ret; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_DIRECTION, &tsp_dir); + if (unlikely(ret)) return ret; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_CHNUM1, &tsp_ch_num); + if (unlikely(ret || !tsp_ch_num)) return ret; + + tsp->finger_num = IST30XX_MAX_MT_FINGERS; + + tsp->ch_num.rx = tsp_ch_num >> 16; + tsp->ch_num.tx = tsp_ch_num & 0xFFFF; + + tsp->dir.swap_xy = (tsp_swap & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (tsp_swap & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (tsp_swap & TSP_INFO_FLIP_Y ? true : false); + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + tsp->height = (tsp->dir.swap_xy ? tsp->ch_num.rx : tsp->ch_num.tx); + tsp->width = (tsp->dir.swap_xy ? tsp->ch_num.tx : tsp->ch_num.rx); + + return ret; +} + +int ist30xx_check_valid_ch(int ch_tx, int ch_rx) +{ + TKEY_INFO *tkey = &ist30xx_tkey_info; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (unlikely((ch_tx > tsp->ch_num.tx) || (ch_rx > tsp->ch_num.rx))) + return 0; + + if (tkey->enable) { + if (tkey->axis_rx) { + tsp_verb("tx: %d, rx: %d\n", ch_tx, ch_rx); + if (ch_rx == tsp->ch_num.rx - 1) { + tsp_verb("ch_tx: %d\n", ch_tx); + if ((ch_tx == tkey->ch_num[0]) || (ch_tx == tkey->ch_num[1]) || + (ch_tx == tkey->ch_num[2]) || (ch_tx == tkey->ch_num[3]) || + (ch_tx == tkey->ch_num[4])) + return TSP_CH_KEY; + else + return 0; + } + } else { + if (ch_tx == tsp->ch_num.tx - 1) { + if ((ch_rx == tkey->ch_num[0]) || (ch_rx == tkey->ch_num[1]) || + (ch_rx == tkey->ch_num[2]) || (ch_rx == tkey->ch_num[3]) || + (ch_rx == tkey->ch_num[4])) + return TSP_CH_KEY; + else + return 0; + } + } + } + + return TSP_CH_SCREEN; +} + + +int ist30xx_parse_touch_node(u8 flag, struct TSP_NODE_BUF *node) +{ +#if TOUCH_NODE_PARSING_DEBUG + int j; + TSP_INFO *tsp = &ist30xx_tsp_info; +#endif + int i; + u16 *raw = (u16 *)&node->raw; + u16 *base = (u16 *)&node->base; + u16 *filter = (u16 *)&node->filter; + u32 *tmp_rawbuf = ist30xx_frame_rawbuf; + u32 *tmp_fltbuf = ist30xx_frame_fltbuf; + + for (i = 0; i < node->len; i++) { + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + *raw++ = *tmp_rawbuf & 0xFFF; + *base++ = (*tmp_rawbuf >> 16) & 0xFFF; + + tmp_rawbuf++; + } + if (flag & NODE_FLAG_FILTER) + *filter++ = *tmp_fltbuf++ & 0xFFF; + } + +#if TOUCH_NODE_PARSING_DEBUG + tsp_info("RAW - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->raw[i][j]); + } + + tsp_info("BASE - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->base[i][j]); + } + + tsp_info("FILTER - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->filter[i][j]); + } +#endif + + return 0; +} + +int print_touch_node(u8 flag, struct TSP_NODE_BUF *node, char *buf, bool ch_tsp) +{ + int i, j; + int count = 0; + int val = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (tsp->dir.swap_xy) { + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (ch_tsp && (ist30xx_check_valid_ch(i, j) != TSP_CH_SCREEN)) + continue; + + if (flag == NODE_FLAG_RAW) + val = (int)node->raw[i][j]; + else if (flag == NODE_FLAG_BASE) + val = (int)node->base[i][j]; + else if (flag == NODE_FLAG_FILTER) + val = (int)node->filter[i][j]; + else if (flag == NODE_FLAG_DIFF) + val = (int)(node->raw[i][j] - node->base[i][j]); + else + return 0; + + if (val < 0) val = 0; + + count += snprintf(msg, msg_len, "%4d ", val); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + } + + return count; +} + +int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16) +{ + int i, j; + s16 val = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (unlikely((flag != NODE_FLAG_RAW) && (flag != NODE_FLAG_BASE) && + (flag != NODE_FLAG_FILTER) && (flag != NODE_FLAG_DIFF))) + return -EPERM; + + if (tsp->dir.swap_xy) { + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (ist30xx_check_valid_ch(i, j) != TSP_CH_SCREEN) + continue; + + switch ((int)flag) { + case NODE_FLAG_RAW: + val = (s16)node->raw[i][j]; + break; + case NODE_FLAG_BASE: + val = (s16)node->base[i][j]; + break; + case NODE_FLAG_FILTER: + val = (s16)node->filter[i][j]; + break; + case NODE_FLAG_DIFF: + val = (s16)(node->raw[i][j] - node->base[i][j]); + break; + } + + if (val < 0) val = 0; + + *buf16++ = val; + } + } + } + + return 0; +} + +int ist30xx_read_touch_node(u8 flag, struct TSP_NODE_BUF *node) +{ + int ret = 0; + u32 addr = IST30XXB_RAW_ADDR; + + if (ts_data->chip_id == IST3038_CHIP_ID) + addr += 0xD4; + + ist30xx_disable_irq(ts_data); + + if (flag & NODE_FLAG_NO_CCP) { + ist30xx_reset(false); + + ret = ist30xx_write_cmd(ts_data->client, CMD_USE_CORRECT_CP, 0); + if (unlikely(ret)) + goto read_tsp_node_end; + } + + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret)) + goto read_tsp_node_end; + + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, node->len); + if (unlikely(ret)) + goto reg_access_end; + + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + tsp_info("Reg addr: %x, size: %d\n", addr, node->len); + ret = ist30xx_read_buf(ts_data->client, addr, + ist30xx_frame_rawbuf, node->len); + if (unlikely(ret)) + goto reg_access_end; + } + + if (flag & NODE_FLAG_FILTER) { + tsp_info("Reg addr: %x, size: %d\n", IST30XXB_FILTER_ADDR, node->len); + ret = ist30xx_read_buf(ts_data->client, IST30XXB_FILTER_ADDR, + ist30xx_frame_fltbuf, node->len); + if (unlikely(ret)) + goto reg_access_end; + } + +reg_access_end: + ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + ist30xx_cmd_start_scan(ts_data->client); + +read_tsp_node_end: + ist30xx_enable_irq(ts_data); + + return ret; +} + + +/* sysfs: /sys/class/touch/node/refresh */ +ssize_t ist30xx_frame_refresh(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER; + + tsp_info("refresh\n"); + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (unlikely(ret)) { + tsp_err("cmd 1frame raw update fail\n"); + return sprintf(buf, "FAIL\n"); + } + + ist30xx_parse_touch_node(flag, &tsp->node); + + return sprintf(buf, "OK\n"); +} + + +/* sysfs: /sys/class/touch/node/read_nocp */ +ssize_t ist30xx_frame_nocp(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER | + NODE_FLAG_NO_CCP; + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (unlikely(ret)) { + tsp_err("cmd 1frame raw update fail\n"); + return sprintf(buf, "FAIL\n"); + } + + ist30xx_parse_touch_node(flag, &tsp->node); + + return sprintf(buf, "OK\n"); +} + + +/* sysfs: /sys/class/touch/node/base */ +ssize_t ist30xx_base_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb baseline(%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_BASE, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/raw */ +ssize_t ist30xx_raw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb raw(%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_RAW, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/diff */ +ssize_t ist30xx_diff_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb difference (%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_DIFF, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/filter */ +ssize_t ist30xx_filter_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb filter (%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_FILTER, &tsp->node, buf, false); + + return count; +} + + +extern int calib_ms_delay; +/* sysfs: /sys/class/touch/sys/clb_time */ +ssize_t ist30xx_calib_time_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ms_delay; + + sscanf(buf, "%d", &ms_delay); + + if (ms_delay > 10 && ms_delay < 1000) // 1sec ~ 100sec + calib_ms_delay = ms_delay; + + tsp_info("Calibration wait time %dsec\n", calib_ms_delay / 10); + + return size; +} + +/* sysfs: /sys/class/touch/sys/clb */ +ssize_t ist30xx_calib_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + ist30xx_disable_irq(ts_data); + + ist30xx_reset(false); + + ist30xx_calibrate(1); + + ist30xx_start(ts_data); + + return 0; +} + +/* sysfs: /sys/class/touch/sys/clb_result */ +ssize_t ist30xx_calib_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + int count = 0; + u32 value; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ist30xx_reset(false); + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &value); + if (unlikely(ret)) { + count = sprintf(buf, "Error Read Calibration Result\n"); + goto calib_show_end; + } + + count = sprintf(buf, + "Calibration Status : %d, Max raw gap : %d - (raw: %08x)\n", + CALIB_TO_STATUS(value), CALIB_TO_GAP(value), value); + +calib_show_end: + ist30xx_start(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + return count; +} + +/* sysfs: /sys/class/touch/sys/power_on */ +ssize_t ist30xx_power_on_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + tsp_info("Power enable: %d\n", true); + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + + return 0; +} + +/* sysfs: /sys/class/touch/sys/power_off */ +ssize_t ist30xx_power_off_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + tsp_info("Power enable: %d\n", false); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ist30xx_internal_suspend(ts_data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} + +extern int ist30xx_max_error_cnt; +/* sysfs: /sys/class/touch/sys/errcnt */ +ssize_t ist30xx_errcnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int err_cnt; + + sscanf(buf, "%d", &err_cnt); + + if (unlikely(err_cnt < 0)) + return size; + + tsp_info("Request reset error count: %d\n", err_cnt); + + ist30xx_max_error_cnt = err_cnt; + + return size; +} + +#if IST30XX_EVENT_MODE +extern int ist30xx_max_scan_retry; +/* sysfs: /sys/class/touch/sys/scancnt */ +ssize_t ist30xx_scancnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int retry; + + sscanf(buf, "%d", &retry); + + if (unlikely(retry < 0)) + return size; + + tsp_info("Timer scan count retry: %d\n", retry); + + ist30xx_max_scan_retry = retry; + + return size; +} + +extern int timer_period_ms; +/* sysfs: /sys/class/touch/sys/timerms */ +ssize_t ist30xx_timerms_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ms; + + sscanf(buf, "%d", &ms); + + if (unlikely((ms < 0) || (ms > 10000))) + return size; + + tsp_info("Timer period ms: %dms\n", ms); + + timer_period_ms = ms; + + return size; +} +#endif + +extern int ist30xx_dbg_level; +/* sysfs: /sys/class/touch/sys/printk */ +ssize_t ist30xx_printk_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int level; + + sscanf(buf, "%d", &level); + + if (unlikely((level < DEV_ERR) || (level > DEV_VERB))) + return size; + + tsp_info("prink log level: %d\n", level); + + ist30xx_dbg_level = level; + + return size; +} + +ssize_t ist30xx_printk_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "prink log level: %d\n", ist30xx_dbg_level); +} + +/* sysfs: /sys/class/touch/sys/printk5 */ +ssize_t ist30xx_printk5_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + tsp_info("prink log level:%d\n", DEV_DEBUG); + + ist30xx_dbg_level = DEV_DEBUG; + + return 0; +} + +/* sysfs: /sys/class/touch/sys/printk6 */ +ssize_t ist30xx_printk6_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + tsp_info("prink log level:%d\n", DEV_VERB); + + ist30xx_dbg_level = DEV_VERB; + + return 0; +} + +/* sysfs: /sys/class/touch/sys/max_touch */ +ssize_t ist30xx_touch_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int finger; + int key; + + sscanf(buf, "%d %d", &finger, &key); + + tsp_info("fingers : %d, keys : %d\n", finger, key); + + ts_data->max_fingers = finger; + ts_data->max_keys = key; + + return size; +} + +extern void ist30xx_scheduled_reset(void); +extern int ist30xx_report_rate; +/* sysfs: /sys/class/touch/sys/touch_rate */ +ssize_t ist30xx_touch_rate_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int rate; + + sscanf(buf, "%d", &rate); // us + + if (unlikely(rate > 0xFFFF)) // over 65.5ms + return size; + + tsp_info("touch reporting rate: %d\n", rate); + + ist30xx_report_rate = rate; + + ist30xx_scheduled_reset(); + + return size; +} + +extern int ist30xx_idle_rate; +/* sysfs: /sys/class/touch/sys/idle_rate */ +ssize_t ist30xx_idle_scan_rate_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int rate; + + sscanf(buf, "%d", &rate); // us + + if (unlikely(rate > 0xFFFF)) // over 65.5ms + return size; + + tsp_info("touch idle scan rate: %d\n", rate); + + ist30xx_idle_rate = rate; + + ist30xx_scheduled_reset(); + + return size; +} + +extern void ist30xx_set_ta_mode(bool charging); +/* sysfs: /sys/class/touch/sys/mode_ta */ +ssize_t ist30xx_ta_mode_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) // enable/disable + return size; + + ist30xx_set_ta_mode(mode); + + return size; +} + +extern void ist30xx_set_call_mode(int mode); +/* sysfs: /sys/class/touch/sys/mode_call */ +ssize_t ist30xx_call_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) // enable/disable + return size; + + ist30xx_set_call_mode(mode); + + return size; +} + +extern void ist30xx_set_cover_mode(int mode); +/* sysfs: /sys/class/touch/sys/mode_cover */ +ssize_t ist30xx_cover_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) // enable/disable + return size; + + ist30xx_set_cover_mode(mode); + + return size; +} + +#define TUNES_CMD_WRITE (1) +#define TUNES_CMD_READ (2) +#define TUNES_CMD_REG_ENTER (3) +#define TUNES_CMD_REG_EXIT (4) +#define TUNES_CMD_UPDATE_PARAM (5) +#define TUNES_CMD_UPDATE_FW (6) + +#define DIRECT_ADDR(n) (IST30XXB_DA_ADDR(n)) +#define DIRECT_CMD_WRITE ('w') +#define DIRECT_CMD_READ ('r') + +#pragma pack(1) +typedef struct { + u8 cmd; + u32 addr; + u16 len; +} TUNES_INFO; +#pragma pack() +#pragma pack(1) +typedef struct { + char cmd; + u32 addr; + u32 val; +} DIRECT_INFO; +#pragma pack() + +static TUNES_INFO ist30xx_tunes; +static DIRECT_INFO ist30xx_direct; +static bool tunes_cmd_done = false; +static bool ist30xx_reg_mode = false; + +/* sysfs: /sys/class/touch/sys/direct */ +ssize_t ist30xxb_direct_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -EPERM; + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + sscanf(buf, "%c %x %x", &direct->cmd, &direct->addr, &direct->val); + + tsp_debug("Direct cmd: %c, addr: %x, val: %x\n", + direct->cmd, direct->addr, direct->val); + + if (unlikely((direct->cmd != DIRECT_CMD_WRITE) && + (direct->cmd != DIRECT_CMD_READ))) { + tsp_warn("Direct cmd is not correct!\n"); + return size; + } + + if (ist30xx_intr_wait(30) < 0) + return size; + + ts_data->status.event_mode = false; + if (direct->cmd == DIRECT_CMD_WRITE) { + ret = ist30xx_write_cmd(ts_data->client, DIRECT_ADDR(direct->addr), + direct->val); + ret = ist30xx_read_cmd(ts_data->client, DIRECT_ADDR(direct->addr), + &direct->val); + tsp_debug("Direct write addr: %x, val: %x\n", + direct->addr, direct->val); + } + ts_data->status.event_mode = true; + + return size; +} + +#define DIRECT_BUF_COUNT (4) +ssize_t ist30xxb_direct_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i, ret, count = 0; + int len; + u32 addr; + u32 buf32[DIRECT_BUF_COUNT]; + int max_len = DIRECT_BUF_COUNT; + const int msg_len = 256; + char msg[msg_len]; + + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + if (unlikely(direct->cmd != DIRECT_CMD_READ)) + return sprintf(buf, "ex) echo r addr len > direct\n"); + + len = direct->val; + addr = DIRECT_ADDR(direct->addr); + + if (ist30xx_intr_wait(30) < 0) + return 0; + ts_data->status.event_mode = false; + while (len > 0) { + if (len < max_len) max_len = len; + + memset(buf32, 0, sizeof(buf32)); + ret = ist30xxb_burst_read(ts_data->client, addr, buf32, max_len); + if (unlikely(ret)) { + count = sprintf(buf, "I2C Burst read fail, addr: %x\n", addr); + break; + } + + for (i = 0; i < max_len; i++) { + count += snprintf(msg, msg_len, "0x%08x ", buf32[i]); + strncat(buf, msg, msg_len); + } + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + + addr += max_len * IST30XX_DATA_LEN; + len -= max_len; + } + ts_data->status.event_mode = true; + + tsp_debug("%s", buf); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/node_info */ +ssize_t tunes_node_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int size; + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + + size = sprintf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d ", + ts_data->chip_id, tsp->dir.swap_xy, tsp->ch_num.tx, tsp->ch_num.rx, + tsp->baseline, tkey->axis_rx, tkey->enable, tkey->baseline, + tkey->ch_num[0], tkey->ch_num[1], + tkey->ch_num[2], tkey->ch_num[3], tkey->ch_num[4]); + + return size; +} + +/* sysfs: /sys/class/touch/tunes/regcmd */ +ssize_t tunes_regcmd_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -1; + u32 *buf32; + + memcpy(&ist30xx_tunes, buf, sizeof(ist30xx_tunes)); + buf += sizeof(ist30xx_tunes); + buf32 = (u32 *)buf; + + tunes_cmd_done = false; + + switch (ist30xx_tunes.cmd) { + case TUNES_CMD_WRITE: + break; + case TUNES_CMD_READ: + break; + case TUNES_CMD_REG_ENTER: + ist30xx_disable_irq(ts_data); + ist30xx_reset(false); + + /* enter reg access mode */ + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret)) + goto regcmd_fail; + + ist30xx_reg_mode = true; + + break; + case TUNES_CMD_REG_EXIT: + /* exit reg access mode */ + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (unlikely(ret)) + goto regcmd_fail; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (unlikely(ret)) + goto regcmd_fail; + + ist30xx_reg_mode = false; + + ist30xx_enable_irq(ts_data); + break; + default: + ist30xx_enable_irq(ts_data); + return size; + } + tunes_cmd_done = true; + + return size; + +regcmd_fail: + tsp_err("Tunes regcmd i2c_fail, ret=%d\n", ret); + return size; +} + +ssize_t tunes_regcmd_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int size; + + size = sprintf(buf, "cmd: 0x%02x, addr: 0x%08x, len: 0x%04x\n", + ist30xx_tunes.cmd, ist30xx_tunes.addr, ist30xx_tunes.len); + + return size; +} + +#define MAX_WRITE_LEN (1) +/* sysfs: /sys/class/touch/tunes/reg */ +ssize_t tunes_reg_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + u32 *buf32 = (u32 *)buf; + int waddr, wcnt = 0, len = 0; + + if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_WRITE)) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return size; + } + + if (unlikely(!ist30xx_reg_mode)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + if (unlikely(!tunes_cmd_done)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + waddr = ist30xx_tunes.addr; + if (ist30xx_tunes.len >= MAX_WRITE_LEN) + len = MAX_WRITE_LEN; + else + len = ist30xx_tunes.len; + + while (wcnt < ist30xx_tunes.len) { + ret = ist30xx_write_buf(ts_data->client, waddr, buf32, len); + if (unlikely(ret)) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + wcnt += len; + + if ((ist30xx_tunes.len - wcnt) < MAX_WRITE_LEN) + len = ist30xx_tunes.len - wcnt; + + buf32 += MAX_WRITE_LEN; + waddr += MAX_WRITE_LEN * IST30XX_DATA_LEN; + } + + tunes_cmd_done = false; + + return size; +} + +ssize_t tunes_reg_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int size; + u32 *buf32 = (u32 *)buf; + +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + + if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_READ)) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return 0; + } + + if (unlikely(!tunes_cmd_done)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return 0; + } + + size = ist30xx_tunes.len; + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, size); + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return 0; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); // Activated only when the GPIO I2C is used +#endif + ret = ist30xx_read_buf(ts_data->client, ist30xx_tunes.addr, buf32, size); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); // Activated only when the GPIO I2C is used +#endif + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = ist30xx_tunes.len * IST30XX_DATA_LEN; + + tunes_cmd_done = false; + + return size; +} + +/* sysfs: /sys/class/touch/tunes/adb */ +ssize_t tunes_adb_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + char *tmp, *ptr; + char token[9]; + u32 cmd, addr, len, val; + int write_len; + + sscanf(buf, "%x %x %x", &cmd, &addr, &len); + + switch (cmd) { + case TUNES_CMD_WRITE: /* write cmd */ + write_len = 0; + ptr = (char *)(buf + 15); + + while (write_len < len) { + memcpy(token, ptr, 8); + token[8] = 0; + val = simple_strtoul(token, &tmp, 16); + ret = ist30xx_write_buf(ts_data->client, addr, &val, 1); + if (unlikely(ret)) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + ptr += 8; + write_len++; + addr += 4; + } + break; + + case TUNES_CMD_READ: /* read cmd */ + ist30xx_tunes.cmd = cmd; + ist30xx_tunes.addr = addr; + ist30xx_tunes.len = len; + break; + + case TUNES_CMD_REG_ENTER: /* enter */ + ist30xx_disable_irq(ts_data); + ist30xx_reset(false); + + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret < 0)) + goto cmd_fail; + ist30xx_reg_mode = true; + break; + + case TUNES_CMD_REG_EXIT: /* exit */ + if (ist30xx_reg_mode == true) { + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (unlikely(ret < 0)) + goto cmd_fail; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (unlikely(ret < 0)) + goto cmd_fail; + ist30xx_reg_mode = false; + ist30xx_enable_irq(ts_data); + } + break; + + default: + break; + } + + return size; + +cmd_fail: + tsp_err("Tunes adb i2c_fail\n"); + return size; +} + +ssize_t tunes_adb_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int i, len, size = 0; + char reg_val[10]; + +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, + ist30xx_tunes.len); + if (unlikely(ret)) { + tsp_err("Tunes adbshow i2c_fail, ret=%d\n", ret); + return size; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); +#endif + ret = ist30xx_read_buf(ts_data->client, ist30xx_tunes.addr, + ist30xx_frame_buf, ist30xx_tunes.len); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); +#endif + if (unlikely(ret)) { + tsp_err("Tunes adbshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = 0; + buf[0] = 0; + len = sprintf(reg_val, "%08x", ist30xx_tunes.addr); + strcat(buf, reg_val); + size += len; + for (i = 0; i < ist30xx_tunes.len; i++) { + len = sprintf(reg_val, "%08x", ist30xx_frame_buf[i]); + strcat(buf, reg_val); + size += len; + } + + return size; +} + +#if IST30XX_ALGORITHM_MODE +/* sysfs: /sys/class/touch/tunes/algorithm */ +extern u32 ist30xx_algr_addr, ist30xx_algr_size; +ssize_t ist30xx_algr_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &ist30xx_algr_addr, &ist30xx_algr_size); + + tsp_info("Algorithm addr: 0x%x, count: %d\n", + ist30xx_algr_addr, ist30xx_algr_size); + + ist30xx_algr_addr |= IST30XXB_ACCESS_ADDR; + + return size; +} + +ssize_t ist30xx_algr_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + u32 algr_addr; + int count = 0; + + ret = ist30xx_read_cmd(ts_data->client, IST30XXB_MEM_ALGORITHM, &algr_addr); + if (unlikely(ret)) { + tsp_warn("Algorithm mem addr read fail!\n"); + return 0; + } + + tsp_info("algr_addr(0x%x): 0x%x\n", IST30XXB_MEM_ALGORITHM, algr_addr); + + count = sprintf(buf, "Algorithm addr : 0x%x\n", algr_addr); + + return count; +} +#endif // IST30XX_ALGORITHM_MODE + +/* sysfs: /sys/class/touch/tunes/intr_debug */ +extern u32 intr_debug_addr, intr_debug_size; +ssize_t intr_debug_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug_addr, &intr_debug_size); + tsp_info("Interrupt debug addr: 0x%x, count: %d\n", + intr_debug_addr, intr_debug_size); + + intr_debug_addr |= IST30XXB_ACCESS_ADDR; + + return size; +} + +ssize_t intr_debug_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug_addr(0x%x): %d\n", intr_debug_addr, intr_debug_size); + + count = sprintf(buf, "intr_debug_addr(0x%x): %d\n", + intr_debug_addr, intr_debug_size); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/intr_debug2 */ +extern u32 intr_debug2_addr, intr_debug2_size; +ssize_t intr_debug2_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug2_addr, &intr_debug2_size); + tsp_info("Interrupt debug2 addr: 0x%x, count: %d\n", + intr_debug2_addr, intr_debug2_size); + + intr_debug2_addr |= IST30XXB_ACCESS_ADDR; + + return size; +} + +ssize_t intr_debug2_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug2_addr(0x%x): %d\n", + intr_debug2_addr, intr_debug2_size); + + count = sprintf(buf, "intr_debug2_addr(0x%x): %d\n", + intr_debug2_addr, intr_debug2_size); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/intr_debug3 */ +extern u32 intr_debug3_addr, intr_debug3_size; +ssize_t intr_debug3_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug3_addr, &intr_debug3_size); + tsp_info("Interrupt debug3 addr: 0x%x, count: %d\n", + intr_debug3_addr, intr_debug3_size); + + intr_debug3_addr |= IST30XXB_ACCESS_ADDR; + + return size; +} + +ssize_t intr_debug3_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug3_addr(0x%x): %d\n", + intr_debug3_addr, intr_debug3_size); + + count = sprintf(buf, "intr_debug3_addr(0x%x): %d\n", + intr_debug3_addr, intr_debug3_size); + + return count; +} + +#if IST30XX_CHKIC +u8 *ts_chkic_bin = NULL; +u32 ts_chkic_bin_size = 0; +u32 ts_chkic_result = 0; + +int chkic_ms_delay = IST30XX_CHKIC_WAIT; +int ist30xx_chkic_wait(void) +{ + int cnt = chkic_ms_delay; + + ts_data->status.chkic_msg = 0; + while (cnt-- > 0) { + msleep(100); + + if (ts_data->status.chkic_msg) { + if (ts_data->status.chkic_msg == IST30XX_CHKIC_END) + return 0; + else + return -EAGAIN; + } + } + tsp_warn("Fault test time out\n"); + + return -EPERM; +} + +#define chkic_next_step(ret) { if (unlikely(ret)) goto end; msleep(5); } +int ist30xx_chkic_test(const u8 *buf, int size) +{ + int ret; + int len; + u32 chksum = 0; + u32 chkic_chksum = 0; + u32 *buf32; + struct i2c_client *client = (struct i2c_client *)ts_data->client; + + tsp_info("*** Check IC ***\n"); + + /* Result initial */ + ts_chkic_result = 0; + + /* Parse chkicsum */ + chkic_chksum = *((u32 *)&buf[size - IST30XX_CHECKSUM_SIZE]); + tsp_verb("Read binary info - chksum: 0x%08x size: 0x%x\n", + chkic_chksum, size); + + ist30xx_disable_irq(ts_data); + + ist30xx_reset(false); + + /* Load IC chkic test code */ + ret = ist30xx_write_cmd(client, CMD_EXEC_MEM_CODE, 0); + chkic_next_step(ret); + + buf32 = (u32 *)buf; + len = size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + ret = ist30xx_write_buf(client, len, buf32, len); + chkic_next_step(ret); + + /* Check load end */ + ret = ist30xx_read_cmd(client, CMD_DEFAULT, &chksum); + chkic_next_step(ret); + if (chksum != IST30XX_CHKIC_LOAD_END) + goto end; + tsp_info("Check ic code ready!!\n"); + + /* Check chksum */ + ret = ist30xx_read_cmd(client, CMD_DEFAULT, &chksum); + chkic_next_step(ret); + tsp_info("Check ic chksum: %08x, %08x\n", chksum, chkic_chksum); + + ist30xx_enable_irq(ts_data); + /* Wait IC chkic result */ + if (ist30xx_chkic_wait() != 0) + tsp_info("Check ic timeout!!\n"); + + ist30xx_disable_irq(ts_data); + + /* Read IC chkic result */ + ret = ist30xx_read_cmd(client, CMD_DEFAULT, &ts_chkic_result); + chkic_next_step(ret); + tsp_info("Read result value: %08x\n", ts_chkic_result); + + ist30xx_reset(false); + + ist30xx_start(ts_data); + +end: + if (unlikely(ret)) { + tsp_warn("Check ic error, ret=%d\n", ret); + } else if (unlikely(chksum != chkic_chksum)) { + tsp_warn("Chksum error, chksum=%x(%x)\n", chksum, chkic_chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + + return ret; +} + +/* sysfs: /sys/class/touch/chkic/chkic */ +static ssize_t ist30xx_chkic_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + + if ((ts_chkic_bin == NULL) || (ts_chkic_bin_size == 0)) + return sprintf(buf, "Binary is not correct(%d)\n", ts_chkic_bin_size); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_chkic_test(ts_chkic_bin, ts_chkic_bin_size); + mutex_unlock(&ist30xx_mutex); + + if (ts_chkic_result == IST30XX_CHKIC_OK) + return sprintf(buf, "Check IC : OK"); + else if (ts_chkic_result == IST30XX_CHKIC_FAIL) + return sprintf(buf, "Check IC : FAIL"); + else + return sprintf(buf, "Check IC : ERROR"); +} +#endif + +/* sysfs : node */ +static DEVICE_ATTR(refresh, S_IRWXUGO, ist30xx_frame_refresh, NULL); +static DEVICE_ATTR(nocp, S_IRWXUGO, ist30xx_frame_nocp, NULL); +static DEVICE_ATTR(filter, S_IRWXUGO, ist30xx_filter_show, NULL); +static DEVICE_ATTR(raw, S_IRWXUGO, ist30xx_raw_show, NULL); +static DEVICE_ATTR(base, S_IRWXUGO, ist30xx_base_show, NULL); +static DEVICE_ATTR(diff, S_IRWXUGO, ist30xx_diff_show, NULL); + +/* sysfs : sys */ +static DEVICE_ATTR(printk, S_IRWXUGO, + ist30xx_printk_show, ist30xx_printk_store); +static DEVICE_ATTR(printk5, S_IRWXUGO, ist30xx_printk5_show, NULL); +static DEVICE_ATTR(printk6, S_IRWXUGO, ist30xx_printk6_show, NULL); +static DEVICE_ATTR(direct, S_IRWXUGO, + ist30xxb_direct_show, ist30xxb_direct_store); +static DEVICE_ATTR(clb_time, S_IRWXUGO, NULL, ist30xx_calib_time_store); +static DEVICE_ATTR(clb, S_IRWXUGO, ist30xx_calib_show, NULL); +static DEVICE_ATTR(clb_result, S_IRWXUGO, ist30xx_calib_result_show, NULL); +static DEVICE_ATTR(tsp_power_on, S_IRWXUGO, ist30xx_power_on_show, NULL); +static DEVICE_ATTR(tsp_power_off, S_IRWXUGO, ist30xx_power_off_show, NULL); +static DEVICE_ATTR(errcnt, S_IRWXUGO, NULL, ist30xx_errcnt_store); +#if IST30XX_EVENT_MODE +static DEVICE_ATTR(scancnt, S_IRWXUGO, NULL, ist30xx_scancnt_store); +static DEVICE_ATTR(timerms, S_IRWXUGO, NULL, ist30xx_timerms_store); +#endif +static DEVICE_ATTR(report_rate, S_IRWXUGO, NULL, ist30xx_touch_rate_store); +static DEVICE_ATTR(idle_rate, S_IRWXUGO, NULL, ist30xx_idle_scan_rate_store); +static DEVICE_ATTR(mode_ta, S_IRWXUGO, NULL, ist30xx_ta_mode_store); +static DEVICE_ATTR(mode_call, S_IRWXUGO, NULL, ist30xx_call_mode_store); +static DEVICE_ATTR(mode_cover, S_IRWXUGO, NULL, ist30xx_cover_mode_store); +static DEVICE_ATTR(max_touch, S_IRWXUGO, NULL, ist30xx_touch_store); + +/* sysfs : tunes */ +static DEVICE_ATTR(node_info, S_IRWXUGO, tunes_node_info_show, NULL); +static DEVICE_ATTR(regcmd, S_IRWXUGO, tunes_regcmd_show, tunes_regcmd_store); +static DEVICE_ATTR(reg, S_IRWXUGO, tunes_reg_show, tunes_reg_store); +static DEVICE_ATTR(adb, S_IRWXUGO, tunes_adb_show, tunes_adb_store); +#if IST30XX_ALGORITHM_MODE +static DEVICE_ATTR(algorithm, S_IRWXUGO, ist30xx_algr_show, ist30xx_algr_store); +#endif +static DEVICE_ATTR(intr_debug, S_IRWXUGO, intr_debug_show, intr_debug_store); +static DEVICE_ATTR(intr_debug2, S_IRWXUGO, intr_debug2_show, intr_debug2_store); +static DEVICE_ATTR(intr_debug3, S_IRWXUGO, intr_debug3_show, intr_debug3_store); + +#if IST30XX_CHKIC +/* sysfs : chkic */ +static DEVICE_ATTR(chkic, S_IRUGO, ist30xx_chkic_show, NULL); +#endif + +static struct attribute *node_attributes[] = { + &dev_attr_refresh.attr, + &dev_attr_nocp.attr, + &dev_attr_filter.attr, + &dev_attr_raw.attr, + &dev_attr_base.attr, + &dev_attr_diff.attr, + NULL, +}; + +static struct attribute *sys_attributes[] = { + &dev_attr_printk.attr, + &dev_attr_printk5.attr, + &dev_attr_printk6.attr, + &dev_attr_direct.attr, + &dev_attr_clb_time.attr, + &dev_attr_clb.attr, + &dev_attr_clb_result.attr, + &dev_attr_tsp_power_on.attr, + &dev_attr_tsp_power_off.attr, + &dev_attr_errcnt.attr, +#if IST30XX_EVENT_MODE + &dev_attr_scancnt.attr, + &dev_attr_timerms.attr, +#endif + &dev_attr_report_rate.attr, + &dev_attr_idle_rate.attr, + &dev_attr_mode_ta.attr, + &dev_attr_mode_call.attr, + &dev_attr_mode_cover.attr, + &dev_attr_max_touch.attr, + NULL, +}; + +static struct attribute *tunes_attributes[] = { + &dev_attr_node_info.attr, + &dev_attr_regcmd.attr, + &dev_attr_reg.attr, + &dev_attr_adb.attr, +#if IST30XX_ALGORITHM_MODE + &dev_attr_algorithm.attr, +#endif + &dev_attr_intr_debug.attr, + &dev_attr_intr_debug2.attr, + &dev_attr_intr_debug3.attr, + NULL, +}; + +#if IST30XX_CHKIC +static struct attribute *chkic_attributes[] = { + &dev_attr_chkic.attr, + NULL, +}; +#endif + +static struct attribute_group node_attr_group = { + .attrs = node_attributes, +}; + +static struct attribute_group sys_attr_group = { + .attrs = sys_attributes, +}; + +static struct attribute_group tunes_attr_group = { + .attrs = tunes_attributes, +}; + +#if IST30XX_CHKIC +static struct attribute_group chkic_attr_group = { + .attrs = chkic_attributes, +}; +#endif + +extern struct class *ist30xx_class; +struct device *ist30xx_sys_dev; +struct device *ist30xx_tunes_dev; +struct device *ist30xx_node_dev; +#if IST30XX_CHKIC +struct device *ist30xx_chkic_dev; +#endif + +int ist30xx_init_misc_sysfs(void) +{ + /* /sys/class/touch/sys */ + ist30xx_sys_dev = device_create(ist30xx_class, NULL, 0, NULL, "sys"); + + /* /sys/class/touch/sys/... */ + if (unlikely(sysfs_create_group(&ist30xx_sys_dev->kobj, + &sys_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "sys"); + + /* /sys/class/touch/tunes */ + ist30xx_tunes_dev = device_create(ist30xx_class, NULL, 0, NULL, "tunes"); + + /* /sys/class/touch/tunes/... */ + if (unlikely(sysfs_create_group(&ist30xx_tunes_dev->kobj, + &tunes_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "tunes"); + + /* /sys/class/touch/node */ + ist30xx_node_dev = device_create(ist30xx_class, NULL, 0, NULL, "node"); + + /* /sys/class/touch/node/... */ + if (unlikely(sysfs_create_group(&ist30xx_node_dev->kobj, + &node_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "node"); + +#if IST30XX_CHKIC + /* /sys/class/touch/chkic */ + ist30xx_chkic_dev = device_create(ist30xx_class, NULL, 0, NULL, "chkic"); + + /* /sys/class/touch/chkic/... */ + if (unlikely(sysfs_create_group(&ist30xx_chkic_dev->kobj, + &chkic_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "chkic"); + + ts_chkic_bin = (u8 *)ist30xxb_chkic; + ts_chkic_bin_size = sizeof(ist30xxb_chkic); +#endif + + ist30xx_frame_buf = kmalloc(4096, GFP_KERNEL); + ist30xx_frame_rawbuf = kmalloc(4096, GFP_KERNEL); + ist30xx_frame_fltbuf = kmalloc(4096, GFP_KERNEL); + if (!ist30xx_frame_buf || !ist30xx_frame_rawbuf || !ist30xx_frame_fltbuf) + return -ENOMEM; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_misc.h b/drivers/input/touchscreen/ist30xxa/ist30xx_misc.h new file mode 100644 index 00000000..9313f8b1 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_misc.h @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_MISC_H__ +#define __IST30XX_MISC_H__ + +#include "ist30xx_tsp.h" + +#define IST30XXB_RAW_ADDR (0x40100200) +#define IST30XXB_FILTER_ADDR (0x40101000) + +#define IST30XX_RX_CNT_ADDR (0x20000038) +#define IST30XX_CONFIG_ADDR (0x20000040) + +#define NODE_FLAG_RAW (1) +#define NODE_FLAG_BASE (1 << 1) +#define NODE_FLAG_FILTER (1 << 2) +#define NODE_FLAG_DIFF (1 << 3) +#define NODE_FLAG_ALL (0xF) +#define NODE_FLAG_NO_CCP (1 << 7) + +#if IST30XX_CHKIC +#define IST30XX_CHKIC_LOAD_END (0x8FFFFCAB) +#define IST30XX_CHKIC_END (0x8FAB0FAB) + +#define IST30XX_CHECKSUM_SIZE (4) +#define IST30XX_CHKIC_OK (0x00000001) +#define IST30XX_CHKIC_FAIL (0x000000FF) + +#define IST30XX_CHKIC_WAIT (30) // 3.0sec +#endif + +struct TSP_CH_NUM { + u8 tx; + u8 rx; +}; +struct TSP_NODE_BUF { + u16 raw[NODE_TX_NUM][NODE_RX_NUM]; + u16 base[NODE_TX_NUM][NODE_RX_NUM]; + u16 filter[NODE_TX_NUM][NODE_RX_NUM]; + u16 min_raw; + u16 max_raw; + u16 min_base; + u16 max_base; + u16 len; +}; +struct TSP_DIRECTION { + bool swap_xy; + bool flip_x; + bool flip_y; +}; +typedef struct _TSP_INFO { + struct TSP_CH_NUM ch_num; + struct TSP_DIRECTION dir; + struct TSP_NODE_BUF node; + int height; + int width; + int finger_num; + u16 baseline; +} TSP_INFO; +typedef struct _TKEY_INFO { + int key_num; + bool enable; + bool axis_rx; + u8 axis_chnum; + u8 ch_num[5]; + u16 baseline; +} TKEY_INFO; + +int ist30xx_parse_touch_node(u8 flag, struct TSP_NODE_BUF *node); +int ist30xx_read_touch_node(u8 flag, struct TSP_NODE_BUF *node); + +int ist30xx_tsp_update_info(void); +int ist30xx_tkey_update_info(void); + +int ist30xx_get_tsp_info(struct ist30xx_data *data); +int ist30xx_get_tkey_info(struct ist30xx_data *data); + +int ist30xx_init_misc_sysfs(void); + +#endif // __IST30XX_MISC_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_sec.c b/drivers/input/touchscreen/ist30xxa/ist30xx_sec.c new file mode 100644 index 00000000..e8fae499 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_sec.c @@ -0,0 +1,916 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" + + +static char IsfwUpdate[20] = { 0 }; + +#define FW_DOWNLOADING "Downloading" +#define FW_DOWNLOAD_COMPLETE "Complete" +#define FW_DOWNLOAD_FAIL "FAIL" + +#define FACTORY_BUF_SIZE (1024) +#define BUILT_IN (0) +#define UMS (1) + +#define CMD_STATE_WAITING (0) +#define CMD_STATE_RUNNING (1) +#define CMD_STATE_OK (2) +#define CMD_STATE_FAIL (3) +#define CMD_STATE_NA (4) + +#define TSP_NODE_DEBUG (1) + +static u16 node_value[TSP_TOTAL_NUM]; + +extern struct ist30xx_data *ts_data; +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; + + +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func +struct tsp_cmd { + struct list_head list; + const char * cmd_name; + void (*cmd_func)(void *dev_data); +}; + +u32 ist30xxb_get_fw_ver(struct ist30xx_data *data) +{ + u32 addr = data->tags.cfg_addr + 4; + u32 len = 1; + u32 ver = 0; + int ret = -EPERM; + + ist30xx_disable_irq(data); + ret = ist30xx_cmd_reg(data->client, CMD_ENTER_REG_ACCESS); + if (unlikely(ret)) + goto get_fw_ver_fail; + + ret = ist30xx_write_cmd(data->client, IST30XX_RX_CNT_ADDR, len); + if (unlikely(ret)) + goto get_fw_ver_fail; + + ret = ist30xx_read_cmd(data->client, addr, &ver); + if (unlikely(ret)) + goto get_fw_ver_fail; + + tsp_debug("Reg addr: %x, ver: %x\n", addr, ver); + + ret = ist30xx_cmd_reg(data->client, CMD_EXIT_REG_ACCESS); + if (likely(ret == 0)) + goto get_fw_ver_end; + +get_fw_ver_fail: + ist30xx_reset(false); + +get_fw_ver_end: + ist30xx_cmd_start_scan(data->client); + ist30xx_enable_irq(data); + + return ver; +} + +u32 key_sensitivity = 0; +int ist30xxb_get_key_sensitivity(struct ist30xx_data *data, int id) +{ + u32 addr = IST30XXB_MEM_KEYSENSITIVITY + 4 * sizeof(u32); + u32 val = 0; + + if (unlikely(id >= ist30xx_tkey_info.key_num)) + return 0; + + if (ist30xx_intr_wait(30) < 0) + return 0; + + ist30xx_read_cmd(data->client, addr, &val); + if ((val & 0xFFF) == 0xFFF) + return (key_sensitivity >> (16 * id)) & 0xFFFF; + + key_sensitivity = val; + + tsp_debug("Reg addr: %x, val: %8x\n", addr, val); + + val >>= (16 * id); + + return (int)(val & 0xFFFF); +} + + +/* Factory CMD function */ +static void set_default_result(struct sec_factory *sec) +{ + char delim = ':'; + + memset(sec->cmd_result, 0, ARRAY_SIZE(sec->cmd_result)); + memcpy(sec->cmd_result, sec->cmd, strlen(sec->cmd)); + strncat(sec->cmd_result, &delim, CMD_STATE_RUNNING); +} + +static void set_cmd_result(struct sec_factory *sec, char *buf, int len) +{ + strncat(sec->cmd_result, buf, len); +} + +static void not_support_cmd(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", "NA"); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_NA; + dev_info(&data->client->dev, "%s: \"%s(%d)\"\n", __func__, + buf, strnlen(buf, sizeof(buf))); + return; +} + +static void get_chip_vendor(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_VENDOR); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_name(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_NAME); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_id(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%#02x", data->chip_id); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} +#include +#define MAX_FW_PATH 255 +extern u32 ist30xx_fw_ver; +extern u32 ist30xx_param_ver; +extern u32 ist30xx_sub_ver; +static void fw_update(void *dev_data) +{ + int ret; + char buf[16] = { 0 }; + mm_segment_t old_fs = {0}; + struct file *fp = NULL; + long fsize = 0, nread = 0; + u8 *fw; + char fw_path[MAX_FW_PATH+1]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case BUILT_IN: + sec->cmd_state = CMD_STATE_OK; + ret = ist30xx_fw_recovery(data); + if (ret < 0) + sec->cmd_state = CMD_STATE_FAIL; + break; + case UMS: + sec->cmd_state = CMD_STATE_OK; + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FW_PATH, "/sdcard/%s", IST30XXB_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_warn("%s(), file %s open error:%d\n", __func__, + fw_path, (s32)fp); + sec->cmd_state= CMD_STATE_FAIL; + set_fs(old_fs); + break; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + if (fsize != data->fw.buf_size) { + tsp_warn("%s(), invalid fw size!!\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + set_fs(old_fs); + break; + } + fw = kzalloc((size_t)fsize, GFP_KERNEL); + if (!fw) { + tsp_warn("%s(), failed to alloc buffer for fw\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + filp_close(fp, NULL); + set_fs(old_fs); + break; + } + nread = vfs_read(fp, (char __user *)fw, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_warn("%s(), failed to read fw\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + filp_close(fp, NULL); + set_fs(old_fs); + break; + } + + filp_close(fp, current->files); + set_fs(old_fs); + tsp_info("%s(), ums fw is loaded!!\n", __func__); + + ist30xx_get_update_info(ts_data, fw, fsize); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(data->client, fw, fsize, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + break; + + default: + tsp_warn("%s(), Invalid fw file type!\n", __func__); + break; + } + + if (sec->cmd_state == CMD_STATE_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); +} + + +static void get_fw_ver_bin(void *dev_data) +{ + u32 ver = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + ver = ist30xx_parse_ver(FLAG_PARAM, data->fw.buf); + snprintf(buf, sizeof(buf), "IM00%04x", ver); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_fw_ver_ic(void *dev_data) +{ + u32 ver = 0; + char msg[8]; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->status.power == 1) + ver = ist30xxb_get_fw_ver(ts_data); + + snprintf(buf, sizeof(buf), "IM00%04x", ver & 0xFFFF); + + if (data->fw.sub_ver > 0) { + sprintf(msg, "(T%d)", data->fw.sub_ver); + strcat(buf, msg); + } + + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_threshold(void *dev_data) +{ + char buf[16] = { 0 }; + int threshold; + u32 *cfg_buf; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + cfg_buf = (u32 *)&data->fw.buf[data->tags.cfg_addr]; + + threshold = (int)(cfg_buf[0x2C / IST30XX_DATA_LEN] & 0xFFFF); + + snprintf(buf, sizeof(buf), "%d", threshold); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_x_num(void *dev_data) +{ + int val = ist30xx_tsp_info.width; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +static void get_y_num(void *dev_data) +{ + int val = ist30xx_tsp_info.height; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +int check_tsp_channel(void *dev_data) +{ + int node = -EPERM; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= tsp->width) || + (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= tsp->height)) { + dev_info(&data->client->dev, "%s: parameter error: %u,%u\n", + __func__, sec->cmd_param[0], sec->cmd_param[1]); + } else { + node = sec->cmd_param[0] + sec->cmd_param[1] * tsp->width; + dev_info(&data->client->dev, "%s: node = %d\n", __func__, node); + } + + return node; +} + + +extern int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16); +void run_raw_read(void *dev_data) +{ + int i, ret; + int min_val, max_val; + char buf[16] = { 0 }; + u8 flag = NODE_FLAG_RAW; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &ist30xx_tsp_info; + + set_default_result(sec); + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node read fail!\n", __func__); + return; + } + ist30xx_parse_touch_node(flag, &tsp->node); + + ret = parse_tsp_node(flag, &tsp->node, node_value); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag); + return; + } + + min_val = max_val = node_value[0]; + for (i = 0; i < tsp->width * tsp->height; i++) { +#if TSP_NODE_DEBUG + if ((i % tsp->width) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", node_value[i]); +#endif + + max_val = max(max_val, (int)node_value[i]); + min_val = min(min_val, (int)node_value[i]); + } + + snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val); + tsp_info("%s(), %s\n", __func__, buf); + + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void get_raw_value(void *dev_data) +{ + int idx = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + idx = check_tsp_channel(data); + if (idx < 0) { // Parameter parsing fail + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + } else { + snprintf(buf, sizeof(buf), "%d", node_value[idx]); + sec->cmd_state = CMD_STATE_OK; + } + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), [%d][%d]: %s\n", __func__, + sec->cmd_param[0], sec->cmd_param[1], buf); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + + + +/* sysfs: /sys/class/sec/tsp/close_tsp_test */ +static ssize_t show_close_tsp_test(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0); +} + +/* sysfs: /sys/class/sec/tsp/cmd */ +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + struct i2c_client *client = data->client; + + char *cur, *start, *end; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + int ret; + + if (sec->cmd_is_running == true) { + dev_err(&client->dev, "tsp_cmd: other cmd is running.\n"); + tsp_err("tsp_cmd: other cmd is running.\n"); + goto err_out; + } + + /* check lock */ + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = true; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_RUNNING; + + for (i = 0; i < ARRAY_SIZE(sec->cmd_param); i++) + sec->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + memset(sec->cmd, 0, ARRAY_SIZE(sec->cmd)); + memcpy(sec->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(msg, buf, cur - buf); + else + memcpy(msg, buf, len); + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp(msg, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(msg, 0, ARRAY_SIZE(msg)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(msg, start, end - start); + *(msg + strlen(msg)) = '\0'; + ret = kstrtoint(msg, 10, \ + sec->cmd_param + param_cnt); + start = cur + 1; + memset(msg, 0, ARRAY_SIZE(msg)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + tsp_info("SEC CMD = %s\n", tsp_cmd_ptr->cmd_name); + + for (i = 0; i < param_cnt; i++) + dev_info(&client->dev, "cmd param %d= %d\n", i, sec->cmd_param[i]); + + tsp_cmd_ptr->cmd_func(data); + +err_out: + return count; +} + +/* sysfs: /sys/class/sec/tsp/cmd_status */ +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + char msg[16] = { 0 }; + + dev_info(&data->client->dev, "tsp cmd: status:%d\n", sec->cmd_state); + + if (sec->cmd_state == CMD_STATE_WAITING) + snprintf(msg, sizeof(msg), "WAITING"); + else if (sec->cmd_state == CMD_STATE_RUNNING) + snprintf(msg, sizeof(msg), "RUNNING"); + else if (sec->cmd_state == CMD_STATE_OK) + snprintf(msg, sizeof(msg), "OK"); + else if (sec->cmd_state == CMD_STATE_FAIL) + snprintf(msg, sizeof(msg), "FAIL"); + else if (sec->cmd_state == CMD_STATE_NA) + snprintf(msg, sizeof(msg), "NOT_APPLICABLE"); + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", msg); +} + +/* sysfs: /sys/class/sec/tsp/result */ +static ssize_t show_cmd_result(struct device *dev, struct device_attribute + *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + dev_info(&data->client->dev, "tsp cmd: result: %s\n", sec->cmd_result); + + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = false; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_WAITING; + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", sec->cmd_result); +} + + + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_version_phone */ +static ssize_t phone_firmware_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 ver = ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_version_panel */ +static ssize_t part_firmware_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 ver = 0; + + if (ts_data->status.power == 1) + ver = ist30xxb_get_fw_ver(ts_data); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_threshold */ +static ssize_t threshold_firmware_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int threshold; + u32 *cfg_buf; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + cfg_buf = (u32 *)&ts_data->fw.buf[ts_data->tags.cfg_addr]; + + threshold = (int)(cfg_buf[0x2C / IST30XX_DATA_LEN] & 0xFFFF); + + tsp_info("%s(), %d\n", __func__, threshold); + + return sprintf(buf, "%d", threshold); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_update */ +static ssize_t firmware_update(struct device *dev, + struct device_attribute *attr, char *buf) +{ + bool ret; + + sprintf(IsfwUpdate, "%s\n", FW_DOWNLOADING); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + ret = ist30xx_fw_recovery(ts_data); + ret = (ret == 0 ? 1 : -1); + + sprintf(IsfwUpdate, "%s\n", + (ret > 0 ? FW_DOWNLOAD_COMPLETE : FW_DOWNLOAD_FAIL)); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%d", ret); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_update_status */ +static ssize_t firmware_update_status(struct device *dev, + struct device_attribute *attr, char *buf) +{ + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%s\n", IsfwUpdate); +} + +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_recent */ +static ssize_t recent_sensitivity_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 0); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d", sensitivity); +} + +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_back */ +static ssize_t back_sensitivity_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 1); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d", sensitivity); +} + +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_threshold */ +static ssize_t touchkey_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int threshold; + u32 *cfg_buf; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + cfg_buf = (u32 *)&ts_data->fw.buf[ts_data->tags.cfg_addr]; + + threshold = (int)(cfg_buf[0x30 / IST30XX_DATA_LEN] & 0xFFFF); + + tsp_info("%s(), %d\n", __func__, threshold); + + return snprintf(buf, sizeof(int), "%d\n", threshold); +} + +struct tsp_cmd tsp_cmds[] = { + { TSP_CMD("get_chip_vendor", get_chip_vendor), }, + { TSP_CMD("get_chip_name", get_chip_name), }, + { TSP_CMD("get_chip_id", get_chip_id), }, + { TSP_CMD("fw_update", fw_update), }, + { TSP_CMD("get_fw_ver_bin", get_fw_ver_bin), }, + { TSP_CMD("get_fw_ver_ic", get_fw_ver_ic), }, + { TSP_CMD("get_threshold", get_threshold), }, + { TSP_CMD("get_x_num", get_x_num), }, + { TSP_CMD("get_y_num", get_y_num), }, + { TSP_CMD("run_raw_read", run_raw_read), }, + { TSP_CMD("get_raw_value", get_raw_value), }, + { TSP_CMD("not_support_cmd", not_support_cmd), }, +}; + +#define SEC_DEFAULT_ATTR (S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH) +/* sysfs - touchscreen */ +static DEVICE_ATTR(tsp_firm_version_phone, SEC_DEFAULT_ATTR, + phone_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_version_panel, SEC_DEFAULT_ATTR, + part_firmware_show, NULL); +static DEVICE_ATTR(tsp_threshold, SEC_DEFAULT_ATTR, + threshold_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_update, SEC_DEFAULT_ATTR, + firmware_update, NULL); +static DEVICE_ATTR(tsp_firm_update_status, SEC_DEFAULT_ATTR, + firmware_update_status, NULL); + +/* sysfs - touchkey */ +static DEVICE_ATTR(touchkey_recent, SEC_DEFAULT_ATTR, + recent_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_back, SEC_DEFAULT_ATTR, + back_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_threshold, SEC_DEFAULT_ATTR, + touchkey_threshold_show, NULL); + +/* sysfs - tsp */ +static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *sec_tsp_attributes[] = { + &dev_attr_tsp_firm_version_phone.attr, + &dev_attr_tsp_firm_version_panel.attr, + &dev_attr_tsp_threshold.attr, + &dev_attr_tsp_firm_update.attr, + &dev_attr_tsp_firm_update_status.attr, + NULL, +}; + +static struct attribute *sec_tkey_attributes[] = { + &dev_attr_touchkey_recent.attr, + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_threshold.attr, + NULL, +}; + +static struct attribute *sec_touch_facotry_attributes[] = { + &dev_attr_close_tsp_test.attr, + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group sec_tsp_attr_group = { + .attrs = sec_tsp_attributes, +}; + +static struct attribute_group sec_tkey_attr_group = { + .attrs = sec_tkey_attributes, +}; + +static struct attribute_group sec_touch_factory_attr_group = { + .attrs = sec_touch_facotry_attributes, +}; + +extern struct class *sec_class; +struct device *sec_touchscreen; +EXPORT_SYMBOL(sec_touchscreen); +struct device *sec_touchkey; +EXPORT_SYMBOL(sec_touchkey); +struct device *sec_fac_dev; + + +int sec_touch_sysfs(struct ist30xx_data *data) +{ + /* /sys/class/sec/sec_touchscreen */ + sec_touchscreen = device_create(sec_class, NULL, 0, NULL, + "sec_touchscreen"); + if (IS_ERR(sec_touchscreen)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchscreen"); + return -ENODEV; + } + /* /sys/class/sec/sec_touchscreen/... */ + if (sysfs_create_group(&sec_touchscreen->kobj, &sec_tsp_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchscreen"); + + /* /sys/class/sec/sec_touchkey */ + sec_touchkey = device_create(sec_class, NULL, 0, NULL, "sec_touchkey"); + if (IS_ERR(sec_touchkey)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchkey"); + return -ENODEV; + } + /* /sys/class/sec/sec_touchkey/... */ + if (sysfs_create_group(&sec_touchkey->kobj, &sec_tkey_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchkey"); + + /* /sys/class/sec/tsp */ + sec_fac_dev = device_create(sec_class, NULL, 0, data, "tsp"); + if (IS_ERR(sec_fac_dev)) { + tsp_err("Failed to create device (%s)!\n", "tsp"); + return -ENODEV; + } + /* /sys/class/sec/tsp/... */ + if (sysfs_create_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "tsp"); + + return 0; +} +EXPORT_SYMBOL(sec_touch_sysfs); +int sec_fac_cmd_init(struct ist30xx_data *data) +{ + int i; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + INIT_LIST_HEAD(&sec->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &sec->cmd_list_head); + + mutex_init(&sec->cmd_lock); + sec->cmd_is_running = false; + + return 0; +} +EXPORT_SYMBOL(sec_fac_cmd_init); diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_sec.h b/drivers/input/touchscreen/ist30xxa/ist30xx_sec.h new file mode 100644 index 00000000..517e14b8 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_sec.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_SEC_H__ +#define __IST30XX_SEC_H__ + + +#define SEC_CMD_STR_LEN 32 +#define SEC_CMD_RESULT_STR_LEN 512 +#define SEC_CMD_PARAM_NUM 8 + +#include "ist30xx_tsp.h" + +struct sec_factory { + struct list_head cmd_list_head; + unsigned char cmd_state; + char cmd[SEC_CMD_STR_LEN]; + int cmd_param[SEC_CMD_PARAM_NUM]; + char cmd_result[SEC_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; +}; + +#endif // __IST30XX_SEC_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_sys.c b/drivers/input/touchscreen/ist30xxa/ist30xx_sys.c new file mode 100644 index 00000000..62bfba85 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_sys.c @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_tracking.h" + +#include +#include + +/****************************************************************************** + * Return value of Error + * EPERM : 1 (Operation not permitted) + * ENOENT : 2 (No such file or directory) + * EIO : 5 (I/O error) + * ENXIO : 6 (No such device or address) + * EINVAL : 22 (Invalid argument) + *****************************************************************************/ + +extern struct ist30xx_data *ts_data; +extern char *ist_vdd_name; + +const u32 pos_cmd = cpu_to_be32(CMD_GET_COORD); +struct i2c_msg pos_msg[READ_CMD_MSG_LEN] = { + { + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&pos_cmd, + }, + { .flags = I2C_M_RD, }, +}; + +int ist30xx_get_position(struct i2c_client *client, u32 *buf, u16 len) +{ + int ret, i; + + pos_msg[0].addr = client->addr; + pos_msg[1].addr = client->addr; + pos_msg[1].len = len * IST30XX_DATA_LEN, + pos_msg[1].buf = (u8 *)buf, + + ret = i2c_transfer(client->adapter, pos_msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d)\n", __func__, ret); + return -EIO; + } + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_cmd_start_scan(struct i2c_client *client) +{ + int ret; + + ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0); + + ist30xx_tracking(TRACK_CMD_SCAN); + + msleep(100); + + ts_data->status.noise_mode = true; + + return ret; +} + +int ist30xx_cmd_calibrate(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, CMD_CALIBRATE, 0); + + ist30xx_tracking(TRACK_CMD_CALIB); + + tsp_info("%s\n", __func__); + + msleep(100); + + return ret; +} + +int ist30xx_cmd_check_calib(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, CMD_CHECK_CALIB, 0); + + ist30xx_tracking(TRACK_CMD_CHECK_CALIB); + + tsp_info("*** Check Calibration cmd ***\n"); + + msleep(20); + + return ret; +} + +int ist30xx_cmd_update(struct i2c_client *client, int cmd) +{ + u32 val = (cmd == CMD_ENTER_FW_UPDATE ? CMD_FW_UPDATE_MAGIC : 0); + int ret = ist30xx_write_cmd(client, cmd, val); + + ist30xx_tracking(TRACK_CMD_FWUPDATE); + + msleep(10); + + return ret; +} + +int ist30xx_cmd_reg(struct i2c_client *client, int cmd) +{ + int ret = ist30xx_write_cmd(client, cmd, 0); + + if (cmd == CMD_ENTER_REG_ACCESS) { + ist30xx_tracking(TRACK_CMD_ENTER_REG); + msleep(100); + } else if (cmd == CMD_EXIT_REG_ACCESS) { + ist30xx_tracking(TRACK_CMD_EXIT_REG); + msleep(10); + } + + return ret; +} + + +int ist30xx_read_cmd(struct i2c_client *client, u32 cmd, u32 *buf) +{ + int ret; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d), cmd: %x\n", __func__, ret, cmd); + return -EIO; + } + *buf = cpu_to_be32(*buf); + + return 0; +} + + +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val) +{ + int ret; + struct i2c_msg msg; + u8 msg_buf[IST30XX_ADDR_LEN + IST30XX_DATA_LEN]; + + put_unaligned_be32(cmd, msg_buf); + put_unaligned_be32(val, msg_buf + IST30XX_ADDR_LEN); + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_ADDR_LEN + IST30XX_DATA_LEN; + msg.buf = msg_buf; + + ret = i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN); + if (ret != WRITE_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d), cmd: %x(%x)\n", __func__, ret, cmd, val); + return -EIO; + } + + return 0; +} + +static void ts_power_enable(int en) +{ + int ret; + + tsp_info("%s %s\n", __func__, (en) ? "on" : "off"); + + static struct regulator *ts_vdd = NULL; + + if (ts_vdd == NULL) { + ts_vdd = regulator_get(NULL, ist_vdd_name); + + if (IS_ERR(ts_vdd)) { + pr_err("Get regulator of TSP error!\n"); + return; + } + } + + if (en) { + ret = regulator_set_voltage(ts_vdd, 3000000, 3000000); + regulator_enable(ts_vdd); + } + else if (regulator_is_enabled(ts_vdd)) { + regulator_disable(ts_vdd); + } +} + +int ist30xx_power_on(bool download) +{ + if (ts_data->status.power != 1) { + tsp_info("%s()\n", __func__); + ist30xx_tracking(TRACK_PWR_ON); + /* VDD enable */ + msleep(5); + /* VDDIO enable */ + ts_power_enable(1); + if (download) + msleep(8); + else + msleep(100); + ts_data->status.power = 1; + } + + return 0; +} + + +int ist30xx_power_off(void) +{ + if (ts_data->status.power != 0) { + tsp_info("%s()\n", __func__); + ist30xx_tracking(TRACK_PWR_OFF); + /* VDDIO disable */ + msleep(5); + /* VDD disable */ + ts_power_enable(0); + msleep(50); + ts_data->status.power = 0; + ts_data->status.noise_mode = false; + } + + return 0; +} + + +int ist30xx_reset(bool download) +{ + tsp_info("%s()\n", __func__); + ist30xx_power_off(); + msleep(10); + ist30xx_power_on(download); + + return 0; +} + + +int ist30xx_internal_suspend(struct ist30xx_data *data) +{ + ist30xx_power_off(); + return 0; +} + + +int ist30xx_internal_resume(struct ist30xx_data *data) +{ + ist30xx_power_on(false); + + return 0; +} + + +int ist30xx_init_system(void) +{ + int ret; + + // TODO : place additional code here. + ret = ist30xx_power_on(false); + if (ret) { + tsp_err("%s: ist30xx_init_system failed (%d)\n", __func__, ret); + return -EIO; + } + +#if 1 + ret = ist30xx_reset(false); + if (ret) { + tsp_err("%s: ist30xx_reset failed (%d)\n", __func__, ret); + return -EIO; + } +#endif + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_tracking.c b/drivers/input/touchscreen/ist30xxa/ist30xx_tracking.c new file mode 100644 index 00000000..543bed88 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_tracking.c @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_misc.h" +#include "ist30xx_tracking.h" + + +IST30XX_RING_BUF TrackBuf; +IST30XX_RING_BUF *pTrackBuf; + +bool tracking_initialize = false; + +void ist30xx_tracking_init(void) +{ + if (tracking_initialize) + return; + + pTrackBuf = &TrackBuf; + + pTrackBuf->RingBufCtr = 0; + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->RingBufOutIdx = 0; + + tracking_initialize = true; +} + +void ist30xx_tracking_deinit(void) +{ +} + +static spinlock_t mr_lock = __SPIN_LOCK_UNLOCKED(); +int ist30xx_get_track(u32 *track, int cnt) +{ + int i; + u8 *buf = (u8 *)track; + unsigned long flags; + + + cnt *= sizeof(track[0]); + + spin_lock_irqsave(&mr_lock, flags); + + if (pTrackBuf->RingBufCtr < (u16)cnt) { + spin_unlock_irqrestore(&mr_lock, flags); + return IST30XX_RINGBUF_NOT_ENOUGH; + } + + for (i = 0; i < cnt; i++) { + if (pTrackBuf->RingBufOutIdx == IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufOutIdx = 0; + + *buf++ = (u8)pTrackBuf->LogBuf[pTrackBuf->RingBufOutIdx++]; + pTrackBuf->RingBufCtr--; + } + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +u32 ist30xx_get_track_cnt(void) +{ + return pTrackBuf->RingBufCtr; +} + +#if IST30XX_TRACKING_MODE +int ist30xx_put_track(u32 *track, int cnt) +{ + int i; + u8 *buf = (u8 *)track; + unsigned long flags; + + spin_lock_irqsave(&mr_lock, flags); + + cnt *= sizeof(track[0]); + + pTrackBuf->RingBufCtr += cnt; + if (pTrackBuf->RingBufCtr > IST30XX_MAX_LOG_SIZE) { + pTrackBuf->RingBufOutIdx += + (pTrackBuf->RingBufCtr - IST30XX_MAX_LOG_SIZE); + if (pTrackBuf->RingBufOutIdx >= IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufOutIdx -= IST30XX_MAX_LOG_SIZE; + + pTrackBuf->RingBufCtr = IST30XX_MAX_LOG_SIZE; + } + + for (i = 0; i < cnt; i++) { + if (pTrackBuf->RingBufInIdx == IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->LogBuf[pTrackBuf->RingBufInIdx++] = *buf++; + } + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +int ist30xx_put_track_ms(u32 ms) +{ + ms &= 0x0000FFFF; + ms |= IST30XX_TRACKING_MAGIC; + + return ist30xx_put_track(&ms, 1); +} + +static struct timespec t_track; +int ist30xx_tracking(u32 status) +{ + u32 ms; + + if (!tracking_initialize) + ist30xx_tracking_init(); + + ktime_get_ts(&t_track); + ms = t_track.tv_sec * 1000 + t_track.tv_nsec / 1000000; + + ist30xx_put_track_ms(ms); + ist30xx_put_track(&status, 1); + + return 0; +} +#else +int ist30xx_put_track(u32 *track, int cnt) +{ + return 0; +} +int ist30xx_put_track_ms(u32 ms) +{ + return 0; +} +int ist30xx_tracking(u32 status) +{ + return 0; +} +#endif // IST30XX_TRACKING_MODE + +#define MAX_TRACKING_COUNT (1024) +struct timespec t_curr; // ns + +/* sysfs: /sys/class/touch/tracking/track_frame */ +ssize_t ist30xx_track_frame_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, buf_cnt = 0; + u32 track_cnt = MAX_TRACKING_COUNT; + u32 track; + char msg[10]; + + mutex_lock(&ist30xx_mutex); + + buf[0] = '\0'; + + if (track_cnt > ist30xx_get_track_cnt()) + track_cnt = ist30xx_get_track_cnt(); + + track_cnt /= sizeof(track); + + tsp_verb("num: %d of %d\n", track_cnt, ist30xx_get_track_cnt()); + + for (i = 0; i < track_cnt; i++) { + ist30xx_get_track(&track, 1); + + tsp_verb("%08X\n", track); + + buf_cnt += sprintf(msg, "%08x", track); + strcat(buf, msg); + } + + mutex_unlock(&ist30xx_mutex); + + return buf_cnt; +} + +/* sysfs: /sys/class/touch/tracking/track_cnt */ +ssize_t ist30xx_track_cnt_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 val = (u32)ist30xx_get_track_cnt(); + + tsp_verb("tracking cnt: %d\n", val); + + return sprintf(buf, "%08x", val); +} + + +/* sysfs */ +static DEVICE_ATTR(track_frame, S_IRWXUGO, ist30xx_track_frame_show, NULL); +static DEVICE_ATTR(track_cnt, S_IRWXUGO, ist30xx_track_cnt_show, NULL); + +static struct attribute *tracking_attributes[] = { + &dev_attr_track_frame.attr, + &dev_attr_track_cnt.attr, + NULL, +}; + +static struct attribute_group tracking_attr_group = { + .attrs = tracking_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_tracking_dev; + +int ist30xx_init_tracking_sysfs(void) +{ + /* /sys/class/touch/tracking */ + ist30xx_tracking_dev = device_create(ist30xx_class, NULL, 0, NULL, + "tracking"); + + /* /sys/class/touch/tracking/... */ + if (sysfs_create_group(&ist30xx_tracking_dev->kobj, &tracking_attr_group)) + tsp_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tracking"); + + ist30xx_tracking_init(); + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_tracking.h b/drivers/input/touchscreen/ist30xxa/ist30xx_tracking.h new file mode 100644 index 00000000..a53175e2 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_tracking.h @@ -0,0 +1,57 @@ +#ifndef __IST30XX_TRACKING_H__ +#define __IST30XX_TRACKING_H__ + + +#define IST30XX_RINGBUF_NO_ERR (0) +#define IST30XX_RINGBUF_NOT_ENOUGH (1) +#define IST30XX_RINGBUF_EMPTY (2) +#define IST30XX_RINGBUF_FULL (3) +#define IST30XX_RINGBUF_TIMEOUT (4) +#define IST30XX_MAX_LOG_SIZE (4 * 100 * 1024) // 4bytes * 100Kbytes, Single touch: about 12minutes + +#define TRACK_PWR_ON (0x1) +#define TRACK_PWR_OFF (0x2) +#define TRACK_PWR_RESET (0x3) +#define TRACK_INTR_ENABLE (0x4) +#define TRACK_INTR_DISABLE (0x5) +#define TRACK_CMD_RUN_DEVICE (0x10) +#define TRACK_CMD_SCAN (0x11) +#define TRACK_CMD_TACON (0x12) +#define TRACK_CMD_TADISCON (0x13) +#define TRACK_CMD_FWUPDATE (0x14) +#define TRACK_CMD_PRUPDATE (0x15) +#define TRACK_CMD_CALIB (0x16) +#define TRACK_CMD_CHECK_CALIB (0x17) +#define TRACK_CMD_CHKSUM (0x18) +#define TRACK_CMD_CHKSUM_ALL (0x19) +#define TRACK_CMD_ENTER_REG (0x1A) +#define TRACK_CMD_EXIT_REG (0x1B) +#define TRACK_POS_FINGER (0x20) +#define TRACK_POS_KEY (0x30) +#define TRACK_POS_UNKNOWN (0x3F) + +#define IST30XX_TRACKING_MAGIC (0x7750 << 16) + + +typedef struct _IST30XX_RINGBUF { + u32 RingBufCtr; // Number of characters in the ring buffer + u32 RingBufInIdx; + u32 RingBufOutIdx; + u8 LogBuf[IST30XX_MAX_LOG_SIZE]; // Ring buffer for status +} IST30XX_RING_BUF; + + +void ist30xx_tracking_init(void); +void ist30xx_tracking_deinit(void); + +int ist30xx_get_track(u32 *track, int cnt); +int ist30xx_put_track(u32 *track, int cnt); +int ist30xx_put_track_ms(u32 ms); + +u32 ist30xx_get_track_cnt(void); + +int ist30xx_tracking(u32 status); + +int ist30xx_init_tracking_sysfs(void); + +#endif // __IST30XX_TRACKING_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_tsp.h b/drivers/input/touchscreen/ist30xxa/ist30xx_tsp.h new file mode 100644 index 00000000..c6f2149b --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_tsp.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_TSP_H__ +#define __IST30XX_TSP_H__ + +#define IST30XX_DD_VERSION (5) + +#define IST30XX_MULTIPLE_TSP (0) + +#define TSP_CHIP_VENDOR ("IMAGIS") +#define TSP_CHIP_NAME ("IST3038") + +#define FLAG_NODE_Y (0) +#define FLAG_NODE_X (1) + +#define NODE_TX_NUM (21) +#define NODE_RX_NUM (14) +#define NODE_TOTAL_NUM (NODE_TX_NUM * NODE_RX_NUM) + +#define TSP_TX_NUM (21) +#define TSP_RX_NUM (13) +#define TSP_TOTAL_NUM (TSP_TX_NUM * TSP_RX_NUM) + +#define TSP_TYPE_UNKNOWN (0xF0) +#define TSP_TYPE_ALPS (0xF) +#define TSP_TYPE_EELY (0xE) +#define TSP_TYPE_TOP (0xD) +#define TSP_TYPE_MELFAS (0xC) +#define TSP_TYPE_ILJIN (0xB) +#define TSP_TYPE_SYNOPEX (0xA) +#define TSP_TYPE_SMAC (0x9) +#define TSP_TYPE_TAEYANG (0x8) +#define TSP_TYPE_TOVIS (0x7) +#define TSP_TYPE_ELK (0x6) +#define TSP_TYPE_OTHERS (0x5) + +#define IST30XXB_PARSE_TSPTYPE(n) ((n >> 1) & 0xF) + +#endif // __IST30XX_TSP_H__ diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_update.c b/drivers/input/touchscreen/ist30xxa/ist30xx_update.c new file mode 100644 index 00000000..ec36fb3a --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_update.c @@ -0,0 +1,1349 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xx.h" +#include "ist30xx_update.h" +#include "ist30xx_tracking.h" + +#if IST30XX_DEBUG +#include "ist30xx_misc.h" +#endif + +#if IST30XX_INTERNAL_BIN +#include "./firmware/core_prime.h" +#if IST30XX_MULTIPLE_TSP +//#include "./firmware/core_prime.h" +#endif +#endif // IST30XX_INTERNAL_BIN + +struct ist30xx_tags *ts_tags; + +u32 ist30xx_fw_ver = 0; +u32 ist30xx_param_ver = 0; +u32 ist30xx_sub_ver = 0; + +extern struct ist30xx_data *ts_data; + +extern void ist30xx_disable_irq(struct ist30xx_data *data); +extern void ist30xx_enable_irq(struct ist30xx_data *data); + +int ist30xx_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + int msg_num, u8 *cmd_buf) +{ + int ret = 0; + int idx = msg_num - 1; + int size = msgs[idx].len; + u8 *msg_buf = NULL; + u8 *pbuf = NULL; + int trans_size, max_size = 0; + + if (msg_num == WRITE_CMD_MSG_LEN) + max_size = I2C_MAX_WRITE_SIZE; + else if (msg_num == READ_CMD_MSG_LEN) + max_size = I2C_MAX_READ_SIZE; + + if (unlikely(max_size == 0)) { + tsp_err("%s() : transaction size(%d)\n", __func__, max_size); + return -EINVAL; + } + + if (msg_num == WRITE_CMD_MSG_LEN) { + msg_buf = kmalloc(max_size + IST30XX_ADDR_LEN, GFP_KERNEL); + if (!msg_buf) + return -ENOMEM; + memcpy(msg_buf, cmd_buf, IST30XX_ADDR_LEN); + pbuf = msgs[idx].buf; + } + + while (size > 0) { + trans_size = (size >= max_size ? max_size : size); + + msgs[idx].len = trans_size; + if (msg_num == WRITE_CMD_MSG_LEN) { + memcpy(&msg_buf[IST30XX_ADDR_LEN], pbuf, trans_size); + msgs[idx].buf = msg_buf; + msgs[idx].len += IST30XX_ADDR_LEN; + } + ret = i2c_transfer(adap, msgs, msg_num); + if (unlikely(ret != msg_num)) { + tsp_err("%s() : i2c_transfer failed(%d), num=%d\n", + __func__, ret, msg_num); + break; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + pbuf += trans_size; + else + msgs[idx].buf += trans_size; + + size -= trans_size; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + kfree(msg_buf); + + return ret; +} + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int ret, i; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len * IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = ist30xx_i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN, NULL); + if (unlikely(ret != READ_CMD_MSG_LEN)) + return -EIO; + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int i; + int ret; + struct i2c_msg msg; + u8 cmd_buf[IST30XX_ADDR_LEN]; + u8 msg_buf[IST30XX_DATA_LEN * (len + 1)]; + + put_unaligned_be32(cmd, cmd_buf); + + if (likely(len > 0)) { + for (i = 0; i < len; i++) + put_unaligned_be32(buf[i], msg_buf + (i * IST30XX_DATA_LEN)); + } else { + /* then add dummy data(4byte) */ + put_unaligned_be32(0, msg_buf); + len = 1; + } + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_DATA_LEN * len; + msg.buf = msg_buf; + + ret = ist30xx_i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN, + cmd_buf); + if (unlikely(ret != WRITE_CMD_MSG_LEN)) + return -EIO; + + return 0; +} + +int ist30xxb_burst_read(struct i2c_client *client, u32 addr, + u32 *buf32, int len) +{ + int ret = 0; + int i; + int max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + + addr |= IST30XXB_BURST_ACCESS; + + for (i = 0; i < len; i += max_len) { + if (len < max_len) max_len = len; + + ret = ist30xx_read_buf(client, addr, buf32, max_len); + if (unlikely(ret)) { + tsp_err("Burst fail, addr: %x\n", __func__, addr); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + } + + return 0; +} + +#define IST30XXB_ISP_READ (1) +#define IST30XXB_ISP_WRITE (2) +#define IST30XXB_ISP_ERASE_ALL (3) +#define IST30XXB_ISP_ERASE_PAGE (4) + +int ist30xxb_isp_reset(void) +{ + int ret = 0; + +#if (IMAGIS_TSP_IC == IMAGIS_IST3038) + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPMODE, 0x180); + if (unlikely(ret)) + return ret; +#else + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPPWRCTRL, 0xB200); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPPWRCTRL, 0x9200); + if (unlikely(ret)) + return ret; +#endif + msleep(1); + + return ret; +} + +int ist30xxb_isp_enable(bool enable) +{ + int ret = 0; + + if (enable) { + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPISPEN, 0x1); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_LDOOSC, 0x74C8); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_CLKDIV, 0x3); + if (unlikely(ret)) + return ret; + +#if (IMAGIS_TSP_IC != IMAGIS_IST3038) + ret = ist30xx_write_cmd(ts_data->client, + IST30XXB_REG_PADCTRL, 0x03300000); + if (unlikely(ret)) + return ret; +#endif + + msleep(10); + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_WDTCON, 0x0); + if (unlikely(ret)) + return ret; + } else { + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPISPEN, 0x0); + if (unlikely(ret)) + return ret; + + msleep(1); + } + + return 0; +} + +int ist30xxb_isp_mode(int mode) +{ + int ret = 0; + u32 val = 0; + + switch (mode) { + case IST30XXB_ISP_READ: + val = 0x1C0; + break; + case IST30XXB_ISP_WRITE: + val = 0x1A8; + break; + case IST30XXB_ISP_ERASE_ALL: + val = 0x1A7; + break; + case IST30XXB_ISP_ERASE_PAGE: + val = 0x1A3; + break; + default: + tsp_err("ISP fail, unknown mode\n"); + return -EINVAL; + } + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPMODE, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPMODE\n"); + return ret; + } + + return 0; +} + +int ist30xxb_isp_erase(struct i2c_client *client, int mode, u32 addr) +{ + int ret = 0; + u32 val = 0x1A0; + u8 buf[EEPROM_PAGE_SIZE] = { 0, }; + + ret = ist30xxb_isp_mode(mode); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + val = (EEPROM_PAGE_SIZE / IST30XX_DATA_LEN); + ret = ist30xx_write_buf(client, IST30XXB_REG_EEPWDAT, (u32 *)buf, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + msleep(30); + + ist30xxb_isp_reset(); + + return 0; +} + +int ist30xxb_isp_write(struct i2c_client *client, u32 addr, + const u32 *buf32, int len) +{ + int ret = 0; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + ret = ist30xx_write_buf(client, IST30XXB_REG_EEPWDAT, (u32 *)buf32, len); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + return 0; +} + +int ist30xxb_isp_read(struct i2c_client *client, u32 addr, + u32 *buf32, int len) +{ + int ret = 0; + int i; + int max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + + for (i = 0; i < len; i += max_len) { + if (len < max_len) max_len = len; + + /* IST30xxB ISP read mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_READ); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + ret = ist30xx_read_buf(client, IST30XXB_REG_EEPRDAT, buf32, max_len); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + } + + return 0; +} + +int ist30xxb_cmd_read_chksum(struct i2c_client *client, + u32 start_addr, u32 end_addr, u32 *chksum) +{ + int ret = 0; + u32 val = (1 << 31); // Chkecksum enable + + val |= start_addr; + val |= (end_addr / IST30XX_DATA_LEN - 1) << 16; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_CHKSMOD, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_CHKSMOD (%x)\n", val); + return ret; + } + msleep(10); + + ret = ist30xx_read_cmd(client, IST30XXB_REG_CHKSDAT, chksum); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XXB_REG_CHKSDAT (%x)\n", chksum); + return ret; + } + + return 0; +} + +int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum) +{ + int ret = 0; + u32 start_addr, end_addr; + u32 chksum1 = 0, chksum2 = 0; + + start_addr = 0; + end_addr = ts_data->tags.fw_addr + ts_data->tags.fw_size; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, &chksum1); + if (unlikely(ret)) + return ret; + + start_addr = ts_data->tags.cfg_addr; + end_addr = ts_data->tags.sensor3_addr + ts_data->tags.sensor3_size; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, &chksum2); + if (unlikely(ret)) + return ret; + + *chksum = chksum1 | (chksum2 << 16); + + tsp_info("chksum: %x(%x~%x, %x~%x)\n", *chksum, + 0, ts_data->tags.fw_addr + ts_data->tags.fw_size, + start_addr, end_addr); + + return 0; +} + +int ist30xxb_read_chksum_all(struct i2c_client *client, u32 *chksum) +{ + int ret = 0; + u32 start_addr, end_addr; + + start_addr = 0; + end_addr = IST30XX_EEPROM_SIZE; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, chksum); + if (unlikely(ret)) + return ret; + + tsp_info("chksum: %x(%x~%x)\n", *chksum, start_addr, end_addr); + + return 0; +} + +int ist30xxb_isp_fw_read(struct i2c_client *client, u32 *buf32) +{ + int ret = 0; + int i; + + u16 addr = EEPROM_BASE_ADDR; + int len = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + ist30xx_reset(true); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (unlikely(ret)) + return ret; + + for (i = 0; i < IST30XX_EEPROM_SIZE; i += EEPROM_PAGE_SIZE) { + ret = ist30xxb_isp_read(client, addr, buf32, len); + if (unlikely(ret)) + goto isp_fw_read_end; + + addr += EEPROM_PAGE_SIZE; + buf32 += len; + } + +isp_fw_read_end: + /* IST30xxB ISP disable */ + ist30xxb_isp_enable(false); + return ret; +} + +int ist30xxb_isp_fw_update(struct i2c_client *client, const u8 *buf, + u32 *chksum) +{ + int ret = 0; + int i; + u32 page_cnt = IST30XX_EEPROM_SIZE / EEPROM_PAGE_SIZE; + u16 addr = EEPROM_BASE_ADDR; + int len = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + ist30xx_tracking(TRACK_CMD_FWUPDATE); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (unlikely(ret)) + goto isp_fw_update_end; + + /* IST30xxB ISP erase */ + ret = ist30xxb_isp_erase(client, IST30XXB_ISP_ERASE_ALL, 0); + if (unlikely(ret)) + goto isp_fw_update_end; + +#if (IMAGIS_TSP_IC == IMAGIS_IST3038) + /* IST30xxB ISP read all checksum */ + ret = ist30xxb_read_chksum_all(client, chksum); + if (unlikely(ret)) + goto isp_fw_update_end; + + /* IST30xxB compare checksum */ + if (unlikely(*chksum != 0)) + goto isp_fw_update_end; +#endif + + /* IST30xxB power reset */ + ist30xx_reset(true); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (unlikely(ret)) + goto isp_fw_update_end; + + for (i = 0; i < page_cnt; i++) { + /* IST30xxB ISP write mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_WRITE); + if (unlikely(ret)) + goto isp_fw_update_end; + + ret = ist30xxb_isp_write(client, addr, (u32 *)buf, len); + if (unlikely(ret)) + goto isp_fw_update_end; + + addr += EEPROM_PAGE_SIZE; + buf += EEPROM_PAGE_SIZE; + + msleep(5); + + ist30xxb_isp_reset(); + } + +#if (IMAGIS_TSP_IC == IMAGIS_IST3038) + ist30xxb_read_chksum_all(client, chksum); +#endif + +isp_fw_update_end: + /* IST30xxB ISP disable */ + ist30xxb_isp_enable(false); + return ret; +} + +int ist30xx_fw_write(struct i2c_client *client, const u8 *buf) +{ + int ret; + int len; + u32 *buf32 = (u32 *)(buf + ts_data->fw.index); + u32 size = ts_data->fw.size; + + if (unlikely((size <= 0) || (size > IST30XX_EEPROM_SIZE))) + return -ENOEXEC; + + while (size > 0) { + len = (size >= EEPROM_PAGE_SIZE ? EEPROM_PAGE_SIZE : size); + + ret = ist30xx_write_buf(client, CMD_ENTER_FW_UPDATE, buf32, (len >> 2)); + if (unlikely(ret)) + return ret; + + buf32 += (len >> 2); + size -= len; + + msleep(5); + } + return 0; +} + + +u32 ist30xx_parse_ver(int flag, const u8 *buf) +{ + u32 ver = 0; + u32 *buf32 = (u32 *)buf; + + if (flag == FLAG_FW) + ver = (u32)buf32[(ts_data->tags.flag_addr + 60) >> 2]; + else if (flag == FLAG_SUB) + ver = (u32)buf32[(ts_data->tags.flag_addr + 52) >> 2]; + else if (flag == FLAG_PARAM) + ver = (u32)(buf32[(ts_data->tags.cfg_addr + 4) >> 2] & 0xFFFF); + else + tsp_warn("Parsing ver's flag is not corrent!\n"); + + return ver; +} + + +int calib_ms_delay = WAIT_CALIB_CNT; +int ist30xx_calib_wait(void) +{ + int cnt = calib_ms_delay; + + ts_data->status.calib_msg = 0; + while (cnt-- > 0) { + msleep(100); + + if (ts_data->status.calib_msg) { + tsp_info("Calibration status : %d, Max raw gap : %d - (%08x)\n", + CALIB_TO_STATUS(ts_data->status.calib_msg), + CALIB_TO_GAP(ts_data->status.calib_msg), + ts_data->status.calib_msg); + + if (CALIB_TO_OS_VALUE(ts_data->status.calib_msg) == 0xFFFF) + return 1; + else if (CALIB_TO_STATUS(ts_data->status.calib_msg) == 0) + return 0; // Calibrate success + else + return -EAGAIN; + } + } + tsp_warn("Calibration time out\n"); + + return -EPERM; +} + +int ist30xx_calibrate(int wait_cnt) +{ + int ret = -ENOEXEC; + + tsp_info("*** Calibrate %ds ***\n", calib_ms_delay / 10); + + ts_data->status.update = 1; + while (wait_cnt--) { + ist30xx_disable_irq(ts_data); + ist30xx_reset(false); + + ret = ist30xx_cmd_calibrate(ts_data->client); + if (unlikely(ret)) + continue; + + ist30xx_enable_irq(ts_data); + ret = ist30xx_calib_wait(); + if (likely(!ret)) + break; + } + + ist30xx_disable_irq(ts_data); + + ist30xx_reset(false); + + ts_data->status.update = 2; + + ist30xx_enable_irq(ts_data); + + return ret; +} + + +int ist30xx_parse_tags(struct ist30xx_data *data, const u8 *buf, const u32 size) +{ + int ret = -EPERM; + + ts_tags = (struct ist30xx_tags *)(&buf[size - sizeof(struct ist30xx_tags)]); + + if (!strncmp(ts_tags->magic1, IST30XX_TAG_MAGIC, sizeof(ts_tags->magic1)) + && !strncmp(ts_tags->magic2, IST30XX_TAG_MAGIC, sizeof(ts_tags->magic2)) + ) { + data->fw.index = ts_tags->fw_addr; + data->fw.size = ts_tags->flag_addr - ts_tags->fw_addr + + ts_tags->flag_size; + data->fw.chksum = ts_tags->chksum; + data->tags = *ts_tags; + + ret = 0; + } + + tsp_verb("Tagts magic1: %s, magic2: %s\n", + ts_tags->magic1, ts_tags->magic2); + tsp_verb(" fw: %x(%x)\n", ts_tags->fw_addr, ts_tags->fw_size); + tsp_verb(" flag: %x(%x)\n", ts_tags->flag_addr, ts_tags->flag_size); + tsp_verb(" cfg: %x(%x)\n", ts_tags->cfg_addr, ts_tags->cfg_size); + tsp_verb(" sensor1: %x(%x)\n", ts_tags->sensor1_addr, + ts_tags->sensor1_size); + tsp_verb(" sensor2: %x(%x)\n", ts_tags->sensor2_addr, + ts_tags->sensor2_size); + tsp_verb(" sensor3: %x(%x)\n", ts_tags->sensor3_addr, + ts_tags->sensor3_size); + tsp_verb(" chksum: %x\n", ts_tags->chksum); + tsp_verb(" build time : %04d/%02d/%02d (%02d:%02d:%02d)\n", + ts_tags->year, ts_tags->month, ts_tags->day, + ts_tags->hour, ts_tags->min, ts_tags->sec); + + return ret; +} + +void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, + const u32 size) +{ + int ret; + + ret = ist30xx_parse_tags(data, buf, size); + if (unlikely(ret != TAGS_PARSE_OK)) + tsp_warn("Cannot find tags of F/W, make a tags by 'tagts.exe'\n"); +} + +#if (IST30XX_DEBUG) && (IST30XX_INTERNAL_BIN) +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; +int ist30xx_get_tkey_info(struct ist30xx_data *data) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + u8 *cfg_buf; + + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + + tkey->enable = (bool)(cfg_buf[0x321] & 1); + tkey->axis_rx = (bool)((cfg_buf[0x321] >> 1) & 1); + tkey->key_num = (u8)cfg_buf[0x322]; + tkey->baseline = (u16)((cfg_buf[0x324] << 8) | cfg_buf[0x323]); + tkey->ch_num[0] = (u8)cfg_buf[0x326]; + tkey->ch_num[1] = (u8)cfg_buf[0x327]; + tkey->ch_num[2] = (u8)cfg_buf[0x328]; + tkey->ch_num[3] = (u8)cfg_buf[0x329]; + tkey->ch_num[4] = (u8)cfg_buf[0x32A]; + + if (tkey->axis_rx) { + if (tsp->dir.swap_xy) + tsp->height -= 1; + else + tsp->width -= 1; + } else { + if (tsp->dir.swap_xy) + tsp->width -= 1; + else + tsp->height -= 1; + } + + return ret; +} + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +int ist30xx_get_tsp_info(struct ist30xx_data *data) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 *cfg_buf, *sensor_buf; + + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + sensor_buf = (u8 *)&data->fw.buf[data->tags.sensor1_addr]; + + tsp->finger_num = (u8)cfg_buf[0x304]; + tsp->dir.swap_xy = (bool)(cfg_buf[0x305] & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (bool)(cfg_buf[0x305] & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (bool)(cfg_buf[0x305] & TSP_INFO_FLIP_Y ? true : false); + tsp->baseline = (u16)((cfg_buf[0x319] << 8) | cfg_buf[0x318]); + + tsp->ch_num.tx = (u8)sensor_buf[0x40]; + tsp->ch_num.rx = (u8)sensor_buf[0x41]; + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + tsp->height = (tsp->dir.swap_xy ? tsp->ch_num.rx : tsp->ch_num.tx); + tsp->width = (tsp->dir.swap_xy ? tsp->ch_num.tx : tsp->ch_num.rx); + + return ret; +} +#endif // (IST30XX_DEBUG) && (IST30XX_INTERNAL_BIN) + + +#define update_next_step(ret) { if (unlikely(ret)) goto end; } +int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, + bool mode) +{ + int ret = 0; + u32 chksum = 0; + struct ist30xx_fw *fw = &ts_data->fw; + + tsp_info("*** Firmware update ***\n"); + tsp_info(" core: %x, param: %x, sub: %x (addr: 0x%x ~ 0x%x)\n", + ist30xx_fw_ver, ist30xx_param_ver, ist30xx_sub_ver, + fw->index, (fw->index + fw->size)); + + ts_data->status.update = 1; + + ist30xx_disable_irq(ts_data); + + ist30xx_reset(true); + + if (mode) { /* ISP Mode */ + ret = ist30xxb_isp_fw_update(client, buf, &chksum); + update_next_step(ret); + } else { /* I2C SW Mode */ + ret = ist30xx_cmd_update(client, CMD_ENTER_FW_UPDATE); + update_next_step(ret); + + ret = ist30xx_fw_write(client, buf); + update_next_step(ret); + } + msleep(50); + + buf += IST30XX_EEPROM_SIZE; + size -= IST30XX_EEPROM_SIZE; + + ist30xx_reset(false); + + ret = ist30xx_read_cmd(client, CMD_GET_CHECKSUM, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) + goto end; + + ret = ist30xx_get_ver_info(ts_data); + update_next_step(ret); + +end: + if (unlikely(ret)) { + tsp_warn("Firmware update Fail!, ret=%d\n", ret); + } else if (unlikely(chksum != fw->chksum)) { + tsp_warn("Error CheckSum: %x(%x)\n", chksum, fw->chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + + ts_data->status.update = 2; + + return ret; +} + +int ist30xx_fw_recovery(struct ist30xx_data *data) +{ + int ret = -EPERM; + u8 *fw = data->fw.buf; + int fw_size = data->fw.buf_size; + + ist30xx_get_update_info(data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_fw_update(data->client, fw, fw_size, true); + ist30xx_calibrate(1); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(data); + + return ret; +} + +#if IST30XX_INTERNAL_BIN +int ist30xx_check_fw(struct ist30xx_data *data, const u8 *buf) +{ + int ret; + u32 chksum; + + ret = ist30xx_read_cmd(data->client, CMD_GET_CHECKSUM, &chksum); + if (unlikely(ret)) + return ret; + + if (unlikely(chksum != data->fw.chksum)) { + tsp_warn("Checksum compare error, (IC: %08x, Bin: %08x)\n", + chksum, data->fw.chksum); + return -EPERM; + } + + return 0; +} + +bool ist30xx_check_valid_vendor(u32 tsp_vendor) +{ + switch (tsp_vendor) { + case TSP_TYPE_ALPS: + case TSP_TYPE_EELY: + case TSP_TYPE_TOP: + case TSP_TYPE_MELFAS: + case TSP_TYPE_ILJIN: + case TSP_TYPE_SYNOPEX: + case TSP_TYPE_SMAC: + case TSP_TYPE_TAEYANG: + case TSP_TYPE_TOVIS: + case TSP_TYPE_ELK: + case TSP_TYPE_OTHERS: + return true; + default: + return false; + } + + return false; +} + +#if IST30XX_MULTIPLE_TSP +void ist30xx_set_tsp_fw(struct ist30xx_data *data) +{ + char *str; + struct ist30xx_fw *fw = &data->fw; + + switch (data->tsp_type) { + case TSP_TYPE_ALPS: + case TSP_TYPE_ILJIN: + str = "ALPS/ILJIN"; + fw->buf = (u8 *)ist30xxb_fw; + fw->buf_size = sizeof(ist30xxb_fw); + break; + case TSP_TYPE_EELY: + str = "EELY"; + fw->buf = (u8 *)ist30xxb_fw2; + fw->buf_size = sizeof(ist30xxb_fw2); + break; + + case TSP_TYPE_UNKNOWN: + default: + str = "Unknown"; + tsp_warn("Unknown TSP vendor(0x%x)\n", data->tsp_type); + break; + } + tsp_info("TSP vendor : %s(%x)\n", str, data->tsp_type); + + ist30xx_get_update_info(ts_data, fw->buf, fw->buf_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw->buf); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw->buf); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw->buf); +} +#endif // IST30XX_MULTIPLE_TSP + +int ist30xx_check_auto_update(struct ist30xx_data *data) +{ + int ret = 0; + int retry = IST30XX_FW_UPDATE_RETRY; + u32 tsp_type = TSP_TYPE_UNKNOWN; + u32 chksum; + bool tsp_check = false; + struct ist30xx_fw *fw = &data->fw; + + while (retry--) { + ret = ist30xx_read_cmd(data->client, + CMD_GET_TSP_PANNEL_TYPE, &tsp_type); + if (likely(ret == 0)) { + if (likely(ist30xx_check_valid_vendor(tsp_type) == true)) + tsp_check = true; + break; + } + } + + retry = IST30XX_FW_UPDATE_RETRY; + + if (unlikely(!tsp_check)) + goto fw_check_end; + + ist30xx_get_ver_info(data); + + if (likely((fw->param_ver > 0) && (fw->param_ver < 0xFFFFFFFF))) { + if (unlikely(((fw->core_ver & MASK_FW_VER) != IST30XX_FW_VER3) && + ((fw->core_ver & MASK_FW_VER) != IST30XX_FW_VER4) && + ((fw->core_ver & MASK_FW_VER) != IST30XX_FW_VER5))) + goto fw_check_end; + + tsp_info("Version compare IC: %x(%x), BIN: %x(%x)\n", + fw->param_ver, fw->core_ver, ist30xx_param_ver, ist30xx_fw_ver); + + /* If FW version is same, check FW checksum */ + if (likely((fw->core_ver == ist30xx_fw_ver) && + (fw->param_ver == ist30xx_param_ver) && + (fw->sub_ver == 0))) { + ret = ist30xx_read_cmd(data->client, CMD_GET_CHECKSUM, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) { + tsp_warn("Checksum error, IC: %x, Bin: %x (ret: %d)\n", + chksum, fw->chksum, ret); + goto fw_check_end; + } + } + + /* + * fw->core_ver : FW core version in TSP IC + * fw->param_ver : FW version if TSP IC + * ist30xx_fw_ver : FW core version in FW Binary + * ist30xx_fw_ver : FW version in FW Binary + */ + /* If the ver of binary is higher than ver of IC, FW update operate. */ + + if (likely((fw->core_ver >= ist30xx_fw_ver) && + (fw->param_ver >= ist30xx_param_ver))) + return 0; + } + +fw_check_end: + return -EAGAIN; +} + +int ist30xx_auto_bin_update(struct ist30xx_data *data) +{ + int ret = 0; + int retry = IST30XX_FW_UPDATE_RETRY; + struct ist30xx_fw *fw = &data->fw; + + fw->buf = (u8 *)ist30xxb_fw; + fw->buf_size = sizeof(ist30xxb_fw); + +#if IST30XX_MULTIPLE_TSP + ist30xx_set_tsp_fw(data); +#else + ist30xx_get_update_info(data, fw->buf, fw->buf_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw->buf); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw->buf); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw->buf); +#endif + + tsp_info("IC: %x, Binary ver core: %x, param: %x, sub: %x\n", + data->chip_id, ist30xx_fw_ver, ist30xx_param_ver, ist30xx_sub_ver); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_check_auto_update(data); + mutex_unlock(&ist30xx_mutex); + + if (likely(ret >= 0)) + return ret; + +update_bin: // TSP is not ready / FW update + tsp_info("Update version. param(core): %x(%x, %x) -> %x(%x, %x)\n", + fw->param_ver, fw->core_ver, fw->sub_ver, + ist30xx_param_ver, ist30xx_fw_ver, ist30xx_sub_ver); + + mutex_lock(&ist30xx_mutex); + while (retry--) { + ret = ist30xx_fw_update(data->client, fw->buf, fw->buf_size, true); + if (unlikely(!ret)) + break; + } + mutex_unlock(&ist30xx_mutex); + + if (unlikely(ret)) + return ret; + + if (unlikely(retry > 0 && ist30xx_check_fw(data, fw->buf))) + goto update_bin; + + ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY); + + return ret; +} +#endif // IST30XX_INTERNAL_BIN + +#define MAX_FILE_PATH 255 +/* sysfs: /sys/class/touch/firmware/firmware */ +ssize_t ist30xx_fw_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + int fw_size = 0; + u8 *fw = NULL; + const u8 *buff = 0; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FILE_PATH]; + const struct firmware *request_fw = NULL; + int mode = 0; + int calib = 1; + + sscanf(buf, "%d %d", &mode, &calib); + + switch (mode) { + case MASK_UPDATE_INTERNAL: +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + tsp_warn("Not support internal bin!!\n", ); + return size; +#endif + break; + + case MASK_UPDATE_FW: + ret = request_firmware(&request_fw, IST30XXB_FW_NAME, + &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + break; + + case MASK_UPDATE_SDCARD: + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/touch/firmware/%s", + IST30XXB_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + tsp_info("fail to alloc buffer\n"); + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_info("mismatch fw size\n"); + goto err_fw_size; + } + + fw = (u8 *)buff; + fw_size = (u32)fsize; + + filp_close(fp, current->files); + tsp_info("firmware is loaded!!\n"); + break; + + case MASK_UPDATE_ERASE: + tsp_info("EEPROM all erase!!\n"); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ist30xxb_isp_enable(true); + ist30xxb_isp_erase(ts_data->client, IST30XXB_ISP_ERASE_ALL, 0); + ist30xxb_isp_enable(false); + ist30xx_reset(false); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + + default: + return size; + } + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, fw, fw_size, true); + + if (calib) + ist30xx_calibrate(1); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + + if (request_fw != NULL) + release_firmware(request_fw); + + if (fp != NULL) { +err_fw_size: + kfree(buff); +err_alloc: + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + } + + return size; +} + +/* sysfs: /sys/class/touch/firmware/fw_sdcard */ +ssize_t ist30xx_fw_sdcard_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int fw_size = 0; + u8 *fw = NULL; + const u8 *buff = 0; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FILE_PATH]; + + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/touch/firmware/%s", + IST30XXB_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + tsp_info("fail to alloc buffer\n"); + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_info("mismatch fw size\n"); + goto err_fw_size; + } + + fw = (u8 *)buff; + fw_size = (u32)fsize; + + filp_close(fp, current->files); + tsp_info("firmware is loaded!!\n"); + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + ist30xx_sub_ver = ist30xx_parse_ver(FLAG_SUB, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, fw, fw_size, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + +err_fw_size: + if (buff) + kfree(buff); +err_alloc: + if (fp) + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + + return 0; +} + +/* sysfs: /sys/class/touch/firmware/firmware */ +ssize_t ist30xx_fw_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count; + + switch (ts_data->status.update) { + case 1: + count = sprintf(buf, "Downloading\n"); + break; + case 2: + count = sprintf(buf, "Update success, ver %x(%x) -> %x(%x, %x), " + "status : %d, gap : %d\n", + ts_data->fw.prev_param_ver, ts_data->fw.prev_core_ver, + ts_data->fw.param_ver, ts_data->fw.core_ver, + ts_data->fw.sub_ver, + CALIB_TO_STATUS(ts_data->status.calib_msg), + CALIB_TO_GAP(ts_data->status.calib_msg)); + break; + default: + count = sprintf(buf, "Pass\n"); + } + + return count; +} + +/* sysfs: /sys/class/touch/firmware/fw_read */ +u32 buf32_eeprom[IST30XX_EEPROM_SIZE / IST30XX_DATA_LEN]; +ssize_t ist30xx_fw_read_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i; + u8 *buf8 = (u8 *)buf32_eeprom;; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + + ist30xxb_isp_fw_read(ts_data->client, buf32_eeprom); + for (i = 0; i < IST30XX_EEPROM_SIZE; i += 16) { + tsp_debug("%07x: %02x%02x %02x%02x %02x%02x %02x%02x " + "%02x%02x %02x%02x %02x%02x %02x%02x\n", i, + buf8[i], buf8[i + 1], buf8[i + 2], buf8[i + 3], + buf8[i + 4], buf8[i + 5], buf8[i + 6], buf8[i + 7], + buf8[i + 8], buf8[i + 9], buf8[i + 10], buf8[i + 11], + buf8[i + 12], buf8[i + 13], buf8[i + 14], buf8[i + 15]); + } + + ist30xx_reset(false); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + + return 0; +} + +/* sysfs: /sys/class/touch/firmware/version */ +ssize_t ist30xx_fw_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count; + + count = sprintf(buf, "ID: %x, f/w core: %x, param: %x, sub: %x\n", + ts_data->chip_id, ts_data->fw.core_ver, + ts_data->fw.param_ver, ts_data->fw.sub_ver); + +#if IST30XX_INTERNAL_BIN + { + char msg[128]; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + + count += snprintf(msg, sizeof(msg), + " Header - f/w ver: %x, param: %x, sub: %x\r\n", + ist30xx_parse_ver(FLAG_FW, ts_data->fw.buf), + ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf), + ist30xx_parse_ver(FLAG_SUB, ts_data->fw.buf)); + strncat(buf, msg, sizeof(msg)); + } +#endif + + return count; +} + + +/* sysfs */ +static DEVICE_ATTR(fw_read, S_IRWXUGO, ist30xx_fw_read_show, NULL); +static DEVICE_ATTR(firmware, S_IRWXUGO, ist30xx_fw_status_show, + ist30xx_fw_store); +static DEVICE_ATTR(fw_sdcard, S_IRWXUGO, ist30xx_fw_sdcard_show, NULL); +static DEVICE_ATTR(version, S_IRWXUGO, ist30xx_fw_version_show, NULL); + +struct class *ist30xx_class; +struct device *ist30xx_fw_dev; + +static struct attribute *fw_attributes[] = { + &dev_attr_fw_read.attr, + &dev_attr_firmware.attr, + &dev_attr_fw_sdcard.attr, + &dev_attr_version.attr, + NULL, +}; + +static struct attribute_group fw_attr_group = { + .attrs = fw_attributes, +}; + +int ist30xx_init_update_sysfs(void) +{ + /* /sys/class/touch */ + ist30xx_class = class_create(THIS_MODULE, "touch"); + + /* /sys/class/touch/firmware */ + ist30xx_fw_dev = device_create(ist30xx_class, NULL, 0, NULL, "firmware"); + + /* /sys/class/touch/firmware/... */ + if (unlikely(sysfs_create_group(&ist30xx_fw_dev->kobj, &fw_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "firmware"); + + ts_data->status.update = 0; + ts_data->status.calib = 0; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxa/ist30xx_update.h b/drivers/input/touchscreen/ist30xxa/ist30xx_update.h new file mode 100644 index 00000000..fa432b7a --- /dev/null +++ b/drivers/input/touchscreen/ist30xxa/ist30xx_update.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_UPDATE_H__ +#define __IST30XX_UPDATE_H__ + +#include "ist30xx_tsp.h" + +#define IST30XX_INTERNAL_BIN (1) +#define IST30XX_CHECK_CALIB (0) + +#if IST30XX_INTERNAL_BIN +#define IST30XX_UPDATE_BY_WORKQUEUE (0) +#define IST30XX_UPDATE_DELAY (3 * HZ) +#endif // IST30XX_INTERNAL_BIN + +#if ((IMAGIS_TSP_IC == IMAGIS_IST30XX) || (IMAGIS_TSP_IC == IMAGIS_IST30XXB)) +#define IST30XX_EEPROM_SIZE (0x8000) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3038) +#define IST30XX_EEPROM_SIZE (0xA000) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3044) +#define IST30XX_EEPROM_SIZE (0x10000) +#endif +#define EEPROM_PAGE_SIZE (64) +#define EEPROM_BASE_ADDR (0) + +#define IST30XXB_ACCESS_ADDR (1 << 31) +#define IST30XXB_BURST_ACCESS (1 << 27) +#define IST30XXB_DA_ADDR(n) (n | IST30XXB_ACCESS_ADDR) + +#define IST30XXB_REG_TSPTYPE IST30XXB_DA_ADDR(0x40002010) + +#define IST30XXB_REG_WDTCON IST30XXB_DA_ADDR(0x40003000) +#define IST30XXB_REG_EEPMODE IST30XXB_DA_ADDR(0x40007000) +#define IST30XXB_REG_EEPADDR IST30XXB_DA_ADDR(0x40007004) +#define IST30XXB_REG_EEPWDAT IST30XXB_DA_ADDR(0x40007008) +#define IST30XXB_REG_EEPRDAT IST30XXB_DA_ADDR(0x4000700C) +#define IST30XXB_REG_EEPISPEN IST30XXB_DA_ADDR(0x40007010) +#define IST30XXB_REG_CHKSMOD IST30XXB_DA_ADDR(0x40007014) +#define IST30XXB_REG_EEPPWRCTRL IST30XXB_DA_ADDR(0x4000701C) +#define IST30XXB_REG_CHKSDAT IST30XXB_DA_ADDR(0x40007038) + +#define IST30XXB_REG_CHIPID IST30XXB_DA_ADDR(0x40000000) +#define IST30XXB_REG_PADCTRL IST30XXB_DA_ADDR(0x40000024) +#define IST30XXB_REG_LDOOSC IST30XXB_DA_ADDR(0x40000030) +#define IST30XXB_REG_CLKDIV IST30XXB_DA_ADDR(0x4000004C) + +#define IST30XXB_MEM_ADDR (0x20000000) +#define IST30XXB_MEM_ALGORITHM IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x34) +#define IST30XXB_MEM_CMD IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x3C) +#define IST30XXB_MEM_FINGERS IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x4) + +#define IST30XXB_MEM_COUNT IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x30) + +#if (IMAGIS_TSP_IC == IMAGIS_IST30XXB) +#define IST30XXB_MEM_KEYSENSITIVITY IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x5F0) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3038) +#define IST30XXB_MEM_KEYSENSITIVITY IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x40) +#else +#error "Unknown IMAGIS_TSP_IC" +#endif + +#define IST30XX_FW_NAME "ist30xx.fw" +#define IST30XXB_FW_NAME "ist30xxb.fw" +#define IST30XXB_CURVE_NAME "ist30xxb.cv" + +#define MASK_FW_VER (0xFFFF0000) +#define IST30XX_FW_VER1 (0x00010000) +#define IST30XX_FW_VER2 (0x00020000) +#define IST30XX_FW_VER3 (0x00030000) +#define IST30XX_FW_VER4 (0x00040000) +#define IST30XX_FW_VER5 (0x00050000) + +#define IST30XX_FW_UPDATE_RETRY (3) + +#define WAIT_CALIB_CNT (50) +#define CALIB_THRESHOLD (100) + +#define CALIB_TO_GAP(n) ((n >> 16) & 0xFFF) +#define CALIB_TO_STATUS(n) ((n >> 12) & 0xF) + +#define CALIB_TO_OS_VALUE(n) ((n >> 12) & 0xFFFF) + +#define MASK_UPDATE_INTERNAL (1) +#define MASK_UPDATE_FW (2) +#define MASK_UPDATE_SDCARD (3) +#define MASK_UPDATE_ERASE (4) + +#define CHKSUM_FW (1) +#define CHKSUM_ALL (2) + +#define FLAG_FW (1) +#define FLAG_PARAM (2) +#define FLAG_SUB (3) + +#define TAGS_PARSE_OK (0) + +/* I2C Transaction size */ +#define I2C_MAX_WRITE_SIZE (64) /* bytes */ +#define I2C_MAX_READ_SIZE (8) /* bytes */ + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); + +int ist30xxb_burst_read(struct i2c_client *client, u32 addr, u32 *buf32, int len); + +int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum); +int ist30xxb_read_chksum_all(struct i2c_client *client, u32 *chksum); + +void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, const u32 size); + +u32 ist30xx_parse_ver(int flag, const u8 *buf); + +int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, bool mode); +int ist30xx_fw_param_update(struct i2c_client *client, const u8 *buf); +int ist30xx_fw_recovery(struct ist30xx_data *data); + +int ist30xx_auto_fw_update(struct ist30xx_data *data); +int ist30xx_auto_param_update(struct ist30xx_data *data); +int ist30xx_auto_bin_update(struct ist30xx_data *data); + +int ist30xx_calibrate(int wait_cnt); +int ist30xx_calib_wait(void); + +int ist30xx_init_update_sysfs(void); + +#endif // __IST30XX_UPDATE_H__ diff --git a/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0003.h b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0003.h new file mode 100755 index 00000000..cccc59b4 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0003.h @@ -0,0 +1,2156 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: Corisica VE EELY, f/w 3( 30300) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x40,0x00,0x00,0x20,0x94,0x02,0x00,0x00,0xCC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x30,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x10,0xB4,0x2B,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x20,0x48,0x10,0xD1,0x91,0x06,0x0E,0xD1, + 0x0A,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xCE,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0B,0x48, + 0x0E,0xD1,0x89,0x06,0x0C,0xD1,0x08,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0xA5,0xFF,0x64,0x1E,0x60,0x1C,0xF3,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0x24,0xFE,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x2C,0x0B,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x2D,0xFD,0x07,0x00,0x03,0xF0,0x98,0xFC,0x03,0xF0,0x8A,0xFC, + 0x03,0xF0,0x10,0xFD,0x48,0x4A,0x49,0x49,0x49,0x48,0x04,0xF0,0x7E,0xFE,0x49,0x4D, + 0x00,0x26,0x01,0x21,0xC9,0x03,0x30,0x00,0xEE,0x81,0x00,0xF0,0xC7,0xF9,0xA8,0x61, + 0x45,0x49,0x00,0x20,0x00,0xF0,0xC2,0xF9,0x44,0x4B,0x45,0x49,0xD8,0x63,0x45,0x48, + 0x00,0xF0,0xBC,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0xD2,0xFC, + 0xA1,0x22,0x41,0x48,0xD2,0x00,0x00,0x21,0x04,0xF0,0x6A,0xFE,0x06,0xF0,0xA4,0xF9, + 0x03,0xF0,0x74,0xFD,0x3D,0x48,0x01,0x24,0x81,0x7A,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0xFF,0x20,0x91,0x30,0x6E,0x72,0x28,0x82,0xAE,0x72,0xEE,0x72, + 0x35,0x48,0x2E,0x73,0x64,0x07,0x6E,0x73,0x60,0x63,0xFF,0x20,0xE0,0x63,0xE0,0x14, + 0x00,0xF0,0xC2,0xFC,0x32,0x48,0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0xBC,0xFC, + 0x30,0x49,0x02,0x20,0x06,0xF0,0xAC,0xFC,0x02,0x20,0x06,0xF0,0xB1,0xFC,0x28,0x7A, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0x5E,0xFD,0x00,0x2F,0x1F,0xD1,0x2A,0x4F,0xBE,0x15, + 0x28,0x7A,0x00,0x28,0x02,0xD0,0x29,0x49,0x28,0x6B,0x88,0x60,0xE0,0x6B,0x0B,0x28, + 0x14,0xD0,0x27,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0,0x11,0xFB,0xF8,0x68, + 0x24,0x49,0x88,0x42,0xEC,0xD9,0x24,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB8,0x68, + 0xB0,0x43,0xB8,0x60,0xB8,0x68,0x30,0x43,0xB8,0x60,0xE1,0xE7,0xE8,0x79,0x00,0x28, + 0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x7F,0xFC,0x28,0x7A,0x00,0x28,0x01,0xD0, + 0x06,0xF0,0x38,0xFD,0x02,0x20,0x06,0xF0,0x87,0xFC,0xFF,0x20,0x81,0x30,0x00,0xF0, + 0x73,0xFC,0x16,0x49,0x05,0x20,0x03,0xF0,0x8F,0xFA,0x0B,0x20,0xE0,0x63,0x03,0xF0, + 0x41,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x28,0x00,0x00,0x00,0x10,0x71,0x00,0x00, + 0x40,0x00,0x00,0x20,0xF8,0x0A,0x00,0x20,0xC0,0x75,0x00,0x00,0xC0,0x0F,0x00,0x20, + 0x00,0x7E,0x00,0x00,0x00,0x76,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xAD,0x0B,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40, + 0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x75,0x00,0x00,0x95,0x6E,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x20,0x20,0x52,0xE2,0x05,0x00,0x00,0x3A, + 0x18,0x50,0xB1,0xE8,0x20,0x20,0x52,0xE2,0x18,0x50,0xA0,0xE8,0x18,0x50,0xB1,0xE8, + 0x18,0x50,0xA0,0xE8,0xF9,0xFF,0xFF,0x2A,0x02,0xCE,0xB0,0xE1,0x18,0x50,0xB1,0x28, + 0x18,0x50,0xA0,0x28,0x18,0x00,0xB1,0x48,0x18,0x00,0xA0,0x48,0x10,0x40,0xBD,0xE8, + 0x02,0xCF,0xB0,0xE1,0x04,0x30,0x91,0x24,0x04,0x30,0x80,0x24,0x1E,0xFF,0x2F,0x01, + 0x82,0x2F,0xB0,0xE1,0xB2,0x30,0xD1,0x20,0x01,0x20,0xD1,0x44,0xB2,0x30,0xC0,0x20, + 0x01,0x20,0xC0,0x44,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1, + 0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0,0x1A,0x00,0x00,0x3A, + 0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x01,0x00,0x00,0x3A, + 0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0, + 0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2, + 0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0, + 0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1, + 0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23, + 0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1, + 0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1, + 0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5, + 0x02,0x20,0x06,0xF0,0x47,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46, + 0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA6,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0, + 0x98,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3,0xB7,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x41,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xD1,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x79,0x00,0x00,0x20,0x78,0x47,0xC0,0x46, + 0x01,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47, + 0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A, + 0x10,0x43,0x08,0x60,0x0F,0x24,0x02,0xF0,0x1E,0xF9,0x64,0x1E,0x00,0x2C,0xFA,0xDC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00, + 0xF8,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7E,0xC0,0x07,0x26,0xD0, + 0x70,0x7D,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43, + 0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43, + 0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18, + 0x28,0x19,0x06,0xF0,0xA5,0xF8,0x64,0x1C,0x70,0x7D,0xA0,0x42,0xF3,0xDA,0x70,0x7D, + 0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7D,0x45,0x19,0x3D,0x60, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x86,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A, + 0x05,0x78,0x54,0x7D,0xE4,0x00,0xE6,0x18,0x09,0x24,0xE4,0x01,0x36,0x19,0xB5,0x73, + 0x56,0x7D,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x35,0x82,0x56,0x7D,0x85,0x88, + 0xF6,0x00,0xF6,0x18,0x36,0x19,0x75,0x82,0x55,0x7D,0xED,0x00,0xED,0x18,0x2D,0x19, + 0x29,0x75,0x55,0x7D,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19,0x59,0x75,0x51,0x7D, + 0x49,0x1C,0x51,0x75,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28, + 0x01,0xD1,0x00,0x20,0x90,0x75,0x70,0xBC,0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0xFF,0xB5,0x0A,0x20,0x48,0x43,0x15,0x4F, + 0x81,0xB0,0xC5,0x19,0x48,0x00,0xFF,0x35,0x61,0x35,0xC0,0x19,0xC0,0x30,0x2A,0x71, + 0x0C,0x00,0x00,0x90,0x80,0x89,0x16,0x00,0x0A,0x21,0xFF,0xF7,0x2F,0xFF,0xE8,0x80, + 0x00,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0x29,0xFF,0x28,0x81,0x38,0x19,0xFF,0x30, + 0x01,0x30,0x00,0x7C,0xB9,0x19,0x68,0x71,0x04,0x98,0xA8,0x72,0x01,0x98,0x06,0x55, + 0x13,0x20,0x40,0x01,0x08,0x18,0x00,0x21,0xC4,0x76,0x81,0x74,0x05,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20,0x06,0x48,0x0F,0x23,0x42,0x79,0x01,0x68, + 0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A,0xD2,0x18,0x09,0x03,0x09,0x0B,0x0A,0x43, + 0x02,0x60,0x70,0x47,0xF0,0x05,0x00,0x20,0xF1,0xB5,0xB2,0x48,0x90,0xB0,0x0F,0x90, + 0x40,0x7C,0xB2,0x49,0x02,0x90,0x0F,0x98,0xC0,0x7C,0x01,0x90,0x0F,0x98,0x00,0x7C, + 0x00,0x90,0xAD,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06,0x02,0xD4,0xA9,0x48,0x40,0x30, + 0x80,0x89,0x00,0x05,0x7E,0xD5,0x10,0x98,0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90, + 0x00,0x20,0x04,0x90,0x3E,0xE1,0x03,0x98,0x81,0x00,0x01,0x20,0x40,0x07,0x08,0x18, + 0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90,0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1, + 0x20,0x00,0x01,0xF0,0x7F,0xFB,0x26,0xE1,0x9D,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28, + 0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9A,0x49,0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98, + 0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80,0x4A,0x5B,0x24,0x31,0x4A,0x53,0x69,0x18, + 0x48,0x80,0x10,0xE1,0x02,0x9F,0x92,0x49,0x00,0x20,0x7F,0x1E,0x48,0x31,0x69,0x18, + 0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80, + 0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46,0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A, + 0x02,0x9A,0x87,0x4E,0x92,0x00,0x8B,0x18,0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19, + 0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90,0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20, + 0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00,0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23, + 0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B,0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7, + 0xAB,0xFD,0x07,0x00,0x02,0x99,0x30,0x00,0xFF,0xF7,0xA6,0xFD,0x00,0x2F,0x00,0xDC, + 0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42,0x17,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42, + 0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21,0x48,0x43,0x0A,0x21,0xFF,0xF7,0x6E,0xFE, + 0x61,0x00,0x00,0xE0,0xCA,0xE0,0x6A,0x4B,0x1C,0x3B,0x5A,0x5E,0x90,0x42,0x0C,0xDD, + 0x0F,0x98,0x00,0x7D,0x10,0x18,0x58,0x52,0x07,0xE0,0x65,0x49,0x0F,0x9A,0x60,0x00, + 0x1C,0x39,0x0B,0x5A,0x52,0x7D,0x9A,0x1A,0x0A,0x52,0x61,0x49,0x60,0x00,0x1C,0x39, + 0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E,0x01,0x99,0x88,0x42, + 0x09,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0,0x88,0x00,0x05,0x21,0xFF,0xF7,0x46,0xFE, + 0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18, + 0x05,0x21,0xFF,0xF7,0x3B,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0, + 0x01,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7,0x31,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC, + 0x02,0x20,0x0A,0xE0,0x01,0x98,0x05,0x21,0xFF,0xF7,0x28,0xFE,0x09,0x99,0x88,0x42, + 0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x45,0x49,0x0A,0x39,0x08,0x55, + 0x43,0x49,0x0C,0x9A,0x24,0x31,0x48,0x5F,0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21, + 0x07,0x90,0x41,0x5E,0x0B,0x9A,0x3E,0x48,0x57,0x1A,0x06,0x91,0x0F,0x99,0x0A,0x38, + 0x00,0x5D,0x89,0x7D,0x88,0x42,0x27,0xD3,0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0, + 0x30,0x1E,0x00,0xDC,0x70,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0, + 0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7,0x1F,0xFD,0x04,0x00,0x00,0x2F,0x01,0xD1, + 0x00,0x20,0x0C,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA, + 0x01,0x20,0x04,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7,0x0D,0xFD,0x08,0x99, + 0x00,0x2E,0x19,0xDB,0x09,0x19,0x18,0xE0,0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99, + 0xFF,0xF7,0x02,0xFD,0x64,0x21,0x08,0x1A,0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42, + 0x48,0x43,0x64,0x21,0xFF,0xF7,0xF8,0xFC,0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0x50,0x43,0x64,0x21,0xE0,0xE7,0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB, + 0x10,0x18,0x00,0xE0,0x10,0x1A,0x16,0x4A,0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A, + 0x5A,0x80,0x13,0x4A,0x13,0x4B,0x24,0x32,0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80, + 0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43,0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D, + 0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98,0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C, + 0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42,0x00,0xDA,0xBC,0xE6,0x11,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xCA,0x0B,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4,0x27,0x21,0xDA,0x88, + 0x49,0x01,0x80,0x24,0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x8D,0x82, + 0xC5,0x89,0xCD,0x82,0x05,0x8A,0x0D,0x83,0x40,0x8A,0x48,0x83,0x08,0x48,0x20,0x30, + 0x00,0x89,0x22,0x43,0x88,0x83,0x06,0xE0,0x00,0x20,0x88,0x82,0xC8,0x82,0x08,0x83, + 0x48,0x83,0xA2,0x43,0x88,0x83,0xDA,0x80,0x30,0xBC,0x70,0x47,0xF0,0x05,0x00,0x20, + 0x80,0x78,0x00,0x00,0x7F,0xB5,0x24,0x4D,0x04,0x00,0x1A,0x28,0x0B,0xD1,0x28,0x6A, + 0x00,0x28,0x08,0xD1,0x68,0x6A,0x00,0x28,0x05,0xD1,0x20,0x4C,0x01,0xF0,0xB4,0xFE, + 0x64,0x1E,0xFB,0xD2,0x14,0xE0,0x05,0xF0,0x73,0xF8,0x00,0x20,0x01,0xF0,0x22,0xFD, + 0x01,0xF0,0xA0,0xFD,0x01,0xF0,0xE8,0xFD,0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0, + 0x77,0xFA,0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x94,0x00,0xF0,0x30,0xF8, + 0x02,0x20,0x06,0xF0,0x89,0xF8,0x02,0x20,0x06,0xF0,0x7A,0xF8,0x10,0x48,0xE9,0x68, + 0xC1,0x61,0x29,0x69,0xC1,0x61,0x0F,0x49,0xCA,0x68,0x52,0x08,0x52,0x00,0xCA,0x60, + 0x0D,0x4A,0x0E,0x49,0x02,0xE0,0xD3,0x68,0x8B,0x42,0x02,0xD8,0x43,0x69,0x9B,0x06, + 0xF9,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5,0x01,0xF0,0x94,0xFE,0x01,0x20,0x00,0xF0, + 0x6B,0xF8,0x7F,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00,0xE7,0x03,0x00,0x00, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00, + 0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x9C,0xF9,0x1C,0x48,0x01,0x27, + 0x04,0x04,0x24,0x0C,0x7F,0x02,0x00,0x22,0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD, + 0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22, + 0x01,0xA8,0x04,0xF0,0xBA,0xF9,0x14,0x99,0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49, + 0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49, + 0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42, + 0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1, + 0x0A,0x90,0x01,0xA8,0x06,0xF0,0x9C,0xF8,0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x75,0x00,0x00,0xAB,0x0C,0x00,0x80, + 0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3, + 0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5, + 0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A, + 0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62, + 0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20, + 0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43, + 0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40,0xF0,0xB5,0x00,0x20, + 0xF3,0xB0,0x62,0x90,0xFF,0x49,0x40,0x1E,0x5E,0x90,0xCB,0x79,0xFE,0x4F,0xFF,0x48, + 0xFA,0x88,0x54,0x06,0x00,0xD4,0xC3,0x78,0x54,0x06,0x05,0x93,0x0B,0x7A,0x00,0xD4, + 0x03,0x79,0xFB,0x4C,0xA4,0x8A,0x1B,0x19,0x1B,0x06,0x1B,0x0E,0x04,0x93,0x4B,0x7A, + 0x54,0x06,0x00,0xD4,0x43,0x79,0x52,0x06,0x03,0x93,0x89,0x7A,0x00,0xD4,0x81,0x79, + 0x00,0x20,0xF4,0x4C,0x02,0x91,0x3D,0x79,0x01,0x26,0x01,0x90,0x13,0xE0,0x0A,0x20, + 0x70,0x43,0x43,0x21,0xC0,0x19,0xC9,0x00,0x09,0x5C,0x00,0x29,0x0A,0xD0,0xEE,0x49, + 0x40,0x18,0x02,0xF0,0x93,0xFE,0x00,0x28,0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06, + 0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x78,0xB0,0x42,0xE8,0xDA,0xE7,0x48,0x72,0x90, + 0xC2,0x8A,0x41,0x8B,0x50,0x1A,0x00,0x28,0x00,0xDC,0x88,0x1A,0x03,0x04,0x72,0x98, + 0x72,0x99,0x00,0x8B,0x89,0x8B,0x1B,0x0C,0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A, + 0x10,0x04,0x72,0x9A,0x00,0x21,0x91,0x74,0x72,0x9A,0x00,0x0C,0xD1,0x74,0x72,0x9A, + 0x11,0x75,0x01,0x99,0x00,0x29,0x10,0xD0,0x1E,0x2B,0x0E,0xD2,0x32,0x28,0x03,0xD2, + 0x72,0x98,0x01,0x21,0x81,0x74,0x08,0xE0,0x64,0x28,0x03,0xD2,0x72,0x99,0x01,0x20, + 0xC8,0x74,0x02,0xE0,0x72,0x98,0x01,0x21,0x01,0x75,0x72,0x98,0x40,0x7C,0x00,0x28, + 0x16,0xD1,0x72,0x98,0x80,0x7C,0x00,0x28,0x02,0xD0,0x05,0x98,0x80,0x1C,0x0C,0xE0, + 0x72,0x98,0xC0,0x7C,0x00,0x28,0x02,0xD0,0x05,0x98,0x00,0x1D,0x05,0xE0,0x72,0x98, + 0x00,0x7D,0x00,0x28,0x04,0xD0,0x05,0x98,0x80,0x1D,0x00,0x06,0x00,0x0E,0x05,0x90, + 0x09,0x22,0x00,0x21,0x5B,0xA8,0x04,0xF0,0xB3,0xF8,0xF8,0x88,0xFF,0x21,0x09,0x31, + 0x08,0x42,0x01,0xD1,0xC0,0x06,0x05,0xD5,0x01,0xF0,0xAE,0xF8,0x73,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xE0,0x78,0x00,0x28,0x01,0xD0,0x40,0x1E,0xE0,0x70,0x60,0x78, + 0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0,0x18,0xE0,0x00,0x28,0x16,0xD1,0xB1,0x48, + 0x5A,0x22,0x00,0x21,0x5E,0x30,0x04,0xF0,0x93,0xF8,0xE0,0x78,0x00,0x28,0x0C,0xD1, + 0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E,0x0A,0x00,0x14,0x23,0x5B,0xA8,0xFF,0xF7, + 0x7B,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD,0x25,0x70,0xE6,0xE1,0x09,0x22,0x01,0x21, + 0x58,0xA8,0x04,0xF0,0x7D,0xF8,0x02,0x20,0xA3,0x49,0x06,0x90,0x9E,0x48,0x5D,0x31, + 0x41,0x18,0x71,0x91,0xA0,0x49,0x54,0x31,0x40,0x18,0x70,0x90,0x13,0xE1,0x08,0x26, + 0x07,0xAF,0x24,0x20,0x70,0x43,0x07,0xA9,0x40,0x18,0x00,0x21,0x24,0x22,0xC9,0x43, + 0x04,0xF0,0x66,0xF8,0x76,0x1E,0xF4,0xD5,0x06,0x98,0x01,0xF0,0x39,0xFC,0x01,0x27, + 0x5F,0x90,0x53,0xE0,0x5F,0x98,0x01,0x26,0x60,0x90,0x4B,0xE0,0x0A,0x20,0x70,0x43, + 0x8D,0x49,0x40,0x18,0x01,0x00,0xFF,0x30,0xFF,0x30,0x02,0x30,0x6F,0x90,0x00,0x7E, + 0x00,0x28,0x3E,0xD0,0x8C,0x48,0x08,0x18,0x6E,0x90,0x02,0xF0,0xCF,0xFD,0x06,0x99, + 0x08,0x43,0x07,0xD0,0x6E,0x98,0x02,0xF0,0xC9,0xFD,0x00,0x28,0x31,0xD0,0x06,0x98, + 0x00,0x28,0x2E,0xD0,0x80,0x49,0x78,0x00,0x40,0x18,0xC0,0x30,0x6D,0x90,0x80,0x89, + 0x0A,0x21,0xFF,0xF7,0x6B,0xFB,0x6F,0x99,0x49,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC, + 0x42,0x1A,0x6D,0x98,0x61,0x92,0xC0,0x8B,0x0A,0x21,0xFF,0xF7,0x5F,0xFB,0x6F,0x99, + 0x89,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A,0x61,0x98,0x01,0x00,0x41,0x43, + 0x10,0x00,0x50,0x43,0x08,0x18,0x60,0x99,0x88,0x42,0x04,0xDA,0x24,0x21,0x79,0x43, + 0x07,0xAA,0x56,0x50,0x60,0x90,0x24,0x21,0x79,0x43,0x07,0xAA,0x89,0x18,0xB2,0x00, + 0x88,0x50,0x76,0x1C,0xA0,0x78,0xB0,0x42,0xB0,0xDA,0x7F,0x1C,0xAF,0x42,0xA9,0xDD, + 0x01,0x20,0xA4,0xE0,0x01,0x23,0x5F,0x9A,0x18,0x00,0x15,0xE0,0x5B,0xA9,0x09,0x5C, + 0x00,0x29,0x10,0xD1,0x24,0x21,0x41,0x43,0x0F,0x00,0x07,0xAE,0x89,0x19,0xF6,0x59, + 0xB7,0x00,0xC9,0x59,0x91,0x42,0x06,0xDA,0x00,0x29,0x04,0xDB,0x00,0x2E,0x02,0xDB, + 0x0A,0x00,0x00,0x23,0x5E,0x90,0x40,0x1C,0xA8,0x42,0xE7,0xDD,0x00,0x2B,0x7E,0xD1, + 0x62,0x98,0x5E,0x9E,0x40,0x1C,0x62,0x90,0x24,0x20,0x46,0x43,0x07,0xA8,0x80,0x59, + 0x0A,0x21,0x48,0x43,0x50,0x49,0x0A,0x22,0x41,0x18,0x5E,0x98,0xFF,0x31,0x50,0x43, + 0x4D,0x4A,0xBF,0x31,0x87,0x18,0x38,0x00,0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0, + 0xB3,0xFF,0x5E,0x98,0x48,0x49,0x40,0x00,0x40,0x18,0xC0,0x30,0x6C,0x90,0x80,0x89, + 0x0A,0x21,0xFF,0xF7,0xFB,0xFA,0xFF,0x37,0x61,0x37,0xF8,0x80,0x6C,0x98,0x0A,0x21, + 0xC0,0x8B,0xFF,0xF7,0xF3,0xFA,0x38,0x81,0x3F,0x48,0x5E,0x99,0x40,0x18,0xFF,0x30, + 0x01,0x30,0x00,0x7C,0x78,0x71,0xB8,0x7A,0x05,0x99,0x49,0x1C,0x88,0x42,0x01,0xD2, + 0x40,0x1C,0xB8,0x72,0xB8,0x7A,0x13,0x28,0x6B,0x90,0x09,0xD9,0x14,0x21,0xFF,0xF7, + 0xDD,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42,0x02,0xD2,0x6B,0x98,0x14,0x30,0xB8,0x72, + 0x38,0x79,0x5E,0x9A,0x5B,0xA9,0x88,0x54,0x71,0x9A,0x5E,0x99,0x81,0x54,0x39,0x79, + 0x70,0x9A,0x00,0x20,0x88,0x54,0x07,0xA9,0x89,0x59,0x58,0xAA,0x50,0x54,0x01,0x21, + 0x23,0xE0,0x08,0x00,0x24,0x23,0x58,0x43,0x07,0xAB,0x6A,0x90,0xC0,0x18,0x69,0x90, + 0x9B,0x59,0x00,0x22,0xD2,0x43,0x9B,0x00,0xC2,0x50,0x5B,0xA8,0x40,0x5C,0x5F,0x9B, + 0x00,0x28,0x11,0xD1,0xA2,0x78,0x01,0x20,0x94,0x46,0x0B,0xE0,0x69,0x9A,0x87,0x00, + 0xD2,0x59,0x00,0x2A,0x05,0xDB,0x9A,0x42,0x07,0xAF,0x02,0xDA,0x6A,0x9B,0xF8,0x50, + 0x13,0x00,0x40,0x1C,0x84,0x45,0xF1,0xDA,0x49,0x1C,0xA9,0x42,0x00,0xE0,0x04,0xE0, + 0xD7,0xDD,0xA0,0x78,0x62,0x99,0x88,0x42,0x05,0xDD,0x64,0x98,0x40,0x1C,0xA8,0x42, + 0x64,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98,0x41,0x1E,0x09,0x06,0x09,0x0E,0x00,0x28, + 0x06,0x91,0x00,0xD0,0xE3,0xE6,0x01,0x26,0x65,0x96,0x63,0x90,0x6F,0xE0,0x58,0xA8, + 0x80,0x5D,0x00,0x28,0x6A,0xD0,0x65,0x98,0x07,0x49,0x2F,0x18,0x0A,0x20,0x70,0x43, + 0x40,0x18,0x68,0x90,0xFF,0x30,0xFF,0x30,0x02,0x30,0x67,0x90,0x00,0x7E,0x70,0x99, + 0x40,0x5C,0x0D,0xE0,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20, + 0x03,0x99,0x88,0x42,0x34,0xD2,0x08,0x2F,0x32,0xDC,0x4C,0x49,0x68,0x98,0x40,0x18, + 0x02,0xF0,0xAC,0xFC,0x00,0x28,0x2B,0xD0,0x67,0x98,0x70,0x99,0x00,0x7E,0x70,0x9A, + 0x47,0x4B,0x41,0x5C,0x49,0x1C,0x81,0x54,0x68,0x98,0x43,0x21,0xC9,0x00,0x41,0x18, + 0x0A,0x20,0x78,0x43,0xC0,0x18,0x66,0x90,0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0, + 0xF3,0xFE,0x68,0x99,0x66,0x98,0xFF,0x31,0xC1,0x31,0x4A,0x79,0xFF,0x30,0x61,0x30, + 0xC2,0x72,0x89,0x79,0x01,0x73,0x67,0x98,0x5B,0xA9,0x00,0x7E,0xC8,0x55,0x71,0x99, + 0x47,0x54,0x65,0x98,0x40,0x1C,0x65,0x90,0x63,0x98,0x40,0x1C,0x63,0x90,0x15,0xE0, + 0x32,0x49,0x68,0x98,0x32,0x4F,0x40,0x18,0x02,0xF0,0x78,0xFC,0x00,0x28,0x0D,0xD0, + 0x72,0x99,0x01,0x20,0x08,0x74,0x67,0x98,0x80,0x7F,0x13,0x28,0x06,0xD9,0x60,0x78, + 0x01,0x28,0x03,0xD1,0xF8,0x88,0x04,0x21,0x08,0x43,0xF8,0x80,0x76,0x1C,0xA0,0x78, + 0xB0,0x42,0x8C,0xDA,0x26,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5,0x02,0x99,0x04,0x22, + 0xE1,0x70,0x23,0x49,0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0,0x5B,0xA8,0x80,0x5D, + 0x00,0x28,0x1A,0xD1,0x13,0x22,0x01,0x20,0x52,0x01,0x05,0x23,0xDB,0x01,0x1C,0x49, + 0x09,0x18,0x8F,0x18,0xFF,0x7E,0x00,0x2F,0x0C,0xD1,0xC9,0x18,0x09,0x79,0x00,0x29, + 0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23,0x5B,0xA8,0xFF,0xF7, + 0xAB,0xFA,0x02,0xE0,0x40,0x1C,0x09,0x28,0xE9,0xDB,0xE0,0x78,0x00,0x28,0x0E,0xD0, + 0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18,0x38,0x00,0xFF,0x30,0x6B,0x30,0x02,0xF0, + 0x2D,0xFC,0x00,0x28,0x03,0xD1,0x01,0x20,0xFF,0x37,0x61,0x37,0xB8,0x72,0x76,0x1C, + 0xAE,0x42,0xCB,0xDD,0x63,0x98,0x28,0x18,0x20,0x70,0x20,0x78,0x05,0x49,0x5A,0x22, + 0xA0,0x70,0x08,0x00,0xB4,0x30,0x03,0xF0,0x77,0xFE,0xE7,0xE5,0x1E,0x02,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x54,0x07,0x00,0x20,0xF1,0xB5,0x3C,0x48,0x86,0xB0,0x05,0x90, + 0x00,0x20,0x04,0x90,0x3A,0x48,0x41,0x7F,0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F, + 0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99, + 0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90, + 0x01,0xF0,0x8A,0xF9,0x01,0xF0,0x38,0xFA,0x00,0x24,0x27,0x00,0x37,0xE0,0x00,0x26, + 0x30,0xE0,0x31,0x00,0x38,0x00,0x02,0xF0,0xDF,0xF8,0x00,0x28,0x28,0xD0,0x29,0x78, + 0x05,0x9A,0x79,0x43,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A, + 0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x05,0xF0,0x10,0xFB,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20, + 0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x02,0xFB, + 0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90, + 0x64,0x1C,0x76,0x1C,0x13,0x4D,0x28,0x78,0x86,0x42,0xCA,0xD3,0x7F,0x1C,0x12,0x48, + 0x00,0x78,0x87,0x42,0xC3,0xD3,0x10,0x48,0x0E,0x49,0x00,0x78,0x09,0x78,0x48,0x43, + 0xA0,0x42,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98, + 0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xA9,0xD9,0x06,0x98,0x00,0x28, + 0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90,0xEC,0xE7,0x00,0x02,0x10,0x40, + 0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF0,0xB5,0x8A,0x4A, + 0xFF,0xB0,0x88,0xB0,0x40,0x18,0x85,0x92,0x42,0x00,0x80,0x18,0x84,0x90,0x48,0x42, + 0x83,0x90,0x86,0x48,0x86,0x4E,0x00,0x7A,0x02,0xAF,0x82,0x90,0x85,0x48,0x86,0x90, + 0x00,0x7D,0x00,0x28,0x02,0xD1,0x83,0x98,0x40,0x42,0x83,0x90,0x01,0x22,0x52,0x02, + 0x00,0x21,0x30,0x00,0x03,0xF0,0xF4,0xFD,0x00,0x25,0x39,0xE0,0x00,0x24,0x32,0xE0, + 0x7C,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x15,0xD0,0x7B,0x49,0x09,0x78,0x00,0x29, + 0x82,0x99,0x16,0xD0,0x8D,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D, + 0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0, + 0x80,0x7E,0xA0,0x42,0x16,0xD1,0x83,0x9A,0x21,0x00,0x28,0x00,0x05,0xF0,0x8A,0xFA, + 0x10,0xE0,0x8C,0x42,0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42, + 0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E, + 0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x65,0x48,0x00,0x78,0x84,0x42,0xC8,0xD3,0x6D,0x1C, + 0x63,0x4C,0x20,0x78,0x85,0x42,0xC1,0xD3,0x01,0xF0,0xC6,0xF8,0x01,0xF0,0x74,0xF9, + 0x00,0x25,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00,0x02,0xF0,0x1C,0xF8, + 0x00,0x28,0x12,0xD0,0x59,0x49,0x85,0x9B,0x09,0x78,0x69,0x43,0x0A,0x19,0x91,0x00, + 0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD, + 0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0, + 0x89,0xF8,0x4E,0x49,0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00,0x64,0x1C,0x78,0x52, + 0x4A,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x49,0x48,0x01,0x78,0x8D,0x42, + 0xD0,0xD3,0x00,0x21,0x01,0x91,0x01,0xF0,0x3F,0xF9,0x00,0x25,0x51,0xE0,0x00,0x24, + 0x4A,0xE0,0x21,0x00,0x28,0x00,0x01,0xF0,0xE7,0xFF,0x00,0x28,0x43,0xD0,0x3F,0x49, + 0x85,0x9B,0x09,0x78,0x69,0x43,0x09,0x19,0x8A,0x00,0x9A,0x58,0x03,0x04,0x12,0x05, + 0x12,0x0D,0x1B,0x0C,0xD3,0x1A,0x00,0x2B,0x01,0xDD,0x10,0x1A,0x00,0xE0,0x80,0x1A, + 0x49,0x00,0x73,0x5A,0x00,0x04,0x00,0x0C,0x83,0x42,0x0A,0xD9,0x70,0x52,0x21,0x00, + 0x28,0x00,0x02,0xF0,0x4F,0xF8,0x31,0x49,0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00, + 0x78,0x52,0x01,0x98,0x03,0x21,0xFF,0xF7,0x79,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29, + 0x0D,0xD1,0x86,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0, + 0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0xC6,0xF9,0x0B,0xE0,0x00,0x22, + 0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0xBE,0xF9,0x00,0x28,0x02,0xD1, + 0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x1C,0x48,0x00,0x78,0x84,0x42,0xB0,0xD3, + 0x6D,0x1C,0x1B,0x48,0x00,0x78,0x85,0x42,0xA9,0xD3,0x01,0x98,0x40,0x1C,0x01,0x90, + 0x84,0x98,0x40,0x1E,0x84,0x90,0x1B,0xD2,0x14,0x4E,0x00,0x25,0x0E,0xE0,0x00,0x24, + 0x08,0xE0,0x68,0x43,0x00,0x19,0x40,0x00,0x3A,0x5A,0x21,0x00,0x28,0x00,0x05,0xF0, + 0xBB,0xF9,0x64,0x1C,0x30,0x78,0x84,0x42,0xF3,0xD3,0x6D,0x1C,0x0C,0x48,0x00,0x78, + 0x85,0x42,0xEC,0xD3,0x7F,0xB0,0x08,0xB0,0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47, + 0x01,0xF0,0x12,0xF8,0x7F,0xE7,0x00,0x00,0x00,0x02,0x10,0x40,0x70,0x0A,0x00,0x20, + 0x40,0x00,0x00,0x20,0x20,0x78,0x00,0x00,0xFD,0x0A,0x00,0x20,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0, + 0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x7A, + 0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25,0x1F,0x4F,0xAD,0x01,0x32,0xE0,0x72,0x46, + 0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1, + 0x00,0x9C,0x93,0x00,0xA6,0x7A,0x1B,0x0F,0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19, + 0xE4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19, + 0xC0,0x68,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40, + 0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E, + 0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42, + 0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0xFC,0xB5,0x04,0x00,0x5E,0x48,0x8E,0x46,0x02,0x8C,0x5E,0x49,0x40,0x8C,0x01,0x91, + 0xCB,0x88,0x40,0x39,0x00,0x91,0x89,0x7E,0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26, + 0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xA6,0xE0,0x01,0x99,0x09,0x79,0x00,0x29, + 0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00, + 0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46, + 0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42,0x58,0xDC,0x82,0x42, + 0x56,0xDB,0x8C,0x45,0x54,0xDC,0x8B,0x42,0x52,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A, + 0x77,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x09,0x23,0x02,0x2A,0x17,0xD0,0x03,0x2A, + 0x71,0xD1,0xE2,0x79,0xD7,0x07,0x28,0xD0,0x01,0x2A,0x01,0xD0,0x05,0x2A,0x22,0xD1, + 0x00,0x25,0xE3,0x71,0x67,0xE0,0x00,0x9A,0x92,0x7D,0x00,0x2A,0x63,0xD1,0x00,0xF0, + 0x87,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72,0x5B,0xE0,0xE2,0x79, + 0xD6,0x07,0xE9,0xD1,0x92,0x07,0x56,0xD5,0x00,0xF0,0x7A,0xF8,0x06,0x00,0x08,0xD0, + 0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71,0xFE,0xF7,0xE2,0xFF, + 0xEB,0xE7,0x02,0x20,0x46,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0, + 0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1, + 0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xCD,0xFF,0xA6,0x71,0x05,0xE0,0x00,0x29, + 0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0, + 0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28, + 0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07, + 0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0xA9,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0x9D,0xFF,0x01,0x25,0xA6,0x71,0x02,0xE0, + 0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79, + 0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x06,0x48,0x40,0x8B, + 0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88,0x00,0x06,0x80,0x0F,0x01,0xD0,0x00,0x20, + 0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00,0xA0,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xF0,0xB4,0x18,0x4B,0x05,0x00,0xDE,0x7E,0x00,0x22,0x10,0x00,0x00,0x2E,0x26,0xD0, + 0x1B,0x7D,0x00,0x2B,0x23,0xD1,0x20,0xE0,0x13,0x4B,0xD4,0x00,0xE3,0x18,0x11,0x24, + 0xA4,0x01,0x1C,0x19,0x1C,0x27,0xE7,0x5F,0xAF,0x42,0x11,0xDC,0x23,0x27,0x7F,0x01, + 0xDB,0x19,0x00,0x27,0xDF,0x5F,0xAF,0x42,0x0A,0xDB,0x1E,0x27,0xE7,0x5F,0x8F,0x42, + 0x06,0xDC,0x02,0x24,0x1C,0x5F,0x8C,0x42,0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E, + 0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42,0xDC,0xD8,0xF0,0xBC, + 0x70,0x47,0x00,0x00,0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0x8F,0xB0,0x0A,0x90,0x09,0x90,0xC7,0x48,0xC7,0x4A,0x01,0x8A,0xD0,0x88,0x43,0x06, + 0x02,0xD4,0xC4,0x49,0xC0,0x39,0x89,0x89,0xC2,0x4C,0xC4,0x4E,0x60,0x34,0x08,0x91, + 0xE1,0x7B,0x43,0x06,0x00,0xD4,0xF1,0x7A,0x43,0x06,0x07,0x91,0xA1,0x7B,0x00,0xD4, + 0xB1,0x7A,0x43,0x06,0x06,0x91,0x61,0x7C,0x00,0xD4,0x71,0x7B,0x43,0x06,0x05,0x91, + 0xA1,0x79,0x00,0xD4,0xB1,0x78,0x02,0x07,0x04,0x91,0xB7,0x49,0x09,0x79,0x05,0xD5, + 0xB5,0x4A,0x00,0x29,0x02,0xD1,0x08,0x23,0x98,0x43,0xD0,0x80,0xB4,0x48,0x18,0x22, + 0x82,0x5E,0xFF,0x23,0x01,0x33,0x28,0x2A,0x03,0xDD,0x1A,0x22,0x82,0x5E,0x1E,0x2A, + 0x03,0xDC,0x1C,0x22,0x82,0x5E,0x28,0x2A,0x05,0xDD,0xAB,0x4D,0xEA,0x88,0x1A,0x43, + 0xEA,0x80,0x00,0x22,0x04,0xE0,0x1E,0x22,0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E, + 0xC2,0x83,0x03,0xE0,0xA4,0x4A,0xD0,0x88,0x98,0x43,0xD0,0x80,0x08,0x98,0x80,0x04, + 0x78,0xD5,0xA3,0x4A,0x00,0x20,0x20,0x32,0x52,0x78,0x00,0x2A,0x02,0xD1,0x00,0x29, + 0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0,0x41,0xF9,0x9B,0x48,0x9D,0x4D,0x00,0x79, + 0x01,0x28,0x0E,0x90,0x68,0xD1,0x98,0x4B,0x19,0x89,0x0D,0x91,0xDF,0x88,0x62,0x89, + 0x7B,0x06,0x00,0xD4,0xF2,0x88,0x91,0x42,0x00,0xD3,0x00,0x20,0x03,0x90,0x0D,0x98, + 0x0A,0x22,0x0E,0x21,0x50,0x43,0x69,0x5E,0x0C,0x91,0xFE,0xF7,0x65,0xFD,0x21,0x78, + 0x91,0x4B,0x7A,0x06,0x0B,0x93,0x00,0xD4,0x19,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20, + 0x00,0xE0,0x00,0x20,0x02,0x90,0x0C,0x99,0x0D,0x98,0x40,0x1A,0x0A,0x21,0xFE,0xF7, + 0x53,0xFD,0x61,0x78,0x7A,0x06,0x01,0xD4,0x0B,0x99,0x49,0x7F,0x88,0x42,0x01,0xDA, + 0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0x2A,0x89,0xA1,0x78,0x01,0x20,0x7B,0x06, + 0x01,0xD4,0x0B,0x99,0x89,0x7F,0x8A,0x42,0x00,0xD8,0x00,0x20,0xE1,0x78,0x84,0x46, + 0x2A,0x69,0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0xC9,0x7F,0x8A,0x42,0x00,0xDB, + 0x00,0x20,0x03,0x99,0x00,0x29,0x1F,0xD0,0x02,0x99,0x00,0x29,0x1C,0xD0,0x01,0x99, + 0x00,0x29,0x19,0xD0,0x61,0x46,0x00,0x29,0x16,0xD0,0x71,0x4A,0x01,0x21,0x80,0x3A, + 0x52,0x68,0x00,0x2A,0x00,0xD0,0x00,0x21,0x01,0x42,0x0D,0xD0,0x68,0x7B,0x00,0x28, + 0x24,0xD0,0x61,0x7A,0x7A,0x06,0x00,0xD4,0x71,0x79,0x88,0x42,0x1E,0xD8,0x40,0x1E, + 0x68,0x73,0x1B,0xE0,0x36,0xE0,0xFF,0xE7,0x63,0x48,0x21,0x79,0xC0,0x88,0x2A,0x69, + 0x43,0x06,0x00,0xD4,0x31,0x78,0x8A,0x42,0x10,0xDB,0x0E,0x99,0x00,0x29,0x0D,0xD0, + 0xC1,0x06,0x0B,0xD4,0x69,0x7B,0xE2,0x79,0x40,0x06,0x00,0xD4,0xF2,0x78,0x91,0x42, + 0x04,0xD2,0x04,0x98,0x81,0x42,0x01,0xD9,0x49,0x1C,0x69,0x73,0x68,0x7B,0x04,0x99, + 0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98,0x00,0x28,0x0A,0xD1,0x52,0x49,0xC8,0x88, + 0x10,0x43,0xC8,0x80,0xC9,0x88,0x20,0x7A,0x49,0x06,0x00,0xD4,0x30,0x79,0x28,0x73, + 0x08,0xE0,0x4D,0x4B,0xD9,0x88,0xC8,0x06,0x04,0xD5,0x28,0x7B,0x00,0x28,0x10,0xD1, + 0x91,0x43,0xD9,0x80,0x48,0x4F,0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06, + 0x05,0xD5,0x05,0x99,0x06,0x98,0x40,0x1A,0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22, + 0x01,0xE0,0x40,0x1E,0xE3,0xE7,0x50,0x00,0xC0,0x19,0x84,0x46,0xFF,0x30,0x41,0x30, + 0xC0,0x88,0x00,0x28,0x65,0xD0,0x07,0x99,0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07, + 0x5F,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88,0x08,0x21,0x08,0x43,0xF8,0x80,0x58,0xE0, + 0x06,0x99,0x88,0x42,0x55,0xD3,0x08,0x98,0x40,0x07,0x52,0xD5,0x00,0x24,0x01,0x20, + 0x27,0xE0,0xFF,0x23,0x39,0x18,0x3E,0x33,0x5B,0x5C,0x93,0x42,0x20,0xD1,0x64,0x1C, + 0xFF,0x31,0x01,0x31,0x09,0x7C,0x0A,0x91,0x01,0x00,0x12,0xE0,0x4B,0x00,0xDD,0x19, + 0x2B,0x00,0xC0,0x33,0xDE,0x89,0xE0,0x35,0x9E,0x81,0x2D,0x88,0xDD,0x83,0x7B,0x18, + 0xDD,0x1D,0xF9,0x35,0x6E,0x7C,0xFF,0x33,0x21,0x33,0x2E,0x74,0x9E,0x7F,0x49,0x1C, + 0x5E,0x77,0x3B,0x79,0x8B,0x42,0xE9,0xDA,0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71, + 0x40,0x1C,0x39,0x79,0x81,0x42,0xD4,0xDA,0x00,0x2C,0x22,0xDD,0x01,0x2C,0x05,0xDD, + 0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21,0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30, + 0x01,0x30,0xC1,0x8B,0x38,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00, + 0xC0,0x19,0xC0,0x30,0x81,0x81,0x60,0x46,0xFF,0x30,0x21,0x30,0xC1,0x89,0x38,0x79, + 0x40,0x00,0xC0,0x19,0xC0,0x30,0xC1,0x83,0x3B,0x79,0x0D,0x48,0x0A,0x99,0x30,0x38, + 0x19,0x54,0x52,0x1C,0x08,0x2A,0x8E,0xDB,0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28, + 0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43,0xF8,0x80,0x0F,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00, + 0x30,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0x20,0x79,0x00,0x00,0xF0,0xB5,0x70,0x48, + 0xB1,0xB0,0x00,0x78,0x71,0x4B,0x70,0x4A,0x01,0x90,0x6E,0x48,0x00,0x78,0x00,0x90, + 0xD9,0x88,0x16,0x7D,0x6E,0x48,0x4C,0x06,0x00,0xD4,0x06,0x7C,0x55,0x7D,0x49,0x06, + 0x00,0xD4,0x45,0x7C,0x6B,0x48,0x00,0x21,0x2B,0x95,0x30,0x90,0xC1,0x81,0x50,0x22, + 0x16,0xA8,0x2A,0x91,0x03,0xF0,0xC4,0xF9,0x01,0x99,0x2B,0x98,0x2B,0x9D,0x08,0x1A, + 0xAD,0x1C,0x2F,0x90,0x80,0x1C,0x2E,0x90,0x35,0xE0,0x00,0x98,0x16,0xA9,0x80,0x1B, + 0x80,0x1C,0x86,0x46,0x2B,0x98,0xB4,0x1C,0x28,0x1A,0x80,0x00,0x47,0x18,0x40,0x3F, + 0x1E,0xE0,0x01,0x98,0x5C,0x49,0x00,0x1D,0x60,0x43,0x40,0x19,0x00,0x04,0x00,0x14, + 0x40,0x00,0x0A,0x5E,0x55,0x4B,0x68,0x00,0xC0,0x18,0x94,0x21,0x41,0x5E,0x60,0x00, + 0xC3,0x18,0x6C,0x20,0x18,0x5E,0x2A,0x9B,0x94,0x46,0xC3,0x18,0x52,0x18,0xD2,0x18, + 0x2A,0x92,0xBB,0x6B,0x62,0x46,0x9A,0x18,0x08,0x18,0x10,0x18,0x64,0x1C,0xB8,0x63, + 0xA6,0x45,0xDE,0xDC,0x00,0x98,0x71,0x00,0x41,0x1A,0xB8,0x6B,0xFE,0xF7,0xE4,0xFB, + 0xB8,0x63,0x2E,0x98,0x6D,0x1C,0xA8,0x42,0xC7,0xDC,0x00,0x99,0x70,0x00,0x09,0x1A, + 0x2B,0x98,0x2D,0x91,0x42,0x00,0x01,0x98,0x80,0x1A,0x41,0x43,0x2C,0x90,0x2A,0x98, + 0xFE,0xF7,0xD2,0xFB,0x30,0x99,0x50,0x22,0xC8,0x81,0x00,0x20,0x01,0x00,0x2A,0x90, + 0x02,0xA8,0x03,0xF0,0x6D,0xF9,0x2B,0x9C,0xA4,0x1C,0x35,0xE0,0x00,0x99,0x02,0xAA, + 0x89,0x1B,0x89,0x1C,0x8E,0x46,0x2B,0x99,0xB0,0x1C,0x61,0x1A,0x89,0x00,0x8D,0x18, + 0x40,0x3D,0x8C,0x46,0x1C,0xE0,0x01,0x99,0x33,0x4A,0x09,0x1D,0x41,0x43,0x09,0x19, + 0x49,0x00,0x51,0x5E,0x16,0xAA,0x62,0x44,0x40,0x3A,0x92,0x6B,0x2B,0x4F,0x89,0x1A, + 0x62,0x00,0xD3,0x19,0x94,0x22,0x9A,0x5E,0x43,0x00,0xDB,0x19,0x6C,0x27,0xDF,0x5F, + 0xD2,0x19,0x89,0x18,0x0B,0x00,0x4B,0x43,0xAA,0x6B,0xD1,0x18,0x40,0x1C,0xA9,0x63, + 0x86,0x45,0xE0,0xDC,0x2D,0x99,0xA8,0x6B,0x49,0x1E,0xFE,0xF7,0x95,0xFB,0xA8,0x63, + 0x2A,0x99,0x40,0x18,0x64,0x1C,0x2A,0x90,0x2E,0x98,0xA0,0x42,0xC6,0xDC,0x2C,0x99, + 0x2A,0x98,0xFE,0xF7,0x89,0xFB,0x30,0x99,0x00,0x22,0x0A,0x61,0x11,0x00,0x02,0xAB, + 0x0A,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x14,0x00,0x54,0x43,0x30,0x9A,0x12,0x69, + 0xA2,0x18,0x30,0x9C,0x49,0x1C,0x22,0x61,0x2C,0x9A,0x8A,0x42,0xF1,0xDC,0x30,0x98, + 0x51,0x1E,0x00,0x69,0xFE,0xF7,0x70,0xFB,0x00,0x9A,0x2F,0x99,0x92,0x1B,0x92,0x02, + 0x51,0x43,0xFE,0xF7,0x69,0xFB,0x30,0x99,0x08,0x61,0x30,0x99,0x0E,0x20,0x08,0x5E, + 0x00,0x28,0x01,0xD1,0x40,0x1C,0xC8,0x81,0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x40,0x79,0x00,0x00,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0xF8,0xB5,0x61,0x4D, + 0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x1A,0xF8, + 0x05,0xF0,0x08,0xF8,0x01,0x24,0x64,0x03,0x20,0x00,0xFE,0xF7,0x55,0xFF,0x04,0xF0, + 0xCF,0xFB,0x20,0x00,0xFE,0xF7,0x48,0xFF,0x57,0x4C,0x00,0x26,0x9C,0xE0,0x57,0x48, + 0x41,0x68,0x09,0x07,0x07,0xD5,0xC0,0x68,0x00,0x28,0x04,0xD0,0x53,0x48,0xC1,0x68, + 0xC0,0x03,0xC1,0x63,0x95,0xE0,0x28,0x7A,0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04, + 0x00,0x0C,0x04,0xF0,0xF7,0xFF,0xFF,0x20,0x81,0x30,0xFE,0xF7,0x35,0xFF,0x03,0x20, + 0x04,0xF0,0x2E,0xFF,0x03,0xF0,0x0C,0xFF,0x49,0x4F,0xF8,0x88,0x01,0x06,0x01,0xD5, + 0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x04,0x20,0x00,0xE0,0x02,0x20,0x04,0xF0, + 0xFD,0xFD,0x00,0xF0,0xFB,0xFB,0x04,0xF0,0xC1,0xFB,0x00,0xF0,0xC5,0xFB,0x00,0xF0, + 0x73,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1,0x20,0x7B,0x00,0x28,0x01,0xD0,0x03,0xF0, + 0xFB,0xFE,0x20,0x7A,0x00,0x28,0x01,0xD0,0x03,0xF0,0xA8,0xF8,0x01,0x20,0x40,0x05, + 0x00,0xF0,0x98,0xFB,0x03,0xF0,0xBE,0xF8,0x00,0x28,0x01,0xD0,0x01,0x20,0x28,0x70, + 0x00,0x20,0x00,0xF0,0x8F,0xFB,0x28,0x78,0x00,0x28,0x04,0xD1,0x00,0x22,0x11,0x00, + 0x10,0x00,0x00,0xF0,0x57,0xF9,0x03,0xF0,0xC7,0xFE,0x28,0x78,0x00,0x28,0x04,0xD0, + 0x68,0x7B,0x00,0x09,0x04,0x28,0x44,0xD1,0x2E,0x70,0x03,0x20,0x04,0xF0,0xC2,0xFE, + 0xE8,0x62,0x03,0x20,0x04,0xF0,0xF0,0xFE,0xFF,0x20,0x81,0x30,0xFE,0xF7,0xDC,0xFE, + 0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xF8,0x83,0x2D,0xE0,0xFF,0xF7,0x9E,0xFC, + 0x00,0x28,0x29,0xD0,0x6F,0x6A,0x00,0x2F,0x26,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x1C,0x49,0xFE,0xF7,0x92,0xFB,0x38,0x1A,0x14,0x28,0x1C,0xDD,0x04,0xF0, + 0x97,0xFF,0x04,0xF0,0x9B,0xFF,0xA8,0x79,0x00,0x28,0x0D,0xD0,0x03,0xF0,0x72,0xFE, + 0x03,0xF0,0x75,0xFE,0x03,0xF0,0x7D,0xFE,0x13,0x4D,0x01,0x20,0x68,0x60,0xFE,0xF7, + 0xC3,0xFE,0x12,0x48,0x68,0x60,0x03,0xE0,0x11,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0, + 0x04,0xF0,0x8B,0xFF,0x0E,0x48,0x06,0x70,0x06,0x4D,0x28,0x78,0x00,0x28,0x00,0xD1, + 0x5D,0xE7,0x04,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x5B,0xFF,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20,0x80,0x78,0x00,0x00,0x00,0x40,0x00,0x30, + 0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00, + 0xAC,0x0B,0x00,0x20,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43,0x81,0x00,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x24,0x33,0x5A,0x52,0xCB,0x18,0x5A,0x80, + 0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52,0x22,0x00,0x12,0x32,0x13,0x54,0x18,0x00, + 0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E,0x4B,0x80,0xF9,0xD5, + 0x10,0xBC,0x70,0x47,0xCA,0x0B,0x00,0x20,0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21, + 0x02,0xF0,0xF6,0xFF,0x0A,0x48,0x5A,0x22,0x00,0x21,0x02,0xF0,0xF1,0xFF,0x08,0x48, + 0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48,0x28,0x22,0x21,0x00,0x02,0xF0,0xE8,0xFF, + 0x04,0x48,0x4E,0x38,0x44,0x75,0x10,0xBC,0x08,0xBC,0x18,0x47,0x6B,0x08,0x00,0x20, + 0x54,0x07,0x00,0x20,0x7E,0x0A,0x00,0x20,0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21, + 0x02,0xF0,0xD6,0xFF,0x14,0x48,0x12,0x22,0x00,0x21,0x12,0x30,0x02,0xF0,0xD0,0xFF, + 0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30,0x02,0xF0,0xCA,0xFF,0x0E,0x48,0x20,0x22, + 0x00,0x21,0x24,0x30,0x02,0xF0,0xC4,0xFF,0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30, + 0x02,0xF0,0xBE,0xFF,0x08,0x48,0x10,0x22,0x00,0x21,0x62,0x30,0x02,0xF0,0xB8,0xFF, + 0x05,0x49,0x00,0x20,0x74,0x31,0xC8,0x82,0xFF,0x39,0x41,0x39,0x08,0x71,0x88,0x83, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xBC,0x06,0x00,0x20,0xF0,0xB4,0x1E,0x49, + 0x1E,0x4E,0x8F,0x7B,0xF1,0x88,0x49,0x06,0x02,0xD4,0x1B,0x49,0xC0,0x39,0x8F,0x7A, + 0x08,0x21,0x00,0x24,0x42,0x00,0x0B,0x01,0x9B,0x19,0x15,0x25,0x9B,0x18,0x6D,0x01, + 0x5D,0x19,0xEC,0x82,0x0D,0x25,0xAD,0x01,0x5B,0x19,0x49,0x1E,0xDC,0x80,0xF2,0xD5, + 0x15,0x25,0x31,0x18,0x6D,0x01,0x01,0x23,0x4D,0x19,0xAB,0x73,0x0F,0x25,0x93,0x19, + 0xAD,0x01,0x5B,0x19,0xDC,0x82,0x1F,0x23,0x5B,0x01,0xC9,0x18,0x8F,0x71,0x8C,0x73, + 0x02,0x21,0x0D,0x01,0xAD,0x19,0xAD,0x18,0xED,0x18,0x49,0x1E,0xEC,0x82,0xF8,0xD5, + 0x80,0x00,0x82,0x19,0x00,0x21,0x21,0x20,0xC9,0x43,0x40,0x01,0x10,0x18,0xC1,0x80, + 0x01,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x10,0xB5,0x04,0x48,0x20,0x22,0x00,0x21,0x02,0xF0,0x62,0xFF,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x7E,0x08,0x00,0x20,0x10,0xB5,0x04,0xF0,0x03,0xFE,0x03,0xF0, + 0xF9,0xFD,0xFF,0xF7,0x59,0xFF,0x03,0xF0,0xF3,0xFE,0x01,0xF0,0xA7,0xFD,0x01,0xF0, + 0x21,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x10,0xB4,0x0D,0x4C,0x0B,0x4B,0xE4,0x88, + 0x1B,0x7F,0x64,0x06,0x02,0xD4,0x09,0x4B,0xC0,0x3B,0x1B,0x7E,0x04,0x1E,0x00,0xDC, + 0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18, + 0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xF7,0xB5,0x62,0x48,0xCA,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0, + 0x01,0x20,0x47,0x90,0x00,0x20,0x02,0xE0,0x00,0x20,0x47,0x90,0x01,0x20,0x46,0x90, + 0x5C,0x48,0x00,0x26,0x49,0x90,0x5C,0x48,0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B, + 0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A,0x01,0x91,0x80,0x8B,0x45,0x90,0x57,0x48, + 0x00,0x7A,0x48,0x96,0x00,0x90,0x6B,0xE0,0x00,0x24,0x64,0xE0,0x68,0x43,0x07,0x19, + 0x21,0x00,0x28,0x00,0x01,0xF0,0x80,0xF9,0x4D,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07, + 0x2D,0xD0,0x4F,0x4A,0x52,0x79,0x00,0x2A,0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1, + 0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42, + 0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0, + 0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42,0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0, + 0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E,0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42, + 0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99, + 0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x80,0x1A,0x49,0x9B,0x02,0x04,0xB8,0x00, + 0x18,0x58,0x4B,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0, + 0x00,0x01,0x00,0x0D,0x4A,0x9B,0x05,0x2B,0x0E,0xD8,0x90,0x42,0x01,0xDA,0x47,0x9A, + 0x02,0xE0,0x88,0x42,0x0E,0xDD,0x46,0x9A,0x21,0x00,0x28,0x00,0x00,0xF0,0xAE,0xF8, + 0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0,0x48,0x99,0x05,0xA8,0x47,0x54,0x48,0x98, + 0x40,0x1C,0x48,0x90,0x64,0x1C,0x22,0x49,0xC8,0x78,0x84,0x42,0x96,0xDB,0x6D,0x1C, + 0x1F,0x48,0x01,0x79,0x8D,0x42,0x8F,0xDB,0x4A,0x98,0x05,0x28,0x03,0xD9,0x00,0x04, + 0x48,0x9E,0x00,0x0C,0x45,0x90,0x00,0x2E,0x25,0xDD,0x4C,0x98,0x00,0x28,0x22,0xD1, + 0x00,0xF0,0x88,0xF9,0x00,0xF0,0xA8,0xF9,0x00,0xF0,0x56,0xFA,0x76,0x1E,0x14,0xD4, + 0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00,0x49,0x98,0x80,0x58,0x01,0x05,0x45,0x98, + 0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C,0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04, + 0x08,0x43,0x49,0x99,0x76,0x1E,0x88,0x50,0xEC,0xD5,0x00,0xF0,0x63,0xF9,0x00,0xF0, + 0x8B,0xF9,0x00,0xF0,0x39,0xFA,0x4D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xE0,0x7A,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xF8,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xF8,0xB5,0x01,0x21,0x49,0x07,0x08,0x68, + 0x01,0x28,0x48,0xD1,0x40,0x07,0x41,0x68,0x88,0x01,0x85,0x0D,0x23,0x48,0x00,0x91, + 0x40,0x7B,0x8C,0x05,0xA4,0x0D,0x00,0x07,0x3A,0xD1,0x20,0x00,0x64,0x21,0x48,0x43, + 0x1F,0x49,0xFE,0xF7,0x7B,0xF9,0x1E,0x49,0x48,0x43,0x64,0x21,0xFE,0xF7,0x76,0xF9, + 0x07,0x00,0x28,0x00,0x64,0x21,0x48,0x43,0x1A,0x49,0x2D,0x37,0xFE,0xF7,0x6E,0xF9, + 0x18,0x49,0x48,0x43,0x64,0x21,0xFE,0xF7,0x69,0xF9,0x06,0x00,0x27,0x36,0x70,0x1B, + 0x01,0x00,0x41,0x43,0x38,0x1B,0x02,0x00,0x42,0x43,0x88,0x18,0x19,0x21,0x89,0x01, + 0x88,0x42,0x18,0xD8,0xB8,0x00,0x38,0x18,0x00,0x19,0x06,0x21,0xFE,0xF7,0x56,0xF9, + 0x84,0x05,0x00,0x98,0xA4,0x0D,0x80,0x0A,0x80,0x02,0x04,0x43,0x70,0x00,0x40,0x19, + 0x03,0x21,0xFE,0xF7,0x4B,0xF9,0x80,0x05,0x81,0x09,0x07,0x48,0x04,0x40,0x21,0x43, + 0x01,0x20,0x40,0x07,0x41,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20, + 0xB0,0x22,0x00,0x00,0x58,0x1F,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x30,0xB4,0x17,0x4D, + 0x15,0x4C,0x2D,0x78,0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E, + 0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0, + 0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C, + 0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E, + 0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43, + 0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20, + 0xF0,0xB5,0x5A,0x48,0x8F,0xB0,0x06,0x78,0x59,0x48,0x5B,0x4A,0x05,0x96,0x07,0x78, + 0x58,0x48,0x06,0x97,0x0E,0x90,0x80,0x7E,0x0D,0x92,0xC1,0x07,0x09,0xD0,0x80,0x07, + 0x04,0xD5,0x70,0x1E,0x05,0x90,0x03,0x20,0x10,0x71,0x02,0xE0,0x7F,0x1E,0x00,0x21, + 0x11,0x71,0x52,0x48,0x0A,0x22,0x01,0x8C,0x51,0x43,0x09,0x04,0x09,0x0C,0x02,0x91, + 0x40,0x8C,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0, + 0x00,0x2F,0x7C,0xD0,0x41,0x00,0x02,0x98,0xFD,0xF7,0xFE,0xFF,0x05,0x04,0x2D,0x0C, + 0x00,0x24,0xB6,0x1C,0x0A,0xE0,0x02,0x98,0x05,0x99,0x60,0x43,0xFD,0xF7,0xF4,0xFF, + 0x43,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xB4,0x42,0xF2,0xDB, + 0x01,0x98,0x79,0x00,0xFD,0xF7,0xE8,0xFF,0x06,0x04,0x06,0x98,0x36,0x0C,0x00,0x24, + 0x80,0x1C,0x0C,0x90,0x0C,0xE0,0x01,0x98,0x39,0x00,0x60,0x43,0xFD,0xF7,0xDC,0xFF, + 0x37,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x81,0x80,0x0C,0x98,0x64,0x1C, + 0x84,0x42,0xF0,0xDB,0x0E,0x98,0x80,0x7E,0xC0,0x07,0x53,0xD0,0x00,0x24,0x4D,0xE0, + 0x2F,0x4A,0x09,0x21,0x10,0x19,0xC9,0x01,0x40,0x18,0x41,0x7A,0x0E,0x98,0x80,0x7E, + 0x80,0x07,0x03,0xD5,0x05,0x98,0x03,0x95,0x04,0x91,0x02,0xE0,0x08,0x00,0x03,0xA9, + 0xC0,0xC1,0x27,0x49,0x40,0x00,0x40,0x18,0x0B,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B, + 0xFD,0xF7,0xB2,0xFF,0x22,0x4A,0xE1,0x00,0x89,0x18,0x11,0x22,0x92,0x01,0x0A,0x91, + 0x89,0x18,0x09,0x91,0x88,0x83,0x04,0x98,0x1D,0x49,0x40,0x00,0x40,0x18,0x40,0x30, + 0x08,0x90,0x80,0x88,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0x9E,0xFF,0x09,0x99,0xC8,0x83, + 0x0B,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19,0xFE,0xF7,0x70,0xF8,0x0A,0x99,0x23,0x22, + 0x52,0x01,0x89,0x18,0x07,0x91,0x08,0x80,0x08,0x98,0x0A,0x21,0x80,0x88,0x80,0x19, + 0xFE,0xF7,0x64,0xF8,0x07,0x99,0x48,0x80,0x03,0x98,0x40,0x00,0x00,0xE0,0x09,0xE0, + 0x0A,0x21,0xFE,0xF7,0x5B,0xF8,0x0D,0x99,0x64,0x1C,0xC8,0x80,0x0E,0x98,0xC0,0x7E, + 0xA0,0x42,0xAD,0xDC,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x03,0x49,0xCA,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0x02,0x43, + 0xCA,0x61,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x01,0x22,0x10,0xB5,0x08,0x49,0x09,0x48,0x52,0x02,0x02,0xF0, + 0xC4,0xFC,0x08,0x48,0x01,0x22,0xC0,0x8E,0x92,0x02,0x01,0x04,0x01,0x43,0x06,0x48, + 0x02,0xF0,0xCE,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x7E,0x00,0x00, + 0x00,0x00,0x10,0x40,0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0x02,0x48,0x81,0x6B, + 0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49, + 0x0A,0x48,0xFC,0x22,0x02,0xF0,0x99,0xFC,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32, + 0x02,0xF0,0x93,0xFC,0x01,0x22,0x08,0x49,0x08,0x48,0x52,0x02,0x02,0xF0,0x8D,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x7B,0x00,0x00,0x04,0x90,0x00,0x40, + 0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40, + 0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60, + 0x18,0x48,0xA6,0x15,0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7, + 0xB5,0xFF,0x32,0x00,0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0xB7,0xFF,0x12,0x48, + 0x75,0x00,0x04,0x04,0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xA6,0xFF, + 0x0E,0x49,0x2A,0x00,0x20,0x00,0x00,0x23,0xFD,0xF7,0xA8,0xFF,0x0C,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x29,0x00,0x20,0x00,0xFD,0xF7,0x98,0xFF,0x09,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0x9A,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x90,0x00,0x40,0x00,0x7B,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07, + 0xFC,0xD0,0xFE,0xF7,0x51,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0xF1,0xB5,0x55,0x4E,0x53,0x4B,0xF2,0x88,0x98,0x88,0x54,0x49,0x54,0x06,0x82,0xB0, + 0x00,0xD4,0x08,0x88,0x52,0x06,0x01,0x90,0x98,0x79,0x00,0xD4,0x88,0x78,0x37,0x00, + 0x00,0x25,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0xFF,0x37,0x61,0x37, + 0x00,0x90,0x11,0xE0,0x0A,0x20,0x60,0x43,0x43,0x21,0x80,0x19,0xC9,0x00,0x09,0x5C, + 0x00,0x29,0x08,0xD0,0x46,0x49,0x40,0x18,0x01,0xF0,0x88,0xF9,0x00,0x28,0x02,0xD0, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x78,0xA0,0x42,0xEA,0xDA,0x41,0x49, + 0x08,0x00,0x20,0x30,0xCA,0x8B,0x43,0x88,0xD4,0x1A,0x00,0x2C,0x00,0xDC,0x9C,0x1A, + 0x22,0x04,0x03,0x88,0x84,0x88,0x12,0x0C,0x1F,0x1B,0x00,0x2F,0x00,0xDC,0xE7,0x1A, + 0x84,0x7A,0x3B,0x04,0x1B,0x0C,0x00,0x2C,0x04,0xD0,0x44,0x7B,0xC8,0x2C,0x01,0xD2, + 0x64,0x1C,0x44,0x73,0x8C,0x7B,0x14,0x2C,0x04,0xD2,0x0C,0x7C,0x00,0x2C,0x01,0xD0, + 0x01,0x24,0x4C,0x74,0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7B,0xC8,0x2C, + 0x01,0xD2,0x64,0x1C,0xCC,0x73,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B, + 0x05,0xD2,0x08,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x08,0x24, + 0x04,0x5F,0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x04,0x81,0x44,0x7B,0x01,0x2C,0x01,0xD9, + 0x78,0x21,0x10,0xE0,0x02,0x2D,0x0F,0xD2,0x08,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD, + 0xC9,0x7B,0x14,0x29,0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B, + 0x02,0xD2,0x77,0x21,0xC9,0x43,0xC1,0x80,0x00,0x21,0x02,0x2D,0x01,0x73,0x0E,0xD2, + 0x06,0x21,0x41,0x5E,0x78,0x31,0x04,0xD1,0xC1,0x7A,0xC8,0x29,0x01,0xD2,0x49,0x1C, + 0xC1,0x72,0xC1,0x7A,0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x73,0x06,0x21, + 0x41,0x5E,0x01,0x98,0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1, + 0x31,0x79,0x01,0x29,0x02,0xD0,0x00,0x99,0xFD,0xF7,0xDE,0xFD,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20,0xFF,0x21,0x03,0x31,0x08,0x00,0x49,0x1E, + 0x00,0x28,0xFB,0xD1,0x70,0x47,0x15,0x21,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1, + 0x70,0x47,0x00,0x00,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47, + 0x00,0x70,0x00,0x40,0x70,0x47,0x00,0x00,0xFE,0xB5,0x1E,0x4A,0x1C,0x48,0xD1,0x88, + 0x00,0x25,0x00,0x7A,0x2E,0x00,0x2F,0x00,0x49,0x06,0x02,0xD4,0x18,0x48,0xC0,0x38, + 0x00,0x79,0x19,0x49,0x89,0x8A,0x40,0x18,0x01,0x06,0x18,0x48,0x09,0x0E,0x00,0x78, + 0x00,0x28,0x01,0x90,0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0,0x0A,0x20, + 0x60,0x43,0x10,0x49,0x40,0x18,0xFF,0x30,0x61,0x30,0x80,0x7A,0x14,0x28,0x01,0xD2, + 0x01,0x26,0x07,0xE0,0x01,0x27,0x14,0x21,0xFD,0xF7,0x68,0xFE,0x00,0x99,0x88,0x42, + 0x00,0xD3,0x01,0x25,0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F,0x02,0xD1, + 0x00,0x2E,0x00,0xD0,0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20, + 0x13,0x48,0x10,0xB5,0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29, + 0x01,0xD0,0x04,0x29,0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40, + 0x20,0x29,0x02,0xD2,0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0x85,0xFA,0x09,0x48, + 0x82,0x68,0x81,0x15,0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48, + 0x00,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x15,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x40,0x00,0x30,0x00,0x40,0x00,0x40,0xF8,0x0A,0x00,0x20,0xF1,0xB5,0x61,0x48, + 0x2E,0x21,0x90,0xB0,0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26, + 0x76,0x07,0xF1,0x63,0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0, + 0x5B,0xFA,0x59,0x4D,0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0xFB,0xF9,0x10,0x9B, + 0x00,0x21,0x01,0x20,0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0x34,0xFA, + 0x1E,0x16,0x40,0x40,0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x40, + 0x4F,0x68,0x6F,0x76,0x7D,0x85,0x40,0x8C,0x93,0x4F,0x40,0x40,0x40,0x40,0x9A,0x40, + 0x0B,0x20,0xF0,0x63,0x4D,0xE0,0x00,0xF0,0x19,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x21,0xF9,0x00,0xF0,0x45,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68, + 0x52,0x68,0x91,0x42,0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18, + 0x49,0x1C,0xC1,0x83,0xFD,0xF7,0x5E,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7, + 0x21,0xFE,0xA8,0x78,0x80,0x07,0x01,0xD5,0x04,0xF0,0x72,0xF9,0x3A,0x49,0x40,0x22, + 0x68,0x46,0x02,0xF0,0x82,0xFA,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0x80,0xF9, + 0xF7,0x63,0x1E,0xE0,0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x04,0xF0,0x0A,0xF8,0xF0,0xE7,0x03,0x21, + 0x09,0x07,0xCA,0x60,0xFE,0xF7,0xE8,0xF8,0x10,0x98,0xFE,0xF7,0x3B,0xF8,0x08,0xE0, + 0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7,0xDF,0xF8,0x00,0xF0,0x83,0xFD,0x00,0xF0, + 0xEF,0xF8,0x20,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x71,0xD2,0xE7,0xA9,0x71,0xD0,0xE7,0x00,0x2C, + 0x02,0xD0,0x01,0x20,0xE8,0x71,0xCB,0xE7,0xE9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0x28,0x72,0xC4,0xE7,0x29,0x72,0xC2,0xE7,0x00,0x2C,0x03,0xD0,0x20,0x0C, + 0x6C,0x72,0x28,0x82,0xBC,0xE7,0x69,0x72,0xBA,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0xA8,0x72,0xB5,0xE7,0xA9,0x72,0xB3,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72, + 0xAE,0xE7,0xE9,0x72,0xAC,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA7,0xE7, + 0x29,0x73,0xA5,0xE7,0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x03,0xF0, + 0x15,0xFE,0x9D,0xE7,0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0xC0,0x75,0x00,0x00,0xF0,0xB5,0x38,0x4F, + 0x35,0x4C,0xF9,0x78,0x03,0x00,0x35,0x4A,0x0E,0x04,0x39,0x79,0x35,0x48,0x25,0x68, + 0x0E,0x43,0x35,0x49,0x30,0x3B,0x04,0xF0,0x77,0xF9,0x12,0x0A,0x0C,0x0E,0x12,0x16, + 0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16,0x3E,0x43,0x48,0x4E,0x51,0x0A,0xCD,0x61, + 0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C, + 0x52,0x8C,0x00,0x04,0x35,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68, + 0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48,0x03,0x7A,0x10,0x7D, + 0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43, + 0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06, + 0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7, + 0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7, + 0x00,0x69,0xFA,0x89,0x40,0x08,0x00,0x02,0x03,0xE0,0x13,0x48,0xA2,0x69,0xC0,0x8B, + 0x00,0x04,0x10,0x43,0xC1,0xE7,0x00,0x69,0x40,0x08,0xBE,0xE7,0xB8,0x69,0xBC,0xE7, + 0x48,0x69,0x10,0x42,0xFC,0xD1,0x03,0xF0,0x37,0xF9,0xFF,0x20,0x01,0x21,0x49,0x07, + 0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00,0x00,0x78,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20, + 0x70,0x0A,0x00,0x20,0x00,0x7B,0x00,0x00,0xE0,0x7A,0x00,0x00,0x70,0xB5,0x03,0x24, + 0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x23,0xF8,0x06,0x00, + 0xCB,0x20,0xC0,0x01,0xFE,0xF7,0x00,0xF8,0x02,0xF0,0xDA,0xFF,0x01,0x20,0x40,0x05, + 0xFF,0xF7,0x88,0xFC,0x00,0xF0,0xBC,0xFC,0x00,0x20,0xFF,0xF7,0x83,0xFC,0x02,0xF0, + 0xC3,0xFF,0x30,0x00,0xFE,0xF7,0x22,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x02,0xF0,0xC0,0xFF, + 0x00,0x20,0xFF,0xF7,0x6F,0xFC,0xFF,0xF7,0xED,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07, + 0xFC,0xD0,0x01,0x20,0x40,0x07,0x04,0xF0,0xCD,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x90,0x00,0x40,0xF8,0xB5,0x27,0x49,0x25,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06, + 0x02,0xD4,0x23,0x48,0xC0,0x38,0x80,0x89,0xC0,0x06,0x3D,0xD5,0x22,0x4E,0x30,0x78, + 0x00,0x28,0x39,0xD0,0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25,0x31,0xE0,0x0A,0x21, + 0x69,0x43,0x1C,0x4B,0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78,0x61,0x34,0x25,0xE0, + 0x0A,0x22,0x42,0x43,0xD2,0x18,0xFF,0x32,0xA1,0x32,0x21,0x79,0x92,0x7F,0x91,0x42, + 0x1B,0xD1,0x0A,0x22,0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21,0xC1,0x37,0x00,0x20, + 0x61,0x5E,0x38,0x5E,0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21,0x61,0x5E,0x89,0x1A, + 0x00,0x91,0x3A,0x88,0xE1,0x88,0xFF,0xF7,0xD7,0xF9,0xE0,0x80,0x7A,0x88,0x21,0x89, + 0x00,0x98,0xFF,0xF7,0xD1,0xF9,0x20,0x81,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD7,0xDA, + 0x6D,0x1C,0x30,0x78,0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0xB5,0x00,0x20, + 0xB1,0xB0,0x11,0x90,0x10,0x90,0x0F,0x90,0x0E,0x90,0xFA,0x48,0xFB,0x4D,0x01,0x8C, + 0xF9,0x4A,0x0B,0x91,0x40,0x8C,0xFA,0x49,0x0A,0x90,0xE8,0x88,0x13,0x7B,0x44,0x06, + 0x00,0xD4,0x0B,0x7A,0x54,0x7B,0x46,0x06,0x00,0xD4,0x4C,0x7A,0x46,0x06,0x09,0x94, + 0x94,0x7E,0x00,0xD4,0x8C,0x7D,0x46,0x06,0x08,0x94,0x54,0x7E,0x00,0xD4,0x4C,0x7D, + 0x07,0x94,0xEF,0x4C,0x40,0x34,0x24,0x8A,0x46,0x06,0x02,0xD4,0xEC,0x4C,0x80,0x3C, + 0xA4,0x89,0x24,0x07,0x42,0xD5,0xD4,0x7B,0x46,0x06,0x00,0xD4,0xCC,0x7A,0x5C,0x43, + 0x26,0x94,0x14,0x7C,0x46,0x06,0x00,0xD4,0x0C,0x7B,0x5C,0x43,0x25,0x94,0x54,0x7C, + 0x46,0x06,0x00,0xD4,0x4C,0x7B,0x5C,0x43,0x24,0x94,0x94,0x7C,0x46,0x06,0x00,0xD4, + 0x8C,0x7B,0x5C,0x43,0x23,0x94,0xD4,0x7C,0x46,0x06,0x00,0xD4,0xCC,0x7B,0x5C,0x43, + 0x22,0x94,0x14,0x7D,0x46,0x06,0x00,0xD4,0x0C,0x7C,0x5C,0x43,0x21,0x94,0x54,0x7D, + 0x46,0x06,0x00,0xD4,0x4C,0x7C,0x5C,0x43,0x20,0x94,0x94,0x7D,0x46,0x06,0x00,0xD4, + 0x8C,0x7C,0x5C,0x43,0x1F,0x94,0xD4,0x7D,0x46,0x06,0x00,0xD4,0xCC,0x7C,0x5C,0x43, + 0x1E,0x94,0x12,0x7E,0x40,0x06,0x00,0xD4,0x0A,0x7D,0xCE,0x48,0x5A,0x43,0x1D,0x92, + 0x30,0x90,0x00,0x78,0x00,0x28,0x05,0xD1,0x00,0xF0,0xF0,0xFE,0x31,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x27,0x90,0xC7,0x48,0x2F,0x90,0xC3,0x4D,0x27,0x98, + 0x13,0x21,0x28,0x18,0x49,0x01,0x2E,0x90,0x40,0x18,0x04,0x7F,0x00,0x2C,0x0F,0xD0, + 0x08,0x98,0x00,0x28,0x08,0xD1,0x0A,0x20,0x60,0x43,0x40,0x19,0xFF,0x30,0x6B,0x30, + 0x00,0xF0,0x04,0xFE,0x00,0x28,0x03,0xD0,0x2F,0x98,0x00,0x7B,0x00,0x28,0x03,0xD0, + 0x27,0x98,0xFF,0xF7,0xCB,0xF8,0xA0,0xE2,0x27,0x99,0x15,0x27,0x07,0x20,0x7F,0x01, + 0x4E,0x00,0x01,0x01,0x49,0x19,0x89,0x19,0xCA,0x19,0xD2,0x8A,0x0B,0x23,0x9B,0x01, + 0xCB,0x18,0xDA,0x80,0x0D,0x22,0x92,0x01,0x89,0x18,0xCA,0x88,0x40,0x1E,0xCA,0x82, + 0xEF,0xD5,0x0A,0x20,0x44,0x43,0x64,0x19,0x2D,0x94,0xFF,0x34,0x61,0x34,0xE1,0x88, + 0x0B,0x98,0x40,0x1E,0x81,0x42,0xDE,0xDC,0x21,0x89,0x0A,0x98,0x40,0x1E,0x81,0x42, + 0xD9,0xDC,0xA2,0x48,0xE1,0x88,0x35,0x18,0xE8,0x19,0x2C,0x90,0x0D,0x23,0xC1,0x82, + 0x21,0x89,0x9B,0x01,0xE8,0x18,0x2B,0x90,0xC1,0x80,0x00,0x20,0x01,0x21,0xC9,0x02, + 0x06,0x90,0x05,0x90,0x07,0x20,0x04,0x91,0x98,0x4A,0x03,0x01,0x9A,0x18,0x92,0x19, + 0x15,0x23,0x5B,0x01,0x94,0x46,0xD2,0x18,0x16,0x23,0xD3,0x5E,0x00,0x2B,0x07,0xDD, + 0x06,0x9F,0xBB,0x42,0x01,0xDD,0xD7,0x8A,0x06,0x97,0x8B,0x42,0x00,0xDA,0xD1,0x8A, + 0x0D,0x23,0x9B,0x01,0x62,0x46,0xD2,0x18,0x06,0x23,0xD3,0x5E,0x00,0x2B,0x09,0xDD, + 0x05,0x9F,0xBB,0x42,0x01,0xDD,0xD7,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x01,0xDA, + 0xD2,0x88,0x04,0x92,0x40,0x1E,0xD7,0xD5,0x06,0x98,0x40,0x1A,0xF0,0x28,0x04,0xDC, + 0x04,0x99,0x05,0x98,0x40,0x1A,0xF0,0x28,0x02,0xDD,0x2F,0x99,0x01,0x20,0x88,0x72, + 0x2E,0x98,0x15,0x21,0x49,0x01,0x40,0x18,0x2A,0x90,0x80,0x7B,0x01,0x28,0x1B,0xD9, + 0x2C,0x98,0x16,0x21,0x41,0x5E,0x0B,0x20,0x80,0x01,0x28,0x18,0x06,0x22,0x82,0x5E, + 0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14,0x0D,0x90,0x2B,0x98, + 0x06,0x21,0x16,0x22,0x41,0x5E,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A, + 0x00,0x04,0x00,0x14,0x0C,0x90,0x02,0xE0,0x64,0x20,0x0C,0x90,0x0D,0x90,0x0B,0x20, + 0x80,0x01,0x2F,0x18,0x2C,0x9A,0x06,0x21,0x16,0x20,0x79,0x5E,0x10,0x5E,0x02,0xF0, + 0x69,0xFF,0x13,0x90,0x2B,0x98,0x16,0x21,0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E, + 0x02,0xF0,0x60,0xFF,0x12,0x90,0x16,0x21,0x79,0x5E,0x13,0x98,0x02,0xF0,0x5A,0xFF, + 0x15,0x90,0x1B,0x20,0x40,0x01,0x28,0x18,0x06,0x21,0x29,0x90,0x41,0x5E,0x12,0x98, + 0x02,0xF0,0x50,0xFF,0x14,0x90,0x17,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21, + 0x82,0x5E,0x41,0x5E,0x15,0x98,0x02,0xF0,0x47,0xFF,0x00,0x04,0x00,0x14,0x17,0x90, + 0x07,0x20,0xC0,0x01,0x2F,0x18,0x29,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E, + 0x14,0x98,0x02,0xF0,0x39,0xFF,0x00,0x04,0x00,0x14,0x16,0x90,0x03,0x20,0x00,0x02, + 0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x02,0xF0,0x2C,0xFF, + 0x00,0x04,0x00,0x14,0x19,0x90,0x1D,0x20,0x40,0x01,0x28,0x18,0x28,0x90,0x06,0x22, + 0x82,0x5E,0x16,0x21,0x79,0x5E,0x16,0x98,0x02,0xF0,0x1E,0xFF,0x00,0x04,0x00,0x14, + 0x18,0x90,0x19,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E, + 0x19,0x98,0x02,0xF0,0x11,0xFF,0x00,0x04,0x00,0x14,0x1B,0x90,0x0F,0x20,0x80,0x01, + 0x2F,0x18,0x28,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x18,0x98,0x02,0xF0, + 0x03,0xFF,0x00,0x04,0x00,0x14,0x1A,0x90,0x0C,0x99,0x0D,0x98,0x00,0xF0,0x5A,0xFF, + 0x01,0x21,0x84,0x46,0x88,0x02,0x2D,0x4B,0x0A,0x01,0xD2,0x18,0x93,0x19,0x1F,0x22, + 0x52,0x01,0x9A,0x18,0xD2,0x8A,0x1B,0x18,0x49,0x1E,0xDA,0x80,0xF3,0xD5,0x1F,0x21, + 0x49,0x01,0x6A,0x18,0x60,0x46,0xD0,0x82,0x2E,0x9A,0x00,0x20,0x55,0x18,0xAA,0x7B, + 0x00,0x2A,0x94,0x46,0x0B,0xDB,0x21,0x4B,0x11,0x01,0xC9,0x18,0x1F,0x23,0x89,0x19, + 0x5B,0x01,0xCB,0x18,0x16,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF3,0xD5,0x61,0x46, + 0x49,0x1C,0xFD,0xF7,0x99,0xF9,0x25,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20, + 0x0F,0xE0,0x23,0x98,0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x21,0x98,0x86,0x42, + 0x01,0xDC,0x03,0x20,0x05,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0, + 0x05,0x20,0xA9,0x79,0x40,0x1A,0x09,0x99,0x49,0x42,0x00,0x28,0x08,0xDD,0x16,0x20, + 0x38,0x5E,0x09,0x9B,0x98,0x42,0x01,0xD1,0x00,0x20,0x08,0xE0,0x40,0x1C,0x06,0xE0, + 0x00,0x28,0x0A,0x48,0x38,0x5E,0x13,0xDA,0x88,0x42,0xF5,0xD0,0x40,0x1E,0xF8,0x82, + 0x11,0xE0,0x00,0x00,0x00,0x78,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x60,0x79,0x00,0x00,0x50,0x07,0x00,0x20,0x90,0x08,0x00,0x20,0x16,0x00,0x00,0x00, + 0x00,0x28,0xEB,0xDC,0xE2,0xDB,0x16,0x20,0x38,0x5E,0x09,0x9B,0x98,0x42,0x05,0xD1, + 0xAB,0x79,0x05,0x2B,0x02,0xD2,0x5B,0x1C,0xAB,0x71,0x06,0xE0,0x88,0x42,0x04,0xD1, + 0xA8,0x79,0x01,0x28,0x01,0xD9,0x40,0x1E,0xA8,0x71,0x1A,0x99,0x1B,0x98,0x1C,0x91, + 0x2A,0x99,0x8F,0x7B,0x39,0x00,0xFD,0xF7,0x3F,0xF9,0x11,0x90,0x0F,0x90,0x1C,0x98, + 0x39,0x00,0xFD,0xF7,0x39,0xF9,0x10,0x90,0x0E,0x90,0xA8,0x79,0x01,0x28,0x27,0xD1, + 0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x1A,0x9B,0x1B,0x9A,0x09,0x21,0x38,0x00, + 0x03,0xF0,0xDE,0xFA,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x18,0x9B, + 0x80,0x7B,0x19,0x9A,0x07,0x21,0x03,0xF0,0xD3,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21, + 0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22, + 0x9A,0x5E,0x25,0x9B,0x00,0x92,0x2D,0x98,0x26,0x9A,0xFF,0x30,0x65,0x30,0x9A,0xE0, + 0x02,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x18,0x9B,0x19,0x9A, + 0x07,0x21,0x38,0x00,0x03,0xF0,0xB4,0xFA,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x2A,0x98,0x16,0x9B,0x80,0x7B,0x17,0x9A,0x05,0x21,0x03,0xF0,0xA9,0xFA,0x6B,0x46, + 0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF, + 0x07,0xC7,0x04,0x22,0x9A,0x5E,0x00,0x92,0x2D,0x98,0x23,0x9B,0xFF,0x30,0x24,0x9A, + 0x65,0x30,0x70,0xE0,0x03,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3, + 0x16,0x9B,0x17,0x9A,0x05,0x21,0x38,0x00,0x03,0xF0,0x8A,0xFA,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0x2A,0x98,0x14,0x9B,0x80,0x7B,0x15,0x9A,0x03,0x21,0x03,0xF0, + 0x7F,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB, + 0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x21,0x9B,0x00,0x92,0x2D,0x98, + 0x22,0x9A,0xFF,0x30,0x65,0x30,0x46,0xE0,0x04,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9, + 0x68,0x46,0x06,0xC0,0x14,0x9B,0x15,0x9A,0x03,0x21,0x38,0x00,0x03,0xF0,0x60,0xFA, + 0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x12,0x9B,0x80,0x7B,0x13,0x9A, + 0x02,0x21,0x03,0xF0,0x55,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E, + 0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x1F,0x9B, + 0x00,0x92,0x2D,0x98,0x20,0x9A,0xFF,0x30,0x65,0x30,0x1C,0xE0,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0x12,0x9B,0x13,0x9A,0x02,0x21,0x38,0x00,0x03,0xF0,0x38,0xFA, + 0x10,0xAB,0x00,0x22,0x04,0x21,0x9A,0x5E,0x59,0x5E,0x2B,0x9B,0x06,0x20,0x18,0x5E, + 0x01,0xAB,0x07,0xC3,0x2C,0x98,0x16,0x22,0x82,0x5E,0x1D,0x9B,0x00,0x92,0x2D,0x98, + 0x1E,0x9A,0xFF,0x30,0x65,0x30,0x31,0x00,0x03,0xF0,0x36,0xFA,0x2A,0x98,0x3C,0x49, + 0x80,0x7B,0x09,0x28,0x02,0xD2,0x2A,0x9A,0x40,0x1C,0x90,0x73,0xA8,0x7B,0x02,0x28, + 0x01,0xD2,0x40,0x1C,0xA8,0x73,0x20,0x79,0x40,0x1E,0x80,0x00,0x41,0x18,0x21,0x20, + 0x40,0x01,0x0D,0x18,0x06,0x20,0x28,0x5E,0x00,0x28,0x22,0xDB,0x08,0x21,0x69,0x5E, + 0x00,0x29,0x1E,0xDB,0x07,0x99,0x64,0x22,0x56,0x1A,0x70,0x43,0x11,0x00,0xFD,0xF7, + 0x4B,0xF8,0x07,0x00,0xE0,0x88,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x1E,0xF9, + 0x38,0x18,0xE0,0x80,0x08,0x20,0x28,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x3C,0xF8, + 0x06,0x00,0x20,0x89,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x0F,0xF9,0x30,0x18, + 0x20,0x81,0xE0,0x88,0xE8,0x80,0x20,0x89,0x28,0x81,0x27,0x98,0x40,0x1C,0x08,0x28, + 0x27,0x90,0x00,0xDA,0x3A,0xE5,0x30,0x98,0x01,0x78,0x1A,0x48,0x01,0x29,0x1F,0xD1, + 0x30,0x99,0x89,0x7B,0x4A,0x00,0x16,0x49,0x51,0x18,0x15,0x22,0x52,0x01,0x8A,0x18, + 0x92,0x8A,0xC2,0x83,0x0D,0x22,0x92,0x01,0x8A,0x18,0x94,0x88,0x2F,0x9B,0x1C,0x80, + 0x0B,0x23,0x9B,0x01,0xC9,0x18,0x8B,0x88,0x2F,0x99,0x4B,0x80,0x92,0x8A,0x2F,0x99, + 0x8A,0x80,0x30,0x99,0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x0D,0xE5, + 0x02,0x29,0xFC,0xD1,0x30,0x99,0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83, + 0x30,0x99,0x49,0x8B,0x41,0x83,0x30,0x99,0x89,0x8B,0x81,0x83,0xFE,0xE4,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x70,0x08,0x00,0x20,0x14,0x20,0x9F,0xE5,0x01,0x10,0x81,0xE2, + 0x00,0x20,0xD2,0xE5,0x02,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x01,0x00,0x80,0xE2, + 0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20,0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E, + 0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B,0x1B,0x7A,0x9E,0x46,0x19,0x4B,0x1E,0x78, + 0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E, + 0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98, + 0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1, + 0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1, + 0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42, + 0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0x00,0x78,0x00,0x00, + 0x70,0x0A,0x00,0x20,0xFD,0x0A,0x00,0x20,0x78,0x47,0xC0,0x46,0x14,0x20,0x9F,0xE5, + 0x02,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5,0x04,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0, + 0x02,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20,0xFE,0xB5,0x04,0x00, + 0x88,0x1A,0xC0,0x1A,0x0D,0x00,0x16,0x00,0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E, + 0x1F,0x00,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x16,0xFD, + 0x69,0x00,0x01,0x90,0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E, + 0x61,0x5E,0x18,0x00,0x00,0xF0,0x0A,0xFD,0x00,0x90,0xA8,0x19,0xC0,0x19,0x41,0x00, + 0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00, + 0x00,0xF0,0xFC,0xFC,0x02,0x00,0x00,0x99,0x01,0x98,0x00,0xF0,0xF7,0xFC,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0x04,0x4B,0x03,0x4A,0x1B,0x78,0x58,0x43,0x40,0x18,0x40,0x00, + 0x10,0x5A,0x70,0x47,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x04,0x48,0x41,0x69, + 0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47, + 0x00,0x40,0x00,0x30,0x0D,0x49,0x01,0x20,0x10,0xB5,0x40,0x07,0x4A,0x69,0x92,0x06, + 0xFC,0xD4,0xCA,0x68,0x4B,0x68,0x4B,0x60,0x04,0xE0,0x4B,0x69,0x9B,0x06,0xFC,0xD4, + 0x8B,0x69,0x08,0xC0,0x52,0x1E,0xF8,0xD2,0x2E,0x20,0x48,0x60,0x48,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0x51,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5, + 0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5, + 0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5, + 0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5, + 0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A, + 0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA, + 0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5, + 0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3, + 0x10,0x40,0xBD,0x08,0xFD,0x09,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3, + 0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A,0xF4,0x09,0x00,0xEB,0xD2,0xFF,0xFF,0xEA, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69, + 0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48, + 0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E, + 0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1, + 0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0, + 0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0xBB,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69, + 0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5, + 0x02,0xF0,0xAA,0xFB,0xC3,0xE7,0x00,0x00,0xFA,0x0A,0x00,0x20,0x00,0x40,0x00,0x30, + 0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20, + 0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29,0x80,0x7A,0x01,0xD1,0x01,0x25,0x03,0xE0, + 0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x25,0x27, + 0x7F,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x08,0x38, + 0x01,0xF0,0xF6,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00, + 0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00, + 0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19,0x36,0x7E,0x9E,0x42,0x01,0xD1,0x04,0x00, + 0x02,0xE0,0x40,0x1C,0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18, + 0xF6,0x19,0x36,0x7E,0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x76,0xED,0xE7, + 0x40,0x1C,0x08,0x28,0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18, + 0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00, + 0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7E,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23, + 0xE4,0x19,0x23,0x76,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x02,0xE0,0x40,0x1C,0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20, + 0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43, + 0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C, + 0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60, + 0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50, + 0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47,0x2C,0x0B,0x00,0x20,0xF0,0xB5,0x87,0xB0, + 0xFE,0xF7,0x8A,0xFB,0xFE,0xF7,0x68,0xFB,0x02,0xF0,0xCE,0xF9,0x00,0xF0,0xC8,0xFD, + 0x00,0xF0,0x74,0xFB,0xFD,0xF7,0xDA,0xFF,0xFD,0xF7,0x18,0xFA,0x48,0x49,0x47,0x48, + 0xC9,0x88,0x40,0x7F,0x49,0x06,0x02,0xD4,0x44,0x48,0xC0,0x38,0x40,0x7E,0x00,0x28, + 0x04,0xD1,0xFF,0xF7,0x43,0xFA,0xFF,0xF7,0xED,0xF9,0x03,0xE0,0xFF,0xF7,0xEA,0xF9, + 0xFF,0xF7,0x3C,0xFA,0x02,0xF0,0x5E,0xFC,0x02,0xF0,0xE2,0xFA,0x01,0x26,0x76,0x07, + 0x30,0x68,0x00,0x28,0x08,0xD0,0x70,0x68,0x80,0x0F,0x80,0x07,0x04,0xD5,0x37,0x68, + 0x02,0x24,0x7F,0x1C,0x25,0x00,0x3A,0xE0,0x01,0x24,0x27,0x00,0x25,0x00,0xA0,0x00, + 0x80,0x19,0x06,0x90,0x00,0x68,0x81,0x01,0x05,0x90,0x80,0x05,0x80,0x0D,0x03,0x90, + 0x30,0x48,0x89,0x0D,0x04,0x91,0x00,0x78,0x00,0x28,0x03,0xD1,0x03,0xA9,0x04,0xA8, + 0x02,0xF0,0x02,0xFB,0x2C,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04,0x12,0x0C, + 0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x03,0xA9,0x40,0x1E,0x03,0x04,0x1B,0x0C, + 0x04,0xA8,0x03,0xF0,0x61,0xFA,0x03,0xA9,0x04,0xA8,0x03,0xF0,0x35,0xF9,0x23,0x49, + 0x05,0x98,0x08,0x40,0x04,0x99,0x89,0x05,0x89,0x09,0x08,0x43,0x03,0x99,0x80,0x0A, + 0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x06,0x99,0x08,0x60,0x64,0x1C,0xBC,0x42, + 0xC5,0xD9,0x30,0x68,0xFC,0xF7,0x28,0xFF,0xFD,0xF7,0x0C,0xFE,0x30,0x68,0x18,0x49, + 0x88,0x72,0x88,0x7A,0x00,0x28,0x06,0xD1,0x15,0x48,0x20,0x22,0x00,0x21,0x0C,0x30, + 0x01,0xF0,0xE6,0xFA,0x10,0xE0,0x00,0x20,0x13,0x23,0x0D,0x4A,0x9B,0x01,0x08,0xE0, + 0x44,0x19,0xA4,0x00,0xA4,0x19,0x24,0x68,0x87,0x00,0xBF,0x18,0xFF,0x18,0x40,0x1C, + 0xFC,0x60,0x8C,0x7A,0x84,0x42,0xF3,0xD8,0xFF,0xF7,0xC0,0xFE,0xFC,0xF7,0x50,0xFE, + 0x03,0x48,0x40,0x79,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x03,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xFF,0xFF,0x00,0xFC, + 0xB0,0x0A,0x00,0x20,0xF8,0xB5,0x02,0xF0,0x0B,0xF9,0xFE,0xF7,0xAB,0xFD,0xFE,0xF7, + 0x39,0xFE,0xFE,0xF7,0x81,0xFE,0x1A,0x48,0x00,0x21,0xC0,0x7F,0x03,0xF0,0x52,0xF8, + 0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20,0x28,0x70,0xE8,0x61,0xE8,0x79,0x00,0x28, + 0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68,0x00,0x07,0x12,0xD5,0xA6,0x63,0xF8,0x68, + 0x07,0x28,0x06,0xD1,0x02,0xF0,0x20,0xFA,0xFF,0xF7,0x00,0xF9,0xFF,0x20,0xE0,0x63, + 0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0x13,0xFA,0xE0,0x6B,0x0B,0x28,0xE6,0xD1,0xFE,0xF7,0x98,0xF9,0x28,0x78,0x00,0x28, + 0xD9,0xD0,0x01,0xF0,0xEF,0xFE,0xD6,0xE7,0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7, + 0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20,0x70,0xB5,0x21,0x49, + 0x1F,0x4A,0xCB,0x88,0x05,0x00,0x10,0x7A,0x1F,0x49,0x5C,0x06,0x00,0xD4,0x08,0x79, + 0x1E,0x4C,0xA4,0x8A,0x00,0x19,0x06,0x06,0xD0,0x79,0x36,0x0E,0x5A,0x06,0x00,0xD4, + 0xC8,0x78,0x1B,0x49,0x2C,0x78,0x4A,0x7C,0x00,0x2A,0x0F,0xD1,0x8A,0x7C,0x00,0x2A, + 0x01,0xD0,0x80,0x1C,0x08,0xE0,0xCA,0x7C,0x00,0x2A,0x01,0xD0,0x00,0x1D,0x03,0xE0, + 0x09,0x7D,0x00,0x29,0x02,0xD0,0x80,0x1D,0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0, + 0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7,0x80,0xFD,0x76,0x1C,0xB0,0x42, + 0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C, + 0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70,0x01,0x20,0xF4,0xE7,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20, + 0x70,0x08,0x00,0x20,0x10,0xB5,0x08,0x24,0x20,0x00,0xFE,0xF7,0x0B,0xFA,0x64,0x1E, + 0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1, + 0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0x19,0x22,0x10,0xB5, + 0x06,0x48,0x52,0x01,0x00,0x21,0x01,0xF0,0x13,0xFA,0x51,0x22,0x04,0x48,0xD2,0x00, + 0x00,0x21,0x01,0xF0,0x0D,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0xC8,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0, + 0xFF,0xF9,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5, + 0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0x01,0xF0,0xDE,0xF9,0x10,0x48,0xC0,0x07, + 0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19, + 0x01,0xF0,0xCA,0xF9,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0, + 0xE7,0xF9,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48, + 0x92,0x0F,0x00,0x19,0x01,0xF0,0xD4,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x00,0x00,0x00,0x38,0x71,0x00,0x00,0xF0,0x05,0x00,0x20,0x46,0x06,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x33,0x21,0x09,0x05,0x01,0x20,0x80,0x07,0x41,0x62,0x04,0x49, + 0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00, + 0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21, + 0x41,0x60,0x70,0x47,0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24, + 0x20,0x00,0xFE,0xF7,0xFB,0xF9,0x64,0x1C,0x08,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00,0xFD,0xF7,0x0C,0xF8, + 0xFE,0xF7,0xC0,0xFC,0xFE,0xF7,0xEA,0xFC,0xFE,0xF7,0xB4,0xFC,0x07,0x48,0x01,0x68, + 0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60, + 0x20,0x00,0xFC,0xF7,0xF1,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40, + 0x00,0x78,0x00,0x00,0x10,0xB5,0x01,0xF0,0xB3,0xFF,0x01,0xF0,0x93,0xFF,0xFF,0x20, + 0xFD,0xF7,0x22,0xF8,0xFF,0xF7,0xAE,0xFF,0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0, + 0x77,0xF9,0x08,0x20,0xFC,0xF7,0xE0,0xFF,0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20, + 0xFF,0xF7,0xE0,0xFD,0x00,0xF0,0x1A,0xF8,0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0, + 0x40,0x20,0xFC,0xF7,0xD1,0xFF,0x00,0xF0,0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20, + 0x01,0xF0,0x81,0xFF,0xFE,0xF7,0xEE,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x2C,0x0B,0x00,0x20,0x02,0x03,0x0F,0x0F,0x00,0x78,0x00,0x00,0xF8,0xB5,0x03,0x24, + 0xE6,0x01,0x13,0x25,0x30,0x00,0xFC,0xF7,0xB7,0xFF,0x20,0x02,0xFC,0xF7,0xDE,0xFF, + 0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7,0x71,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31, + 0x02,0x20,0x00,0x23,0x00,0x95,0x02,0xF0,0x8B,0xFF,0x07,0x4A,0x27,0x21,0x03,0x20, + 0x00,0x23,0x00,0x94,0x02,0xF0,0x84,0xFF,0x30,0x00,0xFC,0xF7,0x95,0xFF,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49, + 0x00,0x20,0xFF,0xF7,0xA9,0xFD,0x03,0xF0,0x68,0xF8,0x7D,0x20,0xC0,0x00,0x03,0xF0, + 0x57,0xF8,0x00,0x20,0xFF,0xF7,0x86,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x65,0x70,0x00,0x00,0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42, + 0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7,0x39,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20, + 0xF5,0x30,0x20,0x63,0x03,0xF0,0x12,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x78,0x00,0x00,0x07,0xA5,0x07,0x00,0xF8,0x0A,0x00,0x20,0x10,0xB5,0xFF,0xF7, + 0xD5,0xFE,0xFF,0xF7,0x43,0xFF,0x15,0x48,0x00,0x7A,0x02,0xF0,0x79,0xFE,0x13,0x48, + 0x13,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24,0xD1,0x83,0x12,0x49,0x0C,0x60,0x4C,0x60, + 0x11,0x49,0xD2,0x88,0x49,0x79,0x52,0x06,0x02,0xD4,0x01,0x00,0xA0,0x31,0x49,0x78, + 0x0C,0x4A,0xC0,0x3A,0x51,0x73,0x09,0x49,0x80,0x31,0x0A,0x8B,0x09,0x49,0x40,0x39, + 0xCA,0x62,0x00,0x88,0x08,0x63,0xFF,0xF7,0x9D,0xFE,0x08,0x48,0xC4,0x83,0xFE,0xF7, + 0xF7,0xFA,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xF0,0x0A,0x00,0x20,0x00,0x7A,0x00,0x00,0x30,0x07,0x00,0x20, + 0xF9,0x0A,0x00,0x20,0xF7,0xB5,0x86,0xB0,0x00,0x27,0x2E,0x48,0x04,0xAB,0x02,0x97, + 0x03,0x97,0x81,0xC3,0x2C,0x4E,0xFE,0xF7,0xC7,0xFB,0xFE,0xF7,0x75,0xFC,0x2B,0x48, + 0x40,0x7F,0x01,0x90,0x29,0x48,0x20,0x38,0x40,0x7F,0x00,0x25,0x00,0x90,0x2A,0xE0, + 0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00,0xFF,0xF7,0x16,0xFB,0x00,0x28,0x1C,0xD0, + 0x23,0x49,0x04,0x9A,0x09,0x78,0x69,0x43,0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98, + 0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42, + 0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95,0x03,0x91,0x64,0x1C,0x14,0x48,0x00,0x78, + 0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x13,0x48,0x00,0x78,0x85,0x42,0xD0,0xD3,0x08,0x99, + 0x03,0x98,0x08,0x60,0x10,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0,0x07,0x98,0x07,0x60, + 0x06,0x99,0x02,0x98,0x08,0x60,0x04,0xE0,0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98, + 0x07,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x00,0x90,0x00,0x40,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0xF0,0xB4,0x18,0x49,0x16,0x4F,0x88,0x7E,0xC0,0x07,0x26,0xD0, + 0x16,0x4B,0x17,0x4E,0x09,0x22,0x00,0x20,0xD2,0x01,0x1B,0x78,0xB2,0x18,0x1B,0xE0, + 0x09,0x25,0x34,0x18,0xED,0x01,0x64,0x19,0x8D,0x7E,0x64,0x7A,0xAD,0x07,0x03,0xD5, + 0x5C,0x43,0x15,0x7A,0x64,0x19,0x02,0xE0,0x15,0x7A,0x5D,0x43,0x2C,0x19,0xA4,0x00, + 0x3D,0x59,0x2C,0x01,0x2D,0x05,0x24,0x0D,0x2D,0x0D,0x2C,0x1B,0x00,0xD5,0x00,0x24, + 0x45,0x00,0xAD,0x19,0x40,0x1C,0x2C,0x82,0xCC,0x7E,0x84,0x42,0xE0,0xD8,0xF0,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x02,0x10,0x40,0x30,0x0A,0x00,0x20,0xFB,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42, + 0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7, + 0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x02,0x00,0x08,0x00,0x8A,0x42,0x00,0xDC,0x10,0x00,0x70,0x47,0xF0,0xB5,0x00,0x20, + 0xFD,0xB0,0x6A,0x90,0xFF,0x49,0x20,0x22,0x1E,0xA8,0xFC,0xF7,0x09,0xFA,0xFF,0x4A, + 0xFD,0x4B,0xD0,0x88,0x9C,0x89,0xFE,0x49,0x45,0x06,0x00,0xD4,0x0C,0x89,0x9F,0x7C, + 0x43,0x06,0x00,0xD4,0x8F,0x7B,0xF8,0x49,0x20,0x39,0x7C,0x91,0x8E,0x8B,0x41,0x06, + 0xF8,0x48,0x7B,0x90,0x00,0xD4,0x06,0x8B,0xF7,0x48,0xFF,0x22,0x05,0x78,0xF7,0x48, + 0x01,0x32,0x00,0x78,0x00,0x21,0x1D,0x90,0x26,0xA8,0x00,0xF0,0xC1,0xFF,0xF4,0x48, + 0x08,0x22,0x00,0x21,0x00,0xF0,0xBC,0xFF,0xF1,0x48,0x10,0x22,0x00,0x21,0x08,0x30, + 0x00,0xF0,0xB6,0xFF,0x24,0x22,0x00,0x21,0x14,0xA8,0x00,0xF0,0xB1,0xFF,0x24,0x22, + 0x00,0x21,0x0B,0xA8,0x00,0xF0,0xAC,0xFF,0x24,0x22,0x00,0x21,0x02,0xA8,0x00,0xF0, + 0xA7,0xFF,0xE2,0x49,0x08,0x79,0x00,0x28,0x7E,0xD0,0xC8,0x88,0x7A,0x90,0x80,0x06, + 0x02,0xD5,0xE0,0x1B,0x04,0x04,0x24,0x0C,0xDC,0x48,0x64,0x21,0x00,0x89,0x07,0x00, + 0x60,0x43,0xFC,0xF7,0xF1,0xF9,0xDE,0x49,0x89,0x1C,0x79,0x91,0xD7,0x49,0xC9,0x89, + 0x40,0x18,0x79,0x99,0xC8,0x82,0xDB,0x48,0x00,0x21,0x78,0x90,0x01,0x81,0x7C,0x99, + 0x7A,0x9A,0x89,0x7F,0x38,0x00,0x52,0x06,0x01,0xD4,0x7B,0x99,0x89,0x7E,0x48,0x43, + 0x64,0x21,0xFC,0xF7,0xB3,0xFA,0x00,0x04,0x78,0x99,0x00,0x14,0xB0,0x42,0x48,0x81, + 0x01,0xDA,0x78,0x98,0x46,0x81,0x02,0x20,0x6E,0x90,0x1D,0x98,0x00,0x24,0x80,0x1C, + 0x75,0x90,0x6E,0x98,0x0A,0xE1,0x02,0x20,0x6F,0x90,0xA8,0x1C,0x76,0x90,0x6F,0x98, + 0xFA,0xE0,0x6E,0x99,0x28,0x1D,0x41,0x43,0x77,0x90,0x6F,0x98,0x08,0x18,0x43,0x00, + 0xC5,0x48,0x0A,0x21,0xC2,0x5E,0x78,0x98,0x41,0x5E,0x8A,0x42,0x03,0xDD,0x00,0x89, + 0x78,0x99,0x40,0x1C,0x08,0x81,0x79,0x9E,0x16,0x21,0x71,0x5E,0x00,0x20,0x8A,0x42, + 0x02,0xDD,0x50,0x1A,0x00,0x04,0x00,0x14,0x6F,0x9A,0x00,0x2A,0x09,0xD1,0x00,0x28, + 0x78,0xD0,0x6E,0x98,0x26,0xA9,0x80,0x1E,0x68,0x43,0x40,0x18,0x91,0x1E,0x40,0x5C, + 0x14,0xE0,0xB5,0x4A,0x9B,0x18,0x20,0x3B,0x1E,0x22,0x9A,0x5E,0x8A,0x42,0x03,0xDD, + 0x51,0x1A,0x09,0x04,0x09,0x14,0x65,0xD1,0x00,0x28,0xE9,0xD0,0x6E,0x98,0x26,0xA9, + 0x80,0x1E,0x68,0x43,0x41,0x18,0x6F,0x98,0x80,0x1E,0x08,0x5C,0x00,0x28,0xF2,0xD1, + 0x6F,0x98,0x00,0x04,0x00,0x14,0x00,0xE0,0x83,0xE1,0x6D,0x90,0x68,0x90,0x6E,0x98, + 0x64,0x1C,0x00,0x04,0x00,0x14,0x24,0x04,0x04,0x22,0x24,0x14,0x6C,0x90,0x08,0x2C, + 0x67,0x90,0x03,0xDD,0x64,0x1E,0x24,0x04,0x24,0x14,0xB3,0xE0,0x00,0x20,0x66,0x90, + 0x00,0x20,0x6B,0x90,0x66,0x98,0xFF,0x21,0x40,0x1C,0x00,0x04,0x00,0x14,0x01,0x31, + 0x88,0x42,0x66,0x90,0x36,0xDC,0x00,0x20,0x84,0x46,0x91,0x00,0x1E,0xAB,0xC8,0x18, + 0x40,0x88,0x59,0x5A,0x67,0x9E,0x68,0x9B,0x80,0x19,0xC9,0x18,0x00,0x04,0x09,0x04, + 0x00,0x14,0x09,0x14,0x02,0x28,0x26,0xDB,0x75,0x9B,0x98,0x42,0x23,0xDA,0x02,0x29, + 0x21,0xDB,0x76,0x9B,0x99,0x42,0x1E,0xDA,0x77,0x9B,0x8B,0x4E,0x43,0x43,0x5B,0x18, + 0x5B,0x00,0xF3,0x5E,0x79,0x9E,0x16,0x27,0xF7,0x5F,0xBB,0x42,0x13,0xDD,0x83,0x1E, + 0x6B,0x43,0x26,0xAE,0x9B,0x19,0x8E,0x1E,0x9B,0x57,0xA3,0x42,0x01,0xD0,0x00,0x2B, + 0x09,0xD1,0x6C,0x9B,0x98,0x42,0x02,0xD1,0x6D,0x9B,0x99,0x42,0x0B,0xD0,0x01,0x23, + 0x6B,0x93,0x08,0xE0,0x5D,0xE0,0x52,0x1C,0x63,0x46,0x5B,0x1C,0x52,0x07,0x52,0x0F, + 0x08,0x2B,0x9C,0x46,0xC1,0xDB,0x67,0x9B,0x26,0xAE,0x9B,0x1E,0x6B,0x43,0x9B,0x19, + 0x68,0x9E,0xB6,0x1E,0x9F,0x5D,0x00,0x2F,0x3E,0xD1,0x9C,0x55,0x77,0x9E,0x67,0x9B, + 0x79,0x9F,0x73,0x43,0x68,0x9E,0x9B,0x19,0x6F,0x4E,0x5B,0x00,0xF3,0x5E,0x16,0x26, + 0xBE,0x5F,0xB3,0x42,0x03,0xDD,0x9B,0x1B,0x1B,0x04,0x1B,0x0C,0x00,0xE0,0x00,0x23, + 0x69,0x93,0xA3,0x00,0x9C,0x46,0x14,0xAE,0xF3,0x58,0x68,0x9E,0x5F,0x4F,0x76,0x00, + 0xF6,0x19,0xB6,0x8B,0x69,0x9F,0x7E,0x43,0x9E,0x19,0x63,0x46,0x14,0xAF,0xFE,0x50, + 0x0B,0xAE,0xF3,0x58,0x67,0x9E,0x59,0x4F,0x76,0x00,0xF6,0x19,0x40,0x36,0x36,0x88, + 0x69,0x9F,0x7E,0x43,0x9E,0x19,0x63,0x46,0x0B,0xAF,0xFE,0x50,0x02,0xAF,0xFB,0x58, + 0x69,0x9E,0x9E,0x19,0x63,0x46,0xFE,0x50,0x50,0x4E,0x63,0x00,0x9B,0x19,0xFF,0x33, + 0x41,0x33,0xDE,0x88,0x76,0x1C,0xDE,0x80,0x6B,0x9B,0x00,0x2B,0x09,0xD0,0x00,0x06, + 0x00,0x0E,0x67,0x90,0x08,0x06,0x00,0x0E,0x52,0x1D,0x52,0x07,0x52,0x0F,0x68,0x90, + 0x5E,0xE7,0x6F,0x98,0x40,0x1C,0x6F,0x90,0x76,0x99,0x88,0x42,0x00,0xDA,0x00,0xE7, + 0x6A,0x98,0x00,0x28,0x06,0xD1,0x6E,0x98,0x40,0x1C,0x6E,0x90,0x75,0x99,0x88,0x42, + 0x00,0xDA,0xF0,0xE6,0x00,0x2C,0x74,0xDD,0x02,0x20,0x54,0xE0,0x02,0x20,0x69,0x1C, + 0x72,0x91,0x4C,0xE0,0x2B,0x1D,0x62,0x46,0x5A,0x43,0x12,0x18,0x79,0x9E,0x57,0x00, + 0x3D,0x4B,0x16,0x22,0xB2,0x5E,0xFE,0x18,0x02,0x23,0xF3,0x5E,0x00,0x21,0x93,0x42, + 0x02,0xDD,0x99,0x1A,0x09,0x04,0x09,0x14,0x62,0x46,0x92,0x1E,0x6A,0x43,0x26,0xAB, + 0xD2,0x18,0x83,0x1E,0x74,0x92,0xD3,0x56,0x01,0x93,0x43,0x1E,0x73,0x93,0xD2,0x56, + 0x00,0x2A,0x2A,0xD1,0x00,0x29,0x28,0xD0,0x01,0x9A,0x00,0x2A,0x25,0xD0,0x27,0x4F, + 0x46,0x00,0xF6,0x19,0xF6,0x8B,0x92,0x00,0x14,0xAB,0x4E,0x43,0x9B,0x58,0x9B,0x19, + 0x14,0xAE,0xB3,0x50,0x66,0x46,0x76,0x00,0xF6,0x19,0x40,0x36,0x36,0x88,0x0B,0xAB, + 0x9B,0x58,0x4E,0x43,0x9B,0x19,0x0B,0xAE,0xB3,0x50,0x02,0xAE,0xB3,0x58,0x59,0x18, + 0xB1,0x50,0x01,0x99,0x49,0x00,0xC9,0x19,0xFF,0x31,0x41,0x31,0xCA,0x88,0x52,0x1C, + 0xCA,0x80,0x73,0x9B,0x74,0x9A,0x01,0x99,0xD1,0x54,0x72,0x99,0x40,0x1C,0x88,0x42, + 0xB0,0xDB,0x60,0x46,0x40,0x1C,0x75,0x99,0x84,0x46,0x88,0x42,0xA6,0xDB,0x01,0x26, + 0x38,0xE0,0xB1,0x00,0x02,0xAA,0x71,0x91,0x57,0x58,0x01,0x20,0x00,0x2F,0x00,0xD0, + 0x38,0x00,0x01,0x00,0x71,0x98,0x14,0xAA,0x10,0x58,0xFC,0xF7,0x27,0xF9,0x07,0x49, + 0x72,0x00,0x51,0x18,0x70,0x91,0xFF,0x31,0x01,0x31,0xC8,0x83,0x01,0x21,0x00,0x2F, + 0x14,0xE0,0x21,0xE0,0xF0,0x70,0x00,0x00,0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x40,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x2E,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0xD0,0x39,0x00, + 0x71,0x98,0x0B,0xAA,0x10,0x58,0xFC,0xF7,0x01,0xF9,0x70,0x99,0xFF,0x31,0x21,0x31, + 0x76,0x1C,0xC8,0x81,0xA6,0x42,0xC4,0xDD,0x14,0x4A,0x10,0x79,0x1F,0xE0,0x81,0x00, + 0x89,0x18,0xE0,0x31,0x0E,0x23,0xCB,0x5E,0x0C,0x24,0x0C,0x5F,0x6B,0x43,0x26,0xA9, + 0x09,0x19,0x59,0x5C,0x13,0x18,0x1C,0x00,0xFF,0x34,0x21,0x34,0x61,0x77,0x61,0x7F, + 0xFF,0x33,0x01,0x33,0x49,0x00,0x89,0x18,0xFF,0x31,0x41,0x31,0xC9,0x88,0x09,0x06, + 0x09,0x0E,0x19,0x74,0x93,0x8B,0x99,0x42,0x00,0xD9,0x91,0x83,0x40,0x1E,0x01,0x28, + 0xDD,0xDA,0x7D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xE5,0xB0,0x40,0x90,0x31,0x90,0x0C,0x90,0xFF,0x48,0x64,0x90, + 0x02,0x8A,0xFF,0x49,0xC8,0x88,0x43,0x06,0x02,0xD4,0xFC,0x4A,0xC0,0x3A,0x92,0x89, + 0xFA,0x4D,0xFC,0x4C,0x20,0x35,0x0B,0x92,0xAA,0x89,0x43,0x06,0x00,0xD4,0x22,0x89, + 0xF9,0x4B,0x0A,0x92,0xF5,0x4A,0x40,0x32,0x63,0x92,0x52,0x89,0x46,0x06,0x62,0x93, + 0x00,0xD4,0xDA,0x88,0x43,0x06,0x09,0x92,0x63,0x9A,0x12,0x79,0x01,0xD4,0x62,0x9A, + 0x12,0x78,0x43,0x06,0x08,0x92,0x63,0x9A,0x52,0x79,0x01,0xD4,0x62,0x9A,0x52,0x78, + 0x43,0x06,0x07,0x92,0x63,0x9A,0x12,0x8B,0x01,0xD4,0x62,0x9A,0x92,0x8A,0x40,0x06, + 0x06,0x92,0x2F,0x89,0x00,0xD4,0xA7,0x88,0xE8,0x48,0x29,0x22,0x06,0x78,0xE8,0x48, + 0x00,0x78,0x05,0x90,0xE2,0x48,0xC0,0x89,0x04,0x90,0x01,0x20,0x03,0x90,0x00,0x20, + 0x01,0x00,0x01,0x90,0x0D,0xA8,0x00,0xF0,0x4B,0xFD,0xE2,0x48,0xDC,0x49,0x08,0x81, + 0xDB,0x48,0x00,0x21,0x81,0x81,0x41,0x81,0xC0,0x30,0x61,0x90,0x41,0x80,0xA0,0x30, + 0x60,0x90,0x40,0x78,0xDC,0x49,0x02,0x28,0x5F,0x91,0x4E,0xD9,0xD4,0x4A,0x69,0x8A, + 0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x89,0x34,0x91,0xD8,0x49,0x34,0x9A,0x5E,0x91, + 0x89,0x8B,0x89,0x18,0x35,0x91,0x0B,0x99,0xC9,0x04,0x25,0xD5,0x01,0x28,0x0C,0xD9, + 0xCB,0x4A,0xE9,0x7A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x79,0x48,0x43,0x00,0x06, + 0x00,0x0E,0x03,0x90,0x01,0xD1,0x01,0x20,0x03,0x90,0x61,0x99,0xC4,0x4A,0x00,0x20, + 0x08,0x5E,0xD2,0x88,0xA9,0x7A,0x52,0x06,0x00,0xD4,0xA1,0x79,0x48,0x43,0x64,0x21, + 0xFB,0xF7,0x6A,0xFF,0x00,0x04,0x00,0x0C,0xB8,0x42,0x00,0xD2,0x38,0x00,0x03,0x99, + 0xFC,0xF7,0x3C,0xF8,0x61,0x99,0x48,0x80,0xB9,0x49,0x63,0x98,0xC9,0x88,0x40,0x8B, + 0x49,0x06,0x01,0xD4,0x62,0x98,0xC0,0x8A,0x5F,0x99,0x89,0x8B,0x40,0x18,0x33,0x90, + 0x02,0x20,0x4B,0x90,0xB1,0x48,0xC0,0x30,0x5D,0x90,0xB7,0x48,0xA0,0x38,0x5C,0x90, + 0x05,0x98,0x80,0x1C,0x51,0x90,0x4B,0x98,0x92,0xE3,0x02,0x28,0x08,0xD1,0xAC,0x4A, + 0x29,0x8A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xA1,0x89,0x5F,0x9A,0x52,0x8B,0x0E,0xE0, + 0xAF,0x49,0x09,0x78,0x00,0x29,0x02,0xD0,0xAE,0x49,0x89,0x89,0x05,0xE0,0xA4,0x4A, + 0xE9,0x89,0xD2,0x88,0x52,0x06,0x00,0xD4,0x61,0x89,0x5F,0x9A,0x12,0x8B,0x89,0x18, + 0x9A,0xE7,0x02,0x24,0xB0,0x1C,0x52,0x90,0x67,0xE3,0x4B,0x98,0x52,0x99,0x40,0x1E, + 0x48,0x43,0x61,0x1E,0x40,0x18,0x00,0x04,0x07,0x14,0xA3,0x49,0x78,0x00,0x5B,0x90, + 0x08,0x5E,0x35,0x99,0x09,0x04,0x09,0x14,0x88,0x42,0x7B,0xDB,0x78,0x1C,0xC1,0x10, + 0x0D,0xAA,0x52,0x5C,0x41,0x07,0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40,0xF8,0x10, + 0x0D,0xA9,0x5A,0x90,0x09,0x5C,0x7B,0x07,0x5B,0x0F,0x01,0x20,0x98,0x40,0x01,0x40, + 0x59,0x90,0x78,0x1E,0xC3,0x10,0x0D,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20, + 0xA8,0x40,0x18,0x40,0x01,0xF0,0x30,0xFC,0x00,0x90,0xB8,0x1B,0x41,0x1E,0xCA,0x10, + 0x0D,0xAB,0x9A,0x5C,0x4B,0x07,0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40,0x83,0x1E, + 0xD9,0x10,0x0D,0xAD,0x69,0x5C,0x5D,0x07,0x6D,0x0F,0x01,0x23,0xAB,0x40,0x19,0x40, + 0xC0,0x1E,0xC3,0x10,0x0D,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40, + 0x18,0x40,0x01,0xF0,0x11,0xFC,0x00,0x99,0x01,0xF0,0x0C,0xFC,0x00,0x28,0x39,0xD1, + 0x7D,0x48,0x32,0x00,0x39,0x00,0x02,0x23,0xFE,0xF7,0x40,0xFF,0x35,0x99,0x88,0x42, + 0xB3,0xDB,0x79,0x4A,0x5B,0x99,0x51,0x5E,0x81,0x42,0xF0,0xD1,0x6C,0x4A,0x93,0x89, + 0x83,0x42,0x00,0xDA,0x90,0x81,0x5A,0x9B,0x0D,0xAD,0xEB,0x5C,0x59,0x9F,0x68,0x4A, + 0x3B,0x43,0x5A,0x9F,0xEB,0x55,0x92,0x89,0x82,0x42,0x05,0xD1,0x64,0x48,0x00,0x79, + 0x40,0x1C,0x00,0x06,0x00,0x0E,0x0C,0x90,0x00,0x20,0x05,0x00,0x02,0x90,0x5C,0x98, + 0x80,0x7E,0xC2,0x07,0x20,0xD0,0x80,0x07,0x0D,0xD5,0x30,0x1B,0x40,0x1C,0x00,0xD1, + 0x75,0x1E,0xA6,0x42,0x04,0xD1,0x01,0x22,0x30,0x04,0x52,0x04,0x80,0x1A,0x05,0x43, + 0x01,0x20,0x10,0xE0,0xA8,0xE0,0x4B,0x9A,0x05,0x98,0x80,0x1A,0x40,0x1C,0x01,0xD1, + 0x05,0x9D,0x6D,0x1E,0x05,0x98,0x90,0x42,0x04,0xD1,0x01,0x22,0x00,0x04,0x12,0x05, + 0x80,0x1A,0x05,0x43,0x02,0x20,0x02,0x90,0x28,0x04,0x04,0xD0,0x33,0x98,0x00,0x04, + 0x00,0x14,0x81,0x42,0xB4,0xDB,0x4B,0x99,0x30,0x1D,0x41,0x43,0x58,0x90,0x08,0x19, + 0x00,0x04,0x00,0x14,0x32,0x90,0x0B,0x98,0xC0,0x04,0x0B,0xD5,0x32,0x98,0x4F,0x49, + 0x40,0x00,0x08,0x5E,0x04,0x99,0x40,0x1A,0x7E,0xD4,0x61,0x9A,0x02,0x21,0x51,0x5E, + 0x81,0x42,0x79,0xDA,0x04,0x20,0x4C,0x90,0x20,0x18,0x57,0x90,0x4C,0x98,0x04,0x27, + 0x80,0x00,0x56,0x90,0x57,0x98,0x00,0x1F,0x0D,0xD4,0x57,0x98,0x00,0x1F,0xB0,0x42, + 0x09,0xDA,0x4B,0x98,0xC0,0x19,0x55,0x90,0x00,0x1F,0x04,0xD4,0x55,0x98,0x05,0x99, + 0x00,0x1F,0x88,0x42,0x07,0xDB,0x14,0x20,0x78,0x43,0x00,0x21,0x18,0xAA,0x80,0x18, + 0x56,0x9A,0x81,0x50,0x27,0xE0,0x04,0x98,0x0B,0x99,0x00,0x04,0x00,0x14,0xC9,0x04, + 0x04,0xD5,0x03,0x99,0xFB,0xF7,0x40,0xFE,0x00,0x04,0x00,0x14,0x55,0x99,0x58,0x9A, + 0x89,0x1E,0x51,0x43,0x57,0x9A,0x89,0x18,0x30,0x4A,0x49,0x00,0x89,0x18,0x20,0x39, + 0x89,0x8B,0x08,0x1A,0x00,0x04,0x00,0x14,0x00,0xD5,0x00,0x20,0x06,0x99,0x00,0x29, + 0x03,0xD0,0x88,0x42,0x01,0xDD,0x08,0x04,0x00,0x14,0x14,0x21,0x79,0x43,0x18,0xAA, + 0x89,0x18,0x56,0x9A,0x88,0x50,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xBA,0xD5,0x4C,0x98, + 0x40,0x1E,0x00,0x04,0x00,0x14,0x4C,0x90,0xAE,0xD5,0x32,0x98,0x1F,0x4A,0x40,0x00, + 0x84,0x46,0x80,0x18,0x01,0x00,0x20,0x39,0x1E,0x23,0xCB,0x5E,0x04,0x99,0x04,0x9F, + 0x59,0x1A,0x3F,0x91,0x02,0x21,0x41,0x5E,0x04,0x98,0x04,0x9B,0x08,0x1A,0x3E,0x90, + 0x32,0x98,0x18,0x21,0x80,0x1B,0x40,0x00,0x80,0x18,0x20,0x38,0x41,0x5E,0xC9,0x1A, + 0x3D,0x91,0x32,0x99,0x08,0x23,0x89,0x19,0x49,0x00,0x89,0x18,0xCB,0x5E,0xDB,0x1B, + 0x3C,0x93,0x16,0x23,0xC3,0x5E,0x1B,0xE0,0x35,0xE1,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x00,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20, + 0x04,0x0B,0x00,0x20,0xA0,0x7A,0x00,0x00,0x40,0x00,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xDB,0x1B,0x3B,0x93,0x06,0x23,0xCB,0x5E,0xDB,0x1B,0x3A,0x93,0x1A,0x23,0xC3,0x5E, + 0xD8,0x1B,0x39,0x90,0x0A,0x20,0x08,0x5E,0x0A,0x99,0xC0,0x1B,0x38,0x90,0x60,0x46, + 0x10,0x5E,0xC0,0x1B,0x48,0x43,0x64,0x21,0xFB,0xF7,0xBE,0xFD,0x36,0x90,0x25,0x98, + 0x02,0x04,0x12,0x14,0x00,0x92,0x23,0x98,0x03,0x04,0x20,0x98,0x1B,0x14,0x02,0x04, + 0x1F,0x98,0x12,0x14,0x01,0x04,0x1E,0x98,0x09,0x14,0x00,0x04,0x00,0x14,0xFF,0xF7, + 0x4C,0xFB,0x07,0x00,0x2A,0x98,0x02,0x04,0x29,0x98,0x12,0x14,0x01,0x04,0x28,0x98, + 0x09,0x14,0x00,0x04,0x00,0x14,0xFF,0xF7,0x39,0xFB,0x01,0x00,0x38,0x00,0xFF,0xF7, + 0x31,0xFB,0x24,0x99,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42,0x05,0xDD, + 0x08,0x1A,0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x01,0x90,0xFB,0x48,0xFF,0x21, + 0xC0,0x88,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20,0x01,0x90, + 0xF7,0x48,0x00,0x78,0x00,0x28,0x47,0xD1,0x1F,0xA9,0x06,0xC9,0x02,0x2C,0x14,0xD1, + 0x01,0xF0,0xB2,0xFA,0x07,0x00,0x00,0x21,0x25,0x9A,0x08,0x00,0x01,0xF0,0xAC,0xFA, + 0x29,0xA9,0x06,0xC9,0x3F,0x18,0x00,0x20,0x01,0xF0,0xA6,0xFA,0x38,0x18,0x05,0x21, + 0xFB,0xF7,0x6A,0xFD,0x00,0x04,0x00,0x0C,0x13,0xE0,0x1E,0x98,0x01,0xF0,0x9C,0xFA, + 0x07,0x00,0x25,0x9A,0x23,0x98,0x00,0x21,0x01,0xF0,0x96,0xFA,0x3F,0x18,0x28,0xA8, + 0x07,0xC8,0x01,0xF0,0x91,0xFA,0x38,0x18,0xC1,0x17,0x49,0x0F,0x08,0x18,0x40,0x03, + 0x00,0x0C,0x24,0x99,0x09,0x1A,0x00,0x29,0x01,0xDC,0x24,0x99,0x41,0x1A,0x5D,0x98, + 0x02,0x8A,0xDA,0x48,0xC0,0x88,0x43,0x06,0x01,0xD4,0x64,0x9A,0x92,0x89,0x91,0x42, + 0x0A,0xDA,0x5D,0x99,0x24,0x9A,0x49,0x8A,0x40,0x06,0x01,0xD4,0x64,0x98,0xC1,0x89, + 0x8A,0x42,0x01,0xDA,0x28,0x04,0x7E,0xD0,0x00,0x2D,0x2B,0xD0,0x02,0x98,0xC0,0x07, + 0x16,0xD0,0x04,0x20,0x00,0x22,0x18,0xAB,0x29,0x04,0x06,0xD0,0x14,0x27,0x01,0x00, + 0x79,0x43,0x5A,0x50,0xC9,0x18,0x4A,0x60,0x05,0xE0,0x14,0x27,0x01,0x00,0x79,0x43, + 0xC9,0x18,0xCA,0x60,0x0A,0x61,0x40,0x1E,0x00,0x04,0x00,0x14,0xEC,0xD5,0x11,0xE0, + 0x04,0x20,0x00,0x22,0x18,0xAB,0x29,0x04,0x04,0xD0,0x81,0x00,0x5A,0x50,0xC9,0x18, + 0x4A,0x61,0x03,0xE0,0x81,0x00,0xC9,0x18,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04, + 0x00,0x14,0xF0,0xD5,0xBB,0x48,0x32,0x99,0x32,0x00,0x04,0x23,0xFE,0xF7,0x76,0xFD, + 0xB6,0x49,0x0A,0x89,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA, + 0x48,0x81,0xB2,0x48,0x01,0x79,0x49,0x1C,0x0A,0x06,0x12,0x0E,0x02,0x71,0x92,0x00, + 0xA1,0x1E,0x12,0x18,0xE0,0x32,0x54,0x91,0x91,0x81,0x4B,0x99,0x89,0x1E,0x53,0x91, + 0x02,0x79,0x92,0x00,0x10,0x18,0xE0,0x30,0xC1,0x81,0x00,0x20,0x07,0x00,0x01,0x00, + 0x84,0x46,0x37,0x90,0x36,0x9A,0x3F,0x98,0x90,0x42,0x05,0xDC,0x3B,0x98,0x90,0x42, + 0x02,0xDC,0x3A,0x98,0x90,0x42,0x01,0xDD,0x01,0x20,0x37,0x90,0x3E,0x98,0x90,0x42, + 0x05,0xDC,0x39,0x98,0x90,0x42,0x02,0xDC,0x38,0x98,0x90,0x42,0x01,0xDD,0x01,0x20, + 0x84,0x46,0x3D,0x98,0x90,0x42,0x05,0xDC,0x3B,0x98,0x90,0x42,0x02,0xDC,0x39,0x98, + 0x90,0x42,0x00,0xDD,0x01,0x27,0x3C,0x98,0x90,0x42,0x08,0xDC,0x3A,0x98,0x90,0x42, + 0x05,0xDC,0x38,0x9A,0x00,0xE0,0xF4,0xE0,0x36,0x98,0x82,0x42,0x00,0xDD,0x01,0x21, + 0x04,0x20,0x00,0x22,0x18,0xAD,0x37,0x9B,0x00,0x2B,0x02,0xD1,0x14,0x23,0x43,0x43, + 0xEA,0x50,0x63,0x46,0x00,0x2B,0x03,0xD1,0x14,0x23,0x43,0x43,0x5B,0x19,0x1A,0x61, + 0x00,0x2F,0x01,0xD1,0x83,0x00,0xEA,0x50,0x00,0x29,0x02,0xD1,0x83,0x00,0x5B,0x19, + 0x1A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xE5,0xD5,0x1C,0x9A,0x18,0xA8,0x00,0x92, + 0x0F,0xC8,0x01,0xF0,0xCC,0xF9,0x21,0x9A,0x48,0x90,0x1D,0xA8,0x00,0x92,0x0F,0xC8, + 0x01,0xF0,0xC5,0xF9,0x26,0x9A,0x47,0x90,0x22,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0, + 0xBE,0xF9,0x2B,0x9A,0x46,0x90,0x27,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xB7,0xF9, + 0x30,0x9A,0x45,0x90,0x2C,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xB0,0xF9,0x00,0x90, + 0x44,0x90,0x45,0x9B,0x46,0x9A,0x47,0x99,0x48,0x98,0x01,0xF0,0xA8,0xF9,0x00,0x28, + 0x49,0x90,0x0F,0xD1,0x04,0x27,0x14,0x20,0x78,0x43,0x40,0x19,0x0A,0x22,0x00,0x21, + 0x00,0xF0,0x06,0xFA,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xF4,0xD5,0x0A,0x20,0x46,0x90, + 0x24,0x90,0x49,0x90,0x54,0x98,0x00,0x28,0x01,0xDC,0x00,0x20,0x0C,0xE0,0x2C,0x9A, + 0x27,0x9B,0x00,0x92,0x22,0x9A,0x1D,0x99,0x18,0x98,0x01,0xF0,0x88,0xF9,0x5B,0x4A, + 0x61,0x00,0x89,0x18,0x49,0x8B,0x48,0x43,0x2D,0x9A,0x43,0x90,0x00,0x92,0x28,0x9B, + 0x23,0x9A,0x1E,0x99,0x19,0x98,0x01,0xF0,0x7A,0xF9,0x54,0x49,0x62,0x00,0x55,0x18, + 0xA9,0x8B,0x48,0x43,0x42,0x90,0x2E,0x9A,0x29,0x9B,0x00,0x92,0x24,0x9A,0x1F,0x99, + 0x1A,0x98,0x01,0xF0,0x6C,0xF9,0xE9,0x8B,0x2F,0x9A,0x2A,0x9B,0x48,0x43,0x41,0x90, + 0x00,0x92,0x25,0x9A,0x20,0x99,0x1B,0x98,0x01,0xF0,0x61,0xF9,0x29,0x8C,0x48,0x43, + 0x54,0x99,0x07,0x00,0x70,0x1E,0x81,0x42,0x01,0xDB,0x00,0x20,0x09,0xE0,0x30,0x9A, + 0x2B,0x9B,0x00,0x92,0x26,0x9A,0x21,0x99,0x1C,0x98,0x01,0xF0,0x50,0xF9,0x69,0x8C, + 0x48,0x43,0x00,0x90,0x41,0x9A,0x42,0x99,0x43,0x98,0x3B,0x00,0x01,0xF0,0x47,0xF9, + 0x49,0x99,0xFB,0xF7,0x09,0xFC,0x39,0x49,0x0A,0x8C,0x52,0x00,0x80,0x1A,0x00,0xD5, + 0x00,0x20,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0x90,0x81,0x53,0x98,0x00,0x28, + 0x01,0xDC,0x00,0x20,0x05,0xE0,0x4B,0x98,0x48,0x9A,0x40,0x00,0x40,0x18,0xC0,0x8F, + 0x50,0x43,0x4B,0x9A,0x2D,0x49,0x52,0x00,0x52,0x18,0x40,0x32,0x11,0x88,0x47,0x9B, + 0x46,0x9D,0x59,0x43,0x53,0x88,0x05,0x9F,0x6B,0x43,0x9C,0x46,0x93,0x88,0x45,0x9D, + 0x7F,0x1E,0x6B,0x43,0x53,0x9D,0xBD,0x42,0x01,0xDB,0x00,0x22,0x02,0xE0,0xD2,0x88, + 0x44,0x9D,0x6A,0x43,0x00,0x92,0x62,0x46,0x01,0xF0,0x11,0xF9,0x49,0x99,0xFB,0xF7, + 0xD3,0xFB,0x1E,0x49,0x40,0x31,0x89,0x88,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20, + 0x1A,0x49,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0xD0,0x83,0x08,0x79,0x08,0x28, + 0x12,0xD2,0x64,0x1C,0x52,0x98,0x24,0x04,0x24,0x14,0x84,0x42,0x00,0xDA,0x94,0xE4, + 0x40,0x98,0x00,0x28,0x08,0xD1,0x4B,0x98,0x40,0x1C,0x00,0x04,0x00,0x14,0x4B,0x90, + 0x51,0x99,0x88,0x42,0x00,0xDA,0x84,0xE4,0x0B,0x98,0x00,0x06,0x63,0xD5,0x0B,0x4C, + 0x20,0x79,0x00,0x28,0x5E,0x98,0x17,0xD1,0x80,0x8B,0x00,0x28,0x54,0xD0,0x5E,0x98, + 0x63,0x99,0xE2,0x88,0x40,0x7E,0x09,0x7B,0x52,0x06,0x01,0xD4,0x62,0x99,0x09,0x7A, + 0x88,0x42,0x49,0xD2,0x5E,0x99,0x40,0x1C,0x48,0x76,0x4C,0xE0,0xF0,0x05,0x00,0x20, + 0x05,0x0B,0x00,0x20,0xC8,0x02,0x00,0x20,0x80,0x7E,0x08,0x99,0x88,0x42,0x37,0xD8, + 0x40,0x1C,0x5E,0x99,0x00,0x06,0x00,0x0E,0x88,0x76,0x07,0x99,0x88,0x42,0x03,0xD9, + 0xA1,0x89,0x31,0x9A,0x89,0x18,0x31,0x91,0x08,0x99,0x88,0x42,0x28,0xD1,0x07,0x99, + 0x88,0x42,0x25,0xD0,0x41,0x1A,0x31,0x98,0xFB,0xF7,0x50,0xFC,0x5E,0x9A,0x00,0x21, + 0x91,0x83,0x63,0x99,0x0A,0x89,0xE1,0x88,0x4B,0x06,0x01,0xD4,0x62,0x9A,0x92,0x88, + 0x82,0x42,0x15,0xD2,0x34,0x9A,0x80,0x1A,0x63,0x9A,0x49,0x06,0x92,0x79,0x01,0xD4, + 0x62,0x99,0x8A,0x78,0x64,0x21,0x50,0x43,0xFB,0xF7,0x38,0xFC,0x5E,0x99,0x00,0x04, + 0x00,0x0C,0x88,0x83,0x09,0x99,0x88,0x42,0x02,0xD9,0x08,0x00,0x5E,0x99,0x88,0x83, + 0x5E,0x98,0x00,0x21,0x41,0x76,0x06,0xE0,0x5E,0x99,0x00,0x20,0x88,0x76,0x5E,0x99, + 0x48,0x76,0x5E,0x99,0x88,0x83,0x00,0x20,0x84,0x46,0x4A,0x90,0x61,0x48,0x01,0x24, + 0x00,0x79,0x4E,0x90,0x52,0xE0,0x5F,0x48,0x61,0x00,0x0F,0x18,0xC0,0x37,0xB8,0x89, + 0x0A,0x21,0xFB,0xF7,0x13,0xFC,0x05,0x04,0xF8,0x8B,0x2D,0x14,0x0A,0x21,0xFB,0xF7, + 0x0D,0xFC,0x5C,0x99,0x02,0x04,0xC9,0x7E,0x12,0x14,0x00,0x20,0x84,0x46,0x4F,0x91, + 0x36,0xE0,0x54,0x49,0xC3,0x00,0x5B,0x18,0x11,0x21,0x89,0x01,0x59,0x18,0x1C,0x27, + 0x50,0x91,0xCF,0x5F,0xAF,0x42,0x27,0xDC,0x23,0x21,0x49,0x01,0x59,0x18,0x00,0x23, + 0xCB,0x5E,0xAB,0x42,0x20,0xDB,0x50,0x9F,0x1E,0x23,0xFB,0x5E,0x93,0x42,0x1B,0xDC, + 0x02,0x27,0xCF,0x5F,0x47,0x4B,0x97,0x42,0x16,0xDB,0xA1,0x00,0xC9,0x18,0xE0,0x31, + 0x0E,0x23,0xCB,0x5E,0x37,0x1D,0x9B,0x1C,0x7B,0x43,0x0C,0x27,0xCF,0x5F,0xD9,0x19, + 0x4B,0x00,0x41,0x49,0x5B,0x18,0x04,0x21,0x59,0x5E,0x4A,0x9B,0x99,0x42,0x03,0xDD, + 0x4A,0x91,0x21,0x06,0x09,0x0E,0x8C,0x46,0x40,0x1C,0x4F,0x99,0x00,0x04,0x00,0x14, + 0x81,0x42,0xC6,0xDC,0x64,0x1C,0x4E,0x98,0x24,0x04,0x24,0x14,0xA0,0x42,0xAA,0xDA, + 0x34,0x4D,0x4A,0x9A,0x2C,0x00,0x23,0x00,0x69,0x89,0x20,0x00,0xDE,0x33,0xCC,0x30, + 0xC2,0x34,0x91,0x42,0x4D,0x93,0x15,0xDC,0x61,0x46,0x00,0x29,0x12,0xD0,0x49,0x00, + 0x49,0x19,0xC0,0x31,0x8F,0x89,0xCE,0x8B,0x12,0x22,0x00,0x21,0x00,0xF0,0x78,0xF8, + 0x4D,0x98,0x12,0x22,0x00,0x21,0x00,0xF0,0x73,0xF8,0x01,0x20,0x28,0x71,0xA7,0x81, + 0xE6,0x83,0x1E,0xE0,0x69,0x79,0x00,0x29,0x1B,0xD1,0x4E,0x99,0x01,0x29,0x18,0xD9, + 0x60,0x99,0x89,0x78,0x00,0x29,0x14,0xD1,0x0C,0x99,0x00,0x29,0x11,0xD0,0x4A,0x00, + 0x51,0x19,0xC0,0x31,0x8E,0x89,0xCF,0x8B,0x12,0x22,0x00,0x21,0x00,0xF0,0x58,0xF8, + 0x4D,0x98,0x12,0x22,0x00,0x21,0x00,0xF0,0x53,0xF8,0x01,0x20,0x28,0x71,0xA6,0x81, + 0xE7,0x83,0x5C,0x98,0xC0,0x7D,0x00,0x28,0x0C,0xD0,0x00,0x21,0x29,0x71,0x5C,0x98, + 0x12,0x4A,0x00,0x7E,0x92,0x7F,0x90,0x42,0x01,0xD3,0x5C,0x9A,0xD1,0x75,0x5C,0x99, + 0x40,0x1C,0x08,0x76,0x01,0x99,0x0E,0x48,0x00,0x29,0x10,0xD0,0x29,0x79,0x00,0x29, + 0x0D,0xD0,0x0C,0x4A,0x01,0x68,0x52,0x89,0x0A,0x32,0x91,0x42,0x01,0xDA,0x49,0x1C, + 0x01,0x60,0x28,0x79,0x68,0x71,0x65,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x21, + 0xF6,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x0A,0x00,0x20,0x80,0x7A,0x00,0x00,0x03,0xE0,0x0B,0x78,0x49,0x1C,0x03,0x70, + 0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47,0x52,0x10,0x03,0xE0,0x0B,0x88,0x89,0x1C, + 0x03,0x80,0x80,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47,0x92,0x10,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x09,0x06,0x09,0x0E,0x01,0xE0,0x01,0x70,0x40,0x1C,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0x0A,0x49,0x00,0x20, + 0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5,0xC8,0x7A,0x89,0x7A,0x08,0x18,0x00,0x06, + 0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23,0x1B,0x02,0x9A,0x43,0x02,0x61,0x02,0x69, + 0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00, + 0x00,0x90,0x00,0x40,0x10,0xB5,0x14,0x48,0x14,0x49,0x80,0x8B,0xC9,0x8A,0x00,0x24, + 0x40,0x18,0x13,0x49,0x09,0x78,0x00,0x29,0x12,0x49,0x04,0xD0,0x15,0x22,0x52,0x01, + 0x89,0x18,0x49,0x89,0x09,0xE0,0x10,0x4A,0xFF,0x31,0xD2,0x88,0xA1,0x31,0x49,0x8A, + 0x52,0x06,0x02,0xD4,0x0B,0x49,0xE0,0x31,0xC9,0x89,0x08,0x18,0x0B,0x49,0xC9,0x6B, + 0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7,0x6B,0xFF,0x20,0x00, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x06,0x00,0x20,0xD0,0x0A,0x00,0x20, + 0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40, + 0xF7,0xB5,0x2B,0x4E,0xFF,0x27,0xB0,0x7F,0xF1,0x7F,0x84,0xB0,0x00,0x02,0x08,0x43, + 0x01,0xF0,0xD8,0xFC,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x25,0x48, + 0x01,0x78,0x25,0x48,0x00,0x7A,0x00,0x29,0x02,0xD0,0x01,0xF0,0x6B,0xFC,0x01,0xE0, + 0x01,0xF0,0x98,0xFC,0x21,0x48,0x02,0x25,0xC1,0x6A,0x03,0x91,0x01,0x6A,0x02,0x91, + 0x41,0x6A,0x01,0x91,0x41,0x6B,0x00,0x91,0x1F,0xE0,0x1C,0x4F,0x00,0x20,0xF8,0x62, + 0x73,0x20,0x00,0x01,0x38,0x62,0x23,0x20,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F, + 0xFC,0xF7,0xE2,0xF8,0x64,0x1E,0xF9,0xD5,0x02,0x20,0x78,0x63,0x30,0x7F,0x01,0x00, + 0xFC,0xF7,0x5C,0xF9,0x01,0x24,0x04,0xA8,0x07,0xC8,0xFE,0xF7,0xAB,0xFE,0x07,0x00, + 0x01,0xD1,0x00,0x24,0x25,0x00,0x64,0x1E,0xF5,0xD5,0x28,0x00,0x6D,0x1E,0x00,0x28, + 0xDB,0xDC,0x0A,0x48,0x03,0x99,0xC1,0x62,0x02,0x99,0x01,0x62,0x01,0x99,0x41,0x62, + 0x00,0x99,0x41,0x63,0x38,0x00,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x78,0x00,0x00,0xFD,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x80,0x90,0x00,0x40, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x71,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0xB8,0x01,0x8D,0xE5,0x14,0x07,0x9F,0xE5,0x18,0x37,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x18,0x67,0x9F,0xE5,0xB0,0x01,0x8D,0xE5,0x04,0x07,0x9F,0xE5,0x00,0xB0,0xD0,0xE5, + 0xB6,0x00,0xD3,0xE1,0x40,0x10,0x00,0xE2,0xFC,0x06,0x9F,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x4C,0x80,0xE2,0xBC,0x1E,0xD0,0x01,0xB0,0x1B,0xD4,0x11,0x02,0xAC,0x80,0xE2, + 0xAC,0x11,0x8D,0xE5,0xB0,0x1F,0xD0,0x01,0xB4,0x1B,0xD4,0x11,0xA8,0x11,0x8D,0xE5, + 0xF8,0x1A,0xD4,0x01,0xFC,0x16,0xDA,0x11,0xA0,0x11,0x8D,0xE5,0xFA,0x1A,0xD4,0x01, + 0xFE,0x16,0xDA,0x11,0x9C,0x11,0x8D,0xE5,0xF4,0x10,0xD0,0x05,0xB8,0x11,0xD0,0x15, + 0x98,0x11,0x8D,0xE5,0xF5,0x10,0xD0,0x05,0xB9,0x11,0xD0,0x15,0x94,0x11,0x8D,0xE5, + 0xF6,0x10,0xD0,0x05,0xBA,0x11,0xD0,0x15,0x90,0x11,0x8D,0xE5,0xF7,0x10,0xD0,0x05, + 0xBB,0x11,0xD0,0x15,0x8C,0x11,0x8D,0xE5,0xBC,0x1F,0xD0,0x01,0xB0,0x1C,0xD4,0x11, + 0x88,0x11,0x8D,0xE5,0xBE,0x1F,0xD0,0x01,0xB2,0x1C,0xD4,0x11,0x84,0x11,0x8D,0xE5, + 0xB0,0x10,0xD4,0x01,0xB4,0x1C,0xD4,0x11,0x80,0x11,0x8D,0xE5,0xB2,0x10,0xD4,0x01, + 0xB6,0x1C,0xD4,0x11,0x7C,0x11,0x8D,0xE5,0xB8,0x1F,0xD0,0x01,0xBC,0x1B,0xD4,0x11, + 0x78,0x11,0x8D,0xE5,0xBA,0x0F,0xD0,0x01,0xBE,0x0B,0xD4,0x11,0x74,0x01,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0x30,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5, + 0x24,0x00,0x8D,0xE5,0x20,0x00,0x8D,0xE5,0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x04,0x00,0x8D,0xE5,0xB8,0x05,0xC6,0xE1,0x00,0x90,0xA0,0xE1,0xBA,0x05,0xC6,0xE1, + 0x01,0x5C,0x46,0xE2,0xBC,0x05,0xC6,0xE1,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x70,0x00,0x85,0xE2,0x4B,0xFF,0xFF,0xEB,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x98,0x00,0x85,0xE2,0x47,0xFF,0xFF,0xEB,0x00,0x00,0xA0,0xE3,0xB4,0x01,0x8D,0xE5, + 0x00,0x10,0xA0,0xE1,0xB0,0x0C,0xC5,0xE1,0x50,0x20,0xA0,0xE3,0x49,0x0F,0x8D,0xE2, + 0x40,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD4,0x00,0x8D,0xE2, + 0x3C,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x84,0x00,0x8D,0xE2, + 0x38,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x34,0x00,0x8D,0xE2, + 0x34,0xFF,0xFF,0xEB,0x98,0x05,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0xF8,0x7A,0xDA,0x11,0xB6,0x0A,0xDA,0x11,0x07,0x00,0x00,0x1A,0x74,0x05,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x40,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xF2,0x71,0xD4,0x01, + 0xF6,0x7D,0xD4,0x11,0xB0,0x01,0xD4,0x01,0xB4,0x0D,0xD4,0x11,0x00,0x80,0xA0,0xE3, + 0x08,0x50,0xA0,0xE1,0xA4,0x01,0x8D,0xE5,0x58,0x05,0x9F,0xE5,0xC0,0x01,0x8D,0xE5, + 0x0E,0x0C,0x80,0xE2,0xBC,0x01,0x8D,0xE5,0x82,0x00,0x00,0xEA,0x00,0x40,0xA0,0xE3, + 0x7C,0x00,0x00,0xEA,0xC0,0x01,0x9D,0xE5,0x0F,0x2A,0xE0,0xE3,0x08,0x11,0x90,0xE7, + 0x01,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0x21,0x18,0x02,0xE0,0x01,0x30,0x40,0xE0, + 0x00,0x00,0x41,0xE0,0x9C,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3, + 0xD4,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7, + 0x9C,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x34,0x20,0x8D,0xC2, + 0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5, + 0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x49,0x2F,0x8D,0xC2,0x05,0xC1,0x92,0xC7, + 0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0, + 0x00,0x00,0x51,0xE3,0x84,0x20,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0, + 0x05,0x11,0x82,0xC7,0xB4,0x11,0x9D,0xE5,0x01,0x00,0x53,0xE1,0xB4,0x31,0x8D,0xC5, + 0x30,0x40,0x8D,0xC5,0x2C,0x50,0x8D,0xC5,0xC8,0x00,0x53,0xE3,0xB8,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xB8,0x15,0xC6,0xC1,0x96,0x00,0x50,0xE3,0xBA,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBA,0x15,0xC6,0xC1,0x19,0x0E,0x53,0xE3,0xBC,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBC,0x15,0xC6,0xC1,0x58,0x14,0x9F,0xE5,0xB6,0x10,0xD1,0xE1, + 0x40,0x00,0x11,0xE3,0xB0,0x18,0xDA,0xE1,0x01,0x28,0xE0,0x13,0x81,0x10,0x02,0x10, + 0x00,0x00,0x53,0xE3,0x03,0x28,0xA0,0xC1,0x00,0x20,0xA0,0xD3,0x22,0x28,0xA0,0xC1, + 0x00,0x00,0x50,0xE3,0x00,0x08,0xA0,0xC1,0x00,0x00,0xA0,0xD3,0x20,0x08,0xA0,0xC1, + 0x01,0x00,0x50,0xE1,0x01,0xC0,0x89,0x82,0x01,0x98,0xCC,0x83,0x01,0x00,0x52,0xE1, + 0x0C,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x0C,0xC0,0x8D,0x85, + 0x81,0x00,0x50,0xE1,0x08,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83, + 0x08,0xC0,0x8D,0x85,0x81,0x00,0x52,0xE1,0x04,0x10,0x9D,0x85,0x01,0x10,0x81,0x82, + 0x01,0x18,0xC1,0x83,0x04,0x10,0x8D,0x85,0x10,0x10,0x9D,0xE5,0x00,0x00,0x53,0xE3, + 0x01,0x00,0x80,0xE0,0x10,0x00,0x8D,0xE5,0x00,0x30,0xA0,0xB3,0x01,0x00,0x4B,0xE2, + 0x00,0x00,0x55,0xE1,0x06,0x00,0x00,0x1A,0x00,0x00,0x53,0xE3,0x04,0x00,0x00,0x0A, + 0x64,0x00,0xA0,0xE3,0x93,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0xEA,0xEB,0xFF,0xEB, + 0x00,0x30,0xA0,0xE1,0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1,0x16,0xF8,0xFF,0xEB, + 0xA4,0x13,0x9F,0xE5,0x00,0x00,0x57,0xE3,0x80,0x00,0x81,0xE0,0xB0,0x30,0xC0,0xE1, + 0x00,0x00,0x67,0xD2,0x07,0x00,0xA0,0xC1,0x03,0x00,0x50,0xE1,0xB8,0x11,0x9D,0xB5, + 0x07,0x00,0x83,0xB0,0x01,0x00,0x80,0xB0,0xB8,0x01,0x8D,0xB5,0x05,0x10,0xA0,0xE1, + 0x04,0x00,0xA0,0xE1,0xDF,0xF7,0xFF,0xEB,0xBC,0x11,0x9D,0xE5,0x6C,0x23,0x9F,0xE5, + 0x08,0x11,0x91,0xE7,0x80,0x00,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x80,0x88,0xE2, + 0x01,0x40,0x84,0xE2,0xB0,0x10,0xC0,0xE1,0xB0,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1, + 0x7F,0xFF,0xFF,0x3A,0x01,0x50,0x85,0xE2,0x0B,0x00,0x55,0xE1,0x7A,0xFF,0xFF,0x3A, + 0x75,0xFA,0xFF,0xEB,0x1C,0x63,0x9F,0xE5,0xA8,0x01,0x9D,0xE5,0xBE,0x00,0xC6,0xE1, + 0xAC,0x01,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x0A,0x00,0x00,0x0A,0xB0,0x01,0x9D,0xE5, + 0x64,0x10,0xA0,0xE3,0x9B,0x00,0x00,0xE0,0x90,0x01,0x01,0xE0,0xB8,0x01,0x9D,0xE5, + 0xA4,0x21,0x9D,0xE5,0x92,0x00,0x00,0xE0,0x28,0xEC,0xFF,0xEB,0xA8,0x11,0x9D,0xE5, + 0x01,0x00,0x50,0xE1,0xBE,0x00,0xC6,0x31,0xB0,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3, + 0x90,0x01,0x07,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA,0x49,0x0F,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x98,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1, + 0x1A,0xEC,0xFF,0xEB,0x88,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x7E,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1, + 0x84,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x94,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x07,0x10,0xA0,0xE1,0x0D,0xEC,0xFF,0xEB,0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x71,0xFA,0xFF,0xEB, + 0x00,0x00,0x45,0xE0,0x78,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x91,0x00,0x00,0xE0,0x84,0x50,0x86,0xE0,0x64,0x10,0xA0,0xE3,0x92,0xEB,0xFF,0xEB, + 0x01,0x40,0x84,0xE2,0xB0,0x07,0xC5,0xE1,0x0B,0x00,0x54,0xE1,0xDA,0xFF,0xFF,0x3A, + 0x64,0x00,0xA0,0xE3,0x9B,0x00,0x07,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA, + 0xD4,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x90,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x07,0x10,0xA0,0xE1,0xF1,0xEB,0xFF,0xEB,0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x55,0xFA,0xFF,0xEB, + 0x00,0x50,0xA0,0xE1,0x34,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x8C,0x11,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1,0xE4,0xEB,0xFF,0xEB,0x7C,0x11,0x9D,0xE5, + 0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1, + 0x48,0xFA,0xFF,0xEB,0x00,0x00,0x45,0xE0,0x74,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x91,0x00,0x00,0xE0,0x84,0x50,0x86,0xE0,0x64,0x10,0xA0,0xE3, + 0x69,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2,0xB8,0x09,0xC5,0xE1,0xB0,0x01,0x9D,0xE5, + 0x00,0x00,0x54,0xE1,0xD9,0xFF,0xFF,0x3A,0xB4,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x09,0x00,0x00,0xDA,0x30,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0,0xB8,0x19,0xD0,0xE1, + 0x2C,0x00,0x9D,0xE5,0x80,0x00,0x86,0xE0,0xB0,0x07,0xD0,0xE1,0x00,0x10,0x81,0xE0, + 0xB4,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE0,0xB0,0x0C,0xC6,0xE1,0xB0,0x01,0x9D,0xE5, + 0x01,0x00,0x40,0xE2,0x9B,0x00,0x01,0xE0,0x10,0x00,0x9D,0xE5,0xBF,0xEB,0xFF,0xEB, + 0xB6,0x10,0xD6,0xE1,0x0C,0x20,0x9D,0xE5,0x40,0x00,0x11,0xE3,0x10,0x00,0x00,0x0A, + 0x82,0x00,0x59,0xE1,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85,0x08,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35,0x14,0x00,0x59,0xE3,0x13,0x00,0x00,0x9A, + 0x10,0x00,0x00,0xEA,0x02,0x00,0x59,0xE1,0x08,0x00,0x59,0x83,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85, + 0x08,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85, + 0x04,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35, + 0x0A,0x00,0x59,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x14,0x00,0x8D,0xE5, + 0x20,0x20,0x8D,0xE2,0x05,0x00,0x92,0xE8,0x18,0x30,0x9D,0xE5,0x02,0x00,0x80,0xE1, + 0x1C,0x20,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x03,0x20,0x02,0xE0,0x00,0x20,0x82,0xE1, + 0x14,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13, + 0x02,0x00,0x90,0xE1,0x28,0x00,0x9D,0x05,0x00,0x00,0x50,0x03,0x09,0x00,0x00,0x0A, + 0xC4,0x00,0x96,0xE5,0x01,0x00,0x80,0xE2,0xC4,0x00,0x86,0xE5,0xC8,0x00,0xD6,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xC8,0x00,0xC6,0x15,0x71,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xC8,0x00,0xD6,0xE5,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0xC8,0x00,0xC6,0xE5,0xB4,0x18,0xDA,0xE1,0x01,0x00,0x50,0xE1, + 0xF5,0xFF,0xFF,0x1A,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC6,0xE5,0xC4,0x00,0x96,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xC4,0x00,0x86,0xC5,0xEE,0xFF,0xFF,0xEA, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x02,0x10,0x40,0xC8,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0xCA,0x49,0xC8,0x4F,0xC9,0x88,0xB8,0x7D,0xC9,0x4C, + 0x00,0x25,0x49,0x06,0x8D,0xB0,0x00,0xD4,0xA0,0x7C,0x03,0x90,0xC3,0x48,0x40,0x38, + 0x42,0x79,0x06,0x00,0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38, + 0xB3,0x7A,0x00,0x7A,0xFE,0xF7,0x79,0xFB,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7, + 0x69,0xFB,0x31,0x00,0x20,0x39,0x0A,0x7A,0xC0,0x39,0x00,0x06,0x0C,0x91,0x09,0x79, + 0x00,0x0E,0xFE,0xF7,0x63,0xFB,0x00,0x06,0xBA,0x7D,0xA1,0x7C,0x00,0x0E,0xFE,0xF7, + 0x5D,0xFB,0x00,0x06,0xB4,0x4E,0x00,0x0E,0x02,0x90,0x30,0x7B,0x00,0x28,0x02,0xD0, + 0xB2,0x48,0x40,0x89,0x0A,0xE0,0xAE,0x49,0x78,0x8A,0xC9,0x88,0x49,0x06,0x00,0xD4, + 0xE0,0x89,0xAF,0x49,0xC9,0x8A,0x40,0x18,0x00,0x04,0x00,0x0C,0x00,0x27,0x04,0x90, + 0x77,0x61,0x30,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0x79,0xFA,0x01,0xF0,0x67,0xFA,0x01,0x20,0x30,0x62,0xFC,0xF7,0xD9,0xFB,0xA0,0x48, + 0x05,0x22,0x01,0x00,0xFF,0x31,0x61,0x31,0x0A,0x91,0x9E,0x49,0xD2,0x01,0xE0,0x39, + 0x8B,0x18,0x09,0x93,0x03,0x00,0xC0,0x33,0x80,0x31,0x07,0xAC,0x0A,0xC4,0x02,0x99, + 0xC9,0x1C,0x06,0x91,0x51,0x00,0x44,0x18,0x80,0x18,0x05,0x90,0x10,0xE1,0x30,0x7A, + 0x00,0x28,0x04,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x53,0xFA,0xFF,0x20, + 0x81,0x30,0xFB,0xF7,0x91,0xF9,0x03,0x20,0x01,0xF0,0x8A,0xF9,0x00,0xF0,0x68,0xF9, + 0x01,0x20,0x40,0x05,0xFC,0xF7,0x16,0xFE,0xFF,0xF7,0xD2,0xFB,0x00,0x20,0xFC,0xF7, + 0x11,0xFE,0x87,0x48,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06, + 0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0x50,0xF8,0xFC,0xF7,0x46,0xFE, + 0x84,0x48,0x04,0x99,0x80,0x8B,0x40,0x18,0x7D,0x49,0x89,0x89,0x88,0x42,0x10,0xD9, + 0x0A,0x98,0x40,0x78,0x00,0x28,0x0C,0xD1,0x79,0x48,0xFF,0x21,0xC0,0x88,0x19,0x31, + 0x08,0x42,0x06,0xD1,0x03,0x98,0x6D,0x1C,0x85,0x42,0x03,0xDD,0xFC,0xF7,0x36,0xFE, + 0x00,0xE0,0x00,0x25,0x00,0xF0,0xFA,0xFD,0x00,0xF0,0x7C,0xFD,0x00,0xF0,0xD0,0xFD, + 0x09,0x99,0x08,0x98,0x49,0x88,0x40,0x68,0x88,0x42,0x0C,0xDB,0x0A,0x98,0x40,0x78, + 0x00,0x28,0x04,0xD1,0x6A,0x48,0x46,0x21,0xC0,0x88,0x08,0x42,0x03,0xD0,0x6A,0x49, + 0x01,0x20,0x48,0x70,0x02,0xE0,0x70,0x78,0x00,0x28,0x0D,0xD0,0xFC,0xF7,0x6C,0xFB, + 0x64,0x48,0x01,0x21,0xE0,0x38,0xC0,0x7F,0x40,0x08,0x01,0xF0,0x63,0xF8,0x62,0x48, + 0x47,0x70,0x08,0x98,0x47,0x60,0xA9,0xE0,0xFC,0xF7,0xD6,0xFD,0xFD,0xF7,0x4E,0xFF, + 0x00,0x28,0x08,0xD0,0x77,0x61,0x05,0x98,0x80,0x7B,0xC8,0x28,0x10,0xD2,0x05,0x99, + 0x40,0x1C,0x88,0x73,0x0C,0xE0,0x70,0x69,0x40,0x1C,0x70,0x61,0x70,0x69,0x01,0x28, + 0x01,0xD1,0x59,0x48,0x07,0x73,0x70,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7,0x38,0xFB, + 0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x60,0x68,0xFF,0x21,0xFF,0x31, + 0x88,0x42,0x03,0xDA,0x40,0x1C,0x60,0x60,0x00,0xE0,0x67,0x60,0x09,0x99,0x20,0x68, + 0x49,0x89,0x88,0x42,0x0A,0xDD,0x61,0x68,0xFF,0x20,0xF5,0x30,0x81,0x42,0x05,0xDD, + 0x01,0x20,0x70,0x70,0x27,0x60,0x67,0x60,0x08,0x99,0x48,0x60,0x47,0x48,0x41,0x68, + 0x09,0x07,0x07,0xD5,0xC1,0x68,0x00,0x29,0x04,0xD0,0xC0,0x68,0x01,0x21,0x49,0x07, + 0xC8,0x63,0x06,0xE0,0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0x15,0xFC,0x00,0xF0, + 0x11,0xF9,0xFC,0xF7,0x39,0xFE,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B, + 0x00,0x28,0x01,0xD1,0x00,0xF0,0xC0,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28, + 0x4C,0xD1,0x07,0x98,0x00,0x7A,0x00,0x28,0x01,0xD0,0xFF,0xF7,0x67,0xFA,0x00,0xF0, + 0x9B,0xF8,0x03,0x20,0x01,0xF0,0x9E,0xF8,0xF0,0x62,0x03,0x20,0x01,0xF0,0xCC,0xF8, + 0xFF,0x20,0x81,0x30,0xFB,0xF7,0xB8,0xF8,0x2D,0x48,0x00,0x78,0x00,0x28,0x2F,0xD1, + 0xFC,0xF7,0xEA,0xFE,0x00,0x28,0x2B,0xD0,0xB0,0x6A,0x00,0x28,0x0B,0x90,0x27,0xD0, + 0xF0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x26,0x49,0xFA,0xF7,0x6F,0xFD,0x0B,0x99, + 0x08,0x1A,0x32,0x28,0x1C,0xDD,0x01,0xF0,0x73,0xF9,0x01,0xF0,0x77,0xF9,0xB0,0x79, + 0x00,0x28,0x0D,0xD0,0x00,0xF0,0x4E,0xF8,0x00,0xF0,0x51,0xF8,0x00,0xF0,0x59,0xF8, + 0x1D,0x4E,0x01,0x20,0x70,0x60,0xFB,0xF7,0x9F,0xF8,0x1C,0x48,0x70,0x60,0x03,0xE0, + 0x1B,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0x67,0xF9,0x18,0x48,0x07,0x70, + 0x0D,0x4E,0x70,0x69,0x06,0x99,0x88,0x42,0x00,0xD2,0xE8,0xE6,0x0C,0x98,0x0C,0x49, + 0x40,0x78,0xA0,0x39,0x48,0x73,0x08,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x01,0xF0, + 0x31,0xF9,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xE0,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20,0x90,0x08,0x00,0x20,0x00,0x40,0x00,0x30, + 0xAD,0x0B,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00, + 0xAC,0x0B,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20, + 0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60, + 0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x78,0x00,0x00,0x10,0xB5,0xFC,0xF7,0xC5,0xFC,0xFA,0xF7, + 0x19,0xFD,0x03,0x20,0x40,0x03,0xFB,0xF7,0x1F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x03,0x20,0x10,0xB5,0x40,0x03,0xFB,0xF7,0x1F,0xF8,0xFA,0xF7,0x15,0xFD,0xFC,0xF7, + 0xBB,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0,0x8D,0xFB,0x05,0x49, + 0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7,0x3D,0xFF,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x16,0x48,0x17,0x4E,0x00,0x78, + 0x00,0x25,0x01,0x90,0x14,0x48,0x00,0x78,0x00,0x90,0x1C,0xE0,0x14,0x49,0x68,0x00, + 0x00,0x24,0x47,0x18,0x60,0x37,0x12,0xE0,0x29,0x00,0x20,0x00,0xFD,0xF7,0x3C,0xFC, + 0x0F,0x4B,0x62,0x00,0xD3,0x18,0x98,0x22,0x9A,0x5E,0x10,0x23,0xFB,0x5E,0x40,0x00, + 0x31,0x5E,0xD2,0x18,0x89,0x1A,0x00,0xD5,0x00,0x21,0x64,0x1C,0x31,0x52,0x01,0x98, + 0x84,0x42,0xE9,0xD3,0x6D,0x1C,0x00,0x98,0x85,0x42,0xDF,0xD3,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x63,0x4F,0x00,0x26,0x78,0x7A,0xC0,0x07,0x12,0xD0, + 0x61,0x48,0x00,0x89,0x00,0x28,0x0E,0xD0,0x60,0x49,0x88,0x42,0x0B,0xD0,0x1E,0x21, + 0x48,0x43,0x64,0x21,0xFA,0xF7,0x82,0xFC,0x39,0x8A,0x46,0x18,0x4B,0x20,0xC0,0x00, + 0x86,0x42,0x00,0xD9,0x06,0x00,0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7E,0xD0, + 0x57,0x48,0x00,0x21,0x01,0x70,0x02,0x20,0x00,0xF0,0xB6,0xFF,0x55,0x48,0x0A,0x21, + 0x00,0x6B,0xFA,0xF7,0x6B,0xFC,0x01,0x00,0x02,0x20,0x00,0xF0,0x99,0xFF,0x01,0x2D, + 0x0B,0xD0,0x02,0x2D,0x08,0xD1,0x60,0x68,0x00,0x02,0x00,0x0E,0x01,0x28,0x03,0xD1, + 0x60,0x68,0x00,0x06,0x00,0xD1,0x00,0xE0,0x6D,0x1C,0x78,0x7A,0x00,0x28,0x08,0xD0, + 0x60,0x68,0x49,0x49,0x81,0x43,0x04,0xD0,0x61,0x68,0x48,0x48,0x88,0x43,0x00,0xD0, + 0x6D,0x1C,0xF8,0x79,0x00,0x28,0x04,0xD1,0x45,0x48,0x41,0x69,0x02,0x15,0x11,0x43, + 0x41,0x61,0x44,0x48,0x01,0x68,0x44,0x48,0xC1,0x61,0x02,0x24,0x20,0x00,0x00,0xF0, + 0x77,0xFF,0x42,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x03,0x04,0x35,0x48, + 0x35,0x4A,0x41,0x7A,0x3C,0x48,0x97,0x89,0x21,0xE0,0x42,0x69,0x52,0x06,0x0E,0xD4, + 0x00,0x29,0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA2,0x00,0xD2,0x18,0x12,0x68,0xC2,0x61, + 0x04,0xE0,0xCA,0x07,0x01,0xD0,0xC6,0x61,0x00,0xE0,0xC7,0x61,0x64,0x1C,0x2C,0x4A, + 0x12,0x78,0x00,0x2A,0x0B,0xD0,0xFD,0xF7,0xCB,0xFC,0x26,0x48,0x01,0x7A,0x00,0x29, + 0x07,0xD0,0x00,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x0C,0xF8,0x01,0xE0,0xAC,0x42, + 0xDB,0xD9,0x02,0x20,0x00,0xF0,0x50,0xFF,0x21,0x4D,0x28,0x78,0x00,0x28,0x27,0xD1, + 0xFD,0xF7,0xDC,0xFB,0x00,0x28,0x23,0xD0,0x1E,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7, + 0xFD,0xFB,0x01,0x00,0x02,0x20,0x00,0xF0,0x2B,0xFF,0x02,0x20,0x00,0xE0,0x26,0xE0, + 0x00,0xF0,0x2E,0xFF,0x13,0x4C,0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7, + 0x9F,0xFC,0x20,0x7A,0x00,0x28,0x04,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C,0x00,0xF0, + 0xE1,0xFF,0xFD,0xF7,0xBB,0xFB,0x00,0x28,0xEE,0xD1,0x02,0x20,0x00,0xF0,0x24,0xFF, + 0x12,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60,0x00,0xF0,0x25,0xF8,0x05,0x48, + 0xC0,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0xFA,0xF7,0x05,0xFF,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0xAD,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x4E,0x1D,0x00,0x80,0x4E,0x1D, + 0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02, + 0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0xBF,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x40,0x18,0x70,0x47,0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4, + 0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00, + 0x70,0xB5,0x1E,0x49,0x1C,0x4C,0x0D,0x00,0x20,0x78,0xA1,0x22,0xFF,0x35,0x92,0x00, + 0xBF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0,0x5A,0x22,0x21,0x1D,0x28,0x00,0xFF,0xF7, + 0x33,0xF8,0x17,0x49,0x09,0x22,0x30,0x00,0xFF,0xF7,0x2E,0xF8,0x20,0x78,0x60,0x70, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21,0x30,0x00,0xFF,0xF7,0x40,0xF8, + 0x5A,0x22,0x00,0x21,0x28,0x00,0xFF,0xF7,0x3B,0xF8,0x0D,0x48,0x5A,0x22,0x00,0x21, + 0x63,0x38,0xFF,0xF7,0x35,0xF8,0x0A,0x48,0x09,0x22,0x00,0x21,0x09,0x38,0xFF,0xF7, + 0x2F,0xF8,0x00,0x20,0x05,0x49,0x60,0x70,0xA0,0x70,0xCA,0x88,0x23,0x23,0x9A,0x43, + 0xCA,0x80,0x04,0x49,0x88,0x75,0xDB,0xE7,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x6B,0x08,0x00,0x20,0x30,0x0A,0x00,0x20,0xF3,0xB5,0x93,0x48,0x91,0xB0,0x40,0x7E, + 0x02,0x90,0x92,0x48,0x00,0x78,0x00,0x28,0x91,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01, + 0x40,0x18,0x01,0x8A,0x8F,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91, + 0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91, + 0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30, + 0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B, + 0x05,0x91,0x7D,0x49,0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92, + 0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x78,0x4C, + 0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98, + 0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0, + 0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0, + 0x1B,0xFF,0x20,0x8C,0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08, + 0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A, + 0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90, + 0x61,0x48,0x01,0x78,0x61,0x48,0x00,0x78,0x08,0x90,0x61,0x48,0x80,0x7E,0xC2,0x07, + 0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E,0x09,0x06,0x09,0x0E,0x04,0xE0,0x08,0x98, + 0x40,0x1E,0x00,0x06,0x00,0x0E,0x08,0x90,0x20,0x00,0xFA,0xF7,0xF5,0xF9,0x0A,0x99, + 0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xFA,0xF7,0xED,0xF9,0x09,0x99, + 0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97, + 0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB, + 0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22, + 0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43, + 0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A, + 0xFA,0xF7,0xC2,0xF9,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0, + 0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7, + 0xB3,0xF9,0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18, + 0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98, + 0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42, + 0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43, + 0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xFA,0xF7,0x85,0xF9,0x86,0x19, + 0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00, + 0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21,0xFA,0xF7,0x76,0xF9,0x07,0x99,0x89,0x07, + 0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99, + 0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A, + 0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A, + 0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x4C,0xFE, + 0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0x04,0x0B,0x00,0x20, + 0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0xFE,0xB5,0x66,0x4D,0x64,0x48,0x00,0x26,0x29,0x00,0xFF,0x31, + 0x00,0x96,0x42,0x78,0x61,0x31,0x08,0x78,0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0, + 0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7, + 0x55,0xFC,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42, + 0x14,0xD3,0xA9,0x19,0x13,0x22,0x00,0x90,0xFF,0x20,0x92,0x01,0x65,0x30,0x89,0x18, + 0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x70,0x76,0x1C,0x65,0x32,0x03,0x20,0x01,0x23, + 0x69,0x46,0x00,0xF0,0x2F,0xFA,0x64,0x1C,0x09,0x2C,0xDA,0xDB,0x8F,0xE0,0x49,0x78, + 0x00,0x29,0x01,0xD1,0x00,0x28,0xF9,0xD0,0x15,0x20,0x40,0x01,0x00,0x24,0x2E,0x18, + 0x13,0x27,0xBF,0x01,0x28,0x19,0xC0,0x19,0x40,0x78,0x00,0x28,0x3F,0xD0,0x13,0x21, + 0x28,0x18,0x49,0x01,0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0,0x32,0x7B,0x00,0x2A, + 0x14,0xD0,0x05,0x21,0xC9,0x01,0x40,0x18,0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xBF,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0x00,0xFA,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x00,0xFC,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x65,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0xE7,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x78,0x40,0x1C, + 0x4A,0x70,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24, + 0x23,0x49,0x13,0x22,0x08,0x19,0x52,0x01,0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92, + 0x00,0x28,0x31,0xD0,0x32,0x7B,0x00,0x2A,0x2E,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0xD1,0xFB,0x00,0x28,0x24,0xD0,0x19,0x48, + 0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x21,0xD3,0x15,0x4A,0x00,0x20,0x11,0x18, + 0xC9,0x19,0x49,0x78,0xA1,0x42,0x0B,0xD0,0x00,0x29,0x06,0xD1,0xFF,0x21,0x65,0x31, + 0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x70,0x05,0xE0,0x40,0x1C,0x08,0x28,0xEE,0xDB, + 0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0x65,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0x9E,0xF9,0x64,0x1C,0x09,0x2C,0xC0,0xDB,0x00,0x98, + 0x00,0xF0,0xA6,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xFE,0xB5,0x51,0x48,0x36,0x25,0x45,0x5F, + 0x51,0x48,0x50,0x4F,0xC4,0x78,0x00,0x26,0x02,0x94,0x00,0x79,0x84,0x46,0x4C,0x48, + 0x80,0x30,0x82,0x7D,0x86,0x46,0x4D,0x48,0x81,0x7E,0xC8,0x07,0x0A,0xD0,0x88,0x07, + 0x03,0xD5,0x64,0x1E,0x24,0x06,0x24,0x0E,0x04,0xE0,0x60,0x46,0x40,0x1E,0x00,0x06, + 0x00,0x0E,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2, + 0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A, + 0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A, + 0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x02,0x9B,0x4B,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58, + 0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00, + 0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46, + 0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06, + 0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04, + 0x12,0x14,0x26,0x48,0x80,0x30,0xC1,0x6A,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B, + 0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x62, + 0x1E,0x49,0x80,0x31,0x09,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA, + 0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x01,0x63,0x74,0x46,0xA4,0x8B, + 0xC5,0x6A,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0x00,0x6B, + 0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29, + 0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B, + 0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xF8,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D, + 0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29, + 0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61, + 0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0, + 0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61, + 0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0x69,0xF8,0xB0,0x62,0x30,0x7B,0x00,0x28, + 0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x39,0x00,0xFA,0xF7,0x5A,0xF8,0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0x80,0x79,0x00,0x00,0x81,0x11,0x01,0x00,0x10,0x00,0x10,0x00, + 0x0E,0x48,0x0F,0x4A,0x43,0x78,0x0F,0x49,0xD0,0x1D,0xC9,0x88,0xFF,0x32,0xF9,0x30, + 0xC1,0x32,0x02,0x2B,0x04,0xD9,0x12,0x6A,0x49,0x06,0x0C,0xD4,0xC2,0x69,0x0A,0xE0, + 0x02,0x2B,0x04,0xD1,0xD2,0x69,0x49,0x06,0x05,0xD4,0x82,0x69,0x03,0xE0,0x92,0x69, + 0x49,0x06,0x00,0xD4,0x42,0x69,0x04,0x48,0x42,0x62,0x70,0x47,0x50,0x07,0x00,0x20, + 0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40,0x70,0xB4,0x0D,0x48, + 0x0E,0x4E,0xC0,0x88,0x0D,0x4D,0x01,0x21,0x42,0x06,0x0B,0x48,0xC9,0x03,0x32,0x23, + 0x74,0x00,0x32,0x3D,0x00,0x2A,0x01,0xDA,0x09,0x4A,0x00,0xE0,0x09,0x4A,0x02,0x61, + 0x46,0x61,0x81,0x61,0xC3,0x61,0x01,0x62,0x44,0x62,0x81,0x62,0xC5,0x62,0x70,0xBC, + 0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0xA1,0x00,0x40,0x64,0x40,0x00,0x00, + 0x00,0x00,0x01,0x03,0x00,0x80,0x00,0x03,0x70,0xB5,0x01,0x25,0x6D,0x03,0x28,0x00, + 0xFA,0xF7,0x32,0xFB,0x16,0x48,0x04,0x68,0x28,0x00,0xFA,0xF7,0x25,0xFB,0x15,0x4D, + 0xE2,0x06,0xD2,0x0E,0xE0,0x04,0x14,0x49,0xC0,0x0E,0x2A,0x71,0xE8,0x70,0x0B,0x7D, + 0x12,0x48,0x83,0x76,0x4B,0x7D,0xC3,0x76,0x83,0x7E,0x11,0x48,0xDC,0x07,0x0A,0xD0, + 0x9B,0x07,0x04,0xD5,0xEA,0x78,0x52,0x1E,0x02,0x72,0x00,0x22,0x02,0xE0,0x52,0x1E, + 0x02,0x72,0x01,0x22,0x6A,0x71,0x8A,0x7D,0x42,0x72,0xCA,0x7D,0x82,0x72,0x0A,0x7E, + 0xC2,0x72,0x4A,0x7E,0x02,0x73,0x89,0x7E,0x41,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47, + 0x40,0x90,0x00,0x40,0xF8,0x0A,0x00,0x20,0x00,0x78,0x00,0x00,0x30,0x0A,0x00,0x20, + 0x70,0x0A,0x00,0x20,0xF8,0xB5,0x05,0x00,0x0E,0x00,0x14,0x00,0x19,0x00,0x10,0x00, + 0xFA,0xF7,0xEE,0xFF,0x00,0x28,0x05,0xD0,0x30,0x68,0x40,0x1E,0x30,0x60,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x2D,0x48,0x80,0x7E,0xC0,0x07,0x26,0xD0,0xE0,0x79,0x05,0x28, + 0x21,0xD0,0x09,0x28,0x21,0xD1,0x2A,0x49,0x6D,0x08,0x6D,0x00,0x23,0x78,0x01,0x20, + 0x8C,0x46,0x13,0xE0,0x0A,0x22,0x01,0x00,0x51,0x43,0x26,0x4A,0x89,0x18,0x0A,0x00, + 0xFF,0x32,0xA1,0x32,0x97,0x7F,0xBB,0x42,0x07,0xD1,0xFF,0x31,0xC1,0x31,0x0F,0x88, + 0x67,0x80,0xD2,0x7F,0x62,0x70,0x49,0x88,0xA1,0x80,0x40,0x1C,0x61,0x46,0x49,0x78, + 0x81,0x42,0xE7,0xDA,0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x20,0xA9,0x07,0x80,0x06, + 0x81,0x43,0x20,0x78,0x3F,0x22,0x92,0x02,0x00,0x07,0x80,0x08,0x01,0x43,0x16,0x48, + 0x01,0x40,0x60,0x88,0x80,0x05,0x80,0x09,0x01,0x43,0x60,0x78,0x91,0x43,0x80,0x06, + 0x00,0x0C,0x01,0x43,0x08,0x04,0x80,0x0E,0x0A,0x28,0x09,0xD2,0x40,0x1C,0x0A,0x23, + 0x58,0x43,0x3F,0x28,0x00,0xDD,0x3F,0x20,0x80,0x06,0x91,0x43,0x00,0x0C,0x01,0x43, + 0x88,0x0A,0xA1,0x88,0x80,0x02,0x01,0x22,0x89,0x05,0x89,0x0D,0x08,0x43,0x31,0x68, + 0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60,0xA1,0xE7,0x00,0x00,0x30,0x0A,0x00,0x20, + 0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4, + 0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28, + 0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72,0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71, + 0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73,0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71, + 0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00, + 0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00, + 0x10,0x00,0xF9,0xF7,0x41,0xFE,0x38,0x80,0x21,0x00,0x30,0x00,0xF9,0xF7,0x3C,0xFE, + 0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00, + 0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43, + 0x99,0x1A,0x00,0x91,0xF9,0xF7,0x20,0xFE,0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99, + 0x80,0x1B,0x78,0x43,0xF9,0xF7,0x18,0xFE,0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00, + 0xF3,0xB5,0x8D,0x79,0x0C,0x00,0x1F,0x49,0x28,0x07,0x80,0x08,0x08,0x40,0x86,0x0A, + 0xE0,0x79,0xB6,0x02,0x81,0xB0,0x40,0x07,0x1A,0xD5,0x1B,0x4F,0x00,0x21,0x38,0x89, + 0x00,0x28,0x15,0xD0,0x19,0x4A,0x90,0x42,0x0C,0xD0,0x1E,0x21,0x48,0x43,0x64,0x21, + 0xF9,0xF7,0xD4,0xFE,0x16,0x49,0x09,0x88,0x41,0x18,0x2D,0x20,0x00,0x01,0x81,0x42, + 0x00,0xD9,0x01,0x00,0x88,0x05,0x80,0x0D,0x06,0x43,0x68,0x00,0xC0,0x19,0xC1,0x81, + 0x3F,0x20,0x80,0x02,0x86,0x43,0xE0,0x79,0x01,0x21,0x49,0x07,0x80,0x06,0x00,0x0C, + 0x06,0x43,0x01,0x98,0x80,0x00,0x40,0x18,0x46,0x60,0xE0,0x79,0xC0,0x06,0x80,0x0F, + 0x04,0xD0,0x08,0x48,0x01,0x21,0xC1,0x75,0x00,0x21,0x01,0x76,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xF0,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0x08,0x0B,0x00,0x20,0x30,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4D,0x0C,0x4C,0x2D,0x78, + 0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18, + 0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B, + 0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x10,0xB4,0x05,0x4C,0x03,0x4B,0x24,0x78, + 0x60,0x43,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78,0x58,0x43,0x40,0x18, + 0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20, + 0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02, + 0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x15,0x4A,0x15,0x4B,0x52,0x7D,0x13,0x4F,0x00,0x21, + 0x16,0x02,0x16,0x43,0x1A,0x78,0x10,0x4D,0x42,0x43,0x20,0x3F,0x12,0xE0,0xBB,0x7D, + 0x8B,0x42,0x0D,0xD0,0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0, + 0x7B,0x7E,0x8B,0x42,0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52, + 0x52,0x1C,0x49,0x1C,0x06,0x4B,0x04,0x00,0x1B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42, + 0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x14,0x4A,0x13,0x4B,0x52,0x7D,0x00,0x21,0x11,0x4C, + 0x15,0x02,0x15,0x43,0x11,0x4E,0x20,0x3B,0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0, + 0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42, + 0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52,0x32,0x78,0x80,0x18, + 0x49,0x1C,0x07,0x4A,0x37,0x78,0x12,0x78,0x7A,0x43,0x82,0x42,0xE5,0xD8,0xF0,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1, + 0x80,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xF8,0xB5,0x03,0x00, + 0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31, + 0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68,0x00,0xF0,0x0C,0xFA, + 0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62,0x50,0x6B,0x60,0x62, + 0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x26,0x62, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7,0x89,0x69,0x21,0x62, + 0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40,0x00,0x78,0x00,0x00, + 0x07,0x4A,0x10,0xB5,0xD1,0x88,0x40,0x23,0x00,0x28,0x01,0xD0,0x19,0x43,0x00,0xE0, + 0x99,0x43,0xD1,0x80,0xFF,0xF7,0xFE,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xFE,0xB5,0x41,0x4C,0x05,0x00,0x27,0x6A,0x0E,0x00,0x60,0x6A, + 0x02,0x90,0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x9E,0xFF, + 0x73,0x20,0x00,0x01,0x20,0x62,0x23,0x20,0x60,0x62,0x07,0x20,0x40,0x02,0x60,0x63, + 0x02,0x20,0xE0,0x62,0x00,0x20,0xFB,0xF7,0x45,0xFD,0x35,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0xFE,0xF7,0x4B,0xFA,0xFB,0xF7,0x89,0xFD,0x2C,0x00,0x46,0xE0,0x68,0x1E, + 0x84,0x42,0x01,0xD1,0xFB,0xF7,0xAC,0xFD,0xFB,0xF7,0x4E,0xFD,0xFB,0xF7,0xFC,0xFD, + 0x00,0x2E,0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x60,0xFD,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7, + 0x55,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00, + 0x05,0x21,0xF9,0xF7,0x4B,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20, + 0x0C,0xE0,0x05,0x21,0x28,0x00,0xF9,0xF7,0x41,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7,0xD2,0xFA, + 0x0C,0xE0,0x68,0x00,0x03,0x21,0xF9,0xF7,0x31,0xFD,0xA0,0x42,0xDB,0xD9,0x03,0x21, + 0x28,0x00,0xF9,0xF7,0x2B,0xFD,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2, + 0x0C,0x48,0x44,0x88,0x03,0xE0,0xFB,0xF7,0x07,0xFD,0xFB,0xF7,0xB5,0xFD,0x64,0x1E, + 0xF9,0xD2,0xFB,0xF7,0x2B,0xFD,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99, + 0x41,0x63,0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x80,0x90,0x00,0x40, + 0x80,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C, + 0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E, + 0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60, + 0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x78,0x00,0x00,0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xAD,0x0B,0x00,0x20, + 0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B, + 0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68, + 0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28, + 0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07, + 0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9, + 0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47, + 0x00,0x78,0x00,0x00,0xF8,0xB5,0x17,0x48,0x00,0x24,0x40,0x78,0x00,0x28,0x25,0xD0, + 0x15,0x4D,0x13,0x26,0x00,0x20,0xB6,0x01,0xAB,0x19,0x12,0xE0,0x81,0x00,0x49,0x19, + 0x89,0x19,0xCA,0x68,0x97,0x0F,0xFF,0x07,0x0A,0xD0,0x92,0x00,0x01,0x27,0x92,0x08, + 0xFF,0x07,0xD2,0x19,0x64,0x1C,0xCA,0x60,0xA1,0x00,0xBF,0x08,0xC9,0x19,0x4A,0x60, + 0x40,0x1C,0x99,0x7A,0x81,0x42,0xE9,0xDC,0x08,0x48,0x09,0x22,0x00,0x21,0xFE,0xF7, + 0x2F,0xF9,0x20,0x00,0xFF,0xF7,0xB4,0xFF,0xFC,0xF7,0x18,0xFD,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20,0xB1,0x0A,0x00,0x20, + 0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C,0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7, + 0x65,0xFC,0x05,0x4A,0x05,0x49,0x20,0x00,0x00,0x23,0xF9,0xF7,0x67,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20, + 0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00, + 0xF9,0xF7,0x4C,0xFC,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23,0xF9,0xF7,0x4E,0xFC, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x75,0x00,0x00,0x02,0x4B,0x58,0x60, + 0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5, + 0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xAC,0x0B,0x00,0x20, + 0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07, + 0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60,0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68, + 0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68, + 0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60, + 0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60, + 0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5, + 0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF9,0xF7,0xE1,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00, + 0x89,0x08,0x49,0x1E,0xC9,0x04,0x01,0x22,0xC9,0x08,0xD2,0x07,0x89,0x18,0x40,0x04, + 0x40,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B, + 0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x30,0x0B,0x30,0x00,0x03,0x03,0x00,0x04,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xC0,0x0F,0x00,0x7F,0xC0,0x0F,0x01,0x7F,0xC1,0x0F,0x02,0x3F,0xC3,0x0F,0x03, + 0xBF,0xC3,0x0F,0x04,0x9F,0xC3,0x0F,0x05,0xDF,0x83,0x0F,0x06,0xCF,0x83,0x0F,0x07, + 0xEF,0x03,0x0F,0x08,0xE7,0x43,0x0F,0x09,0xF7,0x43,0x0E,0x0A,0xF3,0xC3,0x0E,0x0B, + 0xFB,0xC3,0x0C,0x4C,0xF9,0xC3,0x0D,0x0D,0xFD,0xC3,0x09,0x0E,0xFC,0xC3,0x0B,0x0F, + 0xFE,0xC3,0x03,0x10,0xFE,0xC3,0x07,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, + 0x00,0x02,0xA0,0x0A,0x00,0x0C,0x90,0x0C,0x00,0x03,0xB0,0x0E,0x00,0x18,0x80,0x10, + 0x80,0x01,0xC0,0x12,0x00,0x30,0x70,0x1C,0xC0,0x00,0xD0,0x1E,0x00,0x60,0x60,0x20, + 0x60,0x00,0xE0,0x22,0x00,0xC0,0x50,0x00,0x30,0x00,0xF0,0x00,0x08,0x80,0x40,0x00, + 0x10,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xE0,0xC3,0x03,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x24,0x24,0x24,0x24,0x24,0x26,0x24,0x24,0x26,0x28,0x26,0x26,0x26,0x26, + 0x2A,0x26,0x26,0x20,0x20,0x25,0x20,0x20,0x20,0x28,0x20,0x20,0x55,0x55,0x20,0x55, + 0x55,0x55,0x20,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x03,0x03,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x06,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xF0,0x00,0x40,0x01,0xE8,0x03,0x00,0x00,0x74,0x27,0x00,0x00,0x3C,0x28,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0xD0,0x07,0xD0,0x07,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x69,0x00,0x6C,0x00,0x00,0x00,0x00,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x04,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x07,0x00,0x00,0x20,0x05,0x00,0x00, + 0x20,0x05,0x00,0x00,0x20,0x05,0x00,0x00,0x20,0x05,0x00,0x00,0x20,0x05,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0x2C,0x01, + 0x28,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x1E,0x00,0x46,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x5F,0x00,0x90,0x01,0x90,0x01,0x90,0x01, + 0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x32,0x32,0x96,0x32,0x40,0x64, + 0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x41,0xF2,0x00,0x00, + 0x08,0x08,0x88,0x00,0x20,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00,0x64,0x00,0x46,0x00, + 0x99,0x19,0x90,0x01,0x32,0x00,0x1D,0x00,0x64,0x46,0x64,0x32,0x64,0x00,0x3C,0x00, + 0xFA,0x00,0xFA,0x00,0x96,0x00,0x64,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0xF4,0x01, + 0xF4,0x01,0xF4,0x01,0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x32,0x32, + 0x96,0x32,0x40,0x64,0x64,0x64,0xFF,0x00,0x00,0x00,0xC2,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00, + 0x41,0xF2,0x00,0x00,0x08,0x08,0xA8,0x00,0x20,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00, + 0x78,0x00,0x64,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x96,0x00,0xC8,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00, + 0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x28,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x47,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0D,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x05,0x00,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x0F,0xC8,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x41,0xF2,0x00,0x00, + 0x10,0x00,0x10,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x08,0x08,0x88,0x00, + 0x20,0x5F,0x20,0x3F,0xFF,0xFF,0x00,0x00,0x10,0x10,0x08,0x84,0x00,0x00,0xAC,0x0D, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x08,0x20, + 0x51,0x55,0x13,0x00,0x11,0x90,0x01,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, + 0x87,0x88,0x78,0x00,0x40,0x60,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x33,0x30,0x03,0x00,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30,0x12,0x14,0x00,0x00,0x0C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01, + 0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01, + 0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01, + 0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01, + 0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01,0x4F,0x31,0x1F,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x0D,0x00,0xA0,0xE1,0x10,0xD0,0x9F,0xE5,0x01,0x40,0x2D,0xE9,0x77,0x01,0x00,0xEB, + 0x01,0x40,0xBD,0xE8,0x00,0xD0,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0xF0,0x0F,0x00,0x20, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0x40,0x1E,0xFD,0xD2, + 0x70,0x47,0xF0,0xB5,0xFB,0x49,0xFA,0x4A,0x01,0x20,0x08,0x61,0xF9,0x4C,0x00,0x21, + 0x61,0x61,0xA1,0x61,0x0B,0x00,0xF7,0x4C,0x00,0x21,0x61,0x61,0x01,0x00,0x49,0x1E, + 0xFD,0xD2,0x03,0x21,0x09,0x04,0x61,0x61,0x01,0x00,0x49,0x1E,0xFD,0xD2,0x01,0x27, + 0x3F,0x04,0x67,0x61,0x01,0x00,0x49,0x1E,0xFD,0xD2,0x01,0x26,0x35,0x00,0x9D,0x40, + 0x31,0x04,0x29,0x43,0x61,0x61,0x01,0x00,0x49,0x1E,0xFD,0xD2,0x65,0x61,0x41,0x00, + 0x8E,0x46,0x49,0x1E,0xFD,0xD2,0xE7,0x69,0x00,0x21,0x5C,0x01,0xA4,0x46,0x64,0x46, + 0x64,0x18,0x3D,0x00,0xCD,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19,0x49,0x1C, + 0x20,0x29,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xCC,0xD3,0xDD,0x4C,0x00,0x21, + 0x61,0x61,0xA1,0x61,0x0B,0x00,0xDB,0x4C,0x00,0x21,0xA1,0x61,0x01,0x00,0x49,0x1E, + 0xFD,0xD2,0x03,0x21,0x09,0x04,0xA1,0x61,0x01,0x00,0x49,0x1E,0xFD,0xD2,0x01,0x25, + 0x2D,0x04,0xA5,0x61,0x01,0x00,0x49,0x1E,0xFD,0xD2,0x01,0x26,0x9E,0x40,0x31,0x00, + 0x29,0x43,0xA1,0x61,0x01,0x00,0x49,0x1E,0xFD,0xD2,0xA6,0x61,0x71,0x46,0x49,0x1E, + 0xFD,0xD2,0xE7,0x69,0x5C,0x01,0xFF,0x34,0x00,0x21,0xFF,0x34,0x02,0x34,0xA4,0x46, + 0x64,0x46,0x64,0x18,0x3D,0x00,0xCD,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19, + 0x49,0x1C,0x20,0x29,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xCB,0xD3,0x40,0x1C, + 0xC8,0x28,0x8B,0xD9,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xBF,0x48,0x10,0xB5,0x40,0x6B, + 0xBE,0x4C,0xC5,0x22,0xA0,0x60,0x20,0x00,0xD2,0x00,0x00,0x21,0x0C,0x30,0xFF,0xF7, + 0x6F,0xFF,0x01,0x20,0x20,0x70,0xFF,0xF7,0x74,0xFF,0xB9,0x48,0xB9,0x49,0xC8,0x61, + 0xB9,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0xFE,0x22,0xC2,0x60,0x00,0x22, + 0x42,0x61,0x20,0x00,0x0C,0x30,0x04,0xC8,0xCA,0x61,0x4A,0x69,0x52,0x06,0xFC,0xD4, + 0xF9,0xE7,0x10,0xB4,0xB1,0x4C,0x20,0x68,0xE1,0x05,0x80,0x00,0x80,0x08,0x40,0x18, + 0x20,0x60,0x60,0x68,0x80,0x00,0x80,0x08,0x60,0x60,0xA0,0x68,0x80,0x00,0x80,0x08, + 0xA0,0x60,0x00,0x20,0x81,0x00,0x0A,0x19,0x11,0x6A,0x40,0x1C,0x8B,0x00,0xC9,0x01, + 0xDB,0x0E,0xC9,0x0E,0x49,0x06,0x1B,0x05,0x19,0x43,0x14,0x28,0x11,0x62,0xF1,0xD3, + 0xA2,0x48,0xA3,0x49,0x40,0x30,0x01,0x63,0xA2,0x49,0x41,0x63,0xA2,0x49,0x08,0x69, + 0x40,0x08,0x40,0x00,0x08,0x61,0xA0,0x48,0x40,0x30,0x01,0x68,0x9F,0x49,0x01,0x60, + 0x9F,0x48,0x95,0x49,0xC8,0x60,0x10,0xBC,0x70,0x47,0xFC,0xB5,0x9D,0x4C,0x02,0x00, + 0x30,0x34,0x18,0xCC,0x00,0x20,0x00,0x94,0x9B,0x4C,0x24,0x7D,0xE4,0x07,0x2D,0xD0, + 0x8E,0x4C,0x25,0x79,0xE6,0x78,0x98,0x4C,0xAE,0x46,0xA5,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xE5,0x7D,0x01,0x95,0x25,0x7E,0x67,0x7E,0xA4,0x7E,0x10,0xD0,0xB2,0x42, + 0x1C,0xD1,0x8C,0x45,0x08,0xD0,0x01,0x9A,0x8A,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8C,0x42,0x00,0xD1,0x00,0x98,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0xB1,0x42,0x0B,0xD1,0x94,0x45,0xF7,0xD0,0x01,0x99,0x91,0x42,0xF4,0xD0,0x95,0x42, + 0xF2,0xD0,0x97,0x42,0xF0,0xD0,0x94,0x42,0xEE,0xD0,0xEE,0xE7,0x18,0x00,0xEC,0xE7, + 0x30,0xB4,0x76,0x4B,0x81,0x4C,0x5B,0x78,0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A, + 0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43, + 0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52, + 0x00,0x20,0x30,0xBC,0x70,0x47,0xF3,0xB5,0x75,0x48,0x82,0xB0,0x01,0x90,0x00,0x20, + 0x00,0x90,0x6D,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x63,0x4F,0x6A,0x48, + 0xC0,0x68,0xC0,0x07,0xFB,0xD0,0x00,0x24,0x26,0x00,0x25,0xE0,0x00,0x25,0x1F,0xE0, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0x91,0xFF,0x00,0x28,0x17,0xD0,0x79,0x78,0x01,0x9A, + 0x71,0x43,0x49,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x02,0x99, + 0x00,0x29,0x02,0xD0,0x00,0x28,0x09,0xDA,0x01,0xE0,0x00,0x28,0x06,0xDD,0x03,0x9A, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0xB4,0xFF,0x40,0x1C,0x00,0xD1,0x64,0x1C,0x6D,0x1C, + 0x78,0x78,0x85,0x42,0xDC,0xD3,0x76,0x1C,0xB8,0x78,0x86,0x42,0xD6,0xD3,0xB8,0x78, + 0x79,0x78,0x48,0x43,0xA0,0x42,0x0A,0xD0,0x00,0x98,0x41,0x1C,0x00,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0x03,0xD8,0x4C,0x48,0xC1,0x68,0xC1,0x60,0xBF,0xE7,0xFF,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0xB4,0x00,0x21,0x4C,0x4C,0x4B,0x4B,0x3F,0x4E,0x1E,0x25, + 0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E, + 0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0xA5,0x52,0x72,0x78,0x80,0x18,0x49,0x1C,0xB2,0x78,0x77,0x78,0x7A,0x43, + 0x82,0x42,0xE6,0xD8,0xF0,0xBC,0x70,0x47,0xF0,0xB4,0x30,0x4B,0x00,0x21,0x5A,0x78, + 0x1E,0x26,0x3A,0x4D,0x42,0x43,0x38,0x4F,0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0, + 0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42, + 0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C, + 0x22,0x4B,0x04,0x00,0x5B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42,0xE5,0xD8,0xD9,0xE7, + 0x02,0x04,0x2A,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3, + 0x70,0x47,0xF0,0xB5,0x19,0x4C,0x23,0x4D,0x21,0x78,0x25,0x4E,0xA8,0x6B,0x00,0x29, + 0x00,0xD0,0x00,0x0C,0x00,0x06,0x00,0x0E,0x01,0x02,0x01,0x43,0x08,0x04,0x00,0x0C, + 0xFF,0xF7,0xE6,0xFF,0x1C,0x48,0x00,0x7D,0xC0,0x07,0x08,0xD0,0xE0,0x78,0x00,0x28, + 0x20,0x79,0x02,0xD0,0xFF,0xF7,0xB8,0xFF,0x01,0xE0,0xFF,0xF7,0x93,0xFF,0x12,0x48, + 0x00,0x21,0x80,0x30,0xC1,0x62,0x09,0x4A,0xE8,0x6B,0x12,0x78,0x00,0x2A,0x06,0x4A, + 0x51,0x63,0x51,0x68,0x26,0xD1,0x09,0x09,0x09,0x01,0x00,0x07,0x00,0x0F,0x25,0xE0, + 0x08,0x08,0x00,0x20,0x00,0xA1,0x00,0x40,0x00,0xA0,0x00,0x40,0xFC,0x05,0x00,0x20, + 0xAB,0xFC,0xFF,0x8F,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x80,0x06,0x10,0x40, + 0xFF,0xF3,0x0F,0x00,0x02,0x00,0x02,0x00,0x00,0x90,0x00,0x40,0x0D,0x12,0x00,0x00, + 0xF0,0xC3,0x0F,0x00,0xC0,0x0F,0x00,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x02,0x10,0x40,0x09,0x09,0x09,0x01,0x00,0x03,0x00,0x0F,0x01,0x43,0x51,0x60, + 0x03,0x24,0x27,0x1F,0x01,0xE0,0x03,0x2C,0x02,0xD1,0x01,0x25,0xED,0x43,0x09,0xE0, + 0x02,0x2C,0x01,0xD1,0x01,0x25,0x05,0xE0,0x01,0x2C,0x01,0xD1,0x3D,0x00,0x01,0xE0, + 0x00,0x2C,0xF7,0xD0,0xE0,0x07,0xC0,0x0F,0x29,0x00,0xFF,0xF7,0xF4,0xFE,0x64,0x1E, + 0xE9,0xD5,0x4F,0x4D,0x01,0x27,0x2B,0x00,0x0C,0x3B,0x18,0x78,0x00,0x28,0x23,0xD1, + 0x4C,0x4A,0x09,0x20,0xD1,0x68,0x39,0x43,0xD1,0x60,0xD1,0x68,0xC9,0x07,0xFC,0xD0, + 0x40,0x1E,0x41,0x1C,0xF6,0xD1,0x0E,0xE0,0x00,0x20,0x08,0xE0,0x4A,0x43,0x12,0x18, + 0x94,0x00,0x34,0x59,0x52,0x00,0x24,0x05,0x24,0x0D,0x40,0x1C,0xAC,0x52,0x5A,0x78, + 0x90,0x42,0xF3,0xD3,0x49,0x1C,0x98,0x78,0x81,0x42,0xED,0xD3,0x19,0x78,0x18,0x00, + 0x00,0x29,0x01,0xD1,0x81,0x68,0x02,0xE0,0x98,0x68,0x01,0x0C,0x09,0x04,0x3A,0x48, + 0x41,0x63,0x38,0x4A,0x09,0x20,0xD1,0x68,0x39,0x43,0xD1,0x60,0xD1,0x68,0xC9,0x07, + 0xFC,0xD0,0x40,0x1E,0xF7,0xD2,0x00,0x27,0x29,0xE0,0x00,0x24,0x21,0xE0,0x21,0x00, + 0x38,0x00,0xFF,0xF7,0x5A,0xFE,0x00,0x28,0x1A,0xD0,0x2D,0x49,0x0C,0x39,0x0A,0x78, + 0x00,0x2A,0x15,0xD1,0x49,0x78,0x79,0x43,0x0A,0x19,0x53,0x00,0xE9,0x5A,0x81,0x42, + 0x04,0xD9,0x09,0x1A,0x09,0x04,0xC9,0x0C,0x40,0x18,0x03,0xE0,0x41,0x1A,0x09,0x04, + 0xC9,0x0C,0x40,0x1A,0x91,0x00,0x71,0x58,0x09,0x05,0x09,0x0D,0x40,0x1A,0xE8,0x52, + 0x64,0x1C,0x1F,0x48,0x0C,0x38,0x40,0x78,0x84,0x42,0xD8,0xD3,0x7F,0x1C,0x1C,0x48, + 0x0C,0x38,0x81,0x78,0x8F,0x42,0xD0,0xD3,0xD4,0xE5,0xF0,0xB5,0x18,0x4D,0x1B,0x4E, + 0x00,0x24,0x01,0x27,0x0C,0x3D,0x17,0x48,0x40,0x30,0x01,0x68,0x15,0x4A,0x08,0x04, + 0x00,0x0E,0x09,0x06,0x09,0x0E,0x68,0x70,0xA9,0x70,0x12,0x69,0xD2,0x07,0xD2,0x0F, + 0x32,0x7D,0x02,0xD0,0x92,0x07,0x06,0xD4,0x01,0xE0,0x92,0x07,0x03,0xD5,0x49,0x1E, + 0x29,0x71,0xEF,0x70,0x03,0xE0,0x40,0x1E,0x28,0x71,0x00,0x20,0xE8,0x70,0x20,0x00, + 0x64,0x1C,0xFF,0xF7,0xFE,0xFE,0x28,0x78,0x01,0x28,0x01,0xD0,0x01,0x2C,0x05,0xD0, + 0x02,0x2C,0x03,0xD0,0xFF,0xF7,0xCD,0xFD,0x01,0x2C,0xD4,0xD9,0xA2,0xE5,0x00,0x00, + 0x08,0x06,0x00,0x20,0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0x00,0x78,0x00,0x00, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x2B,0x01,0x00,0x20,0x49,0x53,0x54,0x56, + 0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x7B,0x00,0x00,0xC0,0x75,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7B,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00, + 0x00,0x02,0x00,0x00,0x63,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x49,0x53,0x54,0x56, + 0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0007.h b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0007.h new file mode 100644 index 00000000..034fe46e --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Corsica_VE_Ver0007.h @@ -0,0 +1,2162 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: Corsica VE EELY, f/w 7( 30401) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x40,0x00,0x00,0x20,0x94,0x02,0x00,0x00,0xCC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x30,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x10,0xB4,0x2B,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x20,0x48,0x10,0xD1,0x91,0x06,0x0E,0xD1, + 0x0A,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xCE,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0B,0x48, + 0x0E,0xD1,0x89,0x06,0x0C,0xD1,0x08,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0xA5,0xFF,0x64,0x1E,0x60,0x1C,0xF3,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0x64,0xFF,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x2C,0x0B,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x2F,0xFD,0x07,0x00,0x03,0xF0,0x62,0xFC,0x03,0xF0,0x54,0xFC, + 0x03,0xF0,0xDA,0xFC,0x49,0x4A,0x4A,0x49,0x4A,0x48,0x04,0xF0,0xA8,0xFE,0x4A,0x4D, + 0x00,0x26,0x01,0x21,0xC9,0x03,0x30,0x00,0x2E,0x82,0x00,0xF0,0xC9,0xF9,0xA8,0x61, + 0x46,0x49,0x00,0x20,0x00,0xF0,0xC4,0xF9,0x45,0x4B,0x46,0x49,0xD8,0x63,0x46,0x48, + 0x00,0xF0,0xBE,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x9C,0xFC, + 0xA1,0x22,0x42,0x48,0xD2,0x00,0x00,0x21,0x04,0xF0,0x94,0xFE,0x06,0xF0,0x02,0xFB, + 0x03,0xF0,0x3E,0xFD,0x3E,0x48,0x01,0x24,0x81,0x7A,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0xFF,0x20,0x91,0x30,0x6E,0x72,0x68,0x82,0xAE,0x72,0xEE,0x72, + 0x2E,0x73,0x01,0x20,0x6E,0x73,0xA8,0x73,0x34,0x48,0x64,0x07,0x60,0x63,0xFF,0x20, + 0xE0,0x63,0xE0,0x14,0x00,0xF0,0xC2,0xFC,0x32,0x48,0x06,0x70,0xFF,0x20,0x81,0x30, + 0x00,0xF0,0xBC,0xFC,0x30,0x49,0x02,0x20,0x06,0xF0,0xEC,0xFD,0x02,0x20,0x06,0xF0, + 0xF1,0xFD,0x28,0x7A,0x00,0x28,0x01,0xD0,0x06,0xF0,0x9C,0xFE,0x00,0x2F,0x1F,0xD1, + 0x2A,0x4F,0xBE,0x15,0x28,0x7A,0x00,0x28,0x02,0xD0,0x29,0x49,0x28,0x6B,0x88,0x60, + 0xE0,0x6B,0x0B,0x28,0x14,0xD0,0x27,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0, + 0xC5,0xFA,0xF8,0x68,0x24,0x49,0x88,0x42,0xEC,0xD9,0x24,0x48,0xC0,0x68,0xFF,0x28, + 0x06,0xD1,0xB8,0x68,0xB0,0x43,0xB8,0x60,0xB8,0x68,0x30,0x43,0xB8,0x60,0xE1,0xE7, + 0xE8,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x7F,0xFC,0x28,0x7A, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0x76,0xFE,0x02,0x20,0x06,0xF0,0xC7,0xFD,0xFF,0x20, + 0x81,0x30,0x00,0xF0,0x73,0xFC,0x16,0x49,0x05,0x20,0x03,0xF0,0x79,0xFA,0x0B,0x20, + 0xE0,0x63,0x03,0xF0,0x09,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x28,0x00,0x00,0x00, + 0x90,0x73,0x00,0x00,0x40,0x00,0x00,0x20,0xF8,0x0A,0x00,0x20,0xC0,0x75,0x00,0x00, + 0xC0,0x0F,0x00,0x20,0x00,0x7E,0x00,0x00,0x00,0x76,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x00,0x78,0x00,0x00,0xAD,0x0B,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40, + 0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x75,0x00,0x00, + 0x19,0x71,0x00,0x00,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x20,0x20,0x52,0xE2, + 0x05,0x00,0x00,0x3A,0x18,0x50,0xB1,0xE8,0x20,0x20,0x52,0xE2,0x18,0x50,0xA0,0xE8, + 0x18,0x50,0xB1,0xE8,0x18,0x50,0xA0,0xE8,0xF9,0xFF,0xFF,0x2A,0x02,0xCE,0xB0,0xE1, + 0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28,0x18,0x00,0xB1,0x48,0x18,0x00,0xA0,0x48, + 0x10,0x40,0xBD,0xE8,0x02,0xCF,0xB0,0xE1,0x04,0x30,0x91,0x24,0x04,0x30,0x80,0x24, + 0x1E,0xFF,0x2F,0x01,0x82,0x2F,0xB0,0xE1,0xB2,0x30,0xD1,0x20,0x01,0x20,0xD1,0x44, + 0xB2,0x30,0xC0,0x20,0x01,0x20,0xC0,0x44,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x01,0x30,0x90,0xE1,0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0, + 0x1A,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x01,0x00,0x00,0x3A,0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22, + 0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21, + 0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0, + 0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31, + 0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22, + 0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9, + 0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB, + 0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x01,0x00,0x10,0xB5,0x02,0x20,0x06,0xF0,0x85,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA6,0xFF,0xFF,0x3A, + 0x20,0x34,0x71,0xE0,0x98,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3,0xB7,0xFF,0xFF,0xEA, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x41,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xD1,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x79,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x00,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40, + 0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5, + 0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0F,0x24,0x02,0xF0,0xCC,0xF8,0x64,0x1E, + 0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7E, + 0xC0,0x07,0x26,0xD0,0x70,0x7D,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1, + 0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05, + 0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18, + 0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0,0x01,0xFA,0x64,0x1C,0x70,0x7D,0xA0,0x42, + 0xF3,0xDA,0x70,0x7D,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7D, + 0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x86,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07, + 0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7D,0xE4,0x00,0xE6,0x18,0x09,0x24,0xE4,0x01, + 0x36,0x19,0xB5,0x73,0x56,0x7D,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x35,0x82, + 0x56,0x7D,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x75,0x82,0x55,0x7D,0xED,0x00, + 0xED,0x18,0x2D,0x19,0x29,0x75,0x55,0x7D,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19, + 0x59,0x75,0x51,0x7D,0x49,0x1C,0x51,0x75,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x75,0x70,0xBC,0x70,0x47,0x01,0x20, + 0xFA,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0xFF,0xB5,0x0A,0x20, + 0x48,0x43,0x15,0x4F,0x81,0xB0,0xC5,0x19,0x48,0x00,0xFF,0x35,0x61,0x35,0xC0,0x19, + 0xC0,0x30,0x2A,0x71,0x0C,0x00,0x00,0x90,0x80,0x89,0x16,0x00,0x0A,0x21,0xFF,0xF7, + 0x2F,0xFF,0xE8,0x80,0x00,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0x29,0xFF,0x28,0x81, + 0x38,0x19,0xFF,0x30,0x01,0x30,0x00,0x7C,0xB9,0x19,0x68,0x71,0x04,0x98,0xA8,0x72, + 0x01,0x98,0x06,0x55,0x13,0x20,0x40,0x01,0x08,0x18,0x00,0x21,0xC4,0x76,0x81,0x74, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20,0x06,0x48,0x0F,0x23, + 0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A,0xD2,0x18,0x09,0x03, + 0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0xF0,0x05,0x00,0x20,0xF1,0xB5,0xB2,0x48, + 0x90,0xB0,0x0F,0x90,0x40,0x7C,0xB2,0x49,0x02,0x90,0x0F,0x98,0xC0,0x7C,0x01,0x90, + 0x0F,0x98,0x00,0x7C,0x00,0x90,0xAD,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06,0x02,0xD4, + 0xA9,0x48,0x40,0x30,0x80,0x89,0x00,0x05,0x7E,0xD5,0x10,0x98,0x01,0x28,0x00,0xD0, + 0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x3E,0xE1,0x03,0x98,0x81,0x00,0x01,0x20, + 0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90,0x0C,0x0F,0x80,0x0F, + 0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x81,0xFB,0x26,0xE1,0x9D,0x48,0xA5,0x00, + 0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9A,0x49,0x80,0x01,0x80,0x0D, + 0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80,0x4A,0x5B,0x24,0x31, + 0x4A,0x53,0x69,0x18,0x48,0x80,0x10,0xE1,0x02,0x9F,0x92,0x49,0x00,0x20,0x7F,0x1E, + 0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52, + 0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46,0x80,0x01,0x80,0x0D, + 0x0C,0x90,0x80,0x1A,0x02,0x9A,0x87,0x4E,0x92,0x00,0x8B,0x18,0x20,0x3B,0x98,0x83, + 0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90,0x52,0x88,0x80,0x1A, + 0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00,0xCF,0x5E,0x38,0x18, + 0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B,0x9A,0x42,0xF4,0xDB, + 0x19,0x00,0xFF,0xF7,0xAB,0xFD,0x07,0x00,0x02,0x99,0x30,0x00,0xFF,0xF7,0xA6,0xFD, + 0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42,0x17,0xDA,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21,0x48,0x43,0x0A,0x21, + 0xFF,0xF7,0x6E,0xFE,0x61,0x00,0x00,0xE0,0xCA,0xE0,0x6A,0x4B,0x1C,0x3B,0x5A,0x5E, + 0x90,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x10,0x18,0x58,0x52,0x07,0xE0,0x65,0x49, + 0x0F,0x9A,0x60,0x00,0x1C,0x39,0x0B,0x5A,0x52,0x7D,0x9A,0x1A,0x0A,0x52,0x61,0x49, + 0x60,0x00,0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E, + 0x01,0x99,0x88,0x42,0x09,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0,0x88,0x00,0x05,0x21, + 0xFF,0xF7,0x46,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x01,0x98, + 0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x3B,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC, + 0x03,0x20,0x14,0xE0,0x01,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7,0x31,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98,0x05,0x21,0xFF,0xF7,0x28,0xFE, + 0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x45,0x49, + 0x0A,0x39,0x08,0x55,0x43,0x49,0x0C,0x9A,0x24,0x31,0x48,0x5F,0x16,0x1A,0x08,0x90, + 0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A,0x3E,0x48,0x57,0x1A,0x06,0x91, + 0x0F,0x99,0x0A,0x38,0x00,0x5D,0x89,0x7D,0x88,0x42,0x27,0xD3,0x00,0x2E,0x01,0xD1, + 0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x00,0x99,0x88,0x42,0x01,0xDA, + 0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7,0x1F,0xFD,0x04,0x00, + 0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x00,0x99, + 0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7, + 0x0D,0xFD,0x08,0x99,0x00,0x2E,0x19,0xDB,0x09,0x19,0x18,0xE0,0x09,0x98,0x64,0x21, + 0x48,0x43,0x01,0x99,0xFF,0xF7,0x02,0xFD,0x64,0x21,0x08,0x1A,0x31,0x1E,0x05,0x90, + 0x00,0xDC,0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7,0xF8,0xFC,0x05,0x9A,0x04,0x00, + 0x38,0x1E,0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21,0xE0,0xE7,0x09,0x1B,0x06,0x9A, + 0x00,0x2F,0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A,0x16,0x4A,0x0C,0x9B,0x53,0x53, + 0x0A,0x9B,0x0B,0x9A,0x5A,0x80,0x13,0x4A,0x13,0x4B,0x24,0x32,0x51,0x53,0x07,0x9A, + 0x89,0x05,0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43,0x91,0x0A,0x89,0x02, + 0x80,0x05,0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98,0x40,0x1C,0x04,0x90, + 0x03,0x98,0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42,0x00,0xDA,0xBC,0xE6, + 0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xCA,0x0B,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4, + 0x27,0x21,0xDA,0x88,0x49,0x01,0x80,0x24,0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48, + 0x45,0x7B,0x8D,0x82,0xC5,0x89,0xCD,0x82,0x05,0x8A,0x0D,0x83,0x40,0x8A,0x48,0x83, + 0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43,0x88,0x83,0x06,0xE0,0x00,0x20,0x88,0x82, + 0xC8,0x82,0x08,0x83,0x48,0x83,0xA2,0x43,0x88,0x83,0xDA,0x80,0x30,0xBC,0x70,0x47, + 0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x7F,0xB5,0x24,0x4D,0x04,0x00,0x1A,0x28, + 0x0B,0xD1,0x28,0x6A,0x00,0x28,0x08,0xD1,0x68,0x6A,0x00,0x28,0x05,0xD1,0x20,0x4C, + 0x01,0xF0,0x62,0xFE,0x64,0x1E,0xFB,0xD2,0x14,0xE0,0x05,0xF0,0x73,0xF9,0x00,0x20, + 0x01,0xF0,0xD0,0xFC,0x01,0xF0,0x4E,0xFD,0x01,0xF0,0x96,0xFD,0x03,0xAA,0x01,0xA9, + 0x02,0xA8,0x04,0xF0,0x9F,0xFA,0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x94, + 0x00,0xF0,0x30,0xF8,0x02,0x20,0x06,0xF0,0xC9,0xF9,0x02,0x20,0x06,0xF0,0xBA,0xF9, + 0x10,0x48,0xE9,0x68,0xC1,0x61,0x29,0x69,0xC1,0x61,0x0F,0x49,0xCA,0x68,0x52,0x08, + 0x52,0x00,0xCA,0x60,0x0D,0x4A,0x0E,0x49,0x02,0xE0,0xD3,0x68,0x8B,0x42,0x02,0xD8, + 0x43,0x69,0x9B,0x06,0xF9,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5,0x01,0xF0,0x42,0xFE, + 0x01,0x20,0x00,0xF0,0x6B,0xF8,0x7F,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x9A,0xF9, + 0x1C,0x48,0x01,0x27,0x04,0x04,0x24,0x0C,0x7F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD, + 0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0,0xE2,0xF9,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x06,0xF0,0xDA,0xF9,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x75,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x62,0x90,0xFF,0x49,0x40,0x1E,0x5E,0x90,0xCB,0x79, + 0xFE,0x4F,0xFF,0x48,0xFA,0x88,0x54,0x06,0x00,0xD4,0xC3,0x78,0x54,0x06,0x05,0x93, + 0x0B,0x7A,0x00,0xD4,0x03,0x79,0xFB,0x4C,0xA4,0x8A,0x1B,0x19,0x1B,0x06,0x1B,0x0E, + 0x04,0x93,0x4B,0x7A,0x54,0x06,0x00,0xD4,0x43,0x79,0x52,0x06,0x03,0x93,0x89,0x7A, + 0x00,0xD4,0x81,0x79,0x00,0x20,0xF4,0x4C,0x02,0x91,0x3D,0x79,0x01,0x26,0x01,0x90, + 0x13,0xE0,0x0A,0x20,0x70,0x43,0x43,0x21,0xC0,0x19,0xC9,0x00,0x09,0x5C,0x00,0x29, + 0x0A,0xD0,0xEE,0x49,0x40,0x18,0x02,0xF0,0x5B,0xFE,0x00,0x28,0x04,0xD0,0x01,0x98, + 0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x78,0xB0,0x42,0xE8,0xDA, + 0xE7,0x48,0x72,0x90,0xC2,0x8A,0x41,0x8B,0x50,0x1A,0x00,0x28,0x00,0xDC,0x88,0x1A, + 0x03,0x04,0x72,0x98,0x72,0x99,0x00,0x8B,0x89,0x8B,0x1B,0x0C,0x42,0x1A,0x00,0x2A, + 0x00,0xDC,0x0A,0x1A,0x10,0x04,0x72,0x9A,0x00,0x21,0x91,0x74,0x72,0x9A,0x00,0x0C, + 0xD1,0x74,0x72,0x9A,0x11,0x75,0x01,0x99,0x00,0x29,0x10,0xD0,0x19,0x2B,0x0E,0xD2, + 0x28,0x28,0x03,0xD2,0x72,0x98,0x01,0x21,0x81,0x74,0x08,0xE0,0x50,0x28,0x03,0xD2, + 0x72,0x99,0x01,0x20,0xC8,0x74,0x02,0xE0,0x72,0x98,0x01,0x21,0x01,0x75,0x72,0x98, + 0x40,0x7C,0x00,0x28,0x16,0xD1,0x72,0x98,0x80,0x7C,0x00,0x28,0x02,0xD0,0x05,0x98, + 0x80,0x1C,0x0C,0xE0,0x72,0x98,0xC0,0x7C,0x00,0x28,0x02,0xD0,0x05,0x98,0x00,0x1D, + 0x05,0xE0,0x72,0x98,0x00,0x7D,0x00,0x28,0x04,0xD0,0x05,0x98,0x80,0x1D,0x00,0x06, + 0x00,0x0E,0x05,0x90,0x09,0x22,0x00,0x21,0x5B,0xA8,0x04,0xF0,0xDB,0xF8,0xF8,0x88, + 0xFF,0x21,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x05,0xD5,0x01,0xF0,0xB0,0xF8, + 0x73,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x78,0x00,0x28,0x01,0xD0,0x40,0x1E, + 0xE0,0x70,0x60,0x78,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0,0x18,0xE0,0x00,0x28, + 0x16,0xD1,0xB1,0x48,0x5A,0x22,0x00,0x21,0x5E,0x30,0x04,0xF0,0xBB,0xF8,0xE0,0x78, + 0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E,0x0A,0x00,0x14,0x23, + 0x5B,0xA8,0xFF,0xF7,0x7B,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD,0x25,0x70,0xE6,0xE1, + 0x09,0x22,0x01,0x21,0x58,0xA8,0x04,0xF0,0xA5,0xF8,0x02,0x20,0xA3,0x49,0x06,0x90, + 0x9E,0x48,0x5D,0x31,0x41,0x18,0x71,0x91,0xA0,0x49,0x54,0x31,0x40,0x18,0x70,0x90, + 0x13,0xE1,0x08,0x26,0x07,0xAF,0x24,0x20,0x70,0x43,0x07,0xA9,0x40,0x18,0x00,0x21, + 0x24,0x22,0xC9,0x43,0x04,0xF0,0x8E,0xF8,0x76,0x1E,0xF4,0xD5,0x06,0x98,0x01,0xF0, + 0xE7,0xFB,0x01,0x27,0x5F,0x90,0x53,0xE0,0x5F,0x98,0x01,0x26,0x60,0x90,0x4B,0xE0, + 0x0A,0x20,0x70,0x43,0x8D,0x49,0x40,0x18,0x01,0x00,0xFF,0x30,0xFF,0x30,0x02,0x30, + 0x6F,0x90,0x00,0x7E,0x00,0x28,0x3E,0xD0,0x8C,0x48,0x08,0x18,0x6E,0x90,0x02,0xF0, + 0x97,0xFD,0x06,0x99,0x08,0x43,0x07,0xD0,0x6E,0x98,0x02,0xF0,0x91,0xFD,0x00,0x28, + 0x31,0xD0,0x06,0x98,0x00,0x28,0x2E,0xD0,0x80,0x49,0x78,0x00,0x40,0x18,0xC0,0x30, + 0x6D,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0x6B,0xFB,0x6F,0x99,0x49,0x8B,0x0A,0x1A, + 0x00,0x2A,0x00,0xDC,0x42,0x1A,0x6D,0x98,0x61,0x92,0xC0,0x8B,0x0A,0x21,0xFF,0xF7, + 0x5F,0xFB,0x6F,0x99,0x89,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A,0x61,0x98, + 0x01,0x00,0x41,0x43,0x10,0x00,0x50,0x43,0x08,0x18,0x60,0x99,0x88,0x42,0x04,0xDA, + 0x24,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0x60,0x90,0x24,0x21,0x79,0x43,0x07,0xAA, + 0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x78,0xB0,0x42,0xB0,0xDA,0x7F,0x1C, + 0xAF,0x42,0xA9,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x23,0x5F,0x9A,0x18,0x00,0x15,0xE0, + 0x5B,0xA9,0x09,0x5C,0x00,0x29,0x10,0xD1,0x24,0x21,0x41,0x43,0x0F,0x00,0x07,0xAE, + 0x89,0x19,0xF6,0x59,0xB7,0x00,0xC9,0x59,0x91,0x42,0x06,0xDA,0x00,0x29,0x04,0xDB, + 0x00,0x2E,0x02,0xDB,0x0A,0x00,0x00,0x23,0x5E,0x90,0x40,0x1C,0xA8,0x42,0xE7,0xDD, + 0x00,0x2B,0x7E,0xD1,0x62,0x98,0x5E,0x9E,0x40,0x1C,0x62,0x90,0x24,0x20,0x46,0x43, + 0x07,0xA8,0x80,0x59,0x0A,0x21,0x48,0x43,0x50,0x49,0x0A,0x22,0x41,0x18,0x5E,0x98, + 0xFF,0x31,0x50,0x43,0x4D,0x4A,0xBF,0x31,0x87,0x18,0x38,0x00,0xFF,0x30,0x65,0x30, + 0x0A,0x22,0x03,0xF0,0xDB,0xFF,0x5E,0x98,0x48,0x49,0x40,0x00,0x40,0x18,0xC0,0x30, + 0x6C,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0xFB,0xFA,0xFF,0x37,0x61,0x37,0xF8,0x80, + 0x6C,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0xF3,0xFA,0x38,0x81,0x3F,0x48,0x5E,0x99, + 0x40,0x18,0xFF,0x30,0x01,0x30,0x00,0x7C,0x78,0x71,0xB8,0x7A,0x05,0x99,0x49,0x1C, + 0x88,0x42,0x01,0xD2,0x40,0x1C,0xB8,0x72,0xB8,0x7A,0x13,0x28,0x6B,0x90,0x09,0xD9, + 0x14,0x21,0xFF,0xF7,0xDD,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42,0x02,0xD2,0x6B,0x98, + 0x14,0x30,0xB8,0x72,0x38,0x79,0x5E,0x9A,0x5B,0xA9,0x88,0x54,0x71,0x9A,0x5E,0x99, + 0x81,0x54,0x39,0x79,0x70,0x9A,0x00,0x20,0x88,0x54,0x07,0xA9,0x89,0x59,0x58,0xAA, + 0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x24,0x23,0x58,0x43,0x07,0xAB,0x6A,0x90, + 0xC0,0x18,0x69,0x90,0x9B,0x59,0x00,0x22,0xD2,0x43,0x9B,0x00,0xC2,0x50,0x5B,0xA8, + 0x40,0x5C,0x5F,0x9B,0x00,0x28,0x11,0xD1,0xA2,0x78,0x01,0x20,0x94,0x46,0x0B,0xE0, + 0x69,0x9A,0x87,0x00,0xD2,0x59,0x00,0x2A,0x05,0xDB,0x9A,0x42,0x07,0xAF,0x02,0xDA, + 0x6A,0x9B,0xF8,0x50,0x13,0x00,0x40,0x1C,0x84,0x45,0xF1,0xDA,0x49,0x1C,0xA9,0x42, + 0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x78,0x62,0x99,0x88,0x42,0x05,0xDD,0x64,0x98, + 0x40,0x1C,0xA8,0x42,0x64,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98,0x41,0x1E,0x09,0x06, + 0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE3,0xE6,0x01,0x26,0x65,0x96,0x63,0x90, + 0x6F,0xE0,0x58,0xA8,0x80,0x5D,0x00,0x28,0x6A,0xD0,0x65,0x98,0x07,0x49,0x2F,0x18, + 0x0A,0x20,0x70,0x43,0x40,0x18,0x68,0x90,0xFF,0x30,0xFF,0x30,0x02,0x30,0x67,0x90, + 0x00,0x7E,0x70,0x99,0x40,0x5C,0x0D,0xE0,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x1E,0x02,0x00,0x00, + 0x70,0x08,0x00,0x20,0x03,0x99,0x88,0x42,0x34,0xD2,0x08,0x2F,0x32,0xDC,0x4C,0x49, + 0x68,0x98,0x40,0x18,0x02,0xF0,0x74,0xFC,0x00,0x28,0x2B,0xD0,0x67,0x98,0x70,0x99, + 0x00,0x7E,0x70,0x9A,0x47,0x4B,0x41,0x5C,0x49,0x1C,0x81,0x54,0x68,0x98,0x43,0x21, + 0xC9,0x00,0x41,0x18,0x0A,0x20,0x78,0x43,0xC0,0x18,0x66,0x90,0xFF,0x30,0x65,0x30, + 0x0A,0x22,0x03,0xF0,0x1B,0xFF,0x68,0x99,0x66,0x98,0xFF,0x31,0xC1,0x31,0x4A,0x79, + 0xFF,0x30,0x61,0x30,0xC2,0x72,0x89,0x79,0x01,0x73,0x67,0x98,0x5B,0xA9,0x00,0x7E, + 0xC8,0x55,0x71,0x99,0x47,0x54,0x65,0x98,0x40,0x1C,0x65,0x90,0x63,0x98,0x40,0x1C, + 0x63,0x90,0x15,0xE0,0x32,0x49,0x68,0x98,0x32,0x4F,0x40,0x18,0x02,0xF0,0x40,0xFC, + 0x00,0x28,0x0D,0xD0,0x72,0x99,0x01,0x20,0x08,0x74,0x67,0x98,0x80,0x7F,0x13,0x28, + 0x06,0xD9,0x60,0x78,0x01,0x28,0x03,0xD1,0xF8,0x88,0x04,0x21,0x08,0x43,0xF8,0x80, + 0x76,0x1C,0xA0,0x78,0xB0,0x42,0x8C,0xDA,0x26,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5, + 0x02,0x99,0x04,0x22,0xE1,0x70,0x23,0x49,0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0, + 0x5B,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x13,0x22,0x01,0x20,0x52,0x01,0x05,0x23, + 0xDB,0x01,0x1C,0x49,0x09,0x18,0x8F,0x18,0xFF,0x7E,0x00,0x2F,0x0C,0xD1,0xC9,0x18, + 0x09,0x79,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23, + 0x5B,0xA8,0xFF,0xF7,0xAB,0xFA,0x02,0xE0,0x40,0x1C,0x09,0x28,0xE9,0xDB,0xE0,0x78, + 0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18,0x38,0x00,0xFF,0x30, + 0x6B,0x30,0x02,0xF0,0xF5,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20,0xFF,0x37,0x61,0x37, + 0xB8,0x72,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0x63,0x98,0x28,0x18,0x20,0x70,0x20,0x78, + 0x05,0x49,0x5A,0x22,0xA0,0x70,0x08,0x00,0xB4,0x30,0x03,0xF0,0x9F,0xFE,0xE7,0xE5, + 0x1E,0x02,0x00,0x00,0xF0,0x05,0x00,0x20,0x54,0x07,0x00,0x20,0xF1,0xB5,0x3C,0x48, + 0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x3A,0x48,0x41,0x7F,0x01,0x91,0x01,0x00, + 0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43, + 0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29, + 0xFB,0xD1,0x03,0x90,0x01,0xF0,0x38,0xF9,0x01,0xF0,0xE6,0xF9,0x00,0x24,0x27,0x00, + 0x37,0xE0,0x00,0x26,0x30,0xE0,0x31,0x00,0x38,0x00,0x02,0xF0,0xC9,0xF8,0x00,0x28, + 0x28,0xD0,0x29,0x78,0x05,0x9A,0x79,0x43,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x05,0xF0,0x4E,0xFC,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18, + 0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x05,0xF0,0x40,0xFC,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD, + 0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x13,0x4D,0x28,0x78,0x86,0x42,0xCA,0xD3, + 0x7F,0x1C,0x12,0x48,0x00,0x78,0x87,0x42,0xC3,0xD3,0x10,0x48,0x0E,0x49,0x00,0x78, + 0x09,0x78,0x48,0x43,0xA0,0x42,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xA9,0xD9, + 0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90,0xEC,0xE7, + 0x00,0x02,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0xF0,0xB5,0x8A,0x4A,0xFF,0xB0,0x88,0xB0,0x40,0x18,0x85,0x92,0x42,0x00,0x80,0x18, + 0x84,0x90,0x48,0x42,0x83,0x90,0x86,0x48,0x86,0x4E,0x00,0x7A,0x02,0xAF,0x82,0x90, + 0x85,0x48,0x86,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0x83,0x98,0x40,0x42,0x83,0x90, + 0x01,0x22,0x52,0x02,0x00,0x21,0x30,0x00,0x03,0xF0,0x1C,0xFE,0x00,0x25,0x39,0xE0, + 0x00,0x24,0x32,0xE0,0x7C,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x15,0xD0,0x7B,0x49, + 0x09,0x78,0x00,0x29,0x82,0x99,0x16,0xD0,0x8D,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42, + 0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E, + 0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0x83,0x9A,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xC8,0xFB,0x10,0xE0,0x8C,0x42,0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0, + 0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42, + 0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x65,0x48,0x00,0x78,0x84,0x42, + 0xC8,0xD3,0x6D,0x1C,0x63,0x4C,0x20,0x78,0x85,0x42,0xC1,0xD3,0x01,0xF0,0x74,0xF8, + 0x01,0xF0,0x22,0xF9,0x00,0x25,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00, + 0x02,0xF0,0x06,0xF8,0x00,0x28,0x12,0xD0,0x59,0x49,0x85,0x9B,0x09,0x78,0x69,0x43, + 0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A, + 0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00, + 0x28,0x00,0x02,0xF0,0x73,0xF8,0x4E,0x49,0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00, + 0x64,0x1C,0x78,0x52,0x4A,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x49,0x48, + 0x01,0x78,0x8D,0x42,0xD0,0xD3,0x00,0x21,0x01,0x91,0x01,0xF0,0xED,0xF8,0x00,0x25, + 0x51,0xE0,0x00,0x24,0x4A,0xE0,0x21,0x00,0x28,0x00,0x01,0xF0,0xD1,0xFF,0x00,0x28, + 0x43,0xD0,0x3F,0x49,0x85,0x9B,0x09,0x78,0x69,0x43,0x09,0x19,0x8A,0x00,0x9A,0x58, + 0x03,0x04,0x12,0x05,0x12,0x0D,0x1B,0x0C,0xD3,0x1A,0x00,0x2B,0x01,0xDD,0x10,0x1A, + 0x00,0xE0,0x80,0x1A,0x49,0x00,0x73,0x5A,0x00,0x04,0x00,0x0C,0x83,0x42,0x0A,0xD9, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x39,0xF8,0x31,0x49,0x09,0x78,0x69,0x43, + 0x09,0x19,0x49,0x00,0x78,0x52,0x01,0x98,0x03,0x21,0xFF,0xF7,0x79,0xF8,0x00,0x29, + 0x01,0xD0,0x02,0x29,0x0D,0xD1,0x86,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22, + 0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0x04,0xFB, + 0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0xFC,0xFA, + 0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x1C,0x48,0x00,0x78, + 0x84,0x42,0xB0,0xD3,0x6D,0x1C,0x1B,0x48,0x00,0x78,0x85,0x42,0xA9,0xD3,0x01,0x98, + 0x40,0x1C,0x01,0x90,0x84,0x98,0x40,0x1E,0x84,0x90,0x1B,0xD2,0x14,0x4E,0x00,0x25, + 0x0E,0xE0,0x00,0x24,0x08,0xE0,0x68,0x43,0x00,0x19,0x40,0x00,0x3A,0x5A,0x21,0x00, + 0x28,0x00,0x05,0xF0,0xF9,0xFA,0x64,0x1C,0x30,0x78,0x84,0x42,0xF3,0xD3,0x6D,0x1C, + 0x0C,0x48,0x00,0x78,0x85,0x42,0xEC,0xD3,0x7F,0xB0,0x08,0xB0,0xF0,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x00,0xF0,0xC0,0xFF,0x7F,0xE7,0x00,0x00,0x00,0x02,0x10,0x40, + 0x70,0x0A,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x78,0x00,0x00,0xFD,0x0A,0x00,0x20, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68, + 0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48, + 0x00,0x90,0x80,0x7A,0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25,0x1F,0x4F,0xAD,0x01, + 0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7A,0x1B,0x0F,0x21,0xE0,0x84,0x00, + 0xE4,0x19,0x64,0x19,0xE4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00, + 0xC0,0x19,0x40,0x19,0xC0,0x68,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43, + 0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02, + 0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0, + 0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x5E,0x48,0x8E,0x46,0x02,0x8C,0x5E,0x49, + 0x40,0x8C,0x01,0x91,0xCB,0x88,0x40,0x39,0x00,0x91,0x89,0x7E,0x00,0x25,0x2F,0x00, + 0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xA6,0xE0,0x01,0x99, + 0x09,0x79,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29, + 0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00, + 0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42, + 0x58,0xDC,0x82,0x42,0x56,0xDB,0x8C,0x45,0x54,0xDC,0x8B,0x42,0x52,0xDB,0x01,0x25, + 0x72,0x46,0x00,0x2A,0x77,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x09,0x23,0x02,0x2A, + 0x17,0xD0,0x03,0x2A,0x71,0xD1,0xE2,0x79,0xD7,0x07,0x28,0xD0,0x01,0x2A,0x01,0xD0, + 0x05,0x2A,0x22,0xD1,0x00,0x25,0xE3,0x71,0x67,0xE0,0x00,0x9A,0x92,0x7D,0x00,0x2A, + 0x63,0xD1,0x00,0xF0,0x87,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72, + 0x5B,0xE0,0xE2,0x79,0xD6,0x07,0xE9,0xD1,0x92,0x07,0x56,0xD5,0x00,0xF0,0x7A,0xF8, + 0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71, + 0xFE,0xF7,0xE2,0xFF,0xEB,0xE7,0x02,0x20,0x46,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07, + 0x43,0xD5,0x00,0xF0,0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0, + 0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xCD,0xFF,0xA6,0x71, + 0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20, + 0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28, + 0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0, + 0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xA9,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0x9D,0xFF,0x01,0x25, + 0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07, + 0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88,0x00,0x06,0x80,0x0F, + 0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00,0xA0,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xF0,0xB4,0x18,0x4B,0x05,0x00,0xDE,0x7E,0x00,0x22,0x10,0x00, + 0x00,0x2E,0x26,0xD0,0x1B,0x7D,0x00,0x2B,0x23,0xD1,0x20,0xE0,0x13,0x4B,0xD4,0x00, + 0xE3,0x18,0x11,0x24,0xA4,0x01,0x1C,0x19,0x1C,0x27,0xE7,0x5F,0xAF,0x42,0x11,0xDC, + 0x23,0x27,0x7F,0x01,0xDB,0x19,0x00,0x27,0xDF,0x5F,0xAF,0x42,0x0A,0xDB,0x1E,0x27, + 0xE7,0x5F,0x8F,0x42,0x06,0xDC,0x02,0x24,0x1C,0x5F,0x8C,0x42,0x02,0xDB,0x50,0x1C, + 0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42, + 0xDC,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0x8F,0xB0,0x0A,0x90,0x09,0x90,0xC8,0x48,0xC8,0x4A,0x01,0x8A, + 0xD0,0x88,0x43,0x06,0x02,0xD4,0xC5,0x49,0xC0,0x39,0x89,0x89,0xC3,0x4D,0xC5,0x4E, + 0x60,0x35,0x08,0x91,0xE9,0x7B,0x43,0x06,0x00,0xD4,0xF1,0x7A,0x43,0x06,0x07,0x91, + 0xA9,0x7B,0x00,0xD4,0xB1,0x7A,0x43,0x06,0x06,0x91,0x69,0x7C,0x00,0xD4,0x71,0x7B, + 0x43,0x06,0x05,0x91,0xA9,0x79,0x00,0xD4,0xB1,0x78,0x02,0x07,0x04,0x91,0xB8,0x49, + 0x09,0x79,0x05,0xD5,0xB6,0x4A,0x00,0x29,0x02,0xD1,0x08,0x23,0x98,0x43,0xD0,0x80, + 0xB5,0x48,0x18,0x22,0x82,0x5E,0xFF,0x23,0x01,0x33,0x23,0x2A,0x03,0xDD,0x1A,0x22, + 0x82,0x5E,0x19,0x2A,0x03,0xDC,0x1C,0x22,0x82,0x5E,0x15,0x2A,0x05,0xDD,0xAC,0x4A, + 0xD4,0x88,0x1C,0x43,0xD4,0x80,0x02,0x22,0x04,0xE0,0x1E,0x22,0x82,0x5E,0x00,0x2A, + 0x02,0xD0,0x52,0x1E,0xC2,0x83,0x03,0xE0,0xA5,0x48,0xC2,0x88,0x9A,0x43,0xC2,0x80, + 0x08,0x98,0x80,0x04,0x78,0xD5,0xA4,0x4A,0x00,0x20,0x20,0x32,0x52,0x78,0x00,0x2A, + 0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0,0x43,0xF9,0x9C,0x48, + 0x9E,0x4C,0x00,0x79,0x01,0x28,0x0E,0x90,0x68,0xD1,0x99,0x4B,0x19,0x89,0x0D,0x91, + 0xDF,0x88,0x6A,0x89,0x7B,0x06,0x00,0xD4,0xF2,0x88,0x91,0x42,0x00,0xD3,0x00,0x20, + 0x03,0x90,0x0D,0x98,0x0A,0x22,0x0E,0x21,0x50,0x43,0x61,0x5E,0x0C,0x91,0xFE,0xF7, + 0x65,0xFD,0x29,0x78,0x92,0x4B,0x7A,0x06,0x0B,0x93,0x00,0xD4,0x19,0x7F,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x02,0x90,0x0C,0x99,0x0D,0x98,0x40,0x1A, + 0x0A,0x21,0xFE,0xF7,0x53,0xFD,0x69,0x78,0x7A,0x06,0x01,0xD4,0x0B,0x99,0x49,0x7F, + 0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0x22,0x89,0xA9,0x78, + 0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0x89,0x7F,0x8A,0x42,0x00,0xD8,0x00,0x20, + 0xE9,0x78,0x84,0x46,0x22,0x69,0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0xC9,0x7F, + 0x8A,0x42,0x00,0xDB,0x00,0x20,0x03,0x99,0x00,0x29,0x1F,0xD0,0x02,0x99,0x00,0x29, + 0x1C,0xD0,0x01,0x99,0x00,0x29,0x19,0xD0,0x61,0x46,0x00,0x29,0x16,0xD0,0x72,0x4A, + 0x01,0x21,0x80,0x3A,0x52,0x68,0x00,0x2A,0x00,0xD0,0x00,0x21,0x01,0x42,0x0D,0xD0, + 0x60,0x7B,0x00,0x28,0x24,0xD0,0x69,0x7A,0x7A,0x06,0x00,0xD4,0x71,0x79,0x88,0x42, + 0x1E,0xD8,0x40,0x1E,0x60,0x73,0x1B,0xE0,0x38,0xE0,0xFF,0xE7,0x64,0x48,0x29,0x79, + 0xC0,0x88,0x22,0x69,0x43,0x06,0x00,0xD4,0x31,0x78,0x8A,0x42,0x10,0xDB,0x0E,0x99, + 0x00,0x29,0x0D,0xD0,0xC1,0x06,0x0B,0xD4,0x61,0x7B,0xEA,0x79,0x40,0x06,0x00,0xD4, + 0xF2,0x78,0x91,0x42,0x04,0xD2,0x04,0x98,0x81,0x42,0x01,0xD9,0x49,0x1C,0x61,0x73, + 0x60,0x7B,0x04,0x99,0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98,0x00,0x28,0x0A,0xD1, + 0x53,0x49,0xC8,0x88,0x10,0x43,0xC8,0x80,0xC9,0x88,0x28,0x7A,0x49,0x06,0x00,0xD4, + 0x30,0x79,0x20,0x73,0x0D,0xE0,0x4E,0x4B,0xD8,0x88,0xC1,0x06,0x09,0xD5,0x21,0x7B, + 0x00,0x29,0x04,0xD1,0x90,0x43,0xD8,0x80,0x70,0x78,0x60,0x73,0x01,0xE0,0x49,0x1E, + 0x21,0x73,0x47,0x4F,0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5, + 0x05,0x99,0x06,0x98,0x40,0x1A,0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x50,0x00, + 0xC0,0x19,0x84,0x46,0xFF,0x30,0x41,0x30,0xC0,0x88,0x00,0x28,0x65,0xD0,0x07,0x99, + 0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07,0x5F,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88, + 0x08,0x21,0x08,0x43,0xF8,0x80,0x58,0xE0,0x06,0x99,0x88,0x42,0x55,0xD3,0x08,0x98, + 0x40,0x07,0x52,0xD5,0x00,0x24,0x01,0x20,0x27,0xE0,0xFF,0x23,0x39,0x18,0x3E,0x33, + 0x5B,0x5C,0x93,0x42,0x20,0xD1,0x64,0x1C,0xFF,0x31,0x01,0x31,0x09,0x7C,0x0A,0x91, + 0x01,0x00,0x12,0xE0,0x4B,0x00,0xDD,0x19,0x2B,0x00,0xC0,0x33,0xDE,0x89,0xE0,0x35, + 0x9E,0x81,0x2D,0x88,0xDD,0x83,0x7B,0x18,0xDD,0x1D,0xF9,0x35,0x6E,0x7C,0xFF,0x33, + 0x21,0x33,0x2E,0x74,0x9E,0x7F,0x49,0x1C,0x5E,0x77,0x3B,0x79,0x8B,0x42,0xE9,0xDA, + 0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD4,0xDA, + 0x00,0x2C,0x22,0xDD,0x01,0x2C,0x05,0xDD,0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21, + 0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30,0x01,0x30,0xC1,0x8B,0x38,0x79,0x40,0x1C, + 0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xC0,0x30,0x81,0x81,0x60,0x46, + 0xFF,0x30,0x21,0x30,0xC1,0x89,0x38,0x79,0x40,0x00,0xC0,0x19,0xC0,0x30,0xC1,0x83, + 0x3B,0x79,0x0D,0x49,0x0A,0x98,0x30,0x39,0x58,0x54,0x52,0x1C,0x08,0x2A,0x8E,0xDB, + 0x09,0x98,0x00,0x28,0x05,0xD1,0x00,0xE0,0x03,0xE0,0xF8,0x88,0x20,0x21,0x88,0x43, + 0xF8,0x80,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x07,0x00,0x20,0x30,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0xF0,0xB5,0x70,0x48,0xB1,0xB0,0x00,0x78,0x71,0x4B,0x70,0x4A, + 0x01,0x90,0x6E,0x48,0x00,0x78,0x00,0x90,0xD9,0x88,0x16,0x7D,0x6E,0x48,0x4C,0x06, + 0x00,0xD4,0x06,0x7C,0x55,0x7D,0x49,0x06,0x00,0xD4,0x45,0x7C,0x6B,0x48,0x00,0x21, + 0x2B,0x95,0x30,0x90,0xC1,0x81,0x50,0x22,0x16,0xA8,0x2A,0x91,0x03,0xF0,0xEA,0xF9, + 0x01,0x99,0x2B,0x98,0x2B,0x9D,0x08,0x1A,0xAD,0x1C,0x2F,0x90,0x80,0x1C,0x2E,0x90, + 0x35,0xE0,0x00,0x98,0x16,0xA9,0x80,0x1B,0x80,0x1C,0x86,0x46,0x2B,0x98,0xB4,0x1C, + 0x28,0x1A,0x80,0x00,0x47,0x18,0x40,0x3F,0x1E,0xE0,0x01,0x98,0x5C,0x49,0x00,0x1D, + 0x60,0x43,0x40,0x19,0x00,0x04,0x00,0x14,0x40,0x00,0x0A,0x5E,0x55,0x4B,0x68,0x00, + 0xC0,0x18,0x94,0x21,0x41,0x5E,0x60,0x00,0xC3,0x18,0x6C,0x20,0x18,0x5E,0x2A,0x9B, + 0x94,0x46,0xC3,0x18,0x52,0x18,0xD2,0x18,0x2A,0x92,0xBB,0x6B,0x62,0x46,0x9A,0x18, + 0x08,0x18,0x10,0x18,0x64,0x1C,0xB8,0x63,0xA6,0x45,0xDE,0xDC,0x00,0x98,0x71,0x00, + 0x41,0x1A,0xB8,0x6B,0xFE,0xF7,0xE2,0xFB,0xB8,0x63,0x2E,0x98,0x6D,0x1C,0xA8,0x42, + 0xC7,0xDC,0x00,0x99,0x70,0x00,0x09,0x1A,0x2B,0x98,0x2D,0x91,0x42,0x00,0x01,0x98, + 0x80,0x1A,0x41,0x43,0x2C,0x90,0x2A,0x98,0xFE,0xF7,0xD0,0xFB,0x30,0x99,0x50,0x22, + 0xC8,0x81,0x00,0x20,0x01,0x00,0x2A,0x90,0x02,0xA8,0x03,0xF0,0x93,0xF9,0x2B,0x9C, + 0xA4,0x1C,0x35,0xE0,0x00,0x99,0x02,0xAA,0x89,0x1B,0x89,0x1C,0x8E,0x46,0x2B,0x99, + 0xB0,0x1C,0x61,0x1A,0x89,0x00,0x8D,0x18,0x40,0x3D,0x8C,0x46,0x1C,0xE0,0x01,0x99, + 0x33,0x4A,0x09,0x1D,0x41,0x43,0x09,0x19,0x49,0x00,0x51,0x5E,0x16,0xAA,0x62,0x44, + 0x40,0x3A,0x92,0x6B,0x2B,0x4F,0x89,0x1A,0x62,0x00,0xD3,0x19,0x94,0x22,0x9A,0x5E, + 0x43,0x00,0xDB,0x19,0x6C,0x27,0xDF,0x5F,0xD2,0x19,0x89,0x18,0x0B,0x00,0x4B,0x43, + 0xAA,0x6B,0xD1,0x18,0x40,0x1C,0xA9,0x63,0x86,0x45,0xE0,0xDC,0x2D,0x99,0xA8,0x6B, + 0x49,0x1E,0xFE,0xF7,0x93,0xFB,0xA8,0x63,0x2A,0x99,0x40,0x18,0x64,0x1C,0x2A,0x90, + 0x2E,0x98,0xA0,0x42,0xC6,0xDC,0x2C,0x99,0x2A,0x98,0xFE,0xF7,0x87,0xFB,0x30,0x99, + 0x00,0x22,0x0A,0x61,0x11,0x00,0x02,0xAB,0x0A,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A, + 0x14,0x00,0x54,0x43,0x30,0x9A,0x12,0x69,0xA2,0x18,0x30,0x9C,0x49,0x1C,0x22,0x61, + 0x2C,0x9A,0x8A,0x42,0xF1,0xDC,0x30,0x98,0x51,0x1E,0x00,0x69,0xFE,0xF7,0x6E,0xFB, + 0x00,0x9A,0x2F,0x99,0x92,0x1B,0x92,0x02,0x51,0x43,0xFE,0xF7,0x67,0xFB,0x30,0x99, + 0x08,0x61,0x30,0x99,0x0E,0x20,0x08,0x5E,0x00,0x28,0x01,0xD1,0x40,0x1C,0xC8,0x81, + 0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0xF8,0xB5,0x61,0x4D,0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B, + 0x00,0x04,0x00,0x0C,0x05,0xF0,0x56,0xF9,0x05,0xF0,0x44,0xF9,0x01,0x24,0x64,0x03, + 0x20,0x00,0xFE,0xF7,0x53,0xFF,0x04,0xF0,0x1F,0xFD,0x20,0x00,0xFE,0xF7,0x46,0xFF, + 0x57,0x4C,0x00,0x26,0x9C,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x07,0xD5,0xC0,0x68, + 0x00,0x28,0x04,0xD0,0x53,0x48,0xC1,0x68,0xC0,0x03,0xC1,0x63,0x95,0xE0,0x28,0x7A, + 0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x33,0xF9,0xFF,0x20, + 0x81,0x30,0xFE,0xF7,0x33,0xFF,0x03,0x20,0x05,0xF0,0x6C,0xF8,0x04,0xF0,0x0A,0xF8, + 0x49,0x4F,0xF8,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5, + 0x04,0x20,0x00,0xE0,0x02,0x20,0x04,0xF0,0x39,0xFF,0x00,0xF0,0xA7,0xFB,0x04,0xF0, + 0x11,0xFD,0x00,0xF0,0x71,0xFB,0x00,0xF0,0x1F,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1, + 0x20,0x7B,0x00,0x28,0x01,0xD0,0x03,0xF0,0xF9,0xFF,0x20,0x7A,0x00,0x28,0x01,0xD0, + 0x03,0xF0,0xCE,0xF8,0x01,0x20,0x40,0x05,0x00,0xF0,0x44,0xFB,0x03,0xF0,0xE4,0xF8, + 0x00,0x28,0x01,0xD0,0x01,0x20,0x28,0x70,0x00,0x20,0x00,0xF0,0x3B,0xFB,0x28,0x78, + 0x00,0x28,0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x65,0xF9,0x03,0xF0, + 0xC5,0xFF,0x28,0x78,0x00,0x28,0x04,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x44,0xD1, + 0x2E,0x70,0x03,0x20,0x05,0xF0,0x00,0xF8,0xE8,0x62,0x03,0x20,0x05,0xF0,0x2E,0xF8, + 0xFF,0x20,0x81,0x30,0xFE,0xF7,0xDA,0xFE,0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E, + 0xF8,0x83,0x2D,0xE0,0xFF,0xF7,0x9C,0xFC,0x00,0x28,0x29,0xD0,0x6F,0x6A,0x00,0x2F, + 0x26,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x1C,0x49,0xFE,0xF7,0x90,0xFB, + 0x38,0x1A,0x14,0x28,0x1C,0xDD,0x05,0xF0,0xD3,0xF8,0x05,0xF0,0xD7,0xF8,0xA8,0x79, + 0x00,0x28,0x0D,0xD0,0x03,0xF0,0x70,0xFF,0x03,0xF0,0x73,0xFF,0x03,0xF0,0x7B,0xFF, + 0x13,0x4D,0x01,0x20,0x68,0x60,0xFE,0xF7,0xC1,0xFE,0x12,0x48,0x68,0x60,0x03,0xE0, + 0x11,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x05,0xF0,0xC7,0xF8,0x0E,0x48,0x06,0x70, + 0x06,0x4D,0x28,0x78,0x00,0x28,0x00,0xD1,0x5D,0xE7,0x04,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x05,0xF0,0x97,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20, + 0x80,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x10,0xB4,0x0F,0x4B, + 0x00,0x22,0xD2,0x43,0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C, + 0x24,0x33,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52, + 0x22,0x00,0x12,0x32,0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52, + 0x51,0x18,0x40,0x1E,0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCA,0x0B,0x00,0x20, + 0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21,0x03,0xF0,0x1C,0xF8,0x0A,0x48,0x5A,0x22, + 0x00,0x21,0x03,0xF0,0x17,0xF8,0x08,0x48,0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48, + 0x28,0x22,0x21,0x00,0x03,0xF0,0x0E,0xF8,0x04,0x48,0x4E,0x38,0x44,0x75,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x6B,0x08,0x00,0x20,0x54,0x07,0x00,0x20,0x7E,0x0A,0x00,0x20, + 0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21,0x02,0xF0,0xFC,0xFF,0x14,0x48,0x12,0x22, + 0x00,0x21,0x12,0x30,0x02,0xF0,0xF6,0xFF,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30, + 0x02,0xF0,0xF0,0xFF,0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0x02,0xF0,0xEA,0xFF, + 0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30,0x02,0xF0,0xE4,0xFF,0x08,0x48,0x10,0x22, + 0x00,0x21,0x62,0x30,0x02,0xF0,0xDE,0xFF,0x05,0x49,0x00,0x20,0x74,0x31,0xC8,0x82, + 0xFF,0x39,0x41,0x39,0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBC,0x06,0x00,0x20,0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x8F,0x7B,0xF1,0x88,0x49,0x06, + 0x02,0xD4,0x1B,0x49,0xC0,0x39,0x8F,0x7A,0x08,0x21,0x00,0x24,0x42,0x00,0x0B,0x01, + 0x9B,0x19,0x15,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19,0xEC,0x82,0x0D,0x25,0xAD,0x01, + 0x5B,0x19,0x49,0x1E,0xDC,0x80,0xF2,0xD5,0x15,0x25,0x31,0x18,0x6D,0x01,0x01,0x23, + 0x4D,0x19,0xAB,0x73,0x0F,0x25,0x93,0x19,0xAD,0x01,0x5B,0x19,0xDC,0x82,0x1F,0x23, + 0x5B,0x01,0xC9,0x18,0x8F,0x71,0x8C,0x73,0x02,0x21,0x0D,0x01,0xAD,0x19,0xAD,0x18, + 0xED,0x18,0x49,0x1E,0xEC,0x82,0xF8,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x21,0x20, + 0xC9,0x43,0x40,0x01,0x10,0x18,0xC1,0x80,0x01,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x10,0xB5,0x06,0x48,0x20,0x22,0x00,0x21, + 0x02,0xF0,0x88,0xFF,0x04,0x48,0x00,0x21,0x81,0x72,0x41,0x72,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x7E,0x08,0x00,0x20,0xB0,0x06,0x00,0x20,0x10,0xB5,0x04,0xF0, + 0x3B,0xFF,0x03,0xF0,0xF1,0xFE,0xFF,0xF7,0x53,0xFF,0xFF,0xF7,0x71,0xFF,0x04,0xF0, + 0x37,0xF8,0x01,0xF0,0x65,0xFD,0x01,0xF0,0xDF,0xFC,0x03,0x49,0x00,0x20,0x48,0x71, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x10,0xB4,0x0D,0x4C, + 0x0B,0x4B,0xE4,0x88,0x1B,0x7F,0x64,0x06,0x02,0xD4,0x09,0x4B,0xC0,0x3B,0x1B,0x7E, + 0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A, + 0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xF7,0xB5,0x5E,0x48,0xCA,0xB0,0x00,0x7D, + 0x00,0x28,0x03,0xD0,0x01,0x20,0x47,0x90,0x00,0x20,0x02,0xE0,0x00,0x20,0x47,0x90, + 0x01,0x20,0x46,0x90,0x58,0x48,0x00,0x26,0x49,0x90,0x58,0x48,0x35,0x00,0x01,0x8B, + 0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A,0x01,0x91,0x80,0x8B, + 0x45,0x90,0x53,0x48,0x00,0x7A,0x48,0x96,0x00,0x90,0x6B,0xE0,0x00,0x24,0x64,0xE0, + 0x68,0x43,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x5A,0xF9,0x49,0x49,0x20,0x39, + 0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4B,0x4A,0x52,0x79,0x00,0x2A,0x00,0x9A,0x11,0xD0, + 0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0, + 0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42, + 0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42,0x0B,0xD0,0xCA,0x7D, + 0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E,0xAA,0x42,0x02,0xD0, + 0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x80,0x1A,0x49,0x9B, + 0x02,0x04,0xB8,0x00,0x18,0x58,0x4B,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05, + 0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x4A,0x9B,0x05,0x2B,0x0E,0xD8,0x90,0x42, + 0x01,0xDA,0x47,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x46,0x9A,0x21,0x00,0x28,0x00, + 0x00,0xF0,0x4C,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0,0x48,0x99,0x05,0xA8, + 0x47,0x54,0x48,0x98,0x40,0x1C,0x48,0x90,0x64,0x1C,0x1E,0x49,0xC8,0x78,0x84,0x42, + 0x96,0xDB,0x6D,0x1C,0x1B,0x48,0x01,0x79,0x8D,0x42,0x8F,0xDB,0x00,0x2E,0x25,0xDD, + 0x4C,0x98,0x00,0x28,0x22,0xD1,0x00,0xF0,0x2D,0xF9,0x00,0xF0,0x4D,0xF9,0x00,0xF0, + 0xFB,0xF9,0x76,0x1E,0x14,0xD4,0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00,0x49,0x98, + 0x80,0x58,0x01,0x05,0x45,0x98,0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C,0xA0,0x42, + 0x00,0xD9,0x20,0x00,0x00,0x04,0x08,0x43,0x49,0x99,0x76,0x1E,0x88,0x50,0xEC,0xD5, + 0x00,0xF0,0x08,0xF9,0x00,0xF0,0x30,0xF9,0x00,0xF0,0xDE,0xF9,0x4D,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xE0,0x7A,0x00,0x00, + 0x70,0x0A,0x00,0x20,0xF8,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0x30,0xB4,0x17,0x4D, + 0x15,0x4C,0x2D,0x78,0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E, + 0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0, + 0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C, + 0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E, + 0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43, + 0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20, + 0xF0,0xB5,0x5A,0x48,0x8F,0xB0,0x06,0x78,0x59,0x48,0x5B,0x4A,0x05,0x96,0x07,0x78, + 0x58,0x48,0x06,0x97,0x0E,0x90,0x80,0x7E,0x0D,0x92,0xC1,0x07,0x09,0xD0,0x80,0x07, + 0x04,0xD5,0x70,0x1E,0x05,0x90,0x03,0x20,0x10,0x71,0x02,0xE0,0x7F,0x1E,0x00,0x21, + 0x11,0x71,0x52,0x48,0x0A,0x22,0x01,0x8C,0x51,0x43,0x09,0x04,0x09,0x0C,0x02,0x91, + 0x40,0x8C,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0, + 0x00,0x2F,0x7C,0xD0,0x41,0x00,0x02,0x98,0xFE,0xF7,0x50,0xF8,0x05,0x04,0x2D,0x0C, + 0x00,0x24,0xB6,0x1C,0x0A,0xE0,0x02,0x98,0x05,0x99,0x60,0x43,0xFE,0xF7,0x46,0xF8, + 0x43,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xB4,0x42,0xF2,0xDB, + 0x01,0x98,0x79,0x00,0xFE,0xF7,0x3A,0xF8,0x06,0x04,0x06,0x98,0x36,0x0C,0x00,0x24, + 0x80,0x1C,0x0C,0x90,0x0C,0xE0,0x01,0x98,0x39,0x00,0x60,0x43,0xFE,0xF7,0x2E,0xF8, + 0x37,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x81,0x80,0x0C,0x98,0x64,0x1C, + 0x84,0x42,0xF0,0xDB,0x0E,0x98,0x80,0x7E,0xC0,0x07,0x53,0xD0,0x00,0x24,0x4D,0xE0, + 0x2F,0x4A,0x09,0x21,0x10,0x19,0xC9,0x01,0x40,0x18,0x41,0x7A,0x0E,0x98,0x80,0x7E, + 0x80,0x07,0x03,0xD5,0x05,0x98,0x03,0x95,0x04,0x91,0x02,0xE0,0x08,0x00,0x03,0xA9, + 0xC0,0xC1,0x27,0x49,0x40,0x00,0x40,0x18,0x0B,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B, + 0xFE,0xF7,0x04,0xF8,0x22,0x4A,0xE1,0x00,0x89,0x18,0x11,0x22,0x92,0x01,0x0A,0x91, + 0x89,0x18,0x09,0x91,0x88,0x83,0x04,0x98,0x1D,0x49,0x40,0x00,0x40,0x18,0x40,0x30, + 0x08,0x90,0x80,0x88,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xF0,0xFF,0x09,0x99,0xC8,0x83, + 0x0B,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19,0xFE,0xF7,0xC2,0xF8,0x0A,0x99,0x23,0x22, + 0x52,0x01,0x89,0x18,0x07,0x91,0x08,0x80,0x08,0x98,0x0A,0x21,0x80,0x88,0x80,0x19, + 0xFE,0xF7,0xB6,0xF8,0x07,0x99,0x48,0x80,0x03,0x98,0x40,0x00,0x00,0xE0,0x09,0xE0, + 0x0A,0x21,0xFE,0xF7,0xAD,0xF8,0x0D,0x99,0x64,0x1C,0xC8,0x80,0x0E,0x98,0xC0,0x7E, + 0xA0,0x42,0xAD,0xDC,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x03,0x49,0xCA,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0x02,0x43, + 0xCA,0x61,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x01,0x22,0x10,0xB5,0x08,0x49,0x09,0x48,0x52,0x02,0x02,0xF0, + 0x3E,0xFD,0x08,0x48,0x01,0x22,0xC0,0x8E,0x92,0x02,0x01,0x04,0x01,0x43,0x06,0x48, + 0x02,0xF0,0x48,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x7E,0x00,0x00, + 0x00,0x00,0x10,0x40,0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0x02,0x48,0x81,0x6B, + 0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49, + 0x0A,0x48,0xFC,0x22,0x02,0xF0,0x13,0xFD,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32, + 0x02,0xF0,0x0D,0xFD,0x01,0x22,0x08,0x49,0x08,0x48,0x52,0x02,0x02,0xF0,0x07,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x7B,0x00,0x00,0x04,0x90,0x00,0x40, + 0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40, + 0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60, + 0x18,0x48,0xA6,0x15,0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFE,0xF7, + 0x07,0xF8,0x32,0x00,0x21,0x00,0x28,0x00,0x00,0x23,0xFE,0xF7,0x09,0xF8,0x12,0x48, + 0x75,0x00,0x04,0x04,0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xF8,0xFF, + 0x0E,0x49,0x2A,0x00,0x20,0x00,0x00,0x23,0xFD,0xF7,0xFA,0xFF,0x0C,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x29,0x00,0x20,0x00,0xFD,0xF7,0xEA,0xFF,0x09,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xEC,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x90,0x00,0x40,0x00,0x7B,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07, + 0xFC,0xD0,0xFE,0xF7,0xA3,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0xF1,0xB5,0x55,0x4E,0x53,0x4B,0xF2,0x88,0x98,0x88,0x54,0x49,0x54,0x06,0x82,0xB0, + 0x00,0xD4,0x08,0x88,0x52,0x06,0x01,0x90,0x98,0x79,0x00,0xD4,0x88,0x78,0x37,0x00, + 0x00,0x25,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0xFF,0x37,0x61,0x37, + 0x00,0x90,0x11,0xE0,0x0A,0x20,0x60,0x43,0x43,0x21,0x80,0x19,0xC9,0x00,0x09,0x5C, + 0x00,0x29,0x08,0xD0,0x46,0x49,0x40,0x18,0x01,0xF0,0xA2,0xF9,0x00,0x28,0x02,0xD0, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x78,0xA0,0x42,0xEA,0xDA,0x41,0x49, + 0x08,0x00,0x20,0x30,0xCA,0x8B,0x43,0x88,0xD4,0x1A,0x00,0x2C,0x00,0xDC,0x9C,0x1A, + 0x22,0x04,0x03,0x88,0x84,0x88,0x12,0x0C,0x1F,0x1B,0x00,0x2F,0x00,0xDC,0xE7,0x1A, + 0x84,0x7A,0x3B,0x04,0x1B,0x0C,0x00,0x2C,0x04,0xD0,0x44,0x7B,0xC8,0x2C,0x01,0xD2, + 0x64,0x1C,0x44,0x73,0x8C,0x7B,0x14,0x2C,0x04,0xD2,0x0C,0x7C,0x00,0x2C,0x01,0xD0, + 0x01,0x24,0x4C,0x74,0x0F,0x2A,0x01,0xD8,0x0F,0x2B,0x04,0xD9,0xCC,0x7B,0xC8,0x2C, + 0x01,0xD2,0x64,0x1C,0xCC,0x73,0x02,0x2D,0x09,0xD2,0x0F,0x2A,0x07,0xD2,0x0F,0x2B, + 0x05,0xD2,0x08,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x08,0x24, + 0x04,0x5F,0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x04,0x81,0x44,0x7B,0x01,0x2C,0x01,0xD9, + 0x50,0x21,0x10,0xE0,0x02,0x2D,0x0F,0xD2,0x08,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD, + 0xC9,0x7B,0x14,0x29,0x08,0xD2,0x3D,0x3A,0x3B,0x2A,0x02,0xD3,0x3D,0x3B,0x3B,0x2B, + 0x02,0xD2,0x4F,0x21,0xC9,0x43,0xC1,0x80,0x00,0x21,0x02,0x2D,0x01,0x73,0x0E,0xD2, + 0x06,0x21,0x41,0x5E,0x50,0x31,0x04,0xD1,0xC1,0x7A,0xC8,0x29,0x01,0xD2,0x49,0x1C, + 0xC1,0x72,0xC1,0x7A,0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x73,0x06,0x21, + 0x41,0x5E,0x01,0x98,0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1, + 0x31,0x79,0x01,0x29,0x02,0xD0,0x00,0x99,0xFD,0xF7,0x30,0xFE,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20,0xFF,0x21,0x03,0x31,0x08,0x00,0x49,0x1E, + 0x00,0x28,0xFB,0xD1,0x70,0x47,0x15,0x21,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1, + 0x70,0x47,0x00,0x00,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47, + 0x00,0x70,0x00,0x40,0x02,0x48,0xC1,0x69,0x02,0x14,0x11,0x43,0xC1,0x61,0x70,0x47, + 0x00,0x70,0x00,0x40,0xFE,0xB5,0x1E,0x4A,0x1C,0x48,0xD1,0x88,0x00,0x25,0x00,0x7A, + 0x2E,0x00,0x2F,0x00,0x49,0x06,0x02,0xD4,0x18,0x48,0xC0,0x38,0x00,0x79,0x19,0x49, + 0x89,0x8A,0x40,0x18,0x01,0x06,0x18,0x48,0x09,0x0E,0x00,0x78,0x00,0x28,0x01,0x90, + 0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0,0x0A,0x20,0x60,0x43,0x10,0x49, + 0x40,0x18,0xFF,0x30,0x61,0x30,0x80,0x7A,0x14,0x28,0x01,0xD2,0x01,0x26,0x07,0xE0, + 0x01,0x27,0x14,0x21,0xFD,0xF7,0xB4,0xFE,0x00,0x99,0x88,0x42,0x00,0xD3,0x01,0x25, + 0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F,0x02,0xD1,0x00,0x2E,0x00,0xD0, + 0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0x25,0xF9,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0xEF,0xFB,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x9F,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0xF8,0x0A,0x00,0x20,0xF1,0xB5,0x7B,0x48,0x2E,0x21,0x90,0xB0, + 0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63, + 0x84,0x69,0x75,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0,0xC5,0xFB,0x73,0x4D, + 0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x85,0xFB,0x10,0x99,0x00,0x22,0x01,0x20, + 0xFF,0x27,0x53,0x1E,0x40,0x03,0x15,0x29,0x6F,0xD0,0x16,0xDC,0x0E,0x29,0x6E,0xD0, + 0x0A,0xDC,0x02,0x29,0x27,0xD0,0x07,0x29,0x22,0xD0,0x0A,0x29,0x4F,0xD0,0x0B,0x29, + 0x4B,0xD1,0x0B,0x20,0xF0,0x63,0x6B,0xE0,0x11,0x29,0x55,0xD0,0x12,0x29,0x6E,0xD0, + 0x13,0x29,0x78,0xD0,0x14,0x29,0x7D,0xD0,0x3F,0xE0,0x1A,0x29,0x4C,0xD0,0x08,0xDC, + 0x16,0x29,0x6B,0xD0,0x17,0x29,0x38,0xD0,0x18,0x29,0x68,0xD0,0x19,0x29,0x67,0xD0, + 0x33,0xE0,0x1F,0x29,0x73,0xD0,0x50,0x29,0x72,0xD0,0x51,0x29,0x71,0xD0,0x2C,0xE0, + 0x00,0xF0,0x36,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07,0xCB,0x60,0xFE,0xF7,0x56,0xF9, + 0x00,0xF0,0x64,0xFE,0x52,0x48,0x53,0x4A,0x41,0x68,0x52,0x68,0x91,0x42,0x1C,0xD0, + 0x51,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83,0xFD,0xF7, + 0x91,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7,0x04,0xFE,0xA8,0x78,0x80,0x07, + 0x01,0xD5,0x04,0xF0,0xE5,0xFA,0x49,0x49,0x40,0x22,0x68,0x46,0x02,0xF0,0xDF,0xFA, + 0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0xF3,0xFA,0xF7,0x63,0x20,0xE0,0x41,0x48, + 0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20,0x00,0xE0, + 0x00,0x20,0x04,0xF0,0x7D,0xF9,0xF0,0xE7,0x03,0x21,0x09,0x07,0xCB,0x60,0xFE,0xF7, + 0x1D,0xF9,0x10,0x98,0xFE,0xF7,0x70,0xF8,0x0A,0xE0,0x2D,0xE0,0xFF,0xE7,0x03,0x21, + 0x09,0x07,0xCB,0x60,0xFE,0xF7,0x12,0xF9,0x00,0xF0,0xA0,0xFD,0x00,0xF0,0x0A,0xF9, + 0x2D,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C, + 0x07,0xD0,0x01,0x20,0xA8,0x71,0xD0,0xE7,0x05,0xE0,0x0B,0xE0,0x1C,0xE0,0x22,0xE0, + 0x28,0xE0,0xAA,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x71,0xC4,0xE7, + 0xEA,0x71,0xC2,0xE7,0x00,0x2C,0x05,0xD0,0x01,0x20,0x28,0x72,0xBD,0xE7,0x20,0xE0, + 0x27,0xE0,0x2E,0xE0,0x2A,0x72,0xB8,0xE7,0x00,0x2C,0x03,0xD0,0x20,0x0C,0x6C,0x72, + 0x68,0x82,0xB2,0xE7,0x6A,0x72,0xB0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72, + 0xAB,0xE7,0xAA,0x72,0xA9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xA4,0xE7, + 0xEA,0x72,0xA2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0x9D,0xE7,0x2A,0x73, + 0x9B,0xE7,0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x6A,0x73,0x03,0xF0,0x9C,0xFF, + 0x93,0xE7,0xA8,0x7B,0x00,0x2C,0x01,0xD0,0x01,0x21,0x06,0xE0,0x40,0x08,0x40,0x00, + 0x07,0xE0,0xA8,0x7B,0x00,0x2C,0x02,0xD0,0x02,0x21,0x08,0x43,0x01,0xE0,0xFD,0x21, + 0x08,0x40,0xA8,0x73,0x81,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0xC0,0x75,0x00,0x00, + 0xF0,0xB5,0x38,0x4F,0x35,0x4C,0xF9,0x78,0x03,0x00,0x35,0x4A,0x0E,0x04,0x39,0x79, + 0x35,0x48,0x25,0x68,0x0E,0x43,0x35,0x49,0x30,0x3B,0x04,0xF0,0xCD,0xFA,0x12,0x0A, + 0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16,0x3E,0x43,0x48,0x4E, + 0x51,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61, + 0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x35,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68, + 0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48, + 0x03,0x7A,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F, + 0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D, + 0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43, + 0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07, + 0xC0,0x0F,0xCC,0xE7,0x00,0x69,0x3A,0x8A,0x40,0x08,0x00,0x02,0x03,0xE0,0x13,0x48, + 0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43,0xC1,0xE7,0x00,0x69,0x40,0x08,0xBE,0xE7, + 0xB8,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42,0xFC,0xD1,0x03,0xF0,0x6D,0xFA,0xFF,0x20, + 0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00, + 0x00,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30, + 0xC0,0x0F,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x7B,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7, + 0x3B,0xF8,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFE,0xF7,0x18,0xF8,0x03,0xF0,0xF2,0xF8, + 0x01,0x20,0x40,0x05,0xFF,0xF7,0x4E,0xFC,0x00,0xF0,0xBE,0xFC,0x00,0x20,0xFF,0xF7, + 0x49,0xFC,0x03,0xF0,0xDB,0xF8,0x30,0x00,0xFE,0xF7,0x3A,0xF8,0xE5,0x60,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60, + 0x03,0xF0,0xD8,0xF8,0x00,0x20,0xFF,0xF7,0x35,0xFC,0xFF,0xF7,0xB3,0xFC,0x05,0x48, + 0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x04,0xF0,0x23,0xFA,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF8,0xB5,0x27,0x49,0x25,0x48,0xC9,0x88, + 0x00,0x8A,0x49,0x06,0x02,0xD4,0x23,0x48,0xC0,0x38,0x80,0x89,0xC0,0x06,0x3D,0xD5, + 0x22,0x4E,0x30,0x78,0x00,0x28,0x39,0xD0,0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25, + 0x31,0xE0,0x0A,0x21,0x69,0x43,0x1C,0x4B,0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78, + 0x61,0x34,0x25,0xE0,0x0A,0x22,0x42,0x43,0xD2,0x18,0xFF,0x32,0xA1,0x32,0x21,0x79, + 0x92,0x7F,0x91,0x42,0x1B,0xD1,0x0A,0x22,0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21, + 0xC1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E,0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21, + 0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x88,0xE1,0x88,0xFF,0xF7,0xFF,0xF9,0xE0,0x80, + 0x7A,0x88,0x21,0x89,0x00,0x98,0xFF,0xF7,0xF9,0xF9,0x20,0x81,0x02,0xE0,0x40,0x1C, + 0x87,0x42,0xD7,0xDA,0x6D,0x1C,0x30,0x78,0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0x50,0x07,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xB3,0xB0,0x11,0x90,0x10,0x90,0x0F,0x90,0x0E,0x90,0xFB,0x48, + 0xFC,0x4D,0x01,0x8C,0xFA,0x4A,0x0B,0x91,0x40,0x8C,0xFB,0x49,0x0A,0x90,0xE8,0x88, + 0x13,0x7B,0x44,0x06,0x00,0xD4,0x0B,0x7A,0x54,0x7B,0x46,0x06,0x00,0xD4,0x4C,0x7A, + 0x46,0x06,0x09,0x94,0x94,0x7E,0x00,0xD4,0x8C,0x7D,0x46,0x06,0x08,0x94,0x54,0x7E, + 0x00,0xD4,0x4C,0x7D,0x07,0x94,0xF0,0x4C,0x40,0x34,0x24,0x8A,0x46,0x06,0x02,0xD4, + 0xED,0x4C,0x80,0x3C,0xA4,0x89,0x24,0x07,0x42,0xD5,0xD4,0x7B,0x46,0x06,0x00,0xD4, + 0xCC,0x7A,0x5C,0x43,0x26,0x94,0x14,0x7C,0x46,0x06,0x00,0xD4,0x0C,0x7B,0x5C,0x43, + 0x25,0x94,0x54,0x7C,0x46,0x06,0x00,0xD4,0x4C,0x7B,0x5C,0x43,0x24,0x94,0x94,0x7C, + 0x46,0x06,0x00,0xD4,0x8C,0x7B,0x5C,0x43,0x23,0x94,0xD4,0x7C,0x46,0x06,0x00,0xD4, + 0xCC,0x7B,0x5C,0x43,0x22,0x94,0x14,0x7D,0x46,0x06,0x00,0xD4,0x0C,0x7C,0x5C,0x43, + 0x21,0x94,0x54,0x7D,0x46,0x06,0x00,0xD4,0x4C,0x7C,0x5C,0x43,0x20,0x94,0x94,0x7D, + 0x46,0x06,0x00,0xD4,0x8C,0x7C,0x5C,0x43,0x1F,0x94,0xD4,0x7D,0x46,0x06,0x00,0xD4, + 0xCC,0x7C,0x5C,0x43,0x1E,0x94,0x12,0x7E,0x40,0x06,0x00,0xD4,0x0A,0x7D,0xCF,0x48, + 0x5A,0x43,0x1D,0x92,0x32,0x90,0x00,0x78,0x00,0x28,0x05,0xD1,0x00,0xF0,0xD0,0xFE, + 0x33,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x28,0x90,0xC7,0x48,0xA0,0x38, + 0x31,0x90,0xFF,0x30,0xE1,0x30,0x30,0x90,0xC2,0x4E,0x28,0x98,0x13,0x21,0x30,0x18, + 0x49,0x01,0x2F,0x90,0x40,0x18,0x04,0x7F,0x00,0x2C,0x0F,0xD0,0x08,0x98,0x00,0x28, + 0x08,0xD1,0x0A,0x20,0x60,0x43,0x80,0x19,0xFF,0x30,0x6B,0x30,0x00,0xF0,0xE0,0xFD, + 0x00,0x28,0x03,0xD0,0x30,0x98,0x00,0x7B,0x00,0x28,0x03,0xD0,0x28,0x98,0xFF,0xF7, + 0xE1,0xF8,0x9D,0xE2,0x28,0x99,0x0D,0x27,0x15,0x23,0x07,0x20,0xBF,0x01,0x5B,0x01, + 0x49,0x00,0x2E,0x91,0x2E,0x9A,0x01,0x01,0x89,0x19,0x89,0x18,0xCA,0x18,0x0B,0x25, + 0xD2,0x8A,0xAD,0x01,0x4D,0x19,0xC9,0x19,0xEA,0x80,0xCA,0x88,0x40,0x1E,0xCA,0x82, + 0xF0,0xD5,0x0A,0x20,0x44,0x43,0xA4,0x19,0x2D,0x94,0xFF,0x34,0x61,0x34,0xE1,0x88, + 0x0B,0x98,0x40,0x1E,0x81,0x42,0xDC,0xDC,0x21,0x89,0x0A,0x98,0x40,0x1E,0x81,0x42, + 0xD7,0xDC,0x2E,0x98,0xE1,0x88,0x85,0x19,0xE8,0x18,0x2C,0x90,0xC1,0x82,0x20,0x89, + 0xE9,0x19,0x2B,0x91,0xC8,0x80,0x00,0x20,0x01,0x22,0xD2,0x02,0x01,0x00,0x06,0x90, + 0x07,0x20,0x05,0x92,0x97,0x4B,0x06,0x01,0xF3,0x18,0x2E,0x9E,0x9B,0x19,0x15,0x26, + 0x76,0x01,0x9C,0x46,0x9B,0x19,0x16,0x26,0x9E,0x5F,0x00,0x2E,0x09,0xDD,0x06,0x9F, + 0xBE,0x42,0x01,0xDD,0xDF,0x8A,0x06,0x97,0x05,0x9F,0xBE,0x42,0x01,0xDA,0xDB,0x8A, + 0x05,0x93,0x0D,0x26,0xB6,0x01,0x63,0x46,0x9B,0x19,0x06,0x26,0x9E,0x5F,0x00,0x2E, + 0x05,0xDD,0x8E,0x42,0x00,0xDD,0xD9,0x88,0x96,0x42,0x00,0xDA,0xDA,0x88,0x40,0x1E, + 0xD8,0xD5,0x05,0x9B,0x06,0x98,0xC0,0x1A,0x78,0x28,0x02,0xDC,0x8B,0x1A,0x78,0x2B, + 0x02,0xDD,0x30,0x9E,0x01,0x23,0xB3,0x72,0x14,0x28,0x04,0xDA,0x88,0x1A,0x14,0x28, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x31,0x99,0x48,0x72,0x2F,0x98,0x15,0x21, + 0x49,0x01,0x47,0x18,0xB8,0x7B,0x01,0x28,0x1B,0xD9,0x2C,0x98,0x16,0x21,0x41,0x5E, + 0x0B,0x20,0x80,0x01,0x28,0x18,0x06,0x22,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC, + 0x50,0x1A,0x00,0x04,0x00,0x14,0x0D,0x90,0x2B,0x98,0x06,0x22,0x16,0x21,0x82,0x5E, + 0x41,0x5E,0x50,0x1A,0x00,0x28,0x00,0xDC,0x88,0x1A,0x00,0x04,0x00,0x14,0x0C,0x90, + 0x02,0xE0,0x64,0x20,0x0C,0x90,0x0D,0x90,0x0B,0x20,0x80,0x01,0x2E,0x18,0x2C,0x9A, + 0x06,0x21,0x16,0x20,0x71,0x5E,0x10,0x5E,0x03,0xF0,0x94,0xF8,0x13,0x90,0x2B,0x98, + 0x16,0x21,0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x03,0xF0,0x8B,0xF8,0x12,0x90, + 0x16,0x21,0x71,0x5E,0x13,0x98,0x03,0xF0,0x85,0xF8,0x15,0x90,0x1B,0x20,0x40,0x01, + 0x28,0x18,0x06,0x21,0x2A,0x90,0x41,0x5E,0x12,0x98,0x03,0xF0,0x7B,0xF8,0x14,0x90, + 0x17,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x15,0x98, + 0x03,0xF0,0x72,0xF8,0x00,0x04,0x00,0x14,0x17,0x90,0x07,0x20,0xC0,0x01,0x2E,0x18, + 0x2A,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xB2,0x5E,0x14,0x98,0x03,0xF0,0x64,0xF8, + 0x00,0x04,0x00,0x14,0x16,0x90,0x03,0x20,0x00,0x02,0x28,0x18,0x16,0x22,0x06,0x21, + 0x82,0x5E,0x41,0x5E,0x17,0x98,0x03,0xF0,0x57,0xF8,0x00,0x04,0x00,0x14,0x19,0x90, + 0x1D,0x20,0x40,0x01,0x28,0x18,0x29,0x90,0x06,0x22,0x82,0x5E,0x16,0x21,0x71,0x5E, + 0x16,0x98,0x03,0xF0,0x49,0xF8,0x00,0x04,0x00,0x14,0x18,0x90,0x19,0x20,0x40,0x01, + 0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x19,0x98,0x03,0xF0,0x3C,0xF8, + 0x00,0x04,0x00,0x14,0x1B,0x90,0x0F,0x20,0x80,0x01,0x2E,0x18,0x29,0x98,0x16,0x21, + 0x41,0x5E,0x06,0x22,0xB2,0x5E,0x18,0x98,0x03,0xF0,0x2E,0xF8,0x00,0x04,0x00,0x14, + 0x1A,0x90,0x0C,0x99,0x0D,0x98,0x00,0xF0,0x35,0xFF,0x01,0x21,0x84,0x46,0x88,0x02, + 0x28,0x4B,0x0A,0x01,0xD2,0x18,0x2E,0x9B,0xD3,0x18,0x1F,0x22,0x52,0x01,0x9A,0x18, + 0xD2,0x8A,0x1B,0x18,0x49,0x1E,0xDA,0x80,0xF2,0xD5,0x1F,0x21,0x49,0x01,0x6A,0x18, + 0x60,0x46,0xD0,0x82,0x2F,0x9A,0x00,0x20,0x55,0x18,0xAA,0x7B,0x00,0x2A,0x94,0x46, + 0x0C,0xDB,0x1C,0x4B,0x11,0x01,0xC9,0x18,0x2E,0x9B,0xC9,0x18,0x1F,0x23,0x5B,0x01, + 0xCB,0x18,0x16,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF2,0xD5,0x61,0x46,0x49,0x1C, + 0xFD,0xF7,0xA4,0xF9,0x25,0x99,0x27,0x90,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0, + 0x23,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x21,0x99,0x88,0x42,0x01,0xDC, + 0x03,0x20,0x05,0xE0,0x1F,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20, + 0xAA,0x79,0x80,0x1A,0x09,0x9A,0x52,0x42,0x00,0x28,0x13,0xDD,0x16,0x20,0x30,0x5E, + 0x09,0x9B,0x98,0x42,0x0C,0xD1,0x00,0x20,0x13,0xE0,0x00,0x00,0x00,0x78,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0x50,0x07,0x00,0x20, + 0x40,0x1C,0x06,0xE0,0x00,0x28,0xB3,0x48,0x30,0x5E,0x04,0xDA,0x90,0x42,0xEA,0xD0, + 0x40,0x1E,0xF0,0x82,0x02,0xE0,0x00,0x28,0xFA,0xDC,0xF1,0xDB,0x16,0x20,0x30,0x5E, + 0x09,0x9B,0x98,0x42,0x05,0xD1,0xAB,0x79,0x05,0x2B,0x02,0xD2,0x5B,0x1C,0xAB,0x71, + 0x06,0xE0,0x90,0x42,0x04,0xD1,0xA8,0x79,0x01,0x28,0x01,0xD9,0x40,0x1E,0xA8,0x71, + 0x1A,0x9A,0x1B,0x98,0x1C,0x92,0xBE,0x7B,0x31,0x00,0xFD,0xF7,0x4F,0xF9,0x11,0x90, + 0x0F,0x90,0x1C,0x98,0x31,0x00,0xFD,0xF7,0x49,0xF9,0x10,0x90,0x0E,0x90,0xA8,0x79, + 0x01,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x1A,0x9B,0x1B,0x9A, + 0x09,0x21,0x30,0x00,0x03,0xF0,0x4A,0xFC,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0xB8,0x7B,0x18,0x9B,0x19,0x9A,0x07,0x21,0x03,0xF0,0x40,0xFC,0x6B,0x46,0x38,0x22, + 0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAE,0x07,0xC6, + 0x04,0x22,0x9A,0x5E,0x25,0x9B,0x00,0x92,0x2D,0x98,0x26,0x9A,0xFF,0x30,0x65,0x30, + 0x97,0xE0,0x02,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x18,0x9B, + 0x19,0x9A,0x07,0x21,0x30,0x00,0x03,0xF0,0x21,0xFC,0x10,0xAA,0x11,0xA9,0x68,0x46, + 0x06,0xC0,0xB8,0x7B,0x16,0x9B,0x17,0x9A,0x05,0x21,0x03,0xF0,0x17,0xFC,0x6B,0x46, + 0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAE, + 0x07,0xC6,0x04,0x22,0x9A,0x5E,0x00,0x92,0x2D,0x98,0x23,0x9B,0xFF,0x30,0x24,0x9A, + 0x65,0x30,0x6E,0xE0,0x03,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3, + 0x16,0x9B,0x17,0x9A,0x05,0x21,0x30,0x00,0x03,0xF0,0xF8,0xFB,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0xB8,0x7B,0x14,0x9B,0x15,0x9A,0x03,0x21,0x03,0xF0,0xEE,0xFB, + 0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E, + 0x01,0xAE,0x07,0xC6,0x04,0x22,0x9A,0x5E,0x21,0x9B,0x00,0x92,0x2D,0x98,0x22,0x9A, + 0xFF,0x30,0x65,0x30,0x45,0xE0,0x04,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x68,0x46, + 0x06,0xC0,0x14,0x9B,0x15,0x9A,0x03,0x21,0x30,0x00,0x03,0xF0,0xCF,0xFB,0x10,0xAA, + 0x11,0xA9,0x68,0x46,0x06,0xC0,0xB8,0x7B,0x12,0x9B,0x13,0x9A,0x02,0x21,0x03,0xF0, + 0xC5,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB, + 0x18,0x5E,0x01,0xAE,0x07,0xC6,0x04,0x22,0x9A,0x5E,0x1F,0x9B,0x00,0x92,0x2D,0x98, + 0x20,0x9A,0xFF,0x30,0x65,0x30,0x1C,0xE0,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x12,0x9B,0x13,0x9A,0x02,0x21,0x30,0x00,0x03,0xF0,0xA8,0xFB,0x10,0xAB,0x00,0x22, + 0x04,0x21,0x9A,0x5E,0x59,0x5E,0x2B,0x9B,0x06,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3, + 0x2C,0x98,0x16,0x22,0x82,0x5E,0x1D,0x9B,0x00,0x92,0x2D,0x98,0x1E,0x9A,0xFF,0x30, + 0x65,0x30,0x27,0x99,0x03,0xF0,0xA6,0xFB,0xB8,0x7B,0x3B,0x49,0x09,0x28,0x01,0xD2, + 0x40,0x1C,0xB8,0x73,0xA8,0x7B,0x02,0x28,0x01,0xD2,0x40,0x1C,0xA8,0x73,0x20,0x79, + 0x40,0x1E,0x80,0x00,0x40,0x18,0x21,0x21,0x49,0x01,0x45,0x18,0x06,0x20,0x28,0x5E, + 0x00,0x28,0x21,0xDB,0x08,0x21,0x69,0x5E,0x00,0x29,0x1D,0xDB,0x07,0x9A,0x64,0x21, + 0x8E,0x1A,0x70,0x43,0xFD,0xF7,0x62,0xF8,0x07,0x00,0xE0,0x88,0x07,0x99,0x48,0x43, + 0x64,0x21,0xFD,0xF7,0x35,0xF9,0x38,0x18,0xE0,0x80,0x08,0x20,0x28,0x5E,0x64,0x21, + 0x70,0x43,0xFD,0xF7,0x53,0xF8,0x06,0x00,0x20,0x89,0x07,0x99,0x48,0x43,0x64,0x21, + 0xFD,0xF7,0x26,0xF9,0x30,0x18,0x20,0x81,0xE0,0x88,0xE8,0x80,0x20,0x89,0x28,0x81, + 0x28,0x98,0x40,0x1C,0x08,0x28,0x28,0x90,0x00,0xDA,0x3D,0xE5,0x32,0x98,0x01,0x78, + 0x1A,0x48,0x01,0x29,0x1F,0xD1,0x32,0x99,0x89,0x7B,0x4A,0x00,0x16,0x49,0x51,0x18, + 0x15,0x22,0x52,0x01,0x8A,0x18,0x92,0x8A,0xC2,0x83,0x0D,0x22,0x92,0x01,0x8A,0x18, + 0x94,0x88,0x30,0x9B,0x1C,0x80,0x0B,0x23,0x9B,0x01,0xC9,0x18,0x8B,0x88,0x30,0x99, + 0x4B,0x80,0x92,0x8A,0x30,0x99,0x8A,0x80,0x32,0x99,0x09,0x8A,0xC1,0x82,0x32,0x99, + 0x49,0x8A,0x01,0x83,0x0C,0xE5,0x02,0x29,0xFC,0xD1,0x32,0x99,0x09,0x8A,0xC1,0x82, + 0x32,0x99,0x49,0x8A,0x01,0x83,0x32,0x99,0x49,0x8B,0x41,0x83,0x32,0x99,0x89,0x8B, + 0x81,0x83,0xFD,0xE4,0x16,0x00,0x00,0x00,0xF0,0x05,0x00,0x20,0x70,0x08,0x00,0x20, + 0x14,0x20,0x9F,0xE5,0x01,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5,0x02,0x20,0x82,0xE2, + 0x91,0x02,0x20,0xE0,0x01,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20, + 0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B, + 0x1B,0x7A,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42, + 0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42, + 0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7, + 0x10,0x00,0xEA,0xE7,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20,0xFD,0x0A,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x14,0x20,0x9F,0xE5,0x02,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5, + 0x04,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x02,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1, + 0xFB,0x0A,0x00,0x20,0xFE,0xB5,0x04,0x00,0x88,0x1A,0xC0,0x1A,0x0D,0x00,0x16,0x00, + 0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x1F,0x00,0x20,0x38,0x1E,0x23,0xC3,0x5E, + 0x61,0x5E,0x18,0x00,0x00,0xF0,0xFA,0xFC,0x69,0x00,0x01,0x90,0x08,0x19,0x02,0x22, + 0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0xEE,0xFC, + 0x00,0x90,0xA8,0x19,0xC0,0x19,0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38, + 0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0xE0,0xFC,0x02,0x00,0x00,0x99, + 0x01,0x98,0x00,0xF0,0xDB,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x04,0x4B,0x03,0x4A, + 0x1B,0x78,0x58,0x43,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47, + 0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x0D,0x49,0x01,0x20, + 0x10,0xB5,0x40,0x07,0x4A,0x69,0x92,0x06,0xFC,0xD4,0xCA,0x68,0x4B,0x68,0x4B,0x60, + 0x04,0xE0,0x4B,0x69,0x9B,0x06,0xFC,0xD4,0x8B,0x69,0x08,0xC0,0x52,0x1E,0xF8,0xD2, + 0x2E,0x20,0x48,0x60,0x48,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x85,0xFD,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9, + 0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3, + 0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5, + 0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4, + 0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A, + 0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A, + 0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08,0x97,0x0A,0x00,0x0A, + 0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14, + 0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A, + 0x8E,0x0A,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E, + 0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60, + 0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06, + 0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78, + 0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78, + 0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xEF,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20, + 0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xDE,0xFC,0xC3,0xE7,0x00,0x00, + 0xFA,0x0A,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40, + 0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29, + 0x80,0x7A,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25, + 0x00,0x28,0x0B,0xD0,0x00,0x21,0x25,0x27,0x7F,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1, + 0x34,0x48,0x09,0x22,0x00,0x21,0x08,0x38,0x01,0xF0,0x34,0xFC,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19, + 0x36,0x7E,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C,0x08,0x28,0xF4,0xD9, + 0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7E,0x00,0x2E,0x03,0xD1, + 0x24,0x18,0xE4,0x19,0x23,0x76,0xED,0xE7,0x40,0x1C,0x08,0x28,0xF3,0xD9,0x60,0x46, + 0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21, + 0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07, + 0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7E, + 0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x76,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C,0x08,0x28,0xEC,0xD9, + 0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8, + 0x9C,0xE7,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x03,0x23,0x1B,0x07, + 0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24, + 0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20, + 0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30, + 0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47, + 0x2C,0x0B,0x00,0x20,0xF0,0xB5,0x85,0xB0,0xFE,0xF7,0xA2,0xFB,0xFE,0xF7,0x80,0xFB, + 0x02,0xF0,0xE4,0xFA,0x00,0xF0,0xAC,0xFD,0x00,0xF0,0x58,0xFB,0xFD,0xF7,0xF0,0xFF, + 0xFD,0xF7,0x2E,0xFA,0x38,0x49,0x37,0x48,0xC9,0x88,0x40,0x7F,0x49,0x06,0x02,0xD4, + 0x34,0x48,0xC0,0x38,0x40,0x7E,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x41,0xFA,0xFF,0xF7, + 0xEB,0xF9,0x03,0xE0,0xFF,0xF7,0xE8,0xF9,0xFF,0xF7,0x3A,0xFA,0x02,0xF0,0xC2,0xFD, + 0x02,0xF0,0x46,0xFC,0x01,0x26,0x76,0x07,0x30,0x68,0x00,0x28,0x07,0xD0,0x70,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x35,0x68,0x02,0x24,0x6D,0x1C,0x37,0xE0,0x01,0x24, + 0x25,0x00,0xA0,0x00,0x87,0x19,0x38,0x68,0x81,0x01,0x04,0x90,0x80,0x05,0x80,0x0D, + 0x02,0x90,0x22,0x48,0x89,0x0D,0x03,0x91,0x00,0x78,0x00,0x28,0x03,0xD1,0x02,0xA9, + 0x03,0xA8,0x02,0xF0,0x69,0xFC,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x02,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x03,0xA8,0x03,0xF0,0xB8,0xFB,0x02,0xA9,0x03,0xA8,0x03,0xF0,0x8E,0xFA, + 0x14,0x49,0x04,0x98,0x08,0x40,0x03,0x99,0x89,0x05,0x89,0x09,0x08,0x43,0x02,0x99, + 0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x38,0x60,0x64,0x1C,0xAC,0x42, + 0xC7,0xD9,0x30,0x68,0xFC,0xF7,0x42,0xFF,0xFD,0xF7,0x26,0xFE,0x02,0xF0,0xC8,0xFB, + 0xFF,0xF7,0xE0,0xFE,0xFC,0xF7,0x86,0xFE,0x03,0x48,0x40,0x79,0x05,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x03,0x0B,0x00,0x20, + 0x00,0x78,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xF8,0xB5,0x02,0xF0,0x43,0xFA,0xFE,0xF7, + 0x91,0xFD,0xFE,0xF7,0x1F,0xFE,0xFE,0xF7,0x67,0xFE,0x1A,0x48,0x00,0x21,0xC0,0x7F, + 0x03,0xF0,0xC8,0xF9,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20,0x28,0x70,0xE8,0x61, + 0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68,0x00,0x07,0x12,0xD5, + 0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x76,0xFB,0xFF,0xF7,0x20,0xF9, + 0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0x69,0xFB,0xE0,0x6B,0x0B,0x28,0xE6,0xD1,0xFE,0xF7,0xD2,0xF9, + 0x28,0x78,0x00,0x28,0xD9,0xD0,0x02,0xF0,0x2D,0xF8,0xD6,0xE7,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0xEE,0xE7,0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20, + 0x70,0xB5,0x21,0x49,0x1F,0x4A,0xCB,0x88,0x05,0x00,0x10,0x7A,0x1F,0x49,0x5C,0x06, + 0x00,0xD4,0x08,0x79,0x1E,0x4C,0xA4,0x8A,0x00,0x19,0x06,0x06,0xD0,0x79,0x36,0x0E, + 0x5A,0x06,0x00,0xD4,0xC8,0x78,0x1B,0x49,0x2C,0x78,0x4A,0x7C,0x00,0x2A,0x0F,0xD1, + 0x8A,0x7C,0x00,0x2A,0x01,0xD0,0x80,0x1C,0x08,0xE0,0xCA,0x7C,0x00,0x2A,0x01,0xD0, + 0x00,0x1D,0x03,0xE0,0x09,0x7D,0x00,0x29,0x02,0xD0,0x80,0x1D,0x00,0x06,0x00,0x0E, + 0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7,0xB8,0xFD, + 0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70,0x01,0x20, + 0xF4,0xE7,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0x70,0x08,0x00,0x20,0x10,0xB5,0x08,0x24,0x20,0x00,0xFE,0xF7, + 0x45,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8, + 0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00, + 0x19,0x22,0x10,0xB5,0x06,0x48,0x52,0x01,0x00,0x21,0x01,0xF0,0x73,0xFA,0x51,0x22, + 0x04,0x48,0xD2,0x00,0x00,0x21,0x01,0xF0,0x6D,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xC8,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21, + 0x20,0x00,0x01,0xF0,0x5F,0xFA,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0x01,0xF0,0x3E,0xFA, + 0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19, + 0x0E,0x48,0x00,0x19,0x01,0xF0,0x2A,0xFA,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48, + 0xA2,0x00,0x01,0xF0,0x47,0xFA,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21, + 0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0x34,0xFA,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xB8,0x73,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x46,0x06,0x00,0x00,0xF0,0x05,0x00,0x20,0x05,0x49,0xC8,0x05,0x41,0x62,0x05,0x49, + 0x81,0x62,0x05,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00, + 0x80,0xCC,0x3C,0x03,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30, + 0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0x35,0xFA,0x64,0x1C,0x08,0x2C,0xF9,0xDB, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00, + 0xFD,0xF7,0x44,0xF8,0xFE,0xF7,0xA6,0xFC,0xFE,0xF7,0xD0,0xFC,0xFE,0xF7,0x9A,0xFC, + 0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E, + 0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7,0x29,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0xA0,0x00,0x40,0x00,0x78,0x00,0x00,0x10,0xB5,0x02,0xF0,0xEB,0xF8,0x02,0xF0, + 0xCB,0xF8,0xFF,0x20,0xFD,0xF7,0x5A,0xF8,0xFF,0xF7,0xAE,0xFF,0x11,0x48,0x80,0x22, + 0x00,0x21,0x01,0xF0,0xD7,0xF9,0x08,0x20,0xFD,0xF7,0x18,0xF8,0x00,0x22,0x0E,0x49, + 0xD2,0x43,0x00,0x20,0xFF,0xF7,0x02,0xFE,0x00,0xF0,0x1A,0xF8,0x0B,0x48,0x40,0x7A, + 0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7,0x09,0xF8,0x00,0xF0,0x4D,0xF8,0x00,0xF0, + 0x37,0xF8,0x10,0x20,0x02,0xF0,0xB9,0xF8,0xFE,0xF7,0xD4,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x2C,0x0B,0x00,0x20,0x02,0x03,0x0F,0x0F,0x00,0x78,0x00,0x00, + 0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFC,0xF7,0xEF,0xFF,0x20,0x02, + 0xFD,0xF7,0x16,0xF8,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7,0xA9,0xFC,0x02,0x00, + 0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0,0x03,0xF9,0x07,0x4A, + 0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x03,0xF0,0xFC,0xF8,0x30,0x00,0xFC,0xF7, + 0xCD,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0xE8,0xFD,0x00,0x00, + 0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCB,0xFD,0x03,0xF0,0xDE,0xF9,0x7D,0x20, + 0xC0,0x00,0x03,0xF0,0xCD,0xF9,0x00,0x20,0xFF,0xF7,0xA8,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xE5,0x72,0x00,0x00,0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49, + 0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7,0x71,0xFC,0x64,0x30, + 0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0x88,0xF9,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xA5,0x07,0x00,0xF8,0x0A,0x00,0x20, + 0x10,0xB5,0xFF,0xF7,0xD5,0xFE,0xFF,0xF7,0x43,0xFF,0x15,0x48,0x00,0x7A,0x02,0xF0, + 0xEF,0xFF,0x13,0x48,0x13,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24,0xD1,0x83,0x12,0x49, + 0x0C,0x60,0x4C,0x60,0x11,0x49,0xD2,0x88,0x49,0x79,0x52,0x06,0x02,0xD4,0x01,0x00, + 0xA0,0x31,0x49,0x78,0x0C,0x4A,0xC0,0x3A,0x51,0x73,0x09,0x49,0x80,0x31,0x0A,0x8B, + 0x09,0x49,0x40,0x39,0xCA,0x62,0x00,0x88,0x08,0x63,0xFF,0xF7,0x9D,0xFE,0x08,0x48, + 0xC4,0x83,0xFE,0xF7,0xDD,0xFA,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0x0A,0x00,0x20,0x00,0x7A,0x00,0x00, + 0x30,0x07,0x00,0x20,0xF9,0x0A,0x00,0x20,0xF7,0xB5,0x86,0xB0,0x00,0x27,0x2E,0x48, + 0x04,0xAB,0x02,0x97,0x03,0x97,0x81,0xC3,0x2C,0x4E,0xFE,0xF7,0xAD,0xFB,0xFE,0xF7, + 0x5B,0xFC,0x2B,0x48,0x40,0x7F,0x01,0x90,0x29,0x48,0x20,0x38,0x40,0x7F,0x00,0x25, + 0x00,0x90,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00,0xFF,0xF7,0x38,0xFB, + 0x00,0x28,0x1C,0xD0,0x23,0x49,0x04,0x9A,0x09,0x78,0x69,0x43,0x09,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28, + 0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92, + 0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95,0x03,0x91,0x64,0x1C, + 0x14,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x13,0x48,0x00,0x78,0x85,0x42, + 0xD0,0xD3,0x08,0x99,0x03,0x98,0x08,0x60,0x10,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0, + 0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x04,0xE0,0x07,0x99,0x02,0x98, + 0x08,0x60,0x06,0x98,0x07,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF, + 0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x00,0x90,0x00,0x40, + 0x78,0x47,0xC0,0x46,0x70,0x20,0x9F,0xE5,0x04,0xE0,0x2D,0xE5,0x5A,0x04,0xD2,0xE5, + 0x60,0xC0,0x9F,0xE5,0x01,0x00,0x10,0xE3,0x14,0x00,0x00,0x0A,0x00,0x00,0x9C,0xE5, + 0x58,0x10,0x9F,0xE5,0xB0,0x01,0xC2,0xE1,0x00,0x30,0xD1,0xE5,0x00,0x00,0xA0,0xE3, + 0x0B,0x00,0x00,0xEA,0x5A,0xE4,0xD2,0xE5,0x00,0x10,0x82,0xE0,0x89,0x14,0xD1,0xE5, + 0x02,0x00,0x1E,0xE3,0x88,0xE4,0xD2,0xE5,0x9E,0x13,0x21,0x00,0x93,0xE1,0x21,0x10, + 0x01,0x11,0x9C,0xE7,0x80,0xE0,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x00,0x80,0xE2, + 0xB0,0x11,0xCE,0xE1,0x5B,0x14,0xD2,0xE5,0x00,0x00,0x51,0xE1,0xF0,0xFF,0xFF,0x8A, + 0x04,0xE0,0x9D,0xE4,0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xF0,0x05,0x00,0x20, + 0xFB,0x0A,0x00,0x20,0x88,0x42,0x00,0xDA,0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42, + 0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7, + 0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x02,0x00,0x08,0x00,0x8A,0x42,0x00,0xDC,0x10,0x00,0x70,0x47,0xF0,0xB5,0x00,0x20, + 0xFD,0xB0,0x6A,0x90,0xFF,0x49,0x20,0x22,0x1E,0xA8,0xFC,0xF7,0x3B,0xFA,0xFF,0x4A, + 0xFD,0x4B,0xD0,0x88,0x9C,0x89,0xFE,0x49,0x45,0x06,0x00,0xD4,0x0C,0x89,0x9F,0x7C, + 0x43,0x06,0x00,0xD4,0x8F,0x7B,0xF8,0x49,0x20,0x39,0x7C,0x91,0x8E,0x8B,0x41,0x06, + 0xF8,0x48,0x7B,0x90,0x00,0xD4,0x06,0x8B,0xF7,0x48,0xFF,0x22,0x05,0x78,0xF7,0x48, + 0x01,0x32,0x00,0x78,0x00,0x21,0x1D,0x90,0x26,0xA8,0x01,0xF0,0x1B,0xF8,0xF4,0x48, + 0x08,0x22,0x00,0x21,0x01,0xF0,0x16,0xF8,0xF1,0x48,0x10,0x22,0x00,0x21,0x08,0x30, + 0x01,0xF0,0x10,0xF8,0x24,0x22,0x00,0x21,0x14,0xA8,0x01,0xF0,0x0B,0xF8,0x24,0x22, + 0x00,0x21,0x0B,0xA8,0x01,0xF0,0x06,0xF8,0x24,0x22,0x00,0x21,0x02,0xA8,0x01,0xF0, + 0x01,0xF8,0xE2,0x49,0x08,0x79,0x00,0x28,0x7E,0xD0,0xC8,0x88,0x7A,0x90,0x80,0x06, + 0x02,0xD5,0xE0,0x1B,0x04,0x04,0x24,0x0C,0xDC,0x48,0x64,0x21,0x00,0x89,0x07,0x00, + 0x60,0x43,0xFC,0xF7,0x23,0xFA,0xDE,0x49,0x89,0x1C,0x79,0x91,0xD7,0x49,0xC9,0x89, + 0x40,0x18,0x79,0x99,0xC8,0x82,0xDB,0x48,0x00,0x21,0x78,0x90,0x01,0x81,0x7C,0x99, + 0x7A,0x9A,0x89,0x7F,0x38,0x00,0x52,0x06,0x01,0xD4,0x7B,0x99,0x89,0x7E,0x48,0x43, + 0x64,0x21,0xFC,0xF7,0xE5,0xFA,0x00,0x04,0x78,0x99,0x00,0x14,0xB0,0x42,0x48,0x81, + 0x01,0xDA,0x78,0x98,0x46,0x81,0x02,0x20,0x6E,0x90,0x1D,0x98,0x00,0x24,0x80,0x1C, + 0x75,0x90,0x6E,0x98,0x0A,0xE1,0x02,0x20,0x6F,0x90,0xA8,0x1C,0x76,0x90,0x6F,0x98, + 0xFA,0xE0,0x6E,0x99,0x28,0x1D,0x41,0x43,0x77,0x90,0x6F,0x98,0x08,0x18,0x43,0x00, + 0xC5,0x48,0x0A,0x21,0xC2,0x5E,0x78,0x98,0x41,0x5E,0x8A,0x42,0x03,0xDD,0x00,0x89, + 0x78,0x99,0x40,0x1C,0x08,0x81,0x79,0x9E,0x16,0x21,0x71,0x5E,0x00,0x20,0x8A,0x42, + 0x02,0xDD,0x50,0x1A,0x00,0x04,0x00,0x14,0x6F,0x9A,0x00,0x2A,0x09,0xD1,0x00,0x28, + 0x78,0xD0,0x6E,0x98,0x26,0xA9,0x80,0x1E,0x68,0x43,0x40,0x18,0x91,0x1E,0x40,0x5C, + 0x14,0xE0,0xB5,0x4A,0x9B,0x18,0x20,0x3B,0x1E,0x22,0x9A,0x5E,0x8A,0x42,0x03,0xDD, + 0x51,0x1A,0x09,0x04,0x09,0x14,0x65,0xD1,0x00,0x28,0xE9,0xD0,0x6E,0x98,0x26,0xA9, + 0x80,0x1E,0x68,0x43,0x41,0x18,0x6F,0x98,0x80,0x1E,0x08,0x5C,0x00,0x28,0xF2,0xD1, + 0x6F,0x98,0x00,0x04,0x00,0x14,0x00,0xE0,0x83,0xE1,0x6D,0x90,0x68,0x90,0x6E,0x98, + 0x64,0x1C,0x00,0x04,0x00,0x14,0x24,0x04,0x04,0x22,0x24,0x14,0x6C,0x90,0x08,0x2C, + 0x67,0x90,0x03,0xDD,0x64,0x1E,0x24,0x04,0x24,0x14,0xB3,0xE0,0x00,0x20,0x66,0x90, + 0x00,0x20,0x6B,0x90,0x66,0x98,0xFF,0x21,0x40,0x1C,0x00,0x04,0x00,0x14,0x01,0x31, + 0x88,0x42,0x66,0x90,0x36,0xDC,0x00,0x20,0x84,0x46,0x91,0x00,0x1E,0xAB,0xC8,0x18, + 0x40,0x88,0x59,0x5A,0x67,0x9E,0x68,0x9B,0x80,0x19,0xC9,0x18,0x00,0x04,0x09,0x04, + 0x00,0x14,0x09,0x14,0x02,0x28,0x26,0xDB,0x75,0x9B,0x98,0x42,0x23,0xDA,0x02,0x29, + 0x21,0xDB,0x76,0x9B,0x99,0x42,0x1E,0xDA,0x77,0x9B,0x8B,0x4E,0x43,0x43,0x5B,0x18, + 0x5B,0x00,0xF3,0x5E,0x79,0x9E,0x16,0x27,0xF7,0x5F,0xBB,0x42,0x13,0xDD,0x83,0x1E, + 0x6B,0x43,0x26,0xAE,0x9B,0x19,0x8E,0x1E,0x9B,0x57,0xA3,0x42,0x01,0xD0,0x00,0x2B, + 0x09,0xD1,0x6C,0x9B,0x98,0x42,0x02,0xD1,0x6D,0x9B,0x99,0x42,0x0B,0xD0,0x01,0x23, + 0x6B,0x93,0x08,0xE0,0x5D,0xE0,0x52,0x1C,0x63,0x46,0x5B,0x1C,0x52,0x07,0x52,0x0F, + 0x08,0x2B,0x9C,0x46,0xC1,0xDB,0x67,0x9B,0x26,0xAE,0x9B,0x1E,0x6B,0x43,0x9B,0x19, + 0x68,0x9E,0xB6,0x1E,0x9F,0x5D,0x00,0x2F,0x3E,0xD1,0x9C,0x55,0x77,0x9E,0x67,0x9B, + 0x79,0x9F,0x73,0x43,0x68,0x9E,0x9B,0x19,0x6F,0x4E,0x5B,0x00,0xF3,0x5E,0x16,0x26, + 0xBE,0x5F,0xB3,0x42,0x03,0xDD,0x9B,0x1B,0x1B,0x04,0x1B,0x0C,0x00,0xE0,0x00,0x23, + 0x69,0x93,0xA3,0x00,0x9C,0x46,0x14,0xAE,0xF3,0x58,0x68,0x9E,0x5F,0x4F,0x76,0x00, + 0xF6,0x19,0xB6,0x8B,0x69,0x9F,0x7E,0x43,0x9E,0x19,0x63,0x46,0x14,0xAF,0xFE,0x50, + 0x0B,0xAE,0xF3,0x58,0x67,0x9E,0x59,0x4F,0x76,0x00,0xF6,0x19,0x40,0x36,0x36,0x88, + 0x69,0x9F,0x7E,0x43,0x9E,0x19,0x63,0x46,0x0B,0xAF,0xFE,0x50,0x02,0xAF,0xFB,0x58, + 0x69,0x9E,0x9E,0x19,0x63,0x46,0xFE,0x50,0x50,0x4E,0x63,0x00,0x9B,0x19,0xFF,0x33, + 0x41,0x33,0xDE,0x88,0x76,0x1C,0xDE,0x80,0x6B,0x9B,0x00,0x2B,0x09,0xD0,0x00,0x06, + 0x00,0x0E,0x67,0x90,0x08,0x06,0x00,0x0E,0x52,0x1D,0x52,0x07,0x52,0x0F,0x68,0x90, + 0x5E,0xE7,0x6F,0x98,0x40,0x1C,0x6F,0x90,0x76,0x99,0x88,0x42,0x00,0xDA,0x00,0xE7, + 0x6A,0x98,0x00,0x28,0x06,0xD1,0x6E,0x98,0x40,0x1C,0x6E,0x90,0x75,0x99,0x88,0x42, + 0x00,0xDA,0xF0,0xE6,0x00,0x2C,0x74,0xDD,0x02,0x20,0x54,0xE0,0x02,0x20,0x69,0x1C, + 0x72,0x91,0x4C,0xE0,0x2B,0x1D,0x62,0x46,0x5A,0x43,0x12,0x18,0x79,0x9E,0x57,0x00, + 0x3D,0x4B,0x16,0x22,0xB2,0x5E,0xFE,0x18,0x02,0x23,0xF3,0x5E,0x00,0x21,0x93,0x42, + 0x02,0xDD,0x99,0x1A,0x09,0x04,0x09,0x14,0x62,0x46,0x92,0x1E,0x6A,0x43,0x26,0xAB, + 0xD2,0x18,0x83,0x1E,0x74,0x92,0xD3,0x56,0x01,0x93,0x43,0x1E,0x73,0x93,0xD2,0x56, + 0x00,0x2A,0x2A,0xD1,0x00,0x29,0x28,0xD0,0x01,0x9A,0x00,0x2A,0x25,0xD0,0x27,0x4F, + 0x46,0x00,0xF6,0x19,0xF6,0x8B,0x92,0x00,0x14,0xAB,0x4E,0x43,0x9B,0x58,0x9B,0x19, + 0x14,0xAE,0xB3,0x50,0x66,0x46,0x76,0x00,0xF6,0x19,0x40,0x36,0x36,0x88,0x0B,0xAB, + 0x9B,0x58,0x4E,0x43,0x9B,0x19,0x0B,0xAE,0xB3,0x50,0x02,0xAE,0xB3,0x58,0x59,0x18, + 0xB1,0x50,0x01,0x99,0x49,0x00,0xC9,0x19,0xFF,0x31,0x41,0x31,0xCA,0x88,0x52,0x1C, + 0xCA,0x80,0x73,0x9B,0x74,0x9A,0x01,0x99,0xD1,0x54,0x72,0x99,0x40,0x1C,0x88,0x42, + 0xB0,0xDB,0x60,0x46,0x40,0x1C,0x75,0x99,0x84,0x46,0x88,0x42,0xA6,0xDB,0x01,0x26, + 0x38,0xE0,0xB1,0x00,0x02,0xAA,0x71,0x91,0x57,0x58,0x01,0x20,0x00,0x2F,0x00,0xD0, + 0x38,0x00,0x01,0x00,0x71,0x98,0x14,0xAA,0x10,0x58,0xFC,0xF7,0x59,0xF9,0x07,0x49, + 0x72,0x00,0x51,0x18,0x70,0x91,0xFF,0x31,0x01,0x31,0xC8,0x83,0x01,0x21,0x00,0x2F, + 0x14,0xE0,0x21,0xE0,0x70,0x73,0x00,0x00,0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x40,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x2E,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0xD0,0x39,0x00, + 0x71,0x98,0x0B,0xAA,0x10,0x58,0xFC,0xF7,0x33,0xF9,0x70,0x99,0xFF,0x31,0x21,0x31, + 0x76,0x1C,0xC8,0x81,0xA6,0x42,0xC4,0xDD,0x14,0x4A,0x10,0x79,0x1F,0xE0,0x81,0x00, + 0x89,0x18,0xE0,0x31,0x0E,0x23,0xCB,0x5E,0x0C,0x24,0x0C,0x5F,0x6B,0x43,0x26,0xA9, + 0x09,0x19,0x59,0x5C,0x13,0x18,0x1C,0x00,0xFF,0x34,0x21,0x34,0x61,0x77,0x61,0x7F, + 0xFF,0x33,0x01,0x33,0x49,0x00,0x89,0x18,0xFF,0x31,0x41,0x31,0xC9,0x88,0x09,0x06, + 0x09,0x0E,0x19,0x74,0x93,0x8B,0x99,0x42,0x00,0xD9,0x91,0x83,0x40,0x1E,0x01,0x28, + 0xDD,0xDA,0x7D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xEB,0xB0,0x43,0x90,0x33,0x90,0x0E,0x90,0xFF,0x48,0x6A,0x90, + 0x02,0x8A,0xFF,0x49,0xC8,0x88,0x43,0x06,0x02,0xD4,0xFC,0x4A,0xC0,0x3A,0x92,0x89, + 0xFA,0x4E,0xFC,0x4D,0x20,0x36,0x0D,0x92,0xB2,0x89,0x43,0x06,0x00,0xD4,0x2A,0x89, + 0xF9,0x4B,0x0C,0x92,0xF5,0x4A,0x40,0x32,0x69,0x92,0x52,0x89,0x44,0x06,0x68,0x93, + 0x00,0xD4,0xDA,0x88,0x43,0x06,0x0B,0x92,0x69,0x9A,0x12,0x79,0x01,0xD4,0x68,0x9A, + 0x12,0x78,0x43,0x06,0x0A,0x92,0x69,0x9A,0x52,0x79,0x01,0xD4,0x68,0x9A,0x52,0x78, + 0x43,0x06,0x09,0x92,0x69,0x9A,0x12,0x8B,0x01,0xD4,0x68,0x9A,0x92,0x8A,0x08,0x92, + 0x37,0x89,0x42,0x06,0x00,0xD4,0xAF,0x88,0x69,0x9A,0x43,0x06,0x92,0x7C,0x01,0xD4, + 0x68,0x9A,0x92,0x7B,0x43,0x06,0x07,0x92,0x69,0x9A,0x12,0x7D,0x01,0xD4,0x68,0x9A, + 0x12,0x7C,0xE2,0x48,0x06,0x92,0x04,0x78,0xE1,0x48,0x29,0x22,0x00,0x78,0x05,0x90, + 0xDB,0x48,0xC0,0x89,0x04,0x90,0x01,0x20,0x03,0x90,0x00,0x20,0x01,0x00,0x01,0x90, + 0x0F,0xA8,0x00,0xF0,0x97,0xFD,0xDB,0x48,0xD5,0x49,0x08,0x81,0xD4,0x48,0x00,0x21, + 0x81,0x81,0x41,0x81,0xC0,0x30,0x67,0x90,0x41,0x80,0xA0,0x30,0x66,0x90,0x40,0x78, + 0xD5,0x49,0x02,0x28,0x65,0x91,0x55,0xD9,0xCD,0x4A,0x71,0x8A,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0xE9,0x89,0x37,0x91,0xD1,0x49,0x64,0x91,0x89,0x8B,0x37,0x9A,0x89,0x18, + 0x38,0x91,0x0D,0x99,0xC9,0x04,0x25,0xD5,0x01,0x28,0x0C,0xD9,0xC4,0x4A,0xF1,0x7A, + 0xD2,0x88,0x52,0x06,0x00,0xD4,0xE9,0x79,0x48,0x43,0x00,0x06,0x00,0x0E,0x03,0x90, + 0x01,0xD1,0x01,0x20,0x03,0x90,0x67,0x99,0xBD,0x4A,0x00,0x20,0x08,0x5E,0xD2,0x88, + 0xB1,0x7A,0x52,0x06,0x00,0xD4,0xA9,0x79,0x48,0x43,0x64,0x21,0xFB,0xF7,0x8E,0xFF, + 0x00,0x04,0x00,0x0C,0xB8,0x42,0x00,0xD2,0x38,0x00,0x03,0x99,0xFC,0xF7,0x60,0xF8, + 0x67,0x99,0x48,0x80,0xB2,0x49,0x69,0x98,0xC9,0x88,0x40,0x8B,0x49,0x06,0x01,0xD4, + 0x68,0x98,0xC0,0x8A,0x65,0x99,0x89,0x8B,0x40,0x18,0x38,0x99,0x36,0x90,0x88,0x42, + 0x35,0x91,0x00,0xD2,0x38,0x90,0x02,0x20,0x4E,0x90,0xA8,0x48,0xC0,0x30,0x63,0x90, + 0xAD,0x48,0xA0,0x38,0x62,0x90,0x1F,0xA8,0x61,0x90,0x05,0x98,0x80,0x1C,0x55,0x90, + 0x4E,0x98,0xDF,0xE3,0x02,0x28,0x08,0xD1,0xA1,0x4A,0x31,0x8A,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0xA9,0x89,0x65,0x9A,0x52,0x8B,0x0E,0xE0,0xA5,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0xA4,0x49,0x89,0x89,0x05,0xE0,0x99,0x4A,0xF1,0x89,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0x69,0x89,0x65,0x9A,0x12,0x8B,0x89,0x18,0x93,0xE7,0x02,0x25,0xA0,0x1C, + 0x56,0x90,0xB4,0xE3,0x4E,0x98,0x56,0x99,0x40,0x1E,0x48,0x43,0x69,0x1E,0x40,0x18, + 0x00,0x04,0x07,0x14,0x98,0x49,0x78,0x00,0x60,0x90,0x08,0x5E,0x38,0x99,0x09,0x04, + 0x09,0x14,0x88,0x42,0x7B,0xDB,0x78,0x1C,0xC1,0x10,0x0F,0xAA,0x52,0x5C,0x41,0x07, + 0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40,0xF8,0x10,0x0F,0xA9,0x5F,0x90,0x09,0x5C, + 0x7B,0x07,0x5B,0x0F,0x01,0x20,0x98,0x40,0x01,0x40,0x7B,0x1E,0x5E,0x90,0xD8,0x10, + 0x0F,0xAE,0x30,0x5C,0x5E,0x07,0x76,0x0F,0x01,0x23,0xB3,0x40,0x18,0x40,0x01,0xF0, + 0x6B,0xFD,0x3B,0x1B,0x00,0x90,0x58,0x1E,0xC1,0x10,0x0F,0xAA,0x52,0x5C,0x41,0x07, + 0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40,0x98,0x1E,0xC1,0x10,0x0F,0xAE,0x71,0x5C, + 0x46,0x07,0x76,0x0F,0x01,0x20,0xB0,0x40,0x01,0x40,0xDB,0x1E,0xD8,0x10,0x0F,0xAE, + 0x30,0x5C,0x5E,0x07,0x76,0x0F,0x01,0x23,0xB3,0x40,0x18,0x40,0x01,0xF0,0x4C,0xFD, + 0x00,0x99,0x01,0xF0,0x47,0xFD,0x00,0x28,0x39,0xD1,0x73,0x48,0x22,0x00,0x39,0x00, + 0x02,0x23,0xFE,0xF7,0x47,0xFF,0x38,0x99,0x88,0x42,0xB3,0xDB,0x6E,0x4A,0x60,0x99, + 0x51,0x5E,0x81,0x42,0xF0,0xD1,0x62,0x4F,0xBA,0x89,0x82,0x42,0x00,0xDA,0xB8,0x81, + 0x5F,0x9B,0x0F,0xAA,0xD3,0x5C,0x5E,0x9E,0x33,0x43,0x5F,0x9E,0x93,0x55,0x5C,0x4A, + 0x92,0x89,0x82,0x42,0x05,0xD1,0x5A,0x48,0x00,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E, + 0x0E,0x90,0x00,0x20,0x06,0x00,0x02,0x90,0x62,0x98,0x80,0x7E,0xC2,0x07,0x20,0xD0, + 0x80,0x07,0x0D,0xD5,0x60,0x1B,0x40,0x1C,0x00,0xD1,0x66,0x1E,0xAC,0x42,0x04,0xD1, + 0x01,0x22,0x20,0x04,0x52,0x04,0x80,0x1A,0x06,0x43,0x01,0x20,0x10,0xE0,0x94,0xE0, + 0x4E,0x9A,0x05,0x98,0x80,0x1A,0x40,0x1C,0x01,0xD1,0x05,0x9E,0x76,0x1E,0x05,0x98, + 0x90,0x42,0x04,0xD1,0x01,0x22,0x00,0x04,0x12,0x05,0x80,0x1A,0x06,0x43,0x02,0x20, + 0x02,0x90,0x30,0x04,0x01,0xD0,0x36,0x98,0x00,0xE0,0x35,0x98,0x00,0x04,0x00,0x14, + 0x81,0x42,0xB2,0xDB,0x4E,0x99,0x20,0x1D,0x41,0x43,0x5D,0x90,0x48,0x19,0x00,0x04, + 0x00,0x14,0x34,0x90,0x0D,0x98,0xC0,0x04,0x0C,0xD5,0x34,0x98,0x43,0x49,0x40,0x00, + 0x08,0x5E,0x04,0x99,0x40,0x1A,0x00,0x28,0x67,0xDD,0x67,0x9A,0x02,0x21,0x51,0x5E, + 0x81,0x42,0x62,0xDA,0x04,0x20,0x51,0x90,0x04,0x20,0x50,0x90,0x51,0x98,0x28,0x18, + 0x5C,0x90,0x51,0x98,0x80,0x00,0x5B,0x90,0x5C,0x98,0x00,0x1F,0x0B,0xD4,0x5C,0x98, + 0x00,0x1F,0xA0,0x42,0x07,0xDA,0x50,0x99,0x4E,0x98,0x47,0x18,0x38,0x1F,0x02,0xD4, + 0x05,0x99,0x88,0x42,0x08,0xDB,0x50,0x98,0x14,0x22,0x50,0x43,0x00,0x21,0x1A,0xAA, + 0x80,0x18,0x5B,0x9A,0x81,0x50,0x27,0xE0,0x04,0x98,0x0D,0x99,0x00,0x04,0x00,0x14, + 0xC9,0x04,0x04,0xD5,0x03,0x99,0xFB,0xF7,0x59,0xFE,0x00,0x04,0x00,0x14,0x5D,0x99, + 0xBF,0x1E,0x4F,0x43,0x5C,0x99,0x25,0x4A,0x79,0x18,0x49,0x00,0x89,0x18,0x20,0x39, + 0x89,0x8B,0x08,0x1A,0x00,0x04,0x00,0x14,0x00,0xD5,0x00,0x20,0x08,0x99,0x00,0x29, + 0x03,0xD0,0x88,0x42,0x01,0xDD,0x08,0x04,0x00,0x14,0x50,0x99,0x14,0x22,0x51,0x43, + 0x1A,0xAA,0x89,0x18,0x5B,0x9A,0x88,0x50,0x50,0x98,0x40,0x1E,0x00,0x04,0x00,0x14, + 0x50,0x90,0xB9,0xD5,0x51,0x98,0x40,0x1E,0x00,0x04,0x00,0x14,0x51,0x90,0xAB,0xD5, + 0x34,0x98,0x12,0x4A,0x40,0x00,0x84,0x46,0x80,0x18,0x01,0x00,0x20,0x39,0x1E,0x23, + 0xCB,0x5E,0x04,0x99,0x59,0x1A,0x42,0x91,0x1A,0xE0,0x8C,0xE1,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x00,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20, + 0x04,0x0B,0x00,0x20,0xA0,0x7A,0x00,0x00,0x40,0x00,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x02,0x21,0x41,0x5E,0x04,0x98,0x04,0x9B,0x08,0x1A,0x41,0x90,0x34,0x98,0x18,0x21, + 0x00,0x1B,0x40,0x00,0x80,0x18,0x20,0x38,0x41,0x5E,0xC9,0x1A,0x40,0x91,0x34,0x99, + 0x08,0x23,0x09,0x19,0x49,0x00,0x89,0x18,0xCB,0x5E,0x04,0x9F,0xDB,0x1B,0x3F,0x93, + 0x16,0x23,0xC3,0x5E,0xDB,0x1B,0x3E,0x93,0x06,0x23,0xCB,0x5E,0xDB,0x1B,0x3D,0x93, + 0x1A,0x23,0xC3,0x5E,0xD8,0x1B,0x3C,0x90,0x0A,0x20,0x08,0x5E,0x0C,0x99,0xC0,0x1B, + 0x3B,0x90,0x60,0x46,0x10,0x5E,0xC0,0x1B,0x48,0x43,0x64,0x21,0xFB,0xF7,0xD6,0xFD, + 0x39,0x90,0x27,0x98,0x02,0x04,0x25,0x98,0x12,0x14,0x03,0x04,0x22,0x98,0x00,0x92, + 0x02,0x04,0x21,0x98,0x1B,0x14,0x01,0x04,0x20,0x98,0x12,0x14,0x00,0x04,0x09,0x14, + 0x00,0x14,0xFF,0xF7,0x32,0xFB,0x07,0x00,0x2C,0x98,0x02,0x04,0x2B,0x98,0x12,0x14, + 0x01,0x04,0x2A,0x98,0x09,0x14,0x00,0x04,0x00,0x14,0xFF,0xF7,0x1F,0xFB,0x01,0x00, + 0x38,0x00,0xFF,0xF7,0x17,0xFB,0x26,0x99,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD, + 0x81,0x42,0x05,0xDD,0x08,0x1A,0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x01,0x90, + 0xFF,0x48,0xFF,0x21,0xC0,0x88,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5, + 0x01,0x20,0x01,0x90,0x04,0x20,0x51,0x90,0x02,0x98,0x80,0x07,0xC0,0x0F,0x5A,0x90, + 0x04,0x20,0x50,0x90,0x07,0x99,0x5A,0x98,0x09,0x07,0x25,0xD5,0x05,0x99,0x08,0x1A, + 0x4E,0x99,0x08,0x1A,0x01,0x28,0x1F,0xD1,0x50,0x98,0x01,0x28,0x1C,0xD1,0x51,0x98, + 0x61,0x99,0x80,0x00,0x59,0x90,0x09,0x18,0x61,0x9A,0x49,0x69,0x17,0x58,0x64,0x20, + 0x78,0x43,0x49,0x1C,0xFB,0xF7,0x7A,0xFD,0x64,0x21,0x08,0x1A,0x00,0x04,0x00,0x14, + 0x00,0xD5,0x00,0x20,0x06,0x99,0x48,0x43,0x78,0x43,0xE6,0x49,0xFB,0xF7,0x6E,0xFD, + 0x59,0x9A,0x61,0x99,0x38,0x1A,0x88,0x50,0x50,0x98,0x40,0x1E,0x00,0x04,0x00,0x14, + 0x50,0x90,0xCF,0xD5,0x51,0x98,0x40,0x1E,0x00,0x04,0x00,0x14,0x51,0x90,0xC7,0xD5, + 0xDD,0x48,0x00,0x78,0x00,0x28,0x47,0xD1,0x21,0xA9,0x06,0xC9,0x02,0x2D,0x14,0xD1, + 0x01,0xF0,0xAA,0xFB,0x07,0x00,0x00,0x21,0x27,0x9A,0x08,0x00,0x01,0xF0,0xA4,0xFB, + 0x2B,0xA9,0x06,0xC9,0x3F,0x18,0x00,0x20,0x01,0xF0,0x9E,0xFB,0x38,0x18,0x05,0x21, + 0xFB,0xF7,0x44,0xFD,0x00,0x04,0x00,0x0C,0x13,0xE0,0x20,0x98,0x01,0xF0,0x94,0xFB, + 0x07,0x00,0x27,0x9A,0x25,0x98,0x00,0x21,0x01,0xF0,0x8E,0xFB,0x3F,0x18,0x2A,0xA8, + 0x07,0xC8,0x01,0xF0,0x89,0xFB,0x38,0x18,0xC1,0x17,0x49,0x0F,0x08,0x18,0x40,0x03, + 0x00,0x0C,0x26,0x99,0x09,0x1A,0x00,0x29,0x01,0xDC,0x26,0x99,0x41,0x1A,0x63,0x98, + 0x02,0x8A,0xBF,0x48,0xC0,0x88,0x43,0x06,0x01,0xD4,0x6A,0x9A,0x92,0x89,0x91,0x42, + 0x0A,0xDA,0x63,0x99,0x26,0x9A,0x49,0x8A,0x40,0x06,0x01,0xD4,0x6A,0x98,0xC1,0x89, + 0x8A,0x42,0x01,0xDA,0x30,0x04,0x7E,0xD0,0x00,0x2E,0x2B,0xD0,0x02,0x98,0xC0,0x07, + 0x16,0xD0,0x04,0x20,0x00,0x22,0x1A,0xAB,0x31,0x04,0x06,0xD0,0x14,0x27,0x01,0x00, + 0x79,0x43,0x5A,0x50,0xC9,0x18,0x4A,0x60,0x05,0xE0,0x14,0x27,0x01,0x00,0x79,0x43, + 0xC9,0x18,0xCA,0x60,0x0A,0x61,0x40,0x1E,0x00,0x04,0x00,0x14,0xEC,0xD5,0x11,0xE0, + 0x04,0x20,0x00,0x22,0x1A,0xAB,0x31,0x04,0x04,0xD0,0x81,0x00,0x5A,0x50,0xC9,0x18, + 0x4A,0x61,0x03,0xE0,0x81,0x00,0xC9,0x18,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04, + 0x00,0x14,0xF0,0xD5,0xA1,0x48,0x34,0x99,0x22,0x00,0x04,0x23,0xFE,0xF7,0x3A,0xFD, + 0x9B,0x49,0x0A,0x89,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA, + 0x48,0x81,0x97,0x48,0x01,0x79,0x49,0x1C,0x0A,0x06,0x12,0x0E,0x02,0x71,0x92,0x00, + 0xA9,0x1E,0x12,0x18,0xE0,0x32,0x58,0x91,0x91,0x81,0x4E,0x99,0x89,0x1E,0x57,0x91, + 0x02,0x79,0x92,0x00,0x10,0x18,0xE0,0x30,0xC1,0x81,0x00,0x21,0x39,0x9B,0x42,0x98, + 0x0A,0x00,0x98,0x42,0x8C,0x46,0x3A,0x91,0x05,0xDC,0x3E,0x98,0x98,0x42,0x02,0xDC, + 0x3D,0x98,0x98,0x42,0x00,0xDD,0x01,0x21,0x41,0x98,0x98,0x42,0x06,0xDC,0x3C,0x98, + 0x98,0x42,0x03,0xDC,0x3B,0x9B,0x39,0x98,0x83,0x42,0x01,0xDD,0x01,0x20,0x3A,0x90, + 0x39,0x9B,0x40,0x98,0x98,0x42,0x05,0xDC,0x3E,0x98,0x98,0x42,0x02,0xDC,0x3C,0x98, + 0x98,0x42,0x01,0xDD,0x01,0x20,0x84,0x46,0x3F,0x98,0x98,0x42,0x07,0xDC,0x3D,0x98, + 0x98,0x42,0x04,0xDC,0x00,0xE0,0xFE,0xE0,0x3B,0x98,0x98,0x42,0x00,0xDD,0x01,0x22, + 0x04,0x20,0x1A,0xAE,0x00,0x29,0x03,0xD1,0x00,0x23,0x14,0x27,0x47,0x43,0xF3,0x51, + 0x3A,0x9B,0x00,0x2B,0x03,0xD1,0x14,0x27,0x47,0x43,0xBF,0x19,0x3B,0x61,0x63,0x46, + 0x00,0x2B,0x01,0xD1,0x87,0x00,0xF3,0x51,0x00,0x2A,0x03,0xD1,0x00,0x23,0x87,0x00, + 0xBF,0x19,0x3B,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xE3,0xD5,0x1E,0x9A,0x1A,0xA8, + 0x00,0x92,0x0F,0xC8,0x01,0xF0,0xC3,0xFA,0x4B,0x90,0x23,0x9A,0x1F,0xA8,0x00,0x92, + 0x0F,0xC8,0x01,0xF0,0xBC,0xFA,0x28,0x9A,0x4A,0x90,0x24,0xA8,0x00,0x92,0x0F,0xC8, + 0x01,0xF0,0xB5,0xFA,0x2D,0x9A,0x49,0x90,0x29,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0, + 0xAE,0xFA,0x32,0x9A,0x48,0x90,0x2E,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xA7,0xFA, + 0x47,0x90,0x00,0x90,0x48,0x9B,0x49,0x9A,0x4A,0x99,0x4B,0x98,0x01,0xF0,0x9F,0xFA, + 0x00,0x28,0x4C,0x90,0x0F,0xD1,0x04,0x27,0x14,0x20,0x78,0x43,0x80,0x19,0x0A,0x22, + 0x00,0x21,0x00,0xF0,0x07,0xFA,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xF4,0xD5,0x0A,0x20, + 0x49,0x90,0x26,0x90,0x4C,0x90,0x58,0x98,0x00,0x28,0x01,0xDC,0x00,0x20,0x0C,0xE0, + 0x2E,0x9A,0x29,0x9B,0x00,0x92,0x24,0x9A,0x1F,0x99,0x1A,0x98,0x01,0xF0,0x7F,0xFA, + 0x3F,0x4A,0x69,0x00,0x89,0x18,0x49,0x8B,0x48,0x43,0x2F,0x9A,0x46,0x90,0x00,0x92, + 0x2A,0x9B,0x25,0x9A,0x20,0x99,0x1B,0x98,0x01,0xF0,0x71,0xFA,0x38,0x4A,0x69,0x00, + 0x8E,0x18,0xB1,0x8B,0x30,0x9A,0x2B,0x9B,0x48,0x43,0x45,0x90,0x00,0x92,0x26,0x9A, + 0x21,0x99,0x1C,0x98,0x01,0xF0,0x63,0xFA,0xF1,0x8B,0x31,0x9A,0x2C,0x9B,0x48,0x43, + 0x44,0x90,0x00,0x92,0x27,0x9A,0x22,0x99,0x1D,0x98,0x01,0xF0,0x58,0xFA,0x31,0x8C, + 0x48,0x43,0x58,0x99,0x07,0x00,0x60,0x1E,0x81,0x42,0x01,0xDB,0x00,0x20,0x09,0xE0, + 0x32,0x9A,0x00,0x92,0x2D,0x9B,0x28,0x9A,0x23,0x99,0x1E,0x98,0x01,0xF0,0x47,0xFA, + 0x71,0x8C,0x48,0x43,0x00,0x90,0x44,0x9A,0x45,0x99,0x46,0x98,0x3B,0x00,0x01,0xF0, + 0x3E,0xFA,0x4C,0x99,0xFB,0xF7,0xE2,0xFB,0x1D,0x49,0x0A,0x8C,0x52,0x00,0x80,0x1A, + 0x00,0xD5,0x00,0x20,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0x90,0x81,0x57,0x98, + 0x00,0x28,0x01,0xDC,0x00,0x20,0x05,0xE0,0x4E,0x98,0x4B,0x9A,0x40,0x00,0x40,0x18, + 0xC0,0x8F,0x50,0x43,0x4E,0x9A,0x12,0x49,0x52,0x00,0x52,0x18,0x40,0x32,0x11,0x88, + 0x4A,0x9B,0x49,0x9E,0x59,0x43,0x53,0x88,0x05,0x9F,0x73,0x43,0x9C,0x46,0x93,0x88, + 0x48,0x9E,0x7F,0x1E,0x73,0x43,0x57,0x9E,0xBE,0x42,0x01,0xDB,0x00,0x22,0x02,0xE0, + 0xD2,0x88,0x47,0x9E,0x72,0x43,0x00,0x92,0x62,0x46,0x01,0xF0,0x08,0xFA,0x4C,0x99, + 0xFB,0xF7,0xAC,0xFB,0x02,0x49,0x40,0x31,0x89,0x88,0x49,0x00,0x40,0x1A,0x07,0xE0, + 0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00,0x05,0x0B,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x00,0xD5,0x00,0x20,0xA0,0x49,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0xD0,0x83, + 0x08,0x79,0x08,0x28,0x12,0xD2,0x6D,0x1C,0x56,0x98,0x2D,0x04,0x2D,0x14,0x85,0x42, + 0x00,0xDA,0x47,0xE4,0x43,0x98,0x00,0x28,0x08,0xD1,0x4E,0x98,0x40,0x1C,0x00,0x04, + 0x00,0x14,0x4E,0x90,0x55,0x99,0x88,0x42,0x00,0xDA,0x37,0xE4,0x0D,0x98,0x00,0x06, + 0x5A,0xD5,0x91,0x4D,0x28,0x79,0x00,0x28,0x64,0x98,0x0F,0xD1,0x80,0x8B,0x00,0x28, + 0x4B,0xD0,0x64,0x98,0x69,0x99,0xEA,0x88,0x40,0x7E,0x09,0x7B,0x52,0x06,0x01,0xD4, + 0x68,0x99,0x09,0x7A,0x88,0x42,0x40,0xD2,0x40,0x1C,0x3B,0xE0,0x80,0x7E,0x0A,0x99, + 0x88,0x42,0x36,0xD8,0x40,0x1C,0x64,0x99,0x00,0x06,0x00,0x0E,0x88,0x76,0x09,0x99, + 0x88,0x42,0x03,0xD9,0xAA,0x89,0x33,0x99,0x51,0x18,0x33,0x91,0x0A,0x99,0x88,0x42, + 0x27,0xD1,0x09,0x99,0x88,0x42,0x24,0xD0,0x41,0x1A,0x33,0x98,0xFB,0xF7,0x28,0xFC, + 0x64,0x99,0x00,0x22,0x8A,0x83,0x69,0x99,0x0A,0x89,0xE9,0x88,0x4B,0x06,0x01,0xD4, + 0x68,0x9A,0x92,0x88,0x82,0x42,0x14,0xD2,0x37,0x9A,0x80,0x1A,0x69,0x9A,0x49,0x06, + 0x92,0x79,0x01,0xD4,0x68,0x99,0x8A,0x78,0x64,0x21,0x50,0x43,0xFB,0xF7,0x10,0xFC, + 0x64,0x99,0x00,0x04,0x00,0x0C,0x88,0x83,0x0B,0x99,0x88,0x42,0x01,0xD9,0x64,0x98, + 0x81,0x83,0x00,0x20,0x64,0x99,0x48,0x76,0x06,0xE0,0x64,0x99,0x00,0x20,0x88,0x76, + 0x64,0x99,0x48,0x76,0x64,0x99,0x88,0x83,0x00,0x20,0x01,0x00,0x4D,0x90,0x62,0x48, + 0x01,0x25,0x00,0x79,0x53,0x90,0x52,0xE0,0x69,0x00,0x8E,0x18,0xC0,0x36,0xB0,0x89, + 0x0A,0x21,0xFB,0xF7,0xED,0xFB,0x00,0x04,0x00,0x14,0x4F,0x90,0xF0,0x8B,0x0A,0x21, + 0xFB,0xF7,0xE6,0xFB,0x62,0x9B,0x02,0x04,0xDB,0x7E,0x12,0x14,0x00,0x21,0x08,0x00, + 0x54,0x93,0x37,0xE0,0x54,0x4E,0xC3,0x00,0x9F,0x19,0x11,0x23,0x9B,0x01,0xFB,0x18, + 0x1C,0x26,0x9E,0x5F,0x9C,0x46,0x4F,0x9B,0x9E,0x42,0x27,0xDC,0x23,0x23,0x5B,0x01, + 0xFF,0x18,0x00,0x23,0xFB,0x5E,0x4F,0x9E,0xB3,0x42,0x1F,0xDB,0x1E,0x26,0x63,0x46, + 0x9E,0x5F,0x96,0x42,0x1A,0xDC,0x02,0x23,0xFB,0x5E,0x47,0x4E,0x93,0x42,0x15,0xDB, + 0xAB,0x00,0x9E,0x19,0xE0,0x36,0x0E,0x23,0xF3,0x5E,0x27,0x1D,0x9B,0x1C,0x7B,0x43, + 0x0C,0x27,0xF7,0x5F,0x41,0x4E,0xDB,0x19,0x5B,0x00,0x9E,0x19,0x04,0x23,0xF3,0x5E, + 0x4D,0x9E,0xB3,0x42,0x02,0xDD,0x29,0x06,0x09,0x0E,0x4D,0x93,0x40,0x1C,0x54,0x9B, + 0x00,0x04,0x00,0x14,0x83,0x42,0xC5,0xDC,0x6D,0x1C,0x2D,0x04,0x2D,0x14,0x53,0x98, + 0x35,0x4A,0xA8,0x42,0xA8,0xDA,0x15,0x00,0x2C,0x00,0x26,0x00,0x6A,0x89,0x20,0x00, + 0x4D,0x9B,0xDE,0x36,0xCC,0x30,0xC2,0x34,0x9A,0x42,0x52,0x96,0x14,0xDC,0x00,0x29, + 0x12,0xD0,0x49,0x00,0x49,0x19,0xC0,0x31,0x8F,0x89,0xCE,0x8B,0x12,0x22,0x00,0x21, + 0x00,0xF0,0x78,0xF8,0x52,0x98,0x12,0x22,0x00,0x21,0x00,0xF0,0x73,0xF8,0x01,0x20, + 0x28,0x71,0xA7,0x81,0xE6,0x83,0x1E,0xE0,0x69,0x79,0x00,0x29,0x1B,0xD1,0x53,0x99, + 0x01,0x29,0x18,0xD9,0x66,0x99,0x89,0x78,0x00,0x29,0x14,0xD1,0x0E,0x99,0x00,0x29, + 0x11,0xD0,0x4A,0x00,0x51,0x19,0xC0,0x31,0x8E,0x89,0xCF,0x8B,0x12,0x22,0x00,0x21, + 0x00,0xF0,0x58,0xF8,0x52,0x98,0x12,0x22,0x00,0x21,0x00,0xF0,0x53,0xF8,0x01,0x20, + 0x28,0x71,0xA6,0x81,0xE7,0x83,0x62,0x98,0xC0,0x7D,0x00,0x28,0x0C,0xD0,0x00,0x21, + 0x29,0x71,0x62,0x98,0x12,0x4A,0x00,0x7E,0x92,0x7F,0x90,0x42,0x01,0xD3,0x62,0x9A, + 0xD1,0x75,0x62,0x99,0x40,0x1C,0x08,0x76,0x01,0x99,0x0E,0x48,0x00,0x29,0x10,0xD0, + 0x29,0x79,0x00,0x29,0x0D,0xD0,0x0C,0x4A,0x01,0x68,0x52,0x89,0x0A,0x32,0x91,0x42, + 0x01,0xDA,0x49,0x1C,0x01,0x60,0x28,0x79,0x68,0x71,0x6B,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x21,0xF6,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x00,0x78,0x00,0x00,0xF0,0x0A,0x00,0x20,0x80,0x7A,0x00,0x00,0x03,0xE0,0x0B,0x78, + 0x49,0x1C,0x03,0x70,0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47,0x52,0x10,0x03,0xE0, + 0x0B,0x88,0x89,0x1C,0x03,0x80,0x80,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47,0x92,0x10, + 0x01,0xE0,0x08,0xC9,0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x09,0x06,0x09,0x0E,0x01,0xE0,0x01,0x70,0x40,0x1C,0x52,0x1E, + 0xFB,0xD2,0x70,0x47,0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47, + 0x0A,0x49,0x00,0x20,0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5,0xC8,0x7A,0x89,0x7A, + 0x08,0x18,0x00,0x06,0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23,0x1B,0x02,0x9A,0x43, + 0x02,0x61,0x02,0x69,0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x80,0x78,0x00,0x00,0x00,0x90,0x00,0x40,0x10,0xB5,0x14,0x48,0x14,0x49,0x80,0x8B, + 0xC9,0x8A,0x00,0x24,0x40,0x18,0x13,0x49,0x09,0x78,0x00,0x29,0x12,0x49,0x04,0xD0, + 0x15,0x22,0x52,0x01,0x89,0x18,0x49,0x89,0x09,0xE0,0x10,0x4A,0xFF,0x31,0xD2,0x88, + 0xA1,0x31,0x49,0x8A,0x52,0x06,0x02,0xD4,0x0B,0x49,0xE0,0x31,0xC9,0x89,0x08,0x18, + 0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7, + 0x07,0xFF,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x06,0x00,0x20, + 0xD0,0x0A,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xC0,0x90,0x00,0x40,0xF7,0xB5,0x2C,0x4E,0xFF,0x27,0xB0,0x7F,0xF1,0x7F,0x84,0xB0, + 0x00,0x02,0x08,0x43,0x01,0xF0,0xEE,0xFD,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07, + 0x0A,0xD0,0x26,0x48,0x01,0x78,0x26,0x48,0x00,0x7A,0x00,0x29,0x02,0xD0,0x01,0xF0, + 0x81,0xFD,0x01,0xE0,0x01,0xF0,0xAE,0xFD,0x22,0x48,0x02,0x25,0xC1,0x6A,0x03,0x91, + 0x01,0x6A,0x02,0x91,0x41,0x6A,0x01,0x91,0x41,0x6B,0x00,0x91,0x21,0xE0,0x1D,0x4F, + 0x00,0x20,0xF8,0x62,0x18,0x48,0xA0,0x30,0x80,0x68,0x38,0x62,0x1A,0x48,0x00,0x6B, + 0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFC,0xF7,0xB8,0xF8,0x64,0x1E,0xF9,0xD5, + 0x02,0x20,0x78,0x63,0x30,0x7F,0x01,0x00,0xFC,0xF7,0x32,0xF9,0x01,0x24,0x04,0xA8, + 0x07,0xC8,0xFE,0xF7,0x49,0xFE,0x07,0x00,0x01,0xD1,0x00,0x24,0x25,0x00,0x64,0x1E, + 0xF5,0xD5,0x28,0x00,0x6D,0x1E,0x00,0x28,0xD9,0xDC,0x0A,0x48,0x03,0x99,0xC1,0x62, + 0x02,0x99,0x01,0x62,0x01,0x99,0x41,0x62,0x00,0x99,0x41,0x63,0x38,0x00,0x07,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00,0xFD,0x0A,0x00,0x20, + 0x70,0x0A,0x00,0x20,0x80,0x90,0x00,0x40,0x80,0x7A,0x00,0x00,0x78,0x47,0xC0,0x46, + 0xF0,0x4F,0x2D,0xE9,0x71,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0xB8,0x01,0x8D,0xE5, + 0xC8,0x08,0x9F,0xE5,0xCC,0x38,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0xCC,0x68,0x9F,0xE5, + 0xAC,0x01,0x8D,0xE5,0xB8,0x08,0x9F,0xE5,0x00,0xB0,0xD0,0xE5,0xB6,0x00,0xD3,0xE1, + 0x40,0x10,0x00,0xE2,0xB0,0x08,0x9F,0xE5,0x00,0x00,0x51,0xE3,0x01,0x4C,0x80,0xE2, + 0xBC,0x1E,0xD0,0x01,0xB0,0x1B,0xD4,0x11,0x02,0xAC,0x80,0xE2,0xA8,0x11,0x8D,0xE5, + 0xB0,0x1F,0xD0,0x01,0xB4,0x1B,0xD4,0x11,0xA4,0x11,0x8D,0xE5,0xF8,0x1A,0xD4,0x01, + 0xFC,0x16,0xDA,0x11,0x9C,0x11,0x8D,0xE5,0xFA,0x1A,0xD4,0x01,0xFE,0x16,0xDA,0x11, + 0x98,0x11,0x8D,0xE5,0xF4,0x10,0xD0,0x05,0xB8,0x11,0xD0,0x15,0x94,0x11,0x8D,0xE5, + 0xF5,0x10,0xD0,0x05,0xB9,0x11,0xD0,0x15,0x90,0x11,0x8D,0xE5,0xF6,0x10,0xD0,0x05, + 0xBA,0x11,0xD0,0x15,0x8C,0x11,0x8D,0xE5,0xF7,0x10,0xD0,0x05,0xBB,0x11,0xD0,0x15, + 0x88,0x11,0x8D,0xE5,0xBC,0x1F,0xD0,0x01,0xB0,0x1C,0xD4,0x11,0x84,0x11,0x8D,0xE5, + 0xBE,0x1F,0xD0,0x01,0xB2,0x1C,0xD4,0x11,0x80,0x11,0x8D,0xE5,0xB0,0x10,0xD4,0x01, + 0xB4,0x1C,0xD4,0x11,0x7C,0x11,0x8D,0xE5,0xB2,0x10,0xD4,0x01,0xB6,0x1C,0xD4,0x11, + 0x78,0x11,0x8D,0xE5,0xB8,0x1F,0xD0,0x01,0xBC,0x1B,0xD4,0x11,0x74,0x11,0x8D,0xE5, + 0xBA,0x0F,0xD0,0x01,0xBE,0x0B,0xD4,0x11,0x70,0x01,0x8D,0xE5,0x00,0x00,0xA0,0xE3, + 0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x24,0x00,0x8D,0xE5,0x20,0x00,0x8D,0xE5, + 0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5,0x14,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5, + 0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x04,0x00,0x8D,0xE5,0x00,0x00,0x8D,0xE5, + 0xB8,0x05,0xC6,0xE1,0x00,0x90,0xA0,0xE1,0xBA,0x05,0xC6,0xE1,0x01,0x5C,0x46,0xE2, + 0xBC,0x05,0xC6,0xE1,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x70,0x00,0x85,0xE2, + 0x49,0xFF,0xFF,0xEB,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x98,0x00,0x85,0xE2, + 0x45,0xFF,0xFF,0xEB,0x00,0x00,0xA0,0xE3,0xB4,0x01,0x8D,0xE5,0x00,0x10,0xA0,0xE1, + 0xB0,0x0C,0xC5,0xE1,0x50,0x20,0xA0,0xE3,0x12,0x0E,0x8D,0xE2,0x3E,0xFF,0xFF,0xEB, + 0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD0,0x00,0x8D,0xE2,0x3A,0xFF,0xFF,0xEB, + 0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x80,0x00,0x8D,0xE2,0x36,0xFF,0xFF,0xEB, + 0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x30,0x00,0x8D,0xE2,0x32,0xFF,0xFF,0xEB, + 0x4C,0x07,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3,0xF8,0x7A,0xDA,0x11, + 0xB6,0x0A,0xDA,0x11,0x07,0x00,0x00,0x1A,0x28,0x07,0x9F,0xE5,0xB6,0x00,0xD0,0xE1, + 0x40,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xF2,0x71,0xD4,0x01,0xF6,0x7D,0xD4,0x11, + 0xB0,0x01,0xD4,0x01,0xB4,0x0D,0xD4,0x11,0x00,0x80,0xA0,0xE3,0x08,0x50,0xA0,0xE1, + 0xA0,0x01,0x8D,0xE5,0x0C,0x07,0x9F,0xE5,0xC0,0x01,0x8D,0xE5,0x0E,0x0C,0x80,0xE2, + 0xBC,0x01,0x8D,0xE5,0x82,0x00,0x00,0xEA,0x00,0x40,0xA0,0xE3,0x7C,0x00,0x00,0xEA, + 0xC0,0x01,0x9D,0xE5,0x0F,0x2A,0xE0,0xE3,0x08,0x11,0x90,0xE7,0x01,0x0A,0xA0,0xE1, + 0x20,0x0A,0xA0,0xE1,0x21,0x18,0x02,0xE0,0x01,0x30,0x40,0xE0,0x00,0x00,0x41,0xE0, + 0x98,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0xD0,0x20,0x8D,0xC2, + 0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0x98,0x11,0x9D,0xE5, + 0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x30,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7, + 0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0x9C,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0, + 0x00,0x00,0x51,0xE3,0x12,0x2E,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0, + 0x05,0x11,0x82,0xC7,0x9C,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3, + 0x80,0x20,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7, + 0xB4,0x11,0x9D,0xE5,0x01,0x00,0x53,0xE1,0xB4,0x31,0x8D,0xC5,0x2C,0x40,0x8D,0xC5, + 0x28,0x50,0x8D,0xC5,0x64,0x00,0x53,0xE3,0xB8,0x15,0xD6,0xC1,0x01,0x10,0x81,0xC2, + 0xB8,0x15,0xC6,0xC1,0x46,0x00,0x50,0xE3,0xBA,0x15,0xD6,0xC1,0x01,0x10,0x81,0xC2, + 0xBA,0x15,0xC6,0xC1,0xE6,0x00,0x53,0xE3,0xBC,0x15,0xD6,0xC1,0x01,0x10,0x81,0xC2, + 0xBC,0x15,0xC6,0xC1,0x0C,0x16,0x9F,0xE5,0xB6,0x10,0xD1,0xE1,0x40,0x00,0x11,0xE3, + 0xB0,0x18,0xDA,0xE1,0x01,0x28,0xE0,0x13,0x81,0x10,0x02,0x10,0x00,0x00,0x53,0xE3, + 0x03,0x28,0xA0,0xC1,0x00,0x20,0xA0,0xD3,0x22,0x28,0xA0,0xC1,0x00,0x00,0x50,0xE3, + 0x00,0x08,0xA0,0xC1,0x00,0x00,0xA0,0xD3,0x20,0x08,0xA0,0xC1,0x01,0x00,0x50,0xE1, + 0x01,0xC0,0x89,0x82,0x01,0x98,0xCC,0x83,0x01,0x00,0x52,0xE1,0x08,0xC0,0x9D,0x85, + 0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x08,0xC0,0x8D,0x85,0x81,0x00,0x50,0xE1, + 0x04,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x04,0xC0,0x8D,0x85, + 0x81,0x00,0x52,0xE1,0x00,0x10,0x9D,0x85,0x01,0x10,0x81,0x82,0x01,0x18,0xC1,0x83, + 0x00,0x10,0x8D,0x85,0x0C,0x10,0x9D,0xE5,0x00,0x00,0x53,0xE3,0x01,0x00,0x80,0xE0, + 0x0C,0x00,0x8D,0xE5,0x00,0x30,0xA0,0xB3,0x01,0x00,0x4B,0xE2,0x00,0x00,0x55,0xE1, + 0x06,0x00,0x00,0x1A,0x00,0x00,0x53,0xE3,0x04,0x00,0x00,0x0A,0x64,0x00,0xA0,0xE3, + 0x93,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0xD4,0xEB,0xFF,0xEB,0x00,0x30,0xA0,0xE1, + 0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1,0xF5,0xF7,0xFF,0xEB,0x58,0x15,0x9F,0xE5, + 0x00,0x00,0x57,0xE3,0x80,0x00,0x81,0xE0,0xB0,0x30,0xC0,0xE1,0x00,0x00,0x67,0xD2, + 0x07,0x00,0xA0,0xC1,0x03,0x00,0x50,0xE1,0xB8,0x11,0x9D,0xB5,0x07,0x00,0x83,0xB0, + 0x01,0x00,0x80,0xB0,0xB8,0x01,0x8D,0xB5,0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1, + 0xBE,0xF7,0xFF,0xEB,0xBC,0x11,0x9D,0xE5,0x20,0x25,0x9F,0xE5,0x08,0x11,0x91,0xE7, + 0x80,0x00,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x80,0x88,0xE2,0x01,0x40,0x84,0xE2, + 0xB0,0x10,0xC0,0xE1,0xAC,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1,0x7F,0xFF,0xFF,0x3A, + 0x01,0x50,0x85,0xE2,0x0B,0x00,0x55,0xE1,0x7A,0xFF,0xFF,0x3A,0x44,0xFA,0xFF,0xEB, + 0xD0,0x74,0x9F,0xE5,0xA4,0x01,0x9D,0xE5,0xBE,0x00,0xC7,0xE1,0xA8,0x01,0x9D,0xE5, + 0x01,0x00,0x10,0xE3,0x0A,0x00,0x00,0x0A,0xAC,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3, + 0x9B,0x00,0x00,0xE0,0x90,0x01,0x01,0xE0,0xB8,0x01,0x9D,0xE5,0xA0,0x21,0x9D,0xE5, + 0x92,0x00,0x00,0xE0,0x12,0xEC,0xFF,0xEB,0xA4,0x11,0x9D,0xE5,0x01,0x00,0x50,0xE1, + 0xBE,0x00,0xC7,0x31,0xAC,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3,0x90,0x01,0x06,0xE0, + 0x00,0x40,0xA0,0xE3,0x4A,0x00,0x00,0xEA,0x88,0x04,0xD7,0xE5,0x04,0x00,0x50,0xE1, + 0x5A,0x04,0xD7,0x05,0x01,0x00,0x50,0x03,0x1E,0x00,0x00,0x0A,0x12,0x0E,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x94,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x06,0x10,0xA0,0xE1, + 0xFF,0xEB,0xFF,0xEB,0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x4A,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1, + 0x80,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x90,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x06,0x10,0xA0,0xE1,0xF2,0xEB,0xFF,0xEB,0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x3D,0xFA,0xFF,0xEB, + 0x00,0x00,0x45,0xE0,0x00,0x08,0xA0,0xE1,0x74,0x11,0x9D,0xE5,0x40,0x08,0xA0,0xE1, + 0x84,0x50,0x87,0xE0,0x21,0x00,0x00,0xEA,0x5B,0x04,0xD7,0xE5,0x64,0x10,0xA0,0xE3, + 0x94,0x21,0x9D,0xE5,0x90,0x01,0x01,0xE0,0x12,0x0E,0x8D,0xE2,0x04,0x01,0x90,0xE7, + 0x92,0x00,0x00,0xE0,0xDE,0xEB,0xFF,0xEB,0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x29,0xFA,0xFF,0xEB, + 0x00,0x50,0xA0,0xE1,0x5B,0x04,0xD7,0xE5,0x64,0x10,0xA0,0xE3,0x90,0x21,0x9D,0xE5, + 0x90,0x01,0x01,0xE0,0x80,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x92,0x00,0x00,0xE0, + 0xCF,0xEB,0xFF,0xEB,0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x1A,0xFA,0xFF,0xEB,0x00,0x00,0x45,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x84,0x50,0x87,0xE0,0x64,0x10,0xA0,0xE3, + 0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x54,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2, + 0xB0,0x07,0xC5,0xE1,0x0B,0x00,0x54,0xE1,0xB2,0xFF,0xFF,0x3A,0x64,0x00,0xA0,0xE3, + 0x9B,0x00,0x00,0xE0,0x00,0x40,0xA0,0xE3,0xB0,0x01,0x8D,0xE5,0x49,0x00,0x00,0xEA, + 0x88,0x04,0xD7,0xE5,0x04,0x00,0x50,0xE1,0x02,0x00,0x00,0x1A,0x5A,0x04,0xD7,0xE5, + 0x02,0x00,0x10,0xE3,0x1E,0x00,0x00,0x1A,0xD0,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7, + 0x8C,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0xB0,0x11,0x9D,0xE5,0xAC,0xEB,0xFF,0xEB, + 0x7C,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x41,0x18,0xA0,0xE1,0xF7,0xF9,0xFF,0xEB,0x00,0x50,0xA0,0xE1,0x30,0x00,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x88,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0xB0,0x11,0x9D,0xE5, + 0x9F,0xEB,0xFF,0xEB,0x78,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xEA,0xF9,0xFF,0xEB,0x00,0x00,0x45,0xE0, + 0x00,0x08,0xA0,0xE1,0x70,0x11,0x9D,0xE5,0x40,0x08,0xA0,0xE1,0x84,0x50,0x87,0xE0, + 0x1F,0x00,0x00,0xEA,0x5B,0x04,0xD7,0xE5,0x64,0x10,0xA0,0xE3,0xD0,0x80,0x8D,0xE2, + 0x90,0x01,0x01,0xE0,0x04,0x01,0x98,0xE7,0x8C,0x21,0x9D,0xE5,0x92,0x00,0x00,0xE0, + 0x8B,0xEB,0xFF,0xEB,0x78,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x41,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x01,0x50,0xA0,0xE1,0xD5,0xF9,0xFF,0xEB, + 0x00,0x60,0xA0,0xE1,0x5B,0x04,0xD7,0xE5,0x64,0x10,0xA0,0xE3,0x88,0x21,0x9D,0xE5, + 0x90,0x01,0x01,0xE0,0x04,0x01,0x98,0xE7,0x92,0x00,0x00,0xE0,0x7C,0xEB,0xFF,0xEB, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x05,0x10,0xA0,0xE1,0xC9,0xF9,0xFF,0xEB, + 0x00,0x00,0x46,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x84,0x50,0x87,0xE0, + 0x64,0x10,0xA0,0xE3,0x91,0x00,0x00,0xE0,0x64,0x10,0xA0,0xE3,0x03,0xEB,0xFF,0xEB, + 0x01,0x40,0x84,0xE2,0xB8,0x09,0xC5,0xE1,0xAC,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1, + 0xB2,0xFF,0xFF,0x3A,0xB4,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x0D,0x00,0x00,0xDA, + 0x2C,0x00,0x9D,0xE5,0x28,0x10,0x9D,0xE5,0x80,0x00,0x87,0xE0,0x81,0x10,0x87,0xE0, + 0xB8,0x09,0xD0,0xE1,0xB0,0x17,0xD1,0xE1,0x00,0x10,0x81,0xE0,0xB4,0x01,0x9D,0xE5, + 0x01,0x00,0x40,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB0,0x0C,0xC7,0xE1, + 0x00,0x00,0xA0,0x43,0xB0,0x0C,0xC7,0x41,0xAC,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE2, + 0x9B,0x00,0x01,0xE0,0x0C,0x00,0x9D,0xE5,0x55,0xEB,0xFF,0xEB,0xB6,0x10,0xD7,0xE1, + 0x08,0x20,0x9D,0xE5,0x40,0x00,0x11,0xE3,0x10,0x00,0x00,0x0A,0x82,0x00,0x59,0xE1, + 0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83, + 0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83, + 0x18,0x00,0x8D,0x85,0x00,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33, + 0x14,0x00,0x8D,0x35,0x14,0x00,0x59,0xE3,0x13,0x00,0x00,0x9A,0x10,0x00,0x00,0xEA, + 0x02,0x00,0x59,0xE1,0x08,0x00,0x59,0x83,0x01,0x20,0xA0,0x83,0x20,0x20,0x8D,0x85, + 0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5, + 0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x18,0x00,0x8D,0x85,0x00,0x00,0x9D,0xE5, + 0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33,0x14,0x00,0x8D,0x35,0x0A,0x00,0x59,0xE3, + 0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x10,0x00,0x8D,0xE5,0xC9,0x00,0xD7,0xE5, + 0x00,0x00,0x50,0xE3,0xCA,0x00,0xD7,0xE5,0x03,0x00,0x00,0x0A,0xFA,0x00,0x50,0xE3, + 0x05,0x00,0x00,0x2A,0x01,0x00,0x80,0xE2,0x02,0x00,0x00,0xEA,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x00,0x0A,0x01,0x00,0x40,0xE2,0xCA,0x00,0xC7,0xE5,0x20,0x00,0x9D,0xE5, + 0x1C,0x20,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x02,0x30,0x80,0xE1,0x14,0x20,0x8D,0xE2, + 0x05,0x00,0x92,0xE8,0x02,0x00,0x00,0xE0,0x00,0x20,0x83,0xE1,0x10,0x00,0x9D,0x15, + 0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1, + 0x00,0x00,0x50,0xE3,0xCA,0x00,0xD7,0x15,0x05,0x00,0x50,0x13,0x02,0x00,0x00,0x8A, + 0x24,0x00,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC4,0x00,0x97,0xE5, + 0x01,0x00,0x80,0xE2,0xC4,0x00,0x87,0xE5,0xC8,0x00,0xD7,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0x40,0x12,0xC8,0x00,0xC7,0x15,0x0C,0x00,0x00,0xEA,0xC8,0x00,0xD7,0xE5, + 0x01,0x00,0x80,0xE2,0xFF,0x00,0x00,0xE2,0xC8,0x00,0xC7,0xE5,0xB4,0x18,0xDA,0xE1, + 0x01,0x00,0x50,0xE1,0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC7,0xE5, + 0xC4,0x00,0x97,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xC4,0x00,0x87,0xC5, + 0xCA,0x00,0xD7,0xE5,0x0A,0x00,0x50,0xE3,0x05,0x00,0x00,0x2A,0xC4,0x00,0x97,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0xA0,0xC3,0xC4,0x00,0x87,0xC5,0x00,0x00,0xA0,0xE3, + 0xC8,0x00,0xC7,0xE5,0x71,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x02,0x10,0x40,0xC8,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0xC7,0x49,0xC5,0x4F,0xC9,0x88,0xB8,0x7D,0xC6,0x4C, + 0x00,0x25,0x49,0x06,0x8D,0xB0,0x00,0xD4,0xA0,0x7C,0x03,0x90,0xC0,0x48,0x40,0x38, + 0x42,0x79,0x06,0x00,0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38, + 0xB3,0x7A,0x00,0x7A,0xFE,0xF7,0x41,0xFA,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7, + 0x31,0xFA,0x31,0x00,0x20,0x39,0x0A,0x7A,0xC0,0x39,0x00,0x06,0x0C,0x91,0x09,0x79, + 0x00,0x0E,0xFE,0xF7,0x2B,0xFA,0x00,0x06,0xBA,0x7D,0xA1,0x7C,0x00,0x0E,0xFE,0xF7, + 0x25,0xFA,0x00,0x06,0xB1,0x4E,0x00,0x0E,0x02,0x90,0x30,0x7B,0x00,0x28,0x02,0xD0, + 0xAF,0x48,0x40,0x89,0x0A,0xE0,0xAB,0x49,0x78,0x8A,0xC9,0x88,0x49,0x06,0x00,0xD4, + 0xE0,0x89,0xAC,0x49,0xC9,0x8A,0x40,0x18,0x00,0x04,0x00,0x0C,0x00,0x27,0x04,0x90, + 0x77,0x61,0x30,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0xB1,0xFA,0x01,0xF0,0x9F,0xFA,0x01,0x20,0x30,0x62,0xFC,0xF7,0xD5,0xFA,0x9D,0x48, + 0x9D,0x4A,0x01,0x00,0xC0,0x31,0x0A,0x91,0xA0,0x31,0x09,0x91,0x05,0x21,0xC9,0x01, + 0xE0,0x3A,0x53,0x18,0x80,0x32,0x07,0xAC,0x0C,0xC4,0x02,0x9A,0xD2,0x1C,0x06,0x92, + 0x4A,0x00,0x84,0x18,0x40,0x18,0x05,0x90,0x0C,0xE1,0x30,0x7A,0x00,0x28,0x04,0xD0, + 0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x8D,0xFA,0xFF,0x20,0x81,0x30,0xFB,0xF7, + 0x8D,0xF8,0x03,0x20,0x01,0xF0,0xC6,0xF9,0x00,0xF0,0x64,0xF9,0x01,0x20,0x40,0x05, + 0xFC,0xF7,0xC0,0xFC,0xFF,0xF7,0xFA,0xFA,0x00,0x20,0xFC,0xF7,0xBB,0xFC,0x85,0x48, + 0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20, + 0x00,0xE0,0x03,0x20,0x01,0xF0,0x8A,0xF8,0xFC,0xF7,0xF0,0xFC,0x82,0x48,0x04,0x99, + 0x80,0x8B,0x41,0x18,0x7B,0x48,0x80,0x89,0x81,0x42,0x10,0xD9,0x09,0x98,0x40,0x78, + 0x00,0x28,0x0C,0xD1,0x77,0x48,0xFF,0x21,0xC0,0x88,0x19,0x31,0x08,0x42,0x06,0xD1, + 0x03,0x98,0x6D,0x1C,0x85,0x42,0x03,0xDD,0xFC,0xF7,0xE0,0xFC,0x00,0xE0,0x00,0x25, + 0x00,0xF0,0x48,0xFE,0x00,0xF0,0xCA,0xFD,0x00,0xF0,0x1E,0xFE,0x0A,0x98,0x41,0x68, + 0x08,0x98,0x40,0x88,0x81,0x42,0x0A,0xDB,0x09,0x98,0x40,0x78,0x00,0x28,0x04,0xD1, + 0x68,0x48,0x46,0x21,0xC0,0x88,0x08,0x42,0x01,0xD0,0x01,0x20,0x70,0x70,0xFC,0xF7, + 0x93,0xFC,0xFD,0xF7,0x47,0xFE,0x00,0x28,0x08,0xD0,0x77,0x61,0x05,0x98,0x80,0x7B, + 0xC8,0x28,0x10,0xD2,0x05,0x99,0x40,0x1C,0x88,0x73,0x0C,0xE0,0x70,0x69,0x40,0x1C, + 0x70,0x61,0x70,0x69,0x01,0x28,0x01,0xD1,0x60,0x48,0x07,0x73,0x70,0x69,0x05,0x28, + 0x01,0xD9,0xFC,0xF7,0x49,0xFA,0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1, + 0x60,0x68,0xFF,0x21,0xFF,0x31,0x88,0x42,0x03,0xDA,0x40,0x1C,0x60,0x60,0x00,0xE0, + 0x67,0x60,0x08,0x99,0x20,0x68,0x49,0x89,0x88,0x42,0x09,0xDD,0x60,0x68,0xFF,0x21, + 0xF5,0x31,0x88,0x42,0x04,0xDD,0x01,0x20,0x70,0x70,0x27,0x60,0x67,0x60,0x02,0xE0, + 0x70,0x78,0x00,0x28,0x02,0xD0,0xFC,0xF7,0x39,0xFA,0x0D,0xE0,0x4C,0x48,0x41,0x68, + 0x09,0x07,0x07,0xD5,0xC1,0x68,0x00,0x29,0x04,0xD0,0xC0,0x68,0x01,0x21,0x49,0x07, + 0xC8,0x63,0x01,0xE0,0x00,0xF0,0x20,0xF9,0xFC,0xF7,0xF6,0xFC,0x70,0x78,0x00,0x28, + 0x0B,0xD0,0x3D,0x48,0x01,0x21,0xE0,0x38,0xC0,0x7F,0x40,0x08,0x01,0xF0,0x52,0xF8, + 0x3A,0x48,0x47,0x70,0x0A,0x98,0x47,0x60,0x5A,0xE0,0x07,0x98,0x00,0x7B,0x00,0x28, + 0x04,0xD0,0x30,0x7B,0x00,0x28,0x01,0xD1,0x00,0xF0,0xC0,0xF8,0x01,0x20,0x40,0x07, + 0xC0,0x6B,0x0B,0x28,0x4C,0xD1,0x07,0x98,0x00,0x7A,0x00,0x28,0x01,0xD0,0xFF,0xF7, + 0x8F,0xF9,0x00,0xF0,0x9B,0xF8,0x03,0x20,0x01,0xF0,0xDE,0xF8,0xF0,0x62,0x03,0x20, + 0x01,0xF0,0x0C,0xF9,0xFF,0x20,0x81,0x30,0xFA,0xF7,0xB8,0xFF,0x2D,0x48,0x00,0x78, + 0x00,0x28,0x2F,0xD1,0xFC,0xF7,0x9E,0xFD,0x00,0x28,0x2B,0xD0,0xB0,0x6A,0x00,0x28, + 0x0B,0x90,0x27,0xD0,0xF0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x26,0x49,0xFA,0xF7, + 0x6F,0xFC,0x0B,0x99,0x08,0x1A,0x32,0x28,0x1C,0xDD,0x01,0xF0,0xB1,0xF9,0x01,0xF0, + 0xB5,0xF9,0xB0,0x79,0x00,0x28,0x0D,0xD0,0x00,0xF0,0x4E,0xF8,0x00,0xF0,0x51,0xF8, + 0x00,0xF0,0x59,0xF8,0x1D,0x4E,0x01,0x20,0x70,0x60,0xFA,0xF7,0x9F,0xFF,0x1C,0x48, + 0x70,0x60,0x03,0xE0,0x1B,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0xA5,0xF9, + 0x18,0x48,0x07,0x70,0x0D,0x4E,0x70,0x69,0x06,0x99,0x88,0x42,0x00,0xD2,0xEC,0xE6, + 0x0C,0x98,0x0C,0x49,0x40,0x78,0xA0,0x39,0x48,0x73,0x08,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x01,0xF0,0x6F,0xF9,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0xE0,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20, + 0xA0,0x7A,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20,0x90,0x08,0x00,0x20, + 0x00,0x40,0x00,0x30,0xAD,0x0B,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22, + 0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60, + 0x70,0x47,0x10,0x20,0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68, + 0x01,0x43,0x91,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43, + 0x41,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B, + 0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x78,0x00,0x00,0x10,0xB5,0xFC,0xF7, + 0x73,0xFB,0xFA,0xF7,0x19,0xFC,0x03,0x20,0x40,0x03,0xFA,0xF7,0x1F,0xFF,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFA,0xF7,0x1F,0xFF,0xFA,0xF7, + 0x15,0xFC,0xFC,0xF7,0x69,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0, + 0xDB,0xFB,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7, + 0x3D,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x16,0x48, + 0x17,0x4E,0x00,0x78,0x00,0x25,0x01,0x90,0x14,0x48,0x00,0x78,0x00,0x90,0x1C,0xE0, + 0x14,0x49,0x68,0x00,0x00,0x24,0x47,0x18,0x60,0x37,0x12,0xE0,0x29,0x00,0x20,0x00, + 0xFD,0xF7,0x26,0xFB,0x0F,0x4B,0x62,0x00,0xD3,0x18,0x98,0x22,0x9A,0x5E,0x10,0x23, + 0xFB,0x5E,0x40,0x00,0x31,0x5E,0xD2,0x18,0x89,0x1A,0x00,0xD5,0x00,0x21,0x64,0x1C, + 0x31,0x52,0x01,0x98,0x84,0x42,0xE9,0xD3,0x6D,0x1C,0x00,0x98,0x85,0x42,0xDF,0xD3, + 0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0xF0,0x05,0x00,0x20,0xF8,0xB5,0x70,0x4F,0x00,0x26,0x78,0x7A, + 0xC0,0x07,0x2B,0xD0,0x6E,0x4C,0x20,0x89,0x00,0x28,0x0E,0xD0,0x6D,0x49,0x88,0x42, + 0x0B,0xD0,0x1E,0x21,0x48,0x43,0x64,0x21,0xFA,0xF7,0x82,0xFB,0x79,0x8A,0x46,0x18, + 0x4B,0x20,0xC0,0x00,0x86,0x42,0x00,0xD9,0x06,0x00,0x67,0x48,0x40,0x7D,0x00,0x28, + 0x14,0xD0,0xA6,0x89,0xAF,0x24,0xA4,0x00,0x31,0x1B,0x08,0x00,0x48,0x43,0xDC,0x21, + 0xFA,0xF7,0x6E,0xFB,0x31,0x00,0xFF,0x39,0xE2,0x39,0xDB,0x29,0x01,0xD8,0x26,0x1A, + 0x04,0xE0,0x5E,0x4A,0xB1,0x18,0xDB,0x29,0x00,0xD2,0x06,0x19,0x01,0x24,0x64,0x07, + 0x25,0x68,0x00,0x2D,0x7E,0xD0,0x5A,0x48,0x00,0x21,0x01,0x70,0x02,0x20,0x00,0xF0, + 0xDD,0xFF,0x58,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x52,0xFB,0x01,0x00,0x02,0x20, + 0x00,0xF0,0xC0,0xFF,0x01,0x2D,0x0B,0xD0,0x02,0x2D,0x08,0xD1,0x60,0x68,0x00,0x02, + 0x00,0x0E,0x01,0x28,0x03,0xD1,0x60,0x68,0x00,0x06,0x00,0xD1,0x00,0xE0,0x6D,0x1C, + 0x78,0x7A,0x00,0x28,0x08,0xD0,0x60,0x68,0x4B,0x49,0x81,0x43,0x04,0xD0,0x61,0x68, + 0x4A,0x48,0x88,0x43,0x00,0xD0,0x6D,0x1C,0xF8,0x79,0x00,0x28,0x04,0xD1,0x48,0x49, + 0x48,0x69,0x0A,0x15,0x10,0x43,0x48,0x61,0x46,0x48,0x01,0x68,0x46,0x48,0xC1,0x61, + 0x02,0x24,0x20,0x00,0x00,0xF0,0x9E,0xFF,0x44,0x48,0xC1,0x68,0x49,0x08,0x49,0x00, + 0xC1,0x60,0x03,0x04,0x35,0x48,0x36,0x4A,0x41,0x7A,0x3F,0x48,0x97,0x89,0x21,0xE0, + 0x42,0x69,0x52,0x06,0x0E,0xD4,0x00,0x29,0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA2,0x00, + 0xD2,0x18,0x12,0x68,0xC2,0x61,0x04,0xE0,0xCA,0x07,0x01,0xD0,0xC6,0x61,0x00,0xE0, + 0xC7,0x61,0x64,0x1C,0x2E,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0,0xFD,0xF7,0x9C,0xFB, + 0x26,0x48,0x01,0x7A,0x00,0x29,0x07,0xD0,0x00,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0x31,0xF8,0x01,0xE0,0xAC,0x42,0xDB,0xD9,0x02,0x20,0x00,0xF0,0x77,0xFF,0x24,0x4D, + 0x28,0x78,0x00,0x28,0x27,0xD1,0xFD,0xF7,0xAD,0xFA,0x00,0x28,0x23,0xD0,0x21,0x48, + 0x0A,0x21,0x00,0x6B,0xFA,0xF7,0xE4,0xFA,0x01,0x00,0x02,0x20,0x00,0xF0,0x52,0xFF, + 0x02,0x20,0x00,0xE0,0x26,0xE0,0x00,0xF0,0x55,0xFF,0x14,0x4C,0x0C,0xE0,0x28,0x78, + 0x00,0x28,0x09,0xD0,0xFD,0xF7,0x70,0xFB,0x20,0x7A,0x00,0x28,0x04,0xD0,0x20,0x6B, + 0x00,0x04,0x00,0x0C,0x01,0xF0,0x06,0xF8,0xFD,0xF7,0x8C,0xFA,0x00,0x28,0xEE,0xD1, + 0x02,0x20,0x00,0xF0,0x4B,0xFF,0x15,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60, + 0x00,0xF0,0x2A,0xF8,0x05,0x48,0xC0,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02, + 0xFA,0xF7,0xEC,0xFD,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF8,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00,0x30,0x0A,0x00,0x20,0x43,0xFD,0xFF,0xFF, + 0xAD,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x4E,0x1D,0x00,0x80,0x4E,0x1D, + 0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02, + 0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0x69,0xFD,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x40,0x18,0x70,0x47,0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4, + 0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00, + 0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A,0x90,0x72,0x90,0x7A, + 0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28, + 0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21,0x0C,0x30,0xFE,0xF7,0x53,0xFF,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25,0x08,0x4C,0xAD,0x01,0x08,0xE0,0x46,0x18, + 0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19,0x40,0x1C,0xFE,0x60, + 0x96,0x7A,0x86,0x42,0xF3,0xD8,0xEA,0xE7,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x70,0xB5,0x1E,0x49,0x1C,0x4C,0x0D,0x00,0x20,0x78,0xA1,0x22,0xFF,0x35,0x92,0x00, + 0xBF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0,0x5A,0x22,0x21,0x1D,0x28,0x00,0xFE,0xF7, + 0x0D,0xFF,0x17,0x49,0x09,0x22,0x30,0x00,0xFE,0xF7,0x08,0xFF,0x20,0x78,0x60,0x70, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21,0x30,0x00,0xFE,0xF7,0x1A,0xFF, + 0x5A,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7,0x15,0xFF,0x0D,0x48,0x5A,0x22,0x00,0x21, + 0x63,0x38,0xFE,0xF7,0x0F,0xFF,0x0A,0x48,0x09,0x22,0x00,0x21,0x09,0x38,0xFE,0xF7, + 0x09,0xFF,0x00,0x20,0x05,0x49,0x60,0x70,0xA0,0x70,0xCA,0x88,0x23,0x23,0x9A,0x43, + 0xCA,0x80,0x04,0x49,0x88,0x75,0xDB,0xE7,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x6B,0x08,0x00,0x20,0x30,0x0A,0x00,0x20,0xF3,0xB5,0x93,0x48,0x91,0xB0,0x40,0x7E, + 0x02,0x90,0x92,0x48,0x00,0x78,0x00,0x28,0x91,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01, + 0x40,0x18,0x01,0x8A,0x8F,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91, + 0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91, + 0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30, + 0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B, + 0x05,0x91,0x7D,0x49,0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92, + 0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x78,0x4C, + 0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98, + 0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0, + 0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0, + 0x0B,0xFF,0x20,0x8C,0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08, + 0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A, + 0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90, + 0x61,0x48,0x01,0x78,0x61,0x48,0x00,0x78,0x08,0x90,0x61,0x48,0x80,0x7E,0xC2,0x07, + 0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E,0x09,0x06,0x09,0x0E,0x04,0xE0,0x08,0x98, + 0x40,0x1E,0x00,0x06,0x00,0x0E,0x08,0x90,0x20,0x00,0xFA,0xF7,0xA7,0xF8,0x0A,0x99, + 0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xFA,0xF7,0x9F,0xF8,0x09,0x99, + 0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97, + 0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB, + 0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22, + 0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43, + 0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A, + 0xFA,0xF7,0x74,0xF8,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0, + 0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7, + 0x65,0xF8,0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18, + 0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98, + 0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42, + 0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43, + 0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xFA,0xF7,0x37,0xF8,0x86,0x19, + 0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00, + 0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21,0xFA,0xF7,0x28,0xF8,0x07,0x99,0x89,0x07, + 0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99, + 0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A, + 0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A, + 0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x3C,0xFE, + 0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0x04,0x0B,0x00,0x20, + 0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0xFE,0xB5,0x66,0x4D,0x64,0x48,0x00,0x26,0x29,0x00,0xFF,0x31, + 0x00,0x96,0x42,0x78,0x61,0x31,0x08,0x78,0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0, + 0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7, + 0xCF,0xFA,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42, + 0x14,0xD3,0xA9,0x19,0x13,0x22,0x00,0x90,0xFF,0x20,0x92,0x01,0x65,0x30,0x89,0x18, + 0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x70,0x76,0x1C,0x65,0x32,0x03,0x20,0x01,0x23, + 0x69,0x46,0x00,0xF0,0x3D,0xFA,0x64,0x1C,0x09,0x2C,0xDA,0xDB,0x8F,0xE0,0x49,0x78, + 0x00,0x29,0x01,0xD1,0x00,0x28,0xF9,0xD0,0x15,0x20,0x40,0x01,0x00,0x24,0x2E,0x18, + 0x13,0x27,0xBF,0x01,0x28,0x19,0xC0,0x19,0x40,0x78,0x00,0x28,0x3F,0xD0,0x13,0x21, + 0x28,0x18,0x49,0x01,0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0,0x32,0x7B,0x00,0x2A, + 0x14,0xD0,0x05,0x21,0xC9,0x01,0x40,0x18,0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xBF,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0x0E,0xFA,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x7A,0xFA,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x65,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0xF5,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x78,0x40,0x1C, + 0x4A,0x70,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24, + 0x23,0x49,0x13,0x22,0x08,0x19,0x52,0x01,0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92, + 0x00,0x28,0x31,0xD0,0x32,0x7B,0x00,0x2A,0x2E,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x4B,0xFA,0x00,0x28,0x24,0xD0,0x19,0x48, + 0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x21,0xD3,0x15,0x4A,0x00,0x20,0x11,0x18, + 0xC9,0x19,0x49,0x78,0xA1,0x42,0x0B,0xD0,0x00,0x29,0x06,0xD1,0xFF,0x21,0x65,0x31, + 0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x70,0x05,0xE0,0x40,0x1C,0x08,0x28,0xEE,0xDB, + 0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0x65,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0xAC,0xF9,0x64,0x1C,0x09,0x2C,0xC0,0xDB,0x00,0x98, + 0x00,0xF0,0x98,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xFF,0xB5,0x00,0x20,0x84,0x46,0x52,0x48, + 0x36,0x26,0x86,0x5F,0x51,0x48,0x00,0x90,0x51,0x48,0xC4,0x78,0x03,0x94,0x07,0x79, + 0x4D,0x48,0x80,0x30,0x82,0x7D,0x86,0x46,0x4E,0x48,0x81,0x7E,0xC8,0x07,0x08,0xD0, + 0x88,0x07,0x03,0xD5,0x64,0x1E,0x24,0x06,0x24,0x0E,0x02,0xE0,0x7F,0x1E,0x3F,0x06, + 0x3F,0x0E,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42, + 0x1D,0xD3,0xA5,0x1A,0x6D,0x1E,0x85,0x42,0x19,0xD3,0xBD,0x1A,0x6D,0x1E,0x8D,0x42, + 0x01,0xD2,0x90,0x42,0x13,0xD3,0x8D,0x42,0x03,0xD2,0xA5,0x1A,0x6D,0x1E,0x85,0x42, + 0x0D,0xD3,0x03,0x9B,0x00,0x9D,0x4B,0x43,0x1B,0x18,0x9B,0x00,0xEB,0x58,0x1B,0x01, + 0x1B,0x0D,0x63,0x45,0x00,0xDD,0x9C,0x46,0xB3,0x42,0x00,0xDA,0x1E,0x00,0x40,0x1C, + 0xA0,0x42,0xDA,0xD3,0x49,0x1C,0xB9,0x42,0xD5,0xD3,0x70,0x46,0xC0,0x8B,0x2E,0x4C, + 0xC0,0x18,0x02,0x04,0xA0,0x34,0xE0,0x88,0x12,0x14,0x18,0x1A,0x03,0x04,0x2E,0x48, + 0x1B,0x14,0xC0,0x88,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x81,0x18,0x0A,0x04, + 0x18,0x1A,0x12,0x14,0x03,0x04,0x1B,0x14,0x26,0x48,0x80,0x30,0xC1,0x6A,0x94,0x45, + 0x05,0xDD,0x72,0x46,0x52,0x8B,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29, + 0x01,0xDD,0x49,0x1E,0xC1,0x62,0x1F,0x49,0x80,0x31,0x09,0x6B,0x9E,0x42,0x04,0xDA, + 0x62,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E, + 0x01,0x63,0x73,0x46,0x9B,0x8B,0xC5,0x6A,0x01,0x22,0x11,0x00,0x9D,0x42,0x00,0xDC, + 0x00,0x21,0xA3,0x88,0x00,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46, + 0x18,0x71,0x59,0x71,0x00,0x29,0x9A,0x71,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20, + 0x6B,0x46,0x11,0x43,0xD8,0x71,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46, + 0x18,0x72,0x70,0x46,0x00,0x7B,0x01,0xA9,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20, + 0x04,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40, + 0xF8,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xF8,0xB5,0x22,0x48, + 0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D,0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F, + 0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29,0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69, + 0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60, + 0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0,0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69, + 0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60, + 0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00,0xF9,0xF7, + 0x17,0xFF,0xB0,0x62,0x30,0x7B,0x00,0x28,0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48, + 0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00,0xF9,0xF7,0x08,0xFF, + 0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00,0xF8,0x0A,0x00,0x20,0x80,0x79,0x00,0x00, + 0x81,0x11,0x01,0x00,0x10,0x00,0x10,0x00,0x0E,0x48,0x0F,0x4A,0x43,0x78,0x0F,0x49, + 0xD0,0x1D,0xC9,0x88,0xFF,0x32,0xF9,0x30,0xC1,0x32,0x02,0x2B,0x04,0xD9,0x12,0x6A, + 0x49,0x06,0x0C,0xD4,0xC2,0x69,0x0A,0xE0,0x02,0x2B,0x04,0xD1,0xD2,0x69,0x49,0x06, + 0x05,0xD4,0x82,0x69,0x03,0xE0,0x92,0x69,0x49,0x06,0x00,0xD4,0x42,0x69,0x04,0x48, + 0x42,0x62,0x70,0x47,0x50,0x07,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xC0,0x90,0x00,0x40,0x0E,0x48,0x10,0xB4,0xC0,0x88,0x0F,0x4A,0x0F,0x49,0x44,0x06, + 0x0C,0x48,0x0F,0x4B,0x07,0xD5,0x0F,0x4C,0x04,0x61,0x42,0x61,0x81,0x61,0xC3,0x61, + 0x01,0x62,0x0D,0x4A,0x06,0xE0,0x0D,0x4C,0x04,0x61,0x42,0x61,0x81,0x61,0xC3,0x61, + 0x01,0x62,0x0B,0x4A,0x42,0x62,0x81,0x62,0xC3,0x62,0x10,0xBC,0x70,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x40,0xA1,0x00,0x40,0x5A,0x00,0x01,0x00,0x00,0x80,0x00,0x00, + 0x32,0x40,0x00,0x00,0x00,0x00,0x01,0x03,0x5A,0xC0,0x00,0x00,0x00,0x80,0x00,0x03, + 0x5A,0xD0,0x00,0x00,0x70,0xB5,0x01,0x25,0x6D,0x03,0x28,0x00,0xFA,0xF7,0xD6,0xF9, + 0x16,0x48,0x04,0x68,0x28,0x00,0xFA,0xF7,0xC9,0xF9,0x15,0x4D,0xE2,0x06,0xD2,0x0E, + 0xE0,0x04,0x14,0x49,0xC0,0x0E,0x2A,0x71,0xE8,0x70,0x0B,0x7D,0x12,0x48,0x83,0x76, + 0x4B,0x7D,0xC3,0x76,0x83,0x7E,0x11,0x48,0xDC,0x07,0x0A,0xD0,0x9B,0x07,0x04,0xD5, + 0xEA,0x78,0x52,0x1E,0x02,0x72,0x00,0x22,0x02,0xE0,0x52,0x1E,0x02,0x72,0x01,0x22, + 0x6A,0x71,0x8A,0x7D,0x42,0x72,0xCA,0x7D,0x82,0x72,0x0A,0x7E,0xC2,0x72,0x4A,0x7E, + 0x02,0x73,0x89,0x7E,0x41,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x90,0x00,0x40, + 0xF8,0x0A,0x00,0x20,0x00,0x78,0x00,0x00,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20, + 0xF8,0xB5,0x05,0x00,0x0E,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0xFA,0xF7,0x92,0xFE, + 0x00,0x28,0x05,0xD0,0x30,0x68,0x40,0x1E,0x30,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x2D,0x48,0x80,0x7E,0xC0,0x07,0x26,0xD0,0xE0,0x79,0x05,0x28,0x21,0xD0,0x09,0x28, + 0x21,0xD1,0x2A,0x49,0x6D,0x08,0x6D,0x00,0x23,0x78,0x01,0x20,0x8C,0x46,0x13,0xE0, + 0x0A,0x22,0x01,0x00,0x51,0x43,0x26,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32,0xA1,0x32, + 0x97,0x7F,0xBB,0x42,0x07,0xD1,0xFF,0x31,0xC1,0x31,0x0F,0x88,0x67,0x80,0xD2,0x7F, + 0x62,0x70,0x49,0x88,0xA1,0x80,0x40,0x1C,0x61,0x46,0x49,0x78,0x81,0x42,0xE7,0xDA, + 0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x20,0xA9,0x07,0x80,0x06,0x81,0x43,0x20,0x78, + 0x3F,0x22,0x92,0x02,0x00,0x07,0x80,0x08,0x01,0x43,0x16,0x48,0x01,0x40,0x60,0x88, + 0x80,0x05,0x80,0x09,0x01,0x43,0x60,0x78,0x91,0x43,0x80,0x06,0x00,0x0C,0x01,0x43, + 0x08,0x04,0x80,0x0E,0x0A,0x28,0x09,0xD2,0x40,0x1C,0x0A,0x23,0x58,0x43,0x3F,0x28, + 0x00,0xDD,0x3F,0x20,0x80,0x06,0x91,0x43,0x00,0x0C,0x01,0x43,0x88,0x0A,0xA1,0x88, + 0x80,0x02,0x01,0x22,0x89,0x05,0x89,0x0D,0x08,0x43,0x31,0x68,0x52,0x07,0x89,0x00, + 0x89,0x18,0x48,0x60,0xA1,0xE7,0x00,0x00,0x30,0x0A,0x00,0x20,0x50,0x07,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28, + 0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28, + 0x08,0xD1,0x4A,0x72,0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28, + 0x06,0xD1,0x0B,0x73,0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7, + 0x0A,0x73,0xF7,0xE7,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00,0xF8,0xB5,0x06,0x9F, + 0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7, + 0xE5,0xFC,0x38,0x80,0x21,0x00,0x30,0x00,0xF9,0xF7,0xE0,0xFC,0x28,0x80,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42, + 0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB, + 0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91, + 0xF9,0xF7,0xC4,0xFC,0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43, + 0xF9,0xF7,0xBC,0xFC,0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79, + 0x00,0x25,0x22,0x07,0x93,0x08,0xCA,0x79,0x52,0x07,0x0B,0xD5,0x10,0x4E,0xB2,0x89, + 0x00,0x2A,0x07,0xD0,0x9B,0x0A,0x97,0x05,0x9B,0x02,0xBF,0x0D,0x3B,0x43,0x64,0x00, + 0xA4,0x19,0xE2,0x81,0x3F,0x22,0x92,0x02,0x93,0x43,0xCA,0x79,0x80,0x00,0x92,0x06, + 0x12,0x0C,0x13,0x43,0x01,0x22,0x52,0x07,0x80,0x18,0x43,0x60,0xC8,0x79,0xC0,0x06, + 0x80,0x0F,0x03,0xD0,0x03,0x48,0x01,0x21,0xC1,0x75,0x05,0x76,0xF0,0xBC,0x70,0x47, + 0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4D,0x0C,0x4C,0x2D,0x78, + 0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18, + 0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B, + 0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x10,0xB4,0x05,0x4C,0x03,0x4B,0x24,0x78, + 0x60,0x43,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78,0x58,0x43,0x40,0x18, + 0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20, + 0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02, + 0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x15,0x4A,0x15,0x4B,0x52,0x7D,0x13,0x4F,0x00,0x21, + 0x16,0x02,0x16,0x43,0x1A,0x78,0x10,0x4D,0x42,0x43,0x20,0x3F,0x12,0xE0,0xBB,0x7D, + 0x8B,0x42,0x0D,0xD0,0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0, + 0x7B,0x7E,0x8B,0x42,0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52, + 0x52,0x1C,0x49,0x1C,0x06,0x4B,0x04,0x00,0x1B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42, + 0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x14,0x4A,0x13,0x4B,0x52,0x7D,0x00,0x21,0x11,0x4C, + 0x15,0x02,0x15,0x43,0x11,0x4E,0x20,0x3B,0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0, + 0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42, + 0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52,0x32,0x78,0x80,0x18, + 0x49,0x1C,0x07,0x4A,0x37,0x78,0x12,0x78,0x7A,0x43,0x82,0x42,0xE5,0xD8,0xF0,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1, + 0x80,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xF8,0xB5,0x03,0x00, + 0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31, + 0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68,0x00,0xF0,0x0C,0xFA, + 0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62,0x50,0x6B,0x60,0x62, + 0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x26,0x62, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7,0x89,0x69,0x21,0x62, + 0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40,0x00,0x78,0x00,0x00, + 0x07,0x4A,0x10,0xB5,0xD1,0x88,0x40,0x23,0x00,0x28,0x01,0xD0,0x19,0x43,0x00,0xE0, + 0x99,0x43,0xD1,0x80,0xFF,0xF7,0x12,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xFE,0xB5,0x41,0x4C,0x05,0x00,0x27,0x6A,0x0E,0x00,0x60,0x6A, + 0x02,0x90,0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x9E,0xFF, + 0x3B,0x48,0x20,0x62,0x23,0x20,0x60,0x62,0x07,0x20,0x40,0x02,0x60,0x63,0x02,0x20, + 0xE0,0x62,0x00,0x20,0xFB,0xF7,0xB6,0xFB,0x36,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0, + 0xFE,0xF7,0x36,0xF9,0xFB,0xF7,0xFA,0xFB,0x2C,0x00,0x46,0xE0,0x68,0x1E,0x84,0x42, + 0x01,0xD1,0xFB,0xF7,0x1D,0xFC,0xFB,0xF7,0xBF,0xFB,0xFB,0xF7,0x6D,0xFC,0x00,0x2E, + 0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x23,0xFC,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7,0x18,0xFC, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21, + 0xF9,0xF7,0x0E,0xFC,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0, + 0x05,0x21,0x28,0x00,0xF9,0xF7,0x04,0xFC,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7,0xA5,0xF9,0x0C,0xE0, + 0x68,0x00,0x03,0x21,0xF9,0xF7,0xF4,0xFB,0xA0,0x42,0xDB,0xD9,0x03,0x21,0x28,0x00, + 0xF9,0xF7,0xEE,0xFB,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2,0x0E,0x48, + 0x44,0x88,0x03,0xE0,0xFB,0xF7,0x78,0xFB,0xFB,0xF7,0x26,0xFC,0x64,0x1E,0xF9,0xD2, + 0xFB,0xF7,0x9C,0xFB,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63, + 0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40, + 0x02,0x03,0x00,0x00,0x80,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0x30,0xB4,0x0D,0x4D, + 0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C, + 0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A, + 0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47, + 0xAD,0x0B,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60, + 0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32, + 0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48, + 0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22, + 0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00, + 0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0, + 0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7, + 0x10,0x60,0x70,0x47,0x00,0x78,0x00,0x00,0xF8,0xB5,0x17,0x4B,0x00,0x24,0x98,0x7A, + 0x00,0x28,0x25,0xD0,0x00,0x20,0x13,0x26,0x14,0x4D,0xB6,0x01,0x12,0xE0,0x81,0x00, + 0x49,0x19,0x89,0x19,0xCA,0x68,0x97,0x0F,0xFF,0x07,0x0A,0xD0,0x92,0x00,0x01,0x27, + 0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C,0xCA,0x60,0xA1,0x00,0xBF,0x08,0xC9,0x19, + 0x4A,0x60,0x40,0x1C,0x99,0x7A,0x81,0x42,0xE9,0xDC,0x07,0x48,0x09,0x22,0x00,0x21, + 0x40,0x1C,0xFE,0xF7,0x17,0xF8,0x20,0x00,0xFF,0xF7,0xB4,0xFF,0xFC,0xF7,0xC2,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C,0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7, + 0x27,0xFB,0x05,0x4A,0x05,0x49,0x20,0x00,0x00,0x23,0xF9,0xF7,0x29,0xFB,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20, + 0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00, + 0xF9,0xF7,0x0E,0xFB,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23,0xF9,0xF7,0x10,0xFB, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x75,0x00,0x00,0x02,0x4B,0x58,0x60, + 0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5, + 0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xAC,0x0B,0x00,0x20, + 0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07, + 0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60,0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68, + 0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68, + 0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60, + 0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60, + 0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5, + 0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF9,0xF7,0xA3,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00, + 0x89,0x08,0x49,0x1E,0xC9,0x04,0x01,0x22,0xC9,0x08,0xD2,0x07,0x89,0x18,0x40,0x04, + 0x40,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B, + 0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x30,0x0B,0x30,0x01,0x04,0x03,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xC0,0x0F,0x00,0x7F,0xC0,0x0F,0x01,0x7F,0xC1,0x0F,0x02,0x3F,0xC3,0x0F,0x03, + 0xBF,0xC3,0x0F,0x04,0x9F,0xC3,0x0F,0x05,0xDF,0x83,0x0F,0x06,0xCF,0x83,0x0F,0x07, + 0xEF,0x03,0x0F,0x08,0xE7,0x43,0x0F,0x09,0xF7,0x43,0x0E,0x0A,0xF3,0xC3,0x0E,0x0B, + 0xFB,0xC3,0x0C,0x4C,0xF9,0xC3,0x0D,0x0D,0xFD,0xC3,0x09,0x0E,0xFC,0xC3,0x0B,0x0F, + 0xFE,0xC3,0x03,0x10,0xFE,0xC3,0x07,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, + 0x00,0x02,0xA0,0x0A,0x00,0x0C,0x90,0x0C,0x00,0x03,0xB0,0x0E,0x00,0x18,0x80,0x10, + 0x80,0x01,0xC0,0x12,0x00,0x30,0x70,0x1C,0xC0,0x00,0xD0,0x1E,0x00,0x60,0x60,0x20, + 0x60,0x00,0xE0,0x22,0x00,0xC0,0x50,0x00,0x30,0x00,0xF0,0x00,0x08,0x80,0x40,0x00, + 0x10,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xE0,0xC3,0x03,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x25,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x25,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x25,0x20, + 0x1D,0x1E,0x20,0x20,0x20,0x1F,0x1D,0x1C,0x1E,0x20,0x1F,0x20,0x20,0x20,0x20,0x1D, + 0x23,0x1E,0x1E,0x1E,0x20,0x20,0x20,0x1F,0x1D,0x1E,0x1E,0x20,0x21,0x22,0x22,0x22, + 0x21,0x22,0x25,0x23,0x20,0x23,0x25,0x25,0x25,0x24,0x22,0x1E,0x55,0x55,0x30,0x55, + 0x55,0x55,0x30,0x55,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0x03,0x00,0x07,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x06,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xF0,0x00,0x40,0x01,0xE8,0x03,0x00,0x00,0x74,0x27,0x00,0x00,0x3C,0x28,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x00,0x5A,0x54,0x0B,0xF0,0x0A,0x00,0x00,0x04,0xC8,0x3D,0x3D, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6A,0x00,0x68,0x00,0x01,0x00,0x01,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x00,0x02,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0xE6,0x00,0x1E,0x00,0x23,0x00, + 0x50,0x00,0xB4,0x00,0x50,0x00,0x3C,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x02,0x03,0x00,0x00, + 0x02,0x03,0x00,0x00,0x02,0x03,0x00,0x00,0x02,0x03,0x00,0x00,0x02,0x03,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x1D,0x39,0xC8,0x00, + 0x14,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x3C,0x00,0x1E,0x00,0x46,0x00,0x14,0x00, + 0x32,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0xD2,0x00,0xD2,0x00,0xD2,0x00, + 0x90,0x01,0x00,0x00,0x1E,0x0A,0x50,0x00,0x1E,0x0A,0x50,0x00,0x1E,0x0A,0x50,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x32,0x32,0x96,0x32,0x08,0x64, + 0x96,0x64,0x64,0x00,0x00,0x00,0x90,0x01,0x0F,0x00,0x28,0x00,0x96,0x87,0x0B,0x46, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x8C,0x00,0x46,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x64,0x00,0x0C,0x03,0x02,0x02,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x41,0x62,0x03,0x00, + 0x0E,0x0E,0x88,0x00,0x20,0x3F,0x20,0x3F,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x00, + 0x99,0x39,0xDC,0x00,0x1E,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x32,0x00,0x1E,0x00, + 0x3C,0x00,0x14,0x00,0x3C,0x00,0x14,0x00,0x01,0x00,0x0A,0x02,0x46,0x00,0xE6,0x00, + 0xE6,0x00,0xE6,0x00,0x90,0x01,0x00,0x00,0x1E,0x0A,0x50,0x00,0x1E,0x0A,0x50,0x00, + 0x1E,0x0A,0x50,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x32,0x32, + 0x96,0x32,0x08,0x64,0x96,0x64,0x64,0x00,0x00,0x00,0x58,0x02,0x1E,0x00,0x28,0x00, + 0x96,0x87,0x0A,0x6E,0x00,0x05,0x04,0x0A,0x02,0x06,0x96,0x00,0x46,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x78,0x00,0x05,0x04,0x02,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00, + 0x41,0x62,0x03,0x00,0x08,0x08,0x88,0x00,0x20,0x3F,0x20,0x3F,0x00,0x00,0x00,0x00, + 0x1E,0x00,0x1E,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0A,0x00,0x00,0x00,0x00,0x00, + 0x55,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x96,0x00,0xC8,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x1E,0x00,0x5A,0x00,0x28,0x00,0x46,0x00,0x23,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x4B,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0D,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x03,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x0F,0xC8,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x41,0x62,0x03,0x00, + 0x10,0x00,0x10,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x0E,0x0E,0x88,0x00, + 0x20,0x3F,0x20,0x3F,0x2E,0x14,0x46,0x00,0x19,0x19,0x1E,0x0A,0x00,0x00,0xAC,0x0D, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x08,0x20, + 0x51,0x30,0x10,0x00,0x1C,0x90,0x01,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x0F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x38,0x30,0x08,0x00,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30,0x12,0x14,0x00,0x00,0x1C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x3C,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x80,0x00,0x00,0x3C,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00, + 0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00, + 0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00, + 0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00, + 0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00,0x4F,0x30,0x1F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x0D,0x00,0xA0,0xE1,0x10,0xD0,0x9F,0xE5,0x01,0x40,0x2D,0xE9,0x91,0x01,0x00,0xEB, + 0x01,0x40,0xBD,0xE8,0x00,0xD0,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0xF0,0x0F,0x00,0x20, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0x10,0xB4,0xFE,0x48, + 0xFE,0x4C,0xFF,0x49,0x20,0x60,0xFD,0x48,0x40,0x38,0x81,0x62,0xFD,0x49,0x81,0x61, + 0x00,0x20,0x81,0x00,0x0A,0x19,0x11,0x6A,0x40,0x1C,0x8B,0x00,0xC9,0x01,0xDB,0x0E, + 0xC9,0x0E,0x49,0x06,0x1B,0x05,0x19,0x43,0x14,0x28,0x11,0x62,0xF1,0xD3,0xF3,0x48, + 0xF5,0x49,0x40,0x30,0x01,0x63,0xF4,0x49,0x08,0x31,0x41,0x63,0xF3,0x49,0x08,0x69, + 0x40,0x08,0x40,0x00,0x08,0x61,0xF1,0x48,0x40,0x30,0x01,0x68,0xF0,0x49,0x01,0x60, + 0xF0,0x48,0xF1,0x49,0xC8,0x60,0x10,0xBC,0x70,0x47,0xFC,0xB5,0xEF,0x4C,0x02,0x00, + 0x30,0x34,0x18,0xCC,0x00,0x20,0x00,0x94,0xED,0x4C,0x24,0x7D,0xE4,0x07,0x2D,0xD0, + 0xEC,0x4C,0x25,0x79,0xE6,0x78,0xEA,0x4C,0xAE,0x46,0xA5,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xE5,0x7D,0x01,0x95,0x25,0x7E,0x67,0x7E,0xA4,0x7E,0x10,0xD0,0xB2,0x42, + 0x1C,0xD1,0x8C,0x45,0x08,0xD0,0x01,0x9A,0x8A,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8C,0x42,0x00,0xD1,0x00,0x98,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0xB1,0x42,0x0B,0xD1,0x94,0x45,0xF7,0xD0,0x01,0x99,0x91,0x42,0xF4,0xD0,0x95,0x42, + 0xF2,0xD0,0x97,0x42,0xF0,0xD0,0x94,0x42,0xEE,0xD0,0xEE,0xE7,0x18,0x00,0xEC,0xE7, + 0x30,0xB4,0xD4,0x4B,0xD4,0x4C,0x5B,0x78,0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A, + 0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43, + 0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52, + 0x00,0x20,0x30,0xBC,0x70,0x47,0xF3,0xB5,0xC8,0x48,0x82,0xB0,0x01,0x90,0x00,0x20, + 0x00,0x90,0xBE,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0xC1,0x4F,0xBB,0x48, + 0xC0,0x68,0xC0,0x07,0xFB,0xD0,0x00,0x24,0x26,0x00,0x25,0xE0,0x00,0x25,0x1F,0xE0, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0x91,0xFF,0x00,0x28,0x17,0xD0,0x79,0x78,0x01,0x9A, + 0x71,0x43,0x49,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x02,0x99, + 0x00,0x29,0x02,0xD0,0x00,0x28,0x09,0xDA,0x01,0xE0,0x00,0x28,0x06,0xDD,0x03,0x9A, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0xB4,0xFF,0x40,0x1C,0x00,0xD1,0x64,0x1C,0x6D,0x1C, + 0x78,0x78,0x85,0x42,0xDC,0xD3,0x76,0x1C,0xB8,0x78,0x86,0x42,0xD6,0xD3,0xB8,0x78, + 0x79,0x78,0x48,0x43,0xA0,0x42,0x0A,0xD0,0x00,0x98,0x41,0x1C,0x00,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0x03,0xD8,0x9D,0x48,0xC1,0x68,0xC1,0x60,0xBF,0xE7,0xFF,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0xB4,0x00,0x21,0x9F,0x4C,0x9D,0x4B,0x9D,0x4E,0x1E,0x25, + 0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E, + 0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0xA5,0x52,0x72,0x78,0x80,0x18,0x49,0x1C,0xB2,0x78,0x77,0x78,0x7A,0x43, + 0x82,0x42,0xE6,0xD8,0xF0,0xBC,0x70,0x47,0xF0,0xB4,0x8E,0x4B,0x00,0x21,0x5A,0x78, + 0x1E,0x26,0x8D,0x4D,0x42,0x43,0x8A,0x4F,0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0, + 0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42, + 0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C, + 0x80,0x4B,0x04,0x00,0x5B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42,0xE5,0xD8,0xD9,0xE7, + 0x02,0x04,0x7D,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3, + 0x70,0x47,0xF1,0xB5,0x77,0x4C,0x75,0x4D,0x21,0x78,0x78,0x4F,0xA8,0x6B,0x00,0x29, + 0x82,0xB0,0x00,0xD0,0x00,0x0C,0x00,0x06,0x00,0x0E,0x01,0x02,0x01,0x43,0x08,0x04, + 0x00,0x0C,0xFF,0xF7,0xE5,0xFF,0x6E,0x48,0x00,0x7D,0xC0,0x07,0x08,0xD0,0xE0,0x78, + 0x00,0x28,0x20,0x79,0x02,0xD0,0xFF,0xF7,0xB7,0xFF,0x01,0xE0,0xFF,0xF7,0x92,0xFF, + 0x62,0x49,0x00,0x20,0x80,0x31,0xC8,0x62,0x66,0x49,0xE8,0x6B,0x09,0x78,0x00,0x29, + 0x08,0xD1,0x61,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x07,0x12,0x09,0x12,0x01, + 0x00,0x0F,0x07,0xE0,0x5C,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x03,0x12,0x09, + 0x12,0x01,0x00,0x0F,0x02,0x43,0x4A,0x60,0x03,0x24,0x26,0x1F,0x01,0xE0,0x03,0x2C, + 0x02,0xD1,0x01,0x25,0xED,0x43,0x09,0xE0,0x02,0x2C,0x01,0xD1,0x01,0x25,0x05,0xE0, + 0x01,0x2C,0x01,0xD1,0x35,0x00,0x01,0xE0,0x00,0x2C,0xF7,0xD0,0xE0,0x07,0xC0,0x0F, + 0x29,0x00,0xFF,0xF7,0x10,0xFF,0x64,0x1E,0xE9,0xD5,0x4E,0x48,0x4D,0x4D,0x00,0x78, + 0x0C,0x35,0x00,0x28,0x2D,0xD1,0x45,0x4A,0x09,0x21,0x01,0x23,0xD0,0x68,0x18,0x43, + 0xD0,0x60,0xD0,0x68,0xC0,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x00,0x26,0x17,0xE0, + 0x00,0x24,0x10,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x9F,0xFE,0x00,0x28,0x09,0xD0, + 0x40,0x48,0x40,0x78,0x70,0x43,0x00,0x19,0x81,0x00,0x79,0x58,0x09,0x05,0x09,0x0D, + 0x40,0x00,0x29,0x52,0x64,0x1C,0x3B,0x48,0x40,0x78,0x84,0x42,0xEA,0xD3,0x76,0x1C, + 0x38,0x48,0x81,0x78,0x8E,0x42,0xE3,0xD3,0x01,0x78,0x00,0x29,0x01,0xD1,0x81,0x68, + 0x03,0xE0,0x34,0x48,0x80,0x68,0x01,0x0C,0x09,0x04,0x2F,0x48,0x41,0x63,0x2B,0x48, + 0x09,0x21,0x01,0x23,0xC2,0x68,0x1A,0x43,0xC2,0x60,0xC2,0x68,0xD2,0x07,0xFC,0xD0, + 0x49,0x1E,0xF7,0xD2,0x2E,0x48,0x00,0x26,0x01,0x90,0x2E,0x48,0x00,0x90,0x79,0xE0, + 0x00,0x24,0x72,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x67,0xFE,0x00,0x28,0x6B,0xD0, + 0x24,0x49,0x0A,0x78,0x00,0x2A,0x1A,0xD1,0x49,0x78,0x71,0x43,0x0B,0x19,0x59,0x00, + 0x9B,0x00,0xFB,0x58,0x6A,0x5A,0x1B,0x05,0x1B,0x0D,0x9A,0x42,0x01,0xD8,0x00,0x20, + 0x0B,0xE0,0x82,0x42,0x04,0xD9,0x12,0x1A,0x12,0x04,0xD2,0x0C,0x80,0x18,0x03,0xE0, + 0x82,0x1A,0x12,0x04,0xD2,0x0C,0x80,0x1A,0xC0,0x1A,0x68,0x52,0x4C,0xE0,0x15,0x48, + 0x19,0x49,0x40,0x78,0xFF,0x23,0x91,0x33,0x70,0x43,0x00,0x19,0x84,0x46,0x80,0x00, + 0x38,0x58,0x00,0x05,0x00,0x0D,0x02,0x00,0x41,0x18,0x99,0x42,0x2E,0xD8,0x13,0x49, + 0x08,0x1A,0x03,0x00,0x43,0x43,0x23,0xE0,0xFB,0xC3,0x0C,0x0C,0x80,0x06,0x10,0x40, + 0xDF,0x83,0x0F,0x46,0x7F,0xC1,0x0F,0x42,0xF0,0xFF,0x00,0x00,0x00,0x90,0x00,0x40, + 0x09,0x0D,0x00,0x00,0xF7,0xC3,0x0F,0x00,0x00,0xA0,0x00,0x40,0xC0,0x0F,0x00,0x20, + 0x00,0x78,0x00,0x00,0x64,0x06,0x00,0x20,0x00,0x00,0x10,0x40,0x00,0x02,0x10,0x40, + 0x70,0x08,0x00,0x20,0x70,0x0A,0x00,0x20,0x74,0xF5,0xFF,0xFF,0x54,0x0B,0x00,0x00, + 0x18,0x0A,0x8A,0x42,0x01,0xD9,0x40,0x18,0x00,0xE0,0x08,0x1A,0x02,0x99,0x00,0x29, + 0x06,0xD0,0x6C,0x49,0x00,0x9A,0x89,0x78,0x61,0x43,0x89,0x19,0x49,0x00,0x02,0xE0, + 0x01,0x9A,0x61,0x46,0x49,0x00,0x50,0x52,0x64,0x1C,0x66,0x48,0x40,0x78,0x84,0x42, + 0x88,0xD3,0x76,0x1C,0x63,0x48,0x81,0x78,0x8E,0x42,0x81,0xD3,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0xF0,0xB5,0x60,0x4E,0x5F,0x4D,0x00,0x24,0x01,0x27,0x5F,0x48,0x01,0x68, + 0x5E,0x4A,0x08,0x04,0x00,0x0E,0x09,0x06,0x09,0x0E,0x68,0x70,0x40,0x3A,0xA9,0x70, + 0x12,0x69,0xD2,0x07,0xD2,0x0F,0x32,0x7D,0x02,0xD0,0x92,0x07,0x06,0xD4,0x01,0xE0, + 0x92,0x07,0x03,0xD5,0x49,0x1E,0x29,0x71,0xEF,0x70,0x03,0xE0,0x40,0x1E,0x28,0x71, + 0x00,0x20,0xE8,0x70,0x20,0x00,0x64,0x1C,0xFF,0xF7,0xBB,0xFE,0x28,0x78,0x01,0x28, + 0x01,0xD0,0x01,0x2C,0x05,0xD0,0x02,0x2C,0x03,0xD0,0xFF,0xF7,0x8F,0xFD,0x01,0x2C, + 0xD4,0xD9,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x49,0x48,0x10,0xB5,0x40,0x6B,0x45,0x4C, + 0xC5,0x22,0xA0,0x60,0x20,0x00,0xD2,0x00,0x00,0x21,0x0C,0x30,0xFF,0xF7,0x78,0xFD, + 0x00,0x20,0x20,0x70,0xFF,0xF7,0xBD,0xFF,0x01,0x20,0x20,0x70,0xFF,0xF7,0xB9,0xFF, + 0x40,0x48,0x41,0x49,0xC8,0x61,0x41,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60, + 0x20,0x00,0x0C,0x30,0x04,0xC8,0xCA,0x61,0x4A,0x69,0x52,0x06,0xFC,0xD4,0xF9,0xE7, + 0x40,0x1E,0xFD,0xD2,0x70,0x47,0xF0,0xB5,0x3A,0x48,0x39,0x4A,0x01,0x23,0x03,0x61, + 0x19,0x00,0x38,0x48,0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x26,0x35,0x00,0x9D,0x40, + 0x03,0x20,0x34,0x4C,0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2, + 0x01,0x20,0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0x65,0x61, + 0x48,0x00,0x86,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69,0x00,0x20,0x5C,0x01,0xA4,0x46, + 0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19, + 0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xD5,0xD3,0x21,0x48, + 0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x25,0x9D,0x40,0x03,0x20,0x1D,0x4C,0x00,0x04, + 0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0x01,0x20,0x00,0x04,0x28,0x43, + 0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0xA5,0x61,0x70,0x46,0x40,0x1E,0xFD,0xD2, + 0xE7,0x69,0x5C,0x01,0xFF,0x34,0x00,0x20,0xFF,0x34,0x02,0x34,0xA4,0x46,0x64,0x46, + 0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19,0x40,0x1C, + 0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xD4,0xD3,0x49,0x1C,0xC8,0x29, + 0x9F,0xD9,0x6E,0xE7,0x64,0x06,0x00,0x20,0x00,0x78,0x00,0x00,0x40,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0xAB,0xFC,0xFF,0x8F,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x70,0x08,0x00,0x20,0x00,0xA1,0x00,0x40,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x19,0x05,0x00,0x20,0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00, + 0xC0,0x7B,0x00,0x00,0xC0,0x75,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x78,0x00,0x00, + 0x00,0x03,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7C,0x00,0x00, + 0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x00,0x43,0x00,0xE1,0x00, + 0x00,0x00,0x00,0x00,0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Star2_Ver0002.h b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Star2_Ver0002.h new file mode 100644 index 00000000..177ce58b --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_Star2_Ver0002.h @@ -0,0 +1,2163 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: Star2 SYNOPEX, f/w 2( 30301) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x40,0x00,0x00,0x20,0x94,0x02,0x00,0x00,0xCC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x30,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x10,0xB4,0x2B,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x20,0x48,0x10,0xD1,0x91,0x06,0x0E,0xD1, + 0x0A,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xCE,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0B,0x48, + 0x0E,0xD1,0x89,0x06,0x0C,0xD1,0x08,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0xA5,0xFF,0x64,0x1E,0x60,0x1C,0xF3,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0x08,0xFE,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x2C,0x0B,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0xF9,0xFC,0x07,0x00,0x03,0xF0,0x14,0xFC,0x03,0xF0,0x06,0xFC, + 0x03,0xF0,0x8C,0xFC,0x48,0x4A,0x49,0x49,0x49,0x48,0x04,0xF0,0x22,0xFE,0x49,0x4D, + 0x00,0x26,0x01,0x21,0xC9,0x03,0x30,0x00,0xEE,0x81,0x00,0xF0,0x93,0xF9,0xA8,0x61, + 0x45,0x49,0x00,0x20,0x00,0xF0,0x8E,0xF9,0x44,0x4B,0x45,0x49,0xD8,0x63,0x45,0x48, + 0x00,0xF0,0x88,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x4E,0xFC, + 0xA1,0x22,0x41,0x48,0xD2,0x00,0x00,0x21,0x04,0xF0,0x0E,0xFE,0x06,0xF0,0xA0,0xF9, + 0x03,0xF0,0xF0,0xFC,0x3D,0x48,0x01,0x24,0x81,0x7A,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0xFF,0x20,0x91,0x30,0x6E,0x72,0x28,0x82,0xAE,0x72,0xEE,0x72, + 0x35,0x48,0x2E,0x73,0x64,0x07,0x6E,0x73,0x60,0x63,0xFF,0x20,0xE0,0x63,0xE0,0x14, + 0x00,0xF0,0x8E,0xFC,0x32,0x48,0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0x88,0xFC, + 0x30,0x49,0x02,0x20,0x06,0xF0,0x90,0xFC,0x02,0x20,0x06,0xF0,0x95,0xFC,0x28,0x7A, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0x42,0xFD,0x00,0x2F,0x1F,0xD1,0x2A,0x4F,0xBE,0x15, + 0x28,0x7A,0x00,0x28,0x02,0xD0,0x29,0x49,0x28,0x6B,0x88,0x60,0xE0,0x6B,0x0B,0x28, + 0x14,0xD0,0x27,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0,0xAF,0xFA,0xF8,0x68, + 0x24,0x49,0x88,0x42,0xEC,0xD9,0x24,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB8,0x68, + 0xB0,0x43,0xB8,0x60,0xB8,0x68,0x30,0x43,0xB8,0x60,0xE1,0xE7,0xE8,0x79,0x00,0x28, + 0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x4B,0xFC,0x28,0x7A,0x00,0x28,0x01,0xD0, + 0x06,0xF0,0x1C,0xFD,0x02,0x20,0x06,0xF0,0x6B,0xFC,0xFF,0x20,0x81,0x30,0x00,0xF0, + 0x3F,0xFC,0x16,0x49,0x05,0x20,0x03,0xF0,0x2D,0xFA,0x0B,0x20,0xE0,0x63,0x03,0xF0, + 0xBD,0xFA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x28,0x00,0x00,0x00,0x60,0x71,0x00,0x00, + 0x40,0x00,0x00,0x20,0xF8,0x0A,0x00,0x20,0xC0,0x75,0x00,0x00,0xC0,0x0F,0x00,0x20, + 0x00,0x7E,0x00,0x00,0x00,0x76,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xAD,0x0B,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40, + 0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x75,0x00,0x00,0x5D,0x6E,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3, + 0xA0,0x30,0x71,0xE0,0x1A,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x20,0x34,0x71,0xE0,0x01,0x00,0x00,0x3A,0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0, + 0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3, + 0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3, + 0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3, + 0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A, + 0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5,0x02,0x20,0x06,0xF0,0x5F,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0, + 0xA6,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0x98,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3, + 0xB7,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x41,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0xD1,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x79,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x1B,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68, + 0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF, + 0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0F,0x24,0x02,0xF0, + 0xF0,0xF8,0x64,0x1E,0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68, + 0x17,0x4E,0xB0,0x7E,0xC0,0x07,0x26,0xD0,0x70,0x7D,0x00,0x28,0x21,0xD0,0xBA,0x00, + 0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A, + 0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49, + 0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0,0xD5,0xF8,0x64,0x1C, + 0x70,0x7D,0xA0,0x42,0xF3,0xDA,0x70,0x7D,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1, + 0x01,0x25,0x70,0x7D,0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x86,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B, + 0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7D,0xE4,0x00,0xE6,0x18, + 0x09,0x24,0xE4,0x01,0x36,0x19,0xB5,0x73,0x56,0x7D,0x45,0x88,0xF6,0x00,0xF6,0x18, + 0x36,0x19,0x35,0x82,0x56,0x7D,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x75,0x82, + 0x55,0x7D,0xED,0x00,0xED,0x18,0x2D,0x19,0x29,0x75,0x55,0x7D,0xC1,0x79,0xED,0x00, + 0xEB,0x18,0x1B,0x19,0x59,0x75,0x51,0x7D,0x49,0x1C,0x51,0x75,0xC0,0x79,0x06,0x28, + 0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x75,0x70,0xBC, + 0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xFF,0xB5,0x0A,0x20,0x48,0x43,0x15,0x4F,0x81,0xB0,0xC5,0x19,0x48,0x00,0xFF,0x35, + 0x61,0x35,0xC0,0x19,0xC0,0x30,0x2A,0x71,0x0C,0x00,0x00,0x90,0x80,0x89,0x16,0x00, + 0x0A,0x21,0xFF,0xF7,0x2F,0xFF,0xE8,0x80,0x00,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7, + 0x29,0xFF,0x28,0x81,0x38,0x19,0xFF,0x30,0x01,0x30,0x00,0x7C,0xB9,0x19,0x68,0x71, + 0x04,0x98,0xA8,0x72,0x01,0x98,0x06,0x55,0x13,0x20,0x40,0x01,0x08,0x18,0x00,0x21, + 0xC4,0x76,0x81,0x74,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20, + 0x06,0x48,0x0F,0x23,0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A, + 0xD2,0x18,0x09,0x03,0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0xF0,0x05,0x00,0x20, + 0xF1,0xB5,0xB2,0x48,0x90,0xB0,0x0F,0x90,0x40,0x7C,0xB2,0x49,0x02,0x90,0x0F,0x98, + 0xC0,0x7C,0x01,0x90,0x0F,0x98,0x00,0x7C,0x00,0x90,0xAD,0x48,0xC9,0x88,0x00,0x8A, + 0x49,0x06,0x02,0xD4,0xA9,0x48,0x40,0x30,0x80,0x89,0x00,0x05,0x7E,0xD5,0x10,0x98, + 0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x3E,0xE1,0x03,0x98, + 0x81,0x00,0x01,0x20,0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90, + 0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x7F,0xFB,0x26,0xE1, + 0x9D,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9A,0x49, + 0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80, + 0x4A,0x5B,0x24,0x31,0x4A,0x53,0x69,0x18,0x48,0x80,0x10,0xE1,0x02,0x9F,0x92,0x49, + 0x00,0x20,0x7F,0x1E,0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88, + 0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46, + 0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A,0x02,0x9A,0x87,0x4E,0x92,0x00,0x8B,0x18, + 0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90, + 0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00, + 0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B, + 0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7,0xAB,0xFD,0x07,0x00,0x02,0x99,0x30,0x00, + 0xFF,0xF7,0xA6,0xFD,0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42, + 0x17,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21, + 0x48,0x43,0x0A,0x21,0xFF,0xF7,0x6E,0xFE,0x61,0x00,0x00,0xE0,0xCA,0xE0,0x6A,0x4B, + 0x1C,0x3B,0x5A,0x5E,0x90,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x10,0x18,0x58,0x52, + 0x07,0xE0,0x65,0x49,0x0F,0x9A,0x60,0x00,0x1C,0x39,0x0B,0x5A,0x52,0x7D,0x9A,0x1A, + 0x0A,0x52,0x61,0x49,0x60,0x00,0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22, + 0x0A,0x52,0x08,0x5E,0x01,0x99,0x88,0x42,0x09,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0, + 0x88,0x00,0x05,0x21,0xFF,0xF7,0x46,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20, + 0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x3B,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0,0x01,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7, + 0x31,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98,0x05,0x21, + 0xFF,0xF7,0x28,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00, + 0x02,0xD1,0x45,0x49,0x0A,0x39,0x08,0x55,0x43,0x49,0x0C,0x9A,0x24,0x31,0x48,0x5F, + 0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A,0x3E,0x48, + 0x57,0x1A,0x06,0x91,0x0F,0x99,0x0A,0x38,0x00,0x5D,0x89,0x7D,0x88,0x42,0x27,0xD3, + 0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x00,0x99, + 0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7, + 0x1F,0xFD,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0xFF,0xF7,0x0D,0xFD,0x08,0x99,0x00,0x2E,0x19,0xDB,0x09,0x19,0x18,0xE0, + 0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99,0xFF,0xF7,0x02,0xFD,0x64,0x21,0x08,0x1A, + 0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7,0xF8,0xFC, + 0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21,0xE0,0xE7, + 0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A,0x16,0x4A, + 0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A,0x5A,0x80,0x13,0x4A,0x13,0x4B,0x24,0x32, + 0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43, + 0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98, + 0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42, + 0x00,0xDA,0xBC,0xE6,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00, + 0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0xCA,0x0B,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x10,0x4B,0x30,0xB4,0x27,0x21,0xDA,0x88,0x49,0x01,0x80,0x24,0x59,0x18,0x00,0x28, + 0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x8D,0x82,0xC5,0x89,0xCD,0x82,0x05,0x8A,0x0D,0x83, + 0x40,0x8A,0x48,0x83,0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43,0x88,0x83,0x06,0xE0, + 0x00,0x20,0x88,0x82,0xC8,0x82,0x08,0x83,0x48,0x83,0xA2,0x43,0x88,0x83,0xDA,0x80, + 0x30,0xBC,0x70,0x47,0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x7F,0xB5,0x24,0x4D, + 0x04,0x00,0x1A,0x28,0x0B,0xD1,0x28,0x6A,0x00,0x28,0x08,0xD1,0x68,0x6A,0x00,0x28, + 0x05,0xD1,0x20,0x4C,0x01,0xF0,0x86,0xFE,0x64,0x1E,0xFB,0xD2,0x14,0xE0,0x05,0xF0, + 0x57,0xF8,0x00,0x20,0x01,0xF0,0xF4,0xFC,0x01,0xF0,0x72,0xFD,0x01,0xF0,0xBA,0xFD, + 0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x4F,0xFA,0x03,0x00,0x01,0x9A,0x02,0x99, + 0x03,0x98,0x00,0x94,0x00,0xF0,0x30,0xF8,0x02,0x20,0x06,0xF0,0xA1,0xF8,0x02,0x20, + 0x06,0xF0,0x92,0xF8,0x10,0x48,0xE9,0x68,0xC1,0x61,0x29,0x69,0xC1,0x61,0x0F,0x49, + 0xCA,0x68,0x52,0x08,0x52,0x00,0xCA,0x60,0x0D,0x4A,0x0E,0x49,0x02,0xE0,0xD3,0x68, + 0x8B,0x42,0x02,0xD8,0x43,0x69,0x9B,0x06,0xF9,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5, + 0x01,0xF0,0x66,0xFE,0x01,0x20,0x00,0xF0,0x6B,0xF8,0x7F,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x75,0x00,0x00,0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0, + 0xFF,0xF7,0xD0,0xF9,0x1C,0x48,0x01,0x27,0x04,0x04,0x24,0x0C,0x7F,0x02,0x00,0x22, + 0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23, + 0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0,0x92,0xF9,0x14,0x99, + 0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04, + 0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69, + 0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C, + 0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x06,0xF0,0xB4,0xF8, + 0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40, + 0xC0,0x75,0x00,0x00,0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00, + 0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3, + 0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1, + 0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47, + 0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47, + 0x40,0x00,0x00,0x40,0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x62,0x90,0xFF,0x49,0x40,0x1E, + 0x5E,0x90,0xCB,0x79,0xFE,0x4F,0xFF,0x48,0xFA,0x88,0x54,0x06,0x00,0xD4,0xC3,0x78, + 0x54,0x06,0x05,0x93,0x0B,0x7A,0x00,0xD4,0x03,0x79,0xFB,0x4C,0xA4,0x8A,0x1B,0x19, + 0x1B,0x06,0x1B,0x0E,0x04,0x93,0x4B,0x7A,0x54,0x06,0x00,0xD4,0x43,0x79,0x52,0x06, + 0x03,0x93,0x89,0x7A,0x00,0xD4,0x81,0x79,0x00,0x20,0xF4,0x4C,0x02,0x91,0x3D,0x79, + 0x01,0x26,0x01,0x90,0x13,0xE0,0x0A,0x20,0x70,0x43,0x43,0x21,0xC0,0x19,0xC9,0x00, + 0x09,0x5C,0x00,0x29,0x0A,0xD0,0xEE,0x49,0x40,0x18,0x02,0xF0,0x43,0xFE,0x00,0x28, + 0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x78, + 0xB0,0x42,0xE8,0xDA,0xE7,0x48,0x72,0x90,0xC2,0x8A,0x41,0x8B,0x50,0x1A,0x00,0x28, + 0x00,0xDC,0x88,0x1A,0x03,0x04,0x72,0x98,0x72,0x99,0x00,0x8B,0x89,0x8B,0x1B,0x0C, + 0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A,0x10,0x04,0x72,0x9A,0x00,0x21,0x91,0x74, + 0x72,0x9A,0x00,0x0C,0xD1,0x74,0x72,0x9A,0x11,0x75,0x01,0x99,0x00,0x29,0x10,0xD0, + 0x1E,0x2B,0x0E,0xD2,0x32,0x28,0x03,0xD2,0x72,0x98,0x01,0x21,0x81,0x74,0x08,0xE0, + 0x64,0x28,0x03,0xD2,0x72,0x99,0x01,0x20,0xC8,0x74,0x02,0xE0,0x72,0x98,0x01,0x21, + 0x01,0x75,0x72,0x98,0x40,0x7C,0x00,0x28,0x16,0xD1,0x72,0x98,0x80,0x7C,0x00,0x28, + 0x02,0xD0,0x05,0x98,0x80,0x1C,0x0C,0xE0,0x72,0x98,0xC0,0x7C,0x00,0x28,0x02,0xD0, + 0x05,0x98,0x00,0x1D,0x05,0xE0,0x72,0x98,0x00,0x7D,0x00,0x28,0x04,0xD0,0x05,0x98, + 0x80,0x1D,0x00,0x06,0x00,0x0E,0x05,0x90,0x09,0x22,0x00,0x21,0x5B,0xA8,0x04,0xF0, + 0x8B,0xF8,0xF8,0x88,0xFF,0x21,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x05,0xD5, + 0x01,0xF0,0xAE,0xF8,0x73,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x78,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0xE0,0x70,0x60,0x78,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0, + 0x18,0xE0,0x00,0x28,0x16,0xD1,0xB1,0x48,0x5A,0x22,0x00,0x21,0x5E,0x30,0x04,0xF0, + 0x6B,0xF8,0xE0,0x78,0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E, + 0x0A,0x00,0x14,0x23,0x5B,0xA8,0xFF,0xF7,0x7B,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD, + 0x25,0x70,0xE6,0xE1,0x09,0x22,0x01,0x21,0x58,0xA8,0x04,0xF0,0x55,0xF8,0x02,0x20, + 0xA3,0x49,0x06,0x90,0x9E,0x48,0x5D,0x31,0x41,0x18,0x71,0x91,0xA0,0x49,0x54,0x31, + 0x40,0x18,0x70,0x90,0x13,0xE1,0x08,0x26,0x07,0xAF,0x24,0x20,0x70,0x43,0x07,0xA9, + 0x40,0x18,0x00,0x21,0x24,0x22,0xC9,0x43,0x04,0xF0,0x3E,0xF8,0x76,0x1E,0xF4,0xD5, + 0x06,0x98,0x01,0xF0,0x0B,0xFC,0x01,0x27,0x5F,0x90,0x53,0xE0,0x5F,0x98,0x01,0x26, + 0x60,0x90,0x4B,0xE0,0x0A,0x20,0x70,0x43,0x8D,0x49,0x40,0x18,0x01,0x00,0xFF,0x30, + 0xFF,0x30,0x02,0x30,0x6F,0x90,0x00,0x7E,0x00,0x28,0x3E,0xD0,0x8C,0x48,0x08,0x18, + 0x6E,0x90,0x02,0xF0,0x7F,0xFD,0x06,0x99,0x08,0x43,0x07,0xD0,0x6E,0x98,0x02,0xF0, + 0x79,0xFD,0x00,0x28,0x31,0xD0,0x06,0x98,0x00,0x28,0x2E,0xD0,0x80,0x49,0x78,0x00, + 0x40,0x18,0xC0,0x30,0x6D,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0x6B,0xFB,0x6F,0x99, + 0x49,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A,0x6D,0x98,0x61,0x92,0xC0,0x8B, + 0x0A,0x21,0xFF,0xF7,0x5F,0xFB,0x6F,0x99,0x89,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC, + 0x42,0x1A,0x61,0x98,0x01,0x00,0x41,0x43,0x10,0x00,0x50,0x43,0x08,0x18,0x60,0x99, + 0x88,0x42,0x04,0xDA,0x24,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0x60,0x90,0x24,0x21, + 0x79,0x43,0x07,0xAA,0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x78,0xB0,0x42, + 0xB0,0xDA,0x7F,0x1C,0xAF,0x42,0xA9,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x23,0x5F,0x9A, + 0x18,0x00,0x15,0xE0,0x5B,0xA9,0x09,0x5C,0x00,0x29,0x10,0xD1,0x24,0x21,0x41,0x43, + 0x0F,0x00,0x07,0xAE,0x89,0x19,0xF6,0x59,0xB7,0x00,0xC9,0x59,0x91,0x42,0x06,0xDA, + 0x00,0x29,0x04,0xDB,0x00,0x2E,0x02,0xDB,0x0A,0x00,0x00,0x23,0x5E,0x90,0x40,0x1C, + 0xA8,0x42,0xE7,0xDD,0x00,0x2B,0x7E,0xD1,0x62,0x98,0x5E,0x9E,0x40,0x1C,0x62,0x90, + 0x24,0x20,0x46,0x43,0x07,0xA8,0x80,0x59,0x0A,0x21,0x48,0x43,0x50,0x49,0x0A,0x22, + 0x41,0x18,0x5E,0x98,0xFF,0x31,0x50,0x43,0x4D,0x4A,0xBF,0x31,0x87,0x18,0x38,0x00, + 0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0,0x8B,0xFF,0x5E,0x98,0x48,0x49,0x40,0x00, + 0x40,0x18,0xC0,0x30,0x6C,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0xFB,0xFA,0xFF,0x37, + 0x61,0x37,0xF8,0x80,0x6C,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0xF3,0xFA,0x38,0x81, + 0x3F,0x48,0x5E,0x99,0x40,0x18,0xFF,0x30,0x01,0x30,0x00,0x7C,0x78,0x71,0xB8,0x7A, + 0x05,0x99,0x49,0x1C,0x88,0x42,0x01,0xD2,0x40,0x1C,0xB8,0x72,0xB8,0x7A,0x13,0x28, + 0x6B,0x90,0x09,0xD9,0x14,0x21,0xFF,0xF7,0xDD,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42, + 0x02,0xD2,0x6B,0x98,0x14,0x30,0xB8,0x72,0x38,0x79,0x5E,0x9A,0x5B,0xA9,0x88,0x54, + 0x71,0x9A,0x5E,0x99,0x81,0x54,0x39,0x79,0x70,0x9A,0x00,0x20,0x88,0x54,0x07,0xA9, + 0x89,0x59,0x58,0xAA,0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x24,0x23,0x58,0x43, + 0x07,0xAB,0x6A,0x90,0xC0,0x18,0x69,0x90,0x9B,0x59,0x00,0x22,0xD2,0x43,0x9B,0x00, + 0xC2,0x50,0x5B,0xA8,0x40,0x5C,0x5F,0x9B,0x00,0x28,0x11,0xD1,0xA2,0x78,0x01,0x20, + 0x94,0x46,0x0B,0xE0,0x69,0x9A,0x87,0x00,0xD2,0x59,0x00,0x2A,0x05,0xDB,0x9A,0x42, + 0x07,0xAF,0x02,0xDA,0x6A,0x9B,0xF8,0x50,0x13,0x00,0x40,0x1C,0x84,0x45,0xF1,0xDA, + 0x49,0x1C,0xA9,0x42,0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x78,0x62,0x99,0x88,0x42, + 0x05,0xDD,0x64,0x98,0x40,0x1C,0xA8,0x42,0x64,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98, + 0x41,0x1E,0x09,0x06,0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE3,0xE6,0x01,0x26, + 0x65,0x96,0x63,0x90,0x6F,0xE0,0x58,0xA8,0x80,0x5D,0x00,0x28,0x6A,0xD0,0x65,0x98, + 0x07,0x49,0x2F,0x18,0x0A,0x20,0x70,0x43,0x40,0x18,0x68,0x90,0xFF,0x30,0xFF,0x30, + 0x02,0x30,0x67,0x90,0x00,0x7E,0x70,0x99,0x40,0x5C,0x0D,0xE0,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20, + 0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20,0x03,0x99,0x88,0x42,0x34,0xD2,0x08,0x2F, + 0x32,0xDC,0x4C,0x49,0x68,0x98,0x40,0x18,0x02,0xF0,0x5C,0xFC,0x00,0x28,0x2B,0xD0, + 0x67,0x98,0x70,0x99,0x00,0x7E,0x70,0x9A,0x47,0x4B,0x41,0x5C,0x49,0x1C,0x81,0x54, + 0x68,0x98,0x43,0x21,0xC9,0x00,0x41,0x18,0x0A,0x20,0x78,0x43,0xC0,0x18,0x66,0x90, + 0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0,0xCB,0xFE,0x68,0x99,0x66,0x98,0xFF,0x31, + 0xC1,0x31,0x4A,0x79,0xFF,0x30,0x61,0x30,0xC2,0x72,0x89,0x79,0x01,0x73,0x67,0x98, + 0x5B,0xA9,0x00,0x7E,0xC8,0x55,0x71,0x99,0x47,0x54,0x65,0x98,0x40,0x1C,0x65,0x90, + 0x63,0x98,0x40,0x1C,0x63,0x90,0x15,0xE0,0x32,0x49,0x68,0x98,0x32,0x4F,0x40,0x18, + 0x02,0xF0,0x28,0xFC,0x00,0x28,0x0D,0xD0,0x72,0x99,0x01,0x20,0x08,0x74,0x67,0x98, + 0x80,0x7F,0x13,0x28,0x06,0xD9,0x60,0x78,0x01,0x28,0x03,0xD1,0xF8,0x88,0x04,0x21, + 0x08,0x43,0xF8,0x80,0x76,0x1C,0xA0,0x78,0xB0,0x42,0x8C,0xDA,0x26,0x48,0xC0,0x88, + 0x41,0x07,0x05,0xD5,0x02,0x99,0x04,0x22,0xE1,0x70,0x23,0x49,0x90,0x43,0xC8,0x80, + 0x01,0x26,0x31,0xE0,0x5B,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x13,0x22,0x01,0x20, + 0x52,0x01,0x05,0x23,0xDB,0x01,0x1C,0x49,0x09,0x18,0x8F,0x18,0xFF,0x7E,0x00,0x2F, + 0x0C,0xD1,0xC9,0x18,0x09,0x79,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E, + 0x09,0x0E,0x01,0x23,0x5B,0xA8,0xFF,0xF7,0xAB,0xFA,0x02,0xE0,0x40,0x1C,0x09,0x28, + 0xE9,0xDB,0xE0,0x78,0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18, + 0x38,0x00,0xFF,0x30,0x6B,0x30,0x02,0xF0,0xDD,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20, + 0xFF,0x37,0x61,0x37,0xB8,0x72,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0x63,0x98,0x28,0x18, + 0x20,0x70,0x20,0x78,0x05,0x49,0x5A,0x22,0xA0,0x70,0x08,0x00,0xB4,0x30,0x03,0xF0, + 0x4F,0xFE,0xE7,0xE5,0x1E,0x02,0x00,0x00,0xF0,0x05,0x00,0x20,0x54,0x07,0x00,0x20, + 0xF1,0xB5,0x3C,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x3A,0x48,0x41,0x7F, + 0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D, + 0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20, + 0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x5C,0xF9,0x01,0xF0,0x0A,0xFA, + 0x00,0x24,0x27,0x00,0x37,0xE0,0x00,0x26,0x30,0xE0,0x31,0x00,0x38,0x00,0x02,0xF0, + 0xB1,0xF8,0x00,0x28,0x28,0xD0,0x29,0x78,0x05,0x9A,0x79,0x43,0x89,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D, + 0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x26,0xFB,0x40,0x1C,0x14,0xD1, + 0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x05,0xF0,0x18,0xFB,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A, + 0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x13,0x4D,0x28,0x78, + 0x86,0x42,0xCA,0xD3,0x7F,0x1C,0x12,0x48,0x00,0x78,0x87,0x42,0xC3,0xD3,0x10,0x48, + 0x0E,0x49,0x00,0x78,0x09,0x78,0x48,0x43,0xA0,0x42,0x04,0xD1,0x04,0x98,0x07,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02, + 0x88,0x42,0xA9,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20, + 0x04,0x90,0xEC,0xE7,0x00,0x02,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xF0,0xB5,0x8A,0x4A,0xFF,0xB0,0x88,0xB0,0x40,0x18,0x85,0x92, + 0x42,0x00,0x80,0x18,0x84,0x90,0x48,0x42,0x83,0x90,0x86,0x48,0x86,0x4E,0x00,0x7A, + 0x02,0xAF,0x82,0x90,0x85,0x48,0x86,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0x83,0x98, + 0x40,0x42,0x83,0x90,0x01,0x22,0x52,0x02,0x00,0x21,0x30,0x00,0x03,0xF0,0xCC,0xFD, + 0x00,0x25,0x39,0xE0,0x00,0x24,0x32,0xE0,0x7C,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07, + 0x15,0xD0,0x7B,0x49,0x09,0x78,0x00,0x29,0x82,0x99,0x16,0xD0,0x8D,0x42,0x0E,0xD1, + 0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42, + 0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0x83,0x9A, + 0x21,0x00,0x28,0x00,0x05,0xF0,0xA0,0xFA,0x10,0xE0,0x8C,0x42,0xF7,0xD1,0x81,0x7D, + 0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0, + 0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x65,0x48, + 0x00,0x78,0x84,0x42,0xC8,0xD3,0x6D,0x1C,0x63,0x4C,0x20,0x78,0x85,0x42,0xC1,0xD3, + 0x01,0xF0,0x98,0xF8,0x01,0xF0,0x46,0xF9,0x00,0x25,0x2A,0xE0,0x00,0x24,0x23,0xE0, + 0x21,0x00,0x28,0x00,0x01,0xF0,0xEE,0xFF,0x00,0x28,0x12,0xD0,0x59,0x49,0x85,0x9B, + 0x09,0x78,0x69,0x43,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x5B,0xF8,0x4E,0x49,0x09,0x78,0x69,0x43, + 0x09,0x19,0x49,0x00,0x64,0x1C,0x78,0x52,0x4A,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3, + 0x6D,0x1C,0x49,0x48,0x01,0x78,0x8D,0x42,0xD0,0xD3,0x00,0x21,0x01,0x91,0x01,0xF0, + 0x11,0xF9,0x00,0x25,0x51,0xE0,0x00,0x24,0x4A,0xE0,0x21,0x00,0x28,0x00,0x01,0xF0, + 0xB9,0xFF,0x00,0x28,0x43,0xD0,0x3F,0x49,0x85,0x9B,0x09,0x78,0x69,0x43,0x09,0x19, + 0x8A,0x00,0x9A,0x58,0x03,0x04,0x12,0x05,0x12,0x0D,0x1B,0x0C,0xD3,0x1A,0x00,0x2B, + 0x01,0xDD,0x10,0x1A,0x00,0xE0,0x80,0x1A,0x49,0x00,0x73,0x5A,0x00,0x04,0x00,0x0C, + 0x83,0x42,0x0A,0xD9,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x21,0xF8,0x31,0x49, + 0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00,0x78,0x52,0x01,0x98,0x03,0x21,0xFF,0xF7, + 0x79,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0x86,0x98,0x00,0x7D,0x00,0x28, + 0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xDC,0xF9,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xD4,0xF9,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C, + 0x1C,0x48,0x00,0x78,0x84,0x42,0xB0,0xD3,0x6D,0x1C,0x1B,0x48,0x00,0x78,0x85,0x42, + 0xA9,0xD3,0x01,0x98,0x40,0x1C,0x01,0x90,0x84,0x98,0x40,0x1E,0x84,0x90,0x1B,0xD2, + 0x14,0x4E,0x00,0x25,0x0E,0xE0,0x00,0x24,0x08,0xE0,0x68,0x43,0x00,0x19,0x40,0x00, + 0x3A,0x5A,0x21,0x00,0x28,0x00,0x05,0xF0,0xD1,0xF9,0x64,0x1C,0x30,0x78,0x84,0x42, + 0xF3,0xD3,0x6D,0x1C,0x0C,0x48,0x00,0x78,0x85,0x42,0xEC,0xD3,0x7F,0xB0,0x08,0xB0, + 0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0xF0,0xE4,0xFF,0x7F,0xE7,0x00,0x00, + 0x00,0x02,0x10,0x40,0x70,0x0A,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x78,0x00,0x00, + 0xFD,0x0A,0x00,0x20,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20, + 0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x7A,0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25, + 0x1F,0x4F,0xAD,0x01,0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7A,0x1B,0x0F, + 0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19,0xE4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42, + 0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19,0xC0,0x68,0x92,0x0A,0x83,0x05,0x92,0x02, + 0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43, + 0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46, + 0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x5E,0x48,0x8E,0x46, + 0x02,0x8C,0x5E,0x49,0x40,0x8C,0x01,0x91,0xCB,0x88,0x40,0x39,0x00,0x91,0x89,0x7E, + 0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71, + 0xA6,0xE0,0x01,0x99,0x09,0x79,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29, + 0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00, + 0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88, + 0xA1,0x88,0x87,0x42,0x58,0xDC,0x82,0x42,0x56,0xDB,0x8C,0x45,0x54,0xDC,0x8B,0x42, + 0x52,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A,0x77,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0, + 0x09,0x23,0x02,0x2A,0x17,0xD0,0x03,0x2A,0x71,0xD1,0xE2,0x79,0xD7,0x07,0x28,0xD0, + 0x01,0x2A,0x01,0xD0,0x05,0x2A,0x22,0xD1,0x00,0x25,0xE3,0x71,0x67,0xE0,0x00,0x9A, + 0x92,0x7D,0x00,0x2A,0x63,0xD1,0x00,0xF0,0x87,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20, + 0xE0,0x71,0x26,0x72,0x5B,0xE0,0xE2,0x79,0xD6,0x07,0xE9,0xD1,0x92,0x07,0x56,0xD5, + 0x00,0xF0,0x7A,0xF8,0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00, + 0x20,0x00,0xE7,0x71,0xFE,0xF7,0xE2,0xFF,0xEB,0xE7,0x02,0x20,0x46,0xE0,0x11,0x20, + 0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0, + 0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0xCD,0xFF,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20, + 0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28, + 0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4, + 0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xA9,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20, + 0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x9D,0xFF,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49, + 0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80, + 0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88, + 0x00,0x06,0x80,0x0F,0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00, + 0xA0,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0xB4,0x18,0x4B,0x05,0x00,0xDE,0x7E, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x26,0xD0,0x1B,0x7D,0x00,0x2B,0x23,0xD1,0x20,0xE0, + 0x13,0x4B,0xD4,0x00,0xE3,0x18,0x11,0x24,0xA4,0x01,0x1C,0x19,0x1C,0x27,0xE7,0x5F, + 0xAF,0x42,0x11,0xDC,0x23,0x27,0x7F,0x01,0xDB,0x19,0x00,0x27,0xDF,0x5F,0xAF,0x42, + 0x0A,0xDB,0x1E,0x27,0xE7,0x5F,0x8F,0x42,0x06,0xDC,0x02,0x24,0x1C,0x5F,0x8C,0x42, + 0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06, + 0x12,0x0E,0x96,0x42,0xDC,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8F,0xB0,0x0A,0x90,0x09,0x90,0xC7,0x48, + 0xC7,0x4A,0x01,0x8A,0xD0,0x88,0x43,0x06,0x02,0xD4,0xC4,0x49,0xC0,0x39,0x89,0x89, + 0xC2,0x4C,0xC4,0x4E,0x60,0x34,0x08,0x91,0xE1,0x7B,0x43,0x06,0x00,0xD4,0xF1,0x7A, + 0x43,0x06,0x07,0x91,0xA1,0x7B,0x00,0xD4,0xB1,0x7A,0x43,0x06,0x06,0x91,0x61,0x7C, + 0x00,0xD4,0x71,0x7B,0x43,0x06,0x05,0x91,0xA1,0x79,0x00,0xD4,0xB1,0x78,0x02,0x07, + 0x04,0x91,0xB7,0x49,0x09,0x79,0x05,0xD5,0xB5,0x4A,0x00,0x29,0x02,0xD1,0x08,0x23, + 0x98,0x43,0xD0,0x80,0xB4,0x48,0x18,0x22,0x82,0x5E,0xFF,0x23,0x01,0x33,0x28,0x2A, + 0x03,0xDD,0x1A,0x22,0x82,0x5E,0x1E,0x2A,0x03,0xDC,0x1C,0x22,0x82,0x5E,0x28,0x2A, + 0x05,0xDD,0xAB,0x4D,0xEA,0x88,0x1A,0x43,0xEA,0x80,0x00,0x22,0x04,0xE0,0x1E,0x22, + 0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E,0xC2,0x83,0x03,0xE0,0xA4,0x4A,0xD0,0x88, + 0x98,0x43,0xD0,0x80,0x08,0x98,0x80,0x04,0x78,0xD5,0xA3,0x4A,0x00,0x20,0x20,0x32, + 0x52,0x78,0x00,0x2A,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0, + 0x41,0xF9,0x9B,0x48,0x9D,0x4D,0x00,0x79,0x01,0x28,0x0E,0x90,0x68,0xD1,0x98,0x4B, + 0x19,0x89,0x0D,0x91,0xDF,0x88,0x62,0x89,0x7B,0x06,0x00,0xD4,0xF2,0x88,0x91,0x42, + 0x00,0xD3,0x00,0x20,0x03,0x90,0x0D,0x98,0x0A,0x22,0x0E,0x21,0x50,0x43,0x69,0x5E, + 0x0C,0x91,0xFE,0xF7,0x65,0xFD,0x21,0x78,0x91,0x4B,0x7A,0x06,0x0B,0x93,0x00,0xD4, + 0x19,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x02,0x90,0x0C,0x99, + 0x0D,0x98,0x40,0x1A,0x0A,0x21,0xFE,0xF7,0x53,0xFD,0x61,0x78,0x7A,0x06,0x01,0xD4, + 0x0B,0x99,0x49,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90, + 0x2A,0x89,0xA1,0x78,0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0x89,0x7F,0x8A,0x42, + 0x00,0xD8,0x00,0x20,0xE1,0x78,0x84,0x46,0x2A,0x69,0x01,0x20,0x7B,0x06,0x01,0xD4, + 0x0B,0x99,0xC9,0x7F,0x8A,0x42,0x00,0xDB,0x00,0x20,0x03,0x99,0x00,0x29,0x1F,0xD0, + 0x02,0x99,0x00,0x29,0x1C,0xD0,0x01,0x99,0x00,0x29,0x19,0xD0,0x61,0x46,0x00,0x29, + 0x16,0xD0,0x71,0x4A,0x01,0x21,0x80,0x3A,0x52,0x68,0x00,0x2A,0x00,0xD0,0x00,0x21, + 0x01,0x42,0x0D,0xD0,0x68,0x7B,0x00,0x28,0x24,0xD0,0x61,0x7A,0x7A,0x06,0x00,0xD4, + 0x71,0x79,0x88,0x42,0x1E,0xD8,0x40,0x1E,0x68,0x73,0x1B,0xE0,0x36,0xE0,0xFF,0xE7, + 0x63,0x48,0x21,0x79,0xC0,0x88,0x2A,0x69,0x43,0x06,0x00,0xD4,0x31,0x78,0x8A,0x42, + 0x10,0xDB,0x0E,0x99,0x00,0x29,0x0D,0xD0,0xC1,0x06,0x0B,0xD4,0x69,0x7B,0xE2,0x79, + 0x40,0x06,0x00,0xD4,0xF2,0x78,0x91,0x42,0x04,0xD2,0x04,0x98,0x81,0x42,0x01,0xD9, + 0x49,0x1C,0x69,0x73,0x68,0x7B,0x04,0x99,0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98, + 0x00,0x28,0x0A,0xD1,0x52,0x49,0xC8,0x88,0x10,0x43,0xC8,0x80,0xC9,0x88,0x20,0x7A, + 0x49,0x06,0x00,0xD4,0x30,0x79,0x28,0x73,0x08,0xE0,0x4D,0x4B,0xD9,0x88,0xC8,0x06, + 0x04,0xD5,0x28,0x7B,0x00,0x28,0x10,0xD1,0x91,0x43,0xD9,0x80,0x48,0x4F,0x38,0x79, + 0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5,0x05,0x99,0x06,0x98,0x40,0x1A, + 0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x01,0xE0,0x40,0x1E,0xE3,0xE7,0x50,0x00, + 0xC0,0x19,0x84,0x46,0xFF,0x30,0x41,0x30,0xC0,0x88,0x00,0x28,0x65,0xD0,0x07,0x99, + 0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07,0x5F,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88, + 0x08,0x21,0x08,0x43,0xF8,0x80,0x58,0xE0,0x06,0x99,0x88,0x42,0x55,0xD3,0x08,0x98, + 0x40,0x07,0x52,0xD5,0x00,0x24,0x01,0x20,0x27,0xE0,0xFF,0x23,0x39,0x18,0x3E,0x33, + 0x5B,0x5C,0x93,0x42,0x20,0xD1,0x64,0x1C,0xFF,0x31,0x01,0x31,0x09,0x7C,0x0A,0x91, + 0x01,0x00,0x12,0xE0,0x4B,0x00,0xDD,0x19,0x2B,0x00,0xC0,0x33,0xDE,0x89,0xE0,0x35, + 0x9E,0x81,0x2D,0x88,0xDD,0x83,0x7B,0x18,0xDD,0x1D,0xF9,0x35,0x6E,0x7C,0xFF,0x33, + 0x21,0x33,0x2E,0x74,0x9E,0x7F,0x49,0x1C,0x5E,0x77,0x3B,0x79,0x8B,0x42,0xE9,0xDA, + 0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD4,0xDA, + 0x00,0x2C,0x22,0xDD,0x01,0x2C,0x05,0xDD,0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21, + 0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30,0x01,0x30,0xC1,0x8B,0x38,0x79,0x40,0x1C, + 0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xC0,0x30,0x81,0x81,0x60,0x46, + 0xFF,0x30,0x21,0x30,0xC1,0x89,0x38,0x79,0x40,0x00,0xC0,0x19,0xC0,0x30,0xC1,0x83, + 0x3B,0x79,0x0D,0x48,0x0A,0x99,0x30,0x38,0x19,0x54,0x52,0x1C,0x08,0x2A,0x8E,0xDB, + 0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43, + 0xF8,0x80,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x07,0x00,0x20,0x30,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0xF0,0xB5,0x70,0x48,0xB1,0xB0,0x00,0x78,0x71,0x4B,0x70,0x4A, + 0x01,0x90,0x6E,0x48,0x00,0x78,0x00,0x90,0xD9,0x88,0x16,0x7D,0x6E,0x48,0x4C,0x06, + 0x00,0xD4,0x06,0x7C,0x55,0x7D,0x49,0x06,0x00,0xD4,0x45,0x7C,0x6B,0x48,0x00,0x21, + 0x2B,0x95,0x30,0x90,0xC1,0x81,0x50,0x22,0x16,0xA8,0x2A,0x91,0x03,0xF0,0x9C,0xF9, + 0x01,0x99,0x2B,0x98,0x2B,0x9D,0x08,0x1A,0xAD,0x1C,0x2F,0x90,0x80,0x1C,0x2E,0x90, + 0x35,0xE0,0x00,0x98,0x16,0xA9,0x80,0x1B,0x80,0x1C,0x86,0x46,0x2B,0x98,0xB4,0x1C, + 0x28,0x1A,0x80,0x00,0x47,0x18,0x40,0x3F,0x1E,0xE0,0x01,0x98,0x5C,0x49,0x00,0x1D, + 0x60,0x43,0x40,0x19,0x00,0x04,0x00,0x14,0x40,0x00,0x0A,0x5E,0x55,0x4B,0x68,0x00, + 0xC0,0x18,0x94,0x21,0x41,0x5E,0x60,0x00,0xC3,0x18,0x6C,0x20,0x18,0x5E,0x2A,0x9B, + 0x94,0x46,0xC3,0x18,0x52,0x18,0xD2,0x18,0x2A,0x92,0xBB,0x6B,0x62,0x46,0x9A,0x18, + 0x08,0x18,0x10,0x18,0x64,0x1C,0xB8,0x63,0xA6,0x45,0xDE,0xDC,0x00,0x98,0x71,0x00, + 0x41,0x1A,0xB8,0x6B,0xFE,0xF7,0xE4,0xFB,0xB8,0x63,0x2E,0x98,0x6D,0x1C,0xA8,0x42, + 0xC7,0xDC,0x00,0x99,0x70,0x00,0x09,0x1A,0x2B,0x98,0x2D,0x91,0x42,0x00,0x01,0x98, + 0x80,0x1A,0x41,0x43,0x2C,0x90,0x2A,0x98,0xFE,0xF7,0xD2,0xFB,0x30,0x99,0x50,0x22, + 0xC8,0x81,0x00,0x20,0x01,0x00,0x2A,0x90,0x02,0xA8,0x03,0xF0,0x45,0xF9,0x2B,0x9C, + 0xA4,0x1C,0x35,0xE0,0x00,0x99,0x02,0xAA,0x89,0x1B,0x89,0x1C,0x8E,0x46,0x2B,0x99, + 0xB0,0x1C,0x61,0x1A,0x89,0x00,0x8D,0x18,0x40,0x3D,0x8C,0x46,0x1C,0xE0,0x01,0x99, + 0x33,0x4A,0x09,0x1D,0x41,0x43,0x09,0x19,0x49,0x00,0x51,0x5E,0x16,0xAA,0x62,0x44, + 0x40,0x3A,0x92,0x6B,0x2B,0x4F,0x89,0x1A,0x62,0x00,0xD3,0x19,0x94,0x22,0x9A,0x5E, + 0x43,0x00,0xDB,0x19,0x6C,0x27,0xDF,0x5F,0xD2,0x19,0x89,0x18,0x0B,0x00,0x4B,0x43, + 0xAA,0x6B,0xD1,0x18,0x40,0x1C,0xA9,0x63,0x86,0x45,0xE0,0xDC,0x2D,0x99,0xA8,0x6B, + 0x49,0x1E,0xFE,0xF7,0x95,0xFB,0xA8,0x63,0x2A,0x99,0x40,0x18,0x64,0x1C,0x2A,0x90, + 0x2E,0x98,0xA0,0x42,0xC6,0xDC,0x2C,0x99,0x2A,0x98,0xFE,0xF7,0x89,0xFB,0x30,0x99, + 0x00,0x22,0x0A,0x61,0x11,0x00,0x02,0xAB,0x0A,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A, + 0x14,0x00,0x54,0x43,0x30,0x9A,0x12,0x69,0xA2,0x18,0x30,0x9C,0x49,0x1C,0x22,0x61, + 0x2C,0x9A,0x8A,0x42,0xF1,0xDC,0x30,0x98,0x51,0x1E,0x00,0x69,0xFE,0xF7,0x70,0xFB, + 0x00,0x9A,0x2F,0x99,0x92,0x1B,0x92,0x02,0x51,0x43,0xFE,0xF7,0x69,0xFB,0x30,0x99, + 0x08,0x61,0x30,0x99,0x0E,0x20,0x08,0x5E,0x00,0x28,0x01,0xD1,0x40,0x1C,0xC8,0x81, + 0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0xF8,0xB5,0x61,0x4D,0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B, + 0x00,0x04,0x00,0x0C,0x05,0xF0,0x32,0xF8,0x05,0xF0,0x20,0xF8,0x01,0x24,0x64,0x03, + 0x20,0x00,0xFE,0xF7,0x55,0xFF,0x04,0xF0,0x05,0xFC,0x20,0x00,0xFE,0xF7,0x48,0xFF, + 0x57,0x4C,0x00,0x26,0x9C,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x07,0xD5,0xC0,0x68, + 0x00,0x28,0x04,0xD0,0x53,0x48,0xC1,0x68,0xC0,0x03,0xC1,0x63,0x95,0xE0,0x28,0x7A, + 0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x0F,0xF8,0xFF,0x20, + 0x81,0x30,0xFE,0xF7,0x35,0xFF,0x03,0x20,0x04,0xF0,0x46,0xFF,0x03,0xF0,0xF0,0xFE, + 0x49,0x4F,0xF8,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5, + 0x04,0x20,0x00,0xE0,0x02,0x20,0x04,0xF0,0x13,0xFE,0x00,0xF0,0xCD,0xFB,0x04,0xF0, + 0xF7,0xFB,0x00,0xF0,0x97,0xFB,0x00,0xF0,0x45,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1, + 0x20,0x7B,0x00,0x28,0x01,0xD0,0x03,0xF0,0xDF,0xFE,0x20,0x7A,0x00,0x28,0x01,0xD0, + 0x03,0xF0,0x80,0xF8,0x01,0x20,0x40,0x05,0x00,0xF0,0x6A,0xFB,0x03,0xF0,0x96,0xF8, + 0x00,0x28,0x01,0xD0,0x01,0x20,0x28,0x70,0x00,0x20,0x00,0xF0,0x61,0xFB,0x28,0x78, + 0x00,0x28,0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x57,0xF9,0x03,0xF0, + 0xAB,0xFE,0x28,0x78,0x00,0x28,0x04,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x44,0xD1, + 0x2E,0x70,0x03,0x20,0x04,0xF0,0xDA,0xFE,0xE8,0x62,0x03,0x20,0x04,0xF0,0x08,0xFF, + 0xFF,0x20,0x81,0x30,0xFE,0xF7,0xDC,0xFE,0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E, + 0xF8,0x83,0x2D,0xE0,0xFF,0xF7,0x9E,0xFC,0x00,0x28,0x29,0xD0,0x6F,0x6A,0x00,0x2F, + 0x26,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x1C,0x49,0xFE,0xF7,0x92,0xFB, + 0x38,0x1A,0x14,0x28,0x1C,0xDD,0x04,0xF0,0xAF,0xFF,0x04,0xF0,0xB3,0xFF,0xA8,0x79, + 0x00,0x28,0x0D,0xD0,0x03,0xF0,0x56,0xFE,0x03,0xF0,0x59,0xFE,0x03,0xF0,0x61,0xFE, + 0x13,0x4D,0x01,0x20,0x68,0x60,0xFE,0xF7,0xC3,0xFE,0x12,0x48,0x68,0x60,0x03,0xE0, + 0x11,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x04,0xF0,0xA3,0xFF,0x0E,0x48,0x06,0x70, + 0x06,0x4D,0x28,0x78,0x00,0x28,0x00,0xD1,0x5D,0xE7,0x04,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x73,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20, + 0x80,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x10,0xB4,0x0F,0x4B, + 0x00,0x22,0xD2,0x43,0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C, + 0x24,0x33,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52, + 0x22,0x00,0x12,0x32,0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52, + 0x51,0x18,0x40,0x1E,0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCA,0x0B,0x00,0x20, + 0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21,0x02,0xF0,0xCE,0xFF,0x0A,0x48,0x5A,0x22, + 0x00,0x21,0x02,0xF0,0xC9,0xFF,0x08,0x48,0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48, + 0x28,0x22,0x21,0x00,0x02,0xF0,0xC0,0xFF,0x04,0x48,0x4E,0x38,0x44,0x75,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x6B,0x08,0x00,0x20,0x54,0x07,0x00,0x20,0x7E,0x0A,0x00,0x20, + 0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21,0x02,0xF0,0xAE,0xFF,0x14,0x48,0x12,0x22, + 0x00,0x21,0x12,0x30,0x02,0xF0,0xA8,0xFF,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30, + 0x02,0xF0,0xA2,0xFF,0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0x02,0xF0,0x9C,0xFF, + 0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30,0x02,0xF0,0x96,0xFF,0x08,0x48,0x10,0x22, + 0x00,0x21,0x62,0x30,0x02,0xF0,0x90,0xFF,0x05,0x49,0x00,0x20,0x74,0x31,0xC8,0x82, + 0xFF,0x39,0x41,0x39,0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBC,0x06,0x00,0x20,0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x8F,0x7B,0xF1,0x88,0x49,0x06, + 0x02,0xD4,0x1B,0x49,0xC0,0x39,0x8F,0x7A,0x08,0x21,0x00,0x24,0x42,0x00,0x0B,0x01, + 0x9B,0x19,0x15,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19,0xEC,0x82,0x0D,0x25,0xAD,0x01, + 0x5B,0x19,0x49,0x1E,0xDC,0x80,0xF2,0xD5,0x15,0x25,0x31,0x18,0x6D,0x01,0x01,0x23, + 0x4D,0x19,0xAB,0x73,0x0F,0x25,0x93,0x19,0xAD,0x01,0x5B,0x19,0xDC,0x82,0x1F,0x23, + 0x5B,0x01,0xC9,0x18,0x8F,0x71,0x8C,0x73,0x02,0x21,0x0D,0x01,0xAD,0x19,0xAD,0x18, + 0xED,0x18,0x49,0x1E,0xEC,0x82,0xF8,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x21,0x20, + 0xC9,0x43,0x40,0x01,0x10,0x18,0xC1,0x80,0x01,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x10,0xB5,0x04,0x48,0x20,0x22,0x00,0x21, + 0x02,0xF0,0x3A,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7E,0x08,0x00,0x20, + 0x10,0xB5,0x04,0xF0,0x1B,0xFE,0x03,0xF0,0xDD,0xFD,0xFF,0xF7,0x59,0xFF,0x03,0xF0, + 0x0F,0xFF,0x01,0xF0,0x57,0xFD,0x01,0xF0,0xD1,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x10,0xB4,0x0D,0x4C,0x0B,0x4B,0xE4,0x88,0x1B,0x7F,0x64,0x06,0x02,0xD4,0x09,0x4B, + 0xC0,0x3B,0x1B,0x7E,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42, + 0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00, + 0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xF7,0xB5,0x62,0x48, + 0xCA,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0,0x01,0x20,0x47,0x90,0x00,0x20,0x02,0xE0, + 0x00,0x20,0x47,0x90,0x01,0x20,0x46,0x90,0x5C,0x48,0x00,0x26,0x49,0x90,0x5C,0x48, + 0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A, + 0x01,0x91,0x80,0x8B,0x45,0x90,0x57,0x48,0x00,0x7A,0x48,0x96,0x00,0x90,0x6B,0xE0, + 0x00,0x24,0x64,0xE0,0x68,0x43,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x52,0xF9, + 0x4D,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4F,0x4A,0x52,0x79,0x00,0x2A, + 0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D, + 0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0, + 0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42, + 0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E, + 0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18, + 0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x80,0x1A,0x49,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0x4B,0x9B,0x12,0x0C,0x00,0x2B, + 0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x4A,0x9B,0x05,0x2B, + 0x0E,0xD8,0x90,0x42,0x01,0xDA,0x47,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x46,0x9A, + 0x21,0x00,0x28,0x00,0x00,0xF0,0x80,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0, + 0x48,0x99,0x05,0xA8,0x47,0x54,0x48,0x98,0x40,0x1C,0x48,0x90,0x64,0x1C,0x22,0x49, + 0xC8,0x78,0x84,0x42,0x96,0xDB,0x6D,0x1C,0x1F,0x48,0x01,0x79,0x8D,0x42,0x8F,0xDB, + 0x4A,0x98,0x05,0x28,0x03,0xD9,0x00,0x04,0x48,0x9E,0x00,0x0C,0x45,0x90,0x00,0x2E, + 0x25,0xDD,0x4C,0x98,0x00,0x28,0x22,0xD1,0x00,0xF0,0x5A,0xF9,0x00,0xF0,0x7A,0xF9, + 0x00,0xF0,0x28,0xFA,0x76,0x1E,0x14,0xD4,0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00, + 0x49,0x98,0x80,0x58,0x01,0x05,0x45,0x98,0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C, + 0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04,0x08,0x43,0x49,0x99,0x76,0x1E,0x88,0x50, + 0xEC,0xD5,0x00,0xF0,0x35,0xF9,0x00,0xF0,0x5D,0xF9,0x00,0xF0,0x0B,0xFA,0x4D,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00,0x00,0x02,0x10,0x40, + 0xE0,0x7A,0x00,0x00,0x70,0x0A,0x00,0x20,0xF8,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0xF0,0xB5,0x01,0x26,0x76,0x07,0x30,0x68,0x01,0x28,0x1D,0xD1,0x74,0x68,0xA1,0x05, + 0xA0,0x01,0x89,0x0D,0x80,0x0D,0x0D,0x00,0x07,0x00,0x03,0xF0,0x83,0xFF,0x41,0x1C, + 0x12,0xD0,0x0B,0x4A,0x80,0x00,0x81,0x18,0x49,0x88,0x10,0x5A,0xA3,0x0A,0x49,0x19, + 0x49,0x05,0x89,0x0D,0x9B,0x02,0xC0,0x19,0x06,0x4A,0x40,0x08,0x19,0x43,0x80,0x05, + 0x80,0x09,0x11,0x40,0x08,0x43,0x70,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xB8,0x70,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x30,0xB4,0x17,0x4D,0x15,0x4C,0x2D,0x78, + 0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B, + 0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A, + 0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C, + 0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A, + 0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0xF0,0xB5,0x5A,0x48, + 0x8F,0xB0,0x06,0x78,0x59,0x48,0x5B,0x4A,0x05,0x96,0x07,0x78,0x58,0x48,0x06,0x97, + 0x0E,0x90,0x80,0x7E,0x0D,0x92,0xC1,0x07,0x09,0xD0,0x80,0x07,0x04,0xD5,0x70,0x1E, + 0x05,0x90,0x03,0x20,0x10,0x71,0x02,0xE0,0x7F,0x1E,0x00,0x21,0x11,0x71,0x52,0x48, + 0x0A,0x22,0x01,0x8C,0x51,0x43,0x09,0x04,0x09,0x0C,0x02,0x91,0x40,0x8C,0x50,0x43, + 0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0,0x00,0x2F,0x7C,0xD0, + 0x41,0x00,0x02,0x98,0xFE,0xF7,0x2C,0xF8,0x05,0x04,0x2D,0x0C,0x00,0x24,0xB6,0x1C, + 0x0A,0xE0,0x02,0x98,0x05,0x99,0x60,0x43,0xFE,0xF7,0x22,0xF8,0x43,0x4A,0x61,0x00, + 0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xB4,0x42,0xF2,0xDB,0x01,0x98,0x79,0x00, + 0xFE,0xF7,0x16,0xF8,0x06,0x04,0x06,0x98,0x36,0x0C,0x00,0x24,0x80,0x1C,0x0C,0x90, + 0x0C,0xE0,0x01,0x98,0x39,0x00,0x60,0x43,0xFE,0xF7,0x0A,0xF8,0x37,0x4A,0x81,0x19, + 0x60,0x00,0x80,0x18,0x40,0x30,0x81,0x80,0x0C,0x98,0x64,0x1C,0x84,0x42,0xF0,0xDB, + 0x0E,0x98,0x80,0x7E,0xC0,0x07,0x53,0xD0,0x00,0x24,0x4D,0xE0,0x2F,0x4A,0x09,0x21, + 0x10,0x19,0xC9,0x01,0x40,0x18,0x41,0x7A,0x0E,0x98,0x80,0x7E,0x80,0x07,0x03,0xD5, + 0x05,0x98,0x03,0x95,0x04,0x91,0x02,0xE0,0x08,0x00,0x03,0xA9,0xC0,0xC1,0x27,0x49, + 0x40,0x00,0x40,0x18,0x0B,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7,0xE0,0xFF, + 0x22,0x4A,0xE1,0x00,0x89,0x18,0x11,0x22,0x92,0x01,0x0A,0x91,0x89,0x18,0x09,0x91, + 0x88,0x83,0x04,0x98,0x1D,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x08,0x90,0x80,0x88, + 0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xCC,0xFF,0x09,0x99,0xC8,0x83,0x0B,0x98,0x0A,0x21, + 0x00,0x8C,0x40,0x19,0xFE,0xF7,0x9E,0xF8,0x0A,0x99,0x23,0x22,0x52,0x01,0x89,0x18, + 0x07,0x91,0x08,0x80,0x08,0x98,0x0A,0x21,0x80,0x88,0x80,0x19,0xFE,0xF7,0x92,0xF8, + 0x07,0x99,0x48,0x80,0x03,0x98,0x40,0x00,0x00,0xE0,0x09,0xE0,0x0A,0x21,0xFE,0xF7, + 0x89,0xF8,0x0D,0x99,0x64,0x1C,0xC8,0x80,0x0E,0x98,0xC0,0x7E,0xA0,0x42,0xAD,0xDC, + 0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x03,0x49,0xCA,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0x02,0x43,0xCA,0x61,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x01,0x22,0x10,0xB5,0x08,0x49,0x09,0x48,0x52,0x02,0x02,0xF0,0xCA,0xFC,0x08,0x48, + 0x01,0x22,0xC0,0x8E,0x92,0x02,0x01,0x04,0x01,0x43,0x06,0x48,0x02,0xF0,0xD4,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22, + 0x02,0xF0,0x9F,0xFC,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32,0x02,0xF0,0x99,0xFC, + 0x01,0x22,0x08,0x49,0x08,0x48,0x52,0x02,0x02,0xF0,0x93,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x04,0x7B,0x00,0x00,0x04,0x90,0x00,0x40,0x00,0x7C,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xE3,0xFF,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0xE5,0xFF,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xD4,0xFF,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xD6,0xFF,0x0C,0x48,0x00,0x22,0x04,0x04,0x24,0x0C, + 0x29,0x00,0x20,0x00,0xFD,0xF7,0xC6,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00,0x00,0x23, + 0xFD,0xF7,0xC8,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0x00,0x7B,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00, + 0x00,0x06,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7, + 0x7F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x55,0x4E, + 0x53,0x4B,0xF2,0x88,0x98,0x88,0x54,0x49,0x54,0x06,0x82,0xB0,0x00,0xD4,0x08,0x88, + 0x52,0x06,0x01,0x90,0x98,0x79,0x00,0xD4,0x88,0x78,0x37,0x00,0x00,0x25,0x01,0x00, + 0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0xFF,0x37,0x61,0x37,0x00,0x90,0x11,0xE0, + 0x0A,0x20,0x60,0x43,0x43,0x21,0x80,0x19,0xC9,0x00,0x09,0x5C,0x00,0x29,0x08,0xD0, + 0x46,0x49,0x40,0x18,0x01,0xF0,0x66,0xF9,0x00,0x28,0x02,0xD0,0x6D,0x1C,0x2D,0x06, + 0x2D,0x0E,0x64,0x1C,0xB8,0x78,0xA0,0x42,0xEA,0xDA,0x41,0x49,0x08,0x00,0x20,0x30, + 0xCA,0x8B,0x43,0x88,0xD4,0x1A,0x00,0x2C,0x00,0xDC,0x9C,0x1A,0x22,0x04,0x03,0x88, + 0x84,0x88,0x12,0x0C,0x1F,0x1B,0x00,0x2F,0x00,0xDC,0xE7,0x1A,0x84,0x7A,0x3B,0x04, + 0x1B,0x0C,0x00,0x2C,0x04,0xD0,0x44,0x7B,0xC8,0x2C,0x01,0xD2,0x64,0x1C,0x44,0x73, + 0x8C,0x7B,0x14,0x2C,0x04,0xD2,0x0C,0x7C,0x00,0x2C,0x01,0xD0,0x01,0x24,0x4C,0x74, + 0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7B,0xC8,0x2C,0x01,0xD2,0x64,0x1C, + 0xCC,0x73,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B,0x05,0xD2,0x08,0x24, + 0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x08,0x24,0x04,0x5F,0xE7,0x1C, + 0x01,0xDD,0x64,0x1E,0x04,0x81,0x44,0x7B,0x01,0x2C,0x01,0xD9,0x78,0x21,0x10,0xE0, + 0x02,0x2D,0x0F,0xD2,0x08,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD,0xC9,0x7B,0x14,0x29, + 0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B,0x02,0xD2,0x77,0x21, + 0xC9,0x43,0xC1,0x80,0x00,0x21,0x02,0x2D,0x01,0x73,0x0E,0xD2,0x06,0x21,0x41,0x5E, + 0x78,0x31,0x04,0xD1,0xC1,0x7A,0xC8,0x29,0x01,0xD2,0x49,0x1C,0xC1,0x72,0xC1,0x7A, + 0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x73,0x06,0x21,0x41,0x5E,0x01,0x98, + 0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1,0x31,0x79,0x01,0x29, + 0x02,0xD0,0x00,0x99,0xFD,0xF7,0x0C,0xFE,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0x1E,0x02,0x00,0x00, + 0x70,0x08,0x00,0x20,0xFF,0x21,0x03,0x31,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1, + 0x70,0x47,0x15,0x21,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1,0x70,0x47,0x00,0x00, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0xFE,0xB5,0x1E,0x4A,0x1C,0x48,0xD1,0x88,0x00,0x25,0x00,0x7A, + 0x2E,0x00,0x2F,0x00,0x49,0x06,0x02,0xD4,0x18,0x48,0xC0,0x38,0x00,0x79,0x19,0x49, + 0x89,0x8A,0x40,0x18,0x01,0x06,0x18,0x48,0x09,0x0E,0x00,0x78,0x00,0x28,0x01,0x90, + 0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0,0x0A,0x20,0x60,0x43,0x10,0x49, + 0x40,0x18,0xFF,0x30,0x61,0x30,0x80,0x7A,0x14,0x28,0x01,0xD2,0x01,0x26,0x07,0xE0, + 0x01,0x27,0x14,0x21,0xFD,0xF7,0x96,0xFE,0x00,0x99,0x88,0x42,0x00,0xD3,0x01,0x25, + 0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F,0x02,0xD1,0x00,0x2E,0x00,0xD0, + 0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0x9F,0xFA,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x5B,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0xF8,0x0A,0x00,0x20,0xF1,0xB5,0x61,0x48,0x2E,0x21,0x90,0xB0, + 0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63, + 0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0,0x75,0xFA,0x59,0x4D, + 0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x41,0xFA,0x10,0x9B,0x00,0x21,0x01,0x20, + 0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0x7A,0xFA,0x1E,0x16,0x40,0x40, + 0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x40,0x4F,0x68,0x6F,0x76, + 0x7D,0x85,0x40,0x8C,0x93,0x4F,0x40,0x40,0x40,0x40,0x9A,0x40,0x0B,0x20,0xF0,0x63, + 0x4D,0xE0,0x00,0xF0,0x19,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7, + 0x4F,0xF9,0x00,0xF0,0x45,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68,0x52,0x68,0x91,0x42, + 0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83, + 0xFD,0xF7,0xC0,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7,0x21,0xFE,0xA8,0x78, + 0x80,0x07,0x01,0xD5,0x04,0xF0,0xB8,0xF9,0x3A,0x49,0x40,0x22,0x68,0x46,0x02,0xF0, + 0x88,0xFA,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0xC6,0xF9,0xF7,0x63,0x1E,0xE0, + 0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20, + 0x00,0xE0,0x00,0x20,0x04,0xF0,0x4E,0xF8,0xF0,0xE7,0x03,0x21,0x09,0x07,0xCA,0x60, + 0xFE,0xF7,0x16,0xF9,0x10,0x98,0xFE,0xF7,0x69,0xF8,0x08,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x0D,0xF9,0x00,0xF0,0x83,0xFD,0x00,0xF0,0xEF,0xF8,0x20,0x48, + 0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xA8,0x71,0xD2,0xE7,0xA9,0x71,0xD0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0xE8,0x71,0xCB,0xE7,0xE9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x72, + 0xC4,0xE7,0x29,0x72,0xC2,0xE7,0x00,0x2C,0x03,0xD0,0x20,0x0C,0x6C,0x72,0x28,0x82, + 0xBC,0xE7,0x69,0x72,0xBA,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72,0xB5,0xE7, + 0xA9,0x72,0xB3,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xAE,0xE7,0xE9,0x72, + 0xAC,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA7,0xE7,0x29,0x73,0xA5,0xE7, + 0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x03,0xF0,0x73,0xFE,0x9D,0xE7, + 0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00, + 0xE0,0x7A,0x00,0x00,0xC0,0x75,0x00,0x00,0xF0,0xB5,0x38,0x4F,0x35,0x4C,0xF9,0x78, + 0x03,0x00,0x35,0x4A,0x0E,0x04,0x39,0x79,0x35,0x48,0x25,0x68,0x0E,0x43,0x35,0x49, + 0x30,0x3B,0x04,0xF0,0xBD,0xF9,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E, + 0x20,0x30,0x3B,0x16,0x3E,0x43,0x48,0x4E,0x51,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68, + 0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04, + 0x35,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68, + 0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48,0x03,0x7A,0x10,0x7D,0x52,0x7D,0xC4,0x07, + 0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43, + 0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D, + 0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06, + 0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7,0x00,0x69,0xFA,0x89, + 0x40,0x08,0x00,0x02,0x03,0xE0,0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43, + 0xC1,0xE7,0x00,0x69,0x40,0x08,0xBE,0xE7,0xB8,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42, + 0xFC,0xD1,0x03,0xF0,0x51,0xF9,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00,0x00,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20, + 0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20,0x70,0x0A,0x00,0x20, + 0x00,0x7B,0x00,0x00,0xE0,0x7A,0x00,0x00,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68, + 0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x51,0xF8,0x06,0x00,0xCB,0x20,0xC0,0x01, + 0xFE,0xF7,0x2E,0xF8,0x02,0xF0,0xEC,0xFF,0x01,0x20,0x40,0x05,0xFF,0xF7,0x88,0xFC, + 0x00,0xF0,0xBC,0xFC,0x00,0x20,0xFF,0xF7,0x83,0xFC,0x02,0xF0,0xD5,0xFF,0x30,0x00, + 0xFE,0xF7,0x50,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21, + 0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x02,0xF0,0xD2,0xFF,0x00,0x20,0xFF,0xF7, + 0x6F,0xFC,0xFF,0xF7,0xED,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20, + 0x40,0x07,0x04,0xF0,0x13,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0xF8,0xB5,0x27,0x49,0x25,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06,0x02,0xD4,0x23,0x48, + 0xC0,0x38,0x80,0x89,0xC0,0x06,0x3D,0xD5,0x22,0x4E,0x30,0x78,0x00,0x28,0x39,0xD0, + 0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25,0x31,0xE0,0x0A,0x21,0x69,0x43,0x1C,0x4B, + 0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78,0x61,0x34,0x25,0xE0,0x0A,0x22,0x42,0x43, + 0xD2,0x18,0xFF,0x32,0xA1,0x32,0x21,0x79,0x92,0x7F,0x91,0x42,0x1B,0xD1,0x0A,0x22, + 0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21,0xC1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E, + 0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x88, + 0xE1,0x88,0xFF,0xF7,0x05,0xFA,0xE0,0x80,0x7A,0x88,0x21,0x89,0x00,0x98,0xFF,0xF7, + 0xFF,0xF9,0x20,0x81,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD7,0xDA,0x6D,0x1C,0x30,0x78, + 0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0xB5,0x00,0x20,0xB1,0xB0,0x11,0x90, + 0x10,0x90,0x0F,0x90,0x0E,0x90,0xFA,0x48,0xFB,0x4D,0x01,0x8C,0xF9,0x4A,0x0B,0x91, + 0x40,0x8C,0xFA,0x49,0x0A,0x90,0xE8,0x88,0x13,0x7B,0x44,0x06,0x00,0xD4,0x0B,0x7A, + 0x54,0x7B,0x46,0x06,0x00,0xD4,0x4C,0x7A,0x46,0x06,0x09,0x94,0x94,0x7E,0x00,0xD4, + 0x8C,0x7D,0x46,0x06,0x08,0x94,0x54,0x7E,0x00,0xD4,0x4C,0x7D,0x07,0x94,0xEF,0x4C, + 0x40,0x34,0x24,0x8A,0x46,0x06,0x02,0xD4,0xEC,0x4C,0x80,0x3C,0xA4,0x89,0x24,0x07, + 0x42,0xD5,0xD4,0x7B,0x46,0x06,0x00,0xD4,0xCC,0x7A,0x5C,0x43,0x26,0x94,0x14,0x7C, + 0x46,0x06,0x00,0xD4,0x0C,0x7B,0x5C,0x43,0x25,0x94,0x54,0x7C,0x46,0x06,0x00,0xD4, + 0x4C,0x7B,0x5C,0x43,0x24,0x94,0x94,0x7C,0x46,0x06,0x00,0xD4,0x8C,0x7B,0x5C,0x43, + 0x23,0x94,0xD4,0x7C,0x46,0x06,0x00,0xD4,0xCC,0x7B,0x5C,0x43,0x22,0x94,0x14,0x7D, + 0x46,0x06,0x00,0xD4,0x0C,0x7C,0x5C,0x43,0x21,0x94,0x54,0x7D,0x46,0x06,0x00,0xD4, + 0x4C,0x7C,0x5C,0x43,0x20,0x94,0x94,0x7D,0x46,0x06,0x00,0xD4,0x8C,0x7C,0x5C,0x43, + 0x1F,0x94,0xD4,0x7D,0x46,0x06,0x00,0xD4,0xCC,0x7C,0x5C,0x43,0x1E,0x94,0x12,0x7E, + 0x40,0x06,0x00,0xD4,0x0A,0x7D,0xCE,0x48,0x5A,0x43,0x1D,0x92,0x30,0x90,0x00,0x78, + 0x00,0x28,0x05,0xD1,0x00,0xF0,0xCE,0xFE,0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x27,0x90,0xC7,0x48,0x2F,0x90,0xC3,0x4D,0x27,0x98,0x13,0x21,0x28,0x18, + 0x49,0x01,0x2E,0x90,0x40,0x18,0x04,0x7F,0x00,0x2C,0x0F,0xD0,0x08,0x98,0x00,0x28, + 0x08,0xD1,0x0A,0x20,0x60,0x43,0x40,0x19,0xFF,0x30,0x6B,0x30,0x00,0xF0,0xE2,0xFD, + 0x00,0x28,0x03,0xD0,0x2F,0x98,0x00,0x7B,0x00,0x28,0x03,0xD0,0x27,0x98,0xFF,0xF7, + 0xF9,0xF8,0xA0,0xE2,0x27,0x99,0x15,0x27,0x07,0x20,0x7F,0x01,0x4E,0x00,0x01,0x01, + 0x49,0x19,0x89,0x19,0xCA,0x19,0xD2,0x8A,0x0B,0x23,0x9B,0x01,0xCB,0x18,0xDA,0x80, + 0x0D,0x22,0x92,0x01,0x89,0x18,0xCA,0x88,0x40,0x1E,0xCA,0x82,0xEF,0xD5,0x0A,0x20, + 0x44,0x43,0x64,0x19,0x2D,0x94,0xFF,0x34,0x61,0x34,0xE1,0x88,0x0B,0x98,0x40,0x1E, + 0x81,0x42,0xDE,0xDC,0x21,0x89,0x0A,0x98,0x40,0x1E,0x81,0x42,0xD9,0xDC,0xA2,0x48, + 0xE1,0x88,0x35,0x18,0xE8,0x19,0x2C,0x90,0x0D,0x23,0xC1,0x82,0x21,0x89,0x9B,0x01, + 0xE8,0x18,0x2B,0x90,0xC1,0x80,0x00,0x20,0x01,0x21,0xC9,0x02,0x06,0x90,0x05,0x90, + 0x07,0x20,0x04,0x91,0x98,0x4A,0x03,0x01,0x9A,0x18,0x92,0x19,0x15,0x23,0x5B,0x01, + 0x94,0x46,0xD2,0x18,0x16,0x23,0xD3,0x5E,0x00,0x2B,0x07,0xDD,0x06,0x9F,0xBB,0x42, + 0x01,0xDD,0xD7,0x8A,0x06,0x97,0x8B,0x42,0x00,0xDA,0xD1,0x8A,0x0D,0x23,0x9B,0x01, + 0x62,0x46,0xD2,0x18,0x06,0x23,0xD3,0x5E,0x00,0x2B,0x09,0xDD,0x05,0x9F,0xBB,0x42, + 0x01,0xDD,0xD7,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x01,0xDA,0xD2,0x88,0x04,0x92, + 0x40,0x1E,0xD7,0xD5,0x06,0x98,0x40,0x1A,0xF0,0x28,0x04,0xDC,0x04,0x99,0x05,0x98, + 0x40,0x1A,0xF0,0x28,0x02,0xDD,0x2F,0x99,0x01,0x20,0x88,0x72,0x2E,0x98,0x15,0x21, + 0x49,0x01,0x40,0x18,0x2A,0x90,0x80,0x7B,0x01,0x28,0x1B,0xD9,0x2C,0x98,0x16,0x21, + 0x41,0x5E,0x0B,0x20,0x80,0x01,0x28,0x18,0x06,0x22,0x82,0x5E,0x88,0x1A,0x00,0x28, + 0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14,0x0D,0x90,0x2B,0x98,0x06,0x21,0x16,0x22, + 0x41,0x5E,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14, + 0x0C,0x90,0x02,0xE0,0x64,0x20,0x0C,0x90,0x0D,0x90,0x0B,0x20,0x80,0x01,0x2F,0x18, + 0x2C,0x9A,0x06,0x21,0x16,0x20,0x79,0x5E,0x10,0x5E,0x02,0xF0,0x83,0xFF,0x13,0x90, + 0x2B,0x98,0x16,0x21,0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x02,0xF0,0x7A,0xFF, + 0x12,0x90,0x16,0x21,0x79,0x5E,0x13,0x98,0x02,0xF0,0x74,0xFF,0x15,0x90,0x1B,0x20, + 0x40,0x01,0x28,0x18,0x06,0x21,0x29,0x90,0x41,0x5E,0x12,0x98,0x02,0xF0,0x6A,0xFF, + 0x14,0x90,0x17,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E, + 0x15,0x98,0x02,0xF0,0x61,0xFF,0x00,0x04,0x00,0x14,0x17,0x90,0x07,0x20,0xC0,0x01, + 0x2F,0x18,0x29,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x14,0x98,0x02,0xF0, + 0x53,0xFF,0x00,0x04,0x00,0x14,0x16,0x90,0x03,0x20,0x00,0x02,0x28,0x18,0x16,0x22, + 0x06,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x02,0xF0,0x46,0xFF,0x00,0x04,0x00,0x14, + 0x19,0x90,0x1D,0x20,0x40,0x01,0x28,0x18,0x28,0x90,0x06,0x22,0x82,0x5E,0x16,0x21, + 0x79,0x5E,0x16,0x98,0x02,0xF0,0x38,0xFF,0x00,0x04,0x00,0x14,0x18,0x90,0x19,0x20, + 0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x19,0x98,0x02,0xF0, + 0x2B,0xFF,0x00,0x04,0x00,0x14,0x1B,0x90,0x0F,0x20,0x80,0x01,0x2F,0x18,0x28,0x98, + 0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x18,0x98,0x02,0xF0,0x1D,0xFF,0x00,0x04, + 0x00,0x14,0x1A,0x90,0x0C,0x99,0x0D,0x98,0x00,0xF0,0xE0,0xFF,0x01,0x21,0x84,0x46, + 0x88,0x02,0x2D,0x4B,0x0A,0x01,0xD2,0x18,0x93,0x19,0x1F,0x22,0x52,0x01,0x9A,0x18, + 0xD2,0x8A,0x1B,0x18,0x49,0x1E,0xDA,0x80,0xF3,0xD5,0x1F,0x21,0x49,0x01,0x6A,0x18, + 0x60,0x46,0xD0,0x82,0x2E,0x9A,0x00,0x20,0x55,0x18,0xAA,0x7B,0x00,0x2A,0x94,0x46, + 0x0B,0xDB,0x21,0x4B,0x11,0x01,0xC9,0x18,0x1F,0x23,0x89,0x19,0x5B,0x01,0xCB,0x18, + 0x16,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF3,0xD5,0x61,0x46,0x49,0x1C,0xFD,0xF7, + 0xC7,0xF9,0x25,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0,0x23,0x98, + 0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x21,0x98,0x86,0x42,0x01,0xDC,0x03,0x20, + 0x05,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20,0xA9,0x79, + 0x40,0x1A,0x09,0x99,0x49,0x42,0x00,0x28,0x08,0xDD,0x16,0x20,0x38,0x5E,0x09,0x9B, + 0x98,0x42,0x01,0xD1,0x00,0x20,0x08,0xE0,0x40,0x1C,0x06,0xE0,0x00,0x28,0x0A,0x48, + 0x38,0x5E,0x13,0xDA,0x88,0x42,0xF5,0xD0,0x40,0x1E,0xF8,0x82,0x11,0xE0,0x00,0x00, + 0x00,0x78,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0x50,0x07,0x00,0x20,0x90,0x08,0x00,0x20,0x16,0x00,0x00,0x00,0x00,0x28,0xEB,0xDC, + 0xE2,0xDB,0x16,0x20,0x38,0x5E,0x09,0x9B,0x98,0x42,0x05,0xD1,0xAB,0x79,0x05,0x2B, + 0x02,0xD2,0x5B,0x1C,0xAB,0x71,0x06,0xE0,0x88,0x42,0x04,0xD1,0xA8,0x79,0x01,0x28, + 0x01,0xD9,0x40,0x1E,0xA8,0x71,0x1A,0x99,0x1B,0x98,0x1C,0x91,0x2A,0x99,0x8F,0x7B, + 0x39,0x00,0xFD,0xF7,0x6D,0xF9,0x11,0x90,0x0F,0x90,0x1C,0x98,0x39,0x00,0xFD,0xF7, + 0x67,0xF9,0x10,0x90,0x0E,0x90,0xA8,0x79,0x01,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9, + 0x6B,0x46,0x06,0xC3,0x1A,0x9B,0x1B,0x9A,0x09,0x21,0x38,0x00,0x03,0xF0,0x3C,0xFB, + 0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x18,0x9B,0x80,0x7B,0x19,0x9A, + 0x07,0x21,0x03,0xF0,0x31,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E, + 0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x25,0x9B, + 0x00,0x92,0x2D,0x98,0x26,0x9A,0xFF,0x30,0x65,0x30,0x9A,0xE0,0x02,0x28,0x27,0xD1, + 0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x18,0x9B,0x19,0x9A,0x07,0x21,0x38,0x00, + 0x03,0xF0,0x12,0xFB,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x16,0x9B, + 0x80,0x7B,0x17,0x9A,0x05,0x21,0x03,0xF0,0x07,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21, + 0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22, + 0x9A,0x5E,0x00,0x92,0x2D,0x98,0x23,0x9B,0xFF,0x30,0x24,0x9A,0x65,0x30,0x70,0xE0, + 0x03,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x16,0x9B,0x17,0x9A, + 0x05,0x21,0x38,0x00,0x03,0xF0,0xE8,0xFA,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x2A,0x98,0x14,0x9B,0x80,0x7B,0x15,0x9A,0x03,0x21,0x03,0xF0,0xDD,0xFA,0x6B,0x46, + 0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF, + 0x07,0xC7,0x04,0x22,0x9A,0x5E,0x21,0x9B,0x00,0x92,0x2D,0x98,0x22,0x9A,0xFF,0x30, + 0x65,0x30,0x46,0xE0,0x04,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x68,0x46,0x06,0xC0, + 0x14,0x9B,0x15,0x9A,0x03,0x21,0x38,0x00,0x03,0xF0,0xBE,0xFA,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0x2A,0x98,0x12,0x9B,0x80,0x7B,0x13,0x9A,0x02,0x21,0x03,0xF0, + 0xB3,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB, + 0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x1F,0x9B,0x00,0x92,0x2D,0x98, + 0x20,0x9A,0xFF,0x30,0x65,0x30,0x1C,0xE0,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x12,0x9B,0x13,0x9A,0x02,0x21,0x38,0x00,0x03,0xF0,0x96,0xFA,0x10,0xAB,0x00,0x22, + 0x04,0x21,0x9A,0x5E,0x59,0x5E,0x2B,0x9B,0x06,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3, + 0x2C,0x98,0x16,0x22,0x82,0x5E,0x1D,0x9B,0x00,0x92,0x2D,0x98,0x1E,0x9A,0xFF,0x30, + 0x65,0x30,0x31,0x00,0x03,0xF0,0x94,0xFA,0x2A,0x98,0x3C,0x49,0x80,0x7B,0x09,0x28, + 0x02,0xD2,0x2A,0x9A,0x40,0x1C,0x90,0x73,0xA8,0x7B,0x02,0x28,0x01,0xD2,0x40,0x1C, + 0xA8,0x73,0x20,0x79,0x40,0x1E,0x80,0x00,0x41,0x18,0x21,0x20,0x40,0x01,0x0D,0x18, + 0x06,0x20,0x28,0x5E,0x00,0x28,0x22,0xDB,0x08,0x21,0x69,0x5E,0x00,0x29,0x1E,0xDB, + 0x07,0x99,0x64,0x22,0x56,0x1A,0x70,0x43,0x11,0x00,0xFD,0xF7,0x79,0xF8,0x07,0x00, + 0xE0,0x88,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x4C,0xF9,0x38,0x18,0xE0,0x80, + 0x08,0x20,0x28,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x6A,0xF8,0x06,0x00,0x20,0x89, + 0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x3D,0xF9,0x30,0x18,0x20,0x81,0xE0,0x88, + 0xE8,0x80,0x20,0x89,0x28,0x81,0x27,0x98,0x40,0x1C,0x08,0x28,0x27,0x90,0x00,0xDA, + 0x3A,0xE5,0x30,0x98,0x01,0x78,0x1A,0x48,0x01,0x29,0x1F,0xD1,0x30,0x99,0x89,0x7B, + 0x4A,0x00,0x16,0x49,0x51,0x18,0x15,0x22,0x52,0x01,0x8A,0x18,0x92,0x8A,0xC2,0x83, + 0x0D,0x22,0x92,0x01,0x8A,0x18,0x94,0x88,0x2F,0x9B,0x1C,0x80,0x0B,0x23,0x9B,0x01, + 0xC9,0x18,0x8B,0x88,0x2F,0x99,0x4B,0x80,0x92,0x8A,0x2F,0x99,0x8A,0x80,0x30,0x99, + 0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x0D,0xE5,0x02,0x29,0xFC,0xD1, + 0x30,0x99,0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x30,0x99,0x49,0x8B, + 0x41,0x83,0x30,0x99,0x89,0x8B,0x81,0x83,0xFE,0xE4,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x70,0x08,0x00,0x20,0x14,0x20,0x9F,0xE5,0x01,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5, + 0x02,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x01,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1, + 0xFB,0x0A,0x00,0x20,0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0, + 0x1C,0x8F,0x1A,0x4B,0x1B,0x7A,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D, + 0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E, + 0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0, + 0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0, + 0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42, + 0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xFD,0x0A,0x00,0x20,0x78,0x47,0xC0,0x46,0x14,0x20,0x9F,0xE5,0x02,0x10,0x81,0xE2, + 0x00,0x20,0xD2,0xE5,0x04,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x02,0x00,0x80,0xE2, + 0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20,0xFE,0xB5,0x04,0x00,0x88,0x1A,0xC0,0x1A, + 0x0D,0x00,0x16,0x00,0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x1F,0x00,0x20,0x38, + 0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x9C,0xFD,0x69,0x00,0x01,0x90, + 0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00, + 0x00,0xF0,0x90,0xFD,0x00,0x90,0xA8,0x19,0xC0,0x19,0x41,0x00,0x08,0x19,0x02,0x22, + 0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x82,0xFD, + 0x02,0x00,0x00,0x99,0x01,0x98,0x00,0xF0,0x7D,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x04,0x4B,0x03,0x4A,0x1B,0x78,0x58,0x43,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5, + 0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30, + 0x0D,0x49,0x01,0x20,0x10,0xB5,0x40,0x07,0x4A,0x69,0x92,0x06,0xFC,0xD4,0xCA,0x68, + 0x4B,0x68,0x4B,0x60,0x04,0xE0,0x4B,0x69,0x9B,0x06,0xFC,0xD4,0x8B,0x69,0x08,0xC0, + 0x52,0x1E,0xF8,0xD2,0x2E,0x20,0x48,0x60,0x48,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0x6B,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0x0A,0x0A,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x01,0x0A,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4, + 0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0, + 0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25, + 0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C, + 0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1, + 0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xD5,0xFB,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E, + 0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xC4,0xFB, + 0xC3,0xE7,0x00,0x00,0xFA,0x0A,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x01,0x49,0x20,0x20, + 0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68, + 0x3D,0x48,0x01,0x29,0x80,0x7A,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29, + 0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x25,0x27,0x7F,0x01,0x3B,0xE0, + 0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x08,0x38,0x01,0xF0,0xFC,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E, + 0x36,0x18,0xF6,0x19,0x36,0x7E,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43, + 0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7E, + 0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x76,0xED,0xE7,0x40,0x1C,0x08,0x28, + 0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46, + 0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18, + 0xDB,0x19,0x1B,0x7E,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x76, + 0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68, + 0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47, + 0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61, + 0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47, + 0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF, + 0x08,0xBC,0x18,0x47,0x2C,0x0B,0x00,0x20,0xF0,0xB5,0x85,0xB0,0xFE,0xF7,0xB8,0xFB, + 0xFE,0xF7,0x96,0xFB,0x02,0xF0,0xE0,0xF9,0x00,0xF0,0xDA,0xFD,0x00,0xF0,0xFA,0xFB, + 0xFE,0xF7,0x08,0xF8,0xFD,0xF7,0x46,0xFA,0x38,0x49,0x37,0x48,0xC9,0x88,0x40,0x7F, + 0x49,0x06,0x02,0xD4,0x34,0x48,0xC0,0x38,0x40,0x7E,0x00,0x28,0x04,0xD1,0xFF,0xF7, + 0x43,0xFA,0xFF,0xF7,0xED,0xF9,0x03,0xE0,0xFF,0xF7,0xEA,0xF9,0xFF,0xF7,0x3C,0xFA, + 0x02,0xF0,0xC2,0xFC,0x02,0xF0,0x2C,0xFB,0x01,0x26,0x76,0x07,0x30,0x68,0x00,0x28, + 0x07,0xD0,0x70,0x68,0x80,0x0F,0x80,0x07,0x03,0xD5,0x35,0x68,0x02,0x24,0x6D,0x1C, + 0x37,0xE0,0x01,0x24,0x25,0x00,0xA0,0x00,0x87,0x19,0x38,0x68,0x81,0x01,0x04,0x90, + 0x80,0x05,0x80,0x0D,0x02,0x90,0x22,0x48,0x89,0x0D,0x03,0x91,0x00,0x78,0x00,0x28, + 0x03,0xD1,0x02,0xA9,0x03,0xA8,0x02,0xF0,0x4F,0xFB,0x1E,0x4B,0x00,0x21,0x58,0x8C, + 0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x02,0xA9, + 0x40,0x1E,0x03,0x04,0x1B,0x0C,0x03,0xA8,0x03,0xF0,0xAA,0xFA,0x02,0xA9,0x03,0xA8, + 0x03,0xF0,0x7E,0xF9,0x14,0x49,0x04,0x98,0x08,0x40,0x03,0x99,0x89,0x05,0x89,0x09, + 0x08,0x43,0x02,0x99,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x38,0x60, + 0x64,0x1C,0xAC,0x42,0xC7,0xD9,0x30,0x68,0xFC,0xF7,0x5A,0xFF,0xFD,0xF7,0x3E,0xFE, + 0x02,0xF0,0xAE,0xFA,0xFF,0xF7,0xE0,0xFE,0xFC,0xF7,0x9E,0xFE,0x03,0x48,0x40,0x79, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x03,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xF8,0xB5,0x02,0xF0, + 0x3F,0xF9,0xFE,0xF7,0xCD,0xFD,0xFE,0xF7,0x5B,0xFE,0xFE,0xF7,0xA3,0xFE,0x1A,0x48, + 0x00,0x21,0xC0,0x7F,0x03,0xF0,0xB8,0xF8,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20, + 0x28,0x70,0xE8,0x61,0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68, + 0x00,0x07,0x12,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x5C,0xFA, + 0xFF,0xF7,0x22,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x4F,0xFA,0xE0,0x6B,0x0B,0x28,0xE6,0xD1, + 0xFE,0xF7,0xE8,0xF9,0x28,0x78,0x00,0x28,0xD9,0xD0,0x01,0xF0,0x23,0xFF,0xD6,0xE7, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x30, + 0xF8,0x0A,0x00,0x20,0x70,0xB5,0x21,0x49,0x1F,0x4A,0xCB,0x88,0x05,0x00,0x10,0x7A, + 0x1F,0x49,0x5C,0x06,0x00,0xD4,0x08,0x79,0x1E,0x4C,0xA4,0x8A,0x00,0x19,0x06,0x06, + 0xD0,0x79,0x36,0x0E,0x5A,0x06,0x00,0xD4,0xC8,0x78,0x1B,0x49,0x2C,0x78,0x4A,0x7C, + 0x00,0x2A,0x0F,0xD1,0x8A,0x7C,0x00,0x2A,0x01,0xD0,0x80,0x1C,0x08,0xE0,0xCA,0x7C, + 0x00,0x2A,0x01,0xD0,0x00,0x1D,0x03,0xE0,0x09,0x7D,0x00,0x29,0x02,0xD0,0x80,0x1D, + 0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00, + 0xFC,0xF7,0xD0,0xFD,0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20, + 0x28,0x70,0x01,0x20,0xF4,0xE7,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x70,0x08,0x00,0x20,0x10,0xB5,0x08,0x24, + 0x20,0x00,0xFE,0xF7,0x5B,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C, + 0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xA0,0x78,0x00,0x00,0x19,0x22,0x10,0xB5,0x06,0x48,0x52,0x01,0x00,0x21,0x01,0xF0, + 0x3B,0xFA,0x51,0x22,0x04,0x48,0xD2,0x00,0x00,0x21,0x01,0xF0,0x35,0xFA,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xC8,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x40,0x22, + 0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0,0x27,0xFA,0x01,0x20,0xA0,0x63,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00, + 0x01,0xF0,0x06,0xFA,0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48, + 0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19,0x01,0xF0,0xF2,0xF9,0x0D,0x48,0x00,0x21, + 0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0,0x0F,0xFA,0x0A,0x48,0x80,0x07,0x07,0xD0, + 0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0xFC,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x88,0x71,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x46,0x06,0x00,0x00,0xF0,0x05,0x00,0x20,0x33,0x21,0x09,0x05, + 0x01,0x20,0x80,0x07,0x41,0x62,0x04,0x49,0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60, + 0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40, + 0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x01,0x00, + 0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0x4B,0xFA,0x64,0x1C, + 0x08,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24, + 0x64,0x03,0x20,0x00,0xFD,0xF7,0x5C,0xF8,0xFE,0xF7,0xE2,0xFC,0xFE,0xF7,0x0C,0xFD, + 0xFE,0xF7,0xD6,0xFC,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B, + 0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7,0x41,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x78,0x00,0x00,0x10,0xB5,0x01,0xF0, + 0xE7,0xFF,0x01,0xF0,0xC7,0xFF,0xFF,0x20,0xFD,0xF7,0x72,0xF8,0xFF,0xF7,0xAE,0xFF, + 0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0,0x9F,0xF9,0x08,0x20,0xFD,0xF7,0x30,0xF8, + 0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x02,0xFE,0x00,0xF0,0x1A,0xF8, + 0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7,0x21,0xF8,0x00,0xF0, + 0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20,0x01,0xF0,0xB5,0xFF,0xFE,0xF7,0x10,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x2C,0x0B,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x78,0x00,0x00,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFD,0xF7, + 0x07,0xF8,0x20,0x02,0xFD,0xF7,0x2E,0xF8,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7, + 0xC1,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x02,0xF0, + 0xF3,0xFF,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x02,0xF0,0xEC,0xFF, + 0x30,0x00,0xFC,0xF7,0xE5,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCB,0xFD,0x03,0xF0, + 0xD0,0xF8,0x7D,0x20,0xC0,0x00,0x03,0xF0,0xBF,0xF8,0x00,0x20,0xFF,0xF7,0xA8,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x2D,0x70,0x00,0x00,0x0A,0x48,0x10,0xB5, + 0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7, + 0x89,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0x7A,0xF8, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xA5,0x07,0x00, + 0xF8,0x0A,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xD5,0xFE,0xFF,0xF7,0x43,0xFF,0x15,0x48, + 0x00,0x7A,0x02,0xF0,0xDF,0xFE,0x13,0x48,0x13,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24, + 0xD1,0x83,0x12,0x49,0x0C,0x60,0x4C,0x60,0x11,0x49,0xD2,0x88,0x49,0x79,0x52,0x06, + 0x02,0xD4,0x01,0x00,0xA0,0x31,0x49,0x78,0x0C,0x4A,0xC0,0x3A,0x51,0x73,0x09,0x49, + 0x80,0x31,0x0A,0x8B,0x09,0x49,0x40,0x39,0xCA,0x62,0x00,0x88,0x08,0x63,0xFF,0xF7, + 0x9D,0xFE,0x08,0x48,0xC4,0x83,0xFE,0xF7,0x19,0xFB,0x07,0x48,0x04,0x70,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0x30,0x07,0x00,0x20,0xF9,0x0A,0x00,0x20,0xF7,0xB5,0x86,0xB0, + 0x00,0x27,0x2E,0x48,0x04,0xAB,0x02,0x97,0x03,0x97,0x81,0xC3,0x2C,0x4E,0xFE,0xF7, + 0xE9,0xFB,0xFE,0xF7,0x97,0xFC,0x2B,0x48,0x40,0x7F,0x01,0x90,0x29,0x48,0x20,0x38, + 0x40,0x7F,0x00,0x25,0x00,0x90,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00, + 0xFF,0xF7,0x38,0xFB,0x00,0x28,0x1C,0xD0,0x23,0x49,0x04,0x9A,0x09,0x78,0x69,0x43, + 0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC, + 0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD, + 0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95, + 0x03,0x91,0x64,0x1C,0x14,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x13,0x48, + 0x00,0x78,0x85,0x42,0xD0,0xD3,0x08,0x99,0x03,0x98,0x08,0x60,0x10,0x48,0x00,0x69, + 0xC0,0x07,0x05,0xD0,0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x04,0xE0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x05,0x98,0x00,0x28,0x00,0xD0, + 0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x68,0x20,0x9F,0xE5,0x04,0xE0,0x2D,0xE5, + 0x5A,0x04,0xD2,0xE5,0x58,0xC0,0x9F,0xE5,0x01,0x00,0x10,0xE3,0x12,0x00,0x00,0x0A, + 0x54,0x10,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x30,0xD1,0xE5,0x0B,0x00,0x00,0xEA, + 0x5A,0xE4,0xD2,0xE5,0x00,0x10,0x82,0xE0,0x89,0x14,0xD1,0xE5,0x02,0x00,0x1E,0xE3, + 0x88,0xE4,0xD2,0xE5,0x9E,0x13,0x21,0x00,0x93,0xE1,0x21,0x10,0x01,0x11,0x9C,0xE7, + 0x80,0xE0,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x00,0x80,0xE2,0xB0,0x11,0xCE,0xE1, + 0x5B,0x14,0xD2,0xE5,0x00,0x00,0x51,0xE1,0xF0,0xFF,0xFF,0x8A,0x04,0xE0,0x9D,0xE4, + 0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20, + 0xFF,0xB5,0x4E,0x4C,0x85,0xB0,0x24,0x78,0x0F,0x99,0x0E,0x9A,0x02,0x94,0x4C,0x4C, + 0xD7,0x00,0x26,0x79,0x00,0x20,0x05,0x00,0xB6,0x00,0x34,0x19,0xE0,0x34,0x10,0x26, + 0xA6,0x5F,0xB6,0x46,0x12,0x26,0xA6,0x5F,0xB4,0x46,0x76,0x46,0xB6,0x1C,0x34,0x04, + 0x24,0x14,0x66,0x46,0xB6,0x1C,0x01,0x94,0x34,0x04,0x24,0x14,0x00,0x94,0x3F,0x4C, + 0x07,0x9E,0x24,0x78,0x03,0x97,0x24,0x1D,0x04,0x94,0x06,0x9C,0x3C,0x19,0x01,0x2E, + 0x12,0xD0,0x02,0x2E,0x1B,0xD0,0x03,0x2E,0x54,0xD0,0x04,0x2E,0x26,0xD1,0x04,0x9D, + 0x00,0x98,0x02,0x9E,0x68,0x43,0x01,0x9D,0xED,0x18,0x40,0x19,0x05,0x06,0x2D,0x0E, + 0x60,0x46,0x70,0x43,0xE6,0x88,0x16,0xE0,0x00,0x98,0x04,0x9D,0xC0,0x1A,0x68,0x43, + 0x01,0x9D,0x06,0x9E,0x40,0x19,0x05,0x06,0xF0,0x5B,0x2D,0x0E,0x08,0xE0,0x00,0x98, + 0x04,0x9D,0xC0,0x18,0x68,0x43,0x01,0x9D,0x40,0x19,0x05,0x06,0x60,0x88,0x2D,0x0E, + 0x02,0x9E,0x70,0x43,0x76,0x46,0x80,0x19,0x00,0x06,0x00,0x0E,0x25,0x4E,0x6D,0x00, + 0x75,0x5F,0x25,0x4E,0x16,0x27,0xF7,0x5F,0xBD,0x42,0x3D,0xDD,0x07,0x9D,0x01,0x2D, + 0x2D,0xD0,0x02,0x2D,0x31,0xD0,0x03,0x2D,0x32,0xD0,0x04,0x2D,0x06,0xD1,0x73,0x44, + 0xE3,0x80,0x0B,0x00,0x00,0xD1,0x13,0x00,0x05,0x9C,0x23,0x54,0x18,0x4C,0x53,0x00, + 0x1B,0x19,0xFF,0x33,0x41,0x33,0x00,0x29,0x04,0xD0,0x05,0x99,0x52,0x1E,0x08,0x5C, + 0x90,0x42,0x02,0xD0,0xD8,0x88,0x40,0x1C,0xD8,0x80,0x01,0x20,0x09,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x04,0x9D,0x00,0x98,0x02,0x9E,0x68,0x43,0x01,0x9D,0x40,0x19, + 0xC0,0x1A,0x05,0x06,0x2D,0x0E,0x60,0x46,0x70,0x43,0xA6,0x88,0xC3,0xE7,0x64,0x46, + 0xE3,0x1A,0x06,0x9D,0x03,0x9C,0x2B,0x53,0xD3,0xE7,0x63,0x44,0x63,0x80,0xD0,0xE7, + 0x75,0x46,0xEB,0x1A,0xA3,0x80,0xCC,0xE7,0x00,0x20,0xDF,0xE7,0xFB,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xC8,0x02,0x00,0x20,0x30,0x07,0x00,0x20,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x02,0x00,0x08,0x00,0x8A,0x42,0x00,0xDC, + 0x10,0x00,0x70,0x47,0xF0,0xB5,0xE6,0x48,0xE6,0x4F,0x86,0x89,0xF8,0x88,0xFD,0xB0, + 0x41,0x06,0x02,0xD4,0xE2,0x49,0xC0,0x39,0x0E,0x89,0xE3,0x49,0x09,0x78,0x74,0x91, + 0xE2,0x49,0x0A,0x78,0x74,0x99,0x91,0x42,0x73,0x92,0x00,0xD8,0x11,0x00,0x72,0x91, + 0x00,0x21,0x6D,0x91,0x6C,0x91,0xDA,0x49,0xDD,0x4D,0x20,0x39,0x7C,0x91,0x8C,0x8B, + 0x40,0x06,0x00,0xD4,0x2C,0x8B,0xDB,0x48,0x08,0x22,0x00,0x21,0x00,0xF0,0x44,0xFF, + 0xD8,0x48,0x10,0x22,0x00,0x21,0x08,0x30,0x00,0xF0,0x3E,0xFF,0xFF,0x22,0x01,0x32, + 0x00,0x21,0x2C,0xA8,0x00,0xF0,0x38,0xFF,0x48,0x22,0x00,0x21,0x1A,0xA8,0x00,0xF0, + 0x33,0xFF,0x20,0x22,0x00,0x21,0x12,0xA8,0x00,0xF0,0x2E,0xFF,0x20,0x22,0x00,0x21, + 0x0A,0xA8,0x00,0xF0,0x29,0xFF,0x20,0x22,0x00,0x21,0x02,0xA8,0x00,0xF0,0x24,0xFF, + 0xC4,0x48,0x64,0x21,0x00,0x89,0x07,0x00,0x70,0x43,0xFC,0xF7,0xA1,0xF9,0xC5,0x49, + 0xC0,0x4A,0x89,0x1C,0x7B,0x91,0xBF,0x49,0xC9,0x89,0x40,0x18,0x7B,0x99,0xC8,0x82, + 0xC1,0x48,0x00,0x21,0x01,0x81,0x7C,0x99,0xD2,0x88,0x89,0x7F,0x06,0x00,0x38,0x00, + 0x52,0x06,0x00,0xD4,0xA9,0x7E,0x48,0x43,0x64,0x21,0xFC,0xF7,0x63,0xFA,0x00,0x04, + 0x00,0x14,0xA0,0x42,0x70,0x81,0x00,0xDA,0x74,0x81,0xB2,0x48,0x01,0x79,0x00,0x29, + 0x7D,0xD0,0x00,0x27,0xDC,0xE0,0xAF,0x48,0xB9,0x00,0x08,0x18,0xE0,0x30,0x10,0x25, + 0x12,0x21,0x45,0x5F,0x41,0x5E,0x01,0x20,0x7E,0x1C,0x75,0x91,0x6F,0x90,0x6E,0x90, + 0x71,0x90,0x70,0x90,0xF0,0x00,0x1A,0xAA,0x7A,0x90,0x11,0x52,0x80,0x18,0x75,0x99, + 0x79,0x90,0x41,0x80,0x85,0x80,0x00,0x2F,0xC5,0x80,0x20,0xDD,0x38,0x00,0x1A,0xAC, + 0x1A,0xE0,0xC2,0x00,0x11,0x19,0x04,0x23,0xCB,0x5E,0xAB,0x42,0x13,0xDC,0x06,0x23, + 0xCB,0x5E,0xAB,0x42,0x0F,0xDB,0xA2,0x5E,0x75,0x9B,0x9A,0x42,0x0B,0xDC,0x02,0x22, + 0x8A,0x5E,0x9A,0x42,0x07,0xDB,0x01,0x06,0x09,0x0E,0x6D,0x91,0x6C,0x99,0x49,0x1C, + 0x09,0x06,0x09,0x0E,0x6C,0x91,0x40,0x1E,0x00,0x28,0xE2,0xDC,0x01,0xE0,0x00,0x20, + 0x6D,0x90,0x00,0x24,0x5C,0xE0,0x6F,0x98,0x01,0x28,0x0D,0xD1,0xA5,0x42,0x0B,0xDB, + 0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x01,0x22,0x1A,0xA9, + 0x2C,0xA8,0xFF,0xF7,0x75,0xFE,0x00,0xE0,0x00,0x20,0x00,0x2C,0x6F,0x90,0x3E,0xDD, + 0x6E,0x98,0x01,0x28,0x10,0xD1,0x75,0x98,0x73,0x99,0x00,0x19,0x88,0x42,0x0B,0xDA, + 0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x02,0x22,0x1A,0xA9, + 0x2C,0xA8,0xFF,0xF7,0x5D,0xFE,0x00,0xE0,0x00,0x20,0x6E,0x90,0x71,0x98,0x01,0x28, + 0x0E,0xD1,0xA5,0x42,0x0C,0xDB,0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0, + 0x23,0x00,0x03,0x22,0x1A,0xA9,0x2C,0xA8,0xFF,0xF7,0x4A,0xFE,0x01,0xE0,0xDB,0xE0, + 0x00,0x20,0x71,0x90,0x70,0x98,0x01,0x28,0x0F,0xD1,0x74,0x99,0x28,0x19,0x88,0x42, + 0x0B,0xDA,0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x04,0x22, + 0x1A,0xA9,0x2C,0xA8,0xFF,0xF7,0x34,0xFE,0x00,0xE0,0x00,0x20,0x70,0x90,0x6E,0x99, + 0x6F,0x98,0x08,0x43,0x71,0x99,0x08,0x43,0x70,0x99,0x08,0x43,0x03,0xD0,0x64,0x1C, + 0x72,0x98,0x84,0x42,0x9F,0xDB,0x6D,0x98,0x00,0x28,0x38,0xD0,0x5D,0x49,0x40,0x00, + 0x40,0x18,0x72,0x00,0x52,0x18,0xFF,0x30,0xFF,0x32,0x41,0x30,0x41,0x32,0xC3,0x88, + 0xD1,0x88,0x59,0x18,0xC1,0x80,0x7A,0x98,0x1A,0xAB,0x19,0x5E,0x6D,0x98,0xC0,0x00, + 0x1C,0x5E,0xA1,0x42,0x00,0xDA,0x19,0x52,0x79,0x9C,0x02,0x21,0x61,0x5E,0xC0,0x18, + 0x02,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDD,0x41,0x80,0x79,0x9C,0x04,0x21,0x61,0x5E, + 0x04,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDA,0x81,0x80,0x79,0x9C,0x06,0x21,0x61,0x5E, + 0x06,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDD,0xC1,0x80,0x00,0x20,0xD0,0x80,0x7A,0x99, + 0x58,0x52,0x79,0x99,0x48,0x80,0x79,0x99,0x88,0x80,0x79,0x99,0xC8,0x80,0x7F,0x1C, + 0x40,0x48,0x01,0x79,0xB9,0x42,0x00,0xDD,0x1D,0xE7,0x02,0x79,0x6C,0x99,0x51,0x1A, + 0x01,0x24,0x01,0x71,0x6C,0xE0,0xE0,0x00,0x1A,0xA9,0x0B,0x5E,0x41,0x18,0x02,0x20, + 0x77,0x91,0x08,0x5E,0x9B,0x1C,0x80,0x1C,0x76,0x90,0x41,0xE0,0x77,0x98,0x04,0x21, + 0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x89,0x1C,0x80,0x1C,0x78,0x90,0x33,0xE0, + 0x74,0x9A,0x98,0x1E,0x84,0x46,0x50,0x43,0x8D,0x1E,0x2C,0xAA,0x52,0x19,0x80,0x5C, + 0x00,0x28,0x27,0xD0,0x74,0x98,0x31,0x4E,0x00,0x1D,0x58,0x43,0x40,0x18,0x40,0x00, + 0x30,0x5E,0x7B,0x9F,0x16,0x26,0xBE,0x5F,0x00,0x22,0xB0,0x42,0x00,0xDD,0x82,0x1B, + 0x24,0x4F,0x6D,0x00,0xED,0x19,0x2D,0x8C,0xA0,0x00,0x12,0xAE,0x55,0x43,0x36,0x58, + 0x75,0x19,0x12,0xAE,0x35,0x50,0x66,0x46,0x76,0x00,0xF6,0x19,0x40,0x36,0xB6,0x88, + 0x0A,0xAD,0x2D,0x58,0x56,0x43,0xAD,0x19,0x0A,0xAE,0x35,0x50,0x02,0xAD,0x2E,0x58, + 0xB2,0x18,0x2A,0x50,0x78,0x98,0x49,0x1C,0x88,0x42,0xC9,0xDA,0x76,0x98,0x5B,0x1C, + 0x98,0x42,0xBB,0xDA,0xA5,0x00,0x02,0xA8,0x46,0x59,0x00,0x2E,0x12,0xD0,0x12,0xA8, + 0x40,0x59,0x31,0x00,0xFC,0xF7,0x16,0xF9,0x0E,0x49,0x62,0x00,0x57,0x18,0xFF,0x21, + 0x1F,0x31,0xC8,0x53,0x0A,0xA8,0x40,0x59,0x31,0x00,0xFC,0xF7,0x0B,0xF9,0xFF,0x37, + 0x21,0x37,0xF8,0x81,0x07,0x48,0x00,0x19,0xFF,0x30,0x21,0x30,0x44,0x77,0x64,0x1C, + 0x04,0x48,0x00,0x79,0xA0,0x42,0x8E,0xDA,0x7D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0x2E,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xE7,0xB0,0x42,0x90,0x32,0x90,0x0D,0x90,0xFF,0x48,0x66,0x90, + 0x02,0x8A,0xFF,0x49,0xC8,0x88,0x43,0x06,0x02,0xD4,0xFC,0x4A,0xC0,0x3A,0x92,0x89, + 0xFA,0x4D,0xFC,0x4C,0x20,0x35,0x0C,0x92,0xAA,0x89,0x43,0x06,0x00,0xD4,0x22,0x89, + 0xF9,0x4B,0x0B,0x92,0xF5,0x4A,0x40,0x32,0x65,0x92,0x52,0x89,0x46,0x06,0x64,0x93, + 0x00,0xD4,0xDA,0x88,0x43,0x06,0x0A,0x92,0x65,0x9A,0x12,0x79,0x01,0xD4,0x64,0x9A, + 0x12,0x78,0x43,0x06,0x09,0x92,0x65,0x9A,0x52,0x79,0x01,0xD4,0x64,0x9A,0x52,0x78, + 0x43,0x06,0x08,0x92,0x65,0x9A,0x12,0x8B,0x01,0xD4,0x64,0x9A,0x92,0x8A,0x40,0x06, + 0x07,0x92,0x2F,0x89,0x00,0xD4,0xA7,0x88,0xE8,0x48,0x29,0x22,0x06,0x78,0xE8,0x48, + 0x00,0x78,0x06,0x90,0xE2,0x48,0xC0,0x89,0x05,0x90,0x01,0x20,0x04,0x90,0x00,0x20, + 0x01,0x00,0x02,0x90,0x0E,0xA8,0x00,0xF0,0x3F,0xFD,0xE2,0x48,0xDC,0x49,0x08,0x81, + 0xDB,0x48,0x00,0x21,0x81,0x81,0x41,0x81,0xC0,0x30,0x63,0x90,0x41,0x80,0xA0,0x30, + 0x62,0x90,0x40,0x78,0xDC,0x49,0x02,0x28,0x61,0x91,0x53,0xD9,0xD4,0x4A,0x69,0x8A, + 0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x89,0x36,0x91,0xD8,0x49,0x36,0x9A,0x60,0x91, + 0x89,0x8B,0x89,0x18,0x37,0x91,0x0C,0x99,0xC9,0x04,0x25,0xD5,0x01,0x28,0x0C,0xD9, + 0xCB,0x4A,0xE9,0x7A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x79,0x48,0x43,0x00,0x06, + 0x00,0x0E,0x04,0x90,0x01,0xD1,0x01,0x20,0x04,0x90,0x63,0x99,0xC4,0x4A,0x00,0x20, + 0x08,0x5E,0xD2,0x88,0xA9,0x7A,0x52,0x06,0x00,0xD4,0xA1,0x79,0x48,0x43,0x64,0x21, + 0xFB,0xF7,0x86,0xFF,0x00,0x04,0x00,0x0C,0xB8,0x42,0x00,0xD2,0x38,0x00,0x04,0x99, + 0xFC,0xF7,0x58,0xF8,0x63,0x99,0x48,0x80,0xB9,0x49,0x65,0x98,0xC9,0x88,0x40,0x8B, + 0x49,0x06,0x01,0xD4,0x64,0x98,0xC0,0x8A,0x61,0x99,0x89,0x8B,0x40,0x18,0x37,0x99, + 0x35,0x90,0x88,0x42,0x34,0x91,0x00,0xD2,0x37,0x90,0x02,0x20,0x4D,0x90,0xAF,0x48, + 0xC0,0x30,0x5F,0x90,0xB4,0x48,0xA0,0x38,0x5E,0x90,0x06,0x98,0x80,0x1C,0x53,0x90, + 0x4D,0x98,0x95,0xE3,0x02,0x28,0x08,0xD1,0xA9,0x4A,0x29,0x8A,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0xA1,0x89,0x61,0x9A,0x52,0x8B,0x0E,0xE0,0xAD,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0xAC,0x49,0x89,0x89,0x05,0xE0,0xA1,0x4A,0xE9,0x89,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0x61,0x89,0x61,0x9A,0x12,0x8B,0x89,0x18,0x95,0xE7,0x02,0x24,0xB0,0x1C, + 0x54,0x90,0x6A,0xE3,0x4D,0x98,0x54,0x99,0x40,0x1E,0x48,0x43,0x61,0x1E,0x40,0x18, + 0x00,0x04,0x07,0x14,0xA0,0x49,0x78,0x00,0x5D,0x90,0x08,0x5E,0x37,0x99,0x09,0x04, + 0x09,0x14,0x88,0x42,0x7B,0xDB,0x78,0x1C,0xC1,0x10,0x0E,0xAA,0x52,0x5C,0x41,0x07, + 0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40,0xF8,0x10,0x0E,0xA9,0x5C,0x90,0x09,0x5C, + 0x7B,0x07,0x5B,0x0F,0x01,0x20,0x98,0x40,0x01,0x40,0x5B,0x90,0x78,0x1E,0xC3,0x10, + 0x0E,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0, + 0x33,0xFC,0x01,0x90,0xB8,0x1B,0x41,0x1E,0xCA,0x10,0x0E,0xAB,0x9A,0x5C,0x4B,0x07, + 0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40,0x83,0x1E,0xD9,0x10,0x0E,0xAD,0x69,0x5C, + 0x5D,0x07,0x6D,0x0F,0x01,0x23,0xAB,0x40,0x19,0x40,0xC0,0x1E,0xC3,0x10,0x0E,0xAD, + 0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0,0x14,0xFC, + 0x01,0x99,0x01,0xF0,0x0F,0xFC,0x00,0x28,0x39,0xD1,0x7B,0x48,0x32,0x00,0x39,0x00, + 0x02,0x23,0xFE,0xF7,0x29,0xFF,0x37,0x99,0x88,0x42,0xB3,0xDB,0x76,0x49,0x5D,0x9A, + 0x89,0x5E,0x81,0x42,0xF0,0xD1,0x6A,0x4F,0xBA,0x89,0x82,0x42,0x00,0xDA,0xB8,0x81, + 0x5C,0x9A,0x0E,0xAB,0x9A,0x5C,0x5B,0x9D,0x2A,0x43,0x5C,0x9D,0x5A,0x55,0x64,0x4A, + 0x92,0x89,0x82,0x42,0x05,0xD1,0x62,0x48,0x00,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E, + 0x0D,0x90,0x00,0x20,0x05,0x00,0x03,0x90,0x5E,0x98,0x80,0x7E,0xC2,0x07,0x20,0xD0, + 0x80,0x07,0x0D,0xD5,0x30,0x1B,0x40,0x1C,0x00,0xD1,0x75,0x1E,0xA6,0x42,0x04,0xD1, + 0x01,0x22,0x30,0x04,0x52,0x04,0x80,0x1A,0x05,0x43,0x01,0x20,0x10,0xE0,0xA4,0xE0, + 0x4D,0x9A,0x06,0x98,0x80,0x1A,0x40,0x1C,0x01,0xD1,0x06,0x9D,0x6D,0x1E,0x06,0x98, + 0x90,0x42,0x04,0xD1,0x01,0x22,0x00,0x04,0x12,0x05,0x80,0x1A,0x05,0x43,0x02,0x20, + 0x03,0x90,0x28,0x04,0x01,0xD0,0x35,0x98,0x00,0xE0,0x34,0x98,0x00,0x04,0x00,0x14, + 0x81,0x42,0xB2,0xDB,0x4D,0x99,0x30,0x1D,0x41,0x43,0x5A,0x90,0x08,0x19,0x00,0x04, + 0x00,0x14,0x33,0x90,0x0C,0x98,0xC0,0x04,0x0C,0xD5,0x33,0x98,0x4B,0x49,0x40,0x00, + 0x08,0x5E,0x05,0x99,0x40,0x1A,0x00,0x28,0x77,0xDD,0x63,0x9A,0x02,0x21,0x51,0x5E, + 0x81,0x42,0x72,0xDA,0x04,0x20,0x4E,0x90,0x20,0x18,0x59,0x90,0x4E,0x98,0x04,0x27, + 0x80,0x00,0x58,0x90,0x59,0x98,0x00,0x1F,0x0D,0xD4,0x59,0x98,0x00,0x1F,0xB0,0x42, + 0x09,0xDA,0x4D,0x98,0xC0,0x19,0x57,0x90,0x00,0x1F,0x04,0xD4,0x57,0x98,0x06,0x99, + 0x00,0x1F,0x88,0x42,0x07,0xDB,0x14,0x20,0x78,0x43,0x00,0x21,0x19,0xAA,0x80,0x18, + 0x58,0x9A,0x81,0x50,0x27,0xE0,0x05,0x98,0x0C,0x99,0x00,0x04,0x00,0x14,0xC9,0x04, + 0x04,0xD5,0x04,0x99,0xFB,0xF7,0x54,0xFE,0x00,0x04,0x00,0x14,0x57,0x99,0x5A,0x9A, + 0x89,0x1E,0x51,0x43,0x59,0x9A,0x89,0x18,0x2C,0x4A,0x49,0x00,0x89,0x18,0x20,0x39, + 0x89,0x8B,0x08,0x1A,0x00,0x04,0x00,0x14,0x00,0xD5,0x00,0x20,0x07,0x99,0x00,0x29, + 0x03,0xD0,0x88,0x42,0x01,0xDD,0x08,0x04,0x00,0x14,0x14,0x21,0x79,0x43,0x19,0xAA, + 0x89,0x18,0x58,0x9A,0x88,0x50,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xBA,0xD5,0x4E,0x98, + 0x40,0x1E,0x00,0x04,0x00,0x14,0x4E,0x90,0xAE,0xD5,0x33,0x98,0x1B,0x4A,0x40,0x00, + 0x84,0x46,0x80,0x18,0x01,0x00,0x20,0x39,0x1E,0x23,0xCB,0x5E,0x05,0x99,0x59,0x1A, + 0x41,0x91,0x02,0x21,0x41,0x5E,0x05,0x98,0x05,0x9B,0x08,0x1A,0x40,0x90,0x33,0x98, + 0x18,0x21,0x80,0x1B,0x40,0x00,0x80,0x18,0x20,0x38,0x41,0x5E,0xC9,0x1A,0x3F,0x91, + 0x33,0x99,0x89,0x19,0x49,0x00,0x89,0x18,0x1A,0xE0,0x3B,0xE1,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x00,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20, + 0x04,0x0B,0x00,0x20,0xA0,0x7A,0x00,0x00,0x40,0x00,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x08,0x23,0xCB,0x5E,0x05,0x9F,0xDB,0x1B,0x3E,0x93,0x16,0x23,0xC3,0x5E,0xDB,0x1B, + 0x3D,0x93,0x06,0x23,0xCB,0x5E,0xDB,0x1B,0x3C,0x93,0x1A,0x23,0xC3,0x5E,0xD8,0x1B, + 0x3B,0x90,0x0A,0x20,0x08,0x5E,0x0B,0x99,0xC0,0x1B,0x3A,0x90,0x60,0x46,0x10,0x5E, + 0xC0,0x1B,0x48,0x43,0x64,0x21,0xFB,0xF7,0xD3,0xFD,0x38,0x90,0x26,0x98,0x02,0x04, + 0x24,0x98,0x12,0x14,0x03,0x04,0x21,0x98,0x00,0x92,0x02,0x04,0x20,0x98,0x1B,0x14, + 0x01,0x04,0x1F,0x98,0x12,0x14,0x00,0x04,0x09,0x14,0x00,0x14,0xFF,0xF7,0xB9,0xFB, + 0x07,0x00,0x2B,0x98,0x02,0x04,0x2A,0x98,0x12,0x14,0x01,0x04,0x29,0x98,0x09,0x14, + 0x00,0x04,0x00,0x14,0xFF,0xF7,0xA6,0xFB,0x01,0x00,0x38,0x00,0xFF,0xF7,0x9E,0xFB, + 0x25,0x99,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42,0x05,0xDD,0x08,0x1A, + 0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x02,0x90,0xFB,0x48,0xFF,0x21,0xC0,0x88, + 0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20,0x02,0x90,0xF7,0x48, + 0x00,0x78,0x00,0x28,0x47,0xD1,0x20,0xA9,0x06,0xC9,0x02,0x2C,0x14,0xD1,0x01,0xF0, + 0xB3,0xFA,0x07,0x00,0x00,0x21,0x26,0x9A,0x08,0x00,0x01,0xF0,0xAD,0xFA,0x2A,0xA9, + 0x06,0xC9,0x3F,0x18,0x00,0x20,0x01,0xF0,0xA7,0xFA,0x38,0x18,0x05,0x21,0xFB,0xF7, + 0x7F,0xFD,0x00,0x04,0x00,0x0C,0x13,0xE0,0x1F,0x98,0x01,0xF0,0x9D,0xFA,0x07,0x00, + 0x26,0x9A,0x24,0x98,0x00,0x21,0x01,0xF0,0x97,0xFA,0x3F,0x18,0x29,0xA8,0x07,0xC8, + 0x01,0xF0,0x92,0xFA,0x38,0x18,0xC1,0x17,0x49,0x0F,0x08,0x18,0x40,0x03,0x00,0x0C, + 0x25,0x99,0x09,0x1A,0x00,0x29,0x01,0xDC,0x25,0x99,0x41,0x1A,0x5F,0x98,0x02,0x8A, + 0xD9,0x48,0xC0,0x88,0x43,0x06,0x01,0xD4,0x66,0x9A,0x92,0x89,0x91,0x42,0x0A,0xDA, + 0x5F,0x99,0x25,0x9A,0x49,0x8A,0x40,0x06,0x01,0xD4,0x66,0x98,0xC1,0x89,0x8A,0x42, + 0x01,0xDA,0x28,0x04,0x7E,0xD0,0x00,0x2D,0x2B,0xD0,0x03,0x98,0xC0,0x07,0x16,0xD0, + 0x04,0x20,0x00,0x22,0x19,0xAB,0x29,0x04,0x06,0xD0,0x14,0x27,0x01,0x00,0x79,0x43, + 0x5A,0x50,0xC9,0x18,0x4A,0x60,0x05,0xE0,0x14,0x27,0x01,0x00,0x79,0x43,0xC9,0x18, + 0xCA,0x60,0x0A,0x61,0x40,0x1E,0x00,0x04,0x00,0x14,0xEC,0xD5,0x11,0xE0,0x04,0x20, + 0x00,0x22,0x19,0xAB,0x29,0x04,0x04,0xD0,0x81,0x00,0x5A,0x50,0xC9,0x18,0x4A,0x61, + 0x03,0xE0,0x81,0x00,0xC9,0x18,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xF0,0xD5,0xBB,0x48,0x33,0x99,0x32,0x00,0x04,0x23,0xFE,0xF7,0x5D,0xFD,0xB6,0x49, + 0x0A,0x89,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81, + 0xB1,0x48,0x01,0x79,0x49,0x1C,0x0A,0x06,0x12,0x0E,0x02,0x71,0x92,0x00,0xA1,0x1E, + 0x12,0x18,0xE0,0x32,0x56,0x91,0x91,0x81,0x4D,0x99,0x89,0x1E,0x55,0x91,0x02,0x79, + 0x92,0x00,0x10,0x18,0xE0,0x30,0xC1,0x81,0x00,0x20,0x07,0x00,0x01,0x00,0x84,0x46, + 0x39,0x90,0x41,0x9A,0x38,0x98,0x82,0x42,0x06,0xDC,0x38,0x9A,0x3D,0x98,0x90,0x42, + 0x02,0xDC,0x3C,0x98,0x90,0x42,0x01,0xDD,0x01,0x20,0x39,0x90,0x38,0x9A,0x40,0x98, + 0x90,0x42,0x05,0xDC,0x3B,0x98,0x90,0x42,0x02,0xDC,0x3A,0x98,0x90,0x42,0x01,0xDD, + 0x01,0x20,0x84,0x46,0x3F,0x98,0x90,0x42,0x05,0xDC,0x3D,0x98,0x90,0x42,0x02,0xDC, + 0x3B,0x98,0x90,0x42,0x00,0xDD,0x01,0x27,0x3E,0x98,0x90,0x42,0x07,0xDC,0x3C,0x98, + 0x90,0x42,0x00,0xE0,0xF5,0xE0,0x02,0xDC,0x3A,0x98,0x90,0x42,0x00,0xDD,0x01,0x21, + 0x04,0x20,0x00,0x22,0x19,0xAD,0x39,0x9B,0x00,0x2B,0x02,0xD1,0x14,0x23,0x43,0x43, + 0xEA,0x50,0x63,0x46,0x00,0x2B,0x03,0xD1,0x14,0x23,0x43,0x43,0x5B,0x19,0x1A,0x61, + 0x00,0x2F,0x01,0xD1,0x83,0x00,0xEA,0x50,0x00,0x29,0x02,0xD1,0x83,0x00,0x5B,0x19, + 0x1A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xE5,0xD5,0x1D,0x9A,0x19,0xA8,0x00,0x92, + 0x0F,0xC8,0x01,0xF0,0xCC,0xF9,0x4A,0x90,0x22,0x9A,0x1E,0xA8,0x00,0x92,0x0F,0xC8, + 0x01,0xF0,0xC5,0xF9,0x27,0x9A,0x49,0x90,0x23,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0, + 0xBE,0xF9,0x2C,0x9A,0x48,0x90,0x28,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xB7,0xF9, + 0x31,0x9A,0x47,0x90,0x2D,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xB0,0xF9,0x46,0x90, + 0x00,0x90,0x47,0x9B,0x48,0x9A,0x49,0x99,0x4A,0x98,0x01,0xF0,0xA8,0xF9,0x00,0x28, + 0x4B,0x90,0x0F,0xD1,0x04,0x27,0x14,0x20,0x78,0x43,0x40,0x19,0x0A,0x22,0x00,0x21, + 0x00,0xF0,0xF2,0xF9,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xF4,0xD5,0x0A,0x20,0x48,0x90, + 0x25,0x90,0x4B,0x90,0x56,0x98,0x00,0x28,0x01,0xDC,0x00,0x20,0x0C,0xE0,0x2D,0x9A, + 0x00,0x92,0x28,0x9B,0x23,0x9A,0x1E,0x99,0x19,0x98,0x01,0xF0,0x88,0xF9,0x5A,0x4A, + 0x61,0x00,0x89,0x18,0x49,0x8B,0x48,0x43,0x2E,0x9A,0x45,0x90,0x00,0x92,0x29,0x9B, + 0x24,0x9A,0x1F,0x99,0x1A,0x98,0x01,0xF0,0x7A,0xF9,0x53,0x49,0x62,0x00,0x55,0x18, + 0xA9,0x8B,0x2F,0x9A,0x2A,0x9B,0x48,0x43,0x44,0x90,0x00,0x92,0x25,0x9A,0x20,0x99, + 0x1B,0x98,0x01,0xF0,0x6C,0xF9,0xE9,0x8B,0x30,0x9A,0x2B,0x9B,0x48,0x43,0x43,0x90, + 0x00,0x92,0x26,0x9A,0x21,0x99,0x1C,0x98,0x01,0xF0,0x61,0xF9,0x29,0x8C,0x48,0x43, + 0x56,0x99,0x07,0x00,0x70,0x1E,0x81,0x42,0x01,0xDB,0x00,0x20,0x09,0xE0,0x31,0x9A, + 0x2C,0x9B,0x00,0x92,0x27,0x9A,0x22,0x99,0x1D,0x98,0x01,0xF0,0x50,0xF9,0x69,0x8C, + 0x48,0x43,0x00,0x90,0x43,0x9A,0x44,0x99,0x45,0x98,0x3B,0x00,0x01,0xF0,0x47,0xF9, + 0x4B,0x99,0xFB,0xF7,0x1D,0xFC,0x38,0x49,0x0A,0x8C,0x52,0x00,0x80,0x1A,0x00,0xD5, + 0x00,0x20,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0x90,0x81,0x55,0x98,0x00,0x28, + 0x01,0xDC,0x00,0x20,0x05,0xE0,0x4D,0x98,0x4A,0x9A,0x40,0x00,0x40,0x18,0xC0,0x8F, + 0x50,0x43,0x4D,0x9A,0x2C,0x49,0x52,0x00,0x52,0x18,0x40,0x32,0x11,0x88,0x49,0x9B, + 0x48,0x9D,0x59,0x43,0x53,0x88,0x06,0x9F,0x6B,0x43,0x9C,0x46,0x93,0x88,0x47,0x9D, + 0x7F,0x1E,0x6B,0x43,0x55,0x9D,0xBD,0x42,0x01,0xDB,0x00,0x22,0x02,0xE0,0xD2,0x88, + 0x46,0x9D,0x6A,0x43,0x00,0x92,0x62,0x46,0x01,0xF0,0x11,0xF9,0x4B,0x99,0xFB,0xF7, + 0xE7,0xFB,0x1D,0x49,0x40,0x31,0x89,0x88,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20, + 0x19,0x49,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0xD0,0x83,0x08,0x79,0x08,0x28, + 0x12,0xD2,0x64,0x1C,0x54,0x98,0x24,0x04,0x24,0x14,0x84,0x42,0x00,0xDA,0x91,0xE4, + 0x42,0x98,0x00,0x28,0x08,0xD1,0x4D,0x98,0x40,0x1C,0x00,0x04,0x00,0x14,0x4D,0x90, + 0x53,0x99,0x88,0x42,0x00,0xDA,0x81,0xE4,0x0C,0x98,0x00,0x06,0x60,0xD5,0x0A,0x4C, + 0x20,0x79,0x00,0x28,0x60,0x98,0x15,0xD1,0x80,0x8B,0x00,0x28,0x51,0xD0,0x60,0x98, + 0x65,0x99,0xE2,0x88,0x40,0x7E,0x09,0x7B,0x52,0x06,0x01,0xD4,0x64,0x99,0x09,0x7A, + 0x88,0x42,0x46,0xD2,0x40,0x1C,0x41,0xE0,0xF0,0x05,0x00,0x20,0x05,0x0B,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x80,0x7E,0x09,0x99,0x88,0x42,0x36,0xD8,0x40,0x1C,0x60,0x99, + 0x00,0x06,0x00,0x0E,0x88,0x76,0x08,0x99,0x88,0x42,0x03,0xD9,0xA1,0x89,0x32,0x9A, + 0x89,0x18,0x32,0x91,0x09,0x99,0x88,0x42,0x27,0xD1,0x08,0x99,0x88,0x42,0x24,0xD0, + 0x41,0x1A,0x32,0x98,0xFB,0xF7,0x66,0xFC,0x60,0x9A,0x00,0x21,0x91,0x83,0x65,0x99, + 0x0A,0x89,0xE1,0x88,0x4B,0x06,0x01,0xD4,0x64,0x9A,0x92,0x88,0x82,0x42,0x14,0xD2, + 0x36,0x9A,0x80,0x1A,0x65,0x9A,0x49,0x06,0x92,0x79,0x01,0xD4,0x64,0x99,0x8A,0x78, + 0x64,0x21,0x50,0x43,0xFB,0xF7,0x4E,0xFC,0x60,0x99,0x00,0x04,0x00,0x0C,0x88,0x83, + 0x0A,0x99,0x88,0x42,0x01,0xD9,0x60,0x98,0x81,0x83,0x00,0x20,0x60,0x99,0x48,0x76, + 0x06,0xE0,0x60,0x99,0x00,0x20,0x88,0x76,0x60,0x99,0x48,0x76,0x60,0x99,0x88,0x83, + 0x00,0x20,0x84,0x46,0x4C,0x90,0x59,0x48,0x01,0x24,0x00,0x79,0x50,0x90,0x52,0xE0, + 0x56,0x48,0x61,0x00,0x0F,0x18,0xC0,0x37,0xB8,0x89,0x0A,0x21,0xFB,0xF7,0x2A,0xFC, + 0x05,0x04,0xF8,0x8B,0x2D,0x14,0x0A,0x21,0xFB,0xF7,0x24,0xFC,0x5E,0x99,0x02,0x04, + 0xC9,0x7E,0x12,0x14,0x00,0x20,0x84,0x46,0x51,0x91,0x36,0xE0,0x4B,0x49,0xC3,0x00, + 0x5B,0x18,0x11,0x21,0x89,0x01,0x59,0x18,0x1C,0x27,0x52,0x91,0xCF,0x5F,0xAF,0x42, + 0x27,0xDC,0x23,0x21,0x49,0x01,0x59,0x18,0x00,0x23,0xCB,0x5E,0xAB,0x42,0x20,0xDB, + 0x52,0x9F,0x1E,0x23,0xFB,0x5E,0x93,0x42,0x1B,0xDC,0x02,0x27,0xCF,0x5F,0x3F,0x4B, + 0x97,0x42,0x16,0xDB,0xA1,0x00,0xC9,0x18,0xE0,0x31,0x0E,0x23,0xCB,0x5E,0x37,0x1D, + 0x9B,0x1C,0x7B,0x43,0x0C,0x27,0xCF,0x5F,0xD9,0x19,0x4B,0x00,0x38,0x49,0x5B,0x18, + 0x04,0x21,0x59,0x5E,0x4C,0x9B,0x99,0x42,0x03,0xDD,0x4C,0x91,0x21,0x06,0x09,0x0E, + 0x8C,0x46,0x40,0x1C,0x51,0x99,0x00,0x04,0x00,0x14,0x81,0x42,0xC6,0xDC,0x64,0x1C, + 0x50,0x98,0x24,0x04,0x24,0x14,0xA0,0x42,0xAA,0xDA,0x2C,0x4D,0x4C,0x9A,0x2C,0x00, + 0x23,0x00,0x69,0x89,0x20,0x00,0xDE,0x33,0xCC,0x30,0xC2,0x34,0x91,0x42,0x4F,0x93, + 0x05,0xDC,0x61,0x46,0x00,0x29,0x02,0xD0,0x49,0x00,0x49,0x19,0x0E,0xE0,0x69,0x79, + 0x00,0x29,0x1B,0xD1,0x50,0x99,0x01,0x29,0x18,0xD9,0x62,0x99,0x89,0x78,0x00,0x29, + 0x14,0xD1,0x0D,0x99,0x00,0x29,0x11,0xD0,0x4A,0x00,0x51,0x19,0xC0,0x31,0x8E,0x89, + 0xCF,0x8B,0x12,0x22,0x00,0x21,0x00,0xF0,0x57,0xF8,0x4F,0x98,0x12,0x22,0x00,0x21, + 0x00,0xF0,0x52,0xF8,0x01,0x20,0x28,0x71,0xA6,0x81,0xE7,0x83,0x5E,0x98,0xC0,0x7D, + 0x00,0x28,0x0C,0xD0,0x00,0x21,0x29,0x71,0x5E,0x98,0x12,0x4A,0x00,0x7E,0x92,0x7F, + 0x90,0x42,0x01,0xD3,0x5E,0x9A,0xD1,0x75,0x5E,0x99,0x40,0x1C,0x08,0x76,0x02,0x99, + 0x0D,0x48,0x00,0x29,0x10,0xD0,0x29,0x79,0x00,0x29,0x0D,0xD0,0x0B,0x4A,0x01,0x68, + 0x52,0x89,0x0A,0x32,0x91,0x42,0x01,0xDA,0x49,0x1C,0x01,0x60,0x28,0x79,0x68,0x71, + 0x67,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x21,0xF6,0xE7,0xF0,0x05,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x0A,0x00,0x20,0x80,0x7A,0x00,0x00, + 0x03,0xE0,0x0B,0x78,0x49,0x1C,0x03,0x70,0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47, + 0x52,0x10,0x03,0xE0,0x0B,0x88,0x89,0x1C,0x03,0x80,0x80,0x1C,0x52,0x1E,0xF9,0xD2, + 0x70,0x47,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x09,0x06,0x09,0x0E,0x01,0xE0,0x01,0x70, + 0x40,0x1C,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x0A,0x49,0x00,0x20,0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5, + 0xC8,0x7A,0x89,0x7A,0x08,0x18,0x00,0x06,0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23, + 0x1B,0x02,0x9A,0x43,0x02,0x61,0x02,0x69,0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x00,0x90,0x00,0x40,0x10,0xB5,0x14,0x48, + 0x14,0x49,0x80,0x8B,0xC9,0x8A,0x00,0x24,0x40,0x18,0x13,0x49,0x09,0x78,0x00,0x29, + 0x12,0x49,0x04,0xD0,0x15,0x22,0x52,0x01,0x89,0x18,0x49,0x89,0x09,0xE0,0x10,0x4A, + 0xFF,0x31,0xD2,0x88,0xA1,0x31,0x49,0x8A,0x52,0x06,0x02,0xD4,0x0B,0x49,0xE0,0x31, + 0xC9,0x89,0x08,0x18,0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3, + 0x01,0x24,0xFE,0xF7,0x3F,0xFF,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x06,0x00,0x20,0xD0,0x0A,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40,0xF7,0xB5,0x2C,0x4E,0xFF,0x27,0xB0,0x7F, + 0xF1,0x7F,0x84,0xB0,0x00,0x02,0x08,0x43,0x01,0xF0,0x16,0xFD,0x30,0x00,0x20,0x38, + 0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x26,0x48,0x01,0x78,0x26,0x48,0x00,0x7A,0x00,0x29, + 0x02,0xD0,0x01,0xF0,0xA9,0xFC,0x01,0xE0,0x01,0xF0,0xD6,0xFC,0x22,0x48,0x02,0x25, + 0xC1,0x6A,0x03,0x91,0x01,0x6A,0x02,0x91,0x41,0x6A,0x01,0x91,0x41,0x6B,0x00,0x91, + 0x21,0xE0,0x1D,0x4F,0x00,0x20,0xF8,0x62,0x18,0x48,0xA0,0x30,0x80,0x68,0x38,0x62, + 0x1A,0x48,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFC,0xF7,0x08,0xF9, + 0x64,0x1E,0xF9,0xD5,0x02,0x20,0x78,0x63,0x30,0x7F,0x01,0x00,0xFC,0xF7,0x82,0xF9, + 0x01,0x24,0x04,0xA8,0x07,0xC8,0xFE,0xF7,0x81,0xFE,0x07,0x00,0x01,0xD1,0x00,0x24, + 0x25,0x00,0x64,0x1E,0xF5,0xD5,0x28,0x00,0x6D,0x1E,0x00,0x28,0xD9,0xDC,0x0A,0x48, + 0x03,0x99,0xC1,0x62,0x02,0x99,0x01,0x62,0x01,0x99,0x41,0x62,0x00,0x99,0x41,0x63, + 0x38,0x00,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00, + 0xFD,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x80,0x90,0x00,0x40,0x80,0x7A,0x00,0x00, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x71,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0xB8,0x01,0x8D,0xE5,0x24,0x07,0x9F,0xE5,0x28,0x37,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x28,0x67,0x9F,0xE5,0xB0,0x01,0x8D,0xE5,0x14,0x07,0x9F,0xE5,0x00,0xB0,0xD0,0xE5, + 0xB6,0x00,0xD3,0xE1,0x40,0x10,0x00,0xE2,0x0C,0x07,0x9F,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x4C,0x80,0xE2,0xBC,0x1E,0xD0,0x01,0xB0,0x1B,0xD4,0x11,0x02,0xAC,0x80,0xE2, + 0xAC,0x11,0x8D,0xE5,0xB0,0x1F,0xD0,0x01,0xB4,0x1B,0xD4,0x11,0xA8,0x11,0x8D,0xE5, + 0xF8,0x1A,0xD4,0x01,0xFC,0x16,0xDA,0x11,0xA0,0x11,0x8D,0xE5,0xFA,0x1A,0xD4,0x01, + 0xFE,0x16,0xDA,0x11,0x9C,0x11,0x8D,0xE5,0xF4,0x10,0xD0,0x05,0xB8,0x11,0xD0,0x15, + 0x98,0x11,0x8D,0xE5,0xF5,0x10,0xD0,0x05,0xB9,0x11,0xD0,0x15,0x94,0x11,0x8D,0xE5, + 0xF6,0x10,0xD0,0x05,0xBA,0x11,0xD0,0x15,0x90,0x11,0x8D,0xE5,0xF7,0x10,0xD0,0x05, + 0xBB,0x11,0xD0,0x15,0x8C,0x11,0x8D,0xE5,0xBC,0x1F,0xD0,0x01,0xB0,0x1C,0xD4,0x11, + 0x88,0x11,0x8D,0xE5,0xBE,0x1F,0xD0,0x01,0xB2,0x1C,0xD4,0x11,0x84,0x11,0x8D,0xE5, + 0xB0,0x10,0xD4,0x01,0xB4,0x1C,0xD4,0x11,0x80,0x11,0x8D,0xE5,0xB2,0x10,0xD4,0x01, + 0xB6,0x1C,0xD4,0x11,0x7C,0x11,0x8D,0xE5,0xB8,0x1F,0xD0,0x01,0xBC,0x1B,0xD4,0x11, + 0x78,0x11,0x8D,0xE5,0xBA,0x0F,0xD0,0x01,0xBE,0x0B,0xD4,0x11,0x74,0x01,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0x30,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5, + 0x24,0x00,0x8D,0xE5,0x20,0x00,0x8D,0xE5,0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x04,0x00,0x8D,0xE5,0xB8,0x05,0xC6,0xE1,0x00,0x90,0xA0,0xE1,0xBA,0x05,0xC6,0xE1, + 0x01,0x5C,0x46,0xE2,0xBC,0x05,0xC6,0xE1,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x70,0x00,0x85,0xE2,0x49,0xFF,0xFF,0xEB,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x98,0x00,0x85,0xE2,0x45,0xFF,0xFF,0xEB,0x00,0x00,0xA0,0xE3,0xB4,0x01,0x8D,0xE5, + 0x00,0x10,0xA0,0xE1,0xB0,0x0C,0xC5,0xE1,0x50,0x20,0xA0,0xE3,0x49,0x0F,0x8D,0xE2, + 0x3E,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD4,0x00,0x8D,0xE2, + 0x3A,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x84,0x00,0x8D,0xE2, + 0x36,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x34,0x00,0x8D,0xE2, + 0x32,0xFF,0xFF,0xEB,0xA8,0x05,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0xF8,0x7A,0xDA,0x11,0xB6,0x0A,0xDA,0x11,0x07,0x00,0x00,0x1A,0x84,0x05,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x40,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xF2,0x71,0xD4,0x01, + 0xF6,0x7D,0xD4,0x11,0xB0,0x01,0xD4,0x01,0xB4,0x0D,0xD4,0x11,0x00,0x80,0xA0,0xE3, + 0x08,0x50,0xA0,0xE1,0xA4,0x01,0x8D,0xE5,0x68,0x05,0x9F,0xE5,0xC0,0x01,0x8D,0xE5, + 0x0E,0x0C,0x80,0xE2,0xBC,0x01,0x8D,0xE5,0x82,0x00,0x00,0xEA,0x00,0x40,0xA0,0xE3, + 0x7C,0x00,0x00,0xEA,0xC0,0x01,0x9D,0xE5,0x0F,0x2A,0xE0,0xE3,0x08,0x11,0x90,0xE7, + 0x01,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0x21,0x18,0x02,0xE0,0x01,0x30,0x40,0xE0, + 0x00,0x00,0x41,0xE0,0x9C,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3, + 0xD4,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7, + 0x9C,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x34,0x20,0x8D,0xC2, + 0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5, + 0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x49,0x2F,0x8D,0xC2,0x05,0xC1,0x92,0xC7, + 0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0, + 0x00,0x00,0x51,0xE3,0x84,0x20,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0, + 0x05,0x11,0x82,0xC7,0xB4,0x11,0x9D,0xE5,0x01,0x00,0x53,0xE1,0xB4,0x31,0x8D,0xC5, + 0x30,0x40,0x8D,0xC5,0x2C,0x50,0x8D,0xC5,0xC8,0x00,0x53,0xE3,0xB8,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xB8,0x15,0xC6,0xC1,0x96,0x00,0x50,0xE3,0xBA,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBA,0x15,0xC6,0xC1,0x19,0x0E,0x53,0xE3,0xBC,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBC,0x15,0xC6,0xC1,0x68,0x14,0x9F,0xE5,0xB6,0x10,0xD1,0xE1, + 0x40,0x00,0x11,0xE3,0xB0,0x18,0xDA,0xE1,0x01,0x28,0xE0,0x13,0x81,0x10,0x02,0x10, + 0x00,0x00,0x53,0xE3,0x03,0x28,0xA0,0xC1,0x00,0x20,0xA0,0xD3,0x22,0x28,0xA0,0xC1, + 0x00,0x00,0x50,0xE3,0x00,0x08,0xA0,0xC1,0x00,0x00,0xA0,0xD3,0x20,0x08,0xA0,0xC1, + 0x01,0x00,0x50,0xE1,0x01,0xC0,0x89,0x82,0x01,0x98,0xCC,0x83,0x01,0x00,0x52,0xE1, + 0x0C,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x0C,0xC0,0x8D,0x85, + 0x81,0x00,0x50,0xE1,0x08,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83, + 0x08,0xC0,0x8D,0x85,0x81,0x00,0x52,0xE1,0x04,0x10,0x9D,0x85,0x01,0x10,0x81,0x82, + 0x01,0x18,0xC1,0x83,0x04,0x10,0x8D,0x85,0x10,0x10,0x9D,0xE5,0x00,0x00,0x53,0xE3, + 0x01,0x00,0x80,0xE0,0x10,0x00,0x8D,0xE5,0x00,0x30,0xA0,0xB3,0x01,0x00,0x4B,0xE2, + 0x00,0x00,0x55,0xE1,0x06,0x00,0x00,0x1A,0x00,0x00,0x53,0xE3,0x04,0x00,0x00,0x0A, + 0x03,0x02,0x63,0xE0,0x00,0x01,0xA0,0xE1,0x64,0x10,0xA0,0xE3,0xFC,0xEB,0xFF,0xEB, + 0x00,0x30,0xA0,0xE1,0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1,0x11,0xF8,0xFF,0xEB, + 0xB4,0x13,0x9F,0xE5,0x00,0x00,0x57,0xE3,0x80,0x00,0x81,0xE0,0xB0,0x30,0xC0,0xE1, + 0x00,0x00,0x67,0xD2,0x07,0x00,0xA0,0xC1,0x03,0x00,0x50,0xE1,0xB8,0x11,0x9D,0xB5, + 0x07,0x00,0x83,0xB0,0x01,0x00,0x80,0xB0,0xB8,0x01,0x8D,0xB5,0x05,0x10,0xA0,0xE1, + 0x04,0x00,0xA0,0xE1,0xDA,0xF7,0xFF,0xEB,0xBC,0x11,0x9D,0xE5,0x7C,0x23,0x9F,0xE5, + 0x08,0x11,0x91,0xE7,0x80,0x00,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x80,0x88,0xE2, + 0x01,0x40,0x84,0xE2,0xB0,0x10,0xC0,0xE1,0xB0,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1, + 0x7F,0xFF,0xFF,0x3A,0x01,0x50,0x85,0xE2,0x0B,0x00,0x55,0xE1,0x7A,0xFF,0xFF,0x3A, + 0x60,0xFA,0xFF,0xEB,0x2C,0x63,0x9F,0xE5,0xA8,0x01,0x9D,0xE5,0xBE,0x00,0xC6,0xE1, + 0xAC,0x01,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x0A,0x00,0x00,0x0A,0xB0,0x01,0x9D,0xE5, + 0x64,0x10,0xA0,0xE3,0x9B,0x00,0x00,0xE0,0x90,0x01,0x01,0xE0,0xB8,0x01,0x9D,0xE5, + 0xA4,0x21,0x9D,0xE5,0x92,0x00,0x00,0xE0,0x3A,0xEC,0xFF,0xEB,0xA8,0x11,0x9D,0xE5, + 0x01,0x00,0x50,0xE1,0xBE,0x00,0xC6,0x31,0xB0,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3, + 0x90,0x01,0x07,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA,0x49,0x0F,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x98,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1, + 0x2C,0xEC,0xFF,0xEB,0x88,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xBC,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1, + 0x84,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x94,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x07,0x10,0xA0,0xE1,0x1F,0xEC,0xFF,0xEB,0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xAF,0xFA,0xFF,0xEB, + 0x00,0x00,0x45,0xE0,0x78,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x91,0x00,0x00,0xE0,0x84,0x50,0x86,0xE0,0x64,0x10,0xA0,0xE3,0xA4,0xEB,0xFF,0xEB, + 0x01,0x40,0x84,0xE2,0xB0,0x07,0xC5,0xE1,0x0B,0x00,0x54,0xE1,0xDA,0xFF,0xFF,0x3A, + 0x64,0x00,0xA0,0xE3,0x9B,0x00,0x05,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA, + 0xD4,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x90,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x05,0x10,0xA0,0xE1,0x03,0xEC,0xFF,0xEB,0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x93,0xFA,0xFF,0xEB, + 0x00,0x70,0xA0,0xE1,0x34,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x8C,0x11,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x05,0x10,0xA0,0xE1,0xF6,0xEB,0xFF,0xEB,0x7C,0x11,0x9D,0xE5, + 0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1, + 0x86,0xFA,0xFF,0xEB,0x00,0x00,0x47,0xE0,0x74,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x91,0x00,0x00,0xE0,0x84,0x70,0x86,0xE0,0x64,0x10,0xA0,0xE3, + 0x7B,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2,0xB8,0x09,0xC7,0xE1,0xB0,0x01,0x9D,0xE5, + 0x00,0x00,0x54,0xE1,0xD9,0xFF,0xFF,0x3A,0xB4,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x0D,0x00,0x00,0xDA,0x30,0x00,0x9D,0xE5,0x2C,0x10,0x9D,0xE5,0x80,0x00,0x86,0xE0, + 0x81,0x10,0x86,0xE0,0xB8,0x09,0xD0,0xE1,0xB0,0x17,0xD1,0xE1,0x00,0x10,0x81,0xE0, + 0xB4,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1, + 0xB0,0x0C,0xC6,0xE1,0x00,0x00,0xA0,0x43,0xB0,0x0C,0xC6,0x41,0xB0,0x01,0x9D,0xE5, + 0x01,0x00,0x40,0xE2,0x9B,0x00,0x01,0xE0,0x10,0x00,0x9D,0xE5,0xCD,0xEB,0xFF,0xEB, + 0xB6,0x10,0xD6,0xE1,0x0C,0x20,0x9D,0xE5,0x40,0x00,0x11,0xE3,0x10,0x00,0x00,0x0A, + 0x82,0x00,0x59,0xE1,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85,0x08,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35,0x14,0x00,0x59,0xE3,0x13,0x00,0x00,0x9A, + 0x10,0x00,0x00,0xEA,0x02,0x00,0x59,0xE1,0x08,0x00,0x59,0x83,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85, + 0x08,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85, + 0x04,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35, + 0x0A,0x00,0x59,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x14,0x00,0x8D,0xE5, + 0x24,0x00,0x9D,0xE5,0x20,0x20,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x02,0x30,0x80,0xE1, + 0x1C,0x00,0x9D,0xE5,0x18,0x20,0x9D,0xE5,0x02,0x00,0x00,0xE0,0x00,0x20,0x83,0xE1, + 0x14,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13, + 0x02,0x00,0x90,0xE1,0x28,0x00,0x9D,0x05,0x00,0x00,0x50,0x03,0x09,0x00,0x00,0x0A, + 0xC4,0x00,0x96,0xE5,0x01,0x00,0x80,0xE2,0xC4,0x00,0x86,0xE5,0xC8,0x00,0xD6,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xC8,0x00,0xC6,0x15,0x71,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xC8,0x00,0xD6,0xE5,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0xC8,0x00,0xC6,0xE5,0xB4,0x18,0xDA,0xE1,0x01,0x00,0x50,0xE1, + 0xF5,0xFF,0xFF,0x1A,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC6,0xE5,0xC4,0x00,0x96,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xC4,0x00,0x86,0xC5,0xEE,0xFF,0xFF,0xEA, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x02,0x10,0x40,0xC8,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0xCA,0x49,0xC8,0x4F,0xC9,0x88,0xB8,0x7D,0xC9,0x4C, + 0x00,0x25,0x49,0x06,0x8D,0xB0,0x00,0xD4,0xA0,0x7C,0x03,0x90,0xC3,0x48,0x40,0x38, + 0x42,0x79,0x06,0x00,0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38, + 0xB3,0x7A,0x00,0x7A,0xFE,0xF7,0xED,0xFB,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7, + 0xDD,0xFB,0x31,0x00,0x20,0x39,0x0A,0x7A,0xC0,0x39,0x00,0x06,0x0C,0x91,0x09,0x79, + 0x00,0x0E,0xFE,0xF7,0xD7,0xFB,0x00,0x06,0xBA,0x7D,0xA1,0x7C,0x00,0x0E,0xFE,0xF7, + 0xD1,0xFB,0x00,0x06,0xB4,0x4E,0x00,0x0E,0x02,0x90,0x30,0x7B,0x00,0x28,0x02,0xD0, + 0xB2,0x48,0x40,0x89,0x0A,0xE0,0xAE,0x49,0x78,0x8A,0xC9,0x88,0x49,0x06,0x00,0xD4, + 0xE0,0x89,0xAF,0x49,0xC9,0x8A,0x40,0x18,0x00,0x04,0x00,0x0C,0x00,0x27,0x04,0x90, + 0x77,0x61,0x30,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0xAD,0xFA,0x01,0xF0,0x9B,0xFA,0x01,0x20,0x30,0x62,0xFC,0xF7,0xF5,0xFB,0xA0,0x48, + 0x05,0x22,0x01,0x00,0xFF,0x31,0x61,0x31,0x0A,0x91,0x9E,0x49,0xD2,0x01,0xE0,0x39, + 0x8B,0x18,0x09,0x93,0x03,0x00,0xC0,0x33,0x80,0x31,0x07,0xAC,0x0A,0xC4,0x02,0x99, + 0xC9,0x1C,0x06,0x91,0x51,0x00,0x44,0x18,0x80,0x18,0x05,0x90,0x10,0xE1,0x30,0x7A, + 0x00,0x28,0x04,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x87,0xFA,0xFF,0x20, + 0x81,0x30,0xFB,0xF7,0xAD,0xF9,0x03,0x20,0x01,0xF0,0xBE,0xF9,0x00,0xF0,0x68,0xF9, + 0x01,0x20,0x40,0x05,0xFC,0xF7,0x04,0xFE,0xFF,0xF7,0xCA,0xFB,0x00,0x20,0xFC,0xF7, + 0xFF,0xFD,0x87,0x48,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06, + 0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0x82,0xF8,0xFC,0xF7,0x34,0xFE, + 0x84,0x48,0x04,0x99,0x80,0x8B,0x40,0x18,0x7D,0x49,0x89,0x89,0x88,0x42,0x10,0xD9, + 0x0A,0x98,0x40,0x78,0x00,0x28,0x0C,0xD1,0x79,0x48,0xFF,0x21,0xC0,0x88,0x19,0x31, + 0x08,0x42,0x06,0xD1,0x03,0x98,0x6D,0x1C,0x85,0x42,0x03,0xDD,0xFC,0xF7,0x24,0xFE, + 0x00,0xE0,0x00,0x25,0x00,0xF0,0x4C,0xFE,0x00,0xF0,0xCE,0xFD,0x00,0xF0,0x22,0xFE, + 0x09,0x99,0x08,0x98,0x49,0x88,0x40,0x68,0x88,0x42,0x0C,0xDB,0x0A,0x98,0x40,0x78, + 0x00,0x28,0x04,0xD1,0x6A,0x48,0x46,0x21,0xC0,0x88,0x08,0x42,0x03,0xD0,0x6A,0x49, + 0x01,0x20,0x48,0x70,0x02,0xE0,0x70,0x78,0x00,0x28,0x0D,0xD0,0xFC,0xF7,0x88,0xFB, + 0x64,0x48,0x01,0x21,0xE0,0x38,0xC0,0x7F,0x40,0x08,0x01,0xF0,0x95,0xF8,0x62,0x48, + 0x47,0x70,0x08,0x98,0x47,0x60,0xA9,0xE0,0xFC,0xF7,0xC4,0xFD,0xFD,0xF7,0x3C,0xFF, + 0x00,0x28,0x08,0xD0,0x77,0x61,0x05,0x98,0x80,0x7B,0xC8,0x28,0x10,0xD2,0x05,0x99, + 0x40,0x1C,0x88,0x73,0x0C,0xE0,0x70,0x69,0x40,0x1C,0x70,0x61,0x70,0x69,0x01,0x28, + 0x01,0xD1,0x59,0x48,0x07,0x73,0x70,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7,0x54,0xFB, + 0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x60,0x68,0xFF,0x21,0xFF,0x31, + 0x88,0x42,0x03,0xDA,0x40,0x1C,0x60,0x60,0x00,0xE0,0x67,0x60,0x09,0x99,0x20,0x68, + 0x49,0x89,0x88,0x42,0x0A,0xDD,0x61,0x68,0xFF,0x20,0xF5,0x30,0x81,0x42,0x05,0xDD, + 0x01,0x20,0x70,0x70,0x27,0x60,0x67,0x60,0x08,0x99,0x48,0x60,0x47,0x48,0x41,0x68, + 0x09,0x07,0x07,0xD5,0xC1,0x68,0x00,0x29,0x04,0xD0,0xC0,0x68,0x01,0x21,0x49,0x07, + 0xC8,0x63,0x06,0xE0,0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0x31,0xFC,0x00,0xF0, + 0x11,0xF9,0xFC,0xF7,0x27,0xFE,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B, + 0x00,0x28,0x01,0xD1,0x00,0xF0,0xC0,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28, + 0x4C,0xD1,0x07,0x98,0x00,0x7A,0x00,0x28,0x01,0xD0,0xFF,0xF7,0x5B,0xFA,0x00,0xF0, + 0x9B,0xF8,0x03,0x20,0x01,0xF0,0xD2,0xF8,0xF0,0x62,0x03,0x20,0x01,0xF0,0x00,0xF9, + 0xFF,0x20,0x81,0x30,0xFB,0xF7,0xD4,0xF8,0x2D,0x48,0x00,0x78,0x00,0x28,0x2F,0xD1, + 0xFC,0xF7,0xD8,0xFE,0x00,0x28,0x2B,0xD0,0xB0,0x6A,0x00,0x28,0x0B,0x90,0x27,0xD0, + 0xF0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x26,0x49,0xFA,0xF7,0x8B,0xFD,0x0B,0x99, + 0x08,0x1A,0x32,0x28,0x1C,0xDD,0x01,0xF0,0xA7,0xF9,0x01,0xF0,0xAB,0xF9,0xB0,0x79, + 0x00,0x28,0x0D,0xD0,0x00,0xF0,0x4E,0xF8,0x00,0xF0,0x51,0xF8,0x00,0xF0,0x59,0xF8, + 0x1D,0x4E,0x01,0x20,0x70,0x60,0xFB,0xF7,0xBB,0xF8,0x1C,0x48,0x70,0x60,0x03,0xE0, + 0x1B,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0x9B,0xF9,0x18,0x48,0x07,0x70, + 0x0D,0x4E,0x70,0x69,0x06,0x99,0x88,0x42,0x00,0xD2,0xE8,0xE6,0x0C,0x98,0x0C,0x49, + 0x40,0x78,0xA0,0x39,0x48,0x73,0x08,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x01,0xF0, + 0x65,0xF9,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xE0,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20,0x90,0x08,0x00,0x20,0x00,0x40,0x00,0x30, + 0xAD,0x0B,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00, + 0xAC,0x0B,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20, + 0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60, + 0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x78,0x00,0x00,0x10,0xB5,0xFC,0xF7,0xB3,0xFC,0xFA,0xF7, + 0x35,0xFD,0x03,0x20,0x40,0x03,0xFB,0xF7,0x3B,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x03,0x20,0x10,0xB5,0x40,0x03,0xFB,0xF7,0x3B,0xF8,0xFA,0xF7,0x31,0xFD,0xFC,0xF7, + 0xA9,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0,0xDF,0xFB,0x05,0x49, + 0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7,0x59,0xFF,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x16,0x48,0x17,0x4E,0x00,0x78, + 0x00,0x25,0x01,0x90,0x14,0x48,0x00,0x78,0x00,0x90,0x1C,0xE0,0x14,0x49,0x68,0x00, + 0x00,0x24,0x47,0x18,0x60,0x37,0x12,0xE0,0x29,0x00,0x20,0x00,0xFD,0xF7,0x2A,0xFC, + 0x0F,0x4B,0x62,0x00,0xD3,0x18,0x98,0x22,0x9A,0x5E,0x10,0x23,0xFB,0x5E,0x40,0x00, + 0x31,0x5E,0xD2,0x18,0x89,0x1A,0x00,0xD5,0x00,0x21,0x64,0x1C,0x31,0x52,0x01,0x98, + 0x84,0x42,0xE9,0xD3,0x6D,0x1C,0x00,0x98,0x85,0x42,0xDF,0xD3,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x66,0x4F,0x00,0x26,0x78,0x7A,0xC0,0x07,0x17,0xD0, + 0x64,0x4C,0x20,0x89,0x00,0x28,0x0E,0xD0,0x63,0x49,0x88,0x42,0x0B,0xD0,0x1E,0x21, + 0x48,0x43,0x64,0x21,0xFA,0xF7,0x9E,0xFC,0x39,0x8A,0x46,0x18,0x4B,0x20,0xC0,0x00, + 0x86,0x42,0x00,0xD9,0x06,0x00,0x5D,0x48,0x40,0x7D,0x00,0x28,0x00,0xD0,0xA6,0x89, + 0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7E,0xD0,0x59,0x48,0x00,0x21,0x01,0x70, + 0x02,0x20,0x00,0xF0,0xE5,0xFF,0x57,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x82,0xFC, + 0x01,0x00,0x02,0x20,0x00,0xF0,0xC8,0xFF,0x01,0x2D,0x0B,0xD0,0x02,0x2D,0x08,0xD1, + 0x60,0x68,0x00,0x02,0x00,0x0E,0x01,0x28,0x03,0xD1,0x60,0x68,0x00,0x06,0x00,0xD1, + 0x00,0xE0,0x6D,0x1C,0x78,0x7A,0x00,0x28,0x08,0xD0,0x60,0x68,0x4A,0x49,0x81,0x43, + 0x04,0xD0,0x61,0x68,0x49,0x48,0x88,0x43,0x00,0xD0,0x6D,0x1C,0xF8,0x79,0x00,0x28, + 0x04,0xD1,0x47,0x48,0x41,0x69,0x02,0x15,0x11,0x43,0x41,0x61,0x45,0x48,0x01,0x68, + 0x45,0x48,0xC1,0x61,0x02,0x24,0x20,0x00,0x00,0xF0,0xA6,0xFF,0x43,0x48,0xC1,0x68, + 0x49,0x08,0x49,0x00,0xC1,0x60,0x03,0x04,0x35,0x48,0x36,0x4A,0x41,0x7A,0x3E,0x48, + 0x97,0x89,0x21,0xE0,0x42,0x69,0x52,0x06,0x0E,0xD4,0x00,0x29,0x01,0xD0,0xAC,0x42, + 0x04,0xD2,0xA2,0x00,0xD2,0x18,0x12,0x68,0xC2,0x61,0x04,0xE0,0xCA,0x07,0x01,0xD0, + 0xC6,0x61,0x00,0xE0,0xC7,0x61,0x64,0x1C,0x2D,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0, + 0xFD,0xF7,0xB4,0xFC,0x26,0x48,0x01,0x7A,0x00,0x29,0x07,0xD0,0x00,0x6B,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0x3B,0xF8,0x01,0xE0,0xAC,0x42,0xDB,0xD9,0x02,0x20,0x00,0xF0, + 0x7F,0xFF,0x23,0x4D,0x28,0x78,0x00,0x28,0x27,0xD1,0xFD,0xF7,0xC5,0xFB,0x00,0x28, + 0x23,0xD0,0x20,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x14,0xFC,0x01,0x00,0x02,0x20, + 0x00,0xF0,0x5A,0xFF,0x02,0x20,0x00,0xE0,0x26,0xE0,0x00,0xF0,0x5D,0xFF,0x14,0x4C, + 0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7,0x88,0xFC,0x20,0x7A,0x00,0x28, + 0x04,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x10,0xF8,0xFD,0xF7,0xA4,0xFB, + 0x00,0x28,0xEE,0xD1,0x02,0x20,0x00,0xF0,0x53,0xFF,0x14,0x49,0xC8,0x68,0x01,0x22, + 0x10,0x43,0xC8,0x60,0x00,0xF0,0x28,0xF8,0x05,0x48,0xC0,0x79,0x00,0x28,0x03,0xD1, + 0x01,0x20,0x80,0x02,0xFA,0xF7,0x1C,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xAD,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0x00,0x00,0x4E,0x1D,0x00,0x80,0x4E,0x1D, + 0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02, + 0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7,0x83,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x40,0x18,0x70,0x47,0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4, + 0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18,0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00, + 0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07,0x18,0x68,0x13,0x4A,0x90,0x72,0x90,0x7A, + 0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0,0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28, + 0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21,0x0C,0x30,0xFF,0xF7,0x35,0xF8,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25,0x08,0x4C,0xAD,0x01,0x08,0xE0,0x46,0x18, + 0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00,0x3F,0x19,0x7F,0x19,0x40,0x1C,0xFE,0x60, + 0x96,0x7A,0x86,0x42,0xF3,0xD8,0xEA,0xE7,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x70,0xB5,0x1E,0x49,0x1C,0x4C,0x0D,0x00,0x20,0x78,0xA1,0x22,0xFF,0x35,0x92,0x00, + 0xBF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0,0x5A,0x22,0x21,0x1D,0x28,0x00,0xFE,0xF7, + 0xEF,0xFF,0x17,0x49,0x09,0x22,0x30,0x00,0xFE,0xF7,0xEA,0xFF,0x20,0x78,0x60,0x70, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22,0x00,0x21,0x30,0x00,0xFE,0xF7,0xFC,0xFF, + 0x5A,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7,0xF7,0xFF,0x0D,0x48,0x5A,0x22,0x00,0x21, + 0x63,0x38,0xFE,0xF7,0xF1,0xFF,0x0A,0x48,0x09,0x22,0x00,0x21,0x09,0x38,0xFE,0xF7, + 0xEB,0xFF,0x00,0x20,0x05,0x49,0x60,0x70,0xA0,0x70,0xCA,0x88,0x23,0x23,0x9A,0x43, + 0xCA,0x80,0x04,0x49,0x88,0x75,0xDB,0xE7,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x6B,0x08,0x00,0x20,0x30,0x0A,0x00,0x20,0xF3,0xB5,0x93,0x48,0x91,0xB0,0x40,0x7E, + 0x02,0x90,0x92,0x48,0x00,0x78,0x00,0x28,0x91,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01, + 0x40,0x18,0x01,0x8A,0x8F,0x4A,0x1A,0x26,0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91, + 0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E,0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91, + 0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F,0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30, + 0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91,0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B, + 0x05,0x91,0x7D,0x49,0x20,0x39,0x8A,0x5E,0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92, + 0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22,0x41,0x5E,0x82,0x5E,0x11,0x98,0x78,0x4C, + 0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60,0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98, + 0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0, + 0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0, + 0x17,0xFF,0x20,0x8C,0x64,0x21,0x0A,0x90,0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08, + 0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A, + 0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28,0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90, + 0x61,0x48,0x01,0x78,0x61,0x48,0x00,0x78,0x08,0x90,0x61,0x48,0x80,0x7E,0xC2,0x07, + 0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E,0x09,0x06,0x09,0x0E,0x04,0xE0,0x08,0x98, + 0x40,0x1E,0x00,0x06,0x00,0x0E,0x08,0x90,0x20,0x00,0xFA,0xF7,0xD9,0xF9,0x0A,0x99, + 0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99,0x28,0x00,0xFA,0xF7,0xD1,0xF9,0x09,0x99, + 0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90,0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97, + 0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98,0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB, + 0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22, + 0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42,0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43, + 0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A,0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A, + 0xFA,0xF7,0xA6,0xF9,0xC7,0x19,0x04,0x98,0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0, + 0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0,0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7, + 0x97,0xF9,0x07,0x99,0xC9,0x07,0x0A,0xD0,0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18, + 0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99,0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98, + 0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B,0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00,0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42, + 0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A,0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43, + 0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B,0x89,0x1A,0xFA,0xF7,0x69,0xF9,0x86,0x19, + 0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00, + 0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21,0xFA,0xF7,0x5A,0xF9,0x07,0x99,0x89,0x07, + 0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18,0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99, + 0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48,0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A, + 0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C,0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A, + 0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x48,0xFE, + 0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0x04,0x0B,0x00,0x20, + 0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0x70,0xB4,0x0B,0x4C,0x03,0x00,0x00,0x20,0x82,0x00,0xA5,0x5A, + 0x12,0x19,0x56,0x88,0xEA,0x1A,0x15,0x00,0x55,0x43,0x72,0x1A,0x16,0x00,0x56,0x43, + 0xAA,0x19,0xC4,0x2A,0x04,0xDB,0x40,0x1C,0x2A,0x28,0xEF,0xD3,0x00,0x20,0xC0,0x43, + 0x70,0xBC,0x70,0x47,0xB8,0x70,0x00,0x00,0xFE,0xB5,0x66,0x4D,0x64,0x48,0x00,0x26, + 0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x78,0x61,0x31,0x08,0x78,0x00,0x2A,0x28,0xD1, + 0x00,0x28,0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30, + 0x6B,0x30,0xFD,0xF7,0xCF,0xFB,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B,0x00,0x98, + 0x40,0x1C,0x81,0x42,0x14,0xD3,0xA9,0x19,0x13,0x22,0x00,0x90,0xFF,0x20,0x92,0x01, + 0x65,0x30,0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x70,0x76,0x1C,0x65,0x32, + 0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x29,0xFA,0x64,0x1C,0x09,0x2C,0xDA,0xDB, + 0x8F,0xE0,0x49,0x78,0x00,0x29,0x01,0xD1,0x00,0x28,0xF9,0xD0,0x15,0x20,0x40,0x01, + 0x00,0x24,0x2E,0x18,0x13,0x27,0xBF,0x01,0x28,0x19,0xC0,0x19,0x40,0x78,0x00,0x28, + 0x3F,0xD0,0x13,0x21,0x28,0x18,0x49,0x01,0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0, + 0x32,0x7B,0x00,0x2A,0x14,0xD0,0x05,0x21,0xC9,0x01,0x40,0x18,0x00,0x99,0x00,0x79, + 0x49,0x1C,0x00,0x91,0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xBF,0x32,0x02,0x20, + 0x03,0x23,0x69,0x46,0x00,0xF0,0xFA,0xF9,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0, + 0x0A,0x20,0x41,0x43,0x48,0x19,0x02,0x90,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x7A,0xFB, + 0x00,0x28,0x13,0xD0,0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x65,0x32, + 0x03,0x20,0x02,0x23,0x69,0x46,0x00,0xF0,0xE1,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19, + 0x8A,0x78,0x40,0x1C,0x4A,0x70,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C, + 0xBA,0xDB,0x01,0x24,0x23,0x49,0x13,0x22,0x08,0x19,0x52,0x01,0x80,0x18,0xC0,0x7E, + 0x00,0x22,0x01,0x92,0x00,0x28,0x31,0xD0,0x32,0x7B,0x00,0x2A,0x2E,0xD1,0x0A,0x22, + 0x50,0x43,0x45,0x18,0x28,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x4B,0xFB,0x00,0x28, + 0x24,0xD0,0x19,0x48,0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x21,0xD3,0x15,0x4A, + 0x00,0x20,0x11,0x18,0xC9,0x19,0x49,0x78,0xA1,0x42,0x0B,0xD0,0x00,0x29,0x06,0xD1, + 0xFF,0x21,0x65,0x31,0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x70,0x05,0xE0,0x40,0x1C, + 0x08,0x28,0xEE,0xDB,0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93, + 0x65,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x98,0xF9,0x64,0x1C,0x09,0x2C, + 0xC0,0xDB,0x00,0x98,0x00,0xF0,0x88,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xFE,0xB5,0x51,0x48, + 0x36,0x25,0x45,0x5F,0x51,0x48,0x50,0x4F,0xC4,0x78,0x00,0x26,0x02,0x94,0x00,0x79, + 0x84,0x46,0x4C,0x48,0x80,0x30,0x82,0x7D,0x86,0x46,0x4D,0x48,0x81,0x7E,0xC8,0x07, + 0x0A,0xD0,0x88,0x07,0x03,0xD5,0x64,0x1E,0x24,0x06,0x24,0x0E,0x04,0xE0,0x60,0x46, + 0x40,0x1E,0x00,0x06,0x00,0x0E,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0, + 0x91,0x42,0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3, + 0x63,0x46,0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42, + 0x03,0xD2,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x02,0x9B,0x4B,0x43,0x1B,0x18, + 0x9B,0x00,0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42, + 0x00,0xDA,0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3, + 0x1E,0x24,0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22, + 0x9A,0x5E,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A, + 0x24,0x14,0x02,0x04,0x12,0x14,0x26,0x48,0x80,0x30,0xC1,0x6A,0xA6,0x42,0x05,0xDD, + 0x74,0x46,0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD, + 0x49,0x1E,0xC1,0x62,0x1E,0x49,0x80,0x31,0x09,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88, + 0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x01,0x63, + 0x74,0x46,0xA4,0x8B,0xC5,0x6A,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21, + 0x9B,0x88,0x00,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70, + 0x59,0x70,0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46, + 0x11,0x43,0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71, + 0x70,0x46,0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xF8,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88, + 0x01,0x23,0x22,0x4D,0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05, + 0x20,0x18,0x00,0x29,0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A, + 0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61, + 0xE0,0x6A,0x0E,0xE0,0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A, + 0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61, + 0xA0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0x33,0xF8,0xB0,0x62, + 0x30,0x7B,0x00,0x28,0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A, + 0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0x24,0xF8,0x70,0x62,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xC0,0x90,0x00,0x40, + 0x10,0x27,0x00,0x00,0xF8,0x0A,0x00,0x20,0x80,0x79,0x00,0x00,0x81,0x11,0x01,0x00, + 0x10,0x00,0x10,0x00,0x0E,0x48,0x0F,0x4A,0x43,0x78,0x0F,0x49,0xD0,0x1D,0xC9,0x88, + 0xFF,0x32,0xF9,0x30,0xC1,0x32,0x02,0x2B,0x04,0xD9,0x12,0x6A,0x49,0x06,0x0C,0xD4, + 0xC2,0x69,0x0A,0xE0,0x02,0x2B,0x04,0xD1,0xD2,0x69,0x49,0x06,0x05,0xD4,0x82,0x69, + 0x03,0xE0,0x92,0x69,0x49,0x06,0x00,0xD4,0x42,0x69,0x04,0x48,0x42,0x62,0x70,0x47, + 0x50,0x07,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40, + 0xF0,0xB4,0x0B,0x48,0x0D,0x4B,0xC0,0x88,0x0A,0x49,0x0C,0x4F,0x42,0x06,0x0A,0x48, + 0x01,0x24,0xE4,0x03,0x32,0x25,0x5E,0x00,0x32,0x3F,0x01,0x61,0x43,0x61,0x84,0x61, + 0xC5,0x61,0x04,0x62,0x46,0x62,0x84,0x62,0xC7,0x62,0xF0,0xBC,0x70,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x00,0x80,0x00,0x03,0x40,0xA1,0x00,0x40,0x64,0x40,0x00,0x00, + 0x70,0xB5,0x01,0x25,0x6D,0x03,0x28,0x00,0xFA,0xF7,0x02,0xFB,0x16,0x48,0x04,0x68, + 0x28,0x00,0xFA,0xF7,0xF5,0xFA,0x15,0x4D,0xE2,0x06,0xD2,0x0E,0xE0,0x04,0x14,0x49, + 0xC0,0x0E,0x2A,0x71,0xE8,0x70,0x0B,0x7D,0x12,0x48,0x83,0x76,0x4B,0x7D,0xC3,0x76, + 0x83,0x7E,0x11,0x48,0xDC,0x07,0x0A,0xD0,0x9B,0x07,0x04,0xD5,0xEA,0x78,0x52,0x1E, + 0x02,0x72,0x00,0x22,0x02,0xE0,0x52,0x1E,0x02,0x72,0x01,0x22,0x6A,0x71,0x8A,0x7D, + 0x42,0x72,0xCA,0x7D,0x82,0x72,0x0A,0x7E,0xC2,0x72,0x4A,0x7E,0x02,0x73,0x89,0x7E, + 0x41,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x90,0x00,0x40,0xF8,0x0A,0x00,0x20, + 0x00,0x78,0x00,0x00,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0xF8,0xB5,0x05,0x00, + 0x0E,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0xFA,0xF7,0xBE,0xFF,0x00,0x28,0x05,0xD0, + 0x30,0x68,0x40,0x1E,0x30,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x2D,0x48,0x80,0x7E, + 0xC0,0x07,0x26,0xD0,0xE0,0x79,0x05,0x28,0x21,0xD0,0x09,0x28,0x21,0xD1,0x2A,0x49, + 0x6D,0x08,0x6D,0x00,0x23,0x78,0x01,0x20,0x8C,0x46,0x13,0xE0,0x0A,0x22,0x01,0x00, + 0x51,0x43,0x26,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32,0xA1,0x32,0x97,0x7F,0xBB,0x42, + 0x07,0xD1,0xFF,0x31,0xC1,0x31,0x0F,0x88,0x67,0x80,0xD2,0x7F,0x62,0x70,0x49,0x88, + 0xA1,0x80,0x40,0x1C,0x61,0x46,0x49,0x78,0x81,0x42,0xE7,0xDA,0x01,0xE0,0x01,0x20, + 0x05,0x43,0x0F,0x20,0xA9,0x07,0x80,0x06,0x81,0x43,0x20,0x78,0x3F,0x22,0x92,0x02, + 0x00,0x07,0x80,0x08,0x01,0x43,0x16,0x48,0x01,0x40,0x60,0x88,0x80,0x05,0x80,0x09, + 0x01,0x43,0x60,0x78,0x91,0x43,0x80,0x06,0x00,0x0C,0x01,0x43,0x08,0x04,0x80,0x0E, + 0x0A,0x28,0x09,0xD2,0x40,0x1C,0x0A,0x23,0x58,0x43,0x3F,0x28,0x00,0xDD,0x3F,0x20, + 0x80,0x06,0x91,0x43,0x00,0x0C,0x01,0x43,0x88,0x0A,0xA1,0x88,0x80,0x02,0x01,0x22, + 0x89,0x05,0x89,0x0D,0x08,0x43,0x31,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60, + 0xA1,0xE7,0x00,0x00,0x30,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09, + 0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72, + 0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73, + 0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7, + 0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00,0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00, + 0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7,0x11,0xFE,0x38,0x80, + 0x21,0x00,0x30,0x00,0xF9,0xF7,0x0C,0xFE,0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80, + 0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98, + 0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91,0xF9,0xF7,0xF0,0xFD, + 0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43,0xF9,0xF7,0xE8,0xFD, + 0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79,0x14,0x4B,0x00,0x26, + 0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5B,0x07,0x09,0xD5, + 0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D,0x3A,0x43,0x64,0x00, + 0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79,0x80,0x00,0x9B,0x06, + 0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06, + 0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x75,0x06,0x76,0xF0,0xBC,0x70,0x47, + 0xFF,0xFF,0x00,0xFC,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4D, + 0x0C,0x4C,0x2D,0x78,0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A, + 0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2, + 0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x10,0xB4,0x05,0x4C, + 0x03,0x4B,0x24,0x78,0x60,0x43,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78, + 0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A, + 0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D, + 0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x15,0x4A,0x15,0x4B,0x52,0x7D, + 0x13,0x4F,0x00,0x21,0x16,0x02,0x16,0x43,0x1A,0x78,0x10,0x4D,0x42,0x43,0x20,0x3F, + 0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0,0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E, + 0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42,0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0, + 0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C,0x06,0x4B,0x04,0x00,0x1B,0x78,0x5C,0x43, + 0xE3,0x18,0x93,0x42,0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x14,0x4A,0x13,0x4B,0x52,0x7D, + 0x00,0x21,0x11,0x4C,0x15,0x02,0x15,0x43,0x11,0x4E,0x20,0x3B,0x13,0xE0,0x9A,0x7D, + 0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0, + 0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52, + 0x32,0x78,0x80,0x18,0x49,0x1C,0x07,0x4A,0x37,0x78,0x12,0x78,0x7A,0x43,0x82,0x42, + 0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xF8,0xB5,0x03,0x00,0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01, + 0x0D,0x18,0xC0,0x31,0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68, + 0x00,0xF0,0x0E,0xFA,0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62, + 0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62, + 0x04,0x20,0xE0,0x62,0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69, + 0x20,0x62,0xD0,0x6B,0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x26,0x62,0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7, + 0x89,0x69,0x21,0x62,0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40, + 0x00,0x78,0x00,0x00,0x07,0x4A,0x10,0xB5,0xD1,0x88,0x40,0x23,0x00,0x28,0x01,0xD0, + 0x19,0x43,0x00,0xE0,0x99,0x43,0xD1,0x80,0xFF,0xF7,0x1E,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x41,0x4C,0x05,0x00,0x27,0x6A, + 0x0E,0x00,0x60,0x6A,0x02,0x90,0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20, + 0xFF,0xF7,0x9E,0xFF,0x3B,0x48,0x20,0x62,0x22,0x20,0x60,0x62,0x07,0x20,0x40,0x02, + 0x60,0x63,0x02,0x20,0xE0,0x62,0x00,0x20,0xFB,0xF7,0x02,0xFD,0x36,0x48,0x00,0x7A, + 0x00,0x28,0x01,0xD0,0xFE,0xF7,0x0E,0xFA,0xFB,0xF7,0x46,0xFD,0x2C,0x00,0x46,0xE0, + 0x68,0x1E,0x84,0x42,0x01,0xD1,0xFB,0xF7,0x69,0xFD,0xFB,0xF7,0x0B,0xFD,0xFB,0xF7, + 0xB9,0xFD,0x00,0x2E,0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x4B,0xFD,0xA0,0x42, + 0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21, + 0xF9,0xF7,0x40,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0, + 0x68,0x00,0x05,0x21,0xF9,0xF7,0x36,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x02,0x20,0x0C,0xE0,0x05,0x21,0x28,0x00,0xF9,0xF7,0x2C,0xFD,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7, + 0xBD,0xFA,0x0C,0xE0,0x68,0x00,0x03,0x21,0xF9,0xF7,0x1C,0xFD,0xA0,0x42,0xDB,0xD9, + 0x03,0x21,0x28,0x00,0xF9,0xF7,0x16,0xFD,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E, + 0xB6,0xD2,0x0E,0x48,0x44,0x88,0x03,0xE0,0xFB,0xF7,0xC4,0xFC,0xFB,0xF7,0x72,0xFD, + 0x64,0x1E,0xF9,0xD2,0xFB,0xF7,0xE8,0xFC,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62, + 0x01,0x99,0x41,0x63,0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x80,0x90,0x00,0x40,0x02,0x03,0x00,0x00,0x80,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07, + 0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5, + 0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60, + 0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x02,0x49,0x00,0x03, + 0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xAD,0x0B,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C, + 0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68, + 0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2, + 0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x78,0x00,0x00,0xF8,0xB5,0x17,0x48, + 0x00,0x24,0x40,0x78,0x00,0x28,0x25,0xD0,0x15,0x4D,0x13,0x26,0x00,0x20,0xB6,0x01, + 0xAB,0x19,0x12,0xE0,0x81,0x00,0x49,0x19,0x89,0x19,0xCA,0x68,0x97,0x0F,0xFF,0x07, + 0x0A,0xD0,0x92,0x00,0x01,0x27,0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C,0xCA,0x60, + 0xA1,0x00,0xBF,0x08,0xC9,0x19,0x4A,0x60,0x40,0x1C,0x99,0x7A,0x81,0x42,0xE9,0xDC, + 0x08,0x48,0x09,0x22,0x00,0x21,0xFE,0xF7,0xEF,0xF8,0x20,0x00,0xFF,0xF7,0xB4,0xFF, + 0xFC,0xF7,0xD2,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x50,0x07,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xB1,0x0A,0x00,0x20,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7,0x4D,0xFC,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF9,0xF7,0x4F,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF9,0xF7,0x34,0xFC,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF9,0xF7,0x36,0xFC,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xAC,0x0B,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60, + 0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47, + 0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0, + 0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60, + 0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37, + 0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF9,0xF7, + 0xC9,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x16,0x00,0x2E,0x00,0x58,0x00,0x2E,0x00, + 0xAF,0x00,0x2E,0x00,0x06,0x01,0x2E,0x00,0x5D,0x01,0x2E,0x00,0xB4,0x01,0x2E,0x00, + 0x2C,0x00,0x89,0x00,0x83,0x00,0x89,0x00,0xDA,0x00,0x89,0x00,0x31,0x01,0x89,0x00, + 0x88,0x01,0x89,0x00,0xCA,0x01,0x89,0x00,0x16,0x00,0xE5,0x00,0x58,0x00,0xE5,0x00, + 0xAF,0x00,0xE5,0x00,0x06,0x01,0xE5,0x00,0x5D,0x01,0xE5,0x00,0xB4,0x01,0xE5,0x00, + 0x2C,0x00,0x40,0x01,0x83,0x00,0x40,0x01,0xDA,0x00,0x40,0x01,0x31,0x01,0x40,0x01, + 0x88,0x01,0x40,0x01,0xCA,0x01,0x40,0x01,0x16,0x00,0x9B,0x01,0x58,0x00,0x9B,0x01, + 0xAF,0x00,0x9B,0x01,0x06,0x01,0x9B,0x01,0x5D,0x01,0x9B,0x01,0xB4,0x01,0x9B,0x01, + 0x2C,0x00,0xF7,0x01,0x83,0x00,0xF7,0x01,0xDA,0x00,0xF7,0x01,0x31,0x01,0xF7,0x01, + 0x88,0x01,0xF7,0x01,0xCA,0x01,0xF7,0x01,0x16,0x00,0x52,0x02,0x58,0x00,0x52,0x02, + 0xAF,0x00,0x52,0x02,0x06,0x01,0x52,0x02,0x5D,0x01,0x52,0x02,0xB4,0x01,0x52,0x02, + 0x89,0x08,0x49,0x1E,0xC9,0x04,0x01,0x22,0xC9,0x08,0xD2,0x07,0x89,0x18,0x40,0x04, + 0x40,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B, + 0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x30,0x0B,0x30,0x01,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xF1,0x0F,0x00,0xFF,0xF2,0x0F,0x01,0x7F,0xF3,0x0F,0x02,0xBF,0xF3,0x0F,0x03, + 0xDF,0xF3,0x0F,0x04,0xEF,0xF3,0x0F,0x05,0xF7,0xF3,0x0F,0x06,0xFB,0xF3,0x0F,0x07, + 0xFF,0xF3,0x0D,0x08,0xFF,0xF3,0x0E,0x09,0xFF,0x73,0x0F,0x0A,0xFF,0xB3,0x0F,0x0B, + 0xFF,0xD3,0x0F,0x4C,0xFF,0xE3,0x0F,0x4D,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x0F, + 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, + 0x00,0x00,0x90,0x08,0x00,0x00,0x80,0x0A,0x00,0x00,0x70,0x0C,0x00,0x00,0x60,0x0E, + 0x00,0x00,0x50,0x10,0x00,0x00,0x40,0x12,0x00,0x00,0x30,0x1C,0x00,0x00,0x20,0x1E, + 0x00,0x00,0x10,0x21,0x00,0x00,0x00,0x23,0x00,0x00,0xF0,0x14,0x00,0x00,0xE0,0x16, + 0x00,0x00,0xD0,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF0,0xC7,0x03,0x00,0xF0,0xCF,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, + 0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x03,0x03,0x00,0x02,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x03,0x02,0x0D,0x0C,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xF0,0x00,0x40,0x01,0xE8,0x03,0x00,0x00,0x74,0x27,0x00,0x00,0x3C,0x28,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0x08,0x07,0x08,0x07,0x00,0x00,0x04,0xC8,0xAB,0xAB, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x78,0x00,0x01,0x00,0x04,0x00, + 0x3C,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x04,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x02,0x03,0x00,0x00,0x02,0x03,0x00,0x00,0x02,0x03,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0x2C,0x01, + 0x28,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x1E,0x00,0x46,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x90,0x01,0x90,0x01,0x90,0x01, + 0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x32,0x32,0x96,0x32,0x40,0x64, + 0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x41,0x00,0x01,0x00, + 0x0A,0x0A,0xA8,0x00,0x10,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00,0x5A,0x00,0x82,0x00, + 0x99,0x19,0x90,0x01,0x32,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x23,0x00,0x41,0x00, + 0x46,0x00,0x05,0x00,0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0xF4,0x01, + 0xF4,0x01,0xF4,0x01,0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x32,0x32, + 0x96,0x32,0x40,0x64,0x64,0x64,0xFF,0x00,0x00,0x00,0xC2,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00, + 0x41,0xF2,0x00,0x00,0x08,0x08,0xA8,0x00,0x20,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x19,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x96,0x00,0x2C,0x01,0x00,0x00, + 0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x14,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x47,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0E,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x03,0x00,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x0F,0xC8,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x41,0x02,0x01,0x00, + 0x10,0x00,0x10,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x08,0x10,0x88,0x00, + 0x20,0x9F,0x20,0x3F,0x1E,0x0A,0x64,0x00,0x10,0x10,0x08,0x84,0x00,0x00,0xAC,0x0D, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x08,0x20, + 0x51,0x30,0x10,0x00,0x11,0x90,0x01,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xF3,0x0F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x38,0x03,0x00,0x00,0x38,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x30,0x20,0x68,0x58,0x12,0x14,0x00,0x00,0x1C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00, + 0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00, + 0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x40,0x31,0x10,0x01, + 0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00, + 0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00,0x50,0x38,0x18,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x0D,0x00,0xA0,0xE1,0x10,0xD0,0x9F,0xE5,0x01,0x40,0x2D,0xE9,0x92,0x01,0x00,0xEB, + 0x01,0x40,0xBD,0xE8,0x00,0xD0,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0xF0,0x0F,0x00,0x20, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0xF8,0x49,0x10,0xB4, + 0xC8,0x6B,0x0A,0x06,0x80,0x00,0x80,0x08,0xF5,0x4C,0x80,0x18,0x40,0x34,0xC8,0x63, + 0x20,0x68,0x80,0x00,0x80,0x08,0x20,0x60,0x60,0x68,0x80,0x00,0x80,0x08,0x60,0x60, + 0x00,0x20,0x81,0x00,0x0A,0x19,0x11,0x6A,0x40,0x1C,0x8B,0x00,0xC9,0x01,0xDB,0x0E, + 0xC9,0x0E,0x49,0x06,0x1B,0x05,0x19,0x43,0x14,0x28,0x11,0x62,0xF1,0xD3,0xE8,0x48, + 0xE8,0x49,0x80,0x30,0x01,0x63,0x03,0x21,0x09,0x03,0x41,0x63,0xE6,0x49,0x08,0x69, + 0x40,0x08,0x40,0x00,0x08,0x61,0xE4,0x48,0x40,0x30,0x01,0x68,0xE3,0x49,0x01,0x60, + 0xE3,0x48,0xE4,0x49,0xC8,0x60,0x10,0xBC,0x70,0x47,0xFC,0xB5,0xE2,0x4C,0x02,0x00, + 0x30,0x34,0x18,0xCC,0x00,0x20,0x00,0x94,0xE0,0x4C,0x24,0x7D,0xE4,0x07,0x2D,0xD0, + 0xDF,0x4C,0x25,0x79,0xE6,0x78,0xDD,0x4C,0xAE,0x46,0xA5,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xE5,0x7D,0x01,0x95,0x25,0x7E,0x67,0x7E,0xA4,0x7E,0x10,0xD0,0xB2,0x42, + 0x1C,0xD1,0x8C,0x45,0x08,0xD0,0x01,0x9A,0x8A,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8C,0x42,0x00,0xD1,0x00,0x98,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0xB1,0x42,0x0B,0xD1,0x94,0x45,0xF7,0xD0,0x01,0x99,0x91,0x42,0xF4,0xD0,0x95,0x42, + 0xF2,0xD0,0x97,0x42,0xF0,0xD0,0x94,0x42,0xEE,0xD0,0xEE,0xE7,0x18,0x00,0xEC,0xE7, + 0x30,0xB4,0xC7,0x4B,0xC7,0x4C,0x5B,0x78,0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A, + 0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43, + 0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52, + 0x00,0x20,0x30,0xBC,0x70,0x47,0xF3,0xB5,0xBB,0x48,0x82,0xB0,0x01,0x90,0x00,0x20, + 0x00,0x90,0xB1,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0xB4,0x4F,0xAE,0x48, + 0xC0,0x68,0xC0,0x07,0xFB,0xD0,0x00,0x24,0x26,0x00,0x25,0xE0,0x00,0x25,0x1F,0xE0, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0x91,0xFF,0x00,0x28,0x17,0xD0,0x79,0x78,0x01,0x9A, + 0x71,0x43,0x49,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x02,0x99, + 0x00,0x29,0x02,0xD0,0x00,0x28,0x09,0xDA,0x01,0xE0,0x00,0x28,0x06,0xDD,0x03,0x9A, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0xB4,0xFF,0x40,0x1C,0x00,0xD1,0x64,0x1C,0x6D,0x1C, + 0x78,0x78,0x85,0x42,0xDC,0xD3,0x76,0x1C,0xB8,0x78,0x86,0x42,0xD6,0xD3,0xB8,0x78, + 0x79,0x78,0x48,0x43,0xA0,0x42,0x0A,0xD0,0x00,0x98,0x41,0x1C,0x00,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0x03,0xD8,0x90,0x48,0xC1,0x68,0xC1,0x60,0xBF,0xE7,0xFF,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0xB4,0x00,0x21,0x92,0x4C,0x90,0x4B,0x90,0x4E,0x1E,0x25, + 0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E, + 0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0xA5,0x52,0x72,0x78,0x80,0x18,0x49,0x1C,0xB2,0x78,0x77,0x78,0x7A,0x43, + 0x82,0x42,0xE6,0xD8,0xF0,0xBC,0x70,0x47,0xF0,0xB4,0x81,0x4B,0x00,0x21,0x5A,0x78, + 0x1E,0x26,0x80,0x4D,0x42,0x43,0x7D,0x4F,0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0, + 0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42, + 0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C, + 0x73,0x4B,0x04,0x00,0x5B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42,0xE5,0xD8,0xD9,0xE7, + 0x02,0x04,0x70,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3, + 0x70,0x47,0xF1,0xB5,0x6A,0x4C,0x68,0x4D,0x21,0x78,0x6B,0x4F,0xA8,0x6B,0x00,0x29, + 0x82,0xB0,0x00,0xD0,0x00,0x0C,0x00,0x06,0x00,0x0E,0x01,0x02,0x01,0x43,0x08,0x04, + 0x00,0x0C,0xFF,0xF7,0xE5,0xFF,0x61,0x48,0x00,0x7D,0xC0,0x07,0x08,0xD0,0xE0,0x78, + 0x00,0x28,0x20,0x79,0x02,0xD0,0xFF,0xF7,0xB7,0xFF,0x01,0xE0,0xFF,0xF7,0x92,0xFF, + 0x55,0x49,0x00,0x20,0x80,0x31,0xC8,0x62,0x59,0x49,0xE8,0x6B,0x09,0x78,0x00,0x29, + 0x08,0xD1,0x54,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x07,0x12,0x09,0x12,0x01, + 0x00,0x0F,0x07,0xE0,0x4F,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x03,0x12,0x09, + 0x12,0x01,0x00,0x0F,0x02,0x43,0x4A,0x60,0x03,0x24,0x26,0x1F,0x01,0xE0,0x03,0x2C, + 0x02,0xD1,0x01,0x25,0xED,0x43,0x09,0xE0,0x02,0x2C,0x01,0xD1,0x01,0x25,0x05,0xE0, + 0x01,0x2C,0x01,0xD1,0x35,0x00,0x01,0xE0,0x00,0x2C,0xF7,0xD0,0xE0,0x07,0xC0,0x0F, + 0x29,0x00,0xFF,0xF7,0x10,0xFF,0x64,0x1E,0xE9,0xD5,0x41,0x48,0x40,0x4D,0x00,0x78, + 0x0C,0x35,0x00,0x28,0x2D,0xD1,0x38,0x4A,0x09,0x21,0x01,0x23,0xD0,0x68,0x18,0x43, + 0xD0,0x60,0xD0,0x68,0xC0,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x00,0x26,0x17,0xE0, + 0x00,0x24,0x10,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x9F,0xFE,0x00,0x28,0x09,0xD0, + 0x33,0x48,0x40,0x78,0x70,0x43,0x00,0x19,0x81,0x00,0x79,0x58,0x09,0x05,0x09,0x0D, + 0x40,0x00,0x29,0x52,0x64,0x1C,0x2E,0x48,0x40,0x78,0x84,0x42,0xEA,0xD3,0x76,0x1C, + 0x2B,0x48,0x81,0x78,0x8E,0x42,0xE3,0xD3,0x01,0x78,0x00,0x29,0x01,0xD1,0x81,0x68, + 0x03,0xE0,0x27,0x48,0x80,0x68,0x01,0x0C,0x09,0x04,0x22,0x48,0x41,0x63,0x1E,0x48, + 0x09,0x21,0x01,0x23,0xC2,0x68,0x1A,0x43,0xC2,0x60,0xC2,0x68,0xD2,0x07,0xFC,0xD0, + 0x49,0x1E,0xF7,0xD2,0x21,0x48,0x00,0x26,0x01,0x90,0x21,0x48,0x00,0x90,0x6F,0xE0, + 0x00,0x24,0x68,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x67,0xFE,0x00,0x28,0x61,0xD0, + 0x17,0x49,0x0A,0x78,0x00,0x2A,0x35,0xD1,0x49,0x78,0x71,0x43,0x0B,0x19,0x59,0x00, + 0x9B,0x00,0xFB,0x58,0x6A,0x5A,0x1B,0x05,0x1B,0x0D,0x9A,0x42,0x01,0xD8,0x00,0x20, + 0x0B,0xE0,0x82,0x42,0x04,0xD9,0x12,0x1A,0x12,0x04,0xD2,0x0C,0x80,0x18,0x03,0xE0, + 0x82,0x1A,0x12,0x04,0xD2,0x0C,0x80,0x1A,0xC0,0x1A,0x68,0x52,0x42,0xE0,0x00,0x00, + 0x40,0x06,0x10,0x40,0xFC,0xF3,0x03,0x00,0x00,0x90,0x00,0x40,0x0C,0x0E,0x00,0x00, + 0xF3,0xCF,0x0F,0x00,0x00,0xA0,0x00,0x40,0xC0,0x0F,0x00,0x20,0x00,0x78,0x00,0x00, + 0x68,0x06,0x00,0x20,0x00,0x00,0x10,0x40,0x00,0x02,0x10,0x40,0x74,0x08,0x00,0x20, + 0x74,0x0A,0x00,0x20,0x7A,0x48,0x7B,0x49,0x40,0x78,0xFF,0x23,0x91,0x33,0x70,0x43, + 0x00,0x19,0x84,0x46,0x80,0x00,0x38,0x58,0x00,0x05,0x00,0x0D,0x02,0x00,0x41,0x18, + 0x99,0x42,0x09,0xD8,0x74,0x49,0x08,0x1A,0x03,0x00,0x43,0x43,0x18,0x0A,0x8A,0x42, + 0x01,0xD9,0x40,0x18,0x00,0xE0,0x08,0x1A,0x02,0x99,0x00,0x29,0x06,0xD0,0x6C,0x49, + 0x00,0x9A,0x89,0x78,0x61,0x43,0x89,0x19,0x49,0x00,0x02,0xE0,0x01,0x9A,0x61,0x46, + 0x49,0x00,0x50,0x52,0x64,0x1C,0x66,0x48,0x40,0x78,0x84,0x42,0x92,0xD3,0x76,0x1C, + 0x63,0x48,0x81,0x78,0x8E,0x42,0x8B,0xD3,0xFE,0xBC,0x08,0xBC,0x18,0x47,0xF0,0xB5, + 0x62,0x4E,0x5F,0x4D,0x00,0x24,0x01,0x27,0x61,0x48,0x01,0x68,0x60,0x4A,0x08,0x04, + 0x00,0x0E,0x09,0x06,0x09,0x0E,0x68,0x70,0x40,0x3A,0xA9,0x70,0x12,0x69,0xD2,0x07, + 0xD2,0x0F,0x32,0x7D,0x02,0xD0,0x92,0x07,0x06,0xD4,0x01,0xE0,0x92,0x07,0x03,0xD5, + 0x49,0x1E,0x29,0x71,0xEF,0x70,0x03,0xE0,0x40,0x1E,0x28,0x71,0x00,0x20,0xE8,0x70, + 0x20,0x00,0x64,0x1C,0xFF,0xF7,0xC5,0xFE,0x28,0x78,0x01,0x28,0x01,0xD0,0x01,0x2C, + 0x05,0xD0,0x02,0x2C,0x03,0xD0,0xFF,0xF7,0x91,0xFD,0x01,0x2C,0xD4,0xD9,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x4B,0x48,0x10,0xB5,0x40,0x6B,0x45,0x4C,0xC5,0x22,0xA0,0x60, + 0x20,0x00,0xD2,0x00,0x00,0x21,0x0C,0x30,0xFF,0xF7,0x7A,0xFD,0x00,0x20,0x20,0x70, + 0xFF,0xF7,0xBD,0xFF,0x01,0x20,0x20,0x70,0xFF,0xF7,0xB9,0xFF,0x42,0x48,0x43,0x49, + 0xC8,0x61,0x43,0x48,0xC2,0x68,0x52,0x08,0x52,0x00,0xC2,0x60,0x20,0x00,0x0C,0x30, + 0x04,0xC8,0xCA,0x61,0x4A,0x69,0x52,0x06,0xFC,0xD4,0xF9,0xE7,0x40,0x1E,0xFD,0xD2, + 0x70,0x47,0xF0,0xB5,0x3C,0x48,0x3B,0x4A,0x01,0x23,0x03,0x61,0x19,0x00,0x3A,0x48, + 0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x26,0x35,0x00,0x9D,0x40,0x03,0x20,0x36,0x4C, + 0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0x01,0x20,0x00,0x04, + 0x28,0x43,0x60,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0x65,0x61,0x48,0x00,0x86,0x46, + 0x40,0x1E,0xFD,0xD2,0xE7,0x69,0x00,0x20,0x5C,0x01,0xA4,0x46,0x64,0x46,0x24,0x18, + 0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19,0x40,0x1C,0x20,0x28, + 0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xD5,0xD3,0x23,0x48,0x00,0x23,0x43,0x61, + 0x83,0x61,0x01,0x25,0x9D,0x40,0x03,0x20,0x1F,0x4C,0x00,0x04,0x28,0x43,0xA0,0x61, + 0x08,0x00,0x40,0x1E,0xFD,0xD2,0x01,0x20,0x00,0x04,0x28,0x43,0xA0,0x61,0x08,0x00, + 0x40,0x1E,0xFD,0xD2,0xA5,0x61,0x70,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69,0x5C,0x01, + 0xFF,0x34,0x00,0x20,0xFF,0x34,0x02,0x34,0xA4,0x46,0x64,0x46,0x24,0x18,0x3D,0x00, + 0xC5,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19,0x40,0x1C,0x20,0x28,0x15,0x55, + 0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xD4,0xD3,0x49,0x1C,0xC8,0x29,0x9F,0xD9,0x6E,0xE7, + 0x68,0x06,0x00,0x20,0x74,0xF5,0xFF,0xFF,0x54,0x0B,0x00,0x00,0x00,0x78,0x00,0x00, + 0x40,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0xAB,0xFC,0xFF,0x8F,0x00,0x40,0x00,0x30, + 0x00,0x20,0x00,0x40,0x74,0x08,0x00,0x20,0x00,0xA1,0x00,0x40,0x00,0xC0,0x9F,0xE5, + 0x1C,0xFF,0x2F,0xE1,0x15,0x05,0x00,0x20,0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47, + 0x40,0x04,0x00,0x00,0xC0,0x7B,0x00,0x00,0xC0,0x75,0x00,0x00,0x40,0x00,0x00,0x00, + 0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7B,0x00,0x00,0x00,0x01,0x00,0x00, + 0x00,0x7C,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x00, + 0xFC,0x00,0x98,0x00,0x00,0x00,0x00,0x00,0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47 +}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_vivalto_Ver0001_fw.h b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_vivalto_Ver0001_fw.h new file mode 100644 index 00000000..84d8ed54 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/IST30xxB_FW_vivalto_Ver0001_fw.h @@ -0,0 +1,2163 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: vivalto SYNOPEX, f/w 1(00030304) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x40,0x00,0x00,0x20,0x94,0x02,0x00,0x00,0xCC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x30,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x10,0xB4,0x2B,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x20,0x48,0x10,0xD1,0x91,0x06,0x0E,0xD1, + 0x0A,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xCE,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0B,0x48, + 0x0E,0xD1,0x89,0x06,0x0C,0xD1,0x08,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0xA5,0xFF,0x64,0x1E,0x60,0x1C,0xF3,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0x94,0xFE,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x2C,0x0B,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0x2F,0xFD,0x07,0x00,0x03,0xF0,0xC2,0xFC,0x03,0xF0,0xB4,0xFC, + 0x03,0xF0,0x3A,0xFD,0x49,0x4A,0x4A,0x49,0x4A,0x48,0x04,0xF0,0x9E,0xFE,0x4A,0x4D, + 0x00,0x26,0x01,0x21,0xC9,0x03,0x30,0x00,0x2E,0x82,0x00,0xF0,0xC9,0xF9,0xA8,0x61, + 0x46,0x49,0x00,0x20,0x00,0xF0,0xC4,0xF9,0x45,0x4B,0x46,0x49,0xD8,0x63,0x46,0x48, + 0x00,0xF0,0xBE,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0xFC,0xFC, + 0xA1,0x22,0x42,0x48,0xD2,0x00,0x00,0x21,0x04,0xF0,0x8A,0xFE,0x06,0xF0,0x32,0xFA, + 0x03,0xF0,0x9E,0xFD,0x3E,0x48,0x01,0x24,0x81,0x7A,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0xFF,0x20,0x91,0x30,0x6E,0x72,0x68,0x82,0xAE,0x72,0xEE,0x72, + 0x2E,0x73,0x01,0x20,0x6E,0x73,0xA8,0x73,0x34,0x48,0x64,0x07,0x60,0x63,0xFF,0x20, + 0xE0,0x63,0xE0,0x14,0x00,0xF0,0xC2,0xFC,0x32,0x48,0x06,0x70,0xFF,0x20,0x81,0x30, + 0x00,0xF0,0xBC,0xFC,0x30,0x49,0x02,0x20,0x06,0xF0,0x1C,0xFD,0x02,0x20,0x06,0xF0, + 0x21,0xFD,0x28,0x7A,0x00,0x28,0x01,0xD0,0x06,0xF0,0xCC,0xFD,0x00,0x2F,0x1F,0xD1, + 0x2A,0x4F,0xBE,0x15,0x28,0x7A,0x00,0x28,0x02,0xD0,0x29,0x49,0x28,0x6B,0x88,0x60, + 0xE0,0x6B,0x0B,0x28,0x14,0xD0,0x27,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0, + 0x25,0xFB,0xF8,0x68,0x24,0x49,0x88,0x42,0xEC,0xD9,0x24,0x48,0xC0,0x68,0xFF,0x28, + 0x06,0xD1,0xB8,0x68,0xB0,0x43,0xB8,0x60,0xB8,0x68,0x30,0x43,0xB8,0x60,0xE1,0xE7, + 0xE8,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x7F,0xFC,0x28,0x7A, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0xA6,0xFD,0x02,0x20,0x06,0xF0,0xF7,0xFC,0xFF,0x20, + 0x81,0x30,0x00,0xF0,0x73,0xFC,0x16,0x49,0x05,0x20,0x03,0xF0,0xD9,0xFA,0x0B,0x20, + 0xE0,0x63,0x03,0xF0,0x69,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x28,0x00,0x00,0x00, + 0xF0,0x71,0x00,0x00,0x40,0x00,0x00,0x20,0xF8,0x0A,0x00,0x20,0xC0,0x75,0x00,0x00, + 0xC0,0x0F,0x00,0x20,0x00,0x7E,0x00,0x00,0x00,0x76,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x00,0x78,0x00,0x00,0xAD,0x0B,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40, + 0x00,0x30,0x00,0x40,0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x75,0x00,0x00, + 0x79,0x6F,0x00,0x00,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9,0x20,0x20,0x52,0xE2, + 0x05,0x00,0x00,0x3A,0x18,0x50,0xB1,0xE8,0x20,0x20,0x52,0xE2,0x18,0x50,0xA0,0xE8, + 0x18,0x50,0xB1,0xE8,0x18,0x50,0xA0,0xE8,0xF9,0xFF,0xFF,0x2A,0x02,0xCE,0xB0,0xE1, + 0x18,0x50,0xB1,0x28,0x18,0x50,0xA0,0x28,0x18,0x00,0xB1,0x48,0x18,0x00,0xA0,0x48, + 0x10,0x40,0xBD,0xE8,0x02,0xCF,0xB0,0xE1,0x04,0x30,0x91,0x24,0x04,0x30,0x80,0x24, + 0x1E,0xFF,0x2F,0x01,0x82,0x2F,0xB0,0xE1,0xB2,0x30,0xD1,0x20,0x01,0x20,0xD1,0x44, + 0xB2,0x30,0xC0,0x20,0x01,0x20,0xC0,0x44,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0xC0,0x46, + 0x01,0x30,0x90,0xE1,0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3,0xA0,0x30,0x71,0xE0, + 0x1A,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x01,0x00,0x00,0x3A,0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA,0xA0,0x33,0x71,0xE0, + 0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0, + 0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0x1E,0xFF,0x2F,0xE1, + 0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0,0x00,0x00,0x60,0x22, + 0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3,0x0B,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3,0x07,0x00,0x00,0x3A, + 0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3,0x01,0x13,0xA0,0x21, + 0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A,0x21,0x13,0xA0,0x21, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A,0xA0,0x30,0x71,0xE0, + 0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31, + 0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x00,0x10,0x61,0x22, + 0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42,0x01,0x40,0x2D,0xE9, + 0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1, + 0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB, + 0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x01,0x00,0x10,0xB5,0x02,0x20,0x06,0xF0,0xB5,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0,0xA6,0xFF,0xFF,0x3A, + 0x20,0x34,0x71,0xE0,0x98,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3,0xB7,0xFF,0xFF,0xEA, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x41,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0xD1,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x79,0x00,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x00,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68,0x02,0x4A,0x11,0x40, + 0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF,0x07,0x49,0x10,0xB5, + 0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0F,0x24,0x02,0xF0,0x2C,0xF9,0x64,0x1E, + 0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68,0x17,0x4E,0xB0,0x7E, + 0xC0,0x07,0x26,0xD0,0x70,0x7D,0x00,0x28,0x21,0xD0,0xBA,0x00,0x01,0x2D,0x02,0xD1, + 0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A,0x80,0x02,0xA9,0x05, + 0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49,0xE0,0x00,0x40,0x18, + 0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0,0x31,0xF9,0x64,0x1C,0x70,0x7D,0xA0,0x42, + 0xF3,0xDA,0x70,0x7D,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1,0x01,0x25,0x70,0x7D, + 0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x86,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B,0xDA,0x88,0xD2,0x07, + 0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7D,0xE4,0x00,0xE6,0x18,0x09,0x24,0xE4,0x01, + 0x36,0x19,0xB5,0x73,0x56,0x7D,0x45,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x35,0x82, + 0x56,0x7D,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x75,0x82,0x55,0x7D,0xED,0x00, + 0xED,0x18,0x2D,0x19,0x29,0x75,0x55,0x7D,0xC1,0x79,0xED,0x00,0xEB,0x18,0x1B,0x19, + 0x59,0x75,0x51,0x7D,0x49,0x1C,0x51,0x75,0xC0,0x79,0x06,0x28,0x07,0xD0,0x0A,0x28, + 0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x75,0x70,0xBC,0x70,0x47,0x01,0x20, + 0xFA,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0xFF,0xB5,0x0A,0x20, + 0x48,0x43,0x15,0x4F,0x81,0xB0,0xC5,0x19,0x48,0x00,0xFF,0x35,0x61,0x35,0xC0,0x19, + 0xC0,0x30,0x2A,0x71,0x0C,0x00,0x00,0x90,0x80,0x89,0x16,0x00,0x0A,0x21,0xFF,0xF7, + 0x2F,0xFF,0xE8,0x80,0x00,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0x29,0xFF,0x28,0x81, + 0x38,0x19,0xFF,0x30,0x01,0x30,0x00,0x7C,0xB9,0x19,0x68,0x71,0x04,0x98,0xA8,0x72, + 0x01,0x98,0x06,0x55,0x13,0x20,0x40,0x01,0x08,0x18,0x00,0x21,0xC4,0x76,0x81,0x74, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20,0x06,0x48,0x0F,0x23, + 0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A,0xD2,0x18,0x09,0x03, + 0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0xF0,0x05,0x00,0x20,0xF1,0xB5,0xB2,0x48, + 0x90,0xB0,0x0F,0x90,0x40,0x7C,0xB2,0x49,0x02,0x90,0x0F,0x98,0xC0,0x7C,0x01,0x90, + 0x0F,0x98,0x00,0x7C,0x00,0x90,0xAD,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06,0x02,0xD4, + 0xA9,0x48,0x40,0x30,0x80,0x89,0x00,0x05,0x7E,0xD5,0x10,0x98,0x01,0x28,0x00,0xD0, + 0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x3E,0xE1,0x03,0x98,0x81,0x00,0x01,0x20, + 0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90,0x0C,0x0F,0x80,0x0F, + 0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x7F,0xFB,0x26,0xE1,0x9D,0x48,0xA5,0x00, + 0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9A,0x49,0x80,0x01,0x80,0x0D, + 0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80,0x4A,0x5B,0x24,0x31, + 0x4A,0x53,0x69,0x18,0x48,0x80,0x10,0xE1,0x02,0x9F,0x92,0x49,0x00,0x20,0x7F,0x1E, + 0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88,0x40,0x1C,0xCE,0x52, + 0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46,0x80,0x01,0x80,0x0D, + 0x0C,0x90,0x80,0x1A,0x02,0x9A,0x87,0x4E,0x92,0x00,0x8B,0x18,0x20,0x3B,0x98,0x83, + 0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90,0x52,0x88,0x80,0x1A, + 0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00,0xCF,0x5E,0x38,0x18, + 0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B,0x9A,0x42,0xF4,0xDB, + 0x19,0x00,0xFF,0xF7,0xAB,0xFD,0x07,0x00,0x02,0x99,0x30,0x00,0xFF,0xF7,0xA6,0xFD, + 0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42,0x17,0xDA,0x00,0x28, + 0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21,0x48,0x43,0x0A,0x21, + 0xFF,0xF7,0x6E,0xFE,0x61,0x00,0x00,0xE0,0xCA,0xE0,0x6A,0x4B,0x1C,0x3B,0x5A,0x5E, + 0x90,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x10,0x18,0x58,0x52,0x07,0xE0,0x65,0x49, + 0x0F,0x9A,0x60,0x00,0x1C,0x39,0x0B,0x5A,0x52,0x7D,0x9A,0x1A,0x0A,0x52,0x61,0x49, + 0x60,0x00,0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22,0x0A,0x52,0x08,0x5E, + 0x01,0x99,0x88,0x42,0x09,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0,0x88,0x00,0x05,0x21, + 0xFF,0xF7,0x46,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x1F,0xE0,0x01,0x98, + 0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x3B,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC, + 0x03,0x20,0x14,0xE0,0x01,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7,0x31,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98,0x05,0x21,0xFF,0xF7,0x28,0xFE, + 0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00,0x02,0xD1,0x45,0x49, + 0x0A,0x39,0x08,0x55,0x43,0x49,0x0C,0x9A,0x24,0x31,0x48,0x5F,0x16,0x1A,0x08,0x90, + 0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A,0x3E,0x48,0x57,0x1A,0x06,0x91, + 0x0F,0x99,0x0A,0x38,0x00,0x5D,0x89,0x7D,0x88,0x42,0x27,0xD3,0x00,0x2E,0x01,0xD1, + 0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x00,0x99,0x88,0x42,0x01,0xDA, + 0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7,0x1F,0xFD,0x04,0x00, + 0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0x00,0x99, + 0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E,0x00,0xDC,0x78,0x42,0xFF,0xF7, + 0x0D,0xFD,0x08,0x99,0x00,0x2E,0x19,0xDB,0x09,0x19,0x18,0xE0,0x09,0x98,0x64,0x21, + 0x48,0x43,0x01,0x99,0xFF,0xF7,0x02,0xFD,0x64,0x21,0x08,0x1A,0x31,0x1E,0x05,0x90, + 0x00,0xDC,0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7,0xF8,0xFC,0x05,0x9A,0x04,0x00, + 0x38,0x1E,0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21,0xE0,0xE7,0x09,0x1B,0x06,0x9A, + 0x00,0x2F,0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A,0x16,0x4A,0x0C,0x9B,0x53,0x53, + 0x0A,0x9B,0x0B,0x9A,0x5A,0x80,0x13,0x4A,0x13,0x4B,0x24,0x32,0x51,0x53,0x07,0x9A, + 0x89,0x05,0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43,0x91,0x0A,0x89,0x02, + 0x80,0x05,0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98,0x40,0x1C,0x04,0x90, + 0x03,0x98,0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42,0x00,0xDA,0xBC,0xE6, + 0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xCA,0x0B,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x10,0x4B,0x30,0xB4, + 0x27,0x21,0xDA,0x88,0x49,0x01,0x80,0x24,0x59,0x18,0x00,0x28,0x0E,0xD0,0x0D,0x48, + 0x45,0x7B,0x8D,0x82,0xC5,0x89,0xCD,0x82,0x05,0x8A,0x0D,0x83,0x40,0x8A,0x48,0x83, + 0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43,0x88,0x83,0x06,0xE0,0x00,0x20,0x88,0x82, + 0xC8,0x82,0x08,0x83,0x48,0x83,0xA2,0x43,0x88,0x83,0xDA,0x80,0x30,0xBC,0x70,0x47, + 0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x7F,0xB5,0x24,0x4D,0x04,0x00,0x1A,0x28, + 0x0B,0xD1,0x28,0x6A,0x00,0x28,0x08,0xD1,0x68,0x6A,0x00,0x28,0x05,0xD1,0x20,0x4C, + 0x01,0xF0,0xC2,0xFE,0x64,0x1E,0xFB,0xD2,0x14,0xE0,0x05,0xF0,0xCD,0xF8,0x00,0x20, + 0x01,0xF0,0x30,0xFD,0x01,0xF0,0xAE,0xFD,0x01,0xF0,0xF6,0xFD,0x03,0xAA,0x01,0xA9, + 0x02,0xA8,0x04,0xF0,0x95,0xFA,0x03,0x00,0x01,0x9A,0x02,0x99,0x03,0x98,0x00,0x94, + 0x00,0xF0,0x30,0xF8,0x02,0x20,0x06,0xF0,0xF9,0xF8,0x02,0x20,0x06,0xF0,0xEA,0xF8, + 0x10,0x48,0xE9,0x68,0xC1,0x61,0x29,0x69,0xC1,0x61,0x0F,0x49,0xCA,0x68,0x52,0x08, + 0x52,0x00,0xCA,0x60,0x0D,0x4A,0x0E,0x49,0x02,0xE0,0xD3,0x68,0x8B,0x42,0x02,0xD8, + 0x43,0x69,0x9B,0x06,0xF9,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5,0x01,0xF0,0xA2,0xFE, + 0x01,0x20,0x00,0xF0,0x6B,0xF8,0x7F,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00, + 0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40, + 0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0,0xFF,0xF7,0x9A,0xF9, + 0x1C,0x48,0x01,0x27,0x04,0x04,0x24,0x0C,0x7F,0x02,0x00,0x22,0x39,0x00,0x20,0x00, + 0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23,0xFF,0xF7,0x20,0xFD, + 0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0,0xD8,0xF9,0x14,0x99,0x28,0x04,0x09,0x03, + 0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04,0x08,0x43,0x05,0x90, + 0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69,0x40,0x1C,0x07,0x90, + 0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C,0x06,0x91,0x1A,0x99, + 0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x06,0xF0,0x0A,0xF9,0x15,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40,0xC0,0x75,0x00,0x00, + 0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00,0x02,0x4A,0x51,0x69, + 0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x02,0x4A,0x51,0x69, + 0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x78,0x47,0xC0,0x46, + 0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3,0x03,0x00,0x80,0xE1, + 0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1,0x01,0x10,0x51,0xE2, + 0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x07,0x49,0xFF,0x28, + 0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47,0x8A,0x69,0x12,0x07, + 0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47,0x40,0x00,0x00,0x40, + 0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x62,0x90,0xFF,0x49,0x40,0x1E,0x5E,0x90,0xCB,0x79, + 0xFE,0x4F,0xFF,0x48,0xFA,0x88,0x54,0x06,0x00,0xD4,0xC3,0x78,0x54,0x06,0x05,0x93, + 0x0B,0x7A,0x00,0xD4,0x03,0x79,0xFB,0x4C,0xA4,0x8A,0x1B,0x19,0x1B,0x06,0x1B,0x0E, + 0x04,0x93,0x4B,0x7A,0x54,0x06,0x00,0xD4,0x43,0x79,0x52,0x06,0x03,0x93,0x89,0x7A, + 0x00,0xD4,0x81,0x79,0x00,0x20,0xF4,0x4C,0x02,0x91,0x3D,0x79,0x01,0x26,0x01,0x90, + 0x13,0xE0,0x0A,0x20,0x70,0x43,0x43,0x21,0xC0,0x19,0xC9,0x00,0x09,0x5C,0x00,0x29, + 0x0A,0xD0,0xEE,0x49,0x40,0x18,0x02,0xF0,0xBB,0xFE,0x00,0x28,0x04,0xD0,0x01,0x98, + 0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x78,0xB0,0x42,0xE8,0xDA, + 0xE7,0x48,0x72,0x90,0xC2,0x8A,0x41,0x8B,0x50,0x1A,0x00,0x28,0x00,0xDC,0x88,0x1A, + 0x03,0x04,0x72,0x98,0x72,0x99,0x00,0x8B,0x89,0x8B,0x1B,0x0C,0x42,0x1A,0x00,0x2A, + 0x00,0xDC,0x0A,0x1A,0x10,0x04,0x72,0x9A,0x00,0x21,0x91,0x74,0x72,0x9A,0x00,0x0C, + 0xD1,0x74,0x72,0x9A,0x11,0x75,0x01,0x99,0x00,0x29,0x10,0xD0,0x1E,0x2B,0x0E,0xD2, + 0x32,0x28,0x03,0xD2,0x72,0x98,0x01,0x21,0x81,0x74,0x08,0xE0,0x64,0x28,0x03,0xD2, + 0x72,0x99,0x01,0x20,0xC8,0x74,0x02,0xE0,0x72,0x98,0x01,0x21,0x01,0x75,0x72,0x98, + 0x40,0x7C,0x00,0x28,0x16,0xD1,0x72,0x98,0x80,0x7C,0x00,0x28,0x02,0xD0,0x05,0x98, + 0x80,0x1C,0x0C,0xE0,0x72,0x98,0xC0,0x7C,0x00,0x28,0x02,0xD0,0x05,0x98,0x00,0x1D, + 0x05,0xE0,0x72,0x98,0x00,0x7D,0x00,0x28,0x04,0xD0,0x05,0x98,0x80,0x1D,0x00,0x06, + 0x00,0x0E,0x05,0x90,0x09,0x22,0x00,0x21,0x5B,0xA8,0x04,0xF0,0xD1,0xF8,0xF8,0x88, + 0xFF,0x21,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x05,0xD5,0x01,0xF0,0xAE,0xF8, + 0x73,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x78,0x00,0x28,0x01,0xD0,0x40,0x1E, + 0xE0,0x70,0x60,0x78,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0,0x18,0xE0,0x00,0x28, + 0x16,0xD1,0xB1,0x48,0x5A,0x22,0x00,0x21,0x5E,0x30,0x04,0xF0,0xB1,0xF8,0xE0,0x78, + 0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E,0x0A,0x00,0x14,0x23, + 0x5B,0xA8,0xFF,0xF7,0x7B,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD,0x25,0x70,0xE6,0xE1, + 0x09,0x22,0x01,0x21,0x58,0xA8,0x04,0xF0,0x9B,0xF8,0x02,0x20,0xA3,0x49,0x06,0x90, + 0x9E,0x48,0x5D,0x31,0x41,0x18,0x71,0x91,0xA0,0x49,0x54,0x31,0x40,0x18,0x70,0x90, + 0x13,0xE1,0x08,0x26,0x07,0xAF,0x24,0x20,0x70,0x43,0x07,0xA9,0x40,0x18,0x00,0x21, + 0x24,0x22,0xC9,0x43,0x04,0xF0,0x84,0xF8,0x76,0x1E,0xF4,0xD5,0x06,0x98,0x01,0xF0, + 0x47,0xFC,0x01,0x27,0x5F,0x90,0x53,0xE0,0x5F,0x98,0x01,0x26,0x60,0x90,0x4B,0xE0, + 0x0A,0x20,0x70,0x43,0x8D,0x49,0x40,0x18,0x01,0x00,0xFF,0x30,0xFF,0x30,0x02,0x30, + 0x6F,0x90,0x00,0x7E,0x00,0x28,0x3E,0xD0,0x8C,0x48,0x08,0x18,0x6E,0x90,0x02,0xF0, + 0xF7,0xFD,0x06,0x99,0x08,0x43,0x07,0xD0,0x6E,0x98,0x02,0xF0,0xF1,0xFD,0x00,0x28, + 0x31,0xD0,0x06,0x98,0x00,0x28,0x2E,0xD0,0x80,0x49,0x78,0x00,0x40,0x18,0xC0,0x30, + 0x6D,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0x6B,0xFB,0x6F,0x99,0x49,0x8B,0x0A,0x1A, + 0x00,0x2A,0x00,0xDC,0x42,0x1A,0x6D,0x98,0x61,0x92,0xC0,0x8B,0x0A,0x21,0xFF,0xF7, + 0x5F,0xFB,0x6F,0x99,0x89,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A,0x61,0x98, + 0x01,0x00,0x41,0x43,0x10,0x00,0x50,0x43,0x08,0x18,0x60,0x99,0x88,0x42,0x04,0xDA, + 0x24,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0x60,0x90,0x24,0x21,0x79,0x43,0x07,0xAA, + 0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x78,0xB0,0x42,0xB0,0xDA,0x7F,0x1C, + 0xAF,0x42,0xA9,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x23,0x5F,0x9A,0x18,0x00,0x15,0xE0, + 0x5B,0xA9,0x09,0x5C,0x00,0x29,0x10,0xD1,0x24,0x21,0x41,0x43,0x0F,0x00,0x07,0xAE, + 0x89,0x19,0xF6,0x59,0xB7,0x00,0xC9,0x59,0x91,0x42,0x06,0xDA,0x00,0x29,0x04,0xDB, + 0x00,0x2E,0x02,0xDB,0x0A,0x00,0x00,0x23,0x5E,0x90,0x40,0x1C,0xA8,0x42,0xE7,0xDD, + 0x00,0x2B,0x7E,0xD1,0x62,0x98,0x5E,0x9E,0x40,0x1C,0x62,0x90,0x24,0x20,0x46,0x43, + 0x07,0xA8,0x80,0x59,0x0A,0x21,0x48,0x43,0x50,0x49,0x0A,0x22,0x41,0x18,0x5E,0x98, + 0xFF,0x31,0x50,0x43,0x4D,0x4A,0xBF,0x31,0x87,0x18,0x38,0x00,0xFF,0x30,0x65,0x30, + 0x0A,0x22,0x03,0xF0,0xD1,0xFF,0x5E,0x98,0x48,0x49,0x40,0x00,0x40,0x18,0xC0,0x30, + 0x6C,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0xFB,0xFA,0xFF,0x37,0x61,0x37,0xF8,0x80, + 0x6C,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0xF3,0xFA,0x38,0x81,0x3F,0x48,0x5E,0x99, + 0x40,0x18,0xFF,0x30,0x01,0x30,0x00,0x7C,0x78,0x71,0xB8,0x7A,0x05,0x99,0x49,0x1C, + 0x88,0x42,0x01,0xD2,0x40,0x1C,0xB8,0x72,0xB8,0x7A,0x13,0x28,0x6B,0x90,0x09,0xD9, + 0x14,0x21,0xFF,0xF7,0xDD,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42,0x02,0xD2,0x6B,0x98, + 0x14,0x30,0xB8,0x72,0x38,0x79,0x5E,0x9A,0x5B,0xA9,0x88,0x54,0x71,0x9A,0x5E,0x99, + 0x81,0x54,0x39,0x79,0x70,0x9A,0x00,0x20,0x88,0x54,0x07,0xA9,0x89,0x59,0x58,0xAA, + 0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x24,0x23,0x58,0x43,0x07,0xAB,0x6A,0x90, + 0xC0,0x18,0x69,0x90,0x9B,0x59,0x00,0x22,0xD2,0x43,0x9B,0x00,0xC2,0x50,0x5B,0xA8, + 0x40,0x5C,0x5F,0x9B,0x00,0x28,0x11,0xD1,0xA2,0x78,0x01,0x20,0x94,0x46,0x0B,0xE0, + 0x69,0x9A,0x87,0x00,0xD2,0x59,0x00,0x2A,0x05,0xDB,0x9A,0x42,0x07,0xAF,0x02,0xDA, + 0x6A,0x9B,0xF8,0x50,0x13,0x00,0x40,0x1C,0x84,0x45,0xF1,0xDA,0x49,0x1C,0xA9,0x42, + 0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x78,0x62,0x99,0x88,0x42,0x05,0xDD,0x64,0x98, + 0x40,0x1C,0xA8,0x42,0x64,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98,0x41,0x1E,0x09,0x06, + 0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE3,0xE6,0x01,0x26,0x65,0x96,0x63,0x90, + 0x6F,0xE0,0x58,0xA8,0x80,0x5D,0x00,0x28,0x6A,0xD0,0x65,0x98,0x07,0x49,0x2F,0x18, + 0x0A,0x20,0x70,0x43,0x40,0x18,0x68,0x90,0xFF,0x30,0xFF,0x30,0x02,0x30,0x67,0x90, + 0x00,0x7E,0x70,0x99,0x40,0x5C,0x0D,0xE0,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x1E,0x02,0x00,0x00, + 0x70,0x08,0x00,0x20,0x03,0x99,0x88,0x42,0x34,0xD2,0x08,0x2F,0x32,0xDC,0x4C,0x49, + 0x68,0x98,0x40,0x18,0x02,0xF0,0xD4,0xFC,0x00,0x28,0x2B,0xD0,0x67,0x98,0x70,0x99, + 0x00,0x7E,0x70,0x9A,0x47,0x4B,0x41,0x5C,0x49,0x1C,0x81,0x54,0x68,0x98,0x43,0x21, + 0xC9,0x00,0x41,0x18,0x0A,0x20,0x78,0x43,0xC0,0x18,0x66,0x90,0xFF,0x30,0x65,0x30, + 0x0A,0x22,0x03,0xF0,0x11,0xFF,0x68,0x99,0x66,0x98,0xFF,0x31,0xC1,0x31,0x4A,0x79, + 0xFF,0x30,0x61,0x30,0xC2,0x72,0x89,0x79,0x01,0x73,0x67,0x98,0x5B,0xA9,0x00,0x7E, + 0xC8,0x55,0x71,0x99,0x47,0x54,0x65,0x98,0x40,0x1C,0x65,0x90,0x63,0x98,0x40,0x1C, + 0x63,0x90,0x15,0xE0,0x32,0x49,0x68,0x98,0x32,0x4F,0x40,0x18,0x02,0xF0,0xA0,0xFC, + 0x00,0x28,0x0D,0xD0,0x72,0x99,0x01,0x20,0x08,0x74,0x67,0x98,0x80,0x7F,0x13,0x28, + 0x06,0xD9,0x60,0x78,0x01,0x28,0x03,0xD1,0xF8,0x88,0x04,0x21,0x08,0x43,0xF8,0x80, + 0x76,0x1C,0xA0,0x78,0xB0,0x42,0x8C,0xDA,0x26,0x48,0xC0,0x88,0x41,0x07,0x05,0xD5, + 0x02,0x99,0x04,0x22,0xE1,0x70,0x23,0x49,0x90,0x43,0xC8,0x80,0x01,0x26,0x31,0xE0, + 0x5B,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x13,0x22,0x01,0x20,0x52,0x01,0x05,0x23, + 0xDB,0x01,0x1C,0x49,0x09,0x18,0x8F,0x18,0xFF,0x7E,0x00,0x2F,0x0C,0xD1,0xC9,0x18, + 0x09,0x79,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E,0x09,0x0E,0x01,0x23, + 0x5B,0xA8,0xFF,0xF7,0xAB,0xFA,0x02,0xE0,0x40,0x1C,0x09,0x28,0xE9,0xDB,0xE0,0x78, + 0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18,0x38,0x00,0xFF,0x30, + 0x6B,0x30,0x02,0xF0,0x55,0xFC,0x00,0x28,0x03,0xD1,0x01,0x20,0xFF,0x37,0x61,0x37, + 0xB8,0x72,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0x63,0x98,0x28,0x18,0x20,0x70,0x20,0x78, + 0x05,0x49,0x5A,0x22,0xA0,0x70,0x08,0x00,0xB4,0x30,0x03,0xF0,0x95,0xFE,0xE7,0xE5, + 0x1E,0x02,0x00,0x00,0xF0,0x05,0x00,0x20,0x54,0x07,0x00,0x20,0xF1,0xB5,0x3C,0x48, + 0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x3A,0x48,0x41,0x7F,0x01,0x91,0x01,0x00, + 0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D,0x00,0x20,0xC0,0x43, + 0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20,0x01,0xE0,0x00,0x29, + 0xFB,0xD1,0x03,0x90,0x01,0xF0,0x98,0xF9,0x01,0xF0,0x46,0xFA,0x00,0x24,0x27,0x00, + 0x37,0xE0,0x00,0x26,0x30,0xE0,0x31,0x00,0x38,0x00,0x02,0xF0,0x29,0xF9,0x00,0x28, + 0x28,0xD0,0x29,0x78,0x05,0x9A,0x79,0x43,0x89,0x19,0x89,0x00,0x51,0x58,0x09,0x05, + 0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D,0x1A,0xDA,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x05,0xF0,0x7E,0xFB,0x40,0x1C,0x14,0xD1,0x00,0x98,0x28,0x18, + 0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A,0x31,0x00,0x38,0x00, + 0x05,0xF0,0x70,0xFB,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A,0x00,0x28,0x01,0xDD, + 0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x13,0x4D,0x28,0x78,0x86,0x42,0xCA,0xD3, + 0x7F,0x1C,0x12,0x48,0x00,0x78,0x87,0x42,0xC3,0xD3,0x10,0x48,0x0E,0x49,0x00,0x78, + 0x09,0x78,0x48,0x43,0xA0,0x42,0x04,0xD1,0x04,0x98,0x07,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02,0x88,0x42,0xA9,0xD9, + 0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20,0x04,0x90,0xEC,0xE7, + 0x00,0x02,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0xF0,0xB5,0x8A,0x4A,0xFF,0xB0,0x88,0xB0,0x40,0x18,0x85,0x92,0x42,0x00,0x80,0x18, + 0x84,0x90,0x48,0x42,0x83,0x90,0x86,0x48,0x86,0x4E,0x00,0x7A,0x02,0xAF,0x82,0x90, + 0x85,0x48,0x86,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0x83,0x98,0x40,0x42,0x83,0x90, + 0x01,0x22,0x52,0x02,0x00,0x21,0x30,0x00,0x03,0xF0,0x12,0xFE,0x00,0x25,0x39,0xE0, + 0x00,0x24,0x32,0xE0,0x7C,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07,0x15,0xD0,0x7B,0x49, + 0x09,0x78,0x00,0x29,0x82,0x99,0x16,0xD0,0x8D,0x42,0x0E,0xD1,0x81,0x7D,0xA1,0x42, + 0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42,0x05,0xD0,0x41,0x7E, + 0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0x83,0x9A,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xF8,0xFA,0x10,0xE0,0x8C,0x42,0xF7,0xD1,0x81,0x7D,0xA9,0x42,0xF4,0xD0, + 0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0,0x41,0x7E,0xA9,0x42, + 0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x65,0x48,0x00,0x78,0x84,0x42, + 0xC8,0xD3,0x6D,0x1C,0x63,0x4C,0x20,0x78,0x85,0x42,0xC1,0xD3,0x01,0xF0,0xD4,0xF8, + 0x01,0xF0,0x82,0xF9,0x00,0x25,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00, + 0x02,0xF0,0x66,0xF8,0x00,0x28,0x12,0xD0,0x59,0x49,0x85,0x9B,0x09,0x78,0x69,0x43, + 0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D,0x1B,0x0C,0xCB,0x1A, + 0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00,0x70,0x52,0x21,0x00, + 0x28,0x00,0x02,0xF0,0xD3,0xF8,0x4E,0x49,0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00, + 0x64,0x1C,0x78,0x52,0x4A,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x49,0x48, + 0x01,0x78,0x8D,0x42,0xD0,0xD3,0x00,0x21,0x01,0x91,0x01,0xF0,0x4D,0xF9,0x00,0x25, + 0x51,0xE0,0x00,0x24,0x4A,0xE0,0x21,0x00,0x28,0x00,0x02,0xF0,0x31,0xF8,0x00,0x28, + 0x43,0xD0,0x3F,0x49,0x85,0x9B,0x09,0x78,0x69,0x43,0x09,0x19,0x8A,0x00,0x9A,0x58, + 0x03,0x04,0x12,0x05,0x12,0x0D,0x1B,0x0C,0xD3,0x1A,0x00,0x2B,0x01,0xDD,0x10,0x1A, + 0x00,0xE0,0x80,0x1A,0x49,0x00,0x73,0x5A,0x00,0x04,0x00,0x0C,0x83,0x42,0x0A,0xD9, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x99,0xF8,0x31,0x49,0x09,0x78,0x69,0x43, + 0x09,0x19,0x49,0x00,0x78,0x52,0x01,0x98,0x03,0x21,0xFF,0xF7,0x79,0xF8,0x00,0x29, + 0x01,0xD0,0x02,0x29,0x0D,0xD1,0x86,0x98,0x00,0x7D,0x00,0x28,0x02,0xD1,0x00,0x22, + 0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0x34,0xFA, + 0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00,0x05,0xF0,0x2C,0xFA, + 0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C,0x1C,0x48,0x00,0x78, + 0x84,0x42,0xB0,0xD3,0x6D,0x1C,0x1B,0x48,0x00,0x78,0x85,0x42,0xA9,0xD3,0x01,0x98, + 0x40,0x1C,0x01,0x90,0x84,0x98,0x40,0x1E,0x84,0x90,0x1B,0xD2,0x14,0x4E,0x00,0x25, + 0x0E,0xE0,0x00,0x24,0x08,0xE0,0x68,0x43,0x00,0x19,0x40,0x00,0x3A,0x5A,0x21,0x00, + 0x28,0x00,0x05,0xF0,0x29,0xFA,0x64,0x1C,0x30,0x78,0x84,0x42,0xF3,0xD3,0x6D,0x1C, + 0x0C,0x48,0x00,0x78,0x85,0x42,0xEC,0xD3,0x7F,0xB0,0x08,0xB0,0xF0,0xBC,0x08,0xBC, + 0x00,0x20,0x18,0x47,0x01,0xF0,0x20,0xF8,0x7F,0xE7,0x00,0x00,0x00,0x02,0x10,0x40, + 0x70,0x0A,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x78,0x00,0x00,0xFD,0x0A,0x00,0x20, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF8,0xB5,0x01,0x22,0x52,0x07,0x10,0x68, + 0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20,0x86,0x46,0x22,0x48, + 0x00,0x90,0x80,0x7A,0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25,0x1F,0x4F,0xAD,0x01, + 0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7A,0x1B,0x0F,0x21,0xE0,0x84,0x00, + 0xE4,0x19,0x64,0x19,0xE4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42,0x18,0xD1,0x80,0x00, + 0xC0,0x19,0x40,0x19,0xC0,0x68,0x92,0x0A,0x83,0x05,0x92,0x02,0x9B,0x0D,0x1A,0x43, + 0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43,0x3F,0x23,0x9B,0x02, + 0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46,0x02,0x60,0x02,0xE0, + 0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x5E,0x48,0x8E,0x46,0x02,0x8C,0x5E,0x49, + 0x40,0x8C,0x01,0x91,0xCB,0x88,0x40,0x39,0x00,0x91,0x89,0x7E,0x00,0x25,0x2F,0x00, + 0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71,0xA6,0xE0,0x01,0x99, + 0x09,0x79,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29,0x07,0xD0,0x03,0x29, + 0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00,0x05,0xE0,0x1A,0x00, + 0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88,0xA1,0x88,0x87,0x42, + 0x58,0xDC,0x82,0x42,0x56,0xDB,0x8C,0x45,0x54,0xDC,0x8B,0x42,0x52,0xDB,0x01,0x25, + 0x72,0x46,0x00,0x2A,0x77,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0,0x09,0x23,0x02,0x2A, + 0x17,0xD0,0x03,0x2A,0x71,0xD1,0xE2,0x79,0xD7,0x07,0x28,0xD0,0x01,0x2A,0x01,0xD0, + 0x05,0x2A,0x22,0xD1,0x00,0x25,0xE3,0x71,0x67,0xE0,0x00,0x9A,0x92,0x7D,0x00,0x2A, + 0x63,0xD1,0x00,0xF0,0x87,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20,0xE0,0x71,0x26,0x72, + 0x5B,0xE0,0xE2,0x79,0xD6,0x07,0xE9,0xD1,0x92,0x07,0x56,0xD5,0x00,0xF0,0x7A,0xF8, + 0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00,0x20,0x00,0xE7,0x71, + 0xFE,0xF7,0xE2,0xFF,0xEB,0xE7,0x02,0x20,0x46,0xE0,0x11,0x20,0x44,0xE0,0x92,0x07, + 0x43,0xD5,0x00,0xF0,0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0,0x00,0x29,0x0C,0xD0, + 0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xCD,0xFF,0xA6,0x71, + 0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20,0xE0,0x71,0x00,0x20, + 0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28,0x06,0xD0,0x02,0x28, + 0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4,0xE6,0x71,0x1C,0xE0, + 0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0,0x12,0x20,0xE0,0x71, + 0x20,0x00,0xFE,0xF7,0xA9,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20,0xE0,0x71,0x21,0x7A, + 0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0x9D,0xFF,0x01,0x25, + 0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49,0xC8,0x88,0x82,0x07, + 0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80,0x28,0x00,0xFC,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88,0x00,0x06,0x80,0x0F, + 0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00,0xA0,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xF0,0xB4,0x18,0x4B,0x05,0x00,0xDE,0x7E,0x00,0x22,0x10,0x00, + 0x00,0x2E,0x26,0xD0,0x1B,0x7D,0x00,0x2B,0x23,0xD1,0x20,0xE0,0x13,0x4B,0xD4,0x00, + 0xE3,0x18,0x11,0x24,0xA4,0x01,0x1C,0x19,0x1C,0x27,0xE7,0x5F,0xAF,0x42,0x11,0xDC, + 0x23,0x27,0x7F,0x01,0xDB,0x19,0x00,0x27,0xDF,0x5F,0xAF,0x42,0x0A,0xDB,0x1E,0x27, + 0xE7,0x5F,0x8F,0x42,0x06,0xDC,0x02,0x24,0x1C,0x5F,0x8C,0x42,0x02,0xDB,0x50,0x1C, + 0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06,0x12,0x0E,0x96,0x42, + 0xDC,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0x8F,0xB0,0x0A,0x90,0x09,0x90,0xC7,0x48,0xC7,0x4A,0x01,0x8A, + 0xD0,0x88,0x43,0x06,0x02,0xD4,0xC4,0x49,0xC0,0x39,0x89,0x89,0xC2,0x4D,0xC4,0x4E, + 0x60,0x35,0x08,0x91,0xE9,0x7B,0x43,0x06,0x00,0xD4,0xF1,0x7A,0x43,0x06,0x07,0x91, + 0xA9,0x7B,0x00,0xD4,0xB1,0x7A,0x43,0x06,0x06,0x91,0x69,0x7C,0x00,0xD4,0x71,0x7B, + 0x43,0x06,0x05,0x91,0xA9,0x79,0x00,0xD4,0xB1,0x78,0x02,0x07,0x04,0x91,0xB7,0x49, + 0x09,0x79,0x05,0xD5,0xB5,0x4A,0x00,0x29,0x02,0xD1,0x08,0x23,0x98,0x43,0xD0,0x80, + 0xB4,0x48,0x18,0x22,0x82,0x5E,0xFF,0x23,0x01,0x33,0x28,0x2A,0x03,0xDD,0x1A,0x22, + 0x82,0x5E,0x1E,0x2A,0x03,0xDC,0x1C,0x22,0x82,0x5E,0x28,0x2A,0x05,0xDD,0xAB,0x4A, + 0xD4,0x88,0x1C,0x43,0xD4,0x80,0x00,0x22,0x04,0xE0,0x1E,0x22,0x82,0x5E,0x00,0x2A, + 0x02,0xD0,0x52,0x1E,0xC2,0x83,0x03,0xE0,0xA4,0x48,0xC2,0x88,0x9A,0x43,0xC2,0x80, + 0x08,0x98,0x80,0x04,0x77,0xD5,0xA3,0x4A,0x00,0x20,0x20,0x32,0x52,0x78,0x00,0x2A, + 0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0,0x41,0xF9,0x9B,0x48, + 0x9D,0x4C,0x00,0x79,0x01,0x28,0x0E,0x90,0x66,0xD1,0x98,0x4B,0x19,0x89,0x0D,0x91, + 0xDF,0x88,0x6A,0x89,0x7B,0x06,0x00,0xD4,0xF2,0x88,0x91,0x42,0x00,0xD3,0x00,0x20, + 0x03,0x90,0x0D,0x98,0x0A,0x22,0x0E,0x21,0x50,0x43,0x61,0x5E,0x0C,0x91,0xFE,0xF7, + 0x65,0xFD,0x29,0x78,0x91,0x4B,0x7A,0x06,0x0B,0x93,0x00,0xD4,0x19,0x7F,0x88,0x42, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x02,0x90,0x0C,0x99,0x0D,0x98,0x40,0x1A, + 0x0A,0x21,0xFE,0xF7,0x53,0xFD,0x69,0x78,0x7A,0x06,0x01,0xD4,0x0B,0x99,0x49,0x7F, + 0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90,0x22,0x89,0xA9,0x78, + 0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0x89,0x7F,0x8A,0x42,0x00,0xD8,0x00,0x20, + 0xE9,0x78,0x84,0x46,0x22,0x69,0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0xC9,0x7F, + 0x8A,0x42,0x00,0xDB,0x00,0x20,0x03,0x99,0x00,0x29,0x1D,0xD0,0x02,0x99,0x00,0x29, + 0x1A,0xD0,0x01,0x99,0x00,0x29,0x17,0xD0,0x61,0x46,0x00,0x29,0x14,0xD0,0x71,0x4A, + 0x01,0x21,0x80,0x3A,0x52,0x68,0x00,0x2A,0x00,0xD0,0x00,0x21,0x01,0x42,0x0B,0xD0, + 0x60,0x7B,0x00,0x28,0x22,0xD0,0x69,0x7A,0x7A,0x06,0x00,0xD4,0x71,0x79,0x88,0x42, + 0x1C,0xD8,0x40,0x1E,0x19,0xE0,0x37,0xE0,0x64,0x49,0x28,0x79,0xC9,0x88,0x22,0x69, + 0x4B,0x06,0x00,0xD4,0x30,0x78,0x82,0x42,0x10,0xDB,0x0E,0x98,0x00,0x28,0x0D,0xD0, + 0xC8,0x06,0x0B,0xD4,0x60,0x7B,0xEA,0x79,0x49,0x06,0x00,0xD4,0xF2,0x78,0x90,0x42, + 0x04,0xD2,0x04,0x99,0x88,0x42,0x01,0xD9,0x40,0x1C,0x60,0x73,0x60,0x7B,0x04,0x99, + 0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98,0x00,0x28,0x0A,0xD1,0x53,0x49,0xC8,0x88, + 0x10,0x43,0xC8,0x80,0xC9,0x88,0x28,0x7A,0x49,0x06,0x00,0xD4,0x30,0x79,0x20,0x73, + 0x0D,0xE0,0x4E,0x4B,0xD8,0x88,0xC1,0x06,0x09,0xD5,0x21,0x7B,0x00,0x29,0x04,0xD1, + 0x90,0x43,0xD8,0x80,0x70,0x78,0x60,0x73,0x01,0xE0,0x49,0x1E,0x21,0x73,0x47,0x4F, + 0x38,0x79,0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5,0x05,0x99,0x06,0x98, + 0x40,0x1A,0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x50,0x00,0xC0,0x19,0x84,0x46, + 0xFF,0x30,0x41,0x30,0xC0,0x88,0x00,0x28,0x65,0xD0,0x07,0x99,0x88,0x42,0x09,0xD9, + 0x08,0x98,0x80,0x07,0x5F,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88,0x08,0x21,0x08,0x43, + 0xF8,0x80,0x58,0xE0,0x06,0x99,0x88,0x42,0x55,0xD3,0x08,0x98,0x40,0x07,0x52,0xD5, + 0x00,0x24,0x01,0x20,0x27,0xE0,0xFF,0x23,0x39,0x18,0x3E,0x33,0x5B,0x5C,0x93,0x42, + 0x20,0xD1,0x64,0x1C,0xFF,0x31,0x01,0x31,0x09,0x7C,0x0A,0x91,0x01,0x00,0x12,0xE0, + 0x4B,0x00,0xDD,0x19,0x2B,0x00,0xC0,0x33,0xDE,0x89,0xE0,0x35,0x9E,0x81,0x2D,0x88, + 0xDD,0x83,0x7B,0x18,0xDD,0x1D,0xF9,0x35,0x6E,0x7C,0xFF,0x33,0x21,0x33,0x2E,0x74, + 0x9E,0x7F,0x49,0x1C,0x5E,0x77,0x3B,0x79,0x8B,0x42,0xE9,0xDA,0x39,0x79,0x49,0x1E, + 0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD4,0xDA,0x00,0x2C,0x22,0xDD, + 0x01,0x2C,0x05,0xDD,0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21,0x08,0x43,0xF8,0x80, + 0x60,0x46,0xFF,0x30,0x01,0x30,0xC1,0x8B,0x38,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E, + 0x38,0x71,0x40,0x00,0xC0,0x19,0xC0,0x30,0x81,0x81,0x60,0x46,0xFF,0x30,0x21,0x30, + 0xC1,0x89,0x38,0x79,0x40,0x00,0xC0,0x19,0xC0,0x30,0xC1,0x83,0x3B,0x79,0x0D,0x49, + 0x0A,0x98,0x30,0x39,0x58,0x54,0x52,0x1C,0x08,0x2A,0x8E,0xDB,0x09,0x98,0x00,0x28, + 0x05,0xD1,0x00,0xE0,0x03,0xE0,0xF8,0x88,0x20,0x21,0x88,0x43,0xF8,0x80,0x0F,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x40,0x79,0x00,0x00,0x30,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0x20,0x79,0x00,0x00, + 0xF0,0xB5,0x70,0x48,0xB1,0xB0,0x00,0x78,0x71,0x4B,0x70,0x4A,0x01,0x90,0x6E,0x48, + 0x00,0x78,0x00,0x90,0xD9,0x88,0x16,0x7D,0x6E,0x48,0x4C,0x06,0x00,0xD4,0x06,0x7C, + 0x55,0x7D,0x49,0x06,0x00,0xD4,0x45,0x7C,0x6B,0x48,0x00,0x21,0x2B,0x95,0x30,0x90, + 0xC1,0x81,0x50,0x22,0x16,0xA8,0x2A,0x91,0x03,0xF0,0xE2,0xF9,0x01,0x99,0x2B,0x98, + 0x2B,0x9D,0x08,0x1A,0xAD,0x1C,0x2F,0x90,0x80,0x1C,0x2E,0x90,0x35,0xE0,0x00,0x98, + 0x16,0xA9,0x80,0x1B,0x80,0x1C,0x86,0x46,0x2B,0x98,0xB4,0x1C,0x28,0x1A,0x80,0x00, + 0x47,0x18,0x40,0x3F,0x1E,0xE0,0x01,0x98,0x5C,0x49,0x00,0x1D,0x60,0x43,0x40,0x19, + 0x00,0x04,0x00,0x14,0x40,0x00,0x0A,0x5E,0x55,0x4B,0x68,0x00,0xC0,0x18,0x94,0x21, + 0x41,0x5E,0x60,0x00,0xC3,0x18,0x6C,0x20,0x18,0x5E,0x2A,0x9B,0x94,0x46,0xC3,0x18, + 0x52,0x18,0xD2,0x18,0x2A,0x92,0xBB,0x6B,0x62,0x46,0x9A,0x18,0x08,0x18,0x10,0x18, + 0x64,0x1C,0xB8,0x63,0xA6,0x45,0xDE,0xDC,0x00,0x98,0x71,0x00,0x41,0x1A,0xB8,0x6B, + 0xFE,0xF7,0xE4,0xFB,0xB8,0x63,0x2E,0x98,0x6D,0x1C,0xA8,0x42,0xC7,0xDC,0x00,0x99, + 0x70,0x00,0x09,0x1A,0x2B,0x98,0x2D,0x91,0x42,0x00,0x01,0x98,0x80,0x1A,0x41,0x43, + 0x2C,0x90,0x2A,0x98,0xFE,0xF7,0xD2,0xFB,0x30,0x99,0x50,0x22,0xC8,0x81,0x00,0x20, + 0x01,0x00,0x2A,0x90,0x02,0xA8,0x03,0xF0,0x8B,0xF9,0x2B,0x9C,0xA4,0x1C,0x35,0xE0, + 0x00,0x99,0x02,0xAA,0x89,0x1B,0x89,0x1C,0x8E,0x46,0x2B,0x99,0xB0,0x1C,0x61,0x1A, + 0x89,0x00,0x8D,0x18,0x40,0x3D,0x8C,0x46,0x1C,0xE0,0x01,0x99,0x33,0x4A,0x09,0x1D, + 0x41,0x43,0x09,0x19,0x49,0x00,0x51,0x5E,0x16,0xAA,0x62,0x44,0x40,0x3A,0x92,0x6B, + 0x2B,0x4F,0x89,0x1A,0x62,0x00,0xD3,0x19,0x94,0x22,0x9A,0x5E,0x43,0x00,0xDB,0x19, + 0x6C,0x27,0xDF,0x5F,0xD2,0x19,0x89,0x18,0x0B,0x00,0x4B,0x43,0xAA,0x6B,0xD1,0x18, + 0x40,0x1C,0xA9,0x63,0x86,0x45,0xE0,0xDC,0x2D,0x99,0xA8,0x6B,0x49,0x1E,0xFE,0xF7, + 0x95,0xFB,0xA8,0x63,0x2A,0x99,0x40,0x18,0x64,0x1C,0x2A,0x90,0x2E,0x98,0xA0,0x42, + 0xC6,0xDC,0x2C,0x99,0x2A,0x98,0xFE,0xF7,0x89,0xFB,0x30,0x99,0x00,0x22,0x0A,0x61, + 0x11,0x00,0x02,0xAB,0x0A,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A,0x14,0x00,0x54,0x43, + 0x30,0x9A,0x12,0x69,0xA2,0x18,0x30,0x9C,0x49,0x1C,0x22,0x61,0x2C,0x9A,0x8A,0x42, + 0xF1,0xDC,0x30,0x98,0x51,0x1E,0x00,0x69,0xFE,0xF7,0x70,0xFB,0x00,0x9A,0x2F,0x99, + 0x92,0x1B,0x92,0x02,0x51,0x43,0xFE,0xF7,0x69,0xFB,0x30,0x99,0x08,0x61,0x30,0x99, + 0x0E,0x20,0x08,0x5E,0x00,0x28,0x01,0xD1,0x40,0x1C,0xC8,0x81,0x31,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x00,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF8,0xB5,0x61,0x4D,0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C, + 0x05,0xF0,0x88,0xF8,0x05,0xF0,0x76,0xF8,0x01,0x24,0x64,0x03,0x20,0x00,0xFE,0xF7, + 0x55,0xFF,0x04,0xF0,0x61,0xFC,0x20,0x00,0xFE,0xF7,0x48,0xFF,0x57,0x4C,0x00,0x26, + 0x9C,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x07,0xD5,0xC0,0x68,0x00,0x28,0x04,0xD0, + 0x53,0x48,0xC1,0x68,0xC0,0x03,0xC1,0x63,0x95,0xE0,0x28,0x7A,0x00,0x28,0x04,0xD0, + 0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x65,0xF8,0xFF,0x20,0x81,0x30,0xFE,0xF7, + 0x35,0xFF,0x03,0x20,0x04,0xF0,0x9E,0xFF,0x03,0xF0,0x66,0xFF,0x49,0x4F,0xF8,0x88, + 0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x04,0x20,0x00,0xE0, + 0x02,0x20,0x04,0xF0,0x6B,0xFE,0x00,0xF0,0x09,0xFC,0x04,0xF0,0x53,0xFC,0x00,0xF0, + 0xD3,0xFB,0x00,0xF0,0x81,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1,0x20,0x7B,0x00,0x28, + 0x01,0xD0,0x03,0xF0,0x55,0xFF,0x20,0x7A,0x00,0x28,0x01,0xD0,0x03,0xF0,0xC6,0xF8, + 0x01,0x20,0x40,0x05,0x00,0xF0,0xA6,0xFB,0x03,0xF0,0xDC,0xF8,0x00,0x28,0x01,0xD0, + 0x01,0x20,0x28,0x70,0x00,0x20,0x00,0xF0,0x9D,0xFB,0x28,0x78,0x00,0x28,0x04,0xD1, + 0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x65,0xF9,0x03,0xF0,0x21,0xFF,0x28,0x78, + 0x00,0x28,0x04,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x44,0xD1,0x2E,0x70,0x03,0x20, + 0x04,0xF0,0x32,0xFF,0xE8,0x62,0x03,0x20,0x04,0xF0,0x60,0xFF,0xFF,0x20,0x81,0x30, + 0xFE,0xF7,0xDC,0xFE,0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E,0xF8,0x83,0x2D,0xE0, + 0xFF,0xF7,0x9E,0xFC,0x00,0x28,0x29,0xD0,0x6F,0x6A,0x00,0x2F,0x26,0xD0,0xE8,0x6A, + 0xFF,0x21,0x41,0x31,0x48,0x43,0x1C,0x49,0xFE,0xF7,0x92,0xFB,0x38,0x1A,0x14,0x28, + 0x1C,0xDD,0x05,0xF0,0x05,0xF8,0x05,0xF0,0x09,0xF8,0xA8,0x79,0x00,0x28,0x0D,0xD0, + 0x03,0xF0,0xCC,0xFE,0x03,0xF0,0xCF,0xFE,0x03,0xF0,0xD7,0xFE,0x13,0x4D,0x01,0x20, + 0x68,0x60,0xFE,0xF7,0xC3,0xFE,0x12,0x48,0x68,0x60,0x03,0xE0,0x11,0x48,0x01,0x78, + 0x00,0x29,0xFC,0xD0,0x04,0xF0,0xF9,0xFF,0x0E,0x48,0x06,0x70,0x06,0x4D,0x28,0x78, + 0x00,0x28,0x00,0xD1,0x5D,0xE7,0x04,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0, + 0xC9,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20,0x80,0x78,0x00,0x00, + 0x00,0x40,0x00,0x30,0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40, + 0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x10,0xB4,0x0F,0x4B,0x00,0x22,0xD2,0x43, + 0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C,0x24,0x33,0x5A,0x52, + 0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52,0x22,0x00,0x12,0x32, + 0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52,0x51,0x18,0x40,0x1E, + 0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCA,0x0B,0x00,0x20,0x10,0xB5,0x0C,0x48, + 0x09,0x22,0x00,0x21,0x03,0xF0,0x14,0xF8,0x0A,0x48,0x5A,0x22,0x00,0x21,0x03,0xF0, + 0x0F,0xF8,0x08,0x48,0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48,0x28,0x22,0x21,0x00, + 0x03,0xF0,0x06,0xF8,0x04,0x48,0x4E,0x38,0x44,0x75,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x6B,0x08,0x00,0x20,0x54,0x07,0x00,0x20,0x7E,0x0A,0x00,0x20,0x10,0xB5,0x17,0x48, + 0x12,0x22,0x00,0x21,0x02,0xF0,0xF4,0xFF,0x14,0x48,0x12,0x22,0x00,0x21,0x12,0x30, + 0x02,0xF0,0xEE,0xFF,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30,0x02,0xF0,0xE8,0xFF, + 0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0x02,0xF0,0xE2,0xFF,0x0B,0x48,0x10,0x22, + 0x00,0x21,0x52,0x30,0x02,0xF0,0xDC,0xFF,0x08,0x48,0x10,0x22,0x00,0x21,0x62,0x30, + 0x02,0xF0,0xD6,0xFF,0x05,0x49,0x00,0x20,0x74,0x31,0xC8,0x82,0xFF,0x39,0x41,0x39, + 0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xBC,0x06,0x00,0x20, + 0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x8F,0x7B,0xF1,0x88,0x49,0x06,0x02,0xD4,0x1B,0x49, + 0xC0,0x39,0x8F,0x7A,0x08,0x21,0x00,0x24,0x42,0x00,0x0B,0x01,0x9B,0x19,0x15,0x25, + 0x9B,0x18,0x6D,0x01,0x5D,0x19,0xEC,0x82,0x0D,0x25,0xAD,0x01,0x5B,0x19,0x49,0x1E, + 0xDC,0x80,0xF2,0xD5,0x15,0x25,0x31,0x18,0x6D,0x01,0x01,0x23,0x4D,0x19,0xAB,0x73, + 0x0F,0x25,0x93,0x19,0xAD,0x01,0x5B,0x19,0xDC,0x82,0x1F,0x23,0x5B,0x01,0xC9,0x18, + 0x8F,0x71,0x8C,0x73,0x02,0x21,0x0D,0x01,0xAD,0x19,0xAD,0x18,0xED,0x18,0x49,0x1E, + 0xEC,0x82,0xF8,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x21,0x20,0xC9,0x43,0x40,0x01, + 0x10,0x18,0xC1,0x80,0x01,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x10,0xB5,0x06,0x48,0x20,0x22,0x00,0x21,0x02,0xF0,0x80,0xFF, + 0x04,0x48,0x00,0x21,0x81,0x72,0x41,0x72,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x7E,0x08,0x00,0x20,0xB0,0x06,0x00,0x20,0x10,0xB5,0x04,0xF0,0x6D,0xFE,0x03,0xF0, + 0x4D,0xFE,0xFF,0xF7,0x53,0xFF,0xFF,0xF7,0x71,0xFF,0x03,0xF0,0x7D,0xFF,0x01,0xF0, + 0xC7,0xFD,0x01,0xF0,0x41,0xFD,0x03,0x49,0x00,0x20,0x48,0x71,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x10,0xB4,0x0D,0x4C,0x0B,0x4B,0xE4,0x88, + 0x1B,0x7F,0x64,0x06,0x02,0xD4,0x09,0x4B,0xC0,0x3B,0x1B,0x7E,0x04,0x1E,0x00,0xDC, + 0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42,0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18, + 0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00,0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xF7,0xB5,0x62,0x48,0xCA,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0, + 0x01,0x20,0x47,0x90,0x00,0x20,0x02,0xE0,0x00,0x20,0x47,0x90,0x01,0x20,0x46,0x90, + 0x5C,0x48,0x00,0x26,0x49,0x90,0x5C,0x48,0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B, + 0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A,0x01,0x91,0x80,0x8B,0x45,0x90,0x57,0x48, + 0x00,0x7A,0x48,0x96,0x00,0x90,0x6B,0xE0,0x00,0x24,0x64,0xE0,0x68,0x43,0x07,0x19, + 0x21,0x00,0x28,0x00,0x01,0xF0,0xBC,0xF9,0x4D,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07, + 0x2D,0xD0,0x4F,0x4A,0x52,0x79,0x00,0x2A,0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1, + 0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D,0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42, + 0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0,0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0, + 0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42,0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0, + 0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E,0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42, + 0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99, + 0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C,0x80,0x1A,0x49,0x9B,0x02,0x04,0xB8,0x00, + 0x18,0x58,0x4B,0x9B,0x12,0x0C,0x00,0x2B,0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0, + 0x00,0x01,0x00,0x0D,0x4A,0x9B,0x05,0x2B,0x0E,0xD8,0x90,0x42,0x01,0xDA,0x47,0x9A, + 0x02,0xE0,0x88,0x42,0x0E,0xDD,0x46,0x9A,0x21,0x00,0x28,0x00,0x00,0xF0,0xAE,0xF8, + 0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0,0x48,0x99,0x05,0xA8,0x47,0x54,0x48,0x98, + 0x40,0x1C,0x48,0x90,0x64,0x1C,0x22,0x49,0xC8,0x78,0x84,0x42,0x96,0xDB,0x6D,0x1C, + 0x1F,0x48,0x01,0x79,0x8D,0x42,0x8F,0xDB,0x4A,0x98,0x05,0x28,0x03,0xD9,0x00,0x04, + 0x48,0x9E,0x00,0x0C,0x45,0x90,0x00,0x2E,0x25,0xDD,0x4C,0x98,0x00,0x28,0x22,0xD1, + 0x00,0xF0,0x88,0xF9,0x00,0xF0,0xA8,0xF9,0x00,0xF0,0x56,0xFA,0x76,0x1E,0x14,0xD4, + 0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00,0x49,0x98,0x80,0x58,0x01,0x05,0x45,0x98, + 0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C,0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04, + 0x08,0x43,0x49,0x99,0x76,0x1E,0x88,0x50,0xEC,0xD5,0x00,0xF0,0x63,0xF9,0x00,0xF0, + 0x8B,0xF9,0x00,0xF0,0x39,0xFA,0x4D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xE0,0x7A,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xF8,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xF8,0xB5,0x01,0x21,0x49,0x07,0x08,0x68, + 0x01,0x28,0x48,0xD1,0x40,0x07,0x41,0x68,0x88,0x01,0x85,0x0D,0x23,0x48,0x00,0x91, + 0x40,0x7B,0x8C,0x05,0xA4,0x0D,0x00,0x07,0x3A,0xD1,0x20,0x00,0x64,0x21,0x48,0x43, + 0x1F,0x49,0xFE,0xF7,0x6D,0xF9,0x1E,0x49,0x48,0x43,0x64,0x21,0xFE,0xF7,0x68,0xF9, + 0x07,0x00,0x28,0x00,0x64,0x21,0x48,0x43,0x1A,0x49,0x2D,0x37,0xFE,0xF7,0x60,0xF9, + 0x18,0x49,0x48,0x43,0x64,0x21,0xFE,0xF7,0x5B,0xF9,0x06,0x00,0x27,0x36,0x70,0x1B, + 0x01,0x00,0x41,0x43,0x38,0x1B,0x02,0x00,0x42,0x43,0x88,0x18,0x19,0x21,0x89,0x01, + 0x88,0x42,0x18,0xD8,0xB8,0x00,0x38,0x18,0x00,0x19,0x06,0x21,0xFE,0xF7,0x48,0xF9, + 0x84,0x05,0x00,0x98,0xA4,0x0D,0x80,0x0A,0x80,0x02,0x04,0x43,0x70,0x00,0x40,0x19, + 0x03,0x21,0xFE,0xF7,0x3D,0xF9,0x80,0x05,0x81,0x09,0x07,0x48,0x04,0x40,0x21,0x43, + 0x01,0x20,0x40,0x07,0x41,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20, + 0xB0,0x22,0x00,0x00,0x58,0x1F,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x30,0xB4,0x17,0x4D, + 0x15,0x4C,0x2D,0x78,0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E, + 0x00,0x0A,0x00,0x2B,0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0, + 0xC0,0x1A,0xC9,0x1A,0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C, + 0x06,0xE0,0x40,0x1C,0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E, + 0x4A,0x1E,0xFF,0x2A,0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43, + 0x60,0x53,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20, + 0xF0,0xB5,0x5A,0x48,0x8F,0xB0,0x06,0x78,0x59,0x48,0x5B,0x4A,0x05,0x96,0x07,0x78, + 0x58,0x48,0x06,0x97,0x0E,0x90,0x80,0x7E,0x0D,0x92,0xC1,0x07,0x09,0xD0,0x80,0x07, + 0x04,0xD5,0x70,0x1E,0x05,0x90,0x03,0x20,0x10,0x71,0x02,0xE0,0x7F,0x1E,0x00,0x21, + 0x11,0x71,0x52,0x48,0x0A,0x22,0x01,0x8C,0x51,0x43,0x09,0x04,0x09,0x0C,0x02,0x91, + 0x40,0x8C,0x50,0x43,0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0, + 0x00,0x2F,0x7C,0xD0,0x41,0x00,0x02,0x98,0xFD,0xF7,0xF0,0xFF,0x05,0x04,0x2D,0x0C, + 0x00,0x24,0xB6,0x1C,0x0A,0xE0,0x02,0x98,0x05,0x99,0x60,0x43,0xFD,0xF7,0xE6,0xFF, + 0x43,0x4A,0x61,0x00,0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xB4,0x42,0xF2,0xDB, + 0x01,0x98,0x79,0x00,0xFD,0xF7,0xDA,0xFF,0x06,0x04,0x06,0x98,0x36,0x0C,0x00,0x24, + 0x80,0x1C,0x0C,0x90,0x0C,0xE0,0x01,0x98,0x39,0x00,0x60,0x43,0xFD,0xF7,0xCE,0xFF, + 0x37,0x4A,0x81,0x19,0x60,0x00,0x80,0x18,0x40,0x30,0x81,0x80,0x0C,0x98,0x64,0x1C, + 0x84,0x42,0xF0,0xDB,0x0E,0x98,0x80,0x7E,0xC0,0x07,0x53,0xD0,0x00,0x24,0x4D,0xE0, + 0x2F,0x4A,0x09,0x21,0x10,0x19,0xC9,0x01,0x40,0x18,0x41,0x7A,0x0E,0x98,0x80,0x7E, + 0x80,0x07,0x03,0xD5,0x05,0x98,0x03,0x95,0x04,0x91,0x02,0xE0,0x08,0x00,0x03,0xA9, + 0xC0,0xC1,0x27,0x49,0x40,0x00,0x40,0x18,0x0B,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B, + 0xFD,0xF7,0xA4,0xFF,0x22,0x4A,0xE1,0x00,0x89,0x18,0x11,0x22,0x92,0x01,0x0A,0x91, + 0x89,0x18,0x09,0x91,0x88,0x83,0x04,0x98,0x1D,0x49,0x40,0x00,0x40,0x18,0x40,0x30, + 0x08,0x90,0x80,0x88,0x0A,0x21,0x80,0x1B,0xFD,0xF7,0x90,0xFF,0x09,0x99,0xC8,0x83, + 0x0B,0x98,0x0A,0x21,0x00,0x8C,0x40,0x19,0xFE,0xF7,0x62,0xF8,0x0A,0x99,0x23,0x22, + 0x52,0x01,0x89,0x18,0x07,0x91,0x08,0x80,0x08,0x98,0x0A,0x21,0x80,0x88,0x80,0x19, + 0xFE,0xF7,0x56,0xF8,0x07,0x99,0x48,0x80,0x03,0x98,0x40,0x00,0x00,0xE0,0x09,0xE0, + 0x0A,0x21,0xFE,0xF7,0x4D,0xF8,0x0D,0x99,0x64,0x1C,0xC8,0x80,0x0E,0x98,0xC0,0x7E, + 0xA0,0x42,0xAD,0xDC,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x03,0x49,0xCA,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0x02,0x43, + 0xCA,0x61,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43, + 0xC1,0x60,0x70,0x47,0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x01,0x22,0x10,0xB5,0x08,0x49,0x09,0x48,0x52,0x02,0x02,0xF0, + 0xD4,0xFC,0x08,0x48,0x01,0x22,0xC0,0x8E,0x92,0x02,0x01,0x04,0x01,0x43,0x06,0x48, + 0x02,0xF0,0xDE,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x7E,0x00,0x00, + 0x00,0x00,0x10,0x40,0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0x02,0x48,0x81,0x6B, + 0x49,0x08,0x49,0x00,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B, + 0x01,0x22,0x11,0x43,0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49, + 0x0A,0x48,0xFC,0x22,0x02,0xF0,0xA9,0xFC,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32, + 0x02,0xF0,0xA3,0xFC,0x01,0x22,0x08,0x49,0x08,0x48,0x52,0x02,0x02,0xF0,0x9D,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x04,0x7B,0x00,0x00,0x04,0x90,0x00,0x40, + 0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40, + 0x03,0x48,0x41,0x68,0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x90,0x00,0x40,0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60, + 0x18,0x48,0xA6,0x15,0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7, + 0xA7,0xFF,0x32,0x00,0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0xA9,0xFF,0x12,0x48, + 0x75,0x00,0x04,0x04,0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0x98,0xFF, + 0x0E,0x49,0x2A,0x00,0x20,0x00,0x00,0x23,0xFD,0xF7,0x9A,0xFF,0x0C,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x29,0x00,0x20,0x00,0xFD,0xF7,0x8A,0xFF,0x09,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0x8C,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0x90,0x00,0x40,0x00,0x7B,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07, + 0xFC,0xD0,0xFE,0xF7,0x43,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0xF1,0xB5,0x55,0x4E,0x53,0x4B,0xF2,0x88,0x98,0x88,0x54,0x49,0x54,0x06,0x82,0xB0, + 0x00,0xD4,0x08,0x88,0x52,0x06,0x01,0x90,0x98,0x79,0x00,0xD4,0x88,0x78,0x37,0x00, + 0x00,0x25,0x01,0x00,0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0xFF,0x37,0x61,0x37, + 0x00,0x90,0x11,0xE0,0x0A,0x20,0x60,0x43,0x43,0x21,0x80,0x19,0xC9,0x00,0x09,0x5C, + 0x00,0x29,0x08,0xD0,0x46,0x49,0x40,0x18,0x01,0xF0,0xA2,0xF9,0x00,0x28,0x02,0xD0, + 0x6D,0x1C,0x2D,0x06,0x2D,0x0E,0x64,0x1C,0xB8,0x78,0xA0,0x42,0xEA,0xDA,0x41,0x49, + 0x08,0x00,0x20,0x30,0xCA,0x8B,0x43,0x88,0xD4,0x1A,0x00,0x2C,0x00,0xDC,0x9C,0x1A, + 0x22,0x04,0x03,0x88,0x84,0x88,0x12,0x0C,0x1F,0x1B,0x00,0x2F,0x00,0xDC,0xE7,0x1A, + 0x84,0x7A,0x3B,0x04,0x1B,0x0C,0x00,0x2C,0x04,0xD0,0x44,0x7B,0xC8,0x2C,0x01,0xD2, + 0x64,0x1C,0x44,0x73,0x8C,0x7B,0x14,0x2C,0x04,0xD2,0x0C,0x7C,0x00,0x2C,0x01,0xD0, + 0x01,0x24,0x4C,0x74,0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7B,0xC8,0x2C, + 0x01,0xD2,0x64,0x1C,0xCC,0x73,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B, + 0x05,0xD2,0x08,0x24,0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x08,0x24, + 0x04,0x5F,0xE7,0x1C,0x01,0xDD,0x64,0x1E,0x04,0x81,0x44,0x7B,0x01,0x2C,0x01,0xD9, + 0x78,0x21,0x10,0xE0,0x02,0x2D,0x0F,0xD2,0x08,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD, + 0xC9,0x7B,0x14,0x29,0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B, + 0x02,0xD2,0x77,0x21,0xC9,0x43,0xC1,0x80,0x00,0x21,0x02,0x2D,0x01,0x73,0x0E,0xD2, + 0x06,0x21,0x41,0x5E,0x78,0x31,0x04,0xD1,0xC1,0x7A,0xC8,0x29,0x01,0xD2,0x49,0x1C, + 0xC1,0x72,0xC1,0x7A,0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x73,0x06,0x21, + 0x41,0x5E,0x01,0x98,0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1, + 0x31,0x79,0x01,0x29,0x02,0xD0,0x00,0x99,0xFD,0xF7,0xD0,0xFD,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20,0xFF,0x21,0x03,0x31,0x08,0x00,0x49,0x1E, + 0x00,0x28,0xFB,0xD1,0x70,0x47,0x15,0x21,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1, + 0x70,0x47,0x00,0x00,0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47, + 0x00,0x70,0x00,0x40,0x02,0x48,0xC1,0x69,0x02,0x14,0x11,0x43,0xC1,0x61,0x70,0x47, + 0x00,0x70,0x00,0x40,0xFE,0xB5,0x1E,0x4A,0x1C,0x48,0xD1,0x88,0x00,0x25,0x00,0x7A, + 0x2E,0x00,0x2F,0x00,0x49,0x06,0x02,0xD4,0x18,0x48,0xC0,0x38,0x00,0x79,0x19,0x49, + 0x89,0x8A,0x40,0x18,0x01,0x06,0x18,0x48,0x09,0x0E,0x00,0x78,0x00,0x28,0x01,0x90, + 0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0,0x0A,0x20,0x60,0x43,0x10,0x49, + 0x40,0x18,0xFF,0x30,0x61,0x30,0x80,0x7A,0x14,0x28,0x01,0xD2,0x01,0x26,0x07,0xE0, + 0x01,0x27,0x14,0x21,0xFD,0xF7,0x54,0xFE,0x00,0x99,0x88,0x42,0x00,0xD3,0x01,0x25, + 0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F,0x02,0xD1,0x00,0x2E,0x00,0xD0, + 0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0x25,0xF9,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0xD3,0xFA,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x6F,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0xF8,0x0A,0x00,0x20,0xF1,0xB5,0x7B,0x48,0x2E,0x21,0x90,0xB0, + 0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63, + 0x84,0x69,0x75,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0,0xA9,0xFA,0x73,0x4D, + 0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x55,0xFA,0x10,0x99,0x00,0x22,0x01,0x20, + 0xFF,0x27,0x53,0x1E,0x40,0x03,0x15,0x29,0x6F,0xD0,0x16,0xDC,0x0E,0x29,0x6E,0xD0, + 0x0A,0xDC,0x02,0x29,0x27,0xD0,0x07,0x29,0x22,0xD0,0x0A,0x29,0x4F,0xD0,0x0B,0x29, + 0x4B,0xD1,0x0B,0x20,0xF0,0x63,0x6B,0xE0,0x11,0x29,0x55,0xD0,0x12,0x29,0x6E,0xD0, + 0x13,0x29,0x78,0xD0,0x14,0x29,0x7D,0xD0,0x3F,0xE0,0x1A,0x29,0x4C,0xD0,0x08,0xDC, + 0x16,0x29,0x6B,0xD0,0x17,0x29,0x38,0xD0,0x18,0x29,0x68,0xD0,0x19,0x29,0x67,0xD0, + 0x33,0xE0,0x1F,0x29,0x73,0xD0,0x50,0x29,0x72,0xD0,0x51,0x29,0x71,0xD0,0x2C,0xE0, + 0x00,0xF0,0x36,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07,0xCB,0x60,0xFE,0xF7,0xF6,0xF8, + 0x00,0xF0,0x64,0xFE,0x52,0x48,0x53,0x4A,0x41,0x68,0x52,0x68,0x91,0x42,0x1C,0xD0, + 0x51,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83,0xFD,0xF7, + 0x31,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7,0x04,0xFE,0xA8,0x78,0x80,0x07, + 0x01,0xD5,0x04,0xF0,0xB5,0xF9,0x49,0x49,0x40,0x22,0x68,0x46,0x02,0xF0,0x75,0xFA, + 0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0xC3,0xF9,0xF7,0x63,0x20,0xE0,0x41,0x48, + 0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20,0x00,0xE0, + 0x00,0x20,0x04,0xF0,0x4D,0xF8,0xF0,0xE7,0x03,0x21,0x09,0x07,0xCB,0x60,0xFE,0xF7, + 0xBD,0xF8,0x10,0x98,0xFE,0xF7,0x10,0xF8,0x0A,0xE0,0x2D,0xE0,0xFF,0xE7,0x03,0x21, + 0x09,0x07,0xCB,0x60,0xFE,0xF7,0xB2,0xF8,0x00,0xF0,0xA0,0xFD,0x00,0xF0,0x0A,0xF9, + 0x2D,0x48,0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C, + 0x07,0xD0,0x01,0x20,0xA8,0x71,0xD0,0xE7,0x05,0xE0,0x0B,0xE0,0x1C,0xE0,0x22,0xE0, + 0x28,0xE0,0xAA,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x71,0xC4,0xE7, + 0xEA,0x71,0xC2,0xE7,0x00,0x2C,0x05,0xD0,0x01,0x20,0x28,0x72,0xBD,0xE7,0x20,0xE0, + 0x27,0xE0,0x2E,0xE0,0x2A,0x72,0xB8,0xE7,0x00,0x2C,0x03,0xD0,0x20,0x0C,0x6C,0x72, + 0x68,0x82,0xB2,0xE7,0x6A,0x72,0xB0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72, + 0xAB,0xE7,0xAA,0x72,0xA9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xA4,0xE7, + 0xEA,0x72,0xA2,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0x9D,0xE7,0x2A,0x73, + 0x9B,0xE7,0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x6A,0x73,0x03,0xF0,0x6C,0xFE, + 0x93,0xE7,0xA8,0x7B,0x00,0x2C,0x01,0xD0,0x01,0x21,0x06,0xE0,0x40,0x08,0x40,0x00, + 0x07,0xE0,0xA8,0x7B,0x00,0x2C,0x02,0xD0,0x02,0x21,0x08,0x43,0x01,0xE0,0xFD,0x21, + 0x08,0x40,0xA8,0x73,0x81,0xE7,0x00,0x00,0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0xC0,0x75,0x00,0x00, + 0xF0,0xB5,0x38,0x4F,0x35,0x4C,0xF9,0x78,0x03,0x00,0x35,0x4A,0x0E,0x04,0x39,0x79, + 0x35,0x48,0x25,0x68,0x0E,0x43,0x35,0x49,0x30,0x3B,0x04,0xF0,0x9D,0xF9,0x12,0x0A, + 0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E,0x20,0x30,0x3B,0x16,0x3E,0x43,0x48,0x4E, + 0x51,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68,0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61, + 0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04,0x35,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68, + 0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68,0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48, + 0x03,0x7A,0x10,0x7D,0x52,0x7D,0xC4,0x07,0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F, + 0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43,0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D, + 0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D,0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43, + 0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06,0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07, + 0xC0,0x0F,0xCC,0xE7,0x00,0x69,0x3A,0x8A,0x40,0x08,0x00,0x02,0x03,0xE0,0x13,0x48, + 0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43,0xC1,0xE7,0x00,0x69,0x40,0x08,0xBE,0xE7, + 0xB8,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42,0xFC,0xD1,0x03,0xF0,0x51,0xF9,0xFF,0x20, + 0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00, + 0x00,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30, + 0xC0,0x0F,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x7B,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68,0x00,0x20,0xC0,0x43,0xE0,0x60,0xFD,0xF7, + 0xDB,0xFF,0x06,0x00,0xCB,0x20,0xC0,0x01,0xFD,0xF7,0xB8,0xFF,0x02,0xF0,0xEC,0xFF, + 0x01,0x20,0x40,0x05,0xFF,0xF7,0x4E,0xFC,0x00,0xF0,0xBE,0xFC,0x00,0x20,0xFF,0xF7, + 0x49,0xFC,0x02,0xF0,0xD5,0xFF,0x30,0x00,0xFD,0xF7,0xDA,0xFF,0xE5,0x60,0x70,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21,0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60, + 0x02,0xF0,0xD2,0xFF,0x00,0x20,0xFF,0xF7,0x35,0xFC,0xFF,0xF7,0xB3,0xFC,0x05,0x48, + 0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20,0x40,0x07,0x04,0xF0,0xF3,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF8,0xB5,0x27,0x49,0x25,0x48,0xC9,0x88, + 0x00,0x8A,0x49,0x06,0x02,0xD4,0x23,0x48,0xC0,0x38,0x80,0x89,0xC0,0x06,0x3D,0xD5, + 0x22,0x4E,0x30,0x78,0x00,0x28,0x39,0xD0,0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25, + 0x31,0xE0,0x0A,0x21,0x69,0x43,0x1C,0x4B,0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78, + 0x61,0x34,0x25,0xE0,0x0A,0x22,0x42,0x43,0xD2,0x18,0xFF,0x32,0xA1,0x32,0x21,0x79, + 0x92,0x7F,0x91,0x42,0x1B,0xD1,0x0A,0x22,0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21, + 0xC1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E,0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21, + 0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x88,0xE1,0x88,0xFF,0xF7,0x9D,0xF9,0xE0,0x80, + 0x7A,0x88,0x21,0x89,0x00,0x98,0xFF,0xF7,0x97,0xF9,0x20,0x81,0x02,0xE0,0x40,0x1C, + 0x87,0x42,0xD7,0xDA,0x6D,0x1C,0x30,0x78,0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0x50,0x07,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xB3,0xB0,0x11,0x90,0x10,0x90,0x0F,0x90,0x0E,0x90,0xFB,0x48, + 0xFC,0x4D,0x01,0x8C,0xFA,0x4A,0x0B,0x91,0x40,0x8C,0xFB,0x49,0x0A,0x90,0xE8,0x88, + 0x13,0x7B,0x44,0x06,0x00,0xD4,0x0B,0x7A,0x54,0x7B,0x46,0x06,0x00,0xD4,0x4C,0x7A, + 0x46,0x06,0x09,0x94,0x94,0x7E,0x00,0xD4,0x8C,0x7D,0x46,0x06,0x08,0x94,0x54,0x7E, + 0x00,0xD4,0x4C,0x7D,0x07,0x94,0xF0,0x4C,0x40,0x34,0x24,0x8A,0x46,0x06,0x02,0xD4, + 0xED,0x4C,0x80,0x3C,0xA4,0x89,0x24,0x07,0x42,0xD5,0xD4,0x7B,0x46,0x06,0x00,0xD4, + 0xCC,0x7A,0x5C,0x43,0x26,0x94,0x14,0x7C,0x46,0x06,0x00,0xD4,0x0C,0x7B,0x5C,0x43, + 0x25,0x94,0x54,0x7C,0x46,0x06,0x00,0xD4,0x4C,0x7B,0x5C,0x43,0x24,0x94,0x94,0x7C, + 0x46,0x06,0x00,0xD4,0x8C,0x7B,0x5C,0x43,0x23,0x94,0xD4,0x7C,0x46,0x06,0x00,0xD4, + 0xCC,0x7B,0x5C,0x43,0x22,0x94,0x14,0x7D,0x46,0x06,0x00,0xD4,0x0C,0x7C,0x5C,0x43, + 0x21,0x94,0x54,0x7D,0x46,0x06,0x00,0xD4,0x4C,0x7C,0x5C,0x43,0x20,0x94,0x94,0x7D, + 0x46,0x06,0x00,0xD4,0x8C,0x7C,0x5C,0x43,0x1F,0x94,0xD4,0x7D,0x46,0x06,0x00,0xD4, + 0xCC,0x7C,0x5C,0x43,0x1E,0x94,0x12,0x7E,0x40,0x06,0x00,0xD4,0x0A,0x7D,0xCF,0x48, + 0x5A,0x43,0x1D,0x92,0x32,0x90,0x00,0x78,0x00,0x28,0x05,0xD1,0x00,0xF0,0xD0,0xFE, + 0x33,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x28,0x90,0xC7,0x48,0xA0,0x38, + 0x31,0x90,0xFF,0x30,0xE1,0x30,0x30,0x90,0xC2,0x4E,0x28,0x98,0x13,0x21,0x30,0x18, + 0x49,0x01,0x2F,0x90,0x40,0x18,0x04,0x7F,0x00,0x2C,0x0F,0xD0,0x08,0x98,0x00,0x28, + 0x08,0xD1,0x0A,0x20,0x60,0x43,0x80,0x19,0xFF,0x30,0x6B,0x30,0x00,0xF0,0xE0,0xFD, + 0x00,0x28,0x03,0xD0,0x30,0x98,0x00,0x7B,0x00,0x28,0x03,0xD0,0x28,0x98,0xFF,0xF7, + 0x7F,0xF8,0x9D,0xE2,0x28,0x99,0x0D,0x27,0x15,0x23,0x07,0x20,0xBF,0x01,0x5B,0x01, + 0x49,0x00,0x2E,0x91,0x2E,0x9A,0x01,0x01,0x89,0x19,0x89,0x18,0xCA,0x18,0x0B,0x25, + 0xD2,0x8A,0xAD,0x01,0x4D,0x19,0xC9,0x19,0xEA,0x80,0xCA,0x88,0x40,0x1E,0xCA,0x82, + 0xF0,0xD5,0x0A,0x20,0x44,0x43,0xA4,0x19,0x2D,0x94,0xFF,0x34,0x61,0x34,0xE1,0x88, + 0x0B,0x98,0x40,0x1E,0x81,0x42,0xDC,0xDC,0x21,0x89,0x0A,0x98,0x40,0x1E,0x81,0x42, + 0xD7,0xDC,0x2E,0x98,0xE1,0x88,0x85,0x19,0xE8,0x18,0x2C,0x90,0xC1,0x82,0x20,0x89, + 0xE9,0x19,0x2B,0x91,0xC8,0x80,0x00,0x20,0x01,0x22,0xD2,0x02,0x01,0x00,0x06,0x90, + 0x07,0x20,0x05,0x92,0x97,0x4B,0x06,0x01,0xF3,0x18,0x2E,0x9E,0x9B,0x19,0x15,0x26, + 0x76,0x01,0x9C,0x46,0x9B,0x19,0x16,0x26,0x9E,0x5F,0x00,0x2E,0x09,0xDD,0x06,0x9F, + 0xBE,0x42,0x01,0xDD,0xDF,0x8A,0x06,0x97,0x05,0x9F,0xBE,0x42,0x01,0xDA,0xDB,0x8A, + 0x05,0x93,0x0D,0x26,0xB6,0x01,0x63,0x46,0x9B,0x19,0x06,0x26,0x9E,0x5F,0x00,0x2E, + 0x05,0xDD,0x8E,0x42,0x00,0xDD,0xD9,0x88,0x96,0x42,0x00,0xDA,0xDA,0x88,0x40,0x1E, + 0xD8,0xD5,0x05,0x9B,0x06,0x98,0xC0,0x1A,0xF0,0x28,0x02,0xDC,0x8B,0x1A,0xF0,0x2B, + 0x02,0xDD,0x30,0x9E,0x01,0x23,0xB3,0x72,0x14,0x28,0x04,0xDA,0x88,0x1A,0x14,0x28, + 0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x31,0x99,0x48,0x72,0x2F,0x98,0x15,0x21, + 0x49,0x01,0x47,0x18,0xB8,0x7B,0x01,0x28,0x1B,0xD9,0x2C,0x98,0x16,0x21,0x41,0x5E, + 0x0B,0x20,0x80,0x01,0x28,0x18,0x06,0x22,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC, + 0x50,0x1A,0x00,0x04,0x00,0x14,0x0D,0x90,0x2B,0x98,0x06,0x22,0x16,0x21,0x82,0x5E, + 0x41,0x5E,0x50,0x1A,0x00,0x28,0x00,0xDC,0x88,0x1A,0x00,0x04,0x00,0x14,0x0C,0x90, + 0x02,0xE0,0x64,0x20,0x0C,0x90,0x0D,0x90,0x0B,0x20,0x80,0x01,0x2E,0x18,0x2C,0x9A, + 0x06,0x21,0x16,0x20,0x71,0x5E,0x10,0x5E,0x02,0xF0,0x78,0xFF,0x13,0x90,0x2B,0x98, + 0x16,0x21,0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x02,0xF0,0x6F,0xFF,0x12,0x90, + 0x16,0x21,0x71,0x5E,0x13,0x98,0x02,0xF0,0x69,0xFF,0x15,0x90,0x1B,0x20,0x40,0x01, + 0x28,0x18,0x06,0x21,0x2A,0x90,0x41,0x5E,0x12,0x98,0x02,0xF0,0x5F,0xFF,0x14,0x90, + 0x17,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x15,0x98, + 0x02,0xF0,0x56,0xFF,0x00,0x04,0x00,0x14,0x17,0x90,0x07,0x20,0xC0,0x01,0x2E,0x18, + 0x2A,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xB2,0x5E,0x14,0x98,0x02,0xF0,0x48,0xFF, + 0x00,0x04,0x00,0x14,0x16,0x90,0x03,0x20,0x00,0x02,0x28,0x18,0x16,0x22,0x06,0x21, + 0x82,0x5E,0x41,0x5E,0x17,0x98,0x02,0xF0,0x3B,0xFF,0x00,0x04,0x00,0x14,0x19,0x90, + 0x1D,0x20,0x40,0x01,0x28,0x18,0x29,0x90,0x06,0x22,0x82,0x5E,0x16,0x21,0x71,0x5E, + 0x16,0x98,0x02,0xF0,0x2D,0xFF,0x00,0x04,0x00,0x14,0x18,0x90,0x19,0x20,0x40,0x01, + 0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x19,0x98,0x02,0xF0,0x20,0xFF, + 0x00,0x04,0x00,0x14,0x1B,0x90,0x0F,0x20,0x80,0x01,0x2E,0x18,0x29,0x98,0x16,0x21, + 0x41,0x5E,0x06,0x22,0xB2,0x5E,0x18,0x98,0x02,0xF0,0x12,0xFF,0x00,0x04,0x00,0x14, + 0x1A,0x90,0x0C,0x99,0x0D,0x98,0x00,0xF0,0x31,0xFF,0x01,0x21,0x84,0x46,0x88,0x02, + 0x28,0x4B,0x0A,0x01,0xD2,0x18,0x2E,0x9B,0xD3,0x18,0x1F,0x22,0x52,0x01,0x9A,0x18, + 0xD2,0x8A,0x1B,0x18,0x49,0x1E,0xDA,0x80,0xF2,0xD5,0x1F,0x21,0x49,0x01,0x6A,0x18, + 0x60,0x46,0xD0,0x82,0x2F,0x9A,0x00,0x20,0x55,0x18,0xAA,0x7B,0x00,0x2A,0x94,0x46, + 0x0C,0xDB,0x1C,0x4B,0x11,0x01,0xC9,0x18,0x2E,0x9B,0xC9,0x18,0x1F,0x23,0x5B,0x01, + 0xCB,0x18,0x16,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF2,0xD5,0x61,0x46,0x49,0x1C, + 0xFD,0xF7,0x44,0xF9,0x25,0x99,0x27,0x90,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0, + 0x23,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x21,0x99,0x88,0x42,0x01,0xDC, + 0x03,0x20,0x05,0xE0,0x1F,0x99,0x88,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20, + 0xAA,0x79,0x80,0x1A,0x09,0x9A,0x52,0x42,0x00,0x28,0x13,0xDD,0x16,0x20,0x30,0x5E, + 0x09,0x9B,0x98,0x42,0x0C,0xD1,0x00,0x20,0x13,0xE0,0x00,0x00,0x00,0x78,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0x50,0x07,0x00,0x20, + 0x40,0x1C,0x06,0xE0,0x00,0x28,0xB3,0x48,0x30,0x5E,0x04,0xDA,0x90,0x42,0xEA,0xD0, + 0x40,0x1E,0xF0,0x82,0x02,0xE0,0x00,0x28,0xFA,0xDC,0xF1,0xDB,0x16,0x20,0x30,0x5E, + 0x09,0x9B,0x98,0x42,0x05,0xD1,0xAB,0x79,0x05,0x2B,0x02,0xD2,0x5B,0x1C,0xAB,0x71, + 0x06,0xE0,0x90,0x42,0x04,0xD1,0xA8,0x79,0x01,0x28,0x01,0xD9,0x40,0x1E,0xA8,0x71, + 0x1A,0x9A,0x1B,0x98,0x1C,0x92,0xBE,0x7B,0x31,0x00,0xFD,0xF7,0xEF,0xF8,0x11,0x90, + 0x0F,0x90,0x1C,0x98,0x31,0x00,0xFD,0xF7,0xE9,0xF8,0x10,0x90,0x0E,0x90,0xA8,0x79, + 0x01,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x1A,0x9B,0x1B,0x9A, + 0x09,0x21,0x30,0x00,0x03,0xF0,0x1A,0xFB,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0xB8,0x7B,0x18,0x9B,0x19,0x9A,0x07,0x21,0x03,0xF0,0x10,0xFB,0x6B,0x46,0x38,0x22, + 0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAE,0x07,0xC6, + 0x04,0x22,0x9A,0x5E,0x25,0x9B,0x00,0x92,0x2D,0x98,0x26,0x9A,0xFF,0x30,0x65,0x30, + 0x97,0xE0,0x02,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x18,0x9B, + 0x19,0x9A,0x07,0x21,0x30,0x00,0x03,0xF0,0xF1,0xFA,0x10,0xAA,0x11,0xA9,0x68,0x46, + 0x06,0xC0,0xB8,0x7B,0x16,0x9B,0x17,0x9A,0x05,0x21,0x03,0xF0,0xE7,0xFA,0x6B,0x46, + 0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAE, + 0x07,0xC6,0x04,0x22,0x9A,0x5E,0x00,0x92,0x2D,0x98,0x23,0x9B,0xFF,0x30,0x24,0x9A, + 0x65,0x30,0x6E,0xE0,0x03,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3, + 0x16,0x9B,0x17,0x9A,0x05,0x21,0x30,0x00,0x03,0xF0,0xC8,0xFA,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0xB8,0x7B,0x14,0x9B,0x15,0x9A,0x03,0x21,0x03,0xF0,0xBE,0xFA, + 0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E, + 0x01,0xAE,0x07,0xC6,0x04,0x22,0x9A,0x5E,0x21,0x9B,0x00,0x92,0x2D,0x98,0x22,0x9A, + 0xFF,0x30,0x65,0x30,0x45,0xE0,0x04,0x28,0x26,0xD1,0x0E,0xAA,0x0F,0xA9,0x68,0x46, + 0x06,0xC0,0x14,0x9B,0x15,0x9A,0x03,0x21,0x30,0x00,0x03,0xF0,0x9F,0xFA,0x10,0xAA, + 0x11,0xA9,0x68,0x46,0x06,0xC0,0xB8,0x7B,0x12,0x9B,0x13,0x9A,0x02,0x21,0x03,0xF0, + 0x95,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB, + 0x18,0x5E,0x01,0xAE,0x07,0xC6,0x04,0x22,0x9A,0x5E,0x1F,0x9B,0x00,0x92,0x2D,0x98, + 0x20,0x9A,0xFF,0x30,0x65,0x30,0x1C,0xE0,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x12,0x9B,0x13,0x9A,0x02,0x21,0x30,0x00,0x03,0xF0,0x78,0xFA,0x10,0xAB,0x00,0x22, + 0x04,0x21,0x9A,0x5E,0x59,0x5E,0x2B,0x9B,0x06,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3, + 0x2C,0x98,0x16,0x22,0x82,0x5E,0x1D,0x9B,0x00,0x92,0x2D,0x98,0x1E,0x9A,0xFF,0x30, + 0x65,0x30,0x27,0x99,0x03,0xF0,0x76,0xFA,0xB8,0x7B,0x3B,0x49,0x09,0x28,0x01,0xD2, + 0x40,0x1C,0xB8,0x73,0xA8,0x7B,0x02,0x28,0x01,0xD2,0x40,0x1C,0xA8,0x73,0x20,0x79, + 0x40,0x1E,0x80,0x00,0x40,0x18,0x21,0x21,0x49,0x01,0x45,0x18,0x06,0x20,0x28,0x5E, + 0x00,0x28,0x21,0xDB,0x08,0x21,0x69,0x5E,0x00,0x29,0x1D,0xDB,0x07,0x9A,0x64,0x21, + 0x8E,0x1A,0x70,0x43,0xFD,0xF7,0x02,0xF8,0x07,0x00,0xE0,0x88,0x07,0x99,0x48,0x43, + 0x64,0x21,0xFD,0xF7,0xD5,0xF8,0x38,0x18,0xE0,0x80,0x08,0x20,0x28,0x5E,0x64,0x21, + 0x70,0x43,0xFC,0xF7,0xF3,0xFF,0x06,0x00,0x20,0x89,0x07,0x99,0x48,0x43,0x64,0x21, + 0xFD,0xF7,0xC6,0xF8,0x30,0x18,0x20,0x81,0xE0,0x88,0xE8,0x80,0x20,0x89,0x28,0x81, + 0x28,0x98,0x40,0x1C,0x08,0x28,0x28,0x90,0x00,0xDA,0x3D,0xE5,0x32,0x98,0x01,0x78, + 0x1A,0x48,0x01,0x29,0x1F,0xD1,0x32,0x99,0x89,0x7B,0x4A,0x00,0x16,0x49,0x51,0x18, + 0x15,0x22,0x52,0x01,0x8A,0x18,0x92,0x8A,0xC2,0x83,0x0D,0x22,0x92,0x01,0x8A,0x18, + 0x94,0x88,0x30,0x9B,0x1C,0x80,0x0B,0x23,0x9B,0x01,0xC9,0x18,0x8B,0x88,0x30,0x99, + 0x4B,0x80,0x92,0x8A,0x30,0x99,0x8A,0x80,0x32,0x99,0x09,0x8A,0xC1,0x82,0x32,0x99, + 0x49,0x8A,0x01,0x83,0x0C,0xE5,0x02,0x29,0xFC,0xD1,0x32,0x99,0x09,0x8A,0xC1,0x82, + 0x32,0x99,0x49,0x8A,0x01,0x83,0x32,0x99,0x49,0x8B,0x41,0x83,0x32,0x99,0x89,0x8B, + 0x81,0x83,0xFD,0xE4,0x16,0x00,0x00,0x00,0xF0,0x05,0x00,0x20,0x70,0x08,0x00,0x20, + 0x14,0x20,0x9F,0xE5,0x01,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5,0x02,0x20,0x82,0xE2, + 0x91,0x02,0x20,0xE0,0x01,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20, + 0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0,0x1C,0x8F,0x1A,0x4B, + 0x1B,0x7A,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E,0x12,0xD0,0xB0,0x42, + 0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0,0x00,0x99,0x81,0x42, + 0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42,0xF0,0xD1,0xEB,0xE7, + 0x10,0x00,0xEA,0xE7,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20,0xFD,0x0A,0x00,0x20, + 0x78,0x47,0xC0,0x46,0x14,0x20,0x9F,0xE5,0x02,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5, + 0x04,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x02,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1, + 0xFB,0x0A,0x00,0x20,0xFE,0xB5,0x04,0x00,0x88,0x1A,0xC0,0x1A,0x0D,0x00,0x16,0x00, + 0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x1F,0x00,0x20,0x38,0x1E,0x23,0xC3,0x5E, + 0x61,0x5E,0x18,0x00,0x00,0xF0,0xF6,0xFC,0x69,0x00,0x01,0x90,0x08,0x19,0x02,0x22, + 0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0xEA,0xFC, + 0x00,0x90,0xA8,0x19,0xC0,0x19,0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38, + 0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0xDC,0xFC,0x02,0x00,0x00,0x99, + 0x01,0x98,0x00,0xF0,0xD7,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x04,0x4B,0x03,0x4A, + 0x1B,0x78,0x58,0x43,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5,0x10,0x20,0x70,0x47, + 0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30,0x0D,0x49,0x01,0x20, + 0x10,0xB5,0x40,0x07,0x4A,0x69,0x92,0x06,0xFC,0xD4,0xCA,0x68,0x4B,0x68,0x4B,0x60, + 0x04,0xE0,0x4B,0x69,0x9B,0x06,0xFC,0xD4,0x8B,0x69,0x08,0xC0,0x52,0x1E,0xF8,0xD2, + 0x2E,0x20,0x48,0x60,0x48,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x69,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x78,0x47,0xC0,0x46,0x10,0x40,0x2D,0xE9, + 0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A, + 0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5,0x04,0x00,0x10,0xE3, + 0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4,0x1C,0x10,0x84,0xE5, + 0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA,0x04,0x20,0x90,0xE4, + 0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3,0xFC,0xFF,0xFF,0x1A, + 0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5,0x5F,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3,0xE5,0xFF,0xFF,0x1A, + 0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08,0x09,0x0A,0x00,0x0A, + 0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15,0x04,0x10,0x80,0x14, + 0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x0A, + 0x00,0x0A,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30,0xF8,0xB5,0x20,0x4E, + 0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4,0x78,0x68,0x78,0x60, + 0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0,0x7A,0x69,0x92,0x06, + 0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25,0x17,0x4C,0x30,0x78, + 0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C,0x85,0x08,0x30,0x78, + 0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1,0x2E,0x20,0x78,0x60, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xD3,0xFB,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E,0xF8,0xD2,0x2E,0x20, + 0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xC2,0xFB,0xC3,0xE7,0x00,0x00, + 0xFA,0x0A,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40,0x00,0xA0,0x00,0x40, + 0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x01,0x49,0x20,0x20,0x48,0x61,0x70,0x47, + 0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68,0x3D,0x48,0x01,0x29, + 0x80,0x7A,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29,0x06,0xD9,0x02,0x25, + 0x00,0x28,0x0B,0xD0,0x00,0x21,0x25,0x27,0x7F,0x01,0x3B,0xE0,0x00,0x28,0x05,0xD1, + 0x34,0x48,0x09,0x22,0x00,0x21,0x08,0x38,0x01,0xF0,0xCA,0xFB,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F, + 0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E,0x36,0x18,0xF6,0x19, + 0x36,0x7E,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C,0x08,0x28,0xF4,0xD9, + 0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43, + 0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7E,0x00,0x2E,0x03,0xD1, + 0x24,0x18,0xE4,0x19,0x23,0x76,0xED,0xE7,0x40,0x1C,0x08,0x28,0xF3,0xD9,0x60,0x46, + 0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xC9,0xD8,0x00,0x21, + 0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46,0x90,0x0F,0xC0,0x07, + 0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18,0xDB,0x19,0x1B,0x7E, + 0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x76,0x0F,0x23,0x9B,0x06, + 0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C,0x08,0x28,0xEC,0xD9, + 0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42,0xD8,0xD8, + 0x9C,0xE7,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x03,0x23,0x1B,0x07, + 0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47,0x10,0xB4,0x0F,0x24, + 0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61,0x9A,0x60,0x00,0x20, + 0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47,0x40,0x00,0x00,0x30, + 0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF,0x08,0xBC,0x18,0x47, + 0x2C,0x0B,0x00,0x20,0xF0,0xB5,0x85,0xB0,0xFE,0xF7,0x40,0xFB,0xFE,0xF7,0x1E,0xFB, + 0x02,0xF0,0xDE,0xF9,0x00,0xF0,0xA8,0xFD,0x00,0xF0,0x54,0xFB,0xFD,0xF7,0x90,0xFF, + 0xFD,0xF7,0xCE,0xF9,0x38,0x49,0x37,0x48,0xC9,0x88,0x40,0x7F,0x49,0x06,0x02,0xD4, + 0x34,0x48,0xC0,0x38,0x40,0x7E,0x00,0x28,0x04,0xD1,0xFF,0xF7,0x41,0xFA,0xFF,0xF7, + 0xEB,0xF9,0x03,0xE0,0xFF,0xF7,0xE8,0xF9,0xFF,0xF7,0x3A,0xFA,0x02,0xF0,0xA6,0xFC, + 0x02,0xF0,0x2A,0xFB,0x01,0x26,0x76,0x07,0x30,0x68,0x00,0x28,0x07,0xD0,0x70,0x68, + 0x80,0x0F,0x80,0x07,0x03,0xD5,0x35,0x68,0x02,0x24,0x6D,0x1C,0x37,0xE0,0x01,0x24, + 0x25,0x00,0xA0,0x00,0x87,0x19,0x38,0x68,0x81,0x01,0x04,0x90,0x80,0x05,0x80,0x0D, + 0x02,0x90,0x22,0x48,0x89,0x0D,0x03,0x91,0x00,0x78,0x00,0x28,0x03,0xD1,0x02,0xA9, + 0x03,0xA8,0x02,0xF0,0x4D,0xFB,0x1E,0x4B,0x00,0x21,0x58,0x8C,0x40,0x1E,0x02,0x04, + 0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x02,0xA9,0x40,0x1E,0x03,0x04, + 0x1B,0x0C,0x03,0xA8,0x03,0xF0,0x88,0xFA,0x02,0xA9,0x03,0xA8,0x03,0xF0,0x5E,0xF9, + 0x14,0x49,0x04,0x98,0x08,0x40,0x03,0x99,0x89,0x05,0x89,0x09,0x08,0x43,0x02,0x99, + 0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x38,0x60,0x64,0x1C,0xAC,0x42, + 0xC7,0xD9,0x30,0x68,0xFC,0xF7,0xE2,0xFE,0xFD,0xF7,0xC6,0xFD,0x02,0xF0,0xAC,0xFA, + 0xFF,0xF7,0xE0,0xFE,0xFC,0xF7,0x26,0xFE,0x03,0x48,0x40,0x79,0x05,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x03,0x0B,0x00,0x20, + 0x00,0x78,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xF8,0xB5,0x02,0xF0,0x3D,0xF9,0xFE,0xF7, + 0x91,0xFD,0xFE,0xF7,0x1F,0xFE,0xFE,0xF7,0x67,0xFE,0x1A,0x48,0x00,0x21,0xC0,0x7F, + 0x03,0xF0,0x98,0xF8,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20,0x28,0x70,0xE8,0x61, + 0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68,0x00,0x07,0x12,0xD5, + 0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x5A,0xFA,0xFF,0xF7,0x20,0xF9, + 0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0x02,0xF0,0x4D,0xFA,0xE0,0x6B,0x0B,0x28,0xE6,0xD1,0xFE,0xF7,0x70,0xF9, + 0x28,0x78,0x00,0x28,0xD9,0xD0,0x01,0xF0,0x23,0xFF,0xD6,0xE7,0x78,0x68,0x80,0x07, + 0xFC,0xD5,0xEE,0xE7,0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20, + 0x70,0xB5,0x21,0x49,0x1F,0x4A,0xCB,0x88,0x05,0x00,0x10,0x7A,0x1F,0x49,0x5C,0x06, + 0x00,0xD4,0x08,0x79,0x1E,0x4C,0xA4,0x8A,0x00,0x19,0x06,0x06,0xD0,0x79,0x36,0x0E, + 0x5A,0x06,0x00,0xD4,0xC8,0x78,0x1B,0x49,0x2C,0x78,0x4A,0x7C,0x00,0x2A,0x0F,0xD1, + 0x8A,0x7C,0x00,0x2A,0x01,0xD0,0x80,0x1C,0x08,0xE0,0xCA,0x7C,0x00,0x2A,0x01,0xD0, + 0x00,0x1D,0x03,0xE0,0x09,0x7D,0x00,0x29,0x02,0xD0,0x80,0x1D,0x00,0x06,0x00,0x0E, + 0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00,0xFC,0xF7,0x58,0xFD, + 0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20,0x70,0xBC,0x08,0xBC, + 0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20,0x28,0x70,0x01,0x20, + 0xF4,0xE7,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0x70,0x08,0x00,0x20,0x10,0xB5,0x08,0x24,0x20,0x00,0xFE,0xF7, + 0xE3,0xF9,0x64,0x1E,0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C,0x01,0x29,0x01,0xD8, + 0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00, + 0x19,0x22,0x10,0xB5,0x06,0x48,0x52,0x01,0x00,0x21,0x01,0xF0,0x09,0xFA,0x51,0x22, + 0x04,0x48,0xD2,0x00,0x00,0x21,0x01,0xF0,0x03,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xC8,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x40,0x22,0xD4,0x05,0x00,0x21, + 0x20,0x00,0x01,0xF0,0xF5,0xF9,0x01,0x20,0xA0,0x63,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00,0x01,0xF0,0xD4,0xF9, + 0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48,0xD2,0x0F,0x01,0x19, + 0x0E,0x48,0x00,0x19,0x01,0xF0,0xC0,0xF9,0x0D,0x48,0x00,0x21,0x84,0x08,0x0D,0x48, + 0xA2,0x00,0x01,0xF0,0xDD,0xF9,0x0A,0x48,0x80,0x07,0x07,0xD0,0x08,0x48,0x00,0x21, + 0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0xCA,0xF9,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x72,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x46,0x06,0x00,0x00,0xF0,0x05,0x00,0x20,0x05,0x49,0xC8,0x05,0x41,0x62,0x05,0x49, + 0x81,0x62,0x05,0x48,0xFF,0x21,0xC1,0x60,0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00, + 0x80,0x8C,0x3C,0x03,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40,0x02,0x49,0x03,0x48, + 0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30, + 0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0xD3,0xF9,0x64,0x1C,0x08,0x2C,0xF9,0xDB, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24,0x64,0x03,0x20,0x00, + 0xFC,0xF7,0xE4,0xFF,0xFE,0xF7,0xA6,0xFC,0xFE,0xF7,0xD0,0xFC,0xFE,0xF7,0x9A,0xFC, + 0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B,0x12,0x07,0x12,0x0E, + 0x11,0x43,0x01,0x60,0x20,0x00,0xFC,0xF7,0xC9,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0xA0,0x00,0x40,0x00,0x78,0x00,0x00,0x10,0xB5,0x01,0xF0,0xE5,0xFF,0x01,0xF0, + 0xC5,0xFF,0xFF,0x20,0xFC,0xF7,0xFA,0xFF,0xFF,0xF7,0xAE,0xFF,0x11,0x48,0x80,0x22, + 0x00,0x21,0x01,0xF0,0x6D,0xF9,0x08,0x20,0xFC,0xF7,0xB8,0xFF,0x00,0x22,0x0E,0x49, + 0xD2,0x43,0x00,0x20,0xFF,0xF7,0x02,0xFE,0x00,0xF0,0x1A,0xF8,0x0B,0x48,0x40,0x7A, + 0x00,0x28,0x04,0xD0,0x40,0x20,0xFC,0xF7,0xA9,0xFF,0x00,0xF0,0x4D,0xF8,0x00,0xF0, + 0x37,0xF8,0x10,0x20,0x01,0xF0,0xB3,0xFF,0xFE,0xF7,0xD4,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x2C,0x0B,0x00,0x20,0x02,0x03,0x0F,0x0F,0x00,0x78,0x00,0x00, + 0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFC,0xF7,0x8F,0xFF,0x20,0x02, + 0xFC,0xF7,0xB6,0xFF,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7,0x49,0xFC,0x02,0x00, + 0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x02,0xF0,0xD3,0xFF,0x07,0x4A, + 0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x02,0xF0,0xCC,0xFF,0x30,0x00,0xFC,0xF7, + 0x6D,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0xE8,0xFD,0x00,0x00, + 0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCB,0xFD,0x03,0xF0,0xAE,0xF8,0x7D,0x20, + 0xC0,0x00,0x03,0xF0,0x9D,0xF8,0x00,0x20,0xFF,0xF7,0xA8,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x45,0x71,0x00,0x00,0x0A,0x48,0x10,0xB5,0x00,0x6B,0x0A,0x49, + 0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7,0x11,0xFC,0x64,0x30, + 0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0x58,0xF8,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xA5,0x07,0x00,0xF8,0x0A,0x00,0x20, + 0x10,0xB5,0xFF,0xF7,0xD5,0xFE,0xFF,0xF7,0x43,0xFF,0x15,0x48,0x00,0x7A,0x02,0xF0, + 0xBF,0xFE,0x13,0x48,0x13,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24,0xD1,0x83,0x12,0x49, + 0x0C,0x60,0x4C,0x60,0x11,0x49,0xD2,0x88,0x49,0x79,0x52,0x06,0x02,0xD4,0x01,0x00, + 0xA0,0x31,0x49,0x78,0x0C,0x4A,0xC0,0x3A,0x51,0x73,0x09,0x49,0x80,0x31,0x0A,0x8B, + 0x09,0x49,0x40,0x39,0xCA,0x62,0x00,0x88,0x08,0x63,0xFF,0xF7,0x9D,0xFE,0x08,0x48, + 0xC4,0x83,0xFE,0xF7,0xDD,0xFA,0x07,0x48,0x04,0x70,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0x0A,0x00,0x20,0x00,0x7A,0x00,0x00, + 0x30,0x07,0x00,0x20,0xF9,0x0A,0x00,0x20,0xF7,0xB5,0x86,0xB0,0x00,0x27,0x2E,0x48, + 0x04,0xAB,0x02,0x97,0x03,0x97,0x81,0xC3,0x2C,0x4E,0xFE,0xF7,0xAD,0xFB,0xFE,0xF7, + 0x5B,0xFC,0x2B,0x48,0x40,0x7F,0x01,0x90,0x29,0x48,0x20,0x38,0x40,0x7F,0x00,0x25, + 0x00,0x90,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00,0xFF,0xF7,0x38,0xFB, + 0x00,0x28,0x1C,0xD0,0x23,0x49,0x04,0x9A,0x09,0x78,0x69,0x43,0x09,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC,0x41,0x42,0x00,0x28, + 0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD,0x01,0x22,0x05,0x92, + 0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95,0x03,0x91,0x64,0x1C, + 0x14,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x13,0x48,0x00,0x78,0x85,0x42, + 0xD0,0xD3,0x08,0x99,0x03,0x98,0x08,0x60,0x10,0x48,0x00,0x69,0xC0,0x07,0x05,0xD0, + 0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x04,0xE0,0x07,0x99,0x02,0x98, + 0x08,0x60,0x06,0x98,0x07,0x60,0x05,0x98,0x00,0x28,0x00,0xD0,0x04,0x20,0x09,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x02,0x10,0x40,0x78,0xEC,0xFF,0xFF, + 0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x00,0x90,0x00,0x40, + 0x78,0x47,0xC0,0x46,0x68,0x20,0x9F,0xE5,0x04,0xE0,0x2D,0xE5,0x5A,0x04,0xD2,0xE5, + 0x58,0xC0,0x9F,0xE5,0x01,0x00,0x10,0xE3,0x12,0x00,0x00,0x0A,0x54,0x10,0x9F,0xE5, + 0x00,0x00,0xA0,0xE3,0x00,0x30,0xD1,0xE5,0x0B,0x00,0x00,0xEA,0x5A,0xE4,0xD2,0xE5, + 0x00,0x10,0x82,0xE0,0x89,0x14,0xD1,0xE5,0x02,0x00,0x1E,0xE3,0x88,0xE4,0xD2,0xE5, + 0x9E,0x13,0x21,0x00,0x93,0xE1,0x21,0x10,0x01,0x11,0x9C,0xE7,0x80,0xE0,0x82,0xE0, + 0x02,0x19,0xC1,0xE3,0x01,0x00,0x80,0xE2,0xB0,0x11,0xCE,0xE1,0x5B,0x14,0xD2,0xE5, + 0x00,0x00,0x51,0xE1,0xF0,0xFF,0xFF,0x8A,0x04,0xE0,0x9D,0xE4,0x1E,0xFF,0x2F,0xE1, + 0x00,0x10,0x10,0x40,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x02,0x00,0x08,0x00,0x8A,0x42,0x00,0xDC, + 0x10,0x00,0x70,0x47,0xF0,0xB5,0x00,0x20,0xFD,0xB0,0x6A,0x90,0xFF,0x49,0x20,0x22, + 0x1E,0xA8,0xFC,0xF7,0xDF,0xF9,0xFF,0x4A,0xFD,0x4B,0xD0,0x88,0x9C,0x89,0xFE,0x49, + 0x45,0x06,0x00,0xD4,0x0C,0x89,0x9F,0x7C,0x43,0x06,0x00,0xD4,0x8F,0x7B,0xF8,0x49, + 0x20,0x39,0x7C,0x91,0x8E,0x8B,0x41,0x06,0xF8,0x48,0x7B,0x90,0x00,0xD4,0x06,0x8B, + 0xF7,0x48,0xFF,0x22,0x05,0x78,0xF7,0x48,0x01,0x32,0x00,0x78,0x00,0x21,0x1D,0x90, + 0x26,0xA8,0x00,0xF0,0xB5,0xFF,0xF4,0x48,0x08,0x22,0x00,0x21,0x00,0xF0,0xB0,0xFF, + 0xF1,0x48,0x10,0x22,0x00,0x21,0x08,0x30,0x00,0xF0,0xAA,0xFF,0x24,0x22,0x00,0x21, + 0x14,0xA8,0x00,0xF0,0xA5,0xFF,0x24,0x22,0x00,0x21,0x0B,0xA8,0x00,0xF0,0xA0,0xFF, + 0x24,0x22,0x00,0x21,0x02,0xA8,0x00,0xF0,0x9B,0xFF,0xE2,0x49,0x08,0x79,0x00,0x28, + 0x7E,0xD0,0xC8,0x88,0x7A,0x90,0x80,0x06,0x02,0xD5,0xE0,0x1B,0x04,0x04,0x24,0x0C, + 0xDC,0x48,0x64,0x21,0x00,0x89,0x07,0x00,0x60,0x43,0xFC,0xF7,0xC7,0xF9,0xDE,0x49, + 0x89,0x1C,0x79,0x91,0xD7,0x49,0xC9,0x89,0x40,0x18,0x79,0x99,0xC8,0x82,0xDB,0x48, + 0x00,0x21,0x78,0x90,0x01,0x81,0x7C,0x99,0x7A,0x9A,0x89,0x7F,0x38,0x00,0x52,0x06, + 0x01,0xD4,0x7B,0x99,0x89,0x7E,0x48,0x43,0x64,0x21,0xFC,0xF7,0x89,0xFA,0x00,0x04, + 0x78,0x99,0x00,0x14,0xB0,0x42,0x48,0x81,0x01,0xDA,0x78,0x98,0x46,0x81,0x02,0x20, + 0x6E,0x90,0x1D,0x98,0x00,0x24,0x80,0x1C,0x75,0x90,0x6E,0x98,0x0A,0xE1,0x02,0x20, + 0x6F,0x90,0xA8,0x1C,0x76,0x90,0x6F,0x98,0xFA,0xE0,0x6E,0x99,0x28,0x1D,0x41,0x43, + 0x77,0x90,0x6F,0x98,0x08,0x18,0x43,0x00,0xC5,0x48,0x0A,0x21,0xC2,0x5E,0x78,0x98, + 0x41,0x5E,0x8A,0x42,0x03,0xDD,0x00,0x89,0x78,0x99,0x40,0x1C,0x08,0x81,0x79,0x9E, + 0x16,0x21,0x71,0x5E,0x00,0x20,0x8A,0x42,0x02,0xDD,0x50,0x1A,0x00,0x04,0x00,0x14, + 0x6F,0x9A,0x00,0x2A,0x09,0xD1,0x00,0x28,0x78,0xD0,0x6E,0x98,0x26,0xA9,0x80,0x1E, + 0x68,0x43,0x40,0x18,0x91,0x1E,0x40,0x5C,0x14,0xE0,0xB5,0x4A,0x9B,0x18,0x20,0x3B, + 0x1E,0x22,0x9A,0x5E,0x8A,0x42,0x03,0xDD,0x51,0x1A,0x09,0x04,0x09,0x14,0x65,0xD1, + 0x00,0x28,0xE9,0xD0,0x6E,0x98,0x26,0xA9,0x80,0x1E,0x68,0x43,0x41,0x18,0x6F,0x98, + 0x80,0x1E,0x08,0x5C,0x00,0x28,0xF2,0xD1,0x6F,0x98,0x00,0x04,0x00,0x14,0x00,0xE0, + 0x83,0xE1,0x6D,0x90,0x68,0x90,0x6E,0x98,0x64,0x1C,0x00,0x04,0x00,0x14,0x24,0x04, + 0x04,0x22,0x24,0x14,0x6C,0x90,0x08,0x2C,0x67,0x90,0x03,0xDD,0x64,0x1E,0x24,0x04, + 0x24,0x14,0xB3,0xE0,0x00,0x20,0x66,0x90,0x00,0x20,0x6B,0x90,0x66,0x98,0xFF,0x21, + 0x40,0x1C,0x00,0x04,0x00,0x14,0x01,0x31,0x88,0x42,0x66,0x90,0x36,0xDC,0x00,0x20, + 0x84,0x46,0x91,0x00,0x1E,0xAB,0xC8,0x18,0x40,0x88,0x59,0x5A,0x67,0x9E,0x68,0x9B, + 0x80,0x19,0xC9,0x18,0x00,0x04,0x09,0x04,0x00,0x14,0x09,0x14,0x02,0x28,0x26,0xDB, + 0x75,0x9B,0x98,0x42,0x23,0xDA,0x02,0x29,0x21,0xDB,0x76,0x9B,0x99,0x42,0x1E,0xDA, + 0x77,0x9B,0x8B,0x4E,0x43,0x43,0x5B,0x18,0x5B,0x00,0xF3,0x5E,0x79,0x9E,0x16,0x27, + 0xF7,0x5F,0xBB,0x42,0x13,0xDD,0x83,0x1E,0x6B,0x43,0x26,0xAE,0x9B,0x19,0x8E,0x1E, + 0x9B,0x57,0xA3,0x42,0x01,0xD0,0x00,0x2B,0x09,0xD1,0x6C,0x9B,0x98,0x42,0x02,0xD1, + 0x6D,0x9B,0x99,0x42,0x0B,0xD0,0x01,0x23,0x6B,0x93,0x08,0xE0,0x5D,0xE0,0x52,0x1C, + 0x63,0x46,0x5B,0x1C,0x52,0x07,0x52,0x0F,0x08,0x2B,0x9C,0x46,0xC1,0xDB,0x67,0x9B, + 0x26,0xAE,0x9B,0x1E,0x6B,0x43,0x9B,0x19,0x68,0x9E,0xB6,0x1E,0x9F,0x5D,0x00,0x2F, + 0x3E,0xD1,0x9C,0x55,0x77,0x9E,0x67,0x9B,0x79,0x9F,0x73,0x43,0x68,0x9E,0x9B,0x19, + 0x6F,0x4E,0x5B,0x00,0xF3,0x5E,0x16,0x26,0xBE,0x5F,0xB3,0x42,0x03,0xDD,0x9B,0x1B, + 0x1B,0x04,0x1B,0x0C,0x00,0xE0,0x00,0x23,0x69,0x93,0xA3,0x00,0x9C,0x46,0x14,0xAE, + 0xF3,0x58,0x68,0x9E,0x5F,0x4F,0x76,0x00,0xF6,0x19,0xB6,0x8B,0x69,0x9F,0x7E,0x43, + 0x9E,0x19,0x63,0x46,0x14,0xAF,0xFE,0x50,0x0B,0xAE,0xF3,0x58,0x67,0x9E,0x59,0x4F, + 0x76,0x00,0xF6,0x19,0x40,0x36,0x36,0x88,0x69,0x9F,0x7E,0x43,0x9E,0x19,0x63,0x46, + 0x0B,0xAF,0xFE,0x50,0x02,0xAF,0xFB,0x58,0x69,0x9E,0x9E,0x19,0x63,0x46,0xFE,0x50, + 0x50,0x4E,0x63,0x00,0x9B,0x19,0xFF,0x33,0x41,0x33,0xDE,0x88,0x76,0x1C,0xDE,0x80, + 0x6B,0x9B,0x00,0x2B,0x09,0xD0,0x00,0x06,0x00,0x0E,0x67,0x90,0x08,0x06,0x00,0x0E, + 0x52,0x1D,0x52,0x07,0x52,0x0F,0x68,0x90,0x5E,0xE7,0x6F,0x98,0x40,0x1C,0x6F,0x90, + 0x76,0x99,0x88,0x42,0x00,0xDA,0x00,0xE7,0x6A,0x98,0x00,0x28,0x06,0xD1,0x6E,0x98, + 0x40,0x1C,0x6E,0x90,0x75,0x99,0x88,0x42,0x00,0xDA,0xF0,0xE6,0x00,0x2C,0x74,0xDD, + 0x02,0x20,0x54,0xE0,0x02,0x20,0x69,0x1C,0x72,0x91,0x4C,0xE0,0x2B,0x1D,0x62,0x46, + 0x5A,0x43,0x12,0x18,0x79,0x9E,0x57,0x00,0x3D,0x4B,0x16,0x22,0xB2,0x5E,0xFE,0x18, + 0x02,0x23,0xF3,0x5E,0x00,0x21,0x93,0x42,0x02,0xDD,0x99,0x1A,0x09,0x04,0x09,0x14, + 0x62,0x46,0x92,0x1E,0x6A,0x43,0x26,0xAB,0xD2,0x18,0x83,0x1E,0x74,0x92,0xD3,0x56, + 0x01,0x93,0x43,0x1E,0x73,0x93,0xD2,0x56,0x00,0x2A,0x2A,0xD1,0x00,0x29,0x28,0xD0, + 0x01,0x9A,0x00,0x2A,0x25,0xD0,0x27,0x4F,0x46,0x00,0xF6,0x19,0xF6,0x8B,0x92,0x00, + 0x14,0xAB,0x4E,0x43,0x9B,0x58,0x9B,0x19,0x14,0xAE,0xB3,0x50,0x66,0x46,0x76,0x00, + 0xF6,0x19,0x40,0x36,0x36,0x88,0x0B,0xAB,0x9B,0x58,0x4E,0x43,0x9B,0x19,0x0B,0xAE, + 0xB3,0x50,0x02,0xAE,0xB3,0x58,0x59,0x18,0xB1,0x50,0x01,0x99,0x49,0x00,0xC9,0x19, + 0xFF,0x31,0x41,0x31,0xCA,0x88,0x52,0x1C,0xCA,0x80,0x73,0x9B,0x74,0x9A,0x01,0x99, + 0xD1,0x54,0x72,0x99,0x40,0x1C,0x88,0x42,0xB0,0xDB,0x60,0x46,0x40,0x1C,0x75,0x99, + 0x84,0x46,0x88,0x42,0xA6,0xDB,0x01,0x26,0x38,0xE0,0xB1,0x00,0x02,0xAA,0x71,0x91, + 0x57,0x58,0x01,0x20,0x00,0x2F,0x00,0xD0,0x38,0x00,0x01,0x00,0x71,0x98,0x14,0xAA, + 0x10,0x58,0xFC,0xF7,0xFD,0xF8,0x07,0x49,0x72,0x00,0x51,0x18,0x70,0x91,0xFF,0x31, + 0x01,0x31,0xC8,0x83,0x01,0x21,0x00,0x2F,0x14,0xE0,0x21,0xE0,0xD0,0x71,0x00,0x00, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x20,0x79,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x2E,0x07,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x00,0xD0,0x39,0x00,0x71,0x98,0x0B,0xAA,0x10,0x58,0xFC,0xF7, + 0xD7,0xF8,0x70,0x99,0xFF,0x31,0x21,0x31,0x76,0x1C,0xC8,0x81,0xA6,0x42,0xC4,0xDD, + 0x14,0x4A,0x10,0x79,0x1F,0xE0,0x81,0x00,0x89,0x18,0xE0,0x31,0x0E,0x23,0xCB,0x5E, + 0x0C,0x24,0x0C,0x5F,0x6B,0x43,0x26,0xA9,0x09,0x19,0x59,0x5C,0x13,0x18,0x1C,0x00, + 0xFF,0x34,0x21,0x34,0x61,0x77,0x61,0x7F,0xFF,0x33,0x01,0x33,0x49,0x00,0x89,0x18, + 0xFF,0x31,0x41,0x31,0xC9,0x88,0x09,0x06,0x09,0x0E,0x19,0x74,0x93,0x8B,0x99,0x42, + 0x00,0xD9,0x91,0x83,0x40,0x1E,0x01,0x28,0xDD,0xDA,0x7D,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0xB5,0x00,0x20,0xE7,0xB0,0x42,0x90, + 0x32,0x90,0x0D,0x90,0xFF,0x48,0x66,0x90,0x02,0x8A,0xFF,0x49,0xC8,0x88,0x43,0x06, + 0x02,0xD4,0xFC,0x4A,0xC0,0x3A,0x92,0x89,0xFA,0x4D,0xFC,0x4C,0x20,0x35,0x0C,0x92, + 0xAA,0x89,0x43,0x06,0x00,0xD4,0x22,0x89,0xF9,0x4B,0x0B,0x92,0xF5,0x4A,0x40,0x32, + 0x65,0x92,0x52,0x89,0x46,0x06,0x64,0x93,0x00,0xD4,0xDA,0x88,0x43,0x06,0x0A,0x92, + 0x65,0x9A,0x12,0x79,0x01,0xD4,0x64,0x9A,0x12,0x78,0x43,0x06,0x09,0x92,0x65,0x9A, + 0x52,0x79,0x01,0xD4,0x64,0x9A,0x52,0x78,0x43,0x06,0x08,0x92,0x65,0x9A,0x12,0x8B, + 0x01,0xD4,0x64,0x9A,0x92,0x8A,0x40,0x06,0x07,0x92,0x2F,0x89,0x00,0xD4,0xA7,0x88, + 0xE8,0x48,0x29,0x22,0x06,0x78,0xE8,0x48,0x00,0x78,0x06,0x90,0xE2,0x48,0xC0,0x89, + 0x05,0x90,0x01,0x20,0x04,0x90,0x00,0x20,0x01,0x00,0x02,0x90,0x0E,0xA8,0x00,0xF0, + 0x3F,0xFD,0xE2,0x48,0xDC,0x49,0x08,0x81,0xDB,0x48,0x00,0x21,0x81,0x81,0x41,0x81, + 0xC0,0x30,0x63,0x90,0x41,0x80,0xA0,0x30,0x62,0x90,0x40,0x78,0xDC,0x49,0x02,0x28, + 0x61,0x91,0x53,0xD9,0xD4,0x4A,0x69,0x8A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x89, + 0x36,0x91,0xD8,0x49,0x36,0x9A,0x60,0x91,0x89,0x8B,0x89,0x18,0x37,0x91,0x0C,0x99, + 0xC9,0x04,0x25,0xD5,0x01,0x28,0x0C,0xD9,0xCB,0x4A,0xE9,0x7A,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0xE1,0x79,0x48,0x43,0x00,0x06,0x00,0x0E,0x04,0x90,0x01,0xD1,0x01,0x20, + 0x04,0x90,0x63,0x99,0xC4,0x4A,0x00,0x20,0x08,0x5E,0xD2,0x88,0xA9,0x7A,0x52,0x06, + 0x00,0xD4,0xA1,0x79,0x48,0x43,0x64,0x21,0xFB,0xF7,0x40,0xFF,0x00,0x04,0x00,0x0C, + 0xB8,0x42,0x00,0xD2,0x38,0x00,0x04,0x99,0xFC,0xF7,0x12,0xF8,0x63,0x99,0x48,0x80, + 0xB9,0x49,0x65,0x98,0xC9,0x88,0x40,0x8B,0x49,0x06,0x01,0xD4,0x64,0x98,0xC0,0x8A, + 0x61,0x99,0x89,0x8B,0x40,0x18,0x37,0x99,0x35,0x90,0x88,0x42,0x34,0x91,0x00,0xD2, + 0x37,0x90,0x02,0x20,0x4D,0x90,0xAF,0x48,0xC0,0x30,0x5F,0x90,0xB4,0x48,0xA0,0x38, + 0x5E,0x90,0x06,0x98,0x80,0x1C,0x53,0x90,0x4D,0x98,0x95,0xE3,0x02,0x28,0x08,0xD1, + 0xA9,0x4A,0x29,0x8A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xA1,0x89,0x61,0x9A,0x52,0x8B, + 0x0E,0xE0,0xAD,0x49,0x09,0x78,0x00,0x29,0x02,0xD0,0xAC,0x49,0x89,0x89,0x05,0xE0, + 0xA1,0x4A,0xE9,0x89,0xD2,0x88,0x52,0x06,0x00,0xD4,0x61,0x89,0x61,0x9A,0x12,0x8B, + 0x89,0x18,0x95,0xE7,0x02,0x24,0xB0,0x1C,0x54,0x90,0x6A,0xE3,0x4D,0x98,0x54,0x99, + 0x40,0x1E,0x48,0x43,0x61,0x1E,0x40,0x18,0x00,0x04,0x07,0x14,0xA0,0x49,0x78,0x00, + 0x5D,0x90,0x08,0x5E,0x37,0x99,0x09,0x04,0x09,0x14,0x88,0x42,0x7B,0xDB,0x78,0x1C, + 0xC1,0x10,0x0E,0xAA,0x52,0x5C,0x41,0x07,0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40, + 0xF8,0x10,0x0E,0xA9,0x5C,0x90,0x09,0x5C,0x7B,0x07,0x5B,0x0F,0x01,0x20,0x98,0x40, + 0x01,0x40,0x5B,0x90,0x78,0x1E,0xC3,0x10,0x0E,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F, + 0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0,0x63,0xFC,0x01,0x90,0xB8,0x1B,0x41,0x1E, + 0xCA,0x10,0x0E,0xAB,0x9A,0x5C,0x4B,0x07,0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40, + 0x83,0x1E,0xD9,0x10,0x0E,0xAD,0x69,0x5C,0x5D,0x07,0x6D,0x0F,0x01,0x23,0xAB,0x40, + 0x19,0x40,0xC0,0x1E,0xC3,0x10,0x0E,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20, + 0xA8,0x40,0x18,0x40,0x01,0xF0,0x44,0xFC,0x01,0x99,0x01,0xF0,0x3F,0xFC,0x00,0x28, + 0x39,0xD1,0x7B,0x48,0x32,0x00,0x39,0x00,0x02,0x23,0xFE,0xF7,0x5B,0xFF,0x37,0x99, + 0x88,0x42,0xB3,0xDB,0x76,0x49,0x5D,0x9A,0x89,0x5E,0x81,0x42,0xF0,0xD1,0x6A,0x4F, + 0xBA,0x89,0x82,0x42,0x00,0xDA,0xB8,0x81,0x5C,0x9A,0x0E,0xAB,0x9A,0x5C,0x5B,0x9D, + 0x2A,0x43,0x5C,0x9D,0x5A,0x55,0x64,0x4A,0x92,0x89,0x82,0x42,0x05,0xD1,0x62,0x48, + 0x00,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E,0x0D,0x90,0x00,0x20,0x05,0x00,0x03,0x90, + 0x5E,0x98,0x80,0x7E,0xC2,0x07,0x20,0xD0,0x80,0x07,0x0D,0xD5,0x30,0x1B,0x40,0x1C, + 0x00,0xD1,0x75,0x1E,0xA6,0x42,0x04,0xD1,0x01,0x22,0x30,0x04,0x52,0x04,0x80,0x1A, + 0x05,0x43,0x01,0x20,0x10,0xE0,0xA4,0xE0,0x4D,0x9A,0x06,0x98,0x80,0x1A,0x40,0x1C, + 0x01,0xD1,0x06,0x9D,0x6D,0x1E,0x06,0x98,0x90,0x42,0x04,0xD1,0x01,0x22,0x00,0x04, + 0x12,0x05,0x80,0x1A,0x05,0x43,0x02,0x20,0x03,0x90,0x28,0x04,0x01,0xD0,0x35,0x98, + 0x00,0xE0,0x34,0x98,0x00,0x04,0x00,0x14,0x81,0x42,0xB2,0xDB,0x4D,0x99,0x30,0x1D, + 0x41,0x43,0x5A,0x90,0x08,0x19,0x00,0x04,0x00,0x14,0x33,0x90,0x0C,0x98,0xC0,0x04, + 0x0C,0xD5,0x33,0x98,0x4B,0x49,0x40,0x00,0x08,0x5E,0x05,0x99,0x40,0x1A,0x00,0x28, + 0x77,0xDD,0x63,0x9A,0x02,0x21,0x51,0x5E,0x81,0x42,0x72,0xDA,0x04,0x20,0x4E,0x90, + 0x20,0x18,0x59,0x90,0x4E,0x98,0x04,0x27,0x80,0x00,0x58,0x90,0x59,0x98,0x00,0x1F, + 0x0D,0xD4,0x59,0x98,0x00,0x1F,0xB0,0x42,0x09,0xDA,0x4D,0x98,0xC0,0x19,0x57,0x90, + 0x00,0x1F,0x04,0xD4,0x57,0x98,0x06,0x99,0x00,0x1F,0x88,0x42,0x07,0xDB,0x14,0x20, + 0x78,0x43,0x00,0x21,0x19,0xAA,0x80,0x18,0x58,0x9A,0x81,0x50,0x27,0xE0,0x05,0x98, + 0x0C,0x99,0x00,0x04,0x00,0x14,0xC9,0x04,0x04,0xD5,0x04,0x99,0xFB,0xF7,0x0E,0xFE, + 0x00,0x04,0x00,0x14,0x57,0x99,0x5A,0x9A,0x89,0x1E,0x51,0x43,0x59,0x9A,0x89,0x18, + 0x2C,0x4A,0x49,0x00,0x89,0x18,0x20,0x39,0x89,0x8B,0x08,0x1A,0x00,0x04,0x00,0x14, + 0x00,0xD5,0x00,0x20,0x07,0x99,0x00,0x29,0x03,0xD0,0x88,0x42,0x01,0xDD,0x08,0x04, + 0x00,0x14,0x14,0x21,0x79,0x43,0x19,0xAA,0x89,0x18,0x58,0x9A,0x88,0x50,0x7F,0x1E, + 0x3F,0x04,0x3F,0x14,0xBA,0xD5,0x4E,0x98,0x40,0x1E,0x00,0x04,0x00,0x14,0x4E,0x90, + 0xAE,0xD5,0x33,0x98,0x1B,0x4A,0x40,0x00,0x84,0x46,0x80,0x18,0x01,0x00,0x20,0x39, + 0x1E,0x23,0xCB,0x5E,0x05,0x99,0x59,0x1A,0x41,0x91,0x02,0x21,0x41,0x5E,0x05,0x98, + 0x05,0x9B,0x08,0x1A,0x40,0x90,0x33,0x98,0x18,0x21,0x80,0x1B,0x40,0x00,0x80,0x18, + 0x20,0x38,0x41,0x5E,0xC9,0x1A,0x3F,0x91,0x33,0x99,0x89,0x19,0x49,0x00,0x89,0x18, + 0x1A,0xE0,0x3B,0xE1,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x79,0x00,0x00, + 0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20,0x04,0x0B,0x00,0x20,0xA0,0x7A,0x00,0x00, + 0x40,0x00,0x00,0x20,0xC8,0x02,0x00,0x20,0x08,0x23,0xCB,0x5E,0x05,0x9F,0xDB,0x1B, + 0x3E,0x93,0x16,0x23,0xC3,0x5E,0xDB,0x1B,0x3D,0x93,0x06,0x23,0xCB,0x5E,0xDB,0x1B, + 0x3C,0x93,0x1A,0x23,0xC3,0x5E,0xD8,0x1B,0x3B,0x90,0x0A,0x20,0x08,0x5E,0x0B,0x99, + 0xC0,0x1B,0x3A,0x90,0x60,0x46,0x10,0x5E,0xC0,0x1B,0x48,0x43,0x64,0x21,0xFB,0xF7, + 0x8D,0xFD,0x38,0x90,0x26,0x98,0x02,0x04,0x24,0x98,0x12,0x14,0x03,0x04,0x21,0x98, + 0x00,0x92,0x02,0x04,0x20,0x98,0x1B,0x14,0x01,0x04,0x1F,0x98,0x12,0x14,0x00,0x04, + 0x09,0x14,0x00,0x14,0xFF,0xF7,0x45,0xFB,0x07,0x00,0x2B,0x98,0x02,0x04,0x2A,0x98, + 0x12,0x14,0x01,0x04,0x29,0x98,0x09,0x14,0x00,0x04,0x00,0x14,0xFF,0xF7,0x32,0xFB, + 0x01,0x00,0x38,0x00,0xFF,0xF7,0x2A,0xFB,0x25,0x99,0x7D,0x22,0x52,0x01,0x91,0x42, + 0x07,0xDD,0x81,0x42,0x05,0xDD,0x08,0x1A,0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20, + 0x02,0x90,0xFB,0x48,0xFF,0x21,0xC0,0x88,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06, + 0x01,0xD5,0x01,0x20,0x02,0x90,0xF7,0x48,0x00,0x78,0x00,0x28,0x47,0xD1,0x20,0xA9, + 0x06,0xC9,0x02,0x2C,0x14,0xD1,0x01,0xF0,0xE3,0xFA,0x07,0x00,0x00,0x21,0x26,0x9A, + 0x08,0x00,0x01,0xF0,0xDD,0xFA,0x2A,0xA9,0x06,0xC9,0x3F,0x18,0x00,0x20,0x01,0xF0, + 0xD7,0xFA,0x38,0x18,0x05,0x21,0xFB,0xF7,0x39,0xFD,0x00,0x04,0x00,0x0C,0x13,0xE0, + 0x1F,0x98,0x01,0xF0,0xCD,0xFA,0x07,0x00,0x26,0x9A,0x24,0x98,0x00,0x21,0x01,0xF0, + 0xC7,0xFA,0x3F,0x18,0x29,0xA8,0x07,0xC8,0x01,0xF0,0xC2,0xFA,0x38,0x18,0xC1,0x17, + 0x49,0x0F,0x08,0x18,0x40,0x03,0x00,0x0C,0x25,0x99,0x09,0x1A,0x00,0x29,0x01,0xDC, + 0x25,0x99,0x41,0x1A,0x5F,0x98,0x02,0x8A,0xD9,0x48,0xC0,0x88,0x43,0x06,0x01,0xD4, + 0x66,0x9A,0x92,0x89,0x91,0x42,0x0A,0xDA,0x5F,0x99,0x25,0x9A,0x49,0x8A,0x40,0x06, + 0x01,0xD4,0x66,0x98,0xC1,0x89,0x8A,0x42,0x01,0xDA,0x28,0x04,0x7E,0xD0,0x00,0x2D, + 0x2B,0xD0,0x03,0x98,0xC0,0x07,0x16,0xD0,0x04,0x20,0x00,0x22,0x19,0xAB,0x29,0x04, + 0x06,0xD0,0x14,0x27,0x01,0x00,0x79,0x43,0x5A,0x50,0xC9,0x18,0x4A,0x60,0x05,0xE0, + 0x14,0x27,0x01,0x00,0x79,0x43,0xC9,0x18,0xCA,0x60,0x0A,0x61,0x40,0x1E,0x00,0x04, + 0x00,0x14,0xEC,0xD5,0x11,0xE0,0x04,0x20,0x00,0x22,0x19,0xAB,0x29,0x04,0x04,0xD0, + 0x81,0x00,0x5A,0x50,0xC9,0x18,0x4A,0x61,0x03,0xE0,0x81,0x00,0xC9,0x18,0xCA,0x63, + 0x0A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xF0,0xD5,0xBB,0x48,0x33,0x99,0x32,0x00, + 0x04,0x23,0xFE,0xF7,0x8F,0xFD,0xB6,0x49,0x0A,0x89,0x82,0x42,0x00,0xDD,0x08,0x81, + 0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81,0xB1,0x48,0x01,0x79,0x49,0x1C,0x0A,0x06, + 0x12,0x0E,0x02,0x71,0x92,0x00,0xA1,0x1E,0x12,0x18,0xE0,0x32,0x56,0x91,0x91,0x81, + 0x4D,0x99,0x89,0x1E,0x55,0x91,0x02,0x79,0x92,0x00,0x10,0x18,0xE0,0x30,0xC1,0x81, + 0x00,0x20,0x07,0x00,0x01,0x00,0x84,0x46,0x39,0x90,0x41,0x9A,0x38,0x98,0x82,0x42, + 0x06,0xDC,0x38,0x9A,0x3D,0x98,0x90,0x42,0x02,0xDC,0x3C,0x98,0x90,0x42,0x01,0xDD, + 0x01,0x20,0x39,0x90,0x38,0x9A,0x40,0x98,0x90,0x42,0x05,0xDC,0x3B,0x98,0x90,0x42, + 0x02,0xDC,0x3A,0x98,0x90,0x42,0x01,0xDD,0x01,0x20,0x84,0x46,0x3F,0x98,0x90,0x42, + 0x05,0xDC,0x3D,0x98,0x90,0x42,0x02,0xDC,0x3B,0x98,0x90,0x42,0x00,0xDD,0x01,0x27, + 0x3E,0x98,0x90,0x42,0x07,0xDC,0x3C,0x98,0x90,0x42,0x00,0xE0,0xF5,0xE0,0x02,0xDC, + 0x3A,0x98,0x90,0x42,0x00,0xDD,0x01,0x21,0x04,0x20,0x00,0x22,0x19,0xAD,0x39,0x9B, + 0x00,0x2B,0x02,0xD1,0x14,0x23,0x43,0x43,0xEA,0x50,0x63,0x46,0x00,0x2B,0x03,0xD1, + 0x14,0x23,0x43,0x43,0x5B,0x19,0x1A,0x61,0x00,0x2F,0x01,0xD1,0x83,0x00,0xEA,0x50, + 0x00,0x29,0x02,0xD1,0x83,0x00,0x5B,0x19,0x1A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xE5,0xD5,0x1D,0x9A,0x19,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xFC,0xF9,0x4A,0x90, + 0x22,0x9A,0x1E,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xF5,0xF9,0x27,0x9A,0x49,0x90, + 0x23,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xEE,0xF9,0x2C,0x9A,0x48,0x90,0x28,0xA8, + 0x00,0x92,0x0F,0xC8,0x01,0xF0,0xE7,0xF9,0x31,0x9A,0x47,0x90,0x2D,0xA8,0x00,0x92, + 0x0F,0xC8,0x01,0xF0,0xE0,0xF9,0x46,0x90,0x00,0x90,0x47,0x9B,0x48,0x9A,0x49,0x99, + 0x4A,0x98,0x01,0xF0,0xD8,0xF9,0x00,0x28,0x4B,0x90,0x0F,0xD1,0x04,0x27,0x14,0x20, + 0x78,0x43,0x40,0x19,0x0A,0x22,0x00,0x21,0x00,0xF0,0xF2,0xF9,0x7F,0x1E,0x3F,0x04, + 0x3F,0x14,0xF4,0xD5,0x0A,0x20,0x48,0x90,0x25,0x90,0x4B,0x90,0x56,0x98,0x00,0x28, + 0x01,0xDC,0x00,0x20,0x0C,0xE0,0x2D,0x9A,0x00,0x92,0x28,0x9B,0x23,0x9A,0x1E,0x99, + 0x19,0x98,0x01,0xF0,0xB8,0xF9,0x5A,0x4A,0x61,0x00,0x89,0x18,0x49,0x8B,0x48,0x43, + 0x2E,0x9A,0x45,0x90,0x00,0x92,0x29,0x9B,0x24,0x9A,0x1F,0x99,0x1A,0x98,0x01,0xF0, + 0xAA,0xF9,0x53,0x49,0x62,0x00,0x55,0x18,0xA9,0x8B,0x2F,0x9A,0x2A,0x9B,0x48,0x43, + 0x44,0x90,0x00,0x92,0x25,0x9A,0x20,0x99,0x1B,0x98,0x01,0xF0,0x9C,0xF9,0xE9,0x8B, + 0x30,0x9A,0x2B,0x9B,0x48,0x43,0x43,0x90,0x00,0x92,0x26,0x9A,0x21,0x99,0x1C,0x98, + 0x01,0xF0,0x91,0xF9,0x29,0x8C,0x48,0x43,0x56,0x99,0x07,0x00,0x70,0x1E,0x81,0x42, + 0x01,0xDB,0x00,0x20,0x09,0xE0,0x31,0x9A,0x2C,0x9B,0x00,0x92,0x27,0x9A,0x22,0x99, + 0x1D,0x98,0x01,0xF0,0x80,0xF9,0x69,0x8C,0x48,0x43,0x00,0x90,0x43,0x9A,0x44,0x99, + 0x45,0x98,0x3B,0x00,0x01,0xF0,0x77,0xF9,0x4B,0x99,0xFB,0xF7,0xD7,0xFB,0x38,0x49, + 0x0A,0x8C,0x52,0x00,0x80,0x1A,0x00,0xD5,0x00,0x20,0x0A,0x79,0x52,0x00,0x52,0x18, + 0xC0,0x32,0x90,0x81,0x55,0x98,0x00,0x28,0x01,0xDC,0x00,0x20,0x05,0xE0,0x4D,0x98, + 0x4A,0x9A,0x40,0x00,0x40,0x18,0xC0,0x8F,0x50,0x43,0x4D,0x9A,0x2C,0x49,0x52,0x00, + 0x52,0x18,0x40,0x32,0x11,0x88,0x49,0x9B,0x48,0x9D,0x59,0x43,0x53,0x88,0x06,0x9F, + 0x6B,0x43,0x9C,0x46,0x93,0x88,0x47,0x9D,0x7F,0x1E,0x6B,0x43,0x55,0x9D,0xBD,0x42, + 0x01,0xDB,0x00,0x22,0x02,0xE0,0xD2,0x88,0x46,0x9D,0x6A,0x43,0x00,0x92,0x62,0x46, + 0x01,0xF0,0x41,0xF9,0x4B,0x99,0xFB,0xF7,0xA1,0xFB,0x1D,0x49,0x40,0x31,0x89,0x88, + 0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20,0x19,0x49,0x0A,0x79,0x52,0x00,0x52,0x18, + 0xC0,0x32,0xD0,0x83,0x08,0x79,0x08,0x28,0x12,0xD2,0x64,0x1C,0x54,0x98,0x24,0x04, + 0x24,0x14,0x84,0x42,0x00,0xDA,0x91,0xE4,0x42,0x98,0x00,0x28,0x08,0xD1,0x4D,0x98, + 0x40,0x1C,0x00,0x04,0x00,0x14,0x4D,0x90,0x53,0x99,0x88,0x42,0x00,0xDA,0x81,0xE4, + 0x0C,0x98,0x00,0x06,0x60,0xD5,0x0A,0x4C,0x20,0x79,0x00,0x28,0x60,0x98,0x15,0xD1, + 0x80,0x8B,0x00,0x28,0x51,0xD0,0x60,0x98,0x65,0x99,0xE2,0x88,0x40,0x7E,0x09,0x7B, + 0x52,0x06,0x01,0xD4,0x64,0x99,0x09,0x7A,0x88,0x42,0x46,0xD2,0x40,0x1C,0x41,0xE0, + 0xF0,0x05,0x00,0x20,0x05,0x0B,0x00,0x20,0xC8,0x02,0x00,0x20,0x80,0x7E,0x09,0x99, + 0x88,0x42,0x36,0xD8,0x40,0x1C,0x60,0x99,0x00,0x06,0x00,0x0E,0x88,0x76,0x08,0x99, + 0x88,0x42,0x03,0xD9,0xA1,0x89,0x32,0x9A,0x89,0x18,0x32,0x91,0x09,0x99,0x88,0x42, + 0x27,0xD1,0x08,0x99,0x88,0x42,0x24,0xD0,0x41,0x1A,0x32,0x98,0xFB,0xF7,0x20,0xFC, + 0x60,0x9A,0x00,0x21,0x91,0x83,0x65,0x99,0x0A,0x89,0xE1,0x88,0x4B,0x06,0x01,0xD4, + 0x64,0x9A,0x92,0x88,0x82,0x42,0x14,0xD2,0x36,0x9A,0x80,0x1A,0x65,0x9A,0x49,0x06, + 0x92,0x79,0x01,0xD4,0x64,0x99,0x8A,0x78,0x64,0x21,0x50,0x43,0xFB,0xF7,0x08,0xFC, + 0x60,0x99,0x00,0x04,0x00,0x0C,0x88,0x83,0x0A,0x99,0x88,0x42,0x01,0xD9,0x60,0x98, + 0x81,0x83,0x00,0x20,0x60,0x99,0x48,0x76,0x06,0xE0,0x60,0x99,0x00,0x20,0x88,0x76, + 0x60,0x99,0x48,0x76,0x60,0x99,0x88,0x83,0x00,0x20,0x84,0x46,0x4C,0x90,0x59,0x48, + 0x01,0x24,0x00,0x79,0x50,0x90,0x52,0xE0,0x56,0x48,0x61,0x00,0x0F,0x18,0xC0,0x37, + 0xB8,0x89,0x0A,0x21,0xFB,0xF7,0xE4,0xFB,0x05,0x04,0xF8,0x8B,0x2D,0x14,0x0A,0x21, + 0xFB,0xF7,0xDE,0xFB,0x5E,0x99,0x02,0x04,0xC9,0x7E,0x12,0x14,0x00,0x20,0x84,0x46, + 0x51,0x91,0x36,0xE0,0x4B,0x49,0xC3,0x00,0x5B,0x18,0x11,0x21,0x89,0x01,0x59,0x18, + 0x1C,0x27,0x52,0x91,0xCF,0x5F,0xAF,0x42,0x27,0xDC,0x23,0x21,0x49,0x01,0x59,0x18, + 0x00,0x23,0xCB,0x5E,0xAB,0x42,0x20,0xDB,0x52,0x9F,0x1E,0x23,0xFB,0x5E,0x93,0x42, + 0x1B,0xDC,0x02,0x27,0xCF,0x5F,0x3F,0x4B,0x97,0x42,0x16,0xDB,0xA1,0x00,0xC9,0x18, + 0xE0,0x31,0x0E,0x23,0xCB,0x5E,0x37,0x1D,0x9B,0x1C,0x7B,0x43,0x0C,0x27,0xCF,0x5F, + 0xD9,0x19,0x4B,0x00,0x38,0x49,0x5B,0x18,0x04,0x21,0x59,0x5E,0x4C,0x9B,0x99,0x42, + 0x03,0xDD,0x4C,0x91,0x21,0x06,0x09,0x0E,0x8C,0x46,0x40,0x1C,0x51,0x99,0x00,0x04, + 0x00,0x14,0x81,0x42,0xC6,0xDC,0x64,0x1C,0x50,0x98,0x24,0x04,0x24,0x14,0xA0,0x42, + 0xAA,0xDA,0x2C,0x4D,0x4C,0x9A,0x2C,0x00,0x23,0x00,0x69,0x89,0x20,0x00,0xDE,0x33, + 0xCC,0x30,0xC2,0x34,0x91,0x42,0x4F,0x93,0x05,0xDC,0x61,0x46,0x00,0x29,0x02,0xD0, + 0x49,0x00,0x49,0x19,0x0E,0xE0,0x69,0x79,0x00,0x29,0x1B,0xD1,0x50,0x99,0x01,0x29, + 0x18,0xD9,0x62,0x99,0x89,0x78,0x00,0x29,0x14,0xD1,0x0D,0x99,0x00,0x29,0x11,0xD0, + 0x4A,0x00,0x51,0x19,0xC0,0x31,0x8E,0x89,0xCF,0x8B,0x12,0x22,0x00,0x21,0x00,0xF0, + 0x57,0xF8,0x4F,0x98,0x12,0x22,0x00,0x21,0x00,0xF0,0x52,0xF8,0x01,0x20,0x28,0x71, + 0xA6,0x81,0xE7,0x83,0x5E,0x98,0xC0,0x7D,0x00,0x28,0x0C,0xD0,0x00,0x21,0x29,0x71, + 0x5E,0x98,0x12,0x4A,0x00,0x7E,0x92,0x7F,0x90,0x42,0x01,0xD3,0x5E,0x9A,0xD1,0x75, + 0x5E,0x99,0x40,0x1C,0x08,0x76,0x02,0x99,0x0D,0x48,0x00,0x29,0x10,0xD0,0x29,0x79, + 0x00,0x29,0x0D,0xD0,0x0B,0x4A,0x01,0x68,0x52,0x89,0x0A,0x32,0x91,0x42,0x01,0xDA, + 0x49,0x1C,0x01,0x60,0x28,0x79,0x68,0x71,0x67,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x21,0xF6,0xE7,0xF0,0x05,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x0A,0x00,0x20,0x80,0x7A,0x00,0x00,0x03,0xE0,0x0B,0x78,0x49,0x1C,0x03,0x70, + 0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47,0x52,0x10,0x03,0xE0,0x0B,0x88,0x89,0x1C, + 0x03,0x80,0x80,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47,0x92,0x10,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x09,0x06,0x09,0x0E,0x01,0xE0,0x01,0x70,0x40,0x1C,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0x0A,0x49,0x00,0x20, + 0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5,0xC8,0x7A,0x89,0x7A,0x08,0x18,0x00,0x06, + 0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23,0x1B,0x02,0x9A,0x43,0x02,0x61,0x02,0x69, + 0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00, + 0x00,0x90,0x00,0x40,0x10,0xB5,0x14,0x48,0x14,0x49,0x80,0x8B,0xC9,0x8A,0x00,0x24, + 0x40,0x18,0x13,0x49,0x09,0x78,0x00,0x29,0x12,0x49,0x04,0xD0,0x15,0x22,0x52,0x01, + 0x89,0x18,0x49,0x89,0x09,0xE0,0x10,0x4A,0xFF,0x31,0xD2,0x88,0xA1,0x31,0x49,0x8A, + 0x52,0x06,0x02,0xD4,0x0B,0x49,0xE0,0x31,0xC9,0x89,0x08,0x18,0x0B,0x49,0xC9,0x6B, + 0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3,0x01,0x24,0xFE,0xF7,0x71,0xFF,0x20,0x00, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x06,0x00,0x20,0xD0,0x0A,0x00,0x20, + 0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40, + 0xF7,0xB5,0x2C,0x4E,0xFF,0x27,0xB0,0x7F,0xF1,0x7F,0x84,0xB0,0x00,0x02,0x08,0x43, + 0x01,0xF0,0x28,0xFD,0x30,0x00,0x20,0x38,0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x26,0x48, + 0x01,0x78,0x26,0x48,0x00,0x7A,0x00,0x29,0x02,0xD0,0x01,0xF0,0xBB,0xFC,0x01,0xE0, + 0x01,0xF0,0xE8,0xFC,0x22,0x48,0x02,0x25,0xC1,0x6A,0x03,0x91,0x01,0x6A,0x02,0x91, + 0x41,0x6A,0x01,0x91,0x41,0x6B,0x00,0x91,0x21,0xE0,0x1D,0x4F,0x00,0x20,0xF8,0x62, + 0x18,0x48,0xA0,0x30,0x80,0x68,0x38,0x62,0x1A,0x48,0x00,0x6B,0x78,0x62,0x03,0x24, + 0xE0,0x07,0xC0,0x0F,0xFC,0xF7,0xC2,0xF8,0x64,0x1E,0xF9,0xD5,0x02,0x20,0x78,0x63, + 0x30,0x7F,0x01,0x00,0xFC,0xF7,0x3C,0xF9,0x01,0x24,0x04,0xA8,0x07,0xC8,0xFE,0xF7, + 0xB3,0xFE,0x07,0x00,0x01,0xD1,0x00,0x24,0x25,0x00,0x64,0x1E,0xF5,0xD5,0x28,0x00, + 0x6D,0x1E,0x00,0x28,0xD9,0xDC,0x0A,0x48,0x03,0x99,0xC1,0x62,0x02,0x99,0x01,0x62, + 0x01,0x99,0x41,0x62,0x00,0x99,0x41,0x63,0x38,0x00,0x07,0xB0,0xF0,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00,0xFD,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20, + 0x80,0x90,0x00,0x40,0x80,0x7A,0x00,0x00,0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9, + 0x71,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3,0xB8,0x01,0x8D,0xE5,0x88,0x07,0x9F,0xE5, + 0x8C,0x37,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x8C,0x67,0x9F,0xE5,0xB0,0x01,0x8D,0xE5, + 0x78,0x07,0x9F,0xE5,0x00,0xB0,0xD0,0xE5,0xB6,0x00,0xD3,0xE1,0x40,0x10,0x00,0xE2, + 0x70,0x07,0x9F,0xE5,0x00,0x00,0x51,0xE3,0x01,0x4C,0x80,0xE2,0xBC,0x1E,0xD0,0x01, + 0xB0,0x1B,0xD4,0x11,0x02,0xAC,0x80,0xE2,0xAC,0x11,0x8D,0xE5,0xB0,0x1F,0xD0,0x01, + 0xB4,0x1B,0xD4,0x11,0xA8,0x11,0x8D,0xE5,0xF8,0x1A,0xD4,0x01,0xFC,0x16,0xDA,0x11, + 0xA0,0x11,0x8D,0xE5,0xFA,0x1A,0xD4,0x01,0xFE,0x16,0xDA,0x11,0x9C,0x11,0x8D,0xE5, + 0xF4,0x10,0xD0,0x05,0xB8,0x11,0xD0,0x15,0x98,0x11,0x8D,0xE5,0xF5,0x10,0xD0,0x05, + 0xB9,0x11,0xD0,0x15,0x94,0x11,0x8D,0xE5,0xF6,0x10,0xD0,0x05,0xBA,0x11,0xD0,0x15, + 0x90,0x11,0x8D,0xE5,0xF7,0x10,0xD0,0x05,0xBB,0x11,0xD0,0x15,0x8C,0x11,0x8D,0xE5, + 0xBC,0x1F,0xD0,0x01,0xB0,0x1C,0xD4,0x11,0x88,0x11,0x8D,0xE5,0xBE,0x1F,0xD0,0x01, + 0xB2,0x1C,0xD4,0x11,0x84,0x11,0x8D,0xE5,0xB0,0x10,0xD4,0x01,0xB4,0x1C,0xD4,0x11, + 0x80,0x11,0x8D,0xE5,0xB2,0x10,0xD4,0x01,0xB6,0x1C,0xD4,0x11,0x7C,0x11,0x8D,0xE5, + 0xB8,0x1F,0xD0,0x01,0xBC,0x1B,0xD4,0x11,0x78,0x11,0x8D,0xE5,0xBA,0x0F,0xD0,0x01, + 0xBE,0x0B,0xD4,0x11,0x74,0x01,0x8D,0xE5,0x00,0x00,0xA0,0xE3,0x30,0x00,0x8D,0xE5, + 0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5,0x24,0x00,0x8D,0xE5,0x20,0x00,0x8D,0xE5, + 0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5,0x14,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5, + 0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5,0x04,0x00,0x8D,0xE5,0xB8,0x05,0xC6,0xE1, + 0x00,0x90,0xA0,0xE1,0xBA,0x05,0xC6,0xE1,0x01,0x5C,0x46,0xE2,0xBC,0x05,0xC6,0xE1, + 0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x70,0x00,0x85,0xE2,0x49,0xFF,0xFF,0xEB, + 0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x98,0x00,0x85,0xE2,0x45,0xFF,0xFF,0xEB, + 0x00,0x00,0xA0,0xE3,0xB4,0x01,0x8D,0xE5,0x00,0x10,0xA0,0xE1,0xB0,0x0C,0xC5,0xE1, + 0x50,0x20,0xA0,0xE3,0x49,0x0F,0x8D,0xE2,0x3E,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0xD4,0x00,0x8D,0xE2,0x3A,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x84,0x00,0x8D,0xE2,0x36,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3, + 0x00,0x10,0xA0,0xE3,0x34,0x00,0x8D,0xE2,0x32,0xFF,0xFF,0xEB,0x0C,0x06,0x9F,0xE5, + 0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3,0xF8,0x7A,0xDA,0x11,0xB6,0x0A,0xDA,0x11, + 0x07,0x00,0x00,0x1A,0xE8,0x05,0x9F,0xE5,0xB6,0x00,0xD0,0xE1,0x40,0x00,0x00,0xE2, + 0x00,0x00,0x50,0xE3,0xF2,0x71,0xD4,0x01,0xF6,0x7D,0xD4,0x11,0xB0,0x01,0xD4,0x01, + 0xB4,0x0D,0xD4,0x11,0x00,0x80,0xA0,0xE3,0x08,0x50,0xA0,0xE1,0xA4,0x01,0x8D,0xE5, + 0xCC,0x05,0x9F,0xE5,0xC0,0x01,0x8D,0xE5,0x0E,0x0C,0x80,0xE2,0xBC,0x01,0x8D,0xE5, + 0x82,0x00,0x00,0xEA,0x00,0x40,0xA0,0xE3,0x7C,0x00,0x00,0xEA,0xC0,0x01,0x9D,0xE5, + 0x0F,0x2A,0xE0,0xE3,0x08,0x11,0x90,0xE7,0x01,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1, + 0x21,0x18,0x02,0xE0,0x01,0x30,0x40,0xE0,0x00,0x00,0x41,0xE0,0x9C,0x11,0x9D,0xE5, + 0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0xD4,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7, + 0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0x9C,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0, + 0x00,0x00,0x51,0xE3,0x34,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0, + 0x04,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3, + 0x49,0x2F,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7, + 0xA0,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x84,0x20,0x8D,0xC2, + 0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7,0xB4,0x11,0x9D,0xE5, + 0x01,0x00,0x53,0xE1,0xB4,0x31,0x8D,0xC5,0x30,0x40,0x8D,0xC5,0x2C,0x50,0x8D,0xC5, + 0xC8,0x00,0x53,0xE3,0xB8,0x15,0xD6,0xC1,0x01,0x10,0x81,0xC2,0xB8,0x15,0xC6,0xC1, + 0x96,0x00,0x50,0xE3,0xBA,0x15,0xD6,0xC1,0x01,0x10,0x81,0xC2,0xBA,0x15,0xC6,0xC1, + 0x19,0x0E,0x53,0xE3,0xBC,0x15,0xD6,0xC1,0x01,0x10,0x81,0xC2,0xBC,0x15,0xC6,0xC1, + 0xCC,0x14,0x9F,0xE5,0xB6,0x10,0xD1,0xE1,0x40,0x00,0x11,0xE3,0xB0,0x18,0xDA,0xE1, + 0x01,0x28,0xE0,0x13,0x81,0x10,0x02,0x10,0x00,0x00,0x53,0xE3,0x03,0x28,0xA0,0xC1, + 0x00,0x20,0xA0,0xD3,0x22,0x28,0xA0,0xC1,0x00,0x00,0x50,0xE3,0x00,0x08,0xA0,0xC1, + 0x00,0x00,0xA0,0xD3,0x20,0x08,0xA0,0xC1,0x01,0x00,0x50,0xE1,0x01,0xC0,0x89,0x82, + 0x01,0x98,0xCC,0x83,0x01,0x00,0x52,0xE1,0x0C,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82, + 0x01,0xC8,0xCC,0x83,0x0C,0xC0,0x8D,0x85,0x81,0x00,0x50,0xE1,0x08,0xC0,0x9D,0x85, + 0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x08,0xC0,0x8D,0x85,0x81,0x00,0x52,0xE1, + 0x04,0x10,0x9D,0x85,0x01,0x10,0x81,0x82,0x01,0x18,0xC1,0x83,0x04,0x10,0x8D,0x85, + 0x10,0x10,0x9D,0xE5,0x00,0x00,0x53,0xE3,0x01,0x00,0x80,0xE0,0x10,0x00,0x8D,0xE5, + 0x00,0x30,0xA0,0xB3,0x01,0x00,0x4B,0xE2,0x00,0x00,0x55,0xE1,0x06,0x00,0x00,0x1A, + 0x00,0x00,0x53,0xE3,0x04,0x00,0x00,0x0A,0x03,0x02,0x63,0xE0,0x00,0x01,0xA0,0xE1, + 0x64,0x10,0xA0,0xE3,0xD9,0xEB,0xFF,0xEB,0x00,0x30,0xA0,0xE1,0x05,0x10,0xA0,0xE1, + 0x04,0x00,0xA0,0xE1,0x2A,0xF8,0xFF,0xEB,0x18,0x14,0x9F,0xE5,0x00,0x00,0x57,0xE3, + 0x80,0x00,0x81,0xE0,0xB0,0x30,0xC0,0xE1,0x00,0x00,0x67,0xD2,0x07,0x00,0xA0,0xC1, + 0x03,0x00,0x50,0xE1,0xB8,0x11,0x9D,0xB5,0x07,0x00,0x83,0xB0,0x01,0x00,0x80,0xB0, + 0xB8,0x01,0x8D,0xB5,0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1,0xF3,0xF7,0xFF,0xEB, + 0xBC,0x11,0x9D,0xE5,0xE0,0x23,0x9F,0xE5,0x08,0x11,0x91,0xE7,0x80,0x00,0x82,0xE0, + 0x02,0x19,0xC1,0xE3,0x01,0x80,0x88,0xE2,0x01,0x40,0x84,0xE2,0xB0,0x10,0xC0,0xE1, + 0xB0,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1,0x7F,0xFF,0xFF,0x3A,0x01,0x50,0x85,0xE2, + 0x0B,0x00,0x55,0xE1,0x7A,0xFF,0xFF,0x3A,0x79,0xFA,0xFF,0xEB,0x90,0x63,0x9F,0xE5, + 0xA8,0x01,0x9D,0xE5,0xBE,0x00,0xC6,0xE1,0xAC,0x01,0x9D,0xE5,0x01,0x00,0x10,0xE3, + 0x0A,0x00,0x00,0x0A,0xB0,0x01,0x9D,0xE5,0xA4,0x21,0x9D,0xE5,0x90,0x0B,0x01,0xE0, + 0x64,0x00,0xA0,0xE3,0x90,0x01,0x01,0xE0,0xB8,0x01,0x9D,0xE5,0x92,0x00,0x00,0xE0, + 0x17,0xEC,0xFF,0xEB,0xA8,0x11,0x9D,0xE5,0x01,0x00,0x50,0xE1,0xBE,0x00,0xC6,0x31, + 0xB0,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3,0x90,0x01,0x07,0xE0,0x00,0x40,0xA0,0xE3, + 0x22,0x00,0x00,0xEA,0x49,0x0F,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x98,0x11,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1,0x09,0xEC,0xFF,0xEB,0x88,0x11,0x9D,0xE5, + 0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1, + 0x82,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1,0x84,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7, + 0x94,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1,0xFC,0xEB,0xFF,0xEB, + 0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x41,0x18,0xA0,0xE1,0x75,0xFA,0xFF,0xEB,0x00,0x00,0x45,0xE0,0x78,0x11,0x9D,0xE5, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x91,0x00,0x00,0xE0,0x84,0x50,0x86,0xE0, + 0x64,0x10,0xA0,0xE3,0x81,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2,0xB0,0x07,0xC5,0xE1, + 0x0B,0x00,0x54,0xE1,0xDA,0xFF,0xFF,0x3A,0x64,0x00,0xA0,0xE3,0x9B,0x00,0x07,0xE0, + 0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA,0xD4,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7, + 0x90,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1,0xE0,0xEB,0xFF,0xEB, + 0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x41,0x18,0xA0,0xE1,0x59,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1,0x34,0x00,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x8C,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1, + 0xD3,0xEB,0xFF,0xEB,0x7C,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x4C,0xFA,0xFF,0xEB,0x00,0x00,0x45,0xE0, + 0x74,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x91,0x00,0x00,0xE0, + 0x84,0x50,0x86,0xE0,0x64,0x10,0xA0,0xE3,0x58,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2, + 0xB8,0x09,0xC5,0xE1,0xB0,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1,0xD9,0xFF,0xFF,0x3A, + 0xB4,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3,0x0D,0x00,0x00,0xDA,0x30,0x00,0x9D,0xE5, + 0x2C,0x10,0x9D,0xE5,0x80,0x00,0x86,0xE0,0x81,0x10,0x86,0xE0,0xB8,0x09,0xD0,0xE1, + 0xB0,0x17,0xD1,0xE1,0x00,0x10,0x81,0xE0,0xB4,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE0, + 0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1,0xB0,0x0C,0xC6,0xE1,0x00,0x00,0xA0,0x43, + 0xB0,0x0C,0xC6,0x41,0xB0,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE2,0x9B,0x00,0x01,0xE0, + 0x10,0x00,0x9D,0xE5,0xAA,0xEB,0xFF,0xEB,0xB6,0x10,0xD6,0xE1,0x0C,0x20,0x9D,0xE5, + 0x40,0x00,0x11,0xE3,0x10,0x00,0x00,0x0A,0x82,0x00,0x59,0xE1,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85, + 0x08,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85, + 0x04,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35, + 0x14,0x00,0x59,0xE3,0x13,0x00,0x00,0x9A,0x10,0x00,0x00,0xEA,0x02,0x00,0x59,0xE1, + 0x08,0x00,0x59,0x83,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85,0x08,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35,0x0A,0x00,0x59,0xE3,0x01,0x00,0x00,0x9A, + 0x01,0x00,0xA0,0xE3,0x14,0x00,0x8D,0xE5,0xC9,0x00,0xD6,0xE5,0x00,0x00,0x50,0xE3, + 0xCA,0x00,0xD6,0xE5,0x03,0x00,0x00,0x0A,0xFA,0x00,0x50,0xE3,0x05,0x00,0x00,0x2A, + 0x01,0x00,0x80,0xE2,0x02,0x00,0x00,0xEA,0x00,0x00,0x50,0xE3,0x01,0x00,0x00,0x0A, + 0x01,0x00,0x40,0xE2,0xCA,0x00,0xC6,0xE5,0x20,0x20,0x8D,0xE2,0x05,0x00,0x92,0xE8, + 0x10,0x00,0x11,0xE3,0x00,0x30,0x82,0xE1,0x18,0x20,0x8D,0xE2,0x05,0x00,0x92,0xE8, + 0x02,0x00,0x00,0xE0,0x00,0x20,0x83,0xE1,0x14,0x00,0x9D,0x15,0x00,0x00,0x50,0x13, + 0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13,0x02,0x00,0x80,0xE1,0x00,0x00,0x50,0xE3, + 0xCA,0x00,0xD6,0x15,0x05,0x00,0x50,0x13,0x02,0x00,0x00,0x8A,0x28,0x00,0x9D,0xE5, + 0x00,0x00,0x50,0xE3,0x07,0x00,0x00,0x0A,0xC4,0x00,0x96,0xE5,0x01,0x00,0x80,0xE2, + 0xC4,0x00,0x86,0xE5,0xC8,0x00,0xD6,0xE5,0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12, + 0xC8,0x00,0xC6,0x15,0x0C,0x00,0x00,0xEA,0xC8,0x00,0xD6,0xE5,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0xC8,0x00,0xC6,0xE5,0xB4,0x18,0xDA,0xE1,0x01,0x00,0x50,0xE1, + 0x05,0x00,0x00,0x1A,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC6,0xE5,0xC4,0x00,0x96,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xC4,0x00,0x86,0xC5,0xCA,0x00,0xD6,0xE5, + 0x0A,0x00,0x50,0xE3,0x05,0x00,0x00,0x2A,0xC4,0x00,0x96,0xE5,0x00,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0xC3,0xC4,0x00,0x86,0xC5,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC6,0xE5, + 0x71,0xDF,0x8D,0xE2,0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x06,0x00,0x20, + 0x04,0x0B,0x00,0x20,0x00,0x02,0x10,0x40,0xC8,0x02,0x00,0x20,0x40,0x00,0x00,0x20, + 0xF0,0xB5,0xC9,0x49,0xC7,0x4F,0xC9,0x88,0xB8,0x7D,0xC8,0x4C,0x00,0x25,0x49,0x06, + 0x8D,0xB0,0x00,0xD4,0xA0,0x7C,0x03,0x90,0xC2,0x48,0x40,0x38,0x42,0x79,0x06,0x00, + 0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38,0xB3,0x7A,0x00,0x7A, + 0xFE,0xF7,0x47,0xFB,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7,0x37,0xFB,0x31,0x00, + 0x20,0x39,0x0A,0x7A,0xC0,0x39,0x00,0x06,0x0C,0x91,0x09,0x79,0x00,0x0E,0xFE,0xF7, + 0x31,0xFB,0x00,0x06,0xBA,0x7D,0xA1,0x7C,0x00,0x0E,0xFE,0xF7,0x2B,0xFB,0x00,0x06, + 0xB3,0x4E,0x00,0x0E,0x02,0x90,0x30,0x7B,0x00,0x28,0x02,0xD0,0xB1,0x48,0x40,0x89, + 0x0A,0xE0,0xAD,0x49,0x78,0x8A,0xC9,0x88,0x49,0x06,0x00,0xD4,0xE0,0x89,0xAE,0x49, + 0xC9,0x8A,0x40,0x18,0x00,0x04,0x00,0x0C,0x00,0x27,0x04,0x90,0x77,0x61,0x30,0x7A, + 0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x8B,0xFA,0x01,0xF0, + 0x79,0xFA,0x01,0x20,0x30,0x62,0xFC,0xF7,0x7D,0xFB,0x9F,0x48,0x9F,0x4A,0x01,0x00, + 0xC0,0x31,0x0A,0x91,0xA0,0x31,0x09,0x91,0x05,0x21,0xC9,0x01,0xE0,0x3A,0x53,0x18, + 0x80,0x32,0x07,0xAC,0x0C,0xC4,0x02,0x9A,0xD2,0x1C,0x06,0x92,0x4A,0x00,0x84,0x18, + 0x40,0x18,0x05,0x90,0x11,0xE1,0x30,0x7A,0x00,0x28,0x04,0xD0,0x30,0x6B,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0x67,0xFA,0xFF,0x20,0x81,0x30,0xFB,0xF7,0x37,0xF9,0x03,0x20, + 0x01,0xF0,0xA0,0xF9,0x00,0xF0,0x68,0xF9,0x01,0x20,0x40,0x05,0xFC,0xF7,0xCA,0xFD, + 0xFF,0xF7,0x9A,0xFB,0x00,0x20,0xFC,0xF7,0xC5,0xFD,0x87,0x48,0xC0,0x88,0x01,0x06, + 0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20, + 0x01,0xF0,0x64,0xF8,0xFC,0xF7,0xFA,0xFD,0x84,0x48,0x04,0x99,0x80,0x8B,0x40,0x18, + 0x7D,0x49,0x89,0x89,0x88,0x42,0x10,0xD9,0x09,0x98,0x40,0x78,0x00,0x28,0x0C,0xD1, + 0x79,0x48,0xFF,0x21,0xC0,0x88,0x19,0x31,0x08,0x42,0x06,0xD1,0x03,0x98,0x6D,0x1C, + 0x85,0x42,0x03,0xDD,0xFC,0xF7,0xEA,0xFD,0x00,0xE0,0x00,0x25,0x00,0xF0,0x32,0xFE, + 0x00,0xF0,0xB4,0xFD,0x00,0xF0,0x08,0xFE,0x08,0x99,0x0A,0x98,0x49,0x88,0x40,0x68, + 0x88,0x42,0x0A,0xDB,0x09,0x98,0x40,0x78,0x00,0x28,0x04,0xD1,0x6A,0x48,0x46,0x21, + 0xC0,0x88,0x08,0x42,0x01,0xD0,0x01,0x20,0x70,0x70,0xFC,0xF7,0x9D,0xFD,0xFD,0xF7, + 0x51,0xFF,0x00,0x28,0x08,0xD0,0x77,0x61,0x05,0x98,0x80,0x7B,0xC8,0x28,0x10,0xD2, + 0x05,0x99,0x40,0x1C,0x88,0x73,0x0C,0xE0,0x70,0x69,0x40,0x1C,0x70,0x61,0x70,0x69, + 0x01,0x28,0x01,0xD1,0x62,0x48,0x07,0x73,0x70,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7, + 0xF1,0xFA,0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x60,0x68,0xFF,0x21, + 0xFF,0x31,0x88,0x42,0x03,0xDA,0x40,0x1C,0x60,0x60,0x00,0xE0,0x67,0x60,0x08,0x99, + 0x20,0x68,0x49,0x89,0x88,0x42,0x09,0xDD,0x60,0x68,0xFF,0x21,0xF5,0x31,0x88,0x42, + 0x04,0xDD,0x01,0x20,0x70,0x70,0x27,0x60,0x67,0x60,0x02,0xE0,0x70,0x78,0x00,0x28, + 0x02,0xD0,0xFC,0xF7,0xE1,0xFA,0x12,0xE0,0x4E,0x48,0x41,0x68,0x09,0x07,0x07,0xD5, + 0xC1,0x68,0x00,0x29,0x04,0xD0,0xC0,0x68,0x01,0x21,0x49,0x07,0xC8,0x63,0x06,0xE0, + 0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0xD7,0xFB,0x00,0xF0,0x1F,0xF9,0xFC,0xF7, + 0xFB,0xFD,0x70,0x78,0x00,0x28,0x0B,0xD0,0x3C,0x48,0x01,0x21,0xE0,0x38,0xC0,0x7F, + 0x40,0x08,0x01,0xF0,0x27,0xF8,0x3A,0x48,0x47,0x70,0x0A,0x98,0x47,0x60,0x5A,0xE0, + 0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B,0x00,0x28,0x01,0xD1,0x00,0xF0, + 0xBF,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28,0x4C,0xD1,0x07,0x98,0x00,0x7A, + 0x00,0x28,0x01,0xD0,0xFF,0xF7,0x2A,0xFA,0x00,0xF0,0x9A,0xF8,0x03,0x20,0x01,0xF0, + 0xB3,0xF8,0xF0,0x62,0x03,0x20,0x01,0xF0,0xE1,0xF8,0xFF,0x20,0x81,0x30,0xFB,0xF7, + 0x5D,0xF8,0x2D,0x48,0x00,0x78,0x00,0x28,0x2F,0xD1,0xFC,0xF7,0xA3,0xFE,0x00,0x28, + 0x2B,0xD0,0xB0,0x6A,0x00,0x28,0x0B,0x90,0x27,0xD0,0xF0,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x26,0x49,0xFA,0xF7,0x14,0xFD,0x0B,0x99,0x08,0x1A,0x32,0x28,0x1C,0xDD, + 0x01,0xF0,0x86,0xF9,0x01,0xF0,0x8A,0xF9,0xB0,0x79,0x00,0x28,0x0D,0xD0,0x00,0xF0, + 0x4D,0xF8,0x00,0xF0,0x50,0xF8,0x00,0xF0,0x58,0xF8,0x1D,0x4E,0x01,0x20,0x70,0x60, + 0xFB,0xF7,0x44,0xF8,0x1B,0x48,0x70,0x60,0x03,0xE0,0x1B,0x48,0x01,0x78,0x00,0x29, + 0xFC,0xD0,0x01,0xF0,0x7A,0xF9,0x18,0x48,0x07,0x70,0x0D,0x4E,0x70,0x69,0x06,0x99, + 0x88,0x42,0x00,0xD2,0xE7,0xE6,0x0C,0x98,0x0B,0x49,0x40,0x78,0xA0,0x39,0x48,0x73, + 0x07,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x01,0xF0,0x44,0xF9,0x0D,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0xE0,0x78,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20, + 0x90,0x08,0x00,0x20,0x00,0x40,0x00,0x30,0xAD,0x0B,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x01,0x20,0x80,0x07, + 0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21, + 0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20,0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22, + 0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68, + 0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47,0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A, + 0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43,0x01,0x63,0x70,0x47,0x00,0x78,0x00,0x00, + 0x10,0xB5,0xFC,0xF7,0x79,0xFC,0xFA,0xF7,0xBF,0xFC,0x03,0x20,0x40,0x03,0xFA,0xF7, + 0xC5,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x03,0x20,0x10,0xB5,0x40,0x03,0xFA,0xF7, + 0xC5,0xFF,0xFA,0xF7,0xBB,0xFC,0xFC,0xF7,0x6F,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0xB5,0x00,0xF0,0xC5,0xFB,0x05,0x49,0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42, + 0x01,0xD0,0xFA,0xF7,0xE3,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xFE,0xB5,0x16,0x48,0x17,0x4E,0x00,0x78,0x00,0x25,0x01,0x90,0x14,0x48,0x00,0x78, + 0x00,0x90,0x1C,0xE0,0x14,0x49,0x68,0x00,0x00,0x24,0x47,0x18,0x60,0x37,0x12,0xE0, + 0x29,0x00,0x20,0x00,0xFD,0xF7,0x2C,0xFC,0x0F,0x4B,0x62,0x00,0xD3,0x18,0x98,0x22, + 0x9A,0x5E,0x10,0x23,0xFB,0x5E,0x40,0x00,0x31,0x5E,0xD2,0x18,0x89,0x1A,0x00,0xD5, + 0x00,0x21,0x64,0x1C,0x31,0x52,0x01,0x98,0x84,0x42,0xE9,0xD3,0x6D,0x1C,0x00,0x98, + 0x85,0x42,0xDF,0xD3,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0xF0,0x05,0x00,0x20,0xF8,0xB5,0x66,0x4F, + 0x00,0x26,0x78,0x7A,0xC0,0x07,0x17,0xD0,0x64,0x4C,0x20,0x89,0x00,0x28,0x0E,0xD0, + 0x63,0x49,0x88,0x42,0x0B,0xD0,0x1E,0x21,0x48,0x43,0x64,0x21,0xFA,0xF7,0x28,0xFC, + 0x79,0x8A,0x46,0x18,0x4B,0x20,0xC0,0x00,0x86,0x42,0x00,0xD9,0x06,0x00,0x5D,0x48, + 0x40,0x7D,0x00,0x28,0x00,0xD0,0xA6,0x89,0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D, + 0x7E,0xD0,0x59,0x48,0x00,0x21,0x01,0x70,0x02,0x20,0x00,0xF0,0xC7,0xFF,0x57,0x48, + 0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x0C,0xFC,0x01,0x00,0x02,0x20,0x00,0xF0,0xAA,0xFF, + 0x01,0x2D,0x0B,0xD0,0x02,0x2D,0x08,0xD1,0x60,0x68,0x00,0x02,0x00,0x0E,0x01,0x28, + 0x03,0xD1,0x60,0x68,0x00,0x06,0x00,0xD1,0x00,0xE0,0x6D,0x1C,0x78,0x7A,0x00,0x28, + 0x08,0xD0,0x60,0x68,0x4A,0x49,0x81,0x43,0x04,0xD0,0x61,0x68,0x49,0x48,0x88,0x43, + 0x00,0xD0,0x6D,0x1C,0xF8,0x79,0x00,0x28,0x04,0xD1,0x47,0x48,0x41,0x69,0x02,0x15, + 0x11,0x43,0x41,0x61,0x45,0x48,0x01,0x68,0x45,0x48,0xC1,0x61,0x02,0x24,0x20,0x00, + 0x00,0xF0,0x88,0xFF,0x43,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x03,0x04, + 0x35,0x48,0x36,0x4A,0x41,0x7A,0x3E,0x48,0x97,0x89,0x21,0xE0,0x42,0x69,0x52,0x06, + 0x0E,0xD4,0x00,0x29,0x01,0xD0,0xAC,0x42,0x04,0xD2,0xA2,0x00,0xD2,0x18,0x12,0x68, + 0xC2,0x61,0x04,0xE0,0xCA,0x07,0x01,0xD0,0xC6,0x61,0x00,0xE0,0xC7,0x61,0x64,0x1C, + 0x2D,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0,0xFD,0xF7,0xB6,0xFC,0x26,0x48,0x01,0x7A, + 0x00,0x29,0x07,0xD0,0x00,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x1B,0xF8,0x01,0xE0, + 0xAC,0x42,0xDB,0xD9,0x02,0x20,0x00,0xF0,0x61,0xFF,0x23,0x4D,0x28,0x78,0x00,0x28, + 0x27,0xD1,0xFD,0xF7,0xC7,0xFB,0x00,0x28,0x23,0xD0,0x20,0x48,0x0A,0x21,0x00,0x6B, + 0xFA,0xF7,0x9E,0xFB,0x01,0x00,0x02,0x20,0x00,0xF0,0x3C,0xFF,0x02,0x20,0x00,0xE0, + 0x26,0xE0,0x00,0xF0,0x3F,0xFF,0x14,0x4C,0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0, + 0xFD,0xF7,0x8A,0xFC,0x20,0x7A,0x00,0x28,0x04,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C, + 0x00,0xF0,0xF0,0xFF,0xFD,0xF7,0xA6,0xFB,0x00,0x28,0xEE,0xD1,0x02,0x20,0x00,0xF0, + 0x35,0xFF,0x14,0x49,0xC8,0x68,0x01,0x22,0x10,0x43,0xC8,0x60,0x00,0xF0,0x28,0xF8, + 0x05,0x48,0xC0,0x79,0x00,0x28,0x03,0xD1,0x01,0x20,0x80,0x02,0xFA,0xF7,0xA6,0xFE, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xF8,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xFF,0x0F,0x00,0x00,0x30,0x0A,0x00,0x20,0xAD,0x0B,0x00,0x20,0x00,0x78,0x00,0x00, + 0x00,0x00,0x4E,0x1D,0x00,0x80,0x4E,0x1D,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7, + 0x85,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x18,0x70,0x47, + 0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18, + 0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07, + 0x18,0x68,0x13,0x4A,0x90,0x72,0x90,0x7A,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0, + 0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21, + 0x0C,0x30,0xFF,0xF7,0x05,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25, + 0x08,0x4C,0xAD,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00, + 0x3F,0x19,0x7F,0x19,0x40,0x1C,0xFE,0x60,0x96,0x7A,0x86,0x42,0xF3,0xD8,0xEA,0xE7, + 0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x70,0xB5,0x1E,0x49,0x1C,0x4C,0x0D,0x00, + 0x20,0x78,0xA1,0x22,0xFF,0x35,0x92,0x00,0xBF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0, + 0x5A,0x22,0x21,0x1D,0x28,0x00,0xFE,0xF7,0xBF,0xFF,0x17,0x49,0x09,0x22,0x30,0x00, + 0xFE,0xF7,0xBA,0xFF,0x20,0x78,0x60,0x70,0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22, + 0x00,0x21,0x30,0x00,0xFE,0xF7,0xCC,0xFF,0x5A,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7, + 0xC7,0xFF,0x0D,0x48,0x5A,0x22,0x00,0x21,0x63,0x38,0xFE,0xF7,0xC1,0xFF,0x0A,0x48, + 0x09,0x22,0x00,0x21,0x09,0x38,0xFE,0xF7,0xBB,0xFF,0x00,0x20,0x05,0x49,0x60,0x70, + 0xA0,0x70,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x04,0x49,0x88,0x75,0xDB,0xE7, + 0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20,0x6B,0x08,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xF3,0xB5,0x93,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x92,0x48,0x00,0x78,0x00,0x28, + 0x91,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8F,0x4A,0x1A,0x26, + 0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E, + 0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F, + 0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91, + 0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7D,0x49,0x20,0x39,0x8A,0x5E, + 0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22, + 0x41,0x5E,0x82,0x5E,0x11,0x98,0x78,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60, + 0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E, + 0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0xF7,0xFE,0x20,0x8C,0x64,0x21,0x0A,0x90, + 0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38, + 0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28, + 0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x61,0x48,0x01,0x78,0x61,0x48,0x00,0x78, + 0x08,0x90,0x61,0x48,0x80,0x7E,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E, + 0x09,0x06,0x09,0x0E,0x04,0xE0,0x08,0x98,0x40,0x1E,0x00,0x06,0x00,0x0E,0x08,0x90, + 0x20,0x00,0xFA,0xF7,0x63,0xF9,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99, + 0x28,0x00,0xFA,0xF7,0x5B,0xF9,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90, + 0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98, + 0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C, + 0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42, + 0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A, + 0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xFA,0xF7,0x30,0xF9,0xC7,0x19,0x04,0x98, + 0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0, + 0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7,0x21,0xF9,0x07,0x99,0xC9,0x07,0x0A,0xD0, + 0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99, + 0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B, + 0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00, + 0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A, + 0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B, + 0x89,0x1A,0xFA,0xF7,0xF3,0xF8,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00, + 0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21, + 0xFA,0xF7,0xE4,0xF8,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18, + 0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48, + 0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C, + 0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8, + 0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x28,0xFE,0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xA0,0x78,0x00,0x00,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0xFE,0xB5,0x66,0x4D, + 0x64,0x48,0x00,0x26,0x29,0x00,0xFF,0x31,0x00,0x96,0x42,0x78,0x61,0x31,0x08,0x78, + 0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0,0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19, + 0x38,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0xEB,0xFB,0x00,0x28,0x17,0xD0,0x5B,0x48, + 0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42,0x14,0xD3,0xA9,0x19,0x13,0x22,0x00,0x90, + 0xFF,0x20,0x92,0x01,0x65,0x30,0x89,0x18,0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x70, + 0x76,0x1C,0x65,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x29,0xFA,0x64,0x1C, + 0x09,0x2C,0xDA,0xDB,0x8F,0xE0,0x49,0x78,0x00,0x29,0x01,0xD1,0x00,0x28,0xF9,0xD0, + 0x15,0x20,0x40,0x01,0x00,0x24,0x2E,0x18,0x13,0x27,0xBF,0x01,0x28,0x19,0xC0,0x19, + 0x40,0x78,0x00,0x28,0x3F,0xD0,0x13,0x21,0x28,0x18,0x49,0x01,0x41,0x18,0xC9,0x7E, + 0x00,0x29,0x02,0xD0,0x32,0x7B,0x00,0x2A,0x14,0xD0,0x05,0x21,0xC9,0x01,0x40,0x18, + 0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91,0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32, + 0xBF,0x32,0x02,0x20,0x03,0x23,0x69,0x46,0x00,0xF0,0xFA,0xF9,0x20,0x00,0x14,0x2C, + 0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43,0x48,0x19,0x02,0x90,0xFF,0x30,0x6B,0x30, + 0xFD,0xF7,0x96,0xFB,0x00,0x28,0x13,0xD0,0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32, + 0x00,0x90,0x65,0x32,0x03,0x20,0x02,0x23,0x69,0x46,0x00,0xF0,0xE1,0xF9,0x07,0xE0, + 0x29,0x18,0xC9,0x19,0x8A,0x78,0x40,0x1C,0x4A,0x70,0x08,0x28,0xF8,0xDB,0x64,0x1E, + 0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24,0x23,0x49,0x13,0x22,0x08,0x19,0x52,0x01, + 0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92,0x00,0x28,0x31,0xD0,0x32,0x7B,0x00,0x2A, + 0x2E,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18,0x28,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7, + 0x67,0xFB,0x00,0x28,0x24,0xD0,0x19,0x48,0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42, + 0x21,0xD3,0x15,0x4A,0x00,0x20,0x11,0x18,0xC9,0x19,0x49,0x78,0xA1,0x42,0x0B,0xD0, + 0x00,0x29,0x06,0xD1,0xFF,0x21,0x65,0x31,0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x70, + 0x05,0xE0,0x40,0x1C,0x08,0x28,0xEE,0xDB,0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00, + 0xFF,0x32,0x00,0x93,0x65,0x32,0x03,0x20,0x01,0x23,0x69,0x46,0x00,0xF0,0x98,0xF9, + 0x64,0x1C,0x09,0x2C,0xC0,0xDB,0x00,0x98,0x00,0xF0,0x84,0xFC,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xFE,0xB5,0x51,0x48,0x36,0x25,0x45,0x5F,0x51,0x48,0x50,0x4F,0xC4,0x78,0x00,0x26, + 0x02,0x94,0x00,0x79,0x84,0x46,0x4C,0x48,0x80,0x30,0x82,0x7D,0x86,0x46,0x4D,0x48, + 0x81,0x7E,0xC8,0x07,0x0A,0xD0,0x88,0x07,0x03,0xD5,0x64,0x1E,0x24,0x06,0x24,0x0E, + 0x04,0xE0,0x60,0x46,0x40,0x1E,0x00,0x06,0x00,0x0E,0x84,0x46,0x00,0x21,0x27,0xE0, + 0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2,0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E, + 0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A,0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42, + 0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x02,0x9B, + 0x4B,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58,0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD, + 0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00,0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C, + 0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46,0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33, + 0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06,0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19, + 0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04,0x12,0x14,0x26,0x48,0x80,0x30,0xC1,0x6A, + 0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B,0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0, + 0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x62,0x1E,0x49,0x80,0x31,0x09,0x6B,0x95,0x42, + 0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD, + 0x49,0x1E,0x01,0x63,0x74,0x46,0xA4,0x8B,0xC5,0x6A,0x01,0x22,0x11,0x00,0xA5,0x42, + 0x00,0xDC,0x00,0x21,0x9B,0x88,0x00,0x6B,0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20, + 0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29,0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0, + 0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70,0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20, + 0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B,0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0, + 0x80,0x20,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40, + 0xF8,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xF8,0xB5,0x22,0x48, + 0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D,0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F, + 0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29,0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69, + 0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61,0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60, + 0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0,0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69, + 0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61,0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60, + 0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00,0xF9,0xF7, + 0xD7,0xFF,0xB0,0x62,0x30,0x7B,0x00,0x28,0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48, + 0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x39,0x00,0xF9,0xF7,0xC8,0xFF, + 0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00,0xF8,0x0A,0x00,0x20,0x80,0x79,0x00,0x00, + 0x81,0x11,0x01,0x00,0x10,0x00,0x10,0x00,0x0E,0x48,0x0F,0x4A,0x43,0x78,0x0F,0x49, + 0xD0,0x1D,0xC9,0x88,0xFF,0x32,0xF9,0x30,0xC1,0x32,0x02,0x2B,0x04,0xD9,0x12,0x6A, + 0x49,0x06,0x0C,0xD4,0xC2,0x69,0x0A,0xE0,0x02,0x2B,0x04,0xD1,0xD2,0x69,0x49,0x06, + 0x05,0xD4,0x82,0x69,0x03,0xE0,0x92,0x69,0x49,0x06,0x00,0xD4,0x42,0x69,0x04,0x48, + 0x42,0x62,0x70,0x47,0x50,0x07,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0xC0,0x90,0x00,0x40,0xF0,0xB4,0x0B,0x48,0x0D,0x4B,0xC0,0x88,0x0A,0x49,0x0C,0x4F, + 0x42,0x06,0x0A,0x48,0x01,0x24,0xE4,0x03,0x32,0x25,0x5E,0x00,0x32,0x3F,0x01,0x61, + 0x43,0x61,0x84,0x61,0xC5,0x61,0x04,0x62,0x46,0x62,0x84,0x62,0xC7,0x62,0xF0,0xBC, + 0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x80,0x00,0x03,0x40,0xA1,0x00,0x40, + 0x64,0x40,0x00,0x00,0x70,0xB5,0x01,0x25,0x6D,0x03,0x28,0x00,0xFA,0xF7,0xA6,0xFA, + 0x16,0x48,0x04,0x68,0x28,0x00,0xFA,0xF7,0x99,0xFA,0x15,0x4D,0xE2,0x06,0xD2,0x0E, + 0xE0,0x04,0x14,0x49,0xC0,0x0E,0x2A,0x71,0xE8,0x70,0x0B,0x7D,0x12,0x48,0x83,0x76, + 0x4B,0x7D,0xC3,0x76,0x83,0x7E,0x11,0x48,0xDC,0x07,0x0A,0xD0,0x9B,0x07,0x04,0xD5, + 0xEA,0x78,0x52,0x1E,0x02,0x72,0x00,0x22,0x02,0xE0,0x52,0x1E,0x02,0x72,0x01,0x22, + 0x6A,0x71,0x8A,0x7D,0x42,0x72,0xCA,0x7D,0x82,0x72,0x0A,0x7E,0xC2,0x72,0x4A,0x7E, + 0x02,0x73,0x89,0x7E,0x41,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x90,0x00,0x40, + 0xF8,0x0A,0x00,0x20,0x00,0x78,0x00,0x00,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20, + 0xF8,0xB5,0x05,0x00,0x0E,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0xFA,0xF7,0x62,0xFF, + 0x00,0x28,0x05,0xD0,0x30,0x68,0x40,0x1E,0x30,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0x2D,0x48,0x80,0x7E,0xC0,0x07,0x26,0xD0,0xE0,0x79,0x05,0x28,0x21,0xD0,0x09,0x28, + 0x21,0xD1,0x2A,0x49,0x6D,0x08,0x6D,0x00,0x23,0x78,0x01,0x20,0x8C,0x46,0x13,0xE0, + 0x0A,0x22,0x01,0x00,0x51,0x43,0x26,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32,0xA1,0x32, + 0x97,0x7F,0xBB,0x42,0x07,0xD1,0xFF,0x31,0xC1,0x31,0x0F,0x88,0x67,0x80,0xD2,0x7F, + 0x62,0x70,0x49,0x88,0xA1,0x80,0x40,0x1C,0x61,0x46,0x49,0x78,0x81,0x42,0xE7,0xDA, + 0x01,0xE0,0x01,0x20,0x05,0x43,0x0F,0x20,0xA9,0x07,0x80,0x06,0x81,0x43,0x20,0x78, + 0x3F,0x22,0x92,0x02,0x00,0x07,0x80,0x08,0x01,0x43,0x16,0x48,0x01,0x40,0x60,0x88, + 0x80,0x05,0x80,0x09,0x01,0x43,0x60,0x78,0x91,0x43,0x80,0x06,0x00,0x0C,0x01,0x43, + 0x08,0x04,0x80,0x0E,0x0A,0x28,0x09,0xD2,0x40,0x1C,0x0A,0x23,0x58,0x43,0x3F,0x28, + 0x00,0xDD,0x3F,0x20,0x80,0x06,0x91,0x43,0x00,0x0C,0x01,0x43,0x88,0x0A,0xA1,0x88, + 0x80,0x02,0x01,0x22,0x89,0x05,0x89,0x0D,0x08,0x43,0x31,0x68,0x52,0x07,0x89,0x00, + 0x89,0x18,0x48,0x60,0xA1,0xE7,0x00,0x00,0x30,0x0A,0x00,0x20,0x50,0x07,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28, + 0x10,0xD0,0x00,0x09,0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28, + 0x08,0xD1,0x4A,0x72,0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28, + 0x06,0xD1,0x0B,0x73,0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7, + 0x0A,0x73,0xF7,0xE7,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00,0xF8,0xB5,0x06,0x9F, + 0x07,0x9D,0x0C,0x00,0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7, + 0xB5,0xFD,0x38,0x80,0x21,0x00,0x30,0x00,0xF9,0xF7,0xB0,0xFD,0x28,0x80,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42, + 0x04,0xDA,0x65,0x80,0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB, + 0x60,0x80,0x07,0x98,0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91, + 0xF9,0xF7,0x94,0xFD,0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43, + 0xF9,0xF7,0x8C,0xFD,0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79, + 0x00,0x25,0x22,0x07,0x93,0x08,0xCA,0x79,0x52,0x07,0x0B,0xD5,0x10,0x4E,0xB2,0x89, + 0x00,0x2A,0x07,0xD0,0x9B,0x0A,0x97,0x05,0x9B,0x02,0xBF,0x0D,0x3B,0x43,0x64,0x00, + 0xA4,0x19,0xE2,0x81,0x3F,0x22,0x92,0x02,0x93,0x43,0xCA,0x79,0x80,0x00,0x92,0x06, + 0x12,0x0C,0x13,0x43,0x01,0x22,0x52,0x07,0x80,0x18,0x43,0x60,0xC8,0x79,0xC0,0x06, + 0x80,0x0F,0x03,0xD0,0x03,0x48,0x01,0x21,0xC1,0x75,0x05,0x76,0xF0,0xBC,0x70,0x47, + 0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4D,0x0C,0x4C,0x2D,0x78, + 0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A,0x09,0x0E,0x82,0x18, + 0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2,0x53,0x1E,0xFF,0x2B, + 0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x10,0xB4,0x05,0x4C,0x03,0x4B,0x24,0x78, + 0x60,0x43,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78,0x58,0x43,0x40,0x18, + 0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20, + 0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02, + 0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x15,0x4A,0x15,0x4B,0x52,0x7D,0x13,0x4F,0x00,0x21, + 0x16,0x02,0x16,0x43,0x1A,0x78,0x10,0x4D,0x42,0x43,0x20,0x3F,0x12,0xE0,0xBB,0x7D, + 0x8B,0x42,0x0D,0xD0,0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0, + 0x7B,0x7E,0x8B,0x42,0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52, + 0x52,0x1C,0x49,0x1C,0x06,0x4B,0x04,0x00,0x1B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42, + 0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x14,0x4A,0x13,0x4B,0x52,0x7D,0x00,0x21,0x11,0x4C, + 0x15,0x02,0x15,0x43,0x11,0x4E,0x20,0x3B,0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0, + 0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42, + 0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52,0x32,0x78,0x80,0x18, + 0x49,0x1C,0x07,0x4A,0x37,0x78,0x12,0x78,0x7A,0x43,0x82,0x42,0xE5,0xD8,0xF0,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1, + 0x80,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xF8,0xB5,0x03,0x00, + 0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01,0x0D,0x18,0xC0,0x31, + 0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68,0x00,0xF0,0x0C,0xFA, + 0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62,0x50,0x6B,0x60,0x62, + 0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62,0x04,0x20,0xE0,0x62, + 0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69,0x20,0x62,0xD0,0x6B, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x26,0x62, + 0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7,0x89,0x69,0x21,0x62, + 0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40,0x00,0x78,0x00,0x00, + 0x07,0x4A,0x10,0xB5,0xD1,0x88,0x40,0x23,0x00,0x28,0x01,0xD0,0x19,0x43,0x00,0xE0, + 0x99,0x43,0xD1,0x80,0xFF,0xF7,0x22,0xFD,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xFE,0xB5,0x41,0x4C,0x05,0x00,0x27,0x6A,0x0E,0x00,0x60,0x6A, + 0x02,0x90,0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20,0xFF,0xF7,0x9E,0xFF, + 0x3B,0x48,0x20,0x62,0x22,0x20,0x60,0x62,0x07,0x20,0x40,0x02,0x60,0x63,0x02,0x20, + 0xE0,0x62,0x00,0x20,0xFB,0xF7,0xE6,0xFC,0x36,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0, + 0xFE,0xF7,0xFC,0xF9,0xFB,0xF7,0x2A,0xFD,0x2C,0x00,0x46,0xE0,0x68,0x1E,0x84,0x42, + 0x01,0xD1,0xFB,0xF7,0x4D,0xFD,0xFB,0xF7,0xEF,0xFC,0xFB,0xF7,0x9D,0xFD,0x00,0x2E, + 0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0xF3,0xFC,0xA0,0x42,0x03,0xD8,0x01,0x22, + 0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21,0xF9,0xF7,0xE8,0xFC, + 0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0,0x68,0x00,0x05,0x21, + 0xF9,0xF7,0xDE,0xFC,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x02,0x20,0x0C,0xE0, + 0x05,0x21,0x28,0x00,0xF9,0xF7,0xD4,0xFC,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7,0x73,0xFA,0x0C,0xE0, + 0x68,0x00,0x03,0x21,0xF9,0xF7,0xC4,0xFC,0xA0,0x42,0xDB,0xD9,0x03,0x21,0x28,0x00, + 0xF9,0xF7,0xBE,0xFC,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E,0xB6,0xD2,0x0E,0x48, + 0x44,0x88,0x03,0xE0,0xFB,0xF7,0xA8,0xFC,0xFB,0xF7,0x56,0xFD,0x64,0x1E,0xF9,0xD2, + 0xFB,0xF7,0xCC,0xFC,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62,0x01,0x99,0x41,0x63, + 0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x80,0x90,0x00,0x40, + 0x01,0x02,0x00,0x00,0x80,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00,0x30,0xB4,0x0D,0x4D, + 0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07,0x03,0xD5,0x2C,0x8C, + 0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5,0x6C,0x8C,0xE3,0x1A, + 0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60,0x0A,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x02,0x49,0x00,0x03,0x40,0x18,0xC0,0x68, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47, + 0xAD,0x0B,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C,0x28,0x18,0x02,0x60, + 0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32, + 0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48, + 0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60,0x70,0x47,0x00,0x00, + 0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2,0x08,0x00,0x01,0x22, + 0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07,0x04,0xD0,0x89,0x00, + 0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08,0x51,0x60,0x07,0xE0, + 0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D,0x19,0x43,0xF5,0xE7, + 0x10,0x60,0x70,0x47,0x00,0x78,0x00,0x00,0xF8,0xB5,0x17,0x4B,0x00,0x24,0x98,0x7A, + 0x00,0x28,0x25,0xD0,0x00,0x20,0x13,0x26,0x14,0x4D,0xB6,0x01,0x12,0xE0,0x81,0x00, + 0x49,0x19,0x89,0x19,0xCA,0x68,0x97,0x0F,0xFF,0x07,0x0A,0xD0,0x92,0x00,0x01,0x27, + 0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C,0xCA,0x60,0xA1,0x00,0xBF,0x08,0xC9,0x19, + 0x4A,0x60,0x40,0x1C,0x99,0x7A,0x81,0x42,0xE9,0xDC,0x07,0x48,0x09,0x22,0x00,0x21, + 0x40,0x1C,0xFE,0xF7,0xDD,0xF8,0x20,0x00,0xFF,0xF7,0xB4,0xFF,0xFC,0xF7,0xF2,0xFC, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C,0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7, + 0xF7,0xFB,0x05,0x4A,0x05,0x49,0x20,0x00,0x00,0x23,0xF9,0xF7,0xF9,0xFB,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20, + 0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22,0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00, + 0xF9,0xF7,0xDE,0xFB,0x40,0x22,0x29,0x00,0x20,0x00,0x00,0x23,0xF9,0xF7,0xE0,0xFB, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xC0,0x75,0x00,0x00,0x02,0x4B,0x58,0x60, + 0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5, + 0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7,0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68,0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47, + 0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22,0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20,0x08,0x70,0x70,0x47,0xAC,0x0B,0x00,0x20, + 0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07,0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07, + 0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60,0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68, + 0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47,0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68, + 0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0,0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60, + 0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60,0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60, + 0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00,0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5, + 0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37,0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0, + 0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF9,0xF7,0x73,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0x00,0x00,0x00,0x01,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x01,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00, + 0x89,0x08,0x49,0x1E,0xC9,0x04,0x01,0x22,0xC9,0x08,0xD2,0x07,0x89,0x18,0x40,0x04, + 0x40,0x0C,0x01,0x43,0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B, + 0x70,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x30,0x0B,0x30,0x04,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xF3,0xFF,0x0F,0x00,0xF1,0xFF,0x0F,0x01,0xE5,0xFF,0x0F,0x02,0xEC,0xFF,0x0F,0x03, + 0xCE,0xFF,0x0F,0x04,0xDE,0xEF,0x0F,0x05,0x9F,0xEF,0x0F,0x06,0xBF,0xCF,0x0F,0x07, + 0x3F,0xDF,0x0F,0x08,0x7F,0x9F,0x0F,0x09,0x7F,0xBE,0x0F,0x0A,0xFF,0x3E,0x0F,0x0B, + 0xFF,0x7C,0x0F,0x0C,0xFF,0x7D,0x0E,0x0D,0xFF,0xFD,0x06,0x0E,0xFF,0xFF,0x04,0x0F, + 0xFF,0xFF,0x01,0x10,0xFF,0xFB,0x09,0x11,0xFF,0xFB,0x0B,0x52,0x00,0x00,0x00,0x13, + 0x08,0x00,0x20,0x26,0x06,0x00,0x30,0x24,0x18,0x00,0x10,0x22,0x03,0x00,0x40,0x20, + 0x30,0x00,0x00,0x1E,0x01,0x10,0x50,0x1C,0x60,0x00,0xC0,0x12,0x00,0x30,0x60,0x10, + 0xC0,0x00,0xD0,0x0E,0x00,0x60,0x70,0x0C,0x80,0x01,0xE0,0x0A,0x00,0xC0,0x80,0x08, + 0x00,0x03,0xF0,0x00,0x00,0x80,0x91,0x00,0x00,0x02,0x08,0x01,0x00,0x00,0x33,0x01, + 0x00,0x00,0x1C,0x01,0x00,0x04,0x22,0x01,0x00,0x00,0xA4,0x00,0x00,0x00,0x00,0x00, + 0xF0,0xC3,0x0F,0x00,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x15,0x15,0x30,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x2B,0x2B,0x2B,0x28,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, + 0x30,0x30,0x30,0x30,0x2B,0x2B,0x2B,0x28,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B,0x2B, + 0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x26,0x26,0x26,0x26, + 0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24, + 0x24,0x24,0x24,0x24,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x12,0x12,0x12,0x12, + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x30,0x30,0x16,0x30,0x30,0x30,0x30,0x30, + 0x30,0x10,0x30,0x30,0x1D,0x1D,0x1D,0x1D,0x1D,0x1D,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x04,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x09,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0xE0,0x01,0x20,0x03,0xE8,0x03,0x00,0x00,0x74,0x27,0x00,0x00,0x3C,0x28,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0xD0,0x07,0xD0,0x07,0x00,0x00,0x04,0xC8,0xB5,0xB5, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x7A,0x00,0x01,0x00,0x04,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x04,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0x2C,0x01, + 0x28,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x1E,0x00,0x46,0x00,0x32,0x00,0x05,0x00, + 0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x90,0x01,0x90,0x01,0x58,0x02, + 0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x32,0x32,0x96,0x32,0x40,0x64, + 0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x5A,0x00,0x0A,0x3C,0x00,0x05,0x14,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x50,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x41,0x00,0x01,0x00, + 0x0A,0x0A,0xA8,0x00,0x10,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00,0x5A,0x00,0x82,0x00, + 0x99,0x19,0x90,0x01,0x32,0x00,0x1D,0x00,0x64,0x32,0x64,0x32,0x19,0x00,0x4B,0x00, + 0x32,0x00,0x05,0x00,0x64,0x00,0x05,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0xF4,0x01, + 0x8A,0x02,0x8A,0x02,0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x32,0x32, + 0x96,0x32,0x40,0x64,0x64,0x64,0xFF,0x00,0x00,0x00,0xC2,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x5A,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00, + 0x41,0xF2,0x00,0x00,0x08,0x08,0xA8,0x00,0x20,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x19,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0xC8,0x00,0x33,0x01,0x00,0x00, + 0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x14,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x41,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x47,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x13,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x00,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x80,0x0F,0xA0,0x8F,0x01,0x00,0x00,0x00,0xFF,0x0F,0xC8,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x41,0x02,0x01,0x00, + 0x10,0x00,0x10,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x08,0x10,0x88,0x00, + 0x20,0x9F,0x20,0x3F,0x1E,0x0A,0x64,0x00,0x10,0x10,0x08,0x84,0x00,0x00,0xAC,0x0D, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x08,0x20, + 0x51,0x30,0x10,0x00,0x11,0x90,0x01,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x10,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x6F,0x69,0x06,0x00,0x70,0x28,0x30,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30,0x12,0x14,0x00,0x00,0x1C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01, + 0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01, + 0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01, + 0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01, + 0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01,0x55,0x31,0x25,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x0D,0x00,0xA0,0xE1,0x10,0xD0,0x9F,0xE5,0x01,0x40,0x2D,0xE9,0x93,0x01,0x00,0xEB, + 0x01,0x40,0xBD,0xE8,0x00,0xD0,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0xF0,0x0F,0x00,0x20, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0xFF,0x48,0x10,0xB4, + 0x81,0x69,0x02,0x06,0x89,0x00,0x89,0x08,0x89,0x18,0x81,0x61,0x41,0x6B,0xFB,0x4C, + 0x89,0x00,0x89,0x08,0x89,0x18,0x40,0x34,0x41,0x63,0xA0,0x69,0x80,0x00,0x80,0x08, + 0xA0,0x61,0x00,0x20,0x81,0x00,0x0A,0x19,0x11,0x6A,0x40,0x1C,0x8B,0x00,0xC9,0x01, + 0xDB,0x0E,0xC9,0x0E,0x49,0x06,0x1B,0x05,0x19,0x43,0x14,0x28,0x11,0x62,0xF1,0xD3, + 0xEE,0x48,0xEF,0x49,0x80,0x30,0x01,0x63,0xEE,0x49,0x41,0x63,0xEE,0x49,0x08,0x69, + 0x40,0x08,0x40,0x00,0x08,0x61,0xEC,0x49,0xEC,0x48,0x40,0x31,0x08,0x60,0xEC,0x48, + 0xEC,0x49,0xC8,0x60,0x10,0xBC,0x70,0x47,0xFC,0xB5,0xEB,0x4C,0x02,0x00,0x30,0x34, + 0x18,0xCC,0x00,0x20,0x00,0x94,0xE9,0x4C,0x24,0x7D,0xE4,0x07,0x2D,0xD0,0xE8,0x4C, + 0x25,0x79,0xE6,0x78,0xE5,0x4C,0xAE,0x46,0xA5,0x7D,0x00,0x2E,0x76,0x46,0xAC,0x46, + 0xE5,0x7D,0x01,0x95,0x25,0x7E,0x67,0x7E,0xA4,0x7E,0x10,0xD0,0xB2,0x42,0x1C,0xD1, + 0x8C,0x45,0x08,0xD0,0x01,0x9A,0x8A,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0,0x8F,0x42, + 0x01,0xD0,0x8C,0x42,0x00,0xD1,0x00,0x98,0xFC,0xBC,0x08,0xBC,0x18,0x47,0xB1,0x42, + 0x0B,0xD1,0x94,0x45,0xF7,0xD0,0x01,0x99,0x91,0x42,0xF4,0xD0,0x95,0x42,0xF2,0xD0, + 0x97,0x42,0xF0,0xD0,0x94,0x42,0xEE,0xD0,0xEE,0xE7,0x18,0x00,0xEC,0xE7,0x30,0xB4, + 0xCF,0x4B,0xD0,0x4C,0x5B,0x78,0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06, + 0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D, + 0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20, + 0x30,0xBC,0x70,0x47,0xF3,0xB5,0xC4,0x48,0x82,0xB0,0x01,0x90,0x00,0x20,0x00,0x90, + 0xB9,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0xBD,0x4F,0xB6,0x48,0xC0,0x68, + 0xC0,0x07,0xFB,0xD0,0x00,0x24,0x26,0x00,0x25,0xE0,0x00,0x25,0x1F,0xE0,0x29,0x00, + 0x30,0x00,0xFF,0xF7,0x91,0xFF,0x00,0x28,0x17,0xD0,0x79,0x78,0x01,0x9A,0x71,0x43, + 0x49,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x02,0x99,0x00,0x29, + 0x02,0xD0,0x00,0x28,0x09,0xDA,0x01,0xE0,0x00,0x28,0x06,0xDD,0x03,0x9A,0x29,0x00, + 0x30,0x00,0xFF,0xF7,0xB4,0xFF,0x40,0x1C,0x00,0xD1,0x64,0x1C,0x6D,0x1C,0x78,0x78, + 0x85,0x42,0xDC,0xD3,0x76,0x1C,0xB8,0x78,0x86,0x42,0xD6,0xD3,0xB8,0x78,0x79,0x78, + 0x48,0x43,0xA0,0x42,0x0A,0xD0,0x00,0x98,0x41,0x1C,0x00,0x91,0x01,0x21,0x49,0x02, + 0x88,0x42,0x03,0xD8,0x98,0x48,0xC1,0x68,0xC1,0x60,0xBF,0xE7,0xFF,0xBC,0x08,0xBC, + 0x18,0x47,0xF0,0xB4,0x00,0x21,0x9B,0x4C,0x98,0x4B,0x99,0x4E,0x1E,0x25,0x13,0xE0, + 0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42, + 0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00, + 0xA5,0x52,0x72,0x78,0x80,0x18,0x49,0x1C,0xB2,0x78,0x77,0x78,0x7A,0x43,0x82,0x42, + 0xE6,0xD8,0xF0,0xBC,0x70,0x47,0xF0,0xB4,0x89,0x4B,0x00,0x21,0x5A,0x78,0x1E,0x26, + 0x88,0x4D,0x42,0x43,0x85,0x4F,0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0,0xFB,0x7D, + 0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42,0x04,0xD0, + 0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C,0x7C,0x4B, + 0x04,0x00,0x5B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42,0xE5,0xD8,0xD9,0xE7,0x02,0x04, + 0x78,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3,0x70,0x47, + 0xF1,0xB5,0x73,0x4C,0x70,0x4D,0x21,0x78,0x73,0x4F,0xA8,0x6B,0x00,0x29,0x82,0xB0, + 0x00,0xD0,0x00,0x0C,0x00,0x06,0x00,0x0E,0x01,0x02,0x01,0x43,0x08,0x04,0x00,0x0C, + 0xFF,0xF7,0xE5,0xFF,0x69,0x48,0x00,0x7D,0xC0,0x07,0x08,0xD0,0xE0,0x78,0x00,0x28, + 0x20,0x79,0x02,0xD0,0xFF,0xF7,0xB7,0xFF,0x01,0xE0,0xFF,0xF7,0x92,0xFF,0x5E,0x49, + 0x00,0x20,0x80,0x31,0xC8,0x62,0x62,0x49,0xE8,0x6B,0x09,0x78,0x00,0x29,0x08,0xD1, + 0x5C,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x07,0x12,0x09,0x12,0x01,0x00,0x0F, + 0x07,0xE0,0x58,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x03,0x12,0x09,0x12,0x01, + 0x00,0x0F,0x02,0x43,0x4A,0x60,0x03,0x24,0x26,0x1F,0x01,0xE0,0x03,0x2C,0x02,0xD1, + 0x01,0x25,0xED,0x43,0x09,0xE0,0x02,0x2C,0x01,0xD1,0x01,0x25,0x05,0xE0,0x01,0x2C, + 0x01,0xD1,0x35,0x00,0x01,0xE0,0x00,0x2C,0xF7,0xD0,0xE0,0x07,0xC0,0x0F,0x29,0x00, + 0xFF,0xF7,0x10,0xFF,0x64,0x1E,0xE9,0xD5,0x49,0x48,0x49,0x4D,0x00,0x78,0x0C,0x35, + 0x00,0x28,0x2D,0xD1,0x40,0x4A,0x09,0x21,0x01,0x23,0xD0,0x68,0x18,0x43,0xD0,0x60, + 0xD0,0x68,0xC0,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x00,0x26,0x17,0xE0,0x00,0x24, + 0x10,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x9F,0xFE,0x00,0x28,0x09,0xD0,0x3C,0x48, + 0x40,0x78,0x70,0x43,0x00,0x19,0x81,0x00,0x79,0x58,0x09,0x05,0x09,0x0D,0x40,0x00, + 0x29,0x52,0x64,0x1C,0x36,0x48,0x40,0x78,0x84,0x42,0xEA,0xD3,0x76,0x1C,0x34,0x48, + 0x81,0x78,0x8E,0x42,0xE3,0xD3,0x01,0x78,0x00,0x29,0x01,0xD1,0x81,0x68,0x03,0xE0, + 0x2F,0x48,0x80,0x68,0x01,0x0C,0x09,0x04,0x2A,0x48,0x41,0x63,0x26,0x48,0x09,0x21, + 0x01,0x23,0xC2,0x68,0x1A,0x43,0xC2,0x60,0xC2,0x68,0xD2,0x07,0xFC,0xD0,0x49,0x1E, + 0xF7,0xD2,0x2A,0x48,0x00,0x26,0x01,0x90,0x29,0x48,0x00,0x90,0x73,0xE0,0x00,0x24, + 0x6C,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x67,0xFE,0x00,0x28,0x65,0xD0,0x20,0x49, + 0x0A,0x78,0x00,0x2A,0x1A,0xD1,0x49,0x78,0x71,0x43,0x0B,0x19,0x59,0x00,0x9B,0x00, + 0xFB,0x58,0x6A,0x5A,0x1B,0x05,0x1B,0x0D,0x9A,0x42,0x01,0xD8,0x00,0x20,0x0B,0xE0, + 0x82,0x42,0x04,0xD9,0x12,0x1A,0x12,0x04,0xD2,0x0C,0x80,0x18,0x03,0xE0,0x82,0x1A, + 0x12,0x04,0xD2,0x0C,0x80,0x1A,0xC0,0x1A,0x68,0x52,0x46,0xE0,0x10,0x48,0x15,0x49, + 0x40,0x78,0xFF,0x23,0x91,0x33,0x70,0x43,0x00,0x19,0x84,0x46,0x80,0x00,0x38,0x58, + 0x00,0x05,0x00,0x0D,0x02,0x00,0x41,0x18,0x99,0x42,0x1D,0xE0,0x40,0x06,0x10,0x40, + 0xFF,0xF3,0x0F,0x00,0xFF,0xF7,0x0F,0x00,0x00,0x90,0x00,0x40,0x0C,0x13,0x00,0x00, + 0xF0,0xCB,0x0F,0x00,0x00,0xA0,0x00,0x40,0xC0,0x0F,0x00,0x20,0x00,0x78,0x00,0x00, + 0x6C,0x06,0x00,0x20,0x00,0x00,0x10,0x40,0x00,0x02,0x10,0x40,0x78,0x08,0x00,0x20, + 0x78,0x0A,0x00,0x20,0x74,0xF5,0xFF,0xFF,0x09,0xD8,0x73,0x49,0x08,0x1A,0x03,0x00, + 0x43,0x43,0x18,0x0A,0x8A,0x42,0x01,0xD9,0x40,0x18,0x00,0xE0,0x08,0x1A,0x02,0x99, + 0x00,0x29,0x06,0xD0,0x6D,0x49,0x00,0x9A,0x89,0x78,0x61,0x43,0x89,0x19,0x49,0x00, + 0x02,0xE0,0x01,0x9A,0x61,0x46,0x49,0x00,0x50,0x52,0x64,0x1C,0x67,0x48,0x40,0x78, + 0x84,0x42,0x8E,0xD3,0x76,0x1C,0x65,0x48,0x81,0x78,0x8E,0x42,0x87,0xD3,0xFE,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0xB5,0x62,0x4E,0x60,0x4D,0x00,0x24,0x01,0x27,0x61,0x48, + 0x01,0x68,0x60,0x4A,0x08,0x04,0x00,0x0E,0x09,0x06,0x09,0x0E,0x68,0x70,0x40,0x3A, + 0xA9,0x70,0x12,0x69,0xD2,0x07,0xD2,0x0F,0x32,0x7D,0x02,0xD0,0x92,0x07,0x06,0xD4, + 0x01,0xE0,0x92,0x07,0x03,0xD5,0x49,0x1E,0x29,0x71,0xEF,0x70,0x03,0xE0,0x40,0x1E, + 0x28,0x71,0x00,0x20,0xE8,0x70,0x20,0x00,0x64,0x1C,0xFF,0xF7,0xC1,0xFE,0x28,0x78, + 0x01,0x28,0x01,0xD0,0x01,0x2C,0x05,0xD0,0x02,0x2C,0x03,0xD0,0xFF,0xF7,0x8E,0xFD, + 0x01,0x2C,0xD4,0xD9,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x4B,0x48,0x10,0xB5,0x40,0x6B, + 0x46,0x4C,0xC5,0x22,0xA0,0x60,0x20,0x00,0xD2,0x00,0x00,0x21,0x0C,0x30,0xFF,0xF7, + 0x77,0xFD,0x00,0x20,0x20,0x70,0xFF,0xF7,0xBD,0xFF,0x01,0x20,0x20,0x70,0xFF,0xF7, + 0xB9,0xFF,0x42,0x48,0x42,0x49,0xC8,0x61,0x42,0x48,0xC2,0x68,0x52,0x08,0x52,0x00, + 0xC2,0x60,0x20,0x00,0x0C,0x30,0x04,0xC8,0xCA,0x61,0x4A,0x69,0x52,0x06,0xFC,0xD4, + 0xF9,0xE7,0x40,0x1E,0xFD,0xD2,0x70,0x47,0xF0,0xB5,0x3C,0x48,0x3A,0x4A,0x01,0x23, + 0x03,0x61,0x19,0x00,0x39,0x48,0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x26,0x35,0x00, + 0x9D,0x40,0x03,0x20,0x35,0x4C,0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00,0x40,0x1E, + 0xFD,0xD2,0x01,0x20,0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2, + 0x65,0x61,0x48,0x00,0x86,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69,0x00,0x20,0x5C,0x01, + 0xA4,0x46,0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F, + 0x75,0x19,0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xD5,0xD3, + 0x22,0x48,0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x25,0x9D,0x40,0x03,0x20,0x1F,0x4C, + 0x00,0x04,0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0x01,0x20,0x00,0x04, + 0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0xA5,0x61,0x70,0x46,0x40,0x1E, + 0xFD,0xD2,0xE7,0x69,0x5C,0x01,0xFF,0x34,0x00,0x20,0xFF,0x34,0x02,0x34,0xA4,0x46, + 0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07,0xED,0x0F,0x75,0x19, + 0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B,0xD4,0xD3,0x49,0x1C, + 0xC8,0x29,0x9F,0xD9,0x6E,0xE7,0x00,0x00,0x54,0x0B,0x00,0x00,0x6C,0x06,0x00,0x20, + 0x00,0x78,0x00,0x00,0x40,0x90,0x00,0x40,0x00,0xA0,0x00,0x40,0xAB,0xFC,0xFF,0x8F, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x78,0x08,0x00,0x20,0x00,0xA1,0x00,0x40, + 0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1,0x1B,0x05,0x00,0x20,0x49,0x53,0x54,0x56, + 0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x7B,0x00,0x00,0xC0,0x75,0x00,0x00, + 0x40,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x7B,0x00,0x00, + 0x00,0x01,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x76,0x00,0x00, + 0x00,0x02,0x00,0x00,0x64,0x00,0x87,0x00,0x00,0x00,0x00,0x00,0x49,0x53,0x54,0x56, + 0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxb/Makefile b/drivers/input/touchscreen/ist30xxb/Makefile new file mode 100644 index 00000000..c0ff2674 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. +obj-$(CONFIG_TOUCHSCREEN_IST30XXB) += ist30xxb.o ist30xxb_update.o ist30xxb_tracking.o ist30xxb_misc.o ist30xxb_sys.o diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb.c b/drivers/input/touchscreen/ist30xxb/ist30xxb.c new file mode 100755 index 00000000..7af978bc --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb.c @@ -0,0 +1,1261 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include + +#ifdef CONFIG_OF +#include +#include +#endif +#include "ist30xxb_sec.h" +#include "ist30xxb_update.h" + +#if IST30XX_DEBUG +#include "ist30xxb_misc.h" +#endif +#if IST30XX_TRACKING_MODE +#include "ist30xxb_tracking.h" +#endif + +#define MAX_ERR_CNT (100) + +#if IST30XX_USE_KEY +int ist30xx_key_code[] = { 0, KEY_MENU, KEY_BACK }; +#endif + +DEFINE_MUTEX(ist30xx_mutex); + +volatile bool ist30xx_irq_working = false; +static bool ist30xx_initialized = 0; + +struct ist30xx_data *ts_data; +EXPORT_SYMBOL(ts_data); + +static struct delayed_work work_reset_check; +static struct delayed_work work_noise_protect, work_debug_algorithm; + +#if IST30XX_DETECT_TA +static int ist30xx_ta_status = -1; +#endif +#if IST30XX_DETECT_CALLER +static int ist30xx_call_status = -1; +#endif +#if IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +static struct delayed_work work_fw_update; +#endif + + +#if IST30XX_EVENT_MODE +# if IST30XX_NOISE_MODE +int ist30xx_scan_retry = 0; +# endif +u32 event_ms = 0; + +static struct timer_list idle_timer; +static struct timespec t_current; // ns +int timer_period_ms = 500; // 0.5sec +# define EVENT_TIMER_INTERVAL (HZ / 2) // 0.5sec +#endif // IST30XX_EVENT_MODE + +#if IST30XX_DEBUG +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; +#endif + +int ist30xx_dbg_level = IST30XX_DEBUG_LEVEL; +void tsp_printk(int level, const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + int r; + + if (ist30xx_dbg_level < level) + return; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + r = printk("%s %pV", IST30XX_DEBUG_TAG, &vaf); + + va_end(args); +} + +#if IST30XX_EVENT_MODE +long get_milli_second(void) +{ + ktime_get_ts(&t_current); + + return t_current.tv_sec * 1000 + t_current.tv_nsec / 1000000; +} +#endif // IST30XX_EVENT_MODE + + +void ist30xx_disable_irq(struct ist30xx_data *data) +{ + if (data->irq_enabled) { + ist30xx_tracking(TRACK_INTR_ENABLE); + disable_irq(data->client->irq); + #if PRINT_TSP_LOG + printk("[TSP] ist30xx_disable_irq : %d\n", data->client->irq); + #endif + data->irq_enabled = 0; +#if IST30XX_EVENT_MODE + data->status.event_mode = false; +#endif + } +} + +void ist30xx_enable_irq(struct ist30xx_data *data) +{ + if (!data->irq_enabled) { + ist30xx_tracking(TRACK_INTR_DISABLE); + enable_irq(data->client->irq); + printk("[TSP] ist30xx_enable_irq : %d\n", data->client->irq); + msleep(10); + data->irq_enabled = 1; +#if IST30XX_EVENT_MODE + data->status.event_mode = true; +#endif + } +} + + +int ist30xx_max_error_cnt = MAX_ERR_CNT; +int ist30xx_error_cnt = 0; +static void ist30xx_request_reset(void) +{ + #if PRINT_TSP_LOG + printk("[TSP] %s()\n", __func__); + #endif + ist30xx_error_cnt++; + if (ist30xx_error_cnt >= ist30xx_max_error_cnt) { + #if PRINT_TSP_LOG + printk("[TSP] %s()\n", __func__); + #endif + schedule_delayed_work(&work_reset_check, 0); + ist30xx_error_cnt = 0; + } + +} + + +void ist30xx_start(struct ist30xx_data *data) +{ +#if IST30XX_DETECT_TA + if (ist30xx_ta_status > -1) { + ist30xx_write_cmd(data->client, CMD_SET_TA_MODE, ist30xx_ta_status); + #if PRINT_TSP_LOG + tsp_info("%s(), ta_mode : %d\n", __func__, ist30xx_ta_status); + #endif + } +#endif +#if IST30XX_DETECT_CALLER + if (ist30xx_call_status > -1) { + ist30xx_write_cmd(data->client, CMD_SET_CALL_MODE, ist30xx_call_status); + #if PRINT_TSP_LOG + tsp_info("%s(), call_mode : %d\n", __func__, ist30xx_call_status); + #endif + } +#endif + + ist30xx_cmd_start_scan(data->client); +} + + +int ist30xx_get_ver_info(struct ist30xx_data *data) +{ + int ret; + + data->fw.prev_core_ver = data->fw.core_ver; + data->fw.prev_param_ver = data->fw.param_ver; + data->fw.core_ver = data->fw.param_ver = 0; + + ret = ist30xx_read_cmd(data->client, CMD_GET_FW_VER, &data->fw.core_ver); + if (ret) + return ret; + + ret = ist30xx_read_cmd(data->client, CMD_GET_PARAM_VER, &data->fw.param_ver); + if (ret) + return ret; + + tsp_info("IC version read core: %x, param: %x\n", + data->fw.core_ver, data->fw.param_ver); + + return 0; +} + + +int ist30xx_init_touch_driver(struct ist30xx_data *data) +{ + int ret = 0; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + + ret = ist30xx_cmd_run_device(data->client); + if (ret) + goto init_touch_end; + + ist30xx_get_ver_info(data); + +init_touch_end: + ist30xx_start(data); + + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return ret; +} + + +#if IST30XX_DEBUG +void ist30xx_print_info(void) +{ + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + tsp_debug("*** TSP/TKEY info ***\n"); + tsp_debug("tscn dir swap: %d, flip x: %d, y: %d\n", + tsp->dir.swap_xy, tsp->dir.flip_x, tsp->dir.flip_y); + tsp_debug("tscn ch_num tx: %d, rx: %d\n", + tsp->ch_num.tx, tsp->ch_num.rx); + tsp_debug("tscn width: %d, height: %d\n", + tsp->width, tsp->height); + tsp_debug("tkey enable: %d, key num: %d, axis rx: %d \n", + tkey->enable, tkey->key_num, tkey->axis_rx); + tsp_debug("tkey ch_num[0] %d, [1] %d, [2] %d, [3] %d, [4] %d\n", + tkey->ch_num[0], tkey->ch_num[1], tkey->ch_num[2], + tkey->ch_num[3], tkey->ch_num[4]); +} +#endif + +#define CALIB_MSG_MASK (0xF0000FFF) +#define CALIB_MSG_VALID (0x80000CAB) +int ist30xx_get_info(struct ist30xx_data *data) +{ + int ret; + u32 calib_msg; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + +#if IST30XX_INTERNAL_BIN +# if IST30XX_DEBUG + ist30xx_get_tsp_info(data); + ist30xx_get_tkey_info(data); +#endif // IST30XX_DEBUG +#else + ret = ist30xx_write_cmd(data->client, CMD_RUN_DEVICE, 0); + if (ret) + goto get_info_end; + msleep(10); + + ret = ist30xx_get_ver_info(data); + if (ret) + goto get_info_end; + +# if IST30XX_DEBUG + ret = ist30xx_tsp_update_info(); + if (ret) + goto get_info_end; + + ret = ist30xx_tkey_update_info(); + if (ret) + goto get_info_end; +# endif // IST30XX_DEBUG +#endif // IST30XX_INTERNAL_BIN + +#if IST30XX_DEBUG + ist30xx_print_info(); + data->max_fingers = ist30xx_tsp_info.finger_num; + data->max_keys = ist30xx_tkey_info.key_num; +#endif // IST30XX_DEBUG + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &calib_msg); + if (ret == 0) { + tsp_info("calib status: 0x%08x\n", calib_msg); + ist30xx_tracking(calib_msg); + tsp_info("CALIB_MSG_MASK = 0x%08x\n",(calib_msg & CALIB_MSG_MASK)); + tsp_info("CALIB_MSG_VALID = 0x%08x\n",CALIB_MSG_VALID); + tsp_info("CALIB_TOSTATUS = 0x%08x\n",CALIB_TO_STATUS(calib_msg)); + if ((calib_msg & CALIB_MSG_MASK) != CALIB_MSG_VALID || + CALIB_TO_STATUS(calib_msg) > 0) { +// ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY); + ist30xx_calibrate(1); + ist30xx_cmd_run_device(data->client); + } + } + +#if (IST30XX_EVENT_MODE && IST30XX_CHECK_CALIB) + if (!data->status.update) { + ret = ist30xx_cmd_check_calib(data->client); + if (!ret) { + data->status.calib = 1; + event_ms = (u32)get_milli_second(); + data->status.event_mode = true; + } + } +#else + ist30xx_start(ts_data); +#endif + +#if !(IST30XX_INTERNAL_BIN) +get_info_end: +#endif + if (ret == 0) + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return ret; +} + + +#define PRESS_MSG_MASK (0x01) +#define MULTI_MSG_MASK (0x02) +#define PRESS_MSG_KEY (0x6) + +#define TOUCH_DOWN_MESSAGE ("p") +#define TOUCH_UP_MESSAGE ("r") +#define TOUCH_MOVE_MESSAGE (" ") +bool tsp_touched[IST30XX_MAX_MT_FINGERS] = { 0, }; + +void print_tsp_event(finger_info *finger) +{ + int idx = finger->bit_field.id - 1; + int press = finger->bit_field.udmg & PRESS_MSG_MASK; + + if (press == PRESS_MSG_MASK) { + if (tsp_touched[idx] == 0) { // touch down + #if PRINT_TSP_LOG + tsp_info("%s%d (%d, %d)\n", + TOUCH_DOWN_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + #endif + tsp_touched[idx] = 1; + } else { + // touch move + #if PRINT_TSP_LOG + tsp_debug("%s%d (%d, %d)\n", + TOUCH_MOVE_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + #endif + } + } else { + if (tsp_touched[idx] == 1) { // touch up + #if PRINT_TSP_LOG + tsp_info("%s%d (%d, %d)\n", + TOUCH_UP_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + #endif + tsp_touched[idx] = 0; + } + } +} + + +static void release_finger(finger_info *finger) +{ + input_mt_slot(ts_data->input_dev, finger->bit_field.id - 1); + input_mt_report_slot_state(ts_data->input_dev, MT_TOOL_FINGER, false); + + ist30xx_tracking(TRACK_POS_FINGER + finger->bit_field.id); +#if PRINT_TSP_LOG + tsp_info("%s() %d(%d, %d)\n", __func__, + finger->bit_field.id, finger->bit_field.x, finger->bit_field.y); +#endif + finger->bit_field.udmg &= ~(PRESS_MSG_MASK); +#if PRINT_TSP_LOG + print_tsp_event(finger); +#endif + finger->bit_field.id = 0; + + input_sync(ts_data->input_dev); +} + + +#define CANCEL_KEY (0xff) +#define RELEASE_KEY (0) +static void release_key(finger_info *key, u8 key_status) +{ + int id = key->bit_field.id; + + input_report_key(ts_data->input_dev, ist30xx_key_code[id], key_status); + + ist30xx_tracking(TRACK_POS_KEY + key->bit_field.id); +#if PRINT_TSP_LOG + tsp_debug("%s() key%d, event: %d, status: %d\n", __func__, + id, key->bit_field.w, key_status); +#endif + key->bit_field.id = 0; + + input_sync(ts_data->input_dev); +} + +static void clear_input_data(struct ist30xx_data *data) +{ + int i; + finger_info *fingers = (finger_info *)data->prev_fingers; + finger_info *keys = (finger_info *)data->prev_keys; + + for (i = 0; i < data->num_fingers; i++) { + if (fingers[i].bit_field.id == 0) + continue; + + if (fingers[i].bit_field.udmg & PRESS_MSG_MASK) + release_finger(&fingers[i]); + } + + for (i = 0; i < data->num_keys; i++) { + if (keys[i].bit_field.id == 0) + continue; + + if (keys[i].bit_field.w == PRESS_MSG_KEY) + release_key(&keys[i], RELEASE_KEY); + } +} + +static int check_report_data(struct ist30xx_data *data, int finger_counts, int key_counts) +{ + int i, j; + bool valid_id; + finger_info *fingers = (finger_info *)data->fingers; + finger_info *prev_fingers = (finger_info *)data->prev_fingers; + + /* current finger info */ + for (i = 0; i < finger_counts; i++) { + if ((fingers[i].bit_field.id == 0) || + (fingers[i].bit_field.id > data->max_fingers) || + (fingers[i].bit_field.x > IST30XX_MAX_X) || + (fingers[i].bit_field.y > IST30XX_MAX_Y)) { + tsp_warn("Invalid touch data - %d: %d(%d, %d)\n", i, + fingers[i].bit_field.id, + fingers[i].bit_field.x, + fingers[i].bit_field.y); + + fingers[i].bit_field.id = 0; + ist30xx_tracking(TRACK_POS_UNKNOWN); + return -EPERM; + } else{ + /*tsp_debug("***touch data - %d: %d(%d, %d)\n", i, + fingers[i].bit_field.id, + fingers[i].bit_field.x, + fingers[i].bit_field.y);*/ + } + + } + + /* previous finger info */ + if (data->num_fingers >= finger_counts) { + for (i = 0; i < data->max_fingers; i++) { // prev_fingers + if (prev_fingers[i].bit_field.id != 0 && + (prev_fingers[i].bit_field.udmg & PRESS_MSG_MASK)) { + valid_id = false; + for (j = 0; j < data->max_fingers; j++) { // fingers + if ((prev_fingers[i].bit_field.id) == + (fingers[j].bit_field.id)) { + valid_id = true; + break; + } + } + if (valid_id == false) + release_finger(&prev_fingers[i]); + } + } + } + + return 0; +} + +bool finger_on_screen(void) +{ + int i; + + for (i = 0; i < IST30XX_MAX_MT_FINGERS; i++) + if (tsp_touched[i]) return true; + + return false; +} + +int key_press = 0; +int key_id = 0; +u32 key_sensitivity = 0; +static void report_input_data(struct ist30xx_data *data, int finger_counts, int key_counts) +{ + int i, press, count; + finger_info *fingers = (finger_info *)data->fingers; + + memset(data->prev_fingers, 0, sizeof(data->prev_fingers)); + + for (i = 0, count = 0; i < finger_counts; i++) { + press = fingers[i].bit_field.udmg & PRESS_MSG_MASK; + #if PRINT_TSP_LOG + print_tsp_event(&fingers[i]); + #endif + input_mt_slot(data->input_dev, fingers[i].bit_field.id - 1); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, + (press ? true : false)); + if (press) { + input_report_abs(data->input_dev, ABS_MT_POSITION_X, + fingers[i].bit_field.x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, + fingers[i].bit_field.y); + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, + fingers[i].bit_field.w); + } + + data->prev_fingers[i] = fingers[i]; + count++; + } + +#if IST30XX_USE_KEY + for (i = finger_counts; i < finger_counts + key_counts; i++) { + key_id = fingers[i].bit_field.id; + key_press = (fingers[i].bit_field.w == PRESS_MSG_KEY) ? 1 : 0; + key_sensitivity = fingers[i].bit_field.y; +#if PRINT_TSP_LOG + tsp_debug("key(%08x) id: %d, press: %d, sensitivity: %d\n", + fingers[i].full_field, key_id, key_press, fingers[i].bit_field.y); +#endif + input_report_key(data->input_dev, ist30xx_key_code[key_id], key_press); + + data->prev_keys[key_id - 1] = fingers[i]; + + count++; + } +#endif // IST30XX_USE_KEY + + if (count > 0) + input_sync(data->input_dev); + + data->num_fingers = finger_counts; + data->num_keys = key_counts; + ist30xx_error_cnt = 0; + ist30xx_scan_retry = 0; +} + +/* + * CMD : CMD_GET_COORD + * [31:30] [29:26] [25:16] [15:10] [9:0] + * Multi(1st) UDMG Rsvd. NumOfKey Rsvd. NumOfFinger + * Single & UDMG ID X Area Y + * Multi(2nd) + * + * UDMG [31] 0/1 : single/multi + * UDMG [30] 0/1 : unpress/press + */ +static irqreturn_t ist30xx_irq_thread(int irq, void *ptr) +{ + int i, ret; + int key_cnt, finger_cnt, read_cnt; + struct ist30xx_data *data = ts_data; + u32 msg[IST30XX_MAX_MT_FINGERS]; + + ist30xx_irq_working = true; + //printk("[TSP] %s\n", __func__); + if (!data->irq_enabled) + goto irq_end; + + if (get_milli_second() - event_ms < 5) // Noise detect + goto irq_end; + + memset(msg, 0, sizeof(msg)); + + ret = ist30xx_get_position(data->client, msg, 1); + if (ret) + goto irq_err; + #if PRINT_TSP_LOG + tsp_verb("intr msg: 0x%08x\n", *msg); + #endif + if (*msg == 0xE11CE970) + goto irq_ic_err; + + if (*msg == 0 || *msg == 0xFFFFFFFF || *msg == 0x2FFF03FF || + *msg == 0x30003000 || *msg == 0x300B300B) + goto irq_err; + +#if IST30XX_EVENT_MODE + event_ms = (u32)get_milli_second(); +# if IST30XX_TRACKING_MODE + ist30xx_put_track(event_ms, *msg); +# endif +#endif // IST30XX_EVENT_MODE + + if ((*msg & CALIB_MSG_MASK) == CALIB_MSG_VALID) { + data->status.calib_msg = *msg; + tsp_info("calib status: 0x%08x\n", data->status.calib_msg); + + goto irq_end; + } + + memset(data->fingers, 0, sizeof(data->fingers)); + + key_cnt = 0; + finger_cnt = 1; + read_cnt = 1; + data->fingers[0].full_field = *msg; + + if (data->fingers[0].bit_field.udmg & MULTI_MSG_MASK) { + key_cnt = data->fingers[0].bit_field.x; + finger_cnt = data->fingers[0].bit_field.y; + read_cnt = finger_cnt + key_cnt; + + if (finger_cnt > data->max_fingers || + key_cnt > data->max_keys) { + tsp_warn("Invalid touch count - finger: %d(%d), key: %d(%d)\n", + finger_cnt, data->max_fingers, + key_cnt, data->max_keys); + goto irq_err; + } + +#if I2C_BURST_MODE + ret = ist30xx_get_position(data->client, msg, read_cnt); + if (ret) + goto irq_err; + + for (i = 0; i < read_cnt; i++) + data->fingers[i].full_field = msg[i]; +#else + for (i = 0; i < read_cnt; i++) { + ret = ist30xx_get_position(data->client, &msg[i], 1); + if (ret) + goto irq_err; + + data->fingers[i].full_field = msg[i]; + } +#endif // I2C_BURST_MODE + +#if IST30XX_EVENT_MODE && IST30XX_TRACKING_MODE + for (i = 0; i < read_cnt; i++) + ist30xx_put_track(event_ms, msg[i]); +#endif + } + + if (check_report_data(data, finger_cnt, key_cnt)) + goto irq_end; + + if (read_cnt > 0) + report_input_data(data, finger_cnt, key_cnt); + + goto irq_end; + +irq_err: + tsp_err("intr msg[0]: 0x%08x, ret: %d\n", *msg, ret); + ist30xx_request_reset(); +irq_end: + ist30xx_irq_working = false; + //printk("[TSP] %s : %d\n", __func__, __LINE__); +#if IST30XX_EVENT_MODE + event_ms = (u32)get_milli_second(); +#endif + return IRQ_HANDLED; + +irq_ic_err: + tsp_err("Occured IC exception\n"); + schedule_delayed_work(&work_reset_check, 0); + ist30xx_irq_working = false; + //printk("[TSP] %s : %d\n", __func__, __LINE__); +#if IST30XX_EVENT_MODE + event_ms = (u32)get_milli_second(); +#endif + return IRQ_HANDLED; +} + + +#ifdef CONFIG_HAS_EARLYSUSPEND +#define ist30xx_suspend NULL +#define ist30xx_resume NULL +static void ist30xx_early_suspend(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + clear_input_data(data); + mutex_unlock(&ist30xx_mutex); +} +static void ist30xx_late_resume(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(data); + ist30xx_start(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); +} +#else +static int ist30xx_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + return ist30xx_internal_suspend(data); +} +static int ist30xx_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + return ist30xx_internal_resume(data); +} +#endif // CONFIG_HAS_EARLYSUSPEND + + +void ist30xx_set_ta_mode(bool charging) +{ + tsp_info("%s(), charging = %d\n", __func__, charging); +#if IST30XX_DETECT_TA + if (charging == ist30xx_ta_status) + return; + + if (ist30xx_ta_status == -1) { + ist30xx_ta_status = charging ? 1 : 0; + return; + } + + ist30xx_ta_status = charging ? 1 : 0; + + tsp_info("%s(), status = %d\n", __func__, ist30xx_ta_status); + + schedule_delayed_work(&work_reset_check, 0); +#endif +} +EXPORT_SYMBOL(ist30xx_set_ta_mode); + +void ist30xx_set_call_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + +#if IST30XX_DETECT_CALLER + if (mode == ist30xx_ta_status) + return; + + if (ist30xx_ta_status == -1) { + ist30xx_ta_status = mode ? 1 : 0; + return; + } + + ist30xx_call_status = mode; + + tsp_info("%s(), call = %d\n", __func__, ist30xx_call_status); + + schedule_delayed_work(&work_reset_check, 0); +#endif +} +EXPORT_SYMBOL(ist30xx_set_call_mode); + + +void charger_enable(int enable) +{ + bool charging = enable ? true : false; + + ist30xx_set_ta_mode(charging); +} + +static void reset_work_func(struct work_struct *work) +{ + if ((ts_data == NULL) || (ts_data->client == NULL)) + return; + + tsp_info("Request reset function\n"); + + if ((ist30xx_initialized == 1) && (ts_data->status.power == 1) && + (ts_data->status.update != 1) && (ts_data->status.calib != 1)) { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + + clear_input_data(ts_data); + + ist30xx_cmd_run_device(ts_data->client); + + ist30xx_start(ts_data); + + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + } +} +#if 0 +#if IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +static void fw_update_func(struct work_struct *work) +{ + if ((ts_data == NULL) || (ts_data->client == NULL)) + return; + + tsp_info("FW update function\n"); + + if (ist30xx_auto_bin_update(ts_data)) + ist30xx_disable_irq(ts_data); +} +#endif // IST30XX_INTERNAL_BIN && IST30XX_UPDATE_BY_WORKQUEUE +#endif + +#if IST30XX_EVENT_MODE +u32 ist30xx_max_scan_retry = 2; +u32 ist30xx_scan_count = 0; +u32 ist30xx_algr_addr = 0, ist30xx_algr_size = 0; + +#define SCAN_STATUS_MAGIC (0x3C000000) +#define SCAN_STATUS_MASK (0xFF000000) +#define FINGER_CNT_MASK (0x00F00000) +#define SCAN_CNT_MASK (0x000FFFFF) +#define GET_FINGER_CNT(k) ((k & FINGER_CNT_MASK) >> 20) +#define GET_SCAN_CNT(k) (k & SCAN_CNT_MASK) + +static void noise_work_func(struct work_struct *work) +{ +# if IST30XX_NOISE_MODE + int i, ret; + u32 scan_status = 0; + + ret = ist30xx_read_cmd(ts_data->client, IST30XXB_MEM_COUNT, &scan_status); + if (ret) { + tsp_warn("Mem scan count read fail!\n"); + goto retry_timer; + } + #if PRINT_TSP_LOG + tsp_verb("scan status: 0x%x\n", scan_status); + #endif + if ((scan_status & SCAN_STATUS_MASK) != SCAN_STATUS_MAGIC) { + tsp_warn("Scan status is not corrected!\n"); + goto retry_timer; + } else { + /* Status of IC is idle */ + if (GET_FINGER_CNT(scan_status) == 0) { + for (i = 0; i < IST30XX_MAX_MT_FINGERS; i++) { + if (ts_data->prev_fingers[i].bit_field.id == 0) + continue; + + if (ts_data->prev_fingers[i].bit_field.udmg & PRESS_MSG_MASK) { + tsp_warn("prev_fingers: 0x%08x\n", + ts_data->prev_fingers[i].full_field); + release_finger(&ts_data->prev_fingers[i]); + } + } + + for (i = 0; i < IST30XX_MAX_MT_FINGERS; i++) { + if (ts_data->prev_keys[i].bit_field.id == 0) + continue; + + if (ts_data->prev_keys[i].bit_field.w == PRESS_MSG_KEY) { + tsp_warn("prev_keys: 0x%08x\n", + ts_data->prev_keys[i].full_field); + release_key(&ts_data->prev_keys[i], RELEASE_KEY); + } + } + } + + scan_status &= SCAN_CNT_MASK; + + /* Status of IC is lock-up */ + if (scan_status == ist30xx_scan_count) { + tsp_warn("TSP IC is not responded!\n"); + goto retry_timer; + } + } + + ist30xx_scan_count = scan_status; + + return; + +retry_timer: + tsp_warn("Retry scan status!\n"); + + if (ist30xx_scan_retry++ == ist30xx_max_scan_retry) { + schedule_delayed_work(&work_reset_check, 0); + ist30xx_scan_retry = 0; + } +# endif // IST30XX_NOISE_MODE +} + +static void debug_work_func(struct work_struct *work) +{ +# if IST30XX_ALGORITHM_MODE + int ret = -EPERM; + ALGR_INFO algr; + u32 *buf32 = (u32 *)&algr; + + ret = ist30xxb_burst_read(ts_data->client, + ist30xx_algr_addr, (u32 *)&algr, ist30xx_algr_size); + if (ret) { + tsp_warn("Algorithm mem addr read fail!\n"); + return; + } + + tsp_debug(" 0x%08x 0x%08x 0x%08x 0x%08x 0x&08x\n", + buf32[0], buf32[1], buf32[2], buf32[3], buf32[4]); + + tsp_debug(" Scanstatus: %x\n", algr.scan_status); + tsp_debug(" TouchCnt: %d\n", algr.touch_cnt); + tsp_debug(" IntlTouchCnt: %d\n", algr.intl_touch_cnt); + tsp_debug(" StatusFlag: %d\n", algr.status_flag); + tsp_debug(" RAWPeakMax: %d\n", algr.raw_peak_max); + tsp_debug(" RAWPeakMin: %d\n", algr.raw_peak_min); + tsp_debug(" FLTPeakMax: %d\n", algr.flt_peak_max); + tsp_debug(" AdptThreshold: %d\n", algr.adpt_threshold); + tsp_debug(" KeyRawData0: %d\n", algr.key_raw_data[0]); + tsp_debug(" KeyRawData1: %d\n", algr.key_raw_data[1]); +# endif // IST30XX_ALGORITHM_MODE + } + +void timer_handler(unsigned long data) +{ + u32 ms = 0; + struct ist30xx_status *status = &ts_data->status; + + if (ist30xx_irq_working) + goto restart_timer; + + if (status->event_mode) { + if ((status->power == 1) && (status->update != 1)) { + ms = (u32)get_milli_second(); + if (status->calib == 1) { + if (ms - event_ms >= 3000) { // 3second + tsp_debug("calibration timeout over 3sec\n"); + schedule_delayed_work(&work_reset_check, 0); + status->calib = 0; + } + } else if (status->noise_mode) { + schedule_delayed_work(&work_noise_protect, 0); + } + +# if IST30XX_ALGORITHM_MODE + if ((ist30xx_algr_addr >= IST30XXB_ACCESS_ADDR) && + (ist30xx_algr_size > 0)) + schedule_delayed_work(&work_debug_algorithm, 0); + +# endif // IST30XX_ALGORITHM_MODE + } + } + +restart_timer: + mod_timer(&idle_timer, get_jiffies_64() + (HZ * timer_period_ms / 1000)); +} +#endif // IST30XX_EVENT_MODE + +extern int sec_touch_sysfs(struct ist30xx_data *data); +extern int sec_fac_cmd_init(struct ist30xx_data *data); + +static int ist30xx_probe(struct i2c_client * client, + const struct i2c_device_id * id) +{ + int ret; + int retry = 3; + struct ist30xx_data *data; + struct input_dev *input_dev; + int ist_gpio = 0; + struct tsp_dev_info *pdata = client->dev.platform_data; + printk("[TSP] %s(), the i2c addr=0x%x", __func__, client->addr); + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + +#ifdef CONFIG_OF + + struct device_node *np = client->dev.of_node; + + printk("[TSP] the client->dev.of_node=0x%x\n", client->dev.of_node); + + if (client->dev.of_node){ + ist_gpio = of_get_gpio(np, 0); + printk("[TSP] gpio id=%d", ist_gpio); + } +#endif + + input_dev = input_allocate_device(); + if (!input_dev) { + ret = -ENOMEM; + tsp_err("%s(), input_allocate_device failed (%d)\n", __func__, ret); + goto err_alloc_dev; + } + + data->max_fingers = data->max_keys = IST30XX_MAX_MT_FINGERS; + data->irq_enabled = 1; + data->client = client; + data->input_dev = input_dev; + i2c_set_clientdata(client, data); + + input_mt_init_slots(input_dev, IST30XX_MAX_MT_FINGERS, 0); + + input_dev->name = "ist30xx_ts_input"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + set_bit(EV_ABS, input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, IST30XX_MAX_X, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, IST30XX_MAX_Y, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, IST30XX_MAX_W, 0, 0); + +#if IST30XX_USE_KEY + { + int i; + set_bit(EV_KEY, input_dev->evbit); + set_bit(EV_SYN, input_dev->evbit); + for (i = 1; i < ARRAY_SIZE(ist30xx_key_code); i++) + set_bit(ist30xx_key_code[i], input_dev->keybit); + } +#endif + + input_set_drvdata(input_dev, data); + ret = input_register_device(input_dev); + if (ret) { + input_free_device(input_dev); + goto err_reg_dev; + } + + ts_data = data; + ist30xx_power_on(); + ret = ist30xx_init_system(); + if (ret) { + dev_err(&client->dev, "chip initialization failed\n"); + goto err_init_drv; + } + + ret = ist30xx_init_update_sysfs(); + if (ret) + goto err_init_drv; + +#if IST30XX_DEBUG + ret = ist30xx_init_misc_sysfs(); + if (ret) + goto err_init_drv; +#endif +#if 0 +# if IST30XX_FACTORY_TEST + ret = sec_fac_cmd_init(data); + if (ret) + goto err_init_drv; + ret = sec_touch_sysfs(data); + if (ret) + goto err_init_drv; +#endif + +#if IST30XX_TRACKING_MODE + ret = ist30xx_init_tracking_sysfs(); + if (ret) + goto err_init_drv; +#endif +#endif + +#ifndef CONFIG_OF + ist_gpio = pdata->gpio; +#endif + /* configure touchscreen interrupt gpio */ + ret = gpio_request(ist_gpio, "ist30xx_irq_gpio"); + printk("[TSP] pdata->gpio : %d\n", ist_gpio); + if (ret) { + tsp_err("unable to request gpio.(%s)\r\n",input_dev->name); + goto err_init_drv; + } + + client->irq = gpio_to_irq(ist_gpio); + + printk("[TSP] client->irq : %d\n", client->irq); + ret = request_threaded_irq(client->irq, NULL, ist30xx_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "ist30xx_ts", data); + if (ret) + goto err_irq; + + ist30xx_disable_irq(data); + + while (data->chip_id != IST30XXB_CHIP_ID) { + ist30xx_read_cmd(data->client, IST30XXB_REG_CHIPID, &data->chip_id); + data->chip_id = (data->chip_id == 0x3000B ? IST30XXB_CHIP_ID : 0); + + if (retry-- == 0) + break;//goto err_irq; + } + + retry = 3; + while (retry-- > 0) { + ret = ist30xx_read_cmd(data->client, IST30XXB_REG_TSPTYPE, + &data->tsp_type); + if (ret) continue; + + tsp_debug("tsptype: %x\n", data->tsp_type); + data->tsp_type = IST30XXB_PARSE_TSPTYPE(data->tsp_type); + + if (ret == 0) + break; + } + if (retry == 0) + data->tsp_type = TSP_TYPE_UNKNOWN; + + tsp_info("TSP IC: %x, TSP Vendor: %x\n", data->chip_id, data->tsp_type); + +#if IST30XX_EVENT_MODE + data->status.event_mode = false; +#endif +#if IST30XX_INTERNAL_BIN +# if IST30XX_UPDATE_BY_WORKQUEUE + INIT_DELAYED_WORK(&work_fw_update, fw_update_func); + schedule_delayed_work(&work_fw_update, IST30XX_UPDATE_DELAY); +# else + ret = ist30xx_auto_bin_update(data); //sinjan.kumar + if (ret != 0) + goto err_irq; +# endif +#endif // IST30XX_INTERNAL_BIN + + ret = ist30xx_get_info(data); + tsp_info("Get info: %s\n", (ret == 0 ? "success" : "fail")); + + INIT_DELAYED_WORK(&work_reset_check, reset_work_func); + INIT_DELAYED_WORK(&work_noise_protect, noise_work_func); + INIT_DELAYED_WORK(&work_debug_algorithm, debug_work_func); + +#if IST30XX_EVENT_MODE + init_timer(&idle_timer); + idle_timer.function = timer_handler; + idle_timer.expires = jiffies_64 + (EVENT_TIMER_INTERVAL); + + mod_timer(&idle_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +#endif + + +#ifdef CONFIG_HAS_EARLYSUSPEND + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + data->early_suspend.suspend = ist30xx_early_suspend; + data->early_suspend.resume = ist30xx_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + ist30xx_initialized = 1; + printk("[TSP] Probe end\n"); + return 0; + +err_irq: + tsp_debug("ChipID: %x\n", data->chip_id); + ist30xx_disable_irq(data); + free_irq(client->irq, data); +err_init_drv: +#if IST30XX_EVENT_MODE + data->status.event_mode = false; +#endif + tsp_err("Error, ist30xx init driver\n"); + ist30xx_power_off(); + input_unregister_device(input_dev); + return 0; + +err_reg_dev: +err_alloc_dev: + tsp_err("Error, ist30xx mem free\n"); + kfree(data); + return 0; +} + + +static int ist30xx_remove(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + + free_irq(client->irq, data); + ist30xx_power_off(); + + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + + +static struct i2c_device_id ist30xx_idtable[] = { + { IST30XX_DEV_NAME, 0 }, + {}, +}; + + +MODULE_DEVICE_TABLE(i2c, ist30xx_idtable); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static const struct dev_pm_ops ist30xx_pm_ops = { + .suspend = ist30xx_suspend, + .resume = ist30xx_resume, +}; +#endif + +#ifdef CONFIG_OF +static const struct of_device_id ist30xxb_ts_of_match[] = { + { .compatible = "Imagis,IST30XXB", }, + { } +}; +#endif + +static struct i2c_driver ist30xx_i2c_driver = { + .id_table = ist30xx_idtable, + .probe = ist30xx_probe, + .remove = ist30xx_remove, + .driver = { + .owner = THIS_MODULE, + .name = IST30XX_DEV_NAME, +#ifdef CONFIG_HAS_EARLYSUSPEND + .pm = &ist30xx_pm_ops, +#endif +#ifdef CONFIG_OF + .of_match_table = ist30xxb_ts_of_match, +#endif + + }, +}; + + +static int __init ist30xx_init(void) +{ +// #if PRINT_TSP_LOG + printk("[TSP] ist30xx_init\n"); +// #endif + + + return i2c_add_driver(&ist30xx_i2c_driver); +} + + +static void __exit ist30xx_exit(void) +{ + i2c_del_driver(&ist30xx_i2c_driver); +} + +module_init(ist30xx_init); +module_exit(ist30xx_exit); + +MODULE_DESCRIPTION("Imagis IST30XX touch driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_factory.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_factory.c new file mode 100755 index 00000000..aecc6825 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_factory.c @@ -0,0 +1,592 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include + +#include +#include "ist30xxb_update.h" +#include "ist30xxb_misc.h" +#include "ist30xxb_tsp.h" + +extern struct ist30xx_data *ts_data; +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; + + +#define TSP_BUF_SIZE (1024) +/* /sys/class/factory/tsp/close_tsp_test */ +ssize_t factory_tsp_test_close_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp test close\n"); + + return snprintf(buf, TSP_BUF_SIZE, "%u\n", 0); +} + +/* /sys/class/factory/tsp/cmd_status */ +ssize_t factory_tsp_cmd_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp cmd status : Ready"); + + return snprintf(buf, sizeof(char) * 16, "Ready\n"); +} + +/* /sys/class/factory/tsp/cmd_result */ +ssize_t factory_tsp_cmd_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp cmd result : Ready"); + + return snprintf(buf, sizeof(char) * 16, "Ready\n"); +} + +/* /sys/class/factory/tsp/cmd */ +ssize_t factory_tsp_cmd_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + printk("[TSP] tsp cmd store\n"); + + return size; +} + +/* /sys/class/factory/tsp/intensity_logging_on */ +ssize_t factory_tsp_intensity_log_on(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp intensity logging on : Ready"); + + return snprintf(buf, sizeof(char) * 16, "Ready\n"); +} + +/* /sys/class/factory/tsp/intensity_logging_off */ +ssize_t factory_tsp_intensity_log_off(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp intensity logging off : Ready"); + + return snprintf(buf, sizeof(char) * 16, "Ready\n"); +} + + +extern ssize_t ist30xx_frame_refresh(struct device *dev, struct device_attribute *attr, char *buf); +/* /sys/class/factory/tsp/read_frame */ +ssize_t factory_tsp_read_frame_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + + ret = ist30xx_enter_debug_mode(); + if (ret) + return snprintf(buf, sizeof(char) * 16, "fail, factory_read_frame\n"); + + ist30xx_frame_refresh(dev, attr, buf); + + return snprintf(buf, sizeof(char) * 16, "factory_read_frame\n"); +} + +static u16 *node_raw_buf; +static u16 *node_baseline_buf; +/* sysfs: /sys/class/factory/tsp/read_node */ +ssize_t factory_tsp_read_node_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + + ret = ist30xx_read_tsp_node(node_raw_buf, node_baseline_buf); + if (ret) + return snprintf(buf, sizeof(char) * 16, "fail, factory_read_frame\n"); + + return 0; +} + +/* sysfs: /sys/class/factory/tsp/raw */ +ssize_t factory_tsp_raw_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, j; + int count = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ist30xx_parse_tsp_node(node_raw_buf, node_baseline_buf); + + for (i = 0; i < tsp->height; i++) { + for (j = 0; j < tsp->width; j++) { + count += snprintf(msg, msg_len, "%04d ", *node_raw_buf++); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + + return count; +} +/* sysfs: /sys/class/factory/tsp/baseline */ +ssize_t factory_tsp_baseline_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, j; + int count = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ist30xx_parse_tsp_node(node_raw_buf, node_baseline_buf); + + for (i = 0; i < tsp->height; i++) { + for (j = 0; j < tsp->width; j++) { + count += snprintf(msg, msg_len, "%04d ", *node_baseline_buf++); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + + return count; +} +/* sysfs: /sys/class/factory/tsp/diff */ +ssize_t factory_tsp_diff_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, j; + int count = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ist30xx_parse_tsp_node(node_raw_buf, node_baseline_buf); + + for (i = 0; i < tsp->height; i++) { + for (j = 0; j < tsp->width; j++) { + count += snprintf(msg, msg_len, "%4d ", + (*node_raw_buf++) - (*node_baseline_buf++)); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + + return count; +} + + +/* /sys/class/factory/tsp/chip_vendor */ +ssize_t factory_tsp_chip_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + + ist30xx_disable_irq(ts_data); + + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CHIP_ID, &ts_data->chip_id); + if (ret) + return sprintf(buf, "NULL"); + + ist30xx_enable_irq(ts_data); + + if ((ts_data->chip_id != IST30XX_CHIP_ID) && + (ts_data->chip_id != IST30XXA_CHIP_ID)) + return sprintf(buf, "NULL"); + + printk("[TSP] tsp chip vendor: %s\n", IST30XX_CHIP_VENDOR); + + return sprintf(buf, "%s\n", IST30XX_CHIP_VENDOR); +} + +/* /sys/class/factory/tsp/chip_name */ +ssize_t factory_tsp_chip_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + + ist30xx_disable_irq(ts_data); + + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CHIP_ID, &ts_data->chip_id); + if (ret) + return sprintf(buf, "NULL"); + + ist30xx_enable_irq(ts_data); + + if ((ts_data->chip_id != IST30XX_CHIP_ID) && + (ts_data->chip_id != IST30XXA_CHIP_ID)) + return sprintf(buf, "NULL"); + + printk("[TSP] tsp chip name: %s\n", IST30XX_CHIP_NAME); + + return sprintf(buf, "%s\n", IST30XX_CHIP_NAME); +} + +/* /sys/class/factory/tsp/panel_vendor */ +ssize_t factory_tsp_panel_vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + u32 panel_vendor; + + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_VENDOR, &panel_vendor); + if (ret) + return sprintf(buf, "NULL"); + /* + * TSP panel_vendor + * - ALPS 1 + * - SUNTEL 2 + * - TOVIS 3 + * - ILJIN 4 + * - SYNOPEX 5 + * - TAEYANG 6 + */ + + ist30xx_enable_irq(ts_data); + + printk("[TSP] tsp panel vendor: %d\n", panel_vendor); + + return sprintf(buf, "%d\n", panel_vendor); +} + +/* /sys/class/factory/tsp/fw_ver */ +ssize_t factory_tsp_fw_ver_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + + ist30xx_disable_irq(ts_data); + + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_FW_VER, &ts_data->fw.core_ver); + if (ret) + return sprintf(buf, "NULL"); + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_PARAM_VER, &ts_data->fw.param_ver); + if (ret) + return sprintf(buf, "NULL"); + + ist30xx_enable_irq(ts_data); + + printk("[TSP] tsp version: %d.%d(%d.%d.%d)\n", + (ts_data->fw.param_ver >> 8) & 0xFF, ts_data->fw.param_ver & 0xFF, + (ts_data->fw.core_ver >> 16) & 0xFF, (ts_data->fw.core_ver >> 8) & 0xFF, + ts_data->fw.core_ver & 0xFF); + + return sprintf(buf, "%d.%d(%d.%d.%d)\n", + (ts_data->fw.param_ver >> 8) & 0xFF, ts_data->fw.param_ver & 0xFF, + (ts_data->fw.core_ver >> 16) & 0xFF, (ts_data->fw.core_ver >> 8) & 0xFF, + ts_data->fw.core_ver & 0xFF); +} + +/* /sys/class/factory/tsp/raw_range */ +ssize_t factory_tsp_raw_range_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp raw range: %d~%d\n", + IST30XX_MIN_RAW_DATA, IST30XX_MAX_RAW_DATA); + + return sprintf(buf, "%d,%d\n", IST30XX_MIN_RAW_DATA, IST30XX_MAX_RAW_DATA); +} + +/* /sys/class/factory/tsp/base_range */ +ssize_t factory_tsp_base_range_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp base range: %d~%d\n", + IST30XX_MIN_BASELINE, IST30XX_MAX_BASELINE); + + return sprintf(buf, "%d,%d\n", IST30XX_MIN_BASELINE, IST30XX_MAX_BASELINE); +} + +/* /sys/class/factory/tsp/zval_range */ +ssize_t factory_tsp_zval_range_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp raw range: %d~%d\n", + IST30XX_MIN_ZVALUE_TSP, IST30XX_MAX_ZVALUE_TSP); + + return sprintf(buf, "%d,%d\n", + IST30XX_MIN_ZVALUE_TSP, IST30XX_MAX_ZVALUE_TSP); +} + +/* /sys/class/factory/tsp/node_num */ +ssize_t factory_tsp_node_num_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tsp node num: width:%d, height: %d\n", + ist30xx_tsp_info.width, ist30xx_tsp_info.height); + + return sprintf(buf, "%d,%d\n", + ist30xx_tsp_info.width, ist30xx_tsp_info.height); +} + + +/* /sys/class/factory/tkey/tkey_back */ +ssize_t factory_back_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int key_state = 0; + + printk("[TSP] back tkey state: %d\n", key_state); + + return snprintf(buf, sizeof(buf), "%d\n", key_state); +} + +/* /sys/class/factory/tkey/tkey_menu */ +ssize_t factory_menu_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int key_state = 0; + + printk("[TSP] menu tkey state: %d\n", key_state); + + return snprintf(buf, sizeof(int), "%d\n", key_state); +} + +/* /sys/class/factory/tkey/tkey_hom */ +ssize_t factory_home_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int key_state = 0; + + printk("[TSP] home tkey state: %d\n", key_state); + + return snprintf(buf, sizeof(int), "%d\n", key_state); +} + +/* /sys/class/factory/tkey/tkey_recent */ +ssize_t factory_recent_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int key_state = 0; + + printk("[TSP] recent tkey state: %d\n", key_state); + + return snprintf(buf, sizeof(int), "%d\n", key_state); +} + +/* /sys/class/factory/tkey/tkey_threshold */ +ssize_t factory_tkey_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int threshold = 0; + + printk("[TSP] touch tkey threshold: %d\n", threshold); + + return snprintf(buf, sizeof(int), "%d\n", threshold); +} + +/* /sys/class/factory/tkey/tkey_raw_data0 */ +ssize_t factory_tkey_rawcnt0_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int raw_cnt = 0; + + printk("[TSP] raw counter0: %d\n", raw_cnt); + + return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + +/* /sys/class/factory/tkey/tkey_raw_data1 */ +ssize_t factory_tkey_rawcnt1_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int raw_cnt = 0; + + printk("[TSP] raw counter1: %d\n", raw_cnt); + + return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + +/* /sys/class/factory/tkey/tkey_raw_data2 */ +ssize_t factory_tkey_rawcnt2_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int raw_cnt = 0; + + printk("[TSP] raw counter2: %d\n", raw_cnt); + + return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + +/* /sys/class/factory/tkey/tkey_raw_data3 */ +ssize_t factory_tkey_rawcnt3_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int raw_cnt = 0; + + printk("[TSP] raw counter3 : %d\n", raw_cnt); + + return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + + +extern int key_sensitivity; +/* /sys/class/factory/tkey/tkey_zvalue */ +ssize_t factory_tkey_zvalue_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] tkey zvalue: %d\n", key_sensitivity); + + return snprintf(buf, sizeof(int), "%d\n", key_sensitivity); +} + +/* /sys/class/factory/tkey/tkey_zval_range */ +ssize_t factory_tkey_zval_range_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk("[TSP] zvalue range: %d~%d\n", + IST30XX_MIN_ZVALUE_TKEY, IST30XX_MAX_ZVALUE_TKEY); + + return sprintf(buf, "%d,%d\n", + IST30XX_MIN_ZVALUE_TKEY, IST30XX_MAX_ZVALUE_TKEY); +} + + +/* sysfs */ +static DEVICE_ATTR(close_tsp_test, S_IRUGO, factory_tsp_test_close_show, NULL); +static DEVICE_ATTR(cmd_status, S_IRUGO, factory_tsp_cmd_status_show, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, factory_tsp_cmd_result_show, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, factory_tsp_cmd_store); + +static DEVICE_ATTR(intensity_logging_on, S_IRUGO, factory_tsp_intensity_log_on, + NULL); +static DEVICE_ATTR(intensity_logging_off, S_IRUGO, factory_tsp_intensity_log_off, + NULL); + +static DEVICE_ATTR(read_frame, S_IRUGO, factory_tsp_read_frame_show, NULL); +static DEVICE_ATTR(read_node, S_IRUGO, factory_tsp_read_node_show, NULL); +static DEVICE_ATTR(raw, S_IRUGO, factory_tsp_raw_show, NULL); +static DEVICE_ATTR(baseline, S_IRUGO, factory_tsp_baseline_show, NULL); +static DEVICE_ATTR(diff, S_IRUGO, factory_tsp_diff_show, NULL); +static DEVICE_ATTR(chip_vendor, S_IRUGO, factory_tsp_chip_vendor_show, NULL); +static DEVICE_ATTR(chip_name, S_IRUGO, factory_tsp_chip_name_show, NULL); +static DEVICE_ATTR(panel_vendor, S_IRUGO, factory_tsp_panel_vendor_show, NULL); +static DEVICE_ATTR(fw_ver, S_IRUGO, factory_tsp_fw_ver_show, NULL); +static DEVICE_ATTR(raw_range, S_IRUGO, factory_tsp_raw_range_show, NULL); +static DEVICE_ATTR(base_range, S_IRUGO, factory_tsp_base_range_show, NULL); +static DEVICE_ATTR(zval_range, S_IRUGO, factory_tsp_zval_range_show, NULL); +static DEVICE_ATTR(node_num, S_IRUGO, factory_tsp_node_num_show, NULL); + +static struct attribute *factory_tsp_attributes[] = { + &dev_attr_close_tsp_test.attr, + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + + &dev_attr_intensity_logging_on.attr, + &dev_attr_intensity_logging_off.attr, + + &dev_attr_read_frame.attr, + &dev_attr_read_node.attr, + &dev_attr_raw.attr, + &dev_attr_baseline.attr, + &dev_attr_diff.attr, + &dev_attr_chip_vendor.attr, + &dev_attr_chip_name.attr, + &dev_attr_panel_vendor.attr, + &dev_attr_fw_ver.attr, + &dev_attr_raw_range.attr, + &dev_attr_base_range.attr, + &dev_attr_zval_range.attr, + &dev_attr_node_num.attr, + + NULL, +}; +static struct attribute_group factory_tsp_attr_group = { + .attrs = factory_tsp_attributes, +}; + +static DEVICE_ATTR(tkey_back, S_IRUGO, factory_back_key_state_show, NULL); +static DEVICE_ATTR(tkey_home, S_IRUGO, factory_home_key_state_show, NULL); +static DEVICE_ATTR(tkey_menu, S_IRUGO, factory_menu_key_state_show, NULL); +static DEVICE_ATTR(tkey_recent, S_IRUGO, factory_recent_key_state_show, NULL); +static DEVICE_ATTR(tkey_threshold, S_IRUGO, factory_tkey_threshold_show, NULL); +static DEVICE_ATTR(tkey_raw_data0, S_IRUGO, factory_tkey_rawcnt0_show, NULL); +static DEVICE_ATTR(tkey_raw_data1, S_IRUGO, factory_tkey_rawcnt1_show, NULL); +static DEVICE_ATTR(tkey_raw_data2, S_IRUGO, factory_tkey_rawcnt2_show, NULL); +static DEVICE_ATTR(tkey_raw_data3, S_IRUGO, factory_tkey_rawcnt3_show, NULL); +static DEVICE_ATTR(tkey_zvalue, S_IRWXUGO, factory_tkey_zvalue_show, NULL); +static DEVICE_ATTR(tkey_zval_range, S_IRUGO, factory_tkey_zval_range_show, NULL); + +static struct attribute *factory_tkey_attributes[] = { + &dev_attr_tkey_back.attr, + &dev_attr_tkey_home.attr, + &dev_attr_tkey_menu.attr, + &dev_attr_tkey_recent.attr, + &dev_attr_tkey_threshold.attr, + &dev_attr_tkey_raw_data0.attr, + &dev_attr_tkey_raw_data1.attr, + &dev_attr_tkey_raw_data2.attr, + &dev_attr_tkey_raw_data3.attr, + + &dev_attr_tkey_zvalue.attr, + &dev_attr_tkey_zval_range.attr, + NULL, +}; +static struct attribute_group factory_tkey_attr_group = { + .attrs = factory_tkey_attributes, +}; + + +struct class *factory_dev_class; +struct device *factory_tsp_dev; +struct device *factory_tk_dev; + + +int ist30xx_init_factory_sysfs(void) +{ + factory_dev_class = class_create(THIS_MODULE, "factory"); + if (!factory_dev_class) + pr_err("[ TSP ] Failed to create device class(%s)!\n", "factory"); + + /* /sys/class/factory/tsp */ + factory_tsp_dev = device_create(factory_dev_class, NULL, 0, NULL, "tsp"); + + /* /sys/class/factory/tsp/... */ + if (sysfs_create_group(&factory_tsp_dev->kobj, &factory_tsp_attr_group)) + pr_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tsp"); + + /* /sys/class/factory/tkey */ + factory_tk_dev = device_create(factory_dev_class, NULL, 0, NULL, "tkey"); + + /* /sys/class/factory/tkey/... */ + if (sysfs_create_group(&factory_tk_dev->kobj, &factory_tkey_attr_group)) + pr_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tkey"); + + node_raw_buf = kmalloc(4096, GFP_KERNEL); + node_baseline_buf = kmalloc(4096, GFP_KERNEL); + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_fw_pikeayoung2dtv_ver0001.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_fw_pikeayoung2dtv_ver0001.h new file mode 100644 index 00000000..d9f54435 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_fw_pikeayoung2dtv_ver0001.h @@ -0,0 +1,2166 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: Fame2 TOPTOUCH, f/w 1(00030301) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x40,0x00,0x00,0x20,0x94,0x02,0x00,0x00,0xCC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x30,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x10,0xB4,0x2B,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x20,0x48,0x10,0xD1,0x91,0x06,0x0E,0xD1, + 0x0A,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xCE,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0B,0x48, + 0x0E,0xD1,0x89,0x06,0x0C,0xD1,0x08,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0xA5,0xFF,0x64,0x1E,0x60,0x1C,0xF3,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0x30,0xFE,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x2C,0x0B,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0xF9,0xFC,0x07,0x00,0x03,0xF0,0x14,0xFC,0x03,0xF0,0x06,0xFC, + 0x03,0xF0,0x8C,0xFC,0x48,0x4A,0x49,0x49,0x49,0x48,0x04,0xF0,0x22,0xFE,0x49,0x4D, + 0x00,0x26,0x01,0x21,0xC9,0x03,0x30,0x00,0xEE,0x81,0x00,0xF0,0x93,0xF9,0xA8,0x61, + 0x45,0x49,0x00,0x20,0x00,0xF0,0x8E,0xF9,0x44,0x4B,0x45,0x49,0xD8,0x63,0x45,0x48, + 0x00,0xF0,0x88,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x4E,0xFC, + 0xA1,0x22,0x41,0x48,0xD2,0x00,0x00,0x21,0x04,0xF0,0x0E,0xFE,0x06,0xF0,0xC8,0xF9, + 0x03,0xF0,0xF0,0xFC,0x3D,0x48,0x01,0x24,0x81,0x7A,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0xFF,0x20,0x91,0x30,0x6E,0x72,0x28,0x82,0xAE,0x72,0xEE,0x72, + 0x35,0x48,0x2E,0x73,0x64,0x07,0x6E,0x73,0x60,0x63,0xFF,0x20,0xE0,0x63,0xE0,0x14, + 0x00,0xF0,0x8E,0xFC,0x32,0x48,0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0x88,0xFC, + 0x30,0x49,0x02,0x20,0x06,0xF0,0xB8,0xFC,0x02,0x20,0x06,0xF0,0xBD,0xFC,0x28,0x7A, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0x6A,0xFD,0x00,0x2F,0x1F,0xD1,0x2A,0x4F,0xBE,0x15, + 0x28,0x7A,0x00,0x28,0x02,0xD0,0x29,0x49,0x28,0x6B,0x88,0x60,0xE0,0x6B,0x0B,0x28, + 0x14,0xD0,0x27,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0,0xAF,0xFA,0xF8,0x68, + 0x24,0x49,0x88,0x42,0xEC,0xD9,0x24,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB8,0x68, + 0xB0,0x43,0xB8,0x60,0xB8,0x68,0x30,0x43,0xB8,0x60,0xE1,0xE7,0xE8,0x79,0x00,0x28, + 0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x4B,0xFC,0x28,0x7A,0x00,0x28,0x01,0xD0, + 0x06,0xF0,0x44,0xFD,0x02,0x20,0x06,0xF0,0x93,0xFC,0xFF,0x20,0x81,0x30,0x00,0xF0, + 0x3F,0xFC,0x16,0x49,0x05,0x20,0x03,0xF0,0x2D,0xFA,0x0B,0x20,0xE0,0x63,0x03,0xF0, + 0xBD,0xFA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x28,0x00,0x00,0x00,0x7C,0x71,0x00,0x00, + 0x40,0x00,0x00,0x20,0xF8,0x0A,0x00,0x20,0xC0,0x75,0x00,0x00,0xC0,0x0F,0x00,0x20, + 0x00,0x7E,0x00,0x00,0x00,0x76,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xAD,0x0B,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40, + 0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x75,0x00,0x00,0xAD,0x6E,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3, + 0xA0,0x30,0x71,0xE0,0x1A,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x20,0x34,0x71,0xE0,0x01,0x00,0x00,0x3A,0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0, + 0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3, + 0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3, + 0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3, + 0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A, + 0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5,0x02,0x20,0x06,0xF0,0x87,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0, + 0xA6,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0x98,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3, + 0xB7,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x41,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0xD1,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x79,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x1B,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68, + 0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF, + 0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0F,0x24,0x02,0xF0, + 0xF0,0xF8,0x64,0x1E,0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68, + 0x17,0x4E,0xB0,0x7E,0xC0,0x07,0x26,0xD0,0x70,0x7D,0x00,0x28,0x21,0xD0,0xBA,0x00, + 0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A, + 0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49, + 0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0,0xFD,0xF8,0x64,0x1C, + 0x70,0x7D,0xA0,0x42,0xF3,0xDA,0x70,0x7D,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1, + 0x01,0x25,0x70,0x7D,0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x86,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B, + 0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7D,0xE4,0x00,0xE6,0x18, + 0x09,0x24,0xE4,0x01,0x36,0x19,0xB5,0x73,0x56,0x7D,0x45,0x88,0xF6,0x00,0xF6,0x18, + 0x36,0x19,0x35,0x82,0x56,0x7D,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x75,0x82, + 0x55,0x7D,0xED,0x00,0xED,0x18,0x2D,0x19,0x29,0x75,0x55,0x7D,0xC1,0x79,0xED,0x00, + 0xEB,0x18,0x1B,0x19,0x59,0x75,0x51,0x7D,0x49,0x1C,0x51,0x75,0xC0,0x79,0x06,0x28, + 0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x75,0x70,0xBC, + 0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xFF,0xB5,0x0A,0x20,0x48,0x43,0x15,0x4F,0x81,0xB0,0xC5,0x19,0x48,0x00,0xFF,0x35, + 0x61,0x35,0xC0,0x19,0xC0,0x30,0x2A,0x71,0x0C,0x00,0x00,0x90,0x80,0x89,0x16,0x00, + 0x0A,0x21,0xFF,0xF7,0x2F,0xFF,0xE8,0x80,0x00,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7, + 0x29,0xFF,0x28,0x81,0x38,0x19,0xFF,0x30,0x01,0x30,0x00,0x7C,0xB9,0x19,0x68,0x71, + 0x04,0x98,0xA8,0x72,0x01,0x98,0x06,0x55,0x13,0x20,0x40,0x01,0x08,0x18,0x00,0x21, + 0xC4,0x76,0x81,0x74,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20, + 0x06,0x48,0x0F,0x23,0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A, + 0xD2,0x18,0x09,0x03,0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0xF0,0x05,0x00,0x20, + 0xF1,0xB5,0xB2,0x48,0x90,0xB0,0x0F,0x90,0x40,0x7C,0xB2,0x49,0x02,0x90,0x0F,0x98, + 0xC0,0x7C,0x01,0x90,0x0F,0x98,0x00,0x7C,0x00,0x90,0xAD,0x48,0xC9,0x88,0x00,0x8A, + 0x49,0x06,0x02,0xD4,0xA9,0x48,0x40,0x30,0x80,0x89,0x00,0x05,0x7E,0xD5,0x10,0x98, + 0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x3E,0xE1,0x03,0x98, + 0x81,0x00,0x01,0x20,0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90, + 0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x7F,0xFB,0x26,0xE1, + 0x9D,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9A,0x49, + 0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80, + 0x4A,0x5B,0x24,0x31,0x4A,0x53,0x69,0x18,0x48,0x80,0x10,0xE1,0x02,0x9F,0x92,0x49, + 0x00,0x20,0x7F,0x1E,0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88, + 0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46, + 0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A,0x02,0x9A,0x87,0x4E,0x92,0x00,0x8B,0x18, + 0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90, + 0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00, + 0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B, + 0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7,0xAB,0xFD,0x07,0x00,0x02,0x99,0x30,0x00, + 0xFF,0xF7,0xA6,0xFD,0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42, + 0x17,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21, + 0x48,0x43,0x0A,0x21,0xFF,0xF7,0x6E,0xFE,0x61,0x00,0x00,0xE0,0xCA,0xE0,0x6A,0x4B, + 0x1C,0x3B,0x5A,0x5E,0x90,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x10,0x18,0x58,0x52, + 0x07,0xE0,0x65,0x49,0x0F,0x9A,0x60,0x00,0x1C,0x39,0x0B,0x5A,0x52,0x7D,0x9A,0x1A, + 0x0A,0x52,0x61,0x49,0x60,0x00,0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22, + 0x0A,0x52,0x08,0x5E,0x01,0x99,0x88,0x42,0x09,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0, + 0x88,0x00,0x05,0x21,0xFF,0xF7,0x46,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20, + 0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x3B,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0,0x01,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7, + 0x31,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98,0x05,0x21, + 0xFF,0xF7,0x28,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00, + 0x02,0xD1,0x45,0x49,0x0A,0x39,0x08,0x55,0x43,0x49,0x0C,0x9A,0x24,0x31,0x48,0x5F, + 0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A,0x3E,0x48, + 0x57,0x1A,0x06,0x91,0x0F,0x99,0x0A,0x38,0x00,0x5D,0x89,0x7D,0x88,0x42,0x27,0xD3, + 0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x00,0x99, + 0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7, + 0x1F,0xFD,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0xFF,0xF7,0x0D,0xFD,0x08,0x99,0x00,0x2E,0x19,0xDB,0x09,0x19,0x18,0xE0, + 0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99,0xFF,0xF7,0x02,0xFD,0x64,0x21,0x08,0x1A, + 0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7,0xF8,0xFC, + 0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21,0xE0,0xE7, + 0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A,0x16,0x4A, + 0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A,0x5A,0x80,0x13,0x4A,0x13,0x4B,0x24,0x32, + 0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43, + 0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98, + 0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42, + 0x00,0xDA,0xBC,0xE6,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00, + 0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0xCA,0x0B,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x10,0x4B,0x30,0xB4,0x27,0x21,0xDA,0x88,0x49,0x01,0x80,0x24,0x59,0x18,0x00,0x28, + 0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x8D,0x82,0xC5,0x89,0xCD,0x82,0x05,0x8A,0x0D,0x83, + 0x40,0x8A,0x48,0x83,0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43,0x88,0x83,0x06,0xE0, + 0x00,0x20,0x88,0x82,0xC8,0x82,0x08,0x83,0x48,0x83,0xA2,0x43,0x88,0x83,0xDA,0x80, + 0x30,0xBC,0x70,0x47,0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x7F,0xB5,0x24,0x4D, + 0x04,0x00,0x1A,0x28,0x0B,0xD1,0x28,0x6A,0x00,0x28,0x08,0xD1,0x68,0x6A,0x00,0x28, + 0x05,0xD1,0x20,0x4C,0x01,0xF0,0x86,0xFE,0x64,0x1E,0xFB,0xD2,0x14,0xE0,0x05,0xF0, + 0x57,0xF8,0x00,0x20,0x01,0xF0,0xF4,0xFC,0x01,0xF0,0x72,0xFD,0x01,0xF0,0xBA,0xFD, + 0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x4F,0xFA,0x03,0x00,0x01,0x9A,0x02,0x99, + 0x03,0x98,0x00,0x94,0x00,0xF0,0x30,0xF8,0x02,0x20,0x06,0xF0,0xC9,0xF8,0x02,0x20, + 0x06,0xF0,0xBA,0xF8,0x10,0x48,0xE9,0x68,0xC1,0x61,0x29,0x69,0xC1,0x61,0x0F,0x49, + 0xCA,0x68,0x52,0x08,0x52,0x00,0xCA,0x60,0x0D,0x4A,0x0E,0x49,0x02,0xE0,0xD3,0x68, + 0x8B,0x42,0x02,0xD8,0x43,0x69,0x9B,0x06,0xF9,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5, + 0x01,0xF0,0x66,0xFE,0x01,0x20,0x00,0xF0,0x6B,0xF8,0x7F,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x75,0x00,0x00,0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0, + 0xFF,0xF7,0xD0,0xF9,0x1C,0x48,0x01,0x27,0x04,0x04,0x24,0x0C,0x7F,0x02,0x00,0x22, + 0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23, + 0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0,0x92,0xF9,0x14,0x99, + 0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04, + 0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69, + 0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C, + 0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x06,0xF0,0xDC,0xF8, + 0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40, + 0xC0,0x75,0x00,0x00,0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00, + 0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3, + 0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1, + 0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47, + 0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47, + 0x40,0x00,0x00,0x40,0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x62,0x90,0xFF,0x49,0x40,0x1E, + 0x5E,0x90,0xCB,0x79,0xFE,0x4F,0xFF,0x48,0xFA,0x88,0x54,0x06,0x00,0xD4,0xC3,0x78, + 0x54,0x06,0x05,0x93,0x0B,0x7A,0x00,0xD4,0x03,0x79,0xFB,0x4C,0xA4,0x8A,0x1B,0x19, + 0x1B,0x06,0x1B,0x0E,0x04,0x93,0x4B,0x7A,0x54,0x06,0x00,0xD4,0x43,0x79,0x52,0x06, + 0x03,0x93,0x89,0x7A,0x00,0xD4,0x81,0x79,0x00,0x20,0xF4,0x4C,0x02,0x91,0x3D,0x79, + 0x01,0x26,0x01,0x90,0x13,0xE0,0x0A,0x20,0x70,0x43,0x43,0x21,0xC0,0x19,0xC9,0x00, + 0x09,0x5C,0x00,0x29,0x0A,0xD0,0xEE,0x49,0x40,0x18,0x02,0xF0,0x43,0xFE,0x00,0x28, + 0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x78, + 0xB0,0x42,0xE8,0xDA,0xE7,0x48,0x72,0x90,0xC2,0x8A,0x41,0x8B,0x50,0x1A,0x00,0x28, + 0x00,0xDC,0x88,0x1A,0x03,0x04,0x72,0x98,0x72,0x99,0x00,0x8B,0x89,0x8B,0x1B,0x0C, + 0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A,0x10,0x04,0x72,0x9A,0x00,0x21,0x91,0x74, + 0x72,0x9A,0x00,0x0C,0xD1,0x74,0x72,0x9A,0x11,0x75,0x01,0x99,0x00,0x29,0x10,0xD0, + 0x1E,0x2B,0x0E,0xD2,0x32,0x28,0x03,0xD2,0x72,0x98,0x01,0x21,0x81,0x74,0x08,0xE0, + 0x64,0x28,0x03,0xD2,0x72,0x99,0x01,0x20,0xC8,0x74,0x02,0xE0,0x72,0x98,0x01,0x21, + 0x01,0x75,0x72,0x98,0x40,0x7C,0x00,0x28,0x16,0xD1,0x72,0x98,0x80,0x7C,0x00,0x28, + 0x02,0xD0,0x05,0x98,0x80,0x1C,0x0C,0xE0,0x72,0x98,0xC0,0x7C,0x00,0x28,0x02,0xD0, + 0x05,0x98,0x00,0x1D,0x05,0xE0,0x72,0x98,0x00,0x7D,0x00,0x28,0x04,0xD0,0x05,0x98, + 0x80,0x1D,0x00,0x06,0x00,0x0E,0x05,0x90,0x09,0x22,0x00,0x21,0x5B,0xA8,0x04,0xF0, + 0x8B,0xF8,0xF8,0x88,0xFF,0x21,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x05,0xD5, + 0x01,0xF0,0xAE,0xF8,0x73,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x78,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0xE0,0x70,0x60,0x78,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0, + 0x18,0xE0,0x00,0x28,0x16,0xD1,0xB1,0x48,0x5A,0x22,0x00,0x21,0x5E,0x30,0x04,0xF0, + 0x6B,0xF8,0xE0,0x78,0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E, + 0x0A,0x00,0x14,0x23,0x5B,0xA8,0xFF,0xF7,0x7B,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD, + 0x25,0x70,0xE6,0xE1,0x09,0x22,0x01,0x21,0x58,0xA8,0x04,0xF0,0x55,0xF8,0x02,0x20, + 0xA3,0x49,0x06,0x90,0x9E,0x48,0x5D,0x31,0x41,0x18,0x71,0x91,0xA0,0x49,0x54,0x31, + 0x40,0x18,0x70,0x90,0x13,0xE1,0x08,0x26,0x07,0xAF,0x24,0x20,0x70,0x43,0x07,0xA9, + 0x40,0x18,0x00,0x21,0x24,0x22,0xC9,0x43,0x04,0xF0,0x3E,0xF8,0x76,0x1E,0xF4,0xD5, + 0x06,0x98,0x01,0xF0,0x0B,0xFC,0x01,0x27,0x5F,0x90,0x53,0xE0,0x5F,0x98,0x01,0x26, + 0x60,0x90,0x4B,0xE0,0x0A,0x20,0x70,0x43,0x8D,0x49,0x40,0x18,0x01,0x00,0xFF,0x30, + 0xFF,0x30,0x02,0x30,0x6F,0x90,0x00,0x7E,0x00,0x28,0x3E,0xD0,0x8C,0x48,0x08,0x18, + 0x6E,0x90,0x02,0xF0,0x7F,0xFD,0x06,0x99,0x08,0x43,0x07,0xD0,0x6E,0x98,0x02,0xF0, + 0x79,0xFD,0x00,0x28,0x31,0xD0,0x06,0x98,0x00,0x28,0x2E,0xD0,0x80,0x49,0x78,0x00, + 0x40,0x18,0xC0,0x30,0x6D,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0x6B,0xFB,0x6F,0x99, + 0x49,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A,0x6D,0x98,0x61,0x92,0xC0,0x8B, + 0x0A,0x21,0xFF,0xF7,0x5F,0xFB,0x6F,0x99,0x89,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC, + 0x42,0x1A,0x61,0x98,0x01,0x00,0x41,0x43,0x10,0x00,0x50,0x43,0x08,0x18,0x60,0x99, + 0x88,0x42,0x04,0xDA,0x24,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0x60,0x90,0x24,0x21, + 0x79,0x43,0x07,0xAA,0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x78,0xB0,0x42, + 0xB0,0xDA,0x7F,0x1C,0xAF,0x42,0xA9,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x23,0x5F,0x9A, + 0x18,0x00,0x15,0xE0,0x5B,0xA9,0x09,0x5C,0x00,0x29,0x10,0xD1,0x24,0x21,0x41,0x43, + 0x0F,0x00,0x07,0xAE,0x89,0x19,0xF6,0x59,0xB7,0x00,0xC9,0x59,0x91,0x42,0x06,0xDA, + 0x00,0x29,0x04,0xDB,0x00,0x2E,0x02,0xDB,0x0A,0x00,0x00,0x23,0x5E,0x90,0x40,0x1C, + 0xA8,0x42,0xE7,0xDD,0x00,0x2B,0x7E,0xD1,0x62,0x98,0x5E,0x9E,0x40,0x1C,0x62,0x90, + 0x24,0x20,0x46,0x43,0x07,0xA8,0x80,0x59,0x0A,0x21,0x48,0x43,0x50,0x49,0x0A,0x22, + 0x41,0x18,0x5E,0x98,0xFF,0x31,0x50,0x43,0x4D,0x4A,0xBF,0x31,0x87,0x18,0x38,0x00, + 0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0,0x8B,0xFF,0x5E,0x98,0x48,0x49,0x40,0x00, + 0x40,0x18,0xC0,0x30,0x6C,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0xFB,0xFA,0xFF,0x37, + 0x61,0x37,0xF8,0x80,0x6C,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0xF3,0xFA,0x38,0x81, + 0x3F,0x48,0x5E,0x99,0x40,0x18,0xFF,0x30,0x01,0x30,0x00,0x7C,0x78,0x71,0xB8,0x7A, + 0x05,0x99,0x49,0x1C,0x88,0x42,0x01,0xD2,0x40,0x1C,0xB8,0x72,0xB8,0x7A,0x13,0x28, + 0x6B,0x90,0x09,0xD9,0x14,0x21,0xFF,0xF7,0xDD,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42, + 0x02,0xD2,0x6B,0x98,0x14,0x30,0xB8,0x72,0x38,0x79,0x5E,0x9A,0x5B,0xA9,0x88,0x54, + 0x71,0x9A,0x5E,0x99,0x81,0x54,0x39,0x79,0x70,0x9A,0x00,0x20,0x88,0x54,0x07,0xA9, + 0x89,0x59,0x58,0xAA,0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x24,0x23,0x58,0x43, + 0x07,0xAB,0x6A,0x90,0xC0,0x18,0x69,0x90,0x9B,0x59,0x00,0x22,0xD2,0x43,0x9B,0x00, + 0xC2,0x50,0x5B,0xA8,0x40,0x5C,0x5F,0x9B,0x00,0x28,0x11,0xD1,0xA2,0x78,0x01,0x20, + 0x94,0x46,0x0B,0xE0,0x69,0x9A,0x87,0x00,0xD2,0x59,0x00,0x2A,0x05,0xDB,0x9A,0x42, + 0x07,0xAF,0x02,0xDA,0x6A,0x9B,0xF8,0x50,0x13,0x00,0x40,0x1C,0x84,0x45,0xF1,0xDA, + 0x49,0x1C,0xA9,0x42,0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x78,0x62,0x99,0x88,0x42, + 0x05,0xDD,0x64,0x98,0x40,0x1C,0xA8,0x42,0x64,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98, + 0x41,0x1E,0x09,0x06,0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE3,0xE6,0x01,0x26, + 0x65,0x96,0x63,0x90,0x6F,0xE0,0x58,0xA8,0x80,0x5D,0x00,0x28,0x6A,0xD0,0x65,0x98, + 0x07,0x49,0x2F,0x18,0x0A,0x20,0x70,0x43,0x40,0x18,0x68,0x90,0xFF,0x30,0xFF,0x30, + 0x02,0x30,0x67,0x90,0x00,0x7E,0x70,0x99,0x40,0x5C,0x0D,0xE0,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20, + 0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20,0x03,0x99,0x88,0x42,0x34,0xD2,0x08,0x2F, + 0x32,0xDC,0x4C,0x49,0x68,0x98,0x40,0x18,0x02,0xF0,0x5C,0xFC,0x00,0x28,0x2B,0xD0, + 0x67,0x98,0x70,0x99,0x00,0x7E,0x70,0x9A,0x47,0x4B,0x41,0x5C,0x49,0x1C,0x81,0x54, + 0x68,0x98,0x43,0x21,0xC9,0x00,0x41,0x18,0x0A,0x20,0x78,0x43,0xC0,0x18,0x66,0x90, + 0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0,0xCB,0xFE,0x68,0x99,0x66,0x98,0xFF,0x31, + 0xC1,0x31,0x4A,0x79,0xFF,0x30,0x61,0x30,0xC2,0x72,0x89,0x79,0x01,0x73,0x67,0x98, + 0x5B,0xA9,0x00,0x7E,0xC8,0x55,0x71,0x99,0x47,0x54,0x65,0x98,0x40,0x1C,0x65,0x90, + 0x63,0x98,0x40,0x1C,0x63,0x90,0x15,0xE0,0x32,0x49,0x68,0x98,0x32,0x4F,0x40,0x18, + 0x02,0xF0,0x28,0xFC,0x00,0x28,0x0D,0xD0,0x72,0x99,0x01,0x20,0x08,0x74,0x67,0x98, + 0x80,0x7F,0x13,0x28,0x06,0xD9,0x60,0x78,0x01,0x28,0x03,0xD1,0xF8,0x88,0x04,0x21, + 0x08,0x43,0xF8,0x80,0x76,0x1C,0xA0,0x78,0xB0,0x42,0x8C,0xDA,0x26,0x48,0xC0,0x88, + 0x41,0x07,0x05,0xD5,0x02,0x99,0x04,0x22,0xE1,0x70,0x23,0x49,0x90,0x43,0xC8,0x80, + 0x01,0x26,0x31,0xE0,0x5B,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x13,0x22,0x01,0x20, + 0x52,0x01,0x05,0x23,0xDB,0x01,0x1C,0x49,0x09,0x18,0x8F,0x18,0xFF,0x7E,0x00,0x2F, + 0x0C,0xD1,0xC9,0x18,0x09,0x79,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E, + 0x09,0x0E,0x01,0x23,0x5B,0xA8,0xFF,0xF7,0xAB,0xFA,0x02,0xE0,0x40,0x1C,0x09,0x28, + 0xE9,0xDB,0xE0,0x78,0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18, + 0x38,0x00,0xFF,0x30,0x6B,0x30,0x02,0xF0,0xDD,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20, + 0xFF,0x37,0x61,0x37,0xB8,0x72,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0x63,0x98,0x28,0x18, + 0x20,0x70,0x20,0x78,0x05,0x49,0x5A,0x22,0xA0,0x70,0x08,0x00,0xB4,0x30,0x03,0xF0, + 0x4F,0xFE,0xE7,0xE5,0x1E,0x02,0x00,0x00,0xF0,0x05,0x00,0x20,0x54,0x07,0x00,0x20, + 0xF1,0xB5,0x3C,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x3A,0x48,0x41,0x7F, + 0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D, + 0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20, + 0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x5C,0xF9,0x01,0xF0,0x0A,0xFA, + 0x00,0x24,0x27,0x00,0x37,0xE0,0x00,0x26,0x30,0xE0,0x31,0x00,0x38,0x00,0x02,0xF0, + 0xB1,0xF8,0x00,0x28,0x28,0xD0,0x29,0x78,0x05,0x9A,0x79,0x43,0x89,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D, + 0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x4E,0xFB,0x40,0x1C,0x14,0xD1, + 0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x05,0xF0,0x40,0xFB,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A, + 0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x13,0x4D,0x28,0x78, + 0x86,0x42,0xCA,0xD3,0x7F,0x1C,0x12,0x48,0x00,0x78,0x87,0x42,0xC3,0xD3,0x10,0x48, + 0x0E,0x49,0x00,0x78,0x09,0x78,0x48,0x43,0xA0,0x42,0x04,0xD1,0x04,0x98,0x07,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02, + 0x88,0x42,0xA9,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20, + 0x04,0x90,0xEC,0xE7,0x00,0x02,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xF0,0xB5,0x8A,0x4A,0xFF,0xB0,0x88,0xB0,0x40,0x18,0x85,0x92, + 0x42,0x00,0x80,0x18,0x84,0x90,0x48,0x42,0x83,0x90,0x86,0x48,0x86,0x4E,0x00,0x7A, + 0x02,0xAF,0x82,0x90,0x85,0x48,0x86,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0x83,0x98, + 0x40,0x42,0x83,0x90,0x01,0x22,0x52,0x02,0x00,0x21,0x30,0x00,0x03,0xF0,0xCC,0xFD, + 0x00,0x25,0x39,0xE0,0x00,0x24,0x32,0xE0,0x7C,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07, + 0x15,0xD0,0x7B,0x49,0x09,0x78,0x00,0x29,0x82,0x99,0x16,0xD0,0x8D,0x42,0x0E,0xD1, + 0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42, + 0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0x83,0x9A, + 0x21,0x00,0x28,0x00,0x05,0xF0,0xC8,0xFA,0x10,0xE0,0x8C,0x42,0xF7,0xD1,0x81,0x7D, + 0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0, + 0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x65,0x48, + 0x00,0x78,0x84,0x42,0xC8,0xD3,0x6D,0x1C,0x63,0x4C,0x20,0x78,0x85,0x42,0xC1,0xD3, + 0x01,0xF0,0x98,0xF8,0x01,0xF0,0x46,0xF9,0x00,0x25,0x2A,0xE0,0x00,0x24,0x23,0xE0, + 0x21,0x00,0x28,0x00,0x01,0xF0,0xEE,0xFF,0x00,0x28,0x12,0xD0,0x59,0x49,0x85,0x9B, + 0x09,0x78,0x69,0x43,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x5B,0xF8,0x4E,0x49,0x09,0x78,0x69,0x43, + 0x09,0x19,0x49,0x00,0x64,0x1C,0x78,0x52,0x4A,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3, + 0x6D,0x1C,0x49,0x48,0x01,0x78,0x8D,0x42,0xD0,0xD3,0x00,0x21,0x01,0x91,0x01,0xF0, + 0x11,0xF9,0x00,0x25,0x51,0xE0,0x00,0x24,0x4A,0xE0,0x21,0x00,0x28,0x00,0x01,0xF0, + 0xB9,0xFF,0x00,0x28,0x43,0xD0,0x3F,0x49,0x85,0x9B,0x09,0x78,0x69,0x43,0x09,0x19, + 0x8A,0x00,0x9A,0x58,0x03,0x04,0x12,0x05,0x12,0x0D,0x1B,0x0C,0xD3,0x1A,0x00,0x2B, + 0x01,0xDD,0x10,0x1A,0x00,0xE0,0x80,0x1A,0x49,0x00,0x73,0x5A,0x00,0x04,0x00,0x0C, + 0x83,0x42,0x0A,0xD9,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x21,0xF8,0x31,0x49, + 0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00,0x78,0x52,0x01,0x98,0x03,0x21,0xFF,0xF7, + 0x79,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0x86,0x98,0x00,0x7D,0x00,0x28, + 0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00, + 0x05,0xF0,0x04,0xFA,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xFC,0xF9,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C, + 0x1C,0x48,0x00,0x78,0x84,0x42,0xB0,0xD3,0x6D,0x1C,0x1B,0x48,0x00,0x78,0x85,0x42, + 0xA9,0xD3,0x01,0x98,0x40,0x1C,0x01,0x90,0x84,0x98,0x40,0x1E,0x84,0x90,0x1B,0xD2, + 0x14,0x4E,0x00,0x25,0x0E,0xE0,0x00,0x24,0x08,0xE0,0x68,0x43,0x00,0x19,0x40,0x00, + 0x3A,0x5A,0x21,0x00,0x28,0x00,0x05,0xF0,0xF9,0xF9,0x64,0x1C,0x30,0x78,0x84,0x42, + 0xF3,0xD3,0x6D,0x1C,0x0C,0x48,0x00,0x78,0x85,0x42,0xEC,0xD3,0x7F,0xB0,0x08,0xB0, + 0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0xF0,0xE4,0xFF,0x7F,0xE7,0x00,0x00, + 0x00,0x02,0x10,0x40,0x70,0x0A,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x78,0x00,0x00, + 0xFD,0x0A,0x00,0x20,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20, + 0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x7A,0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25, + 0x1F,0x4F,0xAD,0x01,0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7A,0x1B,0x0F, + 0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19,0xE4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42, + 0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19,0xC0,0x68,0x92,0x0A,0x83,0x05,0x92,0x02, + 0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43, + 0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46, + 0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x5E,0x48,0x8E,0x46, + 0x02,0x8C,0x5E,0x49,0x40,0x8C,0x01,0x91,0xCB,0x88,0x40,0x39,0x00,0x91,0x89,0x7E, + 0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71, + 0xA6,0xE0,0x01,0x99,0x09,0x79,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29, + 0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00, + 0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88, + 0xA1,0x88,0x87,0x42,0x58,0xDC,0x82,0x42,0x56,0xDB,0x8C,0x45,0x54,0xDC,0x8B,0x42, + 0x52,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A,0x77,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0, + 0x09,0x23,0x02,0x2A,0x17,0xD0,0x03,0x2A,0x71,0xD1,0xE2,0x79,0xD7,0x07,0x28,0xD0, + 0x01,0x2A,0x01,0xD0,0x05,0x2A,0x22,0xD1,0x00,0x25,0xE3,0x71,0x67,0xE0,0x00,0x9A, + 0x92,0x7D,0x00,0x2A,0x63,0xD1,0x00,0xF0,0x87,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20, + 0xE0,0x71,0x26,0x72,0x5B,0xE0,0xE2,0x79,0xD6,0x07,0xE9,0xD1,0x92,0x07,0x56,0xD5, + 0x00,0xF0,0x7A,0xF8,0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00, + 0x20,0x00,0xE7,0x71,0xFE,0xF7,0xE2,0xFF,0xEB,0xE7,0x02,0x20,0x46,0xE0,0x11,0x20, + 0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0, + 0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0xCD,0xFF,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20, + 0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28, + 0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4, + 0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xA9,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20, + 0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x9D,0xFF,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49, + 0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80, + 0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88, + 0x00,0x06,0x80,0x0F,0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00, + 0xA0,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0xB4,0x18,0x4B,0x05,0x00,0xDE,0x7E, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x26,0xD0,0x1B,0x7D,0x00,0x2B,0x23,0xD1,0x20,0xE0, + 0x13,0x4B,0xD4,0x00,0xE3,0x18,0x11,0x24,0xA4,0x01,0x1C,0x19,0x1C,0x27,0xE7,0x5F, + 0xAF,0x42,0x11,0xDC,0x23,0x27,0x7F,0x01,0xDB,0x19,0x00,0x27,0xDF,0x5F,0xAF,0x42, + 0x0A,0xDB,0x1E,0x27,0xE7,0x5F,0x8F,0x42,0x06,0xDC,0x02,0x24,0x1C,0x5F,0x8C,0x42, + 0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06, + 0x12,0x0E,0x96,0x42,0xDC,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8F,0xB0,0x0A,0x90,0x09,0x90,0xC7,0x48, + 0xC7,0x4A,0x01,0x8A,0xD0,0x88,0x43,0x06,0x02,0xD4,0xC4,0x49,0xC0,0x39,0x89,0x89, + 0xC2,0x4C,0xC4,0x4E,0x60,0x34,0x08,0x91,0xE1,0x7B,0x43,0x06,0x00,0xD4,0xF1,0x7A, + 0x43,0x06,0x07,0x91,0xA1,0x7B,0x00,0xD4,0xB1,0x7A,0x43,0x06,0x06,0x91,0x61,0x7C, + 0x00,0xD4,0x71,0x7B,0x43,0x06,0x05,0x91,0xA1,0x79,0x00,0xD4,0xB1,0x78,0x02,0x07, + 0x04,0x91,0xB7,0x49,0x09,0x79,0x05,0xD5,0xB5,0x4A,0x00,0x29,0x02,0xD1,0x08,0x23, + 0x98,0x43,0xD0,0x80,0xB4,0x48,0x18,0x22,0x82,0x5E,0xFF,0x23,0x01,0x33,0x28,0x2A, + 0x03,0xDD,0x1A,0x22,0x82,0x5E,0x1E,0x2A,0x03,0xDC,0x1C,0x22,0x82,0x5E,0x28,0x2A, + 0x05,0xDD,0xAB,0x4D,0xEA,0x88,0x1A,0x43,0xEA,0x80,0x00,0x22,0x04,0xE0,0x1E,0x22, + 0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E,0xC2,0x83,0x03,0xE0,0xA4,0x4A,0xD0,0x88, + 0x98,0x43,0xD0,0x80,0x08,0x98,0x80,0x04,0x78,0xD5,0xA3,0x4A,0x00,0x20,0x20,0x32, + 0x52,0x78,0x00,0x2A,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0, + 0x41,0xF9,0x9B,0x48,0x9D,0x4D,0x00,0x79,0x01,0x28,0x0E,0x90,0x68,0xD1,0x98,0x4B, + 0x19,0x89,0x0D,0x91,0xDF,0x88,0x62,0x89,0x7B,0x06,0x00,0xD4,0xF2,0x88,0x91,0x42, + 0x00,0xD3,0x00,0x20,0x03,0x90,0x0D,0x98,0x0A,0x22,0x0E,0x21,0x50,0x43,0x69,0x5E, + 0x0C,0x91,0xFE,0xF7,0x65,0xFD,0x21,0x78,0x91,0x4B,0x7A,0x06,0x0B,0x93,0x00,0xD4, + 0x19,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x02,0x90,0x0C,0x99, + 0x0D,0x98,0x40,0x1A,0x0A,0x21,0xFE,0xF7,0x53,0xFD,0x61,0x78,0x7A,0x06,0x01,0xD4, + 0x0B,0x99,0x49,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90, + 0x2A,0x89,0xA1,0x78,0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0x89,0x7F,0x8A,0x42, + 0x00,0xD8,0x00,0x20,0xE1,0x78,0x84,0x46,0x2A,0x69,0x01,0x20,0x7B,0x06,0x01,0xD4, + 0x0B,0x99,0xC9,0x7F,0x8A,0x42,0x00,0xDB,0x00,0x20,0x03,0x99,0x00,0x29,0x1F,0xD0, + 0x02,0x99,0x00,0x29,0x1C,0xD0,0x01,0x99,0x00,0x29,0x19,0xD0,0x61,0x46,0x00,0x29, + 0x16,0xD0,0x71,0x4A,0x01,0x21,0x80,0x3A,0x52,0x68,0x00,0x2A,0x00,0xD0,0x00,0x21, + 0x01,0x42,0x0D,0xD0,0x68,0x7B,0x00,0x28,0x24,0xD0,0x61,0x7A,0x7A,0x06,0x00,0xD4, + 0x71,0x79,0x88,0x42,0x1E,0xD8,0x40,0x1E,0x68,0x73,0x1B,0xE0,0x36,0xE0,0xFF,0xE7, + 0x63,0x48,0x21,0x79,0xC0,0x88,0x2A,0x69,0x43,0x06,0x00,0xD4,0x31,0x78,0x8A,0x42, + 0x10,0xDB,0x0E,0x99,0x00,0x29,0x0D,0xD0,0xC1,0x06,0x0B,0xD4,0x69,0x7B,0xE2,0x79, + 0x40,0x06,0x00,0xD4,0xF2,0x78,0x91,0x42,0x04,0xD2,0x04,0x98,0x81,0x42,0x01,0xD9, + 0x49,0x1C,0x69,0x73,0x68,0x7B,0x04,0x99,0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98, + 0x00,0x28,0x0A,0xD1,0x52,0x49,0xC8,0x88,0x10,0x43,0xC8,0x80,0xC9,0x88,0x20,0x7A, + 0x49,0x06,0x00,0xD4,0x30,0x79,0x28,0x73,0x08,0xE0,0x4D,0x4B,0xD9,0x88,0xC8,0x06, + 0x04,0xD5,0x28,0x7B,0x00,0x28,0x10,0xD1,0x91,0x43,0xD9,0x80,0x48,0x4F,0x38,0x79, + 0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5,0x05,0x99,0x06,0x98,0x40,0x1A, + 0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x01,0xE0,0x40,0x1E,0xE3,0xE7,0x50,0x00, + 0xC0,0x19,0x84,0x46,0xFF,0x30,0x41,0x30,0xC0,0x88,0x00,0x28,0x65,0xD0,0x07,0x99, + 0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07,0x5F,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88, + 0x08,0x21,0x08,0x43,0xF8,0x80,0x58,0xE0,0x06,0x99,0x88,0x42,0x55,0xD3,0x08,0x98, + 0x40,0x07,0x52,0xD5,0x00,0x24,0x01,0x20,0x27,0xE0,0xFF,0x23,0x39,0x18,0x3E,0x33, + 0x5B,0x5C,0x93,0x42,0x20,0xD1,0x64,0x1C,0xFF,0x31,0x01,0x31,0x09,0x7C,0x0A,0x91, + 0x01,0x00,0x12,0xE0,0x4B,0x00,0xDD,0x19,0x2B,0x00,0xC0,0x33,0xDE,0x89,0xE0,0x35, + 0x9E,0x81,0x2D,0x88,0xDD,0x83,0x7B,0x18,0xDD,0x1D,0xF9,0x35,0x6E,0x7C,0xFF,0x33, + 0x21,0x33,0x2E,0x74,0x9E,0x7F,0x49,0x1C,0x5E,0x77,0x3B,0x79,0x8B,0x42,0xE9,0xDA, + 0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD4,0xDA, + 0x00,0x2C,0x22,0xDD,0x01,0x2C,0x05,0xDD,0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21, + 0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30,0x01,0x30,0xC1,0x8B,0x38,0x79,0x40,0x1C, + 0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xC0,0x30,0x81,0x81,0x60,0x46, + 0xFF,0x30,0x21,0x30,0xC1,0x89,0x38,0x79,0x40,0x00,0xC0,0x19,0xC0,0x30,0xC1,0x83, + 0x3B,0x79,0x0D,0x48,0x0A,0x99,0x30,0x38,0x19,0x54,0x52,0x1C,0x08,0x2A,0x8E,0xDB, + 0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43, + 0xF8,0x80,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x07,0x00,0x20,0x30,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0xF0,0xB5,0x70,0x48,0xB1,0xB0,0x00,0x78,0x71,0x4B,0x70,0x4A, + 0x01,0x90,0x6E,0x48,0x00,0x78,0x00,0x90,0xD9,0x88,0x16,0x7D,0x6E,0x48,0x4C,0x06, + 0x00,0xD4,0x06,0x7C,0x55,0x7D,0x49,0x06,0x00,0xD4,0x45,0x7C,0x6B,0x48,0x00,0x21, + 0x2B,0x95,0x30,0x90,0xC1,0x81,0x50,0x22,0x16,0xA8,0x2A,0x91,0x03,0xF0,0x9C,0xF9, + 0x01,0x99,0x2B,0x98,0x2B,0x9D,0x08,0x1A,0xAD,0x1C,0x2F,0x90,0x80,0x1C,0x2E,0x90, + 0x35,0xE0,0x00,0x98,0x16,0xA9,0x80,0x1B,0x80,0x1C,0x86,0x46,0x2B,0x98,0xB4,0x1C, + 0x28,0x1A,0x80,0x00,0x47,0x18,0x40,0x3F,0x1E,0xE0,0x01,0x98,0x5C,0x49,0x00,0x1D, + 0x60,0x43,0x40,0x19,0x00,0x04,0x00,0x14,0x40,0x00,0x0A,0x5E,0x55,0x4B,0x68,0x00, + 0xC0,0x18,0x94,0x21,0x41,0x5E,0x60,0x00,0xC3,0x18,0x6C,0x20,0x18,0x5E,0x2A,0x9B, + 0x94,0x46,0xC3,0x18,0x52,0x18,0xD2,0x18,0x2A,0x92,0xBB,0x6B,0x62,0x46,0x9A,0x18, + 0x08,0x18,0x10,0x18,0x64,0x1C,0xB8,0x63,0xA6,0x45,0xDE,0xDC,0x00,0x98,0x71,0x00, + 0x41,0x1A,0xB8,0x6B,0xFE,0xF7,0xE4,0xFB,0xB8,0x63,0x2E,0x98,0x6D,0x1C,0xA8,0x42, + 0xC7,0xDC,0x00,0x99,0x70,0x00,0x09,0x1A,0x2B,0x98,0x2D,0x91,0x42,0x00,0x01,0x98, + 0x80,0x1A,0x41,0x43,0x2C,0x90,0x2A,0x98,0xFE,0xF7,0xD2,0xFB,0x30,0x99,0x50,0x22, + 0xC8,0x81,0x00,0x20,0x01,0x00,0x2A,0x90,0x02,0xA8,0x03,0xF0,0x45,0xF9,0x2B,0x9C, + 0xA4,0x1C,0x35,0xE0,0x00,0x99,0x02,0xAA,0x89,0x1B,0x89,0x1C,0x8E,0x46,0x2B,0x99, + 0xB0,0x1C,0x61,0x1A,0x89,0x00,0x8D,0x18,0x40,0x3D,0x8C,0x46,0x1C,0xE0,0x01,0x99, + 0x33,0x4A,0x09,0x1D,0x41,0x43,0x09,0x19,0x49,0x00,0x51,0x5E,0x16,0xAA,0x62,0x44, + 0x40,0x3A,0x92,0x6B,0x2B,0x4F,0x89,0x1A,0x62,0x00,0xD3,0x19,0x94,0x22,0x9A,0x5E, + 0x43,0x00,0xDB,0x19,0x6C,0x27,0xDF,0x5F,0xD2,0x19,0x89,0x18,0x0B,0x00,0x4B,0x43, + 0xAA,0x6B,0xD1,0x18,0x40,0x1C,0xA9,0x63,0x86,0x45,0xE0,0xDC,0x2D,0x99,0xA8,0x6B, + 0x49,0x1E,0xFE,0xF7,0x95,0xFB,0xA8,0x63,0x2A,0x99,0x40,0x18,0x64,0x1C,0x2A,0x90, + 0x2E,0x98,0xA0,0x42,0xC6,0xDC,0x2C,0x99,0x2A,0x98,0xFE,0xF7,0x89,0xFB,0x30,0x99, + 0x00,0x22,0x0A,0x61,0x11,0x00,0x02,0xAB,0x0A,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A, + 0x14,0x00,0x54,0x43,0x30,0x9A,0x12,0x69,0xA2,0x18,0x30,0x9C,0x49,0x1C,0x22,0x61, + 0x2C,0x9A,0x8A,0x42,0xF1,0xDC,0x30,0x98,0x51,0x1E,0x00,0x69,0xFE,0xF7,0x70,0xFB, + 0x00,0x9A,0x2F,0x99,0x92,0x1B,0x92,0x02,0x51,0x43,0xFE,0xF7,0x69,0xFB,0x30,0x99, + 0x08,0x61,0x30,0x99,0x0E,0x20,0x08,0x5E,0x00,0x28,0x01,0xD1,0x40,0x1C,0xC8,0x81, + 0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0xF8,0xB5,0x61,0x4D,0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B, + 0x00,0x04,0x00,0x0C,0x05,0xF0,0x5A,0xF8,0x05,0xF0,0x48,0xF8,0x01,0x24,0x64,0x03, + 0x20,0x00,0xFE,0xF7,0x55,0xFF,0x04,0xF0,0x23,0xFC,0x20,0x00,0xFE,0xF7,0x48,0xFF, + 0x57,0x4C,0x00,0x26,0x9C,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x07,0xD5,0xC0,0x68, + 0x00,0x28,0x04,0xD0,0x53,0x48,0xC1,0x68,0xC0,0x03,0xC1,0x63,0x95,0xE0,0x28,0x7A, + 0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x37,0xF8,0xFF,0x20, + 0x81,0x30,0xFE,0xF7,0x35,0xFF,0x03,0x20,0x04,0xF0,0x6E,0xFF,0x03,0xF0,0xF0,0xFE, + 0x49,0x4F,0xF8,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5, + 0x04,0x20,0x00,0xE0,0x02,0x20,0x04,0xF0,0x3B,0xFE,0x00,0xF0,0xCD,0xFB,0x04,0xF0, + 0x15,0xFC,0x00,0xF0,0x97,0xFB,0x00,0xF0,0x45,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1, + 0x20,0x7B,0x00,0x28,0x01,0xD0,0x03,0xF0,0xDF,0xFE,0x20,0x7A,0x00,0x28,0x01,0xD0, + 0x03,0xF0,0x80,0xF8,0x01,0x20,0x40,0x05,0x00,0xF0,0x6A,0xFB,0x03,0xF0,0x96,0xF8, + 0x00,0x28,0x01,0xD0,0x01,0x20,0x28,0x70,0x00,0x20,0x00,0xF0,0x61,0xFB,0x28,0x78, + 0x00,0x28,0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x57,0xF9,0x03,0xF0, + 0xAB,0xFE,0x28,0x78,0x00,0x28,0x04,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x44,0xD1, + 0x2E,0x70,0x03,0x20,0x04,0xF0,0x02,0xFF,0xE8,0x62,0x03,0x20,0x04,0xF0,0x30,0xFF, + 0xFF,0x20,0x81,0x30,0xFE,0xF7,0xDC,0xFE,0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E, + 0xF8,0x83,0x2D,0xE0,0xFF,0xF7,0x9E,0xFC,0x00,0x28,0x29,0xD0,0x6F,0x6A,0x00,0x2F, + 0x26,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x1C,0x49,0xFE,0xF7,0x92,0xFB, + 0x38,0x1A,0x14,0x28,0x1C,0xDD,0x04,0xF0,0xD7,0xFF,0x04,0xF0,0xDB,0xFF,0xA8,0x79, + 0x00,0x28,0x0D,0xD0,0x03,0xF0,0x56,0xFE,0x03,0xF0,0x59,0xFE,0x03,0xF0,0x61,0xFE, + 0x13,0x4D,0x01,0x20,0x68,0x60,0xFE,0xF7,0xC3,0xFE,0x12,0x48,0x68,0x60,0x03,0xE0, + 0x11,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x04,0xF0,0xCB,0xFF,0x0E,0x48,0x06,0x70, + 0x06,0x4D,0x28,0x78,0x00,0x28,0x00,0xD1,0x5D,0xE7,0x04,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x9B,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20, + 0x80,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x10,0xB4,0x0F,0x4B, + 0x00,0x22,0xD2,0x43,0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C, + 0x24,0x33,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52, + 0x22,0x00,0x12,0x32,0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52, + 0x51,0x18,0x40,0x1E,0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCA,0x0B,0x00,0x20, + 0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21,0x02,0xF0,0xCE,0xFF,0x0A,0x48,0x5A,0x22, + 0x00,0x21,0x02,0xF0,0xC9,0xFF,0x08,0x48,0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48, + 0x28,0x22,0x21,0x00,0x02,0xF0,0xC0,0xFF,0x04,0x48,0x4E,0x38,0x44,0x75,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x6B,0x08,0x00,0x20,0x54,0x07,0x00,0x20,0x7E,0x0A,0x00,0x20, + 0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21,0x02,0xF0,0xAE,0xFF,0x14,0x48,0x12,0x22, + 0x00,0x21,0x12,0x30,0x02,0xF0,0xA8,0xFF,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30, + 0x02,0xF0,0xA2,0xFF,0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0x02,0xF0,0x9C,0xFF, + 0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30,0x02,0xF0,0x96,0xFF,0x08,0x48,0x10,0x22, + 0x00,0x21,0x62,0x30,0x02,0xF0,0x90,0xFF,0x05,0x49,0x00,0x20,0x74,0x31,0xC8,0x82, + 0xFF,0x39,0x41,0x39,0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBC,0x06,0x00,0x20,0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x8F,0x7B,0xF1,0x88,0x49,0x06, + 0x02,0xD4,0x1B,0x49,0xC0,0x39,0x8F,0x7A,0x08,0x21,0x00,0x24,0x42,0x00,0x0B,0x01, + 0x9B,0x19,0x15,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19,0xEC,0x82,0x0D,0x25,0xAD,0x01, + 0x5B,0x19,0x49,0x1E,0xDC,0x80,0xF2,0xD5,0x15,0x25,0x31,0x18,0x6D,0x01,0x01,0x23, + 0x4D,0x19,0xAB,0x73,0x0F,0x25,0x93,0x19,0xAD,0x01,0x5B,0x19,0xDC,0x82,0x1F,0x23, + 0x5B,0x01,0xC9,0x18,0x8F,0x71,0x8C,0x73,0x02,0x21,0x0D,0x01,0xAD,0x19,0xAD,0x18, + 0xED,0x18,0x49,0x1E,0xEC,0x82,0xF8,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x21,0x20, + 0xC9,0x43,0x40,0x01,0x10,0x18,0xC1,0x80,0x01,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x10,0xB5,0x04,0x48,0x20,0x22,0x00,0x21, + 0x02,0xF0,0x3A,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7E,0x08,0x00,0x20, + 0x10,0xB5,0x04,0xF0,0x43,0xFE,0x03,0xF0,0xDD,0xFD,0xFF,0xF7,0x59,0xFF,0x03,0xF0, + 0x2B,0xFF,0x01,0xF0,0x57,0xFD,0x01,0xF0,0xD1,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x10,0xB4,0x0D,0x4C,0x0B,0x4B,0xE4,0x88,0x1B,0x7F,0x64,0x06,0x02,0xD4,0x09,0x4B, + 0xC0,0x3B,0x1B,0x7E,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42, + 0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00, + 0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xF7,0xB5,0x62,0x48, + 0xCA,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0,0x01,0x20,0x47,0x90,0x00,0x20,0x02,0xE0, + 0x00,0x20,0x47,0x90,0x01,0x20,0x46,0x90,0x5C,0x48,0x00,0x26,0x49,0x90,0x5C,0x48, + 0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A, + 0x01,0x91,0x80,0x8B,0x45,0x90,0x57,0x48,0x00,0x7A,0x48,0x96,0x00,0x90,0x6B,0xE0, + 0x00,0x24,0x64,0xE0,0x68,0x43,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x52,0xF9, + 0x4D,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4F,0x4A,0x52,0x79,0x00,0x2A, + 0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D, + 0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0, + 0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42, + 0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E, + 0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18, + 0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x80,0x1A,0x49,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0x4B,0x9B,0x12,0x0C,0x00,0x2B, + 0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x4A,0x9B,0x05,0x2B, + 0x0E,0xD8,0x90,0x42,0x01,0xDA,0x47,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x46,0x9A, + 0x21,0x00,0x28,0x00,0x00,0xF0,0x80,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0, + 0x48,0x99,0x05,0xA8,0x47,0x54,0x48,0x98,0x40,0x1C,0x48,0x90,0x64,0x1C,0x22,0x49, + 0xC8,0x78,0x84,0x42,0x96,0xDB,0x6D,0x1C,0x1F,0x48,0x01,0x79,0x8D,0x42,0x8F,0xDB, + 0x4A,0x98,0x05,0x28,0x03,0xD9,0x00,0x04,0x48,0x9E,0x00,0x0C,0x45,0x90,0x00,0x2E, + 0x25,0xDD,0x4C,0x98,0x00,0x28,0x22,0xD1,0x00,0xF0,0x5A,0xF9,0x00,0xF0,0x7A,0xF9, + 0x00,0xF0,0x28,0xFA,0x76,0x1E,0x14,0xD4,0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00, + 0x49,0x98,0x80,0x58,0x01,0x05,0x45,0x98,0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C, + 0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04,0x08,0x43,0x49,0x99,0x76,0x1E,0x88,0x50, + 0xEC,0xD5,0x00,0xF0,0x35,0xF9,0x00,0xF0,0x5D,0xF9,0x00,0xF0,0x0B,0xFA,0x4D,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00,0x00,0x02,0x10,0x40, + 0xE0,0x7A,0x00,0x00,0x70,0x0A,0x00,0x20,0xF8,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0xF0,0xB5,0x01,0x26,0x76,0x07,0x30,0x68,0x01,0x28,0x1D,0xD1,0x74,0x68,0xA1,0x05, + 0xA0,0x01,0x89,0x0D,0x80,0x0D,0x0D,0x00,0x07,0x00,0x03,0xF0,0x9F,0xFF,0x41,0x1C, + 0x12,0xD0,0x0B,0x4A,0x80,0x00,0x81,0x18,0x49,0x88,0x10,0x5A,0xA3,0x0A,0x49,0x19, + 0x49,0x05,0x89,0x0D,0x9B,0x02,0xC0,0x19,0x06,0x4A,0x40,0x08,0x19,0x43,0x80,0x05, + 0x80,0x09,0x11,0x40,0x08,0x43,0x70,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x08,0x71,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x30,0xB4,0x17,0x4D,0x15,0x4C,0x2D,0x78, + 0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B, + 0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A, + 0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C, + 0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A, + 0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0xF0,0xB5,0x5A,0x48, + 0x8F,0xB0,0x06,0x78,0x59,0x48,0x5B,0x4A,0x05,0x96,0x07,0x78,0x58,0x48,0x06,0x97, + 0x0E,0x90,0x80,0x7E,0x0D,0x92,0xC1,0x07,0x09,0xD0,0x80,0x07,0x04,0xD5,0x70,0x1E, + 0x05,0x90,0x03,0x20,0x10,0x71,0x02,0xE0,0x7F,0x1E,0x00,0x21,0x11,0x71,0x52,0x48, + 0x0A,0x22,0x01,0x8C,0x51,0x43,0x09,0x04,0x09,0x0C,0x02,0x91,0x40,0x8C,0x50,0x43, + 0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0,0x00,0x2F,0x7C,0xD0, + 0x41,0x00,0x02,0x98,0xFE,0xF7,0x2C,0xF8,0x05,0x04,0x2D,0x0C,0x00,0x24,0xB6,0x1C, + 0x0A,0xE0,0x02,0x98,0x05,0x99,0x60,0x43,0xFE,0xF7,0x22,0xF8,0x43,0x4A,0x61,0x00, + 0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xB4,0x42,0xF2,0xDB,0x01,0x98,0x79,0x00, + 0xFE,0xF7,0x16,0xF8,0x06,0x04,0x06,0x98,0x36,0x0C,0x00,0x24,0x80,0x1C,0x0C,0x90, + 0x0C,0xE0,0x01,0x98,0x39,0x00,0x60,0x43,0xFE,0xF7,0x0A,0xF8,0x37,0x4A,0x81,0x19, + 0x60,0x00,0x80,0x18,0x40,0x30,0x81,0x80,0x0C,0x98,0x64,0x1C,0x84,0x42,0xF0,0xDB, + 0x0E,0x98,0x80,0x7E,0xC0,0x07,0x53,0xD0,0x00,0x24,0x4D,0xE0,0x2F,0x4A,0x09,0x21, + 0x10,0x19,0xC9,0x01,0x40,0x18,0x41,0x7A,0x0E,0x98,0x80,0x7E,0x80,0x07,0x03,0xD5, + 0x05,0x98,0x03,0x95,0x04,0x91,0x02,0xE0,0x08,0x00,0x03,0xA9,0xC0,0xC1,0x27,0x49, + 0x40,0x00,0x40,0x18,0x0B,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7,0xE0,0xFF, + 0x22,0x4A,0xE1,0x00,0x89,0x18,0x11,0x22,0x92,0x01,0x0A,0x91,0x89,0x18,0x09,0x91, + 0x88,0x83,0x04,0x98,0x1D,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x08,0x90,0x80,0x88, + 0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xCC,0xFF,0x09,0x99,0xC8,0x83,0x0B,0x98,0x0A,0x21, + 0x00,0x8C,0x40,0x19,0xFE,0xF7,0x9E,0xF8,0x0A,0x99,0x23,0x22,0x52,0x01,0x89,0x18, + 0x07,0x91,0x08,0x80,0x08,0x98,0x0A,0x21,0x80,0x88,0x80,0x19,0xFE,0xF7,0x92,0xF8, + 0x07,0x99,0x48,0x80,0x03,0x98,0x40,0x00,0x00,0xE0,0x09,0xE0,0x0A,0x21,0xFE,0xF7, + 0x89,0xF8,0x0D,0x99,0x64,0x1C,0xC8,0x80,0x0E,0x98,0xC0,0x7E,0xA0,0x42,0xAD,0xDC, + 0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x03,0x49,0xCA,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0x02,0x43,0xCA,0x61,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x01,0x22,0x10,0xB5,0x08,0x49,0x09,0x48,0x52,0x02,0x02,0xF0,0xCA,0xFC,0x08,0x48, + 0x01,0x22,0xC0,0x8E,0x92,0x02,0x01,0x04,0x01,0x43,0x06,0x48,0x02,0xF0,0xD4,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22, + 0x02,0xF0,0x9F,0xFC,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32,0x02,0xF0,0x99,0xFC, + 0x01,0x22,0x08,0x49,0x08,0x48,0x52,0x02,0x02,0xF0,0x93,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x04,0x7B,0x00,0x00,0x04,0x90,0x00,0x40,0x00,0x7C,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xE3,0xFF,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0xE5,0xFF,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xD4,0xFF,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xD6,0xFF,0x0C,0x48,0x00,0x22,0x04,0x04,0x24,0x0C, + 0x29,0x00,0x20,0x00,0xFD,0xF7,0xC6,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00,0x00,0x23, + 0xFD,0xF7,0xC8,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0x00,0x7B,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00, + 0x00,0x06,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7, + 0x7F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x55,0x4E, + 0x53,0x4B,0xF2,0x88,0x98,0x88,0x54,0x49,0x54,0x06,0x82,0xB0,0x00,0xD4,0x08,0x88, + 0x52,0x06,0x01,0x90,0x98,0x79,0x00,0xD4,0x88,0x78,0x37,0x00,0x00,0x25,0x01,0x00, + 0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0xFF,0x37,0x61,0x37,0x00,0x90,0x11,0xE0, + 0x0A,0x20,0x60,0x43,0x43,0x21,0x80,0x19,0xC9,0x00,0x09,0x5C,0x00,0x29,0x08,0xD0, + 0x46,0x49,0x40,0x18,0x01,0xF0,0x66,0xF9,0x00,0x28,0x02,0xD0,0x6D,0x1C,0x2D,0x06, + 0x2D,0x0E,0x64,0x1C,0xB8,0x78,0xA0,0x42,0xEA,0xDA,0x41,0x49,0x08,0x00,0x20,0x30, + 0xCA,0x8B,0x43,0x88,0xD4,0x1A,0x00,0x2C,0x00,0xDC,0x9C,0x1A,0x22,0x04,0x03,0x88, + 0x84,0x88,0x12,0x0C,0x1F,0x1B,0x00,0x2F,0x00,0xDC,0xE7,0x1A,0x84,0x7A,0x3B,0x04, + 0x1B,0x0C,0x00,0x2C,0x04,0xD0,0x44,0x7B,0xC8,0x2C,0x01,0xD2,0x64,0x1C,0x44,0x73, + 0x8C,0x7B,0x14,0x2C,0x04,0xD2,0x0C,0x7C,0x00,0x2C,0x01,0xD0,0x01,0x24,0x4C,0x74, + 0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7B,0xC8,0x2C,0x01,0xD2,0x64,0x1C, + 0xCC,0x73,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B,0x05,0xD2,0x08,0x24, + 0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x08,0x24,0x04,0x5F,0xE7,0x1C, + 0x01,0xDD,0x64,0x1E,0x04,0x81,0x44,0x7B,0x01,0x2C,0x01,0xD9,0x78,0x21,0x10,0xE0, + 0x02,0x2D,0x0F,0xD2,0x08,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD,0xC9,0x7B,0x14,0x29, + 0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B,0x02,0xD2,0x77,0x21, + 0xC9,0x43,0xC1,0x80,0x00,0x21,0x02,0x2D,0x01,0x73,0x0E,0xD2,0x06,0x21,0x41,0x5E, + 0x78,0x31,0x04,0xD1,0xC1,0x7A,0xC8,0x29,0x01,0xD2,0x49,0x1C,0xC1,0x72,0xC1,0x7A, + 0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x73,0x06,0x21,0x41,0x5E,0x01,0x98, + 0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1,0x31,0x79,0x01,0x29, + 0x02,0xD0,0x00,0x99,0xFD,0xF7,0x0C,0xFE,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0x1E,0x02,0x00,0x00, + 0x70,0x08,0x00,0x20,0xFF,0x21,0x03,0x31,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1, + 0x70,0x47,0x15,0x21,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1,0x70,0x47,0x00,0x00, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0xFE,0xB5,0x1E,0x4A,0x1C,0x48,0xD1,0x88,0x00,0x25,0x00,0x7A, + 0x2E,0x00,0x2F,0x00,0x49,0x06,0x02,0xD4,0x18,0x48,0xC0,0x38,0x00,0x79,0x19,0x49, + 0x89,0x8A,0x40,0x18,0x01,0x06,0x18,0x48,0x09,0x0E,0x00,0x78,0x00,0x28,0x01,0x90, + 0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0,0x0A,0x20,0x60,0x43,0x10,0x49, + 0x40,0x18,0xFF,0x30,0x61,0x30,0x80,0x7A,0x14,0x28,0x01,0xD2,0x01,0x26,0x07,0xE0, + 0x01,0x27,0x14,0x21,0xFD,0xF7,0x96,0xFE,0x00,0x99,0x88,0x42,0x00,0xD3,0x01,0x25, + 0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F,0x02,0xD1,0x00,0x2E,0x00,0xD0, + 0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0xBB,0xFA,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x83,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0xF8,0x0A,0x00,0x20,0xF1,0xB5,0x61,0x48,0x2E,0x21,0x90,0xB0, + 0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63, + 0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0,0x91,0xFA,0x59,0x4D, + 0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x69,0xFA,0x10,0x9B,0x00,0x21,0x01,0x20, + 0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0xA2,0xFA,0x1E,0x16,0x40,0x40, + 0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x40,0x4F,0x68,0x6F,0x76, + 0x7D,0x85,0x40,0x8C,0x93,0x4F,0x40,0x40,0x40,0x40,0x9A,0x40,0x0B,0x20,0xF0,0x63, + 0x4D,0xE0,0x00,0xF0,0x19,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7, + 0x4F,0xF9,0x00,0xF0,0x45,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68,0x52,0x68,0x91,0x42, + 0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83, + 0xFD,0xF7,0xC0,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7,0x21,0xFE,0xA8,0x78, + 0x80,0x07,0x01,0xD5,0x04,0xF0,0xE0,0xF9,0x3A,0x49,0x40,0x22,0x68,0x46,0x02,0xF0, + 0x88,0xFA,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0xEE,0xF9,0xF7,0x63,0x1E,0xE0, + 0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20, + 0x00,0xE0,0x00,0x20,0x04,0xF0,0x76,0xF8,0xF0,0xE7,0x03,0x21,0x09,0x07,0xCA,0x60, + 0xFE,0xF7,0x16,0xF9,0x10,0x98,0xFE,0xF7,0x69,0xF8,0x08,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x0D,0xF9,0x00,0xF0,0x83,0xFD,0x00,0xF0,0xEF,0xF8,0x20,0x48, + 0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xA8,0x71,0xD2,0xE7,0xA9,0x71,0xD0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0xE8,0x71,0xCB,0xE7,0xE9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x72, + 0xC4,0xE7,0x29,0x72,0xC2,0xE7,0x00,0x2C,0x03,0xD0,0x20,0x0C,0x6C,0x72,0x28,0x82, + 0xBC,0xE7,0x69,0x72,0xBA,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72,0xB5,0xE7, + 0xA9,0x72,0xB3,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xAE,0xE7,0xE9,0x72, + 0xAC,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA7,0xE7,0x29,0x73,0xA5,0xE7, + 0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x03,0xF0,0x9B,0xFE,0x9D,0xE7, + 0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00, + 0xE0,0x7A,0x00,0x00,0xC0,0x75,0x00,0x00,0xF0,0xB5,0x38,0x4F,0x35,0x4C,0xF9,0x78, + 0x03,0x00,0x35,0x4A,0x0E,0x04,0x39,0x79,0x35,0x48,0x25,0x68,0x0E,0x43,0x35,0x49, + 0x30,0x3B,0x04,0xF0,0xE5,0xF9,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E, + 0x20,0x30,0x3B,0x16,0x3E,0x43,0x48,0x4E,0x51,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68, + 0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04, + 0x35,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68, + 0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48,0x03,0x7A,0x10,0x7D,0x52,0x7D,0xC4,0x07, + 0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43, + 0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D, + 0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06, + 0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7,0x00,0x69,0xFA,0x89, + 0x40,0x08,0x00,0x02,0x03,0xE0,0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43, + 0xC1,0xE7,0x00,0x69,0x40,0x08,0xBE,0xE7,0xB8,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42, + 0xFC,0xD1,0x03,0xF0,0x6D,0xF9,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00,0x00,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20, + 0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20,0x70,0x0A,0x00,0x20, + 0x00,0x7B,0x00,0x00,0xE0,0x7A,0x00,0x00,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68, + 0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x51,0xF8,0x06,0x00,0xCB,0x20,0xC0,0x01, + 0xFE,0xF7,0x2E,0xF8,0x02,0xF0,0xEC,0xFF,0x01,0x20,0x40,0x05,0xFF,0xF7,0x88,0xFC, + 0x00,0xF0,0xBC,0xFC,0x00,0x20,0xFF,0xF7,0x83,0xFC,0x02,0xF0,0xD5,0xFF,0x30,0x00, + 0xFE,0xF7,0x50,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21, + 0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x02,0xF0,0xD2,0xFF,0x00,0x20,0xFF,0xF7, + 0x6F,0xFC,0xFF,0xF7,0xED,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20, + 0x40,0x07,0x04,0xF0,0x3B,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0xF8,0xB5,0x27,0x49,0x25,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06,0x02,0xD4,0x23,0x48, + 0xC0,0x38,0x80,0x89,0xC0,0x06,0x3D,0xD5,0x22,0x4E,0x30,0x78,0x00,0x28,0x39,0xD0, + 0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25,0x31,0xE0,0x0A,0x21,0x69,0x43,0x1C,0x4B, + 0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78,0x61,0x34,0x25,0xE0,0x0A,0x22,0x42,0x43, + 0xD2,0x18,0xFF,0x32,0xA1,0x32,0x21,0x79,0x92,0x7F,0x91,0x42,0x1B,0xD1,0x0A,0x22, + 0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21,0xC1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E, + 0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x88, + 0xE1,0x88,0xFF,0xF7,0x05,0xFA,0xE0,0x80,0x7A,0x88,0x21,0x89,0x00,0x98,0xFF,0xF7, + 0xFF,0xF9,0x20,0x81,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD7,0xDA,0x6D,0x1C,0x30,0x78, + 0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0xB5,0x00,0x20,0xB1,0xB0,0x11,0x90, + 0x10,0x90,0x0F,0x90,0x0E,0x90,0xFA,0x48,0xFB,0x4D,0x01,0x8C,0xF9,0x4A,0x0B,0x91, + 0x40,0x8C,0xFA,0x49,0x0A,0x90,0xE8,0x88,0x13,0x7B,0x44,0x06,0x00,0xD4,0x0B,0x7A, + 0x54,0x7B,0x46,0x06,0x00,0xD4,0x4C,0x7A,0x46,0x06,0x09,0x94,0x94,0x7E,0x00,0xD4, + 0x8C,0x7D,0x46,0x06,0x08,0x94,0x54,0x7E,0x00,0xD4,0x4C,0x7D,0x07,0x94,0xEF,0x4C, + 0x40,0x34,0x24,0x8A,0x46,0x06,0x02,0xD4,0xEC,0x4C,0x80,0x3C,0xA4,0x89,0x24,0x07, + 0x42,0xD5,0xD4,0x7B,0x46,0x06,0x00,0xD4,0xCC,0x7A,0x5C,0x43,0x26,0x94,0x14,0x7C, + 0x46,0x06,0x00,0xD4,0x0C,0x7B,0x5C,0x43,0x25,0x94,0x54,0x7C,0x46,0x06,0x00,0xD4, + 0x4C,0x7B,0x5C,0x43,0x24,0x94,0x94,0x7C,0x46,0x06,0x00,0xD4,0x8C,0x7B,0x5C,0x43, + 0x23,0x94,0xD4,0x7C,0x46,0x06,0x00,0xD4,0xCC,0x7B,0x5C,0x43,0x22,0x94,0x14,0x7D, + 0x46,0x06,0x00,0xD4,0x0C,0x7C,0x5C,0x43,0x21,0x94,0x54,0x7D,0x46,0x06,0x00,0xD4, + 0x4C,0x7C,0x5C,0x43,0x20,0x94,0x94,0x7D,0x46,0x06,0x00,0xD4,0x8C,0x7C,0x5C,0x43, + 0x1F,0x94,0xD4,0x7D,0x46,0x06,0x00,0xD4,0xCC,0x7C,0x5C,0x43,0x1E,0x94,0x12,0x7E, + 0x40,0x06,0x00,0xD4,0x0A,0x7D,0xCE,0x48,0x5A,0x43,0x1D,0x92,0x30,0x90,0x00,0x78, + 0x00,0x28,0x05,0xD1,0x00,0xF0,0xCE,0xFE,0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x27,0x90,0xC7,0x48,0x2F,0x90,0xC3,0x4D,0x27,0x98,0x13,0x21,0x28,0x18, + 0x49,0x01,0x2E,0x90,0x40,0x18,0x04,0x7F,0x00,0x2C,0x0F,0xD0,0x08,0x98,0x00,0x28, + 0x08,0xD1,0x0A,0x20,0x60,0x43,0x40,0x19,0xFF,0x30,0x6B,0x30,0x00,0xF0,0xE2,0xFD, + 0x00,0x28,0x03,0xD0,0x2F,0x98,0x00,0x7B,0x00,0x28,0x03,0xD0,0x27,0x98,0xFF,0xF7, + 0xF9,0xF8,0xA0,0xE2,0x27,0x99,0x15,0x27,0x07,0x20,0x7F,0x01,0x4E,0x00,0x01,0x01, + 0x49,0x19,0x89,0x19,0xCA,0x19,0xD2,0x8A,0x0B,0x23,0x9B,0x01,0xCB,0x18,0xDA,0x80, + 0x0D,0x22,0x92,0x01,0x89,0x18,0xCA,0x88,0x40,0x1E,0xCA,0x82,0xEF,0xD5,0x0A,0x20, + 0x44,0x43,0x64,0x19,0x2D,0x94,0xFF,0x34,0x61,0x34,0xE1,0x88,0x0B,0x98,0x40,0x1E, + 0x81,0x42,0xDE,0xDC,0x21,0x89,0x0A,0x98,0x40,0x1E,0x81,0x42,0xD9,0xDC,0xA2,0x48, + 0xE1,0x88,0x35,0x18,0xE8,0x19,0x2C,0x90,0x0D,0x23,0xC1,0x82,0x21,0x89,0x9B,0x01, + 0xE8,0x18,0x2B,0x90,0xC1,0x80,0x00,0x20,0x01,0x21,0xC9,0x02,0x06,0x90,0x05,0x90, + 0x07,0x20,0x04,0x91,0x98,0x4A,0x03,0x01,0x9A,0x18,0x92,0x19,0x15,0x23,0x5B,0x01, + 0x94,0x46,0xD2,0x18,0x16,0x23,0xD3,0x5E,0x00,0x2B,0x07,0xDD,0x06,0x9F,0xBB,0x42, + 0x01,0xDD,0xD7,0x8A,0x06,0x97,0x8B,0x42,0x00,0xDA,0xD1,0x8A,0x0D,0x23,0x9B,0x01, + 0x62,0x46,0xD2,0x18,0x06,0x23,0xD3,0x5E,0x00,0x2B,0x09,0xDD,0x05,0x9F,0xBB,0x42, + 0x01,0xDD,0xD7,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x01,0xDA,0xD2,0x88,0x04,0x92, + 0x40,0x1E,0xD7,0xD5,0x06,0x98,0x40,0x1A,0xF0,0x28,0x04,0xDC,0x04,0x99,0x05,0x98, + 0x40,0x1A,0xF0,0x28,0x02,0xDD,0x2F,0x99,0x01,0x20,0x88,0x72,0x2E,0x98,0x15,0x21, + 0x49,0x01,0x40,0x18,0x2A,0x90,0x80,0x7B,0x01,0x28,0x1B,0xD9,0x2C,0x98,0x16,0x21, + 0x41,0x5E,0x0B,0x20,0x80,0x01,0x28,0x18,0x06,0x22,0x82,0x5E,0x88,0x1A,0x00,0x28, + 0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14,0x0D,0x90,0x2B,0x98,0x06,0x21,0x16,0x22, + 0x41,0x5E,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14, + 0x0C,0x90,0x02,0xE0,0x64,0x20,0x0C,0x90,0x0D,0x90,0x0B,0x20,0x80,0x01,0x2F,0x18, + 0x2C,0x9A,0x06,0x21,0x16,0x20,0x79,0x5E,0x10,0x5E,0x02,0xF0,0x9F,0xFF,0x13,0x90, + 0x2B,0x98,0x16,0x21,0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x02,0xF0,0x96,0xFF, + 0x12,0x90,0x16,0x21,0x79,0x5E,0x13,0x98,0x02,0xF0,0x90,0xFF,0x15,0x90,0x1B,0x20, + 0x40,0x01,0x28,0x18,0x06,0x21,0x29,0x90,0x41,0x5E,0x12,0x98,0x02,0xF0,0x86,0xFF, + 0x14,0x90,0x17,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E, + 0x15,0x98,0x02,0xF0,0x7D,0xFF,0x00,0x04,0x00,0x14,0x17,0x90,0x07,0x20,0xC0,0x01, + 0x2F,0x18,0x29,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x14,0x98,0x02,0xF0, + 0x6F,0xFF,0x00,0x04,0x00,0x14,0x16,0x90,0x03,0x20,0x00,0x02,0x28,0x18,0x16,0x22, + 0x06,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x02,0xF0,0x62,0xFF,0x00,0x04,0x00,0x14, + 0x19,0x90,0x1D,0x20,0x40,0x01,0x28,0x18,0x28,0x90,0x06,0x22,0x82,0x5E,0x16,0x21, + 0x79,0x5E,0x16,0x98,0x02,0xF0,0x54,0xFF,0x00,0x04,0x00,0x14,0x18,0x90,0x19,0x20, + 0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x19,0x98,0x02,0xF0, + 0x47,0xFF,0x00,0x04,0x00,0x14,0x1B,0x90,0x0F,0x20,0x80,0x01,0x2F,0x18,0x28,0x98, + 0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x18,0x98,0x02,0xF0,0x39,0xFF,0x00,0x04, + 0x00,0x14,0x1A,0x90,0x0C,0x99,0x0D,0x98,0x00,0xF0,0xE0,0xFF,0x01,0x21,0x84,0x46, + 0x88,0x02,0x2D,0x4B,0x0A,0x01,0xD2,0x18,0x93,0x19,0x1F,0x22,0x52,0x01,0x9A,0x18, + 0xD2,0x8A,0x1B,0x18,0x49,0x1E,0xDA,0x80,0xF3,0xD5,0x1F,0x21,0x49,0x01,0x6A,0x18, + 0x60,0x46,0xD0,0x82,0x2E,0x9A,0x00,0x20,0x55,0x18,0xAA,0x7B,0x00,0x2A,0x94,0x46, + 0x0B,0xDB,0x21,0x4B,0x11,0x01,0xC9,0x18,0x1F,0x23,0x89,0x19,0x5B,0x01,0xCB,0x18, + 0x16,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF3,0xD5,0x61,0x46,0x49,0x1C,0xFD,0xF7, + 0xC7,0xF9,0x25,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0,0x23,0x98, + 0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x21,0x98,0x86,0x42,0x01,0xDC,0x03,0x20, + 0x05,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20,0xA9,0x79, + 0x40,0x1A,0x09,0x99,0x49,0x42,0x00,0x28,0x08,0xDD,0x16,0x20,0x38,0x5E,0x09,0x9B, + 0x98,0x42,0x01,0xD1,0x00,0x20,0x08,0xE0,0x40,0x1C,0x06,0xE0,0x00,0x28,0x0A,0x48, + 0x38,0x5E,0x13,0xDA,0x88,0x42,0xF5,0xD0,0x40,0x1E,0xF8,0x82,0x11,0xE0,0x00,0x00, + 0x00,0x78,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0x50,0x07,0x00,0x20,0x90,0x08,0x00,0x20,0x16,0x00,0x00,0x00,0x00,0x28,0xEB,0xDC, + 0xE2,0xDB,0x16,0x20,0x38,0x5E,0x09,0x9B,0x98,0x42,0x05,0xD1,0xAB,0x79,0x05,0x2B, + 0x02,0xD2,0x5B,0x1C,0xAB,0x71,0x06,0xE0,0x88,0x42,0x04,0xD1,0xA8,0x79,0x01,0x28, + 0x01,0xD9,0x40,0x1E,0xA8,0x71,0x1A,0x99,0x1B,0x98,0x1C,0x91,0x2A,0x99,0x8F,0x7B, + 0x39,0x00,0xFD,0xF7,0x6D,0xF9,0x11,0x90,0x0F,0x90,0x1C,0x98,0x39,0x00,0xFD,0xF7, + 0x67,0xF9,0x10,0x90,0x0E,0x90,0xA8,0x79,0x01,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9, + 0x6B,0x46,0x06,0xC3,0x1A,0x9B,0x1B,0x9A,0x09,0x21,0x38,0x00,0x03,0xF0,0x64,0xFB, + 0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x18,0x9B,0x80,0x7B,0x19,0x9A, + 0x07,0x21,0x03,0xF0,0x59,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E, + 0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x25,0x9B, + 0x00,0x92,0x2D,0x98,0x26,0x9A,0xFF,0x30,0x65,0x30,0x9A,0xE0,0x02,0x28,0x27,0xD1, + 0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x18,0x9B,0x19,0x9A,0x07,0x21,0x38,0x00, + 0x03,0xF0,0x3A,0xFB,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x16,0x9B, + 0x80,0x7B,0x17,0x9A,0x05,0x21,0x03,0xF0,0x2F,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21, + 0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22, + 0x9A,0x5E,0x00,0x92,0x2D,0x98,0x23,0x9B,0xFF,0x30,0x24,0x9A,0x65,0x30,0x70,0xE0, + 0x03,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x16,0x9B,0x17,0x9A, + 0x05,0x21,0x38,0x00,0x03,0xF0,0x10,0xFB,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x2A,0x98,0x14,0x9B,0x80,0x7B,0x15,0x9A,0x03,0x21,0x03,0xF0,0x05,0xFB,0x6B,0x46, + 0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF, + 0x07,0xC7,0x04,0x22,0x9A,0x5E,0x21,0x9B,0x00,0x92,0x2D,0x98,0x22,0x9A,0xFF,0x30, + 0x65,0x30,0x46,0xE0,0x04,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x68,0x46,0x06,0xC0, + 0x14,0x9B,0x15,0x9A,0x03,0x21,0x38,0x00,0x03,0xF0,0xE6,0xFA,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0x2A,0x98,0x12,0x9B,0x80,0x7B,0x13,0x9A,0x02,0x21,0x03,0xF0, + 0xDB,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB, + 0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x1F,0x9B,0x00,0x92,0x2D,0x98, + 0x20,0x9A,0xFF,0x30,0x65,0x30,0x1C,0xE0,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x12,0x9B,0x13,0x9A,0x02,0x21,0x38,0x00,0x03,0xF0,0xBE,0xFA,0x10,0xAB,0x00,0x22, + 0x04,0x21,0x9A,0x5E,0x59,0x5E,0x2B,0x9B,0x06,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3, + 0x2C,0x98,0x16,0x22,0x82,0x5E,0x1D,0x9B,0x00,0x92,0x2D,0x98,0x1E,0x9A,0xFF,0x30, + 0x65,0x30,0x31,0x00,0x03,0xF0,0xBC,0xFA,0x2A,0x98,0x3C,0x49,0x80,0x7B,0x09,0x28, + 0x02,0xD2,0x2A,0x9A,0x40,0x1C,0x90,0x73,0xA8,0x7B,0x02,0x28,0x01,0xD2,0x40,0x1C, + 0xA8,0x73,0x20,0x79,0x40,0x1E,0x80,0x00,0x41,0x18,0x21,0x20,0x40,0x01,0x0D,0x18, + 0x06,0x20,0x28,0x5E,0x00,0x28,0x22,0xDB,0x08,0x21,0x69,0x5E,0x00,0x29,0x1E,0xDB, + 0x07,0x99,0x64,0x22,0x56,0x1A,0x70,0x43,0x11,0x00,0xFD,0xF7,0x79,0xF8,0x07,0x00, + 0xE0,0x88,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x4C,0xF9,0x38,0x18,0xE0,0x80, + 0x08,0x20,0x28,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x6A,0xF8,0x06,0x00,0x20,0x89, + 0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x3D,0xF9,0x30,0x18,0x20,0x81,0xE0,0x88, + 0xE8,0x80,0x20,0x89,0x28,0x81,0x27,0x98,0x40,0x1C,0x08,0x28,0x27,0x90,0x00,0xDA, + 0x3A,0xE5,0x30,0x98,0x01,0x78,0x1A,0x48,0x01,0x29,0x1F,0xD1,0x30,0x99,0x89,0x7B, + 0x4A,0x00,0x16,0x49,0x51,0x18,0x15,0x22,0x52,0x01,0x8A,0x18,0x92,0x8A,0xC2,0x83, + 0x0D,0x22,0x92,0x01,0x8A,0x18,0x94,0x88,0x2F,0x9B,0x1C,0x80,0x0B,0x23,0x9B,0x01, + 0xC9,0x18,0x8B,0x88,0x2F,0x99,0x4B,0x80,0x92,0x8A,0x2F,0x99,0x8A,0x80,0x30,0x99, + 0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x0D,0xE5,0x02,0x29,0xFC,0xD1, + 0x30,0x99,0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x30,0x99,0x49,0x8B, + 0x41,0x83,0x30,0x99,0x89,0x8B,0x81,0x83,0xFE,0xE4,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x70,0x08,0x00,0x20,0x14,0x20,0x9F,0xE5,0x01,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5, + 0x02,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x01,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1, + 0xFB,0x0A,0x00,0x20,0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0, + 0x1C,0x8F,0x1A,0x4B,0x1B,0x7A,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D, + 0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E, + 0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0, + 0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0, + 0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42, + 0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xFD,0x0A,0x00,0x20,0x78,0x47,0xC0,0x46,0x14,0x20,0x9F,0xE5,0x02,0x10,0x81,0xE2, + 0x00,0x20,0xD2,0xE5,0x04,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x02,0x00,0x80,0xE2, + 0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20,0xFE,0xB5,0x04,0x00,0x88,0x1A,0xC0,0x1A, + 0x0D,0x00,0x16,0x00,0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x1F,0x00,0x20,0x38, + 0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x9C,0xFD,0x69,0x00,0x01,0x90, + 0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00, + 0x00,0xF0,0x90,0xFD,0x00,0x90,0xA8,0x19,0xC0,0x19,0x41,0x00,0x08,0x19,0x02,0x22, + 0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x82,0xFD, + 0x02,0x00,0x00,0x99,0x01,0x98,0x00,0xF0,0x7D,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x04,0x4B,0x03,0x4A,0x1B,0x78,0x58,0x43,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5, + 0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30, + 0x0D,0x49,0x01,0x20,0x10,0xB5,0x40,0x07,0x4A,0x69,0x92,0x06,0xFC,0xD4,0xCA,0x68, + 0x4B,0x68,0x4B,0x60,0x04,0xE0,0x4B,0x69,0x9B,0x06,0xFC,0xD4,0x8B,0x69,0x08,0xC0, + 0x52,0x1E,0xF8,0xD2,0x2E,0x20,0x48,0x60,0x48,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0x87,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0x18,0x0A,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x0F,0x0A,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4, + 0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0, + 0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25, + 0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C, + 0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1, + 0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xF1,0xFB,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E, + 0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xE0,0xFB, + 0xC3,0xE7,0x00,0x00,0xFA,0x0A,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x01,0x49,0x20,0x20, + 0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68, + 0x3D,0x48,0x01,0x29,0x80,0x7A,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29, + 0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x25,0x27,0x7F,0x01,0x3B,0xE0, + 0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x08,0x38,0x01,0xF0,0xFC,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E, + 0x36,0x18,0xF6,0x19,0x36,0x7E,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43, + 0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7E, + 0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x76,0xED,0xE7,0x40,0x1C,0x08,0x28, + 0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46, + 0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18, + 0xDB,0x19,0x1B,0x7E,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x76, + 0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68, + 0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47, + 0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61, + 0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47, + 0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF, + 0x08,0xBC,0x18,0x47,0x2C,0x0B,0x00,0x20,0xF0,0xB5,0x85,0xB0,0xFE,0xF7,0xB8,0xFB, + 0xFE,0xF7,0x96,0xFB,0x02,0xF0,0xE0,0xF9,0x00,0xF0,0xDA,0xFD,0x00,0xF0,0xFA,0xFB, + 0xFE,0xF7,0x08,0xF8,0xFD,0xF7,0x46,0xFA,0x38,0x49,0x37,0x48,0xC9,0x88,0x40,0x7F, + 0x49,0x06,0x02,0xD4,0x34,0x48,0xC0,0x38,0x40,0x7E,0x00,0x28,0x04,0xD1,0xFF,0xF7, + 0x43,0xFA,0xFF,0xF7,0xED,0xF9,0x03,0xE0,0xFF,0xF7,0xEA,0xF9,0xFF,0xF7,0x3C,0xFA, + 0x02,0xF0,0xE0,0xFC,0x02,0xF0,0x48,0xFB,0x01,0x26,0x76,0x07,0x30,0x68,0x00,0x28, + 0x07,0xD0,0x70,0x68,0x80,0x0F,0x80,0x07,0x03,0xD5,0x35,0x68,0x02,0x24,0x6D,0x1C, + 0x37,0xE0,0x01,0x24,0x25,0x00,0xA0,0x00,0x87,0x19,0x38,0x68,0x81,0x01,0x04,0x90, + 0x80,0x05,0x80,0x0D,0x02,0x90,0x22,0x48,0x89,0x0D,0x03,0x91,0x00,0x78,0x00,0x28, + 0x03,0xD1,0x02,0xA9,0x03,0xA8,0x02,0xF0,0x6B,0xFB,0x1E,0x4B,0x00,0x21,0x58,0x8C, + 0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x02,0xA9, + 0x40,0x1E,0x03,0x04,0x1B,0x0C,0x03,0xA8,0x03,0xF0,0xD2,0xFA,0x02,0xA9,0x03,0xA8, + 0x03,0xF0,0xA6,0xF9,0x14,0x49,0x04,0x98,0x08,0x40,0x03,0x99,0x89,0x05,0x89,0x09, + 0x08,0x43,0x02,0x99,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x38,0x60, + 0x64,0x1C,0xAC,0x42,0xC7,0xD9,0x30,0x68,0xFC,0xF7,0x5A,0xFF,0xFD,0xF7,0x3E,0xFE, + 0x02,0xF0,0xCA,0xFA,0xFF,0xF7,0xE0,0xFE,0xFC,0xF7,0x9E,0xFE,0x03,0x48,0x40,0x79, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x03,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xF8,0xB5,0x02,0xF0, + 0x3F,0xF9,0xFE,0xF7,0xCD,0xFD,0xFE,0xF7,0x5B,0xFE,0xFE,0xF7,0xA3,0xFE,0x1A,0x48, + 0x00,0x21,0xC0,0x7F,0x03,0xF0,0xE0,0xF8,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20, + 0x28,0x70,0xE8,0x61,0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68, + 0x00,0x07,0x12,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x78,0xFA, + 0xFF,0xF7,0x22,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x6B,0xFA,0xE0,0x6B,0x0B,0x28,0xE6,0xD1, + 0xFE,0xF7,0xE8,0xF9,0x28,0x78,0x00,0x28,0xD9,0xD0,0x01,0xF0,0x23,0xFF,0xD6,0xE7, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x30, + 0xF8,0x0A,0x00,0x20,0x70,0xB5,0x21,0x49,0x1F,0x4A,0xCB,0x88,0x05,0x00,0x10,0x7A, + 0x1F,0x49,0x5C,0x06,0x00,0xD4,0x08,0x79,0x1E,0x4C,0xA4,0x8A,0x00,0x19,0x06,0x06, + 0xD0,0x79,0x36,0x0E,0x5A,0x06,0x00,0xD4,0xC8,0x78,0x1B,0x49,0x2C,0x78,0x4A,0x7C, + 0x00,0x2A,0x0F,0xD1,0x8A,0x7C,0x00,0x2A,0x01,0xD0,0x80,0x1C,0x08,0xE0,0xCA,0x7C, + 0x00,0x2A,0x01,0xD0,0x00,0x1D,0x03,0xE0,0x09,0x7D,0x00,0x29,0x02,0xD0,0x80,0x1D, + 0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00, + 0xFC,0xF7,0xD0,0xFD,0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20, + 0x28,0x70,0x01,0x20,0xF4,0xE7,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x70,0x08,0x00,0x20,0x10,0xB5,0x08,0x24, + 0x20,0x00,0xFE,0xF7,0x5B,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C, + 0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xA0,0x78,0x00,0x00,0x19,0x22,0x10,0xB5,0x06,0x48,0x52,0x01,0x00,0x21,0x01,0xF0, + 0x3B,0xFA,0x51,0x22,0x04,0x48,0xD2,0x00,0x00,0x21,0x01,0xF0,0x35,0xFA,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xC8,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x40,0x22, + 0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0,0x27,0xFA,0x01,0x20,0xA0,0x63,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00, + 0x01,0xF0,0x06,0xFA,0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48, + 0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19,0x01,0xF0,0xF2,0xF9,0x0D,0x48,0x00,0x21, + 0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0,0x0F,0xFA,0x0A,0x48,0x80,0x07,0x07,0xD0, + 0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0xFC,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0x71,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x46,0x06,0x00,0x00,0xF0,0x05,0x00,0x20,0x33,0x21,0x09,0x05, + 0x01,0x20,0x80,0x07,0x41,0x62,0x04,0x49,0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60, + 0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40, + 0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x01,0x00, + 0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0x4B,0xFA,0x64,0x1C, + 0x08,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24, + 0x64,0x03,0x20,0x00,0xFD,0xF7,0x5C,0xF8,0xFE,0xF7,0xE2,0xFC,0xFE,0xF7,0x0C,0xFD, + 0xFE,0xF7,0xD6,0xFC,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B, + 0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7,0x41,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x78,0x00,0x00,0x10,0xB5,0x01,0xF0, + 0xE7,0xFF,0x01,0xF0,0xC7,0xFF,0xFF,0x20,0xFD,0xF7,0x72,0xF8,0xFF,0xF7,0xAE,0xFF, + 0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0,0x9F,0xF9,0x08,0x20,0xFD,0xF7,0x30,0xF8, + 0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x02,0xFE,0x00,0xF0,0x1A,0xF8, + 0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7,0x21,0xF8,0x00,0xF0, + 0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20,0x01,0xF0,0xB5,0xFF,0xFE,0xF7,0x10,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x2C,0x0B,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x78,0x00,0x00,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFD,0xF7, + 0x07,0xF8,0x20,0x02,0xFD,0xF7,0x2E,0xF8,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7, + 0xC1,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0, + 0x1B,0xF8,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x03,0xF0,0x14,0xF8, + 0x30,0x00,0xFC,0xF7,0xE5,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCB,0xFD,0x03,0xF0, + 0xF8,0xF8,0x7D,0x20,0xC0,0x00,0x03,0xF0,0xE7,0xF8,0x00,0x20,0xFF,0xF7,0xA8,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7D,0x70,0x00,0x00,0x0A,0x48,0x10,0xB5, + 0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7, + 0x89,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0xA2,0xF8, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xA5,0x07,0x00, + 0xF8,0x0A,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xD5,0xFE,0xFF,0xF7,0x43,0xFF,0x15,0x48, + 0x00,0x7A,0x02,0xF0,0x07,0xFF,0x13,0x48,0x13,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24, + 0xD1,0x83,0x12,0x49,0x0C,0x60,0x4C,0x60,0x11,0x49,0xD2,0x88,0x49,0x79,0x52,0x06, + 0x02,0xD4,0x01,0x00,0xA0,0x31,0x49,0x78,0x0C,0x4A,0xC0,0x3A,0x51,0x73,0x09,0x49, + 0x80,0x31,0x0A,0x8B,0x09,0x49,0x40,0x39,0xCA,0x62,0x00,0x88,0x08,0x63,0xFF,0xF7, + 0x9D,0xFE,0x08,0x48,0xC4,0x83,0xFE,0xF7,0x19,0xFB,0x07,0x48,0x04,0x70,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0x30,0x07,0x00,0x20,0xF9,0x0A,0x00,0x20,0xF7,0xB5,0x86,0xB0, + 0x00,0x27,0x2E,0x48,0x04,0xAB,0x02,0x97,0x03,0x97,0x81,0xC3,0x2C,0x4E,0xFE,0xF7, + 0xE9,0xFB,0xFE,0xF7,0x97,0xFC,0x2B,0x48,0x40,0x7F,0x01,0x90,0x29,0x48,0x20,0x38, + 0x40,0x7F,0x00,0x25,0x00,0x90,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00, + 0xFF,0xF7,0x38,0xFB,0x00,0x28,0x1C,0xD0,0x23,0x49,0x04,0x9A,0x09,0x78,0x69,0x43, + 0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC, + 0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD, + 0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95, + 0x03,0x91,0x64,0x1C,0x14,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x13,0x48, + 0x00,0x78,0x85,0x42,0xD0,0xD3,0x08,0x99,0x03,0x98,0x08,0x60,0x10,0x48,0x00,0x69, + 0xC0,0x07,0x05,0xD0,0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x04,0xE0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x05,0x98,0x00,0x28,0x00,0xD0, + 0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x68,0x20,0x9F,0xE5,0x04,0xE0,0x2D,0xE5, + 0x5A,0x04,0xD2,0xE5,0x58,0xC0,0x9F,0xE5,0x01,0x00,0x10,0xE3,0x12,0x00,0x00,0x0A, + 0x54,0x10,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x30,0xD1,0xE5,0x0B,0x00,0x00,0xEA, + 0x5A,0xE4,0xD2,0xE5,0x00,0x10,0x82,0xE0,0x89,0x14,0xD1,0xE5,0x02,0x00,0x1E,0xE3, + 0x88,0xE4,0xD2,0xE5,0x9E,0x13,0x21,0x00,0x93,0xE1,0x21,0x10,0x01,0x11,0x9C,0xE7, + 0x80,0xE0,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x00,0x80,0xE2,0xB0,0x11,0xCE,0xE1, + 0x5B,0x14,0xD2,0xE5,0x00,0x00,0x51,0xE1,0xF0,0xFF,0xFF,0x8A,0x04,0xE0,0x9D,0xE4, + 0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20, + 0xFF,0xB5,0x4E,0x4C,0x85,0xB0,0x24,0x78,0x0F,0x99,0x0E,0x9A,0x02,0x94,0x4C,0x4C, + 0xD7,0x00,0x26,0x79,0x00,0x20,0x05,0x00,0xB6,0x00,0x34,0x19,0xE0,0x34,0x10,0x26, + 0xA6,0x5F,0xB6,0x46,0x12,0x26,0xA6,0x5F,0xB4,0x46,0x76,0x46,0xB6,0x1C,0x34,0x04, + 0x24,0x14,0x66,0x46,0xB6,0x1C,0x01,0x94,0x34,0x04,0x24,0x14,0x00,0x94,0x3F,0x4C, + 0x07,0x9E,0x24,0x78,0x03,0x97,0x24,0x1D,0x04,0x94,0x06,0x9C,0x3C,0x19,0x01,0x2E, + 0x12,0xD0,0x02,0x2E,0x1B,0xD0,0x03,0x2E,0x54,0xD0,0x04,0x2E,0x26,0xD1,0x04,0x9D, + 0x00,0x98,0x02,0x9E,0x68,0x43,0x01,0x9D,0xED,0x18,0x40,0x19,0x05,0x06,0x2D,0x0E, + 0x60,0x46,0x70,0x43,0xE6,0x88,0x16,0xE0,0x00,0x98,0x04,0x9D,0xC0,0x1A,0x68,0x43, + 0x01,0x9D,0x06,0x9E,0x40,0x19,0x05,0x06,0xF0,0x5B,0x2D,0x0E,0x08,0xE0,0x00,0x98, + 0x04,0x9D,0xC0,0x18,0x68,0x43,0x01,0x9D,0x40,0x19,0x05,0x06,0x60,0x88,0x2D,0x0E, + 0x02,0x9E,0x70,0x43,0x76,0x46,0x80,0x19,0x00,0x06,0x00,0x0E,0x25,0x4E,0x6D,0x00, + 0x75,0x5F,0x25,0x4E,0x16,0x27,0xF7,0x5F,0xBD,0x42,0x3D,0xDD,0x07,0x9D,0x01,0x2D, + 0x2D,0xD0,0x02,0x2D,0x31,0xD0,0x03,0x2D,0x32,0xD0,0x04,0x2D,0x06,0xD1,0x73,0x44, + 0xE3,0x80,0x0B,0x00,0x00,0xD1,0x13,0x00,0x05,0x9C,0x23,0x54,0x18,0x4C,0x53,0x00, + 0x1B,0x19,0xFF,0x33,0x41,0x33,0x00,0x29,0x04,0xD0,0x05,0x99,0x52,0x1E,0x08,0x5C, + 0x90,0x42,0x02,0xD0,0xD8,0x88,0x40,0x1C,0xD8,0x80,0x01,0x20,0x09,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x04,0x9D,0x00,0x98,0x02,0x9E,0x68,0x43,0x01,0x9D,0x40,0x19, + 0xC0,0x1A,0x05,0x06,0x2D,0x0E,0x60,0x46,0x70,0x43,0xA6,0x88,0xC3,0xE7,0x64,0x46, + 0xE3,0x1A,0x06,0x9D,0x03,0x9C,0x2B,0x53,0xD3,0xE7,0x63,0x44,0x63,0x80,0xD0,0xE7, + 0x75,0x46,0xEB,0x1A,0xA3,0x80,0xCC,0xE7,0x00,0x20,0xDF,0xE7,0xFB,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xC8,0x02,0x00,0x20,0x30,0x07,0x00,0x20,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x02,0x00,0x08,0x00,0x8A,0x42,0x00,0xDC, + 0x10,0x00,0x70,0x47,0xF0,0xB5,0xE6,0x48,0xE6,0x4F,0x86,0x89,0xF8,0x88,0xFD,0xB0, + 0x41,0x06,0x02,0xD4,0xE2,0x49,0xC0,0x39,0x0E,0x89,0xE3,0x49,0x09,0x78,0x74,0x91, + 0xE2,0x49,0x0A,0x78,0x74,0x99,0x91,0x42,0x73,0x92,0x00,0xD8,0x11,0x00,0x72,0x91, + 0x00,0x21,0x6D,0x91,0x6C,0x91,0xDA,0x49,0xDD,0x4D,0x20,0x39,0x7C,0x91,0x8C,0x8B, + 0x40,0x06,0x00,0xD4,0x2C,0x8B,0xDB,0x48,0x08,0x22,0x00,0x21,0x00,0xF0,0x44,0xFF, + 0xD8,0x48,0x10,0x22,0x00,0x21,0x08,0x30,0x00,0xF0,0x3E,0xFF,0xFF,0x22,0x01,0x32, + 0x00,0x21,0x2C,0xA8,0x00,0xF0,0x38,0xFF,0x48,0x22,0x00,0x21,0x1A,0xA8,0x00,0xF0, + 0x33,0xFF,0x20,0x22,0x00,0x21,0x12,0xA8,0x00,0xF0,0x2E,0xFF,0x20,0x22,0x00,0x21, + 0x0A,0xA8,0x00,0xF0,0x29,0xFF,0x20,0x22,0x00,0x21,0x02,0xA8,0x00,0xF0,0x24,0xFF, + 0xC4,0x48,0x64,0x21,0x00,0x89,0x07,0x00,0x70,0x43,0xFC,0xF7,0xA1,0xF9,0xC5,0x49, + 0xC0,0x4A,0x89,0x1C,0x7B,0x91,0xBF,0x49,0xC9,0x89,0x40,0x18,0x7B,0x99,0xC8,0x82, + 0xC1,0x48,0x00,0x21,0x01,0x81,0x7C,0x99,0xD2,0x88,0x89,0x7F,0x06,0x00,0x38,0x00, + 0x52,0x06,0x00,0xD4,0xA9,0x7E,0x48,0x43,0x64,0x21,0xFC,0xF7,0x63,0xFA,0x00,0x04, + 0x00,0x14,0xA0,0x42,0x70,0x81,0x00,0xDA,0x74,0x81,0xB2,0x48,0x01,0x79,0x00,0x29, + 0x7D,0xD0,0x00,0x27,0xDC,0xE0,0xAF,0x48,0xB9,0x00,0x08,0x18,0xE0,0x30,0x10,0x25, + 0x12,0x21,0x45,0x5F,0x41,0x5E,0x01,0x20,0x7E,0x1C,0x75,0x91,0x6F,0x90,0x6E,0x90, + 0x71,0x90,0x70,0x90,0xF0,0x00,0x1A,0xAA,0x7A,0x90,0x11,0x52,0x80,0x18,0x75,0x99, + 0x79,0x90,0x41,0x80,0x85,0x80,0x00,0x2F,0xC5,0x80,0x20,0xDD,0x38,0x00,0x1A,0xAC, + 0x1A,0xE0,0xC2,0x00,0x11,0x19,0x04,0x23,0xCB,0x5E,0xAB,0x42,0x13,0xDC,0x06,0x23, + 0xCB,0x5E,0xAB,0x42,0x0F,0xDB,0xA2,0x5E,0x75,0x9B,0x9A,0x42,0x0B,0xDC,0x02,0x22, + 0x8A,0x5E,0x9A,0x42,0x07,0xDB,0x01,0x06,0x09,0x0E,0x6D,0x91,0x6C,0x99,0x49,0x1C, + 0x09,0x06,0x09,0x0E,0x6C,0x91,0x40,0x1E,0x00,0x28,0xE2,0xDC,0x01,0xE0,0x00,0x20, + 0x6D,0x90,0x00,0x24,0x5C,0xE0,0x6F,0x98,0x01,0x28,0x0D,0xD1,0xA5,0x42,0x0B,0xDB, + 0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x01,0x22,0x1A,0xA9, + 0x2C,0xA8,0xFF,0xF7,0x75,0xFE,0x00,0xE0,0x00,0x20,0x00,0x2C,0x6F,0x90,0x3E,0xDD, + 0x6E,0x98,0x01,0x28,0x10,0xD1,0x75,0x98,0x73,0x99,0x00,0x19,0x88,0x42,0x0B,0xDA, + 0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x02,0x22,0x1A,0xA9, + 0x2C,0xA8,0xFF,0xF7,0x5D,0xFE,0x00,0xE0,0x00,0x20,0x6E,0x90,0x71,0x98,0x01,0x28, + 0x0E,0xD1,0xA5,0x42,0x0C,0xDB,0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0, + 0x23,0x00,0x03,0x22,0x1A,0xA9,0x2C,0xA8,0xFF,0xF7,0x4A,0xFE,0x01,0xE0,0xDB,0xE0, + 0x00,0x20,0x71,0x90,0x70,0x98,0x01,0x28,0x0F,0xD1,0x74,0x99,0x28,0x19,0x88,0x42, + 0x0B,0xDA,0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x04,0x22, + 0x1A,0xA9,0x2C,0xA8,0xFF,0xF7,0x34,0xFE,0x00,0xE0,0x00,0x20,0x70,0x90,0x6E,0x99, + 0x6F,0x98,0x08,0x43,0x71,0x99,0x08,0x43,0x70,0x99,0x08,0x43,0x03,0xD0,0x64,0x1C, + 0x72,0x98,0x84,0x42,0x9F,0xDB,0x6D,0x98,0x00,0x28,0x38,0xD0,0x5D,0x49,0x40,0x00, + 0x40,0x18,0x72,0x00,0x52,0x18,0xFF,0x30,0xFF,0x32,0x41,0x30,0x41,0x32,0xC3,0x88, + 0xD1,0x88,0x59,0x18,0xC1,0x80,0x7A,0x98,0x1A,0xAB,0x19,0x5E,0x6D,0x98,0xC0,0x00, + 0x1C,0x5E,0xA1,0x42,0x00,0xDA,0x19,0x52,0x79,0x9C,0x02,0x21,0x61,0x5E,0xC0,0x18, + 0x02,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDD,0x41,0x80,0x79,0x9C,0x04,0x21,0x61,0x5E, + 0x04,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDA,0x81,0x80,0x79,0x9C,0x06,0x21,0x61,0x5E, + 0x06,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDD,0xC1,0x80,0x00,0x20,0xD0,0x80,0x7A,0x99, + 0x58,0x52,0x79,0x99,0x48,0x80,0x79,0x99,0x88,0x80,0x79,0x99,0xC8,0x80,0x7F,0x1C, + 0x40,0x48,0x01,0x79,0xB9,0x42,0x00,0xDD,0x1D,0xE7,0x02,0x79,0x6C,0x99,0x51,0x1A, + 0x01,0x24,0x01,0x71,0x6C,0xE0,0xE0,0x00,0x1A,0xA9,0x0B,0x5E,0x41,0x18,0x02,0x20, + 0x77,0x91,0x08,0x5E,0x9B,0x1C,0x80,0x1C,0x76,0x90,0x41,0xE0,0x77,0x98,0x04,0x21, + 0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x89,0x1C,0x80,0x1C,0x78,0x90,0x33,0xE0, + 0x74,0x9A,0x98,0x1E,0x84,0x46,0x50,0x43,0x8D,0x1E,0x2C,0xAA,0x52,0x19,0x80,0x5C, + 0x00,0x28,0x27,0xD0,0x74,0x98,0x31,0x4E,0x00,0x1D,0x58,0x43,0x40,0x18,0x40,0x00, + 0x30,0x5E,0x7B,0x9F,0x16,0x26,0xBE,0x5F,0x00,0x22,0xB0,0x42,0x00,0xDD,0x82,0x1B, + 0x24,0x4F,0x6D,0x00,0xED,0x19,0x2D,0x8C,0xA0,0x00,0x12,0xAE,0x55,0x43,0x36,0x58, + 0x75,0x19,0x12,0xAE,0x35,0x50,0x66,0x46,0x76,0x00,0xF6,0x19,0x40,0x36,0xB6,0x88, + 0x0A,0xAD,0x2D,0x58,0x56,0x43,0xAD,0x19,0x0A,0xAE,0x35,0x50,0x02,0xAD,0x2E,0x58, + 0xB2,0x18,0x2A,0x50,0x78,0x98,0x49,0x1C,0x88,0x42,0xC9,0xDA,0x76,0x98,0x5B,0x1C, + 0x98,0x42,0xBB,0xDA,0xA5,0x00,0x02,0xA8,0x46,0x59,0x00,0x2E,0x12,0xD0,0x12,0xA8, + 0x40,0x59,0x31,0x00,0xFC,0xF7,0x16,0xF9,0x0E,0x49,0x62,0x00,0x57,0x18,0xFF,0x21, + 0x1F,0x31,0xC8,0x53,0x0A,0xA8,0x40,0x59,0x31,0x00,0xFC,0xF7,0x0B,0xF9,0xFF,0x37, + 0x21,0x37,0xF8,0x81,0x07,0x48,0x00,0x19,0xFF,0x30,0x21,0x30,0x44,0x77,0x64,0x1C, + 0x04,0x48,0x00,0x79,0xA0,0x42,0x8E,0xDA,0x7D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0x2E,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xE7,0xB0,0x42,0x90,0x32,0x90,0x0D,0x90,0xFF,0x48,0x66,0x90, + 0x02,0x8A,0xFF,0x49,0xC8,0x88,0x43,0x06,0x02,0xD4,0xFC,0x4A,0xC0,0x3A,0x92,0x89, + 0xFA,0x4D,0xFC,0x4C,0x20,0x35,0x0C,0x92,0xAA,0x89,0x43,0x06,0x00,0xD4,0x22,0x89, + 0xF9,0x4B,0x0B,0x92,0xF5,0x4A,0x40,0x32,0x65,0x92,0x52,0x89,0x46,0x06,0x64,0x93, + 0x00,0xD4,0xDA,0x88,0x43,0x06,0x0A,0x92,0x65,0x9A,0x12,0x79,0x01,0xD4,0x64,0x9A, + 0x12,0x78,0x43,0x06,0x09,0x92,0x65,0x9A,0x52,0x79,0x01,0xD4,0x64,0x9A,0x52,0x78, + 0x43,0x06,0x08,0x92,0x65,0x9A,0x12,0x8B,0x01,0xD4,0x64,0x9A,0x92,0x8A,0x40,0x06, + 0x07,0x92,0x2F,0x89,0x00,0xD4,0xA7,0x88,0xE8,0x48,0x29,0x22,0x06,0x78,0xE8,0x48, + 0x00,0x78,0x06,0x90,0xE2,0x48,0xC0,0x89,0x05,0x90,0x01,0x20,0x04,0x90,0x00,0x20, + 0x01,0x00,0x02,0x90,0x0E,0xA8,0x00,0xF0,0x3F,0xFD,0xE2,0x48,0xDC,0x49,0x08,0x81, + 0xDB,0x48,0x00,0x21,0x81,0x81,0x41,0x81,0xC0,0x30,0x63,0x90,0x41,0x80,0xA0,0x30, + 0x62,0x90,0x40,0x78,0xDC,0x49,0x02,0x28,0x61,0x91,0x53,0xD9,0xD4,0x4A,0x69,0x8A, + 0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x89,0x36,0x91,0xD8,0x49,0x36,0x9A,0x60,0x91, + 0x89,0x8B,0x89,0x18,0x37,0x91,0x0C,0x99,0xC9,0x04,0x25,0xD5,0x01,0x28,0x0C,0xD9, + 0xCB,0x4A,0xE9,0x7A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x79,0x48,0x43,0x00,0x06, + 0x00,0x0E,0x04,0x90,0x01,0xD1,0x01,0x20,0x04,0x90,0x63,0x99,0xC4,0x4A,0x00,0x20, + 0x08,0x5E,0xD2,0x88,0xA9,0x7A,0x52,0x06,0x00,0xD4,0xA1,0x79,0x48,0x43,0x64,0x21, + 0xFB,0xF7,0x86,0xFF,0x00,0x04,0x00,0x0C,0xB8,0x42,0x00,0xD2,0x38,0x00,0x04,0x99, + 0xFC,0xF7,0x58,0xF8,0x63,0x99,0x48,0x80,0xB9,0x49,0x65,0x98,0xC9,0x88,0x40,0x8B, + 0x49,0x06,0x01,0xD4,0x64,0x98,0xC0,0x8A,0x61,0x99,0x89,0x8B,0x40,0x18,0x37,0x99, + 0x35,0x90,0x88,0x42,0x34,0x91,0x00,0xD2,0x37,0x90,0x02,0x20,0x4D,0x90,0xAF,0x48, + 0xC0,0x30,0x5F,0x90,0xB4,0x48,0xA0,0x38,0x5E,0x90,0x06,0x98,0x80,0x1C,0x53,0x90, + 0x4D,0x98,0x95,0xE3,0x02,0x28,0x08,0xD1,0xA9,0x4A,0x29,0x8A,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0xA1,0x89,0x61,0x9A,0x52,0x8B,0x0E,0xE0,0xAD,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0xAC,0x49,0x89,0x89,0x05,0xE0,0xA1,0x4A,0xE9,0x89,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0x61,0x89,0x61,0x9A,0x12,0x8B,0x89,0x18,0x95,0xE7,0x02,0x24,0xB0,0x1C, + 0x54,0x90,0x6A,0xE3,0x4D,0x98,0x54,0x99,0x40,0x1E,0x48,0x43,0x61,0x1E,0x40,0x18, + 0x00,0x04,0x07,0x14,0xA0,0x49,0x78,0x00,0x5D,0x90,0x08,0x5E,0x37,0x99,0x09,0x04, + 0x09,0x14,0x88,0x42,0x7B,0xDB,0x78,0x1C,0xC1,0x10,0x0E,0xAA,0x52,0x5C,0x41,0x07, + 0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40,0xF8,0x10,0x0E,0xA9,0x5C,0x90,0x09,0x5C, + 0x7B,0x07,0x5B,0x0F,0x01,0x20,0x98,0x40,0x01,0x40,0x5B,0x90,0x78,0x1E,0xC3,0x10, + 0x0E,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0, + 0x4F,0xFC,0x01,0x90,0xB8,0x1B,0x41,0x1E,0xCA,0x10,0x0E,0xAB,0x9A,0x5C,0x4B,0x07, + 0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40,0x83,0x1E,0xD9,0x10,0x0E,0xAD,0x69,0x5C, + 0x5D,0x07,0x6D,0x0F,0x01,0x23,0xAB,0x40,0x19,0x40,0xC0,0x1E,0xC3,0x10,0x0E,0xAD, + 0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0,0x30,0xFC, + 0x01,0x99,0x01,0xF0,0x2B,0xFC,0x00,0x28,0x39,0xD1,0x7B,0x48,0x32,0x00,0x39,0x00, + 0x02,0x23,0xFE,0xF7,0x29,0xFF,0x37,0x99,0x88,0x42,0xB3,0xDB,0x76,0x49,0x5D,0x9A, + 0x89,0x5E,0x81,0x42,0xF0,0xD1,0x6A,0x4F,0xBA,0x89,0x82,0x42,0x00,0xDA,0xB8,0x81, + 0x5C,0x9A,0x0E,0xAB,0x9A,0x5C,0x5B,0x9D,0x2A,0x43,0x5C,0x9D,0x5A,0x55,0x64,0x4A, + 0x92,0x89,0x82,0x42,0x05,0xD1,0x62,0x48,0x00,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E, + 0x0D,0x90,0x00,0x20,0x05,0x00,0x03,0x90,0x5E,0x98,0x80,0x7E,0xC2,0x07,0x20,0xD0, + 0x80,0x07,0x0D,0xD5,0x30,0x1B,0x40,0x1C,0x00,0xD1,0x75,0x1E,0xA6,0x42,0x04,0xD1, + 0x01,0x22,0x30,0x04,0x52,0x04,0x80,0x1A,0x05,0x43,0x01,0x20,0x10,0xE0,0xA4,0xE0, + 0x4D,0x9A,0x06,0x98,0x80,0x1A,0x40,0x1C,0x01,0xD1,0x06,0x9D,0x6D,0x1E,0x06,0x98, + 0x90,0x42,0x04,0xD1,0x01,0x22,0x00,0x04,0x12,0x05,0x80,0x1A,0x05,0x43,0x02,0x20, + 0x03,0x90,0x28,0x04,0x01,0xD0,0x35,0x98,0x00,0xE0,0x34,0x98,0x00,0x04,0x00,0x14, + 0x81,0x42,0xB2,0xDB,0x4D,0x99,0x30,0x1D,0x41,0x43,0x5A,0x90,0x08,0x19,0x00,0x04, + 0x00,0x14,0x33,0x90,0x0C,0x98,0xC0,0x04,0x0C,0xD5,0x33,0x98,0x4B,0x49,0x40,0x00, + 0x08,0x5E,0x05,0x99,0x40,0x1A,0x00,0x28,0x77,0xDD,0x63,0x9A,0x02,0x21,0x51,0x5E, + 0x81,0x42,0x72,0xDA,0x04,0x20,0x4E,0x90,0x20,0x18,0x59,0x90,0x4E,0x98,0x04,0x27, + 0x80,0x00,0x58,0x90,0x59,0x98,0x00,0x1F,0x0D,0xD4,0x59,0x98,0x00,0x1F,0xB0,0x42, + 0x09,0xDA,0x4D,0x98,0xC0,0x19,0x57,0x90,0x00,0x1F,0x04,0xD4,0x57,0x98,0x06,0x99, + 0x00,0x1F,0x88,0x42,0x07,0xDB,0x14,0x20,0x78,0x43,0x00,0x21,0x19,0xAA,0x80,0x18, + 0x58,0x9A,0x81,0x50,0x27,0xE0,0x05,0x98,0x0C,0x99,0x00,0x04,0x00,0x14,0xC9,0x04, + 0x04,0xD5,0x04,0x99,0xFB,0xF7,0x54,0xFE,0x00,0x04,0x00,0x14,0x57,0x99,0x5A,0x9A, + 0x89,0x1E,0x51,0x43,0x59,0x9A,0x89,0x18,0x2C,0x4A,0x49,0x00,0x89,0x18,0x20,0x39, + 0x89,0x8B,0x08,0x1A,0x00,0x04,0x00,0x14,0x00,0xD5,0x00,0x20,0x07,0x99,0x00,0x29, + 0x03,0xD0,0x88,0x42,0x01,0xDD,0x08,0x04,0x00,0x14,0x14,0x21,0x79,0x43,0x19,0xAA, + 0x89,0x18,0x58,0x9A,0x88,0x50,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xBA,0xD5,0x4E,0x98, + 0x40,0x1E,0x00,0x04,0x00,0x14,0x4E,0x90,0xAE,0xD5,0x33,0x98,0x1B,0x4A,0x40,0x00, + 0x84,0x46,0x80,0x18,0x01,0x00,0x20,0x39,0x1E,0x23,0xCB,0x5E,0x05,0x99,0x59,0x1A, + 0x41,0x91,0x02,0x21,0x41,0x5E,0x05,0x98,0x05,0x9B,0x08,0x1A,0x40,0x90,0x33,0x98, + 0x18,0x21,0x80,0x1B,0x40,0x00,0x80,0x18,0x20,0x38,0x41,0x5E,0xC9,0x1A,0x3F,0x91, + 0x33,0x99,0x89,0x19,0x49,0x00,0x89,0x18,0x1A,0xE0,0x3B,0xE1,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x00,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20, + 0x04,0x0B,0x00,0x20,0xA0,0x7A,0x00,0x00,0x40,0x00,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x08,0x23,0xCB,0x5E,0x05,0x9F,0xDB,0x1B,0x3E,0x93,0x16,0x23,0xC3,0x5E,0xDB,0x1B, + 0x3D,0x93,0x06,0x23,0xCB,0x5E,0xDB,0x1B,0x3C,0x93,0x1A,0x23,0xC3,0x5E,0xD8,0x1B, + 0x3B,0x90,0x0A,0x20,0x08,0x5E,0x0B,0x99,0xC0,0x1B,0x3A,0x90,0x60,0x46,0x10,0x5E, + 0xC0,0x1B,0x48,0x43,0x64,0x21,0xFB,0xF7,0xD3,0xFD,0x38,0x90,0x26,0x98,0x02,0x04, + 0x24,0x98,0x12,0x14,0x03,0x04,0x21,0x98,0x00,0x92,0x02,0x04,0x20,0x98,0x1B,0x14, + 0x01,0x04,0x1F,0x98,0x12,0x14,0x00,0x04,0x09,0x14,0x00,0x14,0xFF,0xF7,0xB9,0xFB, + 0x07,0x00,0x2B,0x98,0x02,0x04,0x2A,0x98,0x12,0x14,0x01,0x04,0x29,0x98,0x09,0x14, + 0x00,0x04,0x00,0x14,0xFF,0xF7,0xA6,0xFB,0x01,0x00,0x38,0x00,0xFF,0xF7,0x9E,0xFB, + 0x25,0x99,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42,0x05,0xDD,0x08,0x1A, + 0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x02,0x90,0xFB,0x48,0xFF,0x21,0xC0,0x88, + 0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20,0x02,0x90,0xF7,0x48, + 0x00,0x78,0x00,0x28,0x47,0xD1,0x20,0xA9,0x06,0xC9,0x02,0x2C,0x14,0xD1,0x01,0xF0, + 0xCF,0xFA,0x07,0x00,0x00,0x21,0x26,0x9A,0x08,0x00,0x01,0xF0,0xC9,0xFA,0x2A,0xA9, + 0x06,0xC9,0x3F,0x18,0x00,0x20,0x01,0xF0,0xC3,0xFA,0x38,0x18,0x05,0x21,0xFB,0xF7, + 0x7F,0xFD,0x00,0x04,0x00,0x0C,0x13,0xE0,0x1F,0x98,0x01,0xF0,0xB9,0xFA,0x07,0x00, + 0x26,0x9A,0x24,0x98,0x00,0x21,0x01,0xF0,0xB3,0xFA,0x3F,0x18,0x29,0xA8,0x07,0xC8, + 0x01,0xF0,0xAE,0xFA,0x38,0x18,0xC1,0x17,0x49,0x0F,0x08,0x18,0x40,0x03,0x00,0x0C, + 0x25,0x99,0x09,0x1A,0x00,0x29,0x01,0xDC,0x25,0x99,0x41,0x1A,0x5F,0x98,0x02,0x8A, + 0xD9,0x48,0xC0,0x88,0x43,0x06,0x01,0xD4,0x66,0x9A,0x92,0x89,0x91,0x42,0x0A,0xDA, + 0x5F,0x99,0x25,0x9A,0x49,0x8A,0x40,0x06,0x01,0xD4,0x66,0x98,0xC1,0x89,0x8A,0x42, + 0x01,0xDA,0x28,0x04,0x7E,0xD0,0x00,0x2D,0x2B,0xD0,0x03,0x98,0xC0,0x07,0x16,0xD0, + 0x04,0x20,0x00,0x22,0x19,0xAB,0x29,0x04,0x06,0xD0,0x14,0x27,0x01,0x00,0x79,0x43, + 0x5A,0x50,0xC9,0x18,0x4A,0x60,0x05,0xE0,0x14,0x27,0x01,0x00,0x79,0x43,0xC9,0x18, + 0xCA,0x60,0x0A,0x61,0x40,0x1E,0x00,0x04,0x00,0x14,0xEC,0xD5,0x11,0xE0,0x04,0x20, + 0x00,0x22,0x19,0xAB,0x29,0x04,0x04,0xD0,0x81,0x00,0x5A,0x50,0xC9,0x18,0x4A,0x61, + 0x03,0xE0,0x81,0x00,0xC9,0x18,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xF0,0xD5,0xBB,0x48,0x33,0x99,0x32,0x00,0x04,0x23,0xFE,0xF7,0x5D,0xFD,0xB6,0x49, + 0x0A,0x89,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81, + 0xB1,0x48,0x01,0x79,0x49,0x1C,0x0A,0x06,0x12,0x0E,0x02,0x71,0x92,0x00,0xA1,0x1E, + 0x12,0x18,0xE0,0x32,0x56,0x91,0x91,0x81,0x4D,0x99,0x89,0x1E,0x55,0x91,0x02,0x79, + 0x92,0x00,0x10,0x18,0xE0,0x30,0xC1,0x81,0x00,0x20,0x07,0x00,0x01,0x00,0x84,0x46, + 0x39,0x90,0x41,0x9A,0x38,0x98,0x82,0x42,0x06,0xDC,0x38,0x9A,0x3D,0x98,0x90,0x42, + 0x02,0xDC,0x3C,0x98,0x90,0x42,0x01,0xDD,0x01,0x20,0x39,0x90,0x38,0x9A,0x40,0x98, + 0x90,0x42,0x05,0xDC,0x3B,0x98,0x90,0x42,0x02,0xDC,0x3A,0x98,0x90,0x42,0x01,0xDD, + 0x01,0x20,0x84,0x46,0x3F,0x98,0x90,0x42,0x05,0xDC,0x3D,0x98,0x90,0x42,0x02,0xDC, + 0x3B,0x98,0x90,0x42,0x00,0xDD,0x01,0x27,0x3E,0x98,0x90,0x42,0x07,0xDC,0x3C,0x98, + 0x90,0x42,0x00,0xE0,0xF5,0xE0,0x02,0xDC,0x3A,0x98,0x90,0x42,0x00,0xDD,0x01,0x21, + 0x04,0x20,0x00,0x22,0x19,0xAD,0x39,0x9B,0x00,0x2B,0x02,0xD1,0x14,0x23,0x43,0x43, + 0xEA,0x50,0x63,0x46,0x00,0x2B,0x03,0xD1,0x14,0x23,0x43,0x43,0x5B,0x19,0x1A,0x61, + 0x00,0x2F,0x01,0xD1,0x83,0x00,0xEA,0x50,0x00,0x29,0x02,0xD1,0x83,0x00,0x5B,0x19, + 0x1A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xE5,0xD5,0x1D,0x9A,0x19,0xA8,0x00,0x92, + 0x0F,0xC8,0x01,0xF0,0xE8,0xF9,0x4A,0x90,0x22,0x9A,0x1E,0xA8,0x00,0x92,0x0F,0xC8, + 0x01,0xF0,0xE1,0xF9,0x27,0x9A,0x49,0x90,0x23,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0, + 0xDA,0xF9,0x2C,0x9A,0x48,0x90,0x28,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xD3,0xF9, + 0x31,0x9A,0x47,0x90,0x2D,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xCC,0xF9,0x46,0x90, + 0x00,0x90,0x47,0x9B,0x48,0x9A,0x49,0x99,0x4A,0x98,0x01,0xF0,0xC4,0xF9,0x00,0x28, + 0x4B,0x90,0x0F,0xD1,0x04,0x27,0x14,0x20,0x78,0x43,0x40,0x19,0x0A,0x22,0x00,0x21, + 0x00,0xF0,0xF2,0xF9,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xF4,0xD5,0x0A,0x20,0x48,0x90, + 0x25,0x90,0x4B,0x90,0x56,0x98,0x00,0x28,0x01,0xDC,0x00,0x20,0x0C,0xE0,0x2D,0x9A, + 0x00,0x92,0x28,0x9B,0x23,0x9A,0x1E,0x99,0x19,0x98,0x01,0xF0,0xA4,0xF9,0x5A,0x4A, + 0x61,0x00,0x89,0x18,0x49,0x8B,0x48,0x43,0x2E,0x9A,0x45,0x90,0x00,0x92,0x29,0x9B, + 0x24,0x9A,0x1F,0x99,0x1A,0x98,0x01,0xF0,0x96,0xF9,0x53,0x49,0x62,0x00,0x55,0x18, + 0xA9,0x8B,0x2F,0x9A,0x2A,0x9B,0x48,0x43,0x44,0x90,0x00,0x92,0x25,0x9A,0x20,0x99, + 0x1B,0x98,0x01,0xF0,0x88,0xF9,0xE9,0x8B,0x30,0x9A,0x2B,0x9B,0x48,0x43,0x43,0x90, + 0x00,0x92,0x26,0x9A,0x21,0x99,0x1C,0x98,0x01,0xF0,0x7D,0xF9,0x29,0x8C,0x48,0x43, + 0x56,0x99,0x07,0x00,0x70,0x1E,0x81,0x42,0x01,0xDB,0x00,0x20,0x09,0xE0,0x31,0x9A, + 0x2C,0x9B,0x00,0x92,0x27,0x9A,0x22,0x99,0x1D,0x98,0x01,0xF0,0x6C,0xF9,0x69,0x8C, + 0x48,0x43,0x00,0x90,0x43,0x9A,0x44,0x99,0x45,0x98,0x3B,0x00,0x01,0xF0,0x63,0xF9, + 0x4B,0x99,0xFB,0xF7,0x1D,0xFC,0x38,0x49,0x0A,0x8C,0x52,0x00,0x80,0x1A,0x00,0xD5, + 0x00,0x20,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0x90,0x81,0x55,0x98,0x00,0x28, + 0x01,0xDC,0x00,0x20,0x05,0xE0,0x4D,0x98,0x4A,0x9A,0x40,0x00,0x40,0x18,0xC0,0x8F, + 0x50,0x43,0x4D,0x9A,0x2C,0x49,0x52,0x00,0x52,0x18,0x40,0x32,0x11,0x88,0x49,0x9B, + 0x48,0x9D,0x59,0x43,0x53,0x88,0x06,0x9F,0x6B,0x43,0x9C,0x46,0x93,0x88,0x47,0x9D, + 0x7F,0x1E,0x6B,0x43,0x55,0x9D,0xBD,0x42,0x01,0xDB,0x00,0x22,0x02,0xE0,0xD2,0x88, + 0x46,0x9D,0x6A,0x43,0x00,0x92,0x62,0x46,0x01,0xF0,0x2D,0xF9,0x4B,0x99,0xFB,0xF7, + 0xE7,0xFB,0x1D,0x49,0x40,0x31,0x89,0x88,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20, + 0x19,0x49,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0xD0,0x83,0x08,0x79,0x08,0x28, + 0x12,0xD2,0x64,0x1C,0x54,0x98,0x24,0x04,0x24,0x14,0x84,0x42,0x00,0xDA,0x91,0xE4, + 0x42,0x98,0x00,0x28,0x08,0xD1,0x4D,0x98,0x40,0x1C,0x00,0x04,0x00,0x14,0x4D,0x90, + 0x53,0x99,0x88,0x42,0x00,0xDA,0x81,0xE4,0x0C,0x98,0x00,0x06,0x60,0xD5,0x0A,0x4C, + 0x20,0x79,0x00,0x28,0x60,0x98,0x15,0xD1,0x80,0x8B,0x00,0x28,0x51,0xD0,0x60,0x98, + 0x65,0x99,0xE2,0x88,0x40,0x7E,0x09,0x7B,0x52,0x06,0x01,0xD4,0x64,0x99,0x09,0x7A, + 0x88,0x42,0x46,0xD2,0x40,0x1C,0x41,0xE0,0xF0,0x05,0x00,0x20,0x05,0x0B,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x80,0x7E,0x09,0x99,0x88,0x42,0x36,0xD8,0x40,0x1C,0x60,0x99, + 0x00,0x06,0x00,0x0E,0x88,0x76,0x08,0x99,0x88,0x42,0x03,0xD9,0xA1,0x89,0x32,0x9A, + 0x89,0x18,0x32,0x91,0x09,0x99,0x88,0x42,0x27,0xD1,0x08,0x99,0x88,0x42,0x24,0xD0, + 0x41,0x1A,0x32,0x98,0xFB,0xF7,0x66,0xFC,0x60,0x9A,0x00,0x21,0x91,0x83,0x65,0x99, + 0x0A,0x89,0xE1,0x88,0x4B,0x06,0x01,0xD4,0x64,0x9A,0x92,0x88,0x82,0x42,0x14,0xD2, + 0x36,0x9A,0x80,0x1A,0x65,0x9A,0x49,0x06,0x92,0x79,0x01,0xD4,0x64,0x99,0x8A,0x78, + 0x64,0x21,0x50,0x43,0xFB,0xF7,0x4E,0xFC,0x60,0x99,0x00,0x04,0x00,0x0C,0x88,0x83, + 0x0A,0x99,0x88,0x42,0x01,0xD9,0x60,0x98,0x81,0x83,0x00,0x20,0x60,0x99,0x48,0x76, + 0x06,0xE0,0x60,0x99,0x00,0x20,0x88,0x76,0x60,0x99,0x48,0x76,0x60,0x99,0x88,0x83, + 0x00,0x20,0x84,0x46,0x4C,0x90,0x59,0x48,0x01,0x24,0x00,0x79,0x50,0x90,0x52,0xE0, + 0x56,0x48,0x61,0x00,0x0F,0x18,0xC0,0x37,0xB8,0x89,0x0A,0x21,0xFB,0xF7,0x2A,0xFC, + 0x05,0x04,0xF8,0x8B,0x2D,0x14,0x0A,0x21,0xFB,0xF7,0x24,0xFC,0x5E,0x99,0x02,0x04, + 0xC9,0x7E,0x12,0x14,0x00,0x20,0x84,0x46,0x51,0x91,0x36,0xE0,0x4B,0x49,0xC3,0x00, + 0x5B,0x18,0x11,0x21,0x89,0x01,0x59,0x18,0x1C,0x27,0x52,0x91,0xCF,0x5F,0xAF,0x42, + 0x27,0xDC,0x23,0x21,0x49,0x01,0x59,0x18,0x00,0x23,0xCB,0x5E,0xAB,0x42,0x20,0xDB, + 0x52,0x9F,0x1E,0x23,0xFB,0x5E,0x93,0x42,0x1B,0xDC,0x02,0x27,0xCF,0x5F,0x3F,0x4B, + 0x97,0x42,0x16,0xDB,0xA1,0x00,0xC9,0x18,0xE0,0x31,0x0E,0x23,0xCB,0x5E,0x37,0x1D, + 0x9B,0x1C,0x7B,0x43,0x0C,0x27,0xCF,0x5F,0xD9,0x19,0x4B,0x00,0x38,0x49,0x5B,0x18, + 0x04,0x21,0x59,0x5E,0x4C,0x9B,0x99,0x42,0x03,0xDD,0x4C,0x91,0x21,0x06,0x09,0x0E, + 0x8C,0x46,0x40,0x1C,0x51,0x99,0x00,0x04,0x00,0x14,0x81,0x42,0xC6,0xDC,0x64,0x1C, + 0x50,0x98,0x24,0x04,0x24,0x14,0xA0,0x42,0xAA,0xDA,0x2C,0x4D,0x4C,0x9A,0x2C,0x00, + 0x23,0x00,0x69,0x89,0x20,0x00,0xDE,0x33,0xCC,0x30,0xC2,0x34,0x91,0x42,0x4F,0x93, + 0x05,0xDC,0x61,0x46,0x00,0x29,0x02,0xD0,0x49,0x00,0x49,0x19,0x0E,0xE0,0x69,0x79, + 0x00,0x29,0x1B,0xD1,0x50,0x99,0x01,0x29,0x18,0xD9,0x62,0x99,0x89,0x78,0x00,0x29, + 0x14,0xD1,0x0D,0x99,0x00,0x29,0x11,0xD0,0x4A,0x00,0x51,0x19,0xC0,0x31,0x8E,0x89, + 0xCF,0x8B,0x12,0x22,0x00,0x21,0x00,0xF0,0x57,0xF8,0x4F,0x98,0x12,0x22,0x00,0x21, + 0x00,0xF0,0x52,0xF8,0x01,0x20,0x28,0x71,0xA6,0x81,0xE7,0x83,0x5E,0x98,0xC0,0x7D, + 0x00,0x28,0x0C,0xD0,0x00,0x21,0x29,0x71,0x5E,0x98,0x12,0x4A,0x00,0x7E,0x92,0x7F, + 0x90,0x42,0x01,0xD3,0x5E,0x9A,0xD1,0x75,0x5E,0x99,0x40,0x1C,0x08,0x76,0x02,0x99, + 0x0D,0x48,0x00,0x29,0x10,0xD0,0x29,0x79,0x00,0x29,0x0D,0xD0,0x0B,0x4A,0x01,0x68, + 0x52,0x89,0x0A,0x32,0x91,0x42,0x01,0xDA,0x49,0x1C,0x01,0x60,0x28,0x79,0x68,0x71, + 0x67,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x21,0xF6,0xE7,0xF0,0x05,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x0A,0x00,0x20,0x80,0x7A,0x00,0x00, + 0x03,0xE0,0x0B,0x78,0x49,0x1C,0x03,0x70,0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47, + 0x52,0x10,0x03,0xE0,0x0B,0x88,0x89,0x1C,0x03,0x80,0x80,0x1C,0x52,0x1E,0xF9,0xD2, + 0x70,0x47,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x09,0x06,0x09,0x0E,0x01,0xE0,0x01,0x70, + 0x40,0x1C,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x0A,0x49,0x00,0x20,0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5, + 0xC8,0x7A,0x89,0x7A,0x08,0x18,0x00,0x06,0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23, + 0x1B,0x02,0x9A,0x43,0x02,0x61,0x02,0x69,0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x00,0x90,0x00,0x40,0x10,0xB5,0x14,0x48, + 0x14,0x49,0x80,0x8B,0xC9,0x8A,0x00,0x24,0x40,0x18,0x13,0x49,0x09,0x78,0x00,0x29, + 0x12,0x49,0x04,0xD0,0x15,0x22,0x52,0x01,0x89,0x18,0x49,0x89,0x09,0xE0,0x10,0x4A, + 0xFF,0x31,0xD2,0x88,0xA1,0x31,0x49,0x8A,0x52,0x06,0x02,0xD4,0x0B,0x49,0xE0,0x31, + 0xC9,0x89,0x08,0x18,0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3, + 0x01,0x24,0xFE,0xF7,0x3F,0xFF,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x06,0x00,0x20,0xD0,0x0A,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40,0xF7,0xB5,0x2C,0x4E,0xFF,0x27,0xB0,0x7F, + 0xF1,0x7F,0x84,0xB0,0x00,0x02,0x08,0x43,0x01,0xF0,0x3E,0xFD,0x30,0x00,0x20,0x38, + 0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x26,0x48,0x01,0x78,0x26,0x48,0x00,0x7A,0x00,0x29, + 0x02,0xD0,0x01,0xF0,0xD1,0xFC,0x01,0xE0,0x01,0xF0,0xFE,0xFC,0x22,0x48,0x02,0x25, + 0xC1,0x6A,0x03,0x91,0x01,0x6A,0x02,0x91,0x41,0x6A,0x01,0x91,0x41,0x6B,0x00,0x91, + 0x21,0xE0,0x1D,0x4F,0x00,0x20,0xF8,0x62,0x18,0x48,0xA0,0x30,0x80,0x68,0x38,0x62, + 0x1A,0x48,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFC,0xF7,0x08,0xF9, + 0x64,0x1E,0xF9,0xD5,0x02,0x20,0x78,0x63,0x30,0x7F,0x01,0x00,0xFC,0xF7,0x82,0xF9, + 0x01,0x24,0x04,0xA8,0x07,0xC8,0xFE,0xF7,0x81,0xFE,0x07,0x00,0x01,0xD1,0x00,0x24, + 0x25,0x00,0x64,0x1E,0xF5,0xD5,0x28,0x00,0x6D,0x1E,0x00,0x28,0xD9,0xDC,0x0A,0x48, + 0x03,0x99,0xC1,0x62,0x02,0x99,0x01,0x62,0x01,0x99,0x41,0x62,0x00,0x99,0x41,0x63, + 0x38,0x00,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00, + 0xFD,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x80,0x90,0x00,0x40,0x80,0x7A,0x00,0x00, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x71,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0xB8,0x01,0x8D,0xE5,0x24,0x07,0x9F,0xE5,0x28,0x37,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x28,0x67,0x9F,0xE5,0xB0,0x01,0x8D,0xE5,0x14,0x07,0x9F,0xE5,0x00,0xB0,0xD0,0xE5, + 0xB6,0x00,0xD3,0xE1,0x40,0x10,0x00,0xE2,0x0C,0x07,0x9F,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x4C,0x80,0xE2,0xBC,0x1E,0xD0,0x01,0xB0,0x1B,0xD4,0x11,0x02,0xAC,0x80,0xE2, + 0xAC,0x11,0x8D,0xE5,0xB0,0x1F,0xD0,0x01,0xB4,0x1B,0xD4,0x11,0xA8,0x11,0x8D,0xE5, + 0xF8,0x1A,0xD4,0x01,0xFC,0x16,0xDA,0x11,0xA0,0x11,0x8D,0xE5,0xFA,0x1A,0xD4,0x01, + 0xFE,0x16,0xDA,0x11,0x9C,0x11,0x8D,0xE5,0xF4,0x10,0xD0,0x05,0xB8,0x11,0xD0,0x15, + 0x98,0x11,0x8D,0xE5,0xF5,0x10,0xD0,0x05,0xB9,0x11,0xD0,0x15,0x94,0x11,0x8D,0xE5, + 0xF6,0x10,0xD0,0x05,0xBA,0x11,0xD0,0x15,0x90,0x11,0x8D,0xE5,0xF7,0x10,0xD0,0x05, + 0xBB,0x11,0xD0,0x15,0x8C,0x11,0x8D,0xE5,0xBC,0x1F,0xD0,0x01,0xB0,0x1C,0xD4,0x11, + 0x88,0x11,0x8D,0xE5,0xBE,0x1F,0xD0,0x01,0xB2,0x1C,0xD4,0x11,0x84,0x11,0x8D,0xE5, + 0xB0,0x10,0xD4,0x01,0xB4,0x1C,0xD4,0x11,0x80,0x11,0x8D,0xE5,0xB2,0x10,0xD4,0x01, + 0xB6,0x1C,0xD4,0x11,0x7C,0x11,0x8D,0xE5,0xB8,0x1F,0xD0,0x01,0xBC,0x1B,0xD4,0x11, + 0x78,0x11,0x8D,0xE5,0xBA,0x0F,0xD0,0x01,0xBE,0x0B,0xD4,0x11,0x74,0x01,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0x30,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5, + 0x24,0x00,0x8D,0xE5,0x20,0x00,0x8D,0xE5,0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x04,0x00,0x8D,0xE5,0xB8,0x05,0xC6,0xE1,0x00,0x90,0xA0,0xE1,0xBA,0x05,0xC6,0xE1, + 0x01,0x5C,0x46,0xE2,0xBC,0x05,0xC6,0xE1,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x70,0x00,0x85,0xE2,0x49,0xFF,0xFF,0xEB,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x98,0x00,0x85,0xE2,0x45,0xFF,0xFF,0xEB,0x00,0x00,0xA0,0xE3,0xB4,0x01,0x8D,0xE5, + 0x00,0x10,0xA0,0xE1,0xB0,0x0C,0xC5,0xE1,0x50,0x20,0xA0,0xE3,0x49,0x0F,0x8D,0xE2, + 0x3E,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD4,0x00,0x8D,0xE2, + 0x3A,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x84,0x00,0x8D,0xE2, + 0x36,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x34,0x00,0x8D,0xE2, + 0x32,0xFF,0xFF,0xEB,0xA8,0x05,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0xF8,0x7A,0xDA,0x11,0xB6,0x0A,0xDA,0x11,0x07,0x00,0x00,0x1A,0x84,0x05,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x40,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xF2,0x71,0xD4,0x01, + 0xF6,0x7D,0xD4,0x11,0xB0,0x01,0xD4,0x01,0xB4,0x0D,0xD4,0x11,0x00,0x80,0xA0,0xE3, + 0x08,0x50,0xA0,0xE1,0xA4,0x01,0x8D,0xE5,0x68,0x05,0x9F,0xE5,0xC0,0x01,0x8D,0xE5, + 0x0E,0x0C,0x80,0xE2,0xBC,0x01,0x8D,0xE5,0x82,0x00,0x00,0xEA,0x00,0x40,0xA0,0xE3, + 0x7C,0x00,0x00,0xEA,0xC0,0x01,0x9D,0xE5,0x0F,0x2A,0xE0,0xE3,0x08,0x11,0x90,0xE7, + 0x01,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0x21,0x18,0x02,0xE0,0x01,0x30,0x40,0xE0, + 0x00,0x00,0x41,0xE0,0x9C,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3, + 0xD4,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7, + 0x9C,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x34,0x20,0x8D,0xC2, + 0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5, + 0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x49,0x2F,0x8D,0xC2,0x05,0xC1,0x92,0xC7, + 0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0, + 0x00,0x00,0x51,0xE3,0x84,0x20,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0, + 0x05,0x11,0x82,0xC7,0xB4,0x11,0x9D,0xE5,0x01,0x00,0x53,0xE1,0xB4,0x31,0x8D,0xC5, + 0x30,0x40,0x8D,0xC5,0x2C,0x50,0x8D,0xC5,0xC8,0x00,0x53,0xE3,0xB8,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xB8,0x15,0xC6,0xC1,0x96,0x00,0x50,0xE3,0xBA,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBA,0x15,0xC6,0xC1,0x19,0x0E,0x53,0xE3,0xBC,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBC,0x15,0xC6,0xC1,0x68,0x14,0x9F,0xE5,0xB6,0x10,0xD1,0xE1, + 0x40,0x00,0x11,0xE3,0xB0,0x18,0xDA,0xE1,0x01,0x28,0xE0,0x13,0x81,0x10,0x02,0x10, + 0x00,0x00,0x53,0xE3,0x03,0x28,0xA0,0xC1,0x00,0x20,0xA0,0xD3,0x22,0x28,0xA0,0xC1, + 0x00,0x00,0x50,0xE3,0x00,0x08,0xA0,0xC1,0x00,0x00,0xA0,0xD3,0x20,0x08,0xA0,0xC1, + 0x01,0x00,0x50,0xE1,0x01,0xC0,0x89,0x82,0x01,0x98,0xCC,0x83,0x01,0x00,0x52,0xE1, + 0x0C,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x0C,0xC0,0x8D,0x85, + 0x81,0x00,0x50,0xE1,0x08,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83, + 0x08,0xC0,0x8D,0x85,0x81,0x00,0x52,0xE1,0x04,0x10,0x9D,0x85,0x01,0x10,0x81,0x82, + 0x01,0x18,0xC1,0x83,0x04,0x10,0x8D,0x85,0x10,0x10,0x9D,0xE5,0x00,0x00,0x53,0xE3, + 0x01,0x00,0x80,0xE0,0x10,0x00,0x8D,0xE5,0x00,0x30,0xA0,0xB3,0x01,0x00,0x4B,0xE2, + 0x00,0x00,0x55,0xE1,0x06,0x00,0x00,0x1A,0x00,0x00,0x53,0xE3,0x04,0x00,0x00,0x0A, + 0x03,0x02,0x63,0xE0,0x00,0x01,0xA0,0xE1,0x64,0x10,0xA0,0xE3,0xFC,0xEB,0xFF,0xEB, + 0x00,0x30,0xA0,0xE1,0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1,0x11,0xF8,0xFF,0xEB, + 0xB4,0x13,0x9F,0xE5,0x00,0x00,0x57,0xE3,0x80,0x00,0x81,0xE0,0xB0,0x30,0xC0,0xE1, + 0x00,0x00,0x67,0xD2,0x07,0x00,0xA0,0xC1,0x03,0x00,0x50,0xE1,0xB8,0x11,0x9D,0xB5, + 0x07,0x00,0x83,0xB0,0x01,0x00,0x80,0xB0,0xB8,0x01,0x8D,0xB5,0x05,0x10,0xA0,0xE1, + 0x04,0x00,0xA0,0xE1,0xDA,0xF7,0xFF,0xEB,0xBC,0x11,0x9D,0xE5,0x7C,0x23,0x9F,0xE5, + 0x08,0x11,0x91,0xE7,0x80,0x00,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x80,0x88,0xE2, + 0x01,0x40,0x84,0xE2,0xB0,0x10,0xC0,0xE1,0xB0,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1, + 0x7F,0xFF,0xFF,0x3A,0x01,0x50,0x85,0xE2,0x0B,0x00,0x55,0xE1,0x7A,0xFF,0xFF,0x3A, + 0x60,0xFA,0xFF,0xEB,0x2C,0x63,0x9F,0xE5,0xA8,0x01,0x9D,0xE5,0xBE,0x00,0xC6,0xE1, + 0xAC,0x01,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x0A,0x00,0x00,0x0A,0xB0,0x01,0x9D,0xE5, + 0x64,0x10,0xA0,0xE3,0x9B,0x00,0x00,0xE0,0x90,0x01,0x01,0xE0,0xB8,0x01,0x9D,0xE5, + 0xA4,0x21,0x9D,0xE5,0x92,0x00,0x00,0xE0,0x3A,0xEC,0xFF,0xEB,0xA8,0x11,0x9D,0xE5, + 0x01,0x00,0x50,0xE1,0xBE,0x00,0xC6,0x31,0xB0,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3, + 0x90,0x01,0x07,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA,0x49,0x0F,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x98,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1, + 0x2C,0xEC,0xFF,0xEB,0x88,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xBC,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1, + 0x84,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x94,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x07,0x10,0xA0,0xE1,0x1F,0xEC,0xFF,0xEB,0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xAF,0xFA,0xFF,0xEB, + 0x00,0x00,0x45,0xE0,0x78,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x91,0x00,0x00,0xE0,0x84,0x50,0x86,0xE0,0x64,0x10,0xA0,0xE3,0xA4,0xEB,0xFF,0xEB, + 0x01,0x40,0x84,0xE2,0xB0,0x07,0xC5,0xE1,0x0B,0x00,0x54,0xE1,0xDA,0xFF,0xFF,0x3A, + 0x64,0x00,0xA0,0xE3,0x9B,0x00,0x05,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA, + 0xD4,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x90,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x05,0x10,0xA0,0xE1,0x03,0xEC,0xFF,0xEB,0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x93,0xFA,0xFF,0xEB, + 0x00,0x70,0xA0,0xE1,0x34,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x8C,0x11,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x05,0x10,0xA0,0xE1,0xF6,0xEB,0xFF,0xEB,0x7C,0x11,0x9D,0xE5, + 0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1, + 0x86,0xFA,0xFF,0xEB,0x00,0x00,0x47,0xE0,0x74,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x91,0x00,0x00,0xE0,0x84,0x70,0x86,0xE0,0x64,0x10,0xA0,0xE3, + 0x7B,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2,0xB8,0x09,0xC7,0xE1,0xB0,0x01,0x9D,0xE5, + 0x00,0x00,0x54,0xE1,0xD9,0xFF,0xFF,0x3A,0xB4,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x0D,0x00,0x00,0xDA,0x30,0x00,0x9D,0xE5,0x2C,0x10,0x9D,0xE5,0x80,0x00,0x86,0xE0, + 0x81,0x10,0x86,0xE0,0xB8,0x09,0xD0,0xE1,0xB0,0x17,0xD1,0xE1,0x00,0x10,0x81,0xE0, + 0xB4,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1, + 0xB0,0x0C,0xC6,0xE1,0x00,0x00,0xA0,0x43,0xB0,0x0C,0xC6,0x41,0xB0,0x01,0x9D,0xE5, + 0x01,0x00,0x40,0xE2,0x9B,0x00,0x01,0xE0,0x10,0x00,0x9D,0xE5,0xCD,0xEB,0xFF,0xEB, + 0xB6,0x10,0xD6,0xE1,0x0C,0x20,0x9D,0xE5,0x40,0x00,0x11,0xE3,0x10,0x00,0x00,0x0A, + 0x82,0x00,0x59,0xE1,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85,0x08,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35,0x14,0x00,0x59,0xE3,0x13,0x00,0x00,0x9A, + 0x10,0x00,0x00,0xEA,0x02,0x00,0x59,0xE1,0x08,0x00,0x59,0x83,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85, + 0x08,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85, + 0x04,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35, + 0x0A,0x00,0x59,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x14,0x00,0x8D,0xE5, + 0x24,0x00,0x9D,0xE5,0x20,0x20,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x02,0x30,0x80,0xE1, + 0x1C,0x00,0x9D,0xE5,0x18,0x20,0x9D,0xE5,0x02,0x00,0x00,0xE0,0x00,0x20,0x83,0xE1, + 0x14,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13, + 0x02,0x00,0x90,0xE1,0x28,0x00,0x9D,0x05,0x00,0x00,0x50,0x03,0x09,0x00,0x00,0x0A, + 0xC4,0x00,0x96,0xE5,0x01,0x00,0x80,0xE2,0xC4,0x00,0x86,0xE5,0xC8,0x00,0xD6,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xC8,0x00,0xC6,0x15,0x71,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xC8,0x00,0xD6,0xE5,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0xC8,0x00,0xC6,0xE5,0xB4,0x18,0xDA,0xE1,0x01,0x00,0x50,0xE1, + 0xF5,0xFF,0xFF,0x1A,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC6,0xE5,0xC4,0x00,0x96,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xC4,0x00,0x86,0xC5,0xEE,0xFF,0xFF,0xEA, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x02,0x10,0x40,0xC8,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0xCA,0x49,0xC8,0x4F,0xC9,0x88,0xB8,0x7D,0xC9,0x4C, + 0x00,0x25,0x49,0x06,0x8D,0xB0,0x00,0xD4,0xA0,0x7C,0x03,0x90,0xC3,0x48,0x40,0x38, + 0x42,0x79,0x06,0x00,0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38, + 0xB3,0x7A,0x00,0x7A,0xFE,0xF7,0xED,0xFB,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7, + 0xDD,0xFB,0x31,0x00,0x20,0x39,0x0A,0x7A,0xC0,0x39,0x00,0x06,0x0C,0x91,0x09,0x79, + 0x00,0x0E,0xFE,0xF7,0xD7,0xFB,0x00,0x06,0xBA,0x7D,0xA1,0x7C,0x00,0x0E,0xFE,0xF7, + 0xD1,0xFB,0x00,0x06,0xB4,0x4E,0x00,0x0E,0x02,0x90,0x30,0x7B,0x00,0x28,0x02,0xD0, + 0xB2,0x48,0x40,0x89,0x0A,0xE0,0xAE,0x49,0x78,0x8A,0xC9,0x88,0x49,0x06,0x00,0xD4, + 0xE0,0x89,0xAF,0x49,0xC9,0x8A,0x40,0x18,0x00,0x04,0x00,0x0C,0x00,0x27,0x04,0x90, + 0x77,0x61,0x30,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0xD5,0xFA,0x01,0xF0,0xC3,0xFA,0x01,0x20,0x30,0x62,0xFC,0xF7,0xF5,0xFB,0xA0,0x48, + 0x05,0x22,0x01,0x00,0xFF,0x31,0x61,0x31,0x0A,0x91,0x9E,0x49,0xD2,0x01,0xE0,0x39, + 0x8B,0x18,0x09,0x93,0x03,0x00,0xC0,0x33,0x80,0x31,0x07,0xAC,0x0A,0xC4,0x02,0x99, + 0xC9,0x1C,0x06,0x91,0x51,0x00,0x44,0x18,0x80,0x18,0x05,0x90,0x10,0xE1,0x30,0x7A, + 0x00,0x28,0x04,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xAF,0xFA,0xFF,0x20, + 0x81,0x30,0xFB,0xF7,0xAD,0xF9,0x03,0x20,0x01,0xF0,0xE6,0xF9,0x00,0xF0,0x68,0xF9, + 0x01,0x20,0x40,0x05,0xFC,0xF7,0x04,0xFE,0xFF,0xF7,0xCA,0xFB,0x00,0x20,0xFC,0xF7, + 0xFF,0xFD,0x87,0x48,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06, + 0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0xAA,0xF8,0xFC,0xF7,0x34,0xFE, + 0x84,0x48,0x04,0x99,0x80,0x8B,0x40,0x18,0x7D,0x49,0x89,0x89,0x88,0x42,0x10,0xD9, + 0x0A,0x98,0x40,0x78,0x00,0x28,0x0C,0xD1,0x79,0x48,0xFF,0x21,0xC0,0x88,0x19,0x31, + 0x08,0x42,0x06,0xD1,0x03,0x98,0x6D,0x1C,0x85,0x42,0x03,0xDD,0xFC,0xF7,0x24,0xFE, + 0x00,0xE0,0x00,0x25,0x00,0xF0,0x6A,0xFE,0x00,0xF0,0xEC,0xFD,0x00,0xF0,0x40,0xFE, + 0x09,0x99,0x08,0x98,0x49,0x88,0x40,0x68,0x88,0x42,0x0C,0xDB,0x0A,0x98,0x40,0x78, + 0x00,0x28,0x04,0xD1,0x6A,0x48,0x46,0x21,0xC0,0x88,0x08,0x42,0x03,0xD0,0x6A,0x49, + 0x01,0x20,0x48,0x70,0x02,0xE0,0x70,0x78,0x00,0x28,0x0D,0xD0,0xFC,0xF7,0x88,0xFB, + 0x64,0x48,0x01,0x21,0xE0,0x38,0xC0,0x7F,0x40,0x08,0x01,0xF0,0xBD,0xF8,0x62,0x48, + 0x47,0x70,0x08,0x98,0x47,0x60,0xA9,0xE0,0xFC,0xF7,0xC4,0xFD,0xFD,0xF7,0x3C,0xFF, + 0x00,0x28,0x08,0xD0,0x77,0x61,0x05,0x98,0x80,0x7B,0xC8,0x28,0x10,0xD2,0x05,0x99, + 0x40,0x1C,0x88,0x73,0x0C,0xE0,0x70,0x69,0x40,0x1C,0x70,0x61,0x70,0x69,0x01,0x28, + 0x01,0xD1,0x59,0x48,0x07,0x73,0x70,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7,0x54,0xFB, + 0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x60,0x68,0xFF,0x21,0xFF,0x31, + 0x88,0x42,0x03,0xDA,0x40,0x1C,0x60,0x60,0x00,0xE0,0x67,0x60,0x09,0x99,0x20,0x68, + 0x49,0x89,0x88,0x42,0x0A,0xDD,0x61,0x68,0xFF,0x20,0xF5,0x30,0x81,0x42,0x05,0xDD, + 0x01,0x20,0x70,0x70,0x27,0x60,0x67,0x60,0x08,0x99,0x48,0x60,0x47,0x48,0x41,0x68, + 0x09,0x07,0x07,0xD5,0xC1,0x68,0x00,0x29,0x04,0xD0,0xC0,0x68,0x01,0x21,0x49,0x07, + 0xC8,0x63,0x06,0xE0,0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0x31,0xFC,0x00,0xF0, + 0x11,0xF9,0xFC,0xF7,0x27,0xFE,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B, + 0x00,0x28,0x01,0xD1,0x00,0xF0,0xC0,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28, + 0x4C,0xD1,0x07,0x98,0x00,0x7A,0x00,0x28,0x01,0xD0,0xFF,0xF7,0x5B,0xFA,0x00,0xF0, + 0x9B,0xF8,0x03,0x20,0x01,0xF0,0xFA,0xF8,0xF0,0x62,0x03,0x20,0x01,0xF0,0x28,0xF9, + 0xFF,0x20,0x81,0x30,0xFB,0xF7,0xD4,0xF8,0x2D,0x48,0x00,0x78,0x00,0x28,0x2F,0xD1, + 0xFC,0xF7,0xD8,0xFE,0x00,0x28,0x2B,0xD0,0xB0,0x6A,0x00,0x28,0x0B,0x90,0x27,0xD0, + 0xF0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x26,0x49,0xFA,0xF7,0x8B,0xFD,0x0B,0x99, + 0x08,0x1A,0x32,0x28,0x1C,0xDD,0x01,0xF0,0xCF,0xF9,0x01,0xF0,0xD3,0xF9,0xB0,0x79, + 0x00,0x28,0x0D,0xD0,0x00,0xF0,0x4E,0xF8,0x00,0xF0,0x51,0xF8,0x00,0xF0,0x59,0xF8, + 0x1D,0x4E,0x01,0x20,0x70,0x60,0xFB,0xF7,0xBB,0xF8,0x1C,0x48,0x70,0x60,0x03,0xE0, + 0x1B,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0xC3,0xF9,0x18,0x48,0x07,0x70, + 0x0D,0x4E,0x70,0x69,0x06,0x99,0x88,0x42,0x00,0xD2,0xE8,0xE6,0x0C,0x98,0x0C,0x49, + 0x40,0x78,0xA0,0x39,0x48,0x73,0x08,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x01,0xF0, + 0x8D,0xF9,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xE0,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20,0x90,0x08,0x00,0x20,0x00,0x40,0x00,0x30, + 0xAD,0x0B,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00, + 0xAC,0x0B,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20, + 0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60, + 0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x78,0x00,0x00,0x10,0xB5,0xFC,0xF7,0xB3,0xFC,0xFA,0xF7, + 0x35,0xFD,0x03,0x20,0x40,0x03,0xFB,0xF7,0x3B,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x03,0x20,0x10,0xB5,0x40,0x03,0xFB,0xF7,0x3B,0xF8,0xFA,0xF7,0x31,0xFD,0xFC,0xF7, + 0xA9,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0,0xFD,0xFB,0x05,0x49, + 0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7,0x59,0xFF,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x16,0x48,0x17,0x4E,0x00,0x78, + 0x00,0x25,0x01,0x90,0x14,0x48,0x00,0x78,0x00,0x90,0x1C,0xE0,0x14,0x49,0x68,0x00, + 0x00,0x24,0x47,0x18,0x60,0x37,0x12,0xE0,0x29,0x00,0x20,0x00,0xFD,0xF7,0x2A,0xFC, + 0x0F,0x4B,0x62,0x00,0xD3,0x18,0x98,0x22,0x9A,0x5E,0x10,0x23,0xFB,0x5E,0x40,0x00, + 0x31,0x5E,0xD2,0x18,0x89,0x1A,0x00,0xD5,0x00,0x21,0x64,0x1C,0x31,0x52,0x01,0x98, + 0x84,0x42,0xE9,0xD3,0x6D,0x1C,0x00,0x98,0x85,0x42,0xDF,0xD3,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x72,0x4F,0x00,0x26,0x78,0x7A,0xC0,0x07,0x2F,0xD0, + 0x70,0x4C,0x20,0x89,0x00,0x28,0x0E,0xD0,0x6F,0x49,0x88,0x42,0x0B,0xD0,0x1E,0x21, + 0x48,0x43,0x64,0x21,0xFA,0xF7,0x9E,0xFC,0x39,0x8A,0x46,0x18,0x4B,0x20,0xC0,0x00, + 0x86,0x42,0x00,0xD9,0x06,0x00,0x69,0x48,0x40,0x7D,0x00,0x28,0x18,0xD0,0xA6,0x89, + 0x67,0x48,0x31,0x18,0x08,0x00,0x48,0x43,0x69,0x21,0x09,0x01,0xFA,0xF7,0x8A,0xFC, + 0x63,0x4B,0x31,0x00,0x63,0x4A,0xFF,0x39,0xA6,0x39,0x5B,0x42,0x91,0x42,0x01,0xD8, + 0x1E,0x1A,0x05,0xE0,0x5E,0x4C,0x64,0x1E,0x31,0x19,0x91,0x42,0x00,0xD2,0xC6,0x18, + 0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7E,0xD0,0x5B,0x48,0x00,0x21,0x01,0x70, + 0x02,0x20,0x00,0xF0,0xF5,0xFF,0x59,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x6A,0xFC, + 0x01,0x00,0x02,0x20,0x00,0xF0,0xD8,0xFF,0x01,0x2D,0x0B,0xD0,0x02,0x2D,0x08,0xD1, + 0x60,0x68,0x00,0x02,0x00,0x0E,0x01,0x28,0x03,0xD1,0x60,0x68,0x00,0x06,0x00,0xD1, + 0x00,0xE0,0x6D,0x1C,0x78,0x7A,0x00,0x28,0x08,0xD0,0x60,0x68,0x4C,0x49,0x81,0x43, + 0x04,0xD0,0x61,0x68,0x4B,0x48,0x88,0x43,0x00,0xD0,0x6D,0x1C,0xF8,0x79,0x00,0x28, + 0x04,0xD1,0x49,0x48,0x41,0x69,0x02,0x15,0x11,0x43,0x41,0x61,0x47,0x48,0x01,0x68, + 0x47,0x48,0xC1,0x61,0x02,0x24,0x20,0x00,0x00,0xF0,0xB6,0xFF,0x45,0x48,0xC1,0x68, + 0x49,0x08,0x49,0x00,0xC1,0x60,0x03,0x04,0x35,0x48,0x36,0x4A,0x41,0x7A,0x40,0x48, + 0x97,0x89,0x21,0xE0,0x42,0x69,0x52,0x06,0x0E,0xD4,0x00,0x29,0x01,0xD0,0xAC,0x42, + 0x04,0xD2,0xA2,0x00,0xD2,0x18,0x12,0x68,0xC2,0x61,0x04,0xE0,0xCA,0x07,0x01,0xD0, + 0xC6,0x61,0x00,0xE0,0xC7,0x61,0x64,0x1C,0x2F,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0, + 0xFD,0xF7,0x9C,0xFC,0x26,0x48,0x01,0x7A,0x00,0x29,0x07,0xD0,0x00,0x6B,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0x4B,0xF8,0x01,0xE0,0xAC,0x42,0xDB,0xD9,0x02,0x20,0x00,0xF0, + 0x8F,0xFF,0x25,0x4D,0x28,0x78,0x00,0x28,0x27,0xD1,0xFD,0xF7,0xAD,0xFB,0x00,0x28, + 0x23,0xD0,0x22,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0xFC,0xFB,0x01,0x00,0x02,0x20, + 0x00,0xF0,0x6A,0xFF,0x02,0x20,0x00,0xE0,0x26,0xE0,0x00,0xF0,0x6D,0xFF,0x14,0x4C, + 0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7,0x70,0xFC,0x20,0x7A,0x00,0x28, + 0x04,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x20,0xF8,0xFD,0xF7,0x8C,0xFB, + 0x00,0x28,0xEE,0xD1,0x02,0x20,0x00,0xF0,0x63,0xFF,0x16,0x49,0xC8,0x68,0x01,0x22, + 0x10,0x43,0xC8,0x60,0x00,0xF0,0x2C,0xF8,0x05,0x48,0xC0,0x79,0x00,0x28,0x03,0xD1, + 0x01,0x20,0x80,0x02,0xFA,0xF7,0x04,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xCC,0xF7,0xFF,0xFF,0x8F,0x06,0x00,0x00,0xAD,0x0B,0x00,0x20,0x00,0x78,0x00,0x00, + 0x00,0x00,0x4E,0x1D,0x00,0x80,0x4E,0x1D,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7, + 0x67,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x18,0x70,0x47, + 0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18, + 0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07, + 0x18,0x68,0x13,0x4A,0x90,0x72,0x90,0x7A,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0, + 0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21, + 0x0C,0x30,0xFF,0xF7,0x19,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25, + 0x08,0x4C,0xAD,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00, + 0x3F,0x19,0x7F,0x19,0x40,0x1C,0xFE,0x60,0x96,0x7A,0x86,0x42,0xF3,0xD8,0xEA,0xE7, + 0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x70,0xB5,0x1E,0x49,0x1C,0x4C,0x0D,0x00, + 0x20,0x78,0xA1,0x22,0xFF,0x35,0x92,0x00,0xBF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0, + 0x5A,0x22,0x21,0x1D,0x28,0x00,0xFE,0xF7,0xD3,0xFF,0x17,0x49,0x09,0x22,0x30,0x00, + 0xFE,0xF7,0xCE,0xFF,0x20,0x78,0x60,0x70,0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22, + 0x00,0x21,0x30,0x00,0xFE,0xF7,0xE0,0xFF,0x5A,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7, + 0xDB,0xFF,0x0D,0x48,0x5A,0x22,0x00,0x21,0x63,0x38,0xFE,0xF7,0xD5,0xFF,0x0A,0x48, + 0x09,0x22,0x00,0x21,0x09,0x38,0xFE,0xF7,0xCF,0xFF,0x00,0x20,0x05,0x49,0x60,0x70, + 0xA0,0x70,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x04,0x49,0x88,0x75,0xDB,0xE7, + 0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20,0x6B,0x08,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xF3,0xB5,0x93,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x92,0x48,0x00,0x78,0x00,0x28, + 0x91,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8F,0x4A,0x1A,0x26, + 0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E, + 0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F, + 0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91, + 0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7D,0x49,0x20,0x39,0x8A,0x5E, + 0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22, + 0x41,0x5E,0x82,0x5E,0x11,0x98,0x78,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60, + 0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E, + 0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x23,0xFF,0x20,0x8C,0x64,0x21,0x0A,0x90, + 0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38, + 0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28, + 0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x61,0x48,0x01,0x78,0x61,0x48,0x00,0x78, + 0x08,0x90,0x61,0x48,0x80,0x7E,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E, + 0x09,0x06,0x09,0x0E,0x04,0xE0,0x08,0x98,0x40,0x1E,0x00,0x06,0x00,0x0E,0x08,0x90, + 0x20,0x00,0xFA,0xF7,0xBD,0xF9,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99, + 0x28,0x00,0xFA,0xF7,0xB5,0xF9,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90, + 0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98, + 0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C, + 0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42, + 0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A, + 0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xFA,0xF7,0x8A,0xF9,0xC7,0x19,0x04,0x98, + 0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0, + 0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7,0x7B,0xF9,0x07,0x99,0xC9,0x07,0x0A,0xD0, + 0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99, + 0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B, + 0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00, + 0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A, + 0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B, + 0x89,0x1A,0xFA,0xF7,0x4D,0xF9,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00, + 0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21, + 0xFA,0xF7,0x3E,0xF9,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18, + 0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48, + 0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C, + 0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8, + 0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x54,0xFE,0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xA0,0x78,0x00,0x00,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0xF0,0xB4,0x05,0x00, + 0x0B,0x4C,0x00,0x20,0xFF,0x26,0x91,0x36,0x82,0x00,0xA3,0x5A,0x12,0x19,0x52,0x88, + 0x5B,0x1B,0x1F,0x00,0x5F,0x43,0x52,0x1A,0x13,0x00,0x53,0x43,0xFA,0x18,0xB2,0x42, + 0x04,0xDB,0x40,0x1C,0x1D,0x28,0xEF,0xD3,0x00,0x20,0xC0,0x43,0xF0,0xBC,0x70,0x47, + 0x08,0x71,0x00,0x00,0xFE,0xB5,0x66,0x4D,0x64,0x48,0x00,0x26,0x29,0x00,0xFF,0x31, + 0x00,0x96,0x42,0x78,0x61,0x31,0x08,0x78,0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0, + 0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7, + 0xB1,0xFB,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42, + 0x14,0xD3,0xA9,0x19,0x13,0x22,0x00,0x90,0xFF,0x20,0x92,0x01,0x65,0x30,0x89,0x18, + 0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x70,0x76,0x1C,0x65,0x32,0x03,0x20,0x01,0x23, + 0x69,0x46,0x00,0xF0,0x33,0xFA,0x64,0x1C,0x09,0x2C,0xDA,0xDB,0x8F,0xE0,0x49,0x78, + 0x00,0x29,0x01,0xD1,0x00,0x28,0xF9,0xD0,0x15,0x20,0x40,0x01,0x00,0x24,0x2E,0x18, + 0x13,0x27,0xBF,0x01,0x28,0x19,0xC0,0x19,0x40,0x78,0x00,0x28,0x3F,0xD0,0x13,0x21, + 0x28,0x18,0x49,0x01,0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0,0x32,0x7B,0x00,0x2A, + 0x14,0xD0,0x05,0x21,0xC9,0x01,0x40,0x18,0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xBF,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0x04,0xFA,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x5C,0xFB,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x65,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0xEB,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x78,0x40,0x1C, + 0x4A,0x70,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24, + 0x23,0x49,0x13,0x22,0x08,0x19,0x52,0x01,0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92, + 0x00,0x28,0x31,0xD0,0x32,0x7B,0x00,0x2A,0x2E,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x2D,0xFB,0x00,0x28,0x24,0xD0,0x19,0x48, + 0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x21,0xD3,0x15,0x4A,0x00,0x20,0x11,0x18, + 0xC9,0x19,0x49,0x78,0xA1,0x42,0x0B,0xD0,0x00,0x29,0x06,0xD1,0xFF,0x21,0x65,0x31, + 0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x70,0x05,0xE0,0x40,0x1C,0x08,0x28,0xEE,0xDB, + 0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0x65,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0xA2,0xF9,0x64,0x1C,0x09,0x2C,0xC0,0xDB,0x00,0x98, + 0x00,0xF0,0x92,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xFE,0xB5,0x51,0x48,0x36,0x25,0x45,0x5F, + 0x51,0x48,0x50,0x4F,0xC4,0x78,0x00,0x26,0x02,0x94,0x00,0x79,0x84,0x46,0x4C,0x48, + 0x80,0x30,0x82,0x7D,0x86,0x46,0x4D,0x48,0x81,0x7E,0xC8,0x07,0x0A,0xD0,0x88,0x07, + 0x03,0xD5,0x64,0x1E,0x24,0x06,0x24,0x0E,0x04,0xE0,0x60,0x46,0x40,0x1E,0x00,0x06, + 0x00,0x0E,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2, + 0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A, + 0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A, + 0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x02,0x9B,0x4B,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58, + 0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00, + 0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46, + 0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06, + 0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04, + 0x12,0x14,0x26,0x48,0x80,0x30,0xC1,0x6A,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B, + 0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x62, + 0x1E,0x49,0x80,0x31,0x09,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA, + 0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x01,0x63,0x74,0x46,0xA4,0x8B, + 0xC5,0x6A,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0x00,0x6B, + 0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29, + 0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B, + 0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xF8,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D, + 0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29, + 0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61, + 0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0, + 0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61, + 0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0x15,0xF8,0xB0,0x62,0x30,0x7B,0x00,0x28, + 0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x39,0x00,0xFA,0xF7,0x06,0xF8,0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0x80,0x79,0x00,0x00,0x41,0xF2,0x01,0x00,0x10,0x00,0x10,0x00, + 0x0E,0x48,0x0F,0x4A,0x43,0x78,0x0F,0x49,0xD0,0x1D,0xC9,0x88,0xFF,0x32,0xF9,0x30, + 0xC1,0x32,0x02,0x2B,0x04,0xD9,0x12,0x6A,0x49,0x06,0x0C,0xD4,0xC2,0x69,0x0A,0xE0, + 0x02,0x2B,0x04,0xD1,0xD2,0x69,0x49,0x06,0x05,0xD4,0x82,0x69,0x03,0xE0,0x92,0x69, + 0x49,0x06,0x00,0xD4,0x42,0x69,0x04,0x48,0x42,0x62,0x70,0x47,0x50,0x07,0x00,0x20, + 0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40,0xF0,0xB4,0x0E,0x48, + 0x0E,0x49,0xC0,0x88,0x03,0x23,0x01,0x26,0x42,0x06,0x0D,0x48,0x0D,0x4D,0x0E,0x4F, + 0x9B,0x03,0xC8,0x24,0xF6,0x03,0x00,0x2A,0x01,0x61,0x01,0xDA,0x0B,0x49,0x01,0xE0, + 0x0A,0x49,0x32,0x39,0x41,0x61,0x83,0x61,0xC4,0x61,0x03,0x62,0x45,0x62,0x86,0x62, + 0xC7,0x62,0xF0,0xBC,0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x80,0x00,0x03, + 0x40,0xA1,0x00,0x40,0x2C,0xC1,0x00,0x00,0x64,0x80,0x00,0x00,0x90,0x01,0x01,0x00, + 0x70,0xB5,0x01,0x25,0x6D,0x03,0x28,0x00,0xFA,0xF7,0xDA,0xFA,0x16,0x48,0x04,0x68, + 0x28,0x00,0xFA,0xF7,0xCD,0xFA,0x15,0x4D,0xE2,0x06,0xD2,0x0E,0xE0,0x04,0x14,0x49, + 0xC0,0x0E,0x2A,0x71,0xE8,0x70,0x0B,0x7D,0x12,0x48,0x83,0x76,0x4B,0x7D,0xC3,0x76, + 0x83,0x7E,0x11,0x48,0xDC,0x07,0x0A,0xD0,0x9B,0x07,0x04,0xD5,0xEA,0x78,0x52,0x1E, + 0x02,0x72,0x00,0x22,0x02,0xE0,0x52,0x1E,0x02,0x72,0x01,0x22,0x6A,0x71,0x8A,0x7D, + 0x42,0x72,0xCA,0x7D,0x82,0x72,0x0A,0x7E,0xC2,0x72,0x4A,0x7E,0x02,0x73,0x89,0x7E, + 0x41,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x90,0x00,0x40,0xF8,0x0A,0x00,0x20, + 0x00,0x78,0x00,0x00,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0xF8,0xB5,0x05,0x00, + 0x0E,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0xFA,0xF7,0x96,0xFF,0x00,0x28,0x05,0xD0, + 0x30,0x68,0x40,0x1E,0x30,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x2D,0x48,0x80,0x7E, + 0xC0,0x07,0x26,0xD0,0xE0,0x79,0x05,0x28,0x21,0xD0,0x09,0x28,0x21,0xD1,0x2A,0x49, + 0x6D,0x08,0x6D,0x00,0x23,0x78,0x01,0x20,0x8C,0x46,0x13,0xE0,0x0A,0x22,0x01,0x00, + 0x51,0x43,0x26,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32,0xA1,0x32,0x97,0x7F,0xBB,0x42, + 0x07,0xD1,0xFF,0x31,0xC1,0x31,0x0F,0x88,0x67,0x80,0xD2,0x7F,0x62,0x70,0x49,0x88, + 0xA1,0x80,0x40,0x1C,0x61,0x46,0x49,0x78,0x81,0x42,0xE7,0xDA,0x01,0xE0,0x01,0x20, + 0x05,0x43,0x0F,0x20,0xA9,0x07,0x80,0x06,0x81,0x43,0x20,0x78,0x3F,0x22,0x92,0x02, + 0x00,0x07,0x80,0x08,0x01,0x43,0x16,0x48,0x01,0x40,0x60,0x88,0x80,0x05,0x80,0x09, + 0x01,0x43,0x60,0x78,0x91,0x43,0x80,0x06,0x00,0x0C,0x01,0x43,0x08,0x04,0x80,0x0E, + 0x0A,0x28,0x09,0xD2,0x40,0x1C,0x0A,0x23,0x58,0x43,0x3F,0x28,0x00,0xDD,0x3F,0x20, + 0x80,0x06,0x91,0x43,0x00,0x0C,0x01,0x43,0x88,0x0A,0xA1,0x88,0x80,0x02,0x01,0x22, + 0x89,0x05,0x89,0x0D,0x08,0x43,0x31,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60, + 0xA1,0xE7,0x00,0x00,0x30,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09, + 0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72, + 0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73, + 0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7, + 0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00,0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00, + 0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7,0xE9,0xFD,0x38,0x80, + 0x21,0x00,0x30,0x00,0xF9,0xF7,0xE4,0xFD,0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80, + 0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98, + 0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91,0xF9,0xF7,0xC8,0xFD, + 0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43,0xF9,0xF7,0xC0,0xFD, + 0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79,0x14,0x4B,0x00,0x26, + 0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5B,0x07,0x09,0xD5, + 0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D,0x3A,0x43,0x64,0x00, + 0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79,0x80,0x00,0x9B,0x06, + 0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06, + 0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x75,0x06,0x76,0xF0,0xBC,0x70,0x47, + 0xFF,0xFF,0x00,0xFC,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4D, + 0x0C,0x4C,0x2D,0x78,0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A, + 0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2, + 0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x10,0xB4,0x05,0x4C, + 0x03,0x4B,0x24,0x78,0x60,0x43,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78, + 0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A, + 0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D, + 0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x15,0x4A,0x15,0x4B,0x52,0x7D, + 0x13,0x4F,0x00,0x21,0x16,0x02,0x16,0x43,0x1A,0x78,0x10,0x4D,0x42,0x43,0x20,0x3F, + 0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0,0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E, + 0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42,0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0, + 0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C,0x06,0x4B,0x04,0x00,0x1B,0x78,0x5C,0x43, + 0xE3,0x18,0x93,0x42,0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x14,0x4A,0x13,0x4B,0x52,0x7D, + 0x00,0x21,0x11,0x4C,0x15,0x02,0x15,0x43,0x11,0x4E,0x20,0x3B,0x13,0xE0,0x9A,0x7D, + 0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0, + 0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52, + 0x32,0x78,0x80,0x18,0x49,0x1C,0x07,0x4A,0x37,0x78,0x12,0x78,0x7A,0x43,0x82,0x42, + 0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xF8,0xB5,0x03,0x00,0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01, + 0x0D,0x18,0xC0,0x31,0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68, + 0x00,0xF0,0x0E,0xFA,0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62, + 0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62, + 0x04,0x20,0xE0,0x62,0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69, + 0x20,0x62,0xD0,0x6B,0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x26,0x62,0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7, + 0x89,0x69,0x21,0x62,0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40, + 0x00,0x78,0x00,0x00,0x07,0x4A,0x10,0xB5,0xD1,0x88,0x40,0x23,0x00,0x28,0x01,0xD0, + 0x19,0x43,0x00,0xE0,0x99,0x43,0xD1,0x80,0xFF,0xF7,0x14,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x41,0x4C,0x05,0x00,0x27,0x6A, + 0x0E,0x00,0x60,0x6A,0x02,0x90,0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20, + 0xFF,0xF7,0x9E,0xFF,0x3B,0x48,0x20,0x62,0x22,0x20,0x60,0x62,0x07,0x20,0x40,0x02, + 0x60,0x63,0x02,0x20,0xE0,0x62,0x00,0x20,0xFB,0xF7,0xDA,0xFC,0x36,0x48,0x00,0x7A, + 0x00,0x28,0x01,0xD0,0xFE,0xF7,0xE6,0xF9,0xFB,0xF7,0x1E,0xFD,0x2C,0x00,0x46,0xE0, + 0x68,0x1E,0x84,0x42,0x01,0xD1,0xFB,0xF7,0x41,0xFD,0xFB,0xF7,0xE3,0xFC,0xFB,0xF7, + 0x91,0xFD,0x00,0x2E,0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x23,0xFD,0xA0,0x42, + 0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21, + 0xF9,0xF7,0x18,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0, + 0x68,0x00,0x05,0x21,0xF9,0xF7,0x0E,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x02,0x20,0x0C,0xE0,0x05,0x21,0x28,0x00,0xF9,0xF7,0x04,0xFD,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7, + 0x95,0xFA,0x0C,0xE0,0x68,0x00,0x03,0x21,0xF9,0xF7,0xF4,0xFC,0xA0,0x42,0xDB,0xD9, + 0x03,0x21,0x28,0x00,0xF9,0xF7,0xEE,0xFC,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E, + 0xB6,0xD2,0x0E,0x48,0x44,0x88,0x03,0xE0,0xFB,0xF7,0x9C,0xFC,0xFB,0xF7,0x4A,0xFD, + 0x64,0x1E,0xF9,0xD2,0xFB,0xF7,0xC0,0xFC,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62, + 0x01,0x99,0x41,0x63,0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x80,0x90,0x00,0x40,0x01,0x02,0x00,0x00,0x80,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07, + 0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5, + 0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60, + 0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x02,0x49,0x00,0x03, + 0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xAD,0x0B,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C, + 0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68, + 0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2, + 0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x78,0x00,0x00,0xF8,0xB5,0x17,0x48, + 0x00,0x24,0x40,0x78,0x00,0x28,0x25,0xD0,0x15,0x4D,0x13,0x26,0x00,0x20,0xB6,0x01, + 0xAB,0x19,0x12,0xE0,0x81,0x00,0x49,0x19,0x89,0x19,0xCA,0x68,0x97,0x0F,0xFF,0x07, + 0x0A,0xD0,0x92,0x00,0x01,0x27,0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C,0xCA,0x60, + 0xA1,0x00,0xBF,0x08,0xC9,0x19,0x4A,0x60,0x40,0x1C,0x99,0x7A,0x81,0x42,0xE9,0xDC, + 0x08,0x48,0x09,0x22,0x00,0x21,0xFE,0xF7,0xC7,0xF8,0x20,0x00,0xFF,0xF7,0xB4,0xFF, + 0xFC,0xF7,0xAA,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x50,0x07,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xB1,0x0A,0x00,0x20,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7,0x25,0xFC,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF9,0xF7,0x27,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF9,0xF7,0x0C,0xFC,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF9,0xF7,0x0E,0xFC,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xAC,0x0B,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60, + 0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47, + 0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0, + 0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60, + 0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37, + 0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF9,0xF7, + 0xA1,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x12,0x00,0x13,0x00,0xA0,0x00,0x13,0x00, + 0x2E,0x01,0x13,0x00,0x2E,0x01,0x3E,0x00,0x2E,0x01,0x69,0x00,0x50,0x00,0x78,0x00, + 0xA0,0x00,0x78,0x00,0x2E,0x01,0x94,0x00,0x2E,0x01,0xBF,0x00,0x2E,0x01,0xEB,0x00, + 0xF0,0x00,0xF0,0x00,0xA0,0x00,0xF0,0x00,0x50,0x00,0xF0,0x00,0x12,0x00,0x0C,0x01, + 0x12,0x00,0x37,0x01,0x12,0x00,0x62,0x01,0x12,0x00,0x8E,0x01,0x12,0x00,0xCD,0x01, + 0x30,0x00,0xAE,0x01,0x50,0x00,0xCD,0x01,0x70,0x00,0xAE,0x01,0x90,0x00,0xCD,0x01, + 0xB0,0x00,0xAE,0x01,0xD0,0x00,0xCD,0x01,0xF0,0x00,0xAE,0x01,0x10,0x01,0xCD,0x01, + 0x2E,0x01,0xAE,0x01,0xF0,0x00,0x68,0x01,0xA0,0x00,0x68,0x01,0x89,0x08,0x49,0x1E, + 0xC9,0x04,0x01,0x22,0xC9,0x08,0xD2,0x07,0x89,0x18,0x40,0x04,0x40,0x0C,0x01,0x43, + 0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x30,0x0B,0x30,0x01,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFC,0x0F,0x00,0x7F,0xFC,0x0F,0x01,0x3F,0xFE,0x0F,0x02,0x1F,0xFF,0x0F,0x03, + 0x8F,0xFF,0x0F,0x04,0xC7,0xFF,0x0F,0x05,0xE3,0xFF,0x0F,0x06,0xF3,0xFB,0x0F,0x07, + 0xFB,0xF3,0x0F,0x08,0xFF,0xE3,0x0F,0x09,0xFF,0xC7,0x0F,0x0A,0xFF,0x8F,0x0F,0x0B, + 0xFF,0x1F,0x0F,0x0C,0xFF,0x3F,0x0E,0x0D,0xFF,0x7F,0x0C,0x0E,0xFF,0xFF,0x0C,0x4F, + 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, + 0x00,0x01,0x90,0x08,0x80,0x02,0x80,0x0A,0x40,0x01,0x70,0x0C,0xA0,0x00,0x60,0x0E, + 0x50,0x00,0x50,0x10,0x28,0x00,0x40,0x12,0x14,0x00,0x30,0x1C,0x08,0x04,0x20,0x1E, + 0x04,0x08,0xA0,0x20,0x00,0x14,0xB0,0x22,0x00,0x28,0xC0,0x00,0x00,0x50,0xD0,0x00, + 0x00,0xA0,0xE0,0x00,0x00,0x40,0xF1,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x11,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF0,0xC3,0x03,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x01,0x08,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0x40,0x01,0xE0,0x01,0xE8,0x03,0x00,0x00,0x74,0x27,0x00,0x00,0x3C,0x28,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0xA4,0x06,0xA4,0x06,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x7A,0x00,0x01,0x00,0x04,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x04,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0xC8,0x00, + 0x28,0x00,0x1D,0x00,0x64,0x46,0x64,0x46,0x32,0x00,0x32,0x00,0x64,0x00,0xC8,0x00, + 0x64,0x00,0x64,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x2C,0x01,0x2C,0x01,0x2C,0x01, + 0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x32,0x32,0x96,0x32,0x40,0x64, + 0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x41,0xF2,0x01,0x00, + 0x0A,0x0A,0xA8,0x00,0x10,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00,0x3C,0x00,0x5A,0x00, + 0x99,0x19,0xC8,0x00,0x32,0x00,0x1D,0x00,0x64,0x46,0x64,0x46,0x32,0x00,0x32,0x00, + 0x64,0x00,0x64,0x00,0x64,0x00,0x64,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x5E,0x01, + 0x5E,0x01,0x5E,0x01,0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x32,0x32, + 0x96,0x32,0x40,0x64,0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00, + 0x41,0xF2,0x01,0x00,0x08,0x08,0xA8,0x00,0x20,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x28,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x58,0x02,0xBC,0x02,0x00,0x00, + 0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x28,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x47,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x60,0x0F,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x0F,0xC8,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x41,0x42,0x01,0x00, + 0x10,0x00,0x10,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x08,0x08,0x88,0x00, + 0x20,0x5F,0x20,0x3F,0xFF,0xFF,0x00,0x00,0x10,0x10,0x08,0x84,0x00,0x00,0xAC,0x0D, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x08,0x20, + 0x51,0x30,0x10,0x00,0x11,0x90,0x01,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x38,0x31,0x08,0x01,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30,0x12,0x14,0x00,0x00,0x1C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x0D,0x00,0xA0,0xE1,0x10,0xD0,0x9F,0xE5,0x01,0x40,0x2D,0xE9,0x9D,0x01,0x00,0xEB, + 0x01,0x40,0xBD,0xE8,0x00,0xD0,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0xF0,0x0F,0x00,0x20, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0xF9,0x49,0xFA,0x48, + 0x10,0xB4,0x41,0x61,0xF9,0x49,0xF8,0x4C,0x01,0x63,0x0F,0x20,0x00,0x06,0x40,0x34, + 0xE0,0x60,0x00,0x20,0x81,0x00,0x0A,0x19,0x11,0x6A,0x40,0x1C,0x8B,0x00,0xC9,0x01, + 0xDB,0x0E,0xC9,0x0E,0x49,0x06,0x1B,0x05,0x19,0x43,0x14,0x28,0x11,0x62,0xF1,0xD3, + 0xED,0x48,0xEF,0x49,0x80,0x30,0x01,0x63,0xEE,0x49,0x41,0x63,0xEE,0x49,0x08,0x69, + 0x40,0x08,0x40,0x00,0x08,0x61,0xEC,0x48,0x40,0x30,0x01,0x68,0xEB,0x49,0x01,0x60, + 0xEB,0x48,0xEC,0x49,0xC8,0x60,0x10,0xBC,0x70,0x47,0xFC,0xB5,0xEA,0x4C,0x02,0x00, + 0x30,0x34,0x18,0xCC,0x00,0x20,0x00,0x94,0xE8,0x4C,0x24,0x7D,0xE4,0x07,0x2D,0xD0, + 0xE7,0x4C,0x25,0x79,0xE6,0x78,0xE5,0x4C,0xAE,0x46,0xA5,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xE5,0x7D,0x01,0x95,0x25,0x7E,0x67,0x7E,0xA4,0x7E,0x10,0xD0,0xB2,0x42, + 0x1C,0xD1,0x8C,0x45,0x08,0xD0,0x01,0x9A,0x8A,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8C,0x42,0x00,0xD1,0x00,0x98,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0xB1,0x42,0x0B,0xD1,0x94,0x45,0xF7,0xD0,0x01,0x99,0x91,0x42,0xF4,0xD0,0x95,0x42, + 0xF2,0xD0,0x97,0x42,0xF0,0xD0,0x94,0x42,0xEE,0xD0,0xEE,0xE7,0x18,0x00,0xEC,0xE7, + 0x30,0xB4,0xCF,0x4B,0xCF,0x4C,0x5B,0x78,0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A, + 0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43, + 0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52, + 0x00,0x20,0x30,0xBC,0x70,0x47,0xF3,0xB5,0xC3,0x48,0x82,0xB0,0x01,0x90,0x00,0x20, + 0x00,0x90,0xB9,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0xBC,0x4F,0xB6,0x48, + 0xC0,0x68,0xC0,0x07,0xFB,0xD0,0x00,0x24,0x26,0x00,0x25,0xE0,0x00,0x25,0x1F,0xE0, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0x91,0xFF,0x00,0x28,0x17,0xD0,0x79,0x78,0x01,0x9A, + 0x71,0x43,0x49,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x02,0x99, + 0x00,0x29,0x02,0xD0,0x00,0x28,0x09,0xDA,0x01,0xE0,0x00,0x28,0x06,0xDD,0x03,0x9A, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0xB4,0xFF,0x40,0x1C,0x00,0xD1,0x64,0x1C,0x6D,0x1C, + 0x78,0x78,0x85,0x42,0xDC,0xD3,0x76,0x1C,0xB8,0x78,0x86,0x42,0xD6,0xD3,0xB8,0x78, + 0x79,0x78,0x48,0x43,0xA0,0x42,0x0A,0xD0,0x00,0x98,0x41,0x1C,0x00,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0x03,0xD8,0x98,0x48,0xC1,0x68,0xC1,0x60,0xBF,0xE7,0xFF,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0xB4,0x00,0x21,0x9A,0x4C,0x98,0x4B,0x98,0x4E,0x1E,0x25, + 0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E, + 0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0xA5,0x52,0x72,0x78,0x80,0x18,0x49,0x1C,0xB2,0x78,0x77,0x78,0x7A,0x43, + 0x82,0x42,0xE6,0xD8,0xF0,0xBC,0x70,0x47,0xF0,0xB4,0x89,0x4B,0x00,0x21,0x5A,0x78, + 0x1E,0x26,0x88,0x4D,0x42,0x43,0x85,0x4F,0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0, + 0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42, + 0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C, + 0x7B,0x4B,0x04,0x00,0x5B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42,0xE5,0xD8,0xD9,0xE7, + 0x02,0x04,0x78,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3, + 0x70,0x47,0xF1,0xB5,0x72,0x4C,0x70,0x4D,0x21,0x78,0x73,0x4F,0xA8,0x6B,0x00,0x29, + 0x86,0xB0,0x00,0xD0,0x00,0x0C,0x00,0x06,0x00,0x0E,0x01,0x02,0x01,0x43,0x08,0x04, + 0x00,0x0C,0xFF,0xF7,0xE5,0xFF,0x69,0x48,0x00,0x7D,0xC0,0x07,0x08,0xD0,0xE0,0x78, + 0x00,0x28,0x20,0x79,0x02,0xD0,0xFF,0xF7,0xB7,0xFF,0x01,0xE0,0xFF,0xF7,0x92,0xFF, + 0x5D,0x49,0x00,0x20,0x80,0x31,0xC8,0x62,0x61,0x49,0xE8,0x6B,0x09,0x78,0x00,0x29, + 0x08,0xD1,0x5C,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x07,0x12,0x09,0x12,0x01, + 0x00,0x0F,0x07,0xE0,0x57,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x03,0x12,0x09, + 0x12,0x01,0x00,0x0F,0x02,0x43,0x4A,0x60,0x03,0x24,0x26,0x1F,0x01,0xE0,0x03,0x2C, + 0x02,0xD1,0x01,0x25,0xED,0x43,0x09,0xE0,0x02,0x2C,0x01,0xD1,0x01,0x25,0x05,0xE0, + 0x01,0x2C,0x01,0xD1,0x35,0x00,0x01,0xE0,0x00,0x2C,0xF7,0xD0,0xE0,0x07,0xC0,0x0F, + 0x29,0x00,0xFF,0xF7,0x10,0xFF,0x64,0x1E,0xE9,0xD5,0x49,0x48,0x48,0x4D,0x00,0x78, + 0x0C,0x35,0x00,0x28,0x2F,0xD1,0x40,0x48,0x09,0x21,0x01,0x23,0xC2,0x68,0x1A,0x43, + 0xC2,0x60,0xC2,0x68,0xD2,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x00,0x26,0x17,0xE0, + 0x00,0x24,0x10,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x9F,0xFE,0x00,0x28,0x09,0xD0, + 0x3B,0x48,0x40,0x78,0x70,0x43,0x00,0x19,0x81,0x00,0x79,0x58,0x09,0x05,0x09,0x0D, + 0x40,0x00,0x29,0x52,0x64,0x1C,0x36,0x48,0x40,0x78,0x84,0x42,0xEA,0xD3,0x76,0x1C, + 0x33,0x48,0x81,0x78,0x8E,0x42,0xE3,0xD3,0x01,0x78,0x00,0x29,0x03,0xD1,0x80,0x68, + 0x2C,0x49,0x48,0x63,0x05,0xE0,0x2E,0x48,0x80,0x68,0x01,0x0C,0x29,0x48,0x09,0x04, + 0x41,0x63,0x25,0x4A,0x09,0x21,0x01,0x23,0xD0,0x68,0x18,0x43,0xD0,0x60,0xD0,0x68, + 0xC0,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x28,0x48,0x00,0x26,0x02,0x90,0x28,0x48, + 0x01,0x90,0x88,0xE0,0x00,0x24,0x80,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x65,0xFE, + 0x00,0x28,0x79,0xD0,0x1E,0x49,0x0A,0x78,0x00,0x2A,0x43,0xD1,0x49,0x78,0x71,0x43, + 0x0A,0x19,0x53,0x00,0xE9,0x5A,0x81,0x42,0x04,0xD9,0x09,0x1A,0x09,0x04,0xC9,0x0C, + 0x40,0x18,0x03,0xE0,0x41,0x1A,0x09,0x04,0xC9,0x0C,0x40,0x1A,0x91,0x00,0x79,0x58, + 0x0E,0x4A,0x09,0x05,0x09,0x0D,0x40,0x1A,0xE8,0x52,0x11,0x48,0x0B,0x3A,0x40,0x78, + 0x70,0x43,0x00,0x19,0x40,0x00,0x29,0x5A,0x91,0x42,0x55,0xD9,0x00,0x21,0x29,0x52, + 0x52,0xE0,0x00,0x00,0x83,0xC3,0x0F,0x41,0x40,0x06,0x10,0x40,0xF3,0x43,0x0C,0x48, + 0xFC,0xFF,0x01,0x00,0xFC,0xFF,0x03,0x00,0x00,0x90,0x00,0x40,0x0A,0x10,0x00,0x00, + 0xF3,0xC3,0x0F,0x00,0x00,0xA0,0x00,0x40,0xC0,0x0F,0x00,0x20,0x00,0x78,0x00,0x00, + 0xA0,0x06,0x00,0x20,0x00,0x00,0x10,0x40,0x00,0x02,0x10,0x40,0xAC,0x08,0x00,0x20, + 0xAC,0x0A,0x00,0x20,0x81,0x48,0x82,0x49,0x40,0x78,0x70,0x43,0x00,0x19,0x05,0x90, + 0x80,0x00,0x38,0x58,0x00,0x05,0x00,0x0D,0x04,0x90,0x40,0x18,0xFF,0x21,0x91,0x31, + 0x88,0x42,0x10,0xD8,0x7B,0x49,0x04,0x98,0x09,0x1A,0x08,0x00,0x48,0x43,0xC8,0x21, + 0x00,0xF0,0x08,0xF9,0x77,0x4A,0x04,0x99,0x91,0x42,0x76,0x49,0x01,0xD9,0x40,0x18, + 0x00,0xE0,0x08,0x1A,0x03,0x90,0x06,0x98,0x00,0x28,0x08,0xD0,0x6F,0x48,0x01,0x9A, + 0x80,0x78,0x03,0x99,0x60,0x43,0x80,0x19,0x40,0x00,0x11,0x52,0x04,0xE0,0x05,0x99, + 0x02,0x9A,0x03,0x98,0x49,0x00,0x50,0x52,0x64,0x1C,0x68,0x48,0x40,0x78,0x84,0x42, + 0x00,0xD2,0x79,0xE7,0x76,0x1C,0x65,0x48,0x81,0x78,0x8E,0x42,0x00,0xD2,0x71,0xE7, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF8,0xB5,0x63,0x4E,0x5F,0x4D,0x00,0x24, + 0x01,0x27,0x62,0x48,0x01,0x68,0x61,0x4A,0x08,0x04,0x00,0x0E,0x09,0x06,0x09,0x0E, + 0x68,0x70,0x40,0x3A,0xA9,0x70,0x12,0x69,0xD2,0x07,0xD2,0x0F,0x32,0x7D,0x02,0xD0, + 0x92,0x07,0x06,0xD4,0x01,0xE0,0x92,0x07,0x03,0xD5,0x49,0x1E,0x29,0x71,0xEF,0x70, + 0x03,0xE0,0x40,0x1E,0x28,0x71,0x00,0x20,0xE8,0x70,0x20,0x00,0x64,0x1C,0xFF,0xF7, + 0xA8,0xFE,0x28,0x78,0x01,0x28,0x01,0xD0,0x01,0x2C,0x05,0xD0,0x02,0x2C,0x03,0xD0, + 0xFF,0xF7,0x7C,0xFD,0x01,0x2C,0xD4,0xD9,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4C,0x48, + 0x10,0xB5,0x40,0x6B,0x45,0x4C,0xC5,0x22,0xA0,0x60,0x20,0x00,0xD2,0x00,0x00,0x21, + 0x0C,0x30,0xFF,0xF7,0x65,0xFD,0x00,0x20,0x20,0x70,0xFF,0xF7,0xBD,0xFF,0x01,0x20, + 0x20,0x70,0xFF,0xF7,0xB9,0xFF,0x43,0x48,0x43,0x49,0xC8,0x61,0x43,0x48,0xC2,0x68, + 0x52,0x08,0x52,0x00,0xC2,0x60,0x20,0x00,0x0C,0x30,0x04,0xC8,0xCA,0x61,0x4A,0x69, + 0x52,0x06,0xFC,0xD4,0xF9,0xE7,0x40,0x1E,0xFD,0xD2,0x70,0x47,0xF0,0xB5,0x3D,0x48, + 0x3B,0x4A,0x01,0x23,0x03,0x61,0x19,0x00,0x3A,0x48,0x00,0x23,0x43,0x61,0x83,0x61, + 0x01,0x26,0x35,0x00,0x9D,0x40,0x03,0x20,0x36,0x4C,0x00,0x04,0x28,0x43,0x60,0x61, + 0x08,0x00,0x40,0x1E,0xFD,0xD2,0x01,0x20,0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00, + 0x40,0x1E,0xFD,0xD2,0x65,0x61,0x48,0x00,0x86,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69, + 0x00,0x20,0x5C,0x01,0xA4,0x46,0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D, + 0xED,0x07,0xED,0x0F,0x75,0x19,0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C, + 0x10,0x2B,0xD5,0xD3,0x23,0x48,0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x25,0x9D,0x40, + 0x03,0x20,0x20,0x4C,0x00,0x04,0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2, + 0x01,0x20,0x00,0x04,0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0xA5,0x61, + 0x70,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69,0x5C,0x01,0xFF,0x34,0x00,0x20,0xFF,0x34, + 0x02,0x34,0xA4,0x46,0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07, + 0xED,0x0F,0x75,0x19,0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B, + 0xD4,0xD3,0x49,0x1C,0xC8,0x29,0x9F,0xD9,0x3B,0xE7,0x00,0x00,0xA0,0x06,0x00,0x20, + 0x74,0xF5,0xFF,0xFF,0x54,0x0B,0x00,0x00,0x00,0x78,0x00,0x00,0x40,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0xAB,0xFC,0xFF,0x8F,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0xAC,0x08,0x00,0x20,0x00,0xA1,0x00,0x40,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x3F,0x05,0x00,0x20,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xF8,0x07,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x7B,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x7B,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x00,0x5E,0x00,0xCC,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_fw_young2_ver0001.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_fw_young2_ver0001.h new file mode 100644 index 00000000..d9f54435 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_fw_young2_ver0001.h @@ -0,0 +1,2166 @@ +#ifndef __IST30XXB_FW_H__ +#define __IST30XXB_FW_H__ + +/* ist30xxb binary: Fame2 TOPTOUCH, f/w 1(00030301) */ +static unsigned char ist30xxb_fw[] = { + 0x06,0x00,0x00,0xEA,0x2C,0x00,0x00,0xEA,0x2B,0x00,0x00,0xEA,0x2A,0x00,0x00,0xEA, + 0x29,0x00,0x00,0xEA,0x28,0x00,0x00,0xEA,0x27,0x00,0x00,0xEA,0x3E,0x00,0x00,0xEA, + 0x14,0x00,0x9F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0xFF,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0xA0,0xE1,0x00,0x00,0x00,0xEA,0x0C,0x20,0x00,0x40, + 0x11,0x01,0xA0,0xE3,0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0xC1,0x01,0xA0,0xE3, + 0x1C,0x10,0x9F,0xE5,0x00,0x10,0x80,0xE5,0x18,0x00,0x9F,0xE5,0x01,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0xF1,0x01,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0x01,0x00,0x00,0xEA,0xC8,0x74,0x00,0x00,0x4C,0x00,0x00,0x40,0x00,0x00,0x0F,0xE1, + 0x1F,0x00,0xC0,0xE3,0xD1,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x1C,0xD0,0x9F,0xE5, + 0xD3,0x10,0x80,0xE3,0x01,0xF0,0x2F,0xE1,0x14,0xD0,0x9F,0xE5,0x00,0x00,0x0F,0xE1, + 0xC0,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1,0x08,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1, + 0xFC,0x0F,0x00,0x20,0xC0,0x0F,0x00,0x20,0xA7,0x01,0x00,0x00,0x11,0x01,0xA0,0xE3, + 0x11,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x5C,0x30,0x9F,0xE5,0x5C,0x40,0x9F,0xE5, + 0x00,0x40,0x83,0xE5,0x91,0x01,0xA0,0xE3,0x33,0x16,0xA0,0xE3,0x00,0x10,0x80,0xE5, + 0xAC,0x00,0x1F,0xE5,0x00,0x10,0xA0,0xE3,0x08,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5, + 0xFF,0x10,0xA0,0xE3,0x00,0x10,0x80,0xE5,0x03,0x00,0x00,0xEB,0xFE,0x10,0xA0,0xE3, + 0x00,0x10,0x80,0xE5,0x00,0x00,0x00,0xEB,0xF7,0xFF,0xFF,0xEA,0x01,0x29,0xA0,0xE3, + 0x01,0x20,0x52,0xE2,0xFD,0xFF,0xFF,0x1A,0x1E,0xFF,0x2F,0xE1,0xFF,0x40,0x2D,0xE9, + 0xC6,0x00,0x00,0xEB,0xFF,0x40,0xBD,0xE8,0x04,0xF0,0x5E,0xE2,0x1C,0x40,0x00,0x30, + 0x70,0xE9,0x1C,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x80,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0xC0,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0x0F,0xE1,0x40,0x00,0x80,0xE3,0x00,0xF0,0x2F,0xE1, + 0x1E,0xFF,0x2F,0xE1,0x3C,0x4A,0x3A,0x48,0x3A,0x49,0x92,0x08,0x01,0xE0,0x08,0xC9, + 0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x38,0x48,0x01,0x21,0xC9,0x02,0x01,0x62, + 0x00,0x21,0x01,0x62,0x01,0x62,0x36,0x49,0x36,0x48,0x01,0x60,0x20,0x21,0x41,0x60, + 0xA0,0x21,0x81,0x60,0x70,0x47,0xF8,0xB5,0x30,0x4B,0x9F,0x6A,0x32,0x48,0x00,0x69, + 0x42,0x08,0x58,0x69,0x19,0x15,0x08,0x43,0x58,0x61,0xFF,0xF7,0xE5,0xFF,0x58,0x69, + 0xFF,0x21,0x81,0x31,0x08,0x43,0x58,0x61,0x2C,0x48,0x2D,0x4C,0x20,0x60,0xFF,0x20, + 0x90,0x30,0x60,0x60,0x13,0x20,0xA0,0x60,0xA0,0x68,0xA6,0x15,0x30,0x43,0xA0,0x60, + 0x24,0x4D,0x5F,0x23,0x00,0x2F,0x27,0xD1,0x26,0x4F,0x21,0xE0,0x68,0x68,0x00,0x07, + 0x1E,0xD5,0xE8,0x68,0x40,0x28,0x04,0xD1,0xEA,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1, + 0x14,0xE0,0x20,0x28,0x04,0xD3,0xEF,0x61,0x68,0x69,0x18,0x42,0xFC,0xD1,0x0D,0xE0, + 0x0D,0x28,0x08,0xD1,0x2E,0x20,0x68,0x60,0x68,0x69,0x80,0x06,0xFC,0xD4,0x68,0x68, + 0x80,0x07,0xFC,0xD5,0x08,0xE0,0x68,0x68,0x80,0x07,0xFC,0xD5,0xFF,0xF7,0xAC,0xFF, + 0xE0,0x68,0x15,0x49,0x88,0x42,0xD9,0xD3,0xFF,0xF7,0xA6,0xFF,0xA0,0x68,0xB0,0x43, + 0xA0,0x60,0x00,0xF0,0x3D,0xF9,0xF8,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x0F,0x49, + 0x0F,0x4A,0x00,0x20,0x01,0xE0,0x08,0xC9,0x18,0x18,0x91,0x42,0xFB,0xD3,0x70,0x47, + 0x40,0x00,0x00,0x20,0x94,0x02,0x00,0x00,0xCC,0x00,0x00,0x00,0x40,0x00,0x00,0x40, + 0xDE,0x10,0x01,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0xFF,0xFF,0x00,0x00, + 0x00,0x40,0x00,0x40,0xFF,0x03,0xFF,0x2F,0x50,0xC3,0x00,0x00,0x40,0x04,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x30,0x48,0x41,0x6B,0xC9,0x07,0xFC,0xD0,0x41,0x6B,0x01,0x22, + 0x11,0x43,0x41,0x63,0x70,0x47,0x10,0xB4,0x2B,0x4C,0x40,0x23,0x60,0x60,0x20,0x68, + 0x80,0x0A,0x80,0x02,0x10,0x43,0xA8,0x22,0x10,0x43,0x20,0x60,0x02,0xE0,0x08,0x78, + 0xA0,0x60,0x49,0x1C,0x5B,0x1E,0xFA,0xD2,0x10,0xBC,0x70,0x47,0xF0,0xB5,0x05,0x00, + 0x0E,0x00,0x1F,0x00,0x94,0x09,0x81,0x06,0x20,0x48,0x10,0xD1,0x91,0x06,0x0E,0xD1, + 0x0A,0xE0,0x3A,0x00,0x31,0x00,0x28,0x00,0xFF,0xF7,0xDD,0xFF,0x40,0x35,0x2D,0x04, + 0x2D,0x0C,0x40,0x36,0xFF,0xF7,0xCE,0xFF,0x64,0x1E,0x60,0x1C,0xF1,0xD1,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x4B,0x40,0x22,0x58,0x60,0x18,0x68,0x80,0x0A,0x80,0x02, + 0x08,0x43,0xA4,0x21,0x08,0x43,0x18,0x60,0x00,0x21,0x00,0xE0,0x99,0x60,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x70,0xB5,0x05,0x00,0x16,0x00,0x8C,0x09,0x82,0x06,0x0B,0x48, + 0x0E,0xD1,0x89,0x06,0x0C,0xD1,0x08,0xE0,0x31,0x00,0x28,0x00,0xFF,0xF7,0xE2,0xFF, + 0x40,0x35,0x2D,0x04,0x2D,0x0C,0xFF,0xF7,0xA5,0xFF,0x64,0x1E,0x60,0x1C,0xF3,0xD1, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x70,0x00,0x40,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0xF8,0xB5,0x03,0x25,0x0F,0x4E,0x2D,0x07, + 0x01,0x27,0xF0,0x6A,0x00,0x28,0x15,0xD0,0xF0,0x6B,0xE9,0x68,0x80,0x08,0x3C,0x00, + 0x84,0x40,0x21,0x43,0xE9,0x60,0x69,0x68,0x21,0x42,0x00,0xD0,0x34,0x63,0x81,0x00, + 0x07,0x48,0x40,0x58,0x00,0x28,0x01,0xD0,0x06,0xF0,0x30,0xFE,0xE8,0x68,0xA0,0x43, + 0xE8,0x60,0xE6,0xE7,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x30, + 0x2C,0x0B,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF8,0xB5,0x00,0xF0,0xF9,0xFC,0x07,0x00,0x03,0xF0,0x14,0xFC,0x03,0xF0,0x06,0xFC, + 0x03,0xF0,0x8C,0xFC,0x48,0x4A,0x49,0x49,0x49,0x48,0x04,0xF0,0x22,0xFE,0x49,0x4D, + 0x00,0x26,0x01,0x21,0xC9,0x03,0x30,0x00,0xEE,0x81,0x00,0xF0,0x93,0xF9,0xA8,0x61, + 0x45,0x49,0x00,0x20,0x00,0xF0,0x8E,0xF9,0x44,0x4B,0x45,0x49,0xD8,0x63,0x45,0x48, + 0x00,0xF0,0x88,0xF9,0xD9,0x6B,0x00,0x04,0x08,0x43,0xD8,0x63,0x03,0xF0,0x4E,0xFC, + 0xA1,0x22,0x41,0x48,0xD2,0x00,0x00,0x21,0x04,0xF0,0x0E,0xFE,0x06,0xF0,0xC8,0xF9, + 0x03,0xF0,0xF0,0xFC,0x3D,0x48,0x01,0x24,0x81,0x7A,0xA9,0x71,0xC1,0x7A,0xE9,0x71, + 0x40,0x7A,0x28,0x72,0xFF,0x20,0x91,0x30,0x6E,0x72,0x28,0x82,0xAE,0x72,0xEE,0x72, + 0x35,0x48,0x2E,0x73,0x64,0x07,0x6E,0x73,0x60,0x63,0xFF,0x20,0xE0,0x63,0xE0,0x14, + 0x00,0xF0,0x8E,0xFC,0x32,0x48,0x06,0x70,0xFF,0x20,0x81,0x30,0x00,0xF0,0x88,0xFC, + 0x30,0x49,0x02,0x20,0x06,0xF0,0xB8,0xFC,0x02,0x20,0x06,0xF0,0xBD,0xFC,0x28,0x7A, + 0x00,0x28,0x01,0xD0,0x06,0xF0,0x6A,0xFD,0x00,0x2F,0x1F,0xD1,0x2A,0x4F,0xBE,0x15, + 0x28,0x7A,0x00,0x28,0x02,0xD0,0x29,0x49,0x28,0x6B,0x88,0x60,0xE0,0x6B,0x0B,0x28, + 0x14,0xD0,0x27,0x48,0x40,0x68,0x00,0x07,0x01,0xD5,0x02,0xF0,0xAF,0xFA,0xF8,0x68, + 0x24,0x49,0x88,0x42,0xEC,0xD9,0x24,0x48,0xC0,0x68,0xFF,0x28,0x06,0xD1,0xB8,0x68, + 0xB0,0x43,0xB8,0x60,0xB8,0x68,0x30,0x43,0xB8,0x60,0xE1,0xE7,0xE8,0x79,0x00,0x28, + 0x03,0xD1,0x01,0x20,0x80,0x02,0x00,0xF0,0x4B,0xFC,0x28,0x7A,0x00,0x28,0x01,0xD0, + 0x06,0xF0,0x44,0xFD,0x02,0x20,0x06,0xF0,0x93,0xFC,0xFF,0x20,0x81,0x30,0x00,0xF0, + 0x3F,0xFC,0x16,0x49,0x05,0x20,0x03,0xF0,0x2D,0xFA,0x0B,0x20,0xE0,0x63,0x03,0xF0, + 0xBD,0xFA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x28,0x00,0x00,0x00,0x7C,0x71,0x00,0x00, + 0x40,0x00,0x00,0x20,0xF8,0x0A,0x00,0x20,0xC0,0x75,0x00,0x00,0xC0,0x0F,0x00,0x20, + 0x00,0x7E,0x00,0x00,0x00,0x76,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xAD,0x0B,0x00,0x20,0xFF,0xFF,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x30,0x00,0x40, + 0x00,0x40,0x00,0x30,0x50,0xC3,0x00,0x00,0xC0,0x75,0x00,0x00,0xAD,0x6E,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0x30,0x90,0xE1,0x21,0x00,0x00,0x4A,0x00,0x20,0xB0,0xE3, + 0xA0,0x30,0x71,0xE0,0x1A,0x00,0x00,0x3A,0x20,0x32,0x71,0xE0,0x0F,0x00,0x00,0x3A, + 0x20,0x34,0x71,0xE0,0x01,0x00,0x00,0x3A,0x00,0xC0,0xA0,0xE3,0x20,0x00,0x00,0xEA, + 0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x33,0x71,0xE0, + 0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0,0x81,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x31,0x71,0xE0, + 0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0,0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0, + 0x1E,0xFF,0x2F,0xE1,0x02,0x21,0x11,0xE2,0x00,0x10,0x61,0x42,0x40,0xC0,0x32,0xE0, + 0x00,0x00,0x60,0x22,0x20,0x32,0x71,0xE0,0x1D,0x00,0x00,0x3A,0x20,0x34,0x71,0xE0, + 0x0F,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x23,0x82,0xE3, + 0x0B,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x26,0x82,0xE3, + 0x07,0x00,0x00,0x3A,0x01,0x13,0xA0,0xE1,0x20,0x34,0x71,0xE0,0x3F,0x29,0x82,0xE3, + 0x01,0x13,0xA0,0x21,0x3F,0x2C,0x82,0x23,0x00,0x30,0x71,0xE2,0x1D,0x00,0x00,0x2A, + 0x21,0x13,0xA0,0x21,0xA0,0x33,0x71,0xE0,0x81,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x33,0x71,0xE0,0x01,0x03,0x40,0x20,0x02,0x20,0xB2,0xE0,0xA0,0x32,0x71,0xE0, + 0x81,0x02,0x40,0x20,0x02,0x20,0xB2,0xE0,0x20,0x32,0x71,0xE0,0x01,0x02,0x40,0x20, + 0x02,0x20,0xB2,0xE0,0xA0,0x31,0x71,0xE0,0x81,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0, + 0x20,0x31,0x71,0xE0,0x01,0x01,0x40,0x20,0x02,0x20,0xB2,0xE0,0xEB,0xFF,0xFF,0x2A, + 0xA0,0x30,0x71,0xE0,0x81,0x00,0x40,0x20,0x02,0x20,0xB2,0xE0,0x01,0x10,0x50,0xE0, + 0x00,0x10,0xA0,0x31,0x02,0x00,0xA2,0xE0,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x00,0x10,0x61,0x22,0x1E,0xFF,0x2F,0xE1,0xCC,0xCF,0xB0,0xE1,0x00,0x00,0x60,0x42, + 0x01,0x40,0x2D,0xE9,0x00,0x00,0xB0,0xE3,0x01,0x00,0x00,0xEB,0x02,0x40,0xBD,0xE8, + 0x1E,0xFF,0x2F,0xE1,0x00,0x00,0xA0,0xE1,0x07,0x40,0x2D,0xE9,0x02,0x00,0xB0,0xE3, + 0x01,0x00,0x00,0xEB,0x07,0x40,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0x01,0xC0,0x8F,0xE2, + 0x1C,0xFF,0x2F,0xE1,0x01,0x00,0x10,0xB5,0x02,0x20,0x06,0xF0,0x87,0xFC,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x47,0xC0,0x46,0x00,0x20,0xB0,0xE3,0x20,0x32,0x71,0xE0, + 0xA6,0xFF,0xFF,0x3A,0x20,0x34,0x71,0xE0,0x98,0xFF,0xFF,0x3A,0x00,0xC0,0xA0,0xE3, + 0xB7,0xFF,0xFF,0xEA,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x41,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0xD1,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x79,0x00,0x00,0x20,0x78,0x47,0xC0,0x46,0x1B,0xFE,0xFF,0xEA,0x02,0x48,0x01,0x68, + 0x02,0x4A,0x11,0x40,0x01,0x60,0x70,0x47,0x00,0xA0,0x00,0x40,0xFE,0xFF,0xEF,0xFF, + 0x07,0x49,0x10,0xB5,0x08,0x68,0x07,0x4A,0x10,0x43,0x08,0x60,0x0F,0x24,0x02,0xF0, + 0xF0,0xF8,0x64,0x1E,0x00,0x2C,0xFA,0xDC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x01,0x00,0x10,0x00,0xF0,0xB5,0x01,0x27,0x7F,0x07,0x3D,0x68, + 0x17,0x4E,0xB0,0x7E,0xC0,0x07,0x26,0xD0,0x70,0x7D,0x00,0x28,0x21,0xD0,0xBA,0x00, + 0x01,0x2D,0x02,0xD1,0x79,0x68,0x11,0x43,0xB9,0x60,0x00,0x04,0x02,0x43,0x90,0x0A, + 0x80,0x02,0xA9,0x05,0x89,0x0D,0x08,0x43,0x78,0x60,0x01,0x24,0x08,0xE0,0x0D,0x49, + 0xE0,0x00,0x40,0x18,0x0C,0x49,0x41,0x18,0x28,0x19,0x06,0xF0,0xFD,0xF8,0x64,0x1C, + 0x70,0x7D,0xA0,0x42,0xF3,0xDA,0x70,0x7D,0x01,0x28,0x02,0xD1,0x00,0x2D,0x00,0xD1, + 0x01,0x25,0x70,0x7D,0x45,0x19,0x3D,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x30,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x86,0x04,0x00,0x00,0x70,0xB4,0x1A,0x4B, + 0xDA,0x88,0xD2,0x07,0x2B,0xD1,0x19,0x4A,0x05,0x78,0x54,0x7D,0xE4,0x00,0xE6,0x18, + 0x09,0x24,0xE4,0x01,0x36,0x19,0xB5,0x73,0x56,0x7D,0x45,0x88,0xF6,0x00,0xF6,0x18, + 0x36,0x19,0x35,0x82,0x56,0x7D,0x85,0x88,0xF6,0x00,0xF6,0x18,0x36,0x19,0x75,0x82, + 0x55,0x7D,0xED,0x00,0xED,0x18,0x2D,0x19,0x29,0x75,0x55,0x7D,0xC1,0x79,0xED,0x00, + 0xEB,0x18,0x1B,0x19,0x59,0x75,0x51,0x7D,0x49,0x1C,0x51,0x75,0xC0,0x79,0x06,0x28, + 0x07,0xD0,0x0A,0x28,0x01,0xD0,0x12,0x28,0x01,0xD1,0x00,0x20,0x90,0x75,0x70,0xBC, + 0x70,0x47,0x01,0x20,0xFA,0xE7,0x00,0x00,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xFF,0xB5,0x0A,0x20,0x48,0x43,0x15,0x4F,0x81,0xB0,0xC5,0x19,0x48,0x00,0xFF,0x35, + 0x61,0x35,0xC0,0x19,0xC0,0x30,0x2A,0x71,0x0C,0x00,0x00,0x90,0x80,0x89,0x16,0x00, + 0x0A,0x21,0xFF,0xF7,0x2F,0xFF,0xE8,0x80,0x00,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7, + 0x29,0xFF,0x28,0x81,0x38,0x19,0xFF,0x30,0x01,0x30,0x00,0x7C,0xB9,0x19,0x68,0x71, + 0x04,0x98,0xA8,0x72,0x01,0x98,0x06,0x55,0x13,0x20,0x40,0x01,0x08,0x18,0x00,0x21, + 0xC4,0x76,0x81,0x74,0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF0,0x05,0x00,0x20, + 0x06,0x48,0x0F,0x23,0x42,0x79,0x01,0x68,0x9B,0x06,0x49,0x1C,0x12,0x07,0x12,0x0A, + 0xD2,0x18,0x09,0x03,0x09,0x0B,0x0A,0x43,0x02,0x60,0x70,0x47,0xF0,0x05,0x00,0x20, + 0xF1,0xB5,0xB2,0x48,0x90,0xB0,0x0F,0x90,0x40,0x7C,0xB2,0x49,0x02,0x90,0x0F,0x98, + 0xC0,0x7C,0x01,0x90,0x0F,0x98,0x00,0x7C,0x00,0x90,0xAD,0x48,0xC9,0x88,0x00,0x8A, + 0x49,0x06,0x02,0xD4,0xA9,0x48,0x40,0x30,0x80,0x89,0x00,0x05,0x7E,0xD5,0x10,0x98, + 0x01,0x28,0x00,0xD0,0x02,0x20,0x03,0x90,0x00,0x20,0x04,0x90,0x3E,0xE1,0x03,0x98, + 0x81,0x00,0x01,0x20,0x40,0x07,0x08,0x18,0x0E,0x90,0x00,0x68,0x81,0x00,0x0D,0x90, + 0x0C,0x0F,0x80,0x0F,0xC0,0x07,0x03,0xD1,0x20,0x00,0x01,0xF0,0x7F,0xFB,0x26,0xE1, + 0x9D,0x48,0xA5,0x00,0x40,0x5F,0x00,0x28,0x84,0x46,0x0F,0xDA,0x0D,0x98,0x9A,0x49, + 0x80,0x01,0x80,0x0D,0x48,0x53,0x0D,0x98,0x6A,0x18,0x80,0x05,0x80,0x0D,0x50,0x80, + 0x4A,0x5B,0x24,0x31,0x4A,0x53,0x69,0x18,0x48,0x80,0x10,0xE1,0x02,0x9F,0x92,0x49, + 0x00,0x20,0x7F,0x1E,0x48,0x31,0x69,0x18,0x06,0xE0,0x83,0x00,0xCA,0x18,0x96,0x88, + 0x40,0x1C,0xCE,0x52,0xD3,0x88,0x53,0x80,0xB8,0x42,0xF6,0xDB,0x0D,0x98,0x62,0x46, + 0x80,0x01,0x80,0x0D,0x0C,0x90,0x80,0x1A,0x02,0x9A,0x87,0x4E,0x92,0x00,0x8B,0x18, + 0x20,0x3B,0x98,0x83,0x0D,0x98,0xAA,0x19,0x80,0x05,0x80,0x0D,0x0A,0x92,0x0B,0x90, + 0x52,0x88,0x80,0x1A,0xD8,0x83,0x00,0x20,0x06,0x00,0x02,0x00,0x07,0xE0,0x93,0x00, + 0xCF,0x5E,0x38,0x18,0xCF,0x18,0x02,0x23,0xFB,0x5E,0x9E,0x19,0x52,0x1C,0x02,0x9B, + 0x9A,0x42,0xF4,0xDB,0x19,0x00,0xFF,0xF7,0xAB,0xFD,0x07,0x00,0x02,0x99,0x30,0x00, + 0xFF,0xF7,0xA6,0xFD,0x00,0x2F,0x00,0xDC,0x7F,0x42,0x0F,0x99,0x89,0x7C,0x8F,0x42, + 0x17,0xDA,0x00,0x28,0x00,0xDC,0x40,0x42,0x88,0x42,0x12,0xDA,0x01,0x98,0x0C,0x21, + 0x48,0x43,0x0A,0x21,0xFF,0xF7,0x6E,0xFE,0x61,0x00,0x00,0xE0,0xCA,0xE0,0x6A,0x4B, + 0x1C,0x3B,0x5A,0x5E,0x90,0x42,0x0C,0xDD,0x0F,0x98,0x00,0x7D,0x10,0x18,0x58,0x52, + 0x07,0xE0,0x65,0x49,0x0F,0x9A,0x60,0x00,0x1C,0x39,0x0B,0x5A,0x52,0x7D,0x9A,0x1A, + 0x0A,0x52,0x61,0x49,0x60,0x00,0x1C,0x39,0x0A,0x5E,0x00,0x2A,0x01,0xDC,0x00,0x22, + 0x0A,0x52,0x08,0x5E,0x01,0x99,0x88,0x42,0x09,0x90,0x01,0xDB,0x05,0x20,0x28,0xE0, + 0x88,0x00,0x05,0x21,0xFF,0xF7,0x46,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x04,0x20, + 0x1F,0xE0,0x01,0x98,0x41,0x00,0x40,0x18,0x05,0x21,0xFF,0xF7,0x3B,0xFE,0x09,0x99, + 0x88,0x42,0x01,0xDC,0x03,0x20,0x14,0xE0,0x01,0x98,0x05,0x21,0x40,0x00,0xFF,0xF7, + 0x31,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x01,0x98,0x05,0x21, + 0xFF,0xF7,0x28,0xFE,0x09,0x99,0x88,0x42,0x01,0xDC,0x01,0x20,0x01,0xE0,0x08,0x00, + 0x02,0xD1,0x45,0x49,0x0A,0x39,0x08,0x55,0x43,0x49,0x0C,0x9A,0x24,0x31,0x48,0x5F, + 0x16,0x1A,0x08,0x90,0x68,0x18,0x02,0x21,0x07,0x90,0x41,0x5E,0x0B,0x9A,0x3E,0x48, + 0x57,0x1A,0x06,0x91,0x0F,0x99,0x0A,0x38,0x00,0x5D,0x89,0x7D,0x88,0x42,0x27,0xD3, + 0x00,0x2E,0x01,0xD1,0x00,0x24,0x0D,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0x00,0x99, + 0x88,0x42,0x01,0xDA,0x01,0x24,0x05,0xE0,0x30,0x1E,0x00,0xDC,0x70,0x42,0xFF,0xF7, + 0x1F,0xFD,0x04,0x00,0x00,0x2F,0x01,0xD1,0x00,0x20,0x0C,0xE0,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0x00,0x99,0x88,0x42,0x01,0xDA,0x01,0x20,0x04,0xE0,0x38,0x1E,0x00,0xDC, + 0x78,0x42,0xFF,0xF7,0x0D,0xFD,0x08,0x99,0x00,0x2E,0x19,0xDB,0x09,0x19,0x18,0xE0, + 0x09,0x98,0x64,0x21,0x48,0x43,0x01,0x99,0xFF,0xF7,0x02,0xFD,0x64,0x21,0x08,0x1A, + 0x31,0x1E,0x05,0x90,0x00,0xDC,0x71,0x42,0x48,0x43,0x64,0x21,0xFF,0xF7,0xF8,0xFC, + 0x05,0x9A,0x04,0x00,0x38,0x1E,0x00,0xDC,0x78,0x42,0x50,0x43,0x64,0x21,0xE0,0xE7, + 0x09,0x1B,0x06,0x9A,0x00,0x2F,0x01,0xDB,0x10,0x18,0x00,0xE0,0x10,0x1A,0x16,0x4A, + 0x0C,0x9B,0x53,0x53,0x0A,0x9B,0x0B,0x9A,0x5A,0x80,0x13,0x4A,0x13,0x4B,0x24,0x32, + 0x51,0x53,0x07,0x9A,0x89,0x05,0x50,0x80,0x0D,0x9A,0x89,0x09,0x1A,0x40,0x0A,0x43, + 0x91,0x0A,0x89,0x02,0x80,0x05,0x80,0x0D,0x01,0x43,0x0E,0x98,0x01,0x60,0x04,0x98, + 0x40,0x1C,0x04,0x90,0x03,0x98,0x40,0x1C,0x03,0x90,0x04,0x98,0x10,0x99,0x88,0x42, + 0x00,0xDA,0xBC,0xE6,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xA0,0x78,0x00,0x00, + 0xA0,0x79,0x00,0x00,0xF0,0x05,0x00,0x20,0xCA,0x0B,0x00,0x20,0xFF,0xFF,0x00,0xFC, + 0x10,0x4B,0x30,0xB4,0x27,0x21,0xDA,0x88,0x49,0x01,0x80,0x24,0x59,0x18,0x00,0x28, + 0x0E,0xD0,0x0D,0x48,0x45,0x7B,0x8D,0x82,0xC5,0x89,0xCD,0x82,0x05,0x8A,0x0D,0x83, + 0x40,0x8A,0x48,0x83,0x08,0x48,0x20,0x30,0x00,0x89,0x22,0x43,0x88,0x83,0x06,0xE0, + 0x00,0x20,0x88,0x82,0xC8,0x82,0x08,0x83,0x48,0x83,0xA2,0x43,0x88,0x83,0xDA,0x80, + 0x30,0xBC,0x70,0x47,0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x7F,0xB5,0x24,0x4D, + 0x04,0x00,0x1A,0x28,0x0B,0xD1,0x28,0x6A,0x00,0x28,0x08,0xD1,0x68,0x6A,0x00,0x28, + 0x05,0xD1,0x20,0x4C,0x01,0xF0,0x86,0xFE,0x64,0x1E,0xFB,0xD2,0x14,0xE0,0x05,0xF0, + 0x57,0xF8,0x00,0x20,0x01,0xF0,0xF4,0xFC,0x01,0xF0,0x72,0xFD,0x01,0xF0,0xBA,0xFD, + 0x03,0xAA,0x01,0xA9,0x02,0xA8,0x04,0xF0,0x4F,0xFA,0x03,0x00,0x01,0x9A,0x02,0x99, + 0x03,0x98,0x00,0x94,0x00,0xF0,0x30,0xF8,0x02,0x20,0x06,0xF0,0xC9,0xF8,0x02,0x20, + 0x06,0xF0,0xBA,0xF8,0x10,0x48,0xE9,0x68,0xC1,0x61,0x29,0x69,0xC1,0x61,0x0F,0x49, + 0xCA,0x68,0x52,0x08,0x52,0x00,0xCA,0x60,0x0D,0x4A,0x0E,0x49,0x02,0xE0,0xD3,0x68, + 0x8B,0x42,0x02,0xD8,0x43,0x69,0x9B,0x06,0xF9,0xD5,0x41,0x68,0x89,0x07,0xFC,0xD5, + 0x01,0xF0,0x66,0xFE,0x01,0x20,0x00,0xF0,0x6B,0xF8,0x7F,0xBC,0x08,0xBC,0x18,0x47, + 0xC0,0x75,0x00,0x00,0xE7,0x03,0x00,0x00,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0x00,0x40,0x00,0x40,0x50,0xC3,0x00,0x00,0xFF,0xB5,0x05,0x00,0x0E,0x00,0x91,0xB0, + 0xFF,0xF7,0xD0,0xF9,0x1C,0x48,0x01,0x27,0x04,0x04,0x24,0x0C,0x7F,0x02,0x00,0x22, + 0x39,0x00,0x20,0x00,0xFF,0xF7,0x1E,0xFD,0x18,0x49,0x3A,0x00,0x20,0x00,0x00,0x23, + 0xFF,0xF7,0x20,0xFD,0x16,0x49,0x40,0x22,0x01,0xA8,0x04,0xF0,0x92,0xF9,0x14,0x99, + 0x28,0x04,0x09,0x03,0x08,0x43,0x13,0x49,0x08,0x43,0x04,0x90,0x13,0x99,0x30,0x04, + 0x08,0x43,0x05,0x90,0x10,0x48,0x11,0x49,0xC0,0x6B,0x10,0x90,0x0C,0x48,0x80,0x69, + 0x40,0x1C,0x07,0x90,0x00,0x20,0x8D,0x42,0x09,0x90,0x02,0xD1,0x06,0x99,0x49,0x1C, + 0x06,0x91,0x1A,0x99,0x1A,0x29,0x00,0xD1,0x0A,0x90,0x01,0xA8,0x06,0xF0,0xDC,0xF8, + 0x15,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40, + 0xC0,0x75,0x00,0x00,0xAB,0x0C,0x00,0x80,0xC0,0x0F,0x00,0x20,0xEC,0x0D,0x00,0x00, + 0x02,0x4A,0x51,0x69,0x81,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x02,0x4A,0x51,0x69,0x01,0x43,0x51,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x78,0x47,0xC0,0x46,0x01,0x21,0xA0,0xE3,0x50,0x30,0x92,0xE5,0x0C,0x10,0xA0,0xE3, + 0x03,0x00,0x80,0xE1,0x50,0x00,0x82,0xE5,0x00,0x00,0x00,0xEA,0x00,0x00,0xA0,0xE1, + 0x01,0x10,0x51,0xE2,0xFC,0xFF,0xFF,0x2A,0x1E,0xFF,0x2F,0xE1,0x01,0x48,0x40,0x69, + 0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x01,0x48,0x80,0x6A,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x02,0x49,0x08,0x62,0x00,0x20,0x08,0x62,0x70,0x47,0x00,0x00, + 0x40,0x00,0x00,0x40,0x01,0x49,0x48,0x61,0x70,0x47,0x00,0x00,0x40,0x00,0x00,0x40, + 0x07,0x49,0xFF,0x28,0x04,0xD1,0x01,0x20,0xC8,0x60,0x00,0x20,0x88,0x61,0x70,0x47, + 0x8A,0x69,0x12,0x07,0x12,0x0F,0x02,0x43,0x8A,0x61,0x02,0x20,0xC8,0x60,0x70,0x47, + 0x40,0x00,0x00,0x40,0xF0,0xB5,0x00,0x20,0xF3,0xB0,0x62,0x90,0xFF,0x49,0x40,0x1E, + 0x5E,0x90,0xCB,0x79,0xFE,0x4F,0xFF,0x48,0xFA,0x88,0x54,0x06,0x00,0xD4,0xC3,0x78, + 0x54,0x06,0x05,0x93,0x0B,0x7A,0x00,0xD4,0x03,0x79,0xFB,0x4C,0xA4,0x8A,0x1B,0x19, + 0x1B,0x06,0x1B,0x0E,0x04,0x93,0x4B,0x7A,0x54,0x06,0x00,0xD4,0x43,0x79,0x52,0x06, + 0x03,0x93,0x89,0x7A,0x00,0xD4,0x81,0x79,0x00,0x20,0xF4,0x4C,0x02,0x91,0x3D,0x79, + 0x01,0x26,0x01,0x90,0x13,0xE0,0x0A,0x20,0x70,0x43,0x43,0x21,0xC0,0x19,0xC9,0x00, + 0x09,0x5C,0x00,0x29,0x0A,0xD0,0xEE,0x49,0x40,0x18,0x02,0xF0,0x43,0xFE,0x00,0x28, + 0x04,0xD0,0x01,0x98,0x40,0x1C,0x00,0x06,0x00,0x0E,0x01,0x90,0x76,0x1C,0xA0,0x78, + 0xB0,0x42,0xE8,0xDA,0xE7,0x48,0x72,0x90,0xC2,0x8A,0x41,0x8B,0x50,0x1A,0x00,0x28, + 0x00,0xDC,0x88,0x1A,0x03,0x04,0x72,0x98,0x72,0x99,0x00,0x8B,0x89,0x8B,0x1B,0x0C, + 0x42,0x1A,0x00,0x2A,0x00,0xDC,0x0A,0x1A,0x10,0x04,0x72,0x9A,0x00,0x21,0x91,0x74, + 0x72,0x9A,0x00,0x0C,0xD1,0x74,0x72,0x9A,0x11,0x75,0x01,0x99,0x00,0x29,0x10,0xD0, + 0x1E,0x2B,0x0E,0xD2,0x32,0x28,0x03,0xD2,0x72,0x98,0x01,0x21,0x81,0x74,0x08,0xE0, + 0x64,0x28,0x03,0xD2,0x72,0x99,0x01,0x20,0xC8,0x74,0x02,0xE0,0x72,0x98,0x01,0x21, + 0x01,0x75,0x72,0x98,0x40,0x7C,0x00,0x28,0x16,0xD1,0x72,0x98,0x80,0x7C,0x00,0x28, + 0x02,0xD0,0x05,0x98,0x80,0x1C,0x0C,0xE0,0x72,0x98,0xC0,0x7C,0x00,0x28,0x02,0xD0, + 0x05,0x98,0x00,0x1D,0x05,0xE0,0x72,0x98,0x00,0x7D,0x00,0x28,0x04,0xD0,0x05,0x98, + 0x80,0x1D,0x00,0x06,0x00,0x0E,0x05,0x90,0x09,0x22,0x00,0x21,0x5B,0xA8,0x04,0xF0, + 0x8B,0xF8,0xF8,0x88,0xFF,0x21,0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x05,0xD5, + 0x01,0xF0,0xAE,0xF8,0x73,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xE0,0x78,0x00,0x28, + 0x01,0xD0,0x40,0x1E,0xE0,0x70,0x60,0x78,0x00,0x2D,0x02,0xD1,0x00,0x28,0x18,0xD0, + 0x18,0xE0,0x00,0x28,0x16,0xD1,0xB1,0x48,0x5A,0x22,0x00,0x21,0x5E,0x30,0x04,0xF0, + 0x6B,0xF8,0xE0,0x78,0x00,0x28,0x0C,0xD1,0x01,0x26,0x07,0xE0,0x31,0x06,0x09,0x0E, + 0x0A,0x00,0x14,0x23,0x5B,0xA8,0xFF,0xF7,0x7B,0xFC,0x76,0x1C,0xAE,0x42,0xF5,0xDD, + 0x25,0x70,0xE6,0xE1,0x09,0x22,0x01,0x21,0x58,0xA8,0x04,0xF0,0x55,0xF8,0x02,0x20, + 0xA3,0x49,0x06,0x90,0x9E,0x48,0x5D,0x31,0x41,0x18,0x71,0x91,0xA0,0x49,0x54,0x31, + 0x40,0x18,0x70,0x90,0x13,0xE1,0x08,0x26,0x07,0xAF,0x24,0x20,0x70,0x43,0x07,0xA9, + 0x40,0x18,0x00,0x21,0x24,0x22,0xC9,0x43,0x04,0xF0,0x3E,0xF8,0x76,0x1E,0xF4,0xD5, + 0x06,0x98,0x01,0xF0,0x0B,0xFC,0x01,0x27,0x5F,0x90,0x53,0xE0,0x5F,0x98,0x01,0x26, + 0x60,0x90,0x4B,0xE0,0x0A,0x20,0x70,0x43,0x8D,0x49,0x40,0x18,0x01,0x00,0xFF,0x30, + 0xFF,0x30,0x02,0x30,0x6F,0x90,0x00,0x7E,0x00,0x28,0x3E,0xD0,0x8C,0x48,0x08,0x18, + 0x6E,0x90,0x02,0xF0,0x7F,0xFD,0x06,0x99,0x08,0x43,0x07,0xD0,0x6E,0x98,0x02,0xF0, + 0x79,0xFD,0x00,0x28,0x31,0xD0,0x06,0x98,0x00,0x28,0x2E,0xD0,0x80,0x49,0x78,0x00, + 0x40,0x18,0xC0,0x30,0x6D,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0x6B,0xFB,0x6F,0x99, + 0x49,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC,0x42,0x1A,0x6D,0x98,0x61,0x92,0xC0,0x8B, + 0x0A,0x21,0xFF,0xF7,0x5F,0xFB,0x6F,0x99,0x89,0x8B,0x0A,0x1A,0x00,0x2A,0x00,0xDC, + 0x42,0x1A,0x61,0x98,0x01,0x00,0x41,0x43,0x10,0x00,0x50,0x43,0x08,0x18,0x60,0x99, + 0x88,0x42,0x04,0xDA,0x24,0x21,0x79,0x43,0x07,0xAA,0x56,0x50,0x60,0x90,0x24,0x21, + 0x79,0x43,0x07,0xAA,0x89,0x18,0xB2,0x00,0x88,0x50,0x76,0x1C,0xA0,0x78,0xB0,0x42, + 0xB0,0xDA,0x7F,0x1C,0xAF,0x42,0xA9,0xDD,0x01,0x20,0xA4,0xE0,0x01,0x23,0x5F,0x9A, + 0x18,0x00,0x15,0xE0,0x5B,0xA9,0x09,0x5C,0x00,0x29,0x10,0xD1,0x24,0x21,0x41,0x43, + 0x0F,0x00,0x07,0xAE,0x89,0x19,0xF6,0x59,0xB7,0x00,0xC9,0x59,0x91,0x42,0x06,0xDA, + 0x00,0x29,0x04,0xDB,0x00,0x2E,0x02,0xDB,0x0A,0x00,0x00,0x23,0x5E,0x90,0x40,0x1C, + 0xA8,0x42,0xE7,0xDD,0x00,0x2B,0x7E,0xD1,0x62,0x98,0x5E,0x9E,0x40,0x1C,0x62,0x90, + 0x24,0x20,0x46,0x43,0x07,0xA8,0x80,0x59,0x0A,0x21,0x48,0x43,0x50,0x49,0x0A,0x22, + 0x41,0x18,0x5E,0x98,0xFF,0x31,0x50,0x43,0x4D,0x4A,0xBF,0x31,0x87,0x18,0x38,0x00, + 0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0,0x8B,0xFF,0x5E,0x98,0x48,0x49,0x40,0x00, + 0x40,0x18,0xC0,0x30,0x6C,0x90,0x80,0x89,0x0A,0x21,0xFF,0xF7,0xFB,0xFA,0xFF,0x37, + 0x61,0x37,0xF8,0x80,0x6C,0x98,0x0A,0x21,0xC0,0x8B,0xFF,0xF7,0xF3,0xFA,0x38,0x81, + 0x3F,0x48,0x5E,0x99,0x40,0x18,0xFF,0x30,0x01,0x30,0x00,0x7C,0x78,0x71,0xB8,0x7A, + 0x05,0x99,0x49,0x1C,0x88,0x42,0x01,0xD2,0x40,0x1C,0xB8,0x72,0xB8,0x7A,0x13,0x28, + 0x6B,0x90,0x09,0xD9,0x14,0x21,0xFF,0xF7,0xDD,0xFA,0x04,0x99,0x89,0x1C,0x88,0x42, + 0x02,0xD2,0x6B,0x98,0x14,0x30,0xB8,0x72,0x38,0x79,0x5E,0x9A,0x5B,0xA9,0x88,0x54, + 0x71,0x9A,0x5E,0x99,0x81,0x54,0x39,0x79,0x70,0x9A,0x00,0x20,0x88,0x54,0x07,0xA9, + 0x89,0x59,0x58,0xAA,0x50,0x54,0x01,0x21,0x23,0xE0,0x08,0x00,0x24,0x23,0x58,0x43, + 0x07,0xAB,0x6A,0x90,0xC0,0x18,0x69,0x90,0x9B,0x59,0x00,0x22,0xD2,0x43,0x9B,0x00, + 0xC2,0x50,0x5B,0xA8,0x40,0x5C,0x5F,0x9B,0x00,0x28,0x11,0xD1,0xA2,0x78,0x01,0x20, + 0x94,0x46,0x0B,0xE0,0x69,0x9A,0x87,0x00,0xD2,0x59,0x00,0x2A,0x05,0xDB,0x9A,0x42, + 0x07,0xAF,0x02,0xDA,0x6A,0x9B,0xF8,0x50,0x13,0x00,0x40,0x1C,0x84,0x45,0xF1,0xDA, + 0x49,0x1C,0xA9,0x42,0x00,0xE0,0x04,0xE0,0xD7,0xDD,0xA0,0x78,0x62,0x99,0x88,0x42, + 0x05,0xDD,0x64,0x98,0x40,0x1C,0xA8,0x42,0x64,0x90,0x00,0xDC,0x56,0xE7,0x06,0x98, + 0x41,0x1E,0x09,0x06,0x09,0x0E,0x00,0x28,0x06,0x91,0x00,0xD0,0xE3,0xE6,0x01,0x26, + 0x65,0x96,0x63,0x90,0x6F,0xE0,0x58,0xA8,0x80,0x5D,0x00,0x28,0x6A,0xD0,0x65,0x98, + 0x07,0x49,0x2F,0x18,0x0A,0x20,0x70,0x43,0x40,0x18,0x68,0x90,0xFF,0x30,0xFF,0x30, + 0x02,0x30,0x67,0x90,0x00,0x7E,0x70,0x99,0x40,0x5C,0x0D,0xE0,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20, + 0x1E,0x02,0x00,0x00,0x70,0x08,0x00,0x20,0x03,0x99,0x88,0x42,0x34,0xD2,0x08,0x2F, + 0x32,0xDC,0x4C,0x49,0x68,0x98,0x40,0x18,0x02,0xF0,0x5C,0xFC,0x00,0x28,0x2B,0xD0, + 0x67,0x98,0x70,0x99,0x00,0x7E,0x70,0x9A,0x47,0x4B,0x41,0x5C,0x49,0x1C,0x81,0x54, + 0x68,0x98,0x43,0x21,0xC9,0x00,0x41,0x18,0x0A,0x20,0x78,0x43,0xC0,0x18,0x66,0x90, + 0xFF,0x30,0x65,0x30,0x0A,0x22,0x03,0xF0,0xCB,0xFE,0x68,0x99,0x66,0x98,0xFF,0x31, + 0xC1,0x31,0x4A,0x79,0xFF,0x30,0x61,0x30,0xC2,0x72,0x89,0x79,0x01,0x73,0x67,0x98, + 0x5B,0xA9,0x00,0x7E,0xC8,0x55,0x71,0x99,0x47,0x54,0x65,0x98,0x40,0x1C,0x65,0x90, + 0x63,0x98,0x40,0x1C,0x63,0x90,0x15,0xE0,0x32,0x49,0x68,0x98,0x32,0x4F,0x40,0x18, + 0x02,0xF0,0x28,0xFC,0x00,0x28,0x0D,0xD0,0x72,0x99,0x01,0x20,0x08,0x74,0x67,0x98, + 0x80,0x7F,0x13,0x28,0x06,0xD9,0x60,0x78,0x01,0x28,0x03,0xD1,0xF8,0x88,0x04,0x21, + 0x08,0x43,0xF8,0x80,0x76,0x1C,0xA0,0x78,0xB0,0x42,0x8C,0xDA,0x26,0x48,0xC0,0x88, + 0x41,0x07,0x05,0xD5,0x02,0x99,0x04,0x22,0xE1,0x70,0x23,0x49,0x90,0x43,0xC8,0x80, + 0x01,0x26,0x31,0xE0,0x5B,0xA8,0x80,0x5D,0x00,0x28,0x1A,0xD1,0x13,0x22,0x01,0x20, + 0x52,0x01,0x05,0x23,0xDB,0x01,0x1C,0x49,0x09,0x18,0x8F,0x18,0xFF,0x7E,0x00,0x2F, + 0x0C,0xD1,0xC9,0x18,0x09,0x79,0x00,0x29,0x08,0xD1,0x02,0x06,0x31,0x06,0x12,0x0E, + 0x09,0x0E,0x01,0x23,0x5B,0xA8,0xFF,0xF7,0xAB,0xFA,0x02,0xE0,0x40,0x1C,0x09,0x28, + 0xE9,0xDB,0xE0,0x78,0x00,0x28,0x0E,0xD0,0x0A,0x20,0x70,0x43,0x0E,0x49,0x47,0x18, + 0x38,0x00,0xFF,0x30,0x6B,0x30,0x02,0xF0,0xDD,0xFB,0x00,0x28,0x03,0xD1,0x01,0x20, + 0xFF,0x37,0x61,0x37,0xB8,0x72,0x76,0x1C,0xAE,0x42,0xCB,0xDD,0x63,0x98,0x28,0x18, + 0x20,0x70,0x20,0x78,0x05,0x49,0x5A,0x22,0xA0,0x70,0x08,0x00,0xB4,0x30,0x03,0xF0, + 0x4F,0xFE,0xE7,0xE5,0x1E,0x02,0x00,0x00,0xF0,0x05,0x00,0x20,0x54,0x07,0x00,0x20, + 0xF1,0xB5,0x3C,0x48,0x86,0xB0,0x05,0x90,0x00,0x20,0x04,0x90,0x3A,0x48,0x41,0x7F, + 0x01,0x91,0x01,0x00,0x20,0x39,0x49,0x7F,0x00,0x91,0x00,0x21,0x02,0x91,0x01,0x7D, + 0x00,0x20,0xC0,0x43,0x00,0x29,0x06,0x99,0x03,0xD1,0x00,0x29,0x03,0xD1,0x01,0x20, + 0x01,0xE0,0x00,0x29,0xFB,0xD1,0x03,0x90,0x01,0xF0,0x5C,0xF9,0x01,0xF0,0x0A,0xFA, + 0x00,0x24,0x27,0x00,0x37,0xE0,0x00,0x26,0x30,0xE0,0x31,0x00,0x38,0x00,0x02,0xF0, + 0xB1,0xF8,0x00,0x28,0x28,0xD0,0x29,0x78,0x05,0x9A,0x79,0x43,0x89,0x19,0x89,0x00, + 0x51,0x58,0x09,0x05,0x09,0x0D,0x0D,0x1A,0x06,0x98,0x00,0x28,0x0D,0xD0,0x00,0x2D, + 0x1A,0xDA,0x03,0x9A,0x31,0x00,0x38,0x00,0x05,0xF0,0x4E,0xFB,0x40,0x1C,0x14,0xD1, + 0x00,0x98,0x28,0x18,0x10,0xD5,0x02,0x20,0x0D,0xE0,0x00,0x2D,0x0C,0xDD,0x03,0x9A, + 0x31,0x00,0x38,0x00,0x05,0xF0,0x40,0xFB,0x40,0x1C,0x06,0xD1,0x01,0x98,0x28,0x1A, + 0x00,0x28,0x01,0xDD,0x03,0x20,0x04,0x90,0x64,0x1C,0x76,0x1C,0x13,0x4D,0x28,0x78, + 0x86,0x42,0xCA,0xD3,0x7F,0x1C,0x12,0x48,0x00,0x78,0x87,0x42,0xC3,0xD3,0x10,0x48, + 0x0E,0x49,0x00,0x78,0x09,0x78,0x48,0x43,0xA0,0x42,0x04,0xD1,0x04,0x98,0x07,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x02,0x98,0x41,0x1C,0x02,0x91,0x01,0x21,0x49,0x02, + 0x88,0x42,0xA9,0xD9,0x06,0x98,0x00,0x28,0x01,0xD0,0x02,0x20,0x00,0xE0,0x03,0x20, + 0x04,0x90,0xEC,0xE7,0x00,0x02,0x10,0x40,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xF0,0xB5,0x8A,0x4A,0xFF,0xB0,0x88,0xB0,0x40,0x18,0x85,0x92, + 0x42,0x00,0x80,0x18,0x84,0x90,0x48,0x42,0x83,0x90,0x86,0x48,0x86,0x4E,0x00,0x7A, + 0x02,0xAF,0x82,0x90,0x85,0x48,0x86,0x90,0x00,0x7D,0x00,0x28,0x02,0xD1,0x83,0x98, + 0x40,0x42,0x83,0x90,0x01,0x22,0x52,0x02,0x00,0x21,0x30,0x00,0x03,0xF0,0xCC,0xFD, + 0x00,0x25,0x39,0xE0,0x00,0x24,0x32,0xE0,0x7C,0x48,0x20,0x38,0x01,0x7D,0xC9,0x07, + 0x15,0xD0,0x7B,0x49,0x09,0x78,0x00,0x29,0x82,0x99,0x16,0xD0,0x8D,0x42,0x0E,0xD1, + 0x81,0x7D,0xA1,0x42,0x0B,0xD0,0xC1,0x7D,0xA1,0x42,0x08,0xD0,0x01,0x7E,0xA1,0x42, + 0x05,0xD0,0x41,0x7E,0xA1,0x42,0x02,0xD0,0x80,0x7E,0xA0,0x42,0x16,0xD1,0x83,0x9A, + 0x21,0x00,0x28,0x00,0x05,0xF0,0xC8,0xFA,0x10,0xE0,0x8C,0x42,0xF7,0xD1,0x81,0x7D, + 0xA9,0x42,0xF4,0xD0,0xC1,0x7D,0xA9,0x42,0xF1,0xD0,0x01,0x7E,0xA9,0x42,0xEE,0xD0, + 0x41,0x7E,0xA9,0x42,0xEB,0xD0,0x80,0x7E,0xA8,0x42,0xE8,0xD0,0x64,0x1C,0x65,0x48, + 0x00,0x78,0x84,0x42,0xC8,0xD3,0x6D,0x1C,0x63,0x4C,0x20,0x78,0x85,0x42,0xC1,0xD3, + 0x01,0xF0,0x98,0xF8,0x01,0xF0,0x46,0xF9,0x00,0x25,0x2A,0xE0,0x00,0x24,0x23,0xE0, + 0x21,0x00,0x28,0x00,0x01,0xF0,0xEE,0xFF,0x00,0x28,0x12,0xD0,0x59,0x49,0x85,0x9B, + 0x09,0x78,0x69,0x43,0x0A,0x19,0x91,0x00,0x59,0x58,0x03,0x04,0x09,0x05,0x09,0x0D, + 0x1B,0x0C,0xCB,0x1A,0x00,0x2B,0x01,0xDD,0x08,0x1A,0x00,0xE0,0x40,0x1A,0x51,0x00, + 0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x5B,0xF8,0x4E,0x49,0x09,0x78,0x69,0x43, + 0x09,0x19,0x49,0x00,0x64,0x1C,0x78,0x52,0x4A,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3, + 0x6D,0x1C,0x49,0x48,0x01,0x78,0x8D,0x42,0xD0,0xD3,0x00,0x21,0x01,0x91,0x01,0xF0, + 0x11,0xF9,0x00,0x25,0x51,0xE0,0x00,0x24,0x4A,0xE0,0x21,0x00,0x28,0x00,0x01,0xF0, + 0xB9,0xFF,0x00,0x28,0x43,0xD0,0x3F,0x49,0x85,0x9B,0x09,0x78,0x69,0x43,0x09,0x19, + 0x8A,0x00,0x9A,0x58,0x03,0x04,0x12,0x05,0x12,0x0D,0x1B,0x0C,0xD3,0x1A,0x00,0x2B, + 0x01,0xDD,0x10,0x1A,0x00,0xE0,0x80,0x1A,0x49,0x00,0x73,0x5A,0x00,0x04,0x00,0x0C, + 0x83,0x42,0x0A,0xD9,0x70,0x52,0x21,0x00,0x28,0x00,0x02,0xF0,0x21,0xF8,0x31,0x49, + 0x09,0x78,0x69,0x43,0x09,0x19,0x49,0x00,0x78,0x52,0x01,0x98,0x03,0x21,0xFF,0xF7, + 0x79,0xF8,0x00,0x29,0x01,0xD0,0x02,0x29,0x0D,0xD1,0x86,0x98,0x00,0x7D,0x00,0x28, + 0x02,0xD1,0x00,0x22,0x43,0x1E,0x01,0xE0,0x01,0x22,0x00,0x23,0x21,0x00,0x28,0x00, + 0x05,0xF0,0x04,0xFA,0x0B,0xE0,0x00,0x22,0xD2,0x43,0x00,0x23,0x21,0x00,0x28,0x00, + 0x05,0xF0,0xFC,0xF9,0x00,0x28,0x02,0xD1,0x00,0x22,0x01,0x23,0xEE,0xE7,0x64,0x1C, + 0x1C,0x48,0x00,0x78,0x84,0x42,0xB0,0xD3,0x6D,0x1C,0x1B,0x48,0x00,0x78,0x85,0x42, + 0xA9,0xD3,0x01,0x98,0x40,0x1C,0x01,0x90,0x84,0x98,0x40,0x1E,0x84,0x90,0x1B,0xD2, + 0x14,0x4E,0x00,0x25,0x0E,0xE0,0x00,0x24,0x08,0xE0,0x68,0x43,0x00,0x19,0x40,0x00, + 0x3A,0x5A,0x21,0x00,0x28,0x00,0x05,0xF0,0xF9,0xF9,0x64,0x1C,0x30,0x78,0x84,0x42, + 0xF3,0xD3,0x6D,0x1C,0x0C,0x48,0x00,0x78,0x85,0x42,0xEC,0xD3,0x7F,0xB0,0x08,0xB0, + 0xF0,0xBC,0x08,0xBC,0x00,0x20,0x18,0x47,0x00,0xF0,0xE4,0xFF,0x7F,0xE7,0x00,0x00, + 0x00,0x02,0x10,0x40,0x70,0x0A,0x00,0x20,0x40,0x00,0x00,0x20,0x20,0x78,0x00,0x00, + 0xFD,0x0A,0x00,0x20,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF8,0xB5,0x01,0x22, + 0x52,0x07,0x10,0x68,0x01,0x28,0x03,0xD0,0x10,0x68,0x01,0x28,0x43,0xD9,0x02,0x20, + 0x86,0x46,0x22,0x48,0x00,0x90,0x80,0x7A,0x00,0x28,0x3C,0xD0,0x00,0x21,0x13,0x25, + 0x1F,0x4F,0xAD,0x01,0x32,0xE0,0x72,0x46,0x8A,0x18,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x28,0xD1,0x00,0x9C,0x93,0x00,0xA6,0x7A,0x1B,0x0F, + 0x21,0xE0,0x84,0x00,0xE4,0x19,0x64,0x19,0xE4,0x68,0xA4,0x00,0x24,0x0F,0xA3,0x42, + 0x18,0xD1,0x80,0x00,0xC0,0x19,0x40,0x19,0xC0,0x68,0x92,0x0A,0x83,0x05,0x92,0x02, + 0x9B,0x0D,0x1A,0x43,0x0F,0x4B,0x1A,0x40,0x83,0x01,0x9B,0x0D,0x1B,0x04,0x1A,0x43, + 0x3F,0x23,0x9B,0x02,0x00,0x04,0x80,0x0E,0x9A,0x43,0x80,0x02,0x02,0x43,0x60,0x46, + 0x02,0x60,0x02,0xE0,0x40,0x1C,0x86,0x42,0xDB,0xD8,0x49,0x1C,0x01,0x20,0x40,0x07, + 0x02,0x68,0x8A,0x42,0xC7,0xD8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xFF,0xFF,0x00,0xFC,0xFC,0xB5,0x04,0x00,0x5E,0x48,0x8E,0x46, + 0x02,0x8C,0x5E,0x49,0x40,0x8C,0x01,0x91,0xCB,0x88,0x40,0x39,0x00,0x91,0x89,0x7E, + 0x00,0x25,0x2F,0x00,0xC9,0x07,0x01,0x26,0x00,0x29,0xAC,0x46,0x01,0xD1,0xE6,0x71, + 0xA6,0xE0,0x01,0x99,0x09,0x79,0x00,0x29,0x0D,0xD0,0x01,0x29,0x0F,0xD0,0x02,0x29, + 0x07,0xD0,0x03,0x29,0xF4,0xD1,0x17,0x00,0xD1,0x18,0x0A,0x04,0x12,0x0C,0x03,0x00, + 0x05,0xE0,0x1A,0x00,0xFB,0xE7,0x84,0x46,0xC0,0x18,0x03,0x04,0x1B,0x0C,0x60,0x88, + 0xA1,0x88,0x87,0x42,0x58,0xDC,0x82,0x42,0x56,0xDB,0x8C,0x45,0x54,0xDC,0x8B,0x42, + 0x52,0xDB,0x01,0x25,0x72,0x46,0x00,0x2A,0x77,0xD0,0x06,0x27,0x01,0x2A,0x0E,0xD0, + 0x09,0x23,0x02,0x2A,0x17,0xD0,0x03,0x2A,0x71,0xD1,0xE2,0x79,0xD7,0x07,0x28,0xD0, + 0x01,0x2A,0x01,0xD0,0x05,0x2A,0x22,0xD1,0x00,0x25,0xE3,0x71,0x67,0xE0,0x00,0x9A, + 0x92,0x7D,0x00,0x2A,0x63,0xD1,0x00,0xF0,0x87,0xF8,0x06,0x00,0x0F,0xD1,0x02,0x20, + 0xE0,0x71,0x26,0x72,0x5B,0xE0,0xE2,0x79,0xD6,0x07,0xE9,0xD1,0x92,0x07,0x56,0xD5, + 0x00,0xF0,0x7A,0xF8,0x06,0x00,0x08,0xD0,0x20,0x7A,0x00,0x28,0x05,0xD1,0x31,0x00, + 0x20,0x00,0xE7,0x71,0xFE,0xF7,0xE2,0xFF,0xEB,0xE7,0x02,0x20,0x46,0xE0,0x11,0x20, + 0x44,0xE0,0x92,0x07,0x43,0xD5,0x00,0xF0,0x67,0xF8,0x21,0x7A,0x00,0x28,0x0A,0xD0, + 0x00,0x29,0x0C,0xD0,0x81,0x42,0x08,0xD1,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0xCD,0xFF,0xA6,0x71,0x05,0xE0,0x00,0x29,0x01,0xD0,0x12,0x20,0xF5,0xE7,0x02,0x20, + 0xE0,0x71,0x00,0x20,0x20,0x72,0x2A,0xE0,0x70,0x46,0x00,0x28,0x25,0xD0,0x01,0x28, + 0x06,0xD0,0x02,0x28,0x06,0xD0,0x03,0x28,0x21,0xD1,0xE0,0x79,0x80,0x07,0x0E,0xD4, + 0xE6,0x71,0x1C,0xE0,0xE0,0x79,0x80,0x07,0xFA,0xD5,0x21,0x7A,0x00,0x29,0x04,0xD0, + 0x12,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7,0xA9,0xFF,0xE6,0x71,0x09,0xE0,0x02,0x20, + 0xE0,0x71,0x21,0x7A,0x00,0x29,0x04,0xD0,0x0A,0x20,0xE0,0x71,0x20,0x00,0xFE,0xF7, + 0x9D,0xFF,0x01,0x25,0xA6,0x71,0x02,0xE0,0xFF,0xE7,0x00,0x20,0xE0,0x71,0x08,0x49, + 0xC8,0x88,0x82,0x07,0x04,0xD1,0xE2,0x79,0x92,0x07,0x92,0x0F,0x10,0x43,0xC8,0x80, + 0x28,0x00,0xFC,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x06,0x48,0x40,0x8B,0x00,0x28,0x06,0xD0,0x05,0x48,0xC0,0x88, + 0x00,0x06,0x80,0x0F,0x01,0xD0,0x00,0x20,0x70,0x47,0x01,0x20,0x70,0x47,0x00,0x00, + 0xA0,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0xB4,0x18,0x4B,0x05,0x00,0xDE,0x7E, + 0x00,0x22,0x10,0x00,0x00,0x2E,0x26,0xD0,0x1B,0x7D,0x00,0x2B,0x23,0xD1,0x20,0xE0, + 0x13,0x4B,0xD4,0x00,0xE3,0x18,0x11,0x24,0xA4,0x01,0x1C,0x19,0x1C,0x27,0xE7,0x5F, + 0xAF,0x42,0x11,0xDC,0x23,0x27,0x7F,0x01,0xDB,0x19,0x00,0x27,0xDF,0x5F,0xAF,0x42, + 0x0A,0xDB,0x1E,0x27,0xE7,0x5F,0x8F,0x42,0x06,0xDC,0x02,0x24,0x1C,0x5F,0x8C,0x42, + 0x02,0xDB,0x50,0x1C,0x00,0x06,0x00,0x0E,0x00,0x28,0x04,0xD1,0x52,0x1C,0x12,0x06, + 0x12,0x0E,0x96,0x42,0xDC,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF0,0xB5,0x00,0x20,0x8F,0xB0,0x0A,0x90,0x09,0x90,0xC7,0x48, + 0xC7,0x4A,0x01,0x8A,0xD0,0x88,0x43,0x06,0x02,0xD4,0xC4,0x49,0xC0,0x39,0x89,0x89, + 0xC2,0x4C,0xC4,0x4E,0x60,0x34,0x08,0x91,0xE1,0x7B,0x43,0x06,0x00,0xD4,0xF1,0x7A, + 0x43,0x06,0x07,0x91,0xA1,0x7B,0x00,0xD4,0xB1,0x7A,0x43,0x06,0x06,0x91,0x61,0x7C, + 0x00,0xD4,0x71,0x7B,0x43,0x06,0x05,0x91,0xA1,0x79,0x00,0xD4,0xB1,0x78,0x02,0x07, + 0x04,0x91,0xB7,0x49,0x09,0x79,0x05,0xD5,0xB5,0x4A,0x00,0x29,0x02,0xD1,0x08,0x23, + 0x98,0x43,0xD0,0x80,0xB4,0x48,0x18,0x22,0x82,0x5E,0xFF,0x23,0x01,0x33,0x28,0x2A, + 0x03,0xDD,0x1A,0x22,0x82,0x5E,0x1E,0x2A,0x03,0xDC,0x1C,0x22,0x82,0x5E,0x28,0x2A, + 0x05,0xDD,0xAB,0x4D,0xEA,0x88,0x1A,0x43,0xEA,0x80,0x00,0x22,0x04,0xE0,0x1E,0x22, + 0x82,0x5E,0x00,0x2A,0x02,0xD0,0x52,0x1E,0xC2,0x83,0x03,0xE0,0xA4,0x4A,0xD0,0x88, + 0x98,0x43,0xD0,0x80,0x08,0x98,0x80,0x04,0x78,0xD5,0xA3,0x4A,0x00,0x20,0x20,0x32, + 0x52,0x78,0x00,0x2A,0x02,0xD1,0x00,0x29,0x00,0xD1,0x01,0x20,0x00,0x90,0x00,0xF0, + 0x41,0xF9,0x9B,0x48,0x9D,0x4D,0x00,0x79,0x01,0x28,0x0E,0x90,0x68,0xD1,0x98,0x4B, + 0x19,0x89,0x0D,0x91,0xDF,0x88,0x62,0x89,0x7B,0x06,0x00,0xD4,0xF2,0x88,0x91,0x42, + 0x00,0xD3,0x00,0x20,0x03,0x90,0x0D,0x98,0x0A,0x22,0x0E,0x21,0x50,0x43,0x69,0x5E, + 0x0C,0x91,0xFE,0xF7,0x65,0xFD,0x21,0x78,0x91,0x4B,0x7A,0x06,0x0B,0x93,0x00,0xD4, + 0x19,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x02,0x90,0x0C,0x99, + 0x0D,0x98,0x40,0x1A,0x0A,0x21,0xFE,0xF7,0x53,0xFD,0x61,0x78,0x7A,0x06,0x01,0xD4, + 0x0B,0x99,0x49,0x7F,0x88,0x42,0x01,0xDA,0x01,0x20,0x00,0xE0,0x00,0x20,0x01,0x90, + 0x2A,0x89,0xA1,0x78,0x01,0x20,0x7B,0x06,0x01,0xD4,0x0B,0x99,0x89,0x7F,0x8A,0x42, + 0x00,0xD8,0x00,0x20,0xE1,0x78,0x84,0x46,0x2A,0x69,0x01,0x20,0x7B,0x06,0x01,0xD4, + 0x0B,0x99,0xC9,0x7F,0x8A,0x42,0x00,0xDB,0x00,0x20,0x03,0x99,0x00,0x29,0x1F,0xD0, + 0x02,0x99,0x00,0x29,0x1C,0xD0,0x01,0x99,0x00,0x29,0x19,0xD0,0x61,0x46,0x00,0x29, + 0x16,0xD0,0x71,0x4A,0x01,0x21,0x80,0x3A,0x52,0x68,0x00,0x2A,0x00,0xD0,0x00,0x21, + 0x01,0x42,0x0D,0xD0,0x68,0x7B,0x00,0x28,0x24,0xD0,0x61,0x7A,0x7A,0x06,0x00,0xD4, + 0x71,0x79,0x88,0x42,0x1E,0xD8,0x40,0x1E,0x68,0x73,0x1B,0xE0,0x36,0xE0,0xFF,0xE7, + 0x63,0x48,0x21,0x79,0xC0,0x88,0x2A,0x69,0x43,0x06,0x00,0xD4,0x31,0x78,0x8A,0x42, + 0x10,0xDB,0x0E,0x99,0x00,0x29,0x0D,0xD0,0xC1,0x06,0x0B,0xD4,0x69,0x7B,0xE2,0x79, + 0x40,0x06,0x00,0xD4,0xF2,0x78,0x91,0x42,0x04,0xD2,0x04,0x98,0x81,0x42,0x01,0xD9, + 0x49,0x1C,0x69,0x73,0x68,0x7B,0x04,0x99,0x10,0x22,0x88,0x42,0x0D,0xD8,0x00,0x98, + 0x00,0x28,0x0A,0xD1,0x52,0x49,0xC8,0x88,0x10,0x43,0xC8,0x80,0xC9,0x88,0x20,0x7A, + 0x49,0x06,0x00,0xD4,0x30,0x79,0x28,0x73,0x08,0xE0,0x4D,0x4B,0xD9,0x88,0xC8,0x06, + 0x04,0xD5,0x28,0x7B,0x00,0x28,0x10,0xD1,0x91,0x43,0xD9,0x80,0x48,0x4F,0x38,0x79, + 0x00,0x28,0x7E,0xD0,0xF8,0x88,0x80,0x06,0x05,0xD5,0x05,0x99,0x06,0x98,0x40,0x1A, + 0x00,0x06,0x00,0x0E,0x06,0x90,0x01,0x22,0x01,0xE0,0x40,0x1E,0xE3,0xE7,0x50,0x00, + 0xC0,0x19,0x84,0x46,0xFF,0x30,0x41,0x30,0xC0,0x88,0x00,0x28,0x65,0xD0,0x07,0x99, + 0x88,0x42,0x09,0xD9,0x08,0x98,0x80,0x07,0x5F,0xD5,0x00,0x20,0x38,0x71,0xF8,0x88, + 0x08,0x21,0x08,0x43,0xF8,0x80,0x58,0xE0,0x06,0x99,0x88,0x42,0x55,0xD3,0x08,0x98, + 0x40,0x07,0x52,0xD5,0x00,0x24,0x01,0x20,0x27,0xE0,0xFF,0x23,0x39,0x18,0x3E,0x33, + 0x5B,0x5C,0x93,0x42,0x20,0xD1,0x64,0x1C,0xFF,0x31,0x01,0x31,0x09,0x7C,0x0A,0x91, + 0x01,0x00,0x12,0xE0,0x4B,0x00,0xDD,0x19,0x2B,0x00,0xC0,0x33,0xDE,0x89,0xE0,0x35, + 0x9E,0x81,0x2D,0x88,0xDD,0x83,0x7B,0x18,0xDD,0x1D,0xF9,0x35,0x6E,0x7C,0xFF,0x33, + 0x21,0x33,0x2E,0x74,0x9E,0x7F,0x49,0x1C,0x5E,0x77,0x3B,0x79,0x8B,0x42,0xE9,0xDA, + 0x39,0x79,0x49,0x1E,0x40,0x1E,0x39,0x71,0x40,0x1C,0x39,0x79,0x81,0x42,0xD4,0xDA, + 0x00,0x2C,0x22,0xDD,0x01,0x2C,0x05,0xDD,0x01,0x20,0x09,0x90,0xF8,0x88,0x20,0x21, + 0x08,0x43,0xF8,0x80,0x60,0x46,0xFF,0x30,0x01,0x30,0xC1,0x8B,0x38,0x79,0x40,0x1C, + 0x00,0x06,0x00,0x0E,0x38,0x71,0x40,0x00,0xC0,0x19,0xC0,0x30,0x81,0x81,0x60,0x46, + 0xFF,0x30,0x21,0x30,0xC1,0x89,0x38,0x79,0x40,0x00,0xC0,0x19,0xC0,0x30,0xC1,0x83, + 0x3B,0x79,0x0D,0x48,0x0A,0x99,0x30,0x38,0x19,0x54,0x52,0x1C,0x08,0x2A,0x8E,0xDB, + 0x00,0xE0,0x06,0xE0,0x09,0x98,0x00,0x28,0x03,0xD1,0xF8,0x88,0x20,0x21,0x88,0x43, + 0xF8,0x80,0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x07,0x00,0x20,0x30,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0xF0,0xB5,0x70,0x48,0xB1,0xB0,0x00,0x78,0x71,0x4B,0x70,0x4A, + 0x01,0x90,0x6E,0x48,0x00,0x78,0x00,0x90,0xD9,0x88,0x16,0x7D,0x6E,0x48,0x4C,0x06, + 0x00,0xD4,0x06,0x7C,0x55,0x7D,0x49,0x06,0x00,0xD4,0x45,0x7C,0x6B,0x48,0x00,0x21, + 0x2B,0x95,0x30,0x90,0xC1,0x81,0x50,0x22,0x16,0xA8,0x2A,0x91,0x03,0xF0,0x9C,0xF9, + 0x01,0x99,0x2B,0x98,0x2B,0x9D,0x08,0x1A,0xAD,0x1C,0x2F,0x90,0x80,0x1C,0x2E,0x90, + 0x35,0xE0,0x00,0x98,0x16,0xA9,0x80,0x1B,0x80,0x1C,0x86,0x46,0x2B,0x98,0xB4,0x1C, + 0x28,0x1A,0x80,0x00,0x47,0x18,0x40,0x3F,0x1E,0xE0,0x01,0x98,0x5C,0x49,0x00,0x1D, + 0x60,0x43,0x40,0x19,0x00,0x04,0x00,0x14,0x40,0x00,0x0A,0x5E,0x55,0x4B,0x68,0x00, + 0xC0,0x18,0x94,0x21,0x41,0x5E,0x60,0x00,0xC3,0x18,0x6C,0x20,0x18,0x5E,0x2A,0x9B, + 0x94,0x46,0xC3,0x18,0x52,0x18,0xD2,0x18,0x2A,0x92,0xBB,0x6B,0x62,0x46,0x9A,0x18, + 0x08,0x18,0x10,0x18,0x64,0x1C,0xB8,0x63,0xA6,0x45,0xDE,0xDC,0x00,0x98,0x71,0x00, + 0x41,0x1A,0xB8,0x6B,0xFE,0xF7,0xE4,0xFB,0xB8,0x63,0x2E,0x98,0x6D,0x1C,0xA8,0x42, + 0xC7,0xDC,0x00,0x99,0x70,0x00,0x09,0x1A,0x2B,0x98,0x2D,0x91,0x42,0x00,0x01,0x98, + 0x80,0x1A,0x41,0x43,0x2C,0x90,0x2A,0x98,0xFE,0xF7,0xD2,0xFB,0x30,0x99,0x50,0x22, + 0xC8,0x81,0x00,0x20,0x01,0x00,0x2A,0x90,0x02,0xA8,0x03,0xF0,0x45,0xF9,0x2B,0x9C, + 0xA4,0x1C,0x35,0xE0,0x00,0x99,0x02,0xAA,0x89,0x1B,0x89,0x1C,0x8E,0x46,0x2B,0x99, + 0xB0,0x1C,0x61,0x1A,0x89,0x00,0x8D,0x18,0x40,0x3D,0x8C,0x46,0x1C,0xE0,0x01,0x99, + 0x33,0x4A,0x09,0x1D,0x41,0x43,0x09,0x19,0x49,0x00,0x51,0x5E,0x16,0xAA,0x62,0x44, + 0x40,0x3A,0x92,0x6B,0x2B,0x4F,0x89,0x1A,0x62,0x00,0xD3,0x19,0x94,0x22,0x9A,0x5E, + 0x43,0x00,0xDB,0x19,0x6C,0x27,0xDF,0x5F,0xD2,0x19,0x89,0x18,0x0B,0x00,0x4B,0x43, + 0xAA,0x6B,0xD1,0x18,0x40,0x1C,0xA9,0x63,0x86,0x45,0xE0,0xDC,0x2D,0x99,0xA8,0x6B, + 0x49,0x1E,0xFE,0xF7,0x95,0xFB,0xA8,0x63,0x2A,0x99,0x40,0x18,0x64,0x1C,0x2A,0x90, + 0x2E,0x98,0xA0,0x42,0xC6,0xDC,0x2C,0x99,0x2A,0x98,0xFE,0xF7,0x89,0xFB,0x30,0x99, + 0x00,0x22,0x0A,0x61,0x11,0x00,0x02,0xAB,0x0A,0xE0,0x8A,0x00,0x9A,0x58,0x82,0x1A, + 0x14,0x00,0x54,0x43,0x30,0x9A,0x12,0x69,0xA2,0x18,0x30,0x9C,0x49,0x1C,0x22,0x61, + 0x2C,0x9A,0x8A,0x42,0xF1,0xDC,0x30,0x98,0x51,0x1E,0x00,0x69,0xFE,0xF7,0x70,0xFB, + 0x00,0x9A,0x2F,0x99,0x92,0x1B,0x92,0x02,0x51,0x43,0xFE,0xF7,0x69,0xFB,0x30,0x99, + 0x08,0x61,0x30,0x99,0x0E,0x20,0x08,0x5E,0x00,0x28,0x01,0xD1,0x40,0x1C,0xC8,0x81, + 0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x40,0x79,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xC8,0x02,0x00,0x20,0xF8,0xB5,0x61,0x4D,0x28,0x7A,0x00,0x28,0x06,0xD0,0x28,0x6B, + 0x00,0x04,0x00,0x0C,0x05,0xF0,0x5A,0xF8,0x05,0xF0,0x48,0xF8,0x01,0x24,0x64,0x03, + 0x20,0x00,0xFE,0xF7,0x55,0xFF,0x04,0xF0,0x23,0xFC,0x20,0x00,0xFE,0xF7,0x48,0xFF, + 0x57,0x4C,0x00,0x26,0x9C,0xE0,0x57,0x48,0x41,0x68,0x09,0x07,0x07,0xD5,0xC0,0x68, + 0x00,0x28,0x04,0xD0,0x53,0x48,0xC1,0x68,0xC0,0x03,0xC1,0x63,0x95,0xE0,0x28,0x7A, + 0x00,0x28,0x04,0xD0,0x28,0x6B,0x00,0x04,0x00,0x0C,0x05,0xF0,0x37,0xF8,0xFF,0x20, + 0x81,0x30,0xFE,0xF7,0x35,0xFF,0x03,0x20,0x04,0xF0,0x6E,0xFF,0x03,0xF0,0xF0,0xFE, + 0x49,0x4F,0xF8,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06,0x01,0xD5, + 0x04,0x20,0x00,0xE0,0x02,0x20,0x04,0xF0,0x3B,0xFE,0x00,0xF0,0xCD,0xFB,0x04,0xF0, + 0x15,0xFC,0x00,0xF0,0x97,0xFB,0x00,0xF0,0x45,0xFC,0x68,0x7B,0x00,0x28,0x04,0xD1, + 0x20,0x7B,0x00,0x28,0x01,0xD0,0x03,0xF0,0xDF,0xFE,0x20,0x7A,0x00,0x28,0x01,0xD0, + 0x03,0xF0,0x80,0xF8,0x01,0x20,0x40,0x05,0x00,0xF0,0x6A,0xFB,0x03,0xF0,0x96,0xF8, + 0x00,0x28,0x01,0xD0,0x01,0x20,0x28,0x70,0x00,0x20,0x00,0xF0,0x61,0xFB,0x28,0x78, + 0x00,0x28,0x04,0xD1,0x00,0x22,0x11,0x00,0x10,0x00,0x00,0xF0,0x57,0xF9,0x03,0xF0, + 0xAB,0xFE,0x28,0x78,0x00,0x28,0x04,0xD0,0x68,0x7B,0x00,0x09,0x04,0x28,0x44,0xD1, + 0x2E,0x70,0x03,0x20,0x04,0xF0,0x02,0xFF,0xE8,0x62,0x03,0x20,0x04,0xF0,0x30,0xFF, + 0xFF,0x20,0x81,0x30,0xFE,0xF7,0xDC,0xFE,0xF8,0x8B,0x00,0x28,0x02,0xD0,0x40,0x1E, + 0xF8,0x83,0x2D,0xE0,0xFF,0xF7,0x9E,0xFC,0x00,0x28,0x29,0xD0,0x6F,0x6A,0x00,0x2F, + 0x26,0xD0,0xE8,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x1C,0x49,0xFE,0xF7,0x92,0xFB, + 0x38,0x1A,0x14,0x28,0x1C,0xDD,0x04,0xF0,0xD7,0xFF,0x04,0xF0,0xDB,0xFF,0xA8,0x79, + 0x00,0x28,0x0D,0xD0,0x03,0xF0,0x56,0xFE,0x03,0xF0,0x59,0xFE,0x03,0xF0,0x61,0xFE, + 0x13,0x4D,0x01,0x20,0x68,0x60,0xFE,0xF7,0xC3,0xFE,0x12,0x48,0x68,0x60,0x03,0xE0, + 0x11,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x04,0xF0,0xCB,0xFF,0x0E,0x48,0x06,0x70, + 0x06,0x4D,0x28,0x78,0x00,0x28,0x00,0xD1,0x5D,0xE7,0x04,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x9B,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0xF8,0x0A,0x00,0x20, + 0x80,0x78,0x00,0x00,0x00,0x40,0x00,0x30,0xF0,0x05,0x00,0x20,0x10,0x27,0x00,0x00, + 0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00,0xAC,0x0B,0x00,0x20,0x10,0xB4,0x0F,0x4B, + 0x00,0x22,0xD2,0x43,0x81,0x00,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x0B,0x4B,0x0B,0x4C, + 0x24,0x33,0x5A,0x52,0xCB,0x18,0x5A,0x80,0x00,0x23,0x42,0x00,0x1C,0x3C,0xA3,0x52, + 0x22,0x00,0x12,0x32,0x13,0x54,0x18,0x00,0x52,0x32,0x8A,0x18,0x81,0x00,0x53,0x52, + 0x51,0x18,0x40,0x1E,0x4B,0x80,0xF9,0xD5,0x10,0xBC,0x70,0x47,0xCA,0x0B,0x00,0x20, + 0x10,0xB5,0x0C,0x48,0x09,0x22,0x00,0x21,0x02,0xF0,0xCE,0xFF,0x0A,0x48,0x5A,0x22, + 0x00,0x21,0x02,0xF0,0xC9,0xFF,0x08,0x48,0x00,0x24,0x00,0x1F,0x04,0x70,0x07,0x48, + 0x28,0x22,0x21,0x00,0x02,0xF0,0xC0,0xFF,0x04,0x48,0x4E,0x38,0x44,0x75,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x6B,0x08,0x00,0x20,0x54,0x07,0x00,0x20,0x7E,0x0A,0x00,0x20, + 0x10,0xB5,0x17,0x48,0x12,0x22,0x00,0x21,0x02,0xF0,0xAE,0xFF,0x14,0x48,0x12,0x22, + 0x00,0x21,0x12,0x30,0x02,0xF0,0xA8,0xFF,0x11,0x48,0x09,0x22,0x00,0x21,0x44,0x30, + 0x02,0xF0,0xA2,0xFF,0x0E,0x48,0x20,0x22,0x00,0x21,0x24,0x30,0x02,0xF0,0x9C,0xFF, + 0x0B,0x48,0x10,0x22,0x00,0x21,0x52,0x30,0x02,0xF0,0x96,0xFF,0x08,0x48,0x10,0x22, + 0x00,0x21,0x62,0x30,0x02,0xF0,0x90,0xFF,0x05,0x49,0x00,0x20,0x74,0x31,0xC8,0x82, + 0xFF,0x39,0x41,0x39,0x08,0x71,0x88,0x83,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xBC,0x06,0x00,0x20,0xF0,0xB4,0x1E,0x49,0x1E,0x4E,0x8F,0x7B,0xF1,0x88,0x49,0x06, + 0x02,0xD4,0x1B,0x49,0xC0,0x39,0x8F,0x7A,0x08,0x21,0x00,0x24,0x42,0x00,0x0B,0x01, + 0x9B,0x19,0x15,0x25,0x9B,0x18,0x6D,0x01,0x5D,0x19,0xEC,0x82,0x0D,0x25,0xAD,0x01, + 0x5B,0x19,0x49,0x1E,0xDC,0x80,0xF2,0xD5,0x15,0x25,0x31,0x18,0x6D,0x01,0x01,0x23, + 0x4D,0x19,0xAB,0x73,0x0F,0x25,0x93,0x19,0xAD,0x01,0x5B,0x19,0xDC,0x82,0x1F,0x23, + 0x5B,0x01,0xC9,0x18,0x8F,0x71,0x8C,0x73,0x02,0x21,0x0D,0x01,0xAD,0x19,0xAD,0x18, + 0xED,0x18,0x49,0x1E,0xEC,0x82,0xF8,0xD5,0x80,0x00,0x82,0x19,0x00,0x21,0x21,0x20, + 0xC9,0x43,0x40,0x01,0x10,0x18,0xC1,0x80,0x01,0x81,0xF0,0xBC,0x70,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x10,0xB5,0x04,0x48,0x20,0x22,0x00,0x21, + 0x02,0xF0,0x3A,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7E,0x08,0x00,0x20, + 0x10,0xB5,0x04,0xF0,0x43,0xFE,0x03,0xF0,0xDD,0xFD,0xFF,0xF7,0x59,0xFF,0x03,0xF0, + 0x2B,0xFF,0x01,0xF0,0x57,0xFD,0x01,0xF0,0xD1,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x10,0xB4,0x0D,0x4C,0x0B,0x4B,0xE4,0x88,0x1B,0x7F,0x64,0x06,0x02,0xD4,0x09,0x4B, + 0xC0,0x3B,0x1B,0x7E,0x04,0x1E,0x00,0xDC,0x44,0x42,0x9C,0x42,0x06,0xDD,0x98,0x42, + 0x01,0xDD,0xC8,0x1A,0x00,0xE0,0xC8,0x18,0x02,0x04,0x12,0x0C,0x10,0xBC,0x10,0x00, + 0x70,0x47,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xF7,0xB5,0x62,0x48, + 0xCA,0xB0,0x00,0x7D,0x00,0x28,0x03,0xD0,0x01,0x20,0x47,0x90,0x00,0x20,0x02,0xE0, + 0x00,0x20,0x47,0x90,0x01,0x20,0x46,0x90,0x5C,0x48,0x00,0x26,0x49,0x90,0x5C,0x48, + 0x35,0x00,0x01,0x8B,0x04,0x91,0x41,0x8B,0x03,0x91,0x81,0x8A,0x02,0x91,0xC1,0x8A, + 0x01,0x91,0x80,0x8B,0x45,0x90,0x57,0x48,0x00,0x7A,0x48,0x96,0x00,0x90,0x6B,0xE0, + 0x00,0x24,0x64,0xE0,0x68,0x43,0x07,0x19,0x21,0x00,0x28,0x00,0x01,0xF0,0x52,0xF9, + 0x4D,0x49,0x20,0x39,0x0A,0x7D,0xD2,0x07,0x2D,0xD0,0x4F,0x4A,0x52,0x79,0x00,0x2A, + 0x00,0x9A,0x11,0xD0,0x95,0x42,0x26,0xD1,0x8A,0x7D,0xA2,0x42,0x1D,0xD0,0xCA,0x7D, + 0xA2,0x42,0x1A,0xD0,0x0A,0x7E,0xA2,0x42,0x17,0xD0,0x4A,0x7E,0xA2,0x42,0x14,0xD0, + 0x89,0x7E,0xA1,0x42,0x42,0xD1,0x10,0xE0,0x94,0x42,0x14,0xD1,0x8A,0x7D,0xAA,0x42, + 0x0B,0xD0,0xCA,0x7D,0xAA,0x42,0x08,0xD0,0x0A,0x7E,0xAA,0x42,0x05,0xD0,0x4A,0x7E, + 0xAA,0x42,0x02,0xD0,0x89,0x7E,0xA9,0x42,0x30,0xD1,0x04,0x99,0x03,0x9A,0x41,0x18, + 0x09,0x04,0x09,0x0C,0x04,0xE0,0x02,0x99,0x01,0x9A,0x41,0x18,0x09,0x04,0x09,0x0C, + 0x80,0x1A,0x49,0x9B,0x02,0x04,0xB8,0x00,0x18,0x58,0x4B,0x9B,0x12,0x0C,0x00,0x2B, + 0x02,0xD0,0x00,0x05,0x00,0x0D,0x01,0xE0,0x00,0x01,0x00,0x0D,0x4A,0x9B,0x05,0x2B, + 0x0E,0xD8,0x90,0x42,0x01,0xDA,0x47,0x9A,0x02,0xE0,0x88,0x42,0x0E,0xDD,0x46,0x9A, + 0x21,0x00,0x28,0x00,0x00,0xF0,0x80,0xF8,0x05,0xA8,0x87,0x55,0x76,0x1C,0x05,0xE0, + 0x48,0x99,0x05,0xA8,0x47,0x54,0x48,0x98,0x40,0x1C,0x48,0x90,0x64,0x1C,0x22,0x49, + 0xC8,0x78,0x84,0x42,0x96,0xDB,0x6D,0x1C,0x1F,0x48,0x01,0x79,0x8D,0x42,0x8F,0xDB, + 0x4A,0x98,0x05,0x28,0x03,0xD9,0x00,0x04,0x48,0x9E,0x00,0x0C,0x45,0x90,0x00,0x2E, + 0x25,0xDD,0x4C,0x98,0x00,0x28,0x22,0xD1,0x00,0xF0,0x5A,0xF9,0x00,0xF0,0x7A,0xF9, + 0x00,0xF0,0x28,0xFA,0x76,0x1E,0x14,0xD4,0x14,0x4C,0x05,0xAB,0x98,0x5D,0x82,0x00, + 0x49,0x98,0x80,0x58,0x01,0x05,0x45,0x98,0x09,0x0D,0x08,0x18,0x00,0x04,0x00,0x0C, + 0xA0,0x42,0x00,0xD9,0x20,0x00,0x00,0x04,0x08,0x43,0x49,0x99,0x76,0x1E,0x88,0x50, + 0xEC,0xD5,0x00,0xF0,0x35,0xF9,0x00,0xF0,0x5D,0xF9,0x00,0xF0,0x0B,0xFA,0x4D,0xB0, + 0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00,0x00,0x02,0x10,0x40, + 0xE0,0x7A,0x00,0x00,0x70,0x0A,0x00,0x20,0xF8,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00, + 0xF0,0xB5,0x01,0x26,0x76,0x07,0x30,0x68,0x01,0x28,0x1D,0xD1,0x74,0x68,0xA1,0x05, + 0xA0,0x01,0x89,0x0D,0x80,0x0D,0x0D,0x00,0x07,0x00,0x03,0xF0,0x9F,0xFF,0x41,0x1C, + 0x12,0xD0,0x0B,0x4A,0x80,0x00,0x81,0x18,0x49,0x88,0x10,0x5A,0xA3,0x0A,0x49,0x19, + 0x49,0x05,0x89,0x0D,0x9B,0x02,0xC0,0x19,0x06,0x4A,0x40,0x08,0x19,0x43,0x80,0x05, + 0x80,0x09,0x11,0x40,0x08,0x43,0x70,0x60,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x08,0x71,0x00,0x00,0xFF,0xFF,0x00,0xFC,0x30,0xB4,0x17,0x4D,0x15,0x4C,0x2D,0x78, + 0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x09,0x0E,0x00,0x0A,0x00,0x2B, + 0x07,0xD0,0x00,0x2A,0x02,0xD0,0xC9,0x18,0xC0,0x18,0x0F,0xE0,0xC0,0x1A,0xC9,0x1A, + 0x0C,0xE0,0x00,0x2A,0x05,0xD0,0x88,0x42,0x01,0xDD,0x49,0x1C,0x06,0xE0,0x40,0x1C, + 0x04,0xE0,0x88,0x42,0x01,0xDD,0x40,0x1E,0x00,0xE0,0x49,0x1E,0x4A,0x1E,0xFF,0x2A, + 0x05,0xD2,0x42,0x1E,0xFF,0x2A,0x02,0xD2,0x00,0x02,0x08,0x43,0x60,0x53,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0xF0,0xB5,0x5A,0x48, + 0x8F,0xB0,0x06,0x78,0x59,0x48,0x5B,0x4A,0x05,0x96,0x07,0x78,0x58,0x48,0x06,0x97, + 0x0E,0x90,0x80,0x7E,0x0D,0x92,0xC1,0x07,0x09,0xD0,0x80,0x07,0x04,0xD5,0x70,0x1E, + 0x05,0x90,0x03,0x20,0x10,0x71,0x02,0xE0,0x7F,0x1E,0x00,0x21,0x11,0x71,0x52,0x48, + 0x0A,0x22,0x01,0x8C,0x51,0x43,0x09,0x04,0x09,0x0C,0x02,0x91,0x40,0x8C,0x50,0x43, + 0x00,0x04,0x00,0x0C,0x01,0x90,0x05,0x98,0x00,0x28,0x7E,0xD0,0x00,0x2F,0x7C,0xD0, + 0x41,0x00,0x02,0x98,0xFE,0xF7,0x2C,0xF8,0x05,0x04,0x2D,0x0C,0x00,0x24,0xB6,0x1C, + 0x0A,0xE0,0x02,0x98,0x05,0x99,0x60,0x43,0xFE,0xF7,0x22,0xF8,0x43,0x4A,0x61,0x00, + 0x40,0x19,0x89,0x18,0x64,0x1C,0x08,0x84,0xB4,0x42,0xF2,0xDB,0x01,0x98,0x79,0x00, + 0xFE,0xF7,0x16,0xF8,0x06,0x04,0x06,0x98,0x36,0x0C,0x00,0x24,0x80,0x1C,0x0C,0x90, + 0x0C,0xE0,0x01,0x98,0x39,0x00,0x60,0x43,0xFE,0xF7,0x0A,0xF8,0x37,0x4A,0x81,0x19, + 0x60,0x00,0x80,0x18,0x40,0x30,0x81,0x80,0x0C,0x98,0x64,0x1C,0x84,0x42,0xF0,0xDB, + 0x0E,0x98,0x80,0x7E,0xC0,0x07,0x53,0xD0,0x00,0x24,0x4D,0xE0,0x2F,0x4A,0x09,0x21, + 0x10,0x19,0xC9,0x01,0x40,0x18,0x41,0x7A,0x0E,0x98,0x80,0x7E,0x80,0x07,0x03,0xD5, + 0x05,0x98,0x03,0x95,0x04,0x91,0x02,0xE0,0x08,0x00,0x03,0xA9,0xC0,0xC1,0x27,0x49, + 0x40,0x00,0x40,0x18,0x0B,0x90,0x00,0x8C,0x0A,0x21,0x40,0x1B,0xFD,0xF7,0xE0,0xFF, + 0x22,0x4A,0xE1,0x00,0x89,0x18,0x11,0x22,0x92,0x01,0x0A,0x91,0x89,0x18,0x09,0x91, + 0x88,0x83,0x04,0x98,0x1D,0x49,0x40,0x00,0x40,0x18,0x40,0x30,0x08,0x90,0x80,0x88, + 0x0A,0x21,0x80,0x1B,0xFD,0xF7,0xCC,0xFF,0x09,0x99,0xC8,0x83,0x0B,0x98,0x0A,0x21, + 0x00,0x8C,0x40,0x19,0xFE,0xF7,0x9E,0xF8,0x0A,0x99,0x23,0x22,0x52,0x01,0x89,0x18, + 0x07,0x91,0x08,0x80,0x08,0x98,0x0A,0x21,0x80,0x88,0x80,0x19,0xFE,0xF7,0x92,0xF8, + 0x07,0x99,0x48,0x80,0x03,0x98,0x40,0x00,0x00,0xE0,0x09,0xE0,0x0A,0x21,0xFE,0xF7, + 0x89,0xF8,0x0D,0x99,0x64,0x1C,0xC8,0x80,0x0E,0x98,0xC0,0x7E,0xA0,0x42,0xAD,0xDC, + 0x0F,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x02,0x49,0x08,0x68,0x04,0x22,0x90,0x43,0x08,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x04,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x03,0x49,0xCA,0x69,0x01,0x23,0x5B,0x05,0x9A,0x43,0x02,0x43,0xCA,0x61,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x49,0x08,0x49,0x00,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x02,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0x70,0x47, + 0xC0,0x90,0x00,0x40,0x01,0x49,0xC8,0x68,0xC8,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x02,0x48,0x01,0x68,0x08,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x01,0x22,0x10,0xB5,0x08,0x49,0x09,0x48,0x52,0x02,0x02,0xF0,0xCA,0xFC,0x08,0x48, + 0x01,0x22,0xC0,0x8E,0x92,0x02,0x01,0x04,0x01,0x43,0x06,0x48,0x02,0xF0,0xD4,0xFC, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x10,0x40, + 0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0x02,0x48,0x81,0x6B,0x49,0x08,0x49,0x00, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x02,0x48,0x81,0x6B,0x01,0x22,0x11,0x43, + 0x81,0x63,0x70,0x47,0x80,0x90,0x00,0x40,0x10,0xB5,0x0A,0x49,0x0A,0x48,0xFC,0x22, + 0x02,0xF0,0x9F,0xFC,0xFF,0x22,0x09,0x49,0x09,0x48,0xF1,0x32,0x02,0xF0,0x99,0xFC, + 0x01,0x22,0x08,0x49,0x08,0x48,0x52,0x02,0x02,0xF0,0x93,0xFC,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0x04,0x7B,0x00,0x00,0x04,0x90,0x00,0x40,0x00,0x7C,0x00,0x00, + 0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00,0x00,0x06,0x10,0x40,0x03,0x48,0x41,0x68, + 0x01,0x22,0x12,0x04,0x11,0x43,0x41,0x60,0x70,0x47,0x00,0x00,0x00,0xA0,0x00,0x40, + 0x02,0x48,0x01,0x68,0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x90,0x00,0x40, + 0x70,0xB5,0x1A,0x4C,0x20,0x68,0x40,0x08,0x40,0x00,0x20,0x60,0x18,0x48,0xA6,0x15, + 0x05,0x04,0x2D,0x0C,0x00,0x22,0x31,0x00,0x28,0x00,0xFD,0xF7,0xE3,0xFF,0x32,0x00, + 0x21,0x00,0x28,0x00,0x00,0x23,0xFD,0xF7,0xE5,0xFF,0x12,0x48,0x75,0x00,0x04,0x04, + 0x24,0x0C,0x00,0x22,0x29,0x00,0x20,0x00,0xFD,0xF7,0xD4,0xFF,0x0E,0x49,0x2A,0x00, + 0x20,0x00,0x00,0x23,0xFD,0xF7,0xD6,0xFF,0x0C,0x48,0x00,0x22,0x04,0x04,0x24,0x0C, + 0x29,0x00,0x20,0x00,0xFD,0xF7,0xC6,0xFF,0x09,0x49,0x2A,0x00,0x20,0x00,0x00,0x23, + 0xFD,0xF7,0xC8,0xFF,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x90,0x00,0x40, + 0x00,0x7B,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0xA0,0x00,0x40,0x00,0x76,0x00,0x00, + 0x00,0x06,0x10,0x40,0x04,0x48,0x10,0xB5,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0xFE,0xF7, + 0x7F,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40,0xF1,0xB5,0x55,0x4E, + 0x53,0x4B,0xF2,0x88,0x98,0x88,0x54,0x49,0x54,0x06,0x82,0xB0,0x00,0xD4,0x08,0x88, + 0x52,0x06,0x01,0x90,0x98,0x79,0x00,0xD4,0x88,0x78,0x37,0x00,0x00,0x25,0x01,0x00, + 0x41,0x43,0x08,0x06,0x00,0x0E,0x01,0x24,0xFF,0x37,0x61,0x37,0x00,0x90,0x11,0xE0, + 0x0A,0x20,0x60,0x43,0x43,0x21,0x80,0x19,0xC9,0x00,0x09,0x5C,0x00,0x29,0x08,0xD0, + 0x46,0x49,0x40,0x18,0x01,0xF0,0x66,0xF9,0x00,0x28,0x02,0xD0,0x6D,0x1C,0x2D,0x06, + 0x2D,0x0E,0x64,0x1C,0xB8,0x78,0xA0,0x42,0xEA,0xDA,0x41,0x49,0x08,0x00,0x20,0x30, + 0xCA,0x8B,0x43,0x88,0xD4,0x1A,0x00,0x2C,0x00,0xDC,0x9C,0x1A,0x22,0x04,0x03,0x88, + 0x84,0x88,0x12,0x0C,0x1F,0x1B,0x00,0x2F,0x00,0xDC,0xE7,0x1A,0x84,0x7A,0x3B,0x04, + 0x1B,0x0C,0x00,0x2C,0x04,0xD0,0x44,0x7B,0xC8,0x2C,0x01,0xD2,0x64,0x1C,0x44,0x73, + 0x8C,0x7B,0x14,0x2C,0x04,0xD2,0x0C,0x7C,0x00,0x2C,0x01,0xD0,0x01,0x24,0x4C,0x74, + 0x14,0x2A,0x01,0xD8,0x14,0x2B,0x04,0xD9,0xCC,0x7B,0xC8,0x2C,0x01,0xD2,0x64,0x1C, + 0xCC,0x73,0x02,0x2D,0x09,0xD2,0x14,0x2A,0x07,0xD2,0x14,0x2B,0x05,0xD2,0x08,0x24, + 0x04,0x5F,0x04,0x2C,0x07,0xDA,0x64,0x1C,0x04,0xE0,0x08,0x24,0x04,0x5F,0xE7,0x1C, + 0x01,0xDD,0x64,0x1E,0x04,0x81,0x44,0x7B,0x01,0x2C,0x01,0xD9,0x78,0x21,0x10,0xE0, + 0x02,0x2D,0x0F,0xD2,0x08,0x24,0x04,0x5F,0x02,0x2C,0x0B,0xDD,0xC9,0x7B,0x14,0x29, + 0x08,0xD2,0x51,0x3A,0x8B,0x2A,0x02,0xD3,0x51,0x3B,0x8B,0x2B,0x02,0xD2,0x77,0x21, + 0xC9,0x43,0xC1,0x80,0x00,0x21,0x02,0x2D,0x01,0x73,0x0E,0xD2,0x06,0x21,0x41,0x5E, + 0x78,0x31,0x04,0xD1,0xC1,0x7A,0xC8,0x29,0x01,0xD2,0x49,0x1C,0xC1,0x72,0xC1,0x7A, + 0x49,0x1E,0x02,0x29,0x01,0xD2,0x01,0x21,0x01,0x73,0x06,0x21,0x41,0x5E,0x01,0x98, + 0x09,0x18,0x08,0x00,0x48,0x43,0x02,0x99,0x00,0x29,0x05,0xD1,0x31,0x79,0x01,0x29, + 0x02,0xD0,0x00,0x99,0xFD,0xF7,0x0C,0xFE,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00,0x1E,0x02,0x00,0x00, + 0x70,0x08,0x00,0x20,0xFF,0x21,0x03,0x31,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1, + 0x70,0x47,0x15,0x21,0x08,0x00,0x49,0x1E,0x00,0x28,0xFB,0xD1,0x70,0x47,0x00,0x00, + 0x02,0x48,0x41,0x6B,0x01,0x22,0x11,0x43,0x41,0x63,0x70,0x47,0x00,0x70,0x00,0x40, + 0x70,0x47,0x00,0x00,0xFE,0xB5,0x1E,0x4A,0x1C,0x48,0xD1,0x88,0x00,0x25,0x00,0x7A, + 0x2E,0x00,0x2F,0x00,0x49,0x06,0x02,0xD4,0x18,0x48,0xC0,0x38,0x00,0x79,0x19,0x49, + 0x89,0x8A,0x40,0x18,0x01,0x06,0x18,0x48,0x09,0x0E,0x00,0x78,0x00,0x28,0x01,0x90, + 0x21,0xD0,0x01,0x24,0x49,0x1C,0x00,0x91,0x13,0xE0,0x0A,0x20,0x60,0x43,0x10,0x49, + 0x40,0x18,0xFF,0x30,0x61,0x30,0x80,0x7A,0x14,0x28,0x01,0xD2,0x01,0x26,0x07,0xE0, + 0x01,0x27,0x14,0x21,0xFD,0xF7,0x96,0xFE,0x00,0x99,0x88,0x42,0x00,0xD3,0x01,0x25, + 0x64,0x1C,0x01,0x98,0xA0,0x42,0xE8,0xDA,0x00,0x2F,0x02,0xD1,0x00,0x2E,0x00,0xD0, + 0x02,0x25,0x28,0x06,0x00,0x0E,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xD0,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0x13,0x48,0x10,0xB5, + 0xC0,0x68,0x00,0x28,0x1F,0xD0,0x01,0x06,0x09,0x0F,0x03,0x29,0x01,0xD0,0x04,0x29, + 0x02,0xD1,0x00,0xF0,0xF1,0xF8,0x08,0xE0,0xF0,0x21,0x01,0x40,0x20,0x29,0x02,0xD2, + 0x00,0xF0,0x1A,0xF8,0x01,0xE0,0x03,0xF0,0xBB,0xFA,0x09,0x48,0x82,0x68,0x81,0x15, + 0x8A,0x43,0x82,0x60,0x82,0x68,0x0A,0x43,0x82,0x60,0x06,0x48,0x00,0x7A,0x00,0x28, + 0x01,0xD0,0x04,0xF0,0x83,0xFA,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30, + 0x00,0x40,0x00,0x40,0xF8,0x0A,0x00,0x20,0xF1,0xB5,0x61,0x48,0x2E,0x21,0x90,0xB0, + 0x41,0x60,0x41,0x69,0x89,0x06,0xFC,0xD4,0x10,0x99,0x01,0x26,0x76,0x07,0xF1,0x63, + 0x84,0x69,0x5B,0x48,0x40,0x68,0x80,0x07,0xFB,0xD5,0x03,0xF0,0x91,0xFA,0x59,0x4D, + 0x28,0x7A,0x00,0x28,0x01,0xD0,0x04,0xF0,0x69,0xFA,0x10,0x9B,0x00,0x21,0x01,0x20, + 0x9B,0x1E,0xFF,0x27,0x4A,0x1E,0x40,0x03,0x04,0xF0,0xA2,0xFA,0x1E,0x16,0x40,0x40, + 0x40,0x40,0x13,0x40,0x40,0x42,0x10,0x40,0x40,0x58,0x40,0x40,0x4F,0x68,0x6F,0x76, + 0x7D,0x85,0x40,0x8C,0x93,0x4F,0x40,0x40,0x40,0x40,0x9A,0x40,0x0B,0x20,0xF0,0x63, + 0x4D,0xE0,0x00,0xF0,0x19,0xF9,0x29,0xE0,0x03,0x21,0x09,0x07,0xCA,0x60,0xFE,0xF7, + 0x4F,0xF9,0x00,0xF0,0x45,0xFE,0x44,0x48,0x44,0x4A,0x41,0x68,0x52,0x68,0x91,0x42, + 0x1C,0xD0,0x43,0x49,0x17,0x22,0xC9,0x8B,0x52,0x01,0x80,0x18,0x49,0x1C,0xC1,0x83, + 0xFD,0xF7,0xC0,0xFA,0xA8,0x78,0xC0,0x07,0x01,0xD0,0xFF,0xF7,0x21,0xFE,0xA8,0x78, + 0x80,0x07,0x01,0xD5,0x04,0xF0,0xE0,0xF9,0x3A,0x49,0x40,0x22,0x68,0x46,0x02,0xF0, + 0x88,0xFA,0x01,0x20,0x08,0x90,0x68,0x46,0x04,0xF0,0xEE,0xF9,0xF7,0x63,0x1E,0xE0, + 0x32,0x48,0xA0,0x30,0x00,0x7E,0x00,0x28,0xF8,0xD0,0x00,0x2C,0x01,0xD0,0x01,0x20, + 0x00,0xE0,0x00,0x20,0x04,0xF0,0x76,0xF8,0xF0,0xE7,0x03,0x21,0x09,0x07,0xCA,0x60, + 0xFE,0xF7,0x16,0xF9,0x10,0x98,0xFE,0xF7,0x69,0xF8,0x08,0xE0,0x03,0x21,0x09,0x07, + 0xCA,0x60,0xFE,0xF7,0x0D,0xF9,0x00,0xF0,0x83,0xFD,0x00,0xF0,0xEF,0xF8,0x20,0x48, + 0x41,0x68,0x41,0x60,0x11,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x2C,0x02,0xD0, + 0x01,0x20,0xA8,0x71,0xD2,0xE7,0xA9,0x71,0xD0,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20, + 0xE8,0x71,0xCB,0xE7,0xE9,0x71,0xC9,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x72, + 0xC4,0xE7,0x29,0x72,0xC2,0xE7,0x00,0x2C,0x03,0xD0,0x20,0x0C,0x6C,0x72,0x28,0x82, + 0xBC,0xE7,0x69,0x72,0xBA,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xA8,0x72,0xB5,0xE7, + 0xA9,0x72,0xB3,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0xE8,0x72,0xAE,0xE7,0xE9,0x72, + 0xAC,0xE7,0x00,0x2C,0x02,0xD0,0x01,0x20,0x28,0x73,0xA7,0xE7,0x29,0x73,0xA5,0xE7, + 0x00,0x2C,0x01,0xD0,0x6C,0x73,0x00,0xE0,0x69,0x73,0x03,0xF0,0x9B,0xFE,0x9D,0xE7, + 0x00,0x40,0x00,0x30,0xF8,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00, + 0xE0,0x7A,0x00,0x00,0xC0,0x75,0x00,0x00,0xF0,0xB5,0x38,0x4F,0x35,0x4C,0xF9,0x78, + 0x03,0x00,0x35,0x4A,0x0E,0x04,0x39,0x79,0x35,0x48,0x25,0x68,0x0E,0x43,0x35,0x49, + 0x30,0x3B,0x04,0xF0,0xE5,0xF9,0x12,0x0A,0x0C,0x0E,0x12,0x16,0x1A,0x1C,0x18,0x1E, + 0x20,0x30,0x3B,0x16,0x3E,0x43,0x48,0x4E,0x51,0x0A,0xCD,0x61,0x21,0xE0,0x60,0x68, + 0x01,0xE0,0x2D,0x48,0xC0,0x6B,0xC8,0x61,0x1B,0xE0,0x10,0x8C,0x52,0x8C,0x00,0x04, + 0x35,0xE0,0xCE,0x61,0x15,0xE0,0xE0,0x68,0xF5,0xE7,0x50,0x68,0xF3,0xE7,0xA0,0x68, + 0xF1,0xE7,0xD0,0x7B,0xEF,0xE7,0x25,0x48,0x03,0x7A,0x10,0x7D,0x52,0x7D,0xC4,0x07, + 0xE4,0x09,0x80,0x07,0x12,0x04,0xC0,0x0F,0x00,0x02,0x23,0x43,0x02,0x43,0x13,0x43, + 0xCB,0x61,0x5F,0x22,0x22,0xE0,0x93,0x7D,0x50,0x7E,0x1B,0x06,0x18,0x43,0xD3,0x7D, + 0x12,0x7E,0x1B,0x04,0x12,0x02,0x13,0x43,0x18,0x43,0xD4,0xE7,0x90,0x7E,0x00,0x06, + 0xD1,0xE7,0x17,0x48,0x00,0x69,0xC0,0x07,0xC0,0x0F,0xCC,0xE7,0x00,0x69,0xFA,0x89, + 0x40,0x08,0x00,0x02,0x03,0xE0,0x13,0x48,0xA2,0x69,0xC0,0x8B,0x00,0x04,0x10,0x43, + 0xC1,0xE7,0x00,0x69,0x40,0x08,0xBE,0xE7,0xB8,0x69,0xBC,0xE7,0x48,0x69,0x10,0x42, + 0xFC,0xD1,0x03,0xF0,0x6D,0xF9,0xFF,0x20,0x01,0x21,0x49,0x07,0xC8,0x63,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0xC0,0x75,0x00,0x00,0x00,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20, + 0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x30,0xC0,0x0F,0x00,0x20,0x70,0x0A,0x00,0x20, + 0x00,0x7B,0x00,0x00,0xE0,0x7A,0x00,0x00,0x70,0xB5,0x03,0x24,0x24,0x07,0xE5,0x68, + 0x00,0x20,0xC0,0x43,0xE0,0x60,0xFE,0xF7,0x51,0xF8,0x06,0x00,0xCB,0x20,0xC0,0x01, + 0xFE,0xF7,0x2E,0xF8,0x02,0xF0,0xEC,0xFF,0x01,0x20,0x40,0x05,0xFF,0xF7,0x88,0xFC, + 0x00,0xF0,0xBC,0xFC,0x00,0x20,0xFF,0xF7,0x83,0xFC,0x02,0xF0,0xD5,0xFF,0x30,0x00, + 0xFE,0xF7,0x50,0xF8,0xE5,0x60,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x03,0x21, + 0x10,0xB5,0xC0,0x43,0x09,0x07,0xC8,0x60,0x02,0xF0,0xD2,0xFF,0x00,0x20,0xFF,0xF7, + 0x6F,0xFC,0xFF,0xF7,0xED,0xFC,0x05,0x48,0xC1,0x68,0xC9,0x07,0xFC,0xD0,0x01,0x20, + 0x40,0x07,0x04,0xF0,0x3B,0xF9,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x90,0x00,0x40, + 0xF8,0xB5,0x27,0x49,0x25,0x48,0xC9,0x88,0x00,0x8A,0x49,0x06,0x02,0xD4,0x23,0x48, + 0xC0,0x38,0x80,0x89,0xC0,0x06,0x3D,0xD5,0x22,0x4E,0x30,0x78,0x00,0x28,0x39,0xD0, + 0x70,0x78,0x00,0x28,0x36,0xD0,0x01,0x25,0x31,0xE0,0x0A,0x21,0x69,0x43,0x1C,0x4B, + 0x01,0x20,0xCC,0x18,0xFF,0x34,0x77,0x78,0x61,0x34,0x25,0xE0,0x0A,0x22,0x42,0x43, + 0xD2,0x18,0xFF,0x32,0xA1,0x32,0x21,0x79,0x92,0x7F,0x91,0x42,0x1B,0xD1,0x0A,0x22, + 0x50,0x43,0xC7,0x18,0xFF,0x37,0x06,0x21,0xC1,0x37,0x00,0x20,0x61,0x5E,0x38,0x5E, + 0x02,0x22,0xBA,0x5E,0x08,0x1A,0x08,0x21,0x61,0x5E,0x89,0x1A,0x00,0x91,0x3A,0x88, + 0xE1,0x88,0xFF,0xF7,0x05,0xFA,0xE0,0x80,0x7A,0x88,0x21,0x89,0x00,0x98,0xFF,0xF7, + 0xFF,0xF9,0x20,0x81,0x02,0xE0,0x40,0x1C,0x87,0x42,0xD7,0xDA,0x6D,0x1C,0x30,0x78, + 0xA8,0x42,0xCA,0xDA,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0xB5,0x00,0x20,0xB1,0xB0,0x11,0x90, + 0x10,0x90,0x0F,0x90,0x0E,0x90,0xFA,0x48,0xFB,0x4D,0x01,0x8C,0xF9,0x4A,0x0B,0x91, + 0x40,0x8C,0xFA,0x49,0x0A,0x90,0xE8,0x88,0x13,0x7B,0x44,0x06,0x00,0xD4,0x0B,0x7A, + 0x54,0x7B,0x46,0x06,0x00,0xD4,0x4C,0x7A,0x46,0x06,0x09,0x94,0x94,0x7E,0x00,0xD4, + 0x8C,0x7D,0x46,0x06,0x08,0x94,0x54,0x7E,0x00,0xD4,0x4C,0x7D,0x07,0x94,0xEF,0x4C, + 0x40,0x34,0x24,0x8A,0x46,0x06,0x02,0xD4,0xEC,0x4C,0x80,0x3C,0xA4,0x89,0x24,0x07, + 0x42,0xD5,0xD4,0x7B,0x46,0x06,0x00,0xD4,0xCC,0x7A,0x5C,0x43,0x26,0x94,0x14,0x7C, + 0x46,0x06,0x00,0xD4,0x0C,0x7B,0x5C,0x43,0x25,0x94,0x54,0x7C,0x46,0x06,0x00,0xD4, + 0x4C,0x7B,0x5C,0x43,0x24,0x94,0x94,0x7C,0x46,0x06,0x00,0xD4,0x8C,0x7B,0x5C,0x43, + 0x23,0x94,0xD4,0x7C,0x46,0x06,0x00,0xD4,0xCC,0x7B,0x5C,0x43,0x22,0x94,0x14,0x7D, + 0x46,0x06,0x00,0xD4,0x0C,0x7C,0x5C,0x43,0x21,0x94,0x54,0x7D,0x46,0x06,0x00,0xD4, + 0x4C,0x7C,0x5C,0x43,0x20,0x94,0x94,0x7D,0x46,0x06,0x00,0xD4,0x8C,0x7C,0x5C,0x43, + 0x1F,0x94,0xD4,0x7D,0x46,0x06,0x00,0xD4,0xCC,0x7C,0x5C,0x43,0x1E,0x94,0x12,0x7E, + 0x40,0x06,0x00,0xD4,0x0A,0x7D,0xCE,0x48,0x5A,0x43,0x1D,0x92,0x30,0x90,0x00,0x78, + 0x00,0x28,0x05,0xD1,0x00,0xF0,0xCE,0xFE,0x31,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x20,0x27,0x90,0xC7,0x48,0x2F,0x90,0xC3,0x4D,0x27,0x98,0x13,0x21,0x28,0x18, + 0x49,0x01,0x2E,0x90,0x40,0x18,0x04,0x7F,0x00,0x2C,0x0F,0xD0,0x08,0x98,0x00,0x28, + 0x08,0xD1,0x0A,0x20,0x60,0x43,0x40,0x19,0xFF,0x30,0x6B,0x30,0x00,0xF0,0xE2,0xFD, + 0x00,0x28,0x03,0xD0,0x2F,0x98,0x00,0x7B,0x00,0x28,0x03,0xD0,0x27,0x98,0xFF,0xF7, + 0xF9,0xF8,0xA0,0xE2,0x27,0x99,0x15,0x27,0x07,0x20,0x7F,0x01,0x4E,0x00,0x01,0x01, + 0x49,0x19,0x89,0x19,0xCA,0x19,0xD2,0x8A,0x0B,0x23,0x9B,0x01,0xCB,0x18,0xDA,0x80, + 0x0D,0x22,0x92,0x01,0x89,0x18,0xCA,0x88,0x40,0x1E,0xCA,0x82,0xEF,0xD5,0x0A,0x20, + 0x44,0x43,0x64,0x19,0x2D,0x94,0xFF,0x34,0x61,0x34,0xE1,0x88,0x0B,0x98,0x40,0x1E, + 0x81,0x42,0xDE,0xDC,0x21,0x89,0x0A,0x98,0x40,0x1E,0x81,0x42,0xD9,0xDC,0xA2,0x48, + 0xE1,0x88,0x35,0x18,0xE8,0x19,0x2C,0x90,0x0D,0x23,0xC1,0x82,0x21,0x89,0x9B,0x01, + 0xE8,0x18,0x2B,0x90,0xC1,0x80,0x00,0x20,0x01,0x21,0xC9,0x02,0x06,0x90,0x05,0x90, + 0x07,0x20,0x04,0x91,0x98,0x4A,0x03,0x01,0x9A,0x18,0x92,0x19,0x15,0x23,0x5B,0x01, + 0x94,0x46,0xD2,0x18,0x16,0x23,0xD3,0x5E,0x00,0x2B,0x07,0xDD,0x06,0x9F,0xBB,0x42, + 0x01,0xDD,0xD7,0x8A,0x06,0x97,0x8B,0x42,0x00,0xDA,0xD1,0x8A,0x0D,0x23,0x9B,0x01, + 0x62,0x46,0xD2,0x18,0x06,0x23,0xD3,0x5E,0x00,0x2B,0x09,0xDD,0x05,0x9F,0xBB,0x42, + 0x01,0xDD,0xD7,0x88,0x05,0x97,0x04,0x9F,0xBB,0x42,0x01,0xDA,0xD2,0x88,0x04,0x92, + 0x40,0x1E,0xD7,0xD5,0x06,0x98,0x40,0x1A,0xF0,0x28,0x04,0xDC,0x04,0x99,0x05,0x98, + 0x40,0x1A,0xF0,0x28,0x02,0xDD,0x2F,0x99,0x01,0x20,0x88,0x72,0x2E,0x98,0x15,0x21, + 0x49,0x01,0x40,0x18,0x2A,0x90,0x80,0x7B,0x01,0x28,0x1B,0xD9,0x2C,0x98,0x16,0x21, + 0x41,0x5E,0x0B,0x20,0x80,0x01,0x28,0x18,0x06,0x22,0x82,0x5E,0x88,0x1A,0x00,0x28, + 0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14,0x0D,0x90,0x2B,0x98,0x06,0x21,0x16,0x22, + 0x41,0x5E,0x82,0x5E,0x88,0x1A,0x00,0x28,0x00,0xDC,0x50,0x1A,0x00,0x04,0x00,0x14, + 0x0C,0x90,0x02,0xE0,0x64,0x20,0x0C,0x90,0x0D,0x90,0x0B,0x20,0x80,0x01,0x2F,0x18, + 0x2C,0x9A,0x06,0x21,0x16,0x20,0x79,0x5E,0x10,0x5E,0x02,0xF0,0x9F,0xFF,0x13,0x90, + 0x2B,0x98,0x16,0x21,0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x02,0xF0,0x96,0xFF, + 0x12,0x90,0x16,0x21,0x79,0x5E,0x13,0x98,0x02,0xF0,0x90,0xFF,0x15,0x90,0x1B,0x20, + 0x40,0x01,0x28,0x18,0x06,0x21,0x29,0x90,0x41,0x5E,0x12,0x98,0x02,0xF0,0x86,0xFF, + 0x14,0x90,0x17,0x20,0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E, + 0x15,0x98,0x02,0xF0,0x7D,0xFF,0x00,0x04,0x00,0x14,0x17,0x90,0x07,0x20,0xC0,0x01, + 0x2F,0x18,0x29,0x98,0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x14,0x98,0x02,0xF0, + 0x6F,0xFF,0x00,0x04,0x00,0x14,0x16,0x90,0x03,0x20,0x00,0x02,0x28,0x18,0x16,0x22, + 0x06,0x21,0x82,0x5E,0x41,0x5E,0x17,0x98,0x02,0xF0,0x62,0xFF,0x00,0x04,0x00,0x14, + 0x19,0x90,0x1D,0x20,0x40,0x01,0x28,0x18,0x28,0x90,0x06,0x22,0x82,0x5E,0x16,0x21, + 0x79,0x5E,0x16,0x98,0x02,0xF0,0x54,0xFF,0x00,0x04,0x00,0x14,0x18,0x90,0x19,0x20, + 0x40,0x01,0x28,0x18,0x16,0x22,0x06,0x21,0x82,0x5E,0x41,0x5E,0x19,0x98,0x02,0xF0, + 0x47,0xFF,0x00,0x04,0x00,0x14,0x1B,0x90,0x0F,0x20,0x80,0x01,0x2F,0x18,0x28,0x98, + 0x16,0x21,0x41,0x5E,0x06,0x22,0xBA,0x5E,0x18,0x98,0x02,0xF0,0x39,0xFF,0x00,0x04, + 0x00,0x14,0x1A,0x90,0x0C,0x99,0x0D,0x98,0x00,0xF0,0xE0,0xFF,0x01,0x21,0x84,0x46, + 0x88,0x02,0x2D,0x4B,0x0A,0x01,0xD2,0x18,0x93,0x19,0x1F,0x22,0x52,0x01,0x9A,0x18, + 0xD2,0x8A,0x1B,0x18,0x49,0x1E,0xDA,0x80,0xF3,0xD5,0x1F,0x21,0x49,0x01,0x6A,0x18, + 0x60,0x46,0xD0,0x82,0x2E,0x9A,0x00,0x20,0x55,0x18,0xAA,0x7B,0x00,0x2A,0x94,0x46, + 0x0B,0xDB,0x21,0x4B,0x11,0x01,0xC9,0x18,0x1F,0x23,0x89,0x19,0x5B,0x01,0xCB,0x18, + 0x16,0x21,0x59,0x5E,0x08,0x18,0x52,0x1E,0xF3,0xD5,0x61,0x46,0x49,0x1C,0xFD,0xF7, + 0xC7,0xF9,0x25,0x99,0x06,0x00,0x88,0x42,0x01,0xDC,0x01,0x20,0x0F,0xE0,0x23,0x98, + 0x86,0x42,0x01,0xDC,0x02,0x20,0x0A,0xE0,0x21,0x98,0x86,0x42,0x01,0xDC,0x03,0x20, + 0x05,0xE0,0x1F,0x98,0x86,0x42,0x01,0xDC,0x04,0x20,0x00,0xE0,0x05,0x20,0xA9,0x79, + 0x40,0x1A,0x09,0x99,0x49,0x42,0x00,0x28,0x08,0xDD,0x16,0x20,0x38,0x5E,0x09,0x9B, + 0x98,0x42,0x01,0xD1,0x00,0x20,0x08,0xE0,0x40,0x1C,0x06,0xE0,0x00,0x28,0x0A,0x48, + 0x38,0x5E,0x13,0xDA,0x88,0x42,0xF5,0xD0,0x40,0x1E,0xF8,0x82,0x11,0xE0,0x00,0x00, + 0x00,0x78,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0x60,0x79,0x00,0x00, + 0x50,0x07,0x00,0x20,0x90,0x08,0x00,0x20,0x16,0x00,0x00,0x00,0x00,0x28,0xEB,0xDC, + 0xE2,0xDB,0x16,0x20,0x38,0x5E,0x09,0x9B,0x98,0x42,0x05,0xD1,0xAB,0x79,0x05,0x2B, + 0x02,0xD2,0x5B,0x1C,0xAB,0x71,0x06,0xE0,0x88,0x42,0x04,0xD1,0xA8,0x79,0x01,0x28, + 0x01,0xD9,0x40,0x1E,0xA8,0x71,0x1A,0x99,0x1B,0x98,0x1C,0x91,0x2A,0x99,0x8F,0x7B, + 0x39,0x00,0xFD,0xF7,0x6D,0xF9,0x11,0x90,0x0F,0x90,0x1C,0x98,0x39,0x00,0xFD,0xF7, + 0x67,0xF9,0x10,0x90,0x0E,0x90,0xA8,0x79,0x01,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9, + 0x6B,0x46,0x06,0xC3,0x1A,0x9B,0x1B,0x9A,0x09,0x21,0x38,0x00,0x03,0xF0,0x64,0xFB, + 0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x18,0x9B,0x80,0x7B,0x19,0x9A, + 0x07,0x21,0x03,0xF0,0x59,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E, + 0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x25,0x9B, + 0x00,0x92,0x2D,0x98,0x26,0x9A,0xFF,0x30,0x65,0x30,0x9A,0xE0,0x02,0x28,0x27,0xD1, + 0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x18,0x9B,0x19,0x9A,0x07,0x21,0x38,0x00, + 0x03,0xF0,0x3A,0xFB,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0,0x2A,0x98,0x16,0x9B, + 0x80,0x7B,0x17,0x9A,0x05,0x21,0x03,0xF0,0x2F,0xFB,0x6B,0x46,0x38,0x22,0x3C,0x21, + 0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22, + 0x9A,0x5E,0x00,0x92,0x2D,0x98,0x23,0x9B,0xFF,0x30,0x24,0x9A,0x65,0x30,0x70,0xE0, + 0x03,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x6B,0x46,0x06,0xC3,0x16,0x9B,0x17,0x9A, + 0x05,0x21,0x38,0x00,0x03,0xF0,0x10,0xFB,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x2A,0x98,0x14,0x9B,0x80,0x7B,0x15,0x9A,0x03,0x21,0x03,0xF0,0x05,0xFB,0x6B,0x46, + 0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB,0x18,0x5E,0x01,0xAF, + 0x07,0xC7,0x04,0x22,0x9A,0x5E,0x21,0x9B,0x00,0x92,0x2D,0x98,0x22,0x9A,0xFF,0x30, + 0x65,0x30,0x46,0xE0,0x04,0x28,0x27,0xD1,0x0E,0xAA,0x0F,0xA9,0x68,0x46,0x06,0xC0, + 0x14,0x9B,0x15,0x9A,0x03,0x21,0x38,0x00,0x03,0xF0,0xE6,0xFA,0x10,0xAA,0x11,0xA9, + 0x68,0x46,0x06,0xC0,0x2A,0x98,0x12,0x9B,0x80,0x7B,0x13,0x9A,0x02,0x21,0x03,0xF0, + 0xDB,0xFA,0x6B,0x46,0x38,0x22,0x3C,0x21,0x9A,0x5E,0x59,0x5E,0x00,0x20,0x10,0xAB, + 0x18,0x5E,0x01,0xAF,0x07,0xC7,0x04,0x22,0x9A,0x5E,0x1F,0x9B,0x00,0x92,0x2D,0x98, + 0x20,0x9A,0xFF,0x30,0x65,0x30,0x1C,0xE0,0x10,0xAA,0x11,0xA9,0x68,0x46,0x06,0xC0, + 0x12,0x9B,0x13,0x9A,0x02,0x21,0x38,0x00,0x03,0xF0,0xBE,0xFA,0x10,0xAB,0x00,0x22, + 0x04,0x21,0x9A,0x5E,0x59,0x5E,0x2B,0x9B,0x06,0x20,0x18,0x5E,0x01,0xAB,0x07,0xC3, + 0x2C,0x98,0x16,0x22,0x82,0x5E,0x1D,0x9B,0x00,0x92,0x2D,0x98,0x1E,0x9A,0xFF,0x30, + 0x65,0x30,0x31,0x00,0x03,0xF0,0xBC,0xFA,0x2A,0x98,0x3C,0x49,0x80,0x7B,0x09,0x28, + 0x02,0xD2,0x2A,0x9A,0x40,0x1C,0x90,0x73,0xA8,0x7B,0x02,0x28,0x01,0xD2,0x40,0x1C, + 0xA8,0x73,0x20,0x79,0x40,0x1E,0x80,0x00,0x41,0x18,0x21,0x20,0x40,0x01,0x0D,0x18, + 0x06,0x20,0x28,0x5E,0x00,0x28,0x22,0xDB,0x08,0x21,0x69,0x5E,0x00,0x29,0x1E,0xDB, + 0x07,0x99,0x64,0x22,0x56,0x1A,0x70,0x43,0x11,0x00,0xFD,0xF7,0x79,0xF8,0x07,0x00, + 0xE0,0x88,0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x4C,0xF9,0x38,0x18,0xE0,0x80, + 0x08,0x20,0x28,0x5E,0x64,0x21,0x70,0x43,0xFD,0xF7,0x6A,0xF8,0x06,0x00,0x20,0x89, + 0x07,0x99,0x48,0x43,0x64,0x21,0xFD,0xF7,0x3D,0xF9,0x30,0x18,0x20,0x81,0xE0,0x88, + 0xE8,0x80,0x20,0x89,0x28,0x81,0x27,0x98,0x40,0x1C,0x08,0x28,0x27,0x90,0x00,0xDA, + 0x3A,0xE5,0x30,0x98,0x01,0x78,0x1A,0x48,0x01,0x29,0x1F,0xD1,0x30,0x99,0x89,0x7B, + 0x4A,0x00,0x16,0x49,0x51,0x18,0x15,0x22,0x52,0x01,0x8A,0x18,0x92,0x8A,0xC2,0x83, + 0x0D,0x22,0x92,0x01,0x8A,0x18,0x94,0x88,0x2F,0x9B,0x1C,0x80,0x0B,0x23,0x9B,0x01, + 0xC9,0x18,0x8B,0x88,0x2F,0x99,0x4B,0x80,0x92,0x8A,0x2F,0x99,0x8A,0x80,0x30,0x99, + 0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x0D,0xE5,0x02,0x29,0xFC,0xD1, + 0x30,0x99,0x09,0x8A,0xC1,0x82,0x30,0x99,0x49,0x8A,0x01,0x83,0x30,0x99,0x49,0x8B, + 0x41,0x83,0x30,0x99,0x89,0x8B,0x81,0x83,0xFE,0xE4,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x70,0x08,0x00,0x20,0x14,0x20,0x9F,0xE5,0x01,0x10,0x81,0xE2,0x00,0x20,0xD2,0xE5, + 0x02,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x01,0x00,0x80,0xE2,0x1E,0xFF,0x2F,0xE1, + 0xFB,0x0A,0x00,0x20,0xF8,0xB5,0x1C,0x4B,0x1C,0x7D,0xDA,0x8E,0xE4,0x07,0x31,0xD0, + 0x1C,0x8F,0x1A,0x4B,0x1B,0x7A,0x9E,0x46,0x19,0x4B,0x1E,0x78,0x16,0x4B,0x9D,0x7D, + 0x00,0x2E,0x76,0x46,0xAC,0x46,0xDD,0x7D,0x00,0x95,0x1D,0x7E,0x5F,0x7E,0x9B,0x7E, + 0x12,0xD0,0xB0,0x42,0x1E,0xD1,0x8C,0x45,0x08,0xD0,0x00,0x98,0x88,0x42,0x05,0xD0, + 0x8D,0x42,0x03,0xD0,0x8F,0x42,0x01,0xD0,0x8B,0x42,0x03,0xD1,0x20,0x00,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x20,0xFA,0xE7,0xB1,0x42,0x0B,0xD1,0x84,0x45,0xF5,0xD0, + 0x00,0x99,0x81,0x42,0xF2,0xD0,0x85,0x42,0xF0,0xD0,0x87,0x42,0xEE,0xD0,0x83,0x42, + 0xF0,0xD1,0xEB,0xE7,0x10,0x00,0xEA,0xE7,0x00,0x78,0x00,0x00,0x70,0x0A,0x00,0x20, + 0xFD,0x0A,0x00,0x20,0x78,0x47,0xC0,0x46,0x14,0x20,0x9F,0xE5,0x02,0x10,0x81,0xE2, + 0x00,0x20,0xD2,0xE5,0x04,0x20,0x82,0xE2,0x91,0x02,0x20,0xE0,0x02,0x00,0x80,0xE2, + 0x1E,0xFF,0x2F,0xE1,0xFB,0x0A,0x00,0x20,0xFE,0xB5,0x04,0x00,0x88,0x1A,0xC0,0x1A, + 0x0D,0x00,0x16,0x00,0x41,0x00,0x08,0x19,0x02,0x22,0x82,0x5E,0x1F,0x00,0x20,0x38, + 0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x9C,0xFD,0x69,0x00,0x01,0x90, + 0x08,0x19,0x02,0x22,0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00, + 0x00,0xF0,0x90,0xFD,0x00,0x90,0xA8,0x19,0xC0,0x19,0x41,0x00,0x08,0x19,0x02,0x22, + 0x82,0x5E,0x20,0x38,0x1E,0x23,0xC3,0x5E,0x61,0x5E,0x18,0x00,0x00,0xF0,0x82,0xFD, + 0x02,0x00,0x00,0x99,0x01,0x98,0x00,0xF0,0x7D,0xFD,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x04,0x4B,0x03,0x4A,0x1B,0x78,0x58,0x43,0x40,0x18,0x40,0x00,0x10,0x5A,0x70,0x47, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x04,0x48,0x41,0x69,0x49,0x06,0x01,0xD5, + 0x10,0x20,0x70,0x47,0x40,0x69,0xC0,0x06,0xC0,0x0E,0x70,0x47,0x00,0x40,0x00,0x30, + 0x0D,0x49,0x01,0x20,0x10,0xB5,0x40,0x07,0x4A,0x69,0x92,0x06,0xFC,0xD4,0xCA,0x68, + 0x4B,0x68,0x4B,0x60,0x04,0xE0,0x4B,0x69,0x9B,0x06,0xFC,0xD4,0x8B,0x69,0x08,0xC0, + 0x52,0x1E,0xF8,0xD2,0x2E,0x20,0x48,0x60,0x48,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0, + 0x87,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x40,0x00,0x30,0x78,0x47,0xC0,0x46, + 0x10,0x40,0x2D,0xE9,0xB0,0x40,0x9F,0xE5,0x0C,0x00,0x94,0xE5,0x00,0x00,0x50,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x04,0x00,0x94,0xE5,0x04,0x00,0x84,0xE5,0x04,0x00,0x94,0xE5, + 0x04,0x00,0x10,0xE3,0x10,0x00,0x00,0x0A,0x0C,0x00,0x94,0xE5,0x04,0x10,0x90,0xE4, + 0x1C,0x10,0x84,0xE5,0x02,0x12,0xA0,0xE3,0x38,0x10,0x91,0xE5,0x04,0x00,0x00,0xEA, + 0x04,0x20,0x90,0xE4,0x1C,0x20,0x84,0xE5,0x14,0x20,0x94,0xE5,0x40,0x00,0x12,0xE3, + 0xFC,0xFF,0xFF,0x1A,0x01,0x10,0x51,0xE2,0xF8,0xFF,0xFF,0x1A,0x14,0x00,0x94,0xE5, + 0x5F,0x00,0x10,0xE3,0xFC,0xFF,0xFF,0x1A,0x11,0x00,0x00,0xEA,0x04,0x00,0x94,0xE5, + 0x02,0x00,0x10,0xE3,0xE8,0xFF,0xFF,0x0A,0x14,0x00,0x94,0xE5,0x20,0x00,0x10,0xE3, + 0xE5,0xFF,0xFF,0x1A,0x0C,0x00,0x94,0xE5,0x08,0x00,0x50,0xE3,0x10,0x40,0xBD,0x08, + 0x18,0x0A,0x00,0x0A,0x14,0x10,0x94,0xE5,0x5F,0x00,0x11,0xE3,0x18,0x10,0x94,0x15, + 0x04,0x10,0x80,0x14,0xFA,0xFF,0xFF,0x1A,0x04,0x00,0x94,0xE5,0x02,0x00,0x10,0xE3, + 0xFC,0xFF,0xFF,0x0A,0x0F,0x0A,0x00,0xEB,0xD2,0xFF,0xFF,0xEA,0x00,0x40,0x00,0x30, + 0xF8,0xB5,0x20,0x4E,0x20,0x4F,0x00,0x25,0x2C,0x00,0x78,0x69,0x80,0x06,0xFC,0xD4, + 0x78,0x68,0x78,0x60,0xF8,0x68,0x04,0x28,0x0E,0xD1,0x1C,0x48,0x40,0x21,0x04,0xE0, + 0x7A,0x69,0x92,0x06,0xFC,0xD4,0xBA,0x69,0x04,0xC0,0x49,0x1E,0xF8,0xD2,0x20,0x25, + 0x17,0x4C,0x30,0x78,0x01,0x21,0x06,0xE0,0x05,0x28,0x07,0xD1,0x15,0x48,0x16,0x4C, + 0x85,0x08,0x30,0x78,0x02,0x21,0x08,0x43,0x30,0x70,0x10,0xE0,0x03,0x28,0x0E,0xD1, + 0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xF1,0xFB,0xF8,0xBC, + 0x08,0xBC,0x18,0x47,0x78,0x69,0x80,0x06,0xFC,0xD4,0xB8,0x69,0x01,0xC4,0x6D,0x1E, + 0xF8,0xD2,0x2E,0x20,0x78,0x60,0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0xE0,0xFB, + 0xC3,0xE7,0x00,0x00,0xFA,0x0A,0x00,0x20,0x00,0x40,0x00,0x30,0x00,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x01,0x49,0x20,0x20, + 0x48,0x61,0x70,0x47,0x00,0x40,0x00,0x30,0xF8,0xB5,0x01,0x22,0x52,0x07,0x11,0x68, + 0x3D,0x48,0x01,0x29,0x80,0x7A,0x01,0xD1,0x01,0x25,0x03,0xE0,0x11,0x68,0x01,0x29, + 0x06,0xD9,0x02,0x25,0x00,0x28,0x0B,0xD0,0x00,0x21,0x25,0x27,0x7F,0x01,0x3B,0xE0, + 0x00,0x28,0x05,0xD1,0x34,0x48,0x09,0x22,0x00,0x21,0x08,0x38,0x01,0xF0,0xFC,0xFB, + 0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4A,0x19,0x00,0x24,0x92,0x00,0x10,0x18,0x02,0x68, + 0x84,0x46,0x90,0x0F,0xC0,0x07,0x26,0xD0,0x01,0x20,0x93,0x00,0x1B,0x0F,0x2B,0x4E, + 0x36,0x18,0xF6,0x19,0x36,0x7E,0x9E,0x42,0x01,0xD1,0x04,0x00,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xF4,0xD9,0x00,0x2C,0x06,0xD0,0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43, + 0x80,0x08,0x02,0x43,0x0D,0xE0,0x21,0x4C,0x01,0x20,0x26,0x18,0xF6,0x19,0x36,0x7E, + 0x00,0x2E,0x03,0xD1,0x24,0x18,0xE4,0x19,0x23,0x76,0xED,0xE7,0x40,0x1C,0x08,0x28, + 0xF3,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68,0x8A,0x42, + 0xC9,0xD8,0x00,0x21,0x21,0xE0,0x4A,0x19,0x92,0x00,0x10,0x18,0x02,0x68,0x84,0x46, + 0x90,0x0F,0xC0,0x07,0x18,0xD1,0x11,0x4E,0x01,0x20,0x93,0x00,0x1C,0x0F,0x33,0x18, + 0xDB,0x19,0x1B,0x7E,0xA3,0x42,0x0A,0xD1,0x34,0x18,0x00,0x23,0xE4,0x19,0x23,0x76, + 0x0F,0x23,0x9B,0x06,0x00,0x07,0x9A,0x43,0x80,0x08,0x02,0x43,0x02,0xE0,0x40,0x1C, + 0x08,0x28,0xEC,0xD9,0x60,0x46,0x02,0x60,0x49,0x1C,0x01,0x20,0x40,0x07,0x02,0x68, + 0x8A,0x42,0xD8,0xD8,0x9C,0xE7,0x00,0x00,0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20, + 0x03,0x23,0x1B,0x07,0xDA,0x68,0x01,0x21,0x81,0x40,0x8A,0x43,0xDA,0x60,0x70,0x47, + 0x10,0xB4,0x0F,0x24,0x03,0x23,0x1B,0x07,0x1C,0x60,0x05,0x4C,0x60,0x63,0x19,0x61, + 0x9A,0x60,0x00,0x20,0xC0,0x43,0xD8,0x60,0x00,0x20,0x18,0x60,0x10,0xBC,0x70,0x47, + 0x40,0x00,0x00,0x30,0x03,0x4B,0x00,0xB5,0x82,0x00,0x99,0x50,0xFF,0xF7,0xE0,0xFF, + 0x08,0xBC,0x18,0x47,0x2C,0x0B,0x00,0x20,0xF0,0xB5,0x85,0xB0,0xFE,0xF7,0xB8,0xFB, + 0xFE,0xF7,0x96,0xFB,0x02,0xF0,0xE0,0xF9,0x00,0xF0,0xDA,0xFD,0x00,0xF0,0xFA,0xFB, + 0xFE,0xF7,0x08,0xF8,0xFD,0xF7,0x46,0xFA,0x38,0x49,0x37,0x48,0xC9,0x88,0x40,0x7F, + 0x49,0x06,0x02,0xD4,0x34,0x48,0xC0,0x38,0x40,0x7E,0x00,0x28,0x04,0xD1,0xFF,0xF7, + 0x43,0xFA,0xFF,0xF7,0xED,0xF9,0x03,0xE0,0xFF,0xF7,0xEA,0xF9,0xFF,0xF7,0x3C,0xFA, + 0x02,0xF0,0xE0,0xFC,0x02,0xF0,0x48,0xFB,0x01,0x26,0x76,0x07,0x30,0x68,0x00,0x28, + 0x07,0xD0,0x70,0x68,0x80,0x0F,0x80,0x07,0x03,0xD5,0x35,0x68,0x02,0x24,0x6D,0x1C, + 0x37,0xE0,0x01,0x24,0x25,0x00,0xA0,0x00,0x87,0x19,0x38,0x68,0x81,0x01,0x04,0x90, + 0x80,0x05,0x80,0x0D,0x02,0x90,0x22,0x48,0x89,0x0D,0x03,0x91,0x00,0x78,0x00,0x28, + 0x03,0xD1,0x02,0xA9,0x03,0xA8,0x02,0xF0,0x6B,0xFB,0x1E,0x4B,0x00,0x21,0x58,0x8C, + 0x40,0x1E,0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x18,0x8C,0x0A,0x00,0x02,0xA9, + 0x40,0x1E,0x03,0x04,0x1B,0x0C,0x03,0xA8,0x03,0xF0,0xD2,0xFA,0x02,0xA9,0x03,0xA8, + 0x03,0xF0,0xA6,0xF9,0x14,0x49,0x04,0x98,0x08,0x40,0x03,0x99,0x89,0x05,0x89,0x09, + 0x08,0x43,0x02,0x99,0x80,0x0A,0x80,0x02,0x89,0x05,0x89,0x0D,0x08,0x43,0x38,0x60, + 0x64,0x1C,0xAC,0x42,0xC7,0xD9,0x30,0x68,0xFC,0xF7,0x5A,0xFF,0xFD,0xF7,0x3E,0xFE, + 0x02,0xF0,0xCA,0xFA,0xFF,0xF7,0xE0,0xFE,0xFC,0xF7,0x9E,0xFE,0x03,0x48,0x40,0x79, + 0x05,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x03,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xFF,0xFF,0x00,0xFC,0xF8,0xB5,0x02,0xF0, + 0x3F,0xF9,0xFE,0xF7,0xCD,0xFD,0xFE,0xF7,0x5B,0xFE,0xFE,0xF7,0xA3,0xFE,0x1A,0x48, + 0x00,0x21,0xC0,0x7F,0x03,0xF0,0xE0,0xF8,0x18,0x4F,0x19,0x4D,0xFC,0x03,0x00,0x20, + 0x28,0x70,0xE8,0x61,0xE8,0x79,0x00,0x28,0x1A,0xD0,0x01,0x26,0x15,0xE0,0x78,0x68, + 0x00,0x07,0x12,0xD5,0xA6,0x63,0xF8,0x68,0x07,0x28,0x06,0xD1,0x02,0xF0,0x78,0xFA, + 0xFF,0xF7,0x22,0xF9,0xFF,0x20,0xE0,0x63,0x07,0xE0,0x0B,0x28,0x10,0xD1,0xE0,0x63, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0x02,0xF0,0x6B,0xFA,0xE0,0x6B,0x0B,0x28,0xE6,0xD1, + 0xFE,0xF7,0xE8,0xF9,0x28,0x78,0x00,0x28,0xD9,0xD0,0x01,0xF0,0x23,0xFF,0xD6,0xE7, + 0x78,0x68,0x80,0x07,0xFC,0xD5,0xEE,0xE7,0x00,0x78,0x00,0x00,0x00,0x40,0x00,0x30, + 0xF8,0x0A,0x00,0x20,0x70,0xB5,0x21,0x49,0x1F,0x4A,0xCB,0x88,0x05,0x00,0x10,0x7A, + 0x1F,0x49,0x5C,0x06,0x00,0xD4,0x08,0x79,0x1E,0x4C,0xA4,0x8A,0x00,0x19,0x06,0x06, + 0xD0,0x79,0x36,0x0E,0x5A,0x06,0x00,0xD4,0xC8,0x78,0x1B,0x49,0x2C,0x78,0x4A,0x7C, + 0x00,0x2A,0x0F,0xD1,0x8A,0x7C,0x00,0x2A,0x01,0xD0,0x80,0x1C,0x08,0xE0,0xCA,0x7C, + 0x00,0x2A,0x01,0xD0,0x00,0x1D,0x03,0xE0,0x09,0x7D,0x00,0x29,0x02,0xD0,0x80,0x1D, + 0x00,0x06,0x00,0x0E,0x00,0x2C,0x0A,0xD0,0x84,0x42,0x08,0xD3,0x14,0x21,0x20,0x00, + 0xFC,0xF7,0xD0,0xFD,0x76,0x1C,0xB0,0x42,0x05,0xD2,0x14,0x2C,0x07,0xD3,0x00,0x20, + 0x70,0xBC,0x08,0xBC,0x18,0x47,0x14,0x2C,0x01,0xD3,0xF0,0x20,0x00,0xE0,0x13,0x20, + 0x28,0x70,0x01,0x20,0xF4,0xE7,0x00,0x00,0x20,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20, + 0x60,0x79,0x00,0x00,0xD0,0x0A,0x00,0x20,0x70,0x08,0x00,0x20,0x10,0xB5,0x08,0x24, + 0x20,0x00,0xFE,0xF7,0x5B,0xFA,0x64,0x1E,0xFA,0xD5,0x05,0x48,0x01,0x22,0x41,0x7C, + 0x01,0x29,0x01,0xD8,0x00,0x29,0x00,0xD1,0x42,0x74,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0xA0,0x78,0x00,0x00,0x19,0x22,0x10,0xB5,0x06,0x48,0x52,0x01,0x00,0x21,0x01,0xF0, + 0x3B,0xFA,0x51,0x22,0x04,0x48,0xD2,0x00,0x00,0x21,0x01,0xF0,0x35,0xFA,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0xC8,0x02,0x00,0x20,0x40,0x00,0x00,0x20,0x10,0xB5,0x40,0x22, + 0xD4,0x05,0x00,0x21,0x20,0x00,0x01,0xF0,0x27,0xFA,0x01,0x20,0xA0,0x63,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x14,0x48,0x10,0xB5,0x44,0x08,0x14,0x49,0x14,0x48,0x62,0x00, + 0x01,0xF0,0x06,0xFA,0x10,0x48,0xC0,0x07,0x08,0xD0,0x0F,0x48,0xC2,0x07,0x0F,0x48, + 0xD2,0x0F,0x01,0x19,0x0E,0x48,0x00,0x19,0x01,0xF0,0xF2,0xF9,0x0D,0x48,0x00,0x21, + 0x84,0x08,0x0D,0x48,0xA2,0x00,0x01,0xF0,0x0F,0xFA,0x0A,0x48,0x80,0x07,0x07,0xD0, + 0x08,0x48,0x00,0x21,0x82,0x07,0x08,0x48,0x92,0x0F,0x00,0x19,0x01,0xF0,0xFC,0xF9, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xA4,0x71,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x46,0x06,0x00,0x00,0xF0,0x05,0x00,0x20,0x33,0x21,0x09,0x05, + 0x01,0x20,0x80,0x07,0x41,0x62,0x04,0x49,0x81,0x62,0x04,0x48,0xFF,0x21,0xC1,0x60, + 0x00,0x21,0x41,0x61,0x70,0x47,0x00,0x00,0x88,0x88,0x88,0x88,0x00,0x20,0x00,0x40, + 0x02,0x49,0x03,0x48,0x01,0x60,0x20,0x21,0x41,0x60,0x70,0x47,0xDE,0x10,0x01,0x00, + 0x00,0x40,0x00,0x30,0x10,0xB5,0x00,0x24,0x20,0x00,0xFE,0xF7,0x4B,0xFA,0x64,0x1C, + 0x08,0x2C,0xF9,0xDB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x10,0xB5,0x01,0x24, + 0x64,0x03,0x20,0x00,0xFD,0xF7,0x5C,0xF8,0xFE,0xF7,0xE2,0xFC,0xFE,0xF7,0x0C,0xFD, + 0xFE,0xF7,0xD6,0xFC,0x07,0x48,0x01,0x68,0xF0,0x22,0x91,0x43,0x06,0x4A,0x12,0x7B, + 0x12,0x07,0x12,0x0E,0x11,0x43,0x01,0x60,0x20,0x00,0xFD,0xF7,0x41,0xF8,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0xA0,0x00,0x40,0x00,0x78,0x00,0x00,0x10,0xB5,0x01,0xF0, + 0xE7,0xFF,0x01,0xF0,0xC7,0xFF,0xFF,0x20,0xFD,0xF7,0x72,0xF8,0xFF,0xF7,0xAE,0xFF, + 0x11,0x48,0x80,0x22,0x00,0x21,0x01,0xF0,0x9F,0xF9,0x08,0x20,0xFD,0xF7,0x30,0xF8, + 0x00,0x22,0x0E,0x49,0xD2,0x43,0x00,0x20,0xFF,0xF7,0x02,0xFE,0x00,0xF0,0x1A,0xF8, + 0x0B,0x48,0x40,0x7A,0x00,0x28,0x04,0xD0,0x40,0x20,0xFD,0xF7,0x21,0xF8,0x00,0xF0, + 0x4D,0xF8,0x00,0xF0,0x37,0xF8,0x10,0x20,0x01,0xF0,0xB5,0xFF,0xFE,0xF7,0x10,0xFE, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x2C,0x0B,0x00,0x20,0x02,0x03,0x0F,0x0F, + 0x00,0x78,0x00,0x00,0xF8,0xB5,0x03,0x24,0xE6,0x01,0x13,0x25,0x30,0x00,0xFD,0xF7, + 0x07,0xF8,0x20,0x02,0xFD,0xF7,0x2E,0xF8,0x0C,0x48,0x0A,0x21,0x00,0x6B,0xFC,0xF7, + 0xC1,0xFC,0x02,0x00,0xFF,0x21,0x90,0x31,0x02,0x20,0x00,0x23,0x00,0x95,0x03,0xF0, + 0x1B,0xF8,0x07,0x4A,0x27,0x21,0x03,0x20,0x00,0x23,0x00,0x94,0x03,0xF0,0x14,0xF8, + 0x30,0x00,0xFC,0xF7,0xE5,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0xE8,0xFD,0x00,0x00,0x10,0xB5,0x08,0x49,0x00,0x20,0xFF,0xF7,0xCB,0xFD,0x03,0xF0, + 0xF8,0xF8,0x7D,0x20,0xC0,0x00,0x03,0xF0,0xE7,0xF8,0x00,0x20,0xFF,0xF7,0xA8,0xFD, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x7D,0x70,0x00,0x00,0x0A,0x48,0x10,0xB5, + 0x00,0x6B,0x0A,0x49,0x0A,0x4C,0x88,0x42,0x05,0xD9,0x7D,0x21,0xC9,0x00,0xFC,0xF7, + 0x89,0xFC,0x64,0x30,0x01,0xE0,0xFF,0x20,0xF5,0x30,0x20,0x63,0x03,0xF0,0xA2,0xF8, + 0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x07,0xA5,0x07,0x00, + 0xF8,0x0A,0x00,0x20,0x10,0xB5,0xFF,0xF7,0xD5,0xFE,0xFF,0xF7,0x43,0xFF,0x15,0x48, + 0x00,0x7A,0x02,0xF0,0x07,0xFF,0x13,0x48,0x13,0x4A,0xA0,0x30,0x41,0x89,0x00,0x24, + 0xD1,0x83,0x12,0x49,0x0C,0x60,0x4C,0x60,0x11,0x49,0xD2,0x88,0x49,0x79,0x52,0x06, + 0x02,0xD4,0x01,0x00,0xA0,0x31,0x49,0x78,0x0C,0x4A,0xC0,0x3A,0x51,0x73,0x09,0x49, + 0x80,0x31,0x0A,0x8B,0x09,0x49,0x40,0x39,0xCA,0x62,0x00,0x88,0x08,0x63,0xFF,0xF7, + 0x9D,0xFE,0x08,0x48,0xC4,0x83,0xFE,0xF7,0x19,0xFB,0x07,0x48,0x04,0x70,0x10,0xBC, + 0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xF0,0x0A,0x00,0x20, + 0x00,0x7A,0x00,0x00,0x30,0x07,0x00,0x20,0xF9,0x0A,0x00,0x20,0xF7,0xB5,0x86,0xB0, + 0x00,0x27,0x2E,0x48,0x04,0xAB,0x02,0x97,0x03,0x97,0x81,0xC3,0x2C,0x4E,0xFE,0xF7, + 0xE9,0xFB,0xFE,0xF7,0x97,0xFC,0x2B,0x48,0x40,0x7F,0x01,0x90,0x29,0x48,0x20,0x38, + 0x40,0x7F,0x00,0x25,0x00,0x90,0x2A,0xE0,0x00,0x24,0x23,0xE0,0x21,0x00,0x28,0x00, + 0xFF,0xF7,0x38,0xFB,0x00,0x28,0x1C,0xD0,0x23,0x49,0x04,0x9A,0x09,0x78,0x69,0x43, + 0x09,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x01,0x1E,0x00,0xDC, + 0x41,0x42,0x00,0x28,0x01,0xDB,0x01,0x98,0x00,0xE0,0x00,0x98,0x81,0x42,0x01,0xDD, + 0x01,0x22,0x05,0x92,0x08,0x1A,0xB0,0x42,0x03,0xDD,0x06,0x00,0x27,0x00,0x02,0x95, + 0x03,0x91,0x64,0x1C,0x14,0x48,0x00,0x78,0x84,0x42,0xD7,0xD3,0x6D,0x1C,0x13,0x48, + 0x00,0x78,0x85,0x42,0xD0,0xD3,0x08,0x99,0x03,0x98,0x08,0x60,0x10,0x48,0x00,0x69, + 0xC0,0x07,0x05,0xD0,0x07,0x98,0x07,0x60,0x06,0x99,0x02,0x98,0x08,0x60,0x04,0xE0, + 0x07,0x99,0x02,0x98,0x08,0x60,0x06,0x98,0x07,0x60,0x05,0x98,0x00,0x28,0x00,0xD0, + 0x04,0x20,0x09,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x00,0x02,0x10,0x40, + 0x78,0xEC,0xFF,0xFF,0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x00,0x90,0x00,0x40,0x78,0x47,0xC0,0x46,0x68,0x20,0x9F,0xE5,0x04,0xE0,0x2D,0xE5, + 0x5A,0x04,0xD2,0xE5,0x58,0xC0,0x9F,0xE5,0x01,0x00,0x10,0xE3,0x12,0x00,0x00,0x0A, + 0x54,0x10,0x9F,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x30,0xD1,0xE5,0x0B,0x00,0x00,0xEA, + 0x5A,0xE4,0xD2,0xE5,0x00,0x10,0x82,0xE0,0x89,0x14,0xD1,0xE5,0x02,0x00,0x1E,0xE3, + 0x88,0xE4,0xD2,0xE5,0x9E,0x13,0x21,0x00,0x93,0xE1,0x21,0x10,0x01,0x11,0x9C,0xE7, + 0x80,0xE0,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x00,0x80,0xE2,0xB0,0x11,0xCE,0xE1, + 0x5B,0x14,0xD2,0xE5,0x00,0x00,0x51,0xE1,0xF0,0xFF,0xFF,0x8A,0x04,0xE0,0x9D,0xE4, + 0x1E,0xFF,0x2F,0xE1,0x00,0x10,0x10,0x40,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20, + 0xFF,0xB5,0x4E,0x4C,0x85,0xB0,0x24,0x78,0x0F,0x99,0x0E,0x9A,0x02,0x94,0x4C,0x4C, + 0xD7,0x00,0x26,0x79,0x00,0x20,0x05,0x00,0xB6,0x00,0x34,0x19,0xE0,0x34,0x10,0x26, + 0xA6,0x5F,0xB6,0x46,0x12,0x26,0xA6,0x5F,0xB4,0x46,0x76,0x46,0xB6,0x1C,0x34,0x04, + 0x24,0x14,0x66,0x46,0xB6,0x1C,0x01,0x94,0x34,0x04,0x24,0x14,0x00,0x94,0x3F,0x4C, + 0x07,0x9E,0x24,0x78,0x03,0x97,0x24,0x1D,0x04,0x94,0x06,0x9C,0x3C,0x19,0x01,0x2E, + 0x12,0xD0,0x02,0x2E,0x1B,0xD0,0x03,0x2E,0x54,0xD0,0x04,0x2E,0x26,0xD1,0x04,0x9D, + 0x00,0x98,0x02,0x9E,0x68,0x43,0x01,0x9D,0xED,0x18,0x40,0x19,0x05,0x06,0x2D,0x0E, + 0x60,0x46,0x70,0x43,0xE6,0x88,0x16,0xE0,0x00,0x98,0x04,0x9D,0xC0,0x1A,0x68,0x43, + 0x01,0x9D,0x06,0x9E,0x40,0x19,0x05,0x06,0xF0,0x5B,0x2D,0x0E,0x08,0xE0,0x00,0x98, + 0x04,0x9D,0xC0,0x18,0x68,0x43,0x01,0x9D,0x40,0x19,0x05,0x06,0x60,0x88,0x2D,0x0E, + 0x02,0x9E,0x70,0x43,0x76,0x46,0x80,0x19,0x00,0x06,0x00,0x0E,0x25,0x4E,0x6D,0x00, + 0x75,0x5F,0x25,0x4E,0x16,0x27,0xF7,0x5F,0xBD,0x42,0x3D,0xDD,0x07,0x9D,0x01,0x2D, + 0x2D,0xD0,0x02,0x2D,0x31,0xD0,0x03,0x2D,0x32,0xD0,0x04,0x2D,0x06,0xD1,0x73,0x44, + 0xE3,0x80,0x0B,0x00,0x00,0xD1,0x13,0x00,0x05,0x9C,0x23,0x54,0x18,0x4C,0x53,0x00, + 0x1B,0x19,0xFF,0x33,0x41,0x33,0x00,0x29,0x04,0xD0,0x05,0x99,0x52,0x1E,0x08,0x5C, + 0x90,0x42,0x02,0xD0,0xD8,0x88,0x40,0x1C,0xD8,0x80,0x01,0x20,0x09,0xB0,0xF0,0xBC, + 0x08,0xBC,0x18,0x47,0x04,0x9D,0x00,0x98,0x02,0x9E,0x68,0x43,0x01,0x9D,0x40,0x19, + 0xC0,0x1A,0x05,0x06,0x2D,0x0E,0x60,0x46,0x70,0x43,0xA6,0x88,0xC3,0xE7,0x64,0x46, + 0xE3,0x1A,0x06,0x9D,0x03,0x9C,0x2B,0x53,0xD3,0xE7,0x63,0x44,0x63,0x80,0xD0,0xE7, + 0x75,0x46,0xEB,0x1A,0xA3,0x80,0xCC,0xE7,0x00,0x20,0xDF,0xE7,0xFB,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xC8,0x02,0x00,0x20,0x30,0x07,0x00,0x20,0x88,0x42,0x00,0xDA, + 0x08,0x00,0x70,0x47,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA,0x10,0x00, + 0x70,0x47,0x10,0xB5,0x02,0x9C,0x88,0x42,0x00,0xDA,0x08,0x00,0x90,0x42,0x00,0xDA, + 0x10,0x00,0x22,0x00,0x19,0x00,0xFF,0xF7,0xED,0xFF,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x02,0x00,0x08,0x00,0x8A,0x42,0x00,0xDC, + 0x10,0x00,0x70,0x47,0xF0,0xB5,0xE6,0x48,0xE6,0x4F,0x86,0x89,0xF8,0x88,0xFD,0xB0, + 0x41,0x06,0x02,0xD4,0xE2,0x49,0xC0,0x39,0x0E,0x89,0xE3,0x49,0x09,0x78,0x74,0x91, + 0xE2,0x49,0x0A,0x78,0x74,0x99,0x91,0x42,0x73,0x92,0x00,0xD8,0x11,0x00,0x72,0x91, + 0x00,0x21,0x6D,0x91,0x6C,0x91,0xDA,0x49,0xDD,0x4D,0x20,0x39,0x7C,0x91,0x8C,0x8B, + 0x40,0x06,0x00,0xD4,0x2C,0x8B,0xDB,0x48,0x08,0x22,0x00,0x21,0x00,0xF0,0x44,0xFF, + 0xD8,0x48,0x10,0x22,0x00,0x21,0x08,0x30,0x00,0xF0,0x3E,0xFF,0xFF,0x22,0x01,0x32, + 0x00,0x21,0x2C,0xA8,0x00,0xF0,0x38,0xFF,0x48,0x22,0x00,0x21,0x1A,0xA8,0x00,0xF0, + 0x33,0xFF,0x20,0x22,0x00,0x21,0x12,0xA8,0x00,0xF0,0x2E,0xFF,0x20,0x22,0x00,0x21, + 0x0A,0xA8,0x00,0xF0,0x29,0xFF,0x20,0x22,0x00,0x21,0x02,0xA8,0x00,0xF0,0x24,0xFF, + 0xC4,0x48,0x64,0x21,0x00,0x89,0x07,0x00,0x70,0x43,0xFC,0xF7,0xA1,0xF9,0xC5,0x49, + 0xC0,0x4A,0x89,0x1C,0x7B,0x91,0xBF,0x49,0xC9,0x89,0x40,0x18,0x7B,0x99,0xC8,0x82, + 0xC1,0x48,0x00,0x21,0x01,0x81,0x7C,0x99,0xD2,0x88,0x89,0x7F,0x06,0x00,0x38,0x00, + 0x52,0x06,0x00,0xD4,0xA9,0x7E,0x48,0x43,0x64,0x21,0xFC,0xF7,0x63,0xFA,0x00,0x04, + 0x00,0x14,0xA0,0x42,0x70,0x81,0x00,0xDA,0x74,0x81,0xB2,0x48,0x01,0x79,0x00,0x29, + 0x7D,0xD0,0x00,0x27,0xDC,0xE0,0xAF,0x48,0xB9,0x00,0x08,0x18,0xE0,0x30,0x10,0x25, + 0x12,0x21,0x45,0x5F,0x41,0x5E,0x01,0x20,0x7E,0x1C,0x75,0x91,0x6F,0x90,0x6E,0x90, + 0x71,0x90,0x70,0x90,0xF0,0x00,0x1A,0xAA,0x7A,0x90,0x11,0x52,0x80,0x18,0x75,0x99, + 0x79,0x90,0x41,0x80,0x85,0x80,0x00,0x2F,0xC5,0x80,0x20,0xDD,0x38,0x00,0x1A,0xAC, + 0x1A,0xE0,0xC2,0x00,0x11,0x19,0x04,0x23,0xCB,0x5E,0xAB,0x42,0x13,0xDC,0x06,0x23, + 0xCB,0x5E,0xAB,0x42,0x0F,0xDB,0xA2,0x5E,0x75,0x9B,0x9A,0x42,0x0B,0xDC,0x02,0x22, + 0x8A,0x5E,0x9A,0x42,0x07,0xDB,0x01,0x06,0x09,0x0E,0x6D,0x91,0x6C,0x99,0x49,0x1C, + 0x09,0x06,0x09,0x0E,0x6C,0x91,0x40,0x1E,0x00,0x28,0xE2,0xDC,0x01,0xE0,0x00,0x20, + 0x6D,0x90,0x00,0x24,0x5C,0xE0,0x6F,0x98,0x01,0x28,0x0D,0xD1,0xA5,0x42,0x0B,0xDB, + 0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x01,0x22,0x1A,0xA9, + 0x2C,0xA8,0xFF,0xF7,0x75,0xFE,0x00,0xE0,0x00,0x20,0x00,0x2C,0x6F,0x90,0x3E,0xDD, + 0x6E,0x98,0x01,0x28,0x10,0xD1,0x75,0x98,0x73,0x99,0x00,0x19,0x88,0x42,0x0B,0xDA, + 0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x02,0x22,0x1A,0xA9, + 0x2C,0xA8,0xFF,0xF7,0x5D,0xFE,0x00,0xE0,0x00,0x20,0x6E,0x90,0x71,0x98,0x01,0x28, + 0x0E,0xD1,0xA5,0x42,0x0C,0xDB,0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0, + 0x23,0x00,0x03,0x22,0x1A,0xA9,0x2C,0xA8,0xFF,0xF7,0x4A,0xFE,0x01,0xE0,0xDB,0xE0, + 0x00,0x20,0x71,0x90,0x70,0x98,0x01,0x28,0x0F,0xD1,0x74,0x99,0x28,0x19,0x88,0x42, + 0x0B,0xDA,0x31,0x06,0x6D,0x9A,0x09,0x0E,0x68,0x46,0x06,0xC0,0x23,0x00,0x04,0x22, + 0x1A,0xA9,0x2C,0xA8,0xFF,0xF7,0x34,0xFE,0x00,0xE0,0x00,0x20,0x70,0x90,0x6E,0x99, + 0x6F,0x98,0x08,0x43,0x71,0x99,0x08,0x43,0x70,0x99,0x08,0x43,0x03,0xD0,0x64,0x1C, + 0x72,0x98,0x84,0x42,0x9F,0xDB,0x6D,0x98,0x00,0x28,0x38,0xD0,0x5D,0x49,0x40,0x00, + 0x40,0x18,0x72,0x00,0x52,0x18,0xFF,0x30,0xFF,0x32,0x41,0x30,0x41,0x32,0xC3,0x88, + 0xD1,0x88,0x59,0x18,0xC1,0x80,0x7A,0x98,0x1A,0xAB,0x19,0x5E,0x6D,0x98,0xC0,0x00, + 0x1C,0x5E,0xA1,0x42,0x00,0xDA,0x19,0x52,0x79,0x9C,0x02,0x21,0x61,0x5E,0xC0,0x18, + 0x02,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDD,0x41,0x80,0x79,0x9C,0x04,0x21,0x61,0x5E, + 0x04,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDA,0x81,0x80,0x79,0x9C,0x06,0x21,0x61,0x5E, + 0x06,0x24,0x04,0x5F,0xA1,0x42,0x00,0xDD,0xC1,0x80,0x00,0x20,0xD0,0x80,0x7A,0x99, + 0x58,0x52,0x79,0x99,0x48,0x80,0x79,0x99,0x88,0x80,0x79,0x99,0xC8,0x80,0x7F,0x1C, + 0x40,0x48,0x01,0x79,0xB9,0x42,0x00,0xDD,0x1D,0xE7,0x02,0x79,0x6C,0x99,0x51,0x1A, + 0x01,0x24,0x01,0x71,0x6C,0xE0,0xE0,0x00,0x1A,0xA9,0x0B,0x5E,0x41,0x18,0x02,0x20, + 0x77,0x91,0x08,0x5E,0x9B,0x1C,0x80,0x1C,0x76,0x90,0x41,0xE0,0x77,0x98,0x04,0x21, + 0x41,0x5E,0x02,0x00,0x06,0x20,0x10,0x5E,0x89,0x1C,0x80,0x1C,0x78,0x90,0x33,0xE0, + 0x74,0x9A,0x98,0x1E,0x84,0x46,0x50,0x43,0x8D,0x1E,0x2C,0xAA,0x52,0x19,0x80,0x5C, + 0x00,0x28,0x27,0xD0,0x74,0x98,0x31,0x4E,0x00,0x1D,0x58,0x43,0x40,0x18,0x40,0x00, + 0x30,0x5E,0x7B,0x9F,0x16,0x26,0xBE,0x5F,0x00,0x22,0xB0,0x42,0x00,0xDD,0x82,0x1B, + 0x24,0x4F,0x6D,0x00,0xED,0x19,0x2D,0x8C,0xA0,0x00,0x12,0xAE,0x55,0x43,0x36,0x58, + 0x75,0x19,0x12,0xAE,0x35,0x50,0x66,0x46,0x76,0x00,0xF6,0x19,0x40,0x36,0xB6,0x88, + 0x0A,0xAD,0x2D,0x58,0x56,0x43,0xAD,0x19,0x0A,0xAE,0x35,0x50,0x02,0xAD,0x2E,0x58, + 0xB2,0x18,0x2A,0x50,0x78,0x98,0x49,0x1C,0x88,0x42,0xC9,0xDA,0x76,0x98,0x5B,0x1C, + 0x98,0x42,0xBB,0xDA,0xA5,0x00,0x02,0xA8,0x46,0x59,0x00,0x2E,0x12,0xD0,0x12,0xA8, + 0x40,0x59,0x31,0x00,0xFC,0xF7,0x16,0xF9,0x0E,0x49,0x62,0x00,0x57,0x18,0xFF,0x21, + 0x1F,0x31,0xC8,0x53,0x0A,0xA8,0x40,0x59,0x31,0x00,0xFC,0xF7,0x0B,0xF9,0xFF,0x37, + 0x21,0x37,0xF8,0x81,0x07,0x48,0x00,0x19,0xFF,0x30,0x21,0x30,0x44,0x77,0x64,0x1C, + 0x04,0x48,0x00,0x79,0xA0,0x42,0x8E,0xDA,0x7D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x7A,0x00,0x00,0xF0,0x05,0x00,0x20,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20, + 0x20,0x79,0x00,0x00,0x2E,0x07,0x00,0x20,0x30,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0xB5,0x00,0x20,0xE7,0xB0,0x42,0x90,0x32,0x90,0x0D,0x90,0xFF,0x48,0x66,0x90, + 0x02,0x8A,0xFF,0x49,0xC8,0x88,0x43,0x06,0x02,0xD4,0xFC,0x4A,0xC0,0x3A,0x92,0x89, + 0xFA,0x4D,0xFC,0x4C,0x20,0x35,0x0C,0x92,0xAA,0x89,0x43,0x06,0x00,0xD4,0x22,0x89, + 0xF9,0x4B,0x0B,0x92,0xF5,0x4A,0x40,0x32,0x65,0x92,0x52,0x89,0x46,0x06,0x64,0x93, + 0x00,0xD4,0xDA,0x88,0x43,0x06,0x0A,0x92,0x65,0x9A,0x12,0x79,0x01,0xD4,0x64,0x9A, + 0x12,0x78,0x43,0x06,0x09,0x92,0x65,0x9A,0x52,0x79,0x01,0xD4,0x64,0x9A,0x52,0x78, + 0x43,0x06,0x08,0x92,0x65,0x9A,0x12,0x8B,0x01,0xD4,0x64,0x9A,0x92,0x8A,0x40,0x06, + 0x07,0x92,0x2F,0x89,0x00,0xD4,0xA7,0x88,0xE8,0x48,0x29,0x22,0x06,0x78,0xE8,0x48, + 0x00,0x78,0x06,0x90,0xE2,0x48,0xC0,0x89,0x05,0x90,0x01,0x20,0x04,0x90,0x00,0x20, + 0x01,0x00,0x02,0x90,0x0E,0xA8,0x00,0xF0,0x3F,0xFD,0xE2,0x48,0xDC,0x49,0x08,0x81, + 0xDB,0x48,0x00,0x21,0x81,0x81,0x41,0x81,0xC0,0x30,0x63,0x90,0x41,0x80,0xA0,0x30, + 0x62,0x90,0x40,0x78,0xDC,0x49,0x02,0x28,0x61,0x91,0x53,0xD9,0xD4,0x4A,0x69,0x8A, + 0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x89,0x36,0x91,0xD8,0x49,0x36,0x9A,0x60,0x91, + 0x89,0x8B,0x89,0x18,0x37,0x91,0x0C,0x99,0xC9,0x04,0x25,0xD5,0x01,0x28,0x0C,0xD9, + 0xCB,0x4A,0xE9,0x7A,0xD2,0x88,0x52,0x06,0x00,0xD4,0xE1,0x79,0x48,0x43,0x00,0x06, + 0x00,0x0E,0x04,0x90,0x01,0xD1,0x01,0x20,0x04,0x90,0x63,0x99,0xC4,0x4A,0x00,0x20, + 0x08,0x5E,0xD2,0x88,0xA9,0x7A,0x52,0x06,0x00,0xD4,0xA1,0x79,0x48,0x43,0x64,0x21, + 0xFB,0xF7,0x86,0xFF,0x00,0x04,0x00,0x0C,0xB8,0x42,0x00,0xD2,0x38,0x00,0x04,0x99, + 0xFC,0xF7,0x58,0xF8,0x63,0x99,0x48,0x80,0xB9,0x49,0x65,0x98,0xC9,0x88,0x40,0x8B, + 0x49,0x06,0x01,0xD4,0x64,0x98,0xC0,0x8A,0x61,0x99,0x89,0x8B,0x40,0x18,0x37,0x99, + 0x35,0x90,0x88,0x42,0x34,0x91,0x00,0xD2,0x37,0x90,0x02,0x20,0x4D,0x90,0xAF,0x48, + 0xC0,0x30,0x5F,0x90,0xB4,0x48,0xA0,0x38,0x5E,0x90,0x06,0x98,0x80,0x1C,0x53,0x90, + 0x4D,0x98,0x95,0xE3,0x02,0x28,0x08,0xD1,0xA9,0x4A,0x29,0x8A,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0xA1,0x89,0x61,0x9A,0x52,0x8B,0x0E,0xE0,0xAD,0x49,0x09,0x78,0x00,0x29, + 0x02,0xD0,0xAC,0x49,0x89,0x89,0x05,0xE0,0xA1,0x4A,0xE9,0x89,0xD2,0x88,0x52,0x06, + 0x00,0xD4,0x61,0x89,0x61,0x9A,0x12,0x8B,0x89,0x18,0x95,0xE7,0x02,0x24,0xB0,0x1C, + 0x54,0x90,0x6A,0xE3,0x4D,0x98,0x54,0x99,0x40,0x1E,0x48,0x43,0x61,0x1E,0x40,0x18, + 0x00,0x04,0x07,0x14,0xA0,0x49,0x78,0x00,0x5D,0x90,0x08,0x5E,0x37,0x99,0x09,0x04, + 0x09,0x14,0x88,0x42,0x7B,0xDB,0x78,0x1C,0xC1,0x10,0x0E,0xAA,0x52,0x5C,0x41,0x07, + 0x49,0x0F,0x01,0x20,0x88,0x40,0x02,0x40,0xF8,0x10,0x0E,0xA9,0x5C,0x90,0x09,0x5C, + 0x7B,0x07,0x5B,0x0F,0x01,0x20,0x98,0x40,0x01,0x40,0x5B,0x90,0x78,0x1E,0xC3,0x10, + 0x0E,0xAD,0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0, + 0x4F,0xFC,0x01,0x90,0xB8,0x1B,0x41,0x1E,0xCA,0x10,0x0E,0xAB,0x9A,0x5C,0x4B,0x07, + 0x5B,0x0F,0x01,0x21,0x99,0x40,0x0A,0x40,0x83,0x1E,0xD9,0x10,0x0E,0xAD,0x69,0x5C, + 0x5D,0x07,0x6D,0x0F,0x01,0x23,0xAB,0x40,0x19,0x40,0xC0,0x1E,0xC3,0x10,0x0E,0xAD, + 0xEB,0x5C,0x45,0x07,0x6D,0x0F,0x01,0x20,0xA8,0x40,0x18,0x40,0x01,0xF0,0x30,0xFC, + 0x01,0x99,0x01,0xF0,0x2B,0xFC,0x00,0x28,0x39,0xD1,0x7B,0x48,0x32,0x00,0x39,0x00, + 0x02,0x23,0xFE,0xF7,0x29,0xFF,0x37,0x99,0x88,0x42,0xB3,0xDB,0x76,0x49,0x5D,0x9A, + 0x89,0x5E,0x81,0x42,0xF0,0xD1,0x6A,0x4F,0xBA,0x89,0x82,0x42,0x00,0xDA,0xB8,0x81, + 0x5C,0x9A,0x0E,0xAB,0x9A,0x5C,0x5B,0x9D,0x2A,0x43,0x5C,0x9D,0x5A,0x55,0x64,0x4A, + 0x92,0x89,0x82,0x42,0x05,0xD1,0x62,0x48,0x00,0x79,0x40,0x1C,0x00,0x06,0x00,0x0E, + 0x0D,0x90,0x00,0x20,0x05,0x00,0x03,0x90,0x5E,0x98,0x80,0x7E,0xC2,0x07,0x20,0xD0, + 0x80,0x07,0x0D,0xD5,0x30,0x1B,0x40,0x1C,0x00,0xD1,0x75,0x1E,0xA6,0x42,0x04,0xD1, + 0x01,0x22,0x30,0x04,0x52,0x04,0x80,0x1A,0x05,0x43,0x01,0x20,0x10,0xE0,0xA4,0xE0, + 0x4D,0x9A,0x06,0x98,0x80,0x1A,0x40,0x1C,0x01,0xD1,0x06,0x9D,0x6D,0x1E,0x06,0x98, + 0x90,0x42,0x04,0xD1,0x01,0x22,0x00,0x04,0x12,0x05,0x80,0x1A,0x05,0x43,0x02,0x20, + 0x03,0x90,0x28,0x04,0x01,0xD0,0x35,0x98,0x00,0xE0,0x34,0x98,0x00,0x04,0x00,0x14, + 0x81,0x42,0xB2,0xDB,0x4D,0x99,0x30,0x1D,0x41,0x43,0x5A,0x90,0x08,0x19,0x00,0x04, + 0x00,0x14,0x33,0x90,0x0C,0x98,0xC0,0x04,0x0C,0xD5,0x33,0x98,0x4B,0x49,0x40,0x00, + 0x08,0x5E,0x05,0x99,0x40,0x1A,0x00,0x28,0x77,0xDD,0x63,0x9A,0x02,0x21,0x51,0x5E, + 0x81,0x42,0x72,0xDA,0x04,0x20,0x4E,0x90,0x20,0x18,0x59,0x90,0x4E,0x98,0x04,0x27, + 0x80,0x00,0x58,0x90,0x59,0x98,0x00,0x1F,0x0D,0xD4,0x59,0x98,0x00,0x1F,0xB0,0x42, + 0x09,0xDA,0x4D,0x98,0xC0,0x19,0x57,0x90,0x00,0x1F,0x04,0xD4,0x57,0x98,0x06,0x99, + 0x00,0x1F,0x88,0x42,0x07,0xDB,0x14,0x20,0x78,0x43,0x00,0x21,0x19,0xAA,0x80,0x18, + 0x58,0x9A,0x81,0x50,0x27,0xE0,0x05,0x98,0x0C,0x99,0x00,0x04,0x00,0x14,0xC9,0x04, + 0x04,0xD5,0x04,0x99,0xFB,0xF7,0x54,0xFE,0x00,0x04,0x00,0x14,0x57,0x99,0x5A,0x9A, + 0x89,0x1E,0x51,0x43,0x59,0x9A,0x89,0x18,0x2C,0x4A,0x49,0x00,0x89,0x18,0x20,0x39, + 0x89,0x8B,0x08,0x1A,0x00,0x04,0x00,0x14,0x00,0xD5,0x00,0x20,0x07,0x99,0x00,0x29, + 0x03,0xD0,0x88,0x42,0x01,0xDD,0x08,0x04,0x00,0x14,0x14,0x21,0x79,0x43,0x19,0xAA, + 0x89,0x18,0x58,0x9A,0x88,0x50,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xBA,0xD5,0x4E,0x98, + 0x40,0x1E,0x00,0x04,0x00,0x14,0x4E,0x90,0xAE,0xD5,0x33,0x98,0x1B,0x4A,0x40,0x00, + 0x84,0x46,0x80,0x18,0x01,0x00,0x20,0x39,0x1E,0x23,0xCB,0x5E,0x05,0x99,0x59,0x1A, + 0x41,0x91,0x02,0x21,0x41,0x5E,0x05,0x98,0x05,0x9B,0x08,0x1A,0x40,0x90,0x33,0x98, + 0x18,0x21,0x80,0x1B,0x40,0x00,0x80,0x18,0x20,0x38,0x41,0x5E,0xC9,0x1A,0x3F,0x91, + 0x33,0x99,0x89,0x19,0x49,0x00,0x89,0x18,0x1A,0xE0,0x3B,0xE1,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x00,0x79,0x00,0x00,0x20,0x79,0x00,0x00,0xFB,0x0A,0x00,0x20, + 0xFC,0x0A,0x00,0x20,0xFF,0x0F,0x00,0x00,0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20, + 0x04,0x0B,0x00,0x20,0xA0,0x7A,0x00,0x00,0x40,0x00,0x00,0x20,0xC8,0x02,0x00,0x20, + 0x08,0x23,0xCB,0x5E,0x05,0x9F,0xDB,0x1B,0x3E,0x93,0x16,0x23,0xC3,0x5E,0xDB,0x1B, + 0x3D,0x93,0x06,0x23,0xCB,0x5E,0xDB,0x1B,0x3C,0x93,0x1A,0x23,0xC3,0x5E,0xD8,0x1B, + 0x3B,0x90,0x0A,0x20,0x08,0x5E,0x0B,0x99,0xC0,0x1B,0x3A,0x90,0x60,0x46,0x10,0x5E, + 0xC0,0x1B,0x48,0x43,0x64,0x21,0xFB,0xF7,0xD3,0xFD,0x38,0x90,0x26,0x98,0x02,0x04, + 0x24,0x98,0x12,0x14,0x03,0x04,0x21,0x98,0x00,0x92,0x02,0x04,0x20,0x98,0x1B,0x14, + 0x01,0x04,0x1F,0x98,0x12,0x14,0x00,0x04,0x09,0x14,0x00,0x14,0xFF,0xF7,0xB9,0xFB, + 0x07,0x00,0x2B,0x98,0x02,0x04,0x2A,0x98,0x12,0x14,0x01,0x04,0x29,0x98,0x09,0x14, + 0x00,0x04,0x00,0x14,0xFF,0xF7,0xA6,0xFB,0x01,0x00,0x38,0x00,0xFF,0xF7,0x9E,0xFB, + 0x25,0x99,0x7D,0x22,0x52,0x01,0x91,0x42,0x07,0xDD,0x81,0x42,0x05,0xDD,0x08,0x1A, + 0x51,0x10,0x88,0x42,0x01,0xDD,0x01,0x20,0x02,0x90,0xFB,0x48,0xFF,0x21,0xC0,0x88, + 0x09,0x31,0x08,0x42,0x01,0xD1,0xC0,0x06,0x01,0xD5,0x01,0x20,0x02,0x90,0xF7,0x48, + 0x00,0x78,0x00,0x28,0x47,0xD1,0x20,0xA9,0x06,0xC9,0x02,0x2C,0x14,0xD1,0x01,0xF0, + 0xCF,0xFA,0x07,0x00,0x00,0x21,0x26,0x9A,0x08,0x00,0x01,0xF0,0xC9,0xFA,0x2A,0xA9, + 0x06,0xC9,0x3F,0x18,0x00,0x20,0x01,0xF0,0xC3,0xFA,0x38,0x18,0x05,0x21,0xFB,0xF7, + 0x7F,0xFD,0x00,0x04,0x00,0x0C,0x13,0xE0,0x1F,0x98,0x01,0xF0,0xB9,0xFA,0x07,0x00, + 0x26,0x9A,0x24,0x98,0x00,0x21,0x01,0xF0,0xB3,0xFA,0x3F,0x18,0x29,0xA8,0x07,0xC8, + 0x01,0xF0,0xAE,0xFA,0x38,0x18,0xC1,0x17,0x49,0x0F,0x08,0x18,0x40,0x03,0x00,0x0C, + 0x25,0x99,0x09,0x1A,0x00,0x29,0x01,0xDC,0x25,0x99,0x41,0x1A,0x5F,0x98,0x02,0x8A, + 0xD9,0x48,0xC0,0x88,0x43,0x06,0x01,0xD4,0x66,0x9A,0x92,0x89,0x91,0x42,0x0A,0xDA, + 0x5F,0x99,0x25,0x9A,0x49,0x8A,0x40,0x06,0x01,0xD4,0x66,0x98,0xC1,0x89,0x8A,0x42, + 0x01,0xDA,0x28,0x04,0x7E,0xD0,0x00,0x2D,0x2B,0xD0,0x03,0x98,0xC0,0x07,0x16,0xD0, + 0x04,0x20,0x00,0x22,0x19,0xAB,0x29,0x04,0x06,0xD0,0x14,0x27,0x01,0x00,0x79,0x43, + 0x5A,0x50,0xC9,0x18,0x4A,0x60,0x05,0xE0,0x14,0x27,0x01,0x00,0x79,0x43,0xC9,0x18, + 0xCA,0x60,0x0A,0x61,0x40,0x1E,0x00,0x04,0x00,0x14,0xEC,0xD5,0x11,0xE0,0x04,0x20, + 0x00,0x22,0x19,0xAB,0x29,0x04,0x04,0xD0,0x81,0x00,0x5A,0x50,0xC9,0x18,0x4A,0x61, + 0x03,0xE0,0x81,0x00,0xC9,0x18,0xCA,0x63,0x0A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14, + 0xF0,0xD5,0xBB,0x48,0x33,0x99,0x32,0x00,0x04,0x23,0xFE,0xF7,0x5D,0xFD,0xB6,0x49, + 0x0A,0x89,0x82,0x42,0x00,0xDD,0x08,0x81,0x4A,0x89,0x82,0x42,0x00,0xDA,0x48,0x81, + 0xB1,0x48,0x01,0x79,0x49,0x1C,0x0A,0x06,0x12,0x0E,0x02,0x71,0x92,0x00,0xA1,0x1E, + 0x12,0x18,0xE0,0x32,0x56,0x91,0x91,0x81,0x4D,0x99,0x89,0x1E,0x55,0x91,0x02,0x79, + 0x92,0x00,0x10,0x18,0xE0,0x30,0xC1,0x81,0x00,0x20,0x07,0x00,0x01,0x00,0x84,0x46, + 0x39,0x90,0x41,0x9A,0x38,0x98,0x82,0x42,0x06,0xDC,0x38,0x9A,0x3D,0x98,0x90,0x42, + 0x02,0xDC,0x3C,0x98,0x90,0x42,0x01,0xDD,0x01,0x20,0x39,0x90,0x38,0x9A,0x40,0x98, + 0x90,0x42,0x05,0xDC,0x3B,0x98,0x90,0x42,0x02,0xDC,0x3A,0x98,0x90,0x42,0x01,0xDD, + 0x01,0x20,0x84,0x46,0x3F,0x98,0x90,0x42,0x05,0xDC,0x3D,0x98,0x90,0x42,0x02,0xDC, + 0x3B,0x98,0x90,0x42,0x00,0xDD,0x01,0x27,0x3E,0x98,0x90,0x42,0x07,0xDC,0x3C,0x98, + 0x90,0x42,0x00,0xE0,0xF5,0xE0,0x02,0xDC,0x3A,0x98,0x90,0x42,0x00,0xDD,0x01,0x21, + 0x04,0x20,0x00,0x22,0x19,0xAD,0x39,0x9B,0x00,0x2B,0x02,0xD1,0x14,0x23,0x43,0x43, + 0xEA,0x50,0x63,0x46,0x00,0x2B,0x03,0xD1,0x14,0x23,0x43,0x43,0x5B,0x19,0x1A,0x61, + 0x00,0x2F,0x01,0xD1,0x83,0x00,0xEA,0x50,0x00,0x29,0x02,0xD1,0x83,0x00,0x5B,0x19, + 0x1A,0x65,0x40,0x1E,0x00,0x04,0x00,0x14,0xE5,0xD5,0x1D,0x9A,0x19,0xA8,0x00,0x92, + 0x0F,0xC8,0x01,0xF0,0xE8,0xF9,0x4A,0x90,0x22,0x9A,0x1E,0xA8,0x00,0x92,0x0F,0xC8, + 0x01,0xF0,0xE1,0xF9,0x27,0x9A,0x49,0x90,0x23,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0, + 0xDA,0xF9,0x2C,0x9A,0x48,0x90,0x28,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xD3,0xF9, + 0x31,0x9A,0x47,0x90,0x2D,0xA8,0x00,0x92,0x0F,0xC8,0x01,0xF0,0xCC,0xF9,0x46,0x90, + 0x00,0x90,0x47,0x9B,0x48,0x9A,0x49,0x99,0x4A,0x98,0x01,0xF0,0xC4,0xF9,0x00,0x28, + 0x4B,0x90,0x0F,0xD1,0x04,0x27,0x14,0x20,0x78,0x43,0x40,0x19,0x0A,0x22,0x00,0x21, + 0x00,0xF0,0xF2,0xF9,0x7F,0x1E,0x3F,0x04,0x3F,0x14,0xF4,0xD5,0x0A,0x20,0x48,0x90, + 0x25,0x90,0x4B,0x90,0x56,0x98,0x00,0x28,0x01,0xDC,0x00,0x20,0x0C,0xE0,0x2D,0x9A, + 0x00,0x92,0x28,0x9B,0x23,0x9A,0x1E,0x99,0x19,0x98,0x01,0xF0,0xA4,0xF9,0x5A,0x4A, + 0x61,0x00,0x89,0x18,0x49,0x8B,0x48,0x43,0x2E,0x9A,0x45,0x90,0x00,0x92,0x29,0x9B, + 0x24,0x9A,0x1F,0x99,0x1A,0x98,0x01,0xF0,0x96,0xF9,0x53,0x49,0x62,0x00,0x55,0x18, + 0xA9,0x8B,0x2F,0x9A,0x2A,0x9B,0x48,0x43,0x44,0x90,0x00,0x92,0x25,0x9A,0x20,0x99, + 0x1B,0x98,0x01,0xF0,0x88,0xF9,0xE9,0x8B,0x30,0x9A,0x2B,0x9B,0x48,0x43,0x43,0x90, + 0x00,0x92,0x26,0x9A,0x21,0x99,0x1C,0x98,0x01,0xF0,0x7D,0xF9,0x29,0x8C,0x48,0x43, + 0x56,0x99,0x07,0x00,0x70,0x1E,0x81,0x42,0x01,0xDB,0x00,0x20,0x09,0xE0,0x31,0x9A, + 0x2C,0x9B,0x00,0x92,0x27,0x9A,0x22,0x99,0x1D,0x98,0x01,0xF0,0x6C,0xF9,0x69,0x8C, + 0x48,0x43,0x00,0x90,0x43,0x9A,0x44,0x99,0x45,0x98,0x3B,0x00,0x01,0xF0,0x63,0xF9, + 0x4B,0x99,0xFB,0xF7,0x1D,0xFC,0x38,0x49,0x0A,0x8C,0x52,0x00,0x80,0x1A,0x00,0xD5, + 0x00,0x20,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0x90,0x81,0x55,0x98,0x00,0x28, + 0x01,0xDC,0x00,0x20,0x05,0xE0,0x4D,0x98,0x4A,0x9A,0x40,0x00,0x40,0x18,0xC0,0x8F, + 0x50,0x43,0x4D,0x9A,0x2C,0x49,0x52,0x00,0x52,0x18,0x40,0x32,0x11,0x88,0x49,0x9B, + 0x48,0x9D,0x59,0x43,0x53,0x88,0x06,0x9F,0x6B,0x43,0x9C,0x46,0x93,0x88,0x47,0x9D, + 0x7F,0x1E,0x6B,0x43,0x55,0x9D,0xBD,0x42,0x01,0xDB,0x00,0x22,0x02,0xE0,0xD2,0x88, + 0x46,0x9D,0x6A,0x43,0x00,0x92,0x62,0x46,0x01,0xF0,0x2D,0xF9,0x4B,0x99,0xFB,0xF7, + 0xE7,0xFB,0x1D,0x49,0x40,0x31,0x89,0x88,0x49,0x00,0x40,0x1A,0x00,0xD5,0x00,0x20, + 0x19,0x49,0x0A,0x79,0x52,0x00,0x52,0x18,0xC0,0x32,0xD0,0x83,0x08,0x79,0x08,0x28, + 0x12,0xD2,0x64,0x1C,0x54,0x98,0x24,0x04,0x24,0x14,0x84,0x42,0x00,0xDA,0x91,0xE4, + 0x42,0x98,0x00,0x28,0x08,0xD1,0x4D,0x98,0x40,0x1C,0x00,0x04,0x00,0x14,0x4D,0x90, + 0x53,0x99,0x88,0x42,0x00,0xDA,0x81,0xE4,0x0C,0x98,0x00,0x06,0x60,0xD5,0x0A,0x4C, + 0x20,0x79,0x00,0x28,0x60,0x98,0x15,0xD1,0x80,0x8B,0x00,0x28,0x51,0xD0,0x60,0x98, + 0x65,0x99,0xE2,0x88,0x40,0x7E,0x09,0x7B,0x52,0x06,0x01,0xD4,0x64,0x99,0x09,0x7A, + 0x88,0x42,0x46,0xD2,0x40,0x1C,0x41,0xE0,0xF0,0x05,0x00,0x20,0x05,0x0B,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x80,0x7E,0x09,0x99,0x88,0x42,0x36,0xD8,0x40,0x1C,0x60,0x99, + 0x00,0x06,0x00,0x0E,0x88,0x76,0x08,0x99,0x88,0x42,0x03,0xD9,0xA1,0x89,0x32,0x9A, + 0x89,0x18,0x32,0x91,0x09,0x99,0x88,0x42,0x27,0xD1,0x08,0x99,0x88,0x42,0x24,0xD0, + 0x41,0x1A,0x32,0x98,0xFB,0xF7,0x66,0xFC,0x60,0x9A,0x00,0x21,0x91,0x83,0x65,0x99, + 0x0A,0x89,0xE1,0x88,0x4B,0x06,0x01,0xD4,0x64,0x9A,0x92,0x88,0x82,0x42,0x14,0xD2, + 0x36,0x9A,0x80,0x1A,0x65,0x9A,0x49,0x06,0x92,0x79,0x01,0xD4,0x64,0x99,0x8A,0x78, + 0x64,0x21,0x50,0x43,0xFB,0xF7,0x4E,0xFC,0x60,0x99,0x00,0x04,0x00,0x0C,0x88,0x83, + 0x0A,0x99,0x88,0x42,0x01,0xD9,0x60,0x98,0x81,0x83,0x00,0x20,0x60,0x99,0x48,0x76, + 0x06,0xE0,0x60,0x99,0x00,0x20,0x88,0x76,0x60,0x99,0x48,0x76,0x60,0x99,0x88,0x83, + 0x00,0x20,0x84,0x46,0x4C,0x90,0x59,0x48,0x01,0x24,0x00,0x79,0x50,0x90,0x52,0xE0, + 0x56,0x48,0x61,0x00,0x0F,0x18,0xC0,0x37,0xB8,0x89,0x0A,0x21,0xFB,0xF7,0x2A,0xFC, + 0x05,0x04,0xF8,0x8B,0x2D,0x14,0x0A,0x21,0xFB,0xF7,0x24,0xFC,0x5E,0x99,0x02,0x04, + 0xC9,0x7E,0x12,0x14,0x00,0x20,0x84,0x46,0x51,0x91,0x36,0xE0,0x4B,0x49,0xC3,0x00, + 0x5B,0x18,0x11,0x21,0x89,0x01,0x59,0x18,0x1C,0x27,0x52,0x91,0xCF,0x5F,0xAF,0x42, + 0x27,0xDC,0x23,0x21,0x49,0x01,0x59,0x18,0x00,0x23,0xCB,0x5E,0xAB,0x42,0x20,0xDB, + 0x52,0x9F,0x1E,0x23,0xFB,0x5E,0x93,0x42,0x1B,0xDC,0x02,0x27,0xCF,0x5F,0x3F,0x4B, + 0x97,0x42,0x16,0xDB,0xA1,0x00,0xC9,0x18,0xE0,0x31,0x0E,0x23,0xCB,0x5E,0x37,0x1D, + 0x9B,0x1C,0x7B,0x43,0x0C,0x27,0xCF,0x5F,0xD9,0x19,0x4B,0x00,0x38,0x49,0x5B,0x18, + 0x04,0x21,0x59,0x5E,0x4C,0x9B,0x99,0x42,0x03,0xDD,0x4C,0x91,0x21,0x06,0x09,0x0E, + 0x8C,0x46,0x40,0x1C,0x51,0x99,0x00,0x04,0x00,0x14,0x81,0x42,0xC6,0xDC,0x64,0x1C, + 0x50,0x98,0x24,0x04,0x24,0x14,0xA0,0x42,0xAA,0xDA,0x2C,0x4D,0x4C,0x9A,0x2C,0x00, + 0x23,0x00,0x69,0x89,0x20,0x00,0xDE,0x33,0xCC,0x30,0xC2,0x34,0x91,0x42,0x4F,0x93, + 0x05,0xDC,0x61,0x46,0x00,0x29,0x02,0xD0,0x49,0x00,0x49,0x19,0x0E,0xE0,0x69,0x79, + 0x00,0x29,0x1B,0xD1,0x50,0x99,0x01,0x29,0x18,0xD9,0x62,0x99,0x89,0x78,0x00,0x29, + 0x14,0xD1,0x0D,0x99,0x00,0x29,0x11,0xD0,0x4A,0x00,0x51,0x19,0xC0,0x31,0x8E,0x89, + 0xCF,0x8B,0x12,0x22,0x00,0x21,0x00,0xF0,0x57,0xF8,0x4F,0x98,0x12,0x22,0x00,0x21, + 0x00,0xF0,0x52,0xF8,0x01,0x20,0x28,0x71,0xA6,0x81,0xE7,0x83,0x5E,0x98,0xC0,0x7D, + 0x00,0x28,0x0C,0xD0,0x00,0x21,0x29,0x71,0x5E,0x98,0x12,0x4A,0x00,0x7E,0x92,0x7F, + 0x90,0x42,0x01,0xD3,0x5E,0x9A,0xD1,0x75,0x5E,0x99,0x40,0x1C,0x08,0x76,0x02,0x99, + 0x0D,0x48,0x00,0x29,0x10,0xD0,0x29,0x79,0x00,0x29,0x0D,0xD0,0x0B,0x4A,0x01,0x68, + 0x52,0x89,0x0A,0x32,0x91,0x42,0x01,0xDA,0x49,0x1C,0x01,0x60,0x28,0x79,0x68,0x71, + 0x67,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x21,0xF6,0xE7,0xF0,0x05,0x00,0x20, + 0xC8,0x02,0x00,0x20,0x00,0x78,0x00,0x00,0xF0,0x0A,0x00,0x20,0x80,0x7A,0x00,0x00, + 0x03,0xE0,0x0B,0x78,0x49,0x1C,0x03,0x70,0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x70,0x47, + 0x52,0x10,0x03,0xE0,0x0B,0x88,0x89,0x1C,0x03,0x80,0x80,0x1C,0x52,0x1E,0xF9,0xD2, + 0x70,0x47,0x92,0x10,0x01,0xE0,0x08,0xC9,0x08,0xC0,0x52,0x1E,0xFB,0xD2,0x70,0x47, + 0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1,0x09,0x06,0x09,0x0E,0x01,0xE0,0x01,0x70, + 0x40,0x1C,0x52,0x1E,0xFB,0xD2,0x70,0x47,0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E, + 0xFC,0xD2,0x70,0x47,0x0A,0x49,0x00,0x20,0xC9,0x88,0x4A,0x06,0x09,0x49,0x00,0xD5, + 0xC8,0x7A,0x89,0x7A,0x08,0x18,0x00,0x06,0x01,0x0C,0x07,0x48,0x02,0x69,0xFF,0x23, + 0x1B,0x02,0x9A,0x43,0x02,0x61,0x02,0x69,0x0A,0x43,0x02,0x61,0x70,0x47,0x00,0x00, + 0xF0,0x05,0x00,0x20,0x80,0x78,0x00,0x00,0x00,0x90,0x00,0x40,0x10,0xB5,0x14,0x48, + 0x14,0x49,0x80,0x8B,0xC9,0x8A,0x00,0x24,0x40,0x18,0x13,0x49,0x09,0x78,0x00,0x29, + 0x12,0x49,0x04,0xD0,0x15,0x22,0x52,0x01,0x89,0x18,0x49,0x89,0x09,0xE0,0x10,0x4A, + 0xFF,0x31,0xD2,0x88,0xA1,0x31,0x49,0x8A,0x52,0x06,0x02,0xD4,0x0B,0x49,0xE0,0x31, + 0xC9,0x89,0x08,0x18,0x0B,0x49,0xC9,0x6B,0x49,0x04,0x49,0x0C,0x81,0x42,0x00,0xD3, + 0x01,0x24,0xFE,0xF7,0x3F,0xFF,0x20,0x00,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF0,0x06,0x00,0x20,0xD0,0x0A,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40,0xF7,0xB5,0x2C,0x4E,0xFF,0x27,0xB0,0x7F, + 0xF1,0x7F,0x84,0xB0,0x00,0x02,0x08,0x43,0x01,0xF0,0x3E,0xFD,0x30,0x00,0x20,0x38, + 0x00,0x7D,0xC0,0x07,0x0A,0xD0,0x26,0x48,0x01,0x78,0x26,0x48,0x00,0x7A,0x00,0x29, + 0x02,0xD0,0x01,0xF0,0xD1,0xFC,0x01,0xE0,0x01,0xF0,0xFE,0xFC,0x22,0x48,0x02,0x25, + 0xC1,0x6A,0x03,0x91,0x01,0x6A,0x02,0x91,0x41,0x6A,0x01,0x91,0x41,0x6B,0x00,0x91, + 0x21,0xE0,0x1D,0x4F,0x00,0x20,0xF8,0x62,0x18,0x48,0xA0,0x30,0x80,0x68,0x38,0x62, + 0x1A,0x48,0x00,0x6B,0x78,0x62,0x03,0x24,0xE0,0x07,0xC0,0x0F,0xFC,0xF7,0x08,0xF9, + 0x64,0x1E,0xF9,0xD5,0x02,0x20,0x78,0x63,0x30,0x7F,0x01,0x00,0xFC,0xF7,0x82,0xF9, + 0x01,0x24,0x04,0xA8,0x07,0xC8,0xFE,0xF7,0x81,0xFE,0x07,0x00,0x01,0xD1,0x00,0x24, + 0x25,0x00,0x64,0x1E,0xF5,0xD5,0x28,0x00,0x6D,0x1E,0x00,0x28,0xD9,0xDC,0x0A,0x48, + 0x03,0x99,0xC1,0x62,0x02,0x99,0x01,0x62,0x01,0x99,0x41,0x62,0x00,0x99,0x41,0x63, + 0x38,0x00,0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x20,0x78,0x00,0x00, + 0xFD,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0x80,0x90,0x00,0x40,0x80,0x7A,0x00,0x00, + 0x78,0x47,0xC0,0x46,0xF0,0x4F,0x2D,0xE9,0x71,0xDF,0x4D,0xE2,0x00,0x00,0xA0,0xE3, + 0xB8,0x01,0x8D,0xE5,0x24,0x07,0x9F,0xE5,0x28,0x37,0x9F,0xE5,0x00,0x00,0xD0,0xE5, + 0x28,0x67,0x9F,0xE5,0xB0,0x01,0x8D,0xE5,0x14,0x07,0x9F,0xE5,0x00,0xB0,0xD0,0xE5, + 0xB6,0x00,0xD3,0xE1,0x40,0x10,0x00,0xE2,0x0C,0x07,0x9F,0xE5,0x00,0x00,0x51,0xE3, + 0x01,0x4C,0x80,0xE2,0xBC,0x1E,0xD0,0x01,0xB0,0x1B,0xD4,0x11,0x02,0xAC,0x80,0xE2, + 0xAC,0x11,0x8D,0xE5,0xB0,0x1F,0xD0,0x01,0xB4,0x1B,0xD4,0x11,0xA8,0x11,0x8D,0xE5, + 0xF8,0x1A,0xD4,0x01,0xFC,0x16,0xDA,0x11,0xA0,0x11,0x8D,0xE5,0xFA,0x1A,0xD4,0x01, + 0xFE,0x16,0xDA,0x11,0x9C,0x11,0x8D,0xE5,0xF4,0x10,0xD0,0x05,0xB8,0x11,0xD0,0x15, + 0x98,0x11,0x8D,0xE5,0xF5,0x10,0xD0,0x05,0xB9,0x11,0xD0,0x15,0x94,0x11,0x8D,0xE5, + 0xF6,0x10,0xD0,0x05,0xBA,0x11,0xD0,0x15,0x90,0x11,0x8D,0xE5,0xF7,0x10,0xD0,0x05, + 0xBB,0x11,0xD0,0x15,0x8C,0x11,0x8D,0xE5,0xBC,0x1F,0xD0,0x01,0xB0,0x1C,0xD4,0x11, + 0x88,0x11,0x8D,0xE5,0xBE,0x1F,0xD0,0x01,0xB2,0x1C,0xD4,0x11,0x84,0x11,0x8D,0xE5, + 0xB0,0x10,0xD4,0x01,0xB4,0x1C,0xD4,0x11,0x80,0x11,0x8D,0xE5,0xB2,0x10,0xD4,0x01, + 0xB6,0x1C,0xD4,0x11,0x7C,0x11,0x8D,0xE5,0xB8,0x1F,0xD0,0x01,0xBC,0x1B,0xD4,0x11, + 0x78,0x11,0x8D,0xE5,0xBA,0x0F,0xD0,0x01,0xBE,0x0B,0xD4,0x11,0x74,0x01,0x8D,0xE5, + 0x00,0x00,0xA0,0xE3,0x30,0x00,0x8D,0xE5,0x2C,0x00,0x8D,0xE5,0x28,0x00,0x8D,0xE5, + 0x24,0x00,0x8D,0xE5,0x20,0x00,0x8D,0xE5,0x1C,0x00,0x8D,0xE5,0x18,0x00,0x8D,0xE5, + 0x14,0x00,0x8D,0xE5,0x10,0x00,0x8D,0xE5,0x0C,0x00,0x8D,0xE5,0x08,0x00,0x8D,0xE5, + 0x04,0x00,0x8D,0xE5,0xB8,0x05,0xC6,0xE1,0x00,0x90,0xA0,0xE1,0xBA,0x05,0xC6,0xE1, + 0x01,0x5C,0x46,0xE2,0xBC,0x05,0xC6,0xE1,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x70,0x00,0x85,0xE2,0x49,0xFF,0xFF,0xEB,0x28,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3, + 0x98,0x00,0x85,0xE2,0x45,0xFF,0xFF,0xEB,0x00,0x00,0xA0,0xE3,0xB4,0x01,0x8D,0xE5, + 0x00,0x10,0xA0,0xE1,0xB0,0x0C,0xC5,0xE1,0x50,0x20,0xA0,0xE3,0x49,0x0F,0x8D,0xE2, + 0x3E,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0xD4,0x00,0x8D,0xE2, + 0x3A,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x84,0x00,0x8D,0xE2, + 0x36,0xFF,0xFF,0xEB,0x50,0x20,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x34,0x00,0x8D,0xE2, + 0x32,0xFF,0xFF,0xEB,0xA8,0x05,0x9F,0xE5,0x00,0x00,0xD0,0xE5,0x00,0x00,0x50,0xE3, + 0xF8,0x7A,0xDA,0x11,0xB6,0x0A,0xDA,0x11,0x07,0x00,0x00,0x1A,0x84,0x05,0x9F,0xE5, + 0xB6,0x00,0xD0,0xE1,0x40,0x00,0x00,0xE2,0x00,0x00,0x50,0xE3,0xF2,0x71,0xD4,0x01, + 0xF6,0x7D,0xD4,0x11,0xB0,0x01,0xD4,0x01,0xB4,0x0D,0xD4,0x11,0x00,0x80,0xA0,0xE3, + 0x08,0x50,0xA0,0xE1,0xA4,0x01,0x8D,0xE5,0x68,0x05,0x9F,0xE5,0xC0,0x01,0x8D,0xE5, + 0x0E,0x0C,0x80,0xE2,0xBC,0x01,0x8D,0xE5,0x82,0x00,0x00,0xEA,0x00,0x40,0xA0,0xE3, + 0x7C,0x00,0x00,0xEA,0xC0,0x01,0x9D,0xE5,0x0F,0x2A,0xE0,0xE3,0x08,0x11,0x90,0xE7, + 0x01,0x0A,0xA0,0xE1,0x20,0x0A,0xA0,0xE1,0x21,0x18,0x02,0xE0,0x01,0x30,0x40,0xE0, + 0x00,0x00,0x41,0xE0,0x9C,0x11,0x9D,0xE5,0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3, + 0xD4,0x20,0x8D,0xC2,0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7, + 0x9C,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x34,0x20,0x8D,0xC2, + 0x04,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0,0x04,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5, + 0x03,0x10,0x81,0xE0,0x00,0x00,0x51,0xE3,0x49,0x2F,0x8D,0xC2,0x05,0xC1,0x92,0xC7, + 0x0C,0x10,0x81,0xC0,0x05,0x11,0x82,0xC7,0xA0,0x11,0x9D,0xE5,0x00,0x10,0x81,0xE0, + 0x00,0x00,0x51,0xE3,0x84,0x20,0x8D,0xC2,0x05,0xC1,0x92,0xC7,0x0C,0x10,0x81,0xC0, + 0x05,0x11,0x82,0xC7,0xB4,0x11,0x9D,0xE5,0x01,0x00,0x53,0xE1,0xB4,0x31,0x8D,0xC5, + 0x30,0x40,0x8D,0xC5,0x2C,0x50,0x8D,0xC5,0xC8,0x00,0x53,0xE3,0xB8,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xB8,0x15,0xC6,0xC1,0x96,0x00,0x50,0xE3,0xBA,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBA,0x15,0xC6,0xC1,0x19,0x0E,0x53,0xE3,0xBC,0x15,0xD6,0xC1, + 0x01,0x10,0x81,0xC2,0xBC,0x15,0xC6,0xC1,0x68,0x14,0x9F,0xE5,0xB6,0x10,0xD1,0xE1, + 0x40,0x00,0x11,0xE3,0xB0,0x18,0xDA,0xE1,0x01,0x28,0xE0,0x13,0x81,0x10,0x02,0x10, + 0x00,0x00,0x53,0xE3,0x03,0x28,0xA0,0xC1,0x00,0x20,0xA0,0xD3,0x22,0x28,0xA0,0xC1, + 0x00,0x00,0x50,0xE3,0x00,0x08,0xA0,0xC1,0x00,0x00,0xA0,0xD3,0x20,0x08,0xA0,0xC1, + 0x01,0x00,0x50,0xE1,0x01,0xC0,0x89,0x82,0x01,0x98,0xCC,0x83,0x01,0x00,0x52,0xE1, + 0x0C,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83,0x0C,0xC0,0x8D,0x85, + 0x81,0x00,0x50,0xE1,0x08,0xC0,0x9D,0x85,0x01,0xC0,0x8C,0x82,0x01,0xC8,0xCC,0x83, + 0x08,0xC0,0x8D,0x85,0x81,0x00,0x52,0xE1,0x04,0x10,0x9D,0x85,0x01,0x10,0x81,0x82, + 0x01,0x18,0xC1,0x83,0x04,0x10,0x8D,0x85,0x10,0x10,0x9D,0xE5,0x00,0x00,0x53,0xE3, + 0x01,0x00,0x80,0xE0,0x10,0x00,0x8D,0xE5,0x00,0x30,0xA0,0xB3,0x01,0x00,0x4B,0xE2, + 0x00,0x00,0x55,0xE1,0x06,0x00,0x00,0x1A,0x00,0x00,0x53,0xE3,0x04,0x00,0x00,0x0A, + 0x03,0x02,0x63,0xE0,0x00,0x01,0xA0,0xE1,0x64,0x10,0xA0,0xE3,0xFC,0xEB,0xFF,0xEB, + 0x00,0x30,0xA0,0xE1,0x05,0x10,0xA0,0xE1,0x04,0x00,0xA0,0xE1,0x11,0xF8,0xFF,0xEB, + 0xB4,0x13,0x9F,0xE5,0x00,0x00,0x57,0xE3,0x80,0x00,0x81,0xE0,0xB0,0x30,0xC0,0xE1, + 0x00,0x00,0x67,0xD2,0x07,0x00,0xA0,0xC1,0x03,0x00,0x50,0xE1,0xB8,0x11,0x9D,0xB5, + 0x07,0x00,0x83,0xB0,0x01,0x00,0x80,0xB0,0xB8,0x01,0x8D,0xB5,0x05,0x10,0xA0,0xE1, + 0x04,0x00,0xA0,0xE1,0xDA,0xF7,0xFF,0xEB,0xBC,0x11,0x9D,0xE5,0x7C,0x23,0x9F,0xE5, + 0x08,0x11,0x91,0xE7,0x80,0x00,0x82,0xE0,0x02,0x19,0xC1,0xE3,0x01,0x80,0x88,0xE2, + 0x01,0x40,0x84,0xE2,0xB0,0x10,0xC0,0xE1,0xB0,0x01,0x9D,0xE5,0x00,0x00,0x54,0xE1, + 0x7F,0xFF,0xFF,0x3A,0x01,0x50,0x85,0xE2,0x0B,0x00,0x55,0xE1,0x7A,0xFF,0xFF,0x3A, + 0x60,0xFA,0xFF,0xEB,0x2C,0x63,0x9F,0xE5,0xA8,0x01,0x9D,0xE5,0xBE,0x00,0xC6,0xE1, + 0xAC,0x01,0x9D,0xE5,0x01,0x00,0x10,0xE3,0x0A,0x00,0x00,0x0A,0xB0,0x01,0x9D,0xE5, + 0x64,0x10,0xA0,0xE3,0x9B,0x00,0x00,0xE0,0x90,0x01,0x01,0xE0,0xB8,0x01,0x9D,0xE5, + 0xA4,0x21,0x9D,0xE5,0x92,0x00,0x00,0xE0,0x3A,0xEC,0xFF,0xEB,0xA8,0x11,0x9D,0xE5, + 0x01,0x00,0x50,0xE1,0xBE,0x00,0xC6,0x31,0xB0,0x01,0x9D,0xE5,0x64,0x10,0xA0,0xE3, + 0x90,0x01,0x07,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA,0x49,0x0F,0x8D,0xE2, + 0x04,0x01,0x90,0xE7,0x98,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0,0x07,0x10,0xA0,0xE1, + 0x2C,0xEC,0xFF,0xEB,0x88,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xBC,0xFA,0xFF,0xEB,0x00,0x50,0xA0,0xE1, + 0x84,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x94,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x07,0x10,0xA0,0xE1,0x1F,0xEC,0xFF,0xEB,0x84,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0xAF,0xFA,0xFF,0xEB, + 0x00,0x00,0x45,0xE0,0x78,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1,0x40,0x08,0xA0,0xE1, + 0x91,0x00,0x00,0xE0,0x84,0x50,0x86,0xE0,0x64,0x10,0xA0,0xE3,0xA4,0xEB,0xFF,0xEB, + 0x01,0x40,0x84,0xE2,0xB0,0x07,0xC5,0xE1,0x0B,0x00,0x54,0xE1,0xDA,0xFF,0xFF,0x3A, + 0x64,0x00,0xA0,0xE3,0x9B,0x00,0x05,0xE0,0x00,0x40,0xA0,0xE3,0x22,0x00,0x00,0xEA, + 0xD4,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x90,0x11,0x9D,0xE5,0x91,0x00,0x00,0xE0, + 0x05,0x10,0xA0,0xE1,0x03,0xEC,0xFF,0xEB,0x80,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1,0x93,0xFA,0xFF,0xEB, + 0x00,0x70,0xA0,0xE1,0x34,0x00,0x8D,0xE2,0x04,0x01,0x90,0xE7,0x8C,0x11,0x9D,0xE5, + 0x91,0x00,0x00,0xE0,0x05,0x10,0xA0,0xE1,0xF6,0xEB,0xFF,0xEB,0x7C,0x11,0x9D,0xE5, + 0x00,0x08,0xA0,0xE1,0x01,0x18,0xA0,0xE1,0x40,0x08,0xA0,0xE1,0x41,0x18,0xA0,0xE1, + 0x86,0xFA,0xFF,0xEB,0x00,0x00,0x47,0xE0,0x74,0x11,0x9D,0xE5,0x00,0x08,0xA0,0xE1, + 0x40,0x08,0xA0,0xE1,0x91,0x00,0x00,0xE0,0x84,0x70,0x86,0xE0,0x64,0x10,0xA0,0xE3, + 0x7B,0xEB,0xFF,0xEB,0x01,0x40,0x84,0xE2,0xB8,0x09,0xC7,0xE1,0xB0,0x01,0x9D,0xE5, + 0x00,0x00,0x54,0xE1,0xD9,0xFF,0xFF,0x3A,0xB4,0x01,0x9D,0xE5,0x00,0x00,0x50,0xE3, + 0x0D,0x00,0x00,0xDA,0x30,0x00,0x9D,0xE5,0x2C,0x10,0x9D,0xE5,0x80,0x00,0x86,0xE0, + 0x81,0x10,0x86,0xE0,0xB8,0x09,0xD0,0xE1,0xB0,0x17,0xD1,0xE1,0x00,0x10,0x81,0xE0, + 0xB4,0x01,0x9D,0xE5,0x01,0x00,0x40,0xE0,0x00,0x08,0xA0,0xE1,0x40,0x08,0xB0,0xE1, + 0xB0,0x0C,0xC6,0xE1,0x00,0x00,0xA0,0x43,0xB0,0x0C,0xC6,0x41,0xB0,0x01,0x9D,0xE5, + 0x01,0x00,0x40,0xE2,0x9B,0x00,0x01,0xE0,0x10,0x00,0x9D,0xE5,0xCD,0xEB,0xFF,0xEB, + 0xB6,0x10,0xD6,0xE1,0x0C,0x20,0x9D,0xE5,0x40,0x00,0x11,0xE3,0x10,0x00,0x00,0x0A, + 0x82,0x00,0x59,0xE1,0x01,0x20,0xA0,0x83,0x24,0x20,0x8D,0x85,0xFA,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85,0x08,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85,0x04,0x00,0x9D,0xE5,0x23,0x00,0x50,0xE3, + 0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35,0x14,0x00,0x59,0xE3,0x13,0x00,0x00,0x9A, + 0x10,0x00,0x00,0xEA,0x02,0x00,0x59,0xE1,0x08,0x00,0x59,0x83,0x01,0x20,0xA0,0x83, + 0x24,0x20,0x8D,0x85,0x96,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x20,0x00,0x8D,0x85, + 0x08,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x83,0x1C,0x00,0x8D,0x85, + 0x04,0x00,0x9D,0xE5,0x14,0x00,0x50,0xE3,0x01,0x00,0xA0,0x33,0x18,0x00,0x8D,0x35, + 0x0A,0x00,0x59,0xE3,0x01,0x00,0x00,0x9A,0x01,0x00,0xA0,0xE3,0x14,0x00,0x8D,0xE5, + 0x24,0x00,0x9D,0xE5,0x20,0x20,0x9D,0xE5,0x10,0x00,0x11,0xE3,0x02,0x30,0x80,0xE1, + 0x1C,0x00,0x9D,0xE5,0x18,0x20,0x9D,0xE5,0x02,0x00,0x00,0xE0,0x00,0x20,0x83,0xE1, + 0x14,0x00,0x9D,0x15,0x00,0x00,0x50,0x13,0x00,0x00,0xA0,0x03,0x01,0x00,0xA0,0x13, + 0x02,0x00,0x90,0xE1,0x28,0x00,0x9D,0x05,0x00,0x00,0x50,0x03,0x09,0x00,0x00,0x0A, + 0xC4,0x00,0x96,0xE5,0x01,0x00,0x80,0xE2,0xC4,0x00,0x86,0xE5,0xC8,0x00,0xD6,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0x12,0xC8,0x00,0xC6,0x15,0x71,0xDF,0x8D,0xE2, + 0xF0,0x4F,0xBD,0xE8,0x1E,0xFF,0x2F,0xE1,0xC8,0x00,0xD6,0xE5,0x01,0x00,0x80,0xE2, + 0xFF,0x00,0x00,0xE2,0xC8,0x00,0xC6,0xE5,0xB4,0x18,0xDA,0xE1,0x01,0x00,0x50,0xE1, + 0xF5,0xFF,0xFF,0x1A,0x00,0x00,0xA0,0xE3,0xC8,0x00,0xC6,0xE5,0xC4,0x00,0x96,0xE5, + 0x00,0x00,0x50,0xE3,0x01,0x00,0x40,0xC2,0xC4,0x00,0x86,0xC5,0xEE,0xFF,0xFF,0xEA, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00, + 0xF0,0x06,0x00,0x20,0x04,0x0B,0x00,0x20,0x00,0x02,0x10,0x40,0xC8,0x02,0x00,0x20, + 0x40,0x00,0x00,0x20,0xF0,0xB5,0xCA,0x49,0xC8,0x4F,0xC9,0x88,0xB8,0x7D,0xC9,0x4C, + 0x00,0x25,0x49,0x06,0x8D,0xB0,0x00,0xD4,0xA0,0x7C,0x03,0x90,0xC3,0x48,0x40,0x38, + 0x42,0x79,0x06,0x00,0xC0,0x36,0x00,0x92,0x82,0x79,0x80,0x30,0x01,0x7B,0xC0,0x38, + 0xB3,0x7A,0x00,0x7A,0xFE,0xF7,0xED,0xFB,0x00,0x06,0x71,0x7A,0x00,0x0E,0xFE,0xF7, + 0xDD,0xFB,0x31,0x00,0x20,0x39,0x0A,0x7A,0xC0,0x39,0x00,0x06,0x0C,0x91,0x09,0x79, + 0x00,0x0E,0xFE,0xF7,0xD7,0xFB,0x00,0x06,0xBA,0x7D,0xA1,0x7C,0x00,0x0E,0xFE,0xF7, + 0xD1,0xFB,0x00,0x06,0xB4,0x4E,0x00,0x0E,0x02,0x90,0x30,0x7B,0x00,0x28,0x02,0xD0, + 0xB2,0x48,0x40,0x89,0x0A,0xE0,0xAE,0x49,0x78,0x8A,0xC9,0x88,0x49,0x06,0x00,0xD4, + 0xE0,0x89,0xAF,0x49,0xC9,0x8A,0x40,0x18,0x00,0x04,0x00,0x0C,0x00,0x27,0x04,0x90, + 0x77,0x61,0x30,0x7A,0x00,0x28,0x06,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0, + 0xD5,0xFA,0x01,0xF0,0xC3,0xFA,0x01,0x20,0x30,0x62,0xFC,0xF7,0xF5,0xFB,0xA0,0x48, + 0x05,0x22,0x01,0x00,0xFF,0x31,0x61,0x31,0x0A,0x91,0x9E,0x49,0xD2,0x01,0xE0,0x39, + 0x8B,0x18,0x09,0x93,0x03,0x00,0xC0,0x33,0x80,0x31,0x07,0xAC,0x0A,0xC4,0x02,0x99, + 0xC9,0x1C,0x06,0x91,0x51,0x00,0x44,0x18,0x80,0x18,0x05,0x90,0x10,0xE1,0x30,0x7A, + 0x00,0x28,0x04,0xD0,0x30,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0xAF,0xFA,0xFF,0x20, + 0x81,0x30,0xFB,0xF7,0xAD,0xF9,0x03,0x20,0x01,0xF0,0xE6,0xF9,0x00,0xF0,0x68,0xF9, + 0x01,0x20,0x40,0x05,0xFC,0xF7,0x04,0xFE,0xFF,0xF7,0xCA,0xFB,0x00,0x20,0xFC,0xF7, + 0xFF,0xFD,0x87,0x48,0xC0,0x88,0x01,0x06,0x01,0xD5,0x01,0x20,0x04,0xE0,0x40,0x06, + 0x01,0xD5,0x05,0x20,0x00,0xE0,0x03,0x20,0x01,0xF0,0xAA,0xF8,0xFC,0xF7,0x34,0xFE, + 0x84,0x48,0x04,0x99,0x80,0x8B,0x40,0x18,0x7D,0x49,0x89,0x89,0x88,0x42,0x10,0xD9, + 0x0A,0x98,0x40,0x78,0x00,0x28,0x0C,0xD1,0x79,0x48,0xFF,0x21,0xC0,0x88,0x19,0x31, + 0x08,0x42,0x06,0xD1,0x03,0x98,0x6D,0x1C,0x85,0x42,0x03,0xDD,0xFC,0xF7,0x24,0xFE, + 0x00,0xE0,0x00,0x25,0x00,0xF0,0x6A,0xFE,0x00,0xF0,0xEC,0xFD,0x00,0xF0,0x40,0xFE, + 0x09,0x99,0x08,0x98,0x49,0x88,0x40,0x68,0x88,0x42,0x0C,0xDB,0x0A,0x98,0x40,0x78, + 0x00,0x28,0x04,0xD1,0x6A,0x48,0x46,0x21,0xC0,0x88,0x08,0x42,0x03,0xD0,0x6A,0x49, + 0x01,0x20,0x48,0x70,0x02,0xE0,0x70,0x78,0x00,0x28,0x0D,0xD0,0xFC,0xF7,0x88,0xFB, + 0x64,0x48,0x01,0x21,0xE0,0x38,0xC0,0x7F,0x40,0x08,0x01,0xF0,0xBD,0xF8,0x62,0x48, + 0x47,0x70,0x08,0x98,0x47,0x60,0xA9,0xE0,0xFC,0xF7,0xC4,0xFD,0xFD,0xF7,0x3C,0xFF, + 0x00,0x28,0x08,0xD0,0x77,0x61,0x05,0x98,0x80,0x7B,0xC8,0x28,0x10,0xD2,0x05,0x99, + 0x40,0x1C,0x88,0x73,0x0C,0xE0,0x70,0x69,0x40,0x1C,0x70,0x61,0x70,0x69,0x01,0x28, + 0x01,0xD1,0x59,0x48,0x07,0x73,0x70,0x69,0x05,0x28,0x01,0xD9,0xFC,0xF7,0x54,0xFB, + 0x01,0x20,0x40,0x07,0x00,0x68,0x00,0x28,0x07,0xD1,0x60,0x68,0xFF,0x21,0xFF,0x31, + 0x88,0x42,0x03,0xDA,0x40,0x1C,0x60,0x60,0x00,0xE0,0x67,0x60,0x09,0x99,0x20,0x68, + 0x49,0x89,0x88,0x42,0x0A,0xDD,0x61,0x68,0xFF,0x20,0xF5,0x30,0x81,0x42,0x05,0xDD, + 0x01,0x20,0x70,0x70,0x27,0x60,0x67,0x60,0x08,0x99,0x48,0x60,0x47,0x48,0x41,0x68, + 0x09,0x07,0x07,0xD5,0xC1,0x68,0x00,0x29,0x04,0xD0,0xC0,0x68,0x01,0x21,0x49,0x07, + 0xC8,0x63,0x06,0xE0,0x70,0x7B,0x80,0x28,0x01,0xD1,0xFC,0xF7,0x31,0xFC,0x00,0xF0, + 0x11,0xF9,0xFC,0xF7,0x27,0xFE,0x07,0x98,0x00,0x7B,0x00,0x28,0x04,0xD0,0x30,0x7B, + 0x00,0x28,0x01,0xD1,0x00,0xF0,0xC0,0xF8,0x01,0x20,0x40,0x07,0xC0,0x6B,0x0B,0x28, + 0x4C,0xD1,0x07,0x98,0x00,0x7A,0x00,0x28,0x01,0xD0,0xFF,0xF7,0x5B,0xFA,0x00,0xF0, + 0x9B,0xF8,0x03,0x20,0x01,0xF0,0xFA,0xF8,0xF0,0x62,0x03,0x20,0x01,0xF0,0x28,0xF9, + 0xFF,0x20,0x81,0x30,0xFB,0xF7,0xD4,0xF8,0x2D,0x48,0x00,0x78,0x00,0x28,0x2F,0xD1, + 0xFC,0xF7,0xD8,0xFE,0x00,0x28,0x2B,0xD0,0xB0,0x6A,0x00,0x28,0x0B,0x90,0x27,0xD0, + 0xF0,0x6A,0xFF,0x21,0x41,0x31,0x48,0x43,0x26,0x49,0xFA,0xF7,0x8B,0xFD,0x0B,0x99, + 0x08,0x1A,0x32,0x28,0x1C,0xDD,0x01,0xF0,0xCF,0xF9,0x01,0xF0,0xD3,0xF9,0xB0,0x79, + 0x00,0x28,0x0D,0xD0,0x00,0xF0,0x4E,0xF8,0x00,0xF0,0x51,0xF8,0x00,0xF0,0x59,0xF8, + 0x1D,0x4E,0x01,0x20,0x70,0x60,0xFB,0xF7,0xBB,0xF8,0x1C,0x48,0x70,0x60,0x03,0xE0, + 0x1B,0x48,0x01,0x78,0x00,0x29,0xFC,0xD0,0x01,0xF0,0xC3,0xF9,0x18,0x48,0x07,0x70, + 0x0D,0x4E,0x70,0x69,0x06,0x99,0x88,0x42,0x00,0xD2,0xE8,0xE6,0x0C,0x98,0x0C,0x49, + 0x40,0x78,0xA0,0x39,0x48,0x73,0x08,0x48,0x00,0x7A,0x00,0x28,0x01,0xD0,0x01,0xF0, + 0x8D,0xF9,0x0D,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xA0,0x79,0x00,0x00, + 0xF0,0x05,0x00,0x20,0xE0,0x78,0x00,0x00,0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00, + 0xD0,0x0A,0x00,0x20,0xF0,0x06,0x00,0x20,0x90,0x08,0x00,0x20,0x00,0x40,0x00,0x30, + 0xAD,0x0B,0x00,0x20,0x10,0x27,0x00,0x00,0x00,0x30,0x00,0x40,0xE1,0x04,0x00,0x00, + 0xAC,0x0B,0x00,0x20,0x01,0x20,0x80,0x07,0x01,0x6B,0x81,0x22,0xD2,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x20,0x01,0x21,0x89,0x07,0x48,0x60,0x70,0x47,0x10,0x20, + 0x81,0x06,0x48,0x60,0x70,0x47,0x01,0x22,0x92,0x07,0x91,0x68,0x01,0x43,0x91,0x60, + 0x70,0x47,0x01,0x20,0x80,0x07,0x41,0x68,0x02,0x22,0x11,0x43,0x41,0x60,0x70,0x47, + 0x01,0x20,0x80,0x07,0x01,0x6B,0x03,0x4A,0x89,0x09,0x52,0x7B,0x89,0x01,0x11,0x43, + 0x01,0x63,0x70,0x47,0x00,0x78,0x00,0x00,0x10,0xB5,0xFC,0xF7,0xB3,0xFC,0xFA,0xF7, + 0x35,0xFD,0x03,0x20,0x40,0x03,0xFB,0xF7,0x3B,0xF8,0x10,0xBC,0x08,0xBC,0x18,0x47, + 0x03,0x20,0x10,0xB5,0x40,0x03,0xFB,0xF7,0x3B,0xF8,0xFA,0xF7,0x31,0xFD,0xFC,0xF7, + 0xA9,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0xB5,0x00,0xF0,0xFD,0xFB,0x05,0x49, + 0x80,0x22,0xC9,0x88,0x11,0x40,0x81,0x42,0x01,0xD0,0xFA,0xF7,0x59,0xFF,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x16,0x48,0x17,0x4E,0x00,0x78, + 0x00,0x25,0x01,0x90,0x14,0x48,0x00,0x78,0x00,0x90,0x1C,0xE0,0x14,0x49,0x68,0x00, + 0x00,0x24,0x47,0x18,0x60,0x37,0x12,0xE0,0x29,0x00,0x20,0x00,0xFD,0xF7,0x2A,0xFC, + 0x0F,0x4B,0x62,0x00,0xD3,0x18,0x98,0x22,0x9A,0x5E,0x10,0x23,0xFB,0x5E,0x40,0x00, + 0x31,0x5E,0xD2,0x18,0x89,0x1A,0x00,0xD5,0x00,0x21,0x64,0x1C,0x31,0x52,0x01,0x98, + 0x84,0x42,0xE9,0xD3,0x6D,0x1C,0x00,0x98,0x85,0x42,0xDF,0xD3,0xFE,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0xC8,0x02,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x72,0x4F,0x00,0x26,0x78,0x7A,0xC0,0x07,0x2F,0xD0, + 0x70,0x4C,0x20,0x89,0x00,0x28,0x0E,0xD0,0x6F,0x49,0x88,0x42,0x0B,0xD0,0x1E,0x21, + 0x48,0x43,0x64,0x21,0xFA,0xF7,0x9E,0xFC,0x39,0x8A,0x46,0x18,0x4B,0x20,0xC0,0x00, + 0x86,0x42,0x00,0xD9,0x06,0x00,0x69,0x48,0x40,0x7D,0x00,0x28,0x18,0xD0,0xA6,0x89, + 0x67,0x48,0x31,0x18,0x08,0x00,0x48,0x43,0x69,0x21,0x09,0x01,0xFA,0xF7,0x8A,0xFC, + 0x63,0x4B,0x31,0x00,0x63,0x4A,0xFF,0x39,0xA6,0x39,0x5B,0x42,0x91,0x42,0x01,0xD8, + 0x1E,0x1A,0x05,0xE0,0x5E,0x4C,0x64,0x1E,0x31,0x19,0x91,0x42,0x00,0xD2,0xC6,0x18, + 0x01,0x24,0x64,0x07,0x25,0x68,0x00,0x2D,0x7E,0xD0,0x5B,0x48,0x00,0x21,0x01,0x70, + 0x02,0x20,0x00,0xF0,0xF5,0xFF,0x59,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0x6A,0xFC, + 0x01,0x00,0x02,0x20,0x00,0xF0,0xD8,0xFF,0x01,0x2D,0x0B,0xD0,0x02,0x2D,0x08,0xD1, + 0x60,0x68,0x00,0x02,0x00,0x0E,0x01,0x28,0x03,0xD1,0x60,0x68,0x00,0x06,0x00,0xD1, + 0x00,0xE0,0x6D,0x1C,0x78,0x7A,0x00,0x28,0x08,0xD0,0x60,0x68,0x4C,0x49,0x81,0x43, + 0x04,0xD0,0x61,0x68,0x4B,0x48,0x88,0x43,0x00,0xD0,0x6D,0x1C,0xF8,0x79,0x00,0x28, + 0x04,0xD1,0x49,0x48,0x41,0x69,0x02,0x15,0x11,0x43,0x41,0x61,0x47,0x48,0x01,0x68, + 0x47,0x48,0xC1,0x61,0x02,0x24,0x20,0x00,0x00,0xF0,0xB6,0xFF,0x45,0x48,0xC1,0x68, + 0x49,0x08,0x49,0x00,0xC1,0x60,0x03,0x04,0x35,0x48,0x36,0x4A,0x41,0x7A,0x40,0x48, + 0x97,0x89,0x21,0xE0,0x42,0x69,0x52,0x06,0x0E,0xD4,0x00,0x29,0x01,0xD0,0xAC,0x42, + 0x04,0xD2,0xA2,0x00,0xD2,0x18,0x12,0x68,0xC2,0x61,0x04,0xE0,0xCA,0x07,0x01,0xD0, + 0xC6,0x61,0x00,0xE0,0xC7,0x61,0x64,0x1C,0x2F,0x4A,0x12,0x78,0x00,0x2A,0x0B,0xD0, + 0xFD,0xF7,0x9C,0xFC,0x26,0x48,0x01,0x7A,0x00,0x29,0x07,0xD0,0x00,0x6B,0x00,0x04, + 0x00,0x0C,0x01,0xF0,0x4B,0xF8,0x01,0xE0,0xAC,0x42,0xDB,0xD9,0x02,0x20,0x00,0xF0, + 0x8F,0xFF,0x25,0x4D,0x28,0x78,0x00,0x28,0x27,0xD1,0xFD,0xF7,0xAD,0xFB,0x00,0x28, + 0x23,0xD0,0x22,0x48,0x0A,0x21,0x00,0x6B,0xFA,0xF7,0xFC,0xFB,0x01,0x00,0x02,0x20, + 0x00,0xF0,0x6A,0xFF,0x02,0x20,0x00,0xE0,0x26,0xE0,0x00,0xF0,0x6D,0xFF,0x14,0x4C, + 0x0C,0xE0,0x28,0x78,0x00,0x28,0x09,0xD0,0xFD,0xF7,0x70,0xFC,0x20,0x7A,0x00,0x28, + 0x04,0xD0,0x20,0x6B,0x00,0x04,0x00,0x0C,0x01,0xF0,0x20,0xF8,0xFD,0xF7,0x8C,0xFB, + 0x00,0x28,0xEE,0xD1,0x02,0x20,0x00,0xF0,0x63,0xFF,0x16,0x49,0xC8,0x68,0x01,0x22, + 0x10,0x43,0xC8,0x60,0x00,0xF0,0x2C,0xF8,0x05,0x48,0xC0,0x79,0x00,0x28,0x03,0xD1, + 0x01,0x20,0x80,0x02,0xFA,0xF7,0x04,0xFF,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0xFF,0x0F,0x00,0x00,0x30,0x0A,0x00,0x20, + 0xCC,0xF7,0xFF,0xFF,0x8F,0x06,0x00,0x00,0xAD,0x0B,0x00,0x20,0x00,0x78,0x00,0x00, + 0x00,0x00,0x4E,0x1D,0x00,0x80,0x4E,0x1D,0x40,0x00,0x00,0x40,0x04,0x00,0x00,0x20, + 0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40,0x01,0xC0,0x8F,0xE2,0x1C,0xFF,0x2F,0xE1, + 0x05,0x48,0x01,0x21,0x00,0xB5,0xC9,0x02,0x01,0x62,0x00,0x21,0x01,0x62,0xFD,0xF7, + 0x67,0xFE,0x08,0xBC,0x18,0x47,0x00,0x00,0x40,0x00,0x00,0x40,0x40,0x18,0x70,0x47, + 0x40,0x18,0x80,0x18,0x70,0x47,0x10,0xB4,0x40,0x18,0x01,0x9C,0x80,0x18,0xC0,0x18, + 0x00,0x19,0x10,0xBC,0x70,0x47,0x00,0x00,0xF8,0xB5,0x00,0x21,0x01,0x23,0x5B,0x07, + 0x18,0x68,0x13,0x4A,0x90,0x72,0x90,0x7A,0x01,0x28,0x01,0xD1,0x01,0x21,0x0D,0xE0, + 0x01,0x28,0x00,0xD9,0x02,0x21,0x00,0x28,0x08,0xD1,0x0D,0x48,0x20,0x22,0x00,0x21, + 0x0C,0x30,0xFF,0xF7,0x19,0xF8,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x20,0x13,0x25, + 0x08,0x4C,0xAD,0x01,0x08,0xE0,0x46,0x18,0xB6,0x00,0xF6,0x18,0x36,0x68,0x87,0x00, + 0x3F,0x19,0x7F,0x19,0x40,0x1C,0xFE,0x60,0x96,0x7A,0x86,0x42,0xF3,0xD8,0xEA,0xE7, + 0xB0,0x0A,0x00,0x20,0xF0,0x05,0x00,0x20,0x70,0xB5,0x1E,0x49,0x1C,0x4C,0x0D,0x00, + 0x20,0x78,0xA1,0x22,0xFF,0x35,0x92,0x00,0xBF,0x35,0x8E,0x18,0x00,0x28,0x0E,0xD0, + 0x5A,0x22,0x21,0x1D,0x28,0x00,0xFE,0xF7,0xD3,0xFF,0x17,0x49,0x09,0x22,0x30,0x00, + 0xFE,0xF7,0xCE,0xFF,0x20,0x78,0x60,0x70,0x70,0xBC,0x08,0xBC,0x18,0x47,0x09,0x22, + 0x00,0x21,0x30,0x00,0xFE,0xF7,0xE0,0xFF,0x5A,0x22,0x00,0x21,0x28,0x00,0xFE,0xF7, + 0xDB,0xFF,0x0D,0x48,0x5A,0x22,0x00,0x21,0x63,0x38,0xFE,0xF7,0xD5,0xFF,0x0A,0x48, + 0x09,0x22,0x00,0x21,0x09,0x38,0xFE,0xF7,0xCF,0xFF,0x00,0x20,0x05,0x49,0x60,0x70, + 0xA0,0x70,0xCA,0x88,0x23,0x23,0x9A,0x43,0xCA,0x80,0x04,0x49,0x88,0x75,0xDB,0xE7, + 0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20,0x6B,0x08,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xF3,0xB5,0x93,0x48,0x91,0xB0,0x40,0x7E,0x02,0x90,0x92,0x48,0x00,0x78,0x00,0x28, + 0x91,0x48,0x18,0xD0,0x0B,0x21,0x89,0x01,0x40,0x18,0x01,0x8A,0x8F,0x4A,0x1A,0x26, + 0x07,0x91,0x41,0x8A,0x1C,0x27,0x06,0x91,0x81,0x8A,0x05,0x91,0x1E,0x21,0x41,0x5E, + 0x04,0x91,0x00,0x21,0x51,0x5E,0x03,0x91,0x16,0x21,0x18,0x22,0x86,0x5F,0xC7,0x5F, + 0x41,0x5E,0x82,0x5E,0x16,0xE0,0x60,0x30,0xC1,0x8A,0x04,0x22,0x00,0x26,0x07,0x91, + 0x01,0x8B,0x02,0x27,0x06,0x91,0x41,0x8B,0x05,0x91,0x7D,0x49,0x20,0x39,0x8A,0x5E, + 0x04,0x92,0x06,0x22,0x8A,0x5E,0x03,0x92,0x8E,0x5F,0xCF,0x5F,0x1C,0x21,0x1E,0x22, + 0x41,0x5E,0x82,0x5E,0x11,0x98,0x78,0x4C,0x00,0x68,0x41,0x18,0x11,0x98,0x01,0x60, + 0x12,0x98,0x00,0x68,0x81,0x18,0x12,0x98,0x01,0x60,0x60,0x8C,0x00,0x21,0x40,0x1E, + 0x02,0x04,0x12,0x0C,0x68,0x46,0x06,0xC0,0x20,0x8C,0x0A,0x00,0x40,0x1E,0x03,0x04, + 0x11,0xA8,0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x23,0xFF,0x20,0x8C,0x64,0x21,0x0A,0x90, + 0x60,0x8C,0x09,0x90,0x0A,0x98,0x44,0x08,0x09,0x98,0x45,0x08,0x06,0x98,0x64,0x38, + 0x00,0x28,0x01,0xDC,0x06,0x98,0x08,0x1A,0x0F,0x90,0x05,0x98,0x64,0x38,0x00,0x28, + 0x01,0xDC,0x05,0x98,0x08,0x1A,0x0E,0x90,0x61,0x48,0x01,0x78,0x61,0x48,0x00,0x78, + 0x08,0x90,0x61,0x48,0x80,0x7E,0xC2,0x07,0x0A,0xD0,0x80,0x07,0x03,0xD5,0x49,0x1E, + 0x09,0x06,0x09,0x0E,0x04,0xE0,0x08,0x98,0x40,0x1E,0x00,0x06,0x00,0x0E,0x08,0x90, + 0x20,0x00,0xFA,0xF7,0xBD,0xF9,0x0A,0x99,0x08,0x1A,0x40,0x1E,0x0C,0x90,0x08,0x99, + 0x28,0x00,0xFA,0xF7,0xB5,0xF9,0x09,0x99,0x08,0x1A,0x40,0x1E,0x31,0x1E,0x0B,0x90, + 0x00,0xDD,0xA1,0x1B,0x00,0x2F,0x0D,0x97,0x01,0xDD,0xE8,0x1B,0x0D,0x90,0x11,0x98, + 0x00,0x68,0xA0,0x42,0x10,0x90,0x01,0xDB,0x00,0x1B,0x01,0xE0,0x00,0x1B,0x40,0x1C, + 0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x22,0x06,0x00,0x56,0x43,0x37,0x00,0x88,0x42, + 0x0D,0xDD,0x42,0x1A,0x0F,0x98,0x50,0x43,0x86,0x19,0x10,0x00,0x50,0x43,0x0F,0x9A, + 0x50,0x43,0x0C,0x9A,0x12,0x1B,0x51,0x1A,0xFA,0xF7,0x8A,0xF9,0xC7,0x19,0x04,0x98, + 0x00,0x28,0x01,0xD1,0x30,0x00,0x05,0xE0,0x01,0x28,0x01,0xD1,0x38,0x00,0x01,0xE0, + 0x70,0x00,0xC0,0x1B,0x64,0x21,0xFA,0xF7,0x7B,0xF9,0x07,0x99,0xC9,0x07,0x0A,0xD0, + 0x10,0x99,0xA1,0x42,0x03,0xDB,0x21,0x18,0x11,0x98,0x01,0x60,0x03,0xE0,0x11,0x99, + 0x20,0x1A,0x40,0x1E,0x08,0x60,0x12,0x98,0x07,0x68,0xAF,0x42,0x01,0xDB,0x78,0x1B, + 0x01,0xE0,0x78,0x1B,0x40,0x1C,0x00,0x28,0x00,0xDC,0x40,0x42,0x64,0x21,0x04,0x00, + 0x4C,0x43,0x0D,0x99,0x26,0x00,0x88,0x42,0x0E,0xDD,0x41,0x1A,0x0E,0x98,0x0D,0x9A, + 0x48,0x43,0x04,0x19,0x08,0x00,0x48,0x43,0x0E,0x99,0x48,0x43,0x0B,0x99,0x49,0x1B, + 0x89,0x1A,0xFA,0xF7,0x4D,0xF9,0x86,0x19,0x03,0x98,0x00,0x28,0x01,0xD1,0x20,0x00, + 0x05,0xE0,0x01,0x28,0x01,0xD1,0x30,0x00,0x01,0xE0,0x60,0x00,0x80,0x1B,0x64,0x21, + 0xFA,0xF7,0x3E,0xF9,0x07,0x99,0x89,0x07,0x09,0xD5,0xAF,0x42,0x03,0xDB,0x29,0x18, + 0x12,0x98,0x01,0x60,0x03,0xE0,0x12,0x99,0x28,0x1A,0x40,0x1E,0x08,0x60,0x0E,0x48, + 0x02,0x99,0x42,0x8C,0x6B,0x46,0x51,0x1A,0x49,0x1E,0x0A,0x04,0x02,0x99,0x12,0x0C, + 0x06,0xC3,0x01,0x8C,0x02,0x98,0x02,0x9A,0x08,0x1A,0x40,0x1E,0x03,0x04,0x11,0xA8, + 0x03,0xC8,0x1B,0x0C,0x00,0xF0,0x54,0xFE,0x13,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47, + 0xA0,0x78,0x00,0x00,0x04,0x0B,0x00,0x20,0x00,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20,0xF0,0xB4,0x05,0x00, + 0x0B,0x4C,0x00,0x20,0xFF,0x26,0x91,0x36,0x82,0x00,0xA3,0x5A,0x12,0x19,0x52,0x88, + 0x5B,0x1B,0x1F,0x00,0x5F,0x43,0x52,0x1A,0x13,0x00,0x53,0x43,0xFA,0x18,0xB2,0x42, + 0x04,0xDB,0x40,0x1C,0x1D,0x28,0xEF,0xD3,0x00,0x20,0xC0,0x43,0xF0,0xBC,0x70,0x47, + 0x08,0x71,0x00,0x00,0xFE,0xB5,0x66,0x4D,0x64,0x48,0x00,0x26,0x29,0x00,0xFF,0x31, + 0x00,0x96,0x42,0x78,0x61,0x31,0x08,0x78,0x00,0x2A,0x28,0xD1,0x00,0x28,0x26,0xD0, + 0x01,0x24,0x0A,0x20,0x60,0x43,0x47,0x19,0x38,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7, + 0xB1,0xFB,0x00,0x28,0x17,0xD0,0x5B,0x48,0x81,0x7B,0x00,0x98,0x40,0x1C,0x81,0x42, + 0x14,0xD3,0xA9,0x19,0x13,0x22,0x00,0x90,0xFF,0x20,0x92,0x01,0x65,0x30,0x89,0x18, + 0xC0,0x5D,0x3A,0x00,0xFF,0x32,0x48,0x70,0x76,0x1C,0x65,0x32,0x03,0x20,0x01,0x23, + 0x69,0x46,0x00,0xF0,0x33,0xFA,0x64,0x1C,0x09,0x2C,0xDA,0xDB,0x8F,0xE0,0x49,0x78, + 0x00,0x29,0x01,0xD1,0x00,0x28,0xF9,0xD0,0x15,0x20,0x40,0x01,0x00,0x24,0x2E,0x18, + 0x13,0x27,0xBF,0x01,0x28,0x19,0xC0,0x19,0x40,0x78,0x00,0x28,0x3F,0xD0,0x13,0x21, + 0x28,0x18,0x49,0x01,0x41,0x18,0xC9,0x7E,0x00,0x29,0x02,0xD0,0x32,0x7B,0x00,0x2A, + 0x14,0xD0,0x05,0x21,0xC9,0x01,0x40,0x18,0x00,0x99,0x00,0x79,0x49,0x1C,0x00,0x91, + 0x0A,0x21,0x48,0x43,0x42,0x19,0xFF,0x32,0xBF,0x32,0x02,0x20,0x03,0x23,0x69,0x46, + 0x00,0xF0,0x04,0xFA,0x20,0x00,0x14,0x2C,0x1E,0xD0,0x1A,0xE0,0x0A,0x20,0x41,0x43, + 0x48,0x19,0x02,0x90,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x5C,0xFB,0x00,0x28,0x13,0xD0, + 0x00,0x98,0x02,0x9A,0x40,0x1C,0xFF,0x32,0x00,0x90,0x65,0x32,0x03,0x20,0x02,0x23, + 0x69,0x46,0x00,0xF0,0xEB,0xF9,0x07,0xE0,0x29,0x18,0xC9,0x19,0x8A,0x78,0x40,0x1C, + 0x4A,0x70,0x08,0x28,0xF8,0xDB,0x64,0x1E,0x64,0x1C,0x08,0x2C,0xBA,0xDB,0x01,0x24, + 0x23,0x49,0x13,0x22,0x08,0x19,0x52,0x01,0x80,0x18,0xC0,0x7E,0x00,0x22,0x01,0x92, + 0x00,0x28,0x31,0xD0,0x32,0x7B,0x00,0x2A,0x2E,0xD1,0x0A,0x22,0x50,0x43,0x45,0x18, + 0x28,0x00,0xFF,0x30,0x6B,0x30,0xFD,0xF7,0x2D,0xFB,0x00,0x28,0x24,0xD0,0x19,0x48, + 0x00,0x9B,0x80,0x7B,0x5B,0x1C,0x98,0x42,0x21,0xD3,0x15,0x4A,0x00,0x20,0x11,0x18, + 0xC9,0x19,0x49,0x78,0xA1,0x42,0x0B,0xD0,0x00,0x29,0x06,0xD1,0xFF,0x21,0x65,0x31, + 0x49,0x5D,0x10,0x18,0xC0,0x19,0x41,0x70,0x05,0xE0,0x40,0x1C,0x08,0x28,0xEE,0xDB, + 0x01,0x98,0x00,0x28,0x08,0xD0,0x2A,0x00,0xFF,0x32,0x00,0x93,0x65,0x32,0x03,0x20, + 0x01,0x23,0x69,0x46,0x00,0xF0,0xA2,0xF9,0x64,0x1C,0x09,0x2C,0xC0,0xDB,0x00,0x98, + 0x00,0xF0,0x92,0xFC,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0xB0,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xFE,0xB5,0x51,0x48,0x36,0x25,0x45,0x5F, + 0x51,0x48,0x50,0x4F,0xC4,0x78,0x00,0x26,0x02,0x94,0x00,0x79,0x84,0x46,0x4C,0x48, + 0x80,0x30,0x82,0x7D,0x86,0x46,0x4D,0x48,0x81,0x7E,0xC8,0x07,0x0A,0xD0,0x88,0x07, + 0x03,0xD5,0x64,0x1E,0x24,0x06,0x24,0x0E,0x04,0xE0,0x60,0x46,0x40,0x1E,0x00,0x06, + 0x00,0x0E,0x84,0x46,0x00,0x21,0x27,0xE0,0x00,0x20,0x22,0xE0,0x91,0x42,0x05,0xD2, + 0x90,0x42,0x1D,0xD3,0xA3,0x1A,0x5B,0x1E,0x83,0x42,0x19,0xD3,0x63,0x46,0x9B,0x1A, + 0x5B,0x1E,0x8B,0x42,0x01,0xD2,0x90,0x42,0x12,0xD3,0x8B,0x42,0x03,0xD2,0xA3,0x1A, + 0x5B,0x1E,0x83,0x42,0x0C,0xD3,0x02,0x9B,0x4B,0x43,0x1B,0x18,0x9B,0x00,0xFB,0x58, + 0x1B,0x01,0x1B,0x0D,0xB3,0x42,0x00,0xDD,0x1E,0x00,0xAB,0x42,0x00,0xDA,0x1D,0x00, + 0x40,0x1C,0xA0,0x42,0xDA,0xD3,0x49,0x1C,0x61,0x45,0xD5,0xD3,0x1E,0x24,0x70,0x46, + 0x04,0x5F,0x2B,0x4B,0x2E,0x48,0xA0,0x33,0xC0,0x88,0x06,0x22,0x9A,0x5E,0x40,0x06, + 0x07,0xD5,0x70,0x46,0x80,0x8A,0x01,0x19,0x0C,0x04,0x10,0x1A,0x24,0x14,0x02,0x04, + 0x12,0x14,0x26,0x48,0x80,0x30,0xC1,0x6A,0xA6,0x42,0x05,0xDD,0x74,0x46,0x64,0x8B, + 0xA1,0x42,0x05,0xDA,0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0xC1,0x62, + 0x1E,0x49,0x80,0x31,0x09,0x6B,0x95,0x42,0x04,0xDA,0x5A,0x88,0x91,0x42,0x05,0xDA, + 0x49,0x1C,0x02,0xE0,0x00,0x29,0x01,0xDD,0x49,0x1E,0x01,0x63,0x74,0x46,0xA4,0x8B, + 0xC5,0x6A,0x01,0x22,0x11,0x00,0xA5,0x42,0x00,0xDC,0x00,0x21,0x9B,0x88,0x00,0x6B, + 0x98,0x42,0x00,0xDC,0x00,0x22,0x00,0x20,0x6B,0x46,0x18,0x70,0x59,0x70,0x00,0x29, + 0x9A,0x70,0x02,0xD0,0x00,0x2A,0x00,0xD0,0x01,0x20,0x6B,0x46,0x11,0x43,0xD8,0x70, + 0x01,0xD0,0x01,0x20,0x00,0xE0,0x00,0x20,0x6B,0x46,0x18,0x71,0x70,0x46,0x00,0x7B, + 0x69,0x46,0x08,0x5C,0x00,0x28,0x00,0xD0,0x80,0x20,0xFE,0xBC,0x08,0xBC,0x18,0x47, + 0x00,0x78,0x00,0x00,0x00,0x02,0x10,0x40,0xF8,0x0A,0x00,0x20,0x30,0x0A,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xF8,0xB5,0x22,0x48,0x22,0x4C,0xC0,0x88,0x01,0x23,0x22,0x4D, + 0x41,0x06,0x09,0x20,0x80,0x01,0x21,0x4F,0x21,0x4E,0x5B,0x05,0x20,0x18,0x00,0x29, + 0x0E,0xDA,0x81,0x69,0x69,0x61,0xC1,0x69,0xA9,0x61,0x41,0x6A,0x99,0x43,0xE9,0x61, + 0x81,0x6A,0x29,0x62,0x01,0x6A,0xE9,0x60,0x80,0x6B,0x28,0x61,0xE0,0x6A,0x0E,0xE0, + 0x18,0x49,0x4A,0x69,0x6A,0x61,0x8A,0x69,0xAA,0x61,0x0A,0x6A,0x9A,0x43,0xEA,0x61, + 0x4A,0x6A,0x2A,0x62,0xC9,0x69,0xE9,0x60,0x40,0x6B,0x28,0x61,0xA0,0x6A,0xFF,0x21, + 0x41,0x31,0x48,0x43,0x39,0x00,0xFA,0xF7,0x15,0xF8,0xB0,0x62,0x30,0x7B,0x00,0x28, + 0x03,0xD0,0x0D,0x48,0xE8,0x60,0x0D,0x48,0x28,0x61,0x60,0x6A,0xFF,0x21,0x41,0x31, + 0x48,0x43,0x39,0x00,0xFA,0xF7,0x06,0xF8,0x70,0x62,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xF0,0x05,0x00,0x20,0x00,0x78,0x00,0x00,0xC0,0x90,0x00,0x40,0x10,0x27,0x00,0x00, + 0xF8,0x0A,0x00,0x20,0x80,0x79,0x00,0x00,0x41,0xF2,0x01,0x00,0x10,0x00,0x10,0x00, + 0x0E,0x48,0x0F,0x4A,0x43,0x78,0x0F,0x49,0xD0,0x1D,0xC9,0x88,0xFF,0x32,0xF9,0x30, + 0xC1,0x32,0x02,0x2B,0x04,0xD9,0x12,0x6A,0x49,0x06,0x0C,0xD4,0xC2,0x69,0x0A,0xE0, + 0x02,0x2B,0x04,0xD1,0xD2,0x69,0x49,0x06,0x05,0xD4,0x82,0x69,0x03,0xE0,0x92,0x69, + 0x49,0x06,0x00,0xD4,0x42,0x69,0x04,0x48,0x42,0x62,0x70,0x47,0x50,0x07,0x00,0x20, + 0x00,0x78,0x00,0x00,0xF0,0x05,0x00,0x20,0xC0,0x90,0x00,0x40,0xF0,0xB4,0x0E,0x48, + 0x0E,0x49,0xC0,0x88,0x03,0x23,0x01,0x26,0x42,0x06,0x0D,0x48,0x0D,0x4D,0x0E,0x4F, + 0x9B,0x03,0xC8,0x24,0xF6,0x03,0x00,0x2A,0x01,0x61,0x01,0xDA,0x0B,0x49,0x01,0xE0, + 0x0A,0x49,0x32,0x39,0x41,0x61,0x83,0x61,0xC4,0x61,0x03,0x62,0x45,0x62,0x86,0x62, + 0xC7,0x62,0xF0,0xBC,0x70,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0x00,0x80,0x00,0x03, + 0x40,0xA1,0x00,0x40,0x2C,0xC1,0x00,0x00,0x64,0x80,0x00,0x00,0x90,0x01,0x01,0x00, + 0x70,0xB5,0x01,0x25,0x6D,0x03,0x28,0x00,0xFA,0xF7,0xDA,0xFA,0x16,0x48,0x04,0x68, + 0x28,0x00,0xFA,0xF7,0xCD,0xFA,0x15,0x4D,0xE2,0x06,0xD2,0x0E,0xE0,0x04,0x14,0x49, + 0xC0,0x0E,0x2A,0x71,0xE8,0x70,0x0B,0x7D,0x12,0x48,0x83,0x76,0x4B,0x7D,0xC3,0x76, + 0x83,0x7E,0x11,0x48,0xDC,0x07,0x0A,0xD0,0x9B,0x07,0x04,0xD5,0xEA,0x78,0x52,0x1E, + 0x02,0x72,0x00,0x22,0x02,0xE0,0x52,0x1E,0x02,0x72,0x01,0x22,0x6A,0x71,0x8A,0x7D, + 0x42,0x72,0xCA,0x7D,0x82,0x72,0x0A,0x7E,0xC2,0x72,0x4A,0x7E,0x02,0x73,0x89,0x7E, + 0x41,0x73,0x70,0xBC,0x08,0xBC,0x18,0x47,0x40,0x90,0x00,0x40,0xF8,0x0A,0x00,0x20, + 0x00,0x78,0x00,0x00,0x30,0x0A,0x00,0x20,0x70,0x0A,0x00,0x20,0xF8,0xB5,0x05,0x00, + 0x0E,0x00,0x14,0x00,0x19,0x00,0x10,0x00,0xFA,0xF7,0x96,0xFF,0x00,0x28,0x05,0xD0, + 0x30,0x68,0x40,0x1E,0x30,0x60,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x2D,0x48,0x80,0x7E, + 0xC0,0x07,0x26,0xD0,0xE0,0x79,0x05,0x28,0x21,0xD0,0x09,0x28,0x21,0xD1,0x2A,0x49, + 0x6D,0x08,0x6D,0x00,0x23,0x78,0x01,0x20,0x8C,0x46,0x13,0xE0,0x0A,0x22,0x01,0x00, + 0x51,0x43,0x26,0x4A,0x89,0x18,0x0A,0x00,0xFF,0x32,0xA1,0x32,0x97,0x7F,0xBB,0x42, + 0x07,0xD1,0xFF,0x31,0xC1,0x31,0x0F,0x88,0x67,0x80,0xD2,0x7F,0x62,0x70,0x49,0x88, + 0xA1,0x80,0x40,0x1C,0x61,0x46,0x49,0x78,0x81,0x42,0xE7,0xDA,0x01,0xE0,0x01,0x20, + 0x05,0x43,0x0F,0x20,0xA9,0x07,0x80,0x06,0x81,0x43,0x20,0x78,0x3F,0x22,0x92,0x02, + 0x00,0x07,0x80,0x08,0x01,0x43,0x16,0x48,0x01,0x40,0x60,0x88,0x80,0x05,0x80,0x09, + 0x01,0x43,0x60,0x78,0x91,0x43,0x80,0x06,0x00,0x0C,0x01,0x43,0x08,0x04,0x80,0x0E, + 0x0A,0x28,0x09,0xD2,0x40,0x1C,0x0A,0x23,0x58,0x43,0x3F,0x28,0x00,0xDD,0x3F,0x20, + 0x80,0x06,0x91,0x43,0x00,0x0C,0x01,0x43,0x88,0x0A,0xA1,0x88,0x80,0x02,0x01,0x22, + 0x89,0x05,0x89,0x0D,0x08,0x43,0x31,0x68,0x52,0x07,0x89,0x00,0x89,0x18,0x48,0x60, + 0xA1,0xE7,0x00,0x00,0x30,0x0A,0x00,0x20,0x50,0x07,0x00,0x20,0xF0,0x05,0x00,0x20, + 0xFF,0xFF,0x00,0xFC,0x0E,0x49,0x10,0xB4,0x48,0x7B,0x00,0x28,0x10,0xD0,0x00,0x09, + 0x00,0x01,0x00,0x23,0x01,0x22,0x40,0x28,0x0C,0xD0,0x80,0x28,0x08,0xD1,0x4A,0x72, + 0x8A,0x72,0x08,0x48,0xCA,0x72,0xCA,0x71,0x00,0x78,0x00,0x28,0x06,0xD1,0x0B,0x73, + 0x10,0xBC,0x70,0x47,0x8B,0x71,0xCA,0x71,0x0B,0x72,0xF9,0xE7,0x0A,0x73,0xF7,0xE7, + 0xF8,0x0A,0x00,0x20,0xA0,0x7A,0x00,0x00,0xF8,0xB5,0x06,0x9F,0x07,0x9D,0x0C,0x00, + 0x1E,0x00,0x88,0x42,0x09,0xD3,0x21,0x00,0x10,0x00,0xF9,0xF7,0xE9,0xFD,0x38,0x80, + 0x21,0x00,0x30,0x00,0xF9,0xF7,0xE4,0xFD,0x28,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47, + 0xF8,0xB5,0x08,0xAD,0x60,0xCD,0x04,0x00,0x06,0x98,0x91,0x42,0x04,0xDA,0x65,0x80, + 0xA6,0x80,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x99,0x42,0x02,0xDB,0x60,0x80,0x07,0x98, + 0x0F,0xE0,0x8F,0x1A,0x40,0x1B,0x78,0x43,0x99,0x1A,0x00,0x91,0xF9,0xF7,0xC8,0xFD, + 0x40,0x19,0x60,0x80,0x07,0x98,0x00,0x99,0x80,0x1B,0x78,0x43,0xF9,0xF7,0xC0,0xFD, + 0x80,0x19,0xA0,0x80,0xE5,0xE7,0x00,0x00,0xF0,0xB4,0x8C,0x79,0x14,0x4B,0x00,0x26, + 0x22,0x07,0x92,0x08,0x1A,0x40,0xCB,0x79,0x92,0x0A,0x92,0x02,0x5B,0x07,0x09,0xD5, + 0x10,0x4D,0xAB,0x89,0x00,0x2B,0x05,0xD0,0x9F,0x05,0xBF,0x0D,0x3A,0x43,0x64,0x00, + 0x64,0x19,0xE3,0x81,0x3F,0x23,0x9B,0x02,0x9A,0x43,0xCB,0x79,0x80,0x00,0x9B,0x06, + 0x1B,0x0C,0x1A,0x43,0x01,0x23,0x5B,0x07,0xC0,0x18,0x42,0x60,0xC8,0x79,0xC0,0x06, + 0x80,0x0F,0x03,0xD0,0x04,0x48,0x01,0x21,0xC1,0x75,0x06,0x76,0xF0,0xBC,0x70,0x47, + 0xFF,0xFF,0x00,0xFC,0xF0,0x05,0x00,0x20,0x30,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4D, + 0x0C,0x4C,0x2D,0x78,0x68,0x43,0x40,0x18,0x45,0x00,0x60,0x5B,0x01,0x06,0x00,0x0A, + 0x09,0x0E,0x82,0x18,0xC9,0x18,0x00,0x20,0x4B,0x1E,0xC0,0x43,0xFF,0x2B,0x06,0xD2, + 0x53,0x1E,0xFF,0x2B,0x03,0xD2,0x10,0x02,0x08,0x43,0x60,0x53,0x00,0x20,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x10,0xB4,0x05,0x4C, + 0x03,0x4B,0x24,0x78,0x60,0x43,0x40,0x18,0x40,0x00,0x1A,0x52,0x10,0xBC,0x70,0x47, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0x30,0xB4,0x0E,0x4B,0x0C,0x4C,0x1B,0x78, + 0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A,0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A, + 0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43,0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D, + 0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52,0x00,0x20,0x30,0xBC,0x70,0x47,0x00,0x00, + 0x00,0x00,0x10,0x40,0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x15,0x4A,0x15,0x4B,0x52,0x7D, + 0x13,0x4F,0x00,0x21,0x16,0x02,0x16,0x43,0x1A,0x78,0x10,0x4D,0x42,0x43,0x20,0x3F, + 0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0,0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E, + 0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42,0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0, + 0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C,0x06,0x4B,0x04,0x00,0x1B,0x78,0x5C,0x43, + 0xE3,0x18,0x93,0x42,0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0x20,0x78,0x00,0x00,0xFB,0x0A,0x00,0x20,0xF0,0xB4,0x14,0x4A,0x13,0x4B,0x52,0x7D, + 0x00,0x21,0x11,0x4C,0x15,0x02,0x15,0x43,0x11,0x4E,0x20,0x3B,0x13,0xE0,0x9A,0x7D, + 0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E,0x8A,0x42,0x07,0xD0, + 0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0,0x42,0x00,0xA5,0x52, + 0x32,0x78,0x80,0x18,0x49,0x1C,0x07,0x4A,0x37,0x78,0x12,0x78,0x7A,0x43,0x82,0x42, + 0xE5,0xD8,0xF0,0xBC,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40,0x20,0x78,0x00,0x00, + 0xFB,0x0A,0x00,0x20,0xFC,0x0A,0x00,0x20,0x02,0x04,0x04,0x49,0x02,0x43,0x00,0x20, + 0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3,0x70,0x47,0x00,0x00,0x00,0x00,0x10,0x40, + 0xF8,0xB5,0x03,0x00,0x1E,0x49,0x05,0x20,0xC0,0x01,0x0A,0x18,0x0B,0x20,0x80,0x01, + 0x0D,0x18,0xC0,0x31,0x08,0x6A,0x19,0x4C,0x00,0x90,0x4F,0x6A,0x0E,0x69,0x28,0x68, + 0x00,0xF0,0x0E,0xFA,0x06,0x04,0x0A,0x12,0x15,0x1F,0x26,0x1C,0xC8,0x68,0x20,0x62, + 0x50,0x6B,0x60,0x62,0x02,0x20,0x04,0xE0,0xC8,0x69,0x20,0x62,0x68,0x68,0x60,0x62, + 0x04,0x20,0xE0,0x62,0x00,0x98,0x11,0xE0,0x26,0x62,0x90,0x6B,0x02,0xE0,0x48,0x69, + 0x20,0x62,0xD0,0x6B,0x60,0x62,0x04,0x20,0xE0,0x62,0x67,0x63,0xF8,0xBC,0x08,0xBC, + 0x18,0x47,0x26,0x62,0x60,0x62,0x04,0x20,0xE0,0x62,0x88,0x6A,0x60,0x63,0xF5,0xE7, + 0x89,0x69,0x21,0x62,0x60,0x62,0x05,0x20,0xE0,0x62,0xEF,0xE7,0x80,0x90,0x00,0x40, + 0x00,0x78,0x00,0x00,0x07,0x4A,0x10,0xB5,0xD1,0x88,0x40,0x23,0x00,0x28,0x01,0xD0, + 0x19,0x43,0x00,0xE0,0x99,0x43,0xD1,0x80,0xFF,0xF7,0x14,0xFD,0x10,0xBC,0x08,0xBC, + 0x18,0x47,0x00,0x00,0xF0,0x05,0x00,0x20,0xFE,0xB5,0x41,0x4C,0x05,0x00,0x27,0x6A, + 0x0E,0x00,0x60,0x6A,0x02,0x90,0x60,0x6B,0x01,0x90,0xE0,0x6A,0x00,0x90,0x00,0x20, + 0xFF,0xF7,0x9E,0xFF,0x3B,0x48,0x20,0x62,0x22,0x20,0x60,0x62,0x07,0x20,0x40,0x02, + 0x60,0x63,0x02,0x20,0xE0,0x62,0x00,0x20,0xFB,0xF7,0xDA,0xFC,0x36,0x48,0x00,0x7A, + 0x00,0x28,0x01,0xD0,0xFE,0xF7,0xE6,0xF9,0xFB,0xF7,0x1E,0xFD,0x2C,0x00,0x46,0xE0, + 0x68,0x1E,0x84,0x42,0x01,0xD1,0xFB,0xF7,0x41,0xFD,0xFB,0xF7,0xE3,0xFC,0xFB,0xF7, + 0x91,0xFD,0x00,0x2E,0x2E,0xD1,0xA8,0x00,0x05,0x21,0xF9,0xF7,0x23,0xFD,0xA0,0x42, + 0x03,0xD8,0x01,0x22,0x11,0x00,0x04,0x20,0x21,0xE0,0x68,0x00,0x28,0x18,0x05,0x21, + 0xF9,0xF7,0x18,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00,0x03,0x20,0x16,0xE0, + 0x68,0x00,0x05,0x21,0xF9,0xF7,0x0E,0xFD,0xA0,0x42,0x03,0xD8,0x01,0x22,0x11,0x00, + 0x02,0x20,0x0C,0xE0,0x05,0x21,0x28,0x00,0xF9,0xF7,0x04,0xFD,0xA0,0x42,0x03,0xD8, + 0x01,0x22,0x11,0x00,0x10,0x00,0x02,0xE0,0x01,0x22,0x11,0x00,0x00,0x20,0xFB,0xF7, + 0x95,0xFA,0x0C,0xE0,0x68,0x00,0x03,0x21,0xF9,0xF7,0xF4,0xFC,0xA0,0x42,0xDB,0xD9, + 0x03,0x21,0x28,0x00,0xF9,0xF7,0xEE,0xFC,0xA0,0x42,0xE9,0xD8,0xDE,0xE7,0x64,0x1E, + 0xB6,0xD2,0x0E,0x48,0x44,0x88,0x03,0xE0,0xFB,0xF7,0x9C,0xFC,0xFB,0xF7,0x4A,0xFD, + 0x64,0x1E,0xF9,0xD2,0xFB,0xF7,0xC0,0xFC,0x05,0x48,0x07,0x62,0x02,0x99,0x41,0x62, + 0x01,0x99,0x41,0x63,0x00,0x99,0xC1,0x62,0xFE,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0x80,0x90,0x00,0x40,0x01,0x02,0x00,0x00,0x80,0x78,0x00,0x00,0xE0,0x7A,0x00,0x00, + 0x30,0xB4,0x0D,0x4D,0xEC,0x7B,0x00,0x2C,0x13,0xD0,0x02,0x68,0x0B,0x68,0xA4,0x07, + 0x03,0xD5,0x2C,0x8C,0xA2,0x1A,0x52,0x1E,0x02,0x60,0xEC,0x7B,0x64,0x07,0x03,0xD5, + 0x6C,0x8C,0xE3,0x1A,0x5B,0x1E,0x0B,0x60,0xEC,0x7B,0xE4,0x07,0x01,0xD0,0x03,0x60, + 0x0A,0x60,0x30,0xBC,0x70,0x47,0x00,0x00,0x00,0x78,0x00,0x00,0x02,0x49,0x00,0x03, + 0x40,0x18,0xC0,0x68,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xAD,0x0B,0x00,0x20,0x30,0xB4,0x05,0x03,0x05,0x48,0x02,0x9C, + 0x28,0x18,0x02,0x60,0x41,0x60,0x00,0x2B,0x00,0xD0,0x03,0x61,0x84,0x60,0x30,0xBC, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x02,0x4A,0x00,0x03,0x80,0x18,0x01,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68, + 0xFF,0x22,0x01,0x32,0x11,0x43,0x81,0x60,0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40, + 0x01,0x03,0x04,0x48,0x08,0x18,0x81,0x68,0xFF,0x22,0x01,0x32,0x91,0x43,0x81,0x60, + 0x70,0x47,0x00,0x00,0x00,0x20,0x00,0x40,0x0F,0x49,0x89,0x7B,0x81,0x42,0x00,0xD2, + 0x08,0x00,0x01,0x22,0x52,0x07,0x01,0x28,0x0C,0xD1,0x91,0x68,0x8B,0x0F,0xDB,0x07, + 0x04,0xD0,0x89,0x00,0x89,0x08,0x83,0x07,0xC9,0x18,0x01,0xE0,0x89,0x00,0x89,0x08, + 0x51,0x60,0x07,0xE0,0x01,0x28,0x05,0xD9,0x01,0x21,0xC9,0x07,0x83,0x05,0x9B,0x0D, + 0x19,0x43,0xF5,0xE7,0x10,0x60,0x70,0x47,0x00,0x78,0x00,0x00,0xF8,0xB5,0x17,0x48, + 0x00,0x24,0x40,0x78,0x00,0x28,0x25,0xD0,0x15,0x4D,0x13,0x26,0x00,0x20,0xB6,0x01, + 0xAB,0x19,0x12,0xE0,0x81,0x00,0x49,0x19,0x89,0x19,0xCA,0x68,0x97,0x0F,0xFF,0x07, + 0x0A,0xD0,0x92,0x00,0x01,0x27,0x92,0x08,0xFF,0x07,0xD2,0x19,0x64,0x1C,0xCA,0x60, + 0xA1,0x00,0xBF,0x08,0xC9,0x19,0x4A,0x60,0x40,0x1C,0x99,0x7A,0x81,0x42,0xE9,0xDC, + 0x08,0x48,0x09,0x22,0x00,0x21,0xFE,0xF7,0xC7,0xF8,0x20,0x00,0xFF,0xF7,0xB4,0xFF, + 0xFC,0xF7,0xAA,0xFC,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00,0x50,0x07,0x00,0x20, + 0xF0,0x05,0x00,0x20,0xB1,0x0A,0x00,0x20,0x08,0x48,0x10,0xB5,0x04,0x04,0x24,0x0C, + 0x07,0x49,0x00,0x22,0x20,0x00,0xF9,0xF7,0x25,0xFC,0x05,0x4A,0x05,0x49,0x20,0x00, + 0x00,0x23,0xF9,0xF7,0x27,0xFC,0x10,0xBC,0x08,0xBC,0x18,0x47,0x00,0x78,0x00,0x00, + 0x00,0x03,0x00,0x00,0xC8,0x02,0x00,0x20,0x70,0xB5,0x05,0x00,0x08,0x48,0x00,0x22, + 0x04,0x04,0x24,0x0C,0x40,0x21,0x20,0x00,0xF9,0xF7,0x0C,0xFC,0x40,0x22,0x29,0x00, + 0x20,0x00,0x00,0x23,0xF9,0xF7,0x0E,0xFC,0x70,0xBC,0x08,0xBC,0x18,0x47,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x02,0x4B,0x58,0x60,0x99,0x60,0x1A,0x60,0x70,0x47,0x00,0x00, + 0x00,0x30,0x00,0x40,0x01,0x04,0x00,0xB5,0x03,0x48,0x02,0x22,0x09,0x0C,0xFF,0xF7, + 0xF1,0xFF,0x08,0xBC,0x18,0x47,0x00,0x00,0xE1,0x04,0x00,0x00,0x02,0x48,0x01,0x68, + 0x01,0x22,0x11,0x43,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x48,0x01,0x68, + 0x49,0x08,0x49,0x00,0x01,0x60,0x70,0x47,0x00,0x30,0x00,0x40,0x02,0x49,0x02,0x22, + 0x0A,0x61,0x88,0x60,0x70,0x47,0x00,0x00,0x00,0x30,0x00,0x40,0x01,0x49,0x01,0x20, + 0x08,0x70,0x70,0x47,0xAC,0x0B,0x00,0x20,0x00,0x04,0x00,0x0C,0x01,0x21,0x89,0x07, + 0x08,0x61,0x70,0x47,0x01,0x20,0x80,0x07,0x81,0x68,0x82,0x15,0x11,0x43,0x81,0x60, + 0x70,0x47,0x01,0x21,0x89,0x07,0x88,0x68,0x8A,0x15,0x90,0x43,0x88,0x60,0x70,0x47, + 0x70,0xB4,0x03,0xAC,0x30,0xCC,0x06,0x68,0x96,0x42,0x01,0xDB,0x32,0x00,0x00,0xE0, + 0x02,0x60,0x9A,0x42,0x00,0xDD,0x03,0x60,0x08,0x68,0xA0,0x42,0x00,0xDA,0x0C,0x60, + 0x08,0x68,0xA8,0x42,0x00,0xDD,0x0D,0x60,0x70,0xBC,0x70,0x47,0x00,0x47,0x00,0x00, + 0x78,0x47,0xC0,0x46,0x01,0xC0,0x5E,0xE5,0x0C,0x00,0x53,0xE1,0x03,0x30,0xDE,0x37, + 0x0C,0x30,0xDE,0x27,0x83,0xC0,0x8E,0xE0,0x1C,0xFF,0x2F,0xE1,0x10,0xB5,0xF9,0xF7, + 0xA1,0xFB,0x10,0xBC,0x08,0xBC,0x18,0x47,0x12,0x00,0x13,0x00,0xA0,0x00,0x13,0x00, + 0x2E,0x01,0x13,0x00,0x2E,0x01,0x3E,0x00,0x2E,0x01,0x69,0x00,0x50,0x00,0x78,0x00, + 0xA0,0x00,0x78,0x00,0x2E,0x01,0x94,0x00,0x2E,0x01,0xBF,0x00,0x2E,0x01,0xEB,0x00, + 0xF0,0x00,0xF0,0x00,0xA0,0x00,0xF0,0x00,0x50,0x00,0xF0,0x00,0x12,0x00,0x0C,0x01, + 0x12,0x00,0x37,0x01,0x12,0x00,0x62,0x01,0x12,0x00,0x8E,0x01,0x12,0x00,0xCD,0x01, + 0x30,0x00,0xAE,0x01,0x50,0x00,0xCD,0x01,0x70,0x00,0xAE,0x01,0x90,0x00,0xCD,0x01, + 0xB0,0x00,0xAE,0x01,0xD0,0x00,0xCD,0x01,0xF0,0x00,0xAE,0x01,0x10,0x01,0xCD,0x01, + 0x2E,0x01,0xAE,0x01,0xF0,0x00,0x68,0x01,0xA0,0x00,0x68,0x01,0x89,0x08,0x49,0x1E, + 0xC9,0x04,0x01,0x22,0xC9,0x08,0xD2,0x07,0x89,0x18,0x40,0x04,0x40,0x0C,0x01,0x43, + 0x03,0x48,0x41,0x61,0x41,0x69,0x00,0x29,0xFC,0xDB,0x80,0x6B,0x70,0x47,0x00,0x00, + 0x00,0x70,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x0B,0x30,0x0B,0x30,0x01,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0x00,0xFF,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0xFF,0xFC,0x0F,0x00,0x7F,0xFC,0x0F,0x01,0x3F,0xFE,0x0F,0x02,0x1F,0xFF,0x0F,0x03, + 0x8F,0xFF,0x0F,0x04,0xC7,0xFF,0x0F,0x05,0xE3,0xFF,0x0F,0x06,0xF3,0xFB,0x0F,0x07, + 0xFB,0xF3,0x0F,0x08,0xFF,0xE3,0x0F,0x09,0xFF,0xC7,0x0F,0x0A,0xFF,0x8F,0x0F,0x0B, + 0xFF,0x1F,0x0F,0x0C,0xFF,0x3F,0x0E,0x0D,0xFF,0x7F,0x0C,0x0E,0xFF,0xFF,0x0C,0x4F, + 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x13, + 0x00,0x01,0x90,0x08,0x80,0x02,0x80,0x0A,0x40,0x01,0x70,0x0C,0xA0,0x00,0x60,0x0E, + 0x50,0x00,0x50,0x10,0x28,0x00,0x40,0x12,0x14,0x00,0x30,0x1C,0x08,0x04,0x20,0x1E, + 0x04,0x08,0xA0,0x20,0x00,0x14,0xB0,0x22,0x00,0x28,0xC0,0x00,0x00,0x50,0xD0,0x00, + 0x00,0xA0,0xE0,0x00,0x00,0x40,0xF1,0x00,0x00,0x80,0x02,0x01,0x00,0x00,0x11,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xF0,0xC3,0x03,0x00,0x20,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x03,0x03,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x01,0x05,0x08,0x02,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x01,0x08,0xFF,0xFF,0xFF,0x00,0x00,0xC8,0x05,0x1E, + 0x40,0x01,0xE0,0x01,0xE8,0x03,0x00,0x00,0x74,0x27,0x00,0x00,0x3C,0x28,0x00,0x00, + 0xE0,0x93,0x04,0x00,0x01,0x5A,0xA4,0x06,0xA4,0x06,0x00,0x00,0x04,0xC8,0x65,0x65, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x6E,0x00,0x7A,0x00,0x01,0x00,0x04,0x00, + 0x78,0x00,0xA0,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x80,0x15,0x04,0x02,0x32,0x00, + 0x2C,0x01,0x2C,0x01,0x00,0x00,0x00,0x00,0x50,0x00,0x5A,0x00,0x32,0x00,0xB8,0x0B, + 0x50,0x00,0x5A,0x00,0x32,0x00,0xE8,0x03,0x64,0x00,0x32,0x00,0x00,0x00,0x00,0x00, + 0x04,0x01,0x05,0x0F,0x01,0x01,0x04,0x00,0x01,0x05,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00, + 0x00,0x0E,0x00,0x00,0x60,0x0F,0x00,0x00,0x60,0x0F,0x00,0x00,0x9D,0x39,0xC8,0x00, + 0x28,0x00,0x1D,0x00,0x64,0x46,0x64,0x46,0x32,0x00,0x32,0x00,0x64,0x00,0xC8,0x00, + 0x64,0x00,0x64,0x00,0x01,0x00,0x0A,0x02,0x3C,0x00,0x2C,0x01,0x2C,0x01,0x2C,0x01, + 0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0x0A,0x02,0x32,0x00,0xB8,0x0B,0xBC,0x02,0x0A,0x00,0x32,0x32,0x96,0x32,0x40,0x64, + 0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x3C,0x00,0x1E,0x00,0x28,0xFA,0x0C,0x78, + 0x00,0x05,0x04,0x0A,0x01,0x06,0x20,0x03,0x3C,0x00,0x0A,0x3C,0x00,0x05,0x1E,0x00, + 0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xDC,0x00,0x05,0x02,0x01,0x01,0x01,0x00,0x02,0x03,0x05,0x00,0x03,0x03,0x06,0x06, + 0x09,0x09,0x0C,0x0C,0x0F,0x55,0x01,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x41,0xF2,0x01,0x00, + 0x0A,0x0A,0xA8,0x00,0x10,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00,0x3C,0x00,0x5A,0x00, + 0x99,0x19,0xC8,0x00,0x32,0x00,0x1D,0x00,0x64,0x46,0x64,0x46,0x32,0x00,0x32,0x00, + 0x64,0x00,0x64,0x00,0x64,0x00,0x64,0x00,0x01,0x00,0x0A,0x02,0x50,0x00,0x5E,0x01, + 0x5E,0x01,0x5E,0x01,0x90,0x01,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, + 0xFF,0xFF,0x00,0x00,0x08,0x02,0x32,0x00,0xDC,0x05,0xF4,0x01,0x0A,0x00,0x32,0x32, + 0x96,0x32,0x40,0x64,0x64,0x64,0xFF,0x00,0x00,0x00,0x5E,0x01,0x28,0x00,0x14,0x00, + 0xFF,0xFF,0x0D,0xFF,0x00,0x05,0x04,0x0A,0x02,0x06,0xD0,0x07,0x3C,0x00,0x0F,0x3C, + 0x00,0x05,0x1E,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xDC,0x00,0x05,0x04,0x01,0x01,0x01,0x00,0x04,0x03,0x01,0x00, + 0x04,0x04,0x08,0x08,0x0C,0x0C,0x10,0x10,0x14,0x55,0x01,0x00,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,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00, + 0x41,0xF2,0x01,0x00,0x08,0x08,0xA8,0x00,0x20,0x5F,0x20,0x3F,0x00,0x00,0x00,0x00, + 0x32,0x00,0x28,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, + 0x96,0x00,0x0F,0x00,0x05,0x00,0x00,0x00,0x1E,0x00,0xC8,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x00,0x00,0x00,0x00,0x00,0x90,0x01,0x00,0x00,0x58,0x02,0xBC,0x02,0x00,0x00, + 0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00, + 0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x64,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x14,0x00,0x00,0x5A,0x5A,0x5A,0x5A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x28,0x00,0x50,0x00,0x1E,0x00,0x50,0x00,0x28,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x95,0x00,0x00,0x00,0x00,0x00,0x00,0xD0,0x47,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xFF,0x0F,0x02,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x10,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x00,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x60,0x0F,0x00,0x00,0x01,0x00,0x00,0x00,0xFF,0x0F,0xC8,0x00, + 0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x41,0x42,0x01,0x00, + 0x10,0x00,0x10,0x00,0x96,0x00,0x30,0x00,0x2C,0x01,0xFA,0x00,0x08,0x08,0x88,0x00, + 0x20,0x5F,0x20,0x3F,0xFF,0xFF,0x00,0x00,0x10,0x10,0x08,0x84,0x00,0x00,0xAC,0x0D, + 0x01,0x00,0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x08,0x20, + 0x51,0x30,0x10,0x00,0x11,0x90,0x01,0x00,0xFF,0xFF,0x0F,0x00,0xFF,0xFF,0x0F,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00, + 0x54,0x55,0x45,0x00,0x10,0x30,0x00,0x00,0x00,0x70,0x01,0x00,0x00,0x00,0x00,0x00, + 0x38,0x31,0x08,0x01,0x70,0x30,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x20,0x00,0x50,0x30,0x12,0x14,0x00,0x00,0x1C,0x0C,0x06,0x00, + 0x00,0x04,0x7C,0x74,0xFF,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x80,0x00,0x03,0x64,0x40,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x00,0x00,0x00, + 0x00,0x80,0x00,0x00,0xC8,0x80,0x00,0x00,0x00,0x80,0x00,0x00,0x32,0x40,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01,0x44,0x31,0x14,0x01, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B,0x3B, + 0x0D,0x00,0xA0,0xE1,0x10,0xD0,0x9F,0xE5,0x01,0x40,0x2D,0xE9,0x9D,0x01,0x00,0xEB, + 0x01,0x40,0xBD,0xE8,0x00,0xD0,0xA0,0xE1,0x1E,0xFF,0x2F,0xE1,0xF0,0x0F,0x00,0x20, + 0x92,0x10,0x00,0xE0,0x02,0xC0,0x52,0x1E,0xFC,0xD2,0x70,0x47,0xF9,0x49,0xFA,0x48, + 0x10,0xB4,0x41,0x61,0xF9,0x49,0xF8,0x4C,0x01,0x63,0x0F,0x20,0x00,0x06,0x40,0x34, + 0xE0,0x60,0x00,0x20,0x81,0x00,0x0A,0x19,0x11,0x6A,0x40,0x1C,0x8B,0x00,0xC9,0x01, + 0xDB,0x0E,0xC9,0x0E,0x49,0x06,0x1B,0x05,0x19,0x43,0x14,0x28,0x11,0x62,0xF1,0xD3, + 0xED,0x48,0xEF,0x49,0x80,0x30,0x01,0x63,0xEE,0x49,0x41,0x63,0xEE,0x49,0x08,0x69, + 0x40,0x08,0x40,0x00,0x08,0x61,0xEC,0x48,0x40,0x30,0x01,0x68,0xEB,0x49,0x01,0x60, + 0xEB,0x48,0xEC,0x49,0xC8,0x60,0x10,0xBC,0x70,0x47,0xFC,0xB5,0xEA,0x4C,0x02,0x00, + 0x30,0x34,0x18,0xCC,0x00,0x20,0x00,0x94,0xE8,0x4C,0x24,0x7D,0xE4,0x07,0x2D,0xD0, + 0xE7,0x4C,0x25,0x79,0xE6,0x78,0xE5,0x4C,0xAE,0x46,0xA5,0x7D,0x00,0x2E,0x76,0x46, + 0xAC,0x46,0xE5,0x7D,0x01,0x95,0x25,0x7E,0x67,0x7E,0xA4,0x7E,0x10,0xD0,0xB2,0x42, + 0x1C,0xD1,0x8C,0x45,0x08,0xD0,0x01,0x9A,0x8A,0x42,0x05,0xD0,0x8D,0x42,0x03,0xD0, + 0x8F,0x42,0x01,0xD0,0x8C,0x42,0x00,0xD1,0x00,0x98,0xFC,0xBC,0x08,0xBC,0x18,0x47, + 0xB1,0x42,0x0B,0xD1,0x94,0x45,0xF7,0xD0,0x01,0x99,0x91,0x42,0xF4,0xD0,0x95,0x42, + 0xF2,0xD0,0x97,0x42,0xF0,0xD0,0x94,0x42,0xEE,0xD0,0xEE,0xE7,0x18,0x00,0xEC,0xE7, + 0x30,0xB4,0xCF,0x4B,0xCF,0x4C,0x5B,0x78,0x58,0x43,0x40,0x18,0x43,0x00,0xE0,0x5A, + 0x01,0x06,0x09,0x0E,0x89,0x18,0x00,0x0A,0x82,0x18,0x00,0x20,0x4D,0x1E,0xC0,0x43, + 0xFF,0x2D,0x06,0xD2,0x55,0x1E,0xFF,0x2D,0x03,0xD2,0x10,0x02,0x08,0x43,0xE0,0x52, + 0x00,0x20,0x30,0xBC,0x70,0x47,0xF3,0xB5,0xC3,0x48,0x82,0xB0,0x01,0x90,0x00,0x20, + 0x00,0x90,0xB9,0x48,0xC1,0x68,0x01,0x22,0x11,0x43,0xC1,0x60,0xBC,0x4F,0xB6,0x48, + 0xC0,0x68,0xC0,0x07,0xFB,0xD0,0x00,0x24,0x26,0x00,0x25,0xE0,0x00,0x25,0x1F,0xE0, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0x91,0xFF,0x00,0x28,0x17,0xD0,0x79,0x78,0x01,0x9A, + 0x71,0x43,0x49,0x19,0x89,0x00,0x51,0x58,0x09,0x05,0x09,0x0D,0x08,0x1A,0x02,0x99, + 0x00,0x29,0x02,0xD0,0x00,0x28,0x09,0xDA,0x01,0xE0,0x00,0x28,0x06,0xDD,0x03,0x9A, + 0x29,0x00,0x30,0x00,0xFF,0xF7,0xB4,0xFF,0x40,0x1C,0x00,0xD1,0x64,0x1C,0x6D,0x1C, + 0x78,0x78,0x85,0x42,0xDC,0xD3,0x76,0x1C,0xB8,0x78,0x86,0x42,0xD6,0xD3,0xB8,0x78, + 0x79,0x78,0x48,0x43,0xA0,0x42,0x0A,0xD0,0x00,0x98,0x41,0x1C,0x00,0x91,0x01,0x21, + 0x49,0x02,0x88,0x42,0x03,0xD8,0x98,0x48,0xC1,0x68,0xC1,0x60,0xBF,0xE7,0xFF,0xBC, + 0x08,0xBC,0x18,0x47,0xF0,0xB4,0x00,0x21,0x9A,0x4C,0x98,0x4B,0x98,0x4E,0x1E,0x25, + 0x13,0xE0,0x9A,0x7D,0x8A,0x42,0x0D,0xD0,0xDA,0x7D,0x8A,0x42,0x0A,0xD0,0x1A,0x7E, + 0x8A,0x42,0x07,0xD0,0x5A,0x7E,0x8A,0x42,0x04,0xD0,0x9A,0x7E,0x8A,0x42,0x01,0xD0, + 0x42,0x00,0xA5,0x52,0x72,0x78,0x80,0x18,0x49,0x1C,0xB2,0x78,0x77,0x78,0x7A,0x43, + 0x82,0x42,0xE6,0xD8,0xF0,0xBC,0x70,0x47,0xF0,0xB4,0x89,0x4B,0x00,0x21,0x5A,0x78, + 0x1E,0x26,0x88,0x4D,0x42,0x43,0x85,0x4F,0x12,0xE0,0xBB,0x7D,0x8B,0x42,0x0D,0xD0, + 0xFB,0x7D,0x8B,0x42,0x0A,0xD0,0x3B,0x7E,0x8B,0x42,0x07,0xD0,0x7B,0x7E,0x8B,0x42, + 0x04,0xD0,0xBB,0x7E,0x8B,0x42,0x01,0xD0,0x53,0x00,0xEE,0x52,0x52,0x1C,0x49,0x1C, + 0x7B,0x4B,0x04,0x00,0x5B,0x78,0x5C,0x43,0xE3,0x18,0x93,0x42,0xE5,0xD8,0xD9,0xE7, + 0x02,0x04,0x78,0x49,0x02,0x43,0x00,0x20,0x40,0x1C,0x04,0xC1,0x80,0x28,0xFB,0xD3, + 0x70,0x47,0xF1,0xB5,0x72,0x4C,0x70,0x4D,0x21,0x78,0x73,0x4F,0xA8,0x6B,0x00,0x29, + 0x86,0xB0,0x00,0xD0,0x00,0x0C,0x00,0x06,0x00,0x0E,0x01,0x02,0x01,0x43,0x08,0x04, + 0x00,0x0C,0xFF,0xF7,0xE5,0xFF,0x69,0x48,0x00,0x7D,0xC0,0x07,0x08,0xD0,0xE0,0x78, + 0x00,0x28,0x20,0x79,0x02,0xD0,0xFF,0xF7,0xB7,0xFF,0x01,0xE0,0xFF,0xF7,0x92,0xFF, + 0x5D,0x49,0x00,0x20,0x80,0x31,0xC8,0x62,0x61,0x49,0xE8,0x6B,0x09,0x78,0x00,0x29, + 0x08,0xD1,0x5C,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x07,0x12,0x09,0x12,0x01, + 0x00,0x0F,0x07,0xE0,0x57,0x49,0x00,0x22,0x4A,0x63,0x4A,0x68,0x00,0x03,0x12,0x09, + 0x12,0x01,0x00,0x0F,0x02,0x43,0x4A,0x60,0x03,0x24,0x26,0x1F,0x01,0xE0,0x03,0x2C, + 0x02,0xD1,0x01,0x25,0xED,0x43,0x09,0xE0,0x02,0x2C,0x01,0xD1,0x01,0x25,0x05,0xE0, + 0x01,0x2C,0x01,0xD1,0x35,0x00,0x01,0xE0,0x00,0x2C,0xF7,0xD0,0xE0,0x07,0xC0,0x0F, + 0x29,0x00,0xFF,0xF7,0x10,0xFF,0x64,0x1E,0xE9,0xD5,0x49,0x48,0x48,0x4D,0x00,0x78, + 0x0C,0x35,0x00,0x28,0x2F,0xD1,0x40,0x48,0x09,0x21,0x01,0x23,0xC2,0x68,0x1A,0x43, + 0xC2,0x60,0xC2,0x68,0xD2,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x00,0x26,0x17,0xE0, + 0x00,0x24,0x10,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x9F,0xFE,0x00,0x28,0x09,0xD0, + 0x3B,0x48,0x40,0x78,0x70,0x43,0x00,0x19,0x81,0x00,0x79,0x58,0x09,0x05,0x09,0x0D, + 0x40,0x00,0x29,0x52,0x64,0x1C,0x36,0x48,0x40,0x78,0x84,0x42,0xEA,0xD3,0x76,0x1C, + 0x33,0x48,0x81,0x78,0x8E,0x42,0xE3,0xD3,0x01,0x78,0x00,0x29,0x03,0xD1,0x80,0x68, + 0x2C,0x49,0x48,0x63,0x05,0xE0,0x2E,0x48,0x80,0x68,0x01,0x0C,0x29,0x48,0x09,0x04, + 0x41,0x63,0x25,0x4A,0x09,0x21,0x01,0x23,0xD0,0x68,0x18,0x43,0xD0,0x60,0xD0,0x68, + 0xC0,0x07,0xFC,0xD0,0x49,0x1E,0xF7,0xD2,0x28,0x48,0x00,0x26,0x02,0x90,0x28,0x48, + 0x01,0x90,0x88,0xE0,0x00,0x24,0x80,0xE0,0x21,0x00,0x30,0x00,0xFF,0xF7,0x65,0xFE, + 0x00,0x28,0x79,0xD0,0x1E,0x49,0x0A,0x78,0x00,0x2A,0x43,0xD1,0x49,0x78,0x71,0x43, + 0x0A,0x19,0x53,0x00,0xE9,0x5A,0x81,0x42,0x04,0xD9,0x09,0x1A,0x09,0x04,0xC9,0x0C, + 0x40,0x18,0x03,0xE0,0x41,0x1A,0x09,0x04,0xC9,0x0C,0x40,0x1A,0x91,0x00,0x79,0x58, + 0x0E,0x4A,0x09,0x05,0x09,0x0D,0x40,0x1A,0xE8,0x52,0x11,0x48,0x0B,0x3A,0x40,0x78, + 0x70,0x43,0x00,0x19,0x40,0x00,0x29,0x5A,0x91,0x42,0x55,0xD9,0x00,0x21,0x29,0x52, + 0x52,0xE0,0x00,0x00,0x83,0xC3,0x0F,0x41,0x40,0x06,0x10,0x40,0xF3,0x43,0x0C,0x48, + 0xFC,0xFF,0x01,0x00,0xFC,0xFF,0x03,0x00,0x00,0x90,0x00,0x40,0x0A,0x10,0x00,0x00, + 0xF3,0xC3,0x0F,0x00,0x00,0xA0,0x00,0x40,0xC0,0x0F,0x00,0x20,0x00,0x78,0x00,0x00, + 0xA0,0x06,0x00,0x20,0x00,0x00,0x10,0x40,0x00,0x02,0x10,0x40,0xAC,0x08,0x00,0x20, + 0xAC,0x0A,0x00,0x20,0x81,0x48,0x82,0x49,0x40,0x78,0x70,0x43,0x00,0x19,0x05,0x90, + 0x80,0x00,0x38,0x58,0x00,0x05,0x00,0x0D,0x04,0x90,0x40,0x18,0xFF,0x21,0x91,0x31, + 0x88,0x42,0x10,0xD8,0x7B,0x49,0x04,0x98,0x09,0x1A,0x08,0x00,0x48,0x43,0xC8,0x21, + 0x00,0xF0,0x08,0xF9,0x77,0x4A,0x04,0x99,0x91,0x42,0x76,0x49,0x01,0xD9,0x40,0x18, + 0x00,0xE0,0x08,0x1A,0x03,0x90,0x06,0x98,0x00,0x28,0x08,0xD0,0x6F,0x48,0x01,0x9A, + 0x80,0x78,0x03,0x99,0x60,0x43,0x80,0x19,0x40,0x00,0x11,0x52,0x04,0xE0,0x05,0x99, + 0x02,0x9A,0x03,0x98,0x49,0x00,0x50,0x52,0x64,0x1C,0x68,0x48,0x40,0x78,0x84,0x42, + 0x00,0xD2,0x79,0xE7,0x76,0x1C,0x65,0x48,0x81,0x78,0x8E,0x42,0x00,0xD2,0x71,0xE7, + 0x07,0xB0,0xF0,0xBC,0x08,0xBC,0x18,0x47,0xF8,0xB5,0x63,0x4E,0x5F,0x4D,0x00,0x24, + 0x01,0x27,0x62,0x48,0x01,0x68,0x61,0x4A,0x08,0x04,0x00,0x0E,0x09,0x06,0x09,0x0E, + 0x68,0x70,0x40,0x3A,0xA9,0x70,0x12,0x69,0xD2,0x07,0xD2,0x0F,0x32,0x7D,0x02,0xD0, + 0x92,0x07,0x06,0xD4,0x01,0xE0,0x92,0x07,0x03,0xD5,0x49,0x1E,0x29,0x71,0xEF,0x70, + 0x03,0xE0,0x40,0x1E,0x28,0x71,0x00,0x20,0xE8,0x70,0x20,0x00,0x64,0x1C,0xFF,0xF7, + 0xA8,0xFE,0x28,0x78,0x01,0x28,0x01,0xD0,0x01,0x2C,0x05,0xD0,0x02,0x2C,0x03,0xD0, + 0xFF,0xF7,0x7C,0xFD,0x01,0x2C,0xD4,0xD9,0xF8,0xBC,0x08,0xBC,0x18,0x47,0x4C,0x48, + 0x10,0xB5,0x40,0x6B,0x45,0x4C,0xC5,0x22,0xA0,0x60,0x20,0x00,0xD2,0x00,0x00,0x21, + 0x0C,0x30,0xFF,0xF7,0x65,0xFD,0x00,0x20,0x20,0x70,0xFF,0xF7,0xBD,0xFF,0x01,0x20, + 0x20,0x70,0xFF,0xF7,0xB9,0xFF,0x43,0x48,0x43,0x49,0xC8,0x61,0x43,0x48,0xC2,0x68, + 0x52,0x08,0x52,0x00,0xC2,0x60,0x20,0x00,0x0C,0x30,0x04,0xC8,0xCA,0x61,0x4A,0x69, + 0x52,0x06,0xFC,0xD4,0xF9,0xE7,0x40,0x1E,0xFD,0xD2,0x70,0x47,0xF0,0xB5,0x3D,0x48, + 0x3B,0x4A,0x01,0x23,0x03,0x61,0x19,0x00,0x3A,0x48,0x00,0x23,0x43,0x61,0x83,0x61, + 0x01,0x26,0x35,0x00,0x9D,0x40,0x03,0x20,0x36,0x4C,0x00,0x04,0x28,0x43,0x60,0x61, + 0x08,0x00,0x40,0x1E,0xFD,0xD2,0x01,0x20,0x00,0x04,0x28,0x43,0x60,0x61,0x08,0x00, + 0x40,0x1E,0xFD,0xD2,0x65,0x61,0x48,0x00,0x86,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69, + 0x00,0x20,0x5C,0x01,0xA4,0x46,0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D, + 0xED,0x07,0xED,0x0F,0x75,0x19,0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C, + 0x10,0x2B,0xD5,0xD3,0x23,0x48,0x00,0x23,0x43,0x61,0x83,0x61,0x01,0x25,0x9D,0x40, + 0x03,0x20,0x20,0x4C,0x00,0x04,0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2, + 0x01,0x20,0x00,0x04,0x28,0x43,0xA0,0x61,0x08,0x00,0x40,0x1E,0xFD,0xD2,0xA5,0x61, + 0x70,0x46,0x40,0x1E,0xFD,0xD2,0xE7,0x69,0x5C,0x01,0xFF,0x34,0x00,0x20,0xFF,0x34, + 0x02,0x34,0xA4,0x46,0x64,0x46,0x24,0x18,0x3D,0x00,0xC5,0x40,0x16,0x5D,0xED,0x07, + 0xED,0x0F,0x75,0x19,0x40,0x1C,0x20,0x28,0x15,0x55,0xF3,0xD3,0x5B,0x1C,0x10,0x2B, + 0xD4,0xD3,0x49,0x1C,0xC8,0x29,0x9F,0xD9,0x3B,0xE7,0x00,0x00,0xA0,0x06,0x00,0x20, + 0x74,0xF5,0xFF,0xFF,0x54,0x0B,0x00,0x00,0x00,0x78,0x00,0x00,0x40,0x90,0x00,0x40, + 0x00,0xA0,0x00,0x40,0xAB,0xFC,0xFF,0x8F,0x00,0x40,0x00,0x30,0x00,0x20,0x00,0x40, + 0xAC,0x08,0x00,0x20,0x00,0xA1,0x00,0x40,0x00,0xC0,0x9F,0xE5,0x1C,0xFF,0x2F,0xE1, + 0x3F,0x05,0x00,0x20,0x78,0x47,0xC0,0x46,0x04,0xF0,0x1F,0xE5,0xF8,0x07,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47,0x40,0x04,0x00,0x00,0xC0,0x7B,0x00,0x00, + 0xC0,0x75,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x03,0x00,0x00, + 0x00,0x7B,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x02,0x00,0x00, + 0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x00,0x5E,0x00,0xCC,0x00,0x00,0x00,0x00,0x00, + 0x49,0x53,0x54,0x56,0x31,0x54,0x41,0x47}; + +#endif // __IST30XXB_FW_H__ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_misc.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_misc.c new file mode 100755 index 00000000..f91e85ee --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_misc.c @@ -0,0 +1,1142 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include + +#include +#include "ist30xxb_update.h" +#include "ist30xxb_misc.h" + +#define TSP_CH_SCREEN (1) +#define TSP_CH_KEY (2) + +#define TOUCH_NODE_PARSING_DEBUG (0) + +extern struct ist30xx_data *ts_data; + +TSP_INFO ist30xx_tsp_info; +TKEY_INFO ist30xx_tkey_info; + +static u32 *ist30xx_frame_buf; +static u32 *ist30xx_frame_rawbuf; +static u32 *ist30xx_frame_fltbuf; + + +int ist30xx_tkey_update_info(void) +{ + int ret = 0; + u32 tkey_info1, tkey_info2, tkey_info3; + TKEY_INFO *tkey = &ist30xx_tkey_info; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO1, &tkey_info1); + if (ret) return ret; + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO2, &tkey_info2); + if (ret) return ret; + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_KEY_INFO3, &tkey_info3); + if (ret) return ret; + + tkey->enable = ((tkey_info1 & (0xFF << 24)) ? true : false); + tkey->key_num = (tkey_info1 >> 16) & 0xFF; + tkey->ch_num[0] = (tkey_info2 >> 24) & 0xFF; + tkey->ch_num[1] = (tkey_info2 >> 16) & 0xFF; + tkey->ch_num[2] = (tkey_info2 >> 8) & 0xFF; + tkey->ch_num[3] = tkey_info2 & 0xFF; + tkey->ch_num[4] = (tkey_info3 >> 24) & 0xFF; + + return ret; +} + + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +int ist30xx_tsp_update_info(void) +{ + int ret = 0; + u32 tsp_ch_num, tsp_swap, tsp_dir; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_SWAP_INFO, &tsp_swap); + if (ret) return ret; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_DIRECTION, &tsp_dir); + if (ret) return ret; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_CHNUM1, &tsp_ch_num); + if (ret || !tsp_ch_num) return ret; + + tsp->finger_num = IST30XX_MAX_MT_FINGERS; + + tsp->ch_num.rx = tsp_ch_num >> 16; + tsp->ch_num.tx = tsp_ch_num & 0xFFFF; + + tsp->dir.swap_xy = (tsp_swap & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (tsp_swap & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (tsp_swap & TSP_INFO_FLIP_Y ? true : false); + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + tsp->height = (tsp->dir.swap_xy ? tsp->ch_num.rx : tsp->ch_num.tx); + tsp->width = (tsp->dir.swap_xy ? tsp->ch_num.tx : tsp->ch_num.rx); + + return ret; +} + + +int ist30xx_check_valid_ch(int ch_tx, int ch_rx) +{ + TKEY_INFO *tkey = &ist30xx_tkey_info; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if ((ch_tx > tsp->ch_num.tx) || (ch_rx > tsp->ch_num.rx)) + return 0; + + if (tkey->enable) { + if (tkey->axis_rx) { + tsp_verb("tx: %d, rx: %d\n", ch_tx, ch_rx); + if (ch_rx == tsp->ch_num.rx - 1) { + tsp_verb("ch_tx: %d\n", ch_tx); + if ((ch_tx == tkey->ch_num[0]) || (ch_tx == tkey->ch_num[1]) || + (ch_tx == tkey->ch_num[2]) || (ch_tx == tkey->ch_num[3]) || + (ch_tx == tkey->ch_num[4])) + return TSP_CH_KEY; + else + return 0; + } + } else { + if (ch_tx == tsp->ch_num.tx - 1) { + if ((ch_rx == tkey->ch_num[0]) || (ch_rx == tkey->ch_num[1]) || + (ch_rx == tkey->ch_num[2]) || (ch_rx == tkey->ch_num[3]) || + (ch_rx == tkey->ch_num[4])) + return TSP_CH_KEY; + else + return 0; + } + } + } + + return TSP_CH_SCREEN; +} + + +int ist30xx_parse_touch_node(u8 flag, struct TSP_NODE_BUF *node) +{ +#if TOUCH_NODE_PARSING_DEBUG + int j; + TSP_INFO *tsp = &ist30xx_tsp_info; +#endif + int i; + u16 *raw = (u16 *)&node->raw; + u16 *base = (u16 *)&node->base; + u16 *filter = (u16 *)&node->filter; + + for (i = 0; i < node->len; i++) { + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + *raw++ = *ist30xx_frame_rawbuf & 0xFFF; + *base++ = (*ist30xx_frame_rawbuf >> 16) & 0xFFF; + + ist30xx_frame_rawbuf++; + } + if (flag & NODE_FLAG_FILTER) + *filter++ = *ist30xx_frame_fltbuf++ & 0xFFF; + } + +#if TOUCH_NODE_PARSING_DEBUG + tsp_info("RAW - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->raw[i][j]); + } + + tsp_info("BASE - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->base[i][j]); + } + + tsp_info("FILTER - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->filter[i][j]); + } +#endif + + return 0; +} + +int print_touch_node(u8 flag, struct TSP_NODE_BUF *node, char *buf, bool ch_tsp) +{ + int i, j; + int count = 0; + int val = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if (tsp->dir.swap_xy) { + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (ch_tsp && (ist30xx_check_valid_ch(i, j) != TSP_CH_SCREEN)) + continue; + + if (flag == NODE_FLAG_RAW) + val = (int)node->raw[i][j]; + else if (flag == NODE_FLAG_BASE) + val = (int)node->base[i][j]; + else if (flag == NODE_FLAG_FILTER) + val = (int)node->filter[i][j]; + else if (flag == NODE_FLAG_DIFF) + val = (int)(node->raw[i][j] - node->base[i][j]); + else + return 0; + + if (val < 0) val = 0; + + count += snprintf(msg, msg_len, "%4d ", val); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + } + + return count; +} + +int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16) +{ + int i, j; + s16 val = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if ((flag != NODE_FLAG_RAW) && (flag != NODE_FLAG_BASE) && + (flag != NODE_FLAG_FILTER) && (flag != NODE_FLAG_DIFF)) + return -EPERM; + + if (tsp->dir.swap_xy) { + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (ist30xx_check_valid_ch(i, j) != TSP_CH_SCREEN) + continue; + + switch ((int)flag) { + case NODE_FLAG_RAW: + val = (s16)node->raw[i][j]; + break; + case NODE_FLAG_BASE: + val = (s16)node->base[i][j]; + break; + case NODE_FLAG_FILTER: + val = (s16)node->filter[i][j]; + break; + case NODE_FLAG_DIFF: + val = (s16)(node->raw[i][j] - node->base[i][j]); + break; + } + + if (val < 0) val = 0; + + *buf16++ = val; + } + } + } + + return 0; +} + + +int ist30xx_read_touch_node(u8 flag, struct TSP_NODE_BUF *node) +{ + int ret = 0; + + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (ret) goto read_tsp_node_end; + + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, node->len); + if (ret) goto read_tsp_node_end; + + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + tsp_debug("Reg addr: %x, size: %d\n", IST30XXB_RAW_ADDR, node->len); + ret = ist30xx_read_buf(ts_data->client, IST30XXB_RAW_ADDR, + ist30xx_frame_rawbuf, node->len); + if (ret) goto read_tsp_node_end; + } + if (flag & NODE_FLAG_FILTER) { + tsp_debug("Reg addr: %x, size: %d\n", IST30XXB_FILTER_ADDR, node->len); + ret = ist30xx_read_buf(ts_data->client, IST30XXB_FILTER_ADDR, + ist30xx_frame_fltbuf, node->len); + if (ret) goto read_tsp_node_end; + } + + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (ret) goto read_tsp_node_end; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (ret) goto read_tsp_node_end; + +read_tsp_node_end: + ist30xx_enable_irq(ts_data); + + return ret; +} + + +/* sysfs: /sys/class/touch/node/refresh */ +ssize_t ist30xx_frame_refresh(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER; + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (ret) + ret = sprintf(buf, "cmd 1frame raw update fail\n"); + + ret = ist30xx_parse_touch_node(flag, &tsp->node); + + return ret; +} + + +/* sysfs: /sys/class/touch/node/base */ +ssize_t ist30xx_base_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb baseline(%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_BASE, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/raw */ +ssize_t ist30xx_raw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb raw(%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_RAW, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/diff */ +ssize_t ist30xx_diff_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb difference (%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_DIFF, &tsp->node, buf, false); + + return count; +} + + +/* sysfs: /sys/class/touch/node/filter */ +ssize_t ist30xx_filter_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xxb filter (%d)\n", tsp->node.len); + + count += print_touch_node(NODE_FLAG_FILTER, &tsp->node, buf, false); + + return count; +} + + +extern int calib_ms_delay; +/* sysfs: /sys/class/touch/sys/clb */ +ssize_t ist30xx_calib_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -1; + int ms_delay; + + sscanf(buf, "%d", &ms_delay); + + if (ms_delay > 10 && ms_delay < 1000) // 1sec ~ 100sec + calib_ms_delay = ms_delay; + + tsp_info("Calibration wait time %dsec\n", calib_ms_delay / 10); + + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) { + ist30xx_enable_irq(ts_data); + return size; + } + ist30xx_calibrate(1); + + ist30xx_start(ts_data); + + return size; +} + +ssize_t ist30xx_calib_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int count = 0; + u32 value; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + goto calib_show_end; + + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CALIB_RESULT, &value); + if (ret) { + count = sprintf(buf, "Error Read Calibration Result\n"); + goto calib_show_end; + } + + count = sprintf(buf, + "Calibration Status : %d, Max raw gap : %d - (raw: %08x)\n", + CALIB_TO_STATUS(value), CALIB_TO_GAP(value), value); + +calib_show_end: + ist30xx_start(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + return count; +} + + +/* sysfs: /sys/class/touch/sys/power */ +ssize_t ist30xx_power_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + u32 power_en; + + sscanf(buf, "%d", &power_en); + + tsp_info("Power enable: %d\n", power_en); + if (power_en > 1) { + tsp_err("Unknown argument value, %d\n", power_en); + return size; + } + + if (power_en) { + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(ts_data); + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(ts_data); + } else { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + ist30xx_internal_suspend(ts_data); + mutex_unlock(&ist30xx_mutex); + } + + return size; +} + +extern int ist30xx_max_error_cnt; +/* sysfs: /sys/class/touch/sys/errcnt */ +ssize_t ist30xx_errcnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int err_cnt; + + sscanf(buf, "%d", &err_cnt); + + if (err_cnt < 0) return size; + + tsp_info("Request reset error count: %d\n", err_cnt); + + ist30xx_max_error_cnt = err_cnt; + + return size; +} + +#if IST30XX_EVENT_MODE +extern int ist30xx_max_scan_retry; +/* sysfs: /sys/class/touch/sys/scancnt */ +ssize_t ist30xx_scancnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int retry; + + sscanf(buf, "%d", &retry); + + if (retry < 0) return size; + + tsp_info("Timer scan count retry: %d\n", retry); + + ist30xx_max_scan_retry = retry; + + return size; +} + +extern int timer_period_ms; +/* sysfs: /sys/class/touch/sys/timerms */ +ssize_t ist30xx_timerms_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ms; + + sscanf(buf, "%d", &ms); + + if ((ms < 0) || (ms > 10000)) return size; + + tsp_info("Timer period ms: %dms\n", ms); + + timer_period_ms = ms; + + return size; +} +#endif + +extern int ist30xx_dbg_level; +/* sysfs: /sys/class/touch/sys/printk */ +ssize_t ist30xx_printk_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int level; + + sscanf(buf, "%d", &level); + + if ((level < DEV_ERR) || (level > DEV_VERB)) return size; + + tsp_info("prink log level: %d\n", level); + + ist30xx_dbg_level = level; + + return size; +} + +ssize_t ist30xx_printk_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "prink log level: %d\n", ist30xx_dbg_level); +} + +/* sysfs: /sys/class/touch/sys/dummy */ +ssize_t ist30xx_dummy_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int count = 0; + u32 value; + + ist30xx_disable_irq(ts_data); + ret = ist30xx_read_cmd(ts_data->client, CMD_GET_COORD, &value); + if (ret) + count = sprintf(buf, "Error Read Calibration Result\n"); + ist30xx_enable_irq(ts_data); + + count = sprintf(buf, + "Calibration Status : %d, Max raw gap : %d - (raw: %08x)\n", + CALIB_TO_STATUS(value), CALIB_TO_GAP(value), value); + + return count; +} + + +#define TUNES_CMD_WRITE (1) +#define TUNES_CMD_READ (2) +#define TUNES_CMD_REG_ENTER (3) +#define TUNES_CMD_REG_EXIT (4) +#define TUNES_CMD_UPDATE_PARAM (5) +#define TUNES_CMD_UPDATE_FW (6) + +#define DIRECT_ADDR(k) (IST30XXB_DA_ADDR(k)) +#define DIRECT_CMD_WRITE ('w') +#define DIRECT_CMD_READ ('r') + +#pragma pack(1) +typedef struct { + u8 cmd; + u32 addr; + u16 len; +} TUNES_INFO; +#pragma pack() +#pragma pack(1) +typedef struct { + char cmd; + u32 addr; + u32 val; +} DIRECT_INFO; +#pragma pack() + +static TUNES_INFO ist30xx_tunes; +static DIRECT_INFO ist30xx_direct; +static bool tunes_cmd_done = false; +static bool ist30xx_reg_mode = false; + +/* sysfs: /sys/class/touch/sys/direct */ +ssize_t ist30xxb_direct_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -EPERM; + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + sscanf(buf, "%c %x %x", &direct->cmd, &direct->addr, &direct->val); + + tsp_debug("Direct cmd: %c, addr: %x, val: %x\n", + direct->cmd, direct->addr, direct->val); + + if ((direct->cmd != DIRECT_CMD_WRITE) && (direct->cmd != DIRECT_CMD_READ)) { + tsp_warn("Direct cmd is not correct!\n"); + return size; + } + + if (direct->cmd == DIRECT_CMD_WRITE) { + ret = ist30xx_write_cmd(ts_data->client, DIRECT_ADDR(direct->addr), + direct->val); + ret = ist30xx_read_cmd(ts_data->client, DIRECT_ADDR(direct->addr), + &direct->val); + tsp_debug("Direct write addr: %x, val: %x\n", + direct->addr, direct->val); + } + + return size; +} + +#define DIRECT_BUF_COUNT (4) +ssize_t ist30xxb_direct_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i, ret, count = 0; + int len; + u32 addr; + u32 buf32[DIRECT_BUF_COUNT]; + int max_len = DIRECT_BUF_COUNT; + const int msg_len = 256; + char msg[msg_len]; + + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + if (direct->cmd != DIRECT_CMD_READ) + return sprintf(buf, "ex) echo r addr len > direct\n"); + + len = direct->val; + addr = DIRECT_ADDR(direct->addr); + + ts_data->status.event_mode = false; + ist30xx_disable_irq(ts_data); + while (len > 0) { + if (len < max_len) max_len = len; + + memset(buf32, 0, sizeof(buf32)); + ret = ist30xxb_burst_read(ts_data->client, addr, buf32, max_len); + if (ret) { + count = sprintf(buf, "I2C Burst read fail, addr: %x\n", addr); + break; + } + + for (i = 0; i < max_len; i++) { + count += snprintf(msg, msg_len, "0x%08x ", buf32[i]); + strncat(buf, msg, msg_len); + } + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + + addr += max_len * IST30XX_DATA_LEN; + len -= max_len; + } + ist30xx_enable_irq(ts_data); + ts_data->status.event_mode = true; + + tsp_debug("%s", buf); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/regcmd */ +ssize_t tunes_regcmd_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -1; + u32 *buf32; + + memcpy(&ist30xx_tunes, buf, sizeof(ist30xx_tunes)); + buf += sizeof(ist30xx_tunes); + buf32 = (u32 *)buf; + + tunes_cmd_done = false; + + switch (ist30xx_tunes.cmd) { + case TUNES_CMD_WRITE: + break; + case TUNES_CMD_READ: + break; + case TUNES_CMD_REG_ENTER: + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + goto regcmd_fail; + + /* enter reg access mode */ + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (ret) + goto regcmd_fail; + + ist30xx_reg_mode = true; + + break; + case TUNES_CMD_REG_EXIT: + /* exit reg access mode */ + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (ret) + goto regcmd_fail; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (ret) + goto regcmd_fail; + + ist30xx_reg_mode = false; + + ist30xx_enable_irq(ts_data); + break; + default: + ist30xx_enable_irq(ts_data); + return size; + } + tunes_cmd_done = true; + + return size; + +regcmd_fail: + tsp_err("Tunes regcmd i2c_fail, ret=%d\n", ret); + return size; +} + +ssize_t tunes_regcmd_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int size; + + size = sprintf(buf, "cmd: 0x%02x, addr: 0x%08x, len: 0x%04x\n", + ist30xx_tunes.cmd, ist30xx_tunes.addr, ist30xx_tunes.len); + + return size; +} + +#define MAX_WRITE_LEN (1) +/* sysfs: /sys/class/touch/tunes/reg */ +ssize_t tunes_reg_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + u32 *buf32 = (u32 *)buf; + int waddr, wcnt = 0, len = 0; + + if (ist30xx_tunes.cmd != TUNES_CMD_WRITE) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return size; + } + + if (!ist30xx_reg_mode) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + if (!tunes_cmd_done) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + waddr = ist30xx_tunes.addr; + if (ist30xx_tunes.len >= MAX_WRITE_LEN) + len = MAX_WRITE_LEN; + else + len = ist30xx_tunes.len; + + while (wcnt < ist30xx_tunes.len) { + ret = ist30xx_write_buf(ts_data->client, waddr, buf32, len); + if (ret) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + wcnt += len; + + if ((ist30xx_tunes.len - wcnt) < MAX_WRITE_LEN) + len = ist30xx_tunes.len - wcnt; + + buf32 += MAX_WRITE_LEN; + waddr += MAX_WRITE_LEN * IST30XX_DATA_LEN; + } + + tunes_cmd_done = false; + + return size; +} + +ssize_t tunes_reg_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int size; + u32 *buf32 = (u32 *)buf; + +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + + if (ist30xx_tunes.cmd != TUNES_CMD_READ) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return 0; + } + + if (!tunes_cmd_done) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return 0; + } + + size = ist30xx_tunes.len; + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, size); + if (ret) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return 0; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); // Activated only when the GPIO I2C is used +#endif + ret = ist30xx_read_buf(ts_data->client, ist30xx_tunes.addr, buf32, size); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); // Activated only when the GPIO I2C is used +#endif + if (ret) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = ist30xx_tunes.len * IST30XX_DATA_LEN; + + tunes_cmd_done = false; + + return size; +} + + +/* sysfs: /sys/class/touch/tunes/firmware */ +ssize_t tunes_fw_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + ist30xx_get_update_info(ts_data, buf, size); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, buf, size, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(ts_data); + + return size; +} + + +/* sysfs: /sys/class/touch/tunes/adb */ +ssize_t tunes_adb_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + char *tmp, *ptr; + char token[9]; + u32 cmd, addr, len, val; + int write_len; + + sscanf(buf, "%x %x %x", &cmd, &addr, &len); + + switch (cmd) { + case TUNES_CMD_WRITE: /* write cmd */ + write_len = 0; + ptr = (char *)(buf + 15); + + while (write_len < len) { + memcpy(token, ptr, 8); + token[8] = 0; + val = simple_strtoul(token, &tmp, 16); + ret = ist30xx_write_buf(ts_data->client, addr, &val, 1); + if (ret) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + ptr += 8; + write_len++; + addr += 4; + } + break; + + case TUNES_CMD_READ: /* read cmd */ + ist30xx_tunes.cmd = cmd; + ist30xx_tunes.addr = addr; + ist30xx_tunes.len = len; + break; + + case TUNES_CMD_REG_ENTER: /* enter */ + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret < 0) + goto cmd_fail; + + ret = ist30xx_cmd_reg(ts_data->client, CMD_ENTER_REG_ACCESS); + if (ret < 0) + goto cmd_fail; + ist30xx_reg_mode = true; + break; + + case TUNES_CMD_REG_EXIT: /* exit */ + if (ist30xx_reg_mode == true) { + ret = ist30xx_cmd_reg(ts_data->client, CMD_EXIT_REG_ACCESS); + if (ret < 0) + goto cmd_fail; + + ret = ist30xx_cmd_start_scan(ts_data->client); + if (ret < 0) + goto cmd_fail; + ist30xx_reg_mode = false; + ist30xx_enable_irq(ts_data); + } + break; + + default: + break; + } + + return size; + +cmd_fail: + tsp_err("Tunes adb i2c_fail\n"); + return size; +} + +ssize_t tunes_adb_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int i, len, size = 0; + char reg_val[10]; + +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + + ret = ist30xx_write_cmd(ts_data->client, IST30XX_RX_CNT_ADDR, ist30xx_tunes.len); + if (ret) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); +#endif + ret = ist30xx_read_buf(ts_data->client, ist30xx_tunes.addr, + ist30xx_frame_buf, ist30xx_tunes.len); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); +#endif + if (ret) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = 0; + buf[0] = 0; + len = sprintf(reg_val, "%08x", ist30xx_tunes.addr); + strcat(buf, reg_val); + size += len; + for (i = 0; i < ist30xx_tunes.len; i++) { + len = sprintf(reg_val, "%08x", ist30xx_frame_buf[i]); + strcat(buf, reg_val); + size += len; + } + + return size; +} + +#if IST30XX_ALGORITHM_MODE +/* sysfs: /sys/class/touch/tunes/algorithm */ +extern u32 ist30xx_algr_addr, ist30xx_algr_size; +ssize_t ist30xx_algr_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &ist30xx_algr_addr, &ist30xx_algr_size); + tsp_info("Algorithm addr: 0x%x, count: %d\n", + ist30xx_algr_addr, ist30xx_algr_size); + + ist30xx_algr_addr |= IST30XXB_ACCESS_ADDR; + + return size; +} + +ssize_t ist30xx_algr_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + u32 algr_addr; + int count = 0; + + ret = ist30xx_read_cmd(ts_data->client, IST30XXB_MEM_ALGORITHM, &algr_addr); + if (ret) { + tsp_warn("Algorithm mem addr read fail!\n"); + return 0; + } + + tsp_info("algr_addr(0x%x): 0x%x\n", IST30XXB_MEM_ALGORITHM, algr_addr); + + count = sprintf(buf, "Algorithm addr : 0x%x\n", algr_addr); + + return count; +} +#endif // IST30XX_ALGORITHM_MODE + +#define MISC_DEFAULT_ATTR (0644) + +/* sysfs */ +static DEVICE_ATTR(refresh, MISC_DEFAULT_ATTR, ist30xx_frame_refresh, NULL); +static DEVICE_ATTR(filter, MISC_DEFAULT_ATTR, ist30xx_filter_show, NULL); +static DEVICE_ATTR(raw, MISC_DEFAULT_ATTR, ist30xx_raw_show, NULL); +static DEVICE_ATTR(base, MISC_DEFAULT_ATTR, ist30xx_base_show, NULL); +static DEVICE_ATTR(diff, MISC_DEFAULT_ATTR, ist30xx_diff_show, NULL); + +static DEVICE_ATTR(printk, MISC_DEFAULT_ATTR, ist30xx_printk_show, ist30xx_printk_store); +static DEVICE_ATTR(direct, MISC_DEFAULT_ATTR, ist30xxb_direct_show, ist30xxb_direct_store); +static DEVICE_ATTR(clb, MISC_DEFAULT_ATTR, ist30xx_calib_show, ist30xx_calib_store); +static DEVICE_ATTR(tsp_power, MISC_DEFAULT_ATTR, NULL, ist30xx_power_store); +static DEVICE_ATTR(errcnt, MISC_DEFAULT_ATTR, NULL, ist30xx_errcnt_store); +static DEVICE_ATTR(dummy, MISC_DEFAULT_ATTR, ist30xx_dummy_show, NULL); +#if IST30XX_EVENT_MODE +static DEVICE_ATTR(scancnt, MISC_DEFAULT_ATTR, NULL, ist30xx_scancnt_store); +static DEVICE_ATTR(timerms, MISC_DEFAULT_ATTR, NULL, ist30xx_timerms_store); +#endif + +static DEVICE_ATTR(regcmd, MISC_DEFAULT_ATTR, tunes_regcmd_show, tunes_regcmd_store); +static DEVICE_ATTR(reg, MISC_DEFAULT_ATTR, tunes_reg_show, tunes_reg_store); +static DEVICE_ATTR(tunes_fw, MISC_DEFAULT_ATTR, NULL, tunes_fw_store); +static DEVICE_ATTR(adb, MISC_DEFAULT_ATTR, tunes_adb_show, tunes_adb_store); +#if IST30XX_ALGORITHM_MODE +static DEVICE_ATTR(algorithm, MISC_DEFAULT_ATTR, ist30xx_algr_show, ist30xx_algr_store); +#endif + +static struct attribute *node_attributes[] = { + &dev_attr_refresh.attr, + &dev_attr_filter.attr, + &dev_attr_raw.attr, + &dev_attr_base.attr, + &dev_attr_diff.attr, + NULL, +}; + +static struct attribute *sys_attributes[] = { + &dev_attr_printk.attr, + &dev_attr_direct.attr, + &dev_attr_clb.attr, + &dev_attr_tsp_power.attr, + &dev_attr_errcnt.attr, + &dev_attr_dummy.attr, +#if IST30XX_EVENT_MODE + &dev_attr_scancnt.attr, + &dev_attr_timerms.attr, +#endif + NULL, +}; + +static struct attribute *tunes_attributes[] = { + &dev_attr_regcmd.attr, + &dev_attr_reg.attr, + &dev_attr_tunes_fw.attr, + &dev_attr_adb.attr, +#if IST30XX_ALGORITHM_MODE + &dev_attr_algorithm.attr, +#endif + NULL, +}; + +static struct attribute_group node_attr_group = { + .attrs = node_attributes, +}; + +static struct attribute_group sys_attr_group = { + .attrs = sys_attributes, +}; + +static struct attribute_group tunes_attr_group = { + .attrs = tunes_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_sys_dev; +struct device *ist30xx_tunes_dev; +struct device *ist30xx_node_dev; + + +int ist30xx_init_misc_sysfs(void) +{ + /* /sys/class/touch/sys */ + ist30xx_sys_dev = device_create(ist30xx_class, NULL, 0, NULL, "sys"); + + /* /sys/class/touch/sys/... */ + if (sysfs_create_group(&ist30xx_sys_dev->kobj, &sys_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sys"); + + /* /sys/class/touch/tunes */ + ist30xx_tunes_dev = device_create(ist30xx_class, NULL, 0, NULL, "tunes"); + + /* /sys/class/touch/tunes/... */ + if (sysfs_create_group(&ist30xx_tunes_dev->kobj, &tunes_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "tunes"); + + /* /sys/class/touch/node */ + ist30xx_node_dev = device_create(ist30xx_class, NULL, 0, NULL, "node"); + + /* /sys/class/touch/node/... */ + if (sysfs_create_group(&ist30xx_node_dev->kobj, &node_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "node"); + + ist30xx_frame_buf = kmalloc(4096, GFP_KERNEL); + ist30xx_frame_rawbuf = kmalloc(4096, GFP_KERNEL); + ist30xx_frame_fltbuf = kmalloc(4096, GFP_KERNEL); + if (!ist30xx_frame_buf || !ist30xx_frame_rawbuf || !ist30xx_frame_fltbuf) + return -ENOMEM; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_misc.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_misc.h new file mode 100755 index 00000000..9062d88b --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_misc.h @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_MISC_H__ +#define __IST30XX_MISC_H__ + +#include "ist30xxb_tsp.h" + + +#define IST30XXB_RAW_ADDR (0x40100200) +#define IST30XXB_FILTER_ADDR (0x40101000) + +#define IST30XX_RX_CNT_ADDR (0x20000038) +#define IST30XX_CONFIG_ADDR (0x20000040) + +#define NODE_FLAG_RAW (1) +#define NODE_FLAG_BASE (1 << 1) +#define NODE_FLAG_FILTER (1 << 2) +#define NODE_FLAG_DIFF (1 << 3) + +struct TSP_CH_NUM { + u8 tx; + u8 rx; +}; +struct TSP_NODE_BUF { + u16 raw[NODE_TX_NUM][NODE_RX_NUM]; + u16 base[NODE_TX_NUM][NODE_RX_NUM]; + u16 filter[NODE_TX_NUM][NODE_RX_NUM]; + u16 min_raw; + u16 max_raw; + u16 min_base; + u16 max_base; + u16 len; +}; +struct TSP_DIRECTION { + bool swap_xy; + bool flip_x; + bool flip_y; +}; +typedef struct _TSP_INFO { + struct TSP_CH_NUM ch_num; + struct TSP_DIRECTION dir; + struct TSP_NODE_BUF node; + int height; + int width; + int finger_num; +} TSP_INFO; +typedef struct _TKEY_INFO { + int key_num; + bool enable; + bool axis_rx; + u8 axis_chnum; + u8 ch_num[5]; +} TKEY_INFO; + +int ist30xx_parse_touch_node(u8 flag, struct TSP_NODE_BUF *node); +int ist30xx_read_touch_node(u8 flag, struct TSP_NODE_BUF *node); + +int ist30xx_tsp_update_info(void); +int ist30xx_tkey_update_info(void); + +int ist30xx_get_tsp_info(struct ist30xx_data *data); +int ist30xx_get_tkey_info(struct ist30xx_data *data); + +int ist30xx_init_misc_sysfs(void); + +#endif // __IST30XX_MISC_H__ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_sec.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec.c new file mode 100755 index 00000000..d8ee815f --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec.c @@ -0,0 +1,831 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#include +#include +#include +#include +#include +#include + +#include +#include "ist30xxb_update.h" +#include "ist30xxb_misc.h" + + +static char IsfwUpdate[20] = { 0 }; + +#define FW_DOWNLOADING "Downloading" +#define FW_DOWNLOAD_COMPLETE "Complete" +#define FW_DOWNLOAD_FAIL "FAIL" + +#define FACTORY_BUF_SIZE (1024) +#define BUILT_IN (0) + +#define CMD_STATE_WAITING (0) +#define CMD_STATE_RUNNING (1) +#define CMD_STATE_OK (2) +#define CMD_STATE_FAIL (3) +#define CMD_STATE_NA (4) + +#define TSP_NODE_DEBUG (1) + +static u16 node_value[TSP_TOTAL_NUM]; + +extern struct ist30xx_data *ts_data; +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; + + +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func +struct tsp_cmd { + struct list_head list; + const char * cmd_name; + void (*cmd_func)(void *dev_data); +}; + +u32 ist30xxb_get_fw_ver(struct ist30xx_data *data) +{ + u32 addr = data->tags.cfg_addr + 4; + u32 len = 1; + u32 ver = 0; + int ret = -EPERM; + + ist30xx_disable_irq(data); + ret = ist30xx_cmd_reg(data->client, CMD_ENTER_REG_ACCESS); + if (ret) goto get_fw_ver_fail; + + ret = ist30xx_write_cmd(data->client, IST30XX_RX_CNT_ADDR, len); + if (ret) goto get_fw_ver_fail; + + ret = ist30xx_read_cmd(data->client, addr, &ver); + if (ret) goto get_fw_ver_fail; + + tsp_debug("Reg addr: %x, ver: %x\n", addr, ver); + + ret = ist30xx_cmd_reg(data->client, CMD_EXIT_REG_ACCESS); + if (ret == 0) + goto get_fw_ver_end; + +get_fw_ver_fail: + ist30xx_cmd_run_device(data->client); + +get_fw_ver_end: + ist30xx_cmd_start_scan(data->client); + ist30xx_enable_irq(data); + + return ver; +} + +int ist30xxb_get_key_sensitivity(struct ist30xx_data *data, int id) +{ + u32 addr = IST30XXB_MEM_COUNT + 4 * sizeof(u32); + u32 val = 0; + + if (id >= ist30xx_tkey_info.key_num) + return 0; + + ist30xx_disable_irq(data); + ist30xx_read_cmd(ts_data->client, addr, &val); + ist30xx_enable_irq(data); + + tsp_debug("Reg addr: %x, val: %8x\n", addr, val); + + val >>= (16 * id); + + return (int)(val & 0xFFFF); +} + + +/* Factory CMD function */ +static void set_default_result(struct sec_factory *sec) +{ + char delim = ':'; + + memset(sec->cmd_result, 0, ARRAY_SIZE(sec->cmd_result)); + memcpy(sec->cmd_result, sec->cmd, strlen(sec->cmd)); + strncat(sec->cmd_result, &delim, CMD_STATE_RUNNING); +} + +static void set_cmd_result(struct sec_factory *sec, char *buf, int len) +{ + strncat(sec->cmd_result, buf, len); +} + +static void not_support_cmd(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", "NA"); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_NA; + dev_info(&data->client->dev, "%s: \"%s(%d)\"\n", __func__, + buf, strnlen(buf, sizeof(buf))); + return; +} + +static void get_chip_vendor(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_VENDOR); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_name(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_NAME); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_id(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%#02x", data->chip_id); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void fw_update(void *dev_data) +{ + int ret; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case BUILT_IN: + sec->cmd_state = CMD_STATE_OK; + ret = ist30xx_fw_recovery(data); + if (ret < 0) { + sec->cmd_state = CMD_STATE_FAIL; + return; + } + break; + + default: + tsp_warn("%s(), Invalid fw file type!\n", __func__); + break; + } + + if (sec->cmd_state == CMD_STATE_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); +} + + +static void get_fw_ver_bin(void *dev_data) +{ + u32 ver = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + ver = ist30xx_parse_ver(FLAG_PARAM, data->fw.buf); + snprintf(buf, sizeof(buf), "IM00%04x", ver); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_fw_ver_ic(void *dev_data) +{ + u32 ver = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->status.power == 1) + ver = ist30xxb_get_fw_ver(ts_data); + + snprintf(buf, sizeof(buf), "IM00%04x", ver & 0xFFFF); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_threshold(void *dev_data) +{ + char buf[16] = { 0 }; + int val = TSP_THRESHOLD; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + snprintf(buf, sizeof(buf), "%d", val); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_x_num(void *dev_data) +{ + int val = ist30xx_tsp_info.width; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +static void get_y_num(void *dev_data) +{ + int val = ist30xx_tsp_info.height; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +int check_tsp_channel(void *dev_data) +{ + int node = -EPERM; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &ist30xx_tsp_info; + + if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= tsp->width) || + (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= tsp->height)) { + dev_info(&data->client->dev, "%s: parameter error: %u,%u\n", + __func__, sec->cmd_param[0], sec->cmd_param[1]); + } else { + node = sec->cmd_param[0] + sec->cmd_param[1] * tsp->width; + dev_info(&data->client->dev, "%s: node = %d\n", __func__, node); + } + + return node; +} + + +extern int parse_tsp_node(u8 flag, struct TSP_NODE_BUF *node, s16 *buf16); +void run_raw_read(void *dev_data) +{ + int i, ret; + int min_val, max_val; + char buf[16] = { 0 }; + u8 flag = NODE_FLAG_RAW; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &ist30xx_tsp_info; + + set_default_result(sec); + + ret = ist30xx_read_touch_node(flag, &tsp->node); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node read fail!\n", __func__); + return; + } + ist30xx_parse_touch_node(flag, &tsp->node); + + ret = parse_tsp_node(flag, &tsp->node, node_value); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag); + return; + } + + min_val = max_val = node_value[0]; + for (i = 0; i < tsp->width * tsp->height; i++) { +#if TSP_NODE_DEBUG + if ((i % tsp->width) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", node_value[i]); +#endif + + max_val = max(max_val, (int)node_value[i]); + min_val = min(min_val, (int)node_value[i]); + } + + snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void get_raw_value(void *dev_data) +{ + int idx = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + idx = check_tsp_channel(data); + if (idx < 0) { // Parameter parsing fail + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + } else { + snprintf(buf, sizeof(buf), "%d", node_value[idx]); + sec->cmd_state = CMD_STATE_OK; + } + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), [%d][%d]: %s\n", __func__, + sec->cmd_param[0], sec->cmd_param[1], buf); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + + + +/* sysfs: /sys/class/sec/tsp/close_tsp_test */ +static ssize_t show_close_tsp_test(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0); +} + +/* sysfs: /sys/class/sec/tsp/cmd */ +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + struct i2c_client *client = data->client; + + char *cur, *start, *end; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + int ret; + + if (sec->cmd_is_running == true) { + dev_err(&client->dev, "tsp_cmd: other cmd is running.\n"); + tsp_err("tsp_cmd: other cmd is running.\n"); + goto err_out; + } + + /* check lock */ + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = true; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_RUNNING; + + for (i = 0; i < ARRAY_SIZE(sec->cmd_param); i++) + sec->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + memset(sec->cmd, 0, ARRAY_SIZE(sec->cmd)); + memcpy(sec->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(msg, buf, cur - buf); + else + memcpy(msg, buf, len); + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp(msg, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(msg, 0, ARRAY_SIZE(msg)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(msg, start, end - start); + *(msg + strlen(msg)) = '\0'; + ret = kstrtoint(msg, 10, \ + sec->cmd_param + param_cnt); + start = cur + 1; + memset(msg, 0, ARRAY_SIZE(msg)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + tsp_info("SEC CMD = %s\n", tsp_cmd_ptr->cmd_name); + + for (i = 0; i < param_cnt; i++) + dev_info(&client->dev, "cmd param %d= %d\n", i, sec->cmd_param[i]); + + tsp_cmd_ptr->cmd_func(data); + +err_out: + return count; +} + +/* sysfs: /sys/class/sec/tsp/cmd_status */ +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + char msg[16] = { 0 }; + + dev_info(&data->client->dev, "tsp cmd: status:%d\n", sec->cmd_state); + + if (sec->cmd_state == CMD_STATE_WAITING) + snprintf(msg, sizeof(msg), "WAITING"); + + else if (sec->cmd_state == CMD_STATE_RUNNING) + snprintf(msg, sizeof(msg), "RUNNING"); + + else if (sec->cmd_state == CMD_STATE_OK) + snprintf(msg, sizeof(msg), "OK"); + + else if (sec->cmd_state == CMD_STATE_FAIL) + snprintf(msg, sizeof(msg), "FAIL"); + + else if (sec->cmd_state == CMD_STATE_NA) + snprintf(msg, sizeof(msg), "NOT_APPLICABLE"); + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", msg); +} + +/* sysfs: /sys/class/sec/tsp/result */ +static ssize_t show_cmd_result(struct device *dev, struct device_attribute + *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + dev_info(&data->client->dev, "tsp cmd: result: %s\n", sec->cmd_result); + + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = false; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_WAITING; + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", sec->cmd_result); +} + + + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_version_phone */ +static ssize_t phone_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + u32 ver = ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_version_panel */ +static ssize_t part_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + u32 ver = 0; + + if (ts_data->status.power == 1) + ver = ist30xxb_get_fw_ver(ts_data); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_threshold */ +static ssize_t threshold_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int val = TSP_THRESHOLD; + + tsp_info("%s(), %d\n", __func__, val); + + return sprintf(buf, "%d", val); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_update */ +static ssize_t firmware_update(struct device *dev, struct device_attribute *attr, char *buf) +{ + bool ret; + + sprintf(IsfwUpdate, "%s\n", FW_DOWNLOADING); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + ret = ist30xx_fw_recovery(ts_data); + ret = (ret == 0 ? 1 : -1); + + sprintf(IsfwUpdate, "%s\n", + (ret > 0 ? FW_DOWNLOAD_COMPLETE : FW_DOWNLOAD_FAIL)); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%d", ret); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchscreen/tsp_firm_update_status */ +static ssize_t firmware_update_status(struct device *dev, struct device_attribute *attr, char *buf) +{ + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%s\n", IsfwUpdate); +} + + +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_menu */ +static ssize_t menu_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 0); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d\n", sensitivity); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_back */ +static ssize_t back_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int sensitivity = ist30xxb_get_key_sensitivity(ts_data, 1); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d\n", sensitivity); +} + +/* sysfs: /sys/class/sec/tsp/sec_touchkey/touchkey_threshold */ +static ssize_t touchkey_threshold_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int val = TKEY_THRESHOLD; + + tsp_info("%s(), %d\n", __func__, val); + + return snprintf(buf, sizeof(int), "%d\n", val); +} + + + +struct tsp_cmd tsp_cmds[] = { + { TSP_CMD("fw_update", not_support_cmd), }, + { TSP_CMD("get_fw_ver_bin", get_fw_ver_bin), }, + { TSP_CMD("get_fw_ver_ic", get_fw_ver_ic), }, + { TSP_CMD("get_config_ver", not_support_cmd), }, + { TSP_CMD("get_threshold", not_support_cmd), }, + { TSP_CMD("module_off_master", not_support_cmd), }, + { TSP_CMD("module_on_master", not_support_cmd), }, + { TSP_CMD("module_off_slave", not_support_cmd), }, + { TSP_CMD("module_on_slave", not_support_cmd), }, + { TSP_CMD("get_chip_vendor", get_chip_vendor), }, + { TSP_CMD("get_chip_name", get_chip_name), }, + { TSP_CMD("run_rawcap_read", run_raw_read), }, + { TSP_CMD("get_x_num", get_x_num), }, + { TSP_CMD("get_y_num", get_y_num), }, + { TSP_CMD("get_reference", not_support_cmd), }, + { TSP_CMD("get_cm_abs", not_support_cmd), }, + { TSP_CMD("get_rawcap", not_support_cmd), }, + { TSP_CMD("get_cm_delta", not_support_cmd), }, + { TSP_CMD("get_intensity", not_support_cmd), }, + { TSP_CMD("run_reference_read", not_support_cmd), }, + { TSP_CMD("run_cm_abs_read", not_support_cmd), }, + { TSP_CMD("run_cm_delta_read", not_support_cmd), }, + { TSP_CMD("run_intensity_read", not_support_cmd), }, + { TSP_CMD("not_support_cmd", not_support_cmd), }, +}; + + +#define SEC_DEFAULT_ATTR (S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH) +/* sysfs - touchscreen */ +static DEVICE_ATTR(tsp_firm_version_phone, SEC_DEFAULT_ATTR, + phone_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_version_panel, SEC_DEFAULT_ATTR, + part_firmware_show, NULL); +static DEVICE_ATTR(tsp_threshold, SEC_DEFAULT_ATTR, + threshold_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_update, SEC_DEFAULT_ATTR, + firmware_update, NULL); +static DEVICE_ATTR(tsp_firm_update_status, SEC_DEFAULT_ATTR, + firmware_update_status, NULL); + +/* sysfs - touchkey */ +static DEVICE_ATTR(touchkey_menu, SEC_DEFAULT_ATTR, + menu_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_back, SEC_DEFAULT_ATTR, + back_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_threshold, SEC_DEFAULT_ATTR, + touchkey_threshold_show, NULL); + +/* sysfs - tsp */ +static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *sec_tsp_attributes[] = { + &dev_attr_tsp_firm_version_phone.attr, + &dev_attr_tsp_firm_version_panel.attr, + &dev_attr_tsp_threshold.attr, + &dev_attr_tsp_firm_update.attr, + &dev_attr_tsp_firm_update_status.attr, + NULL, +}; + +static struct attribute *sec_tkey_attributes[] = { + &dev_attr_touchkey_menu.attr, + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_threshold.attr, + NULL, +}; + +static struct attribute *sec_touch_facotry_attributes[] = { + &dev_attr_close_tsp_test.attr, + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group sec_tsp_attr_group = { + .attrs = sec_tsp_attributes, +}; + +static struct attribute_group sec_tkey_attr_group = { + .attrs = sec_tkey_attributes, +}; + +static struct attribute_group sec_touch_factory_attr_group = { + .attrs = sec_touch_facotry_attributes, +}; + +extern struct class *sec_class; +struct device *sec_touchscreen; +EXPORT_SYMBOL(sec_touchscreen); +struct device *sec_touchkey; +EXPORT_SYMBOL(sec_touchkey); +struct device *sec_fac_dev; + + +int sec_touch_sysfs(struct ist30xx_data *data) +{ + + printk("[TSP] %s\n", __func__); + /* /sys/class/sec/sec_touchscreen */ + sec_touchscreen = device_create(sec_class, NULL, 0, NULL, "sec_touchscreen"); + if (IS_ERR(sec_touchscreen)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchscreen"); + return -ENODEV; + } + /* /sys/class/sec/sec_touchscreen/... */ + if (sysfs_create_group(&sec_touchscreen->kobj, &sec_tsp_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchscreen"); + + /* /sys/class/sec/sec_touchkey */ + sec_touchkey = device_create(sec_class, NULL, 0, NULL, "sec_touchkey"); + if (IS_ERR(sec_touchkey)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchkey"); + return -ENODEV; + } + /* /sys/class/sec/sec_touchkey/... */ + if (sysfs_create_group(&sec_touchkey->kobj, &sec_tkey_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchkey"); + + /* /sys/class/sec/tsp */ + sec_fac_dev = device_create(sec_class, NULL, 0, data, "tsp"); + if (IS_ERR(sec_fac_dev)) { + tsp_err("Failed to create device (%s)!\n", "tsp"); + return -ENODEV; + } + /* /sys/class/sec/tsp/... */ + if (sysfs_create_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "tsp"); + + return 0; +} +EXPORT_SYMBOL(sec_touch_sysfs); +int sec_fac_cmd_init(struct ist30xx_data *data) +{ + int i; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + INIT_LIST_HEAD(&sec->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &sec->cmd_list_head); + + mutex_init(&sec->cmd_lock); + sec->cmd_is_running = false; + + return 0; +} +EXPORT_SYMBOL(sec_fac_cmd_init); diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_sec.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec.h new file mode 100755 index 00000000..a696a015 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_SEC_H__ +#define __IST30XX_SEC_H__ + + +#define SEC_CMD_STR_LEN 32 +#define SEC_CMD_RESULT_STR_LEN 512 +#define SEC_CMD_PARAM_NUM 8 + +#include "ist30xxb_tsp.h" + +struct sec_factory { + struct list_head cmd_list_head; + unsigned char cmd_state; + char cmd[SEC_CMD_STR_LEN]; + int cmd_param[SEC_CMD_PARAM_NUM]; + char cmd_result[SEC_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; +}; + +#endif // __IST30XX_SEC_H__ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_sec_test.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec_test.c new file mode 100755 index 00000000..ce01a49d --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec_test.c @@ -0,0 +1,582 @@ +/* +* Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ + +#include +#include +#include +#include + +#include +#include "ist30xxb_update.h" +#include "ist30xxb_misc.h" +#include "ist30xxb_sec_tsp.h" + +extern struct ist30xx_data *ts_data; +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; + + +#define TSP_BUF_SIZE (1024) +/* /sys/class/sec/tsp/close_tsp_test */ +ssize_t sec_tsp_test_close_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp test close\n"); + +return snprintf(buf, TSP_BUF_SIZE, "%u\n", 0); +} + +/* /sys/class/sec/tsp/cmd_status */ +ssize_t sec_tsp_cmd_status_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp cmd status : Ready"); + +return snprintf(buf, sizeof(char)*16, "Ready\n"); +} + +/* /sys/class/sec/tsp/cmd_result */ +ssize_t sec_tsp_cmd_result_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp cmd result : Ready"); + +return snprintf(buf, sizeof(char)*16, "Ready\n"); +} + +/* /sys/class/sec/tsp/cmd */ +ssize_t sec_tsp_cmd_store(struct device *dev, +struct device_attribute *attr, const char *buf, size_t size) +{ +DMSG("[TSP] tsp cmd store\n"); + +return size; +} + +/* /sys/class/sec/tsp/intensity_logging_on */ +ssize_t sec_tsp_intensity_log_on(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp intensity logging on : Ready"); + +return snprintf(buf, sizeof(char)*16, "Ready\n"); +} + +/* /sys/class/sec/tsp/intensity_logging_off */ +ssize_t sec_tsp_intensity_log_off(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp intensity logging off : Ready"); + +return snprintf(buf, sizeof(char)*16, "Ready\n"); +} + + +extern ssize_t ist30xx_frame_refresh(struct device *dev, +struct device_attribute *attr, char *buf); +/* /sys/class/sec/tsp/read_frame */ +ssize_t sec_tsp_read_frame_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int ret; + +ret = ist30xx_enter_debug_mode(); + if (ret) + return snprintf(buf, sizeof(char)*16, "fail, sec_read_frame\n"); + +ist30xx_frame_refresh(dev, attr, buf); + +return snprintf(buf, sizeof(char)*16, "sec_read_frame\n"); +} + +static u16 *node_raw_buf; +static u16 *node_baseline_buf; +/* sysfs: /sys/class/sec/tsp/read_node */ +ssize_t sec_tsp_read_node_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int ret; + +ret = ist30xx_read_tsp_node(node_raw_buf, node_baseline_buf); + if (ret) + return snprintf(buf, sizeof(char)*16, "fail, sec_read_frame\n"); +return 0; +} + +/* sysfs: /sys/class/sec/tsp/raw */ +ssize_t sec_tsp_raw_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ + int i, j; + int count = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ist30xx_parse_tsp_node(node_raw_buf, node_baseline_buf); + + for (i = 0; i < tsp->height; i++) { + for (j = 0; j < tsp->width; j++) { + count += snprintf(msg, msg_len, + "%04d ", *node_raw_buf++); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + + return count; +} +/* sysfs: /sys/class/sec/tsp/baseline */ +ssize_t sec_tsp_baseline_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ + int i, j; + int count = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &ist30xx_tsp_info; + + ist30xx_parse_tsp_node(node_raw_buf, node_baseline_buf); + + for (i = 0; i < tsp->height; i++) { + for (j = 0; j < tsp->width; j++) { + count += snprintf(msg, msg_len, "%04d ", + *node_baseline_buf++); + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + + return count; +} + + +/* /sys/class/sec/tsp/chip_vendor */ +ssize_t sec_tsp_chip_vendor_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ + int ret; + +ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + +ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CHIP_ID, &ts_data->chip_id); + if (ret) + return sprintf(buf, "NULL"); + +if ((ts_data->chip_id != IST30XX_CHIP_ID) && + (ts_data->chip_id != IST30XXA_CHIP_ID)) + return sprintf(buf, "NULL"); + +DMSG("[TSP] tsp chip vendor: %s\n", IST30XX_CHIP_VENDOR); + +return sprintf(buf, "%s\n", IST30XX_CHIP_VENDOR); +} + +/* /sys/class/sec/tsp/chip_name */ +ssize_t sec_tsp_chip_name_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ + int ret; + +ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + +ret = ist30xx_read_cmd(ts_data->client, CMD_GET_CHIP_ID, &ts_data->chip_id); + if (ret) + return sprintf(buf, "NULL"); + +if ((ts_data->chip_id != IST30XX_CHIP_ID) && + (ts_data->chip_id != IST30XXA_CHIP_ID)) + return sprintf(buf, "NULL"); + +DMSG("[TSP] tsp chip name: %s\n", IST30XX_CHIP_NAME); + +return sprintf(buf, "%s\n", IST30XX_CHIP_NAME); +} + +/* /sys/class/sec/tsp/panel_vendor */ +ssize_t sec_tsp_panel_vendor_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ + int ret; +u32 panel_vendor; + +ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + +ret = ist30xx_read_cmd(ts_data->client, CMD_GET_TSP_VENDOR, &panel_vendor); + if (ret) + return sprintf(buf, "NULL"); + +DMSG("[TSP] tsp panel vendor: %d\n", panel_vendor); + +return sprintf(buf, "%d\n", panel_vendor); +} + +/* /sys/class/sec/tsp/fw_ver */ +ssize_t sec_tsp_fw_ver_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ + int ret; + +ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) + return sprintf(buf, "NULL"); + +ret = ist30xx_read_cmd(ts_data->client, CMD_GET_FW_VER, &ts_data->fw.ver); + if (ret) + return sprintf(buf, "NULL"); + +ret = ist30xx_read_cmd(ts_data->client, CMD_GET_PARAM_VER, &ts_data->param_ver); + if (ret) + return sprintf(buf, "NULL"); + +DMSG("[TSP] tsp version: %d(%d.%d.%d)\n", ts_data->param_ver, +(ts_data->fw.ver>>16) & 0xFF, (ts_data->fw.ver>>8) & 0xFF, +ts_data->fw.ver & 0xFF); + +return sprintf(buf, "%d(%d.%d.%d)\n", ts_data->param_ver, +(ts_data->fw.ver>>16) & 0xFF, (ts_data->fw.ver>>8) & 0xFF, +ts_data->fw.ver & 0xFF); +} + +/* /sys/class/sec/tsp/raw_range */ +ssize_t sec_tsp_raw_range_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp raw range: %d~%d\n", +IST30XX_MIN_RAW_DATA, IST30XX_MAX_RAW_DATA); + +return sprintf(buf, "%d,%d\n", IST30XX_MIN_RAW_DATA, IST30XX_MAX_RAW_DATA); +} + +/* /sys/class/sec/tsp/base_range */ +ssize_t sec_tsp_base_range_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp base range: %d~%d\n", +IST30XX_MIN_BASELINE, IST30XX_MAX_BASELINE); + +return sprintf(buf, "%d,%d\n", IST30XX_MIN_BASELINE, IST30XX_MAX_BASELINE); +} + +/* /sys/class/sec/tsp/zval_range */ +ssize_t sec_tsp_zval_range_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp raw range: %d~%d\n", +IST30XX_MIN_ZVALUE_TSP, IST30XX_MAX_ZVALUE_TSP); + +return sprintf(buf, "%d,%d\n", +IST30XX_MIN_ZVALUE_TSP, IST30XX_MAX_ZVALUE_TSP); +} + +/* /sys/class/sec/tsp/node_num */ +ssize_t sec_tsp_node_num_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] tsp node num: width:%d, height: %d\n", +ist30xx_tsp_info.width, ist30xx_tsp_info.height); + +return sprintf(buf, "%d,%d\n", +ist30xx_tsp_info.width, ist30xx_tsp_info.height); +} + + +/* /sys/class/sec/tkey/tkey_back */ +ssize_t sec_back_key_state_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int key_state=0; + +DMSG("[TSP] back tkey state: %d\n", key_state); + +return snprintf(buf, sizeof(buf), "%d\n", key_state); +} + +/* /sys/class/sec/tkey/tkey_menu */ +ssize_t sec_menu_key_state_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int key_state=0; + +DMSG("[TSP] menu tkey state: %d\n", key_state); + +return snprintf(buf, sizeof(int), "%d\n", key_state); +} + +/* /sys/class/sec/tkey/tkey_hom */ +ssize_t sec_home_key_state_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int key_state=0; + +DMSG("[TSP] home tkey state: %d\n", key_state); + +return snprintf(buf, sizeof(int), "%d\n", key_state); +} + +/* /sys/class/sec/tkey/tkey_recent */ +ssize_t sec_recent_key_state_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int key_state=0; + +DMSG("[TSP] recent tkey state: %d\n", key_state); + +return snprintf(buf, sizeof(int), "%d\n", key_state); +} + +/* /sys/class/sec/tkey/tkey_threshold */ +ssize_t sec_tkey_threshold_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int threshold=0; + +DMSG("[TSP] touch tkey threshold: %d\n", threshold); + +return snprintf(buf, sizeof(int), "%d\n", threshold); +} + +/* /sys/class/sec/tkey/tkey_raw_data0 */ +ssize_t sec_tkey_rawcnt0_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int raw_cnt=0; + +DMSG("[TSP] raw counter0: %d\n", raw_cnt); + +return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + +/* /sys/class/sec/tkey/tkey_raw_data1 */ +ssize_t sec_tkey_rawcnt1_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int raw_cnt=0; + +DMSG("[TSP] raw counter1: %d\n", raw_cnt); + +return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + +/* /sys/class/sec/tkey/tkey_raw_data2 */ +ssize_t sec_tkey_rawcnt2_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int raw_cnt=0; + +DMSG("[TSP] raw counter2: %d\n", raw_cnt); + +return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + +/* /sys/class/sec/tkey/tkey_raw_data3 */ +ssize_t sec_tkey_rawcnt3_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +int raw_cnt=0; + +DMSG("[TSP] raw counter3 : %d\n", raw_cnt); + +return snprintf(buf, sizeof(int), "%d\n", raw_cnt); +} + + +extern bool get_zvalue_mode; +extern int ist30xx_zvalue; +/* /sys/class/sec/tkey/tkey_zvalue */ +ssize_t sec_tkey_zvalue_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +u32 zvalue = ist30xx_zvalue; +DMSG("[TSP] tkey zvalue: %d\n", zvalue); + +ist30xx_zvalue = 0; + +return snprintf(buf, sizeof(int), "%d\n", zvalue); +} + +ssize_t sec_tkey_zvalue_store(struct device *dev, +struct device_attribute *attr, const char *buf, size_t size) +{ +int ret; +int cmd; +u32 val; + +sscanf(buf, "%d", &cmd); + +DMSG("[TSP] tkey zvalue cmd(%d)\n", cmd); + +val = (cmd > 0 ? 0x00C80001 : 0); + +if (cmd) { + ist30xx_disable_irq(ts_data); + ist30xx_cmd_run_device(ts_data->client); + ist30xx_enable_irq(ts_data); +} + +ret = ist30xx_write_cmd(ts_data->client, CMD_ZVALUE_MODE, val); + if (ret) { + pr_err("[ TSP ] fail, zvalue mode enter(%d)\n", ret); +return size; + } + +get_zvalue_mode = (cmd > 0 ? true : false); + +DMSG("[TSP] tkey zvalue val: %x, cmd: %d\n", val, cmd); + +return size; +} + +/* /sys/class/sec/tkey/tkey_zval_range */ +ssize_t sec_tkey_zval_range_show(struct device *dev, +struct device_attribute *attr, char *buf) +{ +DMSG("[TSP] zvalue range: %d~%d\n", +IST30XX_MIN_ZVALUE_TKEY, IST30XX_MAX_ZVALUE_TKEY); + +return sprintf(buf, "%d,%d\n", +IST30XX_MIN_ZVALUE_TKEY, IST30XX_MAX_ZVALUE_TKEY); +} + + +/* sysfs */ +static DEVICE_ATTR(close_tsp_test, S_IRUGO, sec_tsp_test_close_show, NULL); +static DEVICE_ATTR(cmd_status, S_IRUGO, sec_tsp_cmd_status_show, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, sec_tsp_cmd_result_show, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, sec_tsp_cmd_store); + +static DEVICE_ATTR(intensity_logging_on, S_IRUGO, sec_tsp_intensity_log_on, +NULL); +static DEVICE_ATTR(intensity_logging_off, S_IRUGO, sec_tsp_intensity_log_off, +NULL); + +static DEVICE_ATTR(read_frame, S_IRUGO, sec_tsp_read_frame_show, NULL); +static DEVICE_ATTR(read_node, S_IRUGO, sec_tsp_read_node_show, NULL); +static DEVICE_ATTR(raw, S_IRUGO, sec_tsp_raw_show, NULL); +static DEVICE_ATTR(baseline, S_IRUGO, sec_tsp_baseline_show, NULL); +static DEVICE_ATTR(chip_vendor, S_IRUGO, sec_tsp_chip_vendor_show, NULL); +static DEVICE_ATTR(chip_name, S_IRUGO, sec_tsp_chip_name_show, NULL); +static DEVICE_ATTR(panel_vendor, S_IRUGO, sec_tsp_panel_vendor_show, NULL); +static DEVICE_ATTR(fw_ver, S_IRUGO, sec_tsp_fw_ver_show, NULL); +static DEVICE_ATTR(raw_range, S_IRUGO, sec_tsp_raw_range_show, NULL); +static DEVICE_ATTR(base_range, S_IRUGO, sec_tsp_base_range_show, NULL); +static DEVICE_ATTR(zval_range, S_IRUGO, sec_tsp_zval_range_show, NULL); +static DEVICE_ATTR(node_num, S_IRUGO, sec_tsp_node_num_show, NULL); + +static struct attribute *sec_tsp_attributes[] = { +&dev_attr_close_tsp_test.attr, +&dev_attr_cmd.attr, +&dev_attr_cmd_status.attr, +&dev_attr_cmd_result.attr, + +&dev_attr_intensity_logging_on.attr, +&dev_attr_intensity_logging_off.attr, + +&dev_attr_read_frame.attr, +&dev_attr_read_node.attr, +&dev_attr_raw.attr, +&dev_attr_baseline.attr, +&dev_attr_chip_vendor.attr, +&dev_attr_chip_name.attr, +&dev_attr_panel_vendor.attr, +&dev_attr_fw_ver.attr, +&dev_attr_raw_range.attr, +&dev_attr_base_range.attr, +&dev_attr_zval_range.attr, +&dev_attr_node_num.attr, + +NULL, +}; +static struct attribute_group sec_tsp_attr_group = { +.attrs = sec_tsp_attributes, +}; + +static DEVICE_ATTR(tkey_back, S_IRUGO, sec_back_key_state_show, NULL); +static DEVICE_ATTR(tkey_home, S_IRUGO, sec_home_key_state_show, NULL); +static DEVICE_ATTR(tkey_menu, S_IRUGO, sec_menu_key_state_show, NULL); +static DEVICE_ATTR(tkey_recent, S_IRUGO, sec_recent_key_state_show, NULL); +static DEVICE_ATTR(tkey_threshold, S_IRUGO, sec_tkey_threshold_show, NULL); +static DEVICE_ATTR(tkey_raw_data0, S_IRUGO, sec_tkey_rawcnt0_show, NULL); +static DEVICE_ATTR(tkey_raw_data1, S_IRUGO, sec_tkey_rawcnt1_show, NULL); +static DEVICE_ATTR(tkey_raw_data2, S_IRUGO, sec_tkey_rawcnt2_show, NULL); +static DEVICE_ATTR(tkey_raw_data3, S_IRUGO, sec_tkey_rawcnt3_show, NULL); +static DEVICE_ATTR(tkey_zvalue, S_IRWXUGO, + sec_tkey_zvalue_show, sec_tkey_zvalue_store); +static DEVICE_ATTR(tkey_zval_range, S_IRUGO, sec_tkey_zval_range_show, NULL); + +static struct attribute *sec_tkey_attributes[] = { +&dev_attr_tkey_back.attr, +&dev_attr_tkey_home.attr, +&dev_attr_tkey_menu.attr, +&dev_attr_tkey_recent.attr, +&dev_attr_tkey_threshold.attr, +&dev_attr_tkey_raw_data0.attr, +&dev_attr_tkey_raw_data1.attr, +&dev_attr_tkey_raw_data2.attr, +&dev_attr_tkey_raw_data3.attr, + +&dev_attr_tkey_zvalue.attr, +&dev_attr_tkey_zval_range.attr, +NULL, +}; +static struct attribute_group sec_tkey_attr_group = { +.attrs = sec_tkey_attributes, +}; + + +struct class *sec_dev_class; +struct device *sec_tsp_dev; +struct device *sec_tk_dev; + + +int ist30xx_sec_sysfs(void) +{ + +sec_dev_class = class_create(THIS_MODULE, "sec_factory"); +if (!sec_dev_class) + pr_err("[ TSP ] Failed to create device class(%s)!\n", "sec"); + +/* /sys/class/sec_factory/tsp */ + sec_tsp_dev = device_create(sec_dev_class, NULL, 0, NULL, "tsp"); + + /* /sys/class/sec/tsp/... */ + if (sysfs_create_group(&sec_tsp_dev->kobj, &sec_tsp_attr_group)) + pr_err( + "[ TSP ] Failed to create sysfs group(%s)!\n", + "sec_tsp"); + + /* /sys/class/sec/tkey */ + sec_tk_dev = device_create(sec_dev_class, NULL, 0, NULL, "tkey"); + + /* /sys/class/sec/tkey/... */ +if (sysfs_create_group(&sec_tk_dev->kobj, &sec_tkey_attr_group)) + pr_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tkey"); + + node_raw_buf = kmalloc(4096, GFP_KERNEL); + node_baseline_buf = kmalloc(4096, GFP_KERNEL); + + return 0; +} +EXPORT_SYMBOL(ist30xx_sec_sysfs); diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_sec_tsp.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec_tsp.h new file mode 100755 index 00000000..48f1c8f7 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_sec_tsp.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_SEC_TSP_H__ +#define __IST30XX_SEC_TSP_H__ + +#define IST30XX_DD_VERSION (1) + +#define IST30XX_CHIP_VENDOR ("IMAGIS") +#define IST30XX_CHIP_NAME ("IST30xx Series") + +#define IST30XX_MIN_RAW_DATA (2100) +#define IST30XX_MAX_RAW_DATA (3900) + +#define IST30XX_MIN_BASELINE (2100) +#define IST30XX_MAX_BASELINE (3900) + +#define IST30XX_MIN_ZVALUE_TSP (175) +#define IST30XX_MAX_ZVALUE_TSP (325) + +#define IST30XX_MIN_ZVALUE_TKEY (210) +#define IST30XX_MAX_ZVALUE_TKEY (390) + +#endif /* __IST30XX_SEC_TSP_H__ */ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_sys.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_sys.c new file mode 100644 index 00000000..1c90ca70 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_sys.c @@ -0,0 +1,413 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/****************************************************************************** + * Return value of Error + * EPERM : 1 (Operation not permitted) + * ENOENT : 2 (No such file or directory) + * EIO : 5 (I/O error) + * ENXIO : 6 (No such device or address) + * EINVAL : 22 (Invalid argument) + *****************************************************************************/ + +extern struct ist30xx_data *ts_data; +#if IST30XX_NOISE_MODE +#endif +const u32 pos_cmd = cpu_to_be32(CMD_GET_COORD); +struct i2c_msg pos_msg[READ_CMD_MSG_LEN] = { + { + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&pos_cmd, + }, + { .flags = I2C_M_RD, }, +}; + +int ist30xx_get_position(struct i2c_client *client, u32 *buf, u16 len) +{ + int ret, i; + + pos_msg[0].addr = client->addr; + pos_msg[1].addr = client->addr; + pos_msg[1].len = len * IST30XX_DATA_LEN, + pos_msg[1].buf = (u8 *)buf, + + ret = i2c_transfer(client->adapter, pos_msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d)\n", __func__, ret); + return -EIO; + } + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_cmd_run_device(struct i2c_client *client) +{ + int ret = -EIO; + + ist30xx_reset(); + ret = ist30xx_write_cmd(client, CMD_RUN_DEVICE, 0); + msleep(10); + + return ret; +} + +int ist30xx_cmd_start_scan(struct i2c_client *client) +{ + int ret; + + ret = ist30xx_write_cmd(client, CMD_START_SCAN, 0); + + msleep(100); + +#if IST30XX_NOISE_MODE + ts_data->status.noise_mode = true; +#endif + + return ret; +} + +int ist30xx_cmd_calibrate(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, CMD_CALIBRATE, 0); + + tsp_info("%s\n", __func__); + + msleep(100); + + return ret; +} + +int ist30xx_cmd_check_calib(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, CMD_CHECK_CALIB, 0); + + tsp_info("*** Check Calibration cmd ***\n"); + + msleep(20); + + return ret; +} + +int ist30xx_cmd_update(struct i2c_client *client, int cmd) +{ + u32 val = (cmd == CMD_ENTER_FW_UPDATE ? CMD_FW_UPDATE_MAGIC : 0); + int ret = ist30xx_write_cmd(client, cmd, val); + + msleep(10); + + return ret; +} + +int ist30xx_cmd_reg(struct i2c_client *client, int cmd) +{ + int ret = ist30xx_write_cmd(client, cmd, 0); + + if (cmd == CMD_ENTER_REG_ACCESS) + msleep(100); + else if (cmd == CMD_EXIT_REG_ACCESS) + msleep(10); + + return ret; +} + + +int ist30xx_read_cmd(struct i2c_client *client, u32 cmd, u32 *buf) +{ + int ret; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d), cmd: %x\n", __func__, ret, cmd); + return -EIO; + } + *buf = cpu_to_be32(*buf); + + return 0; +} + + +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val) +{ + int ret; + struct i2c_msg msg; + u8 msg_buf[IST30XX_ADDR_LEN + IST30XX_DATA_LEN]; + + put_unaligned_be32(cmd, msg_buf); + put_unaligned_be32(val, msg_buf + IST30XX_ADDR_LEN); + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_ADDR_LEN + IST30XX_DATA_LEN; + msg.buf = msg_buf; + + ret = i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN); + if (ret != WRITE_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d), cmd: %x(%x)\n", __func__, ret, cmd, val); + return -EIO; + } + + return 0; +} + +#define TSP_PWR_LDO_GPIO 41 +#define GPIO_TSP_SCL 35 +#define GPIO_TSP_SDA 40 +static struct regulator *touch_regulator; +#if defined(CONFIG_MACH_CORSICA_VE) || defined(CONFIG_MACH_POCKET2) || defined(CONFIG_MACH_VIVALTO) +static void ts_power_enable(int en) +{ + int ret=0; + struct regulator *touch_regulator_1v8 = NULL; + struct regulator *touch_regulator_3v3 = NULL; + + tsp_info("[TSP] %s, %d\n", __func__, en ); + + touch_regulator_1v8 = regulator_get(NULL,"vddsim2"); + if (IS_ERR(touch_regulator_1v8)) { + touch_regulator_1v8 = NULL; + tsp_info("get touch_regulator_1v8 regulator error\n"); + return; + } + +#ifdef CONFIG_TSP_0_1_A + touch_regulator_3v3 = regulator_get(NULL,"vddcon"); +#else + touch_regulator_3v3 = regulator_get(NULL,"vddcammot"); +#endif + if (IS_ERR(touch_regulator_3v3)) { + touch_regulator_1v8 = NULL; + tsp_info("get touch_regulator_3v3 regulator error\n"); + return; + } + + if(en) { + regulator_set_voltage(touch_regulator_1v8, 1800000, 1800000); + ret = regulator_enable(touch_regulator_1v8); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_1v8 enable failed (%d)\n",__func__, ret); + } + + regulator_set_voltage(touch_regulator_3v3, 3300000, 3300000); + ret = regulator_enable(touch_regulator_3v3); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v3 enable failed (%d)\n",__func__, ret); + } + } + else + { + ret = regulator_disable(touch_regulator_1v8); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v0 disable failed (%d)\n",__func__, ret); + } + + ret = regulator_disable(touch_regulator_3v3); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v0 disable failed (%d)\n",__func__, ret); + } + } +} +#elif defined(CONFIG_MACH_YOUNG2) +static void ts_power_enable(int en) +{ + int ret=0; + struct regulator *touch_regulator_3v0 = NULL; + + tsp_info("[TSP] %s, %d\n", __func__, en ); + + touch_regulator_3v0 = regulator_get(NULL,"vddsim2"); + if (IS_ERR(touch_regulator_3v0)) { + touch_regulator_3v0 = NULL; + tsp_info("get touch_regulator_3v0 regulator error\n"); + return; + } + if(en) { + regulator_set_voltage(touch_regulator_3v0, 3000000, 3000000); + ret = regulator_enable(touch_regulator_3v0); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v0 enable failed (%d)\n",__func__, ret); + } + } + else + { + ret = regulator_disable(touch_regulator_3v0); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v0 disable failed (%d)\n",__func__, ret); + } + } +} +#elif defined(CONFIG_MACH_PIKEAYOUNG2DTV) +static void ts_power_enable(int en) +{ + int ret=0; + struct regulator *touch_regulator_1v8 = NULL; + struct regulator *touch_regulator_3v3 = NULL; + + tsp_info("[TSP] %s, %d\n", __func__, en ); + + touch_regulator_3v3 = regulator_get(NULL,"vddsim2"); + if (IS_ERR(touch_regulator_3v3)) { + touch_regulator_3v3 = NULL; + tsp_info("get touch_regulator_1v8 regulator error\n"); + return; + } + + touch_regulator_1v8 = regulator_get(NULL,"vdd18"); + + if (IS_ERR(touch_regulator_1v8)) { + touch_regulator_1v8 = NULL; + tsp_info("get touch_regulator_1v8 regulator error\n"); + return; + } + + if(en) { + regulator_set_voltage(touch_regulator_1v8, 1800000, 1800000); + ret = regulator_enable(touch_regulator_1v8); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_1v8 enable failed (%d)\n",__func__, ret); + } + + regulator_set_voltage(touch_regulator_3v3, 3000000, 3000000); + ret = regulator_enable(touch_regulator_3v3); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v0 enable failed (%d)\n",__func__, ret); + } + } + else + { + ret = regulator_disable(touch_regulator_3v3); + if (ret) { + tsp_info(KERN_ERR "%s: touch_regulator_3v0 disable failed (%d)\n",__func__, ret); + } + } +} +#endif +int ist30xx_power_on(void) +{ + if (ts_data->status.power != 1) { + tsp_info("%s()\n", __func__); + /* VDD enable */ + msleep(5); + /* VDDIO enable */ + ts_power_enable(1); + msleep(100); + ts_data->status.power = 1; + } + + return 0; +} + + +int ist30xx_power_off(void) +{ + if (ts_data->status.power != 0) { + tsp_info("%s()\n", __func__); + /* VDDIO disable */ + msleep(5); + + /* VDD disable */ + ts_power_enable(0); + msleep(50); + ts_data->status.power = 0; + ts_data->status.noise_mode = false; + } + + return 0; +} + + +int ist30xx_reset(void) +{ + tsp_info("%s()\n", __func__); + ist30xx_power_off(); + msleep(10); + ist30xx_power_on(); + + ts_data->status.power = 1; + return 0; +} + + +int ist30xx_internal_suspend(struct ist30xx_data *data) +{ + ist30xx_power_off(); + return 0; +} + + +int ist30xx_internal_resume(struct ist30xx_data *data) +{ + ist30xx_power_on(); + ist30xx_write_cmd(data->client, CMD_RUN_DEVICE, 0); + msleep(10); + return 0; +} + + +int ist30xx_init_system(void) +{ + int ret; + + // TODO : place additional code here. +#if 1 + ret = ist30xx_power_on(); + if (ret) { + printk("[TSP] %s: ist30xx_power_on failed (%d)\n", __func__, ret); + return -EIO; + } +#endif + +#if 0 + ret = ist30xx_reset(); + if (ret) { + tsp_err("%s: ist30xx_reset failed (%d)\n", __func__, ret); + return -EIO; + } +#endif + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.c new file mode 100755 index 00000000..706e4cb7 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.c @@ -0,0 +1,205 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include +#include "ist30xxb_update.h" +#include "ist30xxb_misc.h" +#include "ist30xxb_tracking.h" + +#define S_IRWXUGO 0644 + +IST30XX_RING_BUF TrackBuf; +IST30XX_RING_BUF *pTrackBuf; + +void ist30xx_tracking_init(void) +{ + pTrackBuf = &TrackBuf; + + pTrackBuf->RingBufCtr = 0; + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->RingBufOutIdx = 0; +} + +void ist30xx_tracking_deinit(void) +{ +} + +int ist30xx_get_track(u32 *ms, u32 *status) +{ + unsigned long flags; + //spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; + spinlock_t mr_lock = __SPIN_LOCK_UNLOCKED(); + + if (!pTrackBuf->RingBufCtr) + return IST30XX_RINGBUF_EMPTY; + + spin_lock_irqsave(&mr_lock, flags); + + if (pTrackBuf->RingBufOutIdx == IST30XX_RINGBUF_SIZE) + pTrackBuf->RingBufOutIdx = 0; + *ms = pTrackBuf->TimeBuf[pTrackBuf->RingBufOutIdx]; + *status = pTrackBuf->StatusBuf[pTrackBuf->RingBufOutIdx]; + + pTrackBuf->RingBufOutIdx++; + pTrackBuf->RingBufCtr--; + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +int ist30xx_get_track_cnt(void) +{ + return pTrackBuf->RingBufCtr; +} + +#if IST30XX_TRACKING_MODE +int ist30xx_put_track(u32 ms, u32 status) +{ + unsigned long flags; + //spinlock_t mr_lock = SPIN_LOCK_UNLOCKED; + spinlock_t mr_lock = __SPIN_LOCK_UNLOCKED(); + #if PRINT_TSP_LOG + printk("[TSP] %s : %d\n", __func__, __LINE__); + #endif + //spin_lock_irqsave(&mr_lock, flags); + return 0; + pTrackBuf->RingBufCtr++; + + if (pTrackBuf->RingBufCtr > IST30XX_RINGBUF_SIZE) { + pTrackBuf->RingBufCtr = IST30XX_RINGBUF_SIZE; + pTrackBuf->RingBufOutIdx++; + } + if (pTrackBuf->RingBufInIdx == IST30XX_RINGBUF_SIZE) + pTrackBuf->RingBufInIdx = 0; + if (pTrackBuf->RingBufOutIdx == IST30XX_RINGBUF_SIZE) + pTrackBuf->RingBufOutIdx = 0; + pTrackBuf->TimeBuf[pTrackBuf->RingBufInIdx] = ms; + pTrackBuf->StatusBuf[pTrackBuf->RingBufInIdx] = status; + pTrackBuf->RingBufInIdx++; + //spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +static struct timespec t_track; +int ist30xx_tracking(u32 status) +{ + u32 ms; + + ktime_get_ts(&t_track); + ms = t_track.tv_sec * 1000 + t_track.tv_nsec / 1000000; + + return ist30xx_put_track(ms, status); +} +#else +int ist30xx_put_track(u32 ms, u32 status) +{ + return 0; +} +int ist30xx_tracking(u32 status) +{ + return 0; +} +#endif // IST30XX_TRACKING_MODE + +#define MAX_TRACKING_COUNT (300) +struct timespec t_curr; // ns + +/* sysfs: /sys/class/touch/tracking/track_frame */ +ssize_t ist30xx_track_frame_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i, buf_cnt = 0; + int track_cnt = MAX_TRACKING_COUNT; + u32 *buf32 = (u32 *)buf; + u32 ms = 0, status = 0; + finger_info *finger = (finger_info *)&status; + + mutex_lock(&ist30xx_mutex); + + buf[0] = '\0'; + + if (track_cnt > ist30xx_get_track_cnt()) + track_cnt = ist30xx_get_track_cnt(); + + tsp_verb("num: %d of %d\n", track_cnt, ist30xx_get_track_cnt()); + + for (i = 0; i < track_cnt; i++) { + ist30xx_get_track(&ms, &status); + finger = (finger_info *)&status; + + tsp_verb("%08X: %08x\n", ms, status); + *buf32++ = ms; + *buf32++ = status; + + buf_cnt += (sizeof(u32) * 2); + } + + mutex_unlock(&ist30xx_mutex); + + return buf_cnt; +} + +/* sysfs: /sys/class/touch/tracking/track_cnt */ +ssize_t ist30xx_track_cnt_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + u32 *buf32 = (u32 *)buf; + + *buf32 = (u32)ist30xx_get_track_cnt(); + + tsp_verb("cnt: %d\n", *buf32); + + return sizeof(u32); +} + + +/* sysfs */ +static DEVICE_ATTR(track_frame, S_IRWXUGO, ist30xx_track_frame_show, NULL); +static DEVICE_ATTR(track_cnt, S_IRWXUGO, ist30xx_track_cnt_show, NULL); + +static struct attribute *tracking_attributes[] = { + &dev_attr_track_frame.attr, + &dev_attr_track_cnt.attr, + NULL, +}; + +static struct attribute_group tracking_attr_group = { + .attrs = tracking_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_tracking_dev; + +int ist30xx_init_tracking_sysfs(void) +{ + /* /sys/class/touch/tracking */ + ist30xx_tracking_dev = device_create(ist30xx_class, NULL, 0, NULL, "tracking"); + + /* /sys/class/touch/tracking/... */ + if (sysfs_create_group(&ist30xx_tracking_dev->kobj, &tracking_attr_group)) + tsp_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tracking"); + + ist30xx_tracking_init(); + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.h new file mode 100755 index 00000000..7cfbecfc --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_tracking.h @@ -0,0 +1,51 @@ +#ifndef __IST30XX_TRACKING_H__ +#define __IST30XX_TRACKING_H__ + + +#define IST30XX_RINGBUF_NO_ERR (0) +#define IST30XX_RINGBUF_NOT_ENOUGH (1) +#define IST30XX_RINGBUF_EMPTY (2) +#define IST30XX_RINGBUF_FULL (3) +#define IST30XX_RINGBUF_TIMEOUT (4) +#define IST30XX_RINGBUF_SIZE (1024) + +#define TRACK_PWR_OFF (0x0) +#define TRACK_PWR_ON (0x1) +#define TRACK_PWR_RESET (0x3) +#define TRACK_INTR_ENABLE (0x4) +#define TRACK_INTR_DISABLE (0x5) +#define TRACK_CMD_SCAN (0x11) +#define TRACK_CMD_TACON (0x12) +#define TRACK_CMD_TADISCON (0x13) +#define TRACK_CMD_FWUPDATE (0x14) +#define TRACK_CMD_PRUPDATE (0x15) +#define TRACK_CMD_CALIB (0x16) +#define TRACK_CMD_CHKSUM (0x17) +#define TRACK_CMD_CHKSUM_ALL (0x18) +#define TRACK_POS_FINGER (0x20) +#define TRACK_POS_KEY (0x30) +#define TRACK_POS_UNKNOWN (0x3F) + + +typedef struct _IST30XX_RINGBUF { + u16 RingBufCtr; // Number of characters in the ring buffer + u16 RingBufInIdx; + u16 RingBufOutIdx; + u32 TimeBuf[IST30XX_RINGBUF_SIZE]; // Ring buffer for time + u32 StatusBuf[IST30XX_RINGBUF_SIZE]; // Ring buffer for status +} IST30XX_RING_BUF; + + +void ist30xx_tracking_init(void); +void ist30xx_tracking_deinit(void); + +int ist30xx_put_track(u32 ms, u32 status); +int ist30xx_get_track(u32 *ms, u32 *status); + +int ist30xx_get_track_cnt(void); + +int ist30xx_tracking(u32 status); + +int ist30xx_init_tracking_sysfs(void); + +#endif // __IST30XX_TRACKING_H__ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_tsp.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_tsp.h new file mode 100755 index 00000000..132128ae --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_tsp.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_TSP_H__ +#define __IST30XX_TSP_H__ + +#define IST30XX_DD_VERSION (2) + +#define IST30XX_MULTIPLE_TSP (0) + +#define TSP_CHIP_VENDOR ("IMAGIS") +#define TSP_CHIP_NAME ("IST3032B") + +#define IST30XXB_PARSE_TSPTYPE(k) ((k >> 1) & 0xF) + +#define TSP_TYPE_UNKNOWN (0xF0) +#define TSP_TYPE_ALPS (0xF) +#define TSP_TYPE_EELY (0xE) +#define TSP_TYPE_TOP (0xD) +#define TSP_TYPE_DIGITECH (0xC) +#define TSP_TYPE_ILJIN (0xB) +#define TSP_TYPE_SYNOPEX (0xA) +#define TSP_TYPE_SMAC (0x9) +#define TSP_TYPE_TAEYANG (0x8) +#define TSP_TYPE_TOVIS (0x7) +#define TSP_TYPE_ELK (0x6) + +#define FLAG_NODE_Y (0) +#define FLAG_NODE_X (1) + +#define NODE_TX_NUM (18) +#define NODE_RX_NUM (13) +#define NODE_TOTAL_NUM (TSP_TX_NUM * TSP_RX_NUM) + +#define TSP_TX_NUM (18) +#define TSP_RX_NUM (12) +#define TSP_TOTAL_NUM (TSP_TX_NUM * TSP_RX_NUM) + +#define TSP_THRESHOLD (30) +#define TKEY_THRESHOLD (350) + +#endif // __IST30XX_TSP_H__ diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_update.c b/drivers/input/touchscreen/ist30xxb/ist30xxb_update.c new file mode 100644 index 00000000..40b1f6df --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_update.c @@ -0,0 +1,1363 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include +#include "ist30xxb_update.h" + +#if IST30XX_DEBUG +#include "ist30xxb_misc.h" +#endif + +#if IST30XX_INTERNAL_BIN +#if defined(CONFIG_MACH_POCKET2) +#include "IST30xxB_FW_Star2_Ver0002.h" +#elif defined(CONFIG_MACH_YOUNG2) +#include "ist30xxb_fw_young2_ver0001.h" +#elif defined(CONFIG_MACH_PIKEAYOUNG2DTV) +#include "ist30xxb_fw_pikeayoung2dtv_ver0001.h" +#elif defined(CONFIG_MACH_CORSICA_VE) +#include "IST30xxB_FW_Corsica_VE_Ver0007.h" +#elif defined(CONFIG_MACH_VIVALTO) +#include "IST30xxB_FW_vivalto_Ver0001_fw.h" +#endif +#endif // IST30XX_INTERNAL_BIN + +struct ist30xx_tags *ts_tags; + +u32 ist30xx_fw_ver = 0; +u32 ist30xx_param_ver = 0; + +extern struct ist30xx_data *ts_data; + +extern void ist30xx_disable_irq(struct ist30xx_data *data); +extern void ist30xx_enable_irq(struct ist30xx_data *data); + + +int ist30xx_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + int msg_num, u8 *cmd_buf) +{ + int ret = 0; + int idx = msg_num - 1; + int size = msgs[idx].len; + u8 *msg_buf = NULL; + u8 *pbuf = NULL; + int trans_size, max_size = 0; + + if (msg_num == WRITE_CMD_MSG_LEN) + max_size = I2C_MAX_WRITE_SIZE; + else if (msg_num == READ_CMD_MSG_LEN) + max_size = I2C_MAX_READ_SIZE; + + if (max_size == 0) { + tsp_err("%s() : transaction size(%d)\n", __func__, max_size); + return -EINVAL; + } + + if (msg_num == WRITE_CMD_MSG_LEN) { + msg_buf = kmalloc(max_size + IST30XX_ADDR_LEN, GFP_KERNEL); + if (!msg_buf) + return -ENOMEM; + memcpy(msg_buf, cmd_buf, IST30XX_ADDR_LEN); + pbuf = msgs[idx].buf; + } + + while (size > 0) { + trans_size = (size >= max_size ? max_size : size); + + msgs[idx].len = trans_size; + if (msg_num == WRITE_CMD_MSG_LEN) { + memcpy(&msg_buf[IST30XX_ADDR_LEN], pbuf, trans_size); + msgs[idx].buf = msg_buf; + msgs[idx].len += IST30XX_ADDR_LEN; + } + ret = i2c_transfer(adap, msgs, msg_num); + if (ret != msg_num) { + tsp_err("%s() : i2c_transfer failed(%d), num=%d\n", + __func__, ret, msg_num); + break; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + pbuf += trans_size; + else + msgs[idx].buf += trans_size; + + size -= trans_size; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + kfree(msg_buf); + + return ret; +} + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int ret, i; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len * IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = ist30xx_i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN, NULL); + if (ret != READ_CMD_MSG_LEN) + return -EIO; + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int i; + int ret; + struct i2c_msg msg; + u8 cmd_buf[IST30XX_ADDR_LEN]; + u8 msg_buf[IST30XX_DATA_LEN * (len + 1)]; + + put_unaligned_be32(cmd, cmd_buf); + + if (len > 0) { + for (i = 0; i < len; i++) + put_unaligned_be32(buf[i], msg_buf + (i * IST30XX_DATA_LEN)); + } else { + /* then add dummy data(4byte) */ + put_unaligned_be32(0, msg_buf); + len = 1; + } + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_DATA_LEN * len; + msg.buf = msg_buf; + + ret = ist30xx_i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN, cmd_buf); + if (ret != WRITE_CMD_MSG_LEN) + return -EIO; + + return 0; +} + +int ist30xxb_burst_read(struct i2c_client *client, u32 addr, + u32 *buf32, int len) +{ + int ret = 0; + int i; + int max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + + addr |= IST30XXB_BURST_ACCESS; + + for (i = 0; i < len; i += max_len) { + if (len < max_len) max_len = len; + + ret = ist30xx_read_buf(client, addr, buf32, max_len); + if (ret) { + tsp_err("Burst fail, addr: %x\n", __func__, addr); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + } + + return 0; +} + +#define IST30XXB_ISP_READ (1) +#define IST30XXB_ISP_WRITE (2) +#define IST30XXB_ISP_ERASE_ALL (3) +#define IST30XXB_ISP_ERASE_PAGE (4) + +int ist30xxb_isp_enable(bool enable) +{ + int ret = 0; + + if (enable) { + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPISPEN, 0x3); + if (ret) return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_LDOOSC, 0xF4C8); + if (ret) return ret; + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_CLKDIV, 0x3); + if (ret) return ret; + + msleep(5); + } else { + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPISPEN, 0x2); + if (ret) return ret; + + msleep(1); + } + + return 0; +} + +int ist30xxb_isp_mode(int mode) +{ + int ret = 0; + u32 val = 0; + + switch (mode) { + case IST30XXB_ISP_READ: + val = 0x1C0; + break; + case IST30XXB_ISP_WRITE: + val = 0x1A8; + break; + case IST30XXB_ISP_ERASE_ALL: + val = 0x1A7; + break; + case IST30XXB_ISP_ERASE_PAGE: + val = 0x1A3; + break; + default: + tsp_err("ISP fail, unknown mode\n"); + return -EINVAL; + } + + ret = ist30xx_write_cmd(ts_data->client, IST30XXB_REG_EEPMODE, val); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPMODE\n"); + return ret; + } + + return 0; +} + +int ist30xxb_isp_erase(struct i2c_client *client, int mode, u32 addr) +{ + int ret = 0; + u32 val = 0x1A0; + u8 buf[EEPROM_PAGE_SIZE] = { 0, }; + + ret = ist30xxb_isp_mode(mode); + if (ret) return ret; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + val = (EEPROM_PAGE_SIZE / IST30XX_DATA_LEN); + ret = ist30xx_write_buf(client, IST30XXB_REG_EEPWDAT, (u32 *)buf, val); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + msleep(30); + + return 0; +} + +int ist30xxb_isp_write(struct i2c_client *client, u32 addr, + const u32 *buf32, int len) +{ + int ret = 0; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + ret = ist30xx_write_buf(client, IST30XXB_REG_EEPWDAT, (u32 *)buf32, len); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + return 0; +} + +int ist30xxb_isp_read(struct i2c_client *client, u32 addr, + u32 *buf32, int len) +{ + int ret = 0; + int i; + int max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + + for (i = 0; i < len; i += max_len) { + if (len < max_len) max_len = len; + + /* IST30xxB ISP read mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_READ); + if (ret) return ret; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_EEPADDR, addr); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPADDR\n"); + return ret; + } + + ret = ist30xx_read_buf(client, IST30XXB_REG_EEPRDAT, buf32, max_len); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_EEPWDAT\n"); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + } + + return 0; +} + +int ist30xxb_cmd_read_chksum(struct i2c_client *client, + u32 start_addr, u32 end_addr, u32 *chksum) +{ + int ret = 0; + u32 val = (1 << 31); // Chkecksum enable + + val |= start_addr; + val |= (end_addr / IST30XX_DATA_LEN - 1) << 16; + + ret = ist30xx_write_cmd(client, IST30XXB_REG_CHKSMOD, val); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_CHKSMOD (%x)\n", val); + return ret; + } + + msleep(10); + + ret = ist30xx_read_cmd(client, IST30XXB_REG_CHKSDAT, chksum); + if (ret) { + tsp_err("ISP fail, IST30XXB_REG_CHKSDAT (%x)\n", chksum); + return ret; + } + + tsp_verb("chksum: %x (%x~%x)\n", *chksum, start_addr, end_addr); + + return 0; +} + +int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum) +{ + int ret = 0; + u32 start_addr, end_addr; + u32 chksum1 = 0, chksum2 = 0; + + start_addr = 0; + end_addr = ts_data->tags.flag_addr; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, &chksum1); + if (ret) return ret; + + start_addr = ts_data->tags.flag_addr + ts_data->tags.flag_size; + end_addr = ts_data->tags.sensor2_addr + ts_data->tags.sensor2_size; + ret = ist30xxb_cmd_read_chksum(client, start_addr, end_addr, &chksum2); + if (ret) return ret; + + *chksum = chksum1 | (chksum2 << 16); + + tsp_info("Chksum: %x(%x~%x, %x~%x)\n", *chksum, 0, ts_data->tags.flag_addr, + start_addr, end_addr); + + return 0; +} + + +int ist30xxb_isp_fw_read(struct i2c_client *client, u32 *buf32) +{ + int ret = 0; + int i; + + u16 addr = EEPROM_BASE_ADDR; + int len = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + ist30xx_reset(); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + if (ret) return ret; + + for (i = 0; i < IST30XX_EEPROM_SIZE; i += EEPROM_PAGE_SIZE) { + ret = ist30xxb_isp_read(client, addr, buf32, len); + if (ret) goto isp_fw_read_end; + + addr += EEPROM_PAGE_SIZE; + buf32 += len; + } + +isp_fw_read_end: + /* IST30xxB ISP disable */ + ist30xxb_isp_enable(false); + return ret; +} + +int ist30xxb_isp_fw_update(struct i2c_client *client, const u8 *buf, u32 *chksum) +{ + int ret = 0; + int i; + u32 page_cnt = IST30XX_EEPROM_SIZE / EEPROM_PAGE_SIZE; + u16 addr = EEPROM_BASE_ADDR; + int len = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + + ret = ist30xxb_isp_erase(client, IST30XXB_ISP_ERASE_ALL, 0); + if (ret) goto isp_fw_update_end; + + for (i = 0; i < page_cnt; i++) { + /* IST30xxB ISP write mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_WRITE); + if (ret) goto isp_fw_update_end; + + ret = ist30xxb_isp_write(client, addr, (u32 *)buf, len); + if (ret) goto isp_fw_update_end; + + addr += EEPROM_PAGE_SIZE; + buf += EEPROM_PAGE_SIZE; + + msleep(5); + } + + /* IST30xxB ISP disable */ + ret = ist30xxb_isp_enable(false); + if (ret) return ret; + return 0; + +isp_fw_update_end: + ist30xxb_isp_enable(false); + return ret; +} + +int ist30xxb_isp_bootloader(struct i2c_client *client, const u8 *buf) +{ + int ret = 0; + int i; + u16 addr = EEPROM_BASE_ADDR; + u32 page_cnt = (ts_data->fw.index) / EEPROM_PAGE_SIZE; + int buf_cnt = EEPROM_PAGE_SIZE / IST30XX_DATA_LEN; + + tsp_info("*** Bootloader update (0x%x~0x%x) ***\n", + EEPROM_BASE_ADDR, ts_data->fw.index); + + /* IST30xxB ISP enable */ + ret = ist30xxb_isp_enable(true); + + ret = ist30xxb_isp_erase(client, IST30XXB_ISP_ERASE_ALL, 0); + if (ret) goto ist30xxb_isp_bootloader; + + for (i = 0; i < page_cnt; i++) { + /* IST30xxB ISP write mode */ + ret = ist30xxb_isp_mode(IST30XXB_ISP_WRITE); + if (ret) goto ist30xxb_isp_bootloader; + + ret = ist30xxb_isp_write(client, addr, (u32 *)buf, buf_cnt); + if (ret) goto ist30xxb_isp_bootloader; + + addr += EEPROM_PAGE_SIZE; + buf += EEPROM_PAGE_SIZE; + + msleep(5); + } + + /* IST30xxB ISP disable */ + ret = ist30xxb_isp_enable(false); + if (ret) return ret; + return 0; + +ist30xxb_isp_bootloader: + ist30xxb_isp_enable(false); + return ret; +} + + +int ist30xx_fw_write(struct i2c_client *client, const u8 *buf) +{ + int ret; + int len; + u32 *buf32 = (u32 *)(buf + ts_data->fw.index); + u32 size = ts_data->fw.size; + + if (size < 0 || size > IST30XX_EEPROM_SIZE) + return -ENOEXEC; + + while (size > 0) { + len = (size >= EEPROM_PAGE_SIZE ? EEPROM_PAGE_SIZE : size); + + ret = ist30xx_write_buf(client, CMD_ENTER_FW_UPDATE, buf32, (len >> 2)); + if (ret) + return ret; + + buf32 += (len >> 2); + size -= len; + + msleep(5); + } + return 0; +} + + +u32 ist30xx_parse_ver(int flag, const u8 *buf) +{ + u32 ver = 0; + u32 *buf32 = (u32 *)buf; + + if (flag == FLAG_FW) + ver = (u32)buf32[(ts_data->tags.flag_addr + 4) >> 2]; + else if (flag == FLAG_PARAM) + ver = (u32)(buf32[(ts_data->tags.cfg_addr + 4) >> 2] & 0xFFFF); + else + tsp_warn("Parsing ver's flag is not corrent!\n"); + + return ver; +} + + +int calib_ms_delay = WAIT_CALIB_CNT; +int ist30xx_calib_wait(void) +{ + int cnt = calib_ms_delay; + + ts_data->status.calib_msg = 0; + while (cnt-- > 0) { + msleep(100); + + if (ts_data->status.calib_msg) { + tsp_info("Calibration status : %d, Max raw gap : %d - (%08x)\n", + CALIB_TO_STATUS(ts_data->status.calib_msg), + CALIB_TO_GAP(ts_data->status.calib_msg), + ts_data->status.calib_msg); + + if (CALIB_TO_GAP(ts_data->status.calib_msg) < CALIB_THRESHOLD) + return 0; // Calibrate success + else + return -EAGAIN; + } + } + tsp_warn("Calibration time out\n"); + + return -EPERM; +} + +int ist30xx_calibrate(int wait_cnt) +{ + int ret = -ENOEXEC; + + tsp_info("*** Calibrate %ds ***\n", calib_ms_delay / 10); + + ts_data->status.update = 1; + while (wait_cnt--) { + ist30xx_disable_irq(ts_data); + ret = ist30xx_cmd_run_device(ts_data->client); + if (ret) continue; + + ret = ist30xx_cmd_calibrate(ts_data->client); + if (ret) continue; + + ist30xx_enable_irq(ts_data); + ret = ist30xx_calib_wait(); + if (!ret) break; + } + + ist30xx_disable_irq(ts_data); + ist30xx_cmd_run_device(ts_data->client); + + ts_data->status.update = 2; + + ist30xx_enable_irq(ts_data); + + return ret; +} + + +int ist30xx_parse_tags(struct ist30xx_data *data, const u8 *buf, const u32 size) +{ + int ret = -EPERM; + + ts_tags = (struct ist30xx_tags *)(&buf[size - sizeof(struct ist30xx_tags)]); + + if (!strncmp(ts_tags->magic1, IST30XX_TAG_MAGIC, sizeof(ts_tags->magic1)) + && !strncmp(ts_tags->magic2, IST30XX_TAG_MAGIC, sizeof(ts_tags->magic2))) { + data->fw.index = ts_tags->fw_addr; + data->fw.size = ts_tags->flag_addr - ts_tags->fw_addr + + ts_tags->flag_size; + data->fw.chksum = ts_tags->chksum; + data->tags = *ts_tags; + + ret = 0; + } + + tsp_verb("Tagts magic1: %s, magic2: %s\n", + ts_tags->magic1, ts_tags->magic2); + tsp_verb(" fw: %x(%x)\n", ts_tags->fw_addr, ts_tags->fw_size); + tsp_verb(" flag: %x(%x)\n", ts_tags->flag_addr, ts_tags->flag_size); + tsp_verb(" cfg: %x(%x)\n", ts_tags->cfg_addr, ts_tags->cfg_size); + tsp_verb(" sensor1: %x(%x)\n", ts_tags->sensor1_addr, ts_tags->sensor1_size); + tsp_verb(" sensor2: %x(%x)\n", ts_tags->sensor2_addr, ts_tags->sensor2_size); + tsp_verb(" sensor3: %x(%x)\n", ts_tags->sensor3_addr, ts_tags->sensor3_size); + tsp_verb(" chksum: %x\n", ts_tags->chksum); + + return ret; +} + +void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, const u32 size) +{ + int ret; + + ret = ist30xx_parse_tags(data, buf, size); + if (ret != TAGS_PARSE_OK) + tsp_warn("Cannot find tags of F/W, make a tags by 'tagts.exe'\n"); +} + +#if (IST30XX_DEBUG) && (IST30XX_INTERNAL_BIN) +extern TSP_INFO ist30xx_tsp_info; +extern TKEY_INFO ist30xx_tkey_info; +int ist30xx_get_tkey_info(struct ist30xx_data *data) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + TKEY_INFO *tkey = &ist30xx_tkey_info; + u8 *cfg_buf; + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + + tkey->enable = (bool)(cfg_buf[0x14] & 1); + tkey->axis_rx = (bool)((cfg_buf[0x14] >> 1) & 1); + tkey->key_num = (u8)cfg_buf[0x15]; + tkey->ch_num[0] = (u8)cfg_buf[0x16]; + tkey->ch_num[1] = (u8)cfg_buf[0x17]; + tkey->ch_num[2] = (u8)cfg_buf[0x18]; + tkey->ch_num[3] = (u8)cfg_buf[0x19]; + tkey->ch_num[4] = (u8)cfg_buf[0x1A]; + + if (tkey->axis_rx) { + if (tsp->dir.swap_xy) tsp->height -= 1; + else tsp->width -= 1; + } else { + if (tsp->dir.swap_xy) tsp->width -= 1; + else tsp->height -= 1; + } + + return ret; +} + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +int ist30xx_get_tsp_info(struct ist30xx_data *data) +{ + int ret = 0; + TSP_INFO *tsp = &ist30xx_tsp_info; + u8 *cfg_buf, *sensor_buf; + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + sensor_buf = (u8 *)&data->fw.buf[data->tags.sensor1_addr]; + + tsp->finger_num = (u8)cfg_buf[0x0E]; + tsp->dir.swap_xy = (bool)(cfg_buf[0xF] & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (bool)(cfg_buf[0xF] & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (bool)(cfg_buf[0xF] & TSP_INFO_FLIP_Y ? true : false); + + tsp->ch_num.tx = (u8)sensor_buf[0x40]; + tsp->ch_num.rx = (u8)sensor_buf[0x41]; + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + tsp->height = (tsp->dir.swap_xy ? tsp->ch_num.rx : tsp->ch_num.tx); + tsp->width = (tsp->dir.swap_xy ? tsp->ch_num.tx : tsp->ch_num.rx); + + return ret; +} +#endif // (IST30XX_DEBUG) && (IST30XX_INTERNAL_BIN) + + +#define update_next_step(ret) { if (ret) goto end; } +int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, bool mode) +{ + int ret = 0; + u32 chksum = 0; + struct ist30xx_fw *fw = &ts_data->fw; + + tsp_info("*** Firmware update ***\n"); + tsp_info(" core: %x, param: %x, addr: 0x%x ~ 0x%x\n", + ist30xx_fw_ver, ist30xx_param_ver, fw->index, (fw->index + fw->size)); + + ts_data->status.update = 1; + + ist30xx_disable_irq(ts_data); + + ist30xx_reset(); + + if (mode) { /* ISP Mode */ + ret = ist30xxb_isp_fw_update(client, buf, &chksum); + update_next_step(ret); + } else { /* I2C SW Mode */ + ret = ist30xx_cmd_update(client, CMD_ENTER_FW_UPDATE); + update_next_step(ret); + + ret = ist30xx_fw_write(client, buf); + update_next_step(ret); + } + msleep(50); + + buf += IST30XX_EEPROM_SIZE; + size -= IST30XX_EEPROM_SIZE; + + ret = ist30xx_cmd_run_device(client); + update_next_step(ret); + + ret = ist30xx_read_cmd(client, CMD_GET_CHECKSUM, &chksum); + if ((ret) || (chksum != fw->chksum)) + goto end; + + if ((ret) || (chksum != fw->chksum)) + goto end; + + ret = ist30xx_get_ver_info(ts_data); + update_next_step(ret); + +end: + if (ret) { + tsp_warn("Firmware update Fail!, ret=%d\n", ret); + } else if (chksum != fw->chksum) { + tsp_warn("Error CheckSum: %x(%x)\n", chksum, fw->chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + + ts_data->status.update = 2; + + return ret; +} + +int ist30xx_fw_recovery(struct ist30xx_data *data) +{ + int ret = -EPERM; + u8 *fw = data->fw.buf; + int fw_size = data->fw.buf_size; + + ist30xx_get_update_info(data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_fw_update(data->client, fw, fw_size, true); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(data); + + return ret; +} + + +#define fw_update_next_step(ret) { if (ret) { step = 1; goto end; } } +#define param_update_next_step(ret) { if (ret) { step = 2; goto end; } } +int ist30xx_fw_param_update(struct i2c_client *client, const u8 *buf) +{ + int ret = 0; + int step = 0; + u16 len = 0; + int size = IST30XX_EEPROM_SIZE; + u32 chksum = 0, ver = 0; + u32 *param = (u32 *)buf; + struct ist30xx_fw *fw = &ts_data->fw; + + tsp_info("*** FW param update ***\n"); + tsp_info(" core: %x, param: %x, addr: 0x%x ~ 0x%x\n", + ist30xx_fw_ver, ist30xx_param_ver, fw->index, (fw->index + fw->size)); + + ts_data->status.update = 1; + + ist30xx_disable_irq(ts_data); + ist30xx_reset(); + + /* FW update by SW */ + ret = ist30xx_cmd_update(client, CMD_ENTER_FW_UPDATE); + fw_update_next_step(ret); + + ret = ist30xx_fw_write(client, buf); + fw_update_next_step(ret); + + msleep(50); + + param = (u32 *)(buf + (fw->index + fw->size)); + size -= fw->size; + + ret = ist30xx_cmd_run_device(client); + fw_update_next_step(ret); + + ret = ist30xx_read_cmd(client, CMD_GET_CHECKSUM, &chksum); + if ((ret) || (chksum != fw->chksum)) + goto end; + + ret = ist30xx_read_cmd(client, CMD_GET_FW_VER, &ver); + update_next_step(ret); + fw->prev_core_ver = fw->core_ver; + fw->core_ver = ver; + tsp_info("F/W core version : %x\n", fw->core_ver); + + /* update parameters */ + ret = ist30xx_cmd_update(client, CMD_ENTER_UPDATE); + param_update_next_step(ret); + + /* config */ + len = (ts_data->tags.cfg_size >> 2); + ret = ist30xx_write_buf(client, CMD_UPDATE_CONFIG, param, len); + param_update_next_step(ret); + msleep(10); + + param += len; + size -= (len << 2); + + /* sensor */ + len = ((ts_data->tags.sensor1_size + ts_data->tags.sensor2_size) >> 2); + ret = ist30xx_write_buf(client, CMD_UPDATE_SENSOR, param, len); + param_update_next_step(ret); + msleep(10); + + param += len; + size -= (len << 2); + + ret = ist30xx_cmd_update(client, CMD_EXIT_UPDATE); + param_update_next_step(ret); + msleep(120); + + ret = ist30xx_cmd_run_device(client); + update_next_step(ret); + + ret = ist30xx_read_cmd(client, CMD_GET_PARAM_VER, &ver); + update_next_step(ret); + fw->prev_param_ver = fw->param_ver; + fw->param_ver = ver; + tsp_info("Param version : %x\n", fw->param_ver); + +end: + if (ret) { + if (step == 1) + tsp_warn("Firmware update Fail!, ret=%d", ret); + else if (step == 2) + tsp_warn("Parameters update Fail!, ret=%d", ret); + } else if (chksum != fw->chksum) { + tsp_warn("Error CheckSum: %08x(%08x)\n", chksum, fw->chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(ts_data); + ts_data->status.update = 2; + + return ret; +} + + +#if IST30XX_INTERNAL_BIN +int ist30xx_check_fw(struct ist30xx_data *data, const u8 *buf) +{ + int ret; + u32 chksum; + + ret = ist30xx_read_cmd(data->client, CMD_GET_CHECKSUM, &chksum); + if (ret) return ret; + + if (chksum != data->fw.chksum) { + tsp_warn("Checksum compare error %08x(%08x)\n", chksum, data->fw.chksum); + return -EPERM; + } + + return 0; +} + +bool ist30xx_check_valid_vendor(u32 tsp_vendor) +{ + switch (tsp_vendor) { + case TSP_TYPE_ALPS: + case TSP_TYPE_EELY: + case TSP_TYPE_TOP: + case TSP_TYPE_DIGITECH: + case TSP_TYPE_ILJIN: + case TSP_TYPE_SYNOPEX: + case TSP_TYPE_SMAC: + case TSP_TYPE_TAEYANG: + case TSP_TYPE_TOVIS: + case TSP_TYPE_ELK: + return true; + default: + return false; + } + + return false; +} +#if 1 //sinjan.kumar +#if IST30XX_MULTIPLE_TSP +void ist30xx_set_tsp_fw(struct ist30xx_data *data) +{ + char *str; + struct ist30xx_fw *fw = &data->fw; + + switch (data->tsp_type) { + case TSP_TYPE_ILJIN: + str = "ILJIN"; + fw->buf = (u8 *)ist30xxb_fw; + fw->buf_size = sizeof(ist30xxb_fw); + break; + case TSP_TYPE_SYNOPEX: + str = "SYNOPEX"; + fw->buf = (u8 *)ist30xxb_fw1; + fw->buf_size = sizeof(ist30xxb_fw1); + break; + case TSP_TYPE_UNKNOWN: + default: + str = "Unknown"; + tsp_warn("Unknown TSP vendor(0x%x)\n", data->tsp_type); + break; + } + tsp_info("TSP vendor : %s(%x)\n", str, data->tsp_type); + + ist30xx_get_update_info(ts_data, fw->buf, fw->buf_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw->buf); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw->buf); +} +#endif // IST30XX_MULTIPLE_TSP +#endif //sinjan.kumar + +int ist30xx_check_auto_update(struct ist30xx_data *data) +{ +#if 1 //sinjan.kumar + int ret = 0; + int retry = IST30XX_FW_UPDATE_RETRY; + u32 tsp_type = TSP_TYPE_UNKNOWN; //sinjan.kumar + u32 chksum; + bool tsp_check = false; + struct ist30xx_fw *fw = &data->fw; + + while (retry--) { + ret = ist30xx_read_cmd(data->client, + CMD_GET_TSP_PANNEL_TYPE, &tsp_type); + if (ret == 0) { + if (ist30xx_check_valid_vendor(tsp_type) == true) + tsp_check = true; + break; + } + } + + retry = IST30XX_FW_UPDATE_RETRY; + + if (!tsp_check) { + while (retry--) { + /* FW recovery */ + tsp_info("tsp type: %x\n", tsp_type); + ret = ist30xxb_isp_bootloader(data->client, fw->buf); + if (ret == 0) { + ist30xx_reset(); + ret = ist30xx_read_cmd(data->client, + CMD_GET_TSP_PANNEL_TYPE, &tsp_type); + tsp_info("tsp type: %x\n", tsp_type); + if (ret == 0) // recovery OK + if (ist30xx_check_valid_vendor(tsp_type) == true) { + data->tsp_type = tsp_type; +#if IST30XX_MULTIPLE_TSP + ist30xx_set_tsp_fw(data); +#endif + break; + } + } + + if (retry == 0) return 1; /* TSP is not connected */ + } + } + + ist30xx_write_cmd(data->client, CMD_RUN_DEVICE, 0); + msleep(10); + + ist30xx_get_ver_info(data); + + if ((fw->param_ver > 0) && (fw->param_ver < 0xFFFFFFFF) && + ((fw->core_ver & MASK_FW_VER) == IST30XX_FW_VER3)) { + tsp_info("Version compare IC: %x(%x), BIN: %x(%x)\n", + fw->param_ver, fw->core_ver, ist30xx_param_ver, ist30xx_fw_ver); + + /* If FW version is same, check FW checksum */ + if ((fw->core_ver == ist30xx_fw_ver) && + (fw->param_ver == ist30xx_param_ver)) { + ret = ist30xx_read_cmd(data->client, CMD_GET_CHECKSUM, &chksum); + if (ret) goto fw_check_end; + + if ((ret) || (chksum != fw->chksum)) { + tsp_warn("Checksum error, IC: %x, Bin: %x\n", + chksum, fw->chksum); + goto fw_check_end; + } + } + + /* + * fw->core_ver : FW core version in TSP IC + * fw->param_ver : FW version if TSP IC + * ist30xx_fw_ver : FW core version in FW Binary + * ist30xx_fw_ver : FW version in FW Binary + */ + /* If the ver of binary is higher than ver of IC, FW update operate. */ + + if ((fw->core_ver >= ist30xx_fw_ver) && + (fw->param_ver >= ist30xx_param_ver)) + return 0; + } + +fw_check_end: + return -EAGAIN; + #endif return 0; //sinjan.kumar +} + +int ist30xx_auto_bin_update(struct ist30xx_data *data) +{ +#if 1 //sinjan.kumar + int ret = 0; + int retry = IST30XX_FW_UPDATE_RETRY; + struct ist30xx_fw *fw = &data->fw; + + fw->buf = (u8 *)ist30xxb_fw; + fw->buf_size = sizeof(ist30xxb_fw); + +#if IST30XX_MULTIPLE_TSP + ist30xx_set_tsp_fw(data); +#else + ist30xx_get_update_info(data, fw->buf, fw->buf_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw->buf); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw->buf); +#endif + + tsp_info("IC: %x, Binary ver core: %x, param: %x\n", + data->chip_id, ist30xx_fw_ver, ist30xx_param_ver); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_check_auto_update(data); + mutex_unlock(&ist30xx_mutex); + //return 0; + //printk("[TSP] %s : %d\n", __func__, __LINE__); + if (ret >= 0) + return ret; + //printk("[TSP] %s : %d\n", __func__, __LINE__); +update_bin: // TSP is not ready / FW update + tsp_info("Update version. param(core): %x(%x) -> %x(%x)\n", + fw->param_ver, fw->core_ver, ist30xx_param_ver, ist30xx_fw_ver); + //printk("[TSP] %s : %d\n", __func__, __LINE__); + mutex_lock(&ist30xx_mutex); + while (retry--) { + //printk("[TSP] %s : %d\n", __func__, __LINE__); + ret = ist30xx_fw_update(data->client, fw->buf, fw->buf_size, true); + if (!ret) break; + } + mutex_unlock(&ist30xx_mutex); + + if (ret) + return ret; + + if (retry > 0 && ist30xx_check_fw(data, fw->buf)) + goto update_bin; + + ist30xx_calibrate(IST30XX_FW_UPDATE_RETRY); + + return ret; + #endif return 0; //sinjan.kumar +} +#endif // IST30XX_INTERNAL_BIN + + +/* sysfs: /sys/class/touch/firmware/boot */ +ssize_t ist30xx_boot_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) { + ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + if (mode == 3) { + tsp_info("EEPROM all erase test\n"); + ist30xx_disable_irq(ts_data); + mutex_lock(&ist30xx_mutex); + + ist30xxb_isp_enable(true); + ist30xxb_isp_erase(ts_data->client, IST30XXB_ISP_ERASE_ALL, 0); + ist30xxb_isp_enable(false); + + mutex_unlock(&ist30xx_mutex); + ist30xx_enable_irq(ts_data); + } else { + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + + ist30xx_disable_irq(ts_data); + + mutex_lock(&ist30xx_mutex); + ist30xxb_isp_bootloader(ts_data->client, fw); + mutex_unlock(&ist30xx_mutex); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) + release_firmware(request_fw); + } + + return size; +} + +u32 buf32_eeprom[IST30XX_EEPROM_SIZE / IST30XX_DATA_LEN]; +ssize_t ist30xx_fw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i; + u8 *buf8 = (u8 *)buf32_eeprom;; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(ts_data); + + ist30xxb_isp_fw_read(ts_data->client, buf32_eeprom); + for (i = 0; i < IST30XX_EEPROM_SIZE; i += 16) { + tsp_debug("%07x: %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x\n", i, + buf8[i], buf8[i + 1], buf8[i + 2], buf8[i + 3], + buf8[i + 4], buf8[i + 5], buf8[i + 6], buf8[i + 7], + buf8[i + 8], buf8[i + 9], buf8[i + 10], buf8[i + 11], + buf8[i + 12], buf8[i + 13], buf8[i + 14], buf8[i + 15]); + } + + ist30xx_enable_irq(ts_data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} + +/* sysfs: /sys/class/touch/firmware/firmware */ +ssize_t ist30xx_fw_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + bool isp_mode = false; + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) { + ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + isp_mode = (mode == MASK_UPDATE_ISP ? true : false); + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(ts_data->client, fw, fw_size, isp_mode); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(ts_data); + + if (mode == MASK_UPDATE_ISP || mode == MASK_UPDATE_FW) + release_firmware(request_fw); + + return size; +} + +ssize_t ist30xx_fw_status(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count; + + switch (ts_data->status.update) { + case 1: + count = sprintf(buf, "Downloading\n"); + break; + case 2: + count = sprintf(buf, "Update success, ver %x(%x) -> %x(%x), status : %d, gap : %d\n", + ts_data->fw.prev_param_ver, ts_data->fw.prev_core_ver, + ts_data->fw.param_ver, ts_data->fw.core_ver, + CALIB_TO_STATUS(ts_data->status.calib_msg), + CALIB_TO_GAP(ts_data->status.calib_msg)); + break; + default: + count = sprintf(buf, "Pass\n"); + } + + return count; +} + + +/* sysfs: /sys/class/touch/firmware/fwparam */ +ssize_t ist30xx_fwparam_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + int fw_size = 0; + u8 *fw = NULL; + char *tmp; + const struct firmware *request_fw = NULL; + + unsigned long mode = simple_strtoul(buf, &tmp, 10); + + if (mode == MASK_UPDATE_FW) { + ret = request_firmware(&request_fw, IST30XXB_FW_NAME, &ts_data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XXB_FW_NAME); + return size; + } + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + } else { +#if IST30XX_INTERNAL_BIN + fw = ts_data->fw.buf; + fw_size = ts_data->fw.buf_size; +#else + return size; +#endif // IST30XX_INTERNAL_BIN + } + + ist30xx_get_update_info(ts_data, fw, fw_size); + ist30xx_fw_ver = ist30xx_parse_ver(FLAG_FW, fw); + ist30xx_param_ver = ist30xx_parse_ver(FLAG_PARAM, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_param_update(ts_data->client, fw); + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(1); + + ist30xx_init_touch_driver(ts_data); + + if (mode == MASK_UPDATE_FW) + release_firmware(request_fw); + + return size; +} + + +/* sysfs: /sys/class/touch/firmware/viersion */ +ssize_t ist30xx_fw_version(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count; + + count = sprintf(buf, "IST30XX id: 0x%x, f/w core: 0x%x, param ver: 0x%x\n", + ts_data->chip_id, ts_data->fw.core_ver, ts_data->fw.param_ver); + +#if IST30XX_INTERNAL_BIN + { + char msg[128]; + + ist30xx_get_update_info(ts_data, ts_data->fw.buf, ts_data->fw.buf_size); + + count += snprintf(msg, sizeof(msg), + " Header - f/w ver: 0x%x, param ver: 0x%x\r\n", + ist30xx_parse_ver(FLAG_FW, ts_data->fw.buf), + ist30xx_parse_ver(FLAG_PARAM, ts_data->fw.buf)); + strncat(buf, msg, sizeof(msg)); + } +#endif + + return count; +} + + +/* sysfs */ +static DEVICE_ATTR(firmware, 0644, ist30xx_fw_status, ist30xx_fw_store); +static DEVICE_ATTR(fwparam, 0644, NULL, ist30xx_fwparam_store); +static DEVICE_ATTR(boot, 0644, ist30xx_fw_show, ist30xx_boot_store); +static DEVICE_ATTR(version, 0644, ist30xx_fw_version, NULL); + +struct class *ist30xx_class; +struct device *ist30xx_fw_dev; + +static struct attribute *fw_attributes[] = { + &dev_attr_firmware.attr, + &dev_attr_fwparam.attr, + &dev_attr_boot.attr, + &dev_attr_version.attr, + NULL, +}; + +static struct attribute_group fw_attr_group = { + .attrs = fw_attributes, +}; + + +int ist30xx_init_update_sysfs(void) +{ + /* /sys/class/touch */ + ist30xx_class = class_create(THIS_MODULE, "touch"); + + /* /sys/class/touch/firmware */ + ist30xx_fw_dev = device_create(ist30xx_class, NULL, 0, NULL, "firmware"); + + /* /sys/class/touch/firmware/... */ + if (sysfs_create_group(&ist30xx_fw_dev->kobj, &fw_attr_group)) + tsp_err("Failed to create sysfs group(%s)!\n", "firmware"); + + ts_data->status.update = 0; + ts_data->status.calib = 0; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxb/ist30xxb_update.h b/drivers/input/touchscreen/ist30xxb/ist30xxb_update.h new file mode 100755 index 00000000..f9bf28f7 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxb/ist30xxb_update.h @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XX_UPDATE_H__ +#define __IST30XX_UPDATE_H__ + +#include "ist30xxb_tsp.h" + +#define IST30XX_INTERNAL_BIN (1) +#define IST30XX_CHECK_CALIB (0) + +#if IST30XX_INTERNAL_BIN +#define IST30XX_UPDATE_BY_WORKQUEUE (0) +#define IST30XX_UPDATE_DELAY (3 * HZ) +#endif // IST30XX_INTERNAL_BIN + +#define IST30XX_EEPROM_SIZE (0x8000) +#define EEPROM_PAGE_SIZE (64) +#define EEPROM_BASE_ADDR (0) + +#define IST30XXB_ACCESS_ADDR (1 << 31) +#define IST30XXB_BURST_ACCESS (1 << 27) +#define IST30XXB_DA_ADDR(k) (k | IST30XXB_ACCESS_ADDR) + +#define IST30XXB_REG_TSPTYPE IST30XXB_DA_ADDR(0x40002010) + +#define IST30XXB_REG_EEPMODE IST30XXB_DA_ADDR(0x40007000) +#define IST30XXB_REG_EEPADDR IST30XXB_DA_ADDR(0x40007004) +#define IST30XXB_REG_EEPWDAT IST30XXB_DA_ADDR(0x40007008) +#define IST30XXB_REG_EEPRDAT IST30XXB_DA_ADDR(0x4000700C) +#define IST30XXB_REG_EEPISPEN IST30XXB_DA_ADDR(0x40007010) +#define IST30XXB_REG_CHKSMOD IST30XXB_DA_ADDR(0x40007014) +#define IST30XXB_REG_CHKSDAT IST30XXB_DA_ADDR(0x40007038) + +#define IST30XXB_REG_CHIPID IST30XXB_DA_ADDR(0x40000000) +#define IST30XXB_REG_LDOOSC IST30XXB_DA_ADDR(0x40000030) +#define IST30XXB_REG_CLKDIV IST30XXB_DA_ADDR(0x4000004C) + +#define IST30XXB_MEM_ADDR (0x20000000) +#define IST30XXB_MEM_COUNT IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x5F0) +#define IST30XXB_MEM_ALGORITHM IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x34) +#define IST30XXB_MEM_CMD IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x3C) +#define IST30XXB_MEM_FINGERS IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x4) + +#define IST30XX_FW_NAME "ist30xx.fw" +#define IST30XXB_FW_NAME "ist30xxb.fw" + +#define MASK_FW_VER (0xFFFF0000) +#define IST30XX_FW_VER1 (0x00010000) +#define IST30XX_FW_VER2 (0x00020000) +#define IST30XX_FW_VER3 (0x00030000) + +#define IST30XX_FW_UPDATE_RETRY (3) + +#define WAIT_CALIB_CNT (50) +#define CALIB_THRESHOLD (100) + +#define CALIB_TO_GAP(n) ((n >> 16) & 0xFFF) +#define CALIB_TO_STATUS(n) ((n >> 12) & 0xF) + +#define MASK_UPDATE_BIN (1) +#define MASK_UPDATE_FW (1) +#define MASK_UPDATE_ISP (2) +#define MASK_UPDATE_ALL (3) + +#define CHKSUM_FW (1) +#define CHKSUM_ALL (2) + +#define FLAG_FW (1) +#define FLAG_PARAM (2) + +#define TAGS_PARSE_OK (0) + +/* I2C Transaction size */ +#define I2C_MAX_WRITE_SIZE (64) /* bytes */ +#define I2C_MAX_READ_SIZE (8) /* bytes */ + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); + +int ist30xxb_burst_read(struct i2c_client *client, u32 addr, u32 *buf32, int len); + +int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum); + +void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, const u32 size); + +u32 ist30xx_parse_ver(int flag, const u8 *buf); + +int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, bool mode); +int ist30xx_fw_param_update(struct i2c_client *client, const u8 *buf); +int ist30xx_fw_recovery(struct ist30xx_data *data); + +int ist30xx_auto_fw_update(struct ist30xx_data *data); +int ist30xx_auto_param_update(struct ist30xx_data *data); +int ist30xx_auto_bin_update(struct ist30xx_data *data); + +int ist30xx_calibrate(int wait_cnt); +int ist30xx_calib_wait(void); + +int ist30xx_init_update_sysfs(void); + +#endif // __IST30XX_UPDATE_H__ diff --git a/drivers/input/touchscreen/ist30xxc/Makefile b/drivers/input/touchscreen/ist30xxc/Makefile new file mode 100644 index 00000000..ee22adea --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/Makefile @@ -0,0 +1,7 @@ +# +# Makefile for the Imagis touch driver +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_IST30XXC) += ist30xxc.o ist30xxc_misc.o ist30xxc_sys.o ist30xxc_update.o ist30xxc_tracking.o ist30xxc_sec.o ist30xxc_cmcs.o diff --git a/drivers/input/touchscreen/ist30xxc/firmware/coreprimeve3g_fw.h b/drivers/input/touchscreen/ist30xxc/firmware/coreprimeve3g_fw.h new file mode 100644 index 00000000..8233afaa --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/firmware/coreprimeve3g_fw.h @@ -0,0 +1,2134 @@ + +#ifndef __IST30XXC_FW_H__ +#define __IST30XXC_FW_H__ + +// Chip ID : 0x0000032C +// FW Ver : 0x02010000 +// Param Ver : 0x00000001 +// FW Download CRC : 0xFABF8076 +// Normal CRC : 0x5CB04982 + +static unsigned char ist30xxc_fw[] = { + 0x80, 0x00, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0xDC, 0x10, 0x00, 0x80, 0xFC, 0x00, 0x00, 0x80, + 0x04, 0x01, 0x00, 0x80, 0x6C, 0x1B, 0x00, 0x80, 0x1C, 0x1B, 0x00, 0x80, 0x44, 0x1B, 0x00, 0x80, + 0xF4, 0x1A, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0xB0, 0x1B, 0x00, 0x80, + 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x10, 0x00, 0x17, 0x08, 0x80, 0x00, 0x80, 0x2C, 0x80, 0x5C, 0x6F, 0xAB, 0x0B, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, 0x99, 0x67, 0x10, 0x00, 0x91, 0x67, 0x08, 0x70, 0x0F, 0x00, + 0x11, 0x17, 0x0C, 0x70, 0xC0, 0x10, 0x0C, 0x60, 0xC0, 0x10, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, + 0x24, 0x74, 0xF2, 0xFC, 0x08, 0x30, 0x00, 0x80, 0x04, 0x70, 0x0C, 0x40, 0xC0, 0x10, 0x0C, 0x50, + 0xC0, 0x10, 0x2C, 0x30, 0xC0, 0x71, 0x2F, 0x64, 0x07, 0x00, 0xC6, 0x65, 0xB2, 0x07, 0x2F, 0x23, + 0x07, 0x00, 0x30, 0x22, 0x24, 0x74, 0xB1, 0x26, 0xF2, 0xF7, 0x0C, 0x70, 0xC0, 0x10, 0x0C, 0x60, + 0x10, 0x11, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, 0x24, 0x74, 0xF2, 0xFC, 0x2B, 0x0F, 0x00, 0x00, + 0xCB, 0x7A, 0x03, 0x00, 0xB9, 0x20, 0x88, 0x17, 0x04, 0x22, 0xF2, 0x0D, 0xB9, 0x20, 0x88, 0x17, + 0x04, 0x23, 0xF2, 0x09, 0xB9, 0x20, 0x88, 0x17, 0x04, 0x24, 0xF2, 0x05, 0xB9, 0x20, 0x88, 0x17, + 0x04, 0x21, 0xF2, 0x01, 0xB9, 0x10, 0x84, 0x17, 0xB9, 0x30, 0x8C, 0x17, 0x08, 0x30, 0x00, 0x50, + 0xB9, 0x03, 0x00, 0x10, 0xD9, 0x40, 0x90, 0x17, 0xD9, 0x80, 0xA0, 0x17, 0xD9, 0xC0, 0xB0, 0x17, + 0x01, 0x40, 0x01, 0x51, 0xC9, 0x40, 0xC0, 0x17, 0x99, 0x20, 0x80, 0x17, 0x08, 0x20, 0x01, 0x00, + 0xB1, 0x23, 0x98, 0x40, 0x80, 0x17, 0x92, 0xFE, 0x09, 0x00, 0x01, 0x00, 0x04, 0x23, 0xB9, 0x23, + 0x00, 0x10, 0xF2, 0x01, 0x48, 0x40, 0xC0, 0x17, 0x11, 0x15, 0x11, 0x04, 0x58, 0xC0, 0xB0, 0x17, + 0x58, 0x80, 0xA0, 0x17, 0x58, 0x40, 0x90, 0x17, 0x48, 0x20, 0x88, 0x17, 0x38, 0x10, 0x84, 0x17, + 0x61, 0x00, 0x00, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x0B, 0x43, 0x00, 0x00, + 0x4B, 0x49, 0x00, 0x00, 0x6B, 0x4A, 0x00, 0x00, 0x4B, 0x25, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x0B, 0x50, 0x00, 0x00, 0x4B, 0x52, 0x00, 0x00, + 0x8B, 0x51, 0x00, 0x00, 0x0B, 0x53, 0x00, 0x00, 0xEB, 0x54, 0x00, 0x00, 0xAB, 0x55, 0x00, 0x00, + 0xCB, 0x57, 0x00, 0x00, 0xEB, 0x62, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0x4B, 0x58, 0x00, 0x00, 0x4B, 0x5E, 0x00, 0x00, 0x8B, 0x45, + 0x00, 0x00, 0x4B, 0x5D, 0x00, 0x00, 0x04, 0x20, 0x4B, 0x6D, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0x04, 0x2A, 0xD1, 0xC1, 0x6B, 0x40, 0x00, 0x00, + 0x8B, 0x42, 0x00, 0x00, 0xCB, 0x0B, 0x00, 0x00, 0x2B, 0x4F, 0x00, 0x00, 0xAB, 0x0C, 0x00, 0x00, + 0x6B, 0x36, 0x00, 0x00, 0x0B, 0x89, 0x00, 0x00, 0xEB, 0x12, 0x00, 0x00, 0x0B, 0x0E, 0x00, 0x00, + 0x28, 0x20, 0xD8, 0x10, 0x6B, 0x14, 0x00, 0x00, 0x2B, 0x88, 0x00, 0x00, 0x98, 0xC0, 0x03, 0x11, + 0x92, 0xF8, 0x8B, 0x85, 0x00, 0x00, 0x04, 0x21, 0x4B, 0x58, 0x00, 0x00, 0x2B, 0x77, 0x00, 0x00, + 0xAB, 0x7C, 0x00, 0x00, 0x06, 0x2C, 0x4B, 0x58, 0x00, 0x00, 0xCB, 0x84, 0x00, 0x00, 0x0B, 0x86, + 0x00, 0x00, 0x6B, 0x70, 0x00, 0x00, 0xF2, 0xE5, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x04, 0x30, + 0xB9, 0x37, 0x08, 0x30, 0xB9, 0x47, 0x00, 0x30, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x01, 0x11, + 0x82, 0x08, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x00, 0x30, 0x64, 0x71, 0xB9, 0x76, 0x00, 0x30, + 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x01, 0x11, 0x82, 0x09, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, + 0x00, 0x30, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x00, 0x30, 0xE1, 0xF0, 0x98, 0x70, 0x01, 0x11, + 0x82, 0x05, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x08, 0x30, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x28, 0x00, 0xD4, 0x74, 0x92, 0xFD, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x40, 0x01, 0x23, 0x77, 0xB9, 0x76, 0x40, 0x01, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x30, + 0x38, 0x27, 0x40, 0x01, 0xF7, 0x2F, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0x15, 0x00, 0x00, + 0x04, 0x70, 0xC6, 0x27, 0x82, 0x0D, 0xEB, 0x14, 0x00, 0x00, 0x08, 0x70, 0x00, 0x30, 0x08, 0x60, + 0x00, 0x80, 0xB9, 0x67, 0x40, 0x01, 0x38, 0x77, 0x3C, 0x01, 0xB9, 0x70, 0xC4, 0x10, 0x30, 0xF1, + 0x06, 0x27, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xE2, 0x77, 0xE8, 0xCC, 0xE0, 0x14, 0x00, 0x0C, 0xD0, 0xFF, 0xFF, 0xB1, 0xB1, 0x56, 0xD2, + 0x82, 0x45, 0xCC, 0xE0, 0x14, 0x00, 0xD2, 0x18, 0xCC, 0xE0, 0x10, 0x00, 0x82, 0x36, 0xCC, 0xE0, + 0x10, 0x00, 0xD2, 0x08, 0xC4, 0xE1, 0x82, 0x2E, 0xC4, 0xE2, 0x92, 0x4A, 0x99, 0xD0, 0x03, 0x11, + 0xF2, 0x65, 0xCC, 0xE0, 0x12, 0x00, 0x82, 0x2C, 0xCC, 0xE0, 0x12, 0x00, 0xD2, 0x2C, 0x99, 0xD0, + 0x01, 0x11, 0xFA, 0x8D, 0x00, 0x00, 0xCC, 0xE0, 0x22, 0x00, 0x82, 0x31, 0xCC, 0xE0, 0x22, 0x00, + 0xD2, 0x0D, 0xCC, 0xE0, 0x20, 0x00, 0x82, 0x25, 0xCC, 0xE0, 0x20, 0x00, 0xD2, 0x25, 0xCC, 0xE0, + 0x15, 0x00, 0x92, 0x2E, 0x99, 0xD0, 0xFD, 0x10, 0xF2, 0x7A, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x25, + 0xCC, 0xE0, 0x81, 0x00, 0x82, 0x1F, 0xCC, 0xE0, 0x23, 0x00, 0x92, 0x22, 0xA9, 0xD0, 0xF2, 0x10, + 0xF2, 0x6E, 0x99, 0xE0, 0x04, 0x11, 0xF2, 0x6B, 0x99, 0xD0, 0x02, 0x11, 0xF2, 0x68, 0x99, 0xD0, + 0x00, 0x11, 0xF2, 0x65, 0x99, 0xD0, 0xFF, 0x10, 0xF2, 0x62, 0x99, 0xD0, 0xFE, 0x10, 0xF2, 0x5F, + 0xA9, 0xD0, 0xF6, 0x10, 0xF2, 0x5C, 0xA9, 0xD0, 0xF8, 0x10, 0xF2, 0x59, 0xA9, 0xD0, 0xF4, 0x10, + 0xF2, 0x56, 0x99, 0xD0, 0xFB, 0x10, 0xF2, 0x53, 0x99, 0xD0, 0xFA, 0x10, 0xF2, 0x4E, 0xCC, 0xE0, + 0x32, 0x00, 0xD2, 0x18, 0xCC, 0xE0, 0x31, 0x00, 0xB2, 0x2E, 0xC4, 0xE2, 0x82, 0x17, 0xCC, 0xE0, + 0x30, 0x00, 0x92, 0x45, 0xAB, 0x13, 0x00, 0x00, 0x04, 0x20, 0x4B, 0xD6, 0x00, 0x00, 0x0C, 0xB0, + 0x40, 0x01, 0x08, 0xE0, 0x00, 0x30, 0x08, 0xD0, 0x30, 0x00, 0x06, 0xCE, 0x26, 0xBE, 0x24, 0xD1, + 0xF2, 0x31, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x31, 0xF2, 0x32, 0x8B, 0xC7, 0x00, 0x00, 0xC4, 0xD0, + 0x08, 0xE0, 0x00, 0x40, 0x82, 0x09, 0xAB, 0x13, 0x00, 0x00, 0x38, 0x7E, 0x54, 0x10, 0xB9, 0x70, + 0xC0, 0x10, 0x14, 0x71, 0xF2, 0x05, 0xEB, 0x12, 0x00, 0x00, 0x38, 0x70, 0xC0, 0x10, 0xB9, 0x7E, + 0x54, 0x10, 0xF2, 0x1D, 0xAB, 0x13, 0x00, 0x00, 0x04, 0x20, 0x4B, 0xD6, 0x00, 0x00, 0x06, 0x2E, + 0x8B, 0x05, 0x01, 0x00, 0xF2, 0x14, 0xB8, 0x7E, 0x40, 0x01, 0x32, 0xFE, 0x38, 0x7E, 0x28, 0x00, + 0xD4, 0x74, 0x92, 0xFD, 0xB1, 0x6B, 0x38, 0x7C, 0x3C, 0x01, 0xC6, 0x7D, 0x92, 0xF5, 0x04, 0x74, + 0xF1, 0x70, 0x08, 0x60, 0x00, 0x80, 0xF2, 0xF0, 0xEB, 0x5F, 0x00, 0x00, 0x58, 0xC1, 0x04, 0x00, + 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0xE0, + 0x00, 0x30, 0x0C, 0xD0, 0x00, 0x01, 0x26, 0xDE, 0xEB, 0x14, 0x00, 0x00, 0x06, 0x2D, 0x0C, 0x30, + 0x40, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x72, 0x82, 0x05, + 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF1, 0x38, 0x7E, 0x40, 0x01, 0xB9, 0x7E, 0x40, 0x01, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0x0C, 0x20, 0x00, 0x00, 0x0C, 0x30, + 0x80, 0x00, 0xC1, 0xE1, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x2E, 0x0C, 0x20, 0x00, 0x17, + 0x0C, 0x30, 0x80, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, + 0x00, 0x82, 0x38, 0x67, 0xF8, 0x01, 0x0C, 0xE0, 0x00, 0x17, 0xB9, 0x60, 0x00, 0x00, 0x38, 0x67, + 0xFC, 0x01, 0xB9, 0x60, 0x04, 0x00, 0x08, 0x60, 0x00, 0x80, 0x38, 0x66, 0x04, 0x78, 0xB9, 0x60, + 0x08, 0x00, 0x38, 0x67, 0xF0, 0x01, 0xB9, 0x60, 0x0C, 0x00, 0x38, 0x67, 0xF4, 0x01, 0x38, 0x77, + 0xCC, 0x01, 0xB9, 0x60, 0x10, 0x00, 0xB9, 0x70, 0x1C, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x77, + 0x10, 0x20, 0xB9, 0xE0, 0x70, 0x00, 0x08, 0x60, 0x00, 0x80, 0xF7, 0x70, 0xB9, 0x70, 0x20, 0x00, + 0x08, 0x70, 0xE0, 0x01, 0x2C, 0x70, 0x20, 0x03, 0xB9, 0x70, 0x40, 0x00, 0x08, 0x70, 0x0D, 0x00, + 0x2C, 0x70, 0x12, 0x00, 0xB9, 0x70, 0x44, 0x00, 0x08, 0x70, 0x02, 0x01, 0x2C, 0x70, 0x11, 0x0B, + 0xB9, 0x70, 0x48, 0x00, 0x08, 0x70, 0x11, 0x0C, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x70, 0x4C, 0x00, + 0x14, 0x71, 0xB9, 0x70, 0x50, 0x00, 0x08, 0x70, 0x0B, 0x00, 0x2C, 0x70, 0x11, 0x00, 0xB9, 0x70, + 0x54, 0x00, 0x08, 0x70, 0xFF, 0x00, 0x2C, 0x70, 0x00, 0xFF, 0xB9, 0x70, 0x58, 0x00, 0x04, 0x78, + 0xB9, 0x70, 0x60, 0x00, 0x08, 0x70, 0x98, 0x08, 0x2C, 0x70, 0x98, 0x08, 0x2C, 0x60, 0x5C, 0x7A, + 0xB9, 0x70, 0x64, 0x00, 0x28, 0x76, 0x28, 0x00, 0x28, 0x66, 0x22, 0x00, 0xB9, 0x00, 0x5C, 0x00, + 0x57, 0x78, 0x66, 0x76, 0xB9, 0x70, 0x68, 0x00, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0x00, 0x42, + 0xB9, 0x70, 0x74, 0x00, 0x0C, 0x70, 0x80, 0x08, 0xB9, 0x70, 0x78, 0x00, 0x4B, 0x23, 0x00, 0x00, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, + 0x80, 0x08, 0x18, 0x6E, 0x0A, 0x08, 0x04, 0x70, 0xC6, 0x67, 0x06, 0xD2, 0x82, 0x19, 0x0C, 0xF0, + 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0xD8, 0x07, 0x0C, 0x50, 0x08, 0x08, 0xB1, 0x7D, 0x0C, 0x70, + 0x5C, 0x10, 0x26, 0x5E, 0x04, 0x61, 0xB0, 0x37, 0x82, 0x06, 0x06, 0x46, 0x57, 0x41, 0x26, 0x4D, + 0xB1, 0x34, 0x24, 0x61, 0x24, 0x74, 0xC6, 0x75, 0x92, 0xF7, 0x18, 0x7E, 0x0A, 0x08, 0x50, 0xC1, + 0x06, 0x27, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0x06, 0x67, 0x3F, 0x57, 0x03, 0x00, + 0xC4, 0x50, 0x02, 0x08, 0x2F, 0x57, 0x02, 0x00, 0x10, 0x55, 0x24, 0x71, 0x26, 0x65, 0x13, 0x66, + 0xF2, 0xF6, 0x06, 0x26, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x30, 0xE2, + 0x08, 0x70, 0xFF, 0x00, 0x2C, 0x70, 0xFF, 0xFF, 0x56, 0xE7, 0x6C, 0xE0, 0x00, 0x0C, 0xB1, 0xE2, + 0x57, 0x31, 0x06, 0xD2, 0x4B, 0x30, 0x00, 0x00, 0x57, 0x2C, 0x66, 0x2E, 0xB1, 0x2D, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x54, 0x00, 0x06, 0x21, 0x0C, 0x30, + 0x40, 0x00, 0xD9, 0xC1, 0x44, 0x00, 0xCB, 0x2D, 0x00, 0x00, 0x86, 0xD2, 0x82, 0x29, 0x06, 0x21, + 0x06, 0x3D, 0x4B, 0x31, 0x00, 0x00, 0x98, 0x70, 0xFC, 0x10, 0x82, 0x0A, 0x0C, 0x20, 0x40, 0x00, + 0x26, 0x21, 0x0C, 0x30, 0x00, 0x17, 0x99, 0x01, 0x40, 0x00, 0x4B, 0x37, 0x00, 0x00, 0x08, 0xE0, + 0x00, 0x30, 0x0C, 0xC0, 0x04, 0x01, 0x26, 0xCE, 0xEB, 0x14, 0x00, 0x00, 0x06, 0x2C, 0x06, 0x31, + 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x72, + 0x82, 0x05, 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF0, 0x6B, 0x15, 0x00, 0x00, 0x06, 0x2D, + 0x58, 0xC1, 0x44, 0x00, 0x2C, 0x10, 0x54, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x50, 0x00, 0x00, + 0x0C, 0x70, 0x78, 0x00, 0x34, 0x54, 0x04, 0x60, 0x30, 0x47, 0x34, 0x74, 0xC6, 0x75, 0x26, 0x64, + 0x92, 0xFC, 0xB9, 0x60, 0x7C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0xD1, 0x81, 0x0C, 0x70, 0x80, 0x08, 0x98, 0xD7, 0x83, 0x07, 0x06, 0xC2, 0x06, 0xE3, 0x06, 0xB7, + 0x92, 0x3E, 0x0C, 0x80, 0x6B, 0x0C, 0x06, 0xA7, 0x0C, 0x90, 0x80, 0x02, 0x18, 0x7B, 0x01, 0x04, + 0xC6, 0x7D, 0xC2, 0x03, 0xC4, 0xD8, 0x92, 0x03, 0x91, 0xDC, 0xF2, 0x5A, 0x60, 0x78, 0x0C, 0x30, + 0x64, 0x00, 0x34, 0x71, 0x57, 0x72, 0x26, 0x7A, 0x18, 0x67, 0x89, 0x02, 0x18, 0x77, 0x88, 0x02, + 0x2F, 0x56, 0x06, 0x00, 0x26, 0x56, 0x57, 0x51, 0x26, 0x65, 0x26, 0x67, 0x13, 0x66, 0x26, 0x66, + 0x26, 0x69, 0x70, 0x26, 0x26, 0x22, 0x06, 0x72, 0x57, 0x72, 0x3F, 0x22, 0x07, 0x00, 0xAB, 0x8F, + 0x00, 0x00, 0x0C, 0x70, 0x90, 0x01, 0x26, 0x72, 0xCC, 0x70, 0x58, 0x02, 0xD2, 0x03, 0xB1, 0x7E, + 0xF2, 0x09, 0x3C, 0x20, 0xC8, 0x00, 0x04, 0x33, 0xAB, 0x8F, 0x00, 0x00, 0x2C, 0x20, 0x58, 0x02, + 0xB1, 0x2E, 0x24, 0xD1, 0x24, 0xE4, 0x13, 0xDD, 0x24, 0x81, 0xF2, 0xC9, 0x28, 0x27, 0x0C, 0x00, + 0x1C, 0x60, 0xA5, 0x01, 0x26, 0x62, 0xCC, 0x60, 0xE8, 0x03, 0xD2, 0x17, 0x0C, 0xB0, 0x8D, 0x05, + 0x3F, 0xD2, 0x0B, 0x00, 0x06, 0x3D, 0x06, 0x2D, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0xE9, 0x03, + 0xAB, 0x8F, 0x00, 0x00, 0x06, 0x3D, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0xE9, 0x03, 0xAB, 0x8F, + 0x00, 0x00, 0x3F, 0x22, 0x0B, 0x00, 0xF2, 0x09, 0xCC, 0x20, 0x8D, 0x05, 0xC2, 0x06, 0x3C, 0x20, + 0x8D, 0x05, 0x77, 0x21, 0x2C, 0x20, 0x8D, 0x05, 0x04, 0x61, 0x91, 0x6C, 0xB1, 0x2E, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x04, 0x20, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, + 0x64, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x06, 0x01, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, + 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x1C, 0x26, 0x22, + 0xC9, 0xE1, 0x04, 0x00, 0x06, 0xE2, 0xB1, 0x01, 0x57, 0xE1, 0xB1, 0x01, 0x26, 0xE2, 0x30, 0x71, + 0xC6, 0x7E, 0xB2, 0x07, 0xAB, 0x3F, 0x00, 0x00, 0x30, 0x71, 0x24, 0x71, 0xB1, 0x71, 0xF2, 0xF8, + 0x48, 0xE1, 0x04, 0x00, 0x24, 0x1C, 0xE1, 0xF0, 0xF7, 0x40, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x07, + 0x2F, 0x67, 0x07, 0x00, 0x26, 0x62, 0xA1, 0x36, 0x24, 0x71, 0xF2, 0xF9, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0x2B, 0xC8, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x2C, 0x60, 0x80, 0x00, 0x2C, 0x70, 0xCC, 0x01, + 0x36, 0x76, 0xC4, 0x70, 0x34, 0x14, 0xB1, 0xF1, 0x32, 0x02, 0x24, 0x73, 0x06, 0x47, 0x08, 0x50, + 0x00, 0x80, 0x67, 0x41, 0x04, 0x70, 0x2C, 0x50, 0x5C, 0x6F, 0x14, 0x21, 0xC6, 0x74, 0x04, 0x34, + 0x26, 0x36, 0x32, 0x05, 0x30, 0xF5, 0x24, 0x54, 0xB1, 0xF6, 0xF2, 0x02, 0xB1, 0x26, 0x24, 0x71, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x03, 0x06, 0x63, 0xF2, 0xF2, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x28, 0x60, 0xF6, 0x10, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xE0, 0x2E, 0xA9, 0x60, + 0xF6, 0x10, 0x28, 0x60, 0xF8, 0x10, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0x80, 0x3E, + 0xA9, 0x60, 0xF8, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x40, 0x00, 0x80, 0x34, 0x14, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x40, 0x0C, 0x78, 0xB1, 0xF1, 0x2C, 0x70, 0x42, 0x78, 0x0C, 0x50, 0xF0, 0x10, + 0x2C, 0x40, 0x31, 0x00, 0x14, 0xF1, 0x10, 0x67, 0xCC, 0x60, 0xFF, 0x00, 0x82, 0x0E, 0x18, 0x27, + 0x05, 0x00, 0xCC, 0x20, 0xFF, 0x00, 0x82, 0x09, 0x2F, 0x36, 0x06, 0x00, 0x26, 0x36, 0x57, 0x31, + 0x26, 0x63, 0x26, 0x26, 0xA1, 0x25, 0xF2, 0x02, 0xA1, 0xF5, 0x34, 0x71, 0xC6, 0x74, 0x34, 0x52, + 0x92, 0xEB, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x80, 0x08, 0x04, 0x30, + 0x0C, 0x40, 0x40, 0x08, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0xCB, 0x46, 0x00, 0x00, + 0xAB, 0x1A, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0xF4, 0x01, + 0xB9, 0x60, 0xD8, 0x10, 0x99, 0x00, 0x0D, 0x11, 0x14, 0x61, 0x99, 0x60, 0x0C, 0x11, 0xB9, 0x00, + 0xD4, 0x10, 0xB9, 0x00, 0xD0, 0x10, 0x99, 0x00, 0x0B, 0x11, 0xB9, 0x00, 0xCC, 0x10, 0xB9, 0x00, + 0xC8, 0x10, 0x99, 0x00, 0x0A, 0x11, 0x04, 0x63, 0x99, 0x60, 0x09, 0x11, 0x99, 0x00, 0x04, 0x11, + 0x99, 0x00, 0x03, 0x11, 0x04, 0x71, 0x99, 0x70, 0x02, 0x11, 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, + 0x00, 0x78, 0x18, 0x46, 0x09, 0x00, 0x99, 0x40, 0x01, 0x11, 0x99, 0x00, 0x00, 0x11, 0x99, 0x70, + 0xFF, 0x10, 0x99, 0x00, 0xFE, 0x10, 0x14, 0x51, 0xA9, 0x50, 0xF8, 0x10, 0xA9, 0x50, 0xF6, 0x10, + 0x18, 0x56, 0x0A, 0x00, 0x99, 0x50, 0xFD, 0x10, 0xA9, 0x00, 0xF4, 0x10, 0xA9, 0x00, 0xF2, 0x10, + 0x99, 0x00, 0xFC, 0x10, 0x99, 0x00, 0xFB, 0x10, 0x99, 0x00, 0xFA, 0x10, 0x99, 0x70, 0x08, 0x11, + 0x99, 0x00, 0x07, 0x11, 0x99, 0x70, 0x06, 0x11, 0x99, 0x00, 0x05, 0x11, 0xB9, 0x00, 0xFC, 0x17, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x2B, 0xB3, 0x00, 0x00, 0x0C, 0x60, 0x15, 0x00, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x04, 0x70, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x6B, 0xD1, 0x00, 0x00, 0x04, 0x31, 0x0C, 0x20, 0x20, 0x00, 0x0B, 0xD0, + 0x00, 0x00, 0x0C, 0x20, 0xFF, 0x00, 0xCB, 0xCD, 0x00, 0x00, 0x04, 0x24, 0x04, 0x31, 0x8B, 0xCA, + 0x00, 0x00, 0x04, 0x21, 0x6B, 0xC7, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0xC8, 0x00, 0x00, 0x04, 0x20, 0x0B, 0xD5, 0x00, 0x00, 0xAB, 0xC6, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xAB, 0xD2, + 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x2B, 0xD2, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xC0, 0xD8, 0x10, 0x08, 0xE0, 0x00, 0x40, 0x0C, 0x20, + 0x40, 0x00, 0x38, 0xDE, 0x54, 0x10, 0xEB, 0xCB, 0x00, 0x00, 0x06, 0x3C, 0x0C, 0x20, 0xFF, 0xFF, + 0x04, 0x4A, 0x4B, 0x12, 0x00, 0x00, 0x04, 0x28, 0xB9, 0xDE, 0x54, 0x10, 0x04, 0x30, 0xEB, 0xD6, + 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x2B, 0xD3, 0x00, 0x00, 0x04, 0x25, 0x04, 0x31, 0xEB, 0xD6, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x00, 0x01, 0xB1, 0xF1, 0xEB, 0xCB, 0x00, 0x00, + 0x0C, 0x20, 0x80, 0x00, 0xEB, 0xCB, 0x00, 0x00, 0x04, 0x20, 0x06, 0x52, 0x0C, 0x30, 0x27, 0x00, + 0x0C, 0x40, 0xFF, 0xFF, 0x0C, 0x60, 0x01, 0x02, 0x0B, 0xDF, 0x00, 0x00, 0x04, 0x21, 0x0C, 0x30, + 0x8F, 0x01, 0x0C, 0x40, 0xFF, 0xFF, 0x04, 0x50, 0x0C, 0x60, 0x01, 0x02, 0x0B, 0xDF, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0x4B, 0xD6, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x09, + 0x0C, 0x20, 0x00, 0x60, 0xEB, 0xCB, 0x00, 0x00, 0x04, 0x21, 0x2B, 0xAD, 0x00, 0x00, 0xF2, 0x07, + 0x2B, 0xAD, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x60, 0xCB, 0xCC, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0xD0, 0x00, 0x40, 0x38, 0xED, + 0x70, 0x60, 0x06, 0xC3, 0x23, 0xEE, 0x06, 0x3E, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0xA0, 0x0F, + 0xAB, 0x8F, 0x00, 0x00, 0x24, 0x25, 0x04, 0x3A, 0xAB, 0x8F, 0x00, 0x00, 0x38, 0x7D, 0x78, 0x71, + 0x06, 0xD2, 0x77, 0x7C, 0x24, 0x72, 0xC6, 0x27, 0xB2, 0x02, 0x06, 0xD7, 0xC4, 0xC0, 0x82, 0x18, + 0x06, 0x7E, 0xD7, 0x71, 0x2F, 0x2E, 0x0E, 0x00, 0x26, 0x27, 0x06, 0x3D, 0xAB, 0x8F, 0x00, 0x00, + 0x3C, 0xE0, 0xB0, 0x9A, 0xCC, 0xE0, 0x20, 0x03, 0x04, 0x71, 0xD2, 0x02, 0x04, 0x70, 0xD7, 0x7F, + 0x66, 0x72, 0x0C, 0x60, 0x00, 0x00, 0xB9, 0x76, 0x3C, 0x00, 0x6B, 0x36, 0x00, 0x00, 0x06, 0x2D, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x38, 0x70, 0xE4, 0x10, 0x34, 0x14, 0xB1, 0xF1, + 0x18, 0x27, 0x08, 0x00, 0x04, 0x31, 0xAB, 0x59, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, + 0x18, 0x70, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x28, 0x20, 0xF4, 0x10, 0x34, 0x18, 0xD4, 0x21, + 0xC1, 0xE1, 0x82, 0x0A, 0x04, 0x21, 0xAB, 0xBC, 0x02, 0x00, 0x18, 0x60, 0x09, 0x11, 0x1C, 0x70, + 0x80, 0x00, 0x66, 0x76, 0xF2, 0x07, 0xAB, 0xBC, 0x02, 0x00, 0x18, 0x70, 0x09, 0x11, 0x5C, 0x70, + 0x7F, 0x00, 0x99, 0x70, 0x09, 0x11, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, + 0xB1, 0xF1, 0x0B, 0xD5, 0x00, 0x00, 0x98, 0x70, 0xFA, 0x10, 0x82, 0x25, 0x5C, 0x70, 0xF0, 0x00, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x0A, 0xCC, 0x70, 0xC0, 0x00, 0x82, 0x1A, 0xCC, 0x70, 0x40, 0x00, + 0x92, 0x1A, 0x99, 0x00, 0x01, 0x11, 0xF2, 0x17, 0x04, 0x71, 0x99, 0x70, 0xFC, 0x10, 0x99, 0x70, + 0xFE, 0x10, 0x99, 0x00, 0xFF, 0x10, 0x04, 0x20, 0x99, 0x70, 0xFB, 0x10, 0xAB, 0xBC, 0x02, 0x00, + 0x18, 0x60, 0x09, 0x11, 0x5C, 0x60, 0x7F, 0x00, 0x99, 0x60, 0x09, 0x11, 0xF2, 0x04, 0x04, 0x61, + 0x99, 0x60, 0xFC, 0x10, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, + 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, 0x00, 0x80, 0x2C, 0x40, 0x98, 0x03, + 0x3C, 0x10, 0x10, 0x00, 0x36, 0x42, 0x2C, 0x30, 0xA8, 0x70, 0xD1, 0xC1, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x30, 0x00, 0x84, 0x04, 0x20, 0x0C, 0xF0, 0x3C, 0x03, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x00, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x2E, 0x18, 0x00, 0x2C, 0x30, 0x00, 0x80, 0x04, 0x20, + 0x0C, 0xF0, 0x3C, 0x03, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x38, 0xC7, 0xD0, 0x83, 0xB9, 0x2E, + 0x14, 0x00, 0x06, 0xD2, 0xCC, 0xC0, 0xFF, 0x00, 0x82, 0x1B, 0xC6, 0xC2, 0x82, 0x19, 0xEB, 0x14, + 0x00, 0x00, 0x08, 0x60, 0x1C, 0xE1, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x60, 0x01, 0xE9, 0xB9, 0x67, + 0x04, 0x01, 0xB9, 0xC7, 0x08, 0x01, 0xB9, 0xD7, 0x0C, 0x01, 0x38, 0x6E, 0x18, 0x00, 0xB9, 0x67, + 0x10, 0x01, 0xEB, 0xD5, 0x00, 0x00, 0x04, 0x2A, 0x6B, 0x40, 0x00, 0x00, 0xF2, 0xFB, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x60, 0x06, 0x11, 0x34, 0x14, 0xB1, 0xF1, + 0x82, 0x09, 0x34, 0x61, 0x93, 0x66, 0x99, 0x60, 0x06, 0x11, 0x92, 0x36, 0x99, 0x00, 0x08, 0x11, + 0xF2, 0x33, 0xAB, 0xB2, 0x00, 0x00, 0xCC, 0x20, 0x1B, 0x00, 0xC2, 0x0A, 0x38, 0x50, 0xD0, 0x10, + 0x18, 0x60, 0x07, 0x11, 0x34, 0x53, 0xC6, 0x65, 0xB2, 0x17, 0x24, 0x61, 0xF2, 0x13, 0x98, 0x60, + 0x07, 0x11, 0x82, 0x12, 0x98, 0x50, 0x0D, 0x11, 0x82, 0x04, 0xB8, 0x50, 0xD4, 0x10, 0x92, 0x0C, + 0xCC, 0x20, 0x18, 0x00, 0xD2, 0x09, 0x18, 0x50, 0x05, 0x11, 0xCC, 0x50, 0x14, 0x00, 0xD2, 0x04, + 0x34, 0x61, 0x99, 0x60, 0x07, 0x11, 0x98, 0x50, 0x08, 0x11, 0x92, 0x09, 0x18, 0x70, 0x07, 0x11, + 0xC4, 0x7E, 0xC2, 0x0A, 0x04, 0x71, 0x99, 0x70, 0x08, 0x11, 0xF2, 0x06, 0x98, 0x70, 0x07, 0x11, + 0x92, 0x03, 0x99, 0x00, 0x08, 0x11, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, + 0x06, 0xE2, 0x0B, 0xC3, 0x00, 0x00, 0x06, 0x2E, 0x6B, 0xBD, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, + 0xE1, 0xF0, 0x00, 0x00, 0x04, 0x20, 0x34, 0x14, 0x06, 0x32, 0xB1, 0xF1, 0xEB, 0x09, 0x01, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD2, + 0x18, 0x20, 0x09, 0x11, 0x5C, 0x20, 0xF0, 0x00, 0x64, 0x23, 0x99, 0x20, 0x09, 0x11, 0xAB, 0xB6, + 0x00, 0x00, 0x0B, 0xB1, 0x00, 0x00, 0xC4, 0xD0, 0x92, 0x06, 0x8B, 0xB0, 0x00, 0x00, 0x04, 0x24, + 0x0B, 0xE9, 0x00, 0x00, 0x2B, 0x12, 0x01, 0x00, 0x0C, 0xE0, 0x15, 0x00, 0xB4, 0xE1, 0x82, 0x0D, + 0x04, 0x21, 0xCB, 0xAF, 0x00, 0x00, 0x04, 0x21, 0xCB, 0xAE, 0x00, 0x00, 0xC4, 0xD0, 0x82, 0xF7, + 0xEB, 0x15, 0x00, 0x00, 0xC4, 0x20, 0x82, 0xF3, 0x8B, 0xB1, 0x00, 0x00, 0x50, 0xC1, 0x04, 0x61, + 0x99, 0x60, 0x0A, 0x11, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, + 0x0C, 0x60, 0x80, 0x08, 0xA8, 0x76, 0x24, 0x00, 0x82, 0x05, 0x34, 0x71, 0xA9, 0x76, 0x24, 0x00, + 0xF2, 0x30, 0x18, 0x60, 0x0D, 0x11, 0x18, 0x70, 0x0C, 0x11, 0xC6, 0x76, 0x92, 0x2A, 0xC4, 0x70, + 0x82, 0x04, 0x28, 0x70, 0xF6, 0x10, 0xF2, 0x03, 0x28, 0x70, 0xF8, 0x10, 0xC6, 0x72, 0xC2, 0x21, + 0x36, 0x72, 0x06, 0x27, 0x57, 0x23, 0x57, 0x74, 0x26, 0x27, 0x0C, 0x30, 0x10, 0x27, 0xAB, 0x8F, + 0x00, 0x00, 0xC4, 0x2A, 0xC2, 0x16, 0x8B, 0xD3, 0x00, 0x00, 0xEB, 0xD3, 0x00, 0x00, 0x98, 0x70, + 0xFD, 0x10, 0x82, 0x04, 0x4B, 0xC7, 0x00, 0x00, 0xF2, 0x08, 0x18, 0x70, 0x0F, 0x11, 0x93, 0x07, + 0x92, 0x04, 0xAB, 0x3F, 0x00, 0x00, 0xF2, 0xFA, 0x99, 0x00, 0x0F, 0x11, 0x6B, 0xD4, 0x00, 0x00, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x70, 0xFB, 0x10, 0x0C, 0x60, 0xFA, 0x00, + 0xC4, 0x70, 0x92, 0x05, 0x38, 0x70, 0xE4, 0x10, 0x28, 0x67, 0x1E, 0x00, 0x0C, 0x70, 0x80, 0x08, + 0x28, 0x57, 0x46, 0x01, 0x26, 0x65, 0x28, 0x57, 0x0C, 0x00, 0xC6, 0x65, 0x02, 0x17, 0x98, 0x57, + 0x02, 0x04, 0x92, 0x14, 0x28, 0x57, 0x06, 0x00, 0xDC, 0x50, 0xE0, 0x02, 0x92, 0x0F, 0x38, 0x70, + 0xCC, 0x10, 0x04, 0x21, 0x24, 0x71, 0xB9, 0x70, 0xCC, 0x10, 0x38, 0x60, 0xE4, 0x10, 0x18, 0x66, + 0x20, 0x00, 0xC6, 0x76, 0xD2, 0x06, 0x06, 0x25, 0xF2, 0x04, 0xB9, 0x00, 0xCC, 0x10, 0x04, 0x20, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x18, 0x70, 0x0D, 0x11, 0x18, 0x50, + 0x0C, 0x11, 0xC6, 0x57, 0x82, 0x3F, 0x99, 0x70, 0x0C, 0x11, 0xC4, 0x70, 0x18, 0x70, 0x09, 0x11, + 0x1C, 0x60, 0x10, 0x00, 0x56, 0x76, 0x82, 0x1C, 0x64, 0x72, 0x99, 0x70, 0x09, 0x11, 0x0B, 0x1D, + 0x01, 0x00, 0xB9, 0x00, 0xD4, 0x10, 0xB9, 0x00, 0xCC, 0x10, 0x38, 0x70, 0xE4, 0x10, 0x18, 0x27, + 0x41, 0x00, 0x18, 0x37, 0x78, 0x00, 0x18, 0x47, 0x77, 0x00, 0x18, 0x57, 0x58, 0x00, 0x18, 0x67, + 0x20, 0x00, 0x0C, 0xF0, 0xA8, 0x00, 0xF1, 0xF0, 0xB9, 0x20, 0xD0, 0x10, 0xF2, 0x0C, 0x64, 0x71, + 0x99, 0x70, 0x09, 0x11, 0x4B, 0x1E, 0x01, 0x00, 0x38, 0x70, 0xE4, 0x10, 0x18, 0x67, 0x55, 0x00, + 0x99, 0x60, 0xF5, 0x0A, 0x98, 0x70, 0x0D, 0x11, 0x82, 0x05, 0x0C, 0xF0, 0x68, 0x01, 0xF1, 0xF0, + 0xF2, 0x05, 0x18, 0x20, 0x09, 0x11, 0xCB, 0xC0, 0x00, 0x00, 0x18, 0x20, 0x09, 0x11, 0xEB, 0x6B, + 0x00, 0x00, 0x18, 0x20, 0x09, 0x11, 0xCB, 0x67, 0x00, 0x00, 0x18, 0x20, 0x09, 0x11, 0xAB, 0xB6, + 0x00, 0x00, 0x18, 0x20, 0x09, 0x11, 0xCB, 0xC0, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x98, 0x70, 0x0D, 0x11, 0x06, 0xDE, + 0x82, 0x53, 0x04, 0x63, 0x99, 0x60, 0x0A, 0x11, 0x4B, 0x74, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x07, + 0x0B, 0xB1, 0x00, 0x00, 0x0C, 0xF0, 0x68, 0x01, 0xF1, 0xF0, 0xF2, 0x03, 0x8B, 0xB1, 0x00, 0x00, + 0x0C, 0xF0, 0x8C, 0x01, 0xF1, 0xF0, 0x04, 0x21, 0xCB, 0xAF, 0x00, 0x00, 0x4B, 0x27, 0x01, 0x00, + 0x06, 0xE2, 0x04, 0x21, 0xCB, 0xAE, 0x00, 0x00, 0x04, 0x28, 0xCB, 0xAF, 0x00, 0x00, 0x0C, 0x20, + 0x10, 0x00, 0xCB, 0xAE, 0x00, 0x00, 0xC4, 0xE0, 0x82, 0x03, 0xAB, 0x2A, 0x01, 0x00, 0x98, 0x70, + 0x85, 0x08, 0x82, 0x06, 0xB9, 0x00, 0xD4, 0x10, 0xB9, 0x00, 0xC8, 0x10, 0xF2, 0x06, 0x38, 0x70, + 0xD4, 0x10, 0x24, 0x71, 0xB9, 0x70, 0xD4, 0x10, 0xAB, 0x16, 0x01, 0x00, 0x38, 0x70, 0xD0, 0x10, + 0x38, 0x60, 0xD4, 0x10, 0x24, 0x73, 0xC6, 0x67, 0xA2, 0x05, 0x99, 0x00, 0x0D, 0x11, 0x99, 0x00, + 0x05, 0x11, 0x98, 0x60, 0x0B, 0x11, 0x82, 0x35, 0x04, 0x20, 0x99, 0x00, 0x0B, 0x11, 0x99, 0x00, + 0x0D, 0x11, 0x8B, 0xE1, 0x00, 0x00, 0x28, 0x20, 0xD8, 0x10, 0x6B, 0x14, 0x00, 0x00, 0x04, 0x21, + 0x4B, 0x6D, 0x00, 0x00, 0xF2, 0x26, 0x04, 0x62, 0x99, 0x60, 0x0A, 0x11, 0x0B, 0xB1, 0x00, 0x00, + 0x04, 0x21, 0xCB, 0xAF, 0x00, 0x00, 0x04, 0x21, 0xCB, 0xAE, 0x00, 0x00, 0x04, 0x28, 0xCB, 0xAF, + 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0xCB, 0xAE, 0x00, 0x00, 0xAB, 0x16, 0x01, 0x00, 0xAB, 0x8F, + 0x02, 0x00, 0xC4, 0x20, 0x82, 0x0C, 0x18, 0x70, 0xFA, 0x10, 0x5C, 0x70, 0xF0, 0x00, 0xCC, 0x70, + 0x40, 0x00, 0x82, 0x07, 0x04, 0x71, 0x99, 0x70, 0x0D, 0x11, 0xF2, 0x03, 0xAB, 0x6C, 0x00, 0x00, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0xCB, 0x32, 0x00, 0x00, + 0xC4, 0x20, 0x82, 0x03, 0xEB, 0xD5, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0xCB, 0xE0, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x34, 0x18, 0x04, 0x20, 0xC1, 0xE1, 0x4B, 0xE2, 0x00, 0x00, 0x06, 0xE2, 0x04, 0x20, 0x8B, 0xE1, + 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0xEB, 0x14, 0x00, 0x00, 0x08, 0x70, 0x1C, 0xE1, 0x08, 0x60, 0x00, 0x30, 0x2C, 0x70, 0x04, 0xE9, + 0xB9, 0x76, 0x04, 0x01, 0xB9, 0x76, 0x08, 0x01, 0xEB, 0xD5, 0x00, 0x00, 0x04, 0x2A, 0x6B, 0x40, + 0x00, 0x00, 0xF2, 0xFB, 0x34, 0x14, 0xB1, 0xF1, 0x4B, 0x16, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x05, + 0x38, 0x20, 0xC4, 0x10, 0xCB, 0x17, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0x04, 0x21, 0xC1, 0xE1, 0xCB, 0xE0, 0x00, 0x00, 0x08, 0xE0, 0x07, 0x00, 0x2C, 0xE0, + 0x20, 0xA1, 0x2B, 0x88, 0x00, 0x00, 0x98, 0x70, 0x04, 0x11, 0x92, 0x1B, 0x04, 0x21, 0x4B, 0xE2, + 0x00, 0x00, 0x26, 0x22, 0x06, 0x72, 0x57, 0x71, 0x26, 0x27, 0xC6, 0x2E, 0xC2, 0xF3, 0x08, 0x70, + 0x00, 0x80, 0x38, 0x77, 0xCC, 0x83, 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x04, 0x98, 0x70, 0x03, 0x11, + 0x82, 0x08, 0x04, 0x21, 0x8B, 0xE1, 0x00, 0x00, 0x04, 0x21, 0xCB, 0xE0, 0x00, 0x00, 0xF2, 0xE2, + 0x04, 0x21, 0x8B, 0xE1, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x0C, 0x70, 0xFF, 0x7F, + 0x26, 0x72, 0xCC, 0x70, 0xFE, 0xFF, 0x34, 0x14, 0xB1, 0xF1, 0xD2, 0x07, 0x0C, 0x70, 0xFF, 0x7F, + 0x26, 0x73, 0xCC, 0x70, 0xFE, 0xFF, 0xC2, 0x04, 0xFB, 0x99, 0x00, 0x00, 0xF2, 0x0F, 0x08, 0x70, + 0x00, 0x40, 0x04, 0x61, 0x57, 0x28, 0x23, 0x33, 0xB9, 0x67, 0x00, 0x80, 0x66, 0x23, 0xB9, 0x27, + 0x04, 0x80, 0xB9, 0x07, 0x08, 0x80, 0x38, 0x27, 0x0C, 0x80, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0xC4, 0x20, 0x34, 0x14, 0xB1, 0xF1, 0x06, 0x23, 0x82, 0x10, 0x57, 0x26, 0x5C, 0x40, 0xFF, 0x0F, + 0x66, 0x24, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x26, 0x14, 0x80, 0x38, 0x76, 0x20, 0x80, 0xD4, 0x71, + 0x82, 0xFD, 0x38, 0x26, 0x18, 0x80, 0xF2, 0x04, 0x06, 0x34, 0x1B, 0x9B, 0x00, 0x00, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0x08, 0x60, 0x0F, 0x00, 0x2C, 0x60, 0xFF, 0xFF, 0xC6, 0x26, 0x34, 0x14, + 0xB1, 0xF1, 0x06, 0x72, 0x06, 0x43, 0xD2, 0x04, 0xCC, 0x30, 0xFF, 0x0F, 0xC2, 0x06, 0x06, 0x27, + 0x06, 0x34, 0x1B, 0x9B, 0x00, 0x00, 0xF2, 0x05, 0x04, 0x21, 0x06, 0x37, 0x0B, 0x8E, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD3, + 0xF7, 0xDF, 0xC4, 0xD0, 0x06, 0xE4, 0xF7, 0xEF, 0x82, 0x02, 0x16, 0x33, 0xC4, 0xE0, 0x82, 0x02, + 0x16, 0x44, 0xC4, 0x20, 0x82, 0x10, 0x5C, 0x40, 0xFF, 0x0F, 0x57, 0x36, 0x66, 0x43, 0x08, 0x60, + 0x00, 0x40, 0xB9, 0x46, 0x14, 0x80, 0x38, 0x76, 0x20, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, + 0x18, 0x80, 0xF2, 0x05, 0x06, 0x23, 0x06, 0x34, 0x1B, 0x9B, 0x00, 0x00, 0xC6, 0xDE, 0x82, 0x02, + 0x16, 0x22, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x07, 0x00, + 0x2C, 0x60, 0xFF, 0xFF, 0x2F, 0x56, 0x02, 0x00, 0x08, 0x60, 0x0F, 0x00, 0x2C, 0x60, 0xFE, 0xFF, + 0xC6, 0x56, 0x34, 0x14, 0xB1, 0xF1, 0x06, 0x72, 0x06, 0x43, 0xD2, 0x08, 0x0C, 0x60, 0xFF, 0x07, + 0x26, 0x63, 0xCC, 0x60, 0xFE, 0x0F, 0x04, 0x21, 0xC2, 0x02, 0x04, 0x20, 0x06, 0x37, 0x4B, 0x91, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, + 0x06, 0xE3, 0x06, 0xD4, 0x82, 0x0E, 0x57, 0xE6, 0x66, 0xE4, 0x08, 0x60, 0x00, 0x40, 0xB9, 0xE6, + 0x14, 0x80, 0x38, 0x76, 0x20, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x1C, 0x80, 0xF2, 0x0A, + 0x06, 0x23, 0x06, 0x34, 0x1B, 0x9B, 0x00, 0x00, 0x06, 0x3D, 0xEB, 0x8B, 0x00, 0x00, 0x3F, 0x22, + 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x0F, 0x00, + 0x2C, 0x70, 0xFF, 0xFF, 0xC6, 0x27, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD2, 0x06, 0xE3, + 0xD2, 0x04, 0xCC, 0x30, 0xFF, 0x0F, 0xC2, 0x0B, 0x06, 0x3E, 0x06, 0x2D, 0x1B, 0x9B, 0x00, 0x00, + 0x06, 0x3E, 0xEB, 0x8B, 0x00, 0x00, 0x3F, 0x22, 0x0D, 0x00, 0xF2, 0x06, 0x04, 0x21, 0x06, 0x3D, + 0x06, 0x4E, 0xCB, 0x95, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0xC4, 0x30, + 0x04, 0x40, 0x04, 0x50, 0x0C, 0x60, 0x20, 0x00, 0x52, 0x03, 0xA6, 0x42, 0x25, 0x50, 0xB4, 0x61, + 0x02, 0x06, 0xA6, 0x44, 0x25, 0x55, 0xA6, 0x33, 0x42, 0xF9, 0xF2, 0xFA, 0x06, 0x24, 0x06, 0x35, + 0xE1, 0xF0, 0x04, 0x40, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9E, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9D, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9C, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x9A, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x99, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x98, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x97, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x96, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x95, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x94, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x93, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x92, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x91, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x90, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x8F, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8E, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8D, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8C, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x8A, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x89, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x88, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x87, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x86, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x85, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x84, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x83, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x82, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x81, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x80, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x7F, 0x00, 0x00, 0xE1, 0xF0, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x62, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x63, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x64, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x65, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x66, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x67, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x68, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x69, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6A, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6B, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6C, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6D, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6E, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6F, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x70, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x71, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x72, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x73, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x74, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x75, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x76, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x77, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x78, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x79, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7A, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7B, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7C, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7D, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7E, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7F, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x80, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xC4, 0x20, 0x38, 0x67, + 0x30, 0x71, 0x82, 0x09, 0x08, 0x50, 0x40, 0x00, 0x66, 0x65, 0xB9, 0x67, 0x30, 0x71, 0xAB, 0x3F, + 0x00, 0x00, 0xF2, 0x08, 0x08, 0x50, 0xBF, 0xFF, 0x2C, 0x50, 0xFF, 0xFF, 0x56, 0x65, 0xB9, 0x67, + 0x30, 0x71, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x70, + 0xD6, 0x72, 0x82, 0xFD, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, + 0xB9, 0x67, 0x08, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x4B, 0xAF, + 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0xE7, 0x00, 0x70, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, 0x64, 0x72, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, 0x64, 0x71, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x70, 0x70, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE0, 0x70, 0x5C, 0x20, 0xFF, 0x7F, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0x5C, 0x70, 0x5C, 0x20, 0x7F, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x20, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0x34, 0x18, 0x2C, 0x20, + 0x08, 0x70, 0x2C, 0x30, 0x08, 0x7C, 0x0C, 0x40, 0xF8, 0x01, 0xC1, 0xE1, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x46, 0x08, 0xE0, 0x00, 0x30, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, + 0x2C, 0x30, 0x00, 0x7E, 0x0C, 0x40, 0x00, 0x02, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, + 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0x80, 0x0C, 0x40, 0x00, 0x02, + 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x42, 0x08, 0x30, 0x98, 0x08, 0x26, 0x2E, + 0x2C, 0x30, 0x98, 0x08, 0x0C, 0x40, 0x00, 0x04, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x40, 0xE1, + 0x24, 0x18, 0xE1, 0xF0, 0xC4, 0x23, 0x82, 0x4E, 0xC4, 0x23, 0x08, 0x70, 0x00, 0x40, 0xD2, 0x06, + 0xC4, 0x21, 0x82, 0x1C, 0xC4, 0x22, 0x82, 0x2E, 0xF2, 0x5A, 0xCC, 0x20, 0x81, 0x00, 0x82, 0x16, + 0xCC, 0x20, 0x82, 0x00, 0x82, 0x27, 0xC4, 0x28, 0x92, 0x52, 0x08, 0x60, 0x22, 0x00, 0x2C, 0x60, + 0x11, 0x11, 0xB9, 0x67, 0x34, 0x70, 0x04, 0x62, 0xB9, 0x67, 0x64, 0x70, 0x08, 0x60, 0x01, 0x00, + 0x2C, 0x60, 0x53, 0x86, 0xB9, 0x67, 0x54, 0x70, 0xF2, 0x42, 0x08, 0x60, 0x22, 0x00, 0x2C, 0x60, + 0x23, 0x13, 0xB9, 0x67, 0x34, 0x70, 0x04, 0x63, 0xB9, 0x67, 0x64, 0x70, 0x08, 0x60, 0x01, 0x00, + 0x2C, 0x60, 0x51, 0x86, 0xB9, 0x67, 0x54, 0x70, 0x08, 0x60, 0xA0, 0x8F, 0x2C, 0x60, 0x80, 0x0F, + 0xF2, 0x2C, 0x08, 0x60, 0x22, 0x00, 0x2C, 0x60, 0x23, 0x13, 0xB9, 0x67, 0x34, 0x70, 0x04, 0x63, + 0xB9, 0x67, 0x64, 0x70, 0x08, 0x70, 0x01, 0x00, 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x51, 0x86, + 0xB9, 0x76, 0x54, 0x70, 0x08, 0x70, 0xA0, 0x8F, 0x2C, 0x70, 0x80, 0x0F, 0xB9, 0x76, 0x6C, 0x70, + 0xF2, 0x16, 0x08, 0x60, 0x22, 0x00, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x11, 0x11, 0xB9, 0x67, + 0x34, 0x70, 0x04, 0x62, 0xB9, 0x67, 0x64, 0x70, 0x08, 0x60, 0x01, 0x00, 0x2C, 0x60, 0x51, 0x86, + 0xB9, 0x67, 0x54, 0x70, 0x0C, 0x60, 0x00, 0x0F, 0xB9, 0x67, 0x6C, 0x70, 0x08, 0x70, 0x00, 0x40, + 0x08, 0x60, 0xFA, 0x00, 0xB9, 0x67, 0x30, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, + 0x92, 0x04, 0x38, 0x60, 0xDC, 0x10, 0xF2, 0x03, 0x38, 0x60, 0xE0, 0x10, 0x38, 0x56, 0x08, 0x00, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x57, 0xB4, 0x70, 0x38, 0x56, 0x0C, 0x00, 0x08, 0x40, 0xDF, 0xFF, + 0xB9, 0x57, 0xB8, 0x70, 0x38, 0x56, 0x10, 0x00, 0x2C, 0x40, 0xFF, 0xFF, 0x56, 0x54, 0xB9, 0x57, + 0xC0, 0x70, 0x38, 0x56, 0x14, 0x00, 0xB9, 0x57, 0xC4, 0x70, 0x98, 0x50, 0xFB, 0x10, 0x82, 0x0C, + 0x08, 0x60, 0x01, 0x00, 0x2C, 0x60, 0x40, 0x62, 0xB9, 0x67, 0xAC, 0x70, 0x08, 0x60, 0x10, 0x00, + 0x2C, 0x60, 0x10, 0x00, 0xF2, 0x06, 0x30, 0x56, 0xB9, 0x57, 0xAC, 0x70, 0x38, 0x66, 0x04, 0x00, + 0xB9, 0x67, 0xB0, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x70, + 0xDC, 0x10, 0xF2, 0x03, 0x38, 0x70, 0xE0, 0x10, 0x18, 0x60, 0x82, 0x0C, 0xC4, 0x62, 0xC2, 0x04, + 0x38, 0x57, 0x20, 0x00, 0xF2, 0x08, 0xC4, 0x62, 0x92, 0x04, 0x38, 0x57, 0x1C, 0x00, 0xF2, 0x03, + 0x38, 0x57, 0x18, 0x00, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0xC8, 0x70, 0x38, 0x57, 0x24, 0x00, + 0xB9, 0x56, 0xCC, 0x70, 0x38, 0x77, 0x28, 0x00, 0xB9, 0x76, 0xD4, 0x70, 0xE1, 0xF0, 0x00, 0x00, + 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x70, 0xDC, 0x10, 0xF2, 0x03, 0x38, 0x70, 0xE0, 0x10, + 0x38, 0x57, 0x2C, 0x00, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0x8C, 0x70, 0x38, 0x57, 0x30, 0x00, + 0xB9, 0x56, 0x90, 0x70, 0x38, 0x57, 0x34, 0x00, 0xB9, 0x56, 0x94, 0x70, 0x38, 0x57, 0x38, 0x00, + 0xB9, 0x56, 0x98, 0x70, 0x38, 0x57, 0x3C, 0x00, 0xB9, 0x56, 0x9C, 0x70, 0x38, 0x57, 0x40, 0x00, + 0xB9, 0x56, 0xA0, 0x70, 0x38, 0x57, 0x44, 0x00, 0xB9, 0x56, 0xA4, 0x70, 0x38, 0x77, 0x48, 0x00, + 0xB9, 0x76, 0xA8, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0x00, 0xDE, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x67, 0x10, 0x60, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x10, 0x60, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0xFE, 0x00, 0xB9, 0x67, 0x0C, 0x20, + 0xB9, 0x07, 0x18, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x51, 0x00, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0xAD, 0xDE, 0x2C, 0x70, 0x2C, 0x03, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x00, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x2C, 0x03, + 0xB9, 0x76, 0x00, 0x10, 0xB9, 0x26, 0x6C, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x2C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x0C, 0x50, 0x10, 0x00, + 0xB9, 0x57, 0x20, 0x10, 0x08, 0x50, 0x38, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x2C, 0x50, 0x80, 0x88, + 0xB9, 0x57, 0x24, 0x10, 0xB9, 0x67, 0x00, 0x10, 0xB9, 0x07, 0x28, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x2C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0xC4, 0x30, 0x38, 0x67, 0x50, 0x10, 0x82, 0x05, 0x66, 0x62, 0xB9, 0x67, 0x50, 0x10, 0xF2, 0x05, + 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x50, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x2C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x54, 0x10, + 0x66, 0x62, 0xB9, 0x67, 0x54, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, + 0x2C, 0x60, 0x2C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x54, 0x10, 0x15, 0x22, 0x56, 0x26, + 0xB9, 0x27, 0x54, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, + 0x2C, 0x60, 0x2C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x57, 0x58, 0x10, 0xCC, 0x20, 0xFF, 0x00, + 0x1C, 0x40, 0x00, 0x01, 0x56, 0x54, 0x92, 0x0A, 0xB9, 0x57, 0x58, 0x10, 0xB9, 0x67, 0x00, 0x10, + 0x38, 0x67, 0x4C, 0x10, 0x14, 0x52, 0x56, 0x65, 0xF2, 0x09, 0x66, 0x52, 0xB9, 0x57, 0x58, 0x10, + 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, 0x64, 0x61, 0xB9, 0x67, 0x4C, 0x10, 0xE1, 0xF0, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x2C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0xC4, 0x30, 0x38, 0x67, 0x4C, 0x10, 0x82, 0x05, 0x66, 0x62, 0xB9, 0x67, 0x4C, 0x10, 0xF2, 0x05, + 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x4C, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, + 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x2C, 0x03, 0xB9, 0x76, 0x00, 0x10, 0x04, 0x73, 0xB9, 0x76, + 0x44, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x10, 0x66, 0x72, 0xB9, 0x76, + 0x08, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x64, 0x10, 0x66, 0x72, 0xB9, 0x76, + 0x64, 0x10, 0xE1, 0xF0, 0x04, 0x62, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x10, 0xE1, 0xF0, + 0x23, 0x22, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x10, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, + 0x38, 0x76, 0x14, 0x10, 0x64, 0x71, 0xB9, 0x76, 0x14, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, + 0x38, 0x76, 0x14, 0x10, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x14, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x20, 0x0C, 0x70, 0x10, 0x00, 0x82, 0x03, 0x0C, 0x70, 0xA0, 0x00, 0x6C, 0x70, 0x00, 0x01, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x74, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x04, 0x61, 0x08, 0x70, + 0x00, 0x40, 0xB9, 0x67, 0x70, 0x10, 0xE1, 0xF0, 0xC4, 0x20, 0x08, 0x70, 0x00, 0x40, 0x82, 0x04, + 0x04, 0x61, 0xB1, 0x67, 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x30, 0x57, 0x21, + 0x08, 0x70, 0x00, 0x40, 0x26, 0x72, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, 0xF2, 0x02, 0xB1, 0x07, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, + 0x08, 0x00, 0x04, 0x62, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x10, 0x30, 0x48, 0x61, 0x08, 0x00, + 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x67, 0x14, 0x40, 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, + 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, + 0x08, 0x00, 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x50, 0x48, 0x61, 0x08, 0x00, + 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x24, 0x00, + 0xD9, 0x41, 0x08, 0x00, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x1C, 0x00, 0x04, 0x61, 0xB9, 0xF1, + 0x18, 0x00, 0xC1, 0x21, 0x99, 0x60, 0x0F, 0x11, 0xEB, 0x3E, 0x00, 0x00, 0x04, 0x61, 0x08, 0x70, + 0x00, 0x40, 0xB9, 0x67, 0x78, 0x10, 0x48, 0x61, 0x1C, 0x00, 0x38, 0xF1, 0x18, 0x00, 0x40, 0x21, + 0x11, 0x16, 0x11, 0x07, 0x58, 0x41, 0x08, 0x00, 0x2C, 0x10, 0x24, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x08, 0x70, + 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0x04, 0x61, 0x99, 0x60, 0x0E, 0x11, + 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, + 0x08, 0x70, 0x04, 0x00, 0x24, 0x74, 0x26, 0x27, 0x08, 0x70, 0xFF, 0xBF, 0x57, 0x26, 0x2C, 0x70, + 0x00, 0xC0, 0xB1, 0x42, 0x26, 0x27, 0x0C, 0x40, 0x04, 0x40, 0x08, 0x70, 0x00, 0x40, 0x26, 0x47, + 0x26, 0x42, 0xB1, 0x34, 0x0C, 0x40, 0x10, 0x40, 0x26, 0x47, 0x26, 0x42, 0x2C, 0x70, 0x08, 0x40, + 0xB1, 0x54, 0x26, 0x27, 0xB1, 0x62, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x70, 0x08, 0x40, + 0x57, 0x26, 0x26, 0x27, 0x30, 0x72, 0x6C, 0x70, 0x00, 0x01, 0xB1, 0x72, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x70, 0x08, 0x40, 0x57, 0x26, 0x26, 0x27, 0x30, 0x72, 0x1C, 0x60, + 0x01, 0x01, 0x56, 0x76, 0xB1, 0x72, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, 0x57, 0x26, 0x2C, 0x70, + 0x0C, 0x40, 0x26, 0x72, 0x30, 0x27, 0xE1, 0xF0, 0x2F, 0x62, 0x02, 0x00, 0x26, 0x62, 0x57, 0x61, + 0x26, 0x62, 0xC4, 0x3A, 0x26, 0x63, 0xB1, 0x64, 0x06, 0x72, 0xC2, 0x12, 0x06, 0x57, 0x0C, 0x50, + 0xE8, 0x10, 0x28, 0x55, 0x02, 0x00, 0x04, 0x20, 0xC6, 0x65, 0x92, 0x03, 0x0C, 0x20, 0x98, 0x08, + 0x28, 0x70, 0xE8, 0x10, 0xC6, 0x67, 0x92, 0x0D, 0x0C, 0x20, 0x98, 0x08, 0xF2, 0x0A, 0xCC, 0x70, + 0x10, 0x00, 0x0C, 0x20, 0x98, 0x08, 0xC2, 0x05, 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x02, 0x04, 0x20, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0x00, 0x40, 0x26, 0x22, 0x2F, 0x57, + 0x02, 0x00, 0x20, 0x65, 0xC4, 0x40, 0x13, 0x76, 0x77, 0x64, 0x82, 0x09, 0xC4, 0x30, 0x82, 0x04, + 0x26, 0x74, 0x26, 0x64, 0xF2, 0x11, 0x36, 0x64, 0x36, 0x74, 0xF2, 0x0E, 0xC4, 0x30, 0x82, 0x07, + 0xC6, 0x67, 0x02, 0x03, 0x24, 0x71, 0xF2, 0x0D, 0x24, 0x61, 0xF2, 0x06, 0xC6, 0x67, 0x02, 0x03, + 0x34, 0x61, 0xF2, 0x02, 0x34, 0x71, 0xC4, 0x70, 0x02, 0x06, 0xCC, 0x70, 0xFF, 0x00, 0x12, 0x06, + 0x04, 0x20, 0xF2, 0x07, 0x14, 0x21, 0x04, 0x71, 0xF2, 0x04, 0x14, 0x21, 0x0C, 0x70, 0xFF, 0x00, + 0xC4, 0x60, 0x02, 0x08, 0xCC, 0x60, 0xFF, 0x00, 0x02, 0x07, 0x14, 0x21, 0x0C, 0x60, 0xFF, 0x00, + 0xF2, 0x03, 0x14, 0x21, 0x04, 0x61, 0x57, 0x64, 0x66, 0x67, 0xA1, 0x65, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x24, 0x04, 0xD9, 0xC1, 0x14, 0x04, 0x08, 0x70, 0x00, 0x40, 0xD9, 0x81, 0x04, 0x04, + 0x38, 0xA7, 0x68, 0x70, 0xB9, 0x07, 0x68, 0x70, 0x23, 0x32, 0x0C, 0x40, 0x00, 0x02, 0x06, 0x21, + 0xCB, 0x41, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x03, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x00, 0x01, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x02, 0x26, 0x21, 0x04, 0x31, 0x0C, 0x40, + 0x00, 0x01, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x04, 0x21, 0x08, 0xB0, 0x00, 0x30, 0xCB, 0xAF, + 0x00, 0x00, 0x0C, 0xC0, 0x82, 0x00, 0x2C, 0xB0, 0x00, 0x42, 0x04, 0x21, 0x04, 0xD0, 0xCB, 0xAE, + 0x00, 0x00, 0x06, 0xED, 0x04, 0x90, 0x0C, 0x40, 0x00, 0x04, 0x06, 0x2D, 0x06, 0x39, 0x26, 0x41, + 0xCB, 0xE2, 0x00, 0x00, 0x86, 0x62, 0x82, 0x5E, 0x38, 0x21, 0x00, 0x04, 0x06, 0x72, 0x57, 0x71, + 0x26, 0x7B, 0x30, 0x77, 0x5C, 0x70, 0xFF, 0x0F, 0x36, 0x76, 0x0C, 0x60, 0x00, 0x03, 0x26, 0x61, + 0x26, 0x62, 0x90, 0x46, 0x82, 0x04, 0xCC, 0x70, 0x1E, 0x00, 0x02, 0x4B, 0x0C, 0x50, 0x00, 0x02, + 0x26, 0x51, 0x26, 0x52, 0x10, 0x65, 0xC4, 0x61, 0x2F, 0x62, 0x02, 0x00, 0x92, 0x07, 0xC4, 0x70, + 0x22, 0x27, 0xC4, 0x70, 0x91, 0x05, 0x92, 0x11, 0xF2, 0x23, 0xC4, 0x70, 0x12, 0x0E, 0x04, 0x31, + 0x91, 0x35, 0x2F, 0x56, 0x01, 0x00, 0xA0, 0x55, 0x92, 0x1B, 0x0C, 0x50, 0x00, 0x03, 0x26, 0x51, + 0x24, 0x41, 0x26, 0x52, 0x91, 0x45, 0xF2, 0x14, 0x2F, 0x56, 0x01, 0x00, 0x20, 0x55, 0x26, 0x55, + 0x06, 0x45, 0x57, 0x41, 0x26, 0x54, 0x06, 0x45, 0xD7, 0x41, 0x3F, 0x55, 0x04, 0x00, 0xC6, 0x75, + 0x32, 0x07, 0x2F, 0x56, 0x01, 0x00, 0x20, 0x75, 0xF7, 0x70, 0xA1, 0x75, 0xF2, 0x0F, 0x2F, 0x56, + 0x01, 0x00, 0x20, 0x55, 0x26, 0x55, 0x06, 0x45, 0x57, 0x41, 0x26, 0x54, 0x06, 0x45, 0xD7, 0x41, + 0x36, 0x54, 0xC6, 0x57, 0x32, 0x03, 0xC4, 0x70, 0x22, 0xED, 0x0C, 0x70, 0x00, 0x02, 0x26, 0x71, + 0x26, 0x72, 0x26, 0x61, 0x10, 0x37, 0x20, 0x46, 0x2B, 0xE5, 0x00, 0x00, 0xC4, 0x20, 0x32, 0x02, + 0x24, 0xE1, 0x24, 0x91, 0xC4, 0x9D, 0x92, 0x98, 0x24, 0xD1, 0xCC, 0xD0, 0x12, 0x00, 0x92, 0x93, + 0xCC, 0xE0, 0xBD, 0x00, 0x82, 0x07, 0xB4, 0xC1, 0x82, 0x05, 0x04, 0x21, 0xCB, 0xAF, 0x00, 0x00, + 0xF2, 0x85, 0x08, 0x70, 0x00, 0x40, 0xB9, 0xA7, 0x68, 0x70, 0x58, 0xC1, 0x14, 0x04, 0x58, 0x81, + 0x04, 0x04, 0x2C, 0x10, 0x24, 0x04, 0xE1, 0xF0, 0x3C, 0x10, 0x34, 0x00, 0xD9, 0x81, 0x14, 0x00, + 0xD9, 0xC1, 0x24, 0x00, 0xB9, 0x21, 0x04, 0x00, 0x06, 0x93, 0x06, 0x84, 0x04, 0xEA, 0x04, 0x21, + 0xCB, 0xAF, 0x00, 0x00, 0x04, 0x21, 0xCB, 0xAE, 0x00, 0x00, 0xB4, 0xE1, 0x92, 0xF9, 0x08, 0xC0, + 0x00, 0x30, 0x1C, 0x50, 0x88, 0x13, 0x06, 0xBE, 0x06, 0x7E, 0x06, 0x6E, 0x06, 0xAE, 0x2C, 0xC0, + 0x00, 0x42, 0x04, 0xD0, 0x06, 0x2E, 0x06, 0x3D, 0x06, 0x41, 0xB9, 0x51, 0x10, 0x00, 0xB9, 0x61, + 0x08, 0x00, 0xB9, 0x71, 0x0C, 0x00, 0xCB, 0xE2, 0x00, 0x00, 0x86, 0x22, 0x38, 0x51, 0x10, 0x00, + 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, 0x0C, 0x00, 0x82, 0x19, 0x30, 0x41, 0x57, 0x41, 0x26, 0x4C, + 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x0F, 0x3F, 0x22, 0x04, 0x00, 0xC4, 0x20, 0x32, 0x02, 0x16, 0x22, + 0xCC, 0x20, 0xC8, 0x00, 0x02, 0x02, 0x04, 0xA1, 0x1C, 0x40, 0xC8, 0x00, 0x26, 0x42, 0xC6, 0x54, + 0x32, 0x05, 0x06, 0x54, 0x06, 0xBE, 0x06, 0x7D, 0x06, 0x62, 0x24, 0xD1, 0xC4, 0xDD, 0x92, 0xD3, + 0x24, 0xE1, 0xCC, 0xE0, 0x12, 0x00, 0x92, 0xCE, 0xB1, 0x68, 0xB1, 0x79, 0x04, 0x20, 0x38, 0x71, + 0x04, 0x00, 0xC6, 0xA2, 0xB1, 0xB7, 0x82, 0x02, 0x04, 0x24, 0x58, 0xC1, 0x24, 0x00, 0x58, 0x81, + 0x14, 0x00, 0x2C, 0x10, 0x34, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE4, + 0x06, 0xC2, 0x04, 0x28, 0x06, 0xD3, 0xAB, 0xB6, 0x00, 0x00, 0x08, 0x20, 0x00, 0x30, 0x08, 0x30, + 0x80, 0x80, 0x2C, 0x30, 0x80, 0x80, 0x0C, 0x40, 0x00, 0x02, 0x2C, 0x20, 0x00, 0x40, 0x0C, 0xF0, + 0x40, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x00, 0x0B, 0xE9, 0x00, 0x00, 0x06, 0x2C, 0x06, 0x3D, + 0x06, 0x4E, 0x4B, 0xF4, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE3, 0x06, 0xD2, 0xCB, 0xC5, 0x00, 0x00, 0x0C, 0x20, + 0x38, 0x00, 0x04, 0x30, 0x0C, 0xF0, 0xC8, 0x02, 0xF1, 0xF0, 0x0C, 0xF0, 0x98, 0x02, 0xF1, 0xF0, + 0x06, 0x4D, 0x0C, 0x20, 0x58, 0x01, 0x04, 0x30, 0x0C, 0x50, 0x80, 0x00, 0x0C, 0xF0, 0xFC, 0x02, + 0xF1, 0xF0, 0x0C, 0x30, 0x80, 0x00, 0x06, 0x4E, 0x0C, 0x20, 0x58, 0x01, 0x06, 0x53, 0x0C, 0xF0, + 0xFC, 0x02, 0xF1, 0xF0, 0x4B, 0xC6, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x00, 0x80, 0xD1, 0x81, 0x06, 0xC4, + 0x06, 0x92, 0x06, 0xB3, 0x06, 0x2E, 0x0C, 0x20, 0x80, 0x06, 0x06, 0x3D, 0x2C, 0x30, 0x00, 0x82, + 0x0C, 0x40, 0x00, 0x02, 0x06, 0xA6, 0x06, 0x85, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x06, 0x58, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xAB, 0x0C, 0x57, 0x56, 0x66, 0x57, 0x57, 0x98, 0x06, 0x7E, + 0x0C, 0x70, 0x80, 0x06, 0x66, 0x59, 0xA9, 0x57, 0xCC, 0x01, 0x77, 0x58, 0xA9, 0x57, 0xCE, 0x01, + 0x38, 0x50, 0x14, 0x00, 0x2C, 0xD0, 0x00, 0x82, 0xA9, 0x57, 0xD0, 0x01, 0x77, 0x58, 0xA9, 0x57, + 0xD2, 0x01, 0x38, 0x5D, 0xC8, 0x01, 0x06, 0x3B, 0x57, 0x38, 0x66, 0x3C, 0x24, 0x51, 0xCC, 0xA0, + 0x32, 0x00, 0xA9, 0x37, 0xC4, 0x01, 0xA9, 0x57, 0xC8, 0x01, 0x77, 0x38, 0x77, 0x58, 0xA9, 0x37, + 0xC6, 0x01, 0xA9, 0x57, 0xCA, 0x01, 0x04, 0x60, 0x92, 0x05, 0xA9, 0x67, 0xC0, 0x01, 0xA9, 0x67, + 0xC2, 0x01, 0x08, 0x20, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, + 0x00, 0x80, 0x2C, 0x40, 0x98, 0x03, 0x36, 0x42, 0x2C, 0x30, 0xA8, 0x70, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x08, 0x20, 0x00, 0x30, 0x06, 0x3E, 0x0C, 0x30, 0x80, 0x06, 0x2C, 0x20, 0x00, 0x40, + 0x8B, 0xFC, 0x00, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x18, 0x70, 0x09, 0x11, 0x1C, 0x50, 0x10, 0x00, 0x56, 0x75, 0xCC, 0x20, 0x32, 0x00, 0x3C, 0x10, + 0x1C, 0x00, 0x64, 0x78, 0xD9, 0xC1, 0x0C, 0x00, 0x99, 0x70, 0x09, 0x11, 0x08, 0xE0, 0x00, 0x80, + 0x06, 0xD2, 0x2C, 0xE0, 0x00, 0x82, 0x92, 0x09, 0xB8, 0x7E, 0xC0, 0x01, 0x92, 0x06, 0x0C, 0x20, + 0x78, 0x00, 0x6B, 0x40, 0x00, 0x00, 0xF2, 0x1C, 0x4B, 0x5D, 0x00, 0x00, 0x04, 0x21, 0x4B, 0x58, + 0x00, 0x00, 0x04, 0x21, 0xCB, 0xAF, 0x00, 0x00, 0x04, 0x21, 0xCB, 0xAE, 0x00, 0x00, 0x04, 0x28, + 0x04, 0x34, 0x26, 0x31, 0x06, 0x41, 0x26, 0x21, 0x4B, 0xFA, 0x00, 0x00, 0x06, 0x52, 0x38, 0x31, + 0x08, 0x00, 0x30, 0x21, 0x38, 0x41, 0x04, 0x00, 0x06, 0x6D, 0x0B, 0xFF, 0x00, 0x00, 0xEB, 0x14, + 0x00, 0x00, 0x38, 0x6E, 0xCC, 0x01, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x04, 0x01, 0x38, 0x6E, + 0xC4, 0x01, 0xB9, 0x67, 0x08, 0x01, 0xEB, 0xD5, 0x00, 0x00, 0xF2, 0x00, 0x98, 0x70, 0x02, 0x11, + 0x3C, 0x10, 0x24, 0x02, 0xD9, 0x81, 0x04, 0x02, 0xD9, 0xC1, 0x14, 0x02, 0x06, 0xA2, 0x06, 0x93, + 0x82, 0x73, 0x04, 0xD0, 0x08, 0xB0, 0x00, 0x30, 0x06, 0xED, 0x2C, 0xB0, 0x00, 0x42, 0x04, 0xC0, + 0x0C, 0x40, 0x00, 0x02, 0x06, 0x2D, 0x06, 0x3C, 0x26, 0x41, 0xCB, 0xE2, 0x00, 0x00, 0x86, 0x22, + 0x82, 0x2C, 0xCC, 0x20, 0x98, 0x08, 0x92, 0x06, 0x0C, 0x60, 0x60, 0x09, 0x0C, 0x50, 0xD0, 0x07, + 0xF2, 0x09, 0x23, 0x52, 0x0C, 0x60, 0xC8, 0x00, 0x26, 0x65, 0x3C, 0x50, 0xC8, 0x00, 0x23, 0x66, + 0x23, 0x55, 0x38, 0x21, 0x00, 0x02, 0xC4, 0x91, 0x06, 0x72, 0x57, 0x71, 0x26, 0x7B, 0x30, 0x77, + 0x82, 0x02, 0x67, 0x78, 0x5C, 0x70, 0xFF, 0x0F, 0xC6, 0x75, 0x04, 0x31, 0x22, 0x04, 0xC6, 0x76, + 0x02, 0x0C, 0x04, 0x30, 0x06, 0x4A, 0x2B, 0xE5, 0x00, 0x00, 0x38, 0x61, 0x00, 0x02, 0x2F, 0x7E, + 0x0E, 0x00, 0x26, 0x71, 0xA1, 0x67, 0x24, 0xE1, 0x24, 0xC1, 0xC4, 0xCD, 0x92, 0xCA, 0x24, 0xD1, + 0xCC, 0xD0, 0x12, 0x00, 0x92, 0xC5, 0xC4, 0xE0, 0x82, 0x2F, 0x04, 0x23, 0xAB, 0xB6, 0x00, 0x00, + 0x04, 0x21, 0xCB, 0xAF, 0x00, 0x00, 0x04, 0x21, 0xCB, 0xAE, 0x00, 0x00, 0x34, 0xE1, 0x26, 0xEE, + 0x14, 0xF2, 0x08, 0x50, 0x00, 0x30, 0x26, 0xE1, 0x26, 0xF1, 0x2C, 0x50, 0x00, 0x42, 0x20, 0x4E, + 0x0C, 0x20, 0x3C, 0x00, 0x06, 0x34, 0x57, 0x31, 0x26, 0x35, 0x30, 0x73, 0x5C, 0x70, 0xFF, 0x0F, + 0x26, 0x27, 0xCC, 0x20, 0xFF, 0x0F, 0x06, 0x62, 0xC2, 0x03, 0x0C, 0x60, 0xFF, 0x0F, 0x34, 0xE2, + 0x57, 0x68, 0xC6, 0xEF, 0x66, 0x67, 0xB1, 0x63, 0x92, 0xEB, 0x18, 0x20, 0x09, 0x11, 0xB9, 0x41, + 0x00, 0x02, 0xAB, 0xB6, 0x00, 0x00, 0x58, 0xC1, 0x14, 0x02, 0x58, 0x81, 0x04, 0x02, 0x2C, 0x10, + 0x24, 0x02, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x30, 0x0C, 0x70, 0x00, 0x42, 0x0C, 0x40, 0xA8, 0x45, + 0x26, 0x76, 0x26, 0x46, 0x30, 0x57, 0x0C, 0x60, 0x3C, 0x00, 0x5C, 0x50, 0xFF, 0x0F, 0x26, 0x65, + 0x57, 0x68, 0x66, 0x65, 0xB1, 0x67, 0x24, 0x74, 0xC6, 0x74, 0x92, 0xF5, 0xE1, 0xF0, 0x00, 0x00, + 0x98, 0x50, 0x07, 0x09, 0x38, 0x60, 0xE4, 0x10, 0x18, 0x46, 0x76, 0x00, 0x18, 0x76, 0x75, 0x00, + 0x92, 0x09, 0x98, 0x50, 0x08, 0x09, 0x82, 0x06, 0x26, 0x65, 0x18, 0x66, 0x92, 0x00, 0x26, 0x76, + 0x13, 0x77, 0x98, 0x60, 0x08, 0x11, 0x82, 0x05, 0x24, 0x71, 0x24, 0x41, 0x13, 0x77, 0x13, 0x44, + 0x10, 0x62, 0x04, 0x50, 0xC6, 0x65, 0x82, 0x14, 0xC6, 0x67, 0xA2, 0x12, 0xCC, 0x60, 0x13, 0x00, + 0xC2, 0x0B, 0x24, 0x41, 0x06, 0x74, 0x57, 0x71, 0x57, 0x42, 0x26, 0x47, 0xC6, 0x64, 0x1C, 0x70, + 0x10, 0x00, 0x32, 0x04, 0xF2, 0x05, 0x0C, 0x70, 0x13, 0x00, 0x91, 0x72, 0x04, 0x51, 0x06, 0x25, + 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x40, 0x80, 0x08, 0x30, 0x74, 0x18, 0x60, 0x9A, 0x08, 0x08, 0x50, + 0x0F, 0x00, 0x2C, 0x50, 0xFF, 0xFF, 0x24, 0x71, 0x56, 0x75, 0x08, 0x50, 0x00, 0x3C, 0x66, 0x75, + 0x06, 0x56, 0x57, 0x5A, 0x08, 0x30, 0xF0, 0x00, 0x16, 0x66, 0x56, 0x53, 0xF7, 0x6F, 0x66, 0x75, + 0x57, 0x6A, 0xB1, 0x74, 0x6C, 0x60, 0x75, 0x00, 0xD7, 0x7A, 0x66, 0x67, 0x08, 0x70, 0x00, 0x30, + 0xB9, 0x67, 0x00, 0x01, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x80, 0x02, 0x04, 0x30, + 0x0C, 0x40, 0x00, 0x02, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x04, + 0x04, 0x30, 0x0C, 0x40, 0x00, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x06, + 0x04, 0x30, 0x0C, 0x40, 0x00, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0xCB, 0x18, 0x01, 0x00, 0x08, 0x70, 0x00, 0x80, + 0x18, 0x27, 0x08, 0x78, 0xAB, 0xBC, 0x02, 0x00, 0xCB, 0xAD, 0x01, 0x00, 0x0C, 0x70, 0x14, 0x00, + 0xA9, 0x70, 0xA4, 0x08, 0x38, 0x70, 0xE4, 0x10, 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0xF5, 0x0A, + 0x4B, 0x30, 0x03, 0x00, 0x99, 0x00, 0xEC, 0x0A, 0xEB, 0x99, 0x01, 0x00, 0x38, 0x70, 0xE4, 0x10, + 0x40, 0xE1, 0x18, 0x67, 0xB9, 0x00, 0x99, 0x60, 0x08, 0x10, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x14, 0x61, 0xB1, 0xF1, 0x99, 0x60, 0x09, 0x10, 0xCB, 0xBF, 0x02, 0x00, 0x0B, 0x14, + 0x02, 0x00, 0x6B, 0x2F, 0x01, 0x00, 0x2B, 0x30, 0x01, 0x00, 0x0B, 0x13, 0x03, 0x00, 0x30, 0xF1, + 0x99, 0x00, 0x9B, 0x08, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x58, 0x10, 0x04, 0x30, + 0x0C, 0x40, 0x34, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x0B, 0x2C, 0x01, 0x00, 0x2B, 0x14, 0x02, 0x00, + 0xAB, 0xE9, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x85, 0x08, + 0x34, 0x18, 0xC1, 0xE1, 0x82, 0x0A, 0x18, 0x60, 0x85, 0x0C, 0xCC, 0x60, 0xC7, 0x00, 0xD2, 0x2E, + 0x24, 0x61, 0x99, 0x60, 0x85, 0x0C, 0xF2, 0x2A, 0x14, 0x61, 0x99, 0x00, 0x85, 0x0C, 0x99, 0x60, + 0x09, 0x10, 0x38, 0x60, 0xD4, 0x10, 0x06, 0xE7, 0xC4, 0x64, 0xC2, 0x09, 0x2B, 0x30, 0x01, 0x00, + 0x6B, 0x2F, 0x01, 0x00, 0xCB, 0xBF, 0x02, 0x00, 0x0B, 0x13, 0x03, 0x00, 0x99, 0x00, 0x8C, 0x0C, + 0x99, 0x00, 0x93, 0x0C, 0x14, 0x71, 0x99, 0x70, 0x89, 0x0C, 0x99, 0x70, 0x88, 0x0C, 0x38, 0x70, + 0xD0, 0x10, 0x0C, 0x60, 0x14, 0x00, 0xC6, 0x76, 0xD2, 0x03, 0x34, 0x71, 0x13, 0x67, 0x38, 0x70, + 0xD4, 0x10, 0xC6, 0x76, 0xC2, 0x03, 0x0B, 0x14, 0x02, 0x00, 0x98, 0x70, 0x0B, 0x11, 0x82, 0x1A, + 0x28, 0x70, 0x86, 0x08, 0x1C, 0x60, 0xE1, 0x00, 0x56, 0x76, 0xA9, 0x70, 0x86, 0x08, 0x2B, 0x1F, + 0x01, 0x00, 0x6B, 0xDA, 0x02, 0x00, 0x6B, 0xDD, 0x02, 0x00, 0x0B, 0x13, 0x03, 0x00, 0x38, 0x70, + 0xE4, 0x10, 0x99, 0x00, 0x9A, 0x08, 0x18, 0x67, 0x55, 0x00, 0x99, 0x00, 0x5E, 0x09, 0x99, 0x60, + 0xF5, 0x0A, 0x38, 0x50, 0x58, 0x10, 0x06, 0x75, 0x18, 0x40, 0x86, 0x0C, 0x77, 0x76, 0x54, 0x7F, + 0xC6, 0x47, 0x32, 0x04, 0x99, 0x70, 0x86, 0x0C, 0xF2, 0x07, 0x06, 0x75, 0xDC, 0x70, 0x00, 0xF0, + 0x92, 0x03, 0x99, 0x00, 0x86, 0x0C, 0x98, 0x70, 0xBE, 0x10, 0x82, 0x0A, 0x18, 0x70, 0x9B, 0x08, + 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x07, 0x24, 0x71, 0x99, 0x70, 0x9B, 0x08, 0xF2, 0x03, 0x99, 0x00, + 0x9B, 0x08, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0x2B, 0x1F, 0x01, 0x00, + 0x0B, 0x9C, 0x02, 0x00, 0x6B, 0xB9, 0x02, 0x00, 0x0B, 0x19, 0x02, 0x00, 0x6B, 0xEB, 0x01, 0x00, + 0x2B, 0x7E, 0x01, 0x00, 0x2B, 0x37, 0x01, 0x00, 0x98, 0x70, 0x84, 0x0C, 0x82, 0x07, 0x99, 0x00, + 0x8A, 0x10, 0xEB, 0x1F, 0x01, 0x00, 0x04, 0x20, 0xF2, 0x1A, 0x38, 0x70, 0xE4, 0x10, 0x98, 0x77, + 0xA6, 0x00, 0x92, 0x06, 0x8B, 0xAE, 0x01, 0x00, 0xEB, 0xA1, 0x01, 0x00, 0xF2, 0x05, 0xEB, 0xA1, + 0x01, 0x00, 0x8B, 0xAE, 0x01, 0x00, 0x6B, 0xF5, 0x02, 0x00, 0x6B, 0xDD, 0x02, 0x00, 0x8B, 0xD6, + 0x02, 0x00, 0x6B, 0x02, 0x03, 0x00, 0x8B, 0xE2, 0x02, 0x00, 0x04, 0x21, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x20, 0xBE, 0x10, 0x18, 0x30, 0x8A, 0x10, 0x34, 0x14, 0xB1, 0xF1, + 0x8B, 0x33, 0x03, 0x00, 0x4B, 0x1A, 0x03, 0x00, 0xEB, 0x12, 0x03, 0x00, 0x4B, 0x07, 0x03, 0x00, + 0xEB, 0x0F, 0x03, 0x00, 0xEB, 0x1F, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0x0C, 0x20, 0x6B, 0x0C, 0x04, 0x30, 0x04, 0x4B, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x0B, 0x04, 0x30, 0x0C, 0x40, 0xB0, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x80, 0x08, 0x99, 0x0E, 0x01, 0x04, 0x0C, 0x20, 0xDA, 0x0F, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x83, 0x07, 0x0C, 0x20, + 0x58, 0x10, 0x04, 0x30, 0x04, 0x44, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x5C, 0x10, + 0x04, 0x30, 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x0A, 0x08, + 0xA9, 0x0E, 0x08, 0x08, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, + 0xFE, 0x08, 0x04, 0x30, 0x04, 0x4C, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0xE4, 0x10, 0x34, 0x14, 0xB1, 0xF1, + 0x0C, 0x70, 0x80, 0x08, 0x98, 0x57, 0x0F, 0x04, 0x28, 0x26, 0x72, 0x00, 0x82, 0x04, 0x28, 0x26, + 0x7A, 0x00, 0xF2, 0x08, 0x98, 0x77, 0x10, 0x04, 0x82, 0x05, 0x28, 0x76, 0x7A, 0x00, 0x26, 0x27, + 0x23, 0x22, 0x06, 0x32, 0xEB, 0x8B, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x30, 0x00, 0xD9, 0xC1, 0x20, 0x00, 0xD9, 0x81, 0x10, 0x00, 0x06, 0xD3, 0x06, 0xA3, + 0x0C, 0xC0, 0x80, 0x08, 0x04, 0x81, 0x57, 0xD2, 0xD7, 0xA1, 0x26, 0xDC, 0x26, 0xAC, 0xB1, 0x51, + 0x26, 0x84, 0x04, 0xB8, 0x0C, 0x50, 0xE6, 0x00, 0x06, 0x62, 0x26, 0xBD, 0x26, 0x5A, 0x04, 0x74, + 0x13, 0x88, 0x0C, 0x20, 0x80, 0x02, 0x06, 0xE3, 0x99, 0x8B, 0x82, 0x02, 0x06, 0x94, 0x06, 0x35, + 0x06, 0x47, 0x26, 0x2D, 0xB9, 0x61, 0x0C, 0x00, 0xB9, 0x51, 0x04, 0x00, 0xB9, 0x71, 0x08, 0x00, + 0x0B, 0x7A, 0x03, 0x00, 0x38, 0x71, 0x08, 0x00, 0x38, 0x51, 0x04, 0x00, 0x0C, 0x20, 0x84, 0x02, + 0x26, 0x2D, 0x06, 0x47, 0x06, 0x35, 0x0B, 0x7A, 0x03, 0x00, 0x28, 0x7A, 0xEA, 0x00, 0x26, 0xC9, + 0x99, 0x7B, 0x83, 0x02, 0x30, 0x71, 0x99, 0x7D, 0x8C, 0x02, 0x28, 0x7A, 0xE4, 0x00, 0xA9, 0x7B, + 0x80, 0x02, 0x38, 0x61, 0x0C, 0x00, 0x26, 0x6E, 0x91, 0x86, 0x24, 0xE1, 0x99, 0xEC, 0xEB, 0x03, + 0x99, 0x0C, 0xE0, 0x03, 0x58, 0xC1, 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x8C, 0x02, 0xD9, 0xC1, 0x7C, 0x02, 0x38, 0x70, 0xE4, 0x10, + 0xD9, 0x81, 0x6C, 0x02, 0x0C, 0x50, 0x75, 0x00, 0x0C, 0x60, 0x77, 0x00, 0x0C, 0x40, 0x78, 0x00, + 0x26, 0x57, 0x26, 0x67, 0x26, 0x47, 0x10, 0x55, 0x18, 0xE7, 0x76, 0x00, 0x10, 0x66, 0x10, 0x74, + 0xB9, 0x51, 0x40, 0x02, 0x04, 0xD0, 0xB9, 0x61, 0x4C, 0x02, 0xB9, 0x71, 0x54, 0x02, 0x0C, 0xB0, + 0xBC, 0x0B, 0x06, 0xAD, 0x0C, 0x90, 0x80, 0x08, 0x18, 0x79, 0x02, 0x04, 0x06, 0x89, 0xC6, 0xA7, + 0x32, 0x0F, 0x14, 0x72, 0x26, 0x7B, 0x90, 0x77, 0x82, 0x07, 0x06, 0x2B, 0x8B, 0x13, 0x01, 0x00, + 0xC4, 0x20, 0x82, 0x02, 0x24, 0xD1, 0x24, 0xA1, 0x2C, 0xB0, 0x10, 0x00, 0xF2, 0xEE, 0xC4, 0xD0, + 0x99, 0x09, 0x88, 0x00, 0x78, 0x29, 0x7E, 0x00, 0x78, 0x59, 0x82, 0x00, 0x78, 0x39, 0x80, 0x00, + 0x78, 0x69, 0x84, 0x00, 0x82, 0x22, 0x3F, 0x55, 0x02, 0x00, 0xC4, 0x50, 0x38, 0x40, 0xE4, 0x10, + 0x32, 0x02, 0x16, 0x55, 0x28, 0x24, 0x86, 0x00, 0x43, 0x55, 0xC6, 0x52, 0x32, 0x16, 0x3F, 0x66, + 0x03, 0x00, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0x28, 0x54, 0x88, 0x00, 0x43, 0x66, 0xC6, 0x65, + 0x32, 0x03, 0x04, 0x61, 0xF2, 0x08, 0x28, 0x54, 0x8A, 0x00, 0xC6, 0x65, 0x32, 0x03, 0x04, 0x62, + 0xF2, 0x02, 0x04, 0x63, 0x99, 0x68, 0x88, 0x00, 0x98, 0x68, 0x87, 0x00, 0x92, 0x0F, 0x98, 0x68, + 0x88, 0x00, 0x82, 0x0C, 0x38, 0x50, 0xE4, 0x10, 0x26, 0x65, 0x18, 0x66, 0x92, 0x00, 0x38, 0x51, + 0x40, 0x02, 0x26, 0x65, 0x13, 0x66, 0xB9, 0x61, 0x40, 0x02, 0x38, 0x60, 0xE4, 0x10, 0x18, 0x58, + 0x05, 0x04, 0x18, 0x66, 0x92, 0x00, 0xC6, 0x56, 0xB2, 0x07, 0x98, 0x68, 0x86, 0x00, 0x82, 0x04, + 0x04, 0x61, 0x99, 0x68, 0x87, 0x00, 0x98, 0x60, 0x08, 0x11, 0x82, 0x0F, 0x38, 0x61, 0x40, 0x02, + 0x24, 0xE1, 0x24, 0x61, 0x13, 0x66, 0xB9, 0x61, 0x40, 0x02, 0x38, 0x61, 0x4C, 0x02, 0x13, 0xEE, + 0x24, 0x61, 0x13, 0x66, 0xB9, 0x61, 0x4C, 0x02, 0x0C, 0x20, 0x28, 0x02, 0x26, 0x21, 0x04, 0x30, + 0x04, 0x4B, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x68, 0x06, 0x00, 0xDC, 0x60, 0xE0, 0x00, + 0x82, 0x0A, 0x0B, 0x2C, 0x01, 0x00, 0x6B, 0xDA, 0x02, 0x00, 0x04, 0x61, 0x99, 0x68, 0xE2, 0x00, + 0xFA, 0x90, 0x02, 0x00, 0x98, 0x68, 0x03, 0x04, 0x99, 0x08, 0xE2, 0x00, 0x82, 0x04, 0x34, 0x61, + 0x99, 0x68, 0x03, 0x04, 0x98, 0xD8, 0x04, 0x00, 0x92, 0x05, 0x98, 0x68, 0x02, 0x04, 0x8A, 0x81, + 0x02, 0x00, 0x98, 0x38, 0x02, 0x04, 0x92, 0x1D, 0x0C, 0x20, 0xB0, 0x0B, 0x0C, 0x40, 0xB0, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x98, 0xE8, 0x03, 0x04, 0x9A, 0x73, 0x02, 0x00, 0xC6, 0xED, + 0x32, 0x0C, 0x0C, 0x20, 0x28, 0x02, 0x06, 0x3E, 0x06, 0x4E, 0x26, 0x21, 0x0C, 0x50, 0x14, 0x00, + 0x0B, 0x32, 0x01, 0x00, 0x24, 0xE1, 0xF2, 0xF4, 0x99, 0xD8, 0x01, 0x04, 0xFA, 0x62, 0x02, 0x00, + 0x0C, 0x20, 0x10, 0x02, 0x26, 0x21, 0x04, 0x4C, 0x04, 0x31, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x18, 0x28, 0x02, 0x04, 0x04, 0x60, 0x06, 0x48, 0xB9, 0x61, 0x44, 0x02, 0x06, 0x56, 0xC6, 0x52, + 0x32, 0x12, 0x18, 0x34, 0x3C, 0x03, 0xCC, 0x30, 0x13, 0x00, 0xC2, 0x04, 0x04, 0x71, 0xB9, 0x71, + 0x44, 0x02, 0x34, 0x31, 0xCC, 0x30, 0x12, 0x00, 0xD2, 0x02, 0x04, 0x61, 0x24, 0x51, 0x2C, 0x40, + 0x10, 0x00, 0xF2, 0xEE, 0xC4, 0x60, 0x82, 0x04, 0x04, 0x50, 0xB9, 0x51, 0x44, 0x02, 0x4B, 0x30, + 0x01, 0x00, 0x38, 0x60, 0xE4, 0x10, 0xB9, 0x21, 0x3C, 0x02, 0x18, 0xC6, 0x74, 0x00, 0x06, 0x3C, + 0xEB, 0x93, 0x00, 0x00, 0x06, 0x3C, 0xEB, 0x93, 0x00, 0x00, 0x24, 0xE2, 0x06, 0x6E, 0x57, 0x61, + 0x57, 0xE2, 0x26, 0x6E, 0xB9, 0x61, 0x58, 0x02, 0x04, 0x70, 0x04, 0x62, 0x14, 0x51, 0xB9, 0x21, + 0x50, 0x02, 0xB9, 0x61, 0x34, 0x02, 0xB9, 0x71, 0x48, 0x02, 0xB9, 0x51, 0x38, 0x02, 0x38, 0xE1, + 0x34, 0x02, 0x06, 0x21, 0x34, 0xE1, 0x13, 0x6E, 0x14, 0x31, 0x0C, 0x40, 0x10, 0x02, 0xB9, 0x61, + 0x34, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x1C, 0x02, 0x26, 0x21, 0x14, 0x31, + 0x04, 0x4B, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x51, 0x04, 0xB0, 0xC6, 0xBD, 0x32, 0x65, + 0xB8, 0x71, 0x34, 0x02, 0x38, 0xE1, 0x3C, 0x02, 0x92, 0x06, 0xB8, 0x61, 0x44, 0x02, 0x92, 0x03, + 0x38, 0xE1, 0x50, 0x02, 0x0C, 0x70, 0x1C, 0x02, 0x06, 0x9B, 0x26, 0x71, 0xD7, 0x91, 0x26, 0x7B, + 0x26, 0x98, 0x0C, 0xC0, 0x80, 0x08, 0x04, 0xA1, 0xB9, 0x71, 0x5C, 0x02, 0x18, 0x68, 0x02, 0x04, + 0x14, 0x41, 0x26, 0x4A, 0xC6, 0x46, 0x32, 0x45, 0x98, 0x6C, 0x3A, 0x03, 0x82, 0x3E, 0x0C, 0x20, + 0x3C, 0x03, 0x26, 0x2C, 0xB9, 0x51, 0x68, 0x02, 0x8B, 0x13, 0x01, 0x00, 0x38, 0x61, 0x34, 0x02, + 0x38, 0x51, 0x68, 0x02, 0xC6, 0x26, 0x92, 0x31, 0x78, 0x2C, 0x34, 0x03, 0x78, 0x69, 0xE6, 0x00, + 0x36, 0x26, 0xC4, 0x20, 0x32, 0x02, 0x16, 0x22, 0x78, 0x4C, 0x36, 0x03, 0x78, 0x69, 0xE8, 0x00, + 0x3F, 0x66, 0x04, 0x00, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0x06, 0x32, 0xB9, 0x51, 0x68, 0x02, + 0xB9, 0x61, 0x60, 0x02, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x61, 0x60, 0x02, 0x06, 0x42, 0x06, 0x36, + 0x06, 0x26, 0xB9, 0x41, 0x64, 0x02, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x41, 0x64, 0x02, 0x38, 0x51, + 0x68, 0x02, 0x26, 0x24, 0xC6, 0x2E, 0x32, 0x05, 0x38, 0x71, 0x5C, 0x02, 0x06, 0xE2, 0x91, 0xA7, + 0x06, 0x6A, 0x57, 0x61, 0x26, 0x65, 0xB1, 0x26, 0x24, 0xA1, 0x2C, 0xC0, 0x10, 0x00, 0xF2, 0xB7, + 0x24, 0xB1, 0x2C, 0x50, 0x30, 0x00, 0xF2, 0x9B, 0x04, 0x70, 0xC6, 0x7D, 0x3A, 0xDA, 0x00, 0x00, + 0xB8, 0x61, 0x34, 0x02, 0x38, 0x51, 0x3C, 0x02, 0x92, 0x09, 0xB8, 0x51, 0x44, 0x02, 0x82, 0x04, + 0x38, 0x51, 0x3C, 0x02, 0xF2, 0x03, 0x38, 0x51, 0x50, 0x02, 0x04, 0x31, 0x04, 0x60, 0x0C, 0x40, + 0x28, 0x02, 0x26, 0x41, 0x26, 0x46, 0x90, 0xF4, 0x92, 0x18, 0x0C, 0x40, 0x1C, 0x02, 0x26, 0x41, + 0x26, 0x46, 0x60, 0x24, 0x2F, 0x46, 0x06, 0x00, 0x26, 0x46, 0x57, 0x41, 0x26, 0x42, 0x57, 0x41, + 0x26, 0x41, 0x30, 0x44, 0xC6, 0x45, 0x32, 0x09, 0xC4, 0x40, 0x22, 0x07, 0xC4, 0x20, 0x22, 0x05, + 0x06, 0x54, 0xB9, 0x61, 0x38, 0x02, 0x06, 0x3F, 0x24, 0x61, 0xC6, 0x6D, 0x22, 0xE1, 0xC4, 0x30, + 0x9A, 0xA5, 0x00, 0x00, 0x38, 0xE1, 0x38, 0x02, 0x38, 0x61, 0x48, 0x02, 0x57, 0xE2, 0x24, 0x61, + 0x26, 0xE8, 0xB9, 0x61, 0x48, 0x02, 0x98, 0x6E, 0x8A, 0x02, 0x0C, 0xA0, 0x80, 0x02, 0x26, 0xAE, + 0x9A, 0x95, 0x00, 0x00, 0x38, 0x51, 0x38, 0x02, 0x0C, 0x60, 0x1C, 0x02, 0x26, 0x61, 0x26, 0x65, + 0x60, 0xC6, 0xB9, 0x71, 0x60, 0x02, 0x04, 0x3A, 0x26, 0x3C, 0x57, 0x32, 0x26, 0x38, 0x06, 0x2A, + 0x2C, 0x30, 0x80, 0x02, 0x0C, 0x40, 0x10, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0xB1, + 0x38, 0x02, 0x0C, 0x90, 0xE6, 0x00, 0xD7, 0xB1, 0x26, 0xB8, 0x26, 0x9B, 0x06, 0x39, 0x04, 0x44, + 0x06, 0x2A, 0x0B, 0x7A, 0x03, 0x00, 0x28, 0x6B, 0xEA, 0x00, 0x04, 0x24, 0x99, 0x6E, 0x8B, 0x02, + 0x26, 0x2A, 0x06, 0x39, 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, 0x28, 0x6B, 0xE4, 0x00, 0x38, 0x51, + 0x40, 0x02, 0xA9, 0x6E, 0x88, 0x02, 0x18, 0x6E, 0x8C, 0x02, 0x38, 0x71, 0x60, 0x02, 0xC6, 0x56, + 0x22, 0x04, 0x24, 0x61, 0x99, 0x6E, 0x8C, 0x02, 0x18, 0x6E, 0x8C, 0x02, 0xCC, 0x60, 0x13, 0x00, + 0xC2, 0x09, 0x38, 0x51, 0x58, 0x02, 0xC6, 0x65, 0x32, 0x05, 0x2C, 0x60, 0x14, 0x00, 0x99, 0x6E, + 0x8C, 0x02, 0x38, 0x41, 0x38, 0x02, 0x18, 0x6E, 0x8A, 0x02, 0x18, 0xF8, 0x02, 0x04, 0x0C, 0x50, + 0x28, 0x02, 0x26, 0x51, 0x26, 0x54, 0x91, 0x65, 0x06, 0x54, 0x34, 0x61, 0x26, 0x68, 0x24, 0x51, + 0x99, 0x56, 0xEB, 0x03, 0x99, 0x06, 0xE0, 0x03, 0x0C, 0x60, 0x10, 0x02, 0x26, 0x61, 0x26, 0x6C, + 0x91, 0x06, 0x57, 0xC1, 0x06, 0x41, 0x04, 0x60, 0x14, 0xE1, 0x2F, 0x5C, 0x04, 0x00, 0xB1, 0xE5, + 0xB8, 0x51, 0x34, 0x02, 0x38, 0x31, 0x3C, 0x02, 0x92, 0x06, 0xB8, 0x51, 0x44, 0x02, 0x92, 0x03, + 0x38, 0x31, 0x50, 0x02, 0x0C, 0x50, 0x28, 0x02, 0x26, 0x51, 0x26, 0x56, 0x90, 0x55, 0x82, 0x07, + 0x24, 0x61, 0xC6, 0x6D, 0x2C, 0x40, 0x30, 0x00, 0x22, 0xE9, 0xF2, 0x12, 0x0C, 0xB0, 0x1C, 0x02, + 0x26, 0xB1, 0x26, 0xB6, 0xC6, 0x5F, 0x32, 0xF5, 0x24, 0x51, 0x06, 0x25, 0x57, 0x21, 0x26, 0x24, + 0xB0, 0x22, 0x22, 0xF9, 0xC6, 0x23, 0x32, 0xF7, 0x91, 0x5B, 0x06, 0x32, 0xF2, 0xF4, 0x18, 0x68, + 0x02, 0x04, 0x38, 0x51, 0x48, 0x02, 0xC6, 0x56, 0x32, 0x04, 0x24, 0x71, 0xFA, 0x27, 0xFF, 0xFF, + 0xB8, 0x61, 0x34, 0x02, 0x9A, 0xA5, 0xFE, 0xFF, 0x99, 0x08, 0x04, 0x04, 0x0C, 0xA0, 0xBC, 0x0B, + 0x06, 0xE6, 0x06, 0xC6, 0x06, 0xB6, 0x18, 0x58, 0x02, 0x04, 0xC6, 0xC5, 0x32, 0x0C, 0x0C, 0x50, + 0x10, 0x02, 0x24, 0xC1, 0x26, 0x51, 0x26, 0x5C, 0x90, 0x55, 0x82, 0x76, 0x2F, 0x5B, 0x0D, 0x00, + 0xC4, 0x5A, 0x02, 0x0F, 0x28, 0x68, 0x06, 0x00, 0x04, 0x54, 0xD6, 0x56, 0x82, 0x71, 0x38, 0x51, + 0x54, 0x02, 0x14, 0x75, 0x56, 0x67, 0x99, 0x58, 0x03, 0x04, 0xA9, 0x68, 0x06, 0x00, 0xF2, 0x68, + 0x14, 0x42, 0x26, 0x4A, 0x10, 0x44, 0x38, 0x71, 0x4C, 0x02, 0x06, 0x94, 0x34, 0x91, 0xB9, 0x41, + 0x34, 0x02, 0x26, 0x98, 0x0C, 0x40, 0x60, 0x01, 0x26, 0x49, 0x18, 0x24, 0x80, 0x02, 0x14, 0x3C, + 0xC6, 0x27, 0x26, 0x3A, 0xB2, 0x3C, 0xC4, 0xBA, 0x12, 0x3A, 0x06, 0x2A, 0xB9, 0x31, 0x60, 0x02, + 0xB9, 0x41, 0x64, 0x02, 0xB9, 0x51, 0x68, 0x02, 0x8B, 0x13, 0x01, 0x00, 0xC4, 0x20, 0x38, 0x31, + 0x60, 0x02, 0x38, 0x41, 0x64, 0x02, 0x38, 0x51, 0x68, 0x02, 0x82, 0x29, 0x18, 0x24, 0x80, 0x02, + 0x24, 0xB1, 0x24, 0x21, 0x99, 0x24, 0x80, 0x02, 0x06, 0x25, 0x57, 0x22, 0x26, 0x28, 0x0C, 0x40, + 0x10, 0x00, 0x2C, 0x20, 0x80, 0x02, 0xB9, 0x51, 0x68, 0x02, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, + 0x38, 0x51, 0x68, 0x02, 0x38, 0x61, 0x34, 0x02, 0x0C, 0x40, 0x28, 0x02, 0x26, 0x41, 0x26, 0x45, + 0x24, 0x51, 0x99, 0x59, 0xEB, 0x03, 0x98, 0x58, 0x1A, 0x00, 0x91, 0x64, 0x04, 0x71, 0x99, 0x78, + 0x04, 0x04, 0x24, 0xE1, 0x92, 0x19, 0x99, 0x78, 0x1A, 0x00, 0xF2, 0x16, 0x06, 0x2A, 0x8B, 0x13, + 0x01, 0x00, 0xC4, 0x20, 0x82, 0x11, 0x04, 0x41, 0x99, 0x48, 0x86, 0x00, 0x10, 0x5A, 0xCC, 0x50, + 0x13, 0x00, 0xC2, 0x0A, 0x18, 0x58, 0x02, 0x04, 0xC4, 0x51, 0x92, 0x06, 0x28, 0x58, 0x06, 0x00, + 0x64, 0x54, 0xA9, 0x58, 0x06, 0x00, 0x2C, 0xA0, 0x10, 0x00, 0xFA, 0x7E, 0xFF, 0xFF, 0x0C, 0x90, + 0x0C, 0x0B, 0x04, 0xC0, 0x04, 0xA1, 0xC6, 0xCD, 0x32, 0x28, 0x0C, 0x60, 0x28, 0x02, 0x26, 0x61, + 0x26, 0x6C, 0x90, 0x46, 0x92, 0x15, 0x06, 0x6B, 0x0C, 0x60, 0x6B, 0x0C, 0xE0, 0x56, 0x92, 0x0C, + 0xE8, 0x56, 0x0B, 0x00, 0x92, 0x09, 0x0C, 0x20, 0x28, 0x02, 0x26, 0x21, 0x06, 0x3C, 0x04, 0x51, + 0x0B, 0x32, 0x01, 0x00, 0xF2, 0x05, 0x24, 0x41, 0xC4, 0x4B, 0x24, 0x61, 0x92, 0xF0, 0x98, 0x68, + 0x03, 0x04, 0x82, 0x07, 0x06, 0x29, 0x8B, 0x13, 0x01, 0x00, 0xC4, 0x20, 0x92, 0x02, 0x91, 0xA9, + 0x24, 0xC1, 0x2C, 0x90, 0x10, 0x00, 0xF2, 0xD8, 0x26, 0xDE, 0x99, 0xD8, 0x01, 0x04, 0xF2, 0x03, + 0x99, 0x08, 0x04, 0x04, 0x58, 0xC1, 0x7C, 0x02, 0x58, 0x81, 0x6C, 0x02, 0x2C, 0x10, 0x8C, 0x02, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0xE4, 0x10, 0x3C, 0x10, 0x00, 0x01, 0xD9, 0xC1, 0xF0, 0x00, + 0xD9, 0x81, 0xE0, 0x00, 0x18, 0xA7, 0x47, 0x00, 0x18, 0xE7, 0x46, 0x00, 0x2F, 0xDA, 0x0A, 0x00, + 0x16, 0x7D, 0xB9, 0x71, 0xA8, 0x00, 0x24, 0x7D, 0xB9, 0x71, 0xA4, 0x00, 0x0C, 0x70, 0x50, 0x00, + 0x26, 0x71, 0x0C, 0xB0, 0x80, 0x08, 0x06, 0x27, 0x0C, 0x30, 0x50, 0x00, 0xB9, 0x71, 0xD8, 0x00, + 0xA9, 0x0B, 0x76, 0x02, 0xB9, 0x0B, 0x78, 0x02, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x21, + 0x0C, 0x30, 0x50, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x2F, 0x5E, 0x0E, 0x00, 0x2F, 0x6E, + 0x05, 0x00, 0x26, 0x5B, 0x57, 0x61, 0xB9, 0x51, 0xAC, 0x00, 0x04, 0x5D, 0x36, 0x5A, 0x26, 0x6E, + 0x26, 0x6A, 0xB9, 0x51, 0xB8, 0x00, 0x04, 0x99, 0x26, 0x66, 0x0C, 0x50, 0x80, 0x02, 0x26, 0x65, + 0x36, 0x9E, 0x26, 0xDB, 0x26, 0x99, 0xB9, 0x61, 0xC4, 0x00, 0x14, 0x71, 0x0C, 0x60, 0x12, 0x00, + 0xB9, 0xD1, 0xC0, 0x00, 0x36, 0x6E, 0x04, 0xD0, 0x26, 0x79, 0x06, 0xCD, 0x06, 0x8D, 0xB9, 0xD1, + 0xA0, 0x00, 0xB9, 0x61, 0xBC, 0x00, 0xB9, 0x71, 0xC8, 0x00, 0x38, 0x71, 0xB8, 0x00, 0xC6, 0xA7, + 0x3A, 0x8F, 0x00, 0x00, 0x38, 0x71, 0xC4, 0x00, 0x0C, 0x50, 0x50, 0x00, 0x26, 0x7D, 0xB9, 0x71, + 0xB0, 0x00, 0x38, 0x71, 0xC0, 0x00, 0x04, 0x60, 0x26, 0x7D, 0x26, 0x51, 0xB9, 0x71, 0xB4, 0x00, + 0x26, 0x5C, 0x06, 0x76, 0x38, 0x31, 0xBC, 0x00, 0x2F, 0x4E, 0x07, 0x00, 0xC6, 0x43, 0x32, 0x1E, + 0x38, 0xF1, 0xB4, 0x00, 0x38, 0x41, 0xB0, 0x00, 0x78, 0x2F, 0x8A, 0x00, 0x38, 0xF1, 0xAC, 0x00, + 0x2F, 0x37, 0x07, 0x00, 0x26, 0x3F, 0x26, 0x46, 0x78, 0x33, 0xB2, 0x00, 0x70, 0x44, 0x26, 0x32, + 0x26, 0x43, 0x38, 0x21, 0xA0, 0x00, 0x30, 0x35, 0x26, 0x24, 0x26, 0x43, 0xB9, 0x21, 0xA0, 0x00, + 0xB1, 0x45, 0x24, 0x71, 0x2C, 0x60, 0x1A, 0x00, 0xF2, 0xDE, 0x0C, 0x70, 0x50, 0x00, 0x26, 0x71, + 0x26, 0x7C, 0x30, 0x27, 0xB9, 0x71, 0xD8, 0x00, 0x06, 0x39, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, + 0xD8, 0x00, 0x04, 0x60, 0xB1, 0x27, 0x06, 0x52, 0x06, 0x76, 0x2F, 0x4C, 0x01, 0x00, 0x38, 0x21, + 0xBC, 0x00, 0x2F, 0x3E, 0x07, 0x00, 0xC6, 0x32, 0x32, 0x31, 0x38, 0x31, 0xB0, 0x00, 0x38, 0x21, + 0xB4, 0x00, 0x26, 0x36, 0x70, 0x33, 0x78, 0xF2, 0x8A, 0x00, 0x36, 0x35, 0xB9, 0x31, 0xDC, 0x00, + 0x38, 0x31, 0xAC, 0x00, 0x2F, 0x27, 0x07, 0x00, 0x26, 0x23, 0x78, 0x22, 0xB2, 0x00, 0xB9, 0x41, + 0xD4, 0x00, 0xB9, 0x51, 0xCC, 0x00, 0x26, 0x2F, 0x38, 0xF1, 0xDC, 0x00, 0xB9, 0x61, 0xD0, 0x00, + 0xB9, 0x71, 0xD8, 0x00, 0x26, 0x2F, 0x06, 0x32, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x41, 0xD4, 0x00, + 0x38, 0x71, 0xD8, 0x00, 0x38, 0x61, 0xD0, 0x00, 0x30, 0x34, 0x38, 0x51, 0xCC, 0x00, 0x26, 0x23, + 0xB1, 0x24, 0x24, 0x71, 0x2C, 0x60, 0x1A, 0x00, 0xF2, 0xCB, 0x2F, 0x7C, 0x01, 0x00, 0x30, 0x27, + 0x38, 0x31, 0xC8, 0x00, 0xB9, 0x71, 0xD8, 0x00, 0x24, 0xA1, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, + 0xD8, 0x00, 0x26, 0x82, 0xB1, 0x27, 0x24, 0xC4, 0x24, 0xD2, 0xFA, 0x70, 0xFF, 0xFF, 0x38, 0x31, + 0xA4, 0x00, 0x06, 0x28, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x31, 0xA4, 0x00, 0x06, 0xD2, 0x06, 0x29, + 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x32, 0x38, 0x21, 0xA0, 0x00, 0x04, 0x90, 0xEB, 0x93, 0x00, 0x00, + 0x38, 0x8B, 0x78, 0x02, 0x43, 0xA2, 0x06, 0xC2, 0xA9, 0xAB, 0x76, 0x02, 0x38, 0x71, 0xA4, 0x00, + 0xC6, 0x97, 0x32, 0x0D, 0x06, 0x79, 0x57, 0x71, 0x26, 0x71, 0x30, 0x27, 0x24, 0x91, 0x3F, 0x22, + 0x0D, 0x00, 0x06, 0x32, 0xEB, 0x8B, 0x00, 0x00, 0x26, 0x82, 0xF2, 0xF1, 0x38, 0x31, 0xA8, 0x00, + 0x06, 0x28, 0x24, 0x3C, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x31, 0xB8, 0x00, 0x06, 0xDB, 0xEB, 0x93, + 0x00, 0x00, 0x0C, 0x30, 0x12, 0x00, 0x36, 0x3E, 0xEB, 0x93, 0x00, 0x00, 0x86, 0x22, 0x32, 0x03, + 0x2C, 0x20, 0xFF, 0x03, 0xC4, 0xA0, 0x67, 0x25, 0xB9, 0x2D, 0x78, 0x02, 0x92, 0x04, 0x24, 0xC1, + 0xA9, 0xCB, 0x76, 0x02, 0x58, 0xC1, 0xF0, 0x00, 0x58, 0x81, 0xE0, 0x00, 0x2C, 0x10, 0x00, 0x01, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x40, 0x00, 0xD9, 0xC1, 0x30, 0x00, 0xD9, 0x81, 0x20, 0x00, + 0x0C, 0xE0, 0x80, 0x08, 0x28, 0x6E, 0x06, 0x00, 0x0C, 0x50, 0x20, 0x00, 0x38, 0x70, 0xE4, 0x10, + 0xD6, 0x56, 0x30, 0xB7, 0x18, 0x97, 0x56, 0x00, 0x82, 0x09, 0x98, 0x5E, 0x04, 0x00, 0x92, 0x06, + 0x1C, 0x40, 0x21, 0x00, 0x56, 0x64, 0xA9, 0x6E, 0x06, 0x00, 0x28, 0x5E, 0x66, 0x02, 0x28, 0x67, + 0x6C, 0x00, 0xC6, 0x56, 0xC2, 0x16, 0x28, 0x5E, 0x6A, 0x02, 0x28, 0x67, 0x70, 0x00, 0xC6, 0x56, + 0xB2, 0x10, 0x28, 0x5E, 0x68, 0x02, 0x28, 0x67, 0x6E, 0x00, 0xC6, 0x56, 0xB2, 0x0A, 0x28, 0x6E, + 0x06, 0x00, 0x28, 0x77, 0x6A, 0x00, 0x6C, 0x60, 0x40, 0x00, 0xA9, 0x6E, 0x06, 0x00, 0xF2, 0x08, + 0x98, 0x7E, 0x04, 0x00, 0x92, 0x0F, 0xE8, 0x7E, 0x6C, 0x02, 0x02, 0x05, 0x34, 0x71, 0x99, 0x7E, + 0x6C, 0x02, 0xF2, 0x08, 0x28, 0x7E, 0x06, 0x00, 0x1C, 0x50, 0x41, 0x00, 0x56, 0x75, 0xA9, 0x7E, + 0x06, 0x00, 0x0C, 0x70, 0x00, 0x20, 0xD6, 0x7B, 0x8A, 0x8E, 0x00, 0x00, 0x18, 0x7E, 0x02, 0x04, + 0x04, 0xA1, 0xC4, 0x70, 0x92, 0x05, 0x18, 0xAE, 0x04, 0x00, 0x16, 0xAA, 0xF7, 0xAF, 0x2B, 0x6B, + 0x01, 0x00, 0x98, 0x8E, 0x04, 0x00, 0x82, 0x3D, 0x38, 0xD0, 0xE4, 0x10, 0x28, 0x7E, 0x08, 0x00, + 0x28, 0x6D, 0x4C, 0x00, 0xC6, 0x67, 0xC2, 0x35, 0x78, 0x6E, 0x76, 0x02, 0xB9, 0x71, 0x14, 0x00, + 0x06, 0x57, 0xD7, 0x51, 0x2F, 0x27, 0x07, 0x00, 0x26, 0x25, 0x06, 0x36, 0xB9, 0x61, 0x18, 0x00, + 0xEB, 0x93, 0x00, 0x00, 0x18, 0x5D, 0x4E, 0x00, 0x38, 0x61, 0x18, 0x00, 0x38, 0x71, 0x14, 0x00, + 0xC6, 0x25, 0x32, 0x1F, 0x3F, 0x26, 0x07, 0x00, 0x04, 0x3A, 0xEB, 0x93, 0x00, 0x00, 0x18, 0x7D, + 0x4F, 0x00, 0xC6, 0x27, 0x32, 0x16, 0x28, 0x6E, 0x70, 0x02, 0x18, 0x7D, 0x50, 0x00, 0xC6, 0x67, + 0xC2, 0x10, 0x78, 0x7D, 0x52, 0x00, 0x38, 0x6E, 0x78, 0x02, 0xC6, 0x67, 0x32, 0x0A, 0x98, 0x7E, + 0xDE, 0x00, 0x92, 0x07, 0x28, 0x7E, 0x7C, 0x02, 0xCC, 0x70, 0x13, 0x00, 0xCA, 0x0F, 0x01, 0x00, + 0x38, 0x60, 0xE4, 0x10, 0x38, 0x5E, 0x78, 0x02, 0x18, 0x76, 0x54, 0x00, 0xC6, 0x57, 0x22, 0x13, + 0xC4, 0x80, 0x82, 0x11, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x80, 0x00, 0x92, 0x0C, 0x18, 0x7E, + 0x75, 0x02, 0x18, 0x66, 0x57, 0x00, 0xC6, 0x67, 0xC2, 0x06, 0xC6, 0x79, 0xC2, 0x04, 0x24, 0x71, + 0x99, 0x7E, 0x75, 0x02, 0x18, 0x7E, 0x75, 0x02, 0xC6, 0x79, 0x28, 0x7E, 0x06, 0x00, 0xD2, 0x0C, + 0xC4, 0xA1, 0x92, 0x0A, 0x6C, 0x70, 0x80, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, 0xE4, 0x10, + 0x18, 0x77, 0x58, 0x00, 0xF2, 0x16, 0x0C, 0x60, 0x80, 0x00, 0xD6, 0x67, 0x82, 0x14, 0x98, 0x6E, + 0x74, 0x02, 0x92, 0x0D, 0x1C, 0x60, 0x81, 0x00, 0x56, 0x76, 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, + 0xE4, 0x10, 0x18, 0x77, 0x55, 0x00, 0x99, 0x7E, 0x75, 0x02, 0xF2, 0x05, 0x06, 0x76, 0x34, 0x71, + 0x99, 0x7E, 0x74, 0x02, 0x98, 0x5E, 0x04, 0x00, 0x8A, 0xDA, 0x00, 0x00, 0x38, 0x20, 0xE4, 0x10, + 0x28, 0x3E, 0x06, 0x00, 0x0C, 0x70, 0x60, 0x00, 0x26, 0x72, 0x10, 0x77, 0x18, 0x62, 0x5F, 0x00, + 0x0C, 0x40, 0x10, 0x00, 0xD6, 0x43, 0xB9, 0x71, 0x04, 0x00, 0x18, 0x72, 0x61, 0x00, 0x82, 0x07, + 0xC6, 0x67, 0xC2, 0x04, 0x36, 0x67, 0x13, 0x66, 0xF2, 0x02, 0x04, 0x61, 0x0C, 0x40, 0xA4, 0x01, + 0x26, 0x4E, 0x20, 0x44, 0xB1, 0x51, 0x04, 0x82, 0x04, 0x50, 0x56, 0x8B, 0x54, 0xB4, 0xB9, 0x41, + 0x08, 0x00, 0x0C, 0x70, 0xC8, 0x09, 0x06, 0xD5, 0x06, 0xC5, 0xB9, 0x81, 0x0C, 0x00, 0xB9, 0xB1, + 0x10, 0x00, 0xA8, 0x47, 0x04, 0x00, 0x82, 0x57, 0x38, 0xA1, 0x0C, 0x00, 0x04, 0xB0, 0xC6, 0xAB, + 0x82, 0x09, 0x38, 0xF1, 0x04, 0x00, 0xC6, 0x4F, 0xC2, 0x05, 0xB1, 0xB1, 0x6C, 0x30, 0x20, 0x00, + 0x04, 0xB1, 0xB8, 0x81, 0x10, 0x00, 0x82, 0x47, 0xC4, 0xB0, 0x92, 0x45, 0xC6, 0x46, 0xA2, 0x43, + 0x18, 0x42, 0x5E, 0x00, 0x38, 0xA1, 0x08, 0x00, 0xC6, 0x4A, 0xB2, 0x3D, 0x18, 0x47, 0x06, 0x00, + 0x2F, 0xF4, 0x04, 0x00, 0x26, 0xF4, 0x57, 0xF1, 0x26, 0xFE, 0xE8, 0x9F, 0xA6, 0x01, 0x02, 0x33, + 0x06, 0xA5, 0x63, 0xA4, 0xD4, 0xA1, 0x92, 0x2F, 0x70, 0x87, 0x18, 0xAF, 0xA7, 0x01, 0xB9, 0x81, + 0x1C, 0x00, 0x0C, 0x80, 0x80, 0x08, 0xD7, 0xA1, 0x26, 0xA8, 0x38, 0x81, 0x1C, 0x00, 0xA9, 0x8A, + 0xE6, 0x00, 0x78, 0x87, 0x02, 0x00, 0xA9, 0x8A, 0xE8, 0x00, 0x04, 0xA1, 0x53, 0xA4, 0x06, 0x4A, + 0x66, 0x45, 0x23, 0x54, 0x04, 0x42, 0x26, 0x4B, 0x13, 0x44, 0x26, 0x4F, 0x18, 0xA4, 0xA6, 0x01, + 0x24, 0xB1, 0x06, 0x4A, 0xD7, 0x41, 0x26, 0x4E, 0xA9, 0x04, 0xE6, 0x00, 0xA9, 0x04, 0xE8, 0x00, + 0xA9, 0x04, 0xEA, 0x00, 0xC6, 0x9B, 0x04, 0x41, 0x53, 0x4A, 0x66, 0x4D, 0x23, 0xD4, 0x92, 0xEB, + 0x26, 0xC9, 0x23, 0xCC, 0x24, 0x78, 0x0C, 0xF0, 0x20, 0x0A, 0xC6, 0x7F, 0x92, 0xA3, 0x30, 0x41, + 0xA9, 0x3E, 0x06, 0x00, 0xC4, 0xC0, 0x99, 0x4E, 0x04, 0x00, 0x82, 0x44, 0x04, 0xB0, 0x0C, 0x80, + 0xB4, 0x09, 0x18, 0x7E, 0x04, 0x00, 0xC6, 0xB7, 0x32, 0x26, 0x06, 0x7D, 0x63, 0x7B, 0xD4, 0x71, + 0x82, 0x20, 0x06, 0x2B, 0xD7, 0x21, 0x2C, 0x20, 0xE4, 0x00, 0x06, 0xAB, 0x26, 0x2E, 0x18, 0x7E, + 0x04, 0x00, 0xC6, 0xA7, 0xB2, 0x14, 0xC4, 0xAA, 0x04, 0x98, 0x26, 0x92, 0x92, 0x08, 0x06, 0x28, + 0x04, 0x30, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0xF2, 0x06, 0x06, 0x39, 0x04, 0x48, + 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x24, 0xA1, 0x06, 0x29, 0xF2, 0xEA, 0xF7, 0xD0, 0x34, 0xB1, + 0x24, 0xB1, 0xF2, 0xD8, 0x3F, 0xCC, 0x07, 0x00, 0x28, 0x7E, 0x06, 0x00, 0x99, 0xCE, 0x04, 0x00, + 0x6C, 0x70, 0x10, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0xF2, 0x12, 0x98, 0x7E, 0x75, 0x02, 0x8A, 0x0B, + 0xFF, 0xFF, 0x18, 0x6D, 0x59, 0x00, 0xC6, 0x67, 0xAA, 0x06, 0xFF, 0xFF, 0x34, 0x71, 0xFA, 0x01, + 0xFF, 0xFF, 0x1C, 0x50, 0x11, 0x00, 0x56, 0x35, 0xA9, 0x3E, 0x06, 0x00, 0x58, 0xC1, 0x30, 0x00, + 0x58, 0x81, 0x20, 0x00, 0x2C, 0x10, 0x40, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x20, 0x00, + 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x0C, 0xD0, 0xA6, 0x08, 0x04, 0xE0, 0x06, 0x2E, 0x04, 0x3B, + 0xEB, 0x93, 0x00, 0x00, 0x2C, 0xE0, 0xC0, 0x12, 0xCC, 0xE0, 0xC0, 0xF3, 0x2C, 0x20, 0xDA, 0x00, + 0xA1, 0x2D, 0x24, 0xD2, 0x92, 0xF4, 0x08, 0xD0, 0x02, 0x00, 0x0C, 0xC0, 0xD2, 0x08, 0x04, 0xE0, + 0x2C, 0xD0, 0xC0, 0x51, 0x06, 0x2E, 0x0C, 0x30, 0x11, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x2C, 0xE0, + 0x40, 0x1F, 0xC6, 0xED, 0x2C, 0x20, 0xEB, 0x00, 0xA1, 0x2C, 0x24, 0xC2, 0x92, 0xF4, 0x08, 0xD0, + 0x00, 0x80, 0x0C, 0xC0, 0x80, 0x08, 0x0C, 0x90, 0x36, 0x07, 0x0C, 0xE0, 0xA6, 0x0F, 0x2C, 0xD0, + 0x3E, 0x78, 0x26, 0x9C, 0x18, 0x7D, 0x05, 0x00, 0x1C, 0x20, 0xDA, 0x00, 0x2C, 0x70, 0x12, 0x00, + 0x26, 0x77, 0x26, 0x7C, 0x28, 0xA7, 0x02, 0x00, 0x04, 0x3A, 0x26, 0x2A, 0xEB, 0x93, 0x00, 0x00, + 0x10, 0x7D, 0xA9, 0x2E, 0x04, 0x00, 0x1C, 0x20, 0xEB, 0x00, 0x2C, 0x70, 0x28, 0x00, 0x26, 0x77, + 0x26, 0x7C, 0x28, 0xB7, 0x02, 0x00, 0x04, 0x3A, 0x26, 0x2B, 0xEB, 0x93, 0x00, 0x00, 0xA1, 0x2E, + 0x0C, 0x20, 0xDA, 0x00, 0x04, 0x3A, 0x26, 0x2A, 0xEB, 0x93, 0x00, 0x00, 0xA9, 0x2E, 0x06, 0x00, + 0x0C, 0x20, 0xEB, 0x00, 0x26, 0x2B, 0x04, 0x3A, 0xEB, 0x93, 0x00, 0x00, 0xA9, 0x2E, 0x02, 0x00, + 0x24, 0xE8, 0xC6, 0xE9, 0x24, 0xD1, 0x92, 0xCF, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, + 0x20, 0x00, 0xE1, 0xF0, 0x38, 0x60, 0xE4, 0x10, 0xC4, 0x20, 0x18, 0x66, 0xA5, 0x00, 0x06, 0x52, + 0x32, 0x02, 0x16, 0x52, 0xC6, 0x56, 0x02, 0x08, 0xC6, 0x26, 0x02, 0x04, 0x3F, 0x66, 0x03, 0x00, + 0xF2, 0x02, 0x26, 0x63, 0x23, 0x46, 0x06, 0x24, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0xE4, 0x10, + 0x3C, 0x10, 0x24, 0x00, 0xD9, 0xC1, 0x14, 0x00, 0xD9, 0x81, 0x04, 0x00, 0x30, 0x77, 0xDC, 0x70, + 0x10, 0x00, 0x82, 0x41, 0x0C, 0xC0, 0x80, 0x08, 0x98, 0x9C, 0x01, 0x04, 0x82, 0x3C, 0x98, 0x8C, + 0x02, 0x04, 0x82, 0x39, 0x0C, 0xE0, 0x00, 0x0B, 0x04, 0xD0, 0xC6, 0xD9, 0x32, 0x34, 0x06, 0x6A, + 0x0C, 0x60, 0xBA, 0x0B, 0x04, 0x70, 0xC6, 0x78, 0x32, 0x2A, 0x2C, 0x60, 0x10, 0x00, 0x1C, 0x50, + 0x10, 0x00, 0x26, 0x56, 0x18, 0x4E, 0x0A, 0x00, 0x10, 0x55, 0xC6, 0x45, 0x92, 0x1E, 0x24, 0x7B, + 0x57, 0x72, 0x26, 0x7C, 0x78, 0x47, 0x80, 0x02, 0x78, 0xB7, 0x82, 0x02, 0x70, 0x3E, 0x78, 0x7E, + 0x02, 0x00, 0x3F, 0x24, 0x03, 0x00, 0x36, 0x7B, 0x23, 0x33, 0x23, 0x44, 0xB1, 0x71, 0xAB, 0xA0, + 0x01, 0x00, 0xA1, 0x2E, 0x30, 0x71, 0x28, 0x3E, 0x02, 0x00, 0x06, 0x27, 0x23, 0x4B, 0xAB, 0xA0, + 0x01, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0xF2, 0x03, 0x24, 0x71, 0xF2, 0xD6, 0x24, 0xD1, 0x2C, 0xE0, + 0x10, 0x00, 0xF2, 0xCC, 0x58, 0xC1, 0x14, 0x00, 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0xC6, 0x34, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, + 0x06, 0xE2, 0x78, 0xA1, 0x20, 0x00, 0x78, 0xC1, 0x24, 0x00, 0x78, 0xD1, 0x28, 0x00, 0x32, 0x05, + 0xA1, 0xC2, 0xA9, 0xD2, 0x02, 0x00, 0xF2, 0x20, 0xC6, 0x35, 0x22, 0x05, 0xA1, 0x62, 0xA9, 0xA2, + 0x02, 0x00, 0xF2, 0x1A, 0x3F, 0x94, 0x03, 0x00, 0x06, 0x29, 0x3F, 0x3C, 0x06, 0x00, 0x3F, 0xB4, + 0x05, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x3B, 0xEB, 0x93, 0x00, 0x00, 0x26, 0x2C, 0xA1, 0x2E, + 0x3F, 0x3D, 0x0A, 0x00, 0x06, 0x29, 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x3B, 0xEB, 0x93, 0x00, 0x00, + 0x26, 0x2D, 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x2F, 0x72, 0x02, 0x00, 0x26, 0x72, 0x06, 0x67, 0x57, 0x62, 0x26, 0x76, + 0x26, 0x27, 0x0C, 0x70, 0x80, 0x08, 0x2C, 0x20, 0x14, 0x04, 0x26, 0x27, 0x04, 0x72, 0x26, 0x72, + 0x06, 0x67, 0x04, 0x59, 0x34, 0x51, 0xC4, 0x50, 0xA9, 0x06, 0x24, 0x00, 0xA9, 0x06, 0x26, 0x00, + 0x34, 0x64, 0x92, 0xF9, 0x04, 0x61, 0x99, 0x67, 0x28, 0x00, 0x38, 0x60, 0xE4, 0x10, 0xA9, 0x07, + 0x2A, 0x00, 0x18, 0x66, 0x98, 0x00, 0x99, 0x07, 0x2D, 0x00, 0xA9, 0x07, 0x32, 0x00, 0x99, 0x67, + 0x2C, 0x00, 0xA9, 0x07, 0x30, 0x00, 0x14, 0x61, 0xA9, 0x07, 0x2E, 0x00, 0xA9, 0x62, 0x02, 0x00, + 0xA9, 0x67, 0x02, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, + 0xAB, 0xAA, 0x01, 0x00, 0x24, 0xE1, 0xC4, 0xEB, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x38, 0x70, 0xE4, 0x10, 0x3C, 0x10, 0x8C, 0x00, 0x0C, 0x60, 0xA3, 0x00, 0xD9, 0xC1, 0x7C, 0x00, + 0xD9, 0x81, 0x6C, 0x00, 0x26, 0x67, 0x10, 0x66, 0xB9, 0x61, 0x3C, 0x00, 0x30, 0x67, 0xD4, 0x68, + 0x8A, 0x9A, 0x03, 0x00, 0x18, 0xB7, 0x96, 0x00, 0x06, 0xD7, 0x04, 0xE0, 0x18, 0x2D, 0x99, 0x00, + 0x04, 0xCC, 0x26, 0xC1, 0x06, 0x3B, 0xEB, 0x8B, 0x00, 0x00, 0x26, 0xCE, 0x24, 0xE4, 0xCC, 0xE0, + 0x28, 0x00, 0xB1, 0x2C, 0x24, 0xD1, 0x92, 0xF3, 0x0C, 0xD0, 0x80, 0x08, 0x98, 0x7D, 0x01, 0x04, + 0x92, 0x05, 0xCB, 0xAD, 0x01, 0x00, 0xFA, 0x7F, 0x03, 0x00, 0x04, 0x70, 0x06, 0xED, 0xB9, 0x71, + 0x38, 0x00, 0x38, 0x71, 0x38, 0x00, 0x26, 0x7D, 0xE8, 0xA7, 0xEB, 0x03, 0x82, 0x15, 0x0C, 0x60, + 0xE4, 0x10, 0x30, 0x76, 0x34, 0xA1, 0x98, 0x77, 0xA4, 0x00, 0x57, 0xA2, 0x26, 0xAD, 0x0C, 0xB0, + 0x80, 0x02, 0x26, 0xBA, 0x9A, 0xD1, 0x00, 0x00, 0x04, 0x2C, 0x26, 0x2B, 0x8B, 0x13, 0x01, 0x00, + 0xC4, 0x20, 0x9A, 0xCA, 0x00, 0x00, 0x38, 0x21, 0x38, 0x00, 0xAB, 0xAA, 0x01, 0x00, 0x38, 0x71, + 0x38, 0x00, 0x2C, 0xE0, 0x34, 0x00, 0x24, 0x71, 0xC4, 0x7B, 0xB9, 0x71, 0x38, 0x00, 0x92, 0xDA, + 0x18, 0x6D, 0x8A, 0x02, 0x99, 0x0D, 0x11, 0x04, 0x34, 0x61, 0x2F, 0x76, 0x06, 0x00, 0x26, 0x76, + 0x06, 0x57, 0x57, 0x52, 0x26, 0x75, 0x26, 0x76, 0x26, 0x7D, 0x2C, 0x70, 0x16, 0x04, 0x78, 0x57, + 0x08, 0x00, 0x78, 0x67, 0x04, 0x00, 0x36, 0x65, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0xCC, 0x60, + 0xC8, 0x00, 0x02, 0x06, 0xC4, 0x50, 0x82, 0x04, 0x04, 0x61, 0x99, 0x6D, 0x11, 0x04, 0x18, 0x6D, + 0x01, 0x04, 0xC4, 0x61, 0x9A, 0x85, 0x00, 0x00, 0x98, 0x6D, 0x02, 0x04, 0x8A, 0x23, 0x03, 0x00, + 0xF8, 0x67, 0x08, 0x00, 0x8A, 0x1F, 0x03, 0x00, 0xF8, 0x57, 0x0A, 0x00, 0x8A, 0x1B, 0x03, 0x00, + 0xF8, 0x57, 0x04, 0x00, 0x8A, 0x17, 0x03, 0x00, 0xF8, 0x47, 0x06, 0x00, 0x8A, 0x13, 0x03, 0x00, + 0x3F, 0x66, 0x05, 0x00, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0x38, 0x30, 0xE4, 0x10, 0x28, 0x53, + 0x7C, 0x00, 0xC6, 0x65, 0x02, 0x1E, 0x18, 0x4D, 0x0E, 0x04, 0x04, 0x61, 0x5C, 0x40, 0xFC, 0x00, + 0x99, 0x4D, 0x0E, 0x04, 0x99, 0x6D, 0x0C, 0x04, 0x78, 0xF7, 0x04, 0x00, 0x78, 0x27, 0x08, 0x00, + 0xC6, 0xF2, 0x02, 0x07, 0x64, 0x41, 0x99, 0x4D, 0x0E, 0x04, 0x04, 0x61, 0x04, 0x50, 0xF2, 0x0F, + 0xC6, 0xF2, 0x04, 0x61, 0x04, 0x50, 0x32, 0x0B, 0x64, 0x42, 0x99, 0x4D, 0x0E, 0x04, 0xF2, 0x07, + 0xC4, 0x6A, 0x04, 0x51, 0x12, 0x02, 0x04, 0x50, 0x13, 0x55, 0x04, 0x60, 0x78, 0x27, 0x06, 0x00, + 0x78, 0x47, 0x0A, 0x00, 0x3F, 0x44, 0x02, 0x00, 0xC4, 0x40, 0x32, 0x02, 0x16, 0x44, 0x28, 0x33, + 0x7C, 0x00, 0xC6, 0x43, 0x02, 0x1A, 0x18, 0x4D, 0x0E, 0x04, 0x04, 0x31, 0x5C, 0x40, 0xF3, 0x00, + 0x99, 0x4D, 0x0E, 0x04, 0x99, 0x3D, 0x0C, 0x04, 0x78, 0x37, 0x06, 0x00, 0x78, 0x77, 0x0A, 0x00, + 0xC6, 0x37, 0x02, 0x03, 0x64, 0x44, 0xF2, 0x04, 0xC6, 0x37, 0x32, 0x04, 0x64, 0x48, 0x99, 0x4D, + 0x0E, 0x04, 0x24, 0x61, 0x13, 0x66, 0xF2, 0x05, 0xC4, 0x4A, 0x02, 0x03, 0x24, 0x51, 0x13, 0x55, + 0x98, 0x7D, 0x0F, 0x04, 0x92, 0x11, 0xC4, 0x52, 0x92, 0x0C, 0x18, 0x7D, 0x0D, 0x04, 0xCC, 0x70, + 0xFF, 0x00, 0x8A, 0xB0, 0x02, 0x00, 0x24, 0x71, 0x99, 0x7D, 0x0D, 0x04, 0xFA, 0xAB, 0x02, 0x00, + 0xC4, 0x60, 0x8A, 0xA8, 0x02, 0x00, 0x99, 0x0D, 0x0D, 0x04, 0xFA, 0xA4, 0x02, 0x00, 0xC4, 0x62, + 0x9A, 0xAA, 0x02, 0x00, 0x0C, 0x70, 0x7E, 0x00, 0x26, 0x7D, 0x0C, 0x30, 0x80, 0x02, 0x06, 0x27, + 0x26, 0x3D, 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, 0x06, 0x72, 0x04, 0x24, 0x26, 0x27, 0x0C, 0x30, + 0x90, 0x02, 0xFA, 0x95, 0x02, 0x00, 0x0C, 0xC0, 0x16, 0x04, 0x26, 0xCE, 0x06, 0x7C, 0x04, 0x68, + 0x28, 0x57, 0x20, 0x00, 0xB4, 0x61, 0xA9, 0x57, 0x24, 0x00, 0x28, 0x57, 0x22, 0x00, 0x34, 0x74, + 0xA9, 0x57, 0x2A, 0x00, 0x92, 0xF6, 0x78, 0x7A, 0x80, 0x02, 0xCC, 0x70, 0xDF, 0x01, 0x1A, 0x28, + 0xFF, 0xFF, 0x78, 0x7A, 0x82, 0x02, 0xCC, 0x70, 0x1F, 0x03, 0x1A, 0x22, 0xFF, 0xFF, 0x0C, 0x20, + 0x1A, 0x04, 0x06, 0x3B, 0x26, 0x2E, 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, + 0xE0, 0x00, 0x18, 0x7E, 0x3E, 0x04, 0x78, 0x2E, 0x1A, 0x04, 0x78, 0x3E, 0x1E, 0x04, 0xC4, 0x71, + 0xC2, 0x12, 0x3F, 0x73, 0x02, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x43, 0x67, 0x78, 0x5E, + 0x1C, 0x04, 0x78, 0x7E, 0x20, 0x04, 0x3F, 0x77, 0x05, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, + 0x43, 0x87, 0xF2, 0x04, 0x0C, 0x80, 0x64, 0x00, 0x06, 0x68, 0xB9, 0x61, 0x68, 0x00, 0x0C, 0xF0, + 0xD4, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x34, 0x00, 0x78, 0x3E, 0x20, 0x04, 0x78, 0x2E, 0x1C, 0x04, + 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0x06, 0x92, 0x78, 0x3E, 0x22, 0x04, 0x38, 0x21, 0x34, 0x00, + 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0x78, 0x3E, 0x24, 0x04, 0xB9, 0x21, 0x40, 0x00, 0x06, 0x29, + 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x44, 0x00, 0x78, 0x3E, 0x26, 0x04, 0x78, 0x4E, + 0x2A, 0x04, 0x38, 0x21, 0x40, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0x43, 0x22, 0xB9, 0x21, + 0x48, 0x00, 0x78, 0x3E, 0x28, 0x04, 0x78, 0x4E, 0x2C, 0x04, 0x38, 0x21, 0x44, 0x00, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0x43, 0x22, 0xB9, 0x21, 0x4C, 0x00, 0x78, 0x3E, 0x2E, 0x04, 0x78, 0x4E, + 0x32, 0x04, 0x38, 0x21, 0x48, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0x43, 0x22, 0xB9, 0x21, + 0x50, 0x00, 0x78, 0x3E, 0x30, 0x04, 0x78, 0x4E, 0x34, 0x04, 0x38, 0x21, 0x4C, 0x00, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0x43, 0x22, 0xB9, 0x21, 0x54, 0x00, 0x78, 0x3E, 0x36, 0x04, 0x78, 0x4E, + 0x3A, 0x04, 0x38, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0x43, 0x22, 0xB9, 0x21, + 0x58, 0x00, 0x78, 0x3E, 0x38, 0x04, 0x78, 0x4E, 0x3C, 0x04, 0x38, 0x21, 0x54, 0x00, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0x38, 0x61, 0x68, 0x00, 0x43, 0x22, 0xB9, 0x21, 0x5C, 0x00, 0x06, 0x38, + 0x06, 0x26, 0x0C, 0xF0, 0x80, 0x00, 0xF1, 0xF0, 0x99, 0x20, 0x05, 0x11, 0x28, 0x7E, 0x46, 0x04, + 0x04, 0x31, 0xA9, 0x7E, 0x48, 0x04, 0x28, 0x7E, 0x44, 0x04, 0xA9, 0x2E, 0x44, 0x04, 0xA9, 0x7E, + 0x46, 0x04, 0x18, 0x7E, 0x43, 0x04, 0x26, 0x37, 0x26, 0x77, 0x2F, 0x63, 0x03, 0x00, 0x26, 0xC7, + 0x04, 0x70, 0x16, 0x66, 0x06, 0x27, 0x2F, 0x57, 0x0C, 0x00, 0x34, 0x72, 0x78, 0x55, 0x2E, 0x00, + 0xC6, 0x76, 0x26, 0x25, 0x92, 0xF9, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, 0x10, 0x00, 0x06, 0xC2, + 0xB9, 0x71, 0x60, 0x00, 0x38, 0x61, 0x60, 0x00, 0x04, 0x71, 0xC6, 0x26, 0x02, 0x11, 0x38, 0x61, + 0x18, 0x00, 0x04, 0x72, 0xC6, 0x26, 0x02, 0x0C, 0x38, 0x61, 0x20, 0x00, 0x04, 0x73, 0xC6, 0x26, + 0x02, 0x07, 0x38, 0x61, 0x28, 0x00, 0x04, 0x75, 0xC6, 0x26, 0x12, 0x02, 0x04, 0x74, 0x18, 0x6E, + 0x42, 0x04, 0x3F, 0x36, 0x07, 0x00, 0x0C, 0x70, 0xE4, 0x10, 0x30, 0x47, 0x78, 0x7E, 0x40, 0x04, + 0x18, 0x24, 0x97, 0x00, 0xC4, 0x30, 0x16, 0x52, 0x02, 0x04, 0xC6, 0x72, 0x92, 0x0F, 0xF2, 0x05, + 0xC4, 0x30, 0x82, 0x06, 0xC6, 0x75, 0x92, 0x06, 0xA9, 0x0E, 0x40, 0x04, 0xF2, 0x0A, 0xC4, 0x70, + 0x02, 0x03, 0x34, 0x71, 0xF2, 0x04, 0xC4, 0x70, 0x82, 0x04, 0x24, 0x71, 0xA9, 0x7E, 0x40, 0x04, + 0x78, 0x7E, 0x40, 0x04, 0x18, 0x44, 0x97, 0x00, 0xC6, 0x74, 0x92, 0x05, 0xC4, 0x64, 0xD2, 0x03, + 0x24, 0x61, 0xF2, 0x0E, 0x28, 0x4D, 0x06, 0x00, 0xD4, 0x48, 0x82, 0x05, 0xC6, 0x75, 0x92, 0x0A, + 0xC4, 0x61, 0xF2, 0x04, 0xC6, 0x75, 0x92, 0x06, 0xC4, 0x63, 0xC2, 0x04, 0x34, 0x61, 0x99, 0x6E, + 0x42, 0x04, 0x18, 0x5E, 0x3E, 0x04, 0x38, 0x21, 0x58, 0x00, 0x06, 0x35, 0xB9, 0x51, 0x64, 0x00, + 0xEB, 0x93, 0x00, 0x00, 0x38, 0x51, 0x64, 0x00, 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, 0x06, 0x35, + 0xEB, 0x93, 0x00, 0x00, 0x18, 0x4E, 0x42, 0x04, 0x38, 0x51, 0x64, 0x00, 0xC4, 0x41, 0x43, 0x72, + 0x92, 0x35, 0xC4, 0x58, 0xC2, 0x0E, 0x38, 0x21, 0x58, 0x00, 0x04, 0x39, 0xEB, 0x93, 0x00, 0x00, + 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, 0x04, 0x39, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, + 0xC4, 0x56, 0xC2, 0x15, 0x38, 0x21, 0x50, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x37, 0xEB, 0x93, + 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x54, 0x00, 0x04, 0x37, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, + 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, + 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, + 0x0C, 0x00, 0x38, 0x51, 0x60, 0x00, 0xFA, 0x9C, 0x00, 0x00, 0xC4, 0x42, 0x92, 0x34, 0xC4, 0x56, + 0xC2, 0x0E, 0x38, 0x21, 0x50, 0x00, 0x04, 0x37, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, + 0x54, 0x00, 0x04, 0x37, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x54, 0xC2, 0x15, + 0x38, 0x21, 0x48, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x35, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x92, + 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, + 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, + 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x14, 0x00, 0x38, 0x51, + 0x18, 0x00, 0xF2, 0x66, 0xC4, 0x43, 0x92, 0x34, 0xC4, 0x54, 0xC2, 0x0E, 0x38, 0x21, 0x48, 0x00, + 0x04, 0x35, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, 0xEB, 0x93, + 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x52, 0xC2, 0x15, 0x38, 0x21, 0x40, 0x00, 0xB9, 0x71, + 0x64, 0x00, 0x04, 0x33, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x44, 0x00, 0x04, 0x33, + 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, + 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, + 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x1C, 0x00, 0x38, 0x51, 0x20, 0x00, 0xF2, 0x31, 0xC4, 0x44, + 0x92, 0x31, 0xC4, 0x52, 0xC2, 0x0E, 0x38, 0x21, 0x40, 0x00, 0x04, 0x33, 0xEB, 0x93, 0x00, 0x00, + 0x43, 0x82, 0x38, 0x21, 0x44, 0x00, 0x04, 0x33, 0xEB, 0x93, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, + 0xC4, 0x52, 0x92, 0x11, 0x38, 0x51, 0x34, 0x00, 0x38, 0x61, 0x34, 0x00, 0x06, 0x49, 0xF7, 0x4F, + 0xF7, 0x5F, 0x26, 0x94, 0x26, 0x56, 0xE7, 0x50, 0xE7, 0x90, 0x06, 0x38, 0x06, 0x47, 0x43, 0x85, + 0x43, 0x79, 0xF2, 0x03, 0x06, 0x38, 0x06, 0x47, 0xB9, 0x41, 0x08, 0x00, 0x38, 0x51, 0x28, 0x00, + 0x38, 0x41, 0x24, 0x00, 0xB9, 0x31, 0x04, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x68, + 0xF2, 0x20, 0xC4, 0x51, 0xC2, 0x0E, 0x38, 0x61, 0x34, 0x00, 0x38, 0x71, 0x34, 0x00, 0xF7, 0x6F, + 0x26, 0x67, 0x06, 0x79, 0xF7, 0x7F, 0x26, 0x97, 0xE7, 0x60, 0xE7, 0x90, 0x43, 0x86, 0x43, 0x79, + 0x78, 0x5E, 0x1C, 0x04, 0x78, 0xFE, 0x1A, 0x04, 0x38, 0x41, 0x2C, 0x00, 0xB1, 0x51, 0x38, 0x51, + 0x30, 0x00, 0xB9, 0x81, 0x04, 0x00, 0xB9, 0x71, 0x08, 0x00, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x6F, + 0x2B, 0xA7, 0x01, 0x00, 0x18, 0x7E, 0x3E, 0x04, 0xC4, 0x78, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, + 0x3E, 0x04, 0x18, 0x7E, 0x43, 0x04, 0xC4, 0x71, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x43, 0x04, + 0x18, 0x7A, 0x8A, 0x02, 0x04, 0x92, 0x34, 0x71, 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, 0x06, 0x56, + 0x57, 0x52, 0x26, 0x65, 0x26, 0x76, 0x2C, 0x70, 0x14, 0x04, 0x26, 0x7D, 0xF8, 0x27, 0x02, 0x00, + 0x26, 0x97, 0x22, 0x39, 0xF8, 0x79, 0x02, 0x00, 0x22, 0x36, 0x38, 0x61, 0x3C, 0x00, 0xB9, 0x71, + 0x64, 0x00, 0x0C, 0xC0, 0x64, 0x00, 0x06, 0x8C, 0x36, 0x86, 0x06, 0x38, 0xEB, 0x8B, 0x00, 0x00, + 0x06, 0x3C, 0xEB, 0x93, 0x00, 0x00, 0x06, 0x62, 0x38, 0x31, 0x3C, 0x00, 0x78, 0x2A, 0x80, 0x02, + 0xB9, 0x61, 0x68, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x3C, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x61, + 0x68, 0x00, 0x38, 0x71, 0x64, 0x00, 0x26, 0x26, 0x06, 0x38, 0xA9, 0x2A, 0x80, 0x02, 0x06, 0x27, + 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x3C, 0xEB, 0x93, 0x00, 0x00, 0x06, 0x82, 0x38, 0x31, 0x3C, 0x00, + 0x78, 0x2A, 0x82, 0x02, 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x3C, 0xEB, 0x93, 0x00, 0x00, 0x26, 0x28, + 0xA9, 0x2A, 0x82, 0x02, 0x06, 0x29, 0x06, 0x3B, 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, 0xFA, 0xB0, + 0xFC, 0xFF, 0x0C, 0x20, 0x7E, 0x00, 0x26, 0x2D, 0x0C, 0x30, 0x80, 0x02, 0x26, 0x3D, 0x04, 0x44, + 0x0B, 0x7A, 0x03, 0x00, 0x58, 0xC1, 0x7C, 0x00, 0x58, 0x81, 0x6C, 0x00, 0x2C, 0x10, 0x8C, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0xC8, 0x09, 0x04, 0x30, 0x0C, 0x40, 0x58, 0x00, + 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x26, 0x0A, 0x14, 0x31, 0x0C, 0x40, + 0xC0, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, 0x80, 0x08, 0xA9, 0x07, + 0x22, 0x00, 0xA9, 0x07, 0x7C, 0x02, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x68, 0x02, + 0xD9, 0xC1, 0x58, 0x02, 0x38, 0xD0, 0xE4, 0x10, 0xD9, 0x81, 0x48, 0x02, 0x0C, 0xE0, 0x80, 0x08, + 0x18, 0xCD, 0x5A, 0x00, 0xA9, 0x0E, 0x70, 0x02, 0x18, 0x3D, 0x48, 0x00, 0x28, 0x2E, 0x08, 0x00, + 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x23, 0x22, 0xA9, 0x2E, + 0x72, 0x02, 0x28, 0x7D, 0x4A, 0x00, 0xC6, 0x27, 0xB2, 0x03, 0xA9, 0x7E, 0x72, 0x02, 0x28, 0x7E, + 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x08, 0x18, 0x7D, 0x62, 0x00, 0x36, 0xC7, 0xC4, 0xC0, + 0x12, 0x02, 0x04, 0xC1, 0x13, 0xCC, 0x0C, 0x20, 0x00, 0x02, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, + 0x10, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x00, 0x01, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x01, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, + 0xC0, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xC0, 0x01, 0x0C, 0x40, 0x40, 0x00, + 0x26, 0x21, 0x04, 0x30, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x2E, 0x08, 0x00, 0xA9, 0x0E, + 0xA0, 0x01, 0x06, 0x3C, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xAB, 0x8F, 0x00, 0x00, + 0x28, 0x7E, 0x0E, 0x00, 0x04, 0x60, 0x26, 0x27, 0xA9, 0x2E, 0xA2, 0x01, 0xB9, 0x61, 0x10, 0x02, + 0x06, 0x86, 0x04, 0xA1, 0x06, 0xC6, 0x2F, 0x78, 0x08, 0x00, 0x26, 0x7E, 0xB9, 0x71, 0x34, 0x02, + 0x04, 0xD0, 0x38, 0x71, 0x10, 0x02, 0x26, 0x7D, 0x23, 0x77, 0x0C, 0x60, 0x80, 0x02, 0xB9, 0x71, + 0x14, 0x02, 0x26, 0x77, 0x26, 0x76, 0x70, 0x77, 0x28, 0x6E, 0x72, 0x02, 0xC6, 0x76, 0x02, 0x06, + 0x28, 0x6E, 0x70, 0x02, 0x24, 0x61, 0xA9, 0x6E, 0x70, 0x02, 0x0C, 0x40, 0xA2, 0x01, 0x26, 0x4E, + 0x70, 0x44, 0xC6, 0x74, 0xB9, 0x41, 0x18, 0x02, 0x0A, 0xE7, 0x00, 0x00, 0x2F, 0x7D, 0x0D, 0x00, + 0x04, 0xB0, 0x26, 0x7E, 0xB9, 0x71, 0x30, 0x02, 0xB9, 0xB1, 0x1C, 0x02, 0xB9, 0xB1, 0x20, 0x02, + 0xB9, 0xB1, 0x24, 0x02, 0x06, 0x6B, 0xB9, 0xB1, 0x28, 0x02, 0x06, 0x5B, 0x38, 0x91, 0x14, 0x02, + 0x38, 0x21, 0x18, 0x02, 0x23, 0x7B, 0x26, 0x97, 0x23, 0x99, 0x2F, 0x49, 0x09, 0x00, 0x0C, 0xF0, + 0x80, 0x02, 0x26, 0x4F, 0x70, 0x44, 0xC6, 0x42, 0x0A, 0x8A, 0x00, 0x00, 0x13, 0x3C, 0xB9, 0x31, + 0x2C, 0x02, 0x38, 0xF1, 0x2C, 0x02, 0x36, 0x42, 0x38, 0x21, 0x30, 0x02, 0x2F, 0x39, 0x01, 0x00, + 0x91, 0xF3, 0x2F, 0x3B, 0x0B, 0x00, 0x26, 0x32, 0x28, 0x33, 0x26, 0x00, 0xB9, 0x51, 0x38, 0x02, + 0x06, 0x24, 0xB9, 0x61, 0x3C, 0x02, 0xB9, 0x71, 0x44, 0x02, 0xB9, 0x41, 0x40, 0x02, 0xEB, 0x8B, + 0x00, 0x00, 0x38, 0x31, 0x1C, 0x02, 0x38, 0xF1, 0x34, 0x02, 0x38, 0x41, 0x40, 0x02, 0x26, 0x32, + 0xB9, 0x31, 0x1C, 0x02, 0x28, 0x3F, 0x52, 0x00, 0x06, 0x24, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x31, + 0x20, 0x02, 0x38, 0xF1, 0x24, 0x02, 0x38, 0x41, 0x40, 0x02, 0x38, 0x71, 0x44, 0x02, 0x38, 0x51, + 0x38, 0x02, 0x38, 0x61, 0x3C, 0x02, 0xC4, 0x80, 0x26, 0x32, 0x26, 0xF4, 0x24, 0x71, 0xB9, 0x31, + 0x20, 0x02, 0xB9, 0xF1, 0x24, 0x02, 0x23, 0x77, 0x82, 0x45, 0xC4, 0x50, 0x14, 0x4D, 0x26, 0x41, + 0x26, 0x49, 0x92, 0x14, 0x90, 0x44, 0x92, 0x0F, 0xC4, 0xD0, 0x82, 0x08, 0x14, 0x4E, 0x26, 0x41, + 0x26, 0x49, 0x90, 0x44, 0x92, 0x08, 0xC4, 0xDC, 0x82, 0x35, 0x14, 0x2C, 0x26, 0x21, 0x26, 0x92, + 0x90, 0x49, 0x82, 0x30, 0x06, 0xC4, 0x04, 0x51, 0xF2, 0x2D, 0x90, 0x44, 0x82, 0x04, 0xC6, 0x4C, + 0x9A, 0x82, 0x01, 0x00, 0xC4, 0xD0, 0x82, 0x0B, 0x14, 0x4E, 0x26, 0x41, 0x26, 0x49, 0x90, 0x44, + 0x82, 0x04, 0xC6, 0x4C, 0x9A, 0x78, 0x01, 0x00, 0xC4, 0xDC, 0x82, 0x09, 0x14, 0x3C, 0x26, 0x31, + 0x26, 0x93, 0x90, 0x49, 0x82, 0x04, 0xC6, 0x4C, 0x9A, 0x6E, 0x01, 0x00, 0xB8, 0x41, 0x28, 0x02, + 0x82, 0x11, 0xC4, 0x6A, 0xD2, 0x0F, 0xC4, 0xCA, 0xD2, 0x0D, 0xC6, 0xC6, 0x0C, 0x40, 0x00, 0x02, + 0x26, 0x41, 0xC2, 0x04, 0x26, 0x4C, 0x91, 0x64, 0xF2, 0x05, 0x38, 0xF1, 0x2C, 0x02, 0x26, 0x46, + 0x91, 0xF4, 0x24, 0xD1, 0xC4, 0xDD, 0x24, 0xB1, 0x9A, 0x6A, 0xFF, 0xFF, 0x14, 0x61, 0x26, 0x6A, + 0xC4, 0x6E, 0xD2, 0x3A, 0xC4, 0x50, 0x92, 0x03, 0x06, 0xCA, 0x24, 0xA1, 0x38, 0x21, 0x14, 0x02, + 0xB9, 0x71, 0x44, 0x02, 0x06, 0x47, 0x26, 0x21, 0x33, 0x3C, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x14, 0x51, 0x26, 0x5C, 0x2F, 0x65, 0x05, 0x00, 0x26, 0x65, 0x57, 0x61, 0x26, 0x61, 0x38, 0x46, + 0x00, 0x01, 0x38, 0x21, 0x1C, 0x02, 0x38, 0x31, 0x20, 0x02, 0x38, 0xF1, 0x24, 0x02, 0x38, 0x71, + 0x44, 0x02, 0x26, 0x42, 0xB9, 0x46, 0x00, 0x01, 0x38, 0x46, 0x04, 0x01, 0x57, 0x51, 0x26, 0x43, + 0xB9, 0x46, 0x04, 0x01, 0x38, 0x46, 0x08, 0x01, 0x26, 0x4F, 0xB9, 0x46, 0x08, 0x01, 0x2F, 0x65, + 0x01, 0x00, 0x28, 0x56, 0xC0, 0x01, 0x99, 0x86, 0xC3, 0x01, 0x26, 0x75, 0xA9, 0x76, 0xC0, 0x01, + 0x04, 0x71, 0x99, 0x76, 0xC2, 0x01, 0x24, 0xD1, 0xC4, 0xDC, 0x0A, 0xFC, 0xFE, 0xFF, 0x38, 0x71, + 0x10, 0x02, 0x24, 0x81, 0x24, 0x7D, 0xCC, 0x80, 0x12, 0x00, 0x23, 0x77, 0xB9, 0x71, 0x10, 0x02, + 0x9A, 0xEB, 0xFE, 0xFF, 0x14, 0x91, 0x26, 0x9A, 0xC4, 0x9F, 0xC2, 0x09, 0x18, 0x8E, 0x04, 0x00, + 0x28, 0xCE, 0x22, 0x00, 0x06, 0xDE, 0x04, 0xB0, 0xFA, 0xEE, 0x00, 0x00, 0x14, 0xB2, 0x26, 0xBA, + 0x2F, 0xDB, 0x0B, 0x00, 0x06, 0xCA, 0x26, 0xDB, 0x0C, 0x20, 0x00, 0x01, 0x57, 0xC1, 0x57, 0xD1, + 0x26, 0x21, 0x26, 0xC1, 0x0C, 0x70, 0xB4, 0x01, 0x06, 0x89, 0x26, 0xD2, 0x2C, 0xC0, 0xB8, 0x01, + 0x26, 0x71, 0xC4, 0x80, 0x82, 0x45, 0x0C, 0x60, 0x00, 0x02, 0x26, 0x61, 0x26, 0x68, 0x10, 0x66, + 0x34, 0x61, 0x13, 0x56, 0xC4, 0x5F, 0xD2, 0x38, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x56, 0x57, 0x51, + 0x26, 0x51, 0x30, 0x3D, 0x38, 0x45, 0x00, 0x01, 0x57, 0x61, 0x26, 0x43, 0xB9, 0x45, 0x00, 0x01, + 0x38, 0x3D, 0x04, 0x00, 0x38, 0x45, 0x04, 0x01, 0x26, 0x61, 0x26, 0x43, 0xB9, 0x45, 0x04, 0x01, + 0x38, 0x3D, 0x08, 0x00, 0x38, 0x45, 0x08, 0x01, 0x06, 0x2D, 0x26, 0x43, 0xB9, 0x45, 0x08, 0x01, + 0x20, 0x4C, 0x28, 0x56, 0xC0, 0x01, 0x04, 0x3C, 0x26, 0x54, 0xA9, 0x56, 0xC0, 0x01, 0x3F, 0x4D, + 0x07, 0x00, 0x26, 0x3D, 0xB9, 0x71, 0x44, 0x02, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x0C, 0x40, + 0xFC, 0x01, 0x04, 0x34, 0x26, 0x41, 0x06, 0x2C, 0x26, 0x3C, 0x36, 0x4C, 0x0C, 0xF0, 0xEC, 0x00, + 0xF1, 0xF0, 0x38, 0x71, 0x44, 0x02, 0x34, 0x81, 0x34, 0xDC, 0x34, 0xC4, 0xF2, 0xBB, 0x0C, 0x70, + 0x00, 0x02, 0x26, 0x71, 0x26, 0x7B, 0x06, 0x6A, 0xC4, 0x61, 0x82, 0x1C, 0x98, 0x57, 0x01, 0x00, + 0x82, 0x16, 0x90, 0x57, 0x82, 0x14, 0x06, 0x56, 0xC6, 0x59, 0xD2, 0x0E, 0x0C, 0x40, 0x00, 0x02, + 0x26, 0x41, 0x26, 0x45, 0x18, 0x27, 0x01, 0x00, 0x10, 0x34, 0xC6, 0x23, 0x92, 0x03, 0x10, 0x37, + 0x91, 0x34, 0x24, 0x51, 0xF2, 0xF2, 0x10, 0x57, 0x99, 0x57, 0x01, 0x00, 0x34, 0x61, 0x34, 0x71, + 0xF2, 0xE4, 0x06, 0x76, 0xC6, 0x7A, 0x8A, 0x7B, 0xFF, 0xFF, 0x0C, 0x50, 0x00, 0x02, 0x26, 0x51, + 0x26, 0x57, 0x90, 0x45, 0x92, 0x03, 0x91, 0x65, 0x24, 0x61, 0x24, 0x71, 0xF2, 0xF4, 0x18, 0x7D, + 0xE5, 0x00, 0x0C, 0x30, 0x00, 0x02, 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, 0x57, 0x61, 0x26, 0x76, + 0x18, 0x6D, 0xE4, 0x00, 0x26, 0x31, 0x26, 0x76, 0x26, 0x71, 0x10, 0x77, 0x26, 0x73, 0x10, 0x57, + 0x14, 0x71, 0x26, 0x75, 0xB3, 0x77, 0x22, 0x4D, 0x06, 0x67, 0x57, 0x61, 0x26, 0x61, 0x28, 0x36, + 0xC0, 0x01, 0x99, 0x5D, 0x4E, 0x01, 0x2F, 0x25, 0x05, 0x00, 0x2F, 0x45, 0x02, 0x00, 0x57, 0x41, + 0xA9, 0x3D, 0x4C, 0x01, 0x26, 0x4E, 0x04, 0x61, 0x2F, 0xF6, 0x04, 0x00, 0xE8, 0xFF, 0xA6, 0x01, + 0x32, 0x3D, 0x26, 0x52, 0x57, 0x51, 0x26, 0x5E, 0x26, 0x65, 0x99, 0xB6, 0xA6, 0x01, 0x18, 0x65, + 0xA6, 0x01, 0x24, 0x61, 0x99, 0x65, 0xA6, 0x01, 0x13, 0x63, 0xC6, 0xC6, 0xA9, 0x6D, 0xEA, 0x00, + 0x06, 0x5C, 0xB2, 0x02, 0x06, 0x56, 0x2F, 0x97, 0x07, 0x00, 0x2F, 0x67, 0x09, 0x00, 0x57, 0x61, + 0x26, 0x61, 0xB8, 0xA6, 0x08, 0x01, 0x23, 0xC5, 0x92, 0x02, 0x04, 0xA1, 0x26, 0x79, 0x57, 0x71, + 0x2F, 0x97, 0x01, 0x00, 0x38, 0x29, 0x00, 0x01, 0xB9, 0xA9, 0x08, 0x01, 0x06, 0x3A, 0xAB, 0x8F, + 0x00, 0x00, 0x04, 0x3A, 0xAB, 0x8F, 0x00, 0x00, 0xA9, 0x2D, 0x48, 0x01, 0x38, 0x29, 0x04, 0x01, + 0x06, 0x3A, 0xAB, 0x8F, 0x00, 0x00, 0x04, 0x3A, 0xAB, 0x8F, 0x00, 0x00, 0xA9, 0x2D, 0x4A, 0x01, + 0x24, 0xB1, 0x24, 0xD8, 0xC6, 0xB8, 0x22, 0x9C, 0xF2, 0x05, 0x24, 0x61, 0xC4, 0x6C, 0x92, 0xBD, + 0xF2, 0xCC, 0xA9, 0xCE, 0x22, 0x00, 0x58, 0xC1, 0x58, 0x02, 0x58, 0x81, 0x48, 0x02, 0x2C, 0x10, + 0x68, 0x02, 0xE1, 0xF0, 0x06, 0x64, 0x04, 0x41, 0xB9, 0x41, 0x28, 0x02, 0xFA, 0x93, 0xFE, 0xFF, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x64, 0x09, 0x04, 0x30, 0x0C, 0x40, 0x58, 0x00, + 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x99, 0x00, 0x84, 0x08, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x2F, 0x75, 0x05, 0x00, 0x26, 0x75, 0x57, 0x71, 0x26, 0x75, 0x3C, 0x10, + 0x14, 0x00, 0x34, 0x51, 0xD9, 0xC1, 0x04, 0x00, 0x2F, 0xE4, 0x07, 0x00, 0x2F, 0x75, 0x05, 0x00, + 0x26, 0x75, 0x57, 0x71, 0x26, 0x75, 0x26, 0x74, 0x26, 0x77, 0x34, 0x72, 0x26, 0xEE, 0x26, 0xE3, + 0xB1, 0xB1, 0x26, 0x37, 0x34, 0x41, 0x04, 0x70, 0x06, 0xF3, 0x04, 0x60, 0x2F, 0xD7, 0x05, 0x00, + 0xCC, 0xD0, 0x11, 0x00, 0xD2, 0x09, 0x2F, 0xC6, 0x04, 0x00, 0xC4, 0xCC, 0xD2, 0x05, 0x70, 0xBF, + 0x70, 0xCE, 0xC6, 0xBC, 0x12, 0x0E, 0x24, 0x61, 0xC4, 0x63, 0x24, 0xF2, 0x92, 0xF2, 0x24, 0x71, + 0xC4, 0x73, 0x2C, 0x30, 0x1A, 0x00, 0x92, 0xE9, 0x70, 0x7E, 0xB1, 0x72, 0x04, 0x21, 0xF2, 0x02, + 0x04, 0x20, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x58, 0x01, 0x0C, 0x20, 0x82, 0x00, 0x26, 0x21, 0x04, 0x30, 0x04, 0x44, 0xD9, 0xC1, + 0x48, 0x01, 0xD9, 0x81, 0x38, 0x01, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x34, 0x00, + 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x21, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x70, + 0x80, 0x08, 0x0C, 0x60, 0xFF, 0x0F, 0xA9, 0x67, 0x08, 0x00, 0x18, 0x67, 0x02, 0x04, 0xA9, 0x07, + 0x0A, 0x00, 0xA9, 0x07, 0x0C, 0x00, 0xC4, 0x62, 0xA9, 0x07, 0xDC, 0x00, 0xA9, 0x07, 0xA4, 0x01, + 0x78, 0xD7, 0x0E, 0x00, 0x06, 0xA7, 0xC2, 0x08, 0x38, 0x70, 0xE4, 0x10, 0x0C, 0x30, 0x26, 0x00, + 0x26, 0x37, 0x20, 0x73, 0xF2, 0x18, 0xC4, 0x62, 0x92, 0x08, 0x38, 0x70, 0xE4, 0x10, 0x0C, 0x40, + 0x24, 0x00, 0x26, 0x47, 0x20, 0x74, 0xF2, 0x0F, 0x18, 0x70, 0xFB, 0x10, 0x0C, 0x90, 0x2C, 0x01, + 0xC4, 0x70, 0xB9, 0x91, 0xB0, 0x00, 0x92, 0x09, 0x38, 0x70, 0xE4, 0x10, 0x0C, 0xC0, 0x22, 0x00, + 0x26, 0xC7, 0x20, 0x7C, 0xB9, 0x71, 0xB0, 0x00, 0x38, 0x71, 0xB0, 0x00, 0x28, 0xCA, 0x46, 0x01, + 0x38, 0xB0, 0xE4, 0x10, 0x26, 0xC7, 0x23, 0xCC, 0x0C, 0x70, 0x28, 0x00, 0xA9, 0xCA, 0x3C, 0x01, + 0x26, 0x7B, 0x20, 0x77, 0x04, 0x3D, 0xB9, 0x71, 0x14, 0x01, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, + 0xE4, 0x70, 0x13, 0x22, 0xEB, 0x97, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2A, 0x92, 0x06, + 0x28, 0x7B, 0x2A, 0x00, 0x26, 0xC7, 0xA9, 0xCA, 0x3C, 0x01, 0x2B, 0xB2, 0x00, 0x00, 0x38, 0xE0, + 0xE4, 0x10, 0x04, 0xB1, 0x28, 0x3E, 0xBC, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0xAB, 0x8F, 0x00, 0x00, 0xB9, 0x21, 0x18, 0x01, 0x18, 0x2A, 0x02, 0x04, 0xC6, 0x2B, 0xC2, 0x08, + 0x18, 0x3E, 0x3D, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x86, 0xB2, 0x92, 0x02, 0x04, 0xB1, 0x18, 0x3E, + 0x3C, 0x00, 0x78, 0x2A, 0xDA, 0x00, 0x06, 0xCA, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0xEB, 0x93, 0x00, 0x00, 0x28, 0x7E, 0x3A, 0x00, 0xC6, 0x27, 0xB2, 0x02, 0x06, 0x27, 0x06, 0x3B, + 0xAB, 0x8F, 0x00, 0x00, 0xA9, 0x2C, 0xDC, 0x00, 0x06, 0x3B, 0x06, 0x2D, 0xAB, 0x8F, 0x00, 0x00, + 0x30, 0x7E, 0xB9, 0x21, 0x1C, 0x01, 0x0C, 0x60, 0x00, 0x40, 0xD6, 0x67, 0x82, 0x06, 0x0C, 0x60, + 0x80, 0x06, 0xB9, 0x61, 0xAC, 0x00, 0xF2, 0x05, 0x0C, 0x90, 0x80, 0x02, 0xB9, 0x91, 0xAC, 0x00, + 0xDC, 0x70, 0x00, 0x80, 0x82, 0x06, 0x0C, 0x70, 0x80, 0x06, 0xB9, 0x71, 0xC8, 0x00, 0xF2, 0x05, + 0x0C, 0xC0, 0x80, 0x02, 0xB9, 0xC1, 0xC8, 0x00, 0x0C, 0x70, 0xCE, 0x08, 0xB9, 0x71, 0x98, 0x00, + 0x04, 0x70, 0xB9, 0x71, 0x90, 0x00, 0xB9, 0x71, 0xC4, 0x00, 0x38, 0x71, 0x90, 0x00, 0x04, 0xC0, + 0x23, 0x77, 0x06, 0x97, 0xB9, 0x71, 0xB4, 0x00, 0x26, 0x77, 0x26, 0x79, 0x57, 0x71, 0x26, 0x79, + 0x23, 0x77, 0xB9, 0x71, 0x20, 0x01, 0x0C, 0x70, 0xA2, 0x08, 0xB9, 0x71, 0x9C, 0x00, 0x38, 0x71, + 0x90, 0x00, 0xB9, 0xC1, 0xA0, 0x00, 0x13, 0x77, 0xB9, 0x71, 0x10, 0x01, 0x34, 0x71, 0xB9, 0x71, + 0x24, 0x01, 0x38, 0xC1, 0xA0, 0x00, 0x38, 0x31, 0x20, 0x01, 0x26, 0x3C, 0x23, 0x33, 0x06, 0xD3, + 0x26, 0xD3, 0x0C, 0x70, 0x80, 0x02, 0x26, 0x7D, 0x70, 0x67, 0x38, 0x70, 0xE4, 0x10, 0xB9, 0x31, + 0x8C, 0x00, 0x43, 0xEC, 0x28, 0x77, 0x5C, 0x00, 0x43, 0xB3, 0xC6, 0x67, 0x02, 0x06, 0x28, 0x7A, + 0xA4, 0x01, 0x24, 0x71, 0xA9, 0x7A, 0xA4, 0x01, 0x0C, 0x70, 0x34, 0x00, 0xE7, 0xB1, 0x26, 0x71, + 0x38, 0xC1, 0x8C, 0x00, 0x26, 0x7B, 0x10, 0x77, 0x54, 0xC7, 0x63, 0x7C, 0xD4, 0x71, 0x9A, 0xA5, + 0x03, 0x00, 0x38, 0x71, 0x90, 0x00, 0xCC, 0x70, 0x11, 0x00, 0x82, 0x0C, 0xC4, 0xEA, 0x12, 0x0A, + 0x04, 0x9B, 0x0C, 0x60, 0x11, 0x00, 0xB9, 0x91, 0xA8, 0x00, 0xB9, 0x61, 0xA4, 0x00, 0x04, 0x72, + 0xF2, 0x09, 0x04, 0x9D, 0x0C, 0x60, 0x12, 0x00, 0xB9, 0x91, 0xA8, 0x00, 0xB9, 0x61, 0xA4, 0x00, + 0x04, 0x71, 0xB9, 0x71, 0x94, 0x00, 0x06, 0x73, 0x0C, 0x70, 0x80, 0x06, 0x26, 0x7D, 0x38, 0x91, + 0x18, 0x01, 0x70, 0x77, 0x43, 0x69, 0xC6, 0x76, 0x2A, 0x80, 0x03, 0x00, 0x38, 0x61, 0x94, 0x00, + 0xC4, 0x61, 0x92, 0x08, 0x38, 0x91, 0x14, 0x01, 0x43, 0x69, 0xC6, 0x76, 0x2A, 0x76, 0x03, 0x00, + 0xF2, 0x06, 0x78, 0x6A, 0x3C, 0x01, 0xC6, 0x67, 0x1A, 0x70, 0x03, 0x00, 0x38, 0x51, 0x90, 0x00, + 0xB9, 0x01, 0x88, 0x00, 0x0C, 0x20, 0x88, 0x00, 0x26, 0x21, 0x0C, 0x30, 0x80, 0x06, 0x06, 0x4E, + 0x2B, 0x15, 0x02, 0x00, 0xC4, 0x20, 0x8A, 0x61, 0x03, 0x00, 0x38, 0x71, 0xAC, 0x00, 0x26, 0xD7, + 0x70, 0x6D, 0x28, 0x7A, 0x0E, 0x00, 0x3F, 0x77, 0x06, 0x00, 0xC4, 0x70, 0x0A, 0x56, 0x03, 0x00, + 0x78, 0x6A, 0xDC, 0x00, 0xC6, 0x76, 0x0A, 0x51, 0x03, 0x00, 0x38, 0x71, 0x88, 0x00, 0x28, 0x6A, + 0x0C, 0x00, 0xC6, 0x76, 0x22, 0x09, 0xA9, 0x7A, 0x0C, 0x00, 0x18, 0x7A, 0x04, 0x00, 0x24, 0x71, + 0x13, 0x77, 0xB9, 0x71, 0xC4, 0x00, 0x0C, 0x90, 0x34, 0x00, 0x26, 0x91, 0x26, 0xB9, 0x10, 0x5B, + 0x04, 0x71, 0x06, 0x67, 0x53, 0x6C, 0xC4, 0xEC, 0x66, 0x65, 0x91, 0x6B, 0x82, 0x0C, 0x38, 0x51, + 0x8C, 0x00, 0x26, 0x57, 0x06, 0x65, 0xE7, 0x61, 0x26, 0x69, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, + 0x66, 0x75, 0x91, 0x76, 0x38, 0xC1, 0x90, 0x00, 0xCC, 0xC0, 0x11, 0x00, 0x82, 0x36, 0x38, 0x71, + 0x8C, 0x00, 0x0C, 0xF0, 0x34, 0x00, 0x24, 0x7D, 0x06, 0x57, 0xE7, 0x51, 0x26, 0xF1, 0x04, 0x67, + 0x56, 0x67, 0x26, 0x5F, 0x04, 0x71, 0x10, 0x45, 0x06, 0x37, 0x53, 0x36, 0x06, 0x63, 0xC4, 0xE0, + 0x66, 0x64, 0x91, 0x65, 0x92, 0x12, 0x38, 0x71, 0x8C, 0x00, 0x0C, 0x40, 0x34, 0x00, 0x24, 0x7E, + 0x06, 0x67, 0xE7, 0x61, 0x26, 0x41, 0x04, 0x57, 0x56, 0x57, 0x26, 0x64, 0x04, 0x71, 0x53, 0x75, + 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, 0xF2, 0x11, 0x38, 0x51, 0x8C, 0x00, 0x0C, 0x90, 0x34, 0x00, + 0x24, 0x5C, 0x06, 0x65, 0xE7, 0x61, 0x26, 0x91, 0x26, 0x69, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, + 0xC4, 0xEC, 0x66, 0x75, 0x91, 0x76, 0x92, 0xE0, 0x38, 0xC1, 0xA0, 0x00, 0x38, 0x41, 0x1C, 0x01, + 0x13, 0xCC, 0x0C, 0xF0, 0x68, 0x00, 0x04, 0x20, 0xB9, 0xC1, 0xB8, 0x00, 0x23, 0x44, 0x34, 0xC1, + 0x26, 0xF1, 0x0C, 0x60, 0xFF, 0xFF, 0x06, 0xE1, 0x06, 0x32, 0xB9, 0xC1, 0xC0, 0x00, 0xB9, 0x41, + 0xBC, 0x00, 0x38, 0x71, 0x24, 0x01, 0x06, 0xDF, 0x26, 0x76, 0x33, 0x77, 0x2F, 0x87, 0x07, 0x00, + 0x26, 0x87, 0x57, 0x81, 0x26, 0x87, 0x23, 0x88, 0x06, 0x4E, 0x0C, 0x50, 0xFF, 0xFF, 0x38, 0x91, + 0xC0, 0x00, 0xC4, 0x70, 0x26, 0x95, 0x33, 0x99, 0x22, 0x0B, 0x38, 0xC1, 0xA4, 0x00, 0xC6, 0x7C, + 0x32, 0x07, 0xC4, 0x90, 0x22, 0x05, 0x38, 0xC1, 0xA8, 0x00, 0xC6, 0x9C, 0x22, 0x03, 0xA1, 0x04, + 0xF2, 0x1F, 0x26, 0x98, 0x38, 0xC1, 0xAC, 0x00, 0x23, 0x99, 0x26, 0x99, 0x26, 0xC9, 0x20, 0xBC, + 0x38, 0xC1, 0xBC, 0x00, 0x36, 0xBC, 0x06, 0xCB, 0xC3, 0xBB, 0x32, 0x02, 0x04, 0xC0, 0xC4, 0x62, + 0xA1, 0xC4, 0x43, 0xBC, 0xD2, 0x0D, 0xC4, 0x52, 0xD2, 0x0B, 0x38, 0xC1, 0xC8, 0x00, 0x26, 0x2B, + 0x26, 0x9C, 0x20, 0xC9, 0x38, 0x91, 0xBC, 0x00, 0x24, 0x31, 0x36, 0xC9, 0xA1, 0xCD, 0x24, 0x51, + 0x23, 0x55, 0xC4, 0x54, 0x24, 0x42, 0x24, 0xD2, 0x92, 0xCB, 0x24, 0x61, 0x23, 0x66, 0xC4, 0x64, + 0x24, 0xEA, 0x24, 0xF6, 0x92, 0xB7, 0x98, 0x70, 0xFA, 0x10, 0x92, 0x1A, 0x34, 0x31, 0xC4, 0x30, + 0x12, 0x02, 0x04, 0x31, 0x38, 0xC1, 0x94, 0x00, 0xC4, 0xC1, 0x92, 0x12, 0x78, 0xE1, 0x18, 0x00, + 0x38, 0xD0, 0xE4, 0x10, 0xAB, 0x8F, 0x00, 0x00, 0x3F, 0x22, 0x0E, 0x00, 0x28, 0x7D, 0x34, 0x00, + 0xC6, 0x27, 0xB2, 0x06, 0x28, 0x7D, 0x36, 0x00, 0xC6, 0xE7, 0x2A, 0x77, 0x02, 0x00, 0x38, 0x70, + 0xE4, 0x10, 0x78, 0x21, 0x78, 0x00, 0x28, 0x37, 0x32, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x61, 0x94, 0x00, 0x43, 0x22, 0xC4, 0x61, 0x92, 0x32, + 0x06, 0x76, 0x0C, 0x70, 0xE8, 0x10, 0x38, 0x31, 0x8C, 0x00, 0x28, 0x80, 0xE8, 0x10, 0x28, 0xF7, + 0x02, 0x00, 0x28, 0xE7, 0x04, 0x00, 0x28, 0xD7, 0x06, 0x00, 0x28, 0xC7, 0x08, 0x00, 0x04, 0x48, + 0x26, 0x41, 0x04, 0x50, 0x2C, 0x30, 0x1C, 0x00, 0x1C, 0xB0, 0x32, 0x00, 0x2F, 0x75, 0x03, 0x00, + 0x04, 0x60, 0xC6, 0x78, 0x82, 0x0D, 0xC6, 0x7F, 0x82, 0x0B, 0xC6, 0x7E, 0x82, 0x09, 0xC6, 0x7D, + 0x82, 0x07, 0xC6, 0x7C, 0x82, 0x05, 0x2F, 0x96, 0x04, 0x00, 0xA9, 0x09, 0x28, 0x00, 0x34, 0x6A, + 0xC6, 0x6B, 0x34, 0x71, 0x92, 0xEF, 0x34, 0x5D, 0x1C, 0x70, 0x41, 0x00, 0xC6, 0x57, 0x34, 0x42, + 0x92, 0xE6, 0x78, 0x71, 0x18, 0x00, 0x28, 0x6A, 0x08, 0x00, 0xB9, 0x71, 0x88, 0x00, 0xC6, 0x67, + 0x02, 0x03, 0xA9, 0x7A, 0x08, 0x00, 0x28, 0x6A, 0x0A, 0x00, 0xC6, 0x67, 0x32, 0x03, 0xA9, 0x7A, + 0x0A, 0x00, 0x18, 0x7A, 0x04, 0x00, 0x78, 0x61, 0x76, 0x00, 0x38, 0x91, 0xB8, 0x00, 0x38, 0xC1, + 0x10, 0x01, 0xD7, 0x71, 0xC6, 0x62, 0x26, 0x7A, 0x99, 0x97, 0xE4, 0x00, 0x99, 0xC7, 0xE5, 0x00, + 0x04, 0x72, 0x12, 0x0A, 0x78, 0x61, 0x70, 0x00, 0xC6, 0x62, 0x12, 0x06, 0x78, 0x61, 0x7C, 0x00, + 0xC6, 0x62, 0x12, 0x02, 0x04, 0x70, 0x78, 0x61, 0x7A, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, + 0x74, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x74, + 0x78, 0x61, 0x72, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, 0x70, 0x00, 0xC6, 0x62, 0x12, 0x05, + 0x78, 0x61, 0x74, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x78, 0x78, 0x61, 0x7E, 0x00, 0xC6, 0x62, + 0x12, 0x09, 0x78, 0x61, 0x7C, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, + 0x02, 0x03, 0x6C, 0x70, 0x10, 0x00, 0x04, 0x32, 0x04, 0x24, 0x04, 0xF8, 0x56, 0x37, 0x56, 0x27, + 0x56, 0xF7, 0x04, 0x68, 0x0C, 0x50, 0x28, 0x00, 0x14, 0x42, 0x5C, 0x70, 0x10, 0x00, 0x26, 0x61, + 0x26, 0x51, 0x26, 0x41, 0x13, 0x33, 0x13, 0x22, 0x13, 0xFF, 0x13, 0x77, 0xC4, 0x30, 0x92, 0x02, + 0xA1, 0x05, 0xC4, 0x20, 0x92, 0x03, 0xA9, 0x05, 0x08, 0x00, 0xC4, 0xF0, 0x92, 0x02, 0xA1, 0x06, + 0xC4, 0x70, 0x92, 0x03, 0xA9, 0x06, 0x28, 0x00, 0x34, 0x62, 0xC6, 0x64, 0x34, 0x5A, 0x92, 0xEF, + 0x70, 0x71, 0xB9, 0x71, 0x8C, 0x00, 0x04, 0x72, 0x26, 0x71, 0x70, 0x77, 0x38, 0x21, 0x8C, 0x00, + 0xB9, 0x71, 0x94, 0x00, 0x04, 0x74, 0x26, 0x71, 0x70, 0x77, 0x38, 0x31, 0x94, 0x00, 0xB9, 0x71, + 0xA4, 0x00, 0x04, 0x76, 0x26, 0x71, 0x70, 0x77, 0x38, 0x41, 0xA4, 0x00, 0xB9, 0x71, 0xA8, 0x00, + 0x04, 0x78, 0x26, 0x71, 0x70, 0x77, 0x38, 0x51, 0xA8, 0x00, 0x06, 0x67, 0xB9, 0x71, 0xB8, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x0C, 0x70, 0x28, 0x00, 0x26, 0x71, 0x70, 0x77, 0x06, 0x92, + 0xB9, 0x71, 0xBC, 0x00, 0x0C, 0x70, 0x2A, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x21, 0xBC, 0x00, + 0xB9, 0x71, 0xC0, 0x00, 0x0C, 0x70, 0x2C, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x31, 0xC0, 0x00, + 0xB9, 0x71, 0xCC, 0x00, 0x0C, 0x70, 0x2E, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x41, 0xCC, 0x00, + 0xB9, 0x71, 0xD0, 0x00, 0x0C, 0x70, 0x30, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x51, 0xD0, 0x00, + 0x06, 0x67, 0xB9, 0x71, 0xD4, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x04, 0x7A, 0x26, 0x71, + 0x70, 0x77, 0x06, 0xC2, 0xB9, 0x71, 0xD8, 0x00, 0x04, 0x7C, 0x26, 0x71, 0x70, 0x77, 0x38, 0x21, + 0xD8, 0x00, 0xB9, 0x71, 0xDC, 0x00, 0x04, 0x7E, 0x26, 0x71, 0x70, 0x77, 0x38, 0x31, 0xDC, 0x00, + 0xB9, 0x71, 0xE0, 0x00, 0x0C, 0x70, 0x10, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x41, 0xE0, 0x00, + 0xB9, 0x71, 0xE4, 0x00, 0x0C, 0x70, 0x12, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x51, 0xE4, 0x00, + 0x06, 0x67, 0xB9, 0x71, 0xE8, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x0C, 0x70, 0x14, 0x00, + 0x26, 0x71, 0x70, 0x77, 0xB9, 0x21, 0xEC, 0x00, 0x78, 0x41, 0x18, 0x00, 0xB9, 0x71, 0xF0, 0x00, + 0x0C, 0x70, 0x16, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x21, 0xF0, 0x00, 0xB9, 0x71, 0xF4, 0x00, + 0x0C, 0x70, 0x1A, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x31, 0xF4, 0x00, 0xB9, 0x71, 0xF8, 0x00, + 0x0C, 0x70, 0x1C, 0x00, 0x26, 0x71, 0x70, 0x77, 0x38, 0x51, 0xF8, 0x00, 0x06, 0x67, 0xB9, 0x71, + 0xFC, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x0C, 0x70, 0x20, 0x00, 0x26, 0x71, 0x70, 0x77, + 0x78, 0xD1, 0x1E, 0x00, 0xB9, 0x71, 0x00, 0x01, 0x0C, 0x70, 0x22, 0x00, 0x26, 0x71, 0x70, 0x77, + 0x38, 0x31, 0x00, 0x01, 0xB9, 0x71, 0x04, 0x01, 0x0C, 0x70, 0x24, 0x00, 0x26, 0x71, 0x70, 0x77, + 0x38, 0x41, 0x04, 0x01, 0xB9, 0x71, 0x08, 0x01, 0x0C, 0x70, 0x26, 0x00, 0x26, 0x71, 0x70, 0x77, + 0x38, 0x51, 0x08, 0x01, 0x06, 0xE2, 0x06, 0x67, 0x06, 0x2D, 0xB9, 0x71, 0x0C, 0x01, 0x0C, 0xF0, + 0xE0, 0x00, 0xF1, 0xF0, 0x38, 0x31, 0xEC, 0x00, 0x06, 0xB2, 0x06, 0x4E, 0x06, 0x29, 0x06, 0x5B, + 0x06, 0x6C, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, 0x04, 0x7A, 0x04, 0x8A, + 0xA9, 0x71, 0x18, 0x00, 0x06, 0xE8, 0x06, 0x29, 0x38, 0x91, 0x98, 0x00, 0x20, 0x39, 0xEB, 0x8B, + 0x00, 0x00, 0x38, 0x71, 0x98, 0x00, 0x06, 0x92, 0x28, 0x37, 0x02, 0x00, 0x38, 0x21, 0xEC, 0x00, + 0xEB, 0x8B, 0x00, 0x00, 0x38, 0xF1, 0x98, 0x00, 0x06, 0x72, 0x28, 0x3F, 0x04, 0x00, 0xB9, 0x71, + 0x34, 0x01, 0x06, 0x2E, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x51, 0x98, 0x00, 0x06, 0x42, 0x28, 0x35, + 0x06, 0x00, 0xB9, 0x41, 0x30, 0x01, 0x06, 0x2B, 0xEB, 0x8B, 0x00, 0x00, 0x06, 0xE2, 0x06, 0x2C, + 0x38, 0xC1, 0x98, 0x00, 0x28, 0x3C, 0x08, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x71, 0x34, 0x01, + 0x38, 0x41, 0x30, 0x01, 0x06, 0x37, 0x06, 0x62, 0x06, 0x5E, 0x06, 0x29, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x06, 0x38, 0xEB, 0x93, 0x00, 0x00, 0x0C, 0xE0, 0x80, 0x08, 0x18, 0x7E, 0x04, 0x00, + 0x86, 0x22, 0xD7, 0x71, 0x26, 0x7E, 0x32, 0x02, 0x04, 0x20, 0xA9, 0x27, 0xE8, 0x00, 0x38, 0x31, + 0xD8, 0x00, 0x38, 0x41, 0xF0, 0x00, 0x38, 0x61, 0xBC, 0x00, 0x38, 0x21, 0x8C, 0x00, 0x06, 0x5D, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x8C, 0x00, 0x38, 0x31, 0xE8, 0x00, 0x38, 0x41, + 0xFC, 0x00, 0x38, 0x51, 0x0C, 0x01, 0x38, 0x61, 0xD4, 0x00, 0x38, 0x21, 0xB8, 0x00, 0x0C, 0xF0, + 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xC2, 0x38, 0x31, 0xDC, 0x00, 0x38, 0x41, 0xF4, 0x00, 0x38, 0x51, + 0x00, 0x01, 0x38, 0x61, 0xC0, 0x00, 0x38, 0x21, 0x94, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, + 0x06, 0xB2, 0x38, 0x31, 0xE0, 0x00, 0x78, 0x41, 0x18, 0x00, 0x38, 0x51, 0x04, 0x01, 0x38, 0x61, + 0xCC, 0x00, 0x38, 0x21, 0xA4, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xD2, 0x38, 0x31, + 0xE4, 0x00, 0x38, 0x41, 0xF8, 0x00, 0x38, 0x51, 0x08, 0x01, 0x38, 0x61, 0xD0, 0x00, 0x38, 0x21, + 0xA8, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0x92, 0x38, 0x21, 0x8C, 0x00, 0x06, 0x3B, + 0x06, 0x4D, 0x06, 0x59, 0x06, 0x6C, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, + 0x04, 0x7A, 0x04, 0x8A, 0xA9, 0x71, 0x18, 0x00, 0x06, 0xD8, 0x38, 0x71, 0x9C, 0x00, 0x38, 0x21, + 0x8C, 0x00, 0x20, 0x37, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0xF1, 0x9C, 0x00, 0x06, 0x72, 0x28, 0x3F, + 0x02, 0x00, 0xB9, 0x71, 0x34, 0x01, 0x06, 0x2B, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x41, 0x9C, 0x00, + 0x06, 0xB2, 0x28, 0x34, 0x04, 0x00, 0x06, 0x2D, 0xEB, 0x8B, 0x00, 0x00, 0x06, 0x42, 0x06, 0x29, + 0x38, 0x91, 0x9C, 0x00, 0x28, 0x39, 0x06, 0x00, 0xB9, 0x41, 0x30, 0x01, 0xEB, 0x8B, 0x00, 0x00, + 0x28, 0x39, 0x08, 0x00, 0x06, 0xD2, 0x06, 0x2C, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x71, 0x34, 0x01, + 0x38, 0x41, 0x30, 0x01, 0x06, 0x62, 0x06, 0x3B, 0x06, 0x27, 0x06, 0x5D, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x06, 0x38, 0xEB, 0x93, 0x00, 0x00, 0x18, 0x7E, 0x04, 0x00, 0x86, 0x22, 0x06, 0x67, + 0xD7, 0x61, 0x0C, 0xC0, 0x80, 0x08, 0x26, 0x6C, 0x32, 0x02, 0x04, 0x20, 0x24, 0x71, 0x13, 0x77, + 0xC4, 0x7A, 0xA9, 0x26, 0xE6, 0x00, 0x99, 0x7E, 0x04, 0x00, 0xC2, 0x07, 0x04, 0x7B, 0x0C, 0xF0, + 0x80, 0x08, 0x99, 0x7F, 0x04, 0x00, 0xF2, 0x1D, 0x38, 0x71, 0xA0, 0x00, 0x38, 0x91, 0x9C, 0x00, + 0x24, 0x71, 0xC4, 0x7D, 0x24, 0x92, 0xB9, 0x71, 0xA0, 0x00, 0xB9, 0x91, 0x9C, 0x00, 0x9A, 0x2A, + 0xFC, 0xFF, 0x38, 0x71, 0xB4, 0x00, 0x38, 0xC1, 0x98, 0x00, 0x24, 0x71, 0x43, 0x77, 0xCC, 0x70, + 0x12, 0x00, 0x24, 0xC2, 0xB9, 0x71, 0x90, 0x00, 0xB9, 0xC1, 0x98, 0x00, 0x9A, 0xFF, 0xFB, 0xFF, + 0x38, 0xE0, 0xE4, 0x10, 0x30, 0x7E, 0xDC, 0x70, 0x80, 0x00, 0x82, 0x68, 0x98, 0x7A, 0x04, 0x00, + 0x92, 0x17, 0xA8, 0x7A, 0x46, 0x01, 0x82, 0x0B, 0x18, 0x7A, 0x44, 0x01, 0x18, 0x6E, 0x41, 0x00, + 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7A, 0x44, 0x01, 0xF2, 0x58, 0xB9, 0x0A, 0x40, 0x01, + 0x99, 0x0A, 0x45, 0x01, 0x99, 0x0A, 0x44, 0x01, 0xA9, 0x0A, 0x46, 0x01, 0xF2, 0x4F, 0x18, 0xDA, + 0x45, 0x01, 0x18, 0x7E, 0x3E, 0x00, 0xC6, 0xD7, 0xB2, 0x11, 0x24, 0xD1, 0x13, 0xDD, 0x99, 0xDA, + 0x45, 0x01, 0x18, 0x7E, 0x3F, 0x00, 0xC6, 0x7D, 0xB2, 0x3F, 0x38, 0x7A, 0x40, 0x01, 0x28, 0x6A, + 0x0C, 0x00, 0x26, 0x76, 0xB9, 0x7A, 0x40, 0x01, 0xF2, 0x37, 0xC6, 0xD7, 0x92, 0x35, 0x38, 0x7A, + 0x40, 0x01, 0x28, 0x2A, 0x0C, 0x00, 0x26, 0x27, 0xB9, 0x2A, 0x40, 0x01, 0x18, 0x3E, 0x3F, 0x00, + 0x3F, 0x33, 0x0D, 0x00, 0x24, 0x31, 0xAB, 0x8F, 0x00, 0x00, 0xA9, 0x0A, 0x46, 0x01, 0x28, 0x7E, + 0x42, 0x00, 0xB9, 0x2A, 0x40, 0x01, 0x06, 0xC2, 0xC6, 0x27, 0xC2, 0x15, 0x38, 0x71, 0xB0, 0x00, + 0x18, 0x3E, 0x40, 0x00, 0x36, 0x27, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xAB, 0x8F, + 0x00, 0x00, 0x23, 0x22, 0xA9, 0x2A, 0x46, 0x01, 0x28, 0x7E, 0x44, 0x00, 0xC6, 0x27, 0xC2, 0x03, + 0xA9, 0x7A, 0x46, 0x01, 0x18, 0x3E, 0x3F, 0x00, 0x06, 0x2C, 0x3F, 0x33, 0x0D, 0x00, 0xEB, 0x8B, + 0x00, 0x00, 0xB9, 0x2A, 0x40, 0x01, 0x99, 0x0A, 0x44, 0x01, 0x18, 0x8A, 0x04, 0x00, 0x68, 0x9A, + 0x89, 0x07, 0x04, 0xB0, 0x14, 0xE1, 0x06, 0xCB, 0xC6, 0xC8, 0x32, 0x4D, 0x06, 0xDC, 0xD7, 0xD1, + 0x26, 0xDA, 0x78, 0x2D, 0xE6, 0x00, 0x04, 0x3A, 0xEB, 0x93, 0x00, 0x00, 0x06, 0x42, 0xA9, 0x2D, + 0xE6, 0x00, 0x78, 0x2D, 0xE8, 0x00, 0xB9, 0x41, 0x30, 0x01, 0x04, 0x3A, 0xEB, 0x93, 0x00, 0x00, + 0x38, 0x41, 0x30, 0x01, 0x18, 0x3D, 0xE4, 0x00, 0x43, 0x22, 0xA9, 0x2D, 0xE8, 0x00, 0x43, 0x44, + 0x0C, 0x70, 0xA6, 0x0F, 0x04, 0x60, 0x78, 0x57, 0x04, 0x00, 0xC6, 0x54, 0x12, 0x12, 0x78, 0x57, + 0x06, 0x00, 0xC6, 0x54, 0x22, 0x0E, 0x70, 0x57, 0xC6, 0x52, 0x12, 0x0B, 0x78, 0x57, 0x02, 0x00, + 0xC6, 0x52, 0x22, 0x07, 0x0C, 0x50, 0xE5, 0x00, 0x26, 0x5D, 0x10, 0x55, 0xB9, 0x51, 0x90, 0x00, + 0x38, 0x51, 0x90, 0x00, 0x06, 0xF5, 0x26, 0x55, 0x26, 0x5F, 0x57, 0x51, 0x26, 0x5F, 0x26, 0x53, + 0x26, 0x55, 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x5F, 0x70, 0x55, 0xC6, 0xB5, 0x32, 0x04, 0x33, 0x96, + 0x06, 0xB5, 0x06, 0xEC, 0x24, 0x61, 0x43, 0x66, 0xC4, 0x62, 0x24, 0x78, 0x92, 0xD5, 0x24, 0xC1, + 0x43, 0xCC, 0xF2, 0xB3, 0x98, 0x7A, 0x05, 0x00, 0xB9, 0xE1, 0x90, 0x00, 0xB9, 0xB1, 0x88, 0x00, + 0x99, 0x9A, 0x89, 0x07, 0x92, 0x23, 0xC4, 0x81, 0xC2, 0x21, 0x98, 0x7A, 0x02, 0x04, 0x92, 0x1E, + 0xB8, 0x71, 0xC4, 0x00, 0x82, 0x1B, 0x34, 0x71, 0xD7, 0x71, 0x26, 0x7A, 0x78, 0x57, 0xE6, 0x00, + 0x78, 0x67, 0xE8, 0x00, 0x0C, 0x40, 0x3E, 0x01, 0x0C, 0x70, 0x66, 0x09, 0x26, 0x4A, 0xC6, 0x74, + 0x82, 0x06, 0xA1, 0x07, 0xA9, 0x07, 0x02, 0x00, 0x24, 0x78, 0xF2, 0xFA, 0x04, 0x71, 0x99, 0x7A, + 0x04, 0x00, 0xA9, 0x5A, 0xE6, 0x00, 0xA9, 0x6A, 0xE8, 0x00, 0x28, 0x5A, 0x06, 0x00, 0x04, 0x71, + 0xD6, 0x75, 0x82, 0x1B, 0x18, 0x5A, 0x04, 0x00, 0xC4, 0x51, 0xC2, 0x39, 0xC4, 0xE0, 0x22, 0x37, + 0xC6, 0xE5, 0x32, 0x0E, 0x06, 0x4E, 0x24, 0xE1, 0x06, 0x7E, 0xD7, 0x71, 0x26, 0x7A, 0x48, 0x67, + 0xE4, 0x00, 0xD7, 0x41, 0x26, 0x4A, 0xC9, 0x64, 0xE4, 0x00, 0x43, 0xEE, 0xF2, 0xF2, 0x06, 0x75, + 0x34, 0x71, 0x99, 0x7A, 0x04, 0x00, 0xF2, 0x23, 0x04, 0x72, 0xD6, 0x75, 0x82, 0x20, 0x18, 0x4A, + 0x04, 0x00, 0xC4, 0x41, 0xC2, 0x1C, 0xC4, 0xE0, 0x22, 0x1A, 0xC6, 0xE4, 0x32, 0x0E, 0x06, 0x3E, + 0x24, 0xE1, 0x06, 0x7E, 0xD7, 0x71, 0x26, 0x7A, 0x48, 0x67, 0xE4, 0x00, 0xD7, 0x31, 0x26, 0x3A, + 0xC9, 0x63, 0xE4, 0x00, 0x43, 0xEE, 0xF2, 0xF2, 0x06, 0x74, 0x34, 0x71, 0x99, 0x7A, 0x04, 0x00, + 0x14, 0xF3, 0x06, 0x75, 0x56, 0x7F, 0x64, 0x71, 0xA9, 0x7A, 0x06, 0x00, 0x18, 0x7A, 0x04, 0x00, + 0xC4, 0x71, 0xCA, 0x48, 0x01, 0x00, 0x18, 0x7A, 0x6D, 0x02, 0x0C, 0x90, 0x00, 0x19, 0xC4, 0x70, + 0x82, 0x03, 0x0C, 0x90, 0xA0, 0x28, 0x0C, 0x20, 0x58, 0x00, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, + 0x16, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x18, 0xCA, 0x04, 0x00, 0x04, 0xB0, 0x06, 0xEB, + 0xC6, 0xEC, 0x32, 0x47, 0x06, 0x7E, 0xD7, 0x71, 0x2F, 0x67, 0x0A, 0x00, 0x2F, 0x7E, 0x0E, 0x00, + 0x2C, 0x60, 0xE4, 0x00, 0x06, 0xDE, 0x26, 0x71, 0xC6, 0xDC, 0x32, 0x38, 0x06, 0x5D, 0xD7, 0x51, + 0x26, 0x5A, 0x78, 0x86, 0x02, 0x00, 0x78, 0x45, 0xE6, 0x00, 0x36, 0x84, 0xC4, 0x80, 0x32, 0x02, + 0x16, 0x88, 0x78, 0x26, 0x04, 0x00, 0x78, 0x55, 0xE8, 0x00, 0x36, 0x25, 0xC4, 0x20, 0x32, 0x02, + 0x16, 0x22, 0x06, 0x32, 0xB9, 0x61, 0x2C, 0x01, 0xB9, 0x71, 0x34, 0x01, 0xEB, 0x8B, 0x00, 0x00, + 0x06, 0x52, 0x06, 0x38, 0x06, 0x28, 0xB9, 0x51, 0x28, 0x01, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x51, + 0x28, 0x01, 0x38, 0x61, 0x2C, 0x01, 0x38, 0x71, 0x34, 0x01, 0x26, 0x25, 0xC6, 0x92, 0xC2, 0x0B, + 0x28, 0x47, 0x58, 0x00, 0x04, 0x51, 0x53, 0x5D, 0xC6, 0xED, 0x66, 0x54, 0xA9, 0x57, 0x58, 0x00, + 0x82, 0x02, 0x04, 0xB1, 0x24, 0xD1, 0x43, 0xDD, 0xF2, 0xC8, 0x24, 0xE1, 0x43, 0xEE, 0xF2, 0xB9, + 0xC4, 0xB1, 0x92, 0x04, 0x99, 0xBA, 0x6D, 0x02, 0xF2, 0x03, 0x99, 0x0A, 0x6D, 0x02, 0x14, 0x71, + 0x26, 0x7C, 0x43, 0x77, 0x14, 0x21, 0xC6, 0x72, 0x82, 0x23, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x51, + 0xA8, 0x65, 0x58, 0x00, 0x82, 0x1A, 0x04, 0x61, 0x26, 0x67, 0x43, 0x66, 0x06, 0x45, 0xC6, 0x6C, + 0x32, 0x14, 0x28, 0x34, 0x58, 0x00, 0x06, 0x53, 0x63, 0x56, 0xD4, 0x51, 0x82, 0x0B, 0x2F, 0x56, + 0x06, 0x00, 0x26, 0x51, 0x28, 0xF5, 0x58, 0x00, 0x66, 0x3F, 0xA9, 0x34, 0x58, 0x00, 0xA9, 0x05, + 0x58, 0x00, 0x24, 0x61, 0x43, 0x66, 0xF2, 0xEC, 0x34, 0x71, 0x43, 0x77, 0xF2, 0xDD, 0x04, 0xC0, + 0x06, 0xDC, 0x18, 0xEA, 0x04, 0x00, 0xC6, 0xDE, 0x3A, 0x8D, 0x00, 0x00, 0x2F, 0x6D, 0x0D, 0x00, + 0x26, 0x61, 0xA8, 0x76, 0x58, 0x00, 0x04, 0x81, 0x26, 0x8D, 0x8A, 0x81, 0x00, 0x00, 0x0C, 0x40, + 0x80, 0x08, 0xD7, 0xD1, 0x26, 0xD4, 0x18, 0x7D, 0xE5, 0x00, 0x38, 0x91, 0xAC, 0x00, 0x78, 0x3D, + 0xE6, 0x00, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x57, 0x57, 0x51, 0x26, 0x75, 0x18, 0x5D, 0xE4, 0x00, + 0x26, 0x75, 0x26, 0x77, 0x26, 0x79, 0x70, 0xE7, 0xB9, 0x61, 0x2C, 0x01, 0x06, 0x2E, 0xEB, 0x8B, + 0x00, 0x00, 0x78, 0x3D, 0xE8, 0x00, 0x06, 0x92, 0x06, 0x2E, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x61, + 0x2C, 0x01, 0x06, 0xB2, 0x43, 0x78, 0xB9, 0x61, 0x8C, 0x00, 0x18, 0x6A, 0x04, 0x00, 0xC6, 0x76, + 0x32, 0x45, 0x38, 0x51, 0x8C, 0x00, 0x28, 0x65, 0x58, 0x00, 0x63, 0x67, 0xD4, 0x61, 0x82, 0x3B, + 0x06, 0x67, 0x0C, 0xF0, 0x80, 0x08, 0xD7, 0x61, 0x26, 0x6F, 0x18, 0x56, 0xE5, 0x00, 0x0C, 0x40, + 0xE4, 0x00, 0x2F, 0x35, 0x05, 0x00, 0x26, 0x35, 0x57, 0x31, 0x26, 0x53, 0x18, 0x36, 0xE4, 0x00, + 0x26, 0x46, 0x26, 0x53, 0x38, 0x31, 0xAC, 0x00, 0x26, 0x55, 0x26, 0x53, 0x70, 0x55, 0x78, 0x36, + 0xE6, 0x00, 0xB9, 0x71, 0x34, 0x01, 0x26, 0xE5, 0x06, 0x25, 0xB9, 0x41, 0x30, 0x01, 0xB9, 0x51, + 0x28, 0x01, 0xB9, 0x61, 0x2C, 0x01, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x61, 0x2C, 0x01, 0x38, 0x51, + 0x28, 0x01, 0x78, 0x36, 0xE8, 0x00, 0x26, 0x92, 0x06, 0x25, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x41, + 0x30, 0x01, 0x26, 0xB2, 0x04, 0x30, 0x06, 0x24, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x38, 0x71, 0x34, 0x01, 0x24, 0x71, 0x43, 0x77, 0xF2, 0xB9, 0xC4, 0xE0, 0x92, 0x02, 0x04, 0xE1, + 0x06, 0x3E, 0x06, 0x29, 0xAB, 0x8F, 0x00, 0x00, 0xA9, 0x2D, 0xE6, 0x00, 0x06, 0x3E, 0x06, 0x2B, + 0x24, 0xC1, 0xAB, 0x8F, 0x00, 0x00, 0x23, 0xCC, 0xA9, 0x2D, 0xE8, 0x00, 0x43, 0xD8, 0xFA, 0x72, + 0xFF, 0xFF, 0x34, 0xE1, 0x43, 0xEE, 0x14, 0xD1, 0x06, 0xBA, 0xC6, 0xED, 0x82, 0x1C, 0x06, 0x7E, + 0xD7, 0x71, 0x26, 0x7A, 0xF8, 0x67, 0xE6, 0x00, 0x0C, 0x20, 0xE4, 0x00, 0x26, 0x27, 0x92, 0x10, + 0xF8, 0x77, 0xE8, 0x00, 0x92, 0x0D, 0xC4, 0xE9, 0x12, 0x0B, 0x04, 0x31, 0x26, 0x3E, 0xD7, 0x31, + 0x26, 0x3B, 0x2C, 0x30, 0xE4, 0x00, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x34, 0xE1, + 0x43, 0xEE, 0xF2, 0xE4, 0x18, 0x7A, 0x04, 0x00, 0xC6, 0x7C, 0xA2, 0x06, 0x99, 0xCA, 0x04, 0x00, + 0xF2, 0x03, 0x99, 0x0A, 0x6D, 0x02, 0x98, 0x7A, 0x86, 0x07, 0x92, 0x08, 0x28, 0x7A, 0x06, 0x00, + 0xD4, 0x72, 0x82, 0x13, 0xB8, 0x61, 0x90, 0x00, 0x32, 0x10, 0x38, 0x60, 0xE4, 0x10, 0x18, 0x7A, + 0x87, 0x07, 0x99, 0x0A, 0x04, 0x00, 0x18, 0x66, 0xB8, 0x00, 0xC6, 0x67, 0xD2, 0x03, 0x99, 0x0A, + 0x86, 0x07, 0x24, 0x71, 0x99, 0x7A, 0x87, 0x07, 0x18, 0x7A, 0x04, 0x00, 0x99, 0x7A, 0x05, 0x00, + 0x99, 0x7A, 0x1A, 0x00, 0x58, 0xC1, 0x48, 0x01, 0x58, 0x81, 0x38, 0x01, 0x2C, 0x10, 0x58, 0x01, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xE0, 0xC6, 0x09, 0x98, 0x70, + 0xFB, 0x10, 0x82, 0x04, 0x2C, 0xE0, 0xFA, 0x00, 0xF2, 0x06, 0x38, 0x70, 0xE4, 0x10, 0x28, 0x77, + 0x1E, 0x00, 0x26, 0xE7, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x04, 0x3D, 0x13, 0x22, + 0xEB, 0x97, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2C, 0x92, 0x03, 0x2C, 0xE0, 0x64, 0x00, + 0x2B, 0xB2, 0x00, 0x00, 0x06, 0xD2, 0xCB, 0x76, 0x03, 0x00, 0xC6, 0xDE, 0x04, 0x21, 0xB2, 0x02, + 0x04, 0x20, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x24, 0x00, + 0xD9, 0xC1, 0x14, 0x00, 0x38, 0xE0, 0xE4, 0x10, 0xD9, 0x81, 0x04, 0x00, 0x06, 0xC2, 0x04, 0x30, + 0x06, 0x2D, 0x0C, 0x20, 0x0A, 0x09, 0x0C, 0x40, 0x54, 0x00, 0x0C, 0x90, 0x80, 0x08, 0x0C, 0x80, + 0xA0, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xD0, 0x0A, 0x09, 0x26, 0x89, 0x06, 0xBC, + 0x30, 0x3B, 0x18, 0x2E, 0x0B, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xAB, 0x8F, + 0x00, 0x00, 0x06, 0xA2, 0x38, 0x3B, 0xA0, 0x00, 0x18, 0x2E, 0x0C, 0x00, 0xEB, 0x8B, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0xAB, 0x8F, 0x00, 0x00, 0x06, 0x62, 0x0C, 0x30, 0x11, 0x00, 0x06, 0x2A, + 0xB1, 0x61, 0xEB, 0x93, 0x00, 0x00, 0x28, 0x7E, 0x14, 0x00, 0x30, 0x61, 0xC6, 0x27, 0x06, 0xA2, + 0x02, 0x02, 0x06, 0xA7, 0x06, 0x26, 0x0C, 0x30, 0x11, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x28, 0x7E, + 0x16, 0x00, 0xC6, 0x27, 0x02, 0x02, 0x06, 0x27, 0x18, 0x3E, 0x0E, 0x00, 0x3F, 0x22, 0x0A, 0x00, + 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0xA1, 0x2D, 0x24, 0xD2, + 0xC6, 0xD8, 0x24, 0xB4, 0x92, 0xC6, 0x06, 0xB9, 0x0C, 0xD0, 0x32, 0x09, 0x2C, 0xB0, 0xD4, 0x00, + 0x38, 0x3C, 0x50, 0x00, 0x18, 0x2E, 0x09, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0xAB, 0x8F, 0x00, 0x00, 0x06, 0xA2, 0x38, 0x3C, 0xF0, 0x00, 0x18, 0x2E, 0x0A, 0x00, 0xEB, 0x8B, + 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xAB, 0x8F, 0x00, 0x00, 0x06, 0x92, 0x04, 0x3B, 0x06, 0x2A, + 0xEB, 0x93, 0x00, 0x00, 0x28, 0x7E, 0x10, 0x00, 0x06, 0xA2, 0xC6, 0x27, 0x02, 0x02, 0x06, 0xA7, + 0x06, 0x29, 0x04, 0x3B, 0xEB, 0x93, 0x00, 0x00, 0x28, 0x7E, 0x12, 0x00, 0xC6, 0x27, 0x02, 0x02, + 0x06, 0x27, 0x18, 0x3E, 0x0D, 0x00, 0x3F, 0x22, 0x0A, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0xA1, 0x2D, 0x24, 0xD2, 0xC6, 0xDB, 0x24, 0xC4, 0x92, 0xC9, + 0x58, 0xC1, 0x14, 0x00, 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0xBC, 0x01, 0xD9, 0xC1, 0xAC, 0x01, 0x38, 0xC0, 0xE4, 0x10, 0xD9, 0x81, 0x9C, 0x01, + 0x0C, 0xD0, 0x80, 0x08, 0x18, 0x7C, 0xAC, 0x00, 0x18, 0x6D, 0xDE, 0x00, 0xC6, 0x67, 0x28, 0x7D, + 0x06, 0x00, 0xA2, 0x09, 0x6C, 0x70, 0x00, 0x01, 0xA9, 0x7D, 0x06, 0x00, 0x04, 0x61, 0x99, 0x60, + 0x0B, 0x11, 0xF2, 0x06, 0x1C, 0x30, 0x01, 0x01, 0x56, 0x73, 0xA9, 0x7D, 0x06, 0x00, 0x98, 0x70, + 0xFB, 0x10, 0xA9, 0x0D, 0x66, 0x02, 0xA9, 0x0D, 0x68, 0x02, 0xA9, 0x0D, 0x6A, 0x02, 0x92, 0x0E, + 0x0C, 0x50, 0x30, 0x00, 0x0C, 0x60, 0x2E, 0x00, 0x26, 0x5C, 0x26, 0x6C, 0x70, 0x55, 0x20, 0x66, + 0xB9, 0x51, 0x74, 0x01, 0xB9, 0x61, 0x60, 0x01, 0xF2, 0x08, 0x0C, 0x70, 0x90, 0x01, 0x04, 0x90, + 0xB9, 0x71, 0x60, 0x01, 0xB9, 0x91, 0x74, 0x01, 0x06, 0x21, 0x0C, 0x30, 0x48, 0x01, 0x0C, 0xF0, + 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x76, 0x0C, 0x70, 0xE8, 0x10, 0x20, 0x67, 0xB9, 0x01, 0x54, 0x01, + 0x04, 0x52, 0x26, 0x57, 0x20, 0x55, 0xB9, 0x61, 0x8C, 0x01, 0x06, 0x96, 0x0C, 0x90, 0x08, 0x11, + 0x10, 0x69, 0xB9, 0x51, 0x90, 0x01, 0x0C, 0x50, 0x7C, 0x02, 0x26, 0x5D, 0x20, 0x55, 0xB9, 0x61, + 0x88, 0x01, 0x38, 0x61, 0x40, 0x01, 0x38, 0x91, 0x44, 0x01, 0xB9, 0x51, 0x6C, 0x01, 0xB9, 0x61, + 0x80, 0x01, 0x0C, 0x50, 0x50, 0x00, 0x04, 0x60, 0xB9, 0x01, 0x50, 0x01, 0xB9, 0x01, 0x4C, 0x01, + 0xB9, 0x01, 0x48, 0x01, 0x06, 0x20, 0xB9, 0x01, 0x68, 0x01, 0xB9, 0x01, 0x70, 0x01, 0xB9, 0x91, + 0x7C, 0x01, 0x26, 0x51, 0xB9, 0x61, 0x58, 0x01, 0xB9, 0x61, 0x84, 0x01, 0xB9, 0x61, 0x64, 0x01, + 0x06, 0xB6, 0x06, 0x86, 0x2F, 0x38, 0x08, 0x00, 0x0C, 0x70, 0x80, 0x04, 0x26, 0x73, 0x0C, 0x90, + 0x80, 0x02, 0x06, 0xE1, 0xB9, 0x71, 0x94, 0x01, 0xB9, 0x81, 0x5C, 0x01, 0x26, 0x39, 0x04, 0x40, + 0x0C, 0xA0, 0x80, 0x02, 0x20, 0x93, 0x0C, 0xF0, 0xFF, 0x0F, 0x56, 0xF9, 0x38, 0x91, 0x94, 0x01, + 0xB9, 0xF1, 0x98, 0x01, 0x2F, 0x74, 0x04, 0x00, 0x26, 0x79, 0x20, 0x77, 0x38, 0x91, 0x8C, 0x01, + 0x0C, 0xF0, 0xFF, 0x0F, 0x56, 0xF7, 0x38, 0x71, 0x98, 0x01, 0xB9, 0xF1, 0x78, 0x01, 0x36, 0x7F, + 0x38, 0xF1, 0x5C, 0x01, 0xC6, 0x9F, 0x82, 0x0C, 0x38, 0x91, 0x90, 0x01, 0xC6, 0x9F, 0x82, 0x08, + 0xC4, 0x4A, 0x1A, 0x26, 0x01, 0x00, 0xCC, 0x60, 0x11, 0x00, 0x8A, 0x22, 0x01, 0x00, 0xC4, 0x70, + 0xA1, 0x73, 0x22, 0x34, 0x30, 0xFE, 0xC6, 0x7B, 0x26, 0xF7, 0xB1, 0xFE, 0x30, 0xF5, 0x26, 0xF7, + 0xB1, 0xF5, 0x02, 0x06, 0xB9, 0x61, 0x84, 0x01, 0xB9, 0x41, 0x64, 0x01, 0x06, 0xB7, 0x28, 0xFC, + 0x64, 0x00, 0xC6, 0x7F, 0x02, 0x0F, 0x28, 0xFD, 0x66, 0x02, 0x24, 0xF1, 0xA9, 0xFD, 0x66, 0x02, + 0x28, 0xFC, 0x66, 0x00, 0xC6, 0x7F, 0x02, 0x06, 0x28, 0xFD, 0x6A, 0x02, 0x24, 0xF1, 0xA9, 0xFD, + 0x6A, 0x02, 0xB8, 0xF1, 0x88, 0x01, 0x82, 0x05, 0xA9, 0x0D, 0x66, 0x02, 0xA9, 0x0D, 0x6A, 0x02, + 0x28, 0xFC, 0xAA, 0x00, 0xC6, 0x7F, 0x02, 0x0A, 0x26, 0xFF, 0xC6, 0x7F, 0x24, 0x21, 0x02, 0x06, + 0x38, 0x71, 0x68, 0x01, 0x24, 0x71, 0xB9, 0x71, 0x68, 0x01, 0x38, 0x91, 0x78, 0x01, 0x38, 0xF1, + 0x98, 0x01, 0x36, 0x9F, 0xC4, 0x90, 0x02, 0x2E, 0x38, 0x7E, 0xA0, 0x00, 0x26, 0x79, 0xB9, 0x7E, + 0xA0, 0x00, 0x38, 0x75, 0xA0, 0x00, 0x26, 0x79, 0xB9, 0x75, 0xA0, 0x00, 0x28, 0x7C, 0x68, 0x00, + 0xC6, 0x97, 0x02, 0x06, 0x28, 0x7D, 0x68, 0x02, 0x24, 0x71, 0xA9, 0x7D, 0x68, 0x02, 0x28, 0x7C, + 0xAA, 0x00, 0xC6, 0x97, 0x02, 0x0E, 0x26, 0x77, 0x38, 0xF1, 0x58, 0x01, 0xC6, 0x97, 0x24, 0xF1, + 0x02, 0x06, 0x38, 0x71, 0x70, 0x01, 0x24, 0x71, 0xB9, 0x71, 0x70, 0x01, 0xB9, 0xF1, 0x58, 0x01, + 0xCC, 0x90, 0xC8, 0x00, 0x02, 0x07, 0x38, 0x71, 0x6C, 0x01, 0x24, 0x71, 0x23, 0x77, 0xB9, 0x71, + 0x6C, 0x01, 0x38, 0x91, 0x5C, 0x01, 0x24, 0x41, 0xC4, 0x4D, 0x24, 0x91, 0xB9, 0x91, 0x5C, 0x01, + 0x24, 0x32, 0x24, 0xE4, 0x9A, 0x68, 0xFF, 0xFF, 0x24, 0x8D, 0x30, 0x45, 0x38, 0x75, 0xA0, 0x00, + 0x38, 0xF1, 0x80, 0x01, 0x38, 0x31, 0x7C, 0x01, 0xCC, 0x80, 0xEA, 0x00, 0x26, 0x4F, 0x26, 0x73, + 0x24, 0x61, 0x24, 0x54, 0x82, 0x07, 0xB9, 0x41, 0x80, 0x01, 0xB9, 0x71, 0x7C, 0x01, 0xFA, 0x43, + 0xFF, 0xFF, 0x38, 0x31, 0x58, 0x01, 0x38, 0xF1, 0x68, 0x01, 0x38, 0x51, 0x70, 0x01, 0x38, 0x61, + 0x6C, 0x01, 0xB9, 0x31, 0x48, 0x01, 0xB9, 0x21, 0x50, 0x01, 0xB9, 0xF1, 0x54, 0x01, 0xB9, 0x51, + 0x4C, 0x01, 0xA9, 0x6D, 0x7C, 0x02, 0xB9, 0x41, 0x40, 0x01, 0xB9, 0x71, 0x44, 0x01, 0xCB, 0x76, + 0x03, 0x00, 0xE8, 0x3D, 0x89, 0x07, 0x22, 0x33, 0x28, 0x60, 0xE8, 0x10, 0x28, 0x2C, 0xBA, 0x00, + 0x26, 0x66, 0x2F, 0x76, 0x0A, 0x00, 0x70, 0x47, 0x04, 0x51, 0xC6, 0x42, 0x12, 0x02, 0x04, 0x50, + 0x04, 0x70, 0xC6, 0x47, 0x13, 0x55, 0x02, 0x02, 0x23, 0x74, 0x0C, 0x90, 0xE8, 0x10, 0x28, 0x49, + 0x02, 0x00, 0x26, 0x44, 0x26, 0x4A, 0x70, 0x44, 0xC6, 0x42, 0x02, 0x03, 0x24, 0x51, 0x13, 0x55, + 0xC6, 0x74, 0x32, 0x02, 0x23, 0x74, 0xC4, 0x50, 0x82, 0x12, 0xC4, 0x30, 0x26, 0x6A, 0x92, 0x03, + 0xA1, 0x76, 0xF2, 0x02, 0xA1, 0x06, 0x0C, 0xF0, 0xE8, 0x10, 0x28, 0x6F, 0x02, 0x00, 0xC4, 0x31, + 0x26, 0x66, 0x26, 0xA6, 0x92, 0x03, 0xA1, 0x7A, 0xF2, 0x02, 0xA1, 0x0A, 0x30, 0x7C, 0x28, 0xEC, + 0x2C, 0x00, 0xD4, 0x71, 0xA9, 0xED, 0x0E, 0x00, 0x82, 0x1C, 0x38, 0x31, 0x40, 0x01, 0x38, 0x21, + 0x60, 0x01, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x68, 0x5B, 0xAB, 0x8F, 0x00, 0x00, 0x06, 0xC2, + 0x38, 0x31, 0x60, 0x01, 0x38, 0x21, 0x74, 0x01, 0xEB, 0x8B, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0xEB, 0x93, 0x00, 0x00, 0x43, 0x22, 0x26, 0x2C, 0xC6, 0x2E, 0xB2, 0x03, 0xA9, 0x2D, 0x0E, 0x00, + 0x06, 0x21, 0x6B, 0x92, 0x02, 0x00, 0xC4, 0xB0, 0x82, 0x14, 0x38, 0x71, 0x64, 0x01, 0x26, 0x77, + 0x26, 0x7D, 0x78, 0x67, 0x8A, 0x00, 0x38, 0x71, 0x84, 0x01, 0x2C, 0x70, 0x14, 0x00, 0x26, 0x77, + 0x26, 0x7D, 0x78, 0x77, 0x8A, 0x00, 0x26, 0x76, 0x36, 0xB7, 0xC4, 0xB0, 0x32, 0x02, 0x04, 0xB0, + 0x0C, 0x30, 0x48, 0x01, 0x06, 0x21, 0x26, 0x31, 0xA9, 0xBD, 0xDA, 0x00, 0x4B, 0xC0, 0x02, 0x00, + 0x58, 0xC1, 0xAC, 0x01, 0x58, 0x81, 0x9C, 0x01, 0x2C, 0x10, 0xBC, 0x01, 0xE1, 0xF0, 0x04, 0xF0, + 0xC6, 0x7F, 0x02, 0x02, 0x43, 0xF7, 0xA1, 0xF3, 0xFA, 0x45, 0xFF, 0xFF, 0x3C, 0x10, 0x14, 0x00, + 0xD9, 0xC1, 0x04, 0x00, 0xB1, 0xB1, 0x0C, 0xF0, 0x54, 0x09, 0x0C, 0x30, 0x52, 0x04, 0x0C, 0x50, + 0x11, 0x00, 0x14, 0xD1, 0x06, 0x2E, 0x0C, 0x20, 0x22, 0x09, 0x06, 0x73, 0x04, 0x6C, 0xC4, 0x6A, + 0x12, 0x0B, 0xCC, 0x50, 0x11, 0x00, 0x82, 0x08, 0x70, 0xB2, 0x70, 0x4F, 0x70, 0xC7, 0x26, 0x4B, + 0x3F, 0x44, 0x0C, 0x00, 0xF2, 0x02, 0x70, 0x47, 0xC4, 0x40, 0x12, 0x03, 0xA1, 0x07, 0xF2, 0x02, + 0xA1, 0x47, 0x34, 0x61, 0xC6, 0x6D, 0x34, 0x72, 0x34, 0x22, 0x92, 0xEA, 0x34, 0x51, 0xC6, 0x56, + 0x34, 0xF2, 0x3C, 0x30, 0x1A, 0x00, 0x92, 0xDF, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, + 0x14, 0x00, 0xE1, 0xF0, 0xC4, 0x20, 0x0C, 0x70, 0x80, 0x08, 0x28, 0x37, 0x06, 0x00, 0x82, 0x15, + 0x64, 0x38, 0xA9, 0x37, 0x06, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x1C, 0x7B, 0xB9, 0x70, + 0xE4, 0x10, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xC4, 0x79, 0xB9, 0x70, 0xE0, 0x10, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x70, 0x2C, 0x79, 0xF2, 0x15, 0x14, 0x29, 0x56, 0x32, 0xA9, 0x37, 0x06, 0x00, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x5C, 0x7A, 0xB9, 0x70, 0xE4, 0x10, 0x08, 0x70, 0x00, 0x80, + 0x2C, 0x70, 0x10, 0x7A, 0xB9, 0x70, 0xE0, 0x10, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x78, 0x79, + 0xB9, 0x70, 0xDC, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x70, 0x80, 0x08, 0x99, 0x07, 0xE1, 0x00, + 0x99, 0x07, 0xE0, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xC2, + 0x38, 0x22, 0x44, 0x01, 0x06, 0xE3, 0x0C, 0x30, 0xBB, 0x00, 0x38, 0xD0, 0xE4, 0x10, 0xAB, 0x8F, + 0x00, 0x00, 0x0C, 0x70, 0x80, 0x08, 0xB9, 0x2C, 0x44, 0x01, 0x06, 0x32, 0x28, 0x27, 0x06, 0x00, + 0x30, 0x5E, 0x38, 0x4E, 0x08, 0x00, 0x38, 0xFE, 0x04, 0x00, 0x04, 0x68, 0x56, 0x62, 0xA3, 0xC6, + 0x5C, 0x20, 0x80, 0x00, 0x82, 0x18, 0x26, 0x44, 0xC6, 0x54, 0x04, 0x61, 0x12, 0x06, 0xCC, 0x30, + 0xFA, 0x00, 0xD2, 0x02, 0x04, 0x60, 0x13, 0x66, 0xCC, 0xF0, 0x23, 0x00, 0x02, 0x07, 0x38, 0x4E, + 0x0C, 0x00, 0xCC, 0x40, 0x22, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x1D, 0xCC, 0x50, + 0x14, 0x00, 0xF2, 0x18, 0xCC, 0x30, 0x96, 0x00, 0x04, 0x61, 0xD2, 0x02, 0x06, 0x6C, 0xC6, 0x54, + 0x13, 0x66, 0x02, 0x04, 0xC4, 0x58, 0x02, 0x02, 0x04, 0x61, 0xCC, 0xF0, 0x14, 0x00, 0x02, 0x07, + 0x38, 0x4E, 0x0C, 0x00, 0xCC, 0x40, 0x13, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x04, + 0xC4, 0x5A, 0x02, 0x02, 0x04, 0x61, 0x98, 0x57, 0xE0, 0x00, 0x92, 0x04, 0x98, 0x57, 0xE2, 0x00, + 0x82, 0x08, 0x18, 0x57, 0xE1, 0x00, 0xCC, 0x50, 0xFF, 0x00, 0x82, 0x09, 0x24, 0x51, 0xF2, 0x05, + 0x98, 0x57, 0xE1, 0x00, 0x82, 0x04, 0x34, 0x51, 0x99, 0x57, 0xE1, 0x00, 0x18, 0x57, 0xE1, 0x00, + 0x18, 0x4D, 0xB0, 0x00, 0xC6, 0x45, 0xA2, 0x02, 0x04, 0x60, 0x98, 0x40, 0x08, 0x11, 0x92, 0x12, + 0xC4, 0x60, 0x82, 0x10, 0x18, 0x67, 0xDE, 0x00, 0xCC, 0x60, 0xFF, 0x00, 0x82, 0x04, 0x24, 0x61, + 0x99, 0x67, 0xDE, 0x00, 0x98, 0x67, 0xDF, 0x00, 0x82, 0x17, 0x34, 0x61, 0x99, 0x67, 0xDF, 0x00, + 0xF2, 0x13, 0x18, 0x67, 0xDF, 0x00, 0x24, 0x61, 0x13, 0x66, 0x99, 0x67, 0xDF, 0x00, 0x18, 0x4D, + 0xAD, 0x00, 0xC6, 0x46, 0x92, 0x09, 0x98, 0x67, 0xDE, 0x00, 0x99, 0x07, 0xDF, 0x00, 0x82, 0x04, + 0x34, 0x61, 0x99, 0x67, 0xDE, 0x00, 0x18, 0x6D, 0xB1, 0x00, 0xC6, 0x65, 0xC2, 0x0A, 0x98, 0x67, + 0xDE, 0x00, 0x82, 0x05, 0x18, 0x6D, 0xB2, 0x00, 0x99, 0x67, 0xDE, 0x00, 0x99, 0x07, 0xDF, 0x00, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x18, 0x70, 0xFF, 0x10, 0xC4, 0x71, 0x82, 0x07, + 0x0C, 0x50, 0xDF, 0x01, 0x0C, 0x60, 0x1F, 0x03, 0x04, 0x70, 0xF2, 0x06, 0x0C, 0x50, 0xDD, 0x01, + 0x0C, 0x60, 0x1D, 0x03, 0x04, 0x72, 0x70, 0x42, 0xC6, 0x47, 0x32, 0x03, 0xA1, 0x72, 0xF2, 0x04, + 0xC6, 0x45, 0x02, 0x02, 0xA1, 0x52, 0x78, 0x52, 0x02, 0x00, 0xC6, 0x57, 0x32, 0x04, 0xA9, 0x72, + 0x02, 0x00, 0xF2, 0x05, 0xC6, 0x56, 0x02, 0x03, 0xA9, 0x62, 0x02, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x98, 0x70, 0xFB, 0x10, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x06, 0xE2, + 0x82, 0x06, 0x04, 0x70, 0x0C, 0xA0, 0x64, 0x00, 0x06, 0xB7, 0xF2, 0x05, 0x04, 0x71, 0x0C, 0xA0, + 0x66, 0x00, 0x04, 0xB3, 0x20, 0x6E, 0x23, 0x77, 0x26, 0x67, 0xA1, 0x6E, 0x28, 0x6E, 0x02, 0x00, + 0x06, 0x2E, 0x26, 0x76, 0xA9, 0x7E, 0x02, 0x00, 0x4B, 0xCA, 0x02, 0x00, 0x0C, 0x70, 0x80, 0x08, + 0x18, 0x67, 0x05, 0x04, 0xC4, 0x62, 0x92, 0x08, 0x20, 0x6E, 0xA9, 0x67, 0x1C, 0x00, 0x28, 0x6E, + 0x02, 0x00, 0xA9, 0x67, 0x1E, 0x00, 0x18, 0x67, 0x01, 0x04, 0xC4, 0x61, 0xD2, 0x11, 0x28, 0xC7, + 0x1C, 0x00, 0x1C, 0x60, 0x32, 0x00, 0x26, 0x6C, 0xCC, 0x60, 0x7C, 0x01, 0xD2, 0x09, 0x28, 0xD7, + 0x1E, 0x00, 0x1C, 0x70, 0x32, 0x00, 0x26, 0x7D, 0xCC, 0x70, 0xBC, 0x02, 0xC2, 0x05, 0x0C, 0xD0, + 0x90, 0x01, 0x0C, 0xC0, 0xF0, 0x00, 0xCC, 0xA0, 0x64, 0x00, 0x04, 0x90, 0x82, 0x04, 0x1C, 0x90, + 0x64, 0x00, 0x26, 0x9A, 0x70, 0xAE, 0xC6, 0xAC, 0x3F, 0x7C, 0x0A, 0x00, 0x32, 0x02, 0x24, 0x71, + 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0x82, 0x02, 0x00, 0x26, 0x82, 0x06, 0x68, 0xC4, 0x20, + 0xD7, 0x62, 0x26, 0x86, 0x26, 0x82, 0x82, 0x05, 0x06, 0x39, 0xEB, 0x8B, 0x00, 0x00, 0x26, 0x82, + 0x04, 0x71, 0xD6, 0x7B, 0x82, 0x0F, 0x06, 0x28, 0x0C, 0x30, 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, + 0xC6, 0xAC, 0x22, 0x04, 0x26, 0xC2, 0xA1, 0xCE, 0xF2, 0x05, 0x34, 0xC1, 0x3F, 0x22, 0x0C, 0x00, + 0xA1, 0x2E, 0x78, 0xCE, 0x02, 0x00, 0xC6, 0xCD, 0x3F, 0x7D, 0x0C, 0x00, 0x32, 0x02, 0x24, 0x71, + 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0xA2, 0x02, 0x00, 0x26, 0xA2, 0x06, 0x6A, 0xC4, 0x20, + 0xD7, 0x62, 0x26, 0xA6, 0x26, 0xA2, 0x82, 0x05, 0x06, 0x39, 0xEB, 0x8B, 0x00, 0x00, 0x26, 0xA2, + 0xD4, 0xB2, 0x82, 0x11, 0x06, 0x2A, 0x0C, 0x30, 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0xC6, 0xCD, + 0x22, 0x05, 0x26, 0xD2, 0xA9, 0xDE, 0x02, 0x00, 0xF2, 0x06, 0x34, 0xD1, 0x3F, 0x22, 0x0D, 0x00, + 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0x08, 0xC0, 0x00, 0xFF, 0x0C, 0xE0, 0x5C, 0x10, + 0x04, 0xD0, 0x2C, 0xC0, 0xFF, 0x0F, 0x28, 0x70, 0x88, 0x10, 0x63, 0x7D, 0xD4, 0x71, 0x82, 0x25, + 0x30, 0x6E, 0x06, 0x76, 0x77, 0x76, 0x5C, 0x70, 0xFF, 0x0F, 0xA1, 0x71, 0x18, 0x70, 0xFF, 0x10, + 0x5C, 0x60, 0xFF, 0x0F, 0xC4, 0x71, 0xA9, 0x61, 0x02, 0x00, 0x92, 0x04, 0x06, 0x21, 0x8B, 0xCC, + 0x02, 0x00, 0x06, 0x21, 0x4B, 0xCA, 0x02, 0x00, 0x20, 0x61, 0x30, 0x7E, 0x5C, 0x60, 0xFF, 0x0F, + 0x57, 0x66, 0x56, 0x7C, 0x66, 0x76, 0x28, 0x61, 0x02, 0x00, 0x1C, 0x50, 0x00, 0x10, 0x5C, 0x60, + 0xFF, 0x0F, 0x56, 0x75, 0x66, 0x76, 0xB1, 0x7E, 0x24, 0xD1, 0xC4, 0xDB, 0x24, 0xE4, 0x92, 0xD4, + 0x58, 0xC1, 0x04, 0x00, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0x0C, 0x20, + 0x4B, 0x10, 0x14, 0x31, 0x04, 0x4B, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, + 0x40, 0x10, 0x14, 0x31, 0x04, 0x4B, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xE0, 0x80, 0x08, + 0x38, 0x7E, 0x8C, 0x07, 0x18, 0x6E, 0x84, 0x07, 0x77, 0x76, 0x54, 0x7F, 0xA6, 0x76, 0x82, 0x0E, + 0x04, 0x71, 0x99, 0x7E, 0x0A, 0x08, 0xB9, 0x0E, 0xD8, 0x07, 0x0C, 0x20, 0x5C, 0x10, 0x04, 0x30, + 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x84, 0x07, 0xCB, 0xAD, + 0x01, 0x00, 0x4B, 0x30, 0x03, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x3C, 0x10, 0x14, 0x00, + 0xD9, 0xC1, 0x04, 0x00, 0xB1, 0xB1, 0x0C, 0xE0, 0x80, 0x08, 0x98, 0xDE, 0x01, 0x04, 0x82, 0x19, + 0x06, 0x2C, 0x0C, 0x20, 0xB0, 0x0B, 0x0C, 0x30, 0x00, 0x0B, 0x0C, 0x40, 0xB0, 0x00, 0x0C, 0xF0, + 0xEC, 0x00, 0xF1, 0xF0, 0x06, 0x2B, 0x0C, 0x20, 0x76, 0x0C, 0x0C, 0x30, 0x6B, 0x0C, 0x04, 0x4B, + 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0x01, 0x04, 0x99, 0x7E, 0x02, 0x04, 0xF2, 0x2A, + 0x06, 0x2B, 0x0C, 0x20, 0x76, 0x0C, 0x06, 0x3D, 0x04, 0x4B, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x06, 0x2C, 0x0C, 0x20, 0xB0, 0x0B, 0x06, 0x3D, 0x0C, 0x40, 0xB0, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x60, 0x0C, 0x06, 0x3D, 0x04, 0x4B, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x28, 0x7E, 0x06, 0x00, 0x99, 0x0E, 0x02, 0x04, 0x1C, 0x60, 0x14, 0x00, 0x56, 0x76, 0xA9, 0x7E, + 0x06, 0x00, 0x38, 0x70, 0xE4, 0x10, 0x99, 0x0E, 0x85, 0x07, 0x18, 0x77, 0xB9, 0x00, 0x99, 0x7E, + 0x88, 0x07, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, 0x80, 0x08, 0x18, 0x7E, 0x0A, 0x08, 0x06, 0xD2, + 0x26, 0x72, 0xC4, 0x70, 0x0C, 0x20, 0x0C, 0x10, 0x82, 0x0E, 0x0C, 0x30, 0x58, 0x10, 0x0C, 0x40, + 0x34, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0x0A, 0x08, 0x26, 0xD7, 0x99, 0xDE, + 0xBE, 0x07, 0xF2, 0x14, 0x98, 0x3E, 0xBE, 0x07, 0x82, 0x0C, 0x0C, 0x30, 0x58, 0x10, 0x0C, 0x40, + 0x34, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x04, 0x71, 0x99, 0x7E, 0x0A, 0x08, 0xF2, 0x06, + 0x0C, 0x40, 0x34, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0x06, 0xC2, 0x06, 0xE3, + 0x06, 0x23, 0x06, 0x3C, 0xB1, 0xB1, 0xEB, 0x67, 0x03, 0x00, 0x86, 0x22, 0x9A, 0x82, 0x00, 0x00, + 0xD4, 0xC3, 0x92, 0x05, 0x18, 0x7E, 0x0D, 0x00, 0xC4, 0x76, 0x92, 0x5B, 0x18, 0x6E, 0x0A, 0x00, + 0x14, 0x51, 0x26, 0x56, 0x04, 0x71, 0x53, 0x75, 0x0C, 0x50, 0x80, 0x08, 0x28, 0x45, 0x08, 0x08, + 0x43, 0x77, 0x66, 0x47, 0xA9, 0x45, 0x08, 0x08, 0x38, 0x45, 0xD8, 0x07, 0x1C, 0x30, 0x00, 0x04, + 0x66, 0x74, 0x5C, 0x70, 0xFF, 0x03, 0x56, 0x43, 0x66, 0x47, 0x06, 0x74, 0x77, 0x76, 0x24, 0x71, + 0x54, 0x7F, 0x1C, 0x30, 0x01, 0xF0, 0x57, 0x76, 0x56, 0x43, 0x66, 0x47, 0x57, 0x61, 0xB9, 0x45, + 0xD8, 0x07, 0x26, 0x65, 0x18, 0x7E, 0x0A, 0x00, 0x38, 0x56, 0xD8, 0x07, 0x08, 0x40, 0xFF, 0x0F, + 0x2C, 0x40, 0xFF, 0xFF, 0x57, 0x7E, 0x56, 0x54, 0x66, 0x57, 0xB9, 0x56, 0xD8, 0x07, 0x20, 0x4E, + 0x08, 0x70, 0x00, 0xFF, 0x5C, 0x40, 0xFF, 0x0F, 0x2C, 0x70, 0xFF, 0x0F, 0x57, 0x46, 0x56, 0x75, + 0x66, 0x74, 0xB9, 0x76, 0xD8, 0x07, 0x28, 0x5E, 0x02, 0x00, 0x1C, 0x40, 0x00, 0x10, 0x5C, 0x50, + 0xFF, 0x0F, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0xD8, 0x07, 0x18, 0x5E, 0x0B, 0x00, 0x13, 0x75, + 0xC4, 0x7F, 0xC2, 0x02, 0x04, 0x5F, 0x38, 0x76, 0xD8, 0x07, 0x08, 0x40, 0xFF, 0xF0, 0x54, 0x5F, + 0x2C, 0x40, 0xFF, 0xFF, 0x57, 0x5C, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0xD8, 0x07, 0xF2, 0x03, + 0xC4, 0x7A, 0x82, 0x03, 0x04, 0x20, 0xF2, 0x1D, 0x0C, 0xD0, 0xB0, 0x0B, 0x06, 0x7B, 0x0C, 0x70, + 0x80, 0x08, 0x18, 0x77, 0x02, 0x04, 0xC6, 0xC7, 0x32, 0xF6, 0x18, 0x6E, 0x0A, 0x00, 0x18, 0x7D, + 0x0A, 0x00, 0xC6, 0x67, 0x92, 0x0A, 0x06, 0x2E, 0x06, 0x3D, 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, + 0x18, 0x7D, 0x0B, 0x00, 0x99, 0x7E, 0x0B, 0x00, 0x24, 0xC1, 0x2C, 0xD0, 0x10, 0x00, 0xF2, 0xE7, + 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x18, 0x72, 0x06, 0x00, + 0xD4, 0x74, 0x82, 0x25, 0x0C, 0x40, 0x80, 0x08, 0x38, 0x54, 0xD8, 0x07, 0x08, 0x60, 0x1F, 0xFF, + 0x06, 0x75, 0xF7, 0x7A, 0x24, 0x71, 0x54, 0x77, 0x2C, 0x60, 0xFF, 0xFF, 0xD7, 0x7A, 0x56, 0x65, + 0x66, 0x67, 0xB9, 0x64, 0xD8, 0x07, 0x18, 0x52, 0x05, 0x00, 0x04, 0x71, 0x34, 0x51, 0x53, 0x75, + 0x06, 0x56, 0x77, 0x58, 0x66, 0x75, 0x08, 0x50, 0xE0, 0xFF, 0x5C, 0x70, 0x1F, 0x00, 0x2C, 0x50, + 0xFF, 0xFF, 0x57, 0x78, 0x56, 0x56, 0x66, 0x57, 0xB9, 0x54, 0xD8, 0x07, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x0C, 0x60, 0x80, 0x08, 0x38, 0x76, 0xD8, 0x07, 0x77, 0x76, 0x54, 0x7F, + 0xC4, 0x78, 0x02, 0x26, 0x28, 0x46, 0x08, 0x08, 0x04, 0x70, 0x0C, 0x30, 0x5C, 0x10, 0x06, 0x57, + 0x04, 0xF1, 0x06, 0x24, 0x63, 0x25, 0xD4, 0x21, 0x82, 0x0A, 0xC4, 0x77, 0xC2, 0x07, 0x06, 0x2F, + 0x53, 0x25, 0x15, 0x22, 0xB1, 0x03, 0x56, 0x42, 0xF2, 0x02, 0x24, 0x71, 0x24, 0x51, 0xC4, 0x5B, + 0x24, 0x34, 0x92, 0xF0, 0x04, 0x5F, 0x56, 0x57, 0x38, 0x76, 0xD8, 0x07, 0xA9, 0x46, 0x08, 0x08, + 0x1C, 0x40, 0x01, 0xF0, 0x57, 0x56, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0xD8, 0x07, 0x38, 0x76, + 0xD8, 0x07, 0x0C, 0x50, 0x00, 0xF0, 0xD6, 0x57, 0x82, 0x06, 0x77, 0x76, 0x54, 0x7F, 0x24, 0x71, + 0x99, 0x76, 0x0A, 0x08, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x20, 0x00, + 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x0C, 0xE0, 0x80, 0x08, 0xE8, 0xCE, 0xCB, 0x07, 0x92, 0x2A, + 0x98, 0x7E, 0x01, 0x04, 0x82, 0x27, 0x0C, 0x90, 0x30, 0x03, 0x0C, 0xD0, 0x00, 0x0B, 0x26, 0x9E, + 0x06, 0xBC, 0x04, 0x2C, 0x26, 0x2D, 0x8B, 0x13, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x13, 0xC4, 0xC7, + 0xDA, 0x98, 0x00, 0x00, 0x18, 0x7D, 0x0A, 0x00, 0x04, 0xA1, 0x26, 0xAB, 0x26, 0xBE, 0x99, 0x7B, + 0xCB, 0x07, 0x04, 0x21, 0x06, 0x3D, 0xAB, 0xE5, 0x02, 0x00, 0xC4, 0x20, 0x92, 0x04, 0x24, 0xC1, + 0xF2, 0x02, 0x06, 0xAB, 0x2C, 0xD0, 0x10, 0x00, 0xC6, 0xD9, 0x8A, 0x83, 0x00, 0x00, 0x06, 0xBA, + 0xF2, 0xE1, 0x98, 0x7E, 0x02, 0x04, 0x92, 0x04, 0x98, 0x7E, 0x01, 0x04, 0x82, 0x7A, 0x04, 0xD0, + 0x06, 0xCD, 0x06, 0xAE, 0x14, 0x91, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, 0xCB, 0x07, 0x34, 0x71, + 0xC4, 0x70, 0x32, 0x04, 0x04, 0xC0, 0x06, 0xAE, 0xF2, 0x47, 0x26, 0x7A, 0x68, 0xB7, 0xEB, 0x03, + 0x34, 0xB1, 0xC4, 0xB0, 0x32, 0x1D, 0x68, 0x37, 0xF6, 0x03, 0x04, 0x24, 0x24, 0x3A, 0x57, 0x32, + 0x26, 0x3A, 0x2C, 0x30, 0x80, 0x02, 0xAB, 0xE5, 0x02, 0x00, 0xC4, 0x20, 0x92, 0x02, 0x24, 0xD1, + 0x06, 0x7C, 0xC4, 0x79, 0x12, 0x09, 0x24, 0x71, 0x2F, 0x67, 0x0E, 0x00, 0x18, 0x56, 0xCB, 0x07, + 0x99, 0x56, 0xCA, 0x07, 0xF2, 0xF7, 0x99, 0x9E, 0xD5, 0x07, 0x34, 0xC1, 0xF2, 0x12, 0x57, 0xB2, + 0x26, 0xBA, 0x2C, 0xB0, 0x80, 0x02, 0x04, 0x2C, 0x26, 0x2B, 0x8B, 0x13, 0x01, 0x00, 0xC4, 0x20, + 0x82, 0x08, 0x04, 0x22, 0x06, 0x3B, 0xAB, 0xE5, 0x02, 0x00, 0xC4, 0x20, 0x92, 0x02, 0x24, 0xD1, + 0x24, 0xC1, 0xC4, 0xCA, 0x02, 0xC1, 0xF2, 0xC7, 0x57, 0x72, 0x2F, 0x9A, 0x07, 0x00, 0x0C, 0xB0, + 0x80, 0x02, 0x26, 0xB9, 0x04, 0x2C, 0x26, 0x2B, 0x8B, 0x13, 0x01, 0x00, 0xC4, 0x20, 0x92, 0x0C, + 0x24, 0xC1, 0xC4, 0xCB, 0x82, 0x26, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, 0xEB, 0x03, 0x34, 0x71, + 0xC4, 0x70, 0x32, 0xEB, 0xF2, 0xF6, 0xC4, 0xD7, 0xD2, 0x1C, 0x04, 0x70, 0x2F, 0x67, 0x0E, 0x00, + 0x68, 0x56, 0xCB, 0x07, 0x14, 0x41, 0x26, 0x45, 0xC6, 0x4C, 0x82, 0xEB, 0xC4, 0x50, 0x12, 0x0D, + 0x18, 0x79, 0x8A, 0x02, 0x04, 0x21, 0x99, 0x76, 0xCB, 0x07, 0x06, 0x3B, 0xAB, 0xE5, 0x02, 0x00, + 0xC4, 0x20, 0x92, 0xDF, 0x24, 0xD1, 0xF2, 0xDD, 0x24, 0x71, 0xC4, 0x7B, 0x92, 0xE8, 0xF2, 0xD9, + 0x04, 0x70, 0x06, 0x4E, 0x24, 0x71, 0x06, 0x67, 0x2F, 0x34, 0x07, 0x00, 0x2F, 0x56, 0x0E, 0x00, + 0xE8, 0x25, 0xCB, 0x07, 0x02, 0x07, 0x68, 0xF3, 0xCA, 0x07, 0xC6, 0xF2, 0x92, 0x03, 0x99, 0x05, + 0xCB, 0x07, 0x24, 0x61, 0xC4, 0x6A, 0x02, 0xF3, 0xC4, 0x7A, 0x92, 0xED, 0x8B, 0xF1, 0x02, 0x00, + 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x38, 0x70, 0xE4, 0x10, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x30, 0x77, 0x04, 0x20, 0x5C, 0x70, 0x00, 0x01, 0xC6, 0x72, + 0x82, 0x40, 0x98, 0x50, 0xFE, 0x10, 0x92, 0x3D, 0x0C, 0x60, 0x80, 0x08, 0x38, 0x46, 0xD8, 0x07, + 0x0C, 0x70, 0x00, 0xF0, 0xD6, 0x74, 0x06, 0x25, 0x82, 0x34, 0x38, 0x76, 0x8C, 0x07, 0x76, 0x74, + 0xDC, 0x70, 0xFF, 0xF3, 0x92, 0x2E, 0x28, 0xD6, 0x08, 0x08, 0x77, 0x46, 0x54, 0x4F, 0x06, 0x57, + 0x06, 0x3D, 0x63, 0x35, 0xD4, 0x31, 0x82, 0x1A, 0x04, 0x31, 0x26, 0x35, 0x57, 0x31, 0x26, 0x36, + 0x38, 0xE3, 0xD8, 0x07, 0x38, 0xF3, 0x8C, 0x07, 0x06, 0x2E, 0x06, 0x3F, 0x77, 0x26, 0x77, 0x36, + 0x5C, 0x20, 0xFF, 0x0F, 0x5C, 0x30, 0xFF, 0x0F, 0xC6, 0x23, 0x24, 0x71, 0x92, 0x11, 0x5C, 0xE0, + 0xFF, 0x0F, 0x5C, 0xF0, 0xFF, 0x0F, 0xC6, 0xEF, 0x92, 0x0B, 0xC6, 0x74, 0xB2, 0x04, 0x24, 0x51, + 0xC4, 0x5B, 0x92, 0xDF, 0x18, 0x26, 0x0A, 0x08, 0x99, 0x06, 0x0A, 0x08, 0xF2, 0x02, 0x04, 0x20, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x44, 0x00, 0x06, 0x21, 0x04, 0x30, + 0x0C, 0x40, 0x2C, 0x00, 0xD9, 0xC1, 0x34, 0x00, 0xC9, 0xA1, 0x2C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x80, 0x08, 0x98, 0x7E, 0x0A, 0x08, 0x92, 0x0A, 0x98, 0x3E, 0xBE, 0x07, + 0x92, 0x07, 0x0C, 0x20, 0x40, 0x10, 0x04, 0x4B, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x98, 0x7E, + 0x0A, 0x08, 0x82, 0x66, 0x98, 0x7E, 0xBE, 0x07, 0x82, 0x63, 0x28, 0xDE, 0x08, 0x08, 0x04, 0x71, + 0x08, 0xF0, 0xFF, 0x0F, 0x06, 0x32, 0x0C, 0x30, 0x5C, 0x10, 0x04, 0x40, 0x06, 0xB7, 0x2C, 0xF0, + 0xFF, 0xFF, 0x14, 0x61, 0x26, 0x67, 0x06, 0x5D, 0x63, 0x56, 0x06, 0x65, 0xD4, 0x61, 0x82, 0x26, + 0x13, 0x57, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, 0x68, 0xCC, 0xC0, 0x07, 0x24, 0x61, 0xC6, 0xC7, + 0x82, 0x0C, 0xC4, 0x6B, 0x92, 0xF8, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, 0xE8, 0xAC, 0xC0, 0x07, + 0x24, 0x61, 0x92, 0x05, 0x99, 0x7C, 0xC0, 0x07, 0x13, 0x56, 0xF2, 0x03, 0xC4, 0x6B, 0x92, 0xF5, + 0x14, 0xC1, 0x26, 0xC5, 0x06, 0x6B, 0x53, 0x6C, 0x66, 0x64, 0x23, 0x46, 0x30, 0x63, 0x57, 0xC1, + 0x57, 0x5E, 0x56, 0x6F, 0x26, 0xC1, 0x66, 0x65, 0xB1, 0x6C, 0x24, 0x71, 0xC4, 0x7C, 0x24, 0x34, + 0x92, 0xD1, 0x04, 0x70, 0x06, 0x6D, 0x63, 0x67, 0xD4, 0x61, 0x24, 0x71, 0x92, 0x0D, 0x2F, 0x56, + 0x0E, 0x00, 0x68, 0x35, 0xC0, 0x07, 0xC6, 0x37, 0x92, 0x04, 0x99, 0x05, 0xC0, 0x07, 0xF2, 0x04, + 0x24, 0x61, 0xC4, 0x6B, 0x92, 0xF5, 0xC4, 0x7B, 0x92, 0xEE, 0x38, 0x7E, 0xD8, 0x07, 0x1C, 0x60, + 0x00, 0x04, 0x5C, 0x40, 0xFF, 0x03, 0x56, 0x76, 0x66, 0x74, 0xB9, 0x7E, 0xD8, 0x07, 0x0C, 0x20, + 0x5C, 0x10, 0x06, 0x31, 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x58, 0xC1, + 0x34, 0x00, 0x48, 0xA1, 0x2C, 0x00, 0x2C, 0x10, 0x44, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x0C, 0xE0, 0x80, 0x08, 0x98, 0x7E, 0x83, 0x07, 0x82, 0x18, 0x0C, 0xC0, 0xDA, 0x0F, + 0x04, 0xD0, 0x18, 0x7E, 0x83, 0x07, 0xC6, 0xD7, 0x32, 0x07, 0x06, 0x2C, 0xEB, 0xEE, 0x02, 0x00, + 0x24, 0xD1, 0x24, 0xC8, 0xF2, 0xF7, 0x38, 0x7E, 0xD8, 0x07, 0x08, 0x60, 0xE0, 0x00, 0xD6, 0x76, + 0x82, 0x0E, 0x98, 0x7E, 0x0A, 0x08, 0x92, 0x0B, 0xF2, 0x07, 0x98, 0x7E, 0x0A, 0x08, 0x92, 0x07, + 0x98, 0x7E, 0x84, 0x07, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7E, 0x0A, 0x08, 0x18, 0x7E, 0x83, 0x07, + 0x99, 0x7E, 0x84, 0x07, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x88, 0x0C, 0x04, 0x30, 0x04, 0x4D, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, 0x80, 0x08, 0x14, 0x61, 0x99, 0x67, 0x09, 0x04, 0x99, 0x67, + 0x08, 0x04, 0x99, 0x67, 0x0B, 0x04, 0x99, 0x67, 0x0A, 0x04, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x41, 0x34, 0x14, 0xB1, 0xF1, 0x02, 0x09, 0xC4, 0x4E, 0x14, 0x72, 0x26, 0x74, 0x13, 0x77, + 0x0C, 0xF0, 0x10, 0x00, 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, 0x08, 0x60, + 0x00, 0x30, 0x2C, 0x60, 0x00, 0x60, 0xC6, 0x7F, 0xD2, 0x16, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x57, + 0x57, 0x51, 0x26, 0x57, 0x26, 0x53, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, 0x5C, 0x50, 0xFF, 0x7F, + 0xC6, 0x25, 0xB2, 0x06, 0x04, 0x61, 0x99, 0x60, 0x90, 0x0C, 0x04, 0x21, 0xF2, 0x05, 0x24, 0x71, + 0x23, 0x77, 0xF2, 0xEA, 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x41, 0x34, 0x14, + 0xB1, 0xF1, 0x02, 0x08, 0xC4, 0x4A, 0x14, 0x72, 0x26, 0x74, 0x13, 0x77, 0x04, 0xFC, 0x12, 0x05, + 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, 0x2F, 0x63, 0x03, 0x00, 0x26, 0x63, 0x57, 0x61, + 0x26, 0x36, 0x08, 0x60, 0x00, 0x30, 0x2C, 0x60, 0x00, 0x60, 0xC6, 0x7F, 0xD2, 0x12, 0x2F, 0x57, + 0x03, 0x00, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, 0x5C, 0x50, 0xFF, 0x7F, 0xC6, 0x25, 0xB2, 0x06, + 0x04, 0x61, 0x99, 0x60, 0x90, 0x0C, 0x04, 0x21, 0xF2, 0x05, 0x24, 0x71, 0x23, 0x77, 0xF2, 0xEE, + 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x3C, 0x10, 0x28, 0x00, 0xD9, 0xC1, 0x18, 0x00, + 0xD9, 0x81, 0x08, 0x00, 0x2B, 0xB2, 0x00, 0x00, 0x0C, 0xE0, 0x80, 0x08, 0x28, 0x7E, 0x22, 0x00, + 0xB1, 0x21, 0xC4, 0x7F, 0xC2, 0x12, 0x98, 0x70, 0x08, 0x11, 0x82, 0x0F, 0x38, 0x7E, 0xD8, 0x07, + 0x5C, 0x70, 0x00, 0xF0, 0xCC, 0x70, 0x00, 0x10, 0x92, 0x08, 0x04, 0x71, 0x99, 0x7E, 0x12, 0x04, + 0x99, 0x0E, 0x0F, 0x04, 0x99, 0x7E, 0x10, 0x04, 0x18, 0x7E, 0x0D, 0x04, 0xC4, 0x72, 0xC2, 0x08, + 0x04, 0x71, 0x99, 0x0E, 0x0F, 0x04, 0x99, 0x7E, 0x10, 0x04, 0x99, 0x0E, 0x12, 0x04, 0x98, 0x7E, + 0x12, 0x04, 0x82, 0x12, 0x98, 0x7E, 0x11, 0x04, 0x82, 0x0F, 0x98, 0x7E, 0x10, 0x04, 0x82, 0x0C, + 0x04, 0x71, 0x99, 0x0E, 0x12, 0x04, 0x99, 0x7E, 0x0F, 0x04, 0x99, 0x0E, 0x10, 0x04, 0x0B, 0x2C, + 0x01, 0x00, 0x6B, 0xDA, 0x02, 0x00, 0x98, 0x7E, 0x10, 0x04, 0x9A, 0xC8, 0x00, 0x00, 0x98, 0x7E, + 0x0F, 0x04, 0x9A, 0xC4, 0x00, 0x00, 0x18, 0x7E, 0x0C, 0x04, 0xC4, 0x71, 0x9A, 0xBF, 0x00, 0x00, + 0x18, 0x7E, 0x05, 0x00, 0xC4, 0x71, 0x9A, 0xBA, 0x00, 0x00, 0x18, 0x6E, 0x89, 0x02, 0x18, 0x5E, + 0x88, 0x02, 0xC4, 0x60, 0x82, 0x08, 0xCC, 0x60, 0x10, 0x00, 0x14, 0x71, 0x26, 0x76, 0x13, 0xB7, + 0x82, 0x07, 0xF2, 0x02, 0x06, 0xB6, 0x04, 0xA1, 0x26, 0xA6, 0x13, 0xAA, 0xF2, 0x03, 0x04, 0xBF, + 0x06, 0xA6, 0xC4, 0x50, 0x82, 0x07, 0xC4, 0x5A, 0x14, 0xC1, 0x26, 0xC5, 0x13, 0xCC, 0x82, 0x07, + 0xF2, 0x02, 0x06, 0xC5, 0x04, 0x91, 0x26, 0x95, 0x13, 0x99, 0xF2, 0x03, 0x04, 0xC9, 0x06, 0x95, + 0x2F, 0x46, 0x06, 0x00, 0x26, 0x46, 0x57, 0x41, 0x26, 0x64, 0x26, 0x56, 0x08, 0x80, 0x00, 0x30, + 0x57, 0x51, 0x2C, 0x80, 0x00, 0x60, 0x26, 0x58, 0x30, 0xD5, 0x04, 0x50, 0x5C, 0xD0, 0xFF, 0x7F, + 0xC6, 0xBA, 0xD2, 0x67, 0x2F, 0x6B, 0x0B, 0x00, 0x30, 0x31, 0x28, 0x2E, 0x3C, 0x01, 0x26, 0x6B, + 0x57, 0x61, 0x2F, 0xFB, 0x06, 0x00, 0x23, 0x33, 0x06, 0x6C, 0xC6, 0x69, 0xD2, 0x56, 0x2F, 0x46, + 0x0F, 0x00, 0x57, 0x41, 0x26, 0x48, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x7F, 0xC6, 0x42, 0xA2, 0x4A, + 0xC6, 0x43, 0x92, 0x48, 0x18, 0x4E, 0x89, 0x02, 0xC6, 0x4B, 0x92, 0x05, 0x18, 0x5E, 0x88, 0x02, + 0xC6, 0x56, 0x82, 0x3B, 0x18, 0x6E, 0x0E, 0x04, 0x04, 0x51, 0xD6, 0x56, 0x82, 0x13, 0x18, 0x3E, + 0x88, 0x02, 0x24, 0x32, 0x13, 0x33, 0xC4, 0x3A, 0xC2, 0x07, 0x18, 0x6E, 0x0E, 0x04, 0x04, 0x54, + 0xD6, 0x56, 0x92, 0x10, 0xF2, 0x1C, 0x06, 0x2D, 0x8B, 0x14, 0x03, 0x00, 0xC4, 0x20, 0x82, 0xF6, + 0xF2, 0x27, 0xD4, 0x62, 0x82, 0xF3, 0x18, 0x3E, 0x88, 0x02, 0x06, 0x2D, 0x34, 0x32, 0x13, 0x33, + 0xF2, 0xF4, 0x18, 0x3E, 0x89, 0x02, 0x24, 0x32, 0x13, 0x33, 0xCC, 0x30, 0x10, 0x00, 0xC2, 0x05, + 0x98, 0x6E, 0x10, 0x04, 0x82, 0x12, 0xF2, 0x14, 0x06, 0x2D, 0xF2, 0x08, 0xD4, 0x68, 0x82, 0xF9, + 0x18, 0x3E, 0x89, 0x02, 0x06, 0x2D, 0x34, 0x32, 0x13, 0x33, 0x18, 0x4E, 0x88, 0x02, 0x6B, 0x17, + 0x03, 0x00, 0xC4, 0x20, 0x92, 0x05, 0xF2, 0xED, 0x04, 0x61, 0x99, 0x6E, 0x0F, 0x04, 0x04, 0x51, + 0xF2, 0x04, 0x24, 0x61, 0x13, 0x66, 0xF2, 0xAA, 0x04, 0x71, 0x26, 0x7B, 0x13, 0xB7, 0xF2, 0x99, + 0x98, 0x7E, 0x0F, 0x04, 0x82, 0x0D, 0x18, 0x7E, 0x14, 0x04, 0xC4, 0x71, 0x92, 0x09, 0xB9, 0x51, + 0x04, 0x00, 0x0B, 0x2C, 0x01, 0x00, 0x6B, 0xDA, 0x02, 0x00, 0x38, 0x51, 0x04, 0x00, 0x98, 0x7E, + 0x0F, 0x04, 0x92, 0x0C, 0xC4, 0x50, 0x92, 0x0A, 0x30, 0x61, 0x28, 0x7E, 0x3C, 0x01, 0x23, 0xB6, + 0xC6, 0x7B, 0xD2, 0x04, 0x04, 0x71, 0x99, 0x7E, 0x10, 0x04, 0x38, 0x6E, 0xD8, 0x07, 0x06, 0x76, + 0x5C, 0x60, 0x00, 0xF0, 0x77, 0x76, 0xCC, 0x60, 0x00, 0x10, 0x54, 0x7F, 0x99, 0x7E, 0x14, 0x04, + 0x92, 0x11, 0x18, 0x6E, 0x0B, 0x04, 0x28, 0x7E, 0x88, 0x02, 0xCC, 0x60, 0xFF, 0x00, 0xA9, 0x7E, + 0x08, 0x04, 0x92, 0x08, 0x18, 0x6E, 0x0A, 0x04, 0xCC, 0x60, 0xFF, 0x00, 0x92, 0x03, 0xA9, 0x7E, + 0x0A, 0x04, 0x58, 0xC1, 0x18, 0x00, 0x58, 0x81, 0x08, 0x00, 0x2C, 0x10, 0x28, 0x00, 0xE1, 0xF0, + 0x2C, 0x20, 0x65, 0x00, 0x0C, 0x60, 0x80, 0x08, 0x3C, 0x10, 0x10, 0x00, 0x57, 0x22, 0xD1, 0xC1, + 0x2F, 0xD6, 0x02, 0x00, 0x04, 0xE2, 0x26, 0xED, 0x14, 0x71, 0xA8, 0xC6, 0x08, 0x08, 0xA9, 0x7E, + 0x04, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0xA9, 0x7E, 0x08, 0x00, 0xA9, 0x7E, 0x0A, 0x00, 0xA9, 0x0D, + 0x02, 0x00, 0xA9, 0x0E, 0x02, 0x00, 0x92, 0x10, 0x0C, 0x20, 0x88, 0x0F, 0x06, 0x3C, 0x04, 0x48, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x90, 0x0F, 0x06, 0x3C, 0x0C, 0x40, 0x16, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0xA9, 0x0E, 0x0C, 0x00, 0xA9, 0x0D, 0x10, 0x00, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, + 0x0B, 0x2D, 0x03, 0x00, 0x24, 0xE1, 0xC4, 0xEB, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x3C, 0x10, 0x18, 0x00, 0xB9, 0x31, 0x04, 0x00, 0xD9, 0xC1, 0x08, 0x00, 0x18, 0xD1, 0x04, 0x00, + 0xB1, 0x21, 0x23, 0xC2, 0xC6, 0x4D, 0x28, 0x31, 0x02, 0x00, 0x18, 0xE1, 0x05, 0x00, 0x32, 0x03, + 0x43, 0x2E, 0xF2, 0x11, 0xC6, 0x4C, 0x22, 0x03, 0x43, 0x23, 0xF2, 0x0D, 0x3F, 0x2D, 0x04, 0x00, + 0x36, 0x3E, 0xEB, 0x8B, 0x00, 0x00, 0x43, 0x22, 0x3F, 0x3D, 0x0C, 0x00, 0xEB, 0x93, 0x00, 0x00, + 0x26, 0x2E, 0x43, 0x22, 0x58, 0xC1, 0x08, 0x00, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x38, 0x70, 0xE4, 0x10, 0x3C, 0x10, 0x70, 0x00, 0xD9, 0xC1, 0x60, 0x00, 0xD9, 0x81, 0x50, 0x00, + 0x30, 0x77, 0xDC, 0x70, 0x00, 0x08, 0x8A, 0xC4, 0x02, 0x00, 0xC4, 0x30, 0x92, 0x0C, 0xC4, 0x20, + 0x9A, 0xBF, 0x02, 0x00, 0xA8, 0x70, 0x88, 0x10, 0x9A, 0xBB, 0x02, 0x00, 0x4B, 0x30, 0x03, 0x00, + 0xFA, 0xB7, 0x02, 0x00, 0x98, 0x70, 0x08, 0x11, 0x0C, 0xE0, 0x80, 0x08, 0x82, 0x29, 0x28, 0x7E, + 0x22, 0x00, 0xC4, 0x79, 0xC2, 0x0E, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x06, 0x07, 0x0C, 0x70, + 0x64, 0x00, 0xA9, 0x7E, 0x02, 0x07, 0x99, 0x0E, 0x07, 0x07, 0x0C, 0x70, 0x50, 0x00, 0xF2, 0x31, + 0xC4, 0x75, 0xC2, 0x0C, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x06, 0x07, 0x0C, 0x70, 0x64, 0x00, + 0xA9, 0x7E, 0x02, 0x07, 0x99, 0x0E, 0x07, 0x07, 0xF2, 0x24, 0x04, 0x7A, 0x99, 0x7E, 0x06, 0x07, + 0x0C, 0x70, 0x64, 0x00, 0xA9, 0x7E, 0x02, 0x07, 0x99, 0x0E, 0x07, 0x07, 0xF2, 0x18, 0x98, 0x7E, + 0x6D, 0x02, 0x92, 0xDA, 0x28, 0x7E, 0x06, 0x00, 0x0C, 0x60, 0x10, 0x00, 0xD6, 0x67, 0x92, 0xD4, + 0xD4, 0x78, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x06, 0x07, 0x0C, 0x70, 0x64, 0x00, 0xA9, 0x7E, + 0x02, 0x07, 0x0C, 0x70, 0x1E, 0x00, 0x99, 0x7E, 0x07, 0x07, 0x82, 0x25, 0x0C, 0x70, 0x96, 0x00, + 0xA9, 0x7E, 0x04, 0x07, 0x0C, 0x70, 0xD6, 0x0E, 0xB9, 0x71, 0x18, 0x00, 0x0C, 0x70, 0xD8, 0x0E, + 0xB9, 0x71, 0x14, 0x00, 0x0C, 0x70, 0x90, 0x0F, 0xB9, 0x71, 0x2C, 0x00, 0x08, 0x50, 0x00, 0xFF, + 0x04, 0xA0, 0x0C, 0x70, 0x82, 0x0F, 0x2C, 0x50, 0xFF, 0x0F, 0x06, 0xDE, 0xB9, 0x71, 0x08, 0x00, + 0xB9, 0xA1, 0x10, 0x00, 0xB9, 0xA1, 0x38, 0x00, 0xB9, 0xA1, 0x34, 0x00, 0x06, 0xCA, 0xB9, 0x51, + 0x30, 0x00, 0xF2, 0x04, 0x0C, 0x70, 0xC8, 0x00, 0xF2, 0xDC, 0x28, 0x7E, 0x08, 0x08, 0x63, 0x7C, + 0xD4, 0x71, 0x92, 0x06, 0x06, 0x2C, 0x0B, 0x2D, 0x03, 0x00, 0xFA, 0x1C, 0x02, 0x00, 0x04, 0x71, + 0x26, 0x7C, 0x57, 0x71, 0x26, 0x7E, 0x38, 0x67, 0xD8, 0x07, 0x06, 0x76, 0x77, 0x76, 0x5C, 0x70, + 0xFF, 0x0F, 0x43, 0x57, 0x5C, 0x60, 0xFF, 0x0F, 0xB9, 0x51, 0x24, 0x00, 0x43, 0x56, 0xB9, 0x51, + 0x28, 0x00, 0xF8, 0x5D, 0x56, 0x06, 0x32, 0x21, 0x38, 0x51, 0x24, 0x00, 0x38, 0x31, 0x18, 0x00, + 0x38, 0x41, 0x24, 0x00, 0xA1, 0x53, 0x38, 0x51, 0x28, 0x00, 0x38, 0x31, 0x14, 0x00, 0xA1, 0x53, + 0x06, 0x5C, 0x57, 0x52, 0x38, 0x31, 0x28, 0x00, 0x26, 0x5E, 0xA9, 0x45, 0x5A, 0x06, 0x38, 0x41, + 0x08, 0x00, 0xA9, 0x35, 0x5C, 0x06, 0xA9, 0x0D, 0x52, 0x06, 0xA9, 0x0D, 0x54, 0x06, 0x04, 0x51, + 0x99, 0x54, 0x0E, 0x00, 0x99, 0x54, 0x0F, 0x00, 0x78, 0x5D, 0x5A, 0x06, 0x36, 0x75, 0xB9, 0x71, + 0x04, 0x00, 0x78, 0x7D, 0x5C, 0x06, 0x38, 0x51, 0x04, 0x00, 0x36, 0x67, 0xB9, 0x61, 0x0C, 0x00, + 0x86, 0x65, 0xB9, 0x51, 0x1C, 0x00, 0x32, 0x04, 0x16, 0x76, 0xB9, 0x71, 0x1C, 0x00, 0x38, 0x51, + 0x0C, 0x00, 0x86, 0x65, 0xB9, 0x51, 0x20, 0x00, 0x32, 0x04, 0x16, 0x76, 0xB9, 0x71, 0x20, 0x00, + 0x38, 0x51, 0x1C, 0x00, 0x38, 0x61, 0x20, 0x00, 0x43, 0x25, 0x43, 0x36, 0x0C, 0xF0, 0x80, 0x00, + 0xF1, 0xF0, 0x98, 0x70, 0x08, 0x11, 0x06, 0x82, 0xB9, 0x71, 0x3C, 0x00, 0x82, 0x30, 0x28, 0xBE, + 0x04, 0x07, 0x28, 0x7E, 0x02, 0x07, 0x57, 0xB8, 0x66, 0xB7, 0x28, 0x7E, 0x06, 0x07, 0x06, 0x2B, + 0x06, 0x37, 0x06, 0x48, 0xB9, 0x71, 0x4C, 0x00, 0x0B, 0x31, 0x03, 0x00, 0x28, 0x6E, 0x22, 0x00, + 0x38, 0x71, 0x4C, 0x00, 0xC4, 0x67, 0x06, 0x92, 0xC2, 0x0A, 0x06, 0x68, 0xF7, 0x6F, 0x2F, 0x48, + 0x06, 0x00, 0xE7, 0x40, 0x06, 0x2B, 0x06, 0x37, 0x43, 0x44, 0xF2, 0x0D, 0x04, 0x33, 0x2F, 0x28, + 0x08, 0x00, 0xB9, 0x71, 0x4C, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, 0x4C, 0x00, 0x43, 0x42, + 0x06, 0x37, 0x06, 0x2B, 0x0B, 0x31, 0x03, 0x00, 0x06, 0xB2, 0xF2, 0x48, 0x98, 0x7E, 0x6D, 0x02, + 0x92, 0x06, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x10, 0x86, 0x88, 0x32, 0x02, + 0x24, 0x83, 0x28, 0x7E, 0x04, 0x07, 0x28, 0x2E, 0x02, 0x07, 0x28, 0x3E, 0x06, 0x07, 0x06, 0x48, + 0x67, 0x41, 0x57, 0x78, 0x66, 0x27, 0x43, 0x44, 0xF2, 0x2D, 0x28, 0x7E, 0x22, 0x00, 0x28, 0x9E, + 0x04, 0x07, 0x28, 0xBE, 0x06, 0x07, 0xC4, 0x77, 0x28, 0x7E, 0x02, 0x07, 0xC2, 0x1E, 0x04, 0x33, + 0x26, 0x22, 0xB9, 0x71, 0x4C, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, 0x4C, 0x00, 0x57, 0x98, + 0x66, 0x97, 0x06, 0x7B, 0x23, 0x77, 0x43, 0x42, 0x06, 0x37, 0x06, 0x29, 0xB9, 0x71, 0x4C, 0x00, + 0x0B, 0x31, 0x03, 0x00, 0x38, 0x71, 0x4C, 0x00, 0x06, 0xB2, 0x06, 0x37, 0x06, 0x29, 0x06, 0x48, + 0x0B, 0x31, 0x03, 0x00, 0x06, 0x92, 0xF2, 0x0A, 0x06, 0x29, 0x57, 0x28, 0x66, 0x27, 0x06, 0x3B, + 0x06, 0x48, 0x0B, 0x31, 0x03, 0x00, 0x06, 0xB2, 0x06, 0x92, 0x18, 0x7E, 0x05, 0x04, 0xC4, 0x72, + 0xD2, 0x0B, 0x0C, 0x70, 0x32, 0x00, 0xA9, 0x0E, 0x0A, 0x07, 0xA9, 0x0E, 0x08, 0x07, 0xA9, 0x7E, + 0x0E, 0x07, 0xA9, 0x7E, 0x0C, 0x07, 0x38, 0x60, 0xE4, 0x10, 0x78, 0x2E, 0x08, 0x07, 0x18, 0x56, + 0xA7, 0x00, 0x18, 0x76, 0xA9, 0x00, 0x18, 0x66, 0xA8, 0x00, 0xB9, 0x51, 0x44, 0x00, 0x06, 0x35, + 0x2F, 0x86, 0x05, 0x00, 0x26, 0x87, 0xB9, 0x71, 0x4C, 0x00, 0xB9, 0x61, 0x48, 0x00, 0xEB, 0x8B, + 0x00, 0x00, 0x38, 0x61, 0x48, 0x00, 0x06, 0x42, 0x78, 0x2E, 0x0C, 0x07, 0xB9, 0x41, 0x40, 0x00, + 0x06, 0x36, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x71, 0x4C, 0x00, 0x38, 0x41, 0x40, 0x00, 0x06, 0x39, + 0x26, 0x42, 0x06, 0x27, 0xB9, 0x41, 0x40, 0x00, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x41, 0x40, 0x00, + 0x43, 0x22, 0x26, 0x24, 0x06, 0x38, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x51, 0x44, 0x00, 0x43, 0x92, + 0x78, 0x2E, 0x0A, 0x07, 0x06, 0x35, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x61, 0x48, 0x00, 0x06, 0x52, + 0x78, 0x2E, 0x0E, 0x07, 0xB9, 0x51, 0x44, 0x00, 0x06, 0x36, 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x71, + 0x4C, 0x00, 0x38, 0x51, 0x44, 0x00, 0x06, 0x3B, 0x26, 0x52, 0x06, 0x27, 0xB9, 0x51, 0x44, 0x00, + 0xEB, 0x8B, 0x00, 0x00, 0x38, 0x51, 0x44, 0x00, 0x43, 0x22, 0x26, 0x25, 0x06, 0x38, 0xEB, 0x93, + 0x00, 0x00, 0x43, 0x72, 0x38, 0x21, 0x1C, 0x00, 0xB9, 0x71, 0x4C, 0x00, 0x06, 0x39, 0xEB, 0x8B, + 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x38, 0x71, 0x4C, 0x00, 0x06, 0x62, + 0x06, 0x82, 0x38, 0x21, 0x20, 0x00, 0xB9, 0x61, 0x48, 0x00, 0x06, 0x37, 0xEB, 0x8B, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0xEB, 0x93, 0x00, 0x00, 0xB8, 0x51, 0x3C, 0x00, 0x38, 0x61, 0x48, 0x00, + 0x38, 0x71, 0x4C, 0x00, 0x06, 0xB2, 0x92, 0x12, 0xC4, 0x60, 0x92, 0x07, 0x38, 0x61, 0x1C, 0x00, + 0x04, 0x81, 0xC4, 0x64, 0x12, 0x02, 0x06, 0x85, 0xC4, 0xB0, 0x92, 0x08, 0x38, 0x51, 0x20, 0x00, + 0x04, 0x61, 0xC4, 0x54, 0x12, 0x02, 0x06, 0x6B, 0x06, 0xB6, 0xC6, 0x9A, 0x06, 0x69, 0x32, 0x02, + 0x06, 0x6A, 0x38, 0x51, 0x10, 0x00, 0x43, 0xA6, 0xC6, 0x75, 0x06, 0x67, 0x32, 0x02, 0x06, 0x65, + 0x43, 0x66, 0xB9, 0x61, 0x10, 0x00, 0x38, 0x31, 0x08, 0x00, 0x38, 0x61, 0x04, 0x00, 0x68, 0x43, + 0x0E, 0x00, 0x15, 0x96, 0xF7, 0x9F, 0x38, 0x61, 0x0C, 0x00, 0x33, 0x59, 0xC6, 0x45, 0x15, 0x76, + 0xF7, 0x7F, 0x33, 0x67, 0x92, 0x04, 0x04, 0x41, 0xB9, 0x41, 0x34, 0x00, 0x38, 0x31, 0x08, 0x00, + 0x68, 0x43, 0x0F, 0x00, 0xC6, 0x46, 0x92, 0x04, 0x04, 0x41, 0xB9, 0x41, 0x38, 0x00, 0x38, 0x31, + 0x2C, 0x00, 0x04, 0x44, 0x91, 0x53, 0x2F, 0x5C, 0x0C, 0x00, 0x26, 0x5E, 0x99, 0x65, 0x11, 0x07, + 0x0C, 0x50, 0x5A, 0x06, 0x26, 0x5D, 0x06, 0x35, 0x06, 0x21, 0xB9, 0x51, 0x04, 0x00, 0xB9, 0x71, + 0x4C, 0x00, 0x0B, 0x7A, 0x03, 0x00, 0x2B, 0xB2, 0x00, 0x00, 0x18, 0x6E, 0x06, 0x04, 0x20, 0x51, + 0x38, 0x71, 0x4C, 0x00, 0xC4, 0x61, 0x28, 0x61, 0x02, 0x00, 0xD2, 0x19, 0x28, 0x4E, 0x3C, 0x01, + 0x23, 0x22, 0xC6, 0x42, 0xC2, 0x14, 0x98, 0x4E, 0x0F, 0x04, 0x92, 0x11, 0x78, 0x4D, 0x52, 0x06, + 0xC6, 0x48, 0x02, 0x05, 0xB8, 0x31, 0x34, 0x00, 0x82, 0x02, 0x06, 0x84, 0x78, 0x4D, 0x54, 0x06, + 0xC6, 0x4B, 0x02, 0x05, 0xB8, 0x31, 0x38, 0x00, 0x82, 0x02, 0x06, 0xB4, 0xC4, 0x90, 0x92, 0x02, + 0x16, 0x88, 0x23, 0x88, 0xC4, 0x70, 0x26, 0x85, 0xA1, 0x81, 0x92, 0x02, 0x16, 0xBB, 0x23, 0xBB, + 0x26, 0xB6, 0x06, 0x21, 0xA9, 0xB1, 0x02, 0x00, 0x4B, 0xCA, 0x02, 0x00, 0x78, 0x7D, 0x5A, 0x06, + 0x70, 0x91, 0x3F, 0x77, 0x09, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0xA9, 0x7D, 0x52, 0x06, + 0x78, 0xB1, 0x02, 0x00, 0x78, 0x7D, 0x5C, 0x06, 0x3F, 0x77, 0x0B, 0x00, 0xC4, 0x70, 0x32, 0x02, + 0x16, 0x77, 0x38, 0x51, 0x24, 0x00, 0x38, 0x61, 0x18, 0x00, 0xA9, 0x7D, 0x54, 0x06, 0x38, 0x71, + 0x28, 0x00, 0xA1, 0x56, 0x38, 0x51, 0x14, 0x00, 0x38, 0x21, 0x04, 0x00, 0xA1, 0x75, 0x06, 0x31, + 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, 0x04, 0x71, 0x26, 0x7C, 0x57, 0x71, 0x2F, 0x67, 0x0E, 0x00, + 0x38, 0x76, 0xD8, 0x07, 0x38, 0x51, 0x30, 0x00, 0x5C, 0x90, 0xFF, 0x0F, 0x57, 0x96, 0x56, 0x75, + 0x66, 0x79, 0x1C, 0x30, 0x00, 0x10, 0x5C, 0xB0, 0xFF, 0x0F, 0x56, 0x73, 0x66, 0x7B, 0xB9, 0x76, + 0xD8, 0x07, 0x38, 0x51, 0x18, 0x00, 0x38, 0x61, 0x14, 0x00, 0x38, 0x71, 0x2C, 0x00, 0x2C, 0x50, + 0x10, 0x00, 0xB9, 0x51, 0x18, 0x00, 0x38, 0x51, 0x08, 0x00, 0x24, 0xC1, 0xC4, 0xCB, 0x2C, 0x60, + 0x10, 0x00, 0x24, 0x72, 0x24, 0x52, 0xB9, 0x61, 0x14, 0x00, 0xB9, 0x71, 0x2C, 0x00, 0xB9, 0x51, + 0x08, 0x00, 0x2C, 0xD0, 0x10, 0x00, 0x9A, 0xC2, 0xFD, 0xFF, 0x38, 0x7E, 0x08, 0x07, 0x38, 0x61, + 0x10, 0x00, 0xA9, 0xAE, 0x08, 0x07, 0xB9, 0x7E, 0x0C, 0x07, 0xA9, 0x6E, 0x0A, 0x07, 0x58, 0xC1, + 0x60, 0x00, 0x58, 0x81, 0x50, 0x00, 0x2C, 0x10, 0x70, 0x00, 0xE1, 0xF0, 0x0C, 0x70, 0xA6, 0x0F, + 0x04, 0x60, 0x78, 0x57, 0x04, 0x00, 0x24, 0x61, 0xC6, 0x25, 0x22, 0x0E, 0x78, 0x57, 0x06, 0x00, + 0xC6, 0x25, 0x12, 0x0A, 0x70, 0x57, 0xC6, 0x35, 0x22, 0x07, 0x78, 0x57, 0x02, 0x00, 0xC6, 0x35, + 0x12, 0x03, 0x13, 0x26, 0xF2, 0x06, 0x13, 0x66, 0xC4, 0x62, 0x24, 0x78, 0x92, 0xEB, 0x04, 0x20, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0xB1, 0xB1, 0x0C, 0xE0, + 0x80, 0x08, 0x28, 0x7E, 0x06, 0x00, 0x18, 0xCE, 0x83, 0x07, 0xD4, 0x71, 0x06, 0xD2, 0x06, 0xB3, + 0x92, 0x3F, 0x38, 0x60, 0xE4, 0x10, 0x18, 0x7E, 0x88, 0x07, 0x18, 0x66, 0xB9, 0x00, 0xC6, 0x67, + 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x88, 0x07, 0xF2, 0x33, 0x18, 0x72, 0x0A, 0x00, 0xD7, 0xC1, + 0x2C, 0xC0, 0x34, 0x00, 0x26, 0xCE, 0x0C, 0x20, 0x26, 0x07, 0x99, 0x7C, 0x2A, 0x07, 0x26, 0x2C, + 0x06, 0x3D, 0x04, 0x44, 0x0B, 0x7A, 0x03, 0x00, 0x99, 0xBC, 0x2B, 0x07, 0x18, 0x7D, 0x0D, 0x00, + 0x04, 0x62, 0x99, 0x7C, 0x2C, 0x07, 0x18, 0x7E, 0x83, 0x07, 0x24, 0x71, 0x99, 0x7E, 0x83, 0x07, + 0x18, 0x7D, 0x0D, 0x00, 0xD6, 0x67, 0x82, 0x14, 0x04, 0x64, 0xD6, 0x67, 0x82, 0x09, 0x04, 0x71, + 0x99, 0x7E, 0x85, 0x07, 0x99, 0x0E, 0x86, 0x07, 0x99, 0x0E, 0x87, 0x07, 0xF2, 0x09, 0xDC, 0x70, + 0x18, 0x00, 0x82, 0x06, 0x04, 0x71, 0x99, 0x0E, 0x85, 0x07, 0x99, 0x7E, 0x86, 0x07, 0x58, 0xC1, + 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x06, 0xE2, 0x06, 0x63, 0x70, 0x22, 0x78, 0x3E, 0x02, 0x00, 0x0C, 0xD0, 0x80, 0x08, + 0x0C, 0x40, 0x36, 0x07, 0x0C, 0x50, 0xA6, 0x0F, 0x26, 0x4D, 0x04, 0x70, 0x78, 0xF5, 0x04, 0x00, + 0xC6, 0xF2, 0x12, 0x0D, 0x78, 0xF5, 0x06, 0x00, 0xC6, 0x2F, 0x12, 0x09, 0x70, 0xF5, 0xC6, 0xF3, + 0x12, 0x06, 0x78, 0xF5, 0x02, 0x00, 0xC6, 0x3F, 0x12, 0x02, 0x04, 0x71, 0x24, 0x58, 0xC6, 0x54, + 0x92, 0xEE, 0xC4, 0x70, 0x82, 0x77, 0xC4, 0x61, 0x82, 0x09, 0xC4, 0x61, 0xA2, 0x6F, 0xC4, 0x62, + 0x82, 0x1E, 0xC4, 0x64, 0x82, 0x44, 0xFA, 0xAF, 0x00, 0x00, 0x18, 0x6D, 0x85, 0x07, 0x14, 0x71, + 0xC4, 0x60, 0x9A, 0xAA, 0x00, 0x00, 0xEB, 0x60, 0x03, 0x00, 0x86, 0xC2, 0x82, 0x09, 0x04, 0x76, + 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x06, 0x3C, 0xAB, 0x62, 0x03, 0x00, 0xF2, 0x04, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0x99, 0xCE, 0x0E, 0x00, 0xFA, 0x96, 0x00, 0x00, 0x18, 0x7E, 0x0D, 0x00, + 0x04, 0x61, 0xD6, 0x67, 0x82, 0x0B, 0xD4, 0x76, 0x82, 0x06, 0x04, 0x7A, 0x99, 0x7E, 0x0D, 0x00, + 0xFA, 0x84, 0x00, 0x00, 0x0C, 0x70, 0x12, 0x00, 0xF2, 0x42, 0x04, 0x62, 0xD6, 0x67, 0x14, 0x71, + 0x8A, 0x83, 0x00, 0x00, 0xEB, 0x60, 0x03, 0x00, 0x86, 0x32, 0x82, 0x0A, 0x98, 0x7E, 0x0E, 0x00, + 0x92, 0x07, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x3E, 0x0E, 0x00, 0xF2, 0x04, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0xAB, 0x62, 0x03, 0x00, 0xF2, 0x6D, 0x18, 0x7E, 0x0D, 0x00, + 0x04, 0x61, 0xD6, 0x67, 0x92, 0xD9, 0x04, 0x62, 0xD6, 0x67, 0x14, 0x71, 0x82, 0x65, 0xEB, 0x60, + 0x03, 0x00, 0x86, 0x22, 0x18, 0x3E, 0x0E, 0x00, 0x82, 0x11, 0xC4, 0x30, 0x82, 0x11, 0xC6, 0x23, + 0x04, 0x7A, 0x82, 0x03, 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0xAB, 0x62, + 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0xF2, 0x06, 0xC4, 0x30, 0x92, 0xF4, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0E, 0x0E, 0x00, 0xF2, 0x46, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, + 0xF2, 0x42, 0xC4, 0x61, 0x82, 0x08, 0xC4, 0x61, 0xA2, 0x3A, 0xC4, 0x62, 0x82, 0x09, 0xC4, 0x64, + 0x82, 0x1B, 0xF2, 0x3A, 0x99, 0x6E, 0x0D, 0x00, 0x99, 0x0D, 0x88, 0x07, 0xF2, 0x35, 0x18, 0x7E, + 0x0D, 0x00, 0xD4, 0x72, 0x82, 0x15, 0x98, 0x3E, 0x0E, 0x00, 0x82, 0x08, 0x0C, 0x70, 0x12, 0x00, + 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0xAB, 0x62, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0D, 0x00, + 0x99, 0x0D, 0x88, 0x07, 0xF2, 0x18, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, 0x92, 0x07, 0x04, 0x71, + 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0x88, 0x07, 0xF2, 0x10, 0x98, 0x3E, 0x0E, 0x00, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0x82, 0x07, 0x04, 0x7A, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0xAB, 0x62, + 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0x04, 0x70, 0xF2, 0x06, 0x04, 0x62, 0x99, 0x6E, + 0x0D, 0x00, 0xF2, 0x02, 0x14, 0x71, 0x28, 0x5D, 0x06, 0x00, 0x04, 0x63, 0xD6, 0x65, 0x92, 0x07, + 0x18, 0x6E, 0x0D, 0x00, 0x54, 0x63, 0x66, 0x65, 0xA9, 0x6D, 0x06, 0x00, 0x50, 0xC1, 0x06, 0x27, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x40, 0x0D, 0x11, 0xC4, 0x40, 0x28, 0x50, + 0xE8, 0x10, 0x06, 0x37, 0x0C, 0x70, 0x80, 0x08, 0x82, 0x07, 0x0C, 0x60, 0x80, 0x06, 0x26, 0x55, + 0x26, 0x56, 0x20, 0x65, 0xF2, 0x0A, 0x08, 0x60, 0x00, 0x30, 0x57, 0x51, 0x2C, 0x60, 0x00, 0x60, + 0x26, 0x65, 0x30, 0x66, 0x5C, 0x60, 0xFF, 0x7F, 0xC4, 0x40, 0xA9, 0x67, 0x10, 0x00, 0x06, 0x63, + 0x0C, 0x60, 0xE8, 0x10, 0x28, 0x66, 0x02, 0x00, 0x92, 0x0B, 0x08, 0x50, 0x00, 0x30, 0x57, 0x61, + 0x2C, 0x50, 0x00, 0x60, 0x26, 0x56, 0x30, 0x65, 0x5C, 0x60, 0xFF, 0x7F, 0xF2, 0x06, 0x26, 0x66, + 0x0C, 0x50, 0x80, 0x06, 0x26, 0x65, 0x20, 0x66, 0xA9, 0x67, 0x12, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x04, 0x70, 0xC6, 0x74, 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, 0x2F, 0x67, 0x02, 0x00, + 0x91, 0x56, 0x24, 0x71, 0xF2, 0xF7, 0xE1, 0xF0, 0x71, 0x00, 0xF2, 0xFF, 0xC6, 0x23, 0x06, 0x72, + 0x32, 0x02, 0x06, 0x73, 0x43, 0x27, 0xE1, 0xF0, 0xC6, 0x23, 0x22, 0x07, 0xC6, 0x24, 0x06, 0x72, + 0x32, 0x02, 0x06, 0x74, 0x43, 0x27, 0xF2, 0x06, 0xC6, 0x34, 0x06, 0x23, 0x32, 0x02, 0x06, 0x24, + 0x43, 0x22, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE5, 0x06, 0xD6, 0x6B, 0x04, + 0x00, 0x00, 0x06, 0x3E, 0x06, 0x4D, 0x6B, 0x04, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x24, 0x00, 0xC6, 0x23, 0x06, 0x72, 0x02, 0x02, 0x06, 0x73, 0x43, 0x27, 0xE1, 0xF0, + 0x26, 0x23, 0xE1, 0xF0, 0x26, 0x23, 0x26, 0x24, 0xE1, 0xF0, 0x24, 0x00, 0x26, 0x32, 0x26, 0x43, + 0x26, 0x54, 0x2F, 0x26, 0x05, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x09, 0x2F, 0x67, + 0x03, 0x00, 0x60, 0x56, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, 0xF2, 0xF7, 0xE1, 0xF0, + 0x34, 0x14, 0xB1, 0xF1, 0x77, 0x41, 0x04, 0x70, 0x14, 0x61, 0x34, 0x41, 0xC6, 0x46, 0x82, 0x09, + 0x2F, 0x57, 0x03, 0x00, 0x30, 0xF5, 0x2F, 0x57, 0x02, 0x00, 0xB1, 0xF5, 0x24, 0x74, 0xF2, 0xF6, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x24, 0x00, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x06, 0x2F, 0x67, + 0x02, 0x00, 0x91, 0x36, 0x24, 0x71, 0xF2, 0xFA, 0xE1, 0xF0, 0x24, 0x00, 0x77, 0x41, 0x14, 0x71, + 0x34, 0x41, 0xC6, 0x47, 0x82, 0x04, 0xB1, 0x32, 0x24, 0x24, 0xF2, 0xFB, 0xE1, 0xF0, 0x24, 0x00, + 0x77, 0x31, 0x14, 0x71, 0x34, 0x31, 0xC6, 0x37, 0x82, 0x04, 0xB1, 0x02, 0x24, 0x24, 0xF2, 0xFB, + 0xE1, 0xF0, 0x24, 0x00, 0x08, 0x50, 0x00, 0x30, 0x0C, 0x70, 0xA4, 0x45, 0x0C, 0x40, 0xFC, 0x41, + 0x0C, 0x60, 0x52, 0x06, 0x26, 0x75, 0x26, 0x45, 0x30, 0x57, 0x34, 0x74, 0xC6, 0x74, 0x77, 0x58, + 0xA1, 0x56, 0x34, 0x62, 0x92, 0xFA, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x08, 0x70, 0x00, 0x30, + 0x2C, 0x70, 0xA4, 0x63, 0x0C, 0x60, 0xE9, 0x00, 0x0C, 0xE0, 0x80, 0x06, 0x0C, 0x20, 0x80, 0x02, + 0x14, 0x41, 0x30, 0xF7, 0x2F, 0x56, 0x06, 0x00, 0x2F, 0x3E, 0x05, 0x00, 0xA1, 0xF3, 0x1C, 0x30, + 0x00, 0x1E, 0x26, 0x37, 0x30, 0x33, 0x34, 0x61, 0xC6, 0x64, 0x26, 0x52, 0xA1, 0x35, 0x34, 0x74, + 0x92, 0xF1, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x1E, 0x00, 0xB1, 0x71, + 0x30, 0x71, 0x14, 0x61, 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, + 0x34, 0x18, 0xC1, 0xE1, 0x0C, 0x70, 0x00, 0x41, 0x08, 0xE0, 0x00, 0x40, 0xB9, 0x7E, 0x00, 0x60, + 0x0C, 0x70, 0x38, 0x00, 0xB9, 0x7E, 0x30, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x0C, 0x70, 0x00, 0x81, + 0xB9, 0x7E, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x24, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x90, 0x60, 0xB9, 0x27, 0x00, 0x60, + 0xB9, 0x37, 0x04, 0x60, 0xB9, 0x07, 0x08, 0x60, 0x38, 0x67, 0x90, 0x60, 0xD4, 0x61, 0x82, 0xFD, + 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x24, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x00, 0x60, + 0x04, 0x60, 0xC6, 0x65, 0x2F, 0x23, 0x06, 0x00, 0x82, 0x0D, 0xB9, 0x27, 0x04, 0x60, 0x30, 0x24, + 0xB9, 0x27, 0x08, 0x60, 0x38, 0x27, 0x90, 0x60, 0xD4, 0x22, 0x82, 0xFD, 0x24, 0x61, 0x24, 0x44, + 0xF2, 0xF1, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0x00, 0xDE, + 0xB9, 0x67, 0x10, 0x60, 0x77, 0x31, 0x0C, 0x60, 0x90, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x77, 0x21, + 0x34, 0x31, 0x08, 0x60, 0x00, 0x13, 0xB9, 0x27, 0x04, 0x60, 0x66, 0x36, 0xB9, 0x37, 0x14, 0x60, + 0x08, 0x50, 0x00, 0x10, 0x38, 0x67, 0x14, 0x60, 0x0C, 0x40, 0x14, 0x60, 0xD6, 0x65, 0x26, 0x47, + 0x92, 0xFA, 0x38, 0xE7, 0x18, 0x60, 0xB1, 0x04, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, + 0xB9, 0x07, 0x10, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x12, 0x0B, 0x11, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE0, 0x01, 0x20, 0x03, 0x08, 0x00, 0x03, 0x02, 0x66, 0x00, + 0x66, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x98, 0x08, 0x01, 0xC8, 0xC8, 0x00, 0x80, 0x00, 0x01, 0x1E, 0x01, 0x02, 0x98, 0x08, 0x11, 0x11, + 0xFF, 0xFF, 0xFF, 0x0B, 0x0C, 0xFF, 0xFF, 0xFF, 0x80, 0x3E, 0x00, 0x00, 0xE0, 0x2E, 0x00, 0x00, + 0xE0, 0x2E, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x80, 0x96, 0x98, 0x00, 0xE8, 0x03, 0x00, 0x00, + 0x3C, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0x14, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x03, 0x00, 0x5A, 0x00, 0x01, 0x00, 0x0A, 0x00, 0xE8, 0x03, 0x64, 0x64, 0x64, 0x01, 0x1C, 0x1C, + 0x04, 0x0F, 0x00, 0x0A, 0x06, 0x14, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x14, 0x00, 0x01, 0x00, 0x90, 0x01, 0x00, 0x00, 0xFA, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x64, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x11, 0x11, 0x22, 0x00, 0x23, 0x13, 0x22, 0x00, + 0x23, 0x13, 0x22, 0x00, 0x23, 0x13, 0x22, 0x00, 0x23, 0x13, 0x22, 0x00, 0x23, 0x13, 0x22, 0x00, + 0x23, 0x13, 0x22, 0x00, 0x23, 0x13, 0x22, 0x00, 0x23, 0x13, 0x22, 0x00, 0x11, 0x11, 0x22, 0x00, + 0x51, 0x86, 0x01, 0x00, 0x51, 0x86, 0x01, 0x00, 0x51, 0x86, 0x01, 0x00, 0x51, 0x86, 0x01, 0x00, + 0x51, 0x86, 0x01, 0x00, 0x53, 0x86, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0x00, 0x00, 0x80, 0x0F, 0xA0, 0x8F, 0x80, 0x0F, 0xA0, 0x8F, 0x40, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x30, 0x00, 0xFF, 0x05, 0xFF, 0x03, 0x10, 0x10, 0x98, 0x00, + 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x00, 0x00, 0x08, 0x84, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xC8, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, + 0xFF, 0x00, 0x30, 0x00, 0xFF, 0x05, 0xFF, 0x03, 0x10, 0x10, 0x98, 0x00, 0x10, 0x5F, 0x10, 0x3F, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x04, 0x82, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x30, 0x00, + 0xFF, 0x05, 0xFF, 0x03, 0x10, 0x10, 0x98, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x84, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0xC8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x02, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0xFF, 0x00, 0x30, 0x00, 0xFF, 0x05, 0xFF, 0x03, + 0x10, 0x10, 0x98, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x02, 0x81, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0xB9, 0x00, 0x00, + 0x4C, 0x4F, 0x06, 0x00, 0x52, 0x64, 0x00, 0x64, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x2C, 0x01, 0x14, 0x00, 0x5E, 0x01, + 0x5E, 0x01, 0x5E, 0x01, 0x2C, 0x01, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0x50, 0x00, + 0x01, 0x00, 0x01, 0x00, 0xC8, 0x00, 0x01, 0x00, 0x0A, 0x02, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, + 0xF4, 0x01, 0x01, 0x01, 0x0A, 0x00, 0x1E, 0x00, 0x2C, 0x01, 0x32, 0xFA, 0x0A, 0x00, 0x32, 0x00, + 0x00, 0x05, 0x04, 0x0A, 0x05, 0x06, 0x46, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x07, 0x1E, 0x00, + 0x96, 0x00, 0x2C, 0x01, 0x64, 0x00, 0x14, 0x00, 0x2D, 0x00, 0x14, 0x00, 0x14, 0x00, 0x2C, 0x01, + 0x03, 0x02, 0x01, 0x01, 0x01, 0x00, 0x50, 0x00, 0x64, 0x00, 0xF0, 0x00, 0x14, 0x00, 0x50, 0x00, + 0xDC, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x64, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, + 0x02, 0x03, 0x01, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0x19, 0x32, 0x4B, 0x64, 0x5F, + 0x00, 0x02, 0x00, 0x32, 0x32, 0x14, 0x5A, 0x00, 0x0A, 0x0A, 0x1E, 0x00, 0x05, 0x0A, 0x01, 0x00, + 0x8C, 0x00, 0xC8, 0x00, 0x05, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x00, 0x00, 0x9D, 0xB9, 0x00, 0x00, + 0x4C, 0x4F, 0x06, 0x00, 0x52, 0x64, 0x00, 0x64, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x2C, 0x01, 0x14, 0x00, 0x40, 0x01, + 0x90, 0x01, 0x90, 0x01, 0x2C, 0x01, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0x50, 0x00, + 0x01, 0x00, 0x01, 0x00, 0xC8, 0x00, 0x01, 0x00, 0x0A, 0x02, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, + 0xF4, 0x01, 0x01, 0x01, 0x0A, 0x00, 0x1E, 0x00, 0x2C, 0x01, 0x32, 0xFA, 0x0A, 0x00, 0x32, 0x00, + 0x00, 0x05, 0x04, 0x0A, 0x05, 0x06, 0x46, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x07, 0x1E, 0x00, + 0x96, 0x00, 0x2C, 0x01, 0x64, 0x00, 0x14, 0x00, 0x2D, 0x00, 0x14, 0x00, 0x14, 0x00, 0x2C, 0x01, + 0x05, 0x02, 0x01, 0x01, 0x01, 0x00, 0x50, 0x00, 0x96, 0x00, 0x18, 0x01, 0x14, 0x00, 0x50, 0x00, + 0xDC, 0x00, 0x1E, 0x00, 0x32, 0x00, 0x64, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, + 0x02, 0x03, 0x01, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0x19, 0x32, 0x4B, 0x64, 0x5F, + 0x00, 0x02, 0x00, 0x32, 0x32, 0x14, 0x46, 0x00, 0x0A, 0x0A, 0x1E, 0x00, 0x05, 0x0A, 0x01, 0x00, + 0x8C, 0x00, 0xC8, 0x00, 0x05, 0x05, 0xC8, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x12, 0x0D, 0x12, 0x0D, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x52, 0x4F, 0x4F, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x88, 0x89, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x23, 0x11, 0x22, 0x00, 0x44, 0xFF, 0x0F, 0x00, 0x11, 0x11, 0x00, 0x00, + 0x32, 0x64, 0x01, 0x02, 0xFF, 0x07, 0x2C, 0x01, 0x02, 0x32, 0x10, 0x10, 0x32, 0x14, 0x07, 0x00, + 0x64, 0x00, 0x64, 0x10, 0x51, 0x86, 0x01, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0xA0, 0x8F, + 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x00, 0xFF, 0x00, 0x30, 0x00, 0xFF, 0x05, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x98, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x04, 0x82, + 0x00, 0x00, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x0E, 0x57, 0x0F, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xD6, 0xF1, 0x70, 0x00, 0x00, 0x00, 0x00, + 0x71, 0x84, 0x40, 0x00, 0x15, 0x33, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0xD0, 0x07, 0x09, 0x17, 0x08, 0x18, 0x07, 0x19, 0x06, 0x1A, + 0x05, 0x1B, 0x04, 0x1C, 0x03, 0x1D, 0x02, 0x1E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x16, 0x0A, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x50, 0x05, 0x05, 0x00, 0x00, + 0x25, 0x19, 0x19, 0x0D, 0x3D, 0x31, 0x31, 0x25, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 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, + 0x4F, 0x29, 0x27, 0x00, 0x4F, 0x2A, 0x27, 0x01, 0x4F, 0x2B, 0x27, 0x02, 0x4F, 0x2E, 0x27, 0x04, + 0x4F, 0x2F, 0x27, 0x06, 0x4F, 0x31, 0x27, 0x0B, 0x4F, 0x34, 0x27, 0x0D, 0x4F, 0x3C, 0x27, 0x12, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x07, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, + 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, + 0x00, 0xD0, 0xF1, 0x3F, 0x21, 0xF0, 0xF1, 0x3F, 0x42, 0xF0, 0xF1, 0x3F, 0x63, 0xF0, 0xF1, 0x3F, + 0x84, 0xF0, 0xF1, 0x3F, 0xA5, 0xF0, 0xF1, 0x3F, 0xC6, 0xF0, 0xF1, 0x3F, 0xE7, 0xF0, 0xF1, 0x3F, + 0x08, 0xF1, 0xF1, 0x3F, 0x29, 0xF1, 0xF1, 0x3F, 0x4A, 0xF1, 0xF1, 0x3F, 0x6B, 0xF1, 0xF1, 0x3F, + 0x8C, 0xF1, 0xF1, 0x3F, 0xAD, 0xF1, 0xF1, 0x3F, 0xCE, 0xF1, 0xF1, 0x3F, 0xEF, 0xF1, 0xF1, 0x3F, + 0x10, 0xF2, 0xF1, 0x3F, 0x31, 0xE2, 0xF1, 0x7F, 0x00, 0xC0, 0x01, 0x00, 0x00, 0xC0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x40, 0x1C, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x28, 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, 0x28, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x28, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x30, 0x00, 0x42, 0x00, 0x30, 0x00, 0x60, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 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, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x78, 0x00, 0x00, + 0x00, 0x78, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x80, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x42, 0x00, 0x30, 0x00, 0x60, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x82, 0x49, 0xB0, 0x5C, 0x76, 0x80, 0xBF, 0xFA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x03, 0xDF, 0x07, 0x12, 0x3B, 0x35, 0x00, 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47 +}; + +#endif // __IST30XXC_FW_H__ \ No newline at end of file diff --git a/drivers/input/touchscreen/ist30xxc/firmware/ist30xxc_fw.h b/drivers/input/touchscreen/ist30xxc/firmware/ist30xxc_fw.h new file mode 100644 index 00000000..267fb105 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/firmware/ist30xxc_fw.h @@ -0,0 +1,4054 @@ + +#ifndef __IST30XXC_FW_H__ +#define __IST30XXC_FW_H__ + +// Chip ID : 0x0000038C +// FW Ver : 0x02010000 +// Param Ver : 0x00000004 +// FW Download CRC : 0x44A4BC98 +// Normal CRC : 0x637657C8 + +static unsigned char ist30xxc_fw[] = { + 0x80, 0x00, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x54, 0x12, 0x00, 0x80, 0xFC, 0x00, 0x00, 0x80, + 0x04, 0x01, 0x00, 0x80, 0x50, 0x1D, 0x00, 0x80, 0x00, 0x1D, 0x00, 0x80, 0x28, 0x1D, 0x00, 0x80, + 0xD8, 0x1C, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x94, 0x1D, 0x00, 0x80, + 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x10, 0x00, 0x27, 0x08, 0x80, 0x00, 0x80, 0x2C, 0x80, 0x08, 0x7A, 0xAB, 0x0B, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, 0x99, 0x67, 0x10, 0x00, 0x91, 0x67, 0x08, 0x70, 0x0F, 0x00, + 0x11, 0x17, 0x0C, 0x70, 0x70, 0x15, 0x0C, 0x60, 0x70, 0x15, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, + 0x24, 0x74, 0xF2, 0xFC, 0x08, 0x30, 0x00, 0x80, 0x04, 0x70, 0x0C, 0x40, 0x70, 0x15, 0x0C, 0x50, + 0x70, 0x15, 0x2C, 0x30, 0x60, 0x7C, 0x2F, 0x64, 0x07, 0x00, 0xC6, 0x65, 0xB2, 0x07, 0x2F, 0x23, + 0x07, 0x00, 0x30, 0x22, 0x24, 0x74, 0xB1, 0x26, 0xF2, 0xF7, 0x0C, 0x70, 0x70, 0x15, 0x0C, 0x60, + 0xC4, 0x15, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, 0x24, 0x74, 0xF2, 0xFC, 0x2B, 0x0F, 0x00, 0x00, + 0x2B, 0xD0, 0x03, 0x00, 0xB9, 0x20, 0x88, 0x27, 0x04, 0x22, 0xF2, 0x0D, 0xB9, 0x20, 0x88, 0x27, + 0x04, 0x23, 0xF2, 0x09, 0xB9, 0x20, 0x88, 0x27, 0x04, 0x24, 0xF2, 0x05, 0xB9, 0x20, 0x88, 0x27, + 0x04, 0x21, 0xF2, 0x01, 0xB9, 0x10, 0x84, 0x27, 0xB9, 0x30, 0x8C, 0x27, 0x08, 0x30, 0x00, 0x50, + 0xB9, 0x03, 0x00, 0x10, 0xD9, 0x40, 0x90, 0x27, 0xD9, 0x80, 0xA0, 0x27, 0xD9, 0xC0, 0xB0, 0x27, + 0x01, 0x40, 0x01, 0x51, 0xC9, 0x40, 0xC0, 0x27, 0x99, 0x20, 0x80, 0x27, 0x08, 0x20, 0x01, 0x00, + 0xB1, 0x23, 0x98, 0x40, 0x80, 0x27, 0x92, 0xFE, 0x09, 0x00, 0x01, 0x00, 0x04, 0x23, 0xB9, 0x23, + 0x00, 0x10, 0xF2, 0x01, 0x48, 0x40, 0xC0, 0x27, 0x11, 0x15, 0x11, 0x04, 0x58, 0xC0, 0xB0, 0x27, + 0x58, 0x80, 0xA0, 0x27, 0x58, 0x40, 0x90, 0x27, 0x48, 0x20, 0x88, 0x27, 0x38, 0x10, 0x84, 0x27, + 0x61, 0x00, 0x00, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x4C, 0x00, 0x00, + 0xCB, 0x52, 0x00, 0x00, 0xEB, 0x53, 0x00, 0x00, 0x4B, 0x25, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x59, 0x00, 0x00, 0xCB, 0x5B, 0x00, 0x00, + 0x0B, 0x5B, 0x00, 0x00, 0x8B, 0x5C, 0x00, 0x00, 0x6B, 0x5E, 0x00, 0x00, 0x2B, 0x5F, 0x00, 0x00, + 0x4B, 0x61, 0x00, 0x00, 0x6B, 0x6F, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xCB, 0x61, 0x00, 0x00, 0xCB, 0x6A, 0x00, 0x00, 0x0B, 0x4F, + 0x00, 0x00, 0xAB, 0x69, 0x00, 0x00, 0x04, 0x20, 0x2B, 0x7A, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0x04, 0x2A, 0xD1, 0xC1, 0xEB, 0x49, 0x00, 0x00, + 0x0B, 0x4C, 0x00, 0x00, 0xCB, 0x0B, 0x00, 0x00, 0xAB, 0x58, 0x00, 0x00, 0xAB, 0x0C, 0x00, 0x00, + 0x8B, 0x36, 0x00, 0x00, 0xCB, 0x94, 0x00, 0x00, 0xEB, 0x12, 0x00, 0x00, 0x0B, 0x0E, 0x00, 0x00, + 0x28, 0x20, 0x88, 0x15, 0x6B, 0x14, 0x00, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x98, 0xC0, 0xB5, 0x15, + 0x92, 0xF8, 0x4B, 0x91, 0x00, 0x00, 0x04, 0x21, 0xCB, 0x61, 0x00, 0x00, 0xEB, 0x82, 0x00, 0x00, + 0x6B, 0x88, 0x00, 0x00, 0x06, 0x2C, 0xCB, 0x61, 0x00, 0x00, 0x8B, 0x90, 0x00, 0x00, 0xCB, 0x91, + 0x00, 0x00, 0x2B, 0x7C, 0x00, 0x00, 0xF2, 0xE5, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x04, 0x30, + 0xB9, 0x37, 0x08, 0x30, 0xB9, 0x47, 0x00, 0x30, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0xB3, 0x15, + 0x82, 0x08, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x00, 0x30, 0x64, 0x71, 0xB9, 0x76, 0x00, 0x30, + 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0xB3, 0x15, 0x82, 0x09, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, + 0x00, 0x30, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x00, 0x30, 0xE1, 0xF0, 0x98, 0x70, 0xB3, 0x15, + 0x82, 0x05, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x08, 0x30, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x28, 0x00, 0xD4, 0x74, 0x92, 0xFD, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x40, 0x01, 0x23, 0x77, 0xB9, 0x76, 0x40, 0x01, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x30, + 0x38, 0x27, 0x40, 0x01, 0xF7, 0x2F, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0x15, 0x00, 0x00, + 0x04, 0x70, 0xC6, 0x27, 0x82, 0x0D, 0xEB, 0x14, 0x00, 0x00, 0x08, 0x70, 0x00, 0x30, 0x08, 0x60, + 0x00, 0x80, 0xB9, 0x67, 0x40, 0x01, 0x38, 0x77, 0x3C, 0x01, 0xB9, 0x70, 0x74, 0x15, 0x30, 0xF1, + 0x06, 0x27, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xE2, 0x77, 0xE8, 0xCC, 0xE0, 0x14, 0x00, 0x0C, 0xD0, 0xFF, 0xFF, 0xB1, 0xB1, 0x56, 0xD2, + 0x82, 0x45, 0xCC, 0xE0, 0x14, 0x00, 0xD2, 0x18, 0xCC, 0xE0, 0x10, 0x00, 0x82, 0x36, 0xCC, 0xE0, + 0x10, 0x00, 0xD2, 0x08, 0xC4, 0xE1, 0x82, 0x2E, 0xC4, 0xE2, 0x92, 0x4A, 0x99, 0xD0, 0xB5, 0x15, + 0xF2, 0x65, 0xCC, 0xE0, 0x12, 0x00, 0x82, 0x2C, 0xCC, 0xE0, 0x12, 0x00, 0xD2, 0x2C, 0x99, 0xD0, + 0xB3, 0x15, 0xFA, 0x8D, 0x00, 0x00, 0xCC, 0xE0, 0x22, 0x00, 0x82, 0x31, 0xCC, 0xE0, 0x22, 0x00, + 0xD2, 0x0D, 0xCC, 0xE0, 0x20, 0x00, 0x82, 0x25, 0xCC, 0xE0, 0x20, 0x00, 0xD2, 0x25, 0xCC, 0xE0, + 0x15, 0x00, 0x92, 0x2E, 0x99, 0xD0, 0xAF, 0x15, 0xF2, 0x7A, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x25, + 0xCC, 0xE0, 0x81, 0x00, 0x82, 0x1F, 0xCC, 0xE0, 0x23, 0x00, 0x92, 0x22, 0xA9, 0xD0, 0xA4, 0x15, + 0xF2, 0x6E, 0x99, 0xE0, 0xB6, 0x15, 0xF2, 0x6B, 0x99, 0xD0, 0xB4, 0x15, 0xF2, 0x68, 0x99, 0xD0, + 0xB2, 0x15, 0xF2, 0x65, 0x99, 0xD0, 0xB1, 0x15, 0xF2, 0x62, 0x99, 0xD0, 0xB0, 0x15, 0xF2, 0x5F, + 0xA9, 0xD0, 0xA8, 0x15, 0xF2, 0x5C, 0xA9, 0xD0, 0xAA, 0x15, 0xF2, 0x59, 0xA9, 0xD0, 0xA6, 0x15, + 0xF2, 0x56, 0x99, 0xD0, 0xAD, 0x15, 0xF2, 0x53, 0x99, 0xD0, 0xAC, 0x15, 0xF2, 0x4E, 0xCC, 0xE0, + 0x32, 0x00, 0xD2, 0x18, 0xCC, 0xE0, 0x31, 0x00, 0xB2, 0x2E, 0xC4, 0xE2, 0x82, 0x17, 0xCC, 0xE0, + 0x30, 0x00, 0x92, 0x45, 0xAB, 0x13, 0x00, 0x00, 0x04, 0x20, 0x6B, 0xE5, 0x00, 0x00, 0x0C, 0xB0, + 0x40, 0x01, 0x08, 0xE0, 0x00, 0x30, 0x08, 0xD0, 0x30, 0x00, 0x06, 0xCE, 0x26, 0xBE, 0x24, 0xD1, + 0xF2, 0x31, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x31, 0xF2, 0x32, 0xAB, 0xD6, 0x00, 0x00, 0xC4, 0xD0, + 0x08, 0xE0, 0x00, 0x40, 0x82, 0x09, 0xAB, 0x13, 0x00, 0x00, 0x38, 0x7E, 0x54, 0x10, 0xB9, 0x70, + 0x70, 0x15, 0x14, 0x71, 0xF2, 0x05, 0xEB, 0x12, 0x00, 0x00, 0x38, 0x70, 0x70, 0x15, 0xB9, 0x7E, + 0x54, 0x10, 0xF2, 0x1D, 0xAB, 0x13, 0x00, 0x00, 0x04, 0x20, 0x6B, 0xE5, 0x00, 0x00, 0x06, 0x2E, + 0x0B, 0x18, 0x01, 0x00, 0xF2, 0x14, 0xB8, 0x7E, 0x40, 0x01, 0x32, 0xFE, 0x38, 0x7E, 0x28, 0x00, + 0xD4, 0x74, 0x92, 0xFD, 0xB1, 0x6B, 0x38, 0x7C, 0x3C, 0x01, 0xC6, 0x7D, 0x92, 0xF5, 0x04, 0x74, + 0xF1, 0x70, 0x08, 0x60, 0x00, 0x80, 0xF2, 0xF0, 0x6B, 0x6C, 0x00, 0x00, 0x58, 0xC1, 0x04, 0x00, + 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0xE0, + 0x00, 0x30, 0x0C, 0xD0, 0x00, 0x01, 0x26, 0xDE, 0xEB, 0x14, 0x00, 0x00, 0x06, 0x2D, 0x0C, 0x30, + 0x40, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x72, 0x82, 0x05, + 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF1, 0x38, 0x7E, 0x40, 0x01, 0xB9, 0x7E, 0x40, 0x01, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0x0C, 0x20, 0x00, 0x00, 0x0C, 0x30, + 0x80, 0x00, 0xC1, 0xE1, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x2E, 0x0C, 0x20, 0x00, 0x27, + 0x0C, 0x30, 0x80, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, + 0x00, 0xFA, 0x38, 0x67, 0xF8, 0x01, 0x0C, 0xE0, 0x00, 0x27, 0xB9, 0x60, 0x00, 0x00, 0x38, 0x67, + 0xFC, 0x01, 0xB9, 0x60, 0x04, 0x00, 0x08, 0x60, 0x00, 0x80, 0x38, 0x66, 0x04, 0xDC, 0xB9, 0x60, + 0x08, 0x00, 0x38, 0x67, 0xF0, 0x01, 0xB9, 0x60, 0x0C, 0x00, 0x38, 0x67, 0xF4, 0x01, 0x38, 0x77, + 0xCC, 0x01, 0xB9, 0x60, 0x10, 0x00, 0xB9, 0x70, 0x1C, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x77, + 0x10, 0x20, 0xB9, 0xE0, 0x70, 0x00, 0x08, 0x60, 0x00, 0x80, 0xF7, 0x70, 0xB9, 0x70, 0x20, 0x00, + 0x08, 0x70, 0x80, 0x04, 0x2C, 0x70, 0xFF, 0x07, 0xB9, 0x70, 0x40, 0x00, 0x08, 0x70, 0x0E, 0x00, + 0x2C, 0x70, 0x16, 0x00, 0xB9, 0x70, 0x44, 0x00, 0x08, 0x70, 0x02, 0x01, 0x2C, 0x70, 0x14, 0x0C, + 0xB9, 0x70, 0x48, 0x00, 0x08, 0x70, 0x14, 0x0D, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x70, 0x4C, 0x00, + 0x14, 0x71, 0xB9, 0x70, 0x50, 0x00, 0x08, 0x70, 0x0C, 0x00, 0x2C, 0x70, 0x14, 0x00, 0xB9, 0x70, + 0x54, 0x00, 0x08, 0x70, 0x15, 0x01, 0x2C, 0x70, 0x00, 0xFF, 0xB9, 0x70, 0x58, 0x00, 0x04, 0x72, + 0xB9, 0x70, 0x60, 0x00, 0x08, 0x70, 0x08, 0x07, 0x2C, 0x70, 0x08, 0x07, 0x2C, 0x60, 0x7C, 0xDE, + 0xB9, 0x70, 0x64, 0x00, 0x28, 0x76, 0x28, 0x00, 0x28, 0x66, 0x22, 0x00, 0xB9, 0x00, 0x5C, 0x00, + 0x57, 0x78, 0x66, 0x76, 0xB9, 0x70, 0x68, 0x00, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0x00, 0x49, + 0xB9, 0x70, 0x74, 0x00, 0x0C, 0x70, 0x00, 0x10, 0xB9, 0x70, 0x78, 0x00, 0x4B, 0x23, 0x00, 0x00, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, + 0x00, 0x10, 0x18, 0x6E, 0x52, 0x05, 0x04, 0x70, 0xC6, 0x67, 0x06, 0xD2, 0x82, 0x19, 0x0C, 0xF0, + 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x38, 0x05, 0x0C, 0x50, 0x50, 0x05, 0xB1, 0x7D, 0x0C, 0x70, + 0x3C, 0x15, 0x26, 0x5E, 0x04, 0x61, 0xB0, 0x37, 0x82, 0x06, 0x06, 0x46, 0x57, 0x41, 0x26, 0x4D, + 0xB1, 0x34, 0x24, 0x61, 0x24, 0x74, 0xC6, 0x75, 0x92, 0xF7, 0x18, 0x7E, 0x52, 0x05, 0x50, 0xC1, + 0x06, 0x27, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0x06, 0x67, 0x3F, 0x57, 0x03, 0x00, + 0xC4, 0x50, 0x02, 0x08, 0x2F, 0x57, 0x02, 0x00, 0x10, 0x55, 0x24, 0x71, 0x26, 0x65, 0x13, 0x66, + 0xF2, 0xF6, 0x06, 0x26, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x30, 0xE2, + 0x08, 0x70, 0xFF, 0x00, 0x2C, 0x70, 0xFF, 0xFF, 0x56, 0xE7, 0x6C, 0xE0, 0x00, 0x0C, 0xB1, 0xE2, + 0x57, 0x31, 0x06, 0xD2, 0x4B, 0x30, 0x00, 0x00, 0x57, 0x2C, 0x66, 0x2E, 0xB1, 0x2D, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x54, 0x00, 0xD9, 0xC1, 0x44, 0x00, + 0x0B, 0x3C, 0x00, 0x00, 0x06, 0x21, 0x0C, 0x30, 0x40, 0x00, 0xCB, 0x2D, 0x00, 0x00, 0x86, 0xD2, + 0x82, 0x29, 0x06, 0x21, 0x06, 0x3D, 0x4B, 0x31, 0x00, 0x00, 0x98, 0x70, 0xAE, 0x15, 0x82, 0x0A, + 0x0C, 0x20, 0x40, 0x00, 0x26, 0x21, 0x0C, 0x30, 0x00, 0x27, 0x99, 0x01, 0x40, 0x00, 0x0B, 0x41, + 0x00, 0x00, 0x08, 0xE0, 0x00, 0x30, 0x0C, 0xC0, 0x04, 0x01, 0x26, 0xCE, 0xEB, 0x14, 0x00, 0x00, + 0x06, 0x2C, 0x06, 0x31, 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x38, 0x7E, + 0x28, 0x00, 0xD4, 0x72, 0x82, 0x05, 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF0, 0x6B, 0x15, + 0x00, 0x00, 0x06, 0x2D, 0x58, 0xC1, 0x44, 0x00, 0x2C, 0x10, 0x54, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x0C, 0x50, 0x00, 0x00, 0x0C, 0x70, 0x78, 0x00, 0x34, 0x54, 0x04, 0x60, 0x30, 0x47, 0x34, 0x74, + 0xC6, 0x75, 0x26, 0x64, 0x92, 0xFC, 0xB9, 0x60, 0x7C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x30, 0x00, + 0xD9, 0x81, 0x10, 0x00, 0xD9, 0xC1, 0x20, 0x00, 0x30, 0x22, 0x30, 0xB3, 0x08, 0xC0, 0x00, 0x80, + 0x08, 0x80, 0x00, 0x80, 0x06, 0xA4, 0x06, 0x95, 0xB1, 0x21, 0x04, 0xD0, 0x2C, 0xC0, 0x1C, 0x7A, + 0x2C, 0x80, 0x08, 0x7A, 0x2F, 0x7C, 0x0D, 0x00, 0x20, 0xE7, 0x30, 0x21, 0x36, 0x2E, 0x06, 0x32, + 0xAB, 0x97, 0x00, 0x00, 0x06, 0x42, 0x04, 0x70, 0x2F, 0x58, 0x07, 0x00, 0x20, 0x55, 0xB9, 0x41, + 0x04, 0x00, 0xB9, 0x71, 0x0C, 0x00, 0x3F, 0x25, 0x0B, 0x00, 0x06, 0x32, 0xB9, 0x51, 0x08, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x04, 0x00, 0x38, 0x51, 0x08, 0x00, 0x38, 0x71, 0x0C, 0x00, + 0x26, 0x24, 0xCC, 0x20, 0x0F, 0x21, 0xD2, 0x05, 0xB1, 0xEA, 0xB1, 0x59, 0x04, 0x21, 0xF2, 0x09, + 0x24, 0x72, 0xCC, 0x70, 0x14, 0x00, 0x92, 0xE1, 0x24, 0xD2, 0xC4, 0xDC, 0x92, 0xD4, 0x14, 0x21, + 0x58, 0xC1, 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x18, 0x70, 0xAC, 0x15, 0x3C, 0x10, 0x20, 0x00, 0xCC, 0x70, 0x80, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0x92, 0x42, 0x0C, 0xD0, 0x00, 0x10, 0x18, 0x7D, 0x52, 0x05, 0xC4, 0x72, 0x92, 0x3C, 0x38, 0xCD, + 0x3C, 0x05, 0x0C, 0x70, 0xFF, 0x0F, 0x56, 0x7C, 0xB9, 0x71, 0x08, 0x00, 0x06, 0x7C, 0x77, 0x76, + 0x04, 0x2C, 0x04, 0x38, 0x04, 0x44, 0x5C, 0x70, 0xFF, 0x0F, 0x26, 0x21, 0x26, 0x31, 0x26, 0x41, + 0x06, 0x51, 0xB9, 0x71, 0x0C, 0x00, 0x6B, 0x37, 0x00, 0x00, 0x14, 0x71, 0xC6, 0x27, 0x82, 0x23, + 0x38, 0x21, 0x04, 0x00, 0x38, 0x71, 0x0C, 0x00, 0x26, 0x22, 0x26, 0x27, 0x04, 0x33, 0x0B, 0x9B, + 0x00, 0x00, 0x08, 0xE0, 0x00, 0xFF, 0x5C, 0x20, 0xFF, 0x0F, 0x2C, 0xE0, 0xFF, 0x0F, 0x57, 0x26, + 0x56, 0xEC, 0x66, 0xE2, 0x30, 0x21, 0x38, 0x71, 0x08, 0x00, 0x26, 0x22, 0x26, 0x27, 0x04, 0x33, + 0x0B, 0x9B, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x10, 0x5C, 0x20, 0xFF, 0x0F, 0x56, 0xE7, 0x66, 0xE2, + 0xB9, 0xED, 0x3C, 0x05, 0x58, 0xC1, 0x10, 0x00, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x0C, 0x60, 0x00, 0x10, 0x98, 0xD6, + 0x07, 0x05, 0x06, 0xC2, 0x06, 0xE3, 0x06, 0xB6, 0x92, 0x40, 0x0C, 0x80, 0x1D, 0x13, 0x06, 0xA6, + 0x0C, 0x90, 0x80, 0x02, 0x18, 0x7B, 0x27, 0x03, 0xC6, 0x7D, 0xC2, 0x03, 0xC4, 0xD2, 0x92, 0x03, + 0x91, 0xDC, 0xF2, 0x56, 0x60, 0x78, 0x0C, 0x30, 0x64, 0x00, 0x34, 0x71, 0x57, 0x72, 0x26, 0x7A, + 0x18, 0x67, 0x81, 0x02, 0x18, 0x77, 0x80, 0x02, 0x26, 0x66, 0x06, 0x56, 0xD7, 0x51, 0x3F, 0x66, + 0x05, 0x00, 0x26, 0x76, 0x23, 0x77, 0x26, 0x77, 0x26, 0x79, 0x70, 0x77, 0x26, 0x77, 0x06, 0x67, + 0x57, 0x61, 0x26, 0x76, 0x06, 0x27, 0xD7, 0x21, 0x36, 0x27, 0x0B, 0x9B, 0x00, 0x00, 0x0C, 0x70, + 0x80, 0x02, 0x26, 0x72, 0xCC, 0x70, 0x09, 0x06, 0xD2, 0x03, 0xB1, 0x7E, 0xF2, 0x09, 0x3C, 0x20, + 0x89, 0x03, 0x04, 0x33, 0x0B, 0x9B, 0x00, 0x00, 0x2C, 0x20, 0x09, 0x06, 0xB1, 0x2E, 0x24, 0xD1, + 0x24, 0xE4, 0x13, 0xDD, 0x24, 0x81, 0xF2, 0xC7, 0x28, 0x26, 0x0C, 0x00, 0x1C, 0x60, 0x91, 0x01, + 0x26, 0x62, 0xCC, 0x60, 0x6B, 0x07, 0xD2, 0x0F, 0x0C, 0xD0, 0xFC, 0x08, 0x3F, 0x22, 0x0D, 0x00, + 0x06, 0x32, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x6C, 0x07, 0x0B, 0x9B, 0x00, 0x00, 0x3F, 0x22, + 0x0D, 0x00, 0xF2, 0x0B, 0xCC, 0x20, 0xFC, 0x08, 0xC2, 0x08, 0x3C, 0x20, 0xFC, 0x08, 0x04, 0x33, + 0x0B, 0x9B, 0x00, 0x00, 0x2C, 0x20, 0xFC, 0x08, 0x04, 0x61, 0x91, 0x6C, 0xB1, 0x2E, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x04, 0x20, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, + 0x64, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x06, 0x01, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, + 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x1C, 0x26, 0x22, + 0xC9, 0xE1, 0x04, 0x00, 0x06, 0xE2, 0xB1, 0x01, 0x57, 0xE1, 0xB1, 0x01, 0x26, 0xE2, 0x30, 0x71, + 0xC6, 0x7E, 0xB2, 0x07, 0x2B, 0x49, 0x00, 0x00, 0x30, 0x71, 0x24, 0x71, 0xB1, 0x71, 0xF2, 0xF8, + 0x48, 0xE1, 0x04, 0x00, 0x24, 0x1C, 0xE1, 0xF0, 0xF7, 0x40, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x07, + 0x2F, 0x67, 0x07, 0x00, 0x26, 0x62, 0xA1, 0x36, 0x24, 0x71, 0xF2, 0xF9, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0x4B, 0xD7, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x2C, 0x60, 0x80, 0x00, 0x2C, 0x70, 0xCC, 0x01, + 0x36, 0x76, 0xC4, 0x70, 0x34, 0x14, 0xB1, 0xF1, 0x32, 0x02, 0x24, 0x73, 0x06, 0x47, 0x08, 0x50, + 0x00, 0x80, 0x67, 0x41, 0x04, 0x70, 0x2C, 0x50, 0x28, 0x7A, 0x14, 0x21, 0xC6, 0x74, 0x04, 0x34, + 0x26, 0x36, 0x32, 0x05, 0x30, 0xF5, 0x24, 0x54, 0xB1, 0xF6, 0xF2, 0x02, 0xB1, 0x26, 0x24, 0x71, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x03, 0x06, 0x63, 0xF2, 0xF2, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x28, 0x60, 0xA8, 0x15, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xC8, 0x32, 0xA9, 0x60, + 0xA8, 0x15, 0x28, 0x60, 0xAA, 0x15, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xC8, 0x32, + 0xA9, 0x60, 0xAA, 0x15, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x50, 0x00, 0x80, 0x34, 0x14, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x50, 0x0C, 0xDC, 0xB1, 0xF1, 0x2C, 0x70, 0x42, 0xDC, 0x0C, 0x60, 0xA0, 0x15, + 0x2C, 0x50, 0x31, 0x00, 0x14, 0x21, 0x10, 0x47, 0xCC, 0x40, 0xFF, 0x00, 0x82, 0x0E, 0x18, 0x37, + 0x05, 0x00, 0xCC, 0x30, 0xFF, 0x00, 0x82, 0x09, 0x26, 0x44, 0x06, 0xF4, 0xD7, 0xF1, 0x3F, 0x44, + 0x0F, 0x00, 0x26, 0x34, 0xA1, 0x36, 0xF2, 0x02, 0xA1, 0x26, 0x34, 0x71, 0xC6, 0x75, 0x34, 0x62, + 0x92, 0xEB, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x00, 0x10, 0x04, 0x30, + 0x0C, 0x40, 0x70, 0x05, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x4B, 0x50, 0x00, 0x00, + 0xEB, 0x2C, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0xF4, 0x01, + 0xB9, 0x60, 0x88, 0x15, 0x99, 0x00, 0xBF, 0x15, 0x14, 0x61, 0x99, 0x60, 0xBE, 0x15, 0xB9, 0x00, + 0x84, 0x15, 0xB9, 0x00, 0x80, 0x15, 0x99, 0x00, 0xBD, 0x15, 0xB9, 0x00, 0x7C, 0x15, 0xB9, 0x00, + 0x78, 0x15, 0x99, 0x00, 0xBC, 0x15, 0x04, 0x63, 0x99, 0x60, 0xBB, 0x15, 0x99, 0x00, 0xB6, 0x15, + 0x99, 0x00, 0xB5, 0x15, 0x04, 0x71, 0x99, 0x70, 0xB4, 0x15, 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, + 0x00, 0xDC, 0x18, 0x46, 0x09, 0x00, 0x99, 0x40, 0xB3, 0x15, 0x99, 0x00, 0xB2, 0x15, 0x99, 0x70, + 0xB1, 0x15, 0x99, 0x00, 0xB0, 0x15, 0x14, 0x51, 0xA9, 0x50, 0xAA, 0x15, 0xA9, 0x50, 0xA8, 0x15, + 0x18, 0x56, 0x0A, 0x00, 0x99, 0x50, 0xAF, 0x15, 0xA9, 0x00, 0xA6, 0x15, 0xA9, 0x00, 0xA4, 0x15, + 0x99, 0x00, 0xAE, 0x15, 0x99, 0x00, 0xAD, 0x15, 0x99, 0x00, 0xAC, 0x15, 0x99, 0x70, 0xBA, 0x15, + 0x99, 0x00, 0xB9, 0x15, 0x99, 0x70, 0xB8, 0x15, 0x99, 0x00, 0xB7, 0x15, 0xB9, 0x00, 0xFC, 0x17, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x4B, 0xBC, 0x00, 0x00, 0x0C, 0x60, 0x15, 0x00, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x04, 0x70, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0xE0, 0x00, 0x00, 0x04, 0x31, 0x0C, 0x20, 0x20, 0x00, 0x2B, 0xDF, + 0x00, 0x00, 0x0C, 0x20, 0xFF, 0x00, 0xEB, 0xDC, 0x00, 0x00, 0x04, 0x24, 0x04, 0x31, 0xAB, 0xD9, + 0x00, 0x00, 0x04, 0x21, 0xCB, 0xD5, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x0B, 0xD8, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xE4, 0x00, 0x00, 0x0B, 0xD5, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xCB, 0xE1, + 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x4B, 0xE1, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xC0, 0x88, 0x15, 0x08, 0xE0, 0x00, 0x40, 0x0C, 0x20, + 0x40, 0x00, 0x38, 0xDE, 0x54, 0x10, 0x0B, 0xDB, 0x00, 0x00, 0x06, 0x3C, 0x0C, 0x20, 0xFF, 0xFF, + 0x04, 0x4A, 0x4B, 0x12, 0x00, 0x00, 0x04, 0x28, 0xB9, 0xDE, 0x54, 0x10, 0x04, 0x30, 0x0B, 0xE6, + 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x4B, 0xE2, 0x00, 0x00, 0x04, 0x25, 0x04, 0x31, 0x0B, 0xE6, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x00, 0x01, 0xB1, 0xF1, 0x0B, 0xDB, 0x00, 0x00, + 0x0C, 0x20, 0x80, 0x00, 0x0B, 0xDB, 0x00, 0x00, 0x04, 0x20, 0x06, 0x52, 0x0C, 0x30, 0x27, 0x00, + 0x0C, 0x40, 0xFF, 0xFF, 0x0C, 0x60, 0x01, 0x02, 0x2B, 0xEE, 0x00, 0x00, 0x04, 0x21, 0x0C, 0x30, + 0x8F, 0x01, 0x0C, 0x40, 0xFF, 0xFF, 0x04, 0x50, 0x0C, 0x60, 0x01, 0x02, 0x2B, 0xEE, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0x6B, 0xE5, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x09, + 0x0C, 0x20, 0x00, 0x60, 0x0B, 0xDB, 0x00, 0x00, 0x04, 0x21, 0x6B, 0xB5, 0x00, 0x00, 0xF2, 0x07, + 0x6B, 0xB5, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x60, 0xEB, 0xDB, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0x60, 0x00, 0x40, 0x38, 0xE6, + 0x70, 0x60, 0x06, 0x72, 0x23, 0xEE, 0xCC, 0xE0, 0x00, 0xC9, 0x06, 0xC3, 0xC2, 0x05, 0x08, 0x60, + 0x04, 0x00, 0x66, 0xE6, 0xF7, 0xE1, 0x06, 0x37, 0x06, 0x2E, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0xA0, 0x0F, 0x0B, 0x9B, 0x00, 0x00, 0x24, 0x25, 0x04, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0x08, 0x70, + 0x00, 0x40, 0x38, 0x77, 0xCC, 0x71, 0x06, 0xD2, 0x77, 0x7C, 0x24, 0x72, 0xC6, 0x27, 0xB2, 0x02, + 0x06, 0xD7, 0xC4, 0xC0, 0x82, 0x18, 0x06, 0x7E, 0xD7, 0x71, 0x2F, 0x2E, 0x0E, 0x00, 0x26, 0x27, + 0x06, 0x3D, 0x0B, 0x9B, 0x00, 0x00, 0x3C, 0xE0, 0xB0, 0x9A, 0xCC, 0xE0, 0x20, 0x03, 0x04, 0x71, + 0xD2, 0x02, 0x04, 0x70, 0xD7, 0x7F, 0x66, 0x72, 0x0C, 0x60, 0x00, 0x00, 0xB9, 0x76, 0x3C, 0x00, + 0x8B, 0x36, 0x00, 0x00, 0x06, 0x2D, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x38, 0xE7, 0x04, 0x00, 0x18, 0x27, + 0x05, 0x00, 0x04, 0x30, 0x0C, 0xC0, 0xFF, 0x00, 0x2B, 0x63, 0x00, 0x00, 0x56, 0xCE, 0x06, 0xD2, + 0x04, 0x30, 0x06, 0x2C, 0x2B, 0x63, 0x00, 0x00, 0x08, 0x70, 0xFF, 0xFF, 0x56, 0x7E, 0x57, 0xD4, + 0x66, 0x72, 0x66, 0x7D, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x6C, 0x72, 0x50, 0xC1, 0x2C, 0x10, + 0x10, 0x00, 0xE1, 0xF0, 0x38, 0x70, 0x94, 0x15, 0x34, 0x14, 0xB1, 0xF1, 0x18, 0x27, 0x08, 0x00, + 0x04, 0x31, 0x2B, 0x63, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x18, 0x70, 0x8B, 0x67, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x28, 0x20, 0xA6, 0x15, 0x34, 0x18, 0xD4, 0x21, + 0xC1, 0xE1, 0x82, 0x0A, 0x04, 0x21, 0x2B, 0x15, 0x03, 0x00, 0x18, 0x60, 0xBB, 0x15, 0x1C, 0x70, + 0x80, 0x00, 0x66, 0x76, 0xF2, 0x07, 0x2B, 0x15, 0x03, 0x00, 0x18, 0x70, 0xBB, 0x15, 0x5C, 0x70, + 0x7F, 0x00, 0x99, 0x70, 0xBB, 0x15, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, + 0xB1, 0xF1, 0x2B, 0xE4, 0x00, 0x00, 0x98, 0x70, 0xAC, 0x15, 0x82, 0x25, 0x5C, 0x70, 0xF0, 0x00, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x0A, 0xCC, 0x70, 0xC0, 0x00, 0x82, 0x1A, 0xCC, 0x70, 0x40, 0x00, + 0x92, 0x1A, 0x99, 0x00, 0xB3, 0x15, 0xF2, 0x17, 0x04, 0x71, 0x99, 0x70, 0xAE, 0x15, 0x99, 0x70, + 0xB0, 0x15, 0x99, 0x00, 0xB1, 0x15, 0x04, 0x20, 0x99, 0x00, 0xAD, 0x15, 0x2B, 0x15, 0x03, 0x00, + 0x18, 0x60, 0xBB, 0x15, 0x5C, 0x60, 0x7F, 0x00, 0x99, 0x60, 0xBB, 0x15, 0xF2, 0x04, 0x04, 0x61, + 0x99, 0x60, 0xAE, 0x15, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, + 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, 0x00, 0x80, 0x2C, 0x40, 0x6C, 0x03, + 0x3C, 0x10, 0x10, 0x00, 0x36, 0x42, 0x2C, 0x30, 0x74, 0x7B, 0xD1, 0xC1, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x30, 0x00, 0xFC, 0x04, 0x20, 0x0C, 0xF0, 0x10, 0x03, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x00, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x2E, 0x18, 0x00, 0x2C, 0x30, 0x00, 0xF0, 0x04, 0x20, + 0x0C, 0xF0, 0x10, 0x03, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x38, 0xC7, 0xD0, 0xFB, 0xB9, 0x2E, + 0x14, 0x00, 0x06, 0xD2, 0xCC, 0xC0, 0xFF, 0x00, 0x82, 0x1B, 0xC6, 0xC2, 0x82, 0x19, 0xEB, 0x14, + 0x00, 0x00, 0x08, 0x60, 0x1C, 0xE1, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x60, 0x01, 0xE9, 0xB9, 0x67, + 0x04, 0x01, 0xB9, 0xC7, 0x08, 0x01, 0xB9, 0xD7, 0x0C, 0x01, 0x38, 0x6E, 0x18, 0x00, 0xB9, 0x67, + 0x10, 0x01, 0x0B, 0xE5, 0x00, 0x00, 0x04, 0x2A, 0xEB, 0x49, 0x00, 0x00, 0xF2, 0xFB, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x60, 0xB8, 0x15, 0x34, 0x18, 0xC1, 0xE1, + 0x82, 0x09, 0x34, 0x61, 0x93, 0x66, 0x99, 0x60, 0xB8, 0x15, 0x92, 0x3B, 0x99, 0x00, 0xBA, 0x15, + 0xF2, 0x38, 0xDC, 0x20, 0x80, 0x00, 0x0C, 0xE0, 0x50, 0x00, 0x82, 0x03, 0x0C, 0xE0, 0x35, 0x00, + 0xEB, 0xBA, 0x00, 0x00, 0xC6, 0x2E, 0xA2, 0x0A, 0x38, 0x50, 0x80, 0x15, 0x18, 0x60, 0xB9, 0x15, + 0x34, 0x53, 0xC6, 0x65, 0xB2, 0x17, 0x24, 0x61, 0xF2, 0x13, 0x98, 0x60, 0xB9, 0x15, 0x82, 0x12, + 0x98, 0x50, 0xBF, 0x15, 0x82, 0x04, 0xB8, 0x50, 0x84, 0x15, 0x92, 0x0C, 0x34, 0xE4, 0xC6, 0x2E, + 0xD2, 0x09, 0x18, 0x50, 0xB7, 0x15, 0xCC, 0x50, 0x30, 0x00, 0xD2, 0x04, 0x34, 0x61, 0x99, 0x60, + 0xB9, 0x15, 0x98, 0x50, 0xBA, 0x15, 0x18, 0x70, 0xB9, 0x15, 0x92, 0x07, 0xC4, 0x74, 0xC2, 0x09, + 0x04, 0x71, 0x99, 0x70, 0xBA, 0x15, 0xF2, 0x05, 0xC4, 0x72, 0xD2, 0x03, 0x99, 0x00, 0xBA, 0x15, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x6B, 0xD1, + 0x00, 0x00, 0x06, 0x2E, 0xCB, 0xCB, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x04, 0x20, 0x34, 0x14, 0x06, 0x32, 0xB1, 0xF1, 0x6B, 0x1C, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x18, 0x20, 0xBB, 0x15, 0x5C, 0x20, + 0xF0, 0x00, 0x64, 0x23, 0x99, 0x20, 0xBB, 0x15, 0x4B, 0xC1, 0x00, 0x00, 0x4B, 0xB9, 0x00, 0x00, + 0xC4, 0xE0, 0x92, 0x06, 0xCB, 0xB8, 0x00, 0x00, 0x04, 0x24, 0x4B, 0xF9, 0x00, 0x00, 0xAB, 0x24, + 0x01, 0x00, 0xCB, 0xB9, 0x00, 0x00, 0x40, 0xE1, 0x04, 0x61, 0x99, 0x60, 0xBC, 0x15, 0x24, 0x18, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x0C, 0x60, 0x00, 0x10, 0xA8, 0x76, 0x24, 0x00, + 0x82, 0x05, 0x34, 0x71, 0xA9, 0x76, 0x24, 0x00, 0xF2, 0x30, 0x18, 0x60, 0xBF, 0x15, 0x18, 0x70, + 0xBE, 0x15, 0xC6, 0x76, 0x92, 0x2A, 0xC4, 0x70, 0x82, 0x04, 0x28, 0x70, 0xA8, 0x15, 0xF2, 0x03, + 0x28, 0x70, 0xAA, 0x15, 0xC6, 0x72, 0xC2, 0x21, 0x36, 0x72, 0x06, 0x27, 0x57, 0x23, 0x57, 0x74, + 0x26, 0x27, 0x0C, 0x30, 0x10, 0x27, 0x0B, 0x9B, 0x00, 0x00, 0xC4, 0x2A, 0xC2, 0x16, 0xAB, 0xE2, + 0x00, 0x00, 0x0B, 0xE3, 0x00, 0x00, 0x98, 0x70, 0xAF, 0x15, 0x82, 0x04, 0xAB, 0xD5, 0x00, 0x00, + 0xF2, 0x08, 0x18, 0x70, 0xC1, 0x15, 0x93, 0x07, 0x92, 0x04, 0x2B, 0x49, 0x00, 0x00, 0xF2, 0xFA, + 0x99, 0x00, 0xC1, 0x15, 0x8B, 0xE3, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x18, 0x70, 0xAD, 0x15, 0x0C, 0x60, 0x96, 0x00, 0xC4, 0x70, 0x92, 0x05, 0x38, 0x70, 0x94, 0x15, + 0x28, 0x67, 0x1E, 0x00, 0x0C, 0x70, 0x00, 0x10, 0x28, 0x57, 0x6A, 0x01, 0x26, 0x65, 0x28, 0x57, + 0x0C, 0x00, 0xC6, 0x65, 0x02, 0x17, 0x98, 0x57, 0x28, 0x03, 0x92, 0x14, 0x28, 0x57, 0x06, 0x00, + 0xDC, 0x50, 0xE0, 0x06, 0x92, 0x0F, 0x38, 0x70, 0x7C, 0x15, 0x04, 0x21, 0x24, 0x71, 0xB9, 0x70, + 0x7C, 0x15, 0x38, 0x60, 0x94, 0x15, 0x18, 0x66, 0x20, 0x00, 0xC6, 0x76, 0xD2, 0x06, 0x06, 0x25, + 0xF2, 0x04, 0xB9, 0x00, 0x7C, 0x15, 0x04, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x18, 0x70, 0xBF, 0x15, 0x18, 0x50, 0xBE, 0x15, 0xC6, 0x57, 0x82, 0x3F, 0x99, 0x70, + 0xBE, 0x15, 0xC4, 0x70, 0x18, 0x70, 0xBB, 0x15, 0x1C, 0x60, 0x10, 0x00, 0x56, 0x76, 0x82, 0x1C, + 0x64, 0x72, 0x99, 0x70, 0xBB, 0x15, 0x8B, 0x2F, 0x01, 0x00, 0xB9, 0x00, 0x84, 0x15, 0xB9, 0x00, + 0x7C, 0x15, 0x38, 0x70, 0x94, 0x15, 0x18, 0x27, 0x41, 0x00, 0x18, 0x37, 0x78, 0x00, 0x18, 0x47, + 0x77, 0x00, 0x18, 0x57, 0x58, 0x00, 0x18, 0x67, 0x20, 0x00, 0x0C, 0xF0, 0xA8, 0x00, 0xF1, 0xF0, + 0xB9, 0x20, 0x80, 0x15, 0xF2, 0x0C, 0x64, 0x71, 0x99, 0x70, 0xBB, 0x15, 0xCB, 0x30, 0x01, 0x00, + 0x38, 0x70, 0x94, 0x15, 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0x6D, 0x12, 0x98, 0x70, 0xBF, 0x15, + 0x82, 0x05, 0x0C, 0xF0, 0x68, 0x01, 0xF1, 0xF0, 0xF2, 0x05, 0x18, 0x20, 0xBB, 0x15, 0x2B, 0xCF, + 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0xCB, 0x78, 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0x4B, 0x74, + 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0x4B, 0xC1, 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0x2B, 0xCF, + 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x98, 0x70, 0xBF, 0x15, 0x06, 0xDE, 0x82, 0x53, 0x04, 0x63, 0x99, 0x60, 0xBC, 0x15, + 0x0B, 0x80, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x07, 0x4B, 0xB9, 0x00, 0x00, 0x0C, 0xF0, 0x68, 0x01, + 0xF1, 0xF0, 0xF2, 0x03, 0xCB, 0xB9, 0x00, 0x00, 0x0C, 0xF0, 0x8C, 0x01, 0xF1, 0xF0, 0x04, 0x21, + 0x0B, 0xB8, 0x00, 0x00, 0xCB, 0x39, 0x01, 0x00, 0x06, 0xE2, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, + 0x04, 0x28, 0x0B, 0xB8, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0B, 0xB7, 0x00, 0x00, 0xC4, 0xE0, + 0x82, 0x03, 0x2B, 0x3D, 0x01, 0x00, 0x98, 0x70, 0x05, 0x10, 0x82, 0x06, 0xB9, 0x00, 0x84, 0x15, + 0xB9, 0x00, 0x78, 0x15, 0xF2, 0x06, 0x38, 0x70, 0x84, 0x15, 0x24, 0x71, 0xB9, 0x70, 0x84, 0x15, + 0xEB, 0x28, 0x01, 0x00, 0x38, 0x70, 0x80, 0x15, 0x38, 0x60, 0x84, 0x15, 0x24, 0x73, 0xC6, 0x67, + 0xA2, 0x05, 0x99, 0x00, 0xBF, 0x15, 0x99, 0x00, 0xB7, 0x15, 0x98, 0x60, 0xBD, 0x15, 0x82, 0x35, + 0x04, 0x20, 0x99, 0x00, 0xBD, 0x15, 0x99, 0x00, 0xBF, 0x15, 0xAB, 0xF0, 0x00, 0x00, 0x28, 0x20, + 0x88, 0x15, 0x6B, 0x14, 0x00, 0x00, 0x04, 0x21, 0x2B, 0x7A, 0x00, 0x00, 0xF2, 0x26, 0x04, 0x62, + 0x99, 0x60, 0xBC, 0x15, 0x4B, 0xB9, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, + 0x0B, 0xB7, 0x00, 0x00, 0x04, 0x28, 0x0B, 0xB8, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0B, 0xB7, + 0x00, 0x00, 0xEB, 0x28, 0x01, 0x00, 0xAB, 0xD4, 0x02, 0x00, 0xC4, 0x20, 0x82, 0x0C, 0x18, 0x70, + 0xAC, 0x15, 0x5C, 0x70, 0xF0, 0x00, 0xCC, 0x70, 0x40, 0x00, 0x82, 0x07, 0x04, 0x71, 0x99, 0x70, + 0xBF, 0x15, 0xF2, 0x03, 0x8B, 0x79, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x34, 0x14, 0xB1, 0xF1, 0xCB, 0x32, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x03, 0x0B, 0xE5, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0xEB, 0xEF, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0x04, 0x20, 0xC1, 0xE1, 0x6B, 0xF1, + 0x00, 0x00, 0x06, 0xE2, 0x04, 0x20, 0xAB, 0xF0, 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0x14, 0x00, 0x00, 0x08, 0x70, 0x1C, 0xE1, + 0x08, 0x60, 0x00, 0x30, 0x2C, 0x70, 0x04, 0xE9, 0xB9, 0x76, 0x04, 0x01, 0xB9, 0x76, 0x08, 0x01, + 0x0B, 0xE5, 0x00, 0x00, 0x04, 0x2A, 0xEB, 0x49, 0x00, 0x00, 0xF2, 0xFB, 0x34, 0x14, 0xB1, 0xF1, + 0x4B, 0x16, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x05, 0x38, 0x20, 0x74, 0x15, 0xCB, 0x17, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0x04, 0x21, 0xC1, 0xE1, 0xEB, 0xEF, + 0x00, 0x00, 0x08, 0xE0, 0x07, 0x00, 0x2C, 0xE0, 0x20, 0xA1, 0xEB, 0x93, 0x00, 0x00, 0x98, 0x70, + 0xB6, 0x15, 0x92, 0x1B, 0x04, 0x21, 0x6B, 0xF1, 0x00, 0x00, 0x26, 0x22, 0x06, 0x72, 0x57, 0x71, + 0x26, 0x27, 0xC6, 0x2E, 0xC2, 0xF3, 0x08, 0x70, 0x00, 0x80, 0x38, 0x77, 0xCC, 0xFB, 0xCC, 0x70, + 0xFF, 0x00, 0x82, 0x04, 0x98, 0x70, 0xB5, 0x15, 0x82, 0x08, 0x04, 0x21, 0xAB, 0xF0, 0x00, 0x00, + 0x04, 0x21, 0xEB, 0xEF, 0x00, 0x00, 0xF2, 0xE2, 0x04, 0x21, 0xAB, 0xF0, 0x00, 0x00, 0x40, 0xE1, + 0x24, 0x18, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0xC6, 0x27, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x03, + 0xC6, 0x37, 0x92, 0x04, 0x3B, 0xA2, 0x00, 0x00, 0xF2, 0x0E, 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, + 0xB9, 0x67, 0x00, 0x80, 0xB9, 0x27, 0x04, 0x80, 0xB9, 0x37, 0x08, 0x80, 0xB9, 0x07, 0x0C, 0x80, + 0x38, 0x27, 0x10, 0x80, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x34, 0x14, + 0xB1, 0xF1, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, 0x18, 0x80, 0xB9, 0x47, 0x1C, 0x80, + 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x20, 0x80, 0xF2, 0x05, + 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA3, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x06, 0x72, 0x34, 0x14, 0x06, 0x43, 0x04, 0x21, 0x06, 0x37, 0xB1, 0xF1, 0x6B, 0x99, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD3, + 0xF7, 0xDF, 0xC4, 0xD0, 0x06, 0xE4, 0xF7, 0xEF, 0x82, 0x02, 0x16, 0x33, 0xC4, 0xE0, 0x82, 0x02, + 0x16, 0x44, 0xC4, 0x20, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, 0x18, 0x80, 0xB9, 0x47, + 0x1C, 0x80, 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x20, 0x80, + 0xF2, 0x05, 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA3, 0x00, 0x00, 0xC6, 0xDE, 0x82, 0x02, 0x16, 0x22, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x80, 0xC6, 0x26, 0x34, 0x14, + 0xB1, 0xF1, 0x06, 0x72, 0x06, 0x43, 0x82, 0x04, 0xC6, 0x36, 0x04, 0x21, 0x92, 0x02, 0x04, 0x20, + 0x06, 0x37, 0xCB, 0x9B, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x3C, 0x10, + 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE3, 0x06, 0xD4, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, + 0x18, 0x80, 0xB9, 0x47, 0x1C, 0x80, 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, + 0x38, 0x26, 0x24, 0x80, 0xF2, 0x0A, 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA3, 0x00, 0x00, 0x06, 0x3D, + 0xAB, 0x97, 0x00, 0x00, 0x3F, 0x22, 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x06, 0x72, 0x34, 0x14, 0x06, 0x43, 0x04, 0x21, 0x06, 0x37, 0xB1, 0xF1, 0x6B, 0x9F, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x30, 0x04, 0x40, 0x04, 0x50, 0x0C, 0x60, 0x20, 0x00, + 0x52, 0x03, 0xA6, 0x42, 0x25, 0x50, 0xB4, 0x61, 0x02, 0x06, 0xA6, 0x44, 0x25, 0x55, 0xA6, 0x33, + 0x42, 0xF9, 0xF2, 0xFA, 0x06, 0x24, 0x06, 0x35, 0xE1, 0xF0, 0x04, 0x40, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x9E, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9D, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9C, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x9B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9A, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x99, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x98, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x97, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x96, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x95, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x94, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x93, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x92, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x91, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x90, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8F, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x8E, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8D, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8C, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x8B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8A, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x89, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x88, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x87, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x86, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x85, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x84, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x83, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x82, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x81, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x80, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x7F, 0x00, 0x00, 0xE1, 0xF0, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x62, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x63, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x64, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x65, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x66, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x67, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x68, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x69, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6A, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6B, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6C, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6D, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6E, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6F, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x70, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x71, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x72, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x73, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x74, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x75, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x76, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x77, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x78, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x79, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7A, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7B, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7C, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7D, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7E, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7F, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x80, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, + 0x08, 0x70, 0x00, 0x40, 0xC4, 0x20, 0x38, 0x67, 0x60, 0x71, 0x82, 0x09, 0x08, 0x50, 0x40, 0x00, + 0x66, 0x65, 0xB9, 0x67, 0x60, 0x71, 0x2B, 0x49, 0x00, 0x00, 0xF2, 0x08, 0x08, 0x50, 0xBF, 0xFF, + 0x2C, 0x50, 0xFF, 0xFF, 0x56, 0x65, 0xB9, 0x67, 0x60, 0x71, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x70, 0xD6, 0x72, 0x82, 0xFD, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x8B, 0xB7, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0xE7, + 0x00, 0x70, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x64, 0x72, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x64, 0x71, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, + 0x38, 0x27, 0xE0, 0x70, 0x5C, 0x20, 0xFF, 0x7F, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, + 0x38, 0x27, 0x5C, 0x70, 0x5C, 0x20, 0x7F, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x08, 0x60, + 0x00, 0x40, 0x82, 0x08, 0x08, 0x70, 0x0F, 0xC0, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x76, 0x3C, 0x71, + 0xF2, 0x03, 0xB9, 0x06, 0x3C, 0x71, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0x20, + 0x08, 0x70, 0x08, 0xD0, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2D, 0x2C, 0x30, 0x08, 0xE2, + 0x0C, 0x40, 0xF8, 0x02, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x40, 0x08, 0xE0, + 0x00, 0x30, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0xE5, 0x0C, 0x40, 0x00, 0x09, + 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xC4, 0x52, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, + 0x2C, 0x30, 0x00, 0xEE, 0x0C, 0x40, 0x50, 0x01, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x08, 0x70, + 0x0F, 0xC0, 0x2C, 0x70, 0xFF, 0xFF, 0x0C, 0x20, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x7D, + 0x3C, 0x71, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0xF0, 0x0C, 0x40, 0x00, 0x09, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x49, 0x08, 0x30, 0x08, 0x07, 0xB9, 0x0D, 0x3C, 0x71, 0x26, 0x2E, + 0x2C, 0x30, 0x08, 0x07, 0x0C, 0x40, 0x00, 0x09, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x23, 0x82, 0x77, 0xC4, 0x23, 0x08, 0x70, + 0x00, 0x40, 0xD2, 0x07, 0xC4, 0x21, 0x82, 0x1C, 0xC4, 0x22, 0x82, 0x2D, 0xFA, 0x89, 0x00, 0x00, + 0xCC, 0x20, 0x81, 0x00, 0x82, 0x1E, 0xCC, 0x20, 0x82, 0x00, 0x82, 0x3D, 0xC4, 0x28, 0x9A, 0x80, + 0x00, 0x00, 0x0C, 0x50, 0x40, 0x40, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, + 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, 0x63, 0x07, 0xB9, 0x57, 0x54, 0x70, 0xF2, 0x6B, 0x08, 0x50, + 0x14, 0x00, 0x2C, 0x50, 0x60, 0x40, 0xB9, 0x57, 0x34, 0x70, 0xB9, 0x27, 0x64, 0x70, 0xF2, 0x1E, + 0x08, 0x50, 0x12, 0x00, 0x2C, 0x50, 0x40, 0x20, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x52, 0xB9, 0x57, + 0x64, 0x70, 0xF2, 0x38, 0x98, 0x50, 0xBA, 0x15, 0x82, 0x06, 0x08, 0x50, 0x12, 0x00, 0x2C, 0x50, + 0x60, 0x4A, 0xF2, 0x05, 0x08, 0x50, 0x14, 0x00, 0x2C, 0x50, 0x60, 0x40, 0xB9, 0x57, 0x34, 0x70, + 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x70, 0x00, 0x40, 0x08, 0x50, 0x05, 0x00, 0x2C, 0x50, + 0x61, 0x07, 0xF2, 0x24, 0x98, 0x50, 0xBA, 0x15, 0x82, 0x12, 0x28, 0x40, 0x22, 0x10, 0x08, 0x50, + 0x12, 0x00, 0xC4, 0x49, 0xC2, 0x04, 0x2C, 0x50, 0x45, 0x38, 0xF2, 0x0D, 0xC4, 0x45, 0xC2, 0x04, + 0x2C, 0x50, 0x42, 0x38, 0xF2, 0x08, 0x2C, 0x50, 0x40, 0x38, 0xF2, 0x05, 0x08, 0x50, 0x12, 0x00, + 0x2C, 0x50, 0x40, 0x20, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x52, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, 0x61, 0x57, 0xB9, 0x57, 0x54, 0x70, 0x08, 0x50, + 0x80, 0x0F, 0x2C, 0x50, 0x80, 0x0F, 0xF2, 0x14, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x50, 0x26, 0x26, + 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, + 0x63, 0x07, 0xB9, 0x57, 0x54, 0x70, 0x08, 0x50, 0x00, 0x0E, 0x2C, 0x50, 0x00, 0x0E, 0xB9, 0x57, + 0x6C, 0x70, 0x08, 0x50, 0xF0, 0x07, 0x2C, 0x50, 0x66, 0x7F, 0xB9, 0x57, 0x1C, 0x71, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x96, 0x00, 0xB9, 0x57, 0x30, 0x70, 0x98, 0x70, 0xBA, 0x15, 0x08, 0x60, + 0x00, 0x40, 0x82, 0x04, 0x0C, 0x70, 0xFF, 0x3F, 0xF2, 0x05, 0x08, 0x70, 0x01, 0x00, 0x2C, 0x70, + 0xFF, 0x3F, 0xB9, 0x76, 0x58, 0x70, 0xE1, 0xF0, 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x60, + 0x8C, 0x15, 0xF2, 0x03, 0x38, 0x60, 0x90, 0x15, 0x38, 0x56, 0x08, 0x00, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x57, 0xB4, 0x70, 0x38, 0x56, 0x0C, 0x00, 0x08, 0x40, 0xDF, 0xFF, 0xB9, 0x57, 0xB8, 0x70, + 0x38, 0x56, 0x10, 0x00, 0x2C, 0x40, 0xFF, 0xFF, 0x56, 0x54, 0xB9, 0x57, 0xC0, 0x70, 0x38, 0x56, + 0x14, 0x00, 0xB9, 0x57, 0xC4, 0x70, 0x98, 0x50, 0xAD, 0x15, 0x82, 0x0C, 0x08, 0x60, 0x01, 0x00, + 0x2C, 0x60, 0x81, 0x11, 0xB9, 0x67, 0xAC, 0x70, 0x08, 0x60, 0x10, 0x00, 0x2C, 0x60, 0x10, 0x00, + 0xF2, 0x06, 0x30, 0x56, 0xB9, 0x57, 0xAC, 0x70, 0x38, 0x66, 0x04, 0x00, 0xB9, 0x67, 0xB0, 0x70, + 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x70, 0x8C, 0x15, 0xF2, 0x03, + 0x38, 0x70, 0x90, 0x15, 0x18, 0x60, 0x28, 0x13, 0xC4, 0x62, 0xC2, 0x04, 0x38, 0x57, 0x20, 0x00, + 0xF2, 0x08, 0xC4, 0x62, 0x92, 0x04, 0x38, 0x57, 0x1C, 0x00, 0xF2, 0x03, 0x38, 0x57, 0x18, 0x00, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0xC8, 0x70, 0x38, 0x57, 0x24, 0x00, 0xB9, 0x56, 0xCC, 0x70, + 0x38, 0x77, 0x28, 0x00, 0xB9, 0x76, 0xD4, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, + 0x92, 0x04, 0x38, 0x70, 0x8C, 0x15, 0xF2, 0x03, 0x38, 0x70, 0x90, 0x15, 0x38, 0x57, 0x2C, 0x00, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0x8C, 0x70, 0x38, 0x57, 0x30, 0x00, 0xB9, 0x56, 0x90, 0x70, + 0x38, 0x57, 0x34, 0x00, 0xB9, 0x56, 0x94, 0x70, 0x38, 0x57, 0x38, 0x00, 0xB9, 0x56, 0x98, 0x70, + 0x38, 0x57, 0x3C, 0x00, 0xB9, 0x56, 0x9C, 0x70, 0x38, 0x57, 0x40, 0x00, 0xB9, 0x56, 0xA0, 0x70, + 0x38, 0x57, 0x44, 0x00, 0xB9, 0x56, 0xA4, 0x70, 0x38, 0x77, 0x48, 0x00, 0xB9, 0x76, 0xA8, 0x70, + 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0x00, 0xDE, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x10, 0x60, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x10, 0x60, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0xFE, 0x00, 0xB9, 0x67, 0x0C, 0x20, 0xB9, 0x07, 0x18, 0x20, + 0xE1, 0xF0, 0x00, 0x00, 0x51, 0x00, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, 0xC4, 0x20, 0x38, 0x67, + 0x34, 0x10, 0x82, 0x03, 0x64, 0x63, 0xF2, 0x03, 0x14, 0x54, 0x56, 0x65, 0xB9, 0x67, 0x34, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x2C, 0x70, 0x8C, 0x03, 0x08, 0x60, 0x00, 0x40, + 0xB9, 0x76, 0x00, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x08, 0x60, 0x00, 0x40, + 0x2C, 0x70, 0x8C, 0x03, 0xB9, 0x76, 0x00, 0x10, 0xB9, 0x26, 0x6C, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x0C, 0x50, 0x10, 0x00, 0xB9, 0x57, 0x20, 0x10, 0x08, 0x50, 0x38, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x2C, 0x50, 0x80, 0x88, 0xB9, 0x57, 0x24, 0x10, 0xB9, 0x67, 0x00, 0x10, 0xB9, 0x07, 0x28, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0xC4, 0x30, 0x38, 0x67, 0x50, 0x10, 0x82, 0x05, 0x66, 0x62, 0xB9, 0x67, + 0x50, 0x10, 0xF2, 0x05, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x50, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x38, 0x67, 0x54, 0x10, 0x66, 0x62, 0xB9, 0x67, 0x54, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0xAD, 0xDE, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x54, 0x10, + 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x54, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x57, 0x58, 0x10, + 0xCC, 0x20, 0xFF, 0x00, 0x1C, 0x40, 0x00, 0x01, 0x56, 0x54, 0x92, 0x0A, 0xB9, 0x57, 0x58, 0x10, + 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, 0x14, 0x52, 0x56, 0x65, 0xF2, 0x09, 0x66, 0x52, + 0xB9, 0x57, 0x58, 0x10, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, 0x64, 0x61, 0xB9, 0x67, + 0x4C, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0xC4, 0x30, 0x38, 0x67, 0x4C, 0x10, 0x82, 0x05, 0x66, 0x62, 0xB9, 0x67, + 0x4C, 0x10, 0xF2, 0x05, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x4C, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0xAD, 0xDE, 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x8C, 0x03, 0xB9, 0x76, 0x00, 0x10, + 0x04, 0x73, 0xB9, 0x76, 0x44, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x10, + 0x66, 0x72, 0xB9, 0x76, 0x08, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x64, 0x10, + 0x66, 0x72, 0xB9, 0x76, 0x64, 0x10, 0xE1, 0xF0, 0x04, 0x62, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, + 0x14, 0x10, 0xE1, 0xF0, 0x23, 0x22, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x10, 0x10, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x14, 0x10, 0x64, 0x71, 0xB9, 0x76, 0x14, 0x10, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x14, 0x10, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x14, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x0C, 0x70, 0x10, 0x00, 0x82, 0x03, 0x0C, 0x70, 0xA0, 0x00, + 0x6C, 0x70, 0x00, 0x01, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x74, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x70, 0x10, 0xE1, 0xF0, 0xC4, 0x20, 0x08, 0x70, + 0x00, 0x40, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x30, 0x57, 0x21, 0x08, 0x70, 0x00, 0x40, 0x26, 0x72, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, + 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, + 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x62, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x10, 0x30, + 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x61, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x40, 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, + 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, + 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x50, + 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, + 0x3C, 0x10, 0x24, 0x00, 0xD9, 0x41, 0x08, 0x00, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x1C, 0x00, + 0x04, 0x61, 0xB9, 0xF1, 0x18, 0x00, 0xC1, 0x21, 0x99, 0x60, 0xC1, 0x15, 0x6B, 0x48, 0x00, 0x00, + 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x78, 0x10, 0x48, 0x61, 0x1C, 0x00, 0x38, 0xF1, + 0x18, 0x00, 0x40, 0x21, 0x11, 0x16, 0x11, 0x07, 0x58, 0x41, 0x08, 0x00, 0x2C, 0x10, 0x24, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, + 0x08, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0x04, 0x61, + 0x99, 0x60, 0xC0, 0x15, 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, + 0x10, 0x00, 0x61, 0x00, 0x08, 0x70, 0x04, 0x00, 0x24, 0x74, 0x26, 0x27, 0x08, 0x70, 0xFF, 0xBF, + 0x57, 0x26, 0x2C, 0x70, 0x00, 0xC0, 0xB1, 0x42, 0x26, 0x27, 0x0C, 0x40, 0x04, 0x40, 0x08, 0x70, + 0x00, 0x40, 0x26, 0x47, 0x26, 0x42, 0xB1, 0x34, 0x0C, 0x40, 0x10, 0x40, 0x26, 0x47, 0x26, 0x42, + 0x2C, 0x70, 0x08, 0x40, 0xB1, 0x54, 0x26, 0x27, 0xB1, 0x62, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, + 0x2C, 0x70, 0x08, 0x40, 0x57, 0x26, 0x26, 0x27, 0x30, 0x72, 0x6C, 0x70, 0x00, 0x01, 0xB1, 0x72, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x70, 0x08, 0x40, 0x57, 0x26, 0x26, 0x27, + 0x30, 0x72, 0x1C, 0x60, 0x01, 0x01, 0x56, 0x76, 0xB1, 0x72, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, + 0x57, 0x26, 0x2C, 0x70, 0x0C, 0x40, 0x26, 0x72, 0x30, 0x27, 0xE1, 0xF0, 0x06, 0x52, 0x2F, 0x62, + 0x02, 0x00, 0x57, 0x52, 0x3F, 0x66, 0x05, 0x00, 0xC4, 0x3B, 0x26, 0x63, 0xB1, 0x64, 0x06, 0x72, + 0xC2, 0x0F, 0x06, 0x57, 0x0C, 0x50, 0x98, 0x15, 0x28, 0x55, 0x02, 0x00, 0x04, 0x20, 0xC6, 0x65, + 0x92, 0x03, 0x0C, 0x20, 0x08, 0x07, 0x28, 0x70, 0x98, 0x15, 0xC6, 0x67, 0xF2, 0x0C, 0xCC, 0x70, + 0x13, 0x00, 0x0C, 0x20, 0x08, 0x07, 0xC2, 0x0A, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x07, 0xCC, 0x70, + 0xFF, 0x00, 0x04, 0x20, 0x92, 0x03, 0x0C, 0x20, 0x08, 0x07, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x06, 0xC2, 0x06, 0xE4, 0x04, 0x21, 0x06, 0xD3, 0x6B, 0xBB, 0x00, 0x00, 0x08, 0x70, + 0x00, 0x30, 0x2C, 0x70, 0x00, 0x40, 0x57, 0xC1, 0x2F, 0x27, 0x0C, 0x00, 0x30, 0x62, 0xC4, 0xE0, + 0x0C, 0x70, 0xFF, 0x03, 0x56, 0x76, 0x77, 0x65, 0x82, 0x09, 0xC4, 0xD0, 0x82, 0x04, 0x26, 0x7E, + 0x26, 0x6E, 0xF2, 0x11, 0x36, 0x6E, 0x36, 0x7E, 0xF2, 0x0E, 0xC4, 0xD0, 0x82, 0x07, 0xC6, 0x67, + 0x02, 0x03, 0x24, 0x71, 0xF2, 0x08, 0x24, 0x61, 0xF2, 0x06, 0xC6, 0x67, 0x02, 0x03, 0x34, 0x61, + 0xF2, 0x02, 0x34, 0x71, 0xC4, 0x70, 0x02, 0x09, 0xCC, 0x70, 0xFF, 0x03, 0x04, 0xE0, 0x02, 0x07, + 0x14, 0xE1, 0x0C, 0x70, 0xFF, 0x03, 0xF2, 0x03, 0x14, 0xE1, 0x04, 0x71, 0xC4, 0x60, 0x02, 0x08, + 0xCC, 0x60, 0xFF, 0x03, 0x02, 0x07, 0x14, 0xE1, 0x0C, 0x60, 0xFF, 0x03, 0xF2, 0x03, 0x14, 0xE1, + 0x04, 0x61, 0x57, 0x65, 0x66, 0x67, 0xB1, 0x62, 0x04, 0x20, 0x6B, 0xBB, 0x00, 0x00, 0x06, 0x2E, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x1C, 0x09, 0x23, 0x32, 0x0C, 0x40, + 0x80, 0x04, 0x06, 0x21, 0xD9, 0xC1, 0x0C, 0x09, 0xC9, 0xA1, 0x04, 0x09, 0x4B, 0x4B, 0x00, 0x00, + 0x0C, 0x20, 0xC0, 0x06, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x04, 0x26, 0x21, 0x04, 0x31, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x04, 0x21, 0x08, 0xB0, 0x00, 0x30, 0x0B, 0xB8, 0x00, 0x00, 0x0C, 0xC0, + 0x22, 0x00, 0x2C, 0xB0, 0x00, 0x49, 0x04, 0x21, 0x04, 0xD0, 0x0B, 0xB7, 0x00, 0x00, 0x06, 0xED, + 0x04, 0xA0, 0x0C, 0x40, 0x00, 0x09, 0x06, 0x2D, 0x06, 0x3A, 0x26, 0x41, 0xEB, 0xF1, 0x00, 0x00, + 0x86, 0x62, 0x82, 0x5E, 0x38, 0x21, 0x00, 0x09, 0x06, 0x72, 0x57, 0x71, 0x26, 0x7B, 0x30, 0x77, + 0x5C, 0x70, 0xFF, 0x0F, 0x36, 0x76, 0x0C, 0x60, 0xC0, 0x06, 0x26, 0x61, 0x26, 0x62, 0x90, 0x46, + 0x82, 0x04, 0xCC, 0x70, 0x46, 0x00, 0x02, 0x4B, 0x0C, 0x50, 0x80, 0x04, 0x26, 0x51, 0x26, 0x52, + 0x10, 0x65, 0xC4, 0x61, 0x2F, 0x62, 0x02, 0x00, 0x92, 0x07, 0xC4, 0x70, 0x22, 0x27, 0xC4, 0x70, + 0x91, 0x05, 0x92, 0x11, 0xF2, 0x23, 0xC4, 0x70, 0x12, 0x0E, 0x04, 0x31, 0x91, 0x35, 0x2F, 0x56, + 0x01, 0x00, 0xA0, 0x55, 0x92, 0x1B, 0x0C, 0x50, 0xC0, 0x06, 0x26, 0x51, 0x24, 0x41, 0x26, 0x52, + 0x91, 0x45, 0xF2, 0x14, 0x2F, 0x56, 0x01, 0x00, 0x20, 0x55, 0x26, 0x55, 0x06, 0x45, 0x57, 0x41, + 0x26, 0x54, 0x06, 0x45, 0xD7, 0x41, 0x3F, 0x55, 0x04, 0x00, 0xC6, 0x75, 0x32, 0x07, 0x2F, 0x56, + 0x01, 0x00, 0x20, 0x75, 0xF7, 0x70, 0xA1, 0x75, 0xF2, 0x0F, 0x2F, 0x56, 0x01, 0x00, 0x20, 0x55, + 0x26, 0x55, 0x06, 0x45, 0x57, 0x41, 0x26, 0x54, 0x06, 0x45, 0xD7, 0x41, 0x36, 0x54, 0xC6, 0x57, + 0x32, 0x03, 0xC4, 0x70, 0x22, 0xED, 0x0C, 0x70, 0x80, 0x04, 0x26, 0x71, 0x26, 0x72, 0x26, 0x61, + 0x10, 0x37, 0x20, 0x46, 0x6B, 0xF4, 0x00, 0x00, 0xC4, 0x20, 0x32, 0x02, 0x24, 0xE1, 0x24, 0xA1, + 0xC4, 0xAE, 0x92, 0x98, 0x24, 0xD1, 0xCC, 0xD0, 0x16, 0x00, 0x92, 0x93, 0xCC, 0xE0, 0xFE, 0x00, + 0x82, 0x07, 0xB4, 0xC1, 0x82, 0x05, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0xF2, 0x85, 0x58, 0xC1, + 0x0C, 0x09, 0x48, 0xA1, 0x04, 0x09, 0x2C, 0x10, 0x1C, 0x09, 0xE1, 0xF0, 0x3C, 0x10, 0x34, 0x00, + 0xD9, 0x81, 0x14, 0x00, 0xD9, 0xC1, 0x24, 0x00, 0xB9, 0x21, 0x04, 0x00, 0x06, 0x93, 0x06, 0x84, + 0x04, 0xEA, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, 0xB4, 0xE1, + 0x92, 0xF9, 0x08, 0xC0, 0x00, 0x30, 0x1C, 0x50, 0x88, 0x13, 0x06, 0xBE, 0x06, 0x7E, 0x06, 0x6E, + 0x06, 0xAE, 0x2C, 0xC0, 0x00, 0x49, 0x04, 0xD0, 0x06, 0x2E, 0x06, 0x3D, 0x06, 0x41, 0xB9, 0x51, + 0x10, 0x00, 0xB9, 0x61, 0x08, 0x00, 0xB9, 0x71, 0x0C, 0x00, 0xEB, 0xF1, 0x00, 0x00, 0x86, 0x22, + 0x38, 0x51, 0x10, 0x00, 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, 0x0C, 0x00, 0x82, 0x19, 0x30, 0x41, + 0x57, 0x41, 0x26, 0x4C, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x0F, 0x3F, 0x22, 0x04, 0x00, 0xC4, 0x20, + 0x32, 0x02, 0x16, 0x22, 0xCC, 0x20, 0xC8, 0x00, 0x02, 0x02, 0x04, 0xA1, 0x1C, 0x40, 0xC8, 0x00, + 0x26, 0x42, 0xC6, 0x54, 0x32, 0x05, 0x06, 0x54, 0x06, 0xBE, 0x06, 0x7D, 0x06, 0x62, 0x24, 0xD1, + 0xC4, 0xDE, 0x92, 0xD3, 0x24, 0xE1, 0xCC, 0xE0, 0x16, 0x00, 0x92, 0xCE, 0xB1, 0x68, 0xB1, 0x79, + 0x04, 0x20, 0x38, 0x71, 0x04, 0x00, 0xC6, 0xA2, 0xB1, 0xB7, 0x82, 0x02, 0x04, 0x24, 0x58, 0xC1, + 0x24, 0x00, 0x58, 0x81, 0x14, 0x00, 0x2C, 0x10, 0x34, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x06, 0xE4, 0x06, 0xC2, 0x04, 0x28, 0x06, 0xD3, 0x4B, 0xC1, 0x00, 0x00, 0x08, 0x70, + 0x01, 0x00, 0x2C, 0x70, 0xFF, 0x3F, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x58, 0x70, 0x04, 0x21, + 0x6B, 0xBB, 0x00, 0x00, 0x08, 0x20, 0x00, 0x30, 0x08, 0x30, 0x08, 0x00, 0x2C, 0x30, 0x00, 0x02, + 0x0C, 0x40, 0x00, 0x09, 0x2C, 0x20, 0x00, 0x40, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x04, 0x20, + 0x6B, 0xBB, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x02, 0x4B, 0xF9, 0x00, 0x00, 0x06, 0x2C, 0x06, 0x3D, + 0x06, 0x4E, 0xEB, 0x03, 0x01, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x18, 0x00, 0xD9, 0xC1, 0x08, 0x00, 0xC1, 0xA1, 0x06, 0xC3, 0x06, 0xB2, 0x2B, 0xD4, + 0x00, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x00, 0xF0, 0x08, 0x60, 0x00, 0x80, 0x2F, 0xD6, + 0x07, 0x00, 0x2C, 0x60, 0x00, 0x0C, 0x2F, 0xA6, 0x07, 0x00, 0x06, 0xED, 0x06, 0x3E, 0x0C, 0x20, + 0x30, 0x00, 0x77, 0x31, 0x0C, 0xF0, 0x9C, 0x02, 0xF1, 0xF0, 0x2C, 0xE0, 0x00, 0x04, 0xC6, 0xEA, + 0x92, 0xF6, 0x0C, 0xF0, 0x98, 0x02, 0xF1, 0xF0, 0x06, 0x3D, 0x06, 0x4B, 0x0C, 0x20, 0x50, 0x01, + 0x77, 0x31, 0x0C, 0x50, 0x40, 0x02, 0x0C, 0xF0, 0xD0, 0x02, 0xF1, 0xF0, 0x2B, 0x49, 0x00, 0x00, + 0x08, 0x30, 0x00, 0x80, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x30, 0x00, 0xFA, 0x26, 0x37, 0x06, 0x4C, + 0x0C, 0x20, 0x50, 0x01, 0x77, 0x31, 0x0C, 0x50, 0x80, 0x00, 0x0C, 0xF0, 0xD0, 0x02, 0xF1, 0xF0, + 0xAB, 0xD4, 0x00, 0x00, 0x58, 0xC1, 0x08, 0x00, 0x40, 0xA1, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x00, 0x80, 0xD1, 0x81, 0x06, 0xC4, + 0x06, 0x92, 0x06, 0xB3, 0x06, 0x2E, 0x0C, 0x20, 0x80, 0x0B, 0x06, 0x3D, 0x2C, 0x30, 0x00, 0xFA, + 0x0C, 0x40, 0x00, 0x02, 0x06, 0xA6, 0x06, 0x85, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x06, 0x58, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xAB, 0x0C, 0x57, 0x56, 0x66, 0x57, 0x57, 0x98, 0x06, 0x7E, + 0x0C, 0x70, 0x80, 0x0B, 0x66, 0x59, 0xA9, 0x57, 0xCC, 0x01, 0x77, 0x58, 0xA9, 0x57, 0xCE, 0x01, + 0x38, 0x50, 0x14, 0x00, 0x2C, 0xD0, 0x00, 0xFA, 0xA9, 0x57, 0xD0, 0x01, 0x77, 0x58, 0xA9, 0x57, + 0xD2, 0x01, 0x38, 0x5D, 0xC8, 0x01, 0x06, 0x3B, 0x57, 0x38, 0x66, 0x3C, 0x24, 0x51, 0xCC, 0xA0, + 0x32, 0x00, 0xA9, 0x37, 0xC4, 0x01, 0xA9, 0x57, 0xC8, 0x01, 0x77, 0x38, 0x77, 0x58, 0xA9, 0x37, + 0xC6, 0x01, 0xA9, 0x57, 0xCA, 0x01, 0x04, 0x60, 0x92, 0x05, 0xA9, 0x67, 0xC0, 0x01, 0xA9, 0x67, + 0xC2, 0x01, 0x08, 0x20, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, + 0x00, 0x80, 0x2C, 0x40, 0x6C, 0x03, 0x36, 0x42, 0x2C, 0x30, 0x74, 0x7B, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x08, 0x20, 0x00, 0x30, 0x06, 0x3E, 0x0C, 0x30, 0x80, 0x0B, 0x2C, 0x20, 0x00, 0x40, + 0x0B, 0x0D, 0x01, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x18, 0x70, 0xBB, 0x15, 0x1C, 0x50, 0x10, 0x00, 0x56, 0x75, 0xCC, 0x20, 0x32, 0x00, 0x3C, 0x10, + 0x1C, 0x00, 0x64, 0x78, 0xD9, 0xC1, 0x0C, 0x00, 0x99, 0x70, 0xBB, 0x15, 0x08, 0xE0, 0x00, 0x80, + 0x06, 0xD2, 0x2C, 0xE0, 0x00, 0xFA, 0x92, 0x09, 0xB8, 0x7E, 0xC0, 0x01, 0x92, 0x06, 0x0C, 0x20, + 0x78, 0x00, 0xEB, 0x49, 0x00, 0x00, 0xF2, 0x1C, 0xAB, 0x69, 0x00, 0x00, 0x04, 0x21, 0xCB, 0x61, + 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, 0x04, 0x28, + 0x04, 0x34, 0x26, 0x31, 0x06, 0x41, 0x26, 0x21, 0xEB, 0x09, 0x01, 0x00, 0x06, 0x52, 0x38, 0x31, + 0x08, 0x00, 0x30, 0x21, 0x38, 0x41, 0x04, 0x00, 0x06, 0x6D, 0x8B, 0x11, 0x01, 0x00, 0xEB, 0x14, + 0x00, 0x00, 0x38, 0x6E, 0xCC, 0x01, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x04, 0x01, 0x38, 0x6E, + 0xC4, 0x01, 0xB9, 0x67, 0x08, 0x01, 0x0B, 0xE5, 0x00, 0x00, 0xF2, 0x00, 0x98, 0x70, 0xB4, 0x15, + 0x3C, 0x10, 0xA4, 0x04, 0xD9, 0x81, 0x84, 0x04, 0xD9, 0xC1, 0x94, 0x04, 0x06, 0xA2, 0x06, 0x93, + 0x82, 0x72, 0x04, 0xD0, 0x08, 0xB0, 0x00, 0x30, 0x06, 0xED, 0x2C, 0xB0, 0x00, 0x49, 0x04, 0xC0, + 0x0C, 0x40, 0x80, 0x04, 0x06, 0x2D, 0x06, 0x3C, 0x26, 0x41, 0xEB, 0xF1, 0x00, 0x00, 0x86, 0x22, + 0x82, 0x2C, 0xCC, 0x20, 0x08, 0x07, 0x92, 0x06, 0x0C, 0x60, 0xFC, 0x08, 0x0C, 0x50, 0x14, 0x05, + 0xF2, 0x09, 0x23, 0x52, 0x0C, 0x60, 0xF4, 0x01, 0x26, 0x65, 0x3C, 0x50, 0xF4, 0x01, 0x23, 0x66, + 0x23, 0x55, 0x38, 0x21, 0x80, 0x04, 0xC4, 0x91, 0x06, 0x72, 0x57, 0x71, 0x26, 0x7B, 0x30, 0x77, + 0x82, 0x02, 0x67, 0x78, 0x5C, 0x70, 0xFF, 0x0F, 0xC6, 0x75, 0x04, 0x31, 0x22, 0x04, 0xC6, 0x76, + 0x02, 0x0C, 0x04, 0x30, 0x06, 0x4A, 0x6B, 0xF4, 0x00, 0x00, 0x38, 0x61, 0x80, 0x04, 0x2F, 0x7E, + 0x0E, 0x00, 0x26, 0x71, 0xA1, 0x67, 0x24, 0xE1, 0x24, 0xC1, 0xC4, 0xCE, 0x92, 0xCA, 0x24, 0xD1, + 0xCC, 0xD0, 0x16, 0x00, 0x92, 0xC5, 0xC4, 0xE0, 0x82, 0x2E, 0x04, 0x23, 0x4B, 0xC1, 0x00, 0x00, + 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, 0x34, 0xE1, 0x26, 0xEE, + 0x14, 0xF2, 0x08, 0x50, 0x00, 0x30, 0x26, 0xE1, 0x26, 0xF1, 0x2C, 0x50, 0x00, 0x49, 0x20, 0x4E, + 0x04, 0x2A, 0x06, 0x34, 0x57, 0x31, 0x26, 0x35, 0x30, 0x73, 0x5C, 0x70, 0xFF, 0x0F, 0x26, 0x27, + 0xCC, 0x20, 0xFF, 0x0F, 0x06, 0x62, 0xC2, 0x03, 0x0C, 0x60, 0xFF, 0x0F, 0x34, 0xE2, 0x57, 0x68, + 0xC6, 0xEF, 0x66, 0x67, 0xB1, 0x63, 0x92, 0xEC, 0x18, 0x20, 0xBB, 0x15, 0xB9, 0x41, 0x80, 0x04, + 0x4B, 0xC1, 0x00, 0x00, 0x58, 0xC1, 0x94, 0x04, 0x58, 0x81, 0x84, 0x04, 0x2C, 0x10, 0xA4, 0x04, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x30, 0x0C, 0x70, 0x00, 0x49, 0x0C, 0x40, 0xD0, 0x4D, + 0x26, 0x76, 0x26, 0x46, 0x30, 0x57, 0x04, 0x6A, 0x5C, 0x50, 0xFF, 0x0F, 0x26, 0x65, 0x57, 0x68, + 0x66, 0x65, 0xB1, 0x67, 0x24, 0x74, 0xC6, 0x74, 0x92, 0xF6, 0xE1, 0xF0, 0x98, 0x60, 0xAF, 0x10, + 0x38, 0x70, 0x94, 0x15, 0x18, 0x57, 0x76, 0x00, 0x18, 0x47, 0x75, 0x00, 0x92, 0x09, 0x98, 0x60, + 0xB0, 0x10, 0x82, 0x06, 0x26, 0x76, 0x18, 0x77, 0x92, 0x00, 0x26, 0x47, 0x13, 0x44, 0x98, 0x70, + 0xBA, 0x15, 0x82, 0x03, 0x24, 0x51, 0x13, 0x55, 0x10, 0x72, 0x04, 0x60, 0xC6, 0x76, 0x82, 0x14, + 0xC6, 0x74, 0xA2, 0x12, 0xCC, 0x70, 0x13, 0x00, 0xC2, 0x0B, 0x24, 0x51, 0x06, 0x45, 0x57, 0x41, + 0x57, 0x52, 0x26, 0x54, 0xC6, 0x75, 0x22, 0x08, 0x1C, 0x70, 0x10, 0x00, 0xF2, 0x03, 0x0C, 0x70, + 0x13, 0x00, 0x91, 0x72, 0x04, 0x61, 0x06, 0x26, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x40, 0x00, 0x10, + 0x30, 0x74, 0x18, 0x60, 0x1A, 0x10, 0x08, 0x50, 0x0F, 0x00, 0x2C, 0x50, 0xFF, 0xFF, 0x24, 0x71, + 0x56, 0x75, 0x08, 0x50, 0x00, 0x3C, 0x66, 0x75, 0x06, 0x56, 0x57, 0x5A, 0x08, 0x30, 0xF0, 0x00, + 0x16, 0x66, 0x56, 0x53, 0xF7, 0x6F, 0x66, 0x75, 0x57, 0x6A, 0xB1, 0x74, 0x6C, 0x60, 0x75, 0x00, + 0xD7, 0x7A, 0x66, 0x67, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x00, 0x01, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x80, 0x02, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, 0xB1, 0xF1, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x07, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x0B, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, + 0x0B, 0x2B, 0x01, 0x00, 0x08, 0x70, 0x00, 0x80, 0x18, 0x27, 0x08, 0xDC, 0x2B, 0x15, 0x03, 0x00, + 0xCB, 0xCD, 0x01, 0x00, 0x0C, 0x70, 0x14, 0x00, 0xA9, 0x70, 0x24, 0x10, 0x38, 0x70, 0x94, 0x15, + 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0x6D, 0x12, 0xAB, 0x81, 0x03, 0x00, 0x99, 0x00, 0x62, 0x12, + 0x99, 0x00, 0x63, 0x12, 0x99, 0x00, 0x64, 0x12, 0xAB, 0xB9, 0x01, 0x00, 0x38, 0x70, 0x94, 0x15, + 0x40, 0xE1, 0x18, 0x67, 0xC5, 0x00, 0x99, 0x60, 0x0C, 0x15, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x14, 0x61, 0xB1, 0xF1, 0x99, 0x60, 0x0D, 0x15, 0x4B, 0x18, 0x03, 0x00, 0xCB, 0x33, + 0x02, 0x00, 0xEB, 0x41, 0x01, 0x00, 0xAB, 0x42, 0x01, 0x00, 0x8B, 0x64, 0x03, 0x00, 0x30, 0xF1, + 0x99, 0x00, 0x1B, 0x10, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x38, 0x15, 0x04, 0x30, + 0x0C, 0x40, 0x1C, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x3E, 0x01, 0x00, 0x4B, 0x36, 0x02, 0x00, + 0x4B, 0x09, 0x02, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x05, 0x10, + 0x34, 0x18, 0xC1, 0xE1, 0x82, 0x0A, 0x18, 0x60, 0x2B, 0x13, 0xCC, 0x60, 0xC7, 0x00, 0xD2, 0x2E, + 0x24, 0x61, 0x99, 0x60, 0x2B, 0x13, 0xF2, 0x2A, 0x14, 0x61, 0x99, 0x00, 0x2B, 0x13, 0x99, 0x60, + 0x0D, 0x15, 0x38, 0x60, 0x84, 0x15, 0x06, 0xE7, 0xC4, 0x64, 0xC2, 0x09, 0xAB, 0x42, 0x01, 0x00, + 0xEB, 0x41, 0x01, 0x00, 0x4B, 0x18, 0x03, 0x00, 0x8B, 0x64, 0x03, 0x00, 0x99, 0x00, 0x32, 0x13, + 0x99, 0x00, 0x39, 0x13, 0x14, 0x71, 0x99, 0x70, 0x2F, 0x13, 0x99, 0x70, 0x2E, 0x13, 0x38, 0x70, + 0x80, 0x15, 0x0C, 0x60, 0x14, 0x00, 0xC6, 0x76, 0xD2, 0x03, 0x34, 0x71, 0x13, 0x67, 0x38, 0x70, + 0x84, 0x15, 0xC6, 0x76, 0xC2, 0x03, 0xCB, 0x33, 0x02, 0x00, 0x98, 0x70, 0xBD, 0x15, 0x82, 0x1A, + 0x28, 0x70, 0x06, 0x10, 0x1C, 0x60, 0xE1, 0x00, 0x56, 0x76, 0xA9, 0x70, 0x06, 0x10, 0xAB, 0x31, + 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x8B, 0x33, 0x03, 0x00, 0x8B, 0x64, 0x03, 0x00, 0x38, 0x70, + 0x94, 0x15, 0x99, 0x00, 0x1A, 0x10, 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0x6D, 0x12, 0x99, 0x00, + 0x2E, 0x11, 0x38, 0x50, 0x38, 0x15, 0x06, 0x75, 0x18, 0x40, 0x2C, 0x13, 0x77, 0x76, 0x54, 0x7F, + 0xC6, 0x47, 0x32, 0x04, 0x99, 0x70, 0x2C, 0x13, 0xF2, 0x07, 0x06, 0x75, 0xDC, 0x70, 0x00, 0xF0, + 0x92, 0x03, 0x99, 0x00, 0x2C, 0x13, 0x98, 0x70, 0x6E, 0x15, 0x82, 0x0A, 0x18, 0x70, 0x1B, 0x10, + 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x07, 0x24, 0x71, 0x99, 0x70, 0x1B, 0x10, 0xF2, 0x03, 0x99, 0x00, + 0x1B, 0x10, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0xAB, 0x31, 0x01, 0x00, + 0x2B, 0xE7, 0x02, 0x00, 0x4B, 0x0E, 0x03, 0x00, 0x2B, 0x3C, 0x02, 0x00, 0x0B, 0x0B, 0x02, 0x00, + 0x0B, 0x94, 0x01, 0x00, 0xEB, 0x49, 0x01, 0x00, 0x98, 0x70, 0x2A, 0x13, 0x82, 0x07, 0x99, 0x00, + 0x52, 0x15, 0x6B, 0x32, 0x01, 0x00, 0x04, 0x20, 0xF2, 0x1A, 0x38, 0x70, 0x94, 0x15, 0x98, 0x77, + 0xB2, 0x00, 0x92, 0x06, 0x8B, 0xCE, 0x01, 0x00, 0x2B, 0xC2, 0x01, 0x00, 0xF2, 0x05, 0x2B, 0xC2, + 0x01, 0x00, 0x8B, 0xCE, 0x01, 0x00, 0x8B, 0x4B, 0x03, 0x00, 0x8B, 0x33, 0x03, 0x00, 0xAB, 0x2C, + 0x03, 0x00, 0x8B, 0x58, 0x03, 0x00, 0xAB, 0x38, 0x03, 0x00, 0x04, 0x21, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x20, 0x6E, 0x15, 0x18, 0x30, 0x52, 0x15, 0x34, 0x14, 0xB1, 0xF1, + 0xEB, 0x84, 0x03, 0x00, 0xEB, 0x6B, 0x03, 0x00, 0x6B, 0x64, 0x03, 0x00, 0xCB, 0x58, 0x03, 0x00, + 0x6B, 0x61, 0x03, 0x00, 0x6B, 0x32, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0x0C, 0x20, 0x1D, 0x13, 0x04, 0x30, 0x04, 0x45, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x78, 0x12, 0x04, 0x30, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x99, 0x0E, 0x27, 0x03, 0x0C, 0x20, 0xDE, 0x14, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x07, 0x05, 0x0C, 0x20, + 0x38, 0x15, 0x04, 0x30, 0x04, 0x44, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x3C, 0x15, + 0x04, 0x30, 0x0C, 0x40, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x52, 0x05, + 0xA9, 0x0E, 0x50, 0x05, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, + 0xA6, 0x10, 0x04, 0x30, 0x04, 0x4C, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0x94, 0x15, 0x34, 0x14, 0xB1, 0xF1, + 0x0C, 0x70, 0x00, 0x10, 0x98, 0x57, 0x35, 0x03, 0x28, 0x26, 0x72, 0x00, 0x82, 0x04, 0x28, 0x26, + 0x7A, 0x00, 0xF2, 0x08, 0x98, 0x77, 0x36, 0x03, 0x82, 0x05, 0x28, 0x76, 0x7A, 0x00, 0x26, 0x27, + 0x23, 0x22, 0x06, 0x32, 0xAB, 0x97, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x30, 0x00, 0xD9, 0xC1, 0x20, 0x00, 0x06, 0x73, 0x06, 0xC3, 0xD9, 0x81, 0x10, 0x00, + 0x0C, 0xD0, 0x00, 0x10, 0x04, 0x91, 0x57, 0xC2, 0xD7, 0x71, 0x26, 0xCD, 0xB1, 0x51, 0x26, 0x7D, + 0x26, 0x94, 0x04, 0xB8, 0x04, 0x54, 0x06, 0x62, 0x26, 0xBC, 0x26, 0x57, 0x13, 0x99, 0x2C, 0x70, + 0x3A, 0x01, 0x04, 0x84, 0x0C, 0x20, 0x78, 0x02, 0x06, 0xE3, 0x99, 0x9B, 0x7A, 0x02, 0x06, 0xA4, + 0x06, 0x37, 0x06, 0x48, 0x26, 0x2C, 0xB9, 0x51, 0x0C, 0x00, 0xB9, 0x61, 0x08, 0x00, 0xB9, 0x71, + 0x04, 0x00, 0x6B, 0xCF, 0x03, 0x00, 0x38, 0x71, 0x04, 0x00, 0x0C, 0x20, 0x7C, 0x02, 0x06, 0x48, + 0x26, 0x2C, 0x06, 0x37, 0x6B, 0xCF, 0x03, 0x00, 0x04, 0x71, 0x26, 0x7E, 0x06, 0x47, 0xD7, 0x41, + 0x26, 0x4D, 0x28, 0x44, 0x36, 0x01, 0x26, 0xDA, 0x99, 0x4B, 0x7B, 0x02, 0x30, 0x41, 0x99, 0x4C, + 0x84, 0x02, 0x38, 0x51, 0x0C, 0x00, 0x28, 0x55, 0x34, 0x01, 0xA9, 0x5B, 0x78, 0x02, 0x38, 0x61, + 0x08, 0x00, 0x26, 0xE6, 0x91, 0x9E, 0x99, 0x7D, 0x1D, 0x03, 0x99, 0x0D, 0x18, 0x03, 0x58, 0xC1, + 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0xE8, 0x00, + 0xD9, 0xC1, 0xD8, 0x00, 0x38, 0x70, 0x94, 0x15, 0xD9, 0x81, 0xC8, 0x00, 0x0C, 0x50, 0x75, 0x00, + 0x0C, 0x60, 0x77, 0x00, 0x0C, 0x20, 0x78, 0x00, 0x26, 0x57, 0x26, 0x67, 0x26, 0x27, 0x10, 0x55, + 0x18, 0xE7, 0x76, 0x00, 0x10, 0x66, 0x10, 0x72, 0xB9, 0x51, 0xA4, 0x00, 0x04, 0xB0, 0xB9, 0x61, + 0xA8, 0x00, 0xB9, 0x71, 0xB0, 0x00, 0x0C, 0xA0, 0xD4, 0x12, 0x06, 0x9B, 0x0C, 0x80, 0x00, 0x10, + 0x18, 0x78, 0x28, 0x03, 0x06, 0xD8, 0xC6, 0x97, 0x32, 0x0F, 0x14, 0x72, 0x26, 0x7A, 0x90, 0x77, + 0x82, 0x07, 0x06, 0x2A, 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x02, 0x24, 0xB1, 0x24, 0x91, + 0x2C, 0xA0, 0x10, 0x00, 0xF2, 0xEE, 0xC4, 0xB0, 0x99, 0x08, 0xB0, 0x00, 0x78, 0x38, 0xA6, 0x00, + 0x78, 0x68, 0xAA, 0x00, 0x78, 0x48, 0xA8, 0x00, 0x78, 0x78, 0xAC, 0x00, 0x82, 0x22, 0x3F, 0x66, + 0x03, 0x00, 0xC4, 0x60, 0x38, 0x50, 0x94, 0x15, 0x32, 0x02, 0x16, 0x66, 0x28, 0x35, 0x86, 0x00, + 0x43, 0x66, 0xC6, 0x63, 0x32, 0x16, 0x3F, 0x77, 0x04, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, + 0x28, 0x65, 0x88, 0x00, 0x43, 0x77, 0xC6, 0x76, 0x32, 0x03, 0x04, 0x71, 0xF2, 0x08, 0x28, 0x65, + 0x8A, 0x00, 0xC6, 0x76, 0x32, 0x03, 0x04, 0x72, 0xF2, 0x02, 0x04, 0x73, 0x99, 0x7D, 0xB0, 0x00, + 0x98, 0x7D, 0xAF, 0x00, 0x92, 0x0F, 0x98, 0x7D, 0xB0, 0x00, 0x82, 0x0C, 0x38, 0x60, 0x94, 0x15, + 0x38, 0x51, 0xA4, 0x00, 0x26, 0x76, 0x18, 0x77, 0x92, 0x00, 0x26, 0x75, 0x13, 0x77, 0xB9, 0x71, + 0xA4, 0x00, 0x38, 0x70, 0x94, 0x15, 0x18, 0x6D, 0x2B, 0x03, 0x18, 0x77, 0x92, 0x00, 0xC6, 0x67, + 0xB2, 0x07, 0x98, 0x7D, 0xAE, 0x00, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7D, 0xAF, 0x00, 0x98, 0x70, + 0xBA, 0x15, 0x82, 0x09, 0x38, 0x71, 0xA8, 0x00, 0x24, 0xE1, 0x24, 0x71, 0x13, 0x77, 0x13, 0xEE, + 0xB9, 0x71, 0xA8, 0x00, 0x0C, 0x20, 0x88, 0x00, 0x26, 0x21, 0x04, 0x30, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x7D, 0x06, 0x00, 0xDC, 0x70, 0xE0, 0x04, 0x82, 0x0A, 0x8B, 0x3E, + 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, 0x32, 0x01, 0xFA, 0xC8, 0x02, 0x00, + 0x98, 0x7D, 0x29, 0x03, 0x99, 0x0D, 0x32, 0x01, 0x82, 0x04, 0x34, 0x71, 0x99, 0x7D, 0x29, 0x03, + 0x98, 0x8D, 0x04, 0x00, 0x92, 0x05, 0x98, 0x7D, 0x28, 0x03, 0x8A, 0xB9, 0x02, 0x00, 0x98, 0x3D, + 0x28, 0x03, 0x92, 0x1D, 0x0C, 0x20, 0xC8, 0x12, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x98, 0xED, 0x29, 0x03, 0x9A, 0xAB, 0x02, 0x00, 0xC6, 0xE8, 0x32, 0x0C, 0x0C, 0x20, + 0x88, 0x00, 0x06, 0x3E, 0x06, 0x4E, 0x26, 0x21, 0x0C, 0x50, 0x14, 0x00, 0x8B, 0x44, 0x01, 0x00, + 0x24, 0xE1, 0xF2, 0xF4, 0x99, 0x8D, 0x27, 0x03, 0xFA, 0x9A, 0x02, 0x00, 0x0C, 0x20, 0x78, 0x00, + 0x04, 0x31, 0x26, 0x21, 0x04, 0x46, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x18, 0x3D, 0x28, 0x03, + 0x04, 0x70, 0x06, 0x5D, 0xB9, 0x71, 0x9C, 0x00, 0x06, 0x67, 0xC6, 0x63, 0x32, 0x12, 0x18, 0x45, + 0xD4, 0x02, 0xCC, 0x40, 0x13, 0x00, 0xC2, 0x04, 0x04, 0x21, 0xB9, 0x21, 0x9C, 0x00, 0x34, 0x41, + 0xCC, 0x40, 0x12, 0x00, 0xD2, 0x02, 0x04, 0x71, 0x24, 0x61, 0x2C, 0x50, 0x10, 0x00, 0xF2, 0xEE, + 0xC4, 0x70, 0x82, 0x04, 0x04, 0x50, 0xB9, 0x51, 0x9C, 0x00, 0xCB, 0x42, 0x01, 0x00, 0x38, 0x70, + 0x94, 0x15, 0xB9, 0x21, 0x98, 0x00, 0x18, 0xC7, 0x74, 0x00, 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, + 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, 0x24, 0xE2, 0x06, 0x7E, 0x57, 0x71, 0x57, 0xE2, 0x26, 0x7E, + 0xB9, 0x71, 0xB4, 0x00, 0x04, 0x62, 0x04, 0x70, 0x14, 0x51, 0xB9, 0x21, 0xAC, 0x00, 0xB9, 0x61, + 0x90, 0x00, 0xB9, 0x71, 0xA0, 0x00, 0xB9, 0x51, 0x94, 0x00, 0x38, 0xE1, 0x90, 0x00, 0x06, 0x21, + 0x34, 0xE1, 0x13, 0x6E, 0x14, 0x31, 0x0C, 0x40, 0x78, 0x00, 0xB9, 0x61, 0x90, 0x00, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x00, 0x26, 0x21, 0x14, 0x31, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x61, 0x04, 0xB0, 0xC6, 0xB8, 0x32, 0x65, 0xB8, 0x71, 0x90, 0x00, + 0x38, 0xE1, 0x98, 0x00, 0x92, 0x06, 0xB8, 0x51, 0x9C, 0x00, 0x92, 0x03, 0x38, 0xE1, 0xAC, 0x00, + 0x0C, 0x70, 0x80, 0x00, 0x06, 0x9B, 0x26, 0x71, 0xD7, 0x91, 0x26, 0x7B, 0x26, 0x9D, 0x0C, 0xC0, + 0x00, 0x10, 0x04, 0xA1, 0xB9, 0x71, 0xB8, 0x00, 0x18, 0x7D, 0x28, 0x03, 0x14, 0x51, 0x26, 0x5A, + 0xC6, 0x57, 0x32, 0x45, 0x98, 0x7C, 0xD2, 0x02, 0x82, 0x3E, 0x0C, 0x20, 0xD4, 0x02, 0x26, 0x2C, + 0xB9, 0x61, 0xBC, 0x00, 0xEB, 0x25, 0x01, 0x00, 0x38, 0x51, 0x90, 0x00, 0x38, 0x61, 0xBC, 0x00, + 0xC6, 0x25, 0x92, 0x31, 0x78, 0x2C, 0xCC, 0x02, 0x78, 0x79, 0x3A, 0x01, 0x36, 0x27, 0xC4, 0x20, + 0x32, 0x02, 0x16, 0x22, 0x78, 0x5C, 0xCE, 0x02, 0x78, 0x79, 0x3C, 0x01, 0x3F, 0x77, 0x05, 0x00, + 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x06, 0x32, 0xB9, 0x61, 0xBC, 0x00, 0xB9, 0x71, 0xC0, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0xC0, 0x00, 0x06, 0x52, 0x06, 0x37, 0x06, 0x27, 0xB9, 0x51, + 0xC4, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x38, 0x61, 0xBC, 0x00, 0x26, 0x25, + 0xC6, 0x2E, 0x32, 0x05, 0x38, 0x71, 0xB8, 0x00, 0x06, 0xE2, 0x91, 0xA7, 0x06, 0x7A, 0x57, 0x71, + 0x26, 0x76, 0xB1, 0x27, 0x24, 0xA1, 0x2C, 0xC0, 0x10, 0x00, 0xF2, 0xB7, 0x24, 0xB1, 0x2C, 0x60, + 0x18, 0x00, 0xF2, 0x9B, 0x04, 0x70, 0xC6, 0x78, 0x3A, 0xE9, 0x00, 0x00, 0xB8, 0x61, 0x90, 0x00, + 0x38, 0x51, 0x98, 0x00, 0x92, 0x09, 0xB8, 0x51, 0x9C, 0x00, 0x82, 0x04, 0x38, 0x51, 0x98, 0x00, + 0xF2, 0x03, 0x38, 0x51, 0xAC, 0x00, 0x04, 0x31, 0x04, 0x60, 0x0C, 0x40, 0x88, 0x00, 0x26, 0x41, + 0x26, 0x46, 0x90, 0xF4, 0x92, 0x18, 0x0C, 0x40, 0x80, 0x00, 0x26, 0x41, 0x26, 0x46, 0x60, 0x24, + 0x2F, 0x46, 0x06, 0x00, 0x26, 0x46, 0x26, 0x44, 0x26, 0x42, 0x57, 0x41, 0x26, 0x41, 0x30, 0x44, + 0xC6, 0x45, 0x32, 0x09, 0xC4, 0x40, 0x22, 0x07, 0xC4, 0x20, 0x22, 0x05, 0x06, 0x54, 0xB9, 0x61, + 0x94, 0x00, 0x06, 0x3F, 0x24, 0x61, 0xC6, 0x68, 0x22, 0xE1, 0xC4, 0x30, 0x9A, 0xB4, 0x00, 0x00, + 0x38, 0xE1, 0x94, 0x00, 0x38, 0x61, 0xA0, 0x00, 0x57, 0xE2, 0x24, 0x61, 0x26, 0xED, 0xB9, 0x61, + 0xA0, 0x00, 0x98, 0x6E, 0x82, 0x02, 0x0C, 0xB0, 0x78, 0x02, 0x26, 0xBE, 0x9A, 0xA4, 0x00, 0x00, + 0x38, 0x51, 0x94, 0x00, 0x0C, 0x60, 0x80, 0x00, 0x26, 0x61, 0x26, 0x65, 0x60, 0xC6, 0xB9, 0x71, + 0xC0, 0x00, 0x04, 0x34, 0x26, 0x3C, 0x0C, 0x60, 0x00, 0x10, 0x57, 0x32, 0x26, 0x36, 0x06, 0x2B, + 0x2C, 0x30, 0x78, 0x02, 0x0C, 0x40, 0x10, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x91, + 0x94, 0x00, 0x0C, 0x20, 0x00, 0x10, 0xD7, 0x91, 0x26, 0x92, 0x04, 0x54, 0x26, 0x59, 0x2C, 0x90, + 0x3A, 0x01, 0x06, 0x39, 0x04, 0x44, 0x06, 0x2B, 0xB9, 0x51, 0xC4, 0x00, 0x6B, 0xCF, 0x03, 0x00, + 0x38, 0xA1, 0x94, 0x00, 0x24, 0xA1, 0x06, 0x6A, 0x0C, 0x30, 0x00, 0x10, 0xD7, 0x61, 0x26, 0x63, + 0x28, 0x66, 0x36, 0x01, 0x04, 0x24, 0x99, 0x6E, 0x83, 0x02, 0x26, 0x2B, 0x06, 0x39, 0x04, 0x44, + 0x6B, 0xCF, 0x03, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x28, 0x65, 0x34, 0x01, 0x38, 0x51, 0xA4, 0x00, + 0xA9, 0x6E, 0x80, 0x02, 0x18, 0x6E, 0x84, 0x02, 0x38, 0x71, 0xC0, 0x00, 0xC6, 0x56, 0x22, 0x04, + 0x24, 0x61, 0x99, 0x6E, 0x84, 0x02, 0x18, 0x6E, 0x84, 0x02, 0xCC, 0x60, 0x13, 0x00, 0xC2, 0x09, + 0x38, 0x51, 0xB4, 0x00, 0xC6, 0x65, 0x32, 0x05, 0x2C, 0x60, 0x14, 0x00, 0x99, 0x6E, 0x84, 0x02, + 0x38, 0x21, 0x94, 0x00, 0x18, 0x6E, 0x82, 0x02, 0x18, 0xFD, 0x28, 0x03, 0x0C, 0x50, 0x88, 0x00, + 0x26, 0x51, 0x26, 0x52, 0x91, 0x65, 0x34, 0x61, 0x26, 0x6D, 0x99, 0xA6, 0x1D, 0x03, 0x99, 0x06, + 0x18, 0x03, 0x0C, 0x60, 0x78, 0x00, 0x26, 0x61, 0x26, 0x6C, 0x91, 0x06, 0x57, 0xC1, 0x06, 0x41, + 0x04, 0x60, 0x2F, 0x5C, 0x04, 0x00, 0x14, 0x31, 0xB1, 0x35, 0xB8, 0x51, 0x90, 0x00, 0x38, 0x31, + 0x98, 0x00, 0x92, 0x06, 0xB8, 0x51, 0x9C, 0x00, 0x92, 0x03, 0x38, 0x31, 0xAC, 0x00, 0x0C, 0x50, + 0x88, 0x00, 0x26, 0x51, 0x26, 0x56, 0x90, 0x55, 0x82, 0x07, 0x24, 0x61, 0xC6, 0x68, 0x2C, 0x40, + 0x18, 0x00, 0x22, 0xE8, 0xF2, 0x12, 0x0C, 0xE0, 0x80, 0x00, 0x26, 0xE1, 0x26, 0xE6, 0xC6, 0x5F, + 0x32, 0xF5, 0x24, 0x51, 0x06, 0x25, 0x57, 0x21, 0x26, 0x24, 0xB0, 0x22, 0x22, 0xF9, 0xC6, 0x23, + 0x32, 0xF7, 0x91, 0x5E, 0x06, 0x32, 0xF2, 0xF4, 0x18, 0x6D, 0x28, 0x03, 0x38, 0x51, 0xA0, 0x00, + 0xC6, 0x56, 0x32, 0x04, 0x24, 0x71, 0xFA, 0x18, 0xFF, 0xFF, 0xB8, 0x61, 0x90, 0x00, 0x9A, 0x96, + 0xFE, 0xFF, 0x99, 0x0D, 0x2A, 0x03, 0x0C, 0xA0, 0xD4, 0x12, 0x06, 0xE6, 0x06, 0xB6, 0x06, 0xCD, + 0x18, 0x5D, 0x28, 0x03, 0x38, 0x61, 0x90, 0x00, 0xC6, 0x65, 0x32, 0x10, 0x38, 0x71, 0x90, 0x00, + 0x0C, 0x50, 0x78, 0x00, 0x24, 0x71, 0x26, 0x51, 0x26, 0x57, 0x90, 0x55, 0xB9, 0x71, 0x90, 0x00, + 0x82, 0x76, 0x2F, 0x5B, 0x08, 0x00, 0xC4, 0x54, 0x02, 0x0F, 0x28, 0x7D, 0x06, 0x00, 0x04, 0x64, + 0xD6, 0x67, 0x82, 0x71, 0x38, 0x51, 0xB0, 0x00, 0x14, 0x65, 0x56, 0x76, 0x99, 0x5D, 0x29, 0x03, + 0xA9, 0x7D, 0x06, 0x00, 0xF2, 0x68, 0x14, 0x42, 0x26, 0x4A, 0x10, 0x44, 0x38, 0x61, 0xA8, 0x00, + 0x06, 0x94, 0x34, 0x91, 0xB9, 0x41, 0x94, 0x00, 0x26, 0x9C, 0x0C, 0x40, 0xA0, 0x00, 0x26, 0x49, + 0x18, 0x24, 0x78, 0x02, 0x14, 0x3C, 0xC6, 0x26, 0x26, 0x3A, 0xB2, 0x3C, 0xC4, 0xB4, 0x12, 0x3A, + 0x06, 0x2A, 0xB9, 0x31, 0xBC, 0x00, 0xB9, 0x41, 0xC0, 0x00, 0xB9, 0x51, 0xC4, 0x00, 0xEB, 0x25, + 0x01, 0x00, 0xC4, 0x20, 0x38, 0x31, 0xBC, 0x00, 0x38, 0x41, 0xC0, 0x00, 0x38, 0x51, 0xC4, 0x00, + 0x82, 0x29, 0x18, 0x24, 0x78, 0x02, 0x24, 0xB1, 0x24, 0x21, 0x99, 0x24, 0x78, 0x02, 0x06, 0x25, + 0x57, 0x22, 0x26, 0x2C, 0x2C, 0x20, 0x78, 0x02, 0x0C, 0x40, 0x10, 0x00, 0xB9, 0x51, 0xC4, 0x00, + 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x51, 0xC4, 0x00, 0x38, 0x71, 0x94, 0x00, 0x0C, 0x40, + 0x88, 0x00, 0x26, 0x41, 0x26, 0x45, 0x24, 0x51, 0x99, 0x59, 0x1D, 0x03, 0x98, 0x5C, 0x1A, 0x00, + 0x91, 0x74, 0x04, 0x21, 0x99, 0x2C, 0x2A, 0x03, 0x24, 0xE1, 0x92, 0x19, 0x99, 0x2C, 0x1A, 0x00, + 0xF2, 0x16, 0x06, 0x2A, 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x11, 0x04, 0x31, 0x99, 0x3D, + 0xAE, 0x00, 0x10, 0x5A, 0xCC, 0x50, 0x13, 0x00, 0xC2, 0x0A, 0x18, 0x5C, 0x28, 0x03, 0xC4, 0x51, + 0x92, 0x06, 0x28, 0x5C, 0x06, 0x00, 0x64, 0x54, 0xA9, 0x5C, 0x06, 0x00, 0x2C, 0xA0, 0x10, 0x00, + 0xFA, 0x78, 0xFF, 0xFF, 0x0C, 0xA0, 0x84, 0x12, 0x04, 0xC0, 0x0C, 0xB0, 0x80, 0x0B, 0xC6, 0xC8, + 0x32, 0x4A, 0x0C, 0x70, 0x88, 0x00, 0x26, 0x71, 0x26, 0x7C, 0x90, 0x47, 0x92, 0x36, 0x0C, 0x70, + 0x1D, 0x13, 0xE0, 0x67, 0x92, 0x2E, 0xE8, 0x67, 0x05, 0x00, 0x92, 0x2B, 0x18, 0x3D, 0x28, 0x03, + 0x0C, 0x70, 0x27, 0x00, 0x26, 0x74, 0xD7, 0x71, 0xC4, 0x31, 0x26, 0x7D, 0x18, 0x57, 0x01, 0x00, + 0x10, 0x27, 0x38, 0x70, 0x94, 0x15, 0xC2, 0x04, 0x28, 0x77, 0x26, 0x00, 0xF2, 0x08, 0xC4, 0x30, + 0x82, 0x04, 0x28, 0x77, 0x24, 0x00, 0xF2, 0x03, 0x28, 0x77, 0x22, 0x00, 0x26, 0x55, 0x06, 0x65, + 0xD7, 0x61, 0x36, 0x65, 0x26, 0x62, 0x26, 0x66, 0x26, 0x6B, 0x70, 0x66, 0xC6, 0x67, 0x22, 0x0D, + 0x0C, 0x20, 0x88, 0x00, 0x26, 0x21, 0x06, 0x3C, 0x04, 0x51, 0x8B, 0x44, 0x01, 0x00, 0xF2, 0x05, + 0x24, 0x41, 0xC4, 0x45, 0x24, 0x71, 0x92, 0xCE, 0x98, 0x7D, 0x29, 0x03, 0x82, 0x08, 0x06, 0x2A, + 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, 0x92, 0x03, 0x04, 0x71, 0x91, 0x7A, 0x24, 0xC1, 0x2C, 0xA0, + 0x10, 0x00, 0xF2, 0xB6, 0x26, 0xE8, 0x99, 0xED, 0x27, 0x03, 0xF2, 0x03, 0x99, 0x0D, 0x2A, 0x03, + 0x58, 0xC1, 0xD8, 0x00, 0x58, 0x81, 0xC8, 0x00, 0x2C, 0x10, 0xE8, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x4C, 0x01, 0xD9, 0xC1, 0x3C, 0x01, 0xD9, 0x81, 0x2C, 0x01, + 0x18, 0xE7, 0x46, 0x00, 0x18, 0x97, 0x47, 0x00, 0x0C, 0x70, 0x78, 0x00, 0x26, 0x71, 0x0C, 0xB0, + 0x00, 0x10, 0x06, 0x27, 0x0C, 0x30, 0x78, 0x00, 0xB9, 0x71, 0x24, 0x01, 0xA9, 0x0B, 0x6E, 0x02, + 0xB9, 0x0B, 0x70, 0x02, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x0C, 0x30, 0x78, 0x00, + 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x5E, 0x2F, 0x6E, 0x0E, 0x00, 0x57, 0x52, 0x36, 0x56, + 0x26, 0x6B, 0xB9, 0x61, 0xF8, 0x00, 0x04, 0x6E, 0x36, 0x69, 0x04, 0x8B, 0x26, 0x59, 0xB9, 0x61, + 0x04, 0x01, 0x0C, 0x60, 0x80, 0x02, 0x36, 0x8E, 0x26, 0x55, 0x26, 0x56, 0x26, 0x88, 0x04, 0xA7, + 0x2F, 0x49, 0x09, 0x00, 0x0C, 0x60, 0x16, 0x00, 0x14, 0x71, 0x04, 0xD0, 0x36, 0xA9, 0x26, 0x4B, + 0x36, 0x6E, 0x26, 0x78, 0x26, 0xAA, 0xB9, 0x41, 0x0C, 0x01, 0x06, 0xCD, 0xB9, 0xD1, 0xF4, 0x00, + 0xB9, 0xD1, 0xF0, 0x00, 0xB9, 0x51, 0x10, 0x01, 0xB9, 0x61, 0x08, 0x01, 0xB9, 0x71, 0x14, 0x01, + 0x38, 0x71, 0x04, 0x01, 0xC6, 0x97, 0x3A, 0x93, 0x00, 0x00, 0x38, 0x71, 0x10, 0x01, 0x0C, 0x50, + 0x78, 0x00, 0x26, 0x7D, 0xB9, 0x71, 0xFC, 0x00, 0x38, 0x71, 0x0C, 0x01, 0x04, 0x60, 0x26, 0x7D, + 0x26, 0x51, 0xB9, 0x71, 0x00, 0x01, 0x26, 0x5C, 0x06, 0x76, 0x38, 0x31, 0x08, 0x01, 0x2F, 0x4E, + 0x07, 0x00, 0xC6, 0x43, 0x32, 0x1E, 0x38, 0xF1, 0x00, 0x01, 0x38, 0x41, 0xFC, 0x00, 0x78, 0x2F, + 0xB2, 0x00, 0x38, 0xF1, 0xF8, 0x00, 0x2F, 0x37, 0x07, 0x00, 0x26, 0x3F, 0x26, 0x46, 0x78, 0x33, + 0xEE, 0x00, 0x70, 0x44, 0x26, 0x32, 0x26, 0x43, 0x38, 0x21, 0xF0, 0x00, 0x30, 0x35, 0x26, 0x24, + 0x26, 0x43, 0xB9, 0x21, 0xF0, 0x00, 0xB1, 0x45, 0x24, 0x71, 0x2C, 0x60, 0x1C, 0x00, 0xF2, 0xDE, + 0x0C, 0x70, 0x78, 0x00, 0x26, 0x71, 0x26, 0x7C, 0x30, 0x27, 0xB9, 0x71, 0x24, 0x01, 0x06, 0x38, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x24, 0x01, 0x04, 0x60, 0xB1, 0x27, 0x06, 0x52, 0x06, 0x76, + 0x2F, 0x4C, 0x01, 0x00, 0x38, 0x21, 0x08, 0x01, 0x2F, 0x3E, 0x07, 0x00, 0xC6, 0x32, 0x32, 0x31, + 0x38, 0x31, 0xFC, 0x00, 0x38, 0x21, 0x00, 0x01, 0x26, 0x36, 0x70, 0x33, 0x78, 0xF2, 0xB2, 0x00, + 0x36, 0x35, 0xB9, 0x31, 0x28, 0x01, 0x38, 0x31, 0xF8, 0x00, 0x2F, 0x27, 0x07, 0x00, 0x26, 0x23, + 0x78, 0x22, 0xEE, 0x00, 0xB9, 0x41, 0x20, 0x01, 0xB9, 0x51, 0x18, 0x01, 0x26, 0x2F, 0x38, 0xF1, + 0x28, 0x01, 0xB9, 0x61, 0x1C, 0x01, 0xB9, 0x71, 0x24, 0x01, 0x26, 0x2F, 0x06, 0x32, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x41, 0x20, 0x01, 0x38, 0x71, 0x24, 0x01, 0x38, 0x61, 0x1C, 0x01, 0x30, 0x34, + 0x38, 0x51, 0x18, 0x01, 0x26, 0x23, 0xB1, 0x24, 0x24, 0x71, 0x2C, 0x60, 0x1C, 0x00, 0xF2, 0xCB, + 0x2F, 0x7C, 0x01, 0x00, 0x30, 0x27, 0x38, 0x31, 0x14, 0x01, 0xB9, 0x71, 0x24, 0x01, 0x24, 0x91, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x24, 0x01, 0x24, 0xC4, 0xB1, 0x27, 0x38, 0x71, 0xF4, 0x00, + 0x24, 0xD2, 0x26, 0x72, 0xB9, 0x71, 0xF4, 0x00, 0xFA, 0x6C, 0xFF, 0xFF, 0x38, 0x21, 0xF4, 0x00, + 0x06, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x06, 0x3A, 0x06, 0xD2, 0x06, 0x28, 0xAB, 0x97, 0x00, 0x00, + 0x06, 0x32, 0x38, 0x21, 0xF0, 0x00, 0x04, 0x80, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x7B, 0x70, 0x02, + 0x43, 0x92, 0x06, 0xC2, 0xA9, 0x9B, 0x6E, 0x02, 0xC6, 0x8A, 0x32, 0x11, 0x06, 0x68, 0x57, 0x61, + 0x26, 0x61, 0x30, 0x26, 0xB9, 0x71, 0x24, 0x01, 0x24, 0x81, 0x3F, 0x22, 0x0D, 0x00, 0x06, 0x32, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x24, 0x01, 0x26, 0x72, 0xF2, 0xEF, 0x14, 0x31, 0x06, 0x27, + 0x26, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x31, 0x04, 0x01, 0x06, 0xDB, 0x4B, 0x9E, 0x00, 0x00, + 0x0C, 0x30, 0x16, 0x00, 0x36, 0x3E, 0x4B, 0x9E, 0x00, 0x00, 0x86, 0x22, 0x32, 0x03, 0x2C, 0x20, + 0xFF, 0x03, 0xC4, 0x90, 0x67, 0x25, 0xB9, 0x2D, 0x70, 0x02, 0x92, 0x04, 0x24, 0xC1, 0xA9, 0xCB, + 0x6E, 0x02, 0x58, 0xC1, 0x3C, 0x01, 0x58, 0x81, 0x2C, 0x01, 0x2C, 0x10, 0x4C, 0x01, 0xE1, 0xF0, + 0x3C, 0x10, 0x40, 0x00, 0xD9, 0x81, 0x20, 0x00, 0x38, 0x70, 0x94, 0x15, 0xD9, 0xC1, 0x30, 0x00, + 0x0C, 0xE0, 0x00, 0x10, 0x30, 0xB7, 0x18, 0xC7, 0x56, 0x00, 0x28, 0x7E, 0x06, 0x00, 0x0C, 0x60, + 0x20, 0x00, 0xD6, 0x67, 0x82, 0x09, 0x98, 0x6E, 0x04, 0x00, 0x92, 0x06, 0x1C, 0x40, 0x21, 0x00, + 0x56, 0x74, 0xA9, 0x7E, 0x06, 0x00, 0x28, 0x6E, 0x60, 0x02, 0x18, 0x4E, 0x38, 0x01, 0x18, 0x5E, + 0x39, 0x01, 0xC4, 0x65, 0x28, 0x30, 0xA2, 0x15, 0xC2, 0x06, 0x34, 0x31, 0xA9, 0x30, 0xA2, 0x15, + 0x04, 0x71, 0xF2, 0x0B, 0xCC, 0x30, 0x14, 0x00, 0x02, 0x04, 0xA9, 0x00, 0xA2, 0x15, 0xF2, 0x04, + 0x24, 0x31, 0xA9, 0x30, 0xA2, 0x15, 0x04, 0x70, 0x14, 0x32, 0x26, 0x34, 0xC4, 0x37, 0xD2, 0x19, + 0x14, 0x47, 0x26, 0x45, 0xC4, 0x48, 0xD2, 0x2C, 0xC4, 0x70, 0x82, 0x07, 0x28, 0x5E, 0x06, 0x00, + 0x0C, 0x70, 0x23, 0x00, 0x54, 0x58, 0xF2, 0x08, 0x28, 0x5E, 0x06, 0x00, 0x28, 0x6E, 0x58, 0x02, + 0x54, 0x58, 0x0C, 0x70, 0x34, 0x00, 0xC4, 0x50, 0x82, 0x56, 0x0C, 0x70, 0x50, 0x00, 0xF2, 0x53, + 0xC4, 0x41, 0xC2, 0x03, 0xC4, 0x49, 0xC2, 0x56, 0x34, 0x53, 0xC4, 0x5C, 0xD2, 0x53, 0xC4, 0x70, + 0x82, 0x07, 0x28, 0x5E, 0x06, 0x00, 0x0C, 0x70, 0x96, 0x00, 0x54, 0x58, 0xF2, 0x2A, 0x28, 0x5E, + 0x06, 0x00, 0x28, 0x6E, 0x5A, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x32, 0x00, 0xF2, 0x22, 0xC4, 0x51, + 0xD2, 0x0E, 0xC4, 0x70, 0x82, 0x04, 0xCC, 0x60, 0x46, 0x00, 0xF2, 0x36, 0x28, 0x5E, 0x06, 0x00, + 0x28, 0x6E, 0x5C, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x32, 0x00, 0xF2, 0x29, 0x14, 0x42, 0x26, 0x45, + 0xC4, 0x44, 0xD2, 0x14, 0xC4, 0x70, 0x82, 0x06, 0x28, 0x5E, 0x06, 0x00, 0x04, 0x7F, 0x54, 0x58, + 0xF2, 0x08, 0x28, 0x5E, 0x06, 0x00, 0x28, 0x6E, 0x5C, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x6E, 0x00, + 0xC4, 0x50, 0x82, 0x19, 0x0C, 0x70, 0x3C, 0x00, 0xF2, 0x16, 0xC4, 0x5F, 0xC2, 0x1B, 0xC4, 0x70, + 0x82, 0x07, 0x28, 0x5E, 0x06, 0x00, 0x0C, 0x70, 0x1E, 0x00, 0x54, 0x58, 0xF2, 0x08, 0x28, 0x5E, + 0x06, 0x00, 0x28, 0x6E, 0x5C, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x50, 0x00, 0xC4, 0x50, 0x82, 0x03, + 0x0C, 0x70, 0x46, 0x00, 0xC6, 0x67, 0x02, 0x06, 0x18, 0x7E, 0x04, 0x00, 0xC4, 0x71, 0xCA, 0x80, + 0x01, 0x00, 0x98, 0x7E, 0x63, 0x02, 0x99, 0x0E, 0x62, 0x02, 0x82, 0x05, 0x34, 0x71, 0x99, 0x7E, + 0x63, 0x02, 0xF2, 0x08, 0x28, 0x7E, 0x06, 0x00, 0x1C, 0x60, 0x01, 0x04, 0x56, 0x76, 0xA9, 0x7E, + 0x06, 0x00, 0x0C, 0x70, 0x00, 0x20, 0xD6, 0x7B, 0x8A, 0x91, 0x00, 0x00, 0x18, 0x7E, 0x28, 0x03, + 0x04, 0x91, 0xC4, 0x70, 0x92, 0x05, 0x18, 0x9E, 0x04, 0x00, 0x16, 0x99, 0xF7, 0x9F, 0x0B, 0x81, + 0x01, 0x00, 0x98, 0x8E, 0x04, 0x00, 0x82, 0x40, 0x38, 0xD0, 0x94, 0x15, 0x28, 0x7E, 0x08, 0x00, + 0x28, 0x6D, 0x4C, 0x00, 0xC6, 0x67, 0xC2, 0x38, 0x78, 0x6E, 0x6E, 0x02, 0xB9, 0x71, 0x14, 0x00, + 0x06, 0x57, 0xD7, 0x51, 0x2F, 0x27, 0x07, 0x00, 0x26, 0x25, 0x06, 0x36, 0xB9, 0x61, 0x18, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x5D, 0x4E, 0x00, 0x38, 0x61, 0x18, 0x00, 0x38, 0x71, 0x14, 0x00, + 0xC6, 0x25, 0x32, 0x22, 0x3F, 0x26, 0x07, 0x00, 0x04, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x7D, + 0x4F, 0x00, 0xC6, 0x27, 0x32, 0x19, 0x28, 0x6E, 0x68, 0x02, 0x18, 0x7D, 0x50, 0x00, 0xC6, 0x67, + 0xC2, 0x13, 0x78, 0x7D, 0x52, 0x00, 0x38, 0x6E, 0x70, 0x02, 0xC6, 0x67, 0x32, 0x0D, 0x98, 0x70, + 0xBA, 0x15, 0x92, 0x0A, 0x98, 0x7E, 0x2E, 0x01, 0x92, 0x07, 0x28, 0x7E, 0x74, 0x02, 0xCC, 0x70, + 0x13, 0x00, 0xCA, 0x39, 0x01, 0x00, 0x38, 0x60, 0x94, 0x15, 0x38, 0x5E, 0x70, 0x02, 0x18, 0x76, + 0x54, 0x00, 0xC6, 0x57, 0x22, 0x13, 0xC4, 0x80, 0x82, 0x11, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, + 0x80, 0x00, 0x92, 0x0C, 0x18, 0x7E, 0x6D, 0x02, 0x18, 0x66, 0x57, 0x00, 0xC6, 0x67, 0xC2, 0x06, + 0xC6, 0x7C, 0xC2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x6D, 0x02, 0x18, 0x7E, 0x6D, 0x02, 0xC6, 0x7C, + 0x28, 0x7E, 0x06, 0x00, 0xD2, 0x0C, 0xC4, 0x91, 0x92, 0x0A, 0x6C, 0x70, 0x80, 0x00, 0xA9, 0x7E, + 0x06, 0x00, 0x38, 0x70, 0x94, 0x15, 0x18, 0x77, 0x58, 0x00, 0xF2, 0x16, 0x0C, 0x60, 0x80, 0x00, + 0xD6, 0x67, 0x82, 0x14, 0x98, 0x6E, 0x6C, 0x02, 0x92, 0x0D, 0x1C, 0x80, 0x81, 0x00, 0x56, 0x78, + 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, 0x94, 0x15, 0x18, 0x77, 0x55, 0x00, 0x99, 0x7E, 0x6D, 0x02, + 0xF2, 0x05, 0x06, 0x76, 0x34, 0x71, 0x99, 0x7E, 0x6C, 0x02, 0x98, 0x5E, 0x04, 0x00, 0x8A, 0x04, + 0x01, 0x00, 0x38, 0x20, 0x94, 0x15, 0x28, 0x3E, 0x06, 0x00, 0x0C, 0x40, 0x60, 0x00, 0x26, 0x42, + 0x10, 0x44, 0x18, 0x62, 0x5F, 0x00, 0x18, 0x72, 0x61, 0x00, 0xB9, 0x41, 0x04, 0x00, 0x0C, 0x40, + 0x10, 0x00, 0xD6, 0x43, 0x82, 0x07, 0xC6, 0x67, 0xC2, 0x04, 0x36, 0x67, 0x13, 0x66, 0xF2, 0x02, + 0x04, 0x61, 0x0C, 0x70, 0x18, 0x02, 0x26, 0x7E, 0x20, 0x77, 0xB1, 0x51, 0x04, 0x82, 0x04, 0x50, + 0x56, 0x8B, 0xB9, 0x71, 0x08, 0x00, 0x54, 0xB4, 0x0C, 0x70, 0xEC, 0x11, 0x06, 0xD5, 0x06, 0xC5, + 0xB9, 0x81, 0x0C, 0x00, 0xB9, 0xB1, 0x10, 0x00, 0xA8, 0x47, 0x04, 0x00, 0x82, 0x5B, 0x38, 0xA1, + 0x0C, 0x00, 0x04, 0xB0, 0xC6, 0xAB, 0x82, 0x09, 0x38, 0xF1, 0x04, 0x00, 0xC6, 0x4F, 0xC2, 0x05, + 0xB1, 0xB1, 0x6C, 0x30, 0x20, 0x00, 0x04, 0xB1, 0xB8, 0x81, 0x10, 0x00, 0x82, 0x4B, 0xC4, 0xB0, + 0x92, 0x49, 0xC6, 0x46, 0xA2, 0x47, 0x18, 0x42, 0x5E, 0x00, 0x38, 0xA1, 0x08, 0x00, 0xC6, 0x4A, + 0xB2, 0x41, 0x18, 0x47, 0x06, 0x00, 0x2F, 0xF4, 0x04, 0x00, 0x26, 0xF4, 0x26, 0xFF, 0x26, 0xFE, + 0xE8, 0x9F, 0x1A, 0x02, 0x02, 0x37, 0x06, 0xA5, 0x63, 0xA4, 0xD4, 0xA1, 0x92, 0x33, 0x70, 0x87, + 0x18, 0xAF, 0x1B, 0x02, 0xB9, 0x81, 0x1C, 0x00, 0x0C, 0x80, 0x00, 0x10, 0xD7, 0xA1, 0x26, 0xA8, + 0x38, 0x81, 0x1C, 0x00, 0xA9, 0x8A, 0x3A, 0x01, 0x78, 0x87, 0x02, 0x00, 0xA9, 0x8A, 0x3C, 0x01, + 0x04, 0xA1, 0x53, 0xA4, 0x06, 0x4A, 0x66, 0x45, 0x23, 0x54, 0x04, 0x42, 0x26, 0x4B, 0x13, 0x44, + 0x26, 0x4F, 0x18, 0xA4, 0x1A, 0x02, 0x24, 0xB1, 0x06, 0x4A, 0xD7, 0x41, 0x26, 0x4E, 0xA9, 0x04, + 0x3A, 0x01, 0xA9, 0x04, 0x3C, 0x01, 0x04, 0x41, 0x26, 0x4A, 0xD7, 0x41, 0x26, 0x4E, 0xA9, 0x04, + 0x36, 0x01, 0xC6, 0x9B, 0x04, 0x41, 0x53, 0x4A, 0x66, 0x4D, 0x23, 0xD4, 0x92, 0xE7, 0x26, 0xC9, + 0x23, 0xCC, 0x24, 0x78, 0x0C, 0xF0, 0x14, 0x12, 0xC6, 0x7F, 0x92, 0x9F, 0x30, 0x41, 0xA9, 0x3E, + 0x06, 0x00, 0xC4, 0xC0, 0x99, 0x4E, 0x04, 0x00, 0x82, 0x6A, 0x0C, 0xA0, 0x00, 0x10, 0x2C, 0xA0, + 0x38, 0x01, 0x04, 0x68, 0x26, 0x6A, 0x04, 0xB0, 0xB9, 0x61, 0x04, 0x00, 0x18, 0x7E, 0x04, 0x00, + 0xC6, 0xB7, 0x32, 0x2B, 0x06, 0x7D, 0x63, 0x7B, 0xD4, 0x71, 0x82, 0x25, 0x06, 0x7B, 0xD7, 0x71, + 0x06, 0x8B, 0xB1, 0x71, 0x04, 0x90, 0x18, 0x5E, 0x04, 0x00, 0xC6, 0x85, 0xB2, 0x1A, 0xC4, 0x84, + 0x92, 0x09, 0x0C, 0x20, 0x58, 0x11, 0x04, 0x30, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0xF2, 0x0D, 0x30, 0x21, 0x38, 0x31, 0x04, 0x00, 0x30, 0x61, 0x26, 0x2A, 0x26, 0x36, 0x26, 0x29, + 0x26, 0x39, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x24, 0x81, 0x24, 0x98, 0xF2, 0xE4, + 0xF7, 0xD0, 0x34, 0xB1, 0x24, 0xB1, 0xF2, 0xD3, 0x3F, 0xCC, 0x07, 0x00, 0x28, 0x7E, 0x06, 0x00, + 0x99, 0xCE, 0x04, 0x00, 0x6C, 0x70, 0x10, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0xF2, 0x2D, 0x28, 0x7E, + 0x06, 0x00, 0x0C, 0x60, 0x00, 0x04, 0x66, 0x67, 0xA9, 0x6E, 0x06, 0x00, 0x04, 0x68, 0xD6, 0x67, + 0x0C, 0x70, 0x28, 0x00, 0x82, 0x03, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x63, 0x02, 0x18, 0x7E, + 0x62, 0x02, 0xCC, 0x70, 0x13, 0x00, 0x1A, 0x7E, 0xFE, 0xFF, 0x24, 0x71, 0x99, 0x7E, 0x62, 0x02, + 0xFA, 0x79, 0xFE, 0xFF, 0x98, 0x7E, 0x6D, 0x02, 0x8A, 0xE1, 0xFE, 0xFF, 0x18, 0x6D, 0x59, 0x00, + 0xC6, 0x67, 0xAA, 0xDC, 0xFE, 0xFF, 0x34, 0x71, 0xFA, 0xD7, 0xFE, 0xFF, 0x1C, 0x70, 0x11, 0x00, + 0x56, 0x37, 0xA9, 0x3E, 0x06, 0x00, 0x58, 0xC1, 0x30, 0x00, 0x58, 0x81, 0x20, 0x00, 0x2C, 0x10, + 0x40, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x02, 0x00, + 0xD1, 0x81, 0x0C, 0xC0, 0x26, 0x10, 0x04, 0xE0, 0x2C, 0xD0, 0x00, 0x76, 0x06, 0x2E, 0x04, 0x3C, + 0x4B, 0x9E, 0x00, 0x00, 0x2C, 0xE0, 0x00, 0x2D, 0xC6, 0xED, 0x2C, 0x20, 0xE0, 0x01, 0xA1, 0x2C, + 0x24, 0xC2, 0x92, 0xF5, 0x08, 0xD0, 0x06, 0x00, 0x0C, 0xC0, 0x66, 0x10, 0x04, 0xE0, 0x2C, 0xD0, + 0x24, 0xDF, 0x06, 0x2E, 0x0C, 0x30, 0x14, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x2C, 0xE0, 0xF6, 0x4F, + 0xC6, 0xED, 0x2C, 0x20, 0xFF, 0x01, 0xA1, 0x2C, 0x24, 0xC2, 0x92, 0xF4, 0x08, 0xD0, 0x00, 0x80, + 0x0C, 0xC0, 0x00, 0x10, 0x0C, 0x90, 0xBA, 0x04, 0x0C, 0xE0, 0xAA, 0x14, 0x2C, 0xD0, 0x3E, 0xDC, + 0x26, 0x9C, 0x18, 0x7D, 0x05, 0x00, 0x1C, 0x20, 0xE0, 0x01, 0x2C, 0x70, 0x12, 0x00, 0x26, 0x77, + 0x26, 0x7C, 0x28, 0xA7, 0x02, 0x00, 0x04, 0x3A, 0x26, 0x2A, 0x0B, 0x9B, 0x00, 0x00, 0x10, 0x7D, + 0xA9, 0x2E, 0x04, 0x00, 0x1C, 0x20, 0xFF, 0x01, 0x2C, 0x70, 0x32, 0x00, 0x26, 0x77, 0x26, 0x7C, + 0x28, 0xB7, 0x02, 0x00, 0x04, 0x3A, 0x26, 0x2B, 0x0B, 0x9B, 0x00, 0x00, 0xA1, 0x2E, 0x0C, 0x20, + 0xE0, 0x01, 0x04, 0x3A, 0x26, 0x2A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2E, 0x06, 0x00, 0x0C, 0x20, + 0xFF, 0x01, 0x26, 0x2B, 0x04, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0x24, 0xE8, + 0xC6, 0xE9, 0x24, 0xD1, 0x92, 0xCF, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0x94, 0x15, 0x06, 0x72, 0x28, 0x66, 0xB0, 0x00, 0xC4, 0x70, + 0x13, 0x56, 0x32, 0x02, 0x16, 0x27, 0xC6, 0x25, 0x02, 0x0B, 0xC6, 0x75, 0x0C, 0x40, 0xFF, 0x00, + 0x56, 0x46, 0x02, 0x04, 0x3F, 0x44, 0x03, 0x00, 0xF2, 0x02, 0x26, 0x43, 0x23, 0x44, 0x06, 0x24, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x24, 0x00, 0xD9, 0xC1, 0x14, 0x00, + 0xD9, 0x81, 0x04, 0x00, 0x30, 0x77, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x41, 0x0C, 0xC0, 0x00, 0x10, + 0x98, 0x9C, 0x27, 0x03, 0x82, 0x3C, 0x98, 0x8C, 0x28, 0x03, 0x82, 0x39, 0x0C, 0xE0, 0x78, 0x12, + 0x04, 0xD0, 0xC6, 0xD9, 0x32, 0x34, 0x06, 0x6A, 0x0C, 0x60, 0xD2, 0x12, 0x04, 0x70, 0xC6, 0x78, + 0x32, 0x2A, 0x2C, 0x60, 0x10, 0x00, 0x1C, 0x50, 0x10, 0x00, 0x26, 0x56, 0x18, 0x4E, 0x0A, 0x00, + 0x10, 0x55, 0xC6, 0x45, 0x92, 0x1E, 0x24, 0x75, 0x57, 0x72, 0x26, 0x7C, 0x78, 0x47, 0x78, 0x02, + 0x78, 0xB7, 0x7A, 0x02, 0x70, 0x3E, 0x78, 0x7E, 0x02, 0x00, 0x3F, 0x24, 0x03, 0x00, 0x36, 0x7B, + 0x23, 0x33, 0x23, 0x44, 0xB1, 0x71, 0xAB, 0xC0, 0x01, 0x00, 0xA1, 0x2E, 0x30, 0x71, 0x28, 0x3E, + 0x02, 0x00, 0x06, 0x27, 0x23, 0x4B, 0xAB, 0xC0, 0x01, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0xF2, 0x03, + 0x24, 0x71, 0xF2, 0xD6, 0x24, 0xD1, 0x2C, 0xE0, 0x10, 0x00, 0xF2, 0xCC, 0x58, 0xC1, 0x14, 0x00, + 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC6, 0x34, 0x3C, 0x10, + 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x06, 0xE2, 0x78, 0xA1, 0x20, 0x00, 0x78, 0xC1, + 0x24, 0x00, 0x78, 0xD1, 0x28, 0x00, 0x32, 0x05, 0xA1, 0xC2, 0xA9, 0xD2, 0x02, 0x00, 0xF2, 0x20, + 0xC6, 0x35, 0x22, 0x05, 0xA1, 0x62, 0xA9, 0xA2, 0x02, 0x00, 0xF2, 0x1A, 0x3F, 0x94, 0x03, 0x00, + 0x06, 0x29, 0x3F, 0x3C, 0x06, 0x00, 0x3F, 0xB4, 0x05, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3B, + 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x2C, 0xA1, 0x2E, 0x3F, 0x3D, 0x0A, 0x00, 0x06, 0x29, 0xAB, 0x97, + 0x00, 0x00, 0x06, 0x3B, 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x2D, 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x2F, 0x72, 0x02, 0x00, + 0x26, 0x72, 0x06, 0x67, 0x57, 0x62, 0x26, 0x76, 0x26, 0x27, 0x0C, 0x70, 0x00, 0x10, 0x2C, 0x20, + 0x3C, 0x03, 0x26, 0x27, 0x06, 0x72, 0x04, 0x69, 0x34, 0x61, 0xC4, 0x60, 0xA9, 0x07, 0x24, 0x00, + 0xA9, 0x07, 0x26, 0x00, 0x34, 0x74, 0x92, 0xF9, 0x04, 0x71, 0x99, 0x72, 0x28, 0x00, 0x38, 0x70, + 0x94, 0x15, 0xA9, 0x02, 0x2A, 0x00, 0x18, 0x77, 0x98, 0x00, 0x99, 0x02, 0x2D, 0x00, 0xA9, 0x02, + 0x32, 0x00, 0x99, 0x72, 0x2C, 0x00, 0x14, 0x71, 0xA9, 0x02, 0x30, 0x00, 0xA9, 0x02, 0x2E, 0x00, + 0xA1, 0x72, 0xA9, 0x72, 0x02, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, + 0xEB, 0xCA, 0x01, 0x00, 0x24, 0xE1, 0xC4, 0xE5, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x8C, 0x00, 0x0C, 0x60, 0xAE, 0x00, 0xD9, 0xC1, 0x7C, 0x00, + 0xD9, 0x81, 0x6C, 0x00, 0x26, 0x67, 0x10, 0x66, 0xB9, 0x61, 0x3C, 0x00, 0x30, 0x67, 0xD4, 0x68, + 0x8A, 0x95, 0x03, 0x00, 0x18, 0xB7, 0x96, 0x00, 0x06, 0xD7, 0x04, 0xE0, 0x28, 0x2D, 0x9A, 0x00, + 0x04, 0xCC, 0x26, 0xC1, 0x06, 0x3B, 0xAB, 0x97, 0x00, 0x00, 0x26, 0xCE, 0x24, 0xE4, 0xCC, 0xE0, + 0x28, 0x00, 0xB1, 0x2C, 0x24, 0xD2, 0x92, 0xF3, 0x0C, 0xD0, 0x00, 0x10, 0x98, 0x7D, 0x27, 0x03, + 0x92, 0x05, 0xCB, 0xCD, 0x01, 0x00, 0xFA, 0x7A, 0x03, 0x00, 0x04, 0x70, 0x06, 0xED, 0xB9, 0x71, + 0x38, 0x00, 0x38, 0x71, 0x38, 0x00, 0x26, 0x7D, 0xE8, 0xA7, 0x1D, 0x03, 0x82, 0x15, 0x0C, 0x60, + 0x94, 0x15, 0x30, 0x76, 0x34, 0xA1, 0x98, 0x77, 0xAF, 0x00, 0x57, 0xA2, 0x26, 0xAD, 0x0C, 0xB0, + 0x78, 0x02, 0x26, 0xBA, 0x9A, 0xD3, 0x00, 0x00, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x25, 0x01, 0x00, + 0xC4, 0x20, 0x9A, 0xCC, 0x00, 0x00, 0x38, 0x21, 0x38, 0x00, 0xEB, 0xCA, 0x01, 0x00, 0x38, 0x71, + 0x38, 0x00, 0x2C, 0xE0, 0x34, 0x00, 0x24, 0x71, 0xC4, 0x75, 0xB9, 0x71, 0x38, 0x00, 0x92, 0xDA, + 0x18, 0x6D, 0x82, 0x02, 0x99, 0x0D, 0x37, 0x03, 0x34, 0x61, 0x2F, 0x76, 0x06, 0x00, 0x26, 0x76, + 0x06, 0x57, 0x57, 0x52, 0x26, 0x75, 0x26, 0x76, 0x2C, 0x70, 0x3C, 0x03, 0x26, 0x7D, 0x78, 0x57, + 0x08, 0x00, 0x78, 0x67, 0x04, 0x00, 0x36, 0x65, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0xCC, 0x60, + 0x40, 0x01, 0x02, 0x06, 0xC4, 0x50, 0x82, 0x04, 0x04, 0x61, 0x99, 0x6D, 0x37, 0x03, 0x18, 0x6D, + 0x27, 0x03, 0xC4, 0x61, 0x9A, 0x87, 0x00, 0x00, 0x98, 0x6D, 0x28, 0x03, 0x8A, 0x1E, 0x03, 0x00, + 0xF8, 0x67, 0x08, 0x00, 0x8A, 0x1A, 0x03, 0x00, 0xF8, 0x57, 0x0A, 0x00, 0x8A, 0x16, 0x03, 0x00, + 0xF8, 0x57, 0x04, 0x00, 0x8A, 0x12, 0x03, 0x00, 0xF8, 0x47, 0x06, 0x00, 0x8A, 0x0E, 0x03, 0x00, + 0x3F, 0x66, 0x05, 0x00, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0x38, 0x30, 0x94, 0x15, 0x28, 0x53, + 0x7C, 0x00, 0xC6, 0x65, 0x02, 0x1E, 0x18, 0x4D, 0x34, 0x03, 0x04, 0x61, 0x5C, 0x40, 0xFC, 0x00, + 0x99, 0x4D, 0x34, 0x03, 0x99, 0x6D, 0x32, 0x03, 0x78, 0xF7, 0x04, 0x00, 0x78, 0x27, 0x08, 0x00, + 0xC6, 0xF2, 0x02, 0x07, 0x64, 0x41, 0x99, 0x4D, 0x34, 0x03, 0x04, 0x61, 0x04, 0x50, 0xF2, 0x10, + 0xC6, 0xF2, 0x04, 0x61, 0x04, 0x50, 0x32, 0x0C, 0x64, 0x42, 0x99, 0x4D, 0x34, 0x03, 0xF2, 0x08, + 0xCC, 0x60, 0x10, 0x00, 0x04, 0x51, 0x12, 0x02, 0x04, 0x50, 0x13, 0x55, 0x04, 0x60, 0x78, 0x27, + 0x06, 0x00, 0x78, 0x47, 0x0A, 0x00, 0x3F, 0x44, 0x02, 0x00, 0xC4, 0x40, 0x32, 0x02, 0x16, 0x44, + 0x28, 0x33, 0x7C, 0x00, 0xC6, 0x43, 0x02, 0x1A, 0x18, 0x4D, 0x34, 0x03, 0x04, 0x31, 0x5C, 0x40, + 0xF3, 0x00, 0x99, 0x4D, 0x34, 0x03, 0x99, 0x3D, 0x32, 0x03, 0x78, 0x37, 0x06, 0x00, 0x78, 0x77, + 0x0A, 0x00, 0xC6, 0x37, 0x02, 0x03, 0x64, 0x44, 0xF2, 0x04, 0xC6, 0x37, 0x32, 0x04, 0x64, 0x48, + 0x99, 0x4D, 0x34, 0x03, 0x24, 0x61, 0x13, 0x66, 0xF2, 0x06, 0xCC, 0x40, 0x10, 0x00, 0x02, 0x03, + 0x24, 0x51, 0x13, 0x55, 0x98, 0x7D, 0x35, 0x03, 0x92, 0x11, 0xC4, 0x52, 0x92, 0x0C, 0x18, 0x7D, + 0x33, 0x03, 0xCC, 0x70, 0xFF, 0x00, 0x8A, 0xA9, 0x02, 0x00, 0x24, 0x71, 0x99, 0x7D, 0x33, 0x03, + 0xFA, 0xA4, 0x02, 0x00, 0xC4, 0x60, 0x8A, 0xA1, 0x02, 0x00, 0x99, 0x0D, 0x33, 0x03, 0xFA, 0x9D, + 0x02, 0x00, 0xC4, 0x62, 0x9A, 0xA3, 0x02, 0x00, 0x0C, 0x70, 0xA6, 0x00, 0x26, 0x7D, 0x0C, 0x30, + 0x78, 0x02, 0x06, 0x27, 0x26, 0x3D, 0x04, 0x44, 0x6B, 0xCF, 0x03, 0x00, 0x06, 0x72, 0x04, 0x24, + 0x26, 0x27, 0x0C, 0x30, 0x88, 0x02, 0xFA, 0x8E, 0x02, 0x00, 0x78, 0x7A, 0x78, 0x02, 0xCC, 0x70, + 0x7F, 0x04, 0x1A, 0x36, 0xFF, 0xFF, 0x78, 0x7A, 0x7A, 0x02, 0xCC, 0x70, 0xFE, 0x07, 0x1A, 0x30, + 0xFF, 0xFF, 0x0C, 0xC0, 0x3C, 0x03, 0x26, 0xCE, 0x06, 0x7C, 0x04, 0x68, 0x28, 0x57, 0x20, 0x00, + 0x34, 0x61, 0xA9, 0x57, 0x24, 0x00, 0x28, 0x57, 0x22, 0x00, 0xC4, 0x60, 0xA9, 0x57, 0x26, 0x00, + 0x34, 0x74, 0x92, 0xF5, 0x0C, 0x20, 0x40, 0x03, 0x06, 0x3B, 0x26, 0x2E, 0x04, 0x44, 0x6B, 0xCF, + 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, 0x30, 0x01, 0x18, 0x7E, 0x64, 0x03, 0x78, 0x2E, 0x40, 0x03, + 0x78, 0x3E, 0x44, 0x03, 0xC4, 0x71, 0xC2, 0x12, 0x3F, 0x73, 0x02, 0x00, 0xC4, 0x70, 0x32, 0x02, + 0x16, 0x77, 0x43, 0x67, 0x78, 0x5E, 0x42, 0x03, 0x78, 0x7E, 0x46, 0x03, 0x3F, 0x77, 0x05, 0x00, + 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x43, 0x87, 0xF2, 0x04, 0x0C, 0x80, 0xA0, 0x00, 0x06, 0x68, + 0xB9, 0x61, 0x68, 0x00, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0x06, 0x92, 0x78, 0x3E, 0x46, 0x03, + 0x78, 0x2E, 0x42, 0x03, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0x78, 0x3E, 0x48, 0x03, 0xB9, 0x21, + 0x34, 0x00, 0x06, 0x29, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x40, 0x00, 0x78, 0x3E, + 0x4A, 0x03, 0x38, 0x21, 0x34, 0x00, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x44, 0x00, + 0x78, 0x3E, 0x4C, 0x03, 0x78, 0x4E, 0x50, 0x03, 0x38, 0x21, 0x40, 0x00, 0x0C, 0xF0, 0xD8, 0x00, + 0xF1, 0xF0, 0xB9, 0x21, 0x48, 0x00, 0x78, 0x3E, 0x4E, 0x03, 0x78, 0x4E, 0x52, 0x03, 0x38, 0x21, + 0x44, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x4C, 0x00, 0x78, 0x3E, 0x54, 0x03, + 0x78, 0x4E, 0x58, 0x03, 0x38, 0x21, 0x48, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0x50, 0x00, 0x78, 0x3E, 0x56, 0x03, 0x78, 0x4E, 0x5A, 0x03, 0x38, 0x21, 0x4C, 0x00, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x54, 0x00, 0x78, 0x3E, 0x5C, 0x03, 0x78, 0x4E, 0x60, 0x03, + 0x38, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x58, 0x00, 0x78, 0x3E, + 0x5E, 0x03, 0x78, 0x4E, 0x62, 0x03, 0x38, 0x21, 0x54, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0x38, 0x61, 0x68, 0x00, 0xB9, 0x21, 0x5C, 0x00, 0x06, 0x38, 0x06, 0x26, 0x0C, 0xF0, 0x80, 0x00, + 0xF1, 0xF0, 0x99, 0x20, 0xB7, 0x15, 0x28, 0x7E, 0x6C, 0x03, 0x04, 0x31, 0xA9, 0x7E, 0x6E, 0x03, + 0x28, 0x7E, 0x6A, 0x03, 0xA9, 0x2E, 0x6A, 0x03, 0xA9, 0x7E, 0x6C, 0x03, 0x18, 0x7E, 0x69, 0x03, + 0x26, 0x37, 0x26, 0x77, 0x2F, 0x63, 0x03, 0x00, 0x26, 0xC7, 0x04, 0x70, 0x16, 0x66, 0x06, 0x27, + 0x2F, 0x57, 0x0C, 0x00, 0x34, 0x72, 0x78, 0x55, 0x2E, 0x00, 0xC6, 0x76, 0x26, 0x25, 0x92, 0xF9, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x10, 0x00, 0x06, 0xC2, 0xB9, 0x71, 0x60, 0x00, 0x38, 0x61, + 0x60, 0x00, 0x04, 0x71, 0xC6, 0x26, 0x02, 0x11, 0x38, 0x61, 0x18, 0x00, 0x04, 0x72, 0xC6, 0x26, + 0x02, 0x0C, 0x38, 0x61, 0x20, 0x00, 0x04, 0x73, 0xC6, 0x26, 0x02, 0x07, 0x38, 0x61, 0x28, 0x00, + 0x04, 0x75, 0xC6, 0x26, 0x12, 0x02, 0x04, 0x74, 0x18, 0x6E, 0x68, 0x03, 0x3F, 0x36, 0x07, 0x00, + 0x0C, 0x70, 0x94, 0x15, 0x30, 0x47, 0x78, 0x7E, 0x66, 0x03, 0x18, 0x24, 0x97, 0x00, 0xC4, 0x30, + 0x16, 0x52, 0x02, 0x04, 0xC6, 0x72, 0x92, 0x0F, 0xF2, 0x05, 0xC4, 0x30, 0x82, 0x06, 0xC6, 0x75, + 0x92, 0x06, 0xA9, 0x0E, 0x66, 0x03, 0xF2, 0x0A, 0xC4, 0x70, 0x02, 0x03, 0x34, 0x71, 0xF2, 0x04, + 0xC4, 0x70, 0x82, 0x04, 0x24, 0x71, 0xA9, 0x7E, 0x66, 0x03, 0x78, 0x7E, 0x66, 0x03, 0x18, 0x44, + 0x97, 0x00, 0xC6, 0x74, 0x92, 0x05, 0xC4, 0x64, 0xD2, 0x03, 0x24, 0x61, 0xF2, 0x0E, 0x28, 0x4D, + 0x06, 0x00, 0xD4, 0x48, 0x82, 0x05, 0xC6, 0x75, 0x92, 0x0A, 0xC4, 0x61, 0xF2, 0x04, 0xC6, 0x75, + 0x92, 0x06, 0xC4, 0x63, 0xC2, 0x04, 0x34, 0x61, 0x99, 0x6E, 0x68, 0x03, 0x18, 0x5E, 0x64, 0x03, + 0x38, 0x21, 0x58, 0x00, 0x06, 0x35, 0xB9, 0x51, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x51, + 0x64, 0x00, 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, 0x06, 0x35, 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x4E, + 0x68, 0x03, 0x38, 0x51, 0x64, 0x00, 0xC4, 0x41, 0x43, 0x72, 0x92, 0x35, 0xC4, 0x58, 0xC2, 0x0E, + 0x38, 0x21, 0x58, 0x00, 0x04, 0x39, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, + 0x04, 0x39, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x56, 0xC2, 0x15, 0x38, 0x21, + 0x50, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x37, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, + 0x54, 0x00, 0x04, 0x37, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, + 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, + 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x0C, 0x00, 0x38, 0x51, 0x60, 0x00, + 0xFA, 0x9C, 0x00, 0x00, 0xC4, 0x42, 0x92, 0x34, 0xC4, 0x56, 0xC2, 0x0E, 0x38, 0x21, 0x50, 0x00, + 0x04, 0x37, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x54, 0x00, 0x04, 0x37, 0x4B, 0x9E, + 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x54, 0xC2, 0x15, 0x38, 0x21, 0x48, 0x00, 0xB9, 0x71, + 0x64, 0x00, 0x04, 0x35, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, + 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, + 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x14, 0x00, 0x38, 0x51, 0x18, 0x00, 0xF2, 0x66, 0xC4, 0x43, + 0x92, 0x34, 0xC4, 0x54, 0xC2, 0x0E, 0x38, 0x21, 0x48, 0x00, 0x04, 0x35, 0x4B, 0x9E, 0x00, 0x00, + 0x43, 0x82, 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, + 0xC4, 0x52, 0xC2, 0x15, 0x38, 0x21, 0x40, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x33, 0x4B, 0x9E, + 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x44, 0x00, 0x04, 0x33, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, + 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, + 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, + 0x1C, 0x00, 0x38, 0x51, 0x20, 0x00, 0xF2, 0x31, 0xC4, 0x44, 0x92, 0x31, 0xC4, 0x52, 0xC2, 0x0E, + 0x38, 0x21, 0x40, 0x00, 0x04, 0x33, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x44, 0x00, + 0x04, 0x33, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x52, 0x92, 0x11, 0x38, 0x41, + 0x34, 0x00, 0x38, 0x61, 0x34, 0x00, 0x06, 0x59, 0xF7, 0x5F, 0xF7, 0x4F, 0x26, 0x59, 0x26, 0x46, + 0xE7, 0x50, 0xE7, 0x40, 0x06, 0x28, 0x06, 0x37, 0x43, 0x85, 0x43, 0x74, 0xF2, 0x03, 0x06, 0x28, + 0x06, 0x37, 0x38, 0x41, 0x24, 0x00, 0x38, 0x51, 0x28, 0x00, 0xB9, 0x21, 0x04, 0x00, 0xB9, 0x31, + 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x68, 0xF2, 0x20, 0xC4, 0x51, 0xC2, 0x0E, + 0x06, 0x69, 0xF7, 0x6F, 0x26, 0x69, 0xE7, 0x60, 0x38, 0x71, 0x34, 0x00, 0x43, 0x86, 0x38, 0x61, + 0x34, 0x00, 0xF7, 0x7F, 0x26, 0x76, 0xE7, 0x70, 0x43, 0x77, 0x78, 0x5E, 0x42, 0x03, 0x78, 0xFE, + 0x40, 0x03, 0x38, 0x41, 0x2C, 0x00, 0xB1, 0x51, 0x38, 0x51, 0x30, 0x00, 0xB9, 0x81, 0x04, 0x00, + 0xB9, 0x71, 0x08, 0x00, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x6F, 0x6B, 0xC7, 0x01, 0x00, 0x18, 0x7E, + 0x64, 0x03, 0xC4, 0x78, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x64, 0x03, 0x18, 0x7E, 0x69, 0x03, + 0xC4, 0x71, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x69, 0x03, 0x18, 0x7A, 0x82, 0x02, 0x34, 0x71, + 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, 0x06, 0x96, 0x57, 0x92, 0x26, 0x69, 0x26, 0x76, 0x2C, 0x70, + 0x3C, 0x03, 0x2F, 0x97, 0x0D, 0x00, 0xF0, 0x29, 0x22, 0x39, 0xF8, 0x79, 0x02, 0x00, 0x22, 0x36, + 0x38, 0x61, 0x3C, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x0C, 0xC0, 0x64, 0x00, 0x06, 0x8C, 0x36, 0x86, + 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, 0x06, 0x62, 0x38, 0x31, + 0x3C, 0x00, 0x78, 0x2A, 0x78, 0x02, 0xB9, 0x61, 0x68, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x61, 0x68, 0x00, 0x38, 0x71, 0x64, 0x00, 0x26, 0x26, 0x06, 0x38, + 0xA9, 0x2A, 0x78, 0x02, 0x06, 0x27, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, + 0x06, 0x82, 0x38, 0x31, 0x3C, 0x00, 0x78, 0x2A, 0x7A, 0x02, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, + 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x28, 0xA9, 0x2A, 0x7A, 0x02, 0x06, 0x29, 0x06, 0x3B, 0x04, 0x44, + 0x6B, 0xCF, 0x03, 0x00, 0xFA, 0xB5, 0xFC, 0xFF, 0x0C, 0x20, 0xA6, 0x00, 0x26, 0x2D, 0x0C, 0x30, + 0x78, 0x02, 0x26, 0x3D, 0x04, 0x44, 0x6B, 0xCF, 0x03, 0x00, 0x58, 0xC1, 0x7C, 0x00, 0x58, 0x81, + 0x6C, 0x00, 0x2C, 0x10, 0x8C, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0xEC, 0x11, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x1A, 0x12, + 0x14, 0x31, 0x0C, 0x40, 0x3C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, + 0x00, 0x10, 0xA9, 0x07, 0x22, 0x00, 0xA9, 0x07, 0x74, 0x02, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x44, 0x03, 0xD9, 0xC1, 0x34, 0x03, 0x38, 0xD0, 0x94, 0x15, 0xD9, 0x81, 0x24, 0x03, + 0x0C, 0xE0, 0x00, 0x10, 0x18, 0xCD, 0x5A, 0x00, 0xA9, 0x0E, 0x68, 0x02, 0x18, 0x3D, 0x48, 0x00, + 0x28, 0x2E, 0x08, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, + 0x23, 0x22, 0xA9, 0x2E, 0x6A, 0x02, 0x28, 0x7D, 0x4A, 0x00, 0xC6, 0x27, 0xB2, 0x03, 0xA9, 0x7E, + 0x6A, 0x02, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x08, 0x18, 0x7D, 0x62, 0x00, + 0x36, 0xC7, 0xC4, 0xC0, 0x12, 0x02, 0x04, 0xC1, 0x13, 0xCC, 0x0C, 0x20, 0xE0, 0x02, 0x26, 0x21, + 0x04, 0x30, 0x04, 0x4A, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, + 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x40, 0x02, 0x26, 0x21, 0x04, 0x30, + 0x0C, 0x40, 0x78, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xB8, 0x02, 0x0C, 0x40, + 0x28, 0x00, 0x26, 0x21, 0x04, 0x30, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x2E, 0x08, 0x00, + 0xA9, 0x0E, 0x14, 0x02, 0x06, 0x3C, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, + 0x00, 0x00, 0x28, 0x7E, 0x0E, 0x00, 0x04, 0x60, 0x26, 0x27, 0xA9, 0x2E, 0x16, 0x02, 0xB9, 0x61, + 0xEC, 0x02, 0x06, 0x86, 0x04, 0xA1, 0x06, 0xC6, 0x2F, 0x78, 0x08, 0x00, 0x26, 0x7E, 0xB9, 0x71, + 0x10, 0x03, 0x04, 0xD0, 0x38, 0x71, 0xEC, 0x02, 0x26, 0x7D, 0x23, 0x77, 0x0C, 0x60, 0x80, 0x02, + 0xB9, 0x71, 0xF0, 0x02, 0x26, 0x77, 0x26, 0x76, 0x70, 0x77, 0x28, 0x6E, 0x6A, 0x02, 0xC6, 0x76, + 0x02, 0x06, 0x28, 0x6E, 0x68, 0x02, 0x24, 0x61, 0xA9, 0x6E, 0x68, 0x02, 0x0C, 0x40, 0x16, 0x02, + 0x26, 0x4E, 0x70, 0x44, 0xC6, 0x74, 0xB9, 0x41, 0xF4, 0x02, 0x0A, 0xE7, 0x00, 0x00, 0x2F, 0x7D, + 0x0D, 0x00, 0x04, 0xB0, 0x26, 0x7E, 0xB9, 0x71, 0x0C, 0x03, 0xB9, 0xB1, 0xF8, 0x02, 0xB9, 0xB1, + 0xFC, 0x02, 0xB9, 0xB1, 0x00, 0x03, 0x06, 0x6B, 0xB9, 0xB1, 0x04, 0x03, 0x06, 0x5B, 0x38, 0x91, + 0xF0, 0x02, 0x38, 0x21, 0xF4, 0x02, 0x23, 0x7B, 0x26, 0x97, 0x23, 0x99, 0x2F, 0x49, 0x09, 0x00, + 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x4F, 0x70, 0x44, 0xC6, 0x42, 0x0A, 0x8A, 0x00, 0x00, 0x13, 0x3C, + 0xB9, 0x31, 0x08, 0x03, 0x38, 0xF1, 0x08, 0x03, 0x36, 0x42, 0x38, 0x21, 0x0C, 0x03, 0x2F, 0x39, + 0x01, 0x00, 0x91, 0xF3, 0x2F, 0x3B, 0x0B, 0x00, 0x26, 0x32, 0x28, 0x33, 0x26, 0x00, 0xB9, 0x51, + 0x14, 0x03, 0x06, 0x24, 0xB9, 0x61, 0x18, 0x03, 0xB9, 0x71, 0x20, 0x03, 0xB9, 0x41, 0x1C, 0x03, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x31, 0xF8, 0x02, 0x38, 0xF1, 0x10, 0x03, 0x38, 0x41, 0x1C, 0x03, + 0x26, 0x32, 0xB9, 0x31, 0xF8, 0x02, 0x28, 0x3F, 0x66, 0x00, 0x06, 0x24, 0xAB, 0x97, 0x00, 0x00, + 0x38, 0x31, 0xFC, 0x02, 0x38, 0xF1, 0x00, 0x03, 0x38, 0x41, 0x1C, 0x03, 0x38, 0x71, 0x20, 0x03, + 0x38, 0x51, 0x14, 0x03, 0x38, 0x61, 0x18, 0x03, 0xC4, 0x80, 0x26, 0x32, 0x26, 0xF4, 0x24, 0x71, + 0xB9, 0x31, 0xFC, 0x02, 0xB9, 0xF1, 0x00, 0x03, 0x23, 0x77, 0x82, 0x45, 0xC4, 0x50, 0x14, 0x4E, + 0x26, 0x41, 0x26, 0x49, 0x92, 0x14, 0x90, 0x44, 0x92, 0x0F, 0xC4, 0xD0, 0x82, 0x08, 0x14, 0x4F, + 0x26, 0x41, 0x26, 0x49, 0x90, 0x44, 0x92, 0x08, 0xC4, 0xDD, 0x82, 0x35, 0x14, 0x2D, 0x26, 0x21, + 0x26, 0x92, 0x90, 0x49, 0x82, 0x30, 0x06, 0xC4, 0x04, 0x51, 0xF2, 0x2D, 0x90, 0x44, 0x82, 0x04, + 0xC6, 0x4C, 0x9A, 0x84, 0x01, 0x00, 0xC4, 0xD0, 0x82, 0x0B, 0x14, 0x4F, 0x26, 0x41, 0x26, 0x49, + 0x90, 0x44, 0x82, 0x04, 0xC6, 0x4C, 0x9A, 0x7A, 0x01, 0x00, 0xC4, 0xDD, 0x82, 0x09, 0x14, 0x3D, + 0x26, 0x31, 0x26, 0x93, 0x90, 0x49, 0x82, 0x04, 0xC6, 0x4C, 0x9A, 0x70, 0x01, 0x00, 0xB8, 0x41, + 0x04, 0x03, 0x82, 0x11, 0xC4, 0x64, 0xD2, 0x0F, 0xC4, 0xC4, 0xD2, 0x0D, 0xC6, 0xC6, 0x0C, 0x40, + 0xE0, 0x02, 0x26, 0x41, 0xC2, 0x04, 0x26, 0x4C, 0x91, 0x64, 0xF2, 0x05, 0x38, 0xF1, 0x08, 0x03, + 0x26, 0x46, 0x91, 0xF4, 0x24, 0xD1, 0xC4, 0xDE, 0x24, 0xB1, 0x9A, 0x6A, 0xFF, 0xFF, 0x14, 0x61, + 0x26, 0x6A, 0xC4, 0x68, 0xD2, 0x3A, 0xC4, 0x50, 0x92, 0x03, 0x06, 0xCA, 0x24, 0xA1, 0x38, 0x21, + 0xF0, 0x02, 0xB9, 0x71, 0x20, 0x03, 0x06, 0x47, 0x26, 0x21, 0x33, 0x3C, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x14, 0x51, 0x26, 0x5C, 0x2F, 0x65, 0x05, 0x00, 0x26, 0x65, 0x57, 0x61, 0x26, 0x61, + 0x38, 0x46, 0x40, 0x02, 0x38, 0x21, 0xF8, 0x02, 0x38, 0x31, 0xFC, 0x02, 0x38, 0xF1, 0x00, 0x03, + 0x38, 0x71, 0x20, 0x03, 0x26, 0x42, 0xB9, 0x46, 0x40, 0x02, 0x38, 0x46, 0x44, 0x02, 0x57, 0x51, + 0x26, 0x43, 0xB9, 0x46, 0x44, 0x02, 0x38, 0x46, 0x48, 0x02, 0x26, 0x4F, 0xB9, 0x46, 0x48, 0x02, + 0x2F, 0x65, 0x01, 0x00, 0x28, 0x56, 0xB8, 0x02, 0x99, 0x86, 0xBB, 0x02, 0x26, 0x75, 0xA9, 0x76, + 0xB8, 0x02, 0x04, 0x71, 0x99, 0x76, 0xBA, 0x02, 0x24, 0xD1, 0xC4, 0xDD, 0x0A, 0xFC, 0xFE, 0xFF, + 0x38, 0x71, 0xEC, 0x02, 0x24, 0x81, 0x24, 0x7E, 0xCC, 0x80, 0x16, 0x00, 0x23, 0x77, 0xB9, 0x71, + 0xEC, 0x02, 0x9A, 0xEB, 0xFE, 0xFF, 0x14, 0x91, 0x26, 0x9A, 0xC4, 0x99, 0xC2, 0x09, 0x18, 0x8E, + 0x04, 0x00, 0x28, 0xCE, 0x22, 0x00, 0x06, 0xDE, 0x04, 0xB0, 0xFA, 0xF0, 0x00, 0x00, 0x14, 0xB2, + 0x26, 0xBA, 0x2F, 0xDB, 0x0B, 0x00, 0x06, 0xCA, 0x26, 0xDB, 0x0C, 0x20, 0x40, 0x02, 0x57, 0xC1, + 0x57, 0xD1, 0x26, 0x21, 0x26, 0xC1, 0x0C, 0x70, 0xAC, 0x02, 0x06, 0x89, 0x26, 0xD2, 0x2C, 0xC0, + 0xB0, 0x02, 0x26, 0x71, 0xC4, 0x80, 0x82, 0x45, 0x0C, 0x60, 0xE0, 0x02, 0x26, 0x61, 0x26, 0x68, + 0x10, 0x66, 0x34, 0x61, 0x13, 0x56, 0xC4, 0x59, 0xD2, 0x38, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x56, + 0x57, 0x51, 0x26, 0x51, 0x30, 0x3D, 0x38, 0x45, 0x40, 0x02, 0x57, 0x61, 0x26, 0x43, 0xB9, 0x45, + 0x40, 0x02, 0x38, 0x3D, 0x04, 0x00, 0x38, 0x45, 0x44, 0x02, 0x26, 0x61, 0x26, 0x43, 0xB9, 0x45, + 0x44, 0x02, 0x38, 0x3D, 0x08, 0x00, 0x38, 0x45, 0x48, 0x02, 0x06, 0x2D, 0x26, 0x43, 0xB9, 0x45, + 0x48, 0x02, 0x20, 0x4C, 0x28, 0x56, 0xB8, 0x02, 0x04, 0x3C, 0x26, 0x54, 0xA9, 0x56, 0xB8, 0x02, + 0x3F, 0x4D, 0x07, 0x00, 0x26, 0x3D, 0xB9, 0x71, 0x20, 0x03, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, + 0x0C, 0x40, 0xDC, 0x02, 0x04, 0x34, 0x26, 0x41, 0x06, 0x2C, 0x26, 0x3C, 0x36, 0x4C, 0x0C, 0xF0, + 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x71, 0x20, 0x03, 0x34, 0x81, 0x34, 0xDC, 0x34, 0xC4, 0xF2, 0xBB, + 0x0C, 0x70, 0xE0, 0x02, 0x26, 0x71, 0x26, 0x7B, 0x06, 0x6A, 0xC4, 0x61, 0x82, 0x1C, 0x98, 0x57, + 0x01, 0x00, 0x82, 0x16, 0x90, 0x57, 0x82, 0x14, 0x06, 0x56, 0xC6, 0x59, 0xD2, 0x0E, 0x0C, 0x40, + 0xE0, 0x02, 0x26, 0x41, 0x26, 0x45, 0x18, 0x27, 0x01, 0x00, 0x10, 0x34, 0xC6, 0x23, 0x92, 0x03, + 0x10, 0x37, 0x91, 0x34, 0x24, 0x51, 0xF2, 0xF2, 0x10, 0x57, 0x99, 0x57, 0x01, 0x00, 0x34, 0x61, + 0x34, 0x71, 0xF2, 0xE4, 0x06, 0x76, 0xC6, 0x7A, 0x8A, 0x7B, 0xFF, 0xFF, 0x0C, 0x50, 0xE0, 0x02, + 0x26, 0x51, 0x26, 0x57, 0x90, 0x45, 0x92, 0x03, 0x91, 0x65, 0x24, 0x61, 0x24, 0x71, 0xF2, 0xF4, + 0x18, 0x7D, 0x39, 0x01, 0x0C, 0x30, 0xE0, 0x02, 0x26, 0x77, 0x06, 0x67, 0xD7, 0x61, 0x3F, 0x77, + 0x06, 0x00, 0x18, 0x6D, 0x38, 0x01, 0x26, 0x31, 0x26, 0x76, 0x23, 0x77, 0x26, 0x71, 0x10, 0x77, + 0x26, 0x73, 0x10, 0x57, 0x14, 0x71, 0x26, 0x75, 0xB3, 0x77, 0x22, 0x4E, 0x06, 0x67, 0x57, 0x61, + 0x26, 0x61, 0x28, 0x46, 0xB8, 0x02, 0x99, 0x5D, 0xF2, 0x01, 0x2F, 0x35, 0x05, 0x00, 0x2F, 0x65, + 0x03, 0x00, 0x26, 0x66, 0x2F, 0xF6, 0x0E, 0x00, 0xA9, 0x4D, 0xF0, 0x01, 0x04, 0x61, 0x2F, 0x26, + 0x0F, 0x00, 0xE8, 0x22, 0x1A, 0x02, 0x32, 0x3D, 0x26, 0x53, 0x26, 0x55, 0x26, 0x5E, 0x26, 0x65, + 0x99, 0xB6, 0x1A, 0x02, 0x18, 0x65, 0x1A, 0x02, 0x24, 0x61, 0x99, 0x65, 0x1A, 0x02, 0x13, 0x64, + 0xC6, 0xC6, 0xA9, 0x6D, 0x3E, 0x01, 0x06, 0x5C, 0xB2, 0x02, 0x06, 0x56, 0x2F, 0x97, 0x07, 0x00, + 0x2F, 0x67, 0x09, 0x00, 0x57, 0x61, 0x26, 0x61, 0xB8, 0xA6, 0x48, 0x02, 0x23, 0xC5, 0x92, 0x02, + 0x04, 0xA1, 0x26, 0x79, 0x57, 0x71, 0x2F, 0x97, 0x01, 0x00, 0x38, 0x29, 0x40, 0x02, 0xB9, 0xA9, + 0x48, 0x02, 0x06, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0x04, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2D, + 0xEC, 0x01, 0x38, 0x29, 0x44, 0x02, 0x06, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0x04, 0x3A, 0x0B, 0x9B, + 0x00, 0x00, 0xA9, 0x2D, 0xEE, 0x01, 0x24, 0xB1, 0x24, 0xD8, 0xC6, 0xB8, 0x22, 0x9A, 0xF2, 0x05, + 0x24, 0x61, 0xC4, 0x66, 0x92, 0xBD, 0xF2, 0xCC, 0xA9, 0xCE, 0x22, 0x00, 0x58, 0xC1, 0x34, 0x03, + 0x58, 0x81, 0x24, 0x03, 0x2C, 0x10, 0x44, 0x03, 0xE1, 0xF0, 0x06, 0x64, 0x04, 0x41, 0xB9, 0x41, + 0x04, 0x03, 0xFA, 0x91, 0xFE, 0xFF, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x40, 0x80, 0x00, 0x0C, 0x20, + 0x6C, 0x11, 0x04, 0x30, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x70, 0x00, 0x10, + 0x1C, 0x60, 0xFA, 0x00, 0xA9, 0x67, 0xE4, 0x01, 0xA9, 0x67, 0xE6, 0x01, 0x28, 0x67, 0x06, 0x00, + 0x54, 0x68, 0xA3, 0x46, 0x18, 0x50, 0xBA, 0x15, 0x92, 0x04, 0x06, 0x64, 0xC4, 0x50, 0xF2, 0x03, + 0x04, 0x60, 0xC6, 0x56, 0x82, 0x03, 0x0C, 0x60, 0x32, 0x00, 0x30, 0xF1, 0x99, 0x67, 0xE9, 0x01, + 0x99, 0x07, 0xEA, 0x01, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x38, 0x11, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, + 0x00, 0x10, 0x99, 0x07, 0x04, 0x00, 0xA9, 0x07, 0x34, 0x01, 0xA9, 0x07, 0x36, 0x01, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0x2F, 0x75, 0x05, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xD5, 0x34, 0x51, 0x57, 0xD2, 0x06, 0x65, 0x36, 0xD7, 0x57, 0x62, 0x2F, 0x75, 0x05, 0x00, + 0x3F, 0x77, 0x06, 0x00, 0x26, 0x74, 0x26, 0xD4, 0x26, 0x77, 0x26, 0xDD, 0x34, 0x72, 0x26, 0xD3, + 0xB1, 0xB1, 0x26, 0x37, 0x04, 0xE0, 0x34, 0x41, 0x06, 0x74, 0x06, 0xF3, 0x04, 0x60, 0xC4, 0x50, + 0x22, 0x11, 0xCC, 0x50, 0x14, 0x00, 0x02, 0x06, 0xC4, 0x7C, 0x82, 0x08, 0xC4, 0x7D, 0x92, 0x0A, + 0xF2, 0x05, 0xC4, 0x70, 0x22, 0x07, 0xC4, 0x7D, 0x12, 0x05, 0x70, 0xBF, 0x70, 0xCD, 0xC6, 0xBC, + 0x12, 0x12, 0x24, 0x61, 0x43, 0x66, 0xC4, 0x63, 0x24, 0x71, 0x24, 0xF2, 0x92, 0xE9, 0x24, 0xE1, + 0x43, 0xEE, 0xC4, 0xE3, 0x2C, 0x30, 0x1C, 0x00, 0x24, 0x51, 0x92, 0xDF, 0x70, 0x7D, 0xB1, 0x72, + 0x04, 0x21, 0xF2, 0x02, 0x04, 0x20, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x60, 0x01, 0x0C, 0x20, 0x9E, 0x00, 0x26, 0x21, 0x04, 0x30, + 0x04, 0x44, 0xD9, 0xC1, 0x50, 0x01, 0xD9, 0x81, 0x40, 0x01, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x49, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x10, 0x0C, 0x70, 0xFF, 0x0F, 0xA9, 0x7E, 0x08, 0x00, 0x18, 0x70, 0xAD, 0x15, 0xA9, 0x0E, + 0x0A, 0x00, 0x0C, 0x80, 0x2C, 0x01, 0xC4, 0x70, 0xA9, 0x0E, 0x0C, 0x00, 0xA9, 0x0E, 0x2C, 0x01, + 0xA9, 0x0E, 0x18, 0x02, 0xB9, 0x81, 0xDC, 0x00, 0x78, 0xCE, 0x0E, 0x00, 0x92, 0x09, 0x38, 0x70, + 0x94, 0x15, 0x0C, 0xF0, 0x22, 0x00, 0x26, 0xF7, 0x20, 0x7F, 0xB9, 0x71, 0xDC, 0x00, 0x28, 0x7E, + 0x6A, 0x01, 0x38, 0x81, 0xDC, 0x00, 0x38, 0xD0, 0x94, 0x15, 0x26, 0x78, 0x23, 0x77, 0x0C, 0x40, + 0x28, 0x00, 0xA9, 0x7E, 0x60, 0x01, 0x26, 0x4D, 0x20, 0x44, 0x98, 0x60, 0xBA, 0x15, 0xB9, 0x41, + 0xF8, 0x00, 0x82, 0x09, 0x28, 0x6E, 0x06, 0x00, 0xD4, 0x68, 0x92, 0x05, 0x2C, 0x70, 0xC8, 0x00, + 0xA9, 0x7E, 0x60, 0x01, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x04, 0x3E, 0x5C, 0x20, + 0xFF, 0x01, 0x8B, 0xA1, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2B, 0x92, 0x08, 0x28, 0x6D, + 0x2A, 0x00, 0x28, 0x7E, 0x60, 0x01, 0x26, 0x76, 0xA9, 0x7E, 0x60, 0x01, 0x6B, 0xBA, 0x00, 0x00, + 0x38, 0xD0, 0x94, 0x15, 0x04, 0xA1, 0x28, 0x3D, 0xC8, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0xB9, 0x21, 0xFC, 0x00, 0x18, 0x2E, 0x28, 0x03, 0xC6, 0x2A, + 0xC2, 0x08, 0x18, 0x3D, 0x3D, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x86, 0xA2, 0x92, 0x02, 0x04, 0xA1, + 0x18, 0x3D, 0x3C, 0x00, 0x78, 0x2E, 0x2A, 0x01, 0x06, 0xBE, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x7D, 0x3A, 0x00, 0xC6, 0x27, 0xB2, 0x02, 0x06, 0x27, + 0x06, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2B, 0x2C, 0x01, 0x06, 0x3A, 0x06, 0x2C, 0x0B, 0x9B, + 0x00, 0x00, 0x30, 0x7D, 0xB9, 0x21, 0x00, 0x01, 0xDC, 0x70, 0x00, 0x80, 0x92, 0x04, 0x0C, 0x70, + 0x80, 0x02, 0xF2, 0x03, 0x0C, 0x70, 0x80, 0x0B, 0xB9, 0x71, 0xE8, 0x00, 0x0C, 0x70, 0x62, 0x10, + 0xB9, 0x71, 0xC0, 0x00, 0x06, 0xB7, 0x0C, 0xB0, 0x64, 0x11, 0x04, 0x70, 0xB9, 0x71, 0xB0, 0x00, + 0xB9, 0x71, 0xB4, 0x00, 0xB9, 0x71, 0xD8, 0x00, 0x0C, 0x70, 0x4C, 0x00, 0x26, 0x71, 0x34, 0x72, + 0xB9, 0x71, 0x28, 0x01, 0x38, 0x71, 0xB0, 0x00, 0x38, 0xA1, 0xB0, 0x00, 0x38, 0x81, 0xB0, 0x00, + 0x23, 0x77, 0xB9, 0x71, 0xE4, 0x00, 0x26, 0x77, 0x06, 0x67, 0xD7, 0x61, 0x3F, 0x77, 0x06, 0x00, + 0x23, 0x77, 0x43, 0xAA, 0xB9, 0x71, 0x1C, 0x01, 0x04, 0x71, 0xB9, 0xA1, 0xA8, 0x00, 0x06, 0xA7, + 0x53, 0xA8, 0x06, 0x68, 0x34, 0x61, 0xB9, 0xA1, 0x08, 0x01, 0x06, 0xA7, 0x53, 0xA6, 0x06, 0x87, + 0x34, 0x61, 0x53, 0x86, 0x38, 0x61, 0xB0, 0x00, 0xB9, 0xA1, 0x0C, 0x01, 0x38, 0xA1, 0xB0, 0x00, + 0xB9, 0x81, 0x10, 0x01, 0x24, 0x62, 0x26, 0xA7, 0x06, 0x87, 0x53, 0x76, 0xB9, 0x71, 0x18, 0x01, + 0x53, 0x8A, 0xB9, 0xA1, 0xE0, 0x00, 0x0C, 0x70, 0x22, 0x10, 0x04, 0xA0, 0xB9, 0x81, 0x14, 0x01, + 0xB9, 0x71, 0xC4, 0x00, 0xB9, 0xA1, 0xC8, 0x00, 0x0C, 0x90, 0x00, 0x10, 0x28, 0x7E, 0x06, 0x00, + 0x38, 0x81, 0xC8, 0x00, 0xD4, 0x78, 0x43, 0xD8, 0x92, 0x11, 0x38, 0x71, 0xE4, 0x00, 0x34, 0x7C, + 0xC4, 0x75, 0xC2, 0x15, 0x38, 0x70, 0x94, 0x15, 0x0C, 0x40, 0x32, 0x00, 0x26, 0x47, 0x20, 0x74, + 0xB9, 0x71, 0xB8, 0x00, 0x0C, 0x70, 0x80, 0x02, 0xF2, 0x10, 0x38, 0x70, 0x94, 0x15, 0x0C, 0xF0, + 0x32, 0x00, 0x26, 0xF7, 0x20, 0x7F, 0xB9, 0x71, 0xB8, 0x00, 0xF2, 0x05, 0x0C, 0x60, 0x50, 0x00, + 0xB9, 0x61, 0xB8, 0x00, 0x0C, 0x70, 0x80, 0x0B, 0xB9, 0x71, 0xCC, 0x00, 0x38, 0x71, 0xA8, 0x00, + 0xCC, 0x70, 0x15, 0x00, 0x92, 0x08, 0x38, 0x71, 0xC8, 0x00, 0x34, 0x7C, 0x23, 0x77, 0xC4, 0x71, + 0xDA, 0xE0, 0x04, 0x00, 0x38, 0x81, 0xC8, 0x00, 0x38, 0x31, 0x1C, 0x01, 0x26, 0x38, 0x23, 0x33, + 0x06, 0x83, 0x26, 0x83, 0x0C, 0x70, 0x80, 0x02, 0x26, 0x78, 0x70, 0x67, 0x38, 0x70, 0x94, 0x15, + 0xB9, 0x31, 0xAC, 0x00, 0x43, 0xC3, 0x28, 0x77, 0x5C, 0x00, 0xC6, 0x67, 0x02, 0x06, 0x28, 0x7E, + 0x18, 0x02, 0x24, 0x71, 0xA9, 0x7E, 0x18, 0x02, 0xE7, 0xC1, 0x38, 0xA1, 0xAC, 0x00, 0x26, 0xC1, + 0x10, 0x7C, 0x54, 0xA7, 0x63, 0x7A, 0xD4, 0x71, 0x9A, 0xBC, 0x04, 0x00, 0x38, 0x71, 0xA8, 0x00, + 0xCC, 0x70, 0x13, 0x00, 0x04, 0x71, 0xB9, 0x71, 0xBC, 0x00, 0x12, 0x06, 0xC4, 0xDB, 0x12, 0x04, + 0x04, 0x72, 0xB9, 0x71, 0xBC, 0x00, 0x06, 0x73, 0x0C, 0x70, 0x80, 0x0B, 0x26, 0x78, 0x38, 0xF1, + 0xFC, 0x00, 0x70, 0x77, 0x43, 0x6F, 0xC6, 0x76, 0x2A, 0xA4, 0x04, 0x00, 0x38, 0x41, 0xBC, 0x00, + 0xC4, 0x41, 0x92, 0x08, 0x38, 0x51, 0xF8, 0x00, 0x43, 0x65, 0xC6, 0x76, 0x2A, 0x9A, 0x04, 0x00, + 0xF2, 0x06, 0x78, 0x6E, 0x60, 0x01, 0xC6, 0x67, 0x1A, 0x94, 0x04, 0x00, 0x38, 0x51, 0xA8, 0x00, + 0xB9, 0x01, 0xA4, 0x00, 0x0C, 0x20, 0xA4, 0x00, 0x26, 0x21, 0x0C, 0x30, 0x80, 0x0B, 0x06, 0x4D, + 0xAB, 0x37, 0x02, 0x00, 0xC4, 0x20, 0x8A, 0x85, 0x04, 0x00, 0x38, 0x71, 0xCC, 0x00, 0x26, 0x78, + 0x70, 0x67, 0x28, 0x7E, 0x0E, 0x00, 0x3F, 0x77, 0x06, 0x00, 0xC4, 0x70, 0x0A, 0x7A, 0x04, 0x00, + 0x78, 0x6E, 0x2C, 0x01, 0xC6, 0x76, 0x0A, 0x75, 0x04, 0x00, 0x38, 0x71, 0xA4, 0x00, 0x28, 0x6E, + 0x0C, 0x00, 0xC6, 0x76, 0x22, 0x0B, 0xA9, 0x7E, 0x0C, 0x00, 0x18, 0x7E, 0x04, 0x00, 0x24, 0x71, + 0x13, 0x77, 0xB9, 0x71, 0xD8, 0x00, 0x99, 0x7E, 0x57, 0x02, 0x10, 0x5C, 0x04, 0x71, 0x06, 0x67, + 0x53, 0x6A, 0xC4, 0xDD, 0x66, 0x65, 0x91, 0x6C, 0x82, 0x0C, 0x38, 0x51, 0xAC, 0x00, 0x26, 0x57, + 0x06, 0x65, 0xE7, 0x61, 0x26, 0x61, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, + 0x38, 0x71, 0xA8, 0x00, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x2D, 0x38, 0x71, 0xAC, 0x00, 0x04, 0x67, + 0x24, 0x7E, 0x06, 0x57, 0xE7, 0x51, 0x56, 0x67, 0x26, 0x51, 0x04, 0x71, 0x10, 0x45, 0x06, 0x87, + 0x53, 0x86, 0x06, 0x68, 0xC4, 0xD0, 0x66, 0x64, 0x91, 0x65, 0x92, 0x0F, 0x38, 0x71, 0xAC, 0x00, + 0x04, 0x57, 0x24, 0x7F, 0x06, 0x67, 0xE7, 0x61, 0x56, 0x57, 0x26, 0x61, 0x04, 0x71, 0x53, 0x75, + 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, 0xF2, 0x0E, 0x38, 0x51, 0xAC, 0x00, 0xC4, 0xDD, 0x24, 0x5D, + 0x06, 0x65, 0xE7, 0x61, 0x26, 0x61, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, + 0x92, 0xE6, 0x38, 0x41, 0xC8, 0x00, 0x38, 0xA1, 0xB0, 0x00, 0x38, 0x51, 0x00, 0x01, 0x13, 0x44, + 0x06, 0x74, 0x13, 0xAA, 0x34, 0x72, 0xB9, 0xA1, 0xEC, 0x00, 0x0C, 0xD0, 0x78, 0x00, 0x04, 0x20, + 0x0C, 0xC0, 0x4C, 0x00, 0x34, 0xA1, 0x33, 0x77, 0x23, 0x55, 0x26, 0xD1, 0x0C, 0x60, 0xFF, 0xFF, + 0x26, 0xC1, 0x06, 0x32, 0xB9, 0xA1, 0x20, 0x01, 0xB9, 0x41, 0xF0, 0x00, 0xB9, 0x71, 0x24, 0x01, + 0xB9, 0x51, 0xF4, 0x00, 0x38, 0xF1, 0x20, 0x01, 0x38, 0x71, 0x24, 0x01, 0xB9, 0xD1, 0xD4, 0x00, + 0x26, 0xF6, 0x33, 0xFF, 0x2F, 0x5F, 0x0F, 0x00, 0x06, 0x45, 0xD7, 0x41, 0x3F, 0x55, 0x04, 0x00, + 0x23, 0x55, 0xB9, 0x51, 0x04, 0x01, 0x06, 0x4C, 0x0C, 0x50, 0xFF, 0xFF, 0xC4, 0xF0, 0x22, 0x0D, + 0xCC, 0xF0, 0x14, 0x00, 0x02, 0x06, 0xC4, 0x7C, 0x82, 0x0A, 0xC4, 0x7D, 0x92, 0x06, 0xF2, 0x07, + 0xC4, 0x70, 0x22, 0x03, 0xC4, 0x7D, 0x02, 0x03, 0xA1, 0x04, 0xF2, 0x2E, 0x38, 0x81, 0x04, 0x01, + 0x38, 0xA1, 0xCC, 0x00, 0x26, 0x87, 0x23, 0x88, 0x26, 0x88, 0x26, 0xA8, 0x20, 0xAA, 0xB9, 0x81, + 0x3C, 0x01, 0x06, 0x8A, 0x38, 0xA1, 0xF4, 0x00, 0x36, 0x8A, 0xB9, 0x81, 0xD0, 0x00, 0x06, 0xA8, + 0xC3, 0x88, 0x32, 0x02, 0x04, 0xA0, 0xC4, 0x62, 0x43, 0x8A, 0xB9, 0x81, 0xD0, 0x00, 0xA1, 0xA4, + 0xD2, 0x13, 0xC4, 0x52, 0xD2, 0x11, 0x38, 0xA1, 0xE8, 0x00, 0x38, 0x81, 0x3C, 0x01, 0x24, 0x31, + 0x26, 0x8A, 0x20, 0xA8, 0x38, 0x81, 0xF4, 0x00, 0x36, 0xA8, 0x38, 0x81, 0xD4, 0x00, 0xA1, 0xA8, + 0x38, 0xA1, 0xD0, 0x00, 0x26, 0x2A, 0x38, 0x81, 0xD4, 0x00, 0x24, 0x51, 0x23, 0x55, 0xC4, 0x54, + 0x24, 0x82, 0x24, 0x71, 0xB9, 0x81, 0xD4, 0x00, 0x24, 0x42, 0x33, 0x77, 0x92, 0xB8, 0x24, 0x61, + 0x23, 0x66, 0xC4, 0x64, 0x24, 0xCA, 0x24, 0xD6, 0x92, 0x9E, 0x98, 0x70, 0xAC, 0x15, 0x92, 0x1A, + 0x34, 0x31, 0xC4, 0x30, 0x12, 0x02, 0x04, 0x31, 0x38, 0xA1, 0xBC, 0x00, 0xC4, 0xA1, 0x92, 0x12, + 0x38, 0xC0, 0x94, 0x15, 0x78, 0xD1, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x28, 0x7C, 0x34, 0x00, + 0x3F, 0x22, 0x0D, 0x00, 0xC6, 0x27, 0xB2, 0x06, 0x28, 0x7C, 0x36, 0x00, 0xC6, 0xD7, 0x2A, 0x81, + 0x03, 0x00, 0x38, 0x31, 0xB8, 0x00, 0x78, 0x21, 0x88, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0xBC, 0x00, 0x43, 0x22, 0xC4, 0x71, 0x92, 0x3C, + 0x06, 0x76, 0x0C, 0x70, 0x98, 0x15, 0x04, 0xA8, 0x26, 0xA7, 0x20, 0x67, 0x28, 0xF7, 0x02, 0x00, + 0x28, 0xD7, 0x04, 0x00, 0x28, 0xC7, 0x06, 0x00, 0x38, 0x31, 0xAC, 0x00, 0x20, 0x7A, 0xB9, 0x61, + 0xB8, 0x00, 0x0C, 0x40, 0x4C, 0x00, 0x26, 0x41, 0xB9, 0x71, 0xD4, 0x00, 0x24, 0x48, 0x04, 0x50, + 0x2C, 0x30, 0x1E, 0x00, 0x1C, 0xA0, 0x32, 0x00, 0x2F, 0x75, 0x03, 0x00, 0x04, 0x60, 0x38, 0x81, + 0xB8, 0x00, 0xC6, 0x78, 0x82, 0x0F, 0xC6, 0x7F, 0x82, 0x0D, 0xC6, 0x7D, 0x82, 0x0B, 0xC6, 0x7C, + 0x82, 0x09, 0x38, 0x81, 0xD4, 0x00, 0xC6, 0x78, 0x82, 0x05, 0x2F, 0x86, 0x04, 0x00, 0xA9, 0x08, + 0x28, 0x00, 0x34, 0x6A, 0xC6, 0x6A, 0x34, 0x71, 0x92, 0xEB, 0x34, 0x5E, 0x1C, 0x60, 0x46, 0x00, + 0xC6, 0x56, 0x34, 0x42, 0x92, 0xE2, 0x78, 0x71, 0x64, 0x00, 0x28, 0x6E, 0x08, 0x00, 0xB9, 0x71, + 0xA4, 0x00, 0xC6, 0x67, 0x02, 0x03, 0xA9, 0x7E, 0x08, 0x00, 0x28, 0x6E, 0x0A, 0x00, 0xC6, 0x67, + 0x32, 0x03, 0xA9, 0x7E, 0x0A, 0x00, 0x38, 0x71, 0xB4, 0x00, 0x38, 0x81, 0x08, 0x01, 0xB8, 0xA1, + 0xA8, 0x00, 0x66, 0x78, 0xB9, 0x71, 0xB4, 0x00, 0x82, 0x12, 0x38, 0x81, 0x0C, 0x01, 0xC4, 0xA1, + 0x66, 0x78, 0xB9, 0x71, 0xB4, 0x00, 0x82, 0x0B, 0x38, 0xA1, 0x10, 0x01, 0x66, 0x7A, 0xB9, 0x71, + 0xB4, 0x00, 0x38, 0x71, 0xA8, 0x00, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x12, 0x38, 0x71, 0xA8, 0x00, + 0x38, 0x81, 0xB4, 0x00, 0x38, 0xA1, 0x14, 0x01, 0xCC, 0x70, 0x14, 0x00, 0x66, 0x8A, 0xB9, 0x81, + 0xB4, 0x00, 0x82, 0x06, 0x38, 0xA1, 0x18, 0x01, 0x66, 0x8A, 0xB9, 0x81, 0xB4, 0x00, 0x0C, 0xF0, + 0x00, 0x10, 0x18, 0x7F, 0x04, 0x00, 0x78, 0x61, 0x86, 0x00, 0x38, 0x41, 0xF0, 0x00, 0x38, 0x51, + 0xEC, 0x00, 0xD7, 0x71, 0xC6, 0x62, 0x26, 0x7F, 0x99, 0x47, 0x38, 0x01, 0x99, 0x57, 0x39, 0x01, + 0x04, 0x72, 0x12, 0x0A, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x12, 0x06, 0x78, 0x61, 0x8C, 0x00, + 0xC6, 0x62, 0x12, 0x02, 0x04, 0x70, 0x78, 0x61, 0x8A, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, + 0x84, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x90, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x74, + 0x78, 0x61, 0x82, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x12, 0x05, + 0x78, 0x61, 0x84, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x78, 0x78, 0x61, 0x8E, 0x00, 0xC6, 0x62, + 0x12, 0x09, 0x78, 0x61, 0x8C, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x90, 0x00, 0xC6, 0x62, + 0x02, 0x03, 0x6C, 0x70, 0x10, 0x00, 0x0C, 0x60, 0x4C, 0x00, 0x04, 0x42, 0x04, 0x34, 0x04, 0x28, + 0x56, 0x47, 0x56, 0x37, 0x56, 0x27, 0x26, 0x61, 0x0C, 0x50, 0x74, 0x00, 0x5C, 0x70, 0x10, 0x00, + 0x24, 0x68, 0x26, 0x51, 0x13, 0x44, 0x13, 0x33, 0x13, 0x22, 0x13, 0x77, 0xC4, 0x40, 0x92, 0x02, + 0xA1, 0x05, 0xC4, 0x30, 0x92, 0x03, 0xA9, 0x05, 0x08, 0x00, 0xC4, 0x20, 0x92, 0x02, 0xA1, 0x06, + 0xC4, 0x70, 0x92, 0x03, 0xA9, 0x06, 0x28, 0x00, 0x38, 0x81, 0x28, 0x01, 0x34, 0x62, 0xC6, 0x68, + 0x34, 0x5A, 0x92, 0xED, 0x78, 0x31, 0x4E, 0x00, 0x78, 0x41, 0x50, 0x00, 0x78, 0x51, 0x52, 0x00, + 0x78, 0x61, 0x54, 0x00, 0x78, 0x21, 0x4C, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0xAC, 0x00, 0x78, 0x31, 0x76, 0x00, 0x78, 0x41, 0x78, 0x00, 0x78, 0x51, 0x7A, 0x00, 0x78, 0x61, + 0x7C, 0x00, 0x78, 0x21, 0x74, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0xB8, 0x00, + 0x78, 0x31, 0x58, 0x00, 0x78, 0x41, 0x5A, 0x00, 0x78, 0x51, 0x5C, 0x00, 0x78, 0x61, 0x5E, 0x00, + 0x78, 0x21, 0x56, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x78, 0x31, 0x62, 0x00, 0x78, 0x41, + 0x64, 0x00, 0x78, 0x51, 0x66, 0x00, 0x78, 0x61, 0x68, 0x00, 0x06, 0xA2, 0x78, 0x21, 0x60, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xD2, 0x78, 0x31, 0x6C, 0x00, 0x78, 0x21, 0x6A, 0x00, + 0x78, 0x41, 0x6E, 0x00, 0x78, 0x51, 0x70, 0x00, 0x78, 0x61, 0x72, 0x00, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x0C, 0xF0, 0x00, 0x10, 0xF8, 0x7F, 0xE6, 0x01, 0x06, 0xC2, 0x32, 0x05, 0x38, 0x31, + 0xA8, 0x00, 0xA9, 0x3F, 0xE6, 0x01, 0x78, 0x79, 0xE6, 0x01, 0x38, 0x81, 0xB0, 0x00, 0x14, 0x61, + 0x26, 0x67, 0xC6, 0x68, 0x1A, 0x34, 0x01, 0x00, 0x24, 0x71, 0xC6, 0x78, 0x2A, 0x30, 0x01, 0x00, + 0x98, 0x89, 0x04, 0x00, 0x9A, 0x27, 0x01, 0x00, 0x18, 0x79, 0x28, 0x03, 0xC4, 0x71, 0xDA, 0x22, + 0x01, 0x00, 0x38, 0x71, 0xBC, 0x00, 0xC4, 0x72, 0x9A, 0x1D, 0x01, 0x00, 0x98, 0x70, 0xBA, 0x15, + 0x82, 0x03, 0x0C, 0x80, 0x32, 0x00, 0x28, 0x69, 0x06, 0x00, 0xD4, 0x68, 0x82, 0x06, 0x04, 0x80, + 0xC6, 0x78, 0x82, 0x03, 0x0C, 0x80, 0x32, 0x00, 0x78, 0x79, 0xE4, 0x01, 0x06, 0x6D, 0x06, 0x2D, + 0x57, 0x63, 0x57, 0x22, 0x26, 0x26, 0x0C, 0x30, 0x64, 0x00, 0xB9, 0x71, 0x38, 0x01, 0x4B, 0x9E, + 0x00, 0x00, 0xC6, 0x2A, 0x38, 0x71, 0x38, 0x01, 0x02, 0x07, 0xC6, 0x2C, 0x02, 0x05, 0x38, 0xF1, + 0xA8, 0x00, 0xC6, 0x7F, 0x92, 0x1D, 0x18, 0x79, 0xE8, 0x01, 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x04, + 0x24, 0x71, 0x99, 0x79, 0xE8, 0x01, 0x18, 0x79, 0xE8, 0x01, 0xC4, 0x73, 0xC2, 0x15, 0x18, 0x79, + 0xE9, 0x01, 0x99, 0x09, 0xE8, 0x01, 0xC6, 0x78, 0xB2, 0x04, 0x99, 0x89, 0xE9, 0x01, 0xF2, 0x0C, + 0xCC, 0x70, 0x3E, 0x00, 0xD2, 0x09, 0x24, 0x71, 0x99, 0x79, 0xE9, 0x01, 0xF2, 0x05, 0x99, 0x09, + 0xE8, 0x01, 0x99, 0x09, 0xE9, 0x01, 0x38, 0x71, 0xA8, 0x00, 0xC4, 0x71, 0x02, 0x28, 0xB0, 0x2B, + 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, 0x38, 0x21, + 0xAC, 0x00, 0xB9, 0x71, 0x38, 0x01, 0x0C, 0x30, 0x40, 0x00, 0x36, 0x38, 0xAB, 0x97, 0x00, 0x00, + 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB1, 0x2B, 0x92, 0x03, 0x04, 0x7A, + 0xB1, 0x7B, 0x30, 0x8B, 0xB9, 0x81, 0xAC, 0x00, 0xF2, 0x0D, 0xB8, 0x71, 0xAC, 0x00, 0x92, 0x03, + 0x04, 0x7A, 0xF2, 0x03, 0x38, 0x71, 0xAC, 0x00, 0xB1, 0x7B, 0xF2, 0x04, 0xB8, 0x81, 0xA8, 0x00, + 0x82, 0x26, 0xB8, 0x2B, 0x04, 0x00, 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, + 0x00, 0x00, 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, 0x36, 0x38, 0x06, 0x2A, 0xB9, 0x71, 0x38, 0x01, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x2B, + 0x04, 0x00, 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x7B, 0x04, 0x00, 0x38, 0xAB, 0x04, 0x00, 0xF2, 0x07, + 0xC4, 0xA0, 0x04, 0x7A, 0x82, 0x02, 0x06, 0x7A, 0xB9, 0x7B, 0x04, 0x00, 0xB8, 0x2B, 0x08, 0x00, + 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x40, 0x00, + 0x06, 0x72, 0x36, 0x38, 0x06, 0x2D, 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, + 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x2B, 0x08, 0x00, 0x92, 0x04, 0x04, 0x7A, + 0xB9, 0x7B, 0x08, 0x00, 0x38, 0xDB, 0x08, 0x00, 0xF2, 0x07, 0xC4, 0xD0, 0x04, 0x7A, 0x82, 0x02, + 0x06, 0x7D, 0xB9, 0x7B, 0x08, 0x00, 0x38, 0x71, 0xA8, 0x00, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x55, + 0xB8, 0x2B, 0x0C, 0x00, 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, + 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, 0x36, 0x38, 0x06, 0x2C, 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x2B, 0x0C, 0x00, + 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x7B, 0x0C, 0x00, 0x38, 0xCB, 0x0C, 0x00, 0xF2, 0x07, 0xC4, 0xC0, + 0x04, 0x7A, 0x82, 0x02, 0x06, 0x7C, 0xB9, 0x7B, 0x0C, 0x00, 0x38, 0x81, 0xA8, 0x00, 0xCC, 0x80, + 0x13, 0x00, 0x12, 0x2B, 0xB8, 0x2B, 0x10, 0x00, 0x82, 0x20, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, + 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, 0x38, 0x21, 0xB8, 0x00, 0xB9, 0x71, 0x38, 0x01, 0x0C, 0x30, + 0x40, 0x00, 0x36, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, + 0xC4, 0x20, 0xB9, 0x2B, 0x10, 0x00, 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x7B, 0x10, 0x00, 0x38, 0x7B, + 0x10, 0x00, 0xB9, 0x71, 0xB8, 0x00, 0xF2, 0x09, 0xB8, 0x81, 0xB8, 0x00, 0x04, 0x7A, 0x82, 0x03, + 0x38, 0x71, 0xB8, 0x00, 0xB9, 0x7B, 0x10, 0x00, 0x38, 0xF1, 0xA8, 0x00, 0xA9, 0xF9, 0xE4, 0x01, + 0xF2, 0x0A, 0x38, 0x31, 0xA8, 0x00, 0xA9, 0x39, 0xE4, 0x01, 0xF2, 0x05, 0x38, 0x41, 0xA8, 0x00, + 0xA9, 0x49, 0xE4, 0x01, 0x38, 0x21, 0xAC, 0x00, 0x38, 0x61, 0xB8, 0x00, 0x06, 0x3A, 0x06, 0x4D, + 0x06, 0x5C, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, 0x04, 0x7A, 0x04, 0xDA, + 0xA9, 0x71, 0x64, 0x00, 0x06, 0x8D, 0x38, 0x71, 0xC0, 0x00, 0x38, 0x21, 0xAC, 0x00, 0x20, 0x37, + 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, 0x06, 0x2A, 0x38, 0xA1, 0xC0, 0x00, 0x28, 0x3A, 0x02, 0x00, + 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0xF1, 0xC0, 0x00, 0x06, 0xA2, 0x28, 0x3F, + 0x04, 0x00, 0x06, 0x2D, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x51, 0xC0, 0x00, 0x06, 0x42, 0x28, 0x35, + 0x06, 0x00, 0xB9, 0x41, 0x34, 0x01, 0x06, 0x2C, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, 0xC0, 0x00, + 0x06, 0xD2, 0x28, 0x36, 0x08, 0x00, 0x38, 0x21, 0xB8, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, + 0x38, 0x01, 0x38, 0x41, 0x34, 0x01, 0x06, 0x62, 0x06, 0x3A, 0x06, 0x27, 0x06, 0x5D, 0x0C, 0xF0, + 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0x38, 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x79, 0x04, 0x00, 0x86, 0x22, + 0xD7, 0x71, 0x26, 0x79, 0x24, 0x74, 0x32, 0x02, 0x04, 0x20, 0xA9, 0x27, 0x38, 0x01, 0x78, 0x31, + 0x56, 0x00, 0x78, 0x41, 0x60, 0x00, 0x78, 0x51, 0x6A, 0x00, 0x78, 0x61, 0x74, 0x00, 0x78, 0x21, + 0x4C, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0xAC, 0x00, 0x78, 0x31, 0x5E, 0x00, + 0x78, 0x41, 0x68, 0x00, 0x78, 0x51, 0x72, 0x00, 0x78, 0x61, 0x7C, 0x00, 0x78, 0x21, 0x54, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xC2, 0x78, 0x31, 0x58, 0x00, 0x78, 0x41, 0x62, 0x00, + 0x78, 0x51, 0x6C, 0x00, 0x78, 0x61, 0x76, 0x00, 0x78, 0x21, 0x4E, 0x00, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x06, 0xA2, 0x78, 0x31, 0x5A, 0x00, 0x78, 0x41, 0x64, 0x00, 0x78, 0x51, 0x6E, 0x00, + 0x78, 0x61, 0x78, 0x00, 0x78, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xD2, + 0x78, 0x31, 0x5C, 0x00, 0x78, 0x41, 0x66, 0x00, 0x78, 0x51, 0x70, 0x00, 0x78, 0x61, 0x7A, 0x00, + 0x78, 0x21, 0x52, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0xBC, 0x00, 0x38, 0x51, + 0xBC, 0x00, 0x38, 0x21, 0xAC, 0x00, 0x06, 0x3A, 0x06, 0x4D, 0x06, 0x6C, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, 0x04, 0x7A, 0x04, 0x8A, 0xA9, 0x71, 0x64, 0x00, 0x06, 0xD8, + 0x38, 0x71, 0xC4, 0x00, 0x38, 0x21, 0xAC, 0x00, 0x20, 0x37, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, + 0x06, 0x2A, 0x38, 0xA1, 0xC4, 0x00, 0x28, 0x3A, 0x02, 0x00, 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0xF1, 0xC4, 0x00, 0x06, 0xA2, 0x28, 0x3F, 0x04, 0x00, 0x06, 0x2D, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x06, 0x42, 0x28, 0x35, 0x06, 0x00, 0x38, 0x21, 0xBC, 0x00, + 0xB9, 0x41, 0x34, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, 0xC4, 0x00, 0x06, 0xD2, 0x28, 0x36, + 0x08, 0x00, 0x06, 0x2C, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x38, 0x41, 0x34, 0x01, + 0x06, 0x62, 0x06, 0x3A, 0x06, 0x27, 0x06, 0x5D, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0x38, + 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x69, 0x04, 0x00, 0x86, 0x22, 0x06, 0x76, 0xD7, 0x71, 0x26, 0x79, + 0x24, 0x74, 0x32, 0x02, 0x04, 0x20, 0xA9, 0x27, 0x36, 0x01, 0x06, 0x76, 0x24, 0x71, 0x13, 0x77, + 0xC4, 0x74, 0x99, 0x79, 0x04, 0x00, 0xC2, 0x05, 0x04, 0x75, 0x99, 0x79, 0x04, 0x00, 0xF2, 0x1D, + 0x38, 0x71, 0xC8, 0x00, 0x38, 0x81, 0xC4, 0x00, 0x24, 0x71, 0xC4, 0x7E, 0x24, 0x82, 0xB9, 0x71, + 0xC8, 0x00, 0xB9, 0x81, 0xC4, 0x00, 0x9A, 0xE3, 0xFA, 0xFF, 0x38, 0x71, 0xE0, 0x00, 0x38, 0xA1, + 0xC0, 0x00, 0xCC, 0x70, 0x16, 0x00, 0x24, 0xA2, 0xB9, 0xA1, 0xC0, 0x00, 0x24, 0xB4, 0x82, 0x05, + 0xB9, 0x71, 0xB0, 0x00, 0xFA, 0x98, 0xFA, 0xFF, 0x78, 0x7E, 0xE6, 0x01, 0x78, 0x6E, 0xE4, 0x01, + 0x14, 0x51, 0x26, 0x57, 0xC6, 0x56, 0x12, 0x04, 0x24, 0x71, 0xC6, 0x76, 0x32, 0x07, 0x18, 0x7E, + 0xEA, 0x01, 0x24, 0x71, 0x99, 0x7E, 0xEA, 0x01, 0xF2, 0x03, 0x99, 0x0E, 0xEA, 0x01, 0x38, 0x60, + 0x80, 0x15, 0x14, 0x51, 0xC4, 0x65, 0x26, 0x56, 0x13, 0x55, 0x04, 0x75, 0xD2, 0x02, 0x06, 0x75, + 0x18, 0x5E, 0xEA, 0x01, 0x13, 0x37, 0x0C, 0x40, 0x6C, 0x11, 0x04, 0x70, 0x38, 0x61, 0xB4, 0x00, + 0x73, 0x67, 0xD4, 0x61, 0x92, 0x05, 0xC6, 0x53, 0xC2, 0x03, 0xB1, 0x04, 0x06, 0x56, 0x24, 0x71, + 0xCC, 0x70, 0x16, 0x00, 0x24, 0x44, 0x92, 0xF3, 0x18, 0xBE, 0x04, 0x00, 0x99, 0x5E, 0xEA, 0x01, + 0xC4, 0xB1, 0x92, 0x6D, 0x18, 0xDE, 0x38, 0x01, 0xC4, 0xDB, 0xD2, 0x69, 0x14, 0x61, 0x26, 0x6D, + 0xC4, 0x69, 0x0C, 0xA0, 0x26, 0x01, 0x43, 0x7D, 0x26, 0xAD, 0x0C, 0x90, 0x80, 0x02, 0xD2, 0x12, + 0x14, 0x61, 0x04, 0x31, 0x26, 0x6A, 0x26, 0x3A, 0x26, 0x66, 0x26, 0x33, 0x26, 0x69, 0x26, 0x39, + 0x70, 0x46, 0x70, 0x53, 0xC6, 0x45, 0x02, 0x03, 0xA1, 0x03, 0xF2, 0x04, 0xC6, 0x45, 0x32, 0x02, + 0xA1, 0x06, 0xC4, 0x70, 0x82, 0x18, 0x14, 0x61, 0x26, 0x6A, 0x26, 0x66, 0x26, 0x69, 0x70, 0xC6, + 0x0C, 0x60, 0x11, 0x00, 0x26, 0x6D, 0x26, 0x66, 0x26, 0x6E, 0x28, 0x36, 0x02, 0x00, 0xB9, 0x71, + 0x38, 0x01, 0x06, 0x2C, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x06, 0x82, 0xC4, 0x7B, + 0x82, 0x19, 0xF2, 0x03, 0x06, 0xC7, 0x06, 0x87, 0x04, 0x71, 0x26, 0x7A, 0x0C, 0x60, 0x13, 0x00, + 0x26, 0x77, 0x26, 0x6D, 0x26, 0x79, 0x26, 0x66, 0x70, 0x77, 0x26, 0x6E, 0x28, 0x36, 0x02, 0x00, + 0xB9, 0x71, 0x38, 0x01, 0x06, 0x27, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x82, + 0x26, 0xC7, 0x26, 0xAA, 0x26, 0x9A, 0x70, 0x29, 0x2C, 0xD0, 0x12, 0x00, 0x26, 0xC2, 0xC4, 0xC0, + 0x26, 0xDD, 0x26, 0xDE, 0x92, 0x09, 0x28, 0x2D, 0x02, 0x00, 0x04, 0xCA, 0x26, 0x22, 0x06, 0x82, + 0x57, 0x81, 0x26, 0x28, 0xF2, 0x06, 0x28, 0x3D, 0x02, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x26, 0x28, + 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, 0xA9, 0x2E, 0x34, 0x01, 0xF2, 0x05, 0xA9, 0x0E, 0x34, 0x01, + 0xA9, 0x0E, 0x36, 0x01, 0x38, 0xD0, 0x94, 0x15, 0x30, 0x7D, 0xDC, 0x70, 0x80, 0x00, 0x82, 0x67, + 0xC4, 0xB0, 0x92, 0x17, 0xA8, 0x7E, 0x6A, 0x01, 0x82, 0x0B, 0x18, 0x7E, 0x68, 0x01, 0x18, 0x6D, + 0x41, 0x00, 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x68, 0x01, 0xF2, 0x58, 0xB9, 0x0E, + 0x64, 0x01, 0x99, 0x0E, 0x69, 0x01, 0x99, 0x0E, 0x68, 0x01, 0xA9, 0x0E, 0x6A, 0x01, 0xF2, 0x4F, + 0x18, 0xCE, 0x69, 0x01, 0x18, 0x7D, 0x3E, 0x00, 0xC6, 0xC7, 0xB2, 0x11, 0x24, 0xC1, 0x13, 0xCC, + 0x99, 0xCE, 0x69, 0x01, 0x18, 0x7D, 0x3F, 0x00, 0xC6, 0x7C, 0xB2, 0x3F, 0x38, 0x7E, 0x64, 0x01, + 0x28, 0x6E, 0x0C, 0x00, 0x26, 0x76, 0xB9, 0x7E, 0x64, 0x01, 0xF2, 0x37, 0xC6, 0xC7, 0x92, 0x35, + 0x38, 0x7E, 0x64, 0x01, 0x28, 0x2E, 0x0C, 0x00, 0x26, 0x27, 0xB9, 0x2E, 0x64, 0x01, 0x18, 0x3D, + 0x3F, 0x00, 0x3F, 0x33, 0x0C, 0x00, 0x24, 0x31, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x0E, 0x6A, 0x01, + 0x28, 0x7D, 0x42, 0x00, 0xB9, 0x2E, 0x64, 0x01, 0x06, 0xA2, 0xC6, 0x27, 0xC2, 0x15, 0x38, 0x71, + 0xDC, 0x00, 0x18, 0x3D, 0x40, 0x00, 0x36, 0x27, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9B, 0x00, 0x00, 0x23, 0x22, 0xA9, 0x2E, 0x6A, 0x01, 0x28, 0x7D, 0x44, 0x00, 0xC6, 0x27, + 0xC2, 0x03, 0xA9, 0x7E, 0x6A, 0x01, 0x18, 0x3D, 0x3F, 0x00, 0x06, 0x2A, 0x3F, 0x33, 0x0C, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0xB9, 0x2E, 0x64, 0x01, 0x99, 0x0E, 0x68, 0x01, 0x0C, 0x40, 0x0D, 0x05, + 0x26, 0x4E, 0x60, 0x44, 0x04, 0xA0, 0xB9, 0x41, 0xA8, 0x00, 0x14, 0xD1, 0x06, 0xCA, 0x0C, 0x90, + 0x16, 0x00, 0xC6, 0xCB, 0x32, 0x56, 0x06, 0x5C, 0xD7, 0x51, 0x26, 0x5E, 0x04, 0x84, 0x26, 0x85, + 0x78, 0x28, 0x36, 0x01, 0xB9, 0x51, 0x2C, 0x01, 0x04, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x06, 0x42, + 0xA9, 0x28, 0x36, 0x01, 0x78, 0x28, 0x38, 0x01, 0xB9, 0x41, 0x34, 0x01, 0x04, 0x3A, 0x4B, 0x9E, + 0x00, 0x00, 0x0C, 0x60, 0x34, 0x01, 0x26, 0x68, 0x10, 0x66, 0x38, 0x41, 0x34, 0x01, 0x38, 0x51, + 0x2C, 0x01, 0xB9, 0x61, 0xB0, 0x00, 0x43, 0x22, 0xA9, 0x28, 0x38, 0x01, 0x43, 0x44, 0x0C, 0x70, + 0xAA, 0x14, 0x04, 0x60, 0x78, 0x37, 0x04, 0x00, 0xC6, 0x34, 0x12, 0x0E, 0x78, 0x37, 0x06, 0x00, + 0xC6, 0x34, 0x22, 0x0A, 0x70, 0x37, 0xC6, 0x32, 0x12, 0x07, 0x78, 0x37, 0x02, 0x00, 0xC6, 0x32, + 0x22, 0x03, 0x18, 0x95, 0x39, 0x01, 0x06, 0xF9, 0x38, 0x81, 0xB0, 0x00, 0x57, 0xF2, 0x2F, 0x39, + 0x09, 0x00, 0x3F, 0x33, 0x0F, 0x00, 0x26, 0x38, 0x26, 0x33, 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x3F, + 0x70, 0x33, 0xC6, 0xA3, 0x32, 0x06, 0x33, 0x86, 0xB9, 0x81, 0xA8, 0x00, 0x06, 0xA3, 0x06, 0xDC, + 0x24, 0x61, 0x43, 0x66, 0xC4, 0x62, 0x24, 0x78, 0x92, 0xD6, 0x24, 0xC1, 0x43, 0xCC, 0xF2, 0xAA, + 0xB9, 0xA1, 0xA4, 0x00, 0x98, 0x7E, 0x05, 0x00, 0x38, 0xA1, 0xA8, 0x00, 0xB9, 0xD1, 0xB0, 0x00, + 0x99, 0xAE, 0x0D, 0x05, 0x92, 0x23, 0xC4, 0xB1, 0xC2, 0x21, 0x98, 0x7E, 0x28, 0x03, 0x92, 0x1E, + 0xB8, 0x71, 0xD8, 0x00, 0x82, 0x1B, 0x34, 0x71, 0xD7, 0x71, 0x26, 0x7E, 0x78, 0x57, 0x3A, 0x01, + 0x78, 0x67, 0x3C, 0x01, 0x0C, 0x40, 0x62, 0x01, 0x0C, 0x70, 0x3A, 0x11, 0x26, 0x4E, 0xC6, 0x74, + 0x82, 0x06, 0xA1, 0x07, 0xA9, 0x07, 0x02, 0x00, 0x24, 0x78, 0xF2, 0xFA, 0x04, 0x71, 0x99, 0x7E, + 0x04, 0x00, 0xA9, 0x5E, 0x3A, 0x01, 0xA9, 0x6E, 0x3C, 0x01, 0x28, 0x5E, 0x06, 0x00, 0x04, 0x71, + 0xD6, 0x75, 0x82, 0x1B, 0x18, 0x5E, 0x04, 0x00, 0xC4, 0x51, 0xC2, 0x39, 0xC4, 0xD0, 0x22, 0x37, + 0xC6, 0xD5, 0x32, 0x0E, 0x06, 0x4D, 0x24, 0xD1, 0x06, 0x7D, 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, + 0x38, 0x01, 0xD7, 0x41, 0x26, 0x4E, 0xC9, 0x64, 0x38, 0x01, 0x43, 0xDD, 0xF2, 0xF2, 0x06, 0x75, + 0x34, 0x71, 0x99, 0x7E, 0x04, 0x00, 0xF2, 0x23, 0x04, 0x72, 0xD6, 0x75, 0x82, 0x20, 0x18, 0x4E, + 0x04, 0x00, 0xC4, 0x41, 0xC2, 0x1C, 0xC4, 0xD0, 0x22, 0x1A, 0xC6, 0xD4, 0x32, 0x0E, 0x06, 0x3D, + 0x24, 0xD1, 0x06, 0x7D, 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, 0x38, 0x01, 0xD7, 0x31, 0x26, 0x3E, + 0xC9, 0x63, 0x38, 0x01, 0x43, 0xDD, 0xF2, 0xF2, 0x06, 0x74, 0x34, 0x71, 0x99, 0x7E, 0x04, 0x00, + 0x14, 0x83, 0x06, 0x75, 0x56, 0x78, 0x64, 0x71, 0xA9, 0x7E, 0x06, 0x00, 0x18, 0x7E, 0x04, 0x00, + 0xC4, 0x71, 0xCA, 0x59, 0x01, 0x00, 0x18, 0x7E, 0x56, 0x02, 0x0C, 0x80, 0x00, 0x64, 0xC4, 0x70, + 0x82, 0x03, 0x0C, 0x80, 0x00, 0x94, 0x0C, 0x20, 0x94, 0x00, 0x26, 0x21, 0x04, 0x30, 0x04, 0x4A, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x18, 0xBE, 0x04, 0x00, 0x04, 0xA0, 0x06, 0xDA, 0x04, 0x51, + 0xC6, 0xDB, 0x32, 0x4D, 0x06, 0x9D, 0xD7, 0x91, 0x26, 0x9E, 0x2F, 0x6D, 0x0D, 0x00, 0x2C, 0x90, + 0x38, 0x01, 0x06, 0xCD, 0x26, 0x61, 0xC6, 0xCB, 0x32, 0x3F, 0x06, 0x7C, 0xD7, 0x71, 0x24, 0x74, + 0x2F, 0x47, 0x0E, 0x00, 0x78, 0x39, 0x02, 0x00, 0x78, 0x74, 0x36, 0x01, 0x3F, 0x77, 0x03, 0x00, + 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x78, 0x29, 0x04, 0x00, 0x78, 0x44, 0x38, 0x01, 0x36, 0x24, + 0xC4, 0x20, 0x32, 0x02, 0x16, 0x22, 0x06, 0x32, 0xB9, 0x51, 0x2C, 0x01, 0xB9, 0x61, 0x30, 0x01, + 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x06, 0x42, 0x06, 0x37, + 0x06, 0x27, 0xB9, 0x41, 0x34, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x34, 0x01, 0x38, 0x51, + 0x2C, 0x01, 0x38, 0x61, 0x30, 0x01, 0x26, 0x24, 0xC6, 0x82, 0xC2, 0x0B, 0x28, 0x46, 0x94, 0x00, + 0x06, 0x75, 0x53, 0x7C, 0xC6, 0xDC, 0x66, 0x74, 0xA9, 0x76, 0x94, 0x00, 0x82, 0x02, 0x04, 0xA1, + 0x24, 0xC1, 0x43, 0xCC, 0xF2, 0xC1, 0x24, 0xD1, 0x43, 0xDD, 0xF2, 0xB3, 0xC4, 0xA1, 0x92, 0x04, + 0x99, 0xAE, 0x56, 0x02, 0xF2, 0x03, 0x99, 0x0E, 0x56, 0x02, 0x14, 0x71, 0x26, 0x7B, 0x43, 0x77, + 0x14, 0x21, 0xC6, 0x72, 0x82, 0x23, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x51, 0xA8, 0x65, 0x94, 0x00, + 0x82, 0x1A, 0x04, 0x61, 0x26, 0x67, 0x43, 0x66, 0x06, 0x45, 0xC6, 0x6B, 0x32, 0x14, 0x28, 0x34, + 0x94, 0x00, 0x06, 0x53, 0x63, 0x56, 0xD4, 0x51, 0x82, 0x0B, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x51, + 0x28, 0xF5, 0x94, 0x00, 0x66, 0x3F, 0xA9, 0x34, 0x94, 0x00, 0xA9, 0x05, 0x94, 0x00, 0x24, 0x61, + 0x43, 0x66, 0xF2, 0xEC, 0x34, 0x71, 0x43, 0x77, 0xF2, 0xDD, 0x04, 0xB0, 0x06, 0xCB, 0x18, 0xDE, + 0x04, 0x00, 0xC6, 0xCD, 0x3A, 0x93, 0x00, 0x00, 0x2F, 0x6C, 0x0C, 0x00, 0x26, 0x61, 0xA8, 0x76, + 0x94, 0x00, 0x04, 0x81, 0x26, 0x8C, 0x8A, 0x87, 0x00, 0x00, 0xD7, 0xC1, 0x0C, 0xA0, 0x00, 0x10, + 0x24, 0xC4, 0x26, 0xCA, 0x18, 0x7C, 0x35, 0x01, 0x38, 0xA1, 0xCC, 0x00, 0x78, 0x3C, 0x36, 0x01, + 0x26, 0x77, 0x06, 0x57, 0xD7, 0x51, 0x3F, 0x77, 0x05, 0x00, 0x18, 0x5C, 0x34, 0x01, 0x26, 0x75, + 0x23, 0x77, 0x26, 0x77, 0x26, 0x7A, 0x70, 0xD7, 0xB9, 0x61, 0x30, 0x01, 0x06, 0x2D, 0xAB, 0x97, + 0x00, 0x00, 0x78, 0x3C, 0x38, 0x01, 0x06, 0x92, 0x06, 0x2D, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, + 0x30, 0x01, 0x06, 0xA2, 0x43, 0x78, 0xB9, 0x61, 0xA8, 0x00, 0x0C, 0x40, 0x00, 0x10, 0x18, 0x64, + 0x04, 0x00, 0xC6, 0x76, 0x32, 0x47, 0x38, 0x51, 0xA8, 0x00, 0x28, 0x65, 0x94, 0x00, 0x63, 0x67, + 0xD4, 0x61, 0x82, 0x3D, 0x06, 0x67, 0xD7, 0x61, 0x0C, 0xF0, 0x00, 0x10, 0x24, 0x64, 0x26, 0x6F, + 0x18, 0x56, 0x35, 0x01, 0x0C, 0x40, 0x34, 0x01, 0x26, 0x55, 0x06, 0x35, 0xD7, 0x31, 0x3F, 0x55, + 0x03, 0x00, 0x18, 0x36, 0x34, 0x01, 0x26, 0x46, 0x26, 0x53, 0x38, 0x31, 0xCC, 0x00, 0x23, 0x55, + 0x26, 0x55, 0x26, 0x53, 0x70, 0x55, 0x78, 0x36, 0x36, 0x01, 0xB9, 0x71, 0x38, 0x01, 0x06, 0x25, + 0xB9, 0x41, 0x34, 0x01, 0x26, 0xD5, 0xB9, 0x51, 0x2C, 0x01, 0xB9, 0x61, 0x30, 0x01, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x61, 0x30, 0x01, 0x38, 0x51, 0x2C, 0x01, 0x78, 0x36, 0x38, 0x01, 0x26, 0x92, + 0x06, 0x25, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x34, 0x01, 0x26, 0xA2, 0x04, 0x30, 0x06, 0x24, + 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x38, 0x71, 0x38, 0x01, 0x24, 0x71, 0x43, 0x77, + 0xF2, 0xB5, 0xC4, 0xD0, 0x92, 0x02, 0x04, 0xD1, 0x06, 0x3D, 0x06, 0x29, 0x0B, 0x9B, 0x00, 0x00, + 0xA9, 0x2C, 0x36, 0x01, 0x06, 0x3D, 0x06, 0x2A, 0x24, 0xB1, 0x0B, 0x9B, 0x00, 0x00, 0x23, 0xBB, + 0xA9, 0x2C, 0x38, 0x01, 0x43, 0xC8, 0xFA, 0x6C, 0xFF, 0xFF, 0x34, 0xD1, 0x43, 0xDD, 0x14, 0xC1, + 0x0C, 0xA0, 0x00, 0x10, 0xC6, 0xDC, 0x82, 0x1E, 0x06, 0x7D, 0xD7, 0x71, 0x24, 0x74, 0x0C, 0x50, + 0x00, 0x10, 0x26, 0x75, 0xF8, 0x67, 0x36, 0x01, 0x0C, 0x20, 0x34, 0x01, 0x26, 0x27, 0x92, 0x0F, + 0xF8, 0x77, 0x38, 0x01, 0x92, 0x0C, 0xC4, 0xD3, 0x12, 0x0A, 0x06, 0x3D, 0xD7, 0x31, 0x26, 0x3A, + 0x2C, 0x30, 0x40, 0x01, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x34, 0xD1, 0x43, 0xDD, + 0xF2, 0xE2, 0x0C, 0x60, 0x00, 0x10, 0x18, 0x76, 0x04, 0x00, 0xC6, 0x7B, 0xA2, 0x06, 0x99, 0xB6, + 0x04, 0x00, 0xF2, 0x03, 0x99, 0x0E, 0x56, 0x02, 0x98, 0x7E, 0x0A, 0x05, 0x92, 0x08, 0x28, 0x7E, + 0x06, 0x00, 0xD4, 0x72, 0x82, 0x13, 0xB8, 0x71, 0xB0, 0x00, 0x32, 0x10, 0x38, 0x60, 0x94, 0x15, + 0x18, 0x7E, 0x0B, 0x05, 0x99, 0x0E, 0x04, 0x00, 0x18, 0x66, 0xC4, 0x00, 0xC6, 0x67, 0xD2, 0x03, + 0x99, 0x0E, 0x0A, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x0B, 0x05, 0x18, 0x7E, 0x04, 0x00, 0x99, 0x7E, + 0x05, 0x00, 0x99, 0x7E, 0x1A, 0x00, 0x58, 0xC1, 0x50, 0x01, 0x58, 0x81, 0x40, 0x01, 0x2C, 0x10, + 0x60, 0x01, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xE0, 0x6A, 0x11, 0x98, 0x70, + 0xAD, 0x15, 0x82, 0x04, 0x2C, 0xE0, 0x96, 0x00, 0xF2, 0x06, 0x38, 0x70, 0x94, 0x15, 0x28, 0x77, + 0x1E, 0x00, 0x26, 0xE7, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x04, 0x3E, 0x5C, 0x20, + 0xFF, 0x01, 0x8B, 0xA1, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2D, 0x92, 0x03, 0x2C, 0xE0, + 0x64, 0x00, 0x6B, 0xBA, 0x00, 0x00, 0x06, 0xD2, 0x6B, 0xC7, 0x03, 0x00, 0xC6, 0xDE, 0x04, 0x21, + 0xB2, 0x02, 0x04, 0x20, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x24, 0x00, + 0xD9, 0xC1, 0x14, 0x00, 0x38, 0xE0, 0x94, 0x15, 0xD9, 0x81, 0x04, 0x00, 0x06, 0xD2, 0x04, 0x30, + 0x06, 0x2B, 0x0C, 0x20, 0xB2, 0x10, 0x0C, 0x40, 0x7C, 0x00, 0x0C, 0x90, 0x00, 0x10, 0x0C, 0x80, + 0xCA, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xB0, 0xB2, 0x10, 0x26, 0x89, 0x06, 0xCD, + 0x06, 0xAD, 0x28, 0x4A, 0xE4, 0x01, 0x28, 0x3A, 0xE2, 0x01, 0x28, 0x2A, 0xE0, 0x01, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0x30, 0x6C, 0x3F, 0x22, 0x06, 0x00, 0xB1, 0x2C, 0x18, 0x3E, 0x0B, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x06, 0x62, 0x38, 0x3C, + 0xF0, 0x00, 0x18, 0x2E, 0x0C, 0x00, 0xB1, 0x61, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9B, 0x00, 0x00, 0x30, 0x61, 0x06, 0x42, 0x0C, 0x30, 0x11, 0x00, 0x06, 0x26, 0xB1, 0x41, + 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x5E, 0x14, 0x00, 0x30, 0x41, 0xC6, 0x25, 0x06, 0x62, 0x02, 0x02, + 0x06, 0x65, 0x06, 0x24, 0x0C, 0x30, 0x14, 0x00, 0xB1, 0x61, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x5E, + 0x16, 0x00, 0x30, 0x61, 0xC6, 0x25, 0x02, 0x02, 0x06, 0x25, 0x18, 0x3E, 0x0E, 0x00, 0x3F, 0x22, + 0x06, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0xA1, 0x2B, + 0x24, 0xB2, 0xC6, 0xB8, 0x24, 0xA6, 0x24, 0xC4, 0x92, 0xB5, 0x0C, 0x80, 0xEE, 0x10, 0x2C, 0x90, + 0x16, 0x01, 0x06, 0xCD, 0x06, 0xBD, 0x28, 0x4B, 0x98, 0x02, 0x28, 0x3B, 0x96, 0x02, 0x28, 0x2B, + 0x94, 0x02, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0x38, 0x7C, 0x78, 0x00, 0x3F, 0x22, 0x07, 0x00, + 0xB9, 0x2C, 0x78, 0x00, 0x18, 0x3E, 0x09, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9B, 0x00, 0x00, 0x06, 0x72, 0x38, 0x3C, 0x68, 0x01, 0x18, 0x2E, 0x0A, 0x00, 0xB1, 0x71, + 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x30, 0x71, 0x06, 0x52, + 0x04, 0x39, 0x06, 0x27, 0xB1, 0x51, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x6E, 0x10, 0x00, 0x30, 0x51, + 0xC6, 0x26, 0x06, 0x72, 0x02, 0x02, 0x06, 0x76, 0x06, 0x25, 0x04, 0x3C, 0xB1, 0x71, 0x4B, 0x9E, + 0x00, 0x00, 0x28, 0x6E, 0x12, 0x00, 0x30, 0x71, 0xC6, 0x26, 0x02, 0x02, 0x06, 0x26, 0x18, 0x3E, + 0x0D, 0x00, 0x3F, 0x22, 0x07, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, + 0x00, 0x00, 0xA1, 0x28, 0x24, 0x82, 0xC6, 0x89, 0x24, 0xB6, 0x24, 0xC4, 0x92, 0xB5, 0x28, 0x4D, + 0x16, 0x03, 0x28, 0x3D, 0x14, 0x03, 0x28, 0x2D, 0x12, 0x03, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0x38, 0x7D, 0xCC, 0x00, 0x3F, 0x22, 0x07, 0x00, 0xB9, 0x2D, 0xCC, 0x00, 0x18, 0x3E, 0x18, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x38, 0x3D, 0xBC, 0x01, + 0x06, 0xB2, 0x18, 0x2E, 0x19, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, + 0x00, 0x00, 0x06, 0xC2, 0x04, 0x39, 0x06, 0x2B, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x7E, 0x1A, 0x00, + 0x06, 0xD2, 0xC6, 0x27, 0x02, 0x02, 0x06, 0xD7, 0x06, 0x2C, 0x04, 0x3C, 0x4B, 0x9E, 0x00, 0x00, + 0x28, 0x7E, 0x1C, 0x00, 0x0C, 0xA0, 0x00, 0x10, 0xC6, 0x27, 0x02, 0x02, 0x06, 0x27, 0x36, 0xD2, + 0xA9, 0xDA, 0x18, 0x01, 0x58, 0xC1, 0x14, 0x00, 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0xD0, 0x03, 0xD9, 0xC1, 0xC0, 0x03, 0x38, 0xC0, 0x94, 0x15, + 0xD9, 0x81, 0xB0, 0x03, 0x0C, 0xD0, 0x00, 0x10, 0x18, 0x7C, 0xB8, 0x00, 0x18, 0x6D, 0x2E, 0x01, + 0xC6, 0x67, 0x28, 0x7D, 0x06, 0x00, 0xA2, 0x09, 0x6C, 0x70, 0x00, 0x01, 0xA9, 0x7D, 0x06, 0x00, + 0x04, 0x61, 0x99, 0x60, 0xBD, 0x15, 0xF2, 0x06, 0x1C, 0x20, 0x01, 0x01, 0x56, 0x72, 0xA9, 0x7D, + 0x06, 0x00, 0x98, 0x70, 0xAD, 0x15, 0xA9, 0x0D, 0x58, 0x02, 0xA9, 0x0D, 0x5A, 0x02, 0xA9, 0x0D, + 0x5C, 0x02, 0xA9, 0x0D, 0x5E, 0x02, 0xA9, 0x0D, 0x60, 0x02, 0x92, 0x0E, 0x0C, 0x50, 0x30, 0x00, + 0x0C, 0x60, 0x2E, 0x00, 0x26, 0x5C, 0x26, 0x6C, 0x70, 0x55, 0x20, 0x66, 0xB9, 0x51, 0x84, 0x03, + 0xB9, 0x61, 0x70, 0x03, 0xF2, 0x08, 0x0C, 0x70, 0x90, 0x01, 0x04, 0x80, 0xB9, 0x71, 0x70, 0x03, + 0xB9, 0x81, 0x84, 0x03, 0x06, 0x21, 0x0C, 0x30, 0x50, 0x03, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, + 0x06, 0x67, 0x0C, 0x60, 0x98, 0x15, 0x20, 0x76, 0xB9, 0x01, 0x5C, 0x03, 0x04, 0x52, 0xB9, 0x71, + 0xA0, 0x03, 0x28, 0x7D, 0x06, 0x00, 0xB9, 0x01, 0x58, 0x03, 0x26, 0x56, 0x54, 0x78, 0x23, 0x77, + 0x20, 0x55, 0xB9, 0x71, 0x68, 0x03, 0x06, 0x87, 0x0C, 0x80, 0xBA, 0x15, 0x10, 0x78, 0xB9, 0x51, + 0xA4, 0x03, 0x0C, 0x50, 0x74, 0x02, 0x26, 0x5D, 0x20, 0x55, 0xB9, 0x71, 0x9C, 0x03, 0x38, 0x71, + 0x48, 0x03, 0x38, 0x81, 0x4C, 0x03, 0xB9, 0x51, 0x7C, 0x03, 0xB9, 0x71, 0x94, 0x03, 0x0C, 0x40, + 0x78, 0x00, 0x04, 0x70, 0x0C, 0x50, 0x94, 0x02, 0xB9, 0x01, 0x54, 0x03, 0xB9, 0x01, 0x50, 0x03, + 0xB9, 0x01, 0xAC, 0x03, 0xB9, 0x01, 0x78, 0x03, 0xB9, 0x01, 0x80, 0x03, 0xB9, 0x81, 0x90, 0x03, + 0x26, 0x41, 0x26, 0x51, 0xB9, 0x71, 0x60, 0x03, 0xB9, 0x71, 0x98, 0x03, 0xB9, 0x71, 0x74, 0x03, + 0x06, 0xB7, 0xB9, 0x71, 0x64, 0x03, 0x38, 0x21, 0x64, 0x03, 0x06, 0x92, 0x0C, 0xF0, 0x00, 0x07, + 0x26, 0x22, 0x26, 0xF2, 0x0C, 0x60, 0xE0, 0x01, 0x0C, 0x80, 0x80, 0x02, 0x06, 0xE1, 0x26, 0x61, + 0xB9, 0xF1, 0xA8, 0x03, 0xB9, 0x91, 0x6C, 0x03, 0x26, 0x28, 0x04, 0x30, 0x0C, 0xA0, 0x80, 0x02, + 0x20, 0xF2, 0x38, 0x81, 0xA8, 0x03, 0x0C, 0x90, 0xFF, 0x0F, 0x56, 0x9F, 0x2F, 0xF3, 0x03, 0x00, + 0x26, 0xF8, 0x20, 0xFF, 0xB9, 0x91, 0x88, 0x03, 0x0C, 0x90, 0xFF, 0x0F, 0x56, 0x9F, 0x38, 0xF1, + 0x88, 0x03, 0xB9, 0x91, 0x8C, 0x03, 0x38, 0x81, 0xA0, 0x03, 0x36, 0xF9, 0x38, 0x91, 0x6C, 0x03, + 0xC6, 0x89, 0x82, 0x0C, 0x38, 0x81, 0xA4, 0x03, 0xC6, 0x89, 0x82, 0x08, 0xC4, 0x3B, 0x1A, 0x8E, + 0x01, 0x00, 0xCC, 0x70, 0x13, 0x00, 0x1A, 0x86, 0x01, 0x00, 0xC4, 0xF0, 0xA1, 0xF2, 0x2A, 0x94, + 0x00, 0x00, 0xCC, 0x70, 0x13, 0x00, 0x12, 0x1E, 0x30, 0x9E, 0x26, 0x9F, 0xB1, 0x9E, 0x20, 0x96, + 0xC6, 0x9F, 0x32, 0x09, 0x28, 0x86, 0x02, 0x00, 0xA1, 0xF6, 0xA9, 0x96, 0x02, 0x00, 0xA9, 0x86, + 0x04, 0x00, 0xF2, 0x10, 0x28, 0x96, 0x02, 0x00, 0xC6, 0x9F, 0x32, 0x06, 0xA9, 0x96, 0x04, 0x00, + 0xA9, 0xF6, 0x02, 0x00, 0xF2, 0x07, 0x28, 0x96, 0x04, 0x00, 0xC6, 0x9F, 0x32, 0x03, 0xA9, 0xF6, + 0x04, 0x00, 0x30, 0x94, 0x26, 0x9F, 0xB1, 0x94, 0x20, 0x95, 0xC6, 0x9F, 0x32, 0x09, 0x28, 0x85, + 0x02, 0x00, 0xA1, 0xF5, 0xA9, 0x95, 0x02, 0x00, 0xA9, 0x85, 0x04, 0x00, 0xF2, 0x10, 0x28, 0x95, + 0x02, 0x00, 0xC6, 0x9F, 0x32, 0x06, 0xA9, 0x95, 0x04, 0x00, 0xA9, 0xF5, 0x02, 0x00, 0xF2, 0x07, + 0x28, 0x95, 0x04, 0x00, 0xC6, 0x9F, 0x32, 0x03, 0xA9, 0xF5, 0x04, 0x00, 0xC6, 0xFB, 0x02, 0x06, + 0xB9, 0x71, 0x98, 0x03, 0xB9, 0x31, 0x74, 0x03, 0x06, 0xBF, 0xB8, 0x91, 0x68, 0x03, 0x9A, 0x45, + 0x01, 0x00, 0xCC, 0xF0, 0xED, 0x02, 0x0C, 0x90, 0xEE, 0x02, 0x1A, 0x45, 0x01, 0x00, 0xCC, 0xF0, + 0xC8, 0x00, 0x02, 0x06, 0x28, 0x9D, 0x58, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0x58, 0x02, 0xB8, 0x81, + 0x68, 0x03, 0x0C, 0x90, 0x64, 0x00, 0x82, 0x03, 0x0C, 0x90, 0xC8, 0x00, 0xC6, 0xF9, 0x02, 0x06, + 0x28, 0x9D, 0x5A, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0x5A, 0x02, 0xB8, 0x81, 0x68, 0x03, 0x0C, 0x90, + 0x50, 0x00, 0x82, 0x03, 0x0C, 0x90, 0xB4, 0x00, 0xC6, 0xF9, 0x02, 0x06, 0x28, 0x9D, 0x5C, 0x02, + 0x24, 0x91, 0xA9, 0x9D, 0x5C, 0x02, 0xB8, 0x81, 0x68, 0x03, 0x0C, 0x90, 0x64, 0x00, 0x82, 0x03, + 0x0C, 0x90, 0xFA, 0x00, 0xC6, 0xF9, 0x02, 0x06, 0x28, 0x9D, 0x5E, 0x02, 0x24, 0x91, 0xA9, 0x9D, + 0x5E, 0x02, 0xB8, 0x91, 0x9C, 0x03, 0x82, 0x0B, 0xA9, 0x0D, 0x58, 0x02, 0xA9, 0x0D, 0x5A, 0x02, + 0xA9, 0x0D, 0x5C, 0x02, 0xA9, 0x0D, 0x5E, 0x02, 0xA9, 0x0D, 0x60, 0x02, 0x28, 0x9C, 0xB6, 0x00, + 0xC6, 0xF9, 0x1A, 0x0B, 0x01, 0x00, 0x38, 0xF1, 0x8C, 0x03, 0x38, 0x81, 0x88, 0x03, 0x36, 0xF8, + 0xC4, 0xF0, 0x02, 0x28, 0xCC, 0x70, 0x13, 0x00, 0x12, 0x06, 0x38, 0x9E, 0xF0, 0x00, 0x26, 0x9F, + 0xB9, 0x9E, 0xF0, 0x00, 0x38, 0x94, 0xF0, 0x00, 0x26, 0x9F, 0xB9, 0x94, 0xF0, 0x00, 0x28, 0x9C, + 0xB6, 0x00, 0xC6, 0xF9, 0x02, 0x0E, 0x38, 0x81, 0x60, 0x03, 0x26, 0x99, 0xC6, 0xF9, 0x24, 0x81, + 0xB9, 0x81, 0x60, 0x03, 0x02, 0x06, 0x38, 0x91, 0x80, 0x03, 0x24, 0x91, 0xB9, 0x91, 0x80, 0x03, + 0xCC, 0xF0, 0xC8, 0x00, 0x02, 0x07, 0x38, 0xF1, 0x7C, 0x03, 0x24, 0xF1, 0x23, 0xFF, 0xB9, 0xF1, + 0x7C, 0x03, 0x38, 0xF1, 0x6C, 0x03, 0x24, 0x31, 0xC4, 0x3E, 0x24, 0xF1, 0xB9, 0xF1, 0x6C, 0x03, + 0x24, 0x22, 0x24, 0xE4, 0x24, 0x66, 0x9A, 0x0D, 0xFF, 0xFF, 0x38, 0x21, 0x64, 0x03, 0x30, 0x34, + 0x38, 0x61, 0x94, 0x03, 0x38, 0x81, 0x90, 0x03, 0x24, 0x2E, 0x26, 0x36, 0xCC, 0x20, 0x34, 0x01, + 0x38, 0x64, 0xF0, 0x00, 0xB9, 0x21, 0x64, 0x03, 0x24, 0x71, 0x26, 0x68, 0x24, 0x44, 0x24, 0x56, + 0x82, 0x07, 0xB9, 0x31, 0x94, 0x03, 0xB9, 0x61, 0x90, 0x03, 0xFA, 0xDE, 0xFE, 0xFF, 0x38, 0xF1, + 0x78, 0x03, 0x38, 0x21, 0x60, 0x03, 0x38, 0x51, 0x80, 0x03, 0x38, 0x71, 0x7C, 0x03, 0x38, 0x91, + 0xAC, 0x03, 0xB9, 0x31, 0x48, 0x03, 0xB9, 0xF1, 0x5C, 0x03, 0xB9, 0x21, 0x50, 0x03, 0xB9, 0x51, + 0x54, 0x03, 0xA9, 0x7D, 0x74, 0x02, 0xB9, 0x61, 0x4C, 0x03, 0xB9, 0x91, 0x58, 0x03, 0xAB, 0xCA, + 0x03, 0x00, 0x6B, 0xC7, 0x03, 0x00, 0xE8, 0x3D, 0x0D, 0x05, 0x22, 0x33, 0x28, 0x60, 0x98, 0x15, + 0x28, 0x2C, 0xC6, 0x00, 0x26, 0x66, 0x2F, 0x76, 0x0A, 0x00, 0x70, 0x47, 0x04, 0x51, 0xC6, 0x42, + 0x12, 0x02, 0x04, 0x50, 0x04, 0x70, 0xC6, 0x47, 0x13, 0x55, 0x02, 0x02, 0x23, 0x74, 0x0C, 0x80, + 0x98, 0x15, 0x28, 0x48, 0x02, 0x00, 0x26, 0x44, 0x26, 0x4A, 0x70, 0x44, 0xC6, 0x42, 0x02, 0x03, + 0x24, 0x51, 0x13, 0x55, 0xC6, 0x74, 0x32, 0x02, 0x23, 0x74, 0xC4, 0x50, 0x82, 0x12, 0xC4, 0x30, + 0x26, 0x6A, 0x92, 0x03, 0xA1, 0x76, 0xF2, 0x02, 0xA1, 0x06, 0x0C, 0x90, 0x98, 0x15, 0x28, 0x69, + 0x02, 0x00, 0xC4, 0x31, 0x26, 0x66, 0x26, 0xA6, 0x92, 0x03, 0xA1, 0x7A, 0xF2, 0x02, 0xA1, 0x0A, + 0x30, 0x7C, 0x28, 0xEC, 0x2C, 0x00, 0xD4, 0x71, 0xA9, 0xED, 0x0E, 0x00, 0x82, 0x1C, 0x38, 0x31, + 0x48, 0x03, 0x38, 0x21, 0x70, 0x03, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x50, 0x78, 0x0B, 0x9B, + 0x00, 0x00, 0x06, 0xC2, 0x38, 0x31, 0x70, 0x03, 0x38, 0x21, 0x84, 0x03, 0xAB, 0x97, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x22, 0x26, 0x2C, 0xC6, 0x2E, 0xB2, 0x03, + 0xA9, 0x2D, 0x0E, 0x00, 0x06, 0x21, 0x6B, 0xD7, 0x02, 0x00, 0xC4, 0xB0, 0x82, 0x14, 0x38, 0x71, + 0x74, 0x03, 0x26, 0x77, 0x26, 0x7D, 0x78, 0x67, 0xB2, 0x00, 0x38, 0x71, 0x98, 0x03, 0x2C, 0x70, + 0x1E, 0x00, 0x26, 0x77, 0x26, 0x7D, 0x78, 0x77, 0xB2, 0x00, 0x26, 0x76, 0x36, 0xB7, 0xC4, 0xB0, + 0x32, 0x02, 0x04, 0xB0, 0x0C, 0x30, 0x50, 0x03, 0x06, 0x21, 0x26, 0x31, 0xA9, 0xBD, 0x2A, 0x01, + 0xCB, 0x18, 0x03, 0x00, 0x58, 0xC1, 0xC0, 0x03, 0x58, 0x81, 0xB0, 0x03, 0x2C, 0x10, 0xD0, 0x03, + 0xE1, 0xF0, 0xCC, 0x70, 0x15, 0x00, 0x8A, 0x7A, 0xFE, 0xFF, 0x04, 0x90, 0xC6, 0xF9, 0x02, 0x02, + 0x43, 0x9F, 0xA1, 0x92, 0xFA, 0x37, 0xFF, 0xFF, 0xCC, 0xF0, 0x57, 0x02, 0x0C, 0x90, 0x58, 0x02, + 0x0A, 0xBF, 0xFE, 0xFF, 0xC6, 0xF9, 0x0A, 0xEE, 0xFE, 0xFF, 0x28, 0x9D, 0x60, 0x02, 0x24, 0x91, + 0xA9, 0x9D, 0x60, 0x02, 0xFA, 0xE7, 0xFE, 0xFF, 0x26, 0x99, 0x38, 0x81, 0xAC, 0x03, 0xC6, 0xF9, + 0x24, 0x81, 0x02, 0x06, 0x38, 0xF1, 0x78, 0x03, 0x24, 0xF1, 0xB9, 0xF1, 0x78, 0x03, 0xB9, 0x81, + 0xAC, 0x03, 0xFA, 0xEA, 0xFE, 0xFF, 0x00, 0x00, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0xD1, 0x81, 0x0C, 0xE0, 0x80, 0x02, 0x78, 0x7E, 0x4A, 0x02, 0xCC, 0x70, 0x00, 0x01, 0x12, 0x06, + 0x78, 0x7E, 0x48, 0x02, 0xCC, 0x70, 0x00, 0x01, 0x02, 0x0A, 0x0C, 0x60, 0x2C, 0x02, 0x0C, 0x70, + 0x94, 0x04, 0x26, 0x6E, 0xA1, 0x07, 0x24, 0x72, 0xC6, 0x76, 0x92, 0xFD, 0x78, 0xA0, 0x18, 0x11, + 0x06, 0xD7, 0x0C, 0x30, 0xE6, 0x04, 0x0C, 0xD0, 0x18, 0x11, 0x04, 0x20, 0x0C, 0x40, 0x15, 0x00, + 0x14, 0x91, 0x06, 0xFB, 0x0C, 0xF0, 0xCC, 0x10, 0x06, 0x73, 0x04, 0x5D, 0xC4, 0x5B, 0x12, 0x16, + 0xCC, 0x40, 0x13, 0x00, 0x12, 0x08, 0x70, 0x8F, 0x70, 0x6D, 0x70, 0xC7, 0x26, 0x68, 0x3F, 0x66, + 0x0C, 0x00, 0xF2, 0x0D, 0xCC, 0x40, 0x15, 0x00, 0x92, 0x0C, 0x70, 0x67, 0x36, 0x6A, 0xC4, 0x60, + 0x06, 0xC6, 0x32, 0x02, 0x04, 0xC0, 0x26, 0x2C, 0xF2, 0x02, 0x70, 0x67, 0xC4, 0x60, 0x12, 0x03, + 0xA1, 0x07, 0xF2, 0x02, 0xA1, 0x67, 0x34, 0x51, 0xC6, 0x59, 0x34, 0x72, 0x34, 0xF2, 0x92, 0xDF, + 0x34, 0x41, 0xC6, 0x45, 0x3C, 0x30, 0x1C, 0x00, 0x34, 0xD2, 0x92, 0xD4, 0x04, 0x3C, 0x0B, 0x9B, + 0x00, 0x00, 0x0C, 0x70, 0xCC, 0x04, 0x2C, 0xE0, 0x64, 0x02, 0x20, 0x67, 0x36, 0x62, 0xC3, 0x66, + 0x22, 0x03, 0xA1, 0x67, 0xF2, 0x02, 0xA1, 0x07, 0xF8, 0x67, 0x1C, 0x00, 0x32, 0x03, 0xA9, 0x07, + 0x1C, 0x00, 0x24, 0x72, 0xC6, 0x7E, 0x92, 0xF2, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, + 0x20, 0x00, 0xE1, 0xF0, 0xC4, 0x20, 0x0C, 0x70, 0x00, 0x10, 0x28, 0x37, 0x06, 0x00, 0x82, 0x15, + 0x64, 0x38, 0xA9, 0x37, 0x06, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x48, 0xDF, 0xB9, 0x70, + 0x94, 0x15, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xE4, 0xDD, 0xB9, 0x70, 0x90, 0x15, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x70, 0x4C, 0xDD, 0xF2, 0x15, 0x14, 0x29, 0x56, 0x32, 0xA9, 0x37, 0x06, 0x00, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x7C, 0xDE, 0xB9, 0x70, 0x94, 0x15, 0x08, 0x70, 0x00, 0x80, + 0x2C, 0x70, 0x30, 0xDE, 0xB9, 0x70, 0x90, 0x15, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x98, 0xDD, + 0xB9, 0x70, 0x8C, 0x15, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x70, 0x00, 0x10, 0x99, 0x07, 0x31, 0x01, + 0x99, 0x07, 0x30, 0x01, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD2, + 0x38, 0x22, 0x4C, 0x03, 0x06, 0xE3, 0x0C, 0x30, 0xF0, 0x00, 0x38, 0xC0, 0x94, 0x15, 0x0B, 0x9B, + 0x00, 0x00, 0x0C, 0x70, 0x00, 0x10, 0xB9, 0x2D, 0x4C, 0x03, 0x06, 0x32, 0x28, 0x27, 0x06, 0x00, + 0x30, 0x5E, 0x38, 0x4E, 0x08, 0x00, 0x38, 0xFE, 0x04, 0x00, 0x04, 0x68, 0x56, 0x62, 0xA3, 0xD6, + 0x5C, 0x20, 0x80, 0x00, 0x82, 0x18, 0x26, 0x44, 0xC6, 0x54, 0x04, 0x61, 0x12, 0x06, 0xCC, 0x30, + 0xFA, 0x00, 0xD2, 0x02, 0x04, 0x60, 0x13, 0x66, 0xCC, 0xF0, 0x23, 0x00, 0x02, 0x07, 0x38, 0x4E, + 0x0C, 0x00, 0xCC, 0x40, 0x22, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x1D, 0xCC, 0x50, + 0x14, 0x00, 0xF2, 0x18, 0xCC, 0x30, 0x96, 0x00, 0x04, 0x61, 0xD2, 0x02, 0x06, 0x6D, 0xC6, 0x54, + 0x13, 0x66, 0x02, 0x04, 0xC4, 0x58, 0x02, 0x02, 0x04, 0x61, 0xCC, 0xF0, 0x14, 0x00, 0x02, 0x07, + 0x38, 0x4E, 0x0C, 0x00, 0xCC, 0x40, 0x13, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x04, + 0xC4, 0x5A, 0x02, 0x02, 0x04, 0x61, 0x98, 0x50, 0xBA, 0x15, 0x92, 0x12, 0xC4, 0x60, 0x82, 0x10, + 0x18, 0x67, 0x2E, 0x01, 0xCC, 0x60, 0xFF, 0x00, 0x82, 0x04, 0x24, 0x61, 0x99, 0x67, 0x2E, 0x01, + 0x98, 0x67, 0x2F, 0x01, 0x82, 0x17, 0x34, 0x61, 0x99, 0x67, 0x2F, 0x01, 0xF2, 0x13, 0x18, 0x67, + 0x2F, 0x01, 0x24, 0x61, 0x13, 0x66, 0x99, 0x67, 0x2F, 0x01, 0x18, 0x5C, 0xB9, 0x00, 0xC6, 0x56, + 0x92, 0x09, 0x98, 0x67, 0x2E, 0x01, 0x99, 0x07, 0x2F, 0x01, 0x82, 0x04, 0x34, 0x61, 0x99, 0x67, + 0x2E, 0x01, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x70, 0xB1, 0x15, + 0xC4, 0x71, 0x82, 0x07, 0x0C, 0x50, 0x7F, 0x04, 0x0C, 0x60, 0xFE, 0x07, 0x04, 0x70, 0xF2, 0x06, + 0x0C, 0x50, 0x7D, 0x04, 0x0C, 0x60, 0xFC, 0x07, 0x04, 0x72, 0x70, 0x42, 0xC6, 0x47, 0x32, 0x03, + 0xA1, 0x72, 0xF2, 0x04, 0xC6, 0x45, 0x02, 0x02, 0xA1, 0x52, 0x78, 0x52, 0x02, 0x00, 0xC6, 0x57, + 0x32, 0x04, 0xA9, 0x72, 0x02, 0x00, 0xF2, 0x05, 0xC6, 0x56, 0x02, 0x03, 0xA9, 0x62, 0x02, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0xAD, 0x15, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0xD1, 0x81, 0x06, 0xE2, 0x82, 0x06, 0x04, 0x70, 0x0C, 0xA0, 0x64, 0x00, 0x06, 0xB7, 0xF2, 0x05, + 0x04, 0x71, 0x0C, 0xA0, 0x67, 0x00, 0x04, 0xB3, 0x20, 0x6E, 0x23, 0x77, 0x26, 0x67, 0xA1, 0x6E, + 0x28, 0x6E, 0x02, 0x00, 0x06, 0x2E, 0x26, 0x76, 0xA9, 0x7E, 0x02, 0x00, 0x6B, 0x20, 0x03, 0x00, + 0x0C, 0x70, 0x00, 0x10, 0x18, 0x67, 0x2B, 0x03, 0xC4, 0x62, 0x92, 0x08, 0x20, 0x6E, 0xA9, 0x67, + 0x1C, 0x00, 0x28, 0x6E, 0x02, 0x00, 0xA9, 0x67, 0x1E, 0x00, 0x18, 0x67, 0x27, 0x03, 0xC4, 0x61, + 0xD2, 0x11, 0x28, 0xC7, 0x1C, 0x00, 0x1C, 0x60, 0x50, 0x00, 0x26, 0x6C, 0xCC, 0x60, 0xE0, 0x03, + 0xD2, 0x09, 0x28, 0xD7, 0x1E, 0x00, 0x1C, 0x70, 0x50, 0x00, 0x26, 0x7D, 0xCC, 0x70, 0x5F, 0x07, + 0xC2, 0x05, 0x0C, 0xD0, 0xFF, 0x03, 0x0C, 0xC0, 0x40, 0x02, 0xCC, 0xA0, 0x64, 0x00, 0x04, 0x90, + 0x82, 0x04, 0x1C, 0x90, 0x64, 0x00, 0x26, 0x9A, 0x70, 0xAE, 0xC6, 0xAC, 0x3F, 0x7C, 0x0A, 0x00, + 0x32, 0x02, 0x24, 0x71, 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0x82, 0x02, 0x00, 0x26, 0x82, + 0x06, 0x68, 0xC4, 0x20, 0xD7, 0x62, 0x26, 0x86, 0x26, 0x82, 0x82, 0x05, 0x06, 0x39, 0xAB, 0x97, + 0x00, 0x00, 0x26, 0x82, 0x04, 0x71, 0xD6, 0x7B, 0x82, 0x0F, 0x06, 0x28, 0x0C, 0x30, 0x64, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0xC6, 0xAC, 0x22, 0x04, 0x26, 0xC2, 0xA1, 0xCE, 0xF2, 0x05, 0x34, 0xC1, + 0x3F, 0x22, 0x0C, 0x00, 0xA1, 0x2E, 0x78, 0xCE, 0x02, 0x00, 0xC6, 0xCD, 0x3F, 0x7D, 0x0C, 0x00, + 0x32, 0x02, 0x24, 0x71, 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0xA2, 0x02, 0x00, 0x26, 0xA2, + 0x06, 0x6A, 0xC4, 0x20, 0xD7, 0x62, 0x26, 0xA6, 0x26, 0xA2, 0x82, 0x05, 0x06, 0x39, 0xAB, 0x97, + 0x00, 0x00, 0x26, 0xA2, 0xD4, 0xB2, 0x82, 0x11, 0x06, 0x2A, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, + 0x00, 0x00, 0xC6, 0xCD, 0x22, 0x05, 0x26, 0xD2, 0xA9, 0xDE, 0x02, 0x00, 0xF2, 0x06, 0x34, 0xD1, + 0x3F, 0x22, 0x0D, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, + 0x20, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0x08, 0xC0, 0x00, 0xFF, + 0x0C, 0xE0, 0x3C, 0x15, 0x04, 0xD0, 0x2C, 0xC0, 0xFF, 0x0F, 0x28, 0x70, 0x50, 0x15, 0x63, 0x7D, + 0xD4, 0x71, 0x82, 0x25, 0x30, 0x6E, 0x06, 0x76, 0x77, 0x76, 0x5C, 0x70, 0xFF, 0x0F, 0xA1, 0x71, + 0x18, 0x70, 0xB1, 0x15, 0x5C, 0x60, 0xFF, 0x0F, 0xC4, 0x71, 0xA9, 0x61, 0x02, 0x00, 0x92, 0x04, + 0x06, 0x21, 0xAB, 0x22, 0x03, 0x00, 0x06, 0x21, 0x6B, 0x20, 0x03, 0x00, 0x20, 0x61, 0x30, 0x7E, + 0x5C, 0x60, 0xFF, 0x0F, 0x57, 0x66, 0x56, 0x7C, 0x66, 0x76, 0x28, 0x61, 0x02, 0x00, 0x1C, 0x50, + 0x00, 0x10, 0x5C, 0x60, 0xFF, 0x0F, 0x56, 0x75, 0x66, 0x76, 0xB1, 0x7E, 0x24, 0xD1, 0xC4, 0xD5, + 0x24, 0xE4, 0x92, 0xD4, 0x58, 0xC1, 0x04, 0x00, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0x0C, 0x20, 0x31, 0x15, 0x14, 0x31, 0x04, 0x45, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x2C, 0x15, 0x14, 0x31, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x0C, 0xE0, 0x00, 0x10, 0x38, 0x7E, 0x10, 0x05, 0x18, 0x6E, 0x08, 0x05, 0x77, 0x76, 0x54, 0x7F, + 0xA6, 0x76, 0x82, 0x0E, 0x04, 0x71, 0x99, 0x7E, 0x52, 0x05, 0xB9, 0x0E, 0x38, 0x05, 0x0C, 0x20, + 0x3C, 0x15, 0x04, 0x30, 0x0C, 0x40, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, + 0x08, 0x05, 0xCB, 0xCD, 0x01, 0x00, 0xAB, 0x81, 0x03, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0xB1, 0xB1, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0xDE, + 0x27, 0x03, 0x82, 0x19, 0x06, 0x2C, 0x0C, 0x20, 0xC8, 0x12, 0x0C, 0x30, 0x78, 0x12, 0x0C, 0x40, + 0x50, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x06, 0x2B, 0x0C, 0x20, 0x22, 0x13, 0x0C, 0x30, + 0x1D, 0x13, 0x04, 0x45, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0x27, 0x03, 0x99, 0x7E, + 0x28, 0x03, 0xF2, 0x2A, 0x06, 0x2B, 0x0C, 0x20, 0x22, 0x13, 0x06, 0x3D, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x2C, 0x0C, 0x20, 0xC8, 0x12, 0x06, 0x3D, 0x0C, 0x40, 0x50, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x18, 0x13, 0x06, 0x3D, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x7E, 0x06, 0x00, 0x99, 0x0E, 0x28, 0x03, 0x1C, 0x60, 0x14, 0x00, + 0x56, 0x76, 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, 0x94, 0x15, 0x99, 0x0E, 0x09, 0x05, 0x18, 0x77, + 0xC5, 0x00, 0x99, 0x7E, 0x0C, 0x05, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x18, 0x7E, + 0x52, 0x05, 0x06, 0xD2, 0x26, 0x72, 0xC4, 0x70, 0x0C, 0x20, 0x10, 0x15, 0x82, 0x0E, 0x0C, 0x30, + 0x38, 0x15, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0x52, 0x05, + 0x26, 0xD7, 0x99, 0xDE, 0x2A, 0x05, 0xF2, 0x14, 0x98, 0x3E, 0x2A, 0x05, 0x82, 0x0C, 0x0C, 0x30, + 0x38, 0x15, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x04, 0x71, 0x99, 0x7E, + 0x52, 0x05, 0xF2, 0x06, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xC2, 0x06, 0xE3, 0x06, 0x23, 0x06, 0x3C, 0xB1, 0xB1, 0x8B, 0xB8, 0x03, 0x00, 0x86, 0x22, + 0x9A, 0x82, 0x00, 0x00, 0xD4, 0xC3, 0x92, 0x05, 0x18, 0x7E, 0x0D, 0x00, 0xC4, 0x76, 0x92, 0x5B, + 0x18, 0x6E, 0x0A, 0x00, 0x14, 0x51, 0x26, 0x56, 0x04, 0x71, 0x53, 0x75, 0x0C, 0x50, 0x00, 0x10, + 0x28, 0x45, 0x50, 0x05, 0x43, 0x77, 0x66, 0x47, 0xA9, 0x45, 0x50, 0x05, 0x38, 0x45, 0x38, 0x05, + 0x1C, 0x30, 0x00, 0x04, 0x66, 0x74, 0x5C, 0x70, 0xFF, 0x03, 0x56, 0x43, 0x66, 0x47, 0x06, 0x74, + 0x77, 0x76, 0x24, 0x71, 0x54, 0x7F, 0x1C, 0x30, 0x01, 0xF0, 0x57, 0x76, 0x56, 0x43, 0x66, 0x47, + 0x57, 0x61, 0xB9, 0x45, 0x38, 0x05, 0x26, 0x65, 0x18, 0x7E, 0x0A, 0x00, 0x38, 0x56, 0x38, 0x05, + 0x08, 0x40, 0xFF, 0x0F, 0x2C, 0x40, 0xFF, 0xFF, 0x57, 0x7E, 0x56, 0x54, 0x66, 0x57, 0xB9, 0x56, + 0x38, 0x05, 0x20, 0x4E, 0x08, 0x70, 0x00, 0xFF, 0x5C, 0x40, 0xFF, 0x0F, 0x2C, 0x70, 0xFF, 0x0F, + 0x57, 0x46, 0x56, 0x75, 0x66, 0x74, 0xB9, 0x76, 0x38, 0x05, 0x28, 0x5E, 0x02, 0x00, 0x1C, 0x40, + 0x00, 0x10, 0x5C, 0x50, 0xFF, 0x0F, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0x38, 0x05, 0x18, 0x5E, + 0x0B, 0x00, 0x13, 0x75, 0xC4, 0x7F, 0xC2, 0x02, 0x04, 0x5F, 0x38, 0x76, 0x38, 0x05, 0x08, 0x40, + 0xFF, 0xF0, 0x54, 0x5F, 0x2C, 0x40, 0xFF, 0xFF, 0x57, 0x5C, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, + 0x38, 0x05, 0xF2, 0x03, 0xC4, 0x7A, 0x82, 0x03, 0x04, 0x20, 0xF2, 0x1D, 0x0C, 0xD0, 0xC8, 0x12, + 0x06, 0x7B, 0x0C, 0x70, 0x00, 0x10, 0x18, 0x77, 0x28, 0x03, 0xC6, 0xC7, 0x32, 0xF6, 0x18, 0x6E, + 0x0A, 0x00, 0x18, 0x7D, 0x0A, 0x00, 0xC6, 0x67, 0x92, 0x0A, 0x06, 0x2E, 0x06, 0x3D, 0x04, 0x44, + 0x6B, 0xCF, 0x03, 0x00, 0x18, 0x7D, 0x0B, 0x00, 0x99, 0x7E, 0x0B, 0x00, 0x24, 0xC1, 0x2C, 0xD0, + 0x10, 0x00, 0xF2, 0xE7, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, + 0x18, 0x72, 0x06, 0x00, 0xD4, 0x74, 0x82, 0x25, 0x0C, 0x40, 0x00, 0x10, 0x38, 0x54, 0x38, 0x05, + 0x08, 0x60, 0x1F, 0xFF, 0x06, 0x75, 0xF7, 0x7A, 0x24, 0x71, 0x54, 0x77, 0x2C, 0x60, 0xFF, 0xFF, + 0xD7, 0x7A, 0x56, 0x65, 0x66, 0x67, 0xB9, 0x64, 0x38, 0x05, 0x18, 0x52, 0x05, 0x00, 0x04, 0x71, + 0x34, 0x51, 0x53, 0x75, 0x06, 0x56, 0x77, 0x58, 0x66, 0x75, 0x08, 0x50, 0xE0, 0xFF, 0x5C, 0x70, + 0x1F, 0x00, 0x2C, 0x50, 0xFF, 0xFF, 0x57, 0x78, 0x56, 0x56, 0x66, 0x57, 0xB9, 0x54, 0x38, 0x05, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x0C, 0x60, 0x00, 0x10, 0x38, 0x76, 0x38, 0x05, + 0x77, 0x76, 0x54, 0x7F, 0xC4, 0x72, 0x02, 0x26, 0x28, 0x46, 0x50, 0x05, 0x04, 0x70, 0x0C, 0x30, + 0x3C, 0x15, 0x06, 0x57, 0x04, 0xF1, 0x06, 0x24, 0x63, 0x25, 0xD4, 0x21, 0x82, 0x0A, 0xC4, 0x71, + 0xC2, 0x07, 0x06, 0x2F, 0x53, 0x25, 0x15, 0x22, 0xB1, 0x03, 0x56, 0x42, 0xF2, 0x02, 0x24, 0x71, + 0x24, 0x51, 0xC4, 0x55, 0x24, 0x34, 0x92, 0xF0, 0x04, 0x5F, 0x56, 0x57, 0x38, 0x76, 0x38, 0x05, + 0xA9, 0x46, 0x50, 0x05, 0x1C, 0x40, 0x01, 0xF0, 0x57, 0x56, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, + 0x38, 0x05, 0x38, 0x76, 0x38, 0x05, 0x0C, 0x50, 0x00, 0xF0, 0xD6, 0x57, 0x82, 0x06, 0x77, 0x76, + 0x54, 0x7F, 0x24, 0x71, 0x99, 0x76, 0x52, 0x05, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x0C, 0xE0, 0x00, 0x10, 0xE8, 0xCE, + 0x31, 0x05, 0x92, 0x2A, 0x98, 0x7E, 0x27, 0x03, 0x82, 0x27, 0x0C, 0x90, 0xC8, 0x02, 0x0C, 0xD0, + 0x78, 0x12, 0x26, 0x9E, 0x06, 0xBC, 0x04, 0x2C, 0x26, 0x2D, 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, + 0x82, 0x13, 0xC4, 0xC1, 0xDA, 0x98, 0x00, 0x00, 0x18, 0x7D, 0x0A, 0x00, 0x04, 0xA1, 0x26, 0xAB, + 0x26, 0xBE, 0x99, 0x7B, 0x31, 0x05, 0x04, 0x21, 0x06, 0x3D, 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, + 0x92, 0x04, 0x24, 0xC1, 0xF2, 0x02, 0x06, 0xAB, 0x2C, 0xD0, 0x10, 0x00, 0xC6, 0xD9, 0x8A, 0x83, + 0x00, 0x00, 0x06, 0xBA, 0xF2, 0xE1, 0x98, 0x7E, 0x28, 0x03, 0x92, 0x04, 0x98, 0x7E, 0x27, 0x03, + 0x82, 0x7A, 0x04, 0xD0, 0x06, 0xCD, 0x06, 0xAE, 0x14, 0x91, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, + 0x31, 0x05, 0x34, 0x71, 0xC4, 0x70, 0x32, 0x04, 0x04, 0xC0, 0x06, 0xAE, 0xF2, 0x47, 0x26, 0x7A, + 0x68, 0xB7, 0x1D, 0x03, 0x34, 0xB1, 0xC4, 0xB0, 0x32, 0x1D, 0x68, 0x37, 0x22, 0x03, 0x04, 0x24, + 0x24, 0x34, 0x57, 0x32, 0x26, 0x3A, 0x2C, 0x30, 0x78, 0x02, 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, + 0x92, 0x02, 0x24, 0xD1, 0x06, 0x7C, 0xC4, 0x73, 0x12, 0x09, 0x24, 0x71, 0x2F, 0x67, 0x0E, 0x00, + 0x18, 0x56, 0x31, 0x05, 0x99, 0x56, 0x30, 0x05, 0xF2, 0xF7, 0x99, 0x9E, 0x35, 0x05, 0x34, 0xC1, + 0xF2, 0x12, 0x57, 0xB2, 0x26, 0xBA, 0x2C, 0xB0, 0x78, 0x02, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x25, + 0x01, 0x00, 0xC4, 0x20, 0x82, 0x08, 0x04, 0x22, 0x06, 0x3B, 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, + 0x92, 0x02, 0x24, 0xD1, 0x24, 0xC1, 0xC4, 0xC4, 0x02, 0xC1, 0xF2, 0xC7, 0x57, 0x72, 0x2F, 0x9A, + 0x07, 0x00, 0x0C, 0xB0, 0x78, 0x02, 0x26, 0xB9, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x25, 0x01, 0x00, + 0xC4, 0x20, 0x92, 0x0C, 0x24, 0xC1, 0xC4, 0xC5, 0x82, 0x26, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, + 0x1D, 0x03, 0x34, 0x71, 0xC4, 0x70, 0x32, 0xEB, 0xF2, 0xF6, 0xC4, 0xD1, 0xD2, 0x1C, 0x04, 0x70, + 0x2F, 0x67, 0x0E, 0x00, 0x68, 0x56, 0x31, 0x05, 0x14, 0x41, 0x26, 0x45, 0xC6, 0x4C, 0x82, 0xEB, + 0xC4, 0x50, 0x12, 0x0D, 0x18, 0x79, 0x82, 0x02, 0x04, 0x21, 0x99, 0x76, 0x31, 0x05, 0x06, 0x3B, + 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, 0x92, 0xDF, 0x24, 0xD1, 0xF2, 0xDD, 0x24, 0x71, 0xC4, 0x75, + 0x92, 0xE8, 0xF2, 0xD9, 0x04, 0x70, 0x06, 0x4E, 0x24, 0x71, 0x06, 0x67, 0x2F, 0x34, 0x07, 0x00, + 0x2F, 0x56, 0x0E, 0x00, 0xE8, 0x25, 0x31, 0x05, 0x02, 0x07, 0x68, 0xF3, 0x30, 0x05, 0xC6, 0xF2, + 0x92, 0x03, 0x99, 0x05, 0x31, 0x05, 0x24, 0x61, 0xC4, 0x64, 0x02, 0xF3, 0xC4, 0x74, 0x92, 0xED, + 0xAB, 0x47, 0x03, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x18, 0x20, 0x52, 0x15, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x2C, 0x00, 0x06, 0x21, 0x04, 0x30, + 0x0C, 0x40, 0x14, 0x00, 0xD9, 0xC1, 0x1C, 0x00, 0xC9, 0xA1, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0x7E, 0x52, 0x05, 0x92, 0x0A, 0x98, 0x3E, 0x2A, 0x05, + 0x92, 0x07, 0x0C, 0x20, 0x2C, 0x15, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x98, 0x7E, + 0x52, 0x05, 0x82, 0x66, 0x98, 0x7E, 0x2A, 0x05, 0x82, 0x63, 0x28, 0xDE, 0x50, 0x05, 0x04, 0x71, + 0x08, 0xF0, 0xFF, 0x0F, 0x06, 0x32, 0x0C, 0x30, 0x3C, 0x15, 0x04, 0x40, 0x06, 0xB7, 0x2C, 0xF0, + 0xFF, 0xFF, 0x14, 0x61, 0x26, 0x67, 0x06, 0x5D, 0x63, 0x56, 0x06, 0x65, 0xD4, 0x61, 0x82, 0x26, + 0x13, 0x57, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, 0x68, 0xCC, 0x2C, 0x05, 0x24, 0x61, 0xC6, 0xC7, + 0x82, 0x0C, 0xC4, 0x65, 0x92, 0xF8, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, 0xE8, 0xAC, 0x2C, 0x05, + 0x24, 0x61, 0x92, 0x05, 0x99, 0x7C, 0x2C, 0x05, 0x13, 0x56, 0xF2, 0x03, 0xC4, 0x65, 0x92, 0xF5, + 0x14, 0xC1, 0x26, 0xC5, 0x06, 0x6B, 0x53, 0x6C, 0x66, 0x64, 0x23, 0x46, 0x30, 0x63, 0x57, 0xC1, + 0x57, 0x5E, 0x56, 0x6F, 0x26, 0xC1, 0x66, 0x65, 0xB1, 0x6C, 0x24, 0x71, 0xC4, 0x76, 0x24, 0x34, + 0x92, 0xD1, 0x04, 0x70, 0x06, 0x6D, 0x63, 0x67, 0xD4, 0x61, 0x24, 0x71, 0x92, 0x0D, 0x2F, 0x56, + 0x0E, 0x00, 0x68, 0x35, 0x2C, 0x05, 0xC6, 0x37, 0x92, 0x04, 0x99, 0x05, 0x2C, 0x05, 0xF2, 0x04, + 0x24, 0x61, 0xC4, 0x65, 0x92, 0xF5, 0xC4, 0x75, 0x92, 0xEE, 0x38, 0x7E, 0x38, 0x05, 0x1C, 0x60, + 0x00, 0x04, 0x5C, 0x40, 0xFF, 0x03, 0x56, 0x76, 0x66, 0x74, 0xB9, 0x7E, 0x38, 0x05, 0x0C, 0x20, + 0x3C, 0x15, 0x06, 0x31, 0x0C, 0x40, 0x14, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x58, 0xC1, + 0x1C, 0x00, 0x48, 0xA1, 0x14, 0x00, 0x2C, 0x10, 0x2C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0x7E, 0x07, 0x05, 0x82, 0x18, 0x0C, 0xC0, 0xDE, 0x14, + 0x04, 0xD0, 0x18, 0x7E, 0x07, 0x05, 0xC6, 0xD7, 0x32, 0x07, 0x06, 0x2C, 0x0B, 0x45, 0x03, 0x00, + 0x24, 0xD1, 0x24, 0xC8, 0xF2, 0xF7, 0x38, 0x7E, 0x38, 0x05, 0x08, 0x60, 0xE0, 0x00, 0xD6, 0x76, + 0x82, 0x0E, 0x98, 0x7E, 0x52, 0x05, 0x92, 0x0B, 0xF2, 0x07, 0x98, 0x7E, 0x52, 0x05, 0x92, 0x07, + 0x98, 0x7E, 0x08, 0x05, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7E, 0x52, 0x05, 0x18, 0x7E, 0x07, 0x05, + 0x99, 0x7E, 0x08, 0x05, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x2E, 0x13, 0x04, 0x30, 0x04, 0x4D, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, 0x00, 0x10, 0x14, 0x61, 0x99, 0x67, 0x2F, 0x03, 0x99, 0x67, + 0x2E, 0x03, 0x99, 0x67, 0x31, 0x03, 0x99, 0x67, 0x30, 0x03, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x41, 0x34, 0x14, 0xB1, 0xF1, 0x02, 0x0A, 0xCC, 0x40, 0x11, 0x00, 0x14, 0x72, 0x26, 0x74, + 0x13, 0x77, 0x0C, 0xF0, 0x13, 0x00, 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, + 0x08, 0x60, 0x00, 0x30, 0x2C, 0x60, 0x00, 0xA0, 0xC6, 0x7F, 0xD2, 0x17, 0x06, 0x47, 0x57, 0x42, + 0x2F, 0x57, 0x07, 0x00, 0x3F, 0x55, 0x04, 0x00, 0x26, 0x53, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, + 0x5C, 0x50, 0xFF, 0x7F, 0xC6, 0x25, 0xB2, 0x06, 0x04, 0x61, 0x99, 0x60, 0x36, 0x13, 0x04, 0x21, + 0xF2, 0x05, 0x24, 0x71, 0x23, 0x77, 0xF2, 0xE9, 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0xC4, 0x41, 0x34, 0x14, 0xB1, 0xF1, 0x02, 0x08, 0xC4, 0x4B, 0x14, 0x72, 0x26, 0x74, 0x13, 0x77, + 0x04, 0xFD, 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, 0x26, 0x33, 0x06, 0x63, + 0xD7, 0x61, 0x3F, 0x33, 0x06, 0x00, 0x08, 0x60, 0x00, 0x30, 0x2C, 0x60, 0x00, 0xA0, 0xC6, 0x7F, + 0xD2, 0x12, 0x2F, 0x57, 0x03, 0x00, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, 0x5C, 0x50, 0xFF, 0x7F, + 0xC6, 0x25, 0xB2, 0x06, 0x04, 0x61, 0x99, 0x60, 0x36, 0x13, 0x04, 0x21, 0xF2, 0x05, 0x24, 0x71, + 0x23, 0x77, 0xF2, 0xEE, 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x3C, 0x10, 0x28, 0x00, + 0xD9, 0xC1, 0x18, 0x00, 0xD9, 0x81, 0x08, 0x00, 0x6B, 0xBA, 0x00, 0x00, 0x0C, 0xE0, 0x00, 0x10, + 0x28, 0x7E, 0x22, 0x00, 0xB1, 0x21, 0xC4, 0x7F, 0xC2, 0x12, 0x98, 0x70, 0xBA, 0x15, 0x82, 0x0F, + 0x38, 0x7E, 0x38, 0x05, 0x5C, 0x70, 0x00, 0xF0, 0xCC, 0x70, 0x00, 0x10, 0x92, 0x08, 0x04, 0x71, + 0x99, 0x7E, 0x38, 0x03, 0x99, 0x0E, 0x35, 0x03, 0x99, 0x7E, 0x36, 0x03, 0x18, 0x7E, 0x33, 0x03, + 0xC4, 0x72, 0xC2, 0x08, 0x04, 0x71, 0x99, 0x0E, 0x35, 0x03, 0x99, 0x7E, 0x36, 0x03, 0x99, 0x0E, + 0x38, 0x03, 0x98, 0x7E, 0x38, 0x03, 0x82, 0x12, 0x98, 0x7E, 0x37, 0x03, 0x82, 0x0F, 0x98, 0x7E, + 0x36, 0x03, 0x82, 0x0C, 0x04, 0x71, 0x99, 0x0E, 0x38, 0x03, 0x99, 0x7E, 0x35, 0x03, 0x99, 0x0E, + 0x36, 0x03, 0x8B, 0x3E, 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x98, 0x7E, 0x36, 0x03, 0x9A, 0xC8, + 0x00, 0x00, 0x98, 0x7E, 0x35, 0x03, 0x9A, 0xC4, 0x00, 0x00, 0x18, 0x7E, 0x32, 0x03, 0xC4, 0x71, + 0x9A, 0xBF, 0x00, 0x00, 0x18, 0x7E, 0x05, 0x00, 0xC4, 0x71, 0x9A, 0xBA, 0x00, 0x00, 0x18, 0x6E, + 0x81, 0x02, 0x18, 0x5E, 0x80, 0x02, 0xC4, 0x60, 0x82, 0x08, 0xCC, 0x60, 0x13, 0x00, 0x14, 0x71, + 0x26, 0x76, 0x13, 0xB7, 0x82, 0x07, 0xF2, 0x02, 0x06, 0xB6, 0x04, 0xA1, 0x26, 0xA6, 0x13, 0xAA, + 0xF2, 0x04, 0x0C, 0xB0, 0x12, 0x00, 0x06, 0xA6, 0xC4, 0x50, 0x82, 0x07, 0xC4, 0x5B, 0x14, 0xC1, + 0x26, 0xC5, 0x13, 0xCC, 0x82, 0x07, 0xF2, 0x02, 0x06, 0xC5, 0x04, 0x91, 0x26, 0x95, 0x13, 0x99, + 0xF2, 0x03, 0x04, 0xCA, 0x06, 0x95, 0x26, 0x66, 0x06, 0x46, 0xD7, 0x41, 0x3F, 0x66, 0x04, 0x00, + 0x26, 0x56, 0x08, 0x80, 0x00, 0x30, 0x57, 0x51, 0x2C, 0x80, 0x00, 0xA0, 0x26, 0x58, 0x30, 0xD5, + 0x04, 0x50, 0x5C, 0xD0, 0xFF, 0x7F, 0xC6, 0xBA, 0xD2, 0x66, 0x30, 0x31, 0x28, 0x2E, 0x60, 0x01, + 0x06, 0xFB, 0x2F, 0x6B, 0x0B, 0x00, 0x57, 0xF2, 0x36, 0xF6, 0x23, 0x33, 0x06, 0x6C, 0xC6, 0x69, + 0xD2, 0x56, 0x2F, 0x46, 0x0F, 0x00, 0x57, 0x41, 0x26, 0x48, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x7F, + 0xC6, 0x42, 0xA2, 0x4A, 0xC6, 0x43, 0x92, 0x48, 0x18, 0x4E, 0x81, 0x02, 0xC6, 0x4B, 0x92, 0x05, + 0x18, 0x5E, 0x80, 0x02, 0xC6, 0x56, 0x82, 0x3B, 0x18, 0x6E, 0x34, 0x03, 0x04, 0x51, 0xD6, 0x56, + 0x82, 0x13, 0x18, 0x3E, 0x80, 0x02, 0x24, 0x32, 0x13, 0x33, 0xC4, 0x3B, 0xC2, 0x07, 0x18, 0x6E, + 0x34, 0x03, 0x04, 0x54, 0xD6, 0x56, 0x92, 0x10, 0xF2, 0x1C, 0x06, 0x2D, 0x0B, 0x66, 0x03, 0x00, + 0xC4, 0x20, 0x82, 0xF6, 0xF2, 0x27, 0xD4, 0x62, 0x82, 0xF3, 0x18, 0x3E, 0x80, 0x02, 0x06, 0x2D, + 0x34, 0x32, 0x13, 0x33, 0xF2, 0xF4, 0x18, 0x3E, 0x81, 0x02, 0x24, 0x32, 0x13, 0x33, 0xCC, 0x30, + 0x13, 0x00, 0xC2, 0x05, 0x98, 0x6E, 0x36, 0x03, 0x82, 0x12, 0xF2, 0x14, 0x06, 0x2D, 0xF2, 0x08, + 0xD4, 0x68, 0x82, 0xF9, 0x18, 0x3E, 0x81, 0x02, 0x06, 0x2D, 0x34, 0x32, 0x13, 0x33, 0x18, 0x4E, + 0x80, 0x02, 0x0B, 0x69, 0x03, 0x00, 0xC4, 0x20, 0x92, 0x05, 0xF2, 0xED, 0x04, 0x61, 0x99, 0x6E, + 0x35, 0x03, 0x04, 0x51, 0xF2, 0x04, 0x24, 0x61, 0x13, 0x66, 0xF2, 0xAA, 0x04, 0x71, 0x26, 0x7B, + 0x13, 0xB7, 0xF2, 0x9A, 0x98, 0x7E, 0x35, 0x03, 0x82, 0x0D, 0x18, 0x7E, 0x3A, 0x03, 0xC4, 0x71, + 0x92, 0x09, 0xB9, 0x51, 0x04, 0x00, 0x8B, 0x3E, 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x38, 0x51, + 0x04, 0x00, 0x98, 0x7E, 0x35, 0x03, 0x92, 0x0C, 0xC4, 0x50, 0x92, 0x0A, 0x30, 0x61, 0x28, 0x7E, + 0x60, 0x01, 0x23, 0xB6, 0xC6, 0x7B, 0xD2, 0x04, 0x04, 0x71, 0x99, 0x7E, 0x36, 0x03, 0x38, 0x6E, + 0x38, 0x05, 0x06, 0x76, 0x5C, 0x60, 0x00, 0xF0, 0x77, 0x76, 0xCC, 0x60, 0x00, 0x10, 0x54, 0x7F, + 0x99, 0x7E, 0x3A, 0x03, 0x92, 0x11, 0x18, 0x6E, 0x31, 0x03, 0x28, 0x7E, 0x80, 0x02, 0xCC, 0x60, + 0xFF, 0x00, 0xA9, 0x7E, 0x2E, 0x03, 0x92, 0x08, 0x18, 0x6E, 0x30, 0x03, 0xCC, 0x60, 0xFF, 0x00, + 0x92, 0x03, 0xA9, 0x7E, 0x30, 0x03, 0x58, 0xC1, 0x18, 0x00, 0x58, 0x81, 0x08, 0x00, 0x2C, 0x10, + 0x28, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0x60, 0x00, 0x10, 0x2C, 0x20, + 0x44, 0x00, 0xA8, 0xD6, 0x50, 0x05, 0x57, 0x22, 0x2F, 0xE6, 0x02, 0x00, 0x14, 0x71, 0xA9, 0x7E, + 0x04, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0xA9, 0x7E, 0x08, 0x00, 0xA9, 0x7E, 0x0A, 0x00, 0xA1, 0x0E, + 0xA9, 0x0E, 0x02, 0x00, 0x92, 0x0F, 0x0C, 0x20, 0x98, 0x14, 0x06, 0x3D, 0x04, 0x48, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xA0, 0x14, 0x06, 0x3D, 0x04, 0x4A, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0xA9, 0x0E, 0x0C, 0x00, 0xA9, 0x0E, 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, 0xAB, 0x7E, 0x03, 0x00, + 0x24, 0xE1, 0xC4, 0xE5, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x3C, 0x10, 0x18, 0x00, + 0xB9, 0x31, 0x04, 0x00, 0xD9, 0xC1, 0x08, 0x00, 0x28, 0xD1, 0x04, 0x00, 0xB1, 0x21, 0x23, 0xC2, + 0xC6, 0x4D, 0x28, 0x31, 0x02, 0x00, 0x28, 0xE1, 0x06, 0x00, 0x32, 0x03, 0x43, 0x2E, 0xF2, 0x11, + 0xC6, 0x4C, 0x22, 0x03, 0x43, 0x23, 0xF2, 0x0D, 0x3F, 0x2D, 0x04, 0x00, 0x36, 0x3E, 0xAB, 0x97, + 0x00, 0x00, 0x43, 0x22, 0x3F, 0x3D, 0x0C, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x2E, 0x43, 0x22, + 0x58, 0xC1, 0x08, 0x00, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x94, 0x15, + 0x3C, 0x10, 0x78, 0x00, 0xD9, 0xC1, 0x68, 0x00, 0xD9, 0x81, 0x58, 0x00, 0x30, 0x77, 0xDC, 0x70, + 0x00, 0x08, 0x8A, 0xB8, 0x02, 0x00, 0xC4, 0x30, 0x92, 0x0C, 0xC4, 0x20, 0x9A, 0xB3, 0x02, 0x00, + 0xA8, 0x70, 0x50, 0x15, 0x9A, 0xAF, 0x02, 0x00, 0xAB, 0x81, 0x03, 0x00, 0xFA, 0xAB, 0x02, 0x00, + 0x98, 0x70, 0xBA, 0x15, 0x0C, 0xE0, 0x00, 0x10, 0x82, 0x2C, 0x28, 0x7E, 0x22, 0x00, 0xC4, 0x79, + 0xC2, 0x0E, 0x0C, 0x70, 0x20, 0x00, 0xA9, 0x7E, 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, 0xA9, 0x7E, + 0x90, 0x04, 0xA9, 0x0E, 0x96, 0x04, 0x0C, 0x70, 0x50, 0x00, 0xF2, 0x34, 0xC4, 0x75, 0xC2, 0x0E, + 0x0C, 0x70, 0x20, 0x00, 0xA9, 0x7E, 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, 0xA9, 0x7E, 0x90, 0x04, + 0xA9, 0x0E, 0x96, 0x04, 0x0C, 0x70, 0x64, 0x00, 0xF2, 0x25, 0x0C, 0x70, 0x10, 0x00, 0xA9, 0x7E, + 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, 0xA9, 0x7E, 0x90, 0x04, 0xA9, 0x0E, 0x96, 0x04, 0xF2, 0x18, + 0x98, 0x7E, 0x56, 0x02, 0x92, 0xD7, 0x28, 0x7E, 0x06, 0x00, 0x0C, 0x60, 0x10, 0x00, 0xD6, 0x67, + 0x92, 0xD1, 0xD4, 0x78, 0x0C, 0x70, 0x20, 0x00, 0xA9, 0x7E, 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, + 0xA9, 0x7E, 0x90, 0x04, 0x0C, 0x70, 0x1E, 0x00, 0xA9, 0x7E, 0x96, 0x04, 0x82, 0x2F, 0x0C, 0x70, + 0x96, 0x00, 0xA9, 0x7E, 0x92, 0x04, 0x0C, 0x70, 0x44, 0x14, 0xB9, 0x71, 0x1C, 0x00, 0x0C, 0x70, + 0x46, 0x14, 0xB9, 0x71, 0x18, 0x00, 0x0C, 0x70, 0xA0, 0x14, 0xB9, 0x71, 0x34, 0x00, 0x0C, 0x70, + 0x90, 0x14, 0xB9, 0x71, 0x0C, 0x00, 0x0C, 0x70, 0x48, 0x14, 0xB9, 0x71, 0x30, 0x00, 0x08, 0x60, + 0x00, 0xFF, 0x04, 0x50, 0x0C, 0x70, 0x4A, 0x14, 0x2C, 0x60, 0xFF, 0x0F, 0x06, 0xDE, 0xB9, 0x71, + 0x2C, 0x00, 0xB9, 0x51, 0x04, 0x00, 0xB9, 0x51, 0x14, 0x00, 0xB9, 0x51, 0x40, 0x00, 0xB9, 0x51, + 0x3C, 0x00, 0x06, 0xB5, 0xB9, 0x61, 0x38, 0x00, 0xF2, 0x04, 0x0C, 0x70, 0xC8, 0x00, 0xF2, 0xD2, + 0x28, 0x7E, 0x50, 0x05, 0x63, 0x7B, 0xD4, 0x71, 0x92, 0x06, 0x06, 0x2B, 0xAB, 0x7E, 0x03, 0x00, + 0xFA, 0xF5, 0x01, 0x00, 0x04, 0x71, 0x26, 0x7B, 0x57, 0x71, 0x26, 0x7E, 0x38, 0x67, 0x38, 0x05, + 0x06, 0x76, 0x77, 0x76, 0x5C, 0x70, 0xFF, 0x0F, 0x43, 0x57, 0x5C, 0x60, 0xFF, 0x0F, 0xB9, 0x51, + 0x24, 0x00, 0x43, 0x56, 0xB9, 0x51, 0x28, 0x00, 0xF8, 0x5D, 0x44, 0x04, 0x32, 0x20, 0x38, 0x51, + 0x24, 0x00, 0x38, 0x41, 0x1C, 0x00, 0xA1, 0x54, 0x38, 0x51, 0x28, 0x00, 0x38, 0x41, 0x18, 0x00, + 0xA1, 0x54, 0x38, 0x51, 0x24, 0x00, 0x38, 0x41, 0x30, 0x00, 0xA1, 0x54, 0x38, 0x51, 0x28, 0x00, + 0x38, 0x41, 0x2C, 0x00, 0xA1, 0x54, 0x38, 0x41, 0x0C, 0x00, 0xA9, 0x0D, 0x40, 0x04, 0xA9, 0x0D, + 0x42, 0x04, 0x04, 0x51, 0x99, 0x54, 0x10, 0x00, 0x99, 0x54, 0x11, 0x00, 0x78, 0x5D, 0x48, 0x04, + 0x36, 0x75, 0xB9, 0x71, 0x08, 0x00, 0x78, 0x7D, 0x4A, 0x04, 0xB8, 0xA1, 0x08, 0x00, 0x36, 0x67, + 0xB9, 0x61, 0x10, 0x00, 0x32, 0x02, 0x16, 0xAA, 0x38, 0x51, 0x10, 0x00, 0x86, 0x65, 0xB9, 0x51, + 0x20, 0x00, 0x32, 0x04, 0x16, 0x76, 0xB9, 0x71, 0x20, 0x00, 0x38, 0x51, 0x20, 0x00, 0x43, 0x2A, + 0x43, 0x35, 0x0C, 0xF0, 0x80, 0x00, 0xF1, 0xF0, 0x98, 0x70, 0xBA, 0x15, 0x06, 0x82, 0xB9, 0x71, + 0x44, 0x00, 0x82, 0x26, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, 0x06, 0x48, 0x6B, 0x82, + 0x03, 0x00, 0x28, 0x7E, 0x22, 0x00, 0x06, 0x92, 0xC4, 0x77, 0xC2, 0x0C, 0x06, 0x78, 0xF7, 0x7F, + 0x2F, 0x48, 0x07, 0x00, 0xE7, 0x40, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, 0x43, 0x44, + 0xF2, 0x0B, 0x04, 0x33, 0x2F, 0x28, 0x08, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x42, 0x38, 0x3E, + 0x94, 0x04, 0x38, 0x2E, 0x90, 0x04, 0x6B, 0x82, 0x03, 0x00, 0x06, 0xC2, 0xF2, 0x36, 0x98, 0x7E, + 0x56, 0x02, 0x92, 0x06, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x0C, 0x86, 0x88, + 0x32, 0x02, 0x24, 0x83, 0x06, 0x48, 0x67, 0x41, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, + 0x43, 0x44, 0xF2, 0x1F, 0x28, 0x7E, 0x22, 0x00, 0xC4, 0x77, 0xC2, 0x16, 0x04, 0x33, 0x26, 0x22, + 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x42, 0x38, 0x3E, 0x94, 0x04, 0x38, 0x2E, 0x90, 0x04, 0x6B, 0x82, + 0x03, 0x00, 0x06, 0xC2, 0x38, 0x3E, 0x94, 0x04, 0x38, 0x2E, 0x90, 0x04, 0x06, 0x48, 0x6B, 0x82, + 0x03, 0x00, 0x06, 0x92, 0xF2, 0x0A, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, 0x06, 0x48, + 0x6B, 0x82, 0x03, 0x00, 0x06, 0xC2, 0x06, 0x92, 0x18, 0x7E, 0x2B, 0x03, 0xC4, 0x72, 0xD2, 0x0B, + 0x0C, 0x70, 0x50, 0x00, 0xA9, 0x0E, 0x9A, 0x04, 0xA9, 0x0E, 0x98, 0x04, 0xA9, 0x7E, 0x9E, 0x04, + 0xA9, 0x7E, 0x9C, 0x04, 0x38, 0x60, 0x94, 0x15, 0x78, 0x2E, 0x98, 0x04, 0x18, 0x56, 0xB3, 0x00, + 0x18, 0x76, 0xB5, 0x00, 0x18, 0x66, 0xB4, 0x00, 0xB9, 0x51, 0x4C, 0x00, 0x06, 0x35, 0x2F, 0x86, + 0x05, 0x00, 0x26, 0x87, 0xB9, 0x71, 0x54, 0x00, 0xB9, 0x61, 0x50, 0x00, 0xAB, 0x97, 0x00, 0x00, + 0x38, 0x61, 0x50, 0x00, 0x06, 0x42, 0x78, 0x2E, 0x9C, 0x04, 0xB9, 0x41, 0x48, 0x00, 0x06, 0x36, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, 0x38, 0x41, 0x48, 0x00, 0x06, 0x39, 0x26, 0x42, + 0x06, 0x27, 0xB9, 0x41, 0x48, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x48, 0x00, 0x43, 0x22, + 0x26, 0x24, 0x06, 0x38, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x51, 0x4C, 0x00, 0x43, 0x92, 0x78, 0x2E, + 0x9A, 0x04, 0x06, 0x35, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, 0x50, 0x00, 0x06, 0x52, 0x78, 0x2E, + 0x9E, 0x04, 0xB9, 0x51, 0x4C, 0x00, 0x06, 0x36, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, + 0x38, 0x51, 0x4C, 0x00, 0x06, 0x3C, 0x26, 0x52, 0x06, 0x27, 0xB9, 0x51, 0x4C, 0x00, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x51, 0x4C, 0x00, 0x43, 0x22, 0x26, 0x25, 0x06, 0x38, 0x4B, 0x9E, 0x00, 0x00, + 0x43, 0x72, 0x06, 0x39, 0x06, 0x2A, 0xB9, 0x71, 0x54, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, 0x06, 0x62, 0x06, 0x82, 0x38, 0x21, + 0x20, 0x00, 0xB9, 0x61, 0x50, 0x00, 0x06, 0x37, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0xB8, 0x51, 0x44, 0x00, 0x38, 0x61, 0x50, 0x00, 0x38, 0x71, 0x54, 0x00, + 0x06, 0xC2, 0x92, 0x10, 0xC4, 0x60, 0x92, 0x05, 0xC4, 0xA4, 0x04, 0x81, 0x12, 0x02, 0x06, 0x85, + 0xC4, 0xC0, 0x92, 0x08, 0x38, 0x51, 0x20, 0x00, 0x04, 0x61, 0xC4, 0x54, 0x12, 0x02, 0x06, 0x6C, + 0x06, 0xC6, 0x38, 0x51, 0x04, 0x00, 0x06, 0x69, 0xC6, 0x95, 0x32, 0x02, 0x06, 0x65, 0x38, 0x51, + 0x14, 0x00, 0x43, 0x66, 0xC6, 0x75, 0xB9, 0x61, 0x04, 0x00, 0x06, 0x67, 0x32, 0x02, 0x06, 0x65, + 0x43, 0x66, 0xB9, 0x61, 0x14, 0x00, 0x38, 0x41, 0x0C, 0x00, 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, + 0x10, 0x00, 0x68, 0x54, 0x10, 0x00, 0x15, 0xA6, 0xF7, 0xAF, 0x33, 0x6A, 0xC6, 0x56, 0x15, 0x97, + 0xF7, 0x9F, 0x33, 0x79, 0x92, 0x04, 0x04, 0x51, 0xB9, 0x51, 0x3C, 0x00, 0x38, 0x41, 0x0C, 0x00, + 0x68, 0x54, 0x11, 0x00, 0xC6, 0x57, 0x92, 0x04, 0x04, 0x51, 0xB9, 0x51, 0x40, 0x00, 0x38, 0x51, + 0x34, 0x00, 0x04, 0x44, 0x91, 0x65, 0x2F, 0x6B, 0x0B, 0x00, 0x26, 0x6E, 0x99, 0x76, 0xA1, 0x04, + 0x0C, 0x60, 0x48, 0x04, 0x26, 0x6D, 0x06, 0x36, 0x06, 0x21, 0xB9, 0x61, 0x08, 0x00, 0x6B, 0xCF, + 0x03, 0x00, 0x6B, 0xBA, 0x00, 0x00, 0x18, 0x7E, 0x2C, 0x03, 0xC4, 0x71, 0x20, 0x71, 0xD2, 0x19, + 0x28, 0x6E, 0x60, 0x01, 0x23, 0x22, 0xC6, 0x62, 0xC2, 0x14, 0x98, 0x6E, 0x35, 0x03, 0x92, 0x11, + 0x78, 0x6D, 0x40, 0x04, 0xC6, 0x68, 0x02, 0x05, 0xB8, 0x51, 0x3C, 0x00, 0x82, 0x02, 0x06, 0x86, + 0x78, 0x6D, 0x42, 0x04, 0xC6, 0x6C, 0x02, 0x05, 0xB8, 0x51, 0x40, 0x00, 0x82, 0x02, 0x06, 0xC6, + 0xC4, 0xA0, 0x92, 0x02, 0x16, 0x88, 0x23, 0x88, 0xC4, 0x90, 0x26, 0x87, 0xA1, 0x81, 0x28, 0x71, + 0x02, 0x00, 0x92, 0x02, 0x16, 0xCC, 0x23, 0xCC, 0x26, 0xC7, 0x06, 0x21, 0xA9, 0xC1, 0x02, 0x00, + 0x6B, 0x20, 0x03, 0x00, 0x78, 0x7D, 0x48, 0x04, 0x70, 0xA1, 0x3F, 0x77, 0x0A, 0x00, 0xC4, 0x70, + 0x32, 0x02, 0x16, 0x77, 0xA9, 0x7D, 0x40, 0x04, 0x78, 0xC1, 0x02, 0x00, 0x78, 0x7D, 0x4A, 0x04, + 0x3F, 0x77, 0x0C, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0xA9, 0x7D, 0x42, 0x04, 0x38, 0x61, + 0x24, 0x00, 0x38, 0x71, 0x1C, 0x00, 0x38, 0x51, 0x28, 0x00, 0x38, 0x21, 0x08, 0x00, 0xA1, 0x67, + 0x38, 0x61, 0x18, 0x00, 0x04, 0x44, 0xA1, 0x56, 0x06, 0x31, 0x6B, 0xCF, 0x03, 0x00, 0x04, 0x71, + 0x26, 0x7B, 0x57, 0x71, 0x2F, 0x67, 0x0E, 0x00, 0x38, 0x76, 0x38, 0x05, 0x38, 0x51, 0x38, 0x00, + 0x5C, 0xA0, 0xFF, 0x0F, 0x57, 0xA6, 0x56, 0x75, 0x66, 0x7A, 0x1C, 0x40, 0x00, 0x10, 0x5C, 0xC0, + 0xFF, 0x0F, 0x56, 0x74, 0x66, 0x7C, 0xB9, 0x76, 0x38, 0x05, 0x38, 0x51, 0x1C, 0x00, 0x38, 0x61, + 0x18, 0x00, 0x38, 0x71, 0x34, 0x00, 0x2C, 0x50, 0x10, 0x00, 0x2C, 0x60, 0x10, 0x00, 0x24, 0x72, + 0xB9, 0x51, 0x1C, 0x00, 0xB9, 0x61, 0x18, 0x00, 0x38, 0x51, 0x0C, 0x00, 0x38, 0x61, 0x30, 0x00, + 0xB9, 0x71, 0x34, 0x00, 0x38, 0x71, 0x2C, 0x00, 0x24, 0xB1, 0xC4, 0xB5, 0x24, 0x52, 0x2C, 0x60, + 0x10, 0x00, 0x2C, 0x70, 0x10, 0x00, 0xB9, 0x51, 0x0C, 0x00, 0xB9, 0x61, 0x30, 0x00, 0xB9, 0x71, + 0x2C, 0x00, 0x2C, 0xD0, 0x10, 0x00, 0x9A, 0xDD, 0xFD, 0xFF, 0x38, 0x7E, 0x98, 0x04, 0x38, 0x41, + 0x04, 0x00, 0x38, 0x51, 0x14, 0x00, 0xB9, 0x7E, 0x9C, 0x04, 0xA9, 0x4E, 0x98, 0x04, 0xA9, 0x5E, + 0x9A, 0x04, 0x58, 0xC1, 0x68, 0x00, 0x58, 0x81, 0x58, 0x00, 0x2C, 0x10, 0x78, 0x00, 0xE1, 0xF0, + 0x0C, 0x70, 0xAA, 0x14, 0x04, 0x60, 0x78, 0x57, 0x04, 0x00, 0x24, 0x61, 0xC6, 0x25, 0x22, 0x0E, + 0x78, 0x57, 0x06, 0x00, 0xC6, 0x25, 0x12, 0x0A, 0x70, 0x57, 0xC6, 0x35, 0x22, 0x07, 0x78, 0x57, + 0x02, 0x00, 0xC6, 0x35, 0x12, 0x03, 0x13, 0x26, 0xF2, 0x06, 0x13, 0x66, 0xC4, 0x62, 0x24, 0x78, + 0x92, 0xEB, 0x04, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0xB1, 0xB1, 0x0C, 0xE0, 0x00, 0x10, 0x28, 0x7E, 0x06, 0x00, 0x18, 0xCE, 0x07, 0x05, 0xD4, 0x71, + 0x06, 0xD2, 0x06, 0xB3, 0x92, 0x3F, 0x38, 0x60, 0x94, 0x15, 0x18, 0x7E, 0x0C, 0x05, 0x18, 0x66, + 0xC5, 0x00, 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x0C, 0x05, 0xF2, 0x33, 0x18, 0x72, + 0x0A, 0x00, 0xD7, 0xC1, 0x2C, 0xC0, 0x34, 0x00, 0x26, 0xCE, 0x0C, 0x20, 0xAA, 0x04, 0x99, 0x7C, + 0xAE, 0x04, 0x26, 0x2C, 0x06, 0x3D, 0x04, 0x44, 0x6B, 0xCF, 0x03, 0x00, 0x99, 0xBC, 0xAF, 0x04, + 0x18, 0x7D, 0x0D, 0x00, 0x04, 0x62, 0x99, 0x7C, 0xB0, 0x04, 0x18, 0x7E, 0x07, 0x05, 0x24, 0x71, + 0x99, 0x7E, 0x07, 0x05, 0x18, 0x7D, 0x0D, 0x00, 0xD6, 0x67, 0x82, 0x14, 0x04, 0x64, 0xD6, 0x67, + 0x82, 0x09, 0x04, 0x71, 0x99, 0x7E, 0x09, 0x05, 0x99, 0x0E, 0x0A, 0x05, 0x99, 0x0E, 0x0B, 0x05, + 0xF2, 0x09, 0xDC, 0x70, 0x18, 0x00, 0x82, 0x06, 0x04, 0x71, 0x99, 0x0E, 0x09, 0x05, 0x99, 0x7E, + 0x0A, 0x05, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE2, 0x06, 0x63, 0x70, 0x22, 0x78, 0x3E, 0x02, 0x00, + 0x0C, 0xD0, 0x00, 0x10, 0x0C, 0x40, 0xBA, 0x04, 0x0C, 0x50, 0xAA, 0x14, 0x26, 0x4D, 0x04, 0x70, + 0x78, 0xF5, 0x04, 0x00, 0xC6, 0xF2, 0x12, 0x0D, 0x78, 0xF5, 0x06, 0x00, 0xC6, 0x2F, 0x12, 0x09, + 0x70, 0xF5, 0xC6, 0xF3, 0x12, 0x06, 0x78, 0xF5, 0x02, 0x00, 0xC6, 0x3F, 0x12, 0x02, 0x04, 0x71, + 0x24, 0x58, 0xC6, 0x54, 0x92, 0xEE, 0xC4, 0x70, 0x82, 0x77, 0xC4, 0x61, 0x82, 0x09, 0xC4, 0x61, + 0xA2, 0x6F, 0xC4, 0x62, 0x82, 0x1E, 0xC4, 0x64, 0x82, 0x44, 0xFA, 0xAF, 0x00, 0x00, 0x18, 0x6D, + 0x09, 0x05, 0x14, 0x71, 0xC4, 0x60, 0x9A, 0xAA, 0x00, 0x00, 0x8B, 0xB1, 0x03, 0x00, 0x86, 0xC2, + 0x82, 0x09, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x06, 0x3C, 0x4B, 0xB3, 0x03, 0x00, + 0xF2, 0x04, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0xCE, 0x0E, 0x00, 0xFA, 0x96, 0x00, 0x00, + 0x18, 0x7E, 0x0D, 0x00, 0x04, 0x61, 0xD6, 0x67, 0x82, 0x0B, 0xD4, 0x76, 0x82, 0x06, 0x04, 0x7A, + 0x99, 0x7E, 0x0D, 0x00, 0xFA, 0x84, 0x00, 0x00, 0x0C, 0x70, 0x12, 0x00, 0xF2, 0x42, 0x04, 0x62, + 0xD6, 0x67, 0x14, 0x71, 0x8A, 0x83, 0x00, 0x00, 0x8B, 0xB1, 0x03, 0x00, 0x86, 0x32, 0x82, 0x0A, + 0x98, 0x7E, 0x0E, 0x00, 0x92, 0x07, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x3E, 0x0E, 0x00, + 0xF2, 0x04, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0xF2, 0x6D, + 0x18, 0x7E, 0x0D, 0x00, 0x04, 0x61, 0xD6, 0x67, 0x92, 0xD9, 0x04, 0x62, 0xD6, 0x67, 0x14, 0x71, + 0x82, 0x65, 0x8B, 0xB1, 0x03, 0x00, 0x86, 0x22, 0x18, 0x3E, 0x0E, 0x00, 0x82, 0x11, 0xC4, 0x30, + 0x82, 0x11, 0xC6, 0x23, 0x04, 0x7A, 0x82, 0x03, 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, + 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0xF2, 0x06, 0xC4, 0x30, + 0x92, 0xF4, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0E, 0x0E, 0x00, 0xF2, 0x46, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0xF2, 0x42, 0xC4, 0x61, 0x82, 0x08, 0xC4, 0x61, 0xA2, 0x3A, 0xC4, 0x62, + 0x82, 0x09, 0xC4, 0x64, 0x82, 0x1B, 0xF2, 0x3A, 0x99, 0x6E, 0x0D, 0x00, 0x99, 0x0D, 0x0C, 0x05, + 0xF2, 0x35, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, 0x82, 0x15, 0x98, 0x3E, 0x0E, 0x00, 0x82, 0x08, + 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0x04, 0x71, + 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0x0C, 0x05, 0xF2, 0x18, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, + 0x92, 0x07, 0x04, 0x71, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0x0C, 0x05, 0xF2, 0x10, 0x98, 0x3E, + 0x0E, 0x00, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x82, 0x07, 0x04, 0x7A, 0x99, 0x7E, 0x0D, 0x00, + 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0x04, 0x70, 0xF2, 0x06, + 0x04, 0x62, 0x99, 0x6E, 0x0D, 0x00, 0xF2, 0x02, 0x14, 0x71, 0x28, 0x5D, 0x06, 0x00, 0x04, 0x63, + 0xD6, 0x65, 0x92, 0x07, 0x18, 0x6E, 0x0D, 0x00, 0x54, 0x63, 0x66, 0x65, 0xA9, 0x6D, 0x06, 0x00, + 0x50, 0xC1, 0x06, 0x27, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x40, 0xBF, 0x15, + 0xC4, 0x40, 0x28, 0x50, 0x98, 0x15, 0x06, 0x37, 0x0C, 0x70, 0x00, 0x10, 0x82, 0x07, 0x0C, 0x60, + 0x80, 0x0B, 0x26, 0x55, 0x26, 0x56, 0x20, 0x65, 0xF2, 0x0A, 0x08, 0x60, 0x00, 0x30, 0x57, 0x51, + 0x2C, 0x60, 0x00, 0xA0, 0x26, 0x65, 0x30, 0x66, 0x5C, 0x60, 0xFF, 0x7F, 0xC4, 0x40, 0xA9, 0x67, + 0x10, 0x00, 0x06, 0x63, 0x0C, 0x60, 0x98, 0x15, 0x28, 0x66, 0x02, 0x00, 0x92, 0x0B, 0x08, 0x50, + 0x00, 0x30, 0x57, 0x61, 0x2C, 0x50, 0x00, 0xA0, 0x26, 0x56, 0x30, 0x65, 0x5C, 0x60, 0xFF, 0x7F, + 0xF2, 0x06, 0x26, 0x66, 0x0C, 0x50, 0x80, 0x0B, 0x26, 0x65, 0x20, 0x66, 0xA9, 0x67, 0x12, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x18, 0x00, 0xC1, 0xA1, 0x38, 0xB0, 0x94, 0x15, 0xD9, 0xC1, + 0x08, 0x00, 0x30, 0x7B, 0xDC, 0x70, 0x00, 0x40, 0x82, 0x06, 0x0C, 0xC0, 0xFF, 0x7F, 0x0C, 0xE0, + 0x80, 0x0B, 0xF2, 0x05, 0x0C, 0xC0, 0xFF, 0x0F, 0x0C, 0xE0, 0x80, 0x02, 0x28, 0xA0, 0x06, 0x10, + 0x2C, 0xE0, 0x14, 0x02, 0x54, 0xA8, 0x23, 0xAA, 0x04, 0xD0, 0xC4, 0xD1, 0xC2, 0x05, 0x14, 0x7A, + 0x26, 0x7D, 0xC4, 0x71, 0xD2, 0x0F, 0xC4, 0xA0, 0x92, 0x0A, 0x70, 0x7E, 0x26, 0x77, 0x06, 0x67, + 0x57, 0x61, 0x26, 0x76, 0x06, 0x27, 0x57, 0x22, 0x36, 0x27, 0xF2, 0x09, 0x70, 0x2E, 0x26, 0x22, + 0xF2, 0x0A, 0x70, 0x2E, 0x28, 0x3B, 0xC0, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0xC4, 0x20, 0x32, 0x03, 0xA1, 0x0E, 0xF2, 0x06, 0xC6, 0x2C, 0x02, 0x03, + 0xA1, 0xCE, 0xF2, 0x02, 0xA1, 0x2E, 0x24, 0xD1, 0xC4, 0xDC, 0x24, 0xE2, 0x92, 0xD7, 0x58, 0xC1, + 0x08, 0x00, 0x40, 0xA1, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x04, 0x70, 0xC6, 0x74, + 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, + 0xF2, 0xF7, 0xE1, 0xF0, 0x71, 0x00, 0xF2, 0xFF, 0x66, 0x00, 0x33, 0x01, 0x00, 0x02, 0xCC, 0x02, + 0x99, 0x03, 0x66, 0x04, 0x33, 0x05, 0xFF, 0x05, 0xCC, 0x06, 0x99, 0x07, 0x60, 0x00, 0x20, 0x01, + 0xE0, 0x01, 0xA0, 0x02, 0x60, 0x03, 0x20, 0x04, 0xC6, 0x23, 0x06, 0x72, 0x32, 0x02, 0x06, 0x73, + 0x43, 0x27, 0xE1, 0xF0, 0xC6, 0x23, 0x22, 0x07, 0xC6, 0x24, 0x06, 0x72, 0x32, 0x02, 0x06, 0x74, + 0x43, 0x27, 0xF2, 0x06, 0xC6, 0x34, 0x06, 0x23, 0x32, 0x02, 0x06, 0x24, 0x43, 0x22, 0xE1, 0xF0, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE5, 0x06, 0xD6, 0x6B, 0x04, 0x00, 0x00, 0x06, 0x3E, + 0x06, 0x4D, 0x6B, 0x04, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x24, 0x00, + 0xC6, 0x23, 0x06, 0x72, 0x02, 0x02, 0x06, 0x73, 0x43, 0x27, 0xE1, 0xF0, 0x26, 0x23, 0xE1, 0xF0, + 0x26, 0x23, 0x26, 0x24, 0xE1, 0xF0, 0x24, 0x00, 0x26, 0x32, 0x26, 0x43, 0x26, 0x54, 0x2F, 0x26, + 0x05, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, + 0x2F, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, 0xF2, 0xF7, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, + 0x77, 0x41, 0x04, 0x70, 0x14, 0x61, 0x34, 0x41, 0xC6, 0x46, 0x82, 0x09, 0x2F, 0x57, 0x03, 0x00, + 0x30, 0xF5, 0x2F, 0x57, 0x02, 0x00, 0xB1, 0xF5, 0x24, 0x74, 0xF2, 0xF6, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x24, 0x00, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x06, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x36, + 0x24, 0x71, 0xF2, 0xFA, 0xE1, 0xF0, 0x24, 0x00, 0x77, 0x41, 0x14, 0x71, 0x34, 0x41, 0xC6, 0x47, + 0x82, 0x04, 0xB1, 0x32, 0x24, 0x24, 0xF2, 0xFB, 0xE1, 0xF0, 0x24, 0x00, 0x77, 0x31, 0x14, 0x71, + 0x34, 0x31, 0xC6, 0x37, 0x82, 0x04, 0xB1, 0x02, 0x24, 0x24, 0xF2, 0xFB, 0xE1, 0xF0, 0x24, 0x00, + 0x08, 0x50, 0x00, 0x30, 0x0C, 0x70, 0xCC, 0x4D, 0x0C, 0x40, 0xFC, 0x48, 0x0C, 0x60, 0x66, 0x09, + 0x26, 0x75, 0x26, 0x45, 0x30, 0x57, 0x34, 0x74, 0xC6, 0x74, 0x77, 0x58, 0xA1, 0x56, 0x34, 0x62, + 0x92, 0xFA, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0xCC, 0xA4, + 0x0C, 0x60, 0x33, 0x01, 0x0C, 0xE0, 0x80, 0x0B, 0x0C, 0x20, 0x80, 0x02, 0x14, 0x41, 0x30, 0xF7, + 0x2F, 0x56, 0x06, 0x00, 0x2F, 0x3E, 0x05, 0x00, 0xA1, 0xF3, 0x1C, 0x30, 0x00, 0x57, 0x26, 0x37, + 0x30, 0x33, 0x34, 0x61, 0xC6, 0x64, 0x26, 0x52, 0xA1, 0x35, 0x34, 0x74, 0x92, 0xF1, 0x40, 0xE1, + 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x1E, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, + 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, 0xE1, 0xF0, 0x24, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x90, 0x60, 0xB9, 0x27, 0x00, 0x60, + 0xB9, 0x37, 0x04, 0x60, 0xB9, 0x07, 0x08, 0x60, 0x38, 0x67, 0x90, 0x60, 0xD4, 0x61, 0x82, 0xFD, + 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x24, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x00, 0x60, + 0x04, 0x60, 0xC6, 0x65, 0x2F, 0x23, 0x06, 0x00, 0x82, 0x0D, 0xB9, 0x27, 0x04, 0x60, 0x30, 0x24, + 0xB9, 0x27, 0x08, 0x60, 0x38, 0x27, 0x90, 0x60, 0xD4, 0x22, 0x82, 0xFD, 0x24, 0x61, 0x24, 0x44, + 0xF2, 0xF1, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0x00, 0xDE, + 0xB9, 0x67, 0x10, 0x60, 0x77, 0x31, 0x0C, 0x60, 0x90, 0x01, 0xB9, 0x67, 0x00, 0x60, 0x77, 0x21, + 0x34, 0x31, 0x08, 0x60, 0x00, 0x13, 0xB9, 0x27, 0x04, 0x60, 0x66, 0x36, 0xB9, 0x37, 0x14, 0x60, + 0x08, 0x50, 0x00, 0x10, 0x38, 0x67, 0x14, 0x60, 0x0C, 0x40, 0x14, 0x60, 0xD6, 0x65, 0x26, 0x47, + 0x92, 0xFA, 0x38, 0xE7, 0x18, 0x60, 0xB1, 0x04, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, + 0xB9, 0x07, 0x10, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x16, 0x0C, 0x14, + 0x01, 0x15, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0x04, 0xFF, 0x07, 0x02, 0x00, 0x03, 0x02, 0x67, 0x00, + 0x67, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x08, 0x07, 0x01, 0xC8, 0xC8, 0x00, 0x00, 0x02, 0x01, 0x46, 0x01, 0x02, 0x08, 0x07, 0x14, 0x14, + 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0xC8, 0x32, 0x00, 0x00, 0xC8, 0x32, 0x00, 0x00, + 0xC8, 0x32, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x80, 0x96, 0x98, 0x00, 0xE8, 0x03, 0x00, 0x00, + 0x0A, 0x00, 0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x01, 0x00, 0x5A, 0x00, 0x01, 0x00, 0x0A, 0x00, 0xA0, 0x0F, 0x64, 0x64, 0x64, 0x01, 0x50, 0x35, + 0x04, 0x05, 0x02, 0x0A, 0x06, 0x00, 0x30, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xA0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x96, 0x00, 0x2C, 0x01, 0x00, 0x00, + 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x96, 0x00, 0x26, 0x26, 0x00, 0x00, 0x60, 0x40, 0x14, 0x00, + 0x40, 0x20, 0x12, 0x00, 0x60, 0x40, 0x14, 0x00, 0x60, 0x4A, 0x12, 0x00, 0x40, 0x20, 0x12, 0x00, + 0x40, 0x38, 0x12, 0x00, 0x45, 0x38, 0x12, 0x00, 0x42, 0x38, 0x12, 0x00, 0x40, 0x40, 0x00, 0x00, + 0x63, 0x07, 0x03, 0x00, 0x61, 0x07, 0x05, 0x00, 0x61, 0x57, 0x03, 0x00, 0x61, 0x07, 0x05, 0x00, + 0x61, 0x57, 0x03, 0x00, 0x63, 0x07, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x0E, 0x00, 0x0E, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x66, 0x7F, 0xF0, 0x07, + 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, + 0x66, 0x7F, 0xF0, 0x07, 0xFF, 0x3F, 0x01, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, + 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x10, 0x3F, 0x10, 0x3F, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x08, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0xB9, 0x00, 0x00, + 0x50, 0x50, 0x05, 0x00, 0x50, 0x64, 0x00, 0x64, 0x00, 0x64, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x2C, 0x01, 0x00, 0x00, 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x2C, 0x01, 0x1E, 0x00, 0x90, 0x01, + 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0x3C, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x02, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, + 0xF4, 0x01, 0x01, 0x01, 0x0A, 0x00, 0x1E, 0x00, 0xBC, 0x02, 0xFA, 0xFA, 0x0A, 0x00, 0x96, 0x00, + 0x00, 0x05, 0x04, 0x0A, 0x05, 0x06, 0x32, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x03, 0x14, 0x00, + 0x20, 0x03, 0xDC, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x28, 0x00, 0x14, 0x00, 0x0A, 0x00, 0xE0, 0x01, + 0x05, 0x04, 0x01, 0x01, 0x01, 0x00, 0x80, 0x00, 0xD0, 0x00, 0x80, 0x01, 0x20, 0x00, 0x80, 0x00, + 0x60, 0x01, 0x30, 0x00, 0x50, 0x00, 0xA0, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, + 0x02, 0x06, 0x01, 0x04, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x18, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0xA0, 0x00, 0x64, 0x00, 0x03, 0x00, 0x00, 0x2D, + 0x2D, 0x0A, 0x96, 0x00, 0x0A, 0x0A, 0x30, 0x00, 0x05, 0x0A, 0x01, 0x00, 0x2C, 0x01, 0xC8, 0x00, + 0x05, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x00, 0x00, 0x9D, 0xF9, 0x00, 0x00, 0x50, 0x50, 0x05, 0x00, + 0x50, 0x64, 0x00, 0x64, 0x00, 0x64, 0x64, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, + 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x90, 0x01, 0x64, 0x00, 0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, + 0x58, 0x02, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0x46, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x0A, 0x02, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, 0xF4, 0x01, 0x01, 0x01, + 0x28, 0x00, 0x64, 0x00, 0xD0, 0x07, 0xFF, 0xFF, 0x0A, 0x00, 0x96, 0x00, 0x00, 0x05, 0x04, 0x0A, + 0x05, 0x06, 0x50, 0x00, 0x00, 0x00, 0x00, 0x14, 0x1E, 0x03, 0x14, 0x00, 0x20, 0x03, 0xDC, 0x05, + 0xC8, 0x00, 0x14, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0xE0, 0x01, 0x05, 0x04, 0x01, 0x01, + 0x01, 0x00, 0x80, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x20, 0x00, 0x80, 0x00, 0x60, 0x01, 0x30, 0x00, + 0x50, 0x00, 0xA0, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, 0x02, 0x03, 0x02, 0x04, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, + 0x20, 0x00, 0x20, 0x00, 0xA0, 0x00, 0x64, 0x00, 0x03, 0x00, 0x00, 0x2D, 0x2D, 0x0A, 0x96, 0x00, + 0x0A, 0x0A, 0x30, 0x00, 0x05, 0x0A, 0x01, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0x05, 0x05, 0xC8, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0D, 0x58, 0x00, 0x00, 0x16, 0x0E, 0x15, 0x0E, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0xB9, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x26, 0x26, 0x00, 0x00, 0x54, 0xFF, 0x0F, 0x00, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0x2C, 0x01, 0x38, 0x48, 0x10, 0x10, 0x01, 0x00, 0x08, 0x00, + 0xC8, 0x00, 0xC8, 0x10, 0x63, 0x07, 0x03, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, + 0x64, 0xC0, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, + 0x00, 0x00, 0x80, 0x00, 0xFF, 0x0F, 0xFF, 0x0F, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x08, 0x00, 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, + 0x2C, 0x01, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAC, 0x0D, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x7F, 0xF0, 0x07, + 0xDC, 0xC5, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x07, 0x41, 0x06, 0x00, + 0xB8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x84, 0x40, 0x00, 0x15, 0xF3, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x3F, 0x00, 0x88, 0xBF, 0x01, 0x20, 0x00, 0x00, + 0x0C, 0x0D, 0x0E, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, + 0x1E, 0x21, 0x22, 0x23, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0C, + 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0xFF, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x4E, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x48, 0x26, 0x22, 0x00, + 0x4C, 0x27, 0x26, 0x01, 0x4A, 0x27, 0x24, 0x01, 0x48, 0x2A, 0x22, 0x04, 0x48, 0x2B, 0x22, 0x05, + 0x48, 0x2C, 0x22, 0x06, 0x48, 0x2D, 0x22, 0x07, 0x48, 0x2E, 0x22, 0x08, 0x4C, 0x26, 0x26, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4C, 0x26, 0x26, 0x00, 0x46, 0x27, 0x20, 0x01, 0xFF, 0xF7, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x26, 0x07, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 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, + 0x46, 0x1E, 0x09, 0x0F, 0x46, 0x1E, 0x09, 0x0F, 0x44, 0x16, 0x09, 0x0F, 0x4E, 0x3E, 0x09, 0x0F, + 0x3E, 0xFE, 0x08, 0x0E, 0x3F, 0x02, 0x09, 0x0E, 0x37, 0xDE, 0x08, 0x0E, 0x3E, 0xFE, 0x08, 0x0E, + 0x40, 0x02, 0x09, 0x0D, 0x57, 0x5E, 0x09, 0x0D, 0x43, 0x0E, 0x09, 0x0D, 0x47, 0x1E, 0x09, 0x0D, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x7E, 0xFE, 0x09, 0x13, 0x88, 0x26, 0x0A, 0x13, + 0x86, 0x1E, 0x0A, 0x13, 0x96, 0x5E, 0x0A, 0x13, 0x7C, 0xF6, 0x09, 0x12, 0x81, 0x06, 0x0A, 0x12, + 0x6E, 0xBA, 0x09, 0x12, 0x76, 0xDE, 0x09, 0x12, 0x7E, 0xFE, 0x09, 0x11, 0x95, 0x56, 0x0A, 0x11, + 0x7A, 0xEE, 0x09, 0x11, 0x82, 0x0A, 0x0A, 0x11, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x62, 0x8A, 0x19, 0x13, 0x67, 0x9E, 0x19, 0x13, 0x6A, 0xAA, 0x19, 0x13, 0x7C, 0xF6, 0x19, 0x13, + 0x69, 0xA6, 0x19, 0x12, 0x70, 0xC2, 0x19, 0x12, 0x60, 0x86, 0x19, 0x12, 0x65, 0x96, 0x19, 0x12, + 0x66, 0x9E, 0x19, 0x11, 0x72, 0xCE, 0x19, 0x11, 0x61, 0x86, 0x19, 0x11, 0x64, 0x96, 0x19, 0x11, + 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, 0x4D, 0x36, 0x19, 0x13, 0x52, 0x4E, 0x19, 0x13, + 0x52, 0x4E, 0x19, 0x13, 0x64, 0x96, 0x19, 0x13, 0x53, 0x4E, 0x19, 0x12, 0x59, 0x66, 0x19, 0x12, + 0x4C, 0x36, 0x19, 0x12, 0x50, 0x46, 0x19, 0x12, 0x4F, 0x3E, 0x19, 0x11, 0x5B, 0x6E, 0x19, 0x11, + 0x4C, 0x36, 0x19, 0x11, 0x4E, 0x3E, 0x19, 0x11, 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, + 0x50, 0x42, 0x19, 0x13, 0x54, 0x56, 0x19, 0x13, 0x56, 0x5E, 0x19, 0x13, 0x66, 0x9E, 0x19, 0x13, + 0x56, 0x5E, 0x19, 0x12, 0x5B, 0x6E, 0x19, 0x12, 0x4E, 0x3E, 0x19, 0x12, 0x51, 0x46, 0x19, 0x12, + 0x51, 0x46, 0x19, 0x11, 0x5D, 0x76, 0x19, 0x11, 0x4F, 0x3E, 0x19, 0x11, 0x4E, 0x3E, 0x19, 0x11, + 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, 0x48, 0x26, 0x19, 0x13, 0x4F, 0x3E, 0x19, 0x13, + 0x4F, 0x42, 0x19, 0x13, 0x60, 0x86, 0x19, 0x13, 0x50, 0x46, 0x19, 0x12, 0x56, 0x5E, 0x19, 0x12, + 0x47, 0x1E, 0x19, 0x12, 0x4B, 0x2E, 0x19, 0x12, 0x4A, 0x2E, 0x19, 0x11, 0x56, 0x5E, 0x19, 0x11, + 0x47, 0x1E, 0x19, 0x11, 0x48, 0x26, 0x19, 0x11, 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, + 0x36, 0xDE, 0x18, 0x10, 0x38, 0xE6, 0x18, 0x10, 0x3A, 0xEE, 0x18, 0x10, 0x47, 0x1E, 0x19, 0x10, + 0x3C, 0xF6, 0x18, 0x0F, 0x41, 0x06, 0x19, 0x0F, 0x38, 0xE6, 0x18, 0x0F, 0x3A, 0xEE, 0x18, 0x0F, + 0x38, 0xE6, 0x18, 0x0E, 0x3C, 0xF6, 0x18, 0x0E, 0x2C, 0xB6, 0x18, 0x0E, 0x37, 0xDE, 0x18, 0x0E, + 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, 0x34, 0xD6, 0x18, 0x10, 0x38, 0xE6, 0x18, 0x10, + 0x3A, 0xEE, 0x18, 0x10, 0x46, 0x1A, 0x19, 0x10, 0x3C, 0xF2, 0x18, 0x0F, 0x3F, 0xFE, 0x18, 0x0F, + 0x36, 0xDA, 0x18, 0x0F, 0x38, 0xE6, 0x18, 0x0F, 0x36, 0xDE, 0x18, 0x0E, 0x3C, 0xF6, 0x18, 0x0E, + 0x31, 0xC6, 0x18, 0x0E, 0x33, 0xCE, 0x18, 0x0E, 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, + 0x3F, 0xFE, 0x28, 0x10, 0x44, 0x16, 0x29, 0x10, 0x44, 0x16, 0x29, 0x10, 0x52, 0x4E, 0x29, 0x10, + 0x45, 0x16, 0x29, 0x0F, 0x4A, 0x2E, 0x29, 0x0F, 0x3D, 0xF6, 0x28, 0x0F, 0x41, 0x06, 0x29, 0x0F, + 0x40, 0x02, 0x29, 0x0E, 0x48, 0x26, 0x29, 0x0E, 0x3B, 0xEE, 0x28, 0x0E, 0x3C, 0xF6, 0x28, 0x0E, + 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, 0x40, 0x06, 0x29, 0x0D, 0x47, 0x1E, 0x29, 0x0D, + 0x48, 0x26, 0x29, 0x0D, 0x55, 0x56, 0x29, 0x0D, 0x48, 0x26, 0x29, 0x0C, 0x4E, 0x3E, 0x29, 0x0C, + 0x3F, 0xFE, 0x28, 0x0C, 0x42, 0x0E, 0x29, 0x0C, 0x42, 0x0A, 0x29, 0x0B, 0x4B, 0x2E, 0x29, 0x0B, + 0x3E, 0xFE, 0x28, 0x0B, 0x3E, 0xFE, 0x28, 0x0B, 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, + 0x41, 0x06, 0x29, 0x0D, 0x45, 0x16, 0x29, 0x0D, 0x46, 0x1E, 0x29, 0x0D, 0x52, 0x4E, 0x29, 0x0D, + 0x46, 0x1E, 0x29, 0x0C, 0x4B, 0x2E, 0x29, 0x0C, 0x3E, 0xFE, 0x28, 0x0C, 0x41, 0x06, 0x29, 0x0C, + 0x41, 0x06, 0x29, 0x0B, 0x48, 0x26, 0x29, 0x0B, 0x3D, 0xF6, 0x28, 0x0B, 0x3A, 0xEE, 0x28, 0x0B, + 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, 0x3D, 0xF6, 0x28, 0x0D, 0x47, 0x1E, 0x29, 0x0D, + 0x47, 0x1E, 0x29, 0x0D, 0x54, 0x56, 0x29, 0x0D, 0x46, 0x1E, 0x29, 0x0C, 0x4C, 0x36, 0x29, 0x0C, + 0x3E, 0xFA, 0x28, 0x0C, 0x41, 0x06, 0x29, 0x0C, 0x40, 0x06, 0x29, 0x0B, 0x49, 0x26, 0x29, 0x0B, + 0x3D, 0xF6, 0x28, 0x0B, 0x3C, 0xF6, 0x28, 0x0B, 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, + 0x33, 0xCE, 0x38, 0x0A, 0x38, 0xE6, 0x38, 0x0A, 0x38, 0xE6, 0x38, 0x0B, 0x41, 0x06, 0x39, 0x0B, + 0x37, 0xDE, 0x38, 0x0A, 0x3A, 0xEE, 0x38, 0x0A, 0x30, 0xC6, 0x38, 0x0A, 0x34, 0xD6, 0x38, 0x0A, + 0x32, 0xCE, 0x38, 0x09, 0x3A, 0xEE, 0x38, 0x09, 0x30, 0xC2, 0x38, 0x09, 0x2E, 0xBE, 0x38, 0x09, + 0x00, 0x02, 0x38, 0x0A, 0x00, 0x02, 0x38, 0x0A, 0x33, 0xCE, 0x48, 0x0A, 0x36, 0xDE, 0x48, 0x0A, + 0x36, 0xDE, 0x48, 0x0B, 0x40, 0x06, 0x49, 0x0B, 0x36, 0xDE, 0x48, 0x0A, 0x39, 0xE6, 0x48, 0x0A, + 0x2E, 0xBE, 0x48, 0x0A, 0x32, 0xCE, 0x48, 0x0A, 0x31, 0xC6, 0x48, 0x09, 0x38, 0xE6, 0x48, 0x09, + 0x2E, 0xBE, 0x48, 0x09, 0x2E, 0xBA, 0x48, 0x09, 0x00, 0x02, 0x48, 0x0A, 0x00, 0x02, 0x48, 0x0A, + 0x2E, 0xBE, 0x58, 0x0A, 0x33, 0xCE, 0x58, 0x0A, 0x33, 0xCE, 0x58, 0x0B, 0x3E, 0xFA, 0x58, 0x0B, + 0x32, 0xCE, 0x58, 0x0A, 0x36, 0xDA, 0x58, 0x0A, 0x2C, 0xB6, 0x58, 0x0A, 0x2F, 0xBE, 0x58, 0x0A, + 0x2E, 0xBE, 0x58, 0x09, 0x36, 0xDA, 0x58, 0x09, 0x2C, 0xB2, 0x58, 0x09, 0x2D, 0xB6, 0x58, 0x09, + 0x00, 0x02, 0x58, 0x0A, 0x00, 0x02, 0x58, 0x0A, 0x30, 0xC2, 0x68, 0x0A, 0x35, 0xD6, 0x68, 0x0A, + 0x35, 0xD6, 0x68, 0x0B, 0x3F, 0xFE, 0x68, 0x0B, 0x33, 0xCE, 0x68, 0x0A, 0x37, 0xDE, 0x68, 0x0A, + 0x2D, 0xB6, 0x68, 0x0A, 0x30, 0xC6, 0x68, 0x0A, 0x2F, 0xC2, 0x68, 0x09, 0x37, 0xDE, 0x68, 0x09, + 0x2C, 0xB6, 0x68, 0x09, 0x2B, 0xAE, 0x68, 0x09, 0x00, 0x02, 0x68, 0x0A, 0x00, 0x02, 0x68, 0x0A, + 0x2A, 0xAE, 0x78, 0x0C, 0x31, 0xC6, 0x78, 0x0B, 0x31, 0xC6, 0x78, 0x0B, 0x3B, 0xEE, 0x78, 0x0B, + 0x30, 0xC6, 0x78, 0x0A, 0x33, 0xCE, 0x78, 0x0A, 0x2A, 0xAE, 0x78, 0x0A, 0x2E, 0xBA, 0x78, 0x0A, + 0x2D, 0xB6, 0x78, 0x09, 0x34, 0xD6, 0x78, 0x09, 0x2A, 0xAA, 0x78, 0x09, 0x29, 0xA6, 0x78, 0x0A, + 0x00, 0x02, 0x78, 0x0A, 0x00, 0x02, 0x78, 0x0A, 0x46, 0x1E, 0x89, 0x0E, 0x4D, 0x36, 0x89, 0x0E, + 0x4D, 0x36, 0x89, 0x0E, 0x5D, 0x76, 0x89, 0x0E, 0x4E, 0x3A, 0x89, 0x0D, 0x52, 0x4A, 0x89, 0x0D, + 0x40, 0x06, 0x89, 0x0D, 0x46, 0x1E, 0x89, 0x0D, 0x46, 0x1A, 0x89, 0x0C, 0x50, 0x46, 0x89, 0x0C, + 0x42, 0x0A, 0x89, 0x0C, 0x48, 0x26, 0x89, 0x0C, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, + 0x49, 0x26, 0x89, 0x0E, 0x49, 0x26, 0x89, 0x0E, 0x49, 0x26, 0x89, 0x0E, 0x58, 0x66, 0x89, 0x0E, + 0x49, 0x26, 0x89, 0x0D, 0x4D, 0x36, 0x89, 0x0D, 0x3F, 0xFE, 0x88, 0x0D, 0x44, 0x16, 0x89, 0x0D, + 0x43, 0x0E, 0x89, 0x0C, 0x4E, 0x3E, 0x89, 0x0C, 0x40, 0x02, 0x89, 0x0C, 0x42, 0x0A, 0x89, 0x0C, + 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, 0x3A, 0xEA, 0x88, 0x10, 0x3C, 0xF6, 0x88, 0x0F, + 0x3D, 0xF6, 0x88, 0x0E, 0x49, 0x26, 0x89, 0x0E, 0x3D, 0xFA, 0x88, 0x0D, 0x3F, 0x02, 0x89, 0x0D, + 0x32, 0xCE, 0x88, 0x0D, 0x38, 0xE6, 0x88, 0x0D, 0x36, 0xDE, 0x88, 0x0C, 0x40, 0x06, 0x89, 0x0C, + 0x34, 0xD6, 0x88, 0x0D, 0x38, 0xE6, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x98, 0x66, 0xFA, 0x13, 0x60, 0x86, 0xF9, 0x0E, 0x3F, 0xFE, 0xE8, 0x0A, 0x4A, 0x2A, 0xE9, 0x0A, + 0x4B, 0x2E, 0xE9, 0x0A, 0x5A, 0x6E, 0xE9, 0x0A, 0x4C, 0x32, 0xE9, 0x0A, 0x50, 0x46, 0xE9, 0x0A, + 0x41, 0x06, 0xE9, 0x0A, 0x45, 0x16, 0xE9, 0x0A, 0x44, 0x16, 0xE9, 0x0A, 0x4E, 0x3E, 0xE9, 0x0A, + 0x40, 0x02, 0xE9, 0x0A, 0x3E, 0xFE, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, + 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, + 0x00, 0x02, 0x18, 0x0E, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0xF8, 0x10, 0x00, 0x02, 0xF8, 0x12, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x40, 0xF0, 0x33, 0x21, 0x40, 0xF0, 0x33, 0x42, 0x40, 0xF0, 0x33, 0x63, 0x40, 0xF0, 0x33, + 0x84, 0x40, 0xF0, 0x33, 0xA5, 0x40, 0xF0, 0x33, 0xC6, 0xC0, 0xF1, 0x33, 0xE7, 0xC0, 0xF1, 0x33, + 0x08, 0xC1, 0xF1, 0x33, 0x29, 0xC1, 0xF1, 0x33, 0x4A, 0xC1, 0xF1, 0x33, 0x6B, 0xC1, 0xF1, 0x33, + 0x8C, 0xC1, 0xF1, 0x33, 0xAD, 0xC1, 0xF1, 0x33, 0xCE, 0xC1, 0xF1, 0x33, 0xEF, 0xC1, 0xF1, 0x33, + 0x10, 0xC2, 0xF1, 0x33, 0x31, 0xC2, 0xF1, 0x33, 0x52, 0xC2, 0xF1, 0x33, 0x73, 0xC2, 0xF1, 0x33, + 0x94, 0xC2, 0xF1, 0x73, 0xB5, 0xC2, 0xF1, 0x33, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x38, 0x30, 0x00, 0x34, 0x2F, 0x24, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x2C, 0x24, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x3F, 0xF0, 0x03, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x30, 0x30, 0x30, 0x30, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x30, 0x00, 0x49, 0x00, 0x30, 0x00, 0xA0, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 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, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xDC, 0x00, 0x00, + 0x00, 0xDC, 0x00, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x80, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x49, 0x00, 0x30, 0x00, 0xA0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC8, 0x57, 0x76, 0x63, 0x98, 0xBC, 0xA4, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x03, 0xDF, 0x07, 0x04, 0x0C, 0x22, 0x00, 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47 +}; + +#endif // __IST30XXC_FW_H__ \ No newline at end of file diff --git a/drivers/input/touchscreen/ist30xxc/firmware/j7mlte_fw.h b/drivers/input/touchscreen/ist30xxc/firmware/j7mlte_fw.h new file mode 100644 index 00000000..267fb105 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/firmware/j7mlte_fw.h @@ -0,0 +1,4054 @@ + +#ifndef __IST30XXC_FW_H__ +#define __IST30XXC_FW_H__ + +// Chip ID : 0x0000038C +// FW Ver : 0x02010000 +// Param Ver : 0x00000004 +// FW Download CRC : 0x44A4BC98 +// Normal CRC : 0x637657C8 + +static unsigned char ist30xxc_fw[] = { + 0x80, 0x00, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x54, 0x12, 0x00, 0x80, 0xFC, 0x00, 0x00, 0x80, + 0x04, 0x01, 0x00, 0x80, 0x50, 0x1D, 0x00, 0x80, 0x00, 0x1D, 0x00, 0x80, 0x28, 0x1D, 0x00, 0x80, + 0xD8, 0x1C, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x94, 0x1D, 0x00, 0x80, + 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x10, 0x00, 0x27, 0x08, 0x80, 0x00, 0x80, 0x2C, 0x80, 0x08, 0x7A, 0xAB, 0x0B, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, 0x99, 0x67, 0x10, 0x00, 0x91, 0x67, 0x08, 0x70, 0x0F, 0x00, + 0x11, 0x17, 0x0C, 0x70, 0x70, 0x15, 0x0C, 0x60, 0x70, 0x15, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, + 0x24, 0x74, 0xF2, 0xFC, 0x08, 0x30, 0x00, 0x80, 0x04, 0x70, 0x0C, 0x40, 0x70, 0x15, 0x0C, 0x50, + 0x70, 0x15, 0x2C, 0x30, 0x60, 0x7C, 0x2F, 0x64, 0x07, 0x00, 0xC6, 0x65, 0xB2, 0x07, 0x2F, 0x23, + 0x07, 0x00, 0x30, 0x22, 0x24, 0x74, 0xB1, 0x26, 0xF2, 0xF7, 0x0C, 0x70, 0x70, 0x15, 0x0C, 0x60, + 0xC4, 0x15, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, 0x24, 0x74, 0xF2, 0xFC, 0x2B, 0x0F, 0x00, 0x00, + 0x2B, 0xD0, 0x03, 0x00, 0xB9, 0x20, 0x88, 0x27, 0x04, 0x22, 0xF2, 0x0D, 0xB9, 0x20, 0x88, 0x27, + 0x04, 0x23, 0xF2, 0x09, 0xB9, 0x20, 0x88, 0x27, 0x04, 0x24, 0xF2, 0x05, 0xB9, 0x20, 0x88, 0x27, + 0x04, 0x21, 0xF2, 0x01, 0xB9, 0x10, 0x84, 0x27, 0xB9, 0x30, 0x8C, 0x27, 0x08, 0x30, 0x00, 0x50, + 0xB9, 0x03, 0x00, 0x10, 0xD9, 0x40, 0x90, 0x27, 0xD9, 0x80, 0xA0, 0x27, 0xD9, 0xC0, 0xB0, 0x27, + 0x01, 0x40, 0x01, 0x51, 0xC9, 0x40, 0xC0, 0x27, 0x99, 0x20, 0x80, 0x27, 0x08, 0x20, 0x01, 0x00, + 0xB1, 0x23, 0x98, 0x40, 0x80, 0x27, 0x92, 0xFE, 0x09, 0x00, 0x01, 0x00, 0x04, 0x23, 0xB9, 0x23, + 0x00, 0x10, 0xF2, 0x01, 0x48, 0x40, 0xC0, 0x27, 0x11, 0x15, 0x11, 0x04, 0x58, 0xC0, 0xB0, 0x27, + 0x58, 0x80, 0xA0, 0x27, 0x58, 0x40, 0x90, 0x27, 0x48, 0x20, 0x88, 0x27, 0x38, 0x10, 0x84, 0x27, + 0x61, 0x00, 0x00, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x4C, 0x00, 0x00, + 0xCB, 0x52, 0x00, 0x00, 0xEB, 0x53, 0x00, 0x00, 0x4B, 0x25, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x59, 0x00, 0x00, 0xCB, 0x5B, 0x00, 0x00, + 0x0B, 0x5B, 0x00, 0x00, 0x8B, 0x5C, 0x00, 0x00, 0x6B, 0x5E, 0x00, 0x00, 0x2B, 0x5F, 0x00, 0x00, + 0x4B, 0x61, 0x00, 0x00, 0x6B, 0x6F, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xCB, 0x61, 0x00, 0x00, 0xCB, 0x6A, 0x00, 0x00, 0x0B, 0x4F, + 0x00, 0x00, 0xAB, 0x69, 0x00, 0x00, 0x04, 0x20, 0x2B, 0x7A, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0x04, 0x2A, 0xD1, 0xC1, 0xEB, 0x49, 0x00, 0x00, + 0x0B, 0x4C, 0x00, 0x00, 0xCB, 0x0B, 0x00, 0x00, 0xAB, 0x58, 0x00, 0x00, 0xAB, 0x0C, 0x00, 0x00, + 0x8B, 0x36, 0x00, 0x00, 0xCB, 0x94, 0x00, 0x00, 0xEB, 0x12, 0x00, 0x00, 0x0B, 0x0E, 0x00, 0x00, + 0x28, 0x20, 0x88, 0x15, 0x6B, 0x14, 0x00, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x98, 0xC0, 0xB5, 0x15, + 0x92, 0xF8, 0x4B, 0x91, 0x00, 0x00, 0x04, 0x21, 0xCB, 0x61, 0x00, 0x00, 0xEB, 0x82, 0x00, 0x00, + 0x6B, 0x88, 0x00, 0x00, 0x06, 0x2C, 0xCB, 0x61, 0x00, 0x00, 0x8B, 0x90, 0x00, 0x00, 0xCB, 0x91, + 0x00, 0x00, 0x2B, 0x7C, 0x00, 0x00, 0xF2, 0xE5, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x04, 0x30, + 0xB9, 0x37, 0x08, 0x30, 0xB9, 0x47, 0x00, 0x30, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0xB3, 0x15, + 0x82, 0x08, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x00, 0x30, 0x64, 0x71, 0xB9, 0x76, 0x00, 0x30, + 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0xB3, 0x15, 0x82, 0x09, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, + 0x00, 0x30, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x00, 0x30, 0xE1, 0xF0, 0x98, 0x70, 0xB3, 0x15, + 0x82, 0x05, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x08, 0x30, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x28, 0x00, 0xD4, 0x74, 0x92, 0xFD, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x40, 0x01, 0x23, 0x77, 0xB9, 0x76, 0x40, 0x01, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x30, + 0x38, 0x27, 0x40, 0x01, 0xF7, 0x2F, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0x15, 0x00, 0x00, + 0x04, 0x70, 0xC6, 0x27, 0x82, 0x0D, 0xEB, 0x14, 0x00, 0x00, 0x08, 0x70, 0x00, 0x30, 0x08, 0x60, + 0x00, 0x80, 0xB9, 0x67, 0x40, 0x01, 0x38, 0x77, 0x3C, 0x01, 0xB9, 0x70, 0x74, 0x15, 0x30, 0xF1, + 0x06, 0x27, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xE2, 0x77, 0xE8, 0xCC, 0xE0, 0x14, 0x00, 0x0C, 0xD0, 0xFF, 0xFF, 0xB1, 0xB1, 0x56, 0xD2, + 0x82, 0x45, 0xCC, 0xE0, 0x14, 0x00, 0xD2, 0x18, 0xCC, 0xE0, 0x10, 0x00, 0x82, 0x36, 0xCC, 0xE0, + 0x10, 0x00, 0xD2, 0x08, 0xC4, 0xE1, 0x82, 0x2E, 0xC4, 0xE2, 0x92, 0x4A, 0x99, 0xD0, 0xB5, 0x15, + 0xF2, 0x65, 0xCC, 0xE0, 0x12, 0x00, 0x82, 0x2C, 0xCC, 0xE0, 0x12, 0x00, 0xD2, 0x2C, 0x99, 0xD0, + 0xB3, 0x15, 0xFA, 0x8D, 0x00, 0x00, 0xCC, 0xE0, 0x22, 0x00, 0x82, 0x31, 0xCC, 0xE0, 0x22, 0x00, + 0xD2, 0x0D, 0xCC, 0xE0, 0x20, 0x00, 0x82, 0x25, 0xCC, 0xE0, 0x20, 0x00, 0xD2, 0x25, 0xCC, 0xE0, + 0x15, 0x00, 0x92, 0x2E, 0x99, 0xD0, 0xAF, 0x15, 0xF2, 0x7A, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x25, + 0xCC, 0xE0, 0x81, 0x00, 0x82, 0x1F, 0xCC, 0xE0, 0x23, 0x00, 0x92, 0x22, 0xA9, 0xD0, 0xA4, 0x15, + 0xF2, 0x6E, 0x99, 0xE0, 0xB6, 0x15, 0xF2, 0x6B, 0x99, 0xD0, 0xB4, 0x15, 0xF2, 0x68, 0x99, 0xD0, + 0xB2, 0x15, 0xF2, 0x65, 0x99, 0xD0, 0xB1, 0x15, 0xF2, 0x62, 0x99, 0xD0, 0xB0, 0x15, 0xF2, 0x5F, + 0xA9, 0xD0, 0xA8, 0x15, 0xF2, 0x5C, 0xA9, 0xD0, 0xAA, 0x15, 0xF2, 0x59, 0xA9, 0xD0, 0xA6, 0x15, + 0xF2, 0x56, 0x99, 0xD0, 0xAD, 0x15, 0xF2, 0x53, 0x99, 0xD0, 0xAC, 0x15, 0xF2, 0x4E, 0xCC, 0xE0, + 0x32, 0x00, 0xD2, 0x18, 0xCC, 0xE0, 0x31, 0x00, 0xB2, 0x2E, 0xC4, 0xE2, 0x82, 0x17, 0xCC, 0xE0, + 0x30, 0x00, 0x92, 0x45, 0xAB, 0x13, 0x00, 0x00, 0x04, 0x20, 0x6B, 0xE5, 0x00, 0x00, 0x0C, 0xB0, + 0x40, 0x01, 0x08, 0xE0, 0x00, 0x30, 0x08, 0xD0, 0x30, 0x00, 0x06, 0xCE, 0x26, 0xBE, 0x24, 0xD1, + 0xF2, 0x31, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x31, 0xF2, 0x32, 0xAB, 0xD6, 0x00, 0x00, 0xC4, 0xD0, + 0x08, 0xE0, 0x00, 0x40, 0x82, 0x09, 0xAB, 0x13, 0x00, 0x00, 0x38, 0x7E, 0x54, 0x10, 0xB9, 0x70, + 0x70, 0x15, 0x14, 0x71, 0xF2, 0x05, 0xEB, 0x12, 0x00, 0x00, 0x38, 0x70, 0x70, 0x15, 0xB9, 0x7E, + 0x54, 0x10, 0xF2, 0x1D, 0xAB, 0x13, 0x00, 0x00, 0x04, 0x20, 0x6B, 0xE5, 0x00, 0x00, 0x06, 0x2E, + 0x0B, 0x18, 0x01, 0x00, 0xF2, 0x14, 0xB8, 0x7E, 0x40, 0x01, 0x32, 0xFE, 0x38, 0x7E, 0x28, 0x00, + 0xD4, 0x74, 0x92, 0xFD, 0xB1, 0x6B, 0x38, 0x7C, 0x3C, 0x01, 0xC6, 0x7D, 0x92, 0xF5, 0x04, 0x74, + 0xF1, 0x70, 0x08, 0x60, 0x00, 0x80, 0xF2, 0xF0, 0x6B, 0x6C, 0x00, 0x00, 0x58, 0xC1, 0x04, 0x00, + 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0xE0, + 0x00, 0x30, 0x0C, 0xD0, 0x00, 0x01, 0x26, 0xDE, 0xEB, 0x14, 0x00, 0x00, 0x06, 0x2D, 0x0C, 0x30, + 0x40, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x72, 0x82, 0x05, + 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF1, 0x38, 0x7E, 0x40, 0x01, 0xB9, 0x7E, 0x40, 0x01, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0x0C, 0x20, 0x00, 0x00, 0x0C, 0x30, + 0x80, 0x00, 0xC1, 0xE1, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x2E, 0x0C, 0x20, 0x00, 0x27, + 0x0C, 0x30, 0x80, 0x00, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, + 0x00, 0xFA, 0x38, 0x67, 0xF8, 0x01, 0x0C, 0xE0, 0x00, 0x27, 0xB9, 0x60, 0x00, 0x00, 0x38, 0x67, + 0xFC, 0x01, 0xB9, 0x60, 0x04, 0x00, 0x08, 0x60, 0x00, 0x80, 0x38, 0x66, 0x04, 0xDC, 0xB9, 0x60, + 0x08, 0x00, 0x38, 0x67, 0xF0, 0x01, 0xB9, 0x60, 0x0C, 0x00, 0x38, 0x67, 0xF4, 0x01, 0x38, 0x77, + 0xCC, 0x01, 0xB9, 0x60, 0x10, 0x00, 0xB9, 0x70, 0x1C, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x77, + 0x10, 0x20, 0xB9, 0xE0, 0x70, 0x00, 0x08, 0x60, 0x00, 0x80, 0xF7, 0x70, 0xB9, 0x70, 0x20, 0x00, + 0x08, 0x70, 0x80, 0x04, 0x2C, 0x70, 0xFF, 0x07, 0xB9, 0x70, 0x40, 0x00, 0x08, 0x70, 0x0E, 0x00, + 0x2C, 0x70, 0x16, 0x00, 0xB9, 0x70, 0x44, 0x00, 0x08, 0x70, 0x02, 0x01, 0x2C, 0x70, 0x14, 0x0C, + 0xB9, 0x70, 0x48, 0x00, 0x08, 0x70, 0x14, 0x0D, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x70, 0x4C, 0x00, + 0x14, 0x71, 0xB9, 0x70, 0x50, 0x00, 0x08, 0x70, 0x0C, 0x00, 0x2C, 0x70, 0x14, 0x00, 0xB9, 0x70, + 0x54, 0x00, 0x08, 0x70, 0x15, 0x01, 0x2C, 0x70, 0x00, 0xFF, 0xB9, 0x70, 0x58, 0x00, 0x04, 0x72, + 0xB9, 0x70, 0x60, 0x00, 0x08, 0x70, 0x08, 0x07, 0x2C, 0x70, 0x08, 0x07, 0x2C, 0x60, 0x7C, 0xDE, + 0xB9, 0x70, 0x64, 0x00, 0x28, 0x76, 0x28, 0x00, 0x28, 0x66, 0x22, 0x00, 0xB9, 0x00, 0x5C, 0x00, + 0x57, 0x78, 0x66, 0x76, 0xB9, 0x70, 0x68, 0x00, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0x00, 0x49, + 0xB9, 0x70, 0x74, 0x00, 0x0C, 0x70, 0x00, 0x10, 0xB9, 0x70, 0x78, 0x00, 0x4B, 0x23, 0x00, 0x00, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, + 0x00, 0x10, 0x18, 0x6E, 0x52, 0x05, 0x04, 0x70, 0xC6, 0x67, 0x06, 0xD2, 0x82, 0x19, 0x0C, 0xF0, + 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x38, 0x05, 0x0C, 0x50, 0x50, 0x05, 0xB1, 0x7D, 0x0C, 0x70, + 0x3C, 0x15, 0x26, 0x5E, 0x04, 0x61, 0xB0, 0x37, 0x82, 0x06, 0x06, 0x46, 0x57, 0x41, 0x26, 0x4D, + 0xB1, 0x34, 0x24, 0x61, 0x24, 0x74, 0xC6, 0x75, 0x92, 0xF7, 0x18, 0x7E, 0x52, 0x05, 0x50, 0xC1, + 0x06, 0x27, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0x06, 0x67, 0x3F, 0x57, 0x03, 0x00, + 0xC4, 0x50, 0x02, 0x08, 0x2F, 0x57, 0x02, 0x00, 0x10, 0x55, 0x24, 0x71, 0x26, 0x65, 0x13, 0x66, + 0xF2, 0xF6, 0x06, 0x26, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x30, 0xE2, + 0x08, 0x70, 0xFF, 0x00, 0x2C, 0x70, 0xFF, 0xFF, 0x56, 0xE7, 0x6C, 0xE0, 0x00, 0x0C, 0xB1, 0xE2, + 0x57, 0x31, 0x06, 0xD2, 0x4B, 0x30, 0x00, 0x00, 0x57, 0x2C, 0x66, 0x2E, 0xB1, 0x2D, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x54, 0x00, 0xD9, 0xC1, 0x44, 0x00, + 0x0B, 0x3C, 0x00, 0x00, 0x06, 0x21, 0x0C, 0x30, 0x40, 0x00, 0xCB, 0x2D, 0x00, 0x00, 0x86, 0xD2, + 0x82, 0x29, 0x06, 0x21, 0x06, 0x3D, 0x4B, 0x31, 0x00, 0x00, 0x98, 0x70, 0xAE, 0x15, 0x82, 0x0A, + 0x0C, 0x20, 0x40, 0x00, 0x26, 0x21, 0x0C, 0x30, 0x00, 0x27, 0x99, 0x01, 0x40, 0x00, 0x0B, 0x41, + 0x00, 0x00, 0x08, 0xE0, 0x00, 0x30, 0x0C, 0xC0, 0x04, 0x01, 0x26, 0xCE, 0xEB, 0x14, 0x00, 0x00, + 0x06, 0x2C, 0x06, 0x31, 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x38, 0x7E, + 0x28, 0x00, 0xD4, 0x72, 0x82, 0x05, 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF0, 0x6B, 0x15, + 0x00, 0x00, 0x06, 0x2D, 0x58, 0xC1, 0x44, 0x00, 0x2C, 0x10, 0x54, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x0C, 0x50, 0x00, 0x00, 0x0C, 0x70, 0x78, 0x00, 0x34, 0x54, 0x04, 0x60, 0x30, 0x47, 0x34, 0x74, + 0xC6, 0x75, 0x26, 0x64, 0x92, 0xFC, 0xB9, 0x60, 0x7C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x30, 0x00, + 0xD9, 0x81, 0x10, 0x00, 0xD9, 0xC1, 0x20, 0x00, 0x30, 0x22, 0x30, 0xB3, 0x08, 0xC0, 0x00, 0x80, + 0x08, 0x80, 0x00, 0x80, 0x06, 0xA4, 0x06, 0x95, 0xB1, 0x21, 0x04, 0xD0, 0x2C, 0xC0, 0x1C, 0x7A, + 0x2C, 0x80, 0x08, 0x7A, 0x2F, 0x7C, 0x0D, 0x00, 0x20, 0xE7, 0x30, 0x21, 0x36, 0x2E, 0x06, 0x32, + 0xAB, 0x97, 0x00, 0x00, 0x06, 0x42, 0x04, 0x70, 0x2F, 0x58, 0x07, 0x00, 0x20, 0x55, 0xB9, 0x41, + 0x04, 0x00, 0xB9, 0x71, 0x0C, 0x00, 0x3F, 0x25, 0x0B, 0x00, 0x06, 0x32, 0xB9, 0x51, 0x08, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x04, 0x00, 0x38, 0x51, 0x08, 0x00, 0x38, 0x71, 0x0C, 0x00, + 0x26, 0x24, 0xCC, 0x20, 0x0F, 0x21, 0xD2, 0x05, 0xB1, 0xEA, 0xB1, 0x59, 0x04, 0x21, 0xF2, 0x09, + 0x24, 0x72, 0xCC, 0x70, 0x14, 0x00, 0x92, 0xE1, 0x24, 0xD2, 0xC4, 0xDC, 0x92, 0xD4, 0x14, 0x21, + 0x58, 0xC1, 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x18, 0x70, 0xAC, 0x15, 0x3C, 0x10, 0x20, 0x00, 0xCC, 0x70, 0x80, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0x92, 0x42, 0x0C, 0xD0, 0x00, 0x10, 0x18, 0x7D, 0x52, 0x05, 0xC4, 0x72, 0x92, 0x3C, 0x38, 0xCD, + 0x3C, 0x05, 0x0C, 0x70, 0xFF, 0x0F, 0x56, 0x7C, 0xB9, 0x71, 0x08, 0x00, 0x06, 0x7C, 0x77, 0x76, + 0x04, 0x2C, 0x04, 0x38, 0x04, 0x44, 0x5C, 0x70, 0xFF, 0x0F, 0x26, 0x21, 0x26, 0x31, 0x26, 0x41, + 0x06, 0x51, 0xB9, 0x71, 0x0C, 0x00, 0x6B, 0x37, 0x00, 0x00, 0x14, 0x71, 0xC6, 0x27, 0x82, 0x23, + 0x38, 0x21, 0x04, 0x00, 0x38, 0x71, 0x0C, 0x00, 0x26, 0x22, 0x26, 0x27, 0x04, 0x33, 0x0B, 0x9B, + 0x00, 0x00, 0x08, 0xE0, 0x00, 0xFF, 0x5C, 0x20, 0xFF, 0x0F, 0x2C, 0xE0, 0xFF, 0x0F, 0x57, 0x26, + 0x56, 0xEC, 0x66, 0xE2, 0x30, 0x21, 0x38, 0x71, 0x08, 0x00, 0x26, 0x22, 0x26, 0x27, 0x04, 0x33, + 0x0B, 0x9B, 0x00, 0x00, 0x1C, 0x70, 0x00, 0x10, 0x5C, 0x20, 0xFF, 0x0F, 0x56, 0xE7, 0x66, 0xE2, + 0xB9, 0xED, 0x3C, 0x05, 0x58, 0xC1, 0x10, 0x00, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x0C, 0x60, 0x00, 0x10, 0x98, 0xD6, + 0x07, 0x05, 0x06, 0xC2, 0x06, 0xE3, 0x06, 0xB6, 0x92, 0x40, 0x0C, 0x80, 0x1D, 0x13, 0x06, 0xA6, + 0x0C, 0x90, 0x80, 0x02, 0x18, 0x7B, 0x27, 0x03, 0xC6, 0x7D, 0xC2, 0x03, 0xC4, 0xD2, 0x92, 0x03, + 0x91, 0xDC, 0xF2, 0x56, 0x60, 0x78, 0x0C, 0x30, 0x64, 0x00, 0x34, 0x71, 0x57, 0x72, 0x26, 0x7A, + 0x18, 0x67, 0x81, 0x02, 0x18, 0x77, 0x80, 0x02, 0x26, 0x66, 0x06, 0x56, 0xD7, 0x51, 0x3F, 0x66, + 0x05, 0x00, 0x26, 0x76, 0x23, 0x77, 0x26, 0x77, 0x26, 0x79, 0x70, 0x77, 0x26, 0x77, 0x06, 0x67, + 0x57, 0x61, 0x26, 0x76, 0x06, 0x27, 0xD7, 0x21, 0x36, 0x27, 0x0B, 0x9B, 0x00, 0x00, 0x0C, 0x70, + 0x80, 0x02, 0x26, 0x72, 0xCC, 0x70, 0x09, 0x06, 0xD2, 0x03, 0xB1, 0x7E, 0xF2, 0x09, 0x3C, 0x20, + 0x89, 0x03, 0x04, 0x33, 0x0B, 0x9B, 0x00, 0x00, 0x2C, 0x20, 0x09, 0x06, 0xB1, 0x2E, 0x24, 0xD1, + 0x24, 0xE4, 0x13, 0xDD, 0x24, 0x81, 0xF2, 0xC7, 0x28, 0x26, 0x0C, 0x00, 0x1C, 0x60, 0x91, 0x01, + 0x26, 0x62, 0xCC, 0x60, 0x6B, 0x07, 0xD2, 0x0F, 0x0C, 0xD0, 0xFC, 0x08, 0x3F, 0x22, 0x0D, 0x00, + 0x06, 0x32, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x6C, 0x07, 0x0B, 0x9B, 0x00, 0x00, 0x3F, 0x22, + 0x0D, 0x00, 0xF2, 0x0B, 0xCC, 0x20, 0xFC, 0x08, 0xC2, 0x08, 0x3C, 0x20, 0xFC, 0x08, 0x04, 0x33, + 0x0B, 0x9B, 0x00, 0x00, 0x2C, 0x20, 0xFC, 0x08, 0x04, 0x61, 0x91, 0x6C, 0xB1, 0x2E, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x04, 0x20, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, + 0x64, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x06, 0x01, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, + 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x1C, 0x26, 0x22, + 0xC9, 0xE1, 0x04, 0x00, 0x06, 0xE2, 0xB1, 0x01, 0x57, 0xE1, 0xB1, 0x01, 0x26, 0xE2, 0x30, 0x71, + 0xC6, 0x7E, 0xB2, 0x07, 0x2B, 0x49, 0x00, 0x00, 0x30, 0x71, 0x24, 0x71, 0xB1, 0x71, 0xF2, 0xF8, + 0x48, 0xE1, 0x04, 0x00, 0x24, 0x1C, 0xE1, 0xF0, 0xF7, 0x40, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x07, + 0x2F, 0x67, 0x07, 0x00, 0x26, 0x62, 0xA1, 0x36, 0x24, 0x71, 0xF2, 0xF9, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0x4B, 0xD7, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x2C, 0x60, 0x80, 0x00, 0x2C, 0x70, 0xCC, 0x01, + 0x36, 0x76, 0xC4, 0x70, 0x34, 0x14, 0xB1, 0xF1, 0x32, 0x02, 0x24, 0x73, 0x06, 0x47, 0x08, 0x50, + 0x00, 0x80, 0x67, 0x41, 0x04, 0x70, 0x2C, 0x50, 0x28, 0x7A, 0x14, 0x21, 0xC6, 0x74, 0x04, 0x34, + 0x26, 0x36, 0x32, 0x05, 0x30, 0xF5, 0x24, 0x54, 0xB1, 0xF6, 0xF2, 0x02, 0xB1, 0x26, 0x24, 0x71, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x03, 0x06, 0x63, 0xF2, 0xF2, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x28, 0x60, 0xA8, 0x15, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xC8, 0x32, 0xA9, 0x60, + 0xA8, 0x15, 0x28, 0x60, 0xAA, 0x15, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xC8, 0x32, + 0xA9, 0x60, 0xAA, 0x15, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x50, 0x00, 0x80, 0x34, 0x14, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x50, 0x0C, 0xDC, 0xB1, 0xF1, 0x2C, 0x70, 0x42, 0xDC, 0x0C, 0x60, 0xA0, 0x15, + 0x2C, 0x50, 0x31, 0x00, 0x14, 0x21, 0x10, 0x47, 0xCC, 0x40, 0xFF, 0x00, 0x82, 0x0E, 0x18, 0x37, + 0x05, 0x00, 0xCC, 0x30, 0xFF, 0x00, 0x82, 0x09, 0x26, 0x44, 0x06, 0xF4, 0xD7, 0xF1, 0x3F, 0x44, + 0x0F, 0x00, 0x26, 0x34, 0xA1, 0x36, 0xF2, 0x02, 0xA1, 0x26, 0x34, 0x71, 0xC6, 0x75, 0x34, 0x62, + 0x92, 0xEB, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x00, 0x10, 0x04, 0x30, + 0x0C, 0x40, 0x70, 0x05, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x4B, 0x50, 0x00, 0x00, + 0xEB, 0x2C, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0xF4, 0x01, + 0xB9, 0x60, 0x88, 0x15, 0x99, 0x00, 0xBF, 0x15, 0x14, 0x61, 0x99, 0x60, 0xBE, 0x15, 0xB9, 0x00, + 0x84, 0x15, 0xB9, 0x00, 0x80, 0x15, 0x99, 0x00, 0xBD, 0x15, 0xB9, 0x00, 0x7C, 0x15, 0xB9, 0x00, + 0x78, 0x15, 0x99, 0x00, 0xBC, 0x15, 0x04, 0x63, 0x99, 0x60, 0xBB, 0x15, 0x99, 0x00, 0xB6, 0x15, + 0x99, 0x00, 0xB5, 0x15, 0x04, 0x71, 0x99, 0x70, 0xB4, 0x15, 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, + 0x00, 0xDC, 0x18, 0x46, 0x09, 0x00, 0x99, 0x40, 0xB3, 0x15, 0x99, 0x00, 0xB2, 0x15, 0x99, 0x70, + 0xB1, 0x15, 0x99, 0x00, 0xB0, 0x15, 0x14, 0x51, 0xA9, 0x50, 0xAA, 0x15, 0xA9, 0x50, 0xA8, 0x15, + 0x18, 0x56, 0x0A, 0x00, 0x99, 0x50, 0xAF, 0x15, 0xA9, 0x00, 0xA6, 0x15, 0xA9, 0x00, 0xA4, 0x15, + 0x99, 0x00, 0xAE, 0x15, 0x99, 0x00, 0xAD, 0x15, 0x99, 0x00, 0xAC, 0x15, 0x99, 0x70, 0xBA, 0x15, + 0x99, 0x00, 0xB9, 0x15, 0x99, 0x70, 0xB8, 0x15, 0x99, 0x00, 0xB7, 0x15, 0xB9, 0x00, 0xFC, 0x17, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x4B, 0xBC, 0x00, 0x00, 0x0C, 0x60, 0x15, 0x00, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x04, 0x70, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0xE0, 0x00, 0x00, 0x04, 0x31, 0x0C, 0x20, 0x20, 0x00, 0x2B, 0xDF, + 0x00, 0x00, 0x0C, 0x20, 0xFF, 0x00, 0xEB, 0xDC, 0x00, 0x00, 0x04, 0x24, 0x04, 0x31, 0xAB, 0xD9, + 0x00, 0x00, 0x04, 0x21, 0xCB, 0xD5, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x0B, 0xD8, 0x00, 0x00, 0x04, 0x20, 0x2B, 0xE4, 0x00, 0x00, 0x0B, 0xD5, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xCB, 0xE1, + 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x4B, 0xE1, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xC0, 0x88, 0x15, 0x08, 0xE0, 0x00, 0x40, 0x0C, 0x20, + 0x40, 0x00, 0x38, 0xDE, 0x54, 0x10, 0x0B, 0xDB, 0x00, 0x00, 0x06, 0x3C, 0x0C, 0x20, 0xFF, 0xFF, + 0x04, 0x4A, 0x4B, 0x12, 0x00, 0x00, 0x04, 0x28, 0xB9, 0xDE, 0x54, 0x10, 0x04, 0x30, 0x0B, 0xE6, + 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x4B, 0xE2, 0x00, 0x00, 0x04, 0x25, 0x04, 0x31, 0x0B, 0xE6, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x00, 0x01, 0xB1, 0xF1, 0x0B, 0xDB, 0x00, 0x00, + 0x0C, 0x20, 0x80, 0x00, 0x0B, 0xDB, 0x00, 0x00, 0x04, 0x20, 0x06, 0x52, 0x0C, 0x30, 0x27, 0x00, + 0x0C, 0x40, 0xFF, 0xFF, 0x0C, 0x60, 0x01, 0x02, 0x2B, 0xEE, 0x00, 0x00, 0x04, 0x21, 0x0C, 0x30, + 0x8F, 0x01, 0x0C, 0x40, 0xFF, 0xFF, 0x04, 0x50, 0x0C, 0x60, 0x01, 0x02, 0x2B, 0xEE, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0x6B, 0xE5, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x09, + 0x0C, 0x20, 0x00, 0x60, 0x0B, 0xDB, 0x00, 0x00, 0x04, 0x21, 0x6B, 0xB5, 0x00, 0x00, 0xF2, 0x07, + 0x6B, 0xB5, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x60, 0xEB, 0xDB, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0x60, 0x00, 0x40, 0x38, 0xE6, + 0x70, 0x60, 0x06, 0x72, 0x23, 0xEE, 0xCC, 0xE0, 0x00, 0xC9, 0x06, 0xC3, 0xC2, 0x05, 0x08, 0x60, + 0x04, 0x00, 0x66, 0xE6, 0xF7, 0xE1, 0x06, 0x37, 0x06, 0x2E, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0xA0, 0x0F, 0x0B, 0x9B, 0x00, 0x00, 0x24, 0x25, 0x04, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0x08, 0x70, + 0x00, 0x40, 0x38, 0x77, 0xCC, 0x71, 0x06, 0xD2, 0x77, 0x7C, 0x24, 0x72, 0xC6, 0x27, 0xB2, 0x02, + 0x06, 0xD7, 0xC4, 0xC0, 0x82, 0x18, 0x06, 0x7E, 0xD7, 0x71, 0x2F, 0x2E, 0x0E, 0x00, 0x26, 0x27, + 0x06, 0x3D, 0x0B, 0x9B, 0x00, 0x00, 0x3C, 0xE0, 0xB0, 0x9A, 0xCC, 0xE0, 0x20, 0x03, 0x04, 0x71, + 0xD2, 0x02, 0x04, 0x70, 0xD7, 0x7F, 0x66, 0x72, 0x0C, 0x60, 0x00, 0x00, 0xB9, 0x76, 0x3C, 0x00, + 0x8B, 0x36, 0x00, 0x00, 0x06, 0x2D, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x38, 0xE7, 0x04, 0x00, 0x18, 0x27, + 0x05, 0x00, 0x04, 0x30, 0x0C, 0xC0, 0xFF, 0x00, 0x2B, 0x63, 0x00, 0x00, 0x56, 0xCE, 0x06, 0xD2, + 0x04, 0x30, 0x06, 0x2C, 0x2B, 0x63, 0x00, 0x00, 0x08, 0x70, 0xFF, 0xFF, 0x56, 0x7E, 0x57, 0xD4, + 0x66, 0x72, 0x66, 0x7D, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x6C, 0x72, 0x50, 0xC1, 0x2C, 0x10, + 0x10, 0x00, 0xE1, 0xF0, 0x38, 0x70, 0x94, 0x15, 0x34, 0x14, 0xB1, 0xF1, 0x18, 0x27, 0x08, 0x00, + 0x04, 0x31, 0x2B, 0x63, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x18, 0x70, 0x8B, 0x67, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x28, 0x20, 0xA6, 0x15, 0x34, 0x18, 0xD4, 0x21, + 0xC1, 0xE1, 0x82, 0x0A, 0x04, 0x21, 0x2B, 0x15, 0x03, 0x00, 0x18, 0x60, 0xBB, 0x15, 0x1C, 0x70, + 0x80, 0x00, 0x66, 0x76, 0xF2, 0x07, 0x2B, 0x15, 0x03, 0x00, 0x18, 0x70, 0xBB, 0x15, 0x5C, 0x70, + 0x7F, 0x00, 0x99, 0x70, 0xBB, 0x15, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, + 0xB1, 0xF1, 0x2B, 0xE4, 0x00, 0x00, 0x98, 0x70, 0xAC, 0x15, 0x82, 0x25, 0x5C, 0x70, 0xF0, 0x00, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x0A, 0xCC, 0x70, 0xC0, 0x00, 0x82, 0x1A, 0xCC, 0x70, 0x40, 0x00, + 0x92, 0x1A, 0x99, 0x00, 0xB3, 0x15, 0xF2, 0x17, 0x04, 0x71, 0x99, 0x70, 0xAE, 0x15, 0x99, 0x70, + 0xB0, 0x15, 0x99, 0x00, 0xB1, 0x15, 0x04, 0x20, 0x99, 0x00, 0xAD, 0x15, 0x2B, 0x15, 0x03, 0x00, + 0x18, 0x60, 0xBB, 0x15, 0x5C, 0x60, 0x7F, 0x00, 0x99, 0x60, 0xBB, 0x15, 0xF2, 0x04, 0x04, 0x61, + 0x99, 0x60, 0xAE, 0x15, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, + 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, 0x00, 0x80, 0x2C, 0x40, 0x6C, 0x03, + 0x3C, 0x10, 0x10, 0x00, 0x36, 0x42, 0x2C, 0x30, 0x74, 0x7B, 0xD1, 0xC1, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x30, 0x00, 0xFC, 0x04, 0x20, 0x0C, 0xF0, 0x10, 0x03, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x00, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x2E, 0x18, 0x00, 0x2C, 0x30, 0x00, 0xF0, 0x04, 0x20, + 0x0C, 0xF0, 0x10, 0x03, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x38, 0xC7, 0xD0, 0xFB, 0xB9, 0x2E, + 0x14, 0x00, 0x06, 0xD2, 0xCC, 0xC0, 0xFF, 0x00, 0x82, 0x1B, 0xC6, 0xC2, 0x82, 0x19, 0xEB, 0x14, + 0x00, 0x00, 0x08, 0x60, 0x1C, 0xE1, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x60, 0x01, 0xE9, 0xB9, 0x67, + 0x04, 0x01, 0xB9, 0xC7, 0x08, 0x01, 0xB9, 0xD7, 0x0C, 0x01, 0x38, 0x6E, 0x18, 0x00, 0xB9, 0x67, + 0x10, 0x01, 0x0B, 0xE5, 0x00, 0x00, 0x04, 0x2A, 0xEB, 0x49, 0x00, 0x00, 0xF2, 0xFB, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x60, 0xB8, 0x15, 0x34, 0x18, 0xC1, 0xE1, + 0x82, 0x09, 0x34, 0x61, 0x93, 0x66, 0x99, 0x60, 0xB8, 0x15, 0x92, 0x3B, 0x99, 0x00, 0xBA, 0x15, + 0xF2, 0x38, 0xDC, 0x20, 0x80, 0x00, 0x0C, 0xE0, 0x50, 0x00, 0x82, 0x03, 0x0C, 0xE0, 0x35, 0x00, + 0xEB, 0xBA, 0x00, 0x00, 0xC6, 0x2E, 0xA2, 0x0A, 0x38, 0x50, 0x80, 0x15, 0x18, 0x60, 0xB9, 0x15, + 0x34, 0x53, 0xC6, 0x65, 0xB2, 0x17, 0x24, 0x61, 0xF2, 0x13, 0x98, 0x60, 0xB9, 0x15, 0x82, 0x12, + 0x98, 0x50, 0xBF, 0x15, 0x82, 0x04, 0xB8, 0x50, 0x84, 0x15, 0x92, 0x0C, 0x34, 0xE4, 0xC6, 0x2E, + 0xD2, 0x09, 0x18, 0x50, 0xB7, 0x15, 0xCC, 0x50, 0x30, 0x00, 0xD2, 0x04, 0x34, 0x61, 0x99, 0x60, + 0xB9, 0x15, 0x98, 0x50, 0xBA, 0x15, 0x18, 0x70, 0xB9, 0x15, 0x92, 0x07, 0xC4, 0x74, 0xC2, 0x09, + 0x04, 0x71, 0x99, 0x70, 0xBA, 0x15, 0xF2, 0x05, 0xC4, 0x72, 0xD2, 0x03, 0x99, 0x00, 0xBA, 0x15, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x6B, 0xD1, + 0x00, 0x00, 0x06, 0x2E, 0xCB, 0xCB, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x04, 0x20, 0x34, 0x14, 0x06, 0x32, 0xB1, 0xF1, 0x6B, 0x1C, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x18, 0x20, 0xBB, 0x15, 0x5C, 0x20, + 0xF0, 0x00, 0x64, 0x23, 0x99, 0x20, 0xBB, 0x15, 0x4B, 0xC1, 0x00, 0x00, 0x4B, 0xB9, 0x00, 0x00, + 0xC4, 0xE0, 0x92, 0x06, 0xCB, 0xB8, 0x00, 0x00, 0x04, 0x24, 0x4B, 0xF9, 0x00, 0x00, 0xAB, 0x24, + 0x01, 0x00, 0xCB, 0xB9, 0x00, 0x00, 0x40, 0xE1, 0x04, 0x61, 0x99, 0x60, 0xBC, 0x15, 0x24, 0x18, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x0C, 0x60, 0x00, 0x10, 0xA8, 0x76, 0x24, 0x00, + 0x82, 0x05, 0x34, 0x71, 0xA9, 0x76, 0x24, 0x00, 0xF2, 0x30, 0x18, 0x60, 0xBF, 0x15, 0x18, 0x70, + 0xBE, 0x15, 0xC6, 0x76, 0x92, 0x2A, 0xC4, 0x70, 0x82, 0x04, 0x28, 0x70, 0xA8, 0x15, 0xF2, 0x03, + 0x28, 0x70, 0xAA, 0x15, 0xC6, 0x72, 0xC2, 0x21, 0x36, 0x72, 0x06, 0x27, 0x57, 0x23, 0x57, 0x74, + 0x26, 0x27, 0x0C, 0x30, 0x10, 0x27, 0x0B, 0x9B, 0x00, 0x00, 0xC4, 0x2A, 0xC2, 0x16, 0xAB, 0xE2, + 0x00, 0x00, 0x0B, 0xE3, 0x00, 0x00, 0x98, 0x70, 0xAF, 0x15, 0x82, 0x04, 0xAB, 0xD5, 0x00, 0x00, + 0xF2, 0x08, 0x18, 0x70, 0xC1, 0x15, 0x93, 0x07, 0x92, 0x04, 0x2B, 0x49, 0x00, 0x00, 0xF2, 0xFA, + 0x99, 0x00, 0xC1, 0x15, 0x8B, 0xE3, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x18, 0x70, 0xAD, 0x15, 0x0C, 0x60, 0x96, 0x00, 0xC4, 0x70, 0x92, 0x05, 0x38, 0x70, 0x94, 0x15, + 0x28, 0x67, 0x1E, 0x00, 0x0C, 0x70, 0x00, 0x10, 0x28, 0x57, 0x6A, 0x01, 0x26, 0x65, 0x28, 0x57, + 0x0C, 0x00, 0xC6, 0x65, 0x02, 0x17, 0x98, 0x57, 0x28, 0x03, 0x92, 0x14, 0x28, 0x57, 0x06, 0x00, + 0xDC, 0x50, 0xE0, 0x06, 0x92, 0x0F, 0x38, 0x70, 0x7C, 0x15, 0x04, 0x21, 0x24, 0x71, 0xB9, 0x70, + 0x7C, 0x15, 0x38, 0x60, 0x94, 0x15, 0x18, 0x66, 0x20, 0x00, 0xC6, 0x76, 0xD2, 0x06, 0x06, 0x25, + 0xF2, 0x04, 0xB9, 0x00, 0x7C, 0x15, 0x04, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x18, 0x70, 0xBF, 0x15, 0x18, 0x50, 0xBE, 0x15, 0xC6, 0x57, 0x82, 0x3F, 0x99, 0x70, + 0xBE, 0x15, 0xC4, 0x70, 0x18, 0x70, 0xBB, 0x15, 0x1C, 0x60, 0x10, 0x00, 0x56, 0x76, 0x82, 0x1C, + 0x64, 0x72, 0x99, 0x70, 0xBB, 0x15, 0x8B, 0x2F, 0x01, 0x00, 0xB9, 0x00, 0x84, 0x15, 0xB9, 0x00, + 0x7C, 0x15, 0x38, 0x70, 0x94, 0x15, 0x18, 0x27, 0x41, 0x00, 0x18, 0x37, 0x78, 0x00, 0x18, 0x47, + 0x77, 0x00, 0x18, 0x57, 0x58, 0x00, 0x18, 0x67, 0x20, 0x00, 0x0C, 0xF0, 0xA8, 0x00, 0xF1, 0xF0, + 0xB9, 0x20, 0x80, 0x15, 0xF2, 0x0C, 0x64, 0x71, 0x99, 0x70, 0xBB, 0x15, 0xCB, 0x30, 0x01, 0x00, + 0x38, 0x70, 0x94, 0x15, 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0x6D, 0x12, 0x98, 0x70, 0xBF, 0x15, + 0x82, 0x05, 0x0C, 0xF0, 0x68, 0x01, 0xF1, 0xF0, 0xF2, 0x05, 0x18, 0x20, 0xBB, 0x15, 0x2B, 0xCF, + 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0xCB, 0x78, 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0x4B, 0x74, + 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0x4B, 0xC1, 0x00, 0x00, 0x18, 0x20, 0xBB, 0x15, 0x2B, 0xCF, + 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x98, 0x70, 0xBF, 0x15, 0x06, 0xDE, 0x82, 0x53, 0x04, 0x63, 0x99, 0x60, 0xBC, 0x15, + 0x0B, 0x80, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x07, 0x4B, 0xB9, 0x00, 0x00, 0x0C, 0xF0, 0x68, 0x01, + 0xF1, 0xF0, 0xF2, 0x03, 0xCB, 0xB9, 0x00, 0x00, 0x0C, 0xF0, 0x8C, 0x01, 0xF1, 0xF0, 0x04, 0x21, + 0x0B, 0xB8, 0x00, 0x00, 0xCB, 0x39, 0x01, 0x00, 0x06, 0xE2, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, + 0x04, 0x28, 0x0B, 0xB8, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0B, 0xB7, 0x00, 0x00, 0xC4, 0xE0, + 0x82, 0x03, 0x2B, 0x3D, 0x01, 0x00, 0x98, 0x70, 0x05, 0x10, 0x82, 0x06, 0xB9, 0x00, 0x84, 0x15, + 0xB9, 0x00, 0x78, 0x15, 0xF2, 0x06, 0x38, 0x70, 0x84, 0x15, 0x24, 0x71, 0xB9, 0x70, 0x84, 0x15, + 0xEB, 0x28, 0x01, 0x00, 0x38, 0x70, 0x80, 0x15, 0x38, 0x60, 0x84, 0x15, 0x24, 0x73, 0xC6, 0x67, + 0xA2, 0x05, 0x99, 0x00, 0xBF, 0x15, 0x99, 0x00, 0xB7, 0x15, 0x98, 0x60, 0xBD, 0x15, 0x82, 0x35, + 0x04, 0x20, 0x99, 0x00, 0xBD, 0x15, 0x99, 0x00, 0xBF, 0x15, 0xAB, 0xF0, 0x00, 0x00, 0x28, 0x20, + 0x88, 0x15, 0x6B, 0x14, 0x00, 0x00, 0x04, 0x21, 0x2B, 0x7A, 0x00, 0x00, 0xF2, 0x26, 0x04, 0x62, + 0x99, 0x60, 0xBC, 0x15, 0x4B, 0xB9, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, + 0x0B, 0xB7, 0x00, 0x00, 0x04, 0x28, 0x0B, 0xB8, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0B, 0xB7, + 0x00, 0x00, 0xEB, 0x28, 0x01, 0x00, 0xAB, 0xD4, 0x02, 0x00, 0xC4, 0x20, 0x82, 0x0C, 0x18, 0x70, + 0xAC, 0x15, 0x5C, 0x70, 0xF0, 0x00, 0xCC, 0x70, 0x40, 0x00, 0x82, 0x07, 0x04, 0x71, 0x99, 0x70, + 0xBF, 0x15, 0xF2, 0x03, 0x8B, 0x79, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x34, 0x14, 0xB1, 0xF1, 0xCB, 0x32, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x03, 0x0B, 0xE5, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0xEB, 0xEF, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0x04, 0x20, 0xC1, 0xE1, 0x6B, 0xF1, + 0x00, 0x00, 0x06, 0xE2, 0x04, 0x20, 0xAB, 0xF0, 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0x14, 0x00, 0x00, 0x08, 0x70, 0x1C, 0xE1, + 0x08, 0x60, 0x00, 0x30, 0x2C, 0x70, 0x04, 0xE9, 0xB9, 0x76, 0x04, 0x01, 0xB9, 0x76, 0x08, 0x01, + 0x0B, 0xE5, 0x00, 0x00, 0x04, 0x2A, 0xEB, 0x49, 0x00, 0x00, 0xF2, 0xFB, 0x34, 0x14, 0xB1, 0xF1, + 0x4B, 0x16, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x05, 0x38, 0x20, 0x74, 0x15, 0xCB, 0x17, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0x04, 0x21, 0xC1, 0xE1, 0xEB, 0xEF, + 0x00, 0x00, 0x08, 0xE0, 0x07, 0x00, 0x2C, 0xE0, 0x20, 0xA1, 0xEB, 0x93, 0x00, 0x00, 0x98, 0x70, + 0xB6, 0x15, 0x92, 0x1B, 0x04, 0x21, 0x6B, 0xF1, 0x00, 0x00, 0x26, 0x22, 0x06, 0x72, 0x57, 0x71, + 0x26, 0x27, 0xC6, 0x2E, 0xC2, 0xF3, 0x08, 0x70, 0x00, 0x80, 0x38, 0x77, 0xCC, 0xFB, 0xCC, 0x70, + 0xFF, 0x00, 0x82, 0x04, 0x98, 0x70, 0xB5, 0x15, 0x82, 0x08, 0x04, 0x21, 0xAB, 0xF0, 0x00, 0x00, + 0x04, 0x21, 0xEB, 0xEF, 0x00, 0x00, 0xF2, 0xE2, 0x04, 0x21, 0xAB, 0xF0, 0x00, 0x00, 0x40, 0xE1, + 0x24, 0x18, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0xC6, 0x27, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x03, + 0xC6, 0x37, 0x92, 0x04, 0x3B, 0xA2, 0x00, 0x00, 0xF2, 0x0E, 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, + 0xB9, 0x67, 0x00, 0x80, 0xB9, 0x27, 0x04, 0x80, 0xB9, 0x37, 0x08, 0x80, 0xB9, 0x07, 0x0C, 0x80, + 0x38, 0x27, 0x10, 0x80, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x34, 0x14, + 0xB1, 0xF1, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, 0x18, 0x80, 0xB9, 0x47, 0x1C, 0x80, + 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x20, 0x80, 0xF2, 0x05, + 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA3, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x06, 0x72, 0x34, 0x14, 0x06, 0x43, 0x04, 0x21, 0x06, 0x37, 0xB1, 0xF1, 0x6B, 0x99, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD3, + 0xF7, 0xDF, 0xC4, 0xD0, 0x06, 0xE4, 0xF7, 0xEF, 0x82, 0x02, 0x16, 0x33, 0xC4, 0xE0, 0x82, 0x02, + 0x16, 0x44, 0xC4, 0x20, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, 0x18, 0x80, 0xB9, 0x47, + 0x1C, 0x80, 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x20, 0x80, + 0xF2, 0x05, 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA3, 0x00, 0x00, 0xC6, 0xDE, 0x82, 0x02, 0x16, 0x22, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x80, 0xC6, 0x26, 0x34, 0x14, + 0xB1, 0xF1, 0x06, 0x72, 0x06, 0x43, 0x82, 0x04, 0xC6, 0x36, 0x04, 0x21, 0x92, 0x02, 0x04, 0x20, + 0x06, 0x37, 0xCB, 0x9B, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x3C, 0x10, + 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE3, 0x06, 0xD4, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, + 0x18, 0x80, 0xB9, 0x47, 0x1C, 0x80, 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, + 0x38, 0x26, 0x24, 0x80, 0xF2, 0x0A, 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA3, 0x00, 0x00, 0x06, 0x3D, + 0xAB, 0x97, 0x00, 0x00, 0x3F, 0x22, 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x06, 0x72, 0x34, 0x14, 0x06, 0x43, 0x04, 0x21, 0x06, 0x37, 0xB1, 0xF1, 0x6B, 0x9F, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x30, 0x04, 0x40, 0x04, 0x50, 0x0C, 0x60, 0x20, 0x00, + 0x52, 0x03, 0xA6, 0x42, 0x25, 0x50, 0xB4, 0x61, 0x02, 0x06, 0xA6, 0x44, 0x25, 0x55, 0xA6, 0x33, + 0x42, 0xF9, 0xF2, 0xFA, 0x06, 0x24, 0x06, 0x35, 0xE1, 0xF0, 0x04, 0x40, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x9E, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9D, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9C, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x9B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9A, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x99, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x98, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x97, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x96, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x95, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x94, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x93, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x92, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x91, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x90, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8F, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x8E, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8D, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8C, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x8B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8A, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x89, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x88, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x87, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x86, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x85, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x84, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x83, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x82, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x81, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x80, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x7F, 0x00, 0x00, 0xE1, 0xF0, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x62, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x63, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x64, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x65, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x66, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x67, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x68, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x69, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6A, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6B, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6C, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6D, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6E, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6F, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x70, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x71, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x72, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x73, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x74, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x75, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x76, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x77, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x78, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x79, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7A, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7B, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7C, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7D, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7E, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7F, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x80, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, + 0x08, 0x70, 0x00, 0x40, 0xC4, 0x20, 0x38, 0x67, 0x60, 0x71, 0x82, 0x09, 0x08, 0x50, 0x40, 0x00, + 0x66, 0x65, 0xB9, 0x67, 0x60, 0x71, 0x2B, 0x49, 0x00, 0x00, 0xF2, 0x08, 0x08, 0x50, 0xBF, 0xFF, + 0x2C, 0x50, 0xFF, 0xFF, 0x56, 0x65, 0xB9, 0x67, 0x60, 0x71, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x70, 0xD6, 0x72, 0x82, 0xFD, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x8B, 0xB7, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0xE7, + 0x00, 0x70, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x64, 0x72, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x64, 0x71, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, + 0x38, 0x27, 0xE0, 0x70, 0x5C, 0x20, 0xFF, 0x7F, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, + 0x38, 0x27, 0x5C, 0x70, 0x5C, 0x20, 0x7F, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x08, 0x60, + 0x00, 0x40, 0x82, 0x08, 0x08, 0x70, 0x0F, 0xC0, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x76, 0x3C, 0x71, + 0xF2, 0x03, 0xB9, 0x06, 0x3C, 0x71, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0x20, + 0x08, 0x70, 0x08, 0xD0, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2D, 0x2C, 0x30, 0x08, 0xE2, + 0x0C, 0x40, 0xF8, 0x02, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x40, 0x08, 0xE0, + 0x00, 0x30, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0xE5, 0x0C, 0x40, 0x00, 0x09, + 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xC4, 0x52, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, + 0x2C, 0x30, 0x00, 0xEE, 0x0C, 0x40, 0x50, 0x01, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x08, 0x70, + 0x0F, 0xC0, 0x2C, 0x70, 0xFF, 0xFF, 0x0C, 0x20, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x7D, + 0x3C, 0x71, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0xF0, 0x0C, 0x40, 0x00, 0x09, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x49, 0x08, 0x30, 0x08, 0x07, 0xB9, 0x0D, 0x3C, 0x71, 0x26, 0x2E, + 0x2C, 0x30, 0x08, 0x07, 0x0C, 0x40, 0x00, 0x09, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x23, 0x82, 0x77, 0xC4, 0x23, 0x08, 0x70, + 0x00, 0x40, 0xD2, 0x07, 0xC4, 0x21, 0x82, 0x1C, 0xC4, 0x22, 0x82, 0x2D, 0xFA, 0x89, 0x00, 0x00, + 0xCC, 0x20, 0x81, 0x00, 0x82, 0x1E, 0xCC, 0x20, 0x82, 0x00, 0x82, 0x3D, 0xC4, 0x28, 0x9A, 0x80, + 0x00, 0x00, 0x0C, 0x50, 0x40, 0x40, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, + 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, 0x63, 0x07, 0xB9, 0x57, 0x54, 0x70, 0xF2, 0x6B, 0x08, 0x50, + 0x14, 0x00, 0x2C, 0x50, 0x60, 0x40, 0xB9, 0x57, 0x34, 0x70, 0xB9, 0x27, 0x64, 0x70, 0xF2, 0x1E, + 0x08, 0x50, 0x12, 0x00, 0x2C, 0x50, 0x40, 0x20, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x52, 0xB9, 0x57, + 0x64, 0x70, 0xF2, 0x38, 0x98, 0x50, 0xBA, 0x15, 0x82, 0x06, 0x08, 0x50, 0x12, 0x00, 0x2C, 0x50, + 0x60, 0x4A, 0xF2, 0x05, 0x08, 0x50, 0x14, 0x00, 0x2C, 0x50, 0x60, 0x40, 0xB9, 0x57, 0x34, 0x70, + 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x70, 0x00, 0x40, 0x08, 0x50, 0x05, 0x00, 0x2C, 0x50, + 0x61, 0x07, 0xF2, 0x24, 0x98, 0x50, 0xBA, 0x15, 0x82, 0x12, 0x28, 0x40, 0x22, 0x10, 0x08, 0x50, + 0x12, 0x00, 0xC4, 0x49, 0xC2, 0x04, 0x2C, 0x50, 0x45, 0x38, 0xF2, 0x0D, 0xC4, 0x45, 0xC2, 0x04, + 0x2C, 0x50, 0x42, 0x38, 0xF2, 0x08, 0x2C, 0x50, 0x40, 0x38, 0xF2, 0x05, 0x08, 0x50, 0x12, 0x00, + 0x2C, 0x50, 0x40, 0x20, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x52, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, 0x61, 0x57, 0xB9, 0x57, 0x54, 0x70, 0x08, 0x50, + 0x80, 0x0F, 0x2C, 0x50, 0x80, 0x0F, 0xF2, 0x14, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x50, 0x26, 0x26, + 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, + 0x63, 0x07, 0xB9, 0x57, 0x54, 0x70, 0x08, 0x50, 0x00, 0x0E, 0x2C, 0x50, 0x00, 0x0E, 0xB9, 0x57, + 0x6C, 0x70, 0x08, 0x50, 0xF0, 0x07, 0x2C, 0x50, 0x66, 0x7F, 0xB9, 0x57, 0x1C, 0x71, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x96, 0x00, 0xB9, 0x57, 0x30, 0x70, 0x98, 0x70, 0xBA, 0x15, 0x08, 0x60, + 0x00, 0x40, 0x82, 0x04, 0x0C, 0x70, 0xFF, 0x3F, 0xF2, 0x05, 0x08, 0x70, 0x01, 0x00, 0x2C, 0x70, + 0xFF, 0x3F, 0xB9, 0x76, 0x58, 0x70, 0xE1, 0xF0, 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x60, + 0x8C, 0x15, 0xF2, 0x03, 0x38, 0x60, 0x90, 0x15, 0x38, 0x56, 0x08, 0x00, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x57, 0xB4, 0x70, 0x38, 0x56, 0x0C, 0x00, 0x08, 0x40, 0xDF, 0xFF, 0xB9, 0x57, 0xB8, 0x70, + 0x38, 0x56, 0x10, 0x00, 0x2C, 0x40, 0xFF, 0xFF, 0x56, 0x54, 0xB9, 0x57, 0xC0, 0x70, 0x38, 0x56, + 0x14, 0x00, 0xB9, 0x57, 0xC4, 0x70, 0x98, 0x50, 0xAD, 0x15, 0x82, 0x0C, 0x08, 0x60, 0x01, 0x00, + 0x2C, 0x60, 0x81, 0x11, 0xB9, 0x67, 0xAC, 0x70, 0x08, 0x60, 0x10, 0x00, 0x2C, 0x60, 0x10, 0x00, + 0xF2, 0x06, 0x30, 0x56, 0xB9, 0x57, 0xAC, 0x70, 0x38, 0x66, 0x04, 0x00, 0xB9, 0x67, 0xB0, 0x70, + 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x70, 0x8C, 0x15, 0xF2, 0x03, + 0x38, 0x70, 0x90, 0x15, 0x18, 0x60, 0x28, 0x13, 0xC4, 0x62, 0xC2, 0x04, 0x38, 0x57, 0x20, 0x00, + 0xF2, 0x08, 0xC4, 0x62, 0x92, 0x04, 0x38, 0x57, 0x1C, 0x00, 0xF2, 0x03, 0x38, 0x57, 0x18, 0x00, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0xC8, 0x70, 0x38, 0x57, 0x24, 0x00, 0xB9, 0x56, 0xCC, 0x70, + 0x38, 0x77, 0x28, 0x00, 0xB9, 0x76, 0xD4, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, + 0x92, 0x04, 0x38, 0x70, 0x8C, 0x15, 0xF2, 0x03, 0x38, 0x70, 0x90, 0x15, 0x38, 0x57, 0x2C, 0x00, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0x8C, 0x70, 0x38, 0x57, 0x30, 0x00, 0xB9, 0x56, 0x90, 0x70, + 0x38, 0x57, 0x34, 0x00, 0xB9, 0x56, 0x94, 0x70, 0x38, 0x57, 0x38, 0x00, 0xB9, 0x56, 0x98, 0x70, + 0x38, 0x57, 0x3C, 0x00, 0xB9, 0x56, 0x9C, 0x70, 0x38, 0x57, 0x40, 0x00, 0xB9, 0x56, 0xA0, 0x70, + 0x38, 0x57, 0x44, 0x00, 0xB9, 0x56, 0xA4, 0x70, 0x38, 0x77, 0x48, 0x00, 0xB9, 0x76, 0xA8, 0x70, + 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0x00, 0xDE, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x10, 0x60, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x10, 0x60, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0xFE, 0x00, 0xB9, 0x67, 0x0C, 0x20, 0xB9, 0x07, 0x18, 0x20, + 0xE1, 0xF0, 0x00, 0x00, 0x51, 0x00, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, 0xC4, 0x20, 0x38, 0x67, + 0x34, 0x10, 0x82, 0x03, 0x64, 0x63, 0xF2, 0x03, 0x14, 0x54, 0x56, 0x65, 0xB9, 0x67, 0x34, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x2C, 0x70, 0x8C, 0x03, 0x08, 0x60, 0x00, 0x40, + 0xB9, 0x76, 0x00, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x08, 0x60, 0x00, 0x40, + 0x2C, 0x70, 0x8C, 0x03, 0xB9, 0x76, 0x00, 0x10, 0xB9, 0x26, 0x6C, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x0C, 0x50, 0x10, 0x00, 0xB9, 0x57, 0x20, 0x10, 0x08, 0x50, 0x38, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x2C, 0x50, 0x80, 0x88, 0xB9, 0x57, 0x24, 0x10, 0xB9, 0x67, 0x00, 0x10, 0xB9, 0x07, 0x28, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0xC4, 0x30, 0x38, 0x67, 0x50, 0x10, 0x82, 0x05, 0x66, 0x62, 0xB9, 0x67, + 0x50, 0x10, 0xF2, 0x05, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x50, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x38, 0x67, 0x54, 0x10, 0x66, 0x62, 0xB9, 0x67, 0x54, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0xAD, 0xDE, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x54, 0x10, + 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x54, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x57, 0x58, 0x10, + 0xCC, 0x20, 0xFF, 0x00, 0x1C, 0x40, 0x00, 0x01, 0x56, 0x54, 0x92, 0x0A, 0xB9, 0x57, 0x58, 0x10, + 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, 0x14, 0x52, 0x56, 0x65, 0xF2, 0x09, 0x66, 0x52, + 0xB9, 0x57, 0x58, 0x10, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, 0x64, 0x61, 0xB9, 0x67, + 0x4C, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0xC4, 0x30, 0x38, 0x67, 0x4C, 0x10, 0x82, 0x05, 0x66, 0x62, 0xB9, 0x67, + 0x4C, 0x10, 0xF2, 0x05, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x4C, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0xAD, 0xDE, 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x8C, 0x03, 0xB9, 0x76, 0x00, 0x10, + 0x04, 0x73, 0xB9, 0x76, 0x44, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x10, + 0x66, 0x72, 0xB9, 0x76, 0x08, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x64, 0x10, + 0x66, 0x72, 0xB9, 0x76, 0x64, 0x10, 0xE1, 0xF0, 0x04, 0x62, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, + 0x14, 0x10, 0xE1, 0xF0, 0x23, 0x22, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x10, 0x10, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x14, 0x10, 0x64, 0x71, 0xB9, 0x76, 0x14, 0x10, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x14, 0x10, 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x14, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x0C, 0x70, 0x10, 0x00, 0x82, 0x03, 0x0C, 0x70, 0xA0, 0x00, + 0x6C, 0x70, 0x00, 0x01, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x74, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x70, 0x10, 0xE1, 0xF0, 0xC4, 0x20, 0x08, 0x70, + 0x00, 0x40, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x30, 0x57, 0x21, 0x08, 0x70, 0x00, 0x40, 0x26, 0x72, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, + 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, + 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x62, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x10, 0x30, + 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x61, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x40, 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, + 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, + 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x50, + 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, + 0x3C, 0x10, 0x24, 0x00, 0xD9, 0x41, 0x08, 0x00, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x1C, 0x00, + 0x04, 0x61, 0xB9, 0xF1, 0x18, 0x00, 0xC1, 0x21, 0x99, 0x60, 0xC1, 0x15, 0x6B, 0x48, 0x00, 0x00, + 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x78, 0x10, 0x48, 0x61, 0x1C, 0x00, 0x38, 0xF1, + 0x18, 0x00, 0x40, 0x21, 0x11, 0x16, 0x11, 0x07, 0x58, 0x41, 0x08, 0x00, 0x2C, 0x10, 0x24, 0x00, + 0x61, 0x00, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, + 0x08, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0x04, 0x61, + 0x99, 0x60, 0xC0, 0x15, 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, + 0x10, 0x00, 0x61, 0x00, 0x08, 0x70, 0x04, 0x00, 0x24, 0x74, 0x26, 0x27, 0x08, 0x70, 0xFF, 0xBF, + 0x57, 0x26, 0x2C, 0x70, 0x00, 0xC0, 0xB1, 0x42, 0x26, 0x27, 0x0C, 0x40, 0x04, 0x40, 0x08, 0x70, + 0x00, 0x40, 0x26, 0x47, 0x26, 0x42, 0xB1, 0x34, 0x0C, 0x40, 0x10, 0x40, 0x26, 0x47, 0x26, 0x42, + 0x2C, 0x70, 0x08, 0x40, 0xB1, 0x54, 0x26, 0x27, 0xB1, 0x62, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, + 0x2C, 0x70, 0x08, 0x40, 0x57, 0x26, 0x26, 0x27, 0x30, 0x72, 0x6C, 0x70, 0x00, 0x01, 0xB1, 0x72, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x70, 0x08, 0x40, 0x57, 0x26, 0x26, 0x27, + 0x30, 0x72, 0x1C, 0x60, 0x01, 0x01, 0x56, 0x76, 0xB1, 0x72, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, + 0x57, 0x26, 0x2C, 0x70, 0x0C, 0x40, 0x26, 0x72, 0x30, 0x27, 0xE1, 0xF0, 0x06, 0x52, 0x2F, 0x62, + 0x02, 0x00, 0x57, 0x52, 0x3F, 0x66, 0x05, 0x00, 0xC4, 0x3B, 0x26, 0x63, 0xB1, 0x64, 0x06, 0x72, + 0xC2, 0x0F, 0x06, 0x57, 0x0C, 0x50, 0x98, 0x15, 0x28, 0x55, 0x02, 0x00, 0x04, 0x20, 0xC6, 0x65, + 0x92, 0x03, 0x0C, 0x20, 0x08, 0x07, 0x28, 0x70, 0x98, 0x15, 0xC6, 0x67, 0xF2, 0x0C, 0xCC, 0x70, + 0x13, 0x00, 0x0C, 0x20, 0x08, 0x07, 0xC2, 0x0A, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x07, 0xCC, 0x70, + 0xFF, 0x00, 0x04, 0x20, 0x92, 0x03, 0x0C, 0x20, 0x08, 0x07, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x06, 0xC2, 0x06, 0xE4, 0x04, 0x21, 0x06, 0xD3, 0x6B, 0xBB, 0x00, 0x00, 0x08, 0x70, + 0x00, 0x30, 0x2C, 0x70, 0x00, 0x40, 0x57, 0xC1, 0x2F, 0x27, 0x0C, 0x00, 0x30, 0x62, 0xC4, 0xE0, + 0x0C, 0x70, 0xFF, 0x03, 0x56, 0x76, 0x77, 0x65, 0x82, 0x09, 0xC4, 0xD0, 0x82, 0x04, 0x26, 0x7E, + 0x26, 0x6E, 0xF2, 0x11, 0x36, 0x6E, 0x36, 0x7E, 0xF2, 0x0E, 0xC4, 0xD0, 0x82, 0x07, 0xC6, 0x67, + 0x02, 0x03, 0x24, 0x71, 0xF2, 0x08, 0x24, 0x61, 0xF2, 0x06, 0xC6, 0x67, 0x02, 0x03, 0x34, 0x61, + 0xF2, 0x02, 0x34, 0x71, 0xC4, 0x70, 0x02, 0x09, 0xCC, 0x70, 0xFF, 0x03, 0x04, 0xE0, 0x02, 0x07, + 0x14, 0xE1, 0x0C, 0x70, 0xFF, 0x03, 0xF2, 0x03, 0x14, 0xE1, 0x04, 0x71, 0xC4, 0x60, 0x02, 0x08, + 0xCC, 0x60, 0xFF, 0x03, 0x02, 0x07, 0x14, 0xE1, 0x0C, 0x60, 0xFF, 0x03, 0xF2, 0x03, 0x14, 0xE1, + 0x04, 0x61, 0x57, 0x65, 0x66, 0x67, 0xB1, 0x62, 0x04, 0x20, 0x6B, 0xBB, 0x00, 0x00, 0x06, 0x2E, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x1C, 0x09, 0x23, 0x32, 0x0C, 0x40, + 0x80, 0x04, 0x06, 0x21, 0xD9, 0xC1, 0x0C, 0x09, 0xC9, 0xA1, 0x04, 0x09, 0x4B, 0x4B, 0x00, 0x00, + 0x0C, 0x20, 0xC0, 0x06, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x04, 0x26, 0x21, 0x04, 0x31, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x04, 0x21, 0x08, 0xB0, 0x00, 0x30, 0x0B, 0xB8, 0x00, 0x00, 0x0C, 0xC0, + 0x22, 0x00, 0x2C, 0xB0, 0x00, 0x49, 0x04, 0x21, 0x04, 0xD0, 0x0B, 0xB7, 0x00, 0x00, 0x06, 0xED, + 0x04, 0xA0, 0x0C, 0x40, 0x00, 0x09, 0x06, 0x2D, 0x06, 0x3A, 0x26, 0x41, 0xEB, 0xF1, 0x00, 0x00, + 0x86, 0x62, 0x82, 0x5E, 0x38, 0x21, 0x00, 0x09, 0x06, 0x72, 0x57, 0x71, 0x26, 0x7B, 0x30, 0x77, + 0x5C, 0x70, 0xFF, 0x0F, 0x36, 0x76, 0x0C, 0x60, 0xC0, 0x06, 0x26, 0x61, 0x26, 0x62, 0x90, 0x46, + 0x82, 0x04, 0xCC, 0x70, 0x46, 0x00, 0x02, 0x4B, 0x0C, 0x50, 0x80, 0x04, 0x26, 0x51, 0x26, 0x52, + 0x10, 0x65, 0xC4, 0x61, 0x2F, 0x62, 0x02, 0x00, 0x92, 0x07, 0xC4, 0x70, 0x22, 0x27, 0xC4, 0x70, + 0x91, 0x05, 0x92, 0x11, 0xF2, 0x23, 0xC4, 0x70, 0x12, 0x0E, 0x04, 0x31, 0x91, 0x35, 0x2F, 0x56, + 0x01, 0x00, 0xA0, 0x55, 0x92, 0x1B, 0x0C, 0x50, 0xC0, 0x06, 0x26, 0x51, 0x24, 0x41, 0x26, 0x52, + 0x91, 0x45, 0xF2, 0x14, 0x2F, 0x56, 0x01, 0x00, 0x20, 0x55, 0x26, 0x55, 0x06, 0x45, 0x57, 0x41, + 0x26, 0x54, 0x06, 0x45, 0xD7, 0x41, 0x3F, 0x55, 0x04, 0x00, 0xC6, 0x75, 0x32, 0x07, 0x2F, 0x56, + 0x01, 0x00, 0x20, 0x75, 0xF7, 0x70, 0xA1, 0x75, 0xF2, 0x0F, 0x2F, 0x56, 0x01, 0x00, 0x20, 0x55, + 0x26, 0x55, 0x06, 0x45, 0x57, 0x41, 0x26, 0x54, 0x06, 0x45, 0xD7, 0x41, 0x36, 0x54, 0xC6, 0x57, + 0x32, 0x03, 0xC4, 0x70, 0x22, 0xED, 0x0C, 0x70, 0x80, 0x04, 0x26, 0x71, 0x26, 0x72, 0x26, 0x61, + 0x10, 0x37, 0x20, 0x46, 0x6B, 0xF4, 0x00, 0x00, 0xC4, 0x20, 0x32, 0x02, 0x24, 0xE1, 0x24, 0xA1, + 0xC4, 0xAE, 0x92, 0x98, 0x24, 0xD1, 0xCC, 0xD0, 0x16, 0x00, 0x92, 0x93, 0xCC, 0xE0, 0xFE, 0x00, + 0x82, 0x07, 0xB4, 0xC1, 0x82, 0x05, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0xF2, 0x85, 0x58, 0xC1, + 0x0C, 0x09, 0x48, 0xA1, 0x04, 0x09, 0x2C, 0x10, 0x1C, 0x09, 0xE1, 0xF0, 0x3C, 0x10, 0x34, 0x00, + 0xD9, 0x81, 0x14, 0x00, 0xD9, 0xC1, 0x24, 0x00, 0xB9, 0x21, 0x04, 0x00, 0x06, 0x93, 0x06, 0x84, + 0x04, 0xEA, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, 0xB4, 0xE1, + 0x92, 0xF9, 0x08, 0xC0, 0x00, 0x30, 0x1C, 0x50, 0x88, 0x13, 0x06, 0xBE, 0x06, 0x7E, 0x06, 0x6E, + 0x06, 0xAE, 0x2C, 0xC0, 0x00, 0x49, 0x04, 0xD0, 0x06, 0x2E, 0x06, 0x3D, 0x06, 0x41, 0xB9, 0x51, + 0x10, 0x00, 0xB9, 0x61, 0x08, 0x00, 0xB9, 0x71, 0x0C, 0x00, 0xEB, 0xF1, 0x00, 0x00, 0x86, 0x22, + 0x38, 0x51, 0x10, 0x00, 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, 0x0C, 0x00, 0x82, 0x19, 0x30, 0x41, + 0x57, 0x41, 0x26, 0x4C, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x0F, 0x3F, 0x22, 0x04, 0x00, 0xC4, 0x20, + 0x32, 0x02, 0x16, 0x22, 0xCC, 0x20, 0xC8, 0x00, 0x02, 0x02, 0x04, 0xA1, 0x1C, 0x40, 0xC8, 0x00, + 0x26, 0x42, 0xC6, 0x54, 0x32, 0x05, 0x06, 0x54, 0x06, 0xBE, 0x06, 0x7D, 0x06, 0x62, 0x24, 0xD1, + 0xC4, 0xDE, 0x92, 0xD3, 0x24, 0xE1, 0xCC, 0xE0, 0x16, 0x00, 0x92, 0xCE, 0xB1, 0x68, 0xB1, 0x79, + 0x04, 0x20, 0x38, 0x71, 0x04, 0x00, 0xC6, 0xA2, 0xB1, 0xB7, 0x82, 0x02, 0x04, 0x24, 0x58, 0xC1, + 0x24, 0x00, 0x58, 0x81, 0x14, 0x00, 0x2C, 0x10, 0x34, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x06, 0xE4, 0x06, 0xC2, 0x04, 0x28, 0x06, 0xD3, 0x4B, 0xC1, 0x00, 0x00, 0x08, 0x70, + 0x01, 0x00, 0x2C, 0x70, 0xFF, 0x3F, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x58, 0x70, 0x04, 0x21, + 0x6B, 0xBB, 0x00, 0x00, 0x08, 0x20, 0x00, 0x30, 0x08, 0x30, 0x08, 0x00, 0x2C, 0x30, 0x00, 0x02, + 0x0C, 0x40, 0x00, 0x09, 0x2C, 0x20, 0x00, 0x40, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x04, 0x20, + 0x6B, 0xBB, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x02, 0x4B, 0xF9, 0x00, 0x00, 0x06, 0x2C, 0x06, 0x3D, + 0x06, 0x4E, 0xEB, 0x03, 0x01, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x18, 0x00, 0xD9, 0xC1, 0x08, 0x00, 0xC1, 0xA1, 0x06, 0xC3, 0x06, 0xB2, 0x2B, 0xD4, + 0x00, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x00, 0xF0, 0x08, 0x60, 0x00, 0x80, 0x2F, 0xD6, + 0x07, 0x00, 0x2C, 0x60, 0x00, 0x0C, 0x2F, 0xA6, 0x07, 0x00, 0x06, 0xED, 0x06, 0x3E, 0x0C, 0x20, + 0x30, 0x00, 0x77, 0x31, 0x0C, 0xF0, 0x9C, 0x02, 0xF1, 0xF0, 0x2C, 0xE0, 0x00, 0x04, 0xC6, 0xEA, + 0x92, 0xF6, 0x0C, 0xF0, 0x98, 0x02, 0xF1, 0xF0, 0x06, 0x3D, 0x06, 0x4B, 0x0C, 0x20, 0x50, 0x01, + 0x77, 0x31, 0x0C, 0x50, 0x40, 0x02, 0x0C, 0xF0, 0xD0, 0x02, 0xF1, 0xF0, 0x2B, 0x49, 0x00, 0x00, + 0x08, 0x30, 0x00, 0x80, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x30, 0x00, 0xFA, 0x26, 0x37, 0x06, 0x4C, + 0x0C, 0x20, 0x50, 0x01, 0x77, 0x31, 0x0C, 0x50, 0x80, 0x00, 0x0C, 0xF0, 0xD0, 0x02, 0xF1, 0xF0, + 0xAB, 0xD4, 0x00, 0x00, 0x58, 0xC1, 0x08, 0x00, 0x40, 0xA1, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x00, 0x80, 0xD1, 0x81, 0x06, 0xC4, + 0x06, 0x92, 0x06, 0xB3, 0x06, 0x2E, 0x0C, 0x20, 0x80, 0x0B, 0x06, 0x3D, 0x2C, 0x30, 0x00, 0xFA, + 0x0C, 0x40, 0x00, 0x02, 0x06, 0xA6, 0x06, 0x85, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x06, 0x58, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xAB, 0x0C, 0x57, 0x56, 0x66, 0x57, 0x57, 0x98, 0x06, 0x7E, + 0x0C, 0x70, 0x80, 0x0B, 0x66, 0x59, 0xA9, 0x57, 0xCC, 0x01, 0x77, 0x58, 0xA9, 0x57, 0xCE, 0x01, + 0x38, 0x50, 0x14, 0x00, 0x2C, 0xD0, 0x00, 0xFA, 0xA9, 0x57, 0xD0, 0x01, 0x77, 0x58, 0xA9, 0x57, + 0xD2, 0x01, 0x38, 0x5D, 0xC8, 0x01, 0x06, 0x3B, 0x57, 0x38, 0x66, 0x3C, 0x24, 0x51, 0xCC, 0xA0, + 0x32, 0x00, 0xA9, 0x37, 0xC4, 0x01, 0xA9, 0x57, 0xC8, 0x01, 0x77, 0x38, 0x77, 0x58, 0xA9, 0x37, + 0xC6, 0x01, 0xA9, 0x57, 0xCA, 0x01, 0x04, 0x60, 0x92, 0x05, 0xA9, 0x67, 0xC0, 0x01, 0xA9, 0x67, + 0xC2, 0x01, 0x08, 0x20, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, + 0x00, 0x80, 0x2C, 0x40, 0x6C, 0x03, 0x36, 0x42, 0x2C, 0x30, 0x74, 0x7B, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x08, 0x20, 0x00, 0x30, 0x06, 0x3E, 0x0C, 0x30, 0x80, 0x0B, 0x2C, 0x20, 0x00, 0x40, + 0x0B, 0x0D, 0x01, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x18, 0x70, 0xBB, 0x15, 0x1C, 0x50, 0x10, 0x00, 0x56, 0x75, 0xCC, 0x20, 0x32, 0x00, 0x3C, 0x10, + 0x1C, 0x00, 0x64, 0x78, 0xD9, 0xC1, 0x0C, 0x00, 0x99, 0x70, 0xBB, 0x15, 0x08, 0xE0, 0x00, 0x80, + 0x06, 0xD2, 0x2C, 0xE0, 0x00, 0xFA, 0x92, 0x09, 0xB8, 0x7E, 0xC0, 0x01, 0x92, 0x06, 0x0C, 0x20, + 0x78, 0x00, 0xEB, 0x49, 0x00, 0x00, 0xF2, 0x1C, 0xAB, 0x69, 0x00, 0x00, 0x04, 0x21, 0xCB, 0x61, + 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, 0x04, 0x28, + 0x04, 0x34, 0x26, 0x31, 0x06, 0x41, 0x26, 0x21, 0xEB, 0x09, 0x01, 0x00, 0x06, 0x52, 0x38, 0x31, + 0x08, 0x00, 0x30, 0x21, 0x38, 0x41, 0x04, 0x00, 0x06, 0x6D, 0x8B, 0x11, 0x01, 0x00, 0xEB, 0x14, + 0x00, 0x00, 0x38, 0x6E, 0xCC, 0x01, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x04, 0x01, 0x38, 0x6E, + 0xC4, 0x01, 0xB9, 0x67, 0x08, 0x01, 0x0B, 0xE5, 0x00, 0x00, 0xF2, 0x00, 0x98, 0x70, 0xB4, 0x15, + 0x3C, 0x10, 0xA4, 0x04, 0xD9, 0x81, 0x84, 0x04, 0xD9, 0xC1, 0x94, 0x04, 0x06, 0xA2, 0x06, 0x93, + 0x82, 0x72, 0x04, 0xD0, 0x08, 0xB0, 0x00, 0x30, 0x06, 0xED, 0x2C, 0xB0, 0x00, 0x49, 0x04, 0xC0, + 0x0C, 0x40, 0x80, 0x04, 0x06, 0x2D, 0x06, 0x3C, 0x26, 0x41, 0xEB, 0xF1, 0x00, 0x00, 0x86, 0x22, + 0x82, 0x2C, 0xCC, 0x20, 0x08, 0x07, 0x92, 0x06, 0x0C, 0x60, 0xFC, 0x08, 0x0C, 0x50, 0x14, 0x05, + 0xF2, 0x09, 0x23, 0x52, 0x0C, 0x60, 0xF4, 0x01, 0x26, 0x65, 0x3C, 0x50, 0xF4, 0x01, 0x23, 0x66, + 0x23, 0x55, 0x38, 0x21, 0x80, 0x04, 0xC4, 0x91, 0x06, 0x72, 0x57, 0x71, 0x26, 0x7B, 0x30, 0x77, + 0x82, 0x02, 0x67, 0x78, 0x5C, 0x70, 0xFF, 0x0F, 0xC6, 0x75, 0x04, 0x31, 0x22, 0x04, 0xC6, 0x76, + 0x02, 0x0C, 0x04, 0x30, 0x06, 0x4A, 0x6B, 0xF4, 0x00, 0x00, 0x38, 0x61, 0x80, 0x04, 0x2F, 0x7E, + 0x0E, 0x00, 0x26, 0x71, 0xA1, 0x67, 0x24, 0xE1, 0x24, 0xC1, 0xC4, 0xCE, 0x92, 0xCA, 0x24, 0xD1, + 0xCC, 0xD0, 0x16, 0x00, 0x92, 0xC5, 0xC4, 0xE0, 0x82, 0x2E, 0x04, 0x23, 0x4B, 0xC1, 0x00, 0x00, + 0x04, 0x21, 0x0B, 0xB8, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xB7, 0x00, 0x00, 0x34, 0xE1, 0x26, 0xEE, + 0x14, 0xF2, 0x08, 0x50, 0x00, 0x30, 0x26, 0xE1, 0x26, 0xF1, 0x2C, 0x50, 0x00, 0x49, 0x20, 0x4E, + 0x04, 0x2A, 0x06, 0x34, 0x57, 0x31, 0x26, 0x35, 0x30, 0x73, 0x5C, 0x70, 0xFF, 0x0F, 0x26, 0x27, + 0xCC, 0x20, 0xFF, 0x0F, 0x06, 0x62, 0xC2, 0x03, 0x0C, 0x60, 0xFF, 0x0F, 0x34, 0xE2, 0x57, 0x68, + 0xC6, 0xEF, 0x66, 0x67, 0xB1, 0x63, 0x92, 0xEC, 0x18, 0x20, 0xBB, 0x15, 0xB9, 0x41, 0x80, 0x04, + 0x4B, 0xC1, 0x00, 0x00, 0x58, 0xC1, 0x94, 0x04, 0x58, 0x81, 0x84, 0x04, 0x2C, 0x10, 0xA4, 0x04, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x30, 0x0C, 0x70, 0x00, 0x49, 0x0C, 0x40, 0xD0, 0x4D, + 0x26, 0x76, 0x26, 0x46, 0x30, 0x57, 0x04, 0x6A, 0x5C, 0x50, 0xFF, 0x0F, 0x26, 0x65, 0x57, 0x68, + 0x66, 0x65, 0xB1, 0x67, 0x24, 0x74, 0xC6, 0x74, 0x92, 0xF6, 0xE1, 0xF0, 0x98, 0x60, 0xAF, 0x10, + 0x38, 0x70, 0x94, 0x15, 0x18, 0x57, 0x76, 0x00, 0x18, 0x47, 0x75, 0x00, 0x92, 0x09, 0x98, 0x60, + 0xB0, 0x10, 0x82, 0x06, 0x26, 0x76, 0x18, 0x77, 0x92, 0x00, 0x26, 0x47, 0x13, 0x44, 0x98, 0x70, + 0xBA, 0x15, 0x82, 0x03, 0x24, 0x51, 0x13, 0x55, 0x10, 0x72, 0x04, 0x60, 0xC6, 0x76, 0x82, 0x14, + 0xC6, 0x74, 0xA2, 0x12, 0xCC, 0x70, 0x13, 0x00, 0xC2, 0x0B, 0x24, 0x51, 0x06, 0x45, 0x57, 0x41, + 0x57, 0x52, 0x26, 0x54, 0xC6, 0x75, 0x22, 0x08, 0x1C, 0x70, 0x10, 0x00, 0xF2, 0x03, 0x0C, 0x70, + 0x13, 0x00, 0x91, 0x72, 0x04, 0x61, 0x06, 0x26, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x40, 0x00, 0x10, + 0x30, 0x74, 0x18, 0x60, 0x1A, 0x10, 0x08, 0x50, 0x0F, 0x00, 0x2C, 0x50, 0xFF, 0xFF, 0x24, 0x71, + 0x56, 0x75, 0x08, 0x50, 0x00, 0x3C, 0x66, 0x75, 0x06, 0x56, 0x57, 0x5A, 0x08, 0x30, 0xF0, 0x00, + 0x16, 0x66, 0x56, 0x53, 0xF7, 0x6F, 0x66, 0x75, 0x57, 0x6A, 0xB1, 0x74, 0x6C, 0x60, 0x75, 0x00, + 0xD7, 0x7A, 0x66, 0x67, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x00, 0x01, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x80, 0x02, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, 0xB1, 0xF1, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x07, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x0B, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, + 0x0B, 0x2B, 0x01, 0x00, 0x08, 0x70, 0x00, 0x80, 0x18, 0x27, 0x08, 0xDC, 0x2B, 0x15, 0x03, 0x00, + 0xCB, 0xCD, 0x01, 0x00, 0x0C, 0x70, 0x14, 0x00, 0xA9, 0x70, 0x24, 0x10, 0x38, 0x70, 0x94, 0x15, + 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0x6D, 0x12, 0xAB, 0x81, 0x03, 0x00, 0x99, 0x00, 0x62, 0x12, + 0x99, 0x00, 0x63, 0x12, 0x99, 0x00, 0x64, 0x12, 0xAB, 0xB9, 0x01, 0x00, 0x38, 0x70, 0x94, 0x15, + 0x40, 0xE1, 0x18, 0x67, 0xC5, 0x00, 0x99, 0x60, 0x0C, 0x15, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x14, 0x61, 0xB1, 0xF1, 0x99, 0x60, 0x0D, 0x15, 0x4B, 0x18, 0x03, 0x00, 0xCB, 0x33, + 0x02, 0x00, 0xEB, 0x41, 0x01, 0x00, 0xAB, 0x42, 0x01, 0x00, 0x8B, 0x64, 0x03, 0x00, 0x30, 0xF1, + 0x99, 0x00, 0x1B, 0x10, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x38, 0x15, 0x04, 0x30, + 0x0C, 0x40, 0x1C, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x3E, 0x01, 0x00, 0x4B, 0x36, 0x02, 0x00, + 0x4B, 0x09, 0x02, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x05, 0x10, + 0x34, 0x18, 0xC1, 0xE1, 0x82, 0x0A, 0x18, 0x60, 0x2B, 0x13, 0xCC, 0x60, 0xC7, 0x00, 0xD2, 0x2E, + 0x24, 0x61, 0x99, 0x60, 0x2B, 0x13, 0xF2, 0x2A, 0x14, 0x61, 0x99, 0x00, 0x2B, 0x13, 0x99, 0x60, + 0x0D, 0x15, 0x38, 0x60, 0x84, 0x15, 0x06, 0xE7, 0xC4, 0x64, 0xC2, 0x09, 0xAB, 0x42, 0x01, 0x00, + 0xEB, 0x41, 0x01, 0x00, 0x4B, 0x18, 0x03, 0x00, 0x8B, 0x64, 0x03, 0x00, 0x99, 0x00, 0x32, 0x13, + 0x99, 0x00, 0x39, 0x13, 0x14, 0x71, 0x99, 0x70, 0x2F, 0x13, 0x99, 0x70, 0x2E, 0x13, 0x38, 0x70, + 0x80, 0x15, 0x0C, 0x60, 0x14, 0x00, 0xC6, 0x76, 0xD2, 0x03, 0x34, 0x71, 0x13, 0x67, 0x38, 0x70, + 0x84, 0x15, 0xC6, 0x76, 0xC2, 0x03, 0xCB, 0x33, 0x02, 0x00, 0x98, 0x70, 0xBD, 0x15, 0x82, 0x1A, + 0x28, 0x70, 0x06, 0x10, 0x1C, 0x60, 0xE1, 0x00, 0x56, 0x76, 0xA9, 0x70, 0x06, 0x10, 0xAB, 0x31, + 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x8B, 0x33, 0x03, 0x00, 0x8B, 0x64, 0x03, 0x00, 0x38, 0x70, + 0x94, 0x15, 0x99, 0x00, 0x1A, 0x10, 0x18, 0x67, 0x55, 0x00, 0x99, 0x60, 0x6D, 0x12, 0x99, 0x00, + 0x2E, 0x11, 0x38, 0x50, 0x38, 0x15, 0x06, 0x75, 0x18, 0x40, 0x2C, 0x13, 0x77, 0x76, 0x54, 0x7F, + 0xC6, 0x47, 0x32, 0x04, 0x99, 0x70, 0x2C, 0x13, 0xF2, 0x07, 0x06, 0x75, 0xDC, 0x70, 0x00, 0xF0, + 0x92, 0x03, 0x99, 0x00, 0x2C, 0x13, 0x98, 0x70, 0x6E, 0x15, 0x82, 0x0A, 0x18, 0x70, 0x1B, 0x10, + 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x07, 0x24, 0x71, 0x99, 0x70, 0x1B, 0x10, 0xF2, 0x03, 0x99, 0x00, + 0x1B, 0x10, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0xAB, 0x31, 0x01, 0x00, + 0x2B, 0xE7, 0x02, 0x00, 0x4B, 0x0E, 0x03, 0x00, 0x2B, 0x3C, 0x02, 0x00, 0x0B, 0x0B, 0x02, 0x00, + 0x0B, 0x94, 0x01, 0x00, 0xEB, 0x49, 0x01, 0x00, 0x98, 0x70, 0x2A, 0x13, 0x82, 0x07, 0x99, 0x00, + 0x52, 0x15, 0x6B, 0x32, 0x01, 0x00, 0x04, 0x20, 0xF2, 0x1A, 0x38, 0x70, 0x94, 0x15, 0x98, 0x77, + 0xB2, 0x00, 0x92, 0x06, 0x8B, 0xCE, 0x01, 0x00, 0x2B, 0xC2, 0x01, 0x00, 0xF2, 0x05, 0x2B, 0xC2, + 0x01, 0x00, 0x8B, 0xCE, 0x01, 0x00, 0x8B, 0x4B, 0x03, 0x00, 0x8B, 0x33, 0x03, 0x00, 0xAB, 0x2C, + 0x03, 0x00, 0x8B, 0x58, 0x03, 0x00, 0xAB, 0x38, 0x03, 0x00, 0x04, 0x21, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x20, 0x6E, 0x15, 0x18, 0x30, 0x52, 0x15, 0x34, 0x14, 0xB1, 0xF1, + 0xEB, 0x84, 0x03, 0x00, 0xEB, 0x6B, 0x03, 0x00, 0x6B, 0x64, 0x03, 0x00, 0xCB, 0x58, 0x03, 0x00, + 0x6B, 0x61, 0x03, 0x00, 0x6B, 0x32, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0x0C, 0x20, 0x1D, 0x13, 0x04, 0x30, 0x04, 0x45, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x78, 0x12, 0x04, 0x30, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x99, 0x0E, 0x27, 0x03, 0x0C, 0x20, 0xDE, 0x14, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x07, 0x05, 0x0C, 0x20, + 0x38, 0x15, 0x04, 0x30, 0x04, 0x44, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x3C, 0x15, + 0x04, 0x30, 0x0C, 0x40, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0x52, 0x05, + 0xA9, 0x0E, 0x50, 0x05, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, + 0xA6, 0x10, 0x04, 0x30, 0x04, 0x4C, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0x94, 0x15, 0x34, 0x14, 0xB1, 0xF1, + 0x0C, 0x70, 0x00, 0x10, 0x98, 0x57, 0x35, 0x03, 0x28, 0x26, 0x72, 0x00, 0x82, 0x04, 0x28, 0x26, + 0x7A, 0x00, 0xF2, 0x08, 0x98, 0x77, 0x36, 0x03, 0x82, 0x05, 0x28, 0x76, 0x7A, 0x00, 0x26, 0x27, + 0x23, 0x22, 0x06, 0x32, 0xAB, 0x97, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x30, 0x00, 0xD9, 0xC1, 0x20, 0x00, 0x06, 0x73, 0x06, 0xC3, 0xD9, 0x81, 0x10, 0x00, + 0x0C, 0xD0, 0x00, 0x10, 0x04, 0x91, 0x57, 0xC2, 0xD7, 0x71, 0x26, 0xCD, 0xB1, 0x51, 0x26, 0x7D, + 0x26, 0x94, 0x04, 0xB8, 0x04, 0x54, 0x06, 0x62, 0x26, 0xBC, 0x26, 0x57, 0x13, 0x99, 0x2C, 0x70, + 0x3A, 0x01, 0x04, 0x84, 0x0C, 0x20, 0x78, 0x02, 0x06, 0xE3, 0x99, 0x9B, 0x7A, 0x02, 0x06, 0xA4, + 0x06, 0x37, 0x06, 0x48, 0x26, 0x2C, 0xB9, 0x51, 0x0C, 0x00, 0xB9, 0x61, 0x08, 0x00, 0xB9, 0x71, + 0x04, 0x00, 0x6B, 0xCF, 0x03, 0x00, 0x38, 0x71, 0x04, 0x00, 0x0C, 0x20, 0x7C, 0x02, 0x06, 0x48, + 0x26, 0x2C, 0x06, 0x37, 0x6B, 0xCF, 0x03, 0x00, 0x04, 0x71, 0x26, 0x7E, 0x06, 0x47, 0xD7, 0x41, + 0x26, 0x4D, 0x28, 0x44, 0x36, 0x01, 0x26, 0xDA, 0x99, 0x4B, 0x7B, 0x02, 0x30, 0x41, 0x99, 0x4C, + 0x84, 0x02, 0x38, 0x51, 0x0C, 0x00, 0x28, 0x55, 0x34, 0x01, 0xA9, 0x5B, 0x78, 0x02, 0x38, 0x61, + 0x08, 0x00, 0x26, 0xE6, 0x91, 0x9E, 0x99, 0x7D, 0x1D, 0x03, 0x99, 0x0D, 0x18, 0x03, 0x58, 0xC1, + 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0xE8, 0x00, + 0xD9, 0xC1, 0xD8, 0x00, 0x38, 0x70, 0x94, 0x15, 0xD9, 0x81, 0xC8, 0x00, 0x0C, 0x50, 0x75, 0x00, + 0x0C, 0x60, 0x77, 0x00, 0x0C, 0x20, 0x78, 0x00, 0x26, 0x57, 0x26, 0x67, 0x26, 0x27, 0x10, 0x55, + 0x18, 0xE7, 0x76, 0x00, 0x10, 0x66, 0x10, 0x72, 0xB9, 0x51, 0xA4, 0x00, 0x04, 0xB0, 0xB9, 0x61, + 0xA8, 0x00, 0xB9, 0x71, 0xB0, 0x00, 0x0C, 0xA0, 0xD4, 0x12, 0x06, 0x9B, 0x0C, 0x80, 0x00, 0x10, + 0x18, 0x78, 0x28, 0x03, 0x06, 0xD8, 0xC6, 0x97, 0x32, 0x0F, 0x14, 0x72, 0x26, 0x7A, 0x90, 0x77, + 0x82, 0x07, 0x06, 0x2A, 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x02, 0x24, 0xB1, 0x24, 0x91, + 0x2C, 0xA0, 0x10, 0x00, 0xF2, 0xEE, 0xC4, 0xB0, 0x99, 0x08, 0xB0, 0x00, 0x78, 0x38, 0xA6, 0x00, + 0x78, 0x68, 0xAA, 0x00, 0x78, 0x48, 0xA8, 0x00, 0x78, 0x78, 0xAC, 0x00, 0x82, 0x22, 0x3F, 0x66, + 0x03, 0x00, 0xC4, 0x60, 0x38, 0x50, 0x94, 0x15, 0x32, 0x02, 0x16, 0x66, 0x28, 0x35, 0x86, 0x00, + 0x43, 0x66, 0xC6, 0x63, 0x32, 0x16, 0x3F, 0x77, 0x04, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, + 0x28, 0x65, 0x88, 0x00, 0x43, 0x77, 0xC6, 0x76, 0x32, 0x03, 0x04, 0x71, 0xF2, 0x08, 0x28, 0x65, + 0x8A, 0x00, 0xC6, 0x76, 0x32, 0x03, 0x04, 0x72, 0xF2, 0x02, 0x04, 0x73, 0x99, 0x7D, 0xB0, 0x00, + 0x98, 0x7D, 0xAF, 0x00, 0x92, 0x0F, 0x98, 0x7D, 0xB0, 0x00, 0x82, 0x0C, 0x38, 0x60, 0x94, 0x15, + 0x38, 0x51, 0xA4, 0x00, 0x26, 0x76, 0x18, 0x77, 0x92, 0x00, 0x26, 0x75, 0x13, 0x77, 0xB9, 0x71, + 0xA4, 0x00, 0x38, 0x70, 0x94, 0x15, 0x18, 0x6D, 0x2B, 0x03, 0x18, 0x77, 0x92, 0x00, 0xC6, 0x67, + 0xB2, 0x07, 0x98, 0x7D, 0xAE, 0x00, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7D, 0xAF, 0x00, 0x98, 0x70, + 0xBA, 0x15, 0x82, 0x09, 0x38, 0x71, 0xA8, 0x00, 0x24, 0xE1, 0x24, 0x71, 0x13, 0x77, 0x13, 0xEE, + 0xB9, 0x71, 0xA8, 0x00, 0x0C, 0x20, 0x88, 0x00, 0x26, 0x21, 0x04, 0x30, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x7D, 0x06, 0x00, 0xDC, 0x70, 0xE0, 0x04, 0x82, 0x0A, 0x8B, 0x3E, + 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, 0x32, 0x01, 0xFA, 0xC8, 0x02, 0x00, + 0x98, 0x7D, 0x29, 0x03, 0x99, 0x0D, 0x32, 0x01, 0x82, 0x04, 0x34, 0x71, 0x99, 0x7D, 0x29, 0x03, + 0x98, 0x8D, 0x04, 0x00, 0x92, 0x05, 0x98, 0x7D, 0x28, 0x03, 0x8A, 0xB9, 0x02, 0x00, 0x98, 0x3D, + 0x28, 0x03, 0x92, 0x1D, 0x0C, 0x20, 0xC8, 0x12, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x98, 0xED, 0x29, 0x03, 0x9A, 0xAB, 0x02, 0x00, 0xC6, 0xE8, 0x32, 0x0C, 0x0C, 0x20, + 0x88, 0x00, 0x06, 0x3E, 0x06, 0x4E, 0x26, 0x21, 0x0C, 0x50, 0x14, 0x00, 0x8B, 0x44, 0x01, 0x00, + 0x24, 0xE1, 0xF2, 0xF4, 0x99, 0x8D, 0x27, 0x03, 0xFA, 0x9A, 0x02, 0x00, 0x0C, 0x20, 0x78, 0x00, + 0x04, 0x31, 0x26, 0x21, 0x04, 0x46, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x18, 0x3D, 0x28, 0x03, + 0x04, 0x70, 0x06, 0x5D, 0xB9, 0x71, 0x9C, 0x00, 0x06, 0x67, 0xC6, 0x63, 0x32, 0x12, 0x18, 0x45, + 0xD4, 0x02, 0xCC, 0x40, 0x13, 0x00, 0xC2, 0x04, 0x04, 0x21, 0xB9, 0x21, 0x9C, 0x00, 0x34, 0x41, + 0xCC, 0x40, 0x12, 0x00, 0xD2, 0x02, 0x04, 0x71, 0x24, 0x61, 0x2C, 0x50, 0x10, 0x00, 0xF2, 0xEE, + 0xC4, 0x70, 0x82, 0x04, 0x04, 0x50, 0xB9, 0x51, 0x9C, 0x00, 0xCB, 0x42, 0x01, 0x00, 0x38, 0x70, + 0x94, 0x15, 0xB9, 0x21, 0x98, 0x00, 0x18, 0xC7, 0x74, 0x00, 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, + 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, 0x24, 0xE2, 0x06, 0x7E, 0x57, 0x71, 0x57, 0xE2, 0x26, 0x7E, + 0xB9, 0x71, 0xB4, 0x00, 0x04, 0x62, 0x04, 0x70, 0x14, 0x51, 0xB9, 0x21, 0xAC, 0x00, 0xB9, 0x61, + 0x90, 0x00, 0xB9, 0x71, 0xA0, 0x00, 0xB9, 0x51, 0x94, 0x00, 0x38, 0xE1, 0x90, 0x00, 0x06, 0x21, + 0x34, 0xE1, 0x13, 0x6E, 0x14, 0x31, 0x0C, 0x40, 0x78, 0x00, 0xB9, 0x61, 0x90, 0x00, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x00, 0x26, 0x21, 0x14, 0x31, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x61, 0x04, 0xB0, 0xC6, 0xB8, 0x32, 0x65, 0xB8, 0x71, 0x90, 0x00, + 0x38, 0xE1, 0x98, 0x00, 0x92, 0x06, 0xB8, 0x51, 0x9C, 0x00, 0x92, 0x03, 0x38, 0xE1, 0xAC, 0x00, + 0x0C, 0x70, 0x80, 0x00, 0x06, 0x9B, 0x26, 0x71, 0xD7, 0x91, 0x26, 0x7B, 0x26, 0x9D, 0x0C, 0xC0, + 0x00, 0x10, 0x04, 0xA1, 0xB9, 0x71, 0xB8, 0x00, 0x18, 0x7D, 0x28, 0x03, 0x14, 0x51, 0x26, 0x5A, + 0xC6, 0x57, 0x32, 0x45, 0x98, 0x7C, 0xD2, 0x02, 0x82, 0x3E, 0x0C, 0x20, 0xD4, 0x02, 0x26, 0x2C, + 0xB9, 0x61, 0xBC, 0x00, 0xEB, 0x25, 0x01, 0x00, 0x38, 0x51, 0x90, 0x00, 0x38, 0x61, 0xBC, 0x00, + 0xC6, 0x25, 0x92, 0x31, 0x78, 0x2C, 0xCC, 0x02, 0x78, 0x79, 0x3A, 0x01, 0x36, 0x27, 0xC4, 0x20, + 0x32, 0x02, 0x16, 0x22, 0x78, 0x5C, 0xCE, 0x02, 0x78, 0x79, 0x3C, 0x01, 0x3F, 0x77, 0x05, 0x00, + 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x06, 0x32, 0xB9, 0x61, 0xBC, 0x00, 0xB9, 0x71, 0xC0, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0xC0, 0x00, 0x06, 0x52, 0x06, 0x37, 0x06, 0x27, 0xB9, 0x51, + 0xC4, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x38, 0x61, 0xBC, 0x00, 0x26, 0x25, + 0xC6, 0x2E, 0x32, 0x05, 0x38, 0x71, 0xB8, 0x00, 0x06, 0xE2, 0x91, 0xA7, 0x06, 0x7A, 0x57, 0x71, + 0x26, 0x76, 0xB1, 0x27, 0x24, 0xA1, 0x2C, 0xC0, 0x10, 0x00, 0xF2, 0xB7, 0x24, 0xB1, 0x2C, 0x60, + 0x18, 0x00, 0xF2, 0x9B, 0x04, 0x70, 0xC6, 0x78, 0x3A, 0xE9, 0x00, 0x00, 0xB8, 0x61, 0x90, 0x00, + 0x38, 0x51, 0x98, 0x00, 0x92, 0x09, 0xB8, 0x51, 0x9C, 0x00, 0x82, 0x04, 0x38, 0x51, 0x98, 0x00, + 0xF2, 0x03, 0x38, 0x51, 0xAC, 0x00, 0x04, 0x31, 0x04, 0x60, 0x0C, 0x40, 0x88, 0x00, 0x26, 0x41, + 0x26, 0x46, 0x90, 0xF4, 0x92, 0x18, 0x0C, 0x40, 0x80, 0x00, 0x26, 0x41, 0x26, 0x46, 0x60, 0x24, + 0x2F, 0x46, 0x06, 0x00, 0x26, 0x46, 0x26, 0x44, 0x26, 0x42, 0x57, 0x41, 0x26, 0x41, 0x30, 0x44, + 0xC6, 0x45, 0x32, 0x09, 0xC4, 0x40, 0x22, 0x07, 0xC4, 0x20, 0x22, 0x05, 0x06, 0x54, 0xB9, 0x61, + 0x94, 0x00, 0x06, 0x3F, 0x24, 0x61, 0xC6, 0x68, 0x22, 0xE1, 0xC4, 0x30, 0x9A, 0xB4, 0x00, 0x00, + 0x38, 0xE1, 0x94, 0x00, 0x38, 0x61, 0xA0, 0x00, 0x57, 0xE2, 0x24, 0x61, 0x26, 0xED, 0xB9, 0x61, + 0xA0, 0x00, 0x98, 0x6E, 0x82, 0x02, 0x0C, 0xB0, 0x78, 0x02, 0x26, 0xBE, 0x9A, 0xA4, 0x00, 0x00, + 0x38, 0x51, 0x94, 0x00, 0x0C, 0x60, 0x80, 0x00, 0x26, 0x61, 0x26, 0x65, 0x60, 0xC6, 0xB9, 0x71, + 0xC0, 0x00, 0x04, 0x34, 0x26, 0x3C, 0x0C, 0x60, 0x00, 0x10, 0x57, 0x32, 0x26, 0x36, 0x06, 0x2B, + 0x2C, 0x30, 0x78, 0x02, 0x0C, 0x40, 0x10, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x91, + 0x94, 0x00, 0x0C, 0x20, 0x00, 0x10, 0xD7, 0x91, 0x26, 0x92, 0x04, 0x54, 0x26, 0x59, 0x2C, 0x90, + 0x3A, 0x01, 0x06, 0x39, 0x04, 0x44, 0x06, 0x2B, 0xB9, 0x51, 0xC4, 0x00, 0x6B, 0xCF, 0x03, 0x00, + 0x38, 0xA1, 0x94, 0x00, 0x24, 0xA1, 0x06, 0x6A, 0x0C, 0x30, 0x00, 0x10, 0xD7, 0x61, 0x26, 0x63, + 0x28, 0x66, 0x36, 0x01, 0x04, 0x24, 0x99, 0x6E, 0x83, 0x02, 0x26, 0x2B, 0x06, 0x39, 0x04, 0x44, + 0x6B, 0xCF, 0x03, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x28, 0x65, 0x34, 0x01, 0x38, 0x51, 0xA4, 0x00, + 0xA9, 0x6E, 0x80, 0x02, 0x18, 0x6E, 0x84, 0x02, 0x38, 0x71, 0xC0, 0x00, 0xC6, 0x56, 0x22, 0x04, + 0x24, 0x61, 0x99, 0x6E, 0x84, 0x02, 0x18, 0x6E, 0x84, 0x02, 0xCC, 0x60, 0x13, 0x00, 0xC2, 0x09, + 0x38, 0x51, 0xB4, 0x00, 0xC6, 0x65, 0x32, 0x05, 0x2C, 0x60, 0x14, 0x00, 0x99, 0x6E, 0x84, 0x02, + 0x38, 0x21, 0x94, 0x00, 0x18, 0x6E, 0x82, 0x02, 0x18, 0xFD, 0x28, 0x03, 0x0C, 0x50, 0x88, 0x00, + 0x26, 0x51, 0x26, 0x52, 0x91, 0x65, 0x34, 0x61, 0x26, 0x6D, 0x99, 0xA6, 0x1D, 0x03, 0x99, 0x06, + 0x18, 0x03, 0x0C, 0x60, 0x78, 0x00, 0x26, 0x61, 0x26, 0x6C, 0x91, 0x06, 0x57, 0xC1, 0x06, 0x41, + 0x04, 0x60, 0x2F, 0x5C, 0x04, 0x00, 0x14, 0x31, 0xB1, 0x35, 0xB8, 0x51, 0x90, 0x00, 0x38, 0x31, + 0x98, 0x00, 0x92, 0x06, 0xB8, 0x51, 0x9C, 0x00, 0x92, 0x03, 0x38, 0x31, 0xAC, 0x00, 0x0C, 0x50, + 0x88, 0x00, 0x26, 0x51, 0x26, 0x56, 0x90, 0x55, 0x82, 0x07, 0x24, 0x61, 0xC6, 0x68, 0x2C, 0x40, + 0x18, 0x00, 0x22, 0xE8, 0xF2, 0x12, 0x0C, 0xE0, 0x80, 0x00, 0x26, 0xE1, 0x26, 0xE6, 0xC6, 0x5F, + 0x32, 0xF5, 0x24, 0x51, 0x06, 0x25, 0x57, 0x21, 0x26, 0x24, 0xB0, 0x22, 0x22, 0xF9, 0xC6, 0x23, + 0x32, 0xF7, 0x91, 0x5E, 0x06, 0x32, 0xF2, 0xF4, 0x18, 0x6D, 0x28, 0x03, 0x38, 0x51, 0xA0, 0x00, + 0xC6, 0x56, 0x32, 0x04, 0x24, 0x71, 0xFA, 0x18, 0xFF, 0xFF, 0xB8, 0x61, 0x90, 0x00, 0x9A, 0x96, + 0xFE, 0xFF, 0x99, 0x0D, 0x2A, 0x03, 0x0C, 0xA0, 0xD4, 0x12, 0x06, 0xE6, 0x06, 0xB6, 0x06, 0xCD, + 0x18, 0x5D, 0x28, 0x03, 0x38, 0x61, 0x90, 0x00, 0xC6, 0x65, 0x32, 0x10, 0x38, 0x71, 0x90, 0x00, + 0x0C, 0x50, 0x78, 0x00, 0x24, 0x71, 0x26, 0x51, 0x26, 0x57, 0x90, 0x55, 0xB9, 0x71, 0x90, 0x00, + 0x82, 0x76, 0x2F, 0x5B, 0x08, 0x00, 0xC4, 0x54, 0x02, 0x0F, 0x28, 0x7D, 0x06, 0x00, 0x04, 0x64, + 0xD6, 0x67, 0x82, 0x71, 0x38, 0x51, 0xB0, 0x00, 0x14, 0x65, 0x56, 0x76, 0x99, 0x5D, 0x29, 0x03, + 0xA9, 0x7D, 0x06, 0x00, 0xF2, 0x68, 0x14, 0x42, 0x26, 0x4A, 0x10, 0x44, 0x38, 0x61, 0xA8, 0x00, + 0x06, 0x94, 0x34, 0x91, 0xB9, 0x41, 0x94, 0x00, 0x26, 0x9C, 0x0C, 0x40, 0xA0, 0x00, 0x26, 0x49, + 0x18, 0x24, 0x78, 0x02, 0x14, 0x3C, 0xC6, 0x26, 0x26, 0x3A, 0xB2, 0x3C, 0xC4, 0xB4, 0x12, 0x3A, + 0x06, 0x2A, 0xB9, 0x31, 0xBC, 0x00, 0xB9, 0x41, 0xC0, 0x00, 0xB9, 0x51, 0xC4, 0x00, 0xEB, 0x25, + 0x01, 0x00, 0xC4, 0x20, 0x38, 0x31, 0xBC, 0x00, 0x38, 0x41, 0xC0, 0x00, 0x38, 0x51, 0xC4, 0x00, + 0x82, 0x29, 0x18, 0x24, 0x78, 0x02, 0x24, 0xB1, 0x24, 0x21, 0x99, 0x24, 0x78, 0x02, 0x06, 0x25, + 0x57, 0x22, 0x26, 0x2C, 0x2C, 0x20, 0x78, 0x02, 0x0C, 0x40, 0x10, 0x00, 0xB9, 0x51, 0xC4, 0x00, + 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x51, 0xC4, 0x00, 0x38, 0x71, 0x94, 0x00, 0x0C, 0x40, + 0x88, 0x00, 0x26, 0x41, 0x26, 0x45, 0x24, 0x51, 0x99, 0x59, 0x1D, 0x03, 0x98, 0x5C, 0x1A, 0x00, + 0x91, 0x74, 0x04, 0x21, 0x99, 0x2C, 0x2A, 0x03, 0x24, 0xE1, 0x92, 0x19, 0x99, 0x2C, 0x1A, 0x00, + 0xF2, 0x16, 0x06, 0x2A, 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x11, 0x04, 0x31, 0x99, 0x3D, + 0xAE, 0x00, 0x10, 0x5A, 0xCC, 0x50, 0x13, 0x00, 0xC2, 0x0A, 0x18, 0x5C, 0x28, 0x03, 0xC4, 0x51, + 0x92, 0x06, 0x28, 0x5C, 0x06, 0x00, 0x64, 0x54, 0xA9, 0x5C, 0x06, 0x00, 0x2C, 0xA0, 0x10, 0x00, + 0xFA, 0x78, 0xFF, 0xFF, 0x0C, 0xA0, 0x84, 0x12, 0x04, 0xC0, 0x0C, 0xB0, 0x80, 0x0B, 0xC6, 0xC8, + 0x32, 0x4A, 0x0C, 0x70, 0x88, 0x00, 0x26, 0x71, 0x26, 0x7C, 0x90, 0x47, 0x92, 0x36, 0x0C, 0x70, + 0x1D, 0x13, 0xE0, 0x67, 0x92, 0x2E, 0xE8, 0x67, 0x05, 0x00, 0x92, 0x2B, 0x18, 0x3D, 0x28, 0x03, + 0x0C, 0x70, 0x27, 0x00, 0x26, 0x74, 0xD7, 0x71, 0xC4, 0x31, 0x26, 0x7D, 0x18, 0x57, 0x01, 0x00, + 0x10, 0x27, 0x38, 0x70, 0x94, 0x15, 0xC2, 0x04, 0x28, 0x77, 0x26, 0x00, 0xF2, 0x08, 0xC4, 0x30, + 0x82, 0x04, 0x28, 0x77, 0x24, 0x00, 0xF2, 0x03, 0x28, 0x77, 0x22, 0x00, 0x26, 0x55, 0x06, 0x65, + 0xD7, 0x61, 0x36, 0x65, 0x26, 0x62, 0x26, 0x66, 0x26, 0x6B, 0x70, 0x66, 0xC6, 0x67, 0x22, 0x0D, + 0x0C, 0x20, 0x88, 0x00, 0x26, 0x21, 0x06, 0x3C, 0x04, 0x51, 0x8B, 0x44, 0x01, 0x00, 0xF2, 0x05, + 0x24, 0x41, 0xC4, 0x45, 0x24, 0x71, 0x92, 0xCE, 0x98, 0x7D, 0x29, 0x03, 0x82, 0x08, 0x06, 0x2A, + 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, 0x92, 0x03, 0x04, 0x71, 0x91, 0x7A, 0x24, 0xC1, 0x2C, 0xA0, + 0x10, 0x00, 0xF2, 0xB6, 0x26, 0xE8, 0x99, 0xED, 0x27, 0x03, 0xF2, 0x03, 0x99, 0x0D, 0x2A, 0x03, + 0x58, 0xC1, 0xD8, 0x00, 0x58, 0x81, 0xC8, 0x00, 0x2C, 0x10, 0xE8, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x4C, 0x01, 0xD9, 0xC1, 0x3C, 0x01, 0xD9, 0x81, 0x2C, 0x01, + 0x18, 0xE7, 0x46, 0x00, 0x18, 0x97, 0x47, 0x00, 0x0C, 0x70, 0x78, 0x00, 0x26, 0x71, 0x0C, 0xB0, + 0x00, 0x10, 0x06, 0x27, 0x0C, 0x30, 0x78, 0x00, 0xB9, 0x71, 0x24, 0x01, 0xA9, 0x0B, 0x6E, 0x02, + 0xB9, 0x0B, 0x70, 0x02, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x0C, 0x30, 0x78, 0x00, + 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x5E, 0x2F, 0x6E, 0x0E, 0x00, 0x57, 0x52, 0x36, 0x56, + 0x26, 0x6B, 0xB9, 0x61, 0xF8, 0x00, 0x04, 0x6E, 0x36, 0x69, 0x04, 0x8B, 0x26, 0x59, 0xB9, 0x61, + 0x04, 0x01, 0x0C, 0x60, 0x80, 0x02, 0x36, 0x8E, 0x26, 0x55, 0x26, 0x56, 0x26, 0x88, 0x04, 0xA7, + 0x2F, 0x49, 0x09, 0x00, 0x0C, 0x60, 0x16, 0x00, 0x14, 0x71, 0x04, 0xD0, 0x36, 0xA9, 0x26, 0x4B, + 0x36, 0x6E, 0x26, 0x78, 0x26, 0xAA, 0xB9, 0x41, 0x0C, 0x01, 0x06, 0xCD, 0xB9, 0xD1, 0xF4, 0x00, + 0xB9, 0xD1, 0xF0, 0x00, 0xB9, 0x51, 0x10, 0x01, 0xB9, 0x61, 0x08, 0x01, 0xB9, 0x71, 0x14, 0x01, + 0x38, 0x71, 0x04, 0x01, 0xC6, 0x97, 0x3A, 0x93, 0x00, 0x00, 0x38, 0x71, 0x10, 0x01, 0x0C, 0x50, + 0x78, 0x00, 0x26, 0x7D, 0xB9, 0x71, 0xFC, 0x00, 0x38, 0x71, 0x0C, 0x01, 0x04, 0x60, 0x26, 0x7D, + 0x26, 0x51, 0xB9, 0x71, 0x00, 0x01, 0x26, 0x5C, 0x06, 0x76, 0x38, 0x31, 0x08, 0x01, 0x2F, 0x4E, + 0x07, 0x00, 0xC6, 0x43, 0x32, 0x1E, 0x38, 0xF1, 0x00, 0x01, 0x38, 0x41, 0xFC, 0x00, 0x78, 0x2F, + 0xB2, 0x00, 0x38, 0xF1, 0xF8, 0x00, 0x2F, 0x37, 0x07, 0x00, 0x26, 0x3F, 0x26, 0x46, 0x78, 0x33, + 0xEE, 0x00, 0x70, 0x44, 0x26, 0x32, 0x26, 0x43, 0x38, 0x21, 0xF0, 0x00, 0x30, 0x35, 0x26, 0x24, + 0x26, 0x43, 0xB9, 0x21, 0xF0, 0x00, 0xB1, 0x45, 0x24, 0x71, 0x2C, 0x60, 0x1C, 0x00, 0xF2, 0xDE, + 0x0C, 0x70, 0x78, 0x00, 0x26, 0x71, 0x26, 0x7C, 0x30, 0x27, 0xB9, 0x71, 0x24, 0x01, 0x06, 0x38, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x24, 0x01, 0x04, 0x60, 0xB1, 0x27, 0x06, 0x52, 0x06, 0x76, + 0x2F, 0x4C, 0x01, 0x00, 0x38, 0x21, 0x08, 0x01, 0x2F, 0x3E, 0x07, 0x00, 0xC6, 0x32, 0x32, 0x31, + 0x38, 0x31, 0xFC, 0x00, 0x38, 0x21, 0x00, 0x01, 0x26, 0x36, 0x70, 0x33, 0x78, 0xF2, 0xB2, 0x00, + 0x36, 0x35, 0xB9, 0x31, 0x28, 0x01, 0x38, 0x31, 0xF8, 0x00, 0x2F, 0x27, 0x07, 0x00, 0x26, 0x23, + 0x78, 0x22, 0xEE, 0x00, 0xB9, 0x41, 0x20, 0x01, 0xB9, 0x51, 0x18, 0x01, 0x26, 0x2F, 0x38, 0xF1, + 0x28, 0x01, 0xB9, 0x61, 0x1C, 0x01, 0xB9, 0x71, 0x24, 0x01, 0x26, 0x2F, 0x06, 0x32, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x41, 0x20, 0x01, 0x38, 0x71, 0x24, 0x01, 0x38, 0x61, 0x1C, 0x01, 0x30, 0x34, + 0x38, 0x51, 0x18, 0x01, 0x26, 0x23, 0xB1, 0x24, 0x24, 0x71, 0x2C, 0x60, 0x1C, 0x00, 0xF2, 0xCB, + 0x2F, 0x7C, 0x01, 0x00, 0x30, 0x27, 0x38, 0x31, 0x14, 0x01, 0xB9, 0x71, 0x24, 0x01, 0x24, 0x91, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x24, 0x01, 0x24, 0xC4, 0xB1, 0x27, 0x38, 0x71, 0xF4, 0x00, + 0x24, 0xD2, 0x26, 0x72, 0xB9, 0x71, 0xF4, 0x00, 0xFA, 0x6C, 0xFF, 0xFF, 0x38, 0x21, 0xF4, 0x00, + 0x06, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x06, 0x3A, 0x06, 0xD2, 0x06, 0x28, 0xAB, 0x97, 0x00, 0x00, + 0x06, 0x32, 0x38, 0x21, 0xF0, 0x00, 0x04, 0x80, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x7B, 0x70, 0x02, + 0x43, 0x92, 0x06, 0xC2, 0xA9, 0x9B, 0x6E, 0x02, 0xC6, 0x8A, 0x32, 0x11, 0x06, 0x68, 0x57, 0x61, + 0x26, 0x61, 0x30, 0x26, 0xB9, 0x71, 0x24, 0x01, 0x24, 0x81, 0x3F, 0x22, 0x0D, 0x00, 0x06, 0x32, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x24, 0x01, 0x26, 0x72, 0xF2, 0xEF, 0x14, 0x31, 0x06, 0x27, + 0x26, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x31, 0x04, 0x01, 0x06, 0xDB, 0x4B, 0x9E, 0x00, 0x00, + 0x0C, 0x30, 0x16, 0x00, 0x36, 0x3E, 0x4B, 0x9E, 0x00, 0x00, 0x86, 0x22, 0x32, 0x03, 0x2C, 0x20, + 0xFF, 0x03, 0xC4, 0x90, 0x67, 0x25, 0xB9, 0x2D, 0x70, 0x02, 0x92, 0x04, 0x24, 0xC1, 0xA9, 0xCB, + 0x6E, 0x02, 0x58, 0xC1, 0x3C, 0x01, 0x58, 0x81, 0x2C, 0x01, 0x2C, 0x10, 0x4C, 0x01, 0xE1, 0xF0, + 0x3C, 0x10, 0x40, 0x00, 0xD9, 0x81, 0x20, 0x00, 0x38, 0x70, 0x94, 0x15, 0xD9, 0xC1, 0x30, 0x00, + 0x0C, 0xE0, 0x00, 0x10, 0x30, 0xB7, 0x18, 0xC7, 0x56, 0x00, 0x28, 0x7E, 0x06, 0x00, 0x0C, 0x60, + 0x20, 0x00, 0xD6, 0x67, 0x82, 0x09, 0x98, 0x6E, 0x04, 0x00, 0x92, 0x06, 0x1C, 0x40, 0x21, 0x00, + 0x56, 0x74, 0xA9, 0x7E, 0x06, 0x00, 0x28, 0x6E, 0x60, 0x02, 0x18, 0x4E, 0x38, 0x01, 0x18, 0x5E, + 0x39, 0x01, 0xC4, 0x65, 0x28, 0x30, 0xA2, 0x15, 0xC2, 0x06, 0x34, 0x31, 0xA9, 0x30, 0xA2, 0x15, + 0x04, 0x71, 0xF2, 0x0B, 0xCC, 0x30, 0x14, 0x00, 0x02, 0x04, 0xA9, 0x00, 0xA2, 0x15, 0xF2, 0x04, + 0x24, 0x31, 0xA9, 0x30, 0xA2, 0x15, 0x04, 0x70, 0x14, 0x32, 0x26, 0x34, 0xC4, 0x37, 0xD2, 0x19, + 0x14, 0x47, 0x26, 0x45, 0xC4, 0x48, 0xD2, 0x2C, 0xC4, 0x70, 0x82, 0x07, 0x28, 0x5E, 0x06, 0x00, + 0x0C, 0x70, 0x23, 0x00, 0x54, 0x58, 0xF2, 0x08, 0x28, 0x5E, 0x06, 0x00, 0x28, 0x6E, 0x58, 0x02, + 0x54, 0x58, 0x0C, 0x70, 0x34, 0x00, 0xC4, 0x50, 0x82, 0x56, 0x0C, 0x70, 0x50, 0x00, 0xF2, 0x53, + 0xC4, 0x41, 0xC2, 0x03, 0xC4, 0x49, 0xC2, 0x56, 0x34, 0x53, 0xC4, 0x5C, 0xD2, 0x53, 0xC4, 0x70, + 0x82, 0x07, 0x28, 0x5E, 0x06, 0x00, 0x0C, 0x70, 0x96, 0x00, 0x54, 0x58, 0xF2, 0x2A, 0x28, 0x5E, + 0x06, 0x00, 0x28, 0x6E, 0x5A, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x32, 0x00, 0xF2, 0x22, 0xC4, 0x51, + 0xD2, 0x0E, 0xC4, 0x70, 0x82, 0x04, 0xCC, 0x60, 0x46, 0x00, 0xF2, 0x36, 0x28, 0x5E, 0x06, 0x00, + 0x28, 0x6E, 0x5C, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x32, 0x00, 0xF2, 0x29, 0x14, 0x42, 0x26, 0x45, + 0xC4, 0x44, 0xD2, 0x14, 0xC4, 0x70, 0x82, 0x06, 0x28, 0x5E, 0x06, 0x00, 0x04, 0x7F, 0x54, 0x58, + 0xF2, 0x08, 0x28, 0x5E, 0x06, 0x00, 0x28, 0x6E, 0x5C, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x6E, 0x00, + 0xC4, 0x50, 0x82, 0x19, 0x0C, 0x70, 0x3C, 0x00, 0xF2, 0x16, 0xC4, 0x5F, 0xC2, 0x1B, 0xC4, 0x70, + 0x82, 0x07, 0x28, 0x5E, 0x06, 0x00, 0x0C, 0x70, 0x1E, 0x00, 0x54, 0x58, 0xF2, 0x08, 0x28, 0x5E, + 0x06, 0x00, 0x28, 0x6E, 0x5C, 0x02, 0x54, 0x58, 0x0C, 0x70, 0x50, 0x00, 0xC4, 0x50, 0x82, 0x03, + 0x0C, 0x70, 0x46, 0x00, 0xC6, 0x67, 0x02, 0x06, 0x18, 0x7E, 0x04, 0x00, 0xC4, 0x71, 0xCA, 0x80, + 0x01, 0x00, 0x98, 0x7E, 0x63, 0x02, 0x99, 0x0E, 0x62, 0x02, 0x82, 0x05, 0x34, 0x71, 0x99, 0x7E, + 0x63, 0x02, 0xF2, 0x08, 0x28, 0x7E, 0x06, 0x00, 0x1C, 0x60, 0x01, 0x04, 0x56, 0x76, 0xA9, 0x7E, + 0x06, 0x00, 0x0C, 0x70, 0x00, 0x20, 0xD6, 0x7B, 0x8A, 0x91, 0x00, 0x00, 0x18, 0x7E, 0x28, 0x03, + 0x04, 0x91, 0xC4, 0x70, 0x92, 0x05, 0x18, 0x9E, 0x04, 0x00, 0x16, 0x99, 0xF7, 0x9F, 0x0B, 0x81, + 0x01, 0x00, 0x98, 0x8E, 0x04, 0x00, 0x82, 0x40, 0x38, 0xD0, 0x94, 0x15, 0x28, 0x7E, 0x08, 0x00, + 0x28, 0x6D, 0x4C, 0x00, 0xC6, 0x67, 0xC2, 0x38, 0x78, 0x6E, 0x6E, 0x02, 0xB9, 0x71, 0x14, 0x00, + 0x06, 0x57, 0xD7, 0x51, 0x2F, 0x27, 0x07, 0x00, 0x26, 0x25, 0x06, 0x36, 0xB9, 0x61, 0x18, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x5D, 0x4E, 0x00, 0x38, 0x61, 0x18, 0x00, 0x38, 0x71, 0x14, 0x00, + 0xC6, 0x25, 0x32, 0x22, 0x3F, 0x26, 0x07, 0x00, 0x04, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x7D, + 0x4F, 0x00, 0xC6, 0x27, 0x32, 0x19, 0x28, 0x6E, 0x68, 0x02, 0x18, 0x7D, 0x50, 0x00, 0xC6, 0x67, + 0xC2, 0x13, 0x78, 0x7D, 0x52, 0x00, 0x38, 0x6E, 0x70, 0x02, 0xC6, 0x67, 0x32, 0x0D, 0x98, 0x70, + 0xBA, 0x15, 0x92, 0x0A, 0x98, 0x7E, 0x2E, 0x01, 0x92, 0x07, 0x28, 0x7E, 0x74, 0x02, 0xCC, 0x70, + 0x13, 0x00, 0xCA, 0x39, 0x01, 0x00, 0x38, 0x60, 0x94, 0x15, 0x38, 0x5E, 0x70, 0x02, 0x18, 0x76, + 0x54, 0x00, 0xC6, 0x57, 0x22, 0x13, 0xC4, 0x80, 0x82, 0x11, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, + 0x80, 0x00, 0x92, 0x0C, 0x18, 0x7E, 0x6D, 0x02, 0x18, 0x66, 0x57, 0x00, 0xC6, 0x67, 0xC2, 0x06, + 0xC6, 0x7C, 0xC2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x6D, 0x02, 0x18, 0x7E, 0x6D, 0x02, 0xC6, 0x7C, + 0x28, 0x7E, 0x06, 0x00, 0xD2, 0x0C, 0xC4, 0x91, 0x92, 0x0A, 0x6C, 0x70, 0x80, 0x00, 0xA9, 0x7E, + 0x06, 0x00, 0x38, 0x70, 0x94, 0x15, 0x18, 0x77, 0x58, 0x00, 0xF2, 0x16, 0x0C, 0x60, 0x80, 0x00, + 0xD6, 0x67, 0x82, 0x14, 0x98, 0x6E, 0x6C, 0x02, 0x92, 0x0D, 0x1C, 0x80, 0x81, 0x00, 0x56, 0x78, + 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, 0x94, 0x15, 0x18, 0x77, 0x55, 0x00, 0x99, 0x7E, 0x6D, 0x02, + 0xF2, 0x05, 0x06, 0x76, 0x34, 0x71, 0x99, 0x7E, 0x6C, 0x02, 0x98, 0x5E, 0x04, 0x00, 0x8A, 0x04, + 0x01, 0x00, 0x38, 0x20, 0x94, 0x15, 0x28, 0x3E, 0x06, 0x00, 0x0C, 0x40, 0x60, 0x00, 0x26, 0x42, + 0x10, 0x44, 0x18, 0x62, 0x5F, 0x00, 0x18, 0x72, 0x61, 0x00, 0xB9, 0x41, 0x04, 0x00, 0x0C, 0x40, + 0x10, 0x00, 0xD6, 0x43, 0x82, 0x07, 0xC6, 0x67, 0xC2, 0x04, 0x36, 0x67, 0x13, 0x66, 0xF2, 0x02, + 0x04, 0x61, 0x0C, 0x70, 0x18, 0x02, 0x26, 0x7E, 0x20, 0x77, 0xB1, 0x51, 0x04, 0x82, 0x04, 0x50, + 0x56, 0x8B, 0xB9, 0x71, 0x08, 0x00, 0x54, 0xB4, 0x0C, 0x70, 0xEC, 0x11, 0x06, 0xD5, 0x06, 0xC5, + 0xB9, 0x81, 0x0C, 0x00, 0xB9, 0xB1, 0x10, 0x00, 0xA8, 0x47, 0x04, 0x00, 0x82, 0x5B, 0x38, 0xA1, + 0x0C, 0x00, 0x04, 0xB0, 0xC6, 0xAB, 0x82, 0x09, 0x38, 0xF1, 0x04, 0x00, 0xC6, 0x4F, 0xC2, 0x05, + 0xB1, 0xB1, 0x6C, 0x30, 0x20, 0x00, 0x04, 0xB1, 0xB8, 0x81, 0x10, 0x00, 0x82, 0x4B, 0xC4, 0xB0, + 0x92, 0x49, 0xC6, 0x46, 0xA2, 0x47, 0x18, 0x42, 0x5E, 0x00, 0x38, 0xA1, 0x08, 0x00, 0xC6, 0x4A, + 0xB2, 0x41, 0x18, 0x47, 0x06, 0x00, 0x2F, 0xF4, 0x04, 0x00, 0x26, 0xF4, 0x26, 0xFF, 0x26, 0xFE, + 0xE8, 0x9F, 0x1A, 0x02, 0x02, 0x37, 0x06, 0xA5, 0x63, 0xA4, 0xD4, 0xA1, 0x92, 0x33, 0x70, 0x87, + 0x18, 0xAF, 0x1B, 0x02, 0xB9, 0x81, 0x1C, 0x00, 0x0C, 0x80, 0x00, 0x10, 0xD7, 0xA1, 0x26, 0xA8, + 0x38, 0x81, 0x1C, 0x00, 0xA9, 0x8A, 0x3A, 0x01, 0x78, 0x87, 0x02, 0x00, 0xA9, 0x8A, 0x3C, 0x01, + 0x04, 0xA1, 0x53, 0xA4, 0x06, 0x4A, 0x66, 0x45, 0x23, 0x54, 0x04, 0x42, 0x26, 0x4B, 0x13, 0x44, + 0x26, 0x4F, 0x18, 0xA4, 0x1A, 0x02, 0x24, 0xB1, 0x06, 0x4A, 0xD7, 0x41, 0x26, 0x4E, 0xA9, 0x04, + 0x3A, 0x01, 0xA9, 0x04, 0x3C, 0x01, 0x04, 0x41, 0x26, 0x4A, 0xD7, 0x41, 0x26, 0x4E, 0xA9, 0x04, + 0x36, 0x01, 0xC6, 0x9B, 0x04, 0x41, 0x53, 0x4A, 0x66, 0x4D, 0x23, 0xD4, 0x92, 0xE7, 0x26, 0xC9, + 0x23, 0xCC, 0x24, 0x78, 0x0C, 0xF0, 0x14, 0x12, 0xC6, 0x7F, 0x92, 0x9F, 0x30, 0x41, 0xA9, 0x3E, + 0x06, 0x00, 0xC4, 0xC0, 0x99, 0x4E, 0x04, 0x00, 0x82, 0x6A, 0x0C, 0xA0, 0x00, 0x10, 0x2C, 0xA0, + 0x38, 0x01, 0x04, 0x68, 0x26, 0x6A, 0x04, 0xB0, 0xB9, 0x61, 0x04, 0x00, 0x18, 0x7E, 0x04, 0x00, + 0xC6, 0xB7, 0x32, 0x2B, 0x06, 0x7D, 0x63, 0x7B, 0xD4, 0x71, 0x82, 0x25, 0x06, 0x7B, 0xD7, 0x71, + 0x06, 0x8B, 0xB1, 0x71, 0x04, 0x90, 0x18, 0x5E, 0x04, 0x00, 0xC6, 0x85, 0xB2, 0x1A, 0xC4, 0x84, + 0x92, 0x09, 0x0C, 0x20, 0x58, 0x11, 0x04, 0x30, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0xF2, 0x0D, 0x30, 0x21, 0x38, 0x31, 0x04, 0x00, 0x30, 0x61, 0x26, 0x2A, 0x26, 0x36, 0x26, 0x29, + 0x26, 0x39, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x24, 0x81, 0x24, 0x98, 0xF2, 0xE4, + 0xF7, 0xD0, 0x34, 0xB1, 0x24, 0xB1, 0xF2, 0xD3, 0x3F, 0xCC, 0x07, 0x00, 0x28, 0x7E, 0x06, 0x00, + 0x99, 0xCE, 0x04, 0x00, 0x6C, 0x70, 0x10, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0xF2, 0x2D, 0x28, 0x7E, + 0x06, 0x00, 0x0C, 0x60, 0x00, 0x04, 0x66, 0x67, 0xA9, 0x6E, 0x06, 0x00, 0x04, 0x68, 0xD6, 0x67, + 0x0C, 0x70, 0x28, 0x00, 0x82, 0x03, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x63, 0x02, 0x18, 0x7E, + 0x62, 0x02, 0xCC, 0x70, 0x13, 0x00, 0x1A, 0x7E, 0xFE, 0xFF, 0x24, 0x71, 0x99, 0x7E, 0x62, 0x02, + 0xFA, 0x79, 0xFE, 0xFF, 0x98, 0x7E, 0x6D, 0x02, 0x8A, 0xE1, 0xFE, 0xFF, 0x18, 0x6D, 0x59, 0x00, + 0xC6, 0x67, 0xAA, 0xDC, 0xFE, 0xFF, 0x34, 0x71, 0xFA, 0xD7, 0xFE, 0xFF, 0x1C, 0x70, 0x11, 0x00, + 0x56, 0x37, 0xA9, 0x3E, 0x06, 0x00, 0x58, 0xC1, 0x30, 0x00, 0x58, 0x81, 0x20, 0x00, 0x2C, 0x10, + 0x40, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x02, 0x00, + 0xD1, 0x81, 0x0C, 0xC0, 0x26, 0x10, 0x04, 0xE0, 0x2C, 0xD0, 0x00, 0x76, 0x06, 0x2E, 0x04, 0x3C, + 0x4B, 0x9E, 0x00, 0x00, 0x2C, 0xE0, 0x00, 0x2D, 0xC6, 0xED, 0x2C, 0x20, 0xE0, 0x01, 0xA1, 0x2C, + 0x24, 0xC2, 0x92, 0xF5, 0x08, 0xD0, 0x06, 0x00, 0x0C, 0xC0, 0x66, 0x10, 0x04, 0xE0, 0x2C, 0xD0, + 0x24, 0xDF, 0x06, 0x2E, 0x0C, 0x30, 0x14, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x2C, 0xE0, 0xF6, 0x4F, + 0xC6, 0xED, 0x2C, 0x20, 0xFF, 0x01, 0xA1, 0x2C, 0x24, 0xC2, 0x92, 0xF4, 0x08, 0xD0, 0x00, 0x80, + 0x0C, 0xC0, 0x00, 0x10, 0x0C, 0x90, 0xBA, 0x04, 0x0C, 0xE0, 0xAA, 0x14, 0x2C, 0xD0, 0x3E, 0xDC, + 0x26, 0x9C, 0x18, 0x7D, 0x05, 0x00, 0x1C, 0x20, 0xE0, 0x01, 0x2C, 0x70, 0x12, 0x00, 0x26, 0x77, + 0x26, 0x7C, 0x28, 0xA7, 0x02, 0x00, 0x04, 0x3A, 0x26, 0x2A, 0x0B, 0x9B, 0x00, 0x00, 0x10, 0x7D, + 0xA9, 0x2E, 0x04, 0x00, 0x1C, 0x20, 0xFF, 0x01, 0x2C, 0x70, 0x32, 0x00, 0x26, 0x77, 0x26, 0x7C, + 0x28, 0xB7, 0x02, 0x00, 0x04, 0x3A, 0x26, 0x2B, 0x0B, 0x9B, 0x00, 0x00, 0xA1, 0x2E, 0x0C, 0x20, + 0xE0, 0x01, 0x04, 0x3A, 0x26, 0x2A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2E, 0x06, 0x00, 0x0C, 0x20, + 0xFF, 0x01, 0x26, 0x2B, 0x04, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0x24, 0xE8, + 0xC6, 0xE9, 0x24, 0xD1, 0x92, 0xCF, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0x94, 0x15, 0x06, 0x72, 0x28, 0x66, 0xB0, 0x00, 0xC4, 0x70, + 0x13, 0x56, 0x32, 0x02, 0x16, 0x27, 0xC6, 0x25, 0x02, 0x0B, 0xC6, 0x75, 0x0C, 0x40, 0xFF, 0x00, + 0x56, 0x46, 0x02, 0x04, 0x3F, 0x44, 0x03, 0x00, 0xF2, 0x02, 0x26, 0x43, 0x23, 0x44, 0x06, 0x24, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x24, 0x00, 0xD9, 0xC1, 0x14, 0x00, + 0xD9, 0x81, 0x04, 0x00, 0x30, 0x77, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x41, 0x0C, 0xC0, 0x00, 0x10, + 0x98, 0x9C, 0x27, 0x03, 0x82, 0x3C, 0x98, 0x8C, 0x28, 0x03, 0x82, 0x39, 0x0C, 0xE0, 0x78, 0x12, + 0x04, 0xD0, 0xC6, 0xD9, 0x32, 0x34, 0x06, 0x6A, 0x0C, 0x60, 0xD2, 0x12, 0x04, 0x70, 0xC6, 0x78, + 0x32, 0x2A, 0x2C, 0x60, 0x10, 0x00, 0x1C, 0x50, 0x10, 0x00, 0x26, 0x56, 0x18, 0x4E, 0x0A, 0x00, + 0x10, 0x55, 0xC6, 0x45, 0x92, 0x1E, 0x24, 0x75, 0x57, 0x72, 0x26, 0x7C, 0x78, 0x47, 0x78, 0x02, + 0x78, 0xB7, 0x7A, 0x02, 0x70, 0x3E, 0x78, 0x7E, 0x02, 0x00, 0x3F, 0x24, 0x03, 0x00, 0x36, 0x7B, + 0x23, 0x33, 0x23, 0x44, 0xB1, 0x71, 0xAB, 0xC0, 0x01, 0x00, 0xA1, 0x2E, 0x30, 0x71, 0x28, 0x3E, + 0x02, 0x00, 0x06, 0x27, 0x23, 0x4B, 0xAB, 0xC0, 0x01, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0xF2, 0x03, + 0x24, 0x71, 0xF2, 0xD6, 0x24, 0xD1, 0x2C, 0xE0, 0x10, 0x00, 0xF2, 0xCC, 0x58, 0xC1, 0x14, 0x00, + 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC6, 0x34, 0x3C, 0x10, + 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x06, 0xE2, 0x78, 0xA1, 0x20, 0x00, 0x78, 0xC1, + 0x24, 0x00, 0x78, 0xD1, 0x28, 0x00, 0x32, 0x05, 0xA1, 0xC2, 0xA9, 0xD2, 0x02, 0x00, 0xF2, 0x20, + 0xC6, 0x35, 0x22, 0x05, 0xA1, 0x62, 0xA9, 0xA2, 0x02, 0x00, 0xF2, 0x1A, 0x3F, 0x94, 0x03, 0x00, + 0x06, 0x29, 0x3F, 0x3C, 0x06, 0x00, 0x3F, 0xB4, 0x05, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3B, + 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x2C, 0xA1, 0x2E, 0x3F, 0x3D, 0x0A, 0x00, 0x06, 0x29, 0xAB, 0x97, + 0x00, 0x00, 0x06, 0x3B, 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x2D, 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x2F, 0x72, 0x02, 0x00, + 0x26, 0x72, 0x06, 0x67, 0x57, 0x62, 0x26, 0x76, 0x26, 0x27, 0x0C, 0x70, 0x00, 0x10, 0x2C, 0x20, + 0x3C, 0x03, 0x26, 0x27, 0x06, 0x72, 0x04, 0x69, 0x34, 0x61, 0xC4, 0x60, 0xA9, 0x07, 0x24, 0x00, + 0xA9, 0x07, 0x26, 0x00, 0x34, 0x74, 0x92, 0xF9, 0x04, 0x71, 0x99, 0x72, 0x28, 0x00, 0x38, 0x70, + 0x94, 0x15, 0xA9, 0x02, 0x2A, 0x00, 0x18, 0x77, 0x98, 0x00, 0x99, 0x02, 0x2D, 0x00, 0xA9, 0x02, + 0x32, 0x00, 0x99, 0x72, 0x2C, 0x00, 0x14, 0x71, 0xA9, 0x02, 0x30, 0x00, 0xA9, 0x02, 0x2E, 0x00, + 0xA1, 0x72, 0xA9, 0x72, 0x02, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, + 0xEB, 0xCA, 0x01, 0x00, 0x24, 0xE1, 0xC4, 0xE5, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x38, 0x70, 0x94, 0x15, 0x3C, 0x10, 0x8C, 0x00, 0x0C, 0x60, 0xAE, 0x00, 0xD9, 0xC1, 0x7C, 0x00, + 0xD9, 0x81, 0x6C, 0x00, 0x26, 0x67, 0x10, 0x66, 0xB9, 0x61, 0x3C, 0x00, 0x30, 0x67, 0xD4, 0x68, + 0x8A, 0x95, 0x03, 0x00, 0x18, 0xB7, 0x96, 0x00, 0x06, 0xD7, 0x04, 0xE0, 0x28, 0x2D, 0x9A, 0x00, + 0x04, 0xCC, 0x26, 0xC1, 0x06, 0x3B, 0xAB, 0x97, 0x00, 0x00, 0x26, 0xCE, 0x24, 0xE4, 0xCC, 0xE0, + 0x28, 0x00, 0xB1, 0x2C, 0x24, 0xD2, 0x92, 0xF3, 0x0C, 0xD0, 0x00, 0x10, 0x98, 0x7D, 0x27, 0x03, + 0x92, 0x05, 0xCB, 0xCD, 0x01, 0x00, 0xFA, 0x7A, 0x03, 0x00, 0x04, 0x70, 0x06, 0xED, 0xB9, 0x71, + 0x38, 0x00, 0x38, 0x71, 0x38, 0x00, 0x26, 0x7D, 0xE8, 0xA7, 0x1D, 0x03, 0x82, 0x15, 0x0C, 0x60, + 0x94, 0x15, 0x30, 0x76, 0x34, 0xA1, 0x98, 0x77, 0xAF, 0x00, 0x57, 0xA2, 0x26, 0xAD, 0x0C, 0xB0, + 0x78, 0x02, 0x26, 0xBA, 0x9A, 0xD3, 0x00, 0x00, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x25, 0x01, 0x00, + 0xC4, 0x20, 0x9A, 0xCC, 0x00, 0x00, 0x38, 0x21, 0x38, 0x00, 0xEB, 0xCA, 0x01, 0x00, 0x38, 0x71, + 0x38, 0x00, 0x2C, 0xE0, 0x34, 0x00, 0x24, 0x71, 0xC4, 0x75, 0xB9, 0x71, 0x38, 0x00, 0x92, 0xDA, + 0x18, 0x6D, 0x82, 0x02, 0x99, 0x0D, 0x37, 0x03, 0x34, 0x61, 0x2F, 0x76, 0x06, 0x00, 0x26, 0x76, + 0x06, 0x57, 0x57, 0x52, 0x26, 0x75, 0x26, 0x76, 0x2C, 0x70, 0x3C, 0x03, 0x26, 0x7D, 0x78, 0x57, + 0x08, 0x00, 0x78, 0x67, 0x04, 0x00, 0x36, 0x65, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0xCC, 0x60, + 0x40, 0x01, 0x02, 0x06, 0xC4, 0x50, 0x82, 0x04, 0x04, 0x61, 0x99, 0x6D, 0x37, 0x03, 0x18, 0x6D, + 0x27, 0x03, 0xC4, 0x61, 0x9A, 0x87, 0x00, 0x00, 0x98, 0x6D, 0x28, 0x03, 0x8A, 0x1E, 0x03, 0x00, + 0xF8, 0x67, 0x08, 0x00, 0x8A, 0x1A, 0x03, 0x00, 0xF8, 0x57, 0x0A, 0x00, 0x8A, 0x16, 0x03, 0x00, + 0xF8, 0x57, 0x04, 0x00, 0x8A, 0x12, 0x03, 0x00, 0xF8, 0x47, 0x06, 0x00, 0x8A, 0x0E, 0x03, 0x00, + 0x3F, 0x66, 0x05, 0x00, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, 0x38, 0x30, 0x94, 0x15, 0x28, 0x53, + 0x7C, 0x00, 0xC6, 0x65, 0x02, 0x1E, 0x18, 0x4D, 0x34, 0x03, 0x04, 0x61, 0x5C, 0x40, 0xFC, 0x00, + 0x99, 0x4D, 0x34, 0x03, 0x99, 0x6D, 0x32, 0x03, 0x78, 0xF7, 0x04, 0x00, 0x78, 0x27, 0x08, 0x00, + 0xC6, 0xF2, 0x02, 0x07, 0x64, 0x41, 0x99, 0x4D, 0x34, 0x03, 0x04, 0x61, 0x04, 0x50, 0xF2, 0x10, + 0xC6, 0xF2, 0x04, 0x61, 0x04, 0x50, 0x32, 0x0C, 0x64, 0x42, 0x99, 0x4D, 0x34, 0x03, 0xF2, 0x08, + 0xCC, 0x60, 0x10, 0x00, 0x04, 0x51, 0x12, 0x02, 0x04, 0x50, 0x13, 0x55, 0x04, 0x60, 0x78, 0x27, + 0x06, 0x00, 0x78, 0x47, 0x0A, 0x00, 0x3F, 0x44, 0x02, 0x00, 0xC4, 0x40, 0x32, 0x02, 0x16, 0x44, + 0x28, 0x33, 0x7C, 0x00, 0xC6, 0x43, 0x02, 0x1A, 0x18, 0x4D, 0x34, 0x03, 0x04, 0x31, 0x5C, 0x40, + 0xF3, 0x00, 0x99, 0x4D, 0x34, 0x03, 0x99, 0x3D, 0x32, 0x03, 0x78, 0x37, 0x06, 0x00, 0x78, 0x77, + 0x0A, 0x00, 0xC6, 0x37, 0x02, 0x03, 0x64, 0x44, 0xF2, 0x04, 0xC6, 0x37, 0x32, 0x04, 0x64, 0x48, + 0x99, 0x4D, 0x34, 0x03, 0x24, 0x61, 0x13, 0x66, 0xF2, 0x06, 0xCC, 0x40, 0x10, 0x00, 0x02, 0x03, + 0x24, 0x51, 0x13, 0x55, 0x98, 0x7D, 0x35, 0x03, 0x92, 0x11, 0xC4, 0x52, 0x92, 0x0C, 0x18, 0x7D, + 0x33, 0x03, 0xCC, 0x70, 0xFF, 0x00, 0x8A, 0xA9, 0x02, 0x00, 0x24, 0x71, 0x99, 0x7D, 0x33, 0x03, + 0xFA, 0xA4, 0x02, 0x00, 0xC4, 0x60, 0x8A, 0xA1, 0x02, 0x00, 0x99, 0x0D, 0x33, 0x03, 0xFA, 0x9D, + 0x02, 0x00, 0xC4, 0x62, 0x9A, 0xA3, 0x02, 0x00, 0x0C, 0x70, 0xA6, 0x00, 0x26, 0x7D, 0x0C, 0x30, + 0x78, 0x02, 0x06, 0x27, 0x26, 0x3D, 0x04, 0x44, 0x6B, 0xCF, 0x03, 0x00, 0x06, 0x72, 0x04, 0x24, + 0x26, 0x27, 0x0C, 0x30, 0x88, 0x02, 0xFA, 0x8E, 0x02, 0x00, 0x78, 0x7A, 0x78, 0x02, 0xCC, 0x70, + 0x7F, 0x04, 0x1A, 0x36, 0xFF, 0xFF, 0x78, 0x7A, 0x7A, 0x02, 0xCC, 0x70, 0xFE, 0x07, 0x1A, 0x30, + 0xFF, 0xFF, 0x0C, 0xC0, 0x3C, 0x03, 0x26, 0xCE, 0x06, 0x7C, 0x04, 0x68, 0x28, 0x57, 0x20, 0x00, + 0x34, 0x61, 0xA9, 0x57, 0x24, 0x00, 0x28, 0x57, 0x22, 0x00, 0xC4, 0x60, 0xA9, 0x57, 0x26, 0x00, + 0x34, 0x74, 0x92, 0xF5, 0x0C, 0x20, 0x40, 0x03, 0x06, 0x3B, 0x26, 0x2E, 0x04, 0x44, 0x6B, 0xCF, + 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, 0x30, 0x01, 0x18, 0x7E, 0x64, 0x03, 0x78, 0x2E, 0x40, 0x03, + 0x78, 0x3E, 0x44, 0x03, 0xC4, 0x71, 0xC2, 0x12, 0x3F, 0x73, 0x02, 0x00, 0xC4, 0x70, 0x32, 0x02, + 0x16, 0x77, 0x43, 0x67, 0x78, 0x5E, 0x42, 0x03, 0x78, 0x7E, 0x46, 0x03, 0x3F, 0x77, 0x05, 0x00, + 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x43, 0x87, 0xF2, 0x04, 0x0C, 0x80, 0xA0, 0x00, 0x06, 0x68, + 0xB9, 0x61, 0x68, 0x00, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0x06, 0x92, 0x78, 0x3E, 0x46, 0x03, + 0x78, 0x2E, 0x42, 0x03, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0x78, 0x3E, 0x48, 0x03, 0xB9, 0x21, + 0x34, 0x00, 0x06, 0x29, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x40, 0x00, 0x78, 0x3E, + 0x4A, 0x03, 0x38, 0x21, 0x34, 0x00, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x44, 0x00, + 0x78, 0x3E, 0x4C, 0x03, 0x78, 0x4E, 0x50, 0x03, 0x38, 0x21, 0x40, 0x00, 0x0C, 0xF0, 0xD8, 0x00, + 0xF1, 0xF0, 0xB9, 0x21, 0x48, 0x00, 0x78, 0x3E, 0x4E, 0x03, 0x78, 0x4E, 0x52, 0x03, 0x38, 0x21, + 0x44, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x4C, 0x00, 0x78, 0x3E, 0x54, 0x03, + 0x78, 0x4E, 0x58, 0x03, 0x38, 0x21, 0x48, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0x50, 0x00, 0x78, 0x3E, 0x56, 0x03, 0x78, 0x4E, 0x5A, 0x03, 0x38, 0x21, 0x4C, 0x00, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x54, 0x00, 0x78, 0x3E, 0x5C, 0x03, 0x78, 0x4E, 0x60, 0x03, + 0x38, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x58, 0x00, 0x78, 0x3E, + 0x5E, 0x03, 0x78, 0x4E, 0x62, 0x03, 0x38, 0x21, 0x54, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0x38, 0x61, 0x68, 0x00, 0xB9, 0x21, 0x5C, 0x00, 0x06, 0x38, 0x06, 0x26, 0x0C, 0xF0, 0x80, 0x00, + 0xF1, 0xF0, 0x99, 0x20, 0xB7, 0x15, 0x28, 0x7E, 0x6C, 0x03, 0x04, 0x31, 0xA9, 0x7E, 0x6E, 0x03, + 0x28, 0x7E, 0x6A, 0x03, 0xA9, 0x2E, 0x6A, 0x03, 0xA9, 0x7E, 0x6C, 0x03, 0x18, 0x7E, 0x69, 0x03, + 0x26, 0x37, 0x26, 0x77, 0x2F, 0x63, 0x03, 0x00, 0x26, 0xC7, 0x04, 0x70, 0x16, 0x66, 0x06, 0x27, + 0x2F, 0x57, 0x0C, 0x00, 0x34, 0x72, 0x78, 0x55, 0x2E, 0x00, 0xC6, 0x76, 0x26, 0x25, 0x92, 0xF9, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x10, 0x00, 0x06, 0xC2, 0xB9, 0x71, 0x60, 0x00, 0x38, 0x61, + 0x60, 0x00, 0x04, 0x71, 0xC6, 0x26, 0x02, 0x11, 0x38, 0x61, 0x18, 0x00, 0x04, 0x72, 0xC6, 0x26, + 0x02, 0x0C, 0x38, 0x61, 0x20, 0x00, 0x04, 0x73, 0xC6, 0x26, 0x02, 0x07, 0x38, 0x61, 0x28, 0x00, + 0x04, 0x75, 0xC6, 0x26, 0x12, 0x02, 0x04, 0x74, 0x18, 0x6E, 0x68, 0x03, 0x3F, 0x36, 0x07, 0x00, + 0x0C, 0x70, 0x94, 0x15, 0x30, 0x47, 0x78, 0x7E, 0x66, 0x03, 0x18, 0x24, 0x97, 0x00, 0xC4, 0x30, + 0x16, 0x52, 0x02, 0x04, 0xC6, 0x72, 0x92, 0x0F, 0xF2, 0x05, 0xC4, 0x30, 0x82, 0x06, 0xC6, 0x75, + 0x92, 0x06, 0xA9, 0x0E, 0x66, 0x03, 0xF2, 0x0A, 0xC4, 0x70, 0x02, 0x03, 0x34, 0x71, 0xF2, 0x04, + 0xC4, 0x70, 0x82, 0x04, 0x24, 0x71, 0xA9, 0x7E, 0x66, 0x03, 0x78, 0x7E, 0x66, 0x03, 0x18, 0x44, + 0x97, 0x00, 0xC6, 0x74, 0x92, 0x05, 0xC4, 0x64, 0xD2, 0x03, 0x24, 0x61, 0xF2, 0x0E, 0x28, 0x4D, + 0x06, 0x00, 0xD4, 0x48, 0x82, 0x05, 0xC6, 0x75, 0x92, 0x0A, 0xC4, 0x61, 0xF2, 0x04, 0xC6, 0x75, + 0x92, 0x06, 0xC4, 0x63, 0xC2, 0x04, 0x34, 0x61, 0x99, 0x6E, 0x68, 0x03, 0x18, 0x5E, 0x64, 0x03, + 0x38, 0x21, 0x58, 0x00, 0x06, 0x35, 0xB9, 0x51, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x51, + 0x64, 0x00, 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, 0x06, 0x35, 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x4E, + 0x68, 0x03, 0x38, 0x51, 0x64, 0x00, 0xC4, 0x41, 0x43, 0x72, 0x92, 0x35, 0xC4, 0x58, 0xC2, 0x0E, + 0x38, 0x21, 0x58, 0x00, 0x04, 0x39, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, + 0x04, 0x39, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x56, 0xC2, 0x15, 0x38, 0x21, + 0x50, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x37, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, + 0x54, 0x00, 0x04, 0x37, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, + 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, + 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x0C, 0x00, 0x38, 0x51, 0x60, 0x00, + 0xFA, 0x9C, 0x00, 0x00, 0xC4, 0x42, 0x92, 0x34, 0xC4, 0x56, 0xC2, 0x0E, 0x38, 0x21, 0x50, 0x00, + 0x04, 0x37, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x54, 0x00, 0x04, 0x37, 0x4B, 0x9E, + 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x54, 0xC2, 0x15, 0x38, 0x21, 0x48, 0x00, 0xB9, 0x71, + 0x64, 0x00, 0x04, 0x35, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, + 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, + 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x14, 0x00, 0x38, 0x51, 0x18, 0x00, 0xF2, 0x66, 0xC4, 0x43, + 0x92, 0x34, 0xC4, 0x54, 0xC2, 0x0E, 0x38, 0x21, 0x48, 0x00, 0x04, 0x35, 0x4B, 0x9E, 0x00, 0x00, + 0x43, 0x82, 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, + 0xC4, 0x52, 0xC2, 0x15, 0x38, 0x21, 0x40, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x33, 0x4B, 0x9E, + 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x44, 0x00, 0x04, 0x33, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, + 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, + 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, + 0x1C, 0x00, 0x38, 0x51, 0x20, 0x00, 0xF2, 0x31, 0xC4, 0x44, 0x92, 0x31, 0xC4, 0x52, 0xC2, 0x0E, + 0x38, 0x21, 0x40, 0x00, 0x04, 0x33, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x44, 0x00, + 0x04, 0x33, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x52, 0x92, 0x11, 0x38, 0x41, + 0x34, 0x00, 0x38, 0x61, 0x34, 0x00, 0x06, 0x59, 0xF7, 0x5F, 0xF7, 0x4F, 0x26, 0x59, 0x26, 0x46, + 0xE7, 0x50, 0xE7, 0x40, 0x06, 0x28, 0x06, 0x37, 0x43, 0x85, 0x43, 0x74, 0xF2, 0x03, 0x06, 0x28, + 0x06, 0x37, 0x38, 0x41, 0x24, 0x00, 0x38, 0x51, 0x28, 0x00, 0xB9, 0x21, 0x04, 0x00, 0xB9, 0x31, + 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x68, 0xF2, 0x20, 0xC4, 0x51, 0xC2, 0x0E, + 0x06, 0x69, 0xF7, 0x6F, 0x26, 0x69, 0xE7, 0x60, 0x38, 0x71, 0x34, 0x00, 0x43, 0x86, 0x38, 0x61, + 0x34, 0x00, 0xF7, 0x7F, 0x26, 0x76, 0xE7, 0x70, 0x43, 0x77, 0x78, 0x5E, 0x42, 0x03, 0x78, 0xFE, + 0x40, 0x03, 0x38, 0x41, 0x2C, 0x00, 0xB1, 0x51, 0x38, 0x51, 0x30, 0x00, 0xB9, 0x81, 0x04, 0x00, + 0xB9, 0x71, 0x08, 0x00, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x6F, 0x6B, 0xC7, 0x01, 0x00, 0x18, 0x7E, + 0x64, 0x03, 0xC4, 0x78, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x64, 0x03, 0x18, 0x7E, 0x69, 0x03, + 0xC4, 0x71, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x69, 0x03, 0x18, 0x7A, 0x82, 0x02, 0x34, 0x71, + 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, 0x06, 0x96, 0x57, 0x92, 0x26, 0x69, 0x26, 0x76, 0x2C, 0x70, + 0x3C, 0x03, 0x2F, 0x97, 0x0D, 0x00, 0xF0, 0x29, 0x22, 0x39, 0xF8, 0x79, 0x02, 0x00, 0x22, 0x36, + 0x38, 0x61, 0x3C, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x0C, 0xC0, 0x64, 0x00, 0x06, 0x8C, 0x36, 0x86, + 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, 0x06, 0x62, 0x38, 0x31, + 0x3C, 0x00, 0x78, 0x2A, 0x78, 0x02, 0xB9, 0x61, 0x68, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, + 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x61, 0x68, 0x00, 0x38, 0x71, 0x64, 0x00, 0x26, 0x26, 0x06, 0x38, + 0xA9, 0x2A, 0x78, 0x02, 0x06, 0x27, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, + 0x06, 0x82, 0x38, 0x31, 0x3C, 0x00, 0x78, 0x2A, 0x7A, 0x02, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x3C, + 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x28, 0xA9, 0x2A, 0x7A, 0x02, 0x06, 0x29, 0x06, 0x3B, 0x04, 0x44, + 0x6B, 0xCF, 0x03, 0x00, 0xFA, 0xB5, 0xFC, 0xFF, 0x0C, 0x20, 0xA6, 0x00, 0x26, 0x2D, 0x0C, 0x30, + 0x78, 0x02, 0x26, 0x3D, 0x04, 0x44, 0x6B, 0xCF, 0x03, 0x00, 0x58, 0xC1, 0x7C, 0x00, 0x58, 0x81, + 0x6C, 0x00, 0x2C, 0x10, 0x8C, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0xEC, 0x11, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x1A, 0x12, + 0x14, 0x31, 0x0C, 0x40, 0x3C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, + 0x00, 0x10, 0xA9, 0x07, 0x22, 0x00, 0xA9, 0x07, 0x74, 0x02, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x44, 0x03, 0xD9, 0xC1, 0x34, 0x03, 0x38, 0xD0, 0x94, 0x15, 0xD9, 0x81, 0x24, 0x03, + 0x0C, 0xE0, 0x00, 0x10, 0x18, 0xCD, 0x5A, 0x00, 0xA9, 0x0E, 0x68, 0x02, 0x18, 0x3D, 0x48, 0x00, + 0x28, 0x2E, 0x08, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, + 0x23, 0x22, 0xA9, 0x2E, 0x6A, 0x02, 0x28, 0x7D, 0x4A, 0x00, 0xC6, 0x27, 0xB2, 0x03, 0xA9, 0x7E, + 0x6A, 0x02, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x08, 0x18, 0x7D, 0x62, 0x00, + 0x36, 0xC7, 0xC4, 0xC0, 0x12, 0x02, 0x04, 0xC1, 0x13, 0xCC, 0x0C, 0x20, 0xE0, 0x02, 0x26, 0x21, + 0x04, 0x30, 0x04, 0x4A, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, + 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x40, 0x02, 0x26, 0x21, 0x04, 0x30, + 0x0C, 0x40, 0x78, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xB8, 0x02, 0x0C, 0x40, + 0x28, 0x00, 0x26, 0x21, 0x04, 0x30, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x2E, 0x08, 0x00, + 0xA9, 0x0E, 0x14, 0x02, 0x06, 0x3C, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, + 0x00, 0x00, 0x28, 0x7E, 0x0E, 0x00, 0x04, 0x60, 0x26, 0x27, 0xA9, 0x2E, 0x16, 0x02, 0xB9, 0x61, + 0xEC, 0x02, 0x06, 0x86, 0x04, 0xA1, 0x06, 0xC6, 0x2F, 0x78, 0x08, 0x00, 0x26, 0x7E, 0xB9, 0x71, + 0x10, 0x03, 0x04, 0xD0, 0x38, 0x71, 0xEC, 0x02, 0x26, 0x7D, 0x23, 0x77, 0x0C, 0x60, 0x80, 0x02, + 0xB9, 0x71, 0xF0, 0x02, 0x26, 0x77, 0x26, 0x76, 0x70, 0x77, 0x28, 0x6E, 0x6A, 0x02, 0xC6, 0x76, + 0x02, 0x06, 0x28, 0x6E, 0x68, 0x02, 0x24, 0x61, 0xA9, 0x6E, 0x68, 0x02, 0x0C, 0x40, 0x16, 0x02, + 0x26, 0x4E, 0x70, 0x44, 0xC6, 0x74, 0xB9, 0x41, 0xF4, 0x02, 0x0A, 0xE7, 0x00, 0x00, 0x2F, 0x7D, + 0x0D, 0x00, 0x04, 0xB0, 0x26, 0x7E, 0xB9, 0x71, 0x0C, 0x03, 0xB9, 0xB1, 0xF8, 0x02, 0xB9, 0xB1, + 0xFC, 0x02, 0xB9, 0xB1, 0x00, 0x03, 0x06, 0x6B, 0xB9, 0xB1, 0x04, 0x03, 0x06, 0x5B, 0x38, 0x91, + 0xF0, 0x02, 0x38, 0x21, 0xF4, 0x02, 0x23, 0x7B, 0x26, 0x97, 0x23, 0x99, 0x2F, 0x49, 0x09, 0x00, + 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x4F, 0x70, 0x44, 0xC6, 0x42, 0x0A, 0x8A, 0x00, 0x00, 0x13, 0x3C, + 0xB9, 0x31, 0x08, 0x03, 0x38, 0xF1, 0x08, 0x03, 0x36, 0x42, 0x38, 0x21, 0x0C, 0x03, 0x2F, 0x39, + 0x01, 0x00, 0x91, 0xF3, 0x2F, 0x3B, 0x0B, 0x00, 0x26, 0x32, 0x28, 0x33, 0x26, 0x00, 0xB9, 0x51, + 0x14, 0x03, 0x06, 0x24, 0xB9, 0x61, 0x18, 0x03, 0xB9, 0x71, 0x20, 0x03, 0xB9, 0x41, 0x1C, 0x03, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x31, 0xF8, 0x02, 0x38, 0xF1, 0x10, 0x03, 0x38, 0x41, 0x1C, 0x03, + 0x26, 0x32, 0xB9, 0x31, 0xF8, 0x02, 0x28, 0x3F, 0x66, 0x00, 0x06, 0x24, 0xAB, 0x97, 0x00, 0x00, + 0x38, 0x31, 0xFC, 0x02, 0x38, 0xF1, 0x00, 0x03, 0x38, 0x41, 0x1C, 0x03, 0x38, 0x71, 0x20, 0x03, + 0x38, 0x51, 0x14, 0x03, 0x38, 0x61, 0x18, 0x03, 0xC4, 0x80, 0x26, 0x32, 0x26, 0xF4, 0x24, 0x71, + 0xB9, 0x31, 0xFC, 0x02, 0xB9, 0xF1, 0x00, 0x03, 0x23, 0x77, 0x82, 0x45, 0xC4, 0x50, 0x14, 0x4E, + 0x26, 0x41, 0x26, 0x49, 0x92, 0x14, 0x90, 0x44, 0x92, 0x0F, 0xC4, 0xD0, 0x82, 0x08, 0x14, 0x4F, + 0x26, 0x41, 0x26, 0x49, 0x90, 0x44, 0x92, 0x08, 0xC4, 0xDD, 0x82, 0x35, 0x14, 0x2D, 0x26, 0x21, + 0x26, 0x92, 0x90, 0x49, 0x82, 0x30, 0x06, 0xC4, 0x04, 0x51, 0xF2, 0x2D, 0x90, 0x44, 0x82, 0x04, + 0xC6, 0x4C, 0x9A, 0x84, 0x01, 0x00, 0xC4, 0xD0, 0x82, 0x0B, 0x14, 0x4F, 0x26, 0x41, 0x26, 0x49, + 0x90, 0x44, 0x82, 0x04, 0xC6, 0x4C, 0x9A, 0x7A, 0x01, 0x00, 0xC4, 0xDD, 0x82, 0x09, 0x14, 0x3D, + 0x26, 0x31, 0x26, 0x93, 0x90, 0x49, 0x82, 0x04, 0xC6, 0x4C, 0x9A, 0x70, 0x01, 0x00, 0xB8, 0x41, + 0x04, 0x03, 0x82, 0x11, 0xC4, 0x64, 0xD2, 0x0F, 0xC4, 0xC4, 0xD2, 0x0D, 0xC6, 0xC6, 0x0C, 0x40, + 0xE0, 0x02, 0x26, 0x41, 0xC2, 0x04, 0x26, 0x4C, 0x91, 0x64, 0xF2, 0x05, 0x38, 0xF1, 0x08, 0x03, + 0x26, 0x46, 0x91, 0xF4, 0x24, 0xD1, 0xC4, 0xDE, 0x24, 0xB1, 0x9A, 0x6A, 0xFF, 0xFF, 0x14, 0x61, + 0x26, 0x6A, 0xC4, 0x68, 0xD2, 0x3A, 0xC4, 0x50, 0x92, 0x03, 0x06, 0xCA, 0x24, 0xA1, 0x38, 0x21, + 0xF0, 0x02, 0xB9, 0x71, 0x20, 0x03, 0x06, 0x47, 0x26, 0x21, 0x33, 0x3C, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x14, 0x51, 0x26, 0x5C, 0x2F, 0x65, 0x05, 0x00, 0x26, 0x65, 0x57, 0x61, 0x26, 0x61, + 0x38, 0x46, 0x40, 0x02, 0x38, 0x21, 0xF8, 0x02, 0x38, 0x31, 0xFC, 0x02, 0x38, 0xF1, 0x00, 0x03, + 0x38, 0x71, 0x20, 0x03, 0x26, 0x42, 0xB9, 0x46, 0x40, 0x02, 0x38, 0x46, 0x44, 0x02, 0x57, 0x51, + 0x26, 0x43, 0xB9, 0x46, 0x44, 0x02, 0x38, 0x46, 0x48, 0x02, 0x26, 0x4F, 0xB9, 0x46, 0x48, 0x02, + 0x2F, 0x65, 0x01, 0x00, 0x28, 0x56, 0xB8, 0x02, 0x99, 0x86, 0xBB, 0x02, 0x26, 0x75, 0xA9, 0x76, + 0xB8, 0x02, 0x04, 0x71, 0x99, 0x76, 0xBA, 0x02, 0x24, 0xD1, 0xC4, 0xDD, 0x0A, 0xFC, 0xFE, 0xFF, + 0x38, 0x71, 0xEC, 0x02, 0x24, 0x81, 0x24, 0x7E, 0xCC, 0x80, 0x16, 0x00, 0x23, 0x77, 0xB9, 0x71, + 0xEC, 0x02, 0x9A, 0xEB, 0xFE, 0xFF, 0x14, 0x91, 0x26, 0x9A, 0xC4, 0x99, 0xC2, 0x09, 0x18, 0x8E, + 0x04, 0x00, 0x28, 0xCE, 0x22, 0x00, 0x06, 0xDE, 0x04, 0xB0, 0xFA, 0xF0, 0x00, 0x00, 0x14, 0xB2, + 0x26, 0xBA, 0x2F, 0xDB, 0x0B, 0x00, 0x06, 0xCA, 0x26, 0xDB, 0x0C, 0x20, 0x40, 0x02, 0x57, 0xC1, + 0x57, 0xD1, 0x26, 0x21, 0x26, 0xC1, 0x0C, 0x70, 0xAC, 0x02, 0x06, 0x89, 0x26, 0xD2, 0x2C, 0xC0, + 0xB0, 0x02, 0x26, 0x71, 0xC4, 0x80, 0x82, 0x45, 0x0C, 0x60, 0xE0, 0x02, 0x26, 0x61, 0x26, 0x68, + 0x10, 0x66, 0x34, 0x61, 0x13, 0x56, 0xC4, 0x59, 0xD2, 0x38, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x56, + 0x57, 0x51, 0x26, 0x51, 0x30, 0x3D, 0x38, 0x45, 0x40, 0x02, 0x57, 0x61, 0x26, 0x43, 0xB9, 0x45, + 0x40, 0x02, 0x38, 0x3D, 0x04, 0x00, 0x38, 0x45, 0x44, 0x02, 0x26, 0x61, 0x26, 0x43, 0xB9, 0x45, + 0x44, 0x02, 0x38, 0x3D, 0x08, 0x00, 0x38, 0x45, 0x48, 0x02, 0x06, 0x2D, 0x26, 0x43, 0xB9, 0x45, + 0x48, 0x02, 0x20, 0x4C, 0x28, 0x56, 0xB8, 0x02, 0x04, 0x3C, 0x26, 0x54, 0xA9, 0x56, 0xB8, 0x02, + 0x3F, 0x4D, 0x07, 0x00, 0x26, 0x3D, 0xB9, 0x71, 0x20, 0x03, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, + 0x0C, 0x40, 0xDC, 0x02, 0x04, 0x34, 0x26, 0x41, 0x06, 0x2C, 0x26, 0x3C, 0x36, 0x4C, 0x0C, 0xF0, + 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x71, 0x20, 0x03, 0x34, 0x81, 0x34, 0xDC, 0x34, 0xC4, 0xF2, 0xBB, + 0x0C, 0x70, 0xE0, 0x02, 0x26, 0x71, 0x26, 0x7B, 0x06, 0x6A, 0xC4, 0x61, 0x82, 0x1C, 0x98, 0x57, + 0x01, 0x00, 0x82, 0x16, 0x90, 0x57, 0x82, 0x14, 0x06, 0x56, 0xC6, 0x59, 0xD2, 0x0E, 0x0C, 0x40, + 0xE0, 0x02, 0x26, 0x41, 0x26, 0x45, 0x18, 0x27, 0x01, 0x00, 0x10, 0x34, 0xC6, 0x23, 0x92, 0x03, + 0x10, 0x37, 0x91, 0x34, 0x24, 0x51, 0xF2, 0xF2, 0x10, 0x57, 0x99, 0x57, 0x01, 0x00, 0x34, 0x61, + 0x34, 0x71, 0xF2, 0xE4, 0x06, 0x76, 0xC6, 0x7A, 0x8A, 0x7B, 0xFF, 0xFF, 0x0C, 0x50, 0xE0, 0x02, + 0x26, 0x51, 0x26, 0x57, 0x90, 0x45, 0x92, 0x03, 0x91, 0x65, 0x24, 0x61, 0x24, 0x71, 0xF2, 0xF4, + 0x18, 0x7D, 0x39, 0x01, 0x0C, 0x30, 0xE0, 0x02, 0x26, 0x77, 0x06, 0x67, 0xD7, 0x61, 0x3F, 0x77, + 0x06, 0x00, 0x18, 0x6D, 0x38, 0x01, 0x26, 0x31, 0x26, 0x76, 0x23, 0x77, 0x26, 0x71, 0x10, 0x77, + 0x26, 0x73, 0x10, 0x57, 0x14, 0x71, 0x26, 0x75, 0xB3, 0x77, 0x22, 0x4E, 0x06, 0x67, 0x57, 0x61, + 0x26, 0x61, 0x28, 0x46, 0xB8, 0x02, 0x99, 0x5D, 0xF2, 0x01, 0x2F, 0x35, 0x05, 0x00, 0x2F, 0x65, + 0x03, 0x00, 0x26, 0x66, 0x2F, 0xF6, 0x0E, 0x00, 0xA9, 0x4D, 0xF0, 0x01, 0x04, 0x61, 0x2F, 0x26, + 0x0F, 0x00, 0xE8, 0x22, 0x1A, 0x02, 0x32, 0x3D, 0x26, 0x53, 0x26, 0x55, 0x26, 0x5E, 0x26, 0x65, + 0x99, 0xB6, 0x1A, 0x02, 0x18, 0x65, 0x1A, 0x02, 0x24, 0x61, 0x99, 0x65, 0x1A, 0x02, 0x13, 0x64, + 0xC6, 0xC6, 0xA9, 0x6D, 0x3E, 0x01, 0x06, 0x5C, 0xB2, 0x02, 0x06, 0x56, 0x2F, 0x97, 0x07, 0x00, + 0x2F, 0x67, 0x09, 0x00, 0x57, 0x61, 0x26, 0x61, 0xB8, 0xA6, 0x48, 0x02, 0x23, 0xC5, 0x92, 0x02, + 0x04, 0xA1, 0x26, 0x79, 0x57, 0x71, 0x2F, 0x97, 0x01, 0x00, 0x38, 0x29, 0x40, 0x02, 0xB9, 0xA9, + 0x48, 0x02, 0x06, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0x04, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2D, + 0xEC, 0x01, 0x38, 0x29, 0x44, 0x02, 0x06, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0x04, 0x3A, 0x0B, 0x9B, + 0x00, 0x00, 0xA9, 0x2D, 0xEE, 0x01, 0x24, 0xB1, 0x24, 0xD8, 0xC6, 0xB8, 0x22, 0x9A, 0xF2, 0x05, + 0x24, 0x61, 0xC4, 0x66, 0x92, 0xBD, 0xF2, 0xCC, 0xA9, 0xCE, 0x22, 0x00, 0x58, 0xC1, 0x34, 0x03, + 0x58, 0x81, 0x24, 0x03, 0x2C, 0x10, 0x44, 0x03, 0xE1, 0xF0, 0x06, 0x64, 0x04, 0x41, 0xB9, 0x41, + 0x04, 0x03, 0xFA, 0x91, 0xFE, 0xFF, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x40, 0x80, 0x00, 0x0C, 0x20, + 0x6C, 0x11, 0x04, 0x30, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x70, 0x00, 0x10, + 0x1C, 0x60, 0xFA, 0x00, 0xA9, 0x67, 0xE4, 0x01, 0xA9, 0x67, 0xE6, 0x01, 0x28, 0x67, 0x06, 0x00, + 0x54, 0x68, 0xA3, 0x46, 0x18, 0x50, 0xBA, 0x15, 0x92, 0x04, 0x06, 0x64, 0xC4, 0x50, 0xF2, 0x03, + 0x04, 0x60, 0xC6, 0x56, 0x82, 0x03, 0x0C, 0x60, 0x32, 0x00, 0x30, 0xF1, 0x99, 0x67, 0xE9, 0x01, + 0x99, 0x07, 0xEA, 0x01, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x20, 0x38, 0x11, 0x04, 0x30, + 0x0C, 0x40, 0x28, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, + 0x00, 0x10, 0x99, 0x07, 0x04, 0x00, 0xA9, 0x07, 0x34, 0x01, 0xA9, 0x07, 0x36, 0x01, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0x2F, 0x75, 0x05, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xD5, 0x34, 0x51, 0x57, 0xD2, 0x06, 0x65, 0x36, 0xD7, 0x57, 0x62, 0x2F, 0x75, 0x05, 0x00, + 0x3F, 0x77, 0x06, 0x00, 0x26, 0x74, 0x26, 0xD4, 0x26, 0x77, 0x26, 0xDD, 0x34, 0x72, 0x26, 0xD3, + 0xB1, 0xB1, 0x26, 0x37, 0x04, 0xE0, 0x34, 0x41, 0x06, 0x74, 0x06, 0xF3, 0x04, 0x60, 0xC4, 0x50, + 0x22, 0x11, 0xCC, 0x50, 0x14, 0x00, 0x02, 0x06, 0xC4, 0x7C, 0x82, 0x08, 0xC4, 0x7D, 0x92, 0x0A, + 0xF2, 0x05, 0xC4, 0x70, 0x22, 0x07, 0xC4, 0x7D, 0x12, 0x05, 0x70, 0xBF, 0x70, 0xCD, 0xC6, 0xBC, + 0x12, 0x12, 0x24, 0x61, 0x43, 0x66, 0xC4, 0x63, 0x24, 0x71, 0x24, 0xF2, 0x92, 0xE9, 0x24, 0xE1, + 0x43, 0xEE, 0xC4, 0xE3, 0x2C, 0x30, 0x1C, 0x00, 0x24, 0x51, 0x92, 0xDF, 0x70, 0x7D, 0xB1, 0x72, + 0x04, 0x21, 0xF2, 0x02, 0x04, 0x20, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x60, 0x01, 0x0C, 0x20, 0x9E, 0x00, 0x26, 0x21, 0x04, 0x30, + 0x04, 0x44, 0xD9, 0xC1, 0x50, 0x01, 0xD9, 0x81, 0x40, 0x01, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x49, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x10, 0x0C, 0x70, 0xFF, 0x0F, 0xA9, 0x7E, 0x08, 0x00, 0x18, 0x70, 0xAD, 0x15, 0xA9, 0x0E, + 0x0A, 0x00, 0x0C, 0x80, 0x2C, 0x01, 0xC4, 0x70, 0xA9, 0x0E, 0x0C, 0x00, 0xA9, 0x0E, 0x2C, 0x01, + 0xA9, 0x0E, 0x18, 0x02, 0xB9, 0x81, 0xDC, 0x00, 0x78, 0xCE, 0x0E, 0x00, 0x92, 0x09, 0x38, 0x70, + 0x94, 0x15, 0x0C, 0xF0, 0x22, 0x00, 0x26, 0xF7, 0x20, 0x7F, 0xB9, 0x71, 0xDC, 0x00, 0x28, 0x7E, + 0x6A, 0x01, 0x38, 0x81, 0xDC, 0x00, 0x38, 0xD0, 0x94, 0x15, 0x26, 0x78, 0x23, 0x77, 0x0C, 0x40, + 0x28, 0x00, 0xA9, 0x7E, 0x60, 0x01, 0x26, 0x4D, 0x20, 0x44, 0x98, 0x60, 0xBA, 0x15, 0xB9, 0x41, + 0xF8, 0x00, 0x82, 0x09, 0x28, 0x6E, 0x06, 0x00, 0xD4, 0x68, 0x92, 0x05, 0x2C, 0x70, 0xC8, 0x00, + 0xA9, 0x7E, 0x60, 0x01, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x04, 0x3E, 0x5C, 0x20, + 0xFF, 0x01, 0x8B, 0xA1, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2B, 0x92, 0x08, 0x28, 0x6D, + 0x2A, 0x00, 0x28, 0x7E, 0x60, 0x01, 0x26, 0x76, 0xA9, 0x7E, 0x60, 0x01, 0x6B, 0xBA, 0x00, 0x00, + 0x38, 0xD0, 0x94, 0x15, 0x04, 0xA1, 0x28, 0x3D, 0xC8, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0xB9, 0x21, 0xFC, 0x00, 0x18, 0x2E, 0x28, 0x03, 0xC6, 0x2A, + 0xC2, 0x08, 0x18, 0x3D, 0x3D, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x86, 0xA2, 0x92, 0x02, 0x04, 0xA1, + 0x18, 0x3D, 0x3C, 0x00, 0x78, 0x2E, 0x2A, 0x01, 0x06, 0xBE, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x7D, 0x3A, 0x00, 0xC6, 0x27, 0xB2, 0x02, 0x06, 0x27, + 0x06, 0x3A, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x2B, 0x2C, 0x01, 0x06, 0x3A, 0x06, 0x2C, 0x0B, 0x9B, + 0x00, 0x00, 0x30, 0x7D, 0xB9, 0x21, 0x00, 0x01, 0xDC, 0x70, 0x00, 0x80, 0x92, 0x04, 0x0C, 0x70, + 0x80, 0x02, 0xF2, 0x03, 0x0C, 0x70, 0x80, 0x0B, 0xB9, 0x71, 0xE8, 0x00, 0x0C, 0x70, 0x62, 0x10, + 0xB9, 0x71, 0xC0, 0x00, 0x06, 0xB7, 0x0C, 0xB0, 0x64, 0x11, 0x04, 0x70, 0xB9, 0x71, 0xB0, 0x00, + 0xB9, 0x71, 0xB4, 0x00, 0xB9, 0x71, 0xD8, 0x00, 0x0C, 0x70, 0x4C, 0x00, 0x26, 0x71, 0x34, 0x72, + 0xB9, 0x71, 0x28, 0x01, 0x38, 0x71, 0xB0, 0x00, 0x38, 0xA1, 0xB0, 0x00, 0x38, 0x81, 0xB0, 0x00, + 0x23, 0x77, 0xB9, 0x71, 0xE4, 0x00, 0x26, 0x77, 0x06, 0x67, 0xD7, 0x61, 0x3F, 0x77, 0x06, 0x00, + 0x23, 0x77, 0x43, 0xAA, 0xB9, 0x71, 0x1C, 0x01, 0x04, 0x71, 0xB9, 0xA1, 0xA8, 0x00, 0x06, 0xA7, + 0x53, 0xA8, 0x06, 0x68, 0x34, 0x61, 0xB9, 0xA1, 0x08, 0x01, 0x06, 0xA7, 0x53, 0xA6, 0x06, 0x87, + 0x34, 0x61, 0x53, 0x86, 0x38, 0x61, 0xB0, 0x00, 0xB9, 0xA1, 0x0C, 0x01, 0x38, 0xA1, 0xB0, 0x00, + 0xB9, 0x81, 0x10, 0x01, 0x24, 0x62, 0x26, 0xA7, 0x06, 0x87, 0x53, 0x76, 0xB9, 0x71, 0x18, 0x01, + 0x53, 0x8A, 0xB9, 0xA1, 0xE0, 0x00, 0x0C, 0x70, 0x22, 0x10, 0x04, 0xA0, 0xB9, 0x81, 0x14, 0x01, + 0xB9, 0x71, 0xC4, 0x00, 0xB9, 0xA1, 0xC8, 0x00, 0x0C, 0x90, 0x00, 0x10, 0x28, 0x7E, 0x06, 0x00, + 0x38, 0x81, 0xC8, 0x00, 0xD4, 0x78, 0x43, 0xD8, 0x92, 0x11, 0x38, 0x71, 0xE4, 0x00, 0x34, 0x7C, + 0xC4, 0x75, 0xC2, 0x15, 0x38, 0x70, 0x94, 0x15, 0x0C, 0x40, 0x32, 0x00, 0x26, 0x47, 0x20, 0x74, + 0xB9, 0x71, 0xB8, 0x00, 0x0C, 0x70, 0x80, 0x02, 0xF2, 0x10, 0x38, 0x70, 0x94, 0x15, 0x0C, 0xF0, + 0x32, 0x00, 0x26, 0xF7, 0x20, 0x7F, 0xB9, 0x71, 0xB8, 0x00, 0xF2, 0x05, 0x0C, 0x60, 0x50, 0x00, + 0xB9, 0x61, 0xB8, 0x00, 0x0C, 0x70, 0x80, 0x0B, 0xB9, 0x71, 0xCC, 0x00, 0x38, 0x71, 0xA8, 0x00, + 0xCC, 0x70, 0x15, 0x00, 0x92, 0x08, 0x38, 0x71, 0xC8, 0x00, 0x34, 0x7C, 0x23, 0x77, 0xC4, 0x71, + 0xDA, 0xE0, 0x04, 0x00, 0x38, 0x81, 0xC8, 0x00, 0x38, 0x31, 0x1C, 0x01, 0x26, 0x38, 0x23, 0x33, + 0x06, 0x83, 0x26, 0x83, 0x0C, 0x70, 0x80, 0x02, 0x26, 0x78, 0x70, 0x67, 0x38, 0x70, 0x94, 0x15, + 0xB9, 0x31, 0xAC, 0x00, 0x43, 0xC3, 0x28, 0x77, 0x5C, 0x00, 0xC6, 0x67, 0x02, 0x06, 0x28, 0x7E, + 0x18, 0x02, 0x24, 0x71, 0xA9, 0x7E, 0x18, 0x02, 0xE7, 0xC1, 0x38, 0xA1, 0xAC, 0x00, 0x26, 0xC1, + 0x10, 0x7C, 0x54, 0xA7, 0x63, 0x7A, 0xD4, 0x71, 0x9A, 0xBC, 0x04, 0x00, 0x38, 0x71, 0xA8, 0x00, + 0xCC, 0x70, 0x13, 0x00, 0x04, 0x71, 0xB9, 0x71, 0xBC, 0x00, 0x12, 0x06, 0xC4, 0xDB, 0x12, 0x04, + 0x04, 0x72, 0xB9, 0x71, 0xBC, 0x00, 0x06, 0x73, 0x0C, 0x70, 0x80, 0x0B, 0x26, 0x78, 0x38, 0xF1, + 0xFC, 0x00, 0x70, 0x77, 0x43, 0x6F, 0xC6, 0x76, 0x2A, 0xA4, 0x04, 0x00, 0x38, 0x41, 0xBC, 0x00, + 0xC4, 0x41, 0x92, 0x08, 0x38, 0x51, 0xF8, 0x00, 0x43, 0x65, 0xC6, 0x76, 0x2A, 0x9A, 0x04, 0x00, + 0xF2, 0x06, 0x78, 0x6E, 0x60, 0x01, 0xC6, 0x67, 0x1A, 0x94, 0x04, 0x00, 0x38, 0x51, 0xA8, 0x00, + 0xB9, 0x01, 0xA4, 0x00, 0x0C, 0x20, 0xA4, 0x00, 0x26, 0x21, 0x0C, 0x30, 0x80, 0x0B, 0x06, 0x4D, + 0xAB, 0x37, 0x02, 0x00, 0xC4, 0x20, 0x8A, 0x85, 0x04, 0x00, 0x38, 0x71, 0xCC, 0x00, 0x26, 0x78, + 0x70, 0x67, 0x28, 0x7E, 0x0E, 0x00, 0x3F, 0x77, 0x06, 0x00, 0xC4, 0x70, 0x0A, 0x7A, 0x04, 0x00, + 0x78, 0x6E, 0x2C, 0x01, 0xC6, 0x76, 0x0A, 0x75, 0x04, 0x00, 0x38, 0x71, 0xA4, 0x00, 0x28, 0x6E, + 0x0C, 0x00, 0xC6, 0x76, 0x22, 0x0B, 0xA9, 0x7E, 0x0C, 0x00, 0x18, 0x7E, 0x04, 0x00, 0x24, 0x71, + 0x13, 0x77, 0xB9, 0x71, 0xD8, 0x00, 0x99, 0x7E, 0x57, 0x02, 0x10, 0x5C, 0x04, 0x71, 0x06, 0x67, + 0x53, 0x6A, 0xC4, 0xDD, 0x66, 0x65, 0x91, 0x6C, 0x82, 0x0C, 0x38, 0x51, 0xAC, 0x00, 0x26, 0x57, + 0x06, 0x65, 0xE7, 0x61, 0x26, 0x61, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, + 0x38, 0x71, 0xA8, 0x00, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x2D, 0x38, 0x71, 0xAC, 0x00, 0x04, 0x67, + 0x24, 0x7E, 0x06, 0x57, 0xE7, 0x51, 0x56, 0x67, 0x26, 0x51, 0x04, 0x71, 0x10, 0x45, 0x06, 0x87, + 0x53, 0x86, 0x06, 0x68, 0xC4, 0xD0, 0x66, 0x64, 0x91, 0x65, 0x92, 0x0F, 0x38, 0x71, 0xAC, 0x00, + 0x04, 0x57, 0x24, 0x7F, 0x06, 0x67, 0xE7, 0x61, 0x56, 0x57, 0x26, 0x61, 0x04, 0x71, 0x53, 0x75, + 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, 0xF2, 0x0E, 0x38, 0x51, 0xAC, 0x00, 0xC4, 0xDD, 0x24, 0x5D, + 0x06, 0x65, 0xE7, 0x61, 0x26, 0x61, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, + 0x92, 0xE6, 0x38, 0x41, 0xC8, 0x00, 0x38, 0xA1, 0xB0, 0x00, 0x38, 0x51, 0x00, 0x01, 0x13, 0x44, + 0x06, 0x74, 0x13, 0xAA, 0x34, 0x72, 0xB9, 0xA1, 0xEC, 0x00, 0x0C, 0xD0, 0x78, 0x00, 0x04, 0x20, + 0x0C, 0xC0, 0x4C, 0x00, 0x34, 0xA1, 0x33, 0x77, 0x23, 0x55, 0x26, 0xD1, 0x0C, 0x60, 0xFF, 0xFF, + 0x26, 0xC1, 0x06, 0x32, 0xB9, 0xA1, 0x20, 0x01, 0xB9, 0x41, 0xF0, 0x00, 0xB9, 0x71, 0x24, 0x01, + 0xB9, 0x51, 0xF4, 0x00, 0x38, 0xF1, 0x20, 0x01, 0x38, 0x71, 0x24, 0x01, 0xB9, 0xD1, 0xD4, 0x00, + 0x26, 0xF6, 0x33, 0xFF, 0x2F, 0x5F, 0x0F, 0x00, 0x06, 0x45, 0xD7, 0x41, 0x3F, 0x55, 0x04, 0x00, + 0x23, 0x55, 0xB9, 0x51, 0x04, 0x01, 0x06, 0x4C, 0x0C, 0x50, 0xFF, 0xFF, 0xC4, 0xF0, 0x22, 0x0D, + 0xCC, 0xF0, 0x14, 0x00, 0x02, 0x06, 0xC4, 0x7C, 0x82, 0x0A, 0xC4, 0x7D, 0x92, 0x06, 0xF2, 0x07, + 0xC4, 0x70, 0x22, 0x03, 0xC4, 0x7D, 0x02, 0x03, 0xA1, 0x04, 0xF2, 0x2E, 0x38, 0x81, 0x04, 0x01, + 0x38, 0xA1, 0xCC, 0x00, 0x26, 0x87, 0x23, 0x88, 0x26, 0x88, 0x26, 0xA8, 0x20, 0xAA, 0xB9, 0x81, + 0x3C, 0x01, 0x06, 0x8A, 0x38, 0xA1, 0xF4, 0x00, 0x36, 0x8A, 0xB9, 0x81, 0xD0, 0x00, 0x06, 0xA8, + 0xC3, 0x88, 0x32, 0x02, 0x04, 0xA0, 0xC4, 0x62, 0x43, 0x8A, 0xB9, 0x81, 0xD0, 0x00, 0xA1, 0xA4, + 0xD2, 0x13, 0xC4, 0x52, 0xD2, 0x11, 0x38, 0xA1, 0xE8, 0x00, 0x38, 0x81, 0x3C, 0x01, 0x24, 0x31, + 0x26, 0x8A, 0x20, 0xA8, 0x38, 0x81, 0xF4, 0x00, 0x36, 0xA8, 0x38, 0x81, 0xD4, 0x00, 0xA1, 0xA8, + 0x38, 0xA1, 0xD0, 0x00, 0x26, 0x2A, 0x38, 0x81, 0xD4, 0x00, 0x24, 0x51, 0x23, 0x55, 0xC4, 0x54, + 0x24, 0x82, 0x24, 0x71, 0xB9, 0x81, 0xD4, 0x00, 0x24, 0x42, 0x33, 0x77, 0x92, 0xB8, 0x24, 0x61, + 0x23, 0x66, 0xC4, 0x64, 0x24, 0xCA, 0x24, 0xD6, 0x92, 0x9E, 0x98, 0x70, 0xAC, 0x15, 0x92, 0x1A, + 0x34, 0x31, 0xC4, 0x30, 0x12, 0x02, 0x04, 0x31, 0x38, 0xA1, 0xBC, 0x00, 0xC4, 0xA1, 0x92, 0x12, + 0x38, 0xC0, 0x94, 0x15, 0x78, 0xD1, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x28, 0x7C, 0x34, 0x00, + 0x3F, 0x22, 0x0D, 0x00, 0xC6, 0x27, 0xB2, 0x06, 0x28, 0x7C, 0x36, 0x00, 0xC6, 0xD7, 0x2A, 0x81, + 0x03, 0x00, 0x38, 0x31, 0xB8, 0x00, 0x78, 0x21, 0x88, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0xBC, 0x00, 0x43, 0x22, 0xC4, 0x71, 0x92, 0x3C, + 0x06, 0x76, 0x0C, 0x70, 0x98, 0x15, 0x04, 0xA8, 0x26, 0xA7, 0x20, 0x67, 0x28, 0xF7, 0x02, 0x00, + 0x28, 0xD7, 0x04, 0x00, 0x28, 0xC7, 0x06, 0x00, 0x38, 0x31, 0xAC, 0x00, 0x20, 0x7A, 0xB9, 0x61, + 0xB8, 0x00, 0x0C, 0x40, 0x4C, 0x00, 0x26, 0x41, 0xB9, 0x71, 0xD4, 0x00, 0x24, 0x48, 0x04, 0x50, + 0x2C, 0x30, 0x1E, 0x00, 0x1C, 0xA0, 0x32, 0x00, 0x2F, 0x75, 0x03, 0x00, 0x04, 0x60, 0x38, 0x81, + 0xB8, 0x00, 0xC6, 0x78, 0x82, 0x0F, 0xC6, 0x7F, 0x82, 0x0D, 0xC6, 0x7D, 0x82, 0x0B, 0xC6, 0x7C, + 0x82, 0x09, 0x38, 0x81, 0xD4, 0x00, 0xC6, 0x78, 0x82, 0x05, 0x2F, 0x86, 0x04, 0x00, 0xA9, 0x08, + 0x28, 0x00, 0x34, 0x6A, 0xC6, 0x6A, 0x34, 0x71, 0x92, 0xEB, 0x34, 0x5E, 0x1C, 0x60, 0x46, 0x00, + 0xC6, 0x56, 0x34, 0x42, 0x92, 0xE2, 0x78, 0x71, 0x64, 0x00, 0x28, 0x6E, 0x08, 0x00, 0xB9, 0x71, + 0xA4, 0x00, 0xC6, 0x67, 0x02, 0x03, 0xA9, 0x7E, 0x08, 0x00, 0x28, 0x6E, 0x0A, 0x00, 0xC6, 0x67, + 0x32, 0x03, 0xA9, 0x7E, 0x0A, 0x00, 0x38, 0x71, 0xB4, 0x00, 0x38, 0x81, 0x08, 0x01, 0xB8, 0xA1, + 0xA8, 0x00, 0x66, 0x78, 0xB9, 0x71, 0xB4, 0x00, 0x82, 0x12, 0x38, 0x81, 0x0C, 0x01, 0xC4, 0xA1, + 0x66, 0x78, 0xB9, 0x71, 0xB4, 0x00, 0x82, 0x0B, 0x38, 0xA1, 0x10, 0x01, 0x66, 0x7A, 0xB9, 0x71, + 0xB4, 0x00, 0x38, 0x71, 0xA8, 0x00, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x12, 0x38, 0x71, 0xA8, 0x00, + 0x38, 0x81, 0xB4, 0x00, 0x38, 0xA1, 0x14, 0x01, 0xCC, 0x70, 0x14, 0x00, 0x66, 0x8A, 0xB9, 0x81, + 0xB4, 0x00, 0x82, 0x06, 0x38, 0xA1, 0x18, 0x01, 0x66, 0x8A, 0xB9, 0x81, 0xB4, 0x00, 0x0C, 0xF0, + 0x00, 0x10, 0x18, 0x7F, 0x04, 0x00, 0x78, 0x61, 0x86, 0x00, 0x38, 0x41, 0xF0, 0x00, 0x38, 0x51, + 0xEC, 0x00, 0xD7, 0x71, 0xC6, 0x62, 0x26, 0x7F, 0x99, 0x47, 0x38, 0x01, 0x99, 0x57, 0x39, 0x01, + 0x04, 0x72, 0x12, 0x0A, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x12, 0x06, 0x78, 0x61, 0x8C, 0x00, + 0xC6, 0x62, 0x12, 0x02, 0x04, 0x70, 0x78, 0x61, 0x8A, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, + 0x84, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x90, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x74, + 0x78, 0x61, 0x82, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x12, 0x05, + 0x78, 0x61, 0x84, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x78, 0x78, 0x61, 0x8E, 0x00, 0xC6, 0x62, + 0x12, 0x09, 0x78, 0x61, 0x8C, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x90, 0x00, 0xC6, 0x62, + 0x02, 0x03, 0x6C, 0x70, 0x10, 0x00, 0x0C, 0x60, 0x4C, 0x00, 0x04, 0x42, 0x04, 0x34, 0x04, 0x28, + 0x56, 0x47, 0x56, 0x37, 0x56, 0x27, 0x26, 0x61, 0x0C, 0x50, 0x74, 0x00, 0x5C, 0x70, 0x10, 0x00, + 0x24, 0x68, 0x26, 0x51, 0x13, 0x44, 0x13, 0x33, 0x13, 0x22, 0x13, 0x77, 0xC4, 0x40, 0x92, 0x02, + 0xA1, 0x05, 0xC4, 0x30, 0x92, 0x03, 0xA9, 0x05, 0x08, 0x00, 0xC4, 0x20, 0x92, 0x02, 0xA1, 0x06, + 0xC4, 0x70, 0x92, 0x03, 0xA9, 0x06, 0x28, 0x00, 0x38, 0x81, 0x28, 0x01, 0x34, 0x62, 0xC6, 0x68, + 0x34, 0x5A, 0x92, 0xED, 0x78, 0x31, 0x4E, 0x00, 0x78, 0x41, 0x50, 0x00, 0x78, 0x51, 0x52, 0x00, + 0x78, 0x61, 0x54, 0x00, 0x78, 0x21, 0x4C, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0xAC, 0x00, 0x78, 0x31, 0x76, 0x00, 0x78, 0x41, 0x78, 0x00, 0x78, 0x51, 0x7A, 0x00, 0x78, 0x61, + 0x7C, 0x00, 0x78, 0x21, 0x74, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0xB8, 0x00, + 0x78, 0x31, 0x58, 0x00, 0x78, 0x41, 0x5A, 0x00, 0x78, 0x51, 0x5C, 0x00, 0x78, 0x61, 0x5E, 0x00, + 0x78, 0x21, 0x56, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x78, 0x31, 0x62, 0x00, 0x78, 0x41, + 0x64, 0x00, 0x78, 0x51, 0x66, 0x00, 0x78, 0x61, 0x68, 0x00, 0x06, 0xA2, 0x78, 0x21, 0x60, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xD2, 0x78, 0x31, 0x6C, 0x00, 0x78, 0x21, 0x6A, 0x00, + 0x78, 0x41, 0x6E, 0x00, 0x78, 0x51, 0x70, 0x00, 0x78, 0x61, 0x72, 0x00, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x0C, 0xF0, 0x00, 0x10, 0xF8, 0x7F, 0xE6, 0x01, 0x06, 0xC2, 0x32, 0x05, 0x38, 0x31, + 0xA8, 0x00, 0xA9, 0x3F, 0xE6, 0x01, 0x78, 0x79, 0xE6, 0x01, 0x38, 0x81, 0xB0, 0x00, 0x14, 0x61, + 0x26, 0x67, 0xC6, 0x68, 0x1A, 0x34, 0x01, 0x00, 0x24, 0x71, 0xC6, 0x78, 0x2A, 0x30, 0x01, 0x00, + 0x98, 0x89, 0x04, 0x00, 0x9A, 0x27, 0x01, 0x00, 0x18, 0x79, 0x28, 0x03, 0xC4, 0x71, 0xDA, 0x22, + 0x01, 0x00, 0x38, 0x71, 0xBC, 0x00, 0xC4, 0x72, 0x9A, 0x1D, 0x01, 0x00, 0x98, 0x70, 0xBA, 0x15, + 0x82, 0x03, 0x0C, 0x80, 0x32, 0x00, 0x28, 0x69, 0x06, 0x00, 0xD4, 0x68, 0x82, 0x06, 0x04, 0x80, + 0xC6, 0x78, 0x82, 0x03, 0x0C, 0x80, 0x32, 0x00, 0x78, 0x79, 0xE4, 0x01, 0x06, 0x6D, 0x06, 0x2D, + 0x57, 0x63, 0x57, 0x22, 0x26, 0x26, 0x0C, 0x30, 0x64, 0x00, 0xB9, 0x71, 0x38, 0x01, 0x4B, 0x9E, + 0x00, 0x00, 0xC6, 0x2A, 0x38, 0x71, 0x38, 0x01, 0x02, 0x07, 0xC6, 0x2C, 0x02, 0x05, 0x38, 0xF1, + 0xA8, 0x00, 0xC6, 0x7F, 0x92, 0x1D, 0x18, 0x79, 0xE8, 0x01, 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x04, + 0x24, 0x71, 0x99, 0x79, 0xE8, 0x01, 0x18, 0x79, 0xE8, 0x01, 0xC4, 0x73, 0xC2, 0x15, 0x18, 0x79, + 0xE9, 0x01, 0x99, 0x09, 0xE8, 0x01, 0xC6, 0x78, 0xB2, 0x04, 0x99, 0x89, 0xE9, 0x01, 0xF2, 0x0C, + 0xCC, 0x70, 0x3E, 0x00, 0xD2, 0x09, 0x24, 0x71, 0x99, 0x79, 0xE9, 0x01, 0xF2, 0x05, 0x99, 0x09, + 0xE8, 0x01, 0x99, 0x09, 0xE9, 0x01, 0x38, 0x71, 0xA8, 0x00, 0xC4, 0x71, 0x02, 0x28, 0xB0, 0x2B, + 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, 0x38, 0x21, + 0xAC, 0x00, 0xB9, 0x71, 0x38, 0x01, 0x0C, 0x30, 0x40, 0x00, 0x36, 0x38, 0xAB, 0x97, 0x00, 0x00, + 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB1, 0x2B, 0x92, 0x03, 0x04, 0x7A, + 0xB1, 0x7B, 0x30, 0x8B, 0xB9, 0x81, 0xAC, 0x00, 0xF2, 0x0D, 0xB8, 0x71, 0xAC, 0x00, 0x92, 0x03, + 0x04, 0x7A, 0xF2, 0x03, 0x38, 0x71, 0xAC, 0x00, 0xB1, 0x7B, 0xF2, 0x04, 0xB8, 0x81, 0xA8, 0x00, + 0x82, 0x26, 0xB8, 0x2B, 0x04, 0x00, 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, + 0x00, 0x00, 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, 0x36, 0x38, 0x06, 0x2A, 0xB9, 0x71, 0x38, 0x01, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x2B, + 0x04, 0x00, 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x7B, 0x04, 0x00, 0x38, 0xAB, 0x04, 0x00, 0xF2, 0x07, + 0xC4, 0xA0, 0x04, 0x7A, 0x82, 0x02, 0x06, 0x7A, 0xB9, 0x7B, 0x04, 0x00, 0xB8, 0x2B, 0x08, 0x00, + 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x40, 0x00, + 0x06, 0x72, 0x36, 0x38, 0x06, 0x2D, 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, + 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x2B, 0x08, 0x00, 0x92, 0x04, 0x04, 0x7A, + 0xB9, 0x7B, 0x08, 0x00, 0x38, 0xDB, 0x08, 0x00, 0xF2, 0x07, 0xC4, 0xD0, 0x04, 0x7A, 0x82, 0x02, + 0x06, 0x7D, 0xB9, 0x7B, 0x08, 0x00, 0x38, 0x71, 0xA8, 0x00, 0xCC, 0x70, 0x15, 0x00, 0x82, 0x55, + 0xB8, 0x2B, 0x0C, 0x00, 0x82, 0x1D, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, 0xAB, 0x97, 0x00, 0x00, + 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, 0x36, 0x38, 0x06, 0x2C, 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x2B, 0x0C, 0x00, + 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x7B, 0x0C, 0x00, 0x38, 0xCB, 0x0C, 0x00, 0xF2, 0x07, 0xC4, 0xC0, + 0x04, 0x7A, 0x82, 0x02, 0x06, 0x7C, 0xB9, 0x7B, 0x0C, 0x00, 0x38, 0x81, 0xA8, 0x00, 0xCC, 0x80, + 0x13, 0x00, 0x12, 0x2B, 0xB8, 0x2B, 0x10, 0x00, 0x82, 0x20, 0x18, 0x89, 0xE9, 0x01, 0x06, 0x38, + 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, 0x38, 0x21, 0xB8, 0x00, 0xB9, 0x71, 0x38, 0x01, 0x0C, 0x30, + 0x40, 0x00, 0x36, 0x38, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x27, 0x67, 0x23, + 0xC4, 0x20, 0xB9, 0x2B, 0x10, 0x00, 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x7B, 0x10, 0x00, 0x38, 0x7B, + 0x10, 0x00, 0xB9, 0x71, 0xB8, 0x00, 0xF2, 0x09, 0xB8, 0x81, 0xB8, 0x00, 0x04, 0x7A, 0x82, 0x03, + 0x38, 0x71, 0xB8, 0x00, 0xB9, 0x7B, 0x10, 0x00, 0x38, 0xF1, 0xA8, 0x00, 0xA9, 0xF9, 0xE4, 0x01, + 0xF2, 0x0A, 0x38, 0x31, 0xA8, 0x00, 0xA9, 0x39, 0xE4, 0x01, 0xF2, 0x05, 0x38, 0x41, 0xA8, 0x00, + 0xA9, 0x49, 0xE4, 0x01, 0x38, 0x21, 0xAC, 0x00, 0x38, 0x61, 0xB8, 0x00, 0x06, 0x3A, 0x06, 0x4D, + 0x06, 0x5C, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, 0x04, 0x7A, 0x04, 0xDA, + 0xA9, 0x71, 0x64, 0x00, 0x06, 0x8D, 0x38, 0x71, 0xC0, 0x00, 0x38, 0x21, 0xAC, 0x00, 0x20, 0x37, + 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, 0x06, 0x2A, 0x38, 0xA1, 0xC0, 0x00, 0x28, 0x3A, 0x02, 0x00, + 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0xF1, 0xC0, 0x00, 0x06, 0xA2, 0x28, 0x3F, + 0x04, 0x00, 0x06, 0x2D, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x51, 0xC0, 0x00, 0x06, 0x42, 0x28, 0x35, + 0x06, 0x00, 0xB9, 0x41, 0x34, 0x01, 0x06, 0x2C, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, 0xC0, 0x00, + 0x06, 0xD2, 0x28, 0x36, 0x08, 0x00, 0x38, 0x21, 0xB8, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, + 0x38, 0x01, 0x38, 0x41, 0x34, 0x01, 0x06, 0x62, 0x06, 0x3A, 0x06, 0x27, 0x06, 0x5D, 0x0C, 0xF0, + 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0x38, 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x79, 0x04, 0x00, 0x86, 0x22, + 0xD7, 0x71, 0x26, 0x79, 0x24, 0x74, 0x32, 0x02, 0x04, 0x20, 0xA9, 0x27, 0x38, 0x01, 0x78, 0x31, + 0x56, 0x00, 0x78, 0x41, 0x60, 0x00, 0x78, 0x51, 0x6A, 0x00, 0x78, 0x61, 0x74, 0x00, 0x78, 0x21, + 0x4C, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0xAC, 0x00, 0x78, 0x31, 0x5E, 0x00, + 0x78, 0x41, 0x68, 0x00, 0x78, 0x51, 0x72, 0x00, 0x78, 0x61, 0x7C, 0x00, 0x78, 0x21, 0x54, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xC2, 0x78, 0x31, 0x58, 0x00, 0x78, 0x41, 0x62, 0x00, + 0x78, 0x51, 0x6C, 0x00, 0x78, 0x61, 0x76, 0x00, 0x78, 0x21, 0x4E, 0x00, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x06, 0xA2, 0x78, 0x31, 0x5A, 0x00, 0x78, 0x41, 0x64, 0x00, 0x78, 0x51, 0x6E, 0x00, + 0x78, 0x61, 0x78, 0x00, 0x78, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xD2, + 0x78, 0x31, 0x5C, 0x00, 0x78, 0x41, 0x66, 0x00, 0x78, 0x51, 0x70, 0x00, 0x78, 0x61, 0x7A, 0x00, + 0x78, 0x21, 0x52, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0xBC, 0x00, 0x38, 0x51, + 0xBC, 0x00, 0x38, 0x21, 0xAC, 0x00, 0x06, 0x3A, 0x06, 0x4D, 0x06, 0x6C, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, 0x04, 0x7A, 0x04, 0x8A, 0xA9, 0x71, 0x64, 0x00, 0x06, 0xD8, + 0x38, 0x71, 0xC4, 0x00, 0x38, 0x21, 0xAC, 0x00, 0x20, 0x37, 0xAB, 0x97, 0x00, 0x00, 0x06, 0x72, + 0x06, 0x2A, 0x38, 0xA1, 0xC4, 0x00, 0x28, 0x3A, 0x02, 0x00, 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0xF1, 0xC4, 0x00, 0x06, 0xA2, 0x28, 0x3F, 0x04, 0x00, 0x06, 0x2D, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x06, 0x42, 0x28, 0x35, 0x06, 0x00, 0x38, 0x21, 0xBC, 0x00, + 0xB9, 0x41, 0x34, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, 0xC4, 0x00, 0x06, 0xD2, 0x28, 0x36, + 0x08, 0x00, 0x06, 0x2C, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x38, 0x41, 0x34, 0x01, + 0x06, 0x62, 0x06, 0x3A, 0x06, 0x27, 0x06, 0x5D, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0x38, + 0x4B, 0x9E, 0x00, 0x00, 0x18, 0x69, 0x04, 0x00, 0x86, 0x22, 0x06, 0x76, 0xD7, 0x71, 0x26, 0x79, + 0x24, 0x74, 0x32, 0x02, 0x04, 0x20, 0xA9, 0x27, 0x36, 0x01, 0x06, 0x76, 0x24, 0x71, 0x13, 0x77, + 0xC4, 0x74, 0x99, 0x79, 0x04, 0x00, 0xC2, 0x05, 0x04, 0x75, 0x99, 0x79, 0x04, 0x00, 0xF2, 0x1D, + 0x38, 0x71, 0xC8, 0x00, 0x38, 0x81, 0xC4, 0x00, 0x24, 0x71, 0xC4, 0x7E, 0x24, 0x82, 0xB9, 0x71, + 0xC8, 0x00, 0xB9, 0x81, 0xC4, 0x00, 0x9A, 0xE3, 0xFA, 0xFF, 0x38, 0x71, 0xE0, 0x00, 0x38, 0xA1, + 0xC0, 0x00, 0xCC, 0x70, 0x16, 0x00, 0x24, 0xA2, 0xB9, 0xA1, 0xC0, 0x00, 0x24, 0xB4, 0x82, 0x05, + 0xB9, 0x71, 0xB0, 0x00, 0xFA, 0x98, 0xFA, 0xFF, 0x78, 0x7E, 0xE6, 0x01, 0x78, 0x6E, 0xE4, 0x01, + 0x14, 0x51, 0x26, 0x57, 0xC6, 0x56, 0x12, 0x04, 0x24, 0x71, 0xC6, 0x76, 0x32, 0x07, 0x18, 0x7E, + 0xEA, 0x01, 0x24, 0x71, 0x99, 0x7E, 0xEA, 0x01, 0xF2, 0x03, 0x99, 0x0E, 0xEA, 0x01, 0x38, 0x60, + 0x80, 0x15, 0x14, 0x51, 0xC4, 0x65, 0x26, 0x56, 0x13, 0x55, 0x04, 0x75, 0xD2, 0x02, 0x06, 0x75, + 0x18, 0x5E, 0xEA, 0x01, 0x13, 0x37, 0x0C, 0x40, 0x6C, 0x11, 0x04, 0x70, 0x38, 0x61, 0xB4, 0x00, + 0x73, 0x67, 0xD4, 0x61, 0x92, 0x05, 0xC6, 0x53, 0xC2, 0x03, 0xB1, 0x04, 0x06, 0x56, 0x24, 0x71, + 0xCC, 0x70, 0x16, 0x00, 0x24, 0x44, 0x92, 0xF3, 0x18, 0xBE, 0x04, 0x00, 0x99, 0x5E, 0xEA, 0x01, + 0xC4, 0xB1, 0x92, 0x6D, 0x18, 0xDE, 0x38, 0x01, 0xC4, 0xDB, 0xD2, 0x69, 0x14, 0x61, 0x26, 0x6D, + 0xC4, 0x69, 0x0C, 0xA0, 0x26, 0x01, 0x43, 0x7D, 0x26, 0xAD, 0x0C, 0x90, 0x80, 0x02, 0xD2, 0x12, + 0x14, 0x61, 0x04, 0x31, 0x26, 0x6A, 0x26, 0x3A, 0x26, 0x66, 0x26, 0x33, 0x26, 0x69, 0x26, 0x39, + 0x70, 0x46, 0x70, 0x53, 0xC6, 0x45, 0x02, 0x03, 0xA1, 0x03, 0xF2, 0x04, 0xC6, 0x45, 0x32, 0x02, + 0xA1, 0x06, 0xC4, 0x70, 0x82, 0x18, 0x14, 0x61, 0x26, 0x6A, 0x26, 0x66, 0x26, 0x69, 0x70, 0xC6, + 0x0C, 0x60, 0x11, 0x00, 0x26, 0x6D, 0x26, 0x66, 0x26, 0x6E, 0x28, 0x36, 0x02, 0x00, 0xB9, 0x71, + 0x38, 0x01, 0x06, 0x2C, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x06, 0x82, 0xC4, 0x7B, + 0x82, 0x19, 0xF2, 0x03, 0x06, 0xC7, 0x06, 0x87, 0x04, 0x71, 0x26, 0x7A, 0x0C, 0x60, 0x13, 0x00, + 0x26, 0x77, 0x26, 0x6D, 0x26, 0x79, 0x26, 0x66, 0x70, 0x77, 0x26, 0x6E, 0x28, 0x36, 0x02, 0x00, + 0xB9, 0x71, 0x38, 0x01, 0x06, 0x27, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x26, 0x82, + 0x26, 0xC7, 0x26, 0xAA, 0x26, 0x9A, 0x70, 0x29, 0x2C, 0xD0, 0x12, 0x00, 0x26, 0xC2, 0xC4, 0xC0, + 0x26, 0xDD, 0x26, 0xDE, 0x92, 0x09, 0x28, 0x2D, 0x02, 0x00, 0x04, 0xCA, 0x26, 0x22, 0x06, 0x82, + 0x57, 0x81, 0x26, 0x28, 0xF2, 0x06, 0x28, 0x3D, 0x02, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x26, 0x28, + 0x06, 0x3C, 0x4B, 0x9E, 0x00, 0x00, 0xA9, 0x2E, 0x34, 0x01, 0xF2, 0x05, 0xA9, 0x0E, 0x34, 0x01, + 0xA9, 0x0E, 0x36, 0x01, 0x38, 0xD0, 0x94, 0x15, 0x30, 0x7D, 0xDC, 0x70, 0x80, 0x00, 0x82, 0x67, + 0xC4, 0xB0, 0x92, 0x17, 0xA8, 0x7E, 0x6A, 0x01, 0x82, 0x0B, 0x18, 0x7E, 0x68, 0x01, 0x18, 0x6D, + 0x41, 0x00, 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x68, 0x01, 0xF2, 0x58, 0xB9, 0x0E, + 0x64, 0x01, 0x99, 0x0E, 0x69, 0x01, 0x99, 0x0E, 0x68, 0x01, 0xA9, 0x0E, 0x6A, 0x01, 0xF2, 0x4F, + 0x18, 0xCE, 0x69, 0x01, 0x18, 0x7D, 0x3E, 0x00, 0xC6, 0xC7, 0xB2, 0x11, 0x24, 0xC1, 0x13, 0xCC, + 0x99, 0xCE, 0x69, 0x01, 0x18, 0x7D, 0x3F, 0x00, 0xC6, 0x7C, 0xB2, 0x3F, 0x38, 0x7E, 0x64, 0x01, + 0x28, 0x6E, 0x0C, 0x00, 0x26, 0x76, 0xB9, 0x7E, 0x64, 0x01, 0xF2, 0x37, 0xC6, 0xC7, 0x92, 0x35, + 0x38, 0x7E, 0x64, 0x01, 0x28, 0x2E, 0x0C, 0x00, 0x26, 0x27, 0xB9, 0x2E, 0x64, 0x01, 0x18, 0x3D, + 0x3F, 0x00, 0x3F, 0x33, 0x0C, 0x00, 0x24, 0x31, 0x0B, 0x9B, 0x00, 0x00, 0xA9, 0x0E, 0x6A, 0x01, + 0x28, 0x7D, 0x42, 0x00, 0xB9, 0x2E, 0x64, 0x01, 0x06, 0xA2, 0xC6, 0x27, 0xC2, 0x15, 0x38, 0x71, + 0xDC, 0x00, 0x18, 0x3D, 0x40, 0x00, 0x36, 0x27, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9B, 0x00, 0x00, 0x23, 0x22, 0xA9, 0x2E, 0x6A, 0x01, 0x28, 0x7D, 0x44, 0x00, 0xC6, 0x27, + 0xC2, 0x03, 0xA9, 0x7E, 0x6A, 0x01, 0x18, 0x3D, 0x3F, 0x00, 0x06, 0x2A, 0x3F, 0x33, 0x0C, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0xB9, 0x2E, 0x64, 0x01, 0x99, 0x0E, 0x68, 0x01, 0x0C, 0x40, 0x0D, 0x05, + 0x26, 0x4E, 0x60, 0x44, 0x04, 0xA0, 0xB9, 0x41, 0xA8, 0x00, 0x14, 0xD1, 0x06, 0xCA, 0x0C, 0x90, + 0x16, 0x00, 0xC6, 0xCB, 0x32, 0x56, 0x06, 0x5C, 0xD7, 0x51, 0x26, 0x5E, 0x04, 0x84, 0x26, 0x85, + 0x78, 0x28, 0x36, 0x01, 0xB9, 0x51, 0x2C, 0x01, 0x04, 0x3A, 0x4B, 0x9E, 0x00, 0x00, 0x06, 0x42, + 0xA9, 0x28, 0x36, 0x01, 0x78, 0x28, 0x38, 0x01, 0xB9, 0x41, 0x34, 0x01, 0x04, 0x3A, 0x4B, 0x9E, + 0x00, 0x00, 0x0C, 0x60, 0x34, 0x01, 0x26, 0x68, 0x10, 0x66, 0x38, 0x41, 0x34, 0x01, 0x38, 0x51, + 0x2C, 0x01, 0xB9, 0x61, 0xB0, 0x00, 0x43, 0x22, 0xA9, 0x28, 0x38, 0x01, 0x43, 0x44, 0x0C, 0x70, + 0xAA, 0x14, 0x04, 0x60, 0x78, 0x37, 0x04, 0x00, 0xC6, 0x34, 0x12, 0x0E, 0x78, 0x37, 0x06, 0x00, + 0xC6, 0x34, 0x22, 0x0A, 0x70, 0x37, 0xC6, 0x32, 0x12, 0x07, 0x78, 0x37, 0x02, 0x00, 0xC6, 0x32, + 0x22, 0x03, 0x18, 0x95, 0x39, 0x01, 0x06, 0xF9, 0x38, 0x81, 0xB0, 0x00, 0x57, 0xF2, 0x2F, 0x39, + 0x09, 0x00, 0x3F, 0x33, 0x0F, 0x00, 0x26, 0x38, 0x26, 0x33, 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x3F, + 0x70, 0x33, 0xC6, 0xA3, 0x32, 0x06, 0x33, 0x86, 0xB9, 0x81, 0xA8, 0x00, 0x06, 0xA3, 0x06, 0xDC, + 0x24, 0x61, 0x43, 0x66, 0xC4, 0x62, 0x24, 0x78, 0x92, 0xD6, 0x24, 0xC1, 0x43, 0xCC, 0xF2, 0xAA, + 0xB9, 0xA1, 0xA4, 0x00, 0x98, 0x7E, 0x05, 0x00, 0x38, 0xA1, 0xA8, 0x00, 0xB9, 0xD1, 0xB0, 0x00, + 0x99, 0xAE, 0x0D, 0x05, 0x92, 0x23, 0xC4, 0xB1, 0xC2, 0x21, 0x98, 0x7E, 0x28, 0x03, 0x92, 0x1E, + 0xB8, 0x71, 0xD8, 0x00, 0x82, 0x1B, 0x34, 0x71, 0xD7, 0x71, 0x26, 0x7E, 0x78, 0x57, 0x3A, 0x01, + 0x78, 0x67, 0x3C, 0x01, 0x0C, 0x40, 0x62, 0x01, 0x0C, 0x70, 0x3A, 0x11, 0x26, 0x4E, 0xC6, 0x74, + 0x82, 0x06, 0xA1, 0x07, 0xA9, 0x07, 0x02, 0x00, 0x24, 0x78, 0xF2, 0xFA, 0x04, 0x71, 0x99, 0x7E, + 0x04, 0x00, 0xA9, 0x5E, 0x3A, 0x01, 0xA9, 0x6E, 0x3C, 0x01, 0x28, 0x5E, 0x06, 0x00, 0x04, 0x71, + 0xD6, 0x75, 0x82, 0x1B, 0x18, 0x5E, 0x04, 0x00, 0xC4, 0x51, 0xC2, 0x39, 0xC4, 0xD0, 0x22, 0x37, + 0xC6, 0xD5, 0x32, 0x0E, 0x06, 0x4D, 0x24, 0xD1, 0x06, 0x7D, 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, + 0x38, 0x01, 0xD7, 0x41, 0x26, 0x4E, 0xC9, 0x64, 0x38, 0x01, 0x43, 0xDD, 0xF2, 0xF2, 0x06, 0x75, + 0x34, 0x71, 0x99, 0x7E, 0x04, 0x00, 0xF2, 0x23, 0x04, 0x72, 0xD6, 0x75, 0x82, 0x20, 0x18, 0x4E, + 0x04, 0x00, 0xC4, 0x41, 0xC2, 0x1C, 0xC4, 0xD0, 0x22, 0x1A, 0xC6, 0xD4, 0x32, 0x0E, 0x06, 0x3D, + 0x24, 0xD1, 0x06, 0x7D, 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, 0x38, 0x01, 0xD7, 0x31, 0x26, 0x3E, + 0xC9, 0x63, 0x38, 0x01, 0x43, 0xDD, 0xF2, 0xF2, 0x06, 0x74, 0x34, 0x71, 0x99, 0x7E, 0x04, 0x00, + 0x14, 0x83, 0x06, 0x75, 0x56, 0x78, 0x64, 0x71, 0xA9, 0x7E, 0x06, 0x00, 0x18, 0x7E, 0x04, 0x00, + 0xC4, 0x71, 0xCA, 0x59, 0x01, 0x00, 0x18, 0x7E, 0x56, 0x02, 0x0C, 0x80, 0x00, 0x64, 0xC4, 0x70, + 0x82, 0x03, 0x0C, 0x80, 0x00, 0x94, 0x0C, 0x20, 0x94, 0x00, 0x26, 0x21, 0x04, 0x30, 0x04, 0x4A, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x18, 0xBE, 0x04, 0x00, 0x04, 0xA0, 0x06, 0xDA, 0x04, 0x51, + 0xC6, 0xDB, 0x32, 0x4D, 0x06, 0x9D, 0xD7, 0x91, 0x26, 0x9E, 0x2F, 0x6D, 0x0D, 0x00, 0x2C, 0x90, + 0x38, 0x01, 0x06, 0xCD, 0x26, 0x61, 0xC6, 0xCB, 0x32, 0x3F, 0x06, 0x7C, 0xD7, 0x71, 0x24, 0x74, + 0x2F, 0x47, 0x0E, 0x00, 0x78, 0x39, 0x02, 0x00, 0x78, 0x74, 0x36, 0x01, 0x3F, 0x77, 0x03, 0x00, + 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x78, 0x29, 0x04, 0x00, 0x78, 0x44, 0x38, 0x01, 0x36, 0x24, + 0xC4, 0x20, 0x32, 0x02, 0x16, 0x22, 0x06, 0x32, 0xB9, 0x51, 0x2C, 0x01, 0xB9, 0x61, 0x30, 0x01, + 0xB9, 0x71, 0x38, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x38, 0x01, 0x06, 0x42, 0x06, 0x37, + 0x06, 0x27, 0xB9, 0x41, 0x34, 0x01, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x34, 0x01, 0x38, 0x51, + 0x2C, 0x01, 0x38, 0x61, 0x30, 0x01, 0x26, 0x24, 0xC6, 0x82, 0xC2, 0x0B, 0x28, 0x46, 0x94, 0x00, + 0x06, 0x75, 0x53, 0x7C, 0xC6, 0xDC, 0x66, 0x74, 0xA9, 0x76, 0x94, 0x00, 0x82, 0x02, 0x04, 0xA1, + 0x24, 0xC1, 0x43, 0xCC, 0xF2, 0xC1, 0x24, 0xD1, 0x43, 0xDD, 0xF2, 0xB3, 0xC4, 0xA1, 0x92, 0x04, + 0x99, 0xAE, 0x56, 0x02, 0xF2, 0x03, 0x99, 0x0E, 0x56, 0x02, 0x14, 0x71, 0x26, 0x7B, 0x43, 0x77, + 0x14, 0x21, 0xC6, 0x72, 0x82, 0x23, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x51, 0xA8, 0x65, 0x94, 0x00, + 0x82, 0x1A, 0x04, 0x61, 0x26, 0x67, 0x43, 0x66, 0x06, 0x45, 0xC6, 0x6B, 0x32, 0x14, 0x28, 0x34, + 0x94, 0x00, 0x06, 0x53, 0x63, 0x56, 0xD4, 0x51, 0x82, 0x0B, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x51, + 0x28, 0xF5, 0x94, 0x00, 0x66, 0x3F, 0xA9, 0x34, 0x94, 0x00, 0xA9, 0x05, 0x94, 0x00, 0x24, 0x61, + 0x43, 0x66, 0xF2, 0xEC, 0x34, 0x71, 0x43, 0x77, 0xF2, 0xDD, 0x04, 0xB0, 0x06, 0xCB, 0x18, 0xDE, + 0x04, 0x00, 0xC6, 0xCD, 0x3A, 0x93, 0x00, 0x00, 0x2F, 0x6C, 0x0C, 0x00, 0x26, 0x61, 0xA8, 0x76, + 0x94, 0x00, 0x04, 0x81, 0x26, 0x8C, 0x8A, 0x87, 0x00, 0x00, 0xD7, 0xC1, 0x0C, 0xA0, 0x00, 0x10, + 0x24, 0xC4, 0x26, 0xCA, 0x18, 0x7C, 0x35, 0x01, 0x38, 0xA1, 0xCC, 0x00, 0x78, 0x3C, 0x36, 0x01, + 0x26, 0x77, 0x06, 0x57, 0xD7, 0x51, 0x3F, 0x77, 0x05, 0x00, 0x18, 0x5C, 0x34, 0x01, 0x26, 0x75, + 0x23, 0x77, 0x26, 0x77, 0x26, 0x7A, 0x70, 0xD7, 0xB9, 0x61, 0x30, 0x01, 0x06, 0x2D, 0xAB, 0x97, + 0x00, 0x00, 0x78, 0x3C, 0x38, 0x01, 0x06, 0x92, 0x06, 0x2D, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, + 0x30, 0x01, 0x06, 0xA2, 0x43, 0x78, 0xB9, 0x61, 0xA8, 0x00, 0x0C, 0x40, 0x00, 0x10, 0x18, 0x64, + 0x04, 0x00, 0xC6, 0x76, 0x32, 0x47, 0x38, 0x51, 0xA8, 0x00, 0x28, 0x65, 0x94, 0x00, 0x63, 0x67, + 0xD4, 0x61, 0x82, 0x3D, 0x06, 0x67, 0xD7, 0x61, 0x0C, 0xF0, 0x00, 0x10, 0x24, 0x64, 0x26, 0x6F, + 0x18, 0x56, 0x35, 0x01, 0x0C, 0x40, 0x34, 0x01, 0x26, 0x55, 0x06, 0x35, 0xD7, 0x31, 0x3F, 0x55, + 0x03, 0x00, 0x18, 0x36, 0x34, 0x01, 0x26, 0x46, 0x26, 0x53, 0x38, 0x31, 0xCC, 0x00, 0x23, 0x55, + 0x26, 0x55, 0x26, 0x53, 0x70, 0x55, 0x78, 0x36, 0x36, 0x01, 0xB9, 0x71, 0x38, 0x01, 0x06, 0x25, + 0xB9, 0x41, 0x34, 0x01, 0x26, 0xD5, 0xB9, 0x51, 0x2C, 0x01, 0xB9, 0x61, 0x30, 0x01, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x61, 0x30, 0x01, 0x38, 0x51, 0x2C, 0x01, 0x78, 0x36, 0x38, 0x01, 0x26, 0x92, + 0x06, 0x25, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x34, 0x01, 0x26, 0xA2, 0x04, 0x30, 0x06, 0x24, + 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x38, 0x71, 0x38, 0x01, 0x24, 0x71, 0x43, 0x77, + 0xF2, 0xB5, 0xC4, 0xD0, 0x92, 0x02, 0x04, 0xD1, 0x06, 0x3D, 0x06, 0x29, 0x0B, 0x9B, 0x00, 0x00, + 0xA9, 0x2C, 0x36, 0x01, 0x06, 0x3D, 0x06, 0x2A, 0x24, 0xB1, 0x0B, 0x9B, 0x00, 0x00, 0x23, 0xBB, + 0xA9, 0x2C, 0x38, 0x01, 0x43, 0xC8, 0xFA, 0x6C, 0xFF, 0xFF, 0x34, 0xD1, 0x43, 0xDD, 0x14, 0xC1, + 0x0C, 0xA0, 0x00, 0x10, 0xC6, 0xDC, 0x82, 0x1E, 0x06, 0x7D, 0xD7, 0x71, 0x24, 0x74, 0x0C, 0x50, + 0x00, 0x10, 0x26, 0x75, 0xF8, 0x67, 0x36, 0x01, 0x0C, 0x20, 0x34, 0x01, 0x26, 0x27, 0x92, 0x0F, + 0xF8, 0x77, 0x38, 0x01, 0x92, 0x0C, 0xC4, 0xD3, 0x12, 0x0A, 0x06, 0x3D, 0xD7, 0x31, 0x26, 0x3A, + 0x2C, 0x30, 0x40, 0x01, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x34, 0xD1, 0x43, 0xDD, + 0xF2, 0xE2, 0x0C, 0x60, 0x00, 0x10, 0x18, 0x76, 0x04, 0x00, 0xC6, 0x7B, 0xA2, 0x06, 0x99, 0xB6, + 0x04, 0x00, 0xF2, 0x03, 0x99, 0x0E, 0x56, 0x02, 0x98, 0x7E, 0x0A, 0x05, 0x92, 0x08, 0x28, 0x7E, + 0x06, 0x00, 0xD4, 0x72, 0x82, 0x13, 0xB8, 0x71, 0xB0, 0x00, 0x32, 0x10, 0x38, 0x60, 0x94, 0x15, + 0x18, 0x7E, 0x0B, 0x05, 0x99, 0x0E, 0x04, 0x00, 0x18, 0x66, 0xC4, 0x00, 0xC6, 0x67, 0xD2, 0x03, + 0x99, 0x0E, 0x0A, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x0B, 0x05, 0x18, 0x7E, 0x04, 0x00, 0x99, 0x7E, + 0x05, 0x00, 0x99, 0x7E, 0x1A, 0x00, 0x58, 0xC1, 0x50, 0x01, 0x58, 0x81, 0x40, 0x01, 0x2C, 0x10, + 0x60, 0x01, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xE0, 0x6A, 0x11, 0x98, 0x70, + 0xAD, 0x15, 0x82, 0x04, 0x2C, 0xE0, 0x96, 0x00, 0xF2, 0x06, 0x38, 0x70, 0x94, 0x15, 0x28, 0x77, + 0x1E, 0x00, 0x26, 0xE7, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x04, 0x3E, 0x5C, 0x20, + 0xFF, 0x01, 0x8B, 0xA1, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2D, 0x92, 0x03, 0x2C, 0xE0, + 0x64, 0x00, 0x6B, 0xBA, 0x00, 0x00, 0x06, 0xD2, 0x6B, 0xC7, 0x03, 0x00, 0xC6, 0xDE, 0x04, 0x21, + 0xB2, 0x02, 0x04, 0x20, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x24, 0x00, + 0xD9, 0xC1, 0x14, 0x00, 0x38, 0xE0, 0x94, 0x15, 0xD9, 0x81, 0x04, 0x00, 0x06, 0xD2, 0x04, 0x30, + 0x06, 0x2B, 0x0C, 0x20, 0xB2, 0x10, 0x0C, 0x40, 0x7C, 0x00, 0x0C, 0x90, 0x00, 0x10, 0x0C, 0x80, + 0xCA, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xB0, 0xB2, 0x10, 0x26, 0x89, 0x06, 0xCD, + 0x06, 0xAD, 0x28, 0x4A, 0xE4, 0x01, 0x28, 0x3A, 0xE2, 0x01, 0x28, 0x2A, 0xE0, 0x01, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0x30, 0x6C, 0x3F, 0x22, 0x06, 0x00, 0xB1, 0x2C, 0x18, 0x3E, 0x0B, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x06, 0x62, 0x38, 0x3C, + 0xF0, 0x00, 0x18, 0x2E, 0x0C, 0x00, 0xB1, 0x61, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9B, 0x00, 0x00, 0x30, 0x61, 0x06, 0x42, 0x0C, 0x30, 0x11, 0x00, 0x06, 0x26, 0xB1, 0x41, + 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x5E, 0x14, 0x00, 0x30, 0x41, 0xC6, 0x25, 0x06, 0x62, 0x02, 0x02, + 0x06, 0x65, 0x06, 0x24, 0x0C, 0x30, 0x14, 0x00, 0xB1, 0x61, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x5E, + 0x16, 0x00, 0x30, 0x61, 0xC6, 0x25, 0x02, 0x02, 0x06, 0x25, 0x18, 0x3E, 0x0E, 0x00, 0x3F, 0x22, + 0x06, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0xA1, 0x2B, + 0x24, 0xB2, 0xC6, 0xB8, 0x24, 0xA6, 0x24, 0xC4, 0x92, 0xB5, 0x0C, 0x80, 0xEE, 0x10, 0x2C, 0x90, + 0x16, 0x01, 0x06, 0xCD, 0x06, 0xBD, 0x28, 0x4B, 0x98, 0x02, 0x28, 0x3B, 0x96, 0x02, 0x28, 0x2B, + 0x94, 0x02, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0x38, 0x7C, 0x78, 0x00, 0x3F, 0x22, 0x07, 0x00, + 0xB9, 0x2C, 0x78, 0x00, 0x18, 0x3E, 0x09, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9B, 0x00, 0x00, 0x06, 0x72, 0x38, 0x3C, 0x68, 0x01, 0x18, 0x2E, 0x0A, 0x00, 0xB1, 0x71, + 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x30, 0x71, 0x06, 0x52, + 0x04, 0x39, 0x06, 0x27, 0xB1, 0x51, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x6E, 0x10, 0x00, 0x30, 0x51, + 0xC6, 0x26, 0x06, 0x72, 0x02, 0x02, 0x06, 0x76, 0x06, 0x25, 0x04, 0x3C, 0xB1, 0x71, 0x4B, 0x9E, + 0x00, 0x00, 0x28, 0x6E, 0x12, 0x00, 0x30, 0x71, 0xC6, 0x26, 0x02, 0x02, 0x06, 0x26, 0x18, 0x3E, + 0x0D, 0x00, 0x3F, 0x22, 0x07, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, + 0x00, 0x00, 0xA1, 0x28, 0x24, 0x82, 0xC6, 0x89, 0x24, 0xB6, 0x24, 0xC4, 0x92, 0xB5, 0x28, 0x4D, + 0x16, 0x03, 0x28, 0x3D, 0x14, 0x03, 0x28, 0x2D, 0x12, 0x03, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0x38, 0x7D, 0xCC, 0x00, 0x3F, 0x22, 0x07, 0x00, 0xB9, 0x2D, 0xCC, 0x00, 0x18, 0x3E, 0x18, 0x00, + 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, 0x00, 0x00, 0x38, 0x3D, 0xBC, 0x01, + 0x06, 0xB2, 0x18, 0x2E, 0x19, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9B, + 0x00, 0x00, 0x06, 0xC2, 0x04, 0x39, 0x06, 0x2B, 0x4B, 0x9E, 0x00, 0x00, 0x28, 0x7E, 0x1A, 0x00, + 0x06, 0xD2, 0xC6, 0x27, 0x02, 0x02, 0x06, 0xD7, 0x06, 0x2C, 0x04, 0x3C, 0x4B, 0x9E, 0x00, 0x00, + 0x28, 0x7E, 0x1C, 0x00, 0x0C, 0xA0, 0x00, 0x10, 0xC6, 0x27, 0x02, 0x02, 0x06, 0x27, 0x36, 0xD2, + 0xA9, 0xDA, 0x18, 0x01, 0x58, 0xC1, 0x14, 0x00, 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0xD0, 0x03, 0xD9, 0xC1, 0xC0, 0x03, 0x38, 0xC0, 0x94, 0x15, + 0xD9, 0x81, 0xB0, 0x03, 0x0C, 0xD0, 0x00, 0x10, 0x18, 0x7C, 0xB8, 0x00, 0x18, 0x6D, 0x2E, 0x01, + 0xC6, 0x67, 0x28, 0x7D, 0x06, 0x00, 0xA2, 0x09, 0x6C, 0x70, 0x00, 0x01, 0xA9, 0x7D, 0x06, 0x00, + 0x04, 0x61, 0x99, 0x60, 0xBD, 0x15, 0xF2, 0x06, 0x1C, 0x20, 0x01, 0x01, 0x56, 0x72, 0xA9, 0x7D, + 0x06, 0x00, 0x98, 0x70, 0xAD, 0x15, 0xA9, 0x0D, 0x58, 0x02, 0xA9, 0x0D, 0x5A, 0x02, 0xA9, 0x0D, + 0x5C, 0x02, 0xA9, 0x0D, 0x5E, 0x02, 0xA9, 0x0D, 0x60, 0x02, 0x92, 0x0E, 0x0C, 0x50, 0x30, 0x00, + 0x0C, 0x60, 0x2E, 0x00, 0x26, 0x5C, 0x26, 0x6C, 0x70, 0x55, 0x20, 0x66, 0xB9, 0x51, 0x84, 0x03, + 0xB9, 0x61, 0x70, 0x03, 0xF2, 0x08, 0x0C, 0x70, 0x90, 0x01, 0x04, 0x80, 0xB9, 0x71, 0x70, 0x03, + 0xB9, 0x81, 0x84, 0x03, 0x06, 0x21, 0x0C, 0x30, 0x50, 0x03, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, + 0x06, 0x67, 0x0C, 0x60, 0x98, 0x15, 0x20, 0x76, 0xB9, 0x01, 0x5C, 0x03, 0x04, 0x52, 0xB9, 0x71, + 0xA0, 0x03, 0x28, 0x7D, 0x06, 0x00, 0xB9, 0x01, 0x58, 0x03, 0x26, 0x56, 0x54, 0x78, 0x23, 0x77, + 0x20, 0x55, 0xB9, 0x71, 0x68, 0x03, 0x06, 0x87, 0x0C, 0x80, 0xBA, 0x15, 0x10, 0x78, 0xB9, 0x51, + 0xA4, 0x03, 0x0C, 0x50, 0x74, 0x02, 0x26, 0x5D, 0x20, 0x55, 0xB9, 0x71, 0x9C, 0x03, 0x38, 0x71, + 0x48, 0x03, 0x38, 0x81, 0x4C, 0x03, 0xB9, 0x51, 0x7C, 0x03, 0xB9, 0x71, 0x94, 0x03, 0x0C, 0x40, + 0x78, 0x00, 0x04, 0x70, 0x0C, 0x50, 0x94, 0x02, 0xB9, 0x01, 0x54, 0x03, 0xB9, 0x01, 0x50, 0x03, + 0xB9, 0x01, 0xAC, 0x03, 0xB9, 0x01, 0x78, 0x03, 0xB9, 0x01, 0x80, 0x03, 0xB9, 0x81, 0x90, 0x03, + 0x26, 0x41, 0x26, 0x51, 0xB9, 0x71, 0x60, 0x03, 0xB9, 0x71, 0x98, 0x03, 0xB9, 0x71, 0x74, 0x03, + 0x06, 0xB7, 0xB9, 0x71, 0x64, 0x03, 0x38, 0x21, 0x64, 0x03, 0x06, 0x92, 0x0C, 0xF0, 0x00, 0x07, + 0x26, 0x22, 0x26, 0xF2, 0x0C, 0x60, 0xE0, 0x01, 0x0C, 0x80, 0x80, 0x02, 0x06, 0xE1, 0x26, 0x61, + 0xB9, 0xF1, 0xA8, 0x03, 0xB9, 0x91, 0x6C, 0x03, 0x26, 0x28, 0x04, 0x30, 0x0C, 0xA0, 0x80, 0x02, + 0x20, 0xF2, 0x38, 0x81, 0xA8, 0x03, 0x0C, 0x90, 0xFF, 0x0F, 0x56, 0x9F, 0x2F, 0xF3, 0x03, 0x00, + 0x26, 0xF8, 0x20, 0xFF, 0xB9, 0x91, 0x88, 0x03, 0x0C, 0x90, 0xFF, 0x0F, 0x56, 0x9F, 0x38, 0xF1, + 0x88, 0x03, 0xB9, 0x91, 0x8C, 0x03, 0x38, 0x81, 0xA0, 0x03, 0x36, 0xF9, 0x38, 0x91, 0x6C, 0x03, + 0xC6, 0x89, 0x82, 0x0C, 0x38, 0x81, 0xA4, 0x03, 0xC6, 0x89, 0x82, 0x08, 0xC4, 0x3B, 0x1A, 0x8E, + 0x01, 0x00, 0xCC, 0x70, 0x13, 0x00, 0x1A, 0x86, 0x01, 0x00, 0xC4, 0xF0, 0xA1, 0xF2, 0x2A, 0x94, + 0x00, 0x00, 0xCC, 0x70, 0x13, 0x00, 0x12, 0x1E, 0x30, 0x9E, 0x26, 0x9F, 0xB1, 0x9E, 0x20, 0x96, + 0xC6, 0x9F, 0x32, 0x09, 0x28, 0x86, 0x02, 0x00, 0xA1, 0xF6, 0xA9, 0x96, 0x02, 0x00, 0xA9, 0x86, + 0x04, 0x00, 0xF2, 0x10, 0x28, 0x96, 0x02, 0x00, 0xC6, 0x9F, 0x32, 0x06, 0xA9, 0x96, 0x04, 0x00, + 0xA9, 0xF6, 0x02, 0x00, 0xF2, 0x07, 0x28, 0x96, 0x04, 0x00, 0xC6, 0x9F, 0x32, 0x03, 0xA9, 0xF6, + 0x04, 0x00, 0x30, 0x94, 0x26, 0x9F, 0xB1, 0x94, 0x20, 0x95, 0xC6, 0x9F, 0x32, 0x09, 0x28, 0x85, + 0x02, 0x00, 0xA1, 0xF5, 0xA9, 0x95, 0x02, 0x00, 0xA9, 0x85, 0x04, 0x00, 0xF2, 0x10, 0x28, 0x95, + 0x02, 0x00, 0xC6, 0x9F, 0x32, 0x06, 0xA9, 0x95, 0x04, 0x00, 0xA9, 0xF5, 0x02, 0x00, 0xF2, 0x07, + 0x28, 0x95, 0x04, 0x00, 0xC6, 0x9F, 0x32, 0x03, 0xA9, 0xF5, 0x04, 0x00, 0xC6, 0xFB, 0x02, 0x06, + 0xB9, 0x71, 0x98, 0x03, 0xB9, 0x31, 0x74, 0x03, 0x06, 0xBF, 0xB8, 0x91, 0x68, 0x03, 0x9A, 0x45, + 0x01, 0x00, 0xCC, 0xF0, 0xED, 0x02, 0x0C, 0x90, 0xEE, 0x02, 0x1A, 0x45, 0x01, 0x00, 0xCC, 0xF0, + 0xC8, 0x00, 0x02, 0x06, 0x28, 0x9D, 0x58, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0x58, 0x02, 0xB8, 0x81, + 0x68, 0x03, 0x0C, 0x90, 0x64, 0x00, 0x82, 0x03, 0x0C, 0x90, 0xC8, 0x00, 0xC6, 0xF9, 0x02, 0x06, + 0x28, 0x9D, 0x5A, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0x5A, 0x02, 0xB8, 0x81, 0x68, 0x03, 0x0C, 0x90, + 0x50, 0x00, 0x82, 0x03, 0x0C, 0x90, 0xB4, 0x00, 0xC6, 0xF9, 0x02, 0x06, 0x28, 0x9D, 0x5C, 0x02, + 0x24, 0x91, 0xA9, 0x9D, 0x5C, 0x02, 0xB8, 0x81, 0x68, 0x03, 0x0C, 0x90, 0x64, 0x00, 0x82, 0x03, + 0x0C, 0x90, 0xFA, 0x00, 0xC6, 0xF9, 0x02, 0x06, 0x28, 0x9D, 0x5E, 0x02, 0x24, 0x91, 0xA9, 0x9D, + 0x5E, 0x02, 0xB8, 0x91, 0x9C, 0x03, 0x82, 0x0B, 0xA9, 0x0D, 0x58, 0x02, 0xA9, 0x0D, 0x5A, 0x02, + 0xA9, 0x0D, 0x5C, 0x02, 0xA9, 0x0D, 0x5E, 0x02, 0xA9, 0x0D, 0x60, 0x02, 0x28, 0x9C, 0xB6, 0x00, + 0xC6, 0xF9, 0x1A, 0x0B, 0x01, 0x00, 0x38, 0xF1, 0x8C, 0x03, 0x38, 0x81, 0x88, 0x03, 0x36, 0xF8, + 0xC4, 0xF0, 0x02, 0x28, 0xCC, 0x70, 0x13, 0x00, 0x12, 0x06, 0x38, 0x9E, 0xF0, 0x00, 0x26, 0x9F, + 0xB9, 0x9E, 0xF0, 0x00, 0x38, 0x94, 0xF0, 0x00, 0x26, 0x9F, 0xB9, 0x94, 0xF0, 0x00, 0x28, 0x9C, + 0xB6, 0x00, 0xC6, 0xF9, 0x02, 0x0E, 0x38, 0x81, 0x60, 0x03, 0x26, 0x99, 0xC6, 0xF9, 0x24, 0x81, + 0xB9, 0x81, 0x60, 0x03, 0x02, 0x06, 0x38, 0x91, 0x80, 0x03, 0x24, 0x91, 0xB9, 0x91, 0x80, 0x03, + 0xCC, 0xF0, 0xC8, 0x00, 0x02, 0x07, 0x38, 0xF1, 0x7C, 0x03, 0x24, 0xF1, 0x23, 0xFF, 0xB9, 0xF1, + 0x7C, 0x03, 0x38, 0xF1, 0x6C, 0x03, 0x24, 0x31, 0xC4, 0x3E, 0x24, 0xF1, 0xB9, 0xF1, 0x6C, 0x03, + 0x24, 0x22, 0x24, 0xE4, 0x24, 0x66, 0x9A, 0x0D, 0xFF, 0xFF, 0x38, 0x21, 0x64, 0x03, 0x30, 0x34, + 0x38, 0x61, 0x94, 0x03, 0x38, 0x81, 0x90, 0x03, 0x24, 0x2E, 0x26, 0x36, 0xCC, 0x20, 0x34, 0x01, + 0x38, 0x64, 0xF0, 0x00, 0xB9, 0x21, 0x64, 0x03, 0x24, 0x71, 0x26, 0x68, 0x24, 0x44, 0x24, 0x56, + 0x82, 0x07, 0xB9, 0x31, 0x94, 0x03, 0xB9, 0x61, 0x90, 0x03, 0xFA, 0xDE, 0xFE, 0xFF, 0x38, 0xF1, + 0x78, 0x03, 0x38, 0x21, 0x60, 0x03, 0x38, 0x51, 0x80, 0x03, 0x38, 0x71, 0x7C, 0x03, 0x38, 0x91, + 0xAC, 0x03, 0xB9, 0x31, 0x48, 0x03, 0xB9, 0xF1, 0x5C, 0x03, 0xB9, 0x21, 0x50, 0x03, 0xB9, 0x51, + 0x54, 0x03, 0xA9, 0x7D, 0x74, 0x02, 0xB9, 0x61, 0x4C, 0x03, 0xB9, 0x91, 0x58, 0x03, 0xAB, 0xCA, + 0x03, 0x00, 0x6B, 0xC7, 0x03, 0x00, 0xE8, 0x3D, 0x0D, 0x05, 0x22, 0x33, 0x28, 0x60, 0x98, 0x15, + 0x28, 0x2C, 0xC6, 0x00, 0x26, 0x66, 0x2F, 0x76, 0x0A, 0x00, 0x70, 0x47, 0x04, 0x51, 0xC6, 0x42, + 0x12, 0x02, 0x04, 0x50, 0x04, 0x70, 0xC6, 0x47, 0x13, 0x55, 0x02, 0x02, 0x23, 0x74, 0x0C, 0x80, + 0x98, 0x15, 0x28, 0x48, 0x02, 0x00, 0x26, 0x44, 0x26, 0x4A, 0x70, 0x44, 0xC6, 0x42, 0x02, 0x03, + 0x24, 0x51, 0x13, 0x55, 0xC6, 0x74, 0x32, 0x02, 0x23, 0x74, 0xC4, 0x50, 0x82, 0x12, 0xC4, 0x30, + 0x26, 0x6A, 0x92, 0x03, 0xA1, 0x76, 0xF2, 0x02, 0xA1, 0x06, 0x0C, 0x90, 0x98, 0x15, 0x28, 0x69, + 0x02, 0x00, 0xC4, 0x31, 0x26, 0x66, 0x26, 0xA6, 0x92, 0x03, 0xA1, 0x7A, 0xF2, 0x02, 0xA1, 0x0A, + 0x30, 0x7C, 0x28, 0xEC, 0x2C, 0x00, 0xD4, 0x71, 0xA9, 0xED, 0x0E, 0x00, 0x82, 0x1C, 0x38, 0x31, + 0x48, 0x03, 0x38, 0x21, 0x70, 0x03, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x50, 0x78, 0x0B, 0x9B, + 0x00, 0x00, 0x06, 0xC2, 0x38, 0x31, 0x70, 0x03, 0x38, 0x21, 0x84, 0x03, 0xAB, 0x97, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x22, 0x26, 0x2C, 0xC6, 0x2E, 0xB2, 0x03, + 0xA9, 0x2D, 0x0E, 0x00, 0x06, 0x21, 0x6B, 0xD7, 0x02, 0x00, 0xC4, 0xB0, 0x82, 0x14, 0x38, 0x71, + 0x74, 0x03, 0x26, 0x77, 0x26, 0x7D, 0x78, 0x67, 0xB2, 0x00, 0x38, 0x71, 0x98, 0x03, 0x2C, 0x70, + 0x1E, 0x00, 0x26, 0x77, 0x26, 0x7D, 0x78, 0x77, 0xB2, 0x00, 0x26, 0x76, 0x36, 0xB7, 0xC4, 0xB0, + 0x32, 0x02, 0x04, 0xB0, 0x0C, 0x30, 0x50, 0x03, 0x06, 0x21, 0x26, 0x31, 0xA9, 0xBD, 0x2A, 0x01, + 0xCB, 0x18, 0x03, 0x00, 0x58, 0xC1, 0xC0, 0x03, 0x58, 0x81, 0xB0, 0x03, 0x2C, 0x10, 0xD0, 0x03, + 0xE1, 0xF0, 0xCC, 0x70, 0x15, 0x00, 0x8A, 0x7A, 0xFE, 0xFF, 0x04, 0x90, 0xC6, 0xF9, 0x02, 0x02, + 0x43, 0x9F, 0xA1, 0x92, 0xFA, 0x37, 0xFF, 0xFF, 0xCC, 0xF0, 0x57, 0x02, 0x0C, 0x90, 0x58, 0x02, + 0x0A, 0xBF, 0xFE, 0xFF, 0xC6, 0xF9, 0x0A, 0xEE, 0xFE, 0xFF, 0x28, 0x9D, 0x60, 0x02, 0x24, 0x91, + 0xA9, 0x9D, 0x60, 0x02, 0xFA, 0xE7, 0xFE, 0xFF, 0x26, 0x99, 0x38, 0x81, 0xAC, 0x03, 0xC6, 0xF9, + 0x24, 0x81, 0x02, 0x06, 0x38, 0xF1, 0x78, 0x03, 0x24, 0xF1, 0xB9, 0xF1, 0x78, 0x03, 0xB9, 0x81, + 0xAC, 0x03, 0xFA, 0xEA, 0xFE, 0xFF, 0x00, 0x00, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0xD1, 0x81, 0x0C, 0xE0, 0x80, 0x02, 0x78, 0x7E, 0x4A, 0x02, 0xCC, 0x70, 0x00, 0x01, 0x12, 0x06, + 0x78, 0x7E, 0x48, 0x02, 0xCC, 0x70, 0x00, 0x01, 0x02, 0x0A, 0x0C, 0x60, 0x2C, 0x02, 0x0C, 0x70, + 0x94, 0x04, 0x26, 0x6E, 0xA1, 0x07, 0x24, 0x72, 0xC6, 0x76, 0x92, 0xFD, 0x78, 0xA0, 0x18, 0x11, + 0x06, 0xD7, 0x0C, 0x30, 0xE6, 0x04, 0x0C, 0xD0, 0x18, 0x11, 0x04, 0x20, 0x0C, 0x40, 0x15, 0x00, + 0x14, 0x91, 0x06, 0xFB, 0x0C, 0xF0, 0xCC, 0x10, 0x06, 0x73, 0x04, 0x5D, 0xC4, 0x5B, 0x12, 0x16, + 0xCC, 0x40, 0x13, 0x00, 0x12, 0x08, 0x70, 0x8F, 0x70, 0x6D, 0x70, 0xC7, 0x26, 0x68, 0x3F, 0x66, + 0x0C, 0x00, 0xF2, 0x0D, 0xCC, 0x40, 0x15, 0x00, 0x92, 0x0C, 0x70, 0x67, 0x36, 0x6A, 0xC4, 0x60, + 0x06, 0xC6, 0x32, 0x02, 0x04, 0xC0, 0x26, 0x2C, 0xF2, 0x02, 0x70, 0x67, 0xC4, 0x60, 0x12, 0x03, + 0xA1, 0x07, 0xF2, 0x02, 0xA1, 0x67, 0x34, 0x51, 0xC6, 0x59, 0x34, 0x72, 0x34, 0xF2, 0x92, 0xDF, + 0x34, 0x41, 0xC6, 0x45, 0x3C, 0x30, 0x1C, 0x00, 0x34, 0xD2, 0x92, 0xD4, 0x04, 0x3C, 0x0B, 0x9B, + 0x00, 0x00, 0x0C, 0x70, 0xCC, 0x04, 0x2C, 0xE0, 0x64, 0x02, 0x20, 0x67, 0x36, 0x62, 0xC3, 0x66, + 0x22, 0x03, 0xA1, 0x67, 0xF2, 0x02, 0xA1, 0x07, 0xF8, 0x67, 0x1C, 0x00, 0x32, 0x03, 0xA9, 0x07, + 0x1C, 0x00, 0x24, 0x72, 0xC6, 0x7E, 0x92, 0xF2, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, + 0x20, 0x00, 0xE1, 0xF0, 0xC4, 0x20, 0x0C, 0x70, 0x00, 0x10, 0x28, 0x37, 0x06, 0x00, 0x82, 0x15, + 0x64, 0x38, 0xA9, 0x37, 0x06, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x48, 0xDF, 0xB9, 0x70, + 0x94, 0x15, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xE4, 0xDD, 0xB9, 0x70, 0x90, 0x15, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x70, 0x4C, 0xDD, 0xF2, 0x15, 0x14, 0x29, 0x56, 0x32, 0xA9, 0x37, 0x06, 0x00, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x7C, 0xDE, 0xB9, 0x70, 0x94, 0x15, 0x08, 0x70, 0x00, 0x80, + 0x2C, 0x70, 0x30, 0xDE, 0xB9, 0x70, 0x90, 0x15, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x98, 0xDD, + 0xB9, 0x70, 0x8C, 0x15, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x70, 0x00, 0x10, 0x99, 0x07, 0x31, 0x01, + 0x99, 0x07, 0x30, 0x01, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD2, + 0x38, 0x22, 0x4C, 0x03, 0x06, 0xE3, 0x0C, 0x30, 0xF0, 0x00, 0x38, 0xC0, 0x94, 0x15, 0x0B, 0x9B, + 0x00, 0x00, 0x0C, 0x70, 0x00, 0x10, 0xB9, 0x2D, 0x4C, 0x03, 0x06, 0x32, 0x28, 0x27, 0x06, 0x00, + 0x30, 0x5E, 0x38, 0x4E, 0x08, 0x00, 0x38, 0xFE, 0x04, 0x00, 0x04, 0x68, 0x56, 0x62, 0xA3, 0xD6, + 0x5C, 0x20, 0x80, 0x00, 0x82, 0x18, 0x26, 0x44, 0xC6, 0x54, 0x04, 0x61, 0x12, 0x06, 0xCC, 0x30, + 0xFA, 0x00, 0xD2, 0x02, 0x04, 0x60, 0x13, 0x66, 0xCC, 0xF0, 0x23, 0x00, 0x02, 0x07, 0x38, 0x4E, + 0x0C, 0x00, 0xCC, 0x40, 0x22, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x1D, 0xCC, 0x50, + 0x14, 0x00, 0xF2, 0x18, 0xCC, 0x30, 0x96, 0x00, 0x04, 0x61, 0xD2, 0x02, 0x06, 0x6D, 0xC6, 0x54, + 0x13, 0x66, 0x02, 0x04, 0xC4, 0x58, 0x02, 0x02, 0x04, 0x61, 0xCC, 0xF0, 0x14, 0x00, 0x02, 0x07, + 0x38, 0x4E, 0x0C, 0x00, 0xCC, 0x40, 0x13, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x04, + 0xC4, 0x5A, 0x02, 0x02, 0x04, 0x61, 0x98, 0x50, 0xBA, 0x15, 0x92, 0x12, 0xC4, 0x60, 0x82, 0x10, + 0x18, 0x67, 0x2E, 0x01, 0xCC, 0x60, 0xFF, 0x00, 0x82, 0x04, 0x24, 0x61, 0x99, 0x67, 0x2E, 0x01, + 0x98, 0x67, 0x2F, 0x01, 0x82, 0x17, 0x34, 0x61, 0x99, 0x67, 0x2F, 0x01, 0xF2, 0x13, 0x18, 0x67, + 0x2F, 0x01, 0x24, 0x61, 0x13, 0x66, 0x99, 0x67, 0x2F, 0x01, 0x18, 0x5C, 0xB9, 0x00, 0xC6, 0x56, + 0x92, 0x09, 0x98, 0x67, 0x2E, 0x01, 0x99, 0x07, 0x2F, 0x01, 0x82, 0x04, 0x34, 0x61, 0x99, 0x67, + 0x2E, 0x01, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x70, 0xB1, 0x15, + 0xC4, 0x71, 0x82, 0x07, 0x0C, 0x50, 0x7F, 0x04, 0x0C, 0x60, 0xFE, 0x07, 0x04, 0x70, 0xF2, 0x06, + 0x0C, 0x50, 0x7D, 0x04, 0x0C, 0x60, 0xFC, 0x07, 0x04, 0x72, 0x70, 0x42, 0xC6, 0x47, 0x32, 0x03, + 0xA1, 0x72, 0xF2, 0x04, 0xC6, 0x45, 0x02, 0x02, 0xA1, 0x52, 0x78, 0x52, 0x02, 0x00, 0xC6, 0x57, + 0x32, 0x04, 0xA9, 0x72, 0x02, 0x00, 0xF2, 0x05, 0xC6, 0x56, 0x02, 0x03, 0xA9, 0x62, 0x02, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0xAD, 0x15, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0xD1, 0x81, 0x06, 0xE2, 0x82, 0x06, 0x04, 0x70, 0x0C, 0xA0, 0x64, 0x00, 0x06, 0xB7, 0xF2, 0x05, + 0x04, 0x71, 0x0C, 0xA0, 0x67, 0x00, 0x04, 0xB3, 0x20, 0x6E, 0x23, 0x77, 0x26, 0x67, 0xA1, 0x6E, + 0x28, 0x6E, 0x02, 0x00, 0x06, 0x2E, 0x26, 0x76, 0xA9, 0x7E, 0x02, 0x00, 0x6B, 0x20, 0x03, 0x00, + 0x0C, 0x70, 0x00, 0x10, 0x18, 0x67, 0x2B, 0x03, 0xC4, 0x62, 0x92, 0x08, 0x20, 0x6E, 0xA9, 0x67, + 0x1C, 0x00, 0x28, 0x6E, 0x02, 0x00, 0xA9, 0x67, 0x1E, 0x00, 0x18, 0x67, 0x27, 0x03, 0xC4, 0x61, + 0xD2, 0x11, 0x28, 0xC7, 0x1C, 0x00, 0x1C, 0x60, 0x50, 0x00, 0x26, 0x6C, 0xCC, 0x60, 0xE0, 0x03, + 0xD2, 0x09, 0x28, 0xD7, 0x1E, 0x00, 0x1C, 0x70, 0x50, 0x00, 0x26, 0x7D, 0xCC, 0x70, 0x5F, 0x07, + 0xC2, 0x05, 0x0C, 0xD0, 0xFF, 0x03, 0x0C, 0xC0, 0x40, 0x02, 0xCC, 0xA0, 0x64, 0x00, 0x04, 0x90, + 0x82, 0x04, 0x1C, 0x90, 0x64, 0x00, 0x26, 0x9A, 0x70, 0xAE, 0xC6, 0xAC, 0x3F, 0x7C, 0x0A, 0x00, + 0x32, 0x02, 0x24, 0x71, 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0x82, 0x02, 0x00, 0x26, 0x82, + 0x06, 0x68, 0xC4, 0x20, 0xD7, 0x62, 0x26, 0x86, 0x26, 0x82, 0x82, 0x05, 0x06, 0x39, 0xAB, 0x97, + 0x00, 0x00, 0x26, 0x82, 0x04, 0x71, 0xD6, 0x7B, 0x82, 0x0F, 0x06, 0x28, 0x0C, 0x30, 0x64, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0xC6, 0xAC, 0x22, 0x04, 0x26, 0xC2, 0xA1, 0xCE, 0xF2, 0x05, 0x34, 0xC1, + 0x3F, 0x22, 0x0C, 0x00, 0xA1, 0x2E, 0x78, 0xCE, 0x02, 0x00, 0xC6, 0xCD, 0x3F, 0x7D, 0x0C, 0x00, + 0x32, 0x02, 0x24, 0x71, 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0xA2, 0x02, 0x00, 0x26, 0xA2, + 0x06, 0x6A, 0xC4, 0x20, 0xD7, 0x62, 0x26, 0xA6, 0x26, 0xA2, 0x82, 0x05, 0x06, 0x39, 0xAB, 0x97, + 0x00, 0x00, 0x26, 0xA2, 0xD4, 0xB2, 0x82, 0x11, 0x06, 0x2A, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0x9E, + 0x00, 0x00, 0xC6, 0xCD, 0x22, 0x05, 0x26, 0xD2, 0xA9, 0xDE, 0x02, 0x00, 0xF2, 0x06, 0x34, 0xD1, + 0x3F, 0x22, 0x0D, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, + 0x20, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0x08, 0xC0, 0x00, 0xFF, + 0x0C, 0xE0, 0x3C, 0x15, 0x04, 0xD0, 0x2C, 0xC0, 0xFF, 0x0F, 0x28, 0x70, 0x50, 0x15, 0x63, 0x7D, + 0xD4, 0x71, 0x82, 0x25, 0x30, 0x6E, 0x06, 0x76, 0x77, 0x76, 0x5C, 0x70, 0xFF, 0x0F, 0xA1, 0x71, + 0x18, 0x70, 0xB1, 0x15, 0x5C, 0x60, 0xFF, 0x0F, 0xC4, 0x71, 0xA9, 0x61, 0x02, 0x00, 0x92, 0x04, + 0x06, 0x21, 0xAB, 0x22, 0x03, 0x00, 0x06, 0x21, 0x6B, 0x20, 0x03, 0x00, 0x20, 0x61, 0x30, 0x7E, + 0x5C, 0x60, 0xFF, 0x0F, 0x57, 0x66, 0x56, 0x7C, 0x66, 0x76, 0x28, 0x61, 0x02, 0x00, 0x1C, 0x50, + 0x00, 0x10, 0x5C, 0x60, 0xFF, 0x0F, 0x56, 0x75, 0x66, 0x76, 0xB1, 0x7E, 0x24, 0xD1, 0xC4, 0xD5, + 0x24, 0xE4, 0x92, 0xD4, 0x58, 0xC1, 0x04, 0x00, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0x0C, 0x20, 0x31, 0x15, 0x14, 0x31, 0x04, 0x45, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x2C, 0x15, 0x14, 0x31, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x0C, 0xE0, 0x00, 0x10, 0x38, 0x7E, 0x10, 0x05, 0x18, 0x6E, 0x08, 0x05, 0x77, 0x76, 0x54, 0x7F, + 0xA6, 0x76, 0x82, 0x0E, 0x04, 0x71, 0x99, 0x7E, 0x52, 0x05, 0xB9, 0x0E, 0x38, 0x05, 0x0C, 0x20, + 0x3C, 0x15, 0x04, 0x30, 0x0C, 0x40, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, + 0x08, 0x05, 0xCB, 0xCD, 0x01, 0x00, 0xAB, 0x81, 0x03, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0xB1, 0xB1, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0xDE, + 0x27, 0x03, 0x82, 0x19, 0x06, 0x2C, 0x0C, 0x20, 0xC8, 0x12, 0x0C, 0x30, 0x78, 0x12, 0x0C, 0x40, + 0x50, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x06, 0x2B, 0x0C, 0x20, 0x22, 0x13, 0x0C, 0x30, + 0x1D, 0x13, 0x04, 0x45, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0x27, 0x03, 0x99, 0x7E, + 0x28, 0x03, 0xF2, 0x2A, 0x06, 0x2B, 0x0C, 0x20, 0x22, 0x13, 0x06, 0x3D, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x2C, 0x0C, 0x20, 0xC8, 0x12, 0x06, 0x3D, 0x0C, 0x40, 0x50, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x18, 0x13, 0x06, 0x3D, 0x04, 0x45, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x7E, 0x06, 0x00, 0x99, 0x0E, 0x28, 0x03, 0x1C, 0x60, 0x14, 0x00, + 0x56, 0x76, 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, 0x94, 0x15, 0x99, 0x0E, 0x09, 0x05, 0x18, 0x77, + 0xC5, 0x00, 0x99, 0x7E, 0x0C, 0x05, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x18, 0x7E, + 0x52, 0x05, 0x06, 0xD2, 0x26, 0x72, 0xC4, 0x70, 0x0C, 0x20, 0x10, 0x15, 0x82, 0x0E, 0x0C, 0x30, + 0x38, 0x15, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0x52, 0x05, + 0x26, 0xD7, 0x99, 0xDE, 0x2A, 0x05, 0xF2, 0x14, 0x98, 0x3E, 0x2A, 0x05, 0x82, 0x0C, 0x0C, 0x30, + 0x38, 0x15, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x04, 0x71, 0x99, 0x7E, + 0x52, 0x05, 0xF2, 0x06, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xC2, 0x06, 0xE3, 0x06, 0x23, 0x06, 0x3C, 0xB1, 0xB1, 0x8B, 0xB8, 0x03, 0x00, 0x86, 0x22, + 0x9A, 0x82, 0x00, 0x00, 0xD4, 0xC3, 0x92, 0x05, 0x18, 0x7E, 0x0D, 0x00, 0xC4, 0x76, 0x92, 0x5B, + 0x18, 0x6E, 0x0A, 0x00, 0x14, 0x51, 0x26, 0x56, 0x04, 0x71, 0x53, 0x75, 0x0C, 0x50, 0x00, 0x10, + 0x28, 0x45, 0x50, 0x05, 0x43, 0x77, 0x66, 0x47, 0xA9, 0x45, 0x50, 0x05, 0x38, 0x45, 0x38, 0x05, + 0x1C, 0x30, 0x00, 0x04, 0x66, 0x74, 0x5C, 0x70, 0xFF, 0x03, 0x56, 0x43, 0x66, 0x47, 0x06, 0x74, + 0x77, 0x76, 0x24, 0x71, 0x54, 0x7F, 0x1C, 0x30, 0x01, 0xF0, 0x57, 0x76, 0x56, 0x43, 0x66, 0x47, + 0x57, 0x61, 0xB9, 0x45, 0x38, 0x05, 0x26, 0x65, 0x18, 0x7E, 0x0A, 0x00, 0x38, 0x56, 0x38, 0x05, + 0x08, 0x40, 0xFF, 0x0F, 0x2C, 0x40, 0xFF, 0xFF, 0x57, 0x7E, 0x56, 0x54, 0x66, 0x57, 0xB9, 0x56, + 0x38, 0x05, 0x20, 0x4E, 0x08, 0x70, 0x00, 0xFF, 0x5C, 0x40, 0xFF, 0x0F, 0x2C, 0x70, 0xFF, 0x0F, + 0x57, 0x46, 0x56, 0x75, 0x66, 0x74, 0xB9, 0x76, 0x38, 0x05, 0x28, 0x5E, 0x02, 0x00, 0x1C, 0x40, + 0x00, 0x10, 0x5C, 0x50, 0xFF, 0x0F, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0x38, 0x05, 0x18, 0x5E, + 0x0B, 0x00, 0x13, 0x75, 0xC4, 0x7F, 0xC2, 0x02, 0x04, 0x5F, 0x38, 0x76, 0x38, 0x05, 0x08, 0x40, + 0xFF, 0xF0, 0x54, 0x5F, 0x2C, 0x40, 0xFF, 0xFF, 0x57, 0x5C, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, + 0x38, 0x05, 0xF2, 0x03, 0xC4, 0x7A, 0x82, 0x03, 0x04, 0x20, 0xF2, 0x1D, 0x0C, 0xD0, 0xC8, 0x12, + 0x06, 0x7B, 0x0C, 0x70, 0x00, 0x10, 0x18, 0x77, 0x28, 0x03, 0xC6, 0xC7, 0x32, 0xF6, 0x18, 0x6E, + 0x0A, 0x00, 0x18, 0x7D, 0x0A, 0x00, 0xC6, 0x67, 0x92, 0x0A, 0x06, 0x2E, 0x06, 0x3D, 0x04, 0x44, + 0x6B, 0xCF, 0x03, 0x00, 0x18, 0x7D, 0x0B, 0x00, 0x99, 0x7E, 0x0B, 0x00, 0x24, 0xC1, 0x2C, 0xD0, + 0x10, 0x00, 0xF2, 0xE7, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, + 0x18, 0x72, 0x06, 0x00, 0xD4, 0x74, 0x82, 0x25, 0x0C, 0x40, 0x00, 0x10, 0x38, 0x54, 0x38, 0x05, + 0x08, 0x60, 0x1F, 0xFF, 0x06, 0x75, 0xF7, 0x7A, 0x24, 0x71, 0x54, 0x77, 0x2C, 0x60, 0xFF, 0xFF, + 0xD7, 0x7A, 0x56, 0x65, 0x66, 0x67, 0xB9, 0x64, 0x38, 0x05, 0x18, 0x52, 0x05, 0x00, 0x04, 0x71, + 0x34, 0x51, 0x53, 0x75, 0x06, 0x56, 0x77, 0x58, 0x66, 0x75, 0x08, 0x50, 0xE0, 0xFF, 0x5C, 0x70, + 0x1F, 0x00, 0x2C, 0x50, 0xFF, 0xFF, 0x57, 0x78, 0x56, 0x56, 0x66, 0x57, 0xB9, 0x54, 0x38, 0x05, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x0C, 0x60, 0x00, 0x10, 0x38, 0x76, 0x38, 0x05, + 0x77, 0x76, 0x54, 0x7F, 0xC4, 0x72, 0x02, 0x26, 0x28, 0x46, 0x50, 0x05, 0x04, 0x70, 0x0C, 0x30, + 0x3C, 0x15, 0x06, 0x57, 0x04, 0xF1, 0x06, 0x24, 0x63, 0x25, 0xD4, 0x21, 0x82, 0x0A, 0xC4, 0x71, + 0xC2, 0x07, 0x06, 0x2F, 0x53, 0x25, 0x15, 0x22, 0xB1, 0x03, 0x56, 0x42, 0xF2, 0x02, 0x24, 0x71, + 0x24, 0x51, 0xC4, 0x55, 0x24, 0x34, 0x92, 0xF0, 0x04, 0x5F, 0x56, 0x57, 0x38, 0x76, 0x38, 0x05, + 0xA9, 0x46, 0x50, 0x05, 0x1C, 0x40, 0x01, 0xF0, 0x57, 0x56, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, + 0x38, 0x05, 0x38, 0x76, 0x38, 0x05, 0x0C, 0x50, 0x00, 0xF0, 0xD6, 0x57, 0x82, 0x06, 0x77, 0x76, + 0x54, 0x7F, 0x24, 0x71, 0x99, 0x76, 0x52, 0x05, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x0C, 0xE0, 0x00, 0x10, 0xE8, 0xCE, + 0x31, 0x05, 0x92, 0x2A, 0x98, 0x7E, 0x27, 0x03, 0x82, 0x27, 0x0C, 0x90, 0xC8, 0x02, 0x0C, 0xD0, + 0x78, 0x12, 0x26, 0x9E, 0x06, 0xBC, 0x04, 0x2C, 0x26, 0x2D, 0xEB, 0x25, 0x01, 0x00, 0xC4, 0x20, + 0x82, 0x13, 0xC4, 0xC1, 0xDA, 0x98, 0x00, 0x00, 0x18, 0x7D, 0x0A, 0x00, 0x04, 0xA1, 0x26, 0xAB, + 0x26, 0xBE, 0x99, 0x7B, 0x31, 0x05, 0x04, 0x21, 0x06, 0x3D, 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, + 0x92, 0x04, 0x24, 0xC1, 0xF2, 0x02, 0x06, 0xAB, 0x2C, 0xD0, 0x10, 0x00, 0xC6, 0xD9, 0x8A, 0x83, + 0x00, 0x00, 0x06, 0xBA, 0xF2, 0xE1, 0x98, 0x7E, 0x28, 0x03, 0x92, 0x04, 0x98, 0x7E, 0x27, 0x03, + 0x82, 0x7A, 0x04, 0xD0, 0x06, 0xCD, 0x06, 0xAE, 0x14, 0x91, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, + 0x31, 0x05, 0x34, 0x71, 0xC4, 0x70, 0x32, 0x04, 0x04, 0xC0, 0x06, 0xAE, 0xF2, 0x47, 0x26, 0x7A, + 0x68, 0xB7, 0x1D, 0x03, 0x34, 0xB1, 0xC4, 0xB0, 0x32, 0x1D, 0x68, 0x37, 0x22, 0x03, 0x04, 0x24, + 0x24, 0x34, 0x57, 0x32, 0x26, 0x3A, 0x2C, 0x30, 0x78, 0x02, 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, + 0x92, 0x02, 0x24, 0xD1, 0x06, 0x7C, 0xC4, 0x73, 0x12, 0x09, 0x24, 0x71, 0x2F, 0x67, 0x0E, 0x00, + 0x18, 0x56, 0x31, 0x05, 0x99, 0x56, 0x30, 0x05, 0xF2, 0xF7, 0x99, 0x9E, 0x35, 0x05, 0x34, 0xC1, + 0xF2, 0x12, 0x57, 0xB2, 0x26, 0xBA, 0x2C, 0xB0, 0x78, 0x02, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x25, + 0x01, 0x00, 0xC4, 0x20, 0x82, 0x08, 0x04, 0x22, 0x06, 0x3B, 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, + 0x92, 0x02, 0x24, 0xD1, 0x24, 0xC1, 0xC4, 0xC4, 0x02, 0xC1, 0xF2, 0xC7, 0x57, 0x72, 0x2F, 0x9A, + 0x07, 0x00, 0x0C, 0xB0, 0x78, 0x02, 0x26, 0xB9, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x25, 0x01, 0x00, + 0xC4, 0x20, 0x92, 0x0C, 0x24, 0xC1, 0xC4, 0xC5, 0x82, 0x26, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, + 0x1D, 0x03, 0x34, 0x71, 0xC4, 0x70, 0x32, 0xEB, 0xF2, 0xF6, 0xC4, 0xD1, 0xD2, 0x1C, 0x04, 0x70, + 0x2F, 0x67, 0x0E, 0x00, 0x68, 0x56, 0x31, 0x05, 0x14, 0x41, 0x26, 0x45, 0xC6, 0x4C, 0x82, 0xEB, + 0xC4, 0x50, 0x12, 0x0D, 0x18, 0x79, 0x82, 0x02, 0x04, 0x21, 0x99, 0x76, 0x31, 0x05, 0x06, 0x3B, + 0xCB, 0x3B, 0x03, 0x00, 0xC4, 0x20, 0x92, 0xDF, 0x24, 0xD1, 0xF2, 0xDD, 0x24, 0x71, 0xC4, 0x75, + 0x92, 0xE8, 0xF2, 0xD9, 0x04, 0x70, 0x06, 0x4E, 0x24, 0x71, 0x06, 0x67, 0x2F, 0x34, 0x07, 0x00, + 0x2F, 0x56, 0x0E, 0x00, 0xE8, 0x25, 0x31, 0x05, 0x02, 0x07, 0x68, 0xF3, 0x30, 0x05, 0xC6, 0xF2, + 0x92, 0x03, 0x99, 0x05, 0x31, 0x05, 0x24, 0x61, 0xC4, 0x64, 0x02, 0xF3, 0xC4, 0x74, 0x92, 0xED, + 0xAB, 0x47, 0x03, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x18, 0x20, 0x52, 0x15, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x2C, 0x00, 0x06, 0x21, 0x04, 0x30, + 0x0C, 0x40, 0x14, 0x00, 0xD9, 0xC1, 0x1C, 0x00, 0xC9, 0xA1, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0x7E, 0x52, 0x05, 0x92, 0x0A, 0x98, 0x3E, 0x2A, 0x05, + 0x92, 0x07, 0x0C, 0x20, 0x2C, 0x15, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x98, 0x7E, + 0x52, 0x05, 0x82, 0x66, 0x98, 0x7E, 0x2A, 0x05, 0x82, 0x63, 0x28, 0xDE, 0x50, 0x05, 0x04, 0x71, + 0x08, 0xF0, 0xFF, 0x0F, 0x06, 0x32, 0x0C, 0x30, 0x3C, 0x15, 0x04, 0x40, 0x06, 0xB7, 0x2C, 0xF0, + 0xFF, 0xFF, 0x14, 0x61, 0x26, 0x67, 0x06, 0x5D, 0x63, 0x56, 0x06, 0x65, 0xD4, 0x61, 0x82, 0x26, + 0x13, 0x57, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, 0x68, 0xCC, 0x2C, 0x05, 0x24, 0x61, 0xC6, 0xC7, + 0x82, 0x0C, 0xC4, 0x65, 0x92, 0xF8, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, 0xE8, 0xAC, 0x2C, 0x05, + 0x24, 0x61, 0x92, 0x05, 0x99, 0x7C, 0x2C, 0x05, 0x13, 0x56, 0xF2, 0x03, 0xC4, 0x65, 0x92, 0xF5, + 0x14, 0xC1, 0x26, 0xC5, 0x06, 0x6B, 0x53, 0x6C, 0x66, 0x64, 0x23, 0x46, 0x30, 0x63, 0x57, 0xC1, + 0x57, 0x5E, 0x56, 0x6F, 0x26, 0xC1, 0x66, 0x65, 0xB1, 0x6C, 0x24, 0x71, 0xC4, 0x76, 0x24, 0x34, + 0x92, 0xD1, 0x04, 0x70, 0x06, 0x6D, 0x63, 0x67, 0xD4, 0x61, 0x24, 0x71, 0x92, 0x0D, 0x2F, 0x56, + 0x0E, 0x00, 0x68, 0x35, 0x2C, 0x05, 0xC6, 0x37, 0x92, 0x04, 0x99, 0x05, 0x2C, 0x05, 0xF2, 0x04, + 0x24, 0x61, 0xC4, 0x65, 0x92, 0xF5, 0xC4, 0x75, 0x92, 0xEE, 0x38, 0x7E, 0x38, 0x05, 0x1C, 0x60, + 0x00, 0x04, 0x5C, 0x40, 0xFF, 0x03, 0x56, 0x76, 0x66, 0x74, 0xB9, 0x7E, 0x38, 0x05, 0x0C, 0x20, + 0x3C, 0x15, 0x06, 0x31, 0x0C, 0x40, 0x14, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x58, 0xC1, + 0x1C, 0x00, 0x48, 0xA1, 0x14, 0x00, 0x2C, 0x10, 0x2C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0x7E, 0x07, 0x05, 0x82, 0x18, 0x0C, 0xC0, 0xDE, 0x14, + 0x04, 0xD0, 0x18, 0x7E, 0x07, 0x05, 0xC6, 0xD7, 0x32, 0x07, 0x06, 0x2C, 0x0B, 0x45, 0x03, 0x00, + 0x24, 0xD1, 0x24, 0xC8, 0xF2, 0xF7, 0x38, 0x7E, 0x38, 0x05, 0x08, 0x60, 0xE0, 0x00, 0xD6, 0x76, + 0x82, 0x0E, 0x98, 0x7E, 0x52, 0x05, 0x92, 0x0B, 0xF2, 0x07, 0x98, 0x7E, 0x52, 0x05, 0x92, 0x07, + 0x98, 0x7E, 0x08, 0x05, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7E, 0x52, 0x05, 0x18, 0x7E, 0x07, 0x05, + 0x99, 0x7E, 0x08, 0x05, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x2E, 0x13, 0x04, 0x30, 0x04, 0x4D, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, 0x00, 0x10, 0x14, 0x61, 0x99, 0x67, 0x2F, 0x03, 0x99, 0x67, + 0x2E, 0x03, 0x99, 0x67, 0x31, 0x03, 0x99, 0x67, 0x30, 0x03, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x41, 0x34, 0x14, 0xB1, 0xF1, 0x02, 0x0A, 0xCC, 0x40, 0x11, 0x00, 0x14, 0x72, 0x26, 0x74, + 0x13, 0x77, 0x0C, 0xF0, 0x13, 0x00, 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, + 0x08, 0x60, 0x00, 0x30, 0x2C, 0x60, 0x00, 0xA0, 0xC6, 0x7F, 0xD2, 0x17, 0x06, 0x47, 0x57, 0x42, + 0x2F, 0x57, 0x07, 0x00, 0x3F, 0x55, 0x04, 0x00, 0x26, 0x53, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, + 0x5C, 0x50, 0xFF, 0x7F, 0xC6, 0x25, 0xB2, 0x06, 0x04, 0x61, 0x99, 0x60, 0x36, 0x13, 0x04, 0x21, + 0xF2, 0x05, 0x24, 0x71, 0x23, 0x77, 0xF2, 0xE9, 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0xC4, 0x41, 0x34, 0x14, 0xB1, 0xF1, 0x02, 0x08, 0xC4, 0x4B, 0x14, 0x72, 0x26, 0x74, 0x13, 0x77, + 0x04, 0xFD, 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, 0x26, 0x33, 0x06, 0x63, + 0xD7, 0x61, 0x3F, 0x33, 0x06, 0x00, 0x08, 0x60, 0x00, 0x30, 0x2C, 0x60, 0x00, 0xA0, 0xC6, 0x7F, + 0xD2, 0x12, 0x2F, 0x57, 0x03, 0x00, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, 0x5C, 0x50, 0xFF, 0x7F, + 0xC6, 0x25, 0xB2, 0x06, 0x04, 0x61, 0x99, 0x60, 0x36, 0x13, 0x04, 0x21, 0xF2, 0x05, 0x24, 0x71, + 0x23, 0x77, 0xF2, 0xEE, 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x3C, 0x10, 0x28, 0x00, + 0xD9, 0xC1, 0x18, 0x00, 0xD9, 0x81, 0x08, 0x00, 0x6B, 0xBA, 0x00, 0x00, 0x0C, 0xE0, 0x00, 0x10, + 0x28, 0x7E, 0x22, 0x00, 0xB1, 0x21, 0xC4, 0x7F, 0xC2, 0x12, 0x98, 0x70, 0xBA, 0x15, 0x82, 0x0F, + 0x38, 0x7E, 0x38, 0x05, 0x5C, 0x70, 0x00, 0xF0, 0xCC, 0x70, 0x00, 0x10, 0x92, 0x08, 0x04, 0x71, + 0x99, 0x7E, 0x38, 0x03, 0x99, 0x0E, 0x35, 0x03, 0x99, 0x7E, 0x36, 0x03, 0x18, 0x7E, 0x33, 0x03, + 0xC4, 0x72, 0xC2, 0x08, 0x04, 0x71, 0x99, 0x0E, 0x35, 0x03, 0x99, 0x7E, 0x36, 0x03, 0x99, 0x0E, + 0x38, 0x03, 0x98, 0x7E, 0x38, 0x03, 0x82, 0x12, 0x98, 0x7E, 0x37, 0x03, 0x82, 0x0F, 0x98, 0x7E, + 0x36, 0x03, 0x82, 0x0C, 0x04, 0x71, 0x99, 0x0E, 0x38, 0x03, 0x99, 0x7E, 0x35, 0x03, 0x99, 0x0E, + 0x36, 0x03, 0x8B, 0x3E, 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x98, 0x7E, 0x36, 0x03, 0x9A, 0xC8, + 0x00, 0x00, 0x98, 0x7E, 0x35, 0x03, 0x9A, 0xC4, 0x00, 0x00, 0x18, 0x7E, 0x32, 0x03, 0xC4, 0x71, + 0x9A, 0xBF, 0x00, 0x00, 0x18, 0x7E, 0x05, 0x00, 0xC4, 0x71, 0x9A, 0xBA, 0x00, 0x00, 0x18, 0x6E, + 0x81, 0x02, 0x18, 0x5E, 0x80, 0x02, 0xC4, 0x60, 0x82, 0x08, 0xCC, 0x60, 0x13, 0x00, 0x14, 0x71, + 0x26, 0x76, 0x13, 0xB7, 0x82, 0x07, 0xF2, 0x02, 0x06, 0xB6, 0x04, 0xA1, 0x26, 0xA6, 0x13, 0xAA, + 0xF2, 0x04, 0x0C, 0xB0, 0x12, 0x00, 0x06, 0xA6, 0xC4, 0x50, 0x82, 0x07, 0xC4, 0x5B, 0x14, 0xC1, + 0x26, 0xC5, 0x13, 0xCC, 0x82, 0x07, 0xF2, 0x02, 0x06, 0xC5, 0x04, 0x91, 0x26, 0x95, 0x13, 0x99, + 0xF2, 0x03, 0x04, 0xCA, 0x06, 0x95, 0x26, 0x66, 0x06, 0x46, 0xD7, 0x41, 0x3F, 0x66, 0x04, 0x00, + 0x26, 0x56, 0x08, 0x80, 0x00, 0x30, 0x57, 0x51, 0x2C, 0x80, 0x00, 0xA0, 0x26, 0x58, 0x30, 0xD5, + 0x04, 0x50, 0x5C, 0xD0, 0xFF, 0x7F, 0xC6, 0xBA, 0xD2, 0x66, 0x30, 0x31, 0x28, 0x2E, 0x60, 0x01, + 0x06, 0xFB, 0x2F, 0x6B, 0x0B, 0x00, 0x57, 0xF2, 0x36, 0xF6, 0x23, 0x33, 0x06, 0x6C, 0xC6, 0x69, + 0xD2, 0x56, 0x2F, 0x46, 0x0F, 0x00, 0x57, 0x41, 0x26, 0x48, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x7F, + 0xC6, 0x42, 0xA2, 0x4A, 0xC6, 0x43, 0x92, 0x48, 0x18, 0x4E, 0x81, 0x02, 0xC6, 0x4B, 0x92, 0x05, + 0x18, 0x5E, 0x80, 0x02, 0xC6, 0x56, 0x82, 0x3B, 0x18, 0x6E, 0x34, 0x03, 0x04, 0x51, 0xD6, 0x56, + 0x82, 0x13, 0x18, 0x3E, 0x80, 0x02, 0x24, 0x32, 0x13, 0x33, 0xC4, 0x3B, 0xC2, 0x07, 0x18, 0x6E, + 0x34, 0x03, 0x04, 0x54, 0xD6, 0x56, 0x92, 0x10, 0xF2, 0x1C, 0x06, 0x2D, 0x0B, 0x66, 0x03, 0x00, + 0xC4, 0x20, 0x82, 0xF6, 0xF2, 0x27, 0xD4, 0x62, 0x82, 0xF3, 0x18, 0x3E, 0x80, 0x02, 0x06, 0x2D, + 0x34, 0x32, 0x13, 0x33, 0xF2, 0xF4, 0x18, 0x3E, 0x81, 0x02, 0x24, 0x32, 0x13, 0x33, 0xCC, 0x30, + 0x13, 0x00, 0xC2, 0x05, 0x98, 0x6E, 0x36, 0x03, 0x82, 0x12, 0xF2, 0x14, 0x06, 0x2D, 0xF2, 0x08, + 0xD4, 0x68, 0x82, 0xF9, 0x18, 0x3E, 0x81, 0x02, 0x06, 0x2D, 0x34, 0x32, 0x13, 0x33, 0x18, 0x4E, + 0x80, 0x02, 0x0B, 0x69, 0x03, 0x00, 0xC4, 0x20, 0x92, 0x05, 0xF2, 0xED, 0x04, 0x61, 0x99, 0x6E, + 0x35, 0x03, 0x04, 0x51, 0xF2, 0x04, 0x24, 0x61, 0x13, 0x66, 0xF2, 0xAA, 0x04, 0x71, 0x26, 0x7B, + 0x13, 0xB7, 0xF2, 0x9A, 0x98, 0x7E, 0x35, 0x03, 0x82, 0x0D, 0x18, 0x7E, 0x3A, 0x03, 0xC4, 0x71, + 0x92, 0x09, 0xB9, 0x51, 0x04, 0x00, 0x8B, 0x3E, 0x01, 0x00, 0x8B, 0x30, 0x03, 0x00, 0x38, 0x51, + 0x04, 0x00, 0x98, 0x7E, 0x35, 0x03, 0x92, 0x0C, 0xC4, 0x50, 0x92, 0x0A, 0x30, 0x61, 0x28, 0x7E, + 0x60, 0x01, 0x23, 0xB6, 0xC6, 0x7B, 0xD2, 0x04, 0x04, 0x71, 0x99, 0x7E, 0x36, 0x03, 0x38, 0x6E, + 0x38, 0x05, 0x06, 0x76, 0x5C, 0x60, 0x00, 0xF0, 0x77, 0x76, 0xCC, 0x60, 0x00, 0x10, 0x54, 0x7F, + 0x99, 0x7E, 0x3A, 0x03, 0x92, 0x11, 0x18, 0x6E, 0x31, 0x03, 0x28, 0x7E, 0x80, 0x02, 0xCC, 0x60, + 0xFF, 0x00, 0xA9, 0x7E, 0x2E, 0x03, 0x92, 0x08, 0x18, 0x6E, 0x30, 0x03, 0xCC, 0x60, 0xFF, 0x00, + 0x92, 0x03, 0xA9, 0x7E, 0x30, 0x03, 0x58, 0xC1, 0x18, 0x00, 0x58, 0x81, 0x08, 0x00, 0x2C, 0x10, + 0x28, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0x60, 0x00, 0x10, 0x2C, 0x20, + 0x44, 0x00, 0xA8, 0xD6, 0x50, 0x05, 0x57, 0x22, 0x2F, 0xE6, 0x02, 0x00, 0x14, 0x71, 0xA9, 0x7E, + 0x04, 0x00, 0xA9, 0x7E, 0x06, 0x00, 0xA9, 0x7E, 0x08, 0x00, 0xA9, 0x7E, 0x0A, 0x00, 0xA1, 0x0E, + 0xA9, 0x0E, 0x02, 0x00, 0x92, 0x0F, 0x0C, 0x20, 0x98, 0x14, 0x06, 0x3D, 0x04, 0x48, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xA0, 0x14, 0x06, 0x3D, 0x04, 0x4A, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0xA9, 0x0E, 0x0C, 0x00, 0xA9, 0x0E, 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, 0xAB, 0x7E, 0x03, 0x00, + 0x24, 0xE1, 0xC4, 0xE5, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x3C, 0x10, 0x18, 0x00, + 0xB9, 0x31, 0x04, 0x00, 0xD9, 0xC1, 0x08, 0x00, 0x28, 0xD1, 0x04, 0x00, 0xB1, 0x21, 0x23, 0xC2, + 0xC6, 0x4D, 0x28, 0x31, 0x02, 0x00, 0x28, 0xE1, 0x06, 0x00, 0x32, 0x03, 0x43, 0x2E, 0xF2, 0x11, + 0xC6, 0x4C, 0x22, 0x03, 0x43, 0x23, 0xF2, 0x0D, 0x3F, 0x2D, 0x04, 0x00, 0x36, 0x3E, 0xAB, 0x97, + 0x00, 0x00, 0x43, 0x22, 0x3F, 0x3D, 0x0C, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x26, 0x2E, 0x43, 0x22, + 0x58, 0xC1, 0x08, 0x00, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x94, 0x15, + 0x3C, 0x10, 0x78, 0x00, 0xD9, 0xC1, 0x68, 0x00, 0xD9, 0x81, 0x58, 0x00, 0x30, 0x77, 0xDC, 0x70, + 0x00, 0x08, 0x8A, 0xB8, 0x02, 0x00, 0xC4, 0x30, 0x92, 0x0C, 0xC4, 0x20, 0x9A, 0xB3, 0x02, 0x00, + 0xA8, 0x70, 0x50, 0x15, 0x9A, 0xAF, 0x02, 0x00, 0xAB, 0x81, 0x03, 0x00, 0xFA, 0xAB, 0x02, 0x00, + 0x98, 0x70, 0xBA, 0x15, 0x0C, 0xE0, 0x00, 0x10, 0x82, 0x2C, 0x28, 0x7E, 0x22, 0x00, 0xC4, 0x79, + 0xC2, 0x0E, 0x0C, 0x70, 0x20, 0x00, 0xA9, 0x7E, 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, 0xA9, 0x7E, + 0x90, 0x04, 0xA9, 0x0E, 0x96, 0x04, 0x0C, 0x70, 0x50, 0x00, 0xF2, 0x34, 0xC4, 0x75, 0xC2, 0x0E, + 0x0C, 0x70, 0x20, 0x00, 0xA9, 0x7E, 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, 0xA9, 0x7E, 0x90, 0x04, + 0xA9, 0x0E, 0x96, 0x04, 0x0C, 0x70, 0x64, 0x00, 0xF2, 0x25, 0x0C, 0x70, 0x10, 0x00, 0xA9, 0x7E, + 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, 0xA9, 0x7E, 0x90, 0x04, 0xA9, 0x0E, 0x96, 0x04, 0xF2, 0x18, + 0x98, 0x7E, 0x56, 0x02, 0x92, 0xD7, 0x28, 0x7E, 0x06, 0x00, 0x0C, 0x60, 0x10, 0x00, 0xD6, 0x67, + 0x92, 0xD1, 0xD4, 0x78, 0x0C, 0x70, 0x20, 0x00, 0xA9, 0x7E, 0x94, 0x04, 0x0C, 0x70, 0xA0, 0x00, + 0xA9, 0x7E, 0x90, 0x04, 0x0C, 0x70, 0x1E, 0x00, 0xA9, 0x7E, 0x96, 0x04, 0x82, 0x2F, 0x0C, 0x70, + 0x96, 0x00, 0xA9, 0x7E, 0x92, 0x04, 0x0C, 0x70, 0x44, 0x14, 0xB9, 0x71, 0x1C, 0x00, 0x0C, 0x70, + 0x46, 0x14, 0xB9, 0x71, 0x18, 0x00, 0x0C, 0x70, 0xA0, 0x14, 0xB9, 0x71, 0x34, 0x00, 0x0C, 0x70, + 0x90, 0x14, 0xB9, 0x71, 0x0C, 0x00, 0x0C, 0x70, 0x48, 0x14, 0xB9, 0x71, 0x30, 0x00, 0x08, 0x60, + 0x00, 0xFF, 0x04, 0x50, 0x0C, 0x70, 0x4A, 0x14, 0x2C, 0x60, 0xFF, 0x0F, 0x06, 0xDE, 0xB9, 0x71, + 0x2C, 0x00, 0xB9, 0x51, 0x04, 0x00, 0xB9, 0x51, 0x14, 0x00, 0xB9, 0x51, 0x40, 0x00, 0xB9, 0x51, + 0x3C, 0x00, 0x06, 0xB5, 0xB9, 0x61, 0x38, 0x00, 0xF2, 0x04, 0x0C, 0x70, 0xC8, 0x00, 0xF2, 0xD2, + 0x28, 0x7E, 0x50, 0x05, 0x63, 0x7B, 0xD4, 0x71, 0x92, 0x06, 0x06, 0x2B, 0xAB, 0x7E, 0x03, 0x00, + 0xFA, 0xF5, 0x01, 0x00, 0x04, 0x71, 0x26, 0x7B, 0x57, 0x71, 0x26, 0x7E, 0x38, 0x67, 0x38, 0x05, + 0x06, 0x76, 0x77, 0x76, 0x5C, 0x70, 0xFF, 0x0F, 0x43, 0x57, 0x5C, 0x60, 0xFF, 0x0F, 0xB9, 0x51, + 0x24, 0x00, 0x43, 0x56, 0xB9, 0x51, 0x28, 0x00, 0xF8, 0x5D, 0x44, 0x04, 0x32, 0x20, 0x38, 0x51, + 0x24, 0x00, 0x38, 0x41, 0x1C, 0x00, 0xA1, 0x54, 0x38, 0x51, 0x28, 0x00, 0x38, 0x41, 0x18, 0x00, + 0xA1, 0x54, 0x38, 0x51, 0x24, 0x00, 0x38, 0x41, 0x30, 0x00, 0xA1, 0x54, 0x38, 0x51, 0x28, 0x00, + 0x38, 0x41, 0x2C, 0x00, 0xA1, 0x54, 0x38, 0x41, 0x0C, 0x00, 0xA9, 0x0D, 0x40, 0x04, 0xA9, 0x0D, + 0x42, 0x04, 0x04, 0x51, 0x99, 0x54, 0x10, 0x00, 0x99, 0x54, 0x11, 0x00, 0x78, 0x5D, 0x48, 0x04, + 0x36, 0x75, 0xB9, 0x71, 0x08, 0x00, 0x78, 0x7D, 0x4A, 0x04, 0xB8, 0xA1, 0x08, 0x00, 0x36, 0x67, + 0xB9, 0x61, 0x10, 0x00, 0x32, 0x02, 0x16, 0xAA, 0x38, 0x51, 0x10, 0x00, 0x86, 0x65, 0xB9, 0x51, + 0x20, 0x00, 0x32, 0x04, 0x16, 0x76, 0xB9, 0x71, 0x20, 0x00, 0x38, 0x51, 0x20, 0x00, 0x43, 0x2A, + 0x43, 0x35, 0x0C, 0xF0, 0x80, 0x00, 0xF1, 0xF0, 0x98, 0x70, 0xBA, 0x15, 0x06, 0x82, 0xB9, 0x71, + 0x44, 0x00, 0x82, 0x26, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, 0x06, 0x48, 0x6B, 0x82, + 0x03, 0x00, 0x28, 0x7E, 0x22, 0x00, 0x06, 0x92, 0xC4, 0x77, 0xC2, 0x0C, 0x06, 0x78, 0xF7, 0x7F, + 0x2F, 0x48, 0x07, 0x00, 0xE7, 0x40, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, 0x43, 0x44, + 0xF2, 0x0B, 0x04, 0x33, 0x2F, 0x28, 0x08, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x42, 0x38, 0x3E, + 0x94, 0x04, 0x38, 0x2E, 0x90, 0x04, 0x6B, 0x82, 0x03, 0x00, 0x06, 0xC2, 0xF2, 0x36, 0x98, 0x7E, + 0x56, 0x02, 0x92, 0x06, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x0C, 0x86, 0x88, + 0x32, 0x02, 0x24, 0x83, 0x06, 0x48, 0x67, 0x41, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, + 0x43, 0x44, 0xF2, 0x1F, 0x28, 0x7E, 0x22, 0x00, 0xC4, 0x77, 0xC2, 0x16, 0x04, 0x33, 0x26, 0x22, + 0x4B, 0x9E, 0x00, 0x00, 0x43, 0x42, 0x38, 0x3E, 0x94, 0x04, 0x38, 0x2E, 0x90, 0x04, 0x6B, 0x82, + 0x03, 0x00, 0x06, 0xC2, 0x38, 0x3E, 0x94, 0x04, 0x38, 0x2E, 0x90, 0x04, 0x06, 0x48, 0x6B, 0x82, + 0x03, 0x00, 0x06, 0x92, 0xF2, 0x0A, 0x38, 0x2E, 0x90, 0x04, 0x38, 0x3E, 0x94, 0x04, 0x06, 0x48, + 0x6B, 0x82, 0x03, 0x00, 0x06, 0xC2, 0x06, 0x92, 0x18, 0x7E, 0x2B, 0x03, 0xC4, 0x72, 0xD2, 0x0B, + 0x0C, 0x70, 0x50, 0x00, 0xA9, 0x0E, 0x9A, 0x04, 0xA9, 0x0E, 0x98, 0x04, 0xA9, 0x7E, 0x9E, 0x04, + 0xA9, 0x7E, 0x9C, 0x04, 0x38, 0x60, 0x94, 0x15, 0x78, 0x2E, 0x98, 0x04, 0x18, 0x56, 0xB3, 0x00, + 0x18, 0x76, 0xB5, 0x00, 0x18, 0x66, 0xB4, 0x00, 0xB9, 0x51, 0x4C, 0x00, 0x06, 0x35, 0x2F, 0x86, + 0x05, 0x00, 0x26, 0x87, 0xB9, 0x71, 0x54, 0x00, 0xB9, 0x61, 0x50, 0x00, 0xAB, 0x97, 0x00, 0x00, + 0x38, 0x61, 0x50, 0x00, 0x06, 0x42, 0x78, 0x2E, 0x9C, 0x04, 0xB9, 0x41, 0x48, 0x00, 0x06, 0x36, + 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, 0x38, 0x41, 0x48, 0x00, 0x06, 0x39, 0x26, 0x42, + 0x06, 0x27, 0xB9, 0x41, 0x48, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x41, 0x48, 0x00, 0x43, 0x22, + 0x26, 0x24, 0x06, 0x38, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x51, 0x4C, 0x00, 0x43, 0x92, 0x78, 0x2E, + 0x9A, 0x04, 0x06, 0x35, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x61, 0x50, 0x00, 0x06, 0x52, 0x78, 0x2E, + 0x9E, 0x04, 0xB9, 0x51, 0x4C, 0x00, 0x06, 0x36, 0xAB, 0x97, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, + 0x38, 0x51, 0x4C, 0x00, 0x06, 0x3C, 0x26, 0x52, 0x06, 0x27, 0xB9, 0x51, 0x4C, 0x00, 0xAB, 0x97, + 0x00, 0x00, 0x38, 0x51, 0x4C, 0x00, 0x43, 0x22, 0x26, 0x25, 0x06, 0x38, 0x4B, 0x9E, 0x00, 0x00, + 0x43, 0x72, 0x06, 0x39, 0x06, 0x2A, 0xB9, 0x71, 0x54, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0x9E, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, 0x06, 0x62, 0x06, 0x82, 0x38, 0x21, + 0x20, 0x00, 0xB9, 0x61, 0x50, 0x00, 0x06, 0x37, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0xB8, 0x51, 0x44, 0x00, 0x38, 0x61, 0x50, 0x00, 0x38, 0x71, 0x54, 0x00, + 0x06, 0xC2, 0x92, 0x10, 0xC4, 0x60, 0x92, 0x05, 0xC4, 0xA4, 0x04, 0x81, 0x12, 0x02, 0x06, 0x85, + 0xC4, 0xC0, 0x92, 0x08, 0x38, 0x51, 0x20, 0x00, 0x04, 0x61, 0xC4, 0x54, 0x12, 0x02, 0x06, 0x6C, + 0x06, 0xC6, 0x38, 0x51, 0x04, 0x00, 0x06, 0x69, 0xC6, 0x95, 0x32, 0x02, 0x06, 0x65, 0x38, 0x51, + 0x14, 0x00, 0x43, 0x66, 0xC6, 0x75, 0xB9, 0x61, 0x04, 0x00, 0x06, 0x67, 0x32, 0x02, 0x06, 0x65, + 0x43, 0x66, 0xB9, 0x61, 0x14, 0x00, 0x38, 0x41, 0x0C, 0x00, 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, + 0x10, 0x00, 0x68, 0x54, 0x10, 0x00, 0x15, 0xA6, 0xF7, 0xAF, 0x33, 0x6A, 0xC6, 0x56, 0x15, 0x97, + 0xF7, 0x9F, 0x33, 0x79, 0x92, 0x04, 0x04, 0x51, 0xB9, 0x51, 0x3C, 0x00, 0x38, 0x41, 0x0C, 0x00, + 0x68, 0x54, 0x11, 0x00, 0xC6, 0x57, 0x92, 0x04, 0x04, 0x51, 0xB9, 0x51, 0x40, 0x00, 0x38, 0x51, + 0x34, 0x00, 0x04, 0x44, 0x91, 0x65, 0x2F, 0x6B, 0x0B, 0x00, 0x26, 0x6E, 0x99, 0x76, 0xA1, 0x04, + 0x0C, 0x60, 0x48, 0x04, 0x26, 0x6D, 0x06, 0x36, 0x06, 0x21, 0xB9, 0x61, 0x08, 0x00, 0x6B, 0xCF, + 0x03, 0x00, 0x6B, 0xBA, 0x00, 0x00, 0x18, 0x7E, 0x2C, 0x03, 0xC4, 0x71, 0x20, 0x71, 0xD2, 0x19, + 0x28, 0x6E, 0x60, 0x01, 0x23, 0x22, 0xC6, 0x62, 0xC2, 0x14, 0x98, 0x6E, 0x35, 0x03, 0x92, 0x11, + 0x78, 0x6D, 0x40, 0x04, 0xC6, 0x68, 0x02, 0x05, 0xB8, 0x51, 0x3C, 0x00, 0x82, 0x02, 0x06, 0x86, + 0x78, 0x6D, 0x42, 0x04, 0xC6, 0x6C, 0x02, 0x05, 0xB8, 0x51, 0x40, 0x00, 0x82, 0x02, 0x06, 0xC6, + 0xC4, 0xA0, 0x92, 0x02, 0x16, 0x88, 0x23, 0x88, 0xC4, 0x90, 0x26, 0x87, 0xA1, 0x81, 0x28, 0x71, + 0x02, 0x00, 0x92, 0x02, 0x16, 0xCC, 0x23, 0xCC, 0x26, 0xC7, 0x06, 0x21, 0xA9, 0xC1, 0x02, 0x00, + 0x6B, 0x20, 0x03, 0x00, 0x78, 0x7D, 0x48, 0x04, 0x70, 0xA1, 0x3F, 0x77, 0x0A, 0x00, 0xC4, 0x70, + 0x32, 0x02, 0x16, 0x77, 0xA9, 0x7D, 0x40, 0x04, 0x78, 0xC1, 0x02, 0x00, 0x78, 0x7D, 0x4A, 0x04, + 0x3F, 0x77, 0x0C, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0xA9, 0x7D, 0x42, 0x04, 0x38, 0x61, + 0x24, 0x00, 0x38, 0x71, 0x1C, 0x00, 0x38, 0x51, 0x28, 0x00, 0x38, 0x21, 0x08, 0x00, 0xA1, 0x67, + 0x38, 0x61, 0x18, 0x00, 0x04, 0x44, 0xA1, 0x56, 0x06, 0x31, 0x6B, 0xCF, 0x03, 0x00, 0x04, 0x71, + 0x26, 0x7B, 0x57, 0x71, 0x2F, 0x67, 0x0E, 0x00, 0x38, 0x76, 0x38, 0x05, 0x38, 0x51, 0x38, 0x00, + 0x5C, 0xA0, 0xFF, 0x0F, 0x57, 0xA6, 0x56, 0x75, 0x66, 0x7A, 0x1C, 0x40, 0x00, 0x10, 0x5C, 0xC0, + 0xFF, 0x0F, 0x56, 0x74, 0x66, 0x7C, 0xB9, 0x76, 0x38, 0x05, 0x38, 0x51, 0x1C, 0x00, 0x38, 0x61, + 0x18, 0x00, 0x38, 0x71, 0x34, 0x00, 0x2C, 0x50, 0x10, 0x00, 0x2C, 0x60, 0x10, 0x00, 0x24, 0x72, + 0xB9, 0x51, 0x1C, 0x00, 0xB9, 0x61, 0x18, 0x00, 0x38, 0x51, 0x0C, 0x00, 0x38, 0x61, 0x30, 0x00, + 0xB9, 0x71, 0x34, 0x00, 0x38, 0x71, 0x2C, 0x00, 0x24, 0xB1, 0xC4, 0xB5, 0x24, 0x52, 0x2C, 0x60, + 0x10, 0x00, 0x2C, 0x70, 0x10, 0x00, 0xB9, 0x51, 0x0C, 0x00, 0xB9, 0x61, 0x30, 0x00, 0xB9, 0x71, + 0x2C, 0x00, 0x2C, 0xD0, 0x10, 0x00, 0x9A, 0xDD, 0xFD, 0xFF, 0x38, 0x7E, 0x98, 0x04, 0x38, 0x41, + 0x04, 0x00, 0x38, 0x51, 0x14, 0x00, 0xB9, 0x7E, 0x9C, 0x04, 0xA9, 0x4E, 0x98, 0x04, 0xA9, 0x5E, + 0x9A, 0x04, 0x58, 0xC1, 0x68, 0x00, 0x58, 0x81, 0x58, 0x00, 0x2C, 0x10, 0x78, 0x00, 0xE1, 0xF0, + 0x0C, 0x70, 0xAA, 0x14, 0x04, 0x60, 0x78, 0x57, 0x04, 0x00, 0x24, 0x61, 0xC6, 0x25, 0x22, 0x0E, + 0x78, 0x57, 0x06, 0x00, 0xC6, 0x25, 0x12, 0x0A, 0x70, 0x57, 0xC6, 0x35, 0x22, 0x07, 0x78, 0x57, + 0x02, 0x00, 0xC6, 0x35, 0x12, 0x03, 0x13, 0x26, 0xF2, 0x06, 0x13, 0x66, 0xC4, 0x62, 0x24, 0x78, + 0x92, 0xEB, 0x04, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0xB1, 0xB1, 0x0C, 0xE0, 0x00, 0x10, 0x28, 0x7E, 0x06, 0x00, 0x18, 0xCE, 0x07, 0x05, 0xD4, 0x71, + 0x06, 0xD2, 0x06, 0xB3, 0x92, 0x3F, 0x38, 0x60, 0x94, 0x15, 0x18, 0x7E, 0x0C, 0x05, 0x18, 0x66, + 0xC5, 0x00, 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0x0C, 0x05, 0xF2, 0x33, 0x18, 0x72, + 0x0A, 0x00, 0xD7, 0xC1, 0x2C, 0xC0, 0x34, 0x00, 0x26, 0xCE, 0x0C, 0x20, 0xAA, 0x04, 0x99, 0x7C, + 0xAE, 0x04, 0x26, 0x2C, 0x06, 0x3D, 0x04, 0x44, 0x6B, 0xCF, 0x03, 0x00, 0x99, 0xBC, 0xAF, 0x04, + 0x18, 0x7D, 0x0D, 0x00, 0x04, 0x62, 0x99, 0x7C, 0xB0, 0x04, 0x18, 0x7E, 0x07, 0x05, 0x24, 0x71, + 0x99, 0x7E, 0x07, 0x05, 0x18, 0x7D, 0x0D, 0x00, 0xD6, 0x67, 0x82, 0x14, 0x04, 0x64, 0xD6, 0x67, + 0x82, 0x09, 0x04, 0x71, 0x99, 0x7E, 0x09, 0x05, 0x99, 0x0E, 0x0A, 0x05, 0x99, 0x0E, 0x0B, 0x05, + 0xF2, 0x09, 0xDC, 0x70, 0x18, 0x00, 0x82, 0x06, 0x04, 0x71, 0x99, 0x0E, 0x09, 0x05, 0x99, 0x7E, + 0x0A, 0x05, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE2, 0x06, 0x63, 0x70, 0x22, 0x78, 0x3E, 0x02, 0x00, + 0x0C, 0xD0, 0x00, 0x10, 0x0C, 0x40, 0xBA, 0x04, 0x0C, 0x50, 0xAA, 0x14, 0x26, 0x4D, 0x04, 0x70, + 0x78, 0xF5, 0x04, 0x00, 0xC6, 0xF2, 0x12, 0x0D, 0x78, 0xF5, 0x06, 0x00, 0xC6, 0x2F, 0x12, 0x09, + 0x70, 0xF5, 0xC6, 0xF3, 0x12, 0x06, 0x78, 0xF5, 0x02, 0x00, 0xC6, 0x3F, 0x12, 0x02, 0x04, 0x71, + 0x24, 0x58, 0xC6, 0x54, 0x92, 0xEE, 0xC4, 0x70, 0x82, 0x77, 0xC4, 0x61, 0x82, 0x09, 0xC4, 0x61, + 0xA2, 0x6F, 0xC4, 0x62, 0x82, 0x1E, 0xC4, 0x64, 0x82, 0x44, 0xFA, 0xAF, 0x00, 0x00, 0x18, 0x6D, + 0x09, 0x05, 0x14, 0x71, 0xC4, 0x60, 0x9A, 0xAA, 0x00, 0x00, 0x8B, 0xB1, 0x03, 0x00, 0x86, 0xC2, + 0x82, 0x09, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x06, 0x3C, 0x4B, 0xB3, 0x03, 0x00, + 0xF2, 0x04, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0xCE, 0x0E, 0x00, 0xFA, 0x96, 0x00, 0x00, + 0x18, 0x7E, 0x0D, 0x00, 0x04, 0x61, 0xD6, 0x67, 0x82, 0x0B, 0xD4, 0x76, 0x82, 0x06, 0x04, 0x7A, + 0x99, 0x7E, 0x0D, 0x00, 0xFA, 0x84, 0x00, 0x00, 0x0C, 0x70, 0x12, 0x00, 0xF2, 0x42, 0x04, 0x62, + 0xD6, 0x67, 0x14, 0x71, 0x8A, 0x83, 0x00, 0x00, 0x8B, 0xB1, 0x03, 0x00, 0x86, 0x32, 0x82, 0x0A, + 0x98, 0x7E, 0x0E, 0x00, 0x92, 0x07, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x3E, 0x0E, 0x00, + 0xF2, 0x04, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0xF2, 0x6D, + 0x18, 0x7E, 0x0D, 0x00, 0x04, 0x61, 0xD6, 0x67, 0x92, 0xD9, 0x04, 0x62, 0xD6, 0x67, 0x14, 0x71, + 0x82, 0x65, 0x8B, 0xB1, 0x03, 0x00, 0x86, 0x22, 0x18, 0x3E, 0x0E, 0x00, 0x82, 0x11, 0xC4, 0x30, + 0x82, 0x11, 0xC6, 0x23, 0x04, 0x7A, 0x82, 0x03, 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, + 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0xF2, 0x06, 0xC4, 0x30, + 0x92, 0xF4, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0E, 0x0E, 0x00, 0xF2, 0x46, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0xF2, 0x42, 0xC4, 0x61, 0x82, 0x08, 0xC4, 0x61, 0xA2, 0x3A, 0xC4, 0x62, + 0x82, 0x09, 0xC4, 0x64, 0x82, 0x1B, 0xF2, 0x3A, 0x99, 0x6E, 0x0D, 0x00, 0x99, 0x0D, 0x0C, 0x05, + 0xF2, 0x35, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, 0x82, 0x15, 0x98, 0x3E, 0x0E, 0x00, 0x82, 0x08, + 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0x04, 0x71, + 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0x0C, 0x05, 0xF2, 0x18, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, + 0x92, 0x07, 0x04, 0x71, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0x0C, 0x05, 0xF2, 0x10, 0x98, 0x3E, + 0x0E, 0x00, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x82, 0x07, 0x04, 0x7A, 0x99, 0x7E, 0x0D, 0x00, + 0x06, 0x2E, 0x4B, 0xB3, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0x04, 0x70, 0xF2, 0x06, + 0x04, 0x62, 0x99, 0x6E, 0x0D, 0x00, 0xF2, 0x02, 0x14, 0x71, 0x28, 0x5D, 0x06, 0x00, 0x04, 0x63, + 0xD6, 0x65, 0x92, 0x07, 0x18, 0x6E, 0x0D, 0x00, 0x54, 0x63, 0x66, 0x65, 0xA9, 0x6D, 0x06, 0x00, + 0x50, 0xC1, 0x06, 0x27, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x40, 0xBF, 0x15, + 0xC4, 0x40, 0x28, 0x50, 0x98, 0x15, 0x06, 0x37, 0x0C, 0x70, 0x00, 0x10, 0x82, 0x07, 0x0C, 0x60, + 0x80, 0x0B, 0x26, 0x55, 0x26, 0x56, 0x20, 0x65, 0xF2, 0x0A, 0x08, 0x60, 0x00, 0x30, 0x57, 0x51, + 0x2C, 0x60, 0x00, 0xA0, 0x26, 0x65, 0x30, 0x66, 0x5C, 0x60, 0xFF, 0x7F, 0xC4, 0x40, 0xA9, 0x67, + 0x10, 0x00, 0x06, 0x63, 0x0C, 0x60, 0x98, 0x15, 0x28, 0x66, 0x02, 0x00, 0x92, 0x0B, 0x08, 0x50, + 0x00, 0x30, 0x57, 0x61, 0x2C, 0x50, 0x00, 0xA0, 0x26, 0x56, 0x30, 0x65, 0x5C, 0x60, 0xFF, 0x7F, + 0xF2, 0x06, 0x26, 0x66, 0x0C, 0x50, 0x80, 0x0B, 0x26, 0x65, 0x20, 0x66, 0xA9, 0x67, 0x12, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x18, 0x00, 0xC1, 0xA1, 0x38, 0xB0, 0x94, 0x15, 0xD9, 0xC1, + 0x08, 0x00, 0x30, 0x7B, 0xDC, 0x70, 0x00, 0x40, 0x82, 0x06, 0x0C, 0xC0, 0xFF, 0x7F, 0x0C, 0xE0, + 0x80, 0x0B, 0xF2, 0x05, 0x0C, 0xC0, 0xFF, 0x0F, 0x0C, 0xE0, 0x80, 0x02, 0x28, 0xA0, 0x06, 0x10, + 0x2C, 0xE0, 0x14, 0x02, 0x54, 0xA8, 0x23, 0xAA, 0x04, 0xD0, 0xC4, 0xD1, 0xC2, 0x05, 0x14, 0x7A, + 0x26, 0x7D, 0xC4, 0x71, 0xD2, 0x0F, 0xC4, 0xA0, 0x92, 0x0A, 0x70, 0x7E, 0x26, 0x77, 0x06, 0x67, + 0x57, 0x61, 0x26, 0x76, 0x06, 0x27, 0x57, 0x22, 0x36, 0x27, 0xF2, 0x09, 0x70, 0x2E, 0x26, 0x22, + 0xF2, 0x0A, 0x70, 0x2E, 0x28, 0x3B, 0xC0, 0x00, 0xAB, 0x97, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x4B, 0x9E, 0x00, 0x00, 0xC4, 0x20, 0x32, 0x03, 0xA1, 0x0E, 0xF2, 0x06, 0xC6, 0x2C, 0x02, 0x03, + 0xA1, 0xCE, 0xF2, 0x02, 0xA1, 0x2E, 0x24, 0xD1, 0xC4, 0xDC, 0x24, 0xE2, 0x92, 0xD7, 0x58, 0xC1, + 0x08, 0x00, 0x40, 0xA1, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x04, 0x70, 0xC6, 0x74, + 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, + 0xF2, 0xF7, 0xE1, 0xF0, 0x71, 0x00, 0xF2, 0xFF, 0x66, 0x00, 0x33, 0x01, 0x00, 0x02, 0xCC, 0x02, + 0x99, 0x03, 0x66, 0x04, 0x33, 0x05, 0xFF, 0x05, 0xCC, 0x06, 0x99, 0x07, 0x60, 0x00, 0x20, 0x01, + 0xE0, 0x01, 0xA0, 0x02, 0x60, 0x03, 0x20, 0x04, 0xC6, 0x23, 0x06, 0x72, 0x32, 0x02, 0x06, 0x73, + 0x43, 0x27, 0xE1, 0xF0, 0xC6, 0x23, 0x22, 0x07, 0xC6, 0x24, 0x06, 0x72, 0x32, 0x02, 0x06, 0x74, + 0x43, 0x27, 0xF2, 0x06, 0xC6, 0x34, 0x06, 0x23, 0x32, 0x02, 0x06, 0x24, 0x43, 0x22, 0xE1, 0xF0, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE5, 0x06, 0xD6, 0x6B, 0x04, 0x00, 0x00, 0x06, 0x3E, + 0x06, 0x4D, 0x6B, 0x04, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x24, 0x00, + 0xC6, 0x23, 0x06, 0x72, 0x02, 0x02, 0x06, 0x73, 0x43, 0x27, 0xE1, 0xF0, 0x26, 0x23, 0xE1, 0xF0, + 0x26, 0x23, 0x26, 0x24, 0xE1, 0xF0, 0x24, 0x00, 0x26, 0x32, 0x26, 0x43, 0x26, 0x54, 0x2F, 0x26, + 0x05, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, + 0x2F, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, 0xF2, 0xF7, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, + 0x77, 0x41, 0x04, 0x70, 0x14, 0x61, 0x34, 0x41, 0xC6, 0x46, 0x82, 0x09, 0x2F, 0x57, 0x03, 0x00, + 0x30, 0xF5, 0x2F, 0x57, 0x02, 0x00, 0xB1, 0xF5, 0x24, 0x74, 0xF2, 0xF6, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x24, 0x00, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x06, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x36, + 0x24, 0x71, 0xF2, 0xFA, 0xE1, 0xF0, 0x24, 0x00, 0x77, 0x41, 0x14, 0x71, 0x34, 0x41, 0xC6, 0x47, + 0x82, 0x04, 0xB1, 0x32, 0x24, 0x24, 0xF2, 0xFB, 0xE1, 0xF0, 0x24, 0x00, 0x77, 0x31, 0x14, 0x71, + 0x34, 0x31, 0xC6, 0x37, 0x82, 0x04, 0xB1, 0x02, 0x24, 0x24, 0xF2, 0xFB, 0xE1, 0xF0, 0x24, 0x00, + 0x08, 0x50, 0x00, 0x30, 0x0C, 0x70, 0xCC, 0x4D, 0x0C, 0x40, 0xFC, 0x48, 0x0C, 0x60, 0x66, 0x09, + 0x26, 0x75, 0x26, 0x45, 0x30, 0x57, 0x34, 0x74, 0xC6, 0x74, 0x77, 0x58, 0xA1, 0x56, 0x34, 0x62, + 0x92, 0xFA, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0xCC, 0xA4, + 0x0C, 0x60, 0x33, 0x01, 0x0C, 0xE0, 0x80, 0x0B, 0x0C, 0x20, 0x80, 0x02, 0x14, 0x41, 0x30, 0xF7, + 0x2F, 0x56, 0x06, 0x00, 0x2F, 0x3E, 0x05, 0x00, 0xA1, 0xF3, 0x1C, 0x30, 0x00, 0x57, 0x26, 0x37, + 0x30, 0x33, 0x34, 0x61, 0xC6, 0x64, 0x26, 0x52, 0xA1, 0x35, 0x34, 0x74, 0x92, 0xF1, 0x40, 0xE1, + 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x1E, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, + 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, 0xE1, 0xF0, 0x24, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x90, 0x60, 0xB9, 0x27, 0x00, 0x60, + 0xB9, 0x37, 0x04, 0x60, 0xB9, 0x07, 0x08, 0x60, 0x38, 0x67, 0x90, 0x60, 0xD4, 0x61, 0x82, 0xFD, + 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x24, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x00, 0x60, + 0x04, 0x60, 0xC6, 0x65, 0x2F, 0x23, 0x06, 0x00, 0x82, 0x0D, 0xB9, 0x27, 0x04, 0x60, 0x30, 0x24, + 0xB9, 0x27, 0x08, 0x60, 0x38, 0x27, 0x90, 0x60, 0xD4, 0x22, 0x82, 0xFD, 0x24, 0x61, 0x24, 0x44, + 0xF2, 0xF1, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0x00, 0xDE, + 0xB9, 0x67, 0x10, 0x60, 0x77, 0x31, 0x0C, 0x60, 0x90, 0x01, 0xB9, 0x67, 0x00, 0x60, 0x77, 0x21, + 0x34, 0x31, 0x08, 0x60, 0x00, 0x13, 0xB9, 0x27, 0x04, 0x60, 0x66, 0x36, 0xB9, 0x37, 0x14, 0x60, + 0x08, 0x50, 0x00, 0x10, 0x38, 0x67, 0x14, 0x60, 0x0C, 0x40, 0x14, 0x60, 0xD6, 0x65, 0x26, 0x47, + 0x92, 0xFA, 0x38, 0xE7, 0x18, 0x60, 0xB1, 0x04, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, + 0xB9, 0x07, 0x10, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0E, 0x16, 0x0C, 0x14, + 0x01, 0x15, 0xFF, 0xFF, 0xFF, 0x00, 0x80, 0x04, 0xFF, 0x07, 0x02, 0x00, 0x03, 0x02, 0x67, 0x00, + 0x67, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, + 0x08, 0x07, 0x01, 0xC8, 0xC8, 0x00, 0x00, 0x02, 0x01, 0x46, 0x01, 0x02, 0x08, 0x07, 0x14, 0x14, + 0xFF, 0xFF, 0xFF, 0x0C, 0x0D, 0xFF, 0xFF, 0xFF, 0xC8, 0x32, 0x00, 0x00, 0xC8, 0x32, 0x00, 0x00, + 0xC8, 0x32, 0x00, 0x00, 0xA0, 0x86, 0x01, 0x00, 0x80, 0x96, 0x98, 0x00, 0xE8, 0x03, 0x00, 0x00, + 0x0A, 0x00, 0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, + 0x01, 0x00, 0x5A, 0x00, 0x01, 0x00, 0x0A, 0x00, 0xA0, 0x0F, 0x64, 0x64, 0x64, 0x01, 0x50, 0x35, + 0x04, 0x05, 0x02, 0x0A, 0x06, 0x00, 0x30, 0x00, 0xC8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, + 0xA0, 0x00, 0x20, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x96, 0x00, 0x2C, 0x01, 0x00, 0x00, + 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x96, 0x00, 0x26, 0x26, 0x00, 0x00, 0x60, 0x40, 0x14, 0x00, + 0x40, 0x20, 0x12, 0x00, 0x60, 0x40, 0x14, 0x00, 0x60, 0x4A, 0x12, 0x00, 0x40, 0x20, 0x12, 0x00, + 0x40, 0x38, 0x12, 0x00, 0x45, 0x38, 0x12, 0x00, 0x42, 0x38, 0x12, 0x00, 0x40, 0x40, 0x00, 0x00, + 0x63, 0x07, 0x03, 0x00, 0x61, 0x07, 0x05, 0x00, 0x61, 0x57, 0x03, 0x00, 0x61, 0x07, 0x05, 0x00, + 0x61, 0x57, 0x03, 0x00, 0x63, 0x07, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x0E, 0x00, 0x0E, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x66, 0x7F, 0xF0, 0x07, + 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, + 0x66, 0x7F, 0xF0, 0x07, 0xFF, 0x3F, 0x01, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, + 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x10, 0x3F, 0x10, 0x3F, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x08, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0xB9, 0x00, 0x00, + 0x50, 0x50, 0x05, 0x00, 0x50, 0x64, 0x00, 0x64, 0x00, 0x64, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x2C, 0x01, 0x00, 0x00, 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x2C, 0x01, 0x1E, 0x00, 0x90, 0x01, + 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0x3C, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0A, 0x02, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, + 0xF4, 0x01, 0x01, 0x01, 0x0A, 0x00, 0x1E, 0x00, 0xBC, 0x02, 0xFA, 0xFA, 0x0A, 0x00, 0x96, 0x00, + 0x00, 0x05, 0x04, 0x0A, 0x05, 0x06, 0x32, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1E, 0x03, 0x14, 0x00, + 0x20, 0x03, 0xDC, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x28, 0x00, 0x14, 0x00, 0x0A, 0x00, 0xE0, 0x01, + 0x05, 0x04, 0x01, 0x01, 0x01, 0x00, 0x80, 0x00, 0xD0, 0x00, 0x80, 0x01, 0x20, 0x00, 0x80, 0x00, + 0x60, 0x01, 0x30, 0x00, 0x50, 0x00, 0xA0, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, + 0x02, 0x06, 0x01, 0x04, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, + 0x18, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0xA0, 0x00, 0x64, 0x00, 0x03, 0x00, 0x00, 0x2D, + 0x2D, 0x0A, 0x96, 0x00, 0x0A, 0x0A, 0x30, 0x00, 0x05, 0x0A, 0x01, 0x00, 0x2C, 0x01, 0xC8, 0x00, + 0x05, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x00, 0x00, 0x9D, 0xF9, 0x00, 0x00, 0x50, 0x50, 0x05, 0x00, + 0x50, 0x64, 0x00, 0x64, 0x00, 0x64, 0x64, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x2C, 0x01, 0x00, 0x00, + 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x90, 0x01, 0x64, 0x00, 0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, + 0x58, 0x02, 0x00, 0x00, 0x08, 0x00, 0x90, 0x01, 0x00, 0x00, 0x46, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x0A, 0x02, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, 0xF4, 0x01, 0x01, 0x01, + 0x28, 0x00, 0x64, 0x00, 0xD0, 0x07, 0xFF, 0xFF, 0x0A, 0x00, 0x96, 0x00, 0x00, 0x05, 0x04, 0x0A, + 0x05, 0x06, 0x50, 0x00, 0x00, 0x00, 0x00, 0x14, 0x1E, 0x03, 0x14, 0x00, 0x20, 0x03, 0xDC, 0x05, + 0xC8, 0x00, 0x14, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0xE0, 0x01, 0x05, 0x04, 0x01, 0x01, + 0x01, 0x00, 0x80, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x20, 0x00, 0x80, 0x00, 0x60, 0x01, 0x30, 0x00, + 0x50, 0x00, 0xA0, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, 0x02, 0x03, 0x02, 0x04, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, + 0x20, 0x00, 0x20, 0x00, 0xA0, 0x00, 0x64, 0x00, 0x03, 0x00, 0x00, 0x2D, 0x2D, 0x0A, 0x96, 0x00, + 0x0A, 0x0A, 0x30, 0x00, 0x05, 0x0A, 0x01, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0x05, 0x05, 0xC8, 0x00, + 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0D, 0x58, 0x00, 0x00, 0x16, 0x0E, 0x15, 0x0E, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0xB9, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x96, 0x00, 0x26, 0x26, 0x00, 0x00, 0x54, 0xFF, 0x0F, 0x00, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0x2C, 0x01, 0x38, 0x48, 0x10, 0x10, 0x01, 0x00, 0x08, 0x00, + 0xC8, 0x00, 0xC8, 0x10, 0x63, 0x07, 0x03, 0x00, 0xFF, 0x3F, 0x00, 0x00, 0x26, 0x05, 0x00, 0x00, + 0x64, 0xC0, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, + 0x00, 0x00, 0x80, 0x00, 0xFF, 0x0F, 0xFF, 0x0F, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x2C, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xE2, 0x00, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x08, 0x00, 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, + 0x2C, 0x01, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x34, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAC, 0x0D, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x7F, 0xF0, 0x07, + 0xDC, 0xC5, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x07, 0x41, 0x06, 0x00, + 0xB8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x84, 0x40, 0x00, 0x15, 0xF3, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x3F, 0x00, 0x88, 0xBF, 0x01, 0x20, 0x00, 0x00, + 0x0C, 0x0D, 0x0E, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, + 0x1E, 0x21, 0x22, 0x23, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0C, + 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0xFF, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x4E, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x48, 0x26, 0x22, 0x00, + 0x4C, 0x27, 0x26, 0x01, 0x4A, 0x27, 0x24, 0x01, 0x48, 0x2A, 0x22, 0x04, 0x48, 0x2B, 0x22, 0x05, + 0x48, 0x2C, 0x22, 0x06, 0x48, 0x2D, 0x22, 0x07, 0x48, 0x2E, 0x22, 0x08, 0x4C, 0x26, 0x26, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4C, 0x26, 0x26, 0x00, 0x46, 0x27, 0x20, 0x01, 0xFF, 0xF7, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x26, 0x07, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 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, + 0x46, 0x1E, 0x09, 0x0F, 0x46, 0x1E, 0x09, 0x0F, 0x44, 0x16, 0x09, 0x0F, 0x4E, 0x3E, 0x09, 0x0F, + 0x3E, 0xFE, 0x08, 0x0E, 0x3F, 0x02, 0x09, 0x0E, 0x37, 0xDE, 0x08, 0x0E, 0x3E, 0xFE, 0x08, 0x0E, + 0x40, 0x02, 0x09, 0x0D, 0x57, 0x5E, 0x09, 0x0D, 0x43, 0x0E, 0x09, 0x0D, 0x47, 0x1E, 0x09, 0x0D, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x7E, 0xFE, 0x09, 0x13, 0x88, 0x26, 0x0A, 0x13, + 0x86, 0x1E, 0x0A, 0x13, 0x96, 0x5E, 0x0A, 0x13, 0x7C, 0xF6, 0x09, 0x12, 0x81, 0x06, 0x0A, 0x12, + 0x6E, 0xBA, 0x09, 0x12, 0x76, 0xDE, 0x09, 0x12, 0x7E, 0xFE, 0x09, 0x11, 0x95, 0x56, 0x0A, 0x11, + 0x7A, 0xEE, 0x09, 0x11, 0x82, 0x0A, 0x0A, 0x11, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x62, 0x8A, 0x19, 0x13, 0x67, 0x9E, 0x19, 0x13, 0x6A, 0xAA, 0x19, 0x13, 0x7C, 0xF6, 0x19, 0x13, + 0x69, 0xA6, 0x19, 0x12, 0x70, 0xC2, 0x19, 0x12, 0x60, 0x86, 0x19, 0x12, 0x65, 0x96, 0x19, 0x12, + 0x66, 0x9E, 0x19, 0x11, 0x72, 0xCE, 0x19, 0x11, 0x61, 0x86, 0x19, 0x11, 0x64, 0x96, 0x19, 0x11, + 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, 0x4D, 0x36, 0x19, 0x13, 0x52, 0x4E, 0x19, 0x13, + 0x52, 0x4E, 0x19, 0x13, 0x64, 0x96, 0x19, 0x13, 0x53, 0x4E, 0x19, 0x12, 0x59, 0x66, 0x19, 0x12, + 0x4C, 0x36, 0x19, 0x12, 0x50, 0x46, 0x19, 0x12, 0x4F, 0x3E, 0x19, 0x11, 0x5B, 0x6E, 0x19, 0x11, + 0x4C, 0x36, 0x19, 0x11, 0x4E, 0x3E, 0x19, 0x11, 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, + 0x50, 0x42, 0x19, 0x13, 0x54, 0x56, 0x19, 0x13, 0x56, 0x5E, 0x19, 0x13, 0x66, 0x9E, 0x19, 0x13, + 0x56, 0x5E, 0x19, 0x12, 0x5B, 0x6E, 0x19, 0x12, 0x4E, 0x3E, 0x19, 0x12, 0x51, 0x46, 0x19, 0x12, + 0x51, 0x46, 0x19, 0x11, 0x5D, 0x76, 0x19, 0x11, 0x4F, 0x3E, 0x19, 0x11, 0x4E, 0x3E, 0x19, 0x11, + 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, 0x48, 0x26, 0x19, 0x13, 0x4F, 0x3E, 0x19, 0x13, + 0x4F, 0x42, 0x19, 0x13, 0x60, 0x86, 0x19, 0x13, 0x50, 0x46, 0x19, 0x12, 0x56, 0x5E, 0x19, 0x12, + 0x47, 0x1E, 0x19, 0x12, 0x4B, 0x2E, 0x19, 0x12, 0x4A, 0x2E, 0x19, 0x11, 0x56, 0x5E, 0x19, 0x11, + 0x47, 0x1E, 0x19, 0x11, 0x48, 0x26, 0x19, 0x11, 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, + 0x36, 0xDE, 0x18, 0x10, 0x38, 0xE6, 0x18, 0x10, 0x3A, 0xEE, 0x18, 0x10, 0x47, 0x1E, 0x19, 0x10, + 0x3C, 0xF6, 0x18, 0x0F, 0x41, 0x06, 0x19, 0x0F, 0x38, 0xE6, 0x18, 0x0F, 0x3A, 0xEE, 0x18, 0x0F, + 0x38, 0xE6, 0x18, 0x0E, 0x3C, 0xF6, 0x18, 0x0E, 0x2C, 0xB6, 0x18, 0x0E, 0x37, 0xDE, 0x18, 0x0E, + 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, 0x34, 0xD6, 0x18, 0x10, 0x38, 0xE6, 0x18, 0x10, + 0x3A, 0xEE, 0x18, 0x10, 0x46, 0x1A, 0x19, 0x10, 0x3C, 0xF2, 0x18, 0x0F, 0x3F, 0xFE, 0x18, 0x0F, + 0x36, 0xDA, 0x18, 0x0F, 0x38, 0xE6, 0x18, 0x0F, 0x36, 0xDE, 0x18, 0x0E, 0x3C, 0xF6, 0x18, 0x0E, + 0x31, 0xC6, 0x18, 0x0E, 0x33, 0xCE, 0x18, 0x0E, 0x00, 0x02, 0x18, 0x0A, 0x00, 0x02, 0x18, 0x0A, + 0x3F, 0xFE, 0x28, 0x10, 0x44, 0x16, 0x29, 0x10, 0x44, 0x16, 0x29, 0x10, 0x52, 0x4E, 0x29, 0x10, + 0x45, 0x16, 0x29, 0x0F, 0x4A, 0x2E, 0x29, 0x0F, 0x3D, 0xF6, 0x28, 0x0F, 0x41, 0x06, 0x29, 0x0F, + 0x40, 0x02, 0x29, 0x0E, 0x48, 0x26, 0x29, 0x0E, 0x3B, 0xEE, 0x28, 0x0E, 0x3C, 0xF6, 0x28, 0x0E, + 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, 0x40, 0x06, 0x29, 0x0D, 0x47, 0x1E, 0x29, 0x0D, + 0x48, 0x26, 0x29, 0x0D, 0x55, 0x56, 0x29, 0x0D, 0x48, 0x26, 0x29, 0x0C, 0x4E, 0x3E, 0x29, 0x0C, + 0x3F, 0xFE, 0x28, 0x0C, 0x42, 0x0E, 0x29, 0x0C, 0x42, 0x0A, 0x29, 0x0B, 0x4B, 0x2E, 0x29, 0x0B, + 0x3E, 0xFE, 0x28, 0x0B, 0x3E, 0xFE, 0x28, 0x0B, 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, + 0x41, 0x06, 0x29, 0x0D, 0x45, 0x16, 0x29, 0x0D, 0x46, 0x1E, 0x29, 0x0D, 0x52, 0x4E, 0x29, 0x0D, + 0x46, 0x1E, 0x29, 0x0C, 0x4B, 0x2E, 0x29, 0x0C, 0x3E, 0xFE, 0x28, 0x0C, 0x41, 0x06, 0x29, 0x0C, + 0x41, 0x06, 0x29, 0x0B, 0x48, 0x26, 0x29, 0x0B, 0x3D, 0xF6, 0x28, 0x0B, 0x3A, 0xEE, 0x28, 0x0B, + 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, 0x3D, 0xF6, 0x28, 0x0D, 0x47, 0x1E, 0x29, 0x0D, + 0x47, 0x1E, 0x29, 0x0D, 0x54, 0x56, 0x29, 0x0D, 0x46, 0x1E, 0x29, 0x0C, 0x4C, 0x36, 0x29, 0x0C, + 0x3E, 0xFA, 0x28, 0x0C, 0x41, 0x06, 0x29, 0x0C, 0x40, 0x06, 0x29, 0x0B, 0x49, 0x26, 0x29, 0x0B, + 0x3D, 0xF6, 0x28, 0x0B, 0x3C, 0xF6, 0x28, 0x0B, 0x00, 0x02, 0x28, 0x0A, 0x00, 0x02, 0x28, 0x0A, + 0x33, 0xCE, 0x38, 0x0A, 0x38, 0xE6, 0x38, 0x0A, 0x38, 0xE6, 0x38, 0x0B, 0x41, 0x06, 0x39, 0x0B, + 0x37, 0xDE, 0x38, 0x0A, 0x3A, 0xEE, 0x38, 0x0A, 0x30, 0xC6, 0x38, 0x0A, 0x34, 0xD6, 0x38, 0x0A, + 0x32, 0xCE, 0x38, 0x09, 0x3A, 0xEE, 0x38, 0x09, 0x30, 0xC2, 0x38, 0x09, 0x2E, 0xBE, 0x38, 0x09, + 0x00, 0x02, 0x38, 0x0A, 0x00, 0x02, 0x38, 0x0A, 0x33, 0xCE, 0x48, 0x0A, 0x36, 0xDE, 0x48, 0x0A, + 0x36, 0xDE, 0x48, 0x0B, 0x40, 0x06, 0x49, 0x0B, 0x36, 0xDE, 0x48, 0x0A, 0x39, 0xE6, 0x48, 0x0A, + 0x2E, 0xBE, 0x48, 0x0A, 0x32, 0xCE, 0x48, 0x0A, 0x31, 0xC6, 0x48, 0x09, 0x38, 0xE6, 0x48, 0x09, + 0x2E, 0xBE, 0x48, 0x09, 0x2E, 0xBA, 0x48, 0x09, 0x00, 0x02, 0x48, 0x0A, 0x00, 0x02, 0x48, 0x0A, + 0x2E, 0xBE, 0x58, 0x0A, 0x33, 0xCE, 0x58, 0x0A, 0x33, 0xCE, 0x58, 0x0B, 0x3E, 0xFA, 0x58, 0x0B, + 0x32, 0xCE, 0x58, 0x0A, 0x36, 0xDA, 0x58, 0x0A, 0x2C, 0xB6, 0x58, 0x0A, 0x2F, 0xBE, 0x58, 0x0A, + 0x2E, 0xBE, 0x58, 0x09, 0x36, 0xDA, 0x58, 0x09, 0x2C, 0xB2, 0x58, 0x09, 0x2D, 0xB6, 0x58, 0x09, + 0x00, 0x02, 0x58, 0x0A, 0x00, 0x02, 0x58, 0x0A, 0x30, 0xC2, 0x68, 0x0A, 0x35, 0xD6, 0x68, 0x0A, + 0x35, 0xD6, 0x68, 0x0B, 0x3F, 0xFE, 0x68, 0x0B, 0x33, 0xCE, 0x68, 0x0A, 0x37, 0xDE, 0x68, 0x0A, + 0x2D, 0xB6, 0x68, 0x0A, 0x30, 0xC6, 0x68, 0x0A, 0x2F, 0xC2, 0x68, 0x09, 0x37, 0xDE, 0x68, 0x09, + 0x2C, 0xB6, 0x68, 0x09, 0x2B, 0xAE, 0x68, 0x09, 0x00, 0x02, 0x68, 0x0A, 0x00, 0x02, 0x68, 0x0A, + 0x2A, 0xAE, 0x78, 0x0C, 0x31, 0xC6, 0x78, 0x0B, 0x31, 0xC6, 0x78, 0x0B, 0x3B, 0xEE, 0x78, 0x0B, + 0x30, 0xC6, 0x78, 0x0A, 0x33, 0xCE, 0x78, 0x0A, 0x2A, 0xAE, 0x78, 0x0A, 0x2E, 0xBA, 0x78, 0x0A, + 0x2D, 0xB6, 0x78, 0x09, 0x34, 0xD6, 0x78, 0x09, 0x2A, 0xAA, 0x78, 0x09, 0x29, 0xA6, 0x78, 0x0A, + 0x00, 0x02, 0x78, 0x0A, 0x00, 0x02, 0x78, 0x0A, 0x46, 0x1E, 0x89, 0x0E, 0x4D, 0x36, 0x89, 0x0E, + 0x4D, 0x36, 0x89, 0x0E, 0x5D, 0x76, 0x89, 0x0E, 0x4E, 0x3A, 0x89, 0x0D, 0x52, 0x4A, 0x89, 0x0D, + 0x40, 0x06, 0x89, 0x0D, 0x46, 0x1E, 0x89, 0x0D, 0x46, 0x1A, 0x89, 0x0C, 0x50, 0x46, 0x89, 0x0C, + 0x42, 0x0A, 0x89, 0x0C, 0x48, 0x26, 0x89, 0x0C, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, + 0x49, 0x26, 0x89, 0x0E, 0x49, 0x26, 0x89, 0x0E, 0x49, 0x26, 0x89, 0x0E, 0x58, 0x66, 0x89, 0x0E, + 0x49, 0x26, 0x89, 0x0D, 0x4D, 0x36, 0x89, 0x0D, 0x3F, 0xFE, 0x88, 0x0D, 0x44, 0x16, 0x89, 0x0D, + 0x43, 0x0E, 0x89, 0x0C, 0x4E, 0x3E, 0x89, 0x0C, 0x40, 0x02, 0x89, 0x0C, 0x42, 0x0A, 0x89, 0x0C, + 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, 0x3A, 0xEA, 0x88, 0x10, 0x3C, 0xF6, 0x88, 0x0F, + 0x3D, 0xF6, 0x88, 0x0E, 0x49, 0x26, 0x89, 0x0E, 0x3D, 0xFA, 0x88, 0x0D, 0x3F, 0x02, 0x89, 0x0D, + 0x32, 0xCE, 0x88, 0x0D, 0x38, 0xE6, 0x88, 0x0D, 0x36, 0xDE, 0x88, 0x0C, 0x40, 0x06, 0x89, 0x0C, + 0x34, 0xD6, 0x88, 0x0D, 0x38, 0xE6, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x98, 0x66, 0xFA, 0x13, 0x60, 0x86, 0xF9, 0x0E, 0x3F, 0xFE, 0xE8, 0x0A, 0x4A, 0x2A, 0xE9, 0x0A, + 0x4B, 0x2E, 0xE9, 0x0A, 0x5A, 0x6E, 0xE9, 0x0A, 0x4C, 0x32, 0xE9, 0x0A, 0x50, 0x46, 0xE9, 0x0A, + 0x41, 0x06, 0xE9, 0x0A, 0x45, 0x16, 0xE9, 0x0A, 0x44, 0x16, 0xE9, 0x0A, 0x4E, 0x3E, 0xE9, 0x0A, + 0x40, 0x02, 0xE9, 0x0A, 0x3E, 0xFE, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, + 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, + 0x00, 0x02, 0x18, 0x0E, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0xF8, 0x10, 0x00, 0x02, 0xF8, 0x12, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x40, 0xF0, 0x33, 0x21, 0x40, 0xF0, 0x33, 0x42, 0x40, 0xF0, 0x33, 0x63, 0x40, 0xF0, 0x33, + 0x84, 0x40, 0xF0, 0x33, 0xA5, 0x40, 0xF0, 0x33, 0xC6, 0xC0, 0xF1, 0x33, 0xE7, 0xC0, 0xF1, 0x33, + 0x08, 0xC1, 0xF1, 0x33, 0x29, 0xC1, 0xF1, 0x33, 0x4A, 0xC1, 0xF1, 0x33, 0x6B, 0xC1, 0xF1, 0x33, + 0x8C, 0xC1, 0xF1, 0x33, 0xAD, 0xC1, 0xF1, 0x33, 0xCE, 0xC1, 0xF1, 0x33, 0xEF, 0xC1, 0xF1, 0x33, + 0x10, 0xC2, 0xF1, 0x33, 0x31, 0xC2, 0xF1, 0x33, 0x52, 0xC2, 0xF1, 0x33, 0x73, 0xC2, 0xF1, 0x33, + 0x94, 0xC2, 0xF1, 0x73, 0xB5, 0xC2, 0xF1, 0x33, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x48, 0x38, 0x30, 0x00, 0x34, 0x2F, 0x24, 0x1F, 0x00, 0x00, 0x00, 0x00, + 0x34, 0x2C, 0x24, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x3F, 0xF0, 0x03, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, 0x26, 0x26, 0x26, 0x00, + 0x30, 0x30, 0x30, 0x30, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x30, 0x00, 0x49, 0x00, 0x30, 0x00, 0xA0, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 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, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, + 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xDC, 0x00, 0x00, + 0x00, 0xDC, 0x00, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x80, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x49, 0x00, 0x30, 0x00, 0xA0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC8, 0x57, 0x76, 0x63, 0x98, 0xBC, 0xA4, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x03, 0xDF, 0x07, 0x04, 0x0C, 0x22, 0x00, 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47 +}; + +#endif // __IST30XXC_FW_H__ \ No newline at end of file diff --git a/drivers/input/touchscreen/ist30xxc/firmware/ss_sharklt8_fw.h b/drivers/input/touchscreen/ist30xxc/firmware/ss_sharklt8_fw.h new file mode 100755 index 00000000..0144ecaf --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/firmware/ss_sharklt8_fw.h @@ -0,0 +1,4054 @@ + +#ifndef __IST30XXC_FW_H__ +#define __IST30XXC_FW_H__ + +// Chip ID : 0x0000038C +// FW Ver : 0x02020000 +// Param Ver : 0x00000009 +// FW Download CRC : 0x5729B945 +// Normal CRC : 0x76F4A7A7 + +static unsigned char ist30xxc_fw[] = { + 0x80, 0x00, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0xF8, 0x1C, 0x00, 0x80, 0xFC, 0x00, 0x00, 0x80, + 0x04, 0x01, 0x00, 0x80, 0x7C, 0x1D, 0x00, 0x80, 0x2C, 0x1D, 0x00, 0x80, 0x54, 0x1D, 0x00, 0x80, + 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0xC0, 0x1D, 0x00, 0x80, + 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, 0x0C, 0x01, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x10, 0x00, 0x27, 0x08, 0x80, 0x00, 0x80, 0x2C, 0x80, 0x40, 0x7C, 0xAB, 0x0B, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, 0x99, 0x67, 0x10, 0x00, 0x91, 0x67, 0x08, 0x70, 0x0F, 0x00, + 0x11, 0x17, 0x0C, 0x70, 0x0C, 0x16, 0x0C, 0x60, 0x0C, 0x16, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, + 0x24, 0x74, 0xF2, 0xFC, 0x08, 0x30, 0x00, 0x80, 0x04, 0x70, 0x0C, 0x40, 0x0C, 0x16, 0x0C, 0x50, + 0x1C, 0x16, 0x2C, 0x30, 0xA8, 0x7E, 0x2F, 0x64, 0x07, 0x00, 0xC6, 0x65, 0xB2, 0x07, 0x2F, 0x23, + 0x07, 0x00, 0x30, 0x22, 0x24, 0x74, 0xB1, 0x26, 0xF2, 0xF7, 0x0C, 0x70, 0x1C, 0x16, 0x0C, 0x60, + 0x6C, 0x16, 0xC6, 0x76, 0xB2, 0x04, 0xB1, 0x07, 0x24, 0x74, 0xF2, 0xFC, 0xAB, 0x0F, 0x00, 0x00, + 0xEB, 0xE1, 0x03, 0x00, 0xB9, 0x20, 0x88, 0x27, 0x04, 0x22, 0xF2, 0x0D, 0xB9, 0x20, 0x88, 0x27, + 0x04, 0x23, 0xF2, 0x09, 0xB9, 0x20, 0x88, 0x27, 0x04, 0x24, 0xF2, 0x05, 0xB9, 0x20, 0x88, 0x27, + 0x04, 0x21, 0xF2, 0x01, 0xB9, 0x10, 0x84, 0x27, 0xB9, 0x30, 0x8C, 0x27, 0x08, 0x30, 0x00, 0x50, + 0xB9, 0x03, 0x00, 0x10, 0xD9, 0x40, 0x90, 0x27, 0xD9, 0x80, 0xA0, 0x27, 0xD9, 0xC0, 0xB0, 0x27, + 0x01, 0x40, 0x01, 0x51, 0xC9, 0x40, 0xC0, 0x27, 0x99, 0x20, 0x80, 0x27, 0x08, 0x20, 0x01, 0x00, + 0xB1, 0x23, 0x98, 0x40, 0x80, 0x27, 0x92, 0xFE, 0x09, 0x00, 0x01, 0x00, 0x04, 0x23, 0xB9, 0x23, + 0x00, 0x10, 0xF2, 0x01, 0x48, 0x40, 0xC0, 0x27, 0x11, 0x15, 0x11, 0x04, 0x58, 0xC0, 0xB0, 0x27, + 0x58, 0x80, 0xA0, 0x27, 0x58, 0x40, 0x90, 0x27, 0x48, 0x20, 0x88, 0x27, 0x38, 0x10, 0x84, 0x27, + 0x61, 0x00, 0x00, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x8B, 0x51, 0x00, 0x00, + 0xCB, 0x57, 0x00, 0x00, 0xEB, 0x58, 0x00, 0x00, 0x2B, 0x23, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x6B, 0x5D, 0x00, 0x00, 0x8B, 0x6C, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x4B, 0x5E, 0x00, 0x00, + 0x8B, 0x60, 0x00, 0x00, 0xCB, 0x5F, 0x00, 0x00, 0x4B, 0x61, 0x00, 0x00, 0x0B, 0x62, 0x00, 0x00, + 0x2B, 0x64, 0x00, 0x00, 0xEB, 0x71, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xAB, 0x64, 0x00, 0x00, 0xAB, 0x6D, 0x00, 0x00, 0x0B, 0x54, + 0x00, 0x00, 0x8B, 0x6C, 0x00, 0x00, 0x04, 0x20, 0x0B, 0x7C, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0x04, 0x2A, 0xD1, 0xC1, 0xEB, 0x4E, 0x00, 0x00, + 0x0B, 0x51, 0x00, 0x00, 0xCB, 0x0B, 0x00, 0x00, 0xAB, 0x0C, 0x00, 0x00, 0x4B, 0x0D, 0x00, 0x00, + 0x6B, 0x34, 0x00, 0x00, 0xCB, 0x97, 0x00, 0x00, 0x8B, 0x0E, 0x00, 0x00, 0xEB, 0x96, 0x00, 0x00, + 0x98, 0xD0, 0x5E, 0x16, 0x92, 0xFC, 0x8B, 0x95, 0x00, 0x00, 0x04, 0x21, 0xAB, 0x64, 0x00, 0x00, + 0xAB, 0x86, 0x00, 0x00, 0xEB, 0x93, 0x00, 0x00, 0x06, 0x2D, 0xAB, 0x64, 0x00, 0x00, 0xCB, 0x94, + 0x00, 0x00, 0x0B, 0x96, 0x00, 0x00, 0xEB, 0x7E, 0x00, 0x00, 0xF2, 0xE9, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x28, 0x00, 0xD4, 0x74, 0x92, 0xFD, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x30, + 0x38, 0x76, 0x40, 0x01, 0x23, 0x77, 0xB9, 0x76, 0x40, 0x01, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x30, + 0x38, 0x27, 0x40, 0x01, 0xF7, 0x2F, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0x6B, 0x13, 0x00, 0x00, + 0x04, 0x70, 0xC6, 0x27, 0x82, 0x0D, 0x6B, 0x12, 0x00, 0x00, 0x08, 0x70, 0x00, 0x30, 0x08, 0x60, + 0x00, 0x80, 0xB9, 0x67, 0x40, 0x01, 0x38, 0x77, 0x3C, 0x01, 0xB9, 0x70, 0x20, 0x16, 0x30, 0xF1, + 0x06, 0x27, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x06, 0xE2, 0x77, 0xE8, 0xCC, 0xE0, 0x15, 0x00, 0x0C, 0xD0, 0xFF, 0xFF, 0xB1, 0xB1, 0x56, 0xD2, + 0x82, 0x49, 0xCC, 0xE0, 0x15, 0x00, 0xD2, 0x1B, 0xCC, 0xE0, 0x10, 0x00, 0x82, 0x37, 0xCC, 0xE0, + 0x10, 0x00, 0xD2, 0x08, 0xC4, 0xE1, 0x82, 0x2F, 0xC4, 0xE2, 0x92, 0x48, 0x99, 0xD0, 0x5E, 0x16, + 0xF2, 0x61, 0xCC, 0xE0, 0x13, 0x00, 0x82, 0x2D, 0xCC, 0xE0, 0x13, 0x00, 0xD2, 0x2D, 0xCC, 0xE0, + 0x12, 0x00, 0x92, 0x3C, 0x99, 0xD0, 0x5C, 0x16, 0xFA, 0x8F, 0x00, 0x00, 0xCC, 0xE0, 0x22, 0x00, + 0x82, 0x2C, 0xCC, 0xE0, 0x22, 0x00, 0xD2, 0x0B, 0xCC, 0xE0, 0x20, 0x00, 0x82, 0x20, 0xCC, 0xE0, + 0x21, 0x00, 0x92, 0x2C, 0xA9, 0xD0, 0x54, 0x16, 0xFA, 0x7F, 0x00, 0x00, 0xCC, 0xE0, 0x80, 0x00, + 0x82, 0x22, 0xCC, 0xE0, 0x81, 0x00, 0x82, 0x1C, 0xCC, 0xE0, 0x23, 0x00, 0x92, 0x1F, 0xA9, 0xD0, + 0x4E, 0x16, 0xF2, 0x72, 0x99, 0xE0, 0x5F, 0x16, 0xF2, 0x6F, 0x99, 0xD0, 0x5D, 0x16, 0xF2, 0x6C, + 0x99, 0xD0, 0x5B, 0x16, 0xF2, 0x69, 0x99, 0xD0, 0x5A, 0x16, 0xF2, 0x66, 0xA9, 0xD0, 0x52, 0x16, + 0xF2, 0x63, 0x99, 0xD0, 0x59, 0x16, 0xF2, 0x60, 0xA9, 0xD0, 0x50, 0x16, 0xF2, 0x5D, 0x99, 0xD0, + 0x57, 0x16, 0xF2, 0x5A, 0x99, 0xD0, 0x56, 0x16, 0xF2, 0x55, 0xCC, 0xE0, 0x32, 0x00, 0xD2, 0x16, + 0xCC, 0xE0, 0x31, 0x00, 0xB2, 0x37, 0xC4, 0xE2, 0x82, 0x15, 0xCC, 0xE0, 0x30, 0x00, 0x92, 0x4C, + 0x04, 0x20, 0x6B, 0xE6, 0x00, 0x00, 0x0C, 0xB0, 0x40, 0x01, 0x08, 0xE0, 0x00, 0x30, 0x08, 0xD0, + 0x30, 0x00, 0x06, 0xCE, 0x26, 0xBE, 0x24, 0xD1, 0xF2, 0x3A, 0xCC, 0xE0, 0x80, 0x00, 0x82, 0x3A, + 0xF2, 0x3B, 0xCB, 0xD7, 0x00, 0x00, 0xC4, 0xD0, 0x82, 0x0E, 0x08, 0x50, 0x00, 0x40, 0x38, 0x75, + 0x54, 0x10, 0x08, 0x40, 0x00, 0x80, 0x66, 0x74, 0xB9, 0x70, 0x1C, 0x16, 0x14, 0x71, 0xB9, 0x75, + 0x54, 0x10, 0xF2, 0x2A, 0xB8, 0x50, 0x1C, 0x16, 0x32, 0x0A, 0x08, 0x70, 0xFF, 0x7F, 0x2C, 0x70, + 0xFF, 0xFF, 0x56, 0x75, 0x08, 0x50, 0x00, 0x40, 0xB9, 0x75, 0x54, 0x10, 0xB9, 0x00, 0x1C, 0x16, + 0xF2, 0x1B, 0x04, 0x20, 0x6B, 0xE6, 0x00, 0x00, 0x06, 0x2E, 0x0B, 0x17, 0x01, 0x00, 0xF2, 0x14, + 0xB8, 0x7E, 0x40, 0x01, 0x32, 0xFE, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x74, 0x92, 0xFD, 0xB1, 0x6B, + 0x38, 0x7C, 0x3C, 0x01, 0xC6, 0x7D, 0x92, 0xF5, 0x04, 0x74, 0xF1, 0x70, 0x08, 0x60, 0x00, 0x80, + 0xF2, 0xF0, 0x4B, 0x6F, 0x00, 0x00, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0xE0, 0x00, 0x30, 0x0C, 0xD0, + 0x00, 0x01, 0x26, 0xDE, 0x6B, 0x12, 0x00, 0x00, 0x06, 0x2D, 0x0C, 0x30, 0x40, 0x00, 0x0C, 0xF0, + 0x54, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x72, 0x82, 0x05, 0x04, 0x72, 0xB9, 0x7E, + 0x28, 0x00, 0xF2, 0xF1, 0x38, 0x7E, 0x40, 0x01, 0xB9, 0x7E, 0x40, 0x01, 0x50, 0xC1, 0x2C, 0x10, + 0x10, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0x0C, 0x20, 0x00, 0x00, 0x0C, 0x30, 0x80, 0x00, 0xC1, 0xE1, + 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x2E, 0x0C, 0x20, 0x00, 0x27, 0x0C, 0x30, 0x80, 0x00, + 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x00, 0xFA, 0x38, 0x67, + 0xF8, 0x01, 0x0C, 0xE0, 0x00, 0x27, 0xB9, 0x60, 0x00, 0x00, 0x38, 0x67, 0xFC, 0x01, 0xB9, 0x60, + 0x04, 0x00, 0x08, 0x60, 0x00, 0x80, 0x38, 0x66, 0x04, 0xDC, 0xB9, 0x60, 0x08, 0x00, 0x38, 0x67, + 0xF0, 0x01, 0xB9, 0x60, 0x0C, 0x00, 0x38, 0x67, 0xF4, 0x01, 0x38, 0x77, 0xCC, 0x01, 0xB9, 0x60, + 0x10, 0x00, 0xB9, 0x70, 0x1C, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x77, 0x10, 0x20, 0xB9, 0xE0, + 0x70, 0x00, 0x08, 0x60, 0x00, 0x80, 0xF7, 0x70, 0xB9, 0x70, 0x20, 0x00, 0x08, 0x70, 0xD0, 0x02, + 0x2C, 0x70, 0x00, 0x05, 0xB9, 0x70, 0x40, 0x00, 0x08, 0x70, 0x0D, 0x00, 0x2C, 0x70, 0x13, 0x00, + 0xB9, 0x70, 0x44, 0x00, 0x08, 0x70, 0x02, 0x01, 0x2C, 0x70, 0x12, 0x0B, 0xB9, 0x70, 0x48, 0x00, + 0x08, 0x70, 0x12, 0x0C, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x70, 0x4C, 0x00, 0x14, 0x71, 0xB9, 0x70, + 0x50, 0x00, 0x08, 0x70, 0x0B, 0x00, 0x2C, 0x70, 0x12, 0x00, 0xB9, 0x70, 0x54, 0x00, 0x08, 0x70, + 0xFF, 0x00, 0x2C, 0x70, 0x00, 0xFF, 0xB9, 0x70, 0x58, 0x00, 0x04, 0x72, 0xB9, 0x70, 0x60, 0x00, + 0x08, 0x70, 0x08, 0x07, 0x2C, 0x70, 0x08, 0x07, 0x2C, 0x60, 0x88, 0xDE, 0xB9, 0x70, 0x64, 0x00, + 0x28, 0x76, 0x2C, 0x00, 0x28, 0x66, 0x26, 0x00, 0xB9, 0x00, 0x5C, 0x00, 0x57, 0x78, 0x66, 0x76, + 0xB9, 0x70, 0x68, 0x00, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0x00, 0x49, 0xB9, 0x70, 0x74, 0x00, + 0x0C, 0x70, 0x00, 0x10, 0xB9, 0x70, 0x78, 0x00, 0x2B, 0x21, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x18, 0x6E, + 0xEE, 0x05, 0x04, 0x70, 0xC6, 0x67, 0x06, 0xD2, 0x82, 0x19, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, + 0x38, 0x7E, 0xD4, 0x05, 0x0C, 0x50, 0xEC, 0x05, 0xB1, 0x7D, 0x0C, 0x70, 0xD8, 0x15, 0x26, 0x5E, + 0x04, 0x61, 0xB0, 0x37, 0x82, 0x06, 0x06, 0x46, 0x57, 0x41, 0x26, 0x4D, 0xB1, 0x34, 0x24, 0x61, + 0x24, 0x74, 0xC6, 0x75, 0x92, 0xF7, 0x18, 0x7E, 0xEE, 0x05, 0x50, 0xC1, 0x06, 0x27, 0x2C, 0x10, + 0x10, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0x06, 0x67, 0x3F, 0x57, 0x03, 0x00, 0xC4, 0x50, 0x02, 0x08, + 0x2F, 0x57, 0x02, 0x00, 0x10, 0x55, 0x24, 0x71, 0x26, 0x65, 0x13, 0x66, 0xF2, 0xF6, 0x06, 0x26, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x30, 0xE2, 0x08, 0x70, 0xFF, 0x00, + 0x2C, 0x70, 0xFF, 0xFF, 0x56, 0xE7, 0x6C, 0xE0, 0x00, 0x0C, 0xB1, 0xE2, 0x57, 0x31, 0x06, 0xD2, + 0x2B, 0x2E, 0x00, 0x00, 0x57, 0x2C, 0x66, 0x2E, 0xB1, 0x2D, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x54, 0x00, 0xD9, 0xC1, 0x44, 0x00, 0x8B, 0x43, 0x00, 0x00, + 0x06, 0x21, 0x0C, 0x30, 0x40, 0x00, 0xAB, 0x2B, 0x00, 0x00, 0x86, 0xD2, 0x82, 0x29, 0x06, 0x21, + 0x06, 0x3D, 0x2B, 0x2F, 0x00, 0x00, 0x98, 0x70, 0x58, 0x16, 0x82, 0x0A, 0x0C, 0x20, 0x40, 0x00, + 0x26, 0x21, 0x0C, 0x30, 0x00, 0x27, 0x99, 0x01, 0x40, 0x00, 0x4B, 0x48, 0x00, 0x00, 0x08, 0xE0, + 0x00, 0x30, 0x0C, 0xC0, 0x04, 0x01, 0x26, 0xCE, 0x6B, 0x12, 0x00, 0x00, 0x06, 0x2C, 0x06, 0x31, + 0x0C, 0x40, 0x2C, 0x00, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x38, 0x7E, 0x28, 0x00, 0xD4, 0x72, + 0x82, 0x05, 0x04, 0x72, 0xB9, 0x7E, 0x28, 0x00, 0xF2, 0xF0, 0xEB, 0x12, 0x00, 0x00, 0x06, 0x2D, + 0x58, 0xC1, 0x44, 0x00, 0x2C, 0x10, 0x54, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x50, 0x00, 0x00, + 0x0C, 0x70, 0x78, 0x00, 0x34, 0x54, 0x04, 0x60, 0x30, 0x47, 0x34, 0x74, 0xC6, 0x75, 0x26, 0x64, + 0x92, 0xFC, 0xB9, 0x60, 0x7C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x30, 0x00, 0xD9, 0x81, 0x10, 0x00, + 0xD9, 0xC1, 0x20, 0x00, 0x30, 0xC2, 0x1C, 0x20, 0x20, 0x00, 0x26, 0x2C, 0x06, 0xE3, 0x06, 0x32, + 0x06, 0xA4, 0x06, 0x95, 0xAB, 0x9A, 0x00, 0x00, 0x30, 0xBE, 0x06, 0x72, 0x0C, 0x80, 0xD5, 0x00, + 0x04, 0xD0, 0x3F, 0x28, 0x0B, 0x00, 0x06, 0x32, 0xB9, 0x71, 0x04, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x71, 0x04, 0x00, 0x26, 0x27, 0xCC, 0x20, 0xC8, 0x04, 0xD2, 0x0D, 0x0C, 0x70, 0x20, 0x00, + 0xB1, 0x7A, 0x26, 0xDD, 0xB1, 0x89, 0x28, 0x6D, 0x14, 0x16, 0x30, 0x7E, 0x26, 0x76, 0x28, 0x6D, + 0x0C, 0x16, 0xF2, 0x30, 0x24, 0xD1, 0xC4, 0xD4, 0x2C, 0x80, 0x1D, 0x01, 0x92, 0xE3, 0x1C, 0x20, + 0xB0, 0x02, 0x26, 0x2C, 0x06, 0x32, 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x72, 0x0C, 0x80, 0x46, 0x00, + 0x04, 0xD0, 0x3F, 0x28, 0x0B, 0x00, 0x06, 0x32, 0xB9, 0x71, 0x04, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x71, 0x04, 0x00, 0x26, 0x27, 0xCC, 0x20, 0xC8, 0x04, 0xD2, 0x18, 0x0C, 0x70, 0xB0, 0x02, + 0xB1, 0x7A, 0x08, 0x70, 0x00, 0x80, 0x26, 0xDD, 0x2C, 0x70, 0x4C, 0x7C, 0x26, 0x7D, 0xB1, 0x89, + 0x20, 0x67, 0x30, 0x7E, 0x26, 0x76, 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, 0x40, 0x7C, 0x26, 0xD6, + 0x20, 0x6D, 0x36, 0x76, 0xB1, 0x7E, 0x04, 0x21, 0xF2, 0x7C, 0x24, 0xD1, 0xC4, 0xD5, 0x2C, 0x80, + 0x1D, 0x01, 0x92, 0xD8, 0x04, 0x80, 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, 0x64, 0x7C, 0x26, 0x68, + 0x20, 0x66, 0x06, 0x2C, 0x36, 0x26, 0x06, 0x32, 0xB1, 0x61, 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x42, + 0x04, 0xD0, 0x08, 0x60, 0x00, 0x80, 0x2F, 0x5D, 0x0D, 0x00, 0x2C, 0x60, 0x40, 0x7C, 0x26, 0x65, + 0x20, 0x66, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x0C, 0x00, 0x3F, 0x26, 0x0B, 0x00, 0x06, 0x32, + 0xB9, 0x61, 0x08, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x41, 0x04, 0x00, 0x38, 0x51, 0x0C, 0x00, + 0x38, 0x61, 0x08, 0x00, 0x26, 0x24, 0xCC, 0x20, 0xC8, 0x04, 0xD2, 0x0A, 0x30, 0x71, 0xB1, 0x7A, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x4C, 0x7C, 0x26, 0x57, 0x20, 0x75, 0xF2, 0x29, 0x24, 0xD1, + 0xC4, 0xD5, 0x92, 0xD8, 0x24, 0x82, 0xC4, 0x8A, 0x92, 0xC7, 0x04, 0x80, 0xF2, 0x27, 0x24, 0xD1, + 0xC4, 0xD4, 0x82, 0x33, 0x2F, 0x5D, 0x0D, 0x00, 0x28, 0x65, 0x0C, 0x16, 0xB9, 0x41, 0x04, 0x00, + 0xB9, 0x51, 0x0C, 0x00, 0x3F, 0x26, 0x0B, 0x00, 0x06, 0x32, 0xB9, 0x61, 0x08, 0x00, 0xAB, 0x9A, + 0x00, 0x00, 0x38, 0x41, 0x04, 0x00, 0x38, 0x51, 0x0C, 0x00, 0x38, 0x61, 0x08, 0x00, 0x26, 0x24, + 0xCC, 0x20, 0xC8, 0x04, 0xD2, 0xE5, 0x30, 0x71, 0xB1, 0x7A, 0x28, 0x75, 0x14, 0x16, 0xB1, 0x79, + 0x30, 0x5E, 0x3F, 0x66, 0x05, 0x00, 0x26, 0x76, 0xF2, 0x96, 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, + 0x58, 0x7C, 0x26, 0x68, 0x20, 0x66, 0x06, 0x2C, 0x36, 0x26, 0x06, 0x32, 0xB1, 0x61, 0xAB, 0x9A, + 0x00, 0x00, 0x06, 0x42, 0x04, 0xD0, 0xF2, 0xCF, 0x24, 0x82, 0xC4, 0x8A, 0x92, 0xEF, 0x14, 0x21, + 0x58, 0xC1, 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x18, 0x70, 0x56, 0x16, 0x3C, 0x10, 0x20, 0x00, 0xCC, 0x70, 0x80, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0x92, 0x3F, 0x0C, 0xD0, 0x00, 0x10, 0x18, 0x7D, 0xEE, 0x05, 0xC4, 0x72, 0x92, 0x39, 0x38, 0xCD, + 0xD8, 0x05, 0x0C, 0x70, 0xFF, 0x0F, 0x56, 0x7C, 0xB9, 0x71, 0x08, 0x00, 0x06, 0x7C, 0x77, 0x76, + 0x04, 0x2C, 0x04, 0x38, 0x04, 0x44, 0x5C, 0x70, 0xFF, 0x0F, 0x26, 0x21, 0x26, 0x31, 0x26, 0x41, + 0x06, 0x51, 0xB9, 0x71, 0x0C, 0x00, 0x4B, 0x35, 0x00, 0x00, 0x14, 0x71, 0xC6, 0x27, 0x82, 0x20, + 0x38, 0x61, 0x0C, 0x00, 0x38, 0x71, 0x04, 0x00, 0x30, 0x21, 0x26, 0x76, 0xF7, 0x70, 0x08, 0xE0, + 0x00, 0xFF, 0x5C, 0x70, 0xFF, 0x0F, 0x2C, 0xE0, 0xFF, 0x0F, 0x57, 0x76, 0x56, 0xEC, 0x66, 0xE7, + 0x38, 0x71, 0x08, 0x00, 0x26, 0x22, 0x26, 0x27, 0x04, 0x33, 0x0B, 0x9E, 0x00, 0x00, 0x1C, 0x70, + 0x00, 0x10, 0x5C, 0x20, 0xFF, 0x0F, 0x56, 0xE7, 0x66, 0xE2, 0xB9, 0xED, 0xD8, 0x05, 0x58, 0xC1, + 0x10, 0x00, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x20, 0x00, 0xD1, 0x81, 0xD9, 0xC1, + 0x10, 0x00, 0x0C, 0x70, 0x00, 0x10, 0x98, 0xE7, 0xA1, 0x05, 0x06, 0xB2, 0x06, 0xD3, 0x06, 0xA7, + 0x92, 0x30, 0x0C, 0xC0, 0xB5, 0x13, 0x06, 0x97, 0x0C, 0x80, 0x80, 0x0B, 0x18, 0x7A, 0xBF, 0x03, + 0xC6, 0x7E, 0xC2, 0x03, 0xC4, 0xE2, 0x92, 0x03, 0x91, 0xEB, 0xF2, 0x32, 0x60, 0x7C, 0x0C, 0x30, + 0x64, 0x00, 0x34, 0x71, 0x57, 0x72, 0x26, 0x79, 0x18, 0x67, 0x19, 0x03, 0x18, 0x77, 0x18, 0x03, + 0x2F, 0x56, 0x06, 0x00, 0x26, 0x56, 0x57, 0x51, 0x26, 0x65, 0x26, 0x67, 0x13, 0x66, 0x26, 0x66, + 0x26, 0x68, 0x70, 0x76, 0x24, 0xC1, 0x06, 0x27, 0xD7, 0x21, 0xD7, 0x72, 0x26, 0x27, 0x0B, 0x9E, + 0x00, 0x00, 0x2C, 0x20, 0x90, 0x01, 0x24, 0xE1, 0xB1, 0x2D, 0x13, 0xEE, 0x24, 0xD4, 0xF2, 0xD7, + 0x28, 0x77, 0x0C, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x06, 0x27, 0xD7, 0x21, 0xD7, 0x72, 0x26, 0x27, + 0x0B, 0x9E, 0x00, 0x00, 0x04, 0x71, 0x91, 0x7B, 0x2C, 0x20, 0x90, 0x01, 0xB1, 0x2D, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x04, 0x20, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, + 0x64, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, + 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, 0x06, 0x01, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, + 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x1C, 0x26, 0x22, + 0xC9, 0xE1, 0x04, 0x00, 0x06, 0xE2, 0xB1, 0x01, 0x57, 0xE1, 0xB1, 0x01, 0x26, 0xE2, 0x30, 0x71, + 0xC6, 0x7E, 0xB2, 0x07, 0x2B, 0x4E, 0x00, 0x00, 0x30, 0x71, 0x24, 0x71, 0xB1, 0x71, 0xF2, 0xF8, + 0x48, 0xE1, 0x04, 0x00, 0x24, 0x1C, 0xE1, 0xF0, 0xF7, 0x40, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x07, + 0x2F, 0x67, 0x07, 0x00, 0x26, 0x62, 0xA1, 0x36, 0x24, 0x71, 0xF2, 0xF9, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0x6B, 0xD8, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x2C, 0x60, 0x80, 0x00, 0x2C, 0x70, 0xCC, 0x01, + 0x36, 0x76, 0xC4, 0x70, 0x34, 0x14, 0xB1, 0xF1, 0x32, 0x02, 0x24, 0x73, 0x06, 0x47, 0x08, 0x50, + 0x00, 0x80, 0x67, 0x41, 0x04, 0x70, 0x2C, 0x50, 0x70, 0x7C, 0x14, 0x21, 0xC6, 0x74, 0x04, 0x34, + 0x26, 0x36, 0x32, 0x05, 0x30, 0xF5, 0x24, 0x54, 0xB1, 0xF6, 0xF2, 0x02, 0xB1, 0x26, 0x24, 0x71, + 0xCC, 0x70, 0x80, 0x00, 0x82, 0x03, 0x06, 0x63, 0xF2, 0xF2, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x28, 0x60, 0x52, 0x16, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xD4, 0x30, 0xA9, 0x60, + 0x52, 0x16, 0x28, 0x60, 0x54, 0x16, 0xCC, 0x60, 0xFF, 0xFF, 0x92, 0x05, 0x0C, 0x60, 0xD4, 0x30, + 0xA9, 0x60, 0x54, 0x16, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x40, 0x00, 0x80, 0x34, 0x14, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x40, 0x0C, 0xDC, 0xB1, 0xF1, 0x2C, 0x70, 0x1E, 0xDC, 0x0C, 0x50, 0x4C, 0x16, + 0x24, 0x4D, 0x14, 0xF1, 0x10, 0x67, 0xCC, 0x60, 0xFF, 0x00, 0x82, 0x0E, 0x18, 0x27, 0x05, 0x00, + 0xCC, 0x20, 0xFF, 0x00, 0x82, 0x09, 0x2F, 0x36, 0x06, 0x00, 0x26, 0x36, 0x57, 0x31, 0x26, 0x63, + 0x26, 0x26, 0xA1, 0x25, 0xF2, 0x02, 0xA1, 0xF5, 0x34, 0x71, 0xC6, 0x74, 0x34, 0x52, 0x92, 0xEB, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x00, 0x10, 0x04, 0x30, + 0x0C, 0x40, 0x0C, 0x06, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x4B, 0x55, 0x00, 0x00, + 0x0B, 0x2E, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0xF4, 0x01, + 0xB9, 0x60, 0x34, 0x16, 0x14, 0x61, 0x99, 0x00, 0x68, 0x16, 0x99, 0x60, 0x67, 0x16, 0xB9, 0x00, + 0x30, 0x16, 0xB9, 0x00, 0x2C, 0x16, 0x99, 0x00, 0x66, 0x16, 0xB9, 0x00, 0x28, 0x16, 0xB9, 0x00, + 0x24, 0x16, 0x04, 0x63, 0x99, 0x00, 0x65, 0x16, 0x99, 0x60, 0x64, 0x16, 0x99, 0x00, 0x5F, 0x16, + 0x99, 0x00, 0x5E, 0x16, 0x04, 0x71, 0x99, 0x70, 0x5D, 0x16, 0x99, 0x00, 0x5C, 0x16, 0x99, 0x70, + 0x5B, 0x16, 0x99, 0x00, 0x5A, 0x16, 0x14, 0x61, 0xA9, 0x60, 0x54, 0x16, 0xA9, 0x60, 0x52, 0x16, + 0x08, 0x60, 0x00, 0x80, 0x2C, 0x60, 0x00, 0xDC, 0x18, 0x46, 0x0A, 0x00, 0x99, 0x40, 0x59, 0x16, + 0x18, 0x56, 0x08, 0x00, 0xA9, 0x50, 0x50, 0x16, 0xA9, 0x00, 0x4E, 0x16, 0x99, 0x00, 0x58, 0x16, + 0x99, 0x00, 0x57, 0x16, 0x99, 0x00, 0x56, 0x16, 0x99, 0x70, 0x63, 0x16, 0x99, 0x00, 0x62, 0x16, + 0x99, 0x70, 0x61, 0x16, 0x99, 0x00, 0x60, 0x16, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x4B, 0xBF, 0x00, 0x00, 0x0C, 0x60, 0x15, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x04, 0x70, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0xAB, 0xE1, 0x00, 0x00, + 0x04, 0x31, 0x0C, 0x20, 0x20, 0x00, 0x4B, 0xE0, 0x00, 0x00, 0x0C, 0x20, 0xFF, 0x00, 0x0B, 0xDE, + 0x00, 0x00, 0x04, 0x24, 0x04, 0x31, 0xCB, 0xDA, 0x00, 0x00, 0x04, 0x21, 0xEB, 0xD6, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x2B, 0xD9, 0x00, 0x00, + 0x04, 0x20, 0x4B, 0xE5, 0x00, 0x00, 0x2B, 0xD6, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0xEB, 0xE2, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x6B, 0xE2, + 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0x6B, 0xE3, 0x00, 0x00, + 0x04, 0x25, 0x04, 0x31, 0x0B, 0xE7, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x00, 0x01, 0xB1, 0xF1, 0x2B, 0xDC, 0x00, 0x00, 0x0C, 0x20, 0x80, 0x00, + 0x2B, 0xDC, 0x00, 0x00, 0x04, 0x20, 0x06, 0x52, 0x0C, 0x30, 0x27, 0x00, 0x0C, 0x40, 0xFF, 0xFF, + 0x0C, 0x60, 0x01, 0x02, 0x8B, 0xEF, 0x00, 0x00, 0x04, 0x21, 0x0C, 0x30, 0x8F, 0x01, 0x0C, 0x40, + 0xFF, 0xFF, 0x04, 0x50, 0x0C, 0x60, 0x01, 0x02, 0x8B, 0xEF, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0x6B, 0xE6, 0x00, 0x00, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x09, 0x0C, 0x20, 0x00, 0x60, + 0x2B, 0xDC, 0x00, 0x00, 0x04, 0x21, 0x6B, 0xB8, 0x00, 0x00, 0xF2, 0x07, 0x6B, 0xB8, 0x00, 0x00, + 0x0C, 0x20, 0x00, 0x60, 0x0B, 0xDD, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x08, 0x60, 0x00, 0x40, 0x38, 0xE6, 0x70, 0x60, 0x06, 0x72, + 0x23, 0xEE, 0xCC, 0xE0, 0x00, 0xC9, 0x06, 0xC3, 0xC2, 0x05, 0x08, 0x60, 0x04, 0x00, 0x66, 0xE6, + 0xF7, 0xE1, 0x06, 0x37, 0x06, 0x2E, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0xA0, 0x0F, 0x0B, 0x9E, + 0x00, 0x00, 0x24, 0x25, 0x04, 0x3A, 0x0B, 0x9E, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x77, + 0xCC, 0x71, 0x06, 0xD2, 0x77, 0x7C, 0x24, 0x72, 0xC6, 0x27, 0xB2, 0x02, 0x06, 0xD7, 0xC4, 0xC0, + 0x82, 0x18, 0x06, 0x7E, 0xD7, 0x71, 0x2F, 0x2E, 0x0E, 0x00, 0x26, 0x27, 0x06, 0x3D, 0x0B, 0x9E, + 0x00, 0x00, 0x3C, 0xE0, 0xB0, 0x9A, 0xCC, 0xE0, 0x20, 0x03, 0x04, 0x71, 0xD2, 0x02, 0x04, 0x70, + 0xD7, 0x7F, 0x66, 0x72, 0x0C, 0x60, 0x00, 0x00, 0xB9, 0x76, 0x3C, 0x00, 0x6B, 0x34, 0x00, 0x00, + 0x06, 0x2D, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x40, 0x16, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x38, 0xE7, 0x04, 0x00, 0x18, 0x27, 0x05, 0x00, 0x04, 0x30, + 0x0C, 0xC0, 0xFF, 0x00, 0x0B, 0x66, 0x00, 0x00, 0x56, 0xCE, 0x06, 0xD2, 0x04, 0x30, 0x06, 0x2C, + 0x0B, 0x66, 0x00, 0x00, 0x08, 0x70, 0xFF, 0xFF, 0x56, 0x7E, 0x57, 0xD4, 0x66, 0x72, 0x66, 0x7D, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x6C, 0x72, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x38, 0x70, 0x40, 0x16, 0x34, 0x14, 0xB1, 0xF1, 0x18, 0x27, 0x08, 0x00, 0x04, 0x31, 0x0B, 0x66, + 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x18, 0x70, 0x6B, 0x6A, 0x00, 0x00, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0x28, 0x20, 0x50, 0x16, 0x34, 0x18, 0xD4, 0x21, 0xC1, 0xE1, 0x82, 0x0A, + 0x04, 0x21, 0x0B, 0x16, 0x03, 0x00, 0x18, 0x60, 0x64, 0x16, 0x1C, 0x70, 0x80, 0x00, 0x66, 0x76, + 0xF2, 0x07, 0x0B, 0x16, 0x03, 0x00, 0x18, 0x70, 0x64, 0x16, 0x5C, 0x70, 0x7F, 0x00, 0x99, 0x70, + 0x64, 0x16, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x04, 0x21, 0xB1, 0xF1, 0x4B, 0xE5, + 0x00, 0x00, 0x98, 0x70, 0x56, 0x16, 0x82, 0x1F, 0x5C, 0x70, 0xF0, 0x00, 0xCC, 0x70, 0x80, 0x00, + 0x82, 0x08, 0xCC, 0x70, 0xC0, 0x00, 0x92, 0x17, 0x04, 0x61, 0x99, 0x60, 0x58, 0x16, 0xF2, 0x13, + 0x04, 0x71, 0x99, 0x70, 0x58, 0x16, 0x99, 0x70, 0x5A, 0x16, 0x99, 0x00, 0x5B, 0x16, 0x04, 0x20, + 0x99, 0x00, 0x57, 0x16, 0x0B, 0x16, 0x03, 0x00, 0x18, 0x60, 0x64, 0x16, 0x5C, 0x60, 0x7F, 0x00, + 0x99, 0x60, 0x64, 0x16, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, + 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, 0x00, 0x80, 0x2C, 0x40, 0x6C, 0x03, + 0x3C, 0x10, 0x10, 0x00, 0x36, 0x42, 0x2C, 0x30, 0xBC, 0x7D, 0xD1, 0xC1, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x30, 0x00, 0xFC, 0x04, 0x20, 0x0C, 0xF0, 0x10, 0x03, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x00, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x2E, 0x18, 0x00, 0x2C, 0x30, 0x00, 0xF0, 0x04, 0x20, + 0x0C, 0xF0, 0x10, 0x03, 0xF1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0x38, 0xC7, 0xD0, 0xFB, 0xB9, 0x2E, + 0x14, 0x00, 0x06, 0xD2, 0xCC, 0xC0, 0xFF, 0x00, 0x82, 0x1B, 0xC6, 0xC2, 0x82, 0x19, 0x6B, 0x12, + 0x00, 0x00, 0x08, 0x60, 0x1C, 0xE1, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x60, 0x01, 0xE9, 0xB9, 0x67, + 0x04, 0x01, 0xB9, 0xC7, 0x08, 0x01, 0xB9, 0xD7, 0x0C, 0x01, 0x38, 0x6E, 0x18, 0x00, 0xB9, 0x67, + 0x10, 0x01, 0x0B, 0xE6, 0x00, 0x00, 0x04, 0x2A, 0xEB, 0x4E, 0x00, 0x00, 0xF2, 0xFB, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x60, 0x61, 0x16, 0x34, 0x18, 0xC1, 0xE1, + 0x82, 0x09, 0x34, 0x61, 0x93, 0x66, 0x99, 0x60, 0x61, 0x16, 0x92, 0x3B, 0x99, 0x00, 0x63, 0x16, + 0xF2, 0x38, 0xDC, 0x20, 0x80, 0x00, 0x0C, 0xE0, 0x3C, 0x00, 0x82, 0x03, 0x0C, 0xE0, 0x30, 0x00, + 0xEB, 0xBD, 0x00, 0x00, 0xC6, 0x2E, 0xA2, 0x0A, 0x38, 0x50, 0x2C, 0x16, 0x18, 0x60, 0x62, 0x16, + 0x34, 0x53, 0xC6, 0x65, 0xB2, 0x17, 0x24, 0x61, 0xF2, 0x13, 0x98, 0x60, 0x62, 0x16, 0x82, 0x12, + 0x98, 0x50, 0x68, 0x16, 0x82, 0x04, 0xB8, 0x50, 0x30, 0x16, 0x92, 0x0C, 0x34, 0xE4, 0xC6, 0x2E, + 0xD2, 0x09, 0x18, 0x50, 0x60, 0x16, 0xCC, 0x50, 0x1E, 0x00, 0xD2, 0x04, 0x34, 0x61, 0x99, 0x60, + 0x62, 0x16, 0x98, 0x50, 0x63, 0x16, 0x18, 0x70, 0x62, 0x16, 0x92, 0x07, 0xC4, 0x74, 0xC2, 0x09, + 0x04, 0x71, 0x99, 0x70, 0x63, 0x16, 0xF2, 0x05, 0xC4, 0x72, 0xD2, 0x03, 0x99, 0x00, 0x63, 0x16, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x8B, 0xD2, + 0x00, 0x00, 0x06, 0x2E, 0xEB, 0xCC, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x18, 0x20, 0x64, 0x16, 0x5C, 0x20, 0xF0, 0x00, 0x64, 0x23, + 0x99, 0x20, 0x64, 0x16, 0x4B, 0xC4, 0x00, 0x00, 0x4B, 0xBC, 0x00, 0x00, 0xC4, 0xE0, 0x92, 0x14, + 0xCB, 0xBB, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBA, 0x00, 0x00, + 0x04, 0x21, 0x06, 0x3E, 0x06, 0x4E, 0x06, 0x5E, 0xAB, 0x1C, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x04, + 0x04, 0x24, 0x2B, 0xFA, 0x00, 0x00, 0x6B, 0x1B, 0x01, 0x00, 0xCB, 0xBC, 0x00, 0x00, 0x40, 0xE1, + 0x04, 0x61, 0x99, 0x60, 0x65, 0x16, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x58, 0x16, + 0x34, 0x18, 0xC1, 0xE1, 0x92, 0x0A, 0x0C, 0x60, 0x00, 0x10, 0xA8, 0x76, 0x20, 0x00, 0x82, 0x05, + 0x34, 0x71, 0xA9, 0x76, 0x20, 0x00, 0xF2, 0x3E, 0x18, 0x60, 0x68, 0x16, 0x18, 0x70, 0x67, 0x16, + 0xC6, 0x76, 0x92, 0x38, 0xC4, 0x70, 0x82, 0x04, 0x28, 0x70, 0x52, 0x16, 0xF2, 0x0E, 0x38, 0x60, + 0x24, 0x16, 0x04, 0x51, 0xCC, 0x60, 0x8F, 0x01, 0x26, 0x56, 0xB9, 0x50, 0x24, 0x16, 0x0C, 0x70, + 0x30, 0x75, 0xD2, 0x03, 0x28, 0x70, 0x54, 0x16, 0xC6, 0x72, 0xC2, 0x24, 0x36, 0x72, 0x06, 0x27, + 0x06, 0x67, 0xD7, 0x62, 0xD7, 0x21, 0x26, 0x26, 0x36, 0x27, 0xD7, 0x21, 0x0C, 0x30, 0x10, 0x27, + 0x0B, 0x9E, 0x00, 0x00, 0xC4, 0x2A, 0xC2, 0x16, 0xCB, 0xE3, 0x00, 0x00, 0x2B, 0xE4, 0x00, 0x00, + 0x98, 0x70, 0x59, 0x16, 0x82, 0x04, 0xCB, 0xD6, 0x00, 0x00, 0xF2, 0x08, 0x18, 0x70, 0x6A, 0x16, + 0x93, 0x07, 0x92, 0x04, 0x2B, 0x4E, 0x00, 0x00, 0xF2, 0xFA, 0x99, 0x00, 0x6A, 0x16, 0xAB, 0xE4, + 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x18, 0x70, 0x57, 0x16, 0x0C, 0x60, 0x96, 0x00, + 0xC4, 0x70, 0x92, 0x05, 0x38, 0x70, 0x40, 0x16, 0x28, 0x67, 0x22, 0x00, 0x0C, 0x70, 0x00, 0x10, + 0x28, 0x57, 0xEE, 0x01, 0x26, 0x65, 0x28, 0x57, 0x0C, 0x00, 0xC6, 0x65, 0x02, 0x17, 0x98, 0x57, + 0xC0, 0x03, 0x92, 0x14, 0x28, 0x57, 0x06, 0x00, 0xDC, 0x50, 0xE0, 0x0E, 0x92, 0x0F, 0x38, 0x70, + 0x28, 0x16, 0x04, 0x21, 0x24, 0x71, 0xB9, 0x70, 0x28, 0x16, 0x38, 0x60, 0x40, 0x16, 0x18, 0x66, + 0x24, 0x00, 0xC6, 0x76, 0xD2, 0x06, 0x06, 0x25, 0xF2, 0x04, 0xB9, 0x00, 0x28, 0x16, 0x04, 0x20, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x18, 0x70, 0x68, 0x16, 0x18, 0x50, + 0x67, 0x16, 0xC6, 0x57, 0x82, 0x3F, 0x99, 0x70, 0x67, 0x16, 0xC4, 0x70, 0x18, 0x70, 0x64, 0x16, + 0x1C, 0x60, 0x10, 0x00, 0x56, 0x76, 0x82, 0x1C, 0x64, 0x72, 0x99, 0x70, 0x64, 0x16, 0xCB, 0x30, + 0x01, 0x00, 0xB9, 0x00, 0x30, 0x16, 0xB9, 0x00, 0x28, 0x16, 0x38, 0x70, 0x40, 0x16, 0x18, 0x27, + 0x41, 0x00, 0x18, 0x37, 0x7A, 0x00, 0x18, 0x47, 0x79, 0x00, 0x18, 0x57, 0x5A, 0x00, 0x18, 0x67, + 0x24, 0x00, 0x0C, 0xF0, 0xA8, 0x00, 0xF1, 0xF0, 0xB9, 0x20, 0x2C, 0x16, 0xF2, 0x0C, 0x64, 0x71, + 0x99, 0x70, 0x64, 0x16, 0x0B, 0x32, 0x01, 0x00, 0x38, 0x70, 0x40, 0x16, 0x18, 0x67, 0x57, 0x00, + 0x99, 0x60, 0x05, 0x13, 0x98, 0x70, 0x68, 0x16, 0x82, 0x05, 0x0C, 0xF0, 0x68, 0x01, 0xF1, 0xF0, + 0xF2, 0x05, 0x18, 0x20, 0x64, 0x16, 0x4B, 0xD0, 0x00, 0x00, 0x18, 0x20, 0x64, 0x16, 0x4B, 0x7B, + 0x00, 0x00, 0x18, 0x20, 0x64, 0x16, 0xCB, 0x76, 0x00, 0x00, 0x18, 0x20, 0x64, 0x16, 0x4B, 0xC4, + 0x00, 0x00, 0x18, 0x20, 0x64, 0x16, 0x4B, 0xD0, 0x00, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x04, 0x62, 0xB1, 0xF1, 0x99, 0x60, 0x65, 0x16, 0x4B, 0xBC, + 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBA, 0x00, 0x00, 0x04, 0x28, + 0x0B, 0xBB, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0B, 0xBA, 0x00, 0x00, 0x0B, 0x2A, 0x01, 0x00, + 0x8B, 0xD4, 0x02, 0x00, 0x86, 0x32, 0x82, 0x0C, 0x18, 0x70, 0x56, 0x16, 0x5C, 0x70, 0xF0, 0x00, + 0xCC, 0x70, 0x40, 0x00, 0x82, 0x07, 0x04, 0x61, 0x99, 0x60, 0x68, 0x16, 0xF2, 0x03, 0x4B, 0x21, + 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0x04, 0x63, 0xC1, 0xE1, 0x99, 0x60, + 0x65, 0x16, 0xCB, 0x83, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x07, 0x4B, 0xBC, 0x00, 0x00, 0x0C, 0xF0, + 0x68, 0x01, 0xF1, 0xF0, 0xF2, 0x03, 0xCB, 0xBC, 0x00, 0x00, 0x0C, 0xF0, 0x8C, 0x01, 0xF1, 0xF0, + 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0x8B, 0x3D, 0x01, 0x00, 0x06, 0xE2, 0x04, 0x21, 0x0B, 0xBA, + 0x00, 0x00, 0x04, 0x28, 0x0B, 0xBB, 0x00, 0x00, 0x0C, 0x20, 0x10, 0x00, 0x0B, 0xBA, 0x00, 0x00, + 0xC4, 0xE0, 0x82, 0x03, 0x0B, 0x41, 0x01, 0x00, 0x98, 0x70, 0x05, 0x10, 0x82, 0x06, 0xB9, 0x00, + 0x30, 0x16, 0xB9, 0x00, 0x24, 0x16, 0xF2, 0x06, 0x38, 0x70, 0x30, 0x16, 0x24, 0x71, 0xB9, 0x70, + 0x30, 0x16, 0x0B, 0x2A, 0x01, 0x00, 0x38, 0x70, 0x2C, 0x16, 0x38, 0x60, 0x30, 0x16, 0x24, 0x73, + 0xC6, 0x67, 0xA2, 0x05, 0x99, 0x00, 0x68, 0x16, 0x99, 0x00, 0x60, 0x16, 0x98, 0x60, 0x66, 0x16, + 0x82, 0x0B, 0x04, 0x20, 0x99, 0x00, 0x68, 0x16, 0x99, 0x00, 0x66, 0x16, 0x0B, 0xF2, 0x00, 0x00, + 0x04, 0x21, 0x0B, 0x7C, 0x00, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x98, 0x70, 0x68, 0x16, + 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x04, 0xCB, 0x8E, 0x00, 0x00, 0xF2, 0x03, 0x2B, 0x8C, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0xAB, 0x30, 0x00, 0x00, + 0xC4, 0x20, 0x82, 0x03, 0x0B, 0xE6, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x04, 0x20, 0xB1, 0xF1, 0x4B, 0xF1, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x34, 0x18, 0x04, 0x20, 0xC1, 0xE1, 0xCB, 0xF2, 0x00, 0x00, 0x06, 0xE2, 0x04, 0x20, 0x0B, 0xF2, + 0x00, 0x00, 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0xCB, 0x13, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x05, 0x38, 0x20, 0x20, 0x16, 0x4B, 0x15, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0x04, 0x21, 0xC1, 0xE1, 0x4B, 0xF1, + 0x00, 0x00, 0x08, 0xE0, 0x07, 0x00, 0x2C, 0xE0, 0x20, 0xA1, 0xEB, 0x96, 0x00, 0x00, 0x98, 0x70, + 0x5F, 0x16, 0x92, 0x1B, 0x04, 0x21, 0xCB, 0xF2, 0x00, 0x00, 0x26, 0x22, 0x06, 0x72, 0x57, 0x71, + 0x26, 0x27, 0xC6, 0x2E, 0xC2, 0xF3, 0x08, 0x70, 0x00, 0x80, 0x38, 0x77, 0xCC, 0xFB, 0xCC, 0x70, + 0xFF, 0x00, 0x82, 0x04, 0x98, 0x70, 0x5E, 0x16, 0x82, 0x08, 0x04, 0x21, 0x0B, 0xF2, 0x00, 0x00, + 0x04, 0x21, 0x4B, 0xF1, 0x00, 0x00, 0xF2, 0xE2, 0x04, 0x21, 0x0B, 0xF2, 0x00, 0x00, 0x40, 0xE1, + 0x24, 0x18, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x80, 0xC6, 0x27, 0x34, 0x14, 0xB1, 0xF1, 0x82, 0x03, + 0xC6, 0x37, 0x92, 0x04, 0x3B, 0xA5, 0x00, 0x00, 0xF2, 0x0E, 0x08, 0x70, 0x00, 0x40, 0x04, 0x61, + 0xB9, 0x67, 0x00, 0x80, 0xB9, 0x27, 0x04, 0x80, 0xB9, 0x37, 0x08, 0x80, 0xB9, 0x07, 0x0C, 0x80, + 0x38, 0x27, 0x10, 0x80, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x34, 0x14, + 0xB1, 0xF1, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, 0x18, 0x80, 0xB9, 0x47, 0x1C, 0x80, + 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x20, 0x80, 0xF2, 0x05, + 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA6, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x06, 0x72, 0x34, 0x14, 0x06, 0x43, 0x04, 0x21, 0x06, 0x37, 0xB1, 0xF1, 0x6B, 0x9C, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD3, + 0xF7, 0xDF, 0xC4, 0xD0, 0x06, 0xE4, 0xF7, 0xEF, 0x82, 0x02, 0x16, 0x33, 0xC4, 0xE0, 0x82, 0x02, + 0x16, 0x44, 0xC4, 0x20, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, 0x18, 0x80, 0xB9, 0x47, + 0x1C, 0x80, 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, 0x38, 0x26, 0x20, 0x80, + 0xF2, 0x05, 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA6, 0x00, 0x00, 0xC6, 0xDE, 0x82, 0x02, 0x16, 0x22, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x80, 0xC6, 0x26, 0x34, 0x14, + 0xB1, 0xF1, 0x06, 0x72, 0x06, 0x43, 0x82, 0x04, 0xC6, 0x36, 0x04, 0x21, 0x92, 0x02, 0x04, 0x20, + 0x06, 0x37, 0xCB, 0x9E, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x20, 0x3C, 0x10, + 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE3, 0x06, 0xD4, 0x82, 0x0F, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x37, + 0x18, 0x80, 0xB9, 0x47, 0x1C, 0x80, 0x06, 0x67, 0x38, 0x76, 0x28, 0x80, 0xD4, 0x71, 0x82, 0xFD, + 0x38, 0x26, 0x24, 0x80, 0xF2, 0x0A, 0x06, 0x23, 0x06, 0x34, 0x5B, 0xA6, 0x00, 0x00, 0x06, 0x3D, + 0xAB, 0x9A, 0x00, 0x00, 0x3F, 0x22, 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, + 0x06, 0x72, 0x34, 0x14, 0x06, 0x43, 0x04, 0x21, 0x06, 0x37, 0xB1, 0xF1, 0x6B, 0xA2, 0x00, 0x00, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x30, 0x04, 0x40, 0x04, 0x50, 0x0C, 0x60, 0x20, 0x00, + 0x52, 0x03, 0xA6, 0x42, 0x25, 0x50, 0xB4, 0x61, 0x02, 0x06, 0xA6, 0x44, 0x25, 0x55, 0xA6, 0x33, + 0x42, 0xF9, 0xF2, 0xFA, 0x06, 0x24, 0x06, 0x35, 0xE1, 0xF0, 0x04, 0x40, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x9E, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9D, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9C, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x9B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x9A, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x99, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x98, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x97, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x96, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x95, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x94, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x93, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x92, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x91, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x90, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8F, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x8E, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8D, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8C, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x8B, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x8A, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x89, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x88, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x87, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, + 0xC6, 0x43, 0xBA, 0x86, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x85, 0x00, 0x00, + 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x84, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, + 0xBA, 0x83, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x82, 0x00, 0x00, 0xA6, 0x22, + 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x81, 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x80, + 0x00, 0x00, 0xA6, 0x22, 0x25, 0x44, 0xC6, 0x43, 0xBA, 0x7F, 0x00, 0x00, 0xE1, 0xF0, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x62, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x63, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x64, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x65, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x66, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x67, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x68, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x69, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6A, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6B, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6C, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6D, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x6E, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x6F, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x70, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x71, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x72, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x73, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x74, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x75, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x76, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x77, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x78, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x79, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7A, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7B, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7C, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7D, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x7E, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xFA, 0x7F, 0xFF, 0xFF, 0x36, 0x43, + 0x24, 0x21, 0xFA, 0x80, 0xFF, 0xFF, 0x36, 0x43, 0x24, 0x21, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, + 0x08, 0x70, 0x00, 0x40, 0xC4, 0x20, 0x38, 0x67, 0x60, 0x71, 0x82, 0x09, 0x08, 0x50, 0x40, 0x00, + 0x66, 0x65, 0xB9, 0x67, 0x60, 0x71, 0x2B, 0x4E, 0x00, 0x00, 0xF2, 0x08, 0x08, 0x50, 0xBF, 0xFF, + 0x2C, 0x50, 0xFF, 0xFF, 0x56, 0x65, 0xB9, 0x67, 0x60, 0x71, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x70, 0xD6, 0x72, 0x82, 0xFD, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0xC1, 0xE1, 0x06, 0xE2, 0x8B, 0xBA, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0xE7, + 0x00, 0x70, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x64, 0x72, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x64, 0x71, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x70, 0x70, + 0x14, 0x52, 0x56, 0x75, 0xB9, 0x76, 0x70, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, + 0x38, 0x27, 0xE0, 0x70, 0x5C, 0x20, 0xFF, 0x7F, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, + 0x38, 0x27, 0x5C, 0x70, 0x5C, 0x20, 0x7F, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x08, 0x60, + 0x00, 0x40, 0x82, 0x08, 0x08, 0x70, 0x0F, 0xC0, 0x2C, 0x70, 0xFF, 0xFF, 0xB9, 0x76, 0x3C, 0x71, + 0xF2, 0x03, 0xB9, 0x06, 0x3C, 0x71, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0x20, + 0x08, 0x70, 0x08, 0xD0, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2D, 0x2C, 0x30, 0x08, 0xE2, + 0x0C, 0x40, 0xF8, 0x02, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x40, 0x08, 0xE0, + 0x00, 0x30, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0xE5, 0x0C, 0x40, 0x00, 0x09, + 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xC4, 0x52, 0x08, 0x30, 0x00, 0x80, 0x26, 0x2E, + 0x2C, 0x30, 0x00, 0xEE, 0x0C, 0x40, 0x50, 0x01, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x08, 0x70, + 0x0F, 0xC0, 0x2C, 0x70, 0xFF, 0xFF, 0x0C, 0x20, 0x00, 0x40, 0x08, 0x30, 0x00, 0x80, 0xB9, 0x7D, + 0x3C, 0x71, 0x26, 0x2E, 0x2C, 0x30, 0x00, 0xF0, 0x0C, 0x40, 0x00, 0x09, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x49, 0x08, 0x30, 0x08, 0x07, 0xB9, 0x0D, 0x3C, 0x71, 0x26, 0x2E, + 0x2C, 0x30, 0x08, 0x07, 0x0C, 0x40, 0x00, 0x09, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x23, 0x82, 0x5F, 0xC4, 0x23, 0x08, 0x70, + 0x00, 0x40, 0xD2, 0x06, 0xC4, 0x21, 0x82, 0x1A, 0xC4, 0x22, 0x82, 0x2B, 0xF2, 0x71, 0xCC, 0x20, + 0x81, 0x00, 0x82, 0x1D, 0xCC, 0x20, 0x82, 0x00, 0x82, 0x3A, 0xC4, 0x28, 0x92, 0x69, 0x0C, 0x50, + 0x40, 0x40, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x50, 0x03, 0x00, + 0x2C, 0x50, 0x63, 0x07, 0xB9, 0x57, 0x54, 0x70, 0xF2, 0x55, 0x08, 0x50, 0x14, 0x00, 0x2C, 0x50, + 0x4C, 0x26, 0xB9, 0x57, 0x34, 0x70, 0xB9, 0x27, 0x64, 0x70, 0xF2, 0x1C, 0x08, 0x50, 0x23, 0x00, + 0x2C, 0x50, 0x48, 0x20, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0xF2, 0x22, + 0x98, 0x50, 0x63, 0x16, 0x08, 0x50, 0x14, 0x00, 0x2C, 0x50, 0x4C, 0x26, 0xB9, 0x57, 0x34, 0x70, + 0x82, 0x04, 0xB9, 0x27, 0x64, 0x70, 0xF2, 0x04, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, 0x61, 0xC7, 0xF2, 0x10, 0x08, 0x50, 0x23, 0x00, + 0x2C, 0x50, 0x48, 0x20, 0xB9, 0x57, 0x34, 0x70, 0x04, 0x52, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, 0x61, 0x07, 0xB9, 0x57, 0x54, 0x70, 0x08, 0x50, + 0x80, 0x0F, 0x2C, 0x50, 0x80, 0x0F, 0xF2, 0x14, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x50, 0x26, 0x26, + 0xB9, 0x57, 0x34, 0x70, 0x04, 0x51, 0xB9, 0x57, 0x64, 0x70, 0x08, 0x50, 0x03, 0x00, 0x2C, 0x50, + 0x63, 0x07, 0xB9, 0x57, 0x54, 0x70, 0x08, 0x50, 0x00, 0x0E, 0x2C, 0x50, 0x00, 0x0E, 0xB9, 0x57, + 0x6C, 0x70, 0x08, 0x50, 0xF0, 0x07, 0x2C, 0x50, 0x66, 0x7F, 0xB9, 0x57, 0x1C, 0x71, 0x08, 0x70, + 0x00, 0x40, 0x08, 0x50, 0x64, 0x00, 0xB9, 0x57, 0x30, 0x70, 0x08, 0x70, 0x01, 0x00, 0x08, 0x60, + 0x00, 0x40, 0x2C, 0x70, 0xFF, 0x3F, 0xB9, 0x76, 0x58, 0x70, 0xE1, 0xF0, 0x54, 0x2F, 0xC4, 0x21, + 0x92, 0x04, 0x38, 0x60, 0x38, 0x16, 0xF2, 0x03, 0x38, 0x60, 0x3C, 0x16, 0x38, 0x56, 0x08, 0x00, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x57, 0xB4, 0x70, 0x38, 0x56, 0x0C, 0x00, 0x08, 0x40, 0xDF, 0xFF, + 0xB9, 0x57, 0xB8, 0x70, 0x38, 0x56, 0x10, 0x00, 0x2C, 0x40, 0xFF, 0xFF, 0x56, 0x54, 0xB9, 0x57, + 0xC0, 0x70, 0x38, 0x56, 0x14, 0x00, 0xB9, 0x57, 0xC4, 0x70, 0x98, 0x50, 0x57, 0x16, 0x82, 0x0C, + 0x08, 0x60, 0x01, 0x00, 0x2C, 0x60, 0x81, 0x11, 0xB9, 0x67, 0xAC, 0x70, 0x08, 0x60, 0x10, 0x00, + 0x2C, 0x60, 0x10, 0x00, 0xF2, 0x06, 0x30, 0x56, 0xB9, 0x57, 0xAC, 0x70, 0x38, 0x66, 0x04, 0x00, + 0xB9, 0x67, 0xB0, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x70, + 0x38, 0x16, 0xF2, 0x03, 0x38, 0x70, 0x3C, 0x16, 0x18, 0x60, 0xC0, 0x13, 0xC4, 0x62, 0xC2, 0x04, + 0x38, 0x57, 0x20, 0x00, 0xF2, 0x08, 0xC4, 0x62, 0x92, 0x04, 0x38, 0x57, 0x1C, 0x00, 0xF2, 0x03, + 0x38, 0x57, 0x18, 0x00, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0xC8, 0x70, 0x38, 0x57, 0x24, 0x00, + 0xB9, 0x56, 0xCC, 0x70, 0x38, 0x77, 0x28, 0x00, 0xB9, 0x76, 0xD4, 0x70, 0xE1, 0xF0, 0x00, 0x00, + 0x54, 0x2F, 0xC4, 0x21, 0x92, 0x04, 0x38, 0x70, 0x38, 0x16, 0xF2, 0x03, 0x38, 0x70, 0x3C, 0x16, + 0x38, 0x57, 0x2C, 0x00, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x56, 0x8C, 0x70, 0x38, 0x57, 0x30, 0x00, + 0xB9, 0x56, 0x90, 0x70, 0x38, 0x57, 0x34, 0x00, 0xB9, 0x56, 0x94, 0x70, 0x38, 0x57, 0x38, 0x00, + 0xB9, 0x56, 0x98, 0x70, 0x38, 0x57, 0x3C, 0x00, 0xB9, 0x56, 0x9C, 0x70, 0x38, 0x57, 0x40, 0x00, + 0xB9, 0x56, 0xA0, 0x70, 0x38, 0x57, 0x44, 0x00, 0xB9, 0x56, 0xA4, 0x70, 0x38, 0x77, 0x48, 0x00, + 0xB9, 0x76, 0xA8, 0x70, 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x60, 0x00, 0xDE, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x67, 0x10, 0x60, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x07, 0x10, 0x60, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0xFE, 0x00, 0xB9, 0x67, 0x0C, 0x20, + 0xB9, 0x07, 0x18, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x51, 0x00, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, + 0xC4, 0x20, 0x38, 0x67, 0x34, 0x10, 0x82, 0x03, 0x64, 0x63, 0xF2, 0x03, 0x14, 0x54, 0x56, 0x65, + 0xB9, 0x67, 0x34, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x2C, 0x70, 0x8C, 0x03, + 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x00, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, + 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x8C, 0x03, 0xB9, 0x76, 0x00, 0x10, 0xB9, 0x26, 0x6C, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0x0C, 0x50, 0x10, 0x00, 0xB9, 0x57, 0x20, 0x10, 0x08, 0x50, 0x38, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0x2C, 0x50, 0x80, 0x88, 0xB9, 0x57, 0x24, 0x10, 0xB9, 0x67, 0x00, 0x10, + 0xB9, 0x07, 0x28, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, + 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0xC4, 0x30, 0x38, 0x67, 0x50, 0x10, 0x82, 0x05, + 0x66, 0x62, 0xB9, 0x67, 0x50, 0x10, 0xF2, 0x05, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x50, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, + 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x54, 0x10, 0x66, 0x62, 0xB9, 0x67, 0x54, 0x10, 0xE1, 0xF0, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x38, 0x67, 0x54, 0x10, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x54, 0x10, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, + 0x38, 0x57, 0x58, 0x10, 0xCC, 0x20, 0xFF, 0x00, 0x1C, 0x40, 0x00, 0x01, 0x56, 0x54, 0x92, 0x0A, + 0xB9, 0x57, 0x58, 0x10, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, 0x14, 0x52, 0x56, 0x65, + 0xF2, 0x09, 0x66, 0x52, 0xB9, 0x57, 0x58, 0x10, 0xB9, 0x67, 0x00, 0x10, 0x38, 0x67, 0x4C, 0x10, + 0x64, 0x61, 0xB9, 0x67, 0x4C, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0xAD, 0xDE, 0x08, 0x70, 0x00, 0x40, + 0x2C, 0x60, 0x8C, 0x03, 0xB9, 0x67, 0x00, 0x10, 0xC4, 0x30, 0x38, 0x67, 0x4C, 0x10, 0x82, 0x05, + 0x66, 0x62, 0xB9, 0x67, 0x4C, 0x10, 0xF2, 0x05, 0x15, 0x22, 0x56, 0x26, 0xB9, 0x27, 0x4C, 0x10, + 0xE1, 0xF0, 0x00, 0x00, 0x08, 0x70, 0xAD, 0xDE, 0x08, 0x60, 0x00, 0x40, 0x2C, 0x70, 0x8C, 0x03, + 0xB9, 0x76, 0x00, 0x10, 0x04, 0x73, 0xB9, 0x76, 0x44, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, + 0x38, 0x76, 0x08, 0x10, 0x66, 0x72, 0xB9, 0x76, 0x08, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, + 0x38, 0x76, 0x64, 0x10, 0x66, 0x72, 0xB9, 0x76, 0x64, 0x10, 0xE1, 0xF0, 0x04, 0x62, 0x08, 0x70, + 0x00, 0x40, 0xB9, 0x67, 0x14, 0x10, 0xE1, 0xF0, 0x23, 0x22, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, + 0x10, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x14, 0x10, 0x64, 0x71, 0xB9, 0x76, + 0x14, 0x10, 0xE1, 0xF0, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x14, 0x10, 0x14, 0x52, 0x56, 0x75, + 0xB9, 0x76, 0x14, 0x10, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x20, 0x04, 0x7F, 0x82, 0x03, 0x0C, 0x70, + 0x9C, 0x00, 0x6C, 0x70, 0x00, 0x01, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x74, 0x10, 0xE1, 0xF0, + 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x70, 0x10, 0xE1, 0xF0, 0xC4, 0x20, 0x08, 0x70, + 0x00, 0x40, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, + 0xC4, 0x30, 0x57, 0x21, 0x08, 0x70, 0x00, 0x40, 0x26, 0x72, 0x82, 0x04, 0x04, 0x61, 0xB1, 0x67, + 0xF2, 0x02, 0xB1, 0x07, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x6B, 0x12, + 0x00, 0x00, 0x08, 0x70, 0x1C, 0xE1, 0x08, 0x60, 0x00, 0x30, 0x2C, 0x70, 0x04, 0xE9, 0xB9, 0x76, + 0x04, 0x01, 0x08, 0xE0, 0x00, 0x40, 0xB9, 0x76, 0x08, 0x01, 0x2C, 0xE0, 0x70, 0x10, 0x04, 0xD1, + 0xB1, 0xDE, 0x04, 0x2A, 0xEB, 0x4E, 0x00, 0x00, 0xF2, 0xFC, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x67, 0x14, 0x40, 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, + 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, + 0x08, 0x00, 0x04, 0x61, 0x08, 0x70, 0x00, 0x40, 0xB9, 0x67, 0x14, 0x50, 0x48, 0x61, 0x08, 0x00, + 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, 0x3C, 0x10, 0x24, 0x00, + 0xD9, 0x41, 0x08, 0x00, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x1C, 0x00, 0x04, 0x61, 0xB9, 0xF1, + 0x18, 0x00, 0xC1, 0x21, 0x99, 0x60, 0x6A, 0x16, 0x6B, 0x4D, 0x00, 0x00, 0x04, 0x61, 0x08, 0x70, + 0x00, 0x40, 0xB9, 0x67, 0x78, 0x10, 0x48, 0x61, 0x1C, 0x00, 0x38, 0xF1, 0x18, 0x00, 0x40, 0x21, + 0x11, 0x16, 0x11, 0x07, 0x58, 0x41, 0x08, 0x00, 0x2C, 0x10, 0x24, 0x00, 0x61, 0x00, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xC1, 0x61, 0x01, 0x61, 0x01, 0x70, 0xC9, 0x61, 0x08, 0x00, 0x08, 0x70, + 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xB9, 0x67, 0x08, 0x70, 0x04, 0x61, 0x99, 0x60, 0x69, 0x16, + 0x48, 0x61, 0x08, 0x00, 0x11, 0x16, 0x11, 0x07, 0x40, 0x61, 0x2C, 0x10, 0x10, 0x00, 0x61, 0x00, + 0x08, 0x70, 0x04, 0x00, 0x24, 0x74, 0x26, 0x27, 0x08, 0x70, 0xFF, 0xBF, 0x57, 0x26, 0x2C, 0x70, + 0x00, 0xC0, 0xB1, 0x42, 0x26, 0x27, 0x0C, 0x40, 0x04, 0x40, 0x08, 0x70, 0x00, 0x40, 0x26, 0x47, + 0x26, 0x42, 0xB1, 0x34, 0x0C, 0x40, 0x10, 0x40, 0x26, 0x47, 0x26, 0x42, 0x2C, 0x70, 0x08, 0x40, + 0xB1, 0x54, 0x26, 0x27, 0xB1, 0x62, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, 0x2C, 0x70, 0x08, 0x40, + 0x57, 0x26, 0x26, 0x27, 0x30, 0x72, 0x6C, 0x70, 0x00, 0x01, 0xB1, 0x72, 0xE1, 0xF0, 0x00, 0x00, + 0x08, 0x70, 0x00, 0x40, 0x2C, 0x70, 0x08, 0x40, 0x57, 0x26, 0x26, 0x27, 0x30, 0x72, 0x1C, 0x60, + 0x01, 0x01, 0x56, 0x76, 0xB1, 0x72, 0xE1, 0xF0, 0x08, 0x70, 0x00, 0x40, 0x57, 0x26, 0x2C, 0x70, + 0x0C, 0x40, 0x26, 0x72, 0x30, 0x27, 0xE1, 0xF0, 0x2F, 0x62, 0x02, 0x00, 0x26, 0x62, 0x57, 0x61, + 0x26, 0x62, 0xC4, 0x3A, 0x26, 0x63, 0xB1, 0x64, 0x06, 0x72, 0xC2, 0x0D, 0x06, 0x57, 0x0C, 0x50, + 0x44, 0x16, 0x28, 0x70, 0x44, 0x16, 0x28, 0x55, 0x02, 0x00, 0xC6, 0x67, 0x04, 0x21, 0x82, 0x0C, + 0xC6, 0x65, 0xF2, 0x08, 0xCC, 0x70, 0x11, 0x00, 0x04, 0x22, 0xC2, 0x06, 0xCC, 0x70, 0xFF, 0x00, + 0x04, 0x23, 0x82, 0x02, 0x04, 0x20, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xC2, + 0x06, 0xE4, 0x04, 0x21, 0x06, 0xD3, 0x6B, 0xBE, 0x00, 0x00, 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, + 0x00, 0x40, 0x57, 0xC1, 0x2F, 0x27, 0x0C, 0x00, 0x30, 0x62, 0xC4, 0xE0, 0x0C, 0x70, 0xFF, 0x03, + 0x56, 0x76, 0x77, 0x65, 0x82, 0x09, 0xC4, 0xD0, 0x82, 0x04, 0x26, 0x7E, 0x26, 0x6E, 0xF2, 0x11, + 0x36, 0x6E, 0x36, 0x7E, 0xF2, 0x0E, 0xC4, 0xD0, 0x82, 0x07, 0xC6, 0x67, 0x02, 0x03, 0x24, 0x71, + 0xF2, 0x08, 0x24, 0x61, 0xF2, 0x06, 0xC6, 0x67, 0x02, 0x03, 0x34, 0x61, 0xF2, 0x02, 0x34, 0x71, + 0xC4, 0x70, 0x02, 0x09, 0xCC, 0x70, 0xFF, 0x03, 0x04, 0xE0, 0x02, 0x07, 0x14, 0xE1, 0x0C, 0x70, + 0xFF, 0x03, 0xF2, 0x03, 0x14, 0xE1, 0x04, 0x71, 0xC4, 0x60, 0x02, 0x08, 0xCC, 0x60, 0xFF, 0x03, + 0x02, 0x07, 0x14, 0xE1, 0x0C, 0x60, 0xFF, 0x03, 0xF2, 0x03, 0x14, 0xE1, 0x04, 0x61, 0x57, 0x65, + 0x66, 0x67, 0xB1, 0x62, 0x04, 0x20, 0x6B, 0xBE, 0x00, 0x00, 0x06, 0x2E, 0x50, 0xC1, 0x2C, 0x10, + 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x1C, 0x09, 0x23, 0x32, 0x0C, 0x40, 0x80, 0x04, 0x06, 0x21, + 0xD9, 0xC1, 0x0C, 0x09, 0xC9, 0xA1, 0x04, 0x09, 0x4B, 0x50, 0x00, 0x00, 0x0C, 0x20, 0xC0, 0x06, + 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, + 0x80, 0x04, 0x26, 0x21, 0x04, 0x31, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x04, 0x21, 0x08, 0xA0, 0x00, 0x30, 0x0B, 0xBB, 0x00, 0x00, 0x0C, 0xB0, 0x22, 0x00, 0x2C, 0xA0, + 0x00, 0x49, 0x04, 0x21, 0x04, 0xD0, 0x0B, 0xBA, 0x00, 0x00, 0x06, 0xED, 0x04, 0xC0, 0x0C, 0x40, + 0x00, 0x09, 0x06, 0x2D, 0x06, 0x3C, 0x26, 0x41, 0x4B, 0xF3, 0x00, 0x00, 0xC4, 0x20, 0x82, 0x3F, + 0x38, 0x21, 0x00, 0x09, 0x0C, 0x60, 0xC0, 0x06, 0x06, 0x72, 0x57, 0x71, 0x26, 0x61, 0x26, 0x7A, + 0x26, 0x62, 0x30, 0x77, 0x90, 0x46, 0x5C, 0x70, 0xFF, 0x0F, 0x3C, 0x70, 0x08, 0x07, 0x82, 0x04, + 0xCC, 0x70, 0x46, 0x00, 0x02, 0x2B, 0x0C, 0x60, 0x80, 0x04, 0x26, 0x61, 0x26, 0x62, 0x10, 0x56, + 0xC4, 0x51, 0x2F, 0x52, 0x02, 0x00, 0x92, 0x05, 0xC4, 0x70, 0x22, 0x12, 0x91, 0x06, 0xF2, 0x10, + 0xC4, 0x70, 0x12, 0x0E, 0x04, 0x71, 0x91, 0x76, 0x2F, 0x75, 0x01, 0x00, 0xA0, 0x77, 0x92, 0x08, + 0x0C, 0x70, 0xC0, 0x06, 0x04, 0x61, 0x26, 0x71, 0x26, 0x64, 0x26, 0x72, 0x91, 0x67, 0x2F, 0x75, + 0x01, 0x00, 0x20, 0x47, 0xF7, 0x40, 0xA1, 0x47, 0x0C, 0x70, 0x80, 0x04, 0x26, 0x71, 0x26, 0x72, + 0x10, 0x37, 0x4B, 0xF5, 0x00, 0x00, 0xC4, 0x20, 0x32, 0x02, 0x24, 0xE1, 0x24, 0xC1, 0xC4, 0xCD, + 0x92, 0xB7, 0x24, 0xD1, 0xCC, 0xD0, 0x13, 0x00, 0x92, 0xB2, 0xCC, 0xE0, 0xC8, 0x00, 0x82, 0x07, + 0xB4, 0xB1, 0x82, 0x05, 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0xF2, 0xA4, 0x58, 0xC1, 0x0C, 0x09, + 0x48, 0xA1, 0x04, 0x09, 0x2C, 0x10, 0x1C, 0x09, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x34, 0x00, + 0xD9, 0x81, 0x14, 0x00, 0xD9, 0xC1, 0x24, 0x00, 0xB9, 0x21, 0x04, 0x00, 0x06, 0x93, 0x06, 0x84, + 0x04, 0xEA, 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBA, 0x00, 0x00, 0xB4, 0xE1, + 0x92, 0xF9, 0x08, 0xC0, 0x00, 0x30, 0x1C, 0x50, 0x88, 0x13, 0x06, 0xBE, 0x06, 0x7E, 0x06, 0x6E, + 0x06, 0xAE, 0x2C, 0xC0, 0x00, 0x49, 0x04, 0xD0, 0x06, 0x2E, 0x06, 0x3D, 0x06, 0x41, 0xB9, 0x51, + 0x10, 0x00, 0xB9, 0x61, 0x08, 0x00, 0xB9, 0x71, 0x0C, 0x00, 0x4B, 0xF3, 0x00, 0x00, 0xC4, 0x20, + 0x38, 0x51, 0x10, 0x00, 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, 0x0C, 0x00, 0x82, 0x19, 0x30, 0x41, + 0x57, 0x41, 0x26, 0x4C, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x0F, 0x3C, 0x40, 0x08, 0x07, 0xC4, 0x40, + 0x32, 0x02, 0x16, 0x44, 0xCC, 0x40, 0xC8, 0x00, 0x02, 0x02, 0x04, 0xA1, 0x1C, 0x30, 0xC8, 0x00, + 0x26, 0x34, 0xC6, 0x53, 0x32, 0x05, 0x06, 0x53, 0x06, 0xBE, 0x06, 0x7D, 0x06, 0x64, 0x24, 0xD1, + 0xC4, 0xDD, 0x92, 0xD3, 0x24, 0xE1, 0xCC, 0xE0, 0x13, 0x00, 0x92, 0xCE, 0xB1, 0x68, 0xB1, 0x79, + 0x04, 0x20, 0x38, 0x71, 0x04, 0x00, 0xC6, 0xA2, 0xB1, 0xB7, 0x82, 0x02, 0x04, 0x24, 0x58, 0xC1, + 0x24, 0x00, 0x58, 0x81, 0x14, 0x00, 0x2C, 0x10, 0x34, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x06, 0xE4, 0x06, 0xC2, 0x04, 0x28, 0x06, 0xD3, 0x4B, 0xC4, 0x00, 0x00, 0x08, 0x70, + 0x01, 0x00, 0x2C, 0x70, 0xFF, 0x3F, 0x08, 0x60, 0x00, 0x40, 0xB9, 0x76, 0x58, 0x70, 0x04, 0x21, + 0x6B, 0xBE, 0x00, 0x00, 0x08, 0x20, 0x00, 0x30, 0x08, 0x30, 0x08, 0x00, 0x2C, 0x30, 0x00, 0x02, + 0x0C, 0x40, 0x00, 0x09, 0x2C, 0x20, 0x00, 0x40, 0x0C, 0xF0, 0x40, 0x01, 0xF1, 0xF0, 0x04, 0x20, + 0x6B, 0xBE, 0x00, 0x00, 0x0C, 0x20, 0x00, 0x02, 0x2B, 0xFA, 0x00, 0x00, 0x06, 0x2C, 0x06, 0x3D, + 0x06, 0x4E, 0xEB, 0x02, 0x01, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x18, 0x00, 0xD9, 0xC1, 0x08, 0x00, 0xC1, 0xA1, 0x06, 0xC3, 0x06, 0xB2, 0x4B, 0xD5, + 0x00, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x00, 0xF0, 0x08, 0x60, 0x00, 0x80, 0x2F, 0xD6, + 0x07, 0x00, 0x2C, 0x60, 0x00, 0x0C, 0x2F, 0xA6, 0x07, 0x00, 0x06, 0xED, 0x06, 0x3E, 0x0C, 0x20, + 0x30, 0x00, 0x77, 0x31, 0x0C, 0xF0, 0x9C, 0x02, 0xF1, 0xF0, 0x2C, 0xE0, 0x00, 0x04, 0xC6, 0xEA, + 0x92, 0xF6, 0x0C, 0xF0, 0x98, 0x02, 0xF1, 0xF0, 0x06, 0x3D, 0x06, 0x4B, 0x0C, 0x20, 0x50, 0x01, + 0x77, 0x31, 0x0C, 0x50, 0x40, 0x02, 0x0C, 0xF0, 0xD0, 0x02, 0xF1, 0xF0, 0x2B, 0x4E, 0x00, 0x00, + 0x08, 0x30, 0x00, 0x80, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x30, 0x00, 0xFA, 0x26, 0x37, 0x06, 0x4C, + 0x0C, 0x20, 0x50, 0x01, 0x77, 0x31, 0x0C, 0x50, 0x80, 0x00, 0x0C, 0xF0, 0xD0, 0x02, 0xF1, 0xF0, + 0xCB, 0xD5, 0x00, 0x00, 0x58, 0xC1, 0x08, 0x00, 0x40, 0xA1, 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, + 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x00, 0x80, 0xD1, 0x81, 0x06, 0xC4, + 0x06, 0x92, 0x06, 0xB3, 0x06, 0x2E, 0x0C, 0x20, 0x80, 0x0B, 0x06, 0x3D, 0x2C, 0x30, 0x00, 0xFA, + 0x0C, 0x40, 0x00, 0x02, 0x06, 0xA6, 0x06, 0x85, 0x0C, 0xF0, 0x04, 0x01, 0xF1, 0xF0, 0x06, 0x58, + 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xAB, 0x0C, 0x57, 0x56, 0x66, 0x57, 0x57, 0x98, 0x06, 0x7E, + 0x0C, 0x70, 0x80, 0x0B, 0x66, 0x59, 0xA9, 0x57, 0xCC, 0x01, 0x77, 0x58, 0xA9, 0x57, 0xCE, 0x01, + 0x38, 0x50, 0x14, 0x00, 0x2C, 0xD0, 0x00, 0xFA, 0xA9, 0x57, 0xD0, 0x01, 0x77, 0x58, 0xA9, 0x57, + 0xD2, 0x01, 0x38, 0x5D, 0xC8, 0x01, 0x06, 0x3B, 0x57, 0x38, 0x66, 0x3C, 0x24, 0x51, 0xCC, 0xA0, + 0x32, 0x00, 0xA9, 0x37, 0xC4, 0x01, 0xA9, 0x57, 0xC8, 0x01, 0x77, 0x38, 0x77, 0x58, 0xA9, 0x37, + 0xC6, 0x01, 0xA9, 0x57, 0xCA, 0x01, 0x04, 0x60, 0x92, 0x05, 0xA9, 0x67, 0xC0, 0x01, 0xA9, 0x67, + 0xC2, 0x01, 0x08, 0x20, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0x08, 0x30, + 0x00, 0x80, 0x2C, 0x40, 0x6C, 0x03, 0x36, 0x42, 0x2C, 0x30, 0xBC, 0x7D, 0x0C, 0xF0, 0x04, 0x01, + 0xF1, 0xF0, 0x08, 0x20, 0x00, 0x30, 0x06, 0x3E, 0x0C, 0x30, 0x80, 0x0B, 0x2C, 0x20, 0x00, 0x40, + 0x0B, 0x0C, 0x01, 0x00, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, + 0x18, 0x70, 0x64, 0x16, 0x1C, 0x50, 0x10, 0x00, 0x56, 0x75, 0xCC, 0x20, 0x32, 0x00, 0x3C, 0x10, + 0x1C, 0x00, 0x64, 0x78, 0xD9, 0xC1, 0x0C, 0x00, 0x99, 0x70, 0x64, 0x16, 0x08, 0xE0, 0x00, 0x80, + 0x06, 0xD2, 0x2C, 0xE0, 0x00, 0xFA, 0x92, 0x09, 0xB8, 0x7E, 0xC0, 0x01, 0x92, 0x06, 0x0C, 0x20, + 0x78, 0x00, 0xEB, 0x4E, 0x00, 0x00, 0xF2, 0x1C, 0x8B, 0x6C, 0x00, 0x00, 0x04, 0x21, 0xAB, 0x64, + 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0x04, 0x21, 0x0B, 0xBA, 0x00, 0x00, 0x04, 0x28, + 0x04, 0x34, 0x26, 0x31, 0x06, 0x41, 0x26, 0x21, 0xEB, 0x08, 0x01, 0x00, 0x06, 0x52, 0x38, 0x31, + 0x08, 0x00, 0x30, 0x21, 0x38, 0x41, 0x04, 0x00, 0x06, 0x6D, 0x8B, 0x10, 0x01, 0x00, 0x6B, 0x12, + 0x00, 0x00, 0x38, 0x6E, 0xCC, 0x01, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x04, 0x01, 0x38, 0x6E, + 0xC4, 0x01, 0xB9, 0x67, 0x08, 0x01, 0x0B, 0xE6, 0x00, 0x00, 0xF2, 0x00, 0x08, 0x60, 0x00, 0x30, + 0x0C, 0x70, 0x00, 0x49, 0x0C, 0x40, 0xDC, 0x4C, 0x26, 0x76, 0x26, 0x46, 0x30, 0x57, 0x04, 0x6A, + 0x5C, 0x50, 0xFF, 0x0F, 0x26, 0x65, 0x57, 0x68, 0x66, 0x65, 0xB1, 0x67, 0x24, 0x74, 0xC6, 0x74, + 0x92, 0xF6, 0xE1, 0xF0, 0x3C, 0x10, 0x28, 0x00, 0xD9, 0x81, 0x08, 0x00, 0xD9, 0xC1, 0x18, 0x00, + 0x04, 0x80, 0x08, 0xC0, 0x00, 0x30, 0xB9, 0x21, 0x04, 0x00, 0x06, 0xB3, 0x06, 0xA4, 0x06, 0x95, + 0x06, 0xE8, 0x2C, 0xC0, 0x00, 0x49, 0x04, 0xD0, 0x06, 0x28, 0x06, 0x3D, 0x06, 0x41, 0x4B, 0xF3, + 0x00, 0x00, 0xC4, 0x20, 0x82, 0x23, 0x30, 0x21, 0x38, 0x71, 0x04, 0x00, 0x06, 0x62, 0xC4, 0x71, + 0x57, 0x61, 0x26, 0x6C, 0x30, 0x66, 0x82, 0x02, 0x67, 0x68, 0x5C, 0x60, 0xFF, 0x0F, 0xCC, 0x60, + 0x13, 0x05, 0x12, 0x05, 0xC4, 0xB0, 0x04, 0x31, 0x82, 0x10, 0xF2, 0x07, 0xCC, 0x60, 0xFC, 0x08, + 0x02, 0x0D, 0xC4, 0xB0, 0x82, 0x0A, 0x04, 0x30, 0x06, 0x4A, 0x4B, 0xF5, 0x00, 0x00, 0x30, 0x51, + 0x2F, 0x6E, 0x0E, 0x00, 0x26, 0x69, 0xA1, 0x56, 0x24, 0xE1, 0x24, 0xD1, 0xC4, 0xDD, 0x92, 0xD5, + 0x24, 0x81, 0xCC, 0x80, 0x13, 0x00, 0x92, 0xD0, 0x06, 0x2E, 0x58, 0xC1, 0x18, 0x00, 0x58, 0x81, + 0x08, 0x00, 0x2C, 0x10, 0x28, 0x00, 0xE1, 0xF0, 0x98, 0x70, 0x5D, 0x16, 0x3C, 0x10, 0xA0, 0x04, + 0xD9, 0xC1, 0x90, 0x04, 0xD9, 0x81, 0x80, 0x04, 0x06, 0x42, 0x82, 0x4A, 0x06, 0x23, 0x06, 0x51, + 0x04, 0x31, 0xAB, 0x1C, 0x01, 0x00, 0x86, 0xD2, 0x02, 0x43, 0x04, 0x23, 0x4B, 0xC4, 0x00, 0x00, + 0x04, 0x21, 0x0B, 0xBB, 0x00, 0x00, 0x34, 0xD1, 0x04, 0x21, 0x26, 0xDD, 0x14, 0xA2, 0x08, 0xB0, + 0x00, 0x30, 0x0B, 0xBA, 0x00, 0x00, 0x26, 0xD1, 0x26, 0xA1, 0x2C, 0xB0, 0x00, 0x49, 0x20, 0x7D, + 0x0C, 0xC0, 0xFF, 0x0F, 0x57, 0x71, 0x2F, 0x9B, 0x07, 0x00, 0x30, 0xE9, 0x56, 0xCE, 0x67, 0xE8, + 0x5C, 0xE0, 0xFF, 0x0F, 0xC6, 0xCE, 0x3F, 0x7E, 0x0C, 0x00, 0x02, 0x09, 0x06, 0x67, 0x06, 0x27, + 0xD7, 0x61, 0x57, 0x23, 0x36, 0x26, 0x36, 0x27, 0x26, 0x22, 0xF2, 0x05, 0x06, 0x27, 0x57, 0x22, + 0x57, 0x73, 0x26, 0x27, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x2E, 0xCC, 0x20, + 0xFF, 0x0F, 0x06, 0xE2, 0x02, 0x03, 0x0C, 0xE0, 0xFF, 0x0F, 0x34, 0xD2, 0x57, 0xE8, 0xC6, 0xDA, + 0x66, 0xEC, 0xB1, 0xE9, 0x92, 0xD5, 0x18, 0x20, 0x64, 0x16, 0x4B, 0xC4, 0x00, 0x00, 0x58, 0xC1, + 0x90, 0x04, 0x58, 0x81, 0x80, 0x04, 0x2C, 0x10, 0xA0, 0x04, 0xE1, 0xF0, 0x98, 0x50, 0x37, 0x11, + 0x38, 0x60, 0x40, 0x16, 0x18, 0x46, 0x78, 0x00, 0x18, 0x76, 0x77, 0x00, 0x92, 0x09, 0x98, 0x50, + 0x38, 0x11, 0x82, 0x06, 0x26, 0x65, 0x18, 0x66, 0x98, 0x00, 0x26, 0x76, 0x13, 0x77, 0x98, 0x60, + 0x63, 0x16, 0x82, 0x05, 0x24, 0x72, 0x24, 0x41, 0x13, 0x77, 0x13, 0x44, 0x10, 0x62, 0x04, 0x50, + 0xC6, 0x65, 0x82, 0x14, 0xC6, 0x67, 0xA2, 0x12, 0xCC, 0x60, 0x13, 0x00, 0xC2, 0x0B, 0x24, 0x41, + 0x06, 0x74, 0x57, 0x71, 0x57, 0x42, 0x26, 0x47, 0xC6, 0x64, 0x1C, 0x70, 0x10, 0x00, 0x32, 0x04, + 0xF2, 0x05, 0x0C, 0x70, 0x13, 0x00, 0x91, 0x72, 0x04, 0x51, 0x06, 0x25, 0xE1, 0xF0, 0x00, 0x00, + 0x0C, 0x40, 0x00, 0x10, 0x30, 0x74, 0x18, 0x60, 0x1A, 0x10, 0x08, 0x50, 0x0F, 0x00, 0x2C, 0x50, + 0xFF, 0xFF, 0x24, 0x71, 0x56, 0x75, 0x08, 0x50, 0x00, 0x3C, 0x66, 0x75, 0x06, 0x56, 0x57, 0x5A, + 0x08, 0x30, 0xF0, 0x00, 0x16, 0x66, 0x56, 0x53, 0xF7, 0x6F, 0x66, 0x75, 0x57, 0x6A, 0xB1, 0x74, + 0x6C, 0x60, 0x75, 0x00, 0xD7, 0x7A, 0x66, 0x67, 0x08, 0x70, 0x00, 0x30, 0xB9, 0x67, 0x00, 0x01, + 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x80, 0x02, 0x04, 0x30, 0x0C, 0x40, 0x80, 0x04, + 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x00, 0x07, 0x04, 0x30, 0x0C, 0x40, + 0x80, 0x04, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0x80, 0x0B, 0x04, 0x30, 0x0C, 0x40, + 0x80, 0x04, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0x2B, 0x2C, 0x01, 0x00, 0x08, 0x70, 0x00, 0x80, 0x18, 0x27, 0x08, 0xDC, + 0x0B, 0x16, 0x03, 0x00, 0xEB, 0xC0, 0x01, 0x00, 0x0C, 0x70, 0x14, 0x00, 0xA9, 0x70, 0x20, 0x10, + 0xCB, 0xD4, 0x01, 0x00, 0x8B, 0x90, 0x03, 0x00, 0x38, 0x70, 0x40, 0x16, 0x30, 0xF1, 0x18, 0x57, + 0xD5, 0x00, 0x99, 0x50, 0xA6, 0x15, 0x18, 0x67, 0x57, 0x00, 0x99, 0x60, 0x05, 0x13, 0x0C, 0x60, + 0x40, 0x00, 0xB9, 0x60, 0x28, 0x11, 0x99, 0x00, 0xF8, 0x12, 0x99, 0x00, 0xF9, 0x12, 0x99, 0x00, + 0xFA, 0x12, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x2B, 0x19, 0x03, 0x00, + 0x4B, 0x3B, 0x02, 0x00, 0xCB, 0x45, 0x01, 0x00, 0x8B, 0x46, 0x01, 0x00, 0x6B, 0x73, 0x03, 0x00, + 0xCB, 0x25, 0x03, 0x00, 0x30, 0xF1, 0x99, 0x00, 0x1B, 0x10, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0xD4, 0x15, 0x04, 0x30, 0x0C, 0x40, 0x1C, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x6B, 0x42, 0x01, 0x00, 0x6B, 0x3D, 0x02, 0x00, 0x8B, 0x10, 0x02, 0x00, 0x30, 0xF1, 0x24, 0x14, + 0xE1, 0xF0, 0x00, 0x00, 0x98, 0x70, 0x05, 0x10, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x82, 0x0A, + 0x18, 0x60, 0xC3, 0x13, 0xCC, 0x60, 0xC7, 0x00, 0xD2, 0x32, 0x24, 0x61, 0x99, 0x60, 0xC3, 0x13, + 0xF2, 0x2E, 0x99, 0x00, 0xC3, 0x13, 0xCB, 0x25, 0x03, 0x00, 0x99, 0x00, 0xCA, 0x13, 0x99, 0x00, + 0xD1, 0x13, 0x14, 0x71, 0x99, 0x70, 0xC7, 0x13, 0x99, 0x70, 0xC6, 0x13, 0x38, 0x60, 0x30, 0x16, + 0x06, 0xE7, 0xC4, 0x64, 0xC2, 0x09, 0x8B, 0x46, 0x01, 0x00, 0xCB, 0x45, 0x01, 0x00, 0x2B, 0x19, + 0x03, 0x00, 0x6B, 0x73, 0x03, 0x00, 0x38, 0x60, 0x2C, 0x16, 0x0C, 0x70, 0x14, 0x00, 0xC6, 0x67, + 0xD2, 0x04, 0x06, 0x76, 0x34, 0x71, 0x13, 0x77, 0x98, 0x60, 0x56, 0x16, 0x82, 0x02, 0x04, 0x70, + 0x38, 0x60, 0x30, 0x16, 0xC6, 0x67, 0xC2, 0x03, 0x4B, 0x3B, 0x02, 0x00, 0x98, 0x60, 0x25, 0x11, + 0x82, 0x06, 0xCC, 0x60, 0xF9, 0x00, 0xD2, 0x0F, 0x24, 0x61, 0xF2, 0x0B, 0x38, 0x60, 0xD4, 0x15, + 0x06, 0x56, 0x77, 0x56, 0xF7, 0x6A, 0x54, 0x5F, 0x54, 0x67, 0xA6, 0x65, 0x82, 0x04, 0x04, 0x61, + 0x99, 0x60, 0x25, 0x11, 0x98, 0x60, 0xC2, 0x13, 0x06, 0xD7, 0x92, 0x07, 0x38, 0x70, 0xD4, 0x15, + 0xD4, 0x71, 0x92, 0x03, 0xCB, 0x25, 0x03, 0x00, 0x38, 0x50, 0xD4, 0x15, 0x06, 0x75, 0x18, 0x40, + 0xC4, 0x13, 0x77, 0x76, 0x54, 0x7F, 0xC6, 0x47, 0x32, 0x04, 0x99, 0x70, 0xC4, 0x13, 0xF2, 0x0A, + 0x06, 0x75, 0xDC, 0x70, 0x00, 0xF0, 0x92, 0x06, 0x98, 0x70, 0xC2, 0x13, 0x92, 0x03, 0x99, 0x00, + 0xC4, 0x13, 0x98, 0x70, 0x66, 0x16, 0x82, 0x1A, 0x28, 0x70, 0x06, 0x10, 0x1C, 0x60, 0xE1, 0x0C, + 0x56, 0x76, 0xA9, 0x70, 0x06, 0x10, 0xEB, 0x32, 0x01, 0x00, 0x4B, 0x39, 0x03, 0x00, 0x4B, 0x3C, + 0x03, 0x00, 0x6B, 0x73, 0x03, 0x00, 0x99, 0x00, 0xB4, 0x11, 0x38, 0x70, 0x40, 0x16, 0x99, 0x00, + 0x1A, 0x10, 0x18, 0x67, 0x57, 0x00, 0x99, 0x60, 0x05, 0x13, 0x98, 0x70, 0x0A, 0x16, 0x82, 0x0A, + 0x18, 0x70, 0x1B, 0x10, 0xCC, 0x70, 0xFF, 0x00, 0x82, 0x07, 0x24, 0x71, 0x99, 0x70, 0x1B, 0x10, + 0xF2, 0x03, 0x99, 0x00, 0x1B, 0x10, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0xB1, 0xF1, 0xEB, 0x32, 0x01, 0x00, 0xAB, 0x19, 0x03, 0x00, 0x6B, 0xE2, 0x02, 0x00, + 0x4B, 0x00, 0x03, 0x00, 0x4B, 0x42, 0x02, 0x00, 0x4B, 0x12, 0x02, 0x00, 0x4B, 0x9C, 0x01, 0x00, + 0x8B, 0x4D, 0x01, 0x00, 0x98, 0x70, 0xC2, 0x13, 0x82, 0x07, 0x99, 0x00, 0xEE, 0x15, 0xAB, 0x33, + 0x01, 0x00, 0x04, 0x20, 0xF2, 0x1A, 0x38, 0x70, 0x40, 0x16, 0x98, 0x77, 0xB8, 0x00, 0x92, 0x06, + 0x8B, 0xD5, 0x01, 0x00, 0x2B, 0xC9, 0x01, 0x00, 0xF2, 0x05, 0x2B, 0xC9, 0x01, 0x00, 0x8B, 0xD5, + 0x01, 0x00, 0x4B, 0x54, 0x03, 0x00, 0x4B, 0x3C, 0x03, 0x00, 0x4B, 0x35, 0x03, 0x00, 0x4B, 0x61, + 0x03, 0x00, 0x6B, 0x41, 0x03, 0x00, 0x04, 0x21, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, + 0x18, 0x20, 0x0A, 0x16, 0x18, 0x30, 0xEE, 0x15, 0x34, 0x14, 0xB1, 0xF1, 0xCB, 0x93, 0x03, 0x00, + 0xAB, 0x7A, 0x03, 0x00, 0x4B, 0x73, 0x03, 0x00, 0x8B, 0x61, 0x03, 0x00, 0x2B, 0x6A, 0x03, 0x00, + 0xAB, 0x33, 0x01, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0x0C, 0x20, + 0xB5, 0x13, 0x04, 0x30, 0x04, 0x45, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, + 0x10, 0x13, 0x04, 0x30, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xE0, + 0x00, 0x10, 0x99, 0x0E, 0xBF, 0x03, 0x0C, 0x20, 0x78, 0x15, 0x04, 0x30, 0x0C, 0x40, 0x28, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0xA1, 0x05, 0x0C, 0x20, 0xD4, 0x15, 0x04, 0x30, + 0x04, 0x44, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xD8, 0x15, 0x04, 0x30, 0x0C, 0x40, + 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0xEE, 0x05, 0xA9, 0x0E, 0xEC, 0x05, + 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0x2E, 0x11, 0x04, 0x30, + 0x04, 0x4C, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0x40, 0x16, 0x34, 0x14, 0xB1, 0xF1, 0x0C, 0x70, 0x00, 0x10, + 0x98, 0x57, 0xCD, 0x03, 0x28, 0x26, 0x74, 0x00, 0x82, 0x04, 0x28, 0x26, 0x7C, 0x00, 0xF2, 0x08, + 0x98, 0x77, 0xCE, 0x03, 0x82, 0x05, 0x28, 0x76, 0x7C, 0x00, 0x26, 0x27, 0x23, 0x22, 0x06, 0x32, + 0xAB, 0x9A, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x30, 0x00, + 0xD9, 0xC1, 0x20, 0x00, 0xD9, 0x81, 0x10, 0x00, 0x06, 0xD3, 0x06, 0xA3, 0x0C, 0xC0, 0x00, 0x10, + 0x04, 0x81, 0x57, 0xD2, 0xD7, 0xA1, 0x26, 0xDC, 0x26, 0xAC, 0xB1, 0x51, 0x26, 0x84, 0x04, 0xB8, + 0x0C, 0x50, 0xBE, 0x01, 0x06, 0x62, 0x26, 0xBD, 0x26, 0x5A, 0x04, 0x74, 0x13, 0x88, 0x0C, 0x20, + 0x10, 0x03, 0x06, 0xE3, 0x99, 0x8B, 0x12, 0x03, 0x06, 0x94, 0x06, 0x35, 0x06, 0x47, 0x26, 0x2D, + 0xB9, 0x61, 0x0C, 0x00, 0xB9, 0x51, 0x04, 0x00, 0xB9, 0x71, 0x08, 0x00, 0x8B, 0xE0, 0x03, 0x00, + 0x38, 0x71, 0x08, 0x00, 0x38, 0x51, 0x04, 0x00, 0x0C, 0x20, 0x14, 0x03, 0x26, 0x2D, 0x06, 0x47, + 0x06, 0x35, 0x8B, 0xE0, 0x03, 0x00, 0x28, 0x7A, 0xC2, 0x01, 0x26, 0xC9, 0x99, 0x7B, 0x13, 0x03, + 0x30, 0x71, 0x99, 0x7D, 0x1C, 0x03, 0x28, 0x7A, 0xBC, 0x01, 0xA9, 0x7B, 0x10, 0x03, 0x38, 0x61, + 0x0C, 0x00, 0x26, 0x6E, 0x91, 0x86, 0x24, 0xE1, 0x99, 0xEC, 0xB5, 0x03, 0x99, 0x0C, 0xB0, 0x03, + 0x58, 0xC1, 0x20, 0x00, 0x58, 0x81, 0x10, 0x00, 0x2C, 0x10, 0x30, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0xE8, 0x00, 0xD9, 0xC1, 0xD8, 0x00, 0x38, 0x70, 0x40, 0x16, 0xD9, 0x81, 0xC8, 0x00, + 0x0C, 0x60, 0x77, 0x00, 0x26, 0x67, 0x10, 0x66, 0x18, 0xE7, 0x78, 0x00, 0xB9, 0x61, 0x98, 0x00, + 0x0C, 0x20, 0x7A, 0x00, 0x0C, 0x60, 0x79, 0x00, 0x26, 0x67, 0x26, 0x27, 0x10, 0x66, 0x10, 0x72, + 0x04, 0xB0, 0xB9, 0x61, 0xAC, 0x00, 0xB9, 0x71, 0xB0, 0x00, 0x0C, 0xA0, 0x6C, 0x13, 0x06, 0x9B, + 0x0C, 0x80, 0x00, 0x10, 0x18, 0x78, 0xC0, 0x03, 0x06, 0xD8, 0xC6, 0x97, 0x32, 0x0F, 0x14, 0x72, + 0x26, 0x7A, 0x90, 0x77, 0x82, 0x07, 0x06, 0x2A, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x02, + 0x24, 0xB1, 0x24, 0x91, 0x2C, 0xA0, 0x10, 0x00, 0xF2, 0xEE, 0xC4, 0xB0, 0x99, 0x08, 0x38, 0x01, + 0x78, 0x38, 0x2E, 0x01, 0x78, 0x68, 0x32, 0x01, 0x78, 0x48, 0x30, 0x01, 0x78, 0x78, 0x34, 0x01, + 0x82, 0x22, 0x3F, 0x66, 0x03, 0x00, 0xC4, 0x60, 0x38, 0x50, 0x40, 0x16, 0x32, 0x02, 0x16, 0x66, + 0x28, 0x35, 0x8C, 0x00, 0x43, 0x66, 0xC6, 0x63, 0x32, 0x16, 0x3F, 0x77, 0x04, 0x00, 0xC4, 0x70, + 0x32, 0x02, 0x16, 0x77, 0x28, 0x65, 0x8E, 0x00, 0x43, 0x77, 0xC6, 0x76, 0x32, 0x03, 0x04, 0x71, + 0xF2, 0x08, 0x28, 0x65, 0x90, 0x00, 0xC6, 0x76, 0x32, 0x03, 0x04, 0x72, 0xF2, 0x02, 0x04, 0x73, + 0x99, 0x7D, 0x38, 0x01, 0x98, 0x7D, 0x37, 0x01, 0x92, 0x0F, 0x98, 0x7D, 0x38, 0x01, 0x82, 0x0C, + 0x38, 0x60, 0x40, 0x16, 0x26, 0x76, 0x18, 0x77, 0x98, 0x00, 0x38, 0x61, 0x98, 0x00, 0x26, 0x76, + 0x13, 0x77, 0xB9, 0x71, 0x98, 0x00, 0x38, 0x70, 0x40, 0x16, 0x18, 0x6D, 0xC3, 0x03, 0x18, 0x77, + 0x98, 0x00, 0xC6, 0x67, 0xB2, 0x07, 0x98, 0x7D, 0x36, 0x01, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7D, + 0x37, 0x01, 0x98, 0x70, 0x63, 0x16, 0x82, 0x09, 0x38, 0x71, 0x98, 0x00, 0x24, 0xE1, 0x24, 0x72, + 0x13, 0x77, 0xB9, 0x71, 0x98, 0x00, 0x13, 0xEE, 0x0C, 0x20, 0x88, 0x00, 0x26, 0x21, 0x04, 0x30, + 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x7D, 0x06, 0x00, 0xDC, 0x70, 0xE0, 0x0C, + 0x82, 0x12, 0x6B, 0x42, 0x01, 0x00, 0x4B, 0x39, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, 0xB8, 0x01, + 0x38, 0x70, 0x40, 0x16, 0x99, 0x0D, 0xC2, 0x03, 0x18, 0x77, 0x57, 0x00, 0x99, 0x7D, 0x05, 0x03, + 0xFA, 0x17, 0x03, 0x00, 0x98, 0x7D, 0xC1, 0x03, 0x99, 0x0D, 0xB8, 0x01, 0x82, 0x04, 0x34, 0x71, + 0x99, 0x7D, 0xC1, 0x03, 0x98, 0xCD, 0x04, 0x00, 0x92, 0x05, 0x98, 0x7D, 0xC0, 0x03, 0x8A, 0x06, + 0x03, 0x00, 0x98, 0x3D, 0xC0, 0x03, 0x92, 0x1D, 0x0C, 0x20, 0x60, 0x13, 0x0C, 0x40, 0x50, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x98, 0xED, 0xC1, 0x03, 0x9A, 0xF8, 0x02, 0x00, 0xC6, 0xEC, + 0x32, 0x0C, 0x0C, 0x20, 0x88, 0x00, 0x06, 0x3E, 0x06, 0x4E, 0x26, 0x21, 0x0C, 0x50, 0x14, 0x00, + 0x6B, 0x48, 0x01, 0x00, 0x24, 0xE1, 0xF2, 0xF4, 0x99, 0xCD, 0xBF, 0x03, 0xFA, 0xE7, 0x02, 0x00, + 0x0C, 0x20, 0x78, 0x00, 0x04, 0x31, 0x26, 0x21, 0x04, 0x46, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x18, 0x3D, 0xC0, 0x03, 0x04, 0x70, 0x06, 0x5D, 0xB9, 0x71, 0x9C, 0x00, 0x06, 0x67, 0xC6, 0x63, + 0x32, 0x12, 0x18, 0x45, 0x6C, 0x03, 0xCC, 0x40, 0x13, 0x00, 0xC2, 0x04, 0x04, 0x21, 0xB9, 0x21, + 0x9C, 0x00, 0x34, 0x41, 0xCC, 0x40, 0x12, 0x00, 0xD2, 0x02, 0x04, 0x71, 0x24, 0x61, 0x2C, 0x50, + 0x10, 0x00, 0xF2, 0xEE, 0xC4, 0x70, 0x82, 0x04, 0x04, 0x60, 0xB9, 0x61, 0x9C, 0x00, 0xAB, 0x46, + 0x01, 0x00, 0x38, 0x70, 0x40, 0x16, 0xB9, 0x21, 0x94, 0x00, 0x18, 0xB7, 0x76, 0x00, 0x06, 0x3B, + 0x4B, 0xA1, 0x00, 0x00, 0x06, 0x3B, 0x4B, 0xA1, 0x00, 0x00, 0x24, 0xE2, 0x06, 0x7E, 0x57, 0x71, + 0x57, 0xE2, 0x26, 0x7E, 0xB9, 0x71, 0xB4, 0x00, 0x14, 0x61, 0x04, 0x70, 0xB9, 0x21, 0xA8, 0x00, + 0x04, 0xB2, 0xB9, 0x71, 0xA4, 0x00, 0xB9, 0x61, 0x90, 0x00, 0x06, 0x21, 0x14, 0x31, 0x0C, 0x40, + 0x78, 0x00, 0x0C, 0x90, 0x80, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x26, 0x91, 0x06, 0x29, + 0x14, 0x31, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x34, 0xB1, 0x13, 0xBB, 0x0C, 0xA0, + 0xBE, 0x11, 0x06, 0x51, 0x04, 0xE0, 0xC6, 0xEC, 0x3A, 0x8E, 0x00, 0x00, 0xC4, 0xB0, 0x38, 0x71, + 0x94, 0x00, 0x92, 0x09, 0xB8, 0x71, 0x9C, 0x00, 0x82, 0x04, 0x38, 0x71, 0x94, 0x00, 0xF2, 0x03, + 0x38, 0x71, 0xA8, 0x00, 0x0C, 0x60, 0x80, 0x00, 0x26, 0x61, 0x26, 0x6E, 0x0C, 0x90, 0x00, 0x10, + 0x04, 0x81, 0xB9, 0x61, 0xA0, 0x00, 0x18, 0x6D, 0xC0, 0x03, 0x14, 0x41, 0x26, 0x48, 0xC6, 0x46, + 0x32, 0x6C, 0x98, 0x49, 0x6A, 0x03, 0x18, 0x69, 0x6D, 0x03, 0x82, 0x63, 0x0C, 0x20, 0x6C, 0x03, + 0x26, 0x29, 0xB9, 0x51, 0xC4, 0x00, 0xB9, 0x61, 0xC0, 0x00, 0xB9, 0x71, 0xBC, 0x00, 0xEB, 0x26, + 0x01, 0x00, 0xC6, 0x2B, 0x38, 0x51, 0xC4, 0x00, 0x38, 0x61, 0xC0, 0x00, 0x38, 0x71, 0xBC, 0x00, + 0x92, 0x50, 0x04, 0x42, 0xD6, 0x46, 0x82, 0x0A, 0x70, 0x4A, 0xCC, 0x40, 0xCF, 0x02, 0x12, 0x06, + 0x78, 0x4A, 0x02, 0x00, 0xCC, 0x40, 0xFF, 0x04, 0x02, 0x1D, 0xD4, 0x61, 0x82, 0x0A, 0x70, 0x6A, + 0xCC, 0x60, 0xCF, 0x02, 0x12, 0x17, 0x78, 0x6A, 0x02, 0x00, 0xCC, 0x60, 0xFF, 0x04, 0x12, 0x12, + 0x78, 0x29, 0x64, 0x03, 0x70, 0x6A, 0x36, 0x26, 0xC4, 0x20, 0x32, 0x02, 0x16, 0x22, 0x78, 0x49, + 0x66, 0x03, 0x78, 0x6A, 0x02, 0x00, 0x3F, 0x66, 0x04, 0x00, 0xC4, 0x60, 0x32, 0x07, 0x16, 0x66, + 0xF2, 0x05, 0x0C, 0x60, 0x00, 0x05, 0x0C, 0x20, 0xD0, 0x02, 0x06, 0x32, 0xB9, 0x51, 0xC4, 0x00, + 0xB9, 0x71, 0xBC, 0x00, 0xB9, 0x61, 0xC0, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x61, 0xC0, 0x00, + 0x06, 0x42, 0x06, 0x36, 0x06, 0x26, 0xB9, 0x41, 0xB8, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x41, + 0xB8, 0x00, 0x38, 0x71, 0xBC, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x26, 0x24, 0xC6, 0x27, 0x32, 0x05, + 0x38, 0x71, 0xA0, 0x00, 0x91, 0x87, 0x06, 0x72, 0x06, 0x68, 0x57, 0x61, 0x26, 0x65, 0xB1, 0x26, + 0x24, 0x81, 0x2C, 0x90, 0x10, 0x00, 0xF2, 0x90, 0x24, 0xE1, 0x2C, 0x50, 0x18, 0x00, 0x24, 0xA8, + 0xFA, 0x73, 0xFF, 0xFF, 0x04, 0x60, 0xB9, 0x61, 0xA0, 0x00, 0x38, 0x61, 0xA0, 0x00, 0xC6, 0x6C, + 0x3A, 0xF7, 0x00, 0x00, 0xC4, 0xB0, 0x38, 0x61, 0x94, 0x00, 0x92, 0x06, 0xB8, 0x71, 0x9C, 0x00, + 0x92, 0x03, 0x38, 0x61, 0xA8, 0x00, 0x04, 0x41, 0x04, 0x70, 0x0C, 0x50, 0x88, 0x00, 0x26, 0x51, + 0x26, 0x57, 0x90, 0x25, 0x92, 0x18, 0x0C, 0x50, 0x80, 0x00, 0x26, 0x51, 0x26, 0x57, 0x60, 0x35, + 0x2F, 0x57, 0x07, 0x00, 0x26, 0x57, 0x26, 0x55, 0x26, 0x53, 0x57, 0x51, 0x26, 0x51, 0x30, 0x55, + 0xC6, 0x56, 0x32, 0x09, 0xC4, 0x50, 0x22, 0x07, 0xC4, 0x30, 0x22, 0x05, 0x06, 0x65, 0xB9, 0x71, + 0x90, 0x00, 0x06, 0x42, 0x24, 0x71, 0xC6, 0x7C, 0x22, 0xE1, 0xC4, 0x40, 0x9A, 0xC2, 0x00, 0x00, + 0x38, 0xE1, 0x90, 0x00, 0x38, 0x61, 0xA4, 0x00, 0x57, 0xE2, 0x26, 0xED, 0x98, 0x7E, 0x1A, 0x03, + 0x24, 0x61, 0x0C, 0x80, 0x10, 0x03, 0xB9, 0x61, 0xA4, 0x00, 0x26, 0x8E, 0x9A, 0xB2, 0x00, 0x00, + 0x38, 0x71, 0x90, 0x00, 0x04, 0x34, 0x26, 0x71, 0x68, 0x97, 0x80, 0x00, 0x06, 0x28, 0x26, 0x39, + 0x57, 0x32, 0x26, 0x3D, 0x2C, 0x30, 0x10, 0x03, 0x0C, 0x40, 0x10, 0x00, 0x0C, 0xF0, 0xEC, 0x00, + 0xF1, 0xF0, 0x38, 0xA1, 0x90, 0x00, 0x0C, 0x70, 0xBE, 0x01, 0xD7, 0xA1, 0x26, 0xAD, 0x26, 0x7A, + 0x06, 0x37, 0x04, 0x44, 0x06, 0x28, 0xB9, 0x71, 0xBC, 0x00, 0x8B, 0xE0, 0x03, 0x00, 0x28, 0x6A, + 0xC2, 0x01, 0x04, 0x24, 0x99, 0x6E, 0x1B, 0x03, 0x38, 0x71, 0xBC, 0x00, 0x04, 0x44, 0x06, 0x37, + 0x26, 0x28, 0x8B, 0xE0, 0x03, 0x00, 0x28, 0x7A, 0xBC, 0x01, 0x18, 0x4E, 0x1C, 0x03, 0xA9, 0x7E, + 0x18, 0x03, 0x38, 0x71, 0x98, 0x00, 0xC6, 0x74, 0x22, 0x25, 0x18, 0x5D, 0xC0, 0x03, 0x18, 0x7E, + 0x19, 0x03, 0x18, 0x3E, 0x18, 0x03, 0xC4, 0x52, 0x38, 0x60, 0x40, 0x16, 0xC2, 0x04, 0x28, 0x66, + 0x2A, 0x00, 0xF2, 0x08, 0xC4, 0x52, 0x92, 0x04, 0x28, 0x66, 0x28, 0x00, 0xF2, 0x03, 0x28, 0x66, + 0x26, 0x00, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x57, 0x57, 0x51, 0x26, 0x75, 0x26, 0x37, 0x26, 0x33, + 0x0C, 0x20, 0x80, 0x0B, 0x26, 0x32, 0x70, 0x73, 0xC6, 0x76, 0x02, 0x04, 0x24, 0x41, 0x99, 0x4E, + 0x1C, 0x03, 0x18, 0x7E, 0x1C, 0x03, 0xCC, 0x70, 0x13, 0x00, 0xC2, 0x09, 0x38, 0x61, 0xB4, 0x00, + 0xC6, 0x76, 0x32, 0x05, 0x2C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x1C, 0x03, 0x38, 0x61, 0x90, 0x00, + 0x18, 0x7E, 0x1A, 0x03, 0x18, 0xFD, 0xC0, 0x03, 0x0C, 0xA0, 0x88, 0x00, 0x26, 0xA1, 0x26, 0x6A, + 0x91, 0x76, 0x38, 0x61, 0x90, 0x00, 0x34, 0x71, 0x26, 0x7D, 0x24, 0x61, 0x99, 0x67, 0xB5, 0x03, + 0x99, 0x07, 0xB0, 0x03, 0x06, 0x29, 0x2F, 0x79, 0x01, 0x00, 0x99, 0x07, 0x78, 0x00, 0x57, 0x21, + 0x06, 0x51, 0x04, 0x70, 0x14, 0xE1, 0xC4, 0xB0, 0x2F, 0x62, 0x05, 0x00, 0xB1, 0xE6, 0x38, 0x41, + 0x94, 0x00, 0x92, 0x06, 0xB8, 0x61, 0x9C, 0x00, 0x92, 0x03, 0x38, 0x41, 0xA8, 0x00, 0x2F, 0x67, + 0x0A, 0x00, 0x90, 0x66, 0x82, 0x07, 0x24, 0x71, 0xC6, 0x7C, 0x2C, 0x50, 0x18, 0x00, 0x22, 0xEC, + 0xF2, 0x12, 0x0C, 0x90, 0x80, 0x00, 0x26, 0x91, 0x26, 0x97, 0xC6, 0x6F, 0x32, 0xF5, 0x24, 0x61, + 0x06, 0x36, 0x57, 0x31, 0x26, 0x35, 0xB0, 0x33, 0x22, 0xF9, 0xC6, 0x34, 0x32, 0xF7, 0x91, 0x69, + 0x06, 0x43, 0xF2, 0xF4, 0x18, 0x7D, 0xC0, 0x03, 0x38, 0x61, 0xA4, 0x00, 0xC6, 0x67, 0x32, 0x08, + 0x38, 0x71, 0xA0, 0x00, 0x24, 0x71, 0xB9, 0x71, 0xA0, 0x00, 0xFA, 0x08, 0xFF, 0xFF, 0xC4, 0xB0, + 0x9A, 0x5D, 0xFE, 0xFF, 0x99, 0x0D, 0xC2, 0x03, 0x0C, 0x80, 0x6C, 0x13, 0x06, 0xEB, 0x06, 0xAB, + 0x18, 0x6D, 0xC0, 0x03, 0xC6, 0xE6, 0x32, 0x0C, 0x0C, 0x60, 0x78, 0x00, 0x24, 0xE1, 0x26, 0x61, + 0x26, 0x6E, 0x90, 0x66, 0x82, 0x76, 0x2F, 0x6A, 0x0C, 0x00, 0xC4, 0x64, 0x02, 0x0F, 0x28, 0x7D, + 0x06, 0x00, 0x04, 0x64, 0xD6, 0x67, 0x82, 0x71, 0x38, 0x61, 0xB0, 0x00, 0x14, 0x25, 0x56, 0x72, + 0x99, 0x6D, 0xC1, 0x03, 0xA9, 0x7D, 0x06, 0x00, 0xF2, 0x68, 0x14, 0x52, 0x26, 0x58, 0x10, 0x55, + 0x38, 0x71, 0xAC, 0x00, 0x06, 0x95, 0x34, 0x91, 0xB9, 0x51, 0x90, 0x00, 0x26, 0x9D, 0x0C, 0x50, + 0xA0, 0x00, 0x26, 0x59, 0x18, 0x45, 0x10, 0x03, 0x14, 0x3C, 0xC6, 0x47, 0x26, 0x38, 0xB2, 0x3C, + 0xC4, 0xA4, 0x12, 0x3A, 0x06, 0x28, 0xB9, 0x31, 0xB8, 0x00, 0xB9, 0x51, 0xC4, 0x00, 0xB9, 0x61, + 0xC0, 0x00, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x38, 0x31, 0xB8, 0x00, 0x38, 0x51, 0xC4, 0x00, + 0x38, 0x61, 0xC0, 0x00, 0x82, 0x29, 0x18, 0x45, 0x10, 0x03, 0x06, 0x26, 0x57, 0x22, 0x24, 0x41, + 0x26, 0x2D, 0x99, 0x45, 0x10, 0x03, 0x2C, 0x20, 0x10, 0x03, 0x0C, 0x40, 0x10, 0x00, 0xB9, 0x61, + 0xC0, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x38, 0x61, 0xC0, 0x00, 0x38, 0x71, 0x90, 0x00, + 0x0C, 0x50, 0x88, 0x00, 0x26, 0x51, 0x26, 0x56, 0x91, 0x75, 0x98, 0x5D, 0x1A, 0x00, 0x24, 0x61, + 0x99, 0x69, 0xB5, 0x03, 0x04, 0x61, 0x99, 0x6D, 0xC2, 0x03, 0x24, 0xA1, 0x24, 0xB1, 0x92, 0x19, + 0x99, 0x6D, 0x1A, 0x00, 0xF2, 0x16, 0x06, 0x28, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x11, + 0x04, 0x61, 0x99, 0x6D, 0x36, 0x01, 0x10, 0x68, 0xCC, 0x60, 0x13, 0x00, 0xC2, 0x0A, 0x18, 0x6D, + 0xC0, 0x03, 0xC4, 0x61, 0x92, 0x06, 0x28, 0x6D, 0x06, 0x00, 0x64, 0x64, 0xA9, 0x6D, 0x06, 0x00, + 0x2C, 0x80, 0x10, 0x00, 0xFA, 0x7E, 0xFF, 0xFF, 0x0C, 0x60, 0x00, 0x10, 0x0C, 0x70, 0x6D, 0x13, + 0x2C, 0x60, 0xBD, 0x03, 0x04, 0xA0, 0x10, 0x57, 0xD4, 0x52, 0x82, 0x02, 0x04, 0xA1, 0x2C, 0x70, + 0x10, 0x00, 0xC6, 0x76, 0x92, 0xF9, 0x18, 0x9D, 0x04, 0x00, 0x04, 0xE0, 0x0C, 0x40, 0x00, 0x10, + 0x0C, 0x60, 0xC0, 0x11, 0x06, 0x5E, 0x2C, 0x40, 0x54, 0x05, 0xC6, 0x59, 0x22, 0x05, 0x0C, 0x80, + 0x1C, 0x13, 0x04, 0x90, 0xF2, 0x3D, 0x14, 0x72, 0x26, 0x76, 0x70, 0x37, 0x06, 0x7F, 0x0C, 0x70, + 0x44, 0x15, 0x78, 0x27, 0x04, 0x00, 0xC6, 0x23, 0x12, 0x0E, 0x78, 0x27, 0x06, 0x00, 0xC6, 0x23, + 0x22, 0x0A, 0x70, 0x26, 0x70, 0x87, 0xC6, 0x82, 0x12, 0x06, 0x78, 0x87, 0x02, 0x00, 0xC6, 0x82, + 0x22, 0x02, 0x04, 0xE1, 0x24, 0x78, 0xC6, 0x74, 0x92, 0xED, 0x24, 0x51, 0x24, 0x68, 0xF2, 0xDE, + 0x0C, 0x70, 0x88, 0x00, 0x26, 0x71, 0x26, 0x79, 0x90, 0x47, 0x92, 0x14, 0x0C, 0x70, 0xB5, 0x13, + 0xE0, 0x67, 0x92, 0x1B, 0xE8, 0x67, 0x05, 0x00, 0x92, 0x18, 0xC4, 0xA1, 0x0C, 0x20, 0x88, 0x00, + 0x26, 0x21, 0x06, 0x39, 0x92, 0x10, 0xC4, 0xE0, 0x0C, 0x50, 0x13, 0x00, 0x92, 0x0C, 0x6B, 0x48, + 0x01, 0x00, 0x98, 0x7D, 0xC1, 0x03, 0x92, 0x0E, 0x24, 0x91, 0x2C, 0x80, 0x10, 0x00, 0xC6, 0x9C, + 0x22, 0xE0, 0xF2, 0x10, 0x04, 0x51, 0xF2, 0xF4, 0x24, 0x41, 0xC4, 0x45, 0x24, 0x71, 0x92, 0xE1, + 0xF2, 0xF1, 0x06, 0x28, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x92, 0xEF, 0x04, 0x71, 0x91, 0x78, + 0xF2, 0xEC, 0x26, 0xBC, 0x99, 0xBD, 0xBF, 0x03, 0xF2, 0x03, 0x99, 0x0D, 0xC2, 0x03, 0x58, 0xC1, + 0xD8, 0x00, 0x58, 0x81, 0xC8, 0x00, 0x2C, 0x10, 0xE8, 0x00, 0xE1, 0xF0, 0x38, 0x70, 0x40, 0x16, + 0x3C, 0x10, 0x48, 0x01, 0xD9, 0xC1, 0x38, 0x01, 0xD9, 0x81, 0x28, 0x01, 0x18, 0xE7, 0x46, 0x00, + 0x18, 0xB7, 0x47, 0x00, 0x2F, 0xDE, 0x0E, 0x00, 0x16, 0x7D, 0x0C, 0x60, 0x13, 0x00, 0x26, 0x67, + 0x2F, 0xCB, 0x0B, 0x00, 0xB9, 0x61, 0xF4, 0x00, 0x16, 0x6C, 0xB9, 0x61, 0xF8, 0x00, 0x24, 0x6D, + 0xB9, 0x61, 0xF0, 0x00, 0x0C, 0x60, 0x78, 0x00, 0x26, 0x61, 0x0C, 0xA0, 0x00, 0x10, 0x06, 0x26, + 0x0C, 0x30, 0x78, 0x00, 0xB9, 0x71, 0x20, 0x01, 0xA9, 0x0A, 0x06, 0x03, 0xB9, 0x0A, 0x08, 0x03, + 0xB9, 0x61, 0x1C, 0x01, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x0C, 0x30, 0x78, 0x00, + 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x2F, 0x5E, 0x0D, 0x00, 0x57, 0x51, 0x26, 0x5E, 0xB9, 0x51, + 0x0C, 0x01, 0x38, 0x71, 0x20, 0x01, 0x04, 0x5D, 0x36, 0x5B, 0x26, 0xDA, 0xB9, 0x51, 0x04, 0x01, + 0x0C, 0x50, 0x13, 0x00, 0x26, 0xCA, 0xB9, 0xD1, 0xFC, 0x00, 0x36, 0x5E, 0x04, 0xD0, 0x2C, 0x70, + 0x12, 0x00, 0x2C, 0xC0, 0x3A, 0x01, 0x06, 0x8D, 0x06, 0x9D, 0xB9, 0x51, 0x08, 0x01, 0xB9, 0x71, + 0x10, 0x01, 0x38, 0x61, 0x04, 0x01, 0xC6, 0xB6, 0x3A, 0x85, 0x00, 0x00, 0x38, 0x71, 0x0C, 0x01, + 0x26, 0x7B, 0x26, 0x77, 0x0C, 0x60, 0x80, 0x02, 0x26, 0x67, 0x0C, 0x50, 0x78, 0x00, 0xB9, 0x61, + 0x00, 0x01, 0x26, 0x51, 0x04, 0x60, 0x06, 0x76, 0x26, 0x5D, 0x38, 0x21, 0x08, 0x01, 0x2F, 0x4E, + 0x07, 0x00, 0xC6, 0x42, 0x32, 0x17, 0x38, 0xF1, 0xFC, 0x00, 0x38, 0x41, 0x00, 0x01, 0x70, 0x2C, + 0x2F, 0x37, 0x07, 0x00, 0x26, 0x3F, 0x26, 0x46, 0x78, 0x33, 0x76, 0x01, 0x70, 0x44, 0x26, 0x32, + 0x26, 0x43, 0x30, 0x35, 0x26, 0x94, 0x26, 0x43, 0xB1, 0x45, 0x24, 0x71, 0x2C, 0x60, 0x1A, 0x00, + 0xF2, 0xE5, 0x0C, 0x70, 0x78, 0x00, 0x26, 0x71, 0x26, 0x7D, 0x30, 0x27, 0x38, 0x31, 0xF4, 0x00, + 0xB9, 0x71, 0x20, 0x01, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x20, 0x01, 0x04, 0x60, 0xB1, 0x27, + 0x06, 0x52, 0x06, 0x76, 0x2F, 0x4D, 0x01, 0x00, 0x38, 0x21, 0x08, 0x01, 0x2F, 0x3E, 0x07, 0x00, + 0xC6, 0x32, 0x32, 0x2E, 0x38, 0x31, 0x00, 0x01, 0x70, 0xFC, 0x26, 0x36, 0x70, 0x33, 0x2F, 0x27, + 0x07, 0x00, 0x36, 0x35, 0xB9, 0x31, 0x24, 0x01, 0x38, 0x31, 0xFC, 0x00, 0x26, 0x23, 0x78, 0x22, + 0x76, 0x01, 0xB9, 0x41, 0x18, 0x01, 0xB9, 0x51, 0x14, 0x01, 0x26, 0x2F, 0x38, 0xF1, 0x24, 0x01, + 0xB9, 0x61, 0x1C, 0x01, 0xB9, 0x71, 0x20, 0x01, 0x26, 0x2F, 0x06, 0x32, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x41, 0x18, 0x01, 0x38, 0x71, 0x20, 0x01, 0x38, 0x61, 0x1C, 0x01, 0x30, 0x34, 0x38, 0x51, + 0x14, 0x01, 0x26, 0x23, 0xB1, 0x24, 0x24, 0x71, 0x2C, 0x60, 0x1A, 0x00, 0xF2, 0xCE, 0x2F, 0x7D, + 0x01, 0x00, 0x30, 0x27, 0x38, 0x31, 0x10, 0x01, 0xB9, 0x71, 0x20, 0x01, 0x24, 0xB1, 0x4B, 0xA1, + 0x00, 0x00, 0x38, 0x71, 0x20, 0x01, 0x26, 0x82, 0xB1, 0x27, 0x24, 0xD4, 0x24, 0xC2, 0xFA, 0x7A, + 0xFF, 0xFF, 0x38, 0x31, 0xF0, 0x00, 0x06, 0x28, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x31, 0xF0, 0x00, + 0x06, 0xD2, 0x38, 0x21, 0xF4, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x32, 0x06, 0x29, 0x4B, 0xA1, + 0x00, 0x00, 0x38, 0x8A, 0x08, 0x03, 0x43, 0xB2, 0x06, 0xC2, 0xA9, 0xBA, 0x06, 0x03, 0x04, 0x90, + 0x38, 0x71, 0xF0, 0x00, 0xC6, 0x97, 0x32, 0x0D, 0x06, 0x79, 0x57, 0x71, 0x26, 0x71, 0x30, 0x27, + 0x24, 0x91, 0x3F, 0x22, 0x0D, 0x00, 0x06, 0x32, 0xAB, 0x9A, 0x00, 0x00, 0x26, 0x82, 0xF2, 0xF1, + 0x38, 0x31, 0xF8, 0x00, 0x06, 0x28, 0x24, 0x3C, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x31, 0x04, 0x01, + 0x06, 0xDA, 0x4B, 0xA1, 0x00, 0x00, 0x0C, 0x30, 0x13, 0x00, 0x36, 0x3E, 0x4B, 0xA1, 0x00, 0x00, + 0x86, 0x22, 0x32, 0x03, 0x2C, 0x20, 0xFF, 0x03, 0xC4, 0xB0, 0x67, 0x25, 0xB9, 0x2D, 0x08, 0x03, + 0x92, 0x04, 0x24, 0xC1, 0xA9, 0xCA, 0x06, 0x03, 0x58, 0xC1, 0x38, 0x01, 0x58, 0x81, 0x28, 0x01, + 0x2C, 0x10, 0x48, 0x01, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x48, 0x00, 0xD9, 0xC1, 0x38, 0x00, + 0x38, 0x70, 0x40, 0x16, 0xD9, 0x81, 0x28, 0x00, 0x0C, 0x30, 0x58, 0x00, 0x26, 0x37, 0x30, 0xB7, + 0x10, 0x73, 0xB1, 0x71, 0x98, 0x70, 0x56, 0x16, 0x06, 0x87, 0x0C, 0x80, 0x00, 0x10, 0x92, 0x26, + 0x28, 0x78, 0xFC, 0x02, 0xCC, 0x70, 0x14, 0x00, 0x0C, 0x70, 0x80, 0x0B, 0x78, 0x67, 0xEA, 0x01, + 0xC2, 0x0E, 0xCC, 0x60, 0x80, 0x01, 0x02, 0x1A, 0x78, 0x77, 0xEC, 0x01, 0xCC, 0x70, 0x80, 0x01, + 0x02, 0x15, 0x28, 0x78, 0x06, 0x00, 0x6C, 0x70, 0x00, 0x08, 0xF2, 0x0E, 0xCC, 0x60, 0x95, 0x00, + 0x12, 0x0D, 0x78, 0x77, 0xEC, 0x01, 0xCC, 0x70, 0x95, 0x00, 0x12, 0x08, 0x28, 0x78, 0x06, 0x00, + 0x1C, 0x50, 0x01, 0x08, 0x56, 0x75, 0xA9, 0x78, 0x06, 0x00, 0x18, 0x78, 0x04, 0x00, 0xC4, 0x71, + 0x92, 0x54, 0x18, 0x68, 0xCB, 0x03, 0x0C, 0x70, 0x64, 0x00, 0xC4, 0x65, 0xD2, 0x02, 0x04, 0x70, + 0x18, 0x58, 0xBC, 0x01, 0x18, 0x68, 0xBD, 0x01, 0x34, 0x54, 0x13, 0x55, 0xC4, 0x52, 0x14, 0x56, + 0x26, 0x56, 0x2C, 0x70, 0x1E, 0x00, 0x13, 0x55, 0xD2, 0x06, 0xC4, 0x55, 0xD2, 0x09, 0x28, 0x68, + 0xF0, 0x02, 0xF2, 0x0B, 0xC4, 0x55, 0xD2, 0x07, 0x28, 0x68, 0xF2, 0x02, 0xF2, 0x06, 0x28, 0x68, + 0xF4, 0x02, 0xF2, 0x03, 0x28, 0x68, 0xF6, 0x02, 0xC6, 0x67, 0x02, 0x13, 0x28, 0x78, 0x06, 0x00, + 0x6C, 0x70, 0x00, 0x04, 0xA9, 0x78, 0x06, 0x00, 0x0C, 0x70, 0x1E, 0x00, 0x99, 0x78, 0xF9, 0x02, + 0x18, 0x78, 0xF8, 0x02, 0xC4, 0x79, 0x12, 0x1B, 0x24, 0x71, 0x99, 0x78, 0xF8, 0x02, 0xF2, 0x17, + 0x98, 0x78, 0xF9, 0x02, 0x99, 0x08, 0xF8, 0x02, 0x82, 0x05, 0x34, 0x71, 0x99, 0x78, 0xF9, 0x02, + 0xF2, 0x0E, 0x28, 0x78, 0x06, 0x00, 0x0C, 0x60, 0x00, 0x04, 0xD6, 0x67, 0x82, 0x03, 0x99, 0x08, + 0xFA, 0x02, 0x1C, 0x60, 0x01, 0x04, 0x56, 0x76, 0xA9, 0x78, 0x06, 0x00, 0x98, 0x78, 0xFA, 0x02, + 0x82, 0x04, 0x34, 0x71, 0x99, 0x78, 0xFA, 0x02, 0x0C, 0x70, 0x00, 0x20, 0xD6, 0x7B, 0x8A, 0xA3, + 0x00, 0x00, 0x18, 0x78, 0xC0, 0x03, 0x04, 0xC1, 0xC4, 0x70, 0x92, 0x05, 0x18, 0xC8, 0x04, 0x00, + 0x16, 0xCC, 0xF7, 0xCF, 0xEB, 0x89, 0x01, 0x00, 0x28, 0x78, 0x08, 0x00, 0x78, 0x48, 0x06, 0x03, + 0x04, 0x50, 0x3F, 0x24, 0x07, 0x00, 0xC4, 0x29, 0x02, 0x0D, 0x04, 0x3A, 0xB9, 0x41, 0x1C, 0x00, + 0xB9, 0x71, 0x18, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x18, 0x00, 0x38, 0x41, 0x1C, 0x00, + 0x06, 0x52, 0x0C, 0x60, 0x00, 0x03, 0x26, 0x68, 0x20, 0x66, 0x98, 0x98, 0x04, 0x00, 0x38, 0xA8, + 0x08, 0x03, 0xB9, 0x61, 0x04, 0x00, 0x82, 0x35, 0x38, 0xE0, 0x40, 0x16, 0x28, 0x3E, 0x4C, 0x00, + 0xC6, 0x73, 0xB2, 0x2F, 0x26, 0x77, 0x06, 0x27, 0x57, 0x21, 0x26, 0x27, 0x06, 0x34, 0xB9, 0x51, + 0x18, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x86, 0x22, 0x38, 0x51, 0x18, 0x00, 0x32, 0x02, 0x04, 0x20, + 0x28, 0x7E, 0x4E, 0x00, 0xC6, 0x27, 0xB2, 0x1D, 0x28, 0x7E, 0x50, 0x00, 0xC6, 0x57, 0xB2, 0x19, + 0x28, 0x2E, 0x52, 0x00, 0x06, 0x39, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x04, 0x00, 0xC6, 0x72, + 0xC2, 0x10, 0xC4, 0xA0, 0x06, 0x7A, 0x32, 0x02, 0x04, 0x70, 0x78, 0x5E, 0x54, 0x00, 0xC6, 0x75, + 0xA2, 0x04, 0x98, 0x78, 0xFA, 0x02, 0x82, 0x05, 0x98, 0x78, 0xB4, 0x01, 0x8A, 0xFB, 0x00, 0x00, + 0x38, 0x50, 0x40, 0x16, 0x18, 0x75, 0x56, 0x00, 0xC6, 0xA7, 0x22, 0x14, 0xC4, 0x90, 0x82, 0x12, + 0x28, 0x78, 0x06, 0x00, 0xDC, 0x70, 0x80, 0x00, 0x92, 0x0D, 0x18, 0x78, 0x05, 0x03, 0x18, 0x65, + 0x59, 0x00, 0xC6, 0x67, 0xC2, 0x07, 0x30, 0x91, 0xC6, 0x79, 0xC2, 0x04, 0x24, 0x71, 0x99, 0x78, + 0x05, 0x03, 0x18, 0x78, 0x05, 0x03, 0x30, 0x51, 0xC6, 0x75, 0x28, 0x78, 0x06, 0x00, 0xD2, 0x0C, + 0xC4, 0xC1, 0x92, 0x0A, 0x6C, 0x70, 0x80, 0x00, 0xA9, 0x78, 0x06, 0x00, 0x38, 0x70, 0x40, 0x16, + 0x18, 0x77, 0x5A, 0x00, 0xF2, 0x16, 0x0C, 0x60, 0x80, 0x00, 0xD6, 0x67, 0x82, 0x14, 0x98, 0x68, + 0x04, 0x03, 0x92, 0x0D, 0x1C, 0x60, 0x81, 0x00, 0x56, 0x76, 0xA9, 0x78, 0x06, 0x00, 0x38, 0x70, + 0x40, 0x16, 0x18, 0x77, 0x57, 0x00, 0x99, 0x78, 0x05, 0x03, 0xF2, 0x05, 0x06, 0x76, 0x34, 0x71, + 0x99, 0x78, 0x04, 0x03, 0x98, 0x38, 0x04, 0x00, 0x8A, 0x0A, 0x01, 0x00, 0x38, 0xF0, 0x40, 0x16, + 0x28, 0x68, 0x06, 0x00, 0x0C, 0x70, 0x61, 0x00, 0x26, 0x7F, 0x10, 0x77, 0x18, 0x2F, 0x62, 0x00, + 0x0C, 0x40, 0x10, 0x00, 0xD6, 0x46, 0xB9, 0x71, 0x24, 0x00, 0x18, 0x7F, 0x63, 0x00, 0x82, 0x0E, + 0x38, 0x91, 0x24, 0x00, 0xC6, 0x97, 0xC2, 0x07, 0x06, 0x59, 0x36, 0x57, 0x13, 0x55, 0xB9, 0x51, + 0x24, 0x00, 0xF2, 0x04, 0x04, 0xC1, 0xB9, 0xC1, 0x24, 0x00, 0x0C, 0x50, 0xCB, 0x03, 0x26, 0x58, + 0x10, 0x55, 0x0C, 0x70, 0xC4, 0x03, 0xB9, 0x51, 0x04, 0x00, 0x26, 0x78, 0x0C, 0x50, 0xB0, 0x02, + 0x10, 0x77, 0x26, 0x58, 0x20, 0x55, 0xB9, 0x71, 0x08, 0x00, 0x04, 0x92, 0x04, 0x40, 0x56, 0x9B, + 0x54, 0xB4, 0xB9, 0x51, 0x0C, 0x00, 0x0C, 0x70, 0x70, 0x12, 0x06, 0xA3, 0x06, 0xE4, 0x06, 0xD4, + 0xB9, 0x91, 0x10, 0x00, 0xB9, 0xB1, 0x14, 0x00, 0xA8, 0x37, 0x08, 0x00, 0x82, 0x30, 0x38, 0xB1, + 0x10, 0x00, 0x04, 0xC0, 0xC6, 0xBC, 0x82, 0x1E, 0x38, 0xC1, 0x04, 0x00, 0xC4, 0xC5, 0xC2, 0x04, + 0x2C, 0x20, 0x14, 0x00, 0x13, 0x22, 0xC6, 0x32, 0xC2, 0x06, 0x6C, 0x60, 0x20, 0x00, 0x04, 0xA0, + 0x04, 0xC1, 0xF2, 0x10, 0x0C, 0xB0, 0x20, 0x00, 0x04, 0xC0, 0x56, 0xB6, 0xC6, 0xBC, 0x82, 0x0A, + 0xC4, 0xA1, 0xD2, 0x08, 0x1C, 0xB0, 0x14, 0x00, 0x26, 0xB2, 0xC6, 0x3B, 0x32, 0x03, 0x5C, 0x60, + 0xDF, 0xFF, 0xB8, 0x51, 0x14, 0x00, 0x82, 0x0B, 0x38, 0x91, 0x08, 0x00, 0xC4, 0x91, 0xD2, 0x07, + 0xC4, 0xC0, 0x92, 0x05, 0x38, 0xB1, 0x24, 0x00, 0xC6, 0x3B, 0xB2, 0x50, 0x24, 0x7C, 0x0C, 0xB0, + 0xAC, 0x12, 0xC6, 0x7B, 0x92, 0xCA, 0xC4, 0xD0, 0x99, 0xA8, 0x04, 0x00, 0xA9, 0x68, 0x06, 0x00, + 0x8A, 0x89, 0x00, 0x00, 0x04, 0xC0, 0x0C, 0x90, 0xDC, 0x11, 0x18, 0x78, 0x04, 0x00, 0xC6, 0xC7, + 0x32, 0x26, 0x06, 0x7E, 0x63, 0x7C, 0xD4, 0x71, 0x82, 0x20, 0x06, 0x2C, 0xD7, 0x21, 0x2C, 0x20, + 0xBC, 0x01, 0x06, 0xBC, 0x26, 0x28, 0x18, 0x78, 0x04, 0x00, 0xC6, 0xB7, 0xB2, 0x14, 0xC4, 0xB4, + 0x04, 0xA8, 0x26, 0xA2, 0x92, 0x08, 0x06, 0x29, 0x04, 0x30, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0xF2, 0x06, 0x06, 0x3A, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x24, 0xB1, + 0x06, 0x2A, 0xF2, 0xEA, 0xF7, 0xE0, 0x34, 0xC1, 0x24, 0xC1, 0xF2, 0xD8, 0x3F, 0xDD, 0x07, 0x00, + 0x28, 0x78, 0x06, 0x00, 0x99, 0xD8, 0x04, 0x00, 0x6C, 0x70, 0x10, 0x00, 0xA9, 0x78, 0x06, 0x00, + 0xF2, 0x56, 0x98, 0x78, 0x05, 0x03, 0x8A, 0x1E, 0xFF, 0xFF, 0x18, 0x6E, 0x5B, 0x00, 0xC6, 0x67, + 0xAA, 0x19, 0xFF, 0xFF, 0x34, 0x71, 0xFA, 0x14, 0xFF, 0xFF, 0x18, 0x3F, 0x60, 0x00, 0x38, 0x51, + 0x0C, 0x00, 0xC6, 0x35, 0xB2, 0xAC, 0x18, 0x37, 0x0A, 0x00, 0x2F, 0xB3, 0x03, 0x00, 0x26, 0xB3, + 0x26, 0xBB, 0x26, 0xB8, 0xE8, 0x9B, 0xB2, 0x02, 0xB1, 0x91, 0x02, 0xA1, 0x06, 0x94, 0x63, 0x93, + 0xD4, 0x91, 0x92, 0x9D, 0x0C, 0x50, 0xB3, 0x02, 0x26, 0x5B, 0x10, 0x55, 0x0C, 0x90, 0x00, 0x10, + 0xD7, 0x51, 0x26, 0x59, 0x30, 0x97, 0xA9, 0x95, 0xBE, 0x01, 0x38, 0x97, 0x04, 0x00, 0xA9, 0x95, + 0xC0, 0x01, 0x04, 0x51, 0x53, 0x53, 0x06, 0x35, 0x66, 0x34, 0x23, 0x43, 0x04, 0x32, 0x26, 0x3C, + 0x13, 0x33, 0x26, 0x3B, 0x18, 0x93, 0xB2, 0x02, 0x24, 0xC1, 0x06, 0x39, 0xD7, 0x31, 0x26, 0x38, + 0xA9, 0x03, 0xBE, 0x01, 0xA9, 0x03, 0xC0, 0x01, 0xA9, 0x03, 0xC2, 0x01, 0x04, 0x31, 0x53, 0x39, + 0x30, 0x91, 0x66, 0x3E, 0xC6, 0x9C, 0x23, 0xE3, 0x92, 0xEA, 0x26, 0xD9, 0x23, 0xDD, 0xFA, 0x6F, + 0xFF, 0xFF, 0x1C, 0xC0, 0x11, 0x00, 0x56, 0x6C, 0xA9, 0x68, 0x06, 0x00, 0x58, 0xC1, 0x38, 0x00, + 0x58, 0x81, 0x28, 0x00, 0x2C, 0x10, 0x48, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x20, 0x00, + 0xD9, 0xC1, 0x10, 0x00, 0x08, 0xD0, 0x01, 0x00, 0xD1, 0x81, 0x0C, 0xC0, 0x24, 0x10, 0x04, 0xE0, + 0x2C, 0xD0, 0xA0, 0x6D, 0x06, 0x2E, 0x04, 0x3B, 0x0B, 0x9E, 0x00, 0x00, 0x2C, 0xE0, 0x20, 0x1C, + 0xC6, 0xED, 0x2C, 0x20, 0x47, 0x01, 0xB1, 0x2C, 0x24, 0xC4, 0x92, 0xF5, 0x08, 0xD0, 0x03, 0x00, + 0x0C, 0xC0, 0xA4, 0x10, 0x04, 0xE0, 0x2C, 0xD0, 0x00, 0xE8, 0x06, 0x2E, 0x0C, 0x30, 0x12, 0x00, + 0x0B, 0x9E, 0x00, 0x00, 0x2C, 0xE0, 0x00, 0x32, 0xC6, 0xED, 0x2C, 0x20, 0x63, 0x01, 0xB1, 0x2C, + 0x24, 0xC4, 0x92, 0xF4, 0x08, 0xD0, 0x00, 0x80, 0x0C, 0xC0, 0x00, 0x10, 0x0C, 0x90, 0x54, 0x05, + 0x0C, 0xE0, 0x44, 0x15, 0x2C, 0xD0, 0x1A, 0xDC, 0x26, 0x9C, 0x18, 0x7D, 0x05, 0x00, 0x1C, 0x20, + 0x47, 0x01, 0x24, 0x79, 0x57, 0x71, 0x26, 0x7C, 0x30, 0xA7, 0x04, 0x3A, 0x26, 0x2A, 0x0B, 0x9E, + 0x00, 0x00, 0x10, 0x7D, 0xA9, 0x2E, 0x04, 0x00, 0x1C, 0x20, 0x63, 0x01, 0x2C, 0x70, 0x29, 0x00, + 0x57, 0x71, 0x26, 0x7C, 0x30, 0xB7, 0x04, 0x3A, 0x26, 0x2B, 0x0B, 0x9E, 0x00, 0x00, 0xA1, 0x2E, + 0x0C, 0x20, 0x47, 0x01, 0x04, 0x3A, 0x26, 0x2A, 0x0B, 0x9E, 0x00, 0x00, 0xA9, 0x2E, 0x06, 0x00, + 0x0C, 0x20, 0x63, 0x01, 0x26, 0x2B, 0x04, 0x3A, 0x0B, 0x9E, 0x00, 0x00, 0xA9, 0x2E, 0x02, 0x00, + 0x24, 0xE8, 0xC6, 0xE9, 0x24, 0xD1, 0x92, 0xD2, 0x58, 0xC1, 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, + 0x20, 0x00, 0xE1, 0xF0, 0x38, 0x60, 0x40, 0x16, 0x06, 0x72, 0x28, 0x66, 0xB6, 0x00, 0xC4, 0x70, + 0x13, 0x56, 0x32, 0x02, 0x16, 0x27, 0xC6, 0x25, 0x02, 0x0B, 0xC6, 0x75, 0x0C, 0x40, 0xFF, 0x00, + 0x56, 0x46, 0x02, 0x04, 0x3F, 0x44, 0x03, 0x00, 0xF2, 0x02, 0x26, 0x43, 0x23, 0x44, 0x06, 0x24, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x40, 0x16, 0x3C, 0x10, 0x24, 0x00, 0xD9, 0xC1, 0x14, 0x00, + 0xD9, 0x81, 0x04, 0x00, 0x30, 0x77, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x41, 0x0C, 0xC0, 0x00, 0x10, + 0x98, 0x9C, 0xBF, 0x03, 0x82, 0x3C, 0x98, 0x8C, 0xC0, 0x03, 0x82, 0x39, 0x0C, 0xE0, 0x10, 0x13, + 0x04, 0xD0, 0xC6, 0xD9, 0x32, 0x34, 0x06, 0x6A, 0x0C, 0x60, 0x6A, 0x13, 0x04, 0x70, 0xC6, 0x78, + 0x32, 0x2A, 0x2C, 0x60, 0x10, 0x00, 0x1C, 0x50, 0x10, 0x00, 0x26, 0x56, 0x18, 0x4E, 0x0A, 0x00, + 0x10, 0x55, 0xC6, 0x45, 0x92, 0x1E, 0x24, 0x75, 0x57, 0x72, 0x26, 0x7C, 0x78, 0x47, 0x10, 0x03, + 0x78, 0xB7, 0x12, 0x03, 0x70, 0x3E, 0x78, 0x7E, 0x02, 0x00, 0x3F, 0x24, 0x03, 0x00, 0x36, 0x7B, + 0x23, 0x33, 0x23, 0x44, 0xB1, 0x71, 0xAB, 0xC7, 0x01, 0x00, 0xA1, 0x2E, 0x30, 0x71, 0x28, 0x3E, + 0x02, 0x00, 0x06, 0x27, 0x23, 0x4B, 0xAB, 0xC7, 0x01, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0xF2, 0x03, + 0x24, 0x71, 0xF2, 0xD6, 0x24, 0xD1, 0x2C, 0xE0, 0x10, 0x00, 0xF2, 0xCC, 0x58, 0xC1, 0x14, 0x00, + 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xC6, 0x34, 0x3C, 0x10, + 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, 0xD1, 0x81, 0x06, 0xE2, 0x78, 0xA1, 0x20, 0x00, 0x78, 0xC1, + 0x24, 0x00, 0x78, 0xD1, 0x28, 0x00, 0x32, 0x05, 0xA1, 0xC2, 0xA9, 0xD2, 0x02, 0x00, 0xF2, 0x20, + 0xC6, 0x35, 0x22, 0x05, 0xA1, 0x62, 0xA9, 0xA2, 0x02, 0x00, 0xF2, 0x1A, 0x3F, 0x94, 0x03, 0x00, + 0x06, 0x29, 0x3F, 0x3C, 0x06, 0x00, 0x3F, 0xB4, 0x05, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x3B, + 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x2C, 0xA1, 0x2E, 0x3F, 0x3D, 0x0A, 0x00, 0x06, 0x29, 0xAB, 0x9A, + 0x00, 0x00, 0x06, 0x3B, 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x2D, 0xA9, 0x2E, 0x02, 0x00, 0x58, 0xC1, + 0x10, 0x00, 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x2F, 0x72, 0x02, 0x00, + 0x26, 0x72, 0x06, 0x67, 0x57, 0x62, 0x26, 0x76, 0x26, 0x27, 0x0C, 0x70, 0x00, 0x10, 0x2C, 0x20, + 0xD4, 0x03, 0x26, 0x27, 0x06, 0x72, 0x04, 0x69, 0x34, 0x61, 0xC4, 0x60, 0xA9, 0x07, 0x24, 0x00, + 0xA9, 0x07, 0x26, 0x00, 0x34, 0x74, 0x92, 0xF9, 0x04, 0x71, 0x99, 0x72, 0x28, 0x00, 0x38, 0x70, + 0x40, 0x16, 0xA9, 0x02, 0x2A, 0x00, 0x18, 0x77, 0x9E, 0x00, 0x99, 0x02, 0x2D, 0x00, 0xA9, 0x02, + 0x32, 0x00, 0x99, 0x72, 0x2C, 0x00, 0x14, 0x71, 0xA9, 0x02, 0x30, 0x00, 0xA9, 0x02, 0x2E, 0x00, + 0xA1, 0x72, 0xA9, 0x72, 0x02, 0x00, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, + 0xEB, 0xD1, 0x01, 0x00, 0x24, 0xE1, 0xC4, 0xE5, 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, + 0x38, 0x70, 0x40, 0x16, 0x3C, 0x10, 0x8C, 0x00, 0x0C, 0x60, 0xB4, 0x00, 0xD9, 0xC1, 0x7C, 0x00, + 0xD9, 0x81, 0x6C, 0x00, 0x26, 0x67, 0x10, 0x66, 0xB9, 0x61, 0x3C, 0x00, 0x30, 0x67, 0xD4, 0x68, + 0x8A, 0x98, 0x03, 0x00, 0x18, 0xB7, 0x9C, 0x00, 0x06, 0xD7, 0x04, 0xE0, 0x28, 0x2D, 0xA0, 0x00, + 0x04, 0xCC, 0x26, 0xC1, 0x06, 0x3B, 0xAB, 0x9A, 0x00, 0x00, 0x26, 0xCE, 0x24, 0xE4, 0xCC, 0xE0, + 0x28, 0x00, 0xB1, 0x2C, 0x24, 0xD2, 0x92, 0xF3, 0x0C, 0xD0, 0x00, 0x10, 0x98, 0x7D, 0xBF, 0x03, + 0x92, 0x05, 0xCB, 0xD4, 0x01, 0x00, 0xFA, 0x7D, 0x03, 0x00, 0x04, 0x70, 0x06, 0xED, 0xB9, 0x71, + 0x38, 0x00, 0x38, 0x71, 0x38, 0x00, 0x26, 0x7D, 0xE8, 0xA7, 0xB5, 0x03, 0x82, 0x15, 0x0C, 0x60, + 0x40, 0x16, 0x30, 0x76, 0x34, 0xA1, 0x98, 0x77, 0xB5, 0x00, 0x57, 0xA2, 0x26, 0xAD, 0x0C, 0xB0, + 0x10, 0x03, 0x26, 0xBA, 0x9A, 0xD6, 0x00, 0x00, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x26, 0x01, 0x00, + 0xC4, 0x20, 0x9A, 0xCF, 0x00, 0x00, 0x38, 0x21, 0x38, 0x00, 0xEB, 0xD1, 0x01, 0x00, 0x38, 0x71, + 0x38, 0x00, 0x2C, 0xE0, 0x34, 0x00, 0x24, 0x71, 0xC4, 0x75, 0xB9, 0x71, 0x38, 0x00, 0x92, 0xDA, + 0x18, 0x6D, 0x1A, 0x03, 0x99, 0x0D, 0xCF, 0x03, 0x34, 0x61, 0x2F, 0x76, 0x06, 0x00, 0x26, 0x76, + 0x06, 0x57, 0x57, 0x52, 0x26, 0x75, 0x26, 0x76, 0x2C, 0x70, 0xD4, 0x03, 0x26, 0x7D, 0x78, 0x57, + 0x08, 0x00, 0x38, 0x30, 0x40, 0x16, 0x78, 0x67, 0x04, 0x00, 0x36, 0x65, 0xC4, 0x60, 0x32, 0x02, + 0x16, 0x66, 0x28, 0x43, 0x80, 0x00, 0xC6, 0x64, 0x02, 0x06, 0xC4, 0x50, 0x82, 0x04, 0x04, 0x61, + 0x99, 0x6D, 0xCF, 0x03, 0x18, 0x6D, 0xBF, 0x03, 0xC4, 0x61, 0x9A, 0x87, 0x00, 0x00, 0x98, 0x6D, + 0xC0, 0x03, 0x8A, 0x1E, 0x03, 0x00, 0xF8, 0x67, 0x08, 0x00, 0x8A, 0x1A, 0x03, 0x00, 0xF8, 0x57, + 0x0A, 0x00, 0x8A, 0x16, 0x03, 0x00, 0xF8, 0x57, 0x04, 0x00, 0x8A, 0x12, 0x03, 0x00, 0xF8, 0x47, + 0x06, 0x00, 0x8A, 0x0E, 0x03, 0x00, 0x3F, 0x66, 0x05, 0x00, 0xC4, 0x60, 0x32, 0x02, 0x16, 0x66, + 0x28, 0x53, 0x7E, 0x00, 0xC6, 0x65, 0x02, 0x1E, 0x18, 0x4D, 0xCC, 0x03, 0x04, 0x61, 0x5C, 0x40, + 0xFC, 0x00, 0x99, 0x4D, 0xCC, 0x03, 0x99, 0x6D, 0xCA, 0x03, 0x78, 0xF7, 0x04, 0x00, 0x78, 0x27, + 0x08, 0x00, 0xC6, 0xF2, 0x02, 0x07, 0x64, 0x41, 0x99, 0x4D, 0xCC, 0x03, 0x04, 0x61, 0x04, 0x50, + 0xF2, 0x11, 0xC6, 0xF2, 0x04, 0x61, 0x04, 0x50, 0x32, 0x0D, 0x64, 0x42, 0x99, 0x4D, 0xCC, 0x03, + 0xF2, 0x09, 0x28, 0x43, 0x82, 0x00, 0x04, 0x51, 0xC6, 0x64, 0x12, 0x02, 0x04, 0x50, 0x13, 0x55, + 0x04, 0x60, 0x78, 0x27, 0x06, 0x00, 0x78, 0x47, 0x0A, 0x00, 0x3F, 0x44, 0x02, 0x00, 0xC4, 0x40, + 0x32, 0x02, 0x16, 0x44, 0x28, 0x23, 0x7E, 0x00, 0xC6, 0x42, 0x02, 0x1A, 0x18, 0x4D, 0xCC, 0x03, + 0x04, 0x31, 0x5C, 0x40, 0xF3, 0x00, 0x99, 0x4D, 0xCC, 0x03, 0x99, 0x3D, 0xCA, 0x03, 0x78, 0x37, + 0x06, 0x00, 0x78, 0x77, 0x0A, 0x00, 0xC6, 0x37, 0x02, 0x03, 0x64, 0x44, 0xF2, 0x04, 0xC6, 0x37, + 0x32, 0x04, 0x64, 0x48, 0x99, 0x4D, 0xCC, 0x03, 0x24, 0x61, 0x13, 0x66, 0xF2, 0x07, 0x28, 0x73, + 0x82, 0x00, 0xC6, 0x47, 0x02, 0x03, 0x24, 0x51, 0x13, 0x55, 0x98, 0x7D, 0xCD, 0x03, 0x92, 0x11, + 0xC4, 0x52, 0x92, 0x0C, 0x18, 0x7D, 0xCB, 0x03, 0xCC, 0x70, 0xFF, 0x00, 0x8A, 0xA9, 0x02, 0x00, + 0x24, 0x71, 0x99, 0x7D, 0xCB, 0x03, 0xFA, 0xA4, 0x02, 0x00, 0xC4, 0x60, 0x8A, 0xA1, 0x02, 0x00, + 0x99, 0x0D, 0xCB, 0x03, 0xFA, 0x9D, 0x02, 0x00, 0xC4, 0x62, 0x9A, 0xA3, 0x02, 0x00, 0x0C, 0x70, + 0x2E, 0x01, 0x26, 0x7D, 0x0C, 0x30, 0x10, 0x03, 0x06, 0x27, 0x26, 0x3D, 0x04, 0x44, 0x8B, 0xE0, + 0x03, 0x00, 0x06, 0x72, 0x04, 0x24, 0x26, 0x27, 0x0C, 0x30, 0x20, 0x03, 0xFA, 0x8E, 0x02, 0x00, + 0x78, 0x7A, 0x10, 0x03, 0xCC, 0x70, 0xCF, 0x02, 0x1A, 0x33, 0xFF, 0xFF, 0x78, 0x7A, 0x12, 0x03, + 0xCC, 0x70, 0xFF, 0x04, 0x1A, 0x2D, 0xFF, 0xFF, 0x0C, 0xC0, 0xD4, 0x03, 0x26, 0xCE, 0x06, 0x7C, + 0x04, 0x68, 0x28, 0x57, 0x20, 0x00, 0x34, 0x61, 0xA9, 0x57, 0x24, 0x00, 0x28, 0x57, 0x22, 0x00, + 0xC4, 0x60, 0xA9, 0x57, 0x26, 0x00, 0x34, 0x74, 0x92, 0xF5, 0x0C, 0x20, 0xD8, 0x03, 0x06, 0x3B, + 0x26, 0x2E, 0x04, 0x44, 0x8B, 0xE0, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7D, 0xB6, 0x01, 0x18, 0x7E, + 0xFC, 0x03, 0x78, 0x2E, 0xD8, 0x03, 0x78, 0x3E, 0xDC, 0x03, 0xC4, 0x71, 0xC2, 0x12, 0x3F, 0x73, + 0x02, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x43, 0x67, 0x78, 0x5E, 0xDA, 0x03, 0x78, 0x7E, + 0xDE, 0x03, 0x3F, 0x77, 0x05, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0x43, 0x87, 0xF2, 0x04, + 0x0C, 0x80, 0x64, 0x00, 0x06, 0x68, 0xB9, 0x61, 0x68, 0x00, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, + 0x06, 0x92, 0x78, 0x3E, 0xDE, 0x03, 0x78, 0x2E, 0xDA, 0x03, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, + 0x78, 0x3E, 0xE0, 0x03, 0xB9, 0x21, 0x34, 0x00, 0x06, 0x29, 0x0C, 0xF0, 0xD4, 0x00, 0xF1, 0xF0, + 0xB9, 0x21, 0x40, 0x00, 0x78, 0x3E, 0xE2, 0x03, 0x38, 0x21, 0x34, 0x00, 0x0C, 0xF0, 0xD4, 0x00, + 0xF1, 0xF0, 0xB9, 0x21, 0x44, 0x00, 0x78, 0x3E, 0xE4, 0x03, 0x78, 0x4E, 0xE8, 0x03, 0x38, 0x21, + 0x40, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x48, 0x00, 0x78, 0x3E, 0xE6, 0x03, + 0x78, 0x4E, 0xEA, 0x03, 0x38, 0x21, 0x44, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0x4C, 0x00, 0x78, 0x3E, 0xEC, 0x03, 0x78, 0x4E, 0xF0, 0x03, 0x38, 0x21, 0x48, 0x00, 0x0C, 0xF0, + 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x50, 0x00, 0x78, 0x3E, 0xEE, 0x03, 0x78, 0x4E, 0xF2, 0x03, + 0x38, 0x21, 0x4C, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0xB9, 0x21, 0x54, 0x00, 0x78, 0x3E, + 0xF4, 0x03, 0x78, 0x4E, 0xF8, 0x03, 0x38, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0xB9, 0x21, 0x58, 0x00, 0x78, 0x3E, 0xF6, 0x03, 0x78, 0x4E, 0xFA, 0x03, 0x38, 0x21, 0x54, 0x00, + 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, 0x38, 0x61, 0x68, 0x00, 0xB9, 0x21, 0x5C, 0x00, 0x06, 0x38, + 0x06, 0x26, 0x0C, 0xF0, 0x80, 0x00, 0xF1, 0xF0, 0x99, 0x20, 0x60, 0x16, 0x28, 0x7E, 0x04, 0x04, + 0x04, 0x31, 0xA9, 0x7E, 0x06, 0x04, 0x28, 0x7E, 0x02, 0x04, 0xA9, 0x2E, 0x02, 0x04, 0xA9, 0x7E, + 0x04, 0x04, 0x18, 0x7E, 0x01, 0x04, 0x26, 0x37, 0x26, 0x77, 0x2F, 0x63, 0x03, 0x00, 0x26, 0xC7, + 0x04, 0x70, 0x16, 0x66, 0x06, 0x27, 0x2F, 0x57, 0x0C, 0x00, 0x34, 0x72, 0x78, 0x55, 0x2E, 0x00, + 0xC6, 0x76, 0x26, 0x25, 0x92, 0xF9, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x10, 0x00, 0x06, 0xC2, + 0xB9, 0x71, 0x60, 0x00, 0x38, 0x61, 0x60, 0x00, 0x04, 0x71, 0xC6, 0x26, 0x02, 0x11, 0x38, 0x61, + 0x18, 0x00, 0x04, 0x72, 0xC6, 0x26, 0x02, 0x0C, 0x38, 0x61, 0x20, 0x00, 0x04, 0x73, 0xC6, 0x26, + 0x02, 0x07, 0x38, 0x61, 0x28, 0x00, 0x04, 0x75, 0xC6, 0x26, 0x12, 0x02, 0x04, 0x74, 0x18, 0x6E, + 0x00, 0x04, 0x3F, 0x36, 0x07, 0x00, 0x0C, 0x70, 0x40, 0x16, 0x30, 0x47, 0x78, 0x7E, 0xFE, 0x03, + 0x18, 0x24, 0x9D, 0x00, 0xC4, 0x30, 0x16, 0x52, 0x02, 0x04, 0xC6, 0x72, 0x92, 0x0F, 0xF2, 0x05, + 0xC4, 0x30, 0x82, 0x06, 0xC6, 0x75, 0x92, 0x06, 0xA9, 0x0E, 0xFE, 0x03, 0xF2, 0x0A, 0xC4, 0x70, + 0x02, 0x03, 0x34, 0x71, 0xF2, 0x04, 0xC4, 0x70, 0x82, 0x04, 0x24, 0x71, 0xA9, 0x7E, 0xFE, 0x03, + 0x78, 0x7E, 0xFE, 0x03, 0x18, 0x44, 0x9D, 0x00, 0xC6, 0x74, 0x92, 0x05, 0xC4, 0x64, 0xD2, 0x03, + 0x24, 0x61, 0xF2, 0x0E, 0x28, 0x4D, 0x06, 0x00, 0xD4, 0x48, 0x82, 0x05, 0xC6, 0x75, 0x92, 0x0A, + 0xC4, 0x61, 0xF2, 0x04, 0xC6, 0x75, 0x92, 0x06, 0xC4, 0x63, 0xC2, 0x04, 0x34, 0x61, 0x99, 0x6E, + 0x00, 0x04, 0x18, 0x5E, 0xFC, 0x03, 0x38, 0x21, 0x58, 0x00, 0x06, 0x35, 0xB9, 0x51, 0x64, 0x00, + 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x51, 0x64, 0x00, 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, 0x06, 0x35, + 0x4B, 0xA1, 0x00, 0x00, 0x18, 0x4E, 0x00, 0x04, 0x38, 0x51, 0x64, 0x00, 0xC4, 0x41, 0x43, 0x72, + 0x92, 0x35, 0xC4, 0x58, 0xC2, 0x0E, 0x38, 0x21, 0x58, 0x00, 0x04, 0x39, 0x4B, 0xA1, 0x00, 0x00, + 0x43, 0x82, 0x38, 0x21, 0x5C, 0x00, 0x04, 0x39, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, + 0xC4, 0x56, 0xC2, 0x15, 0x38, 0x21, 0x50, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x37, 0x4B, 0xA1, + 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x54, 0x00, 0x04, 0x37, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, + 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, + 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, + 0x0C, 0x00, 0x38, 0x51, 0x60, 0x00, 0xFA, 0x9C, 0x00, 0x00, 0xC4, 0x42, 0x92, 0x34, 0xC4, 0x56, + 0xC2, 0x0E, 0x38, 0x21, 0x50, 0x00, 0x04, 0x37, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, + 0x54, 0x00, 0x04, 0x37, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x54, 0xC2, 0x15, + 0x38, 0x21, 0x48, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x04, 0x35, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x92, + 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, + 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, + 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x14, 0x00, 0x38, 0x51, + 0x18, 0x00, 0xF2, 0x66, 0xC4, 0x43, 0x92, 0x34, 0xC4, 0x54, 0xC2, 0x0E, 0x38, 0x21, 0x48, 0x00, + 0x04, 0x35, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x82, 0x38, 0x21, 0x4C, 0x00, 0x04, 0x35, 0x4B, 0xA1, + 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, 0xC4, 0x52, 0xC2, 0x15, 0x38, 0x21, 0x40, 0x00, 0xB9, 0x71, + 0x64, 0x00, 0x04, 0x33, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x92, 0x38, 0x21, 0x44, 0x00, 0x04, 0x33, + 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x64, 0x00, 0x06, 0x48, 0x06, 0x57, 0x06, 0x89, 0x43, 0x72, + 0xF2, 0x03, 0x06, 0x48, 0x06, 0x57, 0xB9, 0x41, 0x04, 0x00, 0xB9, 0x51, 0x08, 0x00, 0xB1, 0x71, + 0x06, 0x2B, 0x06, 0x3C, 0x38, 0x41, 0x1C, 0x00, 0x38, 0x51, 0x20, 0x00, 0xF2, 0x31, 0xC4, 0x44, + 0x92, 0x31, 0xC4, 0x52, 0xC2, 0x0E, 0x38, 0x21, 0x40, 0x00, 0x04, 0x33, 0x4B, 0xA1, 0x00, 0x00, + 0x43, 0x82, 0x38, 0x21, 0x44, 0x00, 0x04, 0x33, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x72, 0xF2, 0x03, + 0xC4, 0x52, 0x92, 0x11, 0x38, 0x41, 0x34, 0x00, 0x38, 0x61, 0x34, 0x00, 0x06, 0x59, 0xF7, 0x5F, + 0xF7, 0x4F, 0x26, 0x59, 0x26, 0x46, 0xE7, 0x50, 0xE7, 0x40, 0x06, 0x28, 0x06, 0x37, 0x43, 0x85, + 0x43, 0x74, 0xF2, 0x03, 0x06, 0x28, 0x06, 0x37, 0x38, 0x41, 0x24, 0x00, 0x38, 0x51, 0x28, 0x00, + 0xB9, 0x21, 0x04, 0x00, 0xB9, 0x31, 0x08, 0x00, 0xB1, 0x71, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x68, + 0xF2, 0x20, 0xC4, 0x51, 0xC2, 0x0E, 0x06, 0x69, 0xF7, 0x6F, 0x26, 0x69, 0xE7, 0x60, 0x38, 0x71, + 0x34, 0x00, 0x43, 0x86, 0x38, 0x61, 0x34, 0x00, 0xF7, 0x7F, 0x26, 0x76, 0xE7, 0x70, 0x43, 0x77, + 0x78, 0x5E, 0xDA, 0x03, 0x78, 0xFE, 0xD8, 0x03, 0x38, 0x41, 0x2C, 0x00, 0xB1, 0x51, 0x38, 0x51, + 0x30, 0x00, 0xB9, 0x81, 0x04, 0x00, 0xB9, 0x71, 0x08, 0x00, 0x06, 0x2B, 0x06, 0x3C, 0x06, 0x6F, + 0x6B, 0xCE, 0x01, 0x00, 0x18, 0x7E, 0xFC, 0x03, 0xC4, 0x78, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, + 0xFC, 0x03, 0x18, 0x7E, 0x01, 0x04, 0xC4, 0x71, 0xD2, 0x04, 0x24, 0x71, 0x99, 0x7E, 0x01, 0x04, + 0x18, 0x7A, 0x1A, 0x03, 0x34, 0x71, 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, 0x06, 0x96, 0x57, 0x92, + 0x26, 0x69, 0x26, 0x76, 0x2C, 0x70, 0xD4, 0x03, 0x2F, 0x97, 0x0D, 0x00, 0xF0, 0x29, 0x22, 0x39, + 0xF8, 0x79, 0x02, 0x00, 0x22, 0x36, 0x38, 0x61, 0x3C, 0x00, 0xB9, 0x71, 0x64, 0x00, 0x0C, 0xC0, + 0x64, 0x00, 0x06, 0x8C, 0x36, 0x86, 0x06, 0x38, 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0xA1, + 0x00, 0x00, 0x06, 0x62, 0x38, 0x31, 0x3C, 0x00, 0x78, 0x2A, 0x10, 0x03, 0xB9, 0x61, 0x68, 0x00, + 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x61, 0x68, 0x00, 0x38, 0x71, + 0x64, 0x00, 0x26, 0x26, 0x06, 0x38, 0xA9, 0x2A, 0x10, 0x03, 0x06, 0x27, 0xAB, 0x9A, 0x00, 0x00, + 0x06, 0x3C, 0x4B, 0xA1, 0x00, 0x00, 0x06, 0x82, 0x38, 0x31, 0x3C, 0x00, 0x78, 0x2A, 0x12, 0x03, + 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x3C, 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x28, 0xA9, 0x2A, 0x12, 0x03, + 0x06, 0x29, 0x06, 0x3B, 0x04, 0x44, 0x8B, 0xE0, 0x03, 0x00, 0xFA, 0xB2, 0xFC, 0xFF, 0x0C, 0x20, + 0x2E, 0x01, 0x26, 0x2D, 0x0C, 0x30, 0x10, 0x03, 0x26, 0x3D, 0x04, 0x44, 0x8B, 0xE0, 0x03, 0x00, + 0x58, 0xC1, 0x7C, 0x00, 0x58, 0x81, 0x6C, 0x00, 0x2C, 0x10, 0x8C, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x14, 0x0C, 0x20, 0x70, 0x12, 0x04, 0x30, 0x0C, 0x40, 0x3C, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xB2, 0x12, 0x14, 0x31, 0x0C, 0x40, 0x3C, 0x00, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, 0x0C, 0x70, 0x00, 0x10, 0xA9, 0x07, 0x1E, 0x00, 0xA9, 0x07, + 0x0C, 0x03, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x44, 0x03, 0xD9, 0xC1, 0x34, 0x03, + 0x38, 0xD0, 0x40, 0x16, 0xD9, 0x81, 0x24, 0x03, 0x0C, 0xE0, 0x00, 0x10, 0x18, 0xCD, 0x5C, 0x00, + 0xA9, 0x0E, 0x00, 0x03, 0x18, 0x3D, 0x48, 0x00, 0x28, 0x2E, 0x08, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x23, 0x22, 0xA9, 0x2E, 0x02, 0x03, 0x28, 0x7D, + 0x4A, 0x00, 0xC6, 0x27, 0xB2, 0x03, 0xA9, 0x7E, 0x02, 0x03, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, + 0x10, 0x00, 0x82, 0x08, 0x18, 0x7D, 0x64, 0x00, 0x36, 0xC7, 0xC4, 0xC0, 0x12, 0x02, 0x04, 0xC1, + 0x13, 0xCC, 0x0C, 0x20, 0xE0, 0x02, 0x26, 0x21, 0x04, 0x30, 0x04, 0x4A, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x40, 0x02, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x0C, 0x20, 0x40, 0x02, 0x26, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x78, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0x20, 0xB8, 0x02, 0x0C, 0x40, 0x28, 0x00, 0x26, 0x21, 0x04, 0x30, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x2E, 0x08, 0x00, 0xA9, 0x0E, 0xAC, 0x02, 0x06, 0x3C, 0xAB, 0x9A, + 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9E, 0x00, 0x00, 0x28, 0x7E, 0x0E, 0x00, 0x04, 0x60, + 0x26, 0x27, 0xA9, 0x2E, 0xAE, 0x02, 0xB9, 0x61, 0xEC, 0x02, 0x06, 0x86, 0x04, 0xA1, 0x06, 0xD6, + 0x06, 0x78, 0x57, 0x71, 0x26, 0x7E, 0xB9, 0x71, 0x10, 0x03, 0x04, 0xC0, 0x38, 0x71, 0xEC, 0x02, + 0x26, 0x7C, 0x23, 0x77, 0x0C, 0x60, 0x80, 0x02, 0xB9, 0x71, 0xF0, 0x02, 0x26, 0x77, 0x26, 0x76, + 0x70, 0x77, 0x28, 0x6E, 0x02, 0x03, 0xC6, 0x76, 0x02, 0x06, 0x28, 0x6E, 0x00, 0x03, 0x24, 0x61, + 0xA9, 0x6E, 0x00, 0x03, 0x0C, 0x40, 0xAE, 0x02, 0x26, 0x4E, 0x70, 0x44, 0xC6, 0x74, 0xB9, 0x41, + 0xF4, 0x02, 0x0A, 0xE7, 0x00, 0x00, 0x06, 0x7C, 0x57, 0x71, 0x04, 0xB0, 0x26, 0x7E, 0xB9, 0x71, + 0x0C, 0x03, 0xB9, 0xB1, 0xF8, 0x02, 0xB9, 0xB1, 0xFC, 0x02, 0xB9, 0xB1, 0x00, 0x03, 0x06, 0x6B, + 0xB9, 0xB1, 0x04, 0x03, 0x06, 0x5B, 0x38, 0x91, 0xF0, 0x02, 0x38, 0x21, 0xF4, 0x02, 0x23, 0x7B, + 0x26, 0x97, 0x23, 0x99, 0x2F, 0x49, 0x09, 0x00, 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x4F, 0x70, 0x44, + 0xC6, 0x42, 0x0A, 0x8A, 0x00, 0x00, 0x13, 0x3D, 0xB9, 0x31, 0x08, 0x03, 0x38, 0xF1, 0x08, 0x03, + 0x36, 0x42, 0x2F, 0x39, 0x01, 0x00, 0x38, 0x21, 0x0C, 0x03, 0x91, 0xF3, 0x06, 0x3B, 0x57, 0x31, + 0x26, 0x32, 0x38, 0x33, 0x24, 0x00, 0xB9, 0x51, 0x14, 0x03, 0x06, 0x24, 0xB9, 0x61, 0x18, 0x03, + 0xB9, 0x71, 0x20, 0x03, 0xB9, 0x41, 0x1C, 0x03, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x31, 0xF8, 0x02, + 0x38, 0xF1, 0x10, 0x03, 0x38, 0x41, 0x1C, 0x03, 0x26, 0x32, 0xB9, 0x31, 0xF8, 0x02, 0x38, 0x3F, + 0xA4, 0x00, 0x06, 0x24, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x31, 0xFC, 0x02, 0x38, 0xF1, 0x00, 0x03, + 0x38, 0x41, 0x1C, 0x03, 0x38, 0x71, 0x20, 0x03, 0x38, 0x51, 0x14, 0x03, 0x38, 0x61, 0x18, 0x03, + 0xC4, 0x80, 0x26, 0x32, 0x26, 0xF4, 0x24, 0x71, 0xB9, 0x31, 0xFC, 0x02, 0xB9, 0xF1, 0x00, 0x03, + 0x23, 0x77, 0x82, 0x45, 0xC4, 0x50, 0x14, 0x4D, 0x26, 0x41, 0x26, 0x49, 0x92, 0x14, 0x90, 0x44, + 0x92, 0x0F, 0xC4, 0xC0, 0x82, 0x08, 0x14, 0x4E, 0x26, 0x41, 0x26, 0x49, 0x90, 0x44, 0x92, 0x08, + 0xC4, 0xCC, 0x82, 0x35, 0x14, 0x2C, 0x26, 0x21, 0x26, 0x92, 0x90, 0x49, 0x82, 0x30, 0x06, 0xD4, + 0x04, 0x51, 0xF2, 0x2D, 0x90, 0x44, 0x82, 0x04, 0xC6, 0x4D, 0x9A, 0x88, 0x01, 0x00, 0xC4, 0xC0, + 0x82, 0x0B, 0x14, 0x4E, 0x26, 0x41, 0x26, 0x49, 0x90, 0x44, 0x82, 0x04, 0xC6, 0x4D, 0x9A, 0x7E, + 0x01, 0x00, 0xC4, 0xCC, 0x82, 0x09, 0x14, 0x3C, 0x26, 0x31, 0x26, 0x93, 0x90, 0x49, 0x82, 0x04, + 0xC6, 0x4D, 0x9A, 0x74, 0x01, 0x00, 0xB8, 0x41, 0x04, 0x03, 0x82, 0x11, 0xC4, 0x64, 0xD2, 0x0F, + 0xC4, 0xD4, 0xD2, 0x0D, 0xC6, 0xD6, 0x0C, 0x40, 0xE0, 0x02, 0x26, 0x41, 0xC2, 0x04, 0x26, 0x4D, + 0x91, 0x64, 0xF2, 0x05, 0x38, 0xF1, 0x08, 0x03, 0x26, 0x46, 0x91, 0xF4, 0x24, 0xC1, 0xC4, 0xCD, + 0x24, 0xB1, 0x9A, 0x6A, 0xFF, 0xFF, 0x14, 0x61, 0x26, 0x6A, 0xC4, 0x68, 0xD2, 0x3A, 0xC4, 0x50, + 0x92, 0x03, 0x06, 0xDA, 0x24, 0xA1, 0x38, 0x21, 0xF0, 0x02, 0xB9, 0x71, 0x20, 0x03, 0x06, 0x47, + 0x26, 0x21, 0x33, 0x3D, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x14, 0x51, 0x26, 0x5D, 0x2F, 0x65, + 0x05, 0x00, 0x26, 0x65, 0x57, 0x61, 0x26, 0x61, 0x38, 0x46, 0x40, 0x02, 0x38, 0x21, 0xF8, 0x02, + 0x38, 0x31, 0xFC, 0x02, 0x38, 0xF1, 0x00, 0x03, 0x38, 0x71, 0x20, 0x03, 0x26, 0x42, 0xB9, 0x46, + 0x40, 0x02, 0x38, 0x46, 0x44, 0x02, 0x57, 0x51, 0x26, 0x43, 0xB9, 0x46, 0x44, 0x02, 0x38, 0x46, + 0x48, 0x02, 0x26, 0x4F, 0xB9, 0x46, 0x48, 0x02, 0x2F, 0x65, 0x01, 0x00, 0x28, 0x56, 0xB8, 0x02, + 0x99, 0x86, 0xBB, 0x02, 0x26, 0x75, 0xA9, 0x76, 0xB8, 0x02, 0x04, 0x71, 0x99, 0x76, 0xBA, 0x02, + 0x24, 0xC1, 0xC4, 0xCC, 0x0A, 0xFC, 0xFE, 0xFF, 0x38, 0x71, 0xEC, 0x02, 0x24, 0x81, 0x24, 0x7D, + 0xCC, 0x80, 0x13, 0x00, 0x23, 0x77, 0xB9, 0x71, 0xEC, 0x02, 0x9A, 0xEB, 0xFE, 0xFF, 0x14, 0x91, + 0x26, 0x9A, 0xC4, 0x99, 0xC2, 0x0B, 0x18, 0x8E, 0x04, 0x00, 0x28, 0xBE, 0x1E, 0x00, 0x06, 0xCE, + 0x0C, 0xD0, 0x70, 0x12, 0x04, 0xA0, 0xFA, 0xF2, 0x00, 0x00, 0x14, 0xB2, 0x26, 0xBA, 0x2F, 0xDB, + 0x0B, 0x00, 0x06, 0xCA, 0x26, 0xDB, 0x0C, 0x20, 0x40, 0x02, 0x57, 0xC1, 0x57, 0xD1, 0x26, 0x21, + 0x26, 0xC1, 0x0C, 0x70, 0xAC, 0x02, 0x06, 0x89, 0x26, 0xD2, 0x2C, 0xC0, 0xB0, 0x02, 0x26, 0x71, + 0xC4, 0x80, 0x82, 0x45, 0x0C, 0x60, 0xE0, 0x02, 0x26, 0x61, 0x26, 0x68, 0x10, 0x66, 0x34, 0x61, + 0x13, 0x56, 0xC4, 0x59, 0xD2, 0x38, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x56, 0x57, 0x51, 0x26, 0x51, + 0x30, 0x3D, 0x38, 0x45, 0x40, 0x02, 0x57, 0x61, 0x26, 0x43, 0xB9, 0x45, 0x40, 0x02, 0x38, 0x3D, + 0x04, 0x00, 0x38, 0x45, 0x44, 0x02, 0x26, 0x61, 0x26, 0x43, 0xB9, 0x45, 0x44, 0x02, 0x38, 0x3D, + 0x08, 0x00, 0x38, 0x45, 0x48, 0x02, 0x06, 0x2D, 0x26, 0x43, 0xB9, 0x45, 0x48, 0x02, 0x20, 0x4C, + 0x28, 0x56, 0xB8, 0x02, 0x04, 0x3C, 0x26, 0x54, 0xA9, 0x56, 0xB8, 0x02, 0x3F, 0x4D, 0x07, 0x00, + 0x26, 0x3D, 0xB9, 0x71, 0x20, 0x03, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x0C, 0x40, 0xDC, 0x02, + 0x04, 0x34, 0x26, 0x41, 0x06, 0x2C, 0x26, 0x3C, 0x36, 0x4C, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, + 0x38, 0x71, 0x20, 0x03, 0x34, 0x81, 0x34, 0xDC, 0x34, 0xC4, 0xF2, 0xBB, 0x0C, 0x70, 0xE0, 0x02, + 0x26, 0x71, 0x26, 0x7B, 0x06, 0x6A, 0xC4, 0x61, 0x82, 0x1C, 0x98, 0x57, 0x01, 0x00, 0x82, 0x16, + 0x90, 0x57, 0x82, 0x14, 0x06, 0x56, 0xC6, 0x59, 0xD2, 0x0E, 0x0C, 0x40, 0xE0, 0x02, 0x26, 0x41, + 0x26, 0x45, 0x18, 0x27, 0x01, 0x00, 0x10, 0x34, 0xC6, 0x23, 0x92, 0x03, 0x10, 0x37, 0x91, 0x34, + 0x24, 0x51, 0xF2, 0xF2, 0x10, 0x57, 0x99, 0x57, 0x01, 0x00, 0x34, 0x61, 0x34, 0x71, 0xF2, 0xE4, + 0x06, 0x76, 0xC6, 0x7A, 0x8A, 0x79, 0xFF, 0xFF, 0x0C, 0x50, 0xE0, 0x02, 0x26, 0x51, 0x26, 0x57, + 0x90, 0x45, 0x92, 0x03, 0x91, 0x65, 0x24, 0x61, 0x24, 0x71, 0xF2, 0xF4, 0x18, 0x7C, 0xBD, 0x01, + 0x0C, 0x30, 0xE0, 0x02, 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, 0x57, 0x61, 0x26, 0x76, 0x18, 0x6C, + 0xBC, 0x01, 0x26, 0x31, 0x26, 0x76, 0x26, 0x71, 0x10, 0x77, 0x26, 0x73, 0x10, 0x57, 0x14, 0x71, + 0x26, 0x75, 0xB3, 0x77, 0x22, 0x50, 0x06, 0x67, 0x57, 0x61, 0x26, 0x61, 0x28, 0x46, 0xB8, 0x02, + 0x99, 0x5D, 0x0A, 0x00, 0x2F, 0x35, 0x05, 0x00, 0x2F, 0x65, 0x03, 0x00, 0x26, 0x66, 0x2F, 0xF6, + 0x0E, 0x00, 0xA9, 0x4D, 0x08, 0x00, 0x04, 0x61, 0x2F, 0x26, 0x0F, 0x00, 0xE8, 0x22, 0xB2, 0x02, + 0x32, 0x40, 0x26, 0x53, 0x26, 0x55, 0x26, 0x5E, 0x26, 0x65, 0x99, 0xA6, 0xB2, 0x02, 0x18, 0x65, + 0xB2, 0x02, 0x24, 0x61, 0x99, 0x65, 0xB2, 0x02, 0x13, 0x64, 0xC6, 0xB6, 0xA9, 0x6C, 0xC2, 0x01, + 0x06, 0x5B, 0xB2, 0x02, 0x06, 0x56, 0x23, 0xB5, 0x2F, 0x57, 0x07, 0x00, 0x2F, 0x67, 0x05, 0x00, + 0x57, 0x61, 0x26, 0x61, 0xB8, 0x96, 0x48, 0x02, 0x92, 0x02, 0x04, 0x91, 0x26, 0x75, 0x57, 0x71, + 0x26, 0x71, 0x38, 0x27, 0x40, 0x02, 0xB9, 0x97, 0x48, 0x02, 0x06, 0x39, 0xB9, 0x71, 0x20, 0x03, + 0x0B, 0x9E, 0x00, 0x00, 0x04, 0x3A, 0x0B, 0x9E, 0x00, 0x00, 0xB1, 0x2D, 0x38, 0x71, 0x20, 0x03, + 0x06, 0x39, 0x38, 0x27, 0x44, 0x02, 0x0B, 0x9E, 0x00, 0x00, 0x04, 0x3A, 0x0B, 0x9E, 0x00, 0x00, + 0xB9, 0x2D, 0x04, 0x00, 0x24, 0xA1, 0x24, 0xC8, 0x24, 0xDC, 0xC6, 0xA8, 0x22, 0x98, 0xF2, 0x05, + 0x24, 0x61, 0xC4, 0x66, 0x92, 0xBA, 0xF2, 0xC9, 0xA9, 0xBE, 0x1E, 0x00, 0x58, 0xC1, 0x34, 0x03, + 0x58, 0x81, 0x24, 0x03, 0x2C, 0x10, 0x44, 0x03, 0xE1, 0xF0, 0x06, 0x64, 0x04, 0x41, 0xB9, 0x41, + 0x04, 0x03, 0xFA, 0x8D, 0xFE, 0xFF, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, 0xF0, 0x11, 0x04, 0x30, + 0x0C, 0x40, 0x80, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x1C, 0x60, 0xFA, 0x00, + 0x0C, 0x70, 0x00, 0x10, 0xA9, 0x67, 0x68, 0x02, 0xA9, 0x67, 0x6A, 0x02, 0x18, 0x50, 0x63, 0x16, + 0x0C, 0x60, 0x1E, 0x00, 0xC4, 0x50, 0x82, 0x03, 0x0C, 0x60, 0x32, 0x00, 0x30, 0xF1, 0x99, 0x67, + 0x6D, 0x02, 0x99, 0x07, 0x6E, 0x02, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, + 0xBC, 0x11, 0x04, 0x30, 0x0C, 0x40, 0x28, 0x00, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x30, 0xF1, 0x99, 0x00, 0x04, 0x10, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x2F, 0x75, 0x05, 0x00, + 0x26, 0x75, 0x57, 0x71, 0x26, 0x75, 0x3C, 0x10, 0x14, 0x00, 0x34, 0x51, 0xD9, 0xC1, 0x04, 0x00, + 0x2F, 0xE4, 0x07, 0x00, 0x2F, 0x75, 0x05, 0x00, 0x26, 0x75, 0x57, 0x71, 0x26, 0x75, 0x26, 0x74, + 0x26, 0x77, 0x34, 0x72, 0x26, 0xEE, 0x26, 0xE3, 0xB1, 0xB1, 0x26, 0x37, 0x34, 0x41, 0x04, 0x70, + 0x06, 0xF3, 0x04, 0x60, 0x2F, 0xD7, 0x05, 0x00, 0xCC, 0xD0, 0x12, 0x00, 0xD2, 0x09, 0x2F, 0xC6, + 0x04, 0x00, 0xC4, 0xCC, 0xD2, 0x05, 0x70, 0xBF, 0x70, 0xCE, 0xC6, 0xBC, 0x12, 0x0E, 0x24, 0x61, + 0xC4, 0x63, 0x24, 0xF2, 0x92, 0xF2, 0x24, 0x71, 0xC4, 0x73, 0x2C, 0x30, 0x1A, 0x00, 0x92, 0xE9, + 0x70, 0x7E, 0xB1, 0x72, 0x04, 0x21, 0xF2, 0x02, 0x04, 0x20, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, + 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x50, 0x01, 0x0C, 0x20, 0x9E, 0x00, + 0x26, 0x21, 0x04, 0x30, 0x04, 0x44, 0xD9, 0xC1, 0x40, 0x01, 0xD9, 0x81, 0x30, 0x01, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x49, 0x00, 0x0C, 0xF0, 0x2C, 0x01, + 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x0C, 0x70, 0xFF, 0x0F, 0xA9, 0x7E, 0x08, 0x00, 0x04, 0x7E, + 0x26, 0x7E, 0x20, 0x77, 0xA9, 0x0E, 0x0A, 0x00, 0x0C, 0x80, 0x2C, 0x01, 0xB9, 0x71, 0xE0, 0x00, + 0x18, 0x70, 0x57, 0x16, 0xA9, 0x0E, 0x0C, 0x00, 0xA9, 0x0E, 0xB0, 0x02, 0xC4, 0x70, 0xB9, 0x81, + 0xD4, 0x00, 0x92, 0x09, 0x38, 0x70, 0x40, 0x16, 0x0C, 0xF0, 0x26, 0x00, 0x26, 0xF7, 0x20, 0x7F, + 0xB9, 0x71, 0xD4, 0x00, 0x38, 0x71, 0xD4, 0x00, 0x28, 0xDE, 0xEE, 0x01, 0x38, 0xC0, 0x40, 0x16, + 0x26, 0xD7, 0x23, 0xDD, 0x0C, 0x70, 0x2C, 0x00, 0xA9, 0xDE, 0xE4, 0x01, 0x26, 0x7C, 0x20, 0x77, + 0x04, 0x3D, 0xB9, 0x71, 0xEC, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x5C, 0x20, + 0xFF, 0x01, 0x8B, 0xA4, 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2A, 0x92, 0x06, 0x28, 0x7C, + 0x2E, 0x00, 0x26, 0xD7, 0xA9, 0xDE, 0xE4, 0x01, 0x6B, 0xBD, 0x00, 0x00, 0x38, 0xD0, 0x40, 0x16, + 0x28, 0x3D, 0xD8, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9E, 0x00, 0x00, + 0x30, 0x7D, 0xB9, 0x21, 0xF0, 0x00, 0x0C, 0x60, 0x00, 0x40, 0xD6, 0x67, 0x82, 0x06, 0x0C, 0x60, + 0x80, 0x0B, 0xB9, 0x61, 0xCC, 0x00, 0xF2, 0x05, 0x0C, 0xB0, 0x80, 0x02, 0xB9, 0xB1, 0xCC, 0x00, + 0xDC, 0x70, 0x00, 0x80, 0x82, 0x04, 0x0C, 0x70, 0x80, 0x0B, 0xF2, 0x03, 0x0C, 0x70, 0x80, 0x02, + 0x04, 0x80, 0xB9, 0x81, 0xA8, 0x00, 0xB9, 0x81, 0xB0, 0x00, 0xB9, 0x81, 0xD0, 0x00, 0x0C, 0x80, + 0x4C, 0x00, 0x26, 0x81, 0xB9, 0x71, 0xDC, 0x00, 0x34, 0x82, 0x06, 0x97, 0x0C, 0x90, 0x9C, 0x10, + 0xB9, 0x81, 0x18, 0x01, 0x38, 0x71, 0xA8, 0x00, 0x38, 0x81, 0xA8, 0x00, 0x06, 0xB7, 0x26, 0x77, + 0x26, 0x7B, 0x57, 0x71, 0x26, 0x7B, 0x23, 0x77, 0x43, 0x88, 0xB9, 0x71, 0x0C, 0x01, 0x04, 0x71, + 0x06, 0x6B, 0xB9, 0x81, 0xAC, 0x00, 0x06, 0x87, 0x53, 0x8B, 0x34, 0x61, 0x06, 0xB7, 0x53, 0xB6, + 0x38, 0x61, 0xA8, 0x00, 0xB9, 0x81, 0xF8, 0x00, 0x06, 0x87, 0x34, 0x62, 0x53, 0x86, 0x38, 0x61, + 0xA8, 0x00, 0xB9, 0xB1, 0xFC, 0x00, 0x38, 0xB1, 0xA8, 0x00, 0xB9, 0x81, 0x00, 0x01, 0x24, 0x62, + 0x26, 0xB7, 0x06, 0x87, 0x53, 0x76, 0xB9, 0x71, 0x08, 0x01, 0x53, 0x8B, 0xB9, 0xB1, 0xD8, 0x00, + 0x0C, 0x70, 0x1C, 0x10, 0x04, 0xB0, 0xB9, 0x81, 0x04, 0x01, 0xB9, 0x71, 0xC0, 0x00, 0xB9, 0xB1, + 0xC4, 0x00, 0x38, 0xB1, 0xC4, 0x00, 0x38, 0xA1, 0x0C, 0x01, 0x26, 0xAB, 0x23, 0xAA, 0x2F, 0x6A, + 0x0A, 0x00, 0x0C, 0x70, 0x80, 0x02, 0x26, 0x76, 0x70, 0x57, 0x38, 0x70, 0x40, 0x16, 0x43, 0xDB, + 0x28, 0x77, 0x5E, 0x00, 0x43, 0xCA, 0xC6, 0x57, 0x02, 0x06, 0x28, 0x7E, 0xB0, 0x02, 0x24, 0x71, + 0xA9, 0x7E, 0xB0, 0x02, 0xE7, 0xC1, 0x26, 0xC1, 0x10, 0x7C, 0x04, 0xB7, 0x56, 0xBA, 0x63, 0x7B, + 0xD4, 0x71, 0x9A, 0xA1, 0x04, 0x00, 0x38, 0x71, 0xAC, 0x00, 0xCC, 0x70, 0x12, 0x00, 0x82, 0x0C, + 0xC4, 0xDA, 0x12, 0x15, 0x04, 0x8B, 0x0C, 0x70, 0x12, 0x00, 0xB9, 0x81, 0xBC, 0x00, 0xB9, 0x71, + 0xB4, 0x00, 0x04, 0x82, 0xF2, 0x14, 0x04, 0x7D, 0xB9, 0x71, 0xBC, 0x00, 0x0C, 0x80, 0x13, 0x00, + 0x04, 0x71, 0xB9, 0x81, 0xB4, 0x00, 0xB9, 0x71, 0xB8, 0x00, 0xF2, 0x0B, 0x04, 0x8D, 0x0C, 0x70, + 0x13, 0x00, 0xB9, 0x81, 0xBC, 0x00, 0xB9, 0x71, 0xB4, 0x00, 0x04, 0x81, 0xB9, 0x81, 0xB8, 0x00, + 0x06, 0x73, 0x0C, 0x70, 0x80, 0x0B, 0x26, 0x67, 0x38, 0x81, 0xF0, 0x00, 0x70, 0x76, 0x43, 0x68, + 0xC6, 0x76, 0x2A, 0x71, 0x04, 0x00, 0x38, 0x81, 0xB8, 0x00, 0xC4, 0x81, 0x92, 0x08, 0x38, 0x81, + 0xEC, 0x00, 0x43, 0x68, 0xC6, 0x76, 0x2A, 0x67, 0x04, 0x00, 0xF2, 0x06, 0x78, 0x6E, 0xE4, 0x01, + 0xC6, 0x67, 0x1A, 0x61, 0x04, 0x00, 0x38, 0x51, 0xAC, 0x00, 0xB9, 0x01, 0xA4, 0x00, 0x0C, 0x20, + 0xA4, 0x00, 0x26, 0x21, 0x0C, 0x30, 0x80, 0x0B, 0x06, 0x4D, 0x6B, 0x3E, 0x02, 0x00, 0xC4, 0x20, + 0x8A, 0x52, 0x04, 0x00, 0x38, 0x71, 0xA4, 0x00, 0x28, 0x6E, 0x0C, 0x00, 0xC6, 0x76, 0x22, 0x09, + 0xA9, 0x7E, 0x0C, 0x00, 0x18, 0x7E, 0x04, 0x00, 0x24, 0x71, 0x13, 0x77, 0xB9, 0x71, 0xD0, 0x00, + 0x10, 0x5C, 0x04, 0x71, 0x06, 0x67, 0x53, 0x6B, 0xC4, 0xDC, 0x66, 0x65, 0x91, 0x6C, 0x82, 0x0B, + 0x06, 0x57, 0x26, 0x5A, 0x06, 0x65, 0xE7, 0x61, 0x26, 0x61, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, + 0x66, 0x75, 0x91, 0x76, 0x38, 0xB1, 0xAC, 0x00, 0xCC, 0xB0, 0x12, 0x00, 0x82, 0x2A, 0x04, 0x7D, + 0x26, 0x7A, 0x06, 0x57, 0xE7, 0x51, 0x04, 0x67, 0x56, 0x67, 0x26, 0x51, 0x04, 0x71, 0x10, 0x45, + 0x06, 0xF7, 0x53, 0xF6, 0x06, 0x6F, 0xC4, 0xD0, 0x66, 0x64, 0x91, 0x65, 0x92, 0x0E, 0x04, 0x7E, + 0x26, 0x7A, 0x06, 0x67, 0xE7, 0x61, 0x04, 0x57, 0x56, 0x57, 0x26, 0x61, 0x04, 0x71, 0x53, 0x75, + 0x10, 0x56, 0x66, 0x75, 0x91, 0x76, 0xF2, 0x0D, 0x04, 0x5C, 0x26, 0x5A, 0x06, 0x65, 0xE7, 0x61, + 0x26, 0x61, 0x54, 0x57, 0x53, 0x75, 0x10, 0x56, 0xC4, 0xDC, 0x66, 0x75, 0x91, 0x76, 0x92, 0xE8, + 0x38, 0x41, 0xA8, 0x00, 0x38, 0x51, 0xC4, 0x00, 0x13, 0x44, 0x13, 0x55, 0xB9, 0x41, 0xE4, 0x00, + 0x0C, 0xF0, 0x78, 0x00, 0x04, 0x20, 0x0C, 0xD0, 0x4C, 0x00, 0x34, 0x41, 0xB9, 0x51, 0xE8, 0x00, + 0x34, 0x51, 0x26, 0xF1, 0x0C, 0x60, 0xFF, 0xFF, 0x26, 0xD1, 0x06, 0x32, 0xB9, 0x41, 0x10, 0x01, + 0xB9, 0x51, 0x14, 0x01, 0x38, 0x71, 0x10, 0x01, 0x06, 0xCF, 0x26, 0x76, 0x33, 0x77, 0x2F, 0x57, + 0x07, 0x00, 0x26, 0x57, 0x57, 0x51, 0x26, 0x57, 0x23, 0x55, 0xB9, 0x51, 0xF4, 0x00, 0x06, 0x4D, + 0x0C, 0x50, 0xFF, 0xFF, 0x38, 0x81, 0x14, 0x01, 0xC4, 0x70, 0x26, 0x85, 0x33, 0x88, 0x22, 0x0B, + 0x38, 0xB1, 0xB4, 0x00, 0xC6, 0x7B, 0x32, 0x07, 0xC4, 0x80, 0x22, 0x05, 0x38, 0xB1, 0xBC, 0x00, + 0xC6, 0x8B, 0x22, 0x03, 0xA1, 0x04, 0xF2, 0x2C, 0x38, 0xB1, 0xF4, 0x00, 0x26, 0x8B, 0x38, 0xB1, + 0xCC, 0x00, 0x23, 0x88, 0x26, 0x88, 0x26, 0xB8, 0x20, 0xBB, 0xB9, 0x81, 0x2C, 0x01, 0x06, 0x8B, + 0x38, 0xB1, 0xE0, 0x00, 0x36, 0x8B, 0xB9, 0x81, 0xC8, 0x00, 0x06, 0xB8, 0xC3, 0x88, 0x32, 0x02, + 0x04, 0xB0, 0xC4, 0x62, 0x43, 0x8B, 0xB9, 0x81, 0xC8, 0x00, 0xA1, 0xB4, 0xD2, 0x11, 0xC4, 0x52, + 0xD2, 0x0F, 0x38, 0xB1, 0xDC, 0x00, 0x38, 0x81, 0x2C, 0x01, 0x24, 0x31, 0x26, 0x8B, 0x20, 0xB8, + 0x38, 0x81, 0xE0, 0x00, 0x36, 0xB8, 0xA1, 0xBC, 0x38, 0xB1, 0xC8, 0x00, 0x26, 0x2B, 0x24, 0x51, + 0x23, 0x55, 0xC4, 0x54, 0x24, 0x42, 0x24, 0xC2, 0x92, 0xBE, 0x24, 0x61, 0x23, 0x66, 0xC4, 0x64, + 0x24, 0xDA, 0x24, 0xF6, 0x92, 0xA8, 0x98, 0x70, 0x56, 0x16, 0x92, 0x1A, 0x34, 0x31, 0xC4, 0x30, + 0x12, 0x02, 0x04, 0x31, 0x38, 0x71, 0xB8, 0x00, 0xC4, 0x71, 0x92, 0x12, 0x38, 0xC0, 0x40, 0x16, + 0x0B, 0x9E, 0x00, 0x00, 0x78, 0xD1, 0x64, 0x00, 0x28, 0x7C, 0x38, 0x00, 0x3F, 0x22, 0x0D, 0x00, + 0xC6, 0x27, 0xB2, 0x06, 0x28, 0x7C, 0x3A, 0x00, 0xC6, 0xD7, 0x2A, 0x75, 0x03, 0x00, 0x38, 0x70, + 0x40, 0x16, 0x78, 0x21, 0x88, 0x00, 0x28, 0x37, 0x36, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0xB8, 0x00, 0x43, 0x22, 0xC4, 0x71, 0x92, 0x36, + 0x06, 0x76, 0x0C, 0x70, 0x44, 0x16, 0x20, 0x67, 0x28, 0xF7, 0x02, 0x00, 0x28, 0xD7, 0x04, 0x00, + 0x28, 0xC7, 0x06, 0x00, 0x28, 0xB7, 0x08, 0x00, 0xB9, 0x61, 0xB4, 0x00, 0x0C, 0x40, 0x4C, 0x00, + 0x26, 0x41, 0x0C, 0x30, 0x1C, 0x00, 0x26, 0x3A, 0x24, 0x48, 0x04, 0x50, 0x1C, 0xA0, 0x32, 0x00, + 0x2F, 0x75, 0x03, 0x00, 0x04, 0x60, 0x38, 0x81, 0xB4, 0x00, 0xC6, 0x78, 0x82, 0x0D, 0xC6, 0x7F, + 0x82, 0x0B, 0xC6, 0x7D, 0x82, 0x09, 0xC6, 0x7C, 0x82, 0x07, 0xC6, 0x7B, 0x82, 0x05, 0x2F, 0x86, + 0x04, 0x00, 0xA9, 0x08, 0x28, 0x00, 0x34, 0x6A, 0xC6, 0x6A, 0x34, 0x71, 0x92, 0xED, 0x34, 0x5D, + 0x1C, 0x60, 0x41, 0x00, 0xC6, 0x56, 0x34, 0x42, 0x92, 0xE4, 0x78, 0x71, 0x64, 0x00, 0x28, 0x6E, + 0x08, 0x00, 0xB9, 0x71, 0xA4, 0x00, 0xC6, 0x67, 0x02, 0x03, 0xA9, 0x7E, 0x08, 0x00, 0x28, 0x6E, + 0x0A, 0x00, 0xC6, 0x67, 0x32, 0x03, 0xA9, 0x7E, 0x0A, 0x00, 0x38, 0x71, 0xB0, 0x00, 0x38, 0x81, + 0xF8, 0x00, 0xB8, 0xB1, 0xAC, 0x00, 0x66, 0x78, 0xB9, 0x71, 0xB0, 0x00, 0x82, 0x12, 0x38, 0x81, + 0xFC, 0x00, 0xC4, 0xB1, 0x66, 0x78, 0xB9, 0x71, 0xB0, 0x00, 0x82, 0x0B, 0x38, 0xB1, 0x00, 0x01, + 0x66, 0x7B, 0xB9, 0x71, 0xB0, 0x00, 0x38, 0x71, 0xAC, 0x00, 0xCC, 0x70, 0x12, 0x00, 0x82, 0x12, + 0x38, 0x71, 0xAC, 0x00, 0x38, 0x81, 0xB0, 0x00, 0x38, 0xB1, 0x04, 0x01, 0xCC, 0x70, 0x11, 0x00, + 0x66, 0x8B, 0xB9, 0x81, 0xB0, 0x00, 0x82, 0x06, 0x38, 0xB1, 0x08, 0x01, 0x66, 0x8B, 0xB9, 0x81, + 0xB0, 0x00, 0x18, 0x7E, 0x04, 0x00, 0x78, 0x61, 0x86, 0x00, 0x38, 0x41, 0xE8, 0x00, 0x38, 0x51, + 0xE4, 0x00, 0xD7, 0x71, 0xC6, 0x62, 0x26, 0x7E, 0x99, 0x47, 0xBC, 0x01, 0x99, 0x57, 0xBD, 0x01, + 0x04, 0x72, 0x12, 0x0A, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x12, 0x06, 0x78, 0x61, 0x8C, 0x00, + 0xC6, 0x62, 0x12, 0x02, 0x04, 0x70, 0x78, 0x61, 0x8A, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, + 0x84, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x90, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x74, + 0x78, 0x61, 0x82, 0x00, 0xC6, 0x62, 0x12, 0x09, 0x78, 0x61, 0x80, 0x00, 0xC6, 0x62, 0x12, 0x05, + 0x78, 0x61, 0x84, 0x00, 0xC6, 0x62, 0x02, 0x02, 0x64, 0x78, 0x78, 0x61, 0x8E, 0x00, 0xC6, 0x62, + 0x12, 0x09, 0x78, 0x61, 0x8C, 0x00, 0xC6, 0x62, 0x12, 0x05, 0x78, 0x61, 0x90, 0x00, 0xC6, 0x62, + 0x02, 0x03, 0x6C, 0x70, 0x10, 0x00, 0x0C, 0x60, 0x4C, 0x00, 0x04, 0x42, 0x04, 0x34, 0x04, 0x28, + 0x56, 0x47, 0x56, 0x37, 0x56, 0x27, 0x26, 0x61, 0x0C, 0x50, 0x74, 0x00, 0x5C, 0x70, 0x10, 0x00, + 0x24, 0x68, 0x26, 0x51, 0x13, 0x44, 0x13, 0x33, 0x13, 0x22, 0x13, 0x77, 0xC4, 0x40, 0x92, 0x02, + 0xA1, 0x05, 0xC4, 0x30, 0x92, 0x03, 0xA9, 0x05, 0x08, 0x00, 0xC4, 0x20, 0x92, 0x02, 0xA1, 0x06, + 0xC4, 0x70, 0x92, 0x03, 0xA9, 0x06, 0x28, 0x00, 0x38, 0x81, 0x18, 0x01, 0x34, 0x62, 0xC6, 0x68, + 0x34, 0x5A, 0x92, 0xED, 0x78, 0x31, 0x4E, 0x00, 0x78, 0x41, 0x50, 0x00, 0x78, 0x51, 0x52, 0x00, + 0x78, 0x61, 0x54, 0x00, 0x78, 0x21, 0x4C, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0xB4, 0x00, 0x78, 0x31, 0x76, 0x00, 0x78, 0x41, 0x78, 0x00, 0x78, 0x51, 0x7A, 0x00, 0x78, 0x61, + 0x7C, 0x00, 0x78, 0x21, 0x74, 0x00, 0x0C, 0xD0, 0x00, 0x10, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, + 0xB9, 0x21, 0xBC, 0x00, 0x78, 0x31, 0x58, 0x00, 0x78, 0x41, 0x5A, 0x00, 0x78, 0x51, 0x5C, 0x00, + 0x78, 0x61, 0x5E, 0x00, 0x78, 0x21, 0x56, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x78, 0x31, + 0x62, 0x00, 0x78, 0x41, 0x64, 0x00, 0x78, 0x51, 0x66, 0x00, 0x78, 0x61, 0x68, 0x00, 0x06, 0xA2, + 0x78, 0x21, 0x60, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xC2, 0x78, 0x31, 0x6C, 0x00, + 0x78, 0x21, 0x6A, 0x00, 0x78, 0x41, 0x6E, 0x00, 0x78, 0x51, 0x70, 0x00, 0x78, 0x61, 0x72, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xF8, 0x7D, 0x6A, 0x02, 0x06, 0xB2, 0x32, 0x05, 0x38, 0xF1, + 0xAC, 0x00, 0xA9, 0xFD, 0x6A, 0x02, 0x78, 0x7D, 0x6A, 0x02, 0x38, 0x81, 0xA8, 0x00, 0x14, 0x61, + 0x26, 0x67, 0xC6, 0x68, 0x1A, 0x34, 0x01, 0x00, 0x24, 0x71, 0xC6, 0x78, 0x2A, 0x30, 0x01, 0x00, + 0x98, 0x7D, 0x04, 0x00, 0x9A, 0x27, 0x01, 0x00, 0x18, 0x7D, 0xC0, 0x03, 0xC4, 0x71, 0xDA, 0x22, + 0x01, 0x00, 0x38, 0x71, 0xB8, 0x00, 0xC4, 0x72, 0x9A, 0x1D, 0x01, 0x00, 0x18, 0x70, 0x63, 0x16, + 0x0C, 0x80, 0x1E, 0x00, 0xC4, 0x70, 0x82, 0x03, 0x0C, 0x80, 0x32, 0x00, 0x78, 0x7D, 0x68, 0x02, + 0x06, 0x6C, 0x06, 0x2C, 0x57, 0x63, 0x57, 0x22, 0x26, 0x26, 0x0C, 0x30, 0x64, 0x00, 0xB9, 0x71, + 0x28, 0x01, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0x2A, 0x38, 0x71, 0x28, 0x01, 0x02, 0x07, 0xC6, 0x2B, + 0x02, 0x05, 0x38, 0xF1, 0xAC, 0x00, 0xC6, 0x7F, 0x92, 0x1D, 0x18, 0x7D, 0x6C, 0x02, 0xCC, 0x70, + 0xFF, 0x00, 0x82, 0x04, 0x24, 0x71, 0x99, 0x7D, 0x6C, 0x02, 0x18, 0x7D, 0x6C, 0x02, 0xC4, 0x73, + 0xC2, 0x15, 0x18, 0x7D, 0x6D, 0x02, 0x99, 0x0D, 0x6C, 0x02, 0xC6, 0x78, 0xB2, 0x04, 0x99, 0x8D, + 0x6D, 0x02, 0xF2, 0x0C, 0xCC, 0x70, 0x3E, 0x00, 0xD2, 0x09, 0x24, 0x71, 0x99, 0x7D, 0x6D, 0x02, + 0xF2, 0x05, 0x99, 0x0D, 0x6C, 0x02, 0x99, 0x0D, 0x6D, 0x02, 0x38, 0x71, 0xAC, 0x00, 0xC4, 0x71, + 0x02, 0x2D, 0xB8, 0x29, 0x4C, 0x01, 0x82, 0x20, 0x18, 0x8D, 0x6D, 0x02, 0x06, 0x38, 0xAB, 0x9A, + 0x00, 0x00, 0x06, 0x72, 0x38, 0x21, 0xB4, 0x00, 0xB9, 0x71, 0x28, 0x01, 0x0C, 0x30, 0x40, 0x00, + 0x36, 0x38, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, + 0xB9, 0x29, 0x4C, 0x01, 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x79, 0x4C, 0x01, 0x38, 0x89, 0x4C, 0x01, + 0xB9, 0x81, 0xB4, 0x00, 0xF2, 0x0E, 0xB8, 0x71, 0xB4, 0x00, 0x92, 0x03, 0x04, 0x7A, 0xF2, 0x03, + 0x38, 0x71, 0xB4, 0x00, 0xB9, 0x79, 0x4C, 0x01, 0xF2, 0x04, 0xB8, 0x81, 0xAC, 0x00, 0x82, 0x26, + 0xB8, 0x29, 0x50, 0x01, 0x82, 0x1D, 0x18, 0x8D, 0x6D, 0x02, 0x06, 0x38, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, 0x36, 0x38, 0x06, 0x2A, 0xB9, 0x71, 0x28, 0x01, 0xAB, 0x9A, + 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x29, 0x50, 0x01, + 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x79, 0x50, 0x01, 0x38, 0xA9, 0x50, 0x01, 0xF2, 0x07, 0xC4, 0xA0, + 0x04, 0x7A, 0x82, 0x02, 0x06, 0x7A, 0xB9, 0x79, 0x50, 0x01, 0xB8, 0x29, 0x54, 0x01, 0x82, 0x1E, + 0x18, 0x8D, 0x6D, 0x02, 0x06, 0x38, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, + 0x36, 0x38, 0x06, 0x2C, 0xB9, 0x71, 0x28, 0x01, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, + 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0x82, 0x04, 0xB9, 0x29, 0x54, 0x01, 0xF2, 0x04, 0x04, 0x7A, + 0xB9, 0x79, 0x54, 0x01, 0x38, 0xC9, 0x54, 0x01, 0xF2, 0x07, 0xC4, 0xC0, 0x04, 0x7A, 0x82, 0x02, + 0x06, 0x7C, 0xB9, 0x79, 0x54, 0x01, 0x38, 0x71, 0xAC, 0x00, 0xCC, 0x70, 0x12, 0x00, 0x82, 0x55, + 0xB8, 0x29, 0x58, 0x01, 0x82, 0x1D, 0x18, 0x8D, 0x6D, 0x02, 0x06, 0x38, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x40, 0x00, 0x06, 0x72, 0x36, 0x38, 0x06, 0x2B, 0xB9, 0x71, 0x28, 0x01, 0xAB, 0x9A, + 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, 0x26, 0x27, 0x67, 0x23, 0xC4, 0x20, 0xB9, 0x29, 0x58, 0x01, + 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x79, 0x58, 0x01, 0x38, 0xB9, 0x58, 0x01, 0xF2, 0x07, 0xC4, 0xB0, + 0x04, 0x7A, 0x82, 0x02, 0x06, 0x7B, 0xB9, 0x79, 0x58, 0x01, 0x38, 0x81, 0xAC, 0x00, 0xCC, 0x80, + 0x10, 0x00, 0x12, 0x2B, 0xB8, 0x29, 0x5C, 0x01, 0x82, 0x20, 0x18, 0x8D, 0x6D, 0x02, 0x06, 0x38, + 0xAB, 0x9A, 0x00, 0x00, 0x06, 0x72, 0x38, 0x21, 0xBC, 0x00, 0xB9, 0x71, 0x28, 0x01, 0x0C, 0x30, + 0x40, 0x00, 0x36, 0x38, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, 0x26, 0x27, 0x67, 0x23, + 0xC4, 0x20, 0xB9, 0x29, 0x5C, 0x01, 0x92, 0x04, 0x04, 0x7A, 0xB9, 0x79, 0x5C, 0x01, 0x38, 0x79, + 0x5C, 0x01, 0xB9, 0x71, 0xBC, 0x00, 0xF2, 0x09, 0xB8, 0x81, 0xBC, 0x00, 0x04, 0x7A, 0x82, 0x03, + 0x38, 0x71, 0xBC, 0x00, 0xB9, 0x79, 0x5C, 0x01, 0x38, 0xF1, 0xAC, 0x00, 0xA9, 0xFD, 0x68, 0x02, + 0xF2, 0x0A, 0x38, 0x31, 0xAC, 0x00, 0xA9, 0x3D, 0x68, 0x02, 0xF2, 0x05, 0x38, 0x41, 0xAC, 0x00, + 0xA9, 0x4D, 0x68, 0x02, 0x38, 0x21, 0xB4, 0x00, 0x38, 0x61, 0xBC, 0x00, 0x06, 0x3A, 0x06, 0x4C, + 0x06, 0x5B, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x86, 0x82, 0x92, 0x06, 0x04, 0x7A, 0x04, 0xCA, + 0xA9, 0x71, 0x64, 0x00, 0x06, 0x8C, 0x30, 0x39, 0x38, 0x21, 0xB4, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x39, 0x04, 0x00, 0x06, 0x72, 0x06, 0x2A, 0xB9, 0x71, 0x28, 0x01, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x39, 0x08, 0x00, 0x06, 0xA2, 0x06, 0x2C, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x39, 0x0C, 0x00, + 0x06, 0x42, 0x06, 0x2B, 0xB9, 0x41, 0x20, 0x01, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x39, 0x10, 0x00, + 0x06, 0xC2, 0x38, 0x21, 0xBC, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, 0x38, 0x41, + 0x20, 0x01, 0x06, 0x62, 0x06, 0x5C, 0x06, 0x27, 0x06, 0x3A, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, + 0x06, 0x38, 0x4B, 0xA1, 0x00, 0x00, 0x18, 0x7D, 0x04, 0x00, 0x86, 0x22, 0xD7, 0x71, 0x0C, 0x50, + 0x00, 0x10, 0x26, 0x75, 0x32, 0x02, 0x04, 0x20, 0xA9, 0x27, 0xC0, 0x01, 0x78, 0x31, 0x56, 0x00, + 0x78, 0x41, 0x60, 0x00, 0x78, 0x51, 0x6A, 0x00, 0x78, 0x61, 0x74, 0x00, 0x78, 0x21, 0x4C, 0x00, + 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0x82, 0x78, 0x31, 0x5E, 0x00, 0x78, 0x41, 0x68, 0x00, + 0x78, 0x51, 0x72, 0x00, 0x78, 0x61, 0x7C, 0x00, 0x78, 0x21, 0x54, 0x00, 0x0C, 0xF0, 0xE0, 0x00, + 0xF1, 0xF0, 0x06, 0xB2, 0x78, 0x31, 0x58, 0x00, 0x78, 0x41, 0x62, 0x00, 0x78, 0x51, 0x6C, 0x00, + 0x78, 0x61, 0x76, 0x00, 0x78, 0x21, 0x4E, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0xB9, 0x21, + 0xB8, 0x00, 0x78, 0x31, 0x5A, 0x00, 0x78, 0x41, 0x64, 0x00, 0x78, 0x51, 0x6E, 0x00, 0x78, 0x61, + 0x78, 0x00, 0x78, 0x21, 0x50, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x06, 0xC2, 0x78, 0x31, + 0x5C, 0x00, 0x78, 0x41, 0x66, 0x00, 0x78, 0x51, 0x70, 0x00, 0x78, 0x61, 0x7A, 0x00, 0x78, 0x21, + 0x52, 0x00, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x38, 0x31, 0xB8, 0x00, 0x06, 0xA2, 0x06, 0x4C, + 0x06, 0x28, 0x06, 0x5A, 0x06, 0x6B, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x86, 0x72, 0x92, 0x06, + 0x04, 0x7A, 0xA9, 0x71, 0x64, 0x00, 0x04, 0x7A, 0x06, 0xC7, 0x06, 0x28, 0x38, 0x81, 0xC0, 0x00, + 0x30, 0x38, 0xB9, 0x71, 0x28, 0x01, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0xF1, 0xC0, 0x00, 0x06, 0x82, + 0x38, 0x3F, 0x04, 0x00, 0x38, 0x21, 0xB8, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x41, 0xC0, 0x00, + 0x06, 0x52, 0x38, 0x34, 0x08, 0x00, 0xB9, 0x51, 0x24, 0x01, 0x06, 0x2C, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x61, 0xC0, 0x00, 0x06, 0x42, 0x38, 0x36, 0x0C, 0x00, 0xB9, 0x41, 0x20, 0x01, 0x06, 0x2A, + 0xAB, 0x9A, 0x00, 0x00, 0x06, 0xC2, 0x06, 0x2B, 0x38, 0xB1, 0xC0, 0x00, 0x38, 0x3B, 0x10, 0x00, + 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x51, 0x24, 0x01, 0x38, 0x41, 0x20, 0x01, 0x06, 0x62, 0x06, 0x35, + 0x06, 0x28, 0x06, 0x5C, 0x0C, 0xF0, 0xE0, 0x00, 0xF1, 0xF0, 0x38, 0x71, 0x28, 0x01, 0x06, 0x37, + 0x4B, 0xA1, 0x00, 0x00, 0x18, 0x7D, 0x04, 0x00, 0x86, 0x22, 0x06, 0x67, 0xD7, 0x61, 0x0C, 0xF0, + 0x00, 0x10, 0x26, 0x6F, 0x32, 0x02, 0x04, 0x20, 0x24, 0x71, 0x13, 0x77, 0xC4, 0x74, 0xA9, 0x26, + 0xBE, 0x01, 0x99, 0x7D, 0x04, 0x00, 0xC2, 0x07, 0x04, 0x75, 0x0C, 0x30, 0x00, 0x10, 0x99, 0x73, + 0x04, 0x00, 0xF2, 0x18, 0x38, 0x71, 0xC4, 0x00, 0x38, 0x81, 0xC0, 0x00, 0x24, 0x71, 0xC4, 0x7D, + 0x24, 0x84, 0xB9, 0x71, 0xC4, 0x00, 0xB9, 0x81, 0xC0, 0x00, 0x9A, 0x34, 0xFB, 0xFF, 0x38, 0xB1, + 0xD8, 0x00, 0x24, 0x94, 0xCC, 0xB0, 0x13, 0x00, 0x82, 0x05, 0xB9, 0xB1, 0xA8, 0x00, 0xFA, 0xF3, + 0xFA, 0xFF, 0x78, 0x7E, 0x6A, 0x02, 0x78, 0x6E, 0x68, 0x02, 0x14, 0x51, 0x26, 0x57, 0xC6, 0x56, + 0x12, 0x04, 0x24, 0x71, 0xC6, 0x76, 0x32, 0x07, 0x18, 0x7E, 0x6E, 0x02, 0x24, 0x71, 0x99, 0x7E, + 0x6E, 0x02, 0xF2, 0x03, 0x99, 0x0E, 0x6E, 0x02, 0x38, 0x60, 0x2C, 0x16, 0x14, 0x51, 0xC4, 0x65, + 0x26, 0x56, 0x13, 0x55, 0x04, 0x75, 0xD2, 0x02, 0x06, 0x75, 0x18, 0x5E, 0x6E, 0x02, 0x13, 0x37, + 0x0C, 0x40, 0xF0, 0x11, 0x04, 0x70, 0x38, 0x61, 0xB0, 0x00, 0x73, 0x67, 0xD4, 0x61, 0x92, 0x05, + 0xC6, 0x53, 0xC2, 0x03, 0xB1, 0x04, 0x06, 0x56, 0x24, 0x71, 0xCC, 0x70, 0x13, 0x00, 0x24, 0x44, + 0x92, 0xF3, 0x38, 0xD0, 0x40, 0x16, 0x99, 0x5E, 0x6E, 0x02, 0x30, 0x7D, 0xDC, 0x70, 0x80, 0x00, + 0x82, 0x68, 0x98, 0x7E, 0x04, 0x00, 0x92, 0x17, 0xA8, 0x7E, 0xEE, 0x01, 0x82, 0x0B, 0x18, 0x7E, + 0xEC, 0x01, 0x18, 0x6D, 0x41, 0x00, 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0xEC, 0x01, + 0xF2, 0x58, 0xB9, 0x0E, 0xE8, 0x01, 0x99, 0x0E, 0xED, 0x01, 0x99, 0x0E, 0xEC, 0x01, 0xA9, 0x0E, + 0xEE, 0x01, 0xF2, 0x4F, 0x18, 0xCE, 0xED, 0x01, 0x18, 0x7D, 0x3E, 0x00, 0xC6, 0xC7, 0xB2, 0x11, + 0x24, 0xC1, 0x13, 0xCC, 0x99, 0xCE, 0xED, 0x01, 0x18, 0x7D, 0x3F, 0x00, 0xC6, 0x7C, 0xB2, 0x3F, + 0x38, 0x7E, 0xE8, 0x01, 0x28, 0x6E, 0x0C, 0x00, 0x26, 0x76, 0xB9, 0x7E, 0xE8, 0x01, 0xF2, 0x37, + 0xC6, 0xC7, 0x92, 0x35, 0x38, 0x7E, 0xE8, 0x01, 0x28, 0x2E, 0x0C, 0x00, 0x26, 0x27, 0xB9, 0x2E, + 0xE8, 0x01, 0x18, 0x3D, 0x3F, 0x00, 0x3F, 0x33, 0x0C, 0x00, 0x24, 0x31, 0x0B, 0x9E, 0x00, 0x00, + 0xA9, 0x0E, 0xEE, 0x01, 0x28, 0x7D, 0x42, 0x00, 0xB9, 0x2E, 0xE8, 0x01, 0x06, 0xB2, 0xC6, 0x27, + 0xC2, 0x15, 0x38, 0x71, 0xD4, 0x00, 0x18, 0x3D, 0x40, 0x00, 0x36, 0x27, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9E, 0x00, 0x00, 0x23, 0x22, 0xA9, 0x2E, 0xEE, 0x01, 0x28, 0x7D, + 0x44, 0x00, 0xC6, 0x27, 0xC2, 0x03, 0xA9, 0x7E, 0xEE, 0x01, 0x18, 0x3D, 0x3F, 0x00, 0x06, 0x2B, + 0x3F, 0x33, 0x0C, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0xB9, 0x2E, 0xE8, 0x01, 0x99, 0x0E, 0xEC, 0x01, + 0x18, 0x9E, 0x04, 0x00, 0x04, 0xA0, 0x0C, 0x50, 0x54, 0x05, 0x14, 0xD1, 0x06, 0xCA, 0x26, 0x5E, + 0xC6, 0xC9, 0x32, 0x48, 0x06, 0xBC, 0xD7, 0xB1, 0x26, 0xBE, 0x78, 0x2B, 0xBE, 0x01, 0xB9, 0x51, + 0x24, 0x01, 0x04, 0x3A, 0x4B, 0xA1, 0x00, 0x00, 0x06, 0x72, 0xA9, 0x2B, 0xBE, 0x01, 0x78, 0x2B, + 0xC0, 0x01, 0xB9, 0x71, 0x28, 0x01, 0x04, 0x3A, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, + 0x38, 0x51, 0x24, 0x01, 0x43, 0x22, 0x43, 0x37, 0xA9, 0x2B, 0xC0, 0x01, 0x06, 0x78, 0x0C, 0x70, + 0x44, 0x15, 0x78, 0x67, 0x04, 0x00, 0xC6, 0x63, 0x12, 0x1F, 0x78, 0x67, 0x06, 0x00, 0xC6, 0x63, + 0x22, 0x1B, 0x70, 0x67, 0xC6, 0x62, 0x12, 0x18, 0x78, 0x67, 0x02, 0x00, 0xC6, 0x62, 0x22, 0x14, + 0x18, 0x6B, 0xBD, 0x01, 0x18, 0xFB, 0xBC, 0x01, 0x2F, 0x46, 0x06, 0x00, 0x26, 0x46, 0x57, 0x41, + 0x26, 0x64, 0x26, 0x6F, 0x26, 0x66, 0x0C, 0xF0, 0x80, 0x02, 0x26, 0x6F, 0x70, 0x66, 0xC6, 0xA6, + 0x32, 0x03, 0x06, 0xA6, 0x06, 0xDC, 0x24, 0x78, 0xC6, 0x75, 0x92, 0xDC, 0x24, 0xC1, 0x43, 0xCC, + 0xF2, 0xB8, 0x98, 0x7E, 0x05, 0x00, 0xB9, 0xD1, 0xAC, 0x00, 0xB9, 0xA1, 0xA4, 0x00, 0x92, 0x23, + 0xC4, 0x91, 0xC2, 0x21, 0x98, 0x7E, 0xC0, 0x03, 0x92, 0x1E, 0xB8, 0x71, 0xD0, 0x00, 0x82, 0x1B, + 0x34, 0x71, 0xD7, 0x71, 0x26, 0x7E, 0x78, 0x57, 0xBE, 0x01, 0x78, 0x67, 0xC0, 0x01, 0x0C, 0x40, + 0xE6, 0x01, 0x0C, 0x70, 0xBE, 0x11, 0x26, 0x4E, 0xC6, 0x74, 0x82, 0x06, 0xA1, 0x07, 0xA9, 0x07, + 0x02, 0x00, 0x24, 0x78, 0xF2, 0xFA, 0x04, 0x71, 0x99, 0x7E, 0x04, 0x00, 0xA9, 0x5E, 0xBE, 0x01, + 0xA9, 0x6E, 0xC0, 0x01, 0x18, 0x7E, 0x04, 0x00, 0xC4, 0x71, 0x92, 0x05, 0xC4, 0xD0, 0x3A, 0x91, + 0x00, 0x00, 0xF2, 0x06, 0xC4, 0x72, 0x9A, 0x90, 0x00, 0x00, 0xC4, 0xD0, 0x32, 0x06, 0x04, 0x71, + 0x99, 0x7E, 0x2C, 0x01, 0xFA, 0x8E, 0x00, 0x00, 0x18, 0x7E, 0xBD, 0x01, 0xCC, 0x70, 0x11, 0x00, + 0x92, 0x05, 0x18, 0x7E, 0xBC, 0x01, 0xC4, 0x7A, 0xC2, 0x0C, 0x18, 0x7E, 0xC5, 0x01, 0xCC, 0x70, + 0x11, 0x00, 0x92, 0xEE, 0x18, 0x7E, 0xC4, 0x01, 0x04, 0x51, 0xC4, 0x7A, 0xD2, 0xE9, 0xF2, 0x02, + 0x04, 0x50, 0xD7, 0x51, 0x26, 0x5E, 0x18, 0x75, 0xBD, 0x01, 0x2F, 0x67, 0x07, 0x00, 0x26, 0x67, + 0x57, 0x61, 0x26, 0x76, 0x18, 0x65, 0xBC, 0x01, 0x0C, 0x40, 0x80, 0x0B, 0x26, 0x76, 0x06, 0x6D, + 0xD7, 0x61, 0x2F, 0x36, 0x0E, 0x00, 0x26, 0x77, 0x2F, 0x27, 0x04, 0x00, 0x18, 0x73, 0xBD, 0x01, + 0x2F, 0x57, 0x07, 0x00, 0x26, 0x57, 0x57, 0x51, 0x26, 0x75, 0x18, 0x53, 0xBC, 0x01, 0x70, 0x32, + 0x26, 0x57, 0x26, 0x55, 0x26, 0x45, 0x70, 0x74, 0xC6, 0x37, 0x02, 0x07, 0x18, 0x7E, 0x2C, 0x01, + 0xC4, 0x72, 0x82, 0x03, 0x06, 0x7D, 0xF2, 0x12, 0x18, 0x7E, 0x2C, 0x01, 0xC4, 0x71, 0x82, 0xFB, + 0x26, 0x6E, 0x18, 0x76, 0xBC, 0x01, 0x18, 0x86, 0xBD, 0x01, 0x78, 0x96, 0xBE, 0x01, 0x78, 0xA6, + 0xC0, 0x01, 0x28, 0xB6, 0xC2, 0x01, 0x04, 0xC0, 0xF2, 0x15, 0xC4, 0x71, 0x12, 0x0F, 0x04, 0x51, + 0x26, 0x57, 0x06, 0x47, 0x06, 0x75, 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, 0xBC, 0x01, 0xD7, 0x41, + 0x26, 0x4E, 0xC9, 0x64, 0xBC, 0x01, 0x43, 0x75, 0xF2, 0xF1, 0x04, 0x71, 0x99, 0x7E, 0x04, 0x00, + 0xF2, 0x98, 0x24, 0xC8, 0xCC, 0xC0, 0x30, 0x00, 0x82, 0x0F, 0x2F, 0x2C, 0x0E, 0x00, 0x2C, 0x20, + 0xB4, 0x01, 0x04, 0x30, 0x04, 0x48, 0xB9, 0x71, 0x28, 0x01, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x38, 0x71, 0x28, 0x01, 0xF2, 0xEF, 0x04, 0x61, 0x99, 0x6E, 0x04, 0x00, 0x99, 0x7E, 0xBC, 0x01, + 0x99, 0x8E, 0xBD, 0x01, 0xA9, 0x9E, 0xBE, 0x01, 0xA9, 0xAE, 0xC0, 0x01, 0xA9, 0xBE, 0xC2, 0x01, + 0x04, 0x72, 0xFA, 0x77, 0xFF, 0xFF, 0xC4, 0x70, 0x9A, 0x73, 0xFF, 0xFF, 0x99, 0x0E, 0x2C, 0x01, + 0x28, 0x5E, 0x06, 0x00, 0x04, 0x71, 0xD6, 0x75, 0x82, 0x1B, 0x18, 0x5E, 0x04, 0x00, 0xC4, 0x51, + 0xC2, 0x39, 0xC4, 0xD0, 0x22, 0x37, 0xC6, 0xD5, 0x32, 0x0E, 0x06, 0x4D, 0x24, 0xD1, 0x06, 0x7D, + 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, 0xBC, 0x01, 0xD7, 0x41, 0x26, 0x4E, 0xC9, 0x64, 0xBC, 0x01, + 0x43, 0xDD, 0xF2, 0xF2, 0x06, 0x75, 0x34, 0x71, 0x99, 0x7E, 0x04, 0x00, 0xF2, 0x23, 0x04, 0x72, + 0xD6, 0x75, 0x82, 0x20, 0x18, 0x4E, 0x04, 0x00, 0xC4, 0x41, 0xC2, 0x1C, 0xC4, 0xD0, 0x22, 0x1A, + 0xC6, 0xD4, 0x32, 0x0E, 0x06, 0x3D, 0x24, 0xD1, 0x06, 0x7D, 0xD7, 0x71, 0x26, 0x7E, 0x48, 0x67, + 0xBC, 0x01, 0xD7, 0x31, 0x26, 0x3E, 0xC9, 0x63, 0xBC, 0x01, 0x43, 0xDD, 0xF2, 0xF2, 0x06, 0x74, + 0x34, 0x71, 0x99, 0x7E, 0x04, 0x00, 0x14, 0x83, 0x06, 0x75, 0x56, 0x78, 0x64, 0x71, 0xA9, 0x7E, + 0x06, 0x00, 0x18, 0x7E, 0x04, 0x00, 0xC4, 0x71, 0xCA, 0x56, 0x01, 0x00, 0x18, 0x7E, 0xC4, 0x03, + 0xC4, 0x71, 0xDA, 0x51, 0x01, 0x00, 0x18, 0x7E, 0xEE, 0x02, 0x0C, 0x80, 0x00, 0x19, 0xC4, 0x70, + 0x82, 0x03, 0x0C, 0x80, 0xA0, 0x28, 0x0C, 0x20, 0x94, 0x00, 0x26, 0x21, 0x04, 0x30, 0x04, 0x4A, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x18, 0xBE, 0x04, 0x00, 0x04, 0xA0, 0x06, 0xDA, 0x04, 0x51, + 0xC6, 0xDB, 0x32, 0x4B, 0x06, 0x9D, 0xD7, 0x91, 0x26, 0x9E, 0x2F, 0x6D, 0x0D, 0x00, 0x2C, 0x90, + 0xBC, 0x01, 0x06, 0xCD, 0x26, 0x61, 0xC6, 0xCB, 0x32, 0x3D, 0x06, 0x4C, 0xD7, 0x41, 0x26, 0x4E, + 0x78, 0x39, 0x02, 0x00, 0x78, 0x74, 0xBE, 0x01, 0x3F, 0x77, 0x03, 0x00, 0xC4, 0x70, 0x32, 0x02, + 0x16, 0x77, 0x78, 0x29, 0x04, 0x00, 0x78, 0x44, 0xC0, 0x01, 0x36, 0x24, 0xC4, 0x20, 0x32, 0x02, + 0x16, 0x22, 0x06, 0x32, 0xB9, 0x51, 0x24, 0x01, 0xB9, 0x61, 0x1C, 0x01, 0xB9, 0x71, 0x28, 0x01, + 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x28, 0x01, 0x06, 0x42, 0x06, 0x37, 0x06, 0x27, 0xB9, 0x41, + 0x20, 0x01, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x41, 0x20, 0x01, 0x38, 0x51, 0x24, 0x01, 0x38, 0x61, + 0x1C, 0x01, 0x26, 0x24, 0xC6, 0x82, 0xC2, 0x0B, 0x28, 0x46, 0x94, 0x00, 0x06, 0x75, 0x53, 0x7C, + 0xC6, 0xDC, 0x66, 0x74, 0xA9, 0x76, 0x94, 0x00, 0x82, 0x02, 0x04, 0xA1, 0x24, 0xC1, 0x43, 0xCC, + 0xF2, 0xC3, 0x24, 0xD1, 0x43, 0xDD, 0xF2, 0xB5, 0xC4, 0xA1, 0x92, 0x04, 0x99, 0xAE, 0xEE, 0x02, + 0xF2, 0x03, 0x99, 0x0E, 0xEE, 0x02, 0x14, 0x71, 0x26, 0x7B, 0x43, 0x77, 0x14, 0x21, 0xC6, 0x72, + 0x82, 0x23, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x51, 0xA8, 0x65, 0x94, 0x00, 0x82, 0x1A, 0x04, 0x61, + 0x26, 0x67, 0x43, 0x66, 0x06, 0x45, 0xC6, 0x6B, 0x32, 0x14, 0x28, 0x34, 0x94, 0x00, 0x06, 0x53, + 0x63, 0x56, 0xD4, 0x51, 0x82, 0x0B, 0x2F, 0x56, 0x06, 0x00, 0x26, 0x51, 0x28, 0xF5, 0x94, 0x00, + 0x66, 0x3F, 0xA9, 0x34, 0x94, 0x00, 0xA9, 0x05, 0x94, 0x00, 0x24, 0x61, 0x43, 0x66, 0xF2, 0xEC, + 0x34, 0x71, 0x43, 0x77, 0xF2, 0xDD, 0x04, 0xB0, 0x06, 0xCB, 0x06, 0xAE, 0x18, 0xDE, 0x04, 0x00, + 0x06, 0x9A, 0xC6, 0xCD, 0x3A, 0x91, 0x00, 0x00, 0x2F, 0x6C, 0x0C, 0x00, 0x26, 0x61, 0xA8, 0x76, + 0x94, 0x00, 0x04, 0x51, 0x26, 0x5C, 0xB9, 0x51, 0xA8, 0x00, 0x8A, 0x81, 0x00, 0x00, 0xD7, 0xC1, + 0x26, 0xCA, 0x18, 0x7C, 0xBD, 0x01, 0x38, 0x81, 0xCC, 0x00, 0x78, 0x3C, 0xBE, 0x01, 0x2F, 0x57, + 0x07, 0x00, 0x26, 0x57, 0x57, 0x51, 0x26, 0x75, 0x18, 0x5C, 0xBC, 0x01, 0x26, 0x75, 0x26, 0x77, + 0x26, 0x78, 0x70, 0xD7, 0xB9, 0x61, 0x1C, 0x01, 0x06, 0x2D, 0xAB, 0x9A, 0x00, 0x00, 0x78, 0x3C, + 0xC0, 0x01, 0x06, 0x82, 0x06, 0x2D, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x51, 0xA8, 0x00, 0x38, 0x61, + 0x1C, 0x01, 0x06, 0x92, 0x43, 0x75, 0xB9, 0x61, 0xB0, 0x00, 0x18, 0x6A, 0x04, 0x00, 0xC6, 0x76, + 0x32, 0x45, 0x38, 0x51, 0xB0, 0x00, 0x28, 0x65, 0x94, 0x00, 0x63, 0x67, 0xD4, 0x61, 0x82, 0x3B, + 0x06, 0x67, 0x0C, 0xF0, 0x00, 0x10, 0xD7, 0x61, 0x26, 0x6F, 0x18, 0x56, 0xBD, 0x01, 0x0C, 0x40, + 0xBC, 0x01, 0x2F, 0x35, 0x05, 0x00, 0x26, 0x35, 0x57, 0x31, 0x26, 0x53, 0x18, 0x36, 0xBC, 0x01, + 0x26, 0x46, 0x26, 0x53, 0x38, 0x31, 0xCC, 0x00, 0x26, 0x55, 0x26, 0x53, 0x70, 0x55, 0x78, 0x36, + 0xBE, 0x01, 0xB9, 0x71, 0x28, 0x01, 0x06, 0x25, 0xB9, 0x41, 0x20, 0x01, 0x26, 0xD5, 0xB9, 0x51, + 0x24, 0x01, 0xB9, 0x61, 0x1C, 0x01, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x61, 0x1C, 0x01, 0x38, 0x51, + 0x24, 0x01, 0x78, 0x36, 0xC0, 0x01, 0x26, 0x82, 0x06, 0x25, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x41, + 0x20, 0x01, 0x26, 0x92, 0x04, 0x30, 0x06, 0x24, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x38, 0x71, 0x28, 0x01, 0x24, 0x71, 0x43, 0x77, 0xF2, 0xB9, 0xC4, 0xD0, 0x92, 0x02, 0x04, 0xD1, + 0x06, 0x3D, 0x06, 0x28, 0x0B, 0x9E, 0x00, 0x00, 0xA9, 0x2C, 0xBE, 0x01, 0x06, 0x3D, 0x06, 0x29, + 0x24, 0xB1, 0x0B, 0x9E, 0x00, 0x00, 0x23, 0xBB, 0xA9, 0x2C, 0xC0, 0x01, 0x38, 0x51, 0xA8, 0x00, + 0x43, 0xC5, 0xFA, 0x6D, 0xFF, 0xFF, 0x34, 0xD1, 0x43, 0xDD, 0x14, 0xC1, 0xC6, 0xDC, 0x82, 0x1C, + 0x06, 0x7D, 0xD7, 0x71, 0x26, 0x79, 0xF8, 0x67, 0xBE, 0x01, 0x0C, 0x20, 0xBC, 0x01, 0x26, 0x27, + 0x92, 0x10, 0xF8, 0x77, 0xC0, 0x01, 0x92, 0x0D, 0xC4, 0xD3, 0x12, 0x0B, 0x04, 0x31, 0x26, 0x3D, + 0xD7, 0x31, 0x26, 0x3A, 0x2C, 0x30, 0xBC, 0x01, 0x04, 0x48, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, + 0x34, 0xD1, 0x43, 0xDD, 0xF2, 0xE4, 0x18, 0x79, 0x04, 0x00, 0xC6, 0x7B, 0xA2, 0x06, 0x99, 0xB9, + 0x04, 0x00, 0xF2, 0x03, 0x99, 0x0E, 0xEE, 0x02, 0x98, 0x7E, 0xA4, 0x05, 0x92, 0x08, 0x28, 0x7E, + 0x06, 0x00, 0xD4, 0x72, 0x82, 0x13, 0xB8, 0x61, 0xAC, 0x00, 0x32, 0x10, 0x38, 0x60, 0x40, 0x16, + 0x18, 0x7E, 0xA5, 0x05, 0x99, 0x0E, 0x04, 0x00, 0x18, 0x66, 0xD4, 0x00, 0xC6, 0x67, 0xD2, 0x03, + 0x99, 0x0E, 0xA4, 0x05, 0x24, 0x71, 0x99, 0x7E, 0xA5, 0x05, 0x18, 0x7E, 0x04, 0x00, 0x98, 0x6E, + 0x24, 0x01, 0x99, 0x7E, 0x05, 0x00, 0x99, 0x7E, 0x1A, 0x00, 0x82, 0x07, 0xCC, 0x60, 0xF9, 0x00, + 0xD2, 0x09, 0x06, 0x76, 0x24, 0x71, 0xF2, 0x04, 0xC4, 0x70, 0x82, 0x04, 0x04, 0x71, 0x99, 0x7E, + 0x24, 0x01, 0x58, 0xC1, 0x40, 0x01, 0x58, 0x81, 0x30, 0x01, 0x2C, 0x10, 0x50, 0x01, 0xE1, 0xF0, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x28, 0xE0, 0xEE, 0x11, 0x98, 0x70, 0x57, 0x16, 0x82, 0x04, + 0x2C, 0xE0, 0x96, 0x00, 0xF2, 0x06, 0x38, 0x70, 0x40, 0x16, 0x28, 0x77, 0x22, 0x00, 0x26, 0xE7, + 0x08, 0x70, 0x00, 0x40, 0x38, 0x27, 0xE4, 0x70, 0x04, 0x3D, 0x5C, 0x20, 0xFF, 0x01, 0x8B, 0xA4, + 0x00, 0x00, 0xA3, 0x22, 0x82, 0x03, 0xC4, 0x2C, 0x92, 0x03, 0x2C, 0xE0, 0x64, 0x00, 0x6B, 0xBD, + 0x00, 0x00, 0x06, 0xD2, 0xEB, 0xD6, 0x03, 0x00, 0xC6, 0xDE, 0x04, 0x21, 0xB2, 0x02, 0x04, 0x20, + 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x24, 0x00, 0xD9, 0xC1, 0x14, 0x00, + 0x38, 0xE0, 0x40, 0x16, 0xD9, 0x81, 0x04, 0x00, 0x06, 0xD2, 0x04, 0x30, 0x06, 0x2A, 0x0C, 0x20, + 0x3A, 0x11, 0x0C, 0x40, 0x7A, 0x00, 0x0C, 0x90, 0x00, 0x10, 0x0C, 0x80, 0x50, 0x01, 0x0C, 0xF0, + 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xA0, 0x3A, 0x11, 0x26, 0x89, 0x06, 0xCD, 0x06, 0xBD, 0x28, 0x4B, + 0xE4, 0x01, 0x28, 0x3B, 0xE2, 0x01, 0x28, 0x2B, 0xE0, 0x01, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0x30, 0x7C, 0x3F, 0x22, 0x07, 0x00, 0xB1, 0x2C, 0x18, 0x3E, 0x0B, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9E, 0x00, 0x00, 0x06, 0x72, 0x38, 0x3C, 0xF0, 0x00, 0x18, 0x2E, + 0x0C, 0x00, 0xB1, 0x71, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9E, 0x00, 0x00, + 0x30, 0x71, 0x06, 0x52, 0x04, 0x3F, 0x06, 0x27, 0xB1, 0x51, 0x4B, 0xA1, 0x00, 0x00, 0x28, 0x6E, + 0x14, 0x00, 0x30, 0x51, 0xC6, 0x26, 0x06, 0x72, 0x02, 0x02, 0x06, 0x76, 0x06, 0x25, 0x0C, 0x30, + 0x12, 0x00, 0xB1, 0x71, 0x4B, 0xA1, 0x00, 0x00, 0x28, 0x6E, 0x16, 0x00, 0x30, 0x71, 0xC6, 0x26, + 0x02, 0x02, 0x06, 0x26, 0x18, 0x3E, 0x0E, 0x00, 0x3F, 0x22, 0x07, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xA1, 0x2A, 0x24, 0xA2, 0xC6, 0xA8, 0x24, 0xB6, + 0x24, 0xC4, 0x92, 0xB6, 0x0C, 0xA0, 0x76, 0x11, 0x2C, 0x90, 0x9A, 0x01, 0x06, 0xCD, 0x28, 0x4C, + 0x98, 0x02, 0x28, 0x3C, 0x96, 0x02, 0x28, 0x2C, 0x94, 0x02, 0x0C, 0xF0, 0xD8, 0x00, 0xF1, 0xF0, + 0x38, 0x7D, 0x78, 0x00, 0x3F, 0x22, 0x07, 0x00, 0xB9, 0x2D, 0x78, 0x00, 0x18, 0x3E, 0x09, 0x00, + 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x0B, 0x9E, 0x00, 0x00, 0x06, 0xB2, 0x38, 0x3D, + 0x68, 0x01, 0x18, 0x2E, 0x0A, 0x00, 0xE7, 0xB1, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, + 0x0B, 0x9E, 0x00, 0x00, 0x28, 0x7E, 0x10, 0x00, 0xC6, 0xB7, 0x02, 0x02, 0x06, 0xB7, 0x04, 0x3B, + 0x4B, 0xA1, 0x00, 0x00, 0x28, 0x7E, 0x12, 0x00, 0xC6, 0x27, 0x02, 0x02, 0x06, 0x27, 0x18, 0x3E, + 0x0D, 0x00, 0x3F, 0x22, 0x0B, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, + 0x00, 0x00, 0xA1, 0x2A, 0x24, 0xA2, 0xC6, 0xA9, 0x24, 0xC6, 0x24, 0xD4, 0x92, 0xC1, 0x58, 0xC1, + 0x14, 0x00, 0x58, 0x81, 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0xC4, 0x03, + 0xD9, 0x81, 0xA4, 0x03, 0x38, 0xB0, 0x40, 0x16, 0xD9, 0xC1, 0xB4, 0x03, 0x98, 0x70, 0x57, 0x16, + 0xB9, 0x01, 0x5C, 0x03, 0x0C, 0xD0, 0x00, 0x10, 0xB9, 0x01, 0x58, 0x03, 0xB9, 0x01, 0x54, 0x03, + 0xB9, 0x01, 0x50, 0x03, 0xA9, 0x0D, 0xF0, 0x02, 0xA9, 0x0D, 0xF2, 0x02, 0xA9, 0x0D, 0xF4, 0x02, + 0xA9, 0x0D, 0xF6, 0x02, 0xA9, 0x0D, 0xFC, 0x02, 0x92, 0x0E, 0x0C, 0x50, 0x34, 0x00, 0x0C, 0x70, + 0x32, 0x00, 0x26, 0x5B, 0x26, 0x7B, 0x70, 0x55, 0x20, 0x77, 0xB9, 0x51, 0x78, 0x03, 0xB9, 0x71, + 0x68, 0x03, 0xF2, 0x08, 0x0C, 0x90, 0x90, 0x01, 0x04, 0x50, 0xB9, 0x91, 0x68, 0x03, 0xB9, 0x51, + 0x78, 0x03, 0x06, 0x21, 0x0C, 0x30, 0x50, 0x03, 0x0C, 0xF0, 0x54, 0x01, 0xF1, 0xF0, 0x28, 0xCD, + 0x0A, 0x00, 0x2F, 0xEC, 0x0C, 0x00, 0x06, 0x67, 0x0C, 0x60, 0x44, 0x16, 0x04, 0x32, 0x26, 0x36, + 0x2F, 0x2C, 0x0E, 0x00, 0x20, 0x76, 0x20, 0x63, 0xD7, 0x21, 0x26, 0x2C, 0x0C, 0x30, 0x64, 0x00, + 0x26, 0x22, 0xB9, 0x71, 0x94, 0x03, 0xB9, 0x61, 0x98, 0x03, 0x0B, 0x9E, 0x00, 0x00, 0x06, 0x7C, + 0xD7, 0x72, 0xB9, 0x21, 0x8C, 0x03, 0x2F, 0x27, 0x0E, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x26, 0x2C, + 0x0B, 0x9E, 0x00, 0x00, 0x38, 0x51, 0x5C, 0x03, 0x38, 0x71, 0x50, 0x03, 0x38, 0x91, 0x54, 0x03, + 0xB9, 0x51, 0x6C, 0x03, 0x0C, 0x50, 0x0C, 0x03, 0x26, 0x5D, 0x20, 0x55, 0xB9, 0x71, 0x60, 0x03, + 0xB9, 0x91, 0x74, 0x03, 0x38, 0x71, 0x48, 0x03, 0x38, 0x91, 0x4C, 0x03, 0x38, 0x81, 0x58, 0x03, + 0xB9, 0x51, 0x70, 0x03, 0x04, 0x30, 0x0C, 0x40, 0x78, 0x00, 0x0C, 0x50, 0x94, 0x02, 0xB9, 0x21, + 0x90, 0x03, 0xB9, 0x71, 0x88, 0x03, 0xB9, 0x91, 0x84, 0x03, 0x26, 0x41, 0x26, 0x51, 0xB9, 0x31, + 0x64, 0x03, 0x06, 0xF3, 0x2F, 0x2F, 0x0F, 0x00, 0x0C, 0x70, 0x00, 0x07, 0x26, 0x72, 0x0C, 0x60, + 0xE0, 0x01, 0x0C, 0x90, 0x80, 0x02, 0x06, 0xE1, 0x26, 0x61, 0xB9, 0x71, 0x9C, 0x03, 0x06, 0xAF, + 0x26, 0x29, 0x04, 0x30, 0x20, 0x72, 0x0C, 0x90, 0xFF, 0x0F, 0x56, 0x97, 0xB9, 0x91, 0x7C, 0x03, + 0x38, 0x91, 0x9C, 0x03, 0x2F, 0x73, 0x03, 0x00, 0x26, 0x79, 0x20, 0x77, 0x0C, 0x90, 0xFF, 0x0F, + 0x56, 0x97, 0x38, 0x71, 0x7C, 0x03, 0xB9, 0x91, 0x80, 0x03, 0x36, 0x79, 0x38, 0x91, 0x94, 0x03, + 0xC6, 0x9A, 0x82, 0x0E, 0x38, 0x91, 0x98, 0x03, 0xC6, 0x9A, 0x82, 0x0A, 0xC4, 0x3A, 0x1A, 0x26, + 0x01, 0x00, 0x38, 0x91, 0x64, 0x03, 0xCC, 0x90, 0x12, 0x00, 0x8A, 0x20, 0x01, 0x00, 0xC4, 0x70, + 0xA1, 0x72, 0x22, 0x76, 0x30, 0x9E, 0x26, 0x97, 0xB1, 0x9E, 0x20, 0x96, 0xC6, 0x97, 0xB9, 0x91, + 0xA0, 0x03, 0x28, 0x96, 0x02, 0x00, 0x32, 0x09, 0xA9, 0x96, 0x04, 0x00, 0x38, 0x91, 0xA0, 0x03, + 0xA1, 0x76, 0xA9, 0x96, 0x02, 0x00, 0xF2, 0x0E, 0xC6, 0x97, 0x32, 0x06, 0xA9, 0x96, 0x04, 0x00, + 0xA9, 0x76, 0x02, 0x00, 0xF2, 0x07, 0x28, 0x96, 0x04, 0x00, 0xC6, 0x97, 0x32, 0x03, 0xA9, 0x76, + 0x04, 0x00, 0x30, 0x94, 0x26, 0x97, 0xB1, 0x94, 0x20, 0x95, 0xC6, 0x97, 0xB9, 0x91, 0xA0, 0x03, + 0x28, 0x95, 0x02, 0x00, 0x32, 0x09, 0xA9, 0x95, 0x04, 0x00, 0x38, 0x91, 0xA0, 0x03, 0xA1, 0x75, + 0xA9, 0x95, 0x02, 0x00, 0xF2, 0x0E, 0xC6, 0x97, 0x32, 0x06, 0xA9, 0x95, 0x04, 0x00, 0xA9, 0x75, + 0x02, 0x00, 0xF2, 0x07, 0x28, 0x95, 0x04, 0x00, 0xC6, 0x97, 0x32, 0x03, 0xA9, 0x75, 0x04, 0x00, + 0x1C, 0x90, 0x33, 0x00, 0x26, 0x97, 0xCC, 0x90, 0x4E, 0x00, 0xD2, 0x06, 0x28, 0x9D, 0xFC, 0x02, + 0x24, 0x91, 0xA9, 0x9D, 0xFC, 0x02, 0xCC, 0xC0, 0x64, 0x00, 0x02, 0x1D, 0x38, 0x91, 0x8C, 0x03, + 0xC6, 0x79, 0xC2, 0x06, 0x28, 0x9D, 0xF0, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0xF0, 0x02, 0x38, 0x91, + 0x90, 0x03, 0xC6, 0x79, 0xC2, 0x10, 0x28, 0x9D, 0xF2, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0xF2, 0x02, + 0x28, 0x9D, 0xF4, 0x02, 0x24, 0x91, 0xA9, 0x9D, 0xF4, 0x02, 0x28, 0x9D, 0xF6, 0x02, 0x24, 0x91, + 0xA9, 0x9D, 0xF6, 0x02, 0x28, 0x9B, 0xC0, 0x00, 0xC6, 0x79, 0x02, 0x0A, 0x26, 0x99, 0xC6, 0x79, + 0x24, 0x81, 0x02, 0x06, 0x38, 0x71, 0x6C, 0x03, 0x24, 0x71, 0xB9, 0x71, 0x6C, 0x03, 0x38, 0x91, + 0x80, 0x03, 0x38, 0x71, 0x7C, 0x03, 0x36, 0x97, 0xC4, 0x90, 0xB9, 0x91, 0x80, 0x03, 0x02, 0x2E, + 0x38, 0x9E, 0xF0, 0x00, 0x38, 0x71, 0x80, 0x03, 0x26, 0x97, 0xB9, 0x9E, 0xF0, 0x00, 0x38, 0x94, + 0xF0, 0x00, 0x26, 0x97, 0x0C, 0x70, 0xC0, 0x00, 0xB9, 0x94, 0xF0, 0x00, 0x26, 0x7B, 0x20, 0x77, + 0x38, 0x91, 0x80, 0x03, 0xB9, 0x71, 0x7C, 0x03, 0xC6, 0x97, 0x02, 0x12, 0x38, 0x71, 0x60, 0x03, + 0x38, 0x91, 0x7C, 0x03, 0x24, 0x71, 0xB9, 0x71, 0x60, 0x03, 0x38, 0x71, 0x80, 0x03, 0x26, 0x99, + 0xC6, 0x79, 0x02, 0x06, 0x38, 0x91, 0x74, 0x03, 0x24, 0x91, 0xB9, 0x91, 0x74, 0x03, 0x38, 0x71, + 0x70, 0x03, 0x24, 0x71, 0x23, 0x77, 0xB9, 0x71, 0x70, 0x03, 0x24, 0x31, 0xC4, 0x3D, 0x24, 0x22, + 0x24, 0xA1, 0x24, 0xE4, 0x24, 0x66, 0x9A, 0x27, 0xFF, 0xFF, 0x30, 0x64, 0x38, 0x31, 0x88, 0x03, + 0x38, 0x74, 0xF0, 0x00, 0x38, 0x91, 0x84, 0x03, 0x26, 0x63, 0x38, 0x31, 0x64, 0x03, 0x24, 0xFD, + 0xCC, 0xF0, 0xF7, 0x00, 0x24, 0x31, 0xB9, 0x31, 0x64, 0x03, 0x26, 0x79, 0x24, 0x44, 0x24, 0x56, + 0x82, 0x07, 0xB9, 0x61, 0x88, 0x03, 0xB9, 0x71, 0x84, 0x03, 0xFA, 0xFD, 0xFE, 0xFF, 0x38, 0x31, + 0x6C, 0x03, 0x38, 0x51, 0x60, 0x03, 0x38, 0x91, 0x74, 0x03, 0xB9, 0x31, 0x5C, 0x03, 0x38, 0x31, + 0x70, 0x03, 0xB9, 0x71, 0x4C, 0x03, 0xB9, 0x51, 0x50, 0x03, 0xA9, 0x3D, 0x0C, 0x03, 0xB9, 0x61, + 0x48, 0x03, 0xB9, 0x81, 0x58, 0x03, 0xB9, 0x91, 0x54, 0x03, 0x2B, 0xDA, 0x03, 0x00, 0x2B, 0xDD, + 0x03, 0x00, 0xEB, 0xD6, 0x03, 0x00, 0x30, 0x7B, 0x28, 0xEB, 0x30, 0x00, 0xD4, 0x71, 0xA9, 0xED, + 0x0E, 0x00, 0x82, 0x1C, 0x38, 0x31, 0x48, 0x03, 0x38, 0x21, 0x68, 0x03, 0xAB, 0x9A, 0x00, 0x00, + 0x0C, 0x30, 0x7C, 0x60, 0x0B, 0x9E, 0x00, 0x00, 0x06, 0xC2, 0x38, 0x31, 0x68, 0x03, 0x38, 0x21, + 0x78, 0x03, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x22, + 0x26, 0x2C, 0xC6, 0x2E, 0xB2, 0x03, 0xA9, 0x2D, 0x0E, 0x00, 0x06, 0x21, 0x4B, 0xD7, 0x02, 0x00, + 0x0C, 0x30, 0x50, 0x03, 0x06, 0x21, 0x26, 0x31, 0x4B, 0x1B, 0x03, 0x00, 0x58, 0xC1, 0xB4, 0x03, + 0x58, 0x81, 0xA4, 0x03, 0x2C, 0x10, 0xC4, 0x03, 0xE1, 0xF0, 0x04, 0x90, 0xC6, 0x79, 0x02, 0x02, + 0x43, 0x97, 0xA1, 0x92, 0xF2, 0x8B, 0x00, 0x00, 0x3C, 0x10, 0x48, 0x00, 0x0C, 0x20, 0x18, 0x00, + 0x04, 0x30, 0x26, 0x21, 0x04, 0x4B, 0xD9, 0xC1, 0x38, 0x00, 0xD9, 0x81, 0x28, 0x00, 0x4B, 0xE1, + 0x03, 0x00, 0x06, 0xE1, 0x04, 0x70, 0x0C, 0x30, 0x1E, 0x00, 0x0C, 0x20, 0x80, 0x02, 0x0C, 0xD0, + 0x18, 0x00, 0x2F, 0xF7, 0x07, 0x00, 0x04, 0x60, 0x26, 0xD1, 0xA1, 0x3E, 0x26, 0xF2, 0x06, 0x56, + 0x26, 0xD7, 0x2F, 0x46, 0x0F, 0x00, 0x70, 0x44, 0x20, 0xCE, 0xC6, 0x4C, 0x02, 0x03, 0x91, 0x5D, + 0xA1, 0x4E, 0x2C, 0x60, 0x1A, 0x00, 0xCC, 0x60, 0xD4, 0x01, 0x24, 0x51, 0x92, 0xF3, 0x24, 0x71, + 0xC4, 0x7B, 0x24, 0xE2, 0x92, 0xE5, 0x0C, 0xE0, 0xD2, 0x03, 0x04, 0xB0, 0x2F, 0x7B, 0x0B, 0x00, + 0x26, 0x71, 0x20, 0xD7, 0xCC, 0xD0, 0x1E, 0x00, 0xCA, 0xEF, 0x00, 0x00, 0x0C, 0x70, 0x18, 0x00, + 0x26, 0x71, 0x26, 0x7B, 0x10, 0x77, 0xCC, 0x70, 0x10, 0x00, 0x82, 0x61, 0xCC, 0x70, 0x11, 0x00, + 0x82, 0x06, 0xC4, 0x7F, 0x9A, 0xE1, 0x00, 0x00, 0xFA, 0x90, 0x00, 0x00, 0x06, 0x7D, 0x2F, 0xCD, + 0x0D, 0x00, 0xD7, 0x71, 0x26, 0x7C, 0x06, 0x27, 0x78, 0x8E, 0x4E, 0x00, 0xD7, 0x21, 0x36, 0x27, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0x28, 0x06, 0x7D, 0xD7, 0x72, 0x28, 0x9E, + 0x34, 0x00, 0x28, 0xAE, 0x4E, 0x00, 0x12, 0x10, 0x06, 0x6D, 0x06, 0x2D, 0x57, 0x63, 0x57, 0x22, + 0x26, 0x26, 0x0C, 0x30, 0x64, 0x00, 0xB9, 0x71, 0x24, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0x28, + 0x38, 0x71, 0x24, 0x00, 0x02, 0x19, 0x3F, 0xCC, 0x07, 0x00, 0x1C, 0x30, 0x64, 0x00, 0x06, 0x2C, + 0x4B, 0xA1, 0x00, 0x00, 0x23, 0x22, 0x26, 0x92, 0x26, 0xA2, 0xA9, 0x9E, 0x34, 0x00, 0xA9, 0xAE, + 0x4E, 0x00, 0x06, 0x2C, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x28, 0x7E, 0x68, 0x00, + 0x26, 0x27, 0xFA, 0xA0, 0x00, 0x00, 0x3F, 0x2C, 0x07, 0x00, 0x1C, 0x30, 0x64, 0x00, 0x4B, 0xA1, + 0x00, 0x00, 0x28, 0x7E, 0x1A, 0x00, 0x14, 0x35, 0x26, 0x27, 0xA9, 0x2E, 0x1A, 0x00, 0x06, 0x2D, + 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x29, 0xA9, 0x2E, 0x34, 0x00, 0x14, 0x3A, 0x06, 0x2D, 0x4B, 0xA1, + 0x00, 0x00, 0x26, 0x2A, 0xA9, 0x2E, 0x4E, 0x00, 0xFA, 0x87, 0x00, 0x00, 0x78, 0x9E, 0x34, 0x00, + 0x78, 0xCE, 0x68, 0x00, 0x06, 0x7D, 0x2F, 0xAD, 0x0D, 0x00, 0xD7, 0x71, 0x26, 0x7A, 0xC6, 0x9C, + 0x06, 0x27, 0xD7, 0x21, 0x36, 0x27, 0x0C, 0x30, 0x64, 0x00, 0x02, 0x10, 0x4B, 0xA1, 0x00, 0x00, + 0xC6, 0x29, 0x12, 0x10, 0x06, 0x7D, 0x06, 0x2D, 0x57, 0x73, 0x57, 0x22, 0x26, 0x27, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0x29, 0xF2, 0x11, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0x2C, + 0x02, 0x03, 0x06, 0x2D, 0xF2, 0x0D, 0x06, 0x7D, 0x06, 0x2D, 0x57, 0x73, 0x57, 0x22, 0x26, 0x27, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0x2C, 0x06, 0x2D, 0x02, 0x4F, 0xD7, 0x22, + 0x36, 0x2A, 0x1C, 0x30, 0x64, 0x00, 0xF2, 0x4B, 0x78, 0x6E, 0x1A, 0x00, 0x78, 0x7E, 0x4E, 0x00, + 0x20, 0x9E, 0x28, 0xAE, 0x1A, 0x00, 0x28, 0xCE, 0x68, 0x00, 0xC6, 0x67, 0x06, 0x5D, 0x06, 0x8D, + 0x2F, 0x2D, 0x0D, 0x00, 0xD7, 0x51, 0x57, 0x82, 0x02, 0x12, 0x26, 0x52, 0x06, 0x25, 0xD7, 0x21, + 0x36, 0x25, 0x0C, 0x30, 0x64, 0x00, 0xB9, 0x61, 0x24, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x61, + 0x24, 0x00, 0xC6, 0x26, 0x12, 0x13, 0xB9, 0x61, 0x24, 0x00, 0xF2, 0x17, 0x2F, 0x65, 0x02, 0x00, + 0x06, 0x26, 0xD7, 0x21, 0x36, 0x26, 0x0C, 0x30, 0x64, 0x00, 0xB9, 0x71, 0x24, 0x00, 0x4B, 0xA1, + 0x00, 0x00, 0x38, 0x71, 0x24, 0x00, 0xC6, 0x27, 0x02, 0x06, 0x3F, 0x2D, 0x08, 0x00, 0x1C, 0x30, + 0x64, 0x00, 0xF2, 0x07, 0xB9, 0x71, 0x24, 0x00, 0x1C, 0x30, 0x64, 0x00, 0x3F, 0x2D, 0x08, 0x00, + 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x29, 0xA1, 0x2E, 0x1C, 0x30, 0x14, 0x00, 0x06, 0x2D, 0x4B, 0xA1, + 0x00, 0x00, 0x26, 0x2A, 0xA9, 0x2E, 0x1A, 0x00, 0x06, 0x2D, 0x14, 0x3A, 0x4B, 0xA1, 0x00, 0x00, + 0x26, 0x2C, 0xA9, 0x2E, 0x68, 0x00, 0x24, 0xB1, 0xC4, 0xBB, 0x24, 0xE2, 0x9A, 0x08, 0xFF, 0xFF, + 0x0C, 0xF0, 0x9A, 0x11, 0x0C, 0x30, 0x6C, 0x04, 0x0C, 0x50, 0x12, 0x00, 0x14, 0xD1, 0x06, 0x2E, + 0x0C, 0x20, 0x52, 0x11, 0x06, 0x73, 0x04, 0x6C, 0xC4, 0x6A, 0x12, 0x0B, 0xCC, 0x50, 0x12, 0x00, + 0x82, 0x08, 0x70, 0xB2, 0x70, 0x4F, 0x70, 0xC7, 0x26, 0x4B, 0x3F, 0x44, 0x0C, 0x00, 0xF2, 0x02, + 0x70, 0x47, 0xC4, 0x40, 0x12, 0x03, 0xA1, 0x07, 0xF2, 0x02, 0xA1, 0x47, 0x34, 0x61, 0xC6, 0x6D, + 0x34, 0x72, 0x34, 0x22, 0x92, 0xEA, 0x34, 0x51, 0xC6, 0x56, 0x34, 0xF2, 0x3C, 0x30, 0x1A, 0x00, + 0x92, 0xDF, 0x58, 0xC1, 0x38, 0x00, 0x58, 0x81, 0x28, 0x00, 0x2C, 0x10, 0x48, 0x00, 0xE1, 0xF0, + 0xC4, 0x20, 0x0C, 0x70, 0x00, 0x10, 0x28, 0x37, 0x06, 0x00, 0x82, 0x15, 0x64, 0x38, 0xA9, 0x37, + 0x06, 0x00, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x64, 0xDF, 0xB9, 0x70, 0x40, 0x16, 0x08, 0x70, + 0x00, 0x80, 0x2C, 0x70, 0xF0, 0xDD, 0xB9, 0x70, 0x3C, 0x16, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, + 0x58, 0xDD, 0xF2, 0x15, 0x14, 0x29, 0x56, 0x32, 0xA9, 0x37, 0x06, 0x00, 0x08, 0x70, 0x00, 0x80, + 0x2C, 0x70, 0x88, 0xDE, 0xB9, 0x70, 0x40, 0x16, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0x3C, 0xDE, + 0xB9, 0x70, 0x3C, 0x16, 0x08, 0x70, 0x00, 0x80, 0x2C, 0x70, 0xA4, 0xDD, 0xB9, 0x70, 0x38, 0x16, + 0xE1, 0xF0, 0x00, 0x00, 0x0C, 0x70, 0x00, 0x10, 0x99, 0x07, 0xB7, 0x01, 0x99, 0x07, 0xB6, 0x01, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x60, 0x40, 0x16, 0x0C, 0x70, 0x00, 0x10, 0x18, 0x66, 0xC2, 0x00, + 0x18, 0x57, 0xB4, 0x01, 0xC6, 0x56, 0x28, 0x67, 0x06, 0x00, 0xA2, 0x09, 0x6C, 0x60, 0x00, 0x01, + 0xA9, 0x67, 0x06, 0x00, 0x04, 0x61, 0x99, 0x60, 0x66, 0x16, 0xF2, 0x06, 0x1C, 0x50, 0x01, 0x01, + 0x56, 0x65, 0xA9, 0x67, 0x06, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xD2, + 0x38, 0x22, 0x4C, 0x03, 0x06, 0xE3, 0x0C, 0x30, 0xC6, 0x00, 0x38, 0xC0, 0x40, 0x16, 0x0B, 0x9E, + 0x00, 0x00, 0x0C, 0x70, 0x00, 0x10, 0xB9, 0x2D, 0x4C, 0x03, 0x06, 0x32, 0x28, 0x27, 0x06, 0x00, + 0x30, 0x5E, 0x38, 0x4E, 0x08, 0x00, 0x38, 0xFE, 0x04, 0x00, 0x04, 0x68, 0x56, 0x62, 0xA3, 0xD6, + 0x5C, 0x20, 0x80, 0x00, 0x82, 0x18, 0x26, 0x44, 0xC6, 0x54, 0x04, 0x61, 0x12, 0x06, 0xCC, 0x30, + 0xFA, 0x00, 0xD2, 0x02, 0x04, 0x60, 0x13, 0x66, 0xCC, 0xF0, 0x23, 0x00, 0x02, 0x07, 0x38, 0x4E, + 0x0C, 0x00, 0xCC, 0x40, 0x22, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x1D, 0xCC, 0x50, + 0x14, 0x00, 0xF2, 0x18, 0xCC, 0x30, 0x96, 0x00, 0x04, 0x61, 0xD2, 0x02, 0x06, 0x6D, 0xC6, 0x54, + 0x13, 0x66, 0x02, 0x04, 0xC4, 0x58, 0x02, 0x02, 0x04, 0x61, 0xCC, 0xF0, 0x14, 0x00, 0x02, 0x07, + 0x38, 0x4E, 0x0C, 0x00, 0xCC, 0x40, 0x13, 0x00, 0x12, 0x02, 0x04, 0x61, 0xC4, 0x20, 0x82, 0x04, + 0xC4, 0x5A, 0x02, 0x02, 0x04, 0x61, 0x98, 0x50, 0x63, 0x16, 0x92, 0x12, 0xC4, 0x60, 0x82, 0x10, + 0x18, 0x67, 0xB4, 0x01, 0xCC, 0x60, 0xFF, 0x00, 0x82, 0x04, 0x24, 0x61, 0x99, 0x67, 0xB4, 0x01, + 0x98, 0x67, 0xB5, 0x01, 0x82, 0x17, 0x34, 0x61, 0x99, 0x67, 0xB5, 0x01, 0xF2, 0x13, 0x18, 0x67, + 0xB5, 0x01, 0x24, 0x61, 0x13, 0x66, 0x99, 0x67, 0xB5, 0x01, 0x18, 0x5C, 0xC3, 0x00, 0xC6, 0x56, + 0x92, 0x09, 0x98, 0x67, 0xB4, 0x01, 0x99, 0x07, 0xB5, 0x01, 0x82, 0x04, 0x34, 0x61, 0x99, 0x67, + 0xB4, 0x01, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x28, 0x70, 0x50, 0x16, + 0x5C, 0x70, 0x10, 0x00, 0xA3, 0x77, 0x92, 0x0A, 0x18, 0x60, 0x5B, 0x16, 0xC4, 0x61, 0x82, 0x0C, + 0x0C, 0x50, 0xCF, 0x02, 0x0C, 0x60, 0xFF, 0x04, 0xF2, 0x0C, 0x0C, 0x50, 0xCF, 0x02, 0x0C, 0x60, + 0xFF, 0x04, 0x04, 0x70, 0xF2, 0x06, 0x0C, 0x50, 0xCD, 0x02, 0x0C, 0x60, 0xFD, 0x04, 0x04, 0x72, + 0x70, 0x42, 0xC6, 0x47, 0x32, 0x03, 0xA1, 0x72, 0xF2, 0x04, 0xC6, 0x45, 0x02, 0x02, 0xA1, 0x52, + 0x78, 0x52, 0x02, 0x00, 0xC6, 0x57, 0x32, 0x04, 0xA9, 0x72, 0x02, 0x00, 0xF2, 0x05, 0xC6, 0x56, + 0x02, 0x03, 0xA9, 0x62, 0x02, 0x00, 0xE1, 0xF0, 0x0C, 0x70, 0x00, 0x10, 0x14, 0x61, 0xA9, 0x67, + 0xD8, 0x04, 0xA9, 0x67, 0xDA, 0x04, 0xE1, 0xF0, 0x28, 0x70, 0x50, 0x16, 0x3C, 0x10, 0x24, 0x00, + 0x5C, 0x70, 0x10, 0x00, 0xA3, 0x77, 0xD9, 0xC1, 0x14, 0x00, 0xD9, 0x81, 0x04, 0x00, 0x06, 0xE2, + 0x06, 0xD3, 0x92, 0x08, 0x98, 0x60, 0x57, 0x16, 0x82, 0x09, 0x0C, 0x90, 0x64, 0x00, 0x06, 0xA7, + 0xF2, 0x09, 0x04, 0x70, 0x0C, 0x90, 0x73, 0x00, 0xF2, 0x04, 0x04, 0x71, 0x0C, 0x90, 0x69, 0x00, + 0x04, 0xA3, 0x20, 0x6E, 0x23, 0x77, 0x26, 0x67, 0xA1, 0x6E, 0x28, 0x6E, 0x02, 0x00, 0x06, 0x2E, + 0x26, 0x76, 0xA9, 0x7E, 0x02, 0x00, 0xEB, 0x22, 0x03, 0x00, 0xC4, 0xD1, 0x78, 0xCE, 0x02, 0x00, + 0x70, 0xDE, 0x92, 0x5A, 0x0C, 0xB0, 0x00, 0x10, 0x38, 0x6B, 0xD8, 0x04, 0x14, 0x71, 0xC6, 0x67, + 0x9A, 0xB0, 0x00, 0x00, 0xCC, 0xD0, 0x45, 0x00, 0x12, 0x0E, 0x1C, 0x70, 0x20, 0x00, 0x26, 0x7D, + 0x06, 0x27, 0x06, 0x67, 0x57, 0x22, 0xD7, 0x63, 0x26, 0x26, 0x26, 0x27, 0x26, 0x22, 0x1C, 0x30, + 0x46, 0x00, 0xF2, 0x10, 0xCC, 0xD0, 0x8A, 0x02, 0x02, 0x14, 0x0C, 0x70, 0xB0, 0x02, 0x36, 0x7D, + 0x06, 0x27, 0x06, 0x67, 0x57, 0x22, 0xD7, 0x63, 0x26, 0x26, 0x26, 0x27, 0x26, 0x22, 0x0C, 0x30, + 0x46, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x2C, 0x20, 0x68, 0x01, 0xA9, 0x2B, 0xD8, 0x04, 0xF2, 0x03, + 0xA9, 0xDB, 0xD8, 0x04, 0xCC, 0xC0, 0x63, 0x00, 0x12, 0x0E, 0x1C, 0x70, 0x23, 0x00, 0x26, 0x7C, + 0x06, 0x67, 0x57, 0x61, 0xD7, 0x72, 0x26, 0x76, 0x06, 0x27, 0x57, 0x22, 0x36, 0x27, 0x1C, 0x30, + 0x64, 0x00, 0xF2, 0x10, 0xCC, 0xC0, 0x9C, 0x04, 0x02, 0x14, 0x0C, 0x70, 0xDD, 0x04, 0x36, 0x7C, + 0x06, 0x67, 0x57, 0x61, 0xD7, 0x72, 0x26, 0x76, 0x06, 0x27, 0x57, 0x22, 0x36, 0x27, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x2C, 0x20, 0x80, 0x02, 0xA9, 0x2B, 0xDA, 0x04, 0xF2, 0x61, + 0xA9, 0xCB, 0xDA, 0x04, 0xF2, 0x5E, 0x0C, 0xB0, 0x80, 0x02, 0x0C, 0x80, 0x68, 0x01, 0xCC, 0x90, + 0x64, 0x00, 0x04, 0x60, 0x82, 0x04, 0x1C, 0x60, 0x64, 0x00, 0x26, 0x69, 0xC6, 0xD8, 0x3F, 0x78, + 0x0D, 0x00, 0x32, 0x02, 0x24, 0x71, 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, 0x2F, 0x92, 0x02, 0x00, + 0x26, 0x92, 0x06, 0x59, 0xC4, 0x20, 0xD7, 0x52, 0x26, 0x95, 0x26, 0x92, 0x82, 0x07, 0x06, 0x36, + 0xB1, 0x61, 0xAB, 0x9A, 0x00, 0x00, 0x30, 0x61, 0x26, 0x92, 0x04, 0x71, 0xD6, 0x7A, 0x82, 0x11, + 0x06, 0x29, 0x0C, 0x30, 0x64, 0x00, 0xB1, 0x61, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0xD8, 0x30, 0x61, + 0x22, 0x04, 0x26, 0x82, 0xA1, 0x8E, 0xF2, 0x05, 0x34, 0x81, 0x3F, 0x22, 0x08, 0x00, 0xA1, 0x2E, + 0xC6, 0xCB, 0x3F, 0x7B, 0x0C, 0x00, 0x32, 0x02, 0x24, 0x71, 0x86, 0x27, 0x32, 0x02, 0x16, 0x22, + 0x2F, 0xD2, 0x02, 0x00, 0x26, 0xD2, 0x06, 0x5D, 0xC4, 0x20, 0xD7, 0x52, 0x26, 0xD5, 0x26, 0xD2, + 0x82, 0x05, 0x06, 0x36, 0xAB, 0x9A, 0x00, 0x00, 0x26, 0xD2, 0xD4, 0xA2, 0x82, 0x17, 0x06, 0x2D, + 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xC6, 0xCB, 0x22, 0x05, 0x26, 0xB2, 0xA9, 0xBE, + 0x02, 0x00, 0xF2, 0x0C, 0x34, 0xB1, 0x3F, 0x22, 0x0B, 0x00, 0xA9, 0x2E, 0x02, 0x00, 0xF2, 0x06, + 0x28, 0x8B, 0xD8, 0x04, 0x28, 0xBB, 0xDA, 0x04, 0xF2, 0xA3, 0x58, 0xC1, 0x14, 0x00, 0x58, 0x81, + 0x04, 0x00, 0x2C, 0x10, 0x24, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0x08, 0xC0, 0x00, 0xFF, 0x0C, 0xE0, 0xD8, 0x15, 0x04, 0xD0, 0x2C, 0xC0, 0xFF, 0x0F, 0x28, 0x70, + 0xEC, 0x15, 0x63, 0x7D, 0xD4, 0x71, 0x82, 0x27, 0x30, 0x3E, 0x06, 0x73, 0x77, 0x76, 0x5C, 0x70, + 0xFF, 0x0F, 0xA1, 0x71, 0x0C, 0x70, 0xFF, 0x0F, 0x56, 0x73, 0xA9, 0x71, 0x02, 0x00, 0x18, 0x70, + 0x5B, 0x16, 0xC4, 0x71, 0x92, 0x05, 0x06, 0x21, 0x77, 0x3E, 0x4B, 0x26, 0x03, 0x00, 0x06, 0x21, + 0xEB, 0x22, 0x03, 0x00, 0x20, 0x61, 0x30, 0x7E, 0x5C, 0x60, 0xFF, 0x0F, 0x57, 0x66, 0x56, 0x7C, + 0x66, 0x76, 0x28, 0x61, 0x02, 0x00, 0x1C, 0x50, 0x00, 0x10, 0x5C, 0x60, 0xFF, 0x0F, 0x56, 0x75, + 0x66, 0x76, 0xB1, 0x7E, 0x24, 0xD1, 0xC4, 0xD5, 0x24, 0xE4, 0x92, 0xD2, 0x58, 0xC1, 0x04, 0x00, + 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x18, 0x0C, 0x20, 0xCD, 0x15, 0x14, 0x31, + 0x04, 0x45, 0xC1, 0xE1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, 0xC8, 0x15, 0x14, 0x31, + 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x38, 0x7E, 0xAC, 0x05, + 0x18, 0x6E, 0xA2, 0x05, 0x77, 0x76, 0x54, 0x7F, 0xA6, 0x76, 0x82, 0x0E, 0x04, 0x71, 0x99, 0x7E, + 0xEE, 0x05, 0xB9, 0x0E, 0xD4, 0x05, 0x0C, 0x20, 0xD8, 0x15, 0x04, 0x30, 0x0C, 0x40, 0x14, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x99, 0x0E, 0xA2, 0x05, 0xCB, 0xD4, 0x01, 0x00, 0x8B, 0x90, + 0x03, 0x00, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0xB1, 0xB1, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0xDE, 0xBF, 0x03, 0x82, 0x19, 0x06, 0x2C, 0x0C, 0x20, + 0x60, 0x13, 0x0C, 0x30, 0x10, 0x13, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, + 0x06, 0x2B, 0x0C, 0x20, 0xBA, 0x13, 0x0C, 0x30, 0xB5, 0x13, 0x04, 0x45, 0x0C, 0xF0, 0xEC, 0x00, + 0xF1, 0xF0, 0x18, 0x7E, 0xBF, 0x03, 0x99, 0x7E, 0xC0, 0x03, 0xF2, 0x2A, 0x06, 0x2B, 0x0C, 0x20, + 0xBA, 0x13, 0x06, 0x3D, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x06, 0x2C, 0x0C, 0x20, + 0x60, 0x13, 0x06, 0x3D, 0x0C, 0x40, 0x50, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0x20, + 0xB0, 0x13, 0x06, 0x3D, 0x04, 0x45, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x28, 0x7E, 0x06, 0x00, + 0x99, 0x0E, 0xC0, 0x03, 0x1C, 0x60, 0x14, 0x00, 0x56, 0x76, 0xA9, 0x7E, 0x06, 0x00, 0x38, 0x70, + 0x40, 0x16, 0x99, 0x0E, 0xA3, 0x05, 0x18, 0x77, 0xD5, 0x00, 0x99, 0x7E, 0xA6, 0x05, 0x58, 0xC1, + 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x10, 0x00, + 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x18, 0x7E, 0xEE, 0x05, 0x06, 0xD2, 0x26, 0x72, 0xC4, 0x70, + 0x0C, 0x20, 0xAC, 0x15, 0x82, 0x0E, 0x0C, 0x30, 0xD4, 0x15, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, + 0xEC, 0x00, 0xF1, 0xF0, 0x18, 0x7E, 0xEE, 0x05, 0x26, 0xD7, 0x99, 0xDE, 0xC6, 0x05, 0xF2, 0x14, + 0x98, 0x3E, 0xC6, 0x05, 0x82, 0x0C, 0x0C, 0x30, 0xD4, 0x15, 0x0C, 0x40, 0x1C, 0x00, 0x0C, 0xF0, + 0xEC, 0x00, 0xF1, 0xF0, 0x04, 0x71, 0x99, 0x7E, 0xEE, 0x05, 0xF2, 0x06, 0x0C, 0x40, 0x1C, 0x00, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, 0x06, 0xC2, 0x06, 0xE3, 0x06, 0x23, 0x06, 0x3C, + 0xB1, 0xB1, 0x0B, 0xC8, 0x03, 0x00, 0x86, 0x22, 0x9A, 0x82, 0x00, 0x00, 0xD4, 0xC3, 0x92, 0x05, + 0x18, 0x7E, 0x0D, 0x00, 0xC4, 0x76, 0x92, 0x5B, 0x18, 0x6E, 0x0A, 0x00, 0x14, 0x51, 0x26, 0x56, + 0x04, 0x71, 0x53, 0x75, 0x0C, 0x50, 0x00, 0x10, 0x28, 0x45, 0xEC, 0x05, 0x43, 0x77, 0x66, 0x47, + 0xA9, 0x45, 0xEC, 0x05, 0x38, 0x45, 0xD4, 0x05, 0x1C, 0x30, 0x00, 0x04, 0x66, 0x74, 0x5C, 0x70, + 0xFF, 0x03, 0x56, 0x43, 0x66, 0x47, 0x06, 0x74, 0x77, 0x76, 0x24, 0x71, 0x54, 0x7F, 0x1C, 0x30, + 0x01, 0xF0, 0x57, 0x76, 0x56, 0x43, 0x66, 0x47, 0x57, 0x61, 0xB9, 0x45, 0xD4, 0x05, 0x26, 0x65, + 0x18, 0x7E, 0x0A, 0x00, 0x38, 0x56, 0xD4, 0x05, 0x08, 0x40, 0xFF, 0x0F, 0x2C, 0x40, 0xFF, 0xFF, + 0x57, 0x7E, 0x56, 0x54, 0x66, 0x57, 0xB9, 0x56, 0xD4, 0x05, 0x20, 0x4E, 0x08, 0x70, 0x00, 0xFF, + 0x5C, 0x40, 0xFF, 0x0F, 0x2C, 0x70, 0xFF, 0x0F, 0x57, 0x46, 0x56, 0x75, 0x66, 0x74, 0xB9, 0x76, + 0xD4, 0x05, 0x28, 0x5E, 0x02, 0x00, 0x1C, 0x40, 0x00, 0x10, 0x5C, 0x50, 0xFF, 0x0F, 0x56, 0x74, + 0x66, 0x75, 0xB9, 0x76, 0xD4, 0x05, 0x18, 0x5E, 0x0B, 0x00, 0x13, 0x75, 0xC4, 0x7F, 0xC2, 0x02, + 0x04, 0x5F, 0x38, 0x76, 0xD4, 0x05, 0x08, 0x40, 0xFF, 0xF0, 0x54, 0x5F, 0x2C, 0x40, 0xFF, 0xFF, + 0x57, 0x5C, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0xD4, 0x05, 0xF2, 0x03, 0xC4, 0x7A, 0x82, 0x03, + 0x04, 0x20, 0xF2, 0x1D, 0x0C, 0xD0, 0x60, 0x13, 0x06, 0x7B, 0x0C, 0x70, 0x00, 0x10, 0x18, 0x77, + 0xC0, 0x03, 0xC6, 0xC7, 0x32, 0xF6, 0x18, 0x6E, 0x0A, 0x00, 0x18, 0x7D, 0x0A, 0x00, 0xC6, 0x67, + 0x92, 0x0A, 0x06, 0x2E, 0x06, 0x3D, 0x04, 0x44, 0x8B, 0xE0, 0x03, 0x00, 0x18, 0x7D, 0x0B, 0x00, + 0x99, 0x7E, 0x0B, 0x00, 0x24, 0xC1, 0x2C, 0xD0, 0x10, 0x00, 0xF2, 0xE7, 0x58, 0xC1, 0x04, 0x00, + 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x18, 0x72, 0x06, 0x00, 0xD4, 0x74, 0x82, 0x25, + 0x0C, 0x40, 0x00, 0x10, 0x38, 0x54, 0xD4, 0x05, 0x08, 0x60, 0x1F, 0xFF, 0x06, 0x75, 0xF7, 0x7A, + 0x24, 0x71, 0x54, 0x77, 0x2C, 0x60, 0xFF, 0xFF, 0xD7, 0x7A, 0x56, 0x65, 0x66, 0x67, 0xB9, 0x64, + 0xD4, 0x05, 0x18, 0x52, 0x05, 0x00, 0x04, 0x71, 0x34, 0x51, 0x53, 0x75, 0x06, 0x56, 0x77, 0x58, + 0x66, 0x75, 0x08, 0x50, 0xE0, 0xFF, 0x5C, 0x70, 0x1F, 0x00, 0x2C, 0x50, 0xFF, 0xFF, 0x57, 0x78, + 0x56, 0x56, 0x66, 0x57, 0xB9, 0x54, 0xD4, 0x05, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x0C, 0x60, 0x00, 0x10, 0x38, 0x76, 0xD4, 0x05, 0x77, 0x76, 0x54, 0x7F, 0xC4, 0x72, 0x02, 0x26, + 0x28, 0x46, 0xEC, 0x05, 0x04, 0x70, 0x0C, 0x30, 0xD8, 0x15, 0x06, 0x57, 0x04, 0xF1, 0x06, 0x24, + 0x63, 0x25, 0xD4, 0x21, 0x82, 0x0A, 0xC4, 0x71, 0xC2, 0x07, 0x06, 0x2F, 0x53, 0x25, 0x15, 0x22, + 0xB1, 0x03, 0x56, 0x42, 0xF2, 0x02, 0x24, 0x71, 0x24, 0x51, 0xC4, 0x55, 0x24, 0x34, 0x92, 0xF0, + 0x04, 0x5F, 0x56, 0x57, 0x38, 0x76, 0xD4, 0x05, 0xA9, 0x46, 0xEC, 0x05, 0x1C, 0x40, 0x01, 0xF0, + 0x57, 0x56, 0x56, 0x74, 0x66, 0x75, 0xB9, 0x76, 0xD4, 0x05, 0x38, 0x76, 0xD4, 0x05, 0x0C, 0x50, + 0x00, 0xF0, 0xD6, 0x57, 0x82, 0x06, 0x77, 0x76, 0x54, 0x7F, 0x24, 0x71, 0x99, 0x76, 0xEE, 0x05, + 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x20, 0x00, 0xD9, 0xC1, 0x10, 0x00, + 0xD1, 0x81, 0x0C, 0xE0, 0x00, 0x10, 0xE8, 0xCE, 0xCD, 0x05, 0x92, 0x2A, 0x98, 0x7E, 0xBF, 0x03, + 0x82, 0x27, 0x0C, 0x90, 0x60, 0x03, 0x0C, 0xD0, 0x10, 0x13, 0x26, 0x9E, 0x06, 0xBC, 0x04, 0x2C, + 0x26, 0x2D, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x13, 0xC4, 0xC1, 0xDA, 0x98, 0x00, 0x00, + 0x18, 0x7D, 0x0A, 0x00, 0x04, 0xA1, 0x26, 0xAB, 0x26, 0xBE, 0x99, 0x7B, 0xCD, 0x05, 0x04, 0x21, + 0x06, 0x3D, 0x8B, 0x44, 0x03, 0x00, 0xC4, 0x20, 0x92, 0x04, 0x24, 0xC1, 0xF2, 0x02, 0x06, 0xAB, + 0x2C, 0xD0, 0x10, 0x00, 0xC6, 0xD9, 0x8A, 0x83, 0x00, 0x00, 0x06, 0xBA, 0xF2, 0xE1, 0x98, 0x7E, + 0xC0, 0x03, 0x92, 0x04, 0x98, 0x7E, 0xBF, 0x03, 0x82, 0x7A, 0x04, 0xD0, 0x06, 0xCD, 0x06, 0xAE, + 0x14, 0x91, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, 0xCD, 0x05, 0x34, 0x71, 0xC4, 0x70, 0x32, 0x04, + 0x04, 0xC0, 0x06, 0xAE, 0xF2, 0x47, 0x26, 0x7A, 0x68, 0xB7, 0xB5, 0x03, 0x34, 0xB1, 0xC4, 0xB0, + 0x32, 0x1D, 0x68, 0x37, 0xBA, 0x03, 0x04, 0x24, 0x24, 0x34, 0x57, 0x32, 0x26, 0x3A, 0x2C, 0x30, + 0x10, 0x03, 0x8B, 0x44, 0x03, 0x00, 0xC4, 0x20, 0x92, 0x02, 0x24, 0xD1, 0x06, 0x7C, 0xC4, 0x73, + 0x12, 0x09, 0x24, 0x71, 0x2F, 0x67, 0x0E, 0x00, 0x18, 0x56, 0xCD, 0x05, 0x99, 0x56, 0xCC, 0x05, + 0xF2, 0xF7, 0x99, 0x9E, 0xD1, 0x05, 0x34, 0xC1, 0xF2, 0x12, 0x57, 0xB2, 0x26, 0xBA, 0x2C, 0xB0, + 0x10, 0x03, 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x82, 0x08, 0x04, 0x22, + 0x06, 0x3B, 0x8B, 0x44, 0x03, 0x00, 0xC4, 0x20, 0x92, 0x02, 0x24, 0xD1, 0x24, 0xC1, 0xC4, 0xC4, + 0x02, 0xC1, 0xF2, 0xC7, 0x57, 0x72, 0x2F, 0x9A, 0x07, 0x00, 0x0C, 0xB0, 0x10, 0x03, 0x26, 0xB9, + 0x04, 0x2C, 0x26, 0x2B, 0xEB, 0x26, 0x01, 0x00, 0xC4, 0x20, 0x92, 0x0C, 0x24, 0xC1, 0xC4, 0xC5, + 0x82, 0x26, 0x2F, 0x7C, 0x0E, 0x00, 0x68, 0x77, 0xB5, 0x03, 0x34, 0x71, 0xC4, 0x70, 0x32, 0xEB, + 0xF2, 0xF6, 0xC4, 0xD1, 0xD2, 0x1C, 0x04, 0x70, 0x2F, 0x67, 0x0E, 0x00, 0x68, 0x56, 0xCD, 0x05, + 0x14, 0x41, 0x26, 0x45, 0xC6, 0x4C, 0x82, 0xEB, 0xC4, 0x50, 0x12, 0x0D, 0x18, 0x79, 0x1A, 0x03, + 0x04, 0x21, 0x99, 0x76, 0xCD, 0x05, 0x06, 0x3B, 0x8B, 0x44, 0x03, 0x00, 0xC4, 0x20, 0x92, 0xDF, + 0x24, 0xD1, 0xF2, 0xDD, 0x24, 0x71, 0xC4, 0x75, 0x92, 0xE8, 0xF2, 0xD9, 0x04, 0x70, 0x06, 0x4E, + 0x24, 0x71, 0x06, 0x67, 0x2F, 0x34, 0x07, 0x00, 0x2F, 0x56, 0x0E, 0x00, 0xE8, 0x25, 0xCD, 0x05, + 0x02, 0x07, 0x68, 0xF3, 0xCC, 0x05, 0xC6, 0xF2, 0x92, 0x03, 0x99, 0x05, 0xCD, 0x05, 0x24, 0x61, + 0xC4, 0x64, 0x02, 0xF3, 0xC4, 0x74, 0x92, 0xED, 0x6B, 0x50, 0x03, 0x00, 0x58, 0xC1, 0x10, 0x00, + 0x50, 0x81, 0x2C, 0x10, 0x20, 0x00, 0xE1, 0xF0, 0x18, 0x20, 0xEE, 0x15, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x2C, 0x00, 0x06, 0x21, 0x04, 0x30, 0x0C, 0x40, 0x14, 0x00, 0xD9, 0xC1, 0x1C, 0x00, + 0xC9, 0xA1, 0x14, 0x00, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0x7E, + 0xEE, 0x05, 0x92, 0x0A, 0x98, 0x3E, 0xC6, 0x05, 0x92, 0x07, 0x0C, 0x20, 0xC8, 0x15, 0x04, 0x45, + 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x98, 0x7E, 0xEE, 0x05, 0x82, 0x66, 0x98, 0x7E, 0xC6, 0x05, + 0x82, 0x63, 0x28, 0xDE, 0xEC, 0x05, 0x04, 0x71, 0x08, 0xF0, 0xFF, 0x0F, 0x06, 0x32, 0x0C, 0x30, + 0xD8, 0x15, 0x04, 0x40, 0x06, 0xB7, 0x2C, 0xF0, 0xFF, 0xFF, 0x14, 0x61, 0x26, 0x67, 0x06, 0x5D, + 0x63, 0x56, 0x06, 0x65, 0xD4, 0x61, 0x82, 0x26, 0x13, 0x57, 0x04, 0x60, 0x2F, 0xC6, 0x0E, 0x00, + 0x68, 0xCC, 0xC8, 0x05, 0x24, 0x61, 0xC6, 0xC7, 0x82, 0x0C, 0xC4, 0x65, 0x92, 0xF8, 0x04, 0x60, + 0x2F, 0xC6, 0x0E, 0x00, 0xE8, 0xAC, 0xC8, 0x05, 0x24, 0x61, 0x92, 0x05, 0x99, 0x7C, 0xC8, 0x05, + 0x13, 0x56, 0xF2, 0x03, 0xC4, 0x65, 0x92, 0xF5, 0x14, 0xC1, 0x26, 0xC5, 0x06, 0x6B, 0x53, 0x6C, + 0x66, 0x64, 0x23, 0x46, 0x30, 0x63, 0x57, 0xC1, 0x57, 0x5E, 0x56, 0x6F, 0x26, 0xC1, 0x66, 0x65, + 0xB1, 0x6C, 0x24, 0x71, 0xC4, 0x76, 0x24, 0x34, 0x92, 0xD1, 0x04, 0x70, 0x06, 0x6D, 0x63, 0x67, + 0xD4, 0x61, 0x24, 0x71, 0x92, 0x0D, 0x2F, 0x56, 0x0E, 0x00, 0x68, 0x35, 0xC8, 0x05, 0xC6, 0x37, + 0x92, 0x04, 0x99, 0x05, 0xC8, 0x05, 0xF2, 0x04, 0x24, 0x61, 0xC4, 0x65, 0x92, 0xF5, 0xC4, 0x75, + 0x92, 0xEE, 0x38, 0x7E, 0xD4, 0x05, 0x1C, 0x60, 0x00, 0x04, 0x5C, 0x40, 0xFF, 0x03, 0x56, 0x76, + 0x66, 0x74, 0xB9, 0x7E, 0xD4, 0x05, 0x0C, 0x20, 0xD8, 0x15, 0x06, 0x31, 0x0C, 0x40, 0x14, 0x00, + 0x0C, 0xF0, 0xEC, 0x00, 0xF1, 0xF0, 0x58, 0xC1, 0x1C, 0x00, 0x48, 0xA1, 0x14, 0x00, 0x2C, 0x10, + 0x2C, 0x00, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0xE0, 0x00, 0x10, 0x98, 0x7E, + 0xA1, 0x05, 0x82, 0x74, 0x0C, 0xC0, 0x78, 0x15, 0x04, 0xD0, 0x18, 0x7E, 0xA1, 0x05, 0xC6, 0xD7, + 0x32, 0x07, 0x06, 0x2C, 0xCB, 0x4D, 0x03, 0x00, 0x24, 0xD1, 0x24, 0xC8, 0xF2, 0xF7, 0x38, 0x6E, + 0xD4, 0x05, 0x08, 0x70, 0xE0, 0x00, 0xD6, 0x76, 0x82, 0x57, 0x08, 0x70, 0x1F, 0xFF, 0x2C, 0x70, + 0xFF, 0xFF, 0x08, 0x50, 0xE0, 0xFF, 0x56, 0x67, 0x2C, 0x50, 0xFF, 0xFF, 0x56, 0x65, 0xB9, 0x6E, + 0xD4, 0x05, 0x28, 0xF0, 0x44, 0x16, 0x38, 0x40, 0x40, 0x16, 0x0C, 0x20, 0x80, 0x02, 0x26, 0xFF, + 0x26, 0xF2, 0x70, 0xDF, 0x28, 0xF4, 0x3C, 0x00, 0xC6, 0xDF, 0x22, 0x0B, 0x56, 0x76, 0x08, 0x60, + 0x20, 0x00, 0x66, 0x76, 0x56, 0x75, 0x08, 0x60, 0x01, 0x00, 0x66, 0x76, 0xB9, 0x7E, 0xD4, 0x05, + 0x0C, 0x30, 0x44, 0x16, 0x28, 0x73, 0x02, 0x00, 0x26, 0x77, 0x26, 0x27, 0x70, 0x62, 0x28, 0x74, + 0x3C, 0x00, 0xC6, 0x67, 0x22, 0x13, 0x38, 0x5E, 0xD4, 0x05, 0x08, 0x70, 0x1F, 0xFF, 0x06, 0x65, + 0xF7, 0x6A, 0x24, 0x61, 0x54, 0x67, 0x2C, 0x70, 0xFF, 0xFF, 0xD7, 0x6A, 0x56, 0x75, 0x66, 0x76, + 0x04, 0x62, 0x57, 0x68, 0x66, 0x76, 0xB9, 0x7E, 0xD4, 0x05, 0xB8, 0x7E, 0xD4, 0x05, 0x82, 0x12, + 0x38, 0x6E, 0xA8, 0x05, 0xC6, 0x67, 0x92, 0x0E, 0x08, 0x70, 0x1F, 0xFF, 0x2C, 0x70, 0xFF, 0xFF, + 0x56, 0x76, 0x08, 0x60, 0xE0, 0xFF, 0x2C, 0x60, 0xFF, 0xFF, 0x56, 0x76, 0xB9, 0x7E, 0xD4, 0x05, + 0xF2, 0x03, 0xB9, 0x7E, 0xA8, 0x05, 0x38, 0x7E, 0xD4, 0x05, 0x08, 0x60, 0xE0, 0x00, 0xD6, 0x76, + 0x82, 0x13, 0x98, 0x7E, 0xEE, 0x05, 0x92, 0x10, 0xF2, 0x09, 0x98, 0x7E, 0xEE, 0x05, 0x92, 0x0A, + 0x98, 0x7E, 0xA2, 0x05, 0x82, 0x07, 0xB9, 0x0E, 0xA8, 0x05, 0x04, 0x71, 0x99, 0x7E, 0xEE, 0x05, + 0xF2, 0x03, 0xB9, 0x0E, 0xA8, 0x05, 0x18, 0x7E, 0xA1, 0x05, 0x99, 0x7E, 0xA2, 0x05, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x34, 0x14, 0x0C, 0x20, + 0xC6, 0x13, 0x04, 0x30, 0x04, 0x4D, 0xB1, 0xF1, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0x30, 0xF1, + 0x0C, 0x70, 0x00, 0x10, 0x14, 0x61, 0x99, 0x67, 0xC7, 0x03, 0x99, 0x67, 0xC6, 0x03, 0x99, 0x67, + 0xC9, 0x03, 0x99, 0x67, 0xC8, 0x03, 0x24, 0x14, 0xE1, 0xF0, 0x00, 0x00, 0xC4, 0x41, 0x34, 0x14, + 0xB1, 0xF1, 0x02, 0x09, 0xC4, 0x4F, 0x14, 0x72, 0x26, 0x74, 0x13, 0x77, 0x0C, 0xF0, 0x11, 0x00, + 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, 0x24, 0x42, 0x13, 0xF4, 0x08, 0x60, 0x00, 0x30, 0x2C, 0x60, + 0x00, 0xA0, 0xC6, 0x7F, 0xD2, 0x16, 0x2F, 0x57, 0x07, 0x00, 0x26, 0x57, 0x57, 0x51, 0x26, 0x57, + 0x26, 0x53, 0x57, 0x51, 0x26, 0x56, 0x30, 0x55, 0x5C, 0x50, 0xFF, 0x7F, 0xC6, 0x25, 0xB2, 0x06, + 0x04, 0x61, 0x99, 0x60, 0xCE, 0x13, 0x04, 0x21, 0xF2, 0x05, 0x24, 0x71, 0x23, 0x77, 0xF2, 0xEA, + 0x04, 0x20, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0xC4, 0x41, 0x34, 0x14, 0xB1, 0xF1, 0x02, 0x08, + 0xC4, 0x4A, 0x14, 0x72, 0x26, 0x74, 0x13, 0x77, 0x04, 0xFC, 0x12, 0x05, 0xF2, 0x02, 0x04, 0x70, + 0x24, 0x42, 0x13, 0xF4, 0x2F, 0x63, 0x03, 0x00, 0x26, 0x63, 0x57, 0x61, 0x26, 0x36, 0x08, 0x60, + 0x00, 0x30, 0x2C, 0x60, 0x00, 0xA0, 0xC6, 0x7F, 0xD2, 0x12, 0x2F, 0x57, 0x03, 0x00, 0x57, 0x51, + 0x26, 0x56, 0x30, 0x55, 0x5C, 0x50, 0xFF, 0x7F, 0xC6, 0x25, 0xB2, 0x06, 0x04, 0x61, 0x99, 0x60, + 0xCE, 0x13, 0x04, 0x21, 0xF2, 0x05, 0x24, 0x71, 0x23, 0x77, 0xF2, 0xEE, 0x04, 0x20, 0x30, 0xF1, + 0x24, 0x14, 0xE1, 0xF0, 0x3C, 0x10, 0x28, 0x00, 0xD9, 0xC1, 0x18, 0x00, 0xD9, 0x81, 0x08, 0x00, + 0x6B, 0xBD, 0x00, 0x00, 0x0C, 0xE0, 0x00, 0x10, 0x28, 0x7E, 0x1E, 0x00, 0xB1, 0x21, 0xC4, 0x7F, + 0xC2, 0x12, 0x98, 0x70, 0x63, 0x16, 0x82, 0x0F, 0x38, 0x7E, 0xD4, 0x05, 0x5C, 0x70, 0x00, 0xF0, + 0xCC, 0x70, 0x00, 0x10, 0x92, 0x08, 0x04, 0x71, 0x99, 0x7E, 0xD0, 0x03, 0x99, 0x0E, 0xCD, 0x03, + 0x99, 0x7E, 0xCE, 0x03, 0x18, 0x7E, 0xCB, 0x03, 0xC4, 0x72, 0xC2, 0x08, 0x04, 0x71, 0x99, 0x0E, + 0xCD, 0x03, 0x99, 0x7E, 0xCE, 0x03, 0x99, 0x0E, 0xD0, 0x03, 0x98, 0x7E, 0xD0, 0x03, 0x82, 0x12, + 0x98, 0x7E, 0xCF, 0x03, 0x82, 0x0F, 0x98, 0x7E, 0xCE, 0x03, 0x82, 0x0C, 0x04, 0x71, 0x99, 0x0E, + 0xD0, 0x03, 0x99, 0x7E, 0xCD, 0x03, 0x99, 0x0E, 0xCE, 0x03, 0x6B, 0x42, 0x01, 0x00, 0x4B, 0x39, + 0x03, 0x00, 0x98, 0x7E, 0xCE, 0x03, 0x9A, 0xC9, 0x00, 0x00, 0x98, 0x7E, 0xCD, 0x03, 0x9A, 0xC5, + 0x00, 0x00, 0x18, 0x7E, 0xCA, 0x03, 0xC4, 0x71, 0x9A, 0xC0, 0x00, 0x00, 0x18, 0x7E, 0x05, 0x00, + 0xC4, 0x71, 0x9A, 0xBB, 0x00, 0x00, 0x18, 0x6E, 0x19, 0x03, 0x18, 0x5E, 0x18, 0x03, 0xC4, 0x60, + 0x82, 0x08, 0xCC, 0x60, 0x11, 0x00, 0x14, 0x71, 0x26, 0x76, 0x13, 0xB7, 0x82, 0x07, 0xF2, 0x02, + 0x06, 0xB6, 0x04, 0xA1, 0x26, 0xA6, 0x13, 0xAA, 0xF2, 0x04, 0x0C, 0xB0, 0x10, 0x00, 0x06, 0xA6, + 0xC4, 0x50, 0x82, 0x07, 0xC4, 0x5A, 0x14, 0xC1, 0x26, 0xC5, 0x13, 0xCC, 0x82, 0x07, 0xF2, 0x02, + 0x06, 0xC5, 0x04, 0x91, 0x26, 0x95, 0x13, 0x99, 0xF2, 0x03, 0x04, 0xC9, 0x06, 0x95, 0x2F, 0x46, + 0x06, 0x00, 0x26, 0x46, 0x57, 0x41, 0x26, 0x64, 0x26, 0x56, 0x08, 0x80, 0x00, 0x30, 0x57, 0x51, + 0x2C, 0x80, 0x00, 0xA0, 0x26, 0x58, 0x30, 0xD5, 0x04, 0x50, 0x5C, 0xD0, 0xFF, 0x7F, 0xC6, 0xBA, + 0xD2, 0x67, 0x2F, 0x6B, 0x0B, 0x00, 0x30, 0x31, 0x28, 0x2E, 0xE4, 0x01, 0x26, 0x6B, 0x57, 0x61, + 0x2F, 0xFB, 0x06, 0x00, 0x23, 0x33, 0x06, 0x6C, 0xC6, 0x69, 0xD2, 0x56, 0x2F, 0x46, 0x0F, 0x00, + 0x57, 0x41, 0x26, 0x48, 0x30, 0x44, 0x5C, 0x40, 0xFF, 0x7F, 0xC6, 0x42, 0xA2, 0x4A, 0xC6, 0x43, + 0x92, 0x48, 0x18, 0x4E, 0x19, 0x03, 0xC6, 0x4B, 0x92, 0x05, 0x18, 0x5E, 0x18, 0x03, 0xC6, 0x56, + 0x82, 0x3B, 0x18, 0x6E, 0xCC, 0x03, 0x04, 0x51, 0xD6, 0x56, 0x82, 0x13, 0x18, 0x3E, 0x18, 0x03, + 0x24, 0x32, 0x13, 0x33, 0xC4, 0x3A, 0xC2, 0x07, 0x18, 0x6E, 0xCC, 0x03, 0x04, 0x54, 0xD6, 0x56, + 0x92, 0x10, 0xF2, 0x1C, 0x06, 0x2D, 0xEB, 0x74, 0x03, 0x00, 0xC4, 0x20, 0x82, 0xF6, 0xF2, 0x27, + 0xD4, 0x62, 0x82, 0xF3, 0x18, 0x3E, 0x18, 0x03, 0x06, 0x2D, 0x34, 0x32, 0x13, 0x33, 0xF2, 0xF4, + 0x18, 0x3E, 0x19, 0x03, 0x24, 0x32, 0x13, 0x33, 0xCC, 0x30, 0x11, 0x00, 0xC2, 0x05, 0x98, 0x6E, + 0xCE, 0x03, 0x82, 0x12, 0xF2, 0x14, 0x06, 0x2D, 0xF2, 0x08, 0xD4, 0x68, 0x82, 0xF9, 0x18, 0x3E, + 0x19, 0x03, 0x06, 0x2D, 0x34, 0x32, 0x13, 0x33, 0x18, 0x4E, 0x18, 0x03, 0xCB, 0x77, 0x03, 0x00, + 0xC4, 0x20, 0x92, 0x05, 0xF2, 0xED, 0x04, 0x61, 0x99, 0x6E, 0xCD, 0x03, 0x04, 0x51, 0xF2, 0x04, + 0x24, 0x61, 0x13, 0x66, 0xF2, 0xAA, 0x04, 0x71, 0x26, 0x7B, 0x13, 0xB7, 0xF2, 0x99, 0x98, 0x7E, + 0xCD, 0x03, 0x82, 0x0D, 0x18, 0x7E, 0xD2, 0x03, 0xC4, 0x71, 0x92, 0x09, 0xB9, 0x51, 0x04, 0x00, + 0x6B, 0x42, 0x01, 0x00, 0x4B, 0x39, 0x03, 0x00, 0x38, 0x51, 0x04, 0x00, 0x98, 0x7E, 0xCD, 0x03, + 0x92, 0x0C, 0xC4, 0x50, 0x92, 0x0A, 0x30, 0x61, 0x28, 0x7E, 0xE4, 0x01, 0x23, 0xB6, 0xC6, 0x7B, + 0xD2, 0x04, 0x04, 0x71, 0x99, 0x7E, 0xCE, 0x03, 0x38, 0x6E, 0xD4, 0x05, 0x06, 0x76, 0x5C, 0x60, + 0x00, 0xF0, 0x77, 0x76, 0xCC, 0x60, 0x00, 0x10, 0x54, 0x7F, 0x99, 0x7E, 0xD2, 0x03, 0x92, 0x11, + 0x18, 0x6E, 0xC9, 0x03, 0x28, 0x7E, 0x18, 0x03, 0xCC, 0x60, 0xFF, 0x00, 0xA9, 0x7E, 0xC6, 0x03, + 0x92, 0x08, 0x18, 0x6E, 0xC8, 0x03, 0xCC, 0x60, 0xFF, 0x00, 0x92, 0x03, 0xA9, 0x7E, 0xC8, 0x03, + 0x58, 0xC1, 0x18, 0x00, 0x58, 0x81, 0x08, 0x00, 0x2C, 0x10, 0x28, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x0C, 0x60, 0x00, 0x10, 0x57, 0x22, 0xA8, 0xD6, 0xEC, 0x05, + 0x2C, 0x20, 0xDC, 0x04, 0x2F, 0xE6, 0x02, 0x00, 0x14, 0x71, 0xA9, 0x7E, 0x04, 0x00, 0xA9, 0x7E, + 0x06, 0x00, 0xA9, 0x7E, 0x08, 0x00, 0xA9, 0x7E, 0x0A, 0x00, 0xA1, 0x0E, 0xA9, 0x0E, 0x02, 0x00, + 0x92, 0x0F, 0x0C, 0x20, 0x32, 0x15, 0x06, 0x3D, 0x04, 0x48, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, + 0x0C, 0x20, 0x3A, 0x15, 0x06, 0x3D, 0x04, 0x4A, 0x0C, 0xF0, 0x2C, 0x01, 0xF1, 0xF0, 0xA9, 0x0E, + 0x0C, 0x00, 0xA9, 0x0E, 0x0E, 0x00, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x34, 0x18, 0xC1, 0xE1, 0x04, 0xE0, 0x06, 0x2E, 0x8B, 0x8D, 0x03, 0x00, 0x24, 0xE1, 0xC4, 0xE5, + 0x92, 0xFB, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x3C, 0x10, 0x18, 0x00, 0xB9, 0x31, 0x04, 0x00, + 0xD9, 0xC1, 0x08, 0x00, 0x18, 0xD1, 0x04, 0x00, 0xB1, 0x21, 0x23, 0xC2, 0xC6, 0x4D, 0x28, 0x31, + 0x02, 0x00, 0x18, 0xE1, 0x05, 0x00, 0x32, 0x03, 0x43, 0x2E, 0xF2, 0x11, 0xC6, 0x4C, 0x22, 0x03, + 0x43, 0x23, 0xF2, 0x0D, 0x3F, 0x2D, 0x04, 0x00, 0x36, 0x3E, 0xAB, 0x9A, 0x00, 0x00, 0x43, 0x22, + 0x3F, 0x3D, 0x0C, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x26, 0x2E, 0x43, 0x22, 0x58, 0xC1, 0x08, 0x00, + 0x2C, 0x10, 0x18, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x40, 0x16, 0x3C, 0x10, 0x78, 0x00, + 0xD9, 0xC1, 0x68, 0x00, 0xD9, 0x81, 0x58, 0x00, 0x30, 0x77, 0xDC, 0x70, 0x00, 0x08, 0x8A, 0xC1, + 0x02, 0x00, 0xC4, 0x30, 0x92, 0x0C, 0xC4, 0x20, 0x9A, 0xBC, 0x02, 0x00, 0xA8, 0x70, 0xEC, 0x15, + 0x9A, 0xB8, 0x02, 0x00, 0x8B, 0x90, 0x03, 0x00, 0xFA, 0xB4, 0x02, 0x00, 0x98, 0x70, 0x63, 0x16, + 0x0C, 0xE0, 0x00, 0x10, 0x82, 0x20, 0x28, 0x7E, 0x1E, 0x00, 0xC4, 0x79, 0xC2, 0x07, 0x04, 0x7A, + 0x99, 0x7E, 0x30, 0x05, 0x0C, 0x70, 0xFA, 0x00, 0xF2, 0x25, 0xC4, 0x75, 0x04, 0x7A, 0x99, 0x7E, + 0x30, 0x05, 0xC2, 0x0A, 0x0C, 0x70, 0xDC, 0x00, 0xA9, 0x7E, 0x2C, 0x05, 0x99, 0x0E, 0x31, 0x05, + 0x0C, 0x70, 0x78, 0x00, 0xF2, 0x2E, 0x0C, 0x70, 0xB4, 0x00, 0xA9, 0x7E, 0x2C, 0x05, 0x99, 0x0E, + 0x31, 0x05, 0xF2, 0x25, 0x98, 0x7E, 0xEE, 0x02, 0x92, 0x07, 0x28, 0x7E, 0x06, 0x00, 0x0C, 0x60, + 0x10, 0x00, 0xD6, 0x67, 0x82, 0x0E, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x30, 0x05, 0x0C, 0x70, + 0x64, 0x00, 0xA9, 0x7E, 0x2C, 0x05, 0x99, 0x0E, 0x31, 0x05, 0x0C, 0x70, 0x50, 0x00, 0xF2, 0x11, + 0xD4, 0x78, 0x0C, 0x70, 0x14, 0x00, 0x99, 0x7E, 0x30, 0x05, 0x0C, 0x70, 0x64, 0x00, 0xA9, 0x7E, + 0x2C, 0x05, 0x0C, 0x70, 0x1E, 0x00, 0x99, 0x7E, 0x31, 0x05, 0x82, 0x2F, 0x0C, 0x70, 0x96, 0x00, + 0xA9, 0x7E, 0x2E, 0x05, 0x0C, 0x70, 0xE0, 0x14, 0xB9, 0x71, 0x1C, 0x00, 0x0C, 0x70, 0xE2, 0x14, + 0xB9, 0x71, 0x18, 0x00, 0x0C, 0x70, 0x3A, 0x15, 0xB9, 0x71, 0x34, 0x00, 0x0C, 0x70, 0x2C, 0x15, + 0xB9, 0x71, 0x0C, 0x00, 0x0C, 0x70, 0xE4, 0x14, 0xB9, 0x71, 0x30, 0x00, 0x08, 0x60, 0x00, 0xFF, + 0x04, 0x50, 0x0C, 0x70, 0xE6, 0x14, 0x2C, 0x60, 0xFF, 0x0F, 0x06, 0xDE, 0xB9, 0x71, 0x2C, 0x00, + 0xB9, 0x51, 0x04, 0x00, 0xB9, 0x51, 0x14, 0x00, 0xB9, 0x51, 0x40, 0x00, 0xB9, 0x51, 0x3C, 0x00, + 0x06, 0xB5, 0xB9, 0x61, 0x38, 0x00, 0xF2, 0x04, 0x0C, 0x70, 0xC8, 0x00, 0xF2, 0xD2, 0x28, 0x7E, + 0xEC, 0x05, 0x63, 0x7B, 0xD4, 0x71, 0x92, 0x06, 0x06, 0x2B, 0x8B, 0x8D, 0x03, 0x00, 0xFA, 0xF9, + 0x01, 0x00, 0x04, 0x71, 0x26, 0x7B, 0x57, 0x71, 0x26, 0x7E, 0x38, 0x67, 0xD4, 0x05, 0x06, 0x76, + 0x77, 0x76, 0x5C, 0x70, 0xFF, 0x0F, 0x43, 0x57, 0x5C, 0x60, 0xFF, 0x0F, 0xB9, 0x51, 0x24, 0x00, + 0x43, 0x56, 0xB9, 0x51, 0x28, 0x00, 0xF8, 0x5D, 0xE0, 0x04, 0x32, 0x20, 0x38, 0x51, 0x24, 0x00, + 0x38, 0x41, 0x1C, 0x00, 0xA1, 0x54, 0x38, 0x51, 0x28, 0x00, 0x38, 0x41, 0x18, 0x00, 0xA1, 0x54, + 0x38, 0x51, 0x24, 0x00, 0x38, 0x41, 0x30, 0x00, 0xA1, 0x54, 0x38, 0x51, 0x28, 0x00, 0x38, 0x41, + 0x2C, 0x00, 0xA1, 0x54, 0x38, 0x41, 0x0C, 0x00, 0xA9, 0x0D, 0xDC, 0x04, 0xA9, 0x0D, 0xDE, 0x04, + 0x04, 0x51, 0x99, 0x54, 0x0E, 0x00, 0x99, 0x54, 0x0F, 0x00, 0x78, 0x5D, 0xE4, 0x04, 0x36, 0x75, + 0xB9, 0x71, 0x08, 0x00, 0x78, 0x7D, 0xE6, 0x04, 0xB8, 0xA1, 0x08, 0x00, 0x36, 0x67, 0xB9, 0x61, + 0x10, 0x00, 0x32, 0x02, 0x16, 0xAA, 0x38, 0x51, 0x10, 0x00, 0x86, 0x65, 0xB9, 0x51, 0x20, 0x00, + 0x32, 0x04, 0x16, 0x76, 0xB9, 0x71, 0x20, 0x00, 0x38, 0x51, 0x20, 0x00, 0x43, 0x2A, 0x43, 0x35, + 0x0C, 0xF0, 0x80, 0x00, 0xF1, 0xF0, 0x98, 0x70, 0x63, 0x16, 0x06, 0x82, 0xB9, 0x71, 0x44, 0x00, + 0x82, 0x26, 0x38, 0x2E, 0x2C, 0x05, 0x38, 0x3E, 0x30, 0x05, 0x06, 0x48, 0x4B, 0x91, 0x03, 0x00, + 0x28, 0x7E, 0x1E, 0x00, 0x06, 0x92, 0xC4, 0x77, 0xC2, 0x0C, 0x06, 0x78, 0xF7, 0x7F, 0x2F, 0x48, + 0x07, 0x00, 0xE7, 0x40, 0x38, 0x2E, 0x2C, 0x05, 0x38, 0x3E, 0x30, 0x05, 0x43, 0x44, 0xF2, 0x0B, + 0x04, 0x33, 0x2F, 0x28, 0x08, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x42, 0x38, 0x3E, 0x30, 0x05, + 0x38, 0x2E, 0x2C, 0x05, 0x4B, 0x91, 0x03, 0x00, 0x06, 0xC2, 0xF2, 0x36, 0x98, 0x7E, 0xEE, 0x02, + 0x92, 0x06, 0x28, 0x7E, 0x06, 0x00, 0xDC, 0x70, 0x10, 0x00, 0x82, 0x0C, 0x86, 0x88, 0x32, 0x02, + 0x24, 0x83, 0x06, 0x48, 0x67, 0x41, 0x38, 0x2E, 0x2C, 0x05, 0x38, 0x3E, 0x30, 0x05, 0x43, 0x44, + 0xF2, 0x1F, 0x28, 0x7E, 0x1E, 0x00, 0xC4, 0x77, 0xC2, 0x16, 0x04, 0x33, 0x26, 0x22, 0x4B, 0xA1, + 0x00, 0x00, 0x43, 0x42, 0x38, 0x3E, 0x30, 0x05, 0x38, 0x2E, 0x2C, 0x05, 0x4B, 0x91, 0x03, 0x00, + 0x06, 0xC2, 0x38, 0x3E, 0x30, 0x05, 0x38, 0x2E, 0x2C, 0x05, 0x06, 0x48, 0x4B, 0x91, 0x03, 0x00, + 0x06, 0x92, 0xF2, 0x0A, 0x38, 0x2E, 0x2C, 0x05, 0x38, 0x3E, 0x30, 0x05, 0x06, 0x48, 0x4B, 0x91, + 0x03, 0x00, 0x06, 0xC2, 0x06, 0x92, 0x18, 0x7E, 0xC3, 0x03, 0xC4, 0x72, 0xD2, 0x0F, 0x38, 0x60, + 0x40, 0x16, 0x78, 0x56, 0xBC, 0x00, 0xA9, 0x5E, 0x34, 0x05, 0xA9, 0x5E, 0x32, 0x05, 0x78, 0x66, + 0xBE, 0x00, 0xA9, 0x6E, 0x38, 0x05, 0xA9, 0x6E, 0x36, 0x05, 0x38, 0x60, 0x40, 0x16, 0x78, 0x2E, + 0x32, 0x05, 0x18, 0x56, 0xB9, 0x00, 0x18, 0x76, 0xBB, 0x00, 0x18, 0x66, 0xBA, 0x00, 0xB9, 0x51, + 0x4C, 0x00, 0x06, 0x35, 0x2F, 0x86, 0x05, 0x00, 0x26, 0x87, 0xB9, 0x71, 0x54, 0x00, 0xB9, 0x61, + 0x50, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x61, 0x50, 0x00, 0x06, 0x42, 0x78, 0x2E, 0x36, 0x05, + 0xB9, 0x41, 0x48, 0x00, 0x06, 0x36, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, 0x38, 0x41, + 0x48, 0x00, 0x06, 0x39, 0x26, 0x42, 0x06, 0x27, 0xB9, 0x41, 0x48, 0x00, 0xAB, 0x9A, 0x00, 0x00, + 0x38, 0x41, 0x48, 0x00, 0x43, 0x22, 0x26, 0x24, 0x06, 0x38, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x51, + 0x4C, 0x00, 0x43, 0x92, 0x78, 0x2E, 0x34, 0x05, 0x06, 0x35, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x61, + 0x50, 0x00, 0x06, 0x52, 0x78, 0x2E, 0x38, 0x05, 0xB9, 0x51, 0x4C, 0x00, 0x06, 0x36, 0xAB, 0x9A, + 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, 0x38, 0x51, 0x4C, 0x00, 0x06, 0x3C, 0x26, 0x52, 0x06, 0x27, + 0xB9, 0x51, 0x4C, 0x00, 0xAB, 0x9A, 0x00, 0x00, 0x38, 0x51, 0x4C, 0x00, 0x43, 0x22, 0x26, 0x25, + 0x06, 0x38, 0x4B, 0xA1, 0x00, 0x00, 0x43, 0x72, 0x06, 0x39, 0x06, 0x2A, 0xB9, 0x71, 0x54, 0x00, + 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x38, 0x71, 0x54, 0x00, + 0x06, 0x62, 0x06, 0x82, 0x38, 0x21, 0x20, 0x00, 0xB9, 0x61, 0x50, 0x00, 0x06, 0x37, 0xAB, 0x9A, + 0x00, 0x00, 0x0C, 0x30, 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0xB8, 0x51, 0x44, 0x00, 0x38, 0x61, + 0x50, 0x00, 0x38, 0x71, 0x54, 0x00, 0x06, 0xC2, 0x92, 0x10, 0xC4, 0x60, 0x92, 0x05, 0xC4, 0xA4, + 0x04, 0x81, 0x12, 0x02, 0x06, 0x85, 0xC4, 0xC0, 0x92, 0x08, 0x38, 0x51, 0x20, 0x00, 0x04, 0x61, + 0xC4, 0x54, 0x12, 0x02, 0x06, 0x6C, 0x06, 0xC6, 0x38, 0x51, 0x04, 0x00, 0x06, 0x69, 0xC6, 0x95, + 0x32, 0x02, 0x06, 0x65, 0x38, 0x51, 0x14, 0x00, 0x43, 0x66, 0xC6, 0x75, 0xB9, 0x61, 0x04, 0x00, + 0x06, 0x67, 0x32, 0x02, 0x06, 0x65, 0x43, 0x66, 0xB9, 0x61, 0x14, 0x00, 0x38, 0x41, 0x0C, 0x00, + 0x38, 0x61, 0x08, 0x00, 0x38, 0x71, 0x10, 0x00, 0x68, 0x54, 0x0E, 0x00, 0x15, 0xA6, 0xF7, 0xAF, + 0x33, 0x6A, 0xC6, 0x56, 0x15, 0x97, 0xF7, 0x9F, 0x33, 0x79, 0x92, 0x04, 0x04, 0x51, 0xB9, 0x51, + 0x3C, 0x00, 0x38, 0x41, 0x0C, 0x00, 0x68, 0x54, 0x0F, 0x00, 0xC6, 0x57, 0x92, 0x04, 0x04, 0x51, + 0xB9, 0x51, 0x40, 0x00, 0x38, 0x51, 0x34, 0x00, 0x04, 0x44, 0x91, 0x65, 0x2F, 0x6B, 0x0B, 0x00, + 0x26, 0x6E, 0x99, 0x76, 0x3B, 0x05, 0x0C, 0x60, 0xE4, 0x04, 0x26, 0x6D, 0x06, 0x36, 0x06, 0x21, + 0xB9, 0x61, 0x08, 0x00, 0x8B, 0xE0, 0x03, 0x00, 0x6B, 0xBD, 0x00, 0x00, 0x18, 0x7E, 0xC4, 0x03, + 0xC4, 0x71, 0x20, 0x71, 0xD2, 0x19, 0x28, 0x6E, 0xE4, 0x01, 0x23, 0x22, 0xC6, 0x62, 0xC2, 0x14, + 0x98, 0x6E, 0xCD, 0x03, 0x92, 0x11, 0x78, 0x6D, 0xDC, 0x04, 0xC6, 0x68, 0x02, 0x05, 0xB8, 0x51, + 0x3C, 0x00, 0x82, 0x02, 0x06, 0x86, 0x78, 0x6D, 0xDE, 0x04, 0xC6, 0x6C, 0x02, 0x05, 0xB8, 0x51, + 0x40, 0x00, 0x82, 0x02, 0x06, 0xC6, 0xC4, 0xA0, 0x92, 0x02, 0x16, 0x88, 0x23, 0x88, 0xC4, 0x90, + 0x26, 0x87, 0xA1, 0x81, 0x28, 0x71, 0x02, 0x00, 0x92, 0x02, 0x16, 0xCC, 0x23, 0xCC, 0x26, 0xC7, + 0x06, 0x21, 0xA9, 0xC1, 0x02, 0x00, 0xEB, 0x22, 0x03, 0x00, 0x78, 0x7D, 0xE4, 0x04, 0x70, 0xA1, + 0x3F, 0x77, 0x0A, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, 0xA9, 0x7D, 0xDC, 0x04, 0x78, 0xC1, + 0x02, 0x00, 0x78, 0x7D, 0xE6, 0x04, 0x3F, 0x77, 0x0C, 0x00, 0xC4, 0x70, 0x32, 0x02, 0x16, 0x77, + 0xA9, 0x7D, 0xDE, 0x04, 0x38, 0x61, 0x24, 0x00, 0x38, 0x71, 0x1C, 0x00, 0x38, 0x51, 0x28, 0x00, + 0x38, 0x21, 0x08, 0x00, 0xA1, 0x67, 0x38, 0x61, 0x18, 0x00, 0x04, 0x44, 0xA1, 0x56, 0x06, 0x31, + 0x8B, 0xE0, 0x03, 0x00, 0x04, 0x71, 0x26, 0x7B, 0x57, 0x71, 0x2F, 0x67, 0x0E, 0x00, 0x38, 0x76, + 0xD4, 0x05, 0x38, 0x51, 0x38, 0x00, 0x5C, 0xA0, 0xFF, 0x0F, 0x57, 0xA6, 0x56, 0x75, 0x66, 0x7A, + 0x1C, 0x40, 0x00, 0x10, 0x5C, 0xC0, 0xFF, 0x0F, 0x56, 0x74, 0x66, 0x7C, 0xB9, 0x76, 0xD4, 0x05, + 0x38, 0x51, 0x1C, 0x00, 0x38, 0x61, 0x18, 0x00, 0x38, 0x71, 0x34, 0x00, 0x2C, 0x50, 0x10, 0x00, + 0x2C, 0x60, 0x10, 0x00, 0x24, 0x72, 0xB9, 0x51, 0x1C, 0x00, 0xB9, 0x61, 0x18, 0x00, 0x38, 0x51, + 0x0C, 0x00, 0x38, 0x61, 0x30, 0x00, 0xB9, 0x71, 0x34, 0x00, 0x38, 0x71, 0x2C, 0x00, 0x24, 0xB1, + 0xC4, 0xB5, 0x24, 0x52, 0x2C, 0x60, 0x10, 0x00, 0x2C, 0x70, 0x10, 0x00, 0xB9, 0x51, 0x0C, 0x00, + 0xB9, 0x61, 0x30, 0x00, 0xB9, 0x71, 0x2C, 0x00, 0x2C, 0xD0, 0x10, 0x00, 0x9A, 0xD9, 0xFD, 0xFF, + 0x0C, 0x20, 0x36, 0x05, 0x26, 0x2E, 0x14, 0x34, 0x04, 0x44, 0x26, 0x32, 0x8B, 0xE0, 0x03, 0x00, + 0x38, 0x41, 0x04, 0x00, 0x38, 0x51, 0x14, 0x00, 0xA9, 0x4E, 0x32, 0x05, 0xA9, 0x5E, 0x34, 0x05, + 0x58, 0xC1, 0x68, 0x00, 0x58, 0x81, 0x58, 0x00, 0x2C, 0x10, 0x78, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x0C, 0x70, 0x44, 0x15, 0x04, 0x60, 0x78, 0x57, 0x04, 0x00, 0x24, 0x61, 0xC6, 0x25, 0x22, 0x0E, + 0x78, 0x57, 0x06, 0x00, 0xC6, 0x25, 0x12, 0x0A, 0x70, 0x57, 0xC6, 0x35, 0x22, 0x07, 0x78, 0x57, + 0x02, 0x00, 0xC6, 0x35, 0x12, 0x03, 0x13, 0x26, 0xF2, 0x06, 0x13, 0x66, 0xC4, 0x62, 0x24, 0x78, + 0x92, 0xEB, 0x04, 0x20, 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xD9, 0xC1, 0x04, 0x00, + 0xB1, 0xB1, 0x0C, 0xE0, 0x00, 0x10, 0x28, 0x7E, 0x06, 0x00, 0x18, 0xCE, 0xA1, 0x05, 0xD4, 0x71, + 0x06, 0xD2, 0x06, 0xB3, 0x92, 0x3F, 0x38, 0x60, 0x40, 0x16, 0x18, 0x7E, 0xA6, 0x05, 0x18, 0x66, + 0xD5, 0x00, 0xC6, 0x67, 0xC2, 0x05, 0x24, 0x71, 0x99, 0x7E, 0xA6, 0x05, 0xF2, 0x33, 0x18, 0x72, + 0x0A, 0x00, 0xD7, 0xC1, 0x2C, 0xC0, 0x34, 0x00, 0x26, 0xCE, 0x0C, 0x20, 0x44, 0x05, 0x99, 0x7C, + 0x48, 0x05, 0x26, 0x2C, 0x06, 0x3D, 0x04, 0x44, 0x8B, 0xE0, 0x03, 0x00, 0x99, 0xBC, 0x49, 0x05, + 0x18, 0x7D, 0x0D, 0x00, 0x04, 0x62, 0x99, 0x7C, 0x4A, 0x05, 0x18, 0x7E, 0xA1, 0x05, 0x24, 0x71, + 0x99, 0x7E, 0xA1, 0x05, 0x18, 0x7D, 0x0D, 0x00, 0xD6, 0x67, 0x82, 0x14, 0x04, 0x64, 0xD6, 0x67, + 0x82, 0x09, 0x04, 0x71, 0x99, 0x7E, 0xA3, 0x05, 0x99, 0x0E, 0xA4, 0x05, 0x99, 0x0E, 0xA5, 0x05, + 0xF2, 0x09, 0xDC, 0x70, 0x18, 0x00, 0x82, 0x06, 0x04, 0x71, 0x99, 0x0E, 0xA3, 0x05, 0x99, 0x7E, + 0xA4, 0x05, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE2, 0x06, 0x63, 0x70, 0x22, 0x78, 0x3E, 0x02, 0x00, + 0x0C, 0xD0, 0x00, 0x10, 0x0C, 0x40, 0x54, 0x05, 0x0C, 0x50, 0x44, 0x15, 0x26, 0x4D, 0x04, 0x70, + 0x78, 0xF5, 0x04, 0x00, 0xC6, 0xF2, 0x12, 0x0D, 0x78, 0xF5, 0x06, 0x00, 0xC6, 0x2F, 0x12, 0x09, + 0x70, 0xF5, 0xC6, 0xF3, 0x12, 0x06, 0x78, 0xF5, 0x02, 0x00, 0xC6, 0x3F, 0x12, 0x02, 0x04, 0x71, + 0x24, 0x58, 0xC6, 0x54, 0x92, 0xEE, 0xC4, 0x70, 0x82, 0x77, 0xC4, 0x61, 0x82, 0x09, 0xC4, 0x61, + 0xA2, 0x6F, 0xC4, 0x62, 0x82, 0x1E, 0xC4, 0x64, 0x82, 0x44, 0xFA, 0xAF, 0x00, 0x00, 0x18, 0x6D, + 0xA3, 0x05, 0x14, 0x71, 0xC4, 0x60, 0x9A, 0xAA, 0x00, 0x00, 0x0B, 0xC1, 0x03, 0x00, 0x86, 0xC2, + 0x82, 0x09, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0x06, 0x3C, 0xCB, 0xC2, 0x03, 0x00, + 0xF2, 0x04, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0xCE, 0x0E, 0x00, 0xFA, 0x96, 0x00, 0x00, + 0x18, 0x7E, 0x0D, 0x00, 0x04, 0x61, 0xD6, 0x67, 0x82, 0x0B, 0xD4, 0x76, 0x82, 0x06, 0x04, 0x7A, + 0x99, 0x7E, 0x0D, 0x00, 0xFA, 0x84, 0x00, 0x00, 0x0C, 0x70, 0x12, 0x00, 0xF2, 0x42, 0x04, 0x62, + 0xD6, 0x67, 0x14, 0x71, 0x8A, 0x83, 0x00, 0x00, 0x0B, 0xC1, 0x03, 0x00, 0x86, 0x32, 0x82, 0x0A, + 0x98, 0x7E, 0x0E, 0x00, 0x92, 0x07, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x3E, 0x0E, 0x00, + 0xF2, 0x04, 0x04, 0x76, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0xCB, 0xC2, 0x03, 0x00, 0xF2, 0x6D, + 0x18, 0x7E, 0x0D, 0x00, 0x04, 0x61, 0xD6, 0x67, 0x92, 0xD9, 0x04, 0x62, 0xD6, 0x67, 0x14, 0x71, + 0x82, 0x65, 0x0B, 0xC1, 0x03, 0x00, 0x86, 0x22, 0x18, 0x3E, 0x0E, 0x00, 0x82, 0x11, 0xC4, 0x30, + 0x82, 0x11, 0xC6, 0x23, 0x04, 0x7A, 0x82, 0x03, 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, + 0x06, 0x2E, 0xCB, 0xC2, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0xF2, 0x06, 0xC4, 0x30, + 0x92, 0xF4, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0E, 0x0E, 0x00, 0xF2, 0x46, 0x04, 0x72, + 0x99, 0x7E, 0x0D, 0x00, 0xF2, 0x42, 0xC4, 0x61, 0x82, 0x08, 0xC4, 0x61, 0xA2, 0x3A, 0xC4, 0x62, + 0x82, 0x09, 0xC4, 0x64, 0x82, 0x1B, 0xF2, 0x3A, 0x99, 0x6E, 0x0D, 0x00, 0x99, 0x0D, 0xA6, 0x05, + 0xF2, 0x35, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, 0x82, 0x15, 0x98, 0x3E, 0x0E, 0x00, 0x82, 0x08, + 0x0C, 0x70, 0x12, 0x00, 0x99, 0x7E, 0x0D, 0x00, 0x06, 0x2E, 0xCB, 0xC2, 0x03, 0x00, 0x04, 0x71, + 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0xA6, 0x05, 0xF2, 0x18, 0x18, 0x7E, 0x0D, 0x00, 0xD4, 0x72, + 0x92, 0x07, 0x04, 0x71, 0x99, 0x7E, 0x0D, 0x00, 0x99, 0x0D, 0xA6, 0x05, 0xF2, 0x10, 0x98, 0x3E, + 0x0E, 0x00, 0x04, 0x72, 0x99, 0x7E, 0x0D, 0x00, 0x82, 0x07, 0x04, 0x7A, 0x99, 0x7E, 0x0D, 0x00, + 0x06, 0x2E, 0xCB, 0xC2, 0x03, 0x00, 0x04, 0x71, 0x99, 0x7E, 0x0C, 0x00, 0x04, 0x70, 0xF2, 0x06, + 0x04, 0x62, 0x99, 0x6E, 0x0D, 0x00, 0xF2, 0x02, 0x14, 0x71, 0x28, 0x5D, 0x06, 0x00, 0x04, 0x63, + 0xD6, 0x65, 0x92, 0x07, 0x18, 0x6E, 0x0D, 0x00, 0x54, 0x63, 0x66, 0x65, 0xA9, 0x6D, 0x06, 0x00, + 0x50, 0xC1, 0x06, 0x27, 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x00, 0x00, 0x18, 0x40, 0x68, 0x16, + 0xC4, 0x40, 0x28, 0x50, 0x44, 0x16, 0x06, 0x37, 0x0C, 0x70, 0x00, 0x10, 0x82, 0x07, 0x0C, 0x60, + 0x80, 0x0B, 0x26, 0x55, 0x26, 0x56, 0x20, 0x65, 0xF2, 0x0A, 0x08, 0x60, 0x00, 0x30, 0x57, 0x51, + 0x2C, 0x60, 0x00, 0xA0, 0x26, 0x65, 0x30, 0x66, 0x5C, 0x60, 0xFF, 0x7F, 0xC4, 0x40, 0xA9, 0x67, + 0x10, 0x00, 0x06, 0x63, 0x0C, 0x60, 0x44, 0x16, 0x28, 0x66, 0x02, 0x00, 0x92, 0x0B, 0x08, 0x50, + 0x00, 0x30, 0x57, 0x61, 0x2C, 0x50, 0x00, 0xA0, 0x26, 0x56, 0x30, 0x65, 0x5C, 0x60, 0xFF, 0x7F, + 0xF2, 0x06, 0x26, 0x66, 0x0C, 0x50, 0x80, 0x0B, 0x26, 0x65, 0x20, 0x66, 0xA9, 0x67, 0x12, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x38, 0x70, 0x40, 0x16, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x30, 0x77, + 0xDC, 0x70, 0x00, 0x40, 0x82, 0x06, 0x0C, 0xC0, 0xFF, 0x7F, 0x0C, 0xE0, 0x80, 0x0B, 0xF2, 0x05, + 0x0C, 0xC0, 0xFF, 0x0F, 0x0C, 0xE0, 0x80, 0x02, 0x04, 0xD0, 0x70, 0x7E, 0x0C, 0x30, 0x64, 0x00, + 0x06, 0x67, 0x57, 0x61, 0x26, 0x76, 0x06, 0x27, 0x57, 0x22, 0x26, 0x27, 0x4B, 0xA1, 0x00, 0x00, + 0x86, 0x22, 0x32, 0x03, 0xA1, 0x0E, 0xF2, 0x06, 0xC6, 0x2C, 0x02, 0x03, 0xA1, 0xCE, 0xF2, 0x02, + 0xA1, 0x2E, 0x24, 0xD1, 0xC4, 0xDB, 0x24, 0xE2, 0x92, 0xE9, 0x50, 0xC1, 0x2C, 0x10, 0x10, 0x00, + 0xE1, 0xF0, 0x00, 0x00, 0x3C, 0x10, 0x14, 0x00, 0xB1, 0xB1, 0x38, 0xB0, 0x40, 0x16, 0xD9, 0xC1, + 0x04, 0x00, 0x30, 0x7B, 0xDC, 0x70, 0x00, 0x40, 0x82, 0x06, 0x0C, 0xC0, 0xFF, 0x7F, 0x0C, 0xE0, + 0x80, 0x0B, 0xF2, 0x05, 0x0C, 0xC0, 0xFF, 0x0F, 0x0C, 0xE0, 0x80, 0x02, 0x2C, 0xE0, 0xBA, 0x01, + 0x0C, 0xD0, 0xDD, 0x00, 0x28, 0x3B, 0xD0, 0x00, 0x70, 0x2E, 0xAB, 0x9A, 0x00, 0x00, 0x0C, 0x30, + 0x64, 0x00, 0x4B, 0xA1, 0x00, 0x00, 0x86, 0x22, 0x32, 0x03, 0xA1, 0x0E, 0xF2, 0x06, 0xC6, 0x2C, + 0x02, 0x03, 0xA1, 0xCE, 0xF2, 0x02, 0xA1, 0x2E, 0x24, 0xD1, 0xCC, 0xD0, 0xE8, 0x00, 0x24, 0xE2, + 0x92, 0xEA, 0x58, 0xC1, 0x04, 0x00, 0x30, 0xB1, 0x2C, 0x10, 0x14, 0x00, 0xE1, 0xF0, 0x00, 0x00, + 0x04, 0x70, 0xC6, 0x74, 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, 0x2F, 0x67, 0x02, 0x00, + 0x91, 0x56, 0x24, 0x71, 0xF2, 0xF7, 0xE1, 0xF0, 0x04, 0x70, 0xC6, 0x74, 0x82, 0x06, 0x2F, 0x67, + 0x02, 0x00, 0x91, 0x36, 0x24, 0x71, 0xF2, 0xFA, 0xE1, 0xF0, 0x00, 0x00, 0x71, 0x00, 0xF2, 0xFF, + 0x4D, 0x00, 0x6C, 0x01, 0x7B, 0x02, 0x9D, 0x03, 0xBC, 0x04, 0x00, 0x00, 0x46, 0x00, 0x63, 0x01, + 0x80, 0x02, 0x9D, 0x03, 0xBA, 0x04, 0x00, 0x00, 0x83, 0x00, 0x06, 0x01, 0x89, 0x01, 0x0C, 0x02, + 0x8F, 0x02, 0x00, 0x00, 0x41, 0x00, 0xC4, 0x00, 0x47, 0x01, 0xCA, 0x01, 0x4D, 0x02, 0x00, 0x00, + 0xC6, 0x23, 0x06, 0x72, 0x32, 0x02, 0x06, 0x73, 0x43, 0x27, 0xE1, 0xF0, 0xC6, 0x23, 0x22, 0x07, + 0xC6, 0x24, 0x06, 0x72, 0x32, 0x02, 0x06, 0x74, 0x43, 0x27, 0xF2, 0x06, 0xC6, 0x34, 0x06, 0x23, + 0x32, 0x02, 0x06, 0x24, 0x43, 0x22, 0xE1, 0xF0, 0x3C, 0x10, 0x10, 0x00, 0xD1, 0xC1, 0x06, 0xE5, + 0x06, 0xD6, 0x6B, 0x04, 0x00, 0x00, 0x06, 0x3E, 0x06, 0x4D, 0x6B, 0x04, 0x00, 0x00, 0x50, 0xC1, + 0x2C, 0x10, 0x10, 0x00, 0xE1, 0xF0, 0x24, 0x00, 0xC6, 0x23, 0x06, 0x72, 0x02, 0x02, 0x06, 0x73, + 0x43, 0x27, 0xE1, 0xF0, 0x26, 0x23, 0xE1, 0xF0, 0x26, 0x23, 0x26, 0x24, 0xE1, 0xF0, 0x24, 0x00, + 0x26, 0x32, 0x26, 0x43, 0x26, 0x54, 0x2F, 0x26, 0x05, 0x00, 0xE1, 0xF0, 0x04, 0x70, 0xC6, 0x74, + 0x82, 0x09, 0x2F, 0x67, 0x03, 0x00, 0x60, 0x56, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, + 0xF2, 0xF7, 0xE1, 0xF0, 0x34, 0x14, 0xB1, 0xF1, 0x77, 0x41, 0x04, 0x70, 0x14, 0x61, 0x34, 0x41, + 0xC6, 0x46, 0x82, 0x09, 0x2F, 0x57, 0x03, 0x00, 0x30, 0xF5, 0x2F, 0x57, 0x02, 0x00, 0xB1, 0xF5, + 0x24, 0x74, 0xF2, 0xF6, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x24, 0x00, 0x04, 0x70, 0xC6, 0x74, + 0x82, 0x06, 0x2F, 0x67, 0x02, 0x00, 0x91, 0x36, 0x24, 0x71, 0xF2, 0xFA, 0xE1, 0xF0, 0x24, 0x00, + 0x77, 0x41, 0x14, 0x71, 0x34, 0x41, 0xC6, 0x47, 0x82, 0x04, 0xB1, 0x32, 0x24, 0x24, 0xF2, 0xFB, + 0xE1, 0xF0, 0x24, 0x00, 0x77, 0x31, 0x14, 0x71, 0x34, 0x31, 0xC6, 0x37, 0x82, 0x04, 0xB1, 0x02, + 0x24, 0x24, 0xF2, 0xFB, 0xE1, 0xF0, 0x24, 0x00, 0x08, 0x50, 0x00, 0x30, 0x0C, 0x70, 0xD8, 0x4C, + 0x0C, 0x40, 0xFC, 0x48, 0x0C, 0x60, 0xEC, 0x08, 0x26, 0x75, 0x26, 0x45, 0x30, 0x57, 0x34, 0x74, + 0xC6, 0x74, 0x77, 0x58, 0xA1, 0x56, 0x34, 0x62, 0x92, 0xFA, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, + 0x08, 0x70, 0x00, 0x30, 0x2C, 0x70, 0xD8, 0xA3, 0x0C, 0x60, 0xF6, 0x00, 0x0C, 0xE0, 0x80, 0x0B, + 0x0C, 0x20, 0x80, 0x02, 0x14, 0x41, 0x30, 0xF7, 0x2F, 0x56, 0x06, 0x00, 0x2F, 0x3E, 0x05, 0x00, + 0xA1, 0xF3, 0x1C, 0x30, 0x00, 0x57, 0x26, 0x37, 0x30, 0x33, 0x34, 0x61, 0xC6, 0x64, 0x26, 0x52, + 0xA1, 0x35, 0x34, 0x74, 0x92, 0xF1, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0x34, 0x14, 0x0C, 0x70, + 0x1E, 0x00, 0xB1, 0x71, 0x30, 0x71, 0x14, 0x61, 0xC4, 0x70, 0x26, 0x67, 0xB1, 0x61, 0x92, 0xFB, + 0x24, 0x14, 0xE1, 0xF0, 0xE1, 0xF0, 0x24, 0x00, 0x34, 0x14, 0xB1, 0xF1, 0x08, 0x70, 0x00, 0x40, + 0xB9, 0x07, 0x90, 0x60, 0xB9, 0x27, 0x00, 0x60, 0xB9, 0x37, 0x04, 0x60, 0xB9, 0x07, 0x08, 0x60, + 0x38, 0x67, 0x90, 0x60, 0xD4, 0x61, 0x82, 0xFD, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, + 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x24, 0x00, 0x34, 0x14, 0xB1, 0xF1, + 0x08, 0x70, 0x00, 0x40, 0xB9, 0x27, 0x00, 0x60, 0x04, 0x60, 0xC6, 0x65, 0x2F, 0x23, 0x06, 0x00, + 0x82, 0x0D, 0xB9, 0x27, 0x04, 0x60, 0x30, 0x24, 0xB9, 0x27, 0x08, 0x60, 0x38, 0x27, 0x90, 0x60, + 0xD4, 0x22, 0x82, 0xFD, 0x24, 0x61, 0x24, 0x44, 0xF2, 0xF1, 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, + 0x00, 0x60, 0x0B, 0x14, 0x00, 0x00, 0x30, 0xF1, 0x24, 0x14, 0xE1, 0xF0, 0x34, 0x18, 0xC1, 0xE1, + 0x08, 0x70, 0x00, 0x40, 0x0C, 0x60, 0x00, 0xDE, 0xB9, 0x67, 0x10, 0x60, 0x77, 0x31, 0x0C, 0x60, + 0x90, 0x01, 0xB9, 0x67, 0x00, 0x60, 0x77, 0x21, 0x34, 0x31, 0x08, 0x60, 0x00, 0x13, 0xB9, 0x27, + 0x04, 0x60, 0x66, 0x36, 0xB9, 0x37, 0x14, 0x60, 0x08, 0x50, 0x00, 0x10, 0x38, 0x67, 0x14, 0x60, + 0x0C, 0x40, 0x14, 0x60, 0xD6, 0x65, 0x26, 0x47, 0x92, 0xFA, 0x38, 0xE7, 0x18, 0x60, 0xB1, 0x04, + 0x0C, 0x60, 0x00, 0x81, 0xB9, 0x67, 0x00, 0x60, 0xB9, 0x07, 0x10, 0x60, 0x0B, 0x14, 0x00, 0x00, + 0x06, 0x2E, 0x40, 0xE1, 0x24, 0x18, 0xE1, 0xF0, 0xD8, 0x00, 0xED, 0x01, 0x11, 0x03, 0x30, 0x04, + 0xD5, 0x00, 0xF2, 0x01, 0x0E, 0x03, 0x2B, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x02, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x13, 0x0B, 0x12, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x02, 0x00, 0x08, 0x07, 0x12, 0x12, 0xFF, 0xFF, 0xFF, 0x0B, + 0x0C, 0xFF, 0xFF, 0xFF, 0xD0, 0x02, 0x00, 0x05, 0xFF, 0x11, 0xFF, 0x1F, 0x02, 0x00, 0x03, 0x02, + 0x69, 0x00, 0x69, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x46, 0x00, 0x64, 0x00, 0x08, 0x07, 0x01, 0xC8, 0xC8, 0x00, 0x00, 0x02, 0x01, 0x46, 0x00, 0x01, + 0x00, 0x02, 0x00, 0x00, 0xD4, 0x30, 0x00, 0x00, 0xD4, 0x30, 0x00, 0x00, 0xD4, 0x30, 0x00, 0x00, + 0xA0, 0x86, 0x01, 0x00, 0x40, 0x4B, 0x4C, 0x00, 0x30, 0x75, 0x00, 0x00, 0xF4, 0x01, 0xF4, 0x01, + 0xF4, 0x01, 0xF4, 0x01, 0x6E, 0x50, 0x00, 0x0A, 0x01, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5A, 0x00, + 0x01, 0x00, 0x0A, 0x00, 0xA0, 0x0F, 0x64, 0x64, 0x64, 0x01, 0x3C, 0x30, 0x04, 0x05, 0x02, 0x0A, + 0x06, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x14, 0x00, + 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x96, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x00, 0x00, 0x64, 0x00, 0x26, 0x26, 0x00, 0x00, 0x4C, 0x26, 0x14, 0x00, 0x48, 0x20, 0x23, 0x00, + 0x4C, 0x26, 0x14, 0x00, 0x4C, 0x26, 0x14, 0x00, 0x48, 0x20, 0x23, 0x00, 0x48, 0x20, 0x23, 0x00, + 0x48, 0x20, 0x23, 0x00, 0x48, 0x20, 0x23, 0x00, 0x40, 0x40, 0x00, 0x00, 0x63, 0x07, 0x03, 0x00, + 0x61, 0xC7, 0x03, 0x00, 0x61, 0x07, 0x03, 0x00, 0x61, 0xC7, 0x03, 0x00, 0x61, 0x07, 0x03, 0x00, + 0x63, 0x07, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, + 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x80, 0x0F, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, + 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, 0x66, 0x7F, 0xF0, 0x07, + 0xFF, 0x3F, 0x01, 0x00, 0xFF, 0x3F, 0x01, 0x00, 0x40, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x88, 0x00, 0x10, 0x3F, 0x10, 0x3F, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x64, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x88, 0x00, 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x42, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x88, 0x00, 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, + 0x64, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x64, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x88, 0x00, + 0x10, 0x3F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, 0x64, 0x3C, 0x10, 0x00, + 0x00, 0x00, 0x08, 0x82, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x64, 0x80, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x32, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xB9, 0x00, 0x00, 0x52, 0x52, 0x05, 0x00, + 0x52, 0x32, 0x00, 0x32, 0x00, 0x32, 0x19, 0x00, 0x64, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x64, 0x64, 0xC8, 0x00, 0x14, 0x00, 0x02, 0x00, 0x32, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x2C, 0x01, + 0x90, 0x01, 0x90, 0x01, 0xC2, 0x01, 0x00, 0x00, 0x28, 0x00, 0x64, 0x00, 0x00, 0x00, 0x46, 0x00, + 0x01, 0x00, 0x01, 0x00, 0xC8, 0x00, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, 0xF4, 0x01, 0x01, 0x01, + 0x1E, 0x00, 0x1E, 0x00, 0x20, 0x03, 0x64, 0x00, 0x64, 0x00, 0x0E, 0x00, 0xFA, 0x00, 0x00, 0x05, + 0x04, 0x0A, 0x01, 0x06, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3C, 0x02, 0x28, 0x00, 0x20, 0x03, + 0xDC, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x28, 0x00, 0x14, 0x00, 0x0A, 0x00, 0xC2, 0x01, 0x05, 0x02, + 0x01, 0x01, 0x01, 0x00, 0x50, 0x00, 0x78, 0x00, 0xC8, 0x00, 0x0A, 0x00, 0x68, 0x01, 0x1E, 0x00, + 0x78, 0x00, 0x4A, 0x01, 0x2D, 0x00, 0x4B, 0x00, 0x96, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, + 0x14, 0x01, 0x02, 0x03, 0x01, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x00, 0x0F, 0x00, 0x19, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x64, 0x00, 0x64, 0x01, 0x03, 0x00, + 0x00, 0x2D, 0x2D, 0x0A, 0x00, 0x00, 0x32, 0x00, 0x96, 0x00, 0x0A, 0x0A, 0x1E, 0x00, 0x05, 0x0A, + 0x01, 0x00, 0x64, 0x00, 0xC8, 0x00, 0x05, 0x00, 0x82, 0x00, 0xC8, 0x00, 0x05, 0x05, 0xC8, 0x00, + 0x14, 0x00, 0x64, 0x00, 0x1F, 0xB9, 0x00, 0x00, 0x52, 0x52, 0x05, 0x00, 0x52, 0x32, 0x00, 0x32, + 0x00, 0x32, 0x19, 0x00, 0x64, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x64, 0x64, 0xC8, 0x00, + 0x14, 0x00, 0x02, 0x00, 0x32, 0x00, 0xF0, 0x00, 0x1E, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x90, 0x01, + 0xC2, 0x01, 0x00, 0x00, 0x28, 0x00, 0x64, 0x00, 0x00, 0x00, 0x46, 0x00, 0x01, 0x00, 0x01, 0x00, + 0xC8, 0x00, 0x05, 0x01, 0x32, 0x0A, 0xB8, 0x0B, 0xF4, 0x01, 0x01, 0x01, 0x1E, 0x00, 0x1E, 0x00, + 0x20, 0x03, 0x64, 0x00, 0x64, 0x00, 0x0E, 0x00, 0xFA, 0x00, 0x00, 0x05, 0x04, 0x0A, 0x01, 0x06, + 0x3C, 0x00, 0x00, 0x00, 0x00, 0x06, 0x3C, 0x02, 0x28, 0x00, 0x20, 0x03, 0xDC, 0x05, 0xC8, 0x00, + 0x14, 0x00, 0x28, 0x00, 0x1E, 0x00, 0x0A, 0x00, 0xC2, 0x01, 0x05, 0x02, 0x01, 0x01, 0x01, 0x00, + 0x50, 0x00, 0x78, 0x00, 0xC8, 0x00, 0x0A, 0x00, 0x68, 0x01, 0x1E, 0x00, 0x78, 0x00, 0x4A, 0x01, + 0x2D, 0x00, 0x4B, 0x00, 0x96, 0x00, 0x14, 0x04, 0xFD, 0x02, 0x00, 0x03, 0x14, 0x01, 0x02, 0x03, + 0x01, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0F, 0x00, + 0x19, 0x00, 0x32, 0x00, 0x4B, 0x00, 0x64, 0x00, 0x64, 0x01, 0x03, 0x00, 0x00, 0x2D, 0x2D, 0x0A, + 0x00, 0x00, 0x32, 0x00, 0x96, 0x00, 0x0A, 0x0A, 0x1E, 0x00, 0x05, 0x0A, 0x01, 0x00, 0x64, 0x00, + 0xC8, 0x00, 0x05, 0x00, 0x82, 0x00, 0xC8, 0x00, 0x05, 0x05, 0xC8, 0x00, 0x14, 0x00, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x0D, 0x13, 0x0D, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x2C, 0x01, 0x60, 0x30, 0x14, 0x00, 0x54, 0xFF, 0x0F, 0x00, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0x2C, 0x01, 0x38, 0x48, 0x10, 0x10, 0x01, 0x00, 0x08, 0x00, + 0xC8, 0x00, 0xC8, 0x10, 0x61, 0x07, 0x04, 0x00, 0xFF, 0x3F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x64, 0xC0, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x80, 0x0F, + 0x01, 0x00, 0x80, 0x00, 0xFF, 0x0F, 0xFF, 0x0F, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x13, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, + 0x32, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x32, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x42, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x10, 0x88, 0x00, 0x10, 0x5F, 0x10, 0x3F, 0x64, 0x3C, 0x10, 0x00, 0x00, 0x00, 0x08, 0x82, + 0x2C, 0x01, 0xFF, 0x0F, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAC, 0x0D, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x7F, 0xF0, 0x07, + 0xDC, 0xC5, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x13, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0x08, 0x06, 0x00, + 0xD7, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x31, 0x84, 0x40, 0x00, 0x15, 0xF3, 0x88, 0x00, 0x00, 0xFF, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x3F, 0x00, 0x88, 0xBE, 0x01, 0x20, 0x00, 0x00, + 0x0C, 0x0D, 0x0E, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, + 0x1E, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0B, + 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x00, 0x00, 0xFF, 0x00, 0x20, 0x86, 0x00, 0x00, 0x00, 0x50, + 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x0F, 0x00, 0x4E, 0x27, 0x27, 0x00, + 0x4E, 0x28, 0x27, 0x01, 0x4E, 0x29, 0x27, 0x02, 0x4E, 0x2A, 0x27, 0x03, 0x4E, 0x2B, 0x27, 0x04, + 0x4E, 0x2C, 0x24, 0x05, 0x4E, 0x2D, 0x27, 0x06, 0x4E, 0x2E, 0x27, 0x07, 0x4E, 0x2F, 0x27, 0x08, + 0x4E, 0x30, 0x27, 0x09, 0x4F, 0x32, 0x28, 0x0B, 0x4F, 0x34, 0x28, 0x0D, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x37, 0x27, 0x10, 0x00, 0x37, 0x27, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 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, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0x00, 0x00, 0x26, 0x07, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x52, 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, + 0x3F, 0xFE, 0x08, 0x2D, 0x38, 0xE6, 0x08, 0x2D, 0x49, 0x26, 0x09, 0x2D, 0x35, 0xD6, 0x08, 0x2D, + 0x44, 0x16, 0x09, 0x2D, 0x32, 0xCE, 0x08, 0x2D, 0x2C, 0xB2, 0x08, 0x2D, 0x3B, 0xEE, 0x08, 0x2D, + 0x29, 0xA6, 0x08, 0x2D, 0x3A, 0xEE, 0x08, 0x2D, 0x28, 0xA2, 0x08, 0x2D, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x97, 0x5E, 0x0A, 0x2D, 0x8E, 0x3E, 0x0A, 0x2D, 0xAE, 0xBE, 0x0A, 0x2D, + 0x97, 0x5E, 0x0A, 0x2D, 0xA4, 0x96, 0x0A, 0x2D, 0x85, 0x16, 0x0A, 0x2D, 0x77, 0xDE, 0x09, 0x2D, + 0x8F, 0x3E, 0x0A, 0x2D, 0x78, 0xE6, 0x09, 0x2D, 0x8A, 0x2A, 0x0A, 0x2D, 0x69, 0xA6, 0x09, 0x2D, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x95, 0x56, 0x0A, 0x2E, 0x8F, 0x3E, 0x0A, 0x2E, + 0xAF, 0xC2, 0x0A, 0x2E, 0x9A, 0x6E, 0x0A, 0x2E, 0xA9, 0xA6, 0x0A, 0x2E, 0x89, 0x26, 0x0A, 0x2E, + 0x79, 0xE6, 0x09, 0x2E, 0x91, 0x46, 0x0A, 0x2E, 0x79, 0xE6, 0x09, 0x2E, 0x89, 0x26, 0x0A, 0x2E, + 0x69, 0xA6, 0x09, 0x2E, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x66, 0x9E, 0x09, 0x2C, + 0x61, 0x86, 0x09, 0x2C, 0x7A, 0xEE, 0x09, 0x2C, 0x66, 0x9E, 0x09, 0x2C, 0x73, 0xCE, 0x09, 0x2C, + 0x5E, 0x7E, 0x09, 0x2C, 0x52, 0x4E, 0x09, 0x2C, 0x62, 0x8A, 0x09, 0x2C, 0x50, 0x46, 0x09, 0x2C, + 0x5E, 0x7A, 0x09, 0x2C, 0x42, 0x0A, 0x09, 0x2C, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x60, 0x86, 0x09, 0x2B, 0x5B, 0x6E, 0x09, 0x2B, 0x75, 0xD6, 0x09, 0x2B, 0x63, 0x8E, 0x09, 0x2B, + 0x6E, 0xBE, 0x09, 0x2B, 0x5A, 0x6E, 0x09, 0x2B, 0x4E, 0x3E, 0x09, 0x2B, 0x5E, 0x7E, 0x09, 0x2B, + 0x4A, 0x2E, 0x09, 0x2B, 0x59, 0x66, 0x09, 0x2B, 0x3F, 0xFE, 0x08, 0x2B, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x56, 0x5E, 0x09, 0x29, 0x52, 0x4E, 0x09, 0x29, 0x6C, 0xB6, 0x09, 0x29, + 0x58, 0x66, 0x09, 0x29, 0x64, 0x96, 0x09, 0x29, 0x50, 0x46, 0x09, 0x29, 0x44, 0x16, 0x09, 0x29, + 0x54, 0x56, 0x09, 0x29, 0x40, 0x06, 0x09, 0x29, 0x4E, 0x3E, 0x09, 0x29, 0x34, 0xD6, 0x08, 0x29, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x5F, 0x7E, 0x09, 0x27, 0x5B, 0x6E, 0x09, 0x27, + 0x75, 0xD6, 0x09, 0x27, 0x61, 0x86, 0x09, 0x27, 0x6E, 0xBE, 0x09, 0x27, 0x59, 0x66, 0x09, 0x27, + 0x4D, 0x3A, 0x09, 0x27, 0x5D, 0x76, 0x09, 0x27, 0x4C, 0x32, 0x09, 0x27, 0x56, 0x5E, 0x09, 0x27, + 0x40, 0x02, 0x09, 0x27, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0x16, 0x19, 0x24, + 0x40, 0x06, 0x19, 0x24, 0x54, 0x52, 0x19, 0x24, 0x44, 0x16, 0x19, 0x24, 0x50, 0x42, 0x19, 0x24, + 0x40, 0x06, 0x19, 0x24, 0x38, 0xE6, 0x18, 0x24, 0x41, 0x06, 0x19, 0x24, 0x34, 0xD6, 0x18, 0x24, + 0x3F, 0x02, 0x19, 0x24, 0x2A, 0xAE, 0x18, 0x24, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x40, 0x02, 0x29, 0x22, 0x3C, 0xF6, 0x28, 0x22, 0x4D, 0x36, 0x29, 0x22, 0x40, 0x06, 0x29, 0x22, + 0x49, 0x26, 0x29, 0x22, 0x3D, 0xF6, 0x28, 0x22, 0x35, 0xDA, 0x28, 0x22, 0x3F, 0xFE, 0x28, 0x22, + 0x32, 0xCE, 0x28, 0x22, 0x3E, 0xFE, 0x28, 0x22, 0x2C, 0xB2, 0x28, 0x22, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x36, 0xDA, 0x38, 0x1D, 0x31, 0xC6, 0x38, 0x1D, 0x40, 0x02, 0x39, 0x1D, + 0x33, 0xCE, 0x38, 0x1D, 0x3E, 0xFA, 0x38, 0x1D, 0x31, 0xC6, 0x38, 0x1D, 0x2A, 0xAE, 0x38, 0x1D, + 0x34, 0xD6, 0x38, 0x1D, 0x28, 0xA6, 0x38, 0x1D, 0x32, 0xCE, 0x38, 0x1D, 0x22, 0x8E, 0x38, 0x1D, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x35, 0xD6, 0x48, 0x1B, 0x31, 0xC6, 0x48, 0x1B, + 0x40, 0x02, 0x49, 0x1B, 0x34, 0xD6, 0x48, 0x1B, 0x3D, 0xF6, 0x48, 0x1B, 0x31, 0xC6, 0x48, 0x1B, + 0x2A, 0xAE, 0x48, 0x1B, 0x34, 0xD6, 0x48, 0x1B, 0x28, 0xA6, 0x48, 0x1B, 0x32, 0xCE, 0x48, 0x1B, + 0x23, 0x8E, 0x48, 0x1B, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x30, 0xC6, 0x58, 0x17, + 0x2B, 0xAE, 0x58, 0x17, 0x3A, 0xEE, 0x58, 0x17, 0x2E, 0xBE, 0x58, 0x17, 0x36, 0xDE, 0x58, 0x17, + 0x2B, 0xAE, 0x58, 0x17, 0x25, 0x96, 0x58, 0x17, 0x2F, 0xBE, 0x58, 0x17, 0x23, 0x8E, 0x58, 0x17, + 0x2D, 0xBA, 0x58, 0x17, 0x1D, 0x76, 0x58, 0x17, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x2F, 0xBE, 0x68, 0x17, 0x2D, 0xB6, 0x68, 0x17, 0x3B, 0xEE, 0x68, 0x17, 0x2F, 0xBE, 0x68, 0x17, + 0x37, 0xDE, 0x68, 0x17, 0x2D, 0xB6, 0x68, 0x17, 0x26, 0x9E, 0x68, 0x17, 0x2F, 0xBE, 0x68, 0x17, + 0x24, 0x92, 0x68, 0x17, 0x2E, 0xBA, 0x68, 0x17, 0x1F, 0x7E, 0x68, 0x17, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x2E, 0xBA, 0x78, 0x14, 0x29, 0xA6, 0x78, 0x14, 0x36, 0xDE, 0x78, 0x14, + 0x2B, 0xAE, 0x78, 0x14, 0x33, 0xCE, 0x78, 0x14, 0x29, 0xA6, 0x78, 0x14, 0x23, 0x8E, 0x78, 0x14, + 0x2B, 0xAE, 0x78, 0x14, 0x20, 0x86, 0x78, 0x14, 0x29, 0xAA, 0x78, 0x14, 0x19, 0x66, 0x78, 0x14, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x31, 0xC6, 0x88, 0x13, 0x28, 0xA6, 0x88, 0x13, + 0x36, 0xDE, 0x88, 0x13, 0x2B, 0xAE, 0x88, 0x13, 0x33, 0xCE, 0x88, 0x13, 0x28, 0xA6, 0x88, 0x13, + 0x22, 0x8E, 0x88, 0x13, 0x2B, 0xAE, 0x88, 0x13, 0x20, 0x86, 0x88, 0x13, 0x29, 0xA6, 0x88, 0x13, + 0x1B, 0x6E, 0x88, 0x13, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x27, 0x9E, 0x98, 0x12, + 0x23, 0x8E, 0x98, 0x12, 0x30, 0xC2, 0x98, 0x12, 0x25, 0x9A, 0x98, 0x12, 0x2D, 0xB6, 0x98, 0x12, + 0x23, 0x8E, 0x98, 0x12, 0x1E, 0x7E, 0x98, 0x12, 0x25, 0x96, 0x98, 0x12, 0x1B, 0x6E, 0x98, 0x12, + 0x24, 0x96, 0x98, 0x12, 0x1A, 0x6E, 0x98, 0x12, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x25, 0x96, 0xA8, 0x13, 0x1D, 0x76, 0xA8, 0x13, 0x2A, 0xAE, 0xA8, 0x13, 0x20, 0x82, 0xA8, 0x13, + 0x27, 0x9E, 0xA8, 0x13, 0x1F, 0x7E, 0xA8, 0x13, 0x1C, 0x72, 0xA8, 0x13, 0x22, 0x8E, 0xA8, 0x13, + 0x17, 0x62, 0xA8, 0x13, 0x20, 0x86, 0xA8, 0x13, 0x13, 0x4E, 0xA8, 0x13, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x17, 0x5E, 0xB8, 0x12, 0x14, 0x56, 0xB8, 0x12, 0x20, 0x86, 0xB8, 0x12, + 0x16, 0x5E, 0xB8, 0x12, 0x1E, 0x7E, 0xB8, 0x12, 0x16, 0x5E, 0xB8, 0x12, 0x13, 0x4E, 0xB8, 0x12, + 0x1A, 0x6A, 0xB8, 0x12, 0x0F, 0x3E, 0xB8, 0x12, 0x18, 0x62, 0xB8, 0x12, 0x0F, 0x3E, 0xB8, 0x12, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x08, 0x00, + 0x00, 0x02, 0x08, 0x00, 0xE4, 0x96, 0xEB, 0x2E, 0xB6, 0xDE, 0xFA, 0x22, 0x00, 0x02, 0x88, 0x0C, + 0x00, 0x02, 0x88, 0x0C, 0x00, 0x02, 0x88, 0x0C, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, + 0x00, 0x02, 0x88, 0x0E, 0x00, 0x02, 0x88, 0x0E, 0x00, 0x02, 0x88, 0x0E, 0x00, 0x02, 0x88, 0x0E, + 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0D, + 0x00, 0x02, 0x88, 0x0C, 0x00, 0x02, 0x88, 0x0C, 0x00, 0x02, 0x88, 0x0C, 0x00, 0x02, 0x88, 0x0C, + 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x10, 0x00, 0x02, 0x88, 0x0F, + 0x00, 0x02, 0x88, 0x0E, 0x00, 0x02, 0x88, 0x0E, 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0D, + 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0C, 0x00, 0x02, 0x88, 0x0C, + 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0D, 0x00, 0x02, 0x88, 0x0A, 0x00, 0x02, 0x88, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0xF8, 0x13, 0x00, 0x02, 0xF8, 0x0E, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, + 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, + 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, + 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, 0x00, 0x02, 0xE8, 0x0A, + 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, + 0x00, 0x02, 0x18, 0x0E, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x18, 0x0C, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0xF8, 0x10, 0x00, 0x02, 0xF8, 0x12, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x28, 0x16, + 0x00, 0x02, 0x28, 0x16, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, 0x00, 0x02, 0x08, 0x0A, + 0x00, 0x60, 0xF0, 0x3F, 0x21, 0x70, 0xF0, 0x3F, 0x42, 0x70, 0xF0, 0x3F, 0x63, 0x70, 0xF0, 0x3F, + 0x84, 0x70, 0xF0, 0x3F, 0xA5, 0x70, 0xF0, 0x3F, 0xC6, 0xF0, 0xF1, 0x3F, 0xE7, 0xF0, 0xF1, 0x3F, + 0x08, 0xF1, 0xF1, 0x3F, 0x29, 0xF1, 0xF1, 0x3F, 0x4A, 0xF1, 0xF1, 0x3F, 0x6B, 0xF1, 0xF1, 0x3F, + 0x8C, 0xF1, 0xF1, 0x3F, 0xAD, 0xF1, 0xF1, 0x3F, 0xCE, 0xF1, 0xF1, 0x3F, 0xEF, 0xF1, 0xF1, 0x3F, + 0x10, 0xF2, 0xF1, 0x3F, 0x31, 0xD2, 0xF1, 0x3F, 0x52, 0xC2, 0xF1, 0x73, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, + 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0xC0, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4E, 0x49, 0x30, 0x00, 0x37, 0x30, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4B, 0x46, 0x24, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x27, 0x3F, 0xE0, 0x03, 0x00, 0x80, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, + 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, + 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, + 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, + 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, 0x31, 0x31, 0x31, 0x00, + 0x31, 0x31, 0x31, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x40, 0x00, 0x40, 0x00, 0x30, 0x00, 0x49, 0x00, 0x30, 0x00, 0xA0, 0x00, 0x30, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, + 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, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, + 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xDC, 0x00, 0x00, + 0x00, 0xDC, 0x00, 0x80, 0x00, 0x06, 0x00, 0x00, 0x00, 0xE2, 0x00, 0x80, 0x00, 0x0E, 0x00, 0x00, + 0x00, 0xF0, 0x00, 0x80, 0x00, 0x0A, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x49, 0x00, 0x30, 0x00, 0xA0, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA7, 0xA7, 0xF4, 0x76, 0x45, 0xB9, 0x29, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x07, 0x04, 0xDF, 0x07, 0x0C, 0x2B, 0x0E, 0x00, 0x49, 0x53, 0x54, 0x56, 0x32, 0x54, 0x41, 0x47 +}; + +#endif // __IST30XXC_FW_H__ \ No newline at end of file diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc.c b/drivers/input/touchscreen/ist30xxc/ist30xxc.c new file mode 100644 index 00000000..50b46cd6 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc.c @@ -0,0 +1,1566 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if CONFIG_EXTCON_S2MM001B +#include +#endif + +#include "ist30xxc.h" +#include "ist30xxc_update.h" +#include "ist30xxc_tracking.h" +#ifdef CONFIG_OF +#include +#include +#include +#endif + +#if IST30XX_DEBUG +#include "ist30xxc_misc.h" +#endif + +#if IST30XX_CMCS_TEST +#include "ist30xxc_cmcs.h" +#endif + +#define MAX_ERR_CNT (100) +#define EVENT_TIMER_INTERVAL (HZ * timer_period_ms / 1000) +u32 event_ms = 0, timer_ms = 0; +static struct timer_list event_timer; +static struct timespec t_current; // ns +int timer_period_ms = 500; // 0.5sec + +#if IST30XX_USE_KEY +int ist30xx_key_code[] = { 0, KEY_APPSELECT, KEY_BACK }; +#endif + +char *ist_vdd_name = "vddsim2"; + +struct ist30xx_data *ts_data; +EXPORT_SYMBOL(ts_data); +DEFINE_MUTEX(ist30xx_mutex); + +#ifdef CONFIG_ARM64 +struct class *sec_class; +EXPORT_SYMBOL(sec_class); +#endif + +int ist30xx_dbg_level = IST30XX_DEBUG_LEVEL; +void tsp_printk(int level, const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + + if (ist30xx_dbg_level < level) + return; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + printk("%s %pV", IST30XX_DEBUG_TAG, &vaf); + + va_end(args); +} + +long get_milli_second(void) +{ + ktime_get_ts(&t_current); + + return t_current.tv_sec * 1000 + t_current.tv_nsec / 1000000; +} + +int ist30xx_intr_wait(struct ist30xx_data *data, long ms) +{ + long start_ms = get_milli_second(); + long curr_ms = 0; + + while (1) { + if (!data->irq_working) + break; + + curr_ms = get_milli_second(); + if ((curr_ms < 0) || (start_ms < 0) || (curr_ms - start_ms > ms)) { + tsp_info("%s() timeout(%dms)\n", __func__, ms); + return -EPERM; + } + + msleep(2); + } + + return 0; +} + +void ist30xx_disable_irq(struct ist30xx_data *data) +{ + if (likely(data->irq_enabled)) { + ist30xx_tracking(TRACK_INTR_DISABLE); + disable_irq(data->client->irq); + data->irq_enabled = 0; + data->status.event_mode = false; + } +} + +void ist30xx_enable_irq(struct ist30xx_data *data) +{ + if (likely(!data->irq_enabled)) { + ist30xx_tracking(TRACK_INTR_ENABLE); + enable_irq(data->client->irq); + msleep(10); + data->irq_enabled = 1; + data->status.event_mode = true; + } +} + +void ist30xx_scheduled_reset(struct ist30xx_data *data) +{ + if (likely(data->initialized)) + schedule_delayed_work(&data->work_reset_check, 0); +} + +static void ist30xx_request_reset(struct ist30xx_data *data) +{ + data->irq_err_cnt++; + if (unlikely(data->irq_err_cnt >= data->max_irq_err_cnt)) { + tsp_info("%s()\n", __func__); + ist30xx_scheduled_reset(data); + data->irq_err_cnt = 0; + } +} + +#define NOISE_MODE_TA (0) +#define NOISE_MODE_CALL (1) +#define NOISE_MODE_COVER (2) +#define NOISE_MODE_POWER (8) +void ist30xx_start(struct ist30xx_data *data) +{ + if (data->initialized) { + data->scan_count = 0; + data->scan_retry = 0; + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL * 2); + } + + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_MODE_SPECIAL << 16) | (data->noise_mode & 0xFFFF))); + + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_LOCAL_MODEL << 16) | (TSP_LOCAL_CODE & 0xFFFF))); + + tsp_info("%s(), local : %d, mode : 0x%x\n", __func__, + TSP_LOCAL_CODE & 0xFFFF, data->noise_mode & 0xFFFF); + + if (data->report_rate >= 0) { + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_TIME_ACTIVE << 16) | (data->report_rate & 0xFFFF))); + tsp_info(" active rate : %dus\n", data->report_rate); + } + + if (data->idle_rate >= 0) { + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_TIME_IDLE << 16) | (data->idle_rate & 0xFFFF))); + tsp_info(" idle rate : %dus\n", data->idle_rate); + } + +#if IST30XX_JIG_MODE + if (data->jig_mode) { + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + (eHCOM_SET_JIG_MODE << 16) | (IST30XX_JIG_TOUCH & 0xFFFF)); + tsp_info(" jig mode start\n"); + } + + if (data->debug_mode || data->jig_mode) { +#else + if (data->debug_mode) { +#endif + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + (eHCOM_SLEEP_MODE_EN << 16) | (IST30XX_DISABLE & 0xFFFF)); + tsp_info(" debug mode start\n"); + } + + ist30xx_cmd_start_scan(data); +} + + +int ist30xx_get_ver_info(struct ist30xx_data *data) +{ + int ret; + + data->fw.prev.main_ver = data->fw.cur.main_ver; + data->fw.prev.fw_ver = data->fw.cur.fw_ver; + data->fw.prev.core_ver = data->fw.cur.core_ver; + data->fw.prev.test_ver = data->fw.cur.test_ver; + data->fw.cur.main_ver = 0; + data->fw.cur.fw_ver = 0; + data->fw.cur.core_ver = 0; + data->fw.cur.test_ver = 0; + + ret = ist30xx_cmd_hold(data->client, 1); + if (unlikely(ret)) + return ret; + + ret = ist30xx_read_reg(data->client, + IST30XX_DA_ADDR(eHCOM_GET_VER_MAIN), &data->fw.cur.main_ver); + if (unlikely(ret)) + goto err_get_ver; + + ret = ist30xx_read_reg(data->client, + IST30XX_DA_ADDR(eHCOM_GET_VER_FW), &data->fw.cur.fw_ver); + if (unlikely(ret)) + goto err_get_ver; + + ret = ist30xx_read_reg(data->client, + IST30XX_DA_ADDR(eHCOM_GET_VER_CORE), &data->fw.cur.core_ver); + if (unlikely(ret)) + goto err_get_ver; + + ret = ist30xx_read_reg(data->client, + IST30XX_DA_ADDR(eHCOM_GET_VER_TEST), &data->fw.cur.test_ver); + if (unlikely(ret)) + goto err_get_ver; + + ret = ist30xx_cmd_hold(data->client, 0); + if (unlikely(ret)) + goto err_get_ver; + + tsp_info("IC version main: %x, fw: %x, test: %x, core: %x\n", + data->fw.cur.main_ver, data->fw.cur.fw_ver, data->fw.cur.test_ver, + data->fw.cur.core_ver); + + return 0; + +err_get_ver: + ist30xx_reset(data, false); + + return ret; +} + +#define CALIB_MSG_MASK (0xF0000FFF) +#define CALIB_MSG_VALID (0x80000CAB) +#define TRACKING_INTR_VALID (0x127EA597) +u32 tracking_intr_value = TRACKING_INTR_VALID; +int ist30xx_get_info(struct ist30xx_data *data) +{ + int ret; + u32 calib_msg; + u32 ms; + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + +#if IST30XX_INTERNAL_BIN +#if IST30XX_UPDATE_BY_WORKQUEUE + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); +#endif + ist30xx_get_tsp_info(data); +#else + ret = ist30xx_get_ver_info(data); + if (unlikely(ret)) + goto get_info_end; + + ret = ist30xx_get_tsp_info(data); + if (unlikely(ret)) + goto get_info_end; +#endif // IST30XX_INTERNAL_BIN + + ist30xx_print_info(data); + + ret = ist30xx_read_cmd(data, eHCOM_GET_CAL_RESULT, &calib_msg); + if (likely(ret == 0)) { + tsp_info("calib status: 0x%08x\n", calib_msg); + ms = get_milli_second(); + ist30xx_put_track_ms(ms); + ist30xx_put_track(&tracking_intr_value, 1); + ist30xx_put_track(&calib_msg, 1); + if ((calib_msg & CALIB_MSG_MASK) != CALIB_MSG_VALID || + CALIB_TO_STATUS(calib_msg) > 0) { + ist30xx_calibrate(data, IST30XX_MAX_RETRY_CNT); + } + } + +#if IST30XX_CHECK_CALIB + if (likely(!data->status.update)) { + ret = ist30xx_cmd_check_calib(data->client); + if (likely(!ret)) { + data->status.calib = 1; + data->status.calib_msg = 0; + event_ms = (u32)get_milli_second(); + data->status.event_mode = true; + } + } +#else + ist30xx_start(data); +#endif + +#if !(IST30XX_INTERNAL_BIN) +get_info_end: +#endif + + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return ret; +} + +#if IST30XX_GESTURE +#define GESTURE_MAGIC_STRING (0x4170CF00) +#define GESTURE_MAGIC_MASK (0xFFFFFF00) +#define GESTURE_MESSAGE_MASK (~GESTURE_MAGIC_MASK) +#define PARSE_GESTURE_MESSAGE(n) \ + ((n & GESTURE_MAGIC_MASK) == GESTURE_MAGIC_STRING ? \ + (n & GESTURE_MESSAGE_MASK) : -EINVAL) +void ist30xx_gesture_cmd(struct ist30xx_data *data, int cmd) +{ + tsp_info("Gesture cmd: %d\n", cmd); + + switch (cmd) { + case 0x01: + input_report_key(data->input_dev, KEY_VOLUMEUP, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_VOLUMEUP, 0); + input_sync(data->input_dev); + break; + + case 0x02: + input_report_key(data->input_dev, KEY_VOLUMEDOWN, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_VOLUMEDOWN, 0); + input_sync(data->input_dev); + break; + + case 0x03: + input_report_key(data->input_dev, KEY_PREVIOUSSONG, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_PREVIOUSSONG, 0); + input_sync(data->input_dev); + break; + + case 0x04: + input_report_key(data->input_dev, KEY_NEXTSONG, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_NEXTSONG, 0); + input_sync(data->input_dev); + break; + + case 0x11: + input_report_key(data->input_dev, KEY_PLAYPAUSE, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_PLAYPAUSE, 0); + input_sync(data->input_dev); + break; + + case 0x12: + input_report_key(data->input_dev, KEY_SCREENLOCK, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_SCREENLOCK, 0); + input_sync(data->input_dev); + break; + + case 0x13: + input_report_key(data->input_dev, KEY_PLAYPAUSE, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_PLAYPAUSE, 0); + input_sync(data->input_dev); + break; + + case 0x14: + input_report_key(data->input_dev, KEY_PLAYPAUSE, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_PLAYPAUSE, 0); + input_sync(data->input_dev); + break; + + case 0x21: + input_report_key(data->input_dev, KEY_MUTE, 1); + input_sync(data->input_dev); + input_report_key(data->input_dev, KEY_MUTE, 0); + input_sync(data->input_dev); + break; + + default: + break; + } +} +#endif + +#define PRESS_MSG_MASK (0x01) +#define MULTI_MSG_MASK (0x02) +#define TOUCH_DOWN_MESSAGE ("p") +#define TOUCH_UP_MESSAGE ("r") +#define TOUCH_MOVE_MESSAGE (" ") +bool tsp_touched[IST30XX_MAX_MT_FINGERS] = { false, }; +void print_tsp_event(struct ist30xx_data *data, finger_info *finger) +{ + int idx = finger->bit_field.id - 1; + bool press; + + press = PRESSED_FINGER(data->t_status, finger->bit_field.id); + + if (press) { + if (tsp_touched[idx] == false) { // touch down + tsp_noti("%s%d (%d, %d)\n", + TOUCH_DOWN_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + tsp_touched[idx] = true; + } else { // touch move + tsp_debug("%s%d (%d, %d)\n", + TOUCH_MOVE_MESSAGE, finger->bit_field.id, + finger->bit_field.x, finger->bit_field.y); + } + } else { + if (tsp_touched[idx] == true) { // touch up + tsp_noti("%s%d\n", TOUCH_UP_MESSAGE, finger->bit_field.id); + tsp_touched[idx] = false; + } + } +} +#if IST30XX_USE_KEY +#define PRESS_MSG_KEY (0x06) +bool tkey_pressed[IST30XX_MAX_KEYS] = { false, }; +void print_tkey_event(struct ist30xx_data *data, int id) +{ + int idx = id - 1; + bool press = PRESSED_KEY(data->t_status, id); + + if (press) { + if (tkey_pressed[idx] == false) { // tkey down + tsp_noti("k %s%d\n", TOUCH_DOWN_MESSAGE, id); + tkey_pressed[idx] = true; + } + } else { + if (tkey_pressed[idx] == true) { // tkey up + tsp_noti("k %s%d\n", TOUCH_UP_MESSAGE, id); + tkey_pressed[idx] = false; + } + } +} +#endif +static void release_finger(struct ist30xx_data *data, int id) +{ + input_mt_slot(data->input_dev, id - 1); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); + + ist30xx_tracking(TRACK_POS_FINGER + id); + tsp_info("%s() %d\n", __func__, id); + + tsp_touched[id - 1] = false; + + input_sync(data->input_dev); +} + +#if IST30XX_USE_KEY +#define CANCEL_KEY (0xFF) +#define RELEASE_KEY (0) +static void release_key(struct ist30xx_data *data, int id, u8 key_status) +{ + input_report_key(data->input_dev, ist30xx_key_code[id], key_status); + + ist30xx_tracking(TRACK_POS_KEY + id); + tsp_info("%s() key%d, status: %d\n", __func__, id, key_status); + + tkey_pressed[id - 1] = false; + + input_sync(data->input_dev); +} +#endif +static void clear_input_data(struct ist30xx_data *data) +{ + int id = 1; + u32 status; + + status = PARSE_FINGER_STATUS(data->t_status); + while (status) { + if (status & 1) + release_finger(data, id); + status >>= 1; + id++; + } +#if IST30XX_USE_KEY + id = 1; + status = PARSE_KEY_STATUS(data->t_status); + while (status) { + if (status & 1) + release_key(data, id, RELEASE_KEY); + status >>= 1; + id++; + } +#endif + data->t_status = 0; +} + +static int check_report_fingers(struct ist30xx_data *data, int finger_counts) +{ + int i; + finger_info *fingers = (finger_info *)data->fingers; + + /* current finger info */ + for (i = 0; i < finger_counts; i++) { + if (unlikely((fingers[i].bit_field.x >= IST30XX_MAX_X) || + (fingers[i].bit_field.y >= IST30XX_MAX_Y))) { + tsp_warn("Invalid touch data - %d: %d(%d, %d), 0x%08x\n", i, + fingers[i].bit_field.id, + fingers[i].bit_field.x, + fingers[i].bit_field.y, + fingers[i].full_field); + fingers[i].bit_field.id = 0; + ist30xx_tracking(TRACK_POS_UNKNOWN); + return -EPERM; + } + } + + return 0; +} + +static int check_valid_coord(u32 *msg, int cnt) +{ + u8 *buf = (u8 *)msg; + u8 chksum1 = msg[0] >> 24; + u8 chksum2 = 0; + u32 tmp = msg[0]; + + msg[0] &= 0x00FFFFFF; + + cnt *= IST30XX_DATA_LEN; + + while (cnt--) + chksum2 += *buf++; + + msg[0] = tmp; + + if (chksum1 != chksum2) { + tsp_err("intr chksum: %02x, %02x\n", chksum1, chksum2); + return -EPERM; + } + + return 0; +} + +static void report_input_data(struct ist30xx_data *data, int finger_counts, + int key_counts) +{ + int id; + bool press = false; + finger_info *fingers = (finger_info *)data->fingers; +#if IST30XX_JIG_MODE + u32 *z_values = (u32 *)data->z_values; +#endif + int idx = 0; + u32 status; + + status = PARSE_FINGER_STATUS(data->t_status); + for (id = 0; id < IST30XX_MAX_MT_FINGERS; id++) { + press = (status & (1 << id)) ? true : false; + + input_mt_slot(data->input_dev, id); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, press); + + fingers[idx].bit_field.id = id + 1; + print_tsp_event(data, &fingers[idx]); + + if (press == false) + continue; + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, + fingers[idx].bit_field.x); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, + fingers[idx].bit_field.y); + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, + fingers[idx].bit_field.area); +#if IST30XX_JIG_MODE + if (data->jig_mode) + input_report_abs(data->input_dev, ABS_MT_PRESSURE, z_values[idx]); +#endif + idx++; + } + +#if IST30XX_USE_KEY + status = PARSE_KEY_STATUS(data->t_status); + for (id = 0; id < IST30XX_MAX_KEYS; id++) { + press = (status & (1 << id)) ? true : false; + + input_report_key(data->input_dev, ist30xx_key_code[id + 1], press); + + print_tkey_event(data, id + 1); + } +#endif // IST30XX_USE_KEY + + data->irq_err_cnt = 0; + data->scan_retry = 0; + + input_sync(data->input_dev); +} + +/* + * CMD : CMD_GET_COORD + * + * 1st [31:24] [23:21] [20:16] [15:12] [11:10] [9:0] + * Checksum KeyCnt KeyStatus FingerCnt Rsvd. FingerStatus + * 2nd [31:28] [27:24] [23:12] [11:0] + * ID Area X Y + */ +#define TRACKING_INTR_DEBUG1_VALID (0x127A6E81) +#define TRACKING_INTR_DEBUG2_VALID (0x127A6E82) +#define TRACKING_INTR_DEBUG3_VALID (0x127A6E83) +u32 tracking_intr_debug_value = 0; +u32 intr_debug_addr, intr_debug2_addr, intr_debug3_addr = 0; +u32 intr_debug_size, intr_debug2_size, intr_debug3_size = 0; +static irqreturn_t ist30xx_irq_thread(int irq, void *ptr) +{ + int i, ret; + int key_cnt, finger_cnt, read_cnt; + struct ist30xx_data *data = (struct ist30xx_data *)ptr; + int offset = 1; +#if IST30XX_STATUS_DEBUG + u32 touch_status; +#endif + u32 t_status; + u32 msg[IST30XX_MAX_MT_FINGERS * 2 + offset]; + u32 ms; + + data->irq_working = true; + + if (unlikely(!data->irq_enabled)) + goto irq_end; + + ms = get_milli_second(); + + if (intr_debug_addr >= 0 && intr_debug_size > 0) { + tsp_noti("Intr_debug (addr: 0x%08x)\n", intr_debug_addr); + ist30xx_burst_read(data->client, IST30XX_DA_ADDR(intr_debug_addr), + &msg[0], intr_debug_size, true); + + for (i = 0; i < intr_debug_size; i++) { + tsp_noti("\t%08x\n", msg[i]); + } + + tracking_intr_debug_value = TRACKING_INTR_DEBUG1_VALID; + ist30xx_put_track_ms(ms); + ist30xx_put_track(&tracking_intr_debug_value, 1); + ist30xx_put_track(msg, intr_debug_size); + } + + if (intr_debug2_addr >= 0 && intr_debug2_size > 0) { + tsp_noti("Intr_debug2 (addr: 0x%08x)\n", intr_debug2_addr); + ist30xx_burst_read(data->client, IST30XX_DA_ADDR(intr_debug2_addr), + &msg[0], intr_debug2_size, true); + + for (i = 0; i < intr_debug2_size; i++) { + tsp_noti("\t%08x\n", msg[i]); + } + + tracking_intr_debug_value = TRACKING_INTR_DEBUG2_VALID; + ist30xx_put_track_ms(ms); + ist30xx_put_track(&tracking_intr_debug_value, 1); + ist30xx_put_track(msg, intr_debug2_size); + } + + memset(msg, 0, sizeof(msg)); + + ret = ist30xx_read_reg(data->client, IST30XX_HIB_INTR_MSG, msg); + if (unlikely(ret)) + goto irq_err; + + tsp_verb("intr msg: 0x%08x\n", *msg); + + // TSP IC Exception + if (unlikely((*msg & IST30XX_EXCEPT_MASK) == IST30XX_EXCEPT_VALUE)) { + tsp_err("Occured IC exception(0x%02X)\n", *msg & 0xFF); +#if I2C_BURST_MODE + ret = ist30xx_burst_read(data->client, + IST30XX_HIB_COORD, &msg[offset], IST30XX_MAX_EXCEPT_SIZE, true); +#else + for (i = 0; i < IST30XX_MAX_EXCEPT_SIZE; i++) { + ret = ist30xx_read_reg(data->client, + IST30XX_HIB_COORD + (i * 4), &msg[i + offset]); + } +#endif + if (unlikely(ret)) + tsp_err(" exception value read error(%d)\n", ret); + else + tsp_err(" exception value : 0x%08X, 0x%08X\n", msg[1], msg[2]); + + goto irq_ic_err; + } + + if (unlikely(*msg == 0 || *msg == 0xFFFFFFFF)) // Unknown CMD + goto irq_err; + + event_ms = ms; + ist30xx_put_track_ms(event_ms); + ist30xx_put_track(&tracking_intr_value, 1); + ist30xx_put_track(msg, 1); + + if (unlikely((*msg & CALIB_MSG_MASK) == CALIB_MSG_VALID)) { + data->status.calib_msg = *msg; + tsp_info("calib status: 0x%08x\n", data->status.calib_msg); + + goto irq_end; + } + +#if IST30XX_CMCS_TEST + if (unlikely(*msg == IST30XX_CMCS_MSG_VALID)) { + data->status.cmcs = 1; + tsp_info("cmcs status: 0x%08x\n", *msg); + + goto irq_end; + } +#endif + +#if IST30XX_GESTURE + ret = PARSE_GESTURE_MESSAGE(*msg); + if (unlikely(ret > 0)) { + tsp_info("Gesture ID: %d (0x%08x)\n", ret, *msg); + ist30xx_gesture_cmd(data, ret); + + goto irq_end; + } +#endif + +#if IST30XX_STATUS_DEBUG + ret = ist30xx_read_reg(data->client, + IST30XX_HIB_TOUCH_STATUS, &touch_status); + + if (ret == 0) { + tsp_debug("ALG : 0x%08X\n", touch_status); + } + + memset(data->fingers, 0, sizeof(data->fingers)); +#endif + + /* Unknown interrupt data for extend coordinate */ + if (unlikely(!CHECK_INTR_STATUS(*msg))) + goto irq_err; + + t_status = *msg; + key_cnt = PARSE_KEY_CNT(t_status); + finger_cnt = PARSE_FINGER_CNT(t_status); + + if (unlikely((finger_cnt > data->max_fingers) || + (key_cnt > data->max_keys))) { + tsp_warn("Invalid touch count - finger: %d(%d), key: %d(%d)\n", + finger_cnt, data->max_fingers, key_cnt, data->max_keys); + goto irq_err; + } + + if (finger_cnt > 0) { +#if I2C_BURST_MODE + ret = ist30xx_burst_read(data->client, + IST30XX_HIB_COORD, &msg[offset], finger_cnt, true); + if (unlikely(ret)) + goto irq_err; + + for (i = 0; i < finger_cnt; i++) + data->fingers[i].full_field = msg[i + offset]; +#else + for (i = 0; i < finger_cnt; i++) { + ret = ist30xx_read_reg(data->client, + IST30XX_HIB_COORD + (i * 4), &msg[i + offset]); + if (unlikely(ret)) + goto irq_err; + + data->fingers[i].full_field = msg[i + offset]; + } +#endif // I2C_BURST_MODE + +#if IST30XX_JIG_MODE + if (data->jig_mode) { + // z-values ram address define + ret = ist30xx_burst_read(data->client, + IST30XX_DA_ADDR(data->tags.zvalue_base), + data->z_values, finger_cnt, true); + } +#endif + ist30xx_put_track(msg + offset, finger_cnt); + for (i = 0; i < finger_cnt; i++) { +#if IST30XX_JIG_MODE + if (data->jig_mode) + tsp_verb("intr msg(%d): 0x%08x, %d\n", + i + offset, msg[i + offset], data->z_values[i]); + else +#endif + tsp_verb("intr msg(%d): 0x%08x\n", i + offset, msg[i + offset]); + } + } + + read_cnt = finger_cnt + 1; + + ret = check_valid_coord(&msg[0], read_cnt); + if (unlikely(ret)) + goto irq_err; + + ret = check_report_fingers(data, finger_cnt); + if (unlikely(ret)) + goto irq_err; + + data->t_status = t_status; + report_input_data(data, finger_cnt, key_cnt); + + if (intr_debug3_addr >= 0 && intr_debug3_size > 0) { + tsp_noti("Intr_debug3 (addr: 0x%08x)\n", intr_debug3_addr); + ist30xx_burst_read(data->client, IST30XX_DA_ADDR(intr_debug3_addr), + &msg[0], intr_debug3_size, true); + + for (i = 0; i < intr_debug3_size; i++) { + tsp_noti("\t%08x\n", msg[i]); + } + + tracking_intr_debug_value = TRACKING_INTR_DEBUG3_VALID; + ist30xx_put_track_ms(ms); + ist30xx_put_track(&tracking_intr_debug_value, 1); + ist30xx_put_track(msg, intr_debug3_size); + } + + goto irq_end; + +irq_err: + tsp_err("intr msg: 0x%08x, ret: %d\n", msg[0], ret); + ist30xx_request_reset(data); +irq_end: + data->irq_working = false; + event_ms = (u32)get_milli_second(); + return IRQ_HANDLED; + +irq_ic_err: + ist30xx_scheduled_reset(data); + data->irq_working = false; + event_ms = (u32)get_milli_second(); + return IRQ_HANDLED; +} + +static int ist30xx_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + del_timer(&event_timer); + cancel_delayed_work_sync(&data->work_noise_protect); + cancel_delayed_work_sync(&data->work_reset_check); + cancel_delayed_work_sync(&data->work_debug_algorithm); + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + clear_input_data(data); +#if IST30XX_GESTURE + if (data->gesture) { + ist30xx_start(data); + data->status.noise_mode = false; + ist30xx_enable_irq(data); + } +#endif + mutex_unlock(&ist30xx_mutex); + + return 0; +} + +static int ist30xx_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct ist30xx_data *data = i2c_get_clientdata(client); + + data->noise_mode |= (1 << NOISE_MODE_POWER); + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(data); + ist30xx_start(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void ist30xx_early_suspend(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + ist30xx_suspend(&data->client->dev); +} +static void ist30xx_late_resume(struct early_suspend *h) +{ + struct ist30xx_data *data = container_of(h, struct ist30xx_data, + early_suspend); + + ist30xx_resume(&data->client->dev); +} +#endif + +void ist30xx_set_ta_mode(bool mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ts_data->noise_mode >> NOISE_MODE_TA) & 1))) + return; + + if (mode) + ts_data->noise_mode |= (1 << NOISE_MODE_TA); + else + ts_data->noise_mode &= ~(1 << NOISE_MODE_TA); + +#if IST30XX_TA_RESET + if (unlikely(ts_data->initialized)) + ist30xx_scheduled_reset(ts_data); +#else + ist30xx_write_cmd(ts_data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_MODE_SPECIAL << 16) | (ts_data->noise_mode & 0xFFFF))); +#endif + + ist30xx_tracking(mode ? TRACK_CMD_TACON : TRACK_CMD_TADISCON); +} +EXPORT_SYMBOL(ist30xx_set_ta_mode); + +void ist30xx_set_call_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ts_data->noise_mode >> NOISE_MODE_CALL) & 1))) + return; + + if (mode) + ts_data->noise_mode |= (1 << NOISE_MODE_CALL); + else + ts_data->noise_mode &= ~(1 << NOISE_MODE_CALL); + +#if IST30XX_TA_RESET + if (unlikely(ts_data->initialized)) + ist30xx_scheduled_reset(ts_data); +#else + ist30xx_write_cmd(ts_data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_MODE_SPECIAL << 16) | (ts_data->noise_mode & 0xFFFF))); +#endif + + ist30xx_tracking(mode ? TRACK_CMD_CALL : TRACK_CMD_NOTCALL); +} +EXPORT_SYMBOL(ist30xx_set_call_mode); + +void ist30xx_set_cover_mode(int mode) +{ + tsp_info("%s(), mode = %d\n", __func__, mode); + + if (unlikely(mode == ((ts_data->noise_mode >> NOISE_MODE_COVER) & 1))) + return; + + if (mode) + ts_data->noise_mode |= (1 << NOISE_MODE_COVER); + else + ts_data->noise_mode &= ~(1 << NOISE_MODE_COVER); + +#if IST30XX_TA_RESET + if (unlikely(ts_data->initialized)) + ist30xx_scheduled_reset(ts_data); +#else + ist30xx_write_cmd(ts_data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_MODE_SPECIAL << 16) | (ts_data->noise_mode & 0xFFFF))); +#endif + + ist30xx_tracking(mode ? TRACK_CMD_COVER : TRACK_CMD_NOTCOVER); +} +EXPORT_SYMBOL(ist30xx_set_cover_mode); + +static void reset_work_func(struct work_struct *work) +{ + struct delayed_work *delayed_work = to_delayed_work(work); + struct ist30xx_data *data = container_of(delayed_work, + struct ist30xx_data, work_reset_check); + + if (unlikely((data == NULL) || (data->client == NULL))) + return; + + tsp_info("Request reset function\n"); + + if (likely((data->initialized == 1) && (data->status.power == 1) && + (data->status.update != 1) && (data->status.calib != 1))) { + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); +#if IST30XX_GESTURE + if (data->suspend) + ist30xx_internal_suspend(data); + else +#endif + ist30xx_reset(data, false); + + clear_input_data(data); + ist30xx_start(data); +#if IST30XX_GESTURE + if (data->gesture && data->suspend) + data->status.noise_mode = false; +#endif + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + } +} + +#if IST30XX_INTERNAL_BIN +#if IST30XX_UPDATE_BY_WORKQUEUE +static void fw_update_func(struct work_struct *work) +{ + struct delayed_work *delayed_work = to_delayed_work(work); + struct ist30xx_data *data = container_of(delayed_work, + struct ist30xx_data, work_fw_update); + + if (unlikely((data == NULL) || (data->client == NULL))) + return; + + tsp_info("FW update function\n"); + + if (likely(ist30xx_auto_bin_update(data))) + ist30xx_disable_irq(data); +} +#endif // IST30XX_UPDATE_BY_WORKQUEUE +#endif // IST30XX_INTERNAL_BIN + +#define TOUCH_STATUS_MAGIC (0x00000075) +#define TOUCH_STATUS_MASK (0x000000FF) +#define FINGER_ENABLE_MASK (0x00100000) +#define SCAN_CNT_MASK (0xFFE00000) +#define GET_FINGER_ENABLE(n) ((n & FINGER_ENABLE_MASK) >> 20) +#define GET_SCAN_CNT(n) ((n & SCAN_CNT_MASK) >> 21) +u32 ist30xx_algr_addr = 0, ist30xx_algr_size = 0; +static void noise_work_func(struct work_struct *work) +{ + int ret; + u32 touch_status = 0; + u32 scan_count = 0; + struct delayed_work *delayed_work = to_delayed_work(work); + struct ist30xx_data *data = container_of(delayed_work, + struct ist30xx_data, work_noise_protect); + + ret = ist30xx_read_reg(data->client, + IST30XX_HIB_TOUCH_STATUS, &touch_status); + if (unlikely(ret)) { + tsp_warn("Touch status read fail!\n"); + goto retry_timer; + } + + ist30xx_put_track_ms(timer_ms); + ist30xx_put_track(&touch_status, 1); + + tsp_verb("Touch Info: 0x%08x\n", touch_status); + + /* Check valid scan count */ + if (unlikely((touch_status & TOUCH_STATUS_MASK) != TOUCH_STATUS_MAGIC)) { + tsp_warn("Touch status is not corrected! (0x%08x)\n", touch_status); + goto retry_timer; + } + + /* Status of IC is idle */ + if (GET_FINGER_ENABLE(touch_status) == 0) { + if ((PARSE_FINGER_CNT(data->t_status) > 0) || + (PARSE_KEY_CNT(data->t_status) > 0)) + clear_input_data(data); + } + + scan_count = GET_SCAN_CNT(touch_status); + + /* Status of IC is lock-up */ + if (unlikely(scan_count == data->scan_count)) { + tsp_warn("TSP IC is not responded! (0x%08x)\n", scan_count); + goto retry_timer; + } + + data->scan_retry = 0; + data->scan_count = scan_count; + return; + +retry_timer: + data->scan_retry++; + tsp_warn("Retry touch status!(%d)\n", data->scan_retry); + + if (unlikely(data->scan_retry == data->max_scan_retry)) { + ist30xx_scheduled_reset(data); + data->scan_retry = 0; + } +} + +static void debug_work_func(struct work_struct *work) +{ +#if IST30XX_ALGORITHM_MODE + int ret = -EPERM; + int i; + u32 *buf32; + + struct delayed_work *delayed_work = to_delayed_work(work); + struct ist30xx_data *data = container_of(delayed_work, + struct ist30xx_data, work_debug_algorithm); + + buf32 = kzalloc(ist30xx_algr_size, GFP_KERNEL); + + for (i = 0; i < ist30xx_algr_size; i++) { + ret = ist30xx_read_buf(data->client, + ist30xx_algr_addr + IST30XX_DATA_LEN * i, &buf32[i], 1); + if (ret) { + tsp_warn("Algorithm mem addr read fail!\n"); + return; + } + } + + ist30xx_put_track(buf32, ist30xx_algr_size); + + tsp_debug(" 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n", + buf32[0], buf32[1], buf32[2], buf32[3], buf32[4]); +#endif +} + +void timer_handler(unsigned long timer_data) +{ + struct ist30xx_data *data = (struct ist30xx_data *)timer_data; + struct ist30xx_status *status = &data->status; + + if (data->irq_working) + goto restart_timer; + + if (status->event_mode) { + if (likely((status->power == 1) && (status->update != 1))) { + timer_ms = (u32)get_milli_second(); + if (unlikely(status->calib == 1)) { // Check calibration + if ((status->calib_msg & CALIB_MSG_MASK) == CALIB_MSG_VALID) { + tsp_info("Calibration check OK!!\n"); + schedule_delayed_work(&data->work_reset_check, 0); + status->calib = 0; + } else if (timer_ms - event_ms >= 3000) { // 3second + tsp_info("calibration timeout over 3sec\n"); + schedule_delayed_work(&data->work_reset_check, 0); + status->calib = 0; + } + } else if (likely(status->noise_mode)) { + if (timer_ms - event_ms > 100) // 100ms after last interrupt + schedule_delayed_work(&data->work_noise_protect, 0); + } + +#if IST30XX_ALGORITHM_MODE + if ((ist30xx_algr_addr >= IST30XX_DIRECT_ACCESS) && + (ist30xx_algr_size > 0)) { + if (timer_ms - event_ms > 100) // 100ms after last interrupt + schedule_delayed_work(&data->work_debug_algorithm, 0); + } +#endif + } + } + +restart_timer: + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL); +} + +extern struct class *ist30xx_class; +#if SEC_FACTORY_MODE +extern struct class *sec_class; +extern int sec_touch_sysfs(struct ist30xx_data *data); +extern int sec_fac_cmd_init(struct ist30xx_data *data); +#endif +static int ist30xx_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + int ret; + int retry = 3; +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + struct ist30xx_platform_data *pdata; +#endif + struct ist30xx_data *data; + struct input_dev *input_dev; + int ist_gpio = 0; + + tsp_info("### IMAGIS probe(ver:%s, protocol:%X, addr:0x%02X) ###\n", + IMAGIS_DD_VERSION, IMAGIS_PROTOCOL_B, client->addr); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_INFO "i2c_check_functionality error\n"); + return -EIO; + } + + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + +#ifdef CONFIG_OF + // TODO: load device tree + tsp_info("the client->dev.of_node=0x%x\n", client->dev.of_node); + + if (client->dev.of_node){ + ist_gpio = of_get_gpio(np, 0); + of_property_read_string(np, "tsp_pwr_name", &ist_vdd_name); + tsp_info("gpio id=%d,power name:%s\n", ist_gpio,ist_vdd_name); + } +#endif + + input_dev = input_allocate_device(); + if (unlikely(!input_dev)) { + ret = -ENOMEM; + tsp_err("%s(), input_allocate_device failed (%d)\n", + __func__, ret); + goto err_alloc_dev; + } + +#ifndef CONFIG_OF + ist_gpio = 82; + ist_vdd_name = "vddsim2"; +#endif + + /* configure touchscreen interrupt gpio */ + ret = gpio_request(ist_gpio, "ist30xx_irq_gpio"); + printk("[TSP]request gpio id = %d\n", ist_gpio); + if (ret) { + tsp_err("unable to request gpio.(%s)\r\n",input_dev->name); + goto err_init_drv; + } + client->irq = gpio_to_irq(ist_gpio); + tsp_info("client->irq : %d\n", client->irq); + data->max_fingers = IST30XX_MAX_MT_FINGERS; + data->max_keys = IST30XX_MAX_KEYS; + data->irq_enabled = 1; + data->client = client; + data->input_dev = input_dev; + i2c_set_clientdata(client, data); + + input_mt_init_slots(input_dev, IST30XX_MAX_MT_FINGERS, 0); + + input_dev->name = "ist30xx_ts_input"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + set_bit(EV_ABS, input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_set_abs_params(data->input_dev, ABS_MT_POSITION_X, + 0, IST30XX_MAX_X - 1, 0, 0); + input_set_abs_params(data->input_dev, ABS_MT_POSITION_Y, + 0, IST30XX_MAX_Y - 1, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, IST30XX_MAX_W, 0, 0); +#if IST30XX_JIG_MODE + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0, 0, 0); +#endif + +#if IST30XX_USE_KEY + { + int i; + set_bit(EV_KEY, input_dev->evbit); + set_bit(EV_SYN, input_dev->evbit); + for (i = 1; i < ARRAY_SIZE(ist30xx_key_code); i++) + set_bit(ist30xx_key_code[i], input_dev->keybit); + } + +#if IST30XX_GESTURE + input_set_capability(input_dev, EV_KEY, KEY_POWER); + input_set_capability(input_dev, EV_KEY, KEY_PLAYPAUSE); + input_set_capability(input_dev, EV_KEY, KEY_NEXTSONG); + input_set_capability(input_dev, EV_KEY, KEY_PREVIOUSSONG); + input_set_capability(input_dev, EV_KEY, KEY_VOLUMEUP); + input_set_capability(input_dev, EV_KEY, KEY_VOLUMEDOWN); + input_set_capability(input_dev, EV_KEY, KEY_MUTE); +#endif +#endif + + input_set_drvdata(input_dev, data); + ret = input_register_device(input_dev); + if (unlikely(ret)) { + input_free_device(input_dev); + goto err_reg_dev; + } + +#ifdef CONFIG_HAS_EARLYSUSPEND + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + data->early_suspend.suspend = ist30xx_early_suspend; + data->early_suspend.resume = ist30xx_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + ts_data = data; + + ret = ist30xx_init_system(data); + if (unlikely(ret)) { + tsp_err("chip initialization failed\n"); + goto err_init_drv; + } + + ret = request_threaded_irq(client->irq, NULL, ist30xx_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "ist30xx_ts", data); + if (unlikely(ret)) + goto err_init_drv; + + ist30xx_disable_irq(data); + + while (retry-- > 0) { + ret = ist30xx_read_cmd(data, IST30XX_REG_CHIPID, &data->chip_id); + data->chip_id &= 0xFFFF; + if (unlikely(ret == 0)) { + if ((data->chip_id == IST30XX_CHIP_ID) || + (data->chip_id == IST30XXC_DEFAULT_CHIP_ID) || + (data->chip_id == IST3048C_DEFAULT_CHIP_ID)) { + break; + } + } else if (unlikely(retry == 0)) { + goto err_irq; + } + + ist30xx_reset(data, false); + } + +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) + retry = 3; + data->tsp_type = TSP_TYPE_UNKNOWN; + while (retry-- > 0) { + ret = ist30xx_read_cmd(data, IST30XX_REG_TSPTYPE, &data->tsp_type); + if (likely(ret == 0)) { + data->tsp_type = IST30XX_PARSE_TSPTYPE(data->tsp_type); + tsp_info("tsptype: %x\n", data->tsp_type); + break; + } + + if (unlikely(retry == 0)) + goto err_irq; + } + + tsp_info("TSP IC: %x, TSP Vendor: %x\n", data->chip_id, data->tsp_type); +#else + tsp_info("TSP IC: %x\n", data->chip_id); +#endif + data->status.event_mode = false; + +#if IST30XX_INTERNAL_BIN +#if IST30XX_UPDATE_BY_WORKQUEUE + INIT_DELAYED_WORK(&data->work_fw_update, fw_update_func); + schedule_delayed_work(&data->work_fw_update, IST30XX_UPDATE_DELAY); +#else + ret = ist30xx_auto_bin_update(data); + if (unlikely(ret != 0)) + goto err_irq; +#endif // IST30XX_UPDATE_BY_WORKQUEUE +#endif // IST30XX_INTERNAL_BIN + + ret = ist30xx_init_update_sysfs(data); + if (unlikely(ret)) + goto err_sysfs; + +#if IST30XX_DEBUG + ret = ist30xx_init_misc_sysfs(data); + if (unlikely(ret)) + goto err_sysfs; +#endif + +#if IST30XX_CMCS_TEST + ret = ist30xx_init_cmcs_sysfs(data); + if (unlikely(ret)) + goto err_sysfs; +#endif + +#if IST30XX_TRACKING_MODE + ret = ist30xx_init_tracking_sysfs(); + if (unlikely(ret)) + goto err_sysfs; +#endif + +#if SEC_FACTORY_MODE + ret = sec_fac_cmd_init(data); + if (unlikely(ret)) + goto err_sysfs; + + ret = sec_touch_sysfs(data); + if (unlikely(ret)) + goto err_sysfs; +#endif + + // INIT VARIABLE (DEFAULT) +#if IST30XX_GESTURE + data->suspend = false; + data->gesture = false; +#endif + data->irq_working = false; + data->max_scan_retry = 2; + data->max_irq_err_cnt = MAX_ERR_CNT; + data->report_rate = -1; + data->idle_rate = -1; + + INIT_DELAYED_WORK(&data->work_reset_check, reset_work_func); + INIT_DELAYED_WORK(&data->work_noise_protect, noise_work_func); + INIT_DELAYED_WORK(&data->work_debug_algorithm, debug_work_func); + + init_timer(&event_timer); + event_timer.data = (unsigned long)data; + event_timer.function = timer_handler; + event_timer.expires = jiffies_64 + (EVENT_TIMER_INTERVAL); + mod_timer(&event_timer, get_jiffies_64() + EVENT_TIMER_INTERVAL * 2); + + ret = ist30xx_get_info(data); + tsp_info("Get info: %s\n", (ret == 0 ? "success" : "fail")); + + data->initialized = true; + + pm_runtime_enable(&client->dev); + + tsp_info("### IMAGIS probe success ###\n"); + + return 0; + +err_sysfs: + class_destroy(ist30xx_class); +err_irq: + tsp_info("ChipID: %x\n", data->chip_id); + ist30xx_disable_irq(data); + free_irq(client->irq, data); +err_init_drv: + data->status.event_mode = false; + ist30xx_power_off(data); +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + input_unregister_device(input_dev); +err_reg_dev: +err_alloc_dev: + kfree(data); + tsp_err("Error, ist30xx init driver\n"); + return -ENODEV; +} + + +static int ist30xx_remove(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&data->early_suspend); +#endif + + ist30xx_disable_irq(data); + free_irq(client->irq, data); + ist30xx_power_off(data); + + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + +static void ist30xx_shutdown(struct i2c_client *client) +{ + struct ist30xx_data *data = i2c_get_clientdata(client); + + del_timer(&event_timer); + cancel_delayed_work_sync(&data->work_noise_protect); + cancel_delayed_work_sync(&data->work_reset_check); + cancel_delayed_work_sync(&data->work_debug_algorithm); + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + clear_input_data(data); + mutex_unlock(&ist30xx_mutex); +} + +static struct i2c_device_id ist30xx_idtable[] = { + { IST30XX_DEV_NAME, 0 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, ist30xx_idtable); + +#ifdef CONFIG_OF +static struct of_device_id ist30xx_match_table[] = { + { .compatible = "Imagis,IST30XXC", }, + { }, +}; +#else +#define ist30xx_match_table NULL +#endif + +#ifndef CONFIG_HAS_EARLYSUSPEND +static const struct dev_pm_ops ist30xx_pm_ops = { + SET_RUNTIME_PM_OPS(ist30xx_suspend, ist30xx_resume, NULL) +}; +#endif + +static struct i2c_driver ist30xx_i2c_driver = { + .id_table = ist30xx_idtable, + .probe = ist30xx_probe, + .remove = ist30xx_remove, + .shutdown = ist30xx_shutdown, + .driver = { + .owner = THIS_MODULE, + .name = IST30XX_DEV_NAME, + .of_match_table = ist30xx_match_table, +#ifndef CONFIG_HAS_EARLYSUSPEND + .pm = &ist30xx_pm_ops, +#endif + }, +}; + +static int __init ist30xx_init(void) +{ +#ifdef CONFIG_ARM64 + sec_class = class_create(THIS_MODULE, "sec"); + if (IS_ERR(sec_class)) { + pr_err("Failed to create class(sec)!\n"); + printk("Failed create class \n"); + return PTR_ERR(sec_class); + } +#endif + + return i2c_add_driver(&ist30xx_i2c_driver); +} + + +static void __exit ist30xx_exit(void) +{ + i2c_del_driver(&ist30xx_i2c_driver); +} + +module_init(ist30xx_init); +module_exit(ist30xx_exit); + +#if CONFIG_EXTCON_S2MM001B +static int extcon_notifier(struct notifier_block *nb, + unsigned long state, void *edev) +{ + ist30xx_set_ta_mode(extcon_get_state(edev)); + + return NOTIFY_OK; +} + +static int ta_init_detect(void) +{ + struct extcon_dev *edev = NULL; + static struct notifier_block nb; + + if (!ts_data) + return -EPERM; + + edev = extcon_get_extcon_dev("s2mm001b"); + if (!edev) { + pr_err("Failed to get extcon dev\n"); + return -ENXIO; + } + + nb.notifier_call = extcon_notifier; + + extcon_register_notifier(edev, &nb); + + return 0; +} +late_initcall(ta_init_detect); +#endif + +MODULE_DESCRIPTION("Imagis IST30XX touch driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc.h b/drivers/input/touchscreen/ist30xxc/ist30xxc.h new file mode 100755 index 00000000..5c877fcf --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc.h @@ -0,0 +1,514 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XXC_H__ +#define __IST30XXC_H__ + +/* + * Support F/W ver : IST30xxC v1.0.0.0 + * Support IC : IST3026C, IST3032C + * Release : 2015.01.05 by Hoony + */ + +#define IMAGIS_DD_VERSION ("2.0.0.0") + +#define IMAGIS_IST3026C (1) /* 3026C */ +#define IMAGIS_IST3032C (2) /* 3032C */ +#define IMAGIS_IST3038C (3) /* 3038C */ +#define IMAGIS_IST3044C (4) /* 3044C */ +#define IMAGIS_IST3048C (5) /* 3048C */ + +#if defined(CONFIG_MACH_SS_SHARKLT8) || defined(CONFIG_MACH_SS_SHARKLT8LIGHTSLEEP) +#define IMAGIS_TSP_IC IMAGIS_IST3038C +#else +#define IMAGIS_TSP_IC IMAGIS_IST3032C +#endif + +#define TSP_CHIP_VENDOR ("IMAGIS") + +#define IMAGIS_PROTOCOL_A (0xA) +#define IMAGIS_PROTOCOL_B (0xB) +#define IMAGIS_PROTOCOL_TYPE IMAGIS_PROTOCOL_B + +#define IST30XXC_DEFAULT_CHIP_ID (0x300C) +#define IST3048C_DEFAULT_CHIP_ID (0x3048) +#if (IMAGIS_TSP_IC == IMAGIS_IST3026C) +#define TSP_CHIP_NAME ("IST3026C") +#define IST30XX_CHIP_ID (0x026C) +#define IST30XX_NODE_TOTAL_NUM (16 * 16) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3032C) +#define TSP_CHIP_NAME ("IST3032C") +#define IST30XX_CHIP_ID (0x032C) +#define IST30XX_NODE_TOTAL_NUM (16 * 16) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3038C) +#define TSP_CHIP_NAME ("IST3038C") +#define IST30XX_CHIP_ID (0x038C) +#define IST30XX_NODE_TOTAL_NUM (24 * 24) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3044C) +#define TSP_CHIP_NAME ("IST3044C") +#define IST30XX_CHIP_ID (0x044C) +#define IST30XX_NODE_TOTAL_NUM (24 * 24) +#elif (IMAGIS_TSP_IC == IMAGIS_IST3048C) +#define TSP_CHIP_NAME ("IST3048C") +#define IST30XX_CHIP_ID (0x048C) +#define IST30XX_NODE_TOTAL_NUM (24 * 24) +#else +#define TSP_CHIP_NAME ("IST30XXC") +#define IST30XX_CHIP_ID (0x300C) +#define IST30XX_NODE_TOTAL_NUM (24 * 24) +#endif + +/* IST30XX FUNCTION ENABLE & DISABLE */ +#define IST30XX_INTERNAL_BIN (1) +#define IST30XX_CHECK_CALIB (0) +#if IST30XX_INTERNAL_BIN +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) +#define IST30XX_MULTIPLE_TSP (0) +#endif +#define IST30XX_UPDATE_BY_WORKQUEUE (0) +#define IST30XX_UPDATE_DELAY (3 * HZ) +#endif + +#define IST30XX_EVENT_MODE (1) +#if IST30XX_EVENT_MODE +#define IST30XX_NOISE_MODE (1) +#define IST30XX_TRACKING_MODE (1) +#define IST30XX_ALGORITHM_MODE (1) +#else +#define IST30XX_NOISE_MODE (0) // fixed +#define IST30XX_TRACKING_MODE (0) // fixed +#define IST30XX_ALGORITHM_MODE (0) // fixed +#endif + +#define IST30XX_TA_RESET (1) +#define IST30XX_USE_KEY (1) +#define IST30XX_DEBUG (1) +#define IST30XX_CMCS_TEST (1) +#define IST30XX_GESTURE (0) +#define IST30XX_STATUS_DEBUG (0) +#if (IST30XX_DEBUG && IST30XX_CMCS_TEST) +#define IST30XX_JIG_MODE (1) +#else +#define IST30XX_JIG_MODE (0) // fixed +#endif + +#define SEC_FACTORY_MODE (1) +/* IST30XX FUNCTION ENABLE & DISABLE */ + +#define IST30XX_ADDR_LEN (4) +#define IST30XX_DATA_LEN (4) + +#define IST30XX_MAX_MT_FINGERS (10) +#define IST30XX_MAX_KEYS (5) + +#if defined(CONFIG_MACH_SS_SHARKLT8) || defined(CONFIG_MACH_SS_SHARKLT8LIGHTSLEEP) +#define IST30XX_MAX_X (720) // LCD Resolution +#define IST30XX_MAX_Y (1280) // LCD Resolution +#else +#define IST30XX_MAX_X (480) // LCD Resolution +#define IST30XX_MAX_Y (800) // LCD Resolution +#endif +#define IST30XX_MAX_W (15) + +#define IST30XX_EXCEPT_MASK (0xFFFFFF00) +#define IST30XX_EXCEPT_VALUE (0xE11CE900) +#define IST30XX_MAX_EXCEPT_SIZE (2) + +#define IST30XX_JIG_TOUCH (0xC0) +#define IST30XX_ENABLE (1) +#define IST30XX_DISABLE (0) + +/* retry count */ +#define IST30XX_MAX_RETRY_CNT (3) + +/* Local */ +#define TSP_LOCAL_EU (0) +#define TSP_LOCAL_EEU (1) +#define TSP_LOCAL_TD (11) +#define TSP_LOCAL_CMCC (12) +#define TSP_LOCAL_CU (13) +#define TSP_LOCAL_SPRD (14) +#define TSP_LOCAL_CTC (15) +#define TSP_LOCAL_INDIA (21) +#define TSP_LOCAL_SWASIA (22) +#define TSP_LOCAL_NA (31) +#define TSP_LOCAL_LA (32) +#define TSP_LOCAL_CODE TSP_LOCAL_EU + +/* Debug message */ +#define DEV_ERR (1) +#define DEV_WARN (2) +#define DEV_INFO (3) +#define DEV_NOTI (4) +#define DEV_DEBUG (5) +#define DEV_VERB (6) + +#define IST30XX_DEBUG_TAG "[ TSP ]" +#define IST30XX_DEBUG_LEVEL DEV_NOTI + +#define tsp_err(fmt, ...) tsp_printk(DEV_ERR, fmt, ## __VA_ARGS__) +#define tsp_warn(fmt, ...) tsp_printk(DEV_WARN, fmt, ## __VA_ARGS__) +#define tsp_info(fmt, ...) tsp_printk(DEV_INFO, fmt, ## __VA_ARGS__) +#define tsp_noti(fmt, ...) tsp_printk(DEV_NOTI, fmt, ## __VA_ARGS__) +#define tsp_debug(fmt, ...) tsp_printk(DEV_DEBUG, fmt, ## __VA_ARGS__) +#define tsp_verb(fmt, ...) tsp_printk(DEV_VERB, fmt, ## __VA_ARGS__) + +/* i2c setting */ +// I2C Device info +#define IST30XX_DEV_NAME "IST3038C" +#define IST30XX_DEV_ID (0xA0 >> 1) + +// I2C Mode +#define I2C_BURST_MODE (1) +#define I2C_MONOPOLY_MODE (0) + +// I2C transfer msg number +#define WRITE_CMD_MSG_LEN (1) +#define READ_CMD_MSG_LEN (2) + +// I2C address/Data length +#define IST30XX_ADDR_LEN (4) /* bytes */ +#define IST30XX_DATA_LEN (4) /* bytes */ + +// I2C transaction size +#define I2C_MAX_WRITE_SIZE (0x0100) /* bytes */ +#define I2C_MAX_READ_SIZE (0x0080) /* bytes */ + +// I2C access mode +#define IST30XX_DIRECT_ACCESS (1 << 31) +#define IST30XX_BURST_ACCESS (1 << 27) +#define IST30XX_HIB_ACCESS (0x800B << 16) +#define IST30XX_DA_ADDR(n) (n | IST30XX_DIRECT_ACCESS) +#define IST30XX_BA_ADDR(n) (n | IST30XX_BURST_ACCESS) +#define IST30XX_HA_ADDR(n) (n | IST30XX_HIB_ACCESS) + +/* register */ +// Info register +#define IST30XX_REG_CHIPID IST30XX_DA_ADDR(0x40001000) +#define IST30XX_REG_TSPTYPE IST30XX_DA_ADDR(0x40002010) + +// HIB register +#define IST30XX_HIB_BASE (0x30000100) +#define IST30XX_HIB_TOUCH_STATUS IST30XX_HA_ADDR(IST30XX_HIB_BASE | 0x00) +#define IST30XX_HIB_INTR_MSG IST30XX_HA_ADDR(IST30XX_HIB_BASE | 0x04) +#define IST30XX_HIB_COORD IST30XX_HA_ADDR(IST30XX_HIB_BASE | 0x08) +#define IST30XX_HIB_CMD IST30XX_HA_ADDR(IST30XX_HIB_BASE | 0x3C) +#define IST30XX_HIB_RW_STATUS IST30XX_HA_ADDR(IST30XX_HIB_BASE | 0x40) + +/* interrupt macro */ +#define IST30XX_INTR_STATUS (0x00000C00) +#define CHECK_INTR_STATUS(n) (((n & IST30XX_INTR_STATUS) \ + == IST30XX_INTR_STATUS) ? 1 : 0) +#define PARSE_FINGER_CNT(n) ((n >> 12) & 0xF) +#define PARSE_KEY_CNT(n) ((n >> 21) & 0x7) +/* Finger status: [9:0] */ +#define PARSE_FINGER_STATUS(n) (n & 0x3FF) +/* Key status: [20:16] */ +#define PARSE_KEY_STATUS(n) ((n >> 16) & 0x1F) +#define PRESSED_FINGER(s, id) ((s & (1 << (id - 1))) ? true : false) +#define PRESSED_KEY(s, id) ((s & (1 << (16 + id - 1))) ? true : false) + +#define IST30XX_MAX_CMD_SIZE (0x20) +#define IST30XX_CMD_ADDR(n) (n * 4) +#define IST30XX_CMD_VALUE(n) (n / 4) +enum ist30xx_read_commands { + eHCOM_GET_CHIP_ID = IST30XX_CMD_ADDR(0x00), + eHCOM_GET_VER_MAIN = IST30XX_CMD_ADDR(0x01), + eHCOM_GET_VER_FW = IST30XX_CMD_ADDR(0x02), + eHCOM_GET_VER_CORE = IST30XX_CMD_ADDR(0x03), + eHCOM_GET_VER_TEST = IST30XX_CMD_ADDR(0x04), + eHCOM_GET_CRC32 = IST30XX_CMD_ADDR(0x05), + eHCOM_GET_CRC32_ALL = IST30XX_CMD_ADDR(0x06), + eHCOM_GET_CAL_RESULT = IST30XX_CMD_ADDR(0x07), + eHCOM_GET_TSP_VENDOR = IST30XX_CMD_ADDR(0x08), + + eHCOM_GET_LCD_INFO = IST30XX_CMD_ADDR(0x10), + eHCOM_GET_TSP_INFO = IST30XX_CMD_ADDR(0x11), + eHCOM_GET_KEY_INFO_0 = IST30XX_CMD_ADDR(0x12), + eHCOM_GET_KEY_INFO_1 = IST30XX_CMD_ADDR(0x13), + eHCOM_GET_KEY_INFO_2 = IST30XX_CMD_ADDR(0x14), + eHCOM_GET_SCR_INFO = IST30XX_CMD_ADDR(0x15), + eHCOM_GET_GTX_INFO = IST30XX_CMD_ADDR(0x16), + eHCOM_GET_SWAP_INFO = IST30XX_CMD_ADDR(0x17), + eHCOM_GET_FINGER_INFO = IST30XX_CMD_ADDR(0x18), + eHCOM_GET_BASELINE = IST30XX_CMD_ADDR(0x19), + eHCOM_GET_TOUCH_TH = IST30XX_CMD_ADDR(0x1A), + + eHCOM_GET_ZVALUE_BASE = IST30XX_CMD_ADDR(0x1C), + eHCOM_GET_CDC_BASE = IST30XX_CMD_ADDR(0x1D), + eHCOM_GET_ALGO_BASE = IST30XX_CMD_ADDR(0x1E), + eHCOM_GET_COM_CHECKSUM = IST30XX_CMD_ADDR(0x1F), +}; + +enum ist30xx_write_commands { + eHCOM_FW_START = 0x01, + eHCOM_FW_HOLD = 0x02, + + eHCOM_CP_CORRECT_EN = 0x10, + eHCOM_WDT_EN = 0x11, + eHCOM_GESTURE_EN = 0x12, + eHCOM_SCALE_EN = 0x13, + eHCOM_NEW_POSITION_DIS = 0x14, + eHCOM_SLEEP_MODE_EN = 0x15, + + eHCOM_SET_TIME_ACTIVE = 0x20, + eHCOM_SET_TIME_IDLE = 0x21, + eHCOM_SET_MODE_SPECIAL = 0x22, + eHCOM_SET_LOCAL_MODEL = 0x23, + + eHCOM_RUN_RAMCODE = 0x30, + eHCOM_RUN_CAL_AUTO = 0x31, + eHCOM_RUN_CAL_PARAM = 0x32, + + eHCOM_SET_JIG_MODE = 0x80, + eHCOM_SET_JIG_SENSITI = 0x81, + + eHCOM_DEFAULT = 0xFF, +}; + +typedef union { + struct { + u32 y : 12; + u32 x : 12; + u32 area : 4; + u32 id : 4; + } bit_field; + u32 full_field; +} finger_info; + +struct ist30xx_status { + int power; + int update; + int update_result; + int calib; + int calib_msg; + int cmcs; + bool event_mode; + bool noise_mode; +}; + +struct ist30xx_version { + u32 main_ver; + u32 fw_ver; + u32 core_ver; + u32 test_ver; +}; + +struct ist30xx_fw { + struct ist30xx_version prev; + struct ist30xx_version cur; + struct ist30xx_version bin; + u32 index; + u32 size; + u32 chksum; + u32 buf_size; + u8 *buf; +}; + +#define IST30XX_TAG_MAGIC "ISTV2TAG" +struct ist30xx_tags { + char magic1[8]; + u32 rom_base; + u32 ram_base; + u32 reserved0; + u32 reserved1; + + u32 fw_addr; + u32 fw_size; + u32 cfg_addr; + u32 cfg_size; + u32 sensor_addr; + u32 sensor_size; + u32 cp_addr; + u32 cp_size; + u32 flag_addr; + u32 flag_size; + u32 reserved2; + u32 reserved3; + + u32 zvalue_base; + u32 algo_base; + u32 raw_base; + u32 filter_base; + u32 reserved4; + u32 reserved5; + + u32 chksum; + u32 chksum_all; + u32 reserved6; + u32 reserved7; + + u8 day; + u8 month; + u16 year; + u8 hour; + u8 min; + u8 sec; + u8 reserved8; + char magic2[8]; +}; + +struct ist30xx_platform_data { + int max_x; + int max_y; + int max_w; + int irq_flag; + int avdd_volt; + struct regulator *avdd_regulator; +}; + +struct CH_NUM { + u8 tx; + u8 rx; +}; + +struct GTX_INFO { + u8 num; + u8 ch_num[4]; +}; + +struct TSP_NODE_BUF { + u16 raw[IST30XX_NODE_TOTAL_NUM]; + u16 base[IST30XX_NODE_TOTAL_NUM]; + u16 filter[IST30XX_NODE_TOTAL_NUM]; + u16 min_raw; + u16 max_raw; + u16 min_base; + u16 max_base; + u16 len; +}; + +struct TSP_DIRECTION { + bool swap_xy; + bool flip_x; + bool flip_y; +}; + +typedef struct _TSP_INFO { + struct CH_NUM ch_num; + struct CH_NUM screen; + struct GTX_INFO gtx; + struct TSP_DIRECTION dir; + struct TSP_NODE_BUF node; + int height; + int width; + int finger_num; + u16 baseline; +} TSP_INFO; + +typedef struct _TKEY_INFO { + int key_num; + bool enable; + struct CH_NUM ch_num[IST30XX_MAX_KEYS]; + u16 baseline; +} TKEY_INFO; + +#if SEC_FACTORY_MODE +#include "ist30xxc_sec.h" +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +struct ist30xx_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct ist30xx_platform_data *pdata; + TSP_INFO tsp_info; + TKEY_INFO tkey_info; +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + struct ist30xx_status status; + struct ist30xx_fw fw; + struct ist30xx_tags tags; +#if SEC_FACTORY_MODE + struct sec_factory sec; +#endif + u32 chip_id; + u32 tsp_type; + u32 max_fingers; + u32 max_keys; + u32 t_status; + finger_info fingers[IST30XX_MAX_MT_FINGERS]; + volatile bool irq_working; + u32 irq_enabled; + bool initialized; + u32 noise_mode; + u32 debug_mode; +#if IST30XX_JIG_MODE + u32 jig_mode; + u32 z_values[IST30XX_MAX_MT_FINGERS]; +#endif + int report_rate; + int idle_rate; +#if IST30XX_GESTURE + bool suspend; + bool gesture; +#endif + int scan_count; + int scan_retry; + int max_scan_retry; + int irq_err_cnt; + int max_irq_err_cnt; + struct delayed_work work_reset_check; + struct delayed_work work_noise_protect; + struct delayed_work work_debug_algorithm; +#if IST30XX_INTERNAL_BIN +#if IST30XX_UPDATE_BY_WORKQUEUE + struct delayed_work work_fw_update; +#endif +#endif +}; + +extern struct mutex ist30xx_mutex; +extern int ist30xx_dbg_level; + +void tsp_printk(int level, const char *fmt, ...); +int ist30xx_intr_wait(struct ist30xx_data *data, long ms); + +void ist30xx_enable_irq(struct ist30xx_data *data); +void ist30xx_disable_irq(struct ist30xx_data *data); +void ist30xx_set_ta_mode(bool charging); +void ist30xx_set_cover_mode(int mode); +void ist30xx_start(struct ist30xx_data *data); +int ist30xx_get_ver_info(struct ist30xx_data *data); + +int ist30xx_read_reg(struct i2c_client *client, u32 reg, u32 *buf); +int ist30xx_read_cmd(struct ist30xx_data *data, u32 cmd, u32 *buf); +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val); +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len); +int ist30xx_burst_read(struct i2c_client *client, u32 addr, + u32 *buf32, u16 len, bool bit_en); +int ist30xx_burst_write(struct i2c_client *client, u32 addr, + u32 *buf32, u16 len); + +int ist30xx_cmd_start_scan(struct ist30xx_data *data); +int ist30xx_cmd_calibrate(struct i2c_client *client); +int ist30xx_cmd_check_calib(struct i2c_client *client); +int ist30xx_cmd_update(struct i2c_client *client, int cmd); +int ist30xx_cmd_hold(struct i2c_client *client, int enable); + +int ist30xx_power_on(struct ist30xx_data *data, bool download); +int ist30xx_power_off(struct ist30xx_data *data); +int ist30xx_reset(struct ist30xx_data *data, bool download); + +int ist30xx_internal_suspend(struct ist30xx_data *data); +int ist30xx_internal_resume(struct ist30xx_data *data); + +int ist30xx_init_system(struct ist30xx_data *data); + +#endif // __IST30XXC_H__ diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.c b/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.c new file mode 100644 index 00000000..07649b3a --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.c @@ -0,0 +1,1548 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xxc.h" +#include "ist30xxc_cmcs.h" + +#if IST30XX_INTERNAL_CMCS_BIN +#include "ist30xxc_cmcs_bin.h" +#endif + +#define TSP_CH_UNUSED (0) +#define TSP_CH_SCREEN (1) +#define TSP_CH_GTX (2) +#define TSP_CH_KEY (3) +#define TSP_CH_UNKNOWN (-1) + +#define CMCS_TAGS_PARSE_OK (0) + +int cmcs_ready = CMCS_READY; +u8 *ts_cmcs_bin = NULL; +u32 ts_cmcs_bin_size = 0; +CMCS_BIN_INFO ist30xx_cmcs_bin; +CMCS_BIN_INFO *ts_cmcs = (CMCS_BIN_INFO *)&ist30xx_cmcs_bin; +CMCS_BUF ist30xx_cmcs_buf; +CMCS_BUF *ts_cmcs_buf = (CMCS_BUF *)&ist30xx_cmcs_buf; + +int ist30xx_parse_cmcs_bin(const u8 *buf, const u32 size) +{ + int ret = -EPERM; + int i; + int node_spec_cnt; + + memcpy(ts_cmcs->magic1, buf, sizeof(ts_cmcs->magic1)); + memcpy(ts_cmcs->magic2, &buf[size - sizeof(ts_cmcs->magic2)], + sizeof(ts_cmcs->magic2)); + + if (!strncmp(ts_cmcs->magic1, IST30XX_CMCS_MAGIC, sizeof(ts_cmcs->magic1)) + && !strncmp(ts_cmcs->magic2, IST30XX_CMCS_MAGIC, + sizeof(ts_cmcs->magic2))) { + int idx; + + idx = sizeof(ts_cmcs->magic1); + + memcpy(&ts_cmcs->items.cnt, &buf[idx], sizeof(ts_cmcs->items.cnt)); + idx += sizeof(ts_cmcs->items.cnt); + ts_cmcs->items.item = kmalloc( + sizeof(struct CMCS_ITEM_INFO) * ts_cmcs->items.cnt, GFP_KERNEL); + + for (i = 0; i < ts_cmcs->items.cnt; i++) { + memcpy(&ts_cmcs->items.item[i], &buf[idx], + sizeof(struct CMCS_ITEM_INFO)); + idx += sizeof(struct CMCS_ITEM_INFO); + } + + memcpy(&ts_cmcs->cmds.cnt, &buf[idx], sizeof(ts_cmcs->cmds.cnt)); + idx += sizeof(ts_cmcs->cmds.cnt); + ts_cmcs->cmds.cmd = kmalloc( + sizeof(struct CMCS_CMD_INFO) * ts_cmcs->cmds.cnt, GFP_KERNEL); + + for (i = 0; i < ts_cmcs->cmds.cnt; i++) { + memcpy(&ts_cmcs->cmds.cmd[i], &buf[idx], + sizeof(struct CMCS_CMD_INFO)); + idx += sizeof(struct CMCS_CMD_INFO); + } + + memcpy(&ts_cmcs->spec_slope, &buf[idx], sizeof(ts_cmcs->spec_slope)); + idx += sizeof(ts_cmcs->spec_slope); + + memcpy(&ts_cmcs->spec_cr, &buf[idx], sizeof(ts_cmcs->spec_cr)); + idx += sizeof(ts_cmcs->spec_cr); + + memcpy(&ts_cmcs->param, &buf[idx], sizeof(ts_cmcs->param)); + idx += sizeof(ts_cmcs->param); + + ts_cmcs->spec_item = kmalloc( + sizeof(struct CMCS_SPEC_TOTAL) * ts_cmcs->items.cnt, + GFP_KERNEL); + + for (i = 0; i < ts_cmcs->items.cnt; i++) { + if (!strncmp(ts_cmcs->items.item[i].spec_type, "N", 1)) { + memcpy(&node_spec_cnt, &buf[idx], sizeof(node_spec_cnt)); + ts_cmcs->spec_item[i].spec_node.node_cnt = node_spec_cnt; + idx += sizeof(node_spec_cnt); + ts_cmcs->spec_item[i].spec_node.buf_min = (u16 *)&buf[idx]; + idx += node_spec_cnt * sizeof(s16); + ts_cmcs->spec_item[i].spec_node.buf_max = (u16 *)&buf[idx]; + idx += node_spec_cnt * sizeof(s16); + } else if (!strncmp(ts_cmcs->items.item[i].spec_type, "T", 1)) { + memcpy(&ts_cmcs->spec_item[i].spec_total, &buf[idx], + sizeof(struct CMCS_SPEC_TOTAL)); + idx += sizeof(struct CMCS_SPEC_TOTAL); + } + } + + ts_cmcs->buf_cmcs = (u8 *)&buf[idx]; + idx += ts_cmcs->param.cmcs_size; + + ts_cmcs->buf_sensor = (u32 *)&buf[idx]; + + ret = 0; + } + + tsp_verb("Magic1: %s, Magic2: %s\n", ts_cmcs->magic1, ts_cmcs->magic2); + tsp_verb(" item(%d)\n", ts_cmcs->items.cnt); + + for (i = 0; i < ts_cmcs->items.cnt; i++) { + tsp_verb(" (%d): %s, 0x%08x, %d, %s, %s\n", + i, ts_cmcs->items.item[i].name, ts_cmcs->items.item[i].addr, + ts_cmcs->items.item[i].size, ts_cmcs->items.item[i].data_type, + ts_cmcs->items.item[i].spec_type); + } + + tsp_verb(" cmd(%d)\n", ts_cmcs->cmds.cnt); + + for (i = 0; i < ts_cmcs->cmds.cnt; i++) { + tsp_verb(" (%d): 0x%08x, 0x%08x\n", + i, ts_cmcs->cmds.cmd[i].addr, ts_cmcs->cmds.cmd[i].value); + } + + tsp_verb(" param\n"); + tsp_verb(" fw: 0x%08x, %d\n", ts_cmcs->param.cmcs_size_addr, + ts_cmcs->param.cmcs_size); + tsp_verb(" cm sensor1: 0x%08x, %d\n", ts_cmcs->param.cm_sensor1_addr, + ts_cmcs->param.cm_sensor1_size); + tsp_verb(" cm sensor2: 0x%08x, %d\n", ts_cmcs->param.cm_sensor2_addr, + ts_cmcs->param.cm_sensor2_size); + tsp_verb(" cm sensor3: 0x%08x, %d\n", ts_cmcs->param.cm_sensor3_addr, + ts_cmcs->param.cm_sensor3_size); + tsp_verb(" cs sensor1: 0x%08x, %d\n", ts_cmcs->param.cs_sensor1_addr, + ts_cmcs->param.cs_sensor1_size); + tsp_verb(" cs sensor2: 0x%08x, %d\n", ts_cmcs->param.cs_sensor2_addr, + ts_cmcs->param.cs_sensor2_size); + tsp_verb(" cs sensor3: 0x%08x, %d\n", ts_cmcs->param.cs_sensor3_addr, + ts_cmcs->param.cs_sensor3_size); + tsp_verb(" chksum: 0x%08x\n", ts_cmcs->param.cmcs_chksum, + ts_cmcs->param.cm_sensor_chksum, ts_cmcs->param.cs_sensor_chksum); + tsp_verb(" slope(%s)\n", ts_cmcs->spec_slope.name); + tsp_verb(" x(%d,%d),y(%d,%d),gtx_x(%d,%d),gtx_y(%d,%d),key(%d,%d)\n", + ts_cmcs->spec_slope.x_min, ts_cmcs->spec_slope.x_max, + ts_cmcs->spec_slope.y_min, ts_cmcs->spec_slope.y_max, + ts_cmcs->spec_slope.gtx_x_min, ts_cmcs->spec_slope.gtx_x_max, + ts_cmcs->spec_slope.gtx_y_min, ts_cmcs->spec_slope.gtx_y_max, + ts_cmcs->spec_slope.key_min, ts_cmcs->spec_slope.key_max); + tsp_verb(" cr: screen(%4d, %4d), gtx(%4d, %4d), key(%4d, %4d)\n", + ts_cmcs->spec_cr.screen_min, ts_cmcs->spec_cr.screen_max, + ts_cmcs->spec_cr.gtx_min, ts_cmcs->spec_cr.gtx_max, + ts_cmcs->spec_cr.key_min, ts_cmcs->spec_cr.key_max); + + for (i = 0; i < ts_cmcs->items.cnt; i++) { + if (!strncmp(ts_cmcs->items.item[i].spec_type, "N", 1)) { + tsp_verb(" %s\n", ts_cmcs->items.item[i].name); + tsp_verb(" min: %x, %x, %x, %x\n", + ts_cmcs->spec_item[i].spec_node.buf_min[0], + ts_cmcs->spec_item[i].spec_node.buf_min[1], + ts_cmcs->spec_item[i].spec_node.buf_min[2], + ts_cmcs->spec_item[i].spec_node.buf_min[3]); + tsp_verb(" max: %x, %x, %x, %x\n", + ts_cmcs->spec_item[i].spec_node.buf_max[0], + ts_cmcs->spec_item[i].spec_node.buf_max[1], + ts_cmcs->spec_item[i].spec_node.buf_max[2], + ts_cmcs->spec_item[i].spec_node.buf_max[3]); + } else if (!strncmp(ts_cmcs->items.item[i].spec_type, "T", 1)) { + tsp_verb(" %s: screen(%4d, %4d), gtx(%4d, %4d), key(%4d, %4d)\n", + ts_cmcs->items.item[i].name, + ts_cmcs->spec_item[i].spec_total.screen_min, + ts_cmcs->spec_item[i].spec_total.screen_max, + ts_cmcs->spec_item[i].spec_total.gtx_min, + ts_cmcs->spec_item[i].spec_total.gtx_max, + ts_cmcs->spec_item[i].spec_total.key_min, + ts_cmcs->spec_item[i].spec_total.key_max); + } + } + + tsp_verb(" cmcs: %x, %x, %x, %x\n", ts_cmcs->buf_cmcs[0], + ts_cmcs->buf_cmcs[1], ts_cmcs->buf_cmcs[2], ts_cmcs->buf_cmcs[3]); + tsp_verb(" sensor: %x, %x, %x, %x\n", + ts_cmcs->buf_sensor[0], ts_cmcs->buf_sensor[1], + ts_cmcs->buf_sensor[2], ts_cmcs->buf_sensor[3]); + + return ret; +} + +int ist30xx_get_cmcs_info(const u8 *buf, const u32 size) +{ + int ret; + + cmcs_ready = CMCS_NOT_READY; + + ret = ist30xx_parse_cmcs_bin(buf, size); + if (unlikely(ret != CMCS_TAGS_PARSE_OK)) + tsp_warn("Cannot find tags of CMCS, make a bin by 'cmcs2bin.exe'\n"); + + return ret; +} + +int ist30xx_set_cmcs_sensor(struct i2c_client *client, CMCS_PARAM param, + u32 *buf32) +{ + int ret; + int len; + u32 waddr; + + waddr = IST30XX_DA_ADDR(param.cm_sensor1_addr); + len = (param.cm_sensor1_size / IST30XX_DATA_LEN) - 2; + buf32 += 2; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + tsp_verb("%08x(%d)\n", waddr, len); + + if (len > 0) { + ret = ist30xx_burst_write(client, waddr, buf32, len); + if (ret) + return ret; + + tsp_info("cm sensor reg1 loaded!\n"); + } + + buf32 += len; + waddr = IST30XX_DA_ADDR(param.cm_sensor2_addr); + len = param.cm_sensor2_size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + tsp_verb("%08x(%d)\n", waddr, len); + + if (len > 0) { + ret = ist30xx_burst_write(client, waddr, buf32, len); + if (ret) + return ret; + + tsp_info("cm sensor reg2 loaded!\n"); + } + + buf32 += len; + waddr = IST30XX_DA_ADDR(param.cm_sensor3_addr); + len = param.cm_sensor3_size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + tsp_verb("%08x(%d)\n", waddr, len); + + if (len > 0) { + ret = ist30xx_burst_write(client, waddr, buf32, len); + if (ret) + return ret; + + tsp_info("cm sensor reg3 loaded!\n"); + } + + buf32 += len; + waddr = IST30XX_DA_ADDR(param.cs_sensor1_addr); + len = param.cs_sensor1_size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + tsp_verb("%08x(%d)\n", waddr, len); + + if (len > 0) { + ret = ist30xx_burst_write(client, waddr, buf32, len); + if (ret) + return ret; + + tsp_info("cs sensor reg1 loaded!\n"); + } + + buf32 += len; + waddr = IST30XX_DA_ADDR(param.cs_sensor2_addr); + len = param.cs_sensor2_size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + tsp_verb("%08x(%d)\n", waddr, len); + + if (len > 0) { + ret = ist30xx_burst_write(client, waddr, buf32, len); + if (ret) + return ret; + + tsp_info("cs sensor reg2 loaded!\n"); + } + + buf32 += len; + waddr = IST30XX_DA_ADDR(param.cs_sensor3_addr); + len = param.cs_sensor3_size / IST30XX_DATA_LEN; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + tsp_verb("%08x(%d)\n", waddr, len); + + if (len > 0) { + ret = ist30xx_burst_write(client, waddr, buf32, len); + if (ret) + return ret; + + tsp_info("cs sensor reg3 loaded!\n"); + } + + return 0; +} + +int ist30xx_set_cmcs_cmd(struct i2c_client *client, CMCS_CMD cmds) +{ + int ret; + int i; + u32 val; + u32 waddr; + + for (i = 0; i < cmds.cnt; i++) { + waddr = IST30XX_DA_ADDR(cmds.cmd[i].addr); + val = cmds.cmd[i].value; + ret = ist30xx_write_cmd(client, waddr, val); + if (ret) + return ret; + tsp_verb("cmd%d(0x%08x): 0x%08x\n", i, waddr, val); + } + + return 0; +} + +int ist30xx_parse_cmcs_buf(struct ist30xx_data *data, s16 *buf) +{ + int i, j; + TSP_INFO *tsp = &data->tsp_info; + + tsp_info(" %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + tsp_info(" "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%5d ", buf[i * tsp->ch_num.rx + j]); + printk("\n"); + } + + return 0; +} + +int ist30xx_apply_cmcs_slope(struct ist30xx_data *data, CMCS_BUF *cmcs_buf) +{ + int i, j, k; + int idx1, idx2, gtx_idx, key_idx; + int type; + int success = false; + TSP_INFO *tsp = &data->tsp_info; + int width = tsp->screen.rx; + int height = tsp->screen.tx; + s16 *presult; + s16 *pspec_min = (s16 *)cmcs_buf->spec_min; + s16 *pspec_max = (s16 *)cmcs_buf->spec_max; + s16 *pslope0 = (s16 *)cmcs_buf->slope0; + s16 *pslope1 = (s16 *)cmcs_buf->slope1; + + memset(cmcs_buf->slope0, 0, sizeof(cmcs_buf->slope0)); + memset(cmcs_buf->slope1, 0, sizeof(cmcs_buf->slope1)); + + if (!strncmp(ts_cmcs->spec_slope.name, IST30XX_CMCS_CS, 2)) + presult = (s16 *)&cmcs_buf->cs; + else + presult = (s16 *)&cmcs_buf->cm; + + for (i = 0; i < ts_cmcs->items.cnt; i++) { + if (!strncmp(ts_cmcs->spec_slope.name, + ts_cmcs->items.item[i].name, 2)) { + idx1 = idx2 = gtx_idx = key_idx = 0; + gtx_idx = tsp->screen.tx * tsp->screen.rx; + key_idx = gtx_idx + (tsp->gtx.num * tsp->screen.rx); + for (j = 0; j < tsp->ch_num.tx; j++) { + for (k = 0; k < tsp->ch_num.rx; k++) { + type = check_tsp_type(data, j, k); + idx1 = (j * tsp->ch_num.rx) + k; + + if (type == TSP_CH_UNKNOWN) { + continue; + } else if (type == TSP_CH_UNUSED) { + cmcs_buf->spec_min[idx1] = 0; + cmcs_buf->spec_max[idx1] = 0; + } else if (type == TSP_CH_GTX) { + cmcs_buf->spec_min[idx1] = + ts_cmcs->spec_item[i].spec_node.buf_min[gtx_idx]; + cmcs_buf->spec_max[idx1] = + ts_cmcs->spec_item[i].spec_node.buf_max[gtx_idx]; + gtx_idx++; + } else if (type == TSP_CH_KEY) { + cmcs_buf->spec_min[idx1] = + ts_cmcs->spec_item[i].spec_node.buf_min[key_idx]; + cmcs_buf->spec_max[idx1] = + ts_cmcs->spec_item[i].spec_node.buf_max[key_idx]; + key_idx++; + } else { + cmcs_buf->spec_min[idx1] = + ts_cmcs->spec_item[i].spec_node.buf_min[idx2]; + cmcs_buf->spec_max[idx1] = + ts_cmcs->spec_item[i].spec_node.buf_max[idx2]; + idx2++; + } + } + } + success = true; + } + } + + if (success == false) + return -1; + +#if CMCS_PARSING_DEBUG + idx1 = 0; + tsp_info("# Node cm min specific\n"); + for (i = 0; i < tsp->ch_num.tx; i++) { + tsp_info(" "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%5d ", cmcs_buf->spec_min[idx1++]); + printk("\n"); + } + + idx1 = 0; + tsp_info("# Node cm max specific\n"); + for (i = 0; i < tsp->ch_num.tx; i++) { + tsp_info(" "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%5d ", cmcs_buf->spec_max[idx1++]); + printk("\n"); + } +#endif + + tsp_verb("# Apply slope0_x\n"); + for (i = 0; i < height; i++) { + for (j = 0; j < width - 1; j++) { + idx1 = (i * tsp->ch_num.rx) + j; + idx2 = idx1 + 1; + + pslope0[idx1] = (presult[idx2] - presult[idx1]); + pslope0[idx1] += + (((pspec_min[idx1] + pspec_max[idx1]) / 2) - + ((pspec_min[idx2] + pspec_max[idx2]) / 2)); + } + } + + tsp_verb("# Apply slope1_y\n"); + for (i = 0; i < height - 1; i++) { + for (j = 0; j < width; j++) { + idx1 = (i * tsp->ch_num.rx) + j; + idx2 = idx1 + tsp->ch_num.rx; + + pslope1[idx1] = (presult[idx2] - presult[idx1]); + pslope1[idx1] += + (((pspec_min[idx1] + pspec_max[idx1]) / 2) - + ((pspec_min[idx2] + pspec_max[idx2]) / 2)); + } + } + + tsp_verb("# Apply slope0_gtx_x\n"); + for (i = 0; i < tsp->gtx.num; i++) { + if (tsp->gtx.ch_num[i] > height) { + for (j = 0; j < width - 1; j++) { + idx1 = (tsp->gtx.ch_num[i] * tsp->ch_num.rx) + j; + idx2 = idx1 + 1; + + pslope0[idx1] = (presult[idx2] - presult[idx1]); + pslope0[idx1] += + (((pspec_min[idx1] + pspec_max[idx1]) / 2) - + ((pspec_min[idx2] + pspec_max[idx2]) / 2)); + } + } + } + + tsp_verb("# Apply slope1_gtx_y\n"); + for (i = 0; i < (tsp->gtx.num - 1); i++) { + if (tsp->gtx.ch_num[i] > height) { + for (j = 0; j < width; j++) { + idx1 = (tsp->gtx.ch_num[i] * tsp->ch_num.rx) + j; + idx2 = idx1 + tsp->ch_num.rx; + + pslope1[idx1] = (presult[idx2] - presult[idx1]); + pslope1[idx1] += + (((pspec_min[idx1] + pspec_max[idx1]) / 2) - + ((pspec_min[idx2] + pspec_max[idx2]) / 2)); + } + } + } + +#if CMCS_PARSING_DEBUG + tsp_info("# slope0_x\n"); + for (i = 0; i < height; i++) { + tsp_info(" "); + for (j = 0; j < width; j++) { + idx1 = (i * tsp->ch_num.rx) + j; + printk("%5d ", pslope0[idx1]); + } + printk("\n"); + } + + tsp_info("# slope1_y\n"); + for (i = 0; i < height; i++) { + tsp_info(" "); + for (j = 0; j < width; j++) { + idx1 = (i * tsp->ch_num.rx) + j; + printk("%5d ", pslope1[idx1]); + } + printk("\n"); + } + + tsp_info("# slope0_gtx_x\n"); + for (i = 0; i < tsp->gtx.num; i++) { + tsp_info(" "); + for (j = 0; j < width; j++) { + idx1 = (tsp->gtx.ch_num[i] * tsp->ch_num.rx) + j; + printk("%5d ", pslope0[idx1]); + } + printk("\n"); + } + + tsp_info("# slope1_gtx_y\n"); + for (i = 0; i < tsp->gtx.num; i++) { + tsp_info(" "); + for (j = 0; j < width; j++) { + idx1 = (tsp->gtx.ch_num[i] * tsp->ch_num.rx) + j; + printk("%5d ", pslope1[idx1]); + } + printk("\n"); + } + +#endif + + return 0; +} + +int ist30xx_get_cmcs_buf(struct ist30xx_data *data, const char *mode, + CMCS_ITEM items, s16 *buf) +{ + int ret = -EINVAL; + int i; + bool success = false; + u32 waddr; + u16 len; + + for (i = 0; i < items.cnt; i++) { + if (!strncmp(items.item[i].name, mode, 2)) { + waddr = IST30XX_DA_ADDR(items.item[i].addr); + len = items.item[i].size / IST30XX_DATA_LEN; + ret = ist30xx_burst_read(data->client, + waddr, (u32 *)buf, len, true); + if (unlikely(ret)) + return ret; + tsp_verb("%s, 0x%08x, %d\n", __func__, waddr, len); + success = true; + } + } + + if (success == false) + return ret; + +#if CMCS_PARSING_DEBUG + ret = ist30xx_parse_cmcs_buf(data, buf); +#endif + + return ret; +} + +int ist30xx_cmcs_wait(struct ist30xx_data *data) +{ + int cnt = IST30XX_CMCS_TIMEOUT / 100; + + data->status.cmcs = 0; + while (cnt-- > 0) { + msleep(100); + + if (data->status.cmcs) { + tsp_info("CMCS test complete\n"); + return 0; + } + } + tsp_warn("cmcs time out\n"); + + return -EPERM; +} + +#define cmcs_next_step(ret) { if (unlikely(ret)) goto end; msleep(20); } +int ist30xx_cmcs_test(struct ist30xx_data *data, const u8 *buf, int size) +{ + int ret; + int len; + u32 waddr; + u32 val; + u32 cs_chksum = 0; + u32 chksum = 0; + u32 *buf32; + + tsp_info("*** CM/CS test ***\n"); + + ist30xx_disable_irq(data); + ist30xx_reset(data, false); + + ret = ist30xx_write_cmd(data->client, + IST30XX_HIB_CMD, (eHCOM_RUN_RAMCODE << 16) | 0); + cmcs_next_step(ret); + + /* Set sensor register */ + buf32 = ts_cmcs->buf_sensor; + ret = ist30xx_set_cmcs_sensor(data->client, ts_cmcs->param, buf32); + cmcs_next_step(ret); + + /* Set command */ + ret = ist30xx_set_cmcs_cmd(data->client, ts_cmcs->cmds); + cmcs_next_step(ret); + + /* Load cmcs test code */ + buf32 = (u32 *)ts_cmcs->buf_cmcs; + len = ts_cmcs->param.cmcs_size / IST30XX_DATA_LEN - 1; + tsp_verb("%08x %08x %08x %08x\n", buf32[0], buf32[1], buf32[2], buf32[3]); + waddr = IST30XX_DA_ADDR(data->tags.ram_base); + tsp_verb("%08x(%d)\n", waddr, len); + + ret = ist30xx_burst_write(data->client, waddr, buf32, len); + cmcs_next_step(ret); + + waddr = IST30XX_DA_ADDR(ts_cmcs->param.cmcs_size_addr); + val = ts_cmcs->param.cmcs_size - 4; + ret = ist30xx_write_cmd(data->client, waddr, val); + cmcs_next_step(ret); + tsp_verb("size(0x%08x): 0x%08x\n", waddr, val); + + tsp_info("cmcs code loaded!\n"); + + /* Cal checksum & run cmcs */ + ret = ist30xx_write_cmd(data->client, + IST30XX_HIB_CMD, (eHCOM_RUN_RAMCODE << 16) | 1); + cmcs_next_step(ret); + + /* Check checksum */ + ret = ist30xx_read_reg(data->client, IST30XX_CMCS_CHECKSUM, &chksum); + cmcs_next_step(ret); + if (chksum != ts_cmcs->param.cmcs_chksum) + goto end; + + /* Check cs sensor checksum */ + ret = ist30xx_read_reg(data->client, IST30XX_CMCS_CS_CHECKSUM, &cs_chksum); + cmcs_next_step(ret); + if (cs_chksum != ts_cmcs->param.cs_sensor_chksum) + goto end; + + tsp_info("CM/CS code ready!!\n"); + + ist30xx_enable_irq(data); + /* Wait CMCS test result */ + if (ist30xx_cmcs_wait(data) == 0) { + tsp_info("CM/CS test OK\n"); + } else { + tsp_info("CM/CS test Fail!\n"); + ret = -ENOEXEC; + goto end; + } + ist30xx_disable_irq(data); + + /* Read CM data */ + memset(ts_cmcs_buf->cm, 0, sizeof(ts_cmcs_buf->cm)); + + ret = ist30xx_get_cmcs_buf(data, + IST30XX_CMCS_CM, ts_cmcs->items, ts_cmcs_buf->cm); + cmcs_next_step(ret); + + /* Read CS data */ + memset(ts_cmcs_buf->cs, 0, sizeof(ts_cmcs_buf->cs)); + + ret = ist30xx_get_cmcs_buf(data, + IST30XX_CMCS_CS, ts_cmcs->items, ts_cmcs_buf->cs); + cmcs_next_step(ret); + + ret = ist30xx_apply_cmcs_slope(data, ts_cmcs_buf); + cmcs_next_step(ret); + + cmcs_ready = CMCS_READY; +end: + if (unlikely(ret)) { + tsp_warn("CM/CS test Fail!, ret=%d\n", ret); + } else if (unlikely(chksum != ts_cmcs->param.cmcs_chksum)) { + tsp_warn("Error CheckSum: %x(%x)\n", + chksum, ts_cmcs->param.cmcs_chksum); + ret = -ENOEXEC; + } else if (unlikely(cs_chksum != ts_cmcs->param.cs_sensor_chksum)) { + tsp_warn("Error CS Sensor CheckSum: %x(%x)\n", + cs_chksum, ts_cmcs->param.cs_sensor_chksum); + ret = -ENOEXEC; + } + + ist30xx_reset(data, false); + ist30xx_start(data); + ist30xx_enable_irq(data); + + return ret; +} + + +int check_tsp_type(struct ist30xx_data *data, int tx, int rx) +{ + int i; + TSP_INFO *tsp = &data->tsp_info; + TKEY_INFO *tkey = &data->tkey_info; + + if ((tx >= tsp->ch_num.tx) || (tx < 0) || + (rx >= tsp->ch_num.rx) || (rx < 0)) { + tsp_warn("TSP channel is not correct!! (%d * %d)\n", tx, rx); + return TSP_CH_UNKNOWN; + } + + if ((tx >= tsp->screen.tx) || (rx >= tsp->screen.rx)) { + for (i = 0; i < tsp->gtx.num; i++) { + if ((tx == tsp->gtx.ch_num[i]) && (rx < tsp->screen.rx)) + return TSP_CH_GTX; + } + + for (i = 0; i < tkey->key_num; i++) { + if ((tx == tkey->ch_num[i].tx) && + (rx == tkey->ch_num[i].rx)) + return TSP_CH_KEY; + } + } else { + return TSP_CH_SCREEN; + } + + return TSP_CH_UNUSED; +} + +int print_cmcs(struct ist30xx_data *data, s16 *buf16, char *buf) +{ + int i, j; + int idx; + int type; + int count = 0; + char msg[128]; + + TSP_INFO *tsp = &data->tsp_info; + + int tx_num = tsp->ch_num.tx; + int rx_num = tsp->ch_num.rx; + + for (i = 0; i < tx_num; i++) { + for (j = 0; j < rx_num; j++) { + type = check_tsp_type(data, i, j); + idx = (i * rx_num) + j; + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + count += sprintf(msg, "%5d ", 0); + else + count += sprintf(msg, "%5d ", buf16[idx]); + + strcat(buf, msg); + } + + count += sprintf(msg, "\n"); + strcat(buf, msg); + } + + return count; +} + +int print_line_cmcs(struct ist30xx_data *data, int mode, s16 *buf16, char *buf) +{ + int i, j; + int idx; + int type; + int count = 0; + int key_index[5] = { 0, }; + int key_cnt = 0; + char msg[128]; + + TSP_INFO *tsp = &data->tsp_info; + + int tx_num = tsp->ch_num.tx; + int rx_num = tsp->ch_num.rx; + + for (i = 0; i < tx_num; i++) { + for (j = 0; j < rx_num; j++) { + type = check_tsp_type(data, i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; // Ignore + + if ((mode == CMCS_FLAG_CM_SLOPE0) && + (j == (tsp->screen.rx - 1))) + continue; + else if ((mode == CMCS_FLAG_CM_SLOPE1) && + (i == (tsp->screen.tx - 1))) + continue; + + if ((mode == CMCS_FLAG_CM_SLOPE0) && (type == TSP_CH_GTX) && + (j == (tsp->screen.rx - 1))) + continue; + else if ((mode == CMCS_FLAG_CM_SLOPE1) && + (type == TSP_CH_GTX) && + (i == tsp->gtx.ch_num[tsp->gtx.num - 1])) + continue; + + idx = (i * rx_num) + j; + + if (type == TSP_CH_KEY) { + key_index[key_cnt++] = idx; + continue; + } + + count += sprintf(msg, "%5d ", buf16[idx]); + strcat(buf, msg); + } + } + + tsp_info("key cnt: %d\n", key_cnt); + if ((mode != CMCS_FLAG_CM_SLOPE0) && (mode != CMCS_FLAG_CM_SLOPE1)) { + tsp_info("key cnt: %d\n", key_cnt); + for (i = 0; i < key_cnt; i++) { + count += sprintf(msg, "%5d ", buf16[key_index[i]]); + strcat(buf, msg); + } + } + + count += sprintf(msg, "\n"); + strcat(buf, msg); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/info */ +ssize_t ist30xx_cmcs_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i; + int count; + char msg[128]; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + TKEY_INFO *tkey = &data->tkey_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + /* Channel */ + count = sprintf(msg, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d ", + tsp->ch_num.tx, tsp->ch_num.rx, tsp->screen.tx, tsp->screen.rx, + tsp->gtx.num, tsp->gtx.ch_num[0], tsp->gtx.ch_num[1], + tsp->gtx.ch_num[2], tsp->gtx.ch_num[3], tkey->key_num, + tkey->ch_num[0].tx, tkey->ch_num[0].rx, tkey->ch_num[1].tx, + tkey->ch_num[1].rx, tkey->ch_num[2].tx, tkey->ch_num[2].rx, + tkey->ch_num[3].tx, tkey->ch_num[3].rx, tkey->ch_num[4].tx, + tkey->ch_num[4].rx); + strcat(buf, msg); + + /* Slope */ + count += sprintf(msg, "%d %d %d %d %d %d %d %d %d %d ", + ts_cmcs->spec_slope.x_min, ts_cmcs->spec_slope.x_max, + ts_cmcs->spec_slope.y_min, ts_cmcs->spec_slope.y_max, + ts_cmcs->spec_slope.gtx_x_min, ts_cmcs->spec_slope.gtx_x_max, + ts_cmcs->spec_slope.gtx_y_min, ts_cmcs->spec_slope.gtx_y_max, + ts_cmcs->spec_slope.key_min, ts_cmcs->spec_slope.key_max); + strcat(buf, msg); + + /* CS */ + for (i = 0; i < ts_cmcs->items.cnt; i++) { + if (!strncmp(ts_cmcs->items.item[i].name, IST30XX_CMCS_CS, 2)) { + if (!strncmp(ts_cmcs->items.item[i].spec_type, "T", 1)) { + count += sprintf(msg, "%d %d %d %d %d %d ", + ts_cmcs->spec_item[i].spec_total.screen_min, + ts_cmcs->spec_item[i].spec_total.screen_max, + ts_cmcs->spec_item[i].spec_total.gtx_min, + ts_cmcs->spec_item[i].spec_total.gtx_max, + ts_cmcs->spec_item[i].spec_total.key_min, + ts_cmcs->spec_item[i].spec_total.key_max); + strcat(buf, msg); + } + } + } + + /* CR */ + count += sprintf(msg, "%d %d %d %d %d %d ", + ts_cmcs->spec_cr.screen_min, ts_cmcs->spec_cr.screen_max, + ts_cmcs->spec_cr.gtx_min, ts_cmcs->spec_cr.gtx_max, + ts_cmcs->spec_cr.key_min, ts_cmcs->spec_cr.key_max); + strcat(buf, msg); + + tsp_verb("%s\n", buf); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/cmcs_binary */ +ssize_t ist30xx_cmcs_binary_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + struct ist30xx_data *data = dev_get_drvdata(dev); + + if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) + return sprintf(buf, "Binary is not correct(%d)\n", ts_cmcs_bin_size); + + ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); + if (ret) + goto binary_end; + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size); + mutex_unlock(&ist30xx_mutex); + +binary_end: + return sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n")); +} + +/* sysfs: /sys/class/touch/cmcs/cmcs_custom */ +ssize_t ist30xx_cmcs_custom_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + int bin_size = 0; + u8 *bin = NULL; + const struct firmware *req_bin = NULL; + struct ist30xx_data *data = dev_get_drvdata(dev); + + ret = request_firmware(&req_bin, IST30XX_CMCS_NAME, &data->client->dev); + if (ret) + return sprintf(buf, "File not found, %s\n", IST30XX_CMCS_NAME); + + bin = (u8 *)req_bin->data; + bin_size = (u32)req_bin->size; + + ret = ist30xx_get_cmcs_info(bin, bin_size); + if (ret) + goto custom_end; + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(data, bin, bin_size); + mutex_unlock(&ist30xx_mutex); + +custom_end: + release_firmware(req_bin); + + return sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n")); +} + +#define MAX_FILE_PATH 255 +/* sysfs: /sys/class/touch/cmcs/cmcs_sdcard */ +ssize_t ist30xx_cmcs_sdcard_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + int bin_size = 0; + u8 *bin = NULL; + const u8 *buff = 0; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FILE_PATH]; + struct ist30xx_data *data = dev_get_drvdata(dev); + + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s", + IST30XX_CMCS_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + ret = -ENOENT; + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + tsp_info("fail to alloc buffer\n"); + ret = -ENOMEM; + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_info("mismatch fw size\n"); + + goto err_fw_size; + } + + bin = (u8 *)buff; + bin_size = (u32)fsize; + + filp_close(fp, current->files); + set_fs(old_fs); + tsp_info("firmware is loaded!!\n"); + + ret = ist30xx_get_cmcs_info(bin, bin_size); + if (ret) + goto sdcard_end; + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(data, bin, bin_size); + mutex_unlock(&ist30xx_mutex); + +err_fw_size: + if (buff) + kfree(buff); +err_alloc: + if (fp) + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + +sdcard_end: + tsp_info("size: %d\n", sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n"))); + + return sprintf(buf, (ret == 0 ? "OK\n" : "Fail\n")); +} + +/* sysfs: /sys/class/touch/cmcs/cm */ +ssize_t ist30xx_cm_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + tsp_verb("CM (%d * %d)\n",tsp->ch_num.tx, tsp->ch_num.rx); + + return print_cmcs(data, ts_cmcs_buf->cm, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_spec_min */ +ssize_t ist30xx_cm_spec_min_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + tsp_verb("CM Spec Min (%d * %d)\n", tsp->ch_num.tx, tsp->ch_num.rx); + + return print_cmcs(data, ts_cmcs_buf->spec_min, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_spec_max */ +ssize_t ist30xx_cm_spec_max_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + tsp_verb("CM Spec Max (%d * %d)\n", tsp->ch_num.tx, tsp->ch_num.rx); + + return print_cmcs(data, ts_cmcs_buf->spec_max, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope0 */ +ssize_t ist30xx_cm_slope0_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + tsp_verb("CM Slope0_X (%d * %d)\n", tsp->ch_num.tx, tsp->ch_num.rx); + + return print_cmcs(data, ts_cmcs_buf->slope0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope1 */ +ssize_t ist30xx_cm_slope1_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + tsp_verb("CM Slope1_Y (%d * %d)\n", tsp->ch_num.tx, tsp->ch_num.rx); + + return print_cmcs(data, ts_cmcs_buf->slope1, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cs */ +ssize_t ist30xx_cs_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + tsp_verb("CS (%d * %d)\n", tsp->ch_num.tx, tsp->ch_num.rx); + + return print_cmcs(data, ts_cmcs_buf->cs, buf); +} + +int print_cm_slope_result(struct ist30xx_data *data, u8 flag, s16 *buf16, + char *buf) +{ + int i, j; + int type, idx; + int count = 0, err_cnt = 0; + int min_spec, max_spec, gtx_min_spec, gtx_max_spec; + + char msg[128]; + + TSP_INFO *tsp = &data->tsp_info; + struct CMCS_SPEC_SLOPE *spec = + (struct CMCS_SPEC_SLOPE *)&ts_cmcs->spec_slope; + + if (flag == CMCS_FLAG_CM_SLOPE0) { + min_spec = spec->x_min; + max_spec = spec->x_max; + gtx_min_spec = spec->gtx_x_min; + gtx_max_spec = spec->gtx_x_max; + } else if (flag == CMCS_FLAG_CM_SLOPE1) { + min_spec = spec->y_min; + max_spec = spec->y_max; + gtx_min_spec = spec->gtx_y_min; + gtx_max_spec = spec->gtx_y_max; + } else { + count = sprintf(msg, "Unknown flag: %d\n", flag); + strcat(buf, msg); + return count; + } + + count = sprintf(msg, "Spec: screen(%d~%d), GTx(%d~%d)\n", + min_spec, max_spec, gtx_min_spec, gtx_max_spec); + strcat(buf, msg); + + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + idx = (i * tsp->ch_num.rx) + j; + + type = check_tsp_type(data, i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED) || + (type == TSP_CH_KEY)) + continue; // Ignore + + if (type == TSP_CH_SCREEN) { + if ((buf16[idx] >= min_spec) && (buf16[idx] <= max_spec)) + continue; // OK + } else if (type == TSP_CH_GTX) { + if ((buf16[idx] >= gtx_min_spec) && + (buf16[idx] <= gtx_max_spec)) + continue; // OK + } + + count += sprintf(msg, "%2d,%2d:%4d\n", i, j, buf16[idx]); + strcat(buf, msg); + + err_cnt++; + } + } + + /* Check error count */ + if (err_cnt == 0) + count += sprintf(msg, "OK\n"); + else + count += sprintf(msg, "Fail, node count: %d\n", err_cnt); + strcat(buf, msg); + + return count; +} + +int print_cm_key_slope_result(struct ist30xx_data *data, s16 *buf16, char *buf, + bool print) +{ + int i, j; + int type, idx; + int count = 0; + int min_spec, max_spec; + int key_num = 0; + s16 key_cm[5] = { 0, }; + s16 slope_result; + + char msg[128]; + + TSP_INFO *tsp = &data->tsp_info; + struct CMCS_SPEC_SLOPE *spec = + (struct CMCS_SPEC_SLOPE *)&ts_cmcs->spec_slope; + + min_spec = spec->key_min; + max_spec = spec->key_max; + + if (print) { + count = sprintf(msg, "Spec: %d ~ %d\n", min_spec, max_spec); + strcat(buf, msg); + } + + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + idx = (i * tsp->ch_num.rx) + j; + + type = check_tsp_type(data, i, j); + if (type == TSP_CH_KEY) + key_cm[key_num++] = buf16[idx]; + } + } + + /* Check key slope */ + slope_result = key_cm[0] - key_cm[1]; + + if (print) { + if ((slope_result >= min_spec) && (slope_result <= max_spec)) + count += sprintf(msg, "OK (%d)\n", slope_result); + else + count += sprintf(msg, "Fail (%d)\n", slope_result); + } else { + count += sprintf(msg, "%d\n", + (slope_result >= 0 ? slope_result : -slope_result)); + } + + strcat(buf, msg); + + return count; +} + +int print_cs_result(struct ist30xx_data *data, s16 *buf16, char *buf) +{ + int i, j; + bool success = false; + int type, idx; + int count = 0, err_cnt = 0; + int min_spec, max_spec; + + char msg[128]; + + TSP_INFO *tsp = &data->tsp_info; + struct CMCS_SPEC_TOTAL *spec; + + for (i = 0; i < ts_cmcs->items.cnt; i++) { + if (!strncmp(ts_cmcs->items.item[i].name, IST30XX_CMCS_CS, 2)) { + if (!strncmp(ts_cmcs->items.item[i].spec_type, "T", 1)) { + spec = + (struct CMCS_SPEC_TOTAL *)&ts_cmcs->spec_item[i].spec_total; + success = true; + break; + } + } + } + + if (success == false) + return 0; + + count = sprintf(msg, "Spec: screen(%d~%d), gtx(%d~%d), key(%d~%d)\n", + spec->screen_min, spec->screen_max, spec->gtx_min, + spec->gtx_max, spec->key_min, spec->key_max); + strcat(buf, msg); + + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + idx = (i * tsp->ch_num.rx) + j; + + type = check_tsp_type(data, i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; // Ignore + + if (type == TSP_CH_SCREEN) { + min_spec = spec->screen_min; + max_spec = spec->screen_max; + } else if (type == TSP_CH_GTX) { + min_spec = spec->gtx_min; + max_spec = spec->gtx_max; + } else { // TSP_CH_KEY + min_spec = spec->key_min; + max_spec = spec->key_max; + } + + if ((buf16[idx] >= min_spec) && (buf16[idx] <= max_spec)) + continue; // OK + + count += sprintf(msg, "%2d,%2d:%4d\n", i, j, buf16[idx]); + strcat(buf, msg); + + err_cnt++; + } + } + + /* Check error count */ + if (err_cnt == 0) + count += sprintf(msg, "OK\n"); + else + count += sprintf(msg, "Fail, node count: %d\n", err_cnt); + strcat(buf, msg); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/cm_result */ +ssize_t ist30xx_cm_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, j; + int type, idx, err_cnt = 0; + int min_spec, max_spec; + int count = 0; + short cm; + char msg[128]; + + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + idx = (i * tsp->ch_num.rx) + j; + + type = check_tsp_type(data, i, j); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + continue; + + min_spec = ts_cmcs_buf->spec_min[idx]; + max_spec = ts_cmcs_buf->spec_max[idx]; + + cm = ts_cmcs_buf->cm[idx]; + if ((cm >= min_spec) && (cm <= max_spec)) + continue; // OK + + count += sprintf(msg, "%2d,%2d:%4d (%4d~%4d)\n", + i, j, cm, min_spec, max_spec); + strcat(buf, msg); + + err_cnt++; + } + } + + /* Check error count */ + if (err_cnt == 0) + count += sprintf(msg, "OK\n"); + else + count += sprintf(msg, "Fail, node count: %d\n", err_cnt); + strcat(buf, msg); + + return count; +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope0_result */ +ssize_t ist30xx_cm_slope0_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_cm_slope_result(data, CMCS_FLAG_CM_SLOPE0, + ts_cmcs_buf->slope0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_slope1_result */ +ssize_t ist30xx_cm_slope1_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_cm_slope_result(data, CMCS_FLAG_CM_SLOPE1, + ts_cmcs_buf->slope1, buf); +} +/* sysfs: /sys/class/touch/cmcs/cm_key_slope_result */ +ssize_t ist30xx_cm_key_slope_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_cm_key_slope_result(data, ts_cmcs_buf->cm, buf, true); +} + +/* sysfs: /sys/class/touch/cmcs/cs_result */ +ssize_t ist30xx_cs_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_cs_result(data, ts_cmcs_buf->cs, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cm */ +ssize_t ist30xx_line_cm_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_line_cmcs(data, CMCS_FLAG_CM, ts_cmcs_buf->cm, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cm_slope0 */ +ssize_t ist30xx_line_cm_slope0_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_line_cmcs(data, CMCS_FLAG_CM_SLOPE0, ts_cmcs_buf->slope0, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cm_slope1 */ +ssize_t ist30xx_line_cm_slope1_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_line_cmcs(data, CMCS_FLAG_CM_SLOPE1, ts_cmcs_buf->slope1, buf); +} + +/* sysfs: /sys/class/touch/cmcs/line_cs */ +ssize_t ist30xx_line_cs_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "CMCS test is not work!!\n"); + + return print_line_cmcs(data, CMCS_FLAG_CS, ts_cmcs_buf->cs, buf); +} + +/* sysfs: /sys/class/touch/cmcs/cm_key_slope_value */ +ssize_t ist30xx_cm_key_slope_value_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + struct ist30xx_data *data = dev_get_drvdata(dev); + + if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) + return sprintf(buf, "%s", "FFFF"); + + ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); + if (ret) + return sprintf(buf, "%s", "FFFF"); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size); + mutex_unlock(&ist30xx_mutex); + + if (ret) + return sprintf(buf, "%s", "FFFF"); + + if (cmcs_ready == CMCS_NOT_READY) + return sprintf(buf, "%s", "FFFF"); + + return print_cm_key_slope_result(data, ts_cmcs_buf->cm, buf, false); +} + +/* sysfs : cmcs */ +static DEVICE_ATTR(info, S_IRUGO, ist30xx_cmcs_info_show, NULL); +static DEVICE_ATTR(cmcs_binary, S_IRUGO, ist30xx_cmcs_binary_show, NULL); +static DEVICE_ATTR(cmcs_custom, S_IRUGO, ist30xx_cmcs_custom_show, NULL); +static DEVICE_ATTR(cmcs_sdcard, S_IRUGO, ist30xx_cmcs_sdcard_show, NULL); +static DEVICE_ATTR(cm, S_IRUGO, ist30xx_cm_show, NULL); +static DEVICE_ATTR(cm_spec_min, S_IRUGO, ist30xx_cm_spec_min_show, NULL); +static DEVICE_ATTR(cm_spec_max, S_IRUGO, ist30xx_cm_spec_max_show, NULL); +static DEVICE_ATTR(cm_slope0, S_IRUGO, ist30xx_cm_slope0_show, NULL); +static DEVICE_ATTR(cm_slope1, S_IRUGO, ist30xx_cm_slope1_show, NULL); +static DEVICE_ATTR(cs, S_IRUGO, ist30xx_cs_show, NULL); +static DEVICE_ATTR(cm_result, S_IRUGO, ist30xx_cm_result_show, NULL); +static DEVICE_ATTR(cm_slope0_result, S_IRUGO, + ist30xx_cm_slope0_result_show, NULL); +static DEVICE_ATTR(cm_slope1_result, S_IRUGO, + ist30xx_cm_slope1_result_show, NULL); +static DEVICE_ATTR(cm_key_slope_result, S_IRUGO, + ist30xx_cm_key_slope_result_show, NULL); +static DEVICE_ATTR(cs_result, S_IRUGO, ist30xx_cs_result_show, NULL); +static DEVICE_ATTR(line_cm, S_IRUGO, ist30xx_line_cm_show, NULL); +static DEVICE_ATTR(line_cm_slope0, S_IRUGO, ist30xx_line_cm_slope0_show, NULL); +static DEVICE_ATTR(line_cm_slope1, S_IRUGO, ist30xx_line_cm_slope1_show, NULL); +static DEVICE_ATTR(line_cs, S_IRUGO, ist30xx_line_cs_show, NULL); +static DEVICE_ATTR(cm_key_slope_value, S_IRUGO, + ist30xx_cm_key_slope_value_show, NULL); + +static struct attribute *cmcs_attributes[] = { + &dev_attr_info.attr, + &dev_attr_cmcs_binary.attr, + &dev_attr_cmcs_custom.attr, + &dev_attr_cmcs_sdcard.attr, + &dev_attr_cm.attr, + &dev_attr_cm_spec_min.attr, + &dev_attr_cm_spec_max.attr, + &dev_attr_cm_slope0.attr, + &dev_attr_cm_slope1.attr, + &dev_attr_cs.attr, + &dev_attr_cm_result.attr, + &dev_attr_cm_slope0_result.attr, + &dev_attr_cm_slope1_result.attr, + &dev_attr_cm_key_slope_result.attr, + &dev_attr_cs_result.attr, + &dev_attr_line_cm.attr, + &dev_attr_line_cm_slope0.attr, + &dev_attr_line_cm_slope1.attr, + &dev_attr_line_cs.attr, + &dev_attr_cm_key_slope_value.attr, + NULL, +}; + +static struct attribute_group cmcs_attr_group = { + .attrs = cmcs_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_cmcs_dev; + +int ist30xx_init_cmcs_sysfs(struct ist30xx_data *data) +{ + /* /sys/class/touch/cmcs */ + ist30xx_cmcs_dev = device_create(ist30xx_class, NULL, 0, data, "cmcs"); + + /* /sys/class/touch/cmcs/... */ + if (unlikely(sysfs_create_group(&ist30xx_cmcs_dev->kobj, + &cmcs_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "cmcs"); + +#if IST30XX_INTERNAL_CMCS_BIN + ts_cmcs_bin = (u8 *)ist30xx_cmcs; + ts_cmcs_bin_size = sizeof(ist30xx_cmcs); + + ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); +#endif + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.h b/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.h new file mode 100644 index 00000000..9a10b3d2 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs.h @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XXC_CMCS_H__ +#define __IST30XXC_CMCS_H__ + +#define IST30XX_INTERNAL_CMCS_BIN (1) + +#define CMCS_PARSING_DEBUG (0) +#define CMCS_RAMCODE_READ (0) + +#define CMCS_FLAG_CM (1) +#define CMCS_FLAG_CM_SPEC (1 << 1) +#define CMCS_FLAG_CM_SLOPE0 (1 << 2) +#define CMCS_FLAG_CM_SLOPE1 (1 << 3) +#define CMCS_FLAG_CS (1 << 4) + +#define CMCS_READY (0) +#define CMCS_NOT_READY (-1) + +#define IST30XX_CMCS_MSG_VALID (0x8FAB0FAB) +#define IST30XX_CMCS_TIMEOUT (10000) // unit : msec + +#define IST30XX_CMCS_CM ("CM") +#define IST30XX_CMCS_CS ("CS") + +// CMCS addr +#define IST30XX_CMCS_CHECKSUM IST30XX_DA_ADDR(0x300B0100) +#define IST30XX_CMCS_CS_CHECKSUM IST30XX_DA_ADDR(0x300B0108) +#define IST30XX_CMCS_PATTERN IST30XX_DA_ADDR(0x300B0104) + +#define ENABLE_CM_MODE(n) (n & 1) +#define ENABLE_CS_MODE(n) ((n >> 1) & 1) + +#define IST30XX_CMCS_NAME "ist30xxc.cms" +#define IST30XX_CMCS_MAGIC "CMCS2TAG" + +struct CMCS_SPEC_NODE { + u32 node_cnt; + u16 *buf_min; + u16 *buf_max; +}; + +struct CMCS_SPEC_TOTAL { + u16 screen_min; + u16 screen_max; + u16 gtx_min; + u16 gtx_max; + u16 key_min; + u16 key_max; +}; + +struct CMCS_ITEM_INFO { + char name[8]; + u32 addr; + u32 size; + char data_type[2]; + char spec_type[2]; +}; + +typedef struct _CMCS_ITEM { + u32 cnt; + struct CMCS_ITEM_INFO *item; +} CMCS_ITEM; + +struct CMCS_CMD_INFO { + u32 addr; + u32 value; +}; + +typedef struct _CMCS_CMD { + u32 cnt; + struct CMCS_CMD_INFO *cmd; +} CMCS_CMD; + +union CMCS_SPEC_ITEM { + struct CMCS_SPEC_NODE spec_node; + struct CMCS_SPEC_TOTAL spec_total; +}; + +struct CMCS_SPEC_SLOPE { + char name[8]; + s16 x_min; + s16 x_max; + s16 gtx_x_min; + s16 gtx_x_max; + s16 y_min; + s16 y_max; + s16 gtx_y_min; + s16 gtx_y_max; + s16 key_min; + s16 key_max; +}; + +struct CMCS_REG_INFO { + char name[8]; + u32 addr; + u32 size; +}; + +typedef struct _CMCS_PARAM { + u32 cmcs_size_addr; + u32 cmcs_size; + u32 cm_sensor1_addr; + u32 cm_sensor1_size; + u32 cm_sensor2_addr; + u32 cm_sensor2_size; + u32 cm_sensor3_addr; + u32 cm_sensor3_size; + u32 cs_sensor1_addr; + u32 cs_sensor1_size; + u32 cs_sensor2_addr; + u32 cs_sensor2_size; + u32 cs_sensor3_addr; + u32 cs_sensor3_size; + u32 cmcs_chksum; + u32 cm_sensor_chksum; + u32 cs_sensor_chksum; +} CMCS_PARAM; + +typedef struct _CMCS_BIN_INFO { + char magic1[8]; + CMCS_ITEM items; + CMCS_CMD cmds; + struct CMCS_SPEC_SLOPE spec_slope; + struct CMCS_SPEC_TOTAL spec_cr; + CMCS_PARAM param; + union CMCS_SPEC_ITEM *spec_item; + u8 *buf_cmcs; + u32 *buf_sensor; + char magic2[8]; +} CMCS_BIN_INFO; + +typedef struct _CMCS_BUF { + s16 cm[IST30XX_NODE_TOTAL_NUM]; + s16 spec_min[IST30XX_NODE_TOTAL_NUM]; + s16 spec_max[IST30XX_NODE_TOTAL_NUM]; + s16 slope0[IST30XX_NODE_TOTAL_NUM]; + s16 slope1[IST30XX_NODE_TOTAL_NUM]; + s16 cs[IST30XX_NODE_TOTAL_NUM]; +} CMCS_BUF; + +int check_tsp_type(struct ist30xx_data *data, int tx, int rx); +int ist30xx_get_cmcs_info(const u8 *buf, const u32 size); +int ist30xx_cmcs_test(struct ist30xx_data *data, const u8 *buf, int size); +int ist30xx_init_cmcs_sysfs(struct ist30xx_data *data); + +#endif // __IST30XXC_CMCS_H__ diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs_bin.h b/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs_bin.h new file mode 100644 index 00000000..429cfe1d --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_cmcs_bin.h @@ -0,0 +1,625 @@ +#ifndef __IST30XXC_CMCS_BIN_H__ +#define __IST30XXC_CMCS_BIN_H__ + +/* ist30xx cmcs binary: model( ) */ +static unsigned char ist30xx_cmcs[] = { + 0x43, 0x4d, 0x43, 0x53, 0x32, 0x54, 0x41, 0x47, 0x02, 0x00, 0x00, 0x00, 0x43, 0x4d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x4e, 0x00, 0x4e, 0x00, + 0x43, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, + 0x4e, 0x00, 0x54, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x11, 0x00, 0x00, 0xac, 0x0d, 0xac, 0x0d, + 0x28, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0xff, 0xc8, 0x00, 0x38, 0xff, 0xc8, 0x00, 0x38, 0xff, 0xc8, 0x00, 0x38, 0xff, 0xc8, 0x00, + 0x38, 0xff, 0xc8, 0x00, 0x78, 0x05, 0x98, 0x08, 0x78, 0x05, 0x98, 0x08, 0x78, 0x05, 0x98, 0x08, + 0x20, 0x11, 0x00, 0x00, 0x24, 0x07, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x00, 0x03, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x30, 0x00, 0x09, 0x00, 0x00, 0xc4, 0x52, 0x00, 0x30, 0x50, 0x01, 0x00, 0x00, + 0x30, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x14, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, + 0x30, 0x1d, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0x3a, 0x59, 0x64, 0x20, 0x57, 0x1d, 0x1a, 0x44, + 0x22, 0xc4, 0xa5, 0x15, 0xff, 0x00, 0x00, 0x00, 0x6d, 0x04, 0x46, 0x04, 0x20, 0x04, 0xf9, 0x03, + 0xc6, 0x03, 0xa3, 0x03, 0x99, 0x03, 0x9f, 0x03, 0xbb, 0x03, 0x48, 0x04, 0xe3, 0x03, 0xda, 0x03, + 0x0c, 0x04, 0xff, 0x03, 0xe4, 0x03, 0xcd, 0x03, 0xab, 0x03, 0x92, 0x03, 0x7d, 0x03, 0x73, 0x03, + 0xa6, 0x03, 0xbb, 0x03, 0xa6, 0x03, 0xa4, 0x03, 0xa9, 0x03, 0x98, 0x03, 0x9d, 0x03, 0x92, 0x03, + 0x8b, 0x03, 0x81, 0x03, 0x6c, 0x03, 0x51, 0x03, 0x5b, 0x03, 0x62, 0x03, 0x57, 0x03, 0x38, 0x03, + 0x4e, 0x04, 0x48, 0x04, 0x46, 0x04, 0x3b, 0x04, 0x26, 0x04, 0x2a, 0x04, 0x0c, 0x04, 0xf3, 0x03, + 0xf6, 0x03, 0xf9, 0x03, 0xec, 0x03, 0xdc, 0x03, 0x34, 0x04, 0x26, 0x04, 0x32, 0x04, 0x25, 0x04, + 0x16, 0x04, 0x0f, 0x04, 0xf3, 0x03, 0xdc, 0x03, 0xe8, 0x03, 0xf5, 0x03, 0x13, 0x04, 0xad, 0x03, + 0x01, 0x04, 0xfe, 0x03, 0x07, 0x04, 0xfe, 0x03, 0xef, 0x03, 0xeb, 0x03, 0xcf, 0x03, 0xb7, 0x03, + 0xbb, 0x03, 0xba, 0x03, 0xae, 0x03, 0x99, 0x03, 0x1b, 0x04, 0x0f, 0x04, 0x1a, 0x04, 0x11, 0x04, + 0x03, 0x04, 0xfc, 0x03, 0xe3, 0x03, 0xc7, 0x03, 0xd0, 0x03, 0xd8, 0x03, 0x07, 0x04, 0x95, 0x03, + 0xc4, 0x03, 0xc5, 0x03, 0xca, 0x03, 0xc3, 0x03, 0xb6, 0x03, 0xb4, 0x03, 0x9b, 0x03, 0x84, 0x03, + 0x88, 0x03, 0x83, 0x03, 0x76, 0x03, 0x68, 0x03, 0x03, 0x04, 0xf6, 0x03, 0xfd, 0x03, 0xf5, 0x03, + 0xe7, 0x03, 0xe4, 0x03, 0xcd, 0x03, 0xb2, 0x03, 0xb8, 0x03, 0xb1, 0x03, 0xab, 0x03, 0x7c, 0x03, + 0x05, 0x04, 0x09, 0x04, 0x11, 0x04, 0x0a, 0x04, 0xfb, 0x03, 0xf8, 0x03, 0xe0, 0x03, 0xc3, 0x03, + 0xcb, 0x03, 0xc4, 0x03, 0xb6, 0x03, 0xa8, 0x03, 0x30, 0x04, 0x22, 0x04, 0x2d, 0x04, 0x25, 0x04, + 0x17, 0x04, 0x13, 0x04, 0xf7, 0x03, 0xdb, 0x03, 0xe4, 0x03, 0xda, 0x03, 0xcf, 0x03, 0x9c, 0x03, + 0x31, 0x04, 0x42, 0x04, 0x4c, 0x04, 0x48, 0x04, 0x38, 0x04, 0x36, 0x04, 0x18, 0x04, 0xfa, 0x03, + 0x04, 0x04, 0xfa, 0x03, 0xeb, 0x03, 0xde, 0x03, 0x34, 0x04, 0x26, 0x04, 0x33, 0x04, 0x2f, 0x04, + 0x1c, 0x04, 0x16, 0x04, 0xfd, 0x03, 0xe2, 0x03, 0xe9, 0x03, 0xe3, 0x03, 0xd4, 0x03, 0x94, 0x03, + 0x4f, 0x04, 0x3a, 0x04, 0x44, 0x04, 0x41, 0x04, 0x2f, 0x04, 0x2a, 0x04, 0x0e, 0x04, 0xf1, 0x03, + 0xfa, 0x03, 0xf3, 0x03, 0xe3, 0x03, 0xd0, 0x03, 0xe0, 0x03, 0xd6, 0x03, 0xe3, 0x03, 0xda, 0x03, + 0xd4, 0x03, 0xc9, 0x03, 0xb1, 0x03, 0x95, 0x03, 0x9e, 0x03, 0x91, 0x03, 0x8d, 0x03, 0x7d, 0x03, + 0x26, 0x04, 0x1d, 0x04, 0x29, 0x04, 0x25, 0x04, 0x18, 0x04, 0x13, 0x04, 0xf4, 0x03, 0xd6, 0x03, + 0xdf, 0x03, 0xd5, 0x03, 0xc9, 0x03, 0xb3, 0x03, 0x09, 0x04, 0x02, 0x04, 0x10, 0x04, 0x09, 0x04, + 0xfe, 0x03, 0xf8, 0x03, 0xda, 0x03, 0xbc, 0x03, 0xc5, 0x03, 0xba, 0x03, 0xb2, 0x03, 0x97, 0x03, + 0xc0, 0x03, 0x9e, 0x03, 0xab, 0x03, 0xae, 0x03, 0xa1, 0x03, 0x8f, 0x03, 0x73, 0x03, 0x68, 0x03, + 0x6a, 0x03, 0x55, 0x03, 0x3b, 0x03, 0x8c, 0x03, 0xee, 0x03, 0x6d, 0x03, 0x71, 0x03, 0x6b, 0x03, + 0x5f, 0x03, 0x5a, 0x03, 0x5c, 0x03, 0x41, 0x03, 0x3e, 0x03, 0x2e, 0x03, 0x2a, 0x03, 0x55, 0x03, + 0xd6, 0x03, 0x66, 0x03, 0x68, 0x03, 0x6d, 0x03, 0x62, 0x03, 0x57, 0x03, 0x27, 0x03, 0x1a, 0x03, + 0x1a, 0x03, 0x17, 0x03, 0x14, 0x03, 0x65, 0x03, 0xb4, 0x03, 0xd5, 0x03, 0xdd, 0x03, 0xd9, 0x03, + 0xca, 0x03, 0xc7, 0x03, 0xbb, 0x03, 0x9b, 0x03, 0x9f, 0x03, 0x96, 0x03, 0x89, 0x03, 0x4c, 0x03, + 0xfe, 0x03, 0xeb, 0x02, 0x00, 0x00, 0x61, 0x07, 0x20, 0x07, 0xe0, 0x06, 0x9e, 0x06, 0x4a, 0x06, + 0x10, 0x06, 0x00, 0x06, 0x09, 0x06, 0x37, 0x06, 0x22, 0x07, 0x7a, 0x06, 0x6c, 0x06, 0xbf, 0x06, + 0xa8, 0x06, 0x7d, 0x06, 0x55, 0x06, 0x1d, 0x06, 0xf3, 0x05, 0xd0, 0x05, 0xc0, 0x05, 0x14, 0x06, + 0x37, 0x06, 0x14, 0x06, 0x11, 0x06, 0x19, 0x06, 0xfd, 0x05, 0x06, 0x06, 0xf4, 0x05, 0xe7, 0x05, + 0xd7, 0x05, 0xb5, 0x05, 0x87, 0x05, 0x98, 0x05, 0xa3, 0x05, 0x92, 0x05, 0x5e, 0x05, 0x2d, 0x07, + 0x23, 0x07, 0x1f, 0x07, 0x0d, 0x07, 0xea, 0x06, 0xf1, 0x06, 0xbf, 0x06, 0x94, 0x06, 0x9b, 0x06, + 0x9f, 0x06, 0x8a, 0x06, 0x6f, 0x06, 0x01, 0x07, 0xea, 0x06, 0xfe, 0x06, 0xe9, 0x06, 0xcf, 0x06, + 0xc4, 0x06, 0x95, 0x06, 0x6f, 0x06, 0x82, 0x06, 0x99, 0x06, 0xcb, 0x06, 0x20, 0x06, 0xac, 0x06, + 0xa8, 0x06, 0xb6, 0x06, 0xa8, 0x06, 0x8e, 0x06, 0x88, 0x06, 0x5a, 0x06, 0x32, 0x06, 0x37, 0x06, + 0x37, 0x06, 0x22, 0x06, 0xfe, 0x05, 0xd8, 0x06, 0xc4, 0x06, 0xd6, 0x06, 0xc6, 0x06, 0xb0, 0x06, + 0xa4, 0x06, 0x7a, 0x06, 0x4c, 0x06, 0x5b, 0x06, 0x68, 0x06, 0xb7, 0x06, 0xf8, 0x05, 0x47, 0x06, + 0x48, 0x06, 0x50, 0x06, 0x45, 0x06, 0x30, 0x06, 0x2c, 0x06, 0x02, 0x06, 0xdb, 0x05, 0xe2, 0x05, + 0xda, 0x05, 0xc5, 0x05, 0xad, 0x05, 0xb0, 0x06, 0x9a, 0x06, 0xa6, 0x06, 0x98, 0x06, 0x80, 0x06, + 0x7c, 0x06, 0x55, 0x06, 0x28, 0x06, 0x33, 0x06, 0x26, 0x06, 0x1c, 0x06, 0xce, 0x05, 0xb3, 0x06, + 0xb9, 0x06, 0xc7, 0x06, 0xbc, 0x06, 0xa2, 0x06, 0x9d, 0x06, 0x75, 0x06, 0x46, 0x06, 0x52, 0x06, + 0x47, 0x06, 0x2f, 0x06, 0x18, 0x06, 0xfa, 0x06, 0xe3, 0x06, 0xf5, 0x06, 0xe9, 0x06, 0xd1, 0x06, + 0xca, 0x06, 0x9b, 0x06, 0x6d, 0x06, 0x7c, 0x06, 0x6b, 0x06, 0x58, 0x06, 0x04, 0x06, 0xfc, 0x06, + 0x18, 0x07, 0x2a, 0x07, 0x22, 0x07, 0x08, 0x07, 0x04, 0x07, 0xd3, 0x06, 0xa1, 0x06, 0xb1, 0x06, + 0xa1, 0x06, 0x88, 0x06, 0x72, 0x06, 0x01, 0x07, 0xe9, 0x06, 0x00, 0x07, 0xfa, 0x06, 0xda, 0x06, + 0xcf, 0x06, 0xa6, 0x06, 0x78, 0x06, 0x85, 0x06, 0x7b, 0x06, 0x61, 0x06, 0xf7, 0x05, 0x2e, 0x07, + 0x0b, 0x07, 0x1c, 0x07, 0x18, 0x07, 0xf9, 0x06, 0xf0, 0x06, 0xc2, 0x06, 0x92, 0x06, 0xa0, 0x06, + 0x95, 0x06, 0x7a, 0x06, 0x5a, 0x06, 0x76, 0x06, 0x65, 0x06, 0x7b, 0x06, 0x6b, 0x06, 0x61, 0x06, + 0x4f, 0x06, 0x27, 0x06, 0xf8, 0x05, 0x08, 0x06, 0xf2, 0x05, 0xeb, 0x05, 0xd0, 0x05, 0xeb, 0x06, + 0xdb, 0x06, 0xf0, 0x06, 0xe8, 0x06, 0xd3, 0x06, 0xca, 0x06, 0x96, 0x06, 0x64, 0x06, 0x73, 0x06, + 0x63, 0x06, 0x4f, 0x06, 0x2a, 0x06, 0xba, 0x06, 0xae, 0x06, 0xc5, 0x06, 0xba, 0x06, 0xa8, 0x06, + 0x9d, 0x06, 0x6b, 0x06, 0x3a, 0x06, 0x48, 0x06, 0x36, 0x06, 0x28, 0x06, 0xfc, 0x05, 0x40, 0x06, + 0x07, 0x06, 0x1d, 0x06, 0x21, 0x06, 0x0d, 0x06, 0xef, 0x05, 0xc0, 0x05, 0xae, 0x05, 0xb0, 0x05, + 0x8e, 0x05, 0x62, 0x05, 0xea, 0x05, 0x8c, 0x06, 0xb6, 0x05, 0xbd, 0x05, 0xb2, 0x05, 0x9e, 0x05, + 0x95, 0x05, 0x99, 0x05, 0x6c, 0x05, 0x67, 0x05, 0x4c, 0x05, 0x46, 0x05, 0x8e, 0x05, 0x64, 0x06, + 0xaa, 0x05, 0xad, 0x05, 0xb5, 0x05, 0xa3, 0x05, 0x91, 0x05, 0x42, 0x05, 0x2c, 0x05, 0x2c, 0x05, + 0x27, 0x05, 0x21, 0x05, 0xa8, 0x05, 0x8e, 0x05, 0xc0, 0x05, 0xcc, 0x05, 0xc6, 0x05, 0xae, 0x05, + 0xaa, 0x05, 0x98, 0x05, 0x68, 0x05, 0x6f, 0x05, 0x60, 0x05, 0x4d, 0x05, 0xf2, 0x04, 0xa8, 0x06, + 0xdd, 0x04, 0x00, 0x00, 0x1c, 0x0c, 0x74, 0x0e, 0x1c, 0x0c, 0x74, 0x0e, 0x1c, 0x0c, 0x74, 0x0e, + 0x04, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x1c, 0x11, 0x0c, 0x80, 0x20, 0x07, 0xeb, 0x33, 0x00, 0x00, + 0xf2, 0xfe, 0x00, 0x00, 0x08, 0x70, 0x00, 0x40, 0x38, 0x67, 0x08, 0x70, 0xb9, 0x67, 0x08, 0x70, + 0xe1, 0xf0, 0x00, 0x00, 0x08, 0x60, 0x00, 0x40, 0x38, 0x76, 0x08, 0x70, 0xd6, 0x72, 0x82, 0xfd, + 0xe1, 0xf0, 0x00, 0x00, 0x3c, 0x10, 0x10, 0x00, 0xd1, 0xc1, 0x06, 0xe2, 0x08, 0xd0, 0x00, 0x40, + 0x04, 0xc1, 0xc4, 0xe0, 0x82, 0x0a, 0xab, 0x00, 0x00, 0x00, 0x04, 0x21, 0xb9, 0xcd, 0x00, 0x70, + 0x2b, 0x01, 0x00, 0x00, 0x34, 0xe1, 0xf2, 0xf6, 0x50, 0xc1, 0x2c, 0x10, 0x10, 0x00, 0xe1, 0xf0, + 0x77, 0x41, 0x14, 0x71, 0x34, 0x41, 0xc6, 0x47, 0x82, 0x04, 0xb1, 0x32, 0x24, 0x24, 0xf2, 0xfb, + 0xe1, 0xf0, 0x00, 0x00, 0xf7, 0x40, 0x04, 0x70, 0xc6, 0x74, 0x82, 0x07, 0x2f, 0x67, 0x07, 0x00, + 0x26, 0x62, 0xa1, 0x36, 0x24, 0x71, 0xf2, 0xf9, 0xe1, 0xf0, 0x00, 0x00, 0x04, 0x70, 0xc6, 0x74, + 0x82, 0x06, 0x2f, 0x67, 0x02, 0x00, 0x91, 0x36, 0x24, 0x71, 0xf2, 0xfa, 0xe1, 0xf0, 0x00, 0x00, + 0x34, 0x14, 0xb1, 0xf1, 0x77, 0x41, 0x04, 0x70, 0x14, 0x61, 0x34, 0x41, 0xc6, 0x46, 0x82, 0x09, + 0x2f, 0x57, 0x03, 0x00, 0x30, 0xf5, 0x2f, 0x57, 0x02, 0x00, 0xb1, 0xf5, 0x24, 0x74, 0xf2, 0xf6, + 0x30, 0xf1, 0x24, 0x14, 0xe1, 0xf0, 0x00, 0x00, 0x04, 0x70, 0xc6, 0x74, 0x82, 0x09, 0x2f, 0x67, + 0x03, 0x00, 0x10, 0x56, 0x2f, 0x67, 0x02, 0x00, 0x91, 0x56, 0x24, 0x71, 0xf2, 0xf7, 0xe1, 0xf0, + 0x08, 0x60, 0x00, 0x30, 0x38, 0x76, 0x28, 0x00, 0xd4, 0x74, 0x92, 0xfd, 0xe1, 0xf0, 0x00, 0x00, + 0x77, 0x31, 0x04, 0x70, 0x14, 0x61, 0x34, 0x31, 0xc6, 0x36, 0x82, 0x05, 0x30, 0x52, 0x24, 0x24, + 0x26, 0x75, 0xf2, 0xfa, 0x06, 0x27, 0xe1, 0xf0, 0x04, 0x6e, 0xa9, 0x60, 0x62, 0x07, 0x0c, 0x60, + 0x16, 0x00, 0xa9, 0x60, 0x60, 0x07, 0x04, 0x6c, 0xa9, 0x60, 0x5e, 0x07, 0x0c, 0x60, 0x14, 0x00, + 0xa9, 0x60, 0x5c, 0x07, 0x0c, 0x50, 0x24, 0x01, 0x06, 0x76, 0x0c, 0x70, 0x20, 0x07, 0xb9, 0x50, + 0x20, 0x07, 0x0c, 0x60, 0x25, 0x01, 0xb9, 0x67, 0x04, 0x00, 0x0c, 0x60, 0xf1, 0x0e, 0xb9, 0x67, + 0x08, 0x00, 0xb9, 0x67, 0x0c, 0x00, 0xb9, 0x67, 0x10, 0x00, 0xe1, 0xf0, 0x3c, 0x10, 0x20, 0x00, + 0xd9, 0xc1, 0x10, 0x00, 0x08, 0xc0, 0x00, 0x30, 0xd1, 0x81, 0x04, 0xd0, 0x06, 0xb2, 0x2c, 0xc0, + 0x00, 0x49, 0x78, 0x70, 0x60, 0x07, 0xc6, 0xd7, 0x32, 0x18, 0x04, 0xe0, 0x78, 0x30, 0x62, 0x07, + 0xc6, 0xe3, 0x32, 0x11, 0x06, 0x2d, 0xdb, 0x37, 0x00, 0x00, 0x26, 0x2e, 0x06, 0x72, 0x57, 0x71, + 0x26, 0x7c, 0x30, 0x77, 0x2f, 0x62, 0x02, 0x00, 0x26, 0x6b, 0x5c, 0x70, 0xff, 0x0f, 0xa1, 0x76, + 0x24, 0xe1, 0xf2, 0xed, 0x24, 0xd1, 0xf2, 0xe6, 0x58, 0xc1, 0x10, 0x00, 0x50, 0x81, 0x2c, 0x10, + 0x20, 0x00, 0xe1, 0xf0, 0x3c, 0x10, 0x10, 0x00, 0xd1, 0xc1, 0x06, 0xd3, 0x78, 0x30, 0x62, 0x07, + 0x06, 0xe2, 0x06, 0xc4, 0xdb, 0x37, 0x00, 0x00, 0x78, 0x60, 0x5e, 0x07, 0x2f, 0x7d, 0x02, 0x00, + 0xc6, 0xd6, 0xb1, 0x7c, 0xa2, 0x12, 0x06, 0x56, 0x0c, 0x50, 0x20, 0x07, 0x38, 0x55, 0x04, 0x00, + 0x04, 0x20, 0xc6, 0x75, 0x92, 0x03, 0x28, 0x20, 0x3a, 0x07, 0x38, 0x60, 0x20, 0x07, 0xc6, 0x76, + 0x92, 0x12, 0x28, 0x20, 0x3a, 0x07, 0xf2, 0x0f, 0x78, 0x70, 0x5c, 0x07, 0xc6, 0xe7, 0xb2, 0x04, + 0x28, 0x20, 0x38, 0x07, 0xf2, 0x08, 0xcc, 0xe0, 0x15, 0x00, 0x82, 0xfb, 0xcc, 0xe0, 0xff, 0x00, + 0x82, 0xf8, 0x04, 0x20, 0x50, 0xc1, 0x2c, 0x10, 0x10, 0x00, 0xe1, 0xf0, 0x08, 0x70, 0x0f, 0xc0, + 0x2c, 0x70, 0xff, 0xff, 0x08, 0x60, 0x00, 0x40, 0xb9, 0x76, 0x3c, 0x71, 0x08, 0x70, 0x00, 0x30, + 0x2c, 0x70, 0x00, 0x40, 0x57, 0x21, 0x2f, 0x57, 0x02, 0x00, 0x30, 0x75, 0xc4, 0x40, 0x0c, 0x60, + 0xff, 0x03, 0x56, 0x67, 0x77, 0x75, 0x5c, 0x70, 0xff, 0x03, 0x82, 0x09, 0xc4, 0x30, 0x82, 0x04, + 0x26, 0x64, 0x26, 0x74, 0xf2, 0x11, 0x36, 0x74, 0x36, 0x64, 0xf2, 0x0e, 0xc4, 0x30, 0x82, 0x07, + 0xc6, 0x76, 0x02, 0x03, 0x24, 0x61, 0xf2, 0x0d, 0x24, 0x71, 0xf2, 0x06, 0xc6, 0x76, 0x02, 0x03, + 0x34, 0x71, 0xf2, 0x02, 0x34, 0x61, 0xc4, 0x60, 0x02, 0x06, 0xcc, 0x60, 0xff, 0x03, 0x12, 0x06, + 0x04, 0x20, 0xf2, 0x07, 0x14, 0x21, 0x04, 0x61, 0xf2, 0x04, 0x14, 0x21, 0x0c, 0x60, 0xff, 0x03, + 0xc4, 0x70, 0x02, 0x08, 0xcc, 0x70, 0xff, 0x03, 0x02, 0x07, 0x14, 0x21, 0x0c, 0x70, 0xff, 0x03, + 0xf2, 0x03, 0x14, 0x21, 0x04, 0x71, 0x57, 0x75, 0x66, 0x76, 0xb1, 0x75, 0x08, 0x70, 0x00, 0x40, + 0xb9, 0x07, 0x3c, 0x71, 0xe1, 0xf0, 0x00, 0x00, 0x3c, 0x10, 0x28, 0x00, 0xd9, 0xc1, 0x18, 0x00, + 0x06, 0xe2, 0x78, 0x20, 0x5c, 0x07, 0xd9, 0x81, 0x08, 0x00, 0x78, 0x30, 0x5e, 0x07, 0x24, 0x21, + 0xdb, 0x37, 0x00, 0x00, 0x24, 0x22, 0xb9, 0x21, 0x04, 0x00, 0x0c, 0x20, 0x30, 0x11, 0x23, 0x3e, + 0x0c, 0x40, 0x68, 0x02, 0xab, 0x03, 0x00, 0x00, 0x06, 0x2a, 0x0c, 0x20, 0xb0, 0x15, 0x04, 0x30, + 0x0c, 0x40, 0x34, 0x01, 0x6b, 0x04, 0x00, 0x00, 0x06, 0x29, 0x0c, 0x20, 0xf0, 0x17, 0x04, 0x31, + 0x0c, 0x40, 0x34, 0x01, 0x08, 0xc0, 0x00, 0x30, 0x6b, 0x04, 0x00, 0x00, 0x0c, 0xd0, 0x82, 0x00, + 0x2c, 0xc0, 0x00, 0x49, 0x04, 0x21, 0x04, 0x80, 0xab, 0x01, 0x00, 0x00, 0x06, 0xe8, 0x78, 0x70, + 0x60, 0x07, 0xc6, 0x87, 0x32, 0x48, 0x04, 0xb0, 0x78, 0x60, 0x62, 0x07, 0xc6, 0xb6, 0x32, 0x41, + 0x06, 0x41, 0x06, 0x28, 0x06, 0x3b, 0x2b, 0x0d, 0x00, 0x00, 0x86, 0x42, 0x82, 0x38, 0x30, 0x21, + 0x06, 0x5a, 0x0c, 0x50, 0xb0, 0x15, 0x06, 0x62, 0x57, 0x61, 0x26, 0x6c, 0x30, 0x66, 0x26, 0x52, + 0x5c, 0x60, 0xff, 0x0f, 0x3f, 0x44, 0x06, 0x00, 0x90, 0x65, 0x82, 0x04, 0xcc, 0x40, 0x46, 0x00, + 0x02, 0x25, 0x06, 0x69, 0x0c, 0x60, 0xf0, 0x17, 0x26, 0x62, 0x10, 0x36, 0xc4, 0x31, 0x0c, 0xf0, + 0x30, 0x11, 0x2f, 0x32, 0x02, 0x00, 0x92, 0x05, 0xc4, 0x40, 0x22, 0x0e, 0x91, 0x06, 0xf2, 0x0c, + 0xc4, 0x40, 0x12, 0x0a, 0x04, 0x41, 0x91, 0x46, 0x2f, 0x43, 0x0f, 0x00, 0xa0, 0x44, 0x92, 0x04, + 0x10, 0x45, 0x24, 0x41, 0x91, 0x45, 0x2f, 0x53, 0x0f, 0x00, 0x20, 0x45, 0xf7, 0x40, 0xa1, 0x45, + 0x10, 0x36, 0x6b, 0x10, 0x00, 0x00, 0xc4, 0x20, 0x32, 0x02, 0x24, 0xe1, 0x24, 0xb1, 0xf2, 0xbd, + 0x24, 0x81, 0xf2, 0xb6, 0x38, 0x71, 0x04, 0x00, 0xc6, 0xe7, 0xb2, 0x03, 0xb4, 0xd1, 0x92, 0xab, + 0x58, 0xc1, 0x18, 0x00, 0x58, 0x81, 0x08, 0x00, 0x2c, 0x10, 0x28, 0x00, 0xe1, 0xf0, 0x00, 0x00, + 0x34, 0x18, 0x08, 0x70, 0x0f, 0xc0, 0xc1, 0xe1, 0x2c, 0x70, 0xff, 0xff, 0x08, 0xe0, 0x00, 0x40, + 0x08, 0x20, 0x00, 0x30, 0x08, 0x30, 0x06, 0x00, 0xb9, 0x7e, 0x3c, 0x71, 0x2c, 0x20, 0x00, 0x40, + 0x2c, 0x30, 0x80, 0x01, 0x0c, 0x40, 0x00, 0x09, 0x0b, 0x03, 0x00, 0x00, 0xb9, 0x0e, 0x3c, 0x71, + 0x0c, 0x20, 0x00, 0x02, 0x4b, 0x15, 0x00, 0x00, 0x40, 0xe1, 0x24, 0x18, 0xe1, 0xf0, 0x00, 0x00, + 0x34, 0x18, 0xc1, 0xe1, 0x08, 0x60, 0x00, 0x30, 0x08, 0x50, 0xff, 0xcf, 0x0c, 0x70, 0x6c, 0x53, + 0x0c, 0xf0, 0x98, 0xac, 0x0c, 0x40, 0x7c, 0x53, 0x26, 0xf5, 0x26, 0x76, 0x0c, 0xe0, 0x38, 0x07, + 0x2c, 0x50, 0xa8, 0xac, 0x26, 0x46, 0x30, 0x27, 0x2f, 0x6e, 0x07, 0x00, 0x2f, 0x3f, 0x06, 0x00, + 0xb1, 0x23, 0x38, 0x37, 0x10, 0x00, 0x26, 0x65, 0xb1, 0x36, 0xb1, 0x07, 0xb9, 0x07, 0x10, 0x00, + 0x24, 0x74, 0xc6, 0x74, 0x92, 0xf1, 0x40, 0xe1, 0x24, 0x18, 0xe1, 0xf0, 0x34, 0x18, 0x08, 0x60, + 0x00, 0x30, 0x08, 0x50, 0xff, 0xcf, 0xc1, 0xe1, 0x0c, 0x70, 0x6c, 0x53, 0x0c, 0xf0, 0x98, 0xac, + 0x0c, 0x40, 0x7c, 0x53, 0x26, 0xf5, 0x26, 0x76, 0x0c, 0x30, 0x38, 0x07, 0x2c, 0x50, 0xa8, 0xac, + 0x26, 0x46, 0x2f, 0x63, 0x07, 0x00, 0x2f, 0xef, 0x06, 0x00, 0x30, 0xee, 0xc4, 0x20, 0xb1, 0xe7, + 0x92, 0x05, 0x26, 0x65, 0x30, 0x66, 0xb9, 0x67, 0x10, 0x00, 0x24, 0x74, 0xc6, 0x74, 0x92, 0xf2, + 0x40, 0xe1, 0x24, 0x18, 0xe1, 0xf0, 0x00, 0x00, 0x3c, 0x10, 0xb0, 0x00, 0xd9, 0xc1, 0xa0, 0x00, + 0xd9, 0x81, 0x90, 0x00, 0x08, 0xe0, 0x00, 0x40, 0x38, 0x7e, 0x0c, 0x70, 0x08, 0x60, 0xff, 0xe0, + 0x2c, 0x60, 0xff, 0xe0, 0x56, 0x76, 0x08, 0x60, 0x00, 0x01, 0x2c, 0x60, 0x00, 0x01, 0x66, 0x76, + 0x06, 0xc2, 0x0c, 0x30, 0xa8, 0x71, 0x0c, 0x20, 0x70, 0x00, 0xb9, 0x7e, 0x0c, 0x70, 0x26, 0x3e, + 0x26, 0x21, 0x0c, 0x40, 0x20, 0x00, 0x4b, 0x06, 0x00, 0x00, 0x0c, 0x20, 0xa8, 0x71, 0x26, 0x2e, + 0x04, 0x30, 0x0c, 0x40, 0x20, 0x00, 0x6b, 0x04, 0x00, 0x00, 0x08, 0x30, 0x00, 0x30, 0x06, 0x21, + 0x2c, 0x30, 0x00, 0x40, 0x0c, 0x40, 0x70, 0x00, 0x0b, 0x05, 0x00, 0x00, 0x0c, 0xb0, 0x62, 0x07, + 0x38, 0xae, 0x78, 0x71, 0x14, 0xe1, 0x24, 0xe1, 0xcc, 0xe0, 0x1f, 0x00, 0x82, 0x61, 0x04, 0x71, + 0x53, 0x7e, 0x06, 0x67, 0xd6, 0x6a, 0x82, 0xf8, 0x08, 0x60, 0x00, 0x80, 0x66, 0x67, 0x08, 0x70, + 0x00, 0x40, 0xb9, 0x67, 0x78, 0x71, 0x0c, 0x70, 0x70, 0x00, 0x26, 0x71, 0x26, 0x7e, 0x10, 0xd7, + 0x70, 0x3b, 0x06, 0x7d, 0x57, 0x71, 0x26, 0x71, 0x30, 0x67, 0x08, 0x70, 0x00, 0x30, 0xb9, 0x67, + 0x00, 0x40, 0x2f, 0x6d, 0x03, 0x00, 0x57, 0x61, 0x26, 0x61, 0x30, 0x66, 0x78, 0x20, 0x60, 0x07, + 0xb9, 0x67, 0x04, 0x40, 0x06, 0xf3, 0x0c, 0x40, 0x08, 0x40, 0x26, 0x3d, 0x26, 0x47, 0x57, 0xf1, + 0x57, 0x31, 0x04, 0x50, 0x04, 0x62, 0x2c, 0x70, 0x00, 0x40, 0xc6, 0x62, 0x26, 0x5f, 0x32, 0x09, + 0x2f, 0x87, 0x05, 0x00, 0x26, 0x83, 0x30, 0x88, 0x24, 0x61, 0xb1, 0x84, 0x24, 0x44, 0xf2, 0xf6, + 0x04, 0x25, 0xab, 0x01, 0x00, 0x00, 0x70, 0x3b, 0x78, 0x20, 0x60, 0x07, 0x26, 0x33, 0x26, 0xdd, + 0x36, 0xd3, 0x0c, 0x70, 0x80, 0x1e, 0x2f, 0xfd, 0x0c, 0x00, 0x08, 0x60, 0x00, 0x30, 0x26, 0xd7, + 0x04, 0x70, 0x2c, 0x60, 0x00, 0x49, 0x06, 0x57, 0xc6, 0x52, 0x26, 0x73, 0x32, 0xad, 0x30, 0x46, + 0x2f, 0x87, 0x0f, 0x00, 0x20, 0x88, 0x5c, 0x40, 0xff, 0x0f, 0x36, 0x48, 0xc4, 0x40, 0x2f, 0x97, + 0x0d, 0x00, 0x32, 0x02, 0x04, 0x40, 0xa1, 0x49, 0x24, 0x51, 0x24, 0x64, 0xf2, 0xee, 0x58, 0xc1, + 0xa0, 0x00, 0x58, 0x81, 0x90, 0x00, 0x2c, 0x10, 0xb0, 0x00, 0xe1, 0xf0, 0x34, 0x18, 0xc1, 0xe1, + 0x0b, 0x20, 0x00, 0x00, 0x04, 0x25, 0xab, 0x01, 0x00, 0x00, 0x06, 0x2e, 0x0c, 0x20, 0x00, 0x23, + 0x6b, 0x0a, 0x00, 0x00, 0x04, 0x20, 0x6b, 0x22, 0x00, 0x00, 0x06, 0x2e, 0x0c, 0x20, 0x00, 0x23, + 0xcb, 0x24, 0x00, 0x00, 0x40, 0xe1, 0x24, 0x18, 0xe1, 0xf0, 0x00, 0x00, 0x34, 0x14, 0xb1, 0xf1, + 0x0b, 0x20, 0x00, 0x00, 0x0b, 0x1e, 0x00, 0x00, 0x04, 0x21, 0x6b, 0x22, 0x00, 0x00, 0x04, 0x2a, + 0xab, 0x01, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x23, 0x6b, 0x0a, 0x00, 0x00, 0x30, 0xf1, 0x24, 0x14, + 0xe1, 0xf0, 0x00, 0x00, 0x08, 0x20, 0x00, 0x40, 0x34, 0x18, 0x2c, 0x20, 0x08, 0x70, 0x0c, 0x30, + 0x38, 0x11, 0x0c, 0x40, 0xf8, 0x02, 0xc1, 0xe1, 0x0b, 0x05, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x40, + 0x08, 0xe0, 0x00, 0x30, 0x26, 0x2e, 0x0c, 0x30, 0x30, 0x14, 0x0c, 0x40, 0x00, 0x09, 0x0b, 0x05, + 0x00, 0x00, 0x0c, 0x20, 0xc4, 0x52, 0x26, 0x2e, 0x0c, 0x30, 0x30, 0x1d, 0x0c, 0x40, 0x50, 0x01, + 0x0b, 0x05, 0x00, 0x00, 0x40, 0xe1, 0x24, 0x18, 0xe1, 0xf0, 0x00, 0x00, 0x3c, 0x10, 0x10, 0x00, + 0x08, 0x70, 0x00, 0x30, 0xd1, 0xc1, 0x2c, 0x70, 0x00, 0x01, 0xb9, 0x70, 0x34, 0x07, 0x0b, 0x07, + 0x00, 0x00, 0x38, 0x30, 0x20, 0x11, 0x38, 0xd0, 0x34, 0x07, 0x04, 0x20, 0x06, 0xc7, 0x0c, 0xc0, + 0x20, 0x11, 0x8b, 0x07, 0x00, 0x00, 0xb1, 0x2d, 0x0c, 0x20, 0x30, 0x11, 0x0c, 0x30, 0x80, 0x1e, + 0x36, 0x32, 0x8b, 0x07, 0x00, 0x00, 0xb9, 0x2d, 0x08, 0x00, 0x38, 0x7c, 0x04, 0x00, 0x06, 0x56, + 0x0c, 0x50, 0x38, 0x07, 0xa9, 0x70, 0x38, 0x07, 0x77, 0x78, 0xa9, 0x75, 0x02, 0x00, 0x4b, 0x08, + 0x00, 0x00, 0xeb, 0x2e, 0x00, 0x00, 0xab, 0x31, 0x00, 0x00, 0x6b, 0x30, 0x00, 0x00, 0x38, 0x60, + 0x34, 0x07, 0x08, 0x70, 0xab, 0x8f, 0x2c, 0x70, 0xab, 0x0f, 0xb9, 0x76, 0x04, 0x00, 0x04, 0x61, + 0x08, 0x70, 0x00, 0x40, 0xb9, 0x67, 0x70, 0x10, 0xf2, 0x00, 0xc4, 0x30, 0x04, 0x40, 0x04, 0x50, + 0x0c, 0x60, 0x20, 0x00, 0x52, 0x03, 0xa6, 0x42, 0x25, 0x50, 0xb4, 0x61, 0x02, 0x06, 0xa6, 0x44, + 0x25, 0x55, 0xa6, 0x33, 0x42, 0xf9, 0xf2, 0xfa, 0x06, 0x24, 0x06, 0x35, 0xe1, 0xf0, 0x00, 0x00, + 0x3a, 0x59, 0x64, 0x20, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x0e, 0x16, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x18, 0x20, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x18, 0x18, 0x12, 0x00, 0x14, 0xc8, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x14, 0x64, 0x08, 0x08, 0xe8, 0x03, 0x2c, 0x01, 0x14, 0x32, 0x10, 0x10, + 0x20, 0x18, 0x07, 0x00, 0x64, 0x00, 0x64, 0x10, 0x63, 0x07, 0x02, 0x00, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0xc0, 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x0f, 0x60, 0x0f, 0x30, 0x31, 0x83, 0x00, 0xff, 0x0f, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0b, 0x16, 0x0c, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x2c, 0x01, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x00, 0xc8, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc8, 0x00, 0x01, 0x00, + 0x40, 0xe2, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0xff, 0x00, 0x30, 0x00, 0xff, 0x05, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xa8, 0x00, 0x10, 0x3f, 0x10, 0x3f, 0x64, 0x3c, 0x10, 0x00, + 0x00, 0x00, 0x04, 0x82, 0x00, 0x00, 0xff, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x7f, 0xf0, 0x07, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x0f, 0x16, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x54, 0xff, 0x05, 0x00, 0xb8, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x84, 0x40, 0x00, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x3f, 0x00, 0x88, 0xbf, + 0x01, 0x20, 0x00, 0x00, 0x0c, 0x0d, 0x0e, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0x0c, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x00, 0x00, 0xff, 0x00, 0x30, 0x86, + 0x00, 0x00, 0x00, 0xe0, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x0f, 0x00, + 0xd5, 0x70, 0x65, 0x00, 0xd5, 0x71, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x33, 0x29, 0x0b, 0x01, 0x38, 0x28, 0x10, 0x00, 0x38, 0x28, 0x10, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 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, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x26, 0x07, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0xff, 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, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, + 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, + 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, 0x00, 0x02, 0x08, 0x09, + 0x00, 0x02, 0x08, 0x09, 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x09, 0x01, 0x04, 0x00, 0x0f, + 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, + 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x00, 0x02, 0x08, 0x0f, + 0x00, 0x02, 0x08, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, + 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, + 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, + 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x0b, + 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, 0x00, 0x02, 0x08, 0x0b, + 0x00, 0x02, 0x08, 0x0b, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, + 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0b, + 0x01, 0x04, 0x00, 0x0b, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x08, 0x0c, + 0x00, 0x02, 0x08, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x08, 0x0c, + 0x00, 0x02, 0x08, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x08, 0x0c, + 0x00, 0x02, 0x08, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, + 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x00, 0x02, 0x08, 0x0c, + 0x00, 0x02, 0x08, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0c, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, + 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, + 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x0f, + 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x00, 0x02, 0x08, 0x0f, + 0x00, 0x02, 0x08, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, + 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x0f, + 0x01, 0x04, 0x00, 0x0f, 0x01, 0x04, 0x00, 0x10, 0x01, 0x04, 0x00, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x01, 0x04, 0x10, 0x0d, + 0x01, 0x04, 0x10, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, + 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x01, 0x04, 0x00, 0x0d, 0x00, 0x02, 0x08, 0x0d, + 0x00, 0x02, 0x08, 0x0d, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, + 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x01, 0x04, 0x00, 0x0e, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0b, + 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, + 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, + 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x0b, + 0x00, 0x02, 0x08, 0x0b, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x18, 0x1a, 0x00, 0x02, 0x18, 0x1a, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x0e, + 0x00, 0x02, 0x08, 0x0e, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, 0x00, 0x02, 0x08, 0x10, + 0x00, 0x02, 0x08, 0x10, 0x00, 0xc0, 0xf1, 0xff, 0x21, 0xc0, 0xf1, 0xff, 0x42, 0xc0, 0xf1, 0xff, + 0x63, 0xc0, 0xf1, 0xff, 0x84, 0xc0, 0xf1, 0xff, 0xa5, 0xc0, 0xf1, 0xff, 0xc6, 0xc0, 0xf1, 0xff, + 0xe7, 0xc0, 0xf1, 0xff, 0x08, 0xc1, 0xf1, 0xff, 0x29, 0xc1, 0xf1, 0xff, 0x4a, 0xc1, 0xf1, 0xff, + 0x6b, 0xc1, 0xf1, 0xff, 0x8c, 0xc1, 0xf1, 0xff, 0xad, 0xc1, 0xf1, 0xff, 0xce, 0xc1, 0xf1, 0xff, + 0xef, 0xc1, 0xf1, 0xff, 0x10, 0xc2, 0xf1, 0xff, 0x31, 0xc2, 0xf1, 0xff, 0x52, 0xc2, 0xf1, 0xff, + 0x73, 0xc2, 0xf1, 0xfb, 0x94, 0xc2, 0xf1, 0xf7, 0xb5, 0xc2, 0xf1, 0xf7, 0x00, 0xc0, 0xf1, 0xff, + 0x00, 0xc0, 0xf1, 0xff, 0x00, 0xc0, 0xf1, 0xff, 0x00, 0xc0, 0xf1, 0xff, 0x00, 0xc0, 0xf1, 0xff, + 0x00, 0xc0, 0xf1, 0xff, 0x00, 0xc0, 0xf1, 0xff, 0x00, 0xc0, 0xf1, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xc0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2e, 0x28, 0x06, 0x00, 0x2e, 0x28, 0x06, 0x00, 0x2d, 0x28, 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, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x3f, 0xf0, 0x03, 0x00, + 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xf8, 0x03, 0x00, 0x18, 0x18, 0x18, 0x10, + 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, + 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, + 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, + 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, + 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, 0x18, 0x18, 0x18, 0x10, + 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x10, 0x10, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x0e, 0x16, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, + 0x64, 0x00, 0x00, 0x00, 0x60, 0x21, 0x06, 0x00, 0x90, 0x00, 0x00, 0x00, 0x18, 0x20, 0x00, 0x00, + 0x48, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x30, 0x18, 0x12, 0x00, 0x14, 0xc8, 0x00, 0x00, + 0x08, 0x08, 0x00, 0x00, 0x14, 0x64, 0x08, 0x08, 0xe8, 0x03, 0x2c, 0x01, 0x14, 0x32, 0x10, 0x10, + 0x20, 0x18, 0x07, 0x00, 0x64, 0x00, 0x64, 0x10, 0x63, 0x07, 0x02, 0x00, 0x32, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x64, 0xc0, 0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x0f, 0x00, 0x00, 0x30, 0x31, 0x83, 0x01, 0xff, 0x0f, 0xff, 0x0f, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x0b, 0x17, 0x0f, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x80, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x2c, 0x01, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x00, 0xc8, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0xc8, 0x00, 0x01, 0x00, + 0x40, 0xc2, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0xff, 0x00, 0x30, 0x00, 0xff, 0x05, 0xff, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xa8, 0x00, 0x10, 0x3f, 0x10, 0x3f, 0x64, 0x3c, 0x10, 0x00, + 0x00, 0x00, 0x04, 0x82, 0x00, 0x00, 0xff, 0x0f, 0x01, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00, 0x00, + 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x0f, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x20, 0x00, 0x02, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x0f, 0x17, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2b, 0x07, 0x07, 0x00, 0xec, 0x53, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x84, 0x40, 0x00, 0x15, 0x52, 0x80, 0x00, 0x14, 0x40, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x3f, 0x00, 0x88, 0xbf, + 0x01, 0x20, 0x00, 0x00, 0x0c, 0x0d, 0x0e, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, + 0x00, 0x00, 0x00, 0x0c, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x00, 0x00, 0xff, 0x00, 0x30, 0x86, + 0x00, 0x00, 0x00, 0x52, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x0f, 0x00, + 0x38, 0x28, 0x10, 0x00, 0x48, 0x38, 0x28, 0x10, 0x48, 0x29, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x29, 0x28, 0x01, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x26, 0x07, 0x13, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x80, 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, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, 0x28, 0xa6, 0x08, 0x08, + 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, 0x27, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, + 0x23, 0x8e, 0x08, 0x08, 0x29, 0xa6, 0x08, 0x08, 0x22, 0x8e, 0x08, 0x08, 0x26, 0x9e, 0x08, 0x08, + 0x26, 0x9e, 0x08, 0x08, 0x25, 0x96, 0x08, 0x08, 0x23, 0x8e, 0x08, 0x08, 0x00, 0x02, 0x08, 0x08, + 0x00, 0x02, 0x08, 0x08, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, 0x00, 0x02, 0x08, 0x04, + 0x00, 0x02, 0x08, 0x04, 0x00, 0xc0, 0xf1, 0x3f, 0x21, 0xc0, 0xf1, 0x3f, 0x42, 0xc0, 0xf1, 0x3f, + 0x63, 0xc0, 0xf1, 0x3f, 0x84, 0xc0, 0xf1, 0x3f, 0xa5, 0xc0, 0xf1, 0x3f, 0xc6, 0xc0, 0xf1, 0x3f, + 0xe7, 0xc0, 0xf1, 0x3f, 0x08, 0xc1, 0xf1, 0x3f, 0x29, 0xc1, 0xf1, 0x3f, 0x4a, 0xc1, 0xf1, 0x3f, + 0x6b, 0xc1, 0xf1, 0x3f, 0x8c, 0xc1, 0xf1, 0x3f, 0xad, 0xc1, 0xf1, 0x3f, 0xce, 0xc1, 0xf1, 0x3f, + 0xef, 0xc1, 0xf1, 0x3f, 0x10, 0xc2, 0xf1, 0x3f, 0x31, 0xc2, 0xf1, 0x3f, 0x52, 0xc2, 0xf1, 0x3f, + 0x73, 0xc2, 0xf1, 0x3f, 0x94, 0xc2, 0xf1, 0x7f, 0xb5, 0xc2, 0xf1, 0x3f, 0x00, 0xc0, 0xf1, 0x3f, + 0x00, 0xc0, 0xf1, 0x3f, 0x00, 0xc0, 0xf1, 0x3f, 0x00, 0xc0, 0xf1, 0x3f, 0x00, 0xc0, 0xf1, 0x3f, + 0x00, 0xc0, 0xf1, 0x3f, 0x00, 0xc0, 0xf1, 0x3f, 0x00, 0xc0, 0xf1, 0x3f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x28, 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, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x03, 0x00, + 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x2e, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x10, 0x10, 0x10, 0x10, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, 0x04, 0x41, 0x10, 0x00, + 0xcc, 0xcc, 0xcc, 0x0c, 0x43, 0x4d, 0x43, 0x53, 0x32, 0x54, 0x41, 0x47 +}; + +#endif // __IST30XXC_CMCS_BIN_H__ diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_misc.c b/drivers/input/touchscreen/ist30xxc/ist30xxc_misc.c new file mode 100644 index 00000000..48d2b58d --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_misc.c @@ -0,0 +1,1502 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include "ist30xxc.h" +#include "ist30xxc_update.h" +#include "ist30xxc_misc.h" + +#define TSP_CH_UNUSED (0) +#define TSP_CH_SCREEN (1) +#define TSP_CH_GTX (2) +#define TSP_CH_KEY (3) +#define TSP_CH_UNKNOWN (-1) + +#define TOUCH_NODE_PARSING_DEBUG (0) + +static u32 *ist30xx_frame_buf; +static u32 *ist30xx_frame_rawbuf; +static u32 *ist30xx_frame_fltbuf; + +int ist30xx_check_valid_ch(struct ist30xx_data *data, int ch_tx, int ch_rx) +{ + int i; + TKEY_INFO *tkey = &data->tkey_info; + TSP_INFO *tsp = &data->tsp_info; + + if (unlikely((ch_tx >= tsp->ch_num.tx) || (ch_rx >= tsp->ch_num.rx))) + return TSP_CH_UNKNOWN; + + if ((ch_tx >= tsp->screen.tx) || (ch_rx >= tsp->screen.rx)) { + if (tsp->gtx.num) { + for (i = 0; i < tsp->gtx.num; i++) { + if ((ch_tx == tsp->gtx.ch_num[i]) && (ch_rx < tsp->screen.rx)) + return TSP_CH_GTX; + } + } + + if (tkey->enable) { + for (i = 0; i < tkey->key_num; i++) { + if ((ch_tx == tkey->ch_num[i].tx) && + (ch_rx == tkey->ch_num[i].rx)) + return TSP_CH_KEY; + } + } + } else { + return TSP_CH_SCREEN; + } + + return TSP_CH_UNUSED; +} + +int ist30xx_parse_touch_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node) +{ +#if TOUCH_NODE_PARSING_DEBUG + int j; + TSP_INFO *tsp = &data->tsp_info; +#endif + int i; + u16 *raw = (u16 *)&node->raw; + u16 *base = (u16 *)&node->base; + u16 *filter = (u16 *)&node->filter; + u32 *tmp_rawbuf = ist30xx_frame_rawbuf; + u32 *tmp_fltbuf = ist30xx_frame_fltbuf; + + for (i = 0; i < node->len; i++) { + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + *raw++ = *tmp_rawbuf & 0xFFF; + *base++ = (*tmp_rawbuf >> 16) & 0xFFF; + + tmp_rawbuf++; + } + if (flag & NODE_FLAG_FILTER) + *filter++ = *tmp_fltbuf++ & 0xFFF; + } + +#if TOUCH_NODE_PARSING_DEBUG + tsp_info("RAW - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->raw[(i * tsp->ch_num.rx) + j]); + } + + tsp_info("BASE - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->base[(i * tsp->ch_num.rx) + j]); + } + + tsp_info("FILTER - %d * %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + for (i = 0; i < tsp->ch_num.tx; i++) { + printk("\n[ TSP ] "); + for (j = 0; j < tsp->ch_num.rx; j++) + printk("%4d ", node->filter[(i * tsp->ch_num.rx) + j]); + } +#endif + + return 0; +} + +int print_touch_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node, char *buf) +{ + int i, j; + int count = 0; + int val = 0; + const int msg_len = 128; + char msg[msg_len]; + TSP_INFO *tsp = &data->tsp_info; + + if (tsp->dir.swap_xy) { + for (i = 0; i < tsp->ch_num.rx; i++) { + for (j = 0; j < tsp->ch_num.tx; j++) { + if (flag == NODE_FLAG_RAW) + val = (int)node->raw[(j * tsp->ch_num.rx) + i]; + else if (flag == NODE_FLAG_BASE) + val = (int)node->base[(j * tsp->ch_num.rx) + i]; + else if (flag == NODE_FLAG_FILTER) + val = (int)node->filter[(j * tsp->ch_num.rx) + i]; + else if (flag == NODE_FLAG_DIFF) + val = (int)(node->raw[(j * tsp->ch_num.rx) + i] + - node->base[(j * tsp->ch_num.rx) + i]); + else + return 0; + + if (val < 0) val = 0; + + if (ist30xx_check_valid_ch(data, j, i) == TSP_CH_UNUSED) + count += snprintf(msg, msg_len, "%4d ", 0); + else + count += snprintf(msg, msg_len, "%4d ", val); + + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + } else { + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (flag == NODE_FLAG_RAW) + val = (int)node->raw[(i * tsp->ch_num.rx) + j]; + else if (flag == NODE_FLAG_BASE) + val = (int)node->base[(i * tsp->ch_num.rx) + j]; + else if (flag == NODE_FLAG_FILTER) + val = (int)node->filter[(i * tsp->ch_num.rx) + j]; + else if (flag == NODE_FLAG_DIFF) + val = (int)(node->raw[(i * tsp->ch_num.rx) + j] + - node->base[(i * tsp->ch_num.rx) + j]); + else + return 0; + + if (val < 0) val = 0; + + if (ist30xx_check_valid_ch(data, i, j) == TSP_CH_UNUSED) + count += snprintf(msg, msg_len, "%4d ", 0); + else + count += snprintf(msg, msg_len, "%4d ", val); + + strncat(buf, msg, msg_len); + } + + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + } + } + + return count; +} + +int parse_tsp_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node, s16 *buf16, bool only_screen) +{ + int i, j; + s16 val = 0; + TSP_INFO *tsp = &data->tsp_info; + + if (unlikely((flag != NODE_FLAG_RAW) && (flag != NODE_FLAG_BASE) && + (flag != NODE_FLAG_FILTER) && (flag != NODE_FLAG_DIFF))) + return -EPERM; + + for (i = 0; i < tsp->ch_num.tx; i++) { + for (j = 0; j < tsp->ch_num.rx; j++) { + if (only_screen) { + if (ist30xx_check_valid_ch(data, i, j) != TSP_CH_SCREEN) + continue; + } + switch (flag) { + case NODE_FLAG_RAW: + val = (s16)node->raw[(i * tsp->ch_num.rx) + j]; + break; + case NODE_FLAG_BASE: + val = (s16)node->base[(i * tsp->ch_num.rx) + j]; + break; + case NODE_FLAG_FILTER: + val = (s16)node->filter[(i * tsp->ch_num.rx) + j]; + break; + case NODE_FLAG_DIFF: + val = (s16)(node->raw[(i * tsp->ch_num.rx) + j] + - node->base[(i * tsp->ch_num.rx) + j]); + break; + } + + if (val < 0) + val = 0; + + if (ist30xx_check_valid_ch(data, i, j) == TSP_CH_UNUSED) + val = 0; + + *buf16++ = val; + } + } + + return 0; +} + +int ist30xx_read_touch_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node) +{ + int i; + int ret; + u32 addr; + u32 *tmp_rawbuf = ist30xx_frame_rawbuf; + u32 *tmp_fltbuf = ist30xx_frame_fltbuf; + + ist30xx_disable_irq(data); + + if (flag & NODE_FLAG_NO_CCP) { + ist30xx_reset(data, false); + ret = ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_CP_CORRECT_EN << 16) | (IST30XX_DISABLE & 0xFFFF))); + if (unlikely(ret)) + goto read_tsp_node_end; + + msleep(1000); + } + + ret = ist30xx_cmd_hold(data->client, 1); + if (unlikely(ret)) + goto read_tsp_node_end; + + addr = IST30XX_DA_ADDR(data->tags.raw_base); + if (flag & (NODE_FLAG_RAW | NODE_FLAG_BASE)) { + tsp_info("Reg addr: %x, size: %d\n", addr, node->len); + for (i = 0; i < node->len; i++) { + ret = ist30xx_read_buf(data->client, addr, tmp_rawbuf, 1); + if (unlikely(ret)) + goto reg_access_end; + + addr += IST30XX_DATA_LEN; + tmp_rawbuf++; + } + } + + addr = IST30XX_DA_ADDR(data->tags.filter_base); + if (flag & NODE_FLAG_FILTER) { + tsp_info("Reg addr: %x, size: %d\n", addr, node->len); + for (i = 0; i < node->len; i++) { + ret = ist30xx_read_buf(data->client, addr, tmp_fltbuf, 1); + if (unlikely(ret)) + goto reg_access_end; + + addr += IST30XX_DATA_LEN; + tmp_fltbuf++; + } + } + +reg_access_end: + ist30xx_cmd_hold(data->client, 0); + + if (flag & NODE_FLAG_NO_CCP) { + ist30xx_reset(data, false); + ist30xx_start(data); + } + +read_tsp_node_end: + ist30xx_enable_irq(data); + + return ret; +} + +/* sysfs: /sys/class/touch/node/refresh */ +ssize_t ist30xx_frame_refresh(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER; + + tsp_info("refresh\n"); + mutex_lock(&ist30xx_mutex); + ret = ist30xx_read_touch_node(data, flag, &tsp->node); + if (unlikely(ret)) { + mutex_unlock(&ist30xx_mutex); + tsp_err("cmd 1frame raw update fail\n"); + return sprintf(buf, "FAIL\n"); + } + mutex_unlock(&ist30xx_mutex); + + ist30xx_parse_touch_node(data, flag, &tsp->node); + + return sprintf(buf, "OK\n"); +} + + +/* sysfs: /sys/class/touch/node/read_nocp */ +ssize_t ist30xx_frame_nocp(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + u8 flag = NODE_FLAG_RAW | NODE_FLAG_BASE | NODE_FLAG_FILTER | + NODE_FLAG_NO_CCP; + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_read_touch_node(data, flag, &tsp->node); + if (unlikely(ret)) { + mutex_unlock(&ist30xx_mutex); + tsp_err("cmd 1frame raw update fail\n"); + return sprintf(buf, "FAIL\n"); + } + mutex_unlock(&ist30xx_mutex); + + ist30xx_parse_touch_node(data, flag, &tsp->node); + + return sprintf(buf, "OK\n"); +} + + +/* sysfs: /sys/class/touch/node/base */ +ssize_t ist30xx_base_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xx baseline(%d)\n", tsp->node.len); + + count += print_touch_node(data, NODE_FLAG_BASE, &tsp->node, buf); + + return count; +} + + +/* sysfs: /sys/class/touch/node/raw */ +ssize_t ist30xx_raw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xx raw(%d)\n", tsp->node.len); + + count += print_touch_node(data, NODE_FLAG_RAW, &tsp->node, buf); + + return count; +} + + +/* sysfs: /sys/class/touch/node/diff */ +ssize_t ist30xx_diff_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xx difference (%d)\n", tsp->node.len); + + count += print_touch_node(data, NODE_FLAG_DIFF, &tsp->node, buf); + + return count; +} + + +/* sysfs: /sys/class/touch/node/filter */ +ssize_t ist30xx_filter_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + + buf[0] = '\0'; + count = sprintf(buf, "dump ist30xx filter (%d)\n", tsp->node.len); + + count += print_touch_node(data, NODE_FLAG_FILTER, &tsp->node, buf); + + return count; +} + +/* sysfs: /sys/class/touch/sys/debug_mode */ +ssize_t ist30xx_debug_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ret = 0; + int enable; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &enable); + + if (unlikely((enable != 0) && (enable != 1))) { + tsp_err("input data error(%d)\n", enable); + return size; + } + + if (data->status.power) { + ret = ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + (eHCOM_SLEEP_MODE_EN << 16) | ((enable ? 0 : 1) & 0xFFFF)); + + if (ret) { + tsp_info("failed to set debug mode(%d)\n", enable); + } else { + data->debug_mode = enable; + tsp_info("debug mode %s\n", enable ? "start" : "stop"); + } + } else { + data->debug_mode = enable; + tsp_info("debug mode %s\n", enable ? "start" : "stop"); + } + + return size; +} + +#if IST30XX_JIG_MODE +/* sysfs: /sys/class/touch/sys/jig_mode */ +ssize_t ist30xx_jig_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int enable; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &enable); + + if (unlikely((enable != 0) && (enable != 1))) { + tsp_err("input data error(%d)\n", enable); + return size; + } + + data->jig_mode = enable; + tsp_info("set jig mode: %s\n", enable ? "start" : "stop"); + + mutex_lock(&ist30xx_mutex); + ist30xx_reset(data, false); + ist30xx_start(data); + mutex_unlock(&ist30xx_mutex); + + return size; +} +#endif + +extern int calib_ms_delay; +/* sysfs: /sys/class/touch/sys/clb_time */ +ssize_t ist30xx_calib_time_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int ms_delay; + + sscanf(buf, "%d", &ms_delay); + + if (ms_delay > 10 && ms_delay < 1000) // 1sec ~ 100sec + calib_ms_delay = ms_delay; + + tsp_info("Calibration wait time %dsec\n", calib_ms_delay / 10); + + return size; +} + +/* sysfs: /sys/class/touch/sys/clb */ +ssize_t ist30xx_calib_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + + ist30xx_reset(data, false); + ist30xx_calibrate(data, 1); + + mutex_unlock(&ist30xx_mutex); + ist30xx_start(data); + + return 0; +} + +/* sysfs: /sys/class/touch/sys/clb_result */ +ssize_t ist30xx_calib_result_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + int count = 0; + u32 value; + struct ist30xx_data *data = dev_get_drvdata(dev); + + ret = ist30xx_read_cmd(data, eHCOM_GET_CAL_RESULT, &value); + if (unlikely(ret)) { + mutex_lock(&ist30xx_mutex); + ist30xx_reset(data, false); + ist30xx_start(data); + mutex_unlock(&ist30xx_mutex); + tsp_warn("Error Read Calibration Result\n"); + count = sprintf(buf, "Error Read Calibration Result\n"); + goto calib_show_end; + } + + count = sprintf(buf, + "Calibration Status : %d, Max raw gap : %d - (raw: %08x)\n", + CALIB_TO_STATUS(value), CALIB_TO_GAP(value), value); + +calib_show_end: + + return count; +} + +/* sysfs: /sys/class/touch/sys/power_on */ +ssize_t ist30xx_power_on_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + tsp_info("Power enable: %d\n", true); + + mutex_lock(&ist30xx_mutex); + ist30xx_internal_resume(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(data); + + return 0; +} + +/* sysfs: /sys/class/touch/sys/power_off */ +ssize_t ist30xx_power_off_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + tsp_info("Power enable: %d\n", false); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_internal_suspend(data); + mutex_unlock(&ist30xx_mutex); + + return 0; +} + +/* sysfs: /sys/class/touch/sys/errcnt */ +ssize_t ist30xx_errcnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int err_cnt; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &err_cnt); + + if (unlikely(err_cnt < 0)) + return size; + + tsp_info("Request reset error count: %d\n", err_cnt); + + data->max_irq_err_cnt = err_cnt; + + return size; +} + +/* sysfs: /sys/class/touch/sys/scancnt */ +ssize_t ist30xx_scancnt_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int retry; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &retry); + + if (unlikely(retry < 0)) + return size; + + tsp_info("Timer scan count retry: %d\n", retry); + + data->max_scan_retry = retry; + + return size; +} + +extern int timer_period_ms; +/* sysfs: /sys/class/touch/sys/timerms */ +ssize_t ist30xx_timerms_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ms; + + sscanf(buf, "%d", &ms); + + if (unlikely((ms < 0) || (ms > 10000))) + return size; + + tsp_info("Timer period ms: %dms\n", ms); + + timer_period_ms = ms; + + return size; +} + +extern int ist30xx_dbg_level; +/* sysfs: /sys/class/touch/sys/printk */ +ssize_t ist30xx_printk_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int level; + + sscanf(buf, "%d", &level); + + if (unlikely((level < DEV_ERR) || (level > DEV_VERB))) + return size; + + tsp_info("prink log level: %d\n", level); + + ist30xx_dbg_level = level; + + return size; +} + +ssize_t ist30xx_printk_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + return sprintf(buf, "prink log level: %d\n", ist30xx_dbg_level); +} + +/* sysfs: /sys/class/touch/sys/printk5 */ +ssize_t ist30xx_printk5_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + tsp_info("prink log level:%d\n", DEV_DEBUG); + + ist30xx_dbg_level = DEV_DEBUG; + + return 0; +} + +/* sysfs: /sys/class/touch/sys/printk6 */ +ssize_t ist30xx_printk6_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + tsp_info("prink log level:%d\n", DEV_VERB); + + ist30xx_dbg_level = DEV_VERB; + + return 0; +} + +#if IST30XX_GESTURE +/* sysfs: /sys/class/touch/sys/gesture */ +ssize_t ist30xx_gesture_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int gesture; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &gesture); + + tsp_info("gesture enable : %s\n", (gesture == 0) ? "disable" : "enable"); + + data->gesture = (gesture == 0) ? false : true; + + return size; +} +#endif + +/* sysfs: /sys/class/touch/sys/touch_rate */ +ssize_t ist30xx_touch_rate_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int rate; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &rate); // us + + if (unlikely(rate > 0xFFFF)) // over 65.5ms + return size; + + data->report_rate = rate; + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_TIME_ACTIVE << 16) | (data->report_rate & 0xFFFF))); + tsp_info(" active rate : %dus\n", data->report_rate); + + return size; +} + +/* sysfs: /sys/class/touch/sys/idle_rate */ +ssize_t ist30xx_idle_scan_rate_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int rate; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d", &rate); // us + + if (unlikely(rate > 0xFFFF)) // over 65.5ms + return size; + + data->idle_rate = rate; + ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + ((eHCOM_SET_TIME_IDLE << 16) | (data->idle_rate & 0xFFFF))); + tsp_info(" idle rate : %dus\n", data->idle_rate); + + return size; +} + +extern void ist30xx_set_ta_mode(bool charging); +/* sysfs: /sys/class/touch/sys/mode_ta */ +ssize_t ist30xx_ta_mode_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) // enable/disable + return size; + + ist30xx_set_ta_mode(mode); + + return size; +} + +extern void ist30xx_set_call_mode(int mode); +/* sysfs: /sys/class/touch/sys/mode_call */ +ssize_t ist30xx_call_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) // enable/disable + return size; + + ist30xx_set_call_mode(mode); + + return size; +} + +extern void ist30xx_set_cover_mode(int mode); +/* sysfs: /sys/class/touch/sys/mode_cover */ +ssize_t ist30xx_cover_mode_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int mode; + + sscanf(buf, "%d", &mode); + + if (unlikely((mode != 0) && (mode != 1))) // enable/disable + return size; + + ist30xx_set_cover_mode(mode); + + return size; +} + +#define TUNES_CMD_WRITE (1) +#define TUNES_CMD_READ (2) +#define TUNES_CMD_REG_ENTER (3) +#define TUNES_CMD_REG_EXIT (4) +#define TUNES_CMD_UPDATE_PARAM (5) +#define TUNES_CMD_UPDATE_FW (6) + +#define DIRECT_ADDR(n) (IST30XX_DA_ADDR(n)) +#define DIRECT_CMD_WRITE ('w') +#define DIRECT_CMD_READ ('r') + +#pragma pack(1) +typedef struct { + u8 cmd; + u32 addr; + u16 len; +} TUNES_INFO; +#pragma pack() +#pragma pack(1) +typedef struct { + char cmd; + u32 addr; + u32 val; +} DIRECT_INFO; +#pragma pack() + +static TUNES_INFO ist30xx_tunes; +static DIRECT_INFO ist30xx_direct; +static bool tunes_cmd_done = false; +static bool ist30xx_reg_mode = false; + +/* sysfs: /sys/class/touch/sys/direct */ +ssize_t ist30xx_direct_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -EPERM; + struct ist30xx_data *data = dev_get_drvdata(dev); + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + sscanf(buf, "%c %x %x", &direct->cmd, &direct->addr, &direct->val); + + tsp_debug("Direct cmd: %c, addr: %x, val: %x\n", + direct->cmd, direct->addr, direct->val); + + if (unlikely((direct->cmd != DIRECT_CMD_WRITE) && + (direct->cmd != DIRECT_CMD_READ))) { + tsp_warn("Direct cmd is not correct!\n"); + return size; + } + + if (ist30xx_intr_wait(data, 30) < 0) + return size; + + data->status.event_mode = false; + if (direct->cmd == DIRECT_CMD_WRITE) { + ist30xx_cmd_hold(data->client, 1); + ist30xx_write_cmd(data->client, DIRECT_ADDR(direct->addr), + direct->val); + ist30xx_read_reg(data->client, DIRECT_ADDR(direct->addr), + &direct->val); + ret = ist30xx_cmd_hold(data->client, 0); + if (ret) { + tsp_debug("Direct write fail\n"); + ist30xx_reset(data, false); + ist30xx_start(data); + } else { + tsp_debug("Direct write addr: %x, val: %x\n", + direct->addr, direct->val); + } + } + data->status.event_mode = true; + + return size; +} + +#define DIRECT_BUF_COUNT (4) +ssize_t ist30xx_direct_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i, ret, count = 0; + int len; + u32 addr; + u32 buf32[DIRECT_BUF_COUNT]; + int max_len = DIRECT_BUF_COUNT; + const int msg_len = 256; + char msg[msg_len]; + struct ist30xx_data *data = dev_get_drvdata(dev); + DIRECT_INFO *direct = (DIRECT_INFO *)&ist30xx_direct; + + if (unlikely(direct->cmd != DIRECT_CMD_READ)) + return sprintf(buf, "ex) echo r addr len > direct\n"); + + len = direct->val; + addr = DIRECT_ADDR(direct->addr); + + if (ist30xx_intr_wait(data, 30) < 0) + return 0; + + data->status.event_mode = false; + ist30xx_cmd_hold(data->client, 1); + + while (len > 0) { + if (len < max_len) max_len = len; + + memset(buf32, 0, sizeof(buf32)); + for (i = 0; i < max_len; i++) { + ret = ist30xx_read_buf(data->client, addr, &buf32[i], 1); + if (unlikely(ret)) { + count = sprintf(buf, "I2C Burst read fail, addr: %x\n", addr); + break; + } + + addr += IST30XX_DATA_LEN; + } + + for (i = 0; i < max_len; i++) { + count += snprintf(msg, msg_len, "0x%08x ", buf32[i]); + strncat(buf, msg, msg_len); + } + count += snprintf(msg, msg_len, "\n"); + strncat(buf, msg, msg_len); + + len -= max_len; + } + + ret = ist30xx_cmd_hold(data->client, 0); + if (ret) { + ist30xx_reset(data, false); + ist30xx_start(data); + } + data->status.event_mode = true; + + tsp_debug("%s", buf); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/node_info */ +ssize_t tunes_node_info_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int size; + struct ist30xx_data *data = dev_get_drvdata(dev); + TSP_INFO *tsp = &data->tsp_info; + TKEY_INFO *tkey = &data->tkey_info; + + + size = sprintf(buf, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", + data->chip_id, tsp->dir.swap_xy, tsp->ch_num.tx, + tsp->ch_num.rx,tsp->screen.tx, tsp->screen.rx, + tsp->gtx.num, tsp->gtx.ch_num[0], + tsp->gtx.ch_num[1], tsp->gtx.ch_num[2], tsp->gtx.ch_num[3], + tsp->baseline, tkey->enable, tkey->baseline, tkey->key_num, + tkey->ch_num[0].tx, tkey->ch_num[0].rx, tkey->ch_num[1].tx, + tkey->ch_num[1].rx, tkey->ch_num[2].tx, tkey->ch_num[2].rx, + tkey->ch_num[3].tx, tkey->ch_num[3].rx, tkey->ch_num[4].tx, + tkey->ch_num[4].rx, data->tags.raw_base, data->tags.filter_base); + + return size; +} + +/* sysfs: /sys/class/touch/tunes/regcmd */ +ssize_t tunes_regcmd_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret = -1; + u32 *buf32; + struct ist30xx_data *data = dev_get_drvdata(dev); + + memcpy(&ist30xx_tunes, buf, sizeof(ist30xx_tunes)); + buf += sizeof(ist30xx_tunes); + buf32 = (u32 *)buf; + + tunes_cmd_done = false; + + switch (ist30xx_tunes.cmd) { + case TUNES_CMD_WRITE: + break; + case TUNES_CMD_READ: + break; + case TUNES_CMD_REG_ENTER: + ist30xx_disable_irq(data); + + /* enter reg access mode */ + ret = ist30xx_cmd_hold(data->client, 1); + if (unlikely(ret)) + goto regcmd_fail; + + ist30xx_reg_mode = true; + break; + case TUNES_CMD_REG_EXIT: + /* exit reg access mode */ + ret = ist30xx_cmd_hold(data->client, 0); + if (unlikely(ret)) { + ist30xx_reset(data, false); + ist30xx_start(data); + goto regcmd_fail; + } + + ist30xx_reg_mode = false; + ist30xx_enable_irq(data); + break; + default: + ist30xx_enable_irq(data); + return size; + } + tunes_cmd_done = true; + + return size; + +regcmd_fail: + tsp_err("Tunes regcmd i2c_fail, ret=%d\n", ret); + return size; +} + +ssize_t tunes_regcmd_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int size; + + size = sprintf(buf, "cmd: 0x%02x, addr: 0x%08x, len: 0x%04x\n", + ist30xx_tunes.cmd, ist30xx_tunes.addr, ist30xx_tunes.len); + + return size; +} + +#define MAX_WRITE_LEN (1) +/* sysfs: /sys/class/touch/tunes/reg */ +ssize_t tunes_reg_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + u32 *buf32 = (u32 *)buf; + int waddr, wcnt = 0, len = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_WRITE)) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return size; + } + + if (unlikely(!ist30xx_reg_mode)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + if (unlikely(!tunes_cmd_done)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return size; + } + + waddr = ist30xx_tunes.addr; + if (ist30xx_tunes.len >= MAX_WRITE_LEN) + len = MAX_WRITE_LEN; + else + len = ist30xx_tunes.len; + + while (wcnt < ist30xx_tunes.len) { + ret = ist30xx_write_buf(data->client, waddr, buf32, len); + if (unlikely(ret)) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + wcnt += len; + + if ((ist30xx_tunes.len - wcnt) < MAX_WRITE_LEN) + len = ist30xx_tunes.len - wcnt; + + buf32 += MAX_WRITE_LEN; + waddr += MAX_WRITE_LEN * IST30XX_DATA_LEN; + } + + tunes_cmd_done = false; + + return size; +} + +ssize_t tunes_reg_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int size; +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (unlikely(ist30xx_tunes.cmd != TUNES_CMD_READ)) { + tsp_err("error, IST30XX_REG_CMD is not correct!\n"); + return 0; + } + + if (unlikely(!tunes_cmd_done)) { + tsp_err("error, IST30XX_REG_CMD is not ready!\n"); + return 0; + } + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); // Activated only when the GPIO I2C is used +#endif + ret = ist30xx_burst_read(data->client, ist30xx_tunes.addr, + (u32 *)buf, ist30xx_tunes.len, false); +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); // Activated only when the GPIO I2C is used +#endif + if (unlikely(ret)) { + tsp_err("Tunes regshow i2c_fail, ret=%d\n", ret); + return size; + } + + size = ist30xx_tunes.len * IST30XX_DATA_LEN; + + tunes_cmd_done = false; + + return size; +} + +/* sysfs: /sys/class/touch/tunes/adb */ +ssize_t tunes_adb_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + char *tmp, *ptr; + char token[9]; + u32 cmd, addr, len, val; + int write_len; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%x %x %x", &cmd, &addr, &len); + + switch (cmd) { + case TUNES_CMD_WRITE: /* write cmd */ + write_len = 0; + ptr = (char *)(buf + 15); + + while (write_len < len) { + memcpy(token, ptr, 8); + token[8] = 0; + val = simple_strtoul(token, &tmp, 16); + ret = ist30xx_write_buf(data->client, addr, &val, 1); + if (unlikely(ret)) { + tsp_err("Tunes regstore i2c_fail, ret=%d\n", ret); + return size; + } + + ptr += 8; + write_len++; + addr += 4; + } + break; + + case TUNES_CMD_READ: /* read cmd */ + ist30xx_tunes.cmd = cmd; + ist30xx_tunes.addr = addr; + ist30xx_tunes.len = len; + break; + + case TUNES_CMD_REG_ENTER: /* enter */ + ist30xx_disable_irq(data); + + ret = ist30xx_cmd_hold(data->client, 1); + if (unlikely(ret < 0)) { + goto cmd_fail; + } + + ist30xx_reg_mode = true; + break; + + case TUNES_CMD_REG_EXIT: /* exit */ + if (ist30xx_reg_mode == true) { + ret = ist30xx_cmd_hold(data->client, 0); + if (unlikely(ret < 0)) { + ist30xx_reset(data, false); + ist30xx_start(data); + goto cmd_fail; + } + + ist30xx_reg_mode = false; + ist30xx_enable_irq(data); + } + break; + + default: + break; + } + + return size; + +cmd_fail: + tsp_err("Tunes adb i2c_fail\n"); + return size; +} + +ssize_t tunes_adb_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + int i, len, size = 0; + char reg_val[10]; +#if I2C_MONOPOLY_MODE + unsigned long flags; +#endif + struct ist30xx_data *data = dev_get_drvdata(dev); + + tsp_info("tunes_adb_show,%08x,%d\n", ist30xx_tunes.addr, ist30xx_tunes.len); + +#if I2C_MONOPOLY_MODE + local_irq_save(flags); // Activated only when the GPIO I2C is used +#endif + ret = ist30xx_burst_read(data->client, ist30xx_tunes.addr, + ist30xx_frame_buf, ist30xx_tunes.len, false); + if (unlikely(ret)) { + tsp_err("Tunes adbshow i2c_fail, ret=%d\n", ret); + return size; + } + +#if I2C_MONOPOLY_MODE + local_irq_restore(flags); // Activated only when the GPIO I2C is used +#endif + + size = 0; + buf[0] = 0; + len = sprintf(reg_val, "%08x", ist30xx_tunes.addr); + strcat(buf, reg_val); + size += len; + for (i = 0; i < ist30xx_tunes.len; i++) { + len = sprintf(reg_val, "%08x", ist30xx_frame_buf[i]); + strcat(buf, reg_val); + size += len; + } + + return size; +} + +#if IST30XX_ALGORITHM_MODE +/* sysfs: /sys/class/touch/tunes/algorithm */ +extern u32 ist30xx_algr_addr, ist30xx_algr_size; +ssize_t ist30xx_algr_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &ist30xx_algr_addr, &ist30xx_algr_size); + + tsp_info("Algorithm addr: 0x%x, count: %d\n", + ist30xx_algr_addr, ist30xx_algr_size); + + ist30xx_algr_addr |= IST30XX_DIRECT_ACCESS; + + return size; +} + +ssize_t ist30xx_algr_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int ret; + u32 algr_addr; + int count = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + ret = ist30xx_read_cmd(data, eHCOM_GET_ALGO_BASE, &algr_addr); + if (unlikely(ret)) { + mutex_lock(&ist30xx_mutex); + ist30xx_reset(data, false); + ist30xx_start(data); + mutex_unlock(&ist30xx_mutex); + tsp_warn("Algorithm mem addr read fail!\n"); + return 0; + } + + tsp_info("algr_addr(0x%x): 0x%x\n", eHCOM_GET_ALGO_BASE, algr_addr); + + count = sprintf(buf, "Algorithm addr : 0x%x\n", algr_addr); + + return count; +} +#endif // IST30XX_ALGORITHM_MODE + +/* sysfs: /sys/class/touch/tunes/intr_debug */ +extern u32 intr_debug_addr, intr_debug_size; +ssize_t intr_debug_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug_addr, &intr_debug_size); + tsp_info("Interrupt debug addr: 0x%x, count: %d\n", + intr_debug_addr, intr_debug_size); + + intr_debug_addr |= IST30XX_DIRECT_ACCESS; + + return size; +} + +ssize_t intr_debug_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug_addr(0x%x): %d\n", intr_debug_addr, intr_debug_size); + + count = sprintf(buf, "intr_debug_addr(0x%x): %d\n", + intr_debug_addr, intr_debug_size); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/intr_debug2 */ +extern u32 intr_debug2_addr, intr_debug2_size; +ssize_t intr_debug2_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug2_addr, &intr_debug2_size); + tsp_info("Interrupt debug2 addr: 0x%x, count: %d\n", + intr_debug2_addr, intr_debug2_size); + + intr_debug2_addr |= IST30XX_DIRECT_ACCESS; + + return size; +} + +ssize_t intr_debug2_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug2_addr(0x%x): %d\n", + intr_debug2_addr, intr_debug2_size); + + count = sprintf(buf, "intr_debug2_addr(0x%x): %d\n", + intr_debug2_addr, intr_debug2_size); + + return count; +} + +/* sysfs: /sys/class/touch/tunes/intr_debug3 */ +extern u32 intr_debug3_addr, intr_debug3_size; +ssize_t intr_debug3_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + sscanf(buf, "%x %d", &intr_debug3_addr, &intr_debug3_size); + tsp_info("Interrupt debug3 addr: 0x%x, count: %d\n", + intr_debug3_addr, intr_debug3_size); + + intr_debug3_addr |= IST30XX_DIRECT_ACCESS; + + return size; +} + +ssize_t intr_debug3_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int count = 0; + + tsp_info("intr_debug3_addr(0x%x): %d\n", + intr_debug3_addr, intr_debug3_size); + + count = sprintf(buf, "intr_debug3_addr(0x%x): %d\n", + intr_debug3_addr, intr_debug3_size); + + return count; +} + +/* sysfs : node */ +static DEVICE_ATTR(refresh, S_IRWXUGO, ist30xx_frame_refresh, NULL); +static DEVICE_ATTR(nocp, S_IRWXUGO, ist30xx_frame_nocp, NULL); +static DEVICE_ATTR(filter, S_IRWXUGO, ist30xx_filter_show, NULL); +static DEVICE_ATTR(raw, S_IRWXUGO, ist30xx_raw_show, NULL); +static DEVICE_ATTR(base, S_IRWXUGO, ist30xx_base_show, NULL); +static DEVICE_ATTR(diff, S_IRWXUGO, ist30xx_diff_show, NULL); + +/* sysfs : sys */ +static DEVICE_ATTR(debug_mode, S_IRWXUGO, NULL, ist30xx_debug_mode_store); +#if IST30XX_JIG_MODE +static DEVICE_ATTR(jig_mode, S_IRWXUGO, NULL, ist30xx_jig_mode_store); +#endif +static DEVICE_ATTR(printk, S_IRWXUGO, + ist30xx_printk_show, ist30xx_printk_store); +static DEVICE_ATTR(printk5, S_IRWXUGO, ist30xx_printk5_show, NULL); +static DEVICE_ATTR(printk6, S_IRWXUGO, ist30xx_printk6_show, NULL); +#if IST30XX_GESTURE +static DEVICE_ATTR(gesture, S_IRWXUGO, NULL, ist30xx_gesture_store); +#endif +static DEVICE_ATTR(direct, S_IRWXUGO, + ist30xx_direct_show, ist30xx_direct_store); +static DEVICE_ATTR(clb_time, S_IRWXUGO, NULL, ist30xx_calib_time_store); +static DEVICE_ATTR(clb, S_IRWXUGO, ist30xx_calib_show, NULL); +static DEVICE_ATTR(clb_result, S_IRWXUGO, ist30xx_calib_result_show, NULL); +static DEVICE_ATTR(tsp_power_on, S_IRWXUGO, ist30xx_power_on_show, NULL); +static DEVICE_ATTR(tsp_power_off, S_IRWXUGO, ist30xx_power_off_show, NULL); +static DEVICE_ATTR(errcnt, S_IRWXUGO, NULL, ist30xx_errcnt_store); +static DEVICE_ATTR(scancnt, S_IRWXUGO, NULL, ist30xx_scancnt_store); +static DEVICE_ATTR(timerms, S_IRWXUGO, NULL, ist30xx_timerms_store); +static DEVICE_ATTR(report_rate, S_IRWXUGO, NULL, ist30xx_touch_rate_store); +static DEVICE_ATTR(idle_rate, S_IRWXUGO, NULL, ist30xx_idle_scan_rate_store); +static DEVICE_ATTR(mode_ta, S_IRWXUGO, NULL, ist30xx_ta_mode_store); +static DEVICE_ATTR(mode_call, S_IRWXUGO, NULL, ist30xx_call_mode_store); +static DEVICE_ATTR(mode_cover, S_IRWXUGO, NULL, ist30xx_cover_mode_store); + +/* sysfs : tunes */ +static DEVICE_ATTR(node_info, S_IRWXUGO, tunes_node_info_show, NULL); +static DEVICE_ATTR(regcmd, S_IRWXUGO, tunes_regcmd_show, tunes_regcmd_store); +static DEVICE_ATTR(reg, S_IRWXUGO, tunes_reg_show, tunes_reg_store); +static DEVICE_ATTR(adb, S_IRWXUGO, tunes_adb_show, tunes_adb_store); +#if IST30XX_ALGORITHM_MODE +static DEVICE_ATTR(algorithm, S_IRWXUGO, ist30xx_algr_show, ist30xx_algr_store); +#endif +static DEVICE_ATTR(intr_debug, S_IRWXUGO, intr_debug_show, intr_debug_store); +static DEVICE_ATTR(intr_debug2, S_IRWXUGO, intr_debug2_show, intr_debug2_store); +static DEVICE_ATTR(intr_debug3, S_IRWXUGO, intr_debug3_show, intr_debug3_store); + +static struct attribute *node_attributes[] = { + &dev_attr_refresh.attr, + &dev_attr_nocp.attr, + &dev_attr_filter.attr, + &dev_attr_raw.attr, + &dev_attr_base.attr, + &dev_attr_diff.attr, + NULL, +}; + +static struct attribute *sys_attributes[] = { + &dev_attr_debug_mode.attr, +#if IST30XX_JIG_MODE + &dev_attr_jig_mode.attr, +#endif + &dev_attr_printk.attr, + &dev_attr_printk5.attr, + &dev_attr_printk6.attr, +#if IST30XX_GESTURE + &dev_attr_gesture.attr, +#endif + &dev_attr_direct.attr, + &dev_attr_clb_time.attr, + &dev_attr_clb.attr, + &dev_attr_clb_result.attr, + &dev_attr_tsp_power_on.attr, + &dev_attr_tsp_power_off.attr, + &dev_attr_errcnt.attr, + &dev_attr_scancnt.attr, + &dev_attr_timerms.attr, + &dev_attr_report_rate.attr, + &dev_attr_idle_rate.attr, + &dev_attr_mode_ta.attr, + &dev_attr_mode_call.attr, + &dev_attr_mode_cover.attr, + NULL, +}; + +static struct attribute *tunes_attributes[] = { + &dev_attr_node_info.attr, + &dev_attr_regcmd.attr, + &dev_attr_reg.attr, + &dev_attr_adb.attr, +#if IST30XX_ALGORITHM_MODE + &dev_attr_algorithm.attr, +#endif + &dev_attr_intr_debug.attr, + &dev_attr_intr_debug2.attr, + &dev_attr_intr_debug3.attr, + NULL, +}; + +static struct attribute_group node_attr_group = { + .attrs = node_attributes, +}; + +static struct attribute_group sys_attr_group = { + .attrs = sys_attributes, +}; + +static struct attribute_group tunes_attr_group = { + .attrs = tunes_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_sys_dev; +struct device *ist30xx_tunes_dev; +struct device *ist30xx_node_dev; + +int ist30xx_init_misc_sysfs(struct ist30xx_data *data) +{ + int frame_buf_size = IST30XX_NODE_TOTAL_NUM * IST30XX_DATA_LEN; + + /* /sys/class/touch/sys */ + ist30xx_sys_dev = device_create(ist30xx_class, NULL, 0, data, "sys"); + + /* /sys/class/touch/sys/... */ + if (unlikely(sysfs_create_group(&ist30xx_sys_dev->kobj, + &sys_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "sys"); + + /* /sys/class/touch/tunes */ + ist30xx_tunes_dev = device_create(ist30xx_class, NULL, 0, data, "tunes"); + + /* /sys/class/touch/tunes/... */ + if (unlikely(sysfs_create_group(&ist30xx_tunes_dev->kobj, + &tunes_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "tunes"); + + /* /sys/class/touch/node */ + ist30xx_node_dev = device_create(ist30xx_class, NULL, 0, data, "node"); + + /* /sys/class/touch/node/... */ + if (unlikely(sysfs_create_group(&ist30xx_node_dev->kobj, + &node_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "node"); + + ist30xx_frame_buf = kmalloc(frame_buf_size, GFP_KERNEL); + ist30xx_frame_rawbuf = kmalloc(frame_buf_size, GFP_KERNEL); + ist30xx_frame_fltbuf = kmalloc(frame_buf_size, GFP_KERNEL); + if (!ist30xx_frame_buf || !ist30xx_frame_rawbuf || !ist30xx_frame_fltbuf) + return -ENOMEM; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_misc.h b/drivers/input/touchscreen/ist30xxc/ist30xxc_misc.h new file mode 100644 index 00000000..6f811ccd --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_misc.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XXC_MISC_H__ +#define __IST30XXC_MISC_H__ + +#define NODE_FLAG_RAW (1) +#define NODE_FLAG_BASE (1 << 1) +#define NODE_FLAG_FILTER (1 << 2) +#define NODE_FLAG_DIFF (1 << 3) +#define NODE_FLAG_ALL (0xF) +#define NODE_FLAG_NO_CCP (1 << 7) + +int ist30xx_check_valid_ch(struct ist30xx_data *data, int ch_tx, int ch_rx); +int ist30xx_parse_touch_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node); +int parse_tsp_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node, s16 *buf16, bool only_screen); +int ist30xx_read_touch_node(struct ist30xx_data *data, u8 flag, + struct TSP_NODE_BUF *node); + +int ist30xx_init_misc_sysfs(struct ist30xx_data *data); + +#endif // __IST30XXC_MISC_H__ diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_sec.c b/drivers/input/touchscreen/ist30xxc/ist30xxc_sec.c new file mode 100644 index 00000000..c9b82535 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_sec.c @@ -0,0 +1,1402 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xxc.h" +#include "ist30xxc_update.h" +#if IST30XX_DEBUG +#include "ist30xxc_misc.h" +#endif +#if IST30XX_CMCS_TEST +#include "ist30xxc_cmcs.h" +#endif + +#if SEC_FACTORY_MODE +static char IsfwUpdate[20] = { 0 }; + +#define FW_DOWNLOADING "Downloading" +#define FW_DOWNLOAD_COMPLETE "Complete" +#define FW_DOWNLOAD_FAIL "FAIL" + +#define FACTORY_BUF_SIZE (2048) +#define BUILT_IN (0) +#define UMS (1) + +#define CMD_STATE_WAITING (0) +#define CMD_STATE_RUNNING (1) +#define CMD_STATE_OK (2) +#define CMD_STATE_FAIL (3) +#define CMD_STATE_NA (4) + +#define TSP_NODE_DEBUG (0) +#define TSP_CM_DEBUG (0) + +#define TSP_CH_UNUSED (0) +#define TSP_CH_SCREEN (1) +#define TSP_CH_GTX (2) +#define TSP_CH_KEY (3) +#define TSP_CH_UNKNOWN (-1) + +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func +struct tsp_cmd { + struct list_head list; + const char * cmd_name; + void (*cmd_func)(void *dev_data); +}; + +u32 ist30xx_get_fw_ver(struct ist30xx_data *data) +{ + u32 ver = 0; + int ret = 0; + + ret = ist30xx_read_cmd(data, eHCOM_GET_VER_FW, &ver); + if (unlikely(ret)) { + ist30xx_reset(data, false); + ist30xx_start(data); + tsp_info("%s(), ret=%d\n", __func__, ret); + return ver; + } + + tsp_debug("Reg addr: %x, ver: %x\n", eHCOM_GET_VER_FW, ver); + + return ver; +} + +#define KEY_SENSITIVITY_OFFSET 0x10 +u32 key_sensitivity = 0; +int ist30xx_get_key_sensitivity(struct ist30xx_data *data, int id) +{ + u32 addr = IST30XX_DA_ADDR(data->tags.algo_base) + KEY_SENSITIVITY_OFFSET; + u32 val = 0; + int ret = 0; + + if (unlikely(id >= data->tkey_info.key_num)) + return 0; + + if (ist30xx_intr_wait(data, 30) < 0) + return 0; + + ret = ist30xx_read_cmd(data, addr, &val); + if (ret) { + ist30xx_reset(data, false); + ist30xx_start(data); + tsp_info("%s(), ret=%d\n", __func__, ret); + return 0; + } + + if ((val & 0xFFF) == 0xFFF) + return (key_sensitivity >> (16 * id)) & 0xFFFF; + + key_sensitivity = val; + + tsp_debug("Reg addr: %x, val: %8x\n", addr, val); + + val >>= (16 * id); + + return (int)(val & 0xFFFF); +} + + +/* Factory CMD function */ +static void set_default_result(struct sec_factory *sec) +{ + char delim = ':'; + + memset(sec->cmd_result, 0, ARRAY_SIZE(sec->cmd_result)); + memcpy(sec->cmd_result, sec->cmd, strlen(sec->cmd)); + strncat(sec->cmd_result, &delim, CMD_STATE_RUNNING); +} + +static void set_cmd_result(struct sec_factory *sec, char *buf, int len) +{ + strncat(sec->cmd_result, buf, len); +} + +static void not_support_cmd(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", "NA"); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_NA; + dev_info(&data->client->dev, "%s: \"%s(%d)\"\n", __func__, + buf, strnlen(buf, sizeof(buf))); + return; +} + +static void get_chip_vendor(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_VENDOR); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_name(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%s", TSP_CHIP_NAME); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_chip_id(void *dev_data) +{ + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + snprintf(buf, sizeof(buf), "%#02x", data->chip_id); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} +#include +#define MAX_FW_PATH 255 +static void fw_update(void *dev_data) +{ + int ret; + char buf[16] = { 0 }; + mm_segment_t old_fs = {0}; + struct file *fp = NULL; + long fsize = 0, nread = 0; + u8 *fw; + char fw_path[MAX_FW_PATH+1]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + tsp_info("%s(), %d\n", __func__, sec->cmd_param[0]); + + switch (sec->cmd_param[0]) { + case BUILT_IN: + sec->cmd_state = CMD_STATE_OK; + ret = ist30xx_fw_recovery(data); + if (ret < 0) + sec->cmd_state = CMD_STATE_FAIL; + break; + case UMS: + sec->cmd_state = CMD_STATE_OK; + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FW_PATH, "/sdcard/%s", IST30XX_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_warn("%s(), file %s open error:%d\n", __func__, + fw_path, (s32)fp); + sec->cmd_state= CMD_STATE_FAIL; + set_fs(old_fs); + break; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + if (fsize != data->fw.buf_size) { + tsp_warn("%s(), invalid fw size!!\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + set_fs(old_fs); + break; + } + fw = kzalloc((size_t)fsize, GFP_KERNEL); + if (!fw) { + tsp_warn("%s(), failed to alloc buffer for fw\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + filp_close(fp, NULL); + set_fs(old_fs); + break; + } + nread = vfs_read(fp, (char __user *)fw, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_warn("%s(), failed to read fw\n", __func__); + sec->cmd_state = CMD_STATE_FAIL; + filp_close(fp, NULL); + set_fs(old_fs); + break; + } + + filp_close(fp, current->files); + set_fs(old_fs); + tsp_info("%s(), ums fw is loaded!!\n", __func__); + + ret = ist30xx_get_update_info(data, fw, fsize); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + break; + } + data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw); + data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw); + data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw); + data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_fw_update(data, fw, fsize); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + break; + } + + mutex_unlock(&ist30xx_mutex); + + ist30xx_calibrate(data, 1); + break; + + default: + tsp_warn("%s(), Invalid fw file type!\n", __func__); + break; + } + + if (sec->cmd_state == CMD_STATE_OK) + snprintf(buf, sizeof(buf), "%s", "OK"); + else + snprintf(buf, sizeof(buf), "%s", "NG"); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); +} + + +static void get_fw_ver_bin(void *dev_data) +{ + u32 ver = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + ver = ist30xx_parse_ver(data, FLAG_FW, data->fw.buf); + snprintf(buf, sizeof(buf), "IM00%04x", ver); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_fw_ver_ic(void *dev_data) +{ + u32 ver = 0; + char msg[8]; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->status.power == 1) + ver = ist30xx_get_fw_ver(data); + + snprintf(buf, sizeof(buf), "IM00%04x", ver & 0xFFFF); + + if (data->fw.cur.test_ver > 0) { + sprintf(msg, "(T%d)", data->fw.cur.test_ver); + strcat(buf, msg); + } + + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_threshold(void *dev_data) +{ + int ret = 0; + u32 val = 0; + char buf[16] = { 0 }; + int threshold; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + ret = ist30xx_read_cmd(data, eHCOM_GET_TOUCH_TH, &val); + if (unlikely(ret)) { + ist30xx_reset(data, false); + ist30xx_start(data); + tsp_info("%s(), ret=%d\n", __func__, ret); + val = 0; + } + + set_default_result(sec); + + threshold = (int)(val & 0xFFFF); + + snprintf(buf, sizeof(buf), "%d", threshold); + tsp_info("%s(), %s\n", __func__, buf); + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, + buf, strnlen(buf, sizeof(buf))); +} + +static void get_scr_x_num(void *dev_data) +{ + int val = -1; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->tsp_info.dir.swap_xy) + val = data->tsp_info.screen.tx; + else + val = data->tsp_info.screen.rx; + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +static void get_scr_y_num(void *dev_data) +{ + int val = -1; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->tsp_info.dir.swap_xy) + val = data->tsp_info.screen.rx; + else + val = data->tsp_info.screen.tx; + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read num of y (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +static void get_all_x_num(void *dev_data) +{ + int val = - 1; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->tsp_info.dir.swap_xy) + val = data->tsp_info.ch_num.tx; + else + val = data->tsp_info.ch_num.rx; + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read all num of x (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +static void get_all_y_num(void *dev_data) +{ + int val = -1; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if (data->tsp_info.dir.swap_xy) + val = data->tsp_info.ch_num.rx; + else + val = data->tsp_info.ch_num.tx; + + if (val >= 0) { + snprintf(buf, sizeof(buf), "%u", val); + sec->cmd_state = CMD_STATE_OK; + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); + } else { + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + dev_info(&data->client->dev, + "%s: fail to read all num of y (%d).\n", __func__, val); + } + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), %s\n", __func__, buf); +} + +int check_tsp_channel(void *dev_data, int width, int height) +{ + int node = -EPERM; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + if ((sec->cmd_param[0] < 0) || (sec->cmd_param[0] >= width) || + (sec->cmd_param[1] < 0) || (sec->cmd_param[1] >= height)) { + tsp_info("%s: parameter error: %u,%u\n", + __func__, sec->cmd_param[0], sec->cmd_param[1]); + } else { + node = sec->cmd_param[0] + sec->cmd_param[1] * width; + tsp_info("%s: node = %d\n", __func__, node); + } + + return node; +} + +static u16 node_value[IST30XX_NODE_TOTAL_NUM]; +void get_raw_array(void *dev_data) +{ + int i, ret; + int count = 0; + char *buf; + const int msg_len = 16; + char msg[msg_len]; + u8 flag = NODE_FLAG_RAW; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_read_touch_node(data, flag, &tsp->node); + if (ret) { + mutex_unlock(&ist30xx_mutex); + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node read fail!\n", __func__); + return; + } + mutex_unlock(&ist30xx_mutex); + ist30xx_parse_touch_node(data, flag, &tsp->node); + + ret = parse_tsp_node(data, flag, &tsp->node, node_value, false); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag); + return; + } + + buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL); + memset(buf, 0, sizeof(buf)); + + for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) { +#if TSP_NODE_DEBUG + if ((i % tsp->ch_num.rx) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", node_value[i]); +#endif + count += snprintf(msg, msg_len, "%d,", node_value[i]); + strncat(buf, msg, msg_len); + } + + printk("\n"); + tsp_info("%s: %d\n", __func__, count - 1); + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, count - 1); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count); + kfree(buf); +} + +void run_raw_read(void *dev_data) +{ + int i; + int ret = 0; + int min_val, max_val; + char buf[16] = { 0 }; + u8 flag = NODE_FLAG_RAW; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + ret = ist30xx_read_touch_node(data, flag, &tsp->node); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node read fail!\n", __func__); + return; + } + ist30xx_parse_touch_node(data, flag, &tsp->node); + + ret = parse_tsp_node(data, flag, &tsp->node, node_value, true); + if (ret) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp node parse fail - flag: %d\n", __func__, flag); + return; + } + + min_val = max_val = node_value[0]; + for (i = 0; i < tsp->screen.rx * tsp->screen.tx; i++) { +#if TSP_NODE_DEBUG + if ((i % tsp->screen.rx) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", node_value[i]); +#endif + + max_val = max(max_val, (int)node_value[i]); + min_val = min(min_val, (int)node_value[i]); + } + + snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val); + tsp_info("%s(), %s\n", __func__, buf); + + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void get_raw_value(void *dev_data) +{ + int idx = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + idx = check_tsp_channel(data, tsp->screen.rx, tsp->screen.tx); + if (idx < 0) { // Parameter parsing fail + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + } else { + snprintf(buf, sizeof(buf), "%d", node_value[idx]); + sec->cmd_state = CMD_STATE_OK; + } + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), [%d][%d]: %s\n", __func__, + sec->cmd_param[0], sec->cmd_param[1], buf); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +#if IST30XX_CMCS_TEST +extern u8 *ts_cmcs_bin; +extern u32 ts_cmcs_bin_size; +extern CMCS_BIN_INFO *ts_cmcs; +extern CMCS_BUF *ts_cmcs_buf; +void run_cm_test(void *dev_data) +{ + int i, j; + int ret = 0; + char buf[16] = { 0 }; + int type, idx; + int min_val, max_val; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), Binary is not correct!\n", __func__); + return; + } + + ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); + if (unlikely(ret)) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp get cmcs infomation fail!\n", __func__); + return; + } + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size); + if (unlikely(ret)) { + mutex_unlock(&ist30xx_mutex); + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp cmcs test fail!\n", __func__); + return; + } + mutex_unlock(&ist30xx_mutex); + + min_val = max_val = ts_cmcs_buf->cm[0]; + for (i = 0; i < tsp->ch_num.tx; i++) { +#if TSP_CM_DEBUG + printk("%s", IST30XX_DEBUG_TAG); +#endif + for (j = 0; j < tsp->ch_num.rx; j++) { + idx = (i * tsp->ch_num.rx) + j; + type = check_tsp_type(data, i, j); + + if ((type == TSP_CH_SCREEN) || (type == TSP_CH_GTX)) { + max_val = max(max_val, (int)ts_cmcs_buf->cm[idx]); + min_val = min(min_val, (int)ts_cmcs_buf->cm[idx]); + } +#if TSP_CM_DEBUG + printk("%5d ", ts_cmcs_buf->cm[idx]); +#endif + } +#if TSP_CM_DEBUG + printk("\n"); +#endif + } + + snprintf(buf, sizeof(buf), "%d,%d", min_val, max_val); + tsp_info("%s(), %s\n", __func__, buf); + + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void get_cm_value(void *dev_data) +{ + int idx = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + idx = check_tsp_channel(data, tsp->ch_num.rx, tsp->ch_num.tx); + if (idx < 0) { // Parameter parsing fail + snprintf(buf, sizeof(buf), "%s", "NG"); + sec->cmd_state = CMD_STATE_FAIL; + } else { + snprintf(buf, sizeof(buf), "%d", ts_cmcs_buf->cm[idx]); + sec->cmd_state = CMD_STATE_OK; + } + + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + tsp_info("%s(), [%d][%d]: %s\n", __func__, + sec->cmd_param[0], sec->cmd_param[1], buf); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void run_cmcs_test(void *dev_data) +{ + int ret = 0; + char buf[16] = { 0 }; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + set_default_result(sec); + + if ((ts_cmcs_bin == NULL) || (ts_cmcs_bin_size == 0)) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), Binary is not correct!\n", __func__); + return; + } + + ret = ist30xx_get_cmcs_info(ts_cmcs_bin, ts_cmcs_bin_size); + if (unlikely(ret)) { + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp get cmcs infomation fail!\n", __func__); + return; + } + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_cmcs_test(data, ts_cmcs_bin, ts_cmcs_bin_size); + if (unlikely(ret)) { + mutex_unlock(&ist30xx_mutex); + sec->cmd_state = CMD_STATE_FAIL; + tsp_warn("%s(), tsp cmcs test fail!\n", __func__); + return; + } + mutex_unlock(&ist30xx_mutex); + + snprintf(buf, sizeof(buf), "%s", "OK"); + tsp_info("%s(), %s\n", __func__, buf); + + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, strnlen(buf, sizeof(buf))); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, + strnlen(buf, sizeof(buf))); +} + +void get_cm_array(void *dev_data) +{ + int i; + int count = 0; + int type; + char *buf; + const int msg_len = 16; + char msg[msg_len]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL); + memset(buf, 0, sizeof(buf)); + + for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) { +#if TSP_CM_DEBUG + if ((i % tsp->ch_num.rx) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", ts_cmcs_buf->cm[i]); +#endif + type = check_tsp_type(data, i / tsp->ch_num.rx, i % tsp->ch_num.rx); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + count += snprintf(msg, msg_len, "%d,", 0); + else + count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->cm[i]); + strncat(buf, msg, msg_len); + } + + printk("\n"); + tsp_info("%s: %d\n", __func__, count - 1); + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, count - 1); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count); + kfree(buf); +} + +void get_slope0_array(void *dev_data) +{ + int i; + int count = 0; + char *buf; + const int msg_len = 16; + char msg[msg_len]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL); + memset(buf, 0, sizeof(buf)); + + for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) { +#if TSP_CM_DEBUG + if ((i % tsp->ch_num.rx) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", ts_cmcs_buf->slope0[i]); +#endif + count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->slope0[i]); + strncat(buf, msg, msg_len); + } + + printk("\n"); + tsp_info("%s: %d\n", __func__, count - 1); + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, count - 1); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count); + kfree(buf); +} + +void get_slope1_array(void *dev_data) +{ + int i; + int count = 0; + char *buf; + const int msg_len = 16; + char msg[msg_len]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL); + memset(buf, 0, sizeof(buf)); + + for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) { +#if TSP_CM_DEBUG + if ((i % tsp->ch_num.rx) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", ts_cmcs_buf->slope1[i]); +#endif + count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->slope1[i]); + strncat(buf, msg, msg_len); + } + + printk("\n"); + tsp_info("%s: %d\n", __func__, count - 1); + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, count - 1); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count); + kfree(buf); +} + +void get_cs_array(void *dev_data) +{ + int i; + int count = 0; + int type; + char *buf; + const int msg_len = 16; + char msg[msg_len]; + + struct ist30xx_data *data = (struct ist30xx_data *)dev_data; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + TSP_INFO *tsp = &data->tsp_info; + + set_default_result(sec); + + buf = kmalloc(IST30XX_NODE_TOTAL_NUM * 5, GFP_KERNEL); + memset(buf, 0, sizeof(buf)); + + for (i = 0; i < tsp->ch_num.rx * tsp->ch_num.tx; i++) { +#if TSP_CM_DEBUG + if ((i % tsp->ch_num.rx) == 0) + printk("\n%s %4d: ", IST30XX_DEBUG_TAG, i); + + printk("%4d ", ts_cmcs_buf->cs[i]); +#endif + type = check_tsp_type(data, i / tsp->ch_num.rx, i % tsp->ch_num.rx); + if ((type == TSP_CH_UNKNOWN) || (type == TSP_CH_UNUSED)) + count += snprintf(msg, msg_len, "%d,", 0); + else + count += snprintf(msg, msg_len, "%d,", ts_cmcs_buf->cs[i]); + strncat(buf, msg, msg_len); + } + + printk("\n"); + tsp_info("%s: %d\n", __func__, count - 1); + sec->cmd_state = CMD_STATE_OK; + set_cmd_result(sec, buf, count - 1); + dev_info(&data->client->dev, "%s: %s(%d)\n", __func__, buf, count); + kfree(buf); +} +#endif +/* sysfs: /sys/class/sec/tsp/close_tsp_test */ +static ssize_t show_close_tsp_test(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return snprintf(buf, FACTORY_BUF_SIZE, "%u\n", 0); +} + +/* sysfs: /sys/class/sec/tsp/cmd */ +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + struct i2c_client *client = data->client; + + char *cur, *start, *end; + char msg[SEC_CMD_STR_LEN] = { 0 }; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + int ret; + + if (sec->cmd_is_running == true) { + dev_err(&client->dev, "tsp_cmd: other cmd is running.\n"); + tsp_err("tsp_cmd: other cmd is running.\n"); + goto err_out; + } + + /* check lock */ + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = true; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_RUNNING; + + for (i = 0; i < ARRAY_SIZE(sec->cmd_param); i++) + sec->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + memset(sec->cmd, 0, ARRAY_SIZE(sec->cmd)); + memcpy(sec->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(msg, buf, cur - buf); + else + memcpy(msg, buf, len); + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp(msg, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &sec->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(msg, 0, ARRAY_SIZE(msg)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(msg, start, end - start); + *(msg + strlen(msg)) = '\0'; + ret = kstrtoint(msg, 10, \ + sec->cmd_param + param_cnt); + start = cur + 1; + memset(msg, 0, ARRAY_SIZE(msg)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + tsp_info("SEC CMD = %s\n", tsp_cmd_ptr->cmd_name); + + for (i = 0; i < param_cnt; i++) + tsp_info("SEC CMD Param %d= %d\n", i, sec->cmd_param[i]); + + tsp_cmd_ptr->cmd_func(data); + +err_out: + return count; +} + +/* sysfs: /sys/class/sec/tsp/cmd_status */ +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + char msg[16] = { 0 }; + + dev_info(&data->client->dev, "tsp cmd: status:%d\n", sec->cmd_state); + + if (sec->cmd_state == CMD_STATE_WAITING) + snprintf(msg, sizeof(msg), "WAITING"); + else if (sec->cmd_state == CMD_STATE_RUNNING) + snprintf(msg, sizeof(msg), "RUNNING"); + else if (sec->cmd_state == CMD_STATE_OK) + snprintf(msg, sizeof(msg), "OK"); + else if (sec->cmd_state == CMD_STATE_FAIL) + snprintf(msg, sizeof(msg), "FAIL"); + else if (sec->cmd_state == CMD_STATE_NA) + snprintf(msg, sizeof(msg), "NOT_APPLICABLE"); + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", msg); +} + +/* sysfs: /sys/class/sec/tsp/cmd_result */ +static ssize_t show_cmd_result(struct device *dev, struct device_attribute + *devattr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + dev_info(&data->client->dev, "tsp cmd: result: %s\n", sec->cmd_result); + + mutex_lock(&sec->cmd_lock); + sec->cmd_is_running = false; + mutex_unlock(&sec->cmd_lock); + + sec->cmd_state = CMD_STATE_WAITING; + + return snprintf(buf, FACTORY_BUF_SIZE, "%s\n", sec->cmd_result); +} + + + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_version_phone */ +static ssize_t phone_firmware_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ist30xx_data *data = dev_get_drvdata(dev); + + u32 ver = ist30xx_parse_ver(data, FLAG_FW, data->fw.buf); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_version_panel */ +static ssize_t part_firmware_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 ver = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + if (data->status.power == 1) + ver = ist30xx_get_fw_ver(data); + + tsp_info("%s(), IM00%04x\n", __func__, ver); + + return sprintf(buf, "IM00%04x", ver); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_threshold */ +static ssize_t threshold_firmware_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + u32 val = 0; + int threshold = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + ret = ist30xx_read_cmd(data, eHCOM_GET_TOUCH_TH, &val); + if (unlikely(ret)) { + ist30xx_reset(data, false); + ist30xx_start(data); + tsp_info("%s(), ret=%d\n", __func__, ret); + val = 0; + } + + threshold = (int)(val & 0xFFFF); + + tsp_info("%s(), %d (ret=%d)\n", __func__, threshold, ret); + + return sprintf(buf, "%d", threshold); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_update */ +static ssize_t firmware_update(struct device *dev, + struct device_attribute *attr, char *buf) +{ + bool ret; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sprintf(IsfwUpdate, "%s\n", FW_DOWNLOADING); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + ret = ist30xx_fw_recovery(data); + ret = (ret == 0 ? 1 : -1); + + sprintf(IsfwUpdate, "%s\n", + (ret > 0 ? FW_DOWNLOAD_COMPLETE : FW_DOWNLOAD_FAIL)); + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%d", ret); +} + +/* sysfs: /sys/class/sec/sec_touchscreen/tsp_firm_update_status */ +static ssize_t firmware_update_status(struct device *dev, + struct device_attribute *attr, char *buf) +{ + tsp_info("%s(), %s\n", __func__, IsfwUpdate); + + return sprintf(buf, "%s\n", IsfwUpdate); +} + +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_menu */ +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_recent */ +static ssize_t recent_sensitivity_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int sensitivity = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sensitivity = ist30xx_get_key_sensitivity(data, 0); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d", sensitivity); +} + +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_back */ +static ssize_t back_sensitivity_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int sensitivity = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sensitivity = ist30xx_get_key_sensitivity(data, 1); + + tsp_info("%s(), %d\n", __func__, sensitivity); + + return sprintf(buf, "%d", sensitivity); +} + +/* sysfs: /sys/class/sec/sec_touchkey/touchkey_threshold */ +static ssize_t touchkey_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + u32 val = 0; + int threshold = 0; + struct ist30xx_data *data = dev_get_drvdata(dev); + + ret = ist30xx_read_cmd(data, eHCOM_GET_TOUCH_TH, &val); + if (unlikely(ret)) { + ist30xx_reset(data, false); + ist30xx_start(data); + val = 0; + } + + threshold = (int)((val >> 16) & 0xFFFF); + + tsp_info("%s(), %d (ret=%d)\n", __func__, threshold, ret); + + return sprintf(buf, "%d", threshold); +} + +struct tsp_cmd tsp_cmds[] = { + { TSP_CMD("get_chip_vendor", get_chip_vendor), }, + { TSP_CMD("get_chip_name", get_chip_name), }, + { TSP_CMD("get_chip_id", get_chip_id), }, + { TSP_CMD("fw_update", fw_update), }, + { TSP_CMD("get_fw_ver_bin", get_fw_ver_bin), }, + { TSP_CMD("get_fw_ver_ic", get_fw_ver_ic), }, + { TSP_CMD("get_threshold", get_threshold), }, + { TSP_CMD("get_x_num", get_scr_x_num), }, + { TSP_CMD("get_y_num", get_scr_y_num), }, + { TSP_CMD("get_all_x_num", get_all_x_num), }, + { TSP_CMD("get_all_y_num", get_all_y_num), }, + { TSP_CMD("run_raw_read", run_raw_read), }, + { TSP_CMD("get_raw_value", get_raw_value), }, +#if IST30XX_CMCS_TEST + { TSP_CMD("run_cm_test", run_cm_test), }, + { TSP_CMD("get_cm_value", get_cm_value), }, +#if IST30XX_JIG_MODE + { TSP_CMD("get_raw_array", get_raw_array), }, + { TSP_CMD("run_cmcs_test", run_cmcs_test), }, + { TSP_CMD("get_cm_array", get_cm_array), }, + { TSP_CMD("get_slope0_array",get_slope0_array),}, + { TSP_CMD("get_slope1_array",get_slope1_array),}, + { TSP_CMD("get_cs_array", get_cs_array), }, + { TSP_CMD("get_cs0_array", get_cs_array), }, + { TSP_CMD("get_cs1_array", get_cs_array), }, +#endif +#endif + { TSP_CMD("not_support_cmd", not_support_cmd), }, +}; + +#define SEC_DEFAULT_ATTR (S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH) +/* sysfs - touchscreen */ +static DEVICE_ATTR(tsp_firm_version_phone, SEC_DEFAULT_ATTR, + phone_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_version_panel, SEC_DEFAULT_ATTR, + part_firmware_show, NULL); +static DEVICE_ATTR(tsp_threshold, SEC_DEFAULT_ATTR, + threshold_firmware_show, NULL); +static DEVICE_ATTR(tsp_firm_update, SEC_DEFAULT_ATTR, + firmware_update, NULL); +static DEVICE_ATTR(tsp_firm_update_status, SEC_DEFAULT_ATTR, + firmware_update_status, NULL); + +/* sysfs - touchkey */ +static DEVICE_ATTR(touchkey_menu, SEC_DEFAULT_ATTR, + recent_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_recent, SEC_DEFAULT_ATTR, + recent_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_back, SEC_DEFAULT_ATTR, + back_sensitivity_show, NULL); +static DEVICE_ATTR(touchkey_threshold, SEC_DEFAULT_ATTR, + touchkey_threshold_show, NULL); + +/* sysfs - tsp */ +static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *sec_tsp_attributes[] = { + &dev_attr_tsp_firm_version_phone.attr, + &dev_attr_tsp_firm_version_panel.attr, + &dev_attr_tsp_threshold.attr, + &dev_attr_tsp_firm_update.attr, + &dev_attr_tsp_firm_update_status.attr, + NULL, +}; + +static struct attribute *sec_tkey_attributes[] = { + &dev_attr_touchkey_menu.attr, + &dev_attr_touchkey_recent.attr, + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_threshold.attr, + NULL, +}; + +static struct attribute *sec_touch_facotry_attributes[] = { + &dev_attr_close_tsp_test.attr, + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group sec_tsp_attr_group = { + .attrs = sec_tsp_attributes, +}; + +static struct attribute_group sec_tkey_attr_group = { + .attrs = sec_tkey_attributes, +}; + +static struct attribute_group sec_touch_factory_attr_group = { + .attrs = sec_touch_facotry_attributes, +}; + +extern struct class *sec_class; +struct device *sec_touchscreen; +struct device *sec_touchkey; +struct device *sec_fac_dev; + +int sec_touch_sysfs(struct ist30xx_data *data) +{ + /* /sys/class/sec/sec_touchscreen */ + sec_touchscreen = device_create(sec_class, NULL, 1, data, + "sec_touchscreen"); + if (IS_ERR(sec_touchscreen)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchscreen"); + goto err_sec_touchscreen; + } + /* /sys/class/sec/sec_touchscreen/... */ + if (sysfs_create_group(&sec_touchscreen->kobj, &sec_tsp_attr_group)) { + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchscreen"); + goto err_sec_touchscreen_attr; + } + + /* /sys/class/sec/sec_touchkey */ + sec_touchkey = device_create(sec_class, NULL, 2, data, "sec_touchkey"); + if (IS_ERR(sec_touchkey)) { + tsp_err("Failed to create device (%s)!\n", "sec_touchkey"); + goto err_sec_touchkey; + } + /* /sys/class/sec/sec_touchkey/... */ + if (sysfs_create_group(&sec_touchkey->kobj, &sec_tkey_attr_group)) { + tsp_err("Failed to create sysfs group(%s)!\n", "sec_touchkey"); + goto err_sec_touchkey_attr; + } + + /* /sys/class/sec/tsp */ + sec_fac_dev = device_create(sec_class, NULL, 3, data, "tsp"); + if (IS_ERR(sec_fac_dev)) { + tsp_err("Failed to create device (%s)!\n", "tsp"); + goto err_sec_fac_dev; + } + /* /sys/class/sec/tsp/... */ + if (sysfs_create_group(&sec_fac_dev->kobj, &sec_touch_factory_attr_group)) { + tsp_err("Failed to create sysfs group(%s)!\n", "tsp"); + goto err_sec_fac_dev_attr; + } + + return 0; + +err_sec_fac_dev_attr: + device_destroy(sec_class, 3); +err_sec_fac_dev: +err_sec_touchkey_attr: + device_destroy(sec_class, 2); +err_sec_touchkey: +err_sec_touchscreen_attr: + device_destroy(sec_class, 1); +err_sec_touchscreen: + + return -ENODEV; +} +EXPORT_SYMBOL(sec_touch_sysfs); +int sec_fac_cmd_init(struct ist30xx_data *data) +{ + int i; + struct sec_factory *sec = (struct sec_factory *)&data->sec; + + INIT_LIST_HEAD(&sec->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &sec->cmd_list_head); + + mutex_init(&sec->cmd_lock); + sec->cmd_is_running = false; + + return 0; +} +EXPORT_SYMBOL(sec_fac_cmd_init); +#endif diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_sec.h b/drivers/input/touchscreen/ist30xxc/ist30xxc_sec.h new file mode 100644 index 00000000..95e04e35 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_sec.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XXC_SEC_H__ +#define __IST30XXC_SEC_H__ + + +#define SEC_CMD_STR_LEN 32 +#define SEC_CMD_RESULT_STR_LEN 2048 +#define SEC_CMD_PARAM_NUM 8 + +struct sec_factory { + struct list_head cmd_list_head; + unsigned char cmd_state; + char cmd[SEC_CMD_STR_LEN]; + int cmd_param[SEC_CMD_PARAM_NUM]; + char cmd_result[SEC_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; +}; +#endif // __IST30XXC_SEC_H__ diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_sys.c b/drivers/input/touchscreen/ist30xxc/ist30xxc_sys.c new file mode 100644 index 00000000..b419fb31 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_sys.c @@ -0,0 +1,481 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "ist30xxc.h" +#include "ist30xxc_tracking.h" + +extern char *ist_vdd_name; +/****************************************************************************** + * Return value of Error + * EPERM : 1 (Operation not permitted) + * ENOENT : 2 (No such file or directory) + * EIO : 5 (I/O error) + * ENXIO : 6 (No such device or address) + * EINVAL : 22 (Invalid argument) + *****************************************************************************/ + +int ist30xx_cmd_gesture(struct i2c_client *client, int value) +{ + int ret = -EIO; + + if (value > 3) + return ret; + + ret = ist30xx_write_cmd(client, + IST30XX_HIB_CMD, (eHCOM_GESTURE_EN << 16) | (value & 0xFFFF)); + + return ret; +} + +int ist30xx_cmd_start_scan(struct ist30xx_data *data) +{ + int ret = ist30xx_write_cmd(data->client, IST30XX_HIB_CMD, + (eHCOM_FW_START << 16) | (IST30XX_ENABLE & 0xFFFF)); + + ist30xx_tracking(TRACK_CMD_SCAN); + + data->status.noise_mode = true; + + return ret; +} + +int ist30xx_cmd_calibrate(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, + IST30XX_HIB_CMD, (eHCOM_RUN_CAL_AUTO << 16)); + + ist30xx_tracking(TRACK_CMD_CALIB); + + tsp_info("%s\n", __func__); + + return ret; +} + +int ist30xx_cmd_check_calib(struct i2c_client *client) +{ + int ret = ist30xx_write_cmd(client, IST30XX_HIB_CMD, + (eHCOM_RUN_CAL_PARAM << 16) | (IST30XX_ENABLE & 0xFFFF)); + + ist30xx_tracking(TRACK_CMD_CHECK_CALIB); + + tsp_info("*** Check Calibration cmd ***\n"); + + return ret; +} + +int ist30xx_cmd_hold(struct i2c_client *client, int enable) +{ + int ret = ist30xx_write_cmd(client, + IST30XX_HIB_CMD, (eHCOM_FW_HOLD << 16) | (enable & 0xFFFF)); + + msleep(40); + + if (enable) + ist30xx_tracking(TRACK_CMD_ENTER_REG); + else + ist30xx_tracking(TRACK_CMD_EXIT_REG); + + return ret; +} + +int ist30xx_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, + int msg_num, u8 *cmd_buf) +{ + int ret = 0; + int idx = msg_num - 1; + int size = msgs[idx].len; + u8 *msg_buf = NULL; + u8 *pbuf = NULL; + int trans_size, max_size = 0; + + if (msg_num == WRITE_CMD_MSG_LEN) + max_size = I2C_MAX_WRITE_SIZE; + else if (msg_num == READ_CMD_MSG_LEN) + max_size = I2C_MAX_READ_SIZE; + + if (unlikely(max_size == 0)) { + tsp_err("%s() : transaction size(%d)\n", __func__, max_size); + return -EINVAL; + } + + if (msg_num == WRITE_CMD_MSG_LEN) { + msg_buf = kmalloc(max_size + IST30XX_ADDR_LEN, GFP_KERNEL); + if (!msg_buf) + return -ENOMEM; + memcpy(msg_buf, cmd_buf, IST30XX_ADDR_LEN); + pbuf = msgs[idx].buf; + } + + while (size > 0) { + trans_size = (size >= max_size ? max_size : size); + + msgs[idx].len = trans_size; + if (msg_num == WRITE_CMD_MSG_LEN) { + memcpy(&msg_buf[IST30XX_ADDR_LEN], pbuf, trans_size); + msgs[idx].buf = msg_buf; + msgs[idx].len += IST30XX_ADDR_LEN; + } + ret = i2c_transfer(adap, msgs, msg_num); + if (unlikely(ret != msg_num)) { + tsp_err("%s() : i2c_transfer failed(%d), num=%d\n", + __func__, ret, msg_num); + break; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + pbuf += trans_size; + else + msgs[idx].buf += trans_size; + + size -= trans_size; + } + + if (msg_num == WRITE_CMD_MSG_LEN) + kfree(msg_buf); + + return ret; +} + +int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int ret, i; + u32 le_reg = cpu_to_be32(cmd); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = len * IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = ist30xx_i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN, NULL); + if (unlikely(ret != READ_CMD_MSG_LEN)) + return -EIO; + + for (i = 0; i < len; i++) + buf[i] = cpu_to_be32(buf[i]); + + return 0; +} + +int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len) +{ + int i; + int ret; + struct i2c_msg msg; + u8 cmd_buf[IST30XX_ADDR_LEN]; + u8 msg_buf[IST30XX_DATA_LEN * (len + 1)]; + + put_unaligned_be32(cmd, cmd_buf); + + if (likely(len > 0)) { + for (i = 0; i < len; i++) + put_unaligned_be32(buf[i], msg_buf + (i * IST30XX_DATA_LEN)); + } else { + /* then add dummy data(4byte) */ + put_unaligned_be32(0, msg_buf); + len = 1; + } + + msg.addr = client->addr; + msg.flags = 0; + msg.len = len * IST30XX_DATA_LEN; + msg.buf = msg_buf; + + ret = ist30xx_i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN, + cmd_buf); + if (unlikely(ret != WRITE_CMD_MSG_LEN)) + return -EIO; + + return 0; +} + +int ist30xx_read_reg(struct i2c_client *client, u32 reg, u32 *buf) +{ + int ret; + u32 le_reg = cpu_to_be32(reg); + + struct i2c_msg msg[READ_CMD_MSG_LEN] = { + { + .addr = client->addr, + .flags = 0, + .len = IST30XX_ADDR_LEN, + .buf = (u8 *)&le_reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = IST30XX_DATA_LEN, + .buf = (u8 *)buf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, READ_CMD_MSG_LEN); + if (ret != READ_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d), cmd: %x\n", __func__, ret, reg); + return -EIO; + } + *buf = cpu_to_be32(*buf); + + return 0; +} + +int ist30xx_read_cmd(struct ist30xx_data *data, u32 cmd, u32 *buf) +{ + int ret; + + ret = ist30xx_cmd_hold(data->client, 1); + if (unlikely(ret)) + return ret; + + ist30xx_read_reg(data->client, IST30XX_DA_ADDR(cmd), buf); + + ret = ist30xx_cmd_hold(data->client, 0); + if (unlikely(ret)) { + ist30xx_reset(data, false); + return ret; + } + + return ret; +} + +int ist30xx_write_cmd(struct i2c_client *client, u32 cmd, u32 val) +{ + int ret; + + struct i2c_msg msg; + u8 msg_buf[IST30XX_ADDR_LEN + IST30XX_DATA_LEN]; + + put_unaligned_be32(cmd, msg_buf); + put_unaligned_be32(val, msg_buf + IST30XX_ADDR_LEN); + + msg.addr = client->addr; + msg.flags = 0; + msg.len = IST30XX_ADDR_LEN + IST30XX_DATA_LEN; + msg.buf = msg_buf; + + ret = i2c_transfer(client->adapter, &msg, WRITE_CMD_MSG_LEN); + if (ret != WRITE_CMD_MSG_LEN) { + tsp_err("%s: i2c failed (%d), cmd: %x(%x)\n", __func__, ret, cmd, val); + return -EIO; + } + + msleep(40); + + return 0; +} + +int ist30xx_burst_read(struct i2c_client *client, u32 addr, + u32 *buf32, u16 len, bool bit_en) +{ + int ret = 0; + int i; + u16 max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + u16 remain_len = len; + + if (bit_en) + addr = IST30XX_BA_ADDR(addr); + + for (i = 0; i < len; i += max_len) { + if (remain_len < max_len) max_len = remain_len; + + ret = ist30xx_read_buf(client, addr, buf32, max_len); + if (unlikely(ret)) { + tsp_err("Burst fail, addr: %x\n", __func__, addr); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + remain_len -= max_len; + } + + return 0; +} + +int ist30xx_burst_write(struct i2c_client *client, u32 addr, + u32 *buf32, u16 len) +{ + int ret = 0; + int i; + u16 max_len = I2C_MAX_WRITE_SIZE / IST30XX_DATA_LEN; + u16 remain_len = len; + + addr = IST30XX_BA_ADDR(addr); + + for (i = 0; i < len; i += max_len) { + if (remain_len < max_len) max_len = remain_len; + + ret = ist30xx_write_buf(client, addr, buf32, max_len); + if (unlikely(ret)) { + tsp_err("Burst fail, addr: %x\n", __func__, addr); + return ret; + } + + addr += max_len * IST30XX_DATA_LEN; + buf32 += max_len; + remain_len -= max_len; + } + + return 0; +} + +static struct regulator *touch_regulator; +static void ts_power_enable(struct ist30xx_data *data, int en) +{ + struct i2c_client *client = data->client; + int ret; + + tsp_info("%s %s\n", __func__, (en) ? "on" : "off"); + + if (touch_regulator == NULL) { + touch_regulator = regulator_get(&client->dev, ist_vdd_name); + if (IS_ERR(touch_regulator)) { + ret = PTR_ERR(touch_regulator); + dev_err(&client->dev, + "Failed to get vdd regulator(%d)\n", ret); + return ret; + } + + ret = regulator_set_voltage(touch_regulator, 3000000, 3000000); + if (ret < 0) { + dev_err(&client->dev, + "Failed to set vdd regulator(%d)\n", ret); + regulator_put(touch_regulator); + touch_regulator = NULL; + return ret; + } + } + + if (en){ + if(data->status.power) + printk("%s:already enabled\n",__func__); + else + regulator_enable(touch_regulator); + } + else{ + if(data->status.power) + regulator_disable(touch_regulator); + else + printk("%s:already disabled\n",__func__); + } +} + +int ist30xx_power_on(struct ist30xx_data *data, bool download) +{ + if (data->status.power != 1) { + tsp_info("%s()\n", __func__); + ist30xx_tracking(TRACK_PWR_ON); + /* VDD enable */ + ts_power_enable(data, 1); + if (download) + msleep(8); + else + msleep(50); + + data->status.power = 1; + } + + return 0; +} + +int ist30xx_power_off(struct ist30xx_data *data) +{ + if (data->status.power != 0) { + tsp_info("%s()\n", __func__); + ist30xx_tracking(TRACK_PWR_OFF); + /* VDD disable */ + ts_power_enable(data, 0); + msleep(50); + data->status.power = 0; + data->status.noise_mode = false; + } + + return 0; +} + +int ist30xx_reset(struct ist30xx_data *data, bool download) +{ + tsp_info("%s()\n", __func__); + ist30xx_power_off(data); + msleep(10); + ist30xx_power_on(data, download); + + return 0; +} + +int ist30xx_internal_suspend(struct ist30xx_data *data) +{ +#if IST30XX_GESTURE + data->suspend = true; + if (data->gesture) { + ist30xx_reset(data, false); + ist30xx_cmd_gesture(data->client, 3); + } else { + ist30xx_power_off(data); + } +#else + ist30xx_power_off(data); +#endif + return 0; +} + +int ist30xx_internal_resume(struct ist30xx_data *data) +{ +#if IST30XX_GESTURE + data->suspend = false; + if (data->gesture) + ist30xx_reset(data, false); + else + ist30xx_power_on(data, false); +#else + ist30xx_power_on(data, false); +#endif + + return 0; +} + +int ist30xx_init_system(struct ist30xx_data *data) +{ + int ret; + + // TODO : place additional code here. + ret = ist30xx_power_on(data, false); + if (ret) { + tsp_err("%s: ist30xx_init_system failed (%d)\n", __func__, ret); + return -EIO; + } + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.c b/drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.c new file mode 100644 index 00000000..89920e1e --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.c @@ -0,0 +1,231 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include + +#include "ist30xxc.h" +#include "ist30xxc_tracking.h" + +IST30XX_RING_BUF TrackBuf; +IST30XX_RING_BUF *pTrackBuf; + +bool tracking_initialize = false; + +void ist30xx_tracking_init(void) +{ + if (tracking_initialize) + return; + + pTrackBuf = &TrackBuf; + + pTrackBuf->RingBufCtr = 0; + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->RingBufOutIdx = 0; + + tracking_initialize = true; +} + +void ist30xx_tracking_deinit(void) +{ +} + +static spinlock_t mr_lock = __SPIN_LOCK_UNLOCKED(); +int ist30xx_get_track(u32 *track, int cnt) +{ + int i; + u8 *buf = (u8 *)track; + unsigned long flags; + + + cnt *= sizeof(track[0]); + + spin_lock_irqsave(&mr_lock, flags); + + if (pTrackBuf->RingBufCtr < (u16)cnt) { + spin_unlock_irqrestore(&mr_lock, flags); + return IST30XX_RINGBUF_NOT_ENOUGH; + } + + for (i = 0; i < cnt; i++) { + if (pTrackBuf->RingBufOutIdx == IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufOutIdx = 0; + + *buf++ = (u8)pTrackBuf->LogBuf[pTrackBuf->RingBufOutIdx++]; + pTrackBuf->RingBufCtr--; + } + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +u32 ist30xx_get_track_cnt(void) +{ + return pTrackBuf->RingBufCtr; +} + +#if IST30XX_TRACKING_MODE +int ist30xx_put_track(u32 *track, int cnt) +{ + int i; + u8 *buf = (u8 *)track; + unsigned long flags; + + spin_lock_irqsave(&mr_lock, flags); + + cnt *= sizeof(track[0]); + + pTrackBuf->RingBufCtr += cnt; + if (pTrackBuf->RingBufCtr > IST30XX_MAX_LOG_SIZE) { + pTrackBuf->RingBufOutIdx += + (pTrackBuf->RingBufCtr - IST30XX_MAX_LOG_SIZE); + if (pTrackBuf->RingBufOutIdx >= IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufOutIdx -= IST30XX_MAX_LOG_SIZE; + + pTrackBuf->RingBufCtr = IST30XX_MAX_LOG_SIZE; + } + + for (i = 0; i < cnt; i++) { + if (pTrackBuf->RingBufInIdx == IST30XX_MAX_LOG_SIZE) + pTrackBuf->RingBufInIdx = 0; + pTrackBuf->LogBuf[pTrackBuf->RingBufInIdx++] = *buf++; + } + + spin_unlock_irqrestore(&mr_lock, flags); + + return IST30XX_RINGBUF_NO_ERR; +} + +int ist30xx_put_track_ms(u32 ms) +{ + ms &= 0x0000FFFF; + ms |= IST30XX_TRACKING_MAGIC; + + return ist30xx_put_track(&ms, 1); +} + +static struct timespec t_track; +int ist30xx_tracking(u32 status) +{ + u32 ms; + + if (!tracking_initialize) + ist30xx_tracking_init(); + + ktime_get_ts(&t_track); + ms = t_track.tv_sec * 1000 + t_track.tv_nsec / 1000000; + + ist30xx_put_track_ms(ms); + ist30xx_put_track(&status, 1); + + return 0; +} +#else +int ist30xx_put_track(u32 *track, int cnt) +{ + return 0; +} +int ist30xx_put_track_ms(u32 ms) +{ + return 0; +} +int ist30xx_tracking(u32 status) +{ + return 0; +} +#endif // IST30XX_TRACKING_MODE + +#define MAX_TRACKING_COUNT (1024) +/* sysfs: /sys/class/touch/tracking/track_frame */ +ssize_t ist30xx_track_frame_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, buf_cnt = 0; + u32 track_cnt = MAX_TRACKING_COUNT; + u32 track; + char msg[10]; + + mutex_lock(&ist30xx_mutex); + + buf[0] = '\0'; + + if (track_cnt > ist30xx_get_track_cnt()) + track_cnt = ist30xx_get_track_cnt(); + + track_cnt /= sizeof(track); + + tsp_verb("num: %d of %d\n", track_cnt, ist30xx_get_track_cnt()); + + for (i = 0; i < track_cnt; i++) { + ist30xx_get_track(&track, 1); + + tsp_verb("%08X\n", track); + + buf_cnt += sprintf(msg, "%08x", track); + strcat(buf, msg); + } + + mutex_unlock(&ist30xx_mutex); + + return buf_cnt; +} + +/* sysfs: /sys/class/touch/tracking/track_cnt */ +ssize_t ist30xx_track_cnt_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u32 val = (u32)ist30xx_get_track_cnt(); + + tsp_verb("tracking cnt: %d\n", val); + + return sprintf(buf, "%08x", val); +} + + +/* sysfs */ +static DEVICE_ATTR(track_frame, S_IRWXUGO, ist30xx_track_frame_show, NULL); +static DEVICE_ATTR(track_cnt, S_IRWXUGO, ist30xx_track_cnt_show, NULL); + +static struct attribute *tracking_attributes[] = { + &dev_attr_track_frame.attr, + &dev_attr_track_cnt.attr, + NULL, +}; + +static struct attribute_group tracking_attr_group = { + .attrs = tracking_attributes, +}; + +extern struct class *ist30xx_class; +struct device *ist30xx_tracking_dev; + +int ist30xx_init_tracking_sysfs(void) +{ + /* /sys/class/touch/tracking */ + ist30xx_tracking_dev = device_create(ist30xx_class, NULL, 0, NULL, + "tracking"); + + /* /sys/class/touch/tracking/... */ + if (sysfs_create_group(&ist30xx_tracking_dev->kobj, &tracking_attr_group)) + tsp_err("[ TSP ] Failed to create sysfs group(%s)!\n", "tracking"); + + ist30xx_tracking_init(); + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.h b/drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.h new file mode 100644 index 00000000..599942d3 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_tracking.h @@ -0,0 +1,61 @@ +#ifndef __IST30XXC_TRACKING_H__ +#define __IST30XXC_TRACKING_H__ + + +#define IST30XX_RINGBUF_NO_ERR (0) +#define IST30XX_RINGBUF_NOT_ENOUGH (1) +#define IST30XX_RINGBUF_EMPTY (2) +#define IST30XX_RINGBUF_FULL (3) +#define IST30XX_RINGBUF_TIMEOUT (4) +#define IST30XX_MAX_LOG_SIZE (4 * 100 * 1024) // 4bytes * 100Kbytes, Single touch: about 12minutes + +#define TRACK_PWR_ON (0x1) +#define TRACK_PWR_OFF (0x2) +#define TRACK_PWR_RESET (0x3) +#define TRACK_INTR_ENABLE (0x4) +#define TRACK_INTR_DISABLE (0x5) +#define TRACK_CMD_RUN_DEVICE (0x10) +#define TRACK_CMD_SCAN (0x11) +#define TRACK_CMD_TACON (0x12) +#define TRACK_CMD_TADISCON (0x13) +#define TRACK_CMD_FWUPDATE (0x14) +#define TRACK_CMD_PRUPDATE (0x15) +#define TRACK_CMD_CALIB (0x16) +#define TRACK_CMD_CHECK_CALIB (0x17) +#define TRACK_CMD_CHKSUM (0x18) +#define TRACK_CMD_CHKSUM_ALL (0x19) +#define TRACK_CMD_ENTER_REG (0x1A) +#define TRACK_CMD_EXIT_REG (0x1B) +#define TRACK_CMD_CALL (0x1C) +#define TRACK_CMD_NOTCALL (0x1D) +#define TRACK_CMD_COVER (0x1E) +#define TRACK_CMD_NOTCOVER (0x1F) +#define TRACK_POS_FINGER (0x20) +#define TRACK_POS_KEY (0x30) +#define TRACK_POS_UNKNOWN (0x3F) + +#define IST30XX_TRACKING_MAGIC (0x7750 << 16) + + +typedef struct _IST30XX_RINGBUF { + u32 RingBufCtr; // Number of characters in the ring buffer + u32 RingBufInIdx; + u32 RingBufOutIdx; + u8 LogBuf[IST30XX_MAX_LOG_SIZE]; // Ring buffer for status +} IST30XX_RING_BUF; + + +void ist30xx_tracking_init(void); +void ist30xx_tracking_deinit(void); + +int ist30xx_get_track(u32 *track, int cnt); +int ist30xx_put_track(u32 *track, int cnt); +int ist30xx_put_track_ms(u32 ms); + +u32 ist30xx_get_track_cnt(void); + +int ist30xx_tracking(u32 status); + +int ist30xx_init_tracking_sysfs(void); + +#endif // __IST30XXC_TRACKING_H__ diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_update.c b/drivers/input/touchscreen/ist30xxc/ist30xxc_update.c new file mode 100755 index 00000000..92073196 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_update.c @@ -0,0 +1,1474 @@ +/* + * Copyright (C) 2010,Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ist30xxc.h" +#include "ist30xxc_update.h" +#include "ist30xxc_tracking.h" + +#if IST30XX_INTERNAL_BIN +#if defined(CONFIG_MACH_SS_SHARKLT8) || defined(CONFIG_MACH_SS_SHARKLT8LIGHTSLEEP) +#include "./firmware/ss_sharklt8_fw.h" +#else +#include "./firmware/coreprimeve3g_fw.h" +#endif +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) +#if IST30XX_MULTIPLE_TSP +//#include "./firmware/ist30xxc_fw_tsp_Ver0000_porting.h" +#endif +#endif +#endif // IST30XX_INTERNAL_BIN + +#define TAGS_PARSE_OK (0) + +// ISP burst r/w +int ist30xx_isp_read_burst(struct i2c_client *client, u32 addr, + u32 *buf32, u16 len) +{ + int ret = 0; + int i; + u16 max_len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + u16 remain_len = len; + + for (i = 0; i < len; i += max_len) { + if (remain_len < max_len) max_len = remain_len; + ret = ist30xx_read_buf(client, addr, buf32, max_len); + if (unlikely(ret)) { + tsp_err("Burst fail, addr: %x\n", __func__, addr); + return ret; + } + + buf32 += max_len; + remain_len -= max_len; + } + + return 0; +} + +int ist30xx_isp_write_burst(struct i2c_client *client, u32 addr, + u32 *buf32, u16 len) +{ + int ret = 0; + int i; + u16 max_len = I2C_MAX_WRITE_SIZE / IST30XX_DATA_LEN; + u16 remain_len = len; + + for (i = 0; i < len; i += max_len) { + if (remain_len < max_len) max_len = remain_len; + ret = ist30xx_write_buf(client, addr, buf32, max_len); + if (unlikely(ret)) { + tsp_err("Burst fail, addr: %x\n", addr); + return ret; + } + + buf32 += max_len; + remain_len -= max_len; + } + + return 0; +} + +#define IST30XX_ISP_READ_TOTAL_S (0x01) +#define IST30XX_ISP_READ_TOTAL_B (0x11) +#define IST30XX_ISP_READ_MAIN_S (0x02) +#define IST30XX_ISP_READ_MAIN_B (0x12) +#define IST30XX_ISP_READ_INFO_S (0x03) +#define IST30XX_ISP_READ_INFO_B (0x13) +#define IST30XX_ISP_PROG_TOTAL_S (0x04) +#define IST30XX_ISP_PROG_TOTAL_B (0x14) +#define IST30XX_ISP_PROG_MAIN_S (0x05) +#define IST30XX_ISP_PROG_MAIN_B (0x15) +#define IST30XX_ISP_PROG_INFO_S (0x06) +#define IST30XX_ISP_PROG_INFO_B (0x16) +#define IST30XX_ISP_ERASE_BLOCK (0x07) +#define IST30XX_ISP_ERASE_SECTOR (0x08) +#define IST30XX_ISP_ERASE_PAGE (0x09) +#define IST30XX_ISP_ERASE_INFO (0x0A) +#define IST30XX_ISP_READ_TOTAL_CRC (0x1B) +#define IST30XX_ISP_READ_MAIN_CRC (0x1C) +#define IST30XX_ISP_READ_INFO_CRC (0x1D) +int ist30xxc_isp_enable(struct i2c_client *client, bool enable) +{ + int ret = 0; + + if (enable) { + ret = ist30xx_write_cmd(client, IST30XX_FLASH_ISPEN, 0xDE01); + if (unlikely(ret)) + return ret; + +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) + ret = ist30xx_write_cmd(client, IST30XX_FLASH_MODE, 0x4100); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_TEST_MODE1, 0x38); + if (unlikely(ret)) + return ret; +#endif + } else { + ret = ist30xx_write_cmd(client, IST30XX_FLASH_ISPEN, 0x2); + if (unlikely(ret)) + return ret; + } + + msleep(1); + + return ret; +} + +int ist30xxc_isp_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + u32 val = 0; + + switch (mode) { + case IST30XX_ISP_READ_TOTAL_S: + val = 0x8090; + break; + case IST30XX_ISP_READ_TOTAL_B: + case IST30XX_ISP_READ_TOTAL_CRC: + val = 0x8190; + break; + case IST30XX_ISP_READ_MAIN_S: + val = 0x0090; + break; + case IST30XX_ISP_READ_MAIN_B: + case IST30XX_ISP_READ_MAIN_CRC: + val = 0x0190; + break; + case IST30XX_ISP_READ_INFO_S: + val = 0x0098; + break; + case IST30XX_ISP_READ_INFO_B: + case IST30XX_ISP_READ_INFO_CRC: + val = 0x0198; + break; + case IST30XX_ISP_PROG_TOTAL_S: + val = 0x8050; + break; + case IST30XX_ISP_PROG_TOTAL_B: + val = 0x8150; + break; + case IST30XX_ISP_PROG_MAIN_S: + val = 0x0050; + break; + case IST30XX_ISP_PROG_MAIN_B: + val = 0x0150; + break; + case IST30XX_ISP_PROG_INFO_S: + val = 0x0058; + break; + case IST30XX_ISP_PROG_INFO_B: + val = 0x0158; + break; + case IST30XX_ISP_ERASE_BLOCK: + val = 0x0031; + break; + case IST30XX_ISP_ERASE_SECTOR: + val = 0x0032; + break; + case IST30XX_ISP_ERASE_PAGE: + val = 0x0030; + break; + case IST30XX_ISP_ERASE_INFO: + val = 0x0038; + break; + default: + tsp_err("ISP fail, unknown mode\n"); + return -EINVAL; + } + +#if (IMAGIS_TSP_IC > IMAGIS_IST3032C) + val &= ~(0x8000); +#endif + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_MODE, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_MODE\n"); + return ret; + } + + return 0; +} + +int ist30xxc_isp_erase(struct i2c_client *client, int mode, u32 index) +{ + int ret = 0; + + ret = ist30xxc_isp_mode(client, mode); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_DIN, index); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_DIN\n"); + return ret; + } + + msleep(50); // Flash erase time : Mininum 40msec + + return ret; +} + + +int ist30xxc_isp_program(struct i2c_client *client, u32 addr, int mode, + const u32 *buf32, int len) +{ + int ret = 0; + + ret = ist30xxc_isp_mode(client, mode); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_ADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_ADDR\n"); + return ret; + } + + if (mode & 0x10) + ret = ist30xx_isp_write_burst(client, + IST30XX_FLASH_DIN, (u32 *)buf32, len); + else + ret = ist30xx_write_buf(client, IST30XX_FLASH_DIN, (u32 *)buf32, len); + + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_DIN\n"); + return ret; + } + + return ret; +} + +int ist30xxc_isp_read(struct i2c_client *client, u32 addr, int mode, + u32 *buf32, int len) +{ + int ret = 0; + + /* IST30xxB ISP read mode */ + ret = ist30xxc_isp_mode(client, mode); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_ADDR, addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_ADDR\n"); + return ret; + } + + if (mode & 0x10) + ret = ist30xx_isp_read_burst(client, IST30XX_FLASH_DOUT, buf32, len); + else + ret = ist30xx_read_buf(client, IST30XX_FLASH_DOUT, buf32, len); + + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_DOUT\n"); + return ret; + } + + return 0; +} + +int ist30xxc_cmd_read_chksum(struct i2c_client *client, int mode, + u32 start_addr, u32 end_addr, u32 *chksum) +{ + int ret = 0; + u32 val = (1 << 28) | (1 << 25) | (1 << 24) | (1 << 20) | (1 << 16); + + val |= (end_addr / IST30XX_ADDR_LEN) - 1; + + ret = ist30xxc_isp_mode(client, mode); + if (unlikely(ret)) + return ret; + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_ADDR, start_addr); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_ADDR (%x)\n", val); + return ret; + } + + ret = ist30xx_write_cmd(client, IST30XX_FLASH_AUTO_READ, val); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_AUTO_READ (%x)\n", val); + return ret; + } + + msleep(100); + + ret = ist30xx_read_reg(client, IST30XX_FLASH_CRC, chksum); + if (unlikely(ret)) { + tsp_err("ISP fail, IST30XX_FLASH_CRC (%x)\n", chksum); + return ret; + } + + return 0; +} + +int ist30xxc_read_chksum(struct ist30xx_data *data, u32 *chksum) +{ + int ret = 0; + u32 start_addr, end_addr; + + start_addr = data->tags.fw_addr; + end_addr = data->tags.sensor_addr + data->tags.sensor_size; + ret = ist30xxc_cmd_read_chksum(data->client, + IST30XX_ISP_READ_TOTAL_CRC, start_addr, end_addr, chksum); + if (unlikely(ret)) + return ret; + + tsp_info("chksum: %x(%x~%x)\n", *chksum, start_addr, end_addr); + + return 0; +} + +int ist30xxc_read_chksum_all(struct i2c_client *client, u32 *chksum) +{ + int ret = 0; + u32 start_addr, end_addr; + + start_addr = IST30XX_FLASH_BASE_ADDR; + end_addr = IST30XX_FLASH_BASE_ADDR + IST30XX_FLASH_TOTAL_SIZE; + ret = ist30xxc_cmd_read_chksum(client, + IST30XX_ISP_READ_TOTAL_CRC, start_addr, end_addr, chksum); + if (unlikely(ret)) + return ret; + + tsp_info("chksum: %x(%x~%x)\n", *chksum, start_addr, end_addr); + + return 0; +} + +int ist30xxc_isp_fw_read(struct ist30xx_data *data, u32 *buf32) +{ + int ret = 0; + int i; + int len; + u32 addr = IST30XX_FLASH_BASE_ADDR; + + ist30xx_reset(data, true); + + /* IST30xxB ISP enable */ + ret = ist30xxc_isp_enable(data->client, true); + if (unlikely(ret)) + return ret; + +#if I2C_BURST_MODE + for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE; i += I2C_MAX_READ_SIZE) { + len = I2C_MAX_READ_SIZE / IST30XX_DATA_LEN; + if ((IST30XX_FLASH_TOTAL_SIZE - i) < I2C_MAX_READ_SIZE) + len = (IST30XX_FLASH_TOTAL_SIZE - i) / IST30XX_DATA_LEN; + + ret = ist30xxc_isp_read(data->client, addr, IST30XX_ISP_READ_TOTAL_B, + buf32, len); + if (unlikely(ret)) + goto isp_fw_read_end; + + addr += len; + buf32 += len; + } +#else + for (i = 0; i < IST30XX_FLASH_MAIN_SIZE; i += IST30XX_DATA_LEN) { + ret = ist30xxc_isp_read(data->client, addr, IST30XX_ISP_READ_TOTAL_S, + buf32, 1); + if (unlikely(ret)) + goto isp_fw_read_end; + + addr++; + buf32++; + } +#endif +isp_fw_read_end: + /* IST30xxC ISP disable */ + ist30xxc_isp_enable(data->client, false); + ist30xx_reset(data, false); + return ret; +} + +int ist30xxc_isp_fw_update(struct ist30xx_data *data, const u8 *buf) +{ +#if !(I2C_BURST_MODE) + int i; +#endif + int ret = 0; + u32 addr = IST30XX_FLASH_BASE_ADDR; + + ist30xx_reset(data, true); + + /* IST30xxC ISP enable */ + ret = ist30xxc_isp_enable(data->client, true); + if (unlikely(ret)) + goto isp_fw_update_end; + + /* IST30xxC ISP erase */ + ret = ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_BLOCK, 0); + if (unlikely(ret)) + goto isp_fw_update_end; + +#if (IST30XX_FLASH_INFO_SIZE > 0) + ret = ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_INFO, 0); + if (unlikely(ret)) + goto isp_fw_update_end; +#endif + + ist30xx_reset(data, true); + + /* IST30xxC ISP enable */ + ret = ist30xxc_isp_enable(data->client, true); + if (unlikely(ret)) + goto isp_fw_update_end; + +#if I2C_BURST_MODE + /* IST30xxC ISP write burst */ +#if 0 + for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE / IST30XX_FLASH_PAGE_SIZE; i++) { + ret = ist30xxc_isp_program(data->client, addr, + IST30XX_ISP_PROG_TOTAL_B, (u32 *)buf, + IST30XX_FLASH_PAGE_SIZE / IST30XX_DATA_LEN); + if (unlikely(ret)) + goto isp_fw_update_end; + + addr += IST30XX_FLASH_PAGE_SIZE / IST30XX_DATA_LEN; + buf += IST30XX_FLASH_PAGE_SIZE; + } +#else + ret = ist30xxc_isp_program(data->client, addr, IST30XX_ISP_PROG_TOTAL_B, + (u32 *)buf, IST30XX_FLASH_TOTAL_SIZE / IST30XX_DATA_LEN); + if (unlikely(ret)) + goto isp_fw_update_end; +#endif +#else + /* IST30xxC ISP write single */ + for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE; i += IST30XX_DATA_LEN) { + ret = ist30xxc_isp_program(data->client, addr, + IST30XX_ISP_PROG_TOTAL_S, (u32 *)buf, 1); + if (unlikely(ret)) + goto isp_fw_update_end; + + addr++; + buf += IST30XX_DATA_LEN; + } +#endif + +isp_fw_update_end: + /* IST30xxC ISP disable */ + ist30xxc_isp_enable(data->client, false); + ist30xx_reset(data, false); + return ret; +} + +u32 ist30xx_parse_ver(struct ist30xx_data *data, int flag, const u8 *buf) +{ + u32 ver = 0; + u32 *buf32 = (u32 *)buf; + + if (flag == FLAG_MAIN) + ver = (u32)buf32[(data->tags.flag_addr + 0x1FC) >> 2]; + else if (flag == FLAG_TEST) + ver = (u32)buf32[(data->tags.flag_addr + 0x1F4) >> 2]; + else if (flag == FLAG_FW) + ver = (u32)(buf32[(data->tags.cfg_addr + 0x4) >> 2] & 0xFFFF); + else if (flag == FLAG_CORE) + ver = (u32)buf32[(data->tags.flag_addr + 0x1F0) >> 2]; + else + tsp_warn("Parsing ver's flag is not corrent!\n"); + + return ver; +} + +int calib_ms_delay = CALIB_WAIT_TIME; +int ist30xx_calib_wait(struct ist30xx_data *data) +{ + int cnt = calib_ms_delay; + + data->status.calib_msg = 0; + while (cnt-- > 0) { + msleep(100); + + if (data->status.calib_msg) { + tsp_info("Calibration status : %d, Max raw gap : %d - (%08x)\n", + CALIB_TO_STATUS(data->status.calib_msg), + CALIB_TO_GAP(data->status.calib_msg), + data->status.calib_msg); + if (CALIB_TO_STATUS(data->status.calib_msg) == 0) + return 0; // Calibrate success + else + return -EAGAIN; + } + } + tsp_warn("Calibration time out\n"); + + return -EPERM; +} + +int ist30xx_calibrate(struct ist30xx_data *data, int wait_cnt) +{ + int ret = -ENOEXEC; + + tsp_info("*** Calibrate %ds ***\n", calib_ms_delay / 10); + + data->status.update = 1; + ist30xx_disable_irq(data); + while (1) { + ret = ist30xx_cmd_calibrate(data->client); + if (unlikely(ret)) + continue; + + ist30xx_enable_irq(data); + ret = ist30xx_calib_wait(data); + if (likely(!ret)) + break; + + ist30xx_disable_irq(data); + + if (--wait_cnt == 0) + break; + + ist30xx_reset(data, false); + } + + ist30xx_disable_irq(data); + ist30xx_reset(data, false); + data->status.update = 2; + ist30xx_enable_irq(data); + + return ret; +} + + +int ist30xx_parse_tags(struct ist30xx_data *data, const u8 *buf, const u32 size) +{ + int ret = -EPERM; + struct ist30xx_tags *tags; + + tags = (struct ist30xx_tags *)(&buf[size - sizeof(struct ist30xx_tags)]); + + if (!strncmp(tags->magic1, IST30XX_TAG_MAGIC, sizeof(tags->magic1)) + && !strncmp(tags->magic2, IST30XX_TAG_MAGIC, sizeof(tags->magic2)) + ) { + data->tags = *tags; + + data->tags.fw_addr -= data->tags.rom_base; + data->tags.cfg_addr -= data->tags.rom_base; + data->tags.sensor_addr -= data->tags.rom_base; + data->tags.cp_addr -= data->tags.rom_base; + data->tags.flag_addr -= data->tags.rom_base; + + data->fw.index = data->tags.fw_addr; + data->fw.size = tags->flag_addr - tags->fw_addr + + tags->flag_size; + data->fw.chksum = tags->chksum; + + tsp_verb("Tagts magic1: %s, magic2: %s\n", + data->tags.magic1, data->tags.magic2); + tsp_verb(" rom: %x\n", data->tags.rom_base); + tsp_verb(" ram: %x\n", data->tags.ram_base); + tsp_verb(" fw: %x(%x)\n", data->tags.fw_addr, data->tags.fw_size); + tsp_verb(" cfg: %x(%x)\n", data->tags.cfg_addr, data->tags.cfg_size); + tsp_verb(" sensor: %x(%x)\n", + data->tags.sensor_addr, data->tags.sensor_size); + tsp_verb(" cp: %x(%x)\n", data->tags.cp_addr, data->tags.cp_size); + tsp_verb(" flag: %x(%x)\n", data->tags.flag_addr, data->tags.flag_size); + tsp_verb(" zvalue: %x\n", data->tags.zvalue_base); + tsp_verb(" algo: %x\n", data->tags.algo_base); + tsp_verb(" raw: %x\n", data->tags.raw_base); + tsp_verb(" filter: %x\n", data->tags.filter_base); + tsp_verb(" chksum: %x\n", data->tags.chksum); + tsp_verb(" chksum_all: %x\n", data->tags.chksum_all); + tsp_verb(" build time: %04d/%02d/%02d (%02d:%02d:%02d)\n", + data->tags.year, data->tags.month, data->tags.day, + data->tags.hour, data->tags.min, data->tags.sec); + + ret = 0; + } + + return ret; +} + +int ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, + const u32 size) +{ + int ret; + + ret = ist30xx_parse_tags(data, buf, size); + if (unlikely(ret != TAGS_PARSE_OK)) + tsp_warn("Cannot find tags of F/W, make a tags by 'tagts.exe'\n"); + + return ret; +} + +#define TSP_INFO_SWAP_XY (1 << 0) +#define TSP_INFO_FLIP_X (1 << 1) +#define TSP_INFO_FLIP_Y (1 << 2) +u32 ist30xx_info_cal_crc(u32 *buf) +{ + int i; + u32 chksum32 = 0; + + for (i = 0; i < IST30XX_MAX_CMD_SIZE - 1; i++) { + chksum32 += *buf++; + } + + return chksum32; +} + +int ist30xx_tsp_update_info(struct ist30xx_data *data) +{ + int ret = 0; + u32 chksum; + u32 info[IST30XX_MAX_CMD_SIZE]; + u32 tsp_lcd, tsp_swap, tsp_scr, tsp_gtx, tsp_ch; + u32 tkey_info0, tkey_info1, tkey_info2; + u32 finger_info, baseline, threshold; + TSP_INFO *tsp = &data->tsp_info; +#if IST30XX_USE_KEY + TKEY_INFO *tkey = &data->tkey_info; +#endif + + ret = ist30xx_cmd_hold(data->client, 1); + if (unlikely(ret)) + return ret; + + ret = ist30xx_burst_read(data->client, + IST30XX_DA_ADDR(eHCOM_GET_CHIP_ID), &info[0], + IST30XX_MAX_CMD_SIZE, true); + if (unlikely(ret)) + return ret; + + ist30xx_cmd_hold(data->client, 0); + if (unlikely(ret)) { + ist30xx_reset(data, false); + return ret; + } + + ret = ist30xx_read_cmd(data, IST30XX_REG_CHIPID, &data->chip_id); + if (unlikely(ret)) + return ret; + + if ((info[IST30XX_CMD_VALUE(eHCOM_GET_CHIP_ID)] != data->chip_id) || + (info[IST30XX_CMD_VALUE(eHCOM_GET_CHIP_ID)] == 0) || + (info[IST30XX_CMD_VALUE(eHCOM_GET_CHIP_ID)] == 0xFFFF)) + return -EINVAL; + + chksum = ist30xx_info_cal_crc((u32*)info); + if (chksum != info[IST30XX_MAX_CMD_SIZE - 1]) { + tsp_err("info checksum : %08X, %08X\n", + chksum, info[IST30XX_MAX_CMD_SIZE - 1]); + return -EINVAL; + } + tsp_info("info read success\n"); + + tsp_lcd = info[IST30XX_CMD_VALUE(eHCOM_GET_LCD_INFO)]; + tsp_ch = info[IST30XX_CMD_VALUE(eHCOM_GET_TSP_INFO)]; + tkey_info0 = info[IST30XX_CMD_VALUE(eHCOM_GET_KEY_INFO_0)]; + tkey_info1 = info[IST30XX_CMD_VALUE(eHCOM_GET_KEY_INFO_1)]; + tkey_info2 = info[IST30XX_CMD_VALUE(eHCOM_GET_KEY_INFO_2)]; + tsp_scr = info[IST30XX_CMD_VALUE(eHCOM_GET_SCR_INFO)]; + tsp_gtx = info[IST30XX_CMD_VALUE(eHCOM_GET_GTX_INFO)]; + tsp_swap = info[IST30XX_CMD_VALUE(eHCOM_GET_SWAP_INFO)]; + finger_info = info[IST30XX_CMD_VALUE(eHCOM_GET_FINGER_INFO)]; + baseline = info[IST30XX_CMD_VALUE(eHCOM_GET_BASELINE)]; + threshold = info[IST30XX_CMD_VALUE(eHCOM_GET_TOUCH_TH)]; + + tsp->ch_num.rx = (tsp_ch >> 16) & 0xFFFF; + tsp->ch_num.tx = tsp_ch & 0xFFFF; + + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + + tsp->gtx.num = (tsp_gtx >> 24) & 0xFF; + tsp->gtx.ch_num[0] = (tsp_gtx >> 16) & 0xFF; + tsp->gtx.ch_num[1] = (tsp_gtx >> 8) & 0xFF; + tsp->gtx.ch_num[2] = 0xFF; + tsp->gtx.ch_num[3] = 0xFF; + + tsp->finger_num = finger_info; + tsp->dir.swap_xy = (tsp_swap & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (tsp_swap & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (tsp_swap & TSP_INFO_FLIP_Y ? true : false); + + tsp->baseline = baseline & 0xFFFF; + + tsp->screen.rx = (tsp_scr >> 16) & 0xFFFF; + tsp->screen.tx = tsp_scr & 0xFFFF; + + if (tsp->dir.swap_xy) { + tsp->width = tsp_lcd & 0xFFFF; + tsp->height = (tsp_lcd >> 16) & 0xFFFF; + } else { + tsp->width = (tsp_lcd >> 16) & 0xFFFF; + tsp->height = tsp_lcd & 0xFFFF; + } + +#if IST30XX_USE_KEY + tkey->enable = (((tkey_info0 >> 24) & 0xFF) ? true : false); + tkey->key_num = (tkey_info0 >> 16) & 0xFF; + tkey->ch_num[0].tx = tkey_info0 & 0xFF; + tkey->ch_num[0].rx = (tkey_info0 >> 8) & 0xFF; + tkey->ch_num[1].tx = (tkey_info1 >> 16) & 0xFF; + tkey->ch_num[1].rx = (tkey_info1 >> 24) & 0xFF; + tkey->ch_num[2].tx = tkey_info1 & 0xFF; + tkey->ch_num[2].rx = (tkey_info1 >> 8) & 0xFF; + tkey->ch_num[3].tx = (tkey_info2 >> 16) & 0xFF; + tkey->ch_num[3].rx = (tkey_info2 >> 24) & 0xFF; + tkey->ch_num[4].tx = tkey_info2 & 0xFF; + tkey->ch_num[4].rx = (tkey_info2 >> 8) & 0xFF; + + tkey->baseline = (baseline >> 16) & 0xFFFF; +#endif + + return ret; +} + +int ist30xx_get_tsp_info(struct ist30xx_data *data) +{ + int ret = 0; + int retry = 3; +#if IST30XX_INTERNAL_BIN + TSP_INFO *tsp = &data->tsp_info; +#if IST30XX_USE_KEY + TKEY_INFO *tkey = &data->tkey_info; +#endif + u8 *cfg_buf; +#endif + + while (retry--) { + ret = ist30xx_tsp_update_info(data); + if (ret == 0) { + tsp_info("tsp update info success!\n"); + return ret; + } + } + +#if IST30XX_INTERNAL_BIN + cfg_buf = (u8 *)&data->fw.buf[data->tags.cfg_addr]; + + tsp->ch_num.rx = (u8)cfg_buf[0x0C]; + tsp->ch_num.tx = (u8)cfg_buf[0x0D]; + tsp->node.len = tsp->ch_num.tx * tsp->ch_num.rx; + + tsp->gtx.num = (u8)cfg_buf[0x10]; + tsp->gtx.ch_num[0] = (u8)cfg_buf[0x11]; + tsp->gtx.ch_num[1] = (u8)cfg_buf[0x12]; + tsp->gtx.ch_num[2] = (u8)cfg_buf[0x13]; + tsp->gtx.ch_num[3] = (u8)cfg_buf[0x14]; + + tsp->finger_num = (u8)cfg_buf[0x1A]; + tsp->dir.swap_xy = (bool)(cfg_buf[0x1B] & TSP_INFO_SWAP_XY ? true : false); + tsp->dir.flip_x = (bool)(cfg_buf[0x1B] & TSP_INFO_FLIP_X ? true : false); + tsp->dir.flip_y = (bool)(cfg_buf[0x1B] & TSP_INFO_FLIP_Y ? true : false); + + tsp->baseline = (u16)((cfg_buf[0x31] << 8) | cfg_buf[0x30]); + + tsp->screen.rx = (u8)cfg_buf[0x0E]; + tsp->screen.tx = (u8)cfg_buf[0x0F]; + + if (tsp->dir.swap_xy) { + tsp->width = (u16)((cfg_buf[0x19] << 8) | cfg_buf[0x18]); + tsp->height = (u16)((cfg_buf[0x17] << 8) | cfg_buf[0x16]); + } else { + tsp->width = (u16)((cfg_buf[0x17] << 8) | cfg_buf[0x16]); + tsp->height = (u16)((cfg_buf[0x19] << 8) | cfg_buf[0x18]); + } + +#if IST30XX_USE_KEY + tkey->enable = (bool)(cfg_buf[0x3A] & 1); + tkey->key_num = (u8)cfg_buf[0x3B]; + tkey->ch_num[0].tx = (u8)cfg_buf[0x3E]; + tkey->ch_num[0].rx = (u8)cfg_buf[0x43]; + tkey->ch_num[1].tx = (u8)cfg_buf[0x3F]; + tkey->ch_num[1].rx = (u8)cfg_buf[0x44]; + tkey->ch_num[2].tx = (u8)cfg_buf[0x40]; + tkey->ch_num[2].rx = (u8)cfg_buf[0x45]; + tkey->ch_num[3].tx = (u8)cfg_buf[0x41]; + tkey->ch_num[3].rx = (u8)cfg_buf[0x46]; + tkey->ch_num[4].tx = (u8)cfg_buf[0x42]; + tkey->ch_num[4].rx = (u8)cfg_buf[0x47]; + + tkey->baseline = (u16)((cfg_buf[0x3D] << 8) | cfg_buf[0x3C]); +#endif +#endif + + return ret; +} + +void ist30xx_print_info(struct ist30xx_data *data) +{ + TSP_INFO *tsp = &data->tsp_info; + TKEY_INFO *tkey = &data->tkey_info; + + tsp_info("*** TSP/TKEY info ***\n"); + tsp_info("TSP info: \n"); + tsp_info(" finger num: %d\n", tsp->finger_num); + tsp_info(" dir swap: %d, flip x: %d, y: %d\n", + tsp->dir.swap_xy, tsp->dir.flip_x, tsp->dir.flip_y); + tsp_info(" baseline: %d\n", tsp->baseline); + tsp_info(" ch_num tx: %d, rx: %d\n", tsp->ch_num.tx, tsp->ch_num.rx); + tsp_info(" screen tx: %d, rx: %d\n", tsp->screen.tx, tsp->screen.rx); + tsp_info(" width: %d, height: %d\n", tsp->width, tsp->height); + tsp_info(" gtx num: %d, ch [1]: %d, [2]: %d, [3]: %d, [4]: %d\n", + tsp->gtx.num, tsp->gtx.ch_num[0], tsp->gtx.ch_num[1], + tsp->gtx.ch_num[2], tsp->gtx.ch_num[3]); + tsp_info(" node len: %d\n", tsp->node.len); + tsp_info("TKEY info: \n"); + tsp_info(" enable: %d, key num: %d\n", tkey->enable, tkey->key_num); + tsp_info(" ch [0]: %d,%d [1]: %d,%d [2]: %d,%d [3]: %d,%d [4]: %d,%d\n", + tkey->ch_num[0].tx, tkey->ch_num[0].rx, tkey->ch_num[1].tx, + tkey->ch_num[1].rx, tkey->ch_num[2].tx, tkey->ch_num[2].rx, + tkey->ch_num[3].tx, tkey->ch_num[3].rx, tkey->ch_num[4].tx, + tkey->ch_num[4].rx); + tsp_info(" baseline : %d\n", tkey->baseline); +} + +#define update_next_step(ret) { if (unlikely(ret)) goto end; } +int ist30xx_fw_update(struct ist30xx_data *data, const u8 *buf, int size) +{ + int ret = 0; + u32 chksum = 0; + struct ist30xx_fw *fw = &data->fw; + + tsp_info("*** Firmware update ***\n"); + tsp_info(" main: %x, fw: %x, test: %x, core: %x(addr: 0x%x ~ 0x%x)\n", + fw->bin.main_ver, fw->bin.fw_ver, fw->bin.test_ver, fw->bin.core_ver, + fw->index, (fw->index + fw->size)); + + data->status.update = 1; + data->status.update_result = 0; + + ist30xx_disable_irq(data); + + ret = ist30xxc_isp_fw_update(data, buf); + update_next_step(ret); + + ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) { + if (unlikely(ret)) + ist30xx_reset(data, false); + + goto end; + } + + ret = ist30xx_get_ver_info(data); + update_next_step(ret); + +end: + if (unlikely(ret)) { + data->status.update_result = 1; + tsp_warn("Firmware update Fail!, ret=%d\n", ret); + } else if (unlikely(chksum != fw->chksum)) { + data->status.update_result = 1; + tsp_warn("Error CheckSum: %x(%x)\n", chksum, fw->chksum); + ret = -ENOEXEC; + } + + ist30xx_enable_irq(data); + + data->status.update = 2; + + return ret; +} + +int ist30xx_fw_recovery(struct ist30xx_data *data) +{ + int ret = -EPERM; + u8 *fw = data->fw.buf; + int fw_size = data->fw.buf_size; + + ret = ist30xx_get_update_info(data, fw, fw_size); + if (ret) + return ret; + + data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw); + data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw); + data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw); + data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_fw_update(data, fw, fw_size); + if (ret == 0) + ist30xx_calibrate(data, 1); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(data); + + return ret; +} + +#if IST30XX_INTERNAL_BIN +int ist30xx_check_fw(struct ist30xx_data *data, const u8 *buf) +{ + int ret; + u32 chksum; + + ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum); + if (unlikely(ret)) { + ist30xx_reset(data, false); + return ret; + } + + if (unlikely(chksum != data->fw.chksum)) { + tsp_warn("Checksum compare error, (IC: %08x, Bin: %08x)\n", + chksum, data->fw.chksum); + return -EPERM; + } + + return 0; +} + +bool ist30xx_check_valid_vendor(u32 tsp_vendor) +{ +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) + switch (tsp_vendor) { + case TSP_TYPE_ALPS: + case TSP_TYPE_EELY: + case TSP_TYPE_TOP: + case TSP_TYPE_MELFAS: + case TSP_TYPE_ILJIN: + case TSP_TYPE_SYNOPEX: + case TSP_TYPE_SMAC: + case TSP_TYPE_TAEYANG: + case TSP_TYPE_TOVIS: + case TSP_TYPE_ELK: + case TSP_TYPE_OTHERS: + return true; + default: + return false; + } +#else + if (tsp_vendor < TSP_TYPE_NO) + return true; +#endif + + return false; +} + +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) +#if IST30XX_MULTIPLE_TSP +void ist30xx_set_tsp_fw(struct ist30xx_data *data) +{ + char *str; + struct ist30xx_fw *fw = &data->fw; + + switch (data->tsp_type) { + case TSP_TYPE_ILJIN: + str = "ALPS/ILJIN"; + fw->buf = (u8 *)ist30xxc_fw; + fw->buf_size = sizeof(ist30xxc_fw); + break; + case TSP_TYPE_EELY: + str = "EELY"; + fw->buf = (u8 *)ist30xxc_fw2; + fw->buf_size = sizeof(ist30xxc_fw2); + break; + + case TSP_TYPE_UNKNOWN: + default: + str = "Unknown"; + tsp_warn("Unknown TSP vendor(0x%x)\n", data->tsp_type); + break; + } + tsp_info("TSP vendor : %s(%x)\n", str, data->tsp_type); +} +#endif // IST30XX_MULTIPLE_TSP +#endif // (IMAGIS_TSP_IC < IMAGIS_IST3038C) + +int ist30xx_check_auto_update(struct ist30xx_data *data) +{ + int ret = 0; + int retry = IST30XX_MAX_RETRY_CNT; + u32 tsp_type = TSP_TYPE_UNKNOWN; + bool tsp_check = false; + u32 chksum; + struct ist30xx_fw *fw = &data->fw; + + while (retry--) { + ret = ist30xx_read_cmd(data, eHCOM_GET_TSP_VENDOR, &tsp_type); + if (likely(ret == 0)) { + if (likely(ist30xx_check_valid_vendor(tsp_type) == true)) + tsp_check = true; + break; + } + + ist30xx_reset(data, false); + } +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) + tsp_info("TSP vendor: %x\n", tsp_type); +#endif + + if (unlikely(!tsp_check)) + goto fw_check_end; + + ist30xx_get_ver_info(data); + + if (likely((fw->cur.fw_ver > 0) && (fw->cur.fw_ver < 0xFFFFFFFF))) { + tsp_info("Version compare IC: %x(%x), BIN: %x(%x)\n", fw->cur.fw_ver, + fw->cur.main_ver, fw->bin.fw_ver, fw->bin.main_ver); + + /* If FW version is same, check FW checksum */ + if (likely((fw->cur.main_ver == fw->bin.main_ver) && + (fw->cur.fw_ver == fw->bin.fw_ver) && + (fw->cur.test_ver == 0))) { + ret = ist30xx_read_cmd(data, eHCOM_GET_CRC32, &chksum); + if (unlikely((ret) || (chksum != fw->chksum))) { + tsp_warn("Checksum error, IC: %x, Bin: %x (ret: %d)\n", + chksum, fw->chksum, ret); + goto fw_check_end; + } + } + + /* + * fw->cur.main_ver : Main version in TSP IC + * fw->cur.fw_ver : FW version if TSP IC + * fw->bin.main_ver : Main version in FW Binary + * fw->bin.fw_ver : FW version in FW Binary + */ + /* If the ver of binary is higher than ver of IC, FW update operate. */ + + if (likely((fw->cur.main_ver >= fw->bin.main_ver) && + (fw->cur.fw_ver >= fw->bin.fw_ver))) + return 0; + } + +fw_check_end: + return -EAGAIN; +} + +int ist30xx_auto_bin_update(struct ist30xx_data *data) +{ + int ret = 0; + int retry = IST30XX_MAX_RETRY_CNT; + struct ist30xx_fw *fw = &data->fw; + + fw->buf = (u8 *)ist30xxc_fw; + fw->buf_size = sizeof(ist30xxc_fw); + +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) +#if IST30XX_MULTIPLE_TSP + ist30xx_set_tsp_fw(data); +#endif +#endif + + ret = ist30xx_get_update_info(data, fw->buf, fw->buf_size); + if (unlikely(ret)) + return 1; + fw->bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw->buf); + fw->bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw->buf); + fw->bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw->buf); + fw->bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw->buf); + + tsp_info("IC: %x, Binary ver main: %x, fw: %x, test: %x, core: %x\n", + data->chip_id, fw->bin.main_ver, fw->bin.fw_ver, fw->bin.test_ver, + fw->bin.core_ver); + + mutex_lock(&ist30xx_mutex); + ret = ist30xx_check_auto_update(data); + mutex_unlock(&ist30xx_mutex); + + if (likely(ret >= 0)) + return ret; + +update_bin: // TSP is not ready / FW update + tsp_info("Update version. fw(main, test, core): %x(%x, %x, %x) -> %x(%x, %x, %x)\n", + fw->cur.fw_ver, fw->cur.main_ver, fw->cur.test_ver, fw->cur.core_ver, + fw->bin.fw_ver, fw->bin.main_ver, fw->bin.test_ver, fw->bin.core_ver); + + mutex_lock(&ist30xx_mutex); + while (retry--) { + ret = ist30xx_fw_update(data, fw->buf, fw->buf_size); + if (unlikely(!ret)) + break; + } + mutex_unlock(&ist30xx_mutex); + + if (unlikely(ret)) + return ret; + + if (unlikely(retry > 0 && ist30xx_check_fw(data, fw->buf))) + goto update_bin; + + mutex_lock(&ist30xx_mutex); + ist30xx_calibrate(data, IST30XX_MAX_RETRY_CNT); + mutex_unlock(&ist30xx_mutex); + + return ret; +} +#endif // IST30XX_INTERNAL_BIN + +#define MAX_FILE_PATH 255 +/* sysfs: /sys/class/touch/firmware/firmware */ +ssize_t ist30xx_fw_store(struct device *dev, struct device_attribute *attr, + const char *buf, size_t size) +{ + int ret; + int fw_size = 0; + u8 *fw = NULL; + const u8 *buff = 0; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FILE_PATH]; + const struct firmware *request_fw = NULL; + int mode = 0; + int calib = 1; + struct ist30xx_data *data = dev_get_drvdata(dev); + + sscanf(buf, "%d %d", &mode, &calib); + + switch (mode) { + case MASK_UPDATE_INTERNAL: +#if IST30XX_INTERNAL_BIN + fw = data->fw.buf; + fw_size = data->fw.buf_size; +#else + tsp_warn("Not support internal bin!!\n"); + return size; +#endif + break; + + case MASK_UPDATE_FW: + ret = request_firmware(&request_fw, IST30XX_FW_NAME, + &data->client->dev); + if (ret) { + tsp_warn("File not found, %s\n", IST30XX_FW_NAME); + return size; + } + + fw = (u8 *)request_fw->data; + fw_size = (u32)request_fw->size; + tsp_info("firmware is loaded!!\n"); + break; + + case MASK_UPDATE_SDCARD: + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s", + IST30XX_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + tsp_info("fail to alloc buffer\n"); + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_info("mismatch fw size\n"); + goto err_fw_size; + } + + fw = (u8 *)buff; + fw_size = (u32)fsize; + + filp_close(fp, current->files); + tsp_info("firmware is loaded!!\n"); + break; + + case MASK_UPDATE_ERASE: + tsp_info("EEPROM all erase!!\n"); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + ist30xx_reset(data, true); + ist30xxc_isp_enable(data->client, true); + ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_BLOCK, 0); +#if (IST30XX_FLASH_INFO_SIZE > 0) + ist30xxc_isp_erase(data->client, IST30XX_ISP_ERASE_INFO, 0); +#endif + ist30xxc_isp_enable(data->client, false); + ist30xx_reset(data, false); + ist30xx_start(data); + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + default: + return size; + } + + ret = ist30xx_get_update_info(data, fw, fw_size); + if (ret) + goto err_get_info; + + data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw); + data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw); + data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw); + data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(data, fw, fw_size); + + if (calib) + ist30xx_calibrate(data, 1); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(data); + +err_get_info: + if (request_fw != NULL) + release_firmware(request_fw); + + if (fp != NULL) { +err_fw_size: + kfree(buff); +err_alloc: + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + } + + return size; +} + +/* sysfs: /sys/class/touch/firmware/fw_sdcard */ +ssize_t ist30xx_fw_sdcard_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret = 0; + int fw_size = 0; + u8 *fw = NULL; + const u8 *buff = 0; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FILE_PATH]; + struct ist30xx_data *data = dev_get_drvdata(dev); + + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s", + IST30XX_FW_NAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + tsp_info("fail to alloc buffer\n"); + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + tsp_info("mismatch fw size\n"); + goto err_fw_size; + } + + fw = (u8 *)buff; + fw_size = (u32)fsize; + + filp_close(fp, current->files); + tsp_info("firmware is loaded!!\n"); + + ret = ist30xx_get_update_info(data, fw, fw_size); + if (ret) + goto err_get_info; + data->fw.bin.main_ver = ist30xx_parse_ver(data, FLAG_MAIN, fw); + data->fw.bin.fw_ver = ist30xx_parse_ver(data, FLAG_FW, fw); + data->fw.bin.test_ver = ist30xx_parse_ver(data, FLAG_TEST, fw); + data->fw.bin.core_ver = ist30xx_parse_ver(data, FLAG_CORE, fw); + + mutex_lock(&ist30xx_mutex); + ist30xx_fw_update(data, fw, fw_size); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(data); + +err_get_info: +err_fw_size: + if (buff) + kfree(buff); +err_alloc: + if (fp) + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + + return 0; +} + +/* sysfs: /sys/class/touch/firmware/firmware */ +ssize_t ist30xx_fw_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count; + struct ist30xx_data *data = dev_get_drvdata(dev); + + switch (data->status.update) { + case 1: + count = sprintf(buf, "Downloading\n"); + break; + case 2: + if (data->status.update_result) { + count = sprintf(buf, "Update fail\n"); + } else { + count = sprintf(buf, "Update success, ver %x(%x, %x, %x)-> %x(%x, %x, %x), " + "status : %d, gap : %d\n", + data->fw.prev.fw_ver, data->fw.prev.main_ver, + data->fw.prev.test_ver, data->fw.prev.core_ver, + data->fw.cur.fw_ver, data->fw.cur.main_ver, + data->fw.cur.test_ver, data->fw.cur.core_ver, + CALIB_TO_STATUS(data->status.calib_msg), + CALIB_TO_GAP(data->status.calib_msg)); + } + break; + default: + count = sprintf(buf, "Pass\n"); + } + + return count; +} + +/* sysfs: /sys/class/touch/firmware/fw_read */ +u32 buf32_flash[IST30XX_FLASH_TOTAL_SIZE / IST30XX_DATA_LEN]; +ssize_t ist30xx_fw_read_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + int i; + mm_segment_t old_fs = { 0 }; + struct file *fp = NULL; + char fw_path[MAX_FILE_PATH]; + u8 *buf8 = (u8 *)buf32_flash; + struct ist30xx_data *data = dev_get_drvdata(dev); + + mutex_lock(&ist30xx_mutex); + ist30xx_disable_irq(data); + + ist30xxc_isp_fw_read(data, buf32_flash); + for (i = 0; i < IST30XX_FLASH_TOTAL_SIZE; i += 16) { + tsp_debug("%07x: %02x%02x %02x%02x %02x%02x %02x%02x " + "%02x%02x %02x%02x %02x%02x %02x%02x\n", i, + buf8[i], buf8[i + 1], buf8[i + 2], buf8[i + 3], + buf8[i + 4], buf8[i + 5], buf8[i + 6], buf8[i + 7], + buf8[i + 8], buf8[i + 9], buf8[i + 10], buf8[i + 11], + buf8[i + 12], buf8[i + 13], buf8[i + 14], buf8[i + 15]); + } + + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FILE_PATH, "/sdcard/%s", IST30XX_BIN_NAME); + fp = filp_open(fw_path, O_CREAT|O_WRONLY|O_TRUNC, 0); + if (IS_ERR(fp)) { + tsp_info("file %s open error:%d\n", fw_path, (s32)fp); + goto err_file_open; + } + + fp->f_op->write(fp, buf8, IST30XX_FLASH_TOTAL_SIZE, &fp->f_pos); + fput(fp); + + filp_close(fp, NULL); + set_fs(old_fs); + +err_file_open: + ist30xx_enable_irq(data); + mutex_unlock(&ist30xx_mutex); + + ist30xx_start(data); + + return 0; +} + +/* sysfs: /sys/class/touch/firmware/version */ +ssize_t ist30xx_fw_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int count; + struct ist30xx_data *data = dev_get_drvdata(dev); + + count = sprintf(buf, "ID: %x, main: %x, fw: %x, test: %x, core: %x\n", + data->chip_id, data->fw.cur.main_ver, data->fw.cur.fw_ver, + data->fw.cur.test_ver, data->fw.cur.core_ver); + +#if IST30XX_INTERNAL_BIN + { + char msg[128]; + + ist30xx_get_update_info(data, data->fw.buf, data->fw.buf_size); + + count += snprintf(msg, sizeof(msg), + " Header - main: %x, fw: %x, test: %x, core: %x\n", + ist30xx_parse_ver(data, FLAG_MAIN, data->fw.buf), + ist30xx_parse_ver(data, FLAG_FW, data->fw.buf), + ist30xx_parse_ver(data, FLAG_TEST, data->fw.buf), + ist30xx_parse_ver(data, FLAG_CORE, data->fw.buf)); + strncat(buf, msg, sizeof(msg)); + } +#endif + + return count; +} + + +/* sysfs */ +static DEVICE_ATTR(fw_read, S_IRWXUGO, ist30xx_fw_read_show, NULL); +static DEVICE_ATTR(firmware, S_IRWXUGO, ist30xx_fw_status_show, + ist30xx_fw_store); +static DEVICE_ATTR(fw_sdcard, S_IRWXUGO, ist30xx_fw_sdcard_show, NULL); +static DEVICE_ATTR(version, S_IRWXUGO, ist30xx_fw_version_show, NULL); + +struct class *ist30xx_class; +struct device *ist30xx_fw_dev; + +static struct attribute *fw_attributes[] = { + &dev_attr_fw_read.attr, + &dev_attr_firmware.attr, + &dev_attr_fw_sdcard.attr, + &dev_attr_version.attr, + NULL, +}; + +static struct attribute_group fw_attr_group = { + .attrs = fw_attributes, +}; + +int ist30xx_init_update_sysfs(struct ist30xx_data *data) +{ + /* /sys/class/touch */ + ist30xx_class = class_create(THIS_MODULE, "touch"); + + /* /sys/class/touch/firmware */ + ist30xx_fw_dev = device_create(ist30xx_class, NULL, 0, data, "firmware"); + + /* /sys/class/touch/firmware/... */ + if (unlikely(sysfs_create_group(&ist30xx_fw_dev->kobj, &fw_attr_group))) + tsp_err("Failed to create sysfs group(%s)!\n", "firmware"); + + data->status.update = 0; + data->status.calib = 0; + data->status.update_result = 0; + + return 0; +} diff --git a/drivers/input/touchscreen/ist30xxc/ist30xxc_update.h b/drivers/input/touchscreen/ist30xxc/ist30xxc_update.h new file mode 100644 index 00000000..142106f9 --- /dev/null +++ b/drivers/input/touchscreen/ist30xxc/ist30xxc_update.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2010, Imagis Technology Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef __IST30XXC_UPDATE_H__ +#define __IST30XXC_UPDATE_H__ + +// Flash size +#define IST30XX_FLASH_BASE_ADDR (0x0) +#if (IMAGIS_TSP_IC < IMAGIS_IST3038C) +#define IST30XX_FLASH_MAIN_SIZE (0x8000) +#define IST30XX_FLASH_INFO_SIZE (0x400) +#define IST30XX_FLASH_TOTAL_SIZE (0x8400) +#else +#define IST30XX_FLASH_MAIN_SIZE (0xFC00) +#define IST30XX_FLASH_INFO_SIZE (0x0) +#define IST30XX_FLASH_TOTAL_SIZE (0xFC00) +#endif +#define IST30XX_FLASH_PAGE_SIZE (0x400) + +// Flash register +#define IST30XX_FLASH_BASE (0x40006000) +#define IST30XX_FLASH_MODE IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x00) +#define IST30XX_FLASH_ADDR IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x04) +#define IST30XX_FLASH_DIN IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x08) +#define IST30XX_FLASH_DOUT IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x0C) +#define IST30XX_FLASH_ISPEN IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x10) +#define IST30XX_FLASH_AUTO_READ IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x14) +#define IST30XX_FLASH_CRC IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x18) +#define IST30XX_FLASH_TEST_MODE1 IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x30) +#define IST30XX_FLASH_STATUS IST30XX_DA_ADDR(IST30XX_FLASH_BASE | 0x90) + +// F/W update Info +#define IST30XX_FW_NAME "ist30xxc.fw" +#define IST30XX_BIN_NAME "ist30xxc.bin" + +// Calibration +#define CALIB_WAIT_TIME (50) /* unit : 100msec */ +#define CALIB_TO_GAP(n) ((n >> 16) & 0xFFF) +#define CALIB_TO_STATUS(n) ((n >> 12) & 0xF) +#define CALIB_TO_OS_VALUE(n) ((n >> 12) & 0xFFFF) + +// Update func +#define MASK_UPDATE_INTERNAL (1) +#define MASK_UPDATE_FW (2) +#define MASK_UPDATE_SDCARD (3) +#define MASK_UPDATE_ERASE (4) + +// Version flag +#define FLAG_MAIN (1) +#define FLAG_FW (2) +#define FLAG_CORE (3) +#define FLAG_TEST (4) + +// TSP vendor (using gpio) +#define TSP_TYPE_UNKNOWN (0xF0) +#define TSP_TYPE_ALPS (0xF) +#define TSP_TYPE_EELY (0xE) +#define TSP_TYPE_TOP (0xD) +#define TSP_TYPE_MELFAS (0xC) +#define TSP_TYPE_ILJIN (0xB) +#define TSP_TYPE_SYNOPEX (0xA) +#define TSP_TYPE_SMAC (0x9) +#define TSP_TYPE_TAEYANG (0x8) +#define TSP_TYPE_TOVIS (0x7) +#define TSP_TYPE_ELK (0x6) +#define TSP_TYPE_OTHERS (0x5) +#define TSP_TYPE_NO (0x10) + +#define IST30XX_PARSE_TSPTYPE(n) ((n >> 1) & 0xF) + +int ist30xx_read_chksum(struct i2c_client *client, u32 *chksum); +int ist30xx_read_chksum_all(struct i2c_client *client, u32 *chksum); + +int ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, + const u32 size); +int ist30xx_get_tsp_info(struct ist30xx_data *data); +void ist30xx_print_info(struct ist30xx_data *data); +u32 ist30xx_parse_ver(struct ist30xx_data *data, int flag, const u8 *buf); + +int ist30xx_fw_update(struct ist30xx_data *data, const u8 *buf, int size); +int ist30xx_fw_recovery(struct ist30xx_data *data); + +int ist30xx_auto_bin_update(struct ist30xx_data *data); + +int ist30xx_calibrate(struct ist30xx_data *data, int wait_cnt); + +int ist30xx_init_update_sysfs(struct ist30xx_data *data); + +#endif // __IST30XXC_UPDATE_H__ diff --git a/drivers/input/touchscreen/ito_test/open_test_ANA1_8861A_lianchuang.h b/drivers/input/touchscreen/ito_test/open_test_ANA1_8861A_lianchuang.h new file mode 100644 index 00000000..1aa390c1 --- /dev/null +++ b/drivers/input/touchscreen/ito_test/open_test_ANA1_8861A_lianchuang.h @@ -0,0 +1,527 @@ + + + + +//MP Setting +#define IDLE_SENSOR_SH4_1 0x2CD1 +#define IDLE_SENSOR_SH4_2 0x6333 +#define IDLE_SENSOR_SH4_3 0x560D +///////////////////////////////////////////////////// +// Constant for ANA Setting +///////////////////////////////////////////////////// +#define ANA1_SET_SH4_0x00 0xFFFF +#define ANA1_SET_SH4_0x01 0x007F +#define ANA1_SET_SH4_0x02 0x001E +#define ANA1_SET_SH4_0x03 0x4800 +#define ANA1_SET_SH4_0x04 0x7FF1 +#define ANA1_SET_SH4_0x05 0xF7FF +#define ANA1_SET_SH4_0x06 0x1F1F +#define ANA1_SET_SH4_0x07 0x0610 +#define ANA1_SET_SH4_0x08 0x0000 +#define ANA1_SET_SH4_0x09 0x0000 +#define ANA1_SET_SH4_0x0A 0x0000 +#define ANA1_SET_SH4_0x0B 0x0000 +#define ANA1_SET_SH4_0x0C 0x0000 +#define ANA1_SET_SH4_0x0D 0x0000 +#define ANA1_SET_SH4_0x0E 0x0000 +#define ANA1_SET_SH4_0x0F 0x0000 +#define ANA1_SET_SH4_0x10 0x0000 +#define ANA1_SET_SH4_0x11 0x0000 +#define ANA1_SET_SH4_0x12 0x0000 +#define ANA1_SET_SH4_0x13 0x0000 +#define ANA1_SET_SH4_0x14 0x0000 +#define ANA1_SET_SH4_0x15 0x0000 +#define ANA1_SET_SH4_0x16 0x0000 +#define ANA1_SET_SH4_0x17 0x0000 +#define ANA1_SET_SH4_0x18 0x0000 +#define ANA1_SET_SH4_0x19 0x0000 +#define ANA1_SET_SH4_0x1A 0x0000 +#define ANA1_SET_SH4_0x1B 0x0000 +#define ANA1_SET_SH4_0x1C 0x0000 +#define ANA1_SET_SH4_0x1D 0x0000 +#define ANA1_SET_SH4_0x1E 0x0000 +#define ANA1_SET_SH4_0x1F 0x0000 +#define ANA1_SET_SH4_0x20 0x0000 +#define ANA1_SET_SH4_0x21 0x0000 +#define ANA1_SET_SH4_0x22 0x0000 +#define ANA1_SET_SH4_0x23 0x0000 +#define ANA1_SET_SH4_0x24 0x0000 +#define ANA1_SET_SH4_0x25 0x0002 +#define ANA1_SET_SH4_0x26 0x0000 +#define ANA1_SET_SH4_0x27 0x3E0C +#define ANA1_SET_SH4_0x28 0x3E3E +#define ANA1_SET_SH4_0x29 0x3E09 +#define ANA1_SET_SH4_0x2A 0x3E3E +#define ANA1_SET_SH4_0x2B 0x3E08 +#define ANA1_SET_SH4_0x2C 0x3E3E +#define ANA1_SET_SH4_0x2D 0x3E05 +#define ANA1_SET_SH4_0x2E 0x3E3E +#define ANA1_SET_SH4_0x2F 0x3E2B +#define ANA1_SET_SH4_0x30 0x3E3E +#define ANA1_SET_SH4_0x31 0x3E28 +#define ANA1_SET_SH4_0x32 0x3E3E +#define ANA1_SET_SH4_0x33 0x3E24 +#define ANA1_SET_SH4_0x34 0x3E3E +#define ANA1_SET_SH4_0x35 0x3E21 +#define ANA1_SET_SH4_0x36 0x3E3E +#define ANA1_SET_SH4_0x37 0x3E0E +#define ANA1_SET_SH4_0x38 0x3E3E +#define ANA1_SET_SH4_0x39 0x3E12 +#define ANA1_SET_SH4_0x3A 0x3E3E +#define ANA1_SET_SH4_0x3B 0x3E13 +#define ANA1_SET_SH4_0x3C 0x3E3E +#define ANA1_SET_SH4_0x3D 0x3E3E +#define ANA1_SET_SH4_0x3E 0x3E3E +#define ANA1_SET_SH4_0x3F 0x0000 +#define ANA1_SET_SH4_0x40 0x0000 +#define ANA1_SET_SH4_0x41 0x0000 +#define ANA1_SET_SH4_0x42 0x0000 +#define ANA1_SET_SH4_0x43 0x0000 +#define ANA1_SET_SH4_0x44 0x0000 +#define ANA1_SET_SH4_0x45 0x0000 +#define ANA1_SET_SH4_0x46 0x0000 +#define ANA1_SET_SH4_0x47 0x0000 +#define ANA1_SET_SH4_0x48 0x0000 +#define ANA1_SET_SH4_0x49 0x0000 +#define ANA1_SET_SH4_0x4A 0x0000 +#define ANA1_SET_SH4_0x4B 0x0000 +#define ANA1_SET_SH4_0x4C 0x0000 +#define ANA1_SET_SH4_0x4D 0x0000 +#define ANA1_SET_SH4_0x4E 0x0000 +#define ANA1_SET_SH4_0x4F 0x0000 +#define ANA1_SET_SH4_0x50 0x0000 +#define ANA1_SET_SH4_0x51 0x0000 +#define ANA1_SET_SH4_0x52 0x0000 +#define ANA1_SET_SH4_0x53 0x0000 +#define ANA1_SET_SH4_0x54 0x0000 +#define ANA1_SET_SH4_0x55 0x0000 +#define ANA1_SET_SH4_0x56 0x0000 +#define ANA1_SET_SH4_0x57 0x0000 +#define ANA1_SET_SH4_0x58 0x0000 +#define ANA1_SET_SH4_0x59 0x0000 +#define ANA1_SET_SH4_0x5A 0x0000 +#define ANA1_SET_SH4_0x5B 0x0000 +#define ANA1_SET_SH4_0x5C 0x0000 +#define ANA1_SET_SH4_0x5D 0x0000 +#define ANA1_SET_SH4_0x5E 0x0000 +#define ANA1_SET_SH4_0x5F 0x0000 +#define ANA1_SET_SH4_0x60 0x0000 +#define ANA1_SET_SH4_0x61 0x0000 +#define ANA1_SET_SH4_0x62 0x0000 +#define ANA1_SET_SH4_0x63 0x0000 +#define ANA1_SET_SH4_0x64 0x0000 +#define ANA1_SET_SH4_0x65 0x0000 +#define ANA1_SET_SH4_0x66 0x0000 +#define ANA1_SET_SH4_0x67 0x0000 +#define ANA1_SET_SH4_0x68 0x0000 +#define ANA1_SET_SH4_0x69 0x0000 +#define ANA1_SET_SH4_0x6A 0x0000 +#define ANA1_SET_SH4_0x6B 0x0000 +#define ANA1_SET_SH4_0x6C 0x0000 +#define ANA1_SET_SH4_0x6D 0x0000 +#define ANA1_SET_SH4_0x6E 0x0000 +#define ANA1_SET_SH4_0x6F 0x0000 +#define ANA1_SET_SH4_0x70 0x0000 +#define ANA1_SET_SH4_0x71 0x0000 +#define ANA1_SET_SH4_0x72 0x0000 +#define ANA1_SET_SH4_0x73 0x0000 +#define ANA1_SET_SH4_0x74 0x0000 +#define ANA1_SET_SH4_0x75 0x0000 +#define ANA1_SET_SH4_0x76 0x0C00 +#define ANA1_SET_SH4_0x77 0xFFFF +#define ANA1_SET_SH4_0x78 0xFFFF +#define ANA1_SET_SH4_0x79 0x3FFF +#define ANA1_SET_SH4_0x7A 0x0000 +#define ANA1_SET_SH4_0x7B 0x0000 +#define ANA1_SET_SH4_0x7C 0x0000 +#define ANA1_SET_SH4_0x7D 0x0000 +#define ANA1_SET_SH4_0x7E 0x0000 +#define ANA1_SET_SH4_0x7F 0x0000 + + + + +#define ANA2_SET_SH4_0x00 0x0048 +#define ANA2_SET_SH4_0x01 0x0000 +#define ANA2_SET_SH4_0x02 0x1111 +#define ANA2_SET_SH4_0x03 0x0011 +#define ANA2_SET_SH4_0x04 0x0002 +#define ANA2_SET_SH4_0x05 0x0001 +#define ANA2_SET_SH4_0x05_UP 0xB8A8 +#define ANA2_SET_SH4_0x06 0x0000 +#define ANA2_SET_SH4_0x07 0x0000 +#define ANA2_SET_SH4_0x08 0x0000 +#define ANA2_SET_SH4_0x09 0x0000 +#define ANA2_SET_SH4_0x0A 0x0030 +#define ANA2_SET_SH4_0x0B 0x0014 +#define ANA2_SET_SH4_0x0C 0x0000 +#define ANA2_SET_SH4_0x0D 0x0031 +#define ANA2_SET_SH4_0x0E 0x0031 +#define ANA2_SET_SH4_0x0F 0x0031 +#define ANA2_SET_SH4_0x10 0x0031 +#define ANA2_SET_SH4_0x11 0x0000 +#define ANA2_SET_SH4_0x12 0x04C0 +#define ANA2_SET_SH4_0x13 0x2102 +#define ANA2_SET_SH4_0x14 0x0003 +#define ANA2_SET_SH4_0x15 0x0013 +#define ANA2_SET_SH4_0x16 0x0015 +#define ANA2_SET_SH4_0x17 0x0015 +#define ANA2_SET_SH4_0x18 0x0015 +#define ANA2_SET_SH4_0x19 0xDCAC +#define ANA2_SET_SH4_0x1A 0x0000 +#define ANA2_SET_SH4_0x1B 0x0000 +#define ANA2_SET_SH4_0x1C 0x0000 +#define ANA2_SET_SH4_0x1D 0x1111 +#define ANA2_SET_SH4_0x1E 0x0000 +#define ANA2_SET_SH4_0x1F 0x0000 +#define ANA2_SET_SH4_0x20 0xC000 +#define ANA2_SET_SH4_0x21 0x0000 +#define ANA2_SET_SH4_0x22 0x0000 +#define ANA2_SET_SH4_0x23 0x0000 +#define ANA2_SET_SH4_0x24 0x0000 +#define ANA2_SET_SH4_0x25 0x0000 +#define ANA2_SET_SH4_0x26 0x0000 +#define ANA2_SET_SH4_0x27 0x0000 +#define ANA2_SET_SH4_0x28 0x0000 +#define ANA2_SET_SH4_0x29 0x0000 +#define ANA2_SET_SH4_0x2A 0x0000 +#define ANA2_SET_SH4_0x2B 0x0000 +#define ANA2_SET_SH4_0x2C 0x0000 +#define ANA2_SET_SH4_0x2D 0x0000 +#define ANA2_SET_SH4_0x2E 0x0000 +#define ANA2_SET_SH4_0x2F 0x0000 +#define ANA2_SET_SH4_0x30 0x0000 +#define ANA2_SET_SH4_0x31 0x0000 +#define ANA2_SET_SH4_0x32 0x0000 +#define ANA2_SET_SH4_0x33 0x0000 +#define ANA2_SET_SH4_0x34 0x0000 +#define ANA2_SET_SH4_0x35 0x0000 +#define ANA2_SET_SH4_0x36 0x0000 +#define ANA2_SET_SH4_0x37 0x0000 +#define ANA2_SET_SH4_0x38 0x0000 +#define ANA2_SET_SH4_0x39 0x0000 +#define ANA2_SET_SH4_0x3A 0x0000 +#define ANA2_SET_SH4_0x3B 0x0000 +#define ANA2_SET_SH4_0x3C 0x0000 +#define ANA2_SET_SH4_0x3D 0x0000 +#define ANA2_SET_SH4_0x3E 0x0000 +#define ANA2_SET_SH4_0x3F 0x0000 +#define ANA2_SET_SH4_0x40 0x0000 +#define ANA2_SET_SH4_0x41 0x0000 +#define ANA2_SET_SH4_0x42 0x0000 +#define ANA2_SET_SH4_0x43 0x0000 +#define ANA2_SET_SH4_0x44 0x0000 +#define ANA2_SET_SH4_0x45 0x0000 +#define ANA2_SET_SH4_0x46 0x0000 +#define ANA2_SET_SH4_0x47 0x0000 +#define ANA2_SET_SH4_0x48 0x0000 +#define ANA2_SET_SH4_0x49 0x0000 +#define ANA2_SET_SH4_0x4A 0x0000 +#define ANA2_SET_SH4_0x4B 0x0000 +#define ANA2_SET_SH4_0x4C 0x0000 +#define ANA2_SET_SH4_0x4D 0x0000 +#define ANA2_SET_SH4_0x4E 0x0000 +#define ANA2_SET_SH4_0x4F 0x0000 +#define ANA2_SET_SH4_0x50 0x0000 +#define ANA2_SET_SH4_0x51 0x0000 +#define ANA2_SET_SH4_0x52 0x0000 +#define ANA2_SET_SH4_0x53 0x0000 +#define ANA2_SET_SH4_0x54 0x0000 +#define ANA2_SET_SH4_0x55 0x0000 +#define ANA2_SET_SH4_0x56 0x0000 +#define ANA2_SET_SH4_0x57 0x0000 +#define ANA2_SET_SH4_0x58 0x0000 +#define ANA2_SET_SH4_0x59 0x0000 +#define ANA2_SET_SH4_0x5A 0x0000 +#define ANA2_SET_SH4_0x5B 0x0000 +#define ANA2_SET_SH4_0x5C 0x0000 +#define ANA2_SET_SH4_0x5D 0x0000 +#define ANA2_SET_SH4_0x5E 0x0000 +#define ANA2_SET_SH4_0x5F 0x0000 +#define ANA2_SET_SH4_0x60 0x0000 +#define ANA2_SET_SH4_0x61 0x0000 +#define ANA2_SET_SH4_0x62 0x0000 +#define ANA2_SET_SH4_0x63 0x0000 +#define ANA2_SET_SH4_0x64 0x0000 +#define ANA2_SET_SH4_0x65 0x0000 +#define ANA2_SET_SH4_0x66 0x0000 +#define ANA2_SET_SH4_0x67 0x0000 +#define ANA2_SET_SH4_0x68 0x0000 +#define ANA2_SET_SH4_0x69 0x0000 +#define ANA2_SET_SH4_0x6A 0x0000 +#define ANA2_SET_SH4_0x6B 0x0000 +#define ANA2_SET_SH4_0x6C 0x0000 +#define ANA2_SET_SH4_0x6D 0x0000 +#define ANA2_SET_SH4_0x6E 0x0000 +#define ANA2_SET_SH4_0x6F 0x0000 +#define ANA2_SET_SH4_0x70 0x0010 + + + + + + +#define NUM_SENSOR_LIANCHUANG 32 +#define NUM_KEY_LIANCHUANG 3 +#define NUM_DUMMY_LIANCHUANG 2 +#define ENABLE_2R_LIANCHUANG 1 + + +u8 MAP1_lianchuang[NUM_SENSOR_LIANCHUANG/2] = {0,3,4,7,8,11,12,15,16,19,20,23,24,27,28,31}; +u8 MAP2_lianchuang[NUM_SENSOR_LIANCHUANG/2] = {1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30}; +u8 MAP3_lianchuang[NUM_SENSOR_LIANCHUANG+NUM_DUMMY_LIANCHUANG+NUM_KEY_LIANCHUANG] = {34,7,6,5,4,3,2,1,0,32,16,17,35,18,19,20,21,22,23,24,25,26,27,28,36,29,30,31,33,15,14,13,12,11,10,9,8}; +u8 MAP40_1_lianchuang[(NUM_SENSOR_LIANCHUANG/4)-2] = {3,4,7,8,11,12}; +u8 MAP40_2_lianchuang[2] = {0,15}; +u8 MAP40_3_lianchuang[(NUM_SENSOR_LIANCHUANG/4)-2] = {19,20,23,24,27,28}; +u8 MAP40_4_lianchuang[2] = {16,31}; +u8 MAP41_1_lianchuang[(NUM_SENSOR_LIANCHUANG/4)-2] = {2,5,6,9,10,13}; +u8 MAP41_2_lianchuang[2] = {1,14}; +u8 MAP41_3_lianchuang[(NUM_SENSOR_LIANCHUANG/4)-2] = {18,21,22,25,26,29}; +u8 MAP41_4_lianchuang[2] = {17,30}; + +uint16_t open_1_lianchuang[241] = +{ + ANA1_SET_SH4_0x00, + ANA1_SET_SH4_0x01, + ANA1_SET_SH4_0x02, + ANA1_SET_SH4_0x03, + ANA1_SET_SH4_0x04, + ANA1_SET_SH4_0x05, + ANA1_SET_SH4_0x06, + ANA1_SET_SH4_0x07, + ANA1_SET_SH4_0x08, + ANA1_SET_SH4_0x09, + ANA1_SET_SH4_0x0A, + ANA1_SET_SH4_0x0B, + ANA1_SET_SH4_0x0C, + ANA1_SET_SH4_0x0D, + ANA1_SET_SH4_0x0E, + ANA1_SET_SH4_0x0F, + ANA1_SET_SH4_0x10, + ANA1_SET_SH4_0x11, + ANA1_SET_SH4_0x12, + ANA1_SET_SH4_0x13, + ANA1_SET_SH4_0x14, + ANA1_SET_SH4_0x15, + ANA1_SET_SH4_0x16, + ANA1_SET_SH4_0x17, + ANA1_SET_SH4_0x18, + ANA1_SET_SH4_0x19, + ANA1_SET_SH4_0x1A, + ANA1_SET_SH4_0x1B, + ANA1_SET_SH4_0x1C, + ANA1_SET_SH4_0x1D, + ANA1_SET_SH4_0x1E, + ANA1_SET_SH4_0x1F, + ANA1_SET_SH4_0x20, + ANA1_SET_SH4_0x21, + ANA1_SET_SH4_0x22, + ANA1_SET_SH4_0x23, + ANA1_SET_SH4_0x24, + ANA1_SET_SH4_0x25, + ANA1_SET_SH4_0x26, + ANA1_SET_SH4_0x27, + ANA1_SET_SH4_0x28, + ANA1_SET_SH4_0x29, + ANA1_SET_SH4_0x2A, + ANA1_SET_SH4_0x2B, + ANA1_SET_SH4_0x2C, + ANA1_SET_SH4_0x2D, + ANA1_SET_SH4_0x2E, + ANA1_SET_SH4_0x2F, + ANA1_SET_SH4_0x30, + ANA1_SET_SH4_0x31, + ANA1_SET_SH4_0x32, + ANA1_SET_SH4_0x33, + ANA1_SET_SH4_0x34, + ANA1_SET_SH4_0x35, + ANA1_SET_SH4_0x36, + ANA1_SET_SH4_0x37, + ANA1_SET_SH4_0x38, + ANA1_SET_SH4_0x39, + ANA1_SET_SH4_0x3A, + ANA1_SET_SH4_0x3B, + ANA1_SET_SH4_0x3C, + ANA1_SET_SH4_0x3D, + ANA1_SET_SH4_0x3E, + ANA1_SET_SH4_0x3F, + ANA1_SET_SH4_0x40, + ANA1_SET_SH4_0x41, + ANA1_SET_SH4_0x42, + ANA1_SET_SH4_0x43, + ANA1_SET_SH4_0x44, + ANA1_SET_SH4_0x45, + ANA1_SET_SH4_0x46, + ANA1_SET_SH4_0x47, + ANA1_SET_SH4_0x48, + ANA1_SET_SH4_0x49, + ANA1_SET_SH4_0x4A, + ANA1_SET_SH4_0x4B, + ANA1_SET_SH4_0x4C, + ANA1_SET_SH4_0x4D, + ANA1_SET_SH4_0x4E, + ANA1_SET_SH4_0x4F, + ANA1_SET_SH4_0x50, + ANA1_SET_SH4_0x51, + ANA1_SET_SH4_0x52, + ANA1_SET_SH4_0x53, + ANA1_SET_SH4_0x54, + ANA1_SET_SH4_0x55, + ANA1_SET_SH4_0x56, + ANA1_SET_SH4_0x57, + ANA1_SET_SH4_0x58, + ANA1_SET_SH4_0x59, + ANA1_SET_SH4_0x5A, + ANA1_SET_SH4_0x5B, + ANA1_SET_SH4_0x5C, + ANA1_SET_SH4_0x5D, + ANA1_SET_SH4_0x5E, + ANA1_SET_SH4_0x5F, + ANA1_SET_SH4_0x60, + ANA1_SET_SH4_0x61, + ANA1_SET_SH4_0x62, + ANA1_SET_SH4_0x63, + ANA1_SET_SH4_0x64, + ANA1_SET_SH4_0x65, + ANA1_SET_SH4_0x66, + ANA1_SET_SH4_0x67, + ANA1_SET_SH4_0x68, + ANA1_SET_SH4_0x69, + ANA1_SET_SH4_0x6A, + ANA1_SET_SH4_0x6B, + ANA1_SET_SH4_0x6C, + ANA1_SET_SH4_0x6D, + ANA1_SET_SH4_0x6E, + ANA1_SET_SH4_0x6F, + ANA1_SET_SH4_0x70, + ANA1_SET_SH4_0x71, + ANA1_SET_SH4_0x72, + ANA1_SET_SH4_0x73, + ANA1_SET_SH4_0x74, + ANA1_SET_SH4_0x75, + ANA1_SET_SH4_0x76, + ANA1_SET_SH4_0x77, + ANA1_SET_SH4_0x78, + ANA1_SET_SH4_0x79, + ANA1_SET_SH4_0x7A, + ANA1_SET_SH4_0x7B, + ANA1_SET_SH4_0x7C, + ANA1_SET_SH4_0x7D, + ANA1_SET_SH4_0x7E, + ANA1_SET_SH4_0x7F, +//ANA2 + ANA2_SET_SH4_0x00, + ANA2_SET_SH4_0x01, + ANA2_SET_SH4_0x02, + ANA2_SET_SH4_0x03, + ANA2_SET_SH4_0x04, + ANA2_SET_SH4_0x05, + ANA2_SET_SH4_0x06, + ANA2_SET_SH4_0x07, + ANA2_SET_SH4_0x08, + ANA2_SET_SH4_0x09, + ANA2_SET_SH4_0x0A, + ANA2_SET_SH4_0x0B, + ANA2_SET_SH4_0x0C, + ANA2_SET_SH4_0x0D, + ANA2_SET_SH4_0x0E, + ANA2_SET_SH4_0x0F, + ANA2_SET_SH4_0x10, + ANA2_SET_SH4_0x11, + ANA2_SET_SH4_0x12, + ANA2_SET_SH4_0x13, + ANA2_SET_SH4_0x14, + ANA2_SET_SH4_0x15, + ANA2_SET_SH4_0x16, + ANA2_SET_SH4_0x17, + ANA2_SET_SH4_0x18, + ANA2_SET_SH4_0x19, + ANA2_SET_SH4_0x1A, + ANA2_SET_SH4_0x1B, + ANA2_SET_SH4_0x1C, + ANA2_SET_SH4_0x1D, + ANA2_SET_SH4_0x1E, + ANA2_SET_SH4_0x1F, + ANA2_SET_SH4_0x20, + ANA2_SET_SH4_0x21, + ANA2_SET_SH4_0x22, + ANA2_SET_SH4_0x23, + ANA2_SET_SH4_0x24, + ANA2_SET_SH4_0x25, + ANA2_SET_SH4_0x26, + ANA2_SET_SH4_0x27, + ANA2_SET_SH4_0x28, + ANA2_SET_SH4_0x29, + ANA2_SET_SH4_0x2A, + ANA2_SET_SH4_0x2B, + ANA2_SET_SH4_0x2C, + ANA2_SET_SH4_0x2D, + ANA2_SET_SH4_0x2E, + ANA2_SET_SH4_0x2F, + ANA2_SET_SH4_0x30, + ANA2_SET_SH4_0x31, + ANA2_SET_SH4_0x32, + ANA2_SET_SH4_0x33, + ANA2_SET_SH4_0x34, + ANA2_SET_SH4_0x35, + ANA2_SET_SH4_0x36, + ANA2_SET_SH4_0x37, + ANA2_SET_SH4_0x38, + ANA2_SET_SH4_0x39, + ANA2_SET_SH4_0x3A, + ANA2_SET_SH4_0x3B, + ANA2_SET_SH4_0x3C, + ANA2_SET_SH4_0x3D, + ANA2_SET_SH4_0x3E, + ANA2_SET_SH4_0x3F, + ANA2_SET_SH4_0x40, + ANA2_SET_SH4_0x41, + ANA2_SET_SH4_0x42, + ANA2_SET_SH4_0x43, + ANA2_SET_SH4_0x44, + ANA2_SET_SH4_0x45, + ANA2_SET_SH4_0x46, + ANA2_SET_SH4_0x47, + ANA2_SET_SH4_0x48, + ANA2_SET_SH4_0x49, + ANA2_SET_SH4_0x4A, + ANA2_SET_SH4_0x4B, + ANA2_SET_SH4_0x4C, + ANA2_SET_SH4_0x4D, + ANA2_SET_SH4_0x4E, + ANA2_SET_SH4_0x4F, + ANA2_SET_SH4_0x50, + ANA2_SET_SH4_0x51, + ANA2_SET_SH4_0x52, + ANA2_SET_SH4_0x53, + ANA2_SET_SH4_0x54, + ANA2_SET_SH4_0x55, + ANA2_SET_SH4_0x56, + ANA2_SET_SH4_0x57, + ANA2_SET_SH4_0x58, + ANA2_SET_SH4_0x59, + ANA2_SET_SH4_0x5A, + ANA2_SET_SH4_0x5B, + ANA2_SET_SH4_0x5C, + ANA2_SET_SH4_0x5D, + ANA2_SET_SH4_0x5E, + ANA2_SET_SH4_0x5F, + ANA2_SET_SH4_0x60, + ANA2_SET_SH4_0x61, + ANA2_SET_SH4_0x62, + ANA2_SET_SH4_0x63, + ANA2_SET_SH4_0x64, + ANA2_SET_SH4_0x65, + ANA2_SET_SH4_0x66, + ANA2_SET_SH4_0x67, + ANA2_SET_SH4_0x68, + ANA2_SET_SH4_0x69, + ANA2_SET_SH4_0x6A, + ANA2_SET_SH4_0x6B, + ANA2_SET_SH4_0x6C, + ANA2_SET_SH4_0x6D, + ANA2_SET_SH4_0x6E, + ANA2_SET_SH4_0x6F, + ANA2_SET_SH4_0x70, +}; + diff --git a/drivers/input/touchscreen/ito_test/open_test_ANA1_B_8861A_lianchuang.h b/drivers/input/touchscreen/ito_test/open_test_ANA1_B_8861A_lianchuang.h new file mode 100644 index 00000000..33f38b5a --- /dev/null +++ b/drivers/input/touchscreen/ito_test/open_test_ANA1_B_8861A_lianchuang.h @@ -0,0 +1,494 @@ +#define ANA1_SET_SH4B_0x00 0xFFFF +#define ANA1_SET_SH4B_0x01 0x007F +#define ANA1_SET_SH4B_0x02 0x001E +#define ANA1_SET_SH4B_0x03 0x4800 +#define ANA1_SET_SH4B_0x04 0x7FF1 +#define ANA1_SET_SH4B_0x05 0xF7FF +#define ANA1_SET_SH4B_0x06 0x1F1F +#define ANA1_SET_SH4B_0x07 0x0610 +#define ANA1_SET_SH4B_0x08 0x0000 +#define ANA1_SET_SH4B_0x09 0x0000 +#define ANA1_SET_SH4B_0x0A 0x0000 +#define ANA1_SET_SH4B_0x0B 0x0000 +#define ANA1_SET_SH4B_0x0C 0x0000 +#define ANA1_SET_SH4B_0x0D 0x0000 +#define ANA1_SET_SH4B_0x0E 0x0000 +#define ANA1_SET_SH4B_0x0F 0x0000 +#define ANA1_SET_SH4B_0x10 0x0000 +#define ANA1_SET_SH4B_0x11 0x0000 +#define ANA1_SET_SH4B_0x12 0x0000 +#define ANA1_SET_SH4B_0x13 0x0000 +#define ANA1_SET_SH4B_0x14 0x0000 +#define ANA1_SET_SH4B_0x15 0x0000 +#define ANA1_SET_SH4B_0x16 0x0000 +#define ANA1_SET_SH4B_0x17 0x0000 +#define ANA1_SET_SH4B_0x18 0x0000 +#define ANA1_SET_SH4B_0x19 0x0000 +#define ANA1_SET_SH4B_0x1A 0x0000 +#define ANA1_SET_SH4B_0x1B 0x0000 +#define ANA1_SET_SH4B_0x1C 0x0000 +#define ANA1_SET_SH4B_0x1D 0x0000 +#define ANA1_SET_SH4B_0x1E 0x0000 +#define ANA1_SET_SH4B_0x1F 0x0000 +#define ANA1_SET_SH4B_0x20 0x0000 +#define ANA1_SET_SH4B_0x21 0x0000 +#define ANA1_SET_SH4B_0x22 0x0000 +#define ANA1_SET_SH4B_0x23 0x0000 +#define ANA1_SET_SH4B_0x24 0x0000 +#define ANA1_SET_SH4B_0x25 0x0002 +#define ANA1_SET_SH4B_0x26 0x0000 +#define ANA1_SET_SH4B_0x27 0x3E16 +#define ANA1_SET_SH4B_0x28 0x3E3E +#define ANA1_SET_SH4B_0x29 0x3E17 +#define ANA1_SET_SH4B_0x2A 0x3E3E +#define ANA1_SET_SH4B_0x2B 0x3E1A +#define ANA1_SET_SH4B_0x2C 0x3E3E +#define ANA1_SET_SH4B_0x2D 0x3E1C +#define ANA1_SET_SH4B_0x2E 0x3E3E +#define ANA1_SET_SH4B_0x2F 0x3E1F +#define ANA1_SET_SH4B_0x30 0x3E3E +#define ANA1_SET_SH4B_0x31 0x3E3E +#define ANA1_SET_SH4B_0x32 0x3E3E +#define ANA1_SET_SH4B_0x33 0x3E3E +#define ANA1_SET_SH4B_0x34 0x3E3E +#define ANA1_SET_SH4B_0x35 0x3E3E +#define ANA1_SET_SH4B_0x36 0x3E3E +#define ANA1_SET_SH4B_0x37 0x3E3E +#define ANA1_SET_SH4B_0x38 0x3E3E +#define ANA1_SET_SH4B_0x39 0x3E3E +#define ANA1_SET_SH4B_0x3A 0x3E3E +#define ANA1_SET_SH4B_0x3B 0x3E3E +#define ANA1_SET_SH4B_0x3C 0x3E3E +#define ANA1_SET_SH4B_0x3D 0x3E3E +#define ANA1_SET_SH4B_0x3E 0x3E3E +#define ANA1_SET_SH4B_0x3F 0x0000 +#define ANA1_SET_SH4B_0x40 0x0000 +#define ANA1_SET_SH4B_0x41 0x0000 +#define ANA1_SET_SH4B_0x42 0x0000 +#define ANA1_SET_SH4B_0x43 0x0000 +#define ANA1_SET_SH4B_0x44 0x0000 +#define ANA1_SET_SH4B_0x45 0x0000 +#define ANA1_SET_SH4B_0x46 0x0000 +#define ANA1_SET_SH4B_0x47 0x0000 +#define ANA1_SET_SH4B_0x48 0x0000 +#define ANA1_SET_SH4B_0x49 0x0000 +#define ANA1_SET_SH4B_0x4A 0x0000 +#define ANA1_SET_SH4B_0x4B 0x0000 +#define ANA1_SET_SH4B_0x4C 0x0000 +#define ANA1_SET_SH4B_0x4D 0x0000 +#define ANA1_SET_SH4B_0x4E 0x0000 +#define ANA1_SET_SH4B_0x4F 0x0000 +#define ANA1_SET_SH4B_0x50 0x0000 +#define ANA1_SET_SH4B_0x51 0x0000 +#define ANA1_SET_SH4B_0x52 0x0000 +#define ANA1_SET_SH4B_0x53 0x0000 +#define ANA1_SET_SH4B_0x54 0x0000 +#define ANA1_SET_SH4B_0x55 0x0000 +#define ANA1_SET_SH4B_0x56 0x0000 +#define ANA1_SET_SH4B_0x57 0x0000 +#define ANA1_SET_SH4B_0x58 0x0000 +#define ANA1_SET_SH4B_0x59 0x0000 +#define ANA1_SET_SH4B_0x5A 0x0000 +#define ANA1_SET_SH4B_0x5B 0x0000 +#define ANA1_SET_SH4B_0x5C 0x0000 +#define ANA1_SET_SH4B_0x5D 0x0000 +#define ANA1_SET_SH4B_0x5E 0x0000 +#define ANA1_SET_SH4B_0x5F 0x0000 +#define ANA1_SET_SH4B_0x60 0x0000 +#define ANA1_SET_SH4B_0x61 0x0000 +#define ANA1_SET_SH4B_0x62 0x0000 +#define ANA1_SET_SH4B_0x63 0x0000 +#define ANA1_SET_SH4B_0x64 0x0000 +#define ANA1_SET_SH4B_0x65 0x0000 +#define ANA1_SET_SH4B_0x66 0x0000 +#define ANA1_SET_SH4B_0x67 0x0000 +#define ANA1_SET_SH4B_0x68 0x0000 +#define ANA1_SET_SH4B_0x69 0x0000 +#define ANA1_SET_SH4B_0x6A 0x0000 +#define ANA1_SET_SH4B_0x6B 0x0000 +#define ANA1_SET_SH4B_0x6C 0x0000 +#define ANA1_SET_SH4B_0x6D 0x0000 +#define ANA1_SET_SH4B_0x6E 0x0000 +#define ANA1_SET_SH4B_0x6F 0x0000 +#define ANA1_SET_SH4B_0x70 0x0000 +#define ANA1_SET_SH4B_0x71 0x0000 +#define ANA1_SET_SH4B_0x72 0x0000 +#define ANA1_SET_SH4B_0x73 0x0000 +#define ANA1_SET_SH4B_0x74 0x0000 +#define ANA1_SET_SH4B_0x75 0x0000 +#define ANA1_SET_SH4B_0x76 0x0C00 +#define ANA1_SET_SH4B_0x77 0xFFFF +#define ANA1_SET_SH4B_0x78 0xFFFF +#define ANA1_SET_SH4B_0x79 0x3FFF +#define ANA1_SET_SH4B_0x7A 0x0000 +#define ANA1_SET_SH4B_0x7B 0x0000 +#define ANA1_SET_SH4B_0x7C 0x0000 +#define ANA1_SET_SH4B_0x7D 0x0000 +#define ANA1_SET_SH4B_0x7E 0x0000 +#define ANA1_SET_SH4B_0x7F 0x0000 + + + + +#define ANA2_SET_SH4B_0x00 0x0048 +#define ANA2_SET_SH4B_0x01 0x0000 +#define ANA2_SET_SH4B_0x02 0x1111 +#define ANA2_SET_SH4B_0x03 0x0011 +#define ANA2_SET_SH4B_0x04 0x0002 +#define ANA2_SET_SH4B_0x05 0x0001 +#define ANA2_SET_SH4B_0x05_UP 0xB8A8 +#define ANA2_SET_SH4B_0x06 0x0000 +#define ANA2_SET_SH4B_0x07 0x0000 +#define ANA2_SET_SH4B_0x08 0x0000 +#define ANA2_SET_SH4B_0x09 0x0000 +#define ANA2_SET_SH4B_0x0A 0x0030 +#define ANA2_SET_SH4B_0x0B 0x0008 +#define ANA2_SET_SH4B_0x0C 0x0000 +#define ANA2_SET_SH4B_0x0D 0x0031 +#define ANA2_SET_SH4B_0x0E 0x0031 +#define ANA2_SET_SH4B_0x0F 0x0031 +#define ANA2_SET_SH4B_0x10 0x0031 +#define ANA2_SET_SH4B_0x11 0x0000 +#define ANA2_SET_SH4B_0x12 0x04C0 +#define ANA2_SET_SH4B_0x13 0x2102 +#define ANA2_SET_SH4B_0x14 0x0003 +#define ANA2_SET_SH4B_0x15 0x0013 +#define ANA2_SET_SH4B_0x16 0x0015 +#define ANA2_SET_SH4B_0x17 0x0015 +#define ANA2_SET_SH4B_0x18 0x0015 +#define ANA2_SET_SH4B_0x19 0xDCAC +#define ANA2_SET_SH4B_0x1A 0x0000 +#define ANA2_SET_SH4B_0x1B 0x0000 +#define ANA2_SET_SH4B_0x1C 0x0000 +#define ANA2_SET_SH4B_0x1D 0x1111 +#define ANA2_SET_SH4B_0x1E 0x0000 +#define ANA2_SET_SH4B_0x1F 0x0000 +#define ANA2_SET_SH4B_0x20 0xC000 +#define ANA2_SET_SH4B_0x21 0x0000 +#define ANA2_SET_SH4B_0x22 0x0000 +#define ANA2_SET_SH4B_0x23 0x0000 +#define ANA2_SET_SH4B_0x24 0x0000 +#define ANA2_SET_SH4B_0x25 0x0000 +#define ANA2_SET_SH4B_0x26 0x0000 +#define ANA2_SET_SH4B_0x27 0x0000 +#define ANA2_SET_SH4B_0x28 0x0000 +#define ANA2_SET_SH4B_0x29 0x0000 +#define ANA2_SET_SH4B_0x2A 0x0000 +#define ANA2_SET_SH4B_0x2B 0x0000 +#define ANA2_SET_SH4B_0x2C 0x0000 +#define ANA2_SET_SH4B_0x2D 0x0000 +#define ANA2_SET_SH4B_0x2E 0x0000 +#define ANA2_SET_SH4B_0x2F 0x0000 +#define ANA2_SET_SH4B_0x30 0x0000 +#define ANA2_SET_SH4B_0x31 0x0000 +#define ANA2_SET_SH4B_0x32 0x0000 +#define ANA2_SET_SH4B_0x33 0x0000 +#define ANA2_SET_SH4B_0x34 0x0000 +#define ANA2_SET_SH4B_0x35 0x0000 +#define ANA2_SET_SH4B_0x36 0x0000 +#define ANA2_SET_SH4B_0x37 0x0000 +#define ANA2_SET_SH4B_0x38 0x0000 +#define ANA2_SET_SH4B_0x39 0x0000 +#define ANA2_SET_SH4B_0x3A 0x0000 +#define ANA2_SET_SH4B_0x3B 0x0000 +#define ANA2_SET_SH4B_0x3C 0x0000 +#define ANA2_SET_SH4B_0x3D 0x0000 +#define ANA2_SET_SH4B_0x3E 0x0000 +#define ANA2_SET_SH4B_0x3F 0x0000 +#define ANA2_SET_SH4B_0x40 0x0000 +#define ANA2_SET_SH4B_0x41 0x0000 +#define ANA2_SET_SH4B_0x42 0x0000 +#define ANA2_SET_SH4B_0x43 0x0000 +#define ANA2_SET_SH4B_0x44 0x0000 +#define ANA2_SET_SH4B_0x45 0x0000 +#define ANA2_SET_SH4B_0x46 0x0000 +#define ANA2_SET_SH4B_0x47 0x0000 +#define ANA2_SET_SH4B_0x48 0x0000 +#define ANA2_SET_SH4B_0x49 0x0000 +#define ANA2_SET_SH4B_0x4A 0x0000 +#define ANA2_SET_SH4B_0x4B 0x0000 +#define ANA2_SET_SH4B_0x4C 0x0000 +#define ANA2_SET_SH4B_0x4D 0x0000 +#define ANA2_SET_SH4B_0x4E 0x0000 +#define ANA2_SET_SH4B_0x4F 0x0000 +#define ANA2_SET_SH4B_0x50 0x0000 +#define ANA2_SET_SH4B_0x51 0x0000 +#define ANA2_SET_SH4B_0x52 0x0000 +#define ANA2_SET_SH4B_0x53 0x0000 +#define ANA2_SET_SH4B_0x54 0x0000 +#define ANA2_SET_SH4B_0x55 0x0000 +#define ANA2_SET_SH4B_0x56 0x0000 +#define ANA2_SET_SH4B_0x57 0x0000 +#define ANA2_SET_SH4B_0x58 0x0000 +#define ANA2_SET_SH4B_0x59 0x0000 +#define ANA2_SET_SH4B_0x5A 0x0000 +#define ANA2_SET_SH4B_0x5B 0x0000 +#define ANA2_SET_SH4B_0x5C 0x0000 +#define ANA2_SET_SH4B_0x5D 0x0000 +#define ANA2_SET_SH4B_0x5E 0x0000 +#define ANA2_SET_SH4B_0x5F 0x0000 +#define ANA2_SET_SH4B_0x60 0x0000 +#define ANA2_SET_SH4B_0x61 0x0000 +#define ANA2_SET_SH4B_0x62 0x0000 +#define ANA2_SET_SH4B_0x63 0x0000 +#define ANA2_SET_SH4B_0x64 0x0000 +#define ANA2_SET_SH4B_0x65 0x0000 +#define ANA2_SET_SH4B_0x66 0x0000 +#define ANA2_SET_SH4B_0x67 0x0000 +#define ANA2_SET_SH4B_0x68 0x0000 +#define ANA2_SET_SH4B_0x69 0x0000 +#define ANA2_SET_SH4B_0x6A 0x0000 +#define ANA2_SET_SH4B_0x6B 0x0000 +#define ANA2_SET_SH4B_0x6C 0x0000 +#define ANA2_SET_SH4B_0x6D 0x0000 +#define ANA2_SET_SH4B_0x6E 0x0000 +#define ANA2_SET_SH4B_0x6F 0x0000 +#define ANA2_SET_SH4B_0x70 0x0010 + +uint16_t open_1B_lianchuang[241] = +{ + ANA1_SET_SH4B_0x00, + ANA1_SET_SH4B_0x01, + ANA1_SET_SH4B_0x02, + ANA1_SET_SH4B_0x03, + ANA1_SET_SH4B_0x04, + ANA1_SET_SH4B_0x05, + ANA1_SET_SH4B_0x06, + ANA1_SET_SH4B_0x07, + ANA1_SET_SH4B_0x08, + ANA1_SET_SH4B_0x09, + ANA1_SET_SH4B_0x0A, + ANA1_SET_SH4B_0x0B, + ANA1_SET_SH4B_0x0C, + ANA1_SET_SH4B_0x0D, + ANA1_SET_SH4B_0x0E, + ANA1_SET_SH4B_0x0F, + ANA1_SET_SH4B_0x10, + ANA1_SET_SH4B_0x11, + ANA1_SET_SH4B_0x12, + ANA1_SET_SH4B_0x13, + ANA1_SET_SH4B_0x14, + ANA1_SET_SH4B_0x15, + ANA1_SET_SH4B_0x16, + ANA1_SET_SH4B_0x17, + ANA1_SET_SH4B_0x18, + ANA1_SET_SH4B_0x19, + ANA1_SET_SH4B_0x1A, + ANA1_SET_SH4B_0x1B, + ANA1_SET_SH4B_0x1C, + ANA1_SET_SH4B_0x1D, + ANA1_SET_SH4B_0x1E, + ANA1_SET_SH4B_0x1F, + ANA1_SET_SH4B_0x20, + ANA1_SET_SH4B_0x21, + ANA1_SET_SH4B_0x22, + ANA1_SET_SH4B_0x23, + ANA1_SET_SH4B_0x24, + ANA1_SET_SH4B_0x25, + ANA1_SET_SH4B_0x26, + ANA1_SET_SH4B_0x27, + ANA1_SET_SH4B_0x28, + ANA1_SET_SH4B_0x29, + ANA1_SET_SH4B_0x2A, + ANA1_SET_SH4B_0x2B, + ANA1_SET_SH4B_0x2C, + ANA1_SET_SH4B_0x2D, + ANA1_SET_SH4B_0x2E, + ANA1_SET_SH4B_0x2F, + ANA1_SET_SH4B_0x30, + ANA1_SET_SH4B_0x31, + ANA1_SET_SH4B_0x32, + ANA1_SET_SH4B_0x33, + ANA1_SET_SH4B_0x34, + ANA1_SET_SH4B_0x35, + ANA1_SET_SH4B_0x36, + ANA1_SET_SH4B_0x37, + ANA1_SET_SH4B_0x38, + ANA1_SET_SH4B_0x39, + ANA1_SET_SH4B_0x3A, + ANA1_SET_SH4B_0x3B, + ANA1_SET_SH4B_0x3C, + ANA1_SET_SH4B_0x3D, + ANA1_SET_SH4B_0x3E, + ANA1_SET_SH4B_0x3F, + ANA1_SET_SH4B_0x40, + ANA1_SET_SH4B_0x41, + ANA1_SET_SH4B_0x42, + ANA1_SET_SH4B_0x43, + ANA1_SET_SH4B_0x44, + ANA1_SET_SH4B_0x45, + ANA1_SET_SH4B_0x46, + ANA1_SET_SH4B_0x47, + ANA1_SET_SH4B_0x48, + ANA1_SET_SH4B_0x49, + ANA1_SET_SH4B_0x4A, + ANA1_SET_SH4B_0x4B, + ANA1_SET_SH4B_0x4C, + ANA1_SET_SH4B_0x4D, + ANA1_SET_SH4B_0x4E, + ANA1_SET_SH4B_0x4F, + ANA1_SET_SH4B_0x50, + ANA1_SET_SH4B_0x51, + ANA1_SET_SH4B_0x52, + ANA1_SET_SH4B_0x53, + ANA1_SET_SH4B_0x54, + ANA1_SET_SH4B_0x55, + ANA1_SET_SH4B_0x56, + ANA1_SET_SH4B_0x57, + ANA1_SET_SH4B_0x58, + ANA1_SET_SH4B_0x59, + ANA1_SET_SH4B_0x5A, + ANA1_SET_SH4B_0x5B, + ANA1_SET_SH4B_0x5C, + ANA1_SET_SH4B_0x5D, + ANA1_SET_SH4B_0x5E, + ANA1_SET_SH4B_0x5F, + ANA1_SET_SH4B_0x60, + ANA1_SET_SH4B_0x61, + ANA1_SET_SH4B_0x62, + ANA1_SET_SH4B_0x63, + ANA1_SET_SH4B_0x64, + ANA1_SET_SH4B_0x65, + ANA1_SET_SH4B_0x66, + ANA1_SET_SH4B_0x67, + ANA1_SET_SH4B_0x68, + ANA1_SET_SH4B_0x69, + ANA1_SET_SH4B_0x6A, + ANA1_SET_SH4B_0x6B, + ANA1_SET_SH4B_0x6C, + ANA1_SET_SH4B_0x6D, + ANA1_SET_SH4B_0x6E, + ANA1_SET_SH4B_0x6F, + ANA1_SET_SH4B_0x70, + ANA1_SET_SH4B_0x71, + ANA1_SET_SH4B_0x72, + ANA1_SET_SH4B_0x73, + ANA1_SET_SH4B_0x74, + ANA1_SET_SH4B_0x75, + ANA1_SET_SH4B_0x76, + ANA1_SET_SH4B_0x77, + ANA1_SET_SH4B_0x78, + ANA1_SET_SH4B_0x79, + ANA1_SET_SH4B_0x7A, + ANA1_SET_SH4B_0x7B, + ANA1_SET_SH4B_0x7C, + ANA1_SET_SH4B_0x7D, + ANA1_SET_SH4B_0x7E, + ANA1_SET_SH4B_0x7F, +//ANA2 + ANA2_SET_SH4B_0x00, + ANA2_SET_SH4B_0x01, + ANA2_SET_SH4B_0x02, + ANA2_SET_SH4B_0x03, + ANA2_SET_SH4B_0x04, + ANA2_SET_SH4B_0x05, + ANA2_SET_SH4B_0x06, + ANA2_SET_SH4B_0x07, + ANA2_SET_SH4B_0x08, + ANA2_SET_SH4B_0x09, + ANA2_SET_SH4B_0x0A, + ANA2_SET_SH4B_0x0B, + ANA2_SET_SH4B_0x0C, + ANA2_SET_SH4B_0x0D, + ANA2_SET_SH4B_0x0E, + ANA2_SET_SH4B_0x0F, + ANA2_SET_SH4B_0x10, + ANA2_SET_SH4B_0x11, + ANA2_SET_SH4B_0x12, + ANA2_SET_SH4B_0x13, + ANA2_SET_SH4B_0x14, + ANA2_SET_SH4B_0x15, + ANA2_SET_SH4B_0x16, + ANA2_SET_SH4B_0x17, + ANA2_SET_SH4B_0x18, + ANA2_SET_SH4B_0x19, + ANA2_SET_SH4B_0x1A, + ANA2_SET_SH4B_0x1B, + ANA2_SET_SH4B_0x1C, + ANA2_SET_SH4B_0x1D, + ANA2_SET_SH4B_0x1E, + ANA2_SET_SH4B_0x1F, + ANA2_SET_SH4B_0x20, + ANA2_SET_SH4B_0x21, + ANA2_SET_SH4B_0x22, + ANA2_SET_SH4B_0x23, + ANA2_SET_SH4B_0x24, + ANA2_SET_SH4B_0x25, + ANA2_SET_SH4B_0x26, + ANA2_SET_SH4B_0x27, + ANA2_SET_SH4B_0x28, + ANA2_SET_SH4B_0x29, + ANA2_SET_SH4B_0x2A, + ANA2_SET_SH4B_0x2B, + ANA2_SET_SH4B_0x2C, + ANA2_SET_SH4B_0x2D, + ANA2_SET_SH4B_0x2E, + ANA2_SET_SH4B_0x2F, + ANA2_SET_SH4B_0x30, + ANA2_SET_SH4B_0x31, + ANA2_SET_SH4B_0x32, + ANA2_SET_SH4B_0x33, + ANA2_SET_SH4B_0x34, + ANA2_SET_SH4B_0x35, + ANA2_SET_SH4B_0x36, + ANA2_SET_SH4B_0x37, + ANA2_SET_SH4B_0x38, + ANA2_SET_SH4B_0x39, + ANA2_SET_SH4B_0x3A, + ANA2_SET_SH4B_0x3B, + ANA2_SET_SH4B_0x3C, + ANA2_SET_SH4B_0x3D, + ANA2_SET_SH4B_0x3E, + ANA2_SET_SH4B_0x3F, + ANA2_SET_SH4B_0x40, + ANA2_SET_SH4B_0x41, + ANA2_SET_SH4B_0x42, + ANA2_SET_SH4B_0x43, + ANA2_SET_SH4B_0x44, + ANA2_SET_SH4B_0x45, + ANA2_SET_SH4B_0x46, + ANA2_SET_SH4B_0x47, + ANA2_SET_SH4B_0x48, + ANA2_SET_SH4B_0x49, + ANA2_SET_SH4B_0x4A, + ANA2_SET_SH4B_0x4B, + ANA2_SET_SH4B_0x4C, + ANA2_SET_SH4B_0x4D, + ANA2_SET_SH4B_0x4E, + ANA2_SET_SH4B_0x4F, + ANA2_SET_SH4B_0x50, + ANA2_SET_SH4B_0x51, + ANA2_SET_SH4B_0x52, + ANA2_SET_SH4B_0x53, + ANA2_SET_SH4B_0x54, + ANA2_SET_SH4B_0x55, + ANA2_SET_SH4B_0x56, + ANA2_SET_SH4B_0x57, + ANA2_SET_SH4B_0x58, + ANA2_SET_SH4B_0x59, + ANA2_SET_SH4B_0x5A, + ANA2_SET_SH4B_0x5B, + ANA2_SET_SH4B_0x5C, + ANA2_SET_SH4B_0x5D, + ANA2_SET_SH4B_0x5E, + ANA2_SET_SH4B_0x5F, + ANA2_SET_SH4B_0x60, + ANA2_SET_SH4B_0x61, + ANA2_SET_SH4B_0x62, + ANA2_SET_SH4B_0x63, + ANA2_SET_SH4B_0x64, + ANA2_SET_SH4B_0x65, + ANA2_SET_SH4B_0x66, + ANA2_SET_SH4B_0x67, + ANA2_SET_SH4B_0x68, + ANA2_SET_SH4B_0x69, + ANA2_SET_SH4B_0x6A, + ANA2_SET_SH4B_0x6B, + ANA2_SET_SH4B_0x6C, + ANA2_SET_SH4B_0x6D, + ANA2_SET_SH4B_0x6E, + ANA2_SET_SH4B_0x6F, + ANA2_SET_SH4B_0x70, +}; + + diff --git a/drivers/input/touchscreen/ito_test/open_test_ANA2_8861A_lianchuang.h b/drivers/input/touchscreen/ito_test/open_test_ANA2_8861A_lianchuang.h new file mode 100644 index 00000000..aaccf1f5 --- /dev/null +++ b/drivers/input/touchscreen/ito_test/open_test_ANA2_8861A_lianchuang.h @@ -0,0 +1,506 @@ + + + + +//MP Setting +#define IDLE_SENSOR_SH5_1 0x7331 +#define IDLE_SENSOR_SH5_2 0x94CC +#define IDLE_SENSOR_SH5_3 0x5913 +///////////////////////////////////////////////////// +// Constant for ANA Setting +///////////////////////////////////////////////////// +#define ANA1_SET_SH5_0x00 0xFFFF +#define ANA1_SET_SH5_0x01 0x007F +#define ANA1_SET_SH5_0x02 0x001E +#define ANA1_SET_SH5_0x03 0x4800 +#define ANA1_SET_SH5_0x04 0x7FF1 +#define ANA1_SET_SH5_0x05 0xF7FF +#define ANA1_SET_SH5_0x06 0x1F1F +#define ANA1_SET_SH5_0x07 0x0610 +#define ANA1_SET_SH5_0x08 0x0000 +#define ANA1_SET_SH5_0x09 0x0000 +#define ANA1_SET_SH5_0x0A 0x0000 +#define ANA1_SET_SH5_0x0B 0x0000 +#define ANA1_SET_SH5_0x0C 0x0000 +#define ANA1_SET_SH5_0x0D 0x0000 +#define ANA1_SET_SH5_0x0E 0x0000 +#define ANA1_SET_SH5_0x0F 0x0000 +#define ANA1_SET_SH5_0x10 0x0000 +#define ANA1_SET_SH5_0x11 0x0000 +#define ANA1_SET_SH5_0x12 0x0000 +#define ANA1_SET_SH5_0x13 0x0000 +#define ANA1_SET_SH5_0x14 0x0000 +#define ANA1_SET_SH5_0x15 0x0000 +#define ANA1_SET_SH5_0x16 0x0000 +#define ANA1_SET_SH5_0x17 0x0000 +#define ANA1_SET_SH5_0x18 0x0000 +#define ANA1_SET_SH5_0x19 0x0000 +#define ANA1_SET_SH5_0x1A 0x0000 +#define ANA1_SET_SH5_0x1B 0x0000 +#define ANA1_SET_SH5_0x1C 0x0000 +#define ANA1_SET_SH5_0x1D 0x0000 +#define ANA1_SET_SH5_0x1E 0x0000 +#define ANA1_SET_SH5_0x1F 0x0000 +#define ANA1_SET_SH5_0x20 0x0000 +#define ANA1_SET_SH5_0x21 0x0000 +#define ANA1_SET_SH5_0x22 0x0000 +#define ANA1_SET_SH5_0x23 0x0000 +#define ANA1_SET_SH5_0x24 0x0000 +#define ANA1_SET_SH5_0x25 0x0002 +#define ANA1_SET_SH5_0x26 0x0000 +#define ANA1_SET_SH5_0x27 0x3E0B +#define ANA1_SET_SH5_0x28 0x3E3E +#define ANA1_SET_SH5_0x29 0x3E0A +#define ANA1_SET_SH5_0x2A 0x3E3E +#define ANA1_SET_SH5_0x2B 0x3E07 +#define ANA1_SET_SH5_0x2C 0x3E3E +#define ANA1_SET_SH5_0x2D 0x3E06 +#define ANA1_SET_SH5_0x2E 0x3E3E +#define ANA1_SET_SH5_0x2F 0x3E2A +#define ANA1_SET_SH5_0x30 0x3E3E +#define ANA1_SET_SH5_0x31 0x3E29 +#define ANA1_SET_SH5_0x32 0x3E3E +#define ANA1_SET_SH5_0x33 0x3E23 +#define ANA1_SET_SH5_0x34 0x3E3E +#define ANA1_SET_SH5_0x35 0x3E22 +#define ANA1_SET_SH5_0x36 0x3E3E +#define ANA1_SET_SH5_0x37 0x3E10 +#define ANA1_SET_SH5_0x38 0x3E3E +#define ANA1_SET_SH5_0x39 0x3E11 +#define ANA1_SET_SH5_0x3A 0x3E3E +#define ANA1_SET_SH5_0x3B 0x3E14 +#define ANA1_SET_SH5_0x3C 0x3E3E +#define ANA1_SET_SH5_0x3D 0x3E3E +#define ANA1_SET_SH5_0x3E 0x3E3E +#define ANA1_SET_SH5_0x3F 0x0000 +#define ANA1_SET_SH5_0x40 0x0000 +#define ANA1_SET_SH5_0x41 0x0000 +#define ANA1_SET_SH5_0x42 0x0000 +#define ANA1_SET_SH5_0x43 0x0000 +#define ANA1_SET_SH5_0x44 0x0000 +#define ANA1_SET_SH5_0x45 0x0000 +#define ANA1_SET_SH5_0x46 0x0000 +#define ANA1_SET_SH5_0x47 0x0000 +#define ANA1_SET_SH5_0x48 0x0000 +#define ANA1_SET_SH5_0x49 0x0000 +#define ANA1_SET_SH5_0x4A 0x0000 +#define ANA1_SET_SH5_0x4B 0x0000 +#define ANA1_SET_SH5_0x4C 0x0000 +#define ANA1_SET_SH5_0x4D 0x0000 +#define ANA1_SET_SH5_0x4E 0x0000 +#define ANA1_SET_SH5_0x4F 0x0000 +#define ANA1_SET_SH5_0x50 0x0000 +#define ANA1_SET_SH5_0x51 0x0000 +#define ANA1_SET_SH5_0x52 0x0000 +#define ANA1_SET_SH5_0x53 0x0000 +#define ANA1_SET_SH5_0x54 0x0000 +#define ANA1_SET_SH5_0x55 0x0000 +#define ANA1_SET_SH5_0x56 0x0000 +#define ANA1_SET_SH5_0x57 0x0000 +#define ANA1_SET_SH5_0x58 0x0000 +#define ANA1_SET_SH5_0x59 0x0000 +#define ANA1_SET_SH5_0x5A 0x0000 +#define ANA1_SET_SH5_0x5B 0x0000 +#define ANA1_SET_SH5_0x5C 0x0000 +#define ANA1_SET_SH5_0x5D 0x0000 +#define ANA1_SET_SH5_0x5E 0x0000 +#define ANA1_SET_SH5_0x5F 0x0000 +#define ANA1_SET_SH5_0x60 0x0000 +#define ANA1_SET_SH5_0x61 0x0000 +#define ANA1_SET_SH5_0x62 0x0000 +#define ANA1_SET_SH5_0x63 0x0000 +#define ANA1_SET_SH5_0x64 0x0000 +#define ANA1_SET_SH5_0x65 0x0000 +#define ANA1_SET_SH5_0x66 0x0000 +#define ANA1_SET_SH5_0x67 0x0000 +#define ANA1_SET_SH5_0x68 0x0000 +#define ANA1_SET_SH5_0x69 0x0000 +#define ANA1_SET_SH5_0x6A 0x0000 +#define ANA1_SET_SH5_0x6B 0x0000 +#define ANA1_SET_SH5_0x6C 0x0000 +#define ANA1_SET_SH5_0x6D 0x0000 +#define ANA1_SET_SH5_0x6E 0x0000 +#define ANA1_SET_SH5_0x6F 0x0000 +#define ANA1_SET_SH5_0x70 0x0000 +#define ANA1_SET_SH5_0x71 0x0000 +#define ANA1_SET_SH5_0x72 0x0000 +#define ANA1_SET_SH5_0x73 0x0000 +#define ANA1_SET_SH5_0x74 0x0000 +#define ANA1_SET_SH5_0x75 0x0000 +#define ANA1_SET_SH5_0x76 0x0C00 +#define ANA1_SET_SH5_0x77 0xFFFF +#define ANA1_SET_SH5_0x78 0xFFFF +#define ANA1_SET_SH5_0x79 0x3FFF +#define ANA1_SET_SH5_0x7A 0x0000 +#define ANA1_SET_SH5_0x7B 0x0000 +#define ANA1_SET_SH5_0x7C 0x0000 +#define ANA1_SET_SH5_0x7D 0x0000 +#define ANA1_SET_SH5_0x7E 0x0000 +#define ANA1_SET_SH5_0x7F 0x0000 + + + + +#define ANA2_SET_SH5_0x00 0x0048 +#define ANA2_SET_SH5_0x01 0x0000 +#define ANA2_SET_SH5_0x02 0x1111 +#define ANA2_SET_SH5_0x03 0x0011 +#define ANA2_SET_SH5_0x04 0x0002 +#define ANA2_SET_SH5_0x05 0x0001 +#define ANA2_SET_SH5_0x05_UP 0xB8A8 +#define ANA2_SET_SH5_0x06 0x0000 +#define ANA2_SET_SH5_0x07 0x0000 +#define ANA2_SET_SH5_0x08 0x0000 +#define ANA2_SET_SH5_0x09 0x0000 +#define ANA2_SET_SH5_0x0A 0x0030 +#define ANA2_SET_SH5_0x0B 0x0014 +#define ANA2_SET_SH5_0x0C 0x0000 +#define ANA2_SET_SH5_0x0D 0x0031 +#define ANA2_SET_SH5_0x0E 0x0031 +#define ANA2_SET_SH5_0x0F 0x0031 +#define ANA2_SET_SH5_0x10 0x0031 +#define ANA2_SET_SH5_0x11 0x0000 +#define ANA2_SET_SH5_0x12 0x04C0 +#define ANA2_SET_SH5_0x13 0x2102 +#define ANA2_SET_SH5_0x14 0x0003 +#define ANA2_SET_SH5_0x15 0x0013 +#define ANA2_SET_SH5_0x16 0x0015 +#define ANA2_SET_SH5_0x17 0x0015 +#define ANA2_SET_SH5_0x18 0x0015 +#define ANA2_SET_SH5_0x19 0xDCAC +#define ANA2_SET_SH5_0x1A 0x0000 +#define ANA2_SET_SH5_0x1B 0x0000 +#define ANA2_SET_SH5_0x1C 0x0000 +#define ANA2_SET_SH5_0x1D 0x1111 +#define ANA2_SET_SH5_0x1E 0x0000 +#define ANA2_SET_SH5_0x1F 0x0000 +#define ANA2_SET_SH5_0x20 0xC000 +#define ANA2_SET_SH5_0x21 0x0000 +#define ANA2_SET_SH5_0x22 0x0000 +#define ANA2_SET_SH5_0x23 0x0000 +#define ANA2_SET_SH5_0x24 0x0000 +#define ANA2_SET_SH5_0x25 0x0000 +#define ANA2_SET_SH5_0x26 0x0000 +#define ANA2_SET_SH5_0x27 0x0000 +#define ANA2_SET_SH5_0x28 0x0000 +#define ANA2_SET_SH5_0x29 0x0000 +#define ANA2_SET_SH5_0x2A 0x0000 +#define ANA2_SET_SH5_0x2B 0x0000 +#define ANA2_SET_SH5_0x2C 0x0000 +#define ANA2_SET_SH5_0x2D 0x0000 +#define ANA2_SET_SH5_0x2E 0x0000 +#define ANA2_SET_SH5_0x2F 0x0000 +#define ANA2_SET_SH5_0x30 0x0000 +#define ANA2_SET_SH5_0x31 0x0000 +#define ANA2_SET_SH5_0x32 0x0000 +#define ANA2_SET_SH5_0x33 0x0000 +#define ANA2_SET_SH5_0x34 0x0000 +#define ANA2_SET_SH5_0x35 0x0000 +#define ANA2_SET_SH5_0x36 0x0000 +#define ANA2_SET_SH5_0x37 0x0000 +#define ANA2_SET_SH5_0x38 0x0000 +#define ANA2_SET_SH5_0x39 0x0000 +#define ANA2_SET_SH5_0x3A 0x0000 +#define ANA2_SET_SH5_0x3B 0x0000 +#define ANA2_SET_SH5_0x3C 0x0000 +#define ANA2_SET_SH5_0x3D 0x0000 +#define ANA2_SET_SH5_0x3E 0x0000 +#define ANA2_SET_SH5_0x3F 0x0000 +#define ANA2_SET_SH5_0x40 0x0000 +#define ANA2_SET_SH5_0x41 0x0000 +#define ANA2_SET_SH5_0x42 0x0000 +#define ANA2_SET_SH5_0x43 0x0000 +#define ANA2_SET_SH5_0x44 0x0000 +#define ANA2_SET_SH5_0x45 0x0000 +#define ANA2_SET_SH5_0x46 0x0000 +#define ANA2_SET_SH5_0x47 0x0000 +#define ANA2_SET_SH5_0x48 0x0000 +#define ANA2_SET_SH5_0x49 0x0000 +#define ANA2_SET_SH5_0x4A 0x0000 +#define ANA2_SET_SH5_0x4B 0x0000 +#define ANA2_SET_SH5_0x4C 0x0000 +#define ANA2_SET_SH5_0x4D 0x0000 +#define ANA2_SET_SH5_0x4E 0x0000 +#define ANA2_SET_SH5_0x4F 0x0000 +#define ANA2_SET_SH5_0x50 0x0000 +#define ANA2_SET_SH5_0x51 0x0000 +#define ANA2_SET_SH5_0x52 0x0000 +#define ANA2_SET_SH5_0x53 0x0000 +#define ANA2_SET_SH5_0x54 0x0000 +#define ANA2_SET_SH5_0x55 0x0000 +#define ANA2_SET_SH5_0x56 0x0000 +#define ANA2_SET_SH5_0x57 0x0000 +#define ANA2_SET_SH5_0x58 0x0000 +#define ANA2_SET_SH5_0x59 0x0000 +#define ANA2_SET_SH5_0x5A 0x0000 +#define ANA2_SET_SH5_0x5B 0x0000 +#define ANA2_SET_SH5_0x5C 0x0000 +#define ANA2_SET_SH5_0x5D 0x0000 +#define ANA2_SET_SH5_0x5E 0x0000 +#define ANA2_SET_SH5_0x5F 0x0000 +#define ANA2_SET_SH5_0x60 0x0000 +#define ANA2_SET_SH5_0x61 0x0000 +#define ANA2_SET_SH5_0x62 0x0000 +#define ANA2_SET_SH5_0x63 0x0000 +#define ANA2_SET_SH5_0x64 0x0000 +#define ANA2_SET_SH5_0x65 0x0000 +#define ANA2_SET_SH5_0x66 0x0000 +#define ANA2_SET_SH5_0x67 0x0000 +#define ANA2_SET_SH5_0x68 0x0000 +#define ANA2_SET_SH5_0x69 0x0000 +#define ANA2_SET_SH5_0x6A 0x0000 +#define ANA2_SET_SH5_0x6B 0x0000 +#define ANA2_SET_SH5_0x6C 0x0000 +#define ANA2_SET_SH5_0x6D 0x0000 +#define ANA2_SET_SH5_0x6E 0x0000 +#define ANA2_SET_SH5_0x6F 0x0000 +#define ANA2_SET_SH5_0x70 0x0010 + +uint16_t open_2_lianchuang[241] = +{ + ANA1_SET_SH5_0x00, + ANA1_SET_SH5_0x01, + ANA1_SET_SH5_0x02, + ANA1_SET_SH5_0x03, + ANA1_SET_SH5_0x04, + ANA1_SET_SH5_0x05, + ANA1_SET_SH5_0x06, + ANA1_SET_SH5_0x07, + ANA1_SET_SH5_0x08, + ANA1_SET_SH5_0x09, + ANA1_SET_SH5_0x0A, + ANA1_SET_SH5_0x0B, + ANA1_SET_SH5_0x0C, + ANA1_SET_SH5_0x0D, + ANA1_SET_SH5_0x0E, + ANA1_SET_SH5_0x0F, + ANA1_SET_SH5_0x10, + ANA1_SET_SH5_0x11, + ANA1_SET_SH5_0x12, + ANA1_SET_SH5_0x13, + ANA1_SET_SH5_0x14, + ANA1_SET_SH5_0x15, + ANA1_SET_SH5_0x16, + ANA1_SET_SH5_0x17, + ANA1_SET_SH5_0x18, + ANA1_SET_SH5_0x19, + ANA1_SET_SH5_0x1A, + ANA1_SET_SH5_0x1B, + ANA1_SET_SH5_0x1C, + ANA1_SET_SH5_0x1D, + ANA1_SET_SH5_0x1E, + ANA1_SET_SH5_0x1F, + ANA1_SET_SH5_0x20, + ANA1_SET_SH5_0x21, + ANA1_SET_SH5_0x22, + ANA1_SET_SH5_0x23, + ANA1_SET_SH5_0x24, + ANA1_SET_SH5_0x25, + ANA1_SET_SH5_0x26, + ANA1_SET_SH5_0x27, + ANA1_SET_SH5_0x28, + ANA1_SET_SH5_0x29, + ANA1_SET_SH5_0x2A, + ANA1_SET_SH5_0x2B, + ANA1_SET_SH5_0x2C, + ANA1_SET_SH5_0x2D, + ANA1_SET_SH5_0x2E, + ANA1_SET_SH5_0x2F, + ANA1_SET_SH5_0x30, + ANA1_SET_SH5_0x31, + ANA1_SET_SH5_0x32, + ANA1_SET_SH5_0x33, + ANA1_SET_SH5_0x34, + ANA1_SET_SH5_0x35, + ANA1_SET_SH5_0x36, + ANA1_SET_SH5_0x37, + ANA1_SET_SH5_0x38, + ANA1_SET_SH5_0x39, + ANA1_SET_SH5_0x3A, + ANA1_SET_SH5_0x3B, + ANA1_SET_SH5_0x3C, + ANA1_SET_SH5_0x3D, + ANA1_SET_SH5_0x3E, + ANA1_SET_SH5_0x3F, + ANA1_SET_SH5_0x40, + ANA1_SET_SH5_0x41, + ANA1_SET_SH5_0x42, + ANA1_SET_SH5_0x43, + ANA1_SET_SH5_0x44, + ANA1_SET_SH5_0x45, + ANA1_SET_SH5_0x46, + ANA1_SET_SH5_0x47, + ANA1_SET_SH5_0x48, + ANA1_SET_SH5_0x49, + ANA1_SET_SH5_0x4A, + ANA1_SET_SH5_0x4B, + ANA1_SET_SH5_0x4C, + ANA1_SET_SH5_0x4D, + ANA1_SET_SH5_0x4E, + ANA1_SET_SH5_0x4F, + ANA1_SET_SH5_0x50, + ANA1_SET_SH5_0x51, + ANA1_SET_SH5_0x52, + ANA1_SET_SH5_0x53, + ANA1_SET_SH5_0x54, + ANA1_SET_SH5_0x55, + ANA1_SET_SH5_0x56, + ANA1_SET_SH5_0x57, + ANA1_SET_SH5_0x58, + ANA1_SET_SH5_0x59, + ANA1_SET_SH5_0x5A, + ANA1_SET_SH5_0x5B, + ANA1_SET_SH5_0x5C, + ANA1_SET_SH5_0x5D, + ANA1_SET_SH5_0x5E, + ANA1_SET_SH5_0x5F, + ANA1_SET_SH5_0x60, + ANA1_SET_SH5_0x61, + ANA1_SET_SH5_0x62, + ANA1_SET_SH5_0x63, + ANA1_SET_SH5_0x64, + ANA1_SET_SH5_0x65, + ANA1_SET_SH5_0x66, + ANA1_SET_SH5_0x67, + ANA1_SET_SH5_0x68, + ANA1_SET_SH5_0x69, + ANA1_SET_SH5_0x6A, + ANA1_SET_SH5_0x6B, + ANA1_SET_SH5_0x6C, + ANA1_SET_SH5_0x6D, + ANA1_SET_SH5_0x6E, + ANA1_SET_SH5_0x6F, + ANA1_SET_SH5_0x70, + ANA1_SET_SH5_0x71, + ANA1_SET_SH5_0x72, + ANA1_SET_SH5_0x73, + ANA1_SET_SH5_0x74, + ANA1_SET_SH5_0x75, + ANA1_SET_SH5_0x76, + ANA1_SET_SH5_0x77, + ANA1_SET_SH5_0x78, + ANA1_SET_SH5_0x79, + ANA1_SET_SH5_0x7A, + ANA1_SET_SH5_0x7B, + ANA1_SET_SH5_0x7C, + ANA1_SET_SH5_0x7D, + ANA1_SET_SH5_0x7E, + ANA1_SET_SH5_0x7F, +//ANA2 + ANA2_SET_SH5_0x00, + ANA2_SET_SH5_0x01, + ANA2_SET_SH5_0x02, + ANA2_SET_SH5_0x03, + ANA2_SET_SH5_0x04, + ANA2_SET_SH5_0x05, + ANA2_SET_SH5_0x06, + ANA2_SET_SH5_0x07, + ANA2_SET_SH5_0x08, + ANA2_SET_SH5_0x09, + ANA2_SET_SH5_0x0A, + ANA2_SET_SH5_0x0B, + ANA2_SET_SH5_0x0C, + ANA2_SET_SH5_0x0D, + ANA2_SET_SH5_0x0E, + ANA2_SET_SH5_0x0F, + ANA2_SET_SH5_0x10, + ANA2_SET_SH5_0x11, + ANA2_SET_SH5_0x12, + ANA2_SET_SH5_0x13, + ANA2_SET_SH5_0x14, + ANA2_SET_SH5_0x15, + ANA2_SET_SH5_0x16, + ANA2_SET_SH5_0x17, + ANA2_SET_SH5_0x18, + ANA2_SET_SH5_0x19, + ANA2_SET_SH5_0x1A, + ANA2_SET_SH5_0x1B, + ANA2_SET_SH5_0x1C, + ANA2_SET_SH5_0x1D, + ANA2_SET_SH5_0x1E, + ANA2_SET_SH5_0x1F, + ANA2_SET_SH5_0x20, + ANA2_SET_SH5_0x21, + ANA2_SET_SH5_0x22, + ANA2_SET_SH5_0x23, + ANA2_SET_SH5_0x24, + ANA2_SET_SH5_0x25, + ANA2_SET_SH5_0x26, + ANA2_SET_SH5_0x27, + ANA2_SET_SH5_0x28, + ANA2_SET_SH5_0x29, + ANA2_SET_SH5_0x2A, + ANA2_SET_SH5_0x2B, + ANA2_SET_SH5_0x2C, + ANA2_SET_SH5_0x2D, + ANA2_SET_SH5_0x2E, + ANA2_SET_SH5_0x2F, + ANA2_SET_SH5_0x30, + ANA2_SET_SH5_0x31, + ANA2_SET_SH5_0x32, + ANA2_SET_SH5_0x33, + ANA2_SET_SH5_0x34, + ANA2_SET_SH5_0x35, + ANA2_SET_SH5_0x36, + ANA2_SET_SH5_0x37, + ANA2_SET_SH5_0x38, + ANA2_SET_SH5_0x39, + ANA2_SET_SH5_0x3A, + ANA2_SET_SH5_0x3B, + ANA2_SET_SH5_0x3C, + ANA2_SET_SH5_0x3D, + ANA2_SET_SH5_0x3E, + ANA2_SET_SH5_0x3F, + ANA2_SET_SH5_0x40, + ANA2_SET_SH5_0x41, + ANA2_SET_SH5_0x42, + ANA2_SET_SH5_0x43, + ANA2_SET_SH5_0x44, + ANA2_SET_SH5_0x45, + ANA2_SET_SH5_0x46, + ANA2_SET_SH5_0x47, + ANA2_SET_SH5_0x48, + ANA2_SET_SH5_0x49, + ANA2_SET_SH5_0x4A, + ANA2_SET_SH5_0x4B, + ANA2_SET_SH5_0x4C, + ANA2_SET_SH5_0x4D, + ANA2_SET_SH5_0x4E, + ANA2_SET_SH5_0x4F, + ANA2_SET_SH5_0x50, + ANA2_SET_SH5_0x51, + ANA2_SET_SH5_0x52, + ANA2_SET_SH5_0x53, + ANA2_SET_SH5_0x54, + ANA2_SET_SH5_0x55, + ANA2_SET_SH5_0x56, + ANA2_SET_SH5_0x57, + ANA2_SET_SH5_0x58, + ANA2_SET_SH5_0x59, + ANA2_SET_SH5_0x5A, + ANA2_SET_SH5_0x5B, + ANA2_SET_SH5_0x5C, + ANA2_SET_SH5_0x5D, + ANA2_SET_SH5_0x5E, + ANA2_SET_SH5_0x5F, + ANA2_SET_SH5_0x60, + ANA2_SET_SH5_0x61, + ANA2_SET_SH5_0x62, + ANA2_SET_SH5_0x63, + ANA2_SET_SH5_0x64, + ANA2_SET_SH5_0x65, + ANA2_SET_SH5_0x66, + ANA2_SET_SH5_0x67, + ANA2_SET_SH5_0x68, + ANA2_SET_SH5_0x69, + ANA2_SET_SH5_0x6A, + ANA2_SET_SH5_0x6B, + ANA2_SET_SH5_0x6C, + ANA2_SET_SH5_0x6D, + ANA2_SET_SH5_0x6E, + ANA2_SET_SH5_0x6F, + ANA2_SET_SH5_0x70, + +}; + + diff --git a/drivers/input/touchscreen/ito_test/open_test_ANA2_B_8861A_lianchuang.h b/drivers/input/touchscreen/ito_test/open_test_ANA2_B_8861A_lianchuang.h new file mode 100644 index 00000000..5e8ee3f5 --- /dev/null +++ b/drivers/input/touchscreen/ito_test/open_test_ANA2_B_8861A_lianchuang.h @@ -0,0 +1,494 @@ +#define ANA1_SET_SH5B_0x00 0xFFFF +#define ANA1_SET_SH5B_0x01 0x007F +#define ANA1_SET_SH5B_0x02 0x001E +#define ANA1_SET_SH5B_0x03 0x4800 +#define ANA1_SET_SH5B_0x04 0x7FF1 +#define ANA1_SET_SH5B_0x05 0xF7FF +#define ANA1_SET_SH5B_0x06 0x1F1F +#define ANA1_SET_SH5B_0x07 0x0610 +#define ANA1_SET_SH5B_0x08 0x0000 +#define ANA1_SET_SH5B_0x09 0x0000 +#define ANA1_SET_SH5B_0x0A 0x0000 +#define ANA1_SET_SH5B_0x0B 0x0000 +#define ANA1_SET_SH5B_0x0C 0x0000 +#define ANA1_SET_SH5B_0x0D 0x0000 +#define ANA1_SET_SH5B_0x0E 0x0000 +#define ANA1_SET_SH5B_0x0F 0x0000 +#define ANA1_SET_SH5B_0x10 0x0000 +#define ANA1_SET_SH5B_0x11 0x0000 +#define ANA1_SET_SH5B_0x12 0x0000 +#define ANA1_SET_SH5B_0x13 0x0000 +#define ANA1_SET_SH5B_0x14 0x0000 +#define ANA1_SET_SH5B_0x15 0x0000 +#define ANA1_SET_SH5B_0x16 0x0000 +#define ANA1_SET_SH5B_0x17 0x0000 +#define ANA1_SET_SH5B_0x18 0x0000 +#define ANA1_SET_SH5B_0x19 0x0000 +#define ANA1_SET_SH5B_0x1A 0x0000 +#define ANA1_SET_SH5B_0x1B 0x0000 +#define ANA1_SET_SH5B_0x1C 0x0000 +#define ANA1_SET_SH5B_0x1D 0x0000 +#define ANA1_SET_SH5B_0x1E 0x0000 +#define ANA1_SET_SH5B_0x1F 0x0000 +#define ANA1_SET_SH5B_0x20 0x0000 +#define ANA1_SET_SH5B_0x21 0x0000 +#define ANA1_SET_SH5B_0x22 0x0000 +#define ANA1_SET_SH5B_0x23 0x0000 +#define ANA1_SET_SH5B_0x24 0x0000 +#define ANA1_SET_SH5B_0x25 0x0002 +#define ANA1_SET_SH5B_0x26 0x0000 +#define ANA1_SET_SH5B_0x27 0x3E15 +#define ANA1_SET_SH5B_0x28 0x3E3E +#define ANA1_SET_SH5B_0x29 0x3E18 +#define ANA1_SET_SH5B_0x2A 0x3E3E +#define ANA1_SET_SH5B_0x2B 0x3E19 +#define ANA1_SET_SH5B_0x2C 0x3E3E +#define ANA1_SET_SH5B_0x2D 0x3E1D +#define ANA1_SET_SH5B_0x2E 0x3E3E +#define ANA1_SET_SH5B_0x2F 0x3E1E +#define ANA1_SET_SH5B_0x30 0x3E3E +#define ANA1_SET_SH5B_0x31 0x3E3E +#define ANA1_SET_SH5B_0x32 0x3E3E +#define ANA1_SET_SH5B_0x33 0x3E3E +#define ANA1_SET_SH5B_0x34 0x3E3E +#define ANA1_SET_SH5B_0x35 0x3E3E +#define ANA1_SET_SH5B_0x36 0x3E3E +#define ANA1_SET_SH5B_0x37 0x3E3E +#define ANA1_SET_SH5B_0x38 0x3E3E +#define ANA1_SET_SH5B_0x39 0x3E3E +#define ANA1_SET_SH5B_0x3A 0x3E3E +#define ANA1_SET_SH5B_0x3B 0x3E3E +#define ANA1_SET_SH5B_0x3C 0x3E3E +#define ANA1_SET_SH5B_0x3D 0x3E3E +#define ANA1_SET_SH5B_0x3E 0x3E3E +#define ANA1_SET_SH5B_0x3F 0x0000 +#define ANA1_SET_SH5B_0x40 0x0000 +#define ANA1_SET_SH5B_0x41 0x0000 +#define ANA1_SET_SH5B_0x42 0x0000 +#define ANA1_SET_SH5B_0x43 0x0000 +#define ANA1_SET_SH5B_0x44 0x0000 +#define ANA1_SET_SH5B_0x45 0x0000 +#define ANA1_SET_SH5B_0x46 0x0000 +#define ANA1_SET_SH5B_0x47 0x0000 +#define ANA1_SET_SH5B_0x48 0x0000 +#define ANA1_SET_SH5B_0x49 0x0000 +#define ANA1_SET_SH5B_0x4A 0x0000 +#define ANA1_SET_SH5B_0x4B 0x0000 +#define ANA1_SET_SH5B_0x4C 0x0000 +#define ANA1_SET_SH5B_0x4D 0x0000 +#define ANA1_SET_SH5B_0x4E 0x0000 +#define ANA1_SET_SH5B_0x4F 0x0000 +#define ANA1_SET_SH5B_0x50 0x0000 +#define ANA1_SET_SH5B_0x51 0x0000 +#define ANA1_SET_SH5B_0x52 0x0000 +#define ANA1_SET_SH5B_0x53 0x0000 +#define ANA1_SET_SH5B_0x54 0x0000 +#define ANA1_SET_SH5B_0x55 0x0000 +#define ANA1_SET_SH5B_0x56 0x0000 +#define ANA1_SET_SH5B_0x57 0x0000 +#define ANA1_SET_SH5B_0x58 0x0000 +#define ANA1_SET_SH5B_0x59 0x0000 +#define ANA1_SET_SH5B_0x5A 0x0000 +#define ANA1_SET_SH5B_0x5B 0x0000 +#define ANA1_SET_SH5B_0x5C 0x0000 +#define ANA1_SET_SH5B_0x5D 0x0000 +#define ANA1_SET_SH5B_0x5E 0x0000 +#define ANA1_SET_SH5B_0x5F 0x0000 +#define ANA1_SET_SH5B_0x60 0x0000 +#define ANA1_SET_SH5B_0x61 0x0000 +#define ANA1_SET_SH5B_0x62 0x0000 +#define ANA1_SET_SH5B_0x63 0x0000 +#define ANA1_SET_SH5B_0x64 0x0000 +#define ANA1_SET_SH5B_0x65 0x0000 +#define ANA1_SET_SH5B_0x66 0x0000 +#define ANA1_SET_SH5B_0x67 0x0000 +#define ANA1_SET_SH5B_0x68 0x0000 +#define ANA1_SET_SH5B_0x69 0x0000 +#define ANA1_SET_SH5B_0x6A 0x0000 +#define ANA1_SET_SH5B_0x6B 0x0000 +#define ANA1_SET_SH5B_0x6C 0x0000 +#define ANA1_SET_SH5B_0x6D 0x0000 +#define ANA1_SET_SH5B_0x6E 0x0000 +#define ANA1_SET_SH5B_0x6F 0x0000 +#define ANA1_SET_SH5B_0x70 0x0000 +#define ANA1_SET_SH5B_0x71 0x0000 +#define ANA1_SET_SH5B_0x72 0x0000 +#define ANA1_SET_SH5B_0x73 0x0000 +#define ANA1_SET_SH5B_0x74 0x0000 +#define ANA1_SET_SH5B_0x75 0x0000 +#define ANA1_SET_SH5B_0x76 0x0C00 +#define ANA1_SET_SH5B_0x77 0xFFFF +#define ANA1_SET_SH5B_0x78 0xFFFF +#define ANA1_SET_SH5B_0x79 0x3FFF +#define ANA1_SET_SH5B_0x7A 0x0000 +#define ANA1_SET_SH5B_0x7B 0x0000 +#define ANA1_SET_SH5B_0x7C 0x0000 +#define ANA1_SET_SH5B_0x7D 0x0000 +#define ANA1_SET_SH5B_0x7E 0x0000 +#define ANA1_SET_SH5B_0x7F 0x0000 + + + + +#define ANA2_SET_SH5B_0x00 0x0048 +#define ANA2_SET_SH5B_0x01 0x0000 +#define ANA2_SET_SH5B_0x02 0x1111 +#define ANA2_SET_SH5B_0x03 0x0011 +#define ANA2_SET_SH5B_0x04 0x0002 +#define ANA2_SET_SH5B_0x05 0x0001 +#define ANA2_SET_SH5B_0x05_UP 0xB8A8 +#define ANA2_SET_SH5B_0x06 0x0000 +#define ANA2_SET_SH5B_0x07 0x0000 +#define ANA2_SET_SH5B_0x08 0x0000 +#define ANA2_SET_SH5B_0x09 0x0000 +#define ANA2_SET_SH5B_0x0A 0x0030 +#define ANA2_SET_SH5B_0x0B 0x0008 +#define ANA2_SET_SH5B_0x0C 0x0000 +#define ANA2_SET_SH5B_0x0D 0x0031 +#define ANA2_SET_SH5B_0x0E 0x0031 +#define ANA2_SET_SH5B_0x0F 0x0031 +#define ANA2_SET_SH5B_0x10 0x0031 +#define ANA2_SET_SH5B_0x11 0x0000 +#define ANA2_SET_SH5B_0x12 0x04C0 +#define ANA2_SET_SH5B_0x13 0x2102 +#define ANA2_SET_SH5B_0x14 0x0003 +#define ANA2_SET_SH5B_0x15 0x0013 +#define ANA2_SET_SH5B_0x16 0x0015 +#define ANA2_SET_SH5B_0x17 0x0015 +#define ANA2_SET_SH5B_0x18 0x0015 +#define ANA2_SET_SH5B_0x19 0xDCAC +#define ANA2_SET_SH5B_0x1A 0x0000 +#define ANA2_SET_SH5B_0x1B 0x0000 +#define ANA2_SET_SH5B_0x1C 0x0000 +#define ANA2_SET_SH5B_0x1D 0x1111 +#define ANA2_SET_SH5B_0x1E 0x0000 +#define ANA2_SET_SH5B_0x1F 0x0000 +#define ANA2_SET_SH5B_0x20 0xC000 +#define ANA2_SET_SH5B_0x21 0x0000 +#define ANA2_SET_SH5B_0x22 0x0000 +#define ANA2_SET_SH5B_0x23 0x0000 +#define ANA2_SET_SH5B_0x24 0x0000 +#define ANA2_SET_SH5B_0x25 0x0000 +#define ANA2_SET_SH5B_0x26 0x0000 +#define ANA2_SET_SH5B_0x27 0x0000 +#define ANA2_SET_SH5B_0x28 0x0000 +#define ANA2_SET_SH5B_0x29 0x0000 +#define ANA2_SET_SH5B_0x2A 0x0000 +#define ANA2_SET_SH5B_0x2B 0x0000 +#define ANA2_SET_SH5B_0x2C 0x0000 +#define ANA2_SET_SH5B_0x2D 0x0000 +#define ANA2_SET_SH5B_0x2E 0x0000 +#define ANA2_SET_SH5B_0x2F 0x0000 +#define ANA2_SET_SH5B_0x30 0x0000 +#define ANA2_SET_SH5B_0x31 0x0000 +#define ANA2_SET_SH5B_0x32 0x0000 +#define ANA2_SET_SH5B_0x33 0x0000 +#define ANA2_SET_SH5B_0x34 0x0000 +#define ANA2_SET_SH5B_0x35 0x0000 +#define ANA2_SET_SH5B_0x36 0x0000 +#define ANA2_SET_SH5B_0x37 0x0000 +#define ANA2_SET_SH5B_0x38 0x0000 +#define ANA2_SET_SH5B_0x39 0x0000 +#define ANA2_SET_SH5B_0x3A 0x0000 +#define ANA2_SET_SH5B_0x3B 0x0000 +#define ANA2_SET_SH5B_0x3C 0x0000 +#define ANA2_SET_SH5B_0x3D 0x0000 +#define ANA2_SET_SH5B_0x3E 0x0000 +#define ANA2_SET_SH5B_0x3F 0x0000 +#define ANA2_SET_SH5B_0x40 0x0000 +#define ANA2_SET_SH5B_0x41 0x0000 +#define ANA2_SET_SH5B_0x42 0x0000 +#define ANA2_SET_SH5B_0x43 0x0000 +#define ANA2_SET_SH5B_0x44 0x0000 +#define ANA2_SET_SH5B_0x45 0x0000 +#define ANA2_SET_SH5B_0x46 0x0000 +#define ANA2_SET_SH5B_0x47 0x0000 +#define ANA2_SET_SH5B_0x48 0x0000 +#define ANA2_SET_SH5B_0x49 0x0000 +#define ANA2_SET_SH5B_0x4A 0x0000 +#define ANA2_SET_SH5B_0x4B 0x0000 +#define ANA2_SET_SH5B_0x4C 0x0000 +#define ANA2_SET_SH5B_0x4D 0x0000 +#define ANA2_SET_SH5B_0x4E 0x0000 +#define ANA2_SET_SH5B_0x4F 0x0000 +#define ANA2_SET_SH5B_0x50 0x0000 +#define ANA2_SET_SH5B_0x51 0x0000 +#define ANA2_SET_SH5B_0x52 0x0000 +#define ANA2_SET_SH5B_0x53 0x0000 +#define ANA2_SET_SH5B_0x54 0x0000 +#define ANA2_SET_SH5B_0x55 0x0000 +#define ANA2_SET_SH5B_0x56 0x0000 +#define ANA2_SET_SH5B_0x57 0x0000 +#define ANA2_SET_SH5B_0x58 0x0000 +#define ANA2_SET_SH5B_0x59 0x0000 +#define ANA2_SET_SH5B_0x5A 0x0000 +#define ANA2_SET_SH5B_0x5B 0x0000 +#define ANA2_SET_SH5B_0x5C 0x0000 +#define ANA2_SET_SH5B_0x5D 0x0000 +#define ANA2_SET_SH5B_0x5E 0x0000 +#define ANA2_SET_SH5B_0x5F 0x0000 +#define ANA2_SET_SH5B_0x60 0x0000 +#define ANA2_SET_SH5B_0x61 0x0000 +#define ANA2_SET_SH5B_0x62 0x0000 +#define ANA2_SET_SH5B_0x63 0x0000 +#define ANA2_SET_SH5B_0x64 0x0000 +#define ANA2_SET_SH5B_0x65 0x0000 +#define ANA2_SET_SH5B_0x66 0x0000 +#define ANA2_SET_SH5B_0x67 0x0000 +#define ANA2_SET_SH5B_0x68 0x0000 +#define ANA2_SET_SH5B_0x69 0x0000 +#define ANA2_SET_SH5B_0x6A 0x0000 +#define ANA2_SET_SH5B_0x6B 0x0000 +#define ANA2_SET_SH5B_0x6C 0x0000 +#define ANA2_SET_SH5B_0x6D 0x0000 +#define ANA2_SET_SH5B_0x6E 0x0000 +#define ANA2_SET_SH5B_0x6F 0x0000 +#define ANA2_SET_SH5B_0x70 0x0010 + +uint16_t open_2B_lianchuang[241] = +{ + ANA1_SET_SH5B_0x00, + ANA1_SET_SH5B_0x01, + ANA1_SET_SH5B_0x02, + ANA1_SET_SH5B_0x03, + ANA1_SET_SH5B_0x04, + ANA1_SET_SH5B_0x05, + ANA1_SET_SH5B_0x06, + ANA1_SET_SH5B_0x07, + ANA1_SET_SH5B_0x08, + ANA1_SET_SH5B_0x09, + ANA1_SET_SH5B_0x0A, + ANA1_SET_SH5B_0x0B, + ANA1_SET_SH5B_0x0C, + ANA1_SET_SH5B_0x0D, + ANA1_SET_SH5B_0x0E, + ANA1_SET_SH5B_0x0F, + ANA1_SET_SH5B_0x10, + ANA1_SET_SH5B_0x11, + ANA1_SET_SH5B_0x12, + ANA1_SET_SH5B_0x13, + ANA1_SET_SH5B_0x14, + ANA1_SET_SH5B_0x15, + ANA1_SET_SH5B_0x16, + ANA1_SET_SH5B_0x17, + ANA1_SET_SH5B_0x18, + ANA1_SET_SH5B_0x19, + ANA1_SET_SH5B_0x1A, + ANA1_SET_SH5B_0x1B, + ANA1_SET_SH5B_0x1C, + ANA1_SET_SH5B_0x1D, + ANA1_SET_SH5B_0x1E, + ANA1_SET_SH5B_0x1F, + ANA1_SET_SH5B_0x20, + ANA1_SET_SH5B_0x21, + ANA1_SET_SH5B_0x22, + ANA1_SET_SH5B_0x23, + ANA1_SET_SH5B_0x24, + ANA1_SET_SH5B_0x25, + ANA1_SET_SH5B_0x26, + ANA1_SET_SH5B_0x27, + ANA1_SET_SH5B_0x28, + ANA1_SET_SH5B_0x29, + ANA1_SET_SH5B_0x2A, + ANA1_SET_SH5B_0x2B, + ANA1_SET_SH5B_0x2C, + ANA1_SET_SH5B_0x2D, + ANA1_SET_SH5B_0x2E, + ANA1_SET_SH5B_0x2F, + ANA1_SET_SH5B_0x30, + ANA1_SET_SH5B_0x31, + ANA1_SET_SH5B_0x32, + ANA1_SET_SH5B_0x33, + ANA1_SET_SH5B_0x34, + ANA1_SET_SH5B_0x35, + ANA1_SET_SH5B_0x36, + ANA1_SET_SH5B_0x37, + ANA1_SET_SH5B_0x38, + ANA1_SET_SH5B_0x39, + ANA1_SET_SH5B_0x3A, + ANA1_SET_SH5B_0x3B, + ANA1_SET_SH5B_0x3C, + ANA1_SET_SH5B_0x3D, + ANA1_SET_SH5B_0x3E, + ANA1_SET_SH5B_0x3F, + ANA1_SET_SH5B_0x40, + ANA1_SET_SH5B_0x41, + ANA1_SET_SH5B_0x42, + ANA1_SET_SH5B_0x43, + ANA1_SET_SH5B_0x44, + ANA1_SET_SH5B_0x45, + ANA1_SET_SH5B_0x46, + ANA1_SET_SH5B_0x47, + ANA1_SET_SH5B_0x48, + ANA1_SET_SH5B_0x49, + ANA1_SET_SH5B_0x4A, + ANA1_SET_SH5B_0x4B, + ANA1_SET_SH5B_0x4C, + ANA1_SET_SH5B_0x4D, + ANA1_SET_SH5B_0x4E, + ANA1_SET_SH5B_0x4F, + ANA1_SET_SH5B_0x50, + ANA1_SET_SH5B_0x51, + ANA1_SET_SH5B_0x52, + ANA1_SET_SH5B_0x53, + ANA1_SET_SH5B_0x54, + ANA1_SET_SH5B_0x55, + ANA1_SET_SH5B_0x56, + ANA1_SET_SH5B_0x57, + ANA1_SET_SH5B_0x58, + ANA1_SET_SH5B_0x59, + ANA1_SET_SH5B_0x5A, + ANA1_SET_SH5B_0x5B, + ANA1_SET_SH5B_0x5C, + ANA1_SET_SH5B_0x5D, + ANA1_SET_SH5B_0x5E, + ANA1_SET_SH5B_0x5F, + ANA1_SET_SH5B_0x60, + ANA1_SET_SH5B_0x61, + ANA1_SET_SH5B_0x62, + ANA1_SET_SH5B_0x63, + ANA1_SET_SH5B_0x64, + ANA1_SET_SH5B_0x65, + ANA1_SET_SH5B_0x66, + ANA1_SET_SH5B_0x67, + ANA1_SET_SH5B_0x68, + ANA1_SET_SH5B_0x69, + ANA1_SET_SH5B_0x6A, + ANA1_SET_SH5B_0x6B, + ANA1_SET_SH5B_0x6C, + ANA1_SET_SH5B_0x6D, + ANA1_SET_SH5B_0x6E, + ANA1_SET_SH5B_0x6F, + ANA1_SET_SH5B_0x70, + ANA1_SET_SH5B_0x71, + ANA1_SET_SH5B_0x72, + ANA1_SET_SH5B_0x73, + ANA1_SET_SH5B_0x74, + ANA1_SET_SH5B_0x75, + ANA1_SET_SH5B_0x76, + ANA1_SET_SH5B_0x77, + ANA1_SET_SH5B_0x78, + ANA1_SET_SH5B_0x79, + ANA1_SET_SH5B_0x7A, + ANA1_SET_SH5B_0x7B, + ANA1_SET_SH5B_0x7C, + ANA1_SET_SH5B_0x7D, + ANA1_SET_SH5B_0x7E, + ANA1_SET_SH5B_0x7F, +//ANA2 + ANA2_SET_SH5B_0x00, + ANA2_SET_SH5B_0x01, + ANA2_SET_SH5B_0x02, + ANA2_SET_SH5B_0x03, + ANA2_SET_SH5B_0x04, + ANA2_SET_SH5B_0x05, + ANA2_SET_SH5B_0x06, + ANA2_SET_SH5B_0x07, + ANA2_SET_SH5B_0x08, + ANA2_SET_SH5B_0x09, + ANA2_SET_SH5B_0x0A, + ANA2_SET_SH5B_0x0B, + ANA2_SET_SH5B_0x0C, + ANA2_SET_SH5B_0x0D, + ANA2_SET_SH5B_0x0E, + ANA2_SET_SH5B_0x0F, + ANA2_SET_SH5B_0x10, + ANA2_SET_SH5B_0x11, + ANA2_SET_SH5B_0x12, + ANA2_SET_SH5B_0x13, + ANA2_SET_SH5B_0x14, + ANA2_SET_SH5B_0x15, + ANA2_SET_SH5B_0x16, + ANA2_SET_SH5B_0x17, + ANA2_SET_SH5B_0x18, + ANA2_SET_SH5B_0x19, + ANA2_SET_SH5B_0x1A, + ANA2_SET_SH5B_0x1B, + ANA2_SET_SH5B_0x1C, + ANA2_SET_SH5B_0x1D, + ANA2_SET_SH5B_0x1E, + ANA2_SET_SH5B_0x1F, + ANA2_SET_SH5B_0x20, + ANA2_SET_SH5B_0x21, + ANA2_SET_SH5B_0x22, + ANA2_SET_SH5B_0x23, + ANA2_SET_SH5B_0x24, + ANA2_SET_SH5B_0x25, + ANA2_SET_SH5B_0x26, + ANA2_SET_SH5B_0x27, + ANA2_SET_SH5B_0x28, + ANA2_SET_SH5B_0x29, + ANA2_SET_SH5B_0x2A, + ANA2_SET_SH5B_0x2B, + ANA2_SET_SH5B_0x2C, + ANA2_SET_SH5B_0x2D, + ANA2_SET_SH5B_0x2E, + ANA2_SET_SH5B_0x2F, + ANA2_SET_SH5B_0x30, + ANA2_SET_SH5B_0x31, + ANA2_SET_SH5B_0x32, + ANA2_SET_SH5B_0x33, + ANA2_SET_SH5B_0x34, + ANA2_SET_SH5B_0x35, + ANA2_SET_SH5B_0x36, + ANA2_SET_SH5B_0x37, + ANA2_SET_SH5B_0x38, + ANA2_SET_SH5B_0x39, + ANA2_SET_SH5B_0x3A, + ANA2_SET_SH5B_0x3B, + ANA2_SET_SH5B_0x3C, + ANA2_SET_SH5B_0x3D, + ANA2_SET_SH5B_0x3E, + ANA2_SET_SH5B_0x3F, + ANA2_SET_SH5B_0x40, + ANA2_SET_SH5B_0x41, + ANA2_SET_SH5B_0x42, + ANA2_SET_SH5B_0x43, + ANA2_SET_SH5B_0x44, + ANA2_SET_SH5B_0x45, + ANA2_SET_SH5B_0x46, + ANA2_SET_SH5B_0x47, + ANA2_SET_SH5B_0x48, + ANA2_SET_SH5B_0x49, + ANA2_SET_SH5B_0x4A, + ANA2_SET_SH5B_0x4B, + ANA2_SET_SH5B_0x4C, + ANA2_SET_SH5B_0x4D, + ANA2_SET_SH5B_0x4E, + ANA2_SET_SH5B_0x4F, + ANA2_SET_SH5B_0x50, + ANA2_SET_SH5B_0x51, + ANA2_SET_SH5B_0x52, + ANA2_SET_SH5B_0x53, + ANA2_SET_SH5B_0x54, + ANA2_SET_SH5B_0x55, + ANA2_SET_SH5B_0x56, + ANA2_SET_SH5B_0x57, + ANA2_SET_SH5B_0x58, + ANA2_SET_SH5B_0x59, + ANA2_SET_SH5B_0x5A, + ANA2_SET_SH5B_0x5B, + ANA2_SET_SH5B_0x5C, + ANA2_SET_SH5B_0x5D, + ANA2_SET_SH5B_0x5E, + ANA2_SET_SH5B_0x5F, + ANA2_SET_SH5B_0x60, + ANA2_SET_SH5B_0x61, + ANA2_SET_SH5B_0x62, + ANA2_SET_SH5B_0x63, + ANA2_SET_SH5B_0x64, + ANA2_SET_SH5B_0x65, + ANA2_SET_SH5B_0x66, + ANA2_SET_SH5B_0x67, + ANA2_SET_SH5B_0x68, + ANA2_SET_SH5B_0x69, + ANA2_SET_SH5B_0x6A, + ANA2_SET_SH5B_0x6B, + ANA2_SET_SH5B_0x6C, + ANA2_SET_SH5B_0x6D, + ANA2_SET_SH5B_0x6E, + ANA2_SET_SH5B_0x6F, + ANA2_SET_SH5B_0x70, +}; + + diff --git a/drivers/input/touchscreen/ito_test/open_test_ANA3_8861A_lianchuang.h b/drivers/input/touchscreen/ito_test/open_test_ANA3_8861A_lianchuang.h new file mode 100644 index 00000000..1bfe9813 --- /dev/null +++ b/drivers/input/touchscreen/ito_test/open_test_ANA3_8861A_lianchuang.h @@ -0,0 +1,504 @@ + + + + +//MP Setting +#define IDLE_SENSOR_SH6_1 0x0000 +#define IDLE_SENSOR_SH6_2 0x0000 +#define IDLE_SENSOR_SH6_3 0x4000 +///////////////////////////////////////////////////// +// Constant for ANA Setting +///////////////////////////////////////////////////// +#define ANA1_SET_SH6_0x00 0xFFFF +#define ANA1_SET_SH6_0x01 0x007F +#define ANA1_SET_SH6_0x02 0x001E +#define ANA1_SET_SH6_0x03 0x4800 +#define ANA1_SET_SH6_0x04 0x7FF1 +#define ANA1_SET_SH6_0x05 0xF7FF +#define ANA1_SET_SH6_0x06 0x1F1F +#define ANA1_SET_SH6_0x07 0x0610 +#define ANA1_SET_SH6_0x08 0x0000 +#define ANA1_SET_SH6_0x09 0x0000 +#define ANA1_SET_SH6_0x0A 0x0000 +#define ANA1_SET_SH6_0x0B 0x0000 +#define ANA1_SET_SH6_0x0C 0x0000 +#define ANA1_SET_SH6_0x0D 0x0000 +#define ANA1_SET_SH6_0x0E 0x0000 +#define ANA1_SET_SH6_0x0F 0x0000 +#define ANA1_SET_SH6_0x10 0x0000 +#define ANA1_SET_SH6_0x11 0x0000 +#define ANA1_SET_SH6_0x12 0x0000 +#define ANA1_SET_SH6_0x13 0x0000 +#define ANA1_SET_SH6_0x14 0x0000 +#define ANA1_SET_SH6_0x15 0x0000 +#define ANA1_SET_SH6_0x16 0x0000 +#define ANA1_SET_SH6_0x17 0x0000 +#define ANA1_SET_SH6_0x18 0x0000 +#define ANA1_SET_SH6_0x19 0x0000 +#define ANA1_SET_SH6_0x1A 0x0000 +#define ANA1_SET_SH6_0x1B 0x0000 +#define ANA1_SET_SH6_0x1C 0x0000 +#define ANA1_SET_SH6_0x1D 0x0000 +#define ANA1_SET_SH6_0x1E 0x0000 +#define ANA1_SET_SH6_0x1F 0x0000 +#define ANA1_SET_SH6_0x20 0x0000 +#define ANA1_SET_SH6_0x21 0x0000 +#define ANA1_SET_SH6_0x22 0x0000 +#define ANA1_SET_SH6_0x23 0x0000 +#define ANA1_SET_SH6_0x24 0x0000 +#define ANA1_SET_SH6_0x25 0x0000 +#define ANA1_SET_SH6_0x26 0x0000 +#define ANA1_SET_SH6_0x27 0x0500 +#define ANA1_SET_SH6_0x28 0x0706 +#define ANA1_SET_SH6_0x29 0x0908 +#define ANA1_SET_SH6_0x2A 0x0B0A +#define ANA1_SET_SH6_0x2B 0x0D0C +#define ANA1_SET_SH6_0x2C 0x100E +#define ANA1_SET_SH6_0x2D 0x1104 +#define ANA1_SET_SH6_0x2E 0x1312 +#define ANA1_SET_SH6_0x2F 0x1514 +#define ANA1_SET_SH6_0x30 0x1716 +#define ANA1_SET_SH6_0x31 0x1918 +#define ANA1_SET_SH6_0x32 0x1C1A +#define ANA1_SET_SH6_0x33 0x1D2C +#define ANA1_SET_SH6_0x34 0x1F1E +#define ANA1_SET_SH6_0x35 0x2120 +#define ANA1_SET_SH6_0x36 0x2322 +#define ANA1_SET_SH6_0x37 0x2824 +#define ANA1_SET_SH6_0x38 0x2A29 +#define ANA1_SET_SH6_0x39 0x3E2B +#define ANA1_SET_SH6_0x3A 0x3E3E +#define ANA1_SET_SH6_0x3B 0x3E3E +#define ANA1_SET_SH6_0x3C 0x3E3E +#define ANA1_SET_SH6_0x3D 0x3E3E +#define ANA1_SET_SH6_0x3E 0x3E3E +#define ANA1_SET_SH6_0x3F 0x0000 +#define ANA1_SET_SH6_0x40 0x0000 +#define ANA1_SET_SH6_0x41 0x0000 +#define ANA1_SET_SH6_0x42 0x0000 +#define ANA1_SET_SH6_0x43 0x0000 +#define ANA1_SET_SH6_0x44 0x0000 +#define ANA1_SET_SH6_0x45 0x0000 +#define ANA1_SET_SH6_0x46 0x0000 +#define ANA1_SET_SH6_0x47 0x0000 +#define ANA1_SET_SH6_0x48 0x0000 +#define ANA1_SET_SH6_0x49 0x0000 +#define ANA1_SET_SH6_0x4A 0x0000 +#define ANA1_SET_SH6_0x4B 0x0000 +#define ANA1_SET_SH6_0x4C 0x0000 +#define ANA1_SET_SH6_0x4D 0x0000 +#define ANA1_SET_SH6_0x4E 0x0000 +#define ANA1_SET_SH6_0x4F 0x0000 +#define ANA1_SET_SH6_0x50 0x0000 +#define ANA1_SET_SH6_0x51 0x0000 +#define ANA1_SET_SH6_0x52 0x0000 +#define ANA1_SET_SH6_0x53 0x0000 +#define ANA1_SET_SH6_0x54 0x0000 +#define ANA1_SET_SH6_0x55 0x0000 +#define ANA1_SET_SH6_0x56 0x0000 +#define ANA1_SET_SH6_0x57 0x0000 +#define ANA1_SET_SH6_0x58 0x0000 +#define ANA1_SET_SH6_0x59 0x0000 +#define ANA1_SET_SH6_0x5A 0x0000 +#define ANA1_SET_SH6_0x5B 0x0000 +#define ANA1_SET_SH6_0x5C 0x0000 +#define ANA1_SET_SH6_0x5D 0x0000 +#define ANA1_SET_SH6_0x5E 0x0000 +#define ANA1_SET_SH6_0x5F 0x0000 +#define ANA1_SET_SH6_0x60 0x0000 +#define ANA1_SET_SH6_0x61 0x0000 +#define ANA1_SET_SH6_0x62 0x0000 +#define ANA1_SET_SH6_0x63 0x0000 +#define ANA1_SET_SH6_0x64 0x0000 +#define ANA1_SET_SH6_0x65 0x0000 +#define ANA1_SET_SH6_0x66 0x0000 +#define ANA1_SET_SH6_0x67 0x0000 +#define ANA1_SET_SH6_0x68 0x0000 +#define ANA1_SET_SH6_0x69 0x0000 +#define ANA1_SET_SH6_0x6A 0x0000 +#define ANA1_SET_SH6_0x6B 0x0000 +#define ANA1_SET_SH6_0x6C 0x0000 +#define ANA1_SET_SH6_0x6D 0x0000 +#define ANA1_SET_SH6_0x6E 0x0000 +#define ANA1_SET_SH6_0x6F 0x0000 +#define ANA1_SET_SH6_0x70 0x0000 +#define ANA1_SET_SH6_0x71 0x0000 +#define ANA1_SET_SH6_0x72 0x0000 +#define ANA1_SET_SH6_0x73 0x0000 +#define ANA1_SET_SH6_0x74 0x0000 +#define ANA1_SET_SH6_0x75 0x0000 +#define ANA1_SET_SH6_0x76 0x0C00 +#define ANA1_SET_SH6_0x77 0xFFFF +#define ANA1_SET_SH6_0x78 0xFFFF +#define ANA1_SET_SH6_0x79 0x3FFF +#define ANA1_SET_SH6_0x7A 0x0001 +#define ANA1_SET_SH6_0x7B 0x0001 +#define ANA1_SET_SH6_0x7C 0x0001 +#define ANA1_SET_SH6_0x7D 0x0000 +#define ANA1_SET_SH6_0x7E 0x0000 +#define ANA1_SET_SH6_0x7F 0x0000 + + + + +#define ANA2_SET_SH6_0x00 0x0048 +#define ANA2_SET_SH6_0x01 0x0000 +#define ANA2_SET_SH6_0x02 0x1111 +#define ANA2_SET_SH6_0x03 0x0011 +#define ANA2_SET_SH6_0x04 0x0002 +#define ANA2_SET_SH6_0x05 0x1CCC +#define ANA2_SET_SH6_0x05_UP 0xCCC1 +#define ANA2_SET_SH6_0x06 0x0000 +#define ANA2_SET_SH6_0x07 0x0000 +#define ANA2_SET_SH6_0x08 0x0000 +#define ANA2_SET_SH6_0x09 0x0000 +#define ANA2_SET_SH6_0x0A 0x0030 +#define ANA2_SET_SH6_0x0B 0x0006 +#define ANA2_SET_SH6_0x0C 0x0000 +#define ANA2_SET_SH6_0x0D 0x0031 +#define ANA2_SET_SH6_0x0E 0x0031 +#define ANA2_SET_SH6_0x0F 0x0031 +#define ANA2_SET_SH6_0x10 0x0031 +#define ANA2_SET_SH6_0x11 0x0000 +#define ANA2_SET_SH6_0x12 0x04C0 +#define ANA2_SET_SH6_0x13 0x2102 +#define ANA2_SET_SH6_0x14 0x0003 +#define ANA2_SET_SH6_0x15 0x0013 +#define ANA2_SET_SH6_0x16 0x0015 +#define ANA2_SET_SH6_0x17 0x0015 +#define ANA2_SET_SH6_0x18 0x0015 +#define ANA2_SET_SH6_0x19 0xDCAC +#define ANA2_SET_SH6_0x1A 0x0000 +#define ANA2_SET_SH6_0x1B 0x0000 +#define ANA2_SET_SH6_0x1C 0x0000 +#define ANA2_SET_SH6_0x1D 0x1111 +#define ANA2_SET_SH6_0x1E 0x0000 +#define ANA2_SET_SH6_0x1F 0x0000 +#define ANA2_SET_SH6_0x20 0xC000 +#define ANA2_SET_SH6_0x21 0x0000 +#define ANA2_SET_SH6_0x22 0x0000 +#define ANA2_SET_SH6_0x23 0x0000 +#define ANA2_SET_SH6_0x24 0x0000 +#define ANA2_SET_SH6_0x25 0x0000 +#define ANA2_SET_SH6_0x26 0x0000 +#define ANA2_SET_SH6_0x27 0x0000 +#define ANA2_SET_SH6_0x28 0x0000 +#define ANA2_SET_SH6_0x29 0x0000 +#define ANA2_SET_SH6_0x2A 0x0000 +#define ANA2_SET_SH6_0x2B 0x0000 +#define ANA2_SET_SH6_0x2C 0x0000 +#define ANA2_SET_SH6_0x2D 0x0000 +#define ANA2_SET_SH6_0x2E 0x0000 +#define ANA2_SET_SH6_0x2F 0x0000 +#define ANA2_SET_SH6_0x30 0x0000 +#define ANA2_SET_SH6_0x31 0x0000 +#define ANA2_SET_SH6_0x32 0x0000 +#define ANA2_SET_SH6_0x33 0x0000 +#define ANA2_SET_SH6_0x34 0x0000 +#define ANA2_SET_SH6_0x35 0x0000 +#define ANA2_SET_SH6_0x36 0x0000 +#define ANA2_SET_SH6_0x37 0x0000 +#define ANA2_SET_SH6_0x38 0x0000 +#define ANA2_SET_SH6_0x39 0x0000 +#define ANA2_SET_SH6_0x3A 0x0000 +#define ANA2_SET_SH6_0x3B 0x0000 +#define ANA2_SET_SH6_0x3C 0x0000 +#define ANA2_SET_SH6_0x3D 0x0000 +#define ANA2_SET_SH6_0x3E 0x0000 +#define ANA2_SET_SH6_0x3F 0x0000 +#define ANA2_SET_SH6_0x40 0x0000 +#define ANA2_SET_SH6_0x41 0x0000 +#define ANA2_SET_SH6_0x42 0x0000 +#define ANA2_SET_SH6_0x43 0x0000 +#define ANA2_SET_SH6_0x44 0x0000 +#define ANA2_SET_SH6_0x45 0x0000 +#define ANA2_SET_SH6_0x46 0x0000 +#define ANA2_SET_SH6_0x47 0x0000 +#define ANA2_SET_SH6_0x48 0x0000 +#define ANA2_SET_SH6_0x49 0x0000 +#define ANA2_SET_SH6_0x4A 0x0000 +#define ANA2_SET_SH6_0x4B 0x0000 +#define ANA2_SET_SH6_0x4C 0x0000 +#define ANA2_SET_SH6_0x4D 0x0000 +#define ANA2_SET_SH6_0x4E 0x0000 +#define ANA2_SET_SH6_0x4F 0x0000 +#define ANA2_SET_SH6_0x50 0x0000 +#define ANA2_SET_SH6_0x51 0x0000 +#define ANA2_SET_SH6_0x52 0x0000 +#define ANA2_SET_SH6_0x53 0x0000 +#define ANA2_SET_SH6_0x54 0x0000 +#define ANA2_SET_SH6_0x55 0x0000 +#define ANA2_SET_SH6_0x56 0x0000 +#define ANA2_SET_SH6_0x57 0x0000 +#define ANA2_SET_SH6_0x58 0x0000 +#define ANA2_SET_SH6_0x59 0x0000 +#define ANA2_SET_SH6_0x5A 0x0000 +#define ANA2_SET_SH6_0x5B 0x0000 +#define ANA2_SET_SH6_0x5C 0x0000 +#define ANA2_SET_SH6_0x5D 0x0000 +#define ANA2_SET_SH6_0x5E 0x0000 +#define ANA2_SET_SH6_0x5F 0x0000 +#define ANA2_SET_SH6_0x60 0x0000 +#define ANA2_SET_SH6_0x61 0x0000 +#define ANA2_SET_SH6_0x62 0x0000 +#define ANA2_SET_SH6_0x63 0x0000 +#define ANA2_SET_SH6_0x64 0x0000 +#define ANA2_SET_SH6_0x65 0x0000 +#define ANA2_SET_SH6_0x66 0x0000 +#define ANA2_SET_SH6_0x67 0x0000 +#define ANA2_SET_SH6_0x68 0x0000 +#define ANA2_SET_SH6_0x69 0x0000 +#define ANA2_SET_SH6_0x6A 0x0000 +#define ANA2_SET_SH6_0x6B 0x0000 +#define ANA2_SET_SH6_0x6C 0x0000 +#define ANA2_SET_SH6_0x6D 0x0000 +#define ANA2_SET_SH6_0x6E 0x0000 +#define ANA2_SET_SH6_0x6F 0x0000 +#define ANA2_SET_SH6_0x70 0x0010 + +uint16_t open_3_lianchuang[241] = +{ + ANA1_SET_SH6_0x00, + ANA1_SET_SH6_0x01, + ANA1_SET_SH6_0x02, + ANA1_SET_SH6_0x03, + ANA1_SET_SH6_0x04, + ANA1_SET_SH6_0x05, + ANA1_SET_SH6_0x06, + ANA1_SET_SH6_0x07, + ANA1_SET_SH6_0x08, + ANA1_SET_SH6_0x09, + ANA1_SET_SH6_0x0A, + ANA1_SET_SH6_0x0B, + ANA1_SET_SH6_0x0C, + ANA1_SET_SH6_0x0D, + ANA1_SET_SH6_0x0E, + ANA1_SET_SH6_0x0F, + ANA1_SET_SH6_0x10, + ANA1_SET_SH6_0x11, + ANA1_SET_SH6_0x12, + ANA1_SET_SH6_0x13, + ANA1_SET_SH6_0x14, + ANA1_SET_SH6_0x15, + ANA1_SET_SH6_0x16, + ANA1_SET_SH6_0x17, + ANA1_SET_SH6_0x18, + ANA1_SET_SH6_0x19, + ANA1_SET_SH6_0x1A, + ANA1_SET_SH6_0x1B, + ANA1_SET_SH6_0x1C, + ANA1_SET_SH6_0x1D, + ANA1_SET_SH6_0x1E, + ANA1_SET_SH6_0x1F, + ANA1_SET_SH6_0x20, + ANA1_SET_SH6_0x21, + ANA1_SET_SH6_0x22, + ANA1_SET_SH6_0x23, + ANA1_SET_SH6_0x24, + ANA1_SET_SH6_0x25, + ANA1_SET_SH6_0x26, + ANA1_SET_SH6_0x27, + ANA1_SET_SH6_0x28, + ANA1_SET_SH6_0x29, + ANA1_SET_SH6_0x2A, + ANA1_SET_SH6_0x2B, + ANA1_SET_SH6_0x2C, + ANA1_SET_SH6_0x2D, + ANA1_SET_SH6_0x2E, + ANA1_SET_SH6_0x2F, + ANA1_SET_SH6_0x30, + ANA1_SET_SH6_0x31, + ANA1_SET_SH6_0x32, + ANA1_SET_SH6_0x33, + ANA1_SET_SH6_0x34, + ANA1_SET_SH6_0x35, + ANA1_SET_SH6_0x36, + ANA1_SET_SH6_0x37, + ANA1_SET_SH6_0x38, + ANA1_SET_SH6_0x39, + ANA1_SET_SH6_0x3A, + ANA1_SET_SH6_0x3B, + ANA1_SET_SH6_0x3C, + ANA1_SET_SH6_0x3D, + ANA1_SET_SH6_0x3E, + ANA1_SET_SH6_0x3F, + ANA1_SET_SH6_0x40, + ANA1_SET_SH6_0x41, + ANA1_SET_SH6_0x42, + ANA1_SET_SH6_0x43, + ANA1_SET_SH6_0x44, + ANA1_SET_SH6_0x45, + ANA1_SET_SH6_0x46, + ANA1_SET_SH6_0x47, + ANA1_SET_SH6_0x48, + ANA1_SET_SH6_0x49, + ANA1_SET_SH6_0x4A, + ANA1_SET_SH6_0x4B, + ANA1_SET_SH6_0x4C, + ANA1_SET_SH6_0x4D, + ANA1_SET_SH6_0x4E, + ANA1_SET_SH6_0x4F, + ANA1_SET_SH6_0x50, + ANA1_SET_SH6_0x51, + ANA1_SET_SH6_0x52, + ANA1_SET_SH6_0x53, + ANA1_SET_SH6_0x54, + ANA1_SET_SH6_0x55, + ANA1_SET_SH6_0x56, + ANA1_SET_SH6_0x57, + ANA1_SET_SH6_0x58, + ANA1_SET_SH6_0x59, + ANA1_SET_SH6_0x5A, + ANA1_SET_SH6_0x5B, + ANA1_SET_SH6_0x5C, + ANA1_SET_SH6_0x5D, + ANA1_SET_SH6_0x5E, + ANA1_SET_SH6_0x5F, + ANA1_SET_SH6_0x60, + ANA1_SET_SH6_0x61, + ANA1_SET_SH6_0x62, + ANA1_SET_SH6_0x63, + ANA1_SET_SH6_0x64, + ANA1_SET_SH6_0x65, + ANA1_SET_SH6_0x66, + ANA1_SET_SH6_0x67, + ANA1_SET_SH6_0x68, + ANA1_SET_SH6_0x69, + ANA1_SET_SH6_0x6A, + ANA1_SET_SH6_0x6B, + ANA1_SET_SH6_0x6C, + ANA1_SET_SH6_0x6D, + ANA1_SET_SH6_0x6E, + ANA1_SET_SH6_0x6F, + ANA1_SET_SH6_0x70, + ANA1_SET_SH6_0x71, + ANA1_SET_SH6_0x72, + ANA1_SET_SH6_0x73, + ANA1_SET_SH6_0x74, + ANA1_SET_SH6_0x75, + ANA1_SET_SH6_0x76, + ANA1_SET_SH6_0x77, + ANA1_SET_SH6_0x78, + ANA1_SET_SH6_0x79, + ANA1_SET_SH6_0x7A, + ANA1_SET_SH6_0x7B, + ANA1_SET_SH6_0x7C, + ANA1_SET_SH6_0x7D, + ANA1_SET_SH6_0x7E, + ANA1_SET_SH6_0x7F, +//ANA2 + ANA2_SET_SH6_0x00, + ANA2_SET_SH6_0x01, + ANA2_SET_SH6_0x02, + ANA2_SET_SH6_0x03, + ANA2_SET_SH6_0x04, + ANA2_SET_SH6_0x05, + ANA2_SET_SH6_0x06, + ANA2_SET_SH6_0x07, + ANA2_SET_SH6_0x08, + ANA2_SET_SH6_0x09, + ANA2_SET_SH6_0x0A, + ANA2_SET_SH6_0x0B, + ANA2_SET_SH6_0x0C, + ANA2_SET_SH6_0x0D, + ANA2_SET_SH6_0x0E, + ANA2_SET_SH6_0x0F, + ANA2_SET_SH6_0x10, + ANA2_SET_SH6_0x11, + ANA2_SET_SH6_0x12, + ANA2_SET_SH6_0x13, + ANA2_SET_SH6_0x14, + ANA2_SET_SH6_0x15, + ANA2_SET_SH6_0x16, + ANA2_SET_SH6_0x17, + ANA2_SET_SH6_0x18, + ANA2_SET_SH6_0x19, + ANA2_SET_SH6_0x1A, + ANA2_SET_SH6_0x1B, + ANA2_SET_SH6_0x1C, + ANA2_SET_SH6_0x1D, + ANA2_SET_SH6_0x1E, + ANA2_SET_SH6_0x1F, + ANA2_SET_SH6_0x20, + ANA2_SET_SH6_0x21, + ANA2_SET_SH6_0x22, + ANA2_SET_SH6_0x23, + ANA2_SET_SH6_0x24, + ANA2_SET_SH6_0x25, + ANA2_SET_SH6_0x26, + ANA2_SET_SH6_0x27, + ANA2_SET_SH6_0x28, + ANA2_SET_SH6_0x29, + ANA2_SET_SH6_0x2A, + ANA2_SET_SH6_0x2B, + ANA2_SET_SH6_0x2C, + ANA2_SET_SH6_0x2D, + ANA2_SET_SH6_0x2E, + ANA2_SET_SH6_0x2F, + ANA2_SET_SH6_0x30, + ANA2_SET_SH6_0x31, + ANA2_SET_SH6_0x32, + ANA2_SET_SH6_0x33, + ANA2_SET_SH6_0x34, + ANA2_SET_SH6_0x35, + ANA2_SET_SH6_0x36, + ANA2_SET_SH6_0x37, + ANA2_SET_SH6_0x38, + ANA2_SET_SH6_0x39, + ANA2_SET_SH6_0x3A, + ANA2_SET_SH6_0x3B, + ANA2_SET_SH6_0x3C, + ANA2_SET_SH6_0x3D, + ANA2_SET_SH6_0x3E, + ANA2_SET_SH6_0x3F, + ANA2_SET_SH6_0x40, + ANA2_SET_SH6_0x41, + ANA2_SET_SH6_0x42, + ANA2_SET_SH6_0x43, + ANA2_SET_SH6_0x44, + ANA2_SET_SH6_0x45, + ANA2_SET_SH6_0x46, + ANA2_SET_SH6_0x47, + ANA2_SET_SH6_0x48, + ANA2_SET_SH6_0x49, + ANA2_SET_SH6_0x4A, + ANA2_SET_SH6_0x4B, + ANA2_SET_SH6_0x4C, + ANA2_SET_SH6_0x4D, + ANA2_SET_SH6_0x4E, + ANA2_SET_SH6_0x4F, + ANA2_SET_SH6_0x50, + ANA2_SET_SH6_0x51, + ANA2_SET_SH6_0x52, + ANA2_SET_SH6_0x53, + ANA2_SET_SH6_0x54, + ANA2_SET_SH6_0x55, + ANA2_SET_SH6_0x56, + ANA2_SET_SH6_0x57, + ANA2_SET_SH6_0x58, + ANA2_SET_SH6_0x59, + ANA2_SET_SH6_0x5A, + ANA2_SET_SH6_0x5B, + ANA2_SET_SH6_0x5C, + ANA2_SET_SH6_0x5D, + ANA2_SET_SH6_0x5E, + ANA2_SET_SH6_0x5F, + ANA2_SET_SH6_0x60, + ANA2_SET_SH6_0x61, + ANA2_SET_SH6_0x62, + ANA2_SET_SH6_0x63, + ANA2_SET_SH6_0x64, + ANA2_SET_SH6_0x65, + ANA2_SET_SH6_0x66, + ANA2_SET_SH6_0x67, + ANA2_SET_SH6_0x68, + ANA2_SET_SH6_0x69, + ANA2_SET_SH6_0x6A, + ANA2_SET_SH6_0x6B, + ANA2_SET_SH6_0x6C, + ANA2_SET_SH6_0x6D, + ANA2_SET_SH6_0x6E, + ANA2_SET_SH6_0x6F, + ANA2_SET_SH6_0x70, + +}; \ No newline at end of file diff --git a/drivers/input/touchscreen/jornada720_ts.c b/drivers/input/touchscreen/jornada720_ts.c new file mode 100644 index 00000000..282d7c7a --- /dev/null +++ b/drivers/input/touchscreen/jornada720_ts.c @@ -0,0 +1,177 @@ +/* + * drivers/input/touchscreen/jornada720_ts.c + * + * Copyright (C) 2007 Kristoffer Ericson + * + * Copyright (C) 2006 Filip Zyzniewski + * based on HP Jornada 56x touchscreen driver by Alex Lange + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * HP Jornada 710/720/729 Touchscreen Driver + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +MODULE_AUTHOR("Kristoffer Ericson "); +MODULE_DESCRIPTION("HP Jornada 710/720/728 touchscreen driver"); +MODULE_LICENSE("GPL v2"); + +struct jornada_ts { + struct input_dev *dev; + int x_data[4]; /* X sample values */ + int y_data[4]; /* Y sample values */ +}; + +static void jornada720_ts_collect_data(struct jornada_ts *jornada_ts) +{ + + /* 3 low word X samples */ + jornada_ts->x_data[0] = jornada_ssp_byte(TXDUMMY); + jornada_ts->x_data[1] = jornada_ssp_byte(TXDUMMY); + jornada_ts->x_data[2] = jornada_ssp_byte(TXDUMMY); + + /* 3 low word Y samples */ + jornada_ts->y_data[0] = jornada_ssp_byte(TXDUMMY); + jornada_ts->y_data[1] = jornada_ssp_byte(TXDUMMY); + jornada_ts->y_data[2] = jornada_ssp_byte(TXDUMMY); + + /* combined x samples bits */ + jornada_ts->x_data[3] = jornada_ssp_byte(TXDUMMY); + + /* combined y samples bits */ + jornada_ts->y_data[3] = jornada_ssp_byte(TXDUMMY); +} + +static int jornada720_ts_average(int coords[4]) +{ + int coord, high_bits = coords[3]; + + coord = coords[0] | ((high_bits & 0x03) << 8); + coord += coords[1] | ((high_bits & 0x0c) << 6); + coord += coords[2] | ((high_bits & 0x30) << 4); + + return coord / 3; +} + +static irqreturn_t jornada720_ts_interrupt(int irq, void *dev_id) +{ + struct platform_device *pdev = dev_id; + struct jornada_ts *jornada_ts = platform_get_drvdata(pdev); + struct input_dev *input = jornada_ts->dev; + int x, y; + + /* If GPIO_GPIO9 is set to high then report pen up */ + if (GPLR & GPIO_GPIO(9)) { + input_report_key(input, BTN_TOUCH, 0); + input_sync(input); + } else { + jornada_ssp_start(); + + /* proper reply to request is always TXDUMMY */ + if (jornada_ssp_inout(GETTOUCHSAMPLES) == TXDUMMY) { + jornada720_ts_collect_data(jornada_ts); + + x = jornada720_ts_average(jornada_ts->x_data); + y = jornada720_ts_average(jornada_ts->y_data); + + input_report_key(input, BTN_TOUCH, 1); + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + input_sync(input); + } + + jornada_ssp_end(); + } + + return IRQ_HANDLED; +} + +static int jornada720_ts_probe(struct platform_device *pdev) +{ + struct jornada_ts *jornada_ts; + struct input_dev *input_dev; + int error; + + jornada_ts = kzalloc(sizeof(struct jornada_ts), GFP_KERNEL); + input_dev = input_allocate_device(); + + if (!jornada_ts || !input_dev) { + error = -ENOMEM; + goto fail1; + } + + platform_set_drvdata(pdev, jornada_ts); + + jornada_ts->dev = input_dev; + + input_dev->name = "HP Jornada 7xx Touchscreen"; + input_dev->phys = "jornadats/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = &pdev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, 270, 3900, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 180, 3700, 0, 0); + + error = request_irq(IRQ_GPIO9, + jornada720_ts_interrupt, + IRQF_TRIGGER_RISING, + "HP7XX Touchscreen driver", pdev); + if (error) { + printk(KERN_INFO "HP7XX TS : Unable to acquire irq!\n"); + goto fail1; + } + + error = input_register_device(jornada_ts->dev); + if (error) + goto fail2; + + return 0; + + fail2: + free_irq(IRQ_GPIO9, pdev); + fail1: + platform_set_drvdata(pdev, NULL); + input_free_device(input_dev); + kfree(jornada_ts); + return error; +} + +static int jornada720_ts_remove(struct platform_device *pdev) +{ + struct jornada_ts *jornada_ts = platform_get_drvdata(pdev); + + free_irq(IRQ_GPIO9, pdev); + platform_set_drvdata(pdev, NULL); + input_unregister_device(jornada_ts->dev); + kfree(jornada_ts); + + return 0; +} + +/* work with hotplug and coldplug */ +MODULE_ALIAS("platform:jornada_ts"); + +static struct platform_driver jornada720_ts_driver = { + .probe = jornada720_ts_probe, + .remove = jornada720_ts_remove, + .driver = { + .name = "jornada_ts", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(jornada720_ts_driver); diff --git a/drivers/input/touchscreen/lpc32xx_ts.c b/drivers/input/touchscreen/lpc32xx_ts.c new file mode 100644 index 00000000..9101ee52 --- /dev/null +++ b/drivers/input/touchscreen/lpc32xx_ts.c @@ -0,0 +1,410 @@ +/* + * LPC32xx built-in touchscreen driver + * + * Copyright (C) 2010 NXP Semiconductors + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Touchscreen controller register offsets + */ +#define LPC32XX_TSC_STAT 0x00 +#define LPC32XX_TSC_SEL 0x04 +#define LPC32XX_TSC_CON 0x08 +#define LPC32XX_TSC_FIFO 0x0C +#define LPC32XX_TSC_DTR 0x10 +#define LPC32XX_TSC_RTR 0x14 +#define LPC32XX_TSC_UTR 0x18 +#define LPC32XX_TSC_TTR 0x1C +#define LPC32XX_TSC_DXP 0x20 +#define LPC32XX_TSC_MIN_X 0x24 +#define LPC32XX_TSC_MAX_X 0x28 +#define LPC32XX_TSC_MIN_Y 0x2C +#define LPC32XX_TSC_MAX_Y 0x30 +#define LPC32XX_TSC_AUX_UTR 0x34 +#define LPC32XX_TSC_AUX_MIN 0x38 +#define LPC32XX_TSC_AUX_MAX 0x3C + +#define LPC32XX_TSC_STAT_FIFO_OVRRN (1 << 8) +#define LPC32XX_TSC_STAT_FIFO_EMPTY (1 << 7) + +#define LPC32XX_TSC_SEL_DEFVAL 0x0284 + +#define LPC32XX_TSC_ADCCON_IRQ_TO_FIFO_4 (0x1 << 11) +#define LPC32XX_TSC_ADCCON_X_SAMPLE_SIZE(s) ((10 - (s)) << 7) +#define LPC32XX_TSC_ADCCON_Y_SAMPLE_SIZE(s) ((10 - (s)) << 4) +#define LPC32XX_TSC_ADCCON_POWER_UP (1 << 2) +#define LPC32XX_TSC_ADCCON_AUTO_EN (1 << 0) + +#define LPC32XX_TSC_FIFO_TS_P_LEVEL (1 << 31) +#define LPC32XX_TSC_FIFO_NORMALIZE_X_VAL(x) (((x) & 0x03FF0000) >> 16) +#define LPC32XX_TSC_FIFO_NORMALIZE_Y_VAL(y) ((y) & 0x000003FF) + +#define LPC32XX_TSC_ADCDAT_VALUE_MASK 0x000003FF + +#define LPC32XX_TSC_MIN_XY_VAL 0x0 +#define LPC32XX_TSC_MAX_XY_VAL 0x3FF + +#define MOD_NAME "ts-lpc32xx" + +#define tsc_readl(dev, reg) \ + __raw_readl((dev)->tsc_base + (reg)) +#define tsc_writel(dev, reg, val) \ + __raw_writel((val), (dev)->tsc_base + (reg)) + +struct lpc32xx_tsc { + struct input_dev *dev; + void __iomem *tsc_base; + int irq; + struct clk *clk; +}; + +static void lpc32xx_fifo_clear(struct lpc32xx_tsc *tsc) +{ + while (!(tsc_readl(tsc, LPC32XX_TSC_STAT) & + LPC32XX_TSC_STAT_FIFO_EMPTY)) + tsc_readl(tsc, LPC32XX_TSC_FIFO); +} + +static irqreturn_t lpc32xx_ts_interrupt(int irq, void *dev_id) +{ + u32 tmp, rv[4], xs[4], ys[4]; + int idx; + struct lpc32xx_tsc *tsc = dev_id; + struct input_dev *input = tsc->dev; + + tmp = tsc_readl(tsc, LPC32XX_TSC_STAT); + + if (tmp & LPC32XX_TSC_STAT_FIFO_OVRRN) { + /* FIFO overflow - throw away samples */ + lpc32xx_fifo_clear(tsc); + return IRQ_HANDLED; + } + + /* + * Gather and normalize 4 samples. Pen-up events may have less + * than 4 samples, but its ok to pop 4 and let the last sample + * pen status check drop the samples. + */ + idx = 0; + while (idx < 4 && + !(tsc_readl(tsc, LPC32XX_TSC_STAT) & + LPC32XX_TSC_STAT_FIFO_EMPTY)) { + tmp = tsc_readl(tsc, LPC32XX_TSC_FIFO); + xs[idx] = LPC32XX_TSC_ADCDAT_VALUE_MASK - + LPC32XX_TSC_FIFO_NORMALIZE_X_VAL(tmp); + ys[idx] = LPC32XX_TSC_ADCDAT_VALUE_MASK - + LPC32XX_TSC_FIFO_NORMALIZE_Y_VAL(tmp); + rv[idx] = tmp; + idx++; + } + + /* Data is only valid if pen is still down in last sample */ + if (!(rv[3] & LPC32XX_TSC_FIFO_TS_P_LEVEL) && idx == 4) { + /* Use average of 2nd and 3rd sample for position */ + input_report_abs(input, ABS_X, (xs[1] + xs[2]) / 2); + input_report_abs(input, ABS_Y, (ys[1] + ys[2]) / 2); + input_report_key(input, BTN_TOUCH, 1); + } else { + input_report_key(input, BTN_TOUCH, 0); + } + + input_sync(input); + + return IRQ_HANDLED; +} + +static void lpc32xx_stop_tsc(struct lpc32xx_tsc *tsc) +{ + /* Disable auto mode */ + tsc_writel(tsc, LPC32XX_TSC_CON, + tsc_readl(tsc, LPC32XX_TSC_CON) & + ~LPC32XX_TSC_ADCCON_AUTO_EN); + + clk_disable(tsc->clk); +} + +static void lpc32xx_setup_tsc(struct lpc32xx_tsc *tsc) +{ + u32 tmp; + + clk_enable(tsc->clk); + + tmp = tsc_readl(tsc, LPC32XX_TSC_CON) & ~LPC32XX_TSC_ADCCON_POWER_UP; + + /* Set the TSC FIFO depth to 4 samples @ 10-bits per sample (max) */ + tmp = LPC32XX_TSC_ADCCON_IRQ_TO_FIFO_4 | + LPC32XX_TSC_ADCCON_X_SAMPLE_SIZE(10) | + LPC32XX_TSC_ADCCON_Y_SAMPLE_SIZE(10); + tsc_writel(tsc, LPC32XX_TSC_CON, tmp); + + /* These values are all preset */ + tsc_writel(tsc, LPC32XX_TSC_SEL, LPC32XX_TSC_SEL_DEFVAL); + tsc_writel(tsc, LPC32XX_TSC_MIN_X, LPC32XX_TSC_MIN_XY_VAL); + tsc_writel(tsc, LPC32XX_TSC_MAX_X, LPC32XX_TSC_MAX_XY_VAL); + tsc_writel(tsc, LPC32XX_TSC_MIN_Y, LPC32XX_TSC_MIN_XY_VAL); + tsc_writel(tsc, LPC32XX_TSC_MAX_Y, LPC32XX_TSC_MAX_XY_VAL); + + /* Aux support is not used */ + tsc_writel(tsc, LPC32XX_TSC_AUX_UTR, 0); + tsc_writel(tsc, LPC32XX_TSC_AUX_MIN, 0); + tsc_writel(tsc, LPC32XX_TSC_AUX_MAX, 0); + + /* + * Set sample rate to about 240Hz per X/Y pair. A single measurement + * consists of 4 pairs which gives about a 60Hz sample rate based on + * a stable 32768Hz clock source. Values are in clocks. + * Rate is (32768 / (RTR + XCONV + RTR + YCONV + DXP + TTR + UTR) / 4 + */ + tsc_writel(tsc, LPC32XX_TSC_RTR, 0x2); + tsc_writel(tsc, LPC32XX_TSC_DTR, 0x2); + tsc_writel(tsc, LPC32XX_TSC_TTR, 0x10); + tsc_writel(tsc, LPC32XX_TSC_DXP, 0x4); + tsc_writel(tsc, LPC32XX_TSC_UTR, 88); + + lpc32xx_fifo_clear(tsc); + + /* Enable automatic ts event capture */ + tsc_writel(tsc, LPC32XX_TSC_CON, tmp | LPC32XX_TSC_ADCCON_AUTO_EN); +} + +static int lpc32xx_ts_open(struct input_dev *dev) +{ + struct lpc32xx_tsc *tsc = input_get_drvdata(dev); + + lpc32xx_setup_tsc(tsc); + + return 0; +} + +static void lpc32xx_ts_close(struct input_dev *dev) +{ + struct lpc32xx_tsc *tsc = input_get_drvdata(dev); + + lpc32xx_stop_tsc(tsc); +} + +static int lpc32xx_ts_probe(struct platform_device *pdev) +{ + struct lpc32xx_tsc *tsc; + struct input_dev *input; + struct resource *res; + resource_size_t size; + int irq; + int error; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(&pdev->dev, "Can't get memory resource\n"); + return -ENOENT; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "Can't get interrupt resource\n"); + return irq; + } + + tsc = kzalloc(sizeof(*tsc), GFP_KERNEL); + input = input_allocate_device(); + if (!tsc || !input) { + dev_err(&pdev->dev, "failed allocating memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + tsc->dev = input; + tsc->irq = irq; + + size = resource_size(res); + + if (!request_mem_region(res->start, size, pdev->name)) { + dev_err(&pdev->dev, "TSC registers are not free\n"); + error = -EBUSY; + goto err_free_mem; + } + + tsc->tsc_base = ioremap(res->start, size); + if (!tsc->tsc_base) { + dev_err(&pdev->dev, "Can't map memory\n"); + error = -ENOMEM; + goto err_release_mem; + } + + tsc->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(tsc->clk)) { + dev_err(&pdev->dev, "failed getting clock\n"); + error = PTR_ERR(tsc->clk); + goto err_unmap; + } + + input->name = MOD_NAME; + input->phys = "lpc32xx/input0"; + input->id.bustype = BUS_HOST; + input->id.vendor = 0x0001; + input->id.product = 0x0002; + input->id.version = 0x0100; + input->dev.parent = &pdev->dev; + input->open = lpc32xx_ts_open; + input->close = lpc32xx_ts_close; + + input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(input, ABS_X, LPC32XX_TSC_MIN_XY_VAL, + LPC32XX_TSC_MAX_XY_VAL, 0, 0); + input_set_abs_params(input, ABS_Y, LPC32XX_TSC_MIN_XY_VAL, + LPC32XX_TSC_MAX_XY_VAL, 0, 0); + + input_set_drvdata(input, tsc); + + error = request_irq(tsc->irq, lpc32xx_ts_interrupt, + 0, pdev->name, tsc); + if (error) { + dev_err(&pdev->dev, "failed requesting interrupt\n"); + goto err_put_clock; + } + + error = input_register_device(input); + if (error) { + dev_err(&pdev->dev, "failed registering input device\n"); + goto err_free_irq; + } + + platform_set_drvdata(pdev, tsc); + device_init_wakeup(&pdev->dev, 1); + + return 0; + +err_free_irq: + free_irq(tsc->irq, tsc); +err_put_clock: + clk_put(tsc->clk); +err_unmap: + iounmap(tsc->tsc_base); +err_release_mem: + release_mem_region(res->start, size); +err_free_mem: + input_free_device(input); + kfree(tsc); + + return error; +} + +static int lpc32xx_ts_remove(struct platform_device *pdev) +{ + struct lpc32xx_tsc *tsc = platform_get_drvdata(pdev); + struct resource *res; + + device_init_wakeup(&pdev->dev, 0); + free_irq(tsc->irq, tsc); + + input_unregister_device(tsc->dev); + + clk_put(tsc->clk); + + iounmap(tsc->tsc_base); + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); + + kfree(tsc); + + return 0; +} + +#ifdef CONFIG_PM +static int lpc32xx_ts_suspend(struct device *dev) +{ + struct lpc32xx_tsc *tsc = dev_get_drvdata(dev); + struct input_dev *input = tsc->dev; + + /* + * Suspend and resume can be called when the device hasn't been + * enabled. If there are no users that have the device open, then + * avoid calling the TSC stop and start functions as the TSC + * isn't yet clocked. + */ + mutex_lock(&input->mutex); + + if (input->users) { + if (device_may_wakeup(dev)) + enable_irq_wake(tsc->irq); + else + lpc32xx_stop_tsc(tsc); + } + + mutex_unlock(&input->mutex); + + return 0; +} + +static int lpc32xx_ts_resume(struct device *dev) +{ + struct lpc32xx_tsc *tsc = dev_get_drvdata(dev); + struct input_dev *input = tsc->dev; + + mutex_lock(&input->mutex); + + if (input->users) { + if (device_may_wakeup(dev)) + disable_irq_wake(tsc->irq); + else + lpc32xx_setup_tsc(tsc); + } + + mutex_unlock(&input->mutex); + + return 0; +} + +static const struct dev_pm_ops lpc32xx_ts_pm_ops = { + .suspend = lpc32xx_ts_suspend, + .resume = lpc32xx_ts_resume, +}; +#define LPC32XX_TS_PM_OPS (&lpc32xx_ts_pm_ops) +#else +#define LPC32XX_TS_PM_OPS NULL +#endif + +#ifdef CONFIG_OF +static struct of_device_id lpc32xx_tsc_of_match[] = { + { .compatible = "nxp,lpc3220-tsc", }, + { }, +}; +MODULE_DEVICE_TABLE(of, lpc32xx_tsc_of_match); +#endif + +static struct platform_driver lpc32xx_ts_driver = { + .probe = lpc32xx_ts_probe, + .remove = lpc32xx_ts_remove, + .driver = { + .name = MOD_NAME, + .owner = THIS_MODULE, + .pm = LPC32XX_TS_PM_OPS, + .of_match_table = of_match_ptr(lpc32xx_tsc_of_match), + }, +}; +module_platform_driver(lpc32xx_ts_driver); + +MODULE_AUTHOR("Kevin Wells + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * Notes: + * This is a wm97xx extended touch driver to capture touch + * data in a continuous manner on the Intel XScale architecture + * + * Features: + * - codecs supported:- WM9705, WM9712, WM9713 + * - processors supported:- Intel XScale PXA25x, PXA26x, PXA27x + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +struct continuous { + u16 id; /* codec id */ + u8 code; /* continuous code */ + u8 reads; /* number of coord reads per read cycle */ + u32 speed; /* number of coords per second */ +}; + +#define WM_READS(sp) ((sp / HZ) + 1) + +static const struct continuous cinfo[] = { + {WM9705_ID2, 0, WM_READS(94), 94}, + {WM9705_ID2, 1, WM_READS(188), 188}, + {WM9705_ID2, 2, WM_READS(375), 375}, + {WM9705_ID2, 3, WM_READS(750), 750}, + {WM9712_ID2, 0, WM_READS(94), 94}, + {WM9712_ID2, 1, WM_READS(188), 188}, + {WM9712_ID2, 2, WM_READS(375), 375}, + {WM9712_ID2, 3, WM_READS(750), 750}, + {WM9713_ID2, 0, WM_READS(94), 94}, + {WM9713_ID2, 1, WM_READS(120), 120}, + {WM9713_ID2, 2, WM_READS(154), 154}, + {WM9713_ID2, 3, WM_READS(188), 188}, +}; + +/* continuous speed index */ +static int sp_idx; +static u16 last, tries; +static int irq; + +/* + * Pen sampling frequency (Hz) in continuous mode. + */ +static int cont_rate = 200; +module_param(cont_rate, int, 0); +MODULE_PARM_DESC(cont_rate, "Sampling rate in continuous mode (Hz)"); + +/* + * Pen down detection. + * + * This driver can either poll or use an interrupt to indicate a pen down + * event. If the irq request fails then it will fall back to polling mode. + */ +static int pen_int; +module_param(pen_int, int, 0); +MODULE_PARM_DESC(pen_int, "Pen down detection (1 = interrupt, 0 = polling)"); + +/* + * Pressure readback. + * + * Set to 1 to read back pen down pressure + */ +static int pressure; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Pressure readback (1 = pressure, 0 = no pressure)"); + +/* + * AC97 touch data slot. + * + * Touch screen readback data ac97 slot + */ +static int ac97_touch_slot = 5; +module_param(ac97_touch_slot, int, 0); +MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number"); + + +/* flush AC97 slot 5 FIFO on pxa machines */ +#ifdef CONFIG_PXA27x +static void wm97xx_acc_pen_up(struct wm97xx *wm) +{ + schedule_timeout_uninterruptible(1); + + while (MISR & (1 << 2)) + MODR; +} +#else +static void wm97xx_acc_pen_up(struct wm97xx *wm) +{ + unsigned int count; + + schedule_timeout_uninterruptible(1); + + for (count = 0; count < 16; count++) + MODR; +} +#endif + +static int wm97xx_acc_pen_down(struct wm97xx *wm) +{ + u16 x, y, p = 0x100 | WM97XX_ADCSEL_PRES; + int reads = 0; + + /* When the AC97 queue has been drained we need to allow time + * to buffer up samples otherwise we end up spinning polling + * for samples. The controller can't have a suitably low + * threshold set to use the notifications it gives. + */ + schedule_timeout_uninterruptible(1); + + if (tries > 5) { + tries = 0; + return RC_PENUP; + } + + x = MODR; + if (x == last) { + tries++; + return RC_AGAIN; + } + last = x; + do { + if (reads) + x = MODR; + y = MODR; + if (pressure) + p = MODR; + + dev_dbg(wm->dev, "Raw coordinates: x=%x, y=%x, p=%x\n", + x, y, p); + + /* are samples valid */ + if ((x & WM97XX_ADCSEL_MASK) != WM97XX_ADCSEL_X || + (y & WM97XX_ADCSEL_MASK) != WM97XX_ADCSEL_Y || + (p & WM97XX_ADCSEL_MASK) != WM97XX_ADCSEL_PRES) + goto up; + + /* coordinate is good */ + tries = 0; + input_report_abs(wm->input_dev, ABS_X, x & 0xfff); + input_report_abs(wm->input_dev, ABS_Y, y & 0xfff); + input_report_abs(wm->input_dev, ABS_PRESSURE, p & 0xfff); + input_report_key(wm->input_dev, BTN_TOUCH, (p != 0)); + input_sync(wm->input_dev); + reads++; + } while (reads < cinfo[sp_idx].reads); +up: + return RC_PENDOWN | RC_AGAIN; +} + +static int wm97xx_acc_startup(struct wm97xx *wm) +{ + int idx = 0, ret = 0; + + /* check we have a codec */ + if (wm->ac97 == NULL) + return -ENODEV; + + /* Go you big red fire engine */ + for (idx = 0; idx < ARRAY_SIZE(cinfo); idx++) { + if (wm->id != cinfo[idx].id) + continue; + sp_idx = idx; + if (cont_rate <= cinfo[idx].speed) + break; + } + wm->acc_rate = cinfo[sp_idx].code; + wm->acc_slot = ac97_touch_slot; + dev_info(wm->dev, + "mainstone accelerated touchscreen driver, %d samples/sec\n", + cinfo[sp_idx].speed); + + /* IRQ driven touchscreen is used on Palm hardware */ + if (machine_is_palmt5() || machine_is_palmtx() || machine_is_palmld()) { + pen_int = 1; + irq = 27; + /* There is some obscure mutant of WM9712 interbred with WM9713 + * used on Palm HW */ + wm->variant = WM97xx_WM1613; + } else if (machine_is_mainstone() && pen_int) + irq = 4; + + if (irq) { + ret = gpio_request(irq, "Touchscreen IRQ"); + if (ret) + goto out; + + ret = gpio_direction_input(irq); + if (ret) { + gpio_free(irq); + goto out; + } + + wm->pen_irq = gpio_to_irq(irq); + irq_set_irq_type(wm->pen_irq, IRQ_TYPE_EDGE_BOTH); + } else /* pen irq not supported */ + pen_int = 0; + + /* codec specific irq config */ + if (pen_int) { + switch (wm->id) { + case WM9705_ID2: + break; + case WM9712_ID2: + case WM9713_ID2: + /* use PEN_DOWN GPIO 13 to assert IRQ on GPIO line 2 */ + wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_STICKY, + WM97XX_GPIO_WAKE); + wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_NOTSTICKY, + WM97XX_GPIO_NOWAKE); + break; + default: + dev_err(wm->dev, + "pen down irq not supported on this device\n"); + pen_int = 0; + break; + } + } + +out: + return ret; +} + +static void wm97xx_acc_shutdown(struct wm97xx *wm) +{ + /* codec specific deconfig */ + if (pen_int) { + if (irq) + gpio_free(irq); + wm->pen_irq = 0; + } +} + +static void wm97xx_irq_enable(struct wm97xx *wm, int enable) +{ + if (enable) + enable_irq(wm->pen_irq); + else + disable_irq_nosync(wm->pen_irq); +} + +static struct wm97xx_mach_ops mainstone_mach_ops = { + .acc_enabled = 1, + .acc_pen_up = wm97xx_acc_pen_up, + .acc_pen_down = wm97xx_acc_pen_down, + .acc_startup = wm97xx_acc_startup, + .acc_shutdown = wm97xx_acc_shutdown, + .irq_enable = wm97xx_irq_enable, + .irq_gpio = WM97XX_GPIO_2, +}; + +static int mainstone_wm97xx_probe(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + + return wm97xx_register_mach_ops(wm, &mainstone_mach_ops); +} + +static int mainstone_wm97xx_remove(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + + wm97xx_unregister_mach_ops(wm); + return 0; +} + +static struct platform_driver mainstone_wm97xx_driver = { + .probe = mainstone_wm97xx_probe, + .remove = mainstone_wm97xx_remove, + .driver = { + .name = "wm97xx-touch", + }, +}; +module_platform_driver(mainstone_wm97xx_driver); + +/* Module information */ +MODULE_AUTHOR("Liam Girdwood "); +MODULE_DESCRIPTION("wm97xx continuous touch driver for mainstone"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/max11801_ts.c b/drivers/input/touchscreen/max11801_ts.c new file mode 100644 index 00000000..00bc6caa --- /dev/null +++ b/drivers/input/touchscreen/max11801_ts.c @@ -0,0 +1,262 @@ +/* + * Driver for MAXI MAX11801 - A Resistive touch screen controller with + * i2c interface + * + * Copyright (C) 2011 Freescale Semiconductor, Inc. + * Author: Zhang Jiejing + * + * Based on mcs5000_ts.c + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + */ + +/* + * This driver aims to support the series of MAXI touch chips max11801 + * through max11803. The main difference between these 4 chips can be + * found in the table below: + * ----------------------------------------------------- + * | CHIP | AUTO MODE SUPPORT(FIFO) | INTERFACE | + * |----------------------------------------------------| + * | max11800 | YES | SPI | + * | max11801 | YES | I2C | + * | max11802 | NO | SPI | + * | max11803 | NO | I2C | + * ------------------------------------------------------ + * + * Currently, this driver only supports max11801. + * + * Data Sheet: + * http://www.maxim-ic.com/datasheet/index.mvp/id/5943 + */ + +#include +#include +#include +#include +#include +#include +#include + +/* Register Address define */ +#define GENERNAL_STATUS_REG 0x00 +#define GENERNAL_CONF_REG 0x01 +#define MESURE_RES_CONF_REG 0x02 +#define MESURE_AVER_CONF_REG 0x03 +#define ADC_SAMPLE_TIME_CONF_REG 0x04 +#define PANEL_SETUPTIME_CONF_REG 0x05 +#define DELAY_CONVERSION_CONF_REG 0x06 +#define TOUCH_DETECT_PULLUP_CONF_REG 0x07 +#define AUTO_MODE_TIME_CONF_REG 0x08 /* only for max11800/max11801 */ +#define APERTURE_CONF_REG 0x09 /* only for max11800/max11801 */ +#define AUX_MESURE_CONF_REG 0x0a +#define OP_MODE_CONF_REG 0x0b + +/* FIFO is found only in max11800 and max11801 */ +#define FIFO_RD_CMD (0x50 << 1) +#define MAX11801_FIFO_INT (1 << 2) +#define MAX11801_FIFO_OVERFLOW (1 << 3) + +#define XY_BUFSIZE 4 +#define XY_BUF_OFFSET 4 + +#define MAX11801_MAX_X 0xfff +#define MAX11801_MAX_Y 0xfff + +#define MEASURE_TAG_OFFSET 2 +#define MEASURE_TAG_MASK (3 << MEASURE_TAG_OFFSET) +#define EVENT_TAG_OFFSET 0 +#define EVENT_TAG_MASK (3 << EVENT_TAG_OFFSET) +#define MEASURE_X_TAG (0 << MEASURE_TAG_OFFSET) +#define MEASURE_Y_TAG (1 << MEASURE_TAG_OFFSET) + +/* These are the state of touch event state machine */ +enum { + EVENT_INIT, + EVENT_MIDDLE, + EVENT_RELEASE, + EVENT_FIFO_END +}; + +struct max11801_data { + struct i2c_client *client; + struct input_dev *input_dev; +}; + +static u8 read_register(struct i2c_client *client, int addr) +{ + /* XXX: The chip ignores LSB of register address */ + return i2c_smbus_read_byte_data(client, addr << 1); +} + +static int max11801_write_reg(struct i2c_client *client, int addr, int data) +{ + /* XXX: The chip ignores LSB of register address */ + return i2c_smbus_write_byte_data(client, addr << 1, data); +} + +static irqreturn_t max11801_ts_interrupt(int irq, void *dev_id) +{ + struct max11801_data *data = dev_id; + struct i2c_client *client = data->client; + int status, i, ret; + u8 buf[XY_BUFSIZE]; + int x = -1; + int y = -1; + + status = read_register(data->client, GENERNAL_STATUS_REG); + + if (status & (MAX11801_FIFO_INT | MAX11801_FIFO_OVERFLOW)) { + status = read_register(data->client, GENERNAL_STATUS_REG); + + ret = i2c_smbus_read_i2c_block_data(client, FIFO_RD_CMD, + XY_BUFSIZE, buf); + + /* + * We should get 4 bytes buffer that contains X,Y + * and event tag + */ + if (ret < XY_BUFSIZE) + goto out; + + for (i = 0; i < XY_BUFSIZE; i += XY_BUFSIZE / 2) { + if ((buf[i + 1] & MEASURE_TAG_MASK) == MEASURE_X_TAG) + x = (buf[i] << XY_BUF_OFFSET) + + (buf[i + 1] >> XY_BUF_OFFSET); + else if ((buf[i + 1] & MEASURE_TAG_MASK) == MEASURE_Y_TAG) + y = (buf[i] << XY_BUF_OFFSET) + + (buf[i + 1] >> XY_BUF_OFFSET); + } + + if ((buf[1] & EVENT_TAG_MASK) != (buf[3] & EVENT_TAG_MASK)) + goto out; + + switch (buf[1] & EVENT_TAG_MASK) { + case EVENT_INIT: + /* fall through */ + case EVENT_MIDDLE: + input_report_abs(data->input_dev, ABS_X, x); + input_report_abs(data->input_dev, ABS_Y, y); + input_event(data->input_dev, EV_KEY, BTN_TOUCH, 1); + input_sync(data->input_dev); + break; + + case EVENT_RELEASE: + input_event(data->input_dev, EV_KEY, BTN_TOUCH, 0); + input_sync(data->input_dev); + break; + + case EVENT_FIFO_END: + break; + } + } +out: + return IRQ_HANDLED; +} + +static void max11801_ts_phy_init(struct max11801_data *data) +{ + struct i2c_client *client = data->client; + + /* Average X,Y, take 16 samples, average eight media sample */ + max11801_write_reg(client, MESURE_AVER_CONF_REG, 0xff); + /* X,Y panel setup time set to 20us */ + max11801_write_reg(client, PANEL_SETUPTIME_CONF_REG, 0x11); + /* Rough pullup time (2uS), Fine pullup time (10us) */ + max11801_write_reg(client, TOUCH_DETECT_PULLUP_CONF_REG, 0x10); + /* Auto mode init period = 5ms , scan period = 5ms*/ + max11801_write_reg(client, AUTO_MODE_TIME_CONF_REG, 0xaa); + /* Aperture X,Y set to +- 4LSB */ + max11801_write_reg(client, APERTURE_CONF_REG, 0x33); + /* Enable Power, enable Automode, enable Aperture, enable Average X,Y */ + max11801_write_reg(client, OP_MODE_CONF_REG, 0x36); +} + +static int max11801_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct max11801_data *data; + struct input_dev *input_dev; + int error; + + data = kzalloc(sizeof(struct max11801_data), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!data || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + data->client = client; + data->input_dev = input_dev; + + input_dev->name = "max11801_ts"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + input_set_abs_params(input_dev, ABS_X, 0, MAX11801_MAX_X, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, MAX11801_MAX_Y, 0, 0); + input_set_drvdata(input_dev, data); + + max11801_ts_phy_init(data); + + error = request_threaded_irq(client->irq, NULL, max11801_ts_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + "max11801_ts", data); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_mem; + } + + error = input_register_device(data->input_dev); + if (error) + goto err_free_irq; + + i2c_set_clientdata(client, data); + return 0; + +err_free_irq: + free_irq(client->irq, data); +err_free_mem: + input_free_device(input_dev); + kfree(data); + return error; +} + +static int max11801_ts_remove(struct i2c_client *client) +{ + struct max11801_data *data = i2c_get_clientdata(client); + + free_irq(client->irq, data); + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + +static const struct i2c_device_id max11801_ts_id[] = { + {"max11801", 0}, + { } +}; +MODULE_DEVICE_TABLE(i2c, max11801_ts_id); + +static struct i2c_driver max11801_ts_driver = { + .driver = { + .name = "max11801_ts", + .owner = THIS_MODULE, + }, + .id_table = max11801_ts_id, + .probe = max11801_ts_probe, + .remove = max11801_ts_remove, +}; + +module_i2c_driver(max11801_ts_driver); + +MODULE_AUTHOR("Zhang Jiejing "); +MODULE_DESCRIPTION("Touchscreen driver for MAXI MAX11801 controller"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/mc13783_ts.c b/drivers/input/touchscreen/mc13783_ts.c new file mode 100644 index 00000000..89308fe3 --- /dev/null +++ b/drivers/input/touchscreen/mc13783_ts.c @@ -0,0 +1,258 @@ +/* + * Driver for the Freescale Semiconductor MC13783 touchscreen. + * + * Copyright 2004-2007 Freescale Semiconductor, Inc. All Rights Reserved. + * Copyright (C) 2009 Sascha Hauer, Pengutronix + * + * Initial development of this code was funded by + * Phytec Messtechnik GmbH, http://www.phytec.de/ + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MC13783_TS_NAME "mc13783-ts" + +#define DEFAULT_SAMPLE_TOLERANCE 300 + +static unsigned int sample_tolerance = DEFAULT_SAMPLE_TOLERANCE; +module_param(sample_tolerance, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(sample_tolerance, + "If the minimal and maximal value read out for one axis (out " + "of three) differ by this value (default: " + __stringify(DEFAULT_SAMPLE_TOLERANCE) ") or more, the reading " + "is supposed to be wrong and is discarded. Set to 0 to " + "disable this check."); + +struct mc13783_ts_priv { + struct input_dev *idev; + struct mc13xxx *mc13xxx; + struct delayed_work work; + struct workqueue_struct *workq; + unsigned int sample[4]; + struct mc13xxx_ts_platform_data *touch; +}; + +static irqreturn_t mc13783_ts_handler(int irq, void *data) +{ + struct mc13783_ts_priv *priv = data; + + mc13xxx_irq_ack(priv->mc13xxx, irq); + + /* + * Kick off reading coordinates. Note that if work happens already + * be queued for future execution (it rearms itself) it will not + * be rescheduled for immediate execution here. However the rearm + * delay is HZ / 50 which is acceptable. + */ + queue_delayed_work(priv->workq, &priv->work, 0); + + return IRQ_HANDLED; +} + +#define sort3(a0, a1, a2) ({ \ + if (a0 > a1) \ + swap(a0, a1); \ + if (a1 > a2) \ + swap(a1, a2); \ + if (a0 > a1) \ + swap(a0, a1); \ + }) + +static void mc13783_ts_report_sample(struct mc13783_ts_priv *priv) +{ + struct input_dev *idev = priv->idev; + int x0, x1, x2, y0, y1, y2; + int cr0, cr1; + + /* + * the values are 10-bit wide only, but the two least significant + * bits are for future 12 bit use and reading yields 0 + */ + x0 = priv->sample[0] & 0xfff; + x1 = priv->sample[1] & 0xfff; + x2 = priv->sample[2] & 0xfff; + y0 = priv->sample[3] & 0xfff; + y1 = (priv->sample[0] >> 12) & 0xfff; + y2 = (priv->sample[1] >> 12) & 0xfff; + cr0 = (priv->sample[2] >> 12) & 0xfff; + cr1 = (priv->sample[3] >> 12) & 0xfff; + + dev_dbg(&idev->dev, + "x: (% 4d,% 4d,% 4d) y: (% 4d, % 4d,% 4d) cr: (% 4d, % 4d)\n", + x0, x1, x2, y0, y1, y2, cr0, cr1); + + sort3(x0, x1, x2); + sort3(y0, y1, y2); + + cr0 = (cr0 + cr1) / 2; + + if (!cr0 || !sample_tolerance || + (x2 - x0 < sample_tolerance && + y2 - y0 < sample_tolerance)) { + /* report the median coordinate and average pressure */ + if (cr0) { + input_report_abs(idev, ABS_X, x1); + input_report_abs(idev, ABS_Y, y1); + + dev_dbg(&idev->dev, "report (%d, %d, %d)\n", + x1, y1, 0x1000 - cr0); + queue_delayed_work(priv->workq, &priv->work, HZ / 50); + } else + dev_dbg(&idev->dev, "report release\n"); + + input_report_abs(idev, ABS_PRESSURE, + cr0 ? 0x1000 - cr0 : cr0); + input_report_key(idev, BTN_TOUCH, cr0); + input_sync(idev); + } else + dev_dbg(&idev->dev, "discard event\n"); +} + +static void mc13783_ts_work(struct work_struct *work) +{ + struct mc13783_ts_priv *priv = + container_of(work, struct mc13783_ts_priv, work.work); + unsigned int mode = MC13XXX_ADC_MODE_TS; + unsigned int channel = 12; + + if (mc13xxx_adc_do_conversion(priv->mc13xxx, + mode, channel, + priv->touch->ato, priv->touch->atox, + priv->sample) == 0) + mc13783_ts_report_sample(priv); +} + +static int mc13783_ts_open(struct input_dev *dev) +{ + struct mc13783_ts_priv *priv = input_get_drvdata(dev); + int ret; + + mc13xxx_lock(priv->mc13xxx); + + mc13xxx_irq_ack(priv->mc13xxx, MC13XXX_IRQ_TS); + + ret = mc13xxx_irq_request(priv->mc13xxx, MC13XXX_IRQ_TS, + mc13783_ts_handler, MC13783_TS_NAME, priv); + if (ret) + goto out; + + ret = mc13xxx_reg_rmw(priv->mc13xxx, MC13XXX_ADC0, + MC13XXX_ADC0_TSMOD_MASK, MC13XXX_ADC0_TSMOD0); + if (ret) + mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TS, priv); +out: + mc13xxx_unlock(priv->mc13xxx); + return ret; +} + +static void mc13783_ts_close(struct input_dev *dev) +{ + struct mc13783_ts_priv *priv = input_get_drvdata(dev); + + mc13xxx_lock(priv->mc13xxx); + mc13xxx_reg_rmw(priv->mc13xxx, MC13XXX_ADC0, + MC13XXX_ADC0_TSMOD_MASK, 0); + mc13xxx_irq_free(priv->mc13xxx, MC13XXX_IRQ_TS, priv); + mc13xxx_unlock(priv->mc13xxx); + + cancel_delayed_work_sync(&priv->work); +} + +static int __init mc13783_ts_probe(struct platform_device *pdev) +{ + struct mc13783_ts_priv *priv; + struct input_dev *idev; + int ret = -ENOMEM; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + idev = input_allocate_device(); + if (!priv || !idev) + goto err_free_mem; + + INIT_DELAYED_WORK(&priv->work, mc13783_ts_work); + priv->mc13xxx = dev_get_drvdata(pdev->dev.parent); + priv->idev = idev; + priv->touch = dev_get_platdata(&pdev->dev); + if (!priv->touch) { + dev_err(&pdev->dev, "missing platform data\n"); + ret = -ENODEV; + goto err_free_mem; + } + + /* + * We need separate workqueue because mc13783_adc_do_conversion + * uses keventd and thus would deadlock. + */ + priv->workq = create_singlethread_workqueue("mc13783_ts"); + if (!priv->workq) + goto err_free_mem; + + idev->name = MC13783_TS_NAME; + idev->dev.parent = &pdev->dev; + + idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(idev, ABS_X, 0, 0xfff, 0, 0); + input_set_abs_params(idev, ABS_Y, 0, 0xfff, 0, 0); + input_set_abs_params(idev, ABS_PRESSURE, 0, 0xfff, 0, 0); + + idev->open = mc13783_ts_open; + idev->close = mc13783_ts_close; + + input_set_drvdata(idev, priv); + + ret = input_register_device(priv->idev); + if (ret) { + dev_err(&pdev->dev, + "register input device failed with %d\n", ret); + goto err_destroy_wq; + } + + platform_set_drvdata(pdev, priv); + return 0; + +err_destroy_wq: + destroy_workqueue(priv->workq); +err_free_mem: + input_free_device(idev); + kfree(priv); + return ret; +} + +static int mc13783_ts_remove(struct platform_device *pdev) +{ + struct mc13783_ts_priv *priv = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + + destroy_workqueue(priv->workq); + input_unregister_device(priv->idev); + kfree(priv); + + return 0; +} + +static struct platform_driver mc13783_ts_driver = { + .remove = mc13783_ts_remove, + .driver = { + .owner = THIS_MODULE, + .name = MC13783_TS_NAME, + }, +}; + +module_platform_driver_probe(mc13783_ts_driver, mc13783_ts_probe); + +MODULE_DESCRIPTION("MC13783 input touchscreen driver"); +MODULE_AUTHOR("Sascha Hauer "); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" MC13783_TS_NAME); diff --git a/drivers/input/touchscreen/mcs5000_ts.c b/drivers/input/touchscreen/mcs5000_ts.c new file mode 100644 index 00000000..f9f4e0c5 --- /dev/null +++ b/drivers/input/touchscreen/mcs5000_ts.c @@ -0,0 +1,310 @@ +/* + * mcs5000_ts.c - Touchscreen driver for MELFAS MCS-5000 controller + * + * Copyright (C) 2009 Samsung Electronics Co.Ltd + * Author: Joonyoung Shim + * + * Based on wm97xx-core.c + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Registers */ +#define MCS5000_TS_STATUS 0x00 +#define STATUS_OFFSET 0 +#define STATUS_NO (0 << STATUS_OFFSET) +#define STATUS_INIT (1 << STATUS_OFFSET) +#define STATUS_SENSING (2 << STATUS_OFFSET) +#define STATUS_COORD (3 << STATUS_OFFSET) +#define STATUS_GESTURE (4 << STATUS_OFFSET) +#define ERROR_OFFSET 4 +#define ERROR_NO (0 << ERROR_OFFSET) +#define ERROR_POWER_ON_RESET (1 << ERROR_OFFSET) +#define ERROR_INT_RESET (2 << ERROR_OFFSET) +#define ERROR_EXT_RESET (3 << ERROR_OFFSET) +#define ERROR_INVALID_REG_ADDRESS (8 << ERROR_OFFSET) +#define ERROR_INVALID_REG_VALUE (9 << ERROR_OFFSET) + +#define MCS5000_TS_OP_MODE 0x01 +#define RESET_OFFSET 0 +#define RESET_NO (0 << RESET_OFFSET) +#define RESET_EXT_SOFT (1 << RESET_OFFSET) +#define OP_MODE_OFFSET 1 +#define OP_MODE_SLEEP (0 << OP_MODE_OFFSET) +#define OP_MODE_ACTIVE (1 << OP_MODE_OFFSET) +#define GESTURE_OFFSET 4 +#define GESTURE_DISABLE (0 << GESTURE_OFFSET) +#define GESTURE_ENABLE (1 << GESTURE_OFFSET) +#define PROXIMITY_OFFSET 5 +#define PROXIMITY_DISABLE (0 << PROXIMITY_OFFSET) +#define PROXIMITY_ENABLE (1 << PROXIMITY_OFFSET) +#define SCAN_MODE_OFFSET 6 +#define SCAN_MODE_INTERRUPT (0 << SCAN_MODE_OFFSET) +#define SCAN_MODE_POLLING (1 << SCAN_MODE_OFFSET) +#define REPORT_RATE_OFFSET 7 +#define REPORT_RATE_40 (0 << REPORT_RATE_OFFSET) +#define REPORT_RATE_80 (1 << REPORT_RATE_OFFSET) + +#define MCS5000_TS_SENS_CTL 0x02 +#define MCS5000_TS_FILTER_CTL 0x03 +#define PRI_FILTER_OFFSET 0 +#define SEC_FILTER_OFFSET 4 + +#define MCS5000_TS_X_SIZE_UPPER 0x08 +#define MCS5000_TS_X_SIZE_LOWER 0x09 +#define MCS5000_TS_Y_SIZE_UPPER 0x0A +#define MCS5000_TS_Y_SIZE_LOWER 0x0B + +#define MCS5000_TS_INPUT_INFO 0x10 +#define INPUT_TYPE_OFFSET 0 +#define INPUT_TYPE_NONTOUCH (0 << INPUT_TYPE_OFFSET) +#define INPUT_TYPE_SINGLE (1 << INPUT_TYPE_OFFSET) +#define INPUT_TYPE_DUAL (2 << INPUT_TYPE_OFFSET) +#define INPUT_TYPE_PALM (3 << INPUT_TYPE_OFFSET) +#define INPUT_TYPE_PROXIMITY (7 << INPUT_TYPE_OFFSET) +#define GESTURE_CODE_OFFSET 3 +#define GESTURE_CODE_NO (0 << GESTURE_CODE_OFFSET) + +#define MCS5000_TS_X_POS_UPPER 0x11 +#define MCS5000_TS_X_POS_LOWER 0x12 +#define MCS5000_TS_Y_POS_UPPER 0x13 +#define MCS5000_TS_Y_POS_LOWER 0x14 +#define MCS5000_TS_Z_POS 0x15 +#define MCS5000_TS_WIDTH 0x16 +#define MCS5000_TS_GESTURE_VAL 0x17 +#define MCS5000_TS_MODULE_REV 0x20 +#define MCS5000_TS_FIRMWARE_VER 0x21 + +/* Touchscreen absolute values */ +#define MCS5000_MAX_XC 0x3ff +#define MCS5000_MAX_YC 0x3ff + +enum mcs5000_ts_read_offset { + READ_INPUT_INFO, + READ_X_POS_UPPER, + READ_X_POS_LOWER, + READ_Y_POS_UPPER, + READ_Y_POS_LOWER, + READ_BLOCK_SIZE, +}; + +/* Each client has this additional data */ +struct mcs5000_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + const struct mcs_platform_data *platform_data; +}; + +static irqreturn_t mcs5000_ts_interrupt(int irq, void *dev_id) +{ + struct mcs5000_ts_data *data = dev_id; + struct i2c_client *client = data->client; + u8 buffer[READ_BLOCK_SIZE]; + int err; + int x; + int y; + + err = i2c_smbus_read_i2c_block_data(client, MCS5000_TS_INPUT_INFO, + READ_BLOCK_SIZE, buffer); + if (err < 0) { + dev_err(&client->dev, "%s, err[%d]\n", __func__, err); + goto out; + } + + switch (buffer[READ_INPUT_INFO]) { + case INPUT_TYPE_NONTOUCH: + input_report_key(data->input_dev, BTN_TOUCH, 0); + input_sync(data->input_dev); + break; + + case INPUT_TYPE_SINGLE: + x = (buffer[READ_X_POS_UPPER] << 8) | buffer[READ_X_POS_LOWER]; + y = (buffer[READ_Y_POS_UPPER] << 8) | buffer[READ_Y_POS_LOWER]; + + input_report_key(data->input_dev, BTN_TOUCH, 1); + input_report_abs(data->input_dev, ABS_X, x); + input_report_abs(data->input_dev, ABS_Y, y); + input_sync(data->input_dev); + break; + + case INPUT_TYPE_DUAL: + /* TODO */ + break; + + case INPUT_TYPE_PALM: + /* TODO */ + break; + + case INPUT_TYPE_PROXIMITY: + /* TODO */ + break; + + default: + dev_err(&client->dev, "Unknown ts input type %d\n", + buffer[READ_INPUT_INFO]); + break; + } + + out: + return IRQ_HANDLED; +} + +static void mcs5000_ts_phys_init(struct mcs5000_ts_data *data) +{ + const struct mcs_platform_data *platform_data = + data->platform_data; + struct i2c_client *client = data->client; + + /* Touch reset & sleep mode */ + i2c_smbus_write_byte_data(client, MCS5000_TS_OP_MODE, + RESET_EXT_SOFT | OP_MODE_SLEEP); + + /* Touch size */ + i2c_smbus_write_byte_data(client, MCS5000_TS_X_SIZE_UPPER, + platform_data->x_size >> 8); + i2c_smbus_write_byte_data(client, MCS5000_TS_X_SIZE_LOWER, + platform_data->x_size & 0xff); + i2c_smbus_write_byte_data(client, MCS5000_TS_Y_SIZE_UPPER, + platform_data->y_size >> 8); + i2c_smbus_write_byte_data(client, MCS5000_TS_Y_SIZE_LOWER, + platform_data->y_size & 0xff); + + /* Touch active mode & 80 report rate */ + i2c_smbus_write_byte_data(data->client, MCS5000_TS_OP_MODE, + OP_MODE_ACTIVE | REPORT_RATE_80); +} + +static int mcs5000_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct mcs5000_ts_data *data; + struct input_dev *input_dev; + int ret; + + if (!client->dev.platform_data) + return -EINVAL; + + data = kzalloc(sizeof(struct mcs5000_ts_data), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!data || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_free_mem; + } + + data->client = client; + data->input_dev = input_dev; + data->platform_data = client->dev.platform_data; + + input_dev->name = "MELPAS MCS-5000 Touchscreen"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + input_set_abs_params(input_dev, ABS_X, 0, MCS5000_MAX_XC, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, MCS5000_MAX_YC, 0, 0); + + input_set_drvdata(input_dev, data); + + if (data->platform_data->cfg_pin) + data->platform_data->cfg_pin(); + + ret = request_threaded_irq(client->irq, NULL, mcs5000_ts_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, "mcs5000_ts", data); + + if (ret < 0) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_mem; + } + + ret = input_register_device(data->input_dev); + if (ret < 0) + goto err_free_irq; + + mcs5000_ts_phys_init(data); + i2c_set_clientdata(client, data); + + return 0; + +err_free_irq: + free_irq(client->irq, data); +err_free_mem: + input_free_device(input_dev); + kfree(data); + return ret; +} + +static int mcs5000_ts_remove(struct i2c_client *client) +{ + struct mcs5000_ts_data *data = i2c_get_clientdata(client); + + free_irq(client->irq, data); + input_unregister_device(data->input_dev); + kfree(data); + + return 0; +} + +#ifdef CONFIG_PM +static int mcs5000_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + /* Touch sleep mode */ + i2c_smbus_write_byte_data(client, MCS5000_TS_OP_MODE, OP_MODE_SLEEP); + + return 0; +} + +static int mcs5000_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mcs5000_ts_data *data = i2c_get_clientdata(client); + + mcs5000_ts_phys_init(data); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(mcs5000_ts_pm, mcs5000_ts_suspend, mcs5000_ts_resume); +#endif + +static const struct i2c_device_id mcs5000_ts_id[] = { + { "mcs5000_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mcs5000_ts_id); + +static struct i2c_driver mcs5000_ts_driver = { + .probe = mcs5000_ts_probe, + .remove = mcs5000_ts_remove, + .driver = { + .name = "mcs5000_ts", +#ifdef CONFIG_PM + .pm = &mcs5000_ts_pm, +#endif + }, + .id_table = mcs5000_ts_id, +}; + +module_i2c_driver(mcs5000_ts_driver); + +/* Module information */ +MODULE_AUTHOR("Joonyoung Shim "); +MODULE_DESCRIPTION("Touchscreen driver for MELFAS MCS-5000 controller"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/migor_ts.c b/drivers/input/touchscreen/migor_ts.c new file mode 100644 index 00000000..c038db93 --- /dev/null +++ b/drivers/input/touchscreen/migor_ts.c @@ -0,0 +1,249 @@ +/* + * Touch Screen driver for Renesas MIGO-R Platform + * + * Copyright (c) 2008 Magnus Damm + * Copyright (c) 2007 Ujjwal Pande , + * Kenati Technologies Pvt Ltd. + * + * This file is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This file is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EVENT_PENDOWN 1 +#define EVENT_REPEAT 2 +#define EVENT_PENUP 3 + +struct migor_ts_priv { + struct i2c_client *client; + struct input_dev *input; + int irq; +}; + +static const u_int8_t migor_ts_ena_seq[17] = { 0x33, 0x22, 0x11, + 0x01, 0x06, 0x07, }; +static const u_int8_t migor_ts_dis_seq[17] = { }; + +static irqreturn_t migor_ts_isr(int irq, void *dev_id) +{ + struct migor_ts_priv *priv = dev_id; + unsigned short xpos, ypos; + unsigned char event; + u_int8_t buf[16]; + + /* + * The touch screen controller chip is hooked up to the CPU + * using I2C and a single interrupt line. The interrupt line + * is pulled low whenever someone taps the screen. To deassert + * the interrupt line we need to acknowledge the interrupt by + * communicating with the controller over the slow i2c bus. + * + * Since I2C bus controller may sleep we are using threaded + * IRQ here. + */ + + memset(buf, 0, sizeof(buf)); + + /* Set Index 0 */ + buf[0] = 0; + if (i2c_master_send(priv->client, buf, 1) != 1) { + dev_err(&priv->client->dev, "Unable to write i2c index\n"); + goto out; + } + + /* Now do Page Read */ + if (i2c_master_recv(priv->client, buf, sizeof(buf)) != sizeof(buf)) { + dev_err(&priv->client->dev, "Unable to read i2c page\n"); + goto out; + } + + ypos = ((buf[9] & 0x03) << 8 | buf[8]); + xpos = ((buf[11] & 0x03) << 8 | buf[10]); + event = buf[12]; + + switch (event) { + case EVENT_PENDOWN: + case EVENT_REPEAT: + input_report_key(priv->input, BTN_TOUCH, 1); + input_report_abs(priv->input, ABS_X, ypos); /*X-Y swap*/ + input_report_abs(priv->input, ABS_Y, xpos); + input_sync(priv->input); + break; + + case EVENT_PENUP: + input_report_key(priv->input, BTN_TOUCH, 0); + input_sync(priv->input); + break; + } + + out: + return IRQ_HANDLED; +} + +static int migor_ts_open(struct input_dev *dev) +{ + struct migor_ts_priv *priv = input_get_drvdata(dev); + struct i2c_client *client = priv->client; + int count; + + /* enable controller */ + count = i2c_master_send(client, migor_ts_ena_seq, + sizeof(migor_ts_ena_seq)); + if (count != sizeof(migor_ts_ena_seq)) { + dev_err(&client->dev, "Unable to enable touchscreen.\n"); + return -ENXIO; + } + + return 0; +} + +static void migor_ts_close(struct input_dev *dev) +{ + struct migor_ts_priv *priv = input_get_drvdata(dev); + struct i2c_client *client = priv->client; + + disable_irq(priv->irq); + + /* disable controller */ + i2c_master_send(client, migor_ts_dis_seq, sizeof(migor_ts_dis_seq)); + + enable_irq(priv->irq); +} + +static int migor_ts_probe(struct i2c_client *client, + const struct i2c_device_id *idp) +{ + struct migor_ts_priv *priv; + struct input_dev *input; + int error; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + input = input_allocate_device(); + if (!priv || !input) { + dev_err(&client->dev, "failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + priv->client = client; + priv->input = input; + priv->irq = client->irq; + + input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + __set_bit(BTN_TOUCH, input->keybit); + + input_set_abs_params(input, ABS_X, 95, 955, 0, 0); + input_set_abs_params(input, ABS_Y, 85, 935, 0, 0); + + input->name = client->name; + input->id.bustype = BUS_I2C; + input->dev.parent = &client->dev; + + input->open = migor_ts_open; + input->close = migor_ts_close; + + input_set_drvdata(input, priv); + + error = request_threaded_irq(priv->irq, NULL, migor_ts_isr, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + client->name, priv); + if (error) { + dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); + goto err_free_mem; + } + + error = input_register_device(input); + if (error) + goto err_free_irq; + + i2c_set_clientdata(client, priv); + device_init_wakeup(&client->dev, 1); + + return 0; + + err_free_irq: + free_irq(priv->irq, priv); + err_free_mem: + input_free_device(input); + kfree(priv); + return error; +} + +static int migor_ts_remove(struct i2c_client *client) +{ + struct migor_ts_priv *priv = i2c_get_clientdata(client); + + free_irq(priv->irq, priv); + input_unregister_device(priv->input); + kfree(priv); + + dev_set_drvdata(&client->dev, NULL); + + return 0; +} + +static int migor_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct migor_ts_priv *priv = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(priv->irq); + + return 0; +} + +static int migor_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct migor_ts_priv *priv = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(priv->irq); + + return 0; +} + +static SIMPLE_DEV_PM_OPS(migor_ts_pm, migor_ts_suspend, migor_ts_resume); + +static const struct i2c_device_id migor_ts_id[] = { + { "migor_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, migor_ts); + +static struct i2c_driver migor_ts_driver = { + .driver = { + .name = "migor_ts", + .pm = &migor_ts_pm, + }, + .probe = migor_ts_probe, + .remove = migor_ts_remove, + .id_table = migor_ts_id, +}; + +module_i2c_driver(migor_ts_driver); + +MODULE_DESCRIPTION("MigoR Touchscreen driver"); +MODULE_AUTHOR("Magnus Damm "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/mk712.c b/drivers/input/touchscreen/mk712.c new file mode 100644 index 00000000..36e57dea --- /dev/null +++ b/drivers/input/touchscreen/mk712.c @@ -0,0 +1,219 @@ +/* + * ICS MK712 touchscreen controller driver + * + * Copyright (c) 1999-2002 Transmeta Corporation + * Copyright (c) 2005 Rick Koch + * Copyright (c) 2005 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * This driver supports the ICS MicroClock MK712 TouchScreen controller, + * found in Gateway AOL Connected Touchpad computers. + * + * Documentation for ICS MK712 can be found at: + * http://www.idt.com/products/getDoc.cfm?docID=18713923 + */ + +/* + * 1999-12-18: original version, Daniel Quinlan + * 1999-12-19: added anti-jitter code, report pen-up events, fixed mk712_poll + * to use queue_empty, Nathan Laredo + * 1999-12-20: improved random point rejection, Nathan Laredo + * 2000-01-05: checked in new anti-jitter code, changed mouse protocol, fixed + * queue code, added module options, other fixes, Daniel Quinlan + * 2002-03-15: Clean up for kernel merge + * Fixed multi open race, fixed memory checks, fixed resource + * allocation, fixed close/powerdown bug, switched to new init + * 2005-01-18: Ported to 2.6 from 2.4.28, Rick Koch + * 2005-02-05: Rewritten for the input layer, Vojtech Pavlik + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Daniel Quinlan , Vojtech Pavlik "); +MODULE_DESCRIPTION("ICS MicroClock MK712 TouchScreen driver"); +MODULE_LICENSE("GPL"); + +static unsigned int mk712_io = 0x260; /* Also 0x200, 0x208, 0x300 */ +module_param_named(io, mk712_io, uint, 0); +MODULE_PARM_DESC(io, "I/O base address of MK712 touchscreen controller"); + +static unsigned int mk712_irq = 10; /* Also 12, 14, 15 */ +module_param_named(irq, mk712_irq, uint, 0); +MODULE_PARM_DESC(irq, "IRQ of MK712 touchscreen controller"); + +/* eight 8-bit registers */ +#define MK712_STATUS 0 +#define MK712_X 2 +#define MK712_Y 4 +#define MK712_CONTROL 6 +#define MK712_RATE 7 + +/* status */ +#define MK712_STATUS_TOUCH 0x10 +#define MK712_CONVERSION_COMPLETE 0x80 + +/* control */ +#define MK712_ENABLE_INT 0x01 +#define MK712_INT_ON_CONVERSION_COMPLETE 0x02 +#define MK712_INT_ON_CHANGE_IN_TOUCH_STATUS 0x04 +#define MK712_ENABLE_PERIODIC_CONVERSIONS 0x10 +#define MK712_READ_ONE_POINT 0x20 +#define MK712_POWERUP 0x40 + +static struct input_dev *mk712_dev; +static DEFINE_SPINLOCK(mk712_lock); + +static irqreturn_t mk712_interrupt(int irq, void *dev_id) +{ + unsigned char status; + static int debounce = 1; + static unsigned short last_x; + static unsigned short last_y; + + spin_lock(&mk712_lock); + + status = inb(mk712_io + MK712_STATUS); + + if (~status & MK712_CONVERSION_COMPLETE) { + debounce = 1; + goto end; + } + + if (~status & MK712_STATUS_TOUCH) { + debounce = 1; + input_report_key(mk712_dev, BTN_TOUCH, 0); + goto end; + } + + if (debounce) { + debounce = 0; + goto end; + } + + input_report_key(mk712_dev, BTN_TOUCH, 1); + input_report_abs(mk712_dev, ABS_X, last_x); + input_report_abs(mk712_dev, ABS_Y, last_y); + + end: + last_x = inw(mk712_io + MK712_X) & 0x0fff; + last_y = inw(mk712_io + MK712_Y) & 0x0fff; + input_sync(mk712_dev); + spin_unlock(&mk712_lock); + return IRQ_HANDLED; +} + +static int mk712_open(struct input_dev *dev) +{ + unsigned long flags; + + spin_lock_irqsave(&mk712_lock, flags); + + outb(0, mk712_io + MK712_CONTROL); /* Reset */ + + outb(MK712_ENABLE_INT | MK712_INT_ON_CONVERSION_COMPLETE | + MK712_INT_ON_CHANGE_IN_TOUCH_STATUS | + MK712_ENABLE_PERIODIC_CONVERSIONS | + MK712_POWERUP, mk712_io + MK712_CONTROL); + + outb(10, mk712_io + MK712_RATE); /* 187 points per second */ + + spin_unlock_irqrestore(&mk712_lock, flags); + + return 0; +} + +static void mk712_close(struct input_dev *dev) +{ + unsigned long flags; + + spin_lock_irqsave(&mk712_lock, flags); + + outb(0, mk712_io + MK712_CONTROL); + + spin_unlock_irqrestore(&mk712_lock, flags); +} + +static int __init mk712_init(void) +{ + int err; + + if (!request_region(mk712_io, 8, "mk712")) { + printk(KERN_WARNING "mk712: unable to get IO region\n"); + return -ENODEV; + } + + outb(0, mk712_io + MK712_CONTROL); + + if ((inw(mk712_io + MK712_X) & 0xf000) || /* Sanity check */ + (inw(mk712_io + MK712_Y) & 0xf000) || + (inw(mk712_io + MK712_STATUS) & 0xf333)) { + printk(KERN_WARNING "mk712: device not present\n"); + err = -ENODEV; + goto fail1; + } + + mk712_dev = input_allocate_device(); + if (!mk712_dev) { + printk(KERN_ERR "mk712: not enough memory\n"); + err = -ENOMEM; + goto fail1; + } + + mk712_dev->name = "ICS MicroClock MK712 TouchScreen"; + mk712_dev->phys = "isa0260/input0"; + mk712_dev->id.bustype = BUS_ISA; + mk712_dev->id.vendor = 0x0005; + mk712_dev->id.product = 0x0001; + mk712_dev->id.version = 0x0100; + + mk712_dev->open = mk712_open; + mk712_dev->close = mk712_close; + + mk712_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + mk712_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(mk712_dev, ABS_X, 0, 0xfff, 88, 0); + input_set_abs_params(mk712_dev, ABS_Y, 0, 0xfff, 88, 0); + + if (request_irq(mk712_irq, mk712_interrupt, 0, "mk712", mk712_dev)) { + printk(KERN_WARNING "mk712: unable to get IRQ\n"); + err = -EBUSY; + goto fail1; + } + + err = input_register_device(mk712_dev); + if (err) + goto fail2; + + return 0; + + fail2: free_irq(mk712_irq, mk712_dev); + fail1: input_free_device(mk712_dev); + release_region(mk712_io, 8); + return err; +} + +static void __exit mk712_exit(void) +{ + input_unregister_device(mk712_dev); + free_irq(mk712_irq, mk712_dev); + release_region(mk712_io, 8); +} + +module_init(mk712_init); +module_exit(mk712_exit); diff --git a/drivers/input/touchscreen/mms100s_ts.c b/drivers/input/touchscreen/mms100s_ts.c new file mode 100755 index 00000000..cdf8ec25 --- /dev/null +++ b/drivers/input/touchscreen/mms100s_ts.c @@ -0,0 +1,1593 @@ +/* + * Touchscreen driver for Melfas MMS-100s series + * + * Copyright (C) 2013 Melfas Inc. + * Author: DVK team + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Flag to enable touch key */ +#define MMS_HAS_TOUCH_KEY 1 + +#define ESD_DETECT_COUNT 10 + +/* + * ISC_XFER_LEN - ISC unit transfer length. + * Give number of 2 power n, where n is between 2 and 10 + * i.e. 4, 8, 16 ,,, 1024 + */ +#define ISC_XFER_LEN 1024 + +#define MMS_FLASH_PAGE_SZ 1024 +#define ISC_BLOCK_NUM (MMS_FLASH_PAGE_SZ / ISC_XFER_LEN) + +#define FLASH_VERBOSE_DEBUG 1 +#define MAX_SECTION_NUM 3 + +#define MAX_FINGER_NUM 5 +#define FINGER_EVENT_SZ 6 +#define MAX_WIDTH 30 +#define MAX_PRESSURE 255 +#define MAX_LOG_LENGTH 128 + +/* Registers */ +#define MMS_MODE_CONTROL 0x01 +#define MMS_TX_NUM 0x0B +#define MMS_RX_NUM 0x0C +#define MMS_KEY_NUM 0x0D +#define MMS_EVENT_PKT_SZ 0x0F +#define MMS_INPUT_EVENT 0x10 +#define MMS_UNIVERSAL_CMD 0xA0 +#define MMS_UNIVERSAL_RESULT 0xAF + +#define MMS_CMD_ENTER_ISC 0x5F +#define MMS_FW_VERSION 0xE1 +#define MMS_POWER_CONTROL 0xB0 + +/* Universal commands */ +#define MMS_CMD_SET_LOG_MODE 0x20 + +/* Event types */ +#define MMS_LOG_EVENT 0xD +#define MMS_NOTIFY_EVENT 0xE +#define MMS_ERROR_EVENT 0xF +#define MMS_TOUCH_KEY_EVENT 0x40 + +/* Firmware file name */ +#define FW_NAME "mms_ts.fw" + +enum{ + SYS_TXNUM = 3, + SYS_RXNUM, + SYS_CLEAR, + SYS_ENABLE, + SYS_DISABLE, + SYS_INTERRUPT, + SYS_RESET, +}; + +enum { + GET_RX_NUM = 1, + GET_TX_NUM, + GET_EVENT_DATA, +}; + +enum { + LOG_TYPE_U08 = 2, + LOG_TYPE_S08, + LOG_TYPE_U16, + LOG_TYPE_S16, + LOG_TYPE_U32 = 8, + LOG_TYPE_S32, +}; + +enum { + ISC_ADDR = 0xD5, + + ISC_CMD_READ_STATUS = 0xD9, + ISC_CMD_READ = 0x4000, + ISC_CMD_EXIT = 0x8200, + ISC_CMD_PAGE_ERASE = 0xC000, + ISC_CMD_ERASE = 0xC100, + ISC_PAGE_ERASE_DONE = 0x10000, + ISC_PAGE_ERASE_ENTER = 0x20000, +}; + +struct mms_ts_info { + struct i2c_client *client; + struct input_dev *input_dev; + char phys[32]; + + u8 tx_num; + u8 rx_num; + u8 key_num; + int irq; + + int data_cmd; + + struct mms_ts_platform_data *pdata; + + char *fw_name; + struct completion init_done; + struct early_suspend early_suspend; + + struct mutex lock; + bool enabled; + + struct cdev cdev; + dev_t mms_dev; + struct class *class; + + struct mms_log_data { + u8 *data; + int cmd; + } log; +}; + +struct mms_bin_hdr { + char tag[8]; + u16 core_version; + u16 section_num; + u16 contains_full_binary; + u16 reserved0; + + u32 binary_offset; + u32 binary_length; + + u32 extention_offset; + u32 reserved1; + +} __attribute__ ((packed)); + +struct mms_fw_img { + u16 type; + u16 version; + + u16 start_page; + u16 end_page; + + u32 offset; + u32 length; + +} __attribute__ ((packed)); + +struct isc_packet { + u8 cmd; + u32 addr; + u8 data[0]; +} __attribute__ ((packed)); + + +static int esd_cnt; +static void mms_report_input_data(struct mms_ts_info *info, u8 sz, u8 *buf); +static void mms_ts_early_suspend(struct early_suspend *h); +static void mms_ts_late_resume(struct early_suspend *h); +static int mms_ts_config(struct mms_ts_info *info); + +/* mms_ts_enable - wake-up func (VDD on) */ +static void mms_ts_enable(struct mms_ts_info *info) +{ +pr_debug("%s enable tsp %d\n",__func__,__LINE__); + if (info->enabled) + return; + pr_debug("%s %d\n",__func__,__LINE__); + mutex_lock(&info->lock); + + /* + gpio_direction_output(info->pdata->gpio_resetb, 0); + udelay(5); + gpio_direction_input(info->pdata->gpio_resetb); + */ + + /* use vdd control instead */ + info->pdata->vdd_on(1); + msleep(50); + pr_debug("%s %d \n",__func__,__LINE__); + info->enabled = true; + pr_debug("%s %d \n",__func__,__LINE__); + enable_irq(info->irq); +pr_debug("%s %d \n",__func__,__LINE__); + mutex_unlock(&info->lock); + +} + +/* mms_ts_disable - sleep func (VDD off) */ +static void mms_ts_disable(struct mms_ts_info *info) +{ +pr_debug("%s disable tsp %d \n",__func__,__LINE__); + if (!info->enabled) + return; + + i2c_smbus_write_byte_data(info->client, MMS_POWER_CONTROL, 1); + + mutex_lock(&info->lock); + + disable_irq(info->irq); + + /* + i2c_smbus_write_byte_data(info->client, MMS_MODE_CONTROL, 0); + usleep_range(10000, 12000); + */ + + /* use vdd control instead */ + msleep(50); + info->pdata->vdd_on(0); + msleep(50); + + info->enabled = false; + + mutex_unlock(&info->lock); +} + +/* mms_reboot - IC reset */ +static void mms_reboot(struct mms_ts_info *info) +{ + struct i2c_adapter *adapter = to_i2c_adapter(info->client->dev.parent); +pr_debug("%s reboot 1 %d",__func__,__LINE__); + i2c_smbus_write_byte_data(info->client, MMS_POWER_CONTROL, 1); + i2c_lock_adapter(adapter); + msleep(50); + info->pdata->vdd_on(0); + msleep(150); + + info->pdata->vdd_on(1); + msleep(50); + + i2c_unlock_adapter(adapter); +} + +/* + * mms_clear_input_data - all finger point release + */ +static void mms_clear_input_data(struct mms_ts_info *info) +{ + int i; + + for (i = 0; i < MAX_FINGER_NUM; i++) { + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, false); + } + input_sync(info->input_dev); + + return; +} + +/* + * mms_fs_open, mms_fs_release, mms_event_handler, mms_fs_read, mms_fs_write + * melfas debugging function + */ +static int mms_fs_open(struct inode *node, struct file *fp) +{ + struct mms_ts_info *info; + struct i2c_client *client; + struct i2c_msg msg; + u8 buf[3] = { + MMS_UNIVERSAL_CMD, + MMS_CMD_SET_LOG_MODE, + true, + }; + + info = container_of(node->i_cdev, struct mms_ts_info, cdev); + client = info->client; + + disable_irq(info->irq); + fp->private_data = info; + + msg.addr = client->addr; + msg.flags = 0; + msg.buf = buf; + msg.len = sizeof(buf); + + i2c_transfer(client->adapter, &msg, 1); + + info->log.data = kzalloc(MAX_LOG_LENGTH * 20 + 5, GFP_KERNEL); + + mms_clear_input_data(info); + + return 0; +} + +static int mms_fs_release(struct inode *node, struct file *fp) +{ + struct mms_ts_info *info = fp->private_data; + + mms_clear_input_data(info); + mms_reboot(info); + + kfree(info->log.data); + enable_irq(info->irq); + + return 0; +} + +static void mms_event_handler(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + int sz; + int ret; + int row_num; + u8 reg = MMS_INPUT_EVENT; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = ®, + .len = 1, + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = info->log.data, + }, + + }; + struct mms_log_pkt { + u8 marker; + u8 log_info; + u8 code; + u8 element_sz; + u8 row_sz; + } __attribute__ ((packed)) *pkt = (struct mms_log_pkt *)info->log.data; + + memset(pkt, 0, sizeof(*pkt)); + + if (gpio_get_value(info->pdata->gpio_resetb)) + return; + + sz = i2c_smbus_read_byte_data(client, MMS_EVENT_PKT_SZ); + msg[1].len = sz; + + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (ret != ARRAY_SIZE(msg)) { + dev_err(&client->dev, + "failed to read %d bytes of data\n", + sz); + return; + } + + if ((pkt->marker & 0xf) == MMS_LOG_EVENT) { + if ((pkt->log_info & 0x7) == 0x1) { + pkt->element_sz = 0; + pkt->row_sz = 0; + + return; + } + + switch (pkt->log_info >> 4) { + case LOG_TYPE_U08: + case LOG_TYPE_S08: + msg[1].len = pkt->element_sz; + break; + case LOG_TYPE_U16: + case LOG_TYPE_S16: + msg[1].len = pkt->element_sz * 2; + break; + case LOG_TYPE_U32: + case LOG_TYPE_S32: + msg[1].len = pkt->element_sz * 4; + break; + default: + dev_err(&client->dev, "invalied log type\n"); + return; + } + + msg[1].buf = info->log.data + sizeof(struct mms_log_pkt); + reg = MMS_UNIVERSAL_RESULT; + row_num = pkt->row_sz ? pkt->row_sz : 1; + + while (row_num--) { + while (gpio_get_value(info->pdata->gpio_resetb)) + ; + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + msg[1].buf += msg[1].len; + }; + } else { + mms_report_input_data(info, sz, info->log.data); + memset(pkt, 0, sizeof(*pkt)); + } + + return; +} + +/* mms_report_input_data - The position of a touch send to platfrom */ +static void mms_report_input_data(struct mms_ts_info *info, u8 sz, u8 *buf) +{ + int i; + struct i2c_client *client = info->client; + int id; + int x; + int y; + int touch_major; + int pressure; + int key_code; + int key_state; + u8 *tmp; + + if (buf[0] == MMS_NOTIFY_EVENT) { + dev_info(&client->dev, "TSP mode changed (%d)\n", buf[1]); + goto out; + } else if (buf[0] == MMS_ERROR_EVENT) { + dev_info(&client->dev, "Error detected, restarting TSP\n"); + mms_clear_input_data(info); + mms_reboot(info); + esd_cnt++; + if (esd_cnt>= ESD_DETECT_COUNT) + { + i2c_smbus_write_byte_data(info->client, MMS_MODE_CONTROL, 0x04); + esd_cnt =0; + } + goto out; + } + + for (i = 0; i < sz; i += FINGER_EVENT_SZ) { + tmp = buf + i; + esd_cnt =0; + if (tmp[0] & MMS_TOUCH_KEY_EVENT) { + switch (tmp[0] & 0xf) { + case 1: + key_code = KEY_MENU; + break; + case 2: + key_code = KEY_BACK; + break; + default: + dev_err(&client->dev, "unknown key type\n"); + goto out; + break; + } + + key_state = (tmp[0] & 0x80) ? 1 : 0; + input_report_key(info->input_dev, key_code, key_state); + + } else { + id = (tmp[0] & 0xf) -1; + + x = tmp[2] | ((tmp[1] & 0xf) << 8); + y = tmp[3] | (((tmp[1] >> 4 ) & 0xf) << 8); + touch_major = tmp[4]; + pressure = tmp[5]; + + input_mt_slot(info->input_dev, id); + + if (!(tmp[0] & 0x80)) { + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, false); + continue; + } + + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, true); + input_report_abs(info->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(info->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(info->input_dev, ABS_MT_TOUCH_MAJOR, touch_major); + input_report_abs(info->input_dev, ABS_MT_PRESSURE, pressure); +// dev_notice(&client->dev,"P [%2d],([%3d],[%4d]) , major=%d, pressure=%d",id, x, y, tmp[4], tmp[5]); + } + } + + input_sync(info->input_dev); + +out: + return; + +} + +static ssize_t mms_fs_read(struct file *fp, char *rbuf, size_t cnt, loff_t *fpos) +{ + struct mms_ts_info *info = fp->private_data; + struct i2c_client *client = info->client; + int ret = 0; + + switch (info->log.cmd) { + case GET_RX_NUM: + ret = copy_to_user(rbuf, &info->rx_num, 1); + break; + case GET_TX_NUM: + ret = copy_to_user(rbuf, &info->tx_num, 1); + break; + case GET_EVENT_DATA: + mms_event_handler(info); + /* copy data without log marker */ + ret = copy_to_user(rbuf, info->log.data + 1, cnt); + break; + default: + dev_err(&client->dev, "unknown command\n"); + ret = -EFAULT; + break; + } + + return ret; +} + +static ssize_t mms_fs_write(struct file *fp, const char *wbuf, size_t cnt, loff_t *fpos) +{ + struct mms_ts_info *info = fp->private_data; + struct i2c_client *client = info->client; + u8 *buf; + struct i2c_msg msg = { + .addr = client->addr, + .flags = 0, + .len = cnt, + }; + int ret = 0; + + mutex_lock(&info->lock); + + if (!info->enabled) + goto tsp_disabled; + + msg.buf = buf = kzalloc(cnt + 1, GFP_KERNEL); + + if ((buf == NULL) || copy_from_user(buf, wbuf, cnt)) { + dev_err(&client->dev, "failed to read data from user\n"); + ret = -EIO; + goto out; + } + + if (cnt == 1) { + info->log.cmd = *buf; + } else { + if (i2c_transfer(client->adapter, &msg, 1) != 1) { + dev_err(&client->dev, "failed to transfer data\n"); + ret = -EIO; + goto out; + } + } + + ret = 0; + +out: + kfree(buf); +tsp_disabled: + mutex_unlock(&info->lock); + + return ret; +} +/* + * mms_isc_read_status - Check erase state function + */ +static int mms_isc_read_status(struct mms_ts_info *info, u32 val) +{ + struct i2c_client *client = info->client; + u8 cmd = ISC_CMD_READ_STATUS; + u32 result = 0; + int cnt = 100; + int ret = 0; + + do { + i2c_smbus_read_i2c_block_data(client, cmd, 4, (u8 *)&result); + if (result == val) + break; + msleep(1); + } while (--cnt); + + if (!cnt) { + dev_err(&client->dev, + "status read fail. cnt : %d, val : 0x%x != 0x%x\n", + cnt, result, val); + } + return ret; +} + +static int mms_isc_transfer_cmd(struct mms_ts_info *info, int cmd) +{ + struct i2c_client *client = info->client; + struct isc_packet pkt = { ISC_ADDR, cmd }; + struct i2c_msg msg = { + .addr = client->addr, + .flags = 0, + .len = sizeof(struct isc_packet), + .buf = (u8 *)&pkt, + }; + + return (i2c_transfer(client->adapter, &msg, 1) != 1); +} + +/* + * mms_isc_erase_page - ic page erase(1 kbyte) + */ +static int mms_isc_erase_page(struct mms_ts_info *info, int page) +{ + return mms_isc_transfer_cmd(info, ISC_CMD_PAGE_ERASE | page) || + mms_isc_read_status(info, ISC_PAGE_ERASE_DONE | ISC_PAGE_ERASE_ENTER | page); +} + +/* + * mms_isc_enter - isc enter command + */ +static int mms_isc_enter(struct mms_ts_info *info) +{ + return i2c_smbus_write_byte_data(info->client, MMS_CMD_ENTER_ISC, true); +} + +static int mms_isc_exit(struct mms_ts_info *info) +{ + return mms_isc_transfer_cmd(info, ISC_CMD_EXIT); +} + +/* + * mms_flash_section - f/w section(boot,core,config) download func + */ +static int mms_flash_section(struct mms_ts_info *info, struct mms_fw_img *img, const u8 *data) +{ + struct i2c_client *client = info->client; + struct isc_packet *isc_packet; + int ret; + int page, i; + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = ISC_XFER_LEN, + }, + }; + int ptr = img->offset; + + isc_packet = kzalloc(sizeof(*isc_packet) + ISC_XFER_LEN, GFP_KERNEL); + isc_packet->cmd = ISC_ADDR; + + msg[0].buf = (u8 *)isc_packet; + msg[1].buf = kzalloc(ISC_XFER_LEN, GFP_KERNEL); + + for (page = img->start_page; page <= img->end_page; page++) { + mms_isc_erase_page(info, page); + + for (i = 0; i < ISC_BLOCK_NUM; i++, ptr += ISC_XFER_LEN) { + /* flash firmware */ + u32 tmp = page * 256 + i * (ISC_XFER_LEN / 4); + put_unaligned_le32(tmp, &isc_packet->addr); + msg[0].len = sizeof(struct isc_packet) + ISC_XFER_LEN; + + memcpy(isc_packet->data, data + ptr, ISC_XFER_LEN); + if (i2c_transfer(client->adapter, msg, 1) != 1) + goto i2c_err; + + /* verify firmware */ + tmp |= ISC_CMD_READ; + put_unaligned_le32(tmp, &isc_packet->addr); + msg[0].len = sizeof(struct isc_packet); + + if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) != ARRAY_SIZE(msg)) + goto i2c_err; + + if (memcmp(isc_packet->data, msg[1].buf, ISC_XFER_LEN)) { +#if FLASH_VERBOSE_DEBUG + print_hex_dump(KERN_ERR, "mms fw wr : ", + DUMP_PREFIX_OFFSET, 16, 1, + isc_packet->data, ISC_XFER_LEN, false); + + print_hex_dump(KERN_ERR, "mms fw rd : ", + DUMP_PREFIX_OFFSET, 16, 1, + msg[1].buf, ISC_XFER_LEN, false); +#endif + dev_err(&client->dev, "flash verify failed\n"); + ret = -1; + goto out; + } + + } + } + + dev_info(&client->dev, "section [%d] update succeeded\n", img->type); + + ret = 0; + goto out; + +i2c_err: + dev_err(&client->dev, "i2c failed @ %s\n", __func__); + ret = -1; + +out: + kfree(isc_packet); + kfree(msg[1].buf); + + return ret; +} + +/* + * get_fw_version - f/w version read + */ +static int get_fw_version(struct i2c_client *client, u8 *buf) +{ + u8 cmd = MMS_FW_VERSION; + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + .buf = &cmd, + .len = 1, + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = buf, + .len = MAX_SECTION_NUM, + }, + }; + + return (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) != ARRAY_SIZE(msg)); +} + +/* + * mms_flash_fw -flash_section of parent function + * this function is IC version binary version compare and Download + */ +static int mms_flash_fw(const struct firmware *fw, struct mms_ts_info *info) +{ + int ret; + int i; + struct mms_bin_hdr *fw_hdr; + struct mms_fw_img **img; + struct i2c_client *client = info->client; + u8 ver[MAX_SECTION_NUM]; + u8 target[MAX_SECTION_NUM]; + int offset = sizeof(struct mms_bin_hdr); + int retires = 3; + bool update_flag = false; + bool isc_flag = true; + + fw_hdr = (struct mms_bin_hdr *)fw->data; + img = kzalloc(sizeof(*img) * fw_hdr->section_num, GFP_KERNEL); + + while (retires--) { + if (!get_fw_version(client, ver)) + break; + else + mms_reboot(info); + } + + if (retires < 0) { + dev_warn(&client->dev, "failed to obtain ver. info\n"); + isc_flag = false; + memset(ver, 0xff, sizeof(ver)); + } else { + print_hex_dump(KERN_INFO, "mms_ts fw ver : ", DUMP_PREFIX_NONE, 16, 1, + ver, MAX_SECTION_NUM, false); + } + + for (i = 0; i < fw_hdr->section_num; i++, offset += sizeof(struct mms_fw_img)) { + img[i] = (struct mms_fw_img *)(fw->data + offset); + target[i] = img[i]->version; + + if (ver[img[i]->type] != target[i]) { + if(isc_flag){ + mms_isc_enter(info); + isc_flag = false; + } + update_flag = true; + dev_info(&client->dev, + "section [%d] is need to be updated. ver : 0x%x, bin : 0x%x\n", + img[i]->type, ver[img[i]->type], target[i]); + + if ((ret = mms_flash_section(info, img[i], fw->data + fw_hdr->binary_offset))) { + mms_reboot(info); + goto out; + } + //memset(ver, 0xff, sizeof(ver)); + } else { + dev_info(&client->dev, "section [%d] is up to date\n", i); + } + } + + if (update_flag){ + mms_isc_exit(info); + msleep(5); + mms_reboot(info); + } + + + + if (get_fw_version(client, ver)) { + dev_err(&client->dev, "failed to obtain version after flash\n"); + ret = -1; + goto out; + } else { + for (i = 0; i < fw_hdr->section_num; i++) { + if (ver[img[i]->type] != target[i]) { + dev_info(&client->dev, + "version mismatch after flash. [%d] 0x%x != 0x%x\n", + i, ver[img[i]->type], target[i]); + + ret = -1; + goto out; + } + } + } + + ret = 0; + +out: + kfree(img); + + return ret; +} + +static void mms_fw_update_controller(const struct firmware *fw, void * context) +{ + struct mms_ts_info *info = context; + int retires = 3; + int ret; + + if (!fw) { + dev_err(&info->client->dev, "failed to read firmware\n"); + complete_all(&info->init_done); + return; + } + + do { + ret = mms_flash_fw(fw, info); + } while (ret && --retires); + + if (!retires) { + dev_err(&info->client->dev, "failed to flash firmware after retires\n"); + } + mms_ts_config(info); + release_firmware(fw); +} + +/* mms_ts_interrupt - interrupt thread */ +static irqreturn_t mms_ts_interrupt(int irq, void *dev_id) +{ +pr_debug("%s interrupt call %d \n",__func__,__LINE__); + struct mms_ts_info *info = dev_id; + struct i2c_client *client = info->client; + u8 buf[MAX_FINGER_NUM * FINGER_EVENT_SZ] = { 0, }; + int ret; + int sz; + u8 reg = MMS_INPUT_EVENT; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = ®, + .len = 1, + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = buf, + }, + }; + + sz = i2c_smbus_read_byte_data(client, MMS_EVENT_PKT_SZ); + msg[1].len = sz; + + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + + if (ret != ARRAY_SIZE(msg)) { + dev_err(&client->dev, + "failed to read %d bytes of touch data (%d)\n", + sz, ret); + } else { + pr_debug("%s report event %d \n",__func__,__LINE__); + mms_report_input_data(info, sz, buf); + } + + return IRQ_HANDLED; +} + +/* + * mms_ts_input_open - Register input device after call this function + * this function is wait firmware flash wait + */ +static int mms_ts_input_open(struct input_dev *dev) +{ +pr_debug("%s enter1 %d",__func__,__LINE__); + struct mms_ts_info *info = input_get_drvdata(dev); + int ret; +pr_debug("%s enterw %d",__func__,__LINE__); + ret = wait_for_completion_interruptible_timeout(&info->init_done, + msecs_to_jiffies(90 * MSEC_PER_SEC)); + + if (ret > 0) { + if (info->irq != -1) { + pr_debug("%s %d",__func__,__LINE__); + mms_ts_enable(info); + ret = 0; + } else { + ret = -ENXIO; + } + } else { + dev_err(&dev->dev, "error while waiting for device to init\n"); + ret = -ENXIO; + } + + return ret; +} + +/* + * mms_ts_input_close -If device power off state call this function + */ +static void mms_ts_input_close(struct input_dev *dev) +{ + struct mms_ts_info *info = input_get_drvdata(dev); + + mms_ts_disable(info); +} + +/* + * mms_ts_config - f/w check download & irq thread register + */ +static int mms_ts_config(struct mms_ts_info *info) +{ +pr_debug("%s config 1 %d \n",__func__,__LINE__); + struct i2c_client *client = info->client; + int ret; + pr_debug("%s config 2 %d \n",__func__,__LINE__); + ret = request_threaded_irq(client->irq, NULL, mms_ts_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + "mms_ts", info); +pr_debug("%s irq registered %d\n",__func__,__LINE__); + if (ret) { + dev_err(&client->dev, "failed to register irq\n"); + goto out; + } + disable_irq(client->irq); + info->irq = client->irq; + barrier(); + + info->tx_num = i2c_smbus_read_byte_data(client, MMS_TX_NUM); + info->rx_num = i2c_smbus_read_byte_data(client, MMS_RX_NUM); + info->key_num = i2c_smbus_read_byte_data(client, MMS_KEY_NUM); + + dev_info(&client->dev, "Melfas touch controller initialized\n"); + pr_debug("%s reboot called %d\n",__func__,__LINE__); + mms_reboot(info); + complete_all(&info->init_done); + pr_debug("%s init done %d\n",__func__,__LINE__); + +out: + return ret; +} + +/* + * bin_report_read, bin_report_write, bin_sysfs_read, bin_sysfs_write + * melfas debugging function + */ +static ssize_t bin_report_read(struct file *fp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + count = 0; + switch(info->data_cmd){ + case SYS_TXNUM: + dev_info(&info->client->dev, "tx send %d \n",info->tx_num); + buf[0]=info->tx_num; + count =1; + info->data_cmd = 0; + break; + case SYS_RXNUM: + dev_info(&info->client->dev, "rx send%d\n", info->rx_num); + buf[0]=info->rx_num; + count =1; + info->data_cmd = 0; + break; + case SYS_CLEAR: + dev_info(&info->client->dev, "Input clear\n"); + mms_clear_input_data(info); + count = 1; + info->data_cmd = 0; + break; + case SYS_ENABLE: + dev_info(&info->client->dev, "enable_irq \n"); + enable_irq(info->irq); + count = 1; + info->data_cmd = 0; + break; + case SYS_DISABLE: + dev_info(&info->client->dev, "disable_irq \n"); + disable_irq(info->irq); + count = 1; + info->data_cmd = 0; + break; + case SYS_INTERRUPT: + count = gpio_get_value(info->pdata->gpio_resetb); + info->data_cmd = 0; + break; + case SYS_RESET: + mms_reboot(info); + dev_info(&info->client->dev, "read mms_reboot\n"); + count = 1; + info->data_cmd = 0; + break; + } + return count; +} + +static ssize_t bin_report_write(struct file *fp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + if(buf[0]==100){ + mms_report_input_data(info, buf[1], &buf[2]); + }else{ + info->data_cmd=(int)buf[0]; + } + return count; +} +static struct bin_attribute bin_attr_data = { + .attr = { + .name = "report_data", + .mode = S_IRWXUGO, +}, + .size = PAGE_SIZE, + .read = bin_report_read, + .write = bin_report_write, +}; + +static ssize_t bin_sysfs_read(struct file *fp, struct kobject *kobj , struct bin_attribute *attr, + char *buf, loff_t off,size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + struct i2c_msg msg; + info->client = client; + msg.addr = client->addr; + msg.flags = I2C_M_RD ; + msg.buf = (u8 *)buf; + msg.len = count; + + switch (count) + { + case 65535: + mms_reboot(info); + dev_info(&client->dev, "read mms_reboot\n"); + return 0; + + default : + if(i2c_transfer(client->adapter, &msg, 1) != 1){ + dev_err(&client->dev, "failed to transfer data\n"); + mms_reboot(info); + return 0; + } + break; + + } + + return count; +} + +static ssize_t bin_sysfs_write(struct file *fp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + struct i2c_msg msg; + + msg.addr =client->addr; + msg.flags = 0; + msg.buf = (u8 *)buf; + msg.len = count; + + + if(i2c_transfer(client->adapter, &msg, 1) != 1){ + dev_err(&client->dev, "failed to transfer data\n"); + mms_reboot(info); + return 0; + } + + return count; +} + +static struct bin_attribute bin_attr = { + .attr = { + .name = "mms_bin", + .mode = S_IRWXUGO, + }, + .size = MMS_FLASH_PAGE_SZ, + .read = bin_sysfs_read, + .write = bin_sysfs_write, +}; + +static struct file_operations mms_fops = { + .owner = THIS_MODULE, + .open = mms_fs_open, + .release = mms_fs_release, + .read = mms_fs_read, + .write = mms_fs_write, +}; + +//melfas test mode +#ifdef __MMS_TEST_MODE__ +struct mms_ts_test test; +static ssize_t mms_intensity(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + int ret; + dev_info(&info->client->dev, "Intensity Test\n"); + if(get_intensity(&test)!=0){ + dev_err(&info->client->dev, "Intensity Test failed\n"); + return -1; + } + ret = snprintf(buf,PAGE_SIZE,"%s\n",test.get_data); + return ret; +} + +static DEVICE_ATTR(intensity, 0666, mms_intensity, NULL); + +static ssize_t mms_cmdelta(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + int ret; + dev_info(&info->client->dev, "cm delta Test\n"); + get_cm_test_init(&test); + get_cm_delta(&test); + get_cm_test_exit(&test); + + ret = snprintf(buf,PAGE_SIZE,"%s\n",test.get_data); + memset(test.get_data,0,4096); + return ret; +} +static DEVICE_ATTR(cmdelta, 0666, mms_cmdelta, NULL); + +static ssize_t mms_cmabs(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + int ret; + dev_info(&info->client->dev, "cm delta Test\n"); + get_cm_test_init(&test); + get_cm_abs(&test); + get_cm_test_exit(&test); + + + ret = snprintf(buf,PAGE_SIZE,"%s\n",test.get_data); + memset(test.get_data,0,4096); + return ret; +} +static DEVICE_ATTR(cmabs, 0666, mms_cmabs, NULL); + +static ssize_t mms_cmjitter(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + int ret; + dev_info(&info->client->dev, "cm delta Test\n"); + get_cm_test_init(&test); + get_cm_jitter(&test); + get_cm_test_exit(&test); + + ret = snprintf(buf,PAGE_SIZE,"%s\n",test.get_data); + memset(test.get_data,0,4096); + return ret; +} +static DEVICE_ATTR(cmjitter, 0666, mms_cmjitter, NULL); + +static struct attribute *mms_attrs[] = { + &dev_attr_intensity.attr, + &dev_attr_cmdelta.attr, + &dev_attr_cmabs.attr, + &dev_attr_cmjitter.attr, + NULL, +}; + +static const struct attribute_group mms_attr_group = { + .attrs = mms_attrs, +}; +#endif + +#ifdef CONFIG_OF +static const u8 mms_ts_keycode[] = {KEY_MENU, KEY_BACK}; +static unsigned int gpio_touchkey_len_en; +static const char * vdd_name; + +static void mms_ts_vdd_enable(bool on) +{ + static struct regulator *ts_vdd = NULL; + + if (ts_vdd == NULL) { + ts_vdd = regulator_get(NULL, vdd_name); + + if (IS_ERR(ts_vdd)) { + pr_err("Get regulator of TSP error!\n"); + return; + } + } + if (on) { + regulator_set_voltage(ts_vdd, 3000000, 3000000); + regulator_enable(ts_vdd); + } + else if (regulator_is_enabled(ts_vdd)) { + regulator_disable(ts_vdd); + } +} + +static void touchkey_led_vdd_enable(bool on) +{ + static int ret = 0; + + if (ret == 0) { + ret = gpio_request(gpio_touchkey_len_en, "touchkey_led_en"); + if (ret) { + printk("%s: request gpio error\n", __func__); + return -EIO; + } + gpio_direction_output(gpio_touchkey_len_en, 0); + ret = 1; + } + gpio_set_value(gpio_touchkey_len_en,on); +} + +static struct mms_ts_platform_data * mms_ts_parse_dt(struct device *dev) +{ + struct mms_ts_platform_data *pdata; + struct device_node *np = dev->of_node; + int ret; + + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct mms_ts_platform_data"); + return NULL; + } + pdata->gpio_sda = of_get_gpio(np, 0); + if(pdata->gpio_sda < 0){ + dev_err(dev, "fail to get gpio_sda\n"); + goto fail; + } + pdata->gpio_scl = of_get_gpio(np, 1); + if(pdata->gpio_scl < 0){ + dev_err(dev, "fail to get gpio_scl\n"); + goto fail; + } + pdata->gpio_int = of_get_gpio(np, 2); + if(pdata->gpio_int < 0){ + dev_err(dev, "fail to get gpio_int\n"); + goto fail; + } + gpio_touchkey_len_en = of_get_gpio(np, 3); + if(gpio_touchkey_len_en < 0){ + dev_err(dev, "fail to gpio_touchkey_len_en\n"); + goto fail; + } + ret = of_property_read_string(np, "vdd_name", &vdd_name); + if(ret){ + dev_err(dev, "fail to get vdd_name\n"); + goto fail; + } + ret = of_property_read_u32(np, "max_x", &pdata->max_x); + if(ret){ + dev_err(dev, "fail to get max_x\n"); + goto fail; + } + ret = of_property_read_u32(np, "max_y", &pdata->max_y); + if(ret){ + dev_err(dev, "fail to get max_y\n"); + goto fail; + } + ret = of_property_read_u32(np, "use_touchkey", &pdata->use_touchkey); + if(ret){ + dev_err(dev, "fail to get use_touchkey\n"); + goto fail; + } + + pdata->vdd_on = mms_ts_vdd_enable; + pdata->tkey_led_vdd_on = touchkey_led_vdd_enable; + pdata->touchkey_keycode = mms_ts_keycode; + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif + + +static int __init mms_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + struct mms_ts_info *info; + struct input_dev *input_dev; + int ret = 0; + const char *fw_name = FW_NAME; + struct mms_ts_platform_data * pdata; + + printk("probe enter \n"); + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !client->dev.platform_data) { + pdata = mms_ts_parse_dt(&client->dev); + if(pdata) { + client->dev.platform_data = pdata; + } else { + return -ENODEV; + } + } +#endif + + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) + return -EIO; + + info = kzalloc(sizeof(struct mms_ts_info), GFP_KERNEL); + + + input_dev = input_allocate_device(); + + if (!input_dev) { + dev_err(&client->dev, "Failed to allocated memory\n"); + return -ENOMEM; + } + + info->client = client; + info->input_dev = input_dev; + info->pdata = client->dev.platform_data; + init_completion(&info->init_done); + info->irq = -1; +pr_debug("probe mutex init \n"); + mutex_init(&info->lock); + + client->irq = gpio_to_irq(info->pdata->gpio_int); + input_mt_init_slots(input_dev, MAX_FINGER_NUM,0); + + snprintf(info->phys, sizeof(info->phys), + "%s/input0", dev_name(&client->dev)); + + input_dev->name = "Melfas MMS100s Touch Screen"; + input_dev->phys = info->phys; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + +pr_debug("probe dev init \n"); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, MAX_WIDTH, 0, 0); + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, MAX_PRESSURE, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, info->pdata->max_x, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, info->pdata->max_y, 0, 0); + + input_set_drvdata(input_dev, info); + +#if MMS_HAS_TOUCH_KEY + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(KEY_MENU, input_dev->keybit); + __set_bit(KEY_BACK, input_dev->keybit); +#endif + + ret = input_register_device(input_dev); + if (ret) { + dev_err(&client->dev, "failed to register input dev\n"); + return -EIO; + } + + i2c_set_clientdata(client, info); + + //mms_reboot(info); + mms_ts_enable(info); + info->enabled = true; + ret = request_threaded_irq(client->irq, NULL, mms_ts_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT," mms_ts", info); + if (ret < 0) { + dev_err(&client->dev, "Failed to register interrupt\n"); + } + info->irq = client->irq; + +pr_debug("%s enable FW %d\n",__func__,__LINE__); + info->fw_name = kstrdup(fw_name, GFP_KERNEL); +pr_debug("%s enable tsp %d\n",__func__,__LINE__); + ret = request_firmware_nowait(THIS_MODULE, true, fw_name, &client->dev, + GFP_KERNEL, info, mms_fw_update_controller); + if (ret) { + dev_err(&client->dev, "failed to schedule firmware update\n"); + return -EIO; + } + + esd_cnt = 0; +#ifdef CONFIG_HAS_EARLYSUSPEND + info->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + info->early_suspend.suspend = mms_ts_early_suspend; + info->early_suspend.resume = mms_ts_late_resume; + register_early_suspend(&info->early_suspend); +#endif +pr_debug("%s ALLOCH %d\n",__func__,__LINE__); + if (alloc_chrdev_region(&info->mms_dev, 0, 1, "mms_ts")) { + dev_err(&client->dev, "failed to allocate device region\n"); + return -ENOMEM; + } +pr_debug("%s FOPS %d\n",__func__,__LINE__); + cdev_init(&info->cdev, &mms_fops); + info->cdev.owner = THIS_MODULE; + + if (cdev_add(&info->cdev, info->mms_dev, 1)) { + dev_err(&client->dev, "failed to add ch dev\n"); + return -EIO; + } +pr_debug("%s CLASS CREATE %d\n",__func__,__LINE__); + info->class = class_create(THIS_MODULE, "mms_ts"); + device_create(info->class, NULL, info->mms_dev, NULL, "mms_ts"); + + if(sysfs_create_bin_file(&client->dev.kobj ,&bin_attr)){ + dev_err(&client->dev, "failed to create sysfs symlink\n"); + return -EAGAIN; + } + + if(sysfs_create_bin_file(&client->dev.kobj ,&bin_attr_data)){ + dev_err(&client->dev, "failed to create sysfs symlink\n"); + return -EAGAIN; + } + + if (sysfs_create_link(NULL, &client->dev.kobj, "mms_ts")) { + dev_err(&client->dev, "failed to create sysfs symlink\n"); + return -EAGAIN; + } +#ifdef __MMS_TEST_MODE__ + if (sysfs_create_group(&client->dev.kobj, &mms_attr_group)) { + dev_err(&client->dev, "failed to create sysfs group\n"); + return -EAGAIN; + } + test.get_data = kzalloc(4096, GFP_KERNEL); + test.client = client; + test.pdata = info->pdata; + test.tx_num = info->tx_num; + test.rx_num = info->rx_num; + test.key_num = info->key_num; + test.irq = info->irq; +#endif + dev_notice(&client->dev, "mms dev initialized\n"); + + return 0; +} + +static int __exit mms_ts_remove(struct i2c_client *client) +{ + struct mms_ts_info *info = i2c_get_clientdata(client); + + if (info->irq >= 0) + free_irq(info->irq, info); + +#ifdef __MMS_TEST_MODE__ + sysfs_remove_group(&info->client->dev.kobj, &mms_attr_group); + kfree(test.get_data); +#endif + sysfs_remove_link(NULL, "mms_ts"); + sysfs_remove_bin_file(&client->dev.kobj, &bin_attr); + sysfs_remove_bin_file(&client->dev.kobj, &bin_attr_data); + input_unregister_device(info->input_dev); + unregister_early_suspend(&info->early_suspend); + + device_destroy(info->class, info->mms_dev); + class_destroy(info->class); +#ifdef CONFIG_OF + kfree(info->pdata); +#endif + kfree(info->fw_name); + kfree(info); + + return 0; +} + +#if defined(CONFIG_PM) || defined(CONFIG_HAS_EARLYSUSPEND) +static int mms_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + + mutex_lock(&info->input_dev->mutex); + + if (info->input_dev->users) { + mms_ts_disable(info); + mms_clear_input_data(info); + } + + mutex_unlock(&info->input_dev->mutex); + return 0; + +} + +static int mms_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + + mutex_lock(&info->input_dev->mutex); + + if (info->input_dev->users) + mms_ts_enable(info); + + mutex_unlock(&info->input_dev->mutex); + + return 0; +} +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void mms_ts_early_suspend(struct early_suspend *h) +{ + struct mms_ts_info *info; + info = container_of(h, struct mms_ts_info, early_suspend); + mms_ts_suspend(&info->client->dev); +} + +static void mms_ts_late_resume(struct early_suspend *h) +{ + struct mms_ts_info *info; + info = container_of(h, struct mms_ts_info, early_suspend); + mms_ts_resume(&info->client->dev); +} +#endif + +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) +static const struct dev_pm_ops mms_ts_pm_ops = { + .suspend = mms_ts_suspend, + .resume = mms_ts_resume, +} +#endif + +static const struct i2c_device_id mms_ts_id[] = { + {"mms_ts", 0}, + { } +}; +MODULE_DEVICE_TABLE(i2c, mms_ts_id); + +#ifdef CONFIG_OF +static const struct of_device_id mms_ts_of_match[] = { + { .compatible = "Melfas,mms_ts", }, + { } +}; +#endif + +static struct i2c_driver mms_ts_driver = { + .probe = mms_ts_probe, + .remove = mms_ts_remove, + .driver = { + .name = "mms_ts", +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) + .pm = &mms_ts_pm_ops, +#endif +#ifdef CONFIG_OF + .of_match_table = mms_ts_of_match, +#endif + }, + .id_table = mms_ts_id, +}; + +static int __init mms_ts_init(void) +{ + return i2c_add_driver(&mms_ts_driver); +} + +static void __exit mms_ts_exit(void) +{ + return i2c_del_driver(&mms_ts_driver); +} + +module_init(mms_ts_init); +module_exit(mms_ts_exit); + +MODULE_VERSION("1.6.1"); +MODULE_DESCRIPTION("Touchscreen driver for MELFAS MMS-100s series"); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/touchscreen/mms114.c b/drivers/input/touchscreen/mms114.c new file mode 100644 index 00000000..1443532f --- /dev/null +++ b/drivers/input/touchscreen/mms114.c @@ -0,0 +1,596 @@ +/* + * Copyright (C) 2012 Samsung Electronics Co.Ltd + * Author: Joonyoung Shim + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Write only registers */ +#define MMS114_MODE_CONTROL 0x01 +#define MMS114_OPERATION_MODE_MASK 0xE +#define MMS114_ACTIVE (1 << 1) + +#define MMS114_XY_RESOLUTION_H 0x02 +#define MMS114_X_RESOLUTION 0x03 +#define MMS114_Y_RESOLUTION 0x04 +#define MMS114_CONTACT_THRESHOLD 0x05 +#define MMS114_MOVING_THRESHOLD 0x06 + +/* Read only registers */ +#define MMS114_PACKET_SIZE 0x0F +#define MMS114_INFOMATION 0x10 +#define MMS114_TSP_REV 0xF0 + +/* Minimum delay time is 50us between stop and start signal of i2c */ +#define MMS114_I2C_DELAY 50 + +/* 200ms needs after power on */ +#define MMS114_POWERON_DELAY 200 + +/* Touchscreen absolute values */ +#define MMS114_MAX_AREA 0xff + +#define MMS114_MAX_TOUCH 10 +#define MMS114_PACKET_NUM 8 + +/* Touch type */ +#define MMS114_TYPE_NONE 0 +#define MMS114_TYPE_TOUCHSCREEN 1 +#define MMS114_TYPE_TOUCHKEY 2 + +struct mms114_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct regulator *core_reg; + struct regulator *io_reg; + const struct mms114_platform_data *pdata; + + /* Use cache data for mode control register(write only) */ + u8 cache_mode_control; +}; + +struct mms114_touch { + u8 id:4, reserved_bit4:1, type:2, pressed:1; + u8 x_hi:4, y_hi:4; + u8 x_lo; + u8 y_lo; + u8 width; + u8 strength; + u8 reserved[2]; +} __packed; + +static int __mms114_read_reg(struct mms114_data *data, unsigned int reg, + unsigned int len, u8 *val) +{ + struct i2c_client *client = data->client; + struct i2c_msg xfer[2]; + u8 buf = reg & 0xff; + int error; + + if (reg <= MMS114_MODE_CONTROL && reg + len > MMS114_MODE_CONTROL) + BUG(); + + /* Write register: use repeated start */ + xfer[0].addr = client->addr; + xfer[0].flags = I2C_M_TEN | I2C_M_NOSTART; + xfer[0].len = 1; + xfer[0].buf = &buf; + + /* Read data */ + xfer[1].addr = client->addr; + xfer[1].flags = I2C_M_RD; + xfer[1].len = len; + xfer[1].buf = val; + + error = i2c_transfer(client->adapter, xfer, 2); + if (error != 2) { + dev_err(&client->dev, + "%s: i2c transfer failed (%d)\n", __func__, error); + return error < 0 ? error : -EIO; + } + udelay(MMS114_I2C_DELAY); + + return 0; +} + +static int mms114_read_reg(struct mms114_data *data, unsigned int reg) +{ + u8 val; + int error; + + if (reg == MMS114_MODE_CONTROL) + return data->cache_mode_control; + + error = __mms114_read_reg(data, reg, 1, &val); + return error < 0 ? error : val; +} + +static int mms114_write_reg(struct mms114_data *data, unsigned int reg, + unsigned int val) +{ + struct i2c_client *client = data->client; + u8 buf[2]; + int error; + + buf[0] = reg & 0xff; + buf[1] = val & 0xff; + + error = i2c_master_send(client, buf, 2); + if (error != 2) { + dev_err(&client->dev, + "%s: i2c send failed (%d)\n", __func__, error); + return error < 0 ? error : -EIO; + } + udelay(MMS114_I2C_DELAY); + + if (reg == MMS114_MODE_CONTROL) + data->cache_mode_control = val; + + return 0; +} + +static void mms114_process_mt(struct mms114_data *data, struct mms114_touch *touch) +{ + const struct mms114_platform_data *pdata = data->pdata; + struct i2c_client *client = data->client; + struct input_dev *input_dev = data->input_dev; + unsigned int id; + unsigned int x; + unsigned int y; + + if (touch->id > MMS114_MAX_TOUCH) { + dev_err(&client->dev, "Wrong touch id (%d)\n", touch->id); + return; + } + + if (touch->type != MMS114_TYPE_TOUCHSCREEN) { + dev_err(&client->dev, "Wrong touch type (%d)\n", touch->type); + return; + } + + id = touch->id - 1; + x = touch->x_lo | touch->x_hi << 8; + y = touch->y_lo | touch->y_hi << 8; + if (x > pdata->x_size || y > pdata->y_size) { + dev_dbg(&client->dev, + "Wrong touch coordinates (%d, %d)\n", x, y); + return; + } + + if (pdata->x_invert) + x = pdata->x_size - x; + if (pdata->y_invert) + y = pdata->y_size - y; + + dev_dbg(&client->dev, + "id: %d, type: %d, pressed: %d, x: %d, y: %d, width: %d, strength: %d\n", + id, touch->type, touch->pressed, + x, y, touch->width, touch->strength); + + input_mt_slot(input_dev, id); + input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, touch->pressed); + + if (touch->pressed) { + input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, touch->width); + input_report_abs(input_dev, ABS_MT_POSITION_X, x); + input_report_abs(input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(input_dev, ABS_MT_PRESSURE, touch->strength); + } +} + +static irqreturn_t mms114_interrupt(int irq, void *dev_id) +{ + struct mms114_data *data = dev_id; + struct input_dev *input_dev = data->input_dev; + struct mms114_touch touch[MMS114_MAX_TOUCH]; + int packet_size; + int touch_size; + int index; + int error; + + mutex_lock(&input_dev->mutex); + if (!input_dev->users) { + mutex_unlock(&input_dev->mutex); + goto out; + } + mutex_unlock(&input_dev->mutex); + + packet_size = mms114_read_reg(data, MMS114_PACKET_SIZE); + if (packet_size <= 0) + goto out; + + touch_size = packet_size / MMS114_PACKET_NUM; + + error = __mms114_read_reg(data, MMS114_INFOMATION, packet_size, + (u8 *)touch); + if (error < 0) + goto out; + + for (index = 0; index < touch_size; index++) + mms114_process_mt(data, touch + index); + + input_mt_report_pointer_emulation(data->input_dev, true); + input_sync(data->input_dev); + +out: + return IRQ_HANDLED; +} + +static int mms114_set_active(struct mms114_data *data, bool active) +{ + int val; + + val = mms114_read_reg(data, MMS114_MODE_CONTROL); + if (val < 0) + return val; + + val &= ~MMS114_OPERATION_MODE_MASK; + + /* If active is false, sleep mode */ + if (active) + val |= MMS114_ACTIVE; + + return mms114_write_reg(data, MMS114_MODE_CONTROL, val); +} + +static int mms114_get_version(struct mms114_data *data) +{ + struct device *dev = &data->client->dev; + u8 buf[6]; + int error; + + error = __mms114_read_reg(data, MMS114_TSP_REV, 6, buf); + if (error < 0) + return error; + + dev_info(dev, "TSP Rev: 0x%x, HW Rev: 0x%x, Firmware Ver: 0x%x\n", + buf[0], buf[1], buf[3]); + + return 0; +} + +static int mms114_setup_regs(struct mms114_data *data) +{ + const struct mms114_platform_data *pdata = data->pdata; + int val; + int error; + + error = mms114_get_version(data); + if (error < 0) + return error; + + error = mms114_set_active(data, true); + if (error < 0) + return error; + + val = (pdata->x_size >> 8) & 0xf; + val |= ((pdata->y_size >> 8) & 0xf) << 4; + error = mms114_write_reg(data, MMS114_XY_RESOLUTION_H, val); + if (error < 0) + return error; + + val = pdata->x_size & 0xff; + error = mms114_write_reg(data, MMS114_X_RESOLUTION, val); + if (error < 0) + return error; + + val = pdata->y_size & 0xff; + error = mms114_write_reg(data, MMS114_Y_RESOLUTION, val); + if (error < 0) + return error; + + if (pdata->contact_threshold) { + error = mms114_write_reg(data, MMS114_CONTACT_THRESHOLD, + pdata->contact_threshold); + if (error < 0) + return error; + } + + if (pdata->moving_threshold) { + error = mms114_write_reg(data, MMS114_MOVING_THRESHOLD, + pdata->moving_threshold); + if (error < 0) + return error; + } + + return 0; +} + +static int mms114_start(struct mms114_data *data) +{ + struct i2c_client *client = data->client; + int error; + + error = regulator_enable(data->core_reg); + if (error) { + dev_err(&client->dev, "Failed to enable avdd: %d\n", error); + return error; + } + + error = regulator_enable(data->io_reg); + if (error) { + dev_err(&client->dev, "Failed to enable vdd: %d\n", error); + regulator_disable(data->core_reg); + return error; + } + + mdelay(MMS114_POWERON_DELAY); + + error = mms114_setup_regs(data); + if (error < 0) { + regulator_disable(data->io_reg); + regulator_disable(data->core_reg); + return error; + } + + if (data->pdata->cfg_pin) + data->pdata->cfg_pin(true); + + enable_irq(client->irq); + + return 0; +} + +static void mms114_stop(struct mms114_data *data) +{ + struct i2c_client *client = data->client; + int error; + + disable_irq(client->irq); + + if (data->pdata->cfg_pin) + data->pdata->cfg_pin(false); + + error = regulator_disable(data->io_reg); + if (error) + dev_warn(&client->dev, "Failed to disable vdd: %d\n", error); + + error = regulator_disable(data->core_reg); + if (error) + dev_warn(&client->dev, "Failed to disable avdd: %d\n", error); +} + +static int mms114_input_open(struct input_dev *dev) +{ + struct mms114_data *data = input_get_drvdata(dev); + + return mms114_start(data); +} + +static void mms114_input_close(struct input_dev *dev) +{ + struct mms114_data *data = input_get_drvdata(dev); + + mms114_stop(data); +} + +#ifdef CONFIG_OF +static struct mms114_platform_data *mms114_parse_dt(struct device *dev) +{ + struct mms114_platform_data *pdata; + struct device_node *np = dev->of_node; + + if (!np) + return NULL; + + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "failed to allocate platform data\n"); + return NULL; + } + + if (of_property_read_u32(np, "x-size", &pdata->x_size)) { + dev_err(dev, "failed to get x-size property\n"); + return NULL; + }; + + if (of_property_read_u32(np, "y-size", &pdata->y_size)) { + dev_err(dev, "failed to get y-size property\n"); + return NULL; + }; + + of_property_read_u32(np, "contact-threshold", + &pdata->contact_threshold); + of_property_read_u32(np, "moving-threshold", + &pdata->moving_threshold); + + if (of_find_property(np, "x-invert", NULL)) + pdata->x_invert = true; + if (of_find_property(np, "y-invert", NULL)) + pdata->y_invert = true; + + return pdata; +} +#else +static inline struct mms114_platform_data *mms114_parse_dt(struct device *dev) +{ + return NULL; +} +#endif + +static int mms114_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct mms114_platform_data *pdata; + struct mms114_data *data; + struct input_dev *input_dev; + int error; + + pdata = dev_get_platdata(&client->dev); + if (!pdata) + pdata = mms114_parse_dt(&client->dev); + + if (!pdata) { + dev_err(&client->dev, "Need platform data\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_PROTOCOL_MANGLING)) { + dev_err(&client->dev, + "Need i2c bus that supports protocol mangling\n"); + return -ENODEV; + } + + data = devm_kzalloc(&client->dev, sizeof(struct mms114_data), + GFP_KERNEL); + input_dev = devm_input_allocate_device(&client->dev); + if (!data || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + data->client = client; + data->input_dev = input_dev; + data->pdata = pdata; + + input_dev->name = "MELPAS MMS114 Touchscreen"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->open = mms114_input_open; + input_dev->close = mms114_input_close; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + input_set_abs_params(input_dev, ABS_X, 0, data->pdata->x_size, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, data->pdata->y_size, 0, 0); + + /* For multi touch */ + input_mt_init_slots(input_dev, MMS114_MAX_TOUCH, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, + 0, MMS114_MAX_AREA, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, + 0, data->pdata->x_size, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, + 0, data->pdata->y_size, 0, 0); + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + data->core_reg = devm_regulator_get(&client->dev, "avdd"); + if (IS_ERR(data->core_reg)) { + error = PTR_ERR(data->core_reg); + dev_err(&client->dev, + "Unable to get the Core regulator (%d)\n", error); + return error; + } + + data->io_reg = devm_regulator_get(&client->dev, "vdd"); + if (IS_ERR(data->io_reg)) { + error = PTR_ERR(data->io_reg); + dev_err(&client->dev, + "Unable to get the IO regulator (%d)\n", error); + return error; + } + + error = devm_request_threaded_irq(&client->dev, client->irq, NULL, + mms114_interrupt, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + dev_name(&client->dev), data); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + return error; + } + disable_irq(client->irq); + + error = input_register_device(data->input_dev); + if (error) { + dev_err(&client->dev, "Failed to register input device\n"); + return error; + } + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int mms114_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms114_data *data = i2c_get_clientdata(client); + struct input_dev *input_dev = data->input_dev; + int id; + + /* Release all touch */ + for (id = 0; id < MMS114_MAX_TOUCH; id++) { + input_mt_slot(input_dev, id); + input_mt_report_slot_state(input_dev, MT_TOOL_FINGER, false); + } + + input_mt_report_pointer_emulation(input_dev, true); + input_sync(input_dev); + + mutex_lock(&input_dev->mutex); + if (input_dev->users) + mms114_stop(data); + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int mms114_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms114_data *data = i2c_get_clientdata(client); + struct input_dev *input_dev = data->input_dev; + int error; + + mutex_lock(&input_dev->mutex); + if (input_dev->users) { + error = mms114_start(data); + if (error < 0) { + mutex_unlock(&input_dev->mutex); + return error; + } + } + mutex_unlock(&input_dev->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(mms114_pm_ops, mms114_suspend, mms114_resume); + +static const struct i2c_device_id mms114_id[] = { + { "mms114", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mms114_id); + +#ifdef CONFIG_OF +static struct of_device_id mms114_dt_match[] = { + { .compatible = "melfas,mms114" }, + { } +}; +#endif + +static struct i2c_driver mms114_driver = { + .driver = { + .name = "mms114", + .owner = THIS_MODULE, + .pm = &mms114_pm_ops, + .of_match_table = of_match_ptr(mms114_dt_match), + }, + .probe = mms114_probe, + .id_table = mms114_id, +}; + +module_i2c_driver(mms114_driver); + +/* Module information */ +MODULE_AUTHOR("Joonyoung Shim "); +MODULE_DESCRIPTION("MELFAS mms114 Touchscreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/mms134s/Makefile b/drivers/input/touchscreen/mms134s/Makefile new file mode 100644 index 00000000..a4a9939b --- /dev/null +++ b/drivers/input/touchscreen/mms134s/Makefile @@ -0,0 +1,6 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. +obj-$(CONFIG_TOUCHSCREEN_MMS134S) += mms134s.o diff --git a/drivers/input/touchscreen/mms134s/mms134s.c b/drivers/input/touchscreen/mms134s/mms134s.c new file mode 100644 index 00000000..883ffdd6 --- /dev/null +++ b/drivers/input/touchscreen/mms134s/mms134s.c @@ -0,0 +1,1134 @@ +/* + * Copyright (C) 2014 Samsung Electronics Co. Ltd. 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 as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#ifdef CONFIG_OF +#include +#include +#endif +#ifdef CONFIG_PM_RUNTIME +#include +#endif + +#include "mms134s_fw.h" + +//#define dev_info(fmt, args...) printk(KERN_DEBUG "[TSP] %s: " fmt,__func__,## args) +//#define dev_err(fmt, args...) printk(KERN_DEBUG "[TSP] err: %s: " fmt,__func__,## args) +//#ifdef CONFIG_OF +//static struct regulator *mms_vdd_regulator; +static bool power_onoff_state = false; + +static int mms_setup_power(struct mms_info *info, bool onoff) +{ + + int ret=0; + struct regulator *touch_regulator_1v8 = NULL; + struct regulator *touch_regulator_3v3 = NULL; + + pr_info("[TSP] %s \n", __func__); + + touch_regulator_1v8 = regulator_get(NULL,"vddsim2"); + if (IS_ERR(touch_regulator_1v8)) { + touch_regulator_1v8 = NULL; + pr_info("get touch_regulator_1v8 regulator error\n"); + return; + } + + touch_regulator_3v3 = regulator_get(NULL,"vddcon"); + + if (IS_ERR(touch_regulator_3v3)) { + touch_regulator_1v8 = NULL; + pr_info("get touch_regulator_3v3 regulator error\n"); + return; + } + + if(onoff) { + regulator_set_voltage(touch_regulator_1v8, 1800000, 1800000); + ret = regulator_enable(touch_regulator_1v8); + if (ret) { + pr_info(KERN_ERR "%s: touch_regulator_1v8 enable failed (%d)\n",__func__, ret); + } + + regulator_set_voltage(touch_regulator_3v3, 3000000, 3000000); + ret = regulator_enable(touch_regulator_3v3); + if (ret) { + pr_info(KERN_ERR "%s: touch_regulator_3v3 enable failed (%d)\n",__func__, ret); + } + } + else + { + ret = regulator_disable(touch_regulator_1v8); + if (ret) { + pr_info(KERN_ERR "%s: touch_regulator_3v0 disable failed (%d)\n",__func__, ret); + } + + ret = regulator_disable(touch_regulator_3v3); + if (ret) { + pr_info(KERN_ERR "%s: touch_regulator_3v0 disable failed (%d)\n",__func__, ret); + } + } + + +#if 0 + struct device dev = info->client->dev; + int min_uv, max_uv; + int ret = 0; + + if (onoff) { + if (!mms_vdd_regulator) { + mms_vdd_regulator = regulator_get(&dev, "vddcammot"); + + if (IS_ERR(mms_vdd_regulator)) { + ret = PTR_ERR(mms_vdd_regulator); + dev_err(&dev, "Failed to get mms_vdd_regulator (%d)\n", ret); + printk("[TSP] mms_setup_power Failed to get mms_vdd_regulator (%d)\n", ret); + return ret; + } + + min_uv = max_uv = info->pdata->vdd_regulator_volt; + printk("[TSP] mms_setup_power before regulator_set_voltage \n"); + ret = regulator_set_voltage(mms_vdd_regulator, min_uv, max_uv); + if (ret < 0) { + dev_err(&dev, "Failed to set mms_vdd_regulator to \ + %d, %d uV (%d)\n", min_uv, max_uv, ret); + printk("[TSP] mms_setup_power Failed to set regulator_set_voltage (%d)\n", ret); + regulator_put(mms_vdd_regulator); + return ret; + } + + dev_info(&dev, "Set mms_vdd_regulator to %d, %d uV\n", + min_uv, max_uv); + printk("[TSP] mms_setup_power Set mms_vdd_regulator to %d, %d uV\n",min_uv, max_uv); + } + } + else { + if (mms_vdd_regulator) { + regulator_put(mms_vdd_regulator); + dev_info(&dev, "Put mms_vdd_regulator\n"); + printk( "[TSP] mms_setup_power Put mms_vdd_regulator\n"); + } + } +#endif + return ret; +} + +static int mms_onoff_power(struct mms_info *info, bool onoff) +{ + int ret = 0; + + if (onoff != power_onoff_state) + { + pr_info("%s()\n", __func__); + msleep(5); + + ret = mms_setup_power(info, onoff); + msleep(100); + power_onoff_state = onoff; + + } +#if 0 + struct device dev = info->client->dev; + int ret = 0; + + if (!mms_vdd_regulator) { + dev_err(&dev, "%s : no regulator\n", __func__); + printk("[TSP] %s : no regulator\n", __func__); + return -1; + } + + if (onoff) + regulator_enable(mms_vdd_regulator); + else + regulator_disable(mms_vdd_regulator); + + dev_info(&dev, "%s : %s\n", __func__, (onoff) ? "on" : "off"); + printk("[TSP]%s : %s\n", __func__, (onoff) ? "on" : "off"); +#endif + + return ret; +} +//#endif + +/* mms_enable - wake-up func (VDD on) */ +static void mms_enable(struct mms_info *info) +{ + if (info->enabled) { + dev_err(&info->client->dev, "%s : Already enable\n", __func__); + return; + } + + /* use vdd control instead */ + mms_onoff_power(info, true); + msleep(50); + + info->enabled = true; + enable_irq(info->irq); +} + +/* mms_disable - sleep func (VDD off) */ +static void mms_disable(struct mms_info *info) +{ + if (!info->enabled) { + dev_err(&info->client->dev, "%s : Already disable\n", __func__); + return; + } + + i2c_smbus_write_byte_data(info->client, MMS_POWER_CONTROL, 1); + + disable_irq(info->irq); + + /* use vdd control instead */ + msleep(50); + mms_onoff_power(info, false); + msleep(50); + + info->enabled = false; +} + +/* mms_reboot - IC reset */ +static void mms_reboot(struct mms_info *info) +{ + struct i2c_adapter *adapter = to_i2c_adapter(info->client->dev.parent); + + i2c_smbus_write_byte_data(info->client, MMS_POWER_CONTROL, 1); + i2c_lock_adapter(adapter); + + msleep(50); + mms_onoff_power(info, false); + msleep(150); + + mms_onoff_power(info, true); + msleep(50); + + i2c_unlock_adapter(adapter); +} + +/* + * mms_clear_input_data - all finger point release + */ +static void mms_clear_input_data(struct mms_info *info) +{ + int i; + + for (i = 0; i < MAX_FINGER_NUM; i++) { + input_mt_slot(info->input_dev, i); + + if (!info->finger_state[i]) + continue; + + info->finger_state[i] = false; + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, false); + dev_info(&info->client->dev, "[R][%d] : forced clear\n", i); + } + + input_sync(info->input_dev); + + return; +} + +/* mms_report_input_data - The position of a touch send to platfrom */ +static void mms_report_input_data(struct mms_info *info, u8 sz, u8 *buf) +{ + struct i2c_client *client = info->client; + static int esd_cnt = 0; + int x, y, id, i; + int major; + int pressure; + int key_code; + int key_state; + u8 *tmp; + + if (buf[0] == MMS_LOG_EVENT) { + dev_info(&client->dev, "TSP Log evnet (%d)\n", buf[1]); + goto out; + } else if (buf[0] == MMS_NOTIFY_EVENT) { + dev_info(&client->dev, "TSP mode changed (%d)\n", buf[1]); + goto out; + } else if (buf[0] == MMS_ERROR_EVENT) { + dev_info(&client->dev, "Error detected, restarting TSP\n"); + mms_clear_input_data(info); + mms_reboot(info); + esd_cnt++; + + if (esd_cnt >= ESD_DETECT_COUNT) { + i2c_smbus_write_byte_data(info->client, MMS_MODE_CONTROL, 0x04); + esd_cnt =0; + } + + goto out; + } + + for (i = 0; i < sz; i += FINGER_EVENT_SZ) { + tmp = buf + i; + esd_cnt = 0; + dev_info(&client->dev, "%d's event is 0x%x\n", i, tmp[0]); + if (tmp[0] & MMS_TOUCH_KEY_EVENT) { + switch (tmp[0] & 0xf) { + case 1: + key_code = KEY_MENU; + break; + case 2: + key_code = KEY_BACK; + break; + default: + dev_err(&client->dev, "Unknown key type\n"); + goto out; + } + + key_state = (tmp[0] & 0x80) ? 1 : 0; + input_report_key(info->input_dev, key_code, key_state); +#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP + dev_info(&client->dev, "key[%3d] is %s\n", key_code, + key_state ? "pressed" : "releaseed"); +#else + dev_info(&client->dev, + "key is %s\n", key_state ? "pressed" : "releaseed"); +#endif + + } else { + id = (tmp[0] & 0xf) - 1; + + x = tmp[2] | ((tmp[1] & 0xf) << 8); + y = tmp[3] | (((tmp[1] >> 4 ) & 0xf) << 8); + major = tmp[4]; + pressure = tmp[5]; + + input_mt_slot(info->input_dev, id); + + if (!(tmp[0] & 0x80)) { + if (info->finger_state[id]) { + info->finger_state[id] = false; + input_mt_report_slot_state(info->input_dev, + MT_TOOL_FINGER, false); + +#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP + dev_info(&client->dev, "[R][%d]: X[%d], Y[%d]\n", id, x, y); +#else + dev_info(&client->dev, "[R][%d]\n"); +#endif + } + continue; + } + + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, true); + input_report_abs(info->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(info->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(info->input_dev, ABS_MT_TOUCH_MAJOR, major); + input_report_abs(info->input_dev, ABS_MT_PRESSURE, pressure); + + if (!info->finger_state[id]) { + info->finger_state[id] = true; +#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP + dev_info(&client->dev, + "[P][%d]: X[%d], Y[%d], W[%d], Z[%d]\n", + id, x, y, major, pressure); +#else + dev_info(&client->dev, "[P][%d]\n",id); +#endif + } + } + } + + input_sync(info->input_dev); + +out: + dev_info(&client->dev, "end of %s\n", __func__); + return; +} + +/* mms_interrupt - interrupt thread */ +static irqreturn_t mms_interrupt(int irq, void *dev_id) +{ + struct mms_info *info = (struct mms_info *)dev_id; + struct i2c_client *client = info->client; + u8 reg = MMS_EVENT_PKT; + u8 buf[MAX_FINGER_NUM * FINGER_EVENT_SZ] = {0, }; + int ret, sz; + dev_info(&client->dev, "[TSP] %s: irq=%d", __func__,irq); + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = ®, + .len = 1, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = buf, + }, + }; + + dev_info(&client->dev,"[TSP] %s client:", __func__, client+MMS_EVENT_PKT_SZ); + sz = i2c_smbus_read_byte_data(client, MMS_EVENT_PKT_SZ); + if (sz < 0) { + dev_err(&client->dev, + "%s : Failed to read event packet size(%d)\n", __func__, sz); + goto out; + } + msg[1].len = sz; + + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + dev_info(&client->dev, "event is 0x%x, packet size is %d\n", buf[0], sz); + if (ret != ARRAY_SIZE(msg)) + dev_err(&client->dev, + "Failed to read %d bytes of touch data (%d)\n", sz, ret); + else + mms_report_input_data(info, sz, buf); + +out: + dev_info(&client->dev, "end of %s\n", __func__); + return IRQ_HANDLED; +} +/* +static int mms_usb_switch_nofify(struct notifer_block *nb, unsigned long val, + void *dev) +{ + struct mms_info *info = container_of(nb, struct mms_info, nb); + struct i2c_client *client = info->client; + + dev_info(&client->dev, "%s : val = %d\n", __func__, val); +} +*/ +static int mms_config(struct mms_info *info) +{ + struct i2c_client *client = info->client; + int ret = 0; + +/* info->nb.notifier_call = mms_usb_switch_nofify; + pxa_usb_register_notifier(PXA_USB_DEV_OTG, &info->nb);*/ + + info->enabled = true; + +out: + return ret; +} + +/* + * mms_isc_read_status - Check erase state function + */ +static int mms_isc_read_status(struct mms_info *info, u32 val) +{ + struct i2c_client *client = info->client; + u8 cmd = ISC_CMD_READ_STATUS; + u32 result = 0; + int cnt = 100; + int ret = 0; + + do { + i2c_smbus_read_i2c_block_data(client, cmd, 4, (u8 *)&result); + + if (result == val) + break; + + msleep(1); + } while (--cnt); + + if (!cnt) { + dev_err(&client->dev, + "Failed to read status. cnt : %d, val : 0x%x != 0x%x\n", + cnt, result, val); + } + + return ret; +} + +static int mms_isc_transfer_cmd(struct mms_info *info, int cmd) +{ + struct i2c_client *client = info->client; + struct isc_packet pkt = { ISC_ADDR, cmd }; + struct i2c_msg msg = { + .addr = client->addr, + .flags = 0, + .len = sizeof(struct isc_packet), + .buf = (u8 *)&pkt, + }; + + return i2c_transfer(client->adapter, &msg, 1) != 1; +} + +/* + * mms_isc_erase_page - ic page erase(1 kbyte) + */ +static int mms_isc_erase_page(struct mms_info *info, int page) +{ + return mms_isc_transfer_cmd(info, ISC_CMD_PAGE_ERASE | page) || + mms_isc_read_status( + info, ISC_PAGE_ERASE_DONE | ISC_PAGE_ERASE_ENTER | page + ); +} + +/* + * mms_isc_enter - isc enter command + */ +static int mms_isc_enter(struct mms_info *info) +{ + return i2c_smbus_write_byte_data(info->client, MMS_CMD_ENTER_ISC, true); +} + +static int mms_isc_exit(struct mms_info *info) +{ + return mms_isc_transfer_cmd(info, ISC_CMD_EXIT); +} + +/* + * mms_get_fw_version - f/w version read + */ +static int mms_get_fw_version(struct i2c_client *client, u8 *buf) +{ + u8 cmd = MMS_FW_VERSION; + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + .buf = &cmd, + .len = 1, + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = buf, + .len = MAX_SECTION_NUM, + }, + }; + + return i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) + != ARRAY_SIZE(msg); +} + +/* + * mms_flash_section - f/w section(boot,core,config) download func + */ +static int mms_flash_section(struct mms_info *info, struct mms_fw_img *img, + const u8 *data) +{ + struct i2c_client *client = info->client; + struct isc_packet *isc_packet; + struct i2c_msg msg[2] = { + { + .addr = client->addr, + .flags = 0, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = ISC_XFER_LEN, + }, + }; + int ptr = img->offset; + int ret; + int page, i; + u32 tmp; + + isc_packet = kzalloc(sizeof(struct isc_packet) + ISC_XFER_LEN, GFP_KERNEL); + isc_packet->cmd = ISC_ADDR; + + msg[0].buf = (u8 *)isc_packet; + msg[1].buf = kzalloc(ISC_XFER_LEN, GFP_KERNEL); + + for (page = img->start_page; page <= img->end_page; page++) { + mms_isc_erase_page(info, page); + + for (i = 0; i < ISC_BLOCK_NUM; i++, ptr += ISC_XFER_LEN) { + /* flash firmware */ + tmp = page * 256 + i * (ISC_XFER_LEN / 4); + put_unaligned_le32(tmp, &isc_packet->addr); + msg[0].len = sizeof(struct isc_packet) + ISC_XFER_LEN; + + memcpy(isc_packet->data, data + ptr, ISC_XFER_LEN); + + if (i2c_transfer(client->adapter, msg, 1) != 1) + goto i2c_err; + + /* verify firmware */ + tmp |= ISC_CMD_READ; + put_unaligned_le32(tmp, &isc_packet->addr); + msg[0].len = sizeof(struct isc_packet); + + if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) + != ARRAY_SIZE(msg)) + goto i2c_err; + + if (memcmp(isc_packet->data, msg[1].buf, ISC_XFER_LEN)) { +#if FLASH_VERBOSE_DEBUG + print_hex_dump(KERN_ERR, "mms134s fw wr : ", + DUMP_PREFIX_OFFSET, 16, 1, + isc_packet->data, ISC_XFER_LEN, false); + + print_hex_dump(KERN_ERR, "mms134s fw rd : ", + DUMP_PREFIX_OFFSET, 16, 1, + msg[1].buf, ISC_XFER_LEN, false); +#endif + dev_err(&client->dev, "Failed to flash verify\n"); + ret = -1; + goto out; + } + } + } + + dev_info(&client->dev, "Section [%d] update succeeded\n", img->type); + + ret = 0; + goto out; + +i2c_err: + dev_err(&client->dev, "%s : i2c failed\n", __func__); + ret = -1; + +out: + kfree(isc_packet); + kfree(msg[1].buf); + + return ret; +} + +/* + * mms_flash_fw -flash_section of parent function + * this function is IC version binary version compare and Download + */ +static int mms_flash_fw(const struct firmware *fw, struct mms_info *info) +{ + int ret = 0; + int i; + struct mms_bin_hdr *fw_hdr = (struct mms_bin_hdr *)fw->data; + struct mms_fw_img **img; + struct i2c_client *client = info->client; + u8 ver[MAX_SECTION_NUM]; + u8 target[MAX_SECTION_NUM]; + int offset = sizeof(struct mms_bin_hdr); + int retires = 3; + bool update_flag = false; + bool isc_flag = true; + + img = kzalloc( + sizeof(struct mms_fw_img *) * fw_hdr->section_num, GFP_KERNEL); + + while (retires--) { + if (!mms_get_fw_version(client, ver)) + break; + else + mms_reboot(info); + } + + if (retires < 0) { + dev_err(&client->dev, "Failed to obtain ver. info\n"); + isc_flag = false; + memset(ver, 0xff, sizeof(ver)); + } else { + print_hex_dump(KERN_INFO, "mms134s fw ver : ", DUMP_PREFIX_NONE, 16, 1, + ver, MAX_SECTION_NUM, false); + } + + for (i = 0; i < fw_hdr->section_num; i++, + offset += sizeof(struct mms_fw_img)) { + img[i] = (struct mms_fw_img *)(fw->data + offset); + target[i] = img[i]->version; + + if (ver[img[i]->type] != target[i]) { + if(isc_flag){ + mms_isc_enter(info); + isc_flag = false; + } + + update_flag = true; + dev_info(&client->dev, + "Section [%d] is need to be updated. ver : 0x%x, bin : 0x%x\n", + img[i]->type, ver[img[i]->type], target[i]); + + if (ret = mms_flash_section( + info, img[i], fw->data + fw_hdr->binary_offset)) { + mms_reboot(info); + goto out; + } + } else { + dev_info(&client->dev, "Section [%d] is up to date\n", i); + } + } + + if (update_flag) { + mms_isc_exit(info); + msleep(5); + mms_reboot(info); + } + + if (mms_get_fw_version(client, ver)) { + dev_err(&client->dev, "Failed to obtain version after flash\n"); + ret = -1; + goto out; + } else { + for (i = 0; i < fw_hdr->section_num; i++) { + if (ver[img[i]->type] != target[i]) { + dev_info(&client->dev, + "Version mismatch after flash. [%d] 0x%x != 0x%x\n", + i, ver[img[i]->type], target[i]); + + ret = -1; + goto out; + } + } + } + +out: + kfree(img); + + return ret; +} + +/* + * mms_fw_update_controller - firmware check & update + */ +#if 0 +static int mms_fw_update_controller(struct mms_info *info) +{ + struct i2c_client *client = info->client; + struct firmware *fw; + int retires = 3; + int ret = 0; + + ret = request_firmware(&fw, MMS_FW_NAME, &client->dev); + if (ret) { + dev_err(&info->client->dev, "Failed to requesting firmware\n"); + goto out; + } + + do { + ret = mms_flash_fw(fw, info); + } while (ret && --retires); + + if (!retires) + dev_err(&info->client->dev, "Failed to flash fw after retires\n"); + + release_firmware(fw); + +out: + return ret; +} +#else +static void mms_fw_update_controller(const struct firmware *fw, void * context) +{ + struct mms_info *info = context; + int retires = 3; + int ret; + + if (!fw) { + dev_err(&info->client->dev, "failed to read firmware\n"); + return; + } + + do { + ret = mms_flash_fw(fw, info); + } while (ret && --retires); + + if (!retires) { + dev_err(&info->client->dev, "failed to flash firmware after retires\n"); + } + mms_config(info); + release_firmware(fw); +} +#endif + +#ifdef CONFIG_OF +static struct of_device_id mms_dt_ids[] = { + { .compatible = "melfas,mms134s", }, + {} +}; +MODULE_DEVICE_TABLE(of, mms_dt_ids); + +static int mms_probe_dt(struct device_node *np, struct device *dev, + struct mms_platform_data *pdata) +{ + struct of_device_id *match; + int ret = 0; + + if (!np) { + dev_err(dev, "Device node not found\n"); + return -EINVAL; + } + + match = of_match_device(mms_dt_ids, dev); + if (!match) { + dev_err(dev, "Compatible mismatch\n"); + return -EINVAL; + } + + ret = of_property_read_u32(np, "melfas,max_x", &pdata->max_x); + if (ret) { + dev_err(dev, "Failed to get property max_x from node(%d)\n", ret); + goto out; + } + + ret = of_property_read_u32(np, "melfas,max_y", &pdata->max_y); + if (ret) { + dev_err(dev, "Failed to get property max_y from node(%d)\n", ret); + goto out; + } + + ret = of_property_read_u32(np, "melfas,irqflags", &pdata->irqflags); + if (ret) { + dev_err(dev, "Failed to get property irqflags from node(%d)\n", ret); + goto out; + } + + pdata->gpio_int = of_get_named_gpio(np, "melfas,gpio_int", 0); + if (pdata->gpio_int < 0) { + dev_err(dev, "Failed to get property gpio_int(%d)\n", pdata->gpio_int); + ret = pdata->gpio_int; + goto out; + } + + ret = of_property_read_u32(np, + "melfas,vdd_regulator_volt", &pdata->vdd_regulator_volt); + if (ret) { + dev_err(dev, + "Failed to get property vdd_regulator_volt from node(%d)\n", ret); + goto out; + } + + ret = of_property_read_string(np, "melfas,inkernel_fw_name", + &pdata->inkernel_fw_name); + if (ret) { + dev_err(dev, + "Failed to get property inkernel_fw_name from node(%d)\n", ret); + goto out; + } + + ret = of_property_read_string(np, "melfas,ums_fw_name", + &pdata->ums_fw_name); + if (ret) { + dev_err(dev, + "Failed to get property ums_fw_name from node(%d)\n", ret); + goto out; + } + +out: + return ret; +} +#endif + +#if TSP_SEC_FACTORY +#include "mms134s_sec.c" +#endif + +static int mms_probe(struct i2c_client *client, struct i2c_device_id *id) +{ + struct mms_platform_data *pdata = client->dev.platform_data; + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + struct device_node *np = client->dev.of_node; + struct mms_info *info; + struct input_dev *input_dev; + int ret = 0; + + printk("[TSP] start mms_probe\n"); + + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "Not compatible i2c function\n"); + printk("[TSP] %s Not compatible i2c function\n",__func__); + return -EIO; + } +#ifdef CONFIG_OF + pdata = kzalloc(sizeof(struct mms_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Failed to allocate memory\n"); + pirntk("[TSP] %s Failed to allocate memory\n",__func__); + return -ENOMEM; + } + + ret = mms_probe_dt(np, &client->dev, pdata); + if (ret < 0) { + dev_err(&client->dev, "Failed to get platform data from node\n"); + printk("[TSP] %s Failed to get platform data from node\n",__func__); + goto err_probe_dt; + } +#else + + if (!pdata) { + dev_err(&client->dev, "Platform data not found\n"); + printk("[TSP] %s Platform data not found\n",__func__); + return -EINVAL; + } +#endif + + info = kzalloc(sizeof(struct mms_info), GFP_KERNEL); + if (!info) { + dev_err(&client->dev, "Failed to allocate memory\n"); + printk("[TSP] Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_data_alloc; + } + + info->client = client; + info->pdata = pdata; + + /*set vdd regulator*/ + mms_setup_power(info, true); + mms_onoff_power(info, true); + + /*upload firmware file*/ + dev_info(&client->dev, "%s enable FW %d\n",__func__,__LINE__); + info->pdata->inkernel_fw_name = kstrdup(MMS_FW_NAME, GFP_KERNEL); + dev_info(&client->dev, "firmware name: %s\n", info->pdata->inkernel_fw_name); + dev_info(&client->dev, "%s enable tsp %d\n",__func__,__LINE__); + ret = request_firmware_nowait(THIS_MODULE, true, MMS_FW_NAME, &client->dev, + GFP_KERNEL, info, mms_fw_update_controller); + + if (ret) { + dev_err(&client->dev, "failed to schedule firmware update\n"); + kfree(info); + goto err_data_alloc; + } + + dev_info(&client->dev, "firmware request done\n"); + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + printk("[TSP] Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_input_alloc; + } + + info->input_dev = input_dev; + + snprintf(info->phys, sizeof(info->phys), "%s/input0", + dev_name(&client->dev)); + + dev_info(&client->dev, "[TSP] %s/input0",dev_name(&client->dev)); + input_dev->name = "Melfas MMS134s Touch Screen"; + input_dev->phys = info->phys; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if MMS_HAS_TOUCH_KEY + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(KEY_MENU, input_dev->keybit); + __set_bit(KEY_BACK, input_dev->keybit); +#endif + + input_mt_init_slots(input_dev, MAX_FINGER_NUM, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, MAX_WIDTH, 0, 0); + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, MAX_PRESSURE, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, + info->pdata->max_x, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, + info->pdata->max_y, 0, 0); + + ret = input_register_device(input_dev); + if (ret) { + dev_err(&client->dev, "Failed to register input dev(%d)\n", ret); + printk("[TSP] Failed to register input dev(%d)\n", ret); + goto err_input_register; + } + + input_set_drvdata(input_dev, info); + i2c_set_clientdata(client, info); + + mms_enable(info); + info->enabled = true; + + info->finger_state = kzalloc(sizeof(bool) * MAX_FINGER_NUM, GFP_KERNEL); + if (!info->finger_state) { + dev_err(&client->dev, "Failed to allocate memory\n"); + printk("[TSP] Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_state_alloc; + } + memset(info->finger_state, 0x00, sizeof(bool) * MAX_FINGER_NUM); + + /* configure touchscreen interrupt gpio */ + ret = gpio_request(52, "mms134s_irq_gpio"); + if (ret) { + dev_err(&client->dev, "[TSP]unable to request gpio.\n"); + goto err_init_drv; + } + client->irq = gpio_to_irq(52); + info->irq = gpio_to_irq(52); + + dev_info(&client->dev,"[TSP] client-> irq = %d \n",client->irq); + ret = request_threaded_irq(client->irq, NULL, mms_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT,"mms134s", info); + + if (ret) { + dev_err(&client->dev, "Failed to register irq(%d)\n", ret); + printk("[TSP] Failed to register irq(%d)\n", ret); + goto err_request_irq; + } + + ret = mms_config(info); + if (ret) { + dev_err(&client->dev, "Failed mms134 configuration\n"); + printk("[TSP] Failed mms134 configuration\n"); + goto err_mms_config; + } + +#ifdef CONFIG_PM_RUNTIME + pm_runtime_enable(&client->dev); +#endif + +#if TSP_SEC_FACTORY + ret = init_sec(info); + if (ret) { + dev_err(&client->dev, "Failed to initialize SEC_FACTORY\n"); + printk("[TSP] Failed to initialize SEC_FACTORY\n"); + goto err_init_sec; + } +#endif + + dev_info(&client->dev, "mms134s initialized\n"); + printk("[TSP] mms134s initialized\n"); + + return 0; + +err_init_drv: +err_init_sec: +err_mms_config: +err_request_irq: + kfree(info->finger_state); +err_state_alloc: + input_unregister_device(input_dev); +err_input_register: + input_free_device(input_dev); +err_input_alloc: + kfree(info); +err_data_alloc: +#ifdef CONFIG_OF +err_probe_dt: + kfree(pdata); +#endif + dev_info(&client->dev, "Failed to initialization\n"); + printk("[TSP] Failed to initialization\n"); + + return ret; +} + +static int mms_remove(struct i2c_client *client) +{ + struct mms_info *info = i2c_get_clientdata(client); + + kfree(info->finger_state); + input_unregister_device(info->input_dev); + input_free_device(info->input_dev); +#ifdef CONIFG_OF + kfree(info->pdata); +#endif + kfree(info); + return 0; +} + +#ifdef CONFIG_PM +static int mms_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms_info *info = i2c_get_clientdata(client); + + mutex_lock(&info->input_dev->mutex); + + if (info->input_dev->users) { + mms_clear_input_data(info); + mms_disable(info); + } + + mutex_unlock(&info->input_dev->mutex); + + return 0; +} + +static int mms_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms_info *info = i2c_get_clientdata(client); + + mutex_lock(&info->input_dev->mutex); + + if (info->input_dev->users) + mms_enable(info); + + mutex_unlock(&info->input_dev->mutex); + + return 0; +} +#endif + +static struct i2c_device_id mms_id[] = { + {MMS_DEV_NAME, 0}, +}; +MODULE_DEVICE_TABLE(i2c, mms_id); + +#ifdef CONFIG_PM +static struct dev_pm_ops mms_pm_ops = { +#ifdef CONFIG_PM_RUNTIME + SET_RUNTIME_PM_OPS(mms_suspend, mms_resume, NULL) +#else + .suspend = mms_suspend, + .resume = mms_resume, +#endif +}; +#endif + +static struct i2c_driver mms_driver = { + .id_table = mms_id, + .probe = mms_probe, + .remove = mms_remove, + .driver = { + .owner = THIS_MODULE, + .name = MMS_DEV_NAME, +#ifdef CONFIG_OF + .of_match_table = of_match_ptr(mms_dt_ids), +#endif +#ifdef CONFIG_PM + .pm = &mms_pm_ops, +#endif + }, +}; + +static int __init mms134s_init(void) +{ + // #if PRINT_TSP_LOG + printk("[TSP] mms134s_init\n"); + // #endif + + + return i2c_add_driver(&mms_driver); + } + + + static void __exit mms134s_exit(void) + { + i2c_del_driver(&mms_driver); + } + + module_init(mms134s_init); + module_exit(mms134s_exit); + + +MODULE_DESCRIPTION("Touchscreen driver for MELFAS MMS134S"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/mms134s/mms134s_fw.h b/drivers/input/touchscreen/mms134s/mms134s_fw.h new file mode 100644 index 00000000..abcf97e8 --- /dev/null +++ b/drivers/input/touchscreen/mms134s/mms134s_fw.h @@ -0,0 +1,1296 @@ + +//--------------------------------------------- +// Hex2Mfsb Converter v1.3 +// 2013.04.09 +//--------------------------------------------- + +int mms134s_fw_size = 20544; + +char mms134s_fw[] = +{ + 0x4D, 0x42, 0x4E, 0x01, 0x4D, 0x31, 0x48, 0x53, 0x32, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x02, 0x00, 0x28, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, + 0x00, 0x18, 0x00, 0x20, 0xD9, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, + 0xE9, 0x03, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, + 0xE9, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, + 0x2D, 0x02, 0x00, 0x00, 0x89, 0x03, 0x00, 0x00, 0x41, 0x02, 0x00, 0x00, 0x19, 0x02, 0x00, 0x00, + 0xD5, 0x03, 0x00, 0x00, 0x06, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x00, 0x21, + 0x59, 0x70, 0x19, 0x68, 0x0F, 0x20, 0x81, 0x43, 0x0A, 0x43, 0x1A, 0x60, 0x70, 0x47, 0xC0, 0x46, + 0x00, 0x00, 0x00, 0x20, 0x06, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x68, + 0x04, 0x4A, 0x0A, 0x40, 0x80, 0x21, 0x49, 0x02, 0x0A, 0x43, 0x1A, 0x60, 0x70, 0x47, 0xC0, 0x46, + 0x01, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xF0, 0xFF, 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, 0x01, 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, 0x00, 0x00, 0x00, 0x20, 0x38, 0xB5, 0xFF, 0x23, 0x00, 0x22, 0x1B, 0x04, + 0x1A, 0x60, 0xBF, 0xF3, 0x6F, 0x8F, 0x80, 0x22, 0xCD, 0x23, 0xD2, 0x05, 0x13, 0x71, 0x01, 0x33, + 0xDB, 0xB2, 0xF2, 0x2B, 0xFA, 0xD1, 0x80, 0x23, 0x0E, 0x22, 0xDB, 0x05, 0x5A, 0x72, 0x33, 0x49, + 0x33, 0x4B, 0x00, 0x22, 0x00, 0xE0, 0x04, 0xC3, 0x8B, 0x42, 0xFC, 0xD3, 0x31, 0x4B, 0xFF, 0x22, + 0x1A, 0x70, 0x31, 0x49, 0x80, 0x23, 0x31, 0x4A, 0xDB, 0x00, 0x14, 0x68, 0x01, 0xCB, 0x20, 0x18, + 0x10, 0x60, 0x8B, 0x42, 0xF9, 0xD1, 0x00, 0x22, 0x2D, 0x4C, 0x2E, 0x48, 0x11, 0x1C, 0x10, 0x23, + 0x01, 0x3B, 0xDB, 0xB2, 0xE5, 0x5C, 0x52, 0x19, 0xC5, 0x5C, 0xD2, 0xB2, 0x49, 0x19, 0xC9, 0xB2, + 0x00, 0x2B, 0xF5, 0xD1, 0x28, 0x4C, 0x23, 0x78, 0xFF, 0x3B, 0x58, 0x42, 0x43, 0x41, 0x1A, 0x43, + 0x26, 0x4B, 0x18, 0x78, 0xFF, 0x38, 0x45, 0x42, 0x68, 0x41, 0x01, 0x43, 0x24, 0x48, 0x17, 0xD1, + 0x24, 0x49, 0x01, 0x60, 0x1D, 0x49, 0x09, 0x68, 0x00, 0x29, 0x15, 0xD1, 0x00, 0x2A, 0x13, 0xD1, + 0x21, 0x78, 0x1A, 0x78, 0x91, 0x42, 0x0F, 0xD1, 0x1F, 0x4A, 0x11, 0x78, 0x1F, 0x4A, 0x12, 0x78, + 0x91, 0x42, 0x09, 0xD1, 0x1A, 0x78, 0x13, 0x4B, 0x1A, 0x70, 0x00, 0xF0, 0x49, 0xF9, 0x03, 0xE0, + 0x00, 0x2A, 0x01, 0xD1, 0x1A, 0x4B, 0x03, 0x60, 0xA0, 0x23, 0x84, 0x22, 0xDB, 0x05, 0x5A, 0x70, + 0x13, 0x4A, 0x12, 0x68, 0x00, 0x2A, 0x03, 0xD0, 0x11, 0x78, 0x80, 0x22, 0x0A, 0x43, 0xDA, 0x70, + 0x14, 0x4B, 0x15, 0x4A, 0x13, 0x60, 0x15, 0x4A, 0x13, 0x60, 0x15, 0x4A, 0x13, 0x60, 0x15, 0x4B, + 0x04, 0x22, 0x1A, 0x60, 0x02, 0x22, 0x1A, 0x60, 0x62, 0xB6, 0xFE, 0xE7, 0x28, 0x06, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x20, 0x24, 0x06, 0x00, 0x20, 0xF0, 0x4F, 0x00, 0x00, 0x14, 0x00, 0x00, 0x20, + 0x10, 0x04, 0x00, 0x00, 0xF0, 0x4F, 0x00, 0x00, 0x1F, 0x04, 0x00, 0x00, 0xFF, 0x4F, 0x00, 0x00, + 0x20, 0x06, 0x00, 0x20, 0xF1, 0x4F, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFE, 0x4F, 0x00, 0x00, + 0x11, 0x04, 0x00, 0x00, 0xE9, 0x03, 0x00, 0x00, 0x08, 0x00, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x20, + 0x10, 0x00, 0x00, 0x20, 0x00, 0xE1, 0x00, 0xE0, 0x03, 0x4A, 0x00, 0x23, 0x13, 0x70, 0x80, 0x22, + 0xD2, 0x05, 0x13, 0x70, 0x70, 0x47, 0xC0, 0x46, 0x00, 0x00, 0x00, 0x20, 0x03, 0x4A, 0x00, 0x23, + 0x13, 0x70, 0x80, 0x22, 0xD2, 0x05, 0xD3, 0x63, 0x70, 0x47, 0xC0, 0x46, 0x02, 0x00, 0x00, 0x20, + 0x7F, 0xB5, 0xA0, 0x23, 0xDB, 0x05, 0x9C, 0x68, 0x64, 0x07, 0x64, 0x0F, 0xE2, 0xB2, 0x02, 0x2A, + 0x1D, 0xD0, 0x04, 0x2A, 0x6D, 0xD0, 0x01, 0x2A, 0x72, 0xD1, 0x42, 0x49, 0x00, 0x20, 0x08, 0x60, + 0x18, 0x7B, 0x41, 0x49, 0x08, 0x60, 0x09, 0x68, 0x5F, 0x29, 0x69, 0xD1, 0x44, 0x21, 0x59, 0x70, + 0x80, 0x21, 0xC9, 0x05, 0x48, 0x69, 0x08, 0x24, 0x20, 0x43, 0x48, 0x61, 0x19, 0x68, 0x0A, 0x43, + 0x1A, 0x60, 0xC0, 0x46, 0x1A, 0x68, 0x10, 0x21, 0x0A, 0x43, 0x1A, 0x60, 0xFE, 0xE7, 0x37, 0x4B, + 0x1B, 0x78, 0x02, 0x2B, 0x03, 0xD1, 0x33, 0x4B, 0x1A, 0x68, 0x08, 0x32, 0x1A, 0x60, 0x34, 0x4B, + 0x1B, 0x68, 0x98, 0x47, 0x30, 0x4B, 0x19, 0x68, 0x2E, 0x4B, 0xC9, 0xB2, 0x18, 0x68, 0x0B, 0x1C, + 0x40, 0x33, 0xDB, 0xB2, 0xC0, 0xB2, 0x0C, 0x2B, 0x16, 0xD8, 0x09, 0x18, 0x08, 0x1C, 0xCC, 0x23, + 0xC0, 0x38, 0x5B, 0x1A, 0x08, 0x2B, 0x00, 0xDD, 0x08, 0x23, 0xDB, 0xB2, 0x29, 0x49, 0x2A, 0x4A, + 0x07, 0xE0, 0x01, 0x3B, 0xDB, 0xB2, 0x0E, 0x68, 0x5D, 0x1C, 0x2D, 0x18, 0x75, 0x19, 0x2D, 0x78, + 0x9D, 0x54, 0x00, 0x2B, 0xF5, 0xD1, 0x2B, 0xE0, 0x0B, 0x1C, 0x1F, 0x33, 0xDB, 0xB2, 0x0A, 0x2B, + 0x26, 0xD8, 0x22, 0x4B, 0x01, 0x25, 0x1A, 0x78, 0x01, 0xAB, 0x1A, 0x70, 0x32, 0x22, 0x5A, 0x70, + 0x1F, 0x4A, 0x5D, 0x71, 0x12, 0x78, 0x9D, 0x71, 0x9A, 0x70, 0x00, 0x22, 0xDA, 0x70, 0x1A, 0x71, + 0xDA, 0x71, 0x1A, 0x72, 0x5A, 0x72, 0x09, 0x18, 0x13, 0x22, 0x17, 0x4D, 0x9A, 0x72, 0xE1, 0x39, + 0x08, 0x22, 0x01, 0x3A, 0xD2, 0xB2, 0x58, 0x18, 0x80, 0x5C, 0x50, 0x55, 0x00, 0x2A, 0xF8, 0xD1, + 0x06, 0xE0, 0x14, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x0A, 0x4B, 0x1A, 0x68, 0x04, 0x32, 0x1A, 0x60, + 0x0A, 0x4B, 0x01, 0x21, 0x1C, 0x70, 0xA0, 0x23, 0xDB, 0x05, 0x1A, 0x68, 0x0A, 0x43, 0x1A, 0x60, + 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x1A, 0x68, 0x10, 0x21, 0x0A, 0x43, 0x1A, 0x60, + 0x7F, 0xBD, 0xC0, 0x46, 0x18, 0x06, 0x00, 0x20, 0x1C, 0x06, 0x00, 0x20, 0x03, 0x00, 0x00, 0x20, + 0x0C, 0x00, 0x00, 0x20, 0x20, 0x06, 0x00, 0x20, 0x10, 0x00, 0x00, 0x50, 0xFF, 0x03, 0x00, 0x00, + 0x24, 0x06, 0x00, 0x20, 0x08, 0x00, 0x00, 0x20, 0x10, 0xB5, 0xA0, 0x23, 0x11, 0x22, 0xDB, 0x05, + 0x0D, 0x4C, 0x1A, 0x70, 0x22, 0x78, 0x02, 0x2A, 0x01, 0xD1, 0x0C, 0x4B, 0x0E, 0xE0, 0x22, 0x78, + 0x00, 0x2A, 0x0D, 0xD0, 0x98, 0x68, 0xF0, 0x22, 0x12, 0x03, 0x80, 0x21, 0x10, 0x40, 0xC9, 0x02, + 0x88, 0x42, 0x05, 0xD0, 0x9B, 0x68, 0x13, 0x42, 0x02, 0xD0, 0x05, 0x4B, 0x1B, 0x68, 0x98, 0x47, + 0x00, 0x23, 0x23, 0x70, 0x10, 0xBD, 0xC0, 0x46, 0x03, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x20, + 0x08, 0x00, 0x00, 0x20, 0x03, 0x4A, 0x00, 0x23, 0x13, 0x70, 0x80, 0x22, 0xD2, 0x05, 0x93, 0x70, + 0x70, 0x47, 0xC0, 0x46, 0x01, 0x00, 0x00, 0x20, 0x70, 0x47, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, + 0x4D, 0x31, 0x48, 0x53, 0x43, 0x46, 0x33, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF6, 0x48, 0x4D, 0x45, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x28, + 0xF8, 0xB5, 0x02, 0xF0, 0x33, 0xF9, 0x02, 0xF0, 0x97, 0xFE, 0x03, 0xF0, 0xCF, 0xF9, 0xD4, 0x4B, + 0x1B, 0x68, 0x98, 0x47, 0xD3, 0x4B, 0x0E, 0x22, 0x1A, 0x70, 0xD3, 0x4B, 0x1A, 0x78, 0x00, 0x2A, + 0x27, 0xD1, 0xD0, 0x49, 0x0D, 0x20, 0x08, 0x70, 0xD0, 0x49, 0x0A, 0x70, 0x01, 0x22, 0x1A, 0x70, + 0x00, 0xF0, 0x18, 0xFA, 0xCE, 0x4B, 0x9A, 0x78, 0x5A, 0x70, 0xC9, 0x4B, 0x1B, 0x68, 0x98, 0x47, + 0x01, 0xF0, 0xB6, 0xFD, 0x00, 0xF0, 0x2A, 0xFF, 0x80, 0x23, 0xDB, 0x05, 0x59, 0x6B, 0xC9, 0x4A, + 0x0A, 0x40, 0x5A, 0x63, 0x00, 0xF0, 0x14, 0xFA, 0x01, 0xF0, 0x40, 0xFE, 0x00, 0xF0, 0x1E, 0xFF, + 0x00, 0xF0, 0x10, 0xFF, 0xC4, 0x4B, 0x02, 0x20, 0x1B, 0x68, 0x98, 0x47, 0xC3, 0x48, 0x01, 0xF0, + 0xE1, 0xFE, 0xC3, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x03, 0xD1, 0xC2, 0x4A, 0x12, 0x78, 0x00, 0x2A, + 0x05, 0xD0, 0x80, 0x21, 0xC9, 0x05, 0x08, 0x22, 0x48, 0x69, 0x10, 0x42, 0xFC, 0xD0, 0xBD, 0x4A, + 0x12, 0x78, 0x1A, 0x70, 0xB3, 0x4B, 0x1F, 0x78, 0x7B, 0xB2, 0x0D, 0x2B, 0x09, 0xD0, 0x02, 0xDC, + 0x00, 0x2B, 0x42, 0xD0, 0xDF, 0xE0, 0x0F, 0x2B, 0x17, 0xD0, 0x11, 0x2B, 0x00, 0xD0, 0xDA, 0xE0, + 0x1A, 0xE0, 0xAF, 0x4B, 0x58, 0x78, 0x02, 0xF0, 0xC4, 0xF8, 0xB3, 0x4D, 0xA8, 0x78, 0x01, 0xF0, + 0x8D, 0xFE, 0xB2, 0x4C, 0x20, 0x60, 0xE8, 0x78, 0x01, 0xF0, 0x88, 0xFE, 0xB0, 0x4B, 0x60, 0x60, + 0x1B, 0x7A, 0xAA, 0x78, 0x5B, 0xB2, 0x53, 0x43, 0xA3, 0x60, 0xA4, 0x4B, 0x00, 0x22, 0x1A, 0x70, + 0xA9, 0x4B, 0x18, 0x78, 0x00, 0xF0, 0x1E, 0xFB, 0xA0, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x00, 0xF0, + 0xC7, 0xF9, 0xFF, 0xF7, 0x9F, 0xFD, 0x02, 0xF0, 0xDF, 0xF8, 0xA3, 0x4B, 0x00, 0x25, 0x1C, 0x7D, + 0x06, 0xE0, 0x02, 0xF0, 0x71, 0xF9, 0x00, 0xF0, 0xB3, 0xF9, 0xFF, 0xF7, 0x93, 0xFD, 0x01, 0x35, + 0xAC, 0x42, 0xF6, 0xD1, 0x02, 0xF0, 0xD2, 0xF9, 0x00, 0xF0, 0xAA, 0xF9, 0x91, 0x4B, 0x00, 0x22, + 0x1A, 0x70, 0x95, 0x4B, 0x20, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x80, 0x23, 0xDB, 0x05, 0x1A, 0x7A, + 0x12, 0x2A, 0x06, 0xD0, 0x1B, 0x7A, 0x1A, 0x2B, 0x03, 0xD0, 0x96, 0x4B, 0x01, 0x20, 0x1B, 0x68, + 0x98, 0x47, 0x00, 0xF0, 0xA3, 0xF9, 0x94, 0x4B, 0x01, 0x26, 0x80, 0x24, 0x1E, 0x70, 0xE4, 0x05, + 0xE2, 0x6B, 0x80, 0x23, 0x5B, 0x04, 0x13, 0x43, 0xE3, 0x63, 0xFF, 0xF7, 0x6B, 0xFD, 0x70, 0x42, + 0x8E, 0x49, 0x8F, 0x4A, 0x02, 0xF0, 0x22, 0xFD, 0x02, 0xF0, 0xF6, 0xF9, 0x00, 0x28, 0x05, 0xD1, + 0xE3, 0x6B, 0x1B, 0x0E, 0x1B, 0x06, 0x1E, 0x43, 0xE6, 0x63, 0x6D, 0xE0, 0x7E, 0x4D, 0x04, 0x20, + 0x2B, 0x68, 0x98, 0x47, 0x87, 0x4B, 0x1A, 0x78, 0x87, 0x4B, 0x00, 0x2A, 0x1B, 0xD0, 0x1A, 0x68, + 0x03, 0x2A, 0x01, 0xDC, 0x01, 0x32, 0x0C, 0xE0, 0x00, 0xF0, 0xB4, 0xF9, 0x71, 0x4B, 0x0F, 0x22, + 0x1A, 0x70, 0x82, 0x4B, 0x1A, 0x78, 0x09, 0x2A, 0x01, 0xD8, 0x01, 0x32, 0x1A, 0x70, 0x7E, 0x4B, + 0x00, 0x22, 0x1A, 0x60, 0x80, 0x23, 0xDB, 0x05, 0xDA, 0x6B, 0x01, 0x21, 0x12, 0x0E, 0x12, 0x06, + 0x0A, 0x43, 0xDA, 0x63, 0x48, 0xE0, 0x1A, 0x60, 0x00, 0xF0, 0xB8, 0xFE, 0x2B, 0x68, 0x07, 0x20, + 0x98, 0x47, 0x00, 0xF0, 0x79, 0xFE, 0xFF, 0xF7, 0x3D, 0xFD, 0x75, 0x4B, 0x1B, 0x78, 0x00, 0x2B, + 0x10, 0xD1, 0x02, 0xF0, 0x45, 0xFD, 0x00, 0x28, 0x0C, 0xD1, 0x00, 0xF0, 0x8B, 0xF9, 0x5D, 0x4B, + 0x0F, 0x22, 0x1A, 0x70, 0xE3, 0x6B, 0x1B, 0x0E, 0x1B, 0x06, 0x1E, 0x43, 0xE6, 0x63, 0xFF, 0xF7, + 0x3B, 0xFD, 0x29, 0xE0, 0xFF, 0xF7, 0x38, 0xFD, 0x00, 0xF0, 0xAA, 0xFE, 0x69, 0x4B, 0x1B, 0x68, + 0x98, 0x47, 0x01, 0xF0, 0x83, 0xFA, 0x01, 0xF0, 0xBD, 0xFB, 0x57, 0x4B, 0x0F, 0x20, 0x1B, 0x68, + 0x98, 0x47, 0x65, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x0B, 0xD1, 0x64, 0x4B, 0x1B, 0x78, 0x00, 0x2B, + 0x07, 0xD0, 0x80, 0x23, 0xDB, 0x05, 0xDA, 0x6B, 0x01, 0x21, 0x12, 0x0E, 0x12, 0x06, 0x0A, 0x43, + 0xDA, 0x63, 0x00, 0xF0, 0x69, 0xF9, 0x00, 0x28, 0x06, 0xD0, 0x4B, 0x4B, 0x12, 0x20, 0x1B, 0x68, + 0x98, 0x47, 0x5B, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x00, 0xF0, 0x5A, 0xFA, 0x59, 0x4B, 0x00, 0x20, + 0x18, 0x56, 0x00, 0xF0, 0x15, 0xFA, 0x44, 0x4B, 0x14, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x56, 0x4B, + 0x1F, 0x70, 0x3E, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD1, 0xCE, 0xE6, 0x53, 0x4E, 0x00, 0x25, + 0x33, 0x78, 0xAB, 0x42, 0x00, 0xD0, 0xD4, 0xE0, 0xC7, 0xE6, 0x3B, 0x78, 0x5B, 0xB2, 0x01, 0x33, + 0x00, 0xD1, 0xCF, 0xE0, 0x3C, 0x78, 0x63, 0xB2, 0x03, 0x2B, 0x5B, 0xD0, 0x05, 0xDC, 0x01, 0x2B, + 0x4D, 0xD0, 0x53, 0xDC, 0x00, 0x2B, 0x09, 0xD0, 0xB0, 0xE0, 0x05, 0x2B, 0x00, 0xD1, 0xA6, 0xE0, + 0x00, 0xDA, 0x9B, 0xE0, 0x06, 0x2B, 0x00, 0xD0, 0xA8, 0xE0, 0x2D, 0xE0, 0x80, 0x22, 0xD2, 0x05, + 0x08, 0x23, 0x51, 0x69, 0x19, 0x42, 0xFC, 0xD0, 0x2D, 0x4A, 0x01, 0x23, 0x13, 0x70, 0x40, 0x4A, + 0x00, 0x24, 0x15, 0x68, 0x14, 0x60, 0x3F, 0x4A, 0x3F, 0x49, 0x13, 0x70, 0x3F, 0x4A, 0x10, 0x68, + 0x01, 0x40, 0x80, 0x20, 0x98, 0x40, 0x01, 0x43, 0x11, 0x60, 0x3D, 0x4A, 0x16, 0x20, 0x13, 0x60, + 0x3C, 0x4A, 0x13, 0x70, 0x20, 0x4B, 0x1B, 0x68, 0x98, 0x47, 0x00, 0xF0, 0xB3, 0xF8, 0x1C, 0x4B, + 0x9A, 0x78, 0x5A, 0x70, 0x01, 0xF0, 0xAC, 0xFC, 0x01, 0xF0, 0x1C, 0xFF, 0x01, 0xF0, 0x78, 0xFF, + 0x20, 0x1C, 0x00, 0xF0, 0x07, 0xFA, 0x79, 0xE0, 0x00, 0x23, 0x33, 0x70, 0x19, 0x4B, 0x32, 0x49, + 0x1A, 0x78, 0x17, 0x4B, 0x18, 0x48, 0x1A, 0x70, 0x29, 0x4B, 0x2D, 0x4A, 0x1D, 0x60, 0x01, 0x23, + 0x13, 0x60, 0x2C, 0x4A, 0x13, 0x70, 0x50, 0x22, 0x02, 0xF0, 0x62, 0xFE, 0x66, 0xE0, 0x0E, 0x4B, + 0x18, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x27, 0x4B, 0x1C, 0x70, 0x5F, 0xE0, 0x0A, 0x4B, 0x19, 0x20, + 0x1B, 0x68, 0x02, 0xE0, 0x08, 0x4B, 0x1A, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x01, 0x22, 0x53, 0xE0, + 0x14, 0x07, 0x00, 0x20, 0xBD, 0x09, 0x00, 0x20, 0x6F, 0x07, 0x00, 0x20, 0x6E, 0x07, 0x00, 0x20, + 0x98, 0x0A, 0x00, 0x20, 0xFF, 0xC0, 0xFF, 0xFF, 0x54, 0x08, 0x00, 0x20, 0x50, 0x46, 0x00, 0x00, + 0x6C, 0x07, 0x00, 0x20, 0x6D, 0x07, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0xB0, 0x09, 0x00, 0x20, + 0x58, 0x0A, 0x00, 0x20, 0x18, 0x07, 0x00, 0x20, 0x02, 0x00, 0x00, 0x20, 0x60, 0x0F, 0x00, 0x20, + 0x62, 0x0F, 0x00, 0x20, 0xA0, 0x07, 0x00, 0x20, 0x9C, 0x07, 0x00, 0x20, 0xA4, 0x07, 0x00, 0x20, + 0x98, 0x07, 0x00, 0x20, 0x50, 0x08, 0x00, 0x20, 0x0B, 0x08, 0x00, 0x20, 0x88, 0x08, 0x00, 0x20, + 0x5C, 0x08, 0x00, 0x20, 0x96, 0x07, 0x00, 0x20, 0x31, 0x06, 0x00, 0x20, 0x70, 0x07, 0x00, 0x20, + 0x28, 0x06, 0x00, 0x20, 0x18, 0x0C, 0x00, 0x20, 0xFF, 0xF8, 0xFF, 0xFF, 0x68, 0x11, 0x00, 0x20, + 0x94, 0x09, 0x00, 0x20, 0x21, 0x0A, 0x00, 0x20, 0x98, 0x35, 0x00, 0x00, 0x15, 0x4B, 0x1A, 0x68, + 0x15, 0x4B, 0x1B, 0x68, 0xD2, 0x1A, 0x15, 0x4B, 0x1A, 0x60, 0x04, 0x22, 0x04, 0xE0, 0x14, 0x4B, + 0x1C, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x08, 0x22, 0x12, 0x4B, 0x1A, 0x70, 0x0F, 0x4A, 0x12, 0x4B, + 0x08, 0x21, 0x1A, 0x60, 0x80, 0x23, 0xDB, 0x05, 0x5A, 0x69, 0x8A, 0x43, 0x5A, 0x61, 0x0F, 0x4A, + 0x10, 0x78, 0x06, 0x28, 0x02, 0xD1, 0x58, 0x69, 0x08, 0x42, 0xFC, 0xD0, 0xFF, 0x23, 0x13, 0x70, + 0x00, 0xE0, 0x0A, 0x4F, 0x33, 0x78, 0x00, 0x2B, 0x00, 0xD0, 0x26, 0xE7, 0x08, 0x4A, 0x13, 0x70, + 0xEB, 0xE5, 0xC0, 0x46, 0xEC, 0x4F, 0x00, 0x00, 0x14, 0x00, 0x00, 0x20, 0x94, 0x09, 0x00, 0x20, + 0x54, 0x08, 0x00, 0x20, 0x21, 0x0A, 0x00, 0x20, 0x64, 0x0F, 0x00, 0x20, 0xB0, 0x0B, 0x00, 0x20, + 0x6F, 0x07, 0x00, 0x20, 0x08, 0xB5, 0x02, 0xF0, 0x8B, 0xFC, 0x02, 0xF0, 0xCD, 0xFC, 0x08, 0xBD, + 0x08, 0xB5, 0x80, 0x23, 0x01, 0x22, 0xDB, 0x05, 0x5A, 0x70, 0xFF, 0xF7, 0x0D, 0xFC, 0x08, 0xBD, + 0x08, 0xB5, 0xFF, 0xF7, 0xD7, 0xFB, 0xFF, 0xF7, 0xF3, 0xFF, 0x08, 0xBD, 0x00, 0xB5, 0x18, 0x4B, + 0x18, 0x4A, 0x18, 0x78, 0x41, 0xB2, 0x4B, 0x1C, 0x03, 0xD0, 0x17, 0x4B, 0x1B, 0x78, 0x00, 0x2B, + 0x04, 0xD0, 0x00, 0x23, 0x13, 0x60, 0x98, 0x42, 0x0E, 0xD1, 0x14, 0xE0, 0x13, 0x4B, 0x10, 0x68, + 0x9B, 0x68, 0x98, 0x42, 0x01, 0xDA, 0x01, 0x30, 0x10, 0x60, 0x01, 0x29, 0x0B, 0xD0, 0x0D, 0x4A, + 0x12, 0x68, 0x9A, 0x42, 0x07, 0xDB, 0x01, 0x23, 0x0C, 0x49, 0x9A, 0x00, 0x89, 0x58, 0x0C, 0x4A, + 0x11, 0x60, 0x07, 0x4A, 0x13, 0x70, 0x0A, 0x4B, 0x19, 0x68, 0x80, 0x23, 0xDB, 0x05, 0xDA, 0x6B, + 0x09, 0x02, 0x12, 0x0E, 0x09, 0x0A, 0x12, 0x06, 0x0A, 0x43, 0xDA, 0x63, 0x00, 0xBD, 0xC0, 0x46, + 0x32, 0x06, 0x00, 0x20, 0x10, 0x07, 0x00, 0x20, 0x0B, 0x08, 0x00, 0x20, 0xB0, 0x09, 0x00, 0x20, + 0x04, 0x00, 0x00, 0x20, 0x08, 0xB5, 0x01, 0xF0, 0xB9, 0xF8, 0x02, 0x4B, 0x1B, 0x68, 0x98, 0x47, + 0x08, 0xBD, 0xC0, 0x46, 0x5C, 0x08, 0x00, 0x20, 0x10, 0xB5, 0x4B, 0x4B, 0x4B, 0x4A, 0x19, 0x78, + 0x00, 0x20, 0xCB, 0xB2, 0x00, 0x2B, 0x04, 0xD1, 0x10, 0x68, 0x49, 0x4C, 0xA0, 0x42, 0x01, 0xD0, + 0x01, 0x30, 0x10, 0x60, 0x47, 0x4A, 0x00, 0x20, 0x10, 0x70, 0x83, 0x42, 0x2F, 0xD1, 0x46, 0x48, + 0x04, 0x78, 0x00, 0x2C, 0x0A, 0xD0, 0x02, 0x78, 0x01, 0x23, 0x52, 0xB2, 0x02, 0x2A, 0x00, 0xD1, + 0x13, 0x1C, 0x40, 0x4A, 0x13, 0x70, 0x00, 0x23, 0x03, 0x70, 0x72, 0xE0, 0x3F, 0x4C, 0x20, 0x78, + 0x00, 0x28, 0x05, 0xD0, 0x3E, 0x4B, 0x01, 0x20, 0x10, 0x70, 0x21, 0x70, 0x19, 0x70, 0x69, 0xE0, + 0x3C, 0x4C, 0x3D, 0x48, 0xE1, 0x1C, 0xC9, 0x7F, 0x00, 0x68, 0x88, 0x42, 0x0A, 0xDB, 0x3B, 0x49, + 0x04, 0x34, 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0xE4, 0x7F, 0xA0, 0x42, 0x02, 0xDB, 0x0B, 0x60, + 0x02, 0x21, 0x11, 0x70, 0x36, 0x49, 0x00, 0x22, 0x0A, 0x70, 0x33, 0x49, 0x25, 0xE0, 0x35, 0x4A, + 0x10, 0x60, 0x35, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x20, 0xD0, 0x34, 0x4A, 0x2D, 0x48, 0x14, 0x88, + 0x01, 0x8C, 0x2F, 0x4A, 0x8C, 0x42, 0x12, 0xD2, 0x31, 0x49, 0x0C, 0x88, 0x31, 0x49, 0x45, 0x31, + 0x09, 0x78, 0x8C, 0x42, 0x0B, 0xD2, 0x12, 0x78, 0x00, 0x2A, 0x0F, 0xD1, 0x26, 0x4A, 0x03, 0x30, + 0x11, 0x68, 0xC0, 0x7F, 0x81, 0x42, 0x09, 0xDA, 0x01, 0x31, 0x11, 0x60, 0x06, 0xE0, 0x01, 0x21, + 0x11, 0x70, 0x21, 0x49, 0x00, 0x22, 0x0A, 0x60, 0x20, 0x49, 0x0A, 0x60, 0x22, 0x4A, 0x01, 0x20, + 0x12, 0x78, 0x00, 0x2A, 0x26, 0xD1, 0x24, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x1E, 0xD0, 0x17, 0x4A, + 0x12, 0x78, 0x00, 0x2A, 0x1E, 0xD1, 0x1D, 0x4A, 0x11, 0x88, 0x16, 0x4A, 0x92, 0x8A, 0x91, 0x42, + 0x05, 0xD3, 0x1E, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x01, 0xD0, 0x11, 0x4A, 0x10, 0x70, 0x00, 0x2B, + 0x0F, 0xD0, 0x0F, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x0B, 0xD0, 0x18, 0x4B, 0x01, 0x20, 0x1B, 0x78, + 0x00, 0x2B, 0x07, 0xD0, 0x09, 0x4B, 0x18, 0x70, 0x00, 0x20, 0x03, 0xE0, 0x08, 0x4B, 0x1A, 0x70, + 0x00, 0xE0, 0x01, 0x20, 0x10, 0xBD, 0xC0, 0x46, 0x20, 0x0C, 0x00, 0x20, 0x88, 0x07, 0x00, 0x20, + 0xFF, 0xFF, 0xFF, 0x7F, 0x96, 0x07, 0x00, 0x20, 0x77, 0x07, 0x00, 0x20, 0x94, 0x07, 0x00, 0x20, + 0x95, 0x07, 0x00, 0x20, 0x58, 0x0A, 0x00, 0x20, 0x78, 0x07, 0x00, 0x20, 0x80, 0x07, 0x00, 0x20, + 0x7C, 0x07, 0x00, 0x20, 0x84, 0x07, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, 0x60, 0x0F, 0x00, 0x20, + 0x62, 0x0F, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0x88, 0x08, 0x00, 0x20, 0xA2, 0x07, 0x00, 0x20, + 0x38, 0xB5, 0x42, 0x1E, 0xD2, 0xB2, 0x03, 0x1C, 0x01, 0x2A, 0x27, 0xD8, 0x14, 0x48, 0x15, 0x4D, + 0x15, 0x4C, 0x02, 0x2B, 0x08, 0xD1, 0x15, 0x49, 0x50, 0x22, 0x02, 0xF0, 0xA9, 0xFC, 0x00, 0x23, + 0x2B, 0x70, 0x0E, 0x20, 0x23, 0x68, 0x07, 0xE0, 0x11, 0x49, 0x50, 0x22, 0x02, 0xF0, 0xA0, 0xFC, + 0x01, 0x23, 0x2B, 0x70, 0x23, 0x68, 0x0D, 0x20, 0x98, 0x47, 0xFF, 0xF7, 0xCB, 0xFE, 0x0D, 0x4B, + 0x05, 0x33, 0xDA, 0x7F, 0x0C, 0x4B, 0x1A, 0x70, 0x1B, 0x78, 0x0E, 0x2B, 0x04, 0xD1, 0x0B, 0x4B, + 0x9A, 0x78, 0x5A, 0x70, 0x01, 0xF0, 0xBC, 0xFA, 0x01, 0xF0, 0x2C, 0xFD, 0x38, 0xBD, 0xC0, 0x46, + 0xC8, 0x0B, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, 0x54, 0x08, 0x00, 0x20, 0x98, 0x35, 0x00, 0x00, + 0xE8, 0x35, 0x00, 0x00, 0x58, 0x0A, 0x00, 0x20, 0xBD, 0x09, 0x00, 0x20, 0x98, 0x0A, 0x00, 0x20, + 0x08, 0xB5, 0x80, 0x23, 0x01, 0x22, 0xDB, 0x05, 0x5A, 0x70, 0xFF, 0xF7, 0xBD, 0xFA, 0x01, 0xF0, + 0x79, 0xFB, 0x08, 0xBD, 0xF0, 0xB5, 0x55, 0x4B, 0x7F, 0x22, 0xD9, 0x79, 0x80, 0x23, 0xDB, 0x05, + 0x11, 0x40, 0x53, 0x4C, 0x9A, 0x6B, 0x09, 0x06, 0x22, 0x40, 0x0A, 0x43, 0x9A, 0x63, 0xC0, 0x22, + 0xFF, 0x21, 0x89, 0xB0, 0x4F, 0x48, 0xD2, 0x00, 0x02, 0xF0, 0x98, 0xFC, 0x4E, 0x4B, 0x5B, 0x68, + 0x5B, 0x00, 0x5B, 0x42, 0x19, 0x1C, 0x08, 0x31, 0x01, 0xDA, 0x08, 0x23, 0x5B, 0x42, 0xDB, 0xB2, + 0x05, 0x93, 0xFF, 0x25, 0x4D, 0xE0, 0x00, 0x24, 0x20, 0x1C, 0x31, 0x1C, 0x02, 0x22, 0x01, 0x34, + 0x01, 0xF0, 0x9B, 0xFB, 0x14, 0x2C, 0xF7, 0xD1, 0x20, 0x1C, 0x31, 0x1C, 0x02, 0x22, 0x01, 0xF0, + 0xED, 0xFB, 0xFF, 0xF7, 0x7D, 0xFE, 0x3D, 0x4B, 0x40, 0x48, 0x1B, 0x7A, 0x00, 0x21, 0x04, 0x93, + 0x0C, 0x22, 0xAC, 0x46, 0x2A, 0xE0, 0x54, 0x00, 0x14, 0x2B, 0x04, 0xD1, 0x3C, 0x4D, 0x2C, 0x5B, + 0x04, 0x9D, 0x2C, 0x41, 0x03, 0xE0, 0x01, 0x9E, 0x04, 0x9F, 0xA4, 0x5B, 0x3C, 0x41, 0x9D, 0x00, + 0x47, 0x59, 0x03, 0x95, 0xA7, 0x42, 0x0F, 0xD3, 0x3F, 0x1B, 0x5E, 0x00, 0x06, 0x96, 0x02, 0x97, + 0x08, 0x25, 0x6F, 0x46, 0xEE, 0x5B, 0x07, 0x9F, 0x06, 0x9D, 0x7E, 0x53, 0x03, 0x9F, 0x31, 0x4D, + 0xC4, 0x51, 0x66, 0x46, 0x6C, 0x18, 0xE6, 0x54, 0x01, 0x9C, 0x20, 0x3C, 0x01, 0x94, 0x01, 0x3B, + 0xD9, 0xD2, 0x01, 0x3A, 0x80, 0x38, 0x15, 0x39, 0x00, 0x2A, 0x07, 0xD0, 0x2A, 0x4D, 0x2B, 0x4E, + 0x4C, 0x00, 0x2C, 0x19, 0x14, 0x23, 0x07, 0x94, 0x01, 0x96, 0xCC, 0xE7, 0x65, 0x46, 0x01, 0x3D, + 0xED, 0xB2, 0x6F, 0x46, 0x14, 0x21, 0xCB, 0x57, 0x6E, 0xB2, 0x9E, 0x42, 0xAB, 0xDA, 0x24, 0x4B, + 0x1B, 0x78, 0x00, 0x2B, 0x06, 0xD1, 0x23, 0x4B, 0x23, 0x49, 0x1C, 0x78, 0x1D, 0x4B, 0x18, 0x1C, + 0xFC, 0x38, 0x0C, 0xE0, 0x00, 0x24, 0x0D, 0xE0, 0x15, 0x22, 0x01, 0x3A, 0x00, 0x2C, 0x03, 0xD0, + 0x9D, 0x5C, 0x8E, 0x5C, 0x75, 0x19, 0x9D, 0x54, 0x00, 0x2A, 0xF6, 0xD1, 0x15, 0x3B, 0x83, 0x42, + 0xF2, 0xD1, 0xEF, 0xE7, 0x20, 0x1C, 0x00, 0x21, 0x01, 0x22, 0x01, 0x34, 0x01, 0xF0, 0x2D, 0xFB, + 0x14, 0x2C, 0xF7, 0xD1, 0x20, 0x1C, 0x00, 0x21, 0x01, 0x22, 0x01, 0xF0, 0x7F, 0xFB, 0x07, 0x4B, + 0x7F, 0x22, 0x9C, 0x79, 0x80, 0x23, 0xDB, 0x05, 0x05, 0x4D, 0x22, 0x40, 0x9C, 0x6B, 0x12, 0x06, + 0x2C, 0x40, 0x14, 0x43, 0x09, 0xB0, 0x9C, 0x63, 0xF0, 0xBD, 0xC0, 0x46, 0xC8, 0x0B, 0x00, 0x20, + 0xFF, 0xFF, 0xFF, 0x80, 0x18, 0x00, 0x00, 0x20, 0x60, 0x08, 0x00, 0x20, 0x98, 0x05, 0x00, 0x20, + 0xC0, 0x0A, 0x00, 0x40, 0x87, 0x0B, 0x00, 0x20, 0xF6, 0x0E, 0x00, 0x20, 0xA0, 0x0A, 0x00, 0x40, + 0x70, 0x07, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, 0x69, 0x36, 0x00, 0x00, 0xF0, 0xB5, 0x85, 0xB0, + 0x04, 0x1C, 0x01, 0x25, 0x00, 0x28, 0x17, 0xD1, 0x81, 0x4B, 0x21, 0x1C, 0xFC, 0x22, 0x81, 0x48, + 0x1D, 0x78, 0x02, 0xF0, 0xDB, 0xFB, 0xC0, 0x22, 0x21, 0x1C, 0xD2, 0x00, 0x7E, 0x48, 0x02, 0xF0, + 0xD5, 0xFB, 0x21, 0x1C, 0x04, 0x22, 0x7D, 0x48, 0x02, 0xF0, 0xD0, 0xFB, 0x7C, 0x48, 0x21, 0x1C, + 0x10, 0x22, 0x6D, 0xB2, 0x02, 0xF0, 0xCA, 0xFB, 0x7A, 0x4B, 0x01, 0x3D, 0x01, 0x22, 0xED, 0xB2, + 0x1A, 0x60, 0x00, 0x95, 0xDD, 0xE0, 0xFF, 0xF7, 0xC3, 0xFD, 0x77, 0x4D, 0x0C, 0x22, 0x2D, 0x7A, + 0xA4, 0x46, 0x01, 0x95, 0x01, 0x3A, 0xD2, 0xB2, 0x51, 0x1C, 0x74, 0x4E, 0x49, 0x00, 0x8B, 0x5B, + 0x01, 0x98, 0x03, 0x91, 0x03, 0x41, 0x15, 0x20, 0x50, 0x43, 0x02, 0x93, 0x14, 0x23, 0x01, 0x3B, + 0x6F, 0x4C, 0xDB, 0xB2, 0x59, 0x01, 0x03, 0x9D, 0x09, 0x19, 0x6C, 0x5A, 0x01, 0x9E, 0x61, 0x46, + 0x34, 0x41, 0x01, 0x29, 0x12, 0xD1, 0x6B, 0x4D, 0x03, 0x9E, 0x59, 0x01, 0x49, 0x19, 0x71, 0x5A, + 0x01, 0x9D, 0x02, 0x9E, 0x29, 0x41, 0x64, 0x18, 0x64, 0x10, 0x00, 0x21, 0xA6, 0x42, 0x00, 0xDD, + 0x31, 0x1B, 0xC5, 0x18, 0x64, 0x4C, 0x6D, 0x00, 0x29, 0x53, 0x48, 0xE0, 0x61, 0x46, 0x02, 0x29, + 0x41, 0xD0, 0x57, 0x49, 0x00, 0x9D, 0x09, 0x78, 0x49, 0xB2, 0x01, 0x39, 0x8D, 0x42, 0x3A, 0xDA, + 0xC5, 0x18, 0x5D, 0x49, 0x6D, 0x00, 0x69, 0x5E, 0x53, 0x4D, 0x09, 0x1B, 0x00, 0x29, 0x11, 0xDD, + 0xFF, 0x29, 0x01, 0xDD, 0xFF, 0x21, 0x01, 0xE0, 0x05, 0x29, 0x0C, 0xDD, 0x57, 0x01, 0xFF, 0x18, + 0xBF, 0x00, 0xEE, 0x59, 0x01, 0x36, 0xEE, 0x51, 0x02, 0x2E, 0x17, 0xD9, 0x49, 0x4D, 0xC6, 0x18, + 0x71, 0x55, 0x13, 0xE0, 0x00, 0x21, 0x56, 0x01, 0xF6, 0x18, 0xB6, 0x00, 0xAD, 0x59, 0x02, 0x2D, + 0x0C, 0xD8, 0x44, 0x4D, 0xC6, 0x18, 0x77, 0x5D, 0xB9, 0x42, 0x00, 0xDA, 0x39, 0x1C, 0x71, 0x55, + 0x55, 0x01, 0xED, 0x18, 0x40, 0x49, 0xAD, 0x00, 0x00, 0x26, 0x6E, 0x50, 0x41, 0x49, 0x0D, 0x68, + 0x00, 0x2D, 0x08, 0xD0, 0x56, 0x01, 0xF6, 0x18, 0x3B, 0x4D, 0xB6, 0x00, 0x75, 0x59, 0x02, 0x2D, + 0x01, 0xD9, 0x00, 0x25, 0x0D, 0x60, 0xC1, 0x18, 0x3F, 0x4D, 0x49, 0x00, 0x4C, 0x53, 0x00, 0x2B, + 0x95, 0xD1, 0x00, 0x2A, 0x86, 0xD1, 0x38, 0x4B, 0x3C, 0x48, 0x1E, 0x7A, 0x02, 0x23, 0x01, 0x3B, + 0xDB, 0xB2, 0x36, 0x49, 0x3A, 0x4D, 0x5A, 0x1C, 0x52, 0x00, 0x8C, 0x5A, 0xE9, 0x5C, 0x35, 0x4D, + 0x49, 0x01, 0x49, 0x19, 0x51, 0x5A, 0x62, 0x46, 0x31, 0x41, 0x01, 0x2A, 0x07, 0xD1, 0x34, 0x41, + 0x00, 0x22, 0x8C, 0x42, 0x00, 0xDD, 0x62, 0x1A, 0x59, 0x00, 0x42, 0x52, 0x3A, 0xE0, 0x02, 0x2A, + 0x35, 0xD0, 0x23, 0x4D, 0x00, 0x9C, 0x2A, 0x78, 0x52, 0xB2, 0x01, 0x3A, 0x94, 0x42, 0x2E, 0xDA, + 0x5A, 0x00, 0x82, 0x5E, 0x22, 0x4D, 0x52, 0x1A, 0x00, 0x2A, 0x0E, 0xDD, 0xFF, 0x2A, 0x01, 0xDD, + 0xFF, 0x22, 0x01, 0xE0, 0x05, 0x2A, 0x09, 0xDD, 0x9C, 0x00, 0x2F, 0x59, 0x01, 0x37, 0x2F, 0x51, + 0x02, 0x2F, 0x11, 0xD9, 0x19, 0x4C, 0xE2, 0x54, 0x0E, 0xE0, 0x00, 0x22, 0x9C, 0x00, 0x2C, 0x59, + 0x02, 0x2C, 0x09, 0xD8, 0x15, 0x4C, 0xE5, 0x5C, 0xAA, 0x42, 0x00, 0xDA, 0x2A, 0x1C, 0xE2, 0x54, + 0x13, 0x4A, 0x9C, 0x00, 0x00, 0x25, 0xA5, 0x50, 0x12, 0x4A, 0x14, 0x68, 0x00, 0x2C, 0x06, 0xD0, + 0x0F, 0x4C, 0x9D, 0x00, 0x2C, 0x59, 0x02, 0x2C, 0x01, 0xD9, 0x00, 0x24, 0x14, 0x60, 0x13, 0x4C, + 0x5A, 0x00, 0x11, 0x53, 0x00, 0x2B, 0xAA, 0xD1, 0x00, 0x9B, 0x64, 0x46, 0x01, 0x3B, 0xDB, 0xB2, + 0x00, 0x93, 0x00, 0x9D, 0xFF, 0x2D, 0x00, 0xD0, 0x1D, 0xE7, 0x05, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, + 0x30, 0x06, 0x00, 0x20, 0xA0, 0x0A, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, 0x6E, 0x11, 0x00, 0x20, + 0x78, 0x08, 0x00, 0x20, 0x94, 0x09, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0x00, 0x08, 0x00, 0x40, + 0x20, 0x08, 0x00, 0x40, 0x40, 0x08, 0x00, 0x40, 0x28, 0x0D, 0x00, 0x20, 0xBE, 0x0B, 0x00, 0x20, + 0x61, 0x36, 0x00, 0x00, 0xF0, 0xB5, 0xB4, 0x4B, 0x01, 0x22, 0x1A, 0x60, 0x8D, 0xB0, 0x80, 0x23, + 0x0B, 0x90, 0xDB, 0x05, 0x9A, 0x68, 0xB1, 0x4C, 0x80, 0x21, 0x49, 0x01, 0x22, 0x40, 0x0A, 0x43, + 0x9A, 0x60, 0x99, 0x68, 0x80, 0x22, 0x12, 0x02, 0x0A, 0x43, 0x00, 0x26, 0x00, 0x27, 0x9A, 0x60, + 0xFB, 0x20, 0x01, 0xF0, 0x8E, 0xFB, 0x02, 0x96, 0x03, 0x97, 0x21, 0x27, 0x01, 0x3F, 0xFF, 0xB2, + 0x38, 0x1C, 0x00, 0xF0, 0x6B, 0xF9, 0x02, 0x9A, 0x03, 0x9E, 0x10, 0x43, 0x0E, 0x43, 0x05, 0x96, + 0x02, 0x90, 0x03, 0x96, 0x00, 0x2F, 0xF1, 0xD1, 0xC6, 0x43, 0x09, 0x96, 0x03, 0x9E, 0xA0, 0x4D, + 0xF6, 0x43, 0x0A, 0x96, 0x2B, 0x68, 0x09, 0x9E, 0x9E, 0x4C, 0x33, 0x40, 0x2B, 0x60, 0x0A, 0x9E, + 0x6B, 0x68, 0x03, 0x99, 0x33, 0x40, 0x6B, 0x60, 0x09, 0x9E, 0x23, 0x68, 0x33, 0x40, 0x23, 0x60, + 0x0A, 0x9E, 0x63, 0x68, 0x33, 0x40, 0x98, 0x4E, 0x63, 0x60, 0x33, 0x68, 0x03, 0x43, 0x33, 0x60, + 0x73, 0x68, 0x64, 0x20, 0x0B, 0x43, 0x73, 0x60, 0x01, 0xF0, 0x54, 0xF9, 0x2A, 0x68, 0x6B, 0x68, + 0x0B, 0xA9, 0x08, 0x78, 0x07, 0x92, 0x08, 0x93, 0x00, 0xF0, 0x38, 0xF9, 0x07, 0x9A, 0x03, 0x1C, + 0x04, 0x90, 0x13, 0x43, 0x08, 0x98, 0x06, 0x91, 0x2B, 0x60, 0x0B, 0x1C, 0x03, 0x43, 0x6B, 0x60, + 0x0A, 0x20, 0x01, 0xF0, 0x3F, 0xF9, 0x05, 0x9B, 0x06, 0x98, 0x04, 0x9A, 0x02, 0x99, 0x83, 0x43, + 0x05, 0x93, 0x91, 0x43, 0x85, 0x4B, 0x02, 0x91, 0x00, 0x20, 0x00, 0x21, 0x03, 0xC3, 0x84, 0x4A, + 0x84, 0x49, 0x11, 0x60, 0x84, 0x4A, 0x04, 0x21, 0x10, 0x68, 0x08, 0x43, 0x10, 0x60, 0x10, 0x68, + 0x02, 0x21, 0x88, 0x43, 0x10, 0x60, 0x20, 0x68, 0x02, 0x99, 0x08, 0x43, 0x20, 0x60, 0x05, 0x99, + 0x60, 0x68, 0x08, 0x43, 0x60, 0x60, 0x10, 0x68, 0x01, 0x21, 0x8C, 0x46, 0x08, 0x43, 0x7B, 0x49, + 0x10, 0x60, 0x0F, 0x60, 0x7A, 0x4F, 0x7B, 0x49, 0x07, 0x97, 0x67, 0x46, 0x04, 0x97, 0x2F, 0x1C, + 0x25, 0x1C, 0x34, 0x1C, 0x75, 0x48, 0x78, 0x4E, 0x00, 0x68, 0x06, 0x90, 0x30, 0x78, 0xF6, 0x78, + 0xB4, 0x46, 0x86, 0x00, 0x30, 0x18, 0x06, 0x02, 0x30, 0x1A, 0x66, 0x46, 0x01, 0x36, 0x30, 0x41, + 0x6C, 0x4E, 0x30, 0x1A, 0x06, 0x9E, 0x86, 0x42, 0x23, 0xD3, 0x48, 0x68, 0x0E, 0x68, 0x84, 0x46, + 0x02, 0x98, 0xB0, 0x43, 0x05, 0x9E, 0x08, 0x90, 0x60, 0x46, 0x86, 0x43, 0x01, 0x96, 0x1E, 0x1C, + 0x08, 0x3E, 0x70, 0x68, 0x84, 0x46, 0x01, 0x98, 0x84, 0x45, 0x04, 0xD3, 0xDA, 0xD1, 0x36, 0x68, + 0x08, 0x98, 0x86, 0x42, 0xD6, 0xD2, 0x07, 0x98, 0x06, 0x9E, 0x40, 0xC0, 0x08, 0x9E, 0x07, 0x90, + 0x1E, 0x60, 0x04, 0x9E, 0x01, 0x98, 0x01, 0x36, 0x58, 0x60, 0x04, 0x96, 0x08, 0x33, 0x21, 0x2E, + 0xC8, 0xD1, 0x13, 0x68, 0x01, 0x21, 0x8B, 0x43, 0x13, 0x60, 0x5C, 0x48, 0xFF, 0x21, 0x21, 0x22, + 0x02, 0xF0, 0xF4, 0xF9, 0x04, 0x9E, 0x01, 0x2E, 0x67, 0xD0, 0x33, 0x1C, 0x01, 0x3B, 0x4F, 0x4A, + 0xDE, 0x00, 0xB6, 0x18, 0x56, 0x4A, 0x9B, 0x00, 0x9A, 0x18, 0x58, 0xE0, 0x33, 0x1C, 0x08, 0x3B, + 0x06, 0xCB, 0x33, 0x68, 0x21, 0x20, 0x8B, 0x43, 0x07, 0x93, 0x73, 0x68, 0x02, 0x90, 0x93, 0x43, + 0x08, 0x93, 0x02, 0x99, 0x6A, 0x46, 0x01, 0x39, 0x08, 0x23, 0x02, 0x91, 0x98, 0x5C, 0x00, 0xF0, + 0x9D, 0xF8, 0x07, 0x9A, 0x08, 0x9B, 0x10, 0x40, 0x19, 0x40, 0x08, 0x43, 0x39, 0xD0, 0x46, 0x48, + 0x05, 0x99, 0xC3, 0x78, 0x0A, 0x68, 0x3F, 0x48, 0x01, 0x33, 0x82, 0x1A, 0x9A, 0x40, 0x42, 0x49, + 0x06, 0x92, 0x48, 0x78, 0x02, 0xF0, 0x34, 0xF8, 0x01, 0x1C, 0x06, 0x98, 0x02, 0xF0, 0xD0, 0xF8, + 0x0B, 0x9A, 0x07, 0x23, 0x14, 0x2A, 0x00, 0xDC, 0x0A, 0x23, 0x58, 0x43, 0xFF, 0x23, 0xC0, 0x08, + 0x98, 0x42, 0x18, 0xD8, 0x38, 0x48, 0x05, 0x99, 0xC3, 0x78, 0x0A, 0x68, 0x31, 0x48, 0x01, 0x33, + 0x82, 0x1A, 0x9A, 0x40, 0x34, 0x49, 0x06, 0x92, 0x48, 0x78, 0x02, 0xF0, 0x19, 0xF8, 0x01, 0x1C, + 0x06, 0x98, 0x02, 0xF0, 0xB5, 0xF8, 0x0B, 0x9A, 0x07, 0x23, 0x14, 0x2A, 0x00, 0xDC, 0x0A, 0x23, + 0x43, 0x43, 0xDB, 0x08, 0xDB, 0xB2, 0x2D, 0x4A, 0x02, 0x98, 0x13, 0x54, 0x1E, 0x4B, 0x01, 0x22, + 0x1A, 0x60, 0x02, 0x99, 0x00, 0x29, 0xB4, 0xD1, 0x05, 0x9A, 0x08, 0x3E, 0x04, 0x3A, 0x04, 0x9B, + 0x05, 0x92, 0x01, 0x3B, 0x04, 0x93, 0x00, 0x2B, 0xA0, 0xD1, 0x09, 0x9E, 0x23, 0x68, 0x25, 0x4A, + 0x33, 0x40, 0x23, 0x60, 0x0A, 0x9E, 0x63, 0x68, 0x07, 0x21, 0x33, 0x40, 0x63, 0x60, 0x09, 0x9E, + 0x3B, 0x68, 0x12, 0x48, 0x33, 0x40, 0x3B, 0x60, 0x0A, 0x9E, 0x7B, 0x68, 0x33, 0x40, 0x7B, 0x60, + 0x2B, 0x68, 0x09, 0x9F, 0x0D, 0xB0, 0x3B, 0x40, 0x2B, 0x60, 0x6B, 0x68, 0x33, 0x40, 0x6B, 0x60, + 0x54, 0x7C, 0x80, 0x23, 0xDB, 0x05, 0x21, 0x40, 0x9C, 0x68, 0x09, 0x03, 0x04, 0x40, 0x0C, 0x43, + 0x9C, 0x60, 0x91, 0x7C, 0x01, 0x22, 0x98, 0x68, 0x11, 0x40, 0x13, 0x4A, 0xC9, 0x03, 0x02, 0x40, + 0x0A, 0x43, 0x9A, 0x60, 0xF0, 0xBD, 0xC0, 0x46, 0x94, 0x09, 0x00, 0x20, 0xFF, 0x8F, 0xFF, 0xFF, + 0x0C, 0x00, 0x00, 0x40, 0x14, 0x00, 0x00, 0x40, 0x24, 0x00, 0x00, 0x40, 0x28, 0x0D, 0x00, 0x20, + 0x14, 0xE0, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x00, 0x10, 0xE0, 0x00, 0xE0, 0x18, 0xE0, 0x00, 0xE0, + 0x1C, 0x00, 0x00, 0x20, 0x1C, 0x00, 0x00, 0x40, 0x98, 0x0A, 0x00, 0x20, 0xA0, 0x0A, 0x00, 0x20, + 0x18, 0x00, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0xFF, 0x7F, 0xFF, 0xFF, 0x10, 0xB5, 0x14, 0x28, + 0x06, 0xD9, 0x0D, 0x4B, 0x18, 0x18, 0x15, 0x23, 0x5B, 0x42, 0xC3, 0x56, 0x06, 0x33, 0x02, 0xE0, + 0x0A, 0x4B, 0x1B, 0x56, 0x12, 0x33, 0x01, 0x24, 0x1F, 0x2B, 0x04, 0xDD, 0x21, 0x1C, 0x20, 0x3B, + 0x99, 0x40, 0x00, 0x24, 0x01, 0xE0, 0x9C, 0x40, 0x00, 0x21, 0x00, 0x22, 0x0B, 0x1C, 0x20, 0x1C, + 0x11, 0x1C, 0x80, 0x18, 0x59, 0x41, 0x10, 0xBD, 0x51, 0x36, 0x00, 0x00, 0x38, 0x36, 0x00, 0x00, + 0x00, 0xB5, 0x43, 0x78, 0x5A, 0xB2, 0x0A, 0x2A, 0x01, 0xDC, 0x01, 0x33, 0x43, 0x70, 0x03, 0x78, + 0x5A, 0xB2, 0x00, 0x2A, 0x01, 0xDD, 0x01, 0x3B, 0x03, 0x70, 0xC3, 0x78, 0x5A, 0xB2, 0x11, 0x2A, + 0x01, 0xDC, 0x01, 0x33, 0xC3, 0x70, 0x83, 0x78, 0x5A, 0xB2, 0x00, 0x2A, 0x01, 0xDD, 0x01, 0x3B, + 0x83, 0x70, 0x00, 0xBD, 0x03, 0x4B, 0x00, 0x22, 0x1A, 0x60, 0x03, 0x4B, 0x01, 0x22, 0x52, 0x42, + 0x5A, 0x60, 0x70, 0x47, 0x20, 0x0C, 0x00, 0x20, 0x2C, 0x08, 0x00, 0x20, 0x10, 0xB5, 0x18, 0x23, + 0x00, 0x21, 0x05, 0xE0, 0x01, 0x3A, 0xD2, 0xB2, 0x54, 0x00, 0x21, 0x52, 0x00, 0x2A, 0xF9, 0xD1, + 0x01, 0x3B, 0xDB, 0xB2, 0xFF, 0x2B, 0x04, 0xD0, 0x02, 0x4A, 0x58, 0x01, 0x80, 0x18, 0x10, 0x22, + 0xF0, 0xE7, 0x10, 0xBD, 0x00, 0x08, 0x00, 0x40, 0x00, 0xB5, 0x16, 0x49, 0x16, 0x4B, 0x0A, 0x1C, + 0x44, 0x32, 0x1B, 0x78, 0x12, 0x78, 0x5A, 0x43, 0x14, 0x4B, 0x92, 0x09, 0x9B, 0x68, 0x9A, 0x42, + 0x00, 0xDA, 0x1A, 0x1C, 0x12, 0x4B, 0x18, 0x68, 0x23, 0x23, 0x01, 0x28, 0x00, 0xDD, 0x19, 0x23, + 0x08, 0x1C, 0x38, 0x30, 0x5A, 0x43, 0x03, 0x70, 0x09, 0x7E, 0x92, 0x11, 0x8A, 0x42, 0x00, 0xDA, + 0x0A, 0x1C, 0x0C, 0x4B, 0x1A, 0x60, 0x80, 0x23, 0xDB, 0x05, 0x19, 0x6B, 0x12, 0x05, 0x09, 0x03, + 0x09, 0x0B, 0x11, 0x43, 0x19, 0x63, 0x18, 0x6B, 0x11, 0x0B, 0x07, 0x4A, 0x02, 0x40, 0x0A, 0x43, + 0x1A, 0x63, 0x00, 0xBD, 0xC8, 0x0B, 0x00, 0x20, 0xAC, 0x09, 0x00, 0x20, 0xAC, 0x07, 0x00, 0x20, + 0xE0, 0x07, 0x00, 0x20, 0xB4, 0x0B, 0x00, 0x20, 0xFF, 0x00, 0xF0, 0xFF, 0x08, 0xB5, 0x84, 0x22, + 0x52, 0x00, 0x05, 0x48, 0x00, 0x21, 0x02, 0xF0, 0x99, 0xF8, 0x04, 0x4B, 0x00, 0x22, 0x1A, 0x60, + 0x01, 0x22, 0x52, 0x42, 0x5A, 0x60, 0x08, 0xBD, 0x20, 0x0C, 0x00, 0x20, 0x0C, 0x08, 0x00, 0x20, + 0xF0, 0xB5, 0xA1, 0x22, 0x93, 0xB0, 0x00, 0x21, 0x52, 0x00, 0xB8, 0x48, 0x02, 0xF0, 0x86, 0xF8, + 0x00, 0x21, 0xFC, 0x22, 0xB6, 0x48, 0x02, 0xF0, 0x81, 0xF8, 0xB6, 0x4C, 0x84, 0x22, 0x00, 0x21, + 0x52, 0x00, 0x20, 0x1C, 0x02, 0xF0, 0x7A, 0xF8, 0x0D, 0x25, 0x7F, 0x21, 0xFF, 0x22, 0x01, 0x3D, + 0xED, 0xB2, 0x2B, 0x1C, 0x34, 0x33, 0x9B, 0x00, 0xE3, 0x18, 0x99, 0x71, 0x19, 0x71, 0xDA, 0x71, + 0x5A, 0x71, 0x00, 0x2D, 0xF3, 0xD1, 0xAC, 0x4C, 0x20, 0x1C, 0xFF, 0xF7, 0x51, 0xFF, 0x64, 0x78, + 0x68, 0x46, 0x07, 0x94, 0x1C, 0x21, 0x08, 0x56, 0x17, 0x22, 0x42, 0x43, 0xA3, 0x4B, 0x01, 0x95, + 0xA4, 0x4D, 0xD3, 0x18, 0x0A, 0x90, 0x08, 0x93, 0x2F, 0x1C, 0x79, 0xE1, 0xDB, 0x78, 0x01, 0x9C, + 0x5A, 0xB2, 0xDB, 0xB2, 0x05, 0x93, 0x0A, 0x9B, 0x01, 0x32, 0x01, 0x33, 0x1B, 0x1B, 0x03, 0x92, + 0x0F, 0x93, 0x5E, 0xE1, 0x03, 0x9E, 0x0F, 0x9C, 0x9C, 0x49, 0x32, 0x01, 0x12, 0x19, 0x50, 0x5C, + 0x8C, 0x46, 0x43, 0x1E, 0xDB, 0xB2, 0x9A, 0x49, 0x52, 0x00, 0x0C, 0x2B, 0x62, 0xD8, 0x08, 0x9E, + 0xB4, 0x46, 0x03, 0x9E, 0xB4, 0x44, 0x66, 0x46, 0xF0, 0x75, 0x96, 0x48, 0x89, 0x5A, 0x44, 0x69, + 0x8A, 0xB2, 0x01, 0x34, 0x44, 0x61, 0x04, 0x9C, 0x98, 0x00, 0x54, 0x43, 0x38, 0x18, 0x46, 0x68, + 0x8C, 0x46, 0x34, 0x19, 0x44, 0x60, 0x02, 0x9C, 0x18, 0x1C, 0x0E, 0x30, 0x54, 0x43, 0x80, 0x00, + 0xC6, 0x59, 0x04, 0x21, 0x34, 0x19, 0xC4, 0x51, 0x18, 0x1C, 0x0D, 0x30, 0xC0, 0x00, 0x38, 0x18, + 0x84, 0x88, 0x04, 0x9E, 0x14, 0x19, 0x84, 0x80, 0x44, 0x89, 0x0C, 0x34, 0x44, 0x81, 0x18, 0x1C, + 0x34, 0x30, 0x84, 0x00, 0x3C, 0x19, 0x61, 0x56, 0x8E, 0x42, 0x04, 0xDA, 0x07, 0x99, 0x01, 0x9E, + 0x89, 0x1B, 0x06, 0x91, 0x21, 0x71, 0x80, 0x00, 0x38, 0x18, 0x05, 0x24, 0x04, 0x57, 0x04, 0x9E, + 0xA6, 0x42, 0x03, 0xDD, 0x07, 0x9E, 0x01, 0x99, 0x74, 0x1A, 0x44, 0x71, 0x18, 0x1C, 0x34, 0x30, + 0x84, 0x00, 0x3C, 0x19, 0x06, 0x26, 0xA6, 0x57, 0x02, 0x99, 0xB1, 0x42, 0x03, 0xDA, 0x6E, 0x46, + 0x14, 0x21, 0x8E, 0x5D, 0xA6, 0x71, 0x6F, 0x4C, 0x80, 0x00, 0x20, 0x18, 0x07, 0x26, 0x86, 0x57, + 0x02, 0x99, 0xB1, 0x42, 0x03, 0xDD, 0x6E, 0x46, 0x14, 0x21, 0x8E, 0x5D, 0xC6, 0x71, 0x0D, 0x33, + 0xDB, 0x00, 0xE4, 0x18, 0x06, 0x20, 0x23, 0x5E, 0x93, 0x42, 0x00, 0xDB, 0xEA, 0xE0, 0x61, 0x46, + 0xE1, 0x80, 0xE7, 0xE0, 0x8B, 0x5A, 0x09, 0x93, 0x00, 0x2B, 0x00, 0xD1, 0xE2, 0xE0, 0x07, 0x9A, + 0x01, 0x9E, 0x00, 0x23, 0x92, 0x1B, 0x11, 0x93, 0x04, 0x24, 0x06, 0x92, 0x62, 0x48, 0x01, 0x3C, + 0xE4, 0xB2, 0x02, 0x5D, 0x61, 0x48, 0x05, 0x9E, 0x06, 0x99, 0x03, 0x5D, 0xB2, 0x18, 0x5B, 0x18, + 0x52, 0xB2, 0x01, 0x32, 0x5B, 0xB2, 0x12, 0x01, 0x01, 0x33, 0xD3, 0x18, 0x62, 0x46, 0xD1, 0x5C, + 0x00, 0x23, 0xCE, 0xB2, 0x72, 0x1E, 0x0C, 0x2A, 0x03, 0xD9, 0x0A, 0xE0, 0x01, 0x33, 0xDB, 0xB2, + 0x01, 0xE0, 0x11, 0xAA, 0x76, 0xB2, 0xD0, 0x5C, 0x00, 0x28, 0x01, 0xD0, 0xB0, 0x42, 0xF5, 0xD1, + 0xD1, 0x54, 0x00, 0x2C, 0xDA, 0xD1, 0x23, 0x1C, 0x11, 0xAA, 0x9A, 0x5C, 0xDE, 0xB2, 0x00, 0x2A, + 0x04, 0xD0, 0x01, 0x33, 0x04, 0x2B, 0xF7, 0xD1, 0x1E, 0x1C, 0x02, 0xE0, 0x00, 0x2E, 0x00, 0xD1, + 0xA8, 0xE0, 0x08, 0x98, 0x03, 0x99, 0x32, 0x1C, 0x43, 0x18, 0x0E, 0x32, 0xDA, 0x75, 0x31, 0x1C, + 0x09, 0x98, 0x01, 0xF0, 0xF3, 0xFE, 0x04, 0x9A, 0x02, 0x9B, 0x42, 0x43, 0x43, 0x43, 0x0C, 0x92, + 0x0D, 0x93, 0x41, 0x42, 0x00, 0x22, 0x73, 0x1E, 0x0E, 0x91, 0x06, 0x92, 0x0B, 0x93, 0x21, 0xE0, + 0x61, 0x46, 0x0B, 0x5D, 0x01, 0x34, 0x01, 0x3B, 0x5B, 0xB2, 0x9A, 0x00, 0xAA, 0x18, 0x51, 0x68, + 0xE4, 0xB2, 0x8C, 0x46, 0x0C, 0x99, 0x8C, 0x44, 0x61, 0x46, 0x51, 0x60, 0x1A, 0x1C, 0x0E, 0x32, + 0x92, 0x00, 0xA9, 0x58, 0x0D, 0x33, 0x8C, 0x46, 0x0D, 0x99, 0xDB, 0x00, 0x8C, 0x44, 0x61, 0x46, + 0xA9, 0x50, 0xEB, 0x18, 0x9A, 0x88, 0x82, 0x18, 0x9A, 0x80, 0x31, 0x4A, 0x91, 0x5D, 0x5A, 0x89, + 0x8A, 0x18, 0x5A, 0x81, 0x06, 0x99, 0x09, 0x9A, 0x8B, 0x18, 0x0E, 0x9A, 0x89, 0x18, 0x0B, 0x9A, + 0x06, 0x91, 0x11, 0xA9, 0x8C, 0x46, 0x94, 0x42, 0xD2, 0xDB, 0x0A, 0x5D, 0x04, 0x98, 0x01, 0x3A, + 0x52, 0xB2, 0x91, 0x00, 0x58, 0x43, 0x69, 0x18, 0x4C, 0x68, 0xB4, 0x46, 0x20, 0x18, 0x48, 0x60, + 0x02, 0x98, 0x11, 0x1C, 0x58, 0x43, 0x0E, 0x31, 0x89, 0x00, 0x6C, 0x58, 0x0D, 0x32, 0x20, 0x18, + 0xD2, 0x00, 0x68, 0x50, 0xAA, 0x18, 0x91, 0x88, 0x5B, 0x18, 0x93, 0x80, 0x1C, 0x4B, 0x99, 0x5D, + 0x53, 0x89, 0xCB, 0x18, 0x53, 0x81, 0x01, 0x21, 0x00, 0x23, 0x40, 0xE0, 0x44, 0x24, 0xE4, 0x18, + 0x68, 0x46, 0x26, 0x5C, 0x02, 0x9C, 0x70, 0x1E, 0xC0, 0xB2, 0x06, 0x90, 0xA0, 0x5C, 0x06, 0x9E, + 0x44, 0x1E, 0xE4, 0xB2, 0x15, 0x20, 0xA6, 0x42, 0x05, 0xD2, 0x70, 0x43, 0x08, 0x4E, 0x04, 0x19, + 0x01, 0x20, 0x30, 0x55, 0x07, 0xE0, 0x44, 0x43, 0x06, 0x9E, 0x05, 0x48, 0xA4, 0x19, 0x06, 0x94, + 0x06, 0x9E, 0x01, 0x24, 0x84, 0x55, 0x01, 0x32, 0x1A, 0xE0, 0xC0, 0x46, 0xAA, 0x0F, 0x00, 0x20, + 0xA0, 0x0A, 0x00, 0x20, 0x8C, 0x08, 0x00, 0x20, 0x22, 0x0F, 0x00, 0x20, 0x00, 0x02, 0x00, 0x40, + 0x00, 0x04, 0x00, 0x40, 0xAC, 0x07, 0x00, 0x20, 0x67, 0x35, 0x00, 0x00, 0x63, 0x35, 0x00, 0x00, + 0x5E, 0x35, 0x00, 0x00, 0x4E, 0xB2, 0x11, 0xA8, 0x80, 0x19, 0x00, 0x22, 0x02, 0x90, 0x09, 0x96, + 0x09, 0x9C, 0x10, 0x19, 0x60, 0x45, 0xC1, 0xDB, 0x01, 0x31, 0x01, 0x33, 0xC9, 0xB2, 0x0B, 0x9E, + 0xB3, 0x42, 0xEF, 0xDB, 0x05, 0x9B, 0x03, 0x9C, 0x01, 0x3B, 0x01, 0x3C, 0xDB, 0xB2, 0x03, 0x94, + 0x05, 0x93, 0x03, 0x9E, 0x3A, 0x4B, 0x01, 0x3E, 0x02, 0x96, 0x9B, 0x78, 0x5B, 0xB2, 0x9E, 0x42, + 0x00, 0xDB, 0x97, 0xE6, 0x01, 0x9C, 0x08, 0x9E, 0x01, 0x34, 0x17, 0x3E, 0x01, 0x94, 0x08, 0x96, + 0x0A, 0x9C, 0x01, 0x9E, 0x32, 0x4B, 0xA4, 0x1B, 0x04, 0x94, 0x00, 0x22, 0x9A, 0x56, 0x94, 0x42, + 0x00, 0xDB, 0x7B, 0xE6, 0x2F, 0x4E, 0x00, 0x27, 0x34, 0x1C, 0x35, 0x1C, 0x68, 0x3C, 0x34, 0x3D, + 0x00, 0x21, 0x70, 0x5E, 0xFB, 0xB2, 0x01, 0x90, 0x00, 0x28, 0x1D, 0xD0, 0xF0, 0x88, 0x0C, 0x21, + 0x01, 0xF0, 0xD6, 0xFD, 0xF0, 0x80, 0x20, 0x68, 0x01, 0x99, 0xC0, 0x01, 0x01, 0xF0, 0x1E, 0xFE, + 0x01, 0xC4, 0x28, 0x68, 0x01, 0x99, 0xC0, 0x01, 0x01, 0xF0, 0x18, 0xFE, 0x01, 0xC5, 0x38, 0x1C, + 0x21, 0x4A, 0x34, 0x30, 0x80, 0x00, 0x80, 0x18, 0x04, 0x30, 0x01, 0x37, 0xFF, 0xF7, 0x98, 0xFD, + 0x08, 0x36, 0x0D, 0x2F, 0xDC, 0xD1, 0x3B, 0x1C, 0x1B, 0x4A, 0x1C, 0x49, 0x13, 0x60, 0x1C, 0x4B, + 0x1A, 0x1C, 0x31, 0x33, 0x30, 0x32, 0x1B, 0x78, 0x17, 0x78, 0x01, 0x93, 0x0B, 0x68, 0x02, 0x22, + 0xBC, 0x46, 0x01, 0x3A, 0xD2, 0xB2, 0x17, 0x4C, 0x50, 0x00, 0x20, 0x5A, 0x06, 0xB2, 0xF6, 0x43, + 0xF6, 0x17, 0x06, 0x40, 0x10, 0x1D, 0xB5, 0xB2, 0x40, 0x00, 0x46, 0x52, 0x0E, 0x1C, 0x00, 0x2D, + 0x10, 0xD0, 0x11, 0x4F, 0x2D, 0xB2, 0xC7, 0x5F, 0x00, 0x2F, 0x04, 0xDC, 0x65, 0x45, 0x08, 0xDA, + 0x00, 0x25, 0x45, 0x52, 0x06, 0xE0, 0x01, 0x9F, 0xBD, 0x42, 0x02, 0xDA, 0x00, 0x24, 0x44, 0x52, + 0x00, 0xE0, 0x01, 0x33, 0x00, 0x2A, 0xDC, 0xD1, 0x13, 0xB0, 0x33, 0x60, 0xF0, 0xBD, 0xC0, 0x46, + 0x22, 0x0F, 0x00, 0x20, 0xF8, 0x08, 0x00, 0x20, 0x8C, 0x08, 0x00, 0x20, 0x0C, 0x08, 0x00, 0x20, + 0xC8, 0x0B, 0x00, 0x20, 0xBE, 0x0B, 0x00, 0x20, 0x1C, 0x08, 0x00, 0x20, 0xF0, 0xB5, 0x43, 0x1C, + 0x07, 0x1C, 0x8F, 0xB0, 0x9D, 0x4E, 0x0D, 0x37, 0xDB, 0xB2, 0x09, 0x93, 0xFB, 0x00, 0xF3, 0x18, + 0x02, 0x92, 0x05, 0x93, 0x07, 0x97, 0x04, 0x1C, 0x04, 0x20, 0x1F, 0x5E, 0x0B, 0x1C, 0x0D, 0x33, + 0xDB, 0x00, 0xF3, 0x18, 0x03, 0x97, 0x08, 0x93, 0x04, 0x20, 0x1F, 0x5E, 0x03, 0x98, 0x04, 0x97, + 0xC7, 0x19, 0x06, 0x97, 0x8B, 0x00, 0xA7, 0x00, 0xF7, 0x19, 0xF3, 0x18, 0x03, 0x9A, 0x78, 0x68, + 0x5B, 0x68, 0x0D, 0x1C, 0x04, 0x99, 0x50, 0x43, 0x4B, 0x43, 0x06, 0x99, 0x18, 0x18, 0x01, 0xF0, + 0x9D, 0xFD, 0x2B, 0x1C, 0x00, 0xB2, 0x0E, 0x33, 0x78, 0x60, 0x9B, 0x00, 0x27, 0x1C, 0x9B, 0x59, + 0x04, 0x98, 0x0E, 0x37, 0xBF, 0x00, 0x43, 0x43, 0x03, 0x99, 0xB8, 0x59, 0x48, 0x43, 0x06, 0x99, + 0x18, 0x18, 0x01, 0xF0, 0x8B, 0xFD, 0x00, 0xB2, 0xB8, 0x51, 0x20, 0x1C, 0x34, 0x30, 0x80, 0x00, + 0x30, 0x18, 0x02, 0x99, 0x04, 0x22, 0x04, 0x30, 0x01, 0xF0, 0xE2, 0xFD, 0x08, 0x9F, 0xFB, 0x88, + 0x05, 0x9F, 0x1A, 0xB2, 0x06, 0x21, 0x79, 0x5E, 0x91, 0x42, 0x01, 0xDA, 0x05, 0x9F, 0xFB, 0x80, + 0x07, 0x9F, 0x2B, 0x1C, 0x0D, 0x33, 0xFA, 0x00, 0xDB, 0x00, 0xF3, 0x18, 0xB6, 0x18, 0x99, 0x88, + 0xB2, 0x88, 0x8A, 0x18, 0xB2, 0x80, 0x59, 0x89, 0x72, 0x89, 0x8A, 0x18, 0xE9, 0xB2, 0x48, 0x1C, + 0x40, 0xB2, 0x03, 0x90, 0x15, 0x20, 0x60, 0x43, 0x72, 0x81, 0x03, 0x9E, 0x00, 0x22, 0x30, 0x18, + 0x9A, 0x80, 0x04, 0x90, 0x13, 0x1C, 0x06, 0x91, 0x0E, 0xE0, 0x15, 0x26, 0x6E, 0x43, 0x04, 0x99, + 0xB4, 0x46, 0x78, 0x18, 0x03, 0x99, 0x8C, 0x44, 0x67, 0x44, 0xC1, 0x5C, 0xFE, 0x5C, 0x31, 0x43, + 0xC1, 0x54, 0x00, 0x20, 0xF8, 0x54, 0x01, 0x33, 0x01, 0x32, 0x06, 0x9E, 0xD2, 0xB2, 0x90, 0x19, + 0x40, 0xB2, 0x5F, 0x4F, 0x0C, 0x28, 0xE8, 0xDD, 0x15, 0x20, 0x60, 0x43, 0x7A, 0x19, 0x00, 0x23, + 0xC7, 0x19, 0x11, 0xE0, 0xA3, 0x42, 0x05, 0xDA, 0x51, 0x1B, 0x0E, 0x5D, 0x10, 0x78, 0x30, 0x43, + 0x08, 0x55, 0x05, 0xE0, 0xA3, 0x42, 0x03, 0xDD, 0x10, 0x78, 0xF9, 0x5C, 0x01, 0x43, 0xF9, 0x54, + 0x00, 0x21, 0x11, 0x70, 0x01, 0x33, 0x15, 0x32, 0xAB, 0x42, 0xEB, 0xDB, 0x02, 0x9F, 0x68, 0x46, + 0x3F, 0x78, 0x10, 0x21, 0x04, 0x97, 0x08, 0x56, 0x17, 0x27, 0x07, 0x90, 0x47, 0x43, 0x00, 0x22, + 0xA4, 0x46, 0x5E, 0xE0, 0x02, 0x9C, 0x00, 0x20, 0xA1, 0x78, 0x4A, 0x4C, 0x4E, 0xB2, 0xBB, 0x19, + 0x1B, 0x19, 0x08, 0x96, 0x0D, 0x93, 0x4C, 0xE0, 0x08, 0x9B, 0x0D, 0x9C, 0xC3, 0x18, 0x24, 0x18, + 0x0A, 0x93, 0x23, 0x7E, 0x07, 0x9E, 0x01, 0x3B, 0x96, 0x19, 0xDB, 0xB2, 0x0B, 0x96, 0x03, 0x94, + 0x05, 0x93, 0x6E, 0x46, 0x14, 0x24, 0xA3, 0x57, 0x0E, 0x2B, 0x37, 0xDD, 0x00, 0x23, 0x01, 0x26, + 0x06, 0x93, 0x76, 0x42, 0x04, 0x23, 0x00, 0x92, 0x01, 0x3B, 0x3B, 0x4C, 0xDB, 0xB2, 0xE4, 0x56, + 0x3A, 0x4A, 0x0C, 0x94, 0xD2, 0x56, 0x0B, 0x9C, 0xA4, 0x18, 0x01, 0x34, 0x17, 0x22, 0x62, 0x43, + 0x34, 0x4C, 0xA4, 0x18, 0x0A, 0x9A, 0xA2, 0x18, 0x0C, 0x9C, 0x01, 0x92, 0x14, 0x19, 0x0C, 0x94, + 0x64, 0x78, 0x01, 0x3C, 0xE4, 0xB2, 0x0C, 0x2C, 0x0D, 0xD8, 0x64, 0xB2, 0x64, 0x45, 0x01, 0xD0, + 0xAC, 0x42, 0x08, 0xD1, 0x72, 0x1C, 0x02, 0xD0, 0xA6, 0x42, 0x02, 0xD1, 0x03, 0xE0, 0x26, 0x1C, + 0x01, 0xE0, 0x01, 0x24, 0x06, 0x94, 0x00, 0x2B, 0xD6, 0xD1, 0x06, 0x9E, 0x00, 0x9A, 0x00, 0x2E, + 0x04, 0xD0, 0x6B, 0x46, 0x14, 0x24, 0xE4, 0x5C, 0x03, 0x9B, 0x1C, 0x76, 0x01, 0x31, 0xC9, 0xB2, + 0x01, 0x30, 0x02, 0x9E, 0x03, 0x24, 0x34, 0x57, 0x4B, 0xB2, 0x9C, 0x42, 0xAC, 0xDA, 0x01, 0x32, + 0x17, 0x37, 0x04, 0x98, 0x02, 0x9C, 0x01, 0x21, 0x13, 0x18, 0x61, 0x56, 0x5B, 0xB2, 0x99, 0x42, + 0x98, 0xDA, 0x23, 0x78, 0x00, 0x20, 0x5E, 0xB2, 0x01, 0x36, 0x17, 0x24, 0xAC, 0x46, 0x1D, 0xE0, + 0x02, 0x9D, 0x32, 0x18, 0xA9, 0x78, 0x62, 0x43, 0x4D, 0xB2, 0x01, 0x35, 0x11, 0x4F, 0xAA, 0x18, + 0xD2, 0x19, 0x0A, 0xE0, 0x15, 0x78, 0x01, 0x3D, 0x6D, 0xB2, 0x65, 0x45, 0x02, 0xD1, 0x09, 0xAD, + 0x2D, 0x78, 0x15, 0x70, 0x01, 0x31, 0xC9, 0xB2, 0x01, 0x32, 0x02, 0x9D, 0x03, 0x27, 0xEF, 0x57, + 0x4D, 0xB2, 0xAF, 0x42, 0xEE, 0xDA, 0x01, 0x33, 0xDB, 0xB2, 0x01, 0x30, 0x02, 0x9F, 0x01, 0x21, + 0x79, 0x56, 0x5A, 0xB2, 0x91, 0x42, 0xDB, 0xDA, 0x0F, 0xB0, 0xF0, 0xBD, 0x8C, 0x08, 0x00, 0x20, + 0xA0, 0x0A, 0x00, 0x20, 0xAA, 0x0F, 0x00, 0x20, 0x67, 0x35, 0x00, 0x00, 0x63, 0x35, 0x00, 0x00, + 0x10, 0xB5, 0x0B, 0x78, 0x00, 0x24, 0x04, 0x57, 0x5A, 0xB2, 0x94, 0x42, 0x00, 0xDD, 0x03, 0x70, + 0x4B, 0x78, 0x01, 0x24, 0x04, 0x57, 0x5A, 0xB2, 0x94, 0x42, 0x00, 0xDA, 0x43, 0x70, 0x8B, 0x78, + 0x02, 0x24, 0x04, 0x57, 0x5A, 0xB2, 0x94, 0x42, 0x00, 0xDD, 0x83, 0x70, 0xCB, 0x78, 0x03, 0x21, + 0x41, 0x56, 0x5A, 0xB2, 0x91, 0x42, 0x00, 0xDA, 0xC3, 0x70, 0x10, 0xBD, 0x08, 0xB5, 0x00, 0xF0, + 0x03, 0xF8, 0x00, 0xF0, 0x2D, 0xF8, 0x08, 0xBD, 0x38, 0xB5, 0x00, 0x21, 0x05, 0x22, 0x0E, 0x48, + 0x01, 0xF0, 0xF4, 0xFC, 0x00, 0x22, 0x0D, 0x49, 0x0D, 0x4C, 0x05, 0x23, 0x10, 0x1C, 0x01, 0x3B, + 0xDB, 0xB2, 0x1D, 0x1C, 0x0D, 0x35, 0xED, 0x00, 0x4D, 0x19, 0xAA, 0x80, 0xDD, 0x1C, 0xED, 0x00, + 0x2A, 0x53, 0x08, 0x4D, 0xE8, 0x54, 0x08, 0x4D, 0xE8, 0x54, 0x00, 0x2B, 0xEF, 0xD1, 0x07, 0x4A, + 0x0B, 0x60, 0x13, 0x60, 0x38, 0xBD, 0xC0, 0x46, 0x04, 0x08, 0x00, 0x20, 0x20, 0x0C, 0x00, 0x20, + 0xC0, 0x09, 0x00, 0x20, 0xB8, 0x0B, 0x00, 0x20, 0x38, 0x0A, 0x00, 0x20, 0x5C, 0x0F, 0x00, 0x20, + 0x38, 0xB5, 0x09, 0x4C, 0x01, 0x23, 0x00, 0x25, 0x5B, 0x42, 0x29, 0x1C, 0x63, 0x60, 0x25, 0x60, + 0x04, 0x22, 0x06, 0x48, 0x01, 0xF0, 0xC2, 0xFC, 0x29, 0x1C, 0x05, 0x22, 0x04, 0x48, 0x01, 0xF0, + 0xBD, 0xFC, 0xA5, 0x60, 0xE5, 0x60, 0x38, 0xBD, 0x0C, 0x08, 0x00, 0x20, 0x6E, 0x11, 0x00, 0x20, + 0x28, 0x0A, 0x00, 0x20, 0x49, 0x43, 0x40, 0x43, 0x40, 0x18, 0x70, 0x47, 0xF0, 0xB5, 0x92, 0x4B, + 0x85, 0xB0, 0x1B, 0x68, 0x05, 0x2B, 0x00, 0xDD, 0x05, 0x23, 0x90, 0x4A, 0x01, 0x21, 0x13, 0x60, + 0x49, 0x42, 0x0D, 0x22, 0x8E, 0x48, 0x01, 0xF0, 0xA1, 0xFC, 0x8E, 0x48, 0xFF, 0x21, 0x34, 0x22, + 0x01, 0xF0, 0x9C, 0xFC, 0x8C, 0x4B, 0x00, 0x24, 0x1B, 0x68, 0x01, 0x93, 0x8B, 0x4B, 0x5B, 0x6A, + 0x02, 0x93, 0x85, 0x4B, 0x1B, 0x68, 0x03, 0x93, 0x89, 0x4D, 0xE3, 0x00, 0x5B, 0x19, 0x18, 0x26, + 0x9B, 0x5F, 0x00, 0x2B, 0x3F, 0xD0, 0x87, 0x4D, 0xA3, 0x00, 0xEF, 0x58, 0x01, 0x9E, 0x86, 0x4B, + 0x02, 0x9D, 0x62, 0x00, 0xB7, 0x40, 0xD3, 0x18, 0x01, 0x26, 0x7F, 0x19, 0x76, 0x42, 0x00, 0x25, + 0x00, 0x93, 0x20, 0xE0, 0x2B, 0x1C, 0x0D, 0x33, 0x77, 0x48, 0xDB, 0x00, 0xC3, 0x18, 0x04, 0x21, + 0x5B, 0x5E, 0x00, 0x2B, 0x15, 0xD0, 0x00, 0x9A, 0xAB, 0x00, 0xC3, 0x18, 0x58, 0x68, 0x93, 0x88, + 0x71, 0x4A, 0xC0, 0x1A, 0x2B, 0x1C, 0x0E, 0x33, 0x9B, 0x00, 0x99, 0x58, 0x00, 0x9A, 0x00, 0xB2, + 0xD3, 0x89, 0xC9, 0x1A, 0x09, 0xB2, 0xFF, 0xF7, 0xAD, 0xFF, 0xB8, 0x42, 0x01, 0xDA, 0x2E, 0x1C, + 0x07, 0x1C, 0x01, 0x35, 0xED, 0xB2, 0x03, 0x9B, 0x9D, 0x42, 0xDB, 0xDB, 0x75, 0x1C, 0x0A, 0xD0, + 0x67, 0x4B, 0x68, 0x49, 0x98, 0x57, 0xB2, 0x00, 0x01, 0x30, 0x02, 0xD0, 0x88, 0x58, 0xB8, 0x42, + 0x01, 0xD9, 0x8F, 0x50, 0x9C, 0x55, 0x01, 0x34, 0x05, 0x2C, 0xB5, 0xD1, 0x00, 0x23, 0x5E, 0x4A, + 0x5E, 0x49, 0x32, 0xE0, 0x5E, 0x4E, 0xF0, 0x5C, 0x44, 0xB2, 0x01, 0x34, 0x2B, 0xD0, 0x9D, 0x00, + 0xC0, 0xB2, 0x01, 0x95, 0x55, 0x19, 0x87, 0x00, 0x6D, 0x68, 0xCC, 0x19, 0x65, 0x60, 0x1D, 0x1C, + 0x0E, 0x35, 0x04, 0x1C, 0xAD, 0x00, 0xAD, 0x58, 0x0E, 0x34, 0xA4, 0x00, 0x65, 0x50, 0x04, 0x1C, + 0x1D, 0x1C, 0x0D, 0x34, 0x0D, 0x35, 0xE4, 0x00, 0xED, 0x00, 0x0C, 0x19, 0x55, 0x19, 0x00, 0x97, + 0x04, 0x34, 0x04, 0x35, 0xC0, 0xCD, 0xC0, 0xC4, 0x1C, 0x1C, 0x34, 0x34, 0xA4, 0x00, 0x34, 0x30, + 0x14, 0x19, 0x64, 0x68, 0x80, 0x00, 0x08, 0x18, 0x44, 0x60, 0x4A, 0x48, 0x01, 0x9C, 0x00, 0x9D, + 0x20, 0x58, 0x4C, 0x4E, 0xA8, 0x51, 0x01, 0x33, 0xDB, 0xB2, 0x10, 0x68, 0x83, 0x42, 0xC9, 0xDB, + 0x00, 0x23, 0x41, 0x4E, 0x4E, 0xE0, 0x42, 0x4F, 0xFA, 0x56, 0x01, 0x32, 0x48, 0xD1, 0x1A, 0x1C, + 0x0D, 0x32, 0xD2, 0x00, 0xB2, 0x18, 0x04, 0x20, 0x12, 0x5E, 0x00, 0x2A, 0x40, 0xD0, 0x00, 0x20, + 0x3F, 0x4F, 0x02, 0x1C, 0xC4, 0x19, 0x18, 0x25, 0x65, 0x5F, 0xD1, 0xB2, 0x00, 0x2D, 0x33, 0xD1, + 0x36, 0x4D, 0x6C, 0x24, 0x2D, 0x18, 0xAC, 0x46, 0xA4, 0x44, 0x65, 0x46, 0x00, 0x24, 0x2D, 0x5F, + 0x00, 0x2D, 0x29, 0xD1, 0x32, 0x48, 0x31, 0x4D, 0xC1, 0x54, 0x94, 0x00, 0x2E, 0x48, 0x2C, 0x19, + 0x9D, 0x00, 0x45, 0x19, 0x6D, 0x68, 0x2D, 0x4F, 0x65, 0x60, 0x1D, 0x1C, 0x0E, 0x35, 0x14, 0x1C, + 0xAD, 0x00, 0x2D, 0x58, 0x0E, 0x34, 0xA4, 0x00, 0x3D, 0x51, 0x14, 0x1C, 0x1D, 0x1C, 0x0D, 0x34, + 0x0D, 0x35, 0xE4, 0x00, 0xED, 0x00, 0x3C, 0x19, 0x45, 0x19, 0x04, 0x34, 0x04, 0x35, 0x82, 0xCD, + 0x82, 0xC4, 0x1C, 0x1C, 0x34, 0x34, 0xA4, 0x00, 0x34, 0x32, 0x20, 0x49, 0x00, 0x19, 0x92, 0x00, + 0x40, 0x68, 0x8A, 0x18, 0x50, 0x60, 0x03, 0xE0, 0x01, 0x32, 0x08, 0x30, 0x05, 0x2A, 0xC1, 0xD1, + 0x01, 0x33, 0xDB, 0xB2, 0x32, 0x68, 0x93, 0x42, 0xAD, 0xDB, 0x20, 0x4B, 0x18, 0x49, 0x1C, 0x1C, + 0x0D, 0x34, 0xFF, 0x20, 0x1A, 0x78, 0x04, 0x2A, 0x02, 0xD8, 0x8A, 0x5C, 0x1A, 0x70, 0x00, 0xE0, + 0x18, 0x70, 0x01, 0x33, 0xA3, 0x42, 0xF5, 0xD1, 0x19, 0x4A, 0x10, 0x48, 0x00, 0x23, 0x13, 0x60, + 0x19, 0x1C, 0x05, 0x22, 0x06, 0x1C, 0x01, 0x3A, 0xD2, 0xB2, 0x14, 0x1C, 0x0D, 0x34, 0xE5, 0x00, + 0x45, 0x19, 0x6D, 0x89, 0xA9, 0x42, 0x00, 0xDA, 0x29, 0x1C, 0xE4, 0x00, 0x34, 0x19, 0x04, 0x25, + 0x64, 0x5F, 0xA3, 0x42, 0x00, 0xDA, 0x23, 0x1C, 0x00, 0x2A, 0xEC, 0xD1, 0x0C, 0x4A, 0x05, 0xB0, + 0x51, 0x60, 0x13, 0x60, 0xF0, 0xBD, 0xC0, 0x46, 0x8C, 0x08, 0x00, 0x20, 0x20, 0x0C, 0x00, 0x20, + 0x14, 0x0A, 0x00, 0x20, 0x28, 0x0F, 0x00, 0x20, 0x38, 0x06, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, + 0xC0, 0x09, 0x00, 0x20, 0x9C, 0x0B, 0x00, 0x20, 0x40, 0x0A, 0x00, 0x20, 0x98, 0x09, 0x00, 0x20, + 0x6C, 0x08, 0x00, 0x20, 0xF0, 0xB5, 0x22, 0x48, 0x22, 0x4A, 0x23, 0x49, 0x05, 0x23, 0x01, 0x3B, + 0xDB, 0xB2, 0xDD, 0x1C, 0xED, 0x00, 0x2D, 0x5E, 0x00, 0x2D, 0x23, 0xD0, 0x1D, 0x1C, 0x0D, 0x35, + 0xED, 0x00, 0x55, 0x19, 0x04, 0x26, 0xAD, 0x5F, 0x00, 0x2D, 0x1B, 0xD0, 0x9D, 0x00, 0x55, 0x19, + 0x6E, 0x68, 0x5D, 0x00, 0x47, 0x19, 0x04, 0x24, 0x3C, 0x5F, 0x37, 0x1B, 0x16, 0x4C, 0x7F, 0x10, + 0xBE, 0x19, 0x65, 0x19, 0xAE, 0x80, 0x1D, 0x1C, 0x0E, 0x35, 0xAD, 0x00, 0x56, 0x59, 0x1D, 0x1D, + 0x6D, 0x00, 0x47, 0x19, 0x06, 0x24, 0x3C, 0x5F, 0x37, 0x1B, 0x0F, 0x4C, 0x7F, 0x10, 0xBE, 0x19, + 0x65, 0x19, 0x0C, 0xE0, 0x9E, 0x00, 0x96, 0x19, 0x76, 0x68, 0x5D, 0x00, 0x4D, 0x19, 0xAE, 0x80, + 0x1E, 0x1C, 0x0E, 0x36, 0x1D, 0x1D, 0xB6, 0x00, 0x6D, 0x00, 0x96, 0x59, 0x4D, 0x19, 0xEE, 0x80, + 0x00, 0x2B, 0xC4, 0xD1, 0x03, 0x4B, 0x1A, 0x68, 0x03, 0x4B, 0x1A, 0x60, 0xF0, 0xBD, 0xC0, 0x46, + 0xC0, 0x09, 0x00, 0x20, 0x20, 0x0C, 0x00, 0x20, 0x40, 0x0A, 0x00, 0x20, 0x38, 0xB5, 0x04, 0x1C, + 0x08, 0x1C, 0x00, 0x2A, 0x07, 0xD0, 0x54, 0x43, 0x58, 0x43, 0xD1, 0x18, 0x20, 0x18, 0x4D, 0x10, + 0x40, 0x19, 0x01, 0xF0, 0x7B, 0xFA, 0x38, 0xBD, 0xF7, 0xB5, 0x03, 0x68, 0x04, 0x1C, 0x18, 0x01, + 0xC3, 0x1A, 0xC0, 0x21, 0x58, 0x01, 0xC9, 0x00, 0x01, 0xF0, 0x70, 0xFA, 0x63, 0x68, 0x07, 0x1C, + 0x05, 0x1C, 0xC8, 0x20, 0x14, 0x37, 0x80, 0x00, 0x98, 0x21, 0x58, 0x43, 0x27, 0x60, 0x09, 0x01, + 0x01, 0xF0, 0x64, 0xFA, 0x2C, 0x4B, 0x15, 0x30, 0x1B, 0x78, 0x60, 0x60, 0x00, 0x2B, 0x03, 0xD1, + 0x87, 0x20, 0x9B, 0x26, 0x40, 0x00, 0x01, 0xE0, 0x28, 0x48, 0xA5, 0x26, 0x28, 0x4B, 0x1B, 0x78, + 0x01, 0x93, 0x00, 0x2B, 0x01, 0xD1, 0x82, 0x20, 0x40, 0x00, 0xEF, 0x2F, 0x03, 0xDC, 0xDC, 0x3D, + 0x68, 0x43, 0xF0, 0x21, 0x06, 0xE0, 0xDC, 0x2D, 0x08, 0xD0, 0xDC, 0x23, 0x5D, 0x1B, 0x68, 0x43, + 0xF0, 0x21, 0x49, 0x42, 0x01, 0xF0, 0x42, 0xFA, 0xF0, 0x30, 0x20, 0x60, 0x01, 0x9B, 0x00, 0x2B, + 0x1A, 0xD0, 0x60, 0x68, 0x77, 0x28, 0x06, 0xDC, 0x78, 0x38, 0x70, 0x43, 0x78, 0x21, 0x01, 0xF0, + 0x35, 0xFA, 0x78, 0x30, 0x0F, 0xE0, 0xC8, 0x23, 0x9B, 0x00, 0x1B, 0x1A, 0x77, 0x2B, 0x0B, 0xDC, + 0xAA, 0x23, 0x9B, 0x00, 0x18, 0x1A, 0x78, 0x21, 0x70, 0x43, 0x49, 0x42, 0x01, 0xF0, 0x26, 0xFA, + 0xAA, 0x23, 0x9B, 0x00, 0xC0, 0x18, 0x60, 0x60, 0x23, 0x68, 0x00, 0x2B, 0x01, 0xDC, 0x01, 0x23, + 0x04, 0xE0, 0x0C, 0x4A, 0x93, 0x42, 0x02, 0xDD, 0xF0, 0x23, 0x5B, 0x00, 0x23, 0x60, 0x63, 0x68, + 0x00, 0x2B, 0x01, 0xDC, 0x01, 0x23, 0x04, 0xE0, 0x07, 0x4A, 0x93, 0x42, 0x02, 0xDD, 0xC8, 0x23, + 0x9B, 0x00, 0x63, 0x60, 0xF7, 0xBD, 0xC0, 0x46, 0x76, 0x07, 0x00, 0x20, 0x1D, 0x01, 0x00, 0x00, + 0x40, 0x06, 0x00, 0x20, 0xDF, 0x01, 0x00, 0x00, 0x1F, 0x03, 0x00, 0x00, 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, + 0x38, 0xB5, 0x80, 0x24, 0xE4, 0x05, 0x62, 0x68, 0x26, 0x4B, 0x00, 0x25, 0x13, 0x40, 0x63, 0x60, + 0x3F, 0x23, 0x65, 0x62, 0xA5, 0x62, 0xE5, 0x60, 0x25, 0x61, 0x63, 0x61, 0xA5, 0x61, 0x00, 0xF0, + 0x47, 0xF8, 0xA2, 0x68, 0x80, 0x23, 0x1B, 0x01, 0x13, 0x43, 0xA3, 0x60, 0x00, 0xF0, 0xB2, 0xFA, + 0x23, 0x6B, 0x60, 0x22, 0x93, 0x43, 0x23, 0x63, 0x23, 0x6B, 0x80, 0x22, 0x13, 0x43, 0x23, 0x63, + 0x00, 0xF0, 0x18, 0xFB, 0x00, 0xF0, 0x8E, 0xF8, 0x00, 0xF0, 0x02, 0xFB, 0x28, 0x1C, 0x65, 0x70, + 0x02, 0x21, 0xFF, 0xF7, 0xA4, 0xFF, 0x29, 0x1C, 0x01, 0x20, 0xFF, 0xF7, 0xA0, 0xFF, 0x02, 0x20, + 0x01, 0x21, 0xFF, 0xF7, 0x9C, 0xFF, 0x03, 0x20, 0x01, 0x1C, 0xFF, 0xF7, 0x98, 0xFF, 0x04, 0x20, + 0x03, 0x21, 0xFF, 0xF7, 0x94, 0xFF, 0x05, 0x20, 0x02, 0x21, 0xFF, 0xF7, 0x90, 0xFF, 0x0A, 0x4B, + 0x01, 0x22, 0x1A, 0x60, 0x02, 0x22, 0x1A, 0x60, 0x08, 0x21, 0x04, 0x22, 0x1A, 0x60, 0x19, 0x60, + 0x10, 0x21, 0x19, 0x60, 0xFC, 0x33, 0x5D, 0x60, 0x04, 0x4B, 0x19, 0x69, 0x0A, 0x43, 0x1A, 0x61, + 0x62, 0xB6, 0x38, 0xBD, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0xE1, 0x00, 0xE0, 0x00, 0xED, 0x00, 0xE0, + 0x30, 0xB5, 0x18, 0x4A, 0x80, 0x23, 0x51, 0x78, 0xDB, 0x05, 0x19, 0x71, 0xD1, 0x78, 0x01, 0x20, + 0x5C, 0x68, 0x08, 0x40, 0x14, 0x49, 0x80, 0x07, 0x21, 0x40, 0x01, 0x43, 0x59, 0x60, 0x11, 0x79, + 0x03, 0x20, 0x5C, 0x68, 0x08, 0x40, 0x11, 0x49, 0x00, 0x07, 0x21, 0x40, 0x01, 0x43, 0x59, 0x60, + 0x54, 0x79, 0x0F, 0x21, 0x5D, 0x68, 0x0E, 0x48, 0x0C, 0x40, 0x24, 0x04, 0x28, 0x40, 0x20, 0x43, + 0x58, 0x60, 0x94, 0x79, 0x0B, 0x48, 0x5D, 0x68, 0x0C, 0x40, 0x28, 0x40, 0x24, 0x06, 0x20, 0x43, + 0x58, 0x60, 0xD2, 0x79, 0x58, 0x68, 0x11, 0x40, 0x0A, 0x05, 0x07, 0x49, 0x01, 0x40, 0x11, 0x43, + 0x59, 0x60, 0x30, 0xBD, 0x98, 0x0A, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0xFF, 0xCF, + 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0x0F, 0xFF, 0x06, 0x4B, 0x3F, 0x20, + 0x19, 0x68, 0x80, 0x23, 0xDB, 0x05, 0x01, 0x39, 0x01, 0x40, 0x04, 0x4A, 0x58, 0x6B, 0x09, 0x02, + 0x02, 0x40, 0x0A, 0x43, 0x5A, 0x63, 0x70, 0x47, 0x24, 0x0A, 0x00, 0x20, 0xFF, 0xC0, 0xFF, 0xFF, + 0x80, 0x23, 0xDB, 0x05, 0xD9, 0x68, 0x08, 0x22, 0x91, 0x43, 0xD9, 0x60, 0x59, 0x69, 0x0A, 0x43, + 0x5A, 0x61, 0x70, 0x47, 0x10, 0xB5, 0xA0, 0x23, 0xDB, 0x05, 0x59, 0x68, 0x29, 0x4A, 0x80, 0x20, + 0x0A, 0x40, 0x5A, 0x60, 0x1A, 0x68, 0xC0, 0x00, 0x52, 0x00, 0x52, 0x08, 0x1A, 0x60, 0x19, 0x68, + 0x80, 0x22, 0x12, 0x06, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x01, 0x21, 0x8A, 0x43, 0x1A, 0x60, + 0x1A, 0x68, 0x10, 0x21, 0x8A, 0x43, 0x1A, 0x60, 0x19, 0x68, 0x1F, 0x4A, 0x0A, 0x40, 0x80, 0x21, + 0x09, 0x02, 0x0A, 0x43, 0x1A, 0x60, 0x1A, 0x68, 0x1C, 0x49, 0x0A, 0x40, 0x02, 0x43, 0x1A, 0x60, + 0x1B, 0x4A, 0x12, 0x68, 0x00, 0x2A, 0x08, 0xD0, 0x12, 0x78, 0x7F, 0x20, 0x10, 0x40, 0x1C, 0x68, + 0x18, 0x4A, 0x00, 0x06, 0x22, 0x40, 0x02, 0x43, 0x1A, 0x60, 0xA0, 0x23, 0xDB, 0x05, 0x5A, 0x68, + 0x01, 0x20, 0x02, 0x43, 0x5A, 0x60, 0x5A, 0x68, 0x11, 0x40, 0x80, 0x22, 0x82, 0x40, 0x11, 0x43, + 0x59, 0x60, 0x59, 0x68, 0x10, 0x4A, 0x0A, 0x40, 0xC0, 0x21, 0x89, 0x02, 0x0A, 0x43, 0x5A, 0x60, + 0x59, 0x68, 0x80, 0x22, 0x92, 0x05, 0x0A, 0x43, 0x5A, 0x60, 0x59, 0x68, 0x80, 0x22, 0x52, 0x05, + 0x0A, 0x43, 0x5A, 0x60, 0xC0, 0x46, 0x80, 0x22, 0x59, 0x68, 0x52, 0x04, 0x0A, 0x43, 0x5A, 0x60, + 0x10, 0xBD, 0xC0, 0x46, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, + 0x20, 0x06, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xF8, 0xFF, 0x38, 0xB5, 0x09, 0x4B, + 0x09, 0x49, 0x5A, 0x78, 0xDC, 0x78, 0x51, 0x43, 0x08, 0x4B, 0x05, 0x1C, 0xC9, 0x18, 0x08, 0x48, + 0x01, 0xF0, 0xA4, 0xF8, 0x06, 0x4B, 0x29, 0x1C, 0x01, 0x34, 0x58, 0x43, 0xA1, 0x40, 0x01, 0xF0, + 0x9D, 0xF8, 0x38, 0xBD, 0x98, 0x0A, 0x00, 0x20, 0x44, 0xFE, 0xFF, 0xFF, 0xFE, 0x24, 0x02, 0x00, + 0x40, 0x42, 0x0F, 0x00, 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, 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, 0xED, 0x78, 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, + 0x98, 0x0A, 0x00, 0x20, 0x18, 0xE0, 0x00, 0xE0, 0x58, 0x08, 0x00, 0x20, 0x01, 0x30, 0x43, 0x00, + 0x18, 0x18, 0x40, 0x18, 0x70, 0x47, 0x3F, 0x30, 0x70, 0x47, 0xF0, 0xB5, 0x93, 0x1E, 0x87, 0xB0, + 0x17, 0x1C, 0x5A, 0x1E, 0x93, 0x41, 0x00, 0x24, 0x01, 0x90, 0x5B, 0x42, 0x68, 0x46, 0x02, 0x91, + 0x04, 0x94, 0x84, 0x82, 0x0C, 0x25, 0x03, 0x93, 0x01, 0x3D, 0xED, 0xB2, 0x01, 0x2F, 0x06, 0xD1, + 0x15, 0x23, 0x6B, 0x43, 0x01, 0x99, 0x1E, 0x4A, 0x5B, 0x18, 0x9C, 0x56, 0x01, 0xE0, 0x03, 0x9B, + 0x1C, 0x40, 0x02, 0x98, 0x24, 0x18, 0x21, 0x1C, 0x08, 0x31, 0x02, 0xDA, 0x08, 0x24, 0x64, 0x42, + 0x02, 0xE0, 0x07, 0x2C, 0x00, 0xDD, 0x07, 0x24, 0x0F, 0x23, 0x1C, 0x40, 0x15, 0x4B, 0x03, 0x21, + 0x5E, 0x57, 0x30, 0x1C, 0x01, 0xF0, 0x1A, 0xF8, 0x40, 0xB2, 0x83, 0x00, 0xC0, 0x1A, 0x36, 0x18, + 0x76, 0x00, 0x22, 0x1C, 0x10, 0x20, 0x9A, 0x40, 0x80, 0x19, 0x69, 0x46, 0x13, 0x1C, 0x42, 0x5A, + 0x13, 0x43, 0x43, 0x52, 0x00, 0x2D, 0xCF, 0xD1, 0x0B, 0x4D, 0x03, 0x24, 0x0C, 0x26, 0x01, 0x3C, + 0xE4, 0xB2, 0x01, 0x98, 0x21, 0x1C, 0xFF, 0xF7, 0xB1, 0xFF, 0x63, 0x00, 0x70, 0x43, 0x10, 0x33, + 0x69, 0x46, 0x5B, 0x5A, 0x42, 0x5B, 0x43, 0x53, 0x00, 0x2C, 0xF0, 0xD1, 0x07, 0xB0, 0xF0, 0xBD, + 0xA0, 0x0A, 0x00, 0x20, 0x51, 0x36, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x40, 0xF0, 0xB5, 0x93, 0x1E, + 0x17, 0x1C, 0x5A, 0x1E, 0x93, 0x41, 0x85, 0xB0, 0x00, 0x26, 0x5B, 0x42, 0x01, 0x90, 0x02, 0x91, + 0x34, 0x1C, 0x02, 0x25, 0x03, 0x93, 0x01, 0x3D, 0xED, 0xB2, 0x01, 0x2F, 0x06, 0xD1, 0x15, 0x23, + 0x6B, 0x43, 0x01, 0x9A, 0x9B, 0x18, 0x16, 0x4A, 0x9C, 0x56, 0x01, 0xE0, 0x03, 0x9B, 0x1C, 0x40, + 0x02, 0x9A, 0xA4, 0x18, 0x23, 0x1C, 0x08, 0x33, 0x02, 0xDA, 0x08, 0x24, 0x64, 0x42, 0x02, 0xE0, + 0x07, 0x2C, 0x00, 0xDD, 0x07, 0x24, 0x0F, 0x23, 0x1C, 0x40, 0x0E, 0x4B, 0x0E, 0x4A, 0x5B, 0x57, + 0x03, 0x21, 0xD0, 0x56, 0x00, 0xF0, 0xC2, 0xFF, 0x43, 0xB2, 0x9B, 0x00, 0x22, 0x1C, 0x9A, 0x40, + 0x16, 0x43, 0xB6, 0xB2, 0x00, 0x2D, 0xD6, 0xD1, 0x01, 0x98, 0x14, 0x38, 0xFF, 0xF7, 0x6B, 0xFF, + 0x0C, 0x22, 0x50, 0x43, 0x05, 0x4B, 0x05, 0xB0, 0xC2, 0x5A, 0xC6, 0x52, 0xF0, 0xBD, 0xC0, 0x46, + 0xA0, 0x0A, 0x00, 0x20, 0x65, 0x36, 0x00, 0x00, 0x51, 0x36, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x40, + 0xF0, 0xB5, 0x8D, 0xB0, 0x03, 0xAC, 0x01, 0x91, 0x06, 0x1C, 0x00, 0x21, 0x20, 0x1C, 0x24, 0x22, + 0x01, 0xF0, 0x3C, 0xF8, 0x0C, 0x25, 0x27, 0x1C, 0x20, 0x49, 0x01, 0x3D, 0xED, 0xB2, 0x4C, 0x57, + 0x03, 0x21, 0x20, 0x1C, 0x00, 0xF0, 0x92, 0xFF, 0x40, 0xB2, 0x82, 0x00, 0x83, 0x1A, 0xE3, 0x18, + 0x0C, 0x21, 0x4B, 0x43, 0x69, 0x1C, 0xFB, 0x18, 0x91, 0x40, 0x0A, 0x1C, 0x19, 0x89, 0x0A, 0x43, + 0x1A, 0x81, 0x01, 0x22, 0xA2, 0x40, 0x14, 0x1C, 0x5A, 0x88, 0x14, 0x43, 0x5C, 0x80, 0x00, 0x2D, + 0xE2, 0xD1, 0x03, 0x24, 0x0C, 0x25, 0x01, 0x9A, 0x01, 0x3C, 0xE4, 0xB2, 0x00, 0x2A, 0x08, 0xD0, + 0x2B, 0x1C, 0x63, 0x43, 0x0E, 0x4A, 0x03, 0xA9, 0x92, 0x57, 0xCB, 0x18, 0x01, 0x21, 0x91, 0x40, + 0x59, 0x60, 0x2F, 0x1C, 0x67, 0x43, 0x03, 0xAA, 0xD7, 0x19, 0x73, 0x1C, 0x7B, 0x81, 0x21, 0x1C, + 0x30, 0x1C, 0xFF, 0xF7, 0x13, 0xFF, 0x68, 0x43, 0x06, 0x4B, 0x39, 0x1C, 0xC0, 0x18, 0x0C, 0x22, + 0x00, 0xF0, 0xBE, 0xFF, 0x00, 0x2C, 0xDE, 0xD1, 0x0D, 0xB0, 0xF0, 0xBD, 0x51, 0x36, 0x00, 0x00, + 0x38, 0x36, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x40, 0xF0, 0xB5, 0x87, 0xB0, 0x03, 0xAC, 0x0C, 0x25, + 0x2A, 0x1C, 0x01, 0x90, 0x00, 0x21, 0x20, 0x1C, 0x00, 0xF0, 0xE8, 0xFF, 0x20, 0x4A, 0x01, 0x21, + 0x20, 0x4B, 0x51, 0x56, 0x12, 0x78, 0x5E, 0x56, 0x52, 0xB2, 0x30, 0x1C, 0x03, 0x21, 0x9F, 0x5C, + 0x00, 0xF0, 0x3C, 0xFF, 0x40, 0xB2, 0x7F, 0xB2, 0x80, 0x00, 0x02, 0x23, 0x83, 0x40, 0x03, 0x21, + 0x38, 0x1C, 0x00, 0x93, 0x00, 0xF0, 0x32, 0xFF, 0x01, 0x23, 0x40, 0xB2, 0x80, 0x00, 0x1A, 0x1C, + 0x82, 0x40, 0x10, 0x1C, 0x00, 0x9A, 0x14, 0x49, 0x10, 0x43, 0x1A, 0x1C, 0xB2, 0x40, 0x80, 0xB2, + 0x16, 0x1C, 0x1A, 0x1C, 0x00, 0x90, 0xBA, 0x40, 0x01, 0x98, 0x16, 0x43, 0x0F, 0x4A, 0x14, 0x38, + 0x12, 0x56, 0xB6, 0xB2, 0x8F, 0x56, 0xBB, 0x40, 0x1F, 0x1C, 0xFF, 0xF7, 0xCC, 0xFE, 0x6B, 0x46, + 0x1B, 0x88, 0x68, 0x43, 0x23, 0x81, 0x0A, 0x4A, 0x01, 0x9B, 0x80, 0x18, 0x02, 0x33, 0x2A, 0x1C, + 0x21, 0x1C, 0x66, 0x80, 0x67, 0x60, 0x63, 0x81, 0x00, 0xF0, 0x6A, 0xFF, 0x07, 0xB0, 0xF0, 0xBD, + 0x65, 0x36, 0x00, 0x00, 0x51, 0x36, 0x00, 0x00, 0x38, 0x36, 0x00, 0x00, 0x61, 0x36, 0x00, 0x00, + 0x00, 0x0C, 0x00, 0x40, 0x70, 0xB5, 0x24, 0x4A, 0x80, 0x23, 0xDB, 0x05, 0x54, 0x7C, 0x9D, 0x68, + 0x07, 0x21, 0x22, 0x48, 0x0C, 0x40, 0x24, 0x03, 0x28, 0x40, 0x20, 0x43, 0x98, 0x60, 0x9C, 0x68, + 0x1F, 0x48, 0x20, 0x40, 0x98, 0x60, 0x9C, 0x68, 0x1E, 0x48, 0x20, 0x40, 0x98, 0x60, 0x94, 0x7A, + 0x3F, 0x20, 0x9D, 0x68, 0x04, 0x40, 0x1C, 0x48, 0xA4, 0x04, 0x28, 0x40, 0x20, 0x43, 0x98, 0x60, + 0x50, 0x7A, 0x9C, 0x68, 0x01, 0x40, 0x08, 0x06, 0x18, 0x49, 0x21, 0x40, 0x01, 0x43, 0x99, 0x60, + 0x98, 0x68, 0x80, 0x21, 0x09, 0x05, 0x01, 0x43, 0x15, 0x48, 0x99, 0x60, 0x04, 0x68, 0x19, 0x1C, + 0x38, 0x31, 0x0C, 0x70, 0x45, 0x68, 0x9E, 0x6B, 0x7F, 0x21, 0x12, 0x4C, 0x0D, 0x40, 0x34, 0x40, + 0x2D, 0x02, 0x2C, 0x43, 0x9C, 0x63, 0x84, 0x68, 0x9D, 0x6B, 0x0F, 0x48, 0x0C, 0x40, 0x28, 0x40, + 0x24, 0x04, 0x20, 0x43, 0x98, 0x63, 0x92, 0x79, 0x98, 0x6B, 0x11, 0x40, 0x0A, 0x06, 0x0B, 0x49, + 0x01, 0x40, 0x11, 0x43, 0x99, 0x63, 0x70, 0xBD, 0xC8, 0x0B, 0x00, 0x20, 0xFF, 0x8F, 0xFF, 0xFF, + 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF, 0xFF, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, + 0x60, 0x08, 0x00, 0x20, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, + 0x10, 0xB5, 0x01, 0x20, 0x40, 0x42, 0x00, 0x21, 0xFF, 0xF7, 0xF2, 0xFE, 0x00, 0x24, 0x20, 0x1C, + 0x01, 0x21, 0x01, 0x34, 0xFF, 0xF7, 0xEC, 0xFE, 0x14, 0x2C, 0xF8, 0xD1, 0x20, 0x1C, 0xFF, 0xF7, + 0x3B, 0xFF, 0x10, 0xBD, 0x80, 0x23, 0xDB, 0x05, 0x1A, 0x6B, 0x1F, 0x21, 0x8A, 0x43, 0x15, 0x21, + 0x0A, 0x43, 0x1A, 0x63, 0x5A, 0x6B, 0x0F, 0x21, 0x8A, 0x43, 0x0E, 0x21, 0x0A, 0x43, 0x5A, 0x63, + 0x70, 0x47, 0x00, 0xB5, 0x80, 0x21, 0xC9, 0x05, 0x0B, 0x79, 0x5A, 0x1E, 0x98, 0x42, 0x09, 0xDD, + 0x01, 0xE0, 0xDA, 0xB2, 0x0A, 0x71, 0x01, 0x33, 0x83, 0x42, 0xFA, 0xDD, 0x04, 0xE0, 0xD3, 0xB2, + 0x0B, 0x71, 0x01, 0x3A, 0x82, 0x42, 0xFA, 0xDA, 0x00, 0xBD, 0xC0, 0x46, 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, 0x56, 0xFC, + 0x08, 0x4B, 0x00, 0x22, 0x00, 0xE0, 0x04, 0xC3, 0x83, 0x42, 0xFC, 0xD3, 0x08, 0xBD, 0xC0, 0x46, + 0x00, 0x4F, 0x00, 0x00, 0x28, 0x06, 0x00, 0x20, 0x0C, 0x07, 0x00, 0x20, 0x10, 0x07, 0x00, 0x20, + 0x74, 0x11, 0x00, 0x20, 0x18, 0x14, 0x00, 0x20, 0xF7, 0xB5, 0x3B, 0x4A, 0x01, 0x23, 0x13, 0x70, + 0x3A, 0x4A, 0x0C, 0x20, 0x13, 0x70, 0x3A, 0x4A, 0x13, 0x70, 0x3A, 0x4A, 0x00, 0x23, 0x01, 0x38, + 0xC0, 0xB2, 0x81, 0x00, 0x8B, 0x50, 0x00, 0x28, 0xF9, 0xD1, 0x37, 0x4B, 0x37, 0x4A, 0x18, 0x70, + 0x01, 0x23, 0x13, 0x70, 0x36, 0x4A, 0x13, 0x70, 0x36, 0x4B, 0x19, 0x7A, 0x0C, 0x23, 0x01, 0x3B, + 0xDB, 0xB2, 0x35, 0x4A, 0x5C, 0x1C, 0x64, 0x00, 0xA5, 0x5A, 0x34, 0x4E, 0x0D, 0x41, 0x5A, 0x00, + 0x95, 0x53, 0x5E, 0x01, 0x13, 0x22, 0x01, 0x95, 0x00, 0x96, 0x01, 0x3A, 0xD2, 0xB2, 0x30, 0x4F, + 0x55, 0x01, 0xED, 0x19, 0x65, 0x5B, 0x2F, 0x4E, 0xAC, 0x46, 0x55, 0x01, 0xAD, 0x19, 0x65, 0x5B, + 0x67, 0x46, 0x0F, 0x41, 0xBC, 0x46, 0x2F, 0x1C, 0x0F, 0x41, 0x01, 0x9D, 0x67, 0x44, 0x00, 0x9E, + 0x7F, 0x10, 0xEF, 0x1B, 0xC0, 0x19, 0x28, 0x4D, 0xB7, 0x18, 0xBF, 0x00, 0x00, 0x26, 0x7E, 0x51, + 0xB2, 0x42, 0xE2, 0xD1, 0xB3, 0x42, 0xD2, 0xD1, 0x1E, 0x4B, 0x24, 0x4C, 0x1E, 0x8D, 0x00, 0x2E, + 0x02, 0xD1, 0x40, 0x23, 0x23, 0x60, 0x0D, 0xE0, 0xE4, 0x21, 0x5D, 0x8D, 0x00, 0xF0, 0xEE, 0xFD, + 0x76, 0x1B, 0xB6, 0x01, 0x41, 0x1B, 0x30, 0x1C, 0x00, 0xF0, 0xE8, 0xFD, 0x6E, 0x28, 0x00, 0xDD, + 0x6E, 0x20, 0x20, 0x60, 0x13, 0x4C, 0x64, 0x20, 0xE3, 0x7C, 0xA6, 0x78, 0x58, 0x43, 0x21, 0x7A, + 0xA3, 0x79, 0x37, 0x1C, 0x8F, 0x40, 0x58, 0x43, 0x39, 0x1C, 0x00, 0xF0, 0xD7, 0xFD, 0x14, 0x4D, + 0x28, 0x60, 0xE1, 0x78, 0x70, 0x43, 0x00, 0xF0, 0xD1, 0xFD, 0x00, 0x21, 0x68, 0x60, 0x10, 0x22, + 0x10, 0x48, 0x00, 0xF0, 0x6B, 0xFE, 0xF7, 0xBD, 0xBC, 0x09, 0x00, 0x20, 0x99, 0x07, 0x00, 0x20, + 0x9A, 0x07, 0x00, 0x20, 0x30, 0x11, 0x00, 0x20, 0x26, 0x0F, 0x00, 0x20, 0x30, 0x0A, 0x00, 0x20, + 0x68, 0x0F, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0x00, 0x08, 0x00, 0x40, 0x16, 0x11, 0x00, 0x20, + 0x20, 0x08, 0x00, 0x40, 0x40, 0x08, 0x00, 0x40, 0x18, 0x00, 0x00, 0x20, 0x34, 0x0A, 0x00, 0x20, + 0x48, 0x08, 0x00, 0x20, 0x78, 0x08, 0x00, 0x20, 0xF7, 0xB5, 0x2C, 0x4B, 0x0C, 0x22, 0x19, 0x7A, + 0x5B, 0x78, 0x00, 0x93, 0x2A, 0x4B, 0x1B, 0x68, 0x01, 0x93, 0x33, 0xE0, 0x15, 0x20, 0x50, 0x43, + 0x54, 0x1C, 0x13, 0x23, 0x64, 0x00, 0x94, 0x46, 0x01, 0x3B, 0xDB, 0xB2, 0x25, 0x4D, 0x5A, 0x01, + 0x52, 0x19, 0xA2, 0x5A, 0x00, 0x9E, 0x0A, 0x41, 0x00, 0x2E, 0x06, 0xD0, 0x22, 0x4F, 0xC5, 0x18, + 0xED, 0x5D, 0x6A, 0x43, 0x01, 0x9D, 0x6A, 0x43, 0x12, 0x13, 0x1E, 0x4F, 0x5E, 0x1C, 0x75, 0x01, + 0xED, 0x19, 0x65, 0x5B, 0x00, 0x9F, 0x0D, 0x41, 0x00, 0x2F, 0x06, 0xD0, 0x1A, 0x4F, 0x86, 0x19, + 0xF6, 0x5D, 0x75, 0x43, 0x01, 0x9E, 0x75, 0x43, 0x2D, 0x13, 0x67, 0x46, 0x7E, 0x01, 0x52, 0x19, + 0xF6, 0x18, 0x16, 0x4D, 0xB6, 0x00, 0x77, 0x59, 0x52, 0x10, 0xD7, 0x19, 0x77, 0x51, 0x00, 0x2B, + 0xD2, 0xD1, 0x62, 0x46, 0x01, 0x3A, 0xD2, 0xB2, 0xFF, 0x2A, 0xC7, 0xD1, 0x10, 0x49, 0x11, 0x48, + 0x4B, 0x78, 0x09, 0x78, 0x5B, 0x01, 0x1B, 0x18, 0x98, 0x88, 0x08, 0x4B, 0x0D, 0x4D, 0x1A, 0x7A, + 0x0D, 0x4B, 0x10, 0x41, 0x5C, 0x68, 0x49, 0x01, 0x00, 0x19, 0x49, 0x19, 0x58, 0x60, 0x49, 0x88, + 0x11, 0x41, 0x0A, 0x1C, 0x19, 0x68, 0x52, 0x18, 0x1A, 0x60, 0xF7, 0xBD, 0xC8, 0x0B, 0x00, 0x20, + 0x34, 0x0A, 0x00, 0x20, 0x20, 0x08, 0x00, 0x40, 0x7E, 0x36, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, + 0x61, 0x36, 0x00, 0x00, 0x40, 0x08, 0x00, 0x40, 0x78, 0x08, 0x00, 0x20, 0xF0, 0xB5, 0x21, 0x4B, + 0x85, 0xB0, 0x1B, 0x7D, 0x0C, 0x25, 0x01, 0x93, 0x1F, 0x4F, 0x18, 0xE0, 0x15, 0x22, 0x6A, 0x43, + 0x69, 0x01, 0x13, 0x24, 0x02, 0x91, 0x03, 0x92, 0x02, 0x9B, 0x01, 0x3C, 0xE4, 0xB2, 0x1E, 0x19, + 0xB6, 0x00, 0xF0, 0x59, 0x01, 0x99, 0x00, 0xF0, 0xDB, 0xFC, 0x03, 0x99, 0x00, 0x04, 0x0B, 0x19, + 0x16, 0x49, 0x5B, 0x00, 0x00, 0x22, 0xF0, 0x51, 0x5A, 0x52, 0x94, 0x42, 0xEC, 0xD1, 0x01, 0x3D, + 0xED, 0xB2, 0xFF, 0x2D, 0xE2, 0xD1, 0x0F, 0x4C, 0x11, 0x4D, 0x26, 0x7D, 0x68, 0x68, 0x31, 0x1C, + 0x00, 0xF0, 0xC6, 0xFC, 0x64, 0x78, 0x00, 0x2C, 0x03, 0xD0, 0x0E, 0x4B, 0x5B, 0x78, 0x58, 0x43, + 0x80, 0x11, 0x00, 0x04, 0x68, 0x60, 0x31, 0x1C, 0x28, 0x68, 0x00, 0xF0, 0xB9, 0xFC, 0x00, 0x2C, + 0x03, 0xD0, 0x08, 0x4B, 0x1B, 0x78, 0x58, 0x43, 0x80, 0x11, 0x05, 0x4B, 0x00, 0x04, 0x05, 0xB0, + 0x18, 0x60, 0xF0, 0xBD, 0xC8, 0x0B, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, 0x28, 0x0D, 0x00, 0x20, + 0x78, 0x08, 0x00, 0x20, 0x7A, 0x37, 0x00, 0x00, 0xF0, 0xB5, 0xB9, 0x4B, 0x00, 0x22, 0x1A, 0x70, + 0xB8, 0x4B, 0x97, 0xB0, 0x1E, 0x78, 0x96, 0x42, 0x33, 0xD1, 0xB7, 0x4C, 0xB7, 0x4D, 0x20, 0x78, + 0x29, 0x78, 0x00, 0xF0, 0xCB, 0xFB, 0xB6, 0x4B, 0x1A, 0x1C, 0x08, 0x32, 0x3E, 0x21, 0x52, 0x5E, + 0x90, 0x42, 0x00, 0xDD, 0x8B, 0xE2, 0x48, 0x33, 0x00, 0x22, 0x9B, 0x5E, 0x98, 0x42, 0x00, 0xDA, + 0x85, 0xE2, 0xB0, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x12, 0xD0, 0x22, 0x78, 0x01, 0x32, 0xD2, 0xB2, + 0x22, 0x70, 0x52, 0xB2, 0x0A, 0x2A, 0x0B, 0xDD, 0x01, 0x22, 0x22, 0x70, 0x2A, 0x78, 0x01, 0x32, + 0xD2, 0xB2, 0x2A, 0x70, 0x52, 0xB2, 0x12, 0x2A, 0x02, 0xDD, 0xA7, 0x4A, 0x1E, 0x70, 0x16, 0x70, + 0x1A, 0x78, 0x00, 0x2A, 0x05, 0xD1, 0xA1, 0x49, 0x01, 0x22, 0x0A, 0x70, 0x9E, 0x49, 0x1A, 0x70, + 0x0A, 0x70, 0x00, 0x21, 0x34, 0x22, 0xA1, 0x48, 0x00, 0xF0, 0x50, 0xFD, 0xA0, 0x4B, 0x00, 0x24, + 0x1C, 0x80, 0xA0, 0x4B, 0x7F, 0x22, 0x9A, 0x70, 0x1A, 0x70, 0xDC, 0x70, 0x5C, 0x70, 0x21, 0x1C, + 0x40, 0x22, 0x9D, 0x48, 0x00, 0xF0, 0x42, 0xFD, 0x18, 0x22, 0x9C, 0x48, 0x21, 0x1C, 0x00, 0xF0, + 0x3D, 0xFD, 0x9B, 0x4B, 0x9B, 0x4D, 0x1F, 0x68, 0x91, 0x48, 0x9B, 0x4E, 0x0C, 0x22, 0x01, 0x3A, + 0xD2, 0xB2, 0x53, 0x1C, 0x5B, 0x00, 0x5C, 0x5B, 0x01, 0x7A, 0x0C, 0x41, 0x01, 0x94, 0x00, 0x24, + 0x5C, 0x53, 0x43, 0x78, 0x00, 0x2B, 0x08, 0xD0, 0x15, 0x23, 0x53, 0x43, 0xF3, 0x18, 0x01, 0x99, + 0xDB, 0x7C, 0x59, 0x43, 0x79, 0x43, 0x09, 0x13, 0x01, 0x91, 0x51, 0x00, 0x6C, 0x46, 0x8C, 0x46, + 0x8E, 0x4B, 0xA1, 0x88, 0x64, 0x46, 0xE1, 0x52, 0x00, 0x2A, 0xE0, 0xD1, 0x88, 0x49, 0x09, 0x68, + 0x13, 0x91, 0x8B, 0x49, 0x09, 0x78, 0x14, 0x91, 0x8A, 0x49, 0x08, 0x78, 0x7F, 0x49, 0x0C, 0x68, + 0xCE, 0x69, 0x0E, 0x94, 0x7E, 0x4C, 0x8F, 0x68, 0x24, 0x88, 0x0D, 0x96, 0x04, 0x94, 0x7D, 0x4C, + 0x06, 0x97, 0x66, 0x78, 0xCD, 0x6A, 0x0B, 0x96, 0x27, 0x78, 0x08, 0x97, 0xE6, 0x78, 0x0F, 0x6A, + 0x09, 0x96, 0xA4, 0x78, 0x0E, 0x6B, 0x0A, 0x94, 0x4C, 0x68, 0x07, 0x97, 0x0C, 0x94, 0x02, 0x96, + 0xC9, 0x68, 0x01, 0x92, 0x0F, 0x91, 0x0C, 0x21, 0x06, 0xE1, 0x01, 0x3A, 0xD2, 0xB2, 0x7A, 0x4F, + 0x53, 0x01, 0xDF, 0x19, 0x6A, 0x4C, 0x10, 0x9B, 0x03, 0x97, 0xD8, 0x5B, 0x23, 0x7A, 0x18, 0x41, + 0x03, 0x1C, 0x60, 0x78, 0x00, 0x28, 0x07, 0xD0, 0x11, 0x9E, 0x6F, 0x48, 0xB4, 0x18, 0x20, 0x5C, + 0x13, 0x9F, 0x43, 0x43, 0x7B, 0x43, 0x1B, 0x13, 0x6C, 0x4E, 0x48, 0x00, 0x84, 0x5F, 0x6B, 0x4F, + 0xC3, 0x53, 0x1B, 0x19, 0x5B, 0x10, 0x48, 0x01, 0x12, 0x93, 0x80, 0x18, 0x6B, 0x4B, 0x80, 0x00, + 0xC3, 0x58, 0x10, 0x20, 0x1B, 0x0C, 0x05, 0x93, 0x14, 0x9B, 0x00, 0x2B, 0x00, 0xD0, 0x0A, 0x20, + 0x12, 0x9C, 0x46, 0xB2, 0x74, 0x43, 0x11, 0x9F, 0x15, 0x94, 0x65, 0x4B, 0xBC, 0x18, 0x64, 0x00, + 0xE3, 0x5E, 0x15, 0x9F, 0x9C, 0x46, 0x05, 0x9B, 0x9C, 0x44, 0x10, 0x23, 0x9B, 0x1B, 0x66, 0x46, + 0x73, 0x43, 0x05, 0x9E, 0xFB, 0x18, 0x1B, 0x11, 0x5D, 0x4F, 0x9B, 0x1B, 0xE3, 0x53, 0x57, 0xD4, + 0x4B, 0x4C, 0x15, 0x26, 0xA6, 0x57, 0xB3, 0x42, 0x03, 0xDB, 0x0E, 0x9F, 0x9E, 0x1B, 0xBF, 0x19, + 0x0E, 0x97, 0x1C, 0x1C, 0x0A, 0x3C, 0x15, 0x94, 0x09, 0x2B, 0x00, 0xDD, 0x2D, 0x19, 0x09, 0x26, + 0x34, 0x1C, 0x15, 0x9E, 0x00, 0x27, 0xB4, 0x42, 0x7F, 0x41, 0xBC, 0x46, 0x0D, 0x9F, 0x1E, 0x1C, + 0x3C, 0x1C, 0x64, 0x44, 0x14, 0x3E, 0x0D, 0x94, 0x09, 0x2E, 0x03, 0xD8, 0x04, 0x9E, 0x01, 0x36, + 0xB6, 0xB2, 0x04, 0x96, 0x06, 0x9E, 0x9E, 0x42, 0x00, 0xDA, 0x06, 0x93, 0x38, 0x4F, 0x3C, 0x7E, + 0xA3, 0x42, 0x1B, 0xDB, 0x0B, 0xAE, 0x00, 0x24, 0x34, 0x57, 0x8C, 0x42, 0x01, 0xDA, 0xCF, 0xB2, + 0x0B, 0x97, 0x08, 0xAE, 0x00, 0x24, 0x34, 0x57, 0x8C, 0x42, 0x01, 0xDD, 0xCF, 0xB2, 0x08, 0x97, + 0x09, 0xAE, 0x00, 0x24, 0x34, 0x57, 0x94, 0x42, 0x01, 0xDA, 0xD7, 0xB2, 0x09, 0x97, 0x0A, 0xAE, + 0x00, 0x24, 0x34, 0x57, 0x94, 0x42, 0x01, 0xDD, 0xD7, 0xB2, 0x0A, 0x97, 0x01, 0x9C, 0x10, 0x9E, + 0xE4, 0x18, 0x03, 0x9F, 0x01, 0x94, 0x9B, 0xB2, 0x2B, 0x4C, 0xF3, 0x53, 0x56, 0x00, 0x37, 0x5B, + 0xDF, 0x19, 0x37, 0x53, 0x29, 0x4C, 0x4E, 0x00, 0x37, 0x5B, 0xDB, 0x19, 0x33, 0x53, 0x21, 0xE0, + 0x9C, 0x1C, 0x03, 0xDA, 0x07, 0x9F, 0x9E, 0x1C, 0xBF, 0x19, 0x07, 0x97, 0x1C, 0x4E, 0x16, 0x24, + 0x34, 0x57, 0xA3, 0x42, 0x03, 0xDC, 0x0C, 0x9F, 0x1C, 0x1B, 0x3F, 0x19, 0x0C, 0x97, 0x1C, 0x1C, + 0x09, 0x34, 0x04, 0xDA, 0x02, 0x9E, 0x1C, 0x1C, 0x0A, 0x34, 0x36, 0x19, 0x02, 0x96, 0x0F, 0x9F, + 0x9F, 0x42, 0x00, 0xDD, 0x0F, 0x93, 0x01, 0x9C, 0x10, 0x9E, 0x03, 0x9F, 0xE4, 0x1A, 0x00, 0x23, + 0x01, 0x94, 0xF3, 0x53, 0x11, 0x9B, 0x05, 0x9F, 0x9C, 0x18, 0x1D, 0x4B, 0x64, 0x00, 0xE4, 0x5E, + 0x12, 0x9B, 0x3C, 0x1B, 0xE4, 0x1A, 0x0D, 0x4B, 0x28, 0x27, 0xDE, 0x5F, 0xA6, 0x42, 0x00, 0xDA, + 0x1C, 0x85, 0x2A, 0x27, 0xDE, 0x5F, 0xA6, 0x42, 0x33, 0xDD, 0x5C, 0x85, 0x31, 0xE0, 0xC0, 0x46, + 0x98, 0x07, 0x00, 0x20, 0x71, 0x07, 0x00, 0x20, 0x9A, 0x07, 0x00, 0x20, 0x99, 0x07, 0x00, 0x20, + 0xC8, 0x0B, 0x00, 0x20, 0xBC, 0x09, 0x00, 0x20, 0x60, 0x11, 0x00, 0x20, 0xAC, 0x07, 0x00, 0x20, + 0xAA, 0x07, 0x00, 0x20, 0x22, 0x0F, 0x00, 0x20, 0x6A, 0x0F, 0x00, 0x20, 0x80, 0x0A, 0x00, 0x20, + 0x34, 0x0A, 0x00, 0x20, 0x80, 0x0A, 0x00, 0x40, 0x7E, 0x36, 0x00, 0x00, 0xEC, 0x10, 0x00, 0x20, + 0x76, 0x07, 0x00, 0x20, 0x35, 0x06, 0x00, 0x20, 0x20, 0x08, 0x00, 0x40, 0x18, 0x00, 0x00, 0x20, + 0x28, 0x0D, 0x00, 0x20, 0x4B, 0x1C, 0x5B, 0x00, 0x10, 0x93, 0x15, 0x23, 0x4B, 0x43, 0x13, 0x22, + 0x11, 0x93, 0x00, 0x2A, 0x00, 0xD0, 0xF8, 0xE6, 0x01, 0x39, 0xC9, 0xB2, 0xFF, 0x29, 0xF1, 0xD1, + 0x92, 0x4B, 0x6F, 0x46, 0x18, 0x70, 0x10, 0x20, 0x91, 0x4B, 0xC7, 0x5B, 0x0E, 0x9C, 0x0D, 0x9E, + 0x90, 0x4A, 0x1C, 0x60, 0x17, 0x80, 0xDE, 0x61, 0x0B, 0xA9, 0x08, 0xAC, 0x09, 0xAE, 0x0A, 0xAF, + 0x8D, 0x4A, 0x06, 0x98, 0x09, 0x78, 0x24, 0x78, 0x36, 0x78, 0x3F, 0x78, 0x98, 0x60, 0x51, 0x70, + 0x14, 0x70, 0x07, 0x98, 0x0F, 0x9C, 0xD6, 0x70, 0x97, 0x70, 0x0C, 0x99, 0x02, 0x9A, 0x18, 0x62, + 0xDC, 0x60, 0xDD, 0x62, 0x59, 0x60, 0x1A, 0x63, 0x84, 0x4B, 0x85, 0x4C, 0x1B, 0x78, 0x85, 0x48, + 0x00, 0x2B, 0x7A, 0xD1, 0x84, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x76, 0xD0, 0x83, 0x4B, 0x19, 0x78, + 0x00, 0x29, 0x72, 0xD1, 0x24, 0x78, 0xAD, 0x18, 0x63, 0xB2, 0x9B, 0x00, 0xC5, 0x50, 0xE5, 0xB2, + 0xAA, 0x1D, 0xD2, 0xB2, 0x06, 0x23, 0x01, 0x3B, 0xDB, 0xB2, 0xEE, 0x1A, 0xF6, 0xB2, 0xB6, 0x00, + 0x36, 0x58, 0x89, 0x19, 0x16, 0x1C, 0x0B, 0x2A, 0x01, 0xD9, 0x0C, 0x3E, 0xF6, 0xB2, 0xB6, 0x00, + 0x86, 0x59, 0x01, 0x3A, 0x89, 0x1B, 0xD2, 0xB2, 0x00, 0x2B, 0xEC, 0xD1, 0x01, 0x34, 0x70, 0x4A, + 0xE4, 0xB2, 0x14, 0x70, 0x64, 0xB2, 0x0B, 0x2C, 0x00, 0xDD, 0x13, 0x70, 0x70, 0x4E, 0x71, 0x4B, + 0x89, 0x19, 0x99, 0x42, 0x02, 0xD8, 0x70, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x64, 0x4A, 0x28, 0x27, + 0xD1, 0x5F, 0x2A, 0x20, 0x13, 0x5E, 0xCB, 0x1A, 0x28, 0x2B, 0x06, 0xDC, 0x6B, 0x4B, 0x1A, 0x78, + 0x51, 0xB2, 0x01, 0x32, 0x02, 0x29, 0x04, 0xDD, 0x04, 0xE0, 0x2C, 0x2B, 0x02, 0xDD, 0x67, 0x4B, + 0x00, 0x22, 0x1A, 0x70, 0x64, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x38, 0xD0, 0x63, 0x4A, 0x12, 0x78, + 0x00, 0x2A, 0x01, 0xD1, 0x1A, 0x70, 0x32, 0xE0, 0x0C, 0x23, 0x03, 0x2A, 0x14, 0xD0, 0x2E, 0xE0, + 0x15, 0x25, 0x5D, 0x43, 0x13, 0x22, 0x5E, 0x01, 0x01, 0x3A, 0xD2, 0xB2, 0xAF, 0x18, 0x5C, 0x4C, + 0x7F, 0x00, 0x3F, 0x5F, 0xB0, 0x18, 0x80, 0x00, 0x3F, 0x04, 0xBC, 0x46, 0x47, 0x58, 0x67, 0x44, + 0x47, 0x50, 0x00, 0x2A, 0xF0, 0xD1, 0x00, 0xE0, 0x56, 0x49, 0x01, 0x3B, 0xDB, 0xB2, 0xFF, 0x2B, + 0xE6, 0xD1, 0x4C, 0x4B, 0x00, 0x22, 0x19, 0x1C, 0x30, 0x31, 0x04, 0xC3, 0x8B, 0x42, 0xFC, 0xD1, + 0x4D, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0x01, 0x20, 0x7D, 0xE0, 0x30, 0x22, 0x00, 0x21, 0x00, 0xF0, + 0x3D, 0xFB, 0x4A, 0x4A, 0x00, 0x23, 0x13, 0x70, 0x47, 0x4A, 0x23, 0x70, 0x13, 0x70, 0x3C, 0x4C, + 0x49, 0x4B, 0xA2, 0x68, 0x22, 0x61, 0xD9, 0x7A, 0x8A, 0x42, 0x04, 0xDC, 0x0C, 0x26, 0x9B, 0x5F, + 0xE2, 0x68, 0x9A, 0x42, 0x02, 0xDA, 0x45, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0xE4, 0x21, 0x01, 0x98, + 0x00, 0xF0, 0x84, 0xFA, 0x34, 0x4B, 0x60, 0x62, 0x01, 0x22, 0x9A, 0x56, 0x1B, 0x78, 0xD0, 0x17, + 0x5B, 0xB2, 0xD9, 0x0F, 0x9A, 0x42, 0x48, 0x41, 0x3D, 0x4B, 0x3B, 0x4E, 0x18, 0x70, 0x3D, 0x4B, + 0x00, 0x22, 0x37, 0x1C, 0x1A, 0x70, 0x02, 0x24, 0x4A, 0x37, 0x3B, 0x4B, 0x01, 0x3C, 0xE4, 0xB2, + 0x19, 0x5D, 0x3A, 0x48, 0x01, 0x31, 0x4B, 0x01, 0x62, 0x1C, 0x1B, 0x18, 0x52, 0x00, 0xD5, 0x5A, + 0x33, 0x7A, 0x62, 0x00, 0x1D, 0x41, 0x36, 0x4B, 0xD5, 0x52, 0x36, 0x4B, 0x1B, 0x78, 0x00, 0x2B, + 0x13, 0xD1, 0xC9, 0xB2, 0x20, 0x1C, 0x00, 0xF0, 0x41, 0xF9, 0x00, 0x21, 0x7B, 0x5E, 0x98, 0x42, + 0x05, 0xDC, 0x33, 0x1C, 0x4C, 0x33, 0x00, 0x22, 0x9B, 0x5E, 0x98, 0x42, 0x05, 0xDA, 0x2E, 0x4B, + 0x01, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x00, 0x20, 0x25, 0xE0, 0x23, 0x4B, 0x5A, 0x78, 0x00, 0x2A, + 0x03, 0xD0, 0x2A, 0x4A, 0x12, 0x5D, 0x55, 0x43, 0xAD, 0x11, 0x29, 0x4A, 0xA1, 0x00, 0x8A, 0x58, + 0x5B, 0x7E, 0x12, 0x0C, 0xAD, 0x1A, 0x9D, 0x42, 0x02, 0xDB, 0x1D, 0x4B, 0x01, 0x22, 0x1A, 0x70, + 0x24, 0x4B, 0x62, 0x00, 0xD5, 0x52, 0x1B, 0x4B, 0x1A, 0x78, 0x95, 0x42, 0x00, 0xDA, 0x15, 0x1C, + 0xED, 0xB2, 0x1D, 0x70, 0x00, 0x2C, 0xB8, 0xD1, 0x13, 0x4B, 0x01, 0x20, 0xDB, 0x7A, 0xAB, 0x42, + 0x01, 0xD2, 0x12, 0x4B, 0x18, 0x70, 0x17, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x35, 0x06, 0x00, 0x20, + 0xAC, 0x07, 0x00, 0x20, 0xAA, 0x07, 0x00, 0x20, 0x22, 0x0F, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, + 0x26, 0x0F, 0x00, 0x20, 0x30, 0x11, 0x00, 0x20, 0x40, 0x06, 0x00, 0x20, 0xA2, 0x07, 0x00, 0x20, + 0xDB, 0x05, 0x00, 0x00, 0xAE, 0x04, 0x00, 0x00, 0x68, 0x0F, 0x00, 0x20, 0x30, 0x0A, 0x00, 0x20, + 0x28, 0x0D, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0x98, 0x07, 0x00, 0x20, + 0x88, 0x08, 0x00, 0x20, 0xAC, 0x09, 0x00, 0x20, 0x61, 0x36, 0x00, 0x00, 0x20, 0x08, 0x00, 0x40, + 0xEC, 0x10, 0x00, 0x20, 0x71, 0x07, 0x00, 0x20, 0x18, 0x07, 0x00, 0x20, 0x7A, 0x37, 0x00, 0x00, + 0x78, 0x08, 0x00, 0x20, 0xBE, 0x0B, 0x00, 0x20, 0xF0, 0xB5, 0x0C, 0x4B, 0x0C, 0x4D, 0x0D, 0x4C, + 0x0D, 0x49, 0x1E, 0x7A, 0x0C, 0x23, 0x01, 0x3B, 0xDB, 0xB2, 0x5A, 0x1C, 0x52, 0x00, 0x52, 0x5B, + 0x32, 0x41, 0x47, 0x1C, 0x02, 0xD1, 0x5F, 0x00, 0x7A, 0x52, 0x03, 0xE0, 0x5F, 0x01, 0x3F, 0x18, + 0xBF, 0x00, 0x3A, 0x51, 0x00, 0x2B, 0xEE, 0xD1, 0xF0, 0xBD, 0xC0, 0x46, 0xC8, 0x0B, 0x00, 0x20, + 0x00, 0x08, 0x00, 0x40, 0x18, 0x00, 0x00, 0x20, 0x16, 0x11, 0x00, 0x20, 0xF0, 0xB5, 0x87, 0xB0, + 0x04, 0x91, 0x29, 0x4C, 0x00, 0x21, 0x05, 0x92, 0x0D, 0x1C, 0x0C, 0x23, 0x00, 0x90, 0x00, 0x98, + 0x01, 0x3B, 0xDB, 0xB2, 0x01, 0x30, 0x06, 0xD0, 0x00, 0x9E, 0x5A, 0x01, 0x92, 0x19, 0x23, 0x4F, + 0x92, 0x00, 0xBA, 0x5A, 0x02, 0xE0, 0x22, 0x48, 0x5A, 0x00, 0x12, 0x5A, 0x5E, 0x1C, 0x21, 0x4F, + 0x03, 0x96, 0x76, 0x00, 0xF6, 0x5B, 0x20, 0x48, 0xB4, 0x46, 0x06, 0x7A, 0x67, 0x46, 0x37, 0x41, + 0x58, 0x00, 0x12, 0xB2, 0x1D, 0x4E, 0xBA, 0x1A, 0x01, 0x97, 0x07, 0x1C, 0x02, 0x90, 0xBA, 0x53, + 0x00, 0x2A, 0x01, 0xDA, 0x89, 0x1A, 0x00, 0xE0, 0x89, 0x18, 0x00, 0x9E, 0x01, 0x36, 0x07, 0xD0, + 0x00, 0x98, 0x5F, 0x01, 0x3F, 0x18, 0x11, 0x4E, 0x01, 0x98, 0xBF, 0x00, 0xB8, 0x51, 0x0C, 0xE0, + 0x0F, 0x4E, 0x6F, 0x46, 0x02, 0x98, 0xB4, 0x46, 0xBE, 0x88, 0x67, 0x46, 0x3E, 0x52, 0x03, 0x9F, + 0x0C, 0x4E, 0x7F, 0x00, 0x00, 0x20, 0x03, 0x97, 0xF0, 0x53, 0x94, 0x42, 0x00, 0xDD, 0x14, 0x1C, + 0x95, 0x42, 0x00, 0xDA, 0x15, 0x1C, 0x00, 0x2B, 0xB9, 0xD1, 0x05, 0x9E, 0x04, 0x9B, 0x2C, 0x1B, + 0x07, 0xB0, 0x19, 0x80, 0x34, 0x80, 0xF0, 0xBD, 0xFF, 0xFF, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, + 0x16, 0x11, 0x00, 0x20, 0x00, 0x08, 0x00, 0x40, 0xC8, 0x0B, 0x00, 0x20, 0xEC, 0x10, 0x00, 0x20, + 0xF7, 0xB5, 0x1E, 0x4B, 0x1E, 0x4A, 0x3F, 0x33, 0x1B, 0x78, 0x51, 0x6A, 0x99, 0x40, 0x00, 0x29, + 0x00, 0xDC, 0x01, 0x21, 0x1B, 0x4B, 0x00, 0x22, 0x9A, 0x56, 0x1B, 0x4B, 0x92, 0x00, 0xD3, 0x58, + 0x1A, 0x48, 0x59, 0x43, 0x0C, 0x23, 0x14, 0xE0, 0x15, 0x25, 0x5D, 0x43, 0x13, 0x22, 0x5E, 0x01, + 0x01, 0x95, 0x01, 0x9D, 0x01, 0x3A, 0xD2, 0xB2, 0xAF, 0x18, 0x15, 0x4D, 0x7F, 0x00, 0x7D, 0x5F, + 0xB4, 0x18, 0x4D, 0x43, 0xA4, 0x00, 0x27, 0x58, 0xAC, 0x46, 0x67, 0x44, 0x27, 0x50, 0x00, 0x2A, + 0xEF, 0xD1, 0x01, 0x3B, 0xDB, 0xB2, 0xFF, 0x2B, 0xE6, 0xD1, 0x0E, 0x4A, 0x0E, 0x4B, 0x02, 0x24, + 0x10, 0x5F, 0x5C, 0x68, 0x48, 0x43, 0x00, 0x19, 0x58, 0x60, 0x00, 0x25, 0x52, 0x5F, 0x01, 0x20, + 0x51, 0x43, 0x1A, 0x68, 0x89, 0x18, 0x19, 0x60, 0xFE, 0xBD, 0xC0, 0x46, 0xC8, 0x0B, 0x00, 0x20, + 0xAC, 0x07, 0x00, 0x20, 0x32, 0x06, 0x00, 0x20, 0x48, 0x08, 0x00, 0x20, 0x18, 0x00, 0x00, 0x20, + 0x28, 0x0D, 0x00, 0x20, 0xBE, 0x0B, 0x00, 0x20, 0x78, 0x08, 0x00, 0x20, 0x07, 0x4B, 0x49, 0x01, + 0xC9, 0x18, 0x43, 0x1C, 0x5B, 0x00, 0x06, 0x4A, 0x59, 0x5A, 0x06, 0x4B, 0x40, 0x00, 0x12, 0x7A, + 0xC3, 0x5A, 0x08, 0x1C, 0x10, 0x41, 0x18, 0x1A, 0x70, 0x47, 0xC0, 0x46, 0x20, 0x08, 0x00, 0x40, + 0xC8, 0x0B, 0x00, 0x20, 0x16, 0x11, 0x00, 0x20, 0x08, 0xB5, 0x05, 0x49, 0x50, 0x22, 0x05, 0x48, + 0x00, 0xF0, 0x5E, 0xF9, 0x04, 0x48, 0x05, 0x49, 0x28, 0x22, 0x00, 0xF0, 0x59, 0xF9, 0x08, 0xBD, + 0x98, 0x35, 0x00, 0x00, 0xC8, 0x0B, 0x00, 0x20, 0x58, 0x0A, 0x00, 0x20, 0x70, 0x35, 0x00, 0x00, + 0x08, 0xB5, 0x04, 0x49, 0x04, 0x4B, 0x41, 0x43, 0x04, 0x48, 0xC9, 0x18, 0x00, 0xF0, 0xE6, 0xF8, + 0xC0, 0xB2, 0x08, 0xBD, 0x44, 0xFE, 0xFF, 0xFF, 0xFE, 0x24, 0x02, 0x00, 0x40, 0x42, 0x0F, 0x00, + 0x10, 0xB5, 0x1A, 0x4B, 0x00, 0x22, 0xDA, 0x70, 0x01, 0x22, 0x1A, 0x71, 0xB0, 0x22, 0x9A, 0x70, + 0x10, 0x22, 0x1A, 0x70, 0x0C, 0x22, 0x5A, 0x71, 0x02, 0x22, 0x9A, 0x71, 0x09, 0x22, 0xDA, 0x71, + 0x13, 0x4A, 0x12, 0x78, 0xAA, 0x2A, 0x1F, 0xD1, 0x12, 0x49, 0x13, 0x4A, 0x00, 0x24, 0x0C, 0x57, + 0x12, 0x49, 0x12, 0x78, 0x09, 0x78, 0x50, 0xB2, 0x49, 0xB2, 0x04, 0x19, 0x64, 0x18, 0x10, 0x49, + 0x09, 0x78, 0x49, 0xB2, 0x8C, 0x42, 0x0F, 0xD1, 0x0E, 0x49, 0x9C, 0x78, 0x41, 0x31, 0x09, 0x78, + 0x20, 0x18, 0x40, 0x18, 0xFF, 0x28, 0x03, 0xDD, 0xC9, 0x43, 0xC9, 0xB2, 0x99, 0x70, 0x03, 0xE0, + 0x99, 0x78, 0x8A, 0x18, 0xD2, 0xB2, 0x9A, 0x70, 0x10, 0xBD, 0xC0, 0x46, 0x98, 0x0A, 0x00, 0x20, + 0xA0, 0x00, 0xE0, 0x00, 0xA2, 0x00, 0xE0, 0x00, 0xA1, 0x00, 0xE0, 0x00, 0xA3, 0x00, 0xE0, 0x00, + 0xA4, 0x00, 0xE0, 0x00, 0xC8, 0x0B, 0x00, 0x20, 0x70, 0xB5, 0x17, 0x4D, 0x6B, 0x79, 0xDA, 0x08, + 0x01, 0xD0, 0x08, 0x3B, 0xDB, 0xB2, 0x00, 0x26, 0x07, 0x2B, 0x03, 0xD0, 0x02, 0x22, 0x9A, 0x42, + 0x76, 0x41, 0x96, 0x1B, 0x2B, 0x78, 0x11, 0x4C, 0x9A, 0x00, 0xD3, 0x18, 0x33, 0x41, 0xDB, 0xB2, + 0x23, 0x60, 0x2B, 0x78, 0xFA, 0x20, 0x80, 0x00, 0x58, 0x43, 0x0D, 0x4B, 0x01, 0x36, 0x99, 0x88, + 0xB1, 0x40, 0x00, 0xF0, 0x7B, 0xF8, 0xC1, 0xB2, 0x61, 0x60, 0x2B, 0x78, 0x2D, 0x20, 0xB1, 0x40, + 0x58, 0x43, 0x00, 0xF0, 0x73, 0xF8, 0x07, 0x4B, 0xF2, 0x22, 0x1A, 0x80, 0x06, 0x4B, 0xC0, 0xB2, + 0x40, 0x22, 0xA0, 0x60, 0x1A, 0x60, 0x70, 0xBD, 0x98, 0x0A, 0x00, 0x20, 0x60, 0x08, 0x00, 0x20, + 0xC8, 0x0B, 0x00, 0x20, 0xB2, 0x0B, 0x00, 0x20, 0x24, 0x0A, 0x00, 0x20, 0x00, 0xB5, 0x07, 0x4A, + 0x13, 0x68, 0x03, 0x60, 0x03, 0x23, 0x08, 0x1C, 0x98, 0x43, 0x03, 0x1C, 0x88, 0x42, 0x00, 0xD0, + 0x04, 0x33, 0x11, 0x68, 0xCB, 0x18, 0x13, 0x60, 0x00, 0xBD, 0xC0, 0x46, 0x2C, 0x06, 0x00, 0x20, + 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, 0x70, 0xB5, 0x83, 0x07, + 0x42, 0xD0, 0x00, 0x2A, 0x3F, 0xD0, 0x01, 0x3A, 0xCE, 0xB2, 0x03, 0x1C, 0x03, 0x25, 0x03, 0xE0, + 0x54, 0x1E, 0x00, 0x2A, 0x37, 0xD0, 0x22, 0x1C, 0x1E, 0x70, 0x01, 0x33, 0x2B, 0x42, 0xF7, 0xD1, + 0x03, 0x2A, 0x28, 0xD9, 0xFF, 0x25, 0x0D, 0x40, 0x2C, 0x02, 0x25, 0x43, 0x2C, 0x04, 0x25, 0x43, + 0x0F, 0x2A, 0x13, 0xD9, 0x1C, 0x1C, 0x16, 0x1C, 0x10, 0x3E, 0x25, 0x60, 0x65, 0x60, 0xA5, 0x60, + 0xE5, 0x60, 0x10, 0x34, 0x0F, 0x2E, 0xF7, 0xD8, 0x14, 0x1C, 0x10, 0x3C, 0x24, 0x09, 0x01, 0x34, + 0x24, 0x01, 0x1B, 0x19, 0x0F, 0x24, 0x22, 0x40, 0x03, 0x2A, 0x0C, 0xD9, 0x1E, 0x1C, 0x14, 0x1C, + 0x04, 0x3C, 0x20, 0xC6, 0x03, 0x2C, 0xFB, 0xD8, 0x14, 0x1F, 0xA4, 0x08, 0x01, 0x34, 0xA4, 0x00, + 0x03, 0x25, 0x2A, 0x40, 0x1B, 0x19, 0x00, 0x2A, 0x05, 0xD0, 0xC9, 0xB2, 0x01, 0x3A, 0x19, 0x70, + 0x01, 0x33, 0x00, 0x2A, 0xFA, 0xD1, 0x70, 0xBD, 0x03, 0x1C, 0xC9, 0xE7, 0xFA, 0xFC, 0xFB, 0xFD, + 0x02, 0x01, 0x03, 0x02, 0x07, 0x02, 0x01, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0xFF, 0xFF, 0xFF, + 0xFB, 0xFB, 0xFE, 0xFA, 0xFC, 0x01, 0xFB, 0xFE, 0xFA, 0x01, 0xFF, 0x04, 0x04, 0x04, 0xFB, 0xFC, + 0xFB, 0xFC, 0x00, 0xFD, 0x00, 0xFE, 0x02, 0x03, 0x00, 0x02, 0x07, 0x07, 0x06, 0x09, 0x00, 0x0C, + 0x06, 0x04, 0x03, 0x00, 0xFF, 0x01, 0x00, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0x43, 0x53, 0x30, 0x32, 0x5F, 0x47, 0x46, 0x31, 0x0A, 0x00, 0x01, 0x02, 0x00, 0x0B, 0x01, 0x01, + 0x13, 0x00, 0x00, 0x00, 0x78, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x84, 0x03, 0xAC, 0x0D, + 0x1E, 0x00, 0x0A, 0x07, 0x0D, 0x01, 0x01, 0x00, 0x00, 0x01, 0x5A, 0x1E, 0x90, 0x01, 0x12, 0x10, + 0x02, 0x05, 0x14, 0x0A, 0xF9, 0xFF, 0x00, 0x03, 0x00, 0x01, 0x00, 0x6E, 0x05, 0x07, 0xF9, 0xFF, + 0x07, 0x06, 0x9C, 0x03, 0x52, 0x03, 0x26, 0x02, 0x5E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0xF4, 0x01, 0x00, 0x00, 0x19, 0x00, 0x0F, 0x00, 0x16, 0x0C, 0xE8, 0x03, 0x23, 0x00, 0x02, 0x02, + 0x19, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0C, 0x07, 0xFF, 0x7F, 0x00, 0x07, 0x42, 0x04, + 0x2C, 0x00, 0xA8, 0x04, 0x1B, 0x01, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x1E, 0x4A, 0x01, 0x24, 0x10, + 0x04, 0x06, 0x14, 0x07, 0xF9, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5A, 0x05, 0x0A, 0xFB, 0xFF, + 0x08, 0x06, 0x9C, 0x03, 0x52, 0x03, 0x26, 0x02, 0x5E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x19, 0x00, 0x16, 0x0C, 0xE8, 0x03, 0x23, 0x00, 0x02, 0x01, + 0x1E, 0x00, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0C, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0x7F, + 0x00, 0x80, 0xFF, 0x7F, 0x00, 0x80, 0x23, 0x00, 0x0A, 0x06, 0x09, 0x05, 0x08, 0x04, 0x07, 0x03, + 0x0B, 0x02, 0x0C, 0x01, 0x0D, 0x00, 0x10, 0x11, 0x0F, 0x12, 0x0E, 0x13, 0x15, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x05, 0x04, 0x07, 0x06, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0x00, + 0x00, 0x14, 0x14, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0x60, 0x2F, + 0x3A, 0x32, 0x4D, 0x38, 0x4D, 0x39, 0x4D, 0x3E, 0x4A, 0x3D, 0x47, 0x38, 0x42, 0x31, 0x49, 0x37, + 0x45, 0x3D, 0x00, 0x3D, 0x25, 0x26, 0x28, 0x28, 0x2B, 0x2A, 0x2D, 0x2D, 0x2F, 0x2E, 0x2B, 0x24, + 0x25, 0x24, 0x27, 0x2C, 0x2C, 0x2C, 0x41, 0x00, 0x39, 0x25, 0x28, 0x27, 0x2A, 0x2D, 0x2F, 0x2F, + 0x31, 0x32, 0x31, 0x2D, 0x24, 0x27, 0x27, 0x28, 0x2E, 0x2F, 0x2E, 0x49, 0x00, 0x3E, 0x24, 0x26, + 0x28, 0x2B, 0x2F, 0x32, 0x31, 0x33, 0x35, 0x33, 0x2F, 0x24, 0x27, 0x28, 0x29, 0x2D, 0x2E, 0x2E, + 0x49, 0x00, 0x3E, 0x25, 0x26, 0x2A, 0x2A, 0x31, 0x31, 0x35, 0x34, 0x35, 0x35, 0x30, 0x25, 0x28, + 0x28, 0x2B, 0x2F, 0x31, 0x2E, 0x4D, 0x00, 0x3E, 0x25, 0x28, 0x2C, 0x2F, 0x32, 0x31, 0x33, 0x33, + 0x37, 0x33, 0x32, 0x26, 0x2B, 0x28, 0x2E, 0x2E, 0x2E, 0x2A, 0x43, 0x00, 0x41, 0x27, 0x29, 0x2C, + 0x30, 0x32, 0x35, 0x35, 0x39, 0x37, 0x37, 0x32, 0x29, 0x29, 0x2A, 0x2B, 0x33, 0x2E, 0x27, 0x4D, + 0x00, 0x47, 0x27, 0x28, 0x2B, 0x2A, 0x31, 0x31, 0x34, 0x37, 0x37, 0x32, 0x31, 0x26, 0x29, 0x28, + 0x2C, 0x2E, 0x31, 0x2E, 0x4D, 0x00, 0x43, 0x26, 0x27, 0x2B, 0x2B, 0x32, 0x30, 0x32, 0x35, 0x35, + 0x33, 0x2F, 0x24, 0x28, 0x26, 0x2C, 0x2B, 0x30, 0x2F, 0x4D, 0x00, 0x42, 0x26, 0x26, 0x28, 0x29, + 0x2D, 0x2C, 0x2F, 0x30, 0x32, 0x31, 0x2D, 0x25, 0x26, 0x24, 0x26, 0x2B, 0x2B, 0x2C, 0x44, 0x00, + 0x43, 0x25, 0x25, 0x26, 0x28, 0x2F, 0x2D, 0x2D, 0x30, 0x2E, 0x2E, 0x2B, 0x21, 0x27, 0x24, 0x27, + 0x2A, 0x2B, 0x2F, 0x44, 0x00, 0x58, 0x3E, 0x37, 0x4A, 0x3D, 0x57, 0x3E, 0x53, 0x44, 0x57, 0x42, + 0x53, 0x33, 0x4A, 0x33, 0x47, 0x3D, 0x4E, 0x3F, 0x5B, 0x00, 0x3C, 0x3C, 0x00, 0x00, 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, + 0x4D, 0x49, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x10, 0xB5, 0x13, 0x4A, + 0x13, 0x4B, 0x14, 0x4C, 0x1A, 0x60, 0x14, 0x4B, 0x14, 0x4A, 0x20, 0x1C, 0x1A, 0x60, 0x50, 0x21, + 0xFF, 0xF7, 0x5C, 0xFD, 0x50, 0x22, 0x20, 0x68, 0x00, 0x21, 0xFF, 0xF7, 0x57, 0xFE, 0x10, 0x48, + 0x1E, 0x21, 0xFF, 0xF7, 0x53, 0xFD, 0x0F, 0x4A, 0x0F, 0x4B, 0x1A, 0x60, 0x0F, 0x4A, 0x10, 0x4B, + 0x1A, 0x60, 0x10, 0x4A, 0x10, 0x4B, 0x1A, 0x60, 0x10, 0x4A, 0x11, 0x4B, 0x1A, 0x60, 0x11, 0x4A, + 0x11, 0x4B, 0x1A, 0x60, 0x11, 0x4A, 0x12, 0x4B, 0x1A, 0x60, 0x10, 0xBD, 0x65, 0x4B, 0x00, 0x00, + 0x54, 0x08, 0x00, 0x20, 0x24, 0x07, 0x00, 0x20, 0x50, 0x08, 0x00, 0x20, 0xC5, 0x3D, 0x00, 0x00, + 0x1C, 0x0C, 0x00, 0x20, 0x95, 0x43, 0x00, 0x00, 0x14, 0x07, 0x00, 0x20, 0xA1, 0x43, 0x00, 0x00, + 0x18, 0x07, 0x00, 0x20, 0x01, 0x44, 0x00, 0x00, 0x5C, 0x08, 0x00, 0x20, 0x45, 0x47, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x20, 0xDD, 0x49, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x20, 0x21, 0x47, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x20, 0xF0, 0xB5, 0xC3, 0x4B, 0x85, 0xB0, 0x1B, 0x78, 0xC2, 0x4A, 0x00, 0x2B, + 0x1E, 0xD0, 0xC2, 0x4B, 0x1B, 0x78, 0x04, 0x2B, 0x08, 0xD8, 0xC1, 0x4B, 0x1B, 0x78, 0x28, 0x2B, + 0x1B, 0xD9, 0xC0, 0x4B, 0x9B, 0x68, 0x31, 0x2B, 0x0E, 0xDD, 0x16, 0xE0, 0x0D, 0x2B, 0x14, 0xD9, + 0xBB, 0x49, 0x09, 0x78, 0x50, 0x29, 0x03, 0xD9, 0xBA, 0x48, 0x80, 0x68, 0x45, 0x28, 0x03, 0xDD, + 0x12, 0x2B, 0x0A, 0xD9, 0x5A, 0x29, 0x08, 0xD9, 0x13, 0x68, 0x01, 0x2B, 0x05, 0xD1, 0x02, 0xE0, + 0x13, 0x68, 0x00, 0x2B, 0x01, 0xD1, 0xB4, 0x4A, 0x13, 0x70, 0xB3, 0x4B, 0x1B, 0x78, 0x00, 0x2B, + 0x05, 0xD0, 0xB2, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x01, 0xD1, 0xFE, 0xF7, 0xE7, 0xF8, 0xB0, 0x4C, + 0xB0, 0x4A, 0x23, 0x1C, 0x36, 0x33, 0x1F, 0x78, 0x23, 0x1C, 0x4E, 0x33, 0x1B, 0x78, 0x52, 0x68, + 0xE6, 0x8D, 0x53, 0x43, 0x9B, 0x11, 0x01, 0x93, 0xA3, 0x48, 0x2C, 0x25, 0x61, 0x5F, 0x02, 0x68, + 0x05, 0x23, 0x02, 0x91, 0x01, 0x3B, 0xDB, 0xB2, 0x1D, 0x1C, 0x0D, 0x35, 0xED, 0x00, 0x45, 0x19, + 0xAC, 0x88, 0x00, 0x2C, 0x24, 0xD0, 0xA4, 0x49, 0x24, 0xB2, 0xC9, 0x5C, 0x00, 0x29, 0x02, 0xD0, + 0x49, 0xB2, 0xB9, 0x42, 0x11, 0xDC, 0x02, 0x9D, 0xAC, 0x42, 0x08, 0xDB, 0x1C, 0x1C, 0x0D, 0x34, + 0x95, 0x49, 0xE4, 0x00, 0x0C, 0x19, 0x64, 0x89, 0x01, 0x9D, 0xAC, 0x42, 0x10, 0xDA, 0x1D, 0x1C, + 0x0D, 0x35, 0x91, 0x49, 0xED, 0x00, 0x4D, 0x19, 0x02, 0xE0, 0x31, 0xB2, 0x8C, 0x42, 0x07, 0xDA, + 0x00, 0x24, 0xAC, 0x80, 0x9D, 0x00, 0xAC, 0x46, 0x94, 0x4D, 0x61, 0x46, 0x4C, 0x51, 0x01, 0x3A, + 0x00, 0x2B, 0xCF, 0xD1, 0x92, 0x49, 0x05, 0x24, 0x0A, 0x60, 0x87, 0x4A, 0x13, 0x60, 0x01, 0x3C, + 0xE4, 0xB2, 0x26, 0x1C, 0x84, 0x4A, 0x0D, 0x36, 0xF6, 0x00, 0x96, 0x19, 0x02, 0x96, 0xB0, 0x88, + 0x89, 0x4D, 0x00, 0x28, 0x00, 0xD1, 0xBD, 0xE0, 0x8A, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x07, 0xD1, + 0x00, 0xB2, 0x1E, 0x38, 0x05, 0x21, 0xFF, 0xF7, 0xE9, 0xFC, 0x02, 0x9E, 0x1E, 0x30, 0xB0, 0x80, + 0x2B, 0x5D, 0x7F, 0x2B, 0x01, 0xD0, 0x01, 0x33, 0x2B, 0x55, 0x7F, 0x4B, 0x1B, 0x57, 0x02, 0x2B, + 0x73, 0xDD, 0x81, 0x4B, 0x62, 0x00, 0x9A, 0x18, 0x04, 0x27, 0xD5, 0x5F, 0x22, 0x1D, 0x52, 0x00, + 0x9B, 0x18, 0x06, 0x20, 0x1F, 0x5E, 0x70, 0x4B, 0xA2, 0x00, 0x9A, 0x18, 0x56, 0x68, 0x22, 0x1C, + 0x0E, 0x32, 0x92, 0x00, 0xD2, 0x58, 0xA8, 0x1B, 0xC3, 0x17, 0xB9, 0x1A, 0x01, 0x92, 0xC2, 0x18, + 0x5A, 0x40, 0x94, 0x46, 0xCA, 0x17, 0x8B, 0x18, 0x53, 0x40, 0x63, 0x44, 0x03, 0x91, 0x02, 0x93, + 0x19, 0x1C, 0x80, 0x2B, 0x0A, 0xDD, 0xC0, 0x01, 0xFF, 0xF7, 0xB8, 0xFC, 0x03, 0x9F, 0x02, 0x99, + 0x35, 0x18, 0xF8, 0x01, 0xFF, 0xF7, 0xB2, 0xFC, 0x01, 0x99, 0x0F, 0x18, 0x72, 0x1B, 0x01, 0x98, + 0xD3, 0x17, 0xD2, 0x18, 0x5A, 0x40, 0xC3, 0x1B, 0xD9, 0x17, 0x5B, 0x18, 0x4B, 0x40, 0xD3, 0x18, + 0x01, 0x93, 0x5F, 0x4B, 0x31, 0x1C, 0x32, 0x22, 0x9A, 0x5E, 0x28, 0x1C, 0x01, 0x9B, 0xFE, 0xF7, + 0x15, 0xFA, 0x26, 0x1C, 0x54, 0x4D, 0x02, 0x90, 0x0E, 0x36, 0x59, 0x48, 0xB6, 0x00, 0x71, 0x59, + 0x32, 0x22, 0x82, 0x5E, 0x01, 0x9B, 0x38, 0x1C, 0xFE, 0xF7, 0x08, 0xFA, 0x02, 0x9F, 0xA3, 0x00, + 0xEB, 0x18, 0x5F, 0x60, 0x23, 0x1C, 0x0D, 0x33, 0x70, 0x51, 0xDB, 0x00, 0x56, 0x4E, 0xE7, 0x1C, + 0xED, 0x18, 0xFF, 0x00, 0xB8, 0x5F, 0x04, 0x22, 0xA9, 0x5E, 0x4D, 0x4E, 0x43, 0x1A, 0x34, 0x22, + 0xB2, 0x5E, 0xDE, 0x17, 0x9B, 0x19, 0x73, 0x40, 0xFE, 0xF7, 0xF0, 0xF9, 0xA8, 0x80, 0x4E, 0x48, + 0x69, 0x89, 0xC6, 0x19, 0xF0, 0x88, 0x46, 0x4E, 0x43, 0x1A, 0xDF, 0x17, 0xDB, 0x19, 0x34, 0x22, + 0xB2, 0x5E, 0x7B, 0x40, 0xFE, 0xF7, 0xE2, 0xF9, 0x68, 0x81, 0x3B, 0x4B, 0xA0, 0x00, 0x46, 0x4A, + 0x18, 0x18, 0x40, 0x68, 0x61, 0x00, 0x51, 0x18, 0x88, 0x80, 0x20, 0x1C, 0x0E, 0x30, 0x21, 0x1D, + 0x80, 0x00, 0xC0, 0x58, 0x49, 0x00, 0x25, 0x1C, 0x51, 0x18, 0x0D, 0x35, 0xC8, 0x80, 0xED, 0x00, + 0xE1, 0x1C, 0xC9, 0x00, 0x5D, 0x19, 0x51, 0x18, 0x28, 0x1D, 0xC0, 0xC8, 0xC0, 0xC1, 0x20, 0x1C, + 0x34, 0x30, 0x80, 0x00, 0x21, 0x1C, 0x18, 0x18, 0x10, 0x31, 0x40, 0x68, 0x89, 0x00, 0x88, 0x50, + 0x31, 0x4A, 0x11, 0x57, 0x2E, 0x4A, 0x36, 0x32, 0x12, 0x78, 0x91, 0x42, 0x03, 0xDC, 0x01, 0x23, + 0x5B, 0x42, 0xAB, 0x80, 0x02, 0xE0, 0x1A, 0x68, 0x01, 0x32, 0x1A, 0x60, 0x2F, 0x4B, 0x00, 0x22, + 0x1A, 0x55, 0x61, 0xE0, 0x2E, 0x4E, 0x29, 0x57, 0x37, 0x78, 0x8C, 0x46, 0xE1, 0x1C, 0x2A, 0x4B, + 0xC9, 0x00, 0xBC, 0x45, 0x56, 0xDD, 0x5F, 0x5E, 0x00, 0x2F, 0x55, 0xD0, 0x27, 0x4F, 0x3E, 0x5D, + 0xBC, 0x46, 0x37, 0x1C, 0x01, 0x37, 0xFF, 0xB2, 0x66, 0x46, 0x01, 0x97, 0x37, 0x55, 0x1C, 0x4F, + 0x6E, 0x46, 0x36, 0x79, 0x3E, 0x37, 0x3F, 0x78, 0x76, 0xB2, 0xBE, 0x42, 0x42, 0xDC, 0x02, 0x9E, + 0x59, 0x18, 0x04, 0x36, 0xA0, 0xC9, 0xA0, 0xC6, 0x20, 0x1C, 0x21, 0x1C, 0x10, 0x30, 0x34, 0x31, + 0x80, 0x00, 0x18, 0x58, 0x89, 0x00, 0x51, 0x18, 0x48, 0x60, 0x60, 0x00, 0x18, 0x18, 0x04, 0x26, + 0x80, 0x5F, 0xA1, 0x00, 0x51, 0x18, 0x48, 0x60, 0x20, 0x1D, 0x40, 0x00, 0x21, 0x1C, 0x1B, 0x18, + 0x06, 0x27, 0xDB, 0x5F, 0x0E, 0x31, 0x89, 0x00, 0x8B, 0x50, 0x13, 0x68, 0x01, 0x33, 0x13, 0x60, + 0x22, 0xE0, 0xC0, 0x46, 0x88, 0x08, 0x00, 0x20, 0x20, 0x0C, 0x00, 0x20, 0x46, 0x08, 0x00, 0x20, + 0x47, 0x08, 0x00, 0x20, 0xAC, 0x07, 0x00, 0x20, 0x09, 0x08, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, + 0xC8, 0x0B, 0x00, 0x20, 0x6C, 0x08, 0x00, 0x20, 0xB8, 0x0B, 0x00, 0x20, 0x9C, 0x0B, 0x00, 0x20, + 0x5C, 0x0F, 0x00, 0x20, 0x40, 0x06, 0x00, 0x20, 0xC0, 0x09, 0x00, 0x20, 0x38, 0x0A, 0x00, 0x20, + 0xFE, 0x0B, 0x00, 0x20, 0x58, 0x52, 0x28, 0x55, 0x00, 0x2C, 0x00, 0xD0, 0xCF, 0xE6, 0x3B, 0x4B, + 0x25, 0x1C, 0x1C, 0x60, 0x02, 0x24, 0x01, 0x3C, 0xE4, 0xB2, 0x38, 0x4E, 0x22, 0x1D, 0x52, 0x00, + 0x91, 0x5B, 0x37, 0x4B, 0x00, 0x29, 0x34, 0xD0, 0x1A, 0x5D, 0x7F, 0x2A, 0x01, 0xD0, 0x01, 0x32, + 0x1A, 0x55, 0x1B, 0x57, 0x01, 0x2B, 0x0F, 0xDD, 0x32, 0x4A, 0x26, 0x1D, 0x76, 0x00, 0x90, 0x5F, + 0x31, 0x4B, 0x09, 0xB2, 0x34, 0x27, 0xDA, 0x5F, 0x43, 0x1A, 0xDF, 0x17, 0xDB, 0x19, 0x7B, 0x40, + 0xFE, 0xF7, 0x24, 0xF9, 0x29, 0x4B, 0xF0, 0x52, 0x28, 0x4B, 0x22, 0x1D, 0x52, 0x00, 0x29, 0x48, + 0xD1, 0x5A, 0x11, 0x52, 0x26, 0x48, 0x06, 0x57, 0x27, 0x48, 0x36, 0x30, 0x00, 0x78, 0x86, 0x42, + 0x03, 0xDC, 0x01, 0x21, 0x49, 0x42, 0xD1, 0x52, 0x07, 0xE0, 0x1A, 0x68, 0x01, 0x32, 0x1A, 0x60, + 0x0A, 0xB2, 0x95, 0x42, 0x01, 0xDA, 0x5C, 0x60, 0x15, 0x1C, 0x20, 0x4B, 0x00, 0x22, 0x1A, 0x55, + 0x2F, 0xE0, 0x18, 0x57, 0x1E, 0x4F, 0x84, 0x46, 0x38, 0x78, 0x84, 0x45, 0x26, 0xDD, 0x19, 0x48, + 0x80, 0x5A, 0x02, 0x90, 0x00, 0x28, 0x24, 0xD0, 0x18, 0x4F, 0x01, 0x20, 0x3F, 0x5D, 0xBC, 0x46, + 0x84, 0x44, 0x67, 0x46, 0x15, 0x48, 0xFF, 0xB2, 0x07, 0x55, 0x13, 0x48, 0x7F, 0xB2, 0x84, 0x46, + 0x3E, 0x20, 0x84, 0x44, 0x60, 0x46, 0x00, 0x78, 0x87, 0x42, 0x0F, 0xDC, 0x08, 0x20, 0x6F, 0x46, + 0xC7, 0x5B, 0x08, 0x21, 0x68, 0x46, 0x97, 0x53, 0x0F, 0x5E, 0xBD, 0x42, 0x01, 0xDA, 0x74, 0x60, + 0x3D, 0x1C, 0x06, 0x4B, 0x1A, 0x68, 0x01, 0x32, 0x1A, 0x60, 0x02, 0xE0, 0x05, 0x4E, 0x19, 0x55, + 0xB1, 0x52, 0x00, 0x2C, 0x8F, 0xD1, 0x05, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x0C, 0x08, 0x00, 0x20, + 0x6E, 0x11, 0x00, 0x20, 0x1C, 0x08, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0x28, 0x0A, 0x00, 0x20, + 0xFE, 0x0B, 0x00, 0x20, 0xF0, 0xB5, 0x3B, 0x4B, 0x8B, 0xB0, 0x9B, 0x68, 0x02, 0x93, 0x3A, 0x4B, + 0x1B, 0x78, 0x00, 0x2B, 0x05, 0xD1, 0x39, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x68, 0xD0, 0x01, 0x93, + 0x01, 0xE0, 0x00, 0x20, 0x01, 0x90, 0x05, 0x23, 0x01, 0x3B, 0x35, 0x49, 0xDA, 0x00, 0x52, 0x18, + 0x6C, 0x32, 0x00, 0x24, 0x11, 0x5F, 0x1A, 0x01, 0x00, 0x29, 0x52, 0xD0, 0x02, 0x98, 0x82, 0x18, + 0x11, 0x68, 0x02, 0x29, 0x01, 0xDC, 0x01, 0x31, 0x11, 0x60, 0xD1, 0x88, 0x2C, 0x48, 0x11, 0x81, + 0x91, 0x89, 0x01, 0x9C, 0xD1, 0x81, 0x91, 0x88, 0xD1, 0x80, 0x51, 0x89, 0x91, 0x81, 0x21, 0x18, + 0x48, 0x69, 0x90, 0x80, 0x88, 0x6C, 0x50, 0x81, 0x10, 0x68, 0x03, 0x28, 0x3B, 0xD1, 0x08, 0x24, + 0x10, 0x5F, 0x9C, 0x46, 0x06, 0x90, 0x0E, 0x24, 0x10, 0x5F, 0x09, 0x90, 0x06, 0x24, 0x10, 0x5F, + 0x05, 0x90, 0x0C, 0x24, 0x10, 0x5F, 0x08, 0x90, 0x04, 0x24, 0x10, 0x5F, 0x00, 0x24, 0x04, 0x90, + 0x0A, 0x20, 0x12, 0x5E, 0x04, 0xA8, 0x07, 0x92, 0x07, 0xAA, 0x01, 0x34, 0xA6, 0x00, 0x04, 0xAB, + 0x9E, 0x19, 0x03, 0x94, 0x00, 0x25, 0x01, 0xE0, 0x02, 0x23, 0x03, 0x93, 0x03, 0x68, 0x37, 0x68, + 0x04, 0x35, 0xBB, 0x42, 0x01, 0xDD, 0x07, 0x60, 0x33, 0x60, 0x13, 0x68, 0x57, 0x59, 0xBB, 0x42, + 0x01, 0xDD, 0x17, 0x60, 0x53, 0x51, 0x03, 0x9B, 0x04, 0x36, 0x01, 0x2B, 0xEC, 0xD0, 0x04, 0x32, + 0x04, 0x30, 0x02, 0x2C, 0xE1, 0xD1, 0x05, 0x9A, 0x63, 0x46, 0x4A, 0x61, 0x08, 0x9A, 0x8A, 0x64, + 0x01, 0xE0, 0x02, 0x9C, 0xA1, 0x50, 0x01, 0x98, 0x04, 0x38, 0x01, 0x90, 0x00, 0x2B, 0x9B, 0xD1, + 0x0B, 0xB0, 0xF0, 0xBD, 0x1C, 0x07, 0x00, 0x20, 0x94, 0x07, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, + 0x20, 0x0C, 0x00, 0x20, 0xF0, 0xB5, 0xC6, 0x4B, 0x9D, 0xB0, 0x1A, 0x68, 0xC5, 0x4B, 0x01, 0x2A, + 0x07, 0xD1, 0xC5, 0x4A, 0x12, 0x68, 0x01, 0x2A, 0x03, 0xDD, 0xDE, 0x8B, 0x0A, 0x96, 0x1B, 0x8C, + 0x02, 0xE0, 0x5E, 0x8B, 0x0A, 0x96, 0x9B, 0x8B, 0x0B, 0x93, 0x0C, 0x24, 0x75, 0xE1, 0x15, 0x23, + 0x63, 0x43, 0xBE, 0x4E, 0x5B, 0x19, 0x9B, 0x57, 0x00, 0x2B, 0x00, 0xD1, 0x67, 0xE1, 0xBA, 0x4E, + 0xA7, 0x00, 0xAB, 0x00, 0xF7, 0x19, 0xF3, 0x18, 0x7A, 0x68, 0x03, 0x93, 0x5B, 0x68, 0xD3, 0x1A, + 0x08, 0x93, 0x23, 0x1C, 0x0E, 0x33, 0x9B, 0x00, 0x06, 0x93, 0x2B, 0x1C, 0x06, 0x98, 0x0E, 0x33, + 0x9B, 0x00, 0x82, 0x59, 0x07, 0x93, 0x9B, 0x59, 0x08, 0x99, 0xD3, 0x1A, 0xD8, 0x17, 0xCA, 0x17, + 0x09, 0x93, 0x1B, 0x18, 0x89, 0x18, 0x43, 0x40, 0x51, 0x40, 0x01, 0x93, 0x2B, 0x1C, 0x04, 0x91, + 0x34, 0x33, 0x21, 0x1C, 0x9B, 0x00, 0x34, 0x31, 0xF3, 0x18, 0x89, 0x00, 0x5B, 0x68, 0x89, 0x19, + 0x04, 0x31, 0x1B, 0xA8, 0x1B, 0x93, 0xFD, 0xF7, 0x03, 0xFE, 0x2B, 0x1C, 0x78, 0x68, 0x0D, 0x33, + 0xDB, 0x00, 0x15, 0x90, 0xF3, 0x18, 0x04, 0x22, 0x99, 0x5E, 0x03, 0x9B, 0x02, 0x91, 0x5B, 0x68, + 0x02, 0x9A, 0x03, 0x93, 0x23, 0x1C, 0x0D, 0x33, 0xDB, 0x00, 0xF3, 0x18, 0x04, 0x21, 0x5F, 0x5E, + 0x02, 0x9B, 0xBA, 0x18, 0x58, 0x43, 0x03, 0x9B, 0x11, 0x1C, 0x7B, 0x43, 0xC0, 0x18, 0x05, 0x92, + 0xFF, 0xF7, 0x64, 0xFA, 0x07, 0x9A, 0x06, 0x99, 0x16, 0x90, 0x03, 0x98, 0x8B, 0x59, 0x17, 0x90, + 0x96, 0x59, 0x02, 0x98, 0x77, 0x43, 0x18, 0x93, 0x43, 0x43, 0x05, 0x99, 0xD8, 0x19, 0xFF, 0xF7, + 0x55, 0xFA, 0x00, 0x21, 0x19, 0x90, 0x0C, 0x22, 0x12, 0xA8, 0x1A, 0x96, 0xFF, 0xF7, 0xEE, 0xFA, + 0x6D, 0x21, 0x69, 0x44, 0x09, 0x78, 0x6E, 0x22, 0x49, 0xB2, 0x0E, 0x91, 0x6A, 0x44, 0x12, 0x78, + 0x6F, 0x23, 0x52, 0xB2, 0x0F, 0x92, 0x6B, 0x44, 0x1B, 0x78, 0x1B, 0xAE, 0x5B, 0xB2, 0x10, 0x93, + 0x00, 0x22, 0xB2, 0x56, 0x17, 0x20, 0x57, 0x1C, 0x42, 0x43, 0x81, 0x4B, 0x00, 0x26, 0xD3, 0x18, + 0x06, 0x96, 0x11, 0x93, 0xB3, 0xE0, 0x07, 0x9E, 0xF6, 0x01, 0x0C, 0x96, 0x0F, 0x9E, 0xA3, 0xE0, + 0x11, 0x98, 0x06, 0x99, 0x43, 0x18, 0x9B, 0x19, 0xDB, 0x7D, 0x03, 0x93, 0x01, 0x3B, 0x0C, 0x2B, + 0x41, 0xDD, 0x00, 0x20, 0x01, 0x21, 0x49, 0x42, 0x84, 0x46, 0x04, 0x23, 0x00, 0x96, 0x01, 0x3B, + 0x74, 0x4A, 0xDB, 0xB2, 0xD2, 0x56, 0x74, 0x4E, 0x05, 0x92, 0xF6, 0x56, 0x07, 0x9A, 0x92, 0x19, + 0x01, 0x32, 0x17, 0x26, 0x56, 0x43, 0x6E, 0x4A, 0x92, 0x19, 0x02, 0x9E, 0x96, 0x19, 0x05, 0x9A, + 0x0D, 0x96, 0xB2, 0x18, 0x05, 0x92, 0x52, 0x78, 0x01, 0x3A, 0x0C, 0x2A, 0x0E, 0xD8, 0xAA, 0x42, + 0x01, 0xD0, 0xA2, 0x42, 0x04, 0xD1, 0x4E, 0x1C, 0x04, 0xD0, 0x91, 0x42, 0x04, 0xD1, 0x05, 0xE0, + 0x01, 0x20, 0x03, 0xE0, 0x11, 0x1C, 0x01, 0xE0, 0x01, 0x22, 0x94, 0x46, 0x00, 0x2B, 0xD6, 0xD1, + 0x00, 0x9E, 0x01, 0x31, 0x68, 0xD0, 0x32, 0x01, 0xD2, 0x19, 0x60, 0x4B, 0x52, 0x00, 0x00, 0x28, + 0x13, 0xD0, 0x60, 0x46, 0x00, 0x28, 0x10, 0xD1, 0x03, 0x99, 0x98, 0x5A, 0x0E, 0x39, 0xFF, 0xF7, + 0xE5, 0xF9, 0x03, 0x90, 0x0B, 0xE0, 0x59, 0x1C, 0x56, 0xD0, 0xAB, 0x42, 0x01, 0xD0, 0xA3, 0x42, + 0x52, 0xD1, 0x32, 0x01, 0xD2, 0x19, 0x55, 0x4B, 0x52, 0x00, 0xD3, 0x5A, 0x03, 0x93, 0x03, 0x9A, + 0x00, 0x2A, 0x49, 0xD0, 0x02, 0x9B, 0x03, 0x20, 0xDB, 0x01, 0x0D, 0x93, 0x02, 0x90, 0x02, 0x9B, + 0x04, 0x9A, 0x01, 0x3B, 0xDB, 0xB2, 0x99, 0x00, 0x02, 0x93, 0x01, 0x9B, 0x05, 0x91, 0x9A, 0x42, + 0x0F, 0xDD, 0x18, 0xAA, 0x50, 0x58, 0x0D, 0x9B, 0x09, 0x99, 0xC0, 0x1A, 0x48, 0x43, 0x08, 0x99, + 0xFF, 0xF7, 0xBC, 0xF9, 0x05, 0x99, 0x15, 0xAA, 0x53, 0x58, 0x0C, 0x9A, 0xC0, 0x18, 0x80, 0x1A, + 0x0F, 0xE0, 0x05, 0x99, 0x15, 0xAB, 0x58, 0x58, 0x0C, 0x9A, 0x08, 0x9B, 0x80, 0x1A, 0x58, 0x43, + 0x09, 0x99, 0xFF, 0xF7, 0xAB, 0xF9, 0x05, 0x9A, 0x18, 0xA9, 0x8B, 0x58, 0xC0, 0x18, 0x0D, 0x9B, + 0xC0, 0x1A, 0xC1, 0x17, 0x40, 0x18, 0x48, 0x40, 0x7F, 0x28, 0x12, 0xDC, 0x02, 0x9A, 0x80, 0x21, + 0x93, 0x00, 0x0A, 0x1A, 0x03, 0x98, 0x48, 0x21, 0x42, 0x43, 0xD2, 0x11, 0xC9, 0x18, 0x05, 0x92, + 0x6A, 0x46, 0x88, 0x58, 0x05, 0x99, 0x84, 0x46, 0x0A, 0x1C, 0x62, 0x44, 0x48, 0x33, 0x68, 0x46, + 0x1A, 0x50, 0x02, 0x99, 0x00, 0x29, 0xBA, 0xD1, 0x01, 0x36, 0x10, 0x9B, 0x72, 0x1E, 0x02, 0x92, + 0x9A, 0x42, 0x00, 0xDC, 0x54, 0xE7, 0x06, 0x9E, 0x01, 0x37, 0x17, 0x36, 0x06, 0x96, 0x0E, 0x98, + 0x7E, 0x1E, 0x07, 0x96, 0x86, 0x42, 0x00, 0xDC, 0x45, 0xE7, 0x14, 0x9B, 0x12, 0x9E, 0x9E, 0x42, + 0x00, 0xDD, 0x1E, 0x1C, 0x04, 0x99, 0x01, 0x9A, 0x91, 0x42, 0x02, 0xDC, 0x13, 0x1E, 0x0E, 0xD0, + 0x03, 0xE0, 0x04, 0x9B, 0x01, 0x98, 0x01, 0x93, 0x04, 0x90, 0x04, 0x99, 0x88, 0x01, 0x01, 0x99, + 0xFF, 0xF7, 0x64, 0xF9, 0x3F, 0x28, 0x00, 0xDD, 0x3F, 0x20, 0x19, 0x4B, 0x1B, 0x5C, 0x2D, 0x21, + 0x0A, 0x9A, 0xC8, 0x1A, 0x50, 0x43, 0x0B, 0x9A, 0x53, 0x43, 0xC0, 0x18, 0xFF, 0xF7, 0x56, 0xF9, + 0x46, 0x43, 0x13, 0x9B, 0xB6, 0x12, 0xB3, 0x42, 0x09, 0xDD, 0xA5, 0x42, 0x02, 0xDA, 0x23, 0x1C, + 0x2C, 0x1C, 0x1D, 0x1C, 0x20, 0x1C, 0x29, 0x1C, 0x1B, 0xAA, 0xFD, 0xF7, 0x7F, 0xFB, 0x01, 0x35, + 0x0D, 0x2D, 0x00, 0xD0, 0x8B, 0xE6, 0x00, 0x2C, 0x14, 0xD0, 0x25, 0x1C, 0x01, 0x3C, 0x86, 0xE6, + 0x5C, 0x0F, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0x8C, 0x08, 0x00, 0x20, 0xA0, 0x0A, 0x00, 0x20, + 0xAA, 0x0F, 0x00, 0x20, 0x67, 0x35, 0x00, 0x00, 0x63, 0x35, 0x00, 0x00, 0x00, 0x04, 0x00, 0x40, + 0x7E, 0x37, 0x00, 0x00, 0x24, 0x4E, 0x01, 0x21, 0x34, 0x60, 0x24, 0x48, 0x6C, 0x36, 0x49, 0x42, + 0x2A, 0x1C, 0xFF, 0xF7, 0xC3, 0xF9, 0x27, 0x1C, 0x01, 0x96, 0x04, 0x94, 0x26, 0x1C, 0x1E, 0x4C, + 0x01, 0x98, 0xFB, 0xB2, 0x00, 0x22, 0x82, 0x5E, 0x00, 0x2A, 0x29, 0xDD, 0x22, 0x68, 0x1B, 0x49, + 0x01, 0x32, 0x22, 0x60, 0xCE, 0x55, 0x9E, 0x42, 0x20, 0xD0, 0x04, 0x9A, 0xB3, 0x00, 0x15, 0x19, + 0x6A, 0x68, 0xE3, 0x18, 0x30, 0x1C, 0x5A, 0x60, 0x0D, 0x30, 0x33, 0x1C, 0xAA, 0x6B, 0x0E, 0x33, + 0xC0, 0x00, 0x9B, 0x00, 0x20, 0x18, 0x1A, 0x51, 0x01, 0x99, 0x08, 0x22, 0x04, 0x30, 0xFF, 0xF7, + 0x5F, 0xF9, 0x30, 0x1C, 0x34, 0x30, 0x80, 0x00, 0x20, 0x18, 0x29, 0x1C, 0x04, 0x30, 0xD4, 0x31, + 0x04, 0x22, 0xFF, 0xF7, 0x55, 0xF9, 0x01, 0x98, 0x00, 0x23, 0x03, 0x80, 0x01, 0x36, 0xF6, 0xB2, + 0x01, 0x99, 0x04, 0x9A, 0x08, 0x31, 0x04, 0x32, 0x01, 0x37, 0x01, 0x91, 0x04, 0x92, 0x0D, 0x2F, + 0xC6, 0xD1, 0x1D, 0xB0, 0xF0, 0xBD, 0xC0, 0x46, 0x8C, 0x08, 0x00, 0x20, 0x98, 0x09, 0x00, 0x20, + 0xF0, 0xB5, 0x6F, 0x4B, 0x8D, 0xB0, 0x1B, 0x69, 0xDA, 0x00, 0xD3, 0x1A, 0x9B, 0x11, 0x06, 0x93, + 0x07, 0x2B, 0x01, 0xDA, 0x07, 0x24, 0x06, 0x94, 0x6A, 0x4E, 0x0C, 0x24, 0x3D, 0x27, 0x01, 0x3C, + 0xE4, 0xB2, 0x65, 0x00, 0xA8, 0x5B, 0x98, 0x21, 0x78, 0x43, 0xC9, 0x00, 0xFF, 0xF7, 0xC6, 0xF8, + 0xA8, 0x53, 0x00, 0x2C, 0xF3, 0xD1, 0x13, 0x24, 0x63, 0x4E, 0x08, 0xE0, 0x65, 0x00, 0xAB, 0x5B, + 0xC0, 0x21, 0xD8, 0x00, 0xC0, 0x1A, 0x89, 0x00, 0xFF, 0xF7, 0xB8, 0xF8, 0xA8, 0x53, 0x01, 0x3C, + 0xE4, 0xB2, 0xFF, 0x2C, 0xF2, 0xD1, 0x5D, 0x4B, 0x00, 0x21, 0x19, 0x70, 0x5C, 0x4B, 0x0C, 0x1C, + 0x19, 0x70, 0x5C, 0x4B, 0x0A, 0x91, 0x19, 0x70, 0x5B, 0x4B, 0x07, 0x91, 0x19, 0x70, 0x5B, 0x4B, + 0x08, 0x91, 0x19, 0x70, 0x52, 0x4B, 0x08, 0x1C, 0x9D, 0x69, 0x05, 0x91, 0x09, 0x91, 0x0C, 0x22, + 0x72, 0xE0, 0x5F, 0x1C, 0x55, 0x1C, 0x3F, 0x01, 0x7F, 0x19, 0x55, 0x4E, 0x03, 0x95, 0x7D, 0x00, + 0xAD, 0x5B, 0x2F, 0x1C, 0x06, 0x9D, 0xAF, 0x42, 0x02, 0xDD, 0x02, 0x9E, 0x01, 0x36, 0x02, 0x96, + 0x28, 0x2F, 0x04, 0xDD, 0x01, 0x99, 0x01, 0x31, 0xC9, 0xB2, 0x01, 0x91, 0x01, 0xE0, 0x0A, 0x2F, + 0x01, 0xDD, 0x01, 0x34, 0xE4, 0xB2, 0x15, 0x27, 0x57, 0x43, 0xFF, 0x18, 0x7D, 0x00, 0x49, 0x4F, + 0x51, 0x00, 0xED, 0x5F, 0x3F, 0x4F, 0x5E, 0x00, 0xCF, 0x5B, 0xED, 0x1B, 0x3E, 0x4F, 0xF7, 0x5B, + 0xEF, 0x1B, 0x00, 0x2F, 0x10, 0xDD, 0xB8, 0x42, 0x02, 0xDC, 0x38, 0x1C, 0x05, 0x92, 0x09, 0x93, + 0x41, 0x49, 0x5D, 0x01, 0x03, 0x9E, 0x49, 0x19, 0x04, 0x91, 0xBD, 0xB2, 0x76, 0x00, 0x31, 0x1C, + 0x2E, 0x1C, 0x04, 0x9D, 0x4E, 0x53, 0x0C, 0xE0, 0x3B, 0x4D, 0x59, 0x01, 0x8C, 0x46, 0x2E, 0x1C, + 0x03, 0x99, 0x66, 0x44, 0x49, 0x00, 0x04, 0x96, 0x03, 0x91, 0x0E, 0x1C, 0x04, 0x99, 0x00, 0x25, + 0x75, 0x52, 0x0B, 0x9E, 0x00, 0x2E, 0x01, 0xD1, 0x04, 0x2A, 0x05, 0xD1, 0x04, 0x2F, 0x03, 0xDD, + 0x0C, 0x2B, 0x01, 0xD9, 0x01, 0x21, 0x0A, 0x91, 0x07, 0x2F, 0x17, 0xDD, 0x05, 0x2A, 0x05, 0xD1, + 0x0C, 0x2B, 0x03, 0xD9, 0x07, 0x9E, 0x01, 0x36, 0xF6, 0xB2, 0x07, 0x96, 0x06, 0x2A, 0x0D, 0xD1, + 0x0C, 0x2B, 0x0B, 0xD9, 0x08, 0x9E, 0x01, 0x36, 0xF6, 0xB2, 0x08, 0x96, 0x06, 0xE0, 0xD6, 0x1F, + 0x77, 0x42, 0x77, 0x41, 0x13, 0x23, 0x0B, 0x97, 0x01, 0x91, 0x02, 0x95, 0x01, 0x3B, 0xDB, 0xB2, + 0xFF, 0x2B, 0x8E, 0xD1, 0x01, 0x99, 0x02, 0x9D, 0x01, 0x3A, 0xD2, 0xB2, 0xFF, 0x2A, 0xEE, 0xD1, + 0x16, 0x4A, 0x13, 0x4B, 0x11, 0x70, 0x16, 0x4A, 0x0A, 0xA9, 0x14, 0x70, 0x09, 0x78, 0x15, 0x4A, + 0x9D, 0x61, 0x6C, 0x46, 0x1C, 0x25, 0x11, 0x70, 0x2C, 0x5D, 0x13, 0x4A, 0x08, 0xAD, 0x14, 0x70, + 0x2D, 0x78, 0x12, 0x4A, 0x98, 0x60, 0x15, 0x4B, 0x15, 0x70, 0x1B, 0x7E, 0x98, 0x42, 0x0D, 0xDD, + 0x13, 0x28, 0x0B, 0xDC, 0x12, 0x4B, 0x1B, 0x68, 0x01, 0x2B, 0x07, 0xD1, 0x05, 0x9B, 0x01, 0x33, + 0xDB, 0xB2, 0x00, 0xE0, 0x09, 0x9B, 0x05, 0x9E, 0x9E, 0x42, 0xFB, 0xDC, 0x0D, 0xB0, 0xF0, 0xBD, + 0xAC, 0x07, 0x00, 0x20, 0x80, 0x0A, 0x00, 0x20, 0x6A, 0x0F, 0x00, 0x20, 0x46, 0x08, 0x00, 0x20, + 0x47, 0x08, 0x00, 0x20, 0x0A, 0x07, 0x00, 0x20, 0x44, 0x08, 0x00, 0x20, 0x45, 0x08, 0x00, 0x20, + 0x00, 0x04, 0x00, 0x40, 0x28, 0x0D, 0x00, 0x20, 0x20, 0x08, 0x00, 0x40, 0xC8, 0x0B, 0x00, 0x20, + 0x20, 0x0C, 0x00, 0x20, 0x01, 0x4B, 0x0D, 0x22, 0x1A, 0x70, 0x70, 0x47, 0x68, 0x11, 0x00, 0x20, + 0x00, 0xB5, 0x80, 0x22, 0xD2, 0x05, 0x08, 0x23, 0x51, 0x69, 0x19, 0x42, 0xFC, 0xD0, 0x11, 0x4B, + 0x01, 0x28, 0x02, 0xD0, 0x04, 0x28, 0x0D, 0xD1, 0x04, 0xE0, 0x1B, 0x68, 0x0F, 0x22, 0x1A, 0x70, + 0x00, 0x22, 0x06, 0xE0, 0x1B, 0x68, 0x0E, 0x22, 0x1A, 0x70, 0x0B, 0x4A, 0x02, 0x21, 0x12, 0x78, + 0x8A, 0x1A, 0x5A, 0x70, 0x07, 0x4B, 0x00, 0x22, 0x1B, 0x68, 0x08, 0x21, 0x9A, 0x70, 0xDA, 0x70, + 0x06, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x5A, 0x69, 0x8A, 0x43, 0x5A, 0x61, + 0x00, 0xBD, 0xC0, 0x46, 0x1C, 0x0C, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, 0x18, 0x0C, 0x00, 0x20, + 0xF0, 0xB5, 0x80, 0x22, 0x9B, 0xB0, 0xD2, 0x05, 0x08, 0x23, 0x51, 0x69, 0x19, 0x42, 0xFC, 0xD0, + 0xB3, 0x4C, 0x00, 0x26, 0x01, 0x27, 0x03, 0x94, 0x04, 0x96, 0x01, 0x97, 0x35, 0x1C, 0x04, 0x9C, + 0xB0, 0x4F, 0xE7, 0x19, 0x04, 0x26, 0xBB, 0x5F, 0x18, 0x93, 0x0E, 0x20, 0x3B, 0x5E, 0x18, 0xA8, + 0x19, 0x93, 0xFD, 0xF7, 0x19, 0xFD, 0x03, 0x9C, 0x00, 0x23, 0xE3, 0x5E, 0x00, 0x2B, 0x00, 0xDC, + 0xB4, 0xE0, 0x01, 0x9E, 0x16, 0xA8, 0xB6, 0x00, 0x07, 0x96, 0x07, 0x9C, 0xA6, 0x4E, 0xA6, 0x19, + 0x33, 0x68, 0x16, 0x93, 0x73, 0x6B, 0x17, 0x93, 0xFD, 0xF7, 0x06, 0xFD, 0xA3, 0x4B, 0x1C, 0x78, + 0x00, 0x2C, 0x45, 0xD1, 0xA2, 0x49, 0x09, 0xA8, 0x32, 0x22, 0xFE, 0xF7, 0xD9, 0xFF, 0xA1, 0x48, + 0xA1, 0x49, 0x02, 0x90, 0x05, 0x94, 0x06, 0x91, 0x02, 0x9A, 0x16, 0x9B, 0x10, 0x88, 0x51, 0x88, + 0xC0, 0x1A, 0x00, 0xB2, 0xC3, 0x17, 0xC0, 0x18, 0x58, 0x40, 0x17, 0x9B, 0x00, 0xB2, 0xC9, 0x1A, + 0x09, 0xB2, 0xCA, 0x17, 0x89, 0x18, 0x51, 0x40, 0x09, 0xB2, 0xFD, 0xF7, 0x4B, 0xFB, 0x06, 0x9B, + 0x83, 0x42, 0x01, 0xDD, 0x05, 0x94, 0x06, 0x90, 0x02, 0x98, 0x01, 0x34, 0x04, 0x30, 0x02, 0x90, + 0x32, 0x2C, 0xE1, 0xD1, 0x05, 0x99, 0x8F, 0x4A, 0x89, 0x00, 0x02, 0x91, 0x88, 0x5E, 0x16, 0x9C, + 0x05, 0x21, 0x00, 0x1B, 0x40, 0x00, 0xFE, 0xF7, 0x49, 0xFF, 0x02, 0x99, 0x24, 0x18, 0x89, 0x48, + 0x16, 0x94, 0x43, 0x18, 0x02, 0x22, 0x98, 0x5E, 0x17, 0x9C, 0x03, 0x21, 0x00, 0x1B, 0x40, 0x00, + 0xFE, 0xF7, 0x3C, 0xFF, 0x24, 0x18, 0x05, 0x98, 0x09, 0xAB, 0x1B, 0x56, 0xE4, 0x18, 0x17, 0x94, + 0x82, 0x4B, 0x01, 0x9C, 0x19, 0x9A, 0xE3, 0x18, 0x01, 0x3B, 0x18, 0x99, 0x94, 0x46, 0x1A, 0x78, + 0x05, 0x91, 0x02, 0x93, 0x16, 0x98, 0x17, 0x99, 0x01, 0x23, 0x00, 0x2A, 0x02, 0xD1, 0x7C, 0x4B, + 0x37, 0x33, 0x1B, 0x78, 0x18, 0x24, 0x3A, 0x5F, 0x06, 0x92, 0x00, 0x2A, 0x0D, 0xDD, 0x62, 0x46, + 0x8A, 0x1A, 0xD4, 0x17, 0x12, 0x19, 0x62, 0x40, 0x9A, 0x42, 0x06, 0xDA, 0x05, 0x9A, 0x84, 0x1A, + 0xE2, 0x17, 0xA4, 0x18, 0x54, 0x40, 0x9C, 0x42, 0x59, 0xDB, 0x06, 0x23, 0x6B, 0x43, 0x71, 0x4C, + 0x60, 0x22, 0x24, 0x68, 0x52, 0x42, 0xE3, 0x18, 0x6F, 0x4C, 0xD9, 0x70, 0x24, 0x78, 0x98, 0x70, + 0x24, 0x01, 0x14, 0x43, 0x01, 0x9A, 0x14, 0x43, 0x1C, 0x70, 0x04, 0x12, 0xA4, 0x46, 0x62, 0x46, + 0x0F, 0x24, 0x22, 0x40, 0x05, 0x92, 0x0A, 0x11, 0xA2, 0x43, 0x14, 0x1C, 0x05, 0x9A, 0x14, 0x43, + 0x5C, 0x70, 0x01, 0x9C, 0xE1, 0x00, 0x5C, 0x4C, 0x09, 0x19, 0x6A, 0x31, 0x09, 0x88, 0x03, 0x9C, + 0x19, 0x71, 0x21, 0x88, 0x08, 0xB2, 0xFF, 0x28, 0x00, 0xDD, 0xFF, 0x21, 0x06, 0x98, 0x59, 0x71, + 0xC3, 0x17, 0x1B, 0x1A, 0x02, 0x99, 0x54, 0x4C, 0x07, 0x98, 0xDB, 0x0F, 0x0B, 0x70, 0x23, 0x58, + 0x01, 0x35, 0xBB, 0x80, 0x73, 0x6B, 0xED, 0xB2, 0xFB, 0x81, 0x20, 0xE0, 0x18, 0x21, 0x7B, 0x5E, + 0x00, 0x2B, 0x1C, 0xDD, 0x06, 0x23, 0x6B, 0x43, 0x52, 0x4A, 0x20, 0x21, 0x12, 0x68, 0x01, 0x9C, + 0xD3, 0x18, 0x52, 0x4A, 0x0F, 0x20, 0x12, 0x78, 0x01, 0x35, 0x12, 0x01, 0x0A, 0x43, 0x22, 0x43, + 0x1A, 0x70, 0x19, 0x9A, 0x18, 0x99, 0x16, 0x11, 0x0C, 0x12, 0x04, 0x40, 0x86, 0x43, 0x26, 0x43, + 0xDA, 0x70, 0x00, 0x22, 0x5E, 0x70, 0x99, 0x70, 0x1A, 0x71, 0x5A, 0x71, 0xED, 0xB2, 0x03, 0x9E, + 0x04, 0x9C, 0x33, 0x88, 0x02, 0x34, 0x3B, 0x83, 0x01, 0x9F, 0x08, 0x36, 0x01, 0x37, 0x01, 0x97, + 0x04, 0x94, 0x03, 0x96, 0x04, 0x2C, 0x00, 0xD0, 0x09, 0xE7, 0x3E, 0x4B, 0x00, 0x22, 0x18, 0x68, + 0x06, 0x23, 0x6B, 0x43, 0x3E, 0x49, 0xC3, 0x18, 0x5A, 0x70, 0x9A, 0x70, 0xDA, 0x70, 0x1A, 0x71, + 0x4C, 0x68, 0x3C, 0x49, 0x49, 0x68, 0x66, 0x1C, 0x2E, 0xD0, 0x8C, 0x42, 0x35, 0xD0, 0x4F, 0x1C, + 0x06, 0xD0, 0x01, 0x31, 0x40, 0x26, 0x31, 0x43, 0x01, 0x35, 0x19, 0x70, 0x5A, 0x71, 0xED, 0xB2, + 0x06, 0x23, 0x6B, 0x43, 0xC3, 0x18, 0x01, 0x93, 0x40, 0x23, 0x62, 0x1C, 0x5B, 0x42, 0x01, 0x9E, + 0x13, 0x43, 0x33, 0x70, 0x25, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x0E, 0xD1, 0x28, 0x4B, 0x2C, 0x49, + 0x27, 0x1D, 0x31, 0x33, 0x7F, 0x00, 0x1E, 0x78, 0x78, 0x5E, 0x03, 0x21, 0x80, 0x1B, 0xFE, 0xF7, + 0x75, 0xFE, 0x76, 0x00, 0x26, 0x4A, 0x86, 0x19, 0xBE, 0x52, 0x04, 0x34, 0x24, 0x4B, 0x64, 0x00, + 0x1B, 0x5B, 0x01, 0x9C, 0x63, 0x71, 0x06, 0xE0, 0x4E, 0x1C, 0x06, 0xD0, 0x01, 0x31, 0x40, 0x20, + 0x01, 0x43, 0x19, 0x70, 0x5A, 0x71, 0x01, 0x35, 0xED, 0xB2, 0x13, 0x4B, 0x19, 0x68, 0x11, 0x4B, + 0x19, 0x60, 0x19, 0x4B, 0x1A, 0x78, 0x19, 0x4B, 0x1A, 0x70, 0x1A, 0x4B, 0x18, 0x4A, 0x18, 0x1C, + 0xD0, 0xCA, 0xD0, 0xC0, 0x12, 0x68, 0x02, 0x60, 0x01, 0x22, 0x00, 0x29, 0x02, 0xD1, 0x1A, 0x68, + 0x53, 0x1E, 0x9A, 0x41, 0x14, 0x4B, 0x1A, 0x70, 0x00, 0x2D, 0x07, 0xD0, 0x13, 0x4B, 0x08, 0x21, + 0x1D, 0x70, 0x80, 0x23, 0xDB, 0x05, 0x5A, 0x69, 0x8A, 0x43, 0x5A, 0x61, 0x1B, 0xB0, 0xF0, 0xBD, + 0x8C, 0x0C, 0x00, 0x20, 0xE0, 0x07, 0x00, 0x20, 0x20, 0x0C, 0x00, 0x20, 0x40, 0x06, 0x00, 0x20, + 0x2C, 0x35, 0x00, 0x00, 0x42, 0x06, 0x00, 0x20, 0xFF, 0x7F, 0x00, 0x00, 0x04, 0x08, 0x00, 0x20, + 0xC8, 0x0B, 0x00, 0x20, 0x1C, 0x0C, 0x00, 0x20, 0x09, 0x08, 0x00, 0x20, 0x0A, 0x08, 0x00, 0x20, + 0x0C, 0x08, 0x00, 0x20, 0x2C, 0x08, 0x00, 0x20, 0x0B, 0x08, 0x00, 0x20, 0x18, 0x0C, 0x00, 0x20, + 0x00, 0xB5, 0x07, 0x4B, 0x1B, 0x68, 0xDB, 0xB2, 0x10, 0x2B, 0x01, 0xD0, 0xAF, 0x2B, 0x05, 0xD1, + 0x80, 0x23, 0xDB, 0x05, 0x5A, 0x69, 0x08, 0x21, 0x0A, 0x43, 0x5A, 0x61, 0x00, 0xBD, 0xC0, 0x46, + 0x1C, 0x06, 0x00, 0x20, 0x00, 0xB5, 0x8B, 0x4A, 0x8B, 0x49, 0x12, 0x68, 0x0B, 0x78, 0x92, 0xB2, + 0x08, 0x1C, 0x31, 0x2A, 0x27, 0xD0, 0x03, 0xD8, 0x30, 0x2A, 0x00, 0xD0, 0x08, 0xE1, 0x05, 0xE0, + 0xA0, 0x2A, 0x25, 0xD0, 0xB0, 0x2A, 0x00, 0xD0, 0x02, 0xE1, 0xE7, 0xE0, 0x01, 0x2B, 0x04, 0xD1, + 0x82, 0x4A, 0x12, 0x78, 0x00, 0x2A, 0x07, 0xD0, 0xFA, 0xE0, 0x02, 0x2B, 0x06, 0xD1, 0x7F, 0x4A, + 0x12, 0x78, 0x00, 0x2A, 0x00, 0xD1, 0xF3, 0xE0, 0x7D, 0x4A, 0x13, 0x70, 0x03, 0x78, 0x05, 0x2B, + 0x02, 0xD1, 0x7C, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x03, 0x78, 0x06, 0x2B, 0x00, 0xD0, 0xE7, 0xE0, + 0x00, 0x22, 0x78, 0x4B, 0x50, 0xE0, 0x5A, 0x42, 0x53, 0x41, 0x77, 0x4A, 0x13, 0x70, 0xDF, 0xE0, + 0x4A, 0x78, 0x89, 0x78, 0x22, 0x2B, 0x2D, 0xD0, 0x08, 0xD8, 0x01, 0x2B, 0x16, 0xD0, 0x00, 0x2B, + 0x0F, 0xD0, 0x02, 0x2B, 0x18, 0xD0, 0x03, 0x2B, 0x40, 0xD1, 0x1A, 0xE0, 0x40, 0x2B, 0x30, 0xD0, + 0x02, 0xD8, 0x36, 0x2B, 0x3A, 0xD1, 0x23, 0xE0, 0x70, 0x2B, 0x25, 0xD0, 0x71, 0x2B, 0x35, 0xD1, + 0x84, 0xE0, 0x6A, 0x4B, 0x08, 0x22, 0x1A, 0x70, 0x69, 0x4A, 0x02, 0xE0, 0x67, 0x4A, 0x13, 0x70, + 0x68, 0x4A, 0x69, 0x4B, 0x1A, 0x60, 0xBB, 0xE0, 0x64, 0x4B, 0x04, 0x22, 0x1A, 0x70, 0x67, 0x4A, + 0xF7, 0xE7, 0x62, 0x4B, 0x02, 0x22, 0x1A, 0x70, 0x65, 0x4B, 0x66, 0x4A, 0x1A, 0x60, 0x62, 0x4A, + 0x13, 0x60, 0xAD, 0xE0, 0x01, 0x2A, 0x00, 0xD0, 0xAA, 0xE0, 0xC9, 0xB2, 0x62, 0x4B, 0x01, 0xE0, + 0x62, 0x4B, 0xC9, 0xB2, 0x19, 0x70, 0xA3, 0xE0, 0x58, 0x4B, 0xFF, 0x2A, 0x43, 0xD1, 0x26, 0x22, + 0x3E, 0xE0, 0x5F, 0x4B, 0x0C, 0x22, 0x1A, 0x70, 0x5E, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0x5E, 0x4B, + 0x01, 0x22, 0x1A, 0x70, 0x59, 0x4B, 0x05, 0x22, 0x1A, 0x70, 0x91, 0xE0, 0x5A, 0x48, 0x00, 0x78, + 0x00, 0x28, 0x00, 0xD1, 0x8C, 0xE0, 0x47, 0x2B, 0x21, 0xD0, 0x0C, 0xD8, 0x43, 0x2B, 0x1A, 0xD0, + 0x05, 0xD8, 0x41, 0x2B, 0x15, 0xD0, 0x42, 0x2B, 0x00, 0xD0, 0x81, 0xE0, 0x1C, 0xE0, 0x45, 0x2B, + 0x13, 0xD0, 0x28, 0xD8, 0x18, 0xE0, 0x4B, 0x2B, 0x04, 0xD8, 0x4A, 0x2B, 0x36, 0xD2, 0x48, 0x2B, + 0x76, 0xD1, 0x2E, 0xE0, 0x4E, 0x2B, 0x51, 0xD0, 0x4F, 0x2B, 0x51, 0xD0, 0x4C, 0x2B, 0x6F, 0xD1, + 0x38, 0xE0, 0x01, 0x22, 0x50, 0xE0, 0x02, 0x22, 0x4E, 0xE0, 0x03, 0x22, 0x4C, 0xE0, 0x45, 0x4B, + 0x05, 0x21, 0x19, 0x70, 0x45, 0x4B, 0xCF, 0xE7, 0x38, 0x4B, 0xFF, 0x2A, 0x03, 0xD1, 0x28, 0x22, + 0x1A, 0x70, 0x00, 0x22, 0x01, 0xE0, 0x02, 0x20, 0x18, 0x70, 0x15, 0x23, 0x59, 0x43, 0x52, 0x18, + 0x52, 0x00, 0x3F, 0x4B, 0x28, 0xE0, 0x31, 0x4B, 0xFF, 0x2A, 0x03, 0xD1, 0x15, 0x22, 0x1A, 0x70, + 0x00, 0x22, 0x01, 0xE0, 0x01, 0x20, 0x18, 0x70, 0x15, 0x23, 0x59, 0x43, 0x39, 0x4B, 0x52, 0x18, + 0x1A, 0xE0, 0x2A, 0x4B, 0x21, 0x22, 0x1A, 0x70, 0x36, 0x4A, 0x16, 0xE0, 0x27, 0x4B, 0xFF, 0x2A, + 0x03, 0xD1, 0x04, 0x22, 0x1A, 0x70, 0x00, 0x22, 0x01, 0xE0, 0x02, 0x21, 0x19, 0x70, 0x52, 0x00, + 0x31, 0x4B, 0x09, 0xE0, 0x21, 0x4B, 0xFF, 0x2A, 0x03, 0xD1, 0x02, 0x22, 0x1A, 0x70, 0x00, 0x22, + 0x01, 0xE0, 0x01, 0x21, 0x19, 0x70, 0x2D, 0x4B, 0xD2, 0x18, 0x1F, 0x4B, 0x08, 0x21, 0x1A, 0x60, + 0x80, 0x23, 0xDB, 0x05, 0x5A, 0x69, 0x8A, 0x43, 0x5A, 0x61, 0x21, 0xE0, 0x04, 0x22, 0x03, 0xE0, + 0x1F, 0x4B, 0x0D, 0x22, 0x1A, 0x70, 0x06, 0x22, 0x1E, 0x4B, 0x85, 0xE7, 0x00, 0x2B, 0x17, 0xD0, + 0x80, 0x23, 0xDB, 0x05, 0x99, 0x68, 0x22, 0x4A, 0x0A, 0x40, 0x9A, 0x60, 0x99, 0x68, 0x21, 0x4A, + 0x0A, 0x40, 0x9A, 0x60, 0x99, 0x68, 0x20, 0x4A, 0x0A, 0x40, 0x9A, 0x60, 0x59, 0x68, 0x80, 0x22, + 0x12, 0x01, 0x0A, 0x43, 0x5A, 0x60, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0xC0, 0x46, 0x62, 0xB6, + 0x00, 0xBD, 0xC0, 0x46, 0x1C, 0x06, 0x00, 0x20, 0x0C, 0x00, 0x00, 0x50, 0x76, 0x07, 0x00, 0x20, + 0x77, 0x07, 0x00, 0x20, 0xA2, 0x07, 0x00, 0x20, 0x40, 0x06, 0x00, 0x20, 0x21, 0x0A, 0x00, 0x20, + 0xC0, 0x37, 0x00, 0x00, 0xC8, 0x37, 0x00, 0x00, 0x64, 0x0F, 0x00, 0x20, 0xEC, 0x4F, 0x00, 0x00, + 0x94, 0x09, 0x00, 0x20, 0x14, 0x0C, 0x00, 0x00, 0xBD, 0x09, 0x00, 0x20, 0x30, 0x06, 0x00, 0x20, + 0x68, 0x11, 0x00, 0x20, 0xB0, 0x0B, 0x00, 0x20, 0x70, 0x07, 0x00, 0x20, 0x6D, 0x11, 0x00, 0x20, + 0x28, 0x0D, 0x00, 0x20, 0xA0, 0x0A, 0x00, 0x20, 0xBE, 0x0B, 0x00, 0x20, 0x6E, 0x11, 0x00, 0x20, + 0xFF, 0xFD, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0xFF, 0x30, 0xB5, 0x55, 0x4B, + 0x1B, 0x68, 0x0C, 0x2B, 0x3C, 0xD0, 0x10, 0xDC, 0x04, 0x2B, 0x25, 0xD0, 0x05, 0xDC, 0x02, 0x2B, + 0x1A, 0xD0, 0x03, 0x2B, 0x00, 0xD0, 0x9B, 0xE0, 0x19, 0xE0, 0x09, 0x2B, 0x28, 0xD0, 0x0B, 0x2B, + 0x2B, 0xD0, 0x05, 0x2B, 0x00, 0xD0, 0x93, 0xE0, 0x1A, 0xE0, 0x10, 0x2B, 0x52, 0xD0, 0x03, 0xDC, + 0x0E, 0x2B, 0x2E, 0xD0, 0x33, 0xDC, 0x27, 0xE0, 0xAF, 0x2B, 0x70, 0xD0, 0xF6, 0x2B, 0x7D, 0xD0, + 0xAE, 0x2B, 0x00, 0xD0, 0x84, 0xE0, 0x65, 0xE0, 0x43, 0x4A, 0x31, 0x21, 0x11, 0x70, 0x03, 0x21, + 0x41, 0x4A, 0xC9, 0x1A, 0xE0, 0x20, 0x88, 0x54, 0x04, 0x22, 0xD3, 0x1A, 0x20, 0x21, 0x1B, 0xE0, + 0x3E, 0x4B, 0x9B, 0x8D, 0x1A, 0xB2, 0xFF, 0x2A, 0x00, 0xDD, 0xFF, 0x23, 0x3A, 0x4A, 0x4F, 0xE0, + 0x3B, 0x4B, 0x02, 0x22, 0x1B, 0x78, 0xD2, 0x1A, 0x4E, 0xE0, 0x37, 0x4A, 0x14, 0x21, 0x11, 0x70, + 0x0C, 0x22, 0x35, 0x49, 0xD0, 0x1A, 0x42, 0x54, 0x0D, 0x21, 0x33, 0x4A, 0xC9, 0x1A, 0x02, 0x20, + 0x88, 0x54, 0x0E, 0x22, 0xD3, 0x1A, 0x10, 0x21, 0x2F, 0x4A, 0x99, 0x54, 0x58, 0xE0, 0x31, 0x4B, + 0x1B, 0x78, 0x00, 0x2B, 0x05, 0xD0, 0x30, 0x4B, 0x1A, 0x68, 0xE0, 0x23, 0xDB, 0x00, 0x1A, 0x42, + 0x0E, 0xD1, 0x2E, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x05, 0xD1, 0x80, 0x22, 0xD2, 0x05, 0x51, 0x69, + 0x08, 0x20, 0x01, 0x43, 0x51, 0x61, 0x1A, 0x78, 0x06, 0x21, 0x4A, 0x43, 0xD2, 0xB2, 0x1A, 0x70, + 0x26, 0x4B, 0x20, 0xE0, 0x23, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x05, 0xD0, 0x22, 0x49, 0xE0, 0x23, + 0x0A, 0x68, 0xDB, 0x00, 0x1A, 0x42, 0x01, 0xD1, 0x21, 0x4B, 0x19, 0x68, 0x21, 0x4B, 0x1F, 0x4A, + 0x1D, 0x68, 0x14, 0x78, 0x18, 0x1C, 0x00, 0x23, 0xA5, 0x42, 0x09, 0xDA, 0x02, 0x68, 0x16, 0x4D, + 0x8A, 0x18, 0xD4, 0x5C, 0x5A, 0x19, 0x01, 0x33, 0x14, 0x70, 0x08, 0x2B, 0xF6, 0xD1, 0x1F, 0xE0, + 0x13, 0x70, 0x1D, 0xE0, 0x18, 0x4B, 0x1A, 0x78, 0x0F, 0x4B, 0x1A, 0x70, 0x18, 0xE0, 0x17, 0x49, + 0x14, 0x4A, 0x00, 0x23, 0x0C, 0x68, 0x10, 0x68, 0x0B, 0x4D, 0xC0, 0x18, 0x20, 0x18, 0x04, 0x78, + 0x58, 0x19, 0x01, 0x33, 0x04, 0x70, 0x08, 0x2B, 0xF4, 0xD1, 0x09, 0xE0, 0x0D, 0x4B, 0x10, 0x4A, + 0x1B, 0x68, 0x05, 0x49, 0xDB, 0x00, 0x9B, 0x18, 0x1A, 0x68, 0x5B, 0x68, 0x0A, 0x60, 0x4B, 0x60, + 0x30, 0xBD, 0xC0, 0x46, 0x1C, 0x06, 0x00, 0x20, 0x10, 0x00, 0x00, 0x50, 0xC8, 0x0B, 0x00, 0x20, + 0x76, 0x07, 0x00, 0x20, 0x6C, 0x07, 0x00, 0x20, 0x68, 0x11, 0x00, 0x20, 0x18, 0x0C, 0x00, 0x20, + 0x1C, 0x0C, 0x00, 0x20, 0x18, 0x06, 0x00, 0x20, 0x21, 0x0A, 0x00, 0x20, 0x64, 0x0F, 0x00, 0x20, + 0x58, 0x0A, 0x00, 0x20, 0x70, 0xB5, 0x12, 0x28, 0x00, 0xD1, 0x34, 0xE1, 0x13, 0xDC, 0x07, 0x28, + 0x00, 0xD1, 0x1E, 0xE1, 0x05, 0xDC, 0x02, 0x28, 0x24, 0xD0, 0x04, 0x28, 0x00, 0xD0, 0xBB, 0xE1, + 0x2D, 0xE0, 0x0D, 0x28, 0x00, 0xDA, 0xB7, 0xE1, 0x0E, 0x28, 0x00, 0xDC, 0x19, 0xE1, 0x0F, 0x28, + 0x00, 0xD0, 0xB1, 0xE1, 0x1A, 0xE1, 0x19, 0x28, 0x00, 0xD1, 0x77, 0xE1, 0x09, 0xDC, 0x16, 0x28, + 0x00, 0xD1, 0x5F, 0xE1, 0x18, 0x28, 0x00, 0xD1, 0x6E, 0xE1, 0x14, 0x28, 0x00, 0xD0, 0xA3, 0xE1, + 0x46, 0xE1, 0x1C, 0x28, 0x00, 0xD1, 0x9B, 0xE1, 0x20, 0x28, 0x06, 0xD0, 0x1A, 0x28, 0x00, 0xD0, + 0x9A, 0xE1, 0x65, 0xE1, 0x03, 0x22, 0xB4, 0x4B, 0xEF, 0xE0, 0xB4, 0x4A, 0x00, 0x23, 0x13, 0x70, + 0xB3, 0x4A, 0x13, 0x70, 0xB3, 0x4A, 0x13, 0x70, 0xB3, 0x4A, 0x13, 0x70, 0x8C, 0xE1, 0xB3, 0x49, + 0xB3, 0x4B, 0x08, 0x78, 0x00, 0x22, 0x1A, 0x70, 0x1C, 0x1C, 0xB2, 0x4B, 0x90, 0x42, 0x45, 0xD1, + 0xB1, 0x4A, 0x0C, 0x21, 0x52, 0x5E, 0xD9, 0x68, 0x91, 0x42, 0x2A, 0xDA, 0x06, 0xCB, 0x54, 0x00, + 0xA6, 0x4B, 0xCC, 0x42, 0x06, 0xD5, 0x18, 0x78, 0x44, 0x1C, 0x1C, 0x70, 0x0A, 0x28, 0x02, 0xD9, + 0xA7, 0x4B, 0x01, 0x20, 0x18, 0x70, 0x51, 0x18, 0x00, 0x29, 0x36, 0xDD, 0xA7, 0x49, 0x00, 0x23, + 0xC8, 0x5E, 0x9F, 0x4B, 0x00, 0x28, 0x03, 0xDB, 0x02, 0x25, 0x4C, 0x5F, 0x00, 0x2C, 0x03, 0xDA, + 0x32, 0x32, 0x05, 0xDB, 0x07, 0x30, 0x03, 0xDB, 0x02, 0x26, 0x8A, 0x5F, 0x07, 0x32, 0x05, 0xDA, + 0x1A, 0x78, 0x51, 0x1C, 0x19, 0x70, 0x14, 0x2A, 0x1F, 0xD9, 0x14, 0xE0, 0x00, 0x22, 0x1A, 0x70, + 0x1B, 0xE0, 0x9A, 0x4A, 0x00, 0x20, 0x11, 0x5E, 0x04, 0x31, 0x03, 0xDA, 0x02, 0x21, 0x52, 0x5E, + 0x04, 0x32, 0x08, 0xDB, 0x9A, 0x68, 0x0F, 0x2A, 0x0F, 0xDC, 0x9A, 0x69, 0x14, 0x2A, 0x0C, 0xDD, + 0xDB, 0x69, 0x05, 0x2B, 0x09, 0xDD, 0x01, 0x22, 0x8D, 0x4B, 0xE8, 0xE7, 0x59, 0x68, 0x00, 0x29, + 0x02, 0xDA, 0x1A, 0x68, 0x8A, 0x18, 0xD2, 0x0F, 0x22, 0x70, 0x88, 0x4B, 0x1C, 0x78, 0x00, 0x2C, + 0x4A, 0xD1, 0x8B, 0x4B, 0x1B, 0x78, 0x05, 0x2B, 0x46, 0xD8, 0x7F, 0x4B, 0x1B, 0x78, 0x00, 0x2B, + 0x42, 0xD0, 0x84, 0x4A, 0xD0, 0x69, 0x13, 0x28, 0x3E, 0xDC, 0x93, 0x68, 0x07, 0x2B, 0x3B, 0xDD, + 0x1E, 0x2B, 0x39, 0xDC, 0xD5, 0x68, 0x2E, 0x1C, 0x13, 0x36, 0x35, 0xDB, 0x11, 0x68, 0x6D, 0x29, + 0x1E, 0xDC, 0x12, 0x6A, 0x0A, 0x26, 0x00, 0x2A, 0x00, 0xDA, 0x76, 0x42, 0x56, 0x43, 0x8E, 0x42, + 0x20, 0xDC, 0x18, 0x29, 0x01, 0xDC, 0x00, 0x2A, 0x1C, 0xDB, 0x0C, 0x2B, 0x1A, 0xDD, 0x08, 0x28, + 0x02, 0xDD, 0x19, 0x2B, 0x16, 0xDD, 0x03, 0xE0, 0x04, 0x28, 0x01, 0xDD, 0x15, 0x2B, 0x11, 0xDD, + 0x72, 0x4B, 0x00, 0x26, 0x9A, 0x5F, 0x02, 0x26, 0x9B, 0x5F, 0xD3, 0x18, 0x09, 0x33, 0x09, 0xDB, + 0x0A, 0x28, 0x11, 0xDD, 0x09, 0x35, 0x03, 0xDB, 0x6A, 0x4B, 0x5B, 0x68, 0x00, 0x2B, 0x0B, 0xD1, + 0x95, 0x29, 0x09, 0xDC, 0x63, 0x4A, 0x13, 0x78, 0x59, 0x1C, 0x11, 0x70, 0x14, 0x2B, 0x09, 0xD9, + 0x63, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0x05, 0xE0, 0x5E, 0x4B, 0x00, 0x22, 0x1A, 0x70, 0x94, 0x42, + 0x00, 0xD0, 0xE1, 0xE0, 0x00, 0x23, 0x63, 0x4C, 0x18, 0x1C, 0x19, 0x1C, 0x1A, 0x19, 0x95, 0x8A, + 0x0A, 0x3D, 0xAD, 0xB2, 0x14, 0x2D, 0x01, 0xD8, 0x01, 0x31, 0xC9, 0xB2, 0xE3, 0x32, 0xFF, 0x32, + 0x12, 0x88, 0x0A, 0x3A, 0x92, 0xB2, 0x14, 0x2A, 0x01, 0xD8, 0x01, 0x30, 0xC0, 0xB2, 0x02, 0x33, + 0x12, 0x2B, 0xEB, 0xD1, 0x00, 0x23, 0xFC, 0x24, 0x56, 0x4D, 0x1A, 0x1C, 0x64, 0x00, 0x5E, 0x19, + 0xB6, 0x8C, 0x0A, 0x3E, 0xB6, 0xB2, 0x1E, 0x2E, 0x01, 0xD8, 0x01, 0x32, 0xD2, 0xB2, 0x2A, 0x33, + 0xA3, 0x42, 0xF4, 0xD1, 0x06, 0x24, 0x48, 0x4B, 0x84, 0x42, 0x06, 0xD3, 0x8C, 0x42, 0x89, 0x41, + 0x49, 0x42, 0x00, 0x29, 0x01, 0xD1, 0xA2, 0x42, 0x09, 0xD9, 0x1A, 0x78, 0x51, 0x1C, 0x19, 0x70, + 0x0A, 0x2A, 0x00, 0xD8, 0xA8, 0xE0, 0x42, 0x4B, 0x01, 0x22, 0x1A, 0x70, 0xA4, 0xE0, 0x19, 0x70, + 0xA2, 0xE0, 0x3E, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD0, 0x9D, 0xE0, 0xFF, 0xF7, 0xF0, 0xF9, + 0x9A, 0xE0, 0x41, 0x4B, 0x04, 0x20, 0x1B, 0x68, 0x98, 0x47, 0x95, 0xE0, 0xFE, 0xF7, 0x7A, 0xFF, + 0xFE, 0xF7, 0x48, 0xFD, 0x90, 0xE0, 0x30, 0x4B, 0x1A, 0x78, 0x00, 0x2A, 0x09, 0xD0, 0x3B, 0x49, + 0x09, 0x68, 0x00, 0x29, 0x05, 0xDD, 0x3A, 0x49, 0x09, 0x68, 0x00, 0x29, 0x01, 0xD1, 0x01, 0x3A, + 0x1A, 0x70, 0x38, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x00, 0xD1, 0x7D, 0xE0, 0x33, 0x4B, 0x36, 0x4C, + 0x1B, 0x68, 0x00, 0x2B, 0x04, 0xDD, 0x23, 0x68, 0x00, 0x2B, 0x01, 0xD1, 0xFC, 0xF7, 0x78, 0xFE, + 0x23, 0x68, 0x00, 0x2B, 0x11, 0xDC, 0x31, 0x4B, 0x1B, 0x78, 0x03, 0x2B, 0x03, 0xD8, 0x30, 0x4B, + 0x1B, 0x78, 0x03, 0x2B, 0x68, 0xD9, 0x23, 0x4B, 0x1B, 0x69, 0x13, 0x2B, 0x64, 0xDC, 0x0C, 0x2B, + 0x62, 0xDD, 0x2C, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x5E, 0xD1, 0xFC, 0xF7, 0x35, 0xFE, 0x5B, 0xE0, + 0x29, 0x4B, 0x1B, 0x78, 0x00, 0x2B, 0x57, 0xD1, 0x1B, 0x4B, 0x06, 0x22, 0x19, 0x1C, 0x1A, 0x76, + 0x38, 0x31, 0x0A, 0x22, 0xDA, 0x85, 0x0A, 0x70, 0x01, 0x22, 0xDA, 0x72, 0x52, 0x42, 0x98, 0x85, + 0x9A, 0x81, 0x49, 0xE0, 0x21, 0x4B, 0x07, 0x33, 0xDB, 0x7F, 0x00, 0x2B, 0x44, 0xD0, 0x12, 0x4B, + 0x87, 0x22, 0x52, 0x00, 0x9A, 0x80, 0x20, 0x22, 0x9A, 0x71, 0x05, 0x22, 0x1A, 0x72, 0x01, 0x22, + 0x5A, 0x72, 0x1E, 0x22, 0x9A, 0x72, 0x37, 0xE0, 0x01, 0x20, 0x02, 0xE0, 0x02, 0x20, 0x00, 0xE0, + 0x00, 0x20, 0xFB, 0xF7, 0x1B, 0xFF, 0x2F, 0xE0, 0xA3, 0x07, 0x00, 0x20, 0xA5, 0x07, 0x00, 0x20, + 0xA6, 0x07, 0x00, 0x20, 0xA7, 0x07, 0x00, 0x20, 0xA8, 0x07, 0x00, 0x20, 0x76, 0x07, 0x00, 0x20, + 0xA0, 0x07, 0x00, 0x20, 0xAC, 0x07, 0x00, 0x20, 0xC8, 0x0B, 0x00, 0x20, 0xBE, 0x0B, 0x00, 0x20, + 0xA4, 0x07, 0x00, 0x20, 0x28, 0x0D, 0x00, 0x20, 0x18, 0x07, 0x00, 0x20, 0xE0, 0x07, 0x00, 0x20, + 0x20, 0x0C, 0x00, 0x20, 0x6E, 0x07, 0x00, 0x20, 0x0C, 0x08, 0x00, 0x20, 0x44, 0x08, 0x00, 0x20, + 0x45, 0x08, 0x00, 0x20, 0x0A, 0x07, 0x00, 0x20, 0x40, 0x06, 0x00, 0x20, 0x58, 0x0A, 0x00, 0x20, + 0x02, 0x4B, 0x18, 0x78, 0xFC, 0xF7, 0x0E, 0xF8, 0x70, 0xBD, 0xC0, 0x46, 0x6D, 0x11, 0x00, 0x20, + 0x01, 0x00, 0x00, 0x02, 0x74, 0x11, 0x00, 0x20, 0x05, 0xFF, 0xFF, 0x02, 0x01, 0x10, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x20, 0x01, 0x00, 0x13, 0x00, 0x14, 0x00, 0x9D, 0x00, + 0x14, 0x00, 0x43, 0x01, 0x14, 0x00, 0xCD, 0x01, 0x14, 0x00, 0x58, 0x00, 0x43, 0x00, 0xF0, 0x00, + 0x43, 0x00, 0x88, 0x01, 0x43, 0x00, 0x13, 0x00, 0x73, 0x00, 0xCD, 0x01, 0x73, 0x00, 0x58, 0x00, + 0xA2, 0x00, 0xF0, 0x00, 0xA2, 0x00, 0x88, 0x01, 0xA2, 0x00, 0x13, 0x00, 0xD2, 0x00, 0x9D, 0x00, + 0xD2, 0x00, 0x43, 0x01, 0xD2, 0x00, 0xCD, 0x01, 0xD2, 0x00, 0x58, 0x00, 0x01, 0x01, 0xF0, 0x00, + 0x01, 0x01, 0x88, 0x01, 0x01, 0x01, 0x13, 0x00, 0x31, 0x01, 0xCD, 0x01, 0x31, 0x01, 0x58, 0x00, + 0x60, 0x01, 0xF0, 0x00, 0x60, 0x01, 0x88, 0x01, 0x60, 0x01, 0x9D, 0x00, 0x90, 0x01, 0x43, 0x01, + 0x90, 0x01, 0x58, 0x00, 0xC0, 0x01, 0xF0, 0x00, 0xC0, 0x01, 0x88, 0x01, 0xC0, 0x01, 0x13, 0x00, + 0xEF, 0x01, 0xCD, 0x01, 0xEF, 0x01, 0x58, 0x00, 0x1F, 0x02, 0xF0, 0x00, 0x1F, 0x02, 0x88, 0x01, + 0x1F, 0x02, 0x13, 0x00, 0x4E, 0x02, 0x9D, 0x00, 0x4E, 0x02, 0x43, 0x01, 0x4E, 0x02, 0xCD, 0x01, + 0x4E, 0x02, 0x58, 0x00, 0x7E, 0x02, 0xF0, 0x00, 0x7E, 0x02, 0x88, 0x01, 0x7E, 0x02, 0x13, 0x00, + 0xAD, 0x02, 0xCD, 0x01, 0xAD, 0x02, 0x58, 0x00, 0xDD, 0x02, 0xF0, 0x00, 0xDD, 0x02, 0x88, 0x01, + 0xDD, 0x02, 0x13, 0x00, 0x0C, 0x03, 0x9D, 0x00, 0x0C, 0x03, 0x43, 0x01, 0x0C, 0x03, 0xCD, 0x01, + 0x0C, 0x03, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x64, 0x99, 0x21, 0xD0, + 0xF6, 0x48, 0x4D, 0x45, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x28 +}; + diff --git a/drivers/input/touchscreen/mms134s/mms134s_sec.c b/drivers/input/touchscreen/mms134s/mms134s_sec.c new file mode 100644 index 00000000..e578ceed --- /dev/null +++ b/drivers/input/touchscreen/mms134s/mms134s_sec.c @@ -0,0 +1,1000 @@ +static void set_cmd_result(struct mms_fac_data *fac_data, char *buff, int len) +{ + strncat(fac_data->cmd_result, buff, len); +} + +static void set_default_result(struct mms_fac_data *fac_data) +{ + char delim = ':'; + + memset(fac_data->cmd_result, 0x00, ARRAY_SIZE(fac_data->cmd_result)); + memset(fac_data->cmd_buff, 0x00, ARRAY_SIZE(fac_data->cmd_buff)); + memcpy(fac_data->cmd_result, fac_data->cmd, strlen(fac_data->cmd)); + strncat(fac_data->cmd_result, &delim, 1); +} + +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_info *info = dev_get_drvdata(dev); + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + char buff[16] = {0,}; + + dev_info(&client->dev, "cmd status %d\n", fac_data->cmd_state); + + switch (fac_data->cmd_state) { + case CMD_STATUS_WAITING: + sprintf(buff, "%s", "WAITING"); + break; + case CMD_STATUS_RUNNING: + sprintf(buff, "%s", "RUNNING"); + break; + case CMD_STATUS_OK: + sprintf(buff, "%s", "OK"); + break; + case CMD_STATUS_FAIL: + sprintf(buff, "%s", "FAIL"); + break; + case CMD_STATUS_NOT_APPLICABLE: + sprintf(buff, "%s", "NOT_APPLICABLE"); + break; + default: + sprintf(buff, "%s", "NOT_APPLICABLE"); + break; + } + + return sprintf(buf, "%s\n", buff); +} + +static ssize_t show_cmd_result(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_info *info = dev_get_drvdata(dev); + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + + dev_info(&client->dev, "cmd result %s\n", fac_data->cmd_result); + + mutex_lock(&fac_data->cmd_lock); + fac_data->cmd_is_running = false; + mutex_unlock(&fac_data->cmd_lock); + + fac_data->cmd_state = CMD_STATUS_WAITING; + + return sprintf(buf, "%s", fac_data->cmd_result); +} + +static int update_from_req_fw(struct mms_info *info) +{ + struct i2c_client *client = info->client; + const char *path = info->pdata->inkernel_fw_name; + const struct firmware *fw; + int ret = 0; + + dev_info(&client->dev, "%s : firmware load %s\n", __func__, path); + + ret = request_firmware(&fw, path, &client->dev); + if (ret) { + dev_err(&client->dev, "Failed to request built-in fw (%d)\n", ret); + goto out; + } + + ret = mms_flash_fw(fw, info); + release_firmware(fw); + +out: + return ret; +} + +static int update_from_ums(struct mms_info *info) +{ + struct i2c_client *client = info->client; + const char *path = info->pdata->ums_fw_name; + mm_segment_t old_fs; + struct file *fp; + long fsize, nread; + struct firmware fw; + u8 *buff; + int ret = 0; + + dev_info(&client->dev, "%s : file open %s\n", __func__, path); + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + fp = filp_open(path, O_RDONLY, S_IRUSR); + if (IS_ERR(fp)) { + dev_err(&client->dev, "Failed to open file\n"); + ret = PTR_ERR(fp); + goto err_file_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_mem_alloc; + } + + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (fsize != nread) { + dev_err(&client->dev, "Failed to read file correctly\n"); + ret = -EPERM; + goto err_file_read; + } + + fw.size = fsize; + fw.data = buff; + ret = mms_flash_fw(&fw, info); + +err_file_read: + kfree(buff); +err_mem_alloc: + filp_close(fp, NULL); +err_file_open: + set_fs(old_fs); + + return ret; +} + +static void fw_update(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int fw_type = fac_data->cmd_param[0]; + int ret; + + set_default_result(fac_data); + + if (!info->enabled) { + dev_err(&client->dev, "%s : TSP is disabled\n"); + goto out; + } + + mutex_lock(&info->input_dev->mutex); + disable_irq(info->irq); + + switch (fw_type) { + case FW_FROM_BUILT_IN: + ret = update_from_req_fw(info); + break; + case FW_FROM_UMS: + ret = update_from_ums(info); + break; + default: + dev_err(&client->dev, + "%s : Invalid update type(%d)\n", __func__, fw_type); + goto err_update; + break; + } + + if (ret) { + dev_err(&client->dev, "%s : Failed fw update(%d)\n", __func__, ret); + goto err_update; + } + + enable_irq(info->irq); + mutex_unlock(&info->input_dev->mutex); + + fac_data->cmd_state = (ret) ? CMD_STATUS_FAIL : CMD_STATUS_OK; + sprintf(fac_data->cmd_buff, "%s", (ret) ? "NG" : "OK"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; + +err_update: + enable_irq(info->irq); + mutex_unlock(&info->input_dev->mutex); +out: + fac_data->cmd_state = CMD_STATUS_FAIL; + sprintf(fac_data->cmd_buff, "%s", "NG"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + return; +} + +static void get_threshold(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + u8 buff; + + set_default_result(fac_data); + + buff = i2c_smbus_read_byte_data(info->client, MMS_THRESHOLD); + if (buff < 0) { + dev_err(&client->dev, "Failed to read threshold (%d)\n", buff); + goto out; + } + + fac_data->cmd_state = CMD_STATUS_OK; + sprintf(fac_data->cmd_buff, "%d", buff); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; + +out: + fac_data->cmd_state = FAIL; + sprintf(fac_data->cmd_buff, "%s", "NG"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + return ; +} +/* +static void module_off_master(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + struct i2c_client *client = info->client; + + set_default_result(info); + + if (info->pdata->vdd_on) + info->pdata->vdd_on(&info->client->dev, 0); + + sprintf(info->cmd_buff, "%s", "OK"); + set_cmd_result(info, info->cmd_buff, strlen(info->cmd_buff)); + info->cmd_state = CMD_STATUS_OK; + + dev_info(&client->dev, "%s: \"%s\"(%d)\n", __func__, + info->cmd_buff, strlen(info->cmd_buff)); + + return; +} + +static void module_on_master(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + struct i2c_client *client = info->client; + + set_default_result(info); + + mms_pwr_on_reset(info); + + sprintf(info->cmd_buff, "%s", "OK"); + set_cmd_result(info, info->cmd_buff, strlen(info->cmd_buff)); + info->cmd_state = CMD_STATUS_OK; + + dev_info(&client->dev, "%s: \"%s\"(%d)\n", __func__, + info->cmd_buff, strlen(info->cmd_buff)); + + return; +} +*/ +static void get_x_num(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + + set_default_result(fac_data); + + fac_data->cmd_state = CMD_STATUS_OK; + sprintf(fac_data->cmd_buff, "%d", fac_data->xnode_num); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; +} + +static void get_y_num(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + + set_default_result(fac_data); + + fac_data->cmd_state = CMD_STATUS_OK; + sprintf(fac_data->cmd_buff, "%d", fac_data->ynode_num); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; +} + +static int enter_test_mode(struct mms_info *info) +{ + struct i2c_client *client = info->client; + int ret = 0; + + disable_irq(info->irq); + + ret = i2c_smbus_write_byte_data( + client, MMS_UNIVERSAL_CMD, MMS_UNIV_ENTER_TEST); + if (ret < 0) { + dev_err(&client->dev, "Failed to enter test mode(%d)\n", ret); + goto out; + } + + do { + udelay(100); + } while (gpio_get_value(info->pdata->gpio_int)); + + ret = i2c_smbus_read_byte_data(client, MMS_EVENT_PKT); + dev_info(&client->dev, "event(%x)\n", ret); + + if (ret != MMS_TEST_MODE) { + dev_err(&client->dev, "Failed to check maker(%x)\n", ret); + ret = -EPERM; + goto out; + } + + return 0; + +out: + enable_irq(info->irq); + return ret; +} + +static int exit_test_mode(struct mms_info *info) +{ + struct i2c_client *client = info->client; + int ret = 0; + + ret = i2c_smbus_write_byte_data( + client, MMS_UNIVERSAL_CMD, MMS_UNIV_EXIT_TEST); + if (ret < 0) { + dev_err(&client->dev, "Failed to exit test mode(%d)\n", ret); + goto out; + } + + enable_irq(info->irq); + + return 0; + +out: + enable_irq(info->irq); + + return ret; +} + +static int read_cm_data_all(struct mms_info *info, u8 univ_cmd, + u8 univ_key_cmd) +{ + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int r, t; + int ret = 0; + u8 buf[256] = {0, }; + u8 reg[4] = {0, }; + s16 cm_data; + char data[5]; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + }, + }; + + ret = i2c_smbus_write_byte_data(client, MMS_UNIVERSAL_CMD, univ_cmd); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to send %x cmd(%d)\n", + __func__, univ_cmd, ret); + goto out; + } + + do { + udelay(100); + } while (gpio_get_value(info->pdata->gpio_int)); + + ret = i2c_smbus_read_byte_data(client, MMS_UNIVERSAL_RESULT); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed 0x%x test(%d)\n", __func__, + univ_cmd, ret); + goto out; + } + + msleep(1); + + pr_info("cm_data\n"); + pr_info("view\n"); + for (r = 0 ; r < fac_data->xnode_num; r++) { + reg[0] = MMS_UNIVERSAL_CMD; + reg[1] = univ_cmd + 1; /* get univ_cmd value from node */ + reg[2] = 0xFF; + reg[3] = r; + msg[0].len = 4; + + if (i2c_transfer(client->adapter, &msg[0], 1) != 1) { + dev_err(&client->dev, "%s : Failed to send cmd for node\n", + __func__); + ret = -EPERM; + goto out; + } + + while (gpio_get_value(info->pdata->gpio_int)); + + ret = i2c_smbus_read_byte_data(client, MMS_UNIVERSAL_RESULT_SZ); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read node result size\n", + __func__); + goto out; + } + + reg[0] = MMS_UNIVERSAL_RESULT; + msg[0].len = 1; + msg[1].len = ret; + msg[1].buf = buf; + + if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) + != ARRAY_SIZE(msg)) { + dev_err(&client->dev, "%s : Failed to read node value\n", + __func__); + ret = -EPERM; + goto out; + } + + for (t = 0; t < fac_data->ynode_num; t++){ + cm_data = (s16)(buf[2 * t] | (buf[(2 * t) + 1] << 8)); + pr_info("%d\n", cm_data); + } + pr_info("---------\n"); + } + +#if MMS_HAS_TOUCH_KEY + pr_info("key\n"); + if (fac_data->keynode_num) { + reg[0] = MMS_UNIVERSAL_CMD; + reg[1] = univ_key_cmd; + reg[2] = 0xFF; + reg[3] = 0x00; + msg[0].len = 4; + + if (i2c_transfer(client->adapter, &msg[0],1) != 1) { + dev_err(&client->dev, "%s : Failed to send cmd for key\n", + __func__); + ret = EPERM; + goto out; + } + + while (gpio_get_value(info->pdata->gpio_int)); + + ret = i2c_smbus_read_byte_data(client, MMS_UNIVERSAL_RESULT_SZ); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read key result size\n", + __func__); + goto out; + } + + reg[0] = MMS_UNIVERSAL_RESULT; + msg[0].len = 1; + msg[1].len = ret; + msg[1].buf = buf; + + if(i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) + != ARRAY_SIZE(msg)){ + ret = -EPERM; + goto out; + } + + for (t = 0; t < fac_data->keynode_num; t++) { + cm_data = (s16)(buf[2 * t] | (buf[(2 * t) + 1] << 8)); + pr_info("%d\n", cm_data); + } + } +#endif + +out: + return ret; +} + +static void run_cm_delta_read(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int ret; + + set_default_result(fac_data); + + ret = enter_test_mode(info); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to enter test mode\n", __func__); + goto out; + } + + ret = read_cm_data_all(info, MMS_UNIV_CM_DELTA, MMS_UNIV_GET_DELTA_KEY); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read cm data\n", __func__); + goto out; + } + + ret = exit_test_mode(info); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to exit test mode\n", __func__); + goto out; + } + + fac_data->cmd_state = CMD_STATUS_OK; +// sprintf(fac_data->cmd_buff, "%d,%d", raw_min, raw_max); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; + +out: + fac_data->cmd_state = CMD_STATUS_FAIL; + sprintf(fac_data->cmd_buff, "%s", "NG"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + return; +} + +static void run_cm_abs_read(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int ret; + + set_default_result(fac_data); + + ret = enter_test_mode(info); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to enter test mode\n", __func__); + goto out; + } + + ret = read_cm_data_all(info, MMS_UNIV_CM_ABS, MMS_UNIV_GET_ABS_KEY); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read cm data\n", __func__); + goto out; + } + + ret = exit_test_mode(info); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to exit test mode\n", __func__); + goto out; + } + + fac_data->cmd_state = CMD_STATUS_OK; +// sprintf(fac_data->cmd_buff, "%d,%d", raw_min, raw_max); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; + +out: + fac_data->cmd_state = CMD_STATUS_FAIL; + sprintf(fac_data->cmd_buff, "%s", "NG"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + return; +} + +static int read_raw_data_all(struct mms_info *info, u8 univ_cmd) +{ + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int r, t; + int ret = 0; + u8 buf[42] = {0, }; + u8 reg[4] = {0, }; + s16 raw_data; + char data[5]; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = reg, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + }, + }; + + pr_info("raw_data\n"); + pr_info("view\n"); + for (r = 0 ; r < fac_data->xnode_num ; r++) { + reg[0] = MMS_UNIVERSAL_CMD; + reg[1] = univ_cmd; + reg[2] = 0xFF; + reg[3] = r; + msg[0].len = 4; + + msleep(1); + + if (i2c_transfer(client->adapter, &msg[0], 1) != 1) { + dev_err(&client->dev, "%s : Failed to send cmd for node\n", + __func__); + ret = -EPERM; + goto out; + } + + ret = i2c_smbus_read_byte_data(client, MMS_UNIVERSAL_RESULT_SZ); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read node result size\n", + __func__); + goto out; + } + + reg[0] = MMS_UNIVERSAL_RESULT; + msg[0].len = 1; + msg[1].len = ret; + msg[1].buf = buf; + + if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) + != ARRAY_SIZE(msg)){ + ret = -EPERM; + goto out; + } + + ret >>= 1; + + for (t = 0 ; t < ret ; t++) { + raw_data = (s16)(buf[2 * t] | (buf[(2 * t) + 1] << 8)); + pr_info("%d\n", raw_data); + } + pr_info("---------\n"); + } + +#if MMS_HAS_TOUCH_KEY + pr_info("key\n"); + if (fac_data->keynode_num) { + reg[0] = MMS_UNIVERSAL_CMD; + reg[1] = univ_cmd + 1; /* univ_cmd for key */ + reg[2] = 0xFF; + reg[3] = 0x00; + msg[0].len = 4; + + if (i2c_transfer(client->adapter, &msg[0], 1) != 1) { + dev_err(&client->dev, "%s : Failed to send cmd for key\n", + __func__); + ret = EPERM; + goto out; + } + + while (gpio_get_value(info->pdata->gpio_int)); + + ret = i2c_smbus_read_byte_data(client, MMS_UNIVERSAL_RESULT_SZ); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read key result size\n", + __func__); + goto out; + } + + reg[0] = MMS_UNIVERSAL_RESULT; + msg[0].len = 1; + msg[1].len = ret; + msg[1].buf = buf; + + if (i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)) + != ARRAY_SIZE(msg)) { + ret = -EPERM; + return ret; + } + + for (t = 0; t < fac_data->keynode_num; t++){ + raw_data = (s16)(buf[2 * t] | (buf[(2 * t) + 1] << 8)); + pr_info("%d\n", raw_data); + } + } +#endif + +out: + return ret; +} + +static void run_intensity_read(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int ret; + + set_default_result(fac_data); + + disable_irq(info->irq); + + ret = read_raw_data_all(info, MMS_UNIV_INTENSITY); + if (ret < 0) { + dev_err(&client->dev, "%s : Failed to read raw data\n", __func__); + goto out; + } + + enable_irq(info->irq); + + fac_data->cmd_state = CMD_STATUS_OK; +// sprintf(fac_data->cmd_buff, "%d,%d", raw_min, raw_max); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; + +out: + enable_irq(info->irq); + + fac_data->cmd_state = CMD_STATUS_FAIL; + sprintf(fac_data->cmd_buff, "%s", "NG"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + + return; +} + +static void not_support_cmd(void *device_data) +{ + struct mms_info *info = (struct mms_info *)device_data; + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + + set_default_result(fac_data); + + sprintf(fac_data->cmd_buff, "%s", "NA"); + set_cmd_result(fac_data, fac_data->cmd_buff, strlen(fac_data->cmd_buff)); + fac_data->cmd_state = CMD_STATUS_NOT_APPLICABLE; + dev_info(&client->dev, "%s : %s\n", __func__, fac_data->cmd_buff); + + return; +} + +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func + +struct tsp_cmd { + struct list_head list; + const char *cmd_name; + void (*cmd_func)(void *device_data); +}; + +struct tsp_cmd tsp_cmds[] = { + {TSP_CMD("fw_update", fw_update),}, +/* {TSP_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {TSP_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {TSP_CMD("get_config_ver", not_support_cmd),},*/ + {TSP_CMD("get_threshold", get_threshold),}, + {TSP_CMD("module_off_master", not_support_cmd),}, + {TSP_CMD("module_on_master", not_support_cmd),}, + {TSP_CMD("module_off_slave", not_support_cmd),}, + {TSP_CMD("module_on_slave", not_support_cmd),}, +/* {TSP_CMD("get_chip_vendor", get_chip_vendor),}, + {TSP_CMD("get_chip_name", get_chip_name),},*/ + {TSP_CMD("get_x_num", get_x_num),}, + {TSP_CMD("get_y_num", get_y_num),}, +/* {TSP_CMD("run_reference_read", run_reference_read),}, + {TSP_CMD("run_inspection_read", run_inspection_read),},*/ + {TSP_CMD("run_cm_delta_read", run_cm_delta_read),}, + {TSP_CMD("run_cm_abs_read", run_cm_abs_read),}, + {TSP_CMD("run_intensity_read", run_intensity_read),}, +/* {TSP_CMD("get_reference", get_reference),}, + {TSP_CMD("get_cm_abs", get_cm_abs),}, + {TSP_CMD("get_inspection", get_inspection),}, + {TSP_CMD("get_cm_delta", get_inspection),}, + {TSP_CMD("get_intensity", get_intensity),},*/ + {TSP_CMD("not_support_cmd", not_support_cmd),}, +}; + +static ssize_t store_cmd(struct device *dev, struct device_attribute *devattr, + const char *buf, size_t count) +{ + struct mms_info *info = dev_get_drvdata(dev); + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + char *cur, *start, *end; + char buff[TSP_CMD_STR_LEN] = {0, }; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + + if (!info->enabled) { + dev_err(&client->dev, "%s: device is disabled\n", __func__); + goto err_out; + } + + if (fac_data->cmd_is_running) { + dev_err(&client->dev, "%s: other cmd is running\n", __func__); + goto err_out; + } + + /* check lock */ + mutex_lock(&fac_data->cmd_lock); + fac_data->cmd_is_running = true; + mutex_unlock(&fac_data->cmd_lock); + + fac_data->cmd_state = CMD_STATUS_RUNNING; + + for (i = 0; i < ARRAY_SIZE(fac_data->cmd_param); i++) + fac_data->cmd_param[i] = 0; + + len = (int)count; + + if (*(buf + len - 1) == '\n') + len--; + + memset(fac_data->cmd, 0x00, ARRAY_SIZE(fac_data->cmd)); + memcpy(fac_data->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(buff, buf, cur - buf); + else + memcpy(buff, buf, len); + + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &fac_data->cmd_list_head, list) { + if (!strcmp(buff, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &fac_data->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing TSP standard tset parameter */ + if (cur && cmd_found) { + cur++; + start = cur; + + do { + if (*cur == delim || cur - buf == len) { + memset(buff, 0x00, ARRAY_SIZE(buff)); + end = cur; + memcpy(buff, start, end - start); + *(buff + strlen(buff)) = '\0'; + kstrtol(buff, 10, fac_data->cmd_param + param_cnt); + start = cur + 1; + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + + dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + + for (i = 0; i < param_cnt; i++) + dev_info(&client->dev, "cmd param %d = %d\n", + i, fac_data->cmd_param[i]); + + tsp_cmd_ptr->cmd_func(info); + +err_out: + return count; +} + +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *touchscreen_attributes[] = { + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group touchscreen_attr_group = { + .attrs = touchscreen_attributes, +}; + +static int get_nodenum(struct mms_info *info) +{ + struct mms_fac_data *fac_data = info->fac_data; + struct i2c_client *client = info->client; + int ret; + + ret = i2c_smbus_read_byte_data(client, MMS_TX_NUM); + if (ret <= 0) { + dev_err(&client->dev, "Failed to read xnode num(%d)\n", ret); + return ret; + } + fac_data->xnode_num = ret; + + ret = i2c_smbus_read_byte_data(client, MMS_RX_NUM); + if (ret <= 0) { + dev_err(&client->dev, "Failed to read ynode num(%d)\n", ret); + return ret; + } + fac_data->ynode_num = ret; + + ret = i2c_smbus_read_byte_data(client, MMS_KEY_NUM); + if (ret <= 0) { + dev_err(&client->dev, "Failed to read keynode num(%d)\n", ret); + return ret; + } + fac_data->keynode_num = ret; + + return 0; +} + +extern struct class *sec_class; + +static int init_sec(struct mms_info *info) +{ + struct i2c_client *client = info->client; + struct mms_fac_data *fac_data; + int i; + int ret; + + fac_data = kzalloc(sizeof(struct mms_fac_data), GFP_KERNEL); + if (!fac_data) { + dev_err(&client->dev, "Failed to allocate factory data memory\n"); + return -ENOMEM; + } + info->fac_data = fac_data; + + mutex_init(&fac_data->cmd_lock); + fac_data->cmd_is_running = false; + + INIT_LIST_HEAD(&fac_data->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &fac_data->cmd_list_head); + + ret = get_nodenum(info); + if (ret) { + dev_err(&client->dev, "Failed to read node number(%d)\n", ret); + goto err_create_dev_ts; + } + +/* info->raw_cm_abs = kzalloc(raw_data_size, GFP_KERNEL); + info->raw_inspection = kzalloc(raw_data_size, GFP_KERNEL); + info->raw_intensity = kzalloc(raw_data_size, GFP_KERNEL); + info->raw_reference = kzalloc(raw_data_size, GFP_KERNEL); + if (!info->raw_cm_abs || !info->raw_inspection || + !info->raw_intensity || !info->raw_reference) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_create_dev_ts; + } +*/ + fac_data->fac_tsp_dev = device_create( + sec_class, NULL, (dev_t)NULL, info, "tsp"); + if (IS_ERR(fac_data->fac_tsp_dev)) { + ret = PTR_ERR(fac_data->fac_tsp_dev); + dev_err(&client->dev, + "Failed to create device for touch screen (%d)\n", ret); + ret = -ENODEV; + goto err_create_dev_ts; + } + + ret = sysfs_create_group( + &fac_data->fac_tsp_dev->kobj, &touchscreen_attr_group); + if (ret) { + dev_err(&client->dev, + "Failed to create sysfs for touch screen (%d)\n", ret); + ret = (ret > 0) ? -ret : ret; + goto err_create_ts_sysfs; + } + + return 0; + +err_create_ts_sysfs: + device_destroy(sec_class, (dev_t)NULL); +err_create_dev_ts: + kfree(fac_data); + + return ret; +} + +static void destroy_sec(struct mms_info *info) +{ + sysfs_remove_group( + &info->fac_data->fac_tsp_dev->kobj, &touchscreen_attr_group); + device_destroy(sec_class, (dev_t)NULL); + kfree(info->fac_data); +} \ No newline at end of file diff --git a/drivers/input/touchscreen/mms136_ts.c b/drivers/input/touchscreen/mms136_ts.c new file mode 100644 index 00000000..158fe60c --- /dev/null +++ b/drivers/input/touchscreen/mms136_ts.c @@ -0,0 +1,4039 @@ +/* + * mms_ts.c - Touchscreen driver for Melfas MMS-series touch controllers + * + * Copyright (C) 2011 Google Inc. + * Author: Dima Zavin + * Simon Wilson + * + * ISP reflashing code based on original code from Melfas. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#define DEBUG +/* #define VERBOSE_DEBUG */ +#define SEC_TSP_DEBUG +#define SEC_TSP_VERBOSE_DEBUG + +/* #define FORCE_FW_FLASH */ +/* #define FORCE_FW_PASS */ +/* #define ESD_DEBUG */ + +#define SEC_TSP_FACTORY_TEST +#define SEC_TKEY_FACTORY_TEST +#define SEC_TSP_FW_UPDATE +#define TSP_BUF_SIZE 1024 +#define FAIL -1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include "mms_ts_fw.h" + +#ifdef CONFIG_LEDS_CLASS +#include +#define TOUCHKEY_BACKLIGHT "button-backlight" +#endif + +#define MAX_FINGERS 10 +#define MAX_WIDTH 30 +#define MAX_PRESSURE 255 +#define MAX_ANGLE 90 +#define MIN_ANGLE -90 + +/* Registers */ +#define MMS_MODE_CONTROL 0x01 +#define MMS_XYRES_HI 0x02 +#define MMS_XRES_LO 0x03 +#define MMS_YRES_LO 0x04 + +#define MMS_INPUT_EVENT_PKT_SZ 0x0F +#define MMS_INPUT_EVENT0 0x10 +#ifdef CONFIG_TOUCHSCREEN_MMS144 +#define FINGER_EVENT_SZ 8 +#elif defined(CONFIG_TOUCHSCREEN_MMS136) +#define FINGER_EVENT_SZ 6 +#endif +#define MMS_CORE_VERSION 0xE1 +#define MMS_TSP_REVISION 0xF0 +#define MMS_HW_REVISION 0xF1 +#define MMS_COMPAT_GROUP 0xF2 +#define MMS_FW_VERSION 0xE3 /*core 5.3: F3->E3*/ + +enum { + ISP_MODE_FLASH_ERASE = 0x59F3, + ISP_MODE_FLASH_WRITE = 0x62CD, + ISP_MODE_FLASH_READ = 0x6AC9, +}; + +/* each address addresses 4-byte words */ +#define ISP_MAX_FW_SIZE (0x1F00 * 4) +#define ISP_IC_INFO_ADDR 0x1F00 +#define ISP_CAL_DATA_SIZE 256 + +#ifdef CONFIG_SEC_DVFS +#define TOUCH_BOOSTER 1 +#define TOUCH_BOOSTER_OFF_TIME 100 +#if TOUCH_BOOSTER +#include +#endif +#endif + +#ifdef SEC_TSP_FW_UPDATE + +#define WORD_SIZE 4 + +#define ISC_PKT_SIZE 1029 +#define ISC_PKT_DATA_SIZE 1024 +#define ISC_PKT_HEADER_SIZE 3 +#define ISC_PKT_NUM 31 + +#define ISC_ENTER_ISC_CMD 0x5F +#define ISC_ENTER_ISC_DATA 0x01 +#define ISC_CMD 0xAE +#define ISC_ENTER_UPDATE_DATA 0x55 +#define ISC_ENTER_UPDATE_DATA_LEN 9 +#define ISC_DATA_WRITE_SUB_CMD 0xF1 +#define ISC_EXIT_ISC_SUB_CMD 0x0F +#define ISC_EXIT_ISC_SUB_CMD2 0xF0 +#define ISC_CHECK_STATUS_CMD 0xAF +#define ISC_CONFIRM_CRC 0x03 +#define ISC_DEFAULT_CRC 0xFFFF + +#endif + +#ifdef SEC_TSP_FACTORY_TEST +#ifdef CONFIG_TOUCHSCREEN_MMS144 +#define TX_NUM 25 +#define RX_NUM 14 +#define NODE_NUM 350 /* 26x14 */ +#elif defined(CONFIG_TOUCHSCREEN_MMS136) +#define TX_NUM 20 +#define RX_NUM 12 +#define NODE_NUM 240 /* 20x12 */ +#endif + +/* self diagnostic */ +#define ADDR_CH_NUM 0x0B +#define ADDR_UNIV_CMD 0xA0 +#define CMD_ENTER_TEST 0x40 +#define CMD_EXIT_TEST 0x4F +#define CMD_CM_DELTA 0x41 +#define CMD_GET_DELTA 0x42 +#define CMD_CM_ABS 0X43 +#define CMD_GET_ABS 0X44 +#define CMD_CM_JITTER 0X45 +#define CMD_GET_JITTER 0X46 +#define CMD_GET_KEY_DELTA 0x4A +#define CMD_GET_KEY_ABS 0x4B +#define CMD_CM_KEY_JITTER 0x4C + +#define CMD_GET_INTEN 0x70 +#define CMD_GET_INTEN_KEY 0x71 +#define CMD_GET_REFER 0x72 +#define CMD_GET_REFER_KEY 0x73 +#define CMD_RESULT_SZ 0XAE +#define CMD_RESULT 0XAF + +/* VSC(Vender Specific Command) */ +#define MMS_VSC_CMD 0xB0 /* vendor specific command */ +#define MMS_VSC_MODE 0x1A /* mode of vendor */ + +#define MMS_VSC_CMD_ENTER 0X01 +#define MMS_VSC_CMD_CM_DELTA 0X02 +#define MMS_VSC_CMD_CM_ABS 0X03 +#define MMS_VSC_CMD_EXIT 0X05 +#define MMS_VSC_CMD_INTENSITY 0X04 +#define MMS_VSC_CMD_RAW 0X06 +#define MMS_VSC_CMD_REFER 0X07 + +#ifdef SEC_TKEY_FACTORY_TEST +#define VSC_INTENSITY_TK 0x14 +#define VSC_RAW_TK 0x16 +#define VSC_THRESHOLD_TK 0x18 +#endif + +#define TSP_CMD_STR_LEN 32 +#define TSP_CMD_RESULT_STR_LEN 512 +#define TSP_CMD_PARAM_NUM 8 +#endif /* SEC_TSP_FACTORY_TEST */ + +#define ISC_DL_MODE 0 + +#if ISC_DL_MODE /* ISC_DL_MODE start */ + +/* + * Default configuration of ISC mode + */ +#define DEFAULT_SLAVE_ADDR 0x48 + +#define SECTION_NUM 3 +#define SECTION_NAME_LEN 5 + +#define PAGE_HEADER 3 +#define PAGE_DATA 1024 +#define PAGE_TAIL 2 +#define PACKET_SIZE (PAGE_HEADER + PAGE_DATA + PAGE_TAIL) +#define TS_WRITE_REGS_LEN 1030 + +#define TIMEOUT_CNT 10 +#define STRING_BUF_LEN 100 + + +/* State Registers */ +#define MIP_ADDR_INPUT_INFORMATION 0x01 + +#define ISC_ADDR_VERSION 0xE1 +#define ISC_ADDR_SECTION_PAGE_INFO 0xE5 + +/* Config Update Commands */ +#define ISC_CMD_ENTER_ISC 0x5F +#define ISC_CMD_ENTER_ISC_PARA1 0x01 +#define ISC_CMD_UPDATE_MODE 0xAE +#define ISC_SUBCMD_ENTER_UPDATE 0x55 +#define ISC_SUBCMD_DATA_WRITE 0XF1 +#define ISC_SUBCMD_LEAVE_UPDATE_PARA1 0x0F +#define ISC_SUBCMD_LEAVE_UPDATE_PARA2 0xF0 +#define ISC_CMD_CONFIRM_STATUS 0xAF + +#define ISC_STATUS_UPDATE_MODE 0x01 +#define ISC_STATUS_CRC_CHECK_SUCCESS 0x03 + +#define ISC_CHAR_2_BCD(num) (((num/10)<<4) + (num%10)) +#define ISC_MAX(x, y) (((x) > (y)) ? (x) : (y)) + +static const char section_name[SECTION_NUM][SECTION_NAME_LEN] = { + "BOOT", "CORE", "CONF" +}; + +static const unsigned char crc0_buf[31] = { + 0x1D, 0x2C, 0x05, 0x34, 0x95, 0xA4, 0x8D, 0xBC, + 0x59, 0x68, 0x41, 0x70, 0xD1, 0xE0, 0xC9, 0xF8, + 0x3F, 0x0E, 0x27, 0x16, 0xB7, 0x86, 0xAF, 0x9E, + 0x7B, 0x4A, 0x63, 0x52, 0xF3, 0xC2, 0xEB +}; + +static const unsigned char crc1_buf[31] = { + 0x1E, 0x9C, 0xDF, 0x5D, 0x76, 0xF4, 0xB7, 0x35, + 0x2A, 0xA8, 0xEB, 0x69, 0x42, 0xC0, 0x83, 0x01, + 0x04, 0x86, 0xC5, 0x47, 0x6C, 0xEE, 0xAD, 0x2F, + 0x30, 0xB2, 0xF1, 0x73, 0x58, 0xDA, 0x99 +}; + +enum { + ISC_NONE = -1, + ISC_SUCCESS = 0, + ISC_FILE_OPEN_ERROR, + ISC_FILE_CLOSE_ERROR, + ISC_FILE_FORMAT_ERROR, + ISC_WRITE_BUFFER_ERROR, + ISC_I2C_ERROR, + ISC_UPDATE_MODE_ENTER_ERROR, + ISC_CRC_ERROR, + ISC_VALIDATION_ERROR, + ISC_COMPATIVILITY_ERROR, + ISC_UPDATE_SECTION_ERROR, + ISC_SLAVE_ERASE_ERROR, + ISC_SLAVE_DOWNLOAD_ERROR, + ISC_DOWNLOAD_WHEN_SLAVE_IS_UPDATED_ERROR, + ISC_INITIAL_PACKET_ERROR, + ISC_NO_NEED_UPDATE_ERROR, + ISC_LIMIT +}; + +enum { + EC_NONE = -1, + EC_DEPRECATED = 0, + EC_BOOTLOADER_RUNNING = 1, + EC_BOOT_ON_SUCCEEDED = 2, + EC_ERASE_END_MARKER_ON_SLAVE_FINISHED = 3, + EC_SLAVE_DOWNLOAD_STARTS = 4, + EC_SLAVE_DOWNLOAD_FINISHED = 5, + EC_2CHIP_HANDSHAKE_FAILED = 0x0E, + EC_ESD_PATTERN_CHECKED = 0x0F, + EC_LIMIT +}; + +struct tISCFWInfo_t { + unsigned char version; + unsigned char compatible_version; + unsigned char start_addr; + unsigned char end_addr; +}; + +static struct tISCFWInfo_t mbin_info[SECTION_NUM]; +static struct tISCFWInfo_t ts_info[SECTION_NUM]; +static bool section_update_flag[SECTION_NUM]; + +const struct firmware *fw_mbin[SECTION_NUM]; + +static unsigned char g_wr_buf[1024 + 3 + 2]; +#endif + +enum { + SEC_NONE = -1, + SEC_BOOTLOADER = 0, + SEC_CORE, + SEC_CONFIG, + SEC_LIMIT +}; + +int touch_is_pressed; +EXPORT_SYMBOL(touch_is_pressed); + +#define NUM_OF_KEY 4 + +enum fw_flash_mode { + ISP_FLASH, + ISC_FLASH, +}; + +enum { + BUILT_IN = 0, + UMS, +}; + +struct mms_ts_info { + struct i2c_client *client; + struct input_dev *input_dev; + char phys[32]; + + int max_x; + int max_y; + + bool invert_x; + bool invert_y; + int irq; + + struct mms_ts_platform_data *pdata; + + char *fw_name; + struct early_suspend early_suspend; +#ifdef CONFIG_SEC_DVFS +#if TOUCH_BOOSTER + struct delayed_work work_dvfs_off; + bool dvfs_lock_status; + struct mutex dvfs_lock; +#endif +#endif + + /* protects the enabled flag */ + struct mutex lock; + bool enabled; + +#ifdef SEC_TKEY_FACTORY_TEST + struct device *dev_tk; + bool *key_pressed; +#endif + enum fw_flash_mode fw_flash_mode; + + void (*register_cb)(struct tsp_callbacks *); + struct tsp_callbacks callbacks; + + bool ta_status; + bool noise_mode; + bool use_surface_touch; + bool use_touchkey; + unsigned char keycode[NUM_OF_KEY]; + +#if defined(SEC_TSP_DEBUG) || defined(SEC_TSP_VERBOSE_DEBUG) + unsigned char finger_state[MAX_FINGERS]; +#endif + +#if defined(SEC_TSP_FW_UPDATE) + u8 fw_update_state; +#endif + u8 fw_boot_ver; + u8 fw_core_ver; + u8 fw_ic_ver; + u8 palm_status; +#if defined(SEC_TSP_FACTORY_TEST) + struct list_head cmd_list_head; + u8 cmd_state; + char cmd[TSP_CMD_STR_LEN]; + int cmd_param[TSP_CMD_PARAM_NUM]; + char cmd_result[TSP_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; + + unsigned int reference[NODE_NUM]; + unsigned int raw[NODE_NUM]; /* CM_ABS */ + unsigned int inspection[NODE_NUM];/* CM_DELTA */ + unsigned int intensity[NODE_NUM]; + bool ft_flag; +#endif /* SEC_TSP_FACTORY_TEST */ +#ifdef CONFIG_LEDS_CLASS + struct led_classdev leds; + bool tkey_led_reserved; +#endif +}; + +struct mms_fw_image { + __le32 hdr_len; + __le32 data_len; + __le32 fw_ver; + __le32 hdr_ver; + u8 data[0]; +} __packed; + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void mms_ts_early_suspend(struct early_suspend *h); +static void mms_ts_late_resume(struct early_suspend *h); +#endif + +#if defined(SEC_TSP_FACTORY_TEST) +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func + +struct tsp_cmd { + struct list_head list; + const char *cmd_name; + void (*cmd_func)(void *device_data); +}; + +static void fw_update(void *device_data); +static void get_fw_ver_bin(void *device_data); +static void get_fw_ver_ic(void *device_data); +static void get_config_ver(void *device_data); +static void get_threshold(void *device_data); +static void module_off_master(void *device_data); +static void module_on_master(void *device_data); +static void get_chip_vendor(void *device_data); +static void get_chip_name(void *device_data); +static void get_reference(void *device_data); +static void get_cm_abs(void *device_data); +static void get_cm_delta(void *device_data); +static void get_intensity(void *device_data); +static void get_x_num(void *device_data); +static void get_y_num(void *device_data); +static void run_reference_read(void *device_data); +static void run_cm_abs_read(void *device_data); +static void run_cm_delta_read(void *device_data); +static void run_intensity_read(void *device_data); +static void not_support_cmd(void *device_data); + +struct tsp_cmd tsp_cmds[] = { + {TSP_CMD("fw_update", fw_update),}, + {TSP_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {TSP_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {TSP_CMD("get_config_ver", get_config_ver),}, + {TSP_CMD("get_threshold", get_threshold),}, + {TSP_CMD("module_off_master", module_off_master),}, + {TSP_CMD("module_on_master", module_on_master),}, + {TSP_CMD("module_off_slave", not_support_cmd),}, + {TSP_CMD("module_on_slave", not_support_cmd),}, + {TSP_CMD("get_chip_vendor", get_chip_vendor),}, + {TSP_CMD("get_chip_name", get_chip_name),}, + {TSP_CMD("get_x_num", get_x_num),}, + {TSP_CMD("get_y_num", get_y_num),}, + {TSP_CMD("get_reference", get_reference),}, + {TSP_CMD("get_cm_abs", get_cm_abs),}, + {TSP_CMD("get_cm_delta", get_cm_delta),}, + {TSP_CMD("get_intensity", get_intensity),}, + {TSP_CMD("run_reference_read", run_reference_read),}, + {TSP_CMD("run_cm_abs_read", run_cm_abs_read),}, + {TSP_CMD("run_cm_delta_read", run_cm_delta_read),}, + {TSP_CMD("run_intensity_read", run_intensity_read),}, + {TSP_CMD("not_support_cmd", not_support_cmd),}, +}; +#endif + +#ifdef CONFIG_LEDS_CLASS +static void msm_tkey_led_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + bool tkey_led_on; + + struct mms_ts_info *info = + container_of(led_cdev, struct mms_ts_info, leds); + + if (value) + tkey_led_on = true; + else + tkey_led_on = false; + + if (info->enabled) { + info->tkey_led_reserved = false; + info->pdata->tkey_led_vdd_on(tkey_led_on); + } else { + if (value != LED_OFF) + info->tkey_led_reserved = true; + } +} +#endif + +#ifdef CONFIG_SEC_DVFS +#if TOUCH_BOOSTER +static void set_dvfs_off(struct work_struct *work) +{ + struct mms_ts_info *info = container_of(work, + struct mms_ts_info, work_dvfs_off.work); + mutex_lock(&info->dvfs_lock); + set_freq_limit(DVFS_TOUCH_ID, -1); + info->dvfs_lock_status = false; + mutex_unlock(&info->dvfs_lock); +} + +static void set_dvfs_lock(struct mms_ts_info *info, uint32_t on) +{ + int ret = 0; + + mutex_lock(&info->dvfs_lock); + + if (on == 0) { + if (info->dvfs_lock_status) { + schedule_delayed_work(&info->work_dvfs_off, + msecs_to_jiffies(TOUCH_BOOSTER_OFF_TIME)); + } + } else if (on == 1) { + cancel_delayed_work(&info->work_dvfs_off); + if (!info->dvfs_lock_status) { + ret = set_freq_limit(DVFS_TOUCH_ID, MIN_TOUCH_LIMIT); + if (ret < 0) + dev_err(&info->client->dev, "%s: cpu lock failed(%d)\n", + __func__, ret); + info->dvfs_lock_status = true; + } + } else if (on == 2) { + cancel_delayed_work(&info->work_dvfs_off); + schedule_work(&info->work_dvfs_off.work); + } + + mutex_unlock(&info->dvfs_lock); +} +#endif +#endif + +static inline void mms_pwr_on_reset(struct mms_ts_info *info) +{ + struct i2c_adapter *adapter = to_i2c_adapter(info->client->dev.parent); + + if (!info->pdata->mux_fw_flash) { + dev_err(&info->client->dev, "missing platform data, can't do power-on-reset\n"); + return; + } + + i2c_lock_adapter(adapter); + info->pdata->mux_fw_flash(true); + + info->pdata->vdd_on(0); + gpio_direction_output(info->pdata->gpio_sda, 1); + gpio_direction_output(info->pdata->gpio_scl, 1); + gpio_direction_output(info->pdata->gpio_resetb, 1); + msleep(50); + info->pdata->vdd_on(1); + msleep(50); + + info->pdata->mux_fw_flash(false); + i2c_unlock_adapter(adapter); + + /* TODO: Seems long enough for the firmware to boot. + * Find the right value */ + msleep(250); +} +static void release_all_fingers(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + + int i; + + dev_dbg(&info->client->dev, "%s\n", __func__); + + for (i = 0; i < MAX_FINGERS; i++) { +#if defined(SEC_TSP_DEBUG) || defined(SEC_TSP_VERBOSE_DEBUG) + if (info->finger_state[i] == 1) + dev_notice(&client->dev, "finger %d up(force)\n", i); +#endif + info->finger_state[i] = 0; + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, + false); + } + input_sync(info->input_dev); +#ifdef CONFIG_SEC_DVFS +#if TOUCH_BOOSTER + set_dvfs_lock(info, 2); + dev_info(&client->dev, "dvfs_lock free.\n"); +#endif +#endif +} + +static void mms_set_noise_mode(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + + if (!(info->noise_mode && info->enabled)) + return; + dev_notice(&client->dev, "%s\n", __func__); + + if (info->ta_status) { + dev_notice(&client->dev, "noise_mode & TA connect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x30, 0x1); + } else { + dev_notice(&client->dev, "noise_mode & TA disconnect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x30, 0x2); + info->noise_mode = 0; + } +} + +static void reset_mms_ts(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + + if (info->enabled == false) + return; + + dev_notice(&client->dev, "%s++\n", __func__); + disable_irq_nosync(info->irq); + info->enabled = false; + touch_is_pressed = 0; + + release_all_fingers(info); + + mms_pwr_on_reset(info); + enable_irq(info->irq); + info->enabled = true; + + if (info->ta_status) { + dev_notice(&client->dev, "TA connect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x1); + } else { + dev_notice(&client->dev, "TA disconnect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x2); + mms_set_noise_mode(info); + } + + dev_notice(&client->dev, "%s--\n", __func__); +} + +static void melfas_ta_cb(struct tsp_callbacks *cb, bool ta_status) +{ + struct mms_ts_info *info = + container_of(cb, struct mms_ts_info, callbacks); + struct i2c_client *client = info->client; + + dev_notice(&client->dev, "%s\n", __func__); + + info->ta_status = ta_status; + + if (info->enabled) { + if (info->ta_status) { + dev_notice(&client->dev, "TA connect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x1); + } else { + dev_notice(&client->dev, "TA disconnect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x2); + mms_set_noise_mode(info); + } + } +} + +static irqreturn_t mms_ts_interrupt(int irq, void *dev_id) +{ + struct mms_ts_info *info = dev_id; + struct i2c_client *client = info->client; + u8 buf[MAX_FINGERS*FINGER_EVENT_SZ] = { 0 }; + int ret; + int i; + int sz; + u8 reg = MMS_INPUT_EVENT0; + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .buf = ®, + .len = 1, + }, { + .addr = client->addr, + .flags = I2C_M_RD, + .buf = buf, + }, + }; + + sz = i2c_smbus_read_byte_data(client, MMS_INPUT_EVENT_PKT_SZ); + if (sz < 0) { + pr_err("%s bytes=%d\n", __func__, sz); + for (i = 0; i < 50; i++) { + sz = i2c_smbus_read_byte_data(client, + MMS_INPUT_EVENT_PKT_SZ); + if (sz > 0) + break; + } + + if (i == 50) { + pr_err("i2c failed... reset!!\n"); + reset_mms_ts(info); + goto out; + } + } + /* BUG_ON(sz > MAX_FINGERS*FINGER_EVENT_SZ); */ + if (sz == 0) + goto out; + + if (sz > MAX_FINGERS*FINGER_EVENT_SZ) { + pr_err("abnormal data inputed.\n"); + goto out; + } + + msg[1].len = sz; + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (ret != ARRAY_SIZE(msg)) { + pr_err("failed to read %d bytes of touch data (%d)\n", + sz, ret); + goto out; + } + +#if defined(VERBOSE_DEBUG) + print_hex_dump(KERN_DEBUG, "mms_ts raw: ", + DUMP_PREFIX_OFFSET, 32, 1, buf, sz, false); + +#endif + if (buf[0] == 0x0F) { /* ESD */ + pr_debug("ESD DETECT.... reset!!\n"); + reset_mms_ts(info); + goto out; + } + + if (buf[0] == 0x0E) { /* NOISE MODE */ + pr_debug("noise mode enter!!\n"); + info->noise_mode = 1 ; + mms_set_noise_mode(info); + goto out; + } + + for (i = 0; i < sz; i += FINGER_EVENT_SZ) { + u8 *tmp = &buf[i]; + int id = (tmp[0] & 0xf) - 1; + int x = tmp[2] | ((tmp[1] & 0xf) << 8); + int y = tmp[3] | (((tmp[1] >> 4) & 0xf) << 8); + int angle = (tmp[5] >= 127) ? (-(256 - tmp[5])) : tmp[5]; + int palm = (buf[0] & 0x10) >> 4; + int type = (tmp[0] & 0x60) >> 5; + int action = (tmp[0] & 0x80) >> 7; + + if (info->use_surface_touch) { + if (palm) { + if (info->palm_status == 3) { + info->palm_status = 1; + } else { + info->palm_status = 3; + palm = 3; + } + } else { + if (info->palm_status == 2) { + info->palm_status = 0; + } else { + info->palm_status = 2; + palm = 2; + } + } + } + + if (info->use_touchkey && type == 0x02) { + input_report_key(info->input_dev, + info->keycode[id], action); +#ifdef SEC_TSP_DEBUG + pr_info("touchkey : keycode=%d action=%d\n", + info->keycode[id], action); +#else + pr_info("touchkey action=%d\n", action); +#endif +#ifdef SEC_TKEY_FACTORY_TEST + info->key_pressed[id] = action; +#endif + } else { + + if (info->invert_x) { + x = info->max_x - x; + if (x < 0) + x = 0; + } + if (info->invert_y) { + y = info->max_y - y; + if (y < 0) + y = 0; + } + if (id >= MAX_FINGERS) { + pr_err("finger id error [%d]\n", id); + reset_mms_ts(info); + goto out; + } + + if ((tmp[0] & 0x80) == 0) { +#if defined(SEC_TSP_DEBUG) + pr_info("fid[%d]: x=%d y=%d p=%d w=%d ", + id, x, y, tmp[5], tmp[4]); + if (info->use_surface_touch) + pr_cont("major=%d minor=%d angle=%d palm=%d\n", + tmp[6], tmp[7], angle, palm); + else + pr_cont("\n"); +#else + pr_info("finger [%d] up\n", id); +#endif + input_mt_slot(info->input_dev, id); + input_mt_report_slot_state(info->input_dev, + MT_TOOL_FINGER, false); + +#if defined(SEC_TSP_DEBUG) || defined(SEC_TSP_VERBOSE_DEBUG) + info->finger_state[id] = 0; +#endif + continue; + } + + //input_report_key(info->input_dev, BTN_TOUCH, 1); + + input_mt_slot(info->input_dev, id); + input_mt_report_slot_state(info->input_dev, + MT_TOOL_FINGER, true); + #if 1 + input_report_abs(info->input_dev, + ABS_MT_WIDTH_MAJOR, tmp[4]); + #endif + input_report_abs(info->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(info->input_dev, + ABS_MT_POSITION_Y, y); + #if 1 + + if (info->use_surface_touch) { + input_report_abs(info->input_dev, + ABS_MT_TOUCH_MAJOR, tmp[6]); + input_report_abs(info->input_dev, + ABS_MT_TOUCH_MINOR, tmp[7]); + +#if 0 /* SPRD's test code */ + input_report_abs(info->input_dev, + ABS_MT_ANGLE, angle); + input_report_abs(info->input_dev, + ABS_MT_PALM, palm); +#endif + } + #endif + //input_mt_sync(info->input_dev); + +#if defined(SEC_TSP_DEBUG) + if (info->finger_state[id] == 0) { + info->finger_state[id] = 1; + pr_info("finger id[%d]: x=%d y=%d p=%d w=%d ", + id, x, y, tmp[5], tmp[4]); + + if (info->use_surface_touch) + pr_cont("major=%d minor=%d angle=%d palm=%d\n", + tmp[6], tmp[7], angle, palm); + else + pr_cont("\n"); + } +#else + if (info->finger_state[id] == 0) { + info->finger_state[id] = 1; + pr_info("finger [%d] down\n", id); + } +#endif + } + } + + input_sync(info->input_dev); + touch_is_pressed = 0; + + for (i = 0; i < MAX_FINGERS; i++) { + if (info->finger_state[i] == 1) + touch_is_pressed++; + } + +#ifdef CONFIG_SEC_DVFS +#if TOUCH_BOOSTER + set_dvfs_lock(info, !!touch_is_pressed); +#endif +#endif + +out: + return IRQ_HANDLED; +} + +#if ISC_DL_MODE +static int mms100_i2c_read(struct i2c_client *client, + u16 addr, u16 length, u8 *value) +{ + struct i2c_adapter *adapter = client->adapter; + struct i2c_msg msg; + int ret = -1; + + msg.addr = client->addr; + msg.flags = 0x00; + msg.len = 1; + msg.buf = (u8 *) &addr; + + ret = i2c_transfer(adapter, &msg, 1); + + if (ret >= 0) { + msg.addr = client->addr; + msg.flags = I2C_M_RD; + msg.len = length; + msg.buf = (u8 *) value; + + ret = i2c_transfer(adapter, &msg, 1); + } + + if (ret < 0) + dev_err(&client->dev, "I2C read error : [%d]\n", ret); + + return ret; +} + + +static int mms100_reset(struct mms_ts_info *info) +{ + info->pdata->vdd_on(0); + msleep(30); + info->pdata->vdd_on(1); + msleep(300); + + return ISC_SUCCESS; +} +/* +static int mms100_check_operating_mode(struct i2c_client *_client, + const int _error_code) +{ + int ret; + unsigned char rd_buf = 0x00; + unsigned char count = 0; + + if(_client == NULL) + pr_err("[TSP ISC] _client is null\n"); + + ret = mms100_i2c_read(_client, ISC_ADDR_VERSION, 1, &rd_buf); + + if (ret<0) { + pr_info("[TSP ISC] %s,%d: i2c read fail[%d]\n", + __func__, __LINE__, ret); + return _error_code; + } + + return ISC_SUCCESS; +} +*/ +static int mms100_get_version_info(struct i2c_client *_client) +{ + int i, ret; + unsigned char rd_buf[8]; + + /* config version brust read (core, private, public) */ + ret = mms100_i2c_read(_client, ISC_ADDR_VERSION, 3, rd_buf); + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c read fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + for (i = 0; i < SECTION_NUM; i++) + ts_info[i].version = rd_buf[i]; + + ts_info[SEC_CORE].compatible_version = + ts_info[SEC_BOOTLOADER].version; + ts_info[SEC_CONFIG].compatible_version = + ts_info[SEC_CORE].version; + + ret = mms100_i2c_read(_client, ISC_ADDR_SECTION_PAGE_INFO, 8, rd_buf); + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c read fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + for (i = 0; i < SECTION_NUM; i++) { + ts_info[i].start_addr = rd_buf[i]; + ts_info[i].end_addr = rd_buf[i + SECTION_NUM + 1]; + } + + for (i = 0; i < SECTION_NUM; i++) { + dev_info(&_client->dev, "TS : Section(%d) version: 0x%02X\n", + i, ts_info[i].version); + dev_info(&_client->dev, "TS : Section(%d) Start Address: 0x%02X\n", + i, ts_info[i].start_addr); + dev_info(&_client->dev, "TS : Section(%d) End Address: 0x%02X\n", + i, ts_info[i].end_addr); + dev_info(&_client->dev, "TS : Section(%d) Compatibility: 0x%02X\n", + i, ts_info[i].compatible_version); + } + + return ISC_SUCCESS; +} + +static int mms100_seek_section_info(struct i2c_client *_client) +{ + int i; + char str_buf[STRING_BUF_LEN]; + char name_buf[SECTION_NAME_LEN]; + int version; + int page_num; + + const unsigned char *buf; + int next_ptr; + + for (i = 0; i < SECTION_NUM; i++) { + if (fw_mbin[i] == NULL) { + buf = NULL; + dev_err(&_client->dev, + "[TSP ISC] fw_mbin[%d]->data is NULL\n", i); + } else { + buf = fw_mbin[i]->data; + } + + if (buf == NULL) { + mbin_info[i].version = ts_info[i].version; + mbin_info[i].compatible_version = + ts_info[i].compatible_version; + mbin_info[i].start_addr = ts_info[i].start_addr; + mbin_info[i].end_addr = ts_info[i].end_addr; + } else { + next_ptr = 0; + + do { + sscanf(buf + next_ptr, "%s", str_buf); + next_ptr += strlen(str_buf) + 1; + } while (!strstr(str_buf, "SECTION_NAME")); + + sscanf(buf + next_ptr, "%s%s", str_buf, name_buf); + + if (strncmp(section_name[i], name_buf, + SECTION_NAME_LEN)) + return ISC_FILE_FORMAT_ERROR; + + do { + sscanf(buf + next_ptr, "%s", str_buf); + next_ptr += strlen(str_buf) + 1; + } while (!strstr(str_buf, "SECTION_VERSION")); + + sscanf(buf + next_ptr, "%s%d", str_buf, &version); + mbin_info[i].version = ISC_CHAR_2_BCD(version); + + do { + sscanf(buf + next_ptr, "%s", str_buf); + next_ptr += strlen(str_buf) + 1; + } while (!strstr(str_buf, "START_PAGE_ADDR")); + + sscanf(buf + next_ptr, "%s%d", str_buf, &page_num); + mbin_info[i].start_addr = page_num; + + do { + sscanf(buf + next_ptr, "%s", str_buf); + next_ptr += strlen(str_buf) + 1; + } while (!strstr(str_buf, "END_PAGE_ADDR")); + + sscanf(buf + next_ptr, "%s%d", str_buf, &page_num); + mbin_info[i].end_addr = page_num; + + do { + sscanf(buf + next_ptr, "%s", str_buf); + next_ptr += strlen(str_buf) + 1; + } while (!strstr(str_buf, "COMPATIBLE_VERSION")); + + sscanf(buf + next_ptr, "%s%d", str_buf, &version); + mbin_info[i].compatible_version = + ISC_CHAR_2_BCD(version); + + do { + sscanf(buf + next_ptr, "%s", str_buf); + next_ptr += strlen(str_buf) + 1; + } while (!strstr(str_buf, "[Binary]")); + + if (mbin_info[i].version == 0xFF) + return ISC_FILE_FORMAT_ERROR; + } + } + + for (i = 0; i < SECTION_NUM; i++) { + dev_info(&_client->dev, "[TSP ISC] MBin : Section(%d) Version: 0x%02X\n", + i, mbin_info[i].version); + dev_info(&_client->dev, "[TSP ISC] MBin : Section(%d) Start Address: 0x%02X\n", + i, mbin_info[i].start_addr); + dev_info(&_client->dev, "[TSP ISC] MBin : Section(%d) End Address: 0x%02X\n", + i, mbin_info[i].end_addr); + dev_info(&_client->dev, "[TSP ISC] MBin : Section(%d) Compatibility: 0x%02X\n", + i, mbin_info[i].compatible_version); + } + + return ISC_SUCCESS; +} + +static int mms100_compare_version_info(struct i2c_client *_client) +{ + int i, ret; + unsigned char expected_compatibility[SECTION_NUM]; + + if (mms100_get_version_info(_client) != ISC_SUCCESS) + return ISC_I2C_ERROR; + + ret = mms100_seek_section_info(_client); + + /* Check update areas , 0 : bootloader 1: core 2: private 3: public */ + for (i = 0; i < SECTION_NUM; i++) { + if ((mbin_info[i].version == 0) || + (mbin_info[i].version != ts_info[i].version)) { + section_update_flag[i] = true; + dev_info(&_client->dev, + "[TSP ISC] [%d] section will be updated!\n", i); + } + } + section_update_flag[0] = false; + section_update_flag[1] = false; + dev_info(&_client->dev, "[TSP ISC] [%d] [%d] [%d]", + section_update_flag[0], section_update_flag[1], + section_update_flag[2]); + + if (section_update_flag[SEC_BOOTLOADER]) { + expected_compatibility[SEC_CORE] = + mbin_info[SEC_BOOTLOADER].version; + } else { + expected_compatibility[SEC_CORE] = + ts_info[SEC_BOOTLOADER].version; + } + + if (section_update_flag[SEC_CORE]) { + expected_compatibility[SEC_CONFIG] = + mbin_info[SEC_CORE].version; + } else { + expected_compatibility[SEC_CONFIG] = + ts_info[SEC_CORE].version; + } + + for (i = SEC_CORE; i < SEC_CONFIG; i++) { + if (section_update_flag[i]) { + dev_info(&_client->dev, "[TSP ISC] section_update_flag(%d), 0x%02x, 0x%02x\n", + i, expected_compatibility[i], + mbin_info[i].compatible_version); + + if (expected_compatibility[i] != + mbin_info[i].compatible_version) + return ISC_COMPATIVILITY_ERROR; + } else { + dev_info(&_client->dev, "[TSP ISC] !section_update_flag(%d), 0x%02x, 0x%02x\n", + i, expected_compatibility[i], + ts_info[i].compatible_version); + if (expected_compatibility[i] != + ts_info[i].compatible_version) + return ISC_COMPATIVILITY_ERROR; + } + } + return ISC_SUCCESS; +} + +static int mms100_enter_ISC_mode(struct i2c_client *_client) +{ + int ret; + unsigned char wr_buf[2]; + + dev_info(&_client->dev, "[TSP ISC] %s\n", __func__); + + wr_buf[0] = ISC_CMD_ENTER_ISC; + wr_buf[1] = ISC_CMD_ENTER_ISC_PARA1; + + ret = i2c_master_send(_client, wr_buf, 2); + + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c write fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + msleep(50); + + return ISC_SUCCESS; +} + +static int mms100_enter_config_update(struct i2c_client *_client) +{ + int ret; + unsigned char wr_buf[10] = {0,}; + unsigned char rd_buf; + + wr_buf[0] = ISC_CMD_UPDATE_MODE; + wr_buf[1] = ISC_SUBCMD_ENTER_UPDATE; + + ret = i2c_master_send(_client, wr_buf, 10); + + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c write fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + ret = mms100_i2c_read(_client, ISC_CMD_CONFIRM_STATUS, 1, &rd_buf); + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c read fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + if (rd_buf != ISC_STATUS_UPDATE_MODE) + return ISC_UPDATE_MODE_ENTER_ERROR; + + dev_info(&_client->dev, "[TSP ISC] End mms100_enter_config_update()\n"); + + return ISC_SUCCESS; +} + +static int mms100_ISC_clear_page(struct i2c_client *_client, + unsigned char _page_addr) +{ + int ret; + unsigned char rd_buf; + + memset(&g_wr_buf[3], 0xFF, PAGE_DATA); + + g_wr_buf[0] = ISC_CMD_UPDATE_MODE; /* command */ + g_wr_buf[1] = ISC_SUBCMD_DATA_WRITE; /* sub_command */ + g_wr_buf[2] = _page_addr; + + g_wr_buf[PAGE_HEADER + PAGE_DATA] = crc0_buf[_page_addr]; + g_wr_buf[PAGE_HEADER + PAGE_DATA + 1] = crc1_buf[_page_addr]; + + ret = i2c_master_send(_client, g_wr_buf, PACKET_SIZE); + + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c write fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + ret = mms100_i2c_read(_client, ISC_CMD_CONFIRM_STATUS, 1, &rd_buf); + + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c read fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + if (rd_buf != ISC_STATUS_CRC_CHECK_SUCCESS) + return ISC_UPDATE_MODE_ENTER_ERROR; + + dev_info(&_client->dev, "[TSP ISC] End mms100_ISC_clear_page()\n"); + return ISC_SUCCESS; + +} + +static int mms100_ISC_clear_validate_markers(struct i2c_client *_client) +{ + int ret_msg; + int i, j; + bool is_matched_address; + + for (i = SEC_CORE; i <= SEC_CONFIG; i++) { + if (section_update_flag[i]) { + if (ts_info[i].end_addr <= 30 && + ts_info[i].end_addr > 0) { + ret_msg = mms100_ISC_clear_page(_client, + ts_info[i].end_addr); + + if (ret_msg != ISC_SUCCESS) + return ret_msg; + } + } + } + + for (i = SEC_CORE; i <= SEC_CONFIG; i++) { + if (section_update_flag[i]) { + is_matched_address = false; + for (j = SEC_CORE; j <= SEC_CONFIG; j++) { + if (mbin_info[i].end_addr == + ts_info[i].end_addr) { + is_matched_address = true; + break; + } + } + + if (!is_matched_address) { + if (mbin_info[i].end_addr <= 30 && + mbin_info[i].end_addr > 0) { + ret_msg = mms100_ISC_clear_page(_client, + mbin_info[i].end_addr); + + if (ret_msg != ISC_SUCCESS) + return ret_msg; + } + } + } + } + + return ISC_SUCCESS; +} + +static void mms100_calc_crc(unsigned char *crc, + int page_addr, unsigned char *ptr_fw) +{ + int i, j; + + unsigned char ucData; + + unsigned short SeedValue; + unsigned short CRC_check_buf; + unsigned short CRC_send_buf; + unsigned short IN_data; + unsigned short XOR_bit_1; + unsigned short XOR_bit_2; + unsigned short XOR_bit_3; + + CRC_check_buf = 0xFFFF; + SeedValue = (unsigned short)page_addr; + + for (i = 7; i >= 0; i--) { + IN_data = (SeedValue >> i) & 0x01; + XOR_bit_1 = (CRC_check_buf & 0x0001) ^ IN_data; + XOR_bit_2 = XOR_bit_1^(CRC_check_buf >> 11 & 0x01); + XOR_bit_3 = XOR_bit_1^(CRC_check_buf >> 4 & 0x01); + CRC_send_buf = (XOR_bit_1 << 4) | (CRC_check_buf >> 12 & 0x0F); + CRC_send_buf = + (CRC_send_buf << 7) | (XOR_bit_2 << 6) | + (CRC_check_buf >> 5 & 0x3F); + CRC_send_buf = + (CRC_send_buf << 4) | (XOR_bit_3 << 3) | + (CRC_check_buf >> 1 & 0x0007); + CRC_check_buf = CRC_send_buf; + } + + for (j = 0; j < 1024; j++) { + ucData = ptr_fw[j]; + + for (i = 7; i >= 0; i--) { + IN_data = (ucData >> i) & 0x0001; + XOR_bit_1 = (CRC_check_buf & 0x0001) ^ IN_data; + XOR_bit_2 = XOR_bit_1^(CRC_check_buf >> 11 & 0x01); + XOR_bit_3 = XOR_bit_1^(CRC_check_buf >> 4 & 0x01); + CRC_send_buf = + (XOR_bit_1 << 4) | (CRC_check_buf >> 12 & 0x0F); + CRC_send_buf = + (CRC_send_buf << 7) | (XOR_bit_2 << 6) | + (CRC_check_buf >> 5 & 0x3F); + CRC_send_buf = + (CRC_send_buf << 4) | (XOR_bit_3 << 3) | + (CRC_check_buf >> 1 & 0x0007); + CRC_check_buf = CRC_send_buf; + } + } + + crc[0] = (unsigned char)((CRC_check_buf >> 8) & 0xFF); + crc[1] = (unsigned char)((CRC_check_buf >> 0) & 0xFF); +} + +static int mms100_update_section_data(struct i2c_client *_client) +{ + int i, j, ret; + unsigned char rd_buf; + unsigned char crc[2]; + const unsigned char *ptr_fw; + char str_buf[STRING_BUF_LEN]; + int page_addr; + + for (i = 0; i < SECTION_NUM; i++) { + if (section_update_flag[i]) { + dev_info(&_client->dev, + "[TSP ISC] section data i2c flash : [%d]\n", i); + + ptr_fw = fw_mbin[i]->data; + + do { + sscanf(ptr_fw, "%s", str_buf); + ptr_fw += strlen(str_buf) + 1; +/* + pr_info("[TSP ISC] Section[%d] %s", i, str_buf ); +*/ + } while (!strstr(str_buf, "[Binary]")); + ptr_fw += 1; + + for (page_addr = mbin_info[i].start_addr; + page_addr <= mbin_info[i].end_addr; + page_addr++) { + if (page_addr - mbin_info[i].start_addr > 0) + ptr_fw += 1024; + + g_wr_buf[0] = ISC_CMD_UPDATE_MODE; + g_wr_buf[1] = ISC_SUBCMD_DATA_WRITE; + g_wr_buf[2] = (unsigned char)page_addr; + + for (j = 0; j < 1024; j += 4) { + g_wr_buf[3+j] = ptr_fw[j+3]; + g_wr_buf[3+j+1] = ptr_fw[j+2]; + g_wr_buf[3+j+2] = ptr_fw[j+1]; + g_wr_buf[3+j+3] = ptr_fw[j+0]; + } + + mms100_calc_crc(crc, page_addr, &g_wr_buf[3]); + + g_wr_buf[1027] = crc[0]; + g_wr_buf[1028] = crc[1]; +/* + pr_info("[TSP ISC] [%d] DATA %02X %02X %02X %02X CRC %02X %02X ", + page_addr, g_wr_buf[3], g_wr_buf[4], + g_wr_buf[5], g_wr_buf[6] , crc[0] , crc[1] ); +*/ + ret = i2c_master_send(_client, + g_wr_buf, PACKET_SIZE); + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c write fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + ret = mms100_i2c_read(_client, + ISC_CMD_CONFIRM_STATUS, 1, &rd_buf); + if (ret < 0) { + dev_err(&_client->dev, "[TSP ISC] %s,%d: i2c read fail[%d]\n", + __func__, __LINE__, ret); + return ISC_I2C_ERROR; + } + + if (rd_buf != ISC_STATUS_CRC_CHECK_SUCCESS) + return ISC_CRC_ERROR; + + section_update_flag[i] = false; + } + } + } + + return ISC_SUCCESS; +} + +static int mms100_open_mbinary(struct mms_ts_info *info) +{ + struct i2c_client *_client = info->client; + int ret = 0; + + /*to do fw update */ + { + ret += request_firmware(&(fw_mbin[0]),\ + "tsp_melfas/BOOT_H.fw", &_client->dev); + ret += request_firmware(&(fw_mbin[1]),\ + "tsp_melfas/CORE_H.fw", &_client->dev); + ret += request_firmware(&(fw_mbin[2]),\ + "tsp_melfas/CONF_H.fw", &_client->dev); + } + + if (!ret) + return ISC_SUCCESS; + else { + dev_err(&_client->dev, "[TSP ISC] request_firmware fail\n"); + return ret; + } +} + +static int mms100_close_mbinary(void) +{ + int i; + + for (i = 0; i < SECTION_NUM; i++) { + if (fw_mbin[i] != NULL) + release_firmware(fw_mbin[i]); + } + return ISC_SUCCESS; +} + +int mms100_ISC_download_mbinary(struct mms_ts_info *info) +{ + struct i2c_client *_client = info->client; + int ret_msg = ISC_NONE; + + dev_info(&_client->dev, "[TSP ISC] %s\n", __func__); + + mms100_reset(info); + +/* ret_msg = mms100_check_operating_mode(_client, EC_BOOT_ON_SUCCEEDED); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; +*/ + ret_msg = mms100_open_mbinary(info); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; + + /* Config version Check */ + ret_msg = mms100_compare_version_info(_client); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; + + ret_msg = mms100_enter_ISC_mode(_client); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; + + ret_msg = mms100_enter_config_update(_client); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; + + ret_msg = mms100_ISC_clear_validate_markers(_client); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; + + dev_info(&_client->dev, "[TSP ISC] mms100_update_section_data start\n"); + + ret_msg = mms100_update_section_data(_client); + if (ret_msg != ISC_SUCCESS) + goto ISC_ERROR_HANDLE; + + dev_info(&_client->dev, "[TSP ISC] mms100_update_section_data end\n"); + +/* mms100_reset(info); */ + + dev_info(&_client->dev, "[TSP ISC] FIRMWARE_UPDATE_FINISHED!!!\n"); + + ret_msg = ISC_SUCCESS; + +ISC_ERROR_HANDLE: + if (ret_msg != ISC_SUCCESS) + dev_err(&_client->dev, + "[TSP ISC] ISC_ERROR_CODE: %d\n", ret_msg); + + mms100_reset(info); + mms100_close_mbinary(); + + return ret_msg; +} +#endif /* ISC_DL_MODE end */ + +static void hw_reboot(struct mms_ts_info *info, bool bootloader) +{ + info->pdata->vdd_on(0); + gpio_direction_output(info->pdata->gpio_sda, bootloader ? 0 : 1); + gpio_direction_output(info->pdata->gpio_scl, bootloader ? 0 : 1); + gpio_direction_output(info->pdata->gpio_resetb, 0); + msleep(30); + info->pdata->vdd_on(1); + msleep(30); + + if (bootloader) { + gpio_set_value(info->pdata->gpio_scl, 0); + gpio_set_value(info->pdata->gpio_sda, 1); + } else { + gpio_set_value(info->pdata->gpio_resetb, 1); + gpio_direction_input(info->pdata->gpio_resetb); + gpio_direction_input(info->pdata->gpio_scl); + gpio_direction_input(info->pdata->gpio_sda); + } + msleep(40); +} + +static inline void hw_reboot_bootloader(struct mms_ts_info *info) +{ + hw_reboot(info, true); +} + +static inline void hw_reboot_normal(struct mms_ts_info *info) +{ + hw_reboot(info, false); +} + +static void isp_toggle_clk(struct mms_ts_info *info, int start_lvl, int end_lvl, + int hold_us) +{ + gpio_set_value(info->pdata->gpio_scl, start_lvl); + udelay(hold_us); + gpio_set_value(info->pdata->gpio_scl, end_lvl); + udelay(hold_us); +} + +/* 1 <= cnt <= 32 bits to write */ +static void isp_send_bits(struct mms_ts_info *info, u32 data, int cnt) +{ + gpio_direction_output(info->pdata->gpio_resetb, 0); + gpio_direction_output(info->pdata->gpio_scl, 0); + gpio_direction_output(info->pdata->gpio_sda, 0); + + /* clock out the bits, msb first */ + while (cnt--) { + gpio_set_value(info->pdata->gpio_sda, (data >> cnt) & 1); + udelay(3); + isp_toggle_clk(info, 1, 0, 3); + } +} + +/* 1 <= cnt <= 32 bits to read */ +static u32 isp_recv_bits(struct mms_ts_info *info, int cnt) +{ + u32 data = 0; + + gpio_direction_output(info->pdata->gpio_resetb, 0); + gpio_direction_output(info->pdata->gpio_scl, 0); + gpio_set_value(info->pdata->gpio_sda, 0); + gpio_direction_input(info->pdata->gpio_sda); + + /* clock in the bits, msb first */ + while (cnt--) { + isp_toggle_clk(info, 0, 1, 1); + data = (data << 1) | (!!gpio_get_value(info->pdata->gpio_sda)); + } + + gpio_direction_output(info->pdata->gpio_sda, 0); + return data; +} + +static void isp_enter_mode(struct mms_ts_info *info, u32 mode) +{ + int cnt; + unsigned long flags; + + local_irq_save(flags); + gpio_direction_output(info->pdata->gpio_resetb, 0); + gpio_direction_output(info->pdata->gpio_scl, 0); + gpio_direction_output(info->pdata->gpio_sda, 1); + + mode &= 0xffff; + for (cnt = 15; cnt >= 0; cnt--) { + gpio_set_value(info->pdata->gpio_resetb, (mode >> cnt) & 1); + udelay(3); + isp_toggle_clk(info, 1, 0, 3); + } + + gpio_set_value(info->pdata->gpio_resetb, 0); + local_irq_restore(flags); +} + +static void isp_exit_mode(struct mms_ts_info *info) +{ + int i; + unsigned long flags; + + local_irq_save(flags); + gpio_direction_output(info->pdata->gpio_resetb, 0); + udelay(3); + + for (i = 0; i < 10; i++) + isp_toggle_clk(info, 1, 0, 3); + local_irq_restore(flags); +} + +static void isp_flash_set_address(struct mms_ts_info *info, u16 addr) +{ + /* Only 13 bits of addr are valid. + * The addr is in bits 13:1 of cmd */ + isp_send_bits(info, (u32)(addr & 0x1fff) << 1, 18); +} + +static void isp_flash_erase(struct mms_ts_info *info) +{ + isp_enter_mode(info, ISP_MODE_FLASH_ERASE); + + gpio_direction_output(info->pdata->gpio_resetb, 0); + gpio_direction_output(info->pdata->gpio_scl, 0); + gpio_direction_output(info->pdata->gpio_sda, 1); + + /* 4 clock cycles with different timings for the erase to + * get processed, clk is already 0 from above */ + udelay(7); + isp_toggle_clk(info, 1, 0, 3); + udelay(7); + isp_toggle_clk(info, 1, 0, 3); + usleep_range(25000, 35000); + isp_toggle_clk(info, 1, 0, 3); + usleep_range(150, 200); + isp_toggle_clk(info, 1, 0, 3); + + gpio_set_value(info->pdata->gpio_sda, 0); + + isp_exit_mode(info); +} + +static u32 isp_flash_readl(struct mms_ts_info *info, u16 addr) +{ + int i; + u32 val; + unsigned long flags; + + local_irq_save(flags); + isp_enter_mode(info, ISP_MODE_FLASH_READ); + isp_flash_set_address(info, addr); + + gpio_direction_output(info->pdata->gpio_scl, 0); + gpio_direction_output(info->pdata->gpio_sda, 0); + udelay(40); + + /* data load cycle */ + for (i = 0; i < 6; i++) + isp_toggle_clk(info, 1, 0, 10); + + val = isp_recv_bits(info, 32); + isp_exit_mode(info); + local_irq_restore(flags); + + return val; +} + +static void isp_flash_writel(struct mms_ts_info *info, u16 addr, u32 val) +{ + unsigned long flags; + + local_irq_save(flags); + isp_enter_mode(info, ISP_MODE_FLASH_WRITE); + isp_flash_set_address(info, addr); + isp_send_bits(info, val, 32); + + gpio_direction_output(info->pdata->gpio_sda, 1); + /* 6 clock cycles with different timings for the data to get written + * into flash */ + isp_toggle_clk(info, 0, 1, 3); + isp_toggle_clk(info, 0, 1, 3); + isp_toggle_clk(info, 0, 1, 6); + isp_toggle_clk(info, 0, 1, 12); + isp_toggle_clk(info, 0, 1, 3); + isp_toggle_clk(info, 0, 1, 3); + + isp_toggle_clk(info, 1, 0, 1); + + gpio_direction_output(info->pdata->gpio_sda, 0); + isp_exit_mode(info); + local_irq_restore(flags); + usleep_range(300, 400); +} + +static bool isp_flash_is_erased(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + u32 val; + u16 addr; + + for (addr = 0; addr < (ISP_MAX_FW_SIZE / 4); addr++) { + udelay(40); + val = isp_flash_readl(info, addr); + + if (val != 0xffffffff) { + dev_dbg(&client->dev, + "addr 0x%x not erased: 0x%08x != 0xffffffff\n", + addr, val); + return false; + } + } + return true; +} + +static int isp_fw_write_image(struct mms_ts_info *info, const u8 *data, size_t len) +{ + struct i2c_client *client = info->client; + u16 addr = 0; + + for (addr = 0; addr < (len / 4); addr++, data += 4) { + u32 val = get_unaligned_le32(data); + u32 verify_val; + int retries = 3; + + while (retries--) { + isp_flash_writel(info, addr, val); + verify_val = isp_flash_readl(info, addr); + if (val == verify_val) + break; + dev_err(&client->dev, + "mismatch @ addr 0x%x: 0x%x != 0x%x\n", + addr, verify_val, val); + continue; + } + if (retries < 0) + return -ENXIO; + } + + return 0; +} + +static int isp_fw_download(struct mms_ts_info *info, const u8 *data, size_t len) +{ + struct i2c_client *client = info->client; + u32 val; + int ret = 0; + int i; + u32 *buf = kzalloc(ISP_CAL_DATA_SIZE * 4, GFP_KERNEL); + if (!buf) { + dev_err(&info->client->dev, "%s: failed to allocate memory\n", + __func__); + return -ENOMEM; + } + + if (len % 4) { + dev_err(&client->dev, + "fw image size (%d) must be a multiple of 4 bytes\n", + len); + kfree(buf); + return -EINVAL; + } else if (len > ISP_MAX_FW_SIZE) { + dev_err(&client->dev, + "fw image is too big, %d > %d\n", len, ISP_MAX_FW_SIZE); + kfree(buf); + return -EINVAL; + } + + dev_info(&client->dev, "fw download start\n"); + + info->pdata->vdd_on(0); + gpio_direction_output(info->pdata->gpio_sda, 0); + gpio_direction_output(info->pdata->gpio_scl, 0); + gpio_direction_output(info->pdata->gpio_resetb, 0); + + hw_reboot_bootloader(info); + + dev_info(&client->dev, "calibration data backup\n"); + for (i = 0; i < ISP_CAL_DATA_SIZE; i++) + buf[i] = isp_flash_readl(info, ISP_IC_INFO_ADDR); + + val = isp_flash_readl(info, ISP_IC_INFO_ADDR); + dev_info(&client->dev, "IC info: 0x%02x (%x)\n", val & 0xff, val); + + dev_info(&client->dev, "fw erase...\n"); + isp_flash_erase(info); + if (!isp_flash_is_erased(info)) { + ret = -ENXIO; + goto err; + } + + dev_info(&client->dev, "fw write...\n"); + /* XXX: what does this do?! */ + isp_flash_writel(info, ISP_IC_INFO_ADDR, 0xffffff00 | (val & 0xff)); + usleep_range(1000, 1500); + ret = isp_fw_write_image(info, data, len); + if (ret) + goto err; + usleep_range(1000, 1500); + + dev_info(&client->dev, "restoring data\n"); + for (i = 0; i < ISP_CAL_DATA_SIZE; i++) + isp_flash_writel(info, ISP_IC_INFO_ADDR, buf[i]); + kfree(buf); + + dev_info(&client->dev, "fw download done...\n"); + hw_reboot_normal(info); + msleep(200); + return 0; + +err: + dev_err(&client->dev, "fw download failed...\n"); + kfree(buf); + hw_reboot_normal(info); + return ret; +} + +static int get_fw_version(struct mms_ts_info *info, u8 area) +{ + struct i2c_client *client = info->client; + struct i2c_adapter *adapter = client->adapter; + struct i2c_msg msg; + u8 reg = MMS_CORE_VERSION; + int ret; + unsigned char buf[4]; + + msg.addr = client->addr; + msg.flags = 0x00; + msg.len = 1; + msg.buf = ® + + disable_irq(info->irq); + ret = i2c_transfer(adapter, &msg, 1); + + if (ret >= 0) { + msg.addr = client->addr; + msg.flags = I2C_M_RD; + msg.len = 4; + msg.buf = buf; + + ret = i2c_transfer(adapter, &msg, 1); + } + enable_irq(info->irq); + if (ret < 0) { + dev_err(&client->dev, "I2C read error : [%d]\n", ret); + return ret; + } + + if (area == SEC_BOOTLOADER) + return buf[0]; + else if (area == SEC_CORE) + return buf[1]; + else if (area == SEC_CONFIG) + return buf[2]; + else + return 0; +} + +static int get_hw_version(struct mms_ts_info *info) +{ + int ret; + int retries = 3; + + /* this seems to fail sometimes after a reset.. retry a few times */ + disable_irq(info->irq); + do { + ret = i2c_smbus_read_byte_data(info->client, MMS_HW_REVISION); + } while (ret < 0 && retries-- > 0); + enable_irq(info->irq); + + return ret; +} + +static int mms_ts_finish_config(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + int ret; + + ret = request_threaded_irq(client->irq, NULL, mms_ts_interrupt, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + "mms_ts", info); + if (ret < 0) { + ret = 1; + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_req_irq; + } + + info->irq = client->irq; + barrier(); + + dev_info(&client->dev, "Melfas MMS-series touch controller initialized\n"); + + return 0; + +err_req_irq: + return ret; +} + +static int isp_fw_update(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + int ret = 0; + int retries = 3; + int ver; + + ver = get_fw_version(info, SEC_CONFIG); + info->fw_ic_ver = ver; + dev_err(&client->dev, "fw version 0x%02x !!!!\n", ver); + + if (!info->pdata || !info->pdata->mux_fw_flash) { + ret = 1; + dev_err(&client->dev, "fw cannot be updated, missing platform data\n"); + return ret; + } + + disable_irq(info->irq); + while (retries--) { + i2c_lock_adapter(adapter); + info->pdata->mux_fw_flash(true); + + ret = isp_fw_download(info, MELFAS_binary, + MELFAS_binary_nLength); + + info->pdata->mux_fw_flash(false); + i2c_unlock_adapter(adapter); + + if (ret < 0) { + dev_err(&client->dev, "retrying flashing\n"); + continue; + } + + ver = get_fw_version(info, SEC_CONFIG); + info->fw_ic_ver = ver; + + if (ver == FW_VERSION) { + dev_info(&client->dev, + "fw update done. ver = 0x%02x\n", ver); + enable_irq(info->irq); + goto done; + } else { + dev_err(&client->dev, + "ERROR: fw update succeeded, but fw version is still wrong (0x%x != 0x%x)\n", + ver, FW_VERSION); + enable_irq(info->irq); + } + dev_err(&client->dev, "retrying flashing\n"); + } + + return ret; +done: + return ret; +} + +#if ISC_DL_MODE +static int isc_fw_update(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + int ret = 0; + int ver; + int bin_ver; + int retries = 3; + + ver = get_fw_version(info, SEC_CONFIG); + info->fw_ic_ver = ver; + dev_info(&client->dev, "fw version 0x%02x !!!!\n", ver); + + if (!info->pdata || !info->pdata->mux_fw_flash) { + ret = 1; + dev_err(&client->dev, "fw cannot be updated, missing platform data\n"); + goto out; + } + + bin_ver = FW_VERSION; + + while (retries--) { + ret = mms100_ISC_download_mbinary(info); + + ver = get_fw_version(info, SEC_CONFIG); + info->fw_ic_ver = ver; + + if (ret == 0) { + dev_info(&client->dev, "mms100_ISC_download_mbinary success\n"); + goto done; + } else { + dev_err(&client->dev, "mms100_ISC_download_mbinary fail [%d]\n", + ret); + ret = 1; + } + + dev_err(&client->dev, "retrying flashing\n"); + } +out: +done: + return ret; +} +#endif + +#ifdef SEC_TSP_FACTORY_TEST +/* SPRD remove this function */ +#if 0 +static inline int msm_irq_to_gpio(unsigned irq) +{ + /* TODO : Need to verify chip->base=0 */ + return irq - MSM_GPIO_TO_INT(0); +} +#endif +static void set_default_result(struct mms_ts_info *info) +{ + char delim = ':'; + + memset(info->cmd_result, 0x00, ARRAY_SIZE(info->cmd_result)); + memcpy(info->cmd_result, info->cmd, strlen(info->cmd)); + strncat(info->cmd_result, &delim, 1); +} + +static void set_cmd_result(struct mms_ts_info *info, char *buff, int len) +{ + strncat(info->cmd_result, buff, len); +} + +static int get_data(struct mms_ts_info *info, u8 addr, u8 size, u8 *array) +{ + struct i2c_client *client = info->client; + struct i2c_adapter *adapter = client->adapter; + struct i2c_msg msg; + u8 reg = addr; + unsigned char buf[size]; + int ret; + + msg.addr = client->addr; + msg.flags = 0x00; + msg.len = 1; + msg.buf = ® + + ret = i2c_transfer(adapter, &msg, 1); + + if (ret >= 0) { + msg.addr = client->addr; + msg.flags = I2C_M_RD; + msg.len = size; + msg.buf = buf; + + ret = i2c_transfer(adapter, &msg, 1); + } + if (ret < 0) { + dev_err(&client->dev, "I2C read error : [%d]\n", ret); + return ret; + } + + memcpy(array, &buf, size); + return size; +} + +static void get_intensity_data(struct mms_ts_info *info) +{ + u8 w_buf[4]; + u8 r_buf; + u8 read_buffer[60] = {0}; + int i, j; + int ret; + u16 max_value = 0, min_value = 0; + u16 raw_data; + char buff[TSP_CMD_STR_LEN] = {0}; + + disable_irq(info->irq); + + w_buf[0] = ADDR_UNIV_CMD; + w_buf[1] = CMD_GET_INTEN; + w_buf[2] = 0xFF; + for (i = 0; i < RX_NUM; i++) { + w_buf[3] = i; + + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 3, &w_buf[1]); + if (ret < 0) + goto err_i2c; + usleep_range(1, 5); + + ret = i2c_smbus_read_i2c_block_data(info->client, + CMD_RESULT_SZ, 1, &r_buf); + if (ret < 0) + goto err_i2c; + + ret = get_data(info, CMD_RESULT, r_buf, read_buffer); + if (ret < 0) + goto err_i2c; + + for (j = 0; j < r_buf / 2; j++) { + raw_data = + read_buffer[2 * j] | (read_buffer[2 * j + 1] << 8); + if (raw_data > 32767) + raw_data = 0; + if (i == 0 && j == 0) { + max_value = min_value = raw_data; + } else { + max_value = max(max_value, raw_data); + min_value = min(min_value, raw_data); + } + info->intensity[i * TX_NUM + j] = raw_data; + dev_dbg(&info->client->dev, + "intensity[%d][%d] = %d\n", j, i, + info->intensity[i * TX_NUM + j]); + } + } + + snprintf(buff, sizeof(buff), "%d,%d", min_value, max_value); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + + enable_irq(info->irq); + + return; + +err_i2c: + dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n", + __func__, MMS_VSC_CMD_INTENSITY); +} + +static void get_raw_data(struct mms_ts_info *info, u8 cmd) +{ + u8 w_buf[4]; + u8 r_buf = 0; + u8 read_buffer[60] = {0}; + int ret; + int i, j; + int max_value = 0, min_value = 0; + int raw_data; + int retry; + char buff[TSP_CMD_STR_LEN] = {0}; + int gpio = info->pdata->gpio_int;/* msm_irq_to_gpio(info->irq); */ + + disable_irq(info->irq); + + ret = i2c_smbus_write_byte_data(info->client, + ADDR_UNIV_CMD, CMD_ENTER_TEST); + if (ret < 0) + goto err_i2c; + + /* event type check */ + retry = 1; + while (retry) { + while (gpio_get_value(gpio)) + udelay(100); + + ret = i2c_smbus_read_i2c_block_data(info->client, + 0x0F, 1, &r_buf); + if (ret < 0) + goto err_i2c; + + ret = i2c_smbus_read_i2c_block_data(info->client, + 0x10, 1, &r_buf); + if (ret < 0) + goto err_i2c; + + dev_info(&info->client->dev, "event type = 0x%x\n", r_buf); + if (r_buf == 0x0C) + retry = 0; + } + + w_buf[0] = ADDR_UNIV_CMD; + if (cmd == MMS_VSC_CMD_CM_DELTA) + w_buf[1] = CMD_CM_DELTA; + else + w_buf[1] = CMD_CM_ABS; + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 1, &w_buf[1]); + if (ret < 0) + goto err_i2c; + while (gpio_get_value(gpio)) + udelay(100); + + ret = i2c_smbus_read_i2c_block_data(info->client, + CMD_RESULT_SZ, 1, &r_buf); + if (ret < 0) + goto err_i2c; + ret = i2c_smbus_read_i2c_block_data(info->client, + CMD_RESULT, 1, &r_buf); + if (ret < 0) + goto err_i2c; + + if (r_buf == 1) + dev_info(&info->client->dev, "PASS\n"); + else + dev_info(&info->client->dev, "FAIL\n"); + + if (cmd == MMS_VSC_CMD_CM_DELTA) + w_buf[1] = CMD_GET_DELTA; + else + w_buf[1] = CMD_GET_ABS; + w_buf[2] = 0xFF; + + for (i = 0; i < RX_NUM; i++) { + w_buf[3] = i; + + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 3, &w_buf[1]); + if (ret < 0) + goto err_i2c; + + while (gpio_get_value(gpio)) + udelay(100); + + ret = i2c_smbus_read_i2c_block_data(info->client, + CMD_RESULT_SZ, 1, &r_buf); + if (ret < 0) + goto err_i2c; + + ret = get_data(info, CMD_RESULT, r_buf, read_buffer); + if (ret < 0) + goto err_i2c; + + for (j = 0; j < TX_NUM; j++) { + raw_data = + read_buffer[2 * j] | (read_buffer[2 * j + 1] << 8); + if (i == 0 && j == 0) { + max_value = min_value = raw_data; + } else { + max_value = max(max_value, raw_data); + min_value = min(min_value, raw_data); + } + + if (cmd == MMS_VSC_CMD_CM_DELTA) { + info->inspection[i * TX_NUM + j] = + raw_data; + dev_dbg(&info->client->dev, + "delta[%d][%d] = %d\n", j, i, + info->inspection[i * TX_NUM + j]); + } else if (cmd == MMS_VSC_CMD_CM_ABS) { + info->raw[i * TX_NUM + j] = + raw_data; + dev_dbg(&info->client->dev, + "raw[%d][%d] = %d\n", j, i, + info->raw[i * TX_NUM + j]); + } else if (cmd == MMS_VSC_CMD_REFER) { + info->reference[i * TX_NUM + j] = + raw_data; + dev_dbg(&info->client->dev, + "reference[%d][%d] = %d\n", j, i, + info->reference[i * TX_NUM + j]); + } + } + } + + ret = i2c_smbus_write_byte_data(info->client, + ADDR_UNIV_CMD, CMD_EXIT_TEST); + + snprintf(buff, sizeof(buff), "%d,%d", min_value, max_value); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + + touch_is_pressed = 0; + release_all_fingers(info); + + info->pdata->vdd_on(0); + msleep(30); + info->pdata->vdd_on(1); + msleep(250); + + if (info->ta_status) { + dev_notice(&info->client->dev, "TA connect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x1); + } else { + dev_notice(&info->client->dev, "TA disconnect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x2); + } + mms_set_noise_mode(info); + + enable_irq(info->irq); + + return; + +err_i2c: + dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n", + __func__, cmd); +} + +static void get_raw_data_all(struct mms_ts_info *info, u8 cmd) +{ + u8 w_buf[6]; + u8 read_buffer[2]; /* 52 */ + char buff[TSP_CMD_STR_LEN] = {0}; + int gpio; + int ret; + int i, j; + u32 max_value, min_value; + u32 raw_data; + + gpio = info->pdata->gpio_int;/*msm_irq_to_gpio(info->irq);*/ + disable_irq(info->irq); + + w_buf[0] = MMS_VSC_CMD; /* vendor specific command id */ + w_buf[1] = MMS_VSC_MODE; /* mode of vendor */ + w_buf[2] = 0; /* tx line */ + w_buf[3] = 0; /* rx line */ + w_buf[4] = 0; /* reserved */ + w_buf[5] = 0; /* sub command */ + + if (cmd == MMS_VSC_CMD_EXIT) { + w_buf[5] = MMS_VSC_CMD_EXIT; /* exit test mode */ + + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 5, &w_buf[1]); + if (ret < 0) + goto err_i2c; + touch_is_pressed = 0; + release_all_fingers(info); +#if defined(CONFIG_MIPI_SAMSUNG_ESD_REFRESH) + set_esd_disable(); +#endif + info->pdata->vdd_on(0); + msleep(30); + info->pdata->vdd_on(1); + msleep(120); + enable_irq(info->irq); +#if defined(CONFIG_MIPI_SAMSUNG_ESD_REFRESH) + set_esd_enable(); +#endif + return ; + } + + /* MMS_VSC_CMD_CM_DELTA or MMS_VSC_CMD_CM_ABS + * this two mode need to enter the test mode + * exit command must be followed by testing. + */ + if (cmd == MMS_VSC_CMD_CM_DELTA || cmd == MMS_VSC_CMD_CM_ABS) { + /* enter the debug mode */ + w_buf[2] = 0x0; /* tx */ + w_buf[3] = 0x0; /* rx */ + w_buf[5] = MMS_VSC_CMD_ENTER; + + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 5, &w_buf[1]); + if (ret < 0) + goto err_i2c; + + /* wating for the interrupt */ + while (gpio_get_value(gpio)) + udelay(100); + } + + max_value = 0; + min_value = 0; + + for (i = 0; i < RX_NUM; i++) { + for (j = 0; j < TX_NUM; j++) { + + w_buf[2] = j; /* tx */ + w_buf[3] = i; /* rx */ + w_buf[5] = cmd; + + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 5, &w_buf[1]); + if (ret < 0) + goto err_i2c; + + usleep_range(1, 5); + + ret = i2c_smbus_read_i2c_block_data(info->client, 0xBF, + 2, read_buffer); + if (ret < 0) + goto err_i2c; + + raw_data = ((u16)read_buffer[1] << 8) | read_buffer[0]; + + if (i == 0 && j == 0) { + max_value = min_value = raw_data; + } else { + max_value = max(max_value, raw_data); + min_value = min(min_value, raw_data); + } + + if (cmd == MMS_VSC_CMD_INTENSITY) { + info->intensity[j * RX_NUM + i] = raw_data; + dev_dbg(&info->client->dev, "intensity[%d][%d] = %d\n", + i, j, info->intensity[j * RX_NUM + i]); + } else if (cmd == MMS_VSC_CMD_CM_DELTA) { + info->inspection[j * RX_NUM + i] = raw_data; + dev_dbg(&info->client->dev, "delta[%d][%d] = %d\n", + i, j, info->inspection[j * RX_NUM + i]); + } else if (cmd == MMS_VSC_CMD_CM_ABS) { + info->raw[j * RX_NUM + i] = raw_data; + dev_dbg(&info->client->dev, "raw[%d][%d] = %d\n", + i, j, info->raw[j * RX_NUM + i]); + } else if (cmd == MMS_VSC_CMD_REFER) { + info->reference[j * RX_NUM + i] = + raw_data >> 3; + dev_dbg(&info->client->dev, "reference[%d][%d] = %d\n", + i, j, info->reference[j * RX_NUM + i]); + } + } + } + + snprintf(buff, sizeof(buff), "%d,%d", min_value, max_value); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + + enable_irq(info->irq); + +err_i2c: + dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n", + __func__, cmd); +} + +#if defined(ESD_DEBUG) +static u32 get_raw_data_one(struct mms_ts_info *info, u16 rx_idx, u16 tx_idx, + u8 cmd) +{ + u8 w_buf[6]; + u8 read_buffer[2]; + int ret; + u32 raw_data; + + w_buf[0] = MMS_VSC_CMD; /* vendor specific command id */ + w_buf[1] = MMS_VSC_MODE; /* mode of vendor */ + w_buf[2] = 0; /* tx line */ + w_buf[3] = 0; /* rx line */ + w_buf[4] = 0; /* reserved */ + w_buf[5] = 0; /* sub command */ + + if (cmd != MMS_VSC_CMD_INTENSITY && cmd != MMS_VSC_CMD_RAW && + cmd != MMS_VSC_CMD_REFER && cmd != VSC_INTENSITY_TK && + cmd != VSC_RAW_TK) { + dev_err(&info->client->dev, "%s: not profer command(cmd=%d)\n", + __func__, cmd); + return FAIL; + } + + w_buf[2] = tx_idx; /* tx */ + w_buf[3] = rx_idx; /* rx */ + w_buf[5] = cmd; /* sub command */ + + ret = i2c_smbus_write_i2c_block_data(info->client, w_buf[0], 5, + &w_buf[1]); + if (ret < 0) + goto err_i2c; + + ret = i2c_smbus_read_i2c_block_data(info->client, 0xBF, 2, + read_buffer); + if (ret < 0) + goto err_i2c; + + raw_data = ((u16)read_buffer[1] << 8) | read_buffer[0]; + if (cmd == MMS_VSC_CMD_REFER) + raw_data = raw_data >> 4; + + return raw_data; + +err_i2c: + dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n", + __func__, cmd); + return FAIL; +} +#endif + +#if defined(SEC_TKEY_FACTORY_TEST) +static u32 get_raw_data_tkey(struct mms_ts_info *info, u16 key_idx, u8 cmd) +{ + u8 w_buf[4]; + u8 r_buf = 0; + u8 read_buffer[60] = {0}; + int ret, raw_data; + int gpio = info->pdata->gpio_int;/*msm_irq_to_gpio(info->irq);*/ + + disable_irq(info->irq); + + w_buf[0] = ADDR_UNIV_CMD; /* Universal CMD ID */ + w_buf[1] = CMD_ENTER_TEST; /* mode of vendor */ + w_buf[2] = 0xFF; /* Exciting CH*/ + w_buf[3] = 0; /* Sensing CH */ + + if (cmd != VSC_INTENSITY_TK && cmd != VSC_RAW_TK) { + dev_err(&info->client->dev, "%s: not profer command(cmd=%d)\n", + __func__, cmd); + return FAIL; + } + + if (cmd == VSC_INTENSITY_TK) + w_buf[1] = CMD_GET_INTEN_KEY; + else + w_buf[1] = CMD_GET_REFER_KEY; + + ret = i2c_smbus_write_i2c_block_data(info->client, + w_buf[0], 3, &w_buf[1]); + + if (ret < 0) + goto err_i2c; + while (gpio_get_value(gpio)) + udelay(100); + + ret = i2c_smbus_read_i2c_block_data(info->client, + CMD_RESULT_SZ, 1, &r_buf); + if (ret < 0) + goto err_i2c; + ret = get_data(info, CMD_RESULT, r_buf, read_buffer); + if (ret < 0) + goto err_i2c; + + raw_data = read_buffer[2*key_idx] | (read_buffer[2*key_idx+1] << 8); + + /* if raw_data < 0, return 0*/ + if (read_buffer[2*key_idx+1] & (1 << 7)) + raw_data = 0; + + touch_is_pressed = 0; + info->enabled = true; + + enable_irq(info->irq); + return raw_data; + +err_i2c: + dev_err(&info->client->dev, "%s: fail to i2c (cmd=%d)\n", + __func__, cmd); + return FAIL; +} +#endif + +static ssize_t show_close_tsp_test(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + + get_raw_data_all(info, MMS_VSC_CMD_EXIT); + info->ft_flag = 0; + + return snprintf(buf, TSP_BUF_SIZE, "%u\n", 0); +} + +static int check_rx_tx_num(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[TSP_CMD_STR_LEN] = {0}; + int node; + + if (info->cmd_param[0] < 0 || + info->cmd_param[0] >= TX_NUM || + info->cmd_param[1] < 0 || + info->cmd_param[1] >= RX_NUM) { + snprintf(buff, sizeof(buff) , "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 3; + + dev_err(&info->client->dev, "%s: parameter error: %u,%u\n", + __func__, info->cmd_param[0], info->cmd_param[1]); + node = -1; + return node; + } + node = info->cmd_param[1] * RX_NUM + info->cmd_param[0]; + dev_info(&info->client->dev, "%s: node = %d\n", __func__, + node); + return node; + +} + +static void not_support_cmd(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + char buff[16] = {0}; + + set_default_result(info); + sprintf(buff, "%s", "NA"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 4; + dev_info(&info->client->dev, "%s: \"%s(%d)\"\n", __func__, + buff, strnlen(buff, sizeof(buff))); + return; +} + +static void fw_update(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + struct i2c_client *client = info->client; + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + int ret = 0; + int fw_ver = 0, ver = 0, hw_rev = 0, fw_bin_ver = 0; + int retries = 5; + const u8 *buff = 0; + mm_segment_t old_fs = {0}; + struct file *fp = NULL; + long fsize = 0, nread = 0; + + #define MMS_TS "/sdcard/melfas_fw.bin" + + set_default_result(info); + + hw_rev = get_hw_version(info); + fw_bin_ver = FW_VERSION; + fw_ver = get_fw_version(info, SEC_CONFIG); + dev_info(&client->dev, "fw_ic_ver = 0x%02x, fw_bin_ver = 0x%02x\n", + fw_ver, fw_bin_ver); + + if (info->cmd_param[0] == 0 + && fw_ver >= fw_bin_ver) { + dev_info(&client->dev, "fw version update does not need\n"); + goto do_not_need_update; + } + + switch (info->cmd_param[0]) { + case BUILT_IN: + buff = MELFAS_binary; + fsize = MELFAS_binary_nLength; + dev_info(&client->dev, "built in fw(0x%02x) is loaded!!\n", + fw_bin_ver); +#if ISC_DL_MODE + ret = isc_fw_update(info); +#else + ret = isp_fw_update(info); +#endif + + if (ret) { + dev_err(&client->dev, + "failed to initialize (%d)\n", ret); + } + + ver = get_fw_version(info, SEC_CONFIG); + info->fw_ic_ver = ver; + + if (info->cmd_param[0] == 1) { + dev_info(&client->dev, + "fw update done. ver = 0x%02x\n", ver); + info->cmd_state = 2; + enable_irq(info->irq); + return; + } else if (ver == fw_bin_ver) { + dev_info(&client->dev, + "fw update done. ver = 0x%02x\n", ver); + info->cmd_state = 2; + enable_irq(info->irq); + return; + } else { + dev_err(&client->dev, "ERROR : fw version is still wrong (0x%x != 0x%x)\n", + ver, FW_VERSION); + } + + break; + + case UMS: + old_fs = get_fs(); + set_fs(get_ds()); + + fp = filp_open(MMS_TS, O_RDONLY, 0); + if (IS_ERR(fp)) { + dev_err(&client->dev, + "file %s open error:%d\n", MMS_TS, (s32)fp); + info->cmd_state = 3; + goto err_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + dev_err(&client->dev, "fail to alloc buffer for fw\n"); + info->cmd_state = 3; + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + dev_err(&client->dev, "fail to read file %s (nread = %ld)\n", + MMS_TS, nread); + info->cmd_state = 3; + goto err_fw_size; + } + + filp_close(fp, current->files); + set_fs(old_fs); + dev_info(&client->dev, "ums fw is loaded!!\n"); + break; + + default: + dev_err(&client->dev, "invalid fw file type!!\n"); + goto not_support; + } + + disable_irq(info->irq); + while (retries--) { + i2c_lock_adapter(adapter); + info->pdata->mux_fw_flash(true); + + ret = isp_fw_download(info, (const u8 *)buff, + (const size_t)fsize); + + info->pdata->mux_fw_flash(false); + i2c_unlock_adapter(adapter); + + if (ret < 0) { + dev_err(&client->dev, "retrying flashing\n"); + continue; + } + + ver = get_fw_version(info, SEC_CONFIG); + info->fw_ic_ver = ver; + + if (info->cmd_param[0] == 1) { + dev_info(&client->dev, + "fw update done. ver = 0x%02x\n", ver); + info->cmd_state = 2; + enable_irq(info->irq); + return; + } else if (ver == fw_bin_ver) { + dev_info(&client->dev, + "fw update done. ver = 0x%02x\n", ver); + info->cmd_state = 2; + enable_irq(info->irq); + return; + } else { + dev_err(&client->dev, "ERROR : fw version is still wrong (0x%x != 0x%x)\n", + ver, FW_VERSION); + } + dev_err(&client->dev, "retrying flashing\n"); + } + +err_fw_size: + kfree(buff); +err_alloc: + filp_close(fp, NULL); +err_open: + set_fs(old_fs); +not_support: +do_not_need_update: + info->cmd_state = 2; + return; +} + +static void get_fw_ver_bin(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + int hw_rev; + + set_default_result(info); + hw_rev = get_hw_version(info); + + snprintf(buff, sizeof(buff), "ME0453%02x", FW_VERSION); + + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); +} + +static void get_fw_ver_ic(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + + set_default_result(info); + + if (info->enabled) { + info->fw_boot_ver = get_fw_version(info, SEC_BOOTLOADER); + info->fw_core_ver = get_fw_version(info, SEC_CORE); + info->fw_ic_ver = get_fw_version(info, SEC_CONFIG); + } + snprintf(buff, sizeof(buff), "ME%02x%02x%02x", + info->fw_boot_ver, info->fw_core_ver, info->fw_ic_ver); + + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); +} + +static void get_config_ver(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[20] = {0}; + + set_default_result(info); + + snprintf(buff, sizeof(buff), "0x%X", info->fw_ic_ver); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); +} + +static void get_threshold(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + int threshold; + + set_default_result(info); + + disable_irq(info->irq); + threshold = i2c_smbus_read_byte_data(info->client, 0x05); + enable_irq(info->irq); + if (threshold < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 3; + return; + } + snprintf(buff, sizeof(buff), "%d", threshold); + + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); +} + +static void module_off_master(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[3] = {0}; + + mutex_lock(&info->lock); + if (info->enabled) { + disable_irq(info->irq); + info->enabled = false; + touch_is_pressed = 0; + } + mutex_unlock(&info->lock); + + info->pdata->vdd_on(0); + + if (info->pdata->is_vdd_on() == 0) + snprintf(buff, sizeof(buff), "%s", "OK"); + else + snprintf(buff, sizeof(buff), "%s", "NG"); + + set_default_result(info); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + + if (strncmp(buff, "OK", 2) == 0) + info->cmd_state = 2; + else + info->cmd_state = 3; + + dev_info(&info->client->dev, "%s: %s\n", __func__, buff); +} + +static void module_on_master(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[3] = {0}; + + mms_pwr_on_reset(info); + + mutex_lock(&info->lock); + if (!info->enabled) { + enable_irq(info->irq); + info->enabled = true; + } + mutex_unlock(&info->lock); + + if (info->pdata->is_vdd_on() == 1) + snprintf(buff, sizeof(buff), "%s", "OK"); + else + snprintf(buff, sizeof(buff), "%s", "NG"); + + set_default_result(info); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + + if (strncmp(buff, "OK", 2) == 0) + info->cmd_state = 2; + else + info->cmd_state = 3; + + dev_info(&info->client->dev, "%s: %s\n", __func__, buff); + +} + +static void get_chip_vendor(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + + set_default_result(info); + + snprintf(buff, sizeof(buff), "%s", "MELFAS"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); +} + +static void get_chip_name(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + + set_default_result(info); + + snprintf(buff, sizeof(buff), "%s", info->pdata->tsp_ic_name); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); +} + +static void get_reference(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + unsigned int val; + int node; + + set_default_result(info); + node = check_rx_tx_num(info); + + if (node < 0) + return; + + val = info->reference[node]; + snprintf(buff, sizeof(buff), "%u", val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, strnlen(buff, sizeof(buff))); + +} + +static void get_cm_abs(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + unsigned int val; + int node; + + set_default_result(info); + node = check_rx_tx_num(info); + + if (node < 0) + return; + + val = info->raw[node]; + snprintf(buff, sizeof(buff), "%u", val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff, + strnlen(buff, sizeof(buff))); +} + +static void get_cm_delta(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + unsigned int val; + int node; + + set_default_result(info); + node = check_rx_tx_num(info); + + if (node < 0) + return; + + val = info->inspection[node]; + snprintf(buff, sizeof(buff), "%u", val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff, + strnlen(buff, sizeof(buff))); +} + +static void get_intensity(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + unsigned int val; + int node; + + set_default_result(info); + node = check_rx_tx_num(info); + + if (node < 0) + return; + + val = info->intensity[node]; + + snprintf(buff, sizeof(buff), "%u", val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff, + strnlen(buff, sizeof(buff))); +} + +static void get_x_num(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + int val; + + set_default_result(info); + disable_irq(info->irq); + val = i2c_smbus_read_byte_data(info->client, 0x0B); + enable_irq(info->irq); + if (val < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 3; + + dev_err(&info->client->dev, + "%s: fail to read num of x (%d).\n", __func__, val); + + return ; + } + snprintf(buff, sizeof(buff), "%u", val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff, + strnlen(buff, sizeof(buff))); +} + +static void get_y_num(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + char buff[16] = {0}; + int val; + + set_default_result(info); + disable_irq(info->irq); + val = i2c_smbus_read_byte_data(info->client, 0x0C); + enable_irq(info->irq); + if (val < 0) { + snprintf(buff, sizeof(buff), "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 3; + + dev_err(&info->client->dev, + "%s: fail to read num of y (%d).\n", __func__, val); + + return ; + } + snprintf(buff, sizeof(buff), "%u", val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, buff, + strnlen(buff, sizeof(buff))); +} + +static void run_reference_read(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + set_default_result(info); + /* CORE 4.5 + get_raw_data_all(info, MMS_VSC_CMD_REFER); + */ + get_raw_data(info, MMS_VSC_CMD_REFER); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s\n", __func__); +} + +static void run_cm_abs_read(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + set_default_result(info); + /* CORE 4.5 + get_raw_data_all(info, MMS_VSC_CMD_CM_ABS); + get_raw_data_all(info, MMS_VSC_CMD_EXIT); + */ + get_raw_data(info, MMS_VSC_CMD_CM_ABS); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s\n", __func__); +} + +static void run_cm_delta_read(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + set_default_result(info); + /* CORE 4.5 + get_raw_data_all(info, MMS_VSC_CMD_CM_DELTA); + get_raw_data_all(info, MMS_VSC_CMD_EXIT); + */ + get_raw_data(info, MMS_VSC_CMD_CM_DELTA); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s\n", __func__); +} + +static void run_intensity_read(void *device_data) +{ + struct mms_ts_info *info = (struct mms_ts_info *)device_data; + + set_default_result(info); + /* CORE 4.5 + get_raw_data_all(info, MMS_VSC_CMD_INTENSITY); + */ + get_intensity_data(info); + info->cmd_state = 2; + + dev_info(&info->client->dev, "%s\n", __func__); +} + +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + + char *cur, *start, *end; + char buff[TSP_CMD_STR_LEN] = {0}; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + + + if (info->cmd_is_running == true) { + dev_err(&info->client->dev, "tsp_cmd: other cmd is running.\n"); + goto err_out; + } + + + /* check lock */ + mutex_lock(&info->cmd_lock); + info->cmd_is_running = true; + mutex_unlock(&info->cmd_lock); + + info->cmd_state = 1; + + for (i = 0; i < ARRAY_SIZE(info->cmd_param); i++) + info->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + memset(info->cmd, 0x00, ARRAY_SIZE(info->cmd)); + memcpy(info->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(buff, buf, cur - buf); + else + memcpy(buff, buf, len); + + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &info->cmd_list_head, list) { + if (!strcmp(buff, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &info->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(buff, 0x00, ARRAY_SIZE(buff)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(buff, start, end - start); + *(buff + strlen(buff)) = '\0'; + if (kstrtoint(buff, 10, + info->cmd_param + param_cnt) < 0) + goto err_out; + start = cur + 1; + memset(buff, 0x00, ARRAY_SIZE(buff)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + + dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + for (i = 0; i < param_cnt; i++) + dev_info(&client->dev, "cmd param %d= %d\n", i, + info->cmd_param[i]); + + tsp_cmd_ptr->cmd_func(info); + + +err_out: + return count; +} + +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + char buff[16] = {0}; + + dev_info(&info->client->dev, "tsp cmd: status:%d\n", info->cmd_state); + + if (info->cmd_state == 0) + snprintf(buff, sizeof(buff), "WAITING"); + + else if (info->cmd_state == 1) + snprintf(buff, sizeof(buff), "RUNNING"); + + else if (info->cmd_state == 2) + snprintf(buff, sizeof(buff), "OK"); + + else if (info->cmd_state == 3) + snprintf(buff, sizeof(buff), "FAIL"); + + else if (info->cmd_state == 4) + snprintf(buff, sizeof(buff), "NOT_APPLICABLE"); + + return snprintf(buf, TSP_BUF_SIZE, "%s\n", buff); +} + +static ssize_t show_cmd_result(struct device *dev, struct device_attribute + *devattr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + + dev_info(&info->client->dev, "tsp cmd: result: %s\n", info->cmd_result); + + mutex_lock(&info->cmd_lock); + info->cmd_is_running = false; + mutex_unlock(&info->cmd_lock); + + info->cmd_state = 0; + + return snprintf(buf, TSP_BUF_SIZE, "%s\n", info->cmd_result); +} + +#ifdef ESD_DEBUG + +static bool intensity_log_flag; + +static ssize_t show_intensity_logging_on(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct file *fp; + char log_data[160] = {0,}; + char buff[16] = {0,}; + mm_segment_t old_fs; + long nwrite; + u32 val; + int i, y, c; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + +#define MELFAS_DEBUG_LOG_PATH "/sdcard/melfas_log" + + dev_info(&client->dev, "%s: start.\n", __func__); + fp = filp_open(MELFAS_DEBUG_LOG_PATH, O_RDWR|O_CREAT, + S_IRWXU|S_IRWXG|S_IRWXO); + if (IS_ERR(fp)) { + dev_err(&client->dev, "%s: fail to open log file\n", __func__); + goto open_err; + } + + intensity_log_flag = 1; + do { + for (y = 0; y < 3; y++) { + /* for tx chanel 0~2 */ + memset(log_data, 0x00, 160); + + snprintf(buff, 16, "%1u: ", y); + strncat(log_data, buff, strnlen(buff, 16)); + + for (i = 0; i < RX_NUM; i++) { + val = get_raw_data_one(info, i, y, + MMS_VSC_CMD_INTENSITY); + snprintf(buff, 16, "%5u, ", val); + strncat(log_data, buff, strnlen(buff, 16)); + } + memset(buff, '\n', 2); + c = (y == 2) ? 2 : 1; + strncat(log_data, buff, c); + nwrite = vfs_write(fp, (const char __user *)log_data, + strnlen(log_data, 160), &fp->f_pos); + } + usleep_range(5000); + } while (intensity_log_flag); + + filp_close(fp, current->files); + set_fs(old_fs); + + return 0; + + open_err: + set_fs(old_fs); + return FAIL; +} + +static ssize_t show_intensity_logging_off(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + intensity_log_flag = 0; + usleep_range(10000); + get_raw_data_all(info, MMS_VSC_CMD_EXIT); + return 0; +} + +#endif + +#ifdef SEC_TKEY_FACTORY_TEST +static ssize_t tkey_threshold_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int tkey_threshold; + + disable_irq(info->irq); + tkey_threshold = i2c_smbus_read_byte_data(info->client, 0x20); + dev_info(&client->dev, "touch key threshold: %d\n", tkey_threshold); + enable_irq(info->irq); + return snprintf(buf, sizeof(int), "%d\n", tkey_threshold); +} + +static ssize_t back_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int i, ret, val; + + for (i = 0; i < ARRAY_SIZE(info->keycode); i++) { + if (info->keycode[i] == KEY_BACK) + break; + } + dev_info(&client->dev, "back key state: %d\n", info->key_pressed[i]); + + /* back key*/ + ret = get_raw_data_tkey(info, 1, VSC_INTENSITY_TK); + + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t home_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int i, ret, val; + + for (i = 0; i < ARRAY_SIZE(info->keycode); i++) { + if (info->keycode[i] == KEY_HOMEPAGE) + break; + } + dev_info(&client->dev, "home key state: %d\n", info->key_pressed[i]); + + /* home key*/ + ret = get_raw_data_tkey(info, 1, VSC_INTENSITY_TK); + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t recent_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int i, ret, val; + + for (i = 0; i < ARRAY_SIZE(info->keycode); i++) { + if (info->keycode[i] == KEY_F3) + break; + } + dev_info(&client->dev, "recent key state: %d\n", info->key_pressed[i]); + + /* recent key*/ + ret = get_raw_data_tkey(info, 2, VSC_INTENSITY_TK); + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t menu_key_state_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int i, ret, val; + + for (i = 0; i < ARRAY_SIZE(info->keycode); i++) { + if (info->keycode[i] == KEY_MENU) + break; + } + dev_info(&client->dev, "menu key state: %d\n", info->key_pressed[i]); + + /* menu key*/ + ret = get_raw_data_tkey(info, 0, VSC_INTENSITY_TK); + + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t tkey_rawcounter_show0(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + u32 ret; + u16 val; + + /* back key*/ + ret = get_raw_data_tkey(info, 0, VSC_RAW_TK); + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t tkey_rawcounter_show1(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int ret; + u16 val; + + /* home key*/ + ret = get_raw_data_tkey(info, 1, VSC_RAW_TK); + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t tkey_rawcounter_show2(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int ret; + u16 val; + + /* recent key*/ + ret = get_raw_data_tkey(info, 2, VSC_RAW_TK); + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} + +static ssize_t tkey_rawcounter_show3(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct mms_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + int ret; + u16 val; + + /* menu key*/ + ret = get_raw_data_tkey(info, 3, VSC_RAW_TK); + if (ret < 0) + dev_err(&client->dev, "%s: fail to read (%d)\n", __func__, ret); + + val = (u16)ret; + + dev_info(&client->dev, "%s: val=%d\n", __func__, val); + return sprintf(buf, "%d\n", val); +} +#endif + + + +#ifdef SEC_TKEY_FACTORY_TEST +static DEVICE_ATTR(touchkey_threshold, S_IRUGO, tkey_threshold_show, NULL); +static DEVICE_ATTR(touchkey_back, S_IRUGO, back_key_state_show, NULL); +static DEVICE_ATTR(touchkey_home, S_IRUGO, home_key_state_show, NULL); +static DEVICE_ATTR(touchkey_recent, S_IRUGO, recent_key_state_show, NULL); +static DEVICE_ATTR(touchkey_menu, S_IRUGO, menu_key_state_show, NULL); +static DEVICE_ATTR(touchkey_raw_data0, S_IRUGO, tkey_rawcounter_show0, NULL) ; +static DEVICE_ATTR(touchkey_raw_data1, S_IRUGO, tkey_rawcounter_show1, NULL) ; +static DEVICE_ATTR(touchkey_raw_data2, S_IRUGO, tkey_rawcounter_show2, NULL) ; +static DEVICE_ATTR(touchkey_raw_data3, S_IRUGO, tkey_rawcounter_show3, NULL) ; + +static struct attribute *touchkey_attributes[] = { + &dev_attr_touchkey_threshold.attr, + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_home.attr, + &dev_attr_touchkey_recent.attr, + &dev_attr_touchkey_menu.attr, + &dev_attr_touchkey_raw_data0.attr, + &dev_attr_touchkey_raw_data1.attr, + &dev_attr_touchkey_raw_data2.attr, + &dev_attr_touchkey_raw_data3.attr, + NULL, +}; +static struct attribute_group touchkey_attr_group = { + .attrs = touchkey_attributes, +}; + +static int factory_init_tk(struct mms_ts_info *info) +{ + struct i2c_client *client = info->client; + int ret; + + info->dev_tk = device_create(sec_class, NULL, (dev_t)NULL, info, + "sec_touchkey"); + if (IS_ERR(info->dev_tk)) { + dev_err(&client->dev, "Failed to create fac touchkey dev\n"); + ret = -ENODEV; + info->dev_tk = NULL; + goto err_create_dev_tk; + } + + ret = sysfs_create_group(&info->dev_tk->kobj, &touchkey_attr_group); + if (ret) { + dev_err(&client->dev, "Failed to create sysfs (touchkey_attr_group).\n"); + ret = (ret > 0) ? -ret : ret; + goto err_create_tk_sysfs; + } + + info->key_pressed = kzalloc(sizeof(bool) * ARRAY_SIZE(info->keycode), + GFP_KERNEL); + if (!info->key_pressed) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_alloc; + } + + return 0; + +err_alloc: + sysfs_remove_group(&info->dev_tk->kobj, &touchkey_attr_group); +err_create_tk_sysfs: +err_create_dev_tk: + return ret; +} +#endif + + +static DEVICE_ATTR(close_tsp_test, S_IRUGO, show_close_tsp_test, NULL); +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); +#ifdef ESD_DEBUG +static DEVICE_ATTR(intensity_logging_on, S_IRUGO, show_intensity_logging_on, + NULL); +static DEVICE_ATTR(intensity_logging_off, S_IRUGO, show_intensity_logging_off, + NULL); +#endif + +static struct attribute *sec_touch_facotry_attributes[] = { + &dev_attr_close_tsp_test.attr, + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, +#ifdef ESD_DEBUG + &dev_attr_intensity_logging_on.attr, + &dev_attr_intensity_logging_off.attr, +#endif + NULL, +}; + +static struct attribute_group sec_touch_factory_attr_group = { + .attrs = sec_touch_facotry_attributes, +}; +#endif /* SEC_TSP_FACTORY_TEST */ + + +struct class *sec_class; + +static int __init mms_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + struct mms_ts_info *info; + struct input_dev *input_dev; + int ret = 0; + int i; + int boot_v, core_v, config_v, fw_v; +#ifdef SEC_TSP_FACTORY_TEST + struct device *fac_dev_ts; +#endif + touch_is_pressed = 0; + + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) + return -EIO; + + info = kzalloc(sizeof(struct mms_ts_info), GFP_KERNEL); + if (!info) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_alloc; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&client->dev, "Failed to allocate memory for input device\n"); + ret = -ENOMEM; + goto err_input_alloc; + } + + info->client = client; + info->input_dev = input_dev; + info->pdata = client->dev.platform_data; + info->irq = -1; + mutex_init(&info->lock); + if (info->pdata) { + info->max_x = info->pdata->max_x; + info->max_y = info->pdata->max_y; + info->invert_x = info->pdata->invert_x; + info->invert_y = info->pdata->invert_y; + } else { + info->max_x = 720; + info->max_y = 1280; + } + + client->irq = gpio_to_irq(info->pdata->gpio_int); + + i2c_set_clientdata(client, info); +/* + ret = get_hw_version(info); + if (ret < 0 && ret != 0xff) { + dev_err(&client->dev, + "failed to i2c transfer..no device[%d]\n", ret); + goto err_i2c_transfer; + } +*/ + info->register_cb = info->pdata->register_cb; + info->callbacks.inform_charger = melfas_ta_cb; + if (info->register_cb) + info->register_cb(&info->callbacks); + + info->use_surface_touch = info->pdata->use_surface_touch; + + input_mt_init_slots(input_dev, MAX_FINGERS, 0); + + snprintf(info->phys, sizeof(info->phys), + "%s/input0", dev_name(&client->dev)); + input_dev->name = "sec_touchscreen"; /*= "Melfas MMSxxx Touchscreen";*/ + input_dev->phys = info->phys; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + printk("mms_ts_probe, max_x %d, max_y %d\n", info->max_x, info->max_y); + input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, MAX_WIDTH, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, + 0, info->max_x, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, + 0, info->max_y, 0, 0); + if (info->use_surface_touch) { + input_set_abs_params(info->input_dev, ABS_MT_TOUCH_MAJOR, + 0, MAX_PRESSURE, 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_TOUCH_MINOR, + 0, MAX_PRESSURE, 0, 0); + +#if 0 /* SPRD's test code */ + input_set_abs_params(input_dev, ABS_MT_ANGLE, + MIN_ANGLE, MAX_ANGLE, 0, 0); + input_set_abs_params(input_dev, ABS_MT_PALM, + 0, 1, 0, 0); +#endif + } + + if (info->pdata->use_touchkey) { + dev_info(&client->dev, "Melfas ts use touchkey\n"); + info->use_touchkey = info->pdata->use_touchkey; + memcpy(info->keycode, info->pdata->touchkey_keycode, + sizeof(info->pdata->touchkey_keycode)); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_LED, input_dev->evbit); + __set_bit(LED_MISC, input_dev->ledbit); + for (i = 0; i < ARRAY_SIZE(info->keycode); i++) + set_bit(info->keycode[i], input_dev->keybit); + } + + input_set_drvdata(input_dev, info); + + ret = input_register_device(input_dev); + if (ret) { + dev_err(&client->dev, + "Failed to register input dev (%d)\n", ret); + goto err_reg_input_dev; + } + +#ifdef CONFIG_SEC_DVFS +#if TOUCH_BOOSTER + mutex_init(&info->dvfs_lock); + INIT_DELAYED_WORK(&info->work_dvfs_off, set_dvfs_off); + info->dvfs_lock_status = false; +#endif +#endif + /* Turn on touch screen power */ + info->pdata->vdd_on(1); + + /* Key led power */ + info->pdata->tkey_led_vdd_on(1); + +#if ISC_DL_MODE + info->fw_core_ver = get_fw_version(info, SEC_CORE); + dev_info(&client->dev, "core version : 0x%02x\n", info->fw_core_ver); + + if (info->fw_core_ver != 0x53) { + dev_err(&client->dev, "core version must be 0x53\n"); + dev_info(&client->dev, "excute core firmware update\n"); + ret = isp_fw_update(info); + if (ret) { + dev_err(&client->dev, + "Failed to initialize (%d)\n", ret); + goto err_reg_input_dev; + } + info->fw_core_ver = get_fw_version(info, SEC_CORE); + } + + info->fw_ic_ver = get_fw_version(info, SEC_CONFIG); + if ((info->fw_ic_ver < FW_VERSION) || (info->fw_ic_ver == 0xff)) { + dev_info(&client->dev, "firmware update\n"); + dev_info(&client->dev, "ic:0x%x, bin:0x%x\n", + info->fw_ic_ver, FW_VERSION); + ret = isc_fw_update(info); + if (ret) { + dev_err(&client->dev, "retry isp fw update\n"); + ret = isp_fw_update(info); + if (ret) { + dev_err(&client->dev, + "Failed to initialize (%d)\n", ret); + goto err_reg_input_dev; + } + } + } +#else + info->fw_ic_ver = get_fw_version(info, SEC_CONFIG); + if (info->fw_ic_ver == FW_VERSION) + dev_info(&client->dev, "fw update does not need(1)\n"); +/* SPRD remove this part */ +/* + else if (machine_is_jasper2()) + ret = isp_fw_update(info); +*/ + else + dev_info(&client->dev, "fw update does not need(2)\n"); + +#endif + info->palm_status = 0; + info->enabled = true; + + mms_ts_finish_config(info); + +#ifdef CONFIG_HAS_EARLYSUSPEND + info->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN - 1; + info->early_suspend.suspend = mms_ts_early_suspend; + info->early_suspend.resume = mms_ts_late_resume; + register_early_suspend(&info->early_suspend); +#endif + + boot_v = i2c_smbus_read_byte_data(info->client, 0xE1); + core_v = i2c_smbus_read_byte_data(info->client, 0xE2); + config_v = i2c_smbus_read_byte_data(info->client, 0xE3); + fw_v = i2c_smbus_read_byte_data(info->client, 0xF3); + + dev_info(&client->dev, "Boot:0x%02x, CORE:0x%02x, CONFIG:0x%02x, %d\n", + boot_v, core_v, config_v, fw_v); + +#ifdef SEC_TSP_FACTORY_TEST + INIT_LIST_HEAD(&info->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &info->cmd_list_head); + + mutex_init(&info->cmd_lock); + info->cmd_is_running = false; + + sec_class = class_create(THIS_MODULE, "sec"); + if (IS_ERR(sec_class)) { + pr_err("Failed to create class(sec)!\n"); + return PTR_ERR(sec_class); + } + + fac_dev_ts = device_create(sec_class, + NULL, 0, info, "tsp"); + if (IS_ERR(fac_dev_ts)) + dev_err(&client->dev, "Failed to create device for the sysfs\n"); + + ret = sysfs_create_group(&fac_dev_ts->kobj, + &sec_touch_factory_attr_group); + if (ret < 0) { + dev_err(&client->dev, "Failed to create sysfs group\n"); + goto err_sysfs_create_group_touch; + } +#endif + +#ifdef SEC_TKEY_FACTORY_TEST + ret = factory_init_tk(info); + if (ret < 0) { + dev_err(&client->dev, "Failed to init factory init (tk)\n"); + goto err_factory_init; + } +#endif + +#ifdef CONFIG_LEDS_CLASS + if (info->pdata->use_touchkey) { + info->leds.name = TOUCHKEY_BACKLIGHT; + info->leds.brightness = LED_FULL; + info->leds.max_brightness = LED_FULL; + info->leds.brightness_set = msm_tkey_led_set; + + ret = led_classdev_register(&client->dev, &info->leds); + if (ret) { + dev_err(&client->dev, + "Failed to register led(%d)\n", ret); + goto fail_led_reg; + } + } +#endif + + return 0; +#ifdef CONFIG_LEDS_CLASS +fail_led_reg: + led_classdev_unregister(&info->leds); +#endif +#ifdef SEC_TSP_FACTORY_TEST +err_sysfs_create_group_touch: + sysfs_remove_group(&fac_dev_ts->kobj, + &sec_touch_factory_attr_group); +#endif +#ifdef SEC_TKEY_FACTORY_TEST +err_factory_init: + free_irq(info->irq, info); +#endif +err_reg_input_dev: + input_free_device(input_dev); +//err_i2c_transfer: +err_input_alloc: + kfree(info->fw_name); + kfree(info); +err_alloc: + /* turn off power */ + info->pdata->vdd_on(0); + /* Key led power */ + info->pdata->tkey_led_vdd_on(0); + return ret; +} + +static int __exit mms_ts_remove(struct i2c_client *client) +{ + struct mms_ts_info *info = i2c_get_clientdata(client); + + led_classdev_unregister(&info->leds); + if (info->irq >= 0) + free_irq(info->irq, info); + input_unregister_device(info->input_dev); +#ifdef SEC_TKEY_FACTORY_TEST + sysfs_remove_group(&info->dev_tk->kobj, &touchkey_attr_group); + kfree(info->key_pressed); +#endif + kfree(info->fw_name); + kfree(info); + + return 0; +} + +#if defined(CONFIG_PM) || defined(CONFIG_HAS_EARLYSUSPEND) +static int mms_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + + if (!info->enabled) + return 0; + + pr_notice("%s: users=%d\n", __func__, info->input_dev->users); + mutex_lock(&info->input_dev->mutex); + if (!info->input_dev->users) + goto out; +#ifdef CONFIG_LEDS_CLASS + if (info->pdata->use_touchkey) { + info->tkey_led_reserved = true; + info->pdata->tkey_led_vdd_on(0); + } +#endif + disable_irq(info->irq); + info->enabled = false; + touch_is_pressed = 0; + release_all_fingers(info); + info->pdata->vdd_on(0); + msleep(50); + +out: + mutex_unlock(&info->input_dev->mutex); + return 0; +} + +static int mms_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct mms_ts_info *info = i2c_get_clientdata(client); + + if (info->enabled) + return 0; + + pr_notice("%s: users=%d\n", __func__, info->input_dev->users); + + info->pdata->vdd_on(1); + msleep(120); +#ifdef CONFIG_LEDS_CLASS + if (info->pdata->use_touchkey && info->tkey_led_reserved) { + info->tkey_led_reserved = false; + info->pdata->tkey_led_vdd_on(1); + } +#endif + + if (info->ta_status) { + dev_notice(&client->dev, "TA connect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x1); + } else { + dev_notice(&client->dev, "TA disconnect!!!\n"); + i2c_smbus_write_byte_data(info->client, 0x33, 0x2); + } + + mutex_lock(&info->input_dev->mutex); + info->enabled = true; + mms_set_noise_mode(info); + enable_irq(info->irq); + mutex_unlock(&info->input_dev->mutex); + + return 0; +} +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void mms_ts_early_suspend(struct early_suspend *h) +{ + struct mms_ts_info *info; + info = container_of(h, struct mms_ts_info, early_suspend); + mms_ts_suspend(&info->client->dev); +} + +static void mms_ts_late_resume(struct early_suspend *h) +{ + struct mms_ts_info *info; + info = container_of(h, struct mms_ts_info, early_suspend); + mms_ts_resume(&info->client->dev); +} +#endif + +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) +static const struct dev_pm_ops mms_ts_pm_ops = { + .suspend = mms_ts_suspend, + .resume = mms_ts_resume, +}; +#endif + +static const struct i2c_device_id mms_ts_id[] = { + { "mms_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, mms_ts_id); + +static struct i2c_driver mms_ts_driver = { + .probe = mms_ts_probe, + .remove = mms_ts_remove, + .driver = { + .name = "mms_ts", +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) + .pm = &mms_ts_pm_ops, +#endif + }, + .id_table = mms_ts_id, +}; + +static int __init mms_ts_init(void) +{ +#ifdef CONFIG_SAMSUNG_LPM_MODE + if (poweroff_charging) { + pr_notice("%s : LPM Charging Mode!!\n", __func__); + return 0; + } +#endif + + return i2c_add_driver(&mms_ts_driver); +} + +static void __exit mms_ts_exit(void) +{ + i2c_del_driver(&mms_ts_driver); +} + +module_init(mms_ts_init); +module_exit(mms_ts_exit); + +/* Module information */ +MODULE_DESCRIPTION("Touchscreen driver for Melfas MMS-series controllers"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/mms_ts_fw.h b/drivers/input/touchscreen/mms_ts_fw.h new file mode 100644 index 00000000..7653cce1 --- /dev/null +++ b/drivers/input/touchscreen/mms_ts_fw.h @@ -0,0 +1,29 @@ +/* Melfas MMS-100 seies firmware list */ + + +#if defined(CONFIG_MACH_JASPER2) +#define FW_VERSION 0x2 +#include "jasper2_fw.h" + +#elif defined(CONFIG_MACH_STUNNER) +#define SEC_TKEY_FACTORY_TEST +#define FW_VERSION 0x20 +#include "stunner_fw.h" + +#elif defined(CONFIG_MACH_INGRAHAM2) +#define SEC_TKEY_FACTORY_TEST +#define FW_VERSION 0x1 +#include "ingraham2_fw.h" + +#else +#define FW_VERSION 0x0 +const size_t MELFAS_binary_nLength = 0x00; +const u8 MELFAS_binary[] = { + +}; +#endif + +#if defined(CONFIG_MIPI_SAMSUNG_ESD_REFRESH) +extern void set_esd_enable(void); +extern void set_esd_disable(void); +#endif diff --git a/drivers/input/touchscreen/msg2138.c b/drivers/input/touchscreen/msg2138.c new file mode 100644 index 00000000..efa1e76d --- /dev/null +++ b/drivers/input/touchscreen/msg2138.c @@ -0,0 +1,4581 @@ +/* + * Driver for Pixcir I2C touchscreen controllers. + * + * Copyright (C) 2010-2011 Pixcir, Inc. + * + * pixcir_i2c_ts.c V3.ss0 from v3.0 support TangoC solution and remove the previous soltutions + * + * pixcir_i2c_ts.c V3.1 Add bootloader function 7 + * Add RESET_TP 9 + * Add ENABLE_IRQ 10 + * Add DISABLE_IRQ 11 + * Add BOOTLOADER_STU 16 + * Add ATTB_VALUE 17 + * Add Write/Read Interface for APP software + * + * pixcir_i2c_ts.c V3.2.0A for INT_MODE 0x0A + * arrange to pixcir 10 slot + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#if defined(CONFIG_I2C_SPRD) || defined(CONFIG_I2C_SPRD_V1) +#include +#endif + +#include +#include +#include + +/*********************************Bee-0928-TOP****************************************/ +//#define SYSFS_DEBUG //cg,20130929 +//#define PIXCIR_DEBUG +//#define PIXCIR_CQ_CALL 0 +#ifdef PIXCIR_DEBUG +#define PIXCIR_DBG(format, ...) \ + printk(KERN_INFO "PIXCIR_TS " format "\n", ## __VA_ARGS__) +#define TPD_DEBUG(format, ...) \ + printk(KERN_INFO "PIXCIR_TS " format "\n", ## __VA_ARGS__) +#else +#define PIXCIR_DBG(format, ...) +#define TPD_DEBUG(format, ...) +#endif + +#define USE_WAIT_QUEUE 1 +#define USE_THREADED_IRQ 0 +#define USE_WORK_QUEUE 0 + +#define TOUCH_VIRTUAL_KEYS +//#define TP_X_CHANGE +#define TP_XY_CHANGE 0 +#define SLAVE_ADDR 0x48 +#define BOOTLOADER_ADDR 0x5d + +#ifndef I2C_MAJOR +#define I2C_MAJOR 125 +#endif + +#define I2C_MINORS 256 +#define CALIBRATION_FLAG 1 +#define BOOTLOADER 7 +#define RESET_TP 9 +#define ENABLE_IRQ 10 +#define DISABLE_IRQ 11 +#define BOOTLOADER_STU 16 +#define ATTB_VALUE 17 +#define MAX_FINGER_NUM 5 +#define X_OFFSET 30 +#define Y_OFFSET 40 +#define TPD_OK 0 + +#define TPD_REG_BASE 0x00 +#define TPD_SOFT_RESET_MODE 0x01 +#define TPD_OP_MODE 0x00 +#define TPD_LOW_PWR_MODE 0x04 +#define TPD_SYSINFO_MODE 0x10 +#define GET_HSTMODE(reg) ((reg & 0x70) >> 4) // in op mode or not +#define GET_BOOTLOADERMODE(reg) ((reg & 0x10) >> 4) // in bl mode +//#define __FIRMWARE_UPDATE__ +#define REG_RT_PRIO(x) ((x) | 0x10000000) +#define RTPM_PRIO_TPD REG_RT_PRIO(4) + +#if USE_WAIT_QUEUE +static struct task_struct *thread = NULL; +static DECLARE_WAIT_QUEUE_HEAD(waiter); +static int tpd_flag = 0; +#endif + +struct pixcir_i2c_ts_data { + struct i2c_client *client; + struct input_dev *input; +#if USE_WORK_QUEUE + struct work_struct pen_event_work; + struct workqueue_struct *ts_workqueue; +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND + struct work_struct resume_work; + struct workqueue_struct *ts_resume_workqueue; + struct early_suspend early_suspend; +#endif + struct msg2138_ts_platform_data *platform_data; + //const struct pixcir_ts_platform_data *chip; + bool exiting; +}; + +static unsigned char bl_cmd[] = { + 0x00, 0xFF, 0xA5, + 0x00, 0x01, 0x02, + 0x03, 0x04, 0x05, + 0x06, 0x07 +}; + //exit bl mode +struct tpd_operation_data_t { + unsigned char hst_mode; + unsigned char tt_mode; + unsigned char tt_stat; + + unsigned char x1_M,x1_L; + unsigned char y1_M,y1_L; + unsigned char z1; + unsigned char evnt_id; + + unsigned char x2_M,x2_L; + unsigned char y2_M,y2_L; + unsigned char r_0d; + unsigned char gest_cnt; + unsigned char gest_id; +}; +struct tpd_bootloader_data_t { + unsigned char bl_file; + unsigned char bl_status; + unsigned char bl_error; + unsigned char blver_hi,blver_lo; + unsigned char bld_blver_hi,bld_blver_lo; + + unsigned char ttspver_hi,ttspver_lo; + unsigned char appid_hi,appid_lo; + unsigned char appver_hi,appver_lo; + + unsigned char cid_0; + unsigned char cid_1; + unsigned char cid_2; +}; +struct tpd_sysinfo_data_t { + unsigned char hst_mode; + unsigned char mfg_cmd; + unsigned char mfg_stat; + unsigned char cid[3]; + unsigned char tt_undef1; + + unsigned char uid[8]; + unsigned char bl_verh; + unsigned char bl_verl; + + unsigned char tts_verh; + unsigned char tts_verl; + + unsigned char app_idh; + unsigned char app_idl; + unsigned char app_verh; + unsigned char app_verl; + + unsigned char tt_undef2[6]; + unsigned char act_intrvl; + unsigned char tch_tmout; + unsigned char lp_intrvl; +}; +struct touch_info { + int x1, y1; + int x2, y2; + int x3, y3; + int p1, p2,p3; + int count; +}; + +struct i2c_dev +{ + struct list_head list; + struct i2c_adapter *adap; + struct device *dev; +}; + +static struct i2c_client * msg21xx_i2c_client; +static struct pixcir_i2c_ts_data *msg21xx_i2c_ts_data; +//static unsigned char status_reg = 0; +static int global_irq; +static struct i2c_driver pixcir_i2c_ts_driver; +static struct class *i2c_dev_class; +static int MS_TS_MSG21XX_X_MAX = 0; +static int MS_TS_MSG21XX_Y_MAX = 0; + +static LIST_HEAD( i2c_dev_list); +static DEFINE_SPINLOCK( i2c_dev_list_lock); + +static int suspend_flag; +static struct early_suspend pixcir_early_suspend; + +static ssize_t pixcir_set_calibrate(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len); +static ssize_t pixcir_show_suspend(struct device* cd,struct device_attribute *attr, char* buf); +static ssize_t pixcir_store_suspend(struct device* cd, struct device_attribute *attr,const char* buf, size_t len); +static void pixcir_ts_suspend(struct early_suspend *handler); +static void pixcir_ts_resume(struct early_suspend *handler); + +//static struct tpd_operation_data_t g_operation_data; +static struct tpd_bootloader_data_t g_bootloader_data; +static struct tpd_sysinfo_data_t g_sysinfo_data; +#ifdef SYSFS_DEBUG +static char *cg_fw_version = NULL; +#endif //cg,20130929 + +#define CTP_ID_MSG21XX 1 +#define CTP_ID_MSG21XXA 2 +#define FW_ADDR_MSG21XX (0xC4>>1) +static int HalTscrCReadI2CSeq(u8 addr, u8* read_data, u16 size) +{ + //according to your platform. + int rc; + + struct i2c_msg msgs[] = + { + { + .addr = addr, + .flags = I2C_M_RD, + .len = size, + .buf = read_data, + }, + }; + + rc = i2c_transfer(msg21xx_i2c_client->adapter, msgs, 1); + if( rc < 0 ) + { + printk("HalTscrCReadI2CSeq error %d\n", rc); + } + return rc; +} + +static int HalTscrCDevWriteI2CSeq(u8 addr, u8* data, u16 size) +{ + //according to your platform. + int rc; + struct i2c_msg msgs[] = + { + { + .addr = addr, + .flags = 0, + .len = size, + .buf = data, + }, + }; + rc = i2c_transfer(msg21xx_i2c_client->adapter, msgs, 1); + if( rc < 0 ) + { + printk("HalTscrCDevWriteI2CSeq error %d,addr = %d\n", rc,addr); + } + return rc; +} + +#ifdef __FIRMWARE_UPDATE__ +#define FW_ADDR_MSG21XX_TP (0x4C>>1) +#define FW_UPDATE_ADDR_MSG21XX (0x92>>1) +#define TP_DEBUG printk//(x) //x// +#define DBUG printk//(x) //x +static char *fw_version = NULL; + +static u8 temp[94][1024]; +u8 Fmr_Loader[1024]; +u32 crc_tab[256]; +static u8 g_dwiic_info_data[1024]; // Buffer for info data +static int FwDataCnt; +struct class *firmware_class; +struct device *firmware_cmd_dev; + +static void dbbusDWIICEnterSerialDebugMode(void) +{ + u8 data[5]; + + // Enter the Serial Debug Mode + data[0] = 0x53; + data[1] = 0x45; + data[2] = 0x52; + data[3] = 0x44; + data[4] = 0x42; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 5); +} + +static void dbbusDWIICStopMCU(void) +{ + u8 data[1]; + + // Stop the MCU + data[0] = 0x37; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 1); +} + +static void dbbusDWIICIICUseBus(void) +{ + u8 data[1]; + + // IIC Use Bus + data[0] = 0x35; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 1); +} + +static void dbbusDWIICIICReshape(void) +{ + u8 data[1]; + + // IIC Re-shape + data[0] = 0x71; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 1); +} + +static void dbbusDWIICIICNotUseBus(void) +{ + u8 data[1]; + + // IIC Not Use Bus + data[0] = 0x34; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 1); +} + +static void dbbusDWIICNotStopMCU(void) +{ + u8 data[1]; + + // Not Stop the MCU + data[0] = 0x36; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 1); +} + +static void dbbusDWIICExitSerialDebugMode(void) +{ + u8 data[1]; + + // Exit the Serial Debug Mode + data[0] = 0x45; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, data, 1); + + // Delay some interval to guard the next transaction + udelay ( 150);//200 ); // delay about 0.2ms +} + +static void drvISP_EntryIspMode(void) +{ + u8 bWriteData[5] = + { + 0x4D, 0x53, 0x54, 0x41, 0x52 + }; + printk("\n******%s come in*******\n",__FUNCTION__); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 5); + udelay ( 150 );//200 ); // delay about 0.1ms +} + +static u8 drvISP_Read(u8 n, u8* pDataToRead) //First it needs send 0x11 to notify we want to get flash data back. +{ + u8 Read_cmd = 0x11; + unsigned char dbbus_rx_data[2] = {0}; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &Read_cmd, 1); + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay( 800 );//200); + if (n == 1) + { + HalTscrCReadI2CSeq(FW_UPDATE_ADDR_MSG21XX, &dbbus_rx_data[0], 2); + *pDataToRead = dbbus_rx_data[0]; + TP_DEBUG("dbbus=%d,%d===drvISP_Read=====\n",dbbus_rx_data[0],dbbus_rx_data[1]); + } + else + { + HalTscrCReadI2CSeq(FW_UPDATE_ADDR_MSG21XX, pDataToRead, n); + } + + return 0; +} + +static void drvISP_WriteEnable(void) +{ + u8 bWriteData[2] = + { + 0x10, 0x06 + }; + u8 bWriteData1 = 0x12; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 2); + udelay(150);//1.16 + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); +} + + +static void drvISP_ExitIspMode(void) +{ + u8 bWriteData = 0x24; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData, 1); + udelay( 150 );//200); +} + +static u8 drvISP_ReadStatus(void) +{ + u8 bReadData = 0; + u8 bWriteData[2] = + { + 0x10, 0x05 + }; + u8 bWriteData1 = 0x12; + + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 2); + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay(150);//200); + drvISP_Read(1, &bReadData); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); + return bReadData; +} + + +static void drvISP_BlockErase(u32 addr) +{ + u8 bWriteData[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; + u8 bWriteData1 = 0x12; + printk("\n******%s come in*******\n",__FUNCTION__); + u32 timeOutCount=0; + drvISP_WriteEnable(); + + //Enable write status register + bWriteData[0] = 0x10; + bWriteData[1] = 0x50; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 2); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); + + //Write Status + bWriteData[0] = 0x10; + bWriteData[1] = 0x01; + bWriteData[2] = 0x00; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 3); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); + + //Write disable + bWriteData[0] = 0x10; + bWriteData[1] = 0x04; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 2); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay(150);//200); + timeOutCount=0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 100000 ) break; /* around 1 sec timeout */ + } + drvISP_WriteEnable(); + + bWriteData[0] = 0x10; + bWriteData[1] = 0xC7;//0xD8; //Block Erase + //bWriteData[2] = ((addr >> 16) & 0xFF) ; + //bWriteData[3] = ((addr >> 8) & 0xFF) ; + //bWriteData[4] = (addr & 0xFF) ; + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 2); + //HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData, 5); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay(150);//200); + timeOutCount=0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 500000 ) break; /* around 5 sec timeout */ + } +} + +static void drvISP_Program(u16 k, u8* pDataToWrite) +{ + u16 i = 0; + u16 j = 0; + //u16 n = 0; + u8 TX_data[133]; + u8 bWriteData1 = 0x12; + u32 addr = k * 1024; + u32 timeOutCount=0; + for (j = 0; j < 8; j++) //128*8 cycle + { + TX_data[0] = 0x10; + TX_data[1] = 0x02;// Page Program CMD + TX_data[2] = (addr + 128 * j) >> 16; + TX_data[3] = (addr + 128 * j) >> 8; + TX_data[4] = (addr + 128 * j); + for (i = 0; i < 128; i++) + { + TX_data[5 + i] = pDataToWrite[j * 128 + i]; + } + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay(150);//200); + + timeOutCount=0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 100000 ) break; /* around 1 sec timeout */ + } + + drvISP_WriteEnable(); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, TX_data, 133); //write 133 byte per cycle + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); + } +} + +static ssize_t firmware_update_show ( struct device *dev, + struct device_attribute *attr, char *buf ) +{ + return sprintf ( buf, "%s\n", fw_version ); +} +/*reset the chip*/ +static void _HalTscrHWReset(void) +{ + struct msg2138_ts_platform_data *pdata = msg21xx_i2c_ts_data->platform_data; + gpio_direction_output(pdata->reset_gpio_number, 1); + gpio_set_value(pdata->reset_gpio_number, 1); + gpio_set_value(pdata->reset_gpio_number, 0); + mdelay(10); /* Note that the RST must be in LOW 10ms at least */ + gpio_set_value(pdata->reset_gpio_number, 1); + /* Enable the interrupt service thread/routine for INT after 50ms */ + mdelay(50); +} + +static void drvISP_Verify ( u16 k, u8* pDataToVerify ) +{ + u16 i = 0, j = 0; + u8 bWriteData[5] ={ 0x10, 0x03, 0, 0, 0 }; + u8 RX_data[256]; + u8 bWriteData1 = 0x12; + u32 addr = k * 1024; + u8 index = 0; + u32 timeOutCount; + for ( j = 0; j < 8; j++ ) //128*8 cycle + { + bWriteData[2] = ( u8 ) ( ( addr + j * 128 ) >> 16 ); + bWriteData[3] = ( u8 ) ( ( addr + j * 128 ) >> 8 ); + bWriteData[4] = ( u8 ) ( addr + j * 128 ); + udelay ( 100 ); // delay about 100us***** + + timeOutCount = 0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 100000 ) break; /* around 1 sec timeout */ + } + + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, bWriteData, 5 ); //write read flash addr + udelay ( 100 ); // delay about 100us***** + drvISP_Read ( 128, RX_data ); + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1 ); //cmd end + for ( i = 0; i < 128; i++ ) //log out if verify error + { + if ( ( RX_data[i] != 0 ) && index < 10 ) + { + //TP_DEBUG("j=%d,RX_data[%d]=0x%x\n",j,i,RX_data[i]); + index++; + } + if ( RX_data[i] != pDataToVerify[128 * j + i] ) + { + TP_DEBUG ( "k=%d,j=%d,i=%d===============Update Firmware Error================", k, j, i ); + } + } + } +} + +static void drvISP_ChipErase() +{ + u8 bWriteData[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; + u8 bWriteData1 = 0x12; + u32 timeOutCount = 0; + drvISP_WriteEnable(); + + //Enable write status register + bWriteData[0] = 0x10; + bWriteData[1] = 0x50; + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, bWriteData, 2 ); + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1 ); + + //Write Status + bWriteData[0] = 0x10; + bWriteData[1] = 0x01; + bWriteData[2] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, bWriteData, 3 ); + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1 ); + + //Write disable + bWriteData[0] = 0x10; + bWriteData[1] = 0x04; + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, bWriteData, 2 ); + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1 ); + udelay ( 100 ); // delay about 100us***** + timeOutCount = 0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 100000 ) break; /* around 1 sec timeout */ + } + drvISP_WriteEnable(); + + bWriteData[0] = 0x10; + bWriteData[1] = 0xC7; + + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, bWriteData, 2 ); + HalTscrCDevWriteI2CSeq ( FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1 ); + udelay ( 100 ); // delay about 100us***** + timeOutCount = 0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 500000 ) break; /* around 5 sec timeout */ + } +} + +/* update the firmware part, used by apk*/ +/*show the fw version*/ + +static ssize_t firmware_update_c2 ( struct device *dev, + struct device_attribute *attr, const char *buf, size_t size ) +{ + u8 i; + u8 dbbus_tx_data[4]; + unsigned char dbbus_rx_data[2] = {0}; + + // set FRO to 50M + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0xE2; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + dbbus_rx_data[0] = 0; + dbbus_rx_data[1] = 0; + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = dbbus_rx_data[0] & 0xF7; //Clear Bit 3 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set MCU clock,SPI clock =FRO + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x22; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x23; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable slave's ISP ECO mode + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x08; + dbbus_tx_data[2] = 0x0c; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable SPI Pad + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = ( dbbus_rx_data[0] | 0x20 ); //Set Bit 5 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // WP overwrite + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x0E; + dbbus_tx_data[3] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set pin high + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x10; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbusDWIICIICNotUseBus(); + dbbusDWIICNotStopMCU(); + dbbusDWIICExitSerialDebugMode(); + + drvISP_EntryIspMode(); + drvISP_ChipErase(); + _HalTscrHWReset(); + mdelay ( 300 ); + + // Program and Verify + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + + // Disable the Watchdog + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x60; + dbbus_tx_data[3] = 0x55; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x61; + dbbus_tx_data[3] = 0xAA; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + //Stop MCU + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x0F; + dbbus_tx_data[2] = 0xE6; + dbbus_tx_data[3] = 0x01; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set FRO to 50M + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0xE2; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + dbbus_rx_data[0] = 0; + dbbus_rx_data[1] = 0; + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = dbbus_rx_data[0] & 0xF7; //Clear Bit 3 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set MCU clock,SPI clock =FRO + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x22; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x23; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable slave's ISP ECO mode + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x08; + dbbus_tx_data[2] = 0x0c; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable SPI Pad + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = ( dbbus_rx_data[0] | 0x20 ); //Set Bit 5 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // WP overwrite + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x0E; + dbbus_tx_data[3] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set pin high + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x10; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbusDWIICIICNotUseBus(); + dbbusDWIICNotStopMCU(); + dbbusDWIICExitSerialDebugMode(); + + /////////////////////////////////////// + // Start to load firmware + /////////////////////////////////////// + drvISP_EntryIspMode(); + + for ( i = 0; i < 94; i++ ) // total 94 KB : 1 byte per R/W + { + drvISP_Program ( i, temp[i] ); // program to slave's flash + drvISP_Verify ( i, temp[i] ); //verify data + } + TP_DEBUG ( "update OK\n" ); + drvISP_ExitIspMode(); + FwDataCnt = 0; + return size; +} + +static u32 Reflect ( u32 ref, char ch ) //unsigned int Reflect(unsigned int ref, char ch) +{ + u32 value = 0; + u32 i = 0; + + for ( i = 1; i < ( ch + 1 ); i++ ) + { + if ( ref & 1 ) + { + value |= 1 << ( ch - i ); + } + ref >>= 1; + } + return value; +} + +u32 Get_CRC ( u32 text, u32 prevCRC, u32 *crc32_table ) +{ + u32 ulCRC = prevCRC; + ulCRC = ( ulCRC >> 8 ) ^ crc32_table[ ( ulCRC & 0xFF ) ^ text]; + return ulCRC ; +} +static void Init_CRC32_Table ( u32 *crc32_table ) +{ + u32 magicnumber = 0x04c11db7; + u32 i = 0, j; + + for ( i = 0; i <= 0xFF; i++ ) + { + crc32_table[i] = Reflect ( i, 8 ) << 24; + for ( j = 0; j < 8; j++ ) + { + crc32_table[i] = ( crc32_table[i] << 1 ) ^ ( crc32_table[i] & ( 0x80000000L ) ? magicnumber : 0 ); + } + crc32_table[i] = Reflect ( crc32_table[i], 32 ); + } +} + +typedef enum +{ + EMEM_ALL = 0, + EMEM_MAIN, + EMEM_INFO, +} EMEM_TYPE_t; + +static void drvDB_WriteReg8Bit ( u8 bank, u8 addr, u8 data ) +{ + u8 tx_data[4] = {0x10, bank, addr, data}; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, tx_data, 4 ); +} + +static void drvDB_WriteReg ( u8 bank, u8 addr, u16 data ) +{ + u8 tx_data[5] = {0x10, bank, addr, data & 0xFF, data >> 8}; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, tx_data, 5 ); +} + +static unsigned short drvDB_ReadReg ( u8 bank, u8 addr ) +{ + u8 tx_data[3] = {0x10, bank, addr}; + u8 rx_data[2] = {0}; + + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &rx_data[0], 2 ); + return ( rx_data[1] << 8 | rx_data[0] ); +} + +static int drvTP_erase_emem_c32 ( void ) +{ + ///////////////////////// + //Erase all + ///////////////////////// + + //enter gpio mode + drvDB_WriteReg ( 0x16, 0x1E, 0xBEAF ); + + // before gpio mode, set the control pin as the orginal status + drvDB_WriteReg ( 0x16, 0x08, 0x0000 ); + drvDB_WriteReg8Bit ( 0x16, 0x0E, 0x10 ); + mdelay ( 10 ); //MCR_CLBK_DEBUG_DELAY ( 10, MCU_LOOP_DELAY_COUNT_MS ); + + // ptrim = 1, h'04[2] + drvDB_WriteReg8Bit ( 0x16, 0x08, 0x04 ); + drvDB_WriteReg8Bit ( 0x16, 0x0E, 0x10 ); + mdelay ( 10 ); //MCR_CLBK_DEBUG_DELAY ( 10, MCU_LOOP_DELAY_COUNT_MS ); + + // ptm = 6, h'04[12:14] = b'110 + drvDB_WriteReg8Bit ( 0x16, 0x09, 0x60 ); + drvDB_WriteReg8Bit ( 0x16, 0x0E, 0x10 ); + + // pmasi = 1, h'04[6] + drvDB_WriteReg8Bit ( 0x16, 0x08, 0x44 ); + // pce = 1, h'04[11] + drvDB_WriteReg8Bit ( 0x16, 0x09, 0x68 ); + // perase = 1, h'04[7] + drvDB_WriteReg8Bit ( 0x16, 0x08, 0xC4 ); + // pnvstr = 1, h'04[5] + drvDB_WriteReg8Bit ( 0x16, 0x08, 0xE4 ); + // pwe = 1, h'04[9] + drvDB_WriteReg8Bit ( 0x16, 0x09, 0x6A ); + // trigger gpio load + drvDB_WriteReg8Bit ( 0x16, 0x0E, 0x10 ); + + return ( 1 ); +} + +static ssize_t firmware_update_c32 ( struct device *dev, struct device_attribute *attr, + const char *buf, size_t size, EMEM_TYPE_t emem_type ) +{ + u8 dbbus_tx_data[4]; + u8 dbbus_rx_data[2] = {0}; + // Buffer for slave's firmware + + u32 i, j; + u32 crc_main, crc_main_tp; + u32 crc_info, crc_info_tp; + u16 reg_data = 0; + + crc_main = 0xffffffff; + crc_info = 0xffffffff; + +#if 1 + ///////////////////////// + // Erase all + ///////////////////////// + drvTP_erase_emem_c32(); + mdelay ( 1000 ); //MCR_CLBK_DEBUG_DELAY ( 1000, MCU_LOOP_DELAY_COUNT_MS ); + + //ResetSlave(); + _HalTscrHWReset(); + //drvDB_EnterDBBUS(); + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + mdelay ( 300 ); + + // Reset Watchdog + drvDB_WriteReg8Bit ( 0x3C, 0x60, 0x55 ); + drvDB_WriteReg8Bit ( 0x3C, 0x61, 0xAA ); + + ///////////////////////// + // Program + ///////////////////////// + + //polling 0x3CE4 is 0x1C70 + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0x1C70 ); + + + drvDB_WriteReg ( 0x3C, 0xE4, 0xE38F ); // for all-blocks + + //polling 0x3CE4 is 0x2F43 + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0x2F43 ); + + + //calculate CRC 32 + Init_CRC32_Table ( &crc_tab[0] ); + + for ( i = 0; i < 33; i++ ) // total 33 KB : 2 byte per R/W + { + if ( i < 32 ) //emem_main + { + if ( i == 31 ) + { + temp[i][1014] = 0x5A; //Fmr_Loader[1014]=0x5A; + temp[i][1015] = 0xA5; //Fmr_Loader[1015]=0xA5; + + for ( j = 0; j < 1016; j++ ) + { + //crc_main=Get_CRC(Fmr_Loader[j],crc_main,&crc_tab[0]); + crc_main = Get_CRC ( temp[i][j], crc_main, &crc_tab[0] ); + } + } + else + { + for ( j = 0; j < 1024; j++ ) + { + //crc_main=Get_CRC(Fmr_Loader[j],crc_main,&crc_tab[0]); + crc_main = Get_CRC ( temp[i][j], crc_main, &crc_tab[0] ); + } + } + } + else // emem_info + { + for ( j = 0; j < 1024; j++ ) + { + //crc_info=Get_CRC(Fmr_Loader[j],crc_info,&crc_tab[0]); + crc_info = Get_CRC ( temp[i][j], crc_info, &crc_tab[0] ); + } + } + + //drvDWIIC_MasterTransmit( DWIIC_MODE_DWIIC_ID, 1024, Fmr_Loader ); + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX_TP, temp[i], 1024 ); + + // polling 0x3CE4 is 0xD0BC + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0xD0BC ); + + drvDB_WriteReg ( 0x3C, 0xE4, 0x2F43 ); + } + + //write file done + drvDB_WriteReg ( 0x3C, 0xE4, 0x1380 ); + + mdelay ( 10 ); //MCR_CLBK_DEBUG_DELAY ( 10, MCU_LOOP_DELAY_COUNT_MS ); + // polling 0x3CE4 is 0x9432 + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0x9432 ); + + crc_main = crc_main ^ 0xffffffff; + crc_info = crc_info ^ 0xffffffff; + + // CRC Main from TP + crc_main_tp = drvDB_ReadReg ( 0x3C, 0x80 ); + crc_main_tp = ( crc_main_tp << 16 ) | drvDB_ReadReg ( 0x3C, 0x82 ); + + //CRC Info from TP + crc_info_tp = drvDB_ReadReg ( 0x3C, 0xA0 ); + crc_info_tp = ( crc_info_tp << 16 ) | drvDB_ReadReg ( 0x3C, 0xA2 ); + + TP_DEBUG ( "crc_main=0x%x, crc_info=0x%x, crc_main_tp=0x%x, crc_info_tp=0x%x\n", + crc_main, crc_info, crc_main_tp, crc_info_tp ); + + //drvDB_ExitDBBUS(); + if ( ( crc_main_tp != crc_main ) || ( crc_info_tp != crc_info ) ) + { + printk ( "update FAILED\n" ); + _HalTscrHWReset(); + FwDataCnt = 0; + enable_irq(global_irq); + return ( 0 ); + } + + printk ( "update OK\n" ); + _HalTscrHWReset(); + FwDataCnt = 0; + enable_irq(global_irq); + + return size; +#endif +} + +static int drvTP_erase_emem_c33 ( EMEM_TYPE_t emem_type ) +{ + // stop mcu + drvDB_WriteReg ( 0x0F, 0xE6, 0x0001 ); + + //disable watch dog + drvDB_WriteReg8Bit ( 0x3C, 0x60, 0x55 ); + drvDB_WriteReg8Bit ( 0x3C, 0x61, 0xAA ); + + // set PROGRAM password + drvDB_WriteReg8Bit ( 0x16, 0x1A, 0xBA ); + drvDB_WriteReg8Bit ( 0x16, 0x1B, 0xAB ); + + //proto.MstarWriteReg(F1.loopDevice, 0x1618, 0x80); + drvDB_WriteReg8Bit ( 0x16, 0x18, 0x80 ); + + if ( emem_type == EMEM_ALL ) + { + drvDB_WriteReg8Bit ( 0x16, 0x08, 0x10 ); //mark + } + + drvDB_WriteReg8Bit ( 0x16, 0x18, 0x40 ); + mdelay ( 10 ); + + drvDB_WriteReg8Bit ( 0x16, 0x18, 0x80 ); + + // erase trigger + if ( emem_type == EMEM_MAIN ) + { + drvDB_WriteReg8Bit ( 0x16, 0x0E, 0x04 ); //erase main + } + else + { + drvDB_WriteReg8Bit ( 0x16, 0x0E, 0x08 ); //erase all block + } + + return ( 1 ); +} + +static int drvTP_read_emem_dbbus_c33 ( EMEM_TYPE_t emem_type, u16 addr, size_t size, u8 *p, size_t set_pce_high ) +{ + u32 i; + + // Set the starting address ( must before enabling burst mode and enter riu mode ) + drvDB_WriteReg ( 0x16, 0x00, addr ); + + // Enable the burst mode ( must before enter riu mode ) + drvDB_WriteReg ( 0x16, 0x0C, drvDB_ReadReg ( 0x16, 0x0C ) | 0x0001 ); + + // Set the RIU password + drvDB_WriteReg ( 0x16, 0x1A, 0xABBA ); + + // Enable the information block if pifren is HIGH + if ( emem_type == EMEM_INFO ) + { + // Clear the PCE + drvDB_WriteReg ( 0x16, 0x18, drvDB_ReadReg ( 0x16, 0x18 ) | 0x0080 ); + mdelay ( 10 ); + + // Set the PIFREN to be HIGH + drvDB_WriteReg ( 0x16, 0x08, 0x0010 ); + } + + // Set the PCE to be HIGH + drvDB_WriteReg ( 0x16, 0x18, drvDB_ReadReg ( 0x16, 0x18 ) | 0x0040 ); + mdelay ( 10 ); + + // Wait pce becomes 1 ( read data ready ) + while ( ( drvDB_ReadReg ( 0x16, 0x10 ) & 0x0004 ) != 0x0004 ); + + for ( i = 0; i < size; i += 4 ) + { + // Fire the FASTREAD command + drvDB_WriteReg ( 0x16, 0x0E, drvDB_ReadReg ( 0x16, 0x0E ) | 0x0001 ); + + // Wait the operation is done + while ( ( drvDB_ReadReg ( 0x16, 0x10 ) & 0x0001 ) != 0x0001 ); + + p[i + 0] = drvDB_ReadReg ( 0x16, 0x04 ) & 0xFF; + p[i + 1] = ( drvDB_ReadReg ( 0x16, 0x04 ) >> 8 ) & 0xFF; + p[i + 2] = drvDB_ReadReg ( 0x16, 0x06 ) & 0xFF; + p[i + 3] = ( drvDB_ReadReg ( 0x16, 0x06 ) >> 8 ) & 0xFF; + } + + // Disable the burst mode + drvDB_WriteReg ( 0x16, 0x0C, drvDB_ReadReg ( 0x16, 0x0C ) & ( ~0x0001 ) ); + + // Clear the starting address + drvDB_WriteReg ( 0x16, 0x00, 0x0000 ); + + //Always return to main block + if ( emem_type == EMEM_INFO ) + { + // Clear the PCE before change block + drvDB_WriteReg ( 0x16, 0x18, drvDB_ReadReg ( 0x16, 0x18 ) | 0x0080 ); + mdelay ( 10 ); + // Set the PIFREN to be LOW + drvDB_WriteReg ( 0x16, 0x08, drvDB_ReadReg ( 0x16, 0x08 ) & ( ~0x0010 ) ); + + drvDB_WriteReg ( 0x16, 0x18, drvDB_ReadReg ( 0x16, 0x18 ) | 0x0040 ); + while ( ( drvDB_ReadReg ( 0x16, 0x10 ) & 0x0004 ) != 0x0004 ); + } + + // Clear the RIU password + drvDB_WriteReg ( 0x16, 0x1A, 0x0000 ); + + if ( set_pce_high ) + { + // Set the PCE to be HIGH before jumping back to e-flash codes + drvDB_WriteReg ( 0x16, 0x18, drvDB_ReadReg ( 0x16, 0x18 ) | 0x0040 ); + while ( ( drvDB_ReadReg ( 0x16, 0x10 ) & 0x0004 ) != 0x0004 ); + } + + return ( 1 ); +} + + +static int drvTP_read_info_dwiic_c33 ( void ) +{ + u8 dwiic_tx_data[5]; + u8 dwiic_rx_data[4]; + u16 reg_data=0; + mdelay ( 300 ); + + // Stop Watchdog + drvDB_WriteReg8Bit ( 0x3C, 0x60, 0x55 ); + drvDB_WriteReg8Bit ( 0x3C, 0x61, 0xAA ); + + drvDB_WriteReg ( 0x3C, 0xE4, 0xA4AB ); + + drvDB_WriteReg ( 0x1E, 0x04, 0x7d60 ); + + // TP SW reset + drvDB_WriteReg ( 0x1E, 0x04, 0x829F ); + mdelay ( 1 ); + dwiic_tx_data[0] = 0x10; + dwiic_tx_data[1] = 0x0F; + dwiic_tx_data[2] = 0xE6; + dwiic_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dwiic_tx_data, 4 ); + mdelay ( 100 ); + + do{ + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0x5B58 ); + + dwiic_tx_data[0] = 0x72; + dwiic_tx_data[1] = 0x80; + dwiic_tx_data[2] = 0x00; + dwiic_tx_data[3] = 0x04; + dwiic_tx_data[4] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX_TP , dwiic_tx_data, 5 ); + + mdelay ( 50 ); + + // recive info data + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX_TP, &g_dwiic_info_data[0], 1024 ); + + return ( 1 ); +} + +static int drvTP_info_updata_C33 ( u16 start_index, u8 *data, u16 size ) +{ + // size != 0, start_index+size !> 1024 + u16 i; + for ( i = 0; i < size; i++ ) + { + g_dwiic_info_data[start_index] = * ( data + i ); + start_index++; + } + return ( 1 ); +} + +static ssize_t firmware_update_c33 ( struct device *dev, struct device_attribute *attr, + const char *buf, size_t size, EMEM_TYPE_t emem_type ) +{ + u8 dbbus_tx_data[4]; + u8 dbbus_rx_data[2] = {0}; + u8 life_counter[2]; + u32 i, j; + u32 crc_main, crc_main_tp; + u32 crc_info, crc_info_tp; + + int update_pass = 1; + u16 reg_data = 0; + + crc_main = 0xffffffff; + crc_info = 0xffffffff; + + drvTP_read_info_dwiic_c33(); + + if ( g_dwiic_info_data[0] == 'M' && g_dwiic_info_data[1] == 'S' && g_dwiic_info_data[2] == 'T' && g_dwiic_info_data[3] == 'A' && g_dwiic_info_data[4] == 'R' && g_dwiic_info_data[5] == 'T' && g_dwiic_info_data[6] == 'P' && g_dwiic_info_data[7] == 'C' ) + { + // updata FW Version + //drvTP_info_updata_C33 ( 8, &temp[32][8], 5 ); + + g_dwiic_info_data[8]=temp[32][8]; + g_dwiic_info_data[9]=temp[32][9]; + g_dwiic_info_data[10]=temp[32][10]; + g_dwiic_info_data[11]=temp[32][11]; + // updata life counter + life_counter[1] = (( ( (g_dwiic_info_data[13] << 8 ) | g_dwiic_info_data[12]) + 1 ) >> 8 ) & 0xFF; + life_counter[0] = ( ( (g_dwiic_info_data[13] << 8 ) | g_dwiic_info_data[12]) + 1 ) & 0xFF; + g_dwiic_info_data[12]=life_counter[0]; + g_dwiic_info_data[13]=life_counter[1]; + //drvTP_info_updata_C33 ( 10, &life_counter[0], 3 ); + drvDB_WriteReg ( 0x3C, 0xE4, 0x78C5 ); + drvDB_WriteReg ( 0x1E, 0x04, 0x7d60 ); + // TP SW reset + drvDB_WriteReg ( 0x1E, 0x04, 0x829F ); + + mdelay ( 50 ); + + //polling 0x3CE4 is 0x2F43 + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + + } + while ( reg_data != 0x2F43 ); + + // transmit lk info data + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX_TP , &g_dwiic_info_data[0], 1024 ); + + //polling 0x3CE4 is 0xD0BC + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0xD0BC ); + + } + + //erase main + drvTP_erase_emem_c33 ( EMEM_MAIN ); + mdelay ( 1000 ); + + //ResetSlave(); + _HalTscrHWReset(); + + //drvDB_EnterDBBUS(); + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + mdelay ( 300 ); + + ///////////////////////// + // Program + ///////////////////////// + + //polling 0x3CE4 is 0x1C70 + if ( ( emem_type == EMEM_ALL ) || ( emem_type == EMEM_MAIN ) ) + { + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0x1C70 ); + } + + switch ( emem_type ) + { + case EMEM_ALL: + drvDB_WriteReg ( 0x3C, 0xE4, 0xE38F ); // for all-blocks + break; + case EMEM_MAIN: + drvDB_WriteReg ( 0x3C, 0xE4, 0x7731 ); // for main block + break; + case EMEM_INFO: + drvDB_WriteReg ( 0x3C, 0xE4, 0x7731 ); // for info block + + drvDB_WriteReg8Bit ( 0x0F, 0xE6, 0x01 ); + + drvDB_WriteReg8Bit ( 0x3C, 0xE4, 0xC5 ); // + drvDB_WriteReg8Bit ( 0x3C, 0xE5, 0x78 ); // + + drvDB_WriteReg8Bit ( 0x1E, 0x04, 0x9F ); + drvDB_WriteReg8Bit ( 0x1E, 0x05, 0x82 ); + + drvDB_WriteReg8Bit ( 0x0F, 0xE6, 0x00 ); + mdelay ( 100 ); + break; + } + + // polling 0x3CE4 is 0x2F43 + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0x2F43 ); + + // calculate CRC 32 + Init_CRC32_Table ( &crc_tab[0] ); + + for ( i = 0; i < 33; i++ ) // total 33 KB : 2 byte per R/W + { + if ( emem_type == EMEM_INFO ) + i = 32; + + if ( i < 32 ) //emem_main + { + if ( i == 31 ) + { + temp[i][1014] = 0x5A; //Fmr_Loader[1014]=0x5A; + temp[i][1015] = 0xA5; //Fmr_Loader[1015]=0xA5; + + for ( j = 0; j < 1016; j++ ) + { + //crc_main=Get_CRC(Fmr_Loader[j],crc_main,&crc_tab[0]); + crc_main = Get_CRC ( temp[i][j], crc_main, &crc_tab[0] ); + } + } + else + { + for ( j = 0; j < 1024; j++ ) + { + //crc_main=Get_CRC(Fmr_Loader[j],crc_main,&crc_tab[0]); + crc_main = Get_CRC ( temp[i][j], crc_main, &crc_tab[0] ); + } + } + } + else //emem_info + { + for ( j = 0; j < 1024; j++ ) + { + //crc_info=Get_CRC(Fmr_Loader[j],crc_info,&crc_tab[0]); + crc_info = Get_CRC ( g_dwiic_info_data[j], crc_info, &crc_tab[0] ); + } + if ( emem_type == EMEM_MAIN ) break; + } + + //drvDWIIC_MasterTransmit( DWIIC_MODE_DWIIC_ID, 1024, Fmr_Loader ); + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX_TP, temp[i], 1024 ); + + // polling 0x3CE4 is 0xD0BC + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + } + while ( reg_data != 0xD0BC ); + + drvDB_WriteReg ( 0x3C, 0xE4, 0x2F43 ); + } + + if ( ( emem_type == EMEM_ALL ) || ( emem_type == EMEM_MAIN ) ) + { + // write file done and check crc + drvDB_WriteReg ( 0x3C, 0xE4, 0x1380 ); + } + mdelay ( 10 ); //MCR_CLBK_DEBUG_DELAY ( 10, MCU_LOOP_DELAY_COUNT_MS ); + + if ( ( emem_type == EMEM_ALL ) || ( emem_type == EMEM_MAIN ) ) + { + // polling 0x3CE4 is 0x9432 + do + { + reg_data = drvDB_ReadReg ( 0x3C, 0xE4 ); + }while ( reg_data != 0x9432 ); + } + + crc_main = crc_main ^ 0xffffffff; + crc_info = crc_info ^ 0xffffffff; + + if ( ( emem_type == EMEM_ALL ) || ( emem_type == EMEM_MAIN ) ) + { + // CRC Main from TP + crc_main_tp = drvDB_ReadReg ( 0x3C, 0x80 ); + crc_main_tp = ( crc_main_tp << 16 ) | drvDB_ReadReg ( 0x3C, 0x82 ); + + // CRC Info from TP + crc_info_tp = drvDB_ReadReg ( 0x3C, 0xA0 ); + crc_info_tp = ( crc_info_tp << 16 ) | drvDB_ReadReg ( 0x3C, 0xA2 ); + } + TP_DEBUG ( "crc_main=0x%x, crc_info=0x%x, crc_main_tp=0x%x, crc_info_tp=0x%x\n", + crc_main, crc_info, crc_main_tp, crc_info_tp ); + + //drvDB_ExitDBBUS(); + + update_pass = 1; + if ( ( emem_type == EMEM_ALL ) || ( emem_type == EMEM_MAIN ) ) + { + if ( crc_main_tp != crc_main ) + update_pass = 0; + + if ( crc_info_tp != crc_info ) + update_pass = 0; + } + + if ( !update_pass ) + { + printk ( "update FAILED\n" ); + _HalTscrHWReset(); + FwDataCnt = 0; + enable_irq(global_irq); + return ( 0 ); + } + + printk ( "update OK\n" ); + _HalTscrHWReset(); + FwDataCnt = 0; + enable_irq(global_irq); + return size; +} + +#define _FW_UPDATE_C3_ +#ifdef _FW_UPDATE_C3_ +static ssize_t firmware_update_store ( struct device *dev, + struct device_attribute *attr, const char *buf, size_t size ) +{ + u8 i; + u8 dbbus_tx_data[4]; + unsigned char dbbus_rx_data[2] = {0}; + disable_irq(global_irq); + + _HalTscrHWReset(); + + // Erase TP Flash first + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + mdelay ( 300 ); + + // Disable the Watchdog + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x60; + dbbus_tx_data[3] = 0x55; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x61; + dbbus_tx_data[3] = 0xAA; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + // Stop MCU + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x0F; + dbbus_tx_data[2] = 0xE6; + dbbus_tx_data[3] = 0x01; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + ///////////////////////// + // Difference between C2 and C3 + ///////////////////////// + // c2:2133 c32:2133a(2) c33:2138 + //check id + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0xCC; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + if ( dbbus_rx_data[0] == 2 ) + { + // check version + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0xEA; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx version[0]=0x%x", dbbus_rx_data[0] ); + + if ( dbbus_rx_data[0] == 3 ){ + return firmware_update_c33 ( dev, attr, buf, size, EMEM_MAIN ); + } + else{ + + return firmware_update_c32 ( dev, attr, buf, size, EMEM_ALL ); + } + } + else + { + return firmware_update_c2 ( dev, attr, buf, size ); + } +} +#else +static ssize_t firmware_update_store ( struct device *dev, + struct device_attribute *attr, const char *buf, size_t size ) +{ + u8 i; + u8 dbbus_tx_data[4]; + unsigned char dbbus_rx_data[2] = {0}; + + _HalTscrHWReset(); + + // 1. Erase TP Flash first + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + mdelay ( 300 ); + + // Disable the Watchdog + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x60; + dbbus_tx_data[3] = 0x55; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x61; + dbbus_tx_data[3] = 0xAA; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Stop MCU + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x0F; + dbbus_tx_data[2] = 0xE6; + dbbus_tx_data[3] = 0x01; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set FRO to 50M + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0xE2; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + dbbus_rx_data[0] = 0; + dbbus_rx_data[1] = 0; + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = dbbus_rx_data[0] & 0xF7; //Clear Bit 3 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set MCU clock,SPI clock =FRO + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x22; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x23; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable slave's ISP ECO mode + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x08; + dbbus_tx_data[2] = 0x0c; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable SPI Pad + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = ( dbbus_rx_data[0] | 0x20 ); //Set Bit 5 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // WP overwrite + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x0E; + dbbus_tx_data[3] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set pin high + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x10; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbusDWIICIICNotUseBus(); + dbbusDWIICNotStopMCU(); + dbbusDWIICExitSerialDebugMode(); + + drvISP_EntryIspMode(); + drvISP_ChipErase(); + _HalTscrHWReset(); + mdelay ( 300 ); + + // 2.Program and Verify + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + + // Disable the Watchdog + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x60; + dbbus_tx_data[3] = 0x55; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x61; + dbbus_tx_data[3] = 0xAA; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Stop MCU + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x0F; + dbbus_tx_data[2] = 0xE6; + dbbus_tx_data[3] = 0x01; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set FRO to 50M + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0xE2; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + dbbus_rx_data[0] = 0; + dbbus_rx_data[1] = 0; + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = dbbus_rx_data[0] & 0xF7; //Clear Bit 3 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set MCU clock,SPI clock =FRO + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x22; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x23; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable slave's ISP ECO mode + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x08; + dbbus_tx_data[2] = 0x0c; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // Enable SPI Pad + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + TP_DEBUG ( "dbbus_rx_data[0]=0x%x", dbbus_rx_data[0] ); + dbbus_tx_data[3] = ( dbbus_rx_data[0] | 0x20 ); //Set Bit 5 + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // WP overwrite + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x0E; + dbbus_tx_data[3] = 0x02; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + // set pin high + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x10; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 4 ); + + dbbusDWIICIICNotUseBus(); + dbbusDWIICNotStopMCU(); + dbbusDWIICExitSerialDebugMode(); + + /////////////////////////////////////// + // Start to load firmware + /////////////////////////////////////// + drvISP_EntryIspMode(); + + for ( i = 0; i < 94; i++ ) // total 94 KB : 1 byte per R/W + { + drvISP_Program ( i, temp[i] ); // program to slave's flash + drvISP_Verify ( i, temp[i] ); //verify data + } + TP_DEBUG ( "update OK\n" ); + drvISP_ExitIspMode(); + FwDataCnt = 0; + + return size; +} +#endif +static DEVICE_ATTR(update, 0664, firmware_update_show, firmware_update_store); +#if 0 +/*test=================*/ +static ssize_t firmware_clear_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + printk(" +++++++ [%s] Enter!++++++\n", __func__); + u16 k=0,i = 0, j = 0; + u8 bWriteData[5] = + { + 0x10, 0x03, 0, 0, 0 + }; + u8 RX_data[256]; + u8 bWriteData1 = 0x12; + u32 addr = 0; + u32 timeOutCount=0; + for (k = 0; k < 94; i++) // total 94 KB : 1 byte per R/W + { + addr = k * 1024; + for (j = 0; j < 8; j++) //128*8 cycle + { + bWriteData[2] = (u8)((addr + j * 128) >> 16); + bWriteData[3] = (u8)((addr + j * 128) >> 8); + bWriteData[4] = (u8)(addr + j * 128); + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay(150);//200); + + timeOutCount=0; + while ( ( drvISP_ReadStatus() & 0x01 ) == 0x01 ) + { + timeOutCount++; + if ( timeOutCount >= 100000 ) + break; /* around 1 sec timeout */ + } + + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, bWriteData, 5); //write read flash addr + //msctpc_LoopDelay ( 1 ); // delay about 100us***** + udelay(150);//200); + drvISP_Read(128, RX_data); + HalTscrCDevWriteI2CSeq(FW_UPDATE_ADDR_MSG21XX, &bWriteData1, 1); //cmd end + for (i = 0; i < 128; i++) //log out if verify error + { + if (RX_data[i] != 0xFF) + { + //TP_DEBUG(printk("k=%d,j=%d,i=%d===============erase not clean================",k,j,i);) + printk("k=%d,j=%d,i=%d erase not clean !!",k,j,i); + } + } + } + } + TP_DEBUG("read finish\n"); + return sprintf(buf, "%s\n", fw_version); +} + +static ssize_t firmware_clear_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + + u8 dbbus_tx_data[4]; + unsigned char dbbus_rx_data[2] = {0}; + printk(" +++++++ [%s] Enter!++++++\n", __func__); + //msctpc_LoopDelay ( 100 ); // delay about 100ms***** + + // Enable slave's ISP ECO mode + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x08; + dbbus_tx_data[2] = 0x0c; + dbbus_tx_data[3] = 0x08; + + // Disable the Watchdog + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0xE2; + dbbus_tx_data[3] = 0x00; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x60; + dbbus_tx_data[3] = 0x55; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3C; + dbbus_tx_data[2] = 0x61; + dbbus_tx_data[3] = 0xAA; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + //Stop MCU + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x0F; + dbbus_tx_data[2] = 0xE6; + dbbus_tx_data[3] = 0x01; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + //Enable SPI Pad + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x02; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 3); + HalTscrCReadI2CSeq(FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2); + TP_DEBUG(printk("dbbus_rx_data[0]=0x%x", dbbus_rx_data[0]);) + dbbus_tx_data[3] = (dbbus_rx_data[0] | 0x20); //Set Bit 5 + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x25; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 3); + + dbbus_rx_data[0] = 0; + dbbus_rx_data[1] = 0; + HalTscrCReadI2CSeq(FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2); + TP_DEBUG(printk("dbbus_rx_data[0]=0x%x", dbbus_rx_data[0]);) + dbbus_tx_data[3] = dbbus_rx_data[0] & 0xFC; //Clear Bit 1,0 + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + //WP overwrite + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x0E; + dbbus_tx_data[3] = 0x02; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + + //set pin high + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0x10; + dbbus_tx_data[3] = 0x08; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + //set FRO to 50M + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0xE2; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 3); + dbbus_rx_data[0] = 0; + dbbus_rx_data[1] = 0; + HalTscrCReadI2CSeq(FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2); + TP_DEBUG(printk("dbbus_rx_data[0]=0x%x", dbbus_rx_data[0]);) + dbbus_tx_data[3] = dbbus_rx_data[0] & 0xF7; //Clear Bit 1,0 + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX, dbbus_tx_data, 4); + + dbbusDWIICIICNotUseBus(); + dbbusDWIICNotStopMCU(); + dbbusDWIICExitSerialDebugMode(); + + /////////////////////////////////////// + // Start to load firmware + /////////////////////////////////////// + drvISP_EntryIspMode(); + TP_DEBUG(printk("chip erase+\n");) + drvISP_BlockErase(0x00000); + TP_DEBUG(printk("chip erase-\n");) + drvISP_ExitIspMode(); + return size; +} +static DEVICE_ATTR(clear, 0664, firmware_clear_show, firmware_clear_store); +#endif //0 +/*test=================*/ +/*Add by Tracy.Lin for update touch panel firmware and get fw version*/ + +static ssize_t firmware_version_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + TP_DEBUG("*** firmware_version_show fw_version = %s***\n", fw_version); + return sprintf(buf, "%s\n", fw_version); +} + +static ssize_t firmware_version_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + unsigned char dbbus_tx_data[3]; + unsigned char dbbus_rx_data[4] ; + unsigned short major=0, minor=0; +/* + dbbusDWIICEnterSerialDebugMode(); + dbbusDWIICStopMCU(); + dbbusDWIICIICUseBus(); + dbbusDWIICIICReshape(); + +*/ + if(NULL==fw_version) + { + fw_version = kzalloc(sizeof(char), GFP_KERNEL); + } + + //Get_Chip_Version(); + dbbus_tx_data[0] = 0x53; + dbbus_tx_data[1] = 0x00; + dbbus_tx_data[2] = 0x2a; + HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX_TP, &dbbus_tx_data[0], 3); + HalTscrCReadI2CSeq(FW_ADDR_MSG21XX_TP, &dbbus_rx_data[0], 4); + + major = (dbbus_rx_data[1]<<8)+dbbus_rx_data[0]; + minor = (dbbus_rx_data[3]<<8)+dbbus_rx_data[2]; + + TP_DEBUG("***major = %d ***\n", major); + TP_DEBUG("***minor = %d ***\n", minor); + sprintf(fw_version,"%03d%03d", major, minor); + //TP_DEBUG(printk("***fw_version = %s ***\n", fw_version);) + + return size; +} +static DEVICE_ATTR(version, 0664, firmware_version_show, firmware_version_store); + +static ssize_t firmware_data_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return FwDataCnt; +} + +static ssize_t firmware_data_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + int i; + TP_DEBUG("***FwDataCnt = %d ***\n", FwDataCnt); + for (i = 0; i < 1024; i++) + { + memcpy(temp[FwDataCnt], buf, 1024); + } + FwDataCnt++; + return size; +} +static DEVICE_ATTR(data, 0664, firmware_data_show, firmware_data_store); +#endif //__FIRMWARE_UPDATE__ + +static int pixcir_i2c_txdata(char *txdata, int length) +{ + int ret; + struct i2c_msg msg[] = { + { + .addr = msg21xx_i2c_client->addr, + .flags = 0, + .len = length, + .buf = txdata, + }, + }; + + ret = i2c_transfer(msg21xx_i2c_client->adapter, msg, 1); + if (ret < 0) + pr_err("%s i2c write error: %d\n", __func__, ret); + + return ret; +} + +static int pixcir_i2c_write_data(unsigned char addr, unsigned char data) +{ + unsigned char buf[2]; + buf[0]=addr; + buf[1]=data; + return pixcir_i2c_txdata(buf, 2); +} + +static bool msg2138_i2c_read(char *pbt_buf, int dw_lenth) +{ + int ret; + // pr_ch("The msg_i2c_client->addr=0x%x\n",i2c_client->addr); + ret = i2c_master_recv(msg21xx_i2c_client, pbt_buf, dw_lenth); + + if(ret <= 0) + { + //pr_tp("msg_i2c_read_interface error\n"); + return false; + } + + return true; +} + +static bool msg2138_i2c_write(char *pbt_buf, int dw_lenth) +{ + int ret; + // pr_ch("The msg_i2c_client->addr=0x%x\n",i2c_client->addr); + ret = i2c_master_send(msg21xx_i2c_client, pbt_buf, dw_lenth); + + if(ret <= 0) + { + //pr_tp("msg_i2c_read_interface error\n"); + return false; + } + + return true; +} + +static DEVICE_ATTR(calibrate, S_IRUGO | S_IWUSR, NULL, pixcir_set_calibrate); +static DEVICE_ATTR(suspend, S_IRUGO | S_IWUSR, pixcir_show_suspend, pixcir_store_suspend); + +static ssize_t pixcir_set_calibrate(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + + if(on_off==1) + { + printk("%s: PIXCIR calibrate\n",__func__); + pixcir_i2c_write_data(0x3a , 0x03); + msleep(5*1000); + } + + return len; +} + +static ssize_t pixcir_show_suspend(struct device* cd, + struct device_attribute *attr, char* buf) +{ + ssize_t ret = 0; + + if(suspend_flag==1) + sprintf(buf, "Pixcir Suspend\n"); + else + sprintf(buf, "Pixcir Resume\n"); + + ret = strlen(buf) + 1; + + return ret; +} + +static ssize_t pixcir_store_suspend(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + suspend_flag = on_off; + + if(on_off==1) + { + printk("Pixcir Entry Suspend\n"); + pixcir_ts_suspend(NULL); + } + else + { + printk("Pixcir Entry Resume\n"); + pixcir_ts_resume(NULL); + + } + + return len; +} + +static void pixcir_reset(void) +{ + struct msg2138_ts_platform_data *pdata = msg21xx_i2c_ts_data->platform_data; + + PIXCIR_DBG("%s\n",__func__); + gpio_set_value(pdata->reset_gpio_number, 1); + msleep(3); + gpio_set_value(pdata->reset_gpio_number, 0); + msleep(310); + gpio_set_value(pdata->reset_gpio_number, 1); + msleep(100); +} + +//cg,20130929,start +#ifdef SYSFS_DEBUG +static void cg_tpfwver_readfwver() +{ + unsigned char dbbus_tx_data[3]; + unsigned char dbbus_rx_data[4] ; + unsigned short major=0, minor=0; + u8 count = 0; + int ret = 0; + + for(count=0;count<5;count++) + { + pixcir_reset(); + msleep(100); + if(NULL == cg_fw_version) + { + cg_fw_version = kzalloc(sizeof(char), GFP_KERNEL); + } + + //Get_Chip_Version(); + dbbus_tx_data[0] = 0x53; + dbbus_tx_data[1] = 0x00; + dbbus_tx_data[2] = 0x2a; + ret = HalTscrCDevWriteI2CSeq(FW_ADDR_MSG21XX_TP, &dbbus_tx_data[0], 3); + if(ret<0) + { + printk("*** write fail ret = %d ***\n", ret); + continue; + } + msleep(100); + ret = HalTscrCReadI2CSeq(FW_ADDR_MSG21XX_TP, &dbbus_rx_data[0], 4); + if(ret<0) + { + printk("*** read fail ret = %d ***\n", ret); + continue; + } + major =(dbbus_rx_data[1]<<8)+dbbus_rx_data[0]; + if(0==major) + { + printk("*** major fail = %d ***\n", major); + continue; + } + minor =(dbbus_rx_data[3]<<8)+dbbus_rx_data[2]; + printk("***major = %d ***\n", major); + printk("***minor = %d ***\n", minor); + + sprintf(cg_fw_version,"%03d%03d", major, minor); + printk("***tp_fw_version = %s ***\n", cg_fw_version); + break; + } + printk("*** count = %d ***\n", count); +} + +static ssize_t cg_tpfwver_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + cg_tpfwver_readfwver(); + return sprintf(buf, "%s\n", cg_fw_version); + +} + +static ssize_t cg_tpfwver_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + return -EPERM; + +} +static DEVICE_ATTR(fwversion, S_IRUGO, cg_tpfwver_show,NULL); + +#endif +//cg,20130929,end + +static int pixcir_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + PIXCIR_DBG("%s\n", __func__); + + err = device_create_file(dev, &dev_attr_calibrate); + err = device_create_file(dev, &dev_attr_suspend); + #ifdef SYSFS_DEBUG + err = device_create_file(dev, &dev_attr_fwversion); //cg,20130929 + #endif + return err; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void pixcir_ts_suspend(struct early_suspend *handler) +{ + struct msg2138_ts_platform_data *pdata = msg21xx_i2c_ts_data->platform_data; + printk("==%s==\n", __func__); + disable_irq_nosync(global_irq); + msleep(3); + gpio_set_value(pdata->reset_gpio_number, 0); + msleep(10); +} +static void pixcir_ts_resume(struct early_suspend *handler) +{ + //unsigned char rdbuf[27]; + //int num = 10; + //disable_irq_nosync(global_irq); + +#if 0 + struct pixcir_i2c_ts_data *pixcir_ts = (struct pixcir_i2c_ts_data *)i2c_get_clientdata(msg21xx_i2c_client); + queue_work(pixcir_ts->ts_resume_workqueue, &pixcir_ts->resume_work); +#endif + printk("==%s==start==\n", __func__); + pixcir_reset(); + enable_irq(global_irq); + printk("==%s==end==\n", __func__); + +} +#endif + +#ifdef TOUCH_VIRTUAL_KEYS +/*static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, + __stringify(EV_KEY) ":" __stringify(KEY_HOMEPAGE) ":192:1000:64:60" + ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":256:1000:64:60" + ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":128:1000:64:60" + ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":64:1000:64:60" + "\n"); +}*/ +static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + struct pixcir_i2c_ts_data *data = i2c_get_clientdata(msg21xx_i2c_client); + struct msg2138_ts_platform_data *pdata = data->platform_data; + return sprintf(buf,"%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d\n" + ,__stringify(EV_KEY), __stringify(KEY_MENU),pdata ->virtualkeys[0],pdata ->virtualkeys[1],pdata ->virtualkeys[2],pdata ->virtualkeys[3] + ,__stringify(EV_KEY), __stringify(KEY_HOMEPAGE),pdata ->virtualkeys[4],pdata ->virtualkeys[5],pdata ->virtualkeys[6],pdata ->virtualkeys[7] + ,__stringify(EV_KEY), __stringify(KEY_BACK),pdata ->virtualkeys[8],pdata ->virtualkeys[9],pdata ->virtualkeys[10],pdata ->virtualkeys[11]); +} + +static struct kobj_attribute virtual_keys_attr = { + .attr = { + .name = "virtualkeys.msg2138_ts", + .mode = S_IRUGO, + }, + .show = &virtual_keys_show, +}; + +static struct attribute *properties_attrs[] = { + &virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group properties_attr_group = { + .attrs = properties_attrs, +}; + +static void pixcir_ts_virtual_keys_init(void) +{ + int ret; + struct kobject *properties_kobj; + + PIXCIR_DBG("%s\n",__func__); + + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &properties_attr_group); + if (!properties_kobj || ret) + pr_err("failed to create board_properties\n"); +} +#endif + +static int getchipType(void) +{ + int curr_ic_type = 0; + u8 dbbus_tx_data[4]; + unsigned char dbbus_rx_data[2] = {0}; + int error = 0; + + //check id + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x1E; + dbbus_tx_data[2] = 0xCC; + error = HalTscrCDevWriteI2CSeq ( FW_ADDR_MSG21XX, dbbus_tx_data, 3 ); + if (error < 0) { + pr_err("[MSG2138A] getchipType() write i2c error %d\n",error); + return error; + } + error = HalTscrCReadI2CSeq ( FW_ADDR_MSG21XX, &dbbus_rx_data[0], 2 ); + if (error < 0) { + pr_err("[MSG2138A] getchipType() read i2c error %d\n",error); + return error; + } + if ( dbbus_rx_data[0] == 2 ) { + curr_ic_type = CTP_ID_MSG21XXA; + } else { + curr_ic_type = CTP_ID_MSG21XX; + } + + return curr_ic_type; + +} + +static void pixcir_ts_hw_init(struct pixcir_i2c_ts_data *tsdata) +{ + struct regulator *g_cg_reg_vdd; + struct msg2138_ts_platform_data *pdata = tsdata->platform_data; + struct i2c_client *client = tsdata->client; + int err= 0; + gpio_request(pdata->reset_gpio_number, "gpio_tp_rst"); + gpio_request(pdata->irq_gpio_number, "gpio_tp_irq"); + gpio_direction_output(pdata->reset_gpio_number,1); + gpio_direction_input(pdata->irq_gpio_number); + g_cg_reg_vdd = regulator_get(&client->dev, pdata->vdd_name); + if (!WARN(IS_ERR(g_cg_reg_vdd), "[MSG2138] pixcir_ts_hw_init regulator: failed to get %s.\n", pdata->vdd_name)) { + regulator_set_voltage(g_cg_reg_vdd, 2800000, 2800000); + err = regulator_enable(g_cg_reg_vdd); + } + msleep(100); + pixcir_reset(); +} + +/*static int attb_read_val(void) +{ + struct msg2138_ts_platform_data *pdata = msg21xx_i2c_ts_data->platform_data; + return gpio_get_value(pdata->irq_gpio_number); +}*/ + +unsigned char tpd_check_sum(unsigned char *pval) +{ + int i, sum = 0; + + for(i = 0; i < 7; i++) + { + sum += pval[i]; + } + + return (unsigned char)((-sum) & 0xFF); +} + +static void return_i2c_dev(struct i2c_dev *i2c_dev) +{ + spin_lock(&i2c_dev_list_lock); + list_del(&i2c_dev->list); + spin_unlock(&i2c_dev_list_lock); + kfree(i2c_dev); +} + +static struct i2c_dev *i2c_dev_get_by_minor(unsigned index) +{ + struct i2c_dev *i2c_dev; + i2c_dev = NULL; + + spin_lock(&i2c_dev_list_lock); + list_for_each_entry(i2c_dev, &i2c_dev_list, list) + { + if (i2c_dev->adap->nr == index) + goto found; + } + i2c_dev = NULL; + found: spin_unlock(&i2c_dev_list_lock); + return i2c_dev; +} + +static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap) +{ + struct i2c_dev *i2c_dev; + + if (adap->nr >= I2C_MINORS) { + printk(KERN_ERR "i2c-dev: Out of device minors (%d)\n", + adap->nr); + return ERR_PTR(-ENODEV); + } + + i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL); + if (!i2c_dev) + return ERR_PTR(-ENOMEM); + + i2c_dev->adap = adap; + + spin_lock(&i2c_dev_list_lock); + list_add_tail(&i2c_dev->list, &i2c_dev_list); + spin_unlock(&i2c_dev_list_lock); + return i2c_dev; +} +/*********************************Bee-0928-bottom**************************************/ + +struct point_node_t{ + unsigned char active ; + unsigned char finger_id; + int posx; + int posy; +}; + +static struct point_node_t point_slot[MAX_FINGER_NUM*2]; +static int keycode; +static int sy_rxdata(struct touch_info *cinfo, struct touch_info *pinfo) + { + //u32 retval; + //static unsigned char tt_mode; + //pinfo->count = cinfo->count; + unsigned char reg_val[8] = {0}; + int dst_x=0,dst_y=0; + unsigned int temp_checksum; + struct TouchScreenInfo_t touchData; + //unsigned char touchkeycode = 0; + //static int preKeyStatus; + + //TPD_DEBUG("pinfo->count =%d\n",pinfo->count); + cinfo->count = 0; //touch end + msg2138_i2c_read(reg_val, 8); + + //retval = i2c_smbus_read_i2c_block_data(msg21xx_i2c_client, TPD_REG_BASE, 8, (unsigned char *)&g_operation_data); + //retval += i2c_smbus_read_i2c_block_data(msg21xx_i2c_client, TPD_REG_BASE + 8, 8, (((unsigned char *)(&g_operation_data)) + 8)); + + cinfo->x1 = ((reg_val[1] & 0xF0) << 4) | reg_val[2]; + cinfo->y1 = ((reg_val[1] & 0x0F) << 8) | reg_val[3]; + dst_x = ((reg_val[4] & 0xF0) << 4) | reg_val[5]; + dst_y = ((reg_val[4] & 0x0F) << 8) | reg_val[6]; + + + temp_checksum = tpd_check_sum(reg_val); + + if((temp_checksum==reg_val[7])&&(reg_val[0] == 0x52)) + { + + if ((reg_val[1] == 0xFF) && (reg_val[2] == 0xFF) && (reg_val[3] == 0xFF) && (reg_val[4] == 0xFF) && (reg_val[6] == 0xFF)) + { + cinfo->x1 = 0; // final X coordinate + cinfo->y1 = 0; // final Y coordinate + + if((reg_val[5]==0x0)||(reg_val[5]==0xFF)) + { + cinfo->count = 0; //touch end + touchData.nTouchKeyCode = 0; //TouchKeyMode + touchData.nTouchKeyMode = 0; //TouchKeyMode + keycode=0; + } + else + { + touchData.nTouchKeyMode = 1; //TouchKeyMode + touchData.nTouchKeyCode = reg_val[5]; //TouchKeyCode + keycode= reg_val[5]; + + if(keycode==1) + { + cinfo->x1 = 256; // final X coordinate + cinfo->y1 = 1000; // final Y coordinate + + } + else if(keycode==2) + { + cinfo->x1 = 192; // final X coordinate + cinfo->y1 = 1000; // final Y coordinate + + } + else if (keycode==4) + { + cinfo->x1 = 128; // final X coordinate + cinfo->y1 = 1000; // final Y coordinate + + } + + cinfo->count = 1; + } + } + else + { + touchData.nTouchKeyMode = 0; //Touch on screen... + + if ((dst_x == 0) && (dst_y == 0)) + { + cinfo->count = 1; //one touch + #if TP_XY_CHANGE + xysawp_temp=cinfo->x1; + //cinfo->x1=2047-cinfo->y1; + cinfo->x1=cinfo->y1; + cinfo->y1=xysawp_temp; + #endif + + #ifdef TP_X_CHANGE + cinfo->x1 = 2047 - cinfo->x1; + #endif + + cinfo->x1 = (cinfo->x1 * MS_TS_MSG21XX_X_MAX) / 2048; + cinfo->y1 = (cinfo->y1 * MS_TS_MSG21XX_Y_MAX) / 2048; + } + else + { + + cinfo->count = 2; //two touch + + + if (dst_x > 2048) //transform the unsigh value to sign value + { + dst_x -= 4096; + } + if (dst_y > 2048) + { + dst_y -= 4096; + } + + cinfo->x2 = (cinfo->x1 + dst_x); + cinfo->y2 = (cinfo->y1 + dst_y); + + #if TP_XY_CHANGE + xysawp_temp=cinfo->x1; + //cinfo->x1=2047-cinfo->y1; + cinfo->x1=cinfo->y1; + cinfo->y1=xysawp_temp; + + xysawp_temp=cinfo->x2; + cinfo->x2=2047-cinfo->y2; + cinfo->y2=xysawp_temp; + #endif + + #ifdef TP_X_CHANGE + cinfo->x1 = 2047 - cinfo->x1; + cinfo->x2 = 2047 - cinfo->x2; + #endif + + cinfo->x1 = (cinfo->x1 * MS_TS_MSG21XX_X_MAX) / 2048; + cinfo->y1 = (cinfo->y1 * MS_TS_MSG21XX_Y_MAX) / 2048; + + cinfo->x2 = (cinfo->x2 * MS_TS_MSG21XX_X_MAX) / 2048; + cinfo->y2 = (cinfo->y2 * MS_TS_MSG21XX_Y_MAX) / 2048; + + } + } + + return 1; + } + return 1; + } +static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data) +{ + struct pixcir_i2c_ts_data *tsdata = data; + struct touch_info cinfo, pinfo; + int *p; + unsigned char touch; + unsigned char rdbuf[27]; + int i; + //static int lastkey=0; + // printk("===%s===\n",__func__); + rdbuf[0]=0; + //pixcir_i2c_rxdata(rdbuf, 27); + + //touch = rdbuf[0]&0x07; + sy_rxdata(&cinfo, &pinfo); + touch = cinfo.count; + //button = rdbuf[1]; + //p=&rdbuf[2]; + p=(int*)&cinfo; + // printk("===touch:%d===",touch); + for (i=0; i>3); + point_slot[i].active = 1; + point_slot[i].finger_id = i; + point_slot[i].posx = *(p+i*2); + point_slot[i].posy = *(p+i*2+1); + + } + + if(touch) { + //input_report_key(tsdata->input, BTN_TOUCH, 1); + //input_report_abs(tsdata->input, ABS_MT_TOUCH_MAJOR, 15); + for (i=0; i(MS_TS_MSG21XX_X_MAX -2)) { + point_slot[i].posx = (MS_TS_MSG21XX_X_MAX -2); + } + input_report_abs(tsdata->input, ABS_MT_POSITION_X, point_slot[i].posx); + input_report_abs(tsdata->input, ABS_MT_POSITION_Y, point_slot[i].posy); + //input_report_abs(tsdata->input, ABS_MT_TOUCH_MAJOR, 15); + //input_report_abs(tsdata->input, ABS_MT_WIDTH_MAJOR, 1); + input_report_key(tsdata->input, BTN_TOUCH, 1); + input_mt_sync(tsdata->input); + PIXCIR_DBG("%s: slot=%d,x%d=%d,y%d=%d\n",__func__, i, i/2,point_slot[i].posx, i/2, point_slot[i].posy); + } + } + } + } else { + PIXCIR_DBG("%s: release\n",__func__); + #if 0 + //input_report_key(tsdata->input, BTN_TOUCH, 0); + input_report_abs(tsdata->input, ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(tsdata->input, ABS_MT_WIDTH_MAJOR, 0); + input_mt_sync(tsdata->input); + #endif + input_report_key(tsdata->input, BTN_TOUCH, 0); + input_mt_sync(tsdata->input); + } + PIXCIR_DBG("%s: keycode =%x\n",__func__,keycode); + /* + if(lastkey!=keycode) + { + for(i=0;i<3;i++) + { + input_report_key(tsdata->input, keymap[i], (keycode)&(1<input); + for (i=0; iexiting) { + pixcir_ts_poscheck(tsdata); +#endif //cg,20140402 +#if 0 + if (attb_read_val()) { + PIXCIR_DBG("%s: release\n",__func__); + //input_report_key(tsdata->input, BTN_TOUCH, 0); + input_report_abs(tsdata->input, ABS_MT_TOUCH_MAJOR, 0); + input_sync(tsdata->input); + break; + } +#endif +// msleep(10); + +// } + + enable_irq(irq); + + return IRQ_HANDLED; +} + +#ifdef CONFIG_PM_SLEEP +static int pixcir_i2c_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + unsigned char wrbuf[2] = { 0 }; + int ret; + + wrbuf[0] = 0x33; + wrbuf[1] = 0x03; //enter into freeze mode; + /************************************************************** + wrbuf[1]: 0x00: Active mode + 0x01: Sleep mode + 0xA4: Sleep mode automatically switch + 0x03: Freeze mode + More details see application note 710 power manangement section + ****************************************************************/ + ret = i2c_master_send(client, wrbuf, 2); + if(ret!=2) { + dev_err(&client->dev, + "%s: i2c_master_send failed(), ret=%d\n", + __func__, ret); + } + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int pixcir_i2c_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); +///if suspend enter into freeze mode please reset TP +#if 1 + pixcir_reset(); +#else + unsigned char wrbuf[2] = { 0 }; + int ret; + + wrbuf[0] = 0x33; + wrbuf[1] = 0; + ret = i2c_master_send(client, wrbuf, 2); + if(ret!=2) { + dev_err(&client->dev, + "%s: i2c_master_send failed(), ret=%d\n", + __func__, ret); + } +#endif + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops, + pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); + +static int tpd_get_bl_info (int show) + { + int retval = TPD_OK; + + retval = i2c_smbus_read_i2c_block_data(msg21xx_i2c_client, TPD_REG_BASE, 8, (unsigned char *)&g_bootloader_data); + retval += i2c_smbus_read_i2c_block_data(msg21xx_i2c_client, TPD_REG_BASE + 8, 8, (((unsigned char *)&g_bootloader_data) + 8)); + TPD_DEBUG("ret=%d,first=0x%02x\n",retval,(unsigned char )(*((unsigned char *)&g_bootloader_data))); + if (show) + { + + TPD_DEBUG("BL: bl_file = %02X, bl_status = %02X, bl_error = %02X, blver = %02X%02X, bld_blver = %02X%02X\n", \ + g_bootloader_data.bl_file, \ + g_bootloader_data.bl_status, \ + g_bootloader_data.bl_error, \ + g_bootloader_data.blver_hi, g_bootloader_data.blver_lo, \ + g_bootloader_data.bld_blver_hi, g_bootloader_data.bld_blver_lo); + + TPD_DEBUG("BL: ttspver = 0x%02X%02X, appid=0x%02X%02X, appver=0x%02X%02X\n", \ + g_bootloader_data.ttspver_hi, g_bootloader_data.ttspver_lo, \ + g_bootloader_data.appid_hi, g_bootloader_data.appid_lo, \ + g_bootloader_data.appver_hi, g_bootloader_data.appver_lo); + + TPD_DEBUG("BL: cid = 0x%02X%02X%02X\n", \ + g_bootloader_data.cid_0, \ + g_bootloader_data.cid_1, \ + g_bootloader_data.cid_2); + + } + /*ergate-001*/ + //mdelay(100); + + return retval; + } + +static int sy_init(void) +{ + int retval = TPD_OK; + int tries = 0; + unsigned char host_reg; + host_reg = TPD_SOFT_RESET_MODE; + // printk("==sy_init==0=="); + retval = i2c_smbus_write_i2c_block_data(msg21xx_i2c_client,TPD_REG_BASE,sizeof(host_reg),&host_reg); + // printk("==sy_init==1==retval:%d==",retval); + if(retval < TPD_OK) + return retval; + + do{ + mdelay(100); + retval = tpd_get_bl_info(1); + }while(!(retval < TPD_OK) && !GET_BOOTLOADERMODE(g_bootloader_data.bl_status)&& + !(g_bootloader_data.bl_file == TPD_OP_MODE + TPD_LOW_PWR_MODE) && tries++ < 10); + if(g_bootloader_data.bl_status != (unsigned char )0x11) + { + if(!(retval < 0)) + { + host_reg = TPD_OP_MODE; + retval = i2c_smbus_write_i2c_block_data(msg21xx_i2c_client,TPD_REG_BASE,sizeof(host_reg),&host_reg); + mdelay(100); + } + if(!(retval < 0)) + { + TPD_DEBUG("Switch to sysinfo mode \n"); + host_reg = TPD_SYSINFO_MODE; + retval = i2c_smbus_write_i2c_block_data(msg21xx_i2c_client,TPD_REG_BASE,sizeof(host_reg),&host_reg); + mdelay(100); + + if(!(retval < TPD_OK)) + { + retval = i2c_smbus_read_i2c_block_data(msg21xx_i2c_client,TPD_REG_BASE, 8, (unsigned char *)&g_sysinfo_data); + retval += i2c_smbus_read_i2c_block_data(msg21xx_i2c_client,TPD_REG_BASE + 8, 8, (((unsigned char *)(&g_sysinfo_data)) + 8)); + retval += i2c_smbus_read_i2c_block_data(msg21xx_i2c_client,TPD_REG_BASE + 16, 8, (((unsigned char *)(&g_sysinfo_data)) + 16)); + retval += i2c_smbus_read_i2c_block_data (msg21xx_i2c_client,TPD_REG_BASE + 24, 8, (((unsigned char *)(&g_sysinfo_data)) + 24)); + + TPD_DEBUG("SI: hst_mode = 0x%02X, mfg_cmd = 0x%02X, mfg_stat = 0x%02X\n", \ + g_sysinfo_data.hst_mode, \ + g_sysinfo_data.mfg_cmd, \ + g_sysinfo_data.mfg_stat); + TPD_DEBUG("SI: bl_ver = 0x%02X%02X\n", \ + g_sysinfo_data.bl_verh, \ + g_sysinfo_data.bl_verl); + TPD_DEBUG("SI: act_int = 0x%02X, tch_tmout = 0x%02X, lp_int = 0x%02X\n", \ + g_sysinfo_data.act_intrvl, \ + g_sysinfo_data.tch_tmout, \ + g_sysinfo_data.lp_intrvl); + TPD_DEBUG("SI: tver = %02X%02X, a_id = %02X%02X, aver = %02X%02X\n", \ + g_sysinfo_data.tts_verh, \ + g_sysinfo_data.tts_verl, \ + g_sysinfo_data.app_idh, \ + g_sysinfo_data.app_idl, \ + g_sysinfo_data.app_verh, \ + g_sysinfo_data.app_verl); + TPD_DEBUG("SI: c_id = %02X%02X%02X\n", \ + g_sysinfo_data.cid[0], \ + g_sysinfo_data.cid[1], \ + g_sysinfo_data.cid[2]); + } + + TPD_DEBUG("Switch back to operational mode \n"); + if (!(retval < TPD_OK)) + { + host_reg = TPD_OP_MODE; + retval = i2c_smbus_write_i2c_block_data(msg21xx_i2c_client, TPD_REG_BASE, sizeof(host_reg), &host_reg); + mdelay(100); + } + } + } + else + { + //update_support = 1; + TPD_DEBUG("Switch back to operational mode \n"); + + if (!(retval < TPD_OK)) + { + unsigned char op_cmds[] = {0x00, 0x00, 0xFF, 0xA5, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; + //retval = i2c_master_send_ext(i2c_client, op_cmds, sizeof(op_cmds)); + retval = i2c_master_send(msg21xx_i2c_client,op_cmds, sizeof(op_cmds)); + mdelay(100); + } + } + if(retval > TPD_OK) + retval = TPD_OK; + + return retval; + +} + +//#define ITO_TEST +#ifdef ITO_TEST +static void ito_test_create_entry(void); +#endif + +#ifdef CONFIG_OF +static struct msg2138_ts_platform_data *pixcir_ts_parse_dt(struct device *dev) +{ + struct msg2138_ts_platform_data *pdata = NULL; + struct device_node *np = dev->of_node; + int ret; + + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct msg2138_ts_platform_data"); + return NULL; + } + pdata->reset_gpio_number = of_get_gpio(np, 0); + if(pdata->reset_gpio_number < 0){ + dev_err(dev, "fail to get reset_gpio_number\n"); + goto fail; + } + pdata->irq_gpio_number = of_get_gpio(np, 1); + if(pdata->irq_gpio_number < 0){ + dev_err(dev, "fail to get irq_gpio_number\n"); + goto fail; + } + ret = of_property_read_string(np, "vdd_name", &pdata->vdd_name); + if(ret){ + dev_err(dev, "fail to get vdd_name\n"); + goto fail; + } + ret = of_property_read_u32_array(np, "virtualkeys", &pdata->virtualkeys,12); + if(ret){ + dev_err(dev, "fail to get virtualkeys\n"); + goto fail; + } + ret = of_property_read_u32(np, "TP_MAX_X", &pdata->TP_MAX_X); + if(ret){ + dev_err(dev, "fail to get TP_MAX_X\n"); + goto fail; + } + ret = of_property_read_u32(np, "TP_MAX_Y", &pdata->TP_MAX_Y); + if(ret){ + dev_err(dev, "fail to get TP_MAX_Y\n"); + goto fail; + } + + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif + +static int pixcir_i2c_ts_probe(struct i2c_client *client,const struct i2c_device_id *id) +{ + struct msg2138_ts_platform_data *pdata = client->dev.platform_data; + struct pixcir_i2c_ts_data *tsdata = NULL; + struct input_dev *input = NULL; + struct device *dev = NULL; + struct i2c_dev *i2c_dev = NULL; + int i, error; + + printk("msg2138 probe in! \n"); + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = pixcir_ts_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } + else{ + error = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } +#endif + + tsdata = kzalloc(sizeof(*tsdata), GFP_KERNEL); + if (!tsdata) { + error = -ENOMEM; + dev_err(&client->dev, "Failed to allocate tsdata!\n"); + goto exit_alloc_tsdata_failed; + } + + msg21xx_i2c_client = client; + tsdata->client = client; + msg21xx_i2c_ts_data = tsdata; + tsdata->platform_data = pdata; + MS_TS_MSG21XX_X_MAX = pdata->TP_MAX_X; + MS_TS_MSG21XX_Y_MAX = pdata->TP_MAX_Y; + //client->addr = 0x26; + pixcir_ts_hw_init(tsdata); + client->irq = gpio_to_irq(pdata->irq_gpio_number); + i2c_set_clientdata(client, tsdata); + +#if defined(CONFIG_I2C_SPRD) || defined(CONFIG_I2C_SPRD_V1) + sprd_i2c_ctl_chg_clk(client->adapter->nr, 400000); +#endif + + error = getchipType(); + if (error < 0) { + pr_err("[MSG2138A] read chip id failed\n"); + error = -ENODEV; + goto exit_chip_check_failed; + } else { + printk("[MSG2138A] the chip id is %d\n",error); + } + + for(i=0; idev, "Failed to allocate input device!\n"); + error = -ENOMEM; + goto exit_input_alloc_failed; + } + +#ifdef TOUCH_VIRTUAL_KEYS + pixcir_ts_virtual_keys_init(); +#endif + + tsdata->input = input; + global_irq = client->irq; + input->name = MSG2138_TS_NAME; + input->id.bustype = BUS_I2C; + input->dev.parent = &client->dev; + + __set_bit(EV_KEY, input->evbit); + __set_bit(EV_ABS, input->evbit); + __set_bit(EV_SYN, input->evbit); + //__set_bit(BTN_TOUCH, input->keybit); + __set_bit(ABS_MT_TOUCH_MAJOR, input->absbit); + __set_bit(ABS_MT_POSITION_X, input->absbit); + __set_bit(ABS_MT_POSITION_Y, input->absbit); + __set_bit(ABS_MT_WIDTH_MAJOR, input->absbit); + + __set_bit(KEY_MENU, input->keybit); + __set_bit(KEY_BACK, input->keybit); + __set_bit(KEY_HOME, input->keybit); + __set_bit(KEY_SEARCH, input->keybit); + + input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->TP_MAX_X, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->TP_MAX_Y, 0, 0); + input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(input, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + input_set_drvdata(input, tsdata); + + error = request_irq(client->irq, pixcir_ts_isr, + IRQF_TRIGGER_FALLING, client->name, tsdata); + if (error) { + dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); + goto exit_requst_irq_failed; + } + disable_irq_nosync(client->irq); + + error = input_register_device(input); + if (error) + goto exit_input_register_failed; + device_init_wakeup(&client->dev, 1); + + /*********************************Bee-0928-TOP****************************************/ + i2c_dev = get_free_i2c_dev(client->adapter); + if (IS_ERR(i2c_dev)) { + error = PTR_ERR(i2c_dev); + goto exit_get_i2c_dev_failed; + } + + dev = device_create(i2c_dev_class, &client->adapter->dev, MKDEV(I2C_MAJOR, + client->adapter->nr), NULL, "pixcir_i2c_ts%d", 0); + if (IS_ERR(dev)) { + error = PTR_ERR(dev); + goto exit_device_create_failed; + } + /*********************************Bee-0928-BOTTOM****************************************/ +#ifdef CONFIG_HAS_EARLYSUSPEND + pixcir_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + pixcir_early_suspend.suspend = pixcir_ts_suspend; + pixcir_early_suspend.resume = pixcir_ts_resume; + register_early_suspend(&pixcir_early_suspend); +#endif + + /********* frameware upgrade *********/ +#ifdef __FIRMWARE_UPDATE__ + firmware_class = class_create(THIS_MODULE, "ms-touchscreen-msg20xx"); + if (IS_ERR(firmware_class)) + pr_err("Failed to create class(firmware)!\n"); + firmware_cmd_dev = device_create(firmware_class, + NULL, 0, NULL, "device"); + if (IS_ERR(firmware_cmd_dev)) + pr_err("Failed to create device(firmware_cmd_dev)!\n"); + + // version + if (device_create_file(firmware_cmd_dev, &dev_attr_version) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_version.attr.name); + // update + if (device_create_file(firmware_cmd_dev, &dev_attr_update) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_update.attr.name); + // data + if (device_create_file(firmware_cmd_dev, &dev_attr_data) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_data.attr.name); + // clear + // if (device_create_file(firmware_cmd_dev, &dev_attr_clear) < 0) + // pr_err("Failed to create device file(%s)!\n", dev_attr_clear.attr.name); + + dev_set_drvdata(firmware_cmd_dev, NULL); +#endif //__FIRMWARE_UPDATE__ +#ifdef ITO_TEST + ito_test_create_entry(); +#endif +#if 0 + error = pixcir_create_sysfs(client); + if (error) { + dev_err(&client->dev, "insmod successfully!\n"); + goto exit_create_sysfs_failed; + }; +#endif +#ifdef SYSFS_DEBUG + cg_tpfwver_readfwver(); +#endif //cg,20130929 + +#if USE_WAIT_QUEUE + thread = kthread_run(touch_event_handler, 0, "pixcir-wait-queue"); + if (IS_ERR(thread)) + { + error = PTR_ERR(thread); + dev_err(&client->dev, "failed to create kernel thread\n"); + goto exit_kthread_run_failed; + } +#endif + + enable_irq(client->irq); + //tp_cg_flag=2; + printk("[MSG2138A]pixcir_i2c probe success\n"); + return 0; + +exit_kthread_run_failed: +exit_create_sysfs_failed: +exit_device_create_failed: +exit_get_i2c_dev_failed: + input_unregister_device(input); +exit_input_register_failed: + free_irq(client->irq, tsdata); +exit_requst_irq_failed: + input_free_device(input); +exit_input_alloc_failed: +exit_chip_check_failed: + gpio_free(pdata->irq_gpio_number); + gpio_free(pdata->reset_gpio_number); + kfree(tsdata); +exit_alloc_tsdata_failed: + pdata = NULL; + client = NULL; +exit_alloc_platform_data_failed: + return error; +} + +static int pixcir_i2c_ts_remove(struct i2c_client *client) +{ + int error; + struct i2c_dev *i2c_dev; + struct pixcir_i2c_ts_data *tsdata = i2c_get_clientdata(client); + + device_init_wakeup(&client->dev, 0); + + tsdata->exiting = true; + mb(); + free_irq(client->irq, tsdata); + + /*********************************Bee-0928-TOP****************************************/ + i2c_dev = get_free_i2c_dev(client->adapter); + if (IS_ERR(i2c_dev)) { + error = PTR_ERR(i2c_dev); + return error; + } + + return_i2c_dev(i2c_dev); + device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, client->adapter->nr)); + /*********************************Bee-0928-BOTTOM****************************************/ + unregister_early_suspend(&pixcir_early_suspend); + input_unregister_device(tsdata->input); + kfree(tsdata); + + return 0; +} + +/*************************************Bee-0928****************************************/ +/* pixcir_open */ +/*************************************Bee-0928****************************************/ +static int pixcir_open(struct inode *inode, struct file *file) +{ + int subminor; + struct i2c_client *client; + struct i2c_adapter *adapter; + struct i2c_dev *i2c_dev; + int ret = 0; + PIXCIR_DBG("enter pixcir_open function\n"); + + subminor = iminor(inode); + +// lock_kernel(); + i2c_dev = i2c_dev_get_by_minor(subminor); + if (!i2c_dev) { + //printk("error i2c_dev\n"); + return -ENODEV; + } + + adapter = i2c_get_adapter(i2c_dev->adap->nr); + if (!adapter) { + return -ENODEV; + } + + client = kzalloc(sizeof(*client), GFP_KERNEL); + if (!client) { + i2c_put_adapter(adapter); + ret = -ENOMEM; + } + + snprintf(client->name, I2C_NAME_SIZE, "pixcir_i2c_ts%d", adapter->nr); + client->driver = &pixcir_i2c_ts_driver; + client->adapter = adapter; + + file->private_data = client; + + return 0; +} + +/*************************************Bee-0928****************************************/ +/* pixcir_ioctl */ +/*************************************Bee-0928****************************************/ +static long pixcir_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + //struct i2c_client *client = (struct i2c_client *) file->private_data; + + PIXCIR_DBG("pixcir_ioctl(),cmd = %d,arg = %ld\n", cmd, arg); + +#if 0 + switch (cmd) + { + case CALIBRATION_FLAG: //CALIBRATION_FLAG = 1 + client->addr = SLAVE_ADDR; + status_reg = CALIBRATION_FLAG; + break; + + case BOOTLOADER: //BOOTLOADER = 7 + client->addr = BOOTLOADER_ADDR; + status_reg = BOOTLOADER; + + pixcir_reset(); + mdelay(5); + break; + + case RESET_TP: //RESET_TP = 9 + pixcir_reset(); + break; + + case ENABLE_IRQ: //ENABLE_IRQ = 10 + status_reg = 0; + enable_irq(global_irq); + break; + + case DISABLE_IRQ: //DISABLE_IRQ = 11 + disable_irq_nosync(global_irq); + break; + + case BOOTLOADER_STU: //BOOTLOADER_STU = 12 + client->addr = BOOTLOADER_ADDR; + status_reg = BOOTLOADER_STU; + + pixcir_reset(); + mdelay(5); + + case ATTB_VALUE: //ATTB_VALUE = 13 + client->addr = SLAVE_ADDR; + status_reg = ATTB_VALUE; + break; + + default: + client->addr = SLAVE_ADDR; + status_reg = 0; + break; + } +#endif + return 0; +} + +/***********************************Bee-0928****************************************/ +/* pixcir_read */ +/***********************************Bee-0928****************************************/ +static ssize_t pixcir_read (struct file *file, char __user *buf, size_t count,loff_t *offset) +{ + //struct i2c_client *client = (struct i2c_client *)file->private_data; + //unsigned char *tmp, bootloader_stu[4], attb_value[1]; + int ret = 0; +#if 0 + switch(status_reg) + { + case BOOTLOADER_STU: + i2c_master_recv(client, bootloader_stu, sizeof(bootloader_stu)); + if (ret!=sizeof(bootloader_stu)) { + dev_err(&client->dev, + "%s: BOOTLOADER_STU: i2c_master_recv() failed, ret=%d\n", + __func__, ret); + return -EFAULT; + } + + ret = copy_to_user(buf, bootloader_stu, sizeof(bootloader_stu)); + if(ret) { + dev_err(&client->dev, + "%s: BOOTLOADER_STU: copy_to_user() failed.\n", __func__); + return -EFAULT; + }else { + ret = 4; + } + break; + + case ATTB_VALUE: + attb_value[0] = attb_read_val(); + if(copy_to_user(buf, attb_value, sizeof(attb_value))) { + dev_err(&client->dev, + "%s: ATTB_VALUE: copy_to_user() failed.\n", __func__); + return -EFAULT; + }else { + ret = 1; + } + break; + + default: + tmp = kmalloc(count,GFP_KERNEL); + if (tmp==NULL) + return -ENOMEM; + + ret = i2c_master_recv(client, tmp, count); + if (ret != count) { + dev_err(&client->dev, + "%s: default: i2c_master_recv() failed, ret=%d\n", + __func__, ret); + return -EFAULT; + } + + if(copy_to_user(buf, tmp, count)) { + dev_err(&client->dev, + "%s: default: copy_to_user() failed.\n", __func__); + kfree(tmp); + return -EFAULT; + } + kfree(tmp); + break; + } + #endif + return ret; +} + +/***********************************Bee-0928****************************************/ +/* pixcir_write */ +/***********************************Bee-0928****************************************/ +static ssize_t pixcir_write(struct file *file,const char __user *buf,size_t count, loff_t *ppos) +{ + //struct i2c_client *client; + //unsigned char *tmp, bootload_data[143]; + int ret=0; +#if 0 + client = file->private_data; + + switch(status_reg) + { + case CALIBRATION_FLAG: //CALIBRATION_FLAG=1 + tmp = kmalloc(count,GFP_KERNEL); + if (tmp==NULL) + return -ENOMEM; + + if (copy_from_user(tmp,buf,count)) { + dev_err(&client->dev, + "%s: CALIBRATION_FLAG: copy_from_user() failed.\n", __func__); + kfree(tmp); + return -EFAULT; + } + + ret = i2c_master_send(client,tmp,count); + if (ret!=count ) { + dev_err(&client->dev, + "%s: CALIBRATION: i2c_master_send() failed, ret=%d\n", + __func__, ret); + kfree(tmp); + return -EFAULT; + } + + while(!attb_read_val()) { + msleep(100); + i++; + if(i>99) + break; //10s no high aatb break + } //waiting to finish the calibration.(pixcir application_note_710_v3 p43) + + kfree(tmp); + break; + + case BOOTLOADER: + memset(bootload_data, 0, sizeof(bootload_data)); + + if (copy_from_user(bootload_data, buf, count)) { + dev_err(&client->dev, + "%s: BOOTLOADER: copy_from_user() failed.\n", __func__); + return -EFAULT; + } + + ret = i2c_master_send(client, bootload_data, count); + if(ret!=count) { + dev_err(&client->dev, + "%s: BOOTLOADER: i2c_master_send() failed, ret = %d\n", + __func__, ret); + return -EFAULT; + } + break; + + default: + tmp = kmalloc(count,GFP_KERNEL); + if (tmp==NULL) + return -ENOMEM; + + if (copy_from_user(tmp,buf,count)) { + dev_err(&client->dev, + "%s: default: copy_from_user() failed.\n", __func__); + kfree(tmp); + return -EFAULT; + } + + ret = i2c_master_send(client,tmp,count); + if (ret!=count ) { + dev_err(&client->dev, + "%s: default: i2c_master_send() failed, ret=%d\n", + __func__, ret); + kfree(tmp); + return -EFAULT; + } + kfree(tmp); + break; + } + #endif + return ret; +} + +/***********************************Bee-0928****************************************/ +/* pixcir_release */ +/***********************************Bee-0928****************************************/ +static int pixcir_release(struct inode *inode, struct file *file) +{ + struct i2c_client *client = file->private_data; + + PIXCIR_DBG("enter pixcir_release funtion\n"); + + i2c_put_adapter(client->adapter); + kfree(client); + file->private_data = NULL; + + return 0; +} + +/*********************************Bee-0928-TOP****************************************/ +static const struct file_operations pixcir_i2c_ts_fops = +{ .owner = THIS_MODULE, + .read = pixcir_read, + .write = pixcir_write, + .open = pixcir_open, + .unlocked_ioctl = pixcir_ioctl, + .release = pixcir_release, +}; +/*********************************Bee-0928-BOTTOM****************************************/ + +static const struct i2c_device_id pixcir_i2c_ts_id[] = { + { MSG2138_TS_NAME, MSG2138_TS_ADDR },//0 + { } +}; +MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id); + +#if 0 +static unsigned short force[] = {0,0x4c,I2C_CLIENT_END,I2C_CLIENT_END}; +static const unsigned short * const forces[] = { force, NULL }; +static struct i2c_client_address_data addr_data = { .forces = forces, }; +#endif +static const struct of_device_id msg2138_of_match[] = { + { .compatible = "Mstar,msg2138_ts", }, + { } +}; +MODULE_DEVICE_TABLE(of, msg2138_of_match); + +static struct i2c_driver pixcir_i2c_ts_driver = { + .driver = { + .owner = THIS_MODULE, + .name = MSG2138_TS_NAME, + .of_match_table = msg2138_of_match, + }, + .probe = pixcir_i2c_ts_probe, + .remove = pixcir_i2c_ts_remove, + .id_table = pixcir_i2c_ts_id, +}; + +static int __init pixcir_i2c_ts_init(void) +{ + int ret; + + /*if (0 != tp_cg_flag) + { + return -ENODEV; + }*/ + /*********************************Bee-0928-TOP****************************************/ + TPD_DEBUG("msg2138 init111!\n"); + ret = register_chrdev(I2C_MAJOR,"pixcir_i2c_ts",&pixcir_i2c_ts_fops); + if (ret) { + //printk(KERN_ERR "%s:register chrdev failed\n",__FILE__); + return ret; + } + TPD_DEBUG("msg2138 init222!\n"); + i2c_dev_class = class_create(THIS_MODULE, "pixcir_i2c_dev"); + if (IS_ERR(i2c_dev_class)) { + ret = PTR_ERR(i2c_dev_class); + class_destroy(i2c_dev_class); + } + /********************************Bee-0928-BOTTOM******************************************/ + + return i2c_add_driver(&pixcir_i2c_ts_driver); +} + +static void pixcir_i2c_ts_exit(void) +{ + i2c_del_driver(&pixcir_i2c_ts_driver); + /********************************Bee-0928-TOP******************************************/ + class_destroy(i2c_dev_class); + unregister_chrdev(I2C_MAJOR,"pixcir_i2c_ts"); + /********************************Bee-0928-BOTTOM******************************************/ +} + +module_init(pixcir_i2c_ts_init); +module_exit(pixcir_i2c_ts_exit); + +#ifdef ITO_TEST + +#include "./ito_test/open_test_ANA1_8861A_lianchuang.h" +#include "./ito_test/open_test_ANA2_8861A_lianchuang.h" +#include "./ito_test/open_test_ANA1_B_8861A_lianchuang.h" +#include "./ito_test/open_test_ANA2_B_8861A_lianchuang.h" +#include "./ito_test/open_test_ANA3_8861A_lianchuang.h" +/////////////////////////////////////////////////////////////////////////// +u8 bItoTestDebug = 0; +#define ITO_TEST_DEBUG(format, ...) \ +{ \ + if(bItoTestDebug) \ + { \ + printk(KERN_ERR "ito_test ***" format "\n", ## __VA_ARGS__); \ + mdelay(5); \ + } \ +} +#define ITO_TEST_DEBUG_MUST(format, ...) printk(KERN_ERR "ito_test ***" format "\n", ## __VA_ARGS__);mdelay(5) + + + +s16 s16_raw_data_1[48] = {0}; +s16 s16_raw_data_2[48] = {0}; +s16 s16_raw_data_3[48] = {0}; +u8 ito_test_keynum = 0; +u8 ito_test_dummynum = 0; +u8 ito_test_trianglenum = 0; +u8 ito_test_2r = 0; +u8 g_LTP = 1; +uint16_t *open_1 = NULL; +uint16_t *open_1B = NULL; +uint16_t *open_2 = NULL; +uint16_t *open_2B = NULL; +uint16_t *open_3 = NULL; +u8 *MAP1 = NULL; +u8 *MAP2=NULL; +u8 *MAP3=NULL; +u8 *MAP40_1 = NULL; +u8 *MAP40_2 = NULL; +u8 *MAP40_3 = NULL; +u8 *MAP40_4 = NULL; +u8 *MAP41_1 = NULL; +u8 *MAP41_2 = NULL; +u8 *MAP41_3 = NULL; +u8 *MAP41_4 = NULL; + + +#define ITO_TEST_ADDR_TP (0x4C>>1) +#define ITO_TEST_ADDR_REG (0xC4>>1) +#define REG_INTR_FIQ_MASK 0x04 +#define FIQ_E_FRAME_READY_MASK ( 1 << 8 ) +#define MAX_CHNL_NUM (48) +#define BIT0 (1<<0) +#define BIT1 (1<<1) +#define BIT5 (1<<5) +#define BIT11 (1<<11) +#define BIT15 (1<<15) + + +static int ito_test_i2c_read(u8 addr, u8* read_data, u16 size) +{ + int rc; + u8 addr_before = msg21xx_i2c_client->addr; + msg21xx_i2c_client->addr = addr; + + #ifdef DMA_IIC + if(size>8&&NULL!=I2CDMABuf_va) + { + int i = 0; + msg21xx_i2c_client->ext_flag = msg21xx_i2c_client->ext_flag | I2C_DMA_FLAG ; + rc = i2c_master_recv(msg21xx_i2c_client, (unsigned char *)I2CDMABuf_pa, size); + for(i = 0; i < size; i++) + { + read_data[i] = I2CDMABuf_va[i]; + } + } + else + { + rc = i2c_master_recv(msg21xx_i2c_client, read_data, size); + } + msg21xx_i2c_client->ext_flag = msg21xx_i2c_client->ext_flag & (~I2C_DMA_FLAG); + #else + rc = i2c_master_recv(msg21xx_i2c_client, read_data, size); + #endif + + msg21xx_i2c_client->addr = addr_before; + if( rc < 0 ) + { + ITO_TEST_DEBUG_MUST("ito_test_i2c_read error %d,addr=%d\n", rc,addr); + } + return rc; +} + +static int ito_test_i2c_write(u8 addr, u8* data, u16 size) +{ + int rc; + u8 addr_before = msg21xx_i2c_client->addr; + msg21xx_i2c_client->addr = addr; + +#ifdef DMA_IIC + if(size>8&&NULL!=I2CDMABuf_va) + { + int i = 0; + for(i=0;iext_flag = msg21xx_i2c_client->ext_flag | I2C_DMA_FLAG ; + rc = i2c_master_send(msg21xx_i2c_client, (unsigned char *)I2CDMABuf_pa, size); + } + else + { + rc = i2c_master_send(msg21xx_i2c_client, data, size); + } + msg21xx_i2c_client->ext_flag = msg21xx_i2c_client->ext_flag & (~I2C_DMA_FLAG); +#else + rc = i2c_master_send(msg21xx_i2c_client, data, size); +#endif + + msg21xx_i2c_client->addr = addr_before; + if( rc < 0 ) + { + ITO_TEST_DEBUG_MUST("ito_test_i2c_write error %d,addr = %d,data[0]=%d\n", rc, addr,data[0]); + } + return rc; +} + +static void ito_test_reset(void) +{ + struct msg2138_ts_platform_data *pdata = msg21xx_i2c_ts_data->platform_data; + gpio_direction_output(pdata->reset_gpio_number, 1); + gpio_set_value(pdata->reset_gpio_number, 1); + gpio_set_value(pdata->reset_gpio_number, 0); + mdelay(100); + ITO_TEST_DEBUG("reset tp\n"); + gpio_set_value(pdata->reset_gpio_number, 1); + mdelay(200); +} +static void ito_test_disable_irq(void) +{ + disable_irq_nosync(global_irq); +} +static void ito_test_enable_irq(void) +{ + enable_irq(global_irq); +} + +static void ito_test_set_iic_rate(u32 iicRate) +{ + #ifdef CONFIG_I2C_SPRD + sprd_i2c_ctl_chg_clk(msg21xx_i2c_client->adapter->nr, iicRate); + mdelay(100); + #endif + #if MTK + msg21xx_i2c_client->timing = iicRate/1000; + #endif +} + +static void ito_test_WriteReg( u8 bank, u8 addr, u16 data ) +{ + u8 tx_data[5] = {0x10, bank, addr, data & 0xFF, data >> 8}; + ito_test_i2c_write( ITO_TEST_ADDR_REG, &tx_data[0], 5 ); +} +static void ito_test_WriteReg8Bit( u8 bank, u8 addr, u8 data ) +{ + u8 tx_data[4] = {0x10, bank, addr, data}; + ito_test_i2c_write ( ITO_TEST_ADDR_REG, &tx_data[0], 4 ); +} +static unsigned short ito_test_ReadReg( u8 bank, u8 addr ) +{ + u8 tx_data[3] = {0x10, bank, addr}; + u8 rx_data[2] = {0}; + + ito_test_i2c_write( ITO_TEST_ADDR_REG, &tx_data[0], 3 ); + ito_test_i2c_read ( ITO_TEST_ADDR_REG, &rx_data[0], 2 ); + return ( rx_data[1] << 8 | rx_data[0] ); +} +static u32 ito_test_get_TpType(void) +{ + u8 tx_data[3] = {0}; + u8 rx_data[4] = {0}; + u32 Major = 0, Minor = 0; + + ITO_TEST_DEBUG("GetTpType\n"); + + tx_data[0] = 0x53; + tx_data[1] = 0x00; + tx_data[2] = 0x2A; + ito_test_i2c_write(ITO_TEST_ADDR_TP, &tx_data[0], 3); + mdelay(50); + ito_test_i2c_read(ITO_TEST_ADDR_TP, &rx_data[0], 4); + Major = (rx_data[1]<<8) + rx_data[0]; + Minor = (rx_data[3]<<8) + rx_data[2]; + + ITO_TEST_DEBUG("***TpTypeMajor = %d ***\n", Major); + ITO_TEST_DEBUG("***TpTypeMinor = %d ***\n", Minor); + + return Major; + +} + +#define TP_OF_LIANCHUANG (2) +static u32 ito_test_choose_TpType(void) +{ + u32 tpType = 0; + u8 i = 0; + open_1 = NULL; + open_1B = NULL; + open_2 = NULL; + open_2B = NULL; + open_3 = NULL; + MAP1 = NULL; + MAP2 = NULL; + MAP3 = NULL; + MAP40_1 = NULL; + MAP40_2 = NULL; + MAP40_3 = NULL; + MAP40_4 = NULL; + MAP41_1 = NULL; + MAP41_2 = NULL; + MAP41_3 = NULL; + MAP41_4 = NULL; + ito_test_keynum = 0; + ito_test_dummynum = 0; + ito_test_trianglenum = 0; + ito_test_2r = 0; + + for(i=0;i<10;i++) + { + tpType = ito_test_get_TpType(); + ITO_TEST_DEBUG("tpType=%d;i=%d;\n",tpType,i); + if(TP_OF_LIANCHUANG==tpType) + { + break; + } + else if(i<5) + { + mdelay(100); + } + else + { + ito_test_reset(); + } + } + + if(TP_OF_LIANCHUANG==tpType) + { + open_1 = open_1_lianchuang; + open_1B = open_1B_lianchuang; + open_2 = open_2_lianchuang; + open_2B = open_2B_lianchuang; + open_3 = open_3_lianchuang; + MAP1 = MAP1_lianchuang; + MAP2 = MAP2_lianchuang; + MAP3 = MAP3_lianchuang; + MAP40_1 = MAP40_1_lianchuang; + MAP40_2 = MAP40_2_lianchuang; + MAP40_3 = MAP40_3_lianchuang; + MAP40_4 = MAP40_4_lianchuang; + MAP41_1 = MAP41_1_lianchuang; + MAP41_2 = MAP41_2_lianchuang; + MAP41_3 = MAP41_3_lianchuang; + MAP41_4 = MAP41_4_lianchuang; + ito_test_keynum = NUM_KEY_LIANCHUANG; + ito_test_dummynum = NUM_DUMMY_LIANCHUANG; + ito_test_trianglenum = NUM_SENSOR_LIANCHUANG; + ito_test_2r = ENABLE_2R_LIANCHUANG; + } + else + { + tpType = 0; + } + return tpType; +} +static void ito_test_EnterSerialDebugMode(void) +{ + u8 data[5]; + + data[0] = 0x53; + data[1] = 0x45; + data[2] = 0x52; + data[3] = 0x44; + data[4] = 0x42; + ito_test_i2c_write(ITO_TEST_ADDR_REG, &data[0], 5); + + data[0] = 0x37; + ito_test_i2c_write(ITO_TEST_ADDR_REG, &data[0], 1); + + data[0] = 0x35; + ito_test_i2c_write(ITO_TEST_ADDR_REG, &data[0], 1); + + data[0] = 0x71; + ito_test_i2c_write(ITO_TEST_ADDR_REG, &data[0], 1); +} +static uint16_t ito_test_get_num( void ) +{ + uint16_t num_of_sensor,i; + uint16_t RegValue1,RegValue2; + + num_of_sensor = 0; + + RegValue1 = ito_test_ReadReg( 0x11, 0x4A); + ITO_TEST_DEBUG("ito_test_get_num,RegValue1=%d\n",RegValue1); + if ( ( RegValue1 & BIT1) == BIT1 ) + { + RegValue1 = ito_test_ReadReg( 0x12, 0x0A); + RegValue1 = RegValue1 & 0x0F; + + RegValue2 = ito_test_ReadReg( 0x12, 0x16); + RegValue2 = (( RegValue2 >> 1 ) & 0x0F) + 1; + + num_of_sensor = RegValue1 * RegValue2; + } + else + { + for(i=0;i<4;i++) + { + num_of_sensor+=(ito_test_ReadReg( 0x12, 0x0A)>>(4*i))&0x0F; + } + } + ITO_TEST_DEBUG("ito_test_get_num,num_of_sensor=%d\n",num_of_sensor); + return num_of_sensor; +} +static void ito_test_polling( void ) +{ + uint16_t reg_int = 0x0000; + uint8_t dbbus_tx_data[5]; + uint8_t dbbus_rx_data[4]; + uint16_t reg_value; + + + reg_int = 0; + + ito_test_WriteReg( 0x13, 0x0C, BIT15 ); + ito_test_WriteReg( 0x12, 0x14, (ito_test_ReadReg(0x12,0x14) | BIT0) ); + + ITO_TEST_DEBUG("polling start\n"); + while( ( reg_int & BIT0 ) == 0x0000 ) + { + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x3D; + dbbus_tx_data[2] = 0x18; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 3); + ito_test_i2c_read(ITO_TEST_ADDR_REG, dbbus_rx_data, 2); + reg_int = dbbus_rx_data[1]; + } + ITO_TEST_DEBUG("polling end\n"); + reg_value = ito_test_ReadReg( 0x3D, 0x18 ); + ito_test_WriteReg( 0x3D, 0x18, reg_value & (~BIT0) ); +} +static uint16_t ito_test_get_data_out( int16_t* s16_raw_data ) +{ + uint8_t i,dbbus_tx_data[8]; + uint16_t raw_data[48]={0}; + uint16_t num_of_sensor; + uint16_t reg_int; + uint8_t dbbus_rx_data[96]={0}; + + num_of_sensor = ito_test_get_num(); + if(num_of_sensor*2>96) + { + ITO_TEST_DEBUG("danger,num_of_sensor=%d\n",num_of_sensor); + return num_of_sensor; + } + + reg_int = ito_test_ReadReg( 0x3d, REG_INTR_FIQ_MASK<<1 ); + ito_test_WriteReg( 0x3d, REG_INTR_FIQ_MASK<<1, (reg_int & (uint16_t)(~FIQ_E_FRAME_READY_MASK) ) ); + ito_test_polling(); + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x13; + dbbus_tx_data[2] = 0x40; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 3); + mdelay(20); + ito_test_i2c_read(ITO_TEST_ADDR_REG, &dbbus_rx_data[0], (num_of_sensor * 2)); + mdelay(100); + for(i=0;i> 8 ) & 0xFF; + } + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 3+0x3F*2); + + dbbus_tx_data[2] = 0x7A * 2; + for( i = 0x7A; i <= 0x7D ; i++ ) + { + dbbus_tx_data[3+2*(i-0x7A)] = 0; + dbbus_tx_data[4+2*(i-0x7A)] = 0; + } + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 3+8); + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x12; + + dbbus_tx_data[2] = 5 * 2; + dbbus_tx_data[3] = Type1[128+5] & 0xFF; + dbbus_tx_data[4] = ( Type1[128+5] >> 8 ) & 0xFF; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 5); + + dbbus_tx_data[2] = 0x0B * 2; + dbbus_tx_data[3] = Type1[128+0x0B] & 0xFF; + dbbus_tx_data[4] = ( Type1[128+0x0B] >> 8 ) & 0xFF; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 5); + + dbbus_tx_data[2] = 0x12 * 2; + dbbus_tx_data[3] = Type1[128+0x12] & 0xFF; + dbbus_tx_data[4] = ( Type1[128+0x12] >> 8 ) & 0xFF; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 5); + + dbbus_tx_data[2] = 0x15 * 2; + dbbus_tx_data[3] = Type1[128+0x15] & 0xFF; + dbbus_tx_data[4] = ( Type1[128+0x15] >> 8 ) & 0xFF; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, 5); +} + +static void ito_test_set_v( uint8_t Enable, uint8_t Prs) +{ + uint16_t u16RegValue; + + + u16RegValue = ito_test_ReadReg( 0x12, 0x08); + u16RegValue = u16RegValue & 0xF1; + if ( Prs == 0 ) + { + ito_test_WriteReg( 0x12, 0x08, u16RegValue| 0x0C); + } + else if ( Prs == 1 ) + { + ito_test_WriteReg( 0x12, 0x08, u16RegValue| 0x0E); + } + else + { + ito_test_WriteReg( 0x12, 0x08, u16RegValue| 0x02); + } + + if ( Enable ) + { + u16RegValue = ito_test_ReadReg( 0x11, 0x06); + ito_test_WriteReg( 0x11, 0x06, u16RegValue| 0x03); + } + else + { + u16RegValue = ito_test_ReadReg( 0x11, 0x06); + u16RegValue = u16RegValue & 0xFC; + ito_test_WriteReg( 0x11, 0x06, u16RegValue); + } + +} + +static void ito_test_set_c( uint8_t Csub_Step ) +{ + uint8_t i; + uint8_t dbbus_tx_data[MAX_CHNL_NUM+3]; + uint8_t HighLevel_Csub = false; + uint8_t Csub_new; + + dbbus_tx_data[0] = 0x10; + dbbus_tx_data[1] = 0x11; + dbbus_tx_data[2] = 0x84; + for( i = 0; i < MAX_CHNL_NUM; i++ ) + { + Csub_new = Csub_Step; + HighLevel_Csub = false; + if( Csub_new > 0x1F ) + { + Csub_new = Csub_new - 0x14; + HighLevel_Csub = true; + } + + dbbus_tx_data[3+i] = Csub_new & 0x1F; + if( HighLevel_Csub == true ) + { + dbbus_tx_data[3+i] |= BIT5; + } + } + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, MAX_CHNL_NUM+3); + + dbbus_tx_data[2] = 0xB4; + ito_test_i2c_write(ITO_TEST_ADDR_REG, dbbus_tx_data, MAX_CHNL_NUM+3); +} + +static void ito_test_sw( void ) +{ + ito_test_WriteReg( 0x11, 0x00, 0xFFFF ); + ito_test_WriteReg( 0x11, 0x00, 0x0000 ); + mdelay( 50 ); +} + + + +static void ito_test_first( uint8_t item_id , int16_t* s16_raw_data) +{ + uint8_t result = 0,loop; + uint8_t dbbus_tx_data[9]; + uint8_t i,j; + int16_t s16_raw_data_tmp[48]={0}; + uint8_t num_of_sensor, num_of_sensor2,total_sensor; + uint16_t u16RegValue; + uint8_t *pMapping=NULL; + + + num_of_sensor = 0; + num_of_sensor2 = 0; + + ITO_TEST_DEBUG("ito_test_first item_id=%d\n",item_id); + ito_test_WriteReg( 0x0F, 0xE6, 0x01 ); + + ito_test_WriteReg( 0x1E, 0x24, 0x0500 ); + ito_test_WriteReg( 0x1E, 0x2A, 0x0000 ); + ito_test_WriteReg( 0x1E, 0xE6, 0x6E00 ); + ito_test_WriteReg( 0x1E, 0xE8, 0x0071 ); + + if ( item_id == 40 ) + { + pMapping = &MAP1[0]; + if ( ito_test_2r ) + { + total_sensor = ito_test_trianglenum/2; + } + else + { + total_sensor = ito_test_trianglenum/2 + ito_test_keynum + ito_test_dummynum; + } + } + else if( item_id == 41 ) + { + pMapping = &MAP2[0]; + if ( ito_test_2r ) + { + total_sensor = ito_test_trianglenum/2; + } + else + { + total_sensor = ito_test_trianglenum/2 + ito_test_keynum + ito_test_dummynum; + } + } + else if( item_id == 42 ) + { + pMapping = &MAP3[0]; + total_sensor = ito_test_trianglenum + ito_test_keynum+ ito_test_dummynum; + } + + + loop = 1; + if ( item_id != 42 ) + { + if(total_sensor>11) + { + loop = 2; + } + } + ITO_TEST_DEBUG("loop=%d\n",loop); + for ( i = 0; i < loop; i++ ) + { + if ( i == 0 ) + { + ito_test_send_data_in( item_id - 36 ); + } + else + { + if ( item_id == 40 ) + ito_test_send_data_in( 9 ); + else + ito_test_send_data_in( 10 ); + } + + ito_test_set_v(1,0); + u16RegValue = ito_test_ReadReg( 0x11, 0x0E); + ito_test_WriteReg( 0x11, 0x0E, u16RegValue | BIT11 ); + + if ( g_LTP == 1 ) + ito_test_set_c( 32 ); + else + ito_test_set_c( 0 ); + + ito_test_sw(); + + if ( i == 0 ) + { + num_of_sensor=ito_test_get_data_out( s16_raw_data_tmp ); + ITO_TEST_DEBUG("num_of_sensor=%d;\n",num_of_sensor); + } + else + { + num_of_sensor2=ito_test_get_data_out( &s16_raw_data_tmp[num_of_sensor] ); + ITO_TEST_DEBUG("num_of_sensor=%d;num_of_sensor2=%d\n",num_of_sensor,num_of_sensor2); + } + } + for ( j = 0; j < total_sensor ; j ++ ) + { + if ( g_LTP == 1 ) + s16_raw_data[pMapping[j]] = s16_raw_data_tmp[j] + 4096; + else + s16_raw_data[pMapping[j]] = s16_raw_data_tmp[j]; + } + + return; +} + +typedef enum +{ + ITO_TEST_OK = 0, + ITO_TEST_FAIL, + ITO_TEST_GET_TP_TYPE_ERROR, +} ITO_TEST_RET; + +ITO_TEST_RET ito_test_second (u8 item_id) +{ + u8 i = 0; + + s32 s16_raw_data_jg_tmp1 = 0; + s32 s16_raw_data_jg_tmp2 = 0; + s32 jg_tmp1_avg_Th_max =0; + s32 jg_tmp1_avg_Th_min =0; + s32 jg_tmp2_avg_Th_max =0; + s32 jg_tmp2_avg_Th_min =0; + + u8 Th_Tri = 25; + u8 Th_bor = 25; + + if ( item_id == 40 ) + { + for (i=0; i<(ito_test_trianglenum/2)-2; i++) + { + s16_raw_data_jg_tmp1 += s16_raw_data_1[MAP40_1[i]]; + } + for (i=0; i<2; i++) + { + s16_raw_data_jg_tmp2 += s16_raw_data_1[MAP40_2[i]]; + } + } + else if( item_id == 41 ) + { + for (i=0; i<(ito_test_trianglenum/2)-2; i++) + { + s16_raw_data_jg_tmp1 += s16_raw_data_2[MAP41_1[i]]; + } + for (i=0; i<2; i++) + { + s16_raw_data_jg_tmp2 += s16_raw_data_2[MAP41_2[i]]; + } + } + + jg_tmp1_avg_Th_max = (s16_raw_data_jg_tmp1 / ((ito_test_trianglenum/2)-2)) * ( 100 + Th_Tri) / 100 ; + jg_tmp1_avg_Th_min = (s16_raw_data_jg_tmp1 / ((ito_test_trianglenum/2)-2)) * ( 100 - Th_Tri) / 100 ; + jg_tmp2_avg_Th_max = (s16_raw_data_jg_tmp2 / 2) * ( 100 + Th_bor) / 100 ; + jg_tmp2_avg_Th_min = (s16_raw_data_jg_tmp2 / 2 ) * ( 100 - Th_bor) / 100 ; + + ITO_TEST_DEBUG("item_id=%d;sum1=%d;max1=%d;min1=%d;sum2=%d;max2=%d;min2=%d\n",item_id,s16_raw_data_jg_tmp1,jg_tmp1_avg_Th_max,jg_tmp1_avg_Th_min,s16_raw_data_jg_tmp2,jg_tmp2_avg_Th_max,jg_tmp2_avg_Th_min); + + if ( item_id == 40 ) + { + for (i=0; i<(ito_test_trianglenum/2)-2; i++) + { + if (s16_raw_data_1[MAP40_1[i]] > jg_tmp1_avg_Th_max || s16_raw_data_1[MAP40_1[i]] < jg_tmp1_avg_Th_min) + return ITO_TEST_FAIL; + } + for (i=0; i<(ito_test_trianglenum/2)-3; i++) + { + if (s16_raw_data_1[MAP40_1[i]] > s16_raw_data_1[MAP40_1[i+1]] ) + return ITO_TEST_FAIL; + } + for (i=0; i<2; i++) + { + if (s16_raw_data_1[MAP40_2[i]] > jg_tmp2_avg_Th_max || s16_raw_data_1[MAP40_2[i]] < jg_tmp2_avg_Th_min) + return ITO_TEST_FAIL; + } + } + + if ( item_id == 41 ) + { + for (i=0; i<(ito_test_trianglenum/2)-2; i++) + { + if (s16_raw_data_2[MAP41_1[i]] > jg_tmp1_avg_Th_max || s16_raw_data_2[MAP41_1[i]] < jg_tmp1_avg_Th_min) + return ITO_TEST_FAIL; + } + for (i=0; i<(ito_test_trianglenum/2)-3; i++) + { + if (s16_raw_data_2[MAP41_1[i]] < s16_raw_data_2[MAP41_1[i+1]] ) + return ITO_TEST_FAIL; + } + + for (i=0; i<2; i++) + { + if (s16_raw_data_2[MAP41_2[i]] > jg_tmp2_avg_Th_max || s16_raw_data_2[MAP41_2[i]] < jg_tmp2_avg_Th_min) + return ITO_TEST_FAIL; + } + } + + return ITO_TEST_OK; + +} +ITO_TEST_RET ito_test_second_2r (u8 item_id) +{ + u8 i = 0; + + s32 s16_raw_data_jg_tmp1 = 0; + s32 s16_raw_data_jg_tmp2 = 0; + s32 s16_raw_data_jg_tmp3 = 0; + s32 s16_raw_data_jg_tmp4 = 0; + + s32 jg_tmp1_avg_Th_max =0; + s32 jg_tmp1_avg_Th_min =0; + s32 jg_tmp2_avg_Th_max =0; + s32 jg_tmp2_avg_Th_min =0; + s32 jg_tmp3_avg_Th_max =0; + s32 jg_tmp3_avg_Th_min =0; + s32 jg_tmp4_avg_Th_max =0; + s32 jg_tmp4_avg_Th_min =0; + + u8 Th_Tri = 25; // non-border threshold + u8 Th_bor = 25; // border threshold + + if ( item_id == 40 ) + { + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + s16_raw_data_jg_tmp1 += s16_raw_data_1[MAP40_1[i]]; //first region: non-border + } + for (i=0; i<2; i++) + { + s16_raw_data_jg_tmp2 += s16_raw_data_1[MAP40_2[i]]; //first region: border + } + + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + s16_raw_data_jg_tmp3 += s16_raw_data_1[MAP40_3[i]]; //second region: non-border + } + for (i=0; i<2; i++) + { + s16_raw_data_jg_tmp4 += s16_raw_data_1[MAP40_4[i]]; //second region: border + } + } + + + + + else if( item_id == 41 ) + { + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + s16_raw_data_jg_tmp1 += s16_raw_data_2[MAP41_1[i]]; //first region: non-border + } + for (i=0; i<2; i++) + { + s16_raw_data_jg_tmp2 += s16_raw_data_2[MAP41_2[i]]; //first region: border + } + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + s16_raw_data_jg_tmp3 += s16_raw_data_2[MAP41_3[i]]; //second region: non-border + } + for (i=0; i<2; i++) + { + s16_raw_data_jg_tmp4 += s16_raw_data_2[MAP41_4[i]]; //second region: border + } + } + + jg_tmp1_avg_Th_max = (s16_raw_data_jg_tmp1 / ((ito_test_trianglenum/4)-2)) * ( 100 + Th_Tri) / 100 ; + jg_tmp1_avg_Th_min = (s16_raw_data_jg_tmp1 / ((ito_test_trianglenum/4)-2)) * ( 100 - Th_Tri) / 100 ; + jg_tmp2_avg_Th_max = (s16_raw_data_jg_tmp2 / 2) * ( 100 + Th_bor) / 100 ; + jg_tmp2_avg_Th_min = (s16_raw_data_jg_tmp2 / 2) * ( 100 - Th_bor) / 100 ; + jg_tmp3_avg_Th_max = (s16_raw_data_jg_tmp3 / ((ito_test_trianglenum/4)-2)) * ( 100 + Th_Tri) / 100 ; + jg_tmp3_avg_Th_min = (s16_raw_data_jg_tmp3 / ((ito_test_trianglenum/4)-2)) * ( 100 - Th_Tri) / 100 ; + jg_tmp4_avg_Th_max = (s16_raw_data_jg_tmp4 / 2) * ( 100 + Th_bor) / 100 ; + jg_tmp4_avg_Th_min = (s16_raw_data_jg_tmp4 / 2) * ( 100 - Th_bor) / 100 ; + + + ITO_TEST_DEBUG("item_id=%d;sum1=%d;max1=%d;min1=%d;sum2=%d;max2=%d;min2=%d;sum3=%d;max3=%d;min3=%d;sum4=%d;max4=%d;min4=%d;\n",item_id,s16_raw_data_jg_tmp1,jg_tmp1_avg_Th_max,jg_tmp1_avg_Th_min,s16_raw_data_jg_tmp2,jg_tmp2_avg_Th_max,jg_tmp2_avg_Th_min,s16_raw_data_jg_tmp3,jg_tmp3_avg_Th_max,jg_tmp3_avg_Th_min,s16_raw_data_jg_tmp4,jg_tmp4_avg_Th_max,jg_tmp4_avg_Th_min); + + + + + if ( item_id == 40 ) + { + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + if (s16_raw_data_1[MAP40_1[i]] > jg_tmp1_avg_Th_max || s16_raw_data_1[MAP40_1[i]] < jg_tmp1_avg_Th_min) + return ITO_TEST_FAIL; + } + + for (i=0; i<2; i++) + { + if (s16_raw_data_1[MAP40_2[i]] > jg_tmp2_avg_Th_max || s16_raw_data_1[MAP40_2[i]] < jg_tmp2_avg_Th_min) + return ITO_TEST_FAIL; + } + + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + if (s16_raw_data_1[MAP40_3[i]] > jg_tmp3_avg_Th_max || s16_raw_data_1[MAP40_3[i]] < jg_tmp3_avg_Th_min) + return ITO_TEST_FAIL; + } + + for (i=0; i<2; i++) + { + if (s16_raw_data_1[MAP40_4[i]] > jg_tmp4_avg_Th_max || s16_raw_data_1[MAP40_4[i]] < jg_tmp4_avg_Th_min) + return ITO_TEST_FAIL; + } + } + + if ( item_id == 41 ) + { + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + if (s16_raw_data_2[MAP41_1[i]] > jg_tmp1_avg_Th_max || s16_raw_data_2[MAP41_1[i]] < jg_tmp1_avg_Th_min) + return ITO_TEST_FAIL; + } + + for (i=0; i<2; i++) + { + if (s16_raw_data_2[MAP41_2[i]] > jg_tmp2_avg_Th_max || s16_raw_data_2[MAP41_2[i]] < jg_tmp2_avg_Th_min) + return ITO_TEST_FAIL; + } + + for (i=0; i<(ito_test_trianglenum/4)-2; i++) + { + if (s16_raw_data_2[MAP41_3[i]] > jg_tmp3_avg_Th_max || s16_raw_data_2[MAP41_3[i]] < jg_tmp3_avg_Th_min) + return ITO_TEST_FAIL; + } + + for (i=0; i<2; i++) + { + if (s16_raw_data_2[MAP41_4[i]] > jg_tmp4_avg_Th_max || s16_raw_data_2[MAP41_4[i]] < jg_tmp4_avg_Th_min) + return ITO_TEST_FAIL; + } + + } + + return ITO_TEST_OK; + +} + +static ITO_TEST_RET ito_test_interface(void) +{ + ITO_TEST_RET ret = ITO_TEST_OK; + uint16_t i = 0; +#ifdef DMA_IIC + _msg_dma_alloc(); +#endif + ito_test_set_iic_rate(50000); + ITO_TEST_DEBUG("start\n"); + ito_test_disable_irq(); + ito_test_reset(); + if(!ito_test_choose_TpType()) + { + ITO_TEST_DEBUG("choose tpType fail\n"); + ret = ITO_TEST_GET_TP_TYPE_ERROR; + goto ITO_TEST_END; + } + ito_test_EnterSerialDebugMode(); + mdelay(100); + ITO_TEST_DEBUG("EnterSerialDebugMode\n"); + ito_test_WriteReg8Bit ( 0x0F, 0xE6, 0x01 ); + ito_test_WriteReg ( 0x3C, 0x60, 0xAA55 ); + ITO_TEST_DEBUG("stop mcu and disable watchdog V.005\n"); + mdelay(50); + + for(i = 0;i < 48;i++) + { + s16_raw_data_1[i] = 0; + s16_raw_data_2[i] = 0; + s16_raw_data_3[i] = 0; + } + + ito_test_first(40, s16_raw_data_1); + ITO_TEST_DEBUG("40 get s16_raw_data_1\n"); + if(ito_test_2r) + { + ret=ito_test_second_2r(40); + } + else + { + ret=ito_test_second(40); + } + if(ITO_TEST_FAIL==ret) + { + goto ITO_TEST_END; + } + + ito_test_first(41, s16_raw_data_2); + ITO_TEST_DEBUG("41 get s16_raw_data_2\n"); + if(ito_test_2r) + { + ret=ito_test_second_2r(41); + } + else + { + ret=ito_test_second(41); + } + if(ITO_TEST_FAIL==ret) + { + goto ITO_TEST_END; + } + + ito_test_first(42, s16_raw_data_3); + ITO_TEST_DEBUG("42 get s16_raw_data_3\n"); + + ITO_TEST_END: +#ifdef DMA_IIC + _msg_dma_free(); +#endif + ito_test_set_iic_rate(100000); + ito_test_reset(); + ito_test_enable_irq(); + ITO_TEST_DEBUG("end\n"); + return ret; +} + +#include +#define ITO_TEST_AUTHORITY 0777 +static struct proc_dir_entry *msg_ito_test = NULL; +static struct proc_dir_entry *debug = NULL; +static struct proc_dir_entry *debug_on_off = NULL; +#define PROC_MSG_ITO_TESE "msg-ito-test" +#define PROC_ITO_TEST_DEBUG "debug" +#define PROC_ITO_TEST_DEBUG_ON_OFF "debug-on-off" +ITO_TEST_RET g_ito_test_ret = ITO_TEST_OK; +static int ito_test_proc_read_debug(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + int cnt= 0; + + g_ito_test_ret = ito_test_interface(); + if(ITO_TEST_OK==g_ito_test_ret) + { + ITO_TEST_DEBUG_MUST("ITO_TEST_OK"); + } + else if(ITO_TEST_FAIL==g_ito_test_ret) + { + ITO_TEST_DEBUG_MUST("ITO_TEST_FAIL"); + } + else if(ITO_TEST_GET_TP_TYPE_ERROR==g_ito_test_ret) + { + ITO_TEST_DEBUG_MUST("ITO_TEST_GET_TP_TYPE_ERROR"); + } + + *eof = 1; + return cnt; +} + +static int ito_test_proc_write_debug(struct file *file, const char *buffer, unsigned long count, void *data) +{ + u16 i = 0; + mdelay(5); + ITO_TEST_DEBUG_MUST("ito_test_ret = %d",g_ito_test_ret); + mdelay(5); + for(i=0;i<48;i++) + { + ITO_TEST_DEBUG_MUST("data_1[%d]=%d;\n",i,s16_raw_data_1[i]); + } + mdelay(5); + for(i=0;i<48;i++) + { + ITO_TEST_DEBUG_MUST("data_2[%d]=%d;\n",i,s16_raw_data_2[i]); + } + mdelay(5); + for(i=0;i<48;i++) + { + ITO_TEST_DEBUG_MUST("data_3[%d]=%d;\n",i,s16_raw_data_3[i]); + } + mdelay(5); + return count; +} +static int ito_test_proc_read_debug_on_off(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + int cnt= 0; + + bItoTestDebug = 1; + ITO_TEST_DEBUG_MUST("on debug bItoTestDebug = %d",bItoTestDebug); + + *eof = 1; + return cnt; +} + +static int ito_test_proc_write_debug_on_off(struct file *file, const char *buffer, unsigned long count, void *data) +{ + bItoTestDebug = 0; + ITO_TEST_DEBUG_MUST("off debug bItoTestDebug = %d",bItoTestDebug); + return count; +} + +static void ito_test_create_entry(void) +{ + + static const struct file_operations debug_ops = { + .owner = THIS_MODULE, + .read = ito_test_proc_read_debug, + .write = ito_test_proc_write_debug, + }; + + static const struct file_operations debug_on_off_ops = { + .owner = THIS_MODULE, + .read = ito_test_proc_read_debug_on_off, + .write = ito_test_proc_write_debug_on_off, + }; + + msg_ito_test = proc_mkdir(PROC_MSG_ITO_TESE, NULL); + debug = proc_create(PROC_ITO_TEST_DEBUG,ITO_TEST_AUTHORITY,msg_ito_test,&debug_ops); + debug_on_off = proc_create(PROC_ITO_TEST_DEBUG_ON_OFF,ITO_TEST_AUTHORITY,msg_ito_test,&debug_on_off_ops); + if (NULL==debug) + { + ITO_TEST_DEBUG_MUST("create_proc_entry ITO TEST DEBUG failed\n"); + } + else + { + ITO_TEST_DEBUG_MUST("create_proc_entry ITO TEST DEBUG OK\n"); + } + if (NULL==debug_on_off) + { + ITO_TEST_DEBUG_MUST("create_proc_entry ITO TEST ON OFF failed\n"); + } + else + { + ITO_TEST_DEBUG_MUST("create_proc_entry ITO TEST ON OFF OK\n"); + } +} +#endif +MODULE_AUTHOR("Jianchun Bian "); +MODULE_DESCRIPTION("Pixcir I2C Touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/msg2138/Makefile b/drivers/input/touchscreen/msg2138/Makefile new file mode 100644 index 00000000..57176e59 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. +obj-$(CONFIG_TOUCHSCREEN_MSG2138) += msg2138_ts.o + +msg2138_ts-objs += mstar_drv_sprd.o mstar_drv_common.o mstar_drv_ic_fw_porting_layer.o mstar_drv_main.o mstar_drv_platform_interface.o mstar_drv_platform_porting_layer.o mstar_drv_self_fw_control.o mstar_drv_utility_adaption.o + +# end diff --git a/drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h b/drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h new file mode 100644 index 00000000..085c0a15 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/msg2xxx_xxxx_update_bin.h @@ -0,0 +1,2112 @@ +0x1C,0x21,0xB0,0x0D,0x21,0x4C,0x0D,0x41,0x48,0x0D,0x61,0x44,0x0D,0x81,0x40,0x80, +0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC1,0x54,0x00,0x01,0xC9,0x6A,0x7A,0x30,0x0C, +0xEB,0x02,0x0C,0xE1,0x3C,0xC8,0xEA,0x7A,0x70,0x0C,0xE7,0x02,0x0C,0xE1,0x38,0x0C, +0xE1,0x3E,0xD0,0xE0,0x1D,0x42,0x0C,0xE1,0x3E,0x54,0xC7,0x10,0x20,0xC0,0xD4,0xC9, +0x4A,0x7A,0x10,0x0C,0xEA,0x02,0x50,0xE7,0x10,0x0C,0xEA,0x00,0x50,0xE0,0x10,0x0C, +0xEB,0x00,0x1C,0x80,0xEF,0x0C,0xEA,0x02,0x44,0xE7,0x24,0x0C,0xEA,0x00,0xC0,0xE0, +0x10,0x01,0xE8,0xC7,0x06,0x89,0x50,0xC6,0x10,0xEC,0xC7,0x06,0x89,0xE4,0x00,0x0F, +0x65,0xC8,0xA0,0x01,0x00,0x44,0xE7,0x2C,0xD0,0xE0,0x3D,0x3A,0x50,0xA0,0x30,0x98, +0x80,0x1C,0x61,0x04,0xE4,0x00,0x0F,0x5E,0x98,0x60,0xC0,0xE0,0x10,0x01,0xEC,0xE7, +0x00,0x86,0x84,0xE8,0xC8,0xEA,0x7A,0x10,0x0C,0xC7,0x02,0xC8,0xC6,0x01,0x00,0x0C, +0xC7,0x00,0xC8,0xE0,0x01,0x00,0x1E,0xE1,0x34,0x0C,0xEB,0x00,0xC9,0x4A,0x24,0x14, +0x98,0xE0,0x88,0xD7,0x98,0xA0,0x08,0x8A,0x01,0x4C,0x84,0x3E,0x54,0x84,0x0F,0x18, +0x86,0x00,0x08,0x8A,0x01,0x9C,0xC1,0x5C,0x84,0x04,0x4C,0x84,0x3E,0x9C,0xE4,0x54, +0x84,0x0F,0x5C,0xE2,0x09,0x8C,0xA4,0x5C,0xA5,0x00,0x23,0xFF,0x71,0xC0,0xE0,0x10, +0x01,0xEF,0x47,0x06,0xCE,0x23,0x40,0x3C,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x02,0x54, +0xE4,0x00,0x00,0x19,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x02,0x40,0xC0,0xE0,0x10,0x01, +0xEC,0xE7,0x04,0xE6,0xD0,0xE0,0x09,0xBE,0x4C,0x85,0x10,0xC0,0xF4,0x00,0x01,0x1C, +0xC1,0x04,0xC8,0xE7,0x26,0x80,0x8C,0x87,0xE4,0x00,0x00,0x1D,0x0B,0x07,0x01,0x9C, +0xE4,0x0F,0x06,0x01,0x9C,0xC2,0xD4,0xE4,0xFF,0xB6,0xC0,0xF4,0x00,0x01,0xC8,0xC7, +0x24,0x2C,0xC8,0x87,0x26,0x74,0x08,0x66,0x01,0xC8,0xC7,0x26,0x70,0x08,0xC6,0x01, +0x0B,0xA4,0x01,0x5C,0x63,0x04,0x8F,0xA6,0x4C,0x63,0x09,0x5F,0xBD,0x04,0x9C,0x61, +0x5C,0x63,0x00,0x23,0xA1,0x84,0xCB,0x07,0x24,0x34,0x9B,0x80,0x88,0xF7,0x98,0x80, +0x1F,0xC1,0x04,0xE4,0x00,0x00,0x9B,0x0B,0x38,0x01,0x88,0xD7,0x9F,0x21,0x5F,0x39, +0x04,0x9F,0x3F,0xD7,0x3D,0x00,0x68,0xE4,0x00,0x00,0x61,0x13,0x86,0x00,0x9C,0xC1, +0xD4,0xC7,0xFF,0xDE,0x4F,0x3C,0x08,0x11,0x07,0x00,0x8F,0x3E,0x98,0xC0,0xE4,0x00, +0x00,0x23,0x9C,0xC1,0x09,0x39,0x00,0x5C,0xC6,0x00,0x9F,0x22,0x21,0x20,0x2E,0xD5, +0x06,0xFF,0x9D,0xE4,0x00,0x00,0x2F,0x9C,0x81,0x9F,0x04,0x5C,0x84,0x00,0x9C,0xE1, +0xD4,0x64,0xFD,0xBD,0x98,0xC0,0xE4,0x00,0x00,0x0D,0x98,0xC1,0x23,0x40,0x82,0xC0, +0xE0,0x10,0x01,0x20,0xC4,0x46,0xF0,0xC7,0x00,0xFD,0x9C,0xC1,0xF8,0xC7,0x00,0xFD, +0xE4,0x00,0x00,0x4B,0xF8,0x07,0x00,0xFD,0xE4,0x00,0x00,0x3B,0xC0,0xE0,0x10,0x01, +0x20,0xC4,0x46,0xF0,0xC7,0x00,0xFC,0x9C,0xC1,0xF8,0xC7,0x00,0xFC,0xE4,0x00,0x00, +0x11,0xF8,0x07,0x00,0xFC,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x00,0x4B,0x5C,0xE7,0x00, +0xC0,0xE0,0x14,0x00,0x20,0x00,0xDD,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x00,0xFD,0xD0, +0xE4,0x00,0x85,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x00,0xFC,0xD0,0xE4,0x01,0x01,0xC0, +0xF4,0x00,0x01,0x98,0xBE,0xC8,0xC7,0x78,0xC4,0x0C,0xA6,0x01,0xC8,0xE7,0x78,0xC0, +0xFC,0xC0,0x55,0xAA,0x0C,0xC7,0x01,0xE4,0x00,0x00,0x01,0xC0,0xE0,0x10,0x01,0xEC, +0xE7,0x04,0xE2,0xD0,0xE0,0x0C,0x5E,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x04,0xE6,0xD0, +0xE0,0x0B,0xFE,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x04,0xDD,0x9C,0xC1,0x5C,0xC6,0x00, +0xF8,0xC7,0x04,0xDD,0xF0,0xC7,0x04,0xDD,0xD0,0xC4,0x00,0x51,0x98,0xC4,0xF8,0xC7, +0x04,0xDD,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x04,0xDD,0xD0,0xC4,0x0A,0xA5,0xF0,0xC7, +0x04,0xDD,0xD0,0xC3,0x2B,0x09,0xF3,0x47,0x04,0xDD,0x98,0xE4,0x47,0x5A,0x3E,0x5F, +0x5A,0x08,0x9F,0x5F,0x4F,0x5A,0xF9,0x10,0xE1,0x36,0x12,0xE1,0x34,0x10,0xC1,0x35, +0x40,0x80,0xBD,0x43,0x86,0xBC,0x40,0x84,0x35,0xC1,0x60,0x10,0x01,0x5C,0x84,0x00, +0xC1,0x40,0x10,0x01,0x43,0x24,0x3D,0x41,0x1C,0x3C,0x5F,0x39,0x00,0xFD,0x6B,0x0C, +0x24,0xFD,0x4A,0x0B,0xE2,0x1F,0x01,0x04,0x98,0xE0,0xC0,0x60,0x10,0x01,0x53,0xC0, +0x18,0x53,0xA0,0xFF,0xE4,0x00,0x00,0x93,0xD6,0xE6,0x00,0xA5,0x40,0xC6,0xBD,0x5C, +0xC6,0x00,0xD7,0x87,0x00,0x54,0x5D,0x07,0x15,0x48,0xD9,0x20,0x8C,0xCA,0x5F,0x29, +0x00,0x10,0xC6,0x00,0x41,0x3B,0x3C,0x5C,0x8C,0x00,0x9C,0xE1,0x11,0x89,0x00,0x09, +0x38,0x00,0x9F,0x02,0x41,0x29,0xEB,0x41,0x29,0x30,0xF0,0xC3,0x04,0xDD,0x9C,0xDF, +0x40,0xC6,0xF3,0x8C,0xCC,0x4C,0xC6,0x08,0x8C,0xCB,0x0D,0x26,0x01,0x1D,0x84,0x01, +0x1D,0x39,0x01,0x5C,0xC7,0x00,0xD4,0xA6,0xFD,0x95,0xD3,0x41,0x05,0x26,0xC0,0xD4, +0x00,0x01,0x98,0xE0,0xC8,0xC6,0x24,0x14,0x98,0x60,0x08,0xA6,0x01,0xC1,0x54,0x00, +0x01,0x4C,0xA5,0x3E,0x9C,0xE4,0x54,0xA5,0x0F,0x5C,0xE2,0x09,0x8C,0x65,0x5C,0x63, +0x00,0x23,0xFF,0xA5,0xC1,0x60,0x10,0x01,0x98,0x82,0xEC,0xAB,0x06,0xCE,0xE4,0x00, +0x25,0xEC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xDD,0xEC,0xEB,0x06,0xCE,0x20,0xE1, +0x0E,0x98,0x61,0x98,0x81,0x98,0xA0,0xE4,0x00,0xE7,0x52,0xC8,0xEA,0x26,0x18,0xFE, +0xE0,0x80,0x00,0x08,0xC7,0x01,0x44,0xC6,0xBD,0x5C,0xC6,0x04,0x0C,0xC7,0x01,0xC8, +0xEA,0x24,0x28,0x08,0xC7,0x01,0x50,0xC6,0x01,0x0C,0xC7,0x01,0xC9,0x4A,0x7A,0x10, +0xFF,0x00,0xFE,0xFF,0x0C,0xEA,0x02,0x44,0xE7,0xC4,0x0C,0xEA,0x00,0xE4,0x00,0x00, +0x43,0x20,0xE4,0x76,0x98,0x60,0x98,0x81,0x98,0xA0,0xE4,0x00,0xE6,0xCC,0xC0,0xE0, +0x10,0x01,0xE8,0xC7,0x06,0x89,0xC8,0xC6,0x01,0x00,0xEC,0xC7,0x06,0x89,0xC0,0xE0, +0x10,0x01,0xEC,0xE7,0x00,0x86,0xE4,0x00,0x07,0xFF,0x0C,0xE1,0x3A,0xD0,0xE0,0x22, +0x12,0x0C,0xE1,0x3A,0x54,0xE7,0x20,0xD0,0xE0,0x21,0xC2,0xC0,0xE0,0x10,0x01,0x98, +0x60,0xEC,0xE7,0x00,0x86,0x84,0xE8,0xC8,0xEA,0x7A,0x50,0x0C,0xA7,0x02,0x50,0xA5, +0x20,0xC8,0xCA,0x74,0x68,0x0C,0xA7,0x00,0x10,0xA6,0x00,0x54,0xA5,0x04,0xD0,0xA0, +0x13,0x8A,0xCA,0xEA,0x74,0x20,0xC0,0xE0,0x10,0x01,0xC9,0x4A,0x74,0xE0,0xC0,0x80, +0x10,0x01,0x08,0xA6,0x01,0xCB,0x40,0x06,0x00,0x44,0xA5,0xD4,0x20,0xA0,0xBA,0x10, +0xAA,0x00,0x54,0xA5,0x08,0x20,0xA3,0xB4,0xEF,0x04,0x06,0x9E,0xE8,0xA7,0x06,0x8D, +0x8C,0xB8,0x13,0x17,0x00,0x1B,0x05,0x00,0xE8,0xA7,0x06,0x8D,0xD0,0xAE,0xFE,0xB5, +0x9C,0xA1,0xEC,0xA7,0x06,0x8D,0xE7,0xFF,0xFF,0x99,0x98,0xE0,0x80,0x01,0x9C,0xE1, +0xC0,0xE0,0xF0,0x04,0x23,0xFF,0xE1,0xE4,0x00,0x00,0x5F,0x10,0xA6,0x00,0x54,0xA5, +0x08,0x20,0xA0,0xE4,0xEF,0x04,0x06,0x9E,0xE8,0xA7,0x06,0x8D,0x8C,0xB8,0x13,0x17, +0x00,0x1B,0x05,0x00,0xE8,0xA7,0x06,0x8D,0xD0,0xAE,0x01,0x15,0x9C,0xA1,0xEC,0xA7, +0x06,0x8D,0xE4,0x00,0x00,0x31,0xC0,0xD4,0x00,0x01,0xC0,0xE0,0x10,0x01,0xCA,0xE6, +0x74,0x20,0xC0,0x80,0x10,0x01,0xC8,0xC6,0x74,0xE0,0x10,0xA6,0x00,0x54,0xA5,0x08, +0x20,0xA2,0xEE,0xC0,0xE0,0x10,0x01,0xE8,0xA7,0x06,0x8D,0xD0,0xA0,0x16,0xFA,0xC0, +0xC0,0x10,0x01,0xEC,0xC6,0x06,0x9E,0x10,0x86,0x00,0x1E,0xE4,0xB0,0x5E,0xF7,0x00, +0xD2,0xE6,0x16,0x55,0x5C,0x8A,0x49,0x20,0x01,0xF9,0xD0,0xA4,0x0C,0xAE,0x10,0xA6, +0x02,0x10,0xE6,0x01,0x10,0xC6,0x03,0x4C,0xE7,0x40,0x44,0xE7,0x2D,0xC0,0xE2,0x7F, +0xEE,0x20,0x05,0x2D,0xC0,0xC0,0x14,0x04,0x20,0x00,0x99,0x98,0xA5,0xC0,0x80,0x10, +0x01,0xFC,0xE4,0x07,0x19,0xF8,0xA4,0x07,0x19,0x18,0xA7,0x03,0x18,0xA7,0x01,0x18, +0x07,0x02,0x98,0xAA,0x18,0xA7,0x05,0x18,0xA7,0x04,0xE4,0x00,0x00,0x5D,0xC0,0xC0, +0x14,0x24,0x20,0x00,0x99,0x50,0xA0,0x19,0xC0,0x80,0x10,0x01,0xFC,0xE4,0x07,0x19, +0xF8,0xA4,0x07,0x19,0x18,0xA7,0x03,0x18,0xA7,0x01,0x50,0xA0,0x32,0x18,0xA7,0x05, +0x18,0xA7,0x04,0x98,0xA1,0x18,0xA7,0x02,0x04,0xE0,0x80,0x50,0xE7,0x4A,0x18,0xC7, +0x00,0xE4,0x00,0x01,0xD7,0x5C,0x8A,0x69,0x20,0x04,0x5D,0xD0,0xA3,0x08,0xA6,0x10, +0xA6,0x02,0x10,0xE6,0x01,0x4C,0xE7,0x40,0x44,0xE7,0x2D,0x5C,0xEE,0x89,0x20,0x00, +0x29,0x50,0xE0,0x2A,0xE4,0x00,0x00,0x1F,0xC0,0xE2,0x80,0x0A,0xC8,0xC0,0x14,0x00, +0x48,0xE7,0x30,0xC0,0xA0,0x10,0x01,0x07,0x60,0x80,0x40,0x87,0xDC,0xEC,0x85,0x06, +0x94,0xC0,0xA0,0x10,0x01,0xC0,0xF4,0x00,0x01,0xFE,0xE0,0x08,0x00,0xC8,0xC7,0x78, +0xCC,0xEE,0xE5,0x06,0x7D,0xC8,0xA7,0x74,0x68,0xE4,0x00,0x00,0x1F,0x08,0xE6,0x01, +0x50,0xE7,0x02,0x0C,0xE6,0x01,0x80,0x01,0x12,0xE5,0x00,0xC0,0xF4,0x00,0x01,0x56, +0xF7,0x20,0x22,0xE3,0xAC,0xCA,0xE7,0x74,0xA8,0xC0,0xA0,0x10,0x01,0xEC,0x05,0x06, +0x8B,0x12,0xF7,0x00,0xCA,0xE7,0x74,0xC0,0x12,0xF7,0x00,0xC8,0xC7,0x74,0x60,0xCB, +0x40,0xFD,0xFF,0x0A,0xE6,0x01,0x46,0xF7,0xD4,0xCB,0x27,0x74,0x21,0xCB,0x07,0x74, +0x68,0x0E,0xE6,0x01,0xCA,0xE7,0x74,0xE0,0xC8,0xE7,0x74,0x20,0xE8,0xC5,0x06,0x8B, +0xC0,0xC1,0x00,0x00,0x20,0x00,0x41,0x0B,0x58,0x01,0xCB,0x60,0x02,0x00,0x47,0x5A, +0xDC,0x23,0x40,0xFC,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x74,0x60,0x08,0xA6,0x01,0xC8, +0xA5,0x02,0x00,0x0C,0xA6,0x01,0xC8,0xC7,0x74,0xA8,0xC8,0xE7,0x74,0xA0,0x10,0xE7, +0x00,0x10,0xE6,0x00,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8B,0xC0,0xE0,0x10,0x01, +0xEC,0x07,0x06,0x90,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8D,0xE4,0x00,0x02,0x9D, +0x13,0x57,0x00,0x57,0x5A,0x02,0x23,0x42,0xC4,0x43,0x44,0x34,0x13,0x5A,0x00,0x1B, +0x47,0x00,0x9C,0xC1,0xEC,0xC5,0x06,0x8B,0x18,0x19,0x00,0xE7,0xFF,0xFF,0x23,0xEC, +0x07,0x06,0x8D,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x90,0xE4,0x00,0x02,0x3F,0x10, +0xC6,0x00,0x54,0xC6,0x20,0xD0,0xC0,0x08,0xAA,0xC8,0xCA,0x74,0xA0,0x10,0xC6,0x00, +0xC8,0xCA,0x74,0xA8,0x10,0xC6,0x00,0x0C,0xC7,0x02,0x50,0xC6,0x20,0x0C,0xC7,0x00, +0xC9,0x4A,0x79,0xE9,0xC0,0xE0,0x10,0x01,0x10,0xCA,0x00,0xF8,0xC7,0x04,0xD4,0x98, +0xC8,0xF0,0xA7,0x04,0xD4,0x20,0xA0,0x7C,0xF0,0xC7,0x04,0xD4,0x20,0xC4,0x54,0xF0, +0xC7,0x04,0xD4,0x20,0xC8,0x38,0xF0,0xE7,0x04,0xD4,0xC8,0xC0,0xFF,0xFF,0x20,0xEC, +0x1A,0x50,0xC0,0x80,0xC0,0xF4,0x00,0x01,0xC8,0xA7,0x74,0xA8,0x10,0xA5,0x00,0xC0, +0xA0,0x10,0x01,0xE8,0x85,0x06,0x7D,0xD4,0xC4,0x00,0x91,0xC8,0x87,0x74,0x21,0x98, +0xA0,0xC8,0xE7,0x74,0x20,0xE4,0x00,0x01,0x01,0xCB,0x47,0x74,0x21,0xC0,0xA0,0x10, +0x01,0xC0,0xC0,0x10,0x01,0xCA,0xE7,0x74,0x68,0xEC,0x05,0x06,0x8B,0xEF,0x26,0x06, +0x96,0xC3,0x00,0x10,0x01,0xC8,0xE7,0x74,0x20,0xE4,0x00,0x00,0x4D,0xF3,0x78,0x04, +0xD4,0x23,0x60,0x30,0x13,0x77,0x00,0x57,0x7B,0x10,0x23,0x63,0xE8,0x43,0x79,0x34, +0x13,0x7B,0x00,0x1B,0x67,0x00,0x9C,0xC1,0xEC,0xC5,0x06,0x8B,0x18,0x1A,0x00,0xE8, +0xC5,0x06,0x8B,0xD4,0xC4,0xFE,0xD6,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8B,0xC0, +0xF4,0x00,0x01,0xC8,0xC7,0x74,0xA8,0xC8,0xE7,0x74,0xA0,0x10,0xE7,0x00,0x10,0xE6, +0x00,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x7D,0xE4,0x00,0x00,0x45,0x18,0x07,0x00, +0x18,0x04,0x00,0x9C,0xA1,0xD4,0xC5,0xFF,0xC5,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x74, +0xA8,0xC8,0xE7,0x74,0xA0,0x10,0xE7,0x00,0x10,0xE6,0x00,0xC0,0xE0,0x10,0x01,0xE8, +0xC7,0x06,0xA5,0x50,0xC6,0x02,0xEC,0xC7,0x06,0xA5,0xC0,0xE0,0x10,0x01,0xC8,0x80, +0xFF,0xFE,0xE8,0xC7,0x06,0xA5,0x44,0xC6,0x24,0xEC,0xC7,0x06,0xA5,0xC0,0xF4,0x00, +0x01,0xC8,0xE7,0x7A,0x50,0x10,0xC7,0x00,0x54,0xC6,0xDF,0x18,0xC7,0x00,0xC0,0xC0, +0x10,0x01,0xC0,0xE0,0x10,0x01,0xE8,0xA6,0x06,0x7F,0xEC,0xE7,0x00,0x86,0x50,0xA5, +0x20,0xEC,0xA6,0x06,0x7F,0xC0,0xC0,0x10,0x01,0xEC,0x66,0x04,0xDA,0x84,0xE8,0xE4, +0x00,0x00,0x81,0xC0,0xF4,0x00,0x01,0xFE,0xE0,0x80,0x00,0xC8,0xC7,0x26,0x18,0x08, +0x86,0x01,0x44,0x84,0xBD,0x5C,0x84,0x04,0x0C,0x86,0x01,0xC8,0xC7,0x24,0x28,0x08, +0x86,0x01,0x50,0x84,0x01,0x0C,0x86,0x01,0xC8,0xE7,0x7A,0x10,0xFF,0x00,0xFE,0xFF, +0x0C,0xC7,0x02,0x9B,0x40,0x44,0xC6,0xC4,0x0C,0xC7,0x00,0xE7,0xFF,0xF4,0xF9,0x0D, +0x81,0x42,0x0D,0x61,0x46,0x0D,0x41,0x4A,0x0D,0x21,0x4E,0x1C,0x21,0x50,0x85,0x29, +0x2C,0x00,0x0D,0xC3,0xE0,0x00,0x01,0xCB,0xFF,0x03,0x67,0x87,0xE9,0xC2,0xE0,0x10, +0x01,0x5C,0x60,0x5B,0xF3,0x57,0x0C,0x10,0x1E,0xE3,0x01,0x1F,0x7A,0xFF,0x1F,0x03, +0xFE,0x5F,0x18,0x00,0x4B,0x18,0x00,0x5F,0x77,0x1D,0x5E,0xFB,0x00,0x1F,0x23,0x02, +0x5F,0x39,0x00,0x4B,0x39,0xB8,0xCA,0xE0,0x20,0x00,0xE4,0x00,0x00,0x31,0x4F,0x98, +0x10,0x1F,0xB8,0x01,0x8F,0x84,0x5F,0x1D,0x00,0x0F,0x9C,0x02,0x5E,0xFC,0x15,0x4A, +0xF7,0xE0,0xD7,0x19,0xFF,0x61,0x53,0x80,0x1E,0x4F,0x03,0x10,0x53,0x20,0x14,0x8F, +0x04,0x0F,0x18,0x02,0xC3,0x00,0xF9,0xE8,0x4B,0x3C,0xC8,0x4B,0xAC,0x53,0x4B,0x8A, +0x43,0x20,0x60,0x62,0x0F,0x44,0x06,0x0C,0x84,0x02,0x40,0xE7,0xD3,0xCC,0x84,0x00, +0x32,0xD4,0x87,0x03,0x60,0xE4,0x00,0x01,0x4D,0x20,0x64,0x62,0x0F,0x44,0x06,0x0C, +0x84,0x02,0x40,0xE7,0xD3,0xCC,0x84,0x00,0x32,0xD4,0x87,0x01,0x20,0xE4,0x00,0x01, +0x1D,0x1C,0xFA,0xFE,0xD4,0x67,0x01,0x46,0x9F,0x5F,0x41,0x08,0xC3,0x4F,0x5A,0x10, +0x8C,0x9A,0x0C,0xE4,0x02,0xCC,0xE7,0x00,0x32,0xD4,0xE8,0x03,0x94,0x43,0x39,0x2B, +0x40,0xB7,0x2D,0x43,0xBD,0x2B,0x8F,0x3D,0xE4,0x00,0x00,0x61,0xD4,0x7B,0x02,0x0E, +0x4C,0xE7,0x10,0x8C,0xE4,0x0C,0xE7,0x02,0x9F,0x5F,0x41,0x08,0x3B,0x4F,0x5A,0x10, +0x8C,0x9A,0x0C,0xE4,0x02,0xCC,0xE7,0x00,0x32,0xD4,0xE8,0x02,0x14,0x43,0x39,0x2B, +0x40,0xB7,0x2D,0x43,0x9C,0x2B,0x8F,0x3C,0xCC,0xC6,0x00,0x0A,0x98,0xEA,0x8C,0xD9, +0x40,0xC6,0x38,0x5F,0x06,0x15,0x48,0x60,0x0A,0xE4,0x00,0x00,0x49,0x43,0x39,0x2B, +0xCC,0xC6,0x00,0x0A,0x40,0xB7,0x2D,0x98,0xEA,0xCC,0xA5,0x00,0x0E,0x8C,0xC5,0x8F, +0x26,0x43,0x39,0x38,0x5F,0x19,0x15,0xE7,0xFF,0xFF,0xBF,0x98,0x60,0x85,0x29,0xC0, +0xE0,0x10,0x01,0xE8,0xC7,0x05,0x08,0x98,0xE1,0x1C,0xA6,0xFF,0x5C,0xA5,0x04,0x24, +0xA4,0x57,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x05,0x3C,0x9C,0xDF,0x5C,0xC6,0x06,0x8C, +0xC7,0x10,0xE6,0x00,0x20,0x61,0xA6,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0C,0x10,0xC0, +0x80,0x10,0x01,0x1C,0xA6,0xFF,0x4F,0x86,0x08,0x4F,0x65,0x08,0xCF,0x46,0x00,0x03, +0x5F,0x9C,0x00,0x5F,0x7B,0x00,0xFC,0x84,0x0B,0x14,0xCF,0x25,0x00,0x03,0x98,0xC0, +0xE4,0x00,0x00,0x67,0x0B,0xB7,0x01,0x43,0xA7,0xEB,0x0F,0xB7,0x01,0x9F,0x01,0x8C, +0xBB,0x4F,0x18,0x08,0x5C,0xA5,0x00,0x8F,0x04,0x0A,0xF8,0x01,0x42,0xE7,0xBB,0x0E, +0xF8,0x01,0x43,0x05,0x34,0x4E,0xF8,0x08,0x8E,0xE4,0xD7,0x25,0xFE,0xD4,0x8C,0xDC, +0x5C,0xC6,0x00,0xD7,0x46,0x03,0x98,0x98,0xA0,0xE7,0xFF,0xFF,0xD3,0x20,0x65,0xA6, +0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0C,0x10,0xC0,0x80,0x10,0x01,0x1C,0xA6,0xFF,0x4F, +0x86,0x08,0x4F,0x65,0x08,0xCF,0x46,0x00,0x03,0x5F,0x9C,0x00,0x5F,0x7B,0x00,0xFC, +0x84,0x0B,0x14,0xCF,0x25,0x00,0x03,0x98,0xC0,0xE4,0x00,0x00,0x67,0x0B,0xB7,0x00, +0x43,0xBD,0x38,0x0F,0xB7,0x01,0x9F,0x01,0x8C,0xBB,0x4F,0x18,0x08,0x5C,0xA5,0x00, +0x8F,0x04,0x0A,0xF8,0x00,0x42,0xF7,0x38,0x0E,0xF8,0x01,0x43,0x05,0x34,0x4E,0xF8, +0x08,0x8E,0xE4,0xD7,0x25,0xFE,0xD4,0x8C,0xDC,0x5C,0xC6,0x00,0xD7,0x46,0x00,0x50, +0x98,0xA0,0xE7,0xFF,0xFF,0xD3,0xC0,0xE0,0x10,0x01,0xE8,0xA7,0x0B,0x14,0xFC,0xE7, +0x0B,0x14,0x08,0x87,0x02,0x8C,0xA4,0xC0,0xC0,0x10,0x01,0xEC,0xA6,0x09,0x4C,0xC0, +0xA0,0x10,0x01,0xF0,0xA5,0x0C,0x10,0x1F,0x05,0xFF,0x4F,0x18,0x10,0x40,0x98,0x3C, +0xFC,0xC6,0x09,0x4C,0x4E,0xE5,0x08,0x8F,0x06,0x0B,0x24,0x00,0x1C,0x97,0xFF,0x9E, +0xE1,0x4F,0x44,0x08,0x4E,0xF7,0x08,0x8F,0x47,0x8E,0xE7,0x0B,0x5A,0x00,0x8F,0x3A, +0x0F,0x38,0x00,0x4C,0xA5,0x10,0x0B,0x37,0x00,0x43,0x05,0x3C,0x42,0xE5,0x34,0x0B, +0x18,0x00,0x8F,0x19,0x0F,0x17,0x00,0x4C,0x84,0x10,0x9C,0xBF,0x8C,0xC4,0x4C,0xA5, +0x08,0x8C,0x87,0x8C,0xE5,0x08,0x84,0x00,0x08,0xE7,0x00,0x8C,0xE4,0x0C,0xE6,0x00, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x80,0x10,0x01,0xF2,0xF7,0x0C,0x10,0xC3,0x40, +0x10,0x01,0x42,0xE7,0xBB,0xFF,0x9C,0x09,0x4C,0x5E,0xF7,0x00,0xFF,0x5A,0x0B,0x14, +0x8C,0xD7,0x9B,0x20,0x8E,0xE5,0x5C,0xC6,0x00,0x5E,0xF7,0x00,0x98,0xA0,0x9B,0x00, +0xE4,0x00,0x00,0x4B,0x4F,0x77,0x10,0x43,0xBB,0xD4,0x0B,0xBD,0x00,0x1F,0xD7,0x01, +0x8F,0x3D,0x5E,0xFE,0x00,0x8B,0xBB,0x8F,0x7C,0x8F,0xBA,0x0F,0x7B,0x02,0x0B,0xBD, +0x02,0x8F,0x1B,0x8C,0xBD,0xD6,0xE6,0xFE,0xF9,0x24,0xA0,0xF0,0x27,0x00,0xE4,0x27, +0x20,0xD8,0x9C,0xE2,0xCF,0x39,0xFF,0xF6,0x4C,0xE7,0x10,0xC0,0xC0,0x10,0x01,0xFC, +0xC6,0x0C,0x0C,0x8C,0xE6,0x0C,0xE7,0x06,0x0F,0x04,0x00,0x40,0xA5,0x3B,0x9C,0xF6, +0x8C,0xB9,0x40,0xE5,0x38,0xCC,0xE7,0x07,0xFF,0x43,0x07,0xC0,0x0F,0x03,0x01,0x98, +0x61,0xE4,0x00,0x00,0x0D,0x98,0x60,0x85,0x29,0xC0,0xF4,0x00,0x01,0xFC,0x80,0xA5, +0x5A,0xC8,0xA7,0x30,0x80,0xC8,0xC7,0x30,0x41,0x10,0xC6,0x00,0x0C,0x85,0x01,0x5C, +0xC6,0x00,0xC8,0xE7,0x30,0x89,0x4C,0xC6,0x21,0x4C,0xA6,0x08,0x54,0xC6,0x08,0x50, +0xA5,0x40,0x4C,0xC6,0x10,0x44,0xC5,0x35,0x18,0xC7,0x00,0x85,0x29,0x98,0xE3,0x98, +0xC1,0xE4,0x00,0x00,0x11,0x8C,0xC7,0x9C,0xE2,0xD4,0xC3,0xFF,0xE1,0x4C,0xE7,0x09, +0x1C,0x67,0xFF,0x5C,0x63,0x06,0x85,0x29,0xFC,0xE0,0x7F,0xFF,0xC0,0xA0,0x10,0x01, +0xEC,0xE5,0x06,0x21,0xFC,0xC5,0x06,0x20,0x0C,0xE6,0x0B,0x0C,0xE6,0x03,0x0C,0xE6, +0x05,0x0C,0xE6,0x07,0x0C,0xE6,0x09,0x85,0x29,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10, +0x01,0xFC,0xA5,0x08,0xD8,0xFC,0xE7,0x06,0x20,0x08,0xC5,0x18,0x08,0x87,0x08,0x08, +0xA5,0x16,0xC0,0x8F,0xFF,0xE0,0x20,0x00,0x4D,0x08,0x87,0x05,0x0C,0x87,0x09,0x08, +0x87,0x07,0x0C,0x87,0x0B,0xE4,0x00,0x00,0x15,0x0C,0xC7,0x0B,0x0C,0xA7,0x09,0xC0, +0x80,0x10,0x01,0xFC,0xE4,0x06,0x20,0x0A,0xE7,0x04,0xC2,0xEF,0xFF,0xE4,0x20,0x00, +0x35,0x0C,0xC7,0x07,0x0C,0xA7,0x05,0xE4,0x00,0x00,0x23,0xE8,0x84,0x06,0x21,0x0C, +0x87,0x05,0x08,0x87,0x03,0x0C,0x87,0x07,0xC0,0xE0,0x10,0x01,0xEC,0xA7,0x06,0x21, +0xFC,0xE7,0x06,0x20,0x0C,0xC7,0x03,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x21,0x1C,0x0D, +0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0xC1,0x40,0x10,0x01,0xE8,0xEA,0x06,0x21, +0xFD,0x4A,0x06,0x20,0x09,0x8A,0x05,0x40,0xE7,0x65,0x09,0x6A,0x07,0x5C,0x67,0x06, +0x0C,0xE1,0x09,0x08,0xEA,0x03,0x40,0xE7,0x5D,0x5C,0xE7,0x06,0x40,0xC7,0x3B,0x0C, +0xE1,0x0B,0x40,0x63,0x1B,0x8C,0x66,0xE7,0xFF,0xFE,0x2C,0x08,0xEA,0x0B,0x41,0x6B, +0x3D,0x08,0xEA,0x09,0x41,0x8C,0x3D,0x5D,0x4C,0x06,0x40,0xEA,0x53,0x0C,0x61,0x00, +0x5D,0x6B,0x06,0x0D,0x81,0x0D,0x0D,0x61,0x0F,0x40,0x6B,0x5B,0x8C,0x67,0xE7,0xFF, +0xFD,0xDE,0x0C,0xE1,0x02,0x20,0xE0,0xC0,0x20,0x60,0xB4,0x40,0xC7,0x18,0xD0,0xC5, +0x01,0x3C,0x40,0x63,0x3B,0x08,0xE1,0x0A,0x41,0x6B,0x3B,0x08,0xE1,0x08,0x41,0x4A, +0x3B,0x40,0xEB,0x54,0xCC,0xE7,0x00,0x64,0x40,0xE7,0x18,0x5C,0xE8,0xB9,0x48,0x60, +0x0A,0xE4,0x00,0x00,0x0D,0x98,0x61,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A, +0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x41,0x18,0x0D,0x61, +0x14,0x0D,0x81,0x10,0xC1,0x60,0x10,0x01,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0x0D,0x21, +0x1C,0x0D,0xA1,0x0C,0x89,0xE3,0x99,0x43,0xFD,0x8B,0x08,0xD8,0x89,0xCB,0x4C,0xCF, +0x55,0x88,0xEA,0x54,0xC6,0x01,0x20,0xC0,0x96,0xE4,0x00,0x00,0x65,0x1D,0xA7,0x01, +0xCC,0xE7,0x00,0x1C,0xCC,0x8D,0x00,0x1C,0x40,0x67,0x64,0x8C,0x8C,0x9C,0x64,0x9C, +0x84,0x50,0xA0,0x1C,0xE4,0x00,0x00,0xB8,0x5C,0xED,0x00,0x24,0xEF,0x89,0xF0,0xEE, +0x08,0xD8,0x20,0xE0,0x24,0x9C,0xFF,0xF8,0xEB,0x08,0xD8,0x21,0x40,0x30,0x9D,0x5F, +0x5D,0x4A,0x00,0xE7,0xFF,0xFF,0x77,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x08,0xD8,0x20, +0xE0,0x52,0xC0,0xE0,0x10,0x01,0x98,0xB7,0xE8,0xC7,0x07,0x23,0x44,0xC6,0x2C,0xEC, +0xC7,0x07,0x23,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D, +0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x2C,0x00,0x0D, +0xC3,0xE0,0x00,0x01,0xCB,0xFF,0x09,0x0D,0x87,0xE9,0xC0,0xE0,0x10,0x01,0xE8,0xC7, +0x05,0x08,0x20,0xC4,0xDE,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF0,0xA7,0x0C, +0x10,0xFC,0xC6,0x07,0x24,0x9C,0xA1,0x98,0xE0,0xE4,0x00,0x00,0x31,0x4C,0x87,0x08, +0x1E,0xE7,0xFF,0x1F,0x07,0x01,0x8C,0x86,0x4E,0xF7,0x10,0x5C,0xF8,0x00,0x0E,0xE4, +0x01,0xD4,0xE5,0xFF,0x60,0xE4,0x00,0x00,0xD1,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0C, +0x0C,0x20,0xC8,0x58,0x10,0xA7,0x04,0xC0,0xC0,0x10,0x01,0x9C,0xA1,0xFC,0xC6,0x07, +0x24,0x98,0xE0,0xE4,0x00,0x00,0x8D,0x10,0xA7,0x04,0xC0,0xC0,0x10,0x01,0x9C,0xA1, +0xFC,0xC6,0x07,0x24,0x98,0xE0,0xE4,0x00,0x00,0x31,0x4C,0x87,0x08,0xCE,0xE7,0x00, +0x06,0x1F,0x07,0x01,0x8C,0x86,0x9E,0xF9,0x5C,0xF8,0x00,0x0E,0xE4,0x01,0xD4,0xE5, +0xFF,0x60,0xE4,0x00,0x00,0x37,0x4C,0x87,0x08,0x4E,0xE7,0x08,0x1F,0x07,0x01,0x8C, +0x86,0x9E,0xFF,0x5C,0xF8,0x00,0x0E,0xE4,0x01,0xD4,0xE5,0xFF,0x68,0x85,0x29,0x40, +0x84,0x1D,0xC2,0xE0,0x10,0x01,0x9C,0x81,0xF2,0xF7,0x0C,0x10,0x5C,0x84,0x00,0x42, +0xE5,0xBB,0x5E,0xF7,0x00,0x21,0x04,0x3C,0xC0,0xA0,0x10,0x01,0xFC,0xA5,0x0B,0x14, +0xE4,0x00,0x00,0x19,0xC0,0xA0,0x10,0x01,0xFC,0xA5,0x09,0x9C,0x8E,0xE3,0xC3,0x0F, +0xFF,0xE1,0x4F,0x57,0x10,0xCB,0x18,0xFF,0xFF,0x9F,0x42,0x4E,0xF7,0x10,0x8F,0x45, +0x8E,0xE5,0x4F,0x84,0x10,0x88,0xA6,0x9B,0x20,0xE4,0x00,0x00,0x5B,0x20,0xE0,0x2A, +0x0B,0x77,0x00,0xE4,0x00,0x00,0x1F,0x0B,0x7A,0x00,0x20,0xE4,0x20,0x0B,0xB7,0x00, +0x8F,0x7D,0x0F,0x65,0x00,0x9F,0x24,0x0F,0x65,0x02,0x9E,0xE4,0x5F,0x1B,0x15,0x9F, +0x44,0x9C,0xA4,0x4B,0x18,0xD8,0xD7,0x3C,0xFE,0xBE,0x98,0xE0,0xE4,0x00,0x00,0x29, +0x0C,0xA6,0x02,0x9C,0xE1,0x40,0xA5,0xC5,0x5C,0xE7,0x00,0x0C,0xA6,0x00,0x9C,0xC4, +0xD4,0x87,0xFF,0x85,0x85,0x29,0x1C,0x21,0x88,0x0D,0x41,0x70,0x0D,0x61,0x6C,0x89, +0x44,0x0D,0x81,0x68,0x0D,0xA1,0x64,0x0D,0x21,0x74,0x89,0xA5,0x89,0x83,0x88,0xA6, +0x88,0x8D,0x88,0xC1,0x88,0x6A,0xE7,0xFF,0xFE,0x92,0xC0,0xE0,0x10,0x01,0x41,0xAD, +0x55,0xE8,0xA7,0x05,0x08,0x9D,0xA1,0xCF,0x2A,0x00,0x06,0x4F,0x0A,0x08,0x5D,0xAD, +0x00,0x89,0x61,0x9F,0x3F,0x9F,0x01,0x98,0x80,0x98,0xC0,0x98,0xE0,0xE4,0x00,0x00, +0x4B,0x0E,0xEB,0x02,0x43,0x44,0x54,0x43,0x5A,0xBB,0x20,0xA4,0x30,0x43,0x59,0xBB, +0x20,0xA8,0x18,0x43,0x58,0xBB,0x8C,0xDA,0x8C,0xF7,0x9C,0x81,0x9F,0x26,0x9F,0x02, +0x9D,0x64,0x5E,0xE4,0x00,0xD5,0xB7,0xFE,0xE5,0x98,0x60,0x24,0xE1,0x30,0xC0,0x80, +0x10,0x01,0xE8,0x84,0x0C,0x17,0x40,0xC6,0x23,0x20,0xA4,0x32,0x4C,0xA7,0x0A,0x8C, +0xC5,0xE4,0x00,0x00,0x3B,0x20,0xA8,0x52,0xCC,0xA7,0x00,0x06,0xCC,0xE7,0x00,0x03, +0x8C,0xE6,0x40,0xE7,0x28,0xE4,0x00,0x00,0x19,0x8C,0xC7,0x4C,0xE7,0x08,0x40,0xE6, +0x38,0xC0,0xE0,0xFF,0xE8,0xC8,0xC0,0x07,0xFF,0x98,0x61,0x48,0xE7,0x30,0x5C,0xFF, +0xF9,0x48,0xE7,0x00,0x0C,0xEC,0x01,0x0D,0xA1,0x66,0x0D,0x81,0x6A,0x0D,0x61,0x6E, +0x0D,0x41,0x72,0x0D,0x21,0x76,0x1C,0x21,0x78,0x85,0x29,0xFC,0x21,0xFF,0x80,0x0D, +0x41,0x78,0x0D,0x61,0x74,0x0D,0x81,0x70,0x0D,0xA1,0x6C,0x0D,0xC1,0x68,0x0D,0xE1, +0x64,0x0E,0xC1,0x60,0x0D,0x21,0x7C,0x89,0x84,0x89,0xE3,0xC1,0xA0,0x10,0x01,0x88, +0x64,0xFD,0xAD,0x0C,0x0C,0x10,0x8D,0x04,0x41,0x46,0x23,0x4C,0x84,0x08,0x9C,0x8E, +0xC4,0x84,0x03,0xF8,0xFE,0xC1,0x00,0x80,0x89,0x65,0x89,0xC1,0x88,0xA6,0x40,0x21, +0x25,0x1C,0xD6,0x80,0x88,0x8B,0xE7,0xFF,0xFC,0x92,0x10,0x8D,0x04,0xC0,0xC0,0x10, +0x01,0x5D,0x4A,0x00,0x4C,0x84,0x08,0xFC,0xC6,0x07,0x24,0x88,0xA1,0x98,0xE0,0xE4, +0x00,0x00,0x25,0x42,0xE5,0x3C,0x43,0x07,0x34,0x9C,0xE2,0x0B,0x18,0x03,0x0F,0x17, +0x01,0xD4,0xE4,0xFF,0x96,0x8D,0x8A,0x8D,0x6A,0x5D,0x8C,0x00,0x5D,0x6B,0x00,0x1C, +0xD6,0x80,0x1C,0x8B,0x01,0x98,0xE0,0x40,0x84,0x65,0x5C,0x84,0x00,0xE4,0x00,0x00, +0x2D,0x1E,0xE7,0x01,0x0F,0x06,0x02,0x27,0x00,0x4A,0x9C,0xC4,0xD5,0x67,0x03,0x31, +0x5C,0xF7,0x00,0xD4,0x87,0xFF,0x75,0x88,0xEC,0x1C,0x96,0xE0,0x4C,0xC7,0x10,0x8C, +0xC4,0x1E,0xF6,0xE0,0x0C,0x86,0xA2,0x1C,0xC7,0x01,0x40,0x84,0x23,0x4C,0xC6,0x10, +0x8C,0xD7,0x0C,0xC6,0xA2,0x40,0xC6,0x33,0x24,0xC0,0xE8,0x24,0x80,0xDC,0x41,0x4C, +0x55,0x8C,0xEA,0x4C,0xE7,0x08,0x8C,0xA7,0x0B,0x05,0x00,0xC0,0xA0,0x10,0x01,0xFC, +0xA5,0x0C,0x0C,0x8C,0x86,0x12,0xE5,0x14,0x08,0xE5,0x0B,0x98,0x61,0x40,0xB8,0x3B, +0x40,0xE6,0x3B,0x40,0xA5,0xB8,0x40,0xE7,0x20,0x8C,0xE5,0x0C,0xEF,0x01,0xE4,0x00, +0x00,0x0D,0x98,0x60,0x88,0x2E,0x0E,0xC1,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D, +0xA1,0x6E,0x0D,0x81,0x72,0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21, +0x00,0x80,0x85,0x29,0xC0,0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0x1C,0x21,0xC0,0xF0, +0x87,0x0C,0x0C,0x0D,0x41,0x38,0x0D,0x61,0x34,0x0E,0x01,0x20,0x0E,0x21,0x1C,0x0E, +0x41,0x18,0x0E,0x61,0x14,0x0E,0x81,0x10,0x0E,0xA1,0x0C,0x0E,0xC1,0x08,0x0D,0x21, +0x3C,0x0D,0x81,0x30,0x0D,0xA1,0x2C,0x0D,0xC1,0x28,0x0D,0xE1,0x24,0xFE,0xC3,0x0A, +0x30,0x98,0xA0,0x88,0x76,0xC2,0x40,0x10,0x01,0xE4,0x00,0x7D,0x16,0x99,0x60,0x99, +0x40,0xFE,0x32,0x08,0xD8,0xC2,0xA0,0x10,0x01,0x9A,0x01,0x1E,0x81,0x06,0x1E,0x61, +0x04,0xE4,0x00,0x01,0x21,0xCD,0x8A,0x00,0x1C,0xE8,0xF5,0x04,0x89,0x40,0x71,0x64, +0x54,0xE7,0x02,0x8D,0x91,0x1C,0x63,0x16,0x11,0xEC,0x04,0x11,0xCC,0x05,0x88,0x8F, +0x88,0xAE,0x11,0xAC,0x07,0x20,0xE1,0x04,0x88,0xCD,0x88,0x74,0x98,0xE2,0x99,0x00, +0xE7,0xFF,0xFA,0xEC,0x20,0x60,0xFC,0x88,0x8F,0x88,0xAE,0x88,0xCD,0x88,0x73,0x98, +0xE2,0x99,0x00,0xE7,0xFF,0xFC,0x70,0x20,0x60,0xB0,0x08,0xC1,0x04,0xCC,0xC6,0x00, +0x03,0x08,0xE1,0x06,0xCC,0xE7,0x00,0x07,0x8C,0xE6,0x98,0xCA,0x40,0xE7,0x30,0x0C, +0xEC,0x17,0xE4,0x00,0x00,0x35,0x88,0xCD,0x98,0xE2,0x99,0x00,0xE7,0xFF,0xFA,0x74, +0x20,0x60,0x32,0x4C,0xF0,0x54,0x45,0x6B,0x3D,0x5D,0x6B,0x00,0xC0,0xE0,0x10,0x01, +0x88,0x76,0xF0,0x87,0x0C,0x0C,0x98,0xA1,0x9D,0x41,0xE4,0x00,0x7B,0xD4,0x5D,0x4A, +0x00,0xF0,0xF2,0x08,0xD8,0xD4,0xEA,0xFB,0x85,0x88,0x6B,0xE7,0xFF,0xF6,0x3A,0xC0, +0xE0,0x10,0x01,0xF0,0xE7,0x08,0xD8,0x20,0xE0,0x6C,0xC0,0xE0,0x10,0x01,0xE8,0xE7, +0x04,0x8D,0x54,0xE7,0x40,0x20,0xE0,0x34,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0xD2, +0x84,0xE8,0xC0,0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFC,0x63, +0x0A,0x30,0x98,0xA1,0xE4,0x00,0x7B,0x40,0x0D,0x21,0x3E,0x0E,0xC1,0x0A,0x0E,0xA1, +0x0E,0x0E,0x81,0x12,0x0E,0x61,0x16,0x0E,0x41,0x1A,0x0E,0x21,0x1E,0x0E,0x01,0x22, +0x0D,0xE1,0x26,0x0D,0xC1,0x2A,0x0D,0xA1,0x2E,0x0D,0x81,0x32,0x0D,0x61,0x36,0x0D, +0x41,0x3A,0x1C,0x21,0x40,0x85,0x29,0x1C,0x21,0xD0,0x0D,0xC1,0x18,0x0D,0xE1,0x14, +0x0D,0x21,0x2C,0x0D,0x41,0x28,0x0D,0x61,0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0E, +0x01,0x10,0x0E,0x21,0x0C,0x89,0xE3,0x89,0xC4,0xE7,0xFF,0xFC,0xF6,0xC0,0xE0,0x10, +0x01,0xE8,0xE7,0x04,0x8D,0x54,0xE7,0x80,0x20,0xE0,0x56,0xC1,0xA0,0x10,0x01,0x99, +0x60,0x99,0x40,0xFD,0x8D,0x08,0xD8,0x9A,0x01,0xE4,0x00,0x00,0x81,0xC0,0xE0,0x10, +0x01,0xEC,0xE7,0x00,0xD6,0x84,0xE8,0xE4,0x00,0x00,0x81,0xCC,0x8A,0x00,0x1C,0x40, +0xC4,0x64,0x88,0x66,0x88,0x86,0x10,0xE6,0x07,0x10,0xA6,0x04,0x1C,0x63,0x18,0x9C, +0x8C,0x10,0xC6,0x05,0xE7,0xFF,0xF0,0x3C,0x20,0x60,0x32,0x4C,0xF0,0x54,0x45,0x6B, +0x3D,0x5D,0x6B,0x00,0x9D,0x41,0x5D,0x4A,0x00,0xF0,0xED,0x08,0xD8,0xD4,0xEA,0xFE, +0x75,0x88,0x6B,0xE7,0xFF,0xF4,0x4A,0x21,0xE0,0x8C,0x21,0xC0,0x80,0xC1,0x80,0x10, +0x01,0xC2,0x20,0x10,0x01,0x99,0x60,0xFE,0x31,0x04,0xEA,0xFE,0x0C,0x08,0xD8,0xC1, +0xE0,0x10,0x01,0x1D,0xC1,0x04,0xE4,0x00,0x00,0xC7,0xC0,0xE0,0x10,0x01,0xC0,0xC0, +0x10,0x01,0xEB,0x07,0x04,0x89,0xF2,0xE6,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xCE,0xF7, +0x00,0x1C,0xFC,0xE7,0x08,0xF0,0x57,0x18,0x01,0x8E,0xE7,0xFC,0x80,0x07,0xFF,0xC8, +0xA0,0x07,0xFF,0xE4,0x00,0x00,0xED,0xCD,0x4B,0x00,0x1C,0x8D,0x50,0x08,0xCA,0x16, +0x0C,0xC1,0x04,0x08,0xCA,0x18,0xEC,0xEF,0x00,0xDA,0x0C,0xC1,0x00,0x88,0x6E,0x88, +0x81,0x0C,0xAA,0x0E,0x88,0xD1,0x84,0xE8,0x0C,0xE1,0x06,0x9D,0x61,0x0C,0xEA,0x17, +0x5D,0x6B,0x00,0x0C,0xE1,0x02,0x0C,0xEA,0x19,0xF0,0xEC,0x08,0xD8,0xD4,0xEB,0xFE, +0x55,0xE7,0xFF,0xFF,0x33,0x08,0xC7,0x00,0x5C,0xDF,0xF9,0x08,0xC7,0x01,0x48,0xC6, +0x00,0x5C,0xC6,0x06,0xC0,0xC0,0xFF,0xE8,0x48,0xC6,0x20,0x5C,0xC6,0x06,0x0C,0xC7, +0x01,0x13,0x27,0xEF,0xCC,0xC6,0x03,0xFF,0x23,0x00,0x38,0x40,0xC6,0x28,0x4F,0x39, +0x50,0x8C,0xD9,0x0C,0xC7,0x01,0x1C,0xE7,0x1C,0xD4,0xF7,0xFE,0x66,0x0E,0x21,0x0E, +0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22,0x0D, +0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0x1C,0x21,0xE0, +0x5E,0xE3,0x04,0x0D,0x81,0x14,0x0D,0xA1,0x10,0x0D,0xC1,0x0C,0x0D,0xE1,0x08,0x0D, +0x41,0x1C,0x0D,0x61,0x18,0x0E,0x01,0x04,0xC3,0x00,0x10,0x01,0x9B,0x41,0xFF,0x18, +0x0C,0x0C,0xC1,0xA0,0x10,0x01,0x08,0xF8,0x0B,0x13,0x38,0x14,0x41,0xE0,0x3D,0x13, +0x18,0x04,0x41,0xEF,0xBD,0x40,0xC6,0xC3,0x41,0xD7,0x3D,0x43,0x5A,0x35,0x5D,0xEF, +0x04,0x5C,0xC6,0x00,0x5D,0xCE,0x04,0x8C,0xA6,0xFD,0xAD,0x07,0x24,0x8C,0xC4,0x5C, +0xA5,0x00,0xC0,0x80,0x10,0x01,0x5C,0xC6,0x00,0xFC,0x84,0x0B,0x14,0x4D,0x87,0x08, +0x53,0x60,0x64,0xE4,0x00,0x01,0x79,0x43,0x86,0xD4,0x4F,0x9C,0x08,0x8F,0x8D,0x09, +0x7C,0x00,0x41,0x6B,0x3B,0x41,0x6B,0xC8,0x5D,0x6B,0x06,0x5F,0xAB,0x04,0x43,0x9D, +0xBD,0x5F,0x9C,0x06,0x4F,0xDC,0xFA,0x47,0x9E,0xE6,0x43,0x9C,0xF5,0xD4,0xFC,0x04, +0x6C,0x4F,0xC6,0x10,0x8F,0xC4,0xD5,0x9C,0x03,0xC8,0x4F,0xC6,0x08,0x42,0x1D,0x7C, +0x1D,0x1E,0x01,0x43,0xAE,0xED,0x5E,0x10,0x06,0x5F,0xBD,0x06,0x42,0x07,0x85,0x43, +0xA7,0xED,0x4D,0x08,0x08,0x4F,0xC6,0x10,0x8D,0x04,0xCE,0x10,0x00,0x64,0xCF,0xBD, +0x00,0x64,0x8B,0x88,0x41,0x44,0xF4,0xD5,0x63,0x01,0x30,0x0B,0xAA,0x00,0x43,0x90, +0x38,0x5F,0x9C,0x04,0x43,0xBC,0xEB,0x43,0xBD,0xD8,0x0F,0xAA,0x01,0x0B,0xA8,0x00, +0x43,0x9C,0xEB,0x43,0x9C,0xD8,0x0F,0x88,0x01,0xE4,0x00,0x00,0x63,0x09,0x0A,0x00, +0x43,0xBD,0x38,0x5F,0xBD,0x04,0x41,0x1D,0x43,0x41,0x08,0xD8,0x0D,0x0A,0x01,0x0B, +0xDC,0x00,0x43,0xBD,0xF3,0x43,0xBD,0xD8,0x0F,0xBC,0x01,0xE4,0x00,0x00,0x1F,0x0C, +0x1E,0x01,0x4F,0x86,0x10,0x8F,0x84,0x0C,0x1C,0x03,0x9C,0xC1,0x5C,0xC6,0x00,0xD4, +0xC5,0xFA,0x40,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x0C,0x0D,0x43,0x18,0x3B,0x0E,0x01, +0x06,0x0D,0xE1,0x0A,0x0D,0xC1,0x0E,0x0D,0xA1,0x12,0x0D,0x81,0x16,0x0D,0x61,0x1A, +0x0D,0x41,0x1E,0x5C,0x78,0x00,0x1C,0x21,0x20,0xE4,0x00,0xA5,0xB1,0x20,0xE1,0x86, +0xC2,0xE0,0x10,0x01,0x40,0x63,0x25,0xFE,0xF7,0x04,0xEA,0x21,0x08,0xF6,0x5C,0x63, +0x06,0x0A,0xF7,0x33,0x4C,0xE3,0xFA,0x4E,0xF7,0x08,0x44,0x67,0x1E,0x40,0xE3,0x3D, +0xD6,0xE7,0x03,0x10,0xD4,0xA6,0x00,0x90,0xCC,0xC6,0x00,0x03,0x41,0x06,0x40,0x5D, +0x05,0x15,0xE4,0x00,0x00,0x93,0xD4,0xC5,0x02,0x60,0xCC,0xA5,0x00,0x03,0x41,0x05, +0x40,0x5D,0x06,0x15,0xE4,0x00,0x00,0x6F,0x5C,0x63,0x06,0x08,0xD7,0x33,0x4C,0xE3, +0xFA,0x4C,0xC6,0x08,0x44,0x67,0x1E,0x40,0xE3,0x3D,0xE4,0x00,0x00,0x3D,0xC0,0xE0, +0x10,0x01,0x40,0x83,0x25,0xE8,0xC7,0x05,0x1D,0x5C,0x84,0x06,0x4C,0xC6,0x08,0x4C, +0xE4,0xFA,0x44,0x87,0x26,0x40,0xE4,0x3D,0x5C,0xC7,0x15,0x48,0x60,0x0A,0xE4,0x00, +0x00,0x0D,0x98,0x60,0x85,0x29,0xD4,0x83,0x00,0xA0,0x8A,0xE3,0x88,0xA6,0x88,0x64, +0x98,0xC1,0x88,0x97,0x40,0xE6,0x3D,0x5C,0xE7,0x00,0xC0,0xC0,0x10,0x01,0xF0,0xC6, +0x05,0x1E,0x42,0xE4,0x33,0xD4,0x77,0x00,0x50,0x98,0x80,0xE4,0x00,0x00,0x47,0x4E, +0xE4,0x08,0xD6,0xE3,0x00,0xE4,0x1E,0xE6,0xFE,0xCF,0x03,0xFF,0xFE,0x42,0xE3,0xBB, +0x4C,0xC6,0x08,0x40,0xC6,0x23,0x8C,0xD8,0x40,0x86,0x23,0x40,0x84,0xB8,0x5C,0xE0, +0x01,0x48,0xC3,0x20,0x48,0x64,0x18,0x40,0xE3,0x34,0x24,0xE1,0x5C,0xC0,0xA0,0x7F, +0xEC,0x20,0x00,0x49,0xC8,0x80,0x04,0x00,0x40,0x84,0x2D,0xC0,0x80,0x25,0x6C,0xE4, +0x00,0x00,0x11,0xC0,0xA0,0xA5,0x6C,0x48,0x80,0x0A,0x5C,0x84,0x00,0x20,0x80,0xD0, +0xCC,0xC6,0x03,0xB0,0xCC,0x83,0x04,0x50,0x8C,0x86,0x50,0xC0,0x50,0x40,0x84,0x38, +0x5C,0x84,0x06,0xFC,0xE4,0xFC,0x00,0x5C,0xE7,0x06,0x4E,0xE7,0xFA,0x44,0xF7,0x3E, +0x40,0xE7,0xBD,0x40,0xA7,0x2B,0x40,0xE6,0x3D,0x40,0x87,0x23,0x8C,0xA4,0x40,0xA5, +0x30,0x5C,0x65,0x06,0xC0,0xF4,0x00,0x01,0x5C,0xA5,0x04,0xC8,0xE7,0x79,0xC0,0x0C, +0xA7,0x01,0x85,0x29,0xFC,0x21,0xFF,0x50,0xC0,0xE0,0x10,0x01,0xED,0x41,0x00,0xAC, +0xED,0x61,0x00,0xA8,0xED,0x81,0x00,0xA4,0xED,0xA1,0x00,0xA0,0xED,0xC1,0x00,0x9C, +0xED,0xE1,0x00,0x98,0xEE,0x01,0x00,0x94,0xFC,0xE7,0x0C,0x0C,0x10,0xC7,0x04,0x1F, +0x21,0x60,0x11,0xA7,0x01,0x4F,0xA4,0x10,0x41,0xAD,0x33,0x8F,0xB9,0x5D,0xAD,0x00, +0x98,0xC0,0x8A,0xFD,0x8B,0x19,0xE4,0x00,0x00,0x83,0x0C,0x07,0x00,0x9C,0xE4,0xD4, +0xF7,0xFF,0xDE,0x9C,0xC1,0x1E,0xE7,0x08,0xD0,0xC4,0x01,0x7E,0x4F,0x03,0x08,0xC3, +0x40,0x10,0x01,0xC3,0xC0,0x10,0x01,0xFF,0x5A,0x0C,0x24,0xFF,0xDE,0x02,0x8A,0xCD, +0x05,0x00,0x18,0x9D,0xBE,0x41,0x78,0xD4,0x98,0xE0,0xFD,0x81,0x00,0x80,0x89,0x5A, +0x43,0x68,0xF4,0xE4,0x00,0x00,0xFF,0x4C,0xE6,0x18,0x8C,0xF8,0xE7,0xFF,0xFF,0x87, +0x42,0x08,0x34,0x1D,0xE6,0x01,0x8E,0x1E,0x12,0x10,0x00,0xD6,0x17,0x00,0xAE,0x8C, +0xCE,0x4C,0xC6,0x08,0x8C,0xCA,0x08,0xC6,0x01,0x0C,0xDC,0x01,0xE4,0x00,0x00,0x17, +0x5C,0xCF,0x00,0xD5,0xA6,0xFE,0xEC,0x9E,0xE1,0x9F,0x82,0x5E,0xF7,0x00,0xD4,0x97, +0x00,0x51,0x98,0xC2,0xE7,0xFF,0xFF,0xDF,0xCC,0xC7,0x00,0x30,0x8A,0xFB,0x8C,0xCA, +0x4F,0x87,0x08,0xE4,0x00,0x00,0x45,0x09,0xE6,0x01,0x11,0xD7,0x00,0xFE,0x01,0x00, +0x90,0x8D,0xDC,0x9E,0xE1,0x4D,0xCE,0x08,0x8D,0xD0,0x09,0xCE,0xF1,0x41,0xCF,0x75, +0x0D,0xC6,0x01,0x9C,0xC2,0xD4,0xCB,0xFF,0x16,0x9C,0xE1,0x1D,0x66,0x30,0xD0,0xE4, +0x00,0x9A,0x4F,0x87,0x10,0x9A,0xE0,0x8F,0x8C,0xCD,0xC7,0x00,0x18,0xE7,0xFF,0xFF, +0x63,0x43,0xC1,0xC4,0xC1,0x00,0x10,0x01,0xC1,0xE0,0x10,0x01,0xFD,0x08,0x0C,0xB4, +0x8A,0xE1,0xFD,0xEF,0x0C,0x24,0x98,0xE0,0x41,0xC8,0xC4,0x89,0xBE,0x5C,0xC7,0x00, +0x20,0xCC,0x3C,0xCF,0x07,0x00,0x30,0x88,0xD7,0x8F,0x0F,0xE4,0x00,0x00,0x6B,0x88, +0xC8,0x8B,0x97,0xE4,0x00,0x00,0x2B,0x09,0x46,0x01,0xEB,0x06,0xFF,0x71,0x9C,0xC2, +0x43,0x0A,0xC5,0x0F,0x1C,0x01,0x9F,0x82,0xD4,0xCE,0xFF,0x7E,0xE4,0x00,0x00,0x31, +0x09,0x58,0x01,0x0B,0x98,0x31,0x9F,0x02,0x43,0x8A,0xE5,0x0F,0x86,0x01,0x9C,0xC2, +0xD4,0xDE,0xFF,0x86,0x88,0xD7,0x8B,0x9B,0x4F,0x07,0x08,0xE4,0x00,0x00,0x55,0xFD, +0x61,0x00,0x90,0x09,0x86,0x00,0x11,0x5C,0x00,0x9C,0xC2,0x8D,0x58,0x9F,0x81,0x4D, +0x4A,0x10,0x8D,0x4B,0x4D,0x6C,0xFA,0x0E,0x0A,0xD2,0x45,0x8B,0x66,0x41,0x6C,0x5D, +0x8D,0x70,0x0D,0x6A,0xD0,0xD4,0xCD,0xFE,0xD6,0x9C,0xE1,0xD0,0xE4,0xFC,0x16,0x1C, +0xE1,0x60,0x9A,0xE0,0xE4,0x00,0x00,0x17,0x0C,0xC7,0x02,0x9C,0xE4,0x8E,0xE6,0xD4, +0xFD,0xFF,0xCE,0x9C,0x82,0x9B,0x80,0x4C,0x84,0x10,0x98,0xE0,0x8C,0x99,0x98,0xC1, +0x1F,0xA1,0x60,0xE4,0x00,0x00,0x45,0x0F,0xD8,0x02,0x9F,0x04,0x8F,0x3E,0xD7,0x04, +0xFF,0xCE,0xD6,0xF9,0x00,0x41,0x8A,0xF9,0x88,0xE6,0x9C,0xC1,0x9C,0x88,0x5C,0xC6, +0x00,0xD0,0xC4,0x00,0x8A,0x9F,0x81,0x9B,0x20,0x4F,0x1C,0x18,0x8F,0x1D,0xE7,0xFF, +0xFF,0xC1,0x9A,0xE0,0x98,0xC0,0x24,0xEC,0x77,0xC0,0xC0,0x10,0x01,0xC0,0x80,0x10, +0x01,0xFC,0xC6,0x05,0x48,0xFC,0x84,0x05,0x4C,0x8C,0xC7,0x8C,0xE4,0x10,0xC6,0x00, +0x12,0xE7,0x00,0x8B,0x1B,0x4F,0x77,0x08,0xCE,0xF7,0x00,0x30,0xCC,0xE6,0x00,0x30, +0xCC,0xA5,0x00,0x30,0x4F,0x86,0x08,0xC0,0x80,0x10,0x01,0xCC,0xC6,0x00,0x18,0xFC, +0x84,0x0C,0x24,0x8C,0x66,0x8C,0xE4,0x4C,0x63,0x08,0x8C,0x97,0x8F,0x43,0xC2,0xE0, +0x10,0x01,0x9B,0x22,0xFE,0xF7,0x08,0x78,0x8C,0xB7,0xE4,0x00,0x00,0x8D,0x08,0xC7, +0x01,0x12,0xF8,0x00,0xFE,0x01,0x00,0x90,0x43,0xBC,0xBC,0x4F,0xBD,0x08,0x8F,0xB0, +0x0B,0xBD,0xF1,0x8C,0xDD,0x0C,0xC7,0x01,0x08,0xC4,0x01,0x8E,0xFB,0x9F,0x01,0x4E, +0xF7,0x08,0x8E,0xF0,0x0A,0xF7,0xF1,0x8E,0xE6,0x5E,0xF7,0x06,0x0E,0xE4,0x01,0x9C, +0x82,0x08,0xC7,0x00,0x9C,0xE2,0x8E,0xE6,0x42,0xF7,0xC8,0x0E,0xE5,0x01,0x9C,0xA2, +0xD4,0xFA,0xFD,0xF6,0xEE,0x01,0x00,0x96,0xED,0xE1,0x00,0x9A,0xED,0xC1,0x00,0x9E, +0xED,0xA1,0x00,0xA2,0xED,0x81,0x00,0xA6,0xED,0x61,0x00,0xAA,0xED,0x41,0x00,0xAE, +0xFC,0x21,0x00,0xB0,0x85,0x29,0x08,0xE5,0x02,0xD4,0x67,0x00,0x64,0xD4,0x87,0x00, +0xB4,0xE4,0x00,0x00,0x5D,0xD4,0x83,0x00,0x74,0x50,0x80,0x64,0x40,0x63,0x20,0xE4, +0x00,0x00,0x15,0x50,0x60,0x64,0x40,0x64,0x18,0x08,0x85,0x05,0xC0,0xE0,0x10,0x01, +0x40,0x63,0x23,0xFC,0x63,0x00,0xEA,0xEC,0x67,0x05,0x1D,0xE4,0x00,0x00,0x1F,0x50, +0xC0,0xEA,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x05,0x1D,0x85,0x29,0xC0,0xE0,0x10,0x01, +0x9C,0x30,0xFC,0x87,0x08,0xD8,0x0D,0x41,0x0C,0xF1,0x47,0x08,0xD8,0xC0,0xE0,0x10, +0x01,0xC0,0xA0,0x10,0x01,0xF1,0x07,0x0C,0x10,0x0D,0x61,0x08,0x0D,0x81,0x04,0x9D, +0x5F,0xFC,0xA5,0x09,0x4C,0x98,0xC0,0x98,0xE0,0x9B,0xC1,0xE4,0x00,0x00,0xDD,0x1F, +0x27,0x01,0xCC,0xE7,0x00,0x1C,0x43,0x07,0x24,0xCF,0x99,0x00,0x1C,0x13,0x78,0x06, +0x8A,0xF9,0x5C,0xF9,0x00,0x13,0xB8,0x07,0x8F,0x84,0x43,0x08,0xEB,0x09,0x63,0x00, +0x5F,0x18,0x00,0x11,0x9C,0x07,0x43,0x38,0xDC,0x4F,0x59,0x10,0x8F,0x45,0x0F,0x5A, +0x02,0xD5,0x9D,0x01,0xC6,0x9F,0x62,0x13,0x9C,0x06,0xD7,0x7C,0x01,0x7E,0x8F,0x1B, +0x4F,0x18,0x10,0x8F,0x05,0x0F,0x18,0x02,0xD7,0x1A,0x01,0x0C,0x9F,0x21,0x43,0x5A, +0x58,0x4F,0x39,0x10,0x8F,0x25,0x0F,0x39,0x02,0x43,0x18,0xCD,0xD7,0x58,0x00,0x68, +0x4E,0xFE,0xBC,0x44,0xC6,0xBD,0x5C,0xC6,0x00,0xD5,0x47,0xFC,0xB4,0x0D,0x81,0x06, +0x0D,0x61,0x0A,0x0D,0x41,0x0E,0x88,0x66,0x1C,0x21,0x10,0xE7,0xFF,0xE5,0xDB,0xFC, +0x21,0xFF,0x68,0xED,0x81,0x00,0x88,0xED,0xA1,0x00,0x84,0x0E,0xC1,0x60,0xED,0x21, +0x00,0x94,0xED,0x41,0x00,0x90,0xED,0x61,0x00,0x8C,0xED,0xC1,0x00,0x80,0x0D,0xE1, +0x7C,0x0E,0x01,0x78,0x0E,0x21,0x74,0x0E,0x41,0x70,0x0E,0x61,0x6C,0x0E,0x81,0x68, +0x0E,0xA1,0x64,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x7A,0x10,0x08,0xA6,0x01,0xC4,0xA5, +0xFE,0xFF,0x0C,0xA6,0x01,0x50,0xC0,0x31,0xC8,0xA7,0x24,0x34,0x0C,0xC5,0x01,0xC8, +0xA7,0x24,0x38,0x0C,0xC5,0x01,0xC8,0xA7,0x24,0x3C,0x0C,0xC5,0x01,0xC8,0xA7,0x24, +0x40,0x0C,0xC5,0x01,0xC8,0x87,0x24,0x14,0xFC,0xC0,0x03,0x03,0xC8,0xA7,0x26,0x24, +0xC8,0xE7,0x26,0x28,0x0C,0xC5,0x01,0xFE,0xC1,0x00,0x98,0xC0,0xA0,0x10,0x01,0x0C, +0x36,0x8C,0xF0,0xA5,0x0C,0x0C,0x89,0x83,0x0C,0xC7,0x01,0x9C,0xAE,0x1C,0xD6,0xC4, +0xC4,0xA5,0x01,0xF8,0x98,0xE0,0x40,0x21,0x2D,0x99,0xA0,0x8B,0x21,0x08,0xA4,0x01, +0x4C,0xA5,0x3E,0x54,0xA5,0x0F,0x18,0xA6,0x00,0x8D,0xA5,0x9C,0xE4,0x5D,0xAD,0x00, +0x9C,0xC1,0x5C,0xE2,0x09,0x23,0xFF,0xA1,0x10,0xF6,0xC5,0x11,0x76,0xC4,0x10,0xD6, +0xC6,0x42,0x27,0x5C,0x9B,0x0C,0x42,0x11,0x34,0x43,0x18,0x5D,0x13,0x76,0xC7,0x52, +0xE0,0x18,0x41,0xE0,0x5D,0x42,0xF7,0x3D,0x41,0xEF,0x3D,0x42,0xF7,0x5D,0x5D,0xEF, +0x00,0x5F,0x18,0x00,0x1C,0x8F,0x24,0x8F,0x70,0x40,0x84,0x35,0x5E,0xF7,0x00,0x88, +0xB9,0x5C,0x84,0x00,0x98,0xE0,0x9B,0x5F,0x8B,0x99,0xE4,0x00,0x00,0x75,0xD5,0x79, +0x01,0x05,0xD6,0x27,0x00,0x58,0x1B,0x05,0x00,0xE4,0x00,0x00,0x31,0xD6,0x07,0x00, +0x58,0x1A,0xE5,0x00,0xE4,0x00,0x00,0x1B,0x5F,0x67,0x15,0x4B,0x3A,0x20,0x1B,0x25, +0x00,0x9F,0x01,0x9E,0xE1,0x9C,0x81,0x9C,0xE1,0x9C,0xA1,0x5F,0x18,0x00,0x5E,0xF7, +0x00,0x5C,0x84,0x00,0x5F,0x27,0x00,0xD5,0xB9,0xFE,0x3D,0xC2,0x54,0x00,0x01,0x40, +0xCF,0x35,0xCA,0xB2,0x24,0x10,0xCC,0xAC,0x00,0x30,0xC0,0xE0,0x10,0x01,0x1C,0x96, +0xC4,0xFC,0xE7,0x08,0x78,0x8B,0x3C,0x5C,0xC6,0x00,0x8C,0xE5,0x99,0x40,0xEC,0x96, +0xFF,0x74,0x1E,0x96,0x95,0x1E,0x76,0xC5,0xCA,0x52,0x22,0x00,0xE4,0x00,0x03,0x2F, +0x18,0x85,0x00,0xEE,0xF6,0xFF,0x76,0x9C,0xA1,0xD4,0xB7,0xFF,0xBE,0x50,0xA0,0x5A, +0x5D,0x40,0x01,0x50,0x80,0x42,0x48,0x84,0x28,0x88,0xB4,0x12,0xE5,0xFF,0x13,0x05, +0x00,0x4F,0x18,0x40,0x47,0x18,0xBD,0x4E,0xE4,0x10,0x8E,0xF2,0x0F,0x17,0x01,0x9C, +0x81,0x9C,0xA2,0x5C,0x84,0x04,0xD4,0xB3,0xFF,0x2E,0x98,0xAC,0x21,0x40,0x14,0x98, +0xAE,0x0C,0xB5,0x01,0x99,0xC0,0x53,0x00,0x3F,0x52,0xE0,0x42,0x50,0xA0,0x5A,0x8B, +0xB9,0x98,0x60,0x88,0x8C,0x0C,0xB6,0x80,0xEC,0xD6,0xFF,0x6C,0xEC,0xF6,0xFF,0x78, +0x0E,0xF6,0x84,0x0F,0x16,0x88,0xEF,0xB6,0xFF,0x7C,0xE4,0x00,0x47,0x00,0xC0,0x80, +0x10,0x01,0xF0,0x64,0x04,0xE9,0xC0,0x80,0x10,0x01,0xEC,0xF6,0xFF,0x7A,0xEF,0xC4, +0x04,0xD2,0xEC,0xD6,0xFF,0x6E,0xEF,0xB6,0xFF,0x7E,0x8B,0x47,0x8B,0x86,0x8B,0x6F, +0x9B,0x20,0x98,0x81,0xEF,0xB6,0xFF,0x70,0x0C,0xB6,0x82,0x0E,0xF6,0x86,0x0F,0x16, +0x8A,0xE4,0x00,0x01,0x55,0x20,0x60,0xC4,0x89,0x1D,0xD5,0x7D,0x00,0xA5,0x43,0xBD, +0x5D,0x5D,0x1D,0x00,0xD6,0x39,0x00,0x54,0x5E,0x19,0x15,0x49,0x1C,0xD8,0x23,0xC0, +0x60,0x8D,0x1E,0x13,0xA8,0x00,0x23,0xA0,0x40,0x09,0x1A,0x00,0xCD,0x08,0x00,0xFF, +0x43,0xA8,0xE8,0x0F,0xBA,0x01,0x0B,0xBA,0x00,0x4D,0x1D,0xFA,0x45,0x28,0xEE,0x41, +0x09,0x45,0xC1,0x00,0x32,0x08,0x20,0x01,0x5D,0x50,0x80,0xCD,0x43,0xBD,0x20,0xEC, +0x96,0xFF,0x72,0x8C,0x99,0x11,0x04,0x00,0x1C,0x96,0xC8,0x8C,0x88,0x11,0x24,0xCC, +0x8F,0xA9,0x55,0x29,0x20,0x5F,0xBD,0x04,0x5C,0x9D,0x06,0x5C,0x83,0xF1,0x20,0x00, +0x35,0x21,0x20,0x72,0x1C,0x9D,0x0C,0xE4,0x00,0x00,0x15,0x21,0x20,0x24,0x1C,0x9D, +0xF4,0x5C,0x84,0x06,0x24,0x9C,0x26,0x98,0x80,0xE4,0x00,0x00,0x15,0x5C,0x87,0xF1, +0x48,0x84,0xC0,0x1F,0xB6,0xC8,0x8D,0x1D,0x18,0x88,0xCC,0x98,0x80,0x9F,0x61,0x9F, +0x81,0x9F,0x21,0x9F,0x42,0x5F,0x7B,0x00,0x5F,0x9C,0x00,0x5F,0xB9,0x00,0xD5,0xBD, +0xFA,0xBD,0x5D,0x40,0x01,0xEF,0xB6,0xFF,0x72,0x4B,0x57,0x28,0x8B,0x34,0x13,0x79, +0xFF,0x13,0x99,0x00,0x4F,0x9C,0x40,0x47,0x9C,0xDD,0x4F,0x7A,0x10,0x8F,0x72,0x0F, +0x9B,0x01,0x9F,0x41,0x9F,0x22,0x5F,0x5A,0x04,0xD7,0x33,0xFF,0x2E,0x20,0x84,0x30, +0x9D,0xC1,0x5D,0xCE,0x00,0xD1,0xC3,0xF6,0x66,0x9D,0x41,0x8B,0x3D,0x5D,0x4A,0x00, +0x21,0x48,0x34,0x1C,0xB6,0x94,0x50,0x80,0x10,0xE7,0xFF,0xFC,0xCF,0xC1,0x74,0x00, +0x01,0xC8,0xEB,0x24,0x10,0x88,0x6C,0x0D,0x47,0x01,0xE4,0x00,0xB3,0x24,0x98,0x61, +0x88,0x8C,0xE4,0x00,0x44,0x70,0x98,0x61,0xE4,0x00,0x6A,0xE4,0x21,0x80,0xBE,0xC0, +0xE0,0x10,0x01,0xC9,0x6B,0x23,0x08,0xFC,0xE7,0x08,0x18,0x08,0xCB,0x01,0x0C,0xC7, +0x01,0x08,0xCB,0x61,0x0C,0xC7,0x19,0xC0,0x94,0x00,0x01,0x9D,0x64,0x9C,0xE2,0xC8, +0x84,0x23,0x38,0xD5,0x64,0xFF,0x46,0xE4,0x00,0x00,0x5F,0x21,0x84,0xAE,0xC0,0xE0, +0x10,0x01,0xC9,0x6B,0x23,0x08,0xFC,0xE7,0x07,0xE8,0x08,0xCB,0x01,0x0C,0xC7,0x01, +0x08,0xCB,0x61,0x0C,0xC7,0x19,0xC0,0xB4,0x00,0x01,0x9D,0x64,0x9C,0xE2,0xC8,0xA5, +0x23,0x38,0xD5,0x65,0xFF,0x46,0x0C,0x36,0x8E,0x0E,0xC1,0x62,0x0E,0xA1,0x66,0x0E, +0x81,0x6A,0x0E,0x61,0x6E,0x0E,0x41,0x72,0x0E,0x21,0x76,0x0E,0x01,0x7A,0x0D,0xE1, +0x7E,0xED,0xC1,0x00,0x82,0xED,0xA1,0x00,0x86,0xED,0x81,0x00,0x8A,0xED,0x61,0x00, +0x8E,0xED,0x41,0x00,0x92,0xED,0x21,0x00,0x96,0xFC,0x21,0x00,0x98,0x85,0x29,0x1C, +0x21,0x90,0x0D,0x41,0x68,0x0D,0x61,0x64,0x0D,0xA1,0x5C,0x0D,0xC1,0x58,0x0D,0xE1, +0x54,0x0E,0x61,0x44,0x0E,0xA1,0x3C,0x0E,0xC1,0x38,0xC2,0x60,0x10,0x01,0xC2,0xA0, +0x10,0x01,0x0D,0x21,0x6C,0x0D,0x81,0x60,0x0E,0x01,0x50,0x0E,0x21,0x4C,0x0E,0x41, +0x48,0x0E,0x81,0x40,0x0C,0x61,0x08,0x0C,0x81,0x0C,0x0C,0xC1,0x10,0x0C,0xE1,0x14, +0xFD,0x73,0x08,0xD8,0xFE,0xB5,0x04,0xEA,0x99,0xE1,0x99,0x40,0x51,0xC0,0xFF,0x99, +0xA1,0xC2,0xC0,0x10,0x01,0xE4,0x00,0x06,0x9D,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10, +0x01,0xFC,0xC6,0x05,0x40,0xF0,0x87,0x0C,0x0C,0x0C,0x66,0x02,0x98,0xA1,0xE4,0x00, +0x62,0xEC,0xCC,0xEC,0x00,0x1C,0x8C,0xEB,0x08,0xC7,0x16,0x0C,0xC1,0x20,0x08,0xC7, +0x18,0x0C,0x01,0x24,0x0C,0x01,0x1C,0x0C,0x01,0x2C,0x0C,0xC1,0x18,0x0C,0xC7,0x0E, +0x0C,0xC1,0x28,0x0C,0xC7,0x0A,0x12,0x47,0x04,0x12,0x27,0x05,0x12,0x07,0x07,0x20, +0xC0,0x2A,0x4D,0x8D,0x64,0xE4,0x00,0x05,0xE7,0x20,0xC4,0xFE,0xF0,0xB3,0x08,0xD8, +0x88,0xEF,0xE4,0x00,0x00,0x5D,0xCC,0xC7,0x00,0x1C,0x1C,0x87,0x01,0x8C,0xCB,0x12, +0xE6,0x07,0x42,0xED,0xBD,0xD6,0x17,0x00,0xC6,0x0E,0xE6,0x0A,0x22,0xE4,0x46,0x12, +0xE6,0x05,0xD6,0xF2,0x00,0x59,0x10,0xC6,0x04,0xD6,0x26,0x19,0x85,0x5C,0xE4,0x00, +0xD4,0xA7,0xFE,0xB5,0xE4,0x00,0x00,0xA1,0x9A,0x20,0xD0,0xC2,0x0B,0x76,0xF0,0x93, +0x08,0xD8,0x88,0xCF,0xE4,0x00,0x00,0x71,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0xD8, +0xCC,0xA6,0x00,0x1C,0x1E,0xE6,0x01,0x8C,0xB8,0x13,0x05,0x07,0x43,0x0D,0xC5,0xD6, +0x18,0x00,0xD6,0x0F,0x05,0x0A,0x23,0x08,0x4E,0x10,0xA5,0x06,0x13,0x07,0x06,0xD7, +0x05,0x00,0x56,0x89,0xC6,0xE4,0x00,0x05,0xCD,0x5C,0xD7,0x00,0xD4,0x86,0xFE,0x65, +0xE4,0x00,0x02,0x15,0x40,0xCD,0x85,0xC0,0xE0,0x10,0x01,0x0C,0xC1,0x04,0xE9,0x07, +0x04,0x8D,0x5E,0x86,0x00,0x55,0x08,0x40,0x1C,0x61,0x36,0x4D,0x08,0x31,0x88,0x92, +0x88,0xB1,0x88,0xD4,0x98,0xE2,0xE7,0xFF,0xDF,0x80,0xD0,0x60,0x06,0x9A,0xC3,0x00, +0x10,0x01,0xE8,0xF8,0x04,0x8D,0x54,0xE7,0x80,0x20,0xE1,0x60,0xC0,0xC0,0x10,0x01, +0x1C,0x61,0x30,0xEE,0xE6,0x00,0xDE,0x08,0x81,0x36,0x88,0xB2,0x88,0xD1,0x88,0xF4, +0x86,0xE8,0xD0,0x60,0x05,0x5A,0x98,0x60,0xE7,0xFF,0xD4,0x0E,0x0C,0xE1,0x06,0x0F, +0x01,0x16,0xC0,0xC0,0x10,0x01,0x9C,0xE3,0x4C,0xE7,0x18,0x8C,0xF8,0x0C,0x87,0x0A, +0x08,0xE7,0x04,0x40,0x84,0x3D,0x5C,0x9F,0xF9,0x0C,0x61,0x32,0xEE,0xE6,0x00,0xE2, +0x48,0x84,0x00,0x88,0xB2,0x88,0xD1,0x88,0xF4,0x86,0xE8,0x98,0x61,0xE7,0xFF,0xD3, +0xA4,0x88,0xB2,0x88,0xD1,0x88,0xF4,0x1C,0x61,0x34,0x1C,0x81,0x2C,0xE7,0xFF,0xD6, +0x6A,0x20,0x61,0x70,0x08,0xE1,0x36,0x0C,0xE1,0x24,0x08,0xE1,0x34,0x0C,0xE1,0x1C, +0x0C,0xE1,0x0A,0x20,0xE0,0x78,0x0F,0x01,0x0E,0x23,0x00,0x60,0xC0,0xC0,0x10,0x01, +0x1C,0x61,0x24,0xEC,0xE6,0x00,0xDA,0x1C,0x81,0x1C,0x0C,0xA1,0x2E,0x88,0xD5,0x84, +0xE8,0x0C,0xC1,0x1E,0x5C,0xDF,0xF9,0xC8,0xE0,0x07,0xFF,0x48,0xC6,0x00,0xC0,0xC0, +0xFF,0xE8,0x48,0xC6,0x38,0xCC,0xC6,0x03,0xFF,0x9A,0x20,0x40,0xE6,0x38,0x40,0xCD, +0x85,0x4C,0xC6,0x50,0x8C,0xE6,0x0C,0xE1,0x1C,0xE4,0x00,0x00,0x5F,0x0C,0x01,0x24, +0x0C,0x01,0x1C,0x0C,0x01,0x2C,0xE4,0x00,0x02,0xD1,0x4C,0xED,0x64,0xCD,0x8C,0x00, +0x1C,0x45,0x4A,0x3D,0xC0,0xE0,0x10,0x01,0x5D,0x4A,0x00,0xFC,0xE7,0x08,0xD8,0x8D, +0x87,0x0C,0x0C,0x08,0xE4,0x00,0x02,0x95,0xE8,0xF6,0x04,0x8B,0x54,0xE7,0x02,0x20, +0xE0,0x40,0x0C,0x61,0x2A,0x0C,0x81,0x2E,0x0C,0xA1,0x12,0xE7,0xFF,0xF1,0xB6,0xEA, +0x56,0x04,0x8B,0x0C,0xA1,0x2A,0x56,0x52,0x01,0x22,0x40,0x88,0xCC,0xEC,0x00,0x1C, +0x8C,0xEB,0x08,0x61,0x18,0x0D,0x07,0x0A,0x08,0x81,0x1C,0x0C,0xC1,0x2E,0x98,0xE0, +0xE7,0xFF,0xE9,0x5A,0x20,0x60,0xFE,0xE4,0x00,0x01,0xC1,0xD0,0xA0,0x06,0xE0,0x0C, +0xE1,0x2E,0xD0,0xE0,0x06,0xA8,0x10,0xD5,0x34,0x40,0x86,0x3B,0xD4,0x85,0x06,0x58, +0x40,0xA6,0x2B,0xD4,0xA7,0x06,0x20,0x0C,0xE1,0x1E,0x0C,0xC1,0x1A,0x08,0xB5,0x33, +0x40,0xC6,0x3D,0x4C,0xA5,0x08,0x4C,0xE6,0xFA,0x44,0xC7,0x36,0x40,0xE6,0x3D,0xD4, +0xA7,0x05,0x40,0x0C,0x61,0x2A,0x0C,0x81,0x2E,0xCE,0x8C,0x00,0x1C,0x40,0xE4,0x1C, +0x8E,0x8B,0x0C,0xF4,0x0C,0x0C,0xC1,0x1E,0x0C,0xA1,0x1A,0x22,0x40,0xA8,0x88,0xF0, +0xE7,0xFF,0xE9,0xAC,0x0C,0x81,0x26,0x0C,0xE1,0x2A,0x0C,0xC1,0x2E,0x0C,0x74,0x19, +0x40,0xA6,0x3C,0x40,0xC6,0x23,0x0C,0x81,0x22,0x40,0xE7,0x23,0x8C,0xE6,0x40,0xE7, +0x28,0xE4,0x00,0x00,0x47,0x40,0xC4,0x33,0x40,0xA3,0x2B,0x8C,0xC5,0x40,0xC6,0x38, +0x0C,0xD4,0x19,0x0C,0xC1,0x26,0x40,0x84,0x33,0x0C,0xC1,0x22,0x40,0x63,0x33,0x8C, +0x83,0x40,0xE4,0x38,0x0C,0xF4,0x17,0xCD,0x8C,0x00,0x1C,0x8D,0x8B,0x0C,0xEC,0x0A, +0x20,0xE4,0x86,0x9B,0x02,0x0F,0x0C,0x08,0x22,0x21,0x58,0x4C,0xE7,0x74,0x45,0x4A, +0x3D,0xCC,0xEE,0x00,0x1C,0x5D,0x4A,0x00,0x8C,0xEB,0x0C,0x07,0x08,0xE4,0x00,0x00, +0x83,0x20,0xE8,0xF6,0xCC,0xEE,0x00,0x1C,0x8C,0xEB,0x0C,0x07,0x08,0x4C,0xED,0x74, +0x45,0x4A,0x3D,0xE4,0x00,0x00,0x51,0xCC,0xEC,0x00,0x1C,0x8C,0xEB,0x0C,0xC7,0x0A, +0x20,0xC8,0x7A,0x0C,0x07,0x08,0x4D,0x8D,0x64,0xCC,0xEE,0x00,0x1C,0x45,0x4A,0x65, +0x8C,0xEB,0x4D,0x8D,0x74,0x0C,0x07,0x08,0x45,0x4C,0x55,0x5D,0x4A,0x00,0x9D,0xE1, +0x5D,0xEF,0x00,0x1D,0x8F,0xFF,0xC2,0x00,0x10,0x01,0x5D,0x8C,0x00,0xF0,0xF3,0x08, +0xD8,0xD4,0xEC,0xE5,0x45,0x50,0x80,0x1E,0x98,0xA1,0xC0,0x60,0x10,0x01,0xFC,0x63, +0x0A,0x30,0xE4,0x00,0x5C,0x44,0x88,0x6A,0xE7,0xFF,0xD6,0xC0,0xF0,0xF0,0x08,0xD8, +0x0E,0xC1,0x3A,0x5C,0xE0,0x53,0x0E,0xA1,0x3E,0x48,0xE7,0x12,0x0E,0x81,0x42,0xF8, +0xF0,0x08,0xD8,0x0E,0x61,0x46,0x0E,0x41,0x4A,0x0E,0x21,0x4E,0x0E,0x01,0x52,0x0D, +0xE1,0x56,0x0D,0xC1,0x5A,0x0D,0xA1,0x5E,0x0D,0x81,0x62,0x0D,0x61,0x66,0x0D,0x41, +0x6A,0x0D,0x21,0x6E,0x1C,0x21,0x70,0x85,0x29,0x89,0xC7,0xCC,0xEE,0x00,0x1C,0x8C, +0xEB,0x0C,0xC7,0x0E,0x9A,0x21,0x0C,0xC1,0x2C,0x08,0xC7,0x16,0x08,0xE7,0x18,0x0C, +0xC1,0x24,0x0C,0xE1,0x1C,0xE7,0xFF,0xFC,0x67,0x1C,0x21,0xB8,0x0D,0x81,0x38,0x0D, +0xE1,0x2C,0x0E,0x41,0x20,0x0E,0xC1,0x10,0x0D,0x21,0x44,0x0D,0x41,0x40,0x0D,0x61, +0x3C,0x0D,0xA1,0x34,0x0D,0xC1,0x30,0x0E,0x01,0x28,0x0E,0x21,0x24,0x0E,0x61,0x1C, +0x0E,0x81,0x18,0x0E,0xA1,0x14,0x1E,0xC1,0x48,0x0C,0x36,0xC4,0x0C,0x96,0xBC,0x0C, +0xD6,0xC0,0xC0,0xE0,0x10,0x01,0x89,0xE3,0xF0,0xE7,0x0C,0x10,0x8A,0x45,0x4C,0xE7, +0x10,0x9C,0xEE,0xC4,0xE7,0x07,0xF8,0x40,0x21,0x3D,0x89,0x81,0x20,0xA8,0x2A,0x0A, +0x23,0x2E,0xE4,0x00,0x00,0x0F,0x0A,0x23,0x22,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10, +0x01,0xF0,0xA7,0x0C,0x10,0xFC,0xC6,0x09,0x4C,0x4C,0xA5,0x10,0x88,0xEC,0x8C,0xA6, +0xCA,0x00,0x20,0x00,0x8A,0xE5,0xE4,0x00,0x00,0x71,0x22,0x48,0x3E,0x0F,0x05,0x02, +0x0C,0x86,0x02,0x8C,0x98,0xE4,0x00,0x00,0x29,0x0C,0x96,0xBE,0x20,0x80,0x2A,0x0C, +0x86,0x02,0xE4,0x00,0x00,0x0F,0x0C,0x85,0x02,0x0C,0x87,0x00,0x9C,0xC4,0x0C,0x87, +0x02,0x9C,0xA4,0x5E,0x04,0x15,0x9C,0xE4,0x4A,0x10,0x20,0x5E,0x10,0x06,0xD4,0xD7, +0xFE,0x66,0x5E,0x1F,0xF9,0xC2,0x80,0x10,0x01,0xC1,0xC0,0x10,0x01,0x4A,0x10,0x00, +0xFE,0x94,0x0C,0x0C,0x99,0x40,0x9A,0x60,0x99,0x60,0xFD,0xAE,0x08,0xD8,0x9A,0xA2, +0xE4,0x00,0x06,0x15,0x22,0x48,0xCA,0xC0,0xA0,0x10,0x01,0xFC,0xA5,0x05,0x44,0xF0, +0x8E,0x08,0xD8,0x0C,0xC5,0x02,0x98,0xA0,0xE4,0x00,0x00,0x35,0x9C,0xA1,0x12,0xE6, +0x00,0x5C,0xA5,0x00,0xD6,0xEA,0x00,0x5D,0x12,0xE6,0x01,0xD5,0x57,0x12,0x21,0x1C, +0xC6,0x1C,0xD4,0x85,0xFF,0x55,0x21,0x41,0x66,0x0C,0xEC,0x02,0x08,0xCF,0x22,0xD4, +0xC7,0x11,0x84,0x0C,0xCC,0x06,0xD4,0xE6,0x00,0x7C,0xD4,0xE6,0x11,0x2E,0x0C,0xCC, +0x0A,0xD4,0xE6,0x10,0xF0,0x98,0x60,0x88,0x8C,0x88,0xB0,0x88,0xD1,0x08,0xEF,0x26, +0x09,0x0F,0x28,0xE7,0xFF,0xCA,0x14,0xD0,0x60,0x10,0x42,0xF0,0xEE,0x08,0xD8,0x8C, +0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x99,0x41,0x18,0x07,0x04,0xF0,0xEE,0x08,0xD8, +0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x18,0x07,0x06,0xE4,0x00,0x00,0xC5,0x21, +0x45,0xC6,0x0C,0xEC,0x06,0x08,0xCF,0x22,0xD4,0xC7,0x0E,0xBC,0x0C,0xCC,0x02,0xD4, +0xC7,0x0E,0x84,0x0C,0xCC,0x0A,0xD4,0xE6,0x00,0x7C,0xD4,0xE6,0x0E,0x2E,0x0C,0xCC, +0x0E,0xD4,0xE6,0x0D,0xF0,0x98,0x61,0x88,0x8C,0x88,0xB0,0x88,0xD1,0x08,0xEF,0x26, +0x09,0x0F,0x28,0xE7,0xFF,0xC9,0x54,0xD0,0x60,0x0D,0x42,0xF0,0xEE,0x08,0xD8,0x8C, +0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x98,0xC1,0x18,0x07,0x04,0x99,0x42,0xF0,0xEE, +0x08,0xD8,0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x18,0xC7,0x06,0xF0,0xEE,0x08, +0xD8,0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x1A,0xA7,0x05,0xE4,0x00,0x02,0xFF, +0x25,0x45,0xD1,0x1C,0xC7,0xFE,0xD4,0xCA,0x03,0x70,0x4C,0xEA,0x10,0x08,0xCF,0x22, +0x8C,0xEC,0x0C,0xE7,0x02,0xD4,0xC7,0x0A,0xD4,0x1C,0xCA,0xFF,0x4C,0xC6,0x10,0x8C, +0xCC,0x0C,0xC6,0x02,0xD4,0xE6,0x01,0x34,0xD4,0xE6,0x0A,0x3E,0x1C,0xAA,0xFE,0x4C, +0xA5,0x10,0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xE5,0x09,0xC0,0x1C,0x8A,0x01,0x4C,0x84, +0x10,0x8C,0x8C,0x0C,0x84,0x02,0xD4,0x85,0x09,0x48,0x1C,0xAA,0x01,0x4C,0xA5,0x10, +0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xE5,0x03,0x2C,0xD4,0xE5,0x08,0xB6,0x1C,0xAA,0x02, +0x4C,0xA5,0x10,0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xE5,0x08,0x38,0xD4,0xC5,0x08,0x18, +0xE4,0x00,0x00,0x95,0x1C,0x87,0xFE,0x08,0xAF,0x22,0x4C,0xCA,0x10,0xD5,0x44,0x03, +0xF6,0x8C,0xCC,0x0C,0xC6,0x02,0xD4,0xA6,0x07,0x4C,0x1C,0xA7,0xFF,0x4C,0xA5,0x10, +0x8C,0xAC,0x0C,0xA5,0x02,0xD4,0xA6,0x06,0xD4,0x1C,0xA7,0xFD,0x4C,0xA5,0x10,0x8C, +0xAC,0x0C,0xA5,0x02,0xD4,0xC5,0x00,0xB4,0xD4,0xC5,0x06,0x3E,0x9C,0xFC,0x4C,0xE7, +0x10,0x8C,0xEC,0x0C,0xE7,0x02,0xD4,0xC7,0x05,0xC8,0x88,0x6A,0x88,0x8C,0x88,0xB0, +0x88,0xD1,0x08,0xEF,0x26,0x09,0x0F,0x28,0xE7,0xFF,0xC7,0x4A,0xD0,0x60,0x05,0x1A, +0xF0,0xCE,0x08,0xD8,0x8C,0xCB,0xCC,0xC6,0x00,0x1C,0x8C,0xCD,0x1C,0xAA,0xFF,0x1C, +0xEA,0x01,0x18,0xA6,0x04,0xF0,0xCE,0x08,0xD8,0x8C,0xCB,0xCC,0xC6,0x00,0x1C,0x8C, +0xCD,0x19,0x46,0x06,0x5D,0x47,0x00,0xE4,0x00,0x00,0xCB,0x8C,0xCC,0x0C,0xE6,0x02, +0xD4,0xA7,0x03,0x7C,0x1C,0xCA,0xFF,0x4C,0xC6,0x10,0x8C,0xCC,0x0C,0xC6,0x02,0xD4, +0xE6,0x00,0xBC,0xD4,0xE6,0x02,0xE6,0x1C,0xCA,0xFE,0x4C,0xC6,0x10,0x8C,0xCC,0x0C, +0xC6,0x02,0xD4,0xE6,0x02,0x68,0x88,0x6A,0x88,0x8C,0x88,0xB0,0x88,0xD1,0x08,0xEF, +0x26,0x09,0x0F,0x28,0xE7,0xFF,0xC6,0x72,0x20,0x60,0xDC,0xF0,0xEE,0x08,0xD8,0x8C, +0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x1C,0xCA,0xFE,0x18,0xC7,0x04,0xF0,0xEE,0x08, +0xD8,0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x19,0x47,0x06,0xF0,0xEE,0x08,0xD8, +0x8C,0xEB,0xCC,0xE7,0x00,0x1C,0x8C,0xED,0x19,0x47,0x05,0xE4,0x00,0x00,0x21,0x9D, +0x41,0x5D,0x4A,0x00,0x10,0xF4,0x04,0xD4,0xEA,0xEC,0x6D,0x10,0xF4,0x04,0xD4,0xEA, +0x04,0x61,0xF0,0xEE,0x08,0xD8,0x8C,0xEB,0xCC,0xC7,0x00,0x1C,0x8C,0xCD,0x10,0xC6, +0x05,0xD5,0x46,0x00,0x55,0x1D,0x46,0x01,0x5D,0x4A,0x00,0xCC,0xE7,0x00,0x1C,0x8C, +0xED,0x0C,0x96,0xBE,0x18,0x87,0x07,0xF0,0xEE,0x08,0xD8,0x8C,0xEB,0xCC,0xE7,0x00, +0x1C,0x8C,0xED,0x0E,0x47,0x08,0x9D,0x61,0x5D,0x6B,0x00,0x8A,0x6B,0x22,0x49,0x36, +0xF0,0xEE,0x08,0xD8,0x8C,0xEB,0x1C,0x87,0xFF,0xCC,0xE7,0x00,0x1C,0x50,0xA0,0x1C, +0x40,0x67,0x6C,0xCC,0x84,0x00,0x1C,0x9C,0x64,0x8C,0x8D,0x9C,0x84,0xE7,0xFF,0xCF, +0xE6,0x1C,0xCB,0x01,0xF0,0xEE,0x08,0xD8,0x98,0xA1,0x8C,0xEB,0x5D,0x66,0x00,0x1C, +0xC7,0xFF,0x4E,0x6B,0x09,0xCC,0xC6,0x00,0x1C,0xCC,0xE7,0x00,0x1C,0x8C,0xCD,0x8C, +0xED,0x10,0xC6,0x07,0x40,0xC5,0x35,0x18,0xC7,0x07,0x10,0xF4,0x04,0xD4,0xEA,0x00, +0x71,0x0C,0xB6,0xC2,0x40,0xF3,0x2C,0xD0,0xE1,0xFA,0xE8,0xC0,0xE0,0x10,0x01,0xF0, +0xC7,0x08,0xD8,0x8D,0x66,0x88,0x73,0xF9,0x67,0x08,0xD8,0x0C,0x36,0xC6,0x0E,0xC1, +0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26, +0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D, +0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85,0x29,0x1C,0x21,0xE0, +0x0D,0x21,0x1C,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D, +0xC1,0x08,0x0E,0xC1,0x04,0xC1,0x80,0x10,0x01,0xF8,0x0C,0x08,0xD8,0xFC,0xEC,0x08, +0xD8,0x98,0xDF,0x89,0x63,0x18,0xC7,0x5B,0x18,0xC7,0x06,0x18,0xC7,0x07,0x18,0xC7, +0x22,0x18,0xC7,0x23,0x18,0xC7,0x3E,0x18,0xC7,0x3F,0x18,0xC7,0x5A,0x0C,0x07,0x08, +0x0C,0x07,0x24,0x0C,0x07,0x40,0x0C,0x07,0x5C,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0C, +0x0C,0x10,0x67,0x04,0x10,0xE7,0x01,0x40,0x67,0x1B,0x9C,0xEE,0xC4,0xE7,0x01,0xF8, +0x1E,0xC1,0x20,0x89,0xC4,0x5C,0x63,0x00,0x89,0xA1,0x40,0x21,0x3D,0xE4,0x00,0x82, +0x88,0x98,0x80,0x98,0xA1,0x98,0xC0,0x18,0x01,0x00,0x88,0x6B,0xE7,0xFF,0xF6,0x9A, +0x98,0x81,0x18,0x61,0x00,0x18,0x01,0x01,0x88,0x6B,0x98,0xA1,0x98,0xC0,0xE7,0xFF, +0xF6,0x76,0x18,0x61,0x01,0xC0,0xE0,0x10,0x01,0x89,0x41,0xE8,0xE7,0x04,0x8B,0x54, +0xE7,0x04,0x20,0xE0,0x40,0xF0,0xEC,0x08,0xD8,0x24,0xE4,0x25,0x88,0x6E,0xE7,0xFF, +0xE4,0xFC,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x0C,0x0D,0x24,0xE4,0xC9,0x10,0xEA,0x00, +0x24,0xE4,0xB3,0x10,0xCA,0x01,0x24,0xC4,0x9B,0x5C,0xE6,0x1F,0x88,0x6B,0x48,0xC7, +0x30,0x98,0x80,0x5C,0xC6,0x00,0x98,0xA2,0xE7,0xFF,0xF5,0xE2,0x10,0xEA,0x00,0x8C, +0xE3,0x18,0xEA,0x00,0x10,0xEA,0x01,0x8C,0x67,0x18,0x6A,0x01,0x88,0x2D,0x0E,0xC1, +0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A, +0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0xC0,0xE0,0x10,0x01,0xF8,0x67,0x00,0xE4, +0x85,0x29,0x0B,0xC5,0x12,0x08,0xC5,0x00,0x0A,0xE5,0x02,0x0B,0x05,0x04,0x0B,0x25, +0x06,0x0B,0x45,0x08,0x0B,0x65,0x0A,0x0B,0x85,0x0C,0x0B,0xA5,0x0E,0x88,0xE3,0x08, +0xA5,0x10,0x20,0x84,0x34,0x8B,0x5E,0x8B,0x25,0x8B,0x1D,0x8A,0xFC,0x88,0xDB,0xC0, +0xA0,0x10,0x01,0x9B,0x62,0xE8,0x85,0x0C,0x17,0x40,0xB9,0x23,0x40,0xA5,0xD8,0x40, +0xA0,0x2D,0xFC,0xA5,0x03,0xFF,0xD4,0xE5,0x00,0xC8,0x43,0x3A,0x23,0x5C,0x66,0x04, +0x43,0x79,0xD8,0xFF,0x7B,0x03,0xFF,0xD7,0x67,0x03,0xCC,0xD4,0xE5,0x00,0xBC,0x24, +0xFC,0x4C,0x40,0xC6,0x3B,0x40,0xE5,0x3D,0x43,0x07,0xC3,0x40,0x78,0x34,0xE4,0x00, +0x00,0x73,0x98,0xA2,0x43,0x5A,0x23,0x43,0x5A,0x28,0xFC,0xBA,0x03,0xFF,0xD4,0xA7, +0x01,0x9C,0xC0,0xE0,0xFF,0xEC,0x20,0x00,0xAD,0x43,0x40,0xD5,0xFC,0xBA,0x04,0x00, +0xFF,0x5A,0xFC,0x01,0x40,0x7A,0x3C,0x42,0xE3,0xBB,0xC8,0x60,0x07,0xFF,0x40,0xE3, +0x3D,0x40,0xC6,0x3B,0x40,0x77,0x34,0x40,0x63,0x28,0x5C,0x63,0x04,0xE4,0x00,0x00, +0x47,0x24,0xFC,0x3E,0x8C,0xE4,0x43,0x18,0x3B,0x40,0x98,0x20,0xE4,0x00,0x00,0x23, +0xFF,0x84,0x07,0xFF,0x40,0xFC,0x3D,0x42,0xF7,0x3B,0x40,0x97,0x20,0x5C,0x64,0x04, +0x85,0x29,0x9C,0x38,0xC0,0xE0,0x10,0x01,0x0C,0x01,0x04,0xFC,0xE7,0x0C,0x0C,0x10, +0xC7,0x14,0x08,0xA7,0x0B,0xC0,0xE0,0x10,0x01,0x5C,0x85,0x06,0xE8,0xE7,0x07,0x24, +0x40,0xE4,0x3B,0x40,0xE7,0x30,0xD4,0x67,0x00,0x4C,0x98,0xE1,0x0C,0xE1,0x04,0x0C, +0xE1,0x06,0x20,0xE0,0x82,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x26,0x40,0xE5,0x3B, +0x40,0xE7,0x30,0xD4,0xE3,0x00,0x78,0x98,0xE1,0x0C,0xE1,0x04,0x98,0xE0,0xE4,0x00, +0x00,0x0D,0x98,0xFF,0x0C,0x81,0x06,0x20,0x81,0x32,0xC0,0xE0,0x10,0x01,0xC0,0x80, +0x10,0x01,0xF3,0x07,0x0C,0x10,0xFC,0x84,0x07,0x26,0x9A,0xE0,0x98,0xE1,0xE4,0x00, +0x00,0x5F,0x0B,0x44,0x00,0x1F,0x27,0x01,0x43,0x45,0xD3,0x43,0x5A,0x30,0xD7,0x43, +0x00,0xD4,0x0B,0x44,0x02,0x43,0x5A,0x2B,0x43,0x5A,0x30,0xD7,0x43,0x00,0x68,0x98, +0x81,0x0C,0x81,0x04,0xE4,0x00,0x00,0x1F,0x5C,0xF9,0x02,0x9C,0x82,0x9E,0xE1,0xD6, +0xF8,0xFE,0x98,0x0C,0x81,0x06,0x20,0x80,0xBE,0xC0,0x80,0x10,0x01,0xC2,0xE0,0x10, +0x01,0xF0,0x84,0x0C,0x10,0xFE,0xF7,0x07,0x24,0x9C,0x81,0x4F,0x04,0x08,0x8E,0xF8, +0x0A,0xF7,0x00,0x40,0xB7,0x2B,0x40,0xC5,0x30,0xD4,0xC3,0x00,0x64,0x98,0xC1,0x5C, +0xE4,0x02,0x0C,0xC1,0x04,0x88,0x67,0x9C,0x28,0x85,0x29,0x24,0xC0,0xB8,0xC2,0xE0, +0x10,0x01,0xF3,0x17,0x0C,0x10,0xD4,0xD8,0x01,0x1C,0x1E,0xE6,0xFF,0x43,0x07,0xC3, +0x8F,0x17,0xC2,0xE0,0x10,0x01,0x4F,0x38,0x10,0xFE,0xF7,0x0B,0x14,0x8F,0x37,0x0B, +0x59,0x00,0x0B,0x39,0x02,0xE4,0x00,0x00,0x11,0x9B,0x40,0x9B,0x20,0xC2,0xE0,0x10, +0x01,0xF2,0xF7,0x0C,0x10,0xD6,0xE6,0x01,0x20,0xD0,0xDF,0x04,0x60,0x40,0xE7,0xBB, +0xC3,0x00,0x10,0x01,0x8C,0xE6,0xFF,0x18,0x0B,0x14,0x4F,0x67,0x10,0x8F,0x78,0x0B, +0xDB,0x00,0x0B,0xBB,0x02,0xE4,0x00,0x00,0x17,0x24,0xDD,0xB0,0x9B,0xC0,0x9B,0xA0, +0xD4,0xD7,0x03,0x2C,0x5C,0xC6,0x00,0xC0,0xE0,0x10,0x01,0x1E,0xE6,0x01,0xFC,0xE7, +0x07,0x24,0x4C,0xC6,0x08,0x4E,0xF7,0x08,0x8E,0xE7,0x8C,0xE6,0x0B,0x77,0x00,0x0B, +0x87,0x00,0xC0,0xC0,0x10,0x01,0x43,0x1B,0xE5,0xFC,0xC6,0x0C,0x0C,0x10,0xE6,0x14, +0x08,0xC6,0x0B,0x43,0x18,0x33,0x43,0x9C,0x33,0x43,0x18,0x38,0x43,0x9C,0x38,0x40, +0xDB,0x33,0x43,0x83,0xE5,0x40,0xE6,0x38,0x42,0xFE,0xE3,0x40,0x67,0x1D,0x43,0x9D, +0xE3,0x43,0x5A,0x1B,0x40,0x79,0x1B,0x8E,0xFA,0x8C,0x7C,0x42,0xF7,0xC0,0x40,0x63, +0xC0,0xE4,0x00,0x00,0x11,0x9A,0xE0,0x98,0x60,0x0C,0x64,0x01,0x0E,0xE5,0x01,0x85, +0x29,0x1C,0x21,0xD8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14, +0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x89,0x64,0x0D,0x21,0x24,0x5D,0x43, +0x04,0x0C,0xC1,0x04,0x0C,0xE1,0x00,0x89,0x85,0x89,0xC8,0x0D,0xA1,0x2A,0xC2,0x00, +0x10,0x01,0x99,0xE2,0xFE,0x10,0x0C,0x0C,0x08,0x70,0x0B,0x40,0x6B,0x1B,0x40,0x63, +0x78,0x40,0x6A,0x1D,0x5C,0x63,0x06,0xE7,0xFF,0xFC,0x16,0x0C,0x81,0x06,0x88,0xC3, +0x0C,0xE1,0x02,0x24,0x7C,0x36,0x0C,0x04,0x01,0x0C,0x07,0x01,0xE4,0x00,0x00,0x37, +0x08,0xB0,0x0B,0x40,0xAB,0x2B,0x41,0xE5,0x78,0x88,0xA7,0x41,0xEA,0x7D,0x88,0xEC, +0x5C,0x6F,0x06,0xE7,0xFF,0xFD,0x70,0xC1,0xE0,0x10,0x01,0xFD,0xEF,0x0C,0x0C,0x08, +0x6F,0x0B,0x40,0x6B,0x1B,0x4C,0x63,0x0A,0x8C,0x6A,0x5C,0x63,0x06,0xE7,0xFF,0xFB, +0x8A,0x10,0xEF,0x04,0x88,0xC3,0xD4,0x67,0x01,0x38,0x0C,0x0E,0x01,0x0C,0x0D,0x01, +0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D, +0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x08,0xEF,0x0B, +0x41,0x6B,0x3B,0x4D,0x6B,0x0A,0x8D,0x4B,0x88,0x8E,0x88,0xAD,0x5C,0x6A,0x06,0x88, +0xEC,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A, +0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21,0x28,0xE7,0xFF,0xFC,0x7F, +0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF0,0xA7,0x0C,0x10,0xF3,0x06,0x08,0xD8, +0x1F,0x25,0xFD,0xC0,0xE0,0x10,0x01,0x9C,0xBF,0xFC,0xE7,0x08,0xDD,0xCF,0x18,0x00, +0x1C,0x5E,0xE5,0x00,0x8F,0x07,0x98,0x82,0xE4,0x00,0x00,0x61,0x10,0xC7,0x01,0xD4, +0xC5,0x00,0x76,0x1A,0xE7,0x00,0x1B,0x27,0xFF,0xE4,0x00,0x00,0x39,0x20,0xC0,0x36, +0x18,0x87,0x00,0x18,0x07,0xFF,0xE4,0x00,0x00,0x1F,0x1F,0x46,0xFF,0x9C,0xC1,0x1B, +0x47,0xFF,0x18,0xC7,0x00,0x1C,0xE7,0x1C,0xD4,0xF8,0xFE,0xA6,0x85,0x29,0xFC,0x21, +0xFF,0x80,0xCA,0xE0,0x01,0x00,0x0D,0x41,0x78,0x0D,0x61,0x74,0x0D,0x81,0x70,0x0D, +0xA1,0x6C,0x0D,0xE1,0x64,0x0E,0x01,0x60,0x0E,0x21,0x5C,0x0E,0x41,0x58,0x0E,0x81, +0x50,0x0E,0xA1,0x4C,0x0E,0xC1,0x48,0xCD,0x84,0x0A,0x00,0x0D,0x21,0x7C,0x0D,0xC1, +0x68,0x0E,0x61,0x54,0xCD,0x63,0x00,0x0A,0xC2,0xC0,0x10,0x01,0x41,0x6B,0x23,0xC2, +0xA0,0x10,0x01,0xC0,0x80,0x10,0x01,0xC2,0x00,0x10,0x01,0xFC,0x84,0x0C,0x0C,0xC2, +0x80,0x10,0x01,0x11,0xC4,0x04,0x41,0x8C,0x18,0x41,0xA7,0x73,0x41,0x6B,0xB8,0x5D, +0xED,0x00,0x89,0x44,0x8C,0xCF,0x9D,0xDF,0x8D,0xE5,0x5C,0xC6,0x00,0x5D,0xEF,0x00, +0xFE,0xD6,0x04,0x90,0xFE,0xB5,0x07,0x24,0xFE,0x10,0x0B,0x14,0xFE,0x94,0x09,0x4C, +0x1E,0x41,0x08,0xCA,0x20,0x03,0xE8,0xE4,0x00,0x01,0x45,0x0C,0xC1,0x04,0xE7,0xFF, +0xC4,0x04,0x08,0xAA,0x0B,0x10,0xEA,0x14,0x42,0x6F,0x6D,0x1C,0x93,0x01,0x4C,0x84, +0x08,0x8C,0x95,0x08,0x64,0x00,0x98,0x82,0x40,0x63,0x2B,0x88,0xB2,0x40,0x63,0x38, +0x5C,0x63,0x06,0xE7,0xFF,0xF6,0xFE,0x4C,0xEF,0x10,0x40,0xA3,0x5B,0x9C,0xE2,0x0C, +0xC1,0x06,0x8C,0xF0,0xD5,0xED,0x00,0x46,0xD6,0x6E,0x01,0x22,0x08,0x87,0x01,0x40, +0xA5,0x88,0x40,0xA4,0x2D,0x0C,0xA7,0x01,0x40,0x63,0x63,0x4C,0xEF,0x10,0x40,0x63, +0x88,0x8C,0xF0,0x08,0xA7,0x01,0x40,0x65,0x1D,0x0C,0x67,0x01,0x4C,0xEF,0x08,0x1C, +0x8F,0x01,0x4E,0xE7,0x08,0x1C,0xA7,0x01,0x8E,0xF0,0x4F,0x05,0x08,0x8F,0x10,0x0B, +0x38,0x00,0x27,0x3C,0x1A,0x0C,0x18,0x01,0x4C,0xE7,0x08,0x8C,0xF0,0x08,0xA7,0x00, +0x24,0xBC,0x1A,0x0C,0x07,0x01,0x08,0xF7,0x00,0x08,0xB8,0x00,0x8C,0xA7,0x4C,0xEF, +0x10,0x5D,0xE4,0x00,0x8C,0xF4,0x0C,0xA7,0x00,0x88,0x96,0x50,0xA0,0x3C,0x88,0x72, +0xD5,0xE6,0xFA,0xD8,0x0E,0xC1,0x4A,0x0E,0xA1,0x4E,0x0E,0x81,0x52,0x0E,0x61,0x56, +0x0E,0x41,0x5A,0x0E,0x21,0x5E,0x0E,0x01,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D, +0xA1,0x6E,0x0D,0x81,0x72,0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21, +0x00,0x80,0x85,0x29,0xFC,0x21,0xFF,0x70,0xED,0x41,0x00,0x88,0xED,0x61,0x00,0x84, +0xED,0x81,0x00,0x80,0x0D,0xA1,0x7C,0x0D,0xC1,0x78,0x0D,0xE1,0x74,0x0E,0x01,0x70, +0x0E,0x21,0x6C,0x0E,0x41,0x68,0x0E,0x61,0x64,0xC1,0x80,0x10,0x01,0xED,0x21,0x00, +0x8C,0x0E,0x81,0x60,0x0E,0xA1,0x5C,0x0E,0xC1,0x58,0x8A,0x03,0x8A,0x24,0x89,0x65, +0x0C,0xC1,0x2C,0x99,0x40,0xFE,0x6C,0x08,0xD8,0x1E,0x41,0x48,0x1D,0xE1,0x38,0x1D, +0xC1,0x40,0x1D,0xA1,0x30,0xE4,0x00,0x00,0x97,0xCC,0xEA,0x00,0x1C,0x8C,0xF3,0x10, +0xC7,0x07,0x0A,0xE7,0x17,0x43,0x30,0x34,0x0C,0x81,0x2E,0x13,0x19,0x00,0x88,0xA6, +0x1F,0x58,0x01,0x1B,0x59,0x00,0x08,0x67,0x16,0x4C,0xE6,0x08,0x1C,0xC1,0x58,0x8C, +0xF8,0x4C,0xE7,0x08,0x8C,0xC7,0x0E,0xE6,0xF9,0x40,0xCD,0x3C,0x41,0x0E,0x3C,0x0C, +0xC1,0x00,0x9D,0x41,0x40,0xD2,0x3C,0x5D,0x4A,0x00,0x8C,0xEF,0xE7,0xFF,0xF9,0x6A, +0xF0,0xEC,0x08,0xD8,0xD4,0xEA,0xFD,0xAD,0xC0,0xE0,0x10,0x01,0x88,0xD1,0xF2,0xC7, +0x00,0xE4,0x98,0xA1,0x98,0xE0,0xE4,0x00,0x00,0x29,0x40,0x90,0x3C,0x10,0x84,0x00, +0x24,0x84,0x19,0x0C,0xA6,0x00,0x9C,0xE1,0x9C,0xC4,0x5C,0x87,0x00,0xD6,0xC4,0xFF, +0x6D,0xC3,0xC0,0x10,0x01,0xC2,0xA0,0x10,0x01,0xFF,0xDE,0x08,0xD8,0xFE,0xB5,0x0C, +0x0C,0x1D,0xE1,0x50,0x99,0x40,0x99,0x80,0x1E,0x81,0x38,0x1E,0x61,0x48,0x1E,0xE1, +0x30,0x1F,0x01,0x40,0x9B,0x24,0x53,0x40,0xC8,0xCB,0x60,0x03,0x20,0xE4,0x00,0x04, +0x3F,0x40,0xF1,0x54,0x0C,0xE7,0x02,0xD0,0xE0,0x04,0xEA,0x08,0x8F,0x00,0x0B,0x8F, +0x02,0x40,0xC4,0xE5,0x5C,0xC6,0x06,0x4C,0xA6,0xFA,0x08,0xF5,0x0B,0x44,0xC5,0x36, +0xCF,0xA7,0x00,0x05,0x40,0xC6,0x2D,0x50,0xA0,0x64,0x5C,0xC6,0x06,0xD4,0xDD,0x00, +0xEC,0x4F,0xA7,0x10,0x98,0xA0,0xD7,0xA6,0x00,0xA4,0xCC,0xA7,0xFF,0xFC,0x8C,0xA6, +0xCC,0xA5,0x00,0x64,0x40,0xA5,0x38,0x5C,0xA5,0x00,0x5F,0x84,0x1D,0x1F,0x81,0x58, +0x4C,0xEC,0x08,0x48,0xC1,0x01,0x8C,0xC7,0x4C,0xC6,0x08,0x8C,0xDC,0x4B,0x80,0x0A, +0x8C,0xFC,0x1F,0x81,0x58,0x4C,0xE7,0x08,0x8C,0xFC,0x09,0x07,0xD8,0x08,0x67,0xE8, +0x8C,0x68,0x09,0x06,0xF0,0x0B,0xA6,0xE8,0x8C,0x68,0x09,0x06,0xE0,0x08,0xC6,0xD8, +0x40,0x9A,0x2D,0x0B,0x87,0xE0,0x8F,0xA6,0x8C,0x68,0x08,0xC7,0xF0,0x40,0xA3,0x2B, +0x40,0xFD,0x34,0x8C,0xFC,0x40,0xE7,0x23,0x8C,0xA7,0x40,0xA5,0xD8,0x0C,0xAB,0x00, +0xE4,0x00,0x02,0xE9,0x40,0xF0,0x64,0x10,0xE7,0x00,0x20,0xE0,0x52,0x98,0x81,0x4F, +0x8C,0x08,0x42,0x44,0x75,0x99,0xA0,0x43,0xB0,0x94,0xE4,0x00,0x00,0xFF,0x40,0xF4, +0x54,0x08,0xC7,0x00,0x40,0xF3,0x54,0x08,0xE7,0x00,0x8C,0xE6,0x40,0xD7,0x54,0x08, +0xC6,0x00,0x8C,0xE6,0x40,0xD8,0x54,0x08,0xC6,0x00,0xE4,0x00,0x02,0x57,0xCC,0xCD, +0x00,0x1C,0x8C,0xDE,0x40,0xED,0xE4,0x08,0x66,0x16,0x4C,0xE7,0x08,0x40,0xD7,0x3C, +0x41,0x18,0x3C,0x0C,0xC1,0x00,0x0E,0xE1,0x28,0x40,0xD3,0x3C,0x0F,0x01,0x24,0x0F, +0x21,0x20,0x0F,0x41,0x18,0x0F,0x61,0x14,0x0F,0x81,0x10,0x0F,0xA1,0x0C,0x0F,0xC1, +0x1C,0x0C,0x81,0x2E,0x88,0xAE,0x8C,0xF4,0xE7,0xFF,0xF6,0x72,0x9D,0xA1,0x0F,0xC1, +0x1E,0x5D,0xAD,0x00,0x0F,0xA1,0x0E,0x0F,0x81,0x12,0x0F,0x61,0x16,0x0F,0x41,0x1A, +0x0F,0x21,0x22,0x0F,0x01,0x26,0x0E,0xE1,0x2A,0x10,0xFD,0x00,0xD4,0xED,0xFD,0x15, +0x4C,0xD2,0x10,0x40,0xB1,0x34,0x0C,0xA5,0x02,0xD0,0xA0,0x05,0x0A,0x1C,0xE1,0x58, +0x8C,0xC7,0x08,0x86,0xF8,0x0B,0x86,0xFA,0x40,0xA4,0xE5,0x5C,0xA5,0x06,0x4C,0xC5, +0xFA,0x08,0xF5,0x0B,0x44,0xA6,0x2E,0xCF,0xA7,0x00,0x05,0x40,0xA5,0x35,0x50,0xC0, +0x64,0x5C,0xA5,0x06,0xD4,0xBD,0x00,0xEC,0x4F,0xA7,0x10,0x98,0xC0,0xD7,0xA5,0x00, +0xA4,0xCC,0xC7,0xFF,0xFC,0x8C,0xC5,0xCC,0xC6,0x00,0x64,0x40,0xC6,0x38,0x5C,0xC6, +0x00,0x5F,0x84,0x1D,0x48,0x80,0x0A,0x4D,0xCE,0x08,0x1F,0x81,0x58,0x48,0xE1,0x01, +0x8C,0xEE,0x8D,0xC4,0x1C,0x81,0x58,0x4D,0xCE,0x08,0x8D,0xC4,0x08,0x6E,0xD8,0x4C, +0xE7,0x08,0x0B,0xAE,0xE8,0x8C,0xFC,0x8F,0xA3,0x0B,0x87,0xE8,0x08,0x67,0xF0,0x40, +0xBA,0x35,0x8F,0xA3,0x08,0x8E,0xE0,0x08,0x67,0xE0,0x08,0xE7,0xD8,0x8F,0xA3,0x8C, +0xFC,0x40,0xDD,0x33,0x0B,0x8E,0xF0,0x8C,0xFC,0x8C,0xE4,0x40,0xE7,0x2B,0x8C,0xC7, +0x40,0xC6,0xD8,0x0C,0xCB,0x00,0xE4,0x00,0x00,0x5D,0x20,0xE0,0x9C,0x1C,0xE1,0x58, +0x4D,0xCE,0x10,0x8D,0xC7,0x08,0xAE,0xE0,0x08,0xEE,0xF0,0x08,0xCE,0xE8,0x8C,0xE5, +0x08,0xAE,0xD8,0x8C,0xE5,0x8C,0xE6,0x40,0xE7,0xC8,0x0C,0xEB,0x00,0xE4,0x00,0x00, +0x0F,0x0C,0x0B,0x00,0x9D,0x81,0x9D,0x64,0x9D,0x44,0x9D,0xE4,0x5D,0xCC,0x00,0xD6, +0xCE,0xEF,0x15,0x0E,0xC1,0x5A,0x0E,0xA1,0x5E,0x0E,0x81,0x62,0x0E,0x61,0x66,0x0E, +0x41,0x6A,0x0E,0x21,0x6E,0x0E,0x01,0x72,0x0D,0xE1,0x76,0x0D,0xC1,0x7A,0x0D,0xA1, +0x7E,0xED,0x81,0x00,0x82,0xED,0x61,0x00,0x86,0xED,0x41,0x00,0x8A,0xED,0x21,0x00, +0x8E,0xFC,0x21,0x00,0x90,0x85,0x29,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF2, +0xE7,0x0C,0x10,0xF3,0xA6,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xCF,0xBD,0x00,0x1C,0xFC, +0xE7,0x08,0xDE,0xC0,0xA0,0x10,0x01,0x8F,0xA7,0xFC,0xA5,0x09,0x4C,0x8B,0x45,0xE4, +0x00,0x01,0x37,0x1C,0x87,0x02,0x10,0xC7,0xFE,0x13,0xC7,0xFF,0x13,0x27,0x01,0x13, +0x07,0x00,0x0F,0x64,0x02,0x23,0x64,0x5E,0x40,0x97,0xCB,0x8C,0x98,0x4C,0x84,0x10, +0x8C,0x85,0x0C,0x84,0x02,0x43,0x97,0xCB,0xE4,0x00,0x00,0xD1,0x40,0x97,0xC4,0x4C, +0x84,0x10,0x8C,0x85,0x0F,0x84,0x02,0x4C,0x98,0x10,0x8C,0x85,0x0C,0x84,0x02,0x8C, +0x9C,0xE7,0xFF,0xFF,0xC9,0x23,0x64,0x5A,0x43,0x26,0xE4,0x4F,0x39,0x10,0x8F,0x25, +0x0F,0x39,0x02,0xD7,0x24,0x01,0xA0,0xE4,0x00,0x00,0x55,0x4F,0x26,0x10,0x40,0x66, +0xBC,0x8F,0x3A,0x4C,0x63,0x10,0x0F,0x39,0x02,0x8C,0x7A,0x0C,0x63,0x02,0x8C,0x79, +0xD4,0x64,0x00,0xB8,0x40,0x86,0xE4,0x4C,0x84,0x10,0x8C,0x9A,0x0C,0x84,0x02,0x8F, +0x24,0x8B,0x06,0xE4,0x00,0x00,0x0D,0x8B,0x24,0x9C,0xC1,0x88,0x99,0x5C,0xC6,0x00, +0xD4,0xDE,0xFD,0xA8,0x1B,0x07,0x00,0x1C,0xE7,0x1C,0xD4,0xFD,0xFB,0x4E,0xE7,0xFF, +0xF4,0x45,0xC0,0xE0,0x10,0x01,0xF3,0xC7,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xF3,0x07, +0x0C,0x10,0xC0,0xE0,0x10,0x01,0xC0,0x80,0x10,0x01,0xEB,0xA7,0x05,0x0E,0xFC,0x84, +0x09,0x4C,0xC0,0xE0,0x10,0x01,0x1F,0x98,0xFE,0xFC,0xE7,0x08,0xE0,0x98,0xA0,0x98, +0x60,0x9B,0x61,0xE4,0x00,0x00,0xD3,0x0C,0xC7,0x02,0x20,0xC1,0x74,0x10,0xC7,0xFE, +0x12,0xE7,0xFF,0x42,0xF8,0xBB,0x43,0x37,0x34,0x4F,0x39,0x10,0x8F,0x24,0x0F,0x39, +0x02,0xC3,0x20,0x7C,0xEC,0x20,0x01,0x09,0x24,0xC4,0xFD,0xD7,0x86,0x01,0xE0,0x1F, +0x46,0xFF,0x9C,0xC1,0x5C,0xC6,0x00,0x5F,0x5A,0x00,0x8F,0x57,0x8E,0xE6,0x4F,0x5A, +0x10,0x4E,0xF7,0x10,0x8F,0x44,0x8E,0xE4,0x0F,0x5A,0x02,0x0C,0xD7,0x02,0x5C,0xDA, +0x15,0x48,0xC6,0xD0,0x5C,0xC6,0x06,0x43,0x39,0x35,0xD7,0xB9,0x00,0x68,0x4C,0xDB, +0x2C,0x44,0x63,0x35,0x5C,0x63,0x00,0x9C,0xA1,0x1C,0xE7,0x1C,0x5C,0xC5,0x00,0xD7, +0xC6,0xFC,0xC5,0xE7,0xFF,0xB7,0x8B,0xFC,0x21,0xFF,0x60,0x98,0x60,0xED,0x21,0x00, +0x9C,0xED,0x41,0x00,0x98,0x0E,0x21,0x7C,0xED,0x61,0x00,0x94,0xED,0x81,0x00,0x90, +0xED,0xA1,0x00,0x8C,0xED,0xC1,0x00,0x88,0xED,0xE1,0x00,0x84,0xEE,0x01,0x00,0x80, +0x0E,0x41,0x78,0x0E,0x61,0x74,0x0E,0x81,0x70,0x0E,0xA1,0x6C,0x0E,0xC1,0x68,0x0C, +0x01,0x5C,0x0C,0x01,0x60,0x18,0x01,0x66,0x18,0x01,0x67,0x0C,0x01,0x54,0x0C,0x01, +0x58,0xE7,0xFF,0xAF,0xBC,0x1C,0xA1,0x5C,0x98,0xC3,0x89,0x45,0x1C,0x61,0x66,0x1C, +0x81,0x54,0xE7,0xFF,0xF5,0xC4,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF2,0x27, +0x00,0xE4,0xFC,0xC6,0x04,0xAC,0x4E,0x31,0x10,0x88,0xEA,0x8E,0x2A,0xE4,0x00,0x00, +0x35,0x0C,0x87,0x02,0x08,0xA6,0x00,0x9C,0xC8,0x40,0xA4,0x2D,0x5C,0xBF,0xF9,0x48, +0xA5,0x00,0x0C,0xA7,0x00,0x9C,0xE4,0xD4,0xF1,0xFF,0x56,0xC1,0xC0,0x10,0x01,0xC0, +0xE0,0x10,0x01,0xC2,0xC0,0x10,0x01,0xC2,0x00,0x10,0x01,0xC2,0xA0,0x10,0x01,0xFD, +0xCE,0x0C,0x0C,0xFC,0xE7,0x04,0x90,0xFE,0xD6,0x07,0x24,0xFE,0x10,0x0B,0x14,0xFE, +0xB5,0x09,0x4C,0x1D,0xA1,0x60,0x99,0x60,0x1E,0x81,0x66,0x9A,0x61,0x1D,0xE1,0x10, +0x52,0x40,0x64,0xE4,0x00,0x01,0x65,0x40,0xD4,0x5C,0x88,0xAB,0x10,0xC6,0x00,0x20, +0xC0,0x26,0x0C,0xCD,0x02,0x0C,0xCA,0x00,0x10,0xCE,0x04,0x9D,0x61,0x40,0xA5,0x33, +0x41,0x8C,0x33,0x40,0xB3,0x2D,0x5D,0x8C,0x00,0x0C,0xA1,0x0C,0x40,0xCB,0x33,0xE4, +0x00,0x00,0xEF,0x0C,0xC1,0x08,0x0C,0xE1,0x04,0xE7,0xFF,0xB6,0xCE,0x0E,0xE1,0x0E, +0x40,0xAC,0xBC,0x4C,0xA5,0x08,0x8C,0xB6,0x08,0x65,0x00,0x08,0xAE,0x0B,0x40,0x63, +0x2B,0x10,0xAE,0x14,0x98,0x81,0x40,0x63,0x28,0x88,0xAF,0x5C,0x63,0x06,0xE7,0xFF, +0xE9,0xC8,0x4C,0xAC,0x10,0x1F,0x0C,0x01,0x9C,0xA2,0x0C,0x8A,0x02,0x8C,0xB0,0x40, +0x83,0x23,0x0A,0xE5,0x01,0x40,0x84,0x90,0x5C,0x84,0x04,0x42,0xF7,0x25,0x0E,0xE5, +0x01,0x0C,0xE1,0x06,0x4E,0xEC,0x10,0x0C,0xC1,0x0A,0x5D,0x98,0x00,0x43,0x17,0xAC, +0x8E,0xF0,0x0B,0x37,0x01,0x40,0x99,0x25,0x5C,0x84,0x06,0x0C,0x97,0x01,0x08,0xA5, +0x00,0x8C,0x85,0x0C,0x98,0x00,0x88,0x87,0x50,0xA0,0x3C,0x88,0x6F,0xD4,0xCC,0xFC, +0x34,0x9D,0x44,0x9D,0xBC,0x5D,0x8B,0x00,0xD5,0x51,0xFA,0x7E,0x98,0x61,0xE7,0xFF, +0xAD,0x42,0xC0,0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xF2,0xE7,0x0C,0x10,0xC0,0xC0, +0x10,0x01,0x4E,0xF7,0x08,0xFC,0xA5,0x09,0x9C,0xFC,0xC6,0x0B,0x14,0x98,0xE0,0xE4, +0x00,0x00,0x41,0x0B,0x18,0x01,0x0F,0x04,0x01,0x1F,0x07,0x01,0x4C,0x87,0x10,0x5C, +0xF8,0x00,0x9C,0x82,0x43,0x04,0x34,0x8C,0x85,0x0B,0x18,0x01,0x0F,0x04,0x01,0x4C, +0x87,0x10,0x43,0x04,0x34,0x8C,0x85,0xD6,0xE7,0xFE,0xE4,0x0E,0xC1,0x6A,0x0E,0xA1, +0x6E,0x0E,0x81,0x72,0x0E,0x61,0x76,0x0E,0x41,0x7A,0x0E,0x21,0x7E,0xEE,0x01,0x00, +0x82,0xED,0xE1,0x00,0x86,0xED,0xC1,0x00,0x8A,0xED,0xA1,0x00,0x8E,0xED,0x81,0x00, +0x92,0xED,0x61,0x00,0x96,0xED,0x41,0x00,0x9A,0xED,0x21,0x00,0x9E,0xFC,0x21,0x00, +0xA0,0x85,0x29,0xFC,0x21,0xFF,0x58,0xC0,0x60,0x10,0x01,0xED,0xA1,0x00,0x94,0xEE, +0x21,0x00,0x84,0xEE,0x41,0x00,0x80,0x0E,0x61,0x7C,0x0E,0x81,0x78,0x0E,0xA1,0x74, +0x0E,0xC1,0x70,0xED,0x21,0x00,0xA4,0xED,0x41,0x00,0xA0,0xED,0x61,0x00,0x9C,0xED, +0x81,0x00,0x98,0xED,0xC1,0x00,0x90,0xED,0xE1,0x00,0x8C,0xEE,0x01,0x00,0x88,0xC2, +0x80,0x10,0x01,0xFC,0x63,0x0A,0x30,0xF0,0x94,0x0C,0x0C,0x98,0xA0,0xE4,0x00,0x38, +0x4E,0xC0,0xE0,0x10,0x01,0xC2,0x40,0x10,0x01,0xE8,0xE7,0x04,0x8D,0x99,0xA0,0xC4, +0xE7,0x02,0x00,0x1E,0x61,0x0C,0x5C,0xE0,0x09,0xFE,0x32,0x08,0xD8,0x48,0xC2,0x0B, +0x1E,0xC1,0x6E,0x0C,0xC1,0x04,0x1E,0xA1,0x6C,0xE7,0xFF,0xFA,0xFC,0xE7,0xFF,0xF8, +0x14,0xC0,0xC0,0x10,0x01,0xE8,0xE6,0x04,0x8D,0x54,0xE7,0x08,0x20,0xE0,0x1C,0xE7, +0xFF,0xF9,0x86,0x88,0x73,0xF0,0x94,0x0C,0x0C,0x98,0xA0,0x99,0x60,0xE4,0x00,0x37, +0xAE,0x99,0x40,0xE4,0x00,0x01,0x25,0xCD,0x8A,0x00,0x1C,0xC0,0xC0,0x10,0x01,0x40, +0x71,0x64,0xE8,0xE6,0x04,0x89,0x8D,0x91,0x1C,0x63,0x16,0x12,0x0C,0x04,0x11,0xEC, +0x05,0x54,0xE7,0x02,0x88,0x90,0x88,0xAF,0x11,0xCC,0x07,0x20,0xE1,0x04,0x88,0xCE, +0x88,0x76,0x98,0xE2,0x99,0x01,0xE7,0xFF,0xB5,0xA0,0x20,0x60,0xFC,0x88,0x90,0x88, +0xAF,0x88,0xCE,0x88,0x75,0x98,0xE2,0x99,0x01,0xE7,0xFF,0xB7,0x24,0x20,0x60,0xB0, +0x08,0xC1,0x6C,0xCC,0xC6,0x00,0x03,0x08,0xE1,0x6E,0xCC,0xE7,0x00,0x07,0x8C,0xE6, +0x98,0xCA,0x40,0xE7,0x30,0x0C,0xEC,0x17,0xE4,0x00,0x00,0x39,0x88,0xCE,0x98,0xE2, +0x99,0x01,0xE7,0xFF,0xB5,0x28,0x20,0x60,0x3A,0x98,0xE1,0x4C,0xE7,0x54,0x45,0x6B, +0x3D,0x5D,0x6B,0x00,0x88,0x73,0xF0,0x94,0x0C,0x0C,0x98,0xA1,0x9D,0x41,0xE4,0x00, +0x36,0x8C,0x5D,0x4A,0x00,0xF0,0xF2,0x08,0xD8,0xD4,0xEA,0xFB,0x75,0x88,0x6B,0xE7, +0xFF,0xB0,0xF2,0x9D,0xA1,0x0C,0xE1,0x06,0x5D,0xAD,0x00,0xD4,0xED,0xF9,0x75,0xC0, +0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFC,0x63,0x0A,0x30,0x98, +0xA1,0xE4,0x00,0x36,0x26,0xED,0x21,0x00,0xA6,0x0E,0xC1,0x72,0x0E,0xA1,0x76,0x0E, +0x81,0x7A,0x0E,0x61,0x7E,0xEE,0x41,0x00,0x82,0xEE,0x21,0x00,0x86,0xEE,0x01,0x00, +0x8A,0xED,0xE1,0x00,0x8E,0xED,0xC1,0x00,0x92,0xED,0xA1,0x00,0x96,0xED,0x81,0x00, +0x9A,0xED,0x61,0x00,0x9E,0xED,0x41,0x00,0xA2,0xFC,0x21,0x00,0xA8,0x85,0x29,0x1C, +0x21,0xE8,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0D,0x21,0x14,0x89,0x66, +0x89,0x83,0xC0,0xC0,0x10,0x01,0x89,0x45,0xE8,0xC6,0x04,0x89,0x54,0xC6,0x04,0x20, +0xC0,0x54,0x88,0x64,0x88,0xC7,0x88,0x85,0x0C,0xE1,0x04,0x88,0xAB,0xE7,0xFF,0xBD, +0x60,0x0C,0xE1,0x06,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0C,0x10,0x40,0xC7,0x33,0x5C, +0xC6,0x00,0xC0,0x80,0x10,0x01,0x8D,0x66,0x8D,0x46,0x5D,0x6B,0x00,0x5D,0x4A,0x00, +0xFC,0x84,0x0B,0x14,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x00,0x3D,0x4E,0xEA,0x10,0x8E, +0xE4,0x0A,0xF7,0x02,0x1F,0x0A,0x01,0x8C,0xD7,0x4E,0xEA,0x10,0x5D,0x58,0x00,0x8E, +0xE4,0x0A,0xF7,0x00,0x8C,0xB7,0xD5,0x4B,0xFF,0x30,0x24,0xC0,0x18,0x24,0xA0,0x26, +0x98,0x60,0xE4,0x00,0x00,0x7F,0x4C,0x65,0x40,0x9C,0xE4,0x40,0x63,0x30,0x4C,0xE7, +0x10,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x04,0x90,0x8C,0xE6,0x08,0x87,0x04,0x08,0xE7, +0x06,0xFC,0x63,0xFF,0x00,0x40,0x63,0x3B,0x98,0xEA,0x4C,0x84,0x40,0x40,0x63,0x38, +0x50,0xC0,0x64,0x40,0xE4,0x30,0x8C,0x67,0x0C,0x6C,0x00,0x5C,0x60,0x01,0x48,0x63, +0x0A,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18, +0x85,0x29,0x1C,0x21,0xB0,0x98,0x60,0x0D,0x21,0x4C,0x0D,0x41,0x48,0x0D,0x61,0x44, +0x0D,0x81,0x40,0x0D,0xA1,0x3C,0x0D,0xC1,0x38,0x0D,0xE1,0x34,0x0E,0x01,0x30,0x0E, +0x21,0x2C,0x0E,0x41,0x28,0x0E,0x61,0x24,0x0E,0x81,0x20,0x0E,0xA1,0x1C,0x0C,0x01, +0x08,0x0C,0x01,0x0C,0x18,0x01,0x16,0x18,0x01,0x17,0x0C,0x01,0x00,0x0C,0x01,0x04, +0xE7,0xFF,0xA6,0xDE,0x1D,0x41,0x08,0x98,0xC4,0x88,0xAA,0x1C,0x61,0x16,0x88,0x81, +0xE7,0xFF,0xEC,0xE8,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x04,0xB0, +0xF0,0xA6,0x00,0xE4,0x4C,0xA5,0x10,0x8C,0xAA,0xE4,0x00,0x00,0x3B,0x0C,0xCA,0x02, +0x0C,0xC7,0x00,0x08,0x87,0xFC,0x9C,0xE8,0x40,0xC6,0x25,0x5C,0xDF,0xF9,0x48,0xC6, +0x00,0x0C,0xCA,0x00,0x9D,0x44,0xD5,0x45,0xFF,0x3E,0x98,0x61,0xC2,0x40,0x10,0x01, +0xC2,0xA0,0x10,0x01,0xE7,0xFF,0xA6,0x36,0xFE,0xB5,0x0A,0x30,0x99,0x60,0x99,0x40, +0xFD,0xB2,0x08,0xD8,0x1E,0x81,0x10,0x9A,0x21,0xC2,0x60,0x10,0x01,0xE4,0x00,0x00, +0xF9,0xCD,0xCA,0x00,0x1C,0x40,0xEE,0x6C,0x88,0x74,0x12,0x07,0x04,0x11,0xE7,0x05, +0x08,0x87,0x16,0x11,0x87,0x07,0x88,0xB0,0x88,0xCF,0x88,0xEC,0xE7,0xFF,0xFC,0xC6, +0x20,0x60,0xFC,0x98,0x60,0xE7,0xFF,0xA5,0xB4,0x1E,0xE1,0x18,0x88,0xB0,0x88,0xCF, +0x88,0xEC,0x0C,0x61,0x12,0x4C,0x8C,0x10,0x8C,0x97,0x0C,0x84,0xF2,0xE7,0xFF,0xE8, +0xE2,0x98,0x61,0xE7,0xFF,0xA5,0x78,0x40,0x8D,0x74,0x40,0x6D,0x74,0x88,0xB0,0x88, +0xCF,0x9C,0x8C,0x88,0xEC,0x1C,0x63,0x18,0xE7,0xFF,0xA8,0x34,0x20,0x60,0x32,0x4C, +0xF1,0x54,0x45,0x6B,0x3D,0x5D,0x6B,0x00,0x88,0x75,0xF0,0x93,0x0C,0x0C,0x98,0xA1, +0x9D,0x41,0xE4,0x00,0x31,0xC4,0x5D,0x4A,0x00,0xF0,0xF2,0x08,0xD8,0xD4,0xEA,0xFC, +0x25,0x88,0x6B,0xE7,0xFF,0xAC,0x2A,0x0D,0x21,0x4E,0x0E,0xA1,0x1E,0x0E,0x81,0x22, +0x0E,0x61,0x26,0x0E,0x41,0x2A,0x0E,0x21,0x2E,0x0E,0x01,0x32,0x0D,0xE1,0x36,0x0D, +0xC1,0x3A,0x0D,0xA1,0x3E,0x0D,0x81,0x42,0x0D,0x61,0x46,0x0D,0x41,0x4A,0x1C,0x21, +0x50,0x85,0x29,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0xEE,0xCC,0x84,0x00,0x0A,0x8C, +0x87,0x08,0xE4,0x06,0x40,0xE3,0x3B,0x14,0x64,0x08,0x4C,0x63,0x50,0xFC,0x63,0x02, +0x00,0x8C,0x67,0x4C,0x63,0x52,0x85,0x29,0xD0,0xA3,0x07,0x05,0xD0,0x7F,0x06,0xE0, +0x9B,0x43,0xC0,0xE0,0x10,0x01,0x43,0x5A,0x2D,0xF3,0x27,0x00,0xF2,0x4F,0x5A,0x08, +0x9B,0x00,0x5F,0x5A,0x00,0x8A,0xF9,0x98,0xC0,0xE4,0x00,0x00,0x27,0x8F,0x17,0x9C, +0xC1,0x9E,0xE2,0x5F,0x18,0x00,0x5C,0xC6,0x00,0x5E,0xF7,0x00,0xD4,0xA6,0xFF,0x8D, +0x9F,0x3F,0xC0,0xE0,0x10,0x01,0x4C,0xA5,0x08,0x8C,0xB9,0xEF,0x27,0x00,0xF6,0x98, +0xE0,0xE4,0x00,0x01,0x27,0x40,0xC7,0xD4,0x1F,0x67,0x01,0x1F,0x86,0x01,0x4C,0xC6, +0x08,0x4F,0x9C,0x08,0x8C,0xD9,0x8F,0x99,0x0A,0xE6,0x00,0xD4,0x77,0x03,0xB4,0x08, +0xDC,0x00,0xD4,0xC3,0x03,0x7C,0x8C,0xF8,0xC3,0x00,0x10,0x01,0xEF,0x38,0x00,0xFA, +0x1C,0xA7,0x01,0xCC,0xE7,0x00,0x06,0xCC,0xA5,0x00,0x06,0x8C,0xF9,0x8C,0xB9,0x17, +0x87,0x00,0x0B,0x45,0x04,0x0B,0x27,0x04,0x17,0x65,0x00,0x0B,0x07,0x02,0x0B,0xA5, +0x02,0xD6,0xE6,0x02,0x3A,0x40,0xF7,0x35,0x42,0xF7,0x1D,0x40,0xC3,0x35,0x43,0x77, +0xDB,0x40,0xA6,0xE3,0x8C,0xBB,0x40,0xA5,0x23,0x43,0x57,0xD3,0x43,0x26,0xCB,0x42, +0xF7,0xEB,0x40,0x7A,0xCC,0x40,0xC6,0xC3,0x8C,0xD7,0x8C,0xC5,0x94,0xA1,0x40,0x86, +0x23,0xC8,0xA5,0x86,0xA0,0x40,0x84,0x28,0x8C,0x64,0x40,0x63,0x38,0xE4,0x00,0x00, +0x1B,0x5C,0xFB,0x00,0xD4,0xA7,0xFB,0x8C,0x98,0x60,0x85,0x29,0xC2,0xE0,0x10,0x01, +0xF8,0x77,0x00,0xE5,0xC2,0xE0,0x10,0x01,0xF8,0x97,0x00,0xF2,0xC0,0x80,0x10,0x01, +0xEC,0xA4,0x00,0xF1,0xC0,0xA0,0x10,0x01,0xEC,0xC5,0x00,0xE8,0xC0,0xC0,0x10,0x01, +0xEC,0xE6,0x00,0xEC,0xC0,0xE0,0x10,0x01,0x0C,0xC1,0x02,0xED,0x07,0x00,0xF8,0xC0, +0xE0,0x10,0x01,0xEC,0xC7,0x00,0xF4,0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40,0x0D, +0x61,0x3C,0x0D,0xC1,0x30,0x89,0x45,0x0C,0x81,0x0C,0x0C,0xC1,0x08,0x0C,0xE1,0x04, +0x0D,0x21,0x44,0x0D,0x81,0x38,0x0D,0xA1,0x34,0x0D,0xE1,0x2C,0x0E,0x01,0x28,0x0E, +0x21,0x24,0x0E,0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0E,0xA1,0x14,0x0E,0xC1, +0x10,0xE7,0xFF,0xA6,0x18,0x0C,0xE1,0x06,0x0C,0x81,0x0E,0x5C,0x87,0x15,0xC8,0xA0, +0x07,0xFF,0x49,0x67,0x20,0x89,0xC3,0x40,0x85,0x3D,0x0C,0xC1,0x0A,0x40,0xA5,0x5D, +0x5C,0xE5,0x1D,0x49,0x64,0x58,0x20,0xC4,0x8A,0xC0,0xE0,0x10,0x01,0x88,0x6B,0xF0, +0x87,0x00,0xE5,0x9C,0x9F,0x5C,0x84,0x00,0xE7,0xFF,0xFC,0x96,0x5C,0xE3,0x06,0x5D, +0xC7,0x15,0x48,0x63,0x70,0x5D,0xC3,0x06,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01, +0xC2,0xAF,0xFF,0xE1,0xEE,0x86,0x00,0xEA,0xE8,0xE7,0x00,0xF0,0xCA,0xB5,0xFF,0xFF, +0x8A,0x54,0x9A,0x20,0x52,0x00,0xFF,0x99,0xA0,0xC2,0xC0,0x10,0x01,0xE4,0x00,0x01, +0x21,0x10,0x85,0x00,0x9C,0xC1,0x8D,0xE4,0x5C,0xC6,0x00,0x9C,0xA1,0x5D,0xEF,0x00, +0xD5,0xA6,0xFF,0x8D,0x99,0x80,0xE4,0x00,0x00,0xCB,0x40,0x8C,0x7C,0xEC,0xB6,0x00, +0xEE,0x1E,0xE4,0x01,0xCC,0x84,0x00,0x0A,0xCE,0xF7,0x00,0x0A,0x8E,0xE5,0x8C,0xA4, +0x9C,0xDF,0x08,0x85,0x00,0x88,0xA7,0xD5,0x86,0x00,0x3A,0x08,0xB7,0x00,0xD5,0x65, +0x01,0xA4,0xD4,0x8B,0x01,0x84,0x0C,0xE1,0x04,0x42,0x6C,0x7C,0x88,0x6B,0x5E,0x73, +0x00,0x88,0x93,0xE7,0xFF,0xFB,0x80,0x0C,0xE1,0x06,0x40,0xC3,0x75,0x40,0x6E,0x1D, +0x5C,0x7F,0xF1,0x48,0x66,0x18,0xD6,0xA3,0x00,0x60,0x8A,0xA3,0x8A,0x0D,0xE4,0x00, +0x00,0x0D,0x8A,0x71,0x9D,0x81,0x8A,0x33,0x5D,0x8C,0x00,0x10,0xD2,0x00,0xD4,0xCC, +0xFC,0xE5,0x9D,0xA1,0x9E,0x41,0x5D,0xAD,0x00,0xD1,0xA4,0x00,0x72,0x88,0xB4,0x99, +0xE0,0x98,0xC0,0xE7,0xFF,0xFE,0xFB,0xC2,0x00,0x1F,0xE4,0x88,0x6B,0x20,0x00,0x9B, +0xCE,0x31,0x00,0x0A,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0xEE,0x8E,0x27,0x08,0x71, +0x02,0x41,0x6B,0x1B,0x08,0x71,0x04,0x4C,0x63,0x50,0xFC,0x63,0x02,0x00,0x8C,0x6B, +0x4C,0x63,0x52,0x1A,0x0A,0x00,0x0E,0xC1,0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E, +0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1, +0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46, +0x1C,0x21,0x48,0x85,0x29,0x1C,0x21,0xE8,0x98,0xFF,0x0D,0x41,0x10,0x0D,0x61,0x0C, +0x18,0xE1,0x07,0x0D,0x21,0x14,0x0D,0x81,0x08,0x89,0x44,0x88,0xE6,0x89,0x63,0xCA, +0xE0,0x07,0xFF,0x88,0x65,0x0C,0x84,0x02,0x08,0xA6,0x00,0x98,0xC1,0x42,0xF7,0x2D, +0xD4,0x97,0x00,0x54,0x5C,0xA4,0x15,0x48,0xC0,0x0A,0x0C,0x8B,0x02,0x08,0xA7,0x06, +0xD4,0x85,0x01,0x1C,0x08,0xE7,0x02,0x1C,0xA1,0x07,0xE7,0xFF,0xFC,0x3E,0x0C,0x6B, +0x00,0x0D,0x6A,0x02,0x10,0xA1,0x07,0x88,0x8B,0xE7,0xFF,0xF9,0xDE,0x8C,0x6B,0xE4, +0x00,0x00,0x63,0xC9,0x80,0x07,0xFF,0x40,0xAC,0x2D,0xD4,0xA4,0x01,0x4C,0x40,0x8C, +0x25,0x08,0xE7,0x02,0x1C,0xA1,0x07,0xE7,0xFF,0xFB,0xE4,0x41,0x8C,0x1D,0x0D,0x8B, +0x00,0x0D,0x6A,0x02,0x10,0xA1,0x07,0x88,0x8B,0xE7,0xFF,0xF9,0x7E,0x40,0x6B,0x1D, +0x0C,0x6A,0x00,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C, +0x21,0x18,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D, +0x81,0x00,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xA2,0x20,0xC0,0x92,0x98,0xC1,0xEC, +0xC7,0x06,0xA0,0xC0,0xE0,0x10,0x01,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0xEC,0x07,0x06,0x84,0x1C,0x21,0x10,0xE4,0x00,0x25,0x97,0xEC,0xE7, +0x06,0xA2,0xD0,0xE1,0x0A,0xF6,0xC1,0x40,0x10,0x01,0xEC,0xEA,0x06,0x86,0x20,0xE0, +0xE2,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x06,0x89,0xC8,0x80,0x01,0x00,0x44,0xC6,0x24, +0xD0,0xC0,0x0A,0x02,0xE8,0xC7,0x06,0x89,0xC8,0xA0,0xFE,0xFF,0x44,0xC6,0x2C,0x0D, +0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0xEC,0xC7,0x06,0x89,0x1C, +0x21,0x10,0xE4,0x00,0x55,0x41,0xEC,0xEA,0x06,0x86,0x20,0xE5,0x3E,0xC0,0xF4,0x00, +0x01,0xFC,0x80,0x80,0x00,0xC8,0xC7,0x26,0x18,0x08,0xA6,0x01,0x44,0xA5,0x25,0x5C, +0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,0x24,0x28,0x08,0xA6,0x01,0x50,0xA5,0x01,0x0C, +0xA6,0x01,0xC8,0xE7,0x7A,0x10,0xFC,0xA0,0xFE,0xFF,0x0C,0xC7,0x02,0x44,0xC6,0x2C, +0x0C,0xC7,0x00,0x1C,0x80,0xEF,0x0C,0xC7,0x02,0x44,0xC6,0x24,0x0C,0xC7,0x00,0x98, +0xE2,0xEC,0xEA,0x06,0x84,0xE4,0x00,0x01,0x97,0xED,0x6A,0x06,0x86,0xD1,0x62,0x06, +0x1E,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x06,0x89,0xC8,0xA0,0x01,0x00,0x44,0xC6,0x2C, +0xD0,0xC0,0x05,0x82,0xE8,0xC7,0x06,0x89,0x54,0xC6,0x10,0xD0,0xC0,0x05,0x2A,0xE8, +0xC7,0x06,0x89,0xC8,0x80,0xFF,0xEF,0x44,0xC6,0x24,0xC8,0xA0,0xFE,0xFF,0xEC,0xC7, +0x06,0x89,0xE8,0xC7,0x06,0x89,0x44,0xC6,0x2C,0xEC,0xC7,0x06,0x89,0xE4,0x00,0x52, +0xD2,0x98,0x60,0xE4,0x00,0x1A,0xD6,0x20,0x61,0xE6,0xC1,0x94,0x00,0x01,0xC8,0xEC, +0x26,0x18,0xFC,0x80,0x80,0x00,0x08,0xC7,0x01,0x44,0xC6,0x25,0x5C,0xC6,0x04,0x0C, +0xC7,0x01,0xC8,0xEC,0x24,0x28,0xFC,0xA0,0xFE,0xFF,0x08,0xC7,0x01,0xC9,0x8C,0x7A, +0x10,0x50,0xC6,0x01,0x0C,0xC7,0x01,0x0C,0xEC,0x02,0x44,0xE7,0x2C,0x0C,0xEC,0x00, +0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xEE,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xF8, +0xE4,0x00,0x74,0xB2,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x80,0x20, +0xE0,0x44,0xEC,0x0A,0x06,0x84,0x0C,0xEC,0x02,0x50,0xE7,0x10,0xE4,0x00,0x00,0x23, +0xED,0x6A,0x06,0x84,0x1C,0xC0,0xEF,0x0C,0xEC,0x02,0x44,0xE7,0x34,0x0C,0xEC,0x00, +0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85, +0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0xC1,0x54,0x00,0x01,0x0D,0x81,0x00, +0xC1,0x60,0x10,0x01,0xC9,0x8A,0x79,0xC0,0x0D,0x21,0x0C,0xEC,0x0B,0x06,0x80,0xC9, +0x4A,0x78,0xCC,0x08,0xEA,0x01,0x50,0xE7,0x02,0x0C,0xEA,0x01,0xE7,0xFF,0xFC,0x50, +0xEC,0xEB,0x06,0x82,0x1C,0xC7,0x01,0x5C,0xE7,0x04,0xEC,0xCB,0x06,0x80,0x0C,0xEC, +0x01,0xE7,0xFF,0xFF,0xC5,0x1C,0x21,0xD8,0x0D,0x21,0x24,0x0D,0x41,0x20,0xC1,0x54, +0x00,0x01,0xC8,0xEA,0x36,0x00,0x10,0xC7,0x00,0x54,0xC6,0xFD,0x18,0xC7,0x00,0x98, +0xE1,0x0C,0xE1,0x14,0x0C,0xE1,0x04,0x98,0xEA,0x0C,0xE1,0x18,0xC0,0xE0,0x10,0x01, +0xEC,0xC7,0x00,0x02,0x94,0xEF,0xC8,0xE7,0x42,0x40,0x40,0xE6,0x39,0x88,0xC7,0x0C, +0xE1,0x1C,0x98,0xE2,0x0C,0xE1,0x00,0xC8,0xE0,0x05,0x50,0x0C,0xE1,0x08,0xC8,0xE0, +0x79,0xD4,0x0C,0xE1,0x0C,0x50,0xE0,0xD0,0x98,0x80,0x98,0xAA,0x0C,0xE1,0x10,0x88, +0x61,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0x76,0x84,0xE8,0xC0,0xE0,0x10,0x01,0xC0, +0x60,0x10,0x01,0xEC,0xE7,0x00,0x7A,0xFC,0x63,0x05,0x50,0x84,0xE8,0x98,0x60,0xC0, +0xE0,0x10,0x01,0xEC,0xE7,0x00,0x86,0x84,0xE8,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x06, +0xA5,0x50,0xC6,0x02,0xEC,0xC7,0x06,0xA5,0xC0,0xC0,0x10,0x01,0xEC,0x06,0x06,0x89, +0xC0,0xC0,0x10,0x01,0xEC,0x06,0x06,0x7F,0xEC,0x07,0x06,0xA5,0xC0,0xE0,0x10,0x01, +0xEC,0x07,0x06,0xA0,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x84,0xC8,0xEA,0x3C,0xD4, +0x08,0xC7,0x01,0xC8,0xC6,0x04,0x00,0x0C,0xC7,0x01,0xC8,0xEA,0x3C,0xE0,0x08,0xC7, +0x01,0xC8,0xC6,0x04,0x00,0x0C,0xC7,0x01,0xC8,0xEA,0x78,0xC0,0xFC,0xC0,0x55,0xAA, +0x0C,0xC7,0x01,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x07,0xD8,0xEC, +0xC7,0x06,0x9C,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8D,0xC0,0xE0,0x10,0x01,0xEC, +0x07,0x06,0x99,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x07,0x58,0xEC, +0xC7,0x06,0x94,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0x8B,0xC0,0xE0,0x10,0x01,0xEC, +0x07,0x06,0x7D,0xFC,0xE0,0x03,0xE8,0xC9,0x4A,0x79,0xE0,0x0C,0xEA,0x01,0xE7,0xFF, +0xFD,0x26,0x0D,0x21,0x26,0x0D,0x41,0x22,0x1C,0x21,0x28,0x85,0x29,0xC0,0xF4,0x00, +0x01,0xC8,0xC7,0x74,0xD8,0x18,0x06,0x00,0xC8,0xA7,0x74,0x10,0x18,0x65,0x00,0xC8, +0xA7,0x76,0x30,0x18,0x05,0x00,0x50,0x80,0x24,0xC8,0xA7,0x74,0x00,0x18,0x85,0x00, +0xCA,0xE7,0x74,0x28,0x50,0xA0,0x60,0x18,0xB7,0x00,0xCA,0xE7,0x74,0x30,0x18,0xB7, +0x00,0xCA,0xE7,0x74,0x38,0x18,0xB7,0x00,0xCA,0xE7,0x74,0x40,0x18,0xB7,0x00,0xC8, +0xA7,0x74,0xA8,0x10,0xA5,0x00,0xC8,0xA7,0x74,0x78,0x52,0xE0,0x15,0x1A,0xE5,0x00, +0xC8,0xA7,0x74,0x70,0x9A,0xE2,0x1A,0xE5,0x00,0xC8,0xE7,0x74,0x60,0x18,0x87,0x00, +0x98,0x61,0x10,0xE6,0x00,0x50,0xE7,0x01,0x18,0xE6,0x00,0x85,0x29,0x85,0x29,0x85, +0x29,0x98,0xEA,0x1C,0x21,0xD8,0x0C,0xE1,0x18,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00, +0x02,0x94,0xCF,0xC8,0xC6,0x42,0x40,0x40,0xC7,0x31,0x98,0xE2,0x0C,0xE1,0x00,0xC8, +0xE0,0x01,0x00,0xC8,0xA0,0xFF,0xFF,0x0C,0xE1,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7, +0x00,0xFE,0x44,0xE7,0x2C,0xFC,0xE7,0x79,0x04,0x0C,0xE1,0x0C,0xC8,0xE0,0x11,0x00, +0x0C,0xE1,0x10,0x98,0xE1,0x0D,0x21,0x24,0x0C,0xE1,0x14,0x0C,0x01,0x04,0x0C,0xC1, +0x1C,0x88,0x61,0xC0,0xE0,0x10,0x01,0x98,0x81,0xEC,0xE7,0x00,0x76,0x98,0xAA,0x84, +0xE8,0x0D,0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x98,0xEA,0x1C,0x21,0xD8,0x0C,0xE1, +0x18,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x00,0x02,0x94,0xCF,0xC8,0xC6,0x42,0x40,0x40, +0xC7,0x31,0x98,0xE2,0x0C,0xE1,0x00,0x50,0xE0,0x42,0xC8,0xA0,0xFF,0xFF,0x0C,0xE1, +0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x01,0xFE,0x44,0xE7,0x2C,0xFC,0xE7,0x79,0x04, +0x0C,0xE1,0x0C,0xC8,0xE0,0x12,0x00,0x0C,0xE1,0x10,0x98,0xE1,0x0D,0x21,0x24,0x0C, +0xC1,0x1C,0x0C,0xE1,0x14,0x0C,0x01,0x04,0x88,0x61,0x98,0xAA,0xC0,0xE0,0x10,0x01, +0x98,0x81,0xEC,0xE7,0x00,0x76,0x84,0xE8,0xC0,0xF4,0x00,0x01,0x50,0xA0,0x10,0xC8, +0xC7,0x25,0xC0,0x0C,0xA6,0x01,0xC8,0xE7,0x22,0x00,0x0C,0x07,0x01,0x0D,0x21,0x26, +0x1C,0x21,0x28,0x85,0x29,0x9C,0x38,0x98,0xE0,0x88,0xA1,0x98,0xC0,0x54,0x87,0x03, +0x4C,0x84,0x08,0x8C,0x83,0x0A,0xE4,0x01,0x5F,0x07,0x00,0x9C,0xE1,0x54,0x87,0x03, +0x4C,0x84,0x08,0x8C,0x83,0x08,0x84,0x01,0x40,0x97,0x25,0x5C,0x84,0x06,0x4E,0xE4, +0xFA,0x44,0x97,0x26,0x40,0x84,0xBD,0x5C,0x84,0x06,0x0C,0x85,0x01,0x4E,0xE6,0x08, +0x1F,0x21,0x08,0x9C,0xA2,0x8E,0xF9,0x0A,0xF7,0xF8,0x5E,0xE4,0x15,0x48,0xC6,0xC0, +0xD0,0xE4,0xFD,0xEE,0x88,0x66,0x9C,0x28,0x85,0x29,0x1C,0x21,0xD8,0xC2,0xF4,0x00, +0x01,0x0D,0x41,0x24,0x0D,0x61,0x20,0x0D,0x81,0x1C,0x0D,0xA1,0x18,0x0D,0xC1,0x14, +0x0D,0xE1,0x10,0x0E,0x01,0x0C,0x0E,0x21,0x08,0xCA,0xF7,0x24,0x14,0x1C,0xA1,0x04, +0x98,0xC0,0x99,0x40,0x08,0xF7,0x01,0x4C,0xE7,0x36,0x54,0xE7,0x0F,0x18,0xE5,0x00, +0x8D,0x47,0x9C,0xC4,0x5D,0x4A,0x00,0x9C,0xA1,0x5C,0xC2,0x09,0xC0,0xF4,0x00,0x01, +0x23,0xFF,0x91,0xC8,0xC7,0x7A,0x10,0xFE,0xE0,0xFE,0xFF,0x0C,0xA6,0x02,0x44,0xA5, +0xBC,0x0C,0xA6,0x00,0xFE,0xE0,0x80,0x00,0xC8,0xC7,0x26,0x18,0x08,0xA6,0x01,0x44, +0xA5,0xBD,0x5C,0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,0x7A,0x30,0xC8,0xE7,0x24,0x28, +0x08,0xA7,0x01,0x50,0xA5,0x01,0x0C,0xA7,0x01,0xC8,0xE0,0x01,0x00,0x08,0xA6,0x01, +0x44,0xA5,0x3C,0xC0,0xF4,0x00,0x01,0x20,0xA3,0xC8,0x0C,0xA6,0x02,0xCB,0x27,0x26, +0x00,0xC8,0xA5,0x01,0x00,0xC8,0xE7,0x7A,0x10,0x0C,0xA6,0x00,0x0C,0xC7,0x02,0xC8, +0xC6,0x01,0x00,0x0C,0xC7,0x00,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0x78,0x10,0xC1, +0x05,0x51,0x00,0x30,0x41,0x04,0x43,0x8D,0x07,0x10,0xE1,0x06,0x13,0x01,0x04,0xC2, +0x00,0x10,0x01,0x41,0x66,0xC4,0x42,0xE0,0xC5,0xC3,0xA0,0x10,0x01,0x42,0xF7,0x35, +0xC3,0x80,0x10,0x01,0x5E,0xF7,0x00,0xC1,0xE0,0x10,0x01,0x43,0xD7,0x3D,0xC1,0xC0, +0x10,0x01,0x41,0xAB,0x3C,0x5F,0xDE,0x00,0xFE,0x10,0x02,0x54,0xFF,0xBD,0x09,0xE4, +0xFF,0x9C,0x0B,0xE2,0xFD,0xEF,0x02,0x40,0xFD,0xCE,0x02,0xC2,0x50,0xC0,0x20,0x98, +0xE0,0x53,0x60,0xFF,0xE4,0x00,0x01,0x73,0x20,0x60,0x4A,0x4C,0xA6,0x10,0x8C,0xB9, +0x08,0xA5,0x01,0x0C,0xA8,0x01,0xE4,0x00,0x01,0x29,0x88,0xBA,0xD7,0x1A,0x00,0xA5, +0x40,0xBA,0xC5,0x5C,0xA5,0x00,0xD5,0x67,0x00,0x54,0x5D,0xA7,0x15,0x48,0xBE,0xB8, +0x20,0x81,0x36,0x43,0x47,0x7C,0x4D,0x86,0x10,0x13,0x5A,0x00,0x5F,0x42,0x33,0x20, +0x00,0x91,0x8D,0x99,0x8C,0xBC,0x0A,0x2C,0x01,0x8F,0x4E,0x5E,0x31,0x06,0x13,0x5A, +0xEE,0x42,0x31,0xDB,0x4F,0x5A,0x08,0x11,0x85,0x00,0x8F,0x5D,0x40,0xB1,0x60,0xE4, +0x00,0x00,0x91,0x8D,0x99,0x4F,0x5A,0x08,0x0A,0x2C,0x01,0x8F,0x5D,0x41,0x9C,0x2C, +0x5E,0x31,0x06,0x11,0x8C,0x00,0x40,0xB1,0xDB,0xE4,0x00,0x00,0x57,0x20,0x84,0xB6, +0x43,0x47,0x84,0x13,0x5A,0x00,0x5F,0x42,0x3B,0x20,0x00,0x85,0x8C,0xBC,0x1F,0x5A, +0x12,0x11,0x85,0x00,0x4F,0x5A,0x08,0x4C,0xA6,0x10,0x8F,0x5D,0x8C,0xB9,0x08,0xA5, +0x00,0x40,0xA5,0xDB,0x40,0xA5,0x60,0x0C,0xBA,0x01,0x9C,0xC1,0x9E,0xE1,0x9F,0xC1, +0x9C,0xE1,0x5C,0xC6,0x00,0x9D,0x02,0x5E,0xF7,0x00,0x5F,0xDE,0x00,0x5F,0x47,0x00, +0xD5,0x5A,0xFA,0x45,0xC0,0xF4,0x00,0x01,0xFE,0xE0,0xFE,0xFF,0xC8,0xE7,0x7A,0x10, +0x0C,0xC7,0x02,0x44,0xC6,0xBC,0x0C,0xC7,0x00,0x0E,0x21,0x0A,0x0E,0x01,0x0E,0x0D, +0xE1,0x12,0x0D,0xC1,0x16,0x0D,0xA1,0x1A,0x0D,0x81,0x1E,0x0D,0x61,0x22,0x0D,0x41, +0x26,0x1C,0x21,0x28,0x85,0x29,0x20,0x60,0xD6,0xC0,0xC0,0x10,0x01,0xC0,0xF4,0x00, +0x01,0xFC,0xC6,0x08,0x18,0xC8,0xE7,0x23,0x08,0x08,0xA6,0x01,0x0C,0xA7,0x01,0x08, +0xA6,0x19,0x0C,0xA7,0x61,0x9C,0xC2,0x9C,0xE4,0xC0,0xB4,0x00,0x01,0xC8,0xA5,0x23, +0x38,0x5C,0xE5,0x0D,0x23,0xFF,0x95,0xE4,0x00,0x00,0x6B,0x20,0x64,0xC6,0xC0,0xC0, +0x10,0x01,0xC0,0xF4,0x00,0x01,0xFC,0xC6,0x07,0xE8,0xC8,0xE7,0x23,0x08,0x08,0xA6, +0x01,0x0C,0xA7,0x01,0x08,0xA6,0x19,0x0C,0xA7,0x61,0x9C,0xC2,0x9C,0xE4,0xC0,0xB4, +0x00,0x01,0xC8,0xA5,0x23,0x38,0x5C,0xE5,0x0D,0x23,0xFF,0x95,0x85,0x29,0xFC,0xA0, +0x3E,0x3E,0xC2,0xE0,0x10,0x01,0xC0,0x80,0x10,0x01,0xFC,0xD7,0x08,0x60,0xFC,0xE4, +0x08,0x48,0x0C,0xA6,0x17,0x0C,0xA6,0x15,0x0C,0xA7,0x17,0x0C,0xA7,0x0B,0x0C,0xA7, +0x15,0xC0,0xA0,0x10,0x01,0xFF,0x05,0x06,0xB2,0x0C,0x18,0x03,0xC3,0x00,0x10,0x01, +0xFF,0x38,0x06,0xAA,0xEC,0x18,0x06,0xAB,0xFF,0x00,0x19,0x18,0xEF,0x17,0x08,0x61, +0xFE,0xE0,0x28,0x24,0x0E,0xE6,0x03,0xFE,0xE0,0x2C,0x2B,0x0E,0xE6,0x05,0xFE,0xE0, +0x09,0x07,0x0E,0xE6,0x07,0xFE,0xE0,0x0C,0x0A,0x0E,0xE6,0x09,0xFE,0xE0,0x2D,0x00, +0x0E,0xE6,0x0B,0xFE,0xE0,0x1C,0x1A,0x0E,0xE6,0x0D,0xFE,0xE0,0x2A,0x29,0x0E,0xE6, +0x0F,0xFE,0xE0,0x05,0x04,0x0E,0xE6,0x11,0xFE,0xE0,0x08,0x06,0x0E,0xE6,0x13,0xFC, +0xC0,0x22,0x23,0xEC,0xC4,0x08,0x49,0xFC,0xC0,0x20,0x16,0x0C,0xC7,0x03,0xFC,0xC0, +0x1E,0x14,0x0C,0xC7,0x05,0xFC,0xC0,0x12,0x0D,0x0C,0xC7,0x07,0xFC,0xC0,0x0B,0x0E, +0x0C,0xC7,0x09,0xFC,0xC0,0x21,0x17,0x0C,0xC7,0x0D,0xFC,0xC0,0x1F,0x15,0x0C,0xC7, +0x0F,0xFC,0xC0,0x1D,0x13,0x0C,0x19,0x03,0x0C,0xC7,0x11,0xFC,0xC0,0x10,0x11,0x0C, +0xC7,0x13,0xFC,0xE0,0x0C,0x00,0xEC,0xE5,0x06,0xB3,0x85,0x29,0x20,0x61,0x26,0xC0, +0xB4,0x00,0x01,0xC2,0xE0,0x10,0x01,0xC0,0x80,0x10,0x01,0xC8,0xA5,0x22,0x9C,0xFE, +0xF7,0x08,0x60,0xFC,0x84,0x06,0xB2,0x98,0xC0,0x98,0xE0,0x43,0x06,0xBC,0x0B,0x18, +0x01,0x0F,0x05,0x01,0x24,0xE4,0x37,0x43,0x06,0x24,0x0B,0x18,0x01,0xEF,0x05,0x01, +0x4D,0x9C,0xE1,0x9C,0xC2,0x5C,0xE7,0x00,0x9C,0xA4,0xD0,0xEC,0xFF,0x0E,0x50,0xC0, +0x8C,0xE4,0x00,0x00,0x93,0x20,0x65,0x42,0xC0,0xB4,0x00,0x01,0xC2,0xE0,0x10,0x01, +0xC0,0x80,0x10,0x01,0xC8,0xA5,0x22,0x9C,0xFE,0xF7,0x08,0x48,0xFC,0x84,0x06,0xAA, +0x98,0xC0,0x98,0xE0,0x43,0x06,0xBC,0x0B,0x18,0x01,0x0F,0x05,0x01,0x24,0xE4,0x37, +0x43,0x06,0x24,0x0B,0x18,0x01,0xEF,0x05,0x01,0x4D,0x9C,0xE1,0x9C,0xC2,0x5C,0xE7, +0x00,0x9C,0xA4,0xD0,0xEC,0xFF,0x0E,0x50,0xC0,0x8A,0xC0,0xF4,0x00,0x01,0xC8,0xE7, +0x24,0x14,0x0C,0xC7,0x01,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x21,0x1C,0x0D,0x41,0x18, +0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0xC1, +0x54,0x00,0x01,0x50,0xE0,0x30,0xC9,0x8A,0x25,0xC0,0x0C,0xEC,0x01,0xC9,0x6A,0x24, +0x81,0xC1,0xC0,0x10,0x01,0x18,0xEB,0x00,0xC1,0xE0,0x10,0x01,0xEC,0x8E,0x00,0x02, +0xEC,0xEF,0x00,0x66,0x50,0x60,0x64,0x95,0xAF,0xC9,0xAD,0x42,0x40,0x40,0x84,0x69, +0x84,0xE8,0xC9,0x4A,0x22,0x28,0x50,0xE0,0x40,0x50,0xC0,0x44,0x0C,0xEA,0x01,0x0C, +0xCA,0x01,0xEC,0xEF,0x00,0x66,0xEC,0x8E,0x00,0x02,0x50,0x60,0x1E,0x40,0x84,0x69, +0x84,0xE8,0x50,0xE0,0x10,0x0C,0xEC,0x01,0x18,0x0B,0x00,0x0D,0xE1,0x06,0x0D,0xC1, +0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E, +0x1C,0x21,0x20,0x85,0x29,0xFC,0x21,0xFF,0x28,0xC0,0x80,0x10,0x01,0xED,0xC1,0x00, +0xC0,0xEE,0x81,0x00,0xA8,0xED,0x21,0x00,0xD4,0xED,0x41,0x00,0xD0,0xED,0x61,0x00, +0xCC,0xED,0x81,0x00,0xC8,0xED,0xA1,0x00,0xC4,0xED,0xE1,0x00,0xBC,0xEE,0x01,0x00, +0xB8,0xEE,0x21,0x00,0xB4,0xEE,0x41,0x00,0xB0,0xEE,0x61,0x00,0xAC,0xEE,0xA1,0x00, +0xA4,0xEE,0xC1,0x00,0xA0,0xFC,0x84,0x05,0x7C,0x1C,0x61,0x08,0x50,0xA0,0x60,0xE7, +0xFF,0x93,0x22,0xC0,0xD4,0x00,0x01,0xC8,0xE6,0x3C,0xCC,0xC8,0xC6,0x22,0x28,0x1D, +0xC1,0x68,0x0A,0x86,0x01,0x88,0xCE,0x08,0xA7,0x01,0x0C,0xA6,0x01,0x9C,0xE4,0xC0, +0xB4,0x00,0x01,0x9C,0xC2,0xC8,0xA5,0x3C,0xFC,0x5C,0xE5,0x0D,0x23,0xFF,0xAD,0x1C, +0xE1,0x08,0x1C,0xC1,0x68,0x0C,0x87,0x02,0x08,0xA7,0x05,0x4C,0xA5,0x10,0x8C,0xA4, +0x08,0x87,0x07,0x0C,0x85,0x01,0x9C,0xE8,0xD4,0xE6,0xFF,0x6E,0xC0,0xF4,0x00,0x01, +0xC8,0xC7,0x24,0x2C,0x0C,0x06,0x01,0x98,0xAC,0xC8,0xC7,0x24,0x10,0x0C,0xA6,0x01, +0xC8,0xC7,0x22,0x04,0x98,0xBF,0x18,0xA6,0x00,0xFD,0x41,0x00,0x80,0xFC,0xC1,0x00, +0xA0,0xC9,0xE7,0x22,0x08,0x89,0x8A,0x52,0x20,0x10,0x99,0x60,0xFE,0x41,0x00,0x98, +0x0C,0xC1,0x04,0xC2,0xC0,0x10,0x01,0xC2,0xA0,0x10,0x01,0xC0,0xF4,0x00,0x01,0xC8, +0xE7,0x22,0x29,0xC0,0xB4,0x00,0x01,0x1A,0x27,0x00,0xC8,0xA5,0x22,0x00,0x54,0xEB, +0x01,0x5E,0x6B,0x00,0x5C,0xE0,0x09,0x4E,0x73,0x09,0xC8,0xC0,0x3F,0x00,0x1E,0x73, +0x27,0x99,0xA0,0x4E,0x73,0x10,0x8E,0x65,0x50,0xA0,0x3F,0x48,0xE6,0x28,0x0C,0xF3, +0x01,0x21,0xA0,0x5A,0x08,0xEF,0x01,0xC8,0xC0,0xFF,0xFE,0x44,0xE7,0x34,0x0C,0xEF, +0x01,0x8A,0x12,0xE4,0x00,0x00,0x1D,0x08,0xEF,0x01,0x50,0xE7,0x01,0xE7,0xFF,0xFF, +0xE3,0x98,0x60,0x98,0x80,0xE7,0xFF,0xF4,0xEA,0xC0,0xA0,0x10,0x01,0x94,0xCF,0xE8, +0xE5,0x08,0x79,0xC8,0xC6,0x42,0x40,0x0C,0xF0,0x01,0xEC,0x96,0x00,0x02,0xEC,0xF5, +0x00,0x66,0x50,0x60,0x26,0x40,0x84,0x31,0x84,0xE8,0x9E,0x02,0x0C,0xE1,0x06,0xD6, +0x07,0xFE,0x96,0x88,0x72,0xE7,0xFF,0xF3,0xE0,0x4C,0x63,0x08,0x21,0xA0,0x42,0xFC, +0xA1,0x00,0xA0,0x8C,0x65,0x08,0xE3,0xF9,0xE4,0x00,0x00,0x27,0xFC,0xC1,0x00,0xA0, +0x08,0xEC,0x01,0x8C,0x66,0x08,0xC3,0xF9,0x40,0xE6,0x3D,0x0C,0xEC,0x01,0x9D,0xA1, +0x5D,0xAD,0x00,0xD1,0xA2,0xFB,0xF6,0x0C,0x13,0x01,0x9E,0x21,0x9D,0x61,0x5E,0x31, +0x00,0x9D,0x82,0xD1,0x6C,0xF9,0xC6,0xE8,0xA1,0x00,0x80,0x88,0xCA,0x9A,0xE0,0x98, +0xE0,0x08,0x86,0x00,0xD4,0x85,0x00,0x50,0x8A,0xE7,0xE4,0x00,0x00,0x0D,0x88,0x85, +0x9C,0xE1,0x9C,0xC2,0x5C,0xE7,0x00,0xD0,0xEC,0x00,0x52,0x88,0xA4,0xE7,0xFF,0xFF, +0xC9,0xFC,0xE1,0x00,0xA0,0x4E,0xF7,0x08,0x8E,0xE7,0xC0,0xA0,0x10,0x01,0x08,0x97, +0xE0,0xC0,0xE0,0x10,0x01,0xFC,0xA5,0x0B,0xEE,0xFC,0xE7,0x0B,0xE2,0x52,0xE0,0xFF, +0x88,0xC7,0x20,0x80,0x3C,0x0B,0x0A,0x00,0x43,0x18,0xBB,0x43,0x18,0x20,0x1B,0x06, +0x00,0x13,0x06,0x00,0x9D,0x42,0xC3,0x00,0x1D,0x4E,0x20,0x00,0x49,0x98,0xDF,0x18, +0xC7,0x00,0x9C,0xE1,0xD4,0xE5,0xFF,0xDE,0xE4,0x00,0x00,0x15,0x9C,0xC1,0xD4,0xC5, +0xFE,0xA6,0xC1,0x54,0x00,0x01,0x50,0xC0,0x7F,0xC8,0xEA,0x22,0x04,0x18,0xC7,0x00, +0xC8,0xEA,0x22,0x08,0x50,0xC0,0x1E,0x98,0x60,0x0C,0xC7,0x01,0xC9,0x4A,0x3C,0xCC, +0xE7,0xFF,0xF9,0x38,0x08,0xEE,0x01,0x0C,0xEA,0x01,0xC0,0xB4,0x00,0x01,0x9D,0x44, +0xC8,0xA5,0x3C,0xFC,0x9D,0xC2,0x5D,0x45,0x0D,0x23,0xFF,0xAD,0xC0,0xF4,0x00,0x01, +0x98,0xA2,0xC8,0xC7,0x24,0x2C,0x0C,0xA6,0x01,0xC8,0xE7,0x22,0x28,0x0E,0x87,0x01, +0xEE,0xC1,0x00,0xA2,0xEE,0xA1,0x00,0xA6,0xEE,0x81,0x00,0xAA,0xEE,0x61,0x00,0xAE, +0xEE,0x41,0x00,0xB2,0xEE,0x21,0x00,0xB6,0xEE,0x01,0x00,0xBA,0xED,0xE1,0x00,0xBE, +0xED,0xC1,0x00,0xC2,0xED,0xA1,0x00,0xC6,0xED,0x81,0x00,0xCA,0xED,0x61,0x00,0xCE, +0xED,0x41,0x00,0xD2,0xED,0x21,0x00,0xD6,0xFC,0x21,0x00,0xD8,0x85,0x29,0x1C,0x21, +0xD0,0xC0,0x80,0x10,0x01,0x0D,0x41,0x28,0x0D,0x61,0x24,0x0D,0x21,0x2C,0x89,0x43, +0xFC,0x84,0x05,0x5C,0x88,0x61,0x50,0xA0,0x20,0xE7,0xFF,0x8E,0x2E,0x08,0xE1,0x01, +0x89,0x61,0x5C,0xE7,0xB3,0x98,0xE0,0x20,0x00,0x99,0x4C,0xEA,0x08,0xC0,0xC0,0x10, +0x01,0xFC,0xC6,0x06,0xAE,0x8C,0xC7,0x98,0xAF,0x0C,0xA6,0x01,0xC0,0xC0,0x10,0x01, +0xFC,0xC6,0x06,0xB6,0x8C,0xE6,0x0C,0x07,0x01,0xE4,0x00,0x00,0x79,0x4C,0xCA,0x08, +0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0x84,0x06,0xAE,0xFC,0xA5,0x06,0xB6, +0x8C,0x86,0x8C,0xC5,0x5C,0xA7,0x04,0x9C,0xE1,0x4E,0xE5,0x40,0x8E,0xE5,0x08,0xAB, +0x01,0x5C,0xA7,0xBB,0x20,0x00,0x45,0x0C,0xA4,0x01,0x0E,0xE6,0x01,0x9D,0x62,0x5C, +0xE2,0x09,0x23,0xFF,0x89,0x4C,0xEA,0x08,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xAE, +0x8C,0xC7,0x08,0xA6,0x01,0xC8,0xC0,0x01,0x8A,0x9C,0xA1,0x40,0xC5,0x33,0xC0,0xC9, +0x9B,0xEE,0x20,0x01,0x01,0x4C,0xA5,0x08,0x50,0xC0,0xC5,0x50,0xE0,0x15,0x40,0xC5, +0x33,0xFC,0xC6,0xB3,0x1F,0xC0,0xC2,0x69,0xCA,0x20,0x00,0x55,0x9C,0xE1,0x8C,0xC5, +0x5C,0xE7,0x04,0xC0,0xE0,0x80,0x04,0x23,0xFF,0xB9,0xE4,0x00,0x00,0x01,0x4D,0x4A, +0x08,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xA6,0x8D,0x46,0x0C,0xEA,0x01,0xE4,0x00, +0x00,0x29,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xA6,0x8C,0xE6,0x50,0xC0,0x15,0x0C, +0xC7,0x01,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29, +0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0xEE,0x0D,0x21,0x06,0x98,0x61, +0x9C,0x28,0xE7,0xFF,0xFD,0xD9,0xC8,0xA0,0x08,0x00,0xD0,0x68,0x00,0xC2,0x5C,0x62, +0x09,0xC8,0xA0,0x04,0x00,0x20,0x00,0x37,0x5C,0x64,0x09,0xC8,0xA0,0x02,0x00,0x48, +0xA0,0x28,0xC0,0xD4,0x00,0x01,0xCB,0x20,0x8F,0xFF,0xC8,0xE6,0x26,0x04,0x0A,0xE7, +0x01,0x0B,0x07,0x01,0x47,0x18,0xCC,0x0F,0x07,0x01,0x0B,0x07,0x01,0xCB,0x18,0x30, +0x00,0x0F,0x07,0x01,0xC8,0xE6,0x26,0x2C,0xCB,0x26,0x26,0x20,0x0C,0x67,0x01,0x5E, +0xF7,0x04,0xC8,0xA5,0x80,0x00,0x4F,0x03,0x09,0x98,0xE0,0xC8,0xC6,0x26,0x1C,0xE4, +0x00,0x00,0x1F,0x0C,0xE6,0x01,0x0C,0xB9,0x01,0x9C,0xE1,0x5C,0xE7,0x04,0xD7,0x07, +0xFF,0xAD,0x54,0xE4,0x01,0x20,0xE0,0x78,0xC0,0xF4,0x00,0x01,0x50,0xA0,0x10,0xC8, +0xC7,0x26,0x24,0x18,0xA6,0x00,0xC8,0xE7,0x24,0x34,0x1C,0xC3,0xFF,0x5C,0xC6,0x04, +0x0C,0xC7,0x01,0x54,0xE4,0x02,0x20,0xE0,0x78,0xC0,0xF4,0x00,0x01,0x50,0xA0,0x10, +0xC8,0xC7,0x26,0x25,0x18,0xA6,0x00,0xC8,0xE7,0x24,0x38,0x1C,0xC3,0xFF,0x5C,0xC6, +0x04,0x0C,0xC7,0x01,0x54,0xE4,0x04,0x20,0xE0,0x78,0xC0,0xF4,0x00,0x01,0x50,0xA0, +0x10,0xC8,0xC7,0x26,0x28,0x18,0xA6,0x00,0xC8,0xE7,0x24,0x3C,0x1C,0xC3,0xFF,0x5C, +0xC6,0x04,0x0C,0xC7,0x01,0x54,0x84,0x08,0x20,0x80,0x74,0xC0,0xF4,0x00,0x01,0x50, +0xA0,0x10,0xC8,0xC7,0x26,0x29,0x18,0xA6,0x00,0x9C,0x7F,0xC8,0xE7,0x24,0x40,0x5C, +0x63,0x04,0x0C,0x67,0x01,0xC0,0xF4,0x00,0x01,0xC8,0xE7,0x26,0x04,0x0E,0xE7,0x01, +0x85,0x29,0x9C,0x38,0xFC,0xC0,0xA0,0x30,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x54, +0x00,0x01,0xC8,0xEA,0x26,0x04,0x0C,0xC7,0x01,0xC8,0xEA,0x26,0x30,0xFC,0xC0,0x10, +0x11,0x98,0x60,0x0C,0xC7,0x01,0xE4,0x00,0x5C,0x2C,0xC8,0xAA,0x26,0x20,0x50,0xE0, +0xF4,0xC9,0x4A,0x26,0x1C,0xFC,0xC0,0x80,0x10,0x0C,0xEA,0x01,0x0C,0xC5,0x01,0x9C, +0xE1,0x5C,0xE7,0x04,0xC0,0xE0,0x20,0x04,0x23,0xFF,0xC5,0xFC,0xC0,0xE0,0x30,0xC0, +0xF4,0x00,0x01,0xC8,0xE7,0x26,0x04,0x0C,0xC7,0x01,0x0D,0x41,0x02,0x0D,0x21,0x06, +0x9C,0x28,0x85,0x29,0x9C,0x38,0x98,0x61,0x0D,0x21,0x04,0xE7,0xFF,0xF3,0x62,0x98, +0x61,0xE4,0x00,0x0F,0x36,0x98,0x61,0xE4,0x00,0x0F,0x6A,0x98,0x61,0xE7,0xFF,0xA2, +0x24,0x98,0x60,0xE7,0xFF,0xF3,0x32,0x98,0x60,0xE4,0x00,0x0F,0x06,0x98,0x60,0xE4, +0x00,0x0F,0x3A,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF,0xA1,0xEB,0x9C,0x30, +0xC0,0xE0,0x10,0x01,0x0D,0x21,0x0C,0xE8,0xE7,0x00,0x4B,0x0D,0x41,0x08,0x0D,0x61, +0x04,0x0D,0x81,0x00,0x5C,0xE7,0x00,0xC0,0xE0,0x14,0x00,0x20,0x04,0xE5,0xC0,0xE0, +0x10,0x01,0xC0,0xC0,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFC,0xC6,0x09,0xE4,0x98,0xE0, +0xE4,0x00,0x00,0x5D,0x9C,0xE1,0x08,0xA6,0x00,0x5C,0xE7,0x00,0xC0,0xBE,0x4A,0x68, +0x20,0x00,0xC9,0xC0,0xBF,0x44,0x6C,0x9C,0xC2,0x20,0x00,0x55,0xC0,0xE0,0x10,0x01, +0xF0,0xC7,0x06,0xDE,0x9C,0xC1,0xF8,0xC7,0x06,0xDE,0xE4,0x00,0x00,0x19,0xD4,0x87, +0xFE,0xB5,0xE4,0x00,0x02,0x0B,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x06,0xDE,0xD0,0xE9, +0x07,0x31,0xC0,0xE0,0x10,0x01,0x98,0x60,0xF8,0x07,0x06,0xDE,0xC0,0xE0,0x10,0x01, +0xEC,0xE7,0x00,0x86,0x84,0xE8,0xC0,0xE0,0x01,0x1F,0x98,0x99,0x44,0xE7,0x24,0xC0, +0xE0,0x01,0x1D,0xC1,0x74,0x00,0x01,0xC9,0x4B,0x7A,0x10,0x0C,0xEA,0x02,0xC8,0xE7, +0x01,0x00,0x0C,0xEA,0x00,0xC9,0x6B,0x7A,0x30,0xC9,0x80,0x01,0x00,0x0D,0x8B,0x00, +0xE7,0xFF,0xFE,0x28,0x0C,0xEA,0x02,0xC8,0xE7,0x01,0x00,0x0C,0xEA,0x00,0x0D,0x8B, +0x00,0x98,0x60,0xE4,0x00,0x59,0xB2,0xC0,0xE0,0x01,0x1F,0x50,0xE7,0x06,0xC0,0xE0, +0x01,0x1D,0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xEC,0x66,0x04,0xDA,0xEC,0xE7, +0x00,0x86,0x84,0xE8,0xC0,0xE0,0x10,0x01,0xC8,0xA0,0xFF,0xEF,0xE8,0xC7,0x06,0x89, +0x44,0xC6,0x2C,0xC8,0x80,0xFE,0xFF,0xEC,0xC7,0x06,0x89,0xE8,0xC7,0x06,0x89,0x44, +0xC6,0x24,0xEC,0xC7,0x06,0x89,0xC0,0xF4,0x00,0x01,0xC8,0xC7,0x26,0x18,0xFC,0x80, +0x80,0x00,0x08,0xA6,0x01,0x44,0xA5,0x25,0x5C,0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7, +0x24,0x28,0x08,0xA6,0x01,0x50,0xA5,0x01,0x0C,0xA6,0x01,0xC0,0xC0,0x10,0x01,0xC8, +0xE7,0x7A,0x10,0x98,0x60,0xEC,0x06,0x06,0x84,0xC8,0xA0,0xFE,0xFF,0x08,0xC7,0x01, +0x44,0xC6,0x2C,0x0C,0xC7,0x01,0xE4,0x00,0x23,0xCA,0xE4,0x00,0x0C,0xDA,0x98,0x61, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D, +0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xDE,0xE7, +0xFF,0xFD,0xEF,0x9C,0x38,0xFC,0xA0,0x07,0xFF,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC0, +0xC0,0x10,0x01,0xFC,0xE6,0x0C,0x0C,0x0C,0xA7,0x09,0x0C,0xA7,0x07,0x50,0xA0,0x15, +0x0C,0xA7,0x10,0x0C,0xA7,0x0C,0x98,0xA9,0x18,0xA7,0x04,0xFC,0xA0,0x01,0x00,0x0C, +0xA7,0x0B,0xFC,0xA0,0x04,0x00,0x0C,0xA7,0x03,0x50,0xA0,0x26,0xF8,0xA6,0x0C,0x0C, +0x98,0xC4,0x99,0x42,0x18,0xC7,0x14,0x19,0x47,0x01,0x98,0x60,0xE4,0x00,0x0F,0x9C, +0xC0,0xC0,0x10,0x01,0xFC,0xA6,0x06,0xF1,0xF8,0x06,0x06,0xF1,0xC0,0xC0,0x10,0x01, +0xC0,0xE0,0x10,0x01,0x18,0x05,0x01,0xF8,0x06,0x06,0xFC,0xFC,0xA6,0x06,0xFC,0xC0, +0xC0,0x10,0x01,0xEC,0x07,0x06,0x89,0x98,0xE1,0x18,0xE5,0x01,0x98,0xAA,0xF8,0xA6, +0x06,0xDE,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x06,0xC4,0xC0,0xC0,0x10,0x01,0xF8,0x06, +0x06,0xDF,0xC0,0xC0,0x10,0x01,0xEC,0x06,0x06,0xEC,0xC0,0xC0,0x10,0x01,0xEC,0x06, +0x06,0xF8,0xC0,0xC0,0x10,0x01,0xEC,0x06,0x07,0x23,0xC0,0xC0,0x10,0x01,0xF8,0x06, +0x06,0xE8,0xC0,0xC0,0x10,0x01,0xF8,0x06,0x06,0xBD,0xC0,0xC0,0x10,0x01,0xF8,0xE6, +0x06,0xFE,0xC0,0xC0,0x10,0x01,0xF8,0xE6,0x06,0xD2,0xC0,0xE0,0x10,0x01,0x1C,0xC0, +0xC8,0xF8,0xC7,0x06,0xD0,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07,0x00,0xC0,0xE0,0x10, +0x01,0xF8,0x07,0x07,0x02,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF0,0xC0,0xE0,0x10, +0x01,0xF8,0x07,0x07,0x01,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x07,0x05,0xC0,0xE0,0x10, +0x01,0x50,0xC0,0xB1,0xEC,0xC7,0x06,0xC9,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x07,0x0C, +0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xBC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE0, +0xC0,0xE0,0x10,0x01,0xF9,0x47,0x07,0x06,0xC0,0xE0,0x10,0x01,0xF9,0x47,0x06,0xBE, +0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06,0xE4,0xC0,0xE0,0x10,0x01,0x50,0xC0,0x33,0xF8, +0xC7,0x06,0xFF,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF3,0xC0,0xE0,0x10,0x01,0x50, +0xA0,0x50,0xF8,0x07,0x07,0x18,0xC0,0x60,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0x63, +0x09,0x4C,0xEC,0xE7,0x00,0x7E,0x98,0x80,0x84,0xE8,0xC0,0xC0,0x10,0x01,0xC0,0xF4, +0x00,0x01,0xF0,0xA6,0x04,0xD4,0xC8,0xC7,0x79,0xE9,0x18,0xA6,0x00,0xC8,0xC7,0x79, +0xD0,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x18,0x07,0x5A,0x18,0x07,0x04,0x18, +0x07,0x05,0x18,0x07,0x06,0x18,0x07,0x20,0x18,0x07,0x21,0x18,0x07,0x22,0x18,0x07, +0x3C,0x18,0x07,0x3D,0x18,0x07,0x3E,0x18,0x07,0x58,0x18,0x07,0x59,0xC0,0xE0,0x10, +0x01,0xF0,0xE7,0x04,0xD5,0xC0,0xA0,0x10,0x01,0x0C,0xE6,0x01,0xFC,0xA5,0x08,0xA8, +0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x08,0x78,0xFC,0xE7,0x0C,0x24, +0x0C,0x06,0x01,0x0C,0x06,0x31,0x0C,0x07,0x01,0x0C,0x07,0x31,0x0C,0x07,0x61,0xEC, +0x07,0x00,0x91,0x9C,0xC2,0x9C,0xE2,0xD4,0xC5,0xFF,0x4E,0xC1,0x40,0x10,0x01,0xE8, +0xEA,0x04,0x89,0x50,0xE7,0x01,0xEC,0xEA,0x04,0x89,0xE7,0xFF,0xF5,0xCC,0x50,0xC0, +0x19,0xE8,0xEA,0x04,0x89,0x50,0xE7,0x04,0xC0,0x80,0x10,0x01,0xEC,0xEA,0x04,0x89, +0xF8,0xC4,0x07,0x19,0xFC,0xE4,0x07,0x19,0x18,0xC7,0x03,0x18,0xC7,0x01,0x50,0xC0, +0x32,0x18,0xC7,0x05,0x18,0xC7,0x04,0x50,0xC0,0x50,0x98,0xA1,0x18,0xC7,0x07,0x18, +0xC7,0x06,0x18,0xA7,0x02,0xC0,0xC0,0x10,0x01,0xFC,0xE6,0x0B,0xFE,0x0C,0x07,0x09, +0x18,0x07,0x01,0x18,0x07,0x02,0x18,0x07,0x03,0x0C,0x07,0x05,0x0C,0x07,0x07,0x0C, +0x07,0x0B,0xC0,0xE0,0x10,0x01,0xF8,0x06,0x0B,0xFE,0xEC,0xA7,0x04,0x8B,0xC0,0xDA, +0x00,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x33,0x43,0xEC,0xC7,0x00,0xD0,0x50,0xC0, +0xC8,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x04,0x8D,0xC0,0xE0,0x10,0x01,0xC0,0xDA,0x00, +0x01,0xFC,0xC6,0x35,0xB2,0xEC,0xC7,0x00,0xD4,0xC0,0xE0,0x10,0x01,0xC0,0xDA,0x00, +0x01,0xFC,0xC6,0x34,0xDF,0x0D,0x41,0x02,0xEC,0xC7,0x00,0xDC,0x0D,0x21,0x06,0xC0, +0xDA,0x00,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x2B,0x0E,0x9C,0x28,0xEC,0xC7,0x00, +0xE0,0x85,0x29,0x9C,0x38,0xC0,0xF4,0x00,0x01,0x0D,0x21,0x04,0xC8,0xC7,0x3C,0x48, +0xFC,0xA0,0x05,0x00,0x0C,0xA6,0x01,0xC8,0xC7,0x3C,0x54,0xFC,0xA0,0x6E,0x00,0x0C, +0x06,0x01,0xC8,0xC7,0x3D,0xCC,0x0C,0xA6,0x01,0xC8,0xC7,0x3D,0xD0,0x50,0xA0,0x71, +0xC8,0xE7,0x3C,0x50,0x0C,0xA6,0x01,0xC8,0xA0,0xFF,0xFE,0x08,0xC7,0x01,0x44,0xC6, +0x2C,0x0C,0xC7,0x01,0xE7,0xFF,0xE1,0x5A,0xE7,0xFF,0xE2,0x22,0x0D,0x21,0x06,0x9C, +0x28,0xE7,0xFF,0xF5,0xE3,0x1C,0x21,0xE8,0x0D,0x21,0x14,0x0D,0x41,0x10,0x0D,0x61, +0x0C,0xE7,0xFF,0xF9,0xE4,0x98,0x62,0xE7,0xFF,0xB3,0x22,0xE7,0xFF,0x7F,0xFE,0x50, +0x60,0x26,0xE7,0xFF,0xE0,0x16,0xE7,0xFF,0x7B,0x66,0xE7,0xFF,0xFF,0x12,0xC1,0x54, +0x00,0x01,0xC8,0xEA,0x24,0x2C,0x08,0xC7,0x01,0xC0,0xE0,0x10,0x01,0x4C,0xC6,0x09, +0x9C,0xC1,0xF8,0xC7,0x06,0xD1,0xE7,0xFF,0xE7,0xF0,0x98,0x60,0xC1,0x60,0x10,0x01, +0xEC,0xEB,0x00,0x86,0x84,0xE8,0xC8,0xEA,0x3C,0x44,0x08,0xC7,0x01,0xC8,0xC6,0x10, +0x00,0x0C,0xC7,0x01,0xC8,0xEA,0x3C,0x4C,0x08,0xC7,0x01,0xC8,0xC6,0x10,0x00,0x0C, +0xC7,0x01,0xE7,0xFF,0xEB,0x86,0xE7,0xFF,0xEA,0x62,0xFC,0xA0,0xC0,0x00,0xC9,0x4A, +0x24,0x80,0x08,0xEA,0x01,0x44,0xE7,0x2D,0x5C,0xE7,0x04,0x0C,0xEA,0x01,0xE7,0xFF, +0xF5,0x8C,0xC0,0xC0,0x10,0x01,0xEC,0xEB,0x00,0x86,0xEC,0x66,0x04,0xDA,0x84,0xE8, +0x98,0xC0,0xC8,0xE0,0x48,0x00,0xC0,0xC7,0x00,0x0D,0xC8,0xC0,0x48,0x00,0xC0,0xC6, +0x00,0x0F,0x50,0xC6,0x04,0xC0,0xC7,0x00,0x0D,0xC8,0xC0,0x48,0x00,0xC0,0xC6,0x00, +0x0F,0x50,0xC6,0x08,0xC0,0xC7,0x00,0x0D,0xC0,0xE0,0x01,0x1F,0x50,0xE7,0x06,0xC0, +0xE0,0x01,0x1D,0xC1,0x54,0x00,0x01,0xC8,0xEA,0x79,0x04,0x0C,0x07,0x01,0xC8,0xEA, +0x79,0x00,0xFC,0xC0,0xEA,0x60,0x0C,0xC7,0x01,0xC8,0xEA,0x79,0x10,0xC9,0x6A,0x7A, +0x10,0xFC,0xC0,0x03,0x00,0x0C,0xC7,0x01,0x0C,0xEB,0x02,0xC8,0xE7,0x01,0x00,0x0C, +0xEB,0x00,0xC8,0xEA,0x7A,0x50,0x1E,0xE0,0xDF,0x0C,0xC7,0x02,0xC8,0xA0,0xFF,0xEF, +0x44,0xC6,0xBC,0x0C,0xC7,0x00,0x08,0xEB,0x01,0x44,0xE7,0x2C,0xCA,0xE0,0xFF,0x00, +0x0C,0xEB,0x01,0xC8,0xEA,0x26,0x04,0x08,0xC7,0x01,0x44,0xC6,0xBC,0xC8,0xC6,0x80, +0x00,0x0C,0xC7,0x01,0xC0,0xC0,0x10,0x01,0x08,0xA7,0x01,0xF0,0x86,0x05,0x26,0x44, +0xA5,0x25,0x0C,0xA7,0x01,0xC8,0xAA,0x26,0x08,0xFC,0xC6,0x05,0x26,0xCA,0xE0,0x0F, +0xFF,0x08,0x86,0x03,0x44,0x84,0xBC,0x0C,0x85,0x01,0xC8,0xAA,0x26,0x0C,0x08,0x86, +0x05,0x44,0x84,0xBC,0x0C,0x85,0x01,0xC8,0xA0,0x03,0xFF,0x08,0x86,0x07,0x44,0x84, +0x2C,0xC8,0xAA,0x26,0x10,0x0C,0x85,0x01,0x08,0xA6,0x09,0xC8,0xC0,0x03,0xFF,0x44, +0xA5,0x34,0xC8,0xCA,0x26,0x14,0x0C,0xA6,0x01,0x08,0xC7,0x01,0x50,0xC6,0x30,0x98, +0x60,0x0C,0xC7,0x01,0x98,0x81,0x98,0xA0,0xE4,0x00,0x4F,0xF0,0xC0,0xE0,0x10,0x01, +0xE8,0xA7,0x02,0xCC,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04,0x6C,0x98,0x6F,0x0C,0xE1, +0x00,0x98,0x88,0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xC6,0x02,0xC8,0xFC, +0xE7,0x02,0xCE,0xC1,0x00,0x10,0x01,0xFD,0x08,0x03,0x64,0xE7,0xFF,0xD1,0x82,0xC8, +0xEA,0x26,0x18,0xFE,0xE0,0x80,0x00,0x08,0xC7,0x01,0xC9,0x4A,0x24,0x28,0x44,0xC6, +0xBD,0x5C,0xC6,0x04,0x0C,0xC7,0x01,0x08,0xEA,0x01,0x50,0xE7,0x01,0x0C,0xEA,0x01, +0x0C,0xEB,0x02,0x50,0xE7,0x10,0xFC,0xA0,0xFE,0xFF,0x0C,0xEB,0x00,0x0C,0xEB,0x02, +0x44,0xE7,0x2C,0xC0,0xDA,0x00,0x01,0x0C,0xEB,0x00,0xFC,0xC6,0x39,0xF5,0xC0,0xE0, +0x10,0x01,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0xEC,0xC7,0x00,0xD8,0x1C, +0x21,0x18,0x85,0x29,0x20,0xA0,0x9A,0x4C,0x84,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7, +0x0B,0x14,0x8C,0x87,0xE4,0x00,0x00,0x1D,0x08,0xC7,0x01,0x9C,0xE2,0x0C,0xC3,0x01, +0x9C,0x62,0xD4,0xE4,0xFF,0xB6,0xE4,0x00,0x00,0xC5,0x20,0xA5,0x7A,0x4C,0x84,0x08, +0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0B,0x14,0x8C,0x87,0x8A,0xE7,0x88,0xC7,0xE4,0x00, +0x00,0x1D,0x08,0xA3,0x01,0x9C,0x62,0x0C,0xA6,0x01,0x9C,0xC2,0xD4,0xC4,0xFF,0xB6, +0xC0,0xC0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0xC6,0x09,0x4C,0xFC,0xA5,0x0C,0x0C, +0x10,0x85,0x04,0x10,0xA5,0x01,0x40,0xA5,0x23,0x5C,0xA5,0x00,0x4C,0xA5,0x10,0x8C, +0xB7,0xE4,0x00,0x00,0x27,0x0A,0xE7,0x02,0x08,0x87,0x00,0x9C,0xE4,0x8C,0x97,0x0C, +0x86,0x00,0x9C,0xC4,0xD4,0xE5,0xFF,0x8E,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x0D, +0x41,0x00,0xC1,0x54,0x00,0x01,0xC9,0x4A,0x36,0x00,0x10,0xEA,0x00,0x54,0xE7,0xFD, +0x18,0xEA,0x00,0x10,0xEA,0x00,0x50,0xE7,0x02,0x94,0xCF,0x18,0xEA,0x00,0xC8,0xC6, +0x42,0x40,0xC0,0xE0,0x10,0x01,0x98,0x6F,0xEC,0x87,0x00,0x02,0xC0,0xE0,0x10,0x01, +0x40,0x84,0x31,0xEC,0xE7,0x00,0x66,0x84,0xE8,0x10,0xEA,0x00,0x54,0xE7,0xFD,0x18, +0xEA,0x00,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x20,0x60,0x18,0x20, +0x64,0x6E,0xC0,0xF4,0x00,0x01,0xFC,0xA0,0x02,0xC0,0xC8,0xC7,0x24,0x48,0x0C,0xA6, +0x01,0xC8,0xE7,0x24,0x54,0x98,0xC9,0x0C,0xC7,0x01,0x85,0x29,0xC0,0xE0,0x10,0x01, +0xFC,0xE7,0x06,0xA6,0xC0,0xD4,0x00,0x01,0x4C,0x63,0x08,0xC8,0xA6,0x24,0x58,0x8C, +0x67,0x08,0xE3,0x01,0x0C,0xE5,0x01,0xC8,0xA6,0x24,0x5C,0x0C,0xE5,0x01,0xC8,0xC6, +0x24,0x60,0x0C,0xE6,0x01,0x85,0x29,0xC0,0xC0,0x10,0x01,0xF8,0x06,0x06,0xBC,0xC0, +0xD4,0x00,0x01,0xC8,0xC6,0x79,0xE9,0x10,0xC6,0x00,0xC0,0xE0,0x10,0x01,0xF8,0xC7, +0x04,0xD4,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x07,0x58,0xF0,0xA7,0x04,0xD4,0xC0,0xE0, +0x10,0x01,0xEC,0xC7,0x06,0x94,0xC0,0xC0,0x10,0x01,0xE8,0xC6,0x06,0xA5,0x5C,0xA0, +0x01,0x54,0xC6,0x02,0x50,0xA0,0x80,0x48,0xA8,0x29,0x20,0xC1,0x40,0xC0,0xC0,0x10, +0x01,0x88,0x87,0xEC,0x06,0x06,0x7D,0x98,0xE0,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x0B, +0x60,0xEE,0xE4,0x06,0x96,0x43,0x07,0x34,0x8E,0xE7,0x13,0x18,0x00,0x1B,0x17,0x00, +0x9C,0xE1,0x5E,0xE7,0x04,0xD4,0xB7,0xFF,0x65,0xC0,0xC0,0x10,0x01,0xE8,0x86,0x06, +0x7D,0x8C,0xA4,0xC0,0xE0,0x10,0x01,0xEC,0xA6,0x06,0x7D,0xE8,0xC7,0x06,0xA5,0xC8, +0xA0,0xFF,0xFD,0x44,0xC6,0x2C,0xEC,0xC7,0x06,0xA5,0xE7,0xFF,0xFD,0xA1,0xC0,0xE0, +0x10,0x01,0xFC,0xE7,0x0B,0x60,0x88,0xA7,0xFC,0xC7,0x00,0x82,0x18,0x07,0x00,0x9C, +0xE1,0xD4,0xE6,0xFF,0xDE,0xC0,0xE0,0x10,0x01,0x50,0xC0,0x62,0x1C,0xA5,0x1F,0xF8, +0xC7,0x0B,0x60,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x0B,0x61,0x18,0x07,0x00,0x9C,0xE1, +0xD4,0xE5,0xFF,0xDE,0xC0,0xC0,0x10,0x01,0x1C,0xA0,0x9E,0xF8,0xA6,0x0B,0x7F,0xC0, +0xD4,0x00,0x01,0xC8,0xC6,0x79,0xD0,0x08,0xC6,0x01,0x5C,0xC6,0x00,0xC0,0xE0,0x10, +0x01,0xF8,0xC7,0x04,0xD5,0xC0,0xC0,0x10,0x01,0x8B,0x47,0xF3,0x26,0x0C,0x0C,0xC0, +0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFC, +0xE7,0x0B,0x80,0xFC,0xA5,0x0A,0x7C,0x4F,0x39,0x08,0xFF,0x18,0x09,0xE4,0xFE,0xF7, +0x0B,0x14,0x98,0xC0,0xE4,0x00,0x00,0x77,0xF0,0x9A,0x04,0xD5,0x20,0x84,0x38,0xD0, +0x84,0x00,0xDA,0x40,0x86,0xBC,0xE4,0x00,0x00,0x0F,0x40,0x86,0xC4,0x08,0x84,0x00, +0x18,0x87,0x01,0x4C,0x84,0x41,0xE4,0x00,0x00,0x21,0x0C,0x85,0x02,0x4F,0x64,0x42, +0x4C,0x84,0x82,0x1B,0x67,0x01,0x18,0x87,0x00,0x9C,0xC2,0x9C,0xE2,0x9C,0xA4,0xD4, +0xD9,0xFE,0x4E,0xC0,0xF4,0x00,0x01,0xC8,0xE7,0x7A,0x50,0x1C,0xA0,0xDF,0x0C,0xC7, +0x02,0x44,0xC6,0x2C,0x0C,0xC7,0x00,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x06,0xA5,0x54, +0xE7,0x02,0x20,0xE1,0x50,0xC0,0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xEC,0x07,0x06, +0x7D,0xFC,0xA5,0x0B,0x60,0x98,0xE0,0xC0,0xC0,0x10,0x01,0xEC,0x86,0x06,0x96,0x42, +0xE7,0x2C,0x8C,0x87,0x12,0xF7,0x00,0x1A,0xE4,0x00,0x9C,0xE1,0xC0,0xE0,0x10,0x04, +0x23,0xFF,0xAD,0xC0,0xC0,0x10,0x01,0xE8,0xA6,0x06,0x7D,0xFC,0xA5,0x00,0x80,0xC0, +0xE0,0x10,0x01,0xEC,0xA6,0x06,0x7D,0xE8,0xC7,0x06,0xA5,0xC8,0xA0,0xFF,0xFD,0x44, +0xC6,0x2C,0xEC,0xC7,0x06,0xA5,0xE7,0xFF,0xFB,0x29,0x20,0x68,0x5A,0xC0,0xE0,0x10, +0x01,0xFC,0xC7,0x07,0x19,0xF0,0xA7,0x07,0x19,0x10,0xC6,0x01,0xE4,0x00,0x01,0x67, +0x20,0x6C,0x56,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x07,0x19,0x10,0xC7,0x03,0x10,0xA7, +0x02,0xE4,0x00,0x01,0x3D,0xD0,0x64,0x00,0xB6,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x07, +0x19,0x10,0xC7,0x05,0x10,0xA7,0x04,0xE4,0x00,0x01,0x11,0xD0,0x65,0x00,0xB6,0xC0, +0xE0,0x10,0x01,0xFC,0xE7,0x07,0x19,0x10,0xC7,0x07,0x10,0xA7,0x06,0xE4,0x00,0x00, +0xE5,0x20,0x60,0xA6,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x0A,0x7C, +0xF0,0xC6,0x0C,0x0C,0x4C,0xC6,0x10,0x8C,0xC7,0xE4,0x00,0x00,0x13,0x0C,0x07,0x00, +0x9C,0xE4,0xD4,0xE6,0xFF,0xDE,0xE4,0x00,0x01,0xCF,0x98,0xC0,0x98,0xA0,0x20,0x64, +0xE6,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x09,0xE4,0xC0,0xA0,0x10, +0x01,0xFC,0xC6,0x0A,0x7C,0xF0,0xA5,0x0C,0x0C,0x4C,0xA5,0x08,0x8C,0xA7,0xE4,0x00, +0x00,0x23,0x08,0x87,0x00,0x9C,0xE2,0x4C,0x84,0x40,0x0C,0x86,0x00,0x9C,0xC4,0xD4, +0xE5,0xFF,0x9E,0xE4,0x00,0x01,0x55,0xD0,0x66,0x05,0x32,0xD0,0x67,0x01,0x4A,0xC0, +0x80,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF3,0x64,0x0C,0x0C,0xFC,0xE7,0x0A,0x7C,0xC3, +0x00,0x10,0x01,0x4F,0x7B,0x10,0xFF,0x18,0x09,0xE4,0x8F,0x67,0xC8,0x80,0x03,0xE8, +0xE4,0x00,0x00,0xF3,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF2,0xE7,0x0C,0x0C, +0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0xC6,0x0A,0x7C,0x4E,0xF7,0x08,0xFC, +0x84,0x0B,0x14,0xFC,0xA5,0x09,0xE4,0x98,0xE0,0xE4,0x00,0x00,0x3B,0x43,0x27,0x2C, +0x43,0x07,0x24,0x0B,0x59,0x01,0x9C,0xE2,0x0F,0x26,0x02,0x9C,0xC4,0x4F,0x39,0x42, +0x43,0x3A,0xCD,0x0F,0x38,0x01,0xD4,0xF7,0xFF,0x3E,0xE4,0x00,0x00,0x67,0x0E,0xE7, +0x02,0x0B,0x58,0x00,0x43,0xB7,0x23,0x4F,0x5A,0x40,0x43,0x3A,0xBD,0xD6,0xFA,0x00, +0x6C,0x43,0x25,0xCB,0x8F,0x3D,0xE4,0x00,0x00,0x13,0x43,0x26,0xCB,0x8F,0x3D,0x43, +0x39,0x20,0x9F,0x02,0x0F,0x27,0x00,0x9C,0xE4,0xD4,0xFB,0xFE,0xAE,0x85,0x29,0x9C, +0x38,0x0D,0x41,0x04,0x0D,0x61,0x00,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x08,0xD8,0xD2, +0xE1,0x11,0x19,0xC0,0x80,0x10,0x01,0xE8,0xC4,0x06,0xD6,0xFC,0x84,0x06,0xD6,0x0A, +0xE4,0x04,0xC2,0xEF,0xFF,0xE0,0x20,0x06,0x21,0xFC,0xE7,0x08,0xD8,0x08,0xA4,0x02, +0x0B,0xA7,0x16,0x0B,0x27,0x34,0x0B,0xC7,0x32,0x08,0x84,0x06,0x41,0x1E,0xBD,0x43, +0x59,0x25,0x0B,0x07,0x18,0x40,0x7D,0x35,0x40,0xE5,0xC5,0x43,0x63,0xD3,0x40,0xE7, +0x43,0x8C,0xFB,0x20,0xE1,0x84,0x43,0x97,0x35,0x43,0x65,0x25,0x43,0x5C,0xD3,0x41, +0x1B,0x43,0x8F,0x48,0x23,0x40,0x40,0x27,0x40,0x28,0x24,0xE0,0x2A,0xE4,0x00,0x00, +0x8F,0x24,0xFD,0x0E,0x4D,0x5A,0xFA,0x47,0x4A,0xD6,0x4D,0x07,0xFA,0x41,0x5A,0x55, +0x47,0x48,0x3E,0x43,0x5A,0x45,0xD5,0x5A,0x01,0x74,0x40,0x63,0xDB,0x43,0x78,0x2D, +0x43,0x7B,0xE3,0x8F,0x63,0x23,0x60,0x40,0x27,0x60,0x28,0x24,0xE0,0x2A,0xE4,0x00, +0x00,0x2D,0x24,0xFC,0x4A,0x4C,0xFB,0xFA,0x47,0x67,0xDE,0x43,0x7B,0x3D,0x98,0xE1, +0xD7,0x7A,0x06,0xC8,0x43,0x39,0x2D,0x40,0x7E,0x35,0x43,0x9D,0xBD,0x40,0xE4,0xC5, +0x43,0x5C,0xCB,0x40,0xE7,0x1B,0x8C,0xFA,0x20,0xE1,0x84,0x43,0x66,0xBD,0x43,0x44, +0x2D,0x43,0x3B,0xCB,0x40,0x7A,0x1B,0x8F,0x23,0x23,0x20,0x40,0x27,0x20,0x28,0x24, +0xE0,0x2A,0xE4,0x00,0x00,0x8F,0x24,0xFD,0x0E,0x4D,0x19,0xFA,0x47,0x28,0xCE,0x4C, +0x67,0xFA,0x41,0x19,0x45,0x47,0x23,0x3E,0x43,0x39,0x1D,0xD5,0x19,0x01,0x74,0x43, +0x9C,0xD3,0x43,0x58,0x25,0x43,0x5A,0xDB,0x8F,0x5C,0x23,0x40,0x40,0x27,0x40,0x28, +0x24,0xE0,0x2A,0xE4,0x00,0x00,0x2D,0x24,0xFC,0x4A,0x4C,0xFA,0xFA,0x47,0x47,0xD6, +0x43,0x5A,0x3D,0x98,0xE0,0xD7,0x59,0x03,0x20,0xC3,0x60,0x10,0x01,0x9B,0x40,0xFF, +0x7B,0x08,0xEE,0x9B,0x3F,0x50,0xE0,0xFF,0xE4,0x00,0x00,0x25,0x50,0xEA,0x01,0x5C, +0xE7,0x00,0x9F,0x41,0x1F,0x7B,0x1C,0x23,0x49,0x08,0x09,0x1B,0x00,0x08,0x7B,0x02, +0x4D,0x5A,0x20,0x43,0x88,0x35,0x41,0x63,0x2D,0x43,0x9C,0xE3,0x41,0x6B,0x5B,0x5D, +0x4A,0x02,0x8F,0x8B,0xD7,0x99,0x00,0x51,0x8B,0x99,0xE4,0x00,0x00,0x0F,0x5C,0xEA, +0x00,0x43,0x28,0xBD,0x40,0x63,0x25,0x43,0x39,0xCB,0x40,0x63,0x1B,0x8F,0x23,0xD7, +0x3C,0xFD,0xE9,0x8B,0x3C,0xE7,0xFF,0xFF,0x7B,0x4C,0xC7,0x21,0x54,0xE7,0x0F,0xD4, +0xE6,0x0B,0x3A,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x08,0xC7,0x35,0x0F,0xC7, +0x17,0x0F,0xA7,0x33,0x0F,0x07,0x35,0x0C,0xC7,0x19,0xE4,0x00,0x02,0x99,0xC0,0xCF, +0xFF,0xE0,0x20,0x05,0x11,0xC2,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0xF0,0xB7,0x04, +0xE8,0x9C,0xA1,0x5C,0xA5,0x00,0xF8,0xB7,0x04,0xE8,0x0A,0xE7,0x16,0x43,0x17,0x35, +0x0B,0x44,0x02,0x43,0x78,0xC3,0x08,0x87,0x18,0x43,0x04,0xD5,0x43,0x38,0xC3,0x0B, +0x07,0x32,0x8F,0x79,0x40,0xD8,0x35,0x0B,0x27,0x34,0x40,0xC6,0x33,0x43,0x39,0xD5, +0x43,0x39,0xCB,0x8C,0xD9,0x5C,0xDB,0x17,0x50,0xC0,0x10,0x48,0xC6,0x00,0x20,0xC0, +0x48,0x08,0xC7,0x35,0x0F,0x07,0x17,0x0E,0xE7,0x33,0x0C,0x87,0x35,0x0C,0xC7,0x19, +0xD0,0xA4,0x00,0xB5,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x08,0xD8,0x9C,0xDF,0xF8,0xC7, +0x08,0xD8,0xE4,0x00,0x01,0xA9,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xE8,0xE4,0x00, +0x01,0x91,0xD2,0xE1,0x06,0x26,0xC0,0xC0,0x10,0x01,0xF8,0x06,0x04,0xE8,0xC0,0xA0, +0x10,0x01,0xFC,0xC5,0x06,0xD6,0x0B,0x06,0x04,0xC3,0x0F,0xFF,0xE0,0x20,0x02,0xA5, +0xFC,0xE7,0x08,0xD8,0x08,0x87,0x18,0x0B,0x27,0x16,0x40,0xF9,0xC5,0x43,0x47,0x3B, +0xE8,0xE5,0x06,0xD6,0x43,0x39,0x3D,0x43,0x79,0xCB,0x0B,0x26,0x02,0x43,0x24,0xCD, +0x40,0xF9,0xCB,0x8F,0x67,0x08,0xE6,0x06,0x40,0xE4,0x3D,0x40,0xE7,0x3B,0xC3,0x20, +0x10,0x01,0x43,0x87,0xD4,0xC3,0x40,0x10,0x01,0xFC,0xF9,0x0B,0xEE,0xFC,0x9A,0x07, +0x10,0xD7,0x9B,0x04,0x65,0xEF,0x05,0x06,0xD7,0x0B,0x06,0x07,0xFC,0xA0,0x7F,0xFF, +0x0F,0x06,0x03,0x0C,0xA6,0x07,0x0C,0xA6,0x05,0x08,0xC4,0x05,0xEC,0xDA,0x07,0x11, +0x08,0xC4,0x07,0x0C,0xA4,0x05,0x0C,0xC4,0x03,0x08,0xC7,0x09,0x0C,0xA4,0x07,0xEC, +0xD9,0x0B,0xEF,0x08,0xC7,0x0B,0x0C,0xC7,0x03,0x08,0xC7,0x0D,0x0C,0xA7,0x09,0x0C, +0xA7,0x0B,0x0C,0xC7,0x05,0x0C,0xA7,0x0D,0x08,0xC7,0x0F,0x0C,0xA7,0x0F,0x0C,0xC7, +0x07,0xC0,0xE0,0x10,0x01,0xFC,0xA7,0x06,0xFC,0x10,0xC5,0x01,0x42,0xF7,0x35,0xF8, +0xC7,0x06,0xFC,0x1A,0xE5,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE6,0x06,0xFC,0x10,0xA7, +0x01,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x18,0xA7,0x2C,0xF0,0xC6,0x06,0xFC, +0x18,0xC7,0x10,0x0D,0x61,0x02,0x0D,0x41,0x06,0x9C,0x28,0x85,0x29,0xFC,0xA0,0x7F, +0xFF,0x0C,0xA7,0x0F,0x0C,0xA6,0x05,0x0C,0xA6,0x07,0x0C,0xA4,0x05,0x0C,0xA4,0x07, +0x0C,0xA7,0x09,0x0C,0xA7,0x0B,0x0C,0xA7,0x0D,0xE7,0xFF,0xFF,0x7B,0xFC,0xE0,0x7F, +0xFF,0xC0,0xA0,0x10,0x01,0xEC,0xE5,0x06,0xD7,0xFC,0xC5,0x06,0xD6,0x0C,0xE6,0x05, +0x0C,0xE6,0x07,0x0C,0xE6,0x03,0xC0,0xA0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xEC,0xE5, +0x07,0x11,0xF8,0x06,0x06,0xFC,0xFC,0x86,0x06,0xFC,0xFC,0xC5,0x07,0x10,0x0C,0xE6, +0x05,0x0C,0xE6,0x07,0x0C,0xE6,0x03,0xC0,0xA0,0x10,0x01,0xEC,0xE5,0x0B,0xEF,0xFC, +0xC5,0x0B,0xEE,0x0C,0xE6,0x0F,0x0C,0xE6,0x03,0x0C,0xE6,0x05,0x0C,0xE6,0x07,0x0C, +0xE6,0x09,0x0C,0xE6,0x0B,0x0C,0xE6,0x0D,0x98,0xE1,0x18,0xE4,0x01,0xC0,0xE0,0x10, +0x01,0xF8,0x07,0x06,0xF3,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07,0x21,0x85,0x29,0xC0, +0xE0,0x10,0x01,0xF0,0x87,0x08,0xD8,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x06,0xF3,0xC0, +0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xF3,0x67,0x07,0x21,0x4C,0x64,0x18,0xC0,0xE0, +0x10,0x01,0xFC,0xC6,0x08,0xEE,0xFC,0xE7,0x0B,0xF2,0xFC,0xA0,0x7F,0xFF,0x8C,0x67, +0x9B,0xA3,0x9B,0x8A,0xE4,0x00,0x01,0x35,0xD6,0xE4,0x00,0x92,0x0C,0xA7,0xFD,0x0C, +0xA7,0xFF,0x0C,0xA7,0x01,0x0C,0xA7,0x03,0x8A,0xE4,0x0B,0x07,0x00,0xC3,0x0F,0xFF, +0xE4,0x20,0x00,0x41,0x0B,0x06,0x01,0x0F,0x07,0x01,0x0B,0x06,0x03,0xE4,0x00,0x00, +0x1B,0x0B,0x07,0xFD,0x0F,0x07,0x01,0x0B,0x07,0xFF,0x0F,0x07,0x03,0x5C,0x80,0x29, +0x0B,0x06,0x01,0x0F,0x07,0xFD,0x0B,0x46,0x02,0x0F,0x47,0xFF,0x4B,0x60,0x12,0x0B, +0x27,0x00,0xC3,0x20,0xFF,0xEC,0x20,0x01,0x0D,0x5F,0xD8,0x06,0xC3,0xC0,0xFF,0xEC, +0x20,0x00,0xE5,0x0B,0x07,0x02,0xC3,0x00,0xFF,0xEC,0x20,0x00,0xBD,0xC3,0x40,0xFF, +0xEC,0x20,0x00,0xA1,0x43,0xDE,0xCD,0x43,0xDE,0xEB,0x43,0xDE,0xE0,0x8F,0x3E,0x0F, +0x27,0xFD,0x0F,0x26,0x01,0x43,0x5A,0xC5,0x43,0x5A,0xEB,0x43,0x5A,0xE0,0x8F,0x1A, +0x5F,0x18,0x06,0x0F,0x07,0xFF,0x0F,0x06,0x03,0x9C,0xE8,0x1C,0xC6,0x1C,0xD4,0xE3, +0xFB,0x56,0xC0,0xE0,0x10,0x01,0xFA,0xE7,0x06,0xF3,0xC0,0xE0,0x10,0x01,0xFB,0x67, +0x07,0x21,0x85,0x29,0xFC,0x21,0xFF,0x48,0xED,0x41,0x00,0xB0,0xED,0x61,0x00,0xAC, +0xED,0x81,0x00,0xA8,0xED,0xA1,0x00,0xA4,0xED,0xC1,0x00,0xA0,0xED,0xE1,0x00,0x9C, +0xEE,0x01,0x00,0x98,0xEE,0x21,0x00,0x94,0xEE,0x41,0x00,0x90,0xEE,0x61,0x00,0x8C, +0xEE,0x81,0x00,0x88,0xEE,0xA1,0x00,0x84,0xEE,0xC1,0x00,0x80,0xC2,0xA0,0x10,0x01, +0xC2,0x80,0x10,0x01,0xC2,0x60,0x10,0x01,0xED,0x21,0x00,0xB4,0x8A,0xC3,0xFE,0xB5, +0x0B,0x14,0xFE,0x94,0x02,0x66,0xFE,0x73,0x02,0xBA,0x99,0x60,0x99,0x40,0x99,0xC0, +0xC2,0x40,0x10,0x01,0x1D,0xA1,0x04,0x52,0x20,0x12,0x9A,0x08,0xFD,0x80,0x7F,0xFF, +0x1D,0xE1,0x64,0xE4,0x00,0x02,0xEF,0x22,0xC4,0x5A,0x44,0xE6,0x86,0x5D,0xC6,0x08, +0x5C,0xE7,0x08,0x9D,0xDF,0x9C,0xFF,0x45,0xCE,0x3D,0x4D,0xCE,0xF9,0x10,0xE4,0x00, +0xFE,0xE1,0x00,0x80,0x8E,0xE7,0x21,0xC4,0xAA,0x12,0xF7,0xFC,0xFC,0x61,0x00,0x80, +0x4F,0x57,0x18,0x8F,0x47,0x4F,0x5A,0x08,0x8F,0x43,0x0D,0x9A,0x85,0x4E,0xF7,0x18, +0x9E,0xE4,0x8E,0xE7,0x4E,0xF7,0x08,0x8E,0xE3,0x0D,0x97,0x85,0xE4,0x00,0x00,0x5B, +0x12,0xF7,0xFC,0xFF,0x81,0x00,0x80,0x4F,0x57,0x18,0x0B,0x65,0x01,0x8F,0x47,0x4F, +0x5A,0x08,0x8F,0x5C,0x0F,0x7A,0x85,0x4E,0xF7,0x18,0x0B,0x45,0x03,0x9E,0xE4,0x8E, +0xE7,0x4E,0xF7,0x08,0x8E,0xFC,0x0F,0x57,0x85,0xFC,0x61,0x00,0x80,0x8C,0xE3,0x12, +0xE7,0xFC,0x9E,0xE1,0x1A,0xE7,0xFC,0x9C,0xC1,0x9C,0xA4,0x5C,0xC6,0x00,0x9C,0x82, +0xD0,0xC9,0xFB,0xBE,0x98,0xE0,0xE4,0x00,0x01,0x5F,0xD0,0xA6,0x01,0x82,0x0B,0xC4, +0x08,0x0B,0x44,0x00,0x1F,0xA5,0x01,0x8F,0x5E,0xFC,0x61,0x00,0x80,0x0F,0x57,0x00, +0x4F,0xC6,0x10,0x1C,0x84,0x10,0x8F,0xC3,0x9E,0xE4,0x0F,0xDE,0xE6,0x5F,0xDA,0x15, +0x48,0xC6,0x28,0x5C,0xBD,0x00,0xD7,0x85,0xFE,0xA5,0xFC,0x81,0x00,0x80,0x4C,0xA6, +0x18,0x4C,0xC6,0x08,0x8C,0xA7,0x4C,0xA5,0x08,0x8C,0xA4,0x08,0x85,0x84,0x5C,0x98, +0x11,0x20,0x00,0x71,0xFC,0xA1,0x00,0x80,0x9C,0xC1,0x4C,0xC6,0x10,0x8C,0xC7,0x4C, +0xC6,0x08,0x8C,0xC5,0x08,0xA6,0x84,0x5C,0xB8,0x11,0x20,0x00,0x1F,0x98,0xA0,0x98, +0x80,0x88,0xD9,0x8B,0x58,0x9A,0xE0,0x1F,0xA4,0x2A,0x1F,0x85,0x2A,0x9E,0xE1,0x13, +0xDA,0x00,0x5E,0xF7,0x00,0xD7,0xDB,0x01,0x16,0x5F,0xAA,0x9B,0x20,0x00,0x6D,0x5F, +0x8A,0x9B,0x20,0x00,0x55,0x0B,0xC6,0x01,0x43,0xDE,0x25,0x0F,0xC6,0x01,0x0B,0xC6, +0x03,0x43,0xDE,0x2D,0x0F,0xC6,0x03,0x9F,0x42,0x9C,0xC4,0xD2,0xE9,0xFE,0x96,0x9C, +0xE1,0xD0,0xE4,0x01,0x8A,0x40,0xC7,0x9C,0x4C,0x87,0x08,0x13,0x86,0x00,0x0C,0x01, +0x64,0x0C,0x01,0x68,0x0C,0x01,0x6C,0x0C,0x01,0x70,0x0C,0x01,0x74,0x0C,0x01,0x78, +0x4F,0x9C,0x09,0x8C,0x8D,0x5F,0x67,0x00,0x8A,0xEF,0x98,0xA0,0x98,0xC0,0xE7,0xFF, +0xFE,0xB1,0x9D,0x41,0x1D,0x6B,0x12,0x21,0x48,0xC0,0x98,0x80,0x50,0xA0,0x60,0x18, +0x01,0x7C,0x18,0x01,0x7D,0x18,0x01,0x7E,0x18,0x01,0x7F,0xEC,0xF2,0x00,0x7E,0x88, +0x6D,0x84,0xE8,0x4F,0x2B,0x08,0x43,0x0A,0x8B,0x8F,0x35,0x8F,0x14,0x88,0xB9,0x88, +0x98,0x98,0xC0,0xE7,0xFF,0xFC,0xC9,0xEE,0xC1,0x00,0x82,0xEE,0xA1,0x00,0x86,0xEE, +0x81,0x00,0x8A,0xEE,0x61,0x00,0x8E,0xEE,0x41,0x00,0x92,0xEE,0x21,0x00,0x96,0xEE, +0x01,0x00,0x9A,0xED,0xE1,0x00,0x9E,0xED,0xC1,0x00,0xA2,0xED,0xA1,0x00,0xA6,0xED, +0x81,0x00,0xAA,0xED,0x61,0x00,0xAE,0xED,0x41,0x00,0xB2,0xED,0x21,0x00,0xB6,0xFC, +0x21,0x00,0xB8,0x85,0x29,0xC3,0x80,0x10,0x01,0x1C,0x21,0xE8,0xC0,0xE0,0x10,0x01, +0x0D,0x41,0x14,0x0D,0x61,0x10,0x0D,0x81,0x0C,0x0D,0xA1,0x08,0x0D,0xC1,0x04,0xFC, +0xE7,0x04,0xEA,0xF1,0x7C,0x08,0xD8,0x0B,0x27,0x16,0x53,0x80,0x1C,0x08,0xA7,0x06, +0x08,0xC7,0x0E,0xCA,0xE0,0x07,0xFF,0x0B,0x47,0x14,0x08,0x87,0x02,0x0B,0x67,0x0C, +0x41,0xD7,0xCD,0x41,0x6B,0xE3,0x41,0x85,0xD5,0x1F,0x1B,0x1E,0xC0,0xE0,0x10,0x01, +0x5F,0x18,0x06,0xFC,0xE7,0x08,0xF0,0x40,0x65,0xCD,0x41,0xB7,0x35,0x5D,0xCE,0x04, +0x8D,0x67,0x5F,0x5A,0x04,0x41,0x45,0x25,0x41,0x17,0x2D,0x43,0xC4,0x2D,0x43,0xA6, +0xC5,0x43,0x98,0x35,0xCB,0x20,0x07,0xFF,0xE4,0x00,0x00,0xC1,0x0A,0xE7,0xFE,0xD4, +0xB7,0x00,0x98,0x42,0xF7,0x25,0x42,0xEC,0xBB,0x42,0xF7,0x50,0x8E,0xFA,0xE4,0x00, +0x00,0x2D,0xD6,0xE8,0x00,0xA8,0x42,0xF9,0xBD,0x42,0xF7,0x25,0x42,0xE3,0xBB,0x42, +0xF7,0xF0,0x8E,0xEE,0x0E,0xE7,0xFF,0x0A,0xE7,0x00,0xD4,0xD7,0x00,0xA0,0x1E,0xF7, +0xE2,0x42,0xF7,0xDD,0x42,0xF7,0x33,0x42,0xF7,0xE8,0xE4,0x00,0x00,0x31,0xD6,0xED, +0x00,0xB8,0x42,0xF9,0xBD,0x42,0xF7,0xC5,0x42,0xF7,0x33,0x42,0xF7,0xE0,0xFE,0xF7, +0x07,0xFF,0x0E,0xE7,0x01,0x1C,0xE7,0x1C,0xD4,0xEB,0xFD,0x26,0x0D,0xC1,0x06,0x0D, +0xA1,0x0A,0x0D,0x81,0x0E,0x0D,0x61,0x12,0x0D,0x41,0x16,0x1C,0x21,0x18,0x85,0x29, +0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04,0xEA,0x0A,0xE7,0x12,0x08,0xA7,0x16,0xC8,0xC0, +0x07,0xFF,0x08,0x87,0x14,0x43,0x46,0x25,0x43,0x5A,0x2D,0x08,0xA7,0x10,0x40,0xC6, +0x2D,0x43,0x26,0xBD,0xC2,0xE0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF3,0x17,0x08,0xD8, +0xFC,0xE7,0x08,0xEE,0x52,0xE0,0x1C,0xC8,0xC0,0x07,0xFF,0x42,0xF8,0xBB,0x8E,0xE7, +0xE4,0x00,0x00,0x4B,0x0B,0x07,0x00,0x43,0x18,0x25,0x43,0x18,0x33,0x43,0x18,0xD0, +0x0F,0x07,0x01,0x0B,0x07,0x02,0x43,0x18,0x2D,0x43,0x18,0x33,0x43,0x18,0xC8,0x0F, +0x07,0x03,0x1C,0xE7,0x1C,0xD4,0xF7,0xFE,0xFE,0x85,0x29,0xC0,0xF4,0x00,0x01,0xC8, +0xA7,0x79,0xE9,0xC8,0xE7,0x79,0xD0,0x10,0xA5,0x00,0xC0,0xC0,0x10,0x01,0xF8,0xA6, +0x04,0xD4,0x08,0x87,0x01,0xC0,0xE0,0x10,0x01,0x5C,0x84,0x00,0xC0,0xA0,0x10,0x01, +0xF8,0x87,0x04,0xD5,0xE8,0xE5,0x07,0x23,0xC8,0x80,0x7F,0xFF,0x44,0xE7,0x24,0xEC, +0xE5,0x07,0x23,0xD0,0x61,0x1B,0x66,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x04,0xCC,0x20, +0xC0,0x3A,0xFC,0xC0,0x80,0x00,0x44,0xE7,0x35,0xEC,0xE5,0x07,0x23,0xC0,0xA0,0x10, +0x01,0xC8,0xC0,0x07,0xFF,0xFC,0xE5,0x08,0xD8,0x08,0x87,0x19,0x40,0x86,0x25,0x0C, +0x87,0x19,0xF0,0xA5,0x08,0xD8,0x24,0xA4,0x55,0x08,0xA7,0x35,0x40,0xC6,0x2D,0x0C, +0xC7,0x35,0x08,0xC7,0x1D,0x40,0xC0,0x35,0x0C,0xC7,0x1D,0xC0,0xC0,0x10,0x01,0xFC, +0xE6,0x08,0xD8,0xF0,0xC6,0x08,0xD8,0xD0,0xC1,0x05,0x29,0x08,0xC7,0x16,0x98,0xE0, +0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,0x80,0x7F,0xFF,0xE8,0xE7,0x0C,0x13,0x5C, +0xC7,0x15,0x44,0xC6,0x24,0x48,0xE6,0x38,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,0xD8, +0x0C,0xE6,0x13,0x08,0xC6,0x18,0x98,0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8, +0xA0,0x7F,0xFF,0xE8,0xE7,0x0C,0x15,0x5C,0xC7,0x15,0x44,0xC6,0x2C,0x48,0xE6,0x38, +0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,0xD8,0x0C,0xE6,0x15,0x08,0xC6,0x32,0x98,0xE0, +0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,0x80,0x7F,0xFF,0xE8,0xE7,0x0C,0x13,0x5C, +0xC7,0x15,0x44,0xC6,0x24,0x48,0xE6,0x38,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08,0xD8, +0x0C,0xE6,0x2F,0x08,0xC6,0x34,0x98,0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8, +0xA0,0x7F,0xFF,0xE8,0xE7,0x0C,0x15,0x5C,0xC7,0x15,0x44,0xC6,0x2C,0x48,0xE6,0x38, +0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x09,0x09,0xE4,0x00,0x00,0xA3,0x08,0xC7,0x16,0x98, +0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01,0xC8,0x80,0x7F,0xFF,0xE8,0xE7,0x0C,0x13, +0x5C,0xC7,0x15,0x44,0xC6,0x24,0x48,0xE6,0x38,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x08, +0xD8,0x0C,0xE6,0x13,0x08,0xC6,0x18,0x98,0xE0,0x24,0xDC,0x60,0xC0,0xE0,0x10,0x01, +0xC8,0xA0,0x7F,0xFF,0xE8,0xE7,0x0C,0x15,0x5C,0xC7,0x15,0x44,0xC6,0x2C,0x48,0xE6, +0x38,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x08,0xED,0xC0,0xE0,0x10,0x01,0x53,0x20,0x1C, +0xF0,0xC7,0x08,0xD8,0x9B,0x0F,0xC0,0xE0,0x10,0x01,0x43,0x26,0xCB,0xFC,0xE7,0x08, +0xEC,0xFE,0xE0,0x07,0xF0,0x8F,0x27,0x98,0x8A,0xFC,0xA0,0x07,0xF5,0xE4,0x00,0x00, +0x6B,0x0B,0x47,0xFF,0xD3,0x4E,0x00,0x3D,0x0F,0x07,0xFF,0x0B,0x47,0xFF,0xC3,0x40, +0xFE,0x0A,0x20,0x00,0x19,0x0E,0xE7,0xFF,0x0B,0x47,0x01,0xD3,0x49,0x00,0x3D,0x0C, +0x87,0x01,0x0B,0x47,0x01,0xC3,0x40,0xFE,0xAA,0x20,0x00,0x19,0x0C,0xA7,0x01,0x1C, +0xE7,0x1C,0xD4,0xF9,0xFE,0x7E,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0x24,0xC4, +0x7D,0x08,0xA7,0x2F,0x08,0xC7,0x13,0x40,0xC5,0x35,0x08,0xA7,0x31,0x0C,0xC7,0x1B, +0x08,0xC7,0x15,0x40,0xC5,0x35,0x0C,0xC7,0x1D,0xE4,0x00,0x00,0x15,0x0C,0x07,0x1D, +0x0C,0x07,0x1B,0xC0,0xE0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xF0,0xE7,0x04,0xD4,0xFC, +0xC5,0x0B,0x60,0xD0,0xE0,0x04,0x86,0x50,0xE0,0x52,0xC0,0x80,0x10,0x01,0xF8,0xE5, +0x0B,0x60,0xFC,0xE4,0x08,0xD8,0x0A,0xE7,0x13,0x1A,0xE6,0x02,0x4E,0xF7,0x41,0x08, +0xA7,0x15,0x4E,0xF7,0x20,0x18,0xA6,0x03,0x4C,0xA5,0x41,0x54,0xA5,0x0F,0x44,0xB7, +0x2D,0x18,0xA6,0x01,0xF0,0xA4,0x08,0xD8,0x24,0xA4,0xAD,0x08,0xA7,0x1C,0x94,0x8F, +0x18,0xA6,0x06,0xC8,0x84,0xFF,0xF0,0x08,0xE7,0x1A,0x4C,0xA5,0x42,0x18,0xE6,0x05, +0x54,0xA5,0x0F,0x4C,0xE7,0x21,0x44,0xE7,0x24,0x44,0xE7,0x2D,0x18,0xE6,0x04,0xE4, +0x00,0x00,0x1B,0x18,0x06,0x06,0x18,0x06,0x04,0x18,0x06,0x05,0xC0,0xE0,0x10,0x01, +0x98,0xC0,0xFC,0xE7,0x0B,0x60,0x1C,0xA7,0x07,0x10,0x87,0x00,0x9C,0xE1,0x8C,0xC4, +0xD4,0xE5,0xFF,0xCE,0x40,0xC0,0x35,0xC0,0xE0,0x10,0x01,0xF8,0xC7,0x0B,0x67,0xE4, +0x00,0x01,0xDD,0x88,0xA6,0xFC,0xE6,0x00,0x82,0x18,0x06,0x00,0x9C,0xC1,0xD4,0xC7, +0xFF,0xDE,0xC0,0xC0,0x10,0x01,0xF2,0xE6,0x08,0xD8,0x4C,0x97,0x20,0x50,0x84,0x02, +0xFC,0xC6,0x08,0xD8,0xC3,0x40,0x10,0x01,0xFC,0xFA,0x0B,0x60,0x18,0x87,0x12,0x08, +0x86,0x1C,0x18,0x87,0x10,0x0B,0x26,0x13,0x1B,0x27,0x02,0x0B,0x06,0x15,0x1B,0x07, +0x04,0x08,0xC6,0x1A,0x18,0xC7,0x0E,0x4C,0xC6,0x41,0x53,0x60,0x62,0x18,0xC7,0x0D, +0x4F,0x39,0x41,0x4F,0x18,0x41,0x1B,0x27,0x01,0x1B,0x07,0x03,0x56,0xF7,0x01,0x4C, +0x84,0x41,0x52,0xF7,0x20,0x18,0x87,0x0F,0x1A,0xE7,0x11,0xFB,0x7A,0x0B,0x60,0x1C, +0xC5,0x1F,0x98,0xE0,0x10,0x85,0x00,0x9C,0xA1,0x8C,0xE4,0xD4,0xA6,0xFF,0xCE,0x40, +0xE0,0x3D,0xC0,0xC0,0x10,0x01,0xC0,0xA0,0x10,0x01,0xF8,0xE6,0x0B,0x7F,0xC3,0x20, +0x10,0x01,0xC0,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xFC,0xE7,0x0B,0x80,0xFC,0xA5, +0x0A,0x7C,0xFF,0x39,0x09,0xE4,0xFF,0x18,0x0B,0x14,0x98,0xC0,0xC2,0xE0,0x10,0x01, +0xF0,0x97,0x04,0xD5,0x20,0x84,0x38,0xD0,0x84,0x00,0xDA,0x40,0x86,0xC4,0xE4,0x00, +0x00,0x0F,0x40,0x86,0xCC,0x08,0x84,0x00,0x18,0x87,0x01,0x4C,0x84,0x41,0xE4,0x00, +0x00,0x21,0x0C,0x85,0x02,0x4F,0x44,0x42,0x4C,0x84,0x82,0x1B,0x47,0x01,0x18,0x87, +0x00,0x9C,0xC2,0x9C,0xE2,0x9C,0xA4,0x5C,0xC9,0x89,0x23,0xFF,0x19,0xC0,0xE0,0x10, +0x01,0x98,0xC1,0xE8,0xE7,0x07,0x22,0xD0,0xFF,0x10,0x54,0xE4,0x00,0x03,0xFD,0xD0, +0x60,0x05,0x96,0xF0,0x86,0x04,0xD4,0xC0,0xA0,0x10,0x01,0xFC,0xC5,0x0B,0x60,0x20, +0x80,0xFE,0x9A,0xFF,0x88,0x86,0x18,0x06,0x05,0x1A,0xE6,0x06,0x1A,0xE6,0x01,0x1A, +0xE6,0x02,0x1A,0xE6,0x03,0x1A,0xE6,0x04,0x50,0xC0,0x52,0xF8,0xC5,0x0B,0x60,0x1C, +0xA4,0x07,0x98,0xC0,0x12,0xE4,0x00,0x9C,0x81,0x8C,0xD7,0xD4,0x85,0xFF,0xCE,0x40, +0xC0,0x35,0xC0,0xA0,0x10,0x01,0xF8,0xC5,0x0B,0x67,0xE4,0x00,0x00,0x99,0x88,0xA6, +0xFC,0x86,0x00,0x82,0x18,0x06,0x00,0x9C,0xC1,0xD4,0xC4,0xFF,0xDE,0x50,0x80,0x62, +0xC0,0xC0,0x10,0x01,0x9A,0xFF,0xF8,0x86,0x0B,0x60,0xC0,0xC0,0x10,0x01,0x1C,0x85, +0x1F,0xFC,0xC6,0x0B,0x61,0x1A,0xE6,0x00,0x9C,0xC1,0xD4,0xC4,0xFF,0xDE,0x98,0xC0, +0x12,0xE5,0x00,0x9C,0xA1,0x8C,0xD7,0xD4,0xA4,0xFF,0xCE,0x40,0xC0,0x35,0xC0,0xA0, +0x10,0x01,0xF8,0xC5,0x0B,0x7F,0xC0,0xC0,0x10,0x01,0xFC,0xA0,0x80,0x00,0xEC,0x06, +0x06,0xE4,0x44,0xE7,0x2D,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x07,0x23,0xE4,0x00,0x02, +0xA9,0xD0,0x62,0x0A,0x86,0xF0,0x86,0x04,0xD4,0xC0,0xA0,0x10,0x01,0xFC,0xC5,0x0B, +0x60,0x20,0x81,0x32,0x98,0x9F,0x18,0x86,0x06,0x18,0x86,0x01,0x18,0x86,0x02,0x18, +0x86,0x03,0x18,0x86,0x04,0x50,0x80,0x52,0xF8,0x85,0x0B,0x60,0xC0,0xA0,0x10,0x01, +0xF0,0xA5,0x06,0xBC,0x8A,0xE6,0x18,0xA6,0x05,0xC0,0xA0,0x10,0x01,0x98,0xC0,0xFC, +0xA5,0x0B,0x67,0x10,0x97,0x00,0x9E,0xE1,0x8C,0xC4,0xD6,0xE5,0xFF,0xCE,0x40,0xC0, +0x35,0xC0,0xA0,0x10,0x01,0xF8,0xC5,0x0B,0x67,0xE4,0x00,0x01,0x73,0x8B,0xA6,0xFC, +0x86,0x00,0x82,0x88,0xA6,0x18,0x05,0x00,0x9C,0xA1,0xD4,0xA4,0xFF,0xDE,0xC3,0x60, +0x10,0x01,0xC0,0x80,0x10,0x01,0xFC,0xBB,0x0B,0x60,0xF3,0x04,0x08,0xD8,0x4E,0xF8, +0x20,0x52,0xF7,0x02,0xFC,0x84,0x08,0xD8,0x1A,0xE5,0x12,0x53,0x80,0x62,0x0A,0xE4, +0x1C,0x57,0x18,0x01,0x1A,0xE5,0x10,0x53,0x18,0x20,0x0B,0x44,0x13,0x4E,0xF7,0x41, +0x1B,0x45,0x02,0x1F,0xBD,0x1F,0x0B,0x24,0x15,0x4F,0x5A,0x41,0x1B,0x25,0x04,0x4F, +0x39,0x41,0x08,0x84,0x1A,0x1B,0x45,0x01,0x18,0x85,0x0E,0x1B,0x25,0x03,0x1B,0x05, +0x11,0x4C,0x84,0x41,0x1A,0xE5,0x0F,0x18,0x85,0x0D,0xFB,0x9B,0x0B,0x60,0x98,0xA0, +0x10,0x86,0x00,0x9C,0xC1,0x8C,0xA4,0xD4,0xDD,0xFF,0xCE,0x40,0xA0,0x2D,0xC0,0xC0, +0x10,0x01,0xC2,0xE0,0x10,0x01,0xF8,0xA6,0x0B,0x7F,0xFE,0xF7,0x0B,0x60,0xC0,0xA0, +0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xA5,0x0B,0x14,0xFC,0xC6,0x0B,0x80,0x08,0x85, +0x00,0x18,0x86,0x01,0x4C,0x84,0x41,0x18,0x86,0x00,0x9C,0xA2,0x9C,0xC2,0xD4,0xB7, +0xFF,0x86,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x04,0xCD,0x20,0xC0,0x78,0x20,0xC4,0xAA, +0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x0B,0x65,0x5C,0xC8,0x01,0x20,0x00,0x35,0xC0,0xC0, +0x10,0x00,0x20,0x00,0x19,0x20,0xC0,0x4A,0xFC,0xC0,0x80,0x00,0x44,0xE7,0x35,0xC0, +0xC0,0x10,0x01,0xEC,0xE6,0x07,0x23,0x98,0xC2,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06, +0xE4,0x85,0x29,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xA5,0x02,0xC2,0xFC, +0xE7,0x02,0xC4,0xC0,0xC0,0x10,0x01,0x20,0x60,0x64,0xF2,0xE6,0x06,0xBE,0xC0,0x80, +0x10,0x01,0x8E,0xE5,0xFC,0x84,0x0B,0x14,0x98,0x61,0x98,0xC3,0xE4,0x00,0x00,0xB7, +0xF2,0xE6,0x06,0xBE,0xC0,0x80,0x10,0x01,0x8E,0xE5,0xFC,0x84,0x0B,0x14,0x98,0x61, +0xE4,0x00,0x00,0x49,0x08,0xC7,0x00,0x13,0x05,0x00,0x4F,0x26,0xF9,0x4F,0x18,0x08, +0x8C,0xD9,0x8F,0x04,0x4C,0xC6,0x0A,0x0B,0x18,0x00,0x9C,0xE2,0x5F,0x06,0x15,0x9C, +0xA1,0x48,0x63,0x00,0xD4,0xB7,0xFF,0x06,0xE4,0x00,0x00,0x47,0x13,0x05,0x00,0x4F, +0x18,0x08,0x8F,0x04,0x9C,0xA1,0x0B,0x38,0x00,0x0B,0x07,0x00,0x9C,0xE2,0x43,0x18, +0x30,0x5F,0x19,0x15,0x48,0x63,0x00,0xD4,0xB7,0xFF,0x2E,0x85,0x29,0xC0,0xE0,0x10, +0x01,0xC0,0x80,0x10,0x01,0xF3,0x47,0x06,0xBE,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10, +0x01,0xC3,0x20,0x10,0x01,0xF0,0xE7,0x06,0xBC,0xFC,0x84,0x02,0xC4,0xFC,0xA5,0x0B, +0x14,0xFF,0x39,0x02,0xC2,0x98,0xC0,0x9B,0x01,0xE4,0x00,0x00,0x4D,0x42,0xE6,0xCC, +0x12,0xF7,0x00,0x4E,0xF7,0x08,0x8E,0xE5,0x0B,0x77,0x00,0x0A,0xE4,0x00,0xD7,0x77, +0x05,0x1C,0x4E,0xF8,0x34,0x46,0xF7,0xBF,0x44,0xE7,0xBC,0x9C,0xC1,0x9C,0x82,0x5F, +0x66,0x00,0xC2,0xE0,0x10,0x01,0xD7,0x5B,0xFE,0xBD,0xC0,0xC0,0x10,0x01,0xF0,0x97, +0x02,0xC2,0xF8,0xE6,0x06,0xBC,0x4C,0x84,0x08,0x8C,0x85,0x0B,0x24,0x00,0xC0,0x80, +0x10,0x01,0xEB,0x04,0x02,0xC4,0x4F,0x58,0xF9,0x8F,0x1A,0x4F,0x18,0x0A,0xD7,0x38, +0x01,0x60,0xFE,0xF7,0x02,0xC2,0x12,0xF7,0x01,0x4E,0xF7,0x08,0xFC,0x84,0x02,0xC4, +0x8C,0xB7,0x08,0x84,0x02,0x08,0xA5,0x00,0x4E,0xE4,0xF9,0x8C,0x97,0x4C,0x84,0x0A, +0xD4,0xA4,0x00,0x50,0x98,0xE4,0xE4,0x00,0x00,0x1B,0x98,0xBB,0xC0,0xC0,0x10,0x01, +0x44,0xE7,0x2C,0xF8,0xE6,0x06,0xBC,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x06,0xBC,0xC0, +0xE0,0x10,0x01,0x20,0xC0,0x38,0xE8,0xC7,0x07,0x23,0x50,0xC6,0x10,0xE4,0x00,0x00, +0x1D,0xE8,0xC7,0x07,0x23,0x1C,0xA0,0xEF,0x44,0xC6,0x2C,0xEC,0xC7,0x07,0x23,0x85, +0x29,0x4E,0xF8,0x34,0x44,0xF7,0x3D,0x5C,0xE7,0x00,0xE7,0xFF,0xFE,0xC3,0x9C,0x38, +0x0D,0x41,0x00,0x0D,0x21,0x04,0xE7,0xFF,0xFE,0x0E,0xC1,0x40,0x10,0x01,0xEC,0xEA, +0x07,0x0E,0x20,0xE0,0x7E,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE0,0xC0,0xE0,0x10, +0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x10,0x20,0xE1,0xEC,0x98,0xE1,0xE4,0x00,0x00, +0x69,0x20,0xE4,0xE2,0xC0,0xC0,0x10,0x01,0xF0,0xE6,0x06,0xE0,0x9C,0xE1,0x5C,0xE7, +0x00,0xF8,0xE6,0x06,0xE0,0xC0,0xC0,0x10,0x01,0xE8,0xC6,0x07,0x23,0x54,0xC6,0x10, +0x20,0xC1,0x3C,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x07,0x06,0xD4,0xE6,0x02,0x41,0x98, +0xE2,0xEC,0xEA,0x07,0x0C,0xE4,0x00,0x00,0x7D,0x20,0xE8,0xB6,0xC0,0xE0,0x10,0x01, +0xF8,0x07,0x06,0xE0,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x10,0x20, +0xE0,0x44,0x0D,0x41,0x02,0x0D,0x21,0x06,0x98,0x62,0x9C,0x28,0xE7,0xFF,0xF0,0x9F, +0x98,0xE3,0xE7,0xFF,0xFF,0x9F,0x20,0xEC,0x36,0x98,0x60,0xE7,0xFF,0xF0,0x80,0xEC, +0x0A,0x07,0x0C,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x08,0xD0,0xE0,0x07, +0x12,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x06,0xE6,0xD0,0xE1,0x06,0xB2,0xC0,0xE0,0x10, +0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x08,0xD8,0xFC,0xC6,0x04,0xEA,0x08,0x87,0x18, +0x08,0xA6,0x0E,0xD4,0xA4,0x01,0x10,0x08,0xE7,0x16,0x08,0xC6,0x06,0xD4,0xE6,0x00, +0xC0,0xC8,0xA0,0x07,0xFF,0x40,0xC5,0x35,0xD4,0xC7,0x00,0x68,0x98,0x60,0xE7,0xFF, +0xFB,0x0A,0x20,0x61,0x92,0xC0,0x80,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFC,0x84,0x08, +0xD8,0xFE,0xF7,0x04,0xEA,0xCB,0x00,0x07,0xFF,0x08,0xB7,0x0E,0x08,0xE4,0x18,0x40, +0xD8,0x2D,0xD4,0xE6,0x00,0xA8,0x08,0x84,0x16,0x0A,0xF7,0x06,0xD4,0x97,0x00,0x58, +0x42,0xF8,0xBD,0xD6,0xE4,0x01,0x9C,0xC0,0x80,0x10,0x01,0xC2,0xE0,0x10,0x01,0xE8, +0x84,0x08,0xEE,0xEA,0xF7,0x04,0xF0,0xD6,0xE4,0x00,0x60,0xD4,0xE5,0x00,0x40,0xD4, +0xC7,0x00,0xBC,0xCB,0x00,0x07,0xFF,0x42,0xF8,0xBD,0xD4,0x97,0x02,0x28,0xD4,0xE5, +0x02,0x08,0xD4,0xC7,0x01,0xE8,0xE7,0xFF,0xE4,0xEE,0xC0,0xE0,0x10,0x01,0x98,0xC3, +0xEC,0xC7,0x06,0xEC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE8,0xC0,0xE0,0x10,0x01, +0xF8,0x07,0x06,0xBD,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF0,0xC0,0xE0,0x10,0x01, +0x0D,0x21,0x06,0x98,0x66,0xF8,0x07,0x07,0x01,0x9C,0x28,0xE7,0xFF,0xDB,0x3F,0x0D, +0x21,0x06,0x9C,0x28,0x85,0x29,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF0,0xC5, +0x02,0xBA,0xF2,0xE7,0x02,0xBE,0xFC,0xA5,0x02,0xBA,0xFC,0xE7,0x02,0xBE,0x10,0xA5, +0x01,0x10,0x87,0x02,0x8C,0xC5,0x13,0x47,0x01,0x13,0x07,0x03,0x8F,0x57,0x8F,0x04, +0xC2,0xE0,0x10,0x01,0x5F,0x18,0x00,0xC0,0xA0,0x10,0x01,0x4C,0x98,0x08,0xFC,0xA5, +0x09,0xE4,0x5C,0xC6,0x00,0x5F,0x5A,0x00,0xFE,0xF7,0x08,0x78,0x8C,0x85,0x98,0xE0, +0xE4,0x00,0x00,0x41,0x0B,0x37,0x01,0xD4,0xC7,0x00,0x5D,0x0F,0x24,0x01,0xE4,0x00, +0x00,0x0F,0x0F,0x25,0x01,0x9C,0xE1,0x9E,0xE2,0x5C,0xE7,0x00,0x9C,0x82,0x9C,0xA2, +0xD7,0x47,0xFF,0x25,0x4C,0xC6,0x08,0x4F,0x18,0x08,0xC0,0xE0,0x10,0x01,0xC0,0xA0, +0x10,0x01,0xFC,0xE7,0x08,0xA8,0xFC,0xA5,0x09,0xE4,0x8F,0x07,0x8C,0xC5,0xE4,0x00, +0x00,0x1D,0x08,0xA7,0x01,0x9C,0xE2,0x0C,0xA6,0x01,0x9C,0xC2,0xD4,0xF8,0xFF,0xB6, +0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC0,0xE0,0x10,0x01,0xF0,0xC7, +0x04,0xDC,0x20,0xC4,0x46,0x98,0x60,0xF8,0x07,0x04,0xDC,0xE7,0xFF,0xED,0x00,0xE7, +0xFF,0xD6,0x10,0xE7,0xFF,0xFE,0x86,0x98,0x67,0xE7,0xFF,0xD9,0xA2,0xC0,0xE0,0x10, +0x01,0xC1,0x40,0x10,0x01,0xF0,0x87,0x0C,0x0C,0xFD,0x4A,0x0B,0x14,0x98,0xC0,0x88, +0xEA,0xE4,0x00,0x00,0x35,0x9C,0xC1,0x08,0xA7,0x00,0x5C,0xC6,0x00,0x5C,0xB0,0x31, +0x20,0x00,0x4D,0x5C,0xAF,0xD9,0x9C,0xE2,0x20,0x00,0x2D,0xD4,0x86,0xFF,0x55,0xE4, +0x00,0x01,0xEB,0x98,0x61,0xE7,0xFF,0xD9,0x2A,0xC0,0xE0,0x10,0x01,0xC0,0x80,0x10, +0x01,0xF0,0xC7,0x07,0x18,0xF0,0xA4,0x07,0x00,0x9C,0xC1,0x5C,0xC6,0x00,0xF8,0xC7, +0x07,0x18,0x1C,0xE5,0x01,0x5C,0xE7,0x00,0xF8,0xE4,0x07,0x00,0xD0,0xEA,0x00,0xC5, +0x5C,0xC2,0x9B,0x20,0x00,0x45,0xC0,0xC0,0x10,0x01,0xF2,0xE6,0x0C,0x0C,0x98,0xC0, +0xE4,0x00,0x00,0xC3,0x98,0xC1,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0x84,0xC0,0xE0, +0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0x80,0xFF,0x7F,0xF8,0x06,0x07,0x00,0xE8,0xC7, +0x07,0x23,0x44,0xC6,0x24,0xEC,0xC7,0x07,0x23,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07, +0x18,0xC0,0xE0,0x10,0x01,0x1C,0xA0,0xEF,0xEC,0x07,0x06,0xEC,0xC0,0xF4,0x00,0x01, +0xC8,0xE7,0x7A,0x10,0x0C,0xC7,0x02,0xE4,0x00,0x00,0xBB,0x9C,0xC1,0x08,0x8A,0x00, +0x5C,0xC6,0x00,0x5C,0x98,0x11,0x20,0x00,0x4D,0x5C,0x87,0xF9,0x9D,0x42,0x20,0x00, +0x2D,0xD6,0xE6,0xFF,0x55,0xE4,0x00,0x00,0x1F,0x20,0xE0,0x2C,0xC0,0xE0,0x10,0x01, +0xF8,0xA7,0x07,0x00,0xC0,0xF4,0x00,0x01,0xFC,0x80,0x80,0x00,0xC8,0xC7,0x26,0x18, +0x08,0xA6,0x01,0x44,0xA5,0x25,0x5C,0xA5,0x04,0x0C,0xA6,0x01,0xC8,0xC7,0x24,0x28, +0x08,0xA6,0x01,0x50,0xA5,0x01,0xC8,0xE7,0x7A,0x10,0x0C,0xA6,0x01,0xFC,0xA0,0xFE, +0xFF,0x0C,0xC7,0x02,0x44,0xC6,0x2C,0x0C,0xC7,0x00,0x0D,0x41,0x02,0x0D,0x21,0x06, +0x9C,0x28,0x85,0x29,0x98,0x65,0xE7,0xFF,0xFE,0x1F,0xC0,0xE0,0x10,0x01,0xFC,0xE7, +0x0C,0x0C,0xC0,0xC0,0x10,0x01,0x10,0x87,0x01,0x10,0xA7,0x04,0xFC,0xC6,0x09,0x4C, +0xC0,0xE0,0x10,0x01,0x42,0xE4,0x2B,0xFC,0xE7,0x0B,0x14,0x5E,0xF7,0x00,0x4E,0xF7, +0x10,0x8E,0xE7,0xE4,0x00,0x00,0x27,0x0B,0x27,0x02,0x0B,0x07,0x00,0x9C,0xE4,0x8F, +0x19,0x0F,0x06,0x00,0x9C,0xC4,0xD4,0xF7,0xFF,0x8E,0xC0,0xE0,0x10,0x01,0x40,0xA4, +0x2B,0xFF,0x07,0x09,0x4C,0x98,0xC0,0xE8,0xE7,0x09,0x4C,0xE4,0x00,0x00,0x37,0x1E, +0xE6,0x01,0x4C,0x86,0x10,0x5C,0xD7,0x00,0x8C,0x98,0x0E,0xE4,0x02,0x5E,0xE7,0x1D, +0x5E,0xF7,0x06,0x48,0xF7,0x38,0xD4,0xA6,0xFF,0x4C,0xC0,0xC0,0x10,0x01,0xEC,0xE6, +0x06,0xC3,0xC0,0xE2,0x32,0x88,0x20,0x00,0x8D,0xFC,0xC0,0x01,0x18,0xC0,0xE0,0x22, +0xEC,0x48,0xE7,0x30,0xC0,0xC0,0x10,0x01,0x5C,0xE7,0x06,0xFC,0xC6,0x04,0xEA,0x0C, +0xE6,0x2F,0x0C,0xE6,0x23,0xE4,0x00,0x00,0x75,0xC0,0xE0,0xAE,0xEC,0xC8,0xC0,0x01, +0x18,0x20,0x00,0x2F,0x98,0xC5,0x40,0xC7,0x30,0x5C,0xC6,0x06,0xC0,0xA0,0x10,0x01, +0xEC,0xC5,0x05,0x0D,0xC0,0xE0,0xAE,0xEC,0xC8,0xC0,0x01,0x18,0x20,0x00,0x2F,0x98, +0xC5,0x40,0xE7,0x30,0x5C,0xC7,0x06,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x05,0x19,0x85, +0x29,0x4C,0x63,0x10,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x0B,0x14, +0xFC,0xC6,0x09,0x4C,0x8C,0x67,0xE4,0x00,0x00,0x27,0x08,0x87,0x02,0x08,0xA7,0x00, +0x9C,0xE4,0x8C,0xA4,0x0C,0xA6,0x00,0x9C,0xC4,0xD4,0xE3,0xFF,0x8E,0x85,0x29,0x9C, +0x38,0x0D,0x41,0x04,0x0D,0x61,0x00,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x04,0xD4,0xD0, +0xE2,0x05,0x32,0xC0,0x80,0x10,0x01,0xFC,0xE4,0x0C,0x0C,0x10,0xE7,0x04,0x4C,0xA7, +0x08,0x4D,0x47,0x10,0x9C,0xFF,0x1F,0x25,0xFF,0x4F,0x47,0x08,0xC0,0xC0,0x10,0x01, +0x9D,0x5F,0xFC,0xC6,0x0B,0x14,0xF1,0x04,0x0C,0x0C,0x1F,0xC5,0x01,0x4F,0xB9,0x08, +0x98,0xE0,0x9B,0x0A,0x53,0x80,0x15,0x8A,0xE6,0x53,0x60,0x16,0xE4,0x00,0x00,0xC5, +0x24,0x84,0x6D,0xD4,0xFA,0x00,0xC2,0xD4,0xF9,0x00,0xA2,0xD4,0xE5,0x00,0x82,0xD4, +0xFE,0x00,0x62,0xD4,0xFD,0x00,0x42,0xD4,0xEA,0x02,0x1E,0x20,0x60,0xC6,0x20,0x84, +0x4E,0x08,0x97,0x02,0x40,0x84,0xC0,0x40,0x84,0xDB,0x0C,0x97,0x03,0xE4,0x00,0x00, +0x5B,0xD4,0xFA,0x00,0x8E,0x08,0x86,0x00,0x40,0x84,0xC0,0x40,0x84,0xE3,0xE4,0x00, +0x00,0x33,0x08,0x86,0x01,0x4C,0x84,0x08,0xE4,0x00,0x00,0x1F,0x08,0x86,0x00,0x4D, +0x64,0xF9,0x8C,0x8B,0x4C,0x84,0x0A,0x0C,0x86,0x01,0x9C,0xE1,0x9C,0xC2,0x5C,0x87, +0x00,0xD5,0x04,0xFC,0xFD,0x0D,0x61,0x02,0x0D,0x41,0x06,0x9C,0x28,0x85,0x29,0xC0, +0xE0,0x10,0x01,0xFC,0xA0,0xDF,0x3F,0xE8,0xC7,0x07,0x23,0x44,0xC6,0x2C,0xEC,0xC7, +0x07,0x23,0xC0,0xE0,0x10,0x01,0x1C,0x21,0xC0,0xF8,0x07,0x06,0xE9,0x0D,0x21,0x3C, +0x0D,0x41,0x38,0x0D,0x61,0x34,0x98,0x67,0x0D,0x81,0x30,0x0D,0xA1,0x2C,0xE7,0xFF, +0xD3,0x58,0x98,0x60,0xE7,0xFF,0xFE,0x16,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xCC, +0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xCD,0xC0,0xE0,0x10,0x01,0xC1,0x60,0x10,0x01, +0xF0,0x87,0x0C,0x10,0xFD,0x6B,0x0B,0x14,0xC0,0xE0,0x10,0x01,0x4E,0xE4,0x10,0xFC, +0xE7,0x09,0x4C,0x89,0x4B,0x43,0x17,0x5C,0x88,0xA7,0x88,0xCB,0xE4,0x00,0x00,0x27, +0x0B,0x46,0x02,0x0B,0x26,0x00,0x9C,0xC4,0x8F,0x3A,0x0F,0x25,0x00,0x9C,0xA4,0xD4, +0xD8,0xFF,0x8E,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x09,0x4C,0x8E,0xE6,0x98,0xC0,0xE4, +0x00,0x00,0x2B,0x0F,0x07,0x02,0x1C,0xA6,0x01,0x5F,0x0C,0x91,0x20,0x00,0x19,0x5C, +0xC5,0x04,0x9C,0xE4,0xD4,0xF7,0xFF,0x7E,0x9C,0x9D,0xD4,0x86,0x00,0xFC,0x98,0x61, +0xE7,0xFF,0xF0,0xE6,0x20,0x60,0x54,0xC0,0xC0,0x10,0x01,0x98,0xE1,0xF8,0xE6,0x04, +0xCC,0xC0,0xC0,0x10,0x01,0xF8,0xE6,0x04,0xCD,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10, +0x01,0xF0,0xC6,0x0C,0x0C,0x4C,0xC6,0x08,0xF0,0xA7,0x07,0x02,0x8D,0x46,0xC0,0xE0, +0x10,0x01,0x88,0xCB,0xE8,0xE7,0x07,0x23,0xE4,0x00,0x00,0x47,0x08,0x86,0x00,0xC0, +0x80,0x11,0x68,0x20,0x00,0x35,0xC8,0xE7,0x20,0x00,0x98,0xA0,0xE4,0x00,0x00,0x15, +0x5C,0x85,0x51,0x20,0x00,0x19,0x50,0xE7,0x40,0x9C,0xC2,0xD4,0xCA,0xFF,0x0E,0xC0, +0xC0,0x10,0x01,0xF8,0xA6,0x07,0x02,0xC0,0xC0,0x10,0x01,0xEC,0xE6,0x07,0x23,0xC0, +0xE0,0x10,0x01,0xE8,0xE7,0x00,0x4B,0x5C,0xE7,0x00,0xC0,0xE0,0x14,0x04,0x20,0x0D, +0x05,0xC0,0xE0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xE7,0x0C,0x0C,0xFC,0xC6,0x0B, +0x14,0x10,0x87,0x01,0x10,0xE7,0x04,0x40,0x87,0x23,0x88,0xA7,0xE4,0x00,0x00,0x55, +0x1F,0x01,0x28,0x42,0xE7,0x2D,0x4E,0xF7,0x10,0x8E,0xF8,0x4F,0x07,0x10,0x8F,0x06, +0x1F,0x47,0x01,0x0B,0x38,0x02,0x4F,0x07,0x10,0x5C,0xFA,0x00,0x8F,0x06,0x0B,0x18, +0x00,0x8F,0x19,0x0F,0x17,0xDC,0xD4,0x87,0xFE,0xD4,0x1E,0xE1,0x04,0x0C,0xA1,0x06, +0x1F,0x41,0x28,0x88,0xD7,0x98,0xE0,0x0C,0x86,0x02,0x5C,0x87,0x15,0x9C,0xC4,0x48, +0xE7,0x20,0x5C,0xA4,0x15,0x48,0xA5,0x20,0xD4,0xDA,0xFF,0x7E,0xC0,0xC0,0x10,0x01, +0xEC,0xC6,0x06,0xC6,0x1C,0x86,0xFC,0x24,0x84,0xF7,0xC0,0xA0,0x7D,0x08,0x20,0x02, +0x09,0xC3,0x00,0x10,0x01,0x4F,0x25,0x12,0xE8,0x98,0x05,0x31,0xD7,0x24,0x1D,0x58, +0x43,0x39,0x25,0x9B,0x6A,0x43,0x39,0xD8,0x8C,0x99,0xEC,0x98,0x05,0x31,0xE4,0x00, +0x07,0x33,0x40,0xA5,0x25,0x9B,0x2A,0x40,0xA5,0xC8,0x8C,0x85,0xEC,0x98,0x05,0x33, +0xE4,0x00,0x00,0xA1,0x5C,0xEB,0x51,0x20,0x00,0x5D,0xC0,0xA0,0x10,0x01,0xE8,0x85, +0x05,0x31,0xD4,0x87,0x00,0x60,0xEC,0xE5,0x05,0x31,0xE4,0x00,0x00,0x6D,0x5C,0xE8, +0xB9,0x20,0x00,0xBD,0x50,0x80,0x5A,0xC0,0xA0,0x10,0x01,0xEC,0x85,0x05,0x31,0xC0, +0xA0,0x10,0x01,0xE8,0x85,0x05,0x33,0xD4,0xE4,0x00,0x40,0xEC,0xE5,0x05,0x33,0x5C, +0xE6,0x39,0x20,0x00,0x39,0x50,0x80,0x46,0xC0,0xA0,0x10,0x01,0xEC,0x85,0x05,0x33, +0xC0,0xA0,0x10,0x01,0x4F,0xA7,0x12,0xEB,0x05,0x05,0x31,0x98,0x80,0x1F,0x98,0xF7, +0x4F,0x78,0x10,0x98,0xA0,0x1F,0xC4,0x01,0x0F,0x37,0x02,0xD7,0x99,0x00,0x38,0x5C, +0x9E,0x00,0xD7,0x67,0x00,0x40,0xD7,0x38,0x00,0x64,0xD7,0x3D,0x00,0x68,0xD7,0x38, +0x00,0x48,0x9C,0xA1,0x5C,0xA5,0x00,0x9E,0xE4,0xD6,0xFA,0xFE,0xE6,0xC0,0xE0,0x10, +0x01,0x0E,0xE1,0x0A,0xE8,0xE7,0x05,0x33,0xD6,0xE7,0x00,0x5C,0x0E,0xE1,0x22,0xD6, +0xE7,0x01,0x28,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x05,0x34,0xC2,0xE0,0x16,0x6E,0x20, +0x00,0x25,0x9E,0xE1,0xFA,0xE7,0x05,0x34,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,0x35, +0xE4,0x00,0x00,0x43,0xC0,0xE0,0x10,0x01,0xF2,0xE7,0x05,0x35,0xC2,0xE0,0x16,0x6E, +0x20,0x00,0x25,0x9E,0xE1,0xFA,0xE7,0x05,0x35,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05, +0x34,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x05,0x34,0x5C,0xE2,0x93,0x20,0x00,0x2D,0x98, +0xA6,0x98,0x80,0xE4,0x00,0x00,0x2D,0xD0,0xA4,0x00,0x95,0xC0,0xE0,0x10,0x01,0xF0, +0xE7,0x05,0x35,0x5C,0xE1,0x53,0x48,0x84,0x2A,0x20,0xC4,0x56,0xC0,0xE0,0x10,0x01, +0xF8,0x07,0x06,0xDF,0x98,0xC2,0xD0,0xA4,0x01,0x55,0xE4,0x00,0x03,0x93,0x20,0xC8, +0xE2,0xC1,0x40,0x10,0x01,0xD0,0xA4,0x01,0x39,0xF0,0xEA,0x06,0xDF,0x9C,0xE1,0x5C, +0xE7,0x00,0xF8,0xEA,0x06,0xDF,0xD0,0xE1,0x0D,0x69,0xF8,0x0A,0x06,0xDF,0x98,0xC3, +0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xC4,0xE4,0x00,0x03,0x37,0xF8,0x0A,0x06,0xDF, +0x98,0xC1,0xE7,0xFF,0xFF,0xDD,0x20,0xCC,0xE2,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x06, +0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,0x1C,0xE0,0x80,0xC1,0x80,0x10,0x01,0x98,0x62, +0xF8,0xEC,0x06,0xBC,0xE7,0xFF,0xE0,0x4E,0xF8,0x0C,0x06,0xBC,0xF0,0xEA,0x06,0xDF, +0xD0,0xE5,0x0B,0x49,0xF8,0x0A,0x06,0xDF,0x98,0xC4,0xE4,0x00,0x01,0xF3,0xD0,0xC4, +0x01,0x16,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xC4,0xD0,0x83,0x0A,0x49,0x98,0xC5, +0xEC,0xC7,0x06,0xC4,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xDF,0xE4,0x00,0x02,0x6F, +0xD0,0xC5,0x02,0x6E,0xC1,0x40,0x10,0x01,0x24,0x8C,0xED,0xF0,0xEA,0x06,0xDF,0x9C, +0xE1,0x5C,0xE7,0x00,0xF8,0xEA,0x06,0xDF,0xD0,0xE1,0x08,0xD9,0xC0,0xE0,0x10,0x01, +0x98,0xC6,0xEC,0xC7,0x06,0xC4,0x50,0xE0,0x40,0xC1,0x80,0x10,0x01,0x98,0x62,0xF8, +0xEC,0x06,0xBC,0xE7,0xFF,0xDF,0x70,0xF8,0x0C,0x06,0xBC,0xF8,0x0A,0x06,0xDF,0xE4, +0x00,0x01,0xF5,0xF8,0x0A,0x06,0xDF,0x98,0xC4,0xE7,0xFF,0xFE,0x8F,0xD0,0xC6,0x02, +0x0E,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x06,0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,0x50, +0xE0,0x40,0xC1,0x80,0x10,0x01,0x98,0x62,0xF8,0xEC,0x06,0xBC,0xE7,0xFF,0xDE,0xFE, +0xF8,0x0C,0x06,0xBC,0xF0,0xEA,0x06,0xDF,0xD0,0xE4,0x06,0x09,0x98,0xC1,0xC0,0xE0, +0x10,0x01,0xF8,0x0A,0x06,0xDF,0xEC,0xC7,0x06,0xC4,0xE4,0x00,0x01,0x2B,0xD0,0xC0, +0x05,0x2E,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x06,0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF, +0x50,0xE0,0x40,0xC1,0x80,0x10,0x01,0x98,0x62,0xF8,0xEC,0x06,0xBC,0xE7,0xFF,0xDE, +0x7C,0xF8,0x0C,0x06,0xBC,0xF0,0xEA,0x06,0xDF,0xD0,0xE4,0x04,0x01,0xC0,0xE0,0x10, +0x01,0xF8,0x0A,0x06,0xDF,0xF8,0x07,0x05,0x34,0x98,0xC1,0xC0,0xE0,0x10,0x01,0xF8, +0x07,0x05,0x35,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xC4,0xE4,0x00,0x00,0xBD,0xC1, +0x80,0x10,0x01,0xEC,0xEC,0x06,0xC6,0x20,0xE5,0x30,0xC1,0x40,0x10,0x01,0xF0,0xEA, +0x06,0xDF,0x9C,0xE1,0xF8,0xEA,0x06,0xDF,0x50,0xE0,0x40,0xC1,0xA0,0x10,0x01,0x98, +0x62,0xF8,0xED,0x06,0xBC,0xE7,0xFF,0xDD,0xCC,0xF8,0x0D,0x06,0xBC,0xF0,0xEA,0x06, +0xDF,0xD0,0xE4,0x01,0x41,0x98,0xE1,0xF8,0x0A,0x06,0xDF,0xEC,0xEC,0x06,0xC4,0xC0, +0xE0,0x10,0x01,0xF8,0x07,0x05,0x34,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,0x35,0xE4, +0x00,0x00,0x15,0x98,0xE0,0xE4,0x00,0x00,0x0D,0x98,0xE1,0xC0,0xC0,0x10,0x01,0xF8, +0xE6,0x06,0xE9,0x20,0xE0,0x1C,0xE7,0xFF,0xC6,0x62,0x98,0x61,0xE7,0xFF,0xD5,0xF0, +0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x04,0xE2,0xD0,0xE0,0x05,0x06,0xC0,0xE0,0x10,0x01, +0xF0,0xC7,0x0C,0x0C,0x98,0xE0,0xE4,0x00,0x00,0x29,0x08,0xAB,0x00,0x9C,0xE1,0x5C, +0xB8,0x11,0x5C,0xE7,0x00,0x9D,0x62,0x20,0x00,0x2D,0xD4,0xC7,0xFF,0x85,0xE4,0x00, +0x00,0xDD,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x07,0x02,0x9C,0xC1,0xF8,0xC7,0x07,0x02, +0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x06,0xC6,0x9C,0xFC,0x24,0xE4,0x2F,0xC0,0xE0,0x10, +0x01,0xF8,0x07,0x07,0x02,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x07,0x02,0x24,0xC9,0x2D, +0xC0,0xC0,0x10,0x01,0xF8,0x07,0x07,0x02,0xC0,0xE0,0x10,0x01,0xF8,0x06,0x07,0x00, +0xE8,0xC7,0x07,0x23,0x50,0xC6,0x80,0xEC,0xC7,0x07,0x23,0xC0,0xE0,0x10,0x01,0xF8, +0x07,0x07,0x18,0xE4,0x00,0x00,0x4B,0x98,0x86,0xC3,0x00,0x10,0x01,0x40,0xA5,0x20, +0xE8,0x98,0x05,0x33,0xD4,0xA4,0xE2,0xF4,0xE7,0xFF,0xF9,0x71,0xC0,0xE0,0x10,0x01, +0xF8,0x07,0x07,0x02,0xE7,0xFF,0xFF,0x39,0x0D,0xA1,0x2E,0x0D,0x81,0x32,0x0D,0x61, +0x36,0x0D,0x41,0x3A,0x0D,0x21,0x3E,0x1C,0x21,0x40,0x85,0x29,0xC0,0xC0,0x10,0x01, +0x50,0xE0,0x50,0x1C,0x21,0xC8,0xEC,0xE6,0x06,0xC1,0x0D,0x41,0x30,0x0D,0x61,0x2C, +0x0D,0x81,0x28,0x0D,0xC1,0x20,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E, +0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0x8A,0x46,0xC2,0xA0,0x10,0x01,0xC0,0xC0, +0x10,0x01,0xEC,0xF5,0x06,0xF5,0xC2,0x60,0x10,0x01,0x50,0xE0,0x1E,0xC2,0x20,0x10, +0x01,0xC1,0xC0,0x10,0x01,0xC2,0x00,0x10,0x01,0x0D,0x21,0x34,0x0D,0xA1,0x24,0x0D, +0xE1,0x1C,0x8A,0x86,0xEC,0xE6,0x07,0x09,0xEC,0xF3,0x06,0xD5,0xFD,0xCE,0x07,0x10, +0xFE,0x10,0x06,0xF1,0x99,0x40,0x51,0x80,0x1C,0xFD,0x71,0x08,0xD8,0xE4,0x00,0x02, +0xD3,0x4C,0xEA,0x10,0x8C,0xEE,0x08,0x87,0x00,0xC0,0x8F,0xFF,0xE0,0x20,0x04,0xF5, +0x08,0xA7,0x02,0xC0,0xAF,0xFF,0xE0,0x20,0x04,0xCD,0x42,0xEA,0x63,0x8E,0xEB,0x08, +0xF7,0x19,0x40,0xE5,0x3D,0x5C,0xE7,0x06,0x4C,0xC7,0xFA,0x09,0xF7,0x17,0x44,0xE6, +0x3E,0x41,0xE4,0x7D,0x40,0xE7,0x35,0x5D,0xEF,0x06,0x5C,0xE7,0x06,0x4C,0xCF,0xFA, +0xE9,0xB5,0x06,0xF5,0x45,0xE6,0x7E,0x41,0xEF,0x35,0x5D,0xEF,0x06,0xD4,0xED,0x01, +0x0C,0xE8,0xD2,0x06,0xC1,0xD5,0xE6,0x00,0xCC,0x40,0x8A,0x84,0x10,0xC4,0x00,0x5C, +0xC0,0x53,0x9C,0xC1,0x5C,0xC6,0x00,0x48,0xC6,0x1A,0xE4,0x00,0x00,0x2B,0x40,0x90, +0x54,0x10,0xC4,0x00,0x5C,0xC0,0x09,0x9C,0xDF,0x5C,0xC6,0x00,0x48,0xC6,0x00,0x18, +0xC4,0x00,0x40,0xD0,0x54,0x10,0xC6,0x00,0xD0,0xC2,0x06,0x11,0xE8,0xD3,0x06,0xD5, +0xD4,0xE6,0x00,0x84,0x40,0xEA,0x63,0x8C,0xEB,0x0C,0xA7,0x19,0xE4,0x00,0x00,0x93, +0xD4,0xED,0x02,0x2C,0x40,0x87,0x35,0x40,0xAD,0x35,0x40,0xE6,0x3D,0x40,0xA5,0x2B, +0x40,0xE7,0x23,0x8C,0xE5,0x40,0x6D,0x6B,0x40,0x63,0x3B,0x40,0x63,0x28,0xE7,0xFF, +0x37,0xFE,0x4C,0xEA,0x10,0x8C,0xEE,0x41,0xAD,0x1D,0x08,0xC7,0x02,0x40,0xEA,0x63, +0x8C,0xEB,0x08,0xA7,0x18,0xD4,0xC5,0x00,0x58,0x41,0xA6,0x6D,0xE4,0x00,0x00,0x0D, +0x8D,0xA6,0x0D,0xA7,0x19,0xE8,0xF4,0x07,0x09,0xD5,0xE7,0x00,0xC4,0x40,0xEA,0x63, +0x4C,0xCA,0x10,0x8C,0xEB,0x8C,0xCE,0x08,0xC6,0x01,0x0C,0xC7,0x17,0xE4,0x00,0x00, +0x9B,0xE9,0xB2,0x06,0xC1,0xD5,0xED,0x02,0x2C,0x40,0xAF,0x3D,0x40,0xCD,0x3D,0x40, +0xE7,0x7D,0x40,0xC6,0x33,0x40,0xE7,0x2B,0x8C,0xE6,0x40,0x6D,0x6B,0x40,0x63,0x3B, +0x40,0x63,0x30,0xE7,0xFF,0x37,0x34,0x4C,0xEA,0x10,0x8C,0xEE,0x41,0xAD,0x1D,0x08, +0xC7,0x00,0x40,0xEA,0x63,0x8C,0xEB,0x08,0xA7,0x16,0xD4,0xC5,0x00,0x58,0x41,0xA6, +0x6D,0xE4,0x00,0x00,0x0D,0x8D,0xA6,0x0D,0xA7,0x17,0x1C,0xAA,0x01,0x4C,0xEA,0x10, +0x40,0xCA,0x63,0x8C,0xEE,0x8C,0xCB,0x5D,0x45,0x00,0x08,0xA6,0x19,0x0C,0xA7,0x03, +0x08,0xC6,0x17,0x0C,0xC7,0x01,0xF0,0xF1,0x08,0xD8,0xD4,0xEA,0xF4,0xBD,0x0E,0xA1, +0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A, +0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D, +0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x30,0xC8,0xA0,0x7F,0xFF, +0x0D,0x61,0x04,0xC1,0x60,0x10,0x01,0xE8,0xEB,0x07,0x23,0x44,0xE7,0x2C,0x0D,0x41, +0x08,0xEC,0xEB,0x07,0x23,0x0D,0x21,0x0C,0xE7,0xFF,0xE7,0x0A,0xC1,0x40,0x10,0x01, +0xEC,0xEA,0x06,0xEE,0x20,0xE1,0x0E,0xE8,0xEB,0x07,0x23,0x54,0xE7,0x40,0x20,0xE0, +0x7C,0xE7,0xFF,0x36,0x0E,0x98,0x66,0xE7,0xFF,0xC3,0xE6,0xC0,0xE0,0x10,0x01,0xF8, +0x07,0x06,0xF0,0x98,0xE1,0xEC,0xEA,0x06,0xEC,0xE4,0x00,0x00,0x15,0x98,0x62,0xE7, +0xFF,0xC3,0xB6,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x04,0xDC,0xD0,0xC1,0x21,0x5E,0xF8, +0x07,0x04,0xDC,0xE4,0x00,0x08,0x47,0x20,0xE5,0x7A,0xE8,0xEB,0x07,0x23,0x54,0xC7, +0x08,0x20,0xC0,0x54,0xE7,0xFF,0xCC,0xB2,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xE8, +0x98,0xE2,0xE4,0x00,0x00,0xF9,0x54,0xC7,0x40,0x20,0xC0,0xC0,0xC8,0xC0,0x20,0x00, +0x44,0xE7,0x34,0x20,0xE0,0x9A,0xC0,0xC0,0x10,0x01,0xF0,0xE6,0x06,0xF0,0x9C,0xE1, +0x5C,0xE7,0x00,0xF8,0xE6,0x06,0xF0,0x98,0x64,0xC0,0xC0,0x10,0x01,0xF0,0xC6,0x06, +0xD0,0xD4,0xE6,0x1E,0xA9,0xE4,0x00,0x07,0x0F,0xC0,0xE0,0x10,0x01,0xEC,0x07,0x06, +0xEC,0xE4,0x00,0x07,0x8B,0x20,0xE9,0x06,0xE8,0xEB,0x07,0x23,0xC1,0x60,0x10,0x01, +0x54,0xE7,0x08,0x20,0xE0,0x94,0xF0,0xEB,0x06,0xE8,0x9C,0xE1,0xF8,0xEB,0x06,0xE8, +0xE7,0xFF,0x34,0xF2,0xC0,0xE0,0x10,0x01,0xF0,0xCB,0x06,0xE8,0xF0,0xE7,0x06,0xFE, +0xD4,0xC7,0x1C,0xB1,0xE4,0x00,0x02,0x83,0xF8,0x0B,0x06,0xE8,0x98,0xE6,0xEC,0xEA, +0x06,0xEC,0xE4,0x00,0x07,0x09,0xD0,0xE3,0x09,0x0E,0xC0,0xE0,0x10,0x01,0xF0,0xE7, +0x08,0xD8,0x20,0xE4,0x2E,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xE8,0xC0,0xE0,0x10, +0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x08,0xD0,0xE0,0x07,0x8A,0x98,0xC1,0xC0,0xE0, +0x10,0x01,0xF8,0xC7,0x04,0xDC,0xE7,0xFF,0xC4,0xB2,0xE7,0xFF,0x34,0x3E,0xC0,0xE0, +0x10,0x01,0xF0,0xC7,0x08,0xD8,0x20,0xC5,0x7E,0xFC,0xE7,0x08,0xD8,0x08,0xA7,0x17, +0xC0,0xC0,0x10,0x01,0xE8,0x86,0x06,0xD7,0x40,0x84,0x2D,0x5C,0x84,0x06,0x4C,0xA4, +0xFA,0x44,0x85,0x26,0x40,0xA4,0x2D,0xC0,0xA0,0x3E,0x8C,0x20,0x00,0x8D,0x08,0xE7, +0x19,0xFC,0xC6,0x06,0xD6,0x08,0xC6,0x03,0x40,0xC6,0x3D,0x5C,0xC6,0x06,0x4C,0xE6, +0xFA,0x44,0xC7,0x36,0x40,0xE6,0x3D,0xC0,0xE0,0x3E,0x88,0x20,0x00,0x69,0xE7,0xFF, +0x34,0x76,0x20,0x60,0x4C,0xE7,0xFF,0xCA,0x70,0xC0,0xE0,0x10,0x01,0xEC,0xA7,0x06, +0xE6,0xD0,0xA1,0x15,0x5A,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x07,0x05,0x9C,0xC1,0x5C, +0xC6,0x04,0xEC,0xC7,0x07,0x05,0xC8,0xA0,0xFF,0xFD,0x5C,0xC5,0x17,0x20,0x00,0x25, +0x98,0xDE,0xEC,0xC7,0x07,0x05,0xC0,0xA0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF0,0x85, +0x08,0xD8,0xFC,0xE7,0x08,0xEE,0xC0,0xC0,0x10,0x01,0x50,0xA0,0x1C,0xFC,0xC6,0x06, +0xD6,0x40,0xA4,0x2B,0x8C,0xA7,0xE4,0x00,0x00,0x2B,0x08,0x87,0x01,0x0C,0x86,0x01, +0x08,0x87,0x03,0x1C,0xE7,0x1C,0x0C,0x86,0x03,0x9C,0xC4,0xD4,0xE5,0xFF,0x7E,0xE7, +0xFF,0xF7,0xDA,0xE7,0xFF,0xCA,0x78,0x0D,0x21,0x0E,0x0D,0x61,0x06,0x0D,0x41,0x0A, +0x98,0x61,0x1C,0x21,0x10,0xE7,0xFF,0xD3,0x6D,0xC0,0xE0,0x10,0x01,0x98,0xC4,0xF8, +0x07,0x06,0xBD,0xE4,0x00,0x04,0xB7,0xD0,0xE4,0x0B,0x86,0xE8,0xEB,0x07,0x23,0x54, +0xE7,0x08,0x20,0xE0,0x74,0x98,0xE3,0xEC,0xEA,0x06,0xEC,0xC0,0xE0,0x10,0x01,0xEC, +0x07,0x07,0x05,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x04,0xE8,0xE4,0x00,0x04,0x77,0xC0, +0xE0,0x10,0x01,0xF0,0xC7,0x06,0xBD,0x9C,0xC1,0xF8,0xC7,0x06,0xBD,0xC0,0xE0,0x10, +0x01,0xF0,0xE7,0x07,0x21,0xD0,0xE2,0x04,0xDE,0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10, +0x01,0xE8,0xE4,0x06,0xD6,0xE8,0xC5,0x0B,0xEE,0x43,0x07,0x35,0x5F,0x18,0x06,0x4E, +0xF8,0xFA,0x47,0x17,0xC6,0x42,0xF8,0xBD,0x5E,0xEC,0x99,0x20,0x00,0x9D,0xFC,0xA5, +0x0B,0xEE,0x08,0xA5,0x03,0xFC,0x84,0x06,0xD6,0x08,0x84,0x03,0x40,0x84,0x2D,0x5C, +0x84,0x06,0x4C,0xA4,0xFA,0x44,0x85,0x26,0x40,0xA4,0x2D,0xC0,0xA0,0x10,0xE8,0x20, +0x01,0x45,0x8C,0xE6,0x4C,0xC7,0xF9,0x8C,0xE6,0xC0,0xA0,0x10,0x01,0x4C,0xC7,0x0A, +0xFC,0xE5,0x08,0xD8,0x0C,0xC7,0x17,0x99,0x41,0xC0,0xC0,0x10,0x01,0xF9,0x45,0x08, +0xD8,0xE8,0xA6,0x0B,0xF0,0xC0,0xC0,0x10,0x01,0xE8,0xC6,0x06,0xD8,0x8C,0xC5,0x4C, +0xA6,0xF9,0x8C,0xC5,0x4C,0xC6,0x0A,0x98,0x61,0x0C,0xC7,0x19,0xE7,0xFF,0xD1,0xBE, +0xC0,0xE0,0x10,0x01,0xF9,0x47,0x07,0x21,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xBD, +0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x06,0xBD,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x06,0xD2, +0xD4,0xC7,0x0B,0xB1,0xC0,0xE0,0x10,0x01,0xF0,0xE7,0x07,0x21,0xD0,0xE1,0x0B,0x06, +0xC0,0xA0,0x10,0x01,0xC0,0xC0,0x10,0x01,0xE8,0xE5,0x06,0xD6,0xEA,0xE6,0x0B,0xEF, +0x42,0xE7,0xBD,0x5E,0xF7,0x06,0x4C,0x97,0xFA,0x46,0xE4,0xBE,0x40,0x97,0x25,0x5C, +0x8C,0x99,0x20,0x00,0x9D,0xFC,0xC6,0x0B,0xEE,0x08,0xC6,0x03,0xFC,0xA5,0x06,0xD6, +0x08,0xA5,0x03,0x40,0xA5,0x35,0x5C,0xA5,0x06,0x4C,0xC5,0xFA,0x44,0xA6,0x2E,0x40, +0xC5,0x35,0xC0,0xC0,0x10,0xE8,0x20,0x04,0x59,0xC0,0xA0,0x10,0x01,0xC0,0xC0,0x10, +0x01,0xE8,0x85,0x06,0xD9,0xFC,0xA6,0x08,0xD8,0x0C,0xE5,0x17,0x0C,0x85,0x19,0x98, +0xE1,0x98,0x61,0xF8,0xE6,0x08,0xD8,0xE7,0xFF,0xD0,0x88,0xC0,0xE0,0x10,0x01,0xF8, +0x07,0x07,0x21,0xE4,0x00,0x01,0xE7,0xD0,0xE5,0x01,0x76,0xC0,0xE0,0x10,0x01,0xEC, +0x07,0x07,0x05,0xE7,0xFF,0x2F,0x2A,0xE7,0xFF,0xC6,0x4C,0xC0,0xE0,0x10,0x01,0x98, +0x60,0xF8,0x07,0x04,0xDC,0xE7,0xFF,0xD0,0x2C,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x07, +0x01,0xE7,0xFF,0xFA,0x77,0xD0,0xE6,0x06,0x0E,0xE8,0xEB,0x07,0x23,0x54,0xE7,0x40, +0x20,0xE0,0x26,0x98,0x63,0xE7,0xFF,0xBC,0xAA,0xC0,0xC0,0x10,0x01,0xF0,0xE6,0x07, +0x01,0x9C,0xE1,0x5C,0xE7,0x00,0xF8,0xE6,0x07,0x01,0x5C,0xE6,0x53,0xC0,0xE0,0x10, +0x01,0x20,0x00,0xB5,0xE8,0xC7,0x07,0x23,0xC0,0xE0,0x10,0x01,0x54,0xC6,0x40,0x20, +0xC0,0x54,0x98,0xC1,0xEC,0xC7,0x06,0xEC,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xF0, +0xE4,0x00,0x00,0x55,0xEC,0x07,0x06,0xEC,0x98,0x62,0xE4,0x00,0x00,0x45,0xE8,0xE7, +0x07,0x23,0x54,0xE7,0x08,0x20,0xE1,0x84,0xC0,0xE0,0x10,0x01,0x98,0xC2,0xF8,0x07, +0x06,0xE8,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x06,0xEC,0x98,0x66,0x0D,0x61,0x06,0x0D, +0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xBB,0xC5,0xFC,0xE0,0x7F,0xFF, +0xC0,0x80,0x10,0x01,0xEC,0xE4,0x06,0xD7,0xFC,0xC4,0x06,0xD6,0x0C,0xE6,0x07,0x0C, +0xE6,0x03,0x0C,0xE6,0x05,0xC0,0xE0,0x10,0x01,0xFC,0xC7,0x06,0xFC,0xF8,0x07,0x06, +0xFC,0x18,0xA6,0x01,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x06,0xBD,0x98,0xC5,0xC0,0xE0, +0x10,0x01,0xEC,0xC7,0x06,0xEC,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C, +0x21,0x10,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D, +0x81,0x00,0xC0,0xE0,0x10,0x01,0xF0,0xC7,0x06,0xE9,0x20,0xC0,0x2C,0xF8,0x07,0x06, +0xE9,0xE4,0x00,0x02,0x2F,0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x06,0xC6,0x9C,0xFD,0xD0, +0xE3,0x08,0x49,0x98,0x61,0xE7,0xFF,0xE5,0x94,0xE7,0xFF,0xE3,0x82,0xC1,0x60,0x10, +0x01,0xC1,0x80,0x10,0x01,0xFC,0x6B,0x04,0xEA,0xFC,0x8C,0x05,0x20,0xE7,0xFF,0x61, +0xA0,0xC1,0x40,0x10,0x01,0xF0,0xEA,0x08,0xD8,0x20,0xE0,0xD8,0x98,0x61,0x98,0x81, +0xFC,0xAB,0x04,0xEA,0xE7,0xFF,0x39,0xA6,0xFC,0xAB,0x04,0xEA,0xFC,0xCC,0x05,0x20, +0x98,0x61,0x98,0x81,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04,0x90,0xE7,0xFF,0x50,0x86, +0xF0,0xEA,0x08,0xD8,0x20,0xE0,0x2C,0xE7,0xFF,0xCA,0xBC,0xE7,0xFF,0xCC,0x8A,0xC0, +0xE0,0x10,0x01,0xF0,0xE7,0x08,0xD8,0x20,0xE0,0x74,0xC0,0xE0,0x10,0x01,0xF0,0xE7, +0x04,0xCC,0x20,0xE0,0x4A,0xC0,0xE0,0x10,0x01,0xE8,0xC7,0x07,0x23,0x50,0xC6,0x08, +0xE4,0x00,0x00,0x33,0xC0,0xC0,0x10,0x01,0xC0,0xE0,0x10,0x01,0xF8,0x06,0x08,0xD8, +0x98,0xB7,0xE8,0xC7,0x07,0x23,0x44,0xC6,0x2C,0xEC,0xC7,0x07,0x23,0xC0,0xE0,0x10, +0x01,0xF0,0xE7,0x08,0xD8,0x20,0xE0,0x2C,0xC0,0xE0,0x10,0x01,0xF8,0x07,0x05,0x34, +0xC0,0xE0,0x10,0x01,0xEC,0xE7,0x07,0x0E,0x20,0xE8,0x1C,0xE7,0xFF,0xF4,0xFE,0xC0, +0xE0,0x10,0x01,0xEC,0xE7,0x06,0xE6,0x20,0xE4,0x1C,0xE7,0xFF,0xDA,0xC8,0xC0,0xE0, +0x10,0x01,0xEC,0xE7,0x06,0xE6,0x20,0xE4,0x52,0xC0,0xE0,0x10,0x01,0xEC,0xC7,0x07, +0x0E,0x20,0xC8,0x26,0x98,0xC3,0xEC,0xC7,0x07,0x0C,0xC0,0xE0,0x10,0x01,0xE8,0xE7, +0x07,0x22,0x24,0xFC,0x5A,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21, +0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xB5,0x27,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41, +0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0xE7,0xFF, +0xE4,0xE2,0xC0,0xE0,0x10,0x01,0xC0,0xD4,0x00,0x01,0xC8,0xC6,0x79,0xE9,0x10,0xC6, +0x00,0xF8,0xC7,0x04,0xD4,0xF0,0xC7,0x04,0xD4,0x20,0xC0,0x28,0xF0,0xE7,0x04,0xD4, +0x20,0xE4,0xCE,0xC0,0xE0,0x10,0x01,0xE8,0xE7,0x07,0x23,0x54,0xE7,0x80,0x20,0xE0, +0x32,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFC,0xFD,0x98,0xC5,0xC0,0xE0,0x10,0x01, +0x98,0x60,0xEC,0xC7,0x06,0xEC,0xE7,0xFF,0xCB,0x4A,0x0D,0x21,0x06,0x9C,0x28,0xE7, +0xFF,0xB4,0x51,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xB5,0x6D,0x4C,0x63,0x08,0xC0, +0xE0,0x10,0x01,0xFC,0xE7,0x06,0xAE,0x8C,0xE3,0x08,0xC7,0x01,0xD0,0xC7,0x00,0x56, +0x98,0x68,0xE4,0x00,0x00,0x17,0xD0,0xCF,0x00,0x6E,0x50,0x60,0x10,0x98,0x8F,0xE7, +0xFF,0xA1,0x4F,0xC0,0xF4,0x00,0x01,0xC8,0xA7,0x24,0x34,0x0C,0xC5,0x01,0xC8,0xA7, +0x24,0x38,0x0C,0xC5,0x01,0xC8,0xA7,0x24,0x3C,0x0C,0xC5,0x01,0xC8,0xA7,0x24,0x40, +0x0C,0xC5,0x01,0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x06,0xB6,0xC8,0xA7,0x26,0x24,0x8C, +0x66,0x08,0xC3,0x01,0x0C,0xC5,0x01,0xC8,0xE7,0x26,0x28,0x0C,0xC7,0x01,0x85,0x29, +0x9C,0x38,0xC0,0xE0,0x10,0x01,0x0D,0x41,0x00,0x0D,0x21,0x04,0xEC,0x67,0x06,0xCC, +0x89,0x43,0x20,0x60,0x18,0x20,0x64,0x6E,0xC0,0xF4,0x00,0x01,0xFC,0xA0,0x02,0xC0, +0xC8,0xC7,0x24,0x48,0x0C,0xA6,0x01,0xC8,0xE7,0x24,0x54,0x98,0xC9,0x0C,0xC7,0x01, +0x20,0x84,0xB2,0x4C,0xAA,0x08,0xC0,0xD4,0x00,0x01,0xC0,0xE0,0x10,0x01,0xFC,0xE7, +0x06,0xA6,0x8C,0xE5,0xC8,0xA6,0x24,0x58,0x08,0xE7,0x01,0x0C,0xE5,0x01,0xC8,0xA6, +0x24,0x5C,0x0C,0xE5,0x01,0xC8,0xC6,0x24,0x60,0x0C,0xE6,0x01,0x88,0x6A,0xE7,0xFF, +0xFE,0x7C,0x88,0x6A,0xE7,0xFF,0x96,0x30,0x88,0x6A,0x0D,0x21,0x06,0x0D,0x41,0x02, +0x9C,0x28,0xE7,0xFF,0x93,0xA9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x7F,0x04,0x1E,0x00,0x00,0x48,0xF1,0x17,0x00,0x17,0x10,0x3F, +0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x18,0x19,0x24,0x28,0x2B,0x2C,0x07,0x09,0x0A,0x0C,0x00,0x2D,0x1A,0x1C,0x29,0x2A, +0x04,0x05,0x06,0x08,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E, +0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E,0x3E, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C, +0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x48,0x00,0x00,0x00,0x11,0x11,0x11,0x00,0x02,0x00,0x8C,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x02,0x00,0x00,0x00,0x31,0x00,0x31,0x00, +0x31,0x00,0x31,0x00,0x00,0x00,0xC0,0x02,0x02,0x21,0x03,0x00,0x09,0x00,0x15,0x00, +0x15,0x00,0x15,0x00,0xAC,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x00,0x00, +0x00,0x00,0x00,0xC0,0x00,0x01,0x04,0x05,0x08,0x09,0x0C,0x0D,0x10,0x11,0x12,0x13, +0x02,0x03,0x06,0x07,0x0A,0x0B,0x0E,0x0F,0x00,0x01,0x04,0x05,0x08,0x09,0x0C,0x0D, +0x10,0x11,0x02,0x03,0x06,0x07,0x0A,0x0B,0x0E,0x0F,0x00,0x00,0x01,0x01,0x00,0x00, +0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0x01, +0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00, +0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00, +0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x08, +0x0A,0x08,0x0C,0x08,0x0A,0x08,0x25,0x24,0xE9,0x00,0xE9,0x00,0x05,0x03,0x03,0x04, +0x9B,0x01,0x1B,0x00,0xD7,0x08,0xC7,0xFF,0xB5,0x00,0x0E,0x00,0x30,0x00,0xD1,0x03, +0x03,0x00,0x26,0x00,0x14,0x00,0x7D,0x00,0xBE,0x03,0x01,0x00,0x05,0x00,0x18,0x00, +0xFA,0x00,0xA6,0x05,0x93,0xFF,0x02,0x00,0x19,0x00,0x36,0x01,0x1E,0x03,0x54,0x00, +0x00,0x00,0x19,0x00,0x24,0x00,0x3B,0x05,0xD2,0xFF,0x67,0x00,0x14,0x00,0x62,0x00, +0x79,0x04,0xE5,0xFF,0x22,0x00,0x1B,0x00,0xB2,0x00,0x19,0x04,0xF7,0xFF,0x02,0x00, +0x20,0x00,0x39,0x00,0xF8,0x05,0xA9,0xFF,0x6F,0x00,0x17,0x00,0x97,0x00,0x67,0x04, +0xEB,0xFF,0x0E,0x00,0x25,0x00,0xFC,0x00,0x3A,0x04,0xEA,0xFF,0x01,0x00,0x28,0x00, +0x50,0x00,0x7C,0x07,0x66,0xFF,0x8E,0x00,0x17,0x00,0xAA,0x00,0x99,0x04,0xE8,0xFF, +0x18,0x00,0x2A,0x00,0xEA,0x00,0x09,0x03,0x3D,0x00,0x03,0x00,0x2F,0x00,0x52,0x01, +0x7B,0x05,0x72,0xFF,0x01,0x00,0x2F,0x00,0xFF,0x00,0xDE,0x04,0x2C,0x00,0xFF,0x00, +0x5B,0x02,0x4D,0x00,0xFF,0x00,0x69,0x03,0x91,0x00,0xFE,0x00,0x4C,0x0B,0xD3,0x00, +0xFD,0x00,0xF3,0x0F,0x05,0x01,0xFC,0x00,0xB4,0x0E,0x44,0x01,0xFC,0x00,0xEE,0x0D, +0x98,0x01,0xFB,0x00,0xC5,0x13,0xE3,0x01,0x00,0x00,0xF2,0x03,0x1C,0x00,0xFF,0x00, +0x04,0x04,0x31,0x00,0xFF,0x00,0x69,0x05,0x5B,0x00,0xFE,0x00,0xAC,0x09,0x89,0x00, +0xFE,0x00,0x3A,0x0D,0xA9,0x00,0xFD,0x00,0xBC,0x0E,0xC5,0x00,0xFD,0x00,0xC7,0x10, +0xEE,0x00,0xFC,0x00,0x50,0x16,0x17,0x01,0xFC,0x00,0x0C,0x19,0x39,0x01,0xFB,0x00, +0x3C,0x17,0x6E,0x01,0xFF,0x00,0x8B,0x09,0x0B,0x00,0xFF,0x00,0x44,0x09,0x1B,0x00, +0xFF,0x00,0xAB,0x07,0x39,0x00,0xFF,0x00,0xE1,0x07,0x5E,0x00,0xFE,0x00,0xA6,0x0B, +0x76,0x00,0xFE,0x00,0xA2,0x0E,0x87,0x00,0xFD,0x00,0xD5,0x10,0x9F,0x00,0xFD,0x00, +0x2D,0x15,0xB9,0x00,0xFC,0x00,0x7A,0x19,0xCB,0x00,0xFC,0x00,0x9D,0x1A,0xDF,0x00, +0xFB,0x00,0x90,0x1B,0x04,0x01,0xFA,0x00,0xD4,0x20,0x29,0x01,0xFF,0x00,0x25,0x0D, +0xF7,0xFF,0xFF,0x00,0xA0,0x0C,0x01,0x00,0xFF,0x00,0xBF,0x0B,0x18,0x00,0xFE,0x00, +0x92,0x0B,0x39,0x00,0xFE,0x00,0x6A,0x0F,0x50,0x00,0xFE,0x00,0x5A,0x12,0x5D,0x00, +0xFD,0x00,0x8F,0x13,0x6C,0x00,0xFD,0x00,0xBC,0x14,0x80,0x00,0xFD,0x00,0xD3,0x18, +0x8D,0x00,0xFC,0x00,0xC0,0x1B,0x98,0x00,0xFC,0x00,0x97,0x1C,0xAD,0x00,0xFB,0x00, +0xEE,0x1F,0xC5,0x00,0xFB,0x00,0x27,0x23,0xD5,0x00,0xFB,0x00,0xD6,0x23,0xE9,0x00, +0xE6,0x00,0xD4,0x00,0xC2,0x00,0xB1,0x00,0x9F,0x00,0x8D,0x00,0x7C,0x00,0x6A,0x00, +0x58,0x00,0x46,0x00,0x35,0x00,0x23,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x5A,0x00,0x14,0x00,0x14,0x00,0x02,0x00,0x02,0x00,0x64,0x00, +0x28,0x00,0x28,0x00,0x01,0x00,0x01,0x00,0x64,0x00,0x01,0x00,0x64,0x00,0x01,0x00, +0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x50,0x00,0x96,0x00,0x40,0x06,0x00,0x00,0x80,0x0C,0x00,0x00,0x01,0x03,0x07,0x00, +0x00,0x00,0x00,0x00,0xE2,0x0B,0x80,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x59,0x01, +0x5B,0x00,0x1B,0x00,0x9B,0x01,0x1D,0x00,0x19,0x00,0xF6,0xFF,0x51,0x00,0x09,0x00, +0x03,0x00,0x1B,0x00,0x1B,0x00,0x41,0x02,0x1B,0x00,0xE2,0x00,0x01,0x00,0x15,0x00, +0x18,0x01,0xC8,0x00,0x78,0x00,0x78,0x00,0x11,0x01,0x15,0x00,0x18,0x01,0xC8,0x00, +0xCC,0x00,0x0A,0x00,0x06,0x00,0x98,0x08,0x02,0x00,0x01,0x00,0xD8,0x0E,0xD8,0x0E, +0x00,0x00,0x00,0x00,0x5A,0x00,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x02,0x03,0x00,0x00,0x30,0x0A,0x80,0x00,0xDC,0x08,0x80,0x00,0x00,0x01,0x02,0x03, +0x01,0x02,0x03,0x00,0x49,0x6E,0x20,0x75,0x6D,0x61,0x69,0x6E,0x20,0x0A,0x00,0x00, +0x19,0x00,0x1F,0x00,0x27,0x00,0x31,0x00,0x3D,0x00,0x4B,0x00,0x5B,0x00,0x6F,0x00, +0x89,0x00,0xA9,0x00,0xCF,0x00,0xFF,0x00,0x39,0x01,0x7F,0x01,0xD5,0x01,0xF3,0x01, +0x00,0x3C,0x00,0xA0,0x33,0x00,0xFF,0xFF,0x00,0x3C,0x00,0xA0,0x34,0x00,0xFF,0xFF, +0x00,0x3C,0x00,0xA0,0x35,0x00,0xFF,0x3F,0x00,0x3C,0x00,0xA0,0x36,0x00,0x00,0x00, +0x00,0x3C,0x00,0xA0,0x37,0x00,0x00,0x00,0x00,0x3C,0x00,0xA0,0x38,0x00,0x00,0x00, +0x00,0x3C,0x00,0xA0,0x39,0x00,0x00,0x00,0x00,0x3C,0x00,0xA0,0x3A,0x00,0x00,0x00, +0x00,0x3C,0x00,0xA0,0x3B,0x00,0x00,0x00,0x00,0x3C,0x00,0xA0,0x3C,0x00,0xFF,0xFF, +0x00,0x3C,0x00,0xA0,0x3D,0x00,0xFF,0xFF,0x00,0x3C,0x00,0xA0,0x3E,0x00,0xFF,0x3F, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x36,0x6E,0x01,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFE,0x00,0x80,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x0C,0x00, +0x01,0x00,0x0E,0x09,0x19,0x30,0x31,0x32,0x00,0x05,0x42,0x42,0x56,0x00,0x42,0x42, +0x4D,0x44,0x4C,0x00,0x06,0x4C,0x43,0x4D,0x00,0x07,0x01,0xFF,0x01,0x03,0x08,0x00, +0x09,0x00,0x0A,0x00,0x0B,0x00,0x0C,0x00,0x0D,0x00,0x0E,0x00,0x0F,0x00,0x10,0x00, +0x11,0x00,0x12,0x00,0x85,0x3C,0x00,0xD0,0x1F,0x14,0x00,0x00,0x32,0x14,0x00,0x00, +0x50,0x14,0x00,0x00,0x07,0x15,0x00,0x00,0x2C,0x0B,0x00,0x00,0x6E,0x09,0x00,0x00, +0x67,0x03,0x00,0x00,0x0D,0x09,0x00,0x00,0xE9,0x15,0x00,0x00,0x7A,0x15,0x00,0x00, +0xCE,0x1D,0x00,0x00,0x8D,0x15,0x00,0x00,0xD4,0x23,0x00,0x00,0x2D,0x3E,0x00,0xD0, +0x2F,0x3E,0x00,0xD0,0x5B,0x0F,0x00,0x00,0xA5,0x0D,0x00,0x00,0x7C,0x11,0x00,0x00, +0xDF,0x10,0x00,0x00,0x7A,0x0D,0x00,0x00,0x4D,0x53,0x43,0x54,0x50,0x43,0x33,0x00, +0x35,0x06,0x00,0x00,0x4F,0x06,0x00,0x00,0x12,0x07,0x00,0x00,0x83,0x07,0x00,0x00, +0x0B,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93,0xDA,0xA6,0x58, +0x4D,0x53,0x54,0x41,0x52,0x54,0x50,0x43,0x00,0x00,0x00,0x00,0x4C,0x43,0x0C,0x00, +0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x30,0x31,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_common.c b/drivers/input/touchscreen/msg2138/mstar_drv_common.c new file mode 100644 index 00000000..62c553dd --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_common.c @@ -0,0 +1,152 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_common.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_common.h" + +/*=============================================================*/ +// MACRO DEFINITION +/*=============================================================*/ + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + + +/*=============================================================*/ +// VARIABLE DEFINITION +/*=============================================================*/ + +static u32 _gCrc32Table[256]; + +/*=============================================================*/ +// DATA TYPE DEFINITION +/*=============================================================*/ + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +/// CRC +u32 DrvCommonCrcDoReflect(u32 nRef, s8 nCh) +{ + u32 nValue = 0; + u32 i = 0; + + for (i = 1; i < (nCh + 1); i ++) + { + if (nRef & 1) + { + nValue |= 1 << (nCh - i); + } + nRef >>= 1; + } + + return nValue; +} + +u32 DrvCommonCrcGetValue(u32 nText, u32 nPrevCRC) +{ + u32 nCRC = nPrevCRC; + + nCRC = (nCRC >> 8) ^ _gCrc32Table[(nCRC & 0xFF) ^ nText]; + + return nCRC; +} + +void DrvCommonCrcInitTable(void) +{ + u32 nMagicNumber = 0x04c11db7; + u32 i, j; + + for (i = 0; i <= 0xFF; i ++) + { + _gCrc32Table[i] = DrvCommonCrcDoReflect(i, 8) << 24; + for (j = 0; j < 8; j ++) + { + _gCrc32Table[i] = (_gCrc32Table[i] << 1) ^ (_gCrc32Table[i] & (0x80000000L) ? nMagicNumber : 0); + } + _gCrc32Table[i] = DrvCommonCrcDoReflect(_gCrc32Table[i], 32); + } +} + +u8 DrvCommonCalculateCheckSum(u8 *pMsg, u32 nLength) +{ + s32 nCheckSum = 0; + u32 i; + + for (i = 0; i < nLength; i ++) + { + nCheckSum += pMsg[i]; + } + + return (u8)((-nCheckSum) & 0xFF); +} + +u32 DrvCommonConvertCharToHexDigit(char *pCh, u32 nLength) +{ + u32 nRetVal = 0; + u32 i; + + DBG("nLength = %d\n", nLength); + + for (i = 0; i < nLength; i ++) + { + char ch = *pCh++; + u32 n = 0; + + if ((i == 0 && ch == '0') || (i == 1 && ch == 'x')) + { + continue; + } + + if ('0' <= ch && ch <= '9') + { + n = ch-'0'; + } + else if ('a' <= ch && ch <= 'f') + { + n = 10 + ch-'a'; + } + else if ('A' <= ch && ch <= 'F') + { + n = 10 + ch-'A'; + } + + if (i < 6) + { + nRetVal = n + nRetVal*16; + } + } + + return nRetVal; +} + +//------------------------------------------------------------------------------// \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_common.h b/drivers/input/touchscreen/msg2138/mstar_drv_common.h new file mode 100644 index 00000000..d8323c66 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_common.h @@ -0,0 +1,359 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_common.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_COMMON_H__ +#define __MSTAR_DRV_COMMON_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*--------------------------------------------------------------------------*/ +/* TOUCH DEVICE DRIVER RELEASE VERSION */ +/*--------------------------------------------------------------------------*/ + +#define DEVICE_DRIVER_RELEASE_VERSION ("2.2.0.0") + + +/*--------------------------------------------------------------------------*/ +/* COMPILE OPTION DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling for distinct smart phone developer platform. + * For running on Spreadtrum platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM. + * For running on Qualcomm platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM. + * For running on MediaTek platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM. + */ +#define CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM +//#define CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM +//#define CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling for distinct touch ic. + * Please enable the compile option depends on the touch ic that customer project are using and disable the others. + */ +#define CONFIG_ENABLE_CHIP_MSG21XXA +//#define CONFIG_ENABLE_CHIP_MSG22XX +//#define CONFIG_ENABLE_CHIP_MSG26XXM + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling to make sure main board can supply power to touch ic for some specific BB chip of MTK(EX. MT6582)/SPRD(EX. SC7715)/QCOM(EX. MSM8610). + * By default, this compile option is disabled. + */ +#define CONFIG_ENABLE_REGULATOR_POWER_ON + +/* + * Note. + * The below compile option is used to distinguish different workqueue scheduling mechanism when firmware report finger touch to device driver by IRQ interrupt. + * For MTK platform, there are two type of workqueue scheduling mechanism available. + * Please refer to the related code which is enclosed by compile option CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM in mstar_drv_platform_porting_layer.c for more detail. + * This compile option is used for MTK platform only. + * By default, this compile option is disabled. + */ + +//#define CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + +/* + * Note. + * The below compile option is used to apply DMA mode for read/write data between device driver and firmware by I2C. + * The DMA mode is used to reslove I2C read/write 8 bytes limitation for specific MTK BB chip(EX. MT6589/MT6572/...) + * This compile option is used for MTK platform only. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_DMA_IIC + +/* + * Note. + * The below compile option is used to enable the output log mechanism while touch device driver is running. + * If this compile option is not defined, the function for output log will be disabled. + * By default, this compile option is enabled. + */ +//#define CONFIG_ENABLE_TOUCH_DRIVER_DEBUG + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling when touch panel support virtual key(EX. Menu, Home, Back, Search). + * If this compile option is not defined, the function for virtual key handling will be disabled. + * By default, this compile option is enabled. + */ +#define TOUCH_VIRTUAL_KEYS + +/* + * Note. + * Since specific MTK BB chip report virtual key touch by using coordinate instead of key code, the below compile option is used to enable the code handling for reporting key with coordinate. + * This compile option is used for MTK platform only. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + +/* + * Note. + * The below compile option is used to enable debug mode data log for firmware. + * By default, this compile option is enabled. + */ +//#define CONFIG_ENABLE_FIRMWARE_DATA_LOG + +/* + * Note. + * The below compile option is used to enable gesture wakeup. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_GESTURE_WAKEUP + +/* + * Note. + * The below compile option is used to enable phone level MP test handling. + * By the way, phone level MP test is ready for MSG21XXA(support Open Test&Short Test)/MSG26XXM(support Open Test) only, but phone level MP test for MSG22XX is not ready yet. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_ITO_MP_TEST + + +/* + * Note. + * The below compile option is used to change the permission of the sysfs virtual file system for CTS test. + * If this compile option is enabled, the permission 0644 will be used. + * If this compile option is disabled, the permission 0777 will be used. + * By default, this compile option is disabled. + */ +#define SYSFS_AUTHORITY_CHANGE_FOR_CTS_TEST + +/* + * Note. + * If this compile option is not defined, the SW ID mechanism for updating firmware will be disabled. + * By default, this compile option is disabled. + */ +//#define CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/* + * Note. + * If this compile option is defined, the update firmware bin file shall be stored in a two dimensional array format. + * Else, the update firmware bin file shall be stored in an one dimensional array format. + * Be careful, MSG22XX only support storing update firmware bin file in an one dimensional array format, it does not support two dimensional array format. + * By default, this compile option is disabled. + */ +//#define CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define u8 unsigned char +#define u16 unsigned short +#define u32 unsigned int +#define s8 signed char +#define s16 signed short +#define s32 signed int + +//#define SLAVE_I2C_ID_DBBUS (0xB2>>1) //0x59 // for MSG22XX +#define SLAVE_I2C_ID_DBBUS (0xC4>>1) //0x62 // for MSG21XX/MSG21XXA/MSG26XXM +#define SLAVE_I2C_ID_DWI2C (0x4C>>1) //0x26 + +#define CHIP_TYPE_MSG21XX (0x01) // EX. MSG2133 +#define CHIP_TYPE_MSG21XXA (0x02) // EX. MSG2133A/MSG2138A(Besides, use version to distinguish MSG2133A/MSG2138A, you may refer to _DrvFwCtrlUpdateFirmwareCash()) +#define CHIP_TYPE_MSG26XXM (0x03) // EX. MSG2633M +#define CHIP_TYPE_MSG22XX (0x7A) // EX. MSG2238/MSG2256 + +#define PACKET_TYPE_TOOTH_PATTERN (0x20) +#define PACKET_TYPE_GESTURE_WAKEUP (0x50) + +//#define TOUCH_SCREEN_X_MIN (0) +//#define TOUCH_SCREEN_Y_MIN (0) +/* + * Note. + * Please change the below touch screen resolution according to the touch panel that you are using. + */ +//#define TOUCH_SCREEN_X_MAX (480) //LCD_WIDTH +//#define TOUCH_SCREEN_Y_MAX (800) //LCD_HEIGHT +/* + * Note. + * Please do not change the below setting. + */ +#define TPD_WIDTH (2048) +#define TPD_HEIGHT (2048) + + +#define BIT0 (1<<0) // 0x0001 +#define BIT1 (1<<1) // 0x0002 +#define BIT2 (1<<2) // 0x0004 +#define BIT3 (1<<3) // 0x0008 +#define BIT4 (1<<4) // 0x0010 +#define BIT5 (1<<5) // 0x0020 +#define BIT6 (1<<6) // 0x0040 +#define BIT7 (1<<7) // 0x0080 +#define BIT8 (1<<8) // 0x0100 +#define BIT9 (1<<9) // 0x0200 +#define BIT10 (1<<10) // 0x0400 +#define BIT11 (1<<11) // 0x0800 +#define BIT12 (1<<12) // 0x1000 +#define BIT13 (1<<13) // 0x2000 +#define BIT14 (1<<14) // 0x4000 +#define BIT15 (1<<15) // 0x8000 + + +#define MAX_DEBUG_REGISTER_NUM (10) + + +#ifdef SYSFS_AUTHORITY_CHANGE_FOR_CTS_TEST +#define SYSFS_AUTHORITY (0644) +#else +#define SYSFS_AUTHORITY (0777) +#endif + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#define GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG 0x0001 //0000 0000 0000 0001 +#define GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG 0x0002 //0000 0000 0000 0010 +#define GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG 0x0004 //0000 0000 0000 0100 +#define GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG 0x0008 //0000 0000 0000 1000 +#define GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG 0x0010 //0000 0000 0001 0000 +#define GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG 0x0020 //0000 0000 0010 0000 +#define GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG 0x0040 //0000 0000 0100 0000 +#define GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG 0x0080 //0000 0000 1000 0000 +#define GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG 0x0100 //0000 0001 0000 0000 +#define GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG 0x0200 //0000 0010 0000 0000 +#define GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG 0x0400 //0000 0100 0000 0000 +#define GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG 0x0800 //0000 1000 0000 0000 +#define GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG 0x1000 //0001 0000 0000 0000 + +#define GESTURE_WAKEUP_PACKET_LENGTH (6) +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_TOUCH_DRIVER_DEBUG +//#define DBG(fmt, arg...) pr_info(fmt, ##arg) +#define DBG(fmt, arg...) printk(fmt, ##arg) +#else +#define DBG(fmt, arg...) +#endif + +/*--------------------------------------------------------------------------*/ +/* SPREADTRUM DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define MSG_TP_IC_NAME "msg2138_ts" //"msg21xxA" or "msg22xx" or "msg26xxM" +#define MSG_TP_I2C_ADDR 0x26 +#define MAX_FINGER_NUM 5 + +struct msg2138_ts_platform_data{ + int irq_gpio_number; + int reset_gpio_number; + const char *vdd_name; + int virtualkeys[12]; + int TP_MAX_X; + int TP_MAX_Y; +}; +struct point_node_t{ + unsigned char active ; + unsigned char finger_id; + int posx; + int posy; +}; +struct TouchScreenInfo_t{ + unsigned char nTouchKeyMode; + unsigned char nTouchKeyCode; +}; +struct touch_info { + int x1, y1; + int x2, y2; + int x3, y3; + int p1, p2,p3; + int count; +}; + +extern struct i2c_client *g_I2cClient; +extern int MS_TS_MSG_IC_GPIO_RST; +extern int MS_TS_MSG_IC_GPIO_INT; +extern int TOUCH_SCREEN_X_MAX; +extern int TOUCH_SCREEN_Y_MAX; +extern struct point_node_t point_slot[MAX_FINGER_NUM*2]; +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +typedef enum +{ + EMEM_ALL = 0, + EMEM_MAIN, + EMEM_INFO +} EmemType_e; + +typedef enum +{ + ITO_TEST_MODE_OPEN_TEST = 1, + ITO_TEST_MODE_SHORT_TEST = 2 +} ItoTestMode_e; + +typedef enum +{ + ITO_TEST_OK = 0, + ITO_TEST_FAIL, + ITO_TEST_GET_TP_TYPE_ERROR, + ITO_TEST_UNDEFINED_ERROR, + ITO_TEST_UNDER_TESTING + +} ItoTestResult_e; + +/*--------------------------------------------------------------------------*/ +/* GLOBAL VARIABLE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern u8 DrvCommonCalculateCheckSum(u8 *pMsg, u32 nLength); +extern u32 DrvCommonConvertCharToHexDigit(char *pCh, u32 nLength); +extern u32 DrvCommonCrcDoReflect(u32 nRef, s8 nCh); +extern u32 DrvCommonCrcGetValue(u32 nText, u32 nPrevCRC); +extern void DrvCommonCrcInitTable(void); + +#endif /* __MSTAR_DRV_COMMON_H__ */ diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c new file mode 100644 index 00000000..38f4e0db --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.c @@ -0,0 +1,195 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_ic_fw_porting_layer.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_ic_fw_porting_layer.h" + + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern u16 g_GestureWakeupMode; +extern u8 g_GestureWakeupFlag; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +u8 DrvIcFwLyrGetChipType(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlGetChipType(); +} + +void DrvIcFwLyrGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlGetCustomerFirmwareVersion(pMajor, pMinor, ppVersion); +} + +void DrvIcFwLyrGetPlatformFirmwareVersion(u8 **ppVersion) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlGetPlatformFirmwareVersion(ppVersion); +} + +s32 DrvIcFwLyrUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlUpdateFirmware(szFwData, eEmemType); +} + +u32 DrvIcFwLyrIsRegisterFingerTouchInterruptHandler(void) +{ + DBG("*** %s() ***\n", __func__); + + return 1; // Indicate that it is necessary to register interrupt handler with GPIO INT pin when firmware is running on IC +} + +void DrvIcFwLyrHandleFingerTouch(u8 *pPacket, u16 nLength) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlHandleFingerTouch(); +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +void DrvIcFwLyrOpenGestureWakeup(u16 nWakeupMode) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlOpenGestureWakeup(nWakeupMode); +} + +void DrvIcFwLyrCloseGestureWakeup(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlCloseGestureWakeup(); +} + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) +u16 DrvIcFwLyrGetFirmwareMode(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlGetFirmwareMode(); +} +#endif //CONFIG_ENABLE_CHIP_MSG26XXM + +u16 DrvIcFwLyrChangeFirmwareMode(u16 nMode) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlChangeFirmwareMode(nMode); +} + +void DrvIcFwLyrGetFirmwareInfo(FirmwareInfo_t *pInfo) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlGetFirmwareInfo(pInfo); +} + +void DrvIcFwLyrRestoreFirmwareModeToLogDataMode(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlRestoreFirmwareModeToLogDataMode(); +} + +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +void DrvIcFwLyrCheckFirmwareUpdateBySwId(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlCheckFirmwareUpdateBySwId(); +} +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +void DrvIcFwLyrCreateMpTestWorkQueue(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvMpTestCreateMpTestWorkQueue(); +} + +void DrvIcFwLyrScheduleMpTestWork(ItoTestMode_e eItoTestMode) +{ +// DBG("*** %s() ***\n", __func__); + + DrvMpTestScheduleMpTestWork(eItoTestMode); +} + +s32 DrvIcFwLyrGetMpTestResult(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestResult(); +} + +void DrvIcFwLyrGetMpTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestFailChannel(eItoTestMode, pFailChannel, pFailChannelCount); +} + +void DrvIcFwLyrGetMpTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestDataLog(eItoTestMode, pDataLog, pLength); +} +#endif //CONFIG_ENABLE_ITO_MP_TEST \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h new file mode 100644 index 00000000..7981d4f0 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_ic_fw_porting_layer.h @@ -0,0 +1,90 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_ic_fw_porting_layer.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ +#define __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) +#include "mstar_drv_mutual_fw_control.h" +#ifdef CONFIG_ENABLE_ITO_MP_TEST +#include "mstar_drv_mutual_mp_test.h" +#endif //CONFIG_ENABLE_ITO_MP_TEST +#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) +#include "mstar_drv_self_fw_control.h" +#ifdef CONFIG_ENABLE_ITO_MP_TEST +#include "mstar_drv_self_mp_test.h" +#endif //CONFIG_ENABLE_ITO_MP_TEST +#endif + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern void DrvIcFwLyrOpenGestureWakeup(u16 nWakeupMode); +extern void DrvIcFwLyrCloseGestureWakeup(void); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern u16 DrvIcFwLyrChangeFirmwareMode(u16 nMode); +extern void DrvIcFwLyrGetFirmwareInfo(FirmwareInfo_t *pInfo); +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) +extern u16 DrvIcFwLyrGetFirmwareMode(void); +#endif //CONFIG_ENABLE_CHIP_MSG26XXM +extern void DrvIcFwLyrRestoreFirmwareModeToLogDataMode(void); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +extern void DrvIcFwLyrCheckFirmwareUpdateBySwId(void); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +extern u8 DrvIcFwLyrGetChipType(void); +extern void DrvIcFwLyrGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion); +extern void DrvIcFwLyrGetPlatformFirmwareVersion(u8 **ppVersion); +extern void DrvIcFwLyrHandleFingerTouch(u8 *pPacket, u16 nLength); +extern u32 DrvIcFwLyrIsRegisterFingerTouchInterruptHandler(void); +extern s32 DrvIcFwLyrUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType); + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +extern void DrvIcFwLyrCreateMpTestWorkQueue(void); +extern void DrvIcFwLyrScheduleMpTestWork(ItoTestMode_e eItoTestMode); +extern void DrvIcFwLyrGetMpTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength); +extern void DrvIcFwLyrGetMpTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount); +extern s32 DrvIcFwLyrGetMpTestResult(void); +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#endif /* __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ */ diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_main.c b/drivers/input/touchscreen/msg2138/mstar_drv_main.c new file mode 100644 index 00000000..94f6be1e --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_main.c @@ -0,0 +1,993 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_main.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_main.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_platform_porting_layer.h" +#include "mstar_drv_ic_fw_porting_layer.h" + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern FirmwareInfo_t g_FirmwareInfo; +extern u8 *g_LogModePacket; +extern u16 g_FirmwareMode; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern u16 g_GestureWakeupMode; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +extern u8 g_ChipType; + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u16 _gDebugReg[MAX_DEBUG_REGISTER_NUM] = {0}; +static u32 _gDebugRegCount = 0; + +static u8 *_gPlatformFwVersion = NULL; // internal use firmware version for MStar + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +static ItoTestMode_e _gItoTestMode = 0; +#endif //CONFIG_ENABLE_ITO_MP_TEST + +static u32 _gIsUpdateComplete = 0; + +static u8 *_gFwVersion = NULL; // customer firmware version + +static struct class *_gFirmwareClass = NULL; +static struct device *_gFirmwareCmdDev = NULL; + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +struct kset *g_TouchKSet = NULL; +struct kobject *g_TouchKObj = NULL; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +u8 g_FwData[94][1024]; +u32 g_FwDataCount = 0; + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +ssize_t DrvMainFirmwareChipTypeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() ***\n", __func__); + + return sprintf(pBuf, "%d", g_ChipType); +} + +ssize_t DrvMainFirmwareChipTypeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); + +// g_ChipType = DrvIcFwLyrGetChipType(); + + return nSize; +} + +static DEVICE_ATTR(chip_type, SYSFS_AUTHORITY, DrvMainFirmwareChipTypeShow, DrvMainFirmwareChipTypeStore); + +ssize_t DrvMainFirmwareDriverVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() ***\n", __func__); + + return sprintf(pBuf, "%s", DEVICE_DRIVER_RELEASE_VERSION); +} + +ssize_t DrvMainFirmwareDriverVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); + + return nSize; +} + +static DEVICE_ATTR(driver_version, SYSFS_AUTHORITY, DrvMainFirmwareDriverVersionShow, DrvMainFirmwareDriverVersionStore); + +/*--------------------------------------------------------------------------*/ + +ssize_t DrvMainFirmwareUpdateShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion); + + return sprintf(pBuf, "%s\n", _gFwVersion); +} + +ssize_t DrvMainFirmwareUpdateStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DrvPlatformLyrDisableFingerTouchReport(); + + DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount); + + if (0 != DrvIcFwLyrUpdateFirmware(g_FwData, EMEM_ALL)) + { + _gIsUpdateComplete = 0; + DBG("Update FAILED\n"); + } + else + { + _gIsUpdateComplete = 1; + DBG("Update SUCCESS\n"); + } + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + DrvIcFwLyrRestoreFirmwareModeToLogDataMode(); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + DrvPlatformLyrEnableFingerTouchReport(); + + return nSize; +} + +static DEVICE_ATTR(update, SYSFS_AUTHORITY, DrvMainFirmwareUpdateShow, DrvMainFirmwareUpdateStore); + +ssize_t DrvMainFirmwareVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion); + + return sprintf(pBuf, "%s\n", _gFwVersion); +} + +ssize_t DrvMainFirmwareVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + u16 nMajor = 0, nMinor = 0; + + DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion); + + DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion); + + return nSize; +} + +static DEVICE_ATTR(version, SYSFS_AUTHORITY, DrvMainFirmwareVersionShow, DrvMainFirmwareVersionStore); + +ssize_t DrvMainFirmwareDataShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount); + + return g_FwDataCount; +} + +ssize_t DrvMainFirmwareDataStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + u32 nCount = nSize / 1024; + u32 i; + + DBG("*** %s() ***\n", __func__); + + if (nCount > 0) // nSize >= 1024 + { + for (i = 0; i < nCount; i ++) + { + memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024); + + g_FwDataCount ++; + } + } + else // nSize < 1024 + { + if (nSize > 0) + { + memcpy(g_FwData[g_FwDataCount], pBuf, nSize); + + g_FwDataCount ++; + } + } + + DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount); + + if (pBuf != NULL) + { + DBG("*** buf[0] = %c ***\n", pBuf[0]); + } + + return nSize; +} + +static DEVICE_ATTR(data, SYSFS_AUTHORITY, DrvMainFirmwareDataShow, DrvMainFirmwareDataStore); + +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +ssize_t DrvMainFirmwareTestShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() ***\n", __func__); + DBG("*** ctp mp test status = %d ***\n", DrvIcFwLyrGetMpTestResult()); + + return sprintf(pBuf, "%d", DrvIcFwLyrGetMpTestResult()); +} + +ssize_t DrvMainFirmwareTestStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + u32 nMode = 0; + + DBG("*** %s() ***\n", __func__); + + if (pBuf != NULL) + { + sscanf(pBuf, "%x", &nMode); + + DBG("Mp Test Mode = 0x%x\n", nMode); + + if (nMode == ITO_TEST_MODE_OPEN_TEST) //open test + { + _gItoTestMode = ITO_TEST_MODE_OPEN_TEST; + DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_OPEN_TEST); + } + else if (nMode == ITO_TEST_MODE_SHORT_TEST) //short test + { + _gItoTestMode = ITO_TEST_MODE_SHORT_TEST; + DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_SHORT_TEST); + } + else + { + DBG("*** Undefined MP Test Mode ***\n"); + } + } + + return nSize; +} + +static DEVICE_ATTR(test, SYSFS_AUTHORITY, DrvMainFirmwareTestShow, DrvMainFirmwareTestStore); + +ssize_t DrvMainFirmwareTestLogShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + DrvIcFwLyrGetMpTestDataLog(_gItoTestMode, pBuf, &nLength); + + return nLength; +} + +ssize_t DrvMainFirmwareTestLogStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); + + return nSize; +} + +static DEVICE_ATTR(test_log, SYSFS_AUTHORITY, DrvMainFirmwareTestLogShow, DrvMainFirmwareTestLogStore); + +ssize_t DrvMainFirmwareTestFailChannelShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + u32 nCount = 0; + + DBG("*** %s() ***\n", __func__); + + DrvIcFwLyrGetMpTestFailChannel(_gItoTestMode, pBuf, &nCount); + + return nCount; +} + +ssize_t DrvMainFirmwareTestFailChannelStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); + + return nSize; +} + +static DEVICE_ATTR(test_fail_channel, SYSFS_AUTHORITY, DrvMainFirmwareTestFailChannelShow, DrvMainFirmwareTestFailChannelStore); +#endif //CONFIG_ENABLE_ITO_MP_TEST + +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +ssize_t DrvMainFirmwareGestureWakeupModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() ***\n", __func__); + DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode); + + return sprintf(pBuf, "%x", g_GestureWakeupMode); +} + +ssize_t DrvMainFirmwareGestureWakeupModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + u32 nLength, nWakeupMode; + + DBG("*** %s() ***\n", __func__); + + if (pBuf != NULL) + { + sscanf(pBuf, "%x", &nWakeupMode); + DBG("nWakeupMode = 0x%x\n", nWakeupMode); + + nLength = nSize; + DBG("nLength = %d\n", nLength); + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG) == GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG); + } + + if ((nWakeupMode & GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG) + { + g_GestureWakeupMode = g_GestureWakeupMode | GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode = g_GestureWakeupMode & (~GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG); + } + + DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode); + } + + return nSize; +} + +static DEVICE_ATTR(gesture_wakeup_mode, SYSFS_AUTHORITY, DrvMainFirmwareGestureWakeupModeShow, DrvMainFirmwareGestureWakeupModeStore); + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*--------------------------------------------------------------------------*/ + +ssize_t DrvMainFirmwareDebugShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + u32 i; + u8 nBank, nAddr; + u16 szRegData[MAX_DEBUG_REGISTER_NUM] = {0}; + u8 szOut[MAX_DEBUG_REGISTER_NUM*25] = {0}, szValue[10] = {0}; + + DBG("*** %s() ***\n", __func__); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(300); + + for (i = 0; i < _gDebugRegCount; i ++) + { + szRegData[i] = RegGet16BitValue(_gDebugReg[i]); + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + for (i = 0; i < _gDebugRegCount; i ++) + { + nBank = (_gDebugReg[i] >> 8) & 0xFF; + nAddr = _gDebugReg[i] & 0xFF; + + DBG("reg(0x%X,0x%X)=0x%04X\n", nBank, nAddr, szRegData[i]); + + strcat(szOut, "reg("); + sprintf(szValue, "0x%X", nBank); + strcat(szOut, szValue); + strcat(szOut, ","); + sprintf(szValue, "0x%X", nAddr); + strcat(szOut, szValue); + strcat(szOut, ")="); + sprintf(szValue, "0x%04X", szRegData[i]); + strcat(szOut, szValue); + strcat(szOut, "\n"); + } + + return sprintf(pBuf, "%s\n", szOut); +} + +ssize_t DrvMainFirmwareDebugStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + u32 i; + char *pCh; + + DBG("*** %s() ***\n", __func__); + + if (pBuf != NULL) + { + DBG("*** %s() pBuf[0] = %c ***\n", __func__, pBuf[0]); + DBG("*** %s() pBuf[1] = %c ***\n", __func__, pBuf[1]); + DBG("*** %s() pBuf[2] = %c ***\n", __func__, pBuf[2]); + DBG("*** %s() pBuf[3] = %c ***\n", __func__, pBuf[3]); + DBG("*** %s() pBuf[4] = %c ***\n", __func__, pBuf[4]); + DBG("*** %s() pBuf[5] = %c ***\n", __func__, pBuf[5]); + + DBG("nSize = %d\n", nSize); + + i = 0; + while ((pCh = strsep((char **)&pBuf, " ,")) && (i < MAX_DEBUG_REGISTER_NUM)) + { + DBG("pCh = %s\n", pCh); + + _gDebugReg[i] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + + DBG("_gDebugReg[%d] = 0x%04X\n", i, _gDebugReg[i]); + i ++; + } + _gDebugRegCount = i; + + DBG("_gDebugRegCount = %d\n", _gDebugRegCount); + } + + return nSize; +} + +static DEVICE_ATTR(debug, SYSFS_AUTHORITY, DrvMainFirmwareDebugShow, DrvMainFirmwareDebugStore); + +/*--------------------------------------------------------------------------*/ + +ssize_t DrvMainFirmwarePlatformVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion); + + return sprintf(pBuf, "%s\n", _gPlatformFwVersion); +} + +ssize_t DrvMainFirmwarePlatformVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DrvIcFwLyrGetPlatformFirmwareVersion(&_gPlatformFwVersion); + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + DrvIcFwLyrRestoreFirmwareModeToLogDataMode(); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion); + + return nSize; +} + +static DEVICE_ATTR(platform_version, SYSFS_AUTHORITY, DrvMainFirmwarePlatformVersionShow, DrvMainFirmwarePlatformVersionStore); + +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +ssize_t DrvMainFirmwareModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + g_FirmwareMode = DrvIcFwLyrGetFirmwareMode(); + + DBG("%s() firmware mode = 0x%x\n", __func__, g_FirmwareMode); + + return sprintf(pBuf, "%x", g_FirmwareMode); +#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); + g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; + + DBG("%s() firmware mode = 0x%x, can change firmware mode = %d\n", __func__, g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode); + + return sprintf(pBuf, "%x,%d", g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode); +#endif +} + +ssize_t DrvMainFirmwareModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); + + u32 nMode; + + if (pBuf != NULL) + { + sscanf(pBuf, "%x", &nMode); + DBG("firmware mode = 0x%x\n", nMode); + + if (nMode == FIRMWARE_MODE_DEMO_MODE) //demo mode + { + g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEMO_MODE); + } + else if (nMode == FIRMWARE_MODE_DEBUG_MODE) //debug mode + { + g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE); + } +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + else if (nMode == FIRMWARE_MODE_RAW_DATA_MODE) //raw data mode + { + g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE); + } +#endif + else + { + DBG("*** Undefined Firmware Mode ***\n"); + } + } + + DBG("*** g_FirmwareMode = 0x%x ***\n", g_FirmwareMode); + + return nSize; +} + +static DEVICE_ATTR(mode, SYSFS_AUTHORITY, DrvMainFirmwareModeShow, DrvMainFirmwareModeStore); +/* +ssize_t DrvMainFirmwarePacketShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + u32 i = 0; + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + if (g_LogModePacket != NULL) + { + DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]); + DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]); + DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]); + +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7)) +#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62)) +#endif + { + for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++) + { + pBuf[i] = g_LogModePacket[i]; + } + + nLength = g_FirmwareInfo.nLogModePacketLength; + DBG("nLength = %d\n", nLength); + } + else + { + DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n"); +// nLength = 0; + } + } + else + { + DBG("g_LogModePacket is NULL\n"); +// nLength = 0; + } + + return nLength; +} + +ssize_t DrvMainFirmwarePacketStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); + + return nSize; +} + +static DEVICE_ATTR(packet, SYSFS_AUTHORITY, DrvMainFirmwarePacketShow, DrvMainFirmwarePacketStore); +*/ +ssize_t DrvMainFirmwareSensorShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + if (g_FirmwareInfo.nLogModePacketHeader == 0xA5 || g_FirmwareInfo.nLogModePacketHeader == 0xAB) + { + return sprintf(pBuf, "%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy); + } + else if (g_FirmwareInfo.nLogModePacketHeader == 0xA7) + { + return sprintf(pBuf, "%d,%d,%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy, g_FirmwareInfo.nSs, g_FirmwareInfo.nSd); + } + else + { + DBG("Undefined debug mode packet format : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + return 0; + } +#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + return sprintf(pBuf, "%d", g_FirmwareInfo.nLogModePacketLength); +#endif +} + +ssize_t DrvMainFirmwareSensorStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); +/* + DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; +#endif +*/ + return nSize; +} + +static DEVICE_ATTR(sensor, SYSFS_AUTHORITY, DrvMainFirmwareSensorShow, DrvMainFirmwareSensorStore); + +ssize_t DrvMainFirmwareHeaderShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf) +{ + DBG("*** %s() ***\n", __func__); + + return sprintf(pBuf, "%d", g_FirmwareInfo.nLogModePacketHeader); +} + +ssize_t DrvMainFirmwareHeaderStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize) +{ + DBG("*** %s() ***\n", __func__); +/* + DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; +#endif +*/ + return nSize; +} + +static DEVICE_ATTR(header, SYSFS_AUTHORITY, DrvMainFirmwareHeaderShow, DrvMainFirmwareHeaderStore); + +//------------------------------------------------------------------------------// + +ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf) +{ + u32 i = 0; + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + if (strcmp(pAttr->attr.name, "packet") == 0) + { + if (g_LogModePacket != NULL) + { + DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]); + DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]); + DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]); + +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7)) +#elif defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62)) +#endif + { + for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++) + { + pBuf[i] = g_LogModePacket[i]; + } + + nLength = g_FirmwareInfo.nLogModePacketLength; + DBG("nLength = %d\n", nLength); + } + else + { + DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n"); +// nLength = 0; + } + } + else + { + DBG("g_LogModePacket is NULL\n"); +// nLength = 0; + } + } + else + { + DBG("pAttr->attr.name = %s \n", pAttr->attr.name); +// nLength = 0; + } + + return nLength; +} + +ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount) +{ + DBG("*** %s() ***\n", __func__); +/* + if (strcmp(pAttr->attr.name, "packet") == 0) + { + + } +*/ + return nCount; +} + +static struct kobj_attribute packet_attr = __ATTR(packet, 0666, DrvMainKObjectPacketShow, DrvMainKObjectPacketStore); + +/* Create a group of attributes so that we can create and destroy them all at once. */ +static struct attribute *attrs[] = { + &packet_attr.attr, + NULL, /* need to NULL terminate the list of attributes */ +}; + +/* + * An unnamed attribute group will put all of the attributes directly in + * the kobject directory. If we specify a name, a subdirectory will be + * created for the attributes with the directory being the name of the + * attribute group. + */ +struct attribute_group attr_group = { + .attrs = attrs, +}; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +//------------------------------------------------------------------------------// + +s32 DrvMainTouchDeviceInitialize(void) +{ + s32 nRetVal = 0; +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + u8 *pDevicePath = NULL; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + /* set sysfs for firmware */ + _gFirmwareClass = class_create(THIS_MODULE, "ms-touchscreen-msg20xx"); + if (IS_ERR(_gFirmwareClass)) + DBG("Failed to create class(firmware)!\n"); + + _gFirmwareCmdDev = device_create(_gFirmwareClass, NULL, 0, NULL, "device"); + if (IS_ERR(_gFirmwareCmdDev)) + DBG("Failed to create device(_gFirmwareCmdDev)!\n"); + + // version + if (device_create_file(_gFirmwareCmdDev, &dev_attr_version) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_version.attr.name); + // update + if (device_create_file(_gFirmwareCmdDev, &dev_attr_update) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_update.attr.name); + // data + if (device_create_file(_gFirmwareCmdDev, &dev_attr_data) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_data.attr.name); +#ifdef CONFIG_ENABLE_ITO_MP_TEST + // test + if (device_create_file(_gFirmwareCmdDev, &dev_attr_test) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_test.attr.name); + // test_log + if (device_create_file(_gFirmwareCmdDev, &dev_attr_test_log) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_test_log.attr.name); + // test_fail_channel + if (device_create_file(_gFirmwareCmdDev, &dev_attr_test_fail_channel) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_test_fail_channel.attr.name); +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + // mode + if (device_create_file(_gFirmwareCmdDev, &dev_attr_mode) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_mode.attr.name); + // packet +// if (device_create_file(_gFirmwareCmdDev, &dev_attr_packet) < 0) +// DBG("Failed to create device file(%s)!\n", dev_attr_packet.attr.name); + // sensor + if (device_create_file(_gFirmwareCmdDev, &dev_attr_sensor) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_sensor.attr.name); + // header + if (device_create_file(_gFirmwareCmdDev, &dev_attr_header) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_header.attr.name); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + // debug + if (device_create_file(_gFirmwareCmdDev, &dev_attr_debug) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_debug.attr.name); + // platform version + if (device_create_file(_gFirmwareCmdDev, &dev_attr_platform_version) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_platform_version.attr.name); +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + // gesture wakeup mode + if (device_create_file(_gFirmwareCmdDev, &dev_attr_gesture_wakeup_mode) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_gesture_wakeup_mode.attr.name); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + // chip type + if (device_create_file(_gFirmwareCmdDev, &dev_attr_chip_type) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_chip_type.attr.name); + // driver version + if (device_create_file(_gFirmwareCmdDev, &dev_attr_driver_version) < 0) + DBG("Failed to create device file(%s)!\n", dev_attr_driver_version.attr.name); + + dev_set_drvdata(_gFirmwareCmdDev, NULL); +#endif /*CONFIG_UPDATE_FIRMWARE_BY_SW_ID*/ + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + DrvIcFwLyrCreateMpTestWorkQueue(); +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + /* create a kset with the name of "kset_example" which is located under /sys/kernel/ */ + g_TouchKSet = kset_create_and_add("kset_example", NULL, kernel_kobj); + if (!g_TouchKSet) + { + DBG("*** kset_create_and_add() failed, nRetVal = %d ***\n", nRetVal); + + nRetVal = -ENOMEM; + } + + g_TouchKObj = kobject_create(); + if (!g_TouchKObj) + { + DBG("*** kobject_create() failed, nRetVal = %d ***\n", nRetVal); + + nRetVal = -ENOMEM; + kset_unregister(g_TouchKSet); + g_TouchKSet = NULL; + } + + g_TouchKObj->kset = g_TouchKSet; + + nRetVal = kobject_add(g_TouchKObj, NULL, "%s", "kobject_example"); + if (nRetVal != 0) + { + DBG("*** kobject_add() failed, nRetVal = %d ***\n", nRetVal); + + kobject_put(g_TouchKObj); + g_TouchKObj = NULL; + kset_unregister(g_TouchKSet); + g_TouchKSet = NULL; + } + + /* create the files associated with this kobject */ + nRetVal = sysfs_create_group(g_TouchKObj, &attr_group); + if (nRetVal != 0) + { + DBG("*** sysfs_create_file() failed, nRetVal = %d ***\n", nRetVal); + + kobject_put(g_TouchKObj); + g_TouchKObj = NULL; + kset_unregister(g_TouchKSet); + g_TouchKSet = NULL; + } + + pDevicePath = kobject_get_path(g_TouchKObj, GFP_KERNEL); + DBG("DEVPATH = %s\n", pDevicePath); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + g_ChipType = DrvIcFwLyrGetChipType(); + if(g_ChipType != 2) { + pr_err("[Mstar] the chip id error %x\n", g_ChipType); + return -ENODEV; + } + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + // get firmware mode for parsing packet judgement. + g_FirmwareMode = DrvIcFwLyrGetFirmwareMode(); +#endif //CONFIG_ENABLE_CHIP_MSG26XXM + + memset(&g_FirmwareInfo, 0x0, sizeof(FirmwareInfo_t)); + + DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) || defined(CONFIG_ENABLE_CHIP_MSG22XX) + g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; +#endif +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + DrvIcFwLyrCheckFirmwareUpdateBySwId(); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + + return nRetVal; +} + +//------------------------------------------------------------------------------// \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_main.h b/drivers/input/touchscreen/msg2138/mstar_drv_main.h new file mode 100644 index 00000000..e4c8d6f7 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_main.h @@ -0,0 +1,89 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_main.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_MAIN_H__ +#define __MSTAR_DRV_MAIN_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern ssize_t DrvMainFirmwareDataShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareDataStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +extern ssize_t DrvMainFirmwareUpdateShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareUpdateStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +extern ssize_t DrvMainFirmwareVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +extern ssize_t DrvMainFirmwareTestShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareTestStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern ssize_t DrvMainFirmwareGestureWakeupModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareGestureWakeupModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +extern ssize_t DrvMainFirmwareDebugShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareDebugStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +extern ssize_t DrvMainFirmwarePlatformVersionShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwarePlatformVersionStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern ssize_t DrvMainFirmwareHeaderShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareHeaderStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +extern ssize_t DrvMainFirmwareModeShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareModeStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +//extern ssize_t DrvMainFirmwarePacketShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +//extern ssize_t DrvMainFirmwarePacketStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +extern ssize_t DrvMainFirmwareSensorShow(struct device *pDevice, struct device_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainFirmwareSensorStore(struct device *pDevice, struct device_attribute *pAttr, const char *pBuf, size_t nSize); +extern ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern s32 DrvMainTouchDeviceInitialize(void); + +#endif /* __MSTAR_DRV_MAIN_H__ */ diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c new file mode 100644 index 00000000..24314f47 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.c @@ -0,0 +1,209 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_interface.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_platform_interface.h" +#include "mstar_drv_main.h" +#include "mstar_drv_ic_fw_porting_layer.h" +#include "mstar_drv_platform_porting_layer.h" + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern u16 g_GestureWakeupMode; +extern u8 g_GestureWakeupFlag; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +extern struct input_dev *g_InputDevice; + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +void MsDrvInterfaceTouchDeviceSuspend(struct early_suspend *pSuspend) +{ + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +// g_GestureWakeupMode = 0x1FFF; // Enable all gesture wakeup mode for testing + + if (g_GestureWakeupMode != 0x0000) + { + DrvIcFwLyrOpenGestureWakeup(g_GestureWakeupMode); + return; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + DrvPlatformLyrFingerTouchReleased(0, 0); // Send touch end for clearing point touch + input_sync(g_InputDevice); + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDevicePowerOff(); +} + +void MsDrvInterfaceTouchDeviceResume(struct early_suspend *pSuspend) +{ + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + DrvIcFwLyrCloseGestureWakeup(); + } + else + { + DrvPlatformLyrEnableFingerTouchReport(); + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + DrvPlatformLyrTouchDevicePowerOn(); +/* + DrvPlatformLyrFingerTouchReleased(0, 0); + input_sync(g_InputDevice); +*/ +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + DrvIcFwLyrRestoreFirmwareModeToLogDataMode(); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifndef CONFIG_ENABLE_GESTURE_WAKEUP + DrvPlatformLyrEnableFingerTouchReport(); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP +} + +#ifdef TOUCH_VIRTUAL_KEYS +/*static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, + __stringify(EV_KEY) ":" __stringify(KEY_HOMEPAGE) ":192:1000:64:60" + ":" __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":256:1000:64:60" + ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":128:1000:64:60" + ":" __stringify(EV_KEY) ":" __stringify(KEY_SEARCH) ":64:1000:64:60" + "\n"); +}*/ +static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + struct msg2138_ts_platform_data *pdata = g_I2cClient->dev.platform_data; + return sprintf(buf,"%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d:%s:%s:%d:%d:%d:%d\n" + ,__stringify(EV_KEY), __stringify(KEY_APPSELECT),pdata ->virtualkeys[0],pdata ->virtualkeys[1],pdata ->virtualkeys[2],pdata ->virtualkeys[3] + ,__stringify(EV_KEY), __stringify(KEY_HOMEPAGE),pdata ->virtualkeys[4],pdata ->virtualkeys[5],pdata ->virtualkeys[6],pdata ->virtualkeys[7] + ,__stringify(EV_KEY), __stringify(KEY_BACK),pdata ->virtualkeys[8],pdata ->virtualkeys[9],pdata ->virtualkeys[10],pdata ->virtualkeys[11]); +} + +static struct kobj_attribute virtual_keys_attr = { + .attr = { + .name = "virtualkeys.msg2138_ts", + .mode = S_IRUGO, + }, + .show = &virtual_keys_show, +}; + +static struct attribute *properties_attrs[] = { + &virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group properties_attr_group = { + .attrs = properties_attrs, +}; + +static void pixcir_ts_virtual_keys_init(void) +{ + int ret; + struct kobject *properties_kobj; + + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &properties_attr_group); + if (!properties_kobj || ret) + pr_err("failed to create board_properties\n"); +} +#endif + +/* probe function is used for matching and initializing input device */ +s32 /*__devinit*/ MsDrvInterfaceTouchDeviceProbe(struct i2c_client *pClient, const struct i2c_device_id *pDeviceId) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrInputDeviceInitialize(pClient); + + nRetVal = DrvPlatformLyrTouchDeviceRequestGPIO(); + if(nRetVal < 0) { + pr_err("[Mstar] DrvPlatformLyrTouchDeviceRequestGPIO failed %d\n",nRetVal); + return nRetVal; + } + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON + DrvPlatformLyrTouchDeviceRegulatorPowerOn(); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + DrvPlatformLyrTouchDevicePowerOn(); + + nRetVal = DrvMainTouchDeviceInitialize(); + if(nRetVal < 0) { + pr_err("[Mstar] DrvMainTouchDeviceInitialize failed %d\n",nRetVal); + return nRetVal; + } + +#ifdef TOUCH_VIRTUAL_KEYS + pixcir_ts_virtual_keys_init(); +#endif + + DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(); + + DrvPlatformLyrTouchDeviceRegisterEarlySuspend(); + + printk("*** MStar touch driver registered ***\n"); + + return nRetVal; +} + +/* remove function is triggered when the input device is removed from input sub-system */ +s32 /*__devexit*/ MsDrvInterfaceTouchDeviceRemove(struct i2c_client *pClient) +{ + DBG("*** %s() ***\n", __func__); + + return DrvPlatformLyrTouchDeviceRemove(pClient); +} + +void MsDrvInterfaceTouchDeviceSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate) +{ + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrSetIicDataRate(pClient, nIicDataRate); +} diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h new file mode 100644 index 00000000..1d8e8283 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_interface.h @@ -0,0 +1,47 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_interface.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_PLATFORM_INTERFACE_H__ +#define __MSTAR_DRV_PLATFORM_INTERFACE_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern s32 /*__devinit*/ MsDrvInterfaceTouchDeviceProbe(struct i2c_client *pClient, const struct i2c_device_id *pDeviceId); +extern s32 /*__devexit*/ MsDrvInterfaceTouchDeviceRemove(struct i2c_client *pClient); +extern void MsDrvInterfaceTouchDeviceResume(struct early_suspend *pSuspend); +extern void MsDrvInterfaceTouchDeviceSuspend(struct early_suspend *pSuspend); +extern void MsDrvInterfaceTouchDeviceSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate); + +#endif /* __MSTAR_DRV_PLATFORM_INTERFACE_H__ */ diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c new file mode 100644 index 00000000..2d759a8d --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.c @@ -0,0 +1,553 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_porting_layer.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_platform_porting_layer.h" +#include "mstar_drv_ic_fw_porting_layer.h" +#include "mstar_drv_platform_interface.h" + +/*=============================================================*/ +// EXTREN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern struct kset *g_TouchKSet; +extern struct kobject *g_TouchKObj; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +extern struct tpd_device *tpd; +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +extern struct regulator *g_ReguVdd; +#endif + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +struct mutex g_Mutex; +static struct work_struct _gFingerTouchWork; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +static struct early_suspend _gEarlySuspend; +#endif + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifndef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +static DECLARE_WAIT_QUEUE_HEAD(_gWaiter); +static struct task_struct *_gThread = NULL; +static int _gTpdFlag = 0; +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +struct input_dev *g_InputDevice = NULL; +static int _gIrq = -1; + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +/* read data through I2C then report data to input sub-system when interrupt occurred */ +static void _DrvPlatformLyrFingerTouchDoWork(struct work_struct *pWork) +{ + DBG("*** %s() ***\n", __func__); + + mutex_lock(&g_Mutex); + + DrvIcFwLyrHandleFingerTouch(NULL, 0); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +// enable_irq(MS_TS_MSG_IC_GPIO_INT); + enable_irq(_gIrq); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +#endif + + mutex_unlock(&g_Mutex); +} + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +/* The interrupt service routine will be triggered when interrupt occurred */ +static irqreturn_t _DrvPlatformLyrFingerTouchInterruptHandler(s32 nIrq, void *pDeviceId) +{ + DBG("*** %s() ***\n", __func__); + +// disable_irq_nosync(MS_TS_MSG_IC_GPIO_INT); + disable_irq_nosync(_gIrq); + schedule_work(&_gFingerTouchWork); + + return IRQ_HANDLED; +} +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +static void _DrvPlatformLyrFingerTouchInterruptHandler(void) +{ +#ifdef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + schedule_work(&_gFingerTouchWork); +#else + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + + _gTpdFlag = 1; + wake_up_interruptible(&_gWaiter); +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +} + +static int _DrvPlatformLyrFingerTouchHandler(void *pUnUsed) +{ + struct sched_param param = { .sched_priority = RTPM_PRIO_TPD }; + sched_setscheduler(current, SCHED_RR, ¶m); + + do + { + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(_gWaiter, _gTpdFlag != 0); + _gTpdFlag = 0; + + set_current_state(TASK_RUNNING); + + mutex_lock(&g_Mutex); + + DrvIcFwLyrHandleFingerTouch(NULL, 0); + + mutex_unlock(&g_Mutex); + + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + + } while (!kthread_should_stop()); + + return 0; +} +#endif + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +void DrvPlatformLyrTouchDeviceRegulatorPowerOn(void) +{ +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + nRetVal = regulator_set_voltage(g_ReguVdd, 2800000, 2800000); // For specific SPRD BB chip(ex. SC7715) or QCOM BB chip, need to enable this function call for correctly power on Touch IC. + + if (nRetVal) + { + DBG("Could not set to 2800mv.\n"); + } + regulator_enable(g_ReguVdd); + + mdelay(20); //mdelay(100); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + hwPowerOn(MT6323_POWER_LDO_VGP1, VOL_2800, "TP"); // For specific MTK BB chip(ex. MT6582), need to enable this function call for correctly power on Touch IC. +#endif +} +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +void DrvPlatformLyrTouchDevicePowerOn(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 1); +// gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); +// mdelay(100); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0); + mdelay(10); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + mdelay(50); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO); + +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); + mdelay(100); + hwPowerOn(TPD_POWER_SOURCE, VOL_2800, "TP"); + mdelay(10); // reset pulse +#endif //TPD_CLOSE_POWER_IN_SLEEP + + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + mdelay(180); // wait stable +#endif +} + +void DrvPlatformLyrTouchDevicePowerOff(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +// gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 0); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO); +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); +#endif //TPD_CLOSE_POWER_IN_SLEEP +#endif +} + +void DrvPlatformLyrTouchDeviceResetHw(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 1); +// gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0); + mdelay(10); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + mdelay(50); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + mdelay(10); + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO); + mdelay(50); + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + mdelay(50); +#endif +} + +void DrvPlatformLyrDisableFingerTouchReport(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +// disable_irq(MS_TS_MSG_IC_GPIO_RST); + disable_irq(_gIrq); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); +#endif +} + +void DrvPlatformLyrEnableFingerTouchReport(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +// enable_irq(MS_TS_MSG_IC_GPIO_RST); + enable_irq(_gIrq); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +#endif +} + +void DrvPlatformLyrFingerTouchPressed(s32 nX, s32 nY, s32 nPressure, s32 nId) +{ + DBG("*** %s() ***\n", __func__); + DBG("point touch pressed\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 1); +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + input_report_abs(g_InputDevice, ABS_MT_TRACKING_ID, nId); +#endif //CONFIG_ENABLE_CHIP_MSG26XXM + input_report_abs(g_InputDevice, ABS_MT_TOUCH_MAJOR, 1); + input_report_abs(g_InputDevice, ABS_MT_WIDTH_MAJOR, 1); + input_report_abs(g_InputDevice, ABS_MT_POSITION_X, nX); + input_report_abs(g_InputDevice, ABS_MT_POSITION_Y, nY); + + input_mt_sync(g_InputDevice); + +} + +void DrvPlatformLyrFingerTouchReleased(s32 nX, s32 nY) +{ + DBG("*** %s() ***\n", __func__); + DBG("point touch released\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 0); + input_mt_sync(g_InputDevice); + +} + +s32 DrvPlatformLyrInputDeviceInitialize(struct i2c_client *pClient) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + mutex_init(&g_Mutex); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + /* allocate an input device */ + g_InputDevice = input_allocate_device(); + if (g_InputDevice == NULL) + { + DBG("*** input device allocation failed ***\n"); + return -ENOMEM; + } + + g_InputDevice->name = MSG_TP_IC_NAME; + g_InputDevice->phys = "I2C"; + g_InputDevice->dev.parent = &pClient->dev; + g_InputDevice->id.bustype = BUS_I2C; + + /* set the supported event type for input device */ + __set_bit(EV_KEY, g_InputDevice->evbit); + __set_bit(EV_ABS, g_InputDevice->evbit); + __set_bit(EV_SYN, g_InputDevice->evbit); + //__set_bit(BTN_TOUCH, g_InputDevice->keybit); + __set_bit(ABS_MT_TOUCH_MAJOR, g_InputDevice->absbit); + __set_bit(ABS_MT_POSITION_X, g_InputDevice->absbit); + __set_bit(ABS_MT_POSITION_Y, g_InputDevice->absbit); + __set_bit(ABS_MT_WIDTH_MAJOR, g_InputDevice->absbit); + + __set_bit(KEY_MENU, g_InputDevice->keybit); + __set_bit(KEY_BACK, g_InputDevice->keybit); + __set_bit(KEY_HOME, g_InputDevice->keybit); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + input_set_capability(g_InputDevice, EV_KEY, KEY_POWER); + input_set_capability(g_InputDevice, EV_KEY, KEY_UP); + input_set_capability(g_InputDevice, EV_KEY, KEY_DOWN); + input_set_capability(g_InputDevice, EV_KEY, KEY_LEFT); + input_set_capability(g_InputDevice, EV_KEY, KEY_RIGHT); + input_set_capability(g_InputDevice, EV_KEY, KEY_W); + input_set_capability(g_InputDevice, EV_KEY, KEY_Z); + input_set_capability(g_InputDevice, EV_KEY, KEY_V); + input_set_capability(g_InputDevice, EV_KEY, KEY_O); + input_set_capability(g_InputDevice, EV_KEY, KEY_M); + input_set_capability(g_InputDevice, EV_KEY, KEY_C); + input_set_capability(g_InputDevice, EV_KEY, KEY_E); + input_set_capability(g_InputDevice, EV_KEY, KEY_S); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/* +#ifdef CONFIG_TP_HAVE_KEY + set_bit(TOUCH_KEY_MENU, g_InputDevice->keybit); //Menu + set_bit(TOUCH_KEY_HOME, g_InputDevice->keybit); //Home + set_bit(TOUCH_KEY_BACK, g_InputDevice->keybit); //Back + set_bit(TOUCH_KEY_SEARCH, g_InputDevice->keybit); //Search +#endif +*/ + +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + input_set_abs_params(g_InputDevice, ABS_MT_TRACKING_ID, 0, 255, 0, 0); +#endif //CONFIG_ENABLE_CHIP_MSG26XXM + input_set_abs_params(g_InputDevice, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_X, 0, TOUCH_SCREEN_X_MAX, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_Y, 0, TOUCH_SCREEN_Y_MAX, 0, 0); + + /* register the input device to input sub-system */ + nRetVal = input_register_device(g_InputDevice); + if (nRetVal < 0) + { + DBG("*** Unable to register touch input device ***\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + g_InputDevice = tpd->dev; + +// g_InputDevice->name = pClient->name; + g_InputDevice->phys = "I2C"; + g_InputDevice->dev.parent = &pClient->dev; + g_InputDevice->id.bustype = BUS_I2C; + + /* set the supported event type for input device */ + set_bit(EV_ABS, g_InputDevice->evbit); + set_bit(EV_SYN, g_InputDevice->evbit); + set_bit(EV_KEY, g_InputDevice->evbit); + set_bit(BTN_TOUCH, g_InputDevice->keybit); + set_bit(INPUT_PROP_DIRECT, g_InputDevice->propbit); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + input_set_capability(g_InputDevice, EV_KEY, KEY_POWER); + input_set_capability(g_InputDevice, EV_KEY, KEY_UP); + input_set_capability(g_InputDevice, EV_KEY, KEY_DOWN); + input_set_capability(g_InputDevice, EV_KEY, KEY_LEFT); + input_set_capability(g_InputDevice, EV_KEY, KEY_RIGHT); + input_set_capability(g_InputDevice, EV_KEY, KEY_W); + input_set_capability(g_InputDevice, EV_KEY, KEY_Z); + input_set_capability(g_InputDevice, EV_KEY, KEY_V); + input_set_capability(g_InputDevice, EV_KEY, KEY_O); + input_set_capability(g_InputDevice, EV_KEY, KEY_M); + input_set_capability(g_InputDevice, EV_KEY, KEY_C); + input_set_capability(g_InputDevice, EV_KEY, KEY_E); + input_set_capability(g_InputDevice, EV_KEY, KEY_S); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/* +#ifdef CONFIG_TP_HAVE_KEY + set_bit(TOUCH_KEY_MENU, g_InputDevice->keybit); //Menu + set_bit(TOUCH_KEY_HOME, g_InputDevice->keybit); //Home + set_bit(TOUCH_KEY_BACK, g_InputDevice->keybit); //Back + set_bit(TOUCH_KEY_SEARCH, g_InputDevice->keybit); //Search +#endif +*/ + +#if defined(CONFIG_ENABLE_CHIP_MSG26XXM) + input_set_abs_params(g_InputDevice, ABS_MT_TRACKING_ID, 0, 255, 0, 0); +#endif //CONFIG_ENABLE_CHIP_MSG26XXM + input_set_abs_params(g_InputDevice, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_X, 0, TOUCH_SCREEN_X_MAX, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_Y, 0, TOUCH_SCREEN_Y_MAX, 0, 0); +#endif + + return nRetVal; +} + +s32 DrvPlatformLyrTouchDeviceRequestGPIO(void) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + nRetVal = gpio_request(MS_TS_MSG_IC_GPIO_RST, "C_TP_RST"); + if (nRetVal < 0) + { + DBG("*** Failed to request GPIO %d, error %d ***\n", MS_TS_MSG_IC_GPIO_RST, nRetVal); + } + + nRetVal = gpio_request(MS_TS_MSG_IC_GPIO_INT, "C_TP_INT"); + if (nRetVal < 0) + { + DBG("*** Failed to request GPIO %d, error %d ***\n", MS_TS_MSG_IC_GPIO_INT, nRetVal); + } +#endif + + return nRetVal; +} + +s32 DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(void) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + if (DrvIcFwLyrIsRegisterFingerTouchInterruptHandler()) + { +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + /* initialize the finger touch work queue */ + INIT_WORK(&_gFingerTouchWork, _DrvPlatformLyrFingerTouchDoWork); + + _gIrq = gpio_to_irq(MS_TS_MSG_IC_GPIO_INT); + + /* request an irq and register the isr */ + nRetVal = request_irq(_gIrq/*MS_TS_MSG_IC_GPIO_INT*/, _DrvPlatformLyrFingerTouchInterruptHandler, + IRQF_TRIGGER_RISING /* | IRQF_NO_SUSPEND *//* IRQF_TRIGGER_FALLING */, + "msg2xxx", NULL); + if (nRetVal != 0) + { + DBG("*** Unable to claim irq %d; error %d ***\n", MS_TS_MSG_IC_GPIO_INT, nRetVal); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_INT, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_INT, GPIO_DIR_IN); + mt_set_gpio_pull_enable(MS_TS_MSG_IC_GPIO_INT, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(MS_TS_MSG_IC_GPIO_INT, GPIO_PULL_UP); + + mt_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN); + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, EINTF_TRIGGER_RISING, _DrvPlatformLyrFingerTouchInterruptHandler, 1); + + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + +#ifdef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + /* initialize the finger touch work queue */ + INIT_WORK(&_gFingerTouchWork, _DrvPlatformLyrFingerTouchDoWork); +#else + _gThread = kthread_run(_DrvPlatformLyrFingerTouchHandler, 0, TPD_DEVICE); + if (IS_ERR(_gThread)) + { + nRetVal = PTR_ERR(_gThread); + DBG("Failed to create kernel thread: %d\n", nRetVal); + } +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +#endif + } + + return nRetVal; +} + +void DrvPlatformLyrTouchDeviceRegisterEarlySuspend(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + _gEarlySuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + _gEarlySuspend.suspend = MsDrvInterfaceTouchDeviceSuspend; + _gEarlySuspend.resume = MsDrvInterfaceTouchDeviceResume; + register_early_suspend(&_gEarlySuspend); +#endif +} + +/* remove function is triggered when the input device is removed from input sub-system */ +s32 DrvPlatformLyrTouchDeviceRemove(struct i2c_client *pClient) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +// free_irq(MS_TS_MSG_IC_GPIO_INT, g_InputDevice); + free_irq(_gIrq, g_InputDevice); + gpio_free(MS_TS_MSG_IC_GPIO_INT); + gpio_free(MS_TS_MSG_IC_GPIO_RST); + input_unregister_device(g_InputDevice); +#endif +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + kset_unregister(g_TouchKSet); + kobject_put(g_TouchKObj); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + return 0; +} + +void DrvPlatformLyrSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate) +{ + DBG("*** %s() nIicDataRate = %d ***\n", __func__, nIicDataRate); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + // TODO : Please FAE colleague to confirm with customer device driver engineer for how to set i2c data rate on SPRD platform + //sprd_i2c_ctl_chg_clk(pClient->adapter->nr, nIicDataRate); + //mdelay(100); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + // TODO : Please FAE colleague to confirm with customer device driver engineer for how to set i2c data rate on QCOM platform +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + pClient->timing = nIicDataRate/1000; +#endif +} \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h new file mode 100644 index 00000000..f1f5aaa7 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_platform_porting_layer.h @@ -0,0 +1,125 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_porting_layer.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ +#define __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + +#include +#include + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + +#include +#include +#include +#include +#include +#include +//#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include "tpd.h" +#include "cust_gpio_usage.h" + +#endif + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/* + * Note. + * Please change the below GPIO pin setting to follow the platform that you are using(EX. MediaTek, Spreadtrum, Qualcomm). + */ +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + +// TODO : Please FAE colleague to confirm with customer device driver engineer about the value of RST and INT GPIO setting +//#define MS_TS_MSG_IC_GPIO_RST GPIO_TOUCH_RESET //53 //35 +//#define MS_TS_MSG_IC_GPIO_INT GPIO_TOUCH_IRQ //52 //37 + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + +// TODO : Please FAE colleague to confirm with customer device driver engineer about the value of RST and INT GPIO setting +#define MS_TS_MSG_IC_GPIO_RST 0 +#define MS_TS_MSG_IC_GPIO_INT 1 +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +#define MS_TS_MSG_IC_GPIO_RST (GPIO_CTP_RST_PIN) +#define MS_TS_MSG_IC_GPIO_INT (GPIO_CTP_EINT_PIN) +#endif + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern void DrvPlatformLyrDisableFingerTouchReport(void); +extern void DrvPlatformLyrEnableFingerTouchReport(void); +extern void DrvPlatformLyrFingerTouchPressed(s32 nX, s32 nY, s32 nPressure, s32 nId); +extern void DrvPlatformLyrFingerTouchReleased(s32 nX, s32 nY); +extern s32 DrvPlatformLyrInputDeviceInitialize(struct i2c_client *pClient); +extern void DrvPlatformLyrSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate); +extern void DrvPlatformLyrTouchDevicePowerOff(void); +extern void DrvPlatformLyrTouchDevicePowerOn(void); +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +extern void DrvPlatformLyrTouchDeviceRegulatorPowerOn(void); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON +extern void DrvPlatformLyrTouchDeviceRegisterEarlySuspend(void); +extern s32 DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(void); +extern s32 DrvPlatformLyrTouchDeviceRemove(struct i2c_client *pClient); +extern s32 DrvPlatformLyrTouchDeviceRequestGPIO(void); +extern void DrvPlatformLyrTouchDeviceResetHw(void); + +#endif /* __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ */ diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c new file mode 100644 index 00000000..dbe21439 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.c @@ -0,0 +1,3974 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_fw_control.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_self_fw_control.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_platform_porting_layer.h" + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ +static const int g_TpVirtualKeyDimLocal[3][4] = { {256,1000,70,70}, // virtualkey 1 MENU + {128,1000,70,70}, // virtualkey 4 HOME + {192,1000,70,70} }; // virtualkey 2 BACK + +struct point_node_t point_slot[MAX_FINGER_NUM*2]; +static int keycode; + +extern struct input_dev *g_InputDevice; + +extern u8 g_FwData[94][1024]; +extern u32 g_FwDataCount; + +extern struct mutex g_Mutex; + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern struct kobject *g_TouchKObj; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u8 _gTpVendorCode[3] = {0}; + +static u8 _gDwIicInfoData[1024]; +static u8 _gOneDimenFwData[MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE*1024+MSG22XX_FIRMWARE_INFO_BLOCK_SIZE] = {0}; // used for MSG22XX + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +/* + * Note. + * Please modify the name of the below .h depends on the vendor TP that you are using. + */ +static unsigned char msg2xxx_yyyy_update_bin[] = { +}; +static unsigned char msg2xxx_xxxx_update_bin[] = { +#include "msg2xxx_xxxx_update_bin.h" +}; + +static u32 _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; +static struct work_struct _gUpdateFirmwareBySwIdWork; +static struct workqueue_struct *_gUpdateFirmwareBySwIdWorkQueue = NULL; + +static u32 _gIsUpdateInfoBlockFirst = 0; +static u8 _gIsUpdateFirmware = 0x00; + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +static u16 _gGestureWakeupValue = 0; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +u8 g_ChipType = 0; +u8 g_DemoModePacket[DEMO_MODE_PACKET_LENGTH] = {0}; + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +FirmwareInfo_t g_FirmwareInfo; + +u8 *g_LogModePacket = NULL; +u16 g_FirmwareMode = FIRMWARE_MODE_DEMO_MODE; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +u8 *_gGestureWakeupPacket = NULL; + +u16 g_GestureWakeupMode = 0x0000; +u8 g_GestureWakeupFlag = 0; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*=============================================================*/ +// LOCAL FUNCTION DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +unsigned char tpd_check_sum(unsigned char *pval) +{ + int i, sum = 0; + for(i = 0; i < 7; i++) + sum += pval[i]; + return (unsigned char)((-sum) & 0xFF); +} + +static void _DrvFwCtrlEraseEmemC32(void) +{ + DBG("*** %s() ***\n", __func__); + + ///////////////////////// + //Erase all + ///////////////////////// + + // Enter gpio mode + RegSet16BitValue(0x161E, 0xBEAF); + + // Before gpio mode, set the control pin as the orginal status + RegSet16BitValue(0x1608, 0x0000); + RegSetLByteValue(0x160E, 0x10); + mdelay(10); + + // ptrim = 1, h'04[2] + RegSetLByteValue(0x1608, 0x04); + RegSetLByteValue(0x160E, 0x10); + mdelay(10); + + // ptm = 6, h'04[12:14] = b'110 + RegSetLByteValue(0x1609, 0x60); + RegSetLByteValue(0x160E, 0x10); + + // pmasi = 1, h'04[6] + RegSetLByteValue(0x1608, 0x44); + // pce = 1, h'04[11] + RegSetLByteValue(0x1609, 0x68); + // perase = 1, h'04[7] + RegSetLByteValue(0x1608, 0xC4); + // pnvstr = 1, h'04[5] + RegSetLByteValue(0x1608, 0xE4); + // pwe = 1, h'04[9] + RegSetLByteValue(0x1609, 0x6A); + // trigger gpio load + RegSetLByteValue(0x160E, 0x10); +} + +static void _DrvFwCtrlEraseEmemC33(EmemType_e eEmemType) +{ + DBG("*** %s() ***\n", __func__); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Set PROGRAM password + RegSetLByteValue(0x161A, 0xBA); + RegSetLByteValue(0x161B, 0xAB); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + + if (eEmemType == EMEM_ALL) + { + RegSetLByteValue(0x1608, 0x10); //mark + } + + RegSetLByteValue(0x1618, 0x40); + mdelay(10); + + RegSetLByteValue(0x1618, 0x80); + + // erase trigger + if (eEmemType == EMEM_MAIN) + { + RegSetLByteValue(0x160E, 0x04); //erase main + } + else + { + RegSetLByteValue(0x160E, 0x08); //erase all block + } +} + +static void _DrvFwCtrlMsg22xxGetTpVendorCode(u8 *pTpVendorCode) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + u16 nRegData1, nRegData2; + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Clear pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0xC1E9); // Set start address for tp vendor code on info block(Actually, start reading from 0xC1E8) + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + // Set pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + pTpVendorCode[0] = ((nRegData1 >> 8) & 0xFF); + pTpVendorCode[1] = (nRegData2 & 0xFF); + pTpVendorCode[2] = ((nRegData2 >> 8) & 0xFF); + + DBG("pTpVendorCode[0] = 0x%x , %c \n", pTpVendorCode[0], pTpVendorCode[0]); + DBG("pTpVendorCode[1] = 0x%x , %c \n", pTpVendorCode[1], pTpVendorCode[1]); + DBG("pTpVendorCode[2] = 0x%x , %c \n", pTpVendorCode[2], pTpVendorCode[2]); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(100); + } +} + +static void _DrvFwCtrlMsg22xxEraseEmem(EmemType_e eEmemType) +{ + u32 i; + u16 nRegData = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + DBG("Erase start\n"); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Set PROGRAM password + RegSetLByteValue(0x161A, 0xBA); + RegSetLByteValue(0x161B, 0xAB); + + if (eEmemType == EMEM_ALL) // 48KB + 512Byte + { + DBG("Erase all block\n"); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(100); + + // Chip erase + RegSet16BitValue(0x160E, BIT3); + + DBG("Wait erase done flag\n"); + + do // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + mdelay(50); + } while((nRegData & BIT1) != BIT1); + } + else if (eEmemType == EMEM_MAIN) // 48KB (32+8+8) + { + DBG("Erase main block\n"); + + for (i = 0; i < 3; i ++) + { + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + if (i == 0) + { + RegSet16BitValue(0x1600, 0x0000); + } + else if (i == 1) + { + RegSet16BitValue(0x1600, 0x8000); + } + else if (i == 2) + { + RegSet16BitValue(0x1600, 0xA000); + } + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + do // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + mdelay(50); + } while((nRegData & BIT1) != BIT1); + } + } + else if (eEmemType == EMEM_INFO) // 512Byte + { + DBG("Erase info block\n"); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + RegSet16BitValue(0x1600, 0xC000); + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + do // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + mdelay(50); + } while((nRegData & BIT1) != BIT1); + } + + DBG("Erase end\n"); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); +} + +static void _DrvFwCtrlMsg22xxProgramEmem(EmemType_e eEmemType) // For MSG22XX +{ + u32 i, j; + u32 nRemainSize = 0, nBlockSize = 0, nSize = 0, index = 0; + u16 nRegData; + u8 szDbBusTxData[1024] = {0}; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + u32 nSizePerWrite = 125; +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + u32 nSizePerWrite = 1021; +#endif + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + // Hold reset pin before program + RegSetLByteValue(0x1E06, 0x00); + + DBG("Program start\n"); + + RegSet16BitValue(0x161A, 0xABBA); + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + if (eEmemType == EMEM_MAIN) + { + DBG("Program main block\n"); + + RegSet16BitValue(0x1600, 0x0000); // Set start address of main block + nRemainSize = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; //48KB + index = 0; + } + else if (eEmemType == EMEM_INFO) + { + DBG("Program info block\n"); + + RegSet16BitValue(0x1600, 0xC000); // Set start address of info block + nRemainSize = MSG22XX_FIRMWARE_INFO_BLOCK_SIZE; //512Byte + index = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; + } + else + { + DBG("eEmemType = %d is not supported for program e-memory.\n", eEmemType); + return; + } + + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode + + // Program start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + i = 0; + + while (nRemainSize > 0) + { + if (nRemainSize > nSizePerWrite) + { + nBlockSize = nSizePerWrite; + } + else + { + nBlockSize = nRemainSize; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + nSize = 3; + + for (j = 0; j < nBlockSize; j ++) + { + szDbBusTxData[3+j] = _gOneDimenFwData[index+(i*nSizePerWrite)+j]; + nSize ++; + } + i ++; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize); + + nRemainSize = nRemainSize - nBlockSize; + } + + // Program end + szDbBusTxData[0] = 0x21; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRegData = RegGet16BitValue(0x160C); + RegSet16BitValue(0x160C, nRegData & (~0x01)); + + DBG("Wait write done flag\n"); + + // Polling 0x1610 is 0x0002 + do + { + nRegData = RegGet16BitValue(0x1610); + nRegData = nRegData & BIT1; + mdelay(10); + + } while (nRegData != BIT1); // Wait write done flag + + DBG("Program end\n"); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +} + +static u32 _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EmemType_e eEmemType) // For MSG22XX +{ + u16 nCrcDown = 0; + u32 nRetVal = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Set PCE high + RegSetLByteValue(0x1618, 0x40); + + if (eEmemType == EMEM_MAIN) + { + // Set start address and end address for main block + RegSet16BitValue(0x1600, 0x0000); + RegSet16BitValue(0x1640, 0xBFF8); + } + else if (eEmemType == EMEM_INFO) + { + // Set start address and end address for info block + RegSet16BitValue(0x1600, 0xC000); + RegSet16BitValue(0x1640, 0xC1F8); + } + + // CRC reset + RegSet16BitValue(0x164E, 0x0001); + + RegSet16BitValue(0x164E, 0x0000); + + // Trigger CRC check + RegSetLByteValue(0x160E, 0x20); + mdelay(10); + + nCrcDown = RegGet16BitValue(0x164E); + + while (nCrcDown != 2) + { + DBG("Wait CRC down\n"); + mdelay(10); + nCrcDown = RegGet16BitValue(0x164E); + } + + nRetVal = RegGet16BitValue(0x1652); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x1650); + + DBG("Hardware CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static void _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(u8 szTwoDimenFwData[][1024], u8* pOneDimenFwData) +{ + u32 i, j; + + DBG("*** %s() ***\n", __func__); + + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + for (j = 0; j < 1024; j ++) + { + pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j]; + } + } + else // i == 48 + { + for (j = 0; j < 512; j ++) + { + pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j]; + } + } + } +} + +static s32 _DrvFwCtrlParsePacket(u8 *pPacket, u16 nLength, TouchInfo_t *pInfo) +{ + u8 nCheckSum = 0; + u32 nDeltaX = 0, nDeltaY = 0; + u32 nX = 0; + u32 nY = 0; +#ifdef CONFIG_SWAP_X_Y + u32 nTempX; + u32 nTempY; +#endif +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + u8 nCheckSumIndex = 0; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + nCheckSumIndex = 7; + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) + { + nCheckSumIndex = 31; + } + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + nCheckSumIndex = nLength-1; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + nCheckSum = DrvCommonCalculateCheckSum(&pPacket[0], nCheckSumIndex); + DBG("check sum : [%x] == [%x]? \n", pPacket[nCheckSumIndex], nCheckSum); +#else + nCheckSum = DrvCommonCalculateCheckSum(&pPacket[0], (nLength-1)); + DBG("check ksum : [%x] == [%x]? \n", pPacket[nLength-1], nCheckSum); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + u8 nWakeupMode = 0; + u8 bIsCorrectFormat = 0; + + DBG("received raw data from touch panel as following:\n"); + DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x pPacket[5]=%x \n", \ + pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5]); + + if (g_ChipType == CHIP_TYPE_MSG22XX && pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x06 && pPacket[3] == 0x50) + { + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + } + else if (g_ChipType == CHIP_TYPE_MSG21XXA && pPacket[0] == 0x52 && pPacket[1] == 0xFF && pPacket[2] == 0xFF && pPacket[3] == 0xFF && pPacket[4] == 0xFF && pPacket[6] == 0xFF) + { + nWakeupMode = pPacket[5]; + bIsCorrectFormat = 1; + } + + if (bIsCorrectFormat) + { + DBG("nWakeupMode = 0x%x\n", nWakeupMode); + + switch (nWakeupMode) + { + case 0x58: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG; + + DBG("Light up screen by DOUBLE_CLICK gesture wakeup.\n"); + + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x60: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG; + + DBG("Light up screen by UP_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_UP, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_UP, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x61: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG; + + DBG("Light up screen by DOWN_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_DOWN, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_DOWN, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x62: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG; + + DBG("Light up screen by LEFT_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_LEFT, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_LEFT, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x63: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG; + + DBG("Light up screen by RIGHT_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_RIGHT, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_RIGHT, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x64: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG; + + DBG("Light up screen by m_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_M, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_M, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x65: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG; + + DBG("Light up screen by W_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_W, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_W, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x66: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG; + + DBG("Light up screen by C_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_C, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_C, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x67: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG; + + DBG("Light up screen by e_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_E, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_E, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x68: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG; + + DBG("Light up screen by V_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_V, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_V, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x69: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG; + + DBG("Light up screen by O_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_O, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_O, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6A: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG; + + DBG("Light up screen by S_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_S, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_S, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6B: + _gGestureWakeupValue = GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG; + + DBG("Light up screen by Z_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_Z, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_Z, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + default: + _gGestureWakeupValue = 0; + break; + } + + DBG("_gGestureWakeupValue = 0x%x\n", _gGestureWakeupValue); + } + else + { + DBG("gesture wakeup packet format is incorrect.\n"); + } + + return -1; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + DBG("received raw data from touch panel as following:\n"); + DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x \n pPacket[5]=%x pPacket[6]=%x pPacket[7]=%x \n", \ + pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5], pPacket[6], pPacket[7]); + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + if ((pPacket[nCheckSumIndex] == nCheckSum) && (pPacket[0] == 0x52)) // check the checksum of packet +#else + if ((pPacket[nLength-1] == nCheckSum) && (pPacket[0] == 0x52)) // check the checksum of packet +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + { + nX = (((pPacket[1] & 0xF0) << 4) | pPacket[2]); // parse the packet to coordinate + nY = (((pPacket[1] & 0x0F) << 8) | pPacket[3]); + + nDeltaX = (((pPacket[4] & 0xF0) << 4) | pPacket[5]); + nDeltaY = (((pPacket[4] & 0x0F) << 8) | pPacket[6]); + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("[delta_x,delta_y]=[%d,%d]\n", nDeltaX, nDeltaY); + +#ifdef CONFIG_SWAP_X_Y + nTempY = nX; + nTempX = nY; + nX = nTempX; + nY = nTempY; + + nTempY = nDeltaX; + nTempX = nDeltaY; + nDeltaX = nTempX; + nDeltaY = nTempY; +#endif + +#ifdef CONFIG_REVERSE_X + nX = 2047 - nX; + nDeltaX = 4095 - nDeltaX; +#endif + +#ifdef CONFIG_REVERSE_Y + nY = 2047 - nY; + nDeltaY = 4095 - nDeltaY; +#endif + + /* + * pPacket[0]:id, pPacket[1]~pPacket[3]:the first point abs, pPacket[4]~pPacket[6]:the relative distance between the first point abs and the second point abs + * when pPacket[1]~pPacket[4], pPacket[6] is 0xFF, keyevent, pPacket[5] to judge which key press. + * pPacket[1]~pPacket[6] all are 0xFF, release touch + */ + if ((pPacket[1] == 0xFF) && (pPacket[2] == 0xFF) && (pPacket[3] == 0xFF) && (pPacket[4] == 0xFF) && (pPacket[6] == 0xFF)) + { + pInfo->tPoint[0].nX = 0; // final X coordinate + pInfo->tPoint[0].nY = 0; // final Y coordinate + + if ((pPacket[5] != 0x00) && (pPacket[5] != 0xFF)) /* pPacket[5] is key value */ + { /* 0x00 is key up, 0xff is touch screen up */ + DBG("touch key down pPacket[5]=%d\n", pPacket[5]); + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = pPacket[5]; + pInfo->nTouchKeyMode = 1; + +#if 1 + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + + if (pPacket[5] == 1) // TOUCH_KEY_MENU + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[0][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[0][1]; + } + else if (pPacket[5] == 2) // TOUCH_KEY_BACK + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[2][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[2][1]; + } + else if (pPacket[5] == 4) // TOUCH_KEY_HOME + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[1][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[1][1]; + } + else + { + DBG("multi-key is pressed.\n"); + return -1; + } +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + } + else + { /* key up or touch up */ + DBG("touch end\n"); + pInfo->nFingerNum = 0; //touch end + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + } + } + else + { + pInfo->nTouchKeyMode = 0; //Touch on screen... + +// if ((nDeltaX == 0) && (nDeltaY == 0)) + if( +#ifdef CONFIG_REVERSE_X + (nDeltaX == 4095) +#else + (nDeltaX == 0) +#endif + && +#ifdef CONFIG_REVERSE_Y + (nDeltaY == 4095) +#else + (nDeltaY == 0) +#endif + ) + { /* one touch point */ + pInfo->nFingerNum = 1; // one touch + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY); + DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + } + else + { /* two touch points */ + u32 nX2, nY2; + + pInfo->nFingerNum = 2; // two touch + /* Finger 1 */ + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point1[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + /* Finger 2 */ + if (nDeltaX > 2048) // transform the unsigned value to signed value + { + nDeltaX -= 4096; + } + + if (nDeltaY > 2048) + { + nDeltaY -= 4096; + } + + nX2 = (u32)(nX + nDeltaX); + nY2 = (u32)(nY + nDeltaY); + + pInfo->tPoint[1].nX = (nX2 * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[1].nY = (nY2 * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point2[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[1].nX, pInfo->tPoint[1].nY); + } + } + } +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + else if (pPacket[nCheckSumIndex] == nCheckSum && pPacket[0] == 0x62) + { + nX = ((pPacket[1] << 8) | pPacket[2]); // Position_X + nY = ((pPacket[3] << 8) | pPacket[4]); // Position_Y + + nDeltaX = ((pPacket[13] << 8) | pPacket[14]); // Distance_X + nDeltaY = ((pPacket[15] << 8) | pPacket[16]); // Distance_Y + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("[delta_x,delta_y]=[%d,%d]\n", nDeltaX, nDeltaY); + +#ifdef CONFIG_SWAP_X_Y + nTempY = nX; + nTempX = nY; + nX = nTempX; + nY = nTempY; + + nTempY = nDeltaX; + nTempX = nDeltaY; + nDeltaX = nTempX; + nDeltaY = nTempY; +#endif + +#ifdef CONFIG_REVERSE_X + nX = 2047 - nX; + nDeltaX = 4095 - nDeltaX; +#endif + +#ifdef CONFIG_REVERSE_Y + nY = 2047 - nY; + nDeltaY = 4095 - nDeltaY; +#endif + + /* + * pPacket[0]:id, pPacket[1]~pPacket[4]:the first point abs, pPacket[13]~pPacket[16]:the relative distance between the first point abs and the second point abs + * when pPacket[1]~pPacket[7] is 0xFF, keyevent, pPacket[8] to judge which key press. + * pPacket[1]~pPacket[8] all are 0xFF, release touch + */ + if ((pPacket[1] == 0xFF) && (pPacket[2] == 0xFF) && (pPacket[3] == 0xFF) && (pPacket[4] == 0xFF) && (pPacket[5] == 0xFF) && (pPacket[6] == 0xFF) && (pPacket[7] == 0xFF)) + { + pInfo->tPoint[0].nX = 0; // final X coordinate + pInfo->tPoint[0].nY = 0; // final Y coordinate + + if ((pPacket[8] != 0x00) && (pPacket[8] != 0xFF)) /* pPacket[8] is key value */ + { /* 0x00 is key up, 0xff is touch screen up */ + DBG("touch key down pPacket[8]=%d\n", pPacket[8]); + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = pPacket[8]; + pInfo->nTouchKeyMode = 1; + +#if 1 + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + + if (pPacket[8] == 1) // TOUCH_KEY_MENU + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[0][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[0][1]; + } + else if (pPacket[8] == 2) // TOUCH_KEY_BACK + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[2][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[2][1]; + } + else if (pPacket[8] == 4) // TOUCH_KEY_HOME + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[1][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[1][1]; + } + else + { + DBG("multi-key is pressed.\n"); + return -1; + } +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + } + else + { /* key up or touch up */ + DBG("touch end\n"); + pInfo->nFingerNum = 0; //touch end + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + } + } + else + { + pInfo->nTouchKeyMode = 0; //Touch on screen... + +// if ((nDeltaX == 0) && (nDeltaY == 0)) + if ( +#ifdef CONFIG_REVERSE_X + (nDeltaX == 4095) +#else + (nDeltaX == 0) +#endif + && +#ifdef CONFIG_REVERSE_Y + (nDeltaY == 4095) +#else + (nDeltaY == 0) +#endif + ) + { /* one touch point */ + pInfo->nFingerNum = 1; // one touch + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY); + DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + } + else + { /* two touch points */ + u32 nX2, nY2; + + pInfo->nFingerNum = 2; // two touch + /* Finger 1 */ + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point1[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + /* Finger 2 */ + if (nDeltaX > 2048) // transform the unsigned value to signed value + { + nDeltaX -= 4096; + } + + if (nDeltaY > 2048) + { + nDeltaY -= 4096; + } + + nX2 = (u32)(nX + nDeltaX); + nY2 = (u32)(nY + nDeltaY); + + pInfo->tPoint[1].nX = (nX2 * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[1].nY = (nY2 * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point2[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[1].nX, pInfo->tPoint[1].nY); + } + + // Notify android application to retrieve log data mode packet from device driver by sysfs. + if (g_TouchKObj != NULL) + { + char *pEnvp[2]; + s32 nRetVal = 0; + + pEnvp[0] = "STATUS=GET_PACKET"; + pEnvp[1] = NULL; + + nRetVal = kobject_uevent_env(g_TouchKObj, KOBJ_CHANGE, pEnvp); + DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal); + } + } + } + else + { + if (pPacket[nCheckSumIndex] != nCheckSum) + { + DBG("WRONG CHECKSUM\n"); + return -1; + } + + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE && pPacket[0] != 0x52) + { + DBG("WRONG DEMO MODE HEADER\n"); + return -1; + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && pPacket[0] != 0x62) + { + DBG("WRONG DEBUG MODE HEADER\n"); + return -1; + } + else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE && pPacket[0] != 0x62) + { + DBG("WRONG RAW DATA MODE HEADER\n"); + return -1; + } + } +#else + else + { + DBG("pPacket[0]=0x%x, pPacket[7]=0x%x, nCheckSum=0x%x\n", pPacket[0], pPacket[7], nCheckSum); + + if (pPacket[nLength-1] != nCheckSum) + { + DBG("WRONG CHECKSUM\n"); + return -1; + } + + if (pPacket[0] != 0x52) + { + DBG("WRONG DEMO MODE HEADER\n"); + return -1; + } + } +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + + return 0; +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +static void _DrvFwCtrlStoreFirmwareData(u8 *pBuf, u32 nSize) +{ + u32 nCount = nSize / 1024; + u32 i; + + DBG("*** %s() ***\n", __func__); + + if (nCount > 0) // nSize >= 1024 + { + for (i = 0; i < nCount; i ++) + { + memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024); + + g_FwDataCount ++; + } + } + else // nSize < 1024 + { + if (nSize > 0) + { + memcpy(g_FwData[g_FwDataCount], pBuf, nSize); + + g_FwDataCount ++; + } + } + + DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount); + + if (pBuf != NULL) + { + DBG("*** buf[0] = %c ***\n", pBuf[0]); + } +} + +//-------------------------Start of SW ID for MSG22XX----------------------------// + +static u32 _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EmemType_e eEmemType) // For MSG22XX +{ + u32 nRetVal = 0; + u16 nRegData1 = 0, nRegData2 = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Clear pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + if (eEmemType == EMEM_MAIN) // Read main block CRC(48KB-4) from main block + { + RegSet16BitValue(0x1600, 0xBFFC); // Set start address for main block CRC + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(512Byte-4) from info block + { + RegSet16BitValue(0x1600, 0xC1FC); // Set start address for info block CRC + } + + // Enable burst mode + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + // Set pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + nRetVal = ((nRegData2 >> 8) & 0xFF) << 24; + nRetVal |= (nRegData2 & 0xFF) << 16; + nRetVal |= ((nRegData1 >> 8) & 0xFF) << 8; + nRetVal |= (nRegData1 & 0xFF); + + DBG("CRC = 0x%x\n", nRetVal); + + // Clear burst mode + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(u8 szTmpBuf[], EmemType_e eEmemType) // For MSG22XX +{ + u32 nRetVal = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + if (szTmpBuf != NULL) + { + if (eEmemType == EMEM_MAIN) // Read main block CRC(48KB-4) from bin file + { + nRetVal = szTmpBuf[0xBFFF] << 24; + nRetVal |= szTmpBuf[0xBFFE] << 16; + nRetVal |= szTmpBuf[0xBFFD] << 8; + nRetVal |= szTmpBuf[0xBFFC]; + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(512Byte-4) from bin file + { + nRetVal = szTmpBuf[0xC1FF] << 24; + nRetVal |= szTmpBuf[0xC1FE] << 16; + nRetVal |= szTmpBuf[0xC1FD] << 8; + nRetVal |= szTmpBuf[0xC1FC]; + } + } + + return nRetVal; +} + +static u16 _DrvFwCtrlMsg22xxGetSwId(EmemType_e eEmemType) // For MSG22XX +{ + u16 nRetVal = 0; + u16 nRegData1 = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Clear pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + RegSet16BitValue(0x1600, 0xBFF4); // Set start address for main block SW ID + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + RegSet16BitValue(0x1600, 0xC1EC); // Set start address for info block SW ID + } + + /* + Ex. SW ID in Main Block : + Major low byte at address 0xBFF4 + Major high byte at address 0xBFF5 + + SW ID in Info Block : + Major low byte at address 0xC1EC + Major high byte at address 0xC1ED + */ + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + // Set pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); +// nRegData2 = RegGet16BitValue(0x1606); + + nRetVal = ((nRegData1 >> 8) & 0xFF) << 8; + nRetVal |= (nRegData1 & 0xFF); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DBG("SW ID = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg22xxUpdateFirmwareBySwId(void) // For MSG22XX +{ + s32 nRetVal = -1; + u32 nCrcInfoA = 0, nCrcInfoB = 0, nCrcMainA = 0, nCrcMainB = 0; + + DBG("*** %s() ***\n", __func__); + + DBG("_gIsUpdateInfoBlockFirst = %d, _gIsUpdateFirmware = 0x%x\n", _gIsUpdateInfoBlockFirst, _gIsUpdateFirmware); + + _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(g_FwData, _gOneDimenFwData); + + if (_gIsUpdateInfoBlockFirst == 1) + { + if ((_gIsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA = 0x%x, nCrcInfoB = 0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA = 0x%x, nCrcMainB = 0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + _gIsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + _gIsUpdateFirmware = 0x01; + } + } + else + { + _gIsUpdateFirmware = 0x11; + } + } + else if ((_gIsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + _gIsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + _gIsUpdateFirmware = 0x01; + } + } + } + else //_gIsUpdateInfoBlockFirst == 0 + { + if ((_gIsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + _gIsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + _gIsUpdateFirmware = 0x01; + } + } + else + { + _gIsUpdateFirmware = 0x11; + } + } + else if ((_gIsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + _gIsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + _gIsUpdateFirmware = 0x01; + } + } + } + + return nRetVal; +} + +void _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId(void) // For MSG22XX +{ + u32 nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB; + u32 i; + u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0; + u16 nMajor = 0, nMinor = 0; + u8 *pVersion = NULL; + Msg22xxSwId_e eSwId = MSG22XX_SW_ID_UNDEFINED; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrDisableFingerTouchReport(); + + DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion); + + nCrcMainA = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EMEM_MAIN); + + nCrcInfoA = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EMEM_INFO); + + _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id"); + INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork); + + DBG("nCrcMainA=0x%x, nCrcInfoA=0x%x, nCrcMainB=0x%x, nCrcInfoB=0x%x\n", nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB); + + if (nCrcMainA == nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 1. Main Block:OK, Info Block:OK + { + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN); + + if (eSwId == MSG22XX_SW_ID_XXXX) + { + nUpdateBinMajor = msg2xxx_xxxx_update_bin[0xBFF5]<<8 | msg2xxx_xxxx_update_bin[0xBFF4]; + nUpdateBinMinor = msg2xxx_xxxx_update_bin[0xBFF7]<<8 | msg2xxx_xxxx_update_bin[0xBFF6]; + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + nUpdateBinMajor = msg2xxx_yyyy_update_bin[0xBFF5]<<8 | msg2xxx_yyyy_update_bin[0xBFF4]; + nUpdateBinMinor = msg2xxx_yyyy_update_bin[0xBFF7]<<8 | msg2xxx_yyyy_update_bin[0xBFF6]; + } + else //eSwId == MSG22XX_SW_ID_UNDEFINED + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG22XX_SW_ID_UNDEFINED; + nUpdateBinMajor = 0; + nUpdateBinMinor = 0; + } + + DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor); + + if (nUpdateBinMinor > nMinor) + { + if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + if (eSwId == MSG22XX_SW_ID_XXXX) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 512); + } + } + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 512); + } + } + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + _gIsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else if (nCrcMainA == nCrcMainB && nCrcInfoA != nCrcInfoB) // Case 2. Main Block:OK, Info Block:FAIL + { + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + if (eSwId == MSG22XX_SW_ID_XXXX) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 512); + } + } + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 512); + } + } + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + _gIsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else if (nCrcMainA != nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 3. Main Block:FAIL, Info Block:OK + { + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_INFO); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + if (eSwId == MSG22XX_SW_ID_XXXX) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 512); + } + } + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 512); + } + } + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 0; // Set 0 for indicating main block is broken + _gIsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else // Case 4. Main Block:FAIL, Info Block:FAIL + { + DBG("Main block and Info block are broken.\n"); + DBG("Go to normal boot up process.\n"); + } + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); +} + +//-------------------------End of SW ID for MSG22XX----------------------------// + +//-------------------------Start of SW ID for MSG21XXA----------------------------// + +static u32 _DrvFwCtrlMsg21xxaCalculateMainCrcFromEFlash(void) // For MSG21XXA +{ + u32 nRetVal = 0; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrTouchDeviceResetHw(); + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(20); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop Watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xDF4C); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(20); + + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x9432); + + // Read calculated main block CRC from register + nRetVal = RegGet16BitValue(0x3C80); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x3C82); + + DBG("Main Block CRC = 0x%x\n", nRetVal); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg21xxaRetrieveMainCrcFromMainBlock(void) // For MSG21XXA +{ + u32 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrTouchDeviceResetHw(); + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(20); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(20); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + // Read main block CRC from main block + szDbBusTxData[0] = 0x72; + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0xFC; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + nRetVal = szDbBusRxData[0]; + nRetVal = (nRetVal << 8) | szDbBusRxData[1]; + nRetVal = (nRetVal << 8) | szDbBusRxData[2]; + nRetVal = (nRetVal << 8) | szDbBusRxData[3]; + + DBG("CRC = 0x%x\n", nRetVal); + + return nRetVal; +} + +static u16 _DrvFwCtrlMsg21xxaGetSwId(EmemType_e eEmemType) // For MSG21XXA +{ + u16 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DrvPlatformLyrTouchDeviceResetHw(); + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(20); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(20); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + szDbBusTxData[0] = 0x72; + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0x55; + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + szDbBusTxData[1] = 0x83; + szDbBusTxData[2] = 0x00; + } + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + DBG("szDbBusRxData[0,1,2,3] = 0x%x,0x%x,0x%x,0x%x\n", szDbBusRxData[0], szDbBusRxData[1], szDbBusRxData[2], szDbBusRxData[3]); + + if ((szDbBusRxData[0] >= 0x30 && szDbBusRxData[0] <= 0x39) + &&(szDbBusRxData[1] >= 0x30 && szDbBusRxData[1] <= 0x39) + &&(szDbBusRxData[2] >= 0x31 && szDbBusRxData[2] <= 0x39)) + { + nRetVal = (szDbBusRxData[0]-0x30)*100+(szDbBusRxData[1]-0x30)*10+(szDbBusRxData[2]-0x30); + } + + DBG("SW ID = 0x%x\n", nRetVal); + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(u8 szFwData[][1024], EmemType_e eEmemType) // For MSG21XXA +{ + u32 i, j, nCalculateCrcSize; + u32 nCrcMain = 0, nCrcMainTp = 0; + u32 nCrcInfo = 0, nCrcInfoTp = 0; + u32 nCrcTemp = 0; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + // erase main + _DrvFwCtrlEraseEmemC33(EMEM_MAIN); + mdelay(1000); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(300); + + ///////////////////////// + // Program + ///////////////////////// + + // Polling 0x3CE4 is 0x1C70 + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x1C70); + } + + switch (eEmemType) + { + case EMEM_ALL: + RegSet16BitValue(0x3CE4, 0xE38F); // for all blocks + break; + case EMEM_MAIN: + RegSet16BitValue(0x3CE4, 0x7731); // for main block + break; + case EMEM_INFO: + RegSet16BitValue(0x3CE4, 0x7731); // for info block + + RegSetLByteValue(0x0FE6, 0x01); + + RegSetLByteValue(0x3CE4, 0xC5); + RegSetLByteValue(0x3CE5, 0x78); + + RegSetLByteValue(0x1E04, 0x9F); + RegSetLByteValue(0x1E05, 0x82); + + RegSetLByteValue(0x0FE6, 0x00); + mdelay(100); + break; + } + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Calculate CRC 32 + DrvCommonCrcInitTable(); + + if (eEmemType == EMEM_ALL) + { + nCalculateCrcSize = MSG21XXA_FIRMWARE_WHOLE_SIZE; + } + else if (eEmemType == EMEM_MAIN) + { + nCalculateCrcSize = MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; + } + else if (eEmemType == EMEM_INFO) + { + nCalculateCrcSize = MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE; + } + else + { + nCalculateCrcSize = 0; + } + + for (i = 0; i < nCalculateCrcSize; i ++) + { + if (eEmemType == EMEM_INFO) + { + i = 32; + } + + if (i < 32) // emem_main + { + if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + + nCrcTemp = nCrcMain; + nCrcTemp = nCrcTemp ^ 0xffffffff; + + DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug + + for (j = 0; j < 4; j ++) + { + szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF); + + DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug + DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + } + else // emem_info + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo); + } + + if (eEmemType == EMEM_MAIN) + { + break; + } + } + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + RegSet16BitValue(0x3CE4, 0x2F43); + } + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // write file done and check crc + RegSet16BitValue(0x3CE4, 0x1380); + } + mdelay(10); + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + } + + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // CRC Main from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + } + + if (eEmemType == EMEM_ALL) + { + // CRC Info from TP + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + } + + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DrvPlatformLyrTouchDeviceResetHw(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + if (nCrcMainTp != nCrcMain) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + if (eEmemType == EMEM_ALL) + { + if (nCrcInfoTp != nCrcInfo) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +void _DrvFwCtrlMsg21xxaCheckFirmwareUpdateBySwId(void) // For MSG21XXA +{ + u32 nCrcMainA, nCrcMainB; + u32 i; + u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0; + u16 nMajor = 0, nMinor = 0; + u8 nIsCompareVersion = 0; + u8 *pVersion = NULL; + Msg21xxaSwId_e eMainSwId = MSG21XXA_SW_ID_UNDEFINED, eInfoSwId = MSG21XXA_SW_ID_UNDEFINED, eSwId = MSG21XXA_SW_ID_UNDEFINED; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrDisableFingerTouchReport(); + msleep(100); + DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion); + + nCrcMainA = _DrvFwCtrlMsg21xxaCalculateMainCrcFromEFlash(); + nCrcMainB = _DrvFwCtrlMsg21xxaRetrieveMainCrcFromMainBlock(); + + _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id"); + INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + eMainSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_MAIN); + eInfoSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_INFO); + + DBG("Check firmware integrity success\n"); + DBG("eMainSwId=0x%x, eInfoSwId=0x%x\n", eMainSwId, eInfoSwId); + + if (eMainSwId == eInfoSwId) + { + eSwId = eMainSwId; + nIsCompareVersion = 1; + } + else + { + eSwId = eInfoSwId; + nIsCompareVersion = 0; + } + + if (eSwId == MSG21XXA_SW_ID_XXXX) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg2xxx_xxxx_update_bin[31][0x34F]<<8 | msg2xxx_xxxx_update_bin[31][0x34E]; + nUpdateBinMinor = msg2xxx_xxxx_update_bin[31][0x351]<<8 | msg2xxx_xxxx_update_bin[31][0x350]; +#else // By one dimensional array + nUpdateBinMajor = msg2xxx_xxxx_update_bin[0x7F4F]<<8 | msg2xxx_xxxx_update_bin[0x7F4E]; + nUpdateBinMinor = msg2xxx_xxxx_update_bin[0x7F51]<<8 | msg2xxx_xxxx_update_bin[0x7F50]; +#endif + } + else if (eSwId == MSG21XXA_SW_ID_YYYY) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg2xxx_yyyy_update_bin[31][0x34F]<<8 | msg2xxx_yyyy_update_bin[31][0x34E]; + nUpdateBinMinor = msg2xxx_yyyy_update_bin[31][0x351]<<8 | msg2xxx_yyyy_update_bin[31][0x350]; +#else // By one dimensional array + nUpdateBinMajor = msg2xxx_yyyy_update_bin[0x7F4F]<<8 | msg2xxx_yyyy_update_bin[0x7F4E]; + nUpdateBinMinor = msg2xxx_yyyy_update_bin[0x7F51]<<8 | msg2xxx_yyyy_update_bin[0x7F50]; +#endif + } + else //eSwId == MSG21XXA_SW_ID_UNDEFINED + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG21XXA_SW_ID_UNDEFINED; + nUpdateBinMajor = 0; + nUpdateBinMinor = 0; + } + + DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor); + + if ((nUpdateBinMinor > nMinor && nIsCompareVersion == 1) || (nIsCompareVersion == 0)) + { + if (eSwId < MSG21XXA_SW_ID_UNDEFINED && eSwId != 0xFFFF) + { + if (eSwId == MSG21XXA_SW_ID_XXXX) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg2xxx_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG21XXA_SW_ID_YYYY) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg2xxx_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + eSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_INFO); + + DBG("Check firmware integrity failed\n"); + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId < MSG21XXA_SW_ID_UNDEFINED && eSwId != 0xFFFF) + { + if (eSwId == MSG21XXA_SW_ID_XXXX) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg2xxx_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG21XXA_SW_ID_YYYY) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg2xxx_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg2xxx_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); +} + +//-------------------------End of SW ID for MSG21XXA----------------------------// + +static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork) +{ + s32 nRetVal = 0; + + DBG("*** %s() _gUpdateRetryCount = %d ***\n", __func__, _gUpdateRetryCount); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nRetVal = _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(g_FwData, EMEM_MAIN); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + nRetVal = _DrvFwCtrlMsg22xxUpdateFirmwareBySwId(); + } + else + { + DBG("This chip type (%d) does not support update firmware by sw id\n", g_ChipType); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + nRetVal = -1; + return; + } + + DBG("*** update firmware by sw id result = %d ***\n", nRetVal); + + if (nRetVal == 0) + { + DBG("update firmware by sw id success\n"); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gIsUpdateInfoBlockFirst = 0; + _gIsUpdateFirmware = 0x00; + } + } + else //nRetVal == -1 + { + _gUpdateRetryCount --; + if (_gUpdateRetryCount > 0) + { + DBG("_gUpdateRetryCount = %d\n", _gUpdateRetryCount); + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + } + else + { + DBG("update firmware by sw id failed\n"); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gIsUpdateInfoBlockFirst = 0; + _gIsUpdateFirmware = 0x00; + } + } + } +} + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// + +static void _DrvFwCtrlReadInfoC33(void) +{ + u8 szDbBusTxData[5] = {0}; + u16 nRegData = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + u32 i; +#endif + + DBG("*** %s() ***\n", __func__); + + mdelay(300); + + // Stop Watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + RegSet16BitValue(0x3CE4, 0xA4AB); + + RegSet16BitValue(0x1E04, 0x7d60); + + // TP SW reset + RegSet16BitValue(0x1E04, 0x829F); + mdelay(1); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x0F; + szDbBusTxData[2] = 0xE6; + szDbBusTxData[3] = 0x00; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 4); + mdelay(100); + + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x5B58); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + szDbBusTxData[0] = 0x72; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x80; // read 128 bytes + + for (i = 0; i < 8; i ++) + { + szDbBusTxData[1] = 0x80 + (((i*128)&0xff00)>>8); + szDbBusTxData[2] = (i*128)&0x00ff; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + + mdelay(50); + + // Receive info data + IicReadData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[i*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + szDbBusTxData[0] = 0x72; + szDbBusTxData[1] = 0x80; + szDbBusTxData[2] = 0x00; + szDbBusTxData[3] = 0x04; // read 1024 bytes + szDbBusTxData[4] = 0x00; + + IicWriteData(SLAVE_I2C_ID_DWI2C, szDbBusTxData, 5); + + mdelay(50); + + // Receive info data + IicReadData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[0], 1024); +#endif +} + +static s32 _DrvFwCtrlUpdateFirmwareC32(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 i, j; + u32 nCrcMain, nCrcMainTp; + u32 nCrcInfo, nCrcInfoTp; + u32 nCrcTemp; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + ///////////////////////// + // Erase all + ///////////////////////// + _DrvFwCtrlEraseEmemC32(); + mdelay(1000); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(300); + + // Reset watch dog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + ///////////////////////// + // Program + ///////////////////////// + + // Polling 0x3CE4 is 0x1C70 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x1C70); + + RegSet16BitValue(0x3CE4, 0xE38F); // for all-blocks + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Calculate CRC 32 + DrvCommonCrcInitTable(); + + for (i = 0; i < 33; i ++) // total 33 KB : 2 byte per R/W + { + if (i < 32) // emem_main + { + if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + + nCrcTemp = nCrcMain; + nCrcTemp = nCrcTemp ^ 0xffffffff; + + DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug + + for (j = 0; j < 4; j ++) + { + szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF); + + DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug + DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + } + else // emem_info + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo); + } + } + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + RegSet16BitValue(0x3CE4, 0x2F43); + } + + // Write file done + RegSet16BitValue(0x3CE4, 0x1380); + + mdelay(10); + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + // CRC Main from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + + // CRC Info from TP + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", + nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DrvPlatformLyrTouchDeviceResetHw(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlUpdateFirmwareC33(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u8 szLifeCounter[2]; + u32 i, j; + u32 nCrcMain, nCrcMainTp; + u32 nCrcInfo, nCrcInfoTp; + u32 nCrcTemp; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _DrvFwCtrlReadInfoC33(); + + if (_gDwIicInfoData[0] == 'M' && _gDwIicInfoData[1] == 'S' && _gDwIicInfoData[2] == 'T' && _gDwIicInfoData[3] == 'A' && _gDwIicInfoData[4] == 'R' && _gDwIicInfoData[5] == 'T' && _gDwIicInfoData[6] == 'P' && _gDwIicInfoData[7] == 'C') + { + _gDwIicInfoData[8] = szFwData[32][8]; + _gDwIicInfoData[9] = szFwData[32][9]; + _gDwIicInfoData[10] = szFwData[32][10]; + _gDwIicInfoData[11] = szFwData[32][11]; + // updata life counter + szLifeCounter[1] = ((((_gDwIicInfoData[13] << 8) | _gDwIicInfoData[12]) + 1) >> 8) & 0xFF; + szLifeCounter[0] = (((_gDwIicInfoData[13] << 8) | _gDwIicInfoData[12]) + 1) & 0xFF; + _gDwIicInfoData[12] = szLifeCounter[0]; + _gDwIicInfoData[13] = szLifeCounter[1]; + + RegSet16BitValue(0x3CE4, 0x78C5); + RegSet16BitValue(0x1E04, 0x7d60); + // TP SW reset + RegSet16BitValue(0x1E04, 0x829F); + + mdelay(50); + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Transmit lk info data +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[0], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + } + + // erase main + _DrvFwCtrlEraseEmemC33(EMEM_MAIN); + mdelay(1000); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(300); + + ///////////////////////// + // Program + ///////////////////////// + + // Polling 0x3CE4 is 0x1C70 + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x1C70); + } + + switch (eEmemType) + { + case EMEM_ALL: + RegSet16BitValue(0x3CE4, 0xE38F); // for all blocks + break; + case EMEM_MAIN: + RegSet16BitValue(0x3CE4, 0x7731); // for main block + break; + case EMEM_INFO: + RegSet16BitValue(0x3CE4, 0x7731); // for info block + + RegSetLByteValue(0x0FE6, 0x01); + + RegSetLByteValue(0x3CE4, 0xC5); + RegSetLByteValue(0x3CE5, 0x78); + + RegSetLByteValue(0x1E04, 0x9F); + RegSetLByteValue(0x1E05, 0x82); + + RegSetLByteValue(0x0FE6, 0x00); + mdelay(100); + break; + } + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Calculate CRC 32 + DrvCommonCrcInitTable(); + + for (i = 0; i < 33; i ++) // total 33 KB : 2 byte per R/W + { + if (eEmemType == EMEM_INFO) + { + i = 32; + } + + if (i < 32) // emem_main + { + if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + + nCrcTemp = nCrcMain; + nCrcTemp = nCrcTemp ^ 0xffffffff; + + DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug + + for (j = 0; j < 4; j ++) + { + szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF); + + DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug + DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); // add for debug + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + } + else // emem_info + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(_gDwIicInfoData[j], nCrcInfo); + } + + if (eEmemType == EMEM_MAIN) + { + break; + } + } + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + RegSet16BitValue(0x3CE4, 0x2F43); + } + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // write file done and check crc + RegSet16BitValue(0x3CE4, 0x1380); + } + mdelay(10); + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + } + + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // CRC Main from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + + // CRC Info from TP + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + } + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DrvPlatformLyrTouchDeviceResetHw(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlMsg22xxUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 i, index; + u32 nCrcMain, nCrcMainTp; + u32 nCrcInfo, nCrcInfoTp; + u32 nRemainSize, nBlockSize, nSize; + u16 nRegData = 0; + u8 szDbBusTxData[1024] = {0}; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + u32 nSizePerWrite = 125; +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + u32 nSizePerWrite = 1021; +#endif + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(szFwData, _gOneDimenFwData); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + DBG("Erase start\n"); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Set PROGRAM password + RegSetLByteValue(0x161A, 0xBA); + RegSetLByteValue(0x161B, 0xAB); + + if (eEmemType == EMEM_ALL) // 48KB + 512Byte + { + DBG("Erase all block\n"); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(100); + + // Chip erase + RegSet16BitValue(0x160E, BIT3); + + DBG("Wait erase done flag\n"); + + do // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + mdelay(50); + } while((nRegData & BIT1) != BIT1); + } + else if (eEmemType == EMEM_MAIN) // 48KB (32+8+8) + { + DBG("Erase main block\n"); + + for (i = 0; i < 3; i ++) + { + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + if (i == 0) + { + RegSet16BitValue(0x1600, 0x0000); + } + else if (i == 1) + { + RegSet16BitValue(0x1600, 0x8000); + } + else if (i == 2) + { + RegSet16BitValue(0x1600, 0xA000); + } + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + do // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + mdelay(50); + } while((nRegData & BIT1) != BIT1); + } + } + else if (eEmemType == EMEM_INFO) // 512Byte + { + DBG("Erase info block\n"); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + RegSet16BitValue(0x1600, 0xC000); + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + do // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + mdelay(50); + } while((nRegData & BIT1) != BIT1); + } + + DBG("Erase end\n"); + + // Hold reset pin before program + RegSetLByteValue(0x1E06, 0x00); + + ///////////////////////// + // Program + ///////////////////////// + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_MAIN) // 48KB + { + DBG("Program main block start\n"); + + // Program main block + RegSet16BitValue(0x161A, 0xABBA); + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0x0000); // Set start address of main block + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode + + // Program start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRemainSize = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; //48KB + index = 0; + + while (nRemainSize > 0) + { + if (nRemainSize > nSizePerWrite) + { + nBlockSize = nSizePerWrite; + } + else + { + nBlockSize = nRemainSize; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + nSize = 3; + + for (i = 0; i < nBlockSize; i ++) + { + szDbBusTxData[3+i] = _gOneDimenFwData[index*nSizePerWrite+i]; + nSize ++; + } + index ++; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize); + + nRemainSize = nRemainSize - nBlockSize; + } + + // Program end + szDbBusTxData[0] = 0x21; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRegData = RegGet16BitValue(0x160C); + RegSet16BitValue(0x160C, nRegData & (~0x01)); + + DBG("Wait main block write done flag\n"); + + // Polling 0x1610 is 0x0002 + do + { + nRegData = RegGet16BitValue(0x1610); + nRegData = nRegData & BIT1; + mdelay(10); + + } while (nRegData != BIT1); // Wait write done flag + + DBG("Program main block end\n"); + } + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_INFO) // 512 Byte + { + DBG("Program info block start\n"); + + // Program info block + RegSet16BitValue(0x161A, 0xABBA); + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0xC000); // Set start address of info block + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode + + // Program start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRemainSize = MSG22XX_FIRMWARE_INFO_BLOCK_SIZE; //512Byte + index = 0; + + while (nRemainSize > 0) + { + if (nRemainSize > nSizePerWrite) + { + nBlockSize = nSizePerWrite; + } + else + { + nBlockSize = nRemainSize; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + nSize = 3; + + for (i = 0; i < nBlockSize; i ++) + { + szDbBusTxData[3+i] = _gOneDimenFwData[(MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE*1024)+(index*nSizePerWrite)+i]; + nSize ++; + } + index ++; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize); + + nRemainSize = nRemainSize - nBlockSize; + } + + // Program end + szDbBusTxData[0] = 0x21; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRegData = RegGet16BitValue(0x160C); + RegSet16BitValue(0x160C, nRegData & (~0x01)); + + DBG("Wait info block write done flag\n"); + + // Polling 0x1610 is 0x0002 + do + { + nRegData = RegGet16BitValue(0x1610); + nRegData = nRegData & BIT1; + mdelay(10); + + } while (nRegData != BIT1); // Wait write done flag + + DBG("Program info block end\n"); + } + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_MAIN) + { + // Get CRC 32 from updated firmware bin file + nCrcMain = _gOneDimenFwData[0xBFFF] << 24; + nCrcMain |= _gOneDimenFwData[0xBFFE] << 16; + nCrcMain |= _gOneDimenFwData[0xBFFD] << 8; + nCrcMain |= _gOneDimenFwData[0xBFFC]; + + // CRC Main from TP + DBG("Get Main CRC from TP\n"); + + nCrcMainTp = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMain=0x%x, nCrcMainTp=0x%x\n", nCrcMain, nCrcMainTp); + } + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_INFO) + { + nCrcInfo = _gOneDimenFwData[0xC1FF] << 24; + nCrcInfo |= _gOneDimenFwData[0xC1FE] << 16; + nCrcInfo |= _gOneDimenFwData[0xC1FD] << 8; + nCrcInfo |= _gOneDimenFwData[0xC1FC]; + + // CRC Info from TP + DBG("Get Info CRC from TP\n"); + + nCrcInfoTp = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfo=0x%x, nCrcInfoTp=0x%x\n", nCrcInfo, nCrcInfoTp); + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + if (eEmemType == EMEM_ALL) + { + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + } + else if (eEmemType == EMEM_MAIN) + { + if (nCrcMainTp != nCrcMain) + { + DBG("Update FAILED\n"); + + return -1; + } + } + else if (eEmemType == EMEM_INFO) + { + if (nCrcInfoTp != nCrcInfo) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlUpdateFirmwareCash(u8 szFwData[][1024]) +{ + DBG("*** %s() ***\n", __func__); + + DBG("chip type = 0x%x\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) // (0x02) + { +// u16 nChipType; + u8 nChipVersion = 0; + + DrvPlatformLyrTouchDeviceResetHw(); + + // Erase TP Flash first + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(300); + + // Stop MCU + RegSetLByteValue(0x0FE6, 0x01); + + // Disable watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + ///////////////////////// + // Difference between C2 and C3 + ///////////////////////// + // c2:MSG2133(1) c32:MSG2133A(2) c33:MSG2138A(2) + // check ic type +// nChipType = RegGet16BitValue(0x1ECC) & 0xFF; + + // check ic version + nChipVersion = RegGet16BitValue(0x3CEA) & 0xFF; + + DBG("chip version = 0x%x\n", nChipVersion); + + if (nChipVersion == 3) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + return _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(szFwData, EMEM_MAIN); +#else + return _DrvFwCtrlUpdateFirmwareC33(szFwData, EMEM_MAIN); +#endif + } + else + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + return _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(szFwData, EMEM_MAIN); +#else + return _DrvFwCtrlUpdateFirmwareC32(szFwData, EMEM_ALL); +#endif + } + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) // (0x7A) + { +// _DrvFwCtrlMsg22xxGetTpVendorCode(_gTpVendorCode); + +// if (_gTpVendorCode[0] == 'C' && _gTpVendorCode[1] == 'N' && _gTpVendorCode[2] == 'T') // for specific TP vendor which store some important information in info block, only update firmware for main block, do not update firmware for info block. +// { +// return _DrvFwCtrlMsg22xxUpdateFirmware(szFwData, EMEM_MAIN); +// } +// else +// { + return _DrvFwCtrlMsg22xxUpdateFirmware(szFwData, EMEM_ALL); +// } + } + else // CHIP_TYPE_MSG21XX (0x01) + { + DBG("Can not update firmware. Catch-2 is no need to be maintained now.\n"); + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + return -1; + } +} + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +u8 DrvFwCtrlGetChipType(void) +{ + u8 nChipType = 0; + + DBG("*** %s() ***\n", __func__); + + //DrvPlatformLyrTouchDeviceResetHw(); + + // Erase TP Flash first + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(20); + + // Stop MCU + RegSetLByteValue(0x0FE6, 0x01); + + // Disable watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + ///////////////////////// + // Difference between C2 and C3 + ///////////////////////// + // c2:MSG2133(1) c32:MSG2133A(2) c33:MSG2138A(2) + // check ic type + nChipType = RegGet16BitValue(0x1ECC) & 0xFF; + + if (nChipType != CHIP_TYPE_MSG21XX && // (0x01) + nChipType != CHIP_TYPE_MSG21XXA && // (0x02) + nChipType != CHIP_TYPE_MSG26XXM && // (0x03) + nChipType != CHIP_TYPE_MSG22XX) // (0x7A) + { + nChipType = 0; + } + + DBG("*** Chip Type = 0x%x ***\n", nChipType); + + DrvPlatformLyrTouchDeviceResetHw(); + + return nChipType; +} + +void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG21XX) + { + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[4] = {0}; + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + szDbBusTxData[2] = 0x2A; + } + else if (g_ChipType == CHIP_TYPE_MSG21XX) + { + szDbBusTxData[2] = 0x74; + } + else + { + szDbBusTxData[2] = 0x2A; + } + + mutex_lock(&g_Mutex); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + mutex_unlock(&g_Mutex); + + *pMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0]; + *pMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2]; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + u16 nRegData1, nRegData2; + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Clear pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0xBFF4); // Set start address for customer firmware version on main block + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + // Set pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + *pMajor = (((nRegData1 >> 8) & 0xFF) << 8) + (nRegData1 & 0xFF); + *pMinor = (((nRegData2 >> 8) & 0xFF) << 8) + (nRegData2 & 0xFF); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(100); + + mutex_unlock(&g_Mutex); + } + + DBG("*** major = %d ***\n", *pMajor); + DBG("*** minor = %d ***\n", *pMinor); + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*6, GFP_KERNEL); + } + + sprintf(*ppVersion, "%03d%03d", *pMajor, *pMinor); +} + +void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion) +{ + u32 i; + u16 nRegData1, nRegData2; + u8 szDbBusRxData[12] = {0}; + + DBG("*** %s() ***\n", __func__); + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + if (g_ChipType == CHIP_TYPE_MSG22XX) // Only MSG22XX support platform firmware version + { + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Clear pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0xC1F2); // Set start address for platform firmware version on info block(Actually, start reading from 0xC1F0) + + // Enable burst mode + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + // Set pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40)); + + for (i = 0; i < 3; i ++) + { + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + szDbBusRxData[i*4+0] = (nRegData1 & 0xFF); + szDbBusRxData[i*4+1] = ((nRegData1 >> 8 ) & 0xFF); + +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+0, szDbBusRxData[i*4+0], szDbBusRxData[i*4+0]); // add for debug +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+1, szDbBusRxData[i*4+1], szDbBusRxData[i*4+1]); // add for debug + + szDbBusRxData[i*4+2] = (nRegData2 & 0xFF); + szDbBusRxData[i*4+3] = ((nRegData2 >> 8 ) & 0xFF); + +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+2, szDbBusRxData[i*4+2], szDbBusRxData[i*4+2]); // add for debug +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+3, szDbBusRxData[i*4+3], szDbBusRxData[i*4+3]); // add for debug + } + + // Clear burst mode + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL); + } + + sprintf(*ppVersion, "%c%c%c%c%c%c%c%c%c%c", szDbBusRxData[2], szDbBusRxData[3], szDbBusRxData[4], + szDbBusRxData[5], szDbBusRxData[6], szDbBusRxData[7], szDbBusRxData[8], szDbBusRxData[9], szDbBusRxData[10], szDbBusRxData[11]); + } + else + { + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL); + } + + sprintf(*ppVersion, "%s", "N/A"); + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(100); + + mutex_unlock(&g_Mutex); + + DBG("*** platform firmware version = %s ***\n", *ppVersion); +} + +s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + DBG("*** %s() ***\n", __func__); + + return _DrvFwCtrlUpdateFirmwareCash(szFwData); +} + +void DrvFwCtrlHandleFingerTouch(void) +{ + TouchInfo_t tInfo; + u32 i; + u8 nTouchKeyCode = 0; + static u32 nLastKeyCode = 0; + u8 *pPacket = NULL; + u16 nReportPacketLength = 0; + +// DBG("*** %s() ***\n", __func__); + + memset(&tInfo, 0x0, sizeof(tInfo)); + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + DBG("FIRMWARE_MODE_DEMO_MODE\n"); + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = g_DemoModePacket; + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) + { + DBG("FIRMWARE_MODE_DEBUG_MODE\n"); + + if (g_FirmwareInfo.nLogModePacketHeader != 0x62) + { + DBG("WRONG DEBUG MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + return; + } + + if (g_LogModePacket == NULL) + { + g_LogModePacket = kzalloc(sizeof(u8)*g_FirmwareInfo.nLogModePacketLength, GFP_KERNEL); + } + + nReportPacketLength = g_FirmwareInfo.nLogModePacketLength; + pPacket = g_LogModePacket; + } + else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) + { + DBG("FIRMWARE_MODE_RAW_DATA_MODE\n"); + + if (g_FirmwareInfo.nLogModePacketHeader != 0x62) + { + DBG("WRONG RAW DATA MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + return; + } + + if (g_LogModePacket == NULL) + { + g_LogModePacket = kzalloc(sizeof(u8)*g_FirmwareInfo.nLogModePacketLength, GFP_KERNEL); + } + + nReportPacketLength = g_FirmwareInfo.nLogModePacketLength; + pPacket = g_LogModePacket; + } + else + { + DBG("WRONG FIRMWARE MODE : 0x%x\n", g_FirmwareMode); + return; + } +#else + DBG("FIRMWARE_MODE_DEMO_MODE\n"); + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = g_DemoModePacket; +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + DBG("Set gesture wakeup packet length, g_ChipType=%d\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + if (_gGestureWakeupPacket == NULL) + { + _gGestureWakeupPacket = kzalloc(sizeof(u8)*GESTURE_WAKEUP_PACKET_LENGTH, GFP_KERNEL); + } + + nReportPacketLength = GESTURE_WAKEUP_PACKET_LENGTH; + pPacket = _gGestureWakeupPacket; + } + else if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + if (_gGestureWakeupPacket == NULL) + { + _gGestureWakeupPacket = kzalloc(sizeof(u8)*DEMO_MODE_PACKET_LENGTH, GFP_KERNEL); + } + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = _gGestureWakeupPacket; + } + else + { + DBG("This chip type does not support gesture wakeup.\n"); + return; + } + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + u32 i = 0, rc; + + while (i < 5) + { + mdelay(50); + + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + + if (rc > 0) + { + break; + } + + i ++; + } + } + else + { + IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + } +#else + IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC + IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif + + if (0 == _DrvFwCtrlParsePacket(pPacket, nReportPacketLength, &tInfo)) + { + //report... + if ((tInfo.nFingerNum) == 0) //touch end + { + if (nLastKeyCode != 0) + { + DBG("key touch released\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 0); + input_report_key(g_InputDevice, nLastKeyCode, 0); + + nLastKeyCode = 0; //clear key status.. + } + else + { + DrvPlatformLyrFingerTouchReleased(0, 0); + } + } + else //touch on screen + { + if (tInfo.nTouchKeyCode != 0) + { +#ifdef CONFIG_TP_HAVE_KEY + if (tInfo.nTouchKeyCode == 4) // TOUCH_KEY_HOME + { + nTouchKeyCode = g_TpVirtualKey[1]; + } + else if (tInfo.nTouchKeyCode == 1) // TOUCH_KEY_MENU + { + nTouchKeyCode = g_TpVirtualKey[0]; + } + else if (tInfo.nTouchKeyCode == 2) // TOUCH_KEY_BACK + { + nTouchKeyCode = g_TpVirtualKey[2]; + } + else if (tInfo.nTouchKeyCode == 8) // TOUCH_KEY_SEARCH + { + nTouchKeyCode = g_TpVirtualKey[3]; + } + + if (nLastKeyCode != nTouchKeyCode) + { + DBG("key touch pressed\n"); + DBG("nTouchKeyCode = %d, nLastKeyCode = %d\n", nTouchKeyCode, nLastKeyCode); + + nLastKeyCode = nTouchKeyCode; + + input_report_key(g_InputDevice, BTN_TOUCH, 1); + input_report_key(g_InputDevice, nTouchKeyCode, 1); + } +#endif //CONFIG_TP_HAVE_KEY + } + else + { + DBG("tInfo->nFingerNum = %d...............\n", tInfo.nFingerNum); + + for (i = 0; i < tInfo.nFingerNum; i ++) + { + DrvPlatformLyrFingerTouchPressed(tInfo.tPoint[i].nX, tInfo.tPoint[i].nY, 0, 0); + } + } + } + + input_sync(g_InputDevice); + } +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +void DrvFwCtrlOpenGestureWakeup(u16 nMode) +{ + u8 szDbBusTxData[3] = {0}; + u32 i = 0; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + DBG("wakeup mode = 0x%x\n", nMode); + + szDbBusTxData[0] = 0x58; + szDbBusTxData[1] = (nMode >> 8) & 0xFF; + szDbBusTxData[2] = nMode & 0xFF; + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + + if (rc > 0) + { + DBG("Enable gesture wakeup success\n"); + break; + } + + i ++; + } + + if (i == 5) + { + DBG("Enable gesture wakeup failed\n"); + } +/* + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc < 0) + { + DBG("Enable gesture wakeup failed\n"); + } + else + { + DBG("Enable gesture wakeup success\n"); + } +*/ + g_GestureWakeupFlag = 1; // gesture wakeup is enabled +} + +void DrvFwCtrlCloseGestureWakeup(void) +{ +// u8 szDbBusTxData[3] = {0}; +// s32 rc; + + DBG("*** %s() ***\n", __func__); +/* + szDbBusTxData[0] = 0x58; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x00; + + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc < 0) + { + DBG("Disable gesture wakeup failed\n"); + } + else + { + DBG("Disable gesture wakeup success\n"); + } +*/ + g_GestureWakeupFlag = 0; // gesture wakeup is disabled +} + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + +u16 DrvFwCtrlChangeFirmwareMode(u16 nMode) +{ + u8 szDbBusTxData[2] = {0}; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x02; + szDbBusTxData[1] = (u8)nMode; + + mdelay(20); + + mutex_lock(&g_Mutex); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 2); + + mutex_unlock(&g_Mutex); + + return nMode; +} + +void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo) +{ + u8 szDbBusTxData[1] = {0}; + u8 szDbBusRxData[8] = {0}; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x01; + + mutex_lock(&g_Mutex); + + mdelay(300); + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1); + mdelay(20); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 8); + + mutex_unlock(&g_Mutex); + + if ((szDbBusRxData[1] & 0x80) == 0x80) + { + pInfo->nIsCanChangeFirmwareMode = 0; + } + else + { + pInfo->nIsCanChangeFirmwareMode = 1; + } + + pInfo->nFirmwareMode = szDbBusRxData[1] & 0x7F; + pInfo->nLogModePacketHeader = szDbBusRxData[2]; + pInfo->nLogModePacketLength = (szDbBusRxData[3]<<8) + szDbBusRxData[4]; + + DBG("pInfo->nFirmwareMode=0x%x, pInfo->nLogModePacketHeader=0x%x, pInfo->nLogModePacketLength=%d, pInfo->nIsCanChangeFirmwareMode=%d\n", pInfo->nFirmwareMode, pInfo->nLogModePacketHeader, pInfo->nLogModePacketLength, pInfo->nIsCanChangeFirmwareMode); +} + +void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void) +{ + FirmwareInfo_t tInfo; + + DBG("*** %s() ***\n", __func__); + + memset(&tInfo, 0x0, sizeof(FirmwareInfo_t)); + + DrvFwCtrlGetFirmwareInfo(&tInfo); + + DBG("g_FirmwareMode = 0x%x, tInfo.nFirmwareMode = 0x%x\n", g_FirmwareMode, tInfo.nFirmwareMode); + + // Since reset_hw() will reset the firmware mode to demo mode, we must reset the firmware mode again after reset_hw(). + if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && FIRMWARE_MODE_DEBUG_MODE != tInfo.nFirmwareMode) + { + g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE); + } + else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE && FIRMWARE_MODE_RAW_DATA_MODE != tInfo.nFirmwareMode) + { + g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE); + } + else + { + DBG("firmware mode is not restored\n"); + } +} +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +void DrvFwCtrlCheckFirmwareUpdateBySwId(void) +{ + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvFwCtrlMsg21xxaCheckFirmwareUpdateBySwId(); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId(); + } + else + { + DBG("This chip type (%d) does not support update firmware by sw id\n", g_ChipType); + } +} + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h new file mode 100644 index 00000000..2ddae19e --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_fw_control.h @@ -0,0 +1,154 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_fw_control.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_SELF_FW_CONTROL_H__ +#define __MSTAR_DRV_SELF_FW_CONTROL_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +/*--------------------------------------------------------------------------*/ +/* COMPILE OPTION DEFINITION */ +/*--------------------------------------------------------------------------*/ + +//#define CONFIG_SWAP_X_Y + +//#define CONFIG_REVERSE_X +//#define CONFIG_REVERSE_Y + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define DEMO_MODE_PACKET_LENGTH (8) +#define MAX_TOUCH_NUM (2) + +#define MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE (32) //32K +#define MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE (1) //1K +#define MSG21XXA_FIRMWARE_WHOLE_SIZE (MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE+MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE) //33K + +#define MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE (48) //48K +#define MSG22XX_FIRMWARE_INFO_BLOCK_SIZE (512) //512Byte + + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +#define FIRMWARE_MODE_DEMO_MODE (0x00) +#define FIRMWARE_MODE_DEBUG_MODE (0x01) +#define FIRMWARE_MODE_RAW_DATA_MODE (0x02) +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +#define UPDATE_FIRMWARE_RETRY_COUNT (2) +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +typedef struct +{ + u16 nX; + u16 nY; +} TouchPoint_t; + +typedef struct +{ + u8 nTouchKeyMode; + u8 nTouchKeyCode; + u8 nFingerNum; + TouchPoint_t tPoint[MAX_TOUCH_NUM]; +} TouchInfo_t; + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + +typedef struct +{ + u8 nFirmwareMode; + u8 nLogModePacketHeader; + u16 nLogModePacketLength; + u8 nIsCanChangeFirmwareMode; +} FirmwareInfo_t; + +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +/* + * Note. + * The following is sw id enum definition for MSG22XX. + * 0x0000 and 0xFFFF are not allowed to be defined as SW ID. + * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it. + * Please modify the SW ID of the below enum value depends on the TP vendor that you are using. + */ +typedef enum { + MSG22XX_SW_ID_XXXX = 0x0001, + MSG22XX_SW_ID_YYYY = 0x0002, + MSG22XX_SW_ID_UNDEFINED +} Msg22xxSwId_e; + + +/* + * Note. + * The following is sw id enum definition for MSG21XXA. + * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it. + * Please modify the SW ID of the below enum value depends on the TP vendor that you are using. + */ +typedef enum { + MSG21XXA_SW_ID_XXXX = 0x0C, + MSG21XXA_SW_ID_YYYY, + MSG21XXA_SW_ID_UNDEFINED +} Msg21xxaSwId_e; +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern void DrvFwCtrlOpenGestureWakeup(u16 nMode); +extern void DrvFwCtrlCloseGestureWakeup(void); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG +extern u16 DrvFwCtrlChangeFirmwareMode(u16 nMode); +extern void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo); +extern void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +extern void DrvFwCtrlCheckFirmwareUpdateBySwId(void); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +extern u8 DrvFwCtrlGetChipType(void); +extern void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion); +extern void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion); +extern void DrvFwCtrlHandleFingerTouch(void); +extern s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType); + +#endif /* __MSTAR_DRV_SELF_FW_CONTROL_H__ */ diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c new file mode 100644 index 00000000..7b7bcac0 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.c @@ -0,0 +1,2514 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_mp_test.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_self_mp_test.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_self_fw_control.h" +#include "mstar_drv_platform_porting_layer.h" + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) +// Modify. +#include "open_test_ANA1_X.h" +#include "open_test_ANA2_X.h" +#include "open_test_ANA1_B_X.h" +#include "open_test_ANA2_B_X.h" +#include "open_test_ANA3_X.h" + +#include "open_test_ANA1_Y.h" +#include "open_test_ANA2_Y.h" +#include "open_test_ANA1_B_Y.h" +#include "open_test_ANA2_B_Y.h" +#include "open_test_ANA3_Y.h" + +// Modify. +#include "short_test_ANA1_X.h" +#include "short_test_ANA2_X.h" +#include "short_test_ANA3_X.h" +#include "short_test_ANA4_X.h" + +#include "short_test_ANA1_Y.h" +#include "short_test_ANA2_Y.h" +#include "short_test_ANA3_Y.h" +#include "short_test_ANA4_Y.h" +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) +// Modify. +#include "open_test_RIU1_X.h" +#include "open_test_RIU2_X.h" +#include "open_test_RIU3_X.h" + +#include "open_test_RIU1_Y.h" +#include "open_test_RIU2_Y.h" +#include "open_test_RIU3_Y.h" + +// Modify. +#include "short_test_RIU1_X.h" +#include "short_test_RIU2_X.h" +#include "short_test_RIU3_X.h" +#include "short_test_RIU4_X.h" + +#include "short_test_RIU1_Y.h" +#include "short_test_RIU2_Y.h" +#include "short_test_RIU3_Y.h" +#include "short_test_RIU4_Y.h" +#endif + +/*=============================================================*/ +// PREPROCESSOR CONSTANT DEFINITION +/*=============================================================*/ + +// Modify. +#define TP_OF_X (1) //(2) +#define TP_OF_Y (4) + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern struct i2c_client *g_I2cClient; + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u32 _gIsInMpTest = 0; +static u32 _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT; +static ItoTestMode_e _gItoTestMode = 0; + +static s32 _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING; +static u8 _gTestFailChannel[MAX_CHANNEL_NUM] = {0}; +static u32 _gTestFailChannelCount = 0; + +static struct work_struct _gCtpItoTestWork; +static struct workqueue_struct *_gCtpMpTestWorkQueue = NULL; + +static s16 _gRawData1[MAX_CHANNEL_NUM] = {0}; +static s16 _gRawData2[MAX_CHANNEL_NUM] = {0}; +static s16 _gRawData3[MAX_CHANNEL_NUM] = {0}; +static s16 _gRawData4[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag1[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag2[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag3[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag4[MAX_CHANNEL_NUM] = {0}; + +static u8 _gItoTestKeyNum = 0; +static u8 _gItoTestDummyNum = 0; +static u8 _gItoTestTriangleNum = 0; +static u8 _gIsEnable2R = 0; + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + +static u8 _gLTP = 1; + +// _gOpen1~_gOpen3 are for MSG21XXA +static u16 *_gOpen1 = NULL; +static u16 *_gOpen1B = NULL; +static u16 *_gOpen2 = NULL; +static u16 *_gOpen2B = NULL; +static u16 *_gOpen3 = NULL; + +// _gShort_1~_gShort_4 are for MSG21XXA +static u16 *_gShort_1 = NULL; +static u16 *_gShort_2 = NULL; +static u16 *_gShort_3 = NULL; +static u16 *_gShort_4 = NULL; + +// _gShort_1_GPO~_gShort_4_GPO are for MSG21XXA +static u16 *_gShort_1_GPO = NULL; +static u16 *_gShort_2_GPO = NULL; +static u16 *_gShort_3_GPO = NULL; +static u16 *_gShort_4_GPO = NULL; + +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + +// _gOpenRIU1~_gOpenRIU3 are for MSG22XX +static u32 *_gOpenRIU1 = NULL; +static u32 *_gOpenRIU2 = NULL; +static u32 *_gOpenRIU3 = NULL; + +// _gShort_RIU1~_gShort_RIU4 are for MSG22XX +static u32 *_gShort_RIU1 = NULL; +static u32 *_gShort_RIU2 = NULL; +static u32 *_gShort_RIU3 = NULL; +static u32 *_gShort_RIU4 = NULL; + +// _gOpenSubFrameNum1~_gShortSubFrameNum4 are for MSG22XX +static u8 _gOpenSubFrameNum1 = 0; +static u8 _gOpenSubFrameNum2 = 0; +static u8 _gOpenSubFrameNum3 = 0; +static u8 _gShortSubFrameNum1 = 0; +static u8 _gShortSubFrameNum2 = 0; +static u8 _gShortSubFrameNum3 = 0; +static u8 _gShortSubFrameNum4 = 0; + +#endif + +static u8 *_gMAP1 = NULL; +static u8 *_gMAP2 = NULL; +static u8 *_gMAP3 = NULL; +static u8 *_gMAP40_1 = NULL; +static u8 *_gMAP40_2 = NULL; +static u8 *_gMAP40_3 = NULL; +static u8 *_gMAP40_4 = NULL; +static u8 *_gMAP41_1 = NULL; +static u8 *_gMAP41_2 = NULL; +static u8 *_gMAP41_3 = NULL; +static u8 *_gMAP41_4 = NULL; + +static u8 *_gSHORT_MAP1 = NULL; +static u8 *_gSHORT_MAP2 = NULL; +static u8 *_gSHORT_MAP3 = NULL; +static u8 *_gSHORT_MAP4 = NULL; + +//static struct proc_dir_entry *_gMsgItoTest = NULL; +//static struct proc_dir_entry *_gDebug = NULL; +ItoTestResult_e _gItoTestResult = ITO_TEST_OK; + +/*=============================================================*/ +// EXTERN FUNCTION DECLARATION +/*=============================================================*/ + + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static u16 _DrvMpTestItoTestGetTpType(void) +{ + u16 nMajor = 0, nMinor = 0; + + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + { + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[4] = {0}; + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x2A; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + nMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0]; + nMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2]; + } +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + { + u16 nRegData1, nRegData2; + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Clear pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0xBFF4); // Set start address for customer firmware version on main block + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + // Set pce + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x40)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + nMajor = (((nRegData1 >> 8) & 0xFF) << 8) + (nRegData1 & 0xFF); + nMinor = (((nRegData2 >> 8) & 0xFF) << 8) + (nRegData2 & 0xFF); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(100); + } +#endif + + DBG("*** major = %d ***\n", nMajor); + DBG("*** minor = %d ***\n", nMinor); + + return nMajor; +} + +static u16 _DrvMpTestItoTestChooseTpType(void) +{ + u16 nTpType = 0; + u32 i = 0; + + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + // _gOpen1~_gOpen3 are for MSG21XXA + _gOpen1 = NULL; + _gOpen1B = NULL; + _gOpen2 = NULL; + _gOpen2B = NULL; + _gOpen3 = NULL; + + // _gShort_1~_gShort_4 are for MSG21XXA + _gShort_1 = NULL; + _gShort_2 = NULL; + _gShort_3 = NULL; + _gShort_4 = NULL; + + _gShort_1_GPO = NULL; + _gShort_2_GPO = NULL; + _gShort_3_GPO = NULL; + _gShort_4_GPO = NULL; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + // _gOpenRIU1~_gOpenRIU3 are for MSG22XX + _gOpenRIU1 = NULL; + _gOpenRIU2 = NULL; + _gOpenRIU3 = NULL; + + // _gShort_RIU1~_gShort_RIU4 are for MSG22XX + _gShort_RIU1 = NULL; + _gShort_RIU2 = NULL; + _gShort_RIU3 = NULL; + _gShort_RIU4 = NULL; + + _gOpenSubFrameNum1 = 0; + _gOpenSubFrameNum2 = 0; + _gOpenSubFrameNum3 = 0; + _gShortSubFrameNum1 = 0; + _gShortSubFrameNum2 = 0; + _gShortSubFrameNum3 = 0; + _gShortSubFrameNum4 = 0; +#endif + + _gMAP1 = NULL; + _gMAP2 = NULL; + _gMAP3 = NULL; + _gMAP40_1 = NULL; + _gMAP40_2 = NULL; + _gMAP40_3 = NULL; + _gMAP40_4 = NULL; + _gMAP41_1 = NULL; + _gMAP41_2 = NULL; + _gMAP41_3 = NULL; + _gMAP41_4 = NULL; + + _gSHORT_MAP1 = NULL; + _gSHORT_MAP2 = NULL; + _gSHORT_MAP3 = NULL; + _gSHORT_MAP4 = NULL; + + _gItoTestKeyNum = 0; + _gItoTestDummyNum = 0; + _gItoTestTriangleNum = 0; + _gIsEnable2R = 0; + + for (i = 0; i < 10; i ++) + { + nTpType = _DrvMpTestItoTestGetTpType(); + DBG("nTpType = %d, i = %d\n", nTpType, i); + + if (TP_OF_X == nTpType || TP_OF_Y == nTpType) // Modify. + { + break; + } + else if (i < 5) + { + mdelay(100); + } + else + { + DrvPlatformLyrTouchDeviceResetHw(); + } + } + + if (TP_OF_X == nTpType) // Modify. + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _gOpen1 = open_1_X; + _gOpen1B = open_1B_X; + _gOpen2 = open_2_X; + _gOpen2B = open_2B_X; + _gOpen3 = open_3_X; + + _gShort_1 = short_1_X; + _gShort_2 = short_2_X; + _gShort_3 = short_3_X; + _gShort_4 = short_4_X; + + _gShort_1_GPO = short_1_X_GPO; + _gShort_2_GPO = short_2_X_GPO; + _gShort_3_GPO = short_3_X_GPO; + _gShort_4_GPO = short_4_X_GPO; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _gOpenRIU1 = open_1_X; + _gOpenRIU2 = open_2_X; + _gOpenRIU3 = open_3_X; + + _gShort_RIU1 = short_1_X; + _gShort_RIU2 = short_2_X; + _gShort_RIU3 = short_3_X; + _gShort_RIU4 = short_4_X; + + _gOpenSubFrameNum1 = NUM_OPEN_1_SENSOR_X; + _gOpenSubFrameNum2 = NUM_OPEN_2_SENSOR_X; + _gOpenSubFrameNum3 = NUM_OPEN_3_SENSOR_X; + _gShortSubFrameNum1 = NUM_SHORT_1_SENSOR_X; + _gShortSubFrameNum2 = NUM_SHORT_2_SENSOR_X; + _gShortSubFrameNum3 = NUM_SHORT_3_SENSOR_X; + _gShortSubFrameNum4 = NUM_SHORT_4_SENSOR_X; +#endif + + _gMAP1 = MAP1_X; + _gMAP2 = MAP2_X; + _gMAP3 = MAP3_X; + _gMAP40_1 = MAP40_1_X; + _gMAP40_2 = MAP40_2_X; + _gMAP40_3 = MAP40_3_X; + _gMAP40_4 = MAP40_4_X; + _gMAP41_1 = MAP41_1_X; + _gMAP41_2 = MAP41_2_X; + _gMAP41_3 = MAP41_3_X; + _gMAP41_4 = MAP41_4_X; + + _gSHORT_MAP1 = SHORT_MAP1_X; + _gSHORT_MAP2 = SHORT_MAP2_X; + _gSHORT_MAP3 = SHORT_MAP3_X; + _gSHORT_MAP4 = SHORT_MAP4_X; + + _gItoTestKeyNum = NUM_KEY_X; + _gItoTestDummyNum = NUM_DUMMY_X; + _gItoTestTriangleNum = NUM_SENSOR_X; + _gIsEnable2R = ENABLE_2R_X; + } + else if (TP_OF_Y == nTpType) // Modify. + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _gOpen1 = open_1_Y; + _gOpen1B = open_1B_Y; + _gOpen2 = open_2_Y; + _gOpen2B = open_2B_Y; + _gOpen3 = open_3_Y; + + _gShort_1 = short_1_Y; + _gShort_2 = short_2_Y; + _gShort_3 = short_3_Y; + _gShort_4 = short_4_Y; + + _gShort_1_GPO = short_1_Y_GPO; + _gShort_2_GPO = short_2_Y_GPO; + _gShort_3_GPO = short_3_Y_GPO; + _gShort_4_GPO = short_4_Y_GPO; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _gOpenRIU1 = open_1_Y; + _gOpenRIU2 = open_2_Y; + _gOpenRIU3 = open_3_Y; + + _gShort_RIU1 = short_1_Y; + _gShort_RIU2 = short_2_Y; + _gShort_RIU3 = short_3_Y; + _gShort_RIU4 = short_4_Y; + + _gOpenSubFrameNum1 = NUM_OPEN_1_SENSOR_Y; + _gOpenSubFrameNum2 = NUM_OPEN_2_SENSOR_Y; + _gOpenSubFrameNum3 = NUM_OPEN_3_SENSOR_Y; + _gShortSubFrameNum1 = NUM_SHORT_1_SENSOR_Y; + _gShortSubFrameNum2 = NUM_SHORT_2_SENSOR_Y; + _gShortSubFrameNum3 = NUM_SHORT_3_SENSOR_Y; + _gShortSubFrameNum4 = NUM_SHORT_4_SENSOR_Y; +#endif + + _gMAP1 = MAP1_Y; + _gMAP2 = MAP2_Y; + _gMAP3 = MAP3_Y; + _gMAP40_1 = MAP40_1_Y; + _gMAP40_2 = MAP40_2_Y; + _gMAP40_3 = MAP40_3_Y; + _gMAP40_4 = MAP40_4_Y; + _gMAP41_1 = MAP41_1_Y; + _gMAP41_2 = MAP41_2_Y; + _gMAP41_3 = MAP41_3_Y; + _gMAP41_4 = MAP41_4_Y; + + _gSHORT_MAP1 = SHORT_MAP1_Y; + _gSHORT_MAP2 = SHORT_MAP2_Y; + _gSHORT_MAP3 = SHORT_MAP3_Y; + _gSHORT_MAP4 = SHORT_MAP4_Y; + + _gItoTestKeyNum = NUM_KEY_Y; + _gItoTestDummyNum = NUM_DUMMY_Y; + _gItoTestTriangleNum = NUM_SENSOR_Y; + _gIsEnable2R = ENABLE_2R_Y; + } + else + { + nTpType = 0; + } + + return nTpType; +} + +static void _DrvMpTestItoTestSwReset(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x1100, 0xFFFF); //bank:ana, addr:h0000 + RegSet16BitValue(0x1100, 0x0000); + mdelay(50); // mdelay(15) +} + +//------------------------------------------------------------------------------// + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + +static u16 _DrvMpTestItoTestGetNum(void) +{ + u32 i; + u16 nSensorNum = 0; + u16 nRegVal1, nRegVal2; + + DBG("*** %s() ***\n", __func__); + + nRegVal1 = RegGet16BitValue(0x114A); //bank:ana, addr:h0025 + DBG("nRegValue1 = %d\n", nRegVal1); + + if ((nRegVal1 & BIT1) == BIT1) + { + nRegVal1 = RegGet16BitValue(0x120A); //bank:ana2, addr:h0005 + nRegVal1 = nRegVal1 & 0x0F; + + nRegVal2 = RegGet16BitValue(0x1216); //bank:ana2, addr:h000b + nRegVal2 = ((nRegVal2 >> 1) & 0x0F) + 1; + + nSensorNum = nRegVal1 * nRegVal2; + } + else + { + for (i = 0; i < 4; i ++) + { + nSensorNum += (RegGet16BitValue(0x120A)>>(4*i))&0x0F; //bank:ana2, addr:h0005 + } + } + DBG("nSensorNum = %d\n", nSensorNum); + + return nSensorNum; +} + +static void _DrvMpTestItoTestDisableFilterNoiseDetect(void) +{ + u16 nRegValue; + + DBG("*** %s() ***\n", __func__); + + // Disable DIG/ANA drop + nRegValue = RegGet16BitValue(0x1302); + + RegSet16BitValue(0x1302, nRegValue & (~(BIT2 | BIT1 | BIT0))); +} + +static void _DrvMpTestItoTestPolling(void) +{ + u16 nRegInt = 0x0000; + u16 nRegVal; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x130C, BIT15); //bank:fir, addr:h0006 + RegSet16BitValue(0x1214, (RegGet16BitValue(0x1214) | BIT0)); //bank:ana2, addr:h000a + + DBG("polling start\n"); + + do + { + nRegInt = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c + } while(( nRegInt & FIQ_E_FRAME_READY_MASK ) == 0x0000); + + DBG("polling end\n"); + + nRegVal = RegGet16BitValue(0x3D18); + RegSet16BitValue(0x3D18, nRegVal & (~FIQ_E_FRAME_READY_MASK)); +} + +static void _DrvMpTestItoOpenTestSetV(u8 nEnable, u8 nPrs) +{ + u16 nRegVal; + + DBG("*** %s() nEnable = %d, nPrs = %d ***\n", __func__, nEnable, nPrs); + + nRegVal = RegGet16BitValue(0x1208); //bank:ana2, addr:h0004 + nRegVal = nRegVal & 0xF1; + + if (nPrs == 0) + { + RegSet16BitValue(0x1208, nRegVal|0x0C); + } + else if (nPrs == 1) + { + RegSet16BitValue(0x1208, nRegVal|0x0E); + } + else + { + RegSet16BitValue(0x1208, nRegVal|0x02); + } + + if (nEnable) + { + nRegVal = RegGet16BitValue(0x1106); //bank:ana, addr:h0003 + RegSet16BitValue(0x1106, nRegVal|0x03); + } + else + { + nRegVal = RegGet16BitValue(0x1106); + nRegVal = nRegVal & 0xFC; + RegSet16BitValue(0x1106, nRegVal); + } +} + +static u16 _DrvMpTestItoTestMsg21xxaGetDataOut(s16 *pRawData) +{ + u32 i; + u16 szRawData[MAX_CHANNEL_NUM] = {0}; + u16 nSensorNum; + u16 nRegInt; + u8 szDbBusTxData[8] = {0}; + u8 szDbBusRxData[MAX_CHANNEL_NUM*2] = {0}; + + DBG("*** %s() ***\n", __func__); + + nSensorNum = _DrvMpTestItoTestGetNum(); + + if ((nSensorNum*2) > (MAX_CHANNEL_NUM*2)) + { + DBG("Danger. nSensorNum = %d\n", nSensorNum); + return nSensorNum; + } + + nRegInt = RegGet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1)); + RegSet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1), (nRegInt & (u16)(~FIQ_E_FRAME_READY_MASK))); + + _DrvMpTestItoTestPolling(); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x13; //bank:fir, addr:h0020 + szDbBusTxData[2] = 0x40; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + mdelay(20); + IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (nSensorNum * 2)); + mdelay(100); + + for (i = 0; i < nSensorNum * 2; i ++) + { + DBG("szDbBusRxData[%d] = %d\n", i, szDbBusRxData[i]); + } + + nRegInt = RegGet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1)); + RegSet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1), (nRegInt | (u16)FIQ_E_FRAME_READY_MASK)); + + for (i = 0; i < nSensorNum; i ++) + { + szRawData[i] = (szDbBusRxData[2 * i + 1] << 8 ) | (szDbBusRxData[2 * i]); + pRawData[i] = (s16)szRawData[i]; + } + + return nSensorNum; +} + +static void _DrvMpTestItoTestMsg21xxaSendDataIn(u8 nStep) +{ + u32 i; + u16 *pType = NULL; + u8 szDbBusTxData[512] = {0}; + + DBG("*** %s() nStep = %d ***\n", __func__, nStep); + + if (nStep == 0) //39-4 (2R) + { + pType = &_gShort_4[0]; + } + else if (nStep == 1) //39-1 + { + pType = &_gShort_1[0]; + } + else if (nStep == 2) //39-2 + { + pType = &_gShort_2[0]; + } + else if (nStep == 3) //39-3 + { + pType = &_gShort_3[0]; + } + else if (nStep == 4) + { + pType = &_gOpen1[0]; + } + else if (nStep == 5) + { + pType = &_gOpen2[0]; + } + else if (nStep == 6) + { + pType = &_gOpen3[0]; + } + else if (nStep == 9) + { + pType = &_gOpen1B[0]; + } + else if (nStep == 10) + { + pType = &_gOpen2B[0]; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x11; //bank:ana, addr:h0000 + szDbBusTxData[2] = 0x00; + for (i = 0; i <= 0x3E ; i ++) + { + szDbBusTxData[3+2*i] = pType[i] & 0xFF; + szDbBusTxData[4+2*i] = (pType[i] >> 8) & 0xFF; + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+0x3F*2); + + szDbBusTxData[2] = 0x7A * 2; //bank:ana, addr:h007a + for (i = 0x7A; i <= 0x7D ; i ++) + { + szDbBusTxData[3+2*(i-0x7A)] = 0; + szDbBusTxData[4+2*(i-0x7A)] = 0; + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+8); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x12; //bank:ana2, addr:h0005 + + szDbBusTxData[2] = 0x05 * 2; + szDbBusTxData[3] = pType[128+0x05] & 0xFF; + szDbBusTxData[4] = (pType[128+0x05] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + szDbBusTxData[2] = 0x0B * 2; //bank:ana2, addr:h000b + szDbBusTxData[3] = pType[128+0x0B] & 0xFF; + szDbBusTxData[4] = (pType[128+0x0B] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + szDbBusTxData[2] = 0x12 * 2; //bank:ana2, addr:h0012 + szDbBusTxData[3] = pType[128+0x12] & 0xFF; + szDbBusTxData[4] = (pType[128+0x12] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + szDbBusTxData[2] = 0x15 * 2; //bank:ana2, addr:h0015 + szDbBusTxData[3] = pType[128+0x15] & 0xFF; + szDbBusTxData[4] = (pType[128+0x15] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); +/* +//#if 1 //for AC mod --showlo + szDbBusTxData[1] = 0x13; + szDbBusTxData[2] = 0x12 * 2; + szDbBusTxData[3] = 0x30; + szDbBusTxData[4] = 0x30; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + + szDbBusTxData[2] = 0x14 * 2; + szDbBusTxData[3] = 0X30; + szDbBusTxData[4] = 0X30; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + + szDbBusTxData[1] = 0x12; + for (i = 0x0D; i <= 0x10; i ++) //for AC noise(++) + { + szDbBusTxData[2] = i * 2; + szDbBusTxData[3] = pType[128+i] & 0xFF; + szDbBusTxData[4] = (pType[128+i] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + } + + for (i = 0x16; i <= 0x18; i ++) //for AC noise + { + szDbBusTxData[2] = i * 2; + szDbBusTxData[3] = pType[128+i] & 0xFF; + szDbBusTxData[4] = (pType[128+i] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + } +//#endif +*/ +} + +static void _DrvMpTestItoOpenTestMsg21xxaSetC(u8 nCSubStep) +{ + u32 i; + u8 szDbBusTxData[MAX_CHANNEL_NUM+3]; + u8 nHighLevelCSub = false; + u8 nCSubNew; + + DBG("*** %s() nCSubStep = %d ***\n", __func__, nCSubStep); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x11; //bank:ana, addr:h0042 + szDbBusTxData[2] = 0x84; + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nCSubNew = nCSubStep; + nHighLevelCSub = false; + + if (nCSubNew > 0x1F) + { + nCSubNew = nCSubNew - 0x14; + nHighLevelCSub = true; + } + + szDbBusTxData[3+i] = nCSubNew & 0x1F; + if (nHighLevelCSub == true) + { + szDbBusTxData[3+i] |= BIT5; + } + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], MAX_CHANNEL_NUM+3); + + szDbBusTxData[2] = 0xB4; //bank:ana, addr:h005a + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], MAX_CHANNEL_NUM+3); +} + +static void _DrvMpTestItoOpenTestMsg21xxaFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i, j; + s16 szTmpRawData[MAX_CHANNEL_NUM] = {0}; + u16 nRegVal; + u8 nLoop; + u8 nSensorNum1 = 0, nSensorNum2 = 0, nTotalSensor = 0; + u8 *pMapping = NULL; + +// nSensorNum1 = 0; +// nSensorNum2 = 0; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + RegSet16BitValue(0x1E24, 0x0500); //bank:chip, addr:h0012 + RegSet16BitValue(0x1E2A, 0x0000); //bank:chip, addr:h0015 + RegSet16BitValue(0x1EE6, 0x6E00); //bank:chip, addr:h0073 + RegSet16BitValue(0x1EE8, 0x0071); //bank:chip, addr:h0074 + + if (nItemId == 40) + { + pMapping = &_gMAP1[0]; + if (_gIsEnable2R) + { + nTotalSensor = _gItoTestTriangleNum/2; + } + else + { + nTotalSensor = _gItoTestTriangleNum/2 + _gItoTestKeyNum + _gItoTestDummyNum; + } + } + else if (nItemId == 41) + { + pMapping = &_gMAP2[0]; + if (_gIsEnable2R) + { + nTotalSensor = _gItoTestTriangleNum/2; + } + else + { + nTotalSensor = _gItoTestTriangleNum/2 + _gItoTestKeyNum + _gItoTestDummyNum; + } + } + else if (nItemId == 42) + { + pMapping = &_gMAP3[0]; + nTotalSensor = _gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum; + } + + nLoop = 1; + if (nItemId != 42) + { + if (nTotalSensor > 11) + { + nLoop = 2; + } + } + + DBG("nLoop = %d\n", nLoop); + + for (i = 0; i < nLoop; i ++) + { + if (i == 0) + { + _DrvMpTestItoTestMsg21xxaSendDataIn(nItemId - 36); + } + else + { + if (nItemId == 40) + { + _DrvMpTestItoTestMsg21xxaSendDataIn(9); + } + else + { + _DrvMpTestItoTestMsg21xxaSendDataIn(10); + } + } + + _DrvMpTestItoTestDisableFilterNoiseDetect(); + + _DrvMpTestItoOpenTestSetV(1, 0); + nRegVal = RegGet16BitValue(0x110E); //bank:ana, addr:h0007 + RegSet16BitValue(0x110E, nRegVal | BIT11); + + if (_gLTP == 1) + { + _DrvMpTestItoOpenTestMsg21xxaSetC(32); + } + else + { + _DrvMpTestItoOpenTestMsg21xxaSetC(0); + } + + _DrvMpTestItoTestSwReset(); + + if (i == 0) + { + nSensorNum1 = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData); + DBG("nSensorNum1 = %d\n", nSensorNum1); + } + else + { + nSensorNum2 = _DrvMpTestItoTestMsg21xxaGetDataOut(&szTmpRawData[nSensorNum1]); + DBG("nSensorNum1 = %d, nSensorNum2 = %d\n", nSensorNum1, nSensorNum2); + } + } + + for (j = 0; j < nTotalSensor; j ++) + { + if (_gLTP == 1) + { + pRawData[pMapping[j]] = szTmpRawData[j] + 4096; + pDataFlag[pMapping[j]] = 1; + } + else + { + pRawData[pMapping[j]] = szTmpRawData[j]; + pDataFlag[pMapping[j]] = 1; + } + } +} + +static void _DrvMpTestItoShortTestChangeGPOSetting(u8 nItemId) +{ + u8 szDbBusTxData[3+GPO_SETTING_SIZE*2] = {0}; + u16 szGPOSetting[3] = {0}; + u32 i; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 0) // 39-4 + { + szGPOSetting[0] = _gShort_4_GPO[0]; + szGPOSetting[1] = _gShort_4_GPO[1]; + szGPOSetting[2] = _gShort_4_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } + else if (nItemId == 1) // 39-1 + { + szGPOSetting[0] = _gShort_1_GPO[0]; + szGPOSetting[1] = _gShort_1_GPO[1]; + szGPOSetting[2] = _gShort_1_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } + else if (nItemId == 2) // 39-2 + { + szGPOSetting[0] = _gShort_2_GPO[0]; + szGPOSetting[1] = _gShort_2_GPO[1]; + szGPOSetting[2] = _gShort_2_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } + else if (nItemId == 3) // 39-3 + { + szGPOSetting[0] = _gShort_3_GPO[0]; + szGPOSetting[1] = _gShort_3_GPO[1]; + szGPOSetting[2] = _gShort_3_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } + else + { + DBG("Invalid item id for changing GPIO setting of short test.\n"); + + return; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x12; + szDbBusTxData[2] = 0x48; + + for (i = 0; i < GPO_SETTING_SIZE; i ++) + { + szDbBusTxData[3+2*i] = szGPOSetting[i] & 0xFF; + szDbBusTxData[4+2*i] = (szGPOSetting[i] >> 8) & 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+GPO_SETTING_SIZE*2); +} + +static void _DrvMpTestItoShortTestChangeRmodeSetting(u8 nMode) +{ + u8 szDbBusTxData[6] = {0}; + + DBG("*** %s() nMode = %d ***\n", __func__, nMode); + + // AFE R-mode enable(Bit-12) + RegSetLByteValue(0x1103, 0x10); + + // drv_mux_OV (Bit-8 1:enable) + RegSetLByteValue(0x1107, 0x55); + + if (nMode == 1) // P_CODE: 0V + { + RegSet16BitValue(0x110E, 0x073A); + } + else if (nMode == 0) // N_CODE: 2.4V + { + RegSet16BitValue(0x110E, 0x073B); + } + + // SW2 rising & SW3 rising return to 0 + RegSetLByteValue(0x1227, 0x01); + // turn off the chopping + RegSetLByteValue(0x1208, 0x0C); + // idle driver ov + RegSetLByteValue(0x1241, 0xC0); + + // AFE ov + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x12; + szDbBusTxData[2] = 0x44; + szDbBusTxData[3] = 0xFF; + szDbBusTxData[4] = 0xFF; + szDbBusTxData[5] = 0xFF; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 6); +} + +static void _DrvMpTestItoShortTestMsg21xxaFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i; + s16 szTmpRawData[MAX_CHANNEL_NUM] = {0}; + s16 szTmpRawData2[MAX_CHANNEL_NUM] = {0}; + u8 nSensorNum, nSensorNum2, nNumOfSensorMapping1, nNumOfSensorMapping2, nSensorCount = 0; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + // chip top op0 + RegSet16BitValue(0x1E24, 0x0500); //bank:chip, addr:h0012 + RegSet16BitValue(0x1E2A, 0x0000); //bank:chip, addr:h0015 + RegSet16BitValue(0x1EE6, 0x6E00); //bank:chip, addr:h0073 + RegSet16BitValue(0x1EE8, 0x0071); //bank:chip, addr:h0074 + + if ((_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) % 2 != 0) + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2 + 1; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + } + else + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + if (nNumOfSensorMapping2 % 2 != 0) + { + nNumOfSensorMapping2 ++; + } + } + + if (nItemId == 0) // 39-4 (2R) + { + pMapping = &_gSHORT_MAP4[0]; + nSensorCount = _gItoTestTriangleNum/2; + } + else if (nItemId == 1) // 39-1 + { + pMapping = &_gSHORT_MAP1[0]; + nSensorCount = nNumOfSensorMapping1; + } + else if (nItemId == 2) // 39-2 + { + pMapping = &_gSHORT_MAP2[0]; + nSensorCount = nNumOfSensorMapping2; + } + else if (nItemId == 3) // 39-3 + { + pMapping = &_gSHORT_MAP3[0]; + nSensorCount = _gItoTestTriangleNum; + } + DBG("nSensorCount = %d\n", nSensorCount); + + _DrvMpTestItoTestMsg21xxaSendDataIn(nItemId); + + _DrvMpTestItoTestDisableFilterNoiseDetect(); + + _DrvMpTestItoShortTestChangeRmodeSetting(1); + _DrvMpTestItoShortTestChangeGPOSetting(nItemId); + _DrvMpTestItoTestSwReset(); + nSensorNum = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData); + DBG("nSensorNum = %d\n", nSensorNum); + + _DrvMpTestItoShortTestChangeRmodeSetting(0); + _DrvMpTestItoShortTestChangeGPOSetting(nItemId); + _DrvMpTestItoTestSwReset(); + nSensorNum2 = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData2); + DBG("nSensorNum2 = %d\n", nSensorNum2); + + for (i = 0; i < nSensorCount; i ++) + { + pRawData[pMapping[i]] = szTmpRawData[i] - szTmpRawData2[i]; + pDataFlag[pMapping[i]] = 1; + } +} + +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + +static u16 _DrvMpTestItoTestMsg22xxGetDataOut(s16 *pRawData, u16 nSubFrameNum) +{ + u32 i; + u16 szRawData[MAX_CHANNEL_NUM*2] = {0}; + u16 nRegInt = 0x0000; + u16 nSize = nSubFrameNum * 4; + u8 szDbBusTxData[8] = {0}; + u8 szDbBusRxData[MAX_CHANNEL_NUM*4] = {0}; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValueOff(0x120A, BIT1); //one-shot mode + RegSet16BitValueOff(0x3D08, BIT8); //FIQ_E_FRAME_READY_MASK + //RegSet16BitValueOn(0x130C, BIT15); //MCU read done + RegSet16BitValueOn(0x120A, BIT0); //trigger one-shot + + DBG("polling start\n"); + + do + { + nRegInt = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c + } while(( nRegInt & FIQ_E_FRAME_READY_MASK ) == 0x0000); + + DBG("polling end\n"); + + RegSet16BitValueOff(0x3D18, BIT8); //Clear frame-ready interrupt status + + //ReadRegBurst start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x15; //bank:fir, addr:h0000 + szDbBusTxData[2] = 0x00; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + mdelay(20); +// IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (MAX_CHANNEL_NUM * 4)); + IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (nSubFrameNum * 4 * 2)); + mdelay(100); + +// for (i = 0; i < (MAX_CHANNEL_NUM * 4); i ++) + for (i = 0; i < (nSubFrameNum * 4 * 2); i ++) + { + DBG("szDbBusRxData[%d] = %d\n", i, szDbBusRxData[i]); + } + //ReadRegBurst stop + + RegSet16BitValueOn(0x3D08, BIT8); //FIQ_E_FRAME_READY_MASK + +// for (i = 0; i < (MAX_CHANNEL_NUM * 2); i ++) + for (i = 0; i < nSize; i ++) + { + szRawData[i] = (szDbBusRxData[2 * i + 1] << 8 ) | (szDbBusRxData[2 * i]); + pRawData[i] = (s16)szRawData[i]; + } + +// return (MAX_CHANNEL_NUM * 2); + return nSize; +} + +static void _DrvMpTestItoTestMsg22xxSendDataIn(u8 nStep, u16 nSubFrameNum) +{ + u32 i; + u32 *pType = NULL; + u16 nRiuWriteLength = nSubFrameNum * 6; + + DBG("*** %s() nStep = %d, nSubFrameNum = %d ***\n", __func__, nStep, nSubFrameNum); + + if (nStep == 0) //39-4 (2R) + { + pType = &_gShort_RIU4[0]; + } + else if (nStep == 1) //39-1 + { + pType = &_gShort_RIU1[0]; + } + else if (nStep == 2) //39-2 + { + pType = &_gShort_RIU2[0]; + } + else if (nStep == 3) //39-3 + { + pType = &_gShort_RIU3[0]; + } + else if (nStep == 4) + { + pType = &_gOpenRIU1[0]; + } + else if (nStep == 5) + { + pType = &_gOpenRIU2[0]; + } + else if (nStep == 6) + { + pType = &_gOpenRIU3[0]; + } + + RegSet16BitValueOn(0x1192, BIT4); // force on enable sensor mux and csub sel sram clock + RegSet16BitValueOff(0x1192, BIT5); // mem clk sel + RegSet16BitValueOff(0x1100, BIT3); // tgen soft rst + RegSet16BitValue(0x1180, RIU_BASE_ADDR); // sensor mux sram read/write base address + RegSet16BitValue(0x1182, nRiuWriteLength); // sensor mux sram write length + RegSet16BitValueOn(0x1188, BIT0); // reg_mem0_w_start + + for (i = RIU_BASE_ADDR; i < (RIU_BASE_ADDR + nRiuWriteLength); i ++) + { + RegSet16BitValue(0x118A, (u16)(pType[i])); + RegSet16BitValue(0x118C, (u16)(pType[i] >> 16)); + } +} + +static void _DrvMpTestItoTestMsg22xxSetC(u8 nCSubStep) +{ + u32 i; + u16 nCSubNew, nRegVal; + + DBG("*** %s() nCSubStep = %d ***\n", __func__, nCSubStep); + + nCSubNew = (nCSubStep > CSUB_REF_MAX) ? CSUB_REF_MAX : nCSubStep; // 6 bits + nCSubNew = (nCSubNew | (nCSubNew << 8)); + + nRegVal = RegGet16BitValue(0x11C8); // csub sel overwrite enable, will referance value of 11C0 + + if (nRegVal == 0x000F) + { + RegSet16BitValue(0x11C0, nCSubNew); + } + else + { + RegSet16BitValueOn(0x1192, BIT4); // force on enable sensor mux and csub sel sram clock + RegSet16BitValueOff(0x1192, BIT5); // mem clk sel + RegSet16BitValueOff(0x1100, BIT3); // tgen soft rst + RegSet16BitValue(0x1184, 0); // nAddr + RegSet16BitValue(0x1186, MAX_CHANNEL_NUM); // nLen + RegSet16BitValueOn(0x1188, BIT2); // reg_mem0_w_start + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + RegSet16BitValue( 0x118E, nCSubNew); + RegSet16BitValue( 0x1190, nCSubNew); + } + } +} + +static void _DrvMpTestItoTestMsg22xxRegReset(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValueOn(0x1102, (BIT3 | BIT4 | BIT5 | BIT6 | BIT7)); + RegSet16BitValueOff(0x1130, (BIT0 | BIT1 | BIT2 | BIT3 | BIT8)); + + RegSet16BitValueOn(0x1112, BIT15); + RegSet16BitValueOff(0x1112, BIT13); + + RegSet16BitValueOn(0x1250, ((5 << 0) & 0x007F)); + RegSet16BitValueOn(0x1250, ((1 << 8) & 0x7F00)); + RegSet16BitValueOff(0x1250, 0x8080); + + RegSet16BitValueOff(0x1312, (BIT12 | BIT14)); + + RegSet16BitValueOn(0x1300, BIT15); + RegSet16BitValueOff(0x1300, (BIT10 | BIT11 | BIT12 | BIT13 | BIT14)); + + RegSet16BitValueOn(0x1130, BIT9); + + RegSet16BitValueOn(0x1318, (BIT12 | BIT13)); + + //RegSet16BitValue(0x121A, ((8 - 1) & 0x01FF)); // sampling number group A + RegSet16BitValue(0x121C, ((8 - 1) & 0x01FF)); // sampling number group B + RegSet16BitValueOn(0x131A, 0x2000); + RegSet16BitValueOn(0x131C, BIT9); + RegSet16BitValueOff(0x131C, (BIT8 | BIT10)); + + + RegSet16BitValueOff(0x1174, 0x0F00); + + RegSet16BitValue(0x1240, 0x0000); // mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + RegSet16BitValue(0x1242, 0x0000); // mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + + RegSet16BitValue(0x1212, 0xFFFF); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B + RegSet16BitValue(0x1214, 0x00FF); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B + //RegSet16BitValue( 0x1212, 0); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B + //RegSet16BitValue( 0x1214, 0); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B + + RegSet16BitValue(0x121E, 0xFFFF); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B + RegSet16BitValue(0x1220, 0x00FF); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B + //RegSet16BitValue( 0x121E, 0); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B + //RegSet16BitValue( 0x1220, 0); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B + + RegSet16BitValue(0x120E, 0x0); // noise sense mode selection for total 24 subframes + RegSet16BitValue(0x1210, 0x0); // noise sense mode selection for total 24 subframes + + RegSet16BitValue(0x128C, 0x0F); // ADC afe gain correction bypass + mdelay(50); +} + +static void _DrvMpTestItoTestMsg22xxGetChargeDumpTime(u16 nMode, u16 *pChargeTime, u16 *pDumpTime) +{ + u16 nChargeTime = 0, nDumpTime = 0; + u16 nMinChargeTime = 0xFFFF, nMinDumpTime = 0xFFFF, nMaxChargeTime = 0x0000, nMaxDumpTime = 0x0000; + + DBG("*** %s() ***\n", __func__); + + nChargeTime = RegGet16BitValue(0x1226); + nDumpTime = RegGet16BitValue(0x122A); + + if (nMinChargeTime > nChargeTime) + { + nMinChargeTime = nChargeTime; + } + + if (nMaxChargeTime < nChargeTime) + { + nMaxChargeTime = nChargeTime; + } + + if (nMinDumpTime > nDumpTime) + { + nMinDumpTime = nDumpTime; + } + + if (nMaxDumpTime < nDumpTime) + { + nMaxDumpTime = nDumpTime; + } + + DBG("nChargeTime = %d, nDumpTime = %d\n", nChargeTime, nDumpTime); + + if (nMode == 1) + { + *pChargeTime = nMaxChargeTime; + *pDumpTime = nMaxDumpTime; + } + else + { + *pChargeTime = nMinChargeTime; + *pDumpTime = nMinDumpTime; + } +} + +static void _DrvMpTestItoOpenTestMsg22xxFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i; + s16 szTmpRawData[MAX_CHANNEL_NUM*2] = {0}; + u16 nSubFrameNum = 0; + u16 nChargeTime, nDumpTime; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + _DrvMpTestItoTestMsg22xxRegReset(); + + switch (nItemId) + { + case 40: + pMapping = &_gMAP1[0]; + nSubFrameNum = _gOpenSubFrameNum1; + break; + case 41: + pMapping = &_gMAP2[0]; + nSubFrameNum = _gOpenSubFrameNum2; + break; + case 42: + pMapping = &_gMAP3[0]; + nSubFrameNum = _gOpenSubFrameNum3; + break; + } + + if (nSubFrameNum > 24) // MAX_CHANNEL_NUM/2 + { + nSubFrameNum = 24; + } + + + _DrvMpTestItoTestMsg22xxSendDataIn(nItemId - 36, nSubFrameNum * 6); + + if (true) + { + RegSet16BitValue(0x1110, 0x0060); //2.4V -> 1.2V + } + else + { + RegSet16BitValue(0x1110, 0x0020); //3.0V -> 0.6V + } + + RegSet16BitValue(0x11C8, 0x000F); //csub sel overwrite enable, will referance value of 11C0 + RegSet16BitValue(0x1174, 0x0F06); // 1 : sel idel driver for sensor pad that connected to AFE + RegSet16BitValue(0x1208, 0x0006); //PRS1 + RegSet16BitValue(0x1240, 0xFFFF); //mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + RegSet16BitValue(0x1242, 0x00FF); //mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + RegSet16BitValue(0x1216, (nSubFrameNum - 1) << 1); // subframe numbers, 0:1subframe, 1:2subframe + + _DrvMpTestItoTestMsg22xxGetChargeDumpTime(1, &nChargeTime, &nDumpTime); + + RegSet16BitValue(0x1226, nChargeTime); + RegSet16BitValue(0x122A, nDumpTime); + + _DrvMpTestItoTestMsg22xxSetC(CSUB_REF); + _DrvMpTestItoTestSwReset(); + _DrvMpTestItoTestMsg22xxGetDataOut(szTmpRawData, nSubFrameNum); + +// for (i = 0; i < (MAX_CHANNEL_NUM/2) ; i ++) + for (i = 0; i < nSubFrameNum ; i ++) + { +// DBG("szTmpRawData[%d * 4] >> 3 = %d\n", i, szTmpRawData[i * 4] >> 3); // add for debug +// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug + + pRawData[pMapping[i]] = (szTmpRawData[i * 4] >> 3); // Filter to ADC + pDataFlag[pMapping[i]] = 1; + } +} + +static void _DrvMpTestItoShortTestMsg22xxFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i, j; + s16 szRawData[MAX_CHANNEL_NUM*2] = {0}; + s16 szTmpRawData[MAX_CHANNEL_NUM*2] = {0}; + u16 nSensorNum = 0, nSubFrameNum = 0; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + _DrvMpTestItoTestMsg22xxRegReset(); + + switch(nItemId) + { + case 0: // 39-4 (2R) + pMapping = &_gSHORT_MAP4[0]; + nSensorNum = _gShortSubFrameNum4; + break; + case 1: // 39-1 + pMapping = &_gSHORT_MAP1[0]; + nSensorNum = _gShortSubFrameNum1; + break; + case 2: // 39-2 + pMapping = &_gSHORT_MAP2[0]; + nSensorNum = _gShortSubFrameNum2; + break; + case 3: // 39-3 + pMapping = &_gSHORT_MAP3[0]; + nSensorNum = _gShortSubFrameNum3; + break; + } + + if (nSensorNum > 24) // MAX_CHANNEL_NUM/2 + { + nSubFrameNum = 24; + } + else + { + nSubFrameNum = nSensorNum; + } + + _DrvMpTestItoTestMsg22xxSendDataIn(nItemId, nSubFrameNum * 6); + + + //RegSet16BitValue(0x1110, 0x0030); // [6:4} 011 : 2.1V -> 1.5V + RegSet16BitValue(0x1110, 0x0060); // 2.4V -> 1.2V + RegSet16BitValue(0x11C8, 0x000F); // csub sel overwrite enable, will referance value of 11C0 + RegSet16BitValue(0x1174, 0x0006); // [11:8] 000 : sel active driver for sensor pad that connected to AFE + RegSet16BitValue(0x1208, 0x0006); // PRS1 + RegSet16BitValueOn(0x1104, BIT14); // R mode + RegSet16BitValue(0x1216, (nSubFrameNum - 1) << 1); // subframe numbers, 0:1subframe, 1:2subframe + RegSet16BitValue(0x1176, 0x0000); // CFB 10p + RegSet16BitValue(0x1226, 0x000B); // Charge 4ns + RegSet16BitValue(0x122A, 0x000B); // Dump 4ns + + + _DrvMpTestItoTestMsg22xxSetC(CSUB_REF); + _DrvMpTestItoTestSwReset(); + _DrvMpTestItoTestMsg22xxGetDataOut(szTmpRawData, nSubFrameNum); + + if (nSensorNum > 24) + { + j = 0; + +// for (i = 0; i < (MAX_CHANNEL_NUM/2); i ++) + for (i = 0; i < nSubFrameNum; i ++) + { + szRawData[j] = (szTmpRawData[i * 4] >> 2); + j ++; + + if ((nSensorNum - 24) > i) + { + szRawData[j] = (szTmpRawData[i * 4 + 1] >> 2); + j ++; + } + } + +// for (i = 0; i < (MAX_CHANNEL_NUM/2); i ++) + for (i = 0; i < nSubFrameNum; i ++) + { +// DBG("szRawData[%d] = %d\n", i, szRawData[i]); // add for debug +// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug + + pRawData[pMapping[i]] = szRawData[i]; + pDataFlag[pMapping[i]] = 1; + } + } + else + { +// for (i = 0; i < (MAX_CHANNEL_NUM/2); i ++) + for (i = 0; i < nSubFrameNum; i ++) + { +// DBG("szTmpRawData[%d * 4] >> 2 = %d\n", i, szTmpRawData[i * 4] >> 2); // add for debug +// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug + + pRawData[pMapping[i]] = (szTmpRawData[i * 4] >> 2); + pDataFlag[pMapping[i]] = 1; + } + } +} + +#endif + +//------------------------------------------------------------------------------// + +static ItoTestResult_e _DrvMpTestItoOpenTestSecond(u8 nItemId) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u32 i; + s32 nTmpRawDataJg1 = 0; + s32 nTmpRawDataJg2 = 0; + s32 nTmpJgAvgThMax1 = 0; + s32 nTmpJgAvgThMin1 = 0; + s32 nTmpJgAvgThMax2 = 0; + s32 nTmpJgAvgThMin2 = 0; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + nTmpRawDataJg1 += _gRawData1[_gMAP40_1[i]]; + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData1[_gMAP40_2[i]]; + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + nTmpRawDataJg1 += _gRawData2[_gMAP41_1[i]]; + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData2[_gMAP41_2[i]]; + } + } + + nTmpJgAvgThMax1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/2)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/2)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax2 = (nTmpRawDataJg2 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin2 = (nTmpRawDataJg2 / 2 ) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + + DBG("nItemId = %d, nTmpRawDataJg1 = %d, nTmpJgAvgThMax1 = %d, nTmpJgAvgThMin1 = %d, nTmpRawDataJg2 = %d, nTmpJgAvgThMax2 = %d, nTmpJgAvgThMin2 = %d\n", nItemId, nTmpRawDataJg1, nTmpJgAvgThMax1, nTmpJgAvgThMin1, nTmpRawDataJg2, nTmpJgAvgThMax2, nTmpJgAvgThMin2); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + if (_gRawData1[_gMAP40_1[i]] > nTmpJgAvgThMax1 || _gRawData1[_gMAP40_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData1[_gMAP40_2[i]] > nTmpJgAvgThMax2 || _gRawData1[_gMAP40_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + if (_gRawData2[_gMAP41_1[i]] > nTmpJgAvgThMax1 || _gRawData2[_gMAP41_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData2[_gMAP41_2[i]] > nTmpJgAvgThMax2 || _gRawData2[_gMAP41_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + + return nRetVal; +} + +static ItoTestResult_e _DrvMpTestItoOpenTestSecond2r(u8 nItemId) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u32 i; + s32 nTmpRawDataJg1 = 0; + s32 nTmpRawDataJg2 = 0; + s32 nTmpRawDataJg3 = 0; + s32 nTmpRawDataJg4 = 0; + s32 nTmpJgAvgThMax1 = 0; + s32 nTmpJgAvgThMin1 = 0; + s32 nTmpJgAvgThMax2 = 0; + s32 nTmpJgAvgThMin2 = 0; + s32 nTmpJgAvgThMax3 = 0; + s32 nTmpJgAvgThMin3 = 0; + s32 nTmpJgAvgThMax4 = 0; + s32 nTmpJgAvgThMin4 = 0; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg1 += _gRawData1[_gMAP40_1[i]]; //first region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData1[_gMAP40_2[i]]; //first region: border + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg3 += _gRawData1[_gMAP40_3[i]]; //second region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg4 += _gRawData1[_gMAP40_4[i]]; //second region: border + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg1 += _gRawData2[_gMAP41_1[i]]; //first region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData2[_gMAP41_2[i]]; //first region: border + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg3 += _gRawData2[_gMAP41_3[i]]; //second region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg4 += _gRawData2[_gMAP41_4[i]]; //second region: border + } + } + + nTmpJgAvgThMax1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/4)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/4)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax2 = (nTmpRawDataJg2 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin2 = (nTmpRawDataJg2 / 2) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax3 = (nTmpRawDataJg3 / ((_gItoTestTriangleNum/4)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin3 = (nTmpRawDataJg3 / ((_gItoTestTriangleNum/4)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax4 = (nTmpRawDataJg4 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin4 = (nTmpRawDataJg4 / 2) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + + DBG("nItemId = %d, nTmpRawDataJg1 = %d, nTmpJgAvgThMax1 = %d, nTmpJgAvgThMin1 = %d, nTmpRawDataJg2 = %d, nTmpJgAvgThMax2 = %d, nTmpJgAvgThMin2 = %d\n", nItemId, nTmpRawDataJg1, nTmpJgAvgThMax1, nTmpJgAvgThMin1, nTmpRawDataJg2, nTmpJgAvgThMax2, nTmpJgAvgThMin2); + DBG("nTmpRawDataJg3 = %d, nTmpJgAvgThMax3 = %d, nTmpJgAvgThMin3 = %d, nTmpRawDataJg4 = %d, nTmpJgAvgThMax4 = %d, nTmpJgAvgThMin4 = %d\n", nTmpRawDataJg3, nTmpJgAvgThMax3, nTmpJgAvgThMin3, nTmpRawDataJg4, nTmpJgAvgThMax4, nTmpJgAvgThMin4); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData1[_gMAP40_1[i]] > nTmpJgAvgThMax1 || _gRawData1[_gMAP40_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData1[_gMAP40_2[i]] > nTmpJgAvgThMax2 || _gRawData1[_gMAP40_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData1[_gMAP40_3[i]] > nTmpJgAvgThMax3 || _gRawData1[_gMAP40_3[i]] < nTmpJgAvgThMin3) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_3[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData1[_gMAP40_4[i]] > nTmpJgAvgThMax4 || _gRawData1[_gMAP40_4[i]] < nTmpJgAvgThMin4) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_4[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData2[_gMAP41_1[i]] > nTmpJgAvgThMax1 || _gRawData2[_gMAP41_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData2[_gMAP41_2[i]] > nTmpJgAvgThMax2 || _gRawData2[_gMAP41_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData2[_gMAP41_3[i]] > nTmpJgAvgThMax3 || _gRawData2[_gMAP41_3[i]] < nTmpJgAvgThMin3) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_3[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData2[_gMAP41_4[i]] > nTmpJgAvgThMax4 || _gRawData2[_gMAP41_4[i]] < nTmpJgAvgThMin4) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_4[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + + return nRetVal; +} + +static ItoTestResult_e _DrvMpTestItoShortTestSecond(u8 nItemId) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u32 i; + u8 nSensorCount = 0; +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + u8 nNumOfSensorMapping1, nNumOfSensorMapping2; +#endif //CONFIG_ENABLE_CHIP_MSG21XXA + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + if ((_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) % 2 != 0) + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2 + 1; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + } + else + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + if (nNumOfSensorMapping2 % 2 != 0) + { + nNumOfSensorMapping2 ++; + } + } +#endif //CONFIG_ENABLE_CHIP_MSG21XXA + + if (nItemId == 0) // 39-4 (2R) + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + nSensorCount = _gItoTestTriangleNum/2; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + nSensorCount = _gShortSubFrameNum4; +#endif + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData4[_gSHORT_MAP4[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP4[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 1) // 39-1 + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + nSensorCount = nNumOfSensorMapping1; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + nSensorCount = _gShortSubFrameNum1; +#endif + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData1[_gSHORT_MAP1[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 2) // 39-2 + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + nSensorCount = nNumOfSensorMapping2; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + nSensorCount = _gShortSubFrameNum2; +#endif + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData2[_gSHORT_MAP2[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 3) // 39-3 + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + nSensorCount = _gItoTestTriangleNum; +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + nSensorCount = _gShortSubFrameNum3; +#endif + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData3[_gSHORT_MAP3[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP3[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + DBG("nSensorCount = %d\n", nSensorCount); + + return nRetVal; +} + +s32 _DrvMpTestItoOpenTest(void) +{ + ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK; + u32 i; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DBG("open test start\n"); + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 50000); //50 KHZ + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + if (!_DrvMpTestItoTestChooseTpType()) + { + DBG("Choose Tp Type failed\n"); + nRetVal1 = ITO_TEST_GET_TP_TYPE_ERROR; + goto ITO_TEST_END; + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + mdelay(50); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gRawData1[i] = 0; + _gRawData2[i] = 0; + _gRawData3[i] = 0; + _gDataFlag1[i] = 0; + _gDataFlag2[i] = 0; + _gDataFlag3[i] = 0; + } + + _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoOpenTestMsg21xxaFirst(40, _gRawData1, _gDataFlag1); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoOpenTestMsg22xxFirst(40, _gRawData1, _gDataFlag1); +#endif + + if (_gIsEnable2R) + { + nRetVal2 = _DrvMpTestItoOpenTestSecond2r(40); + } + else + { + nRetVal2 = _DrvMpTestItoOpenTestSecond(40); + } + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoOpenTestMsg21xxaFirst(41, _gRawData2, _gDataFlag2); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoOpenTestMsg22xxFirst(41, _gRawData2, _gDataFlag2); +#endif + + if (_gIsEnable2R) + { + nRetVal3 = _DrvMpTestItoOpenTestSecond2r(41); + } + else + { + nRetVal3 = _DrvMpTestItoOpenTestSecond(41); + } +/* +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoOpenTestMsg21xxaFirst(42, _gRawData3, _gDataFlag3); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoOpenTestMsg22xxFirst(42, _gRawData3, _gDataFlag3); +#endif +*/ + + ITO_TEST_END: +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 100000); //100 KHZ + + DrvPlatformLyrTouchDeviceResetHw(); + DrvPlatformLyrEnableFingerTouchReport(); + + DBG("open test end\n"); + + if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK)) + { + return ITO_TEST_GET_TP_TYPE_ERROR; + } + else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK))) + { + return ITO_TEST_FAIL; + } + else + { + return ITO_TEST_OK; + } +} + +static ItoTestResult_e _DrvMpTestItoShortTest(void) +{ + ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK, nRetVal4 = ITO_TEST_OK, nRetVal5 = ITO_TEST_OK; + u32 i = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DBG("short test start\n"); + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 50000); //50 KHZ + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + if (!_DrvMpTestItoTestChooseTpType()) + { + DBG("Choose Tp Type failed\n"); + nRetVal1 = ITO_TEST_GET_TP_TYPE_ERROR; + goto ITO_TEST_END; + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + mdelay(50); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gRawData1[i] = 0; + _gRawData2[i] = 0; + _gRawData3[i] = 0; + _gRawData4[i] = 0; + _gDataFlag1[i] = 0; + _gDataFlag2[i] = 0; + _gDataFlag3[i] = 0; + _gDataFlag4[i] = 0; + } + + _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoShortTestMsg21xxaFirst(1, _gRawData1, _gDataFlag1); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoShortTestMsg22xxFirst(1, _gRawData1, _gDataFlag1); +#endif + + nRetVal2 = _DrvMpTestItoShortTestSecond(1); + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoShortTestMsg21xxaFirst(2, _gRawData2, _gDataFlag2); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoShortTestMsg22xxFirst(2, _gRawData2, _gDataFlag2); +#endif + + nRetVal3 = _DrvMpTestItoShortTestSecond(2); + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoShortTestMsg21xxaFirst(3, _gRawData3, _gDataFlag3); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoShortTestMsg22xxFirst(3, _gRawData3, _gDataFlag3); +#endif + + nRetVal4 = _DrvMpTestItoShortTestSecond(3); + + if (_gIsEnable2R) + { +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) + _DrvMpTestItoShortTestMsg21xxaFirst(0, _gRawData4, _gDataFlag4); +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) + _DrvMpTestItoShortTestMsg22xxFirst(0, _gRawData4, _gDataFlag4); +#endif + + nRetVal5 = _DrvMpTestItoShortTestSecond(0); + } + + ITO_TEST_END: +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 100000); //100 KHZ + + DrvPlatformLyrTouchDeviceResetHw(); + DrvPlatformLyrEnableFingerTouchReport(); + + DBG("short test end\n"); + + if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK) && (nRetVal4 == ITO_TEST_OK) && (nRetVal5 == ITO_TEST_OK)) + { + return ITO_TEST_GET_TP_TYPE_ERROR; + } + else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK) || (nRetVal4 != ITO_TEST_OK) || (nRetVal5 != ITO_TEST_OK))) + { + return ITO_TEST_FAIL; + } + else + { + return ITO_TEST_OK; + } +} + +/* +static s32 DrvMpTestProcReadDebug(char *page, char **start, off_t off, int count, int *eof, void *data) +{ + s32 nCount = 0; + + DBG("*** %s() ***\n", __func__); + + _gItoTestResult = _DrvMpTestItoOpenTest(); + + if (ITO_TEST_OK == _gItoTestResult) + { + DBG("ITO_TEST_OK"); + } + else if (ITO_TEST_FAIL == _gItoTestResult) + { + DBG("ITO_TEST_FAIL"); + } + else if (ITO_TEST_GET_TP_TYPE_ERROR == _gItoTestResult) + { + DBG("ITO_TEST_GET_TP_TYPE_ERROR"); + } + + *eof = 1; + + return nCount; +} + +static s32 DrvMpTestProcWriteDebug(struct file *file, const char *buffer, unsigned long count, void *data) +{ + u32 i; + + DBG("*** %s() ***\n", __func__); + + DBG("ito test result : %d", _gItoTestResult); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + DBG("_gRawData1[%d]=%d\n", i, _gRawData1[i]); + } + mdelay(5); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + DBG("_gRawData2[%d]=%d\n", i, _gRawData2[i]); + } + mdelay(5); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + DBG("_gRawData3[%d]=%d;\n",i , _gRawData3[i]); + } + mdelay(5); + + return count; +} +*/ + +static void _DrvMpTestItoTestDoWork(struct work_struct *pWork) +{ + s32 nRetVal = ITO_TEST_OK; + + DBG("*** %s() _gIsInMpTest = %d, _gTestRetryCount = %d ***\n", __func__, _gIsInMpTest, _gTestRetryCount); + + if (_gItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { + nRetVal = _DrvMpTestItoOpenTest(); + } + else if (_gItoTestMode == ITO_TEST_MODE_SHORT_TEST) + { + nRetVal = _DrvMpTestItoShortTest(); + } + else + { + DBG("*** Undefined Mp Test Mode = %d ***\n", _gItoTestMode); + return; + } + + DBG("*** ctp mp test result = %d ***\n", nRetVal); + + if (nRetVal == ITO_TEST_OK) + { + _gCtpMpTestStatus = ITO_TEST_OK; + _gIsInMpTest = 0; + DBG("mp test success\n"); + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + DrvFwCtrlRestoreFirmwareModeToLogDataMode(); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + } + else + { + _gTestRetryCount --; + if (_gTestRetryCount > 0) + { + DBG("_gTestRetryCount = %d\n", _gTestRetryCount); + queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork); + } + else + { + if (nRetVal == ITO_TEST_FAIL) + { + _gCtpMpTestStatus = ITO_TEST_FAIL; + } + else if (nRetVal == ITO_TEST_GET_TP_TYPE_ERROR) + { + _gCtpMpTestStatus = ITO_TEST_GET_TP_TYPE_ERROR; + } + else + { + _gCtpMpTestStatus = ITO_TEST_UNDEFINED_ERROR; + } + + _gIsInMpTest = 0; + DBG("mp test failed\n"); + +#ifdef CONFIG_ENABLE_FIRMWARE_DATA_LOG + DrvFwCtrlRestoreFirmwareModeToLogDataMode(); +#endif //CONFIG_ENABLE_FIRMWARE_DATA_LOG + } + } +} + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +/* +void DrvMpTestCreateProcEntry(void) +{ + _gMsgItoTest = proc_mkdir(PROC_MSG_ITO_TEST, NULL); + _gDebug = create_proc_entry(PROC_ITO_TEST_DEBUG, 0777, _gMsgItoTest); + + if (NULL == _gDebug) + { + DBG("create_proc_entry PROC_ITO_TEST_DEBUG FAIL\n"); + } + else + { + _gDebug->read_proc = DrvMpTestProcReadDebug; + _gDebug->write_proc = DrvMpTestProcWriteDebug; + DBG("create_proc_entry PROC_ITO_TEST_DEBUG OK\n"); + } +} +*/ + +s32 DrvMpTestGetTestResult(void) +{ + DBG("*** %s() ***\n", __func__); + DBG("_gCtpMpTestStatus = %d\n", _gCtpMpTestStatus); + + return _gCtpMpTestStatus; +} + +void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount) +{ + u32 i; + + DBG("*** %s() ***\n", __func__); + DBG("_gTestFailChannelCount = %d\n", _gTestFailChannelCount); + + for (i = 0; i < _gTestFailChannelCount; i ++) + { + pFailChannel[i] = _gTestFailChannel[i]; + } + + *pFailChannelCount = _gTestFailChannelCount; +} + +void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength) +{ + u32 i; + u8 nHighByte, nLowByte; + + DBG("*** %s() ***\n", __func__); + + if (eItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData1[i] >> 8) & 0xFF; + nLowByte = (_gRawData1[i]) & 0xFF; + + if (_gDataFlag1[i] == 1) + { + pDataLog[i*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData1[i] >= 0) + { + pDataLog[i*4+1] = 0; // + : a positive number + } + else + { + pDataLog[i*4+1] = 1; // - : a negative number + } + + pDataLog[i*4+2] = nHighByte; + pDataLog[i*4+3] = nLowByte; + } + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData2[i] >> 8) & 0xFF; + nLowByte = (_gRawData2[i]) & 0xFF; + + if (_gDataFlag2[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData2[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 1; // - : a negative number + } + + pDataLog[(i*4+2)+MAX_CHANNEL_NUM*4] = nHighByte; + pDataLog[(i*4+3)+MAX_CHANNEL_NUM*4] = nLowByte; + } + + *pLength = MAX_CHANNEL_NUM*8; + } + else if (eItoTestMode == ITO_TEST_MODE_SHORT_TEST) + { + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData1[i] >> 8) & 0xFF; + nLowByte = (_gRawData1[i]) & 0xFF; + + if (_gDataFlag1[i] == 1) + { + pDataLog[i*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData1[i] >= 0) + { + pDataLog[i*4+1] = 0; // + : a positive number + } + else + { + pDataLog[i*4+1] = 1; // - : a negative number + } + + pDataLog[i*4+2] = nHighByte; + pDataLog[i*4+3] = nLowByte; + } + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData2[i] >> 8) & 0xFF; + nLowByte = (_gRawData2[i]) & 0xFF; + + if (_gDataFlag2[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData2[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 1; // - : a negative number + } + + pDataLog[i*4+2+MAX_CHANNEL_NUM*4] = nHighByte; + pDataLog[i*4+3+MAX_CHANNEL_NUM*4] = nLowByte; + } + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData3[i] >> 8) & 0xFF; + nLowByte = (_gRawData3[i]) & 0xFF; + + if (_gDataFlag3[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*8] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*8] = 0; // indicate it is a non-use channel number + } + + if (_gRawData3[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*8] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*8] = 1; // - : a negative number + } + + pDataLog[(i*4+2)+MAX_CHANNEL_NUM*8] = nHighByte; + pDataLog[(i*4+3)+MAX_CHANNEL_NUM*8] = nLowByte; + } + + if (_gIsEnable2R) + { + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData4[i] >> 8) & 0xFF; + nLowByte = (_gRawData4[i]) & 0xFF; + + if (_gDataFlag4[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*12] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*12] = 0; // indicate it is a non-use channel number + } + + if (_gRawData4[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*12] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*12] = 1; // - : a negative number + } + + pDataLog[(i*4+2)+MAX_CHANNEL_NUM*12] = nHighByte; + pDataLog[(i*4+3)+MAX_CHANNEL_NUM*12] = nLowByte; + } + } + + *pLength = MAX_CHANNEL_NUM*16; + } + else + { + DBG("*** Undefined MP Test Mode ***\n"); + } +} + +void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode) +{ + DBG("*** %s() ***\n", __func__); + + if (_gIsInMpTest == 0) + { + DBG("ctp mp test start\n"); + + _gItoTestMode = eItoTestMode; + _gIsInMpTest = 1; + _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT; + _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING; + + queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork); + } +} + +void DrvMpTestCreateMpTestWorkQueue(void) +{ + DBG("*** %s() ***\n", __func__); + + _gCtpMpTestWorkQueue = create_singlethread_workqueue("ctp_mp_test"); + INIT_WORK(&_gCtpItoTestWork, _DrvMpTestItoTestDoWork); +} + +#endif //CONFIG_ENABLE_ITO_MP_TEST \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h new file mode 100644 index 00000000..2dba1a7d --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_self_mp_test.h @@ -0,0 +1,99 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_mp_test.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_SELF_MP_TEST_H__ +#define __MSTAR_DRV_SELF_MP_TEST_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define CTP_MP_TEST_RETRY_COUNT (3) + + +#define OPEN_TEST_NON_BORDER_AREA_THRESHOLD (35) // range : 25~60 +#define OPEN_TEST_BORDER_AREA_THRESHOLD (40) // range : 25~60 + +#define SHORT_TEST_THRESHOLD (3500) + +#define MP_TEST_MODE_OPEN_TEST (0x01) +#define MP_TEST_MODE_SHORT_TEST (0x02) + +#define MAX_CHANNEL_NUM (48) + +#if defined(CONFIG_ENABLE_CHIP_MSG21XXA) +#define PIN_GUARD_RING (46) // For MSG21XXA +#define GPO_SETTING_SIZE (3) // For MSG21XXA +#elif defined(CONFIG_ENABLE_CHIP_MSG22XX) +#define RIU_BASE_ADDR (0) // For MSG22XX +#define RIU_WRITE_LENGTH (144) // For MSG22XX +#define CSUB_REF (0) //(18) // For MSG22XX +#define CSUB_REF_MAX (0x3F) // For MSG22XX +#endif + +#define REG_INTR_FIQ_MASK (0x04) +#define FIQ_E_FRAME_READY_MASK (1 << 8) + + +//#define PROC_MSG_ITO_TEST "msg-ito-test" +//#define PROC_ITO_TEST_DEBUG "debug" + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL VARIABLE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern void DrvMpTestCreateMpTestWorkQueue(void); +extern void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength); +extern void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount); +extern s32 DrvMpTestGetTestResult(void); +extern void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode); + +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#endif /* __MSTAR_DRV_SELF_MP_TEST_H__ */ \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_sprd.c b/drivers/input/touchscreen/msg2138/mstar_drv_sprd.c new file mode 100644 index 00000000..03c0ad7a --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_sprd.c @@ -0,0 +1,238 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_sprd.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mstar_drv_platform_interface.h" + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +#include +#include +#include + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ +//#define MSG_TP_IC_NAME "pixcir_ts" //"msg21xxA" or "msg22xx" or "msg26xxM" /* Please define the mstar touch ic name based on the mutual-capacitive ic or self capacitive ic that you are using */ +/*=============================================================*/ +// VARIABLE DEFINITION +/*=============================================================*/ + +struct i2c_client *g_I2cClient = NULL; +int TOUCH_SCREEN_X_MAX = 0; +int TOUCH_SCREEN_Y_MAX = 0; +int MS_TS_MSG_IC_GPIO_RST = 0; +int MS_TS_MSG_IC_GPIO_INT = 0; + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +struct regulator *g_ReguVdd = NULL; +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +#ifdef CONFIG_OF +static struct msg2138_ts_platform_data *pixcir_ts_parse_dt(struct device *dev) +{ + struct msg2138_ts_platform_data *pdata = NULL; + struct device_node *np = dev->of_node; + int ret; + + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct msg2138_ts_platform_data"); + return NULL; + } + pdata->reset_gpio_number = of_get_gpio(np, 0); + if(pdata->reset_gpio_number < 0){ + dev_err(dev, "fail to get reset_gpio_number\n"); + goto fail; + } + pdata->irq_gpio_number = of_get_gpio(np, 1); + if(pdata->irq_gpio_number < 0){ + dev_err(dev, "fail to get irq_gpio_number\n"); + goto fail; + } + ret = of_property_read_string(np, "vdd_name", &pdata->vdd_name); + if(ret){ + dev_err(dev, "fail to get vdd_name\n"); + goto fail; + } + ret = of_property_read_u32_array(np, "virtualkeys", &pdata->virtualkeys,12); + if(ret){ + dev_err(dev, "fail to get virtualkeys\n"); + goto fail; + } + ret = of_property_read_u32(np, "TP_MAX_X", &pdata->TP_MAX_X); + if(ret){ + dev_err(dev, "fail to get TP_MAX_X\n"); + goto fail; + } + ret = of_property_read_u32(np, "TP_MAX_Y", &pdata->TP_MAX_Y); + if(ret){ + dev_err(dev, "fail to get TP_MAX_Y\n"); + goto fail; + } + + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif + +/*=============================================================*/ +// FUNCTION DEFINITION +/*=============================================================*/ + +/* probe function is used for matching and initializing input device */ +static int /*__devinit*/ touch_driver_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct msg2138_ts_platform_data *pdata = client->dev.platform_data; + int err = 0, i = 0; + + DBG("*** %s ***\n", __FUNCTION__); + + if (client == NULL) + { + DBG("i2c client is NULL\n"); + return -1; + } + +#ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = pixcir_ts_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } else { + err = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } +#endif + + g_I2cClient = client; + MS_TS_MSG_IC_GPIO_RST = pdata->reset_gpio_number; + MS_TS_MSG_IC_GPIO_INT = pdata->irq_gpio_number; + TOUCH_SCREEN_X_MAX = pdata->TP_MAX_X; + TOUCH_SCREEN_Y_MAX = pdata->TP_MAX_Y; + + for(i=0; idev, pdata->vdd_name); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + return MsDrvInterfaceTouchDeviceProbe(g_I2cClient, id); +exit_alloc_platform_data_failed: + return err; +} + +/* remove function is triggered when the input device is removed from input sub-system */ +static int /*__devexit*/ touch_driver_remove(struct i2c_client *client) +{ + DBG("*** %s ***\n", __FUNCTION__); + + return MsDrvInterfaceTouchDeviceRemove(client); +} + +/* The I2C device list is used for matching I2C device and I2C device driver. */ +static const struct i2c_device_id touch_device_id[] = +{ + {MSG_TP_IC_NAME, MSG_TP_I2C_ADDR}, //SLAVE_I2C_ID_DWI2C + {}, /* should not omitted */ +}; + +MODULE_DEVICE_TABLE(i2c, touch_device_id); + +static const struct of_device_id msg2138_of_match[] = { + { .compatible = "Mstar,msg2138_ts", }, + { } +}; +MODULE_DEVICE_TABLE(of, msg2138_of_match); + +static struct i2c_driver touch_device_driver = +{ + .driver = { + .name = MSG_TP_IC_NAME, + .owner = THIS_MODULE, + .of_match_table = msg2138_of_match, + }, + .probe = touch_driver_probe, + .remove = touch_driver_remove, +/* .remove = __devexit_p(touch_driver_remove), */ + .id_table = touch_device_id, +}; + +static int /*__init*/ touch_driver_init(void) +{ + int ret; + + /* register driver */ + ret = i2c_add_driver(&touch_device_driver); + if (ret < 0) + { + DBG("add touch device driver i2c driver failed.\n"); + return -ENODEV; + } + DBG("add touch device driver i2c driver.\n"); + + return ret; +} + +static void /*__exit*/ touch_driver_exit(void) +{ + DBG("remove touch device driver i2c driver.\n"); + + i2c_del_driver(&touch_device_driver); +} + +module_init(touch_driver_init); +module_exit(touch_driver_exit); +MODULE_LICENSE("GPL"); \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c new file mode 100644 index 00000000..7a2b4738 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.c @@ -0,0 +1,405 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_utility_adaption.c + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include "mstar_drv_utility_adaption.h" + +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Constant +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Variables +//////////////////////////////////////////////////////////// +extern struct i2c_client *g_I2cClient; + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Implementation +//////////////////////////////////////////////////////////// + + +#ifdef CONFIG_ENABLE_DMA_IIC +#include +#include +#include +#include +#include +#include + +static unsigned char *I2CDMABuf_va = NULL; +static volatile unsigned int I2CDMABuf_pa = NULL; + +void DmaAlloc(void) +{ + if (NULL == I2CDMABuf_va) + { + I2CDMABuf_va = (u8 *)dma_alloc_coherent(NULL, 4096, &I2CDMABuf_pa, GFP_KERNEL); + } + + if (NULL == I2CDMABuf_va) + { + DBG("DrvCommonDmaAlloc FAILED!"); + } + else + { + DBG("DrvCommonDmaAlloc SUCCESS!"); + } +} + +void DmaFree(void) +{ + if (NULL != I2CDMABuf_va) + { + dma_free_coherent(NULL, 4096, I2CDMABuf_va, I2CDMABuf_pa); + I2CDMABuf_va = NULL; + I2CDMABuf_pa = 0; + } +} +#endif //CONFIG_ENABLE_DMA_IIC + +//------------------------------------------------------------------------------// + +u16 RegGet16BitValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF}; + u8 rx_data[2] = {0}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data[0], 2); + + return (rx_data[1] << 8 | rx_data[0]); +} + +u8 RegGetLByteValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF}; + u8 rx_data = {0}; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data, 1); + + return (rx_data); +} + +u8 RegGetHByteValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, (nAddr & 0xFF) + 1}; + u8 rx_data = {0}; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data, 1); + + return (rx_data); +} + +void RegSet16BitValue(u16 nAddr, u16 nData) +{ + u8 tx_data[5] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF, nData & 0xFF, nData >> 8}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 5); +} + +void RegSetLByteValue(u16 nAddr, u8 nData) +{ + u8 tx_data[4] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF, nData}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 4); +} + +void RegSetHByteValue(u16 nAddr, u8 nData) +{ + u8 tx_data[4] = {0x10, (nAddr >> 8) & 0xFF, (nAddr & 0xFF) + 1, nData}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 4); +} + +void RegSet16BitValueOn(u16 nAddr, u16 nData) //Set bit on nData from 0 to 1 +{ + u16 rData = RegGet16BitValue(nAddr); + rData |= nData; + RegSet16BitValue(nAddr, rData); +} + +void RegSet16BitValueOff(u16 nAddr, u16 nData) //Set bit on nData from 1 to 0 +{ + u16 rData = RegGet16BitValue(nAddr); + rData &= (~nData); + RegSet16BitValue(nAddr, rData); +} + +void DbBusEnterSerialDebugMode(void) +{ + u8 data[5]; + + // Enter the Serial Debug Mode + data[0] = 0x53; + data[1] = 0x45; + data[2] = 0x52; + data[3] = 0x44; + data[4] = 0x42; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 5); +} + +void DbBusExitSerialDebugMode(void) +{ + u8 data[1]; + + // Exit the Serial Debug Mode + data[0] = 0x45; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); + + // Delay some interval to guard the next transaction +// udelay(200); // delay about 0.2ms +} + +void DbBusIICUseBus(void) +{ + u8 data[1]; + + // IIC Use Bus + data[0] = 0x35; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusIICNotUseBus(void) +{ + u8 data[1]; + + // IIC Not Use Bus + data[0] = 0x34; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusIICReshape(void) +{ + u8 data[1]; + + // IIC Re-shape + data[0] = 0x71; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusStopMCU(void) +{ + u8 data[1]; + + // Stop the MCU + data[0] = 0x37; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusNotStopMCU(void) +{ + u8 data[1]; + + // Not Stop the MCU + data[0] = 0x36; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +s32 IicWriteData(u8 nSlaveId, u8* pBuf, u16 nSize) +{ + s32 rc = 0; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + struct i2c_msg msgs[] = + { + { + .addr = nSlaveId, + .flags = 0, // if read flag is undefined, then it means write flag. + .len = nSize, + .buf = pBuf, + }, + }; + + /* If everything went ok (i.e. 1 msg transmitted), return #bytes + transmitted, else error code. */ + if (g_I2cClient != NULL) + { + rc = i2c_transfer(g_I2cClient->adapter, msgs, 1); + if (rc < 0) + { + PRINTF_ERR("IicWriteData() error %d\n", rc); + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_I2cClient != NULL) + { + u8 nAddrBefore = g_I2cClient->addr; + g_I2cClient->addr = nSlaveId; +// g_I2cClient->addr = (g_I2cClient->addr & I2C_MASK_FLAG ) | (I2C_ENEXT_FLAG); + +#ifdef CONFIG_ENABLE_DMA_IIC + if (nSize > 8 && NULL != I2CDMABuf_va) + { + s32 i = 0; + + for (i = 0; i < nSize; i ++) + { + I2CDMABuf_va[i] = pBuf[i]; + } + g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG; + rc = i2c_master_send(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nSize); + } + else + { + g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG); + rc = i2c_master_send(g_I2cClient, pBuf, nSize); + } +#else + rc = i2c_master_send(g_I2cClient, pBuf, nSize); +#endif //CONFIG_ENABLE_DMA_IIC + g_I2cClient->addr = nAddrBefore; + + if (rc < 0) + { + PRINTF_ERR("IicWriteData() error %d, nSlaveId=%d, nSize=%d\n", rc, nSlaveId, nSize); + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#endif + + return rc; +} + +s32 IicReadData(u8 nSlaveId, u8* pBuf, u16 nSize) +{ + s32 rc = 0; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + struct i2c_msg msgs[] = + { + { + .addr = nSlaveId, + .flags = I2C_M_RD, // read flag + .len = nSize, + .buf = pBuf, + }, + }; + + /* If everything went ok (i.e. 1 msg transmitted), return #bytes + transmitted, else error code. */ + if (g_I2cClient != NULL) + { + rc = i2c_transfer(g_I2cClient->adapter, msgs, 1); + if (rc < 0) + { + PRINTF_ERR("IicReadData() error %d\n", rc); + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_I2cClient != NULL) + { + u8 nAddrBefore = g_I2cClient->addr; + g_I2cClient->addr = nSlaveId; +// g_I2cClient->addr = (g_I2cClient->addr & I2C_MASK_FLAG) | (I2C_ENEXT_FLAG); + +#ifdef CONFIG_ENABLE_DMA_IIC + if (nSize > 8 && NULL != I2CDMABuf_va) + { + s32 i = 0; + + g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG; + rc = i2c_master_recv(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nSize); + + for (i = 0; i < nSize; i ++) + { + pBuf[i] = I2CDMABuf_va[i]; + } + } + else + { + g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG); + rc = i2c_master_recv(g_I2cClient, pBuf, nSize); + } +#else + rc = i2c_master_recv(g_I2cClient, pBuf, nSize); +#endif //CONFIG_ENABLE_DMA_IIC + g_I2cClient->addr = nAddrBefore; + + if (rc < 0) + { + PRINTF_ERR("IicReadData() error %d, nSlaveId=%d, nSize=%d\n", rc, nSlaveId, nSize); + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#endif + + return rc; +} + +void mstpMemSet(void *pDst, s8 nVal, u32 nSize) +{ + memset(pDst, nVal, nSize); +} + +void mstpMemCopy(void *pDst, void *pSource, u32 nSize) +{ + memcpy(pDst, pSource, nSize); +} + +void mstpDelay(u32 nTime) +{ + mdelay(nTime); +} + +//------------------------------------------------------------------------------// diff --git a/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h new file mode 100644 index 00000000..5e729569 --- /dev/null +++ b/drivers/input/touchscreen/msg2138/mstar_drv_utility_adaption.h @@ -0,0 +1,101 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_utility_adaption.h + * + * @brief This file defines the interface of touch screen + * + * @version v2.2.0.0 + * + */ + +#ifndef __MSTAR_DRV_UTILITY_ADAPTION_H__ +#define __MSTAR_DRV_UTILITY_ADAPTION_H__ (1) + + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// + +#include "mstar_drv_common.h" + +//////////////////////////////////////////////////////////// +/// Constant +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Variables +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// +#define BK_REG8_WL(addr,val) ( RegSetLByteValue( addr, val ) ) +#define BK_REG8_WH(addr,val) ( RegSetHByteValue( addr, val ) ) +#define BK_REG16_W(addr,val) ( RegSet16BitValue( addr, val ) ) +#define BK_REG8_RL(addr) ( RegGetLByteValue( addr ) ) +#define BK_REG8_RH(addr) ( RegGetHByteValue( addr ) ) +#define BK_REG16_R(addr) ( RegGet16BitValue( addr ) ) + +#define PRINTF_EMERG(fmt, ...) printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_ALERT(fmt, ...) printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_CRIT(fmt, ...) printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_ERR(fmt, ...) printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_WARN(fmt, ...) printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_NOTICE(fmt, ...) printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_INFO(fmt, ...) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_DEBUG(fmt, ...) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + +#ifdef CONFIG_ENABLE_DMA_IIC +extern void DmaAlloc(void); +extern void DmaFree(void); +#endif //CONFIG_ENABLE_DMA_IIC +extern u16 RegGet16BitValue(u16 nAddr); +extern u8 RegGetLByteValue(u16 nAddr); +extern u8 RegGetHByteValue(u16 nAddr); +extern void RegSet16BitValue(u16 nAddr, u16 nData); +extern void RegSetLByteValue(u16 nAddr, u8 nData); +extern void RegSetHByteValue(u16 nAddr, u8 nData); +extern void RegSet16BitValueOn(u16 nAddr, u16 nData); +extern void RegSet16BitValueOff(u16 nAddr, u16 nData); +extern void DbBusEnterSerialDebugMode(void); +extern void DbBusExitSerialDebugMode(void); +extern void DbBusIICUseBus(void); +extern void DbBusIICNotUseBus(void); +extern void DbBusIICReshape(void); +extern void DbBusStopMCU(void); +extern void DbBusNotStopMCU(void); +extern s32 IicWriteData(u8 nSlaveId, u8* pBuf, u16 nSize); +extern s32 IicReadData(u8 nSlaveId, u8* pBuf, u16 nSize); +extern void mstpMemSet(void *pDst, s8 nVal, u32 nSize); +extern void mstpMemCopy(void *pDst, void *pSource, u32 nSize); +extern void mstpDelay(u32 nTime); + +#endif // __MSTAR_DRV_UTILITY_ADAPTION_H__ diff --git a/drivers/input/touchscreen/msg2233/Makefile b/drivers/input/touchscreen/msg2233/Makefile new file mode 100644 index 00000000..3d778e5b --- /dev/null +++ b/drivers/input/touchscreen/msg2233/Makefile @@ -0,0 +1,20 @@ +# +# Makefile for the input core drivers. +# + +# Each configuration option enables a list of files. +obj-y += mstar_drv_sprd.o \ + mstar_drv_common.o \ + mstar_drv_ic_fw_porting_layer.o \ + mstar_drv_main.o \ + mstar_drv_platform_interface.o \ + mstar_drv_platform_porting_layer.o \ + mstar_drv_self_fw_control.o \ + mstar_drv_utility_adaption.o \ + mstar_drv_hotknot.o \ + mstar_drv_hotknot_queue.o \ + mstar_drv_jni_interface.o \ + mstar_drv_mutual_fw_control.o \ + mstar_drv_mutual_mp_test.o \ + mstar_drv_self_mp_test.o \ +# end diff --git a/drivers/input/touchscreen/msg2233/msg21xxa_xxxx_update_bin.h b/drivers/input/touchscreen/msg2233/msg21xxa_xxxx_update_bin.h new file mode 100755 index 00000000..960c4716 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/msg21xxa_xxxx_update_bin.h @@ -0,0 +1,3106 @@ +u8 msg21xxa_xxxx_update_bin[49664]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xD3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xC5,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x1C,0x40,0x00,0x1C, +0x60,0x00,0x1C,0x80,0x00,0x1C,0xA0,0x00,0x1C,0xC0,0x00,0x1C,0xE0,0x00,0x1D,0x00, +0x00,0x1D,0x20,0x00,0x1D,0x40,0x00,0x1D,0x60,0x00,0x1D,0x80,0x00,0x1D,0xA0,0x00, +0x1D,0xC0,0x00,0x1D,0xE0,0x00,0x1E,0x00,0x00,0x1E,0x20,0x00,0x1E,0x40,0x00,0x1E, +0x60,0x00,0x1E,0x80,0x00,0x1E,0xA0,0x00,0x1E,0xC0,0x00,0x1E,0xE0,0x00,0x1F,0x00, +0x00,0x1F,0x20,0x00,0x1F,0x40,0x00,0x1F,0x60,0x00,0x1F,0x80,0x00,0x1F,0xA0,0x00, +0x1F,0xC0,0x00,0x1F,0xE0,0x00,0xC0,0x60,0x00,0x01,0xC8,0x63,0xAC,0x04,0x84,0x69, +0x80,0x01,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00, +0xFC,0x21,0xFF,0x60,0xEF,0xE1,0x00,0x80,0xFF,0xE1,0x00,0xA0,0x0F,0xE1,0x08,0xC3, +0xE0,0x02,0x0F,0x0F,0xE1,0x00,0xC3,0xE0,0x04,0x0F,0x0F,0xE1,0x04,0xC3,0xE0,0x03, +0x0F,0xEF,0xE1,0x00,0x84,0xC3,0xE0,0x05,0x0F,0xEF,0xE1,0x00,0x88,0xC3,0xE0,0x05, +0x1F,0xEF,0xE1,0x00,0x8C,0xE4,0x01,0x53,0x41,0x90,0x00,0x90,0x00,0x90,0x00,0x90, +0x00,0x90,0x00,0x90,0x00,0x90,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x30,0x44,0x0B, +0x17,0x01,0x98,0x60,0x56,0xF8,0x01,0x4F,0x18,0x79,0x22,0xE0,0x14,0x98,0x62,0x23, +0x00,0x18,0x58,0x77,0x01,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0C,0x81,0x04,0x0D, +0x21,0x0C,0x5D,0x43,0x00,0xE7,0xFF,0xFF,0xA4,0x0C,0x81,0x06,0x5C,0x63,0x00,0x20, +0x60,0x66,0x9B,0x00,0x21,0x40,0x30,0x21,0x44,0x24,0x5D,0x40,0x41,0x4B,0x01,0x01, +0xD0,0x81,0x04,0x66,0xE4,0x00,0x01,0x17,0xE7,0xFF,0xFF,0x5E,0x5C,0x63,0x00,0x20, +0x64,0x4E,0xD1,0x40,0x05,0xD2,0xD1,0x41,0x05,0xB2,0xD1,0x42,0x05,0x96,0xE4,0x00, +0x00,0xE3,0xE7,0xFF,0xFF,0x2A,0x5C,0x63,0x00,0xD0,0x62,0x05,0x1E,0x9B,0x01,0x21, +0x40,0x24,0x5D,0x40,0x21,0x4B,0x01,0x01,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00, +0xCB,0x57,0x23,0x78,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01, +0xCB,0x57,0x23,0x6C,0x0B,0x7A,0x01,0xC7,0x7B,0x8F,0xFF,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xD4,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xE0,0x0B,0x7A,0x01,0xC7,0x7B,0x7F,0xFF,0x0F,0x7A,0x01,0xCA,0xF7,0x3C,0xEC, +0x0B,0x57,0x01,0x47,0x39,0xD5,0x5F,0x39,0x04,0x0F,0x37,0x01,0x23,0x01,0x00,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x3D,0xE8,0x0B,0x38,0x01,0xFF,0x20,0x11,0x11,0x0F,0x38, +0x01,0xCB,0x17,0x3D,0xEC,0x0B,0x38,0x01,0xFF,0x20,0x22,0x22,0x0F,0x38,0x01,0xCB, +0x17,0x3D,0xF0,0x0B,0x38,0x01,0xFF,0x20,0x33,0x33,0x0F,0x38,0x01,0xCA,0xF7,0x78, +0xC0,0xFF,0x00,0xAA,0x55,0x0F,0x17,0x01,0xE4,0x00,0x00,0x01,0x0D,0x41,0x0A,0x0D, +0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x03,0xF0,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x03,0xE8,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x03,0xEC,0xC2, +0xE0,0x10,0x01,0xEC,0xD7,0x04,0x04,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x03,0xFC,0xC2, +0xE0,0x10,0x01,0x0F,0x01,0x02,0xED,0x17,0x04,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x04,0x10,0xC2,0xE0,0x10,0x01,0x0F,0x01,0x06,0xEF,0x17,0x03,0xD4,0xC2,0xE0,0x10, +0x01,0x0F,0x01,0x0A,0xEF,0x17,0x03,0xF4,0x85,0x29,0x5C,0x84,0x00,0xC2,0xE0,0x10, +0x01,0x4C,0x84,0x10,0xFE,0xF7,0x04,0x08,0x8E,0xE4,0x0C,0x77,0x00,0x85,0x29,0x5C, +0x63,0x00,0x9B,0x00,0x24,0x68,0x25,0x1F,0x03,0xFE,0x5F,0x18,0x00,0xC2,0xE0,0x10, +0x01,0xF3,0x57,0x0B,0x1E,0x1E,0xE3,0x01,0x1F,0x9A,0xFF,0x5F,0x3C,0x00,0xD7,0x97, +0x00,0x50,0x1F,0x23,0x02,0x5F,0x39,0x00,0xC2,0xEF,0xFF,0xE1,0xCA,0xF7,0xFF,0xFF, +0xE4,0x00,0x00,0x2F,0x4F,0x78,0x10,0x9F,0x01,0x8F,0x64,0x5F,0x18,0x00,0x0F,0x7B, +0x02,0x5E,0xFB,0x15,0x4A,0xF7,0xD8,0xD7,0x19,0xFF,0x69,0x4F,0x03,0x10,0xC3,0x20, +0x10,0x01,0x8F,0x04,0xEF,0x39,0x03,0xF6,0x0F,0x18,0x02,0xD7,0x38,0x01,0x41,0xC3, +0x20,0x10,0x01,0xEF,0x79,0x03,0xF2,0xC3,0x20,0x10,0x01,0xEF,0xB9,0x03,0xEA,0xC3, +0x20,0x10,0x01,0xEF,0xD9,0x03,0xEE,0xC3,0x20,0x10,0x01,0xEF,0x39,0x04,0x06,0xE4, +0x00,0x00,0x49,0xC3,0x20,0x10,0x01,0xEF,0x79,0x03,0xFE,0xC3,0x20,0x10,0x01,0xEF, +0xB9,0x04,0x02,0xC3,0x20,0x10,0x01,0xEF,0xD9,0x04,0x12,0xC3,0x20,0x10,0x01,0xEF, +0x39,0x03,0xD6,0x20,0x60,0xDE,0x0F,0x44,0x02,0x0F,0x84,0x06,0xCF,0x5A,0x00,0x32, +0x40,0xE7,0xE3,0xD7,0x47,0x05,0xDC,0x42,0xF7,0x2D,0x40,0xA5,0xCB,0x43,0x77,0xDB, +0x43,0x3B,0x2C,0xCC,0xC6,0x00,0x0A,0x9B,0x4A,0x8C,0xD9,0x98,0x61,0x40,0xC6,0xD0, +0xD7,0x06,0x04,0xF4,0x98,0x60,0xE4,0x00,0x01,0x31,0x20,0x64,0x6A,0x0F,0x44,0x02, +0x0F,0x64,0x06,0xCF,0x5A,0x00,0x32,0x40,0xE7,0xDB,0x98,0x60,0xD7,0x47,0x04,0x14, +0xE4,0x00,0x00,0x55,0x1C,0xFA,0xFE,0xD4,0x67,0x01,0x9E,0x4C,0x63,0x10,0x9F,0x5F, +0x4F,0x5A,0x10,0x8F,0x44,0x8C,0x83,0x0F,0x5A,0x02,0x0F,0x64,0x02,0xCF,0x5A,0x00, +0x32,0x41,0x08,0xDB,0x98,0x60,0xD7,0x48,0x02,0xC4,0x42,0xF7,0x2D,0x40,0xA5,0xCB, +0x43,0xB7,0xEB,0x43,0x3D,0x2C,0xE7,0xFF,0xFF,0x3B,0xD4,0x7C,0x01,0x3E,0x9F,0x5F, +0x4C,0xE7,0x10,0x4F,0x5A,0x10,0x98,0x60,0x8F,0x44,0x8C,0x87,0x0F,0x5A,0x02,0x0F, +0x84,0x02,0xCF,0x5A,0x00,0x32,0x41,0x08,0xE3,0xD7,0x48,0x01,0x2C,0xE7,0xFF,0xFE, +0xD5,0x42,0xF7,0x2D,0xCC,0xC6,0x00,0x0A,0x43,0xD7,0xF3,0x40,0xA5,0xCB,0x9B,0x4A, +0x43,0x3E,0x2C,0x8C,0xD9,0x40,0xC6,0xD0,0xD7,0x06,0xFB,0x60,0x98,0x61,0x85,0x29, +0xC2,0xE0,0x10,0x01,0x9B,0x21,0xEA,0xF7,0x01,0x79,0x9E,0xFF,0x5E,0xF7,0x04,0x26, +0xE4,0x43,0xC3,0x18,0x00,0x21,0xFF,0x18,0xB6,0xF8,0x8E,0xF8,0x13,0x37,0x00,0xC3, +0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x0B,0x1A,0xFE,0xF7,0x09,0x0C,0xD0, +0x60,0x05,0x16,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43,0xDE, +0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B,0x40, +0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7,0x08, +0xBD,0x01,0x40,0xB9,0x2B,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08,0x5F, +0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x01,0x43,0xB9,0xEB,0x0F,0xBC,0x01,0xE4,0x00,0x00, +0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF,0xAC, +0x0B,0x37,0x02,0x0B,0x57,0x00,0x8F,0x59,0xC3,0x20,0x10,0x01,0xFF,0x39,0x09,0xBC, +0x0F,0x59,0x00,0x13,0x58,0x04,0x1F,0xBA,0xFF,0x4F,0xBD,0x10,0x43,0xDD,0xCC,0x8F, +0xB7,0x4F,0x9A,0x08,0x09,0x1D,0x00,0x1F,0x7C,0xFF,0x4F,0xBB,0x08,0x8F,0xB7,0x0B, +0xBD,0x00,0x8F,0xA8,0x0F,0xBE,0x00,0x13,0x18,0x01,0x27,0x05,0xAF,0xE4,0x00,0x01, +0x45,0x20,0x66,0xFE,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43, +0xDE,0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B, +0x40,0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7, +0x08,0xBD,0x00,0x40,0xA5,0xC8,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08, +0x5F,0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x00,0x43,0xBD,0xC8,0x0F,0xBC,0x01,0xE4,0x00, +0x00,0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF, +0xAC,0xE7,0xFF,0xFE,0xBF,0x4F,0x1A,0x10,0x9F,0x81,0x43,0x58,0xCC,0x43,0xB8,0xBC, +0x4F,0x9C,0x08,0x0B,0xBD,0x00,0x8F,0x97,0x0B,0x9C,0x00,0x8F,0x9D,0x0F,0x9A,0x00, +0x4F,0x7B,0x10,0x1F,0x58,0xFE,0x8F,0x3B,0x4F,0x5A,0x08,0x9F,0x1F,0x8F,0x57,0x4F, +0x18,0x08,0x0B,0x5A,0x00,0x8E,0xF8,0x0A,0xF7,0x00,0x8E,0xFA,0x0E,0xF9,0x00,0x85, +0x29,0x5C,0xE7,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x0B,0x1E,0x42,0xE7,0xBB,0x5E, +0xF7,0x00,0x9B,0x00,0x8C,0xB7,0x8C,0xD7,0xC3,0x80,0x10,0x01,0xC3,0x40,0x10,0x01, +0x5C,0xC6,0x00,0x5C,0xA5,0x00,0x8B,0x38,0x9A,0xE0,0xFF,0x9C,0x09,0xBC,0xFF,0x5A, +0x09,0x0C,0xE4,0x00,0x00,0x49,0x4F,0x65,0x10,0x43,0xBB,0xE4,0x0F,0xBD,0x02,0x9C, +0xA1,0x8E,0xFD,0x5C,0xA5,0x00,0x8B,0xBB,0x8F,0x7A,0x8F,0xBA,0x0B,0x7B,0x00,0x0B, +0xBD,0x02,0x8F,0x1B,0x8F,0x3D,0xD4,0xA6,0xFF,0x01,0x26,0xE0,0xE8,0x27,0x20,0xDC, +0x27,0x00,0xD0,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x04,0x08,0x4C,0xE7,0x10,0xCF,0x18, +0xFF,0xF6,0x8C,0xFA,0x0F,0x47,0x02,0x43,0x3A,0xCB,0x9F,0x56,0x8F,0x19,0x43,0x58, +0xD0,0xCF,0x5A,0x07,0xFF,0x43,0x5A,0xB8,0x0F,0x43,0x01,0x0E,0xE4,0x00,0x98,0x61, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x85,0x29,0x9A,0xE3,0x9B,0x01,0xE4,0x00,0x00,0x11, +0x8F,0x17,0x9E,0xE2,0xD7,0x03,0xFF,0xE1,0x4C,0x77,0x09,0x9C,0x7F,0x85,0x29,0xFF, +0x00,0x7F,0xFF,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x03,0xD8,0x0F,0x17,0x01,0x0F,0x17, +0x03,0x0F,0x17,0x05,0x0F,0x17,0x07,0x0F,0x17,0x09,0x0F,0x17,0x0B,0x85,0x29,0xC3, +0x00,0x10,0x01,0xFE,0xF8,0x03,0xD8,0xC3,0x00,0x10,0x01,0x0B,0x37,0x08,0xFF,0x18, +0x0B,0x90,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x05,0x0F,0x37,0x09,0x0B, +0x37,0x07,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x09,0x0B,0x38,0x19,0x0F, +0x37,0x0B,0x0B,0x37,0x04,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x01,0x0F, +0x37,0x05,0x0B,0x37,0x03,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x05,0x0B, +0x38,0x19,0x0F,0x37,0x07,0x0B,0x38,0x17,0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17, +0x03,0x85,0x29,0x1C,0x21,0xD8,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x24,0x0D,0x41,0x20, +0x0D,0x61,0x1C,0xFD,0x57,0x03,0xD8,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x0D,0xC1,0x10, +0x09,0xAA,0x07,0x0B,0x0A,0x03,0x43,0x18,0x6D,0x5F,0x18,0x06,0x0F,0x01,0x0B,0x43, +0x18,0xC3,0xE9,0x97,0x03,0xD9,0x09,0xCA,0x05,0x41,0x8C,0x75,0x5D,0x8C,0x06,0x40, +0x6C,0x63,0x8C,0x78,0xE7,0xFF,0xFE,0x48,0x0A,0xEA,0x09,0x41,0xCE,0xBD,0x0A,0xEA, +0x0B,0x42,0xED,0xBD,0x5E,0xF7,0x06,0x0E,0xE1,0x0F,0x42,0xF7,0xBB,0x5D,0x63,0x06, +0x5D,0x4E,0x06,0x40,0x6A,0x53,0x8C,0x77,0xE7,0xFF,0xFE,0x00,0x5E,0xE3,0x06,0x98, +0x61,0x21,0x60,0xAC,0x22,0xE0,0xA0,0x43,0x0B,0xB8,0xD3,0x05,0x01,0x14,0x41,0x4C, +0x53,0x0B,0x01,0x0E,0x09,0x81,0x0A,0x41,0x6B,0xBB,0x43,0x0C,0xC3,0x8D,0x58,0xCD, +0x4A,0x00,0x64,0x42,0xEA,0x58,0x5E,0xE8,0xB1,0x48,0x61,0x01,0x0D,0xC1,0x12,0x0D, +0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21, +0x28,0x85,0x29,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0x0D,0x61,0x0C, +0x0D,0x81,0x08,0x0D,0xC1,0x00,0xF1,0x97,0x08,0x72,0xC1,0x40,0x10,0x01,0x1D,0x6C, +0xFF,0x0D,0x21,0x14,0x0D,0xA1,0x04,0x5D,0xC3,0x00,0x5D,0x6B,0x00,0xFD,0x4A,0x0B, +0x90,0x4E,0xEE,0x5D,0x56,0xF7,0x01,0x22,0xE0,0xD4,0x8A,0xEB,0xE4,0x00,0x00,0x43, +0xCC,0x77,0x00,0x30,0x1D,0xB7,0x01,0x8C,0x6A,0xCC,0x8D,0x00,0x30,0x9C,0x64,0x8C, +0x8A,0x50,0xA0,0x30,0x9C,0x84,0xE4,0x00,0x67,0xF4,0x5E,0xED,0x00,0xD5,0x97,0xFF, +0x1D,0x12,0xEA,0x00,0x22,0xE0,0x20,0x9E,0xFF,0x1A,0xEA,0x00,0x21,0x60,0x30,0x9D, +0x7F,0x5D,0x6B,0x00,0xE7,0xFF,0xFF,0x7B,0x12,0xEA,0x00,0x22,0xE0,0x52,0xC2,0xE0, +0x10,0x01,0x9B,0x37,0xEB,0x17,0x08,0x87,0x47,0x18,0xCC,0xEF,0x17,0x08,0x87,0x0D, +0xC1,0x02,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21, +0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xEB,0x37, +0x01,0x78,0xFF,0x18,0x04,0x1C,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x23,0x24, +0xA6,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F,0x4F,0x57,0x08,0x1F, +0x77,0xFF,0x8F,0x58,0x4F,0x7B,0x10,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6, +0xF9,0xFF,0x68,0xE4,0x00,0x00,0x9D,0x23,0x28,0x38,0x13,0x37,0x04,0x9A,0xE0,0x9F, +0x21,0xE4,0x00,0x00,0x79,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F, +0x4F,0x57,0x08,0xCF,0x77,0x00,0x06,0x8F,0x58,0x9F,0x79,0x9E,0xE1,0x0F,0x7A,0x01, +0x5E,0xF7,0x00,0xD6,0xF9,0xFF,0x68,0xE4,0x00,0x00,0x35,0x4F,0x57,0x08,0x4F,0x77, +0x08,0x8F,0x58,0x9F,0x7F,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6,0xF9,0xFF, +0x70,0x85,0x29,0x9C,0x30,0x5C,0xC6,0x00,0x0D,0x61,0x08,0x0D,0x81,0x04,0x0D,0xA1, +0x00,0x0D,0x41,0x0C,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x1A,0x13,0xD8,0x04,0x40, +0xC6,0xF3,0x5E,0xE6,0x00,0x5F,0xA3,0x06,0x8C,0x97,0x8C,0xB7,0x5F,0x7D,0x04,0x0A, +0xF8,0x0B,0x11,0x58,0x0C,0x40,0xFB,0xBC,0x41,0x9B,0xBD,0xC1,0xA0,0x10,0x01,0xC3, +0x00,0x10,0x01,0x5C,0xA5,0x00,0x4D,0x77,0x08,0x5C,0xE7,0x04,0x5D,0x8C,0x04,0x5C, +0x84,0x00,0xFD,0xAD,0x04,0x1C,0xFF,0x18,0x09,0x0C,0x53,0x20,0x64,0xE4,0x00,0x01, +0x21,0x43,0x44,0x35,0x9F,0x41,0x4F,0x5A,0x08,0x8F,0x4D,0x09,0x1A,0x00,0x41,0x08, +0xBB,0x41,0x08,0x50,0x5F,0x88,0x04,0x43,0x5C,0xDD,0x5F,0x5A,0x06,0x4C,0x7A,0xFA, +0x47,0x43,0xD6,0x43,0x5A,0x1D,0xD6,0xFA,0x03,0x14,0xD5,0x7A,0x02,0x70,0x5D,0x08, +0x06,0xD5,0x1D,0x00,0x58,0x43,0x9C,0x3D,0xE4,0x00,0x00,0x0F,0x43,0x8C,0xE5,0x5F, +0x9C,0x06,0x4F,0x44,0x10,0x43,0x97,0xE5,0x8F,0x58,0xCF,0x9C,0x00,0x64,0x09,0x1A, +0x00,0x43,0x9C,0xB8,0xC7,0x9C,0xFF,0xFF,0x41,0x1C,0x43,0x41,0x08,0xC8,0x0D,0x1A, +0x01,0x4F,0x44,0x10,0x9F,0x42,0x8F,0x58,0x09,0x1A,0x00,0x43,0x9C,0x43,0x43,0x9C, +0xC8,0x0F,0x9A,0x01,0xE4,0x00,0x00,0x29,0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x01, +0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x03,0x9C,0x81,0x5C,0x84,0x00,0xD4,0x85,0xFB, +0xA0,0xC2,0xE0,0x10,0x01,0x0D,0xA1,0x02,0xF0,0x77,0x0B,0x1B,0x0D,0x81,0x06,0x0D, +0x61,0x0A,0x0D,0x41,0x0E,0x40,0x7E,0x1B,0x1C,0x21,0x10,0xE4,0x00,0xC1,0x25,0x5C, +0x63,0x00,0x5C,0x84,0x00,0xC2,0xE0,0x10,0x01,0x43,0x64,0x1D,0xF2,0xF7,0x0B,0x1E, +0x9F,0x61,0x40,0xA5,0xBB,0x5F,0x7B,0x00,0x5C,0xA5,0x00,0x20,0xE4,0x3E,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x0C,0xD0,0xE4,0x00,0x00,0x19,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x09,0x0C,0x43,0x23,0x2C,0x9B,0x00,0x4F,0x39,0x10,0x9F,0x22,0x8F,0x37,0xC2,0xEF, +0xFF,0xE1,0xCA,0xF7,0xFF,0xFF,0xE4,0x00,0x00,0x3D,0x0B,0x99,0xFE,0x0B,0x59,0x00, +0x9F,0x24,0x8F,0x5C,0x4F,0x98,0x10,0x5E,0xFA,0x15,0x8F,0x86,0x4A,0xF7,0xD0,0x0F, +0x5C,0x00,0x9F,0x01,0x5F,0x58,0x00,0xD7,0x7A,0xFF,0x1D,0x9B,0x00,0xE4,0x00,0x00, +0x29,0x0F,0x26,0x02,0x9F,0x01,0x43,0x39,0xBD,0x5F,0x18,0x00,0x0F,0x26,0x00,0x9C, +0xC4,0xD7,0x78,0xFF,0x85,0x85,0x29,0x1C,0x21,0x88,0x0D,0x41,0x70,0x0D,0x61,0x6C, +0x5D,0x44,0x00,0x0D,0x81,0x68,0x5C,0x85,0x00,0x0D,0xA1,0x64,0x88,0xA6,0x41,0xA4, +0x55,0x0D,0x21,0x74,0x89,0x83,0x88,0xC1,0x88,0x6A,0xE7,0xFF,0xFE,0xAA,0xC2,0xE0, +0x10,0x01,0x9D,0xA1,0xEB,0x57,0x01,0x78,0x9B,0x20,0x5D,0xAD,0x00,0x8B,0x19,0x9A, +0xE0,0x89,0x61,0xE4,0x00,0x00,0x5B,0x4F,0x79,0x10,0x43,0x99,0x54,0x8F,0x6B,0x0F, +0x7B,0x02,0x8E,0xFB,0x23,0x44,0x54,0x23,0x48,0x36,0xCF,0x9C,0x00,0x06,0x9F,0x9F, +0xE4,0x00,0x00,0x13,0x4F,0x9C,0x08,0x9F,0x81,0x43,0x7C,0xDB,0x9F,0x21,0x8F,0x1B, +0x5F,0x79,0x00,0xD5,0xBB,0xFE,0xA5,0x26,0xE1,0x34,0xC3,0x20,0x10,0x01,0xEB,0x39, +0x0B,0x25,0x43,0x18,0xCB,0x23,0x44,0x32,0x4F,0x37,0x0A,0x8F,0x19,0xE4,0x00,0x00, +0x35,0x23,0x48,0x46,0xCF,0x37,0x00,0x03,0xCE,0xF7,0x00,0x06,0x8F,0x19,0xE4,0x00, +0x00,0x13,0x8F,0x17,0x4E,0xF7,0x08,0x42,0xF8,0xB8,0xC2,0xE0,0xFF,0xE8,0xCB,0x00, +0x07,0xFF,0x98,0x61,0x4A,0xF7,0xC0,0x5E,0xFF,0xF9,0x4A,0xF7,0x00,0x0E,0xEC,0x01, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1,0x66,0x0D,0x81,0x6A,0x0D,0x61,0x6E,0x0D, +0x41,0x72,0x0D,0x21,0x76,0x1C,0x21,0x78,0x85,0x29,0xFC,0x21,0xFF,0x78,0xED,0x41, +0x00,0x80,0x0D,0x81,0x78,0x0D,0xA1,0x74,0x0D,0xC1,0x70,0x0D,0xE1,0x6C,0x0E,0x01, +0x68,0x0E,0xC1,0x64,0xED,0x21,0x00,0x84,0x0D,0x61,0x7C,0xC1,0x40,0x10,0x01,0xFD, +0x4A,0x0B,0x1A,0x11,0x6A,0x04,0x4E,0xEB,0x08,0x9E,0xE8,0xC6,0xF7,0x03,0xF8,0xFE, +0xC1,0x00,0x88,0x5D,0xC4,0x00,0x5D,0xA5,0x00,0x8A,0x03,0x5C,0xA6,0x00,0x89,0xE1, +0x41,0x65,0x5B,0x40,0x21,0xBD,0x88,0x6E,0x88,0x8D,0xFC,0xD6,0xFF,0x78,0xE7,0xFF, +0xFC,0xA2,0xC3,0x40,0x10,0x01,0x89,0x81,0x5D,0x6B,0x00,0x13,0x2A,0x04,0x9A,0xE0, +0xFF,0x5A,0x04,0x1C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08,0x9E,0xE1,0x43,0x6C,0xC4, +0x8F,0x1A,0x0B,0x18,0x03,0x0F,0x1B,0x01,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x6D,0x43, +0x4B,0x74,0x8D,0xAB,0x5F,0x5A,0x00,0x5D,0xAD,0x00,0x9A,0xE0,0x1F,0x2D,0x01,0x43, +0x39,0xD5,0x5F,0x39,0x00,0xE4,0x00,0x00,0x33,0x4F,0x77,0x10,0xFF,0x96,0xFF,0x78, +0x8F,0x7C,0x0F,0x7B,0x02,0x27,0x60,0x4A,0xD5,0xB8,0x03,0x19,0x9E,0xE1,0x5F,0x17, +0x00,0xD7,0x38,0xFF,0x45,0x8B,0x1A,0x1F,0x36,0xD8,0x1F,0x76,0xD8,0x4E,0xF8,0x10, +0x8E,0xF9,0x0F,0x37,0xA2,0x1E,0xF8,0x01,0x43,0x39,0xCB,0x4E,0xF7,0x10,0x8E,0xFB, +0x0E,0xF7,0xA2,0x42,0xF7,0xBB,0x5F,0x37,0x15,0x4B,0x77,0xC8,0x27,0x60,0xBC,0x8F, +0x1A,0x0B,0x6A,0x0B,0x41,0x78,0x5D,0x13,0x4A,0x0C,0x4D,0x6B,0x08,0x98,0x61,0x8D, +0x8B,0x0B,0x0C,0x00,0x43,0x18,0xDB,0x43,0x77,0xDB,0x43,0x18,0xD0,0x8E,0xF9,0x42, +0xFB,0xB8,0x8E,0xF8,0x0E,0xF0,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x88,0x2F,0x0E, +0xC1,0x66,0x0E,0x01,0x6A,0x0D,0xE1,0x6E,0x0D,0xC1,0x72,0x0D,0xA1,0x76,0x0D,0x81, +0x7A,0x0D,0x61,0x7E,0xED,0x41,0x00,0x82,0xED,0x21,0x00,0x86,0xFC,0x21,0x00,0x88, +0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40,0xC1,0x40,0x10,0x01,0x0D,0x61,0x3C,0x0D, +0x81,0x38,0x0D,0xC1,0x30,0x0E,0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0E,0xA1, +0x14,0x0E,0xC1,0x10,0x0D,0x21,0x44,0x0D,0xA1,0x34,0x0D,0xE1,0x2C,0x0E,0x01,0x28, +0x0E,0x21,0x24,0x5E,0x63,0x00,0x5E,0x44,0x00,0xC1,0xC0,0x10,0x01,0xF0,0x8A,0x0B, +0x1A,0xFD,0xCE,0x0C,0x5C,0x98,0xA0,0x88,0x6E,0x99,0x80,0x8A,0xCA,0xE4,0x00,0xBE, +0x36,0xC1,0x40,0x10,0x01,0x89,0x6C,0xC2,0xA0,0x10,0x01,0x9A,0x81,0xFD,0x4A,0x0B, +0x90,0xE4,0x00,0x01,0x19,0xCC,0x6B,0x00,0x30,0xEA,0xF5,0x08,0x3F,0x41,0xA3,0x54, +0x56,0xF7,0x02,0x12,0x2D,0x04,0x12,0x0D,0x05,0x11,0xED,0x07,0x22,0xE1,0x0C,0x1C, +0x61,0x04,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0xDA,0x20,0x61, +0x14,0x1C,0x61,0x06,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFC,0x5C, +0x20,0x60,0xCC,0x0B,0x01,0x04,0xCF,0x18,0x00,0x07,0x0A,0xE1,0x06,0xCE,0xF7,0x00, +0x03,0x8E,0xF8,0x9B,0x0A,0x42,0xF7,0xC0,0x0E,0xED,0x17,0xE4,0x00,0x00,0x43,0x8C, +0x6A,0x88,0x91,0x1C,0x63,0x16,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0x56, +0x20,0x60,0x32,0x4E,0xF4,0x5C,0x45,0x8C,0xBD,0x5D,0x8C,0x00,0x88,0x6E,0xF0,0x96, +0x0B,0x1A,0x98,0xA1,0x9D,0x61,0xE4,0x00,0xBD,0x04,0x5D,0x6B,0x00,0x12,0xEA,0x00, +0xD6,0xEB,0xFB,0xAD,0x88,0x6C,0xE7,0xFF,0xF4,0x7A,0x12,0xEA,0x00,0x22,0xE0,0x6C, +0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x25,0x56,0xF7,0x40,0x22,0xE0,0x34,0xC2,0xE0, +0x10,0x01,0xEE,0xF7,0x03,0xE6,0x86,0xE8,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xF0,0x97, +0x0B,0x1A,0x98,0xA1,0xE4,0x00,0xBC,0x88,0xC2,0xE0,0x10,0x01,0x99,0x80,0xEA,0xF7, +0x08,0x25,0x89,0x6C,0x56,0xF7,0x80,0x99,0xA1,0x22,0xE0,0xFC,0xC2,0xE0,0x10,0x01, +0xEE,0xF7,0x03,0xFA,0x86,0xE8,0xE4,0x00,0x00,0x7F,0xCE,0xEB,0x00,0x30,0x40,0x6A, +0xBC,0x8A,0xE3,0x88,0x83,0x10,0xB7,0x04,0x1C,0x63,0x18,0x9C,0x8C,0x10,0xD7,0x05, +0x10,0xF7,0x07,0xE7,0xFF,0xEF,0xDC,0x20,0x60,0x32,0x4E,0xED,0x5C,0x45,0x8C,0xBD, +0x5D,0x8C,0x00,0x9D,0x61,0x5D,0x6B,0x00,0x12,0xEA,0x00,0xD6,0xEB,0xFE,0x7D,0x88, +0x6C,0xE7,0xFF,0xF3,0x64,0x22,0x61,0x5C,0x22,0x40,0xFE,0xE4,0x00,0x00,0xA3,0xCD, +0x6C,0x00,0x30,0x8D,0x6A,0x0A,0xEB,0x16,0x0E,0xE1,0x08,0x0A,0xEB,0x18,0x1C,0x61, +0x08,0x0E,0xE1,0x0C,0x1C,0x81,0x0C,0xEE,0xED,0x03,0xD2,0x0C,0xAB,0x0E,0x88,0xCE, +0x86,0xE8,0x0E,0xE1,0x0A,0x9D,0x81,0x0E,0xEB,0x17,0x5D,0x8C,0x00,0x0E,0xE1,0x0E, +0x0E,0xEB,0x19,0xE4,0x00,0x00,0x25,0xC1,0xC0,0x10,0x01,0x99,0x80,0xC1,0xA0,0x10, +0x01,0xFD,0xCE,0x01,0x64,0x12,0xEA,0x00,0xD6,0xEC,0xFD,0xBD,0xC2,0xE0,0x10,0x01, +0x13,0x6A,0x00,0xEB,0x97,0x08,0x3F,0x9B,0x20,0xC2,0xE0,0x10,0x01,0x57,0x9C,0x01, +0xFE,0xF7,0x0B,0xA8,0xCB,0xA0,0x07,0xFF,0xE4,0x00,0x00,0x89,0x0B,0x57,0x01,0x13, +0xD7,0xEF,0x5F,0x1A,0x06,0x47,0x18,0xC7,0x4F,0x18,0xFA,0x47,0x1A,0xC4,0x5F,0x58, +0x06,0xC3,0x40,0xFF,0xE8,0x20,0x00,0x1D,0xFF,0x00,0x07,0xFF,0x0F,0x17,0x01,0x5F, +0x58,0x06,0x23,0x80,0x48,0xCF,0x1A,0x03,0xFF,0x4F,0x5E,0x50,0x43,0x18,0xE8,0x8F, +0x1A,0x0F,0x17,0x01,0x9F,0x21,0x1E,0xF7,0x30,0x5F,0x39,0x00,0xD7,0x3B,0xFE,0x06, +0x0E,0xC1,0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E, +0x21,0x26,0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81, +0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85,0x29,0x1C, +0x21,0xC8,0xC2,0xE0,0x10,0x01,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0E,0x61,0x0C,0x0E, +0xC1,0x00,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0xC1,0x20,0x0D,0xE1, +0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x81,0x08,0x0E,0xA1,0x04, +0xC1,0x80,0x10,0x01,0xF3,0x57,0x08,0x72,0xFD,0x8C,0x0B,0x90,0xC2,0xE0,0x10,0x01, +0x1E,0xC1,0x38,0x89,0xA3,0x8A,0x61,0x18,0x0C,0x00,0xFE,0xF7,0x0B,0x98,0x9B,0x00, +0x9B,0x3F,0xE4,0x00,0x00,0x2B,0x0C,0x17,0x00,0x1B,0x37,0xFE,0x1B,0x37,0xFF,0x9F, +0x01,0x1E,0xF7,0x30,0x5F,0x18,0x00,0xD7,0x1A,0xFF,0x7E,0xC1,0xE0,0x10,0x01,0xFD, +0xEF,0x0B,0x1A,0x12,0xEF,0x04,0x10,0x6F,0x01,0x40,0x63,0xBB,0xE4,0x00,0xB6,0x22, +0x13,0x2F,0x04,0x4E,0xF9,0x10,0x9E,0xEA,0xC6,0xF7,0x07,0xF8,0xC3,0x60,0x10,0x01, +0x40,0x21,0xBD,0x0A,0x0D,0x18,0x89,0x61,0x9B,0x00,0xCA,0xE0,0x20,0x00,0xFF,0x7B, +0x09,0xBC,0xE4,0x00,0x00,0x3B,0x4F,0x58,0x10,0x9F,0x01,0x43,0x9A,0xDC,0x8F,0x4B, +0x0E,0x3C,0x02,0x5E,0x37,0x15,0x0E,0x3A,0x00,0x4A,0xF1,0xB8,0x5E,0xF7,0x06,0x5F, +0x58,0x00,0xD7,0x3A,0xFF,0x25,0x46,0x37,0xBF,0x99,0x40,0x4E,0x31,0xFA,0x89,0xCA, +0x46,0x31,0xBC,0xC2,0x80,0x10,0x01,0x9A,0x42,0x8A,0xAC,0xE4,0x00,0x04,0x4B,0x0B, +0x0D,0x18,0x21,0x41,0x32,0x0E,0xEB,0x02,0xD7,0x17,0x0E,0xEC,0x0F,0x0B,0x06,0xD6, +0xF8,0x00,0x7C,0xD6,0xF8,0x0E,0x96,0x0F,0x0B,0x0A,0xD6,0xF8,0x0E,0x58,0x98,0x60, +0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE5,0xE6, +0xD0,0x60,0x0D,0xAA,0x12,0xEC,0x00,0x99,0x41,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E, +0xEC,0x18,0x17,0x04,0x18,0x17,0x06,0x1A,0x57,0x05,0xE4,0x00,0x03,0x4F,0x21,0x45, +0x56,0x0E,0xEB,0x06,0xD7,0x17,0x0C,0x8C,0x0F,0x0B,0x02,0xD7,0x17,0x0C,0x54,0x0F, +0x0B,0x0A,0xD6,0xF8,0x00,0x7C,0xD6,0xF8,0x0B,0xFE,0x0F,0x0B,0x0E,0xD6,0xF8,0x0B, +0xC0,0x98,0x61,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7, +0xFF,0xE5,0x40,0xD0,0x60,0x0B,0x12,0x12,0xEC,0x00,0x9B,0x01,0x8E,0xEE,0x99,0x42, +0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x18,0x17,0x04,0x1B,0x17,0x06,0x1A,0x57,0x05,0xE4, +0x00,0x02,0xA5,0x25,0x45,0xC5,0x1F,0x37,0xFE,0xD7,0x2A,0x03,0x58,0x4E,0xEA,0x10, +0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x09,0x84,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F, +0x0B,0x0F,0x18,0x02,0xD6,0xF8,0x01,0x34,0xD6,0xF8,0x08,0xEE,0x1F,0x2A,0xFE,0x4F, +0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x08,0x70,0x1F,0x4A,0x01,0x4F,0x5A, +0x10,0x8F,0x4B,0x0F,0x5A,0x02,0xD7,0x59,0x07,0xF8,0x1F,0x2A,0x01,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x03,0x2C,0xD6,0xF9,0x07,0x66,0x1F,0x2A,0x02, +0x4F,0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x06,0xE8,0xD7,0x19,0x06,0xC8, +0xE4,0x00,0x00,0x95,0x4F,0x0A,0x10,0x1F,0x57,0xFE,0x0B,0x2D,0x18,0x8F,0x0B,0xD5, +0x5A,0x03,0x6E,0x0F,0x18,0x02,0xD7,0x38,0x05,0xFC,0x1F,0x37,0xFF,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD7,0x38,0x05,0x84,0x1F,0x37,0xFD,0x4F,0x39,0x10,0x8F, +0x2B,0x0F,0x39,0x02,0xD7,0x19,0x00,0xB4,0xD7,0x19,0x04,0xEE,0x9E,0xFC,0x4E,0xF7, +0x10,0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x04,0x78,0x88,0x6A,0x88,0x8B,0x88,0xB1, +0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE3,0x6E,0x20,0x61,0xE4,0x12, +0xEC,0x00,0x1F,0x0A,0xFF,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x19,0x57,0x06, +0x1B,0x17,0x04,0x9D,0x41,0x5D,0x4A,0x00,0xE4,0x00,0x00,0xAD,0x0E,0xF8,0x02,0xD7, +0x37,0x02,0xB4,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18,0x02,0xD6,0xF8, +0x00,0xBC,0xD6,0xF8,0x02,0x1E,0x1F,0x0A,0xFE,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18, +0x02,0xD6,0xF8,0x01,0xA0,0x88,0x6A,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C, +0x09,0x0D,0x1E,0xE7,0xFF,0xE2,0xB8,0x20,0x60,0x78,0x12,0xEC,0x00,0x1F,0x0A,0xFE, +0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x1B,0x17,0x04,0x19,0x57,0x06,0x19,0x57, +0x05,0xE4,0x00,0x00,0x21,0x9D,0x41,0x5D,0x4A,0x00,0x12,0xEF,0x04,0xD6,0xEA,0xF0, +0x95,0x12,0xEF,0x04,0xD6,0xEA,0x01,0x61,0x12,0xEC,0x00,0x8E,0xEE,0xCE,0xF7,0x00, +0x30,0x43,0x17,0x64,0x13,0x18,0x05,0xD5,0x58,0x00,0x55,0x1D,0x58,0x01,0x5D,0x4A, +0x00,0x8E,0xF5,0x9B,0x01,0x9D,0xC1,0x18,0x17,0x07,0x0F,0x17,0x08,0x5D,0xCE,0x00, +0x12,0xEF,0x04,0xD6,0xEA,0x00,0x61,0xF2,0xF4,0x08,0x72,0xD6,0xEE,0xFD,0xFC,0x12, +0xEC,0x00,0x8D,0xD7,0x19,0xCC,0x00,0x88,0x33,0x0E,0xC1,0x02,0x0E,0xA1,0x06,0x0E, +0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1, +0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32, +0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01, +0xF8,0x77,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x0B,0x25,0xEE,0xF8,0x04,0x5D, +0xC3,0x00,0x10,0x01,0xCF,0x37,0x00,0x05,0x4E,0xF7,0x10,0xEF,0x38,0x04,0x5B,0xC3, +0x00,0x10,0x01,0xEE,0xF8,0x04,0x59,0x85,0x29,0x5C,0x63,0x06,0x20,0x84,0x5A,0x0B, +0x05,0x00,0x0B,0x25,0x02,0x0B,0x45,0x04,0x0B,0x85,0x06,0x0B,0x65,0x08,0xE4,0x00, +0x00,0x27,0x0B,0x05,0x0A,0x0B,0x25,0x0C,0x0B,0x45,0x0E,0x0B,0x85,0x10,0x0B,0x65, +0x12,0xC2,0xE0,0x10,0x01,0x9B,0xA2,0xEA,0xF7,0x0B,0x25,0x43,0x9C,0xBB,0x43,0x9C, +0xE8,0x43,0x80,0xE5,0xFF,0x9C,0x03,0xFF,0xD4,0x7C,0x00,0xC8,0x43,0x9B,0xBB,0x43, +0xBC,0xE8,0xFF,0xBD,0x03,0xFF,0xD7,0xA3,0x01,0x08,0x5C,0x78,0x04,0xE4,0x00,0x00, +0xE3,0x24,0x7C,0x58,0x43,0x03,0xC3,0x40,0x7C,0x1D,0x43,0x43,0xD3,0x40,0x78,0xD4, +0x40,0x63,0xE0,0xE4,0x00,0x00,0xB1,0x9B,0x82,0x43,0x7B,0xBB,0x43,0x7B,0xE0,0xFF, +0x9B,0x03,0xFF,0xD7,0x83,0x01,0x7C,0xC0,0x60,0xFF,0xEC,0x20,0x00,0xCD,0x43,0x60, +0xDD,0xFE,0xFB,0xFC,0x01,0x8E,0xE3,0x43,0x37,0xCB,0xCA,0xE0,0x07,0xFF,0x40,0x77, +0x1D,0xFF,0x7B,0x04,0x00,0x43,0x03,0xC3,0x40,0x79,0xC4,0x40,0x63,0xD8,0xE4,0x00, +0x00,0x3B,0x24,0x7C,0x32,0x8C,0x77,0x40,0x63,0xD3,0xE4,0x00,0x00,0x1D,0xFF,0x17, +0x07,0xFF,0x40,0x78,0x1D,0x40,0x63,0xCB,0x40,0x63,0xB8,0x5C,0x63,0x04,0x85,0x29, +0x9C,0x38,0x0C,0x01,0x04,0xC3,0x00,0x10,0x01,0xC3,0x40,0x10,0x01,0xFF,0x18,0x0B, +0x1A,0xFF,0x9A,0x04,0x1C,0x0B,0x38,0x0B,0x0B,0xBC,0x00,0x13,0x18,0x0C,0x5F,0x79, +0x06,0x5E,0xE3,0x06,0x43,0x7D,0xDB,0x43,0x7B,0xC0,0xD6,0xFB,0x00,0x4C,0x9B,0x41, +0x0F,0x41,0x04,0x0F,0x41,0x06,0x98,0x7F,0x23,0x40,0x5E,0x0B,0x5C,0x02,0x43,0x5A, +0xCB,0x43,0x5A,0xC0,0xD7,0x57,0x00,0x58,0x9B,0x41,0x98,0x60,0x0F,0x41,0x04,0x0F, +0x41,0x06,0x23,0x41,0x1E,0xC3,0x40,0x10,0x01,0xC3,0x60,0x10,0x01,0xF3,0xBA,0x0B, +0x1E,0xFF,0x7B,0x04,0x20,0x9B,0x41,0xE4,0x00,0x00,0x57,0x0B,0xDB,0xFE,0x43,0xDE, +0xCB,0x43,0xDE,0xC0,0xD7,0xD7,0x00,0xD4,0x0B,0xDB,0x00,0x43,0xDE,0xCB,0x43,0xDE, +0xC0,0xD7,0xD7,0x00,0x68,0x9B,0x41,0x0F,0x41,0x04,0xE4,0x00,0x00,0x1F,0x9F,0x41, +0x9F,0x62,0x5C,0x7A,0x02,0xD7,0x5D,0xFE,0xB0,0x0F,0x41,0x06,0x23,0x40,0x9E,0xC3, +0x40,0x10,0x01,0xF3,0x5A,0x0B,0x1E,0x9F,0x41,0x4F,0x7A,0x08,0x8F,0x9B,0x0B,0x7C, +0x00,0x43,0x3B,0xCB,0x43,0x19,0xC0,0xD7,0x17,0x00,0x64,0x9A,0xE1,0x5C,0x7A,0x02, +0x0E,0xE1,0x04,0x9C,0x28,0x85,0x29,0xC3,0x20,0x10,0x01,0x5C,0x63,0x06,0x5C,0xC6, +0x02,0x5C,0xE7,0x00,0xFF,0x39,0x09,0x0C,0x24,0xC0,0x98,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x0B,0x1E,0xD4,0xD8,0x00,0xDC,0x43,0x18,0x3B,0x1E,0xE6,0xFF,0x8E,0xF8,0x4F, +0x17,0x10,0x8F,0x19,0x0B,0x78,0x02,0x0B,0x58,0x00,0xE4,0x00,0x00,0x11,0x9B,0x40, +0x8B,0x7A,0xC2,0xE0,0x10,0x01,0xF3,0x97,0x0B,0x1E,0xD7,0x86,0x01,0x08,0xD0,0xDF, +0x04,0x28,0x42,0xFC,0x3B,0x8E,0xE6,0x4F,0x17,0x10,0x4E,0xF7,0x10,0x8F,0x19,0x8F, +0x37,0x0B,0x18,0x02,0x0B,0xD9,0x00,0xE4,0x00,0x00,0x17,0x24,0xDD,0xA0,0x9B,0xC0, +0x8B,0x1E,0xD4,0xDC,0x03,0x0C,0x4E,0xE6,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04, +0x1C,0x8E,0xE7,0x9C,0xC1,0x09,0x17,0x00,0x4C,0xC6,0x08,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x0B,0x1A,0x8C,0xE6,0x0B,0x97,0x0B,0x13,0x37,0x0C,0x0A,0xE7,0x00,0x40,0xD7, +0xE3,0x42,0xF7,0x45,0x43,0xA8,0xE3,0x40,0xC6,0xC8,0x43,0xBD,0xC8,0x43,0x97,0xE3, +0x43,0xA3,0xED,0x43,0x3C,0xC8,0x40,0x66,0x1D,0x43,0x18,0xEB,0x43,0x7B,0x1B,0x42, +0xFE,0xEB,0x8F,0x1B,0x40,0x7A,0x1B,0x43,0x18,0xC8,0x8E,0xE3,0x42,0xF7,0xC8,0xE4, +0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x0F,0x04,0x01,0x0E,0xE5,0x01,0x85,0x29,0x1C, +0x21,0xD8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x5D,0x84, +0x00,0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x5D,0xA5,0x00,0x5D,0x63,0x04, +0x0C,0xC1,0x04,0x0D,0x21,0x24,0x89,0xE8,0x0D,0xC1,0x2A,0xC1,0x40,0x10,0x01,0x9A, +0x02,0xFD,0x4A,0x0B,0x1A,0x0C,0xE1,0x00,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x40,0x63, +0x80,0x40,0x6B,0x1D,0xE7,0xFF,0xFC,0x38,0x0C,0x81,0x06,0x88,0xC3,0x5E,0xE3,0x02, +0x0C,0xA1,0x02,0x26,0xFC,0x36,0x0C,0x04,0x01,0x0C,0x05,0x01,0xE4,0x00,0x00,0x2D, +0x0A,0xEA,0x0B,0x42,0xEC,0xBB,0x88,0xED,0x40,0x77,0x80,0x40,0x6B,0x1D,0xE7,0xFF, +0xFD,0x72,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x4C,0x63,0x0A,0x8C,0x6B,0xE7,0xFF,0xFB, +0xC6,0x12,0xEA,0x04,0x88,0xC3,0x5F,0x03,0x02,0xD7,0x17,0x00,0x70,0x0C,0x0F,0x01, +0x0C,0x0E,0x01,0xE4,0x00,0x00,0x69,0x08,0x6A,0x0B,0x41,0x8C,0x1B,0x88,0x8F,0x4C, +0x6C,0x0A,0x88,0xAE,0x8C,0x6B,0x88,0xED,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1, +0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26, +0x1C,0x21,0x28,0xE7,0xFF,0xFC,0xC9,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12, +0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C, +0x21,0x28,0x85,0x29,0x1C,0x21,0x90,0x0D,0x41,0x68,0x0D,0x81,0x60,0x0D,0xA1,0x5C, +0x0D,0xE1,0x54,0x0E,0x01,0x50,0x0E,0x21,0x4C,0x0D,0x21,0x6C,0xC2,0x20,0x10,0x01, +0x0D,0x61,0x64,0x0D,0xC1,0x58,0x0E,0x41,0x48,0x0E,0x61,0x44,0x0E,0x81,0x40,0x0E, +0xA1,0x3C,0x0E,0xC1,0x38,0x89,0xA3,0x8A,0x04,0x89,0x85,0x5D,0xE6,0x00,0x99,0x40, +0xFE,0x31,0x0B,0x90,0xE4,0x00,0x00,0xA1,0xCF,0x0A,0x00,0x30,0x8F,0x11,0x1E,0xE1, +0x20,0x10,0xB8,0x07,0x0B,0x98,0x17,0x43,0x2D,0x2C,0x4D,0x05,0x08,0x13,0x59,0x00, +0x1F,0x61,0x38,0x8D,0x1A,0x9F,0x41,0x4D,0x08,0x08,0x1B,0x59,0x00,0x8F,0x68,0x08, +0x78,0x17,0x0F,0x9B,0xD9,0x1F,0x01,0x30,0x8F,0x08,0x88,0x8F,0x0F,0x01,0x00,0x1C, +0xC1,0x18,0x1C,0xE1,0x28,0x8C,0xC8,0x8C,0xE8,0x9D,0x41,0x8D,0x17,0x5D,0x4A,0x00, +0xE7,0xFF,0xFD,0x1E,0x12,0xF1,0x00,0xD6,0xEA,0xFD,0x8D,0xC2,0xE0,0x10,0x01,0x8B, +0x10,0xF2,0x57,0x04,0x64,0x9B,0x41,0x8A,0xED,0xE4,0x00,0x00,0x23,0x13,0x37,0x00, +0x27,0x24,0x19,0x0F,0x58,0x00,0x9E,0xE1,0x9F,0x04,0x43,0x37,0x6D,0x5F,0x39,0x00, +0xD6,0x59,0xFF,0x6D,0x99,0x60,0xC2,0x60,0x10,0x01,0x89,0x4B,0xC2,0x80,0x10,0x01, +0xE4,0x00,0x03,0x07,0x42,0xF0,0x5C,0x0E,0xF7,0x02,0x22,0xE0,0x48,0x1E,0xE1,0x10, +0x8E,0xEB,0x0B,0x57,0x00,0x0B,0x77,0x02,0xE4,0x00,0x01,0x5D,0x42,0xED,0x54,0x12, +0xF7,0x00,0x22,0xE1,0xE0,0x1E,0xE1,0x18,0x8E,0xEB,0x0B,0x17,0x00,0x1E,0xE1,0x28, +0x8E,0xEB,0x0A,0xF7,0x00,0x8E,0xF8,0x1F,0x01,0x30,0x8F,0x0B,0x0B,0x18,0x00,0x8E, +0xF8,0x1F,0x01,0x20,0x8F,0x0B,0x0B,0x18,0x00,0x8E,0xF8,0x9B,0x04,0x42,0xF7,0xC0, +0x0E,0xEC,0x00,0xE4,0x00,0x02,0x55,0xCE,0xEE,0x00,0x30,0x8E,0xF1,0x41,0x0E,0xCC, +0x08,0x77,0x17,0x4D,0x08,0x08,0x1E,0xE1,0x30,0x8E,0xE8,0x0E,0xE1,0x00,0x1E,0xE1, +0x20,0x0F,0x01,0x0C,0x0F,0x21,0x08,0x88,0x8F,0x88,0xB5,0x1C,0xC1,0x18,0x1C,0xE1, +0x28,0x8C,0xC8,0x8C,0xE8,0x8D,0x17,0xE7,0xFF,0xFB,0x90,0x9D,0xC1,0x0F,0x01,0x0E, +0x5D,0xCE,0x00,0x0F,0x21,0x0A,0xE4,0x00,0x00,0x23,0x9A,0xC1,0x99,0xC0,0x42,0xD6, +0x55,0x4F,0x2A,0x08,0x43,0x0D,0xB4,0x12,0xF8,0x00,0xD6,0xEE,0xFD,0x6D,0x4E,0xD6, +0x10,0x43,0x10,0xB4,0x0F,0x18,0x02,0xD3,0x00,0x05,0x0A,0x1F,0x01,0x38,0x8E,0xD8, +0x0B,0x56,0xD8,0x0B,0x76,0xDA,0x43,0x3A,0xDD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0xEB, +0x93,0x04,0x5B,0x47,0x37,0xCE,0x43,0x39,0xBD,0x52,0xE0,0x64,0x5F,0x39,0x06,0xD7, +0x3C,0x00,0xF4,0xEB,0x14,0x04,0x59,0x9A,0xE0,0xD7,0x19,0x00,0xA4,0x42,0xF9,0xC5, +0x43,0x1C,0xC5,0xCE,0xF7,0x00,0x64,0x42,0xF7,0xC0,0x5E,0xF7,0x00,0x5F,0x7A,0x15, +0x4B,0x81,0x01,0x4F,0x2A,0x08,0x4B,0x00,0x0A,0x8F,0x19,0x8F,0x3C,0x1F,0x81,0x38, +0x1F,0x41,0x38,0x53,0x60,0xC8,0x4F,0x39,0x08,0x43,0x7B,0xBD,0x8F,0x3C,0x0B,0x99, +0xE0,0x4F,0x18,0x08,0x8F,0x1A,0x0B,0xB8,0xE8,0x0B,0x58,0xF8,0x8F,0x5D,0x8F,0x5C, +0x0B,0x99,0xF0,0x8F,0x5C,0x43,0x5B,0xD3,0x0B,0x79,0xE8,0x0B,0x39,0xF8,0x8F,0x79, +0x0B,0x38,0xE0,0x8F,0x79,0x0B,0x38,0xF0,0x43,0x1B,0xCC,0x42,0xF7,0xC3,0xCB,0x00, +0x03,0x20,0x8E,0xFA,0xE7,0xFF,0xFD,0xF3,0x22,0xE0,0x88,0x1F,0x01,0x38,0x4E,0xEA, +0x10,0x8E,0xF8,0x0B,0x17,0xF0,0x0B,0x37,0xE0,0x8F,0x38,0x0B,0x17,0xF8,0x8F,0x38, +0x0B,0x17,0xE8,0x42,0xF9,0xC4,0xE7,0xFF,0xFD,0xAB,0x0C,0x0C,0x00,0x9D,0x41,0x9D, +0x84,0x9D,0x64,0x5E,0xAA,0x00,0xD6,0x55,0xF3,0xF5,0x0E,0xC1,0x3A,0x0E,0xA1,0x3E, +0x0E,0x81,0x42,0x0E,0x61,0x46,0x0E,0x41,0x4A,0x0E,0x21,0x4E,0x0E,0x01,0x52,0x0D, +0xE1,0x56,0x0D,0xC1,0x5A,0x0D,0xA1,0x5E,0x0D,0x81,0x62,0x0D,0x61,0x66,0x0D,0x41, +0x6A,0x0D,0x21,0x6E,0x1C,0x21,0x70,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x89,0xA3,0xC2,0xE0,0x10, +0x01,0x5C,0x64,0x06,0xEA,0xF7,0x08,0x3F,0x5D,0x85,0x00,0x5D,0x66,0x00,0x5D,0x47, +0x00,0x56,0xF7,0x04,0x22,0xE0,0x34,0x88,0x8C,0x88,0xAB,0x88,0xCA,0xE7,0xFF,0xE0, +0xEC,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x1E,0x43,0x0A,0xC3,0x5F,0x18,0x00,0x9B, +0x20,0x42,0xF8,0x64,0x8D,0x78,0xC3,0x40,0x10,0x01,0x5D,0x6B,0x00,0x5E,0xF7,0x00, +0x8B,0x19,0xFF,0x5A,0x09,0x0C,0xE4,0x00,0x00,0x3B,0x4F,0x77,0x10,0x8F,0x7A,0x0B, +0x7B,0x02,0x8F,0x1B,0x4F,0x77,0x10,0x9E,0xE1,0x8F,0x7A,0x5E,0xF7,0x00,0x0B,0x7B, +0x00,0x8F,0x3B,0xD6,0xEB,0xFF,0x38,0x27,0x21,0x14,0x27,0x01,0x08,0xC2,0xE0,0x10, +0x01,0xFE,0xF7,0x03,0x30,0x4F,0x39,0x40,0x9D,0x44,0x4D,0x4A,0x10,0x8D,0x57,0x0A, +0xEA,0x06,0x43,0x19,0xC0,0x9B,0x4A,0xFF,0x18,0xFF,0x00,0x53,0x20,0x64,0x43,0x18, +0xBB,0x0A,0xEA,0x04,0x43,0x18,0xD0,0x4E,0xF7,0x40,0x42,0xF7,0xC8,0x8E,0xF8,0x5E, +0xE0,0x09,0x0E,0xED,0x00,0x48,0x61,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1, +0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18, +0x85,0x29,0xCA,0xE0,0x01,0x00,0xFC,0x21,0xFF,0x80,0x5C,0xE7,0x00,0x0D,0x41,0x78, +0x0D,0x61,0x74,0x0D,0x81,0x70,0x0E,0x21,0x5C,0x0E,0x41,0x58,0x0E,0x61,0x54,0x0E, +0x81,0x50,0x0E,0xA1,0x4C,0x0E,0xC1,0x48,0x0D,0x21,0x7C,0x0D,0xA1,0x6C,0x0D,0xC1, +0x68,0x0D,0xE1,0x64,0x0E,0x01,0x60,0xCE,0x44,0x00,0x0A,0x42,0x52,0x1B,0x42,0x52, +0xB8,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x11,0xD7,0x04,0x41,0x87,0x73,0x5F, +0x0C,0x00,0xCC,0x84,0x0A,0x00,0x8C,0xB8,0x8C,0xD8,0xC2,0xA0,0x10,0x01,0xC2,0x20, +0x10,0x01,0xC1,0x60,0x10,0x01,0xC3,0x00,0x10,0x01,0xFD,0x6B,0x09,0x0C,0x42,0x64, +0x18,0x5E,0x86,0x00,0x09,0xF7,0x0B,0x12,0x17,0x0C,0x5D,0x45,0x00,0xFE,0xB5,0x03, +0x30,0xFE,0x31,0x04,0x1C,0x8A,0xCB,0xFF,0x18,0x09,0xBC,0xE4,0x00,0x01,0x61,0x0F, +0x01,0x04,0x88,0x95,0x50,0xA0,0x3C,0x1C,0x61,0x08,0xE4,0x00,0x44,0xAC,0x41,0xAA, +0x65,0x1E,0xED,0x01,0x4E,0xF7,0x08,0x8E,0xF1,0x98,0x82,0x08,0x77,0x00,0x1C,0xA1, +0x08,0x40,0x63,0x7B,0x40,0x63,0x80,0xE7,0xFF,0xF1,0x44,0x0F,0x01,0x06,0x5C,0x63, +0x04,0xD5,0x4C,0x00,0x5E,0x1E,0xEE,0xFF,0xD5,0xB7,0x01,0x92,0xCB,0x20,0x03,0xE8, +0x43,0x43,0x9B,0x4E,0xEA,0x10,0x43,0x63,0x93,0x9E,0xE2,0x43,0x7B,0xC8,0x8E,0xEB, +0x0B,0x97,0x01,0x43,0x7C,0xDD,0x0F,0x77,0x01,0x43,0x3A,0xC8,0x4E,0xEA,0x10,0x8E, +0xEB,0x0B,0x57,0x01,0x43,0x3A,0xCD,0x0F,0x37,0x01,0x4E,0xEA,0x08,0x1F,0x37,0x01, +0x4F,0x59,0x08,0x8F,0x4B,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4F,0x57, +0x08,0x8F,0x56,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4E,0xF7,0x08,0x8E, +0xEB,0x4F,0x4A,0x10,0x0B,0x77,0x00,0x8F,0x58,0x4F,0x39,0x08,0x9D,0x41,0x8F,0x2B, +0x5D,0x4A,0x00,0x0A,0xF9,0x00,0x8E,0xFB,0x0E,0xFA,0x00,0xD5,0x54,0xFA,0xA0,0x0E, +0xC1,0x4A,0x0E,0xA1,0x4E,0x0E,0x81,0x52,0x0E,0x61,0x56,0x0E,0x41,0x5A,0x0E,0x21, +0x5E,0x0E,0x01,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D,0xA1,0x6E,0x0D,0x81,0x72, +0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21,0x00,0x80,0x85,0x29,0x1C, +0x21,0xB8,0x98,0x60,0x0D,0x21,0x44,0x0D,0x41,0x40,0x0D,0x61,0x3C,0x0D,0x81,0x38, +0x0D,0xA1,0x34,0x0D,0xC1,0x30,0x0D,0xE1,0x2C,0x0E,0x01,0x28,0x0E,0x21,0x24,0x0E, +0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0C,0x01,0x08,0x0C,0x01,0x0C,0x18,0x01, +0x02,0x18,0x01,0x03,0x0C,0x01,0x10,0x0C,0x01,0x14,0xE7,0xFF,0xD3,0x4C,0x1C,0x61, +0x02,0x1C,0x81,0x10,0x1C,0xA1,0x08,0x98,0xC4,0xE7,0xFF,0xF5,0xD6,0xC2,0xE0,0x10, +0x01,0xF3,0x97,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEB,0xB7,0x08,0x1D,0xC2,0xE0,0x10, +0x01,0xEF,0x77,0x04,0x56,0xC2,0xE0,0x10,0x01,0x57,0xBD,0x20,0xEF,0xD7,0x04,0x62, +0xC3,0x20,0x10,0x01,0x4F,0xBD,0x29,0x1E,0xE1,0x08,0xFF,0x39,0x03,0x50,0x9B,0x40, +0xE4,0x00,0x00,0x63,0x0F,0x17,0x02,0x09,0x19,0xFC,0x0F,0x19,0x00,0x43,0x18,0x45, +0x5F,0x1F,0xF9,0x4B,0x18,0x00,0x0F,0x17,0x00,0x23,0xA0,0x3C,0x23,0x60,0x30,0x43, +0x18,0xF3,0x43,0x18,0xD8,0x0F,0x17,0x00,0x9F,0x41,0x9E,0xE4,0x5F,0x5A,0x00,0x9F, +0x28,0xD7,0x5C,0xFE,0x9E,0x98,0x61,0x99,0x60,0xC2,0x20,0x10,0x01,0xC2,0x80,0x10, +0x01,0xE7,0xFF,0xD2,0x3E,0x89,0x4B,0xFD,0xB1,0x0B,0x90,0x9A,0x41,0xC2,0x60,0x10, +0x01,0xFE,0x94,0x0C,0x5C,0xE4,0x00,0x00,0xF9,0xCE,0x0A,0x00,0x30,0x42,0xF0,0x6C, +0x1C,0x61,0x04,0x11,0xF7,0x04,0x11,0xD7,0x05,0x11,0x97,0x07,0x08,0x97,0x17,0x88, +0xAF,0x88,0xCE,0x88,0xEC,0xE7,0xFF,0xF9,0x88,0x20,0x60,0xF8,0x98,0x60,0xE7,0xFF, +0xD1,0xC4,0x1F,0x01,0x18,0x4E,0xEC,0x10,0x8E,0xF8,0x88,0xAF,0x0C,0x97,0xF2,0x88, +0xCE,0x88,0xEC,0x0C,0x61,0x06,0xE7,0xFF,0xFA,0xF8,0x98,0x61,0xE7,0xFF,0xD1,0x88, +0x40,0x6D,0x84,0x88,0xAF,0x88,0x83,0x88,0xCE,0x1C,0x63,0x18,0x9C,0x8C,0x88,0xEC, +0xE7,0xFF,0xD4,0x42,0x20,0x60,0x32,0x4E,0xF2,0x54,0x45,0x6B,0xBD,0x5D,0x6B,0x00, +0x88,0x74,0xF0,0x93,0x0B,0x1A,0x98,0xA1,0x9D,0x41,0xE4,0x00,0xA0,0x3C,0x5D,0x4A, +0x00,0xF2,0xF1,0x0B,0x90,0xD6,0xEA,0xFC,0x25,0x88,0x6B,0xE7,0xFF,0xD7,0xB0,0x0D, +0x21,0x46,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,0x0E,0x01, +0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,0x61,0x3E, +0x0D,0x41,0x42,0x1C,0x21,0x48,0x85,0x29,0xFC,0x21,0xFF,0x00,0x98,0xA0,0xED,0x41, +0x00,0xF8,0xED,0x61,0x00,0xF4,0xED,0xC1,0x00,0xE8,0xED,0xE1,0x00,0xE4,0xEE,0x01, +0x00,0xE0,0xEE,0x21,0x00,0xDC,0xEE,0x41,0x00,0xD8,0xEE,0x61,0x00,0xD4,0xED,0x21, +0x00,0xFC,0xED,0x81,0x00,0xF0,0xED,0xA1,0x00,0xEC,0xEE,0x81,0x00,0xD0,0xEE,0xA1, +0x00,0xCC,0xEE,0xC1,0x00,0xC8,0xC2,0x20,0x10,0x01,0xC2,0x60,0x10,0x01,0xFE,0x31, +0x0C,0x5C,0xFD,0x73,0x0B,0x1A,0x88,0x71,0x10,0x8B,0x00,0xE4,0x00,0x9F,0x1A,0xC2, +0xE0,0x10,0x01,0xEA,0xF7,0x08,0x25,0xC6,0xF7,0x02,0x00,0xC2,0x40,0x10,0x01,0x5E, +0xE0,0x01,0xC1,0xE0,0x10,0x01,0x4A,0xE1,0x13,0xC1,0x40,0x10,0x01,0xC1,0xC0,0x10, +0x01,0x0E,0xE1,0x0C,0x9A,0x00,0xFE,0x52,0x03,0x30,0xFD,0xEF,0x09,0x0C,0xFD,0x4A, +0x09,0xBC,0xFD,0xCE,0x0B,0x90,0x98,0x60,0x0C,0x01,0x58,0x0C,0x01,0x5C,0x18,0x01, +0x56,0x18,0x01,0x57,0x0C,0x01,0x60,0x0C,0x01,0x64,0xE7,0xFF,0xCF,0x6C,0x1C,0x61, +0x56,0x1C,0x81,0x60,0x1C,0xA1,0x58,0x98,0xC3,0xE7,0xFF,0xF1,0xF6,0xC2,0xE0,0x10, +0x01,0xEB,0x97,0x08,0x1D,0xC2,0xE0,0x10,0x01,0xC3,0x20,0x10,0x01,0xEF,0x77,0x04, +0x56,0xC2,0xE0,0x10,0x01,0xF3,0x59,0x04,0x64,0x57,0x9C,0x20,0xEF,0xB7,0x04,0x62, +0x4F,0x9C,0x29,0x1E,0xE1,0x58,0x9B,0x20,0xE4,0x00,0x00,0x5D,0x0F,0xD7,0x02,0x4F, +0x19,0x18,0x8F,0x12,0x0B,0x18,0x1C,0x43,0x1E,0xC5,0x5F,0x1F,0xF9,0x4B,0x18,0x00, +0x0F,0x17,0x00,0x23,0x80,0x3C,0x23,0x60,0x30,0x43,0x18,0xEB,0x43,0x18,0xD8,0x0F, +0x17,0x00,0x9F,0x21,0x9E,0xE4,0x5F,0x19,0x00,0xD7,0x58,0xFE,0x9D,0x13,0x0B,0x04, +0x09,0xAB,0x0B,0x12,0x8B,0x0C,0x9A,0xA0,0xE4,0x00,0x01,0xA1,0xFE,0xE1,0x00,0xC8, +0x8E,0xF5,0x12,0xF7,0x8E,0x22,0xE0,0x72,0xFF,0x61,0x00,0xC8,0x9A,0xE1,0x42,0xF7, +0xAD,0x4E,0xF7,0x10,0x8E,0xFB,0x0F,0x37,0x92,0x4E,0xF5,0x10,0x8E,0xFB,0x0F,0x37, +0x90,0x41,0x95,0xC3,0x1F,0xB5,0x01,0x5E,0xCC,0x00,0x43,0xBD,0xC3,0xE4,0x00,0x01, +0x25,0x0F,0x01,0x00,0x0F,0x41,0x04,0x0F,0xA1,0x08,0x88,0x92,0x50,0xA0,0x3C,0x1C, +0x61,0x10,0xE4,0x00,0x3D,0x1C,0x42,0xF6,0x65,0xC3,0x80,0x10,0x01,0x9E,0xE1,0xFF, +0x9C,0x04,0x1C,0x4E,0xF7,0x08,0x8E,0xFC,0x98,0x81,0x08,0x77,0x00,0x1C,0xA1,0x10, +0x40,0x63,0x6B,0x40,0x63,0xA0,0xE7,0xFF,0xE9,0xA6,0x53,0x60,0x64,0x4E,0xF6,0x10, +0x5C,0x63,0x04,0x4F,0x35,0x10,0xFD,0x21,0x00,0xC8,0x9E,0xE2,0x8F,0x29,0x8E,0xEF, +0x0F,0x39,0x92,0x43,0x23,0xCB,0x43,0x39,0xD8,0x0B,0x77,0x01,0x5F,0x39,0x04,0x43, +0x7B,0xCD,0x0F,0x77,0x01,0x0F,0xA1,0x0A,0x4F,0x76,0x10,0x0F,0x41,0x06,0x43,0x9B, +0x7C,0x9E,0xC1,0x0B,0xDC,0x01,0x8F,0x6A,0x43,0x3E,0xCD,0x5E,0xD6,0x00,0x5F,0x39, +0x06,0x0F,0x01,0x02,0x0F,0x3C,0x01,0x0A,0xF7,0x00,0x8F,0x37,0x0F,0x3B,0x00,0xD7, +0xB6,0xFB,0x94,0x9E,0xA1,0x5E,0xB5,0x00,0xD7,0x55,0xF9,0xA5,0x98,0x61,0xE7,0xFF, +0xCC,0xC4,0x13,0x6B,0x04,0x13,0x4B,0x01,0xC3,0x00,0x10,0x01,0x43,0x5A,0xDB,0x9A, +0xE0,0xFF,0x18,0x0C,0xD0,0xE4,0x00,0x00,0x4F,0x4F,0x37,0x10,0x43,0x99,0xC4,0x8F, +0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0x4F,0x37,0x10,0x9E,0xE1,0x9F,0x22,0x5E,0xF7, +0x00,0x43,0x99,0xC4,0x8F,0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0xD7,0x57,0xFE,0xEC, +0xC3,0x20,0x10,0x01,0x12,0x8E,0x00,0xFF,0x39,0x0B,0x96,0x9B,0xA0,0x8B,0x19,0x8B, +0xCA,0xE4,0x00,0x01,0x3D,0x1F,0x98,0x02,0x12,0xF8,0xFE,0x12,0xB8,0xFF,0x11,0x98, +0x01,0x13,0x58,0x00,0x0D,0x1C,0x02,0x21,0x04,0x5E,0x43,0x8C,0xDB,0x8F,0x9A,0x4F, +0x9C,0x10,0x8F,0x8A,0x0F,0x9C,0x02,0x41,0x8C,0xDB,0xE4,0x00,0x00,0xCD,0x4D,0xBA, +0x10,0x43,0x9A,0xDC,0x8D,0xAA,0x4F,0x9C,0x10,0x0D,0xAD,0x02,0x8F,0x8A,0x0F,0x9C, +0x02,0x8F,0x8D,0xE7,0xFF,0xFF,0xC9,0x21,0x04,0x5A,0x41,0xB7,0x64,0x4D,0xAD,0x10, +0x8D,0xAA,0x0D,0xAD,0x02,0xD5,0xBC,0x01,0x94,0xE4,0x00,0x00,0x65,0x4D,0xB7,0x10, +0x42,0xD7,0xDC,0x8D,0xBE,0x4E,0xD6,0x10,0x0D,0xAD,0x02,0x8E,0xDE,0x0E,0xD6,0x02, +0x8E,0xCD,0xD6,0xDC,0x00,0xC8,0x43,0x57,0x64,0x4F,0x5A,0x10,0x8F,0x5E,0x0F,0x9A, +0x02,0x8F,0x8D,0xE4,0x00,0x00,0x0D,0x8B,0x8D,0x8B,0x57,0x9E,0xE1,0x5E,0xF7,0x00, +0xD6,0xF5,0xFD,0xB8,0x1B,0x58,0x00,0x9F,0xA1,0x1F,0x18,0x30,0x5F,0xBD,0x00,0xD7, +0xB4,0xFB,0x36,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x1E,0xC2,0xE0,0x10,0x01,0x1F, +0x98,0xFF,0xF3,0x57,0x04,0x50,0x1F,0xB8,0xFD,0xC2,0xE0,0x10,0x01,0x1E,0xB8,0xFC, +0x11,0x8E,0x00,0x5D,0x1C,0x00,0x1D,0xB8,0xFE,0xFE,0xF7,0x0B,0x95,0x9B,0x60,0x8A, +0x9C,0x5F,0xBD,0x00,0x5E,0xB5,0x00,0x9A,0xC2,0x1C,0x78,0xFD,0xE4,0x00,0x00,0xEB, +0x13,0x17,0x01,0xD7,0x1C,0x00,0x76,0x19,0x17,0x00,0x18,0x77,0xFF,0xE4,0x00,0x00, +0xB9,0x23,0x00,0x36,0x1A,0xD7,0x00,0x18,0x17,0xFF,0xE4,0x00,0x00,0x9F,0x23,0x04, +0x56,0x5F,0x40,0x29,0x9F,0x1F,0x4B,0xC2,0x1B,0x1B,0x17,0xFF,0x1B,0xD7,0x00,0xE4, +0x00,0x00,0x75,0xD7,0x0D,0x00,0x8E,0x5F,0x40,0x29,0x1A,0x97,0x00,0x4B,0xDD,0xA8, +0xE4,0x00,0x00,0x4D,0x1F,0xD8,0x01,0x5F,0xDE,0x00,0x23,0x44,0x22,0x9F,0x02,0x5F, +0xD8,0x00,0x1B,0xD7,0x00,0x13,0xD7,0x01,0x23,0x44,0x26,0x9F,0xDE,0xE4,0x00,0x00, +0x0D,0x9F,0xDF,0x5F,0xDE,0x00,0x1B,0xD7,0xFF,0x9F,0x61,0x1E,0xF7,0x30,0x5F,0x7B, +0x00,0xD7,0x6C,0xFC,0x7E,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x25,0x56,0xF7,0x08, +0xD2,0xE0,0x08,0x6A,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xF3,0x57,0x0B,0x1E,0x9B,0xA0, +0xC2,0xE0,0x10,0x01,0x1E,0xDA,0xFE,0xEA,0x97,0x01,0x7E,0x8B,0x78,0x8B,0x9D,0x98, +0x60,0x9A,0xA1,0xE4,0x00,0x01,0xBF,0x12,0xF9,0x00,0xD2,0xE1,0x06,0x99,0xD6,0xD7, +0x06,0x78,0x1D,0x17,0xFF,0x1D,0xB7,0x01,0x1D,0x39,0x02,0x5D,0x08,0x00,0x5D,0xAD, +0x00,0x0F,0xC9,0x02,0x23,0xC4,0xDE,0x13,0x79,0x01,0x43,0x7A,0xDB,0x5F,0x7B,0x00, +0x8D,0xBB,0x8D,0x1B,0x8E,0xFB,0x4D,0xAD,0x10,0x4D,0x08,0x10,0x8D,0xAA,0x8D,0x0A, +0x0F,0xAD,0x02,0x0F,0x88,0x02,0x4E,0xF7,0x10,0x5F,0xBC,0x15,0x8E,0xEA,0x4B,0x9D, +0xE0,0x0F,0x77,0x02,0x5F,0x9C,0x06,0xE4,0x00,0x00,0xCD,0x23,0xC9,0xA2,0x13,0x79, +0x01,0x43,0xBB,0xD3,0x5F,0xBD,0x00,0x43,0x8D,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x43, +0x75,0xDD,0x0F,0xDC,0x02,0x43,0x7A,0xDB,0x5F,0x7B,0x00,0x8D,0xBB,0x4D,0xAD,0x10, +0x8D,0xAA,0x0F,0x8D,0x02,0x8F,0xDC,0x43,0x88,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x8D, +0x1B,0x0D,0xBC,0x02,0x8F,0xB7,0x4D,0x08,0x10,0x8E,0xFB,0x8D,0x0A,0x4F,0xBD,0x10, +0x0F,0x88,0x02,0x8F,0xAA,0x8F,0x8D,0x4E,0xF7,0x10,0x5F,0xDC,0x15,0x8E,0xEA,0x4B, +0x9E,0xE0,0x0F,0x7D,0x02,0x0E,0xF7,0x02,0x5F,0x9C,0x06,0x8F,0x77,0x8B,0xB4,0xE4, +0x00,0x00,0x0F,0x23,0xC0,0x68,0xC3,0x60,0x7C,0xEC,0x20,0x00,0x4D,0x42,0xFB,0xE5, +0xD7,0xB7,0x00,0x68,0x4E,0xF5,0xC4,0x44,0x63,0xBD,0x5C,0x63,0x00,0x9F,0x01,0x1F, +0x39,0x30,0x5E,0xF8,0x00,0xD5,0x97,0xF9,0x15,0xE7,0xFF,0xCD,0xF4,0x1E,0xC1,0x68, +0x10,0x8B,0x00,0x88,0x76,0x98,0xA0,0x99,0xA0,0xE4,0x00,0x96,0x3E,0x89,0x8D,0xC2, +0x80,0x10,0x01,0xE4,0x00,0x01,0x3F,0xCC,0x6C,0x00,0x30,0xEB,0x74,0x08,0x3F,0x42, +0xA3,0x74,0x57,0x7B,0x02,0x13,0x55,0x04,0x13,0x35,0x05,0x13,0x15,0x07,0x23,0x61, +0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x0F,0x01,0x00,0x0F,0x21,0x08,0x0F,0x41,0x04, +0x1C,0x61,0x52,0x98,0xE1,0xE7,0xFF,0xD2,0xE4,0x0F,0x01,0x02,0x0F,0x21,0x0A,0x0F, +0x41,0x06,0x20,0x61,0x14,0x1C,0x61,0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD4,0x54,0x20,0x60,0xCC,0x0B,0x21,0x52,0x0B,0x01,0x54,0xCF,0x39,0x00, +0x07,0xCF,0x18,0x00,0x03,0x9A,0xEA,0x8F,0x19,0x43,0x18,0xB8,0x0F,0x15,0x17,0xE4, +0x00,0x00,0x47,0x8C,0x6E,0x88,0x9A,0x1C,0x63,0x16,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD2,0x4E,0x20,0x60,0x3A,0x9A,0xE1,0x4E,0xF7,0x64,0x45,0xAD,0xBD,0x5D, +0xAD,0x00,0x88,0x76,0x10,0x8B,0x00,0x98,0xA1,0x9D,0x81,0xE4,0x00,0x94,0xFA,0x5D, +0x8C,0x00,0x12,0xEE,0x00,0xD6,0xEC,0xFB,0x15,0x88,0x6D,0xE7,0xFF,0xCC,0x70,0x9E, +0x01,0x0F,0x21,0x0E,0x5E,0x10,0x00,0xD7,0x30,0xD8,0x7D,0x88,0x71,0x10,0x8B,0x00, +0x98,0xA1,0xE4,0x00,0x94,0xAC,0xED,0x21,0x00,0xFE,0xEE,0xC1,0x00,0xCA,0xEE,0xA1, +0x00,0xCE,0xEE,0x81,0x00,0xD2,0xEE,0x61,0x00,0xD6,0xEE,0x41,0x00,0xDA,0xEE,0x21, +0x00,0xDE,0xEE,0x01,0x00,0xE2,0xED,0xE1,0x00,0xE6,0xED,0xC1,0x00,0xEA,0xED,0xA1, +0x00,0xEE,0xED,0x81,0x00,0xF2,0xED,0x61,0x00,0xF6,0xED,0x41,0x00,0xFA,0xFC,0x21, +0x01,0x00,0x85,0x29,0x20,0x60,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x34,0x85, +0x29,0x20,0x60,0x4E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x00,0xFC,0xC2,0xE0,0x10,0x01, +0xEC,0xB7,0x01,0x30,0x85,0x29,0x20,0x60,0x5E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04, +0x8C,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0x90,0xE4,0x00,0x00,0x5D,0x20,0x64,0x5E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0xBC,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0xB4, +0xE4,0x00,0x00,0x2F,0x20,0x68,0x4E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0xAC,0xC2, +0xE0,0x10,0x01,0xEC,0xB7,0x04,0x88,0x85,0x29,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01, +0xEC,0x97,0x04,0xA8,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x3E,0xC2,0xE0,0x10,0x01, +0xEC,0x97,0x01,0x3B,0xE4,0x00,0x00,0x3D,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC, +0x97,0x01,0x1D,0xE4,0x00,0x00,0x1F,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97, +0x01,0x41,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97, +0x01,0x01,0xE4,0x00,0x00,0x3D,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01, +0x39,0xE4,0x00,0x00,0x1F,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x19, +0x85,0x29,0x5C,0x84,0x04,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x1B, +0x85,0x29,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0x81, +0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14, +0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0x0E,0xC1,0x00,0x20, +0x65,0x70,0x20,0x60,0x4C,0xD0,0x62,0x04,0x42,0x99,0xC0,0x89,0xEE,0xD0,0x63,0x06, +0x66,0xE4,0x00,0x01,0x71,0xC2,0xE0,0x10,0x01,0xEE,0xD7,0x00,0xFE,0xC2,0xE0,0x10, +0x01,0xEE,0xB7,0x01,0x32,0xC2,0xE0,0x10,0x01,0xEE,0x97,0x04,0x8E,0xC2,0xE0,0x10, +0x01,0xEE,0x77,0x04,0x92,0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01,0x3B,0xC2,0xE0,0x10, +0x01,0x9A,0x00,0xE9,0xD7,0x01,0x01,0x99,0xA0,0xC2,0xE0,0x10,0x01,0x9A,0x21,0xED, +0x77,0x01,0x36,0x9A,0x45,0x89,0x90,0xE4,0x00,0x00,0xD9,0xC2,0xE0,0x10,0x01,0xEE, +0x97,0x04,0xBE,0xC2,0xE0,0x10,0x01,0xEE,0x77,0x04,0xB6,0xC2,0xE0,0x10,0x01,0x99, +0xA0,0xE9,0xF7,0x01,0x1D,0x9A,0x00,0xC2,0xE0,0x10,0x01,0x8A,0x2D,0xE9,0xD7,0x01, +0x39,0x9A,0x40,0x99,0x61,0x89,0x90,0x9A,0xA0,0xE4,0x00,0x00,0x71,0xC2,0xE0,0x10, +0x01,0xEE,0x97,0x04,0xAE,0xC2,0xE0,0x10,0x01,0xEE,0x17,0x04,0xAA,0xC2,0xE0,0x10, +0x01,0xE9,0xF7,0x01,0x41,0xC2,0xE0,0x10,0x01,0x99,0x81,0xE9,0xD7,0x01,0x19,0x9A, +0x21,0xC2,0xE0,0x10,0x01,0x9A,0x40,0xE9,0xB7,0x01,0x1B,0x99,0x61,0x9A,0x60,0x8A, +0xAC,0x9A,0xC1,0x99,0x41,0xE4,0x00,0x00,0x55,0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01, +0x3B,0xC2,0xE0,0x10,0x01,0xE9,0xD7,0x01,0x01,0x99,0xA0,0x9A,0x40,0x9A,0x00,0x9A, +0x80,0x9A,0xA0,0x8A,0x2D,0x89,0x72,0x8A,0x70,0x89,0x94,0x8A,0xD5,0x99,0x40,0x88, +0x6A,0xE4,0x00,0xDF,0xF6,0x88,0x6A,0xE4,0x00,0xE0,0x78,0x88,0x76,0xE4,0x00,0xF4, +0x26,0x88,0x75,0xE4,0x00,0xF4,0x80,0x88,0x74,0xE4,0x00,0xE1,0xD8,0x88,0x73,0xE4, +0x00,0xE2,0x24,0x88,0x72,0xE4,0x00,0xE1,0x26,0x88,0x71,0xE4,0x00,0xE1,0x52,0x88, +0x6A,0xE4,0x00,0xF5,0xA2,0x88,0x70,0xE4,0x00,0xF5,0xFC,0x98,0x60,0xE4,0x00,0xF6, +0x4A,0x98,0x60,0xE4,0x00,0xF6,0x98,0x98,0x60,0xE4,0x00,0xF6,0xE6,0x98,0x60,0xE4, +0x00,0xF7,0x34,0x88,0x6F,0xE4,0x00,0xE2,0x1E,0x88,0x6E,0xE4,0x00,0xE2,0x4C,0x88, +0x6D,0xE4,0x00,0xE2,0x80,0x88,0x6C,0xE4,0x00,0xE2,0x9A,0x88,0x6B,0x0E,0xC1,0x02, +0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E, +0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61, +0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0xE4,0x00,0xDF,0xE3,0xC2,0xE0, +0x10,0x01,0xF0,0x77,0x04,0xA4,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x04,0xA4, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x04,0xA4,0x9F,0x01,0xFB,0x17,0x04,0xA4, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x04,0xB8,0x85,0x29,0xC2,0xE0,0x10,0x01, +0xF8,0x77,0x04,0xB8,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x04,0xB8,0x9F,0x01, +0xFB,0x17,0x04,0xB8,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x01,0x14,0x85,0x29, +0xC3,0x40,0x10,0x01,0xFF,0x5A,0x01,0x04,0x0C,0x1A,0x00,0x9A,0xE1,0xC3,0x20,0x10, +0x01,0xFF,0x39,0x01,0x20,0x0E,0xF9,0x00,0xC3,0x00,0x10,0x01,0xFF,0x18,0x04,0x94, +0x0C,0x18,0x00,0x0C,0x1A,0x04,0x0E,0xF9,0x04,0x0C,0x18,0x04,0x0C,0x1A,0x08,0x0E, +0xF9,0x08,0x0C,0x18,0x08,0x0C,0x1A,0x0C,0x0E,0xF9,0x0C,0x0C,0x18,0x0C,0xC3,0x00, +0x10,0x01,0xEE,0xF8,0x01,0x3C,0x85,0x29,0x9C,0x38,0x0D,0x41,0x04,0xC3,0x00,0x10, +0x01,0xC2,0xE0,0x10,0x01,0x5C,0xA5,0x00,0x5C,0xC6,0x00,0xF3,0x38,0x04,0xB9,0xFE, +0xF7,0x01,0x3C,0xD7,0x25,0x00,0x6A,0xF8,0xB8,0x04,0xB9,0x9B,0x01,0x0F,0x17,0x00, +0xC3,0x80,0x10,0x01,0xC3,0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x9C,0x01,0x20,0xFF, +0x18,0x01,0x04,0x23,0x24,0x9A,0x0B,0xA3,0x00,0x4F,0x46,0x18,0x43,0x78,0xD4,0x0F, +0xBB,0x00,0x0B,0xA4,0x00,0x0F,0xBB,0x04,0x8F,0x5C,0x0F,0x3A,0x00,0x0F,0x3A,0x04, +0x40,0xA5,0x35,0x20,0xA4,0x1A,0x0C,0x17,0x00,0x4E,0xE6,0x18,0x8E,0xF8,0x0C,0xF7, +0x02,0x08,0xA3,0x00,0x0D,0x17,0x02,0x0F,0xB7,0x06,0x0F,0x37,0x06,0x42,0xE7,0x2D, +0x4C,0xF7,0xFA,0x46,0xE7,0xBE,0x0B,0x44,0x00,0x40,0xF7,0x3D,0x43,0x39,0xD5,0x4E, +0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0x41,0x08,0x2D,0x43,0xBD,0xD5,0x4F,0xC8, +0xFA,0x4F,0x7D,0xFA,0x45,0x1E,0x46,0x47,0xBB,0xEE,0x43,0xC8,0xF5,0x43,0x7D,0xDD, +0x43,0xC7,0xF3,0x43,0x7B,0xBB,0x9B,0x21,0x8F,0x7E,0x9A,0xE3,0xE4,0x00,0x00,0x11, +0x8F,0x37,0x9E,0xE2,0xD7,0x3B,0xFF,0xE1,0xC3,0x20,0x10,0x01,0x4E,0xF7,0x09,0x53, +0x40,0x1E,0x9E,0xFF,0x5E,0xF7,0x06,0xEE,0xF9,0x04,0xC0,0xC3,0x20,0x10,0x01,0x42, +0xF7,0xD1,0xEF,0x39,0x01,0x16,0x42,0xF7,0xBB,0x43,0x39,0xBD,0xC2,0xE0,0x10,0x01, +0x5F,0x23,0x11,0x20,0x00,0x1B,0x53,0x20,0x19,0xEF,0x37,0x04,0xB0,0xC3,0xA0,0x10, +0x01,0xEC,0xB7,0x04,0xB2,0x4C,0xC6,0x08,0x9A,0xE0,0xFF,0xBD,0x04,0x94,0xCB,0x40, +0x10,0x00,0x43,0x26,0xBC,0x4F,0x39,0x10,0x43,0x7C,0xCC,0xC9,0x40,0xA0,0x00,0x0D, +0x1B,0x02,0x0F,0xDB,0x02,0x43,0x68,0x53,0xCF,0xDE,0x00,0x0A,0x8F,0xC5,0x43,0xDB, +0xF0,0x43,0x7D,0xCC,0x0F,0xDB,0x00,0x5F,0xD7,0x00,0x23,0xC0,0x92,0x43,0xD8,0xCC, +0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E,0x02,0x0B,0xC3,0x00,0x43,0x3E,0xCD,0x43, +0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F,0x23,0x01,0xE4,0x00,0x00,0x43,0x43,0xD8, +0xCC,0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E,0x02,0x0B,0xC4,0x00,0x43,0x3E,0xCD, +0x43,0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F,0x24,0x01,0x43,0x66,0xBC,0x4F,0x7B, +0x10,0x43,0xD8,0xDC,0x0F,0x3E,0x00,0x43,0x3C,0xDC,0x8F,0x7D,0x0F,0xD9,0x02,0x0D, +0x1B,0x02,0x0F,0x79,0x02,0x43,0x68,0xDB,0x43,0x7B,0xD0,0x43,0x7E,0xDD,0x0F,0x79, +0x00,0x9E,0xE1,0xD2,0xE2,0xFB,0x7E,0x0D,0x41,0x06,0x9C,0x28,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x05,0x1A,0x13,0x17,0x20,0x43,0x37,0xC4,0x9F,0x01,0x18,0x79, +0x00,0x5F,0x18,0x00,0x1B,0x17,0x20,0xC3,0x20,0x10,0x01,0xC2,0xE0,0x10,0x01,0x5F, +0x04,0xDB,0xFF,0x39,0x05,0x4E,0xFE,0xF7,0x05,0xA0,0x20,0x00,0x91,0x4F,0x18,0x08, +0xC3,0x40,0x10,0x01,0x8F,0x38,0xEB,0x5A,0x05,0x49,0x8F,0x17,0x0F,0x59,0x01,0xC2, +0xE0,0x10,0x01,0xEA,0xF7,0x05,0xF3,0x0E,0xF8,0x01,0xE4,0x00,0x00,0x1D,0xFF,0x00, +0x7F,0xFF,0x0F,0x19,0x4F,0x0F,0x17,0x4F,0x85,0x29,0xC3,0x00,0x10,0x01,0x5C,0x84, +0x02,0x9A,0xE0,0xFF,0x18,0x05,0x1A,0xE4,0x00,0x00,0x51,0x43,0x38,0xBC,0x43,0x63, +0xBC,0x13,0x59,0x00,0x9E,0xE1,0x8F,0x44,0x5E,0xF7,0x00,0x1F,0x5A,0x40,0x4F,0x3A, +0xFA,0x4F,0x39,0xD1,0x8F,0x59,0x57,0x5A,0x3F,0x43,0x3A,0xCD,0x1B,0x3B,0x00,0x13, +0x38,0x20,0xD7,0x37,0xFE,0xCD,0x85,0x29,0xC3,0x18,0x00,0x21,0x5F,0x23,0x00,0xFF, +0x18,0xB6,0xFE,0x9A,0xE0,0x5C,0x77,0x00,0x0B,0x78,0x01,0x9B,0x5F,0x5C,0x62,0x01, +0x20,0x00,0x19,0x0B,0x58,0x03,0xD7,0x64,0x01,0x7D,0xD7,0x44,0x01,0x59,0x23,0x24, +0x36,0x40,0x60,0xBD,0x54,0x63,0x3F,0xE4,0x00,0x00,0x57,0x23,0x28,0x2A,0x1C,0x63, +0x20,0xE4,0x00,0x00,0x1B,0x23,0x2C,0x76,0x52,0xE0,0x20,0x40,0x77,0x1D,0x5C,0x63, +0x00,0xE4,0x00,0x00,0x23,0x9E,0xE1,0x9F,0x02,0x5E,0xE2,0x29,0x23,0xFE,0xE5,0x50, +0x60,0xFF,0x85,0x29,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x06,0x4A,0x0B,0x17,0x07,0x0A, +0xF7,0x01,0x40,0x63,0xC3,0x40,0x63,0xB8,0x9A,0xEA,0x40,0x63,0xB8,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x01,0x44,0x0B,0x17,0x06,0x0A,0xF7,0x04,0xD7,0x17,0x00, +0x92,0xCC,0x63,0x07,0xD0,0x42,0xF8,0xBD,0x40,0x63,0xB8,0xE4,0x00,0x00,0x0D,0x98, +0x60,0x85,0x29,0x8B,0x23,0x20,0x80,0x96,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFE,0xF7, +0x01,0x44,0x0B,0x17,0x02,0x0A,0xF7,0x00,0xD7,0x17,0x00,0xDA,0xCC,0x79,0x07,0xD0, +0x42,0xF8,0xBD,0x40,0x63,0xB8,0xE4,0x00,0x00,0x1B,0x20,0x84,0x1E,0xE7,0xFF,0xFF, +0x65,0x98,0x60,0x85,0x29,0x5C,0x84,0x00,0x5C,0xA5,0x00,0x4C,0x84,0x30,0x5C,0xC6, +0x00,0x8C,0x85,0x4C,0x84,0x08,0x8C,0x64,0xD0,0xC8,0x00,0x59,0x0C,0x03,0x01,0xE4, +0x00,0x00,0x3F,0x52,0xE0,0x64,0x20,0xC0,0x54,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB6, +0xFA,0x9C,0xC1,0x4C,0xC6,0x0A,0x8C,0xD7,0x12,0xE6,0xFF,0x0E,0xE3,0x01,0x85,0x29, +0xFC,0x21,0xFE,0x88,0xEE,0x21,0x01,0x54,0xEE,0x41,0x01,0x50,0xED,0x21,0x01,0x74, +0xED,0x41,0x01,0x70,0xED,0x61,0x01,0x6C,0xED,0x81,0x01,0x68,0xED,0xA1,0x01,0x64, +0xED,0xC1,0x01,0x60,0xED,0xE1,0x01,0x5C,0xEE,0x01,0x01,0x58,0xEE,0x61,0x01,0x4C, +0xEE,0x81,0x01,0x48,0xEE,0xA1,0x01,0x44,0x5E,0x23,0x00,0x8A,0x44,0x5C,0xA5,0x00, +0x4F,0x11,0x08,0x9A,0xE1,0xD4,0xB8,0x00,0x94,0x43,0x18,0x28,0x9A,0xE0,0x23,0x00, +0x24,0x1E,0xF8,0x01,0x5E,0xF7,0x00,0x43,0x05,0xBB,0x5F,0x08,0x11,0x20,0x00,0x21, +0x9E,0xFF,0x5E,0xF7,0x00,0x42,0x17,0x2B,0x8B,0x41,0x5E,0x10,0x00,0x9B,0x00,0x41, +0xD0,0x8D,0x9D,0xC2,0x5D,0xCE,0x00,0xE4,0x00,0x00,0x4D,0x43,0x7A,0xCC,0x13,0xBC, +0x00,0x9F,0x21,0x1B,0xBB,0x00,0xE4,0x00,0x00,0x13,0x9B,0x20,0x43,0x86,0xC4,0x5F, +0x79,0x00,0xD6,0xFB,0xFF,0x4D,0x9F,0x01,0x8F,0x57,0x5F,0x18,0x00,0xD7,0x05,0xFF, +0x6E,0x99,0x60,0x52,0x80,0x40,0xE4,0x00,0x01,0xC9,0x21,0x60,0x56,0x13,0x12,0x00, +0x1E,0xE1,0x00,0x1F,0x18,0x40,0x8E,0xED,0x12,0xF7,0x00,0xE4,0x00,0x00,0x21,0x13, +0x15,0x00,0x42,0xF3,0x6C,0x1F,0x18,0x40,0x12,0xF7,0xFF,0x43,0x18,0xBD,0x4E,0xF8, +0xFA,0x4E,0xF7,0xD1,0x40,0xD8,0xBC,0x54,0xC6,0x3F,0x40,0xC6,0xBD,0x5C,0xC6,0x00, +0x5C,0xC4,0x13,0x20,0x00,0x25,0x40,0xD4,0x35,0x5C,0xC6,0x00,0x1C,0x61,0x40,0x21, +0x60,0x7A,0x98,0x80,0x88,0xAC,0xE7,0xFF,0xFD,0x9E,0x21,0x81,0x78,0x0B,0x0A,0x81, +0xEA,0xEA,0xFF,0x7F,0x8E,0xF8,0x0E,0xEA,0x81,0xE4,0x00,0x00,0x9F,0x98,0x81,0x88, +0xAC,0x21,0x64,0x56,0xE7,0xFF,0xFD,0x62,0x21,0x81,0x00,0x0B,0x0A,0xFF,0xEA,0xEA, +0xFF,0x7F,0xE4,0x00,0x00,0x45,0xE7,0xFF,0xFD,0x3E,0x21,0x80,0x52,0xEB,0x01,0x00, +0xC1,0x0A,0xE1,0x41,0x8E,0xF8,0xEE,0xE1,0x00,0xC1,0xE4,0x00,0x00,0x3D,0x0B,0x0A, +0xFF,0x0A,0xEA,0x81,0x5F,0x57,0x04,0x5F,0x38,0x04,0xD7,0x3A,0x00,0x31,0x8A,0xF8, +0x0B,0x0A,0x01,0x8E,0xF8,0x0E,0xEA,0x01,0x9D,0xA1,0x9D,0x42,0x5D,0x8D,0x00,0xD5, +0xCC,0xFA,0x5D,0x21,0x60,0x76,0x9D,0x61,0x5D,0x6B,0x00,0xE4,0x00,0x00,0x3F,0x0B, +0x0F,0x01,0x9E,0xE1,0x0F,0x0F,0x81,0x5E,0xF7,0x00,0x9D,0xE2,0xE4,0x00,0x00,0x0D, +0x9A,0xE0,0xD6,0xEE,0xFF,0x6E,0xE7,0xFF,0xFF,0xC1,0xD5,0x71,0x00,0xC2,0xFD,0xE1, +0x00,0xC0,0x1E,0x61,0x00,0x89,0x4F,0x99,0xA0,0x42,0xB2,0x5C,0x8E,0x6B,0xE7,0xFF, +0xFF,0x7D,0x21,0x64,0x26,0x9D,0xDF,0xE4,0x00,0x00,0x0F,0x1D,0xCE,0x3F,0xFE,0xE1, +0x01,0x40,0x4D,0xCE,0x08,0x8D,0xD7,0xE8,0x6E,0xFF,0x01,0x42,0x03,0x80,0xEE,0xA1, +0x01,0x46,0x5C,0x70,0x00,0xEE,0x81,0x01,0x4A,0xEE,0x61,0x01,0x4E,0xEE,0x41,0x01, +0x52,0xEE,0x21,0x01,0x56,0xEE,0x01,0x01,0x5A,0xED,0xE1,0x01,0x5E,0xED,0xC1,0x01, +0x62,0xED,0xA1,0x01,0x66,0xED,0x81,0x01,0x6A,0xED,0x61,0x01,0x6E,0xED,0x41,0x01, +0x72,0xED,0x21,0x01,0x76,0xFC,0x21,0x01,0x78,0x85,0x29,0x5C,0x84,0x06,0x5C,0xA5, +0x06,0x43,0x24,0x2C,0x9B,0x02,0x43,0x19,0xC0,0x53,0x20,0x1E,0x5E,0xE3,0x06,0xC7, +0x18,0xFF,0xFF,0x40,0x84,0x2D,0x98,0x60,0xCC,0x84,0x00,0x0A,0x40,0x84,0xC8,0xC4, +0x84,0xFF,0xFF,0x43,0x38,0x25,0xD6,0xF9,0x00,0x60,0x8C,0x98,0x5C,0x97,0x1D,0x48, +0x61,0x01,0x85,0x29,0x24,0x80,0x68,0x24,0x7C,0x34,0xCE,0xE3,0x03,0xE8,0x98,0x61, +0xE4,0x00,0x00,0x49,0xCE,0xE3,0xFC,0x18,0x98,0x64,0xE4,0x00,0x00,0x35,0x20,0x80, +0x74,0x24,0x7C,0x34,0xCE,0xE3,0xFC,0x18,0x98,0x62,0xE4,0x00,0x00,0x15,0xCE,0xE3, +0x03,0xE8,0x98,0x63,0x40,0x97,0x20,0xE7,0xFF,0xF9,0x23,0x9A,0xE0,0x20,0x60,0x3C, +0x5C,0x60,0x11,0x52,0xE0,0x30,0x53,0x00,0x10,0x4A,0xF8,0xB8,0x88,0x77,0x85,0x29, +0x0A,0xE3,0x00,0x26,0xFC,0x60,0xC3,0x00,0x10,0x01,0xEB,0x18,0x06,0x51,0x5F,0x38, +0x06,0x5E,0xF8,0x1D,0x4A,0xF9,0xB8,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x0E,0xE3,0x01, +0xC3,0x00,0x10,0x01,0x0A,0xE4,0x00,0xFF,0x18,0x06,0x4A,0x26,0xFC,0x4C,0x0B,0x38, +0x07,0x5F,0x59,0x06,0x5E,0xF9,0x1D,0x4A,0xFA,0xB8,0xE4,0x00,0x00,0x0D,0x9A,0xE0, +0x0E,0xE4,0x01,0x13,0x38,0x04,0x23,0x28,0x64,0x23,0x2C,0x8C,0x23,0x20,0xA6,0x0B, +0x23,0x00,0x0E,0xE3,0x01,0x0A,0xF8,0x07,0x42,0xF7,0xCD,0xE4,0x00,0x00,0x15,0x0B, +0x18,0x09,0x42,0xF8,0xBD,0x0E,0xE4,0x01,0xE4,0x00,0x00,0x1B,0x0B,0x03,0x00,0x0E, +0xE3,0x01,0x0F,0x04,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0x6D,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x06,0x59,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D, +0x61,0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0C,0x61,0x07,0x0C,0x81,0x05,0x0D,0x21, +0x2C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E,0x21,0x0C,0x5D,0xA5,0x00, +0x1C,0x61,0x06,0x1C,0x81,0x04,0xE7,0xFF,0xFE,0x94,0xC2,0xE0,0x10,0x01,0x09,0x81, +0x04,0xFF,0x17,0x06,0x4A,0xEA,0xF7,0x06,0x4B,0x0B,0x18,0x03,0x41,0x8C,0xC3,0x41, +0x8C,0xB8,0x5D,0x8C,0x06,0x0D,0x81,0x05,0xC1,0x40,0x10,0x01,0xC1,0x60,0x10,0x01, +0xFD,0x4A,0x05,0x3C,0xFD,0x6B,0x05,0x40,0xD1,0xA1,0x06,0x9E,0xC1,0xC0,0x10,0x01, +0xC1,0xA0,0x10,0x01,0x0E,0xEA,0x02,0xFD,0xCE,0x05,0x18,0xFD,0xAD,0x05,0x9E,0x22, +0xE4,0x68,0x22,0xE0,0x34,0x98,0x60,0xD2,0xE3,0x08,0x25,0xE4,0x00,0x00,0xD7,0x0A, +0xE1,0x07,0x0E,0xED,0x01,0xE4,0x00,0x00,0xAB,0xC2,0xE0,0x10,0x01,0x0A,0x21,0x06, +0xEE,0x37,0x05,0x15,0xC2,0xE0,0x10,0x01,0x09,0xED,0x00,0xED,0x97,0x06,0x47,0x41, +0xEF,0x8D,0x4E,0xEF,0xFA,0x0A,0x0E,0x00,0x45,0xF7,0x7E,0x42,0x10,0x65,0x41,0xEF, +0xBD,0x4E,0xF0,0xFA,0x46,0x17,0x86,0x42,0x10,0xBD,0xC2,0xE0,0x10,0x01,0xE8,0x77, +0x06,0x59,0xE7,0xFF,0xF7,0x04,0x42,0x10,0x83,0x41,0xEF,0x7B,0x40,0x63,0x1B,0x8D, +0xF0,0x9A,0xE3,0xD5,0xE3,0x05,0x18,0x0E,0x2D,0x01,0x0D,0x8E,0x01,0x0C,0x0B,0x01, +0x9A,0xE2,0xE4,0x00,0x01,0x29,0x0A,0xE1,0x06,0x09,0xAD,0x00,0x41,0xAD,0xBD,0x4E, +0xED,0xFA,0x45,0xB7,0x6E,0x41,0xAD,0xBD,0x0A,0xEE,0x00,0x41,0x97,0x65,0x4E,0xEC, +0xFA,0x45,0x97,0x66,0x41,0x8C,0xBD,0xC2,0xE0,0x10,0x01,0x41,0x8C,0x63,0xE8,0x77, +0x06,0x59,0x41,0xAD,0x6B,0xE7,0xFF,0xF6,0x5E,0x8D,0x8D,0x40,0x63,0x1B,0xD5,0x83, +0x01,0x88,0x9A,0xE4,0x0E,0xEA,0x00,0xE4,0x00,0x00,0x51,0x21,0xA1,0x26,0x0E,0xEA, +0x02,0x22,0xE8,0x60,0x26,0xE8,0x2B,0x22,0xE5,0x0A,0xE4,0x00,0x00,0x2B,0x22,0xEC, +0x90,0xD2,0xE4,0x01,0xC6,0xE4,0x00,0x00,0x51,0x9A,0xE1,0xE4,0x00,0x00,0x57,0xC2, +0xE0,0x10,0x01,0x0B,0x0B,0x01,0xEA,0xF7,0x06,0x6D,0xD7,0x17,0x00,0xF9,0xE4,0x00, +0x00,0x2D,0x9A,0xE4,0x98,0x61,0x0E,0xEA,0x00,0xE4,0x00,0x00,0x25,0x0C,0x0A,0x00, +0xE4,0x00,0x00,0x13,0x9A,0xE4,0x0E,0xEA,0x00,0x98,0x60,0x0A,0xEB,0x01,0x0E,0x21, +0x0E,0x9E,0xE1,0x0E,0x01,0x12,0x0E,0xEB,0x01,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D, +0xA1,0x1E,0x0D,0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21, +0x30,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x05,0x45,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x06,0x5C,0x85,0x29,0x9B,0x01,0xC2,0xE0,0x10,0x01,0x1C,0x21,0xB0,0xFB,0x17, +0x05,0x42,0x0D,0x41,0x48,0x0D,0x61,0x44,0x0D,0x81,0x40,0x0E,0x01,0x30,0x0E,0x21, +0x2C,0x0E,0x41,0x28,0x0E,0x61,0x24,0x0E,0x81,0x20,0x0E,0xA1,0x1C,0x0E,0xC1,0x18, +0x0C,0x61,0x17,0x0C,0x81,0x15,0x0D,0x21,0x4C,0x0D,0xA1,0x3C,0x0D,0xC1,0x38,0x0D, +0xE1,0x34,0x1C,0x61,0x16,0x1C,0x81,0x14,0xE7,0xFF,0xFA,0xF0,0xC2,0xE0,0x10,0x01, +0x09,0x41,0x16,0xED,0x57,0x05,0x49,0xC2,0xE0,0x10,0x01,0xFF,0x17,0x06,0x4A,0xEA, +0xF7,0x06,0x4B,0x0B,0x18,0x03,0x09,0x61,0x14,0x41,0x6B,0xC3,0x41,0x6B,0xB8,0xC2, +0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x5D,0x6B,0x06,0xED,0x77,0x05,0xF3,0xEA,0xF8, +0x05,0x45,0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xF8,0x05,0x45,0xC3,0x20,0x10,0x01,0xC2, +0x60,0x10,0x01,0xC2,0x40,0x10,0x01,0xC2,0x80,0x10,0x01,0xC2,0xA0,0x10,0x01,0xC3, +0x00,0x10,0x01,0xC2,0xC0,0x10,0x01,0xC3,0x40,0x10,0x01,0xFF,0x39,0x06,0x48,0xFE, +0x73,0x05,0x4A,0xFE,0x52,0x05,0x16,0xFE,0x34,0x05,0x4C,0xFE,0x15,0x06,0x44,0xFF, +0x18,0x05,0xF4,0xFE,0xD6,0x04,0xC4,0xFD,0x9A,0x01,0x44,0xD2,0xE1,0x04,0x3E,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x05,0x3A,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x05,0x46,0xC2, +0xE0,0x10,0x01,0xC3,0x60,0x10,0x01,0xEC,0x17,0x06,0x5C,0xC3,0x40,0x10,0x01,0x0D, +0x4C,0x01,0x0D,0x4C,0x03,0x0D,0x6C,0x05,0x0D,0x6C,0x07,0x0D,0x4C,0x09,0x0D,0x6C, +0x0B,0x0C,0x0C,0x10,0x0C,0x0C,0x14,0x0D,0x53,0x01,0x0D,0x72,0x01,0x0D,0x51,0x01, +0x0D,0x70,0x01,0x9A,0xE0,0xFF,0x7B,0x05,0x4E,0xFF,0x5A,0x05,0xA0,0x43,0x98,0xBC, +0x0C,0x1C,0x01,0x43,0x96,0xBC,0x0C,0x1C,0x01,0x43,0x9B,0xBC,0x0C,0x1C,0x01,0x43, +0x9A,0xBC,0x0C,0x1C,0x01,0x9E,0xE2,0x5E,0xEA,0x09,0x23,0xFF,0x8D,0x9A,0xE1,0x0D, +0x58,0x01,0x0D,0x76,0x01,0x0D,0x5B,0x01,0x0D,0x7A,0x01,0x1A,0xF9,0x00,0xE4,0x00, +0x03,0x49,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x05,0x3A,0x5E,0xE3,0xBB,0x20,0x04,0xF5, +0x09,0xF3,0x00,0x40,0x8A,0x7D,0x0F,0x01,0x04,0x0C,0x81,0x0C,0x0F,0x21,0x08,0x50, +0x60,0x23,0xE7,0xFF,0xF2,0x44,0x09,0xD2,0x00,0x0C,0x81,0x0E,0x41,0xAB,0x75,0x43, +0x64,0x23,0x42,0xED,0x6B,0x40,0x63,0x1B,0x8E,0xFB,0x0F,0x01,0x06,0x0F,0x21,0x0A, +0xD6,0xE3,0x0B,0x10,0x12,0xF9,0x00,0x5E,0xE4,0xDB,0x20,0x00,0x51,0x4F,0x77,0x08, +0x8F,0x1B,0x8E,0xDB,0x0D,0x58,0x01,0x0D,0x76,0x01,0xE4,0x00,0x00,0x1D,0xFF,0x60, +0x7F,0xFF,0x0F,0x78,0x4F,0x0F,0x76,0x4F,0x1E,0xD7,0x01,0x5E,0xD6,0x00,0x1A,0xD9, +0x00,0x0A,0xEC,0x00,0xD6,0xEA,0x00,0x38,0x0D,0x4C,0x01,0x0B,0x0C,0x02,0x8A,0xEC, +0xD5,0x58,0x00,0x38,0x0D,0x4C,0x03,0x0B,0x17,0x04,0xD7,0x0B,0x00,0x38,0x0D,0x77, +0x05,0x0A,0xEC,0x06,0xD5,0x77,0x00,0x38,0x0D,0x6C,0x07,0x4E,0xE4,0xFA,0x47,0x17, +0x26,0x42,0xF8,0xBD,0x0F,0x0C,0x12,0x8E,0xF8,0x0E,0xEC,0x10,0x4E,0xED,0xFA,0x47, +0x17,0x6E,0x42,0xF8,0xBD,0x0F,0x0C,0x16,0x8E,0xF8,0x88,0x6D,0x0E,0xEC,0x14,0xE7, +0xFF,0xF6,0xCA,0xC3,0x00,0x10,0x01,0xF8,0x78,0x05,0x3B,0xC1,0xA0,0x10,0x01,0x89, +0x83,0x5E,0xE3,0x00,0xFD,0xAD,0x05,0xF0,0x22,0xC9,0x94,0x26,0xC9,0x95,0x13,0x2D, +0x00,0x1F,0x39,0x40,0x43,0x39,0xBD,0x4F,0x19,0xFA,0x4F,0x18,0xD1,0x42,0xF9,0xC4, +0x56,0xF7,0x3F,0x42,0xD7,0xC5,0x5E,0xF6,0x00,0x0E,0xE1,0x10,0x26,0xEC,0x31,0x57, +0x16,0xFF,0x5F,0x07,0x91,0x20,0x01,0x65,0xC3,0x00,0x10,0x01,0xF3,0x18,0x05,0x3A, +0x23,0x00,0xC2,0x08,0x91,0x00,0x40,0x8F,0x25,0x08,0x70,0x00,0x40,0x6E,0x1D,0xE7, +0xFF,0xF6,0x0A,0xE7,0xFF,0xEE,0x56,0x0E,0xE1,0x12,0xD2,0xE7,0x00,0x69,0x56,0xF6, +0xFF,0x5E,0xE7,0x11,0x20,0x01,0x71,0x0D,0xF1,0x01,0x0D,0xD0,0x01,0x19,0x8D,0x00, +0x0D,0x53,0x01,0x0D,0x72,0x01,0xE4,0x00,0x00,0xB9,0x5E,0xE3,0xC9,0x20,0x01,0x55, +0x9B,0x01,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x06,0x5C,0xE4,0x00,0x00,0x91,0x0B,0x10, +0x00,0x0B,0x31,0x00,0x43,0x18,0x75,0x43,0x39,0x7D,0x0F,0x01,0x04,0x0F,0x21,0x08, +0x50,0x60,0x23,0xE7,0xFF,0xEF,0xA2,0x0F,0x21,0x0A,0x0F,0x01,0x06,0x43,0x39,0xCB, +0x43,0x18,0xC3,0x40,0x63,0x1B,0x8F,0x19,0xD7,0x03,0xFC,0x5C,0xE7,0xFF,0xFE,0xF9, +0xC2,0xE0,0x10,0x01,0xF3,0x17,0x05,0x46,0x9F,0x01,0xFB,0x17,0x05,0x46,0xE7,0xFF, +0xFF,0x33,0x0E,0xC1,0x1A,0x0E,0xA1,0x1E,0x0E,0x81,0x22,0x0E,0x61,0x26,0x0E,0x41, +0x2A,0x0E,0x21,0x2E,0x0E,0x01,0x32,0x0D,0xE1,0x36,0x0D,0xC1,0x3A,0x0D,0xA1,0x3E, +0x0D,0x81,0x42,0x0D,0x61,0x46,0x0D,0x41,0x4A,0x0D,0x21,0x4E,0x1C,0x21,0x50,0x85, +0x29,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x06,0x68,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06, +0x64,0x85,0x29,0xFC,0x21,0xFF,0x58,0xED,0x61,0x00,0x9C,0x0E,0xC1,0x70,0xED,0x21, +0x00,0xA4,0xED,0x41,0x00,0xA0,0xED,0x81,0x00,0x98,0xED,0xA1,0x00,0x94,0xED,0xC1, +0x00,0x90,0xED,0xE1,0x00,0x8C,0xEE,0x01,0x00,0x88,0xEE,0x21,0x00,0x84,0xEE,0x41, +0x00,0x80,0x0E,0x61,0x7C,0x0E,0x81,0x78,0x0E,0xA1,0x74,0xFE,0xC1,0x00,0xA8,0xC2, +0xE0,0x10,0x01,0xC1,0x60,0x10,0x01,0xEA,0xF7,0x05,0x4A,0xFD,0x6B,0x01,0x44,0xC3, +0x00,0x10,0x01,0x0C,0x76,0xA0,0xEB,0x18,0x05,0x16,0x0C,0x36,0xA4,0x0E,0xEB,0x0D, +0x0F,0x0B,0x0F,0xC3,0x20,0x10,0x01,0xF3,0x39,0x05,0x3A,0x5F,0x23,0xDB,0x20,0x00, +0x85,0xC3,0x20,0x10,0x01,0xE8,0x79,0x06,0x44,0xC3,0x20,0x10,0x01,0xE8,0x99,0x05, +0x4C,0x40,0x97,0x25,0x40,0x78,0x1D,0xE7,0xFF,0xF3,0x7A,0xE7,0xFF,0xEB,0xC6,0x0C, +0x6B,0x12,0x0D,0x4B,0x16,0x98,0x80,0x0C,0x6B,0x18,0x0D,0x4B,0x1C,0xE7,0xFF,0xEE, +0x0C,0x0C,0x6B,0x10,0x88,0x6A,0xE7,0xFF,0xED,0xB2,0x0B,0x0B,0x00,0x0C,0x6B,0x14, +0xC2,0xE0,0x10,0x01,0x0B,0x2B,0x02,0xEA,0xF7,0x06,0x54,0x43,0x39,0xC5,0xC3,0x00, +0x10,0x01,0xFE,0x38,0x06,0x60,0xD6,0xF9,0x00,0x88,0x0B,0x4B,0x06,0x0B,0x2B,0x04, +0x43,0x3A,0xCD,0xD6,0xF9,0x00,0xEC,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x06,0x5E,0x22, +0xE4,0x44,0xC2,0xE0,0x10,0x01,0xFD,0x57,0x05,0x1A,0x13,0x2A,0x20,0x27,0x24,0x5B, +0xC2,0xE0,0x10,0x01,0xEC,0x16,0xFF,0x78,0xEC,0x17,0x06,0x5C,0x0C,0x16,0x80,0xE4, +0x00,0x10,0x67,0x0C,0x36,0x9C,0x0F,0x31,0x02,0xEC,0x16,0xFF,0x78,0x0F,0x39,0x02, +0x0C,0x16,0x80,0x0B,0x39,0x01,0x0C,0x16,0x90,0x9F,0x27,0x99,0x80,0x4F,0x39,0x19, +0x4F,0x39,0x18,0x40,0x21,0xCD,0xEC,0x36,0xFF,0x70,0x40,0x21,0xCD,0xEC,0x36,0xFF, +0x64,0xE4,0x00,0x0F,0xCB,0x4F,0x0C,0x20,0xEF,0x16,0xFF,0x68,0x0E,0xF7,0x06,0x8E, +0xF8,0x11,0xB7,0x05,0x5D,0xA3,0xFB,0x20,0x00,0x45,0xC3,0x20,0x10,0x01,0xEF,0x19, +0x06,0x6A,0x8B,0x2D,0xE4,0x00,0x00,0x25,0x1F,0x2D,0xE0,0xC3,0x40,0x10,0x01,0x5F, +0x39,0x00,0xEF,0x1A,0x06,0x66,0x9B,0x41,0x4F,0x3A,0xCC,0x47,0x19,0xC4,0xD3,0x00, +0x0A,0x12,0x1F,0x0D,0xFF,0x27,0x0D,0x13,0x10,0xB7,0x04,0x0C,0xD7,0x02,0x10,0x6A, +0x20,0x9A,0xE0,0x20,0xA0,0x30,0x88,0x8A,0xE7,0xFF,0xED,0x10,0x5E,0xE3,0x00,0xEF, +0x16,0xFF,0x72,0x8F,0x0C,0x1A,0xF8,0x00,0x0E,0xF1,0x02,0xEF,0x16,0xFF,0x6A,0x0E, +0xF7,0x06,0x8E,0xF8,0x10,0xAA,0x20,0x10,0x77,0x04,0x0C,0x97,0x02,0x88,0xCA,0x9A, +0xE0,0xD0,0xA0,0x07,0x5E,0xE4,0x00,0x01,0xDD,0x99,0xC0,0x99,0xFB,0x8A,0x0E,0xD1, +0xAA,0x03,0x66,0x99,0xE0,0x1C,0x76,0xA8,0x88,0x8F,0xE7,0xFF,0xEA,0x00,0x0E,0xF1, +0x02,0xEF,0x36,0xFF,0x6A,0x0E,0xF7,0x06,0x10,0x6A,0x20,0x8E,0xF9,0x10,0xB7,0x04, +0x0C,0xD7,0x02,0x20,0xA0,0x54,0x1C,0x96,0xA8,0xE7,0xFF,0xEC,0x4E,0x5C,0x63,0x00, +0xD4,0x70,0x00,0x41,0x8A,0x03,0x89,0xCF,0x9D,0xE4,0x5D,0xEF,0x00,0x5D,0xE8,0x09, +0x23,0xFF,0x15,0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x1A,0x17,0x00,0x5E,0x09,0x73,0x20, +0x02,0xA9,0x1C,0x76,0xA8,0x88,0x8E,0xE7,0xFF,0xE9,0x66,0x0E,0xF1,0x02,0xEF,0x56, +0xFF,0x6A,0x0E,0xF7,0x06,0x8E,0xFA,0xE4,0x00,0x00,0xC9,0x1C,0x76,0xA8,0x88,0x8F, +0xE7,0xFF,0xE9,0x34,0x0E,0xF1,0x02,0xEF,0x16,0xFF,0x6A,0x0E,0xF7,0x06,0x10,0x6A, +0x20,0x8E,0xF8,0x10,0xB7,0x04,0x0C,0xD7,0x02,0x20,0xA0,0x54,0x1C,0x96,0xA8,0xE7, +0xFF,0xEB,0x82,0x5C,0x63,0x00,0xD4,0x70,0x00,0x41,0x8A,0x03,0x89,0xCF,0x9D,0xE1, +0x5D,0xEF,0x02,0xD1,0xE6,0xFE,0x46,0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x1A,0x17,0x00, +0x5E,0x09,0x73,0x20,0x01,0x19,0x1C,0x76,0xA8,0x88,0x8E,0xE7,0xFF,0xE8,0x9E,0x0E, +0xF1,0x02,0xEF,0x36,0xFF,0x6A,0x0E,0xF7,0x06,0x8E,0xF9,0x10,0x77,0x04,0x0C,0x97, +0x02,0x10,0xAA,0x20,0x9A,0xE0,0x20,0xA0,0x34,0x1C,0xD6,0xA8,0xE7,0xFF,0xEA,0xE8, +0x5E,0xE3,0x00,0xEF,0x16,0xFF,0x66,0x8F,0x0C,0x1A,0xF8,0x00,0xE4,0x00,0x00,0x2D, +0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x18,0x17,0x00,0xEE,0xF6,0xFF,0x66,0x8E,0xEC,0x18, +0x17,0x00,0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x12,0xF7,0x00,0x0E,0xF6,0x94,0x5E,0xE9, +0x53,0x20,0x19,0x01,0xEE,0xF6,0xFF,0x66,0x8E,0xEC,0x12,0xF7,0x00,0x0E,0xF6,0x98, +0x5E,0xE8,0xB3,0x20,0x18,0xB9,0x0B,0x4B,0x08,0x0A,0xEB,0x02,0x0B,0x0B,0x00,0x0B, +0x2B,0x06,0xEF,0x56,0xFF,0x58,0xEE,0xF6,0xFF,0x60,0xEF,0x16,0xFF,0x74,0xEF,0x36, +0xFF,0x5C,0x0A,0x0B,0x0C,0x09,0xEB,0x0A,0x09,0xCB,0x0E,0x0A,0x6B,0x04,0xD1,0xA7, +0x01,0x36,0xD5,0xEE,0x2F,0xF8,0x41,0xCE,0x7D,0x4C,0x6E,0xFA,0x45,0xC3,0x76,0x40, +0x6E,0x1D,0xE7,0xFF,0xE8,0xBA,0xC0,0x60,0x18,0xE8,0x20,0x17,0x9D,0x12,0xEA,0x20, +0xE4,0x00,0x08,0xB3,0xEF,0x56,0xFF,0x5A,0x43,0x5A,0x85,0x4E,0xFA,0xFA,0x0F,0x56, +0x84,0x46,0x97,0xD6,0xEF,0x36,0xFF,0x62,0x42,0x94,0xBD,0xEF,0x56,0xFF,0x76,0x42, +0xEF,0x75,0x43,0x39,0xD5,0xEE,0xF6,0xFF,0x7C,0xEF,0x36,0xFF,0x6C,0x4E,0xF7,0xFA, +0xEF,0x16,0xFF,0x7E,0x46,0xB7,0xC6,0x42,0xB5,0xBD,0xEE,0xF6,0xFF,0x5E,0x42,0x57, +0x9D,0xD1,0xA8,0x08,0x7E,0x40,0x77,0x7D,0xE7,0xFF,0xE8,0x0E,0xC0,0x60,0xCE,0x48, +0x20,0x00,0x95,0xEF,0x16,0xFF,0x62,0x98,0x80,0x40,0x78,0x85,0xE7,0xFF,0xE8,0x2E, +0xC0,0x60,0x19,0x08,0x20,0x00,0x45,0x12,0xEA,0x20,0x8E,0xEA,0x12,0xF7,0xFF,0x5E, +0xE5,0xFB,0x20,0x15,0xBD,0x42,0xB5,0xAB,0x42,0x94,0xA3,0x42,0x52,0x93,0x8E,0x95, +0xEF,0x36,0xFF,0x6E,0xCE,0x94,0x00,0x64,0x42,0xF9,0xCB,0x8E,0x57,0x4E,0x52,0x18, +0xD6,0x54,0x00,0x91,0x40,0x6E,0x9D,0xE7,0xFF,0xE7,0x70,0xC0,0x60,0x18,0xE8,0x20, +0x15,0x09,0xEF,0x56,0xFF,0x62,0xEE,0xF6,0xFF,0x5A,0x98,0x80,0x40,0x7A,0xBD,0xE7, +0xFF,0xE7,0x88,0xC0,0x60,0x4A,0xE8,0x20,0x14,0xA9,0x11,0xEA,0x00,0x1E,0xEF,0xF0, +0x5E,0xE3,0xDB,0x20,0x00,0x45,0x12,0xEA,0x01,0x9E,0xF0,0x5E,0xF7,0x00,0x5E,0xE3, +0xD3,0x20,0x14,0x41,0xC3,0x20,0x10,0x01,0xFF,0x39,0x05,0x1A,0x13,0x19,0x20,0x8F, +0x19,0x12,0xF8,0xFF,0x1F,0x37,0xEF,0x5F,0x23,0xDB,0x20,0x00,0x49,0x13,0x18,0xFE, +0x5F,0x02,0x13,0x20,0x00,0x25,0x5F,0x05,0xF3,0x20,0x13,0xA1,0x9E,0xF4,0xD2,0xE6, +0x00,0x9D,0xEC,0x76,0xFF,0x7E,0xE7,0xFF,0xE6,0x92,0xC0,0x60,0x9C,0x4C,0x20,0x13, +0x4D,0x9D,0xF8,0xD1,0xE7,0x21,0xD5,0xEF,0x56,0xFF,0x5E,0x41,0xCE,0xD5,0x4C,0x6E, +0xFA,0x45,0xC3,0x76,0x40,0x6E,0x1D,0xE7,0xFF,0xE6,0x50,0xC0,0x60,0x7C,0xEC,0x20, +0x10,0x79,0xEE,0xF6,0xFF,0x62,0x98,0x80,0x42,0x10,0xBD,0x4C,0x70,0xFA,0x46,0x03, +0x86,0x40,0x70,0x1D,0xE7,0xFF,0xE6,0x5E,0xC0,0x60,0x3E,0x68,0xE4,0x00,0x07,0xFD, +0xD1,0xAA,0x0E,0xFE,0xEF,0x16,0xFF,0x5A,0x43,0x10,0xC5,0x4E,0xF8,0xFA,0x0F,0x16, +0x88,0x44,0x77,0xC6,0x98,0x80,0x40,0x63,0xBD,0xE7,0xFF,0xE6,0x14,0x0C,0x76,0x8C, +0xC0,0x60,0xAF,0x0C,0x20,0x00,0x69,0x40,0x6E,0x7D,0x4E,0xE3,0xFA,0x44,0x77,0x1E, +0x40,0x63,0xBD,0xE7,0xFF,0xE5,0x98,0xC0,0x60,0xAF,0x08,0x20,0x00,0xF5,0xEF,0x36, +0xFF,0x5E,0x88,0x6F,0x88,0x99,0x88,0xB3,0xE7,0xFF,0xEA,0x86,0x20,0x60,0x52,0xEF, +0x56,0xFF,0x5E,0x88,0x6E,0x88,0x9A,0x88,0xB3,0xE7,0xFF,0xEA,0x64,0x20,0x60,0x6C, +0xEE,0xF6,0xFF,0x5A,0xD6,0x17,0x00,0xA0,0x0C,0x76,0x8A,0x98,0x80,0xE7,0xFF,0xE5, +0x6C,0xC0,0x60,0x32,0x0C,0x20,0x10,0x71,0xEF,0x16,0xFF,0x6E,0x42,0xF8,0xC3,0x42, +0xB5,0xAB,0x42,0x94,0xA3,0x42,0x52,0x93,0x8E,0x95,0x8E,0x57,0xCE,0x94,0x00,0x64, +0x4E,0xF2,0x18,0xD6,0x97,0x01,0xA1,0x40,0x6E,0x9D,0xE7,0xFF,0xE4,0xCA,0xC0,0x60, +0x18,0xEC,0x20,0x00,0x95,0x12,0xEA,0x01,0x9E,0xF0,0x5E,0xF7,0x00,0x5E,0xE3,0xD3, +0x20,0x00,0x5D,0xEF,0x36,0xFF,0x76,0x98,0x80,0x40,0x70,0xCD,0xE7,0xFF,0xE4,0xCE, +0xC0,0x60,0x2B,0xCC,0x20,0x0F,0x35,0x12,0xAA,0x00,0x1E,0xF5,0xF8,0x5E,0xE6,0x13, +0x20,0x00,0xAD,0xEF,0x56,0xFF,0x5E,0x40,0x7A,0x7D,0xE7,0xFF,0xE4,0x4A,0xC0,0x60, +0xC7,0xEC,0x20,0x00,0x65,0x40,0x6F,0x9D,0xE7,0xFF,0xE4,0x2E,0xC0,0x60,0xC7,0xEC, +0x20,0x00,0x2D,0xCE,0xF2,0x00,0x06,0xD6,0x97,0x1C,0xD5,0xCE,0x52,0x00,0x0C,0xD6, +0x92,0x01,0x39,0x12,0xEA,0x01,0xD2,0xEF,0x01,0x05,0x0C,0x76,0x86,0x98,0x80,0xE7, +0xFF,0xE4,0x28,0x5C,0x6C,0x91,0x20,0x00,0x41,0x40,0x6E,0x7D,0xE7,0xFF,0xE3,0xC6, +0x5C,0x6C,0x99,0x20,0x0D,0xB9,0x1E,0xB5,0xDB,0x5E,0xA2,0x3B,0x20,0x00,0x85,0x12, +0xEA,0x20,0x8E,0xEA,0x12,0xF7,0xFF,0x5E,0xE4,0x93,0x20,0x00,0x4D,0x5E,0xE6,0xDB, +0x20,0x00,0x35,0x0E,0xF6,0x8E,0xC2,0xE0,0x7D,0x0C,0x20,0x0D,0x1D,0xEC,0x76,0xFF, +0x7E,0xE7,0xFF,0xE3,0x5C,0xC0,0x60,0xBB,0x88,0x20,0x00,0x65,0xEF,0x16,0xFF,0x62, +0xEF,0x36,0xFF,0x76,0x88,0x70,0x88,0x98,0x88,0xB9,0xE7,0xFF,0xE8,0x42,0xD0,0x60, +0x19,0x1E,0x40,0x6E,0x7D,0x4E,0xE3,0xFA,0x44,0x77,0x1E,0x40,0x63,0xBD,0xE7,0xFF, +0xE3,0x02,0xC0,0x60,0xBB,0x88,0x20,0x00,0x5D,0xEF,0x56,0xFF,0x5E,0xD5,0xFA,0x18, +0x22,0xD5,0xF3,0x18,0x02,0xD5,0xDA,0x17,0xE2,0xD5,0xD3,0x17,0xC2,0x0E,0xF6,0x8E, +0xC2,0xE0,0xBB,0x88,0x20,0x00,0x7D,0xEF,0x16,0xFF,0x5A,0xEF,0x36,0xFF,0x62,0xD7, +0x19,0x17,0x12,0xEF,0x56,0xFF,0x76,0xD7,0x1A,0x16,0xD2,0xD6,0x19,0x16,0xB2,0xD6, +0x1A,0x16,0x92,0xEE,0xF6,0xFF,0x62,0xEF,0x16,0xFF,0x5A,0x98,0x80,0x40,0x77,0xC5, +0xE7,0xFF,0xE2,0xA6,0xC0,0x60,0xBB,0x8C,0x4A,0xE1,0x01,0xE4,0x00,0x04,0x49,0xC2, +0xE0,0x10,0x01,0x1F,0x0D,0xFD,0xFE,0xF7,0x06,0x4A,0x27,0x04,0xE7,0x0B,0x17,0x03, +0x0B,0x37,0x01,0xCF,0x18,0x01,0x2C,0x43,0x18,0xC8,0xD6,0x58,0x14,0xBC,0x0B,0x17, +0x07,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x03,0x2A,0x12,0xF7,0x00,0x42,0xF8,0xBB,0x53, +0x00,0x64,0x42,0xF7,0xC0,0x0F,0x0B,0x1A,0xD6,0xF8,0x13,0xCC,0x0E,0xEB,0x12,0xE4, +0x00,0x01,0x51,0x1F,0x0D,0xFF,0xD3,0x01,0x05,0x65,0x13,0x4A,0x20,0x13,0x2A,0x00, +0x23,0x44,0x98,0x13,0x0A,0x01,0x43,0x99,0xC5,0x8F,0x38,0x4F,0x7C,0xFA,0x4F,0x39, +0x0A,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x7B,0x00,0x5F,0x63,0xFB,0x20,0x00,0x1B, +0x1F,0x39,0x20,0x57,0x39,0x3F,0x9B,0x00,0x1F,0xB9,0x40,0x53,0xC0,0x40,0xE4,0x00, +0x00,0x63,0x43,0x2A,0xC4,0x13,0x99,0x00,0x43,0x9D,0xE5,0x4F,0x7C,0xFA,0x4F,0x7B, +0xD1,0x43,0x3C,0xDC,0x57,0x39,0x3F,0x43,0x39,0xDD,0x5F,0x39,0x00,0x5F,0x24,0x13, +0x20,0x00,0x25,0x43,0x3E,0xCD,0x5F,0x39,0x00,0x9F,0x01,0xD3,0x24,0x10,0x35,0x5F, +0x78,0x00,0xD7,0x5B,0xFE,0x85,0xE4,0x00,0x04,0x8D,0xC3,0x20,0x10,0x01,0xEF,0x19, +0x03,0x26,0x13,0x38,0x00,0x0B,0x17,0x09,0x43,0x39,0xC3,0x53,0x00,0x64,0x43,0x39, +0xC1,0x0B,0x17,0x03,0x43,0x39,0xC3,0x0B,0x17,0x01,0x42,0xF9,0xC0,0x0F,0x0B,0x1E, +0xD6,0xF8,0x0E,0x8C,0x0E,0xEB,0x16,0xC2,0xE1,0x06,0x8C,0x20,0x07,0x19,0xE4,0x00, +0x02,0x5F,0xD1,0xA9,0x02,0x46,0xC3,0x40,0x10,0x01,0xF6,0xFA,0x05,0x46,0xD2,0xE3, +0x0D,0x9C,0xEE,0xF6,0xFF,0x5A,0x50,0x60,0x64,0x42,0x10,0xBD,0xE7,0xFF,0xDF,0xF0, +0xD4,0x70,0x0D,0x0C,0x12,0xEA,0x20,0xD2,0xE5,0x08,0x31,0x13,0x0A,0x01,0x9F,0x10, +0x5F,0x18,0x00,0x5F,0x03,0xDB,0x20,0x03,0xDD,0x8E,0xEA,0x12,0xF7,0xFE,0x9E,0xF0, +0x5E,0xF7,0x00,0x5E,0xE3,0xD3,0xE4,0x00,0x01,0x35,0xD1,0xA5,0x01,0x16,0x40,0x6E, +0x9D,0xE7,0xFF,0xDF,0xBC,0xC0,0x60,0xA2,0x88,0x20,0x03,0x51,0x12,0xEA,0x00,0x9E, +0xF8,0x5E,0xF7,0x00,0xD2,0xEE,0x0A,0xE9,0xE4,0x00,0x01,0x8B,0xD1,0xA6,0x03,0xDE, +0xEF,0x16,0xFF,0x5E,0x40,0x78,0x7D,0xE7,0xFF,0xDF,0x70,0xC0,0x60,0x9C,0x48,0x20, +0x00,0x79,0x40,0x6E,0x9D,0xE7,0xFF,0xDF,0x54,0xC0,0x60,0x3E,0x6C,0x20,0x00,0x41, +0x12,0xEA,0x00,0x1E,0xF7,0xD8,0x5E,0xF7,0x00,0xD2,0xEE,0x09,0x41,0xEF,0x36,0xFF, +0x5E,0x40,0x79,0x75,0xE7,0xFF,0xDF,0x16,0xC0,0x60,0x7D,0x08,0x20,0x02,0x05,0x40, +0x6F,0x9D,0xE7,0xFF,0xDE,0xFA,0xC0,0x60,0xE0,0xEC,0x20,0x01,0xCD,0x12,0xEA,0x20, +0x8E,0xEA,0x13,0x17,0xFF,0xD3,0x07,0x00,0x7D,0x12,0xF7,0xFE,0xD2,0xE7,0x07,0xAD, +0xE4,0x00,0x00,0xBB,0x5F,0x02,0xD3,0x20,0x03,0xA9,0x12,0xF7,0xFE,0x5E,0xE2,0xD3, +0x20,0x03,0x85,0xE4,0x00,0x00,0x95,0x9A,0xE0,0xD1,0xAB,0x02,0x36,0xEF,0x56,0xFF, +0x5A,0xD6,0x1A,0x00,0x40,0xD5,0xCF,0x06,0x64,0x41,0xCE,0x7D,0x4C,0x6E,0xFA,0x45, +0xC3,0x76,0x40,0x6E,0x1D,0xE7,0xFF,0xDE,0x54,0xC0,0x60,0x25,0x6C,0x20,0x00,0x81, +0xEE,0xF6,0xFF,0x5A,0x98,0x80,0x42,0x10,0xBD,0x4C,0x70,0xFA,0x46,0x03,0x86,0x40, +0x70,0x1D,0xE7,0xFF,0xDE,0x62,0xC0,0x60,0x25,0x68,0x20,0x02,0x5D,0x9A,0xE0,0xEF, +0x36,0xFF,0x6A,0x0F,0x11,0x02,0x0F,0x18,0x06,0x8F,0x19,0x0F,0x38,0x0A,0x23,0x25, +0x92,0x0F,0x4B,0x12,0x23,0x41,0x78,0x0F,0x2B,0x16,0x23,0x21,0x60,0x11,0xD8,0x0C, +0x13,0xD8,0x0D,0x97,0x63,0x11,0x18,0x0E,0xCB,0x7B,0x34,0x50,0x13,0xB8,0x0F,0x41, +0xCE,0xDB,0xCF,0x9E,0x07,0xD0,0xCF,0x1D,0x07,0xD0,0xD1,0xAA,0x00,0xAE,0x22,0xE0, +0x44,0xCF,0x9E,0x46,0x50,0xCF,0x1D,0x46,0x50,0x43,0x9C,0x69,0x43,0x18,0x69,0xCE, +0xFA,0x07,0xD0,0xD6,0xEE,0x01,0xF5,0xCF,0x5A,0x00,0x14,0xD7,0x9A,0x01,0xB5,0xCE, +0xF9,0x07,0xD0,0x43,0x68,0xDB,0xD6,0xFB,0x01,0x5D,0xCF,0x39,0x00,0x14,0xD7,0x19, +0x01,0x1D,0x0E,0xF6,0x96,0x0F,0x56,0x9A,0x0F,0x16,0x92,0x8E,0xFA,0x4E,0xF7,0x0A, +0xD6,0xF8,0x00,0x88,0x5E,0xF7,0x00,0x0D,0x96,0x80,0x0E,0xF6,0x90,0xEE,0xF6,0xFF, +0x78,0x9D,0x81,0x5D,0x8C,0x00,0x0E,0xF1,0x02,0x0F,0x17,0x02,0x0B,0x18,0x01,0xD7, +0x0C,0xC0,0xB5,0xC2,0xE0,0x10,0x01,0xEF,0x36,0xFF,0x7A,0x0C,0x36,0x9E,0xFB,0x37, +0x05,0x43,0xE7,0xFF,0xE7,0x22,0x98,0x62,0xEF,0x56,0xFF,0x7A,0x23,0x41,0x14,0x0E, +0xF1,0x02,0x0F,0x36,0x82,0x0F,0x17,0x06,0x0F,0x56,0xA2,0x4E,0xF9,0x20,0x98,0x61, +0x8E,0xF8,0x12,0xF7,0x05,0x0E,0xFA,0x00,0xE4,0x00,0x00,0x53,0xEF,0x36,0xFF,0x6E, +0x4F,0x19,0xFA,0x46,0x78,0xCE,0x42,0x73,0xC5,0x4F,0x12,0xFA,0x46,0x58,0x96,0x42, +0x52,0xC5,0x4E,0x52,0x12,0xFE,0x52,0x01,0x2C,0xD6,0x72,0xFC,0xC4,0xE7,0xFF,0xFB, +0x3B,0x0C,0x36,0xA6,0x0E,0xC1,0x72,0x0E,0xA1,0x76,0x0E,0x81,0x7A,0x0E,0x61,0x7E, +0xEE,0x41,0x00,0x82,0xEE,0x21,0x00,0x86,0xEE,0x01,0x00,0x8A,0xED,0xE1,0x00,0x8E, +0xED,0xC1,0x00,0x92,0xED,0xA1,0x00,0x96,0xED,0x81,0x00,0x9A,0xED,0x61,0x00,0x9E, +0xED,0x41,0x00,0xA2,0xED,0x21,0x00,0xA6,0xFC,0x21,0x00,0xA8,0x85,0x29,0xC2,0xE0, +0x10,0x01,0x9C,0x38,0xEC,0x77,0x06,0x60,0x0D,0x21,0x04,0x0D,0x41,0x00,0x08,0x61, +0x09,0xC1,0x40,0x10,0x01,0xEC,0x8A,0x06,0x4B,0xFD,0x4A,0x06,0x4A,0x0C,0xAA,0x03, +0x0C,0xCA,0x07,0x0C,0xEA,0x09,0x19,0x0A,0x04,0xE7,0xFF,0xDA,0xF6,0x0D,0x21,0x06, +0x0C,0x6A,0x0B,0x0D,0x41,0x02,0x9C,0x28,0x85,0x29,0x9C,0x30,0x5C,0x63,0x00,0x0D, +0x41,0x08,0x0D,0x61,0x04,0x4C,0x63,0x08,0xC2,0xF8,0x00,0x21,0x0D,0x21,0x0C,0xFE, +0xF7,0xB7,0x22,0x99,0x40,0x8E,0xE3,0x09,0x77,0x01,0x88,0x6A,0x88,0x8B,0x9D,0x41, +0xE4,0x00,0xB7,0xC4,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x9E,0x0D,0x61,0x06,0x0D,0x41, +0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06, +0x71,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0x76,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06, +0x6E,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0x72,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06, +0x79,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06, +0x7C,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0x71,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x06,0x6E,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06,0x76,0xC2,0xE0,0x10,0x01,0xF8, +0x77,0x06,0x72,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x79,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x7C,0x24,0x6C,0x1F,0xE7,0xFF, +0xFE,0x99,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x5C,0x63,0x04,0xEC, +0x77,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x7C,0xF3,0x78,0x06,0x6E,0xC3, +0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xFF,0x5A,0x06,0x76,0xFF, +0x39,0x06,0x72,0x23,0x60,0x2C,0xEB,0x78,0x06,0x79,0xD7,0x63,0x00,0xA1,0x13,0x5A, +0x00,0xEC,0x78,0x06,0x79,0x1B,0x59,0x00,0x9B,0x01,0xEF,0x17,0x06,0x7C,0x85,0x29, +0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0x71, +0x5E,0xF8,0x1F,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0x6E, +0x5E,0xE0,0x5B,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x06,0x6E, +0x27,0x08,0x7B,0x9F,0x01,0xFB,0x17,0x06,0x6E,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06, +0x76,0x9C,0x61,0x54,0x63,0x03,0xF8,0x77,0x06,0x76,0xE7,0xFF,0xFD,0x61,0x85,0x29, +0x8B,0x03,0x56,0xE3,0x03,0x22,0xE0,0x98,0x9B,0x04,0x42,0xF8,0xBD,0x5F,0x44,0x00, +0x5E,0xE5,0x17,0x4B,0x37,0x28,0x9A,0xE0,0xE4,0x00,0x00,0x13,0x1B,0x58,0x00,0x9E, +0xE1,0x43,0x03,0xBC,0xD6,0xF9,0xFF,0xC6,0x40,0xA5,0xBD,0x4E,0xE4,0x80,0x4F,0x64, +0xC0,0x47,0x7B,0xBD,0x4E,0xE4,0x40,0x47,0x7B,0x25,0x4F,0x45,0x11,0x47,0x7B,0xBD, +0x9A,0xE0,0xE4,0x00,0x00,0x17,0x8F,0x38,0x9E,0xE1,0x0F,0x79,0x00,0x4F,0x37,0x10, +0xD6,0xFA,0xFF,0xB6,0x8F,0x19,0x9A,0xE0,0x54,0xA5,0x03,0x5C,0x84,0x00,0xE4,0x00, +0x00,0x19,0x43,0x37,0xC4,0x9E,0xE1,0x18,0x99,0x00,0xD4,0xB7,0xFF,0xC5,0x85,0x29, +0x46,0xE4,0x1D,0x56,0xF7,0x03,0x22,0xE0,0x82,0x9A,0xFC,0x47,0x45,0xBC,0x9A,0xE0, +0xE4,0x00,0x00,0x51,0x43,0x03,0xBC,0x43,0x24,0xBC,0x9E,0xE1,0x13,0x39,0x00,0x1B, +0x38,0x00,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0xD6,0xE5,0xFF,0x66,0xE4,0x00,0x00,0x63, +0x0F,0x39,0x02,0x9E,0xE4,0x0F,0x38,0x00,0x43,0x03,0xBC,0x43,0x24,0xBC,0xD6,0xFA, +0xFF,0x96,0x9A,0xE0,0x54,0xA5,0x03,0xE4,0x00,0x00,0x25,0x43,0x57,0xC4,0x43,0x77, +0xCC,0x9E,0xE1,0x13,0x7B,0x00,0x1B,0x7A,0x00,0xD4,0xB7,0xFF,0x95,0x85,0x29,0x9C, +0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,0x21,0x0C,0x89,0x63,0x99,0x40,0xE4,0x00, +0x20,0xCA,0x20,0x64,0xD2,0xE4,0x00,0x22,0xF6,0x20,0x64,0x82,0xE4,0x00,0x22,0xD4, +0xC2,0xE0,0x10,0x01,0xFF,0x20,0xFF,0x7F,0xEB,0x17,0x08,0x87,0x99,0x41,0x47,0x18, +0xCC,0xEF,0x17,0x08,0x87,0xE4,0x00,0x00,0x23,0xE4,0x00,0x22,0xEA,0x20,0x67,0x7C, +0x88,0x6B,0xE4,0x00,0x22,0x4A,0x88,0x6A,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21, +0x0E,0x1C,0x21,0x10,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x21,0x2C,0x0D,0x41,0x28,0x0D, +0x61,0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01, +0x10,0x0E,0x21,0x0C,0x0E,0x41,0x08,0x0E,0x61,0x04,0xE4,0x00,0x68,0x1A,0xC1,0x80, +0x10,0x01,0xC0,0x60,0x00,0x21,0xFD,0x4C,0x00,0xD4,0xFC,0x63,0xB0,0xE4,0xC0,0x80, +0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0x84,0x00,0x00,0xFC,0xA5,0x03,0x80,0x40,0xA5, +0x25,0xE4,0x00,0x63,0x5E,0x0C,0x0A,0x01,0x0C,0x0A,0x03,0x0C,0x0A,0x05,0x0C,0x0A, +0x08,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x00,0xC3,0x0C,0x0A,0x0C,0x9A,0xEA,0xC1,0xC0, +0x10,0x01,0x0E,0xEA,0x11,0xEC,0x0E,0x06,0x8C,0x50,0x60,0x26,0xE4,0x00,0x22,0xE4, +0xC8,0x80,0xE1,0x00,0x98,0x60,0xE4,0x00,0x31,0x9C,0x98,0x63,0xE4,0x00,0x30,0x24, +0xE4,0x00,0x07,0x2A,0xC2,0xE0,0x10,0x01,0x9B,0x3C,0xF3,0x17,0x08,0x19,0x47,0x18, +0xCC,0xFC,0x60,0x0B,0xB8,0xFB,0x17,0x08,0x19,0x05,0x60,0x5B,0xC9,0x6B,0x8D,0x80, +0x88,0x8B,0xE4,0x00,0x30,0x5C,0x98,0x61,0xC2,0x58,0x00,0x21,0x8A,0x6B,0xC1,0x80, +0x10,0x01,0xC1,0xA0,0x10,0x01,0xC1,0x60,0x10,0x01,0xE4,0x00,0x30,0x34,0xC2,0x00, +0x10,0x01,0xC1,0xE0,0x10,0x01,0xC2,0x20,0x10,0x01,0xFE,0x52,0xB7,0x2C,0xFD,0x8C, +0x06,0x86,0xFD,0xAD,0x08,0x86,0xFD,0x6B,0x06,0x80,0xE4,0x00,0x2F,0xE4,0x0E,0xEA, +0x0E,0x22,0xE5,0xA0,0x22,0xE0,0x2C,0xD2,0xE2,0x18,0x9E,0xE4,0x00,0x02,0x5F,0xE4, +0x00,0x62,0x0A,0xE4,0x00,0x2F,0xFA,0x0C,0x6A,0x13,0xE4,0x00,0x2F,0xEC,0x0C,0x6A, +0x17,0xE4,0x00,0x2F,0xDE,0x0C,0x6A,0x1B,0xE4,0x00,0x2F,0xD0,0x0C,0x6A,0x19,0x0A, +0xEC,0x01,0xC6,0xF7,0xFF,0xDF,0x0E,0xEC,0x01,0x0A,0xEC,0x01,0xC6,0xF7,0xFF,0x7F, +0x0E,0xEC,0x01,0x9A,0xE1,0x0E,0xEA,0x0C,0x0A,0xED,0x01,0x52,0xF7,0x80,0xEC,0x0E, +0x06,0x8C,0x0E,0xED,0x01,0x98,0x61,0xE4,0x00,0x1D,0x3A,0x98,0x60,0xE4,0x00,0x37, +0x1A,0xE4,0x00,0x31,0xEA,0xE4,0x00,0x05,0x6B,0xEE,0xF0,0x06,0x8A,0x22,0xE4,0x4E, +0x9A,0xE2,0x0E,0xEA,0x0C,0x0C,0x0B,0x00,0xEC,0x10,0x06,0x88,0xE4,0x00,0x05,0x3D, +0xEE,0xEE,0x06,0x8E,0x22,0xE0,0x2C,0xD2,0xE1,0x14,0x9E,0xE4,0x00,0x00,0x3D,0x98, +0x61,0xE7,0xFF,0xFC,0x5C,0xD0,0x61,0x14,0x2E,0xEC,0x0F,0x08,0x60,0xEC,0x6E,0x06, +0x8C,0xE4,0x00,0x69,0x6E,0xE4,0x00,0x02,0xBB,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00, +0xD2,0xE0,0x13,0x52,0xE4,0x00,0x2E,0xB8,0x0A,0xEA,0x13,0x0B,0x0A,0x11,0x40,0x63, +0xBD,0x5E,0xE3,0x04,0xD7,0x17,0x12,0xB5,0xE4,0x00,0x2E,0x90,0x0C,0x6A,0x13,0x0A, +0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4,0x00,0x63,0x44,0xE4,0x00,0x69, +0x66,0xE4,0x00,0x68,0x96,0xEE,0xEF,0x08,0x62,0xEE,0xF1,0x08,0x8C,0xE4,0x00,0x64, +0x30,0x98,0x61,0xE4,0x00,0x98,0x5A,0xE4,0x00,0x64,0xA8,0x98,0x61,0xE4,0x00,0x65, +0x00,0xE4,0x00,0x66,0x40,0xE4,0x00,0x88,0x52,0x0A,0xED,0x01,0x56,0xF7,0x80,0xD2, +0xE0,0x10,0x5A,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00,0x22,0xE3,0xE4,0x0A,0xEA,0x01, +0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0x9A,0xE1,0x0E,0xEA,0x0C,0xEC,0x0E,0x06,0x8C, +0x98,0x61,0xE4,0x00,0x1B,0x84,0xE4,0x00,0x03,0xC9,0x0E,0xEB,0x02,0xD2,0xE4,0x0E, +0xED,0x4E,0xF7,0x10,0x8E,0xF2,0x0E,0xF7,0x02,0x86,0xE9,0x0A,0xEC,0x01,0xC6,0xF7, +0xFF,0xDF,0x0E,0xEC,0x01,0x0A,0xEC,0x01,0xC6,0xF7,0xFF,0x7F,0xFF,0x00,0xFF,0x7F, +0x0E,0xEC,0x01,0x0A,0xED,0x01,0x46,0xF7,0xC4,0x0E,0xED,0x01,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x48,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x9C,0xC2,0xE0,0x10,0x01, +0xEC,0x17,0x08,0x33,0xC2,0xE0,0x10,0x01,0x9B,0x3E,0xF3,0x17,0x08,0x1A,0x47,0x18, +0xCC,0xFB,0x17,0x08,0x1A,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x50,0xE4,0x00,0x59, +0x4A,0xE4,0x00,0x66,0x28,0x98,0x62,0xE4,0x00,0x2C,0x52,0x50,0x60,0x40,0xE4,0x00, +0x2C,0x64,0x50,0x60,0x19,0xE4,0x00,0x63,0x80,0xE4,0x00,0x04,0x04,0x50,0x60,0xC8, +0xE4,0x00,0x2C,0xC4,0xE4,0x00,0x6B,0xA6,0x50,0x60,0x40,0xE4,0x00,0x63,0x4C,0xC8, +0x80,0x7D,0x00,0xFC,0x60,0x0B,0xB8,0xE4,0x00,0x2C,0x32,0xFC,0x60,0x06,0x00,0xE4, +0x00,0x63,0x34,0xE4,0x00,0x03,0xC0,0xE4,0x00,0x02,0x5D,0x98,0x60,0xE7,0xFF,0xF9, +0xA4,0xD0,0x61,0x09,0x4E,0x9A,0xE2,0xEC,0x0F,0x08,0x60,0x0E,0xEB,0x00,0xE4,0x00, +0x67,0x14,0xE4,0x00,0x66,0x54,0xE4,0x00,0x02,0x29,0x0A,0xEA,0x01,0xC6,0xF7,0x01, +0x00,0xD2,0xE0,0x05,0x8A,0x0A,0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4, +0x00,0x03,0x48,0x98,0x60,0x98,0x80,0xE4,0x00,0x2B,0x3A,0xFC,0x60,0x0B,0xB8,0xC8, +0x80,0x7D,0x00,0xE4,0x00,0x2B,0x7A,0xE4,0x00,0x2B,0xA2,0xFC,0x60,0x0B,0xB8,0x88, +0x93,0xE4,0x00,0x2B,0x5E,0x98,0x81,0x98,0x60,0xE4,0x00,0x2A,0xF6,0xE4,0x00,0x02, +0xE4,0x98,0x62,0xE4,0x00,0x2B,0x72,0xE4,0x00,0x2B,0x72,0x0C,0x6A,0x13,0x0A,0xEA, +0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4,0x00,0x60,0x26,0xE4,0x00,0x61,0x32, +0xE4,0x00,0x95,0xAA,0x98,0x80,0x98,0x64,0xE4,0x00,0x48,0xEC,0xE4,0x00,0x65,0x60, +0xEE,0xEF,0x08,0x62,0xEE,0xF1,0x08,0x8C,0xE4,0x00,0x61,0x86,0x98,0x60,0xE4,0x00, +0x61,0xDE,0xE4,0x00,0x63,0x1E,0xE4,0x00,0x85,0x30,0x0A,0xED,0x01,0x56,0xF7,0x80, +0x22,0xE0,0x88,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00,0x22,0xE3,0xE4,0x0A,0xEA,0x01, +0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0x9A,0xE1,0x98,0x60,0x0E,0xEB,0x00,0xE4,0x00, +0x18,0x6C,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x31,0x5E,0xEB,0x01,0x20,0x00,0x29, +0x1E,0xF7,0xA0,0xD2,0xEB,0x02,0x3D,0x9A,0xE3,0xE4,0x00,0x00,0x7D,0x98,0x63,0xE4, +0x00,0x32,0x16,0xE4,0x00,0x2C,0xE6,0xE4,0x00,0x2A,0x52,0x9A,0xE4,0x0C,0x6A,0x17, +0xE4,0x00,0x00,0x4F,0xE4,0x00,0x2A,0x38,0x0A,0xEA,0x17,0x40,0x63,0xBD,0x5E,0xE3, +0x04,0xC2,0xE0,0x7C,0xEA,0x20,0x00,0x55,0x98,0x60,0xE4,0x00,0x29,0x32,0xE4,0x00, +0x2A,0x04,0x0C,0x6A,0x17,0x9A,0xE2,0x0E,0xEB,0x00,0x0E,0xEA,0x0A,0xFC,0x60,0x1E, +0x7F,0x9E,0xE1,0x0E,0xEA,0x08,0x0C,0x8A,0x0A,0xE4,0x00,0x2B,0xA6,0xE4,0x00,0x2A, +0x76,0xE7,0xFF,0xF9,0x93,0xE4,0x00,0xAB,0xCB,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41, +0x00,0xE4,0x00,0xAD,0x26,0x98,0x6D,0xE4,0x00,0x9D,0xA0,0x98,0x60,0xFC,0x80,0x3E, +0x0C,0xE4,0x00,0x9F,0xE4,0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x9F,0xD0,0x98, +0x60,0x50,0x80,0x14,0xE4,0x00,0xA4,0xCA,0x98,0x60,0x98,0x8C,0xE4,0x00,0xA3,0xEC, +0x98,0x61,0x50,0x80,0x14,0xE4,0x00,0xA4,0xA8,0x98,0x61,0x98,0x8C,0x99,0x40,0xE4, +0x00,0xA3,0xC6,0x88,0x6A,0x98,0x80,0x9D,0x41,0xE4,0x00,0xAA,0x32,0x5D,0x4A,0x00, +0xD1,0x44,0xFF,0x9E,0x98,0x60,0x05,0x40,0xFF,0xC9,0x4A,0xFF,0xFF,0x88,0x8A,0xE4, +0x00,0xA2,0x20,0x88,0x8A,0x98,0x60,0xE4,0x00,0x9F,0xA8,0x88,0x8A,0x0D,0x21,0x06, +0x0D,0x41,0x02,0x98,0x60,0x9C,0x28,0xE4,0x00,0xA0,0x89,0xE4,0x00,0xAC,0x75,0xE4, +0x00,0xAE,0x19,0xE4,0x00,0xAF,0x45,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0x9C,0x1C, +0x21,0xB0,0x0E,0xE1,0x10,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0x90,0x0D,0x41,0x4C, +0x0D,0x61,0x48,0x0D,0x81,0x44,0x0D,0xE1,0x38,0x0E,0x01,0x34,0x0E,0x21,0x30,0x0E, +0x41,0x2C,0x0E,0x61,0x28,0x0E,0x81,0x24,0x0D,0xA1,0x40,0x0D,0xC1,0x3C,0x0E,0xA1, +0x20,0x0E,0xC1,0x1C,0x0E,0xE1,0x0C,0xC2,0x60,0x10,0x01,0xC2,0x40,0x10,0x01,0xFE, +0x73,0x06,0xB0,0xFE,0x52,0x06,0xA8,0xC2,0x20,0x10,0x01,0xC2,0x00,0x10,0x01,0xFE, +0x31,0x06,0xA0,0xFE,0x10,0x06,0xB4,0xC1,0xE0,0x10,0x01,0xC1,0x8F,0xFF,0xE1,0xFD, +0xEF,0x06,0xAC,0x9B,0x80,0xC2,0x98,0x00,0x21,0xC0,0xD8,0x00,0x21,0x13,0x53,0x00, +0x0E,0xF2,0x02,0x0D,0x51,0x02,0x0F,0xB0,0x02,0x0F,0x6F,0x02,0x99,0x60,0xC9,0x8C, +0xFF,0xFF,0x88,0xFC,0x53,0x20,0xFF,0xFE,0x94,0xB8,0xA6,0xFC,0xC6,0xB8,0xAC,0xE4, +0x00,0x01,0xC5,0x41,0x14,0xC4,0x9F,0x01,0x11,0x08,0x00,0x8D,0xA8,0x5D,0xAD,0x00, +0xE4,0x00,0x00,0x11,0x9B,0x00,0x89,0xB8,0x5D,0x18,0x00,0xD7,0xC8,0xFF,0x45,0xC3, +0x18,0x00,0x21,0xFF,0x18,0xB8,0xA6,0x8F,0x0B,0x99,0x00,0x12,0xB8,0x00,0xCF,0x0D, +0x00,0x0A,0x1E,0xD5,0xFF,0x8F,0x06,0x0E,0xC1,0x08,0x0F,0x01,0x14,0xE4,0x00,0x01, +0x37,0x0F,0x01,0x16,0xCD,0xE8,0x00,0x0A,0x8D,0xF8,0x0A,0xCF,0x00,0x0E,0xC1,0x04, +0x0F,0x01,0x0E,0x0E,0xC1,0x0A,0xD5,0x16,0x00,0x3A,0x0B,0x0F,0x0A,0x0D,0xE1,0x06, +0xD5,0xE4,0x03,0xB4,0xD4,0x98,0x03,0x94,0x8D,0xCD,0x5D,0xCE,0x00,0xCF,0x0E,0x00, +0x0A,0x8F,0x06,0x09,0xF8,0x06,0x0B,0x18,0x08,0x4F,0x18,0x50,0x41,0xEF,0x23,0x8D, +0xF8,0xFD,0xEF,0x02,0x00,0x4D,0xEF,0x52,0x5D,0xEF,0x06,0x41,0xEF,0x7B,0x43,0x03, +0x7D,0x4E,0xD8,0xFA,0x47,0x16,0xC6,0x43,0x18,0xB5,0xD7,0x0C,0x01,0x4C,0xC3,0x20, +0x1F,0xE4,0x20,0x00,0x2D,0x89,0x5D,0x89,0x97,0x8B,0x3A,0x88,0xFC,0x8B,0xAA,0x8A, +0xEC,0x8B,0x59,0x8B,0x87,0x8B,0x78,0x89,0x4F,0x89,0x98,0x88,0xEE,0x8B,0x3E,0xE4, +0x00,0x00,0x2F,0xC3,0x40,0x1F,0xE0,0x20,0x00,0x1D,0xD6,0xF8,0x00,0x60,0x8B,0xAF, +0x8A,0xF8,0x8B,0x5E,0x8B,0x8E,0x9D,0x01,0x5D,0xC8,0x00,0xD6,0xAE,0xFB,0x35,0x9D, +0x61,0x5F,0xCB,0x00,0x0E,0xC1,0x12,0xD6,0xDE,0xF9,0x6D,0xC3,0x00,0x10,0x01,0x1B, +0x53,0x00,0xFF,0x18,0x06,0xAC,0x0E,0xF2,0x00,0x0D,0x51,0x00,0x0F,0xB0,0x00,0x0F, +0x78,0x00,0xC3,0x20,0x1F,0xE0,0x20,0x01,0x55,0xCF,0x9C,0x00,0x0A,0xCC,0xE7,0x00, +0x0A,0x8C,0xE6,0x0B,0x07,0x04,0x4F,0x18,0x50,0x8C,0xDC,0x08,0x67,0x02,0x0B,0x86, +0x02,0x40,0x63,0x23,0x0B,0x46,0x04,0x8C,0x78,0x43,0x1B,0xBC,0xFC,0x63,0x02,0x00, +0x4C,0x63,0x52,0x23,0x00,0xA8,0xC2,0xE0,0x1F,0xE0,0x20,0x00,0x8D,0x40,0x63,0xBB, +0x40,0x9C,0x23,0x4E,0xFA,0x50,0x8E,0xE4,0xFE,0xF7,0x02,0x00,0x4E,0xF7,0x52,0x43, +0x77,0xDB,0x8C,0x7B,0x40,0x63,0xC0,0xE4,0x00,0x00,0x0D,0x88,0x64,0x0E,0xC1,0x1E, +0x0E,0xA1,0x22,0x0E,0x81,0x26,0x0E,0x61,0x2A,0x0E,0x41,0x2E,0x0E,0x21,0x32,0x0E, +0x01,0x36,0x0D,0xE1,0x3A,0x0D,0xC1,0x3E,0x0D,0xA1,0x42,0x0D,0x81,0x46,0x0D,0x61, +0x4A,0x0D,0x41,0x4E,0x1B,0x25,0x00,0x1C,0x21,0x50,0x85,0x29,0x8B,0x23,0xC2,0xE0, +0x10,0x01,0x5C,0xA5,0x00,0xF2,0xF7,0x06,0x9C,0x98,0x60,0xD6,0xE5,0x0C,0xB9,0xD3, +0x3F,0x0C,0x98,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0xF2, +0xF7,0x06,0x95,0xFF,0x18,0x06,0x93,0xFF,0x7B,0x06,0x94,0x22,0xE8,0x42,0x13,0x18, +0x00,0x5F,0x08,0x9B,0x20,0x00,0x51,0xE4,0x00,0x01,0x3B,0xD2,0xE1,0x04,0xCE,0x13, +0x18,0x00,0x5F,0x05,0x93,0x20,0x02,0x3D,0x24,0xA4,0x4B,0x9B,0x43,0x43,0x5A,0x2D, +0x4F,0x5A,0x08,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x37,0x20,0xA8,0x54,0x9B,0x44,0x43, +0x5A,0x2D,0x4F,0x5A,0x08,0x5F,0x5A,0x00,0x20,0xAC,0xEE,0xE4,0x00,0x00,0x51,0x9B, +0x43,0x9A,0xE0,0x13,0x9B,0x00,0x8B,0x17,0xE4,0x00,0x00,0x27,0x4F,0xB8,0x08,0x9F, +0x01,0x8F,0xBC,0x5F,0x18,0x00,0x8E,0xFD,0x5E,0xF7,0x00,0xD7,0x05,0xFF,0x8E,0xE4, +0x00,0x00,0x49,0x5E,0xE0,0x21,0x53,0x00,0x1D,0x52,0xE0,0x2F,0x4A,0xF8,0xB8,0xE4, +0x00,0x00,0x4B,0x5E,0xE0,0x29,0x53,0x00,0x41,0x52,0xE0,0x29,0x4A,0xF8,0xB8,0xE4, +0x00,0x00,0x2B,0x27,0x04,0x33,0x9F,0x9F,0x4F,0x18,0x08,0xE4,0x00,0x00,0x8B,0x9B, +0x0A,0x20,0xA9,0x10,0x13,0x1B,0x00,0x9C,0xBF,0x9F,0x1F,0x4C,0xA5,0x08,0x8F,0x05, +0xE4,0x00,0x00,0x65,0x9B,0x43,0x13,0xBB,0x00,0x43,0x5A,0x2D,0x9A,0xE0,0x4F,0x5A, +0x08,0x8B,0x77,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x21,0x8F,0x9D,0x9F,0x61,0x8E,0xFC, +0x5F,0x7B,0x00,0x5E,0xF7,0x00,0x4F,0x9B,0x08,0xD7,0x65,0xFF,0x8E,0x1F,0x1D,0xFF, +0x8F,0x1C,0x5F,0x18,0x00,0x4F,0x5A,0x08,0xC3,0xB8,0x00,0x21,0xFF,0xBD,0xB7,0x40, +0x8F,0xBA,0x9B,0x40,0xE4,0x00,0x01,0x0B,0x4F,0x7A,0x08,0x8F,0x7D,0x0B,0x9B,0x00, +0xD7,0x3C,0x03,0xBC,0x0B,0x7B,0x02,0xD7,0x79,0x03,0x84,0x8E,0xFA,0xC3,0xB8,0x00, +0x21,0xCF,0x17,0x00,0x06,0xFF,0xBD,0xB7,0x5C,0x8F,0x1D,0x1F,0x57,0x01,0x14,0xD8, +0x00,0xCF,0x5A,0x00,0x06,0x09,0x18,0x02,0x8F,0x5D,0x98,0x60,0x0B,0xB8,0x04,0x14, +0xBA,0x00,0x0B,0xDA,0x02,0x0B,0x1A,0x04,0xD7,0x9B,0x02,0x52,0x42,0xF9,0xDD,0x40, +0x77,0x33,0x43,0x3C,0xCD,0x43,0x59,0x2B,0x43,0xD9,0xF3,0x8F,0x43,0x40,0x77,0x43, +0x43,0x5A,0x23,0x8C,0x7E,0x8C,0x7A,0x42,0xF7,0xEB,0x40,0x83,0x23,0x97,0x41,0x43, +0x39,0xC3,0xCB,0x5A,0x86,0xA0,0x8F,0x37,0x40,0x64,0xD0,0x43,0x7C,0xDD,0x8C,0x79, +0x40,0x63,0xD8,0xE4,0x00,0x00,0x1F,0x9F,0x41,0x5F,0x7A,0x00,0xD7,0x1B,0xFB,0xE5, +0x98,0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x06,0x95,0xC2,0xE0,0x10,0x01, +0xF8,0x97,0x06,0x92,0xC2,0xE0,0x10,0x01,0xF8,0xB7,0x06,0x93,0xC2,0xE0,0x10,0x01, +0xF8,0xD7,0x06,0x94,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x06,0x91,0x85,0x29,0x9A,0xFF, +0x1C,0x21,0xD8,0x0D,0xE1,0x0C,0x1A,0xE1,0x07,0xC1,0xE0,0x10,0x01,0xFD,0xEF,0x06, +0xB0,0x1A,0xEF,0x00,0x52,0xE0,0xFF,0xC3,0x00,0x10,0x01,0x0D,0x41,0x20,0x0D,0x61, +0x1C,0x0D,0xA1,0x14,0x0D,0xC1,0x10,0xCB,0x20,0xFF,0xFF,0xC1,0xC0,0x10,0x01,0xEF, +0x38,0x06,0xB8,0xFD,0xCE,0x06,0xAC,0xC1,0xA0,0x10,0x01,0x0E,0xEE,0x00,0xFD,0xAD, +0x06,0xA8,0x0D,0x21,0x24,0x0E,0xED,0x00,0x0D,0x81,0x18,0xC2,0xE0,0x10,0x01,0x0E, +0x01,0x08,0x89,0x63,0xF3,0x17,0x06,0x95,0x89,0x44,0x88,0x65,0xC2,0xE0,0x10,0x01, +0x23,0x08,0x56,0xC3,0x00,0x10,0x01,0xF3,0x18,0x06,0x93,0x5F,0x08,0x9B,0x20,0x00, +0x61,0xE4,0x00,0x00,0x37,0x23,0x04,0x5E,0xC3,0x00,0x10,0x01,0xF3,0x18,0x06,0x93, +0x5F,0x05,0x93,0x20,0x00,0x25,0x9B,0x05,0xE4,0x00,0x00,0x0D,0x9B,0x04,0xFB,0x17, +0x06,0x9C,0xC2,0x00,0x10,0x01,0x0E,0xEB,0x02,0xEE,0xF0,0x06,0xB8,0x0A,0xE6,0x06, +0x0C,0x8B,0x02,0xD4,0x97,0x04,0xCC,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x71,0x53, +0x18,0x01,0x1C,0xA1,0x07,0xEF,0x17,0x08,0x71,0xE7,0xFF,0xF6,0x9C,0x0C,0x6B,0x00, +0x0C,0x8A,0x02,0xED,0x90,0x06,0xBA,0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF,0xFA,0xC0, +0xC2,0xE0,0x10,0x01,0x89,0x63,0xEC,0x77,0x06,0x98,0x10,0xA1,0x07,0x0C,0x8A,0x02, +0x88,0x6C,0xE7,0xFF,0xFA,0x94,0xC3,0x00,0x10,0x01,0xEC,0x78,0x06,0xA4,0x0F,0x6E, +0x02,0x0F,0x2D,0x02,0x0F,0x4A,0x02,0x43,0x1B,0xCC,0x23,0x00,0xEC,0xC3,0x20,0x1F, +0xE0,0x20,0x00,0xD1,0xC3,0x80,0x10,0x01,0xEF,0xBC,0x06,0xA2,0xC3,0x80,0x10,0x01, +0xEF,0x9C,0x06,0xB6,0x43,0xBD,0xE5,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5, +0xD7,0x1C,0x00,0xAC,0x41,0x6B,0xDB,0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17,0xC0,0x8F, +0x58,0xE4,0x00,0x01,0x55,0x42,0xFA,0x1C,0xE4,0x00,0x01,0x5B,0xC9,0x80,0x07,0xFF, +0x42,0xEC,0xBD,0xD6,0xE4,0x05,0x2C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x71,0x53, +0x18,0x01,0x40,0x8C,0x25,0xEF,0x17,0x08,0x71,0x1C,0xA1,0x07,0xE7,0xFF,0xF5,0x56, +0x40,0x6C,0x1D,0x0C,0x6B,0x00,0xEE,0xF0,0x06,0xBA,0x0C,0x8A,0x02,0x41,0x8C,0xBD, +0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF,0xF9,0x6E,0xC2,0xE0,0x10,0x01,0x89,0x63,0xEC, +0x77,0x06,0x98,0x10,0xA1,0x07,0x0C,0x8A,0x02,0x88,0x6C,0xE7,0xFF,0xF9,0x42,0xC3, +0x00,0x10,0x01,0xEC,0x78,0x06,0xA4,0x0F,0x6E,0x02,0x0F,0x2D,0x02,0x0F,0x4A,0x02, +0x43,0x1B,0xCC,0x23,0x00,0xFC,0xC3,0x20,0x1F,0xE0,0x20,0x00,0xE1,0xC3,0x80,0x10, +0x01,0xEF,0xBC,0x06,0xA2,0xC3,0x80,0x10,0x01,0xEF,0x9C,0x06,0xB6,0x43,0xBD,0xE5, +0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xD7,0x1C,0x00,0xCC,0x41,0x6B,0xDB, +0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17,0xC0,0x43,0x5A,0xC5,0x0F,0x4A,0x00,0xE4,0x00, +0x00,0x15,0x42,0xFA,0x1D,0x0E,0xEA,0x00,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1, +0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26, +0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x61,0x24,0x0D,0x81, +0x20,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E,0x21,0x0C, +0x0E,0x41,0x08,0x5E,0x23,0x00,0x0E,0x61,0x04,0x56,0x11,0x03,0x4E,0xF1,0x11,0x5E, +0x00,0x09,0x99,0xC0,0x4A,0x41,0x01,0x99,0x80,0x9A,0x64,0x0D,0x21,0x2C,0x8E,0x57, +0x89,0x44,0x89,0xAE,0x89,0x6C,0x99,0xE0,0x42,0x73,0x25,0xE4,0x00,0x00,0xF3,0x42, +0xF3,0x54,0xD6,0xF1,0x01,0xD8,0x22,0x04,0x4A,0x51,0xC0,0x10,0x11,0x6A,0x00,0x89, +0xAE,0x51,0x80,0x10,0xE4,0x00,0x00,0x6B,0x22,0x08,0x4A,0x51,0xC0,0x10,0x11,0x6A, +0x00,0x11,0x8A,0x01,0x89,0xAE,0xE4,0x00,0x00,0x47,0x22,0x0C,0x7E,0x11,0x6A,0x00, +0x11,0x8A,0x01,0x11,0xAA,0x02,0x51,0xC0,0x10,0xE4,0x00,0x00,0x21,0x11,0x6A,0x00, +0x11,0x8A,0x01,0x11,0xAA,0x02,0x11,0xCA,0x03,0x4E,0xEC,0x80,0x4C,0x8C,0xC0,0x8C, +0x97,0x4E,0xEE,0x80,0x4F,0x0B,0x40,0x4C,0xAE,0xC0,0x8C,0xB7,0x4E,0xED,0x40,0x88, +0x6F,0x8C,0x8B,0x8C,0xAD,0x8C,0x98,0x8C,0xB7,0x9D,0xE1,0xE4,0x00,0x90,0x48,0x5D, +0xEF,0x00,0x9D,0x44,0xD5,0xF2,0xFC,0x5E,0x0E,0x61,0x06,0x0E,0x41,0x0A,0x0E,0x21, +0x0E,0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22, +0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xEE,0xF7,0x00,0xE2,0x5E,0xE0,0x41,0x1C,0x21,0xE8,0x0D,0x61,0x0C,0x0D, +0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x0D,0x41,0x10,0x89,0x63,0x5D,0x84,0x00, +0x49,0xA1,0x01,0xE4,0x00,0x54,0xDE,0xC3,0x14,0x00,0x01,0xCB,0x18,0x7A,0x30,0x0A, +0xF8,0x01,0xC6,0xF7,0x01,0x00,0x5E,0xF7,0x04,0x22,0xE3,0xD8,0xFC,0x60,0x01,0x00, +0x99,0x40,0xE4,0x00,0x19,0xEC,0xE4,0x00,0x00,0x31,0x88,0x6A,0x98,0x81,0x88,0xAD, +0x9D,0x41,0xE4,0x00,0xA5,0x16,0x5D,0x4A,0x00,0x0C,0x6B,0x01,0x9D,0x62,0xD5,0x4C, +0xFF,0x66,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21, +0x16,0x1C,0x21,0x18,0x85,0x29,0xFC,0x21,0xFD,0xF0,0xED,0x41,0x02,0x08,0xED,0xE1, +0x01,0xF4,0xEE,0x01,0x01,0xF0,0xED,0x21,0x02,0x0C,0xED,0x61,0x02,0x04,0xED,0x81, +0x02,0x00,0xED,0xA1,0x01,0xFC,0xED,0xC1,0x01,0xF8,0xEE,0x21,0x01,0xEC,0xEE,0x41, +0x01,0xE8,0xEE,0x61,0x01,0xE4,0xC2,0x00,0x10,0x01,0xC1,0xE0,0x10,0x01,0x89,0x43, +0xFE,0x10,0x07,0xE8,0xFD,0xEF,0x08,0x06,0x20,0x60,0x30,0x20,0x68,0x88,0x20,0x64, +0x30,0x24,0x64,0x63,0x99,0x80,0xE4,0x00,0x00,0x0D,0x99,0x81,0xCD,0x8C,0x00,0x1A, +0x51,0x60,0x1A,0x8D,0x90,0xE4,0x00,0x00,0x29,0xD0,0x64,0x00,0x62,0x99,0x80,0x89, +0x6C,0xE4,0x00,0x00,0x11,0x89,0x8F,0x99,0x63,0x9A,0xE0,0x89,0xC1,0x53,0x20,0x10, +0xE4,0x00,0x00,0x19,0x43,0x0E,0xBC,0x9E,0xE1,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5, +0x78,0xFF,0xAD,0x88,0x6B,0x88,0x81,0x99,0xA3,0xE7,0xFF,0xFC,0x18,0x89,0xC1,0xFE, +0x20,0xFE,0xB0,0xCA,0x40,0x01,0x50,0x52,0x60,0x3F,0x1C,0x61,0x60,0x88,0x8B,0xE7, +0xFF,0xFD,0xBE,0x1F,0x21,0x60,0x8B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x93,0x0A,0xF9, +0x00,0xC2,0xFF,0xD5,0xEC,0x20,0x00,0x39,0x43,0x71,0xBD,0xC3,0x60,0x2A,0x0C,0xE4, +0x00,0x00,0x0F,0x5E,0xE0,0x19,0x4B,0x61,0x01,0x23,0x60,0x98,0xFE,0xF7,0x01,0x50, +0x13,0x58,0x00,0x42,0xF7,0x90,0x8E,0xFA,0x5E,0xF7,0x06,0x26,0xFC,0x34,0x5E,0xE7, +0xF1,0x4A,0xF7,0x98,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x1A,0xF8,0x00,0x9B,0x40,0x9F, +0x01,0x9F,0x22,0x42,0xF8,0x75,0x5E,0xF7,0x00,0xD5,0x77,0xFD,0xAD,0x23,0x40,0x24, +0x9A,0xE0,0xE4,0x00,0x00,0x51,0x88,0x6B,0x88,0x81,0x9D,0xBF,0xE7,0xFF,0xFB,0x12, +0x5D,0xAD,0x00,0x21,0xA2,0x1E,0xE7,0xFF,0xFF,0xD5,0x43,0x0C,0xBC,0x1F,0x21,0x00, +0x8F,0x37,0x9E,0xE1,0x13,0x39,0x00,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5,0x78,0xFF, +0x6D,0x21,0x40,0x64,0x21,0x48,0x28,0x21,0x44,0x8C,0xD1,0x44,0x01,0xCA,0x99,0x60, +0x99,0x80,0x88,0x8B,0x89,0x4C,0xE4,0x00,0x00,0x77,0xC1,0x80,0x10,0x01,0x99,0x60, +0x88,0x90,0xFD,0x8C,0x0A,0x9C,0xE4,0x00,0x00,0x2D,0xC0,0x80,0x10,0x01,0xC1,0x80, +0x10,0x01,0x99,0x61,0xFC,0x84,0x08,0x02,0xFD,0x8C,0x0B,0x04,0x51,0x40,0x1A,0xE4, +0x00,0x00,0x25,0xC1,0x80,0x10,0x01,0x99,0x68,0x88,0x8F,0xFD,0x8C,0x0B,0x28,0x99, +0x43,0x88,0x6A,0xE7,0xFF,0xFA,0x24,0xFD,0xA1,0x01,0x20,0x88,0x8A,0x88,0x6D,0xE7, +0xFF,0xFB,0xDE,0x9A,0xE0,0xE4,0x00,0x00,0x33,0x4F,0x17,0x10,0x4F,0x37,0x08,0x8F, +0x0C,0x8F,0x2D,0x9E,0xE1,0x0B,0x39,0x00,0x4F,0x39,0x40,0x0F,0x38,0x00,0x5F,0x17, +0x00,0xD5,0x58,0xFF,0x45,0x88,0x6B,0xE4,0x00,0x52,0x3C,0xED,0x21,0x02,0x0E,0xEE, +0x61,0x01,0xE6,0xEE,0x41,0x01,0xEA,0xEE,0x21,0x01,0xEE,0xEE,0x01,0x01,0xF2,0xED, +0xE1,0x01,0xF6,0xED,0xC1,0x01,0xFA,0xED,0xA1,0x01,0xFE,0xED,0x81,0x02,0x02,0xED, +0x61,0x02,0x06,0xED,0x41,0x02,0x0A,0xFC,0x21,0x02,0x10,0x85,0x29,0x9C,0x38,0xC2, +0xE0,0x10,0x01,0x0D,0x21,0x04,0xFE,0xF7,0x07,0xE8,0x9B,0x00,0x13,0x37,0x00,0x4F, +0x39,0x08,0x9E,0xE1,0x8F,0x19,0xC3,0x20,0x10,0x01,0xFF,0x39,0x08,0x02,0xD6,0xF9, +0xFF,0x76,0xC2,0xE0,0x10,0x01,0xF3,0x57,0x08,0x06,0xFE,0xF7,0x08,0x06,0x13,0x37, +0x02,0x13,0x77,0x01,0x98,0x60,0x42,0xFB,0xD4,0x98,0x80,0x8E,0xF9,0x53,0x20,0x37, +0x4E,0xF7,0x08,0x8E,0xF8,0x97,0x03,0x4E,0xF7,0x09,0xCB,0x18,0xD0,0x8F,0xCE,0xF7, +0x03,0x5B,0x42,0xF7,0xC9,0xCE,0xF7,0x00,0x1D,0xD6,0xF8,0x00,0xA1,0x97,0x2F,0x98, +0x60,0xCB,0x39,0x42,0x3F,0x98,0x82,0xD6,0xF9,0x00,0x31,0x98,0x87,0xE4,0x00,0x9A, +0x14,0x0D,0x21,0x06,0x98,0x61,0x98,0x80,0x9C,0x28,0xE4,0x00,0x99,0xFB,0x9C,0x38, +0x98,0x80,0x0D,0x21,0x04,0x98,0x66,0xE4,0x00,0x2E,0x6A,0x98,0x60,0xE7,0xFF,0xFA, +0xF2,0x98,0x66,0x98,0x87,0xE4,0x00,0x2E,0x4E,0x0D,0x21,0x06,0x98,0x64,0x9C,0x28, +0xE7,0xFF,0xFA,0xCD,0xC2,0xE0,0x10,0x01,0x5C,0xA0,0x29,0xF3,0x37,0x0B,0x1A,0x53, +0x40,0x40,0x52,0xE0,0x20,0xC3,0x60,0x10,0x01,0x4B,0x5A,0xB8,0xFF,0x7B,0x09,0x0C, +0x20,0x60,0x6C,0xE4,0x00,0x00,0x55,0x4F,0x17,0x08,0x9E,0xE1,0x8F,0x1B,0x0B,0x18, +0x00,0xD7,0x58,0x00,0x78,0x98,0x61,0xE4,0x00,0x00,0xD9,0x9A,0xE0,0x43,0x40,0xD5, +0x5F,0x17,0x00,0xD7,0x38,0xFF,0x25,0x98,0x60,0xE4,0x00,0x00,0xB5,0x20,0x67,0xEA, +0x9A,0xE0,0x20,0x80,0xA6,0x9A,0xE0,0x43,0x80,0xD5,0xE4,0x00,0x00,0x7D,0x4F,0x17, +0x08,0x8F,0x1B,0x0B,0x18,0x00,0x4F,0x98,0xFA,0x47,0x1C,0xC6,0x43,0x18,0xE5,0x0B, +0x84,0x00,0xD7,0x1C,0x00,0x38,0x0F,0x04,0x01,0x9E,0xE1,0x5F,0x17,0x00,0xD7,0x38, +0xFF,0x05,0xE7,0xFF,0xFF,0xA7,0x4F,0x17,0x08,0x8F,0x1B,0x0B,0x18,0x00,0xD7,0x98, +0xFD,0x3C,0x9E,0xE1,0xD7,0x1A,0xFD,0x0C,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x5D,0xE7, +0xFF,0xFF,0x51,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF3,0xB7,0x0B, +0x1A,0xC3,0xC0,0x10,0x01,0x9A,0xE0,0xFF,0x18,0x06,0xC0,0x8B,0x37,0xFF,0xDE,0x09, +0x0C,0xE4,0x00,0x00,0x5B,0x4F,0x57,0x08,0x0B,0x98,0x00,0x8F,0x5E,0x0B,0x5A,0x00, +0x43,0x9A,0xE5,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x66,0x11,0x20, +0x00,0x21,0x9F,0x21,0x5F,0x39,0x00,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02,0x5F,0x57, +0x00,0xD7,0xBA,0xFE,0xA5,0x5F,0x20,0x93,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xC3,0x40,0x10,0x01,0xF3,0x37,0x0B,0x1A,0xC3,0x60,0x10,0x01,0x9A,0xE0,0xFF, +0x5A,0x06,0xC0,0xFF,0x7B,0x09,0x0C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08,0x9E,0xE1, +0x43,0x9A,0xC4,0x8F,0x1B,0x0B,0x18,0x01,0x0F,0x1C,0x01,0x5F,0x17,0x00,0xD7,0x38, +0xFF,0x6D,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8A,0xC2,0xE0,0x10,0x01, +0x9C,0x38,0xF8,0x17,0x08,0x83,0x0D,0x21,0x04,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0x9D,0x20,0x64,0x26,0x98,0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80,0xE4,0x00, +0x2F,0xA0,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEC,0x17,0x06,0xBC,0x9C,0x28,0xE4, +0x00,0x4B,0xFB,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0xEB,0x17,0x00, +0xD5,0x0D,0x21,0x14,0x0D,0x61,0x0C,0x0C,0x01,0x07,0x89,0x43,0xC7,0x18,0x01,0x00, +0x98,0x60,0xD3,0x00,0x06,0x3A,0xEB,0x17,0x00,0xD5,0xC7,0x18,0xFE,0xFF,0xEF,0x17, +0x00,0xD5,0xE4,0x00,0x46,0x32,0xE4,0x00,0x47,0x3E,0x21,0x44,0x36,0x98,0x61,0xE4, +0x00,0x7B,0x62,0xE4,0x00,0x00,0x11,0xE4,0x00,0x7B,0x9C,0xC2,0xE0,0x10,0x01,0xED, +0x77,0x06,0xBE,0x5D,0x60,0x01,0x0C,0x01,0x07,0x98,0x61,0x1C,0x81,0x06,0x98,0xA1, +0x48,0x84,0x00,0x88,0xCA,0xE7,0xFF,0xFC,0x5E,0xC2,0xE0,0x10,0x01,0x20,0x60,0xE6, +0xF3,0x17,0x08,0x8A,0x9F,0x01,0xFB,0x17,0x08,0x8A,0x0A,0xE1,0x06,0xD2,0xEF,0x00, +0x94,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0x83,0x9F,0x01,0xFB,0x17,0x08,0x83,0x98, +0x63,0x21,0x44,0x36,0x98,0x81,0xE4,0x00,0x78,0x06,0xE4,0x00,0x00,0x6B,0xE4,0x00, +0x78,0x5C,0xE4,0x00,0x00,0x5B,0xF8,0x17,0x08,0x8A,0xC2,0xE0,0x10,0x01,0xF8,0x17, +0x08,0x83,0x21,0x63,0x76,0x0A,0xE1,0x06,0x5E,0xEC,0x11,0x23,0xFF,0x51,0x21,0x44, +0x36,0x98,0x61,0xE4,0x00,0x4F,0xEA,0xE4,0x00,0x00,0x11,0xE4,0x00,0x50,0x24,0x9B, +0x01,0xC2,0xE0,0x10,0x01,0x98,0x61,0xEF,0x17,0x06,0xBC,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x08,0x9D,0x9F,0x01,0xFB,0x17,0x08,0x9D,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D, +0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x26,0x98, +0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80,0xE4,0x00,0x2D,0x6A,0x0D,0x21,0x06, +0x9C,0x28,0xE4,0x00,0x49,0xD5,0x98,0x81,0x98,0x60,0x88,0xA4,0xE7,0xFF,0xA7,0xEB, +0xC2,0xE0,0x10,0x01,0x98,0x61,0xF2,0xF7,0x08,0x8A,0xD2,0xEA,0x00,0x95,0xC2,0xE0, +0x10,0x01,0xF2,0xF7,0x08,0x83,0x5E,0xE0,0xBB,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xF2,0xF7,0x08,0x9D,0x5E,0xE1,0xDB,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x00,0x00,0x0C,0x17,0x00,0x0C,0x17,0x19,0x0C,0x17,0x1B,0xEC, +0x17,0x00,0xA1,0xEC,0x17,0x00,0xA3,0xEC,0x17,0x00,0xA5,0xEC,0x17,0x00,0xA7,0xF8, +0x17,0x00,0xA8,0xEC,0x17,0x00,0xAC,0x1F,0x17,0x08,0xEC,0x17,0x00,0xA1,0x0F,0x17, +0x04,0x1F,0x17,0x20,0x0F,0x17,0x1C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD9,0x53, +0x18,0x02,0xEF,0x17,0x00,0xD9,0x85,0x29,0xC3,0x20,0x10,0x01,0xFF,0x19,0x00,0x00, +0x1E,0xF8,0x20,0x5C,0x63,0x04,0x0E,0xF8,0x1C,0x9A,0xE0,0xE4,0x00,0x00,0x29,0x0F, +0x38,0x1E,0x43,0x44,0xBC,0x8F,0x37,0x13,0x5A,0x00,0x9E,0xE1,0x1B,0x59,0x00,0x5F, +0x37,0x04,0xD4,0x79,0xFF,0x6D,0x9A,0xE1,0xEE,0xF8,0x00,0xAC,0x85,0x29,0x9C,0x38, +0x0D,0x21,0x04,0x0D,0x41,0x00,0x5D,0x43,0x00,0xE7,0xFF,0xFE,0xEA,0x88,0x6A,0xE4, +0x00,0x95,0xF0,0x0D,0x21,0x06,0x0D,0x41,0x02,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE0, +0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0x0D, +0xE1,0x04,0x0D,0x21,0x1C,0x0E,0x01,0x00,0xC1,0xA0,0x10,0x01,0xE4,0x00,0x97,0x62, +0xC1,0x80,0x10,0x01,0xC1,0xC0,0x10,0x01,0xC1,0xE0,0x10,0x01,0x5C,0x63,0x00,0xFD, +0xAD,0x00,0xC8,0xFD,0x8C,0x08,0x1A,0xFD,0x6E,0x00,0xC0,0xFD,0x4F,0x00,0x00,0xD0, +0x60,0x23,0xFA,0xE4,0x00,0x97,0x60,0x5C,0x63,0x00,0x20,0x60,0xDC,0x0C,0x0A,0x19, +0xE4,0x00,0x97,0xEC,0xE4,0x00,0x0D,0x38,0xEC,0x6A,0x00,0xA5,0xE4,0x00,0x00,0x4B, +0x0E,0xEA,0x06,0x0A,0x0A,0x19,0x8E,0x17,0xE4,0x00,0x97,0xF0,0x18,0x70,0x00,0x0A, +0xEA,0x19,0xD2,0xEE,0x00,0x8D,0x0A,0xEA,0x19,0x9E,0xE1,0x5E,0xF7,0x04,0x0E,0xEA, +0x19,0x99,0xC0,0xE4,0x00,0x96,0x6E,0x5C,0x63,0x00,0x20,0x63,0x5A,0x0E,0xEA,0x06, +0x13,0x17,0x00,0x5F,0x0A,0x09,0x20,0x00,0x65,0x0A,0xEA,0x19,0xD2,0xE4,0x04,0x0E, +0xE4,0x00,0x97,0x18,0x0A,0xEA,0x19,0xD2,0xE0,0x04,0x4E,0xE4,0x00,0x0B,0x0B,0x13, +0x17,0x00,0x23,0x08,0x36,0x0A,0xEA,0x19,0x22,0xE9,0x96,0xE7,0xFF,0xFF,0xCB,0x13, +0x17,0x00,0x23,0x04,0x36,0x0A,0xEA,0x19,0x22,0xE5,0x56,0xE7,0xFF,0xFF,0xAB,0x13, +0x17,0x00,0x5F,0x0A,0x29,0x20,0x01,0x0B,0x13,0x17,0x00,0x5F,0x0A,0x49,0x23,0xFE, +0xEF,0x13,0x17,0x00,0x5F,0x0A,0x69,0x20,0x00,0xC3,0x13,0x17,0x00,0x5F,0x0A,0x89, +0x20,0x00,0x9F,0x13,0x17,0x00,0x5F,0x0B,0x09,0x20,0x00,0x7B,0x13,0x17,0x00,0x5F, +0x0B,0x29,0x23,0xFE,0x5F,0x13,0x17,0x00,0x5F,0x04,0x09,0x20,0x00,0x33,0x12,0xF7, +0x00,0x5E,0xE4,0x29,0x20,0x00,0x25,0x0A,0xEA,0x19,0x22,0xEE,0x18,0x98,0x61,0xE4, +0x00,0xA7,0x5E,0x9D,0xC1,0xC1,0xC4,0xE2,0x0E,0x23,0xFD,0x6B,0xE7,0xFF,0xFE,0xE9, +0x0E,0xEA,0x06,0x13,0x17,0x00,0xD3,0x00,0x27,0xD2,0x13,0x17,0x00,0x5F,0x0B,0x9B, +0x20,0x13,0xC1,0x13,0x17,0x00,0x5F,0x0A,0x49,0x07,0x00,0x80,0x20,0x00,0xA5,0x0B, +0x2A,0x19,0xD3,0x24,0x1B,0x16,0x13,0x37,0x01,0x13,0x57,0x02,0x12,0xF7,0x03,0x4F, +0x39,0x40,0x47,0x39,0xD5,0xC3,0x22,0x7F,0xEE,0x20,0x0D,0x2D,0x8F,0x19,0x1A,0xF8, +0x00,0xE4,0x00,0x06,0x87,0x13,0x37,0x00,0x5F,0x2A,0x69,0x20,0x02,0xCD,0x0B,0x2A, +0x19,0xD3,0x23,0x25,0x7E,0x13,0x57,0x01,0x13,0x37,0x02,0x4E,0xFA,0x40,0x46,0xF7, +0xCD,0xCB,0x20,0x14,0x00,0xC2,0xE2,0x80,0x0A,0x4A,0xF7,0xC8,0x8E,0xF8,0x0E,0xEA, +0x1C,0xFE,0xE0,0x08,0x00,0xEE,0xEA,0x00,0xA1,0xE4,0x00,0x00,0x1D,0xE4,0x00,0x0A, +0x3E,0x98,0x61,0xE4,0x00,0x0A,0x72,0xE4,0x00,0x93,0xE0,0x5C,0x63,0x00,0x20,0x63, +0xBC,0xEC,0x0A,0x00,0xA3,0xE4,0x00,0x94,0xE8,0xE4,0x00,0x94,0x7A,0xEB,0x0A,0x00, +0xA3,0xEA,0xEA,0x00,0xA1,0xD7,0x17,0x01,0x26,0xEA,0xEA,0x00,0xA3,0xEA,0xEA,0x00, +0xA1,0xE4,0x00,0x94,0x70,0xE4,0x00,0x94,0xDC,0xE4,0x00,0x94,0xA0,0xEC,0x0A,0x00, +0xA3,0xEC,0x0A,0x00,0xA1,0xE4,0x00,0x08,0x77,0xE4,0x00,0x93,0xCE,0x5C,0x63,0x00, +0x20,0x63,0x66,0xE4,0x00,0x93,0x22,0x5C,0x63,0x00,0x20,0x63,0x0C,0xEA,0xEA,0x00, +0xA3,0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x92,0x9C,0xEA,0xEA,0x00, +0xA3,0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xE7,0xFF,0xFF,0x47,0x13,0x17, +0x00,0xD3,0x01,0x04,0x26,0x0A,0xEA,0x19,0xD2,0xE1,0x13,0xE6,0xFE,0xEA,0x00,0xB4, +0xEE,0xEA,0x00,0xB0,0x12,0xEB,0x00,0x22,0xE0,0x4A,0x9A,0xE8,0x53,0x00,0x52,0xFA, +0xEA,0x00,0xBC,0x9A,0xE8,0xE4,0x00,0x00,0x21,0x9A,0xE8,0x53,0x00,0x62,0xFA,0xEA, +0x00,0xBC,0x52,0xE0,0x80,0x1F,0x20,0x81,0xFB,0x2A,0x00,0xB4,0x13,0x2B,0x00,0xFB, +0x2A,0x00,0xB5,0xFB,0x0A,0x00,0xB6,0xF8,0x0A,0x00,0xB7,0x5E,0xF7,0x00,0xFA,0xEA, +0x00,0xB8,0xF8,0x0A,0x00,0xB9,0xF8,0x0A,0x00,0xBA,0xC2,0xE0,0x10,0x01,0xF8,0x0A, +0x00,0xBB,0xEB,0x17,0x00,0xD9,0xC7,0x18,0xFF,0xFD,0xEF,0x17,0x00,0xD9,0x12,0xEC, +0x00,0x52,0xF7,0x01,0x9B,0x01,0x1A,0xEC,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08, +0x33,0xE4,0x00,0x04,0x07,0x13,0x17,0x00,0x23,0x09,0x4A,0x0B,0x0A,0x19,0xD3,0x02, +0x0F,0xB6,0x12,0xF7,0x01,0x22,0xE0,0x4A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9, +0x18,0x17,0x00,0xE4,0x00,0x00,0x29,0x22,0xE4,0x5E,0xC2,0xF4,0x00,0x01,0x9B,0x01, +0xCA,0xF7,0x3D,0xF9,0x1B,0x17,0x00,0x12,0xF7,0x00,0xE4,0x00,0x00,0x2D,0xD2,0xE2, +0x0E,0x36,0xC3,0x14,0x00,0x01,0xCB,0x18,0x3D,0xF9,0x1A,0xF8,0x00,0x12,0xF8,0x00, +0x5E,0xF7,0x00,0x1A,0xEB,0x00,0xE4,0x00,0x03,0x5D,0x13,0x17,0x00,0x5F,0x0B,0x01, +0x20,0x00,0x31,0x13,0x17,0x00,0x5F,0x0B,0x29,0x20,0x04,0xB5,0x0B,0x0A,0x19,0x23, +0x0C,0xB6,0xC3,0x00,0x10,0x01,0x9B,0x21,0xEF,0x38,0x06,0x88,0x13,0x17,0x01,0x12, +0xF7,0x02,0x4F,0x18,0x40,0x47,0x18,0xBD,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x20, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x34,0xE4,0x00,0x02,0xD9,0x0B,0x0A,0x19,0xD3, +0x04,0x0B,0x2E,0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xFE,0x23,0x00,0x68,0xEB,0x2A, +0x00,0xA5,0xEB,0x0A,0x00,0xA7,0x43,0x19,0xC5,0xD3,0x0A,0x00,0x60,0xF3,0x0A,0x00, +0xA8,0xF8,0x0A,0x00,0xA8,0x11,0xD7,0x01,0xC1,0xA0,0x10,0x01,0x13,0x57,0x02,0xFD, +0x6D,0x07,0x00,0x13,0x17,0x03,0x4E,0xEE,0x08,0x43,0x2B,0xBC,0x9E,0xE1,0x1B,0x59, +0x00,0x8E,0xEB,0x1B,0x17,0x00,0xC2,0xE0,0x10,0x01,0x99,0x81,0xED,0x97,0x06,0xFC, +0xE4,0x00,0x06,0xA0,0xEC,0x6A,0x00,0xA7,0xF2,0xEA,0x00,0xA8,0x4D,0xCC,0x74,0x45, +0xCE,0xBD,0x5D,0xCE,0x00,0xF9,0xCA,0x00,0xA8,0xF2,0xEA,0x00,0xA8,0x56,0xF7,0x01, +0xD2,0xE0,0x07,0xA2,0xF2,0xEA,0x00,0xA8,0x56,0xF7,0x02,0xD2,0xE0,0x07,0x4A,0xF2, +0xEA,0x00,0xA8,0x56,0xF7,0x04,0xD2,0xE0,0x06,0xF2,0xF2,0xEA,0x00,0xA8,0x56,0xF7, +0x08,0xD2,0xE0,0x06,0x9A,0xF3,0x4D,0x07,0x00,0x13,0x0B,0x01,0x12,0xEB,0x02,0x4E, +0xF7,0x40,0x13,0x2B,0x03,0x4F,0x5A,0xC0,0x4F,0x18,0x80,0x47,0x1A,0xC5,0x47,0x18, +0xCD,0x47,0x18,0xBD,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x34,0x13,0x4B,0x04,0x13, +0x0B,0x05,0x12,0xEB,0x06,0x4E,0xF7,0x40,0x13,0x2B,0x07,0x4F,0x5A,0xC0,0x4F,0x18, +0x80,0x47,0x1A,0xC5,0x47,0x18,0xCD,0x47,0x18,0xBD,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x08,0x20,0xF2,0xEA,0x00,0xA8,0xF8,0x0A,0x00,0xA8,0xC2,0xE0,0x10,0x01,0xED,0x97, +0x06,0x88,0xE4,0x00,0x00,0xE5,0x13,0x17,0x00,0x5F,0x04,0x09,0x20,0x00,0x99,0x0B, +0x0A,0x19,0x23,0x0D,0x8A,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9,0x40,0x46,0xF7, +0xC5,0xC2,0xEB,0x54,0xA4,0x20,0x01,0x3D,0x12,0xED,0x00,0x52,0xF7,0x03,0xE4,0x00, +0x00,0x87,0x13,0x17,0x00,0x5F,0x04,0x29,0x20,0x06,0xE1,0x0B,0x0A,0x19,0x23,0x0C, +0xDA,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9,0x40,0x46,0xF7,0xC5,0xC3,0x00,0x10, +0x01,0xEE,0xF8,0x00,0xCC,0x12,0xED,0x00,0x57,0x37,0x01,0x23,0x20,0x64,0xEF,0x18, +0x00,0xCE,0x23,0x00,0x32,0x9B,0x1B,0x46,0xF7,0xC4,0xE4,0x00,0x00,0x0F,0x52,0xF7, +0x04,0x1A,0xED,0x00,0x0C,0x0A,0x00,0x0C,0x0A,0x19,0xE4,0x00,0x02,0xED,0xE4,0x00, +0x8D,0xD2,0x5C,0x63,0x00,0xD0,0x60,0x0B,0x5A,0xE4,0x00,0x8F,0x14,0xE4,0x00,0x8E, +0xD8,0x50,0x60,0x20,0xE4,0x00,0x03,0xD0,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9, +0x12,0xF7,0x00,0x1A,0xEB,0x00,0x12,0xEB,0x00,0x22,0xE0,0x42,0xC2,0xE0,0x10,0x01, +0x99,0xC6,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0xD8,0x12,0xEB,0x00,0x22,0xE0,0x4E,0x12, +0xED,0x00,0x56,0xF7,0x01,0x5E,0xE0,0x09,0x49,0xC4,0x43,0xE4,0x00,0x00,0x43,0x12, +0xEB,0x00,0x22,0xE4,0x2A,0x51,0xC0,0x80,0xE4,0x00,0x00,0x29,0x12,0xEB,0x00,0x22, +0xEB,0xD8,0x12,0xEB,0x00,0x22,0xEF,0xC0,0xC9,0xC0,0xFF,0xFF,0xEE,0xEA,0x00,0xAE, +0x22,0xE4,0x2E,0xED,0xCA,0x00,0xA1,0xEC,0x0A,0x00,0xAC,0xE4,0x00,0x8D,0xFC,0xEA, +0xEA,0x00,0xA1,0xD5,0xD7,0x00,0x71,0x12,0xEC,0x00,0x56,0xF7,0x01,0xD2,0xE0,0x05, +0x22,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0x50,0x23,0x00,0x24,0x9F,0x1F,0xFB,0x17, +0x08,0x50,0xEC,0x0A,0x00,0xA3,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x2C,0xF1, +0xAA,0x00,0xBC,0xE4,0x00,0x00,0xAD,0xE9,0xAA,0x00,0xA1,0xE4,0x00,0x00,0x9D,0x12, +0xEB,0x00,0x22,0xE0,0x42,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x56,0xE4,0x00, +0x00,0x3D,0xE4,0x00,0x8B,0xDE,0x5C,0x63,0x00,0x20,0x63,0xE4,0xE7,0xFF,0xFF,0xD3, +0xEA,0xEA,0x00,0xA3,0xEF,0x0A,0x00,0xB2,0xE4,0x00,0x00,0x17,0xEA,0xEA,0x00,0xA3, +0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x8B,0x5E,0xEA,0xEA,0x00,0xA3, +0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xEA,0xEA,0x00,0xA3,0xD6,0xED,0xFD, +0x96,0xE4,0x00,0x8D,0x04,0xE4,0x00,0x8C,0xC8,0xEC,0x0A,0x00,0xA1,0xEC,0x0A,0x00, +0xA3,0xE4,0x00,0x00,0x45,0x98,0x60,0x9D,0x61,0xE4,0x00,0x8A,0xFC,0xE4,0x00,0x00, +0x0D,0x99,0x60,0xD5,0xCB,0xFF,0x95,0xE4,0x00,0x8C,0xB8,0xE4,0x00,0x8C,0x7C,0xEC, +0x0A,0x00,0xA1,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD9,0x53,0x18,0x02,0xEF,0x17, +0x00,0xD9,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x33,0xC3,0x00,0x32,0x0A,0x20,0x00, +0x49,0x13,0x0C,0x00,0x9B,0x3E,0xEC,0x17,0x08,0x33,0x47,0x18,0xCC,0x1B,0x0C,0x00, +0x0E,0x01,0x02,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D, +0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0xE4,0x00,0x93,0x30,0x98,0x60,0x88,0x83,0xE4,0x00,0x90,0x62,0x98,0x61, +0x98,0x82,0xE4,0x00,0x90,0x52,0x98,0x60,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x8C,0x3E, +0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x8D,0xA4,0x0D,0x21,0x06,0x9C,0x28,0xE4, +0x00,0x95,0xFB,0x20,0x64,0x1E,0xE4,0x00,0x97,0x25,0xE4,0x00,0x97,0x43,0x9C,0x38, +0x0D,0x21,0x04,0xE4,0x00,0x97,0x58,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x97,0x1F, +0xE4,0x00,0x99,0x17,0xE4,0x00,0x98,0xAD,0xE4,0x00,0x99,0x77,0xE4,0x00,0x99,0xD3, +0xE4,0x00,0x9D,0xB1,0xE4,0x00,0x9B,0x1B,0xE4,0x00,0x9A,0x1F,0xE4,0x00,0x9A,0x55, +0xE4,0x00,0x9A,0x8B,0xE4,0x00,0x9A,0xAF,0xE4,0x00,0x9A,0xD3,0xE4,0x00,0x99,0x09, +0xE4,0x00,0x9B,0x01,0x20,0x60,0x28,0x20,0x64,0x3E,0xE4,0x00,0x00,0x11,0xE4,0x00, +0x9B,0x9D,0xE4,0x00,0x9B,0xB7,0x85,0x29,0xE4,0x00,0x9E,0x55,0xE4,0x00,0x9B,0xC5, +0xC2,0xE0,0x10,0x01,0xE8,0x77,0x00,0xC3,0xEB,0x17,0x00,0xC3,0xD4,0x78,0xFF,0xC6, +0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,0x21,0x0C,0x5D,0x43,0x04, +0xE7,0xFF,0xFF,0xC0,0xC2,0xE0,0x10,0x01,0xFF,0x17,0x00,0xE6,0x89,0x77,0x0C,0x78, +0x03,0xE7,0xFF,0xFF,0x9E,0xFF,0x0B,0x00,0xE6,0x0B,0x18,0x03,0x40,0x63,0xC5,0x5F, +0x03,0x04,0xD5,0x58,0xFF,0x7D,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C, +0x21,0x10,0x85,0x29,0xE4,0x00,0x9E,0x71,0xC3,0x34,0x00,0x01,0xCA,0xF9,0x23,0xFC, +0x0A,0xF7,0x00,0xD2,0xFF,0x04,0x3C,0xC3,0x00,0x10,0x01,0xF2,0xF8,0x07,0x08,0x9E, +0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x07,0x08,0x22,0xE1,0xCA,0xC3,0x00,0x10,0x01,0xC3, +0x60,0x10,0x01,0xFF,0x18,0x03,0x72,0xCA,0xE0,0x11,0x7D,0xCB,0x39,0x22,0x00,0xFF, +0x7B,0x09,0x0C,0x1F,0x57,0xFD,0x57,0x5A,0xFF,0x4F,0x5A,0x10,0x8F,0x59,0x0B,0x9A, +0x01,0x4F,0x97,0x08,0x8F,0x9B,0xEB,0x9C,0xDD,0x3B,0x0F,0x9A,0x01,0x5F,0x57,0x00, +0x5F,0x4F,0xE9,0x57,0x57,0xFF,0x4F,0x5A,0x10,0x8F,0x59,0x0B,0x9A,0x01,0x20,0x00, +0x6D,0xFF,0xA0,0x80,0x00,0x5F,0x9C,0x04,0x47,0x9C,0xEC,0x0B,0xB8,0x01,0xC7,0xBD, +0x7F,0xFF,0x47,0x9C,0xED,0xE4,0x00,0x00,0x0F,0x0B,0x98,0x01,0x0F,0x9A,0x01,0x9E, +0xE1,0x9F,0x02,0xC2,0xE2,0x30,0x04,0x23,0xFE,0xB1,0x85,0x29,0x5C,0x63,0x04,0xE4, +0x00,0x9D,0x43,0x9A,0xE0,0x8B,0x17,0xE4,0x00,0x00,0x1D,0x43,0x23,0xBC,0x9E,0xE1, +0x13,0x39,0x00,0x8F,0x19,0xD4,0x97,0xFF,0xB4,0x40,0x60,0xC5,0x85,0x29,0x9C,0x38, +0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFC,0xFC,0x98,0x61,0xE7,0xFF,0xFC,0xF0,0xC2, +0xE0,0x10,0x01,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0x3A,0x50,0x60,0xC8,0xE7,0xFF,0xFD, +0xCA,0xE4,0x00,0x00,0x15,0x98,0x6F,0xE7,0xFF,0xFD,0x8A,0x0D,0x21,0x06,0x98,0x60, +0x9C,0x28,0xE7,0xFF,0xFC,0xA3,0x9C,0x38,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x04,0xEC, +0x17,0x08,0x31,0x0D,0x41,0x00,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x00,0xC0,0x23,0x00, +0x42,0xC3,0x00,0x10,0x01,0x98,0x66,0xEF,0x18,0x00,0xE2,0x23,0x08,0x78,0xF2,0xF7, +0x00,0xC0,0x50,0x60,0x80,0x22,0xE0,0x52,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xC8, +0x56,0xF7,0x01,0x5E,0xE0,0x09,0x48,0x64,0x43,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00, +0xD9,0x56,0xF7,0x02,0x22,0xE0,0x6C,0xC0,0x80,0x10,0x01,0xFC,0x84,0x07,0x0A,0xE7, +0xFF,0xEE,0x32,0xEA,0xEA,0x00,0xD9,0xC6,0xF7,0xFF,0xFD,0xEE,0xEA,0x00,0xD9,0x0D, +0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFE,0xAF,0x9C,0x30,0xC3,0x00,0x10, +0x01,0x0D,0x21,0x0C,0xFC,0x98,0x07,0x0A,0x0D,0x41,0x08,0x8A,0xE4,0x8B,0x24,0x18, +0x17,0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0x8C,0xD6,0xF8,0xFF,0x9E, +0x52,0xE0,0x62,0x1F,0x19,0x1F,0x1A,0xE4,0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x07, +0x0B,0x18,0x17,0x00,0x9E,0xE1,0xD7,0x17,0xFF,0xDE,0x1E,0xE0,0x9E,0xC3,0x60,0x10, +0x01,0x1A,0xE4,0x1F,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF8,0x12,0xF7,0x00,0xFA, +0xFB,0x07,0x09,0xF2,0xFB,0x07,0x09,0x22,0xEC,0xCC,0xC2,0xE0,0x10,0x01,0xC3,0x40, +0x10,0x01,0xF3,0xB7,0x0B,0x1A,0x9B,0x00,0xC2,0xE0,0x10,0x01,0xC3,0xC0,0x10,0x01, +0xC1,0x00,0x10,0x01,0xFE,0xF7,0x07,0x2A,0xFF,0x5A,0x09,0x48,0x8B,0x38,0xFF,0xDE, +0x0C,0x96,0xFD,0x08,0x09,0x0C,0xE4,0x00,0x01,0x09,0xC3,0x80,0x10,0x01,0x9A,0xE0, +0xFF,0x9C,0x0B,0x04,0x8B,0x64,0x43,0x17,0xE4,0x0B,0x38,0x00,0x43,0x17,0xDC,0x4F, +0x59,0x42,0x1B,0x38,0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0xA5, +0x0C,0x81,0x04,0x50,0x60,0x20,0xE7,0xFF,0xFA,0xBC,0xC1,0x40,0x10,0x01,0xEA,0xEA, +0x00,0xD9,0x0C,0x81,0x06,0x56,0xF7,0x02,0x22,0xE1,0x74,0xE4,0x00,0x00,0x8F,0xF3, +0x9B,0x07,0x09,0x23,0x84,0x34,0x23,0x88,0x68,0x43,0x98,0x44,0xE4,0x00,0x00,0x0F, +0x43,0x98,0xF4,0x15,0x5C,0x01,0x19,0x57,0x00,0x0B,0x9C,0x01,0xE4,0x00,0x00,0x21, +0x0F,0x9A,0x02,0x4D,0x5C,0x82,0x4F,0x9C,0x42,0x19,0x57,0x00,0x1B,0x97,0x01,0x9F, +0x21,0x9F,0x02,0x5F,0x39,0x04,0x9E,0xE2,0x9F,0x44,0xD7,0xB9,0xFE,0x2D,0xE7,0xFF, +0xFF,0x45,0x50,0x60,0x80,0xE7,0xFF,0xEB,0xC6,0xEA,0xEA,0x00,0xD9,0xC6,0xF7,0xFF, +0xFD,0xEE,0xEA,0x00,0xD9,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF, +0xFC,0x41,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF0,0x77,0x0B,0x90,0xC3,0x20, +0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x0B,0xA2,0xFE,0xF7,0x07,0x90,0xFF,0x39, +0x07,0x98,0x9B,0x60,0x98,0x81,0xE4,0x00,0x01,0x7D,0x0B,0x57,0x01,0xC3,0x4F,0xFF, +0xE0,0x20,0x00,0x35,0x0B,0x57,0x03,0xC3,0x4F,0xFF,0xE4,0x20,0x00,0x49,0x0B,0x58, +0x01,0x18,0x19,0x00,0x0F,0x57,0x01,0x0B,0x58,0x03,0x0F,0x57,0x03,0x13,0x59,0x00, +0x23,0x41,0x22,0x0B,0x98,0x03,0x0B,0x57,0x03,0x43,0x5C,0xD5,0x5F,0x5A,0x06,0x4F, +0xDA,0xFA,0x0B,0xB8,0x01,0x47,0x5E,0xD6,0x09,0x17,0x01,0x43,0x5A,0xF5,0x41,0x1D, +0x45,0x5D,0x08,0x06,0x4F,0xC8,0xFA,0x45,0x1E,0x46,0x43,0xC8,0xF5,0x8F,0xDA,0x5F, +0xCC,0x99,0x20,0x00,0x25,0x5F,0x46,0x51,0x20,0x01,0x11,0x18,0x99,0x00,0x0F,0xB7, +0x01,0x0F,0x97,0x03,0xE4,0x00,0x00,0x71,0x0B,0x98,0x01,0x0B,0xD7,0x01,0x43,0xDC, +0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x0B,0x58,0x03,0x41,0x1E,0xED, +0x0B,0xD7,0x03,0x43,0xDA,0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43, +0xBD,0xF5,0xD7,0xA8,0x00,0x52,0x0F,0x97,0x01,0x0F,0x57,0x03,0x0B,0x57,0x01,0x9F, +0x61,0x0F,0x58,0x01,0x5F,0x7B,0x00,0x0B,0x57,0x03,0x9F,0x21,0x0F,0x58,0x03,0x9E, +0xE4,0x1F,0x18,0x30,0xD7,0x63,0xFA,0x36,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x3D,0xF9,0x1C,0x21,0xD8,0xCA,0xF7,0x3D,0xF8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D, +0x81,0x18,0x0D,0xA1,0x14,0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x0E,0x21, +0x04,0x0D,0x21,0x24,0xC1,0x80,0x10,0x01,0xFD,0x8C,0x08,0x86,0x0A,0x2C,0x01,0xC6, +0x31,0x7F,0xFF,0x0E,0x2C,0x01,0x13,0x38,0x00,0xC3,0x00,0x10,0x01,0xFB,0x38,0x00, +0xC0,0x13,0x37,0x00,0xC2,0xE0,0x10,0x01,0xFB,0x37,0x07,0x09,0xC1,0xE0,0x10,0x01, +0xC1,0xC0,0x10,0x01,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0x5D,0xA3,0x00,0xFD, +0xEF,0x09,0x0C,0xFD,0xCE,0x07,0x8C,0xFE,0x00,0x80,0x00,0xFD,0x5B,0x07,0x0A,0xFD, +0x7A,0x0B,0x90,0xD1,0xA1,0x12,0x8E,0x0B,0x2B,0x16,0x0A,0xEB,0x18,0x46,0x11,0x85, +0x0E,0xEB,0x17,0x0E,0x0C,0x01,0x0F,0x2B,0x19,0x13,0x0B,0x00,0xD3,0x01,0x1F,0x79, +0x0B,0x6B,0x46,0x0B,0x0B,0x48,0x0F,0x6B,0x49,0x0F,0x0B,0x47,0xD7,0x17,0x1F,0x4C, +0x0E,0xEB,0x47,0x0F,0x0B,0x17,0x0F,0x2B,0x49,0x0F,0x6B,0x19,0xE4,0x00,0x07,0xB3, +0xC2,0xE0,0x10,0x01,0x5F,0x98,0x04,0xEA,0xF7,0x0B,0x21,0x5F,0x17,0x15,0x4A,0xFC, +0xB8,0x0E,0xEB,0x13,0xCF,0x39,0x00,0x30,0x9A,0xE0,0x8F,0x2B,0x0B,0x19,0x18,0x27, +0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x23,0x5F,0x17,0x15, +0x4A,0xF9,0xB8,0x0E,0xEB,0x15,0xCE,0xFB,0x00,0x30,0x8E,0xEB,0x0B,0x17,0x16,0x9A, +0xE0,0x27,0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x21,0x5F, +0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB,0x43,0xCF,0x7B,0x00,0x30,0x9A,0xE0,0x8F,0x6B, +0x0B,0x1B,0x18,0x27,0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B, +0x23,0x5F,0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB,0x45,0xE4,0x00,0x00,0x63,0xC3,0x00, +0x10,0x01,0x5F,0x77,0x04,0xEB,0x18,0x0B,0x21,0x5E,0xF8,0x15,0x4B,0x1B,0xC0,0x0F, +0x0B,0x13,0x9A,0xE0,0x27,0x3C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x19,0x04,0xEA,0xF7, +0x0B,0x23,0x5F,0x37,0x15,0x4A,0xF8,0xB8,0x0E,0xEB,0x15,0xE7,0xFF,0xFB,0x6E,0x12, +0xEB,0x00,0x26,0xE4,0x7D,0x0B,0x2B,0x43,0x0B,0x0B,0x13,0x43,0x19,0xC5,0x0B,0x2B, +0x45,0x0F,0x0B,0x1B,0x0B,0x0B,0x15,0x43,0x19,0xC5,0x0F,0x0B,0x1D,0xE4,0x00,0x00, +0x15,0x0C,0x0B,0x1B,0x0C,0x0B,0x1D,0xC3,0x00,0x10,0x01,0xF3,0x18,0x00,0xC0,0x23, +0x01,0x9E,0x53,0x00,0x52,0x0B,0x2B,0x13,0x1B,0x0A,0x00,0x4F,0x79,0x41,0x0B,0x0B, +0x15,0x4F,0x7B,0x20,0x4F,0x58,0x41,0x1B,0x2A,0x02,0x57,0x5A,0x0F,0x1B,0x0A,0x03, +0x47,0x5B,0xD5,0x1B,0x4A,0x01,0x26,0xE4,0xA1,0x0B,0x0B,0x1A,0x0A,0xEB,0x1C,0x4F, +0x38,0x42,0x4F,0x57,0x42,0x5F,0x39,0x04,0x57,0x5A,0x0F,0x4F,0x39,0x20,0x1B,0x0A, +0x05,0x47,0x39,0xD5,0x1A,0xEA,0x06,0x1B,0x2A,0x04,0xE4,0x00,0x00,0x1B,0x18,0x0A, +0x04,0x18,0x0A,0x05,0x18,0x0A,0x06,0x88,0x6A,0x98,0x87,0xE7,0xFF,0xF6,0x50,0x18, +0x6A,0x07,0xE4,0x00,0x01,0x8B,0x8B,0x0A,0x18,0x18,0x00,0xC3,0x20,0x10,0x01,0x9F, +0x01,0xFF,0x39,0x07,0x8C,0xD7,0x19,0xFF,0x9E,0x53,0x00,0x62,0x1B,0x0A,0x00,0x0B, +0x0B,0x13,0x4F,0x38,0x41,0x1B,0x0A,0x02,0x0B,0x0B,0x15,0x1B,0x2A,0x01,0x1B,0x0A, +0x04,0x4F,0x38,0x41,0x57,0x17,0x01,0x4E,0xF7,0x20,0x53,0x18,0x20,0x52,0xF7,0x02, +0x1B,0x0A,0x11,0x1A,0xEA,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B, +0x0A,0x0D,0x0A,0xEB,0x1C,0x4F,0x17,0x42,0x1B,0x2A,0x03,0x1B,0x0A,0x0F,0x1A,0xEA, +0x10,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF5,0x7A,0xC2,0xE0,0x10,0x01,0xC3,0x20, +0x10,0x01,0xC3,0x80,0x10,0x01,0x18,0x6A,0x1F,0xFE,0xF7,0x07,0x2A,0xFF,0x39,0x09, +0x48,0x9B,0x00,0xC3,0x60,0x10,0x01,0xFF,0x9C,0x0C,0x96,0xF3,0x5B,0x07,0x09,0x23, +0x44,0x34,0x23,0x48,0x68,0x43,0x58,0x7C,0xE4,0x00,0x00,0x0F,0x43,0x58,0xE4,0x17, +0xBA,0x01,0x1B,0xB7,0x00,0x0B,0x5A,0x01,0xE4,0x00,0x00,0x21,0x0F,0x59,0x02,0x4F, +0xBA,0x82,0x4F,0x5A,0x42,0x1B,0xB7,0x00,0x1B,0x57,0x01,0x9F,0x02,0x9E,0xE2,0x9F, +0x24,0x5F,0x07,0x49,0x23,0xFF,0x1D,0x0A,0xEC,0x00,0xD2,0xFF,0x0F,0x6C,0x9A,0xE1, +0xE4,0x00,0x02,0xF5,0xD1,0xA0,0x05,0x66,0xFE,0xE0,0x7F,0xFF,0xC3,0x20,0x10,0x01, +0xC3,0x40,0x10,0x01,0xEE,0xF9,0x07,0x91,0xF8,0x1A,0x07,0x98,0xFF,0x39,0x07,0x90, +0xFF,0x5A,0x07,0x98,0x0E,0xF9,0x03,0x0E,0xF9,0x05,0x0E,0xF9,0x07,0x18,0x1A,0x01, +0xF2,0xF8,0x00,0xC0,0x22,0xE0,0xB2,0x52,0xE0,0x52,0x1A,0xEA,0x00,0x9A,0xFF,0x88, +0x6A,0x1A,0xEA,0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x05, +0x1A,0xEA,0x06,0x98,0x87,0xE7,0xFF,0xF3,0xFC,0x18,0x6A,0x07,0xE4,0x00,0x00,0x89, +0x8A,0xEA,0x18,0x17,0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0x8C,0xD6, +0xF8,0xFF,0x9E,0x52,0xE0,0x62,0x9B,0x1F,0x1A,0xEA,0x00,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x07,0x0B,0x1B,0x17,0x00,0xC3,0x20,0x10,0x01,0x9E,0xE1,0xFF,0x39,0x07,0x29, +0xD6,0xF9,0xFF,0x9E,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF3,0x74,0x18,0x6A,0x1F, +0x0A,0xEC,0x01,0x0C,0x0E,0x00,0x46,0x10,0xBD,0x0E,0x0C,0x01,0xE4,0x00,0x02,0x77, +0xD1,0xA2,0x06,0x8E,0xF2,0xF8,0x00,0xC0,0x22,0xE0,0xD2,0x52,0xE0,0x52,0xC3,0x00, +0x10,0x01,0x1A,0xEA,0x00,0xEB,0x18,0x08,0x31,0x9A,0xFF,0x1B,0x0A,0x05,0x1A,0xEA, +0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x06,0x88,0x6A,0x98, +0x87,0xE7,0xFF,0xF2,0xE4,0x18,0x6A,0x07,0xE4,0x00,0x01,0x15,0x8A,0xEA,0x18,0x17, +0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0x8C,0xD6,0xF8,0xFF,0x9E,0x52, +0xE0,0x62,0x1A,0xEA,0x00,0x0A,0xEB,0x13,0x4F,0x17,0x41,0x1A,0xEA,0x02,0x1B,0x0A, +0x01,0x0A,0xEB,0x15,0x4F,0x17,0x41,0x1A,0xEA,0x04,0x1B,0x0A,0x03,0x12,0xEB,0x00, +0x57,0x17,0x01,0x4E,0xF7,0x20,0x53,0x18,0x20,0x52,0xF7,0x02,0x1B,0x0A,0x11,0x1A, +0xEA,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B,0x0A,0x0D,0x0A,0xEB, +0x1C,0x4F,0x17,0x42,0x1A,0xEA,0x10,0x1B,0x0A,0x0F,0x88,0x6A,0x50,0x80,0x1F,0xE7, +0xFF,0xF2,0x08,0x9A,0xE0,0x18,0x6A,0x1F,0x43,0x17,0x7C,0x0B,0x38,0x00,0x43,0x17, +0x54,0x4F,0x59,0x42,0x1B,0x38,0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE7,0x49,0x23, +0xFF,0xA5,0x46,0x11,0x85,0x9A,0xE2,0x0E,0x0C,0x01,0x0E,0xEE,0x00,0xE4,0x00,0x00, +0xD5,0x21,0xAD,0x9A,0x1E,0xE0,0xA7,0x1A,0xEA,0x00,0x9A,0xE6,0x1A,0xEA,0x02,0x52, +0xE0,0x50,0x1A,0xEA,0x03,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x31,0x46,0x11,0x85, +0x18,0x0A,0x01,0x0E,0x0C,0x01,0x1A,0xEA,0x04,0x88,0x6A,0x98,0x85,0xE7,0xFF,0xF1, +0x4C,0x0D,0xAE,0x00,0x18,0x6A,0x05,0xE4,0x00,0x00,0x61,0x9B,0x00,0xD2,0xFF,0xE6, +0x10,0xE7,0xFF,0xF9,0x5B,0x0A,0xEB,0x46,0x0B,0x0B,0x16,0x5E,0xF8,0x15,0x4B,0x21, +0x01,0xCE,0xF9,0x00,0x30,0x8E,0xEB,0x4B,0x60,0x0A,0x0B,0x17,0x16,0x9A,0xE0,0xD3, +0x1F,0xE0,0x8C,0xE7,0xFF,0xF8,0x3D,0x0E,0x21,0x06,0x0E,0x01,0x0A,0x0D,0xE1,0x0E, +0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D, +0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x81,0x20, +0x5D,0x43,0x00,0x5D,0x84,0x00,0x42,0xEC,0x55,0x9E,0xE1,0x5E,0xF7,0x00,0x57,0x17, +0x03,0x4E,0xF7,0x11,0x5F,0x00,0x09,0x0D,0x61,0x24,0x0D,0xA1,0x1C,0x0D,0xC1,0x18, +0x49,0xA1,0x01,0x0D,0x21,0x2C,0x8D,0xB7,0xC1,0xD8,0x00,0x21,0xE4,0x00,0x60,0xE2, +0x99,0x60,0xFD,0xCE,0xBA,0xA7,0xE4,0x00,0x00,0xE3,0x88,0x61,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xB9,0xDC,0x9A,0xE4,0x43,0x0E,0x54,0x13,0x58,0x00,0x1F,0x01, +0x18,0x4F,0x3A,0x09,0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B, +0x50,0x7B,0x47,0x5A,0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18, +0x02,0x1F,0x61,0x18,0x47,0x18,0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x9D,0x41,0x5D,0x4A, +0x00,0xD5,0x4C,0x00,0xE1,0x06,0xE0,0x81,0xCC,0x6B,0x00,0x18,0x88,0x81,0x8C,0x77, +0x50,0xA0,0x18,0x9D,0x61,0xE7,0xFF,0xBA,0x16,0xE4,0x00,0x00,0x1D,0x9E,0xE1,0xD2, +0xE8,0xFD,0x4E,0xE7,0xFF,0xFF,0xC5,0x5E,0xEB,0x00,0xD5,0xB7,0xFC,0x85,0xE4,0x00, +0x60,0x04,0x0D,0x21,0x2E,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22,0x0D,0x61, +0x26,0x0D,0x41,0x2A,0x1C,0x21,0x30,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x03, +0x2E,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x07,0xE6,0x85,0x29,0x1C,0x21,0xD0, +0x0D,0x21,0x2C,0x0D,0x41,0x28,0x0D,0x61,0x24,0xD0,0x69,0x0C,0x95,0x4F,0x03,0x10, +0xC2,0xF8,0x00,0x21,0xC1,0x78,0x00,0x21,0xFE,0xF7,0xBA,0x40,0xFD,0x6B,0xBA,0xA7, +0x8E,0xF8,0x0E,0xF7,0x02,0x86,0xE9,0x1C,0x83,0x01,0xCC,0x63,0x00,0x1A,0xCC,0x84, +0x00,0x1A,0x9C,0x9F,0xE7,0xFF,0xFD,0xC6,0xE4,0x00,0x02,0xC7,0x0C,0x61,0x04,0xE4, +0x00,0x5E,0xFC,0x0C,0x61,0x06,0x99,0x40,0x9C,0x7E,0x5C,0x63,0x00,0xCC,0x63,0x00, +0x1A,0x8D,0x63,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xB7,0xE8, +0x8B,0x2A,0x9A,0xE4,0x5F,0x23,0x39,0x20,0x00,0xDD,0x43,0x0B,0xCC,0x13,0x98,0x00, +0x4F,0x7C,0x09,0x57,0x9C,0x01,0x5F,0x80,0x01,0x4B,0x50,0x7B,0x1F,0x01,0x20,0x8F, +0x1B,0x17,0x18,0xE8,0x47,0x1A,0xC4,0x5F,0x57,0x02,0x20,0x00,0x25,0x4F,0x57,0x20, +0x5F,0x5A,0x02,0x1F,0x81,0x20,0x47,0x5A,0xC5,0x8F,0x7C,0x1B,0x5B,0xE8,0x9F,0x21, +0x9E,0xE1,0xD2,0xE8,0xFE,0x16,0x06,0xE0,0x81,0xCC,0x6A,0x00,0x06,0x1C,0x81,0x08, +0x8C,0x77,0x50,0xA0,0x18,0xE7,0xFF,0xB8,0x16,0x9D,0x44,0x5D,0x43,0x89,0x23,0xFE, +0x55,0xE4,0x00,0x01,0xAD,0xE4,0x00,0x5D,0xF0,0x1C,0x61,0x08,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xB6,0xFC,0xC3,0x78,0x00,0x21,0x9A,0xE4,0xFF,0x7B,0xBA,0xA4, +0xD2,0xE7,0x01,0xC2,0x43,0x1B,0xBC,0x13,0x58,0xFC,0x1F,0x01,0x20,0x4F,0x3A,0x09, +0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50,0x7B,0x47,0x5A, +0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x81,0x20, +0x47,0x18,0xD5,0x8F,0x3C,0x1B,0x19,0xE8,0x9E,0xE1,0xD2,0xE8,0xFE,0x36,0xE4,0x00, +0x00,0xD9,0xE4,0x00,0x5D,0x36,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7, +0xFF,0xB6,0x42,0x8B,0x0B,0xE4,0x00,0x00,0x9F,0x43,0x38,0xBC,0x13,0x79,0xFC,0x1F, +0x21,0x20,0x4F,0x5B,0x09,0x57,0x7B,0x01,0x8F,0x3A,0x13,0x39,0xE8,0x5F,0x60,0x01, +0x4B,0x70,0x7B,0x47,0x7B,0xCC,0x5F,0x37,0x02,0x5F,0x7B,0x02,0x20,0x00,0x25,0x4F, +0x37,0x20,0x5F,0x39,0x02,0x1F,0x81,0x20,0x47,0x39,0xDD,0x8F,0x5C,0x1B,0x3A,0xE8, +0x9E,0xE1,0xD2,0xE8,0xFE,0x3E,0xC2,0xF8,0x00,0x21,0x9F,0x04,0xFE,0xF7,0xBA,0xBF, +0xD7,0x17,0x00,0x52,0x9A,0xE4,0xE7,0xFF,0xFF,0x67,0x04,0x60,0x81,0x1C,0x81,0x08, +0x50,0xA0,0x18,0xE7,0xFF,0xB6,0x5A,0xE4,0x00,0x5C,0x72,0x0D,0x61,0x26,0x0D,0x41, +0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x0D, +0x21,0x14,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x89,0x43,0xD0,0x67,0x06, +0x3A,0xD0,0x67,0x00,0x65,0xD0,0x61,0x0B,0x1D,0xE4,0x00,0x00,0x19,0xD0,0x69,0x0A, +0xDE,0xE4,0x00,0x02,0x19,0xC1,0xA0,0x10,0x01,0xCD,0x63,0x00,0x1A,0xFD,0xAD,0x07, +0xE8,0x99,0x80,0x8D,0x6D,0x13,0x4B,0x01,0x13,0x2B,0x00,0x13,0x0B,0x03,0x12,0xEB, +0x02,0x4C,0x9A,0xC0,0x4C,0xB8,0xC0,0x4F,0x5A,0x80,0x4F,0x18,0x80,0x8C,0x9A,0x8C, +0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x88,0x6C,0x8C,0x99,0x8C, +0xB7,0x9D,0x81,0xE4,0x00,0x5D,0xD8,0x5D,0x8C,0x00,0x9D,0x64,0xD1,0x86,0xFE,0x4E, +0x98,0x66,0x98,0x80,0x98,0xA0,0xCD,0x4A,0x00,0x1A,0x8D,0x4D,0x10,0xCA,0x18,0xE4, +0x00,0x5E,0x08,0x98,0x66,0x98,0x80,0x98,0xA1,0x10,0xCA,0x18,0xE4,0x00,0x5D,0xEE, +0x98,0x66,0x98,0x81,0x98,0xA0,0x10,0xCA,0x19,0xE4,0x00,0x5D,0xD4,0x98,0x66,0x98, +0x81,0x98,0xA1,0x10,0xCA,0x19,0xE4,0x00,0x5D,0xBA,0x98,0x66,0x98,0x82,0x98,0xA0, +0x98,0xC0,0xE4,0x00,0x5D,0xA2,0x98,0x66,0x98,0x82,0x98,0xA1,0x98,0xC0,0xE4,0x00, +0x5D,0x8A,0x98,0x66,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x5D,0x72,0x98,0x66, +0xE4,0x00,0x00,0x83,0xC1,0xA0,0x10,0x01,0x99,0x40,0xFD,0xAD,0x08,0x06,0x5D,0x8A, +0x00,0x41,0x6A,0x6C,0x98,0x60,0x88,0x8C,0x98,0xA0,0x10,0xCB,0x00,0xE4,0x00,0x5D, +0x2C,0x98,0x60,0x88,0x8C,0x98,0xA1,0x10,0xCB,0x00,0x9D,0x41,0xE4,0x00,0x5D,0x0E, +0x21,0x4F,0x7A,0x98,0x60,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x5C,0xF0,0x98, +0x60,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16, +0x98,0x83,0x98,0xA1,0x98,0xC0,0x1C,0x21,0x18,0xE4,0x00,0x5C,0xB5,0xC3,0x00,0x10, +0x01,0x0D,0xA1,0x06,0xFE,0xF8,0x08,0x02,0xF3,0x38,0x08,0x02,0x13,0x57,0x01,0x13, +0x17,0x03,0x4C,0x9A,0xC0,0x12,0xF7,0x02,0x4C,0xB8,0xC0,0x4F,0x5A,0x80,0x4F,0x18, +0x80,0x8C,0x9A,0x8C,0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x0D, +0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x98,0x60,0x8C,0x99,0x8C, +0xB7,0x1C,0x21,0x18,0xE4,0x00,0x5B,0xB7,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61, +0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x1C,0x21,0xE0,0x0D, +0xC1,0x08,0x0D,0x21,0x1C,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1, +0x0C,0x0D,0xE1,0x04,0x89,0xC4,0xD0,0x66,0x00,0xB5,0xC2,0xF8,0x00,0x21,0xFE,0xF7, +0xBA,0x68,0x4C,0x63,0x10,0x8C,0x77,0x0E,0xE3,0x02,0x86,0xE9,0x99,0xED,0xC9,0x80, +0x3E,0x0C,0xE4,0x00,0x01,0xC9,0xD0,0x81,0x04,0x41,0x1E,0xE4,0xFE,0xD2,0xE1,0x04, +0x89,0x5C,0x80,0xE1,0xCA,0xE0,0x3E,0x0C,0xC9,0x80,0x10,0x06,0x49,0xE1,0x6B,0x49, +0x8C,0xB8,0x99,0xA2,0x99,0x41,0x99,0x60,0x48,0x60,0x1A,0xE4,0x00,0x01,0x87,0xD0, +0x81,0x04,0x09,0x1E,0xE4,0xFE,0xD2,0xE1,0x04,0x51,0x5C,0x80,0xE1,0xCA,0xE0,0x3E, +0x0C,0xC9,0x80,0x10,0x06,0x99,0xA0,0x49,0xE1,0x6B,0x49,0x8C,0xB8,0x89,0x4D,0x99, +0x60,0x48,0x61,0x1B,0xE4,0x00,0x01,0x35,0x24,0x85,0xE9,0x5C,0x80,0xE1,0xCA,0xE0, +0x3E,0x0C,0xC9,0x80,0x08,0x03,0x49,0xE1,0x6B,0x49,0x8C,0xB8,0xE4,0x00,0x00,0xD9, +0x24,0x85,0xC1,0x5C,0x80,0xE1,0xCA,0xE0,0x3E,0x0C,0xC9,0x80,0x10,0x06,0x49,0xE1, +0x6B,0x49,0x8C,0xB8,0xE4,0x00,0x00,0xC5,0x99,0xE1,0xE4,0x00,0x00,0x95,0x99,0xE7, +0xC9,0x80,0x3E,0x0C,0x99,0xA2,0x99,0x41,0x99,0x60,0xE4,0x00,0x00,0x21,0x99,0xE7, +0xC9,0x80,0x3E,0x0C,0x99,0xA2,0x99,0x41,0x99,0x63,0x98,0x60,0xE4,0x00,0x00,0x85, +0x99,0xA0,0x99,0xE7,0xC9,0x80,0x3E,0x0C,0x89,0x4D,0x99,0x60,0xE4,0x00,0x00,0x21, +0x99,0xA0,0x99,0xE7,0xC9,0x80,0x3E,0x0C,0x89,0x4D,0x99,0x63,0x98,0x61,0xE4,0x00, +0x00,0x41,0x99,0xE7,0xC9,0x80,0x08,0x03,0x99,0xA0,0x89,0x4D,0xE4,0x00,0x00,0x1D, +0x99,0xE7,0xC9,0x80,0x10,0x06,0x99,0xA2,0x99,0x41,0x99,0x60,0x98,0x63,0xE7,0xFF, +0x7E,0x28,0x88,0x6A,0x88,0x8D,0xE4,0x00,0x73,0x4A,0x88,0x6A,0x88,0x8C,0xE4,0x00, +0x5A,0x6A,0x21,0xA0,0x3E,0x88,0x6A,0x88,0x8C,0xE4,0x00,0x6F,0x24,0xE4,0x00,0x00, +0x1F,0x21,0xA0,0x2C,0x88,0x6A,0x88,0x8C,0xE4,0x00,0x70,0x80,0x88,0x6A,0x05,0x80, +0xFF,0xC9,0x8C,0xFF,0xFF,0x88,0x8C,0xE4,0x00,0x5C,0xF0,0x88,0x8C,0x88,0x6A,0xE4, +0x00,0x5A,0x78,0x98,0x62,0xE4,0x00,0x57,0xF8,0xC2,0xE0,0x10,0x01,0x98,0x60,0xEC, +0x17,0x07,0xDC,0xC1,0xA0,0x10,0x01,0xEC,0x0D,0x07,0xE0,0xE4,0x00,0x64,0x34,0x98, +0x60,0xE4,0x00,0x5C,0x34,0x98,0x60,0x88,0x8C,0xE4,0x00,0x5B,0x24,0x88,0x6F,0xE4, +0x00,0x57,0x50,0x98,0x60,0xE4,0x00,0x5D,0x74,0x21,0x64,0x5E,0xED,0x6D,0x07,0xE0, +0x98,0x61,0xE4,0x00,0x63,0xE6,0x98,0x63,0xE4,0x00,0x5B,0xE6,0xE4,0x00,0x00,0x2B, +0x21,0x6C,0x46,0x98,0x61,0x88,0x8C,0xE4,0x00,0x5A,0xC8,0x98,0x61,0xE4,0x00,0x5D, +0x24,0xE4,0x00,0x61,0x08,0x1C,0x63,0x13,0x5C,0x83,0x00,0x88,0x6A,0x5C,0x82,0x93, +0x20,0x00,0x1B,0x50,0x80,0x14,0xE4,0x00,0x5E,0x26,0x88,0x6A,0x98,0x8C,0xE4,0x00, +0x5D,0x48,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xED,0xD7,0x07,0xE4,0xE7,0xFF,0xF5,0xA2, +0x88,0x6E,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61, +0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0xE7,0xFF,0xF8,0xBF,0xC2,0xE0, +0x10,0x01,0x9C,0x38,0xEC,0x77,0x03,0x2C,0x0D,0x41,0x00,0x0D,0x21,0x04,0x89,0x43, +0xE7,0xFF,0xFB,0xB8,0x25,0x44,0xD3,0x99,0x40,0x88,0x6A,0x98,0x80,0x9D,0x41,0xE4, +0x00,0x63,0x26,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x9E,0xE7,0xFF,0xE1,0xEC,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x00,0xE6,0x0C,0x77,0x0B,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06, +0x87,0x53,0x18,0x20,0xEF,0x17,0x06,0x87,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28, +0x85,0x29,0x1C,0x21,0xD8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x20,0x0D,0xC1,0x10,0xEE, +0xF7,0x00,0xE2,0x0D,0x21,0x24,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x0D, +0xE1,0x0C,0x0E,0x01,0x08,0x0E,0x21,0x04,0x0E,0x41,0x00,0x5E,0xE0,0x41,0x89,0x43, +0x49,0xC1,0x01,0x24,0x64,0x59,0x1E,0xE3,0xFE,0xD2,0xE1,0x04,0x11,0xD0,0x67,0x04, +0x2A,0xD0,0x69,0x04,0x3A,0xE4,0x00,0x00,0xED,0x51,0x60,0x1A,0x9A,0xE0,0x20,0x60, +0x5C,0x9A,0xE0,0xD1,0x45,0x00,0x92,0x9A,0xE1,0x21,0x44,0x30,0x21,0x4C,0x24,0xD1, +0x46,0x00,0x32,0x9A,0xE0,0xCE,0xF7,0x00,0x34,0xC1,0xE0,0x10,0x01,0xC2,0x00,0x10, +0x01,0xFD,0xEF,0x08,0xD8,0xFE,0x10,0x07,0xA8,0x99,0x80,0xC2,0x40,0x10,0x01,0x8D, +0xF7,0x8E,0x17,0x89,0xAC,0x1E,0x2A,0xFE,0xFE,0x52,0x08,0x4A,0x88,0x6D,0x98,0x81, +0x88,0xAE,0xE4,0x00,0x6B,0x76,0x42,0xEF,0x64,0x25,0x44,0x41,0x42,0xF0,0x64,0x26, +0x24,0x29,0xD1,0x47,0x00,0x56,0x42,0xEC,0x94,0x0C,0x77,0x01,0x9D,0xA1,0x9D,0x82, +0x5D,0xAD,0x00,0xD5,0x6D,0xFE,0xCD,0xE4,0x00,0x00,0x41,0x51,0x60,0x1A,0xE4,0x00, +0x00,0x21,0x99,0x63,0xE7,0xFF,0xFF,0x3F,0x99,0x64,0xE7,0xFF,0xFF,0x33,0x9A,0xE0, +0x21,0x4A,0x06,0xE7,0xFF,0xFF,0x25,0x0E,0x41,0x02,0x0E,0x21,0x06,0x0E,0x01,0x0A, +0x0D,0xE1,0x0E,0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D, +0x41,0x22,0x0D,0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40, +0x0D,0x21,0x44,0x0D,0x61,0x3C,0x0D,0x81,0x38,0x89,0x44,0xD0,0x67,0x04,0xAD,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBA,0x84,0x4C,0x63,0x10,0xC1,0x60,0x10,0x01,0x8C,0x77, +0xC1,0x80,0x10,0x01,0x0E,0xE3,0x02,0xFD,0x6B,0x0A,0x9C,0xFD,0x8C,0x08,0xD8,0x86, +0xE9,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06,0x87,0xC7,0x18,0xFF,0xDF,0xEF,0x17,0x06, +0x87,0xD0,0x88,0x02,0xFD,0x9A,0xE1,0x4E,0xF7,0x24,0xC6,0xF7,0x01,0x83,0x22,0xE1, +0x48,0xE4,0x00,0x00,0x93,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06,0x87,0xC7,0x18,0xFF, +0xDF,0xEF,0x17,0x06,0x87,0xD1,0x47,0x01,0xDD,0x9A,0xE1,0x4E,0xF7,0x54,0x57,0x17, +0x8C,0x23,0x00,0xA6,0x56,0xF7,0x03,0x22,0xE0,0xA4,0x88,0x6A,0xE7,0xFF,0xFD,0x0C, +0xCC,0x8A,0x00,0x34,0xCC,0xAA,0x00,0x68,0x1C,0x61,0x04,0x8C,0x8C,0x8C,0xAB,0x50, +0xC0,0x1A,0xE4,0x00,0x18,0x54,0xE4,0x00,0x00,0x15,0x88,0x6A,0xE7,0xFF,0xFC,0xCC, +0x0D,0x81,0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85, +0x29,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFE,0xF7,0x07,0xA8,0xCB,0x40,0xFF,0xFE,0x0B, +0x37,0x00,0x4F,0x19,0xFA,0x47,0x38,0xCE,0x43,0x19,0xC5,0x8C,0x78,0x5F,0x03,0x04, +0xCB,0x20,0xFF,0xFE,0x9E,0xE2,0x5C,0x79,0x17,0x48,0x78,0xD0,0xC3,0x00,0x10,0x01, +0xFF,0x18,0x07,0xDC,0xD6,0xF8,0xFE,0xDE,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x07,0x9C,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x07,0xA0,0xC2,0xE0,0x10,0x01,0x9B,0x04, +0xEC,0x17,0x07,0xA4,0x98,0x64,0xC2,0xE0,0x10,0x01,0x98,0x80,0xEF,0x17,0x03,0x2C, +0xE7,0xFF,0xF7,0x19,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0x9E,0xE4, +0x00,0x00,0x41,0x20,0x68,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xA2,0xE4,0x00, +0x00,0x23,0x9A,0xE0,0x20,0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xA6,0x88, +0x77,0x85,0x29,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x07,0x9C,0xE4,0x00, +0x00,0x3D,0x20,0x68,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x07,0xA0,0xE4,0x00,0x00, +0x1F,0x20,0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x07,0xA4,0x85,0x29,0x1C,0x21, +0xE0,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1, +0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0xEE,0xF7,0x08,0x22,0x0D,0x21,0x1C,0xC1,0x80, +0x10,0x01,0xC1,0x60,0x10,0x01,0x5D,0xE3,0x06,0x5D,0xC4,0x06,0x89,0x45,0x89,0xA6, +0x56,0xF7,0x01,0xFD,0x8C,0x08,0x44,0xFD,0x6B,0x08,0x14,0x22,0xE0,0xE0,0x98,0xA2, +0x25,0x44,0x43,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x94,0x8E,0xEA,0x10,0xB7,0x00, +0x0E,0xEB,0x02,0x5E,0xE0,0x29,0x88,0x6F,0x88,0x8E,0x48,0xA5,0x12,0xE7,0xFF,0x87, +0x58,0x5C,0x63,0x00,0x20,0x60,0x3C,0x0C,0x0C,0x00,0x0C,0x0D,0x00,0x98,0x61,0xE4, +0x00,0x00,0xED,0x21,0x45,0x38,0x21,0x40,0x28,0x21,0x4D,0x8E,0xE4,0x00,0x00,0xA7, +0x0E,0xEB,0x02,0x22,0xE4,0x36,0xE7,0xFF,0x8A,0x5A,0x98,0x62,0xE4,0x00,0x00,0x5D, +0x0E,0xEC,0x02,0x22,0xE4,0x86,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x08,0x36,0xC2,0xE0, +0x10,0x01,0xEC,0x97,0x08,0x22,0xE7,0xFF,0x90,0x76,0x88,0x6D,0xE7,0xFF,0x90,0x8E, +0xE4,0x00,0x00,0x15,0xE7,0xFF,0x89,0xFE,0x98,0x60,0x0C,0x0B,0x00,0xE4,0x00,0x00, +0x4B,0x88,0x6F,0x88,0x8E,0xE7,0xFF,0x8A,0x00,0x98,0x60,0xE4,0x00,0x00,0x2F,0xE7, +0xFF,0x89,0xC8,0x9A,0xE1,0x0E,0xEB,0x00,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x89,0xAE, +0x98,0x62,0x0D,0x4C,0x00,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81, +0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0xC3, +0x80,0x10,0x01,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3, +0x00,0x10,0x01,0xFF,0x9C,0x08,0x28,0xFF,0x7B,0x08,0x78,0xFF,0x5A,0x08,0x19,0xFF, +0x39,0x0B,0x70,0xFF,0x18,0x08,0x68,0x20,0x69,0x7A,0x0A,0xFC,0x04,0x0B,0xD9,0x09, +0x43,0xD7,0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43,0xBE,0xED,0x5F, +0xAC,0x99,0x20,0x00,0x7D,0x0B,0xBC,0x07,0x0B,0x99,0x0B,0x43,0xBD,0xE5,0x5F,0xBD, +0x06,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xC3,0x80,0x10,0xE8,0x20,0x05, +0x19,0x0E,0xF8,0x01,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x2F,0x0B,0x99,0x0B,0x0E, +0xF8,0x03,0x0B,0x39,0x0F,0x12,0xFA,0x00,0x0F,0x9B,0x01,0x0F,0x3B,0x03,0x52,0xF7, +0x02,0xE4,0x00,0x01,0x57,0xC3,0xA0,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0xBD,0x08, +0x11,0xFE,0xF7,0x0B,0x90,0x20,0x6D,0x92,0x0B,0x79,0x01,0x0B,0xDC,0x01,0x43,0xDE, +0xDD,0x5F,0xDE,0x06,0x4F,0x7E,0xFA,0x47,0xDB,0xF6,0x43,0x7E,0xDD,0x5F,0x6C,0x99, +0x20,0x00,0x7D,0x0B,0x39,0x03,0x0B,0x7C,0x03,0x43,0x7B,0xCD,0x5F,0x7B,0x06,0x4F, +0x3B,0xFA,0x47,0x79,0xDE,0x43,0x3B,0xCD,0xC3,0x20,0x10,0xE8,0x20,0x03,0x61,0x0B, +0x37,0x17,0x0F,0x38,0x01,0x0B,0x37,0x19,0x0F,0x38,0x03,0x0B,0x37,0x47,0x0A,0xF7, +0x49,0x0E,0xF8,0x07,0x12,0xFA,0x00,0x52,0xF7,0x01,0x0F,0x38,0x05,0x1A,0xFA,0x00, +0x9A,0xE2,0x1A,0xFD,0x00,0xE4,0x00,0x01,0x5F,0xD0,0x64,0x01,0xD6,0x0B,0x3B,0x00, +0x0B,0x7B,0x02,0x43,0x79,0xDD,0x9F,0x6E,0x5F,0x63,0x9B,0x20,0x00,0x2F,0xC3,0x20, +0x10,0x01,0xEB,0x39,0x08,0x6B,0x0B,0x18,0x01,0x0F,0x17,0x47,0x9B,0x02,0x0F,0x37, +0x49,0x1B,0x17,0x00,0x12,0xFA,0x00,0x9B,0x1D,0x46,0xF7,0xC4,0x1A,0xFA,0x00,0xE4, +0x00,0x00,0xEB,0xD0,0x65,0x03,0x8E,0x13,0x7D,0x00,0x23,0x68,0xFE,0x0B,0x98,0x00, +0x0B,0x59,0x00,0x8F,0x5C,0x43,0x5A,0xD8,0x0B,0x98,0x02,0x0F,0x57,0x17,0x0B,0x59, +0x02,0x8F,0x5C,0x43,0x5A,0xD8,0x0B,0x98,0x04,0x0F,0x57,0x19,0x0B,0x59,0x08,0x8F, +0x5C,0x43,0x5A,0xD8,0x0F,0x57,0x47,0x0B,0x58,0x06,0x0B,0x19,0x0A,0x8F,0x1A,0x43, +0x78,0xD8,0x0F,0x77,0x49,0xE4,0x00,0x00,0x55,0x23,0x64,0x9A,0x0B,0x38,0x01,0x0F, +0x37,0x17,0x0B,0x38,0x03,0x0F,0x37,0x19,0x0B,0x38,0x05,0x0B,0x18,0x07,0x0F,0x37, +0x47,0x0F,0x17,0x49,0x9B,0x3E,0x13,0x1A,0x00,0x47,0x18,0xCC,0x1B,0x1A,0x00,0x9B, +0x02,0x1B,0x17,0x00,0x85,0x29,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0x28,0xFE,0xE0, +0x7F,0xFF,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x9B,0x01, +0xC3,0x20,0x10,0x01,0xFF,0x39,0x03,0x6C,0x1B,0x19,0x01,0xC3,0x00,0x10,0x01,0xFF, +0x18,0x08,0x94,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0xC3, +0x00,0x10,0x01,0xF8,0x18,0x08,0x84,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x70,0x0E, +0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x0E,0xF8,0x09,0x0E,0xF8, +0x0B,0x0E,0xF8,0x0D,0x0E,0xF8,0x0F,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xA1,0xC2, +0xE0,0x10,0x01,0x18,0x19,0x00,0xF3,0x17,0x08,0x19,0x9B,0x3C,0x47,0x18,0xCC,0xFB, +0x17,0x08,0x19,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x11,0x85,0x29,0xC3,0x00,0x10, +0x01,0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFF,0x18,0x09,0x0C,0x9A,0xE0,0xFF,0x5A, +0x09,0xBC,0xE4,0x00,0x00,0x31,0x4F,0x37,0x10,0x0B,0x98,0x00,0x0B,0x78,0x02,0x8F, +0x3A,0x8F,0x7C,0x9E,0xE1,0x0F,0x79,0x00,0x9F,0x04,0x5F,0x37,0x00,0xD4,0x79,0xFF, +0x4D,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0xC1,0x08,0x0D, +0x21,0x1C,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x18,0x01,0x07,0xC1,0x40,0x10,0x01,0xC1, +0x60,0x10,0x01,0x5D,0xC3,0x00,0xFD,0x4A,0x08,0x13,0xFD,0x6B,0x08,0x12,0x21,0xC8, +0x36,0x18,0x0A,0x00,0x18,0x0B,0x00,0xE4,0x00,0x00,0x15,0x21,0xCC,0x1A,0x18,0x0A, +0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x10,0x77,0x01,0x12,0xF7,0x04,0xC1, +0xA0,0x10,0x01,0x40,0x63,0xBB,0xC1,0x80,0x10,0x01,0xE7,0xFF,0xFE,0xE6,0xFD,0xAD, +0x08,0x18,0xFD,0x8C,0x0B,0x90,0xD1,0xC1,0x04,0x2E,0x12,0xEA,0x00,0x22,0xE1,0xFA, +0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x09,0xBC,0x0F,0x17,0x02,0xC3,0x00,0x29,0xA8,0x20, +0x00,0x39,0x13,0x01,0x07,0x9F,0x01,0x5F,0x18,0x00,0x1B,0x01,0x07,0xC3,0x00,0x10, +0x01,0x9E,0xE4,0xFF,0x18,0x09,0xF0,0xD6,0xF8,0xFF,0x0E,0x12,0xE1,0x07,0xD2,0xE4, +0x01,0x49,0xE7,0xFF,0xE7,0xAE,0x20,0x68,0x84,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08, +0x3C,0xD2,0xE9,0x00,0xB5,0x12,0xEC,0x00,0x26,0xE4,0x3D,0x12,0xEB,0x00,0x9E,0xE1, +0x1A,0xEB,0x00,0xE4,0x00,0x00,0x0F,0x18,0x0B,0x00,0x12,0xEB,0x00,0x26,0xE5,0x01, +0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0x2A,0x18,0x0D,0x00,0xE4,0x00, +0x00,0x59,0x9A,0xE1,0x1A,0xEA,0x00,0xE4,0x00,0x00,0x47,0x12,0xEA,0x00,0x22,0xE4, +0x7E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0x2A,0x18,0x0D,0x00,0xE4, +0x00,0x00,0x1D,0xE7,0xFF,0xE6,0xEC,0x20,0x68,0x18,0x18,0x0C,0x00,0x12,0xED,0x00, +0x22,0xE0,0x2C,0x9E,0xFF,0x18,0x0C,0x00,0x1A,0xED,0x00,0x0D,0xC1,0x0A,0x0D,0xA1, +0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20, +0x85,0x29,0x98,0x62,0xE7,0xFF,0xFD,0x9F,0xC3,0x00,0x10,0x01,0x5C,0x84,0x00,0xFF, +0x18,0x09,0x0C,0x20,0xA0,0x6C,0xE4,0x00,0x00,0x4B,0x4F,0x37,0x08,0x9E,0xE1,0x43, +0x59,0xC4,0x8F,0x23,0x0B,0x5A,0x00,0x0F,0x59,0x01,0xE4,0x00,0x00,0x0D,0x9A,0xE0, +0x5F,0x37,0x00,0xD4,0x99,0xFF,0x3D,0xE4,0x00,0x00,0x7B,0x20,0xA4,0xE6,0xE4,0x00, +0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1,0x43,0x43,0xCC,0x8F,0x38,0x0B,0x5A,0x00,0x0F, +0x59,0x01,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x5F,0x37,0x00,0xD4,0x99,0xFF,0x3D,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x10,0x77,0x01,0x12,0xF7,0x04,0x40,0x63,0xBB, +0xE7,0xFF,0xFC,0x5B,0x85,0x29,0x9C,0x38,0x98,0x63,0x0D,0x21,0x04,0xE7,0xFF,0x6C, +0xAA,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x72,0xAD,0x9A,0xED,0x1C,0x21,0xE8,0x0D, +0x41,0x10,0x0D,0x61,0x0C,0xC1,0x60,0x10,0x01,0xFD,0x4B,0x0B,0x1A,0x1A,0xEA,0x04, +0x9A,0xE1,0x1A,0xEA,0x01,0xFE,0xE0,0x07,0xFF,0x0E,0xEA,0x07,0x0E,0xEA,0x09,0xC2, +0xE0,0x10,0x01,0x9B,0x02,0xFB,0x17,0x08,0x72,0x52,0xE0,0xAA,0x0D,0x21,0x14,0x0E, +0xEA,0x0B,0x50,0x60,0x19,0x98,0x80,0xE7,0xFF,0x2C,0x66,0x52,0xE0,0x1D,0xFA,0xEB, +0x0B,0x1A,0x9A,0xE4,0x1A,0xEA,0x0C,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x00,0xD5,0xC2, +0xE0,0x10,0x01,0xEC,0x17,0x08,0x60,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x8C,0xC2, +0xE0,0x10,0x01,0xEC,0x17,0x08,0x87,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x54,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x5C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8A,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x83,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x48,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x9C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x76,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x67,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x65,0xC2, +0xE0,0x10,0x01,0xEC,0x17,0x08,0x58,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x31,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x77,0xC2,0xE0,0x10,0x01,0x9B,0x03,0xFB,0x17,0x08, +0x66,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x07,0x8C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0x84,0xC2,0xE0,0x10,0x01,0xFF,0x00,0x01,0xF4,0xEF,0x17,0x06,0x85,0xC2,0xE0,0x10, +0x01,0x50,0x60,0x14,0xF8,0x17,0x08,0x9D,0x50,0x80,0x50,0xE7,0xFF,0x7B,0xB8,0x52, +0xE0,0x64,0x50,0x80,0x35,0x0E,0xE1,0x01,0x50,0xA0,0x59,0xFC,0xC0,0x07,0xFF,0xFC, +0xE0,0x07,0xFF,0x99,0x00,0xC0,0x60,0x10,0x01,0xFC,0x63,0x01,0x88,0xE7,0xFF,0x98, +0xE2,0xC0,0x60,0x10,0x01,0x98,0x80,0xFC,0x63,0x09,0xBC,0x50,0xA0,0x3C,0xE7,0xFF, +0x9B,0xE4,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x90,0x18,0x17,0x04,0x18,0x17,0x05, +0x18,0x17,0x06,0x18,0x17,0x34,0x18,0x17,0x35,0x18,0x17,0x36,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x50,0xC2,0xE0,0x10,0x01,0xF3,0x37,0x00,0xC0,0xC2,0xF4,0x00,0x01, +0xCB,0x17,0x3D,0xF9,0xCA,0xF7,0x3D,0xF8,0x1B,0x38,0x00,0xC3,0x00,0x10,0x01,0xF3, +0x18,0x07,0x09,0x1B,0x17,0x00,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x3F,0x53,0x18, +0x04,0xEF,0x17,0x08,0x3F,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x1D, +0x58,0xEF,0x17,0x03,0xE4,0xC2,0xE0,0x10,0x01,0x53,0x00,0xDF,0xEF,0x17,0x08,0x93, +0xC2,0xE0,0x10,0x01,0x53,0x00,0xCA,0xEF,0x17,0x08,0x25,0xC2,0xE0,0x10,0x01,0xC3, +0x00,0x00,0x01,0xFF,0x18,0x1B,0xCF,0xEF,0x17,0x03,0xF8,0xC2,0xE0,0x10,0x01,0xC3, +0x00,0x00,0x01,0xFF,0x18,0x19,0x89,0xEF,0x17,0x04,0x18,0xC2,0xE0,0x10,0x01,0xC3, +0x00,0x00,0x01,0xFF,0x18,0x1A,0x62,0xEF,0x17,0x04,0x14,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x0B,0x40,0xFE,0xF7,0x0B,0x40,0xC3,0x60,0x10,0x01,0x18,0x17,0x01,0x18,0x17, +0x02,0x18,0x17,0x03,0x0C,0x17,0x05,0x0C,0x17,0x07,0x0C,0x17,0x0B,0x0C,0x17,0x09, +0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0x9A,0xE0,0xFF,0x7B,0x09,0x0C,0xFF,0x5A, +0x0C,0x96,0xFF,0x39,0x09,0x48,0x43,0x17,0xDC,0x0C,0x18,0x01,0x43,0x17,0xD4,0x0C, +0x18,0x01,0x4F,0x17,0x08,0x8F,0x19,0x0C,0x18,0x00,0x9E,0xE2,0x5E,0xE7,0x49,0x23, +0xFF,0x9D,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29, +0xE4,0x00,0x6A,0xF1,0x1C,0x21,0xE8,0x0D,0x21,0x14,0xE7,0xFF,0xCD,0x74,0xE7,0xFF, +0xA4,0x36,0xE7,0xFF,0xCC,0x96,0xE7,0xFF,0xF0,0x08,0x98,0x60,0x98,0x81,0xE7,0xFF, +0x66,0x0C,0x98,0x81,0x98,0x60,0x88,0xA4,0xE7,0xFF,0x66,0x12,0x98,0x81,0x98,0x60, +0x88,0xA4,0xE7,0xFF,0x66,0x28,0x98,0x80,0x98,0x61,0x88,0xA4,0xE7,0xFF,0x66,0x14, +0x98,0xA0,0x98,0x62,0x98,0x81,0xE7,0xFF,0x66,0x00,0x98,0x62,0x98,0x80,0xE7,0xFF, +0x66,0x76,0x98,0x60,0x50,0x80,0x66,0xE7,0xFF,0x66,0x7E,0x98,0x61,0x50,0x80,0x66, +0xE7,0xFF,0x66,0x6C,0x98,0x62,0x50,0x80,0xF3,0xE7,0xFF,0x66,0x5A,0x98,0x60,0xFC, +0x80,0xA0,0x00,0xE7,0xFF,0x66,0xA2,0x98,0x61,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x66, +0x8E,0x98,0x62,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x66,0x7A,0xFC,0x80,0x01,0x26,0x98, +0x62,0xE7,0xFF,0x66,0xC2,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x96,0x60,0xE7,0xFF,0xFA, +0x3A,0x98,0x61,0xE7,0xFF,0x45,0xCA,0xE7,0xFF,0x31,0xFE,0x50,0x60,0x1B,0xE7,0xFF, +0x6A,0xB0,0x9A,0xEE,0x0E,0xE1,0x00,0x52,0xE0,0x14,0x0E,0xE1,0x04,0xCA,0xE0,0x07, +0xD0,0x98,0xC8,0x0E,0xE1,0x08,0x98,0xAE,0x88,0xE6,0x99,0x0A,0x98,0x6A,0x98,0x8C, +0xE7,0xFF,0x26,0x0E,0x98,0x81,0x98,0x60,0xE7,0xFF,0xCB,0xB0,0x50,0x60,0x10,0xE7, +0xFF,0xCB,0xE2,0xE4,0x00,0x3F,0x22,0xE7,0xFF,0xF9,0x7E,0x98,0x80,0x98,0x60,0xE7, +0xFF,0x23,0xD0,0xE7,0xFF,0xB7,0x36,0xE7,0xFF,0xB6,0x2C,0xC2,0xE0,0x10,0x01,0xF0, +0x77,0x03,0x6E,0xE7,0xFF,0xCB,0x7A,0x9B,0x00,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0D,0xC3,0x17,0x00,0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D,0xC3,0x17,0x00,0x0F, +0x53,0x18,0x08,0xC3,0x17,0x00,0x0D,0xC2,0xE0,0x01,0x1F,0x52,0xF7,0x06,0xC2,0xE0, +0x01,0x1D,0xFC,0x60,0x01,0x40,0xE7,0xFF,0xCB,0x24,0x50,0x60,0x20,0xE7,0xFF,0xCB, +0x2E,0x98,0x61,0x50,0x80,0x13,0x50,0xA0,0x37,0x98,0xC8,0xFC,0xE0,0x01,0x0D,0xE7, +0xFF,0xAA,0x6A,0xC3,0x00,0x00,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x46,0xAE,0x0D, +0x21,0x16,0xEF,0x17,0x03,0xD0,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEF, +0x17,0x00,0xE2,0x23,0x05,0x08,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0xEC,0xC3,0x00,0x10, +0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x08,0x4A,0xFE,0xF7,0x08,0x7C,0x0B,0x38,0x01, +0xC3,0x60,0x10,0x01,0x0F,0x37,0x01,0xC3,0x40,0x10,0x01,0x0B,0x38,0x03,0xFF,0x7B, +0x0A,0x8C,0x0F,0x37,0x03,0x0B,0x18,0x05,0xFF,0x5A,0x0B,0x80,0x0F,0x17,0x05,0x9A, +0xE0,0xE4,0x00,0x00,0x5D,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0x9A,0xE0,0xFF, +0x7B,0x08,0xA4,0xFF,0x5A,0x08,0xD8,0x43,0x17,0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01, +0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xE7,0xFF,0xFF,0x45,0x43, +0x17,0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01,0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE2,0x09, +0x23,0xFF,0xBD,0x85,0x29,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0x9A,0xE0,0xFF, +0x18,0x0C,0x96,0xFF,0x7B,0x08,0xA4,0x43,0x37,0xC4,0x43,0x57,0xDC,0x0B,0x5A,0x01, +0x0F,0x59,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x08,0x7C,0x0B,0x37,0x01,0x0F,0x38,0x35,0x0B,0x37,0x03,0x0A,0xF7,0x05,0x0F, +0x38,0x37,0x0E,0xF8,0x39,0x85,0x29,0xE4,0x00,0x68,0xED,0xC2,0xE0,0x10,0x01,0xFF, +0x20,0xDF,0x9F,0xEB,0x17,0x08,0x87,0x47,0x18,0xCC,0x9B,0x3E,0xEF,0x17,0x08,0x87, +0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x71,0x47,0x18,0xCC,0xEF,0x17,0x08,0x71,0x85, +0x29,0xE4,0x00,0x71,0x9D,0xE4,0x00,0x71,0x3B,0xE4,0x00,0x71,0xCB,0xC2,0xE0,0x10, +0x01,0x88,0xC3,0xF3,0x17,0x00,0xC0,0x23,0x08,0x4A,0xF2,0xF7,0x00,0xC0,0x22,0xE8, +0x2E,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x09,0xC3,0x00,0x10,0x01,0x9A,0xE0,0xFF, +0x18,0x09,0x0C,0x8B,0x38,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3,0x01,0x20,0x00, +0x25,0x5E,0xE3,0x29,0x20,0x00,0x31,0x0B,0x59,0x01,0x4F,0x5A,0x08,0x0F,0x59,0x01, +0x9E,0xE1,0x9F,0x22,0x5E,0xE3,0x49,0x23,0xFF,0x79,0xC2,0xE0,0x10,0x01,0xC3,0x40, +0x10,0x01,0xF3,0x77,0x0B,0x1A,0xFF,0x5A,0x08,0x86,0x1F,0xBB,0xFF,0x0A,0xFA,0x01, +0x9B,0x20,0xE4,0x00,0x00,0x57,0xD7,0xB9,0x00,0xB8,0x0B,0xD8,0x00,0x0B,0x98,0x02, +0x8F,0x9E,0xCB,0xD7,0x20,0x00,0xC3,0x80,0x1B,0xCC,0x4A,0xFE,0xB8,0x0B,0x98,0x00, +0x53,0xD7,0x40,0x5F,0x84,0x19,0x9F,0x21,0x4A,0xFE,0xB8,0x9F,0x02,0x5F,0x99,0x04, +0xD7,0x7C,0xFE,0xB5,0x98,0x60,0x0E,0xFA,0x01,0x88,0x83,0x98,0xA0,0xE7,0xFF,0xB3, +0x4F,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x40,0x10,0x01,0x20,0x64,0x62, +0xE7,0xFF,0xB4,0x6A,0x20,0x64,0x56,0xF2,0xEA,0x08,0x48,0x9E,0xE1,0xFA,0xEA,0x08, +0x48,0xE4,0x00,0x00,0x19,0xE7,0xFF,0xB4,0xF0,0xF8,0x0A,0x08,0x48,0xE7,0xFF,0xDA, +0x78,0x9A,0xE3,0x20,0x64,0x34,0xE7,0xFF,0xDA,0x66,0x5C,0x60,0x49,0x4A,0xE3,0x4B, +0xC3,0x00,0x10,0x01,0xF3,0x38,0x08,0x48,0xD6,0xF9,0x02,0x1D,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x9C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8A,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x83,0xC2,0xE0,0x10,0x01,0xF8,0x18,0x08,0x48,0xF8,0x17,0x08,0x9D, +0x0D,0x41,0x02,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEB,0x17,0x08,0x87,0x9C,0x28, +0x53,0x18,0x80,0xEF,0x17,0x08,0x87,0xE7,0xFF,0x64,0xF3,0x0D,0x41,0x02,0x0D,0x21, +0x06,0x9C,0x28,0x85,0x29,0x9C,0x38,0xC3,0x14,0x00,0x01,0x0D,0x21,0x04,0xCA,0xF8, +0x22,0x00,0x0B,0x37,0x01,0xCB,0x18,0x26,0x18,0x9B,0x3F,0x0F,0x37,0x01,0x0B,0x38, +0x01,0x53,0x39,0x02,0x0F,0x38,0x01,0x0B,0x17,0x01,0xFC,0x60,0x01,0x00,0x0C,0x17, +0x01,0xE7,0xFF,0xC6,0x0E,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEB,0x17,0x00,0xD5, +0x9C,0x28,0xC7,0x18,0xFE,0xFF,0xEF,0x17,0x00,0xD5,0x85,0x29,0x5C,0xC6,0x00,0x9A, +0xE0,0xE4,0x00,0x00,0x45,0x4F,0x17,0x08,0x4F,0x57,0x10,0x43,0x23,0xC4,0x8F,0x45, +0x8F,0x04,0x0F,0x5A,0x02,0x0B,0x18,0x01,0x4F,0x5A,0x42,0x9E,0xE1,0x43,0x18,0xD5, +0x0F,0x19,0x01,0x5F,0x17,0x00,0xD4,0xD8,0xFE,0xFD,0x85,0x29,0x9C,0x38,0x0D,0x21, +0x04,0xE4,0x00,0x38,0x32,0x0D,0x21,0x06,0xFC,0x60,0x01,0x00,0x9C,0x28,0xE7,0xFF, +0xC5,0x45,0x9C,0x38,0x0D,0x21,0x04,0xE4,0x00,0x38,0x06,0x0D,0x21,0x06,0xFC,0x60, +0x01,0x00,0x9C,0x28,0xE7,0xFF,0xC5,0x09,0x9C,0x38,0x98,0x80,0x0D,0x21,0x04,0x98, +0x61,0xE7,0xFF,0xE3,0x1A,0x98,0x60,0xE7,0xFF,0x63,0x2A,0x98,0x61,0x98,0x80,0xE7, +0xFF,0xE8,0x28,0x98,0x62,0x98,0x80,0xE7,0xFF,0xE8,0x18,0x0D,0x21,0x06,0x98,0x63, +0x98,0x80,0x9C,0x28,0xE7,0xFF,0xE7,0xFF,0x98,0x64,0x98,0x80,0xE7,0xFF,0xE2,0xC5, +0x9C,0x38,0x0D,0x21,0x04,0xE7,0xFF,0xD7,0xE8,0x24,0x64,0x29,0x20,0x69,0x8A,0xE4, +0x00,0x00,0x19,0xE7,0xFF,0xD7,0xCC,0xE4,0x00,0x00,0x57,0xE7,0xFF,0xC4,0xCA,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x00,0xE6,0x0A,0xF7,0x09,0x40,0x63,0xBD,0x5E,0xE3,0x04, +0xC2,0xE1,0x76,0xEA,0x20,0x00,0x7D,0x98,0x62,0xE7,0xFF,0xE7,0x16,0x20,0x60,0x5A, +0x98,0x61,0x98,0x80,0xE7,0xFF,0xE2,0x34,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7, +0xFF,0x62,0x3B,0x98,0x62,0x98,0x80,0xE7,0xFF,0xE2,0x0E,0xFC,0x60,0x01,0x5E,0xE7, +0xFF,0x8E,0x48,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF,0x61,0xBD,0x0D,0x21, +0x06,0x9C,0x28,0x85,0x29,0xD0,0x69,0x06,0x2D,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21, +0xFE,0xF7,0xBA,0xC4,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x18,0x09, +0x48,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x09,0xF8,0x87,0x29,0xC3,0x00,0x10,0x01,0xFF, +0x18,0x0B,0x34,0x0F,0x38,0x02,0x0F,0x37,0x68,0x0F,0x38,0x06,0x0F,0x18,0x0A,0x0F, +0x37,0x6C,0x0F,0x17,0x70,0xE4,0x00,0x01,0x0B,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B, +0x28,0x0F,0x37,0x02,0x0F,0x38,0x68,0x0F,0x37,0x06,0x0E,0xF7,0x0A,0x0F,0x38,0x6C, +0x0E,0xF8,0x70,0xE4,0x00,0x00,0xCF,0xCE,0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xCC, +0x63,0x00,0x1A,0xFF,0x7B,0x0A,0x9C,0x4C,0x63,0x10,0x8F,0x77,0x8F,0x03,0x9A,0xE0, +0x43,0x38,0xBC,0x43,0x5B,0xBC,0x0F,0x5A,0x02,0x0F,0x59,0x00,0x9E,0xE4,0x5E,0xED, +0x09,0x23,0xFF,0xBD,0xE4,0x00,0x00,0x6D,0x9C,0x7E,0xC3,0x40,0x10,0x01,0x5C,0x63, +0x00,0xFF,0x5A,0x0B,0xF4,0xCF,0x03,0x00,0x68,0xCC,0x63,0x00,0x1A,0x8F,0x58,0x4C, +0x63,0x10,0x8C,0x77,0x9A,0xE0,0x43,0x03,0xBC,0x43,0x3A,0xBC,0x0F,0x39,0x02,0x0F, +0x38,0x00,0x9E,0xE4,0x5E,0xED,0x09,0x23,0xFF,0xBD,0x85,0x29,0xD0,0x69,0x06,0x3D, +0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBA,0xEC,0x8E,0xF8,0xC3,0x00,0x10, +0x01,0x0F,0x37,0x02,0xFF,0x18,0x08,0xA4,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x08,0x7C, +0x87,0x29,0x0B,0x37,0x00,0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18,0x0B,0x34, +0xE4,0x00,0x00,0x25,0x0B,0x37,0x00,0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18, +0x0B,0x28,0x0F,0x38,0x00,0x0B,0x37,0x02,0x0A,0xF7,0x04,0x4F,0x39,0x40,0x4E,0xF7, +0x40,0x0F,0x38,0x04,0x0E,0xF8,0x08,0xE4,0x00,0x00,0xD9,0xCE,0xE3,0x00,0x34,0x8F, +0x17,0xCE,0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x0A,0x9C,0x8F,0x77,0x9A, +0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC,0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F, +0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xA9,0xE4,0x00,0x00,0x73,0x1E,0xE3, +0xFE,0x5E,0xF7,0x00,0xCF,0x37,0x00,0x34,0xCE,0xF7,0x00,0x68,0xC3,0x60,0x10,0x01, +0x8F,0x19,0xFF,0x7B,0x0B,0xF4,0x8F,0x77,0x9A,0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC, +0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F,0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89, +0x23,0xFF,0xA9,0xE7,0xFF,0xFC,0xE5,0x9C,0x38,0x98,0x64,0x0D,0x41,0x00,0x0D,0x21, +0x04,0x98,0x80,0xE7,0xFF,0xDE,0x96,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00,0xD5,0xC6, +0xF7,0xFE,0xFF,0xEE,0xEA,0x00,0xD5,0xE7,0xFF,0xFA,0xEA,0xEA,0xEA,0x00,0xD5,0xC6, +0xF7,0x01,0x00,0x22,0xE3,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xC0,0x3C,0xFC,0x60, +0x01,0x00,0xE7,0xFF,0xC0,0x0C,0xE7,0xFF,0xF5,0x4A,0x0D,0x21,0x06,0x0D,0x41,0x02, +0x98,0x60,0x9C,0x28,0xE7,0xFF,0xFD,0xD1,0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x3E, +0x98,0x60,0xE7,0xFF,0xFD,0xB4,0x98,0x68,0xE4,0x00,0x00,0x19,0x98,0x62,0xE7,0xFF, +0xFD,0x9C,0x98,0x69,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFD,0x87,0x9C,0x38,0x98, +0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0x70,0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7, +0xFF,0xFD,0x5B,0x20,0x80,0x64,0xD0,0x84,0x00,0xFA,0x20,0x88,0x90,0x20,0x8C,0xA8, +0x5C,0x80,0x21,0x4B,0x0A,0x01,0x8A,0xF8,0xE4,0x00,0x00,0x49,0x53,0x00,0x19,0x8A, +0xF8,0xE4,0x00,0x00,0x37,0x53,0x00,0x19,0x9A,0xE1,0xE4,0x00,0x00,0x25,0x53,0x00, +0x32,0x8A,0xF8,0xE4,0x00,0x00,0x13,0x53,0x00,0x50,0x8A,0xF8,0xD0,0x69,0x0A,0xE5, +0x4F,0x43,0x10,0xC3,0x38,0x00,0x21,0xFF,0x39,0xBB,0x14,0x8F,0x3A,0xC3,0x40,0x10, +0x01,0x0F,0x79,0x02,0xFF,0x5A,0x08,0xA4,0xC3,0x20,0x10,0x01,0xFF,0x39,0x08,0x7C, +0x87,0x69,0xCF,0x23,0x00,0x68,0xCC,0xA3,0x00,0x34,0xC0,0x80,0x10,0x01,0x8C,0xBA, +0xFC,0x84,0x0A,0x9C,0x99,0x02,0x8C,0x99,0xCB,0xA0,0x01,0xF4,0x9B,0x20,0x43,0x65, +0xCC,0x0B,0x9B,0x00,0x4F,0x79,0x08,0x4F,0x9C,0x40,0x8F,0x64,0x0F,0x5B,0x02,0x5F, +0x5C,0x1D,0x4B,0xD8,0xB8,0x43,0x9C,0xD5,0x43,0x9E,0xE3,0xCF,0xDA,0x01,0xF4,0x43, +0x9C,0x40,0x8F,0x9E,0x43,0x9C,0xE8,0x0F,0x9B,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23, +0xFF,0x3D,0xE4,0x00,0x01,0xCD,0x1F,0x23,0xFE,0x5F,0x39,0x00,0xCC,0xB9,0x00,0x34, +0xCF,0x39,0x00,0x68,0xC0,0x80,0x10,0x01,0x8C,0xBA,0xFC,0x84,0x0B,0xF4,0x99,0x02, +0x8C,0x99,0xCB,0xA0,0x01,0xF4,0x9B,0x20,0x43,0x65,0xCC,0x0B,0x9B,0x00,0x4F,0x79, +0x08,0x4F,0x9C,0x40,0x8F,0x64,0x0F,0x5B,0x02,0x5F,0x5C,0x1D,0x4B,0xD8,0xB8,0x43, +0x9C,0xD5,0x43,0x9E,0xE3,0xCF,0xDA,0x01,0xF4,0x43,0x9C,0x40,0x8F,0x9E,0x43,0x9C, +0xE8,0x0F,0x9B,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x3D,0xE4,0x00,0x01,0x19, +0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B,0x28,0xCB,0xA0,0x01,0xF4,0x0F,0x7A, +0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8, +0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F, +0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44,0xFF,0x7B,0x08,0x82,0xD7,0x3B, +0xFE,0x86,0xE4,0x00,0x00,0x8D,0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B,0x34, +0xCB,0xA0,0x01,0xF4,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D, +0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0, +0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44, +0xFF,0x7B,0x08,0x82,0xD7,0x3B,0xFE,0x86,0xE7,0xFF,0xF8,0x9B,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xFC,0xB2,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFC,0x93,0x1C,0x21, +0xC8,0x0D,0x41,0x30,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01,0x18, +0x0D,0x21,0x34,0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E, +0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0xC1,0xC0,0x10,0x01,0xFD,0xCE,0x08,0x86, +0x0A,0xEE,0x01,0xC7,0x17,0x7F,0xFF,0x0F,0x0E,0x01,0xC2,0x00,0x10,0x01,0xC1,0xA0, +0x10,0x01,0xC1,0xE0,0x10,0x01,0xC1,0x40,0x10,0x01,0x56,0xF7,0x08,0xFE,0x10,0x08, +0x54,0xFD,0xAD,0x08,0x60,0xFD,0xEF,0x08,0x5C,0xFD,0x4A,0x0B,0x90,0x22,0xE1,0x6C, +0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0x8E,0x22,0xE5,0x40,0xC3,0x00,0x10,0x01,0x0A, +0xEA,0x18,0xFF,0x18,0x01,0x64,0x0B,0x58,0x0A,0xD7,0x57,0x01,0x04,0xCB,0x20,0x07, +0xFF,0x43,0x59,0xD5,0xD6,0xFA,0x00,0xAC,0x0A,0xEA,0x16,0x0B,0x18,0x06,0xD7,0x17, +0x00,0x5C,0x43,0x19,0xC5,0xD6,0xF8,0x01,0x18,0xE7,0xFF,0xE3,0xBA,0x9A,0xE3,0x0E, +0xED,0x00,0xC2,0xE0,0x10,0x01,0x18,0x10,0x00,0xF8,0x17,0x08,0x76,0x18,0x0F,0x00, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x67,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x50, +0x22,0xE0,0x24,0x98,0x60,0xE7,0xFF,0xC2,0x8A,0x0E,0xED,0x02,0x22,0xE0,0x96,0x0A, +0xEE,0x01,0x56,0xF7,0x40,0xD2,0xE0,0x4B,0x62,0x98,0x63,0xE7,0xFF,0xE4,0xB0,0xE7, +0xFF,0x1C,0x40,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x76,0x9A,0xE1,0xE4,0x00,0x14, +0x21,0x22,0xE5,0x0E,0x0A,0xEE,0x01,0x57,0x17,0x08,0x23,0x00,0x2C,0xE7,0xFF,0xE2, +0xF2,0xE4,0x00,0x12,0xEF,0x57,0x17,0x40,0x23,0x00,0x94,0xC6,0xF7,0x20,0x00,0x22, +0xE0,0x7A,0xC2,0xE0,0x10,0x01,0x98,0x62,0xF3,0x17,0x08,0x76,0xC3,0x00,0x19,0x0A, +0x20,0x24,0x8F,0x9F,0x01,0xFB,0x17,0x08,0x76,0xE4,0x00,0x13,0xAF,0x0C,0x0D,0x00, +0xE4,0x00,0x13,0xA1,0xC2,0x20,0x10,0x01,0xFE,0x31,0x08,0x64,0x22,0xE8,0xAA,0x0A, +0xEE,0x01,0x56,0xF7,0x08,0x22,0xE0,0x68,0x12,0xF0,0x00,0x9E,0xE1,0x1A,0xF0,0x00, +0xE7,0xFF,0x1B,0x9E,0x12,0xF0,0x00,0xD2,0xE1,0x4D,0x49,0xE4,0x00,0x0E,0x75,0x18, +0x10,0x00,0xE4,0x00,0x11,0x25,0xC1,0x80,0x10,0x01,0xC1,0x60,0x10,0x01,0xFD,0x8C, +0x0B,0x70,0xFD,0x6B,0x08,0x28,0xD2,0xE3,0x38,0x96,0xE7,0xFF,0xCC,0x5E,0xC3,0x00, +0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x20,0x03,0xE8,0x20,0x68,0x1C,0xFF,0x20,0x01, +0xF4,0xEF,0x37,0x03,0x7B,0xEF,0x38,0x03,0x79,0x0A,0xEE,0x01,0x56,0xF7,0x08,0xD2, +0xE0,0x37,0x02,0xC1,0xC0,0x10,0x01,0xC2,0x00,0x10,0x01,0x12,0xEA,0x00,0xFD,0xCE, +0x08,0x94,0xFE,0x10,0x03,0x6C,0xD2,0xE1,0x0F,0xB9,0x0B,0x8B,0x04,0xC3,0x8F,0xFF, +0xE0,0x20,0x06,0x6D,0x08,0xAA,0x48,0x0B,0x2B,0x06,0x0B,0x6B,0x00,0x43,0xA5,0xCD, +0x08,0xCA,0x46,0x0B,0x4B,0x02,0x43,0xC6,0xE5,0x0B,0x0A,0x18,0x08,0x8A,0x16,0x42, +0xFA,0xC5,0x41,0x04,0xDD,0x42,0xFE,0xBB,0x41,0x3D,0x43,0x8E,0xE9,0x22,0xE1,0x84, +0x42,0x7C,0xDD,0x41,0x3A,0xCD,0x42,0x9D,0x9B,0x42,0x5E,0x4B,0x8E,0x92,0x22,0x80, +0x40,0x26,0x80,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x8F,0x26,0xFD,0x0E,0x4E,0xB7, +0xFA,0x46,0x55,0xBE,0x42,0x52,0xAD,0x4E,0xB4,0xFA,0x46,0x95,0xA6,0x42,0xB4,0xAD, +0xD6,0xB2,0x01,0x74,0x42,0x98,0xD5,0x41,0x28,0x4B,0x42,0x74,0x9B,0x8E,0x69,0x22, +0x60,0x40,0x26,0x60,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x2D,0x26,0xFC,0x4A,0x4E, +0xF3,0xFA,0x46,0x77,0x9E,0x42,0x73,0xBD,0x9A,0xE1,0xD6,0x72,0x06,0x18,0x42,0x45, +0xD5,0x42,0x66,0xDD,0x42,0x84,0xE5,0x42,0xF9,0xC5,0x41,0x32,0xA3,0x42,0xF3,0xBB, +0x8E,0xE9,0x22,0xE0,0xDC,0x43,0x9B,0xE5,0x41,0x39,0xD5,0x40,0xF2,0xE3,0x42,0xB3, +0x4B,0x8C,0xF5,0x20,0xE0,0x40,0x24,0xE0,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x3B, +0x26,0xFC,0x66,0x4E,0xB7,0xFA,0x44,0x75,0xBE,0x40,0x63,0xAD,0x4E,0xA7,0xFA,0x44, +0xF5,0x3E,0x42,0xA7,0xAD,0xD6,0xA3,0x01,0xA0,0x43,0x58,0xD5,0x41,0x08,0x43,0x43, +0x5A,0xD3,0x43,0x38,0xCD,0x42,0x94,0xA3,0x43,0x39,0xCB,0x8F,0x48,0x8E,0x99,0x9A, +0xE0,0xD6,0x9A,0x00,0x45,0x8B,0x54,0x9A,0xE1,0x42,0x73,0x9B,0x42,0x52,0x93,0x8E, +0x53,0xD6,0x5A,0x01,0xB1,0xE4,0x00,0x00,0x6F,0x42,0xB8,0xCD,0x41,0x34,0x4B,0x43, +0x95,0xE3,0x8F,0x89,0x23,0x80,0x40,0x27,0x80,0x28,0x26,0xE0,0x2A,0xE7,0xFF,0xFF, +0x79,0x26,0xFE,0xE2,0x4E,0xFC,0xFA,0x47,0x97,0xE6,0x43,0x9C,0xBD,0x9A,0xE0,0xD7, +0x83,0x00,0xF0,0xE7,0xFF,0xFF,0x4D,0x8B,0x52,0x52,0xE0,0x10,0x43,0xDE,0xF3,0x43, +0xBD,0xEB,0x53,0x20,0x11,0x8F,0xBE,0x5F,0xBA,0x1F,0x4A,0xF7,0xC8,0x4F,0x37,0x21, +0x46,0xF7,0xCE,0x56,0xF7,0x0F,0xD2,0xE0,0x3B,0x5A,0x0C,0xCA,0x17,0x0C,0xAA,0x19, +0x0C,0x8A,0x47,0x0F,0x0A,0x49,0xE4,0x00,0x0E,0xB7,0xC2,0xE0,0x10,0x01,0x9B,0x3E, +0xF3,0x17,0x08,0x19,0x47,0x18,0xCC,0x98,0x63,0xFB,0x17,0x08,0x19,0xE7,0xFF,0xDB, +0x24,0x12,0xF0,0x00,0x1A,0xEA,0x10,0x12,0xF0,0x01,0x1A,0xEA,0x40,0xE7,0xFF,0x17, +0xA4,0x12,0xEA,0x00,0xD2,0xE1,0x3B,0xD6,0xE4,0x00,0x02,0x73,0x0A,0xEB,0x00,0xC2, +0xEF,0xFF,0xE4,0x23,0xFF,0x7B,0x0B,0xCB,0x02,0x0B,0x2A,0x16,0x0B,0x0A,0x18,0x43, +0xB9,0xBD,0x43,0x98,0xF5,0x0B,0x6A,0x46,0x0B,0x4A,0x48,0x42,0xFB,0xBD,0x43,0xDA, +0xF5,0x42,0xF7,0xBB,0x43,0xDE,0xF3,0x8E,0xFE,0x43,0xBD,0xEB,0x43,0x9C,0xE3,0x8F, +0x9D,0x5E,0xFC,0x1F,0x52,0xE0,0x10,0x4A,0xE0,0xB8,0x22,0xE2,0x9C,0x0F,0x6A,0x17, +0x0F,0x4A,0x19,0x0F,0x2A,0x47,0x0F,0x0A,0x49,0xE7,0xFF,0xFF,0x31,0x22,0xE6,0x52, +0x0A,0xEB,0x04,0xC2,0xEF,0xFF,0xE0,0x23,0xFE,0x29,0x0B,0xCA,0x16,0x0B,0xAA,0x18, +0x0B,0x0B,0x00,0x0B,0x2B,0x02,0x43,0x9E,0xC5,0x43,0x7D,0xCD,0x43,0xDE,0xBD,0x0B, +0x4B,0x06,0x43,0xDE,0xF3,0x43,0xBD,0xD5,0x43,0x9C,0xE3,0x43,0xBD,0xEB,0x43,0x7B, +0xDB,0x8F,0xBE,0x8F,0x7C,0xD7,0xBB,0x35,0x39,0xE4,0x00,0x0D,0x7F,0x0B,0x8C,0x03, +0x43,0x99,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0xC3, +0x60,0x10,0xE8,0x20,0x00,0xD9,0x0B,0x8C,0x03,0xC3,0x60,0x10,0x01,0xEF,0x9B,0x08, +0x79,0xFF,0x7B,0x08,0x78,0x0B,0x8C,0x07,0x0F,0x9B,0x03,0xC3,0x60,0x10,0x01,0xEF, +0x1B,0x08,0x69,0xC3,0x00,0x10,0x01,0xFF,0x7B,0x08,0x68,0x0F,0x3B,0x03,0xF3,0x38, +0x08,0x19,0x53,0x39,0x02,0xFB,0x38,0x08,0x19,0x0B,0x0E,0x05,0x0F,0x0E,0x01,0x0B, +0x0E,0x07,0x0F,0x0E,0x03,0x0B,0x0C,0x09,0x0F,0x0C,0x01,0x0B,0x0C,0x0B,0x0F,0x0C, +0x03,0x0B,0x0C,0x0D,0x0E,0xEB,0x01,0x0F,0x0C,0x05,0xFE,0xE0,0x7F,0xFF,0x0B,0x0C, +0x0F,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC,0x09, +0x0E,0xEC,0x0B,0x0F,0x0C,0x07,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0x9B,0x01,0x12,0xF0, +0x01,0x0F,0x4B,0x03,0x1A,0xF0,0x00,0x42,0xF8,0xBD,0x1A,0xF0,0x01,0xE7,0xFF,0xFD, +0x69,0x0A,0xEA,0x17,0x0B,0x0B,0x01,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8,0xFA, +0x47,0x17,0xC6,0x42,0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x03,0x78,0xD6,0xF9, +0x01,0x2C,0x0A,0xEA,0x19,0x0B,0x0B,0x03,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8, +0xFA,0x47,0x17,0xC6,0x42,0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x03,0x7A,0xD6, +0xF9,0x2F,0xF8,0xE7,0xFF,0x15,0x60,0xD0,0x60,0x2F,0xBA,0xE7,0xFF,0xDB,0x36,0xC2, +0xE0,0x10,0x01,0xEF,0x17,0x07,0x8E,0xD3,0x01,0x2F,0x3E,0xE4,0x00,0x0B,0xEF,0x9A, +0xFE,0x0E,0xF1,0x01,0xC1,0xA0,0x10,0x01,0x13,0x2A,0x00,0xFD,0xAD,0x0B,0xA6,0x9B, +0x00,0x8A,0xED,0xE4,0x00,0x00,0x35,0x0B,0x57,0x01,0x9F,0x01,0x0F,0x4B,0x01,0x5F, +0x18,0x00,0x0B,0x57,0x03,0x1E,0xF7,0x30,0x0F,0x4B,0x03,0x9D,0x64,0xD7,0x19,0xFF, +0x56,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x3A,0x22,0xE4,0x26,0x99,0x60,0xE4,0x00, +0x00,0x5F,0xE7,0xFF,0xC4,0xEE,0x20,0x6B,0xD8,0xE7,0xFF,0xC4,0xE0,0x20,0x6C,0xAE, +0xE7,0xFF,0xFF,0xD9,0xCC,0x8B,0x00,0x30,0x88,0xCB,0x1C,0x84,0x10,0x9D,0x61,0x8C, +0x8A,0x5D,0x6B,0x00,0x1C,0x64,0x06,0x9C,0x88,0xE7,0xFF,0x50,0x5E,0x10,0xAA,0x00, +0xD4,0xAB,0xFF,0x25,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x4F,0xB0,0xE7,0xFF,0xC4,0x7A, +0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0x20,0x68,0xD6,0x53, +0x40,0x4B,0xEF,0x58,0x08,0x89,0xEF,0x59,0x08,0x53,0x53,0x00,0x25,0xEF,0x17,0x08, +0x9F,0xC2,0x20,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFE,0x31,0x08,0x40,0xEF,0x17,0x08, +0x75,0x99,0x60,0xC2,0x60,0x10,0x01,0xC2,0x80,0x10,0x01,0x8A,0x51,0xE4,0x00,0x03, +0x19,0x53,0x40,0x32,0xEF,0x58,0x08,0x89,0xEF,0x59,0x08,0x53,0x53,0x00,0x19,0xE7, +0xFF,0xFF,0x9D,0x4E,0xEB,0x10,0x8E,0xEE,0x0B,0x17,0x00,0xC3,0x0F,0xFF,0xE4,0x20, +0x05,0x3B,0x0B,0x37,0x02,0xC3,0x2F,0xFF,0xE0,0x20,0x05,0x11,0xCE,0xEB,0x00,0x30, +0x8E,0xEA,0x0A,0x17,0x17,0x42,0x18,0x85,0x5E,0x10,0x06,0x4F,0x10,0xFA,0x0A,0xF7, +0x19,0x46,0x18,0x86,0x42,0xF9,0xBD,0x42,0x10,0xC5,0x5E,0xF7,0x06,0x4F,0x17,0xFA, +0x5E,0x10,0x06,0x46,0xF8,0xBE,0xE9,0xF3,0x08,0x89,0x42,0xF7,0xC5,0x43,0x11,0x5C, +0x5E,0xF7,0x06,0x13,0x58,0x00,0xD6,0xEF,0x00,0xE4,0xC3,0x00,0x10,0x01,0xEB,0x18, +0x08,0x53,0xD6,0x18,0x00,0x84,0x9B,0x03,0x27,0x48,0x57,0x1F,0x1A,0x01,0xE4,0x00, +0x00,0x19,0x9B,0x00,0x23,0x40,0x24,0x1F,0x1A,0xFF,0x5F,0x18,0x00,0x43,0x52,0x5C, +0x1B,0x1A,0x00,0x43,0x11,0x5C,0x13,0x18,0x00,0xD3,0x02,0x06,0xA1,0xEB,0x14,0x08, +0x75,0xD6,0xF8,0x00,0x8C,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0F,0x37,0x19,0xE4,0x00, +0x00,0x9B,0xD6,0xEF,0x02,0x4C,0x43,0x2F,0xC5,0x40,0x77,0xC5,0x43,0x39,0xCB,0x42, +0xF8,0xBD,0x43,0x4F,0x7B,0x40,0x63,0xBB,0x8C,0x79,0x40,0x63,0xD3,0x40,0x63,0xC8, +0xE7,0xFF,0x10,0xD0,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17,0x02,0x41, +0xEF,0x1D,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x18,0xD7,0x19,0x00,0x58,0x41, +0xF8,0x7D,0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x19,0xC2,0xE0,0x10,0x01,0xEA, +0xF7,0x08,0x9F,0xD6,0x17,0x00,0xCC,0xCE,0xEB,0x00,0x30,0x4F,0x0B,0x10,0x8E,0xEA, +0x8F,0x0E,0x0B,0x18,0x01,0x0F,0x17,0x17,0xE4,0x00,0x00,0xAB,0xC3,0x00,0x10,0x01, +0xE9,0xF8,0x08,0x53,0xD6,0x0F,0x02,0x4C,0x43,0x0F,0xBD,0x43,0x2F,0x7B,0x43,0x18, +0xC3,0x40,0x70,0xBD,0x42,0x17,0x85,0x40,0x63,0x83,0x8C,0x78,0x40,0x63,0xCB,0x40, +0x63,0xC0,0xE7,0xFF,0x0F,0xEC,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17, +0x00,0x41,0xEF,0x1D,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x16,0xD7,0x19,0x00, +0x58,0x41,0xF8,0x7D,0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x17,0x4E,0xEB,0x10, +0xCF,0x0B,0x00,0x30,0x8E,0xEE,0x8F,0x0A,0x9D,0x61,0x0B,0x38,0x17,0x5D,0x6B,0x00, +0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17,0x03,0x12,0xEA,0x00,0xD6,0xEB,0xF4,0x3D, +0xE7,0xFF,0xC0,0xD2,0x20,0x68,0x36,0x9B,0x08,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x03, +0x71,0xC2,0xE0,0x10,0x01,0x13,0x2A,0x00,0xF3,0x77,0x08,0x84,0x8B,0x0D,0xC2,0xE0, +0x10,0x01,0x9B,0x80,0xFE,0xF7,0x0B,0x74,0xFF,0x40,0x7F,0xFF,0xE4,0x00,0x00,0x9F, +0xD7,0x79,0x00,0x92,0x0F,0x57,0xFD,0x0F,0x57,0xFF,0x0F,0x57,0x01,0x0F,0x57,0x03, +0x8B,0x79,0x0B,0xB7,0x00,0xC3,0xAF,0xFF,0xE0,0x20,0x00,0x41,0x0B,0xB7,0xFD,0x0F, +0xB7,0x01,0x0B,0xB7,0xFF,0xE4,0x00,0x00,0x1B,0x0B,0xB8,0x01,0x0F,0xB7,0x01,0x0B, +0xB8,0x03,0x0F,0xB7,0x03,0x0B,0xB8,0x01,0x9F,0x81,0x0F,0xB7,0xFD,0x5F,0x9C,0x00, +0x0B,0xB8,0x03,0x1F,0x18,0x30,0x0F,0xB7,0xFF,0x9E,0xE8,0xD7,0x99,0xFD,0xAE,0xC2, +0xE0,0x10,0x01,0xFB,0x77,0x08,0x84,0xC2,0xE0,0x10,0x01,0x23,0x24,0x7A,0x9B,0x02, +0xFB,0x17,0x08,0xA1,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x03,0x70,0x9B,0x0A,0x9B,0x4A, +0x43,0x18,0xBD,0x9A,0xE0,0xE4,0x00,0x00,0x8F,0xF8,0x17,0x08,0xA1,0xE7,0xFF,0xFF, +0xCF,0x0B,0x6C,0x04,0x0B,0x8C,0x00,0x0B,0xAC,0x06,0x43,0x9C,0xDD,0x9E,0xE1,0x43, +0x98,0xE3,0x5E,0xF7,0x00,0x43,0x9C,0xD0,0x8F,0x9B,0x0B,0x6C,0x02,0x0F,0x8D,0x01, +0x43,0x7B,0xED,0x0F,0x8C,0x01,0x43,0x78,0xDB,0x43,0x7B,0xD0,0x8F,0x7D,0x5F,0x7B, +0x06,0x0F,0x6D,0x03,0x0F,0x6C,0x03,0x1D,0xAD,0x30,0x9D,0x88,0xD6,0xF9,0xFE,0x2E, +0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x19,0x56,0xF7,0x02,0x22,0xE0,0x24,0x98,0x64, +0xE7,0xFF,0xD1,0x1E,0x13,0x0A,0x00,0xC2,0xE0,0x10,0x01,0x0E,0xA1,0x06,0x0E,0x81, +0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E, +0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D, +0x21,0x36,0xFB,0x17,0x08,0x26,0x98,0x61,0x1C,0x21,0x38,0xE7,0xFF,0xB3,0x1F,0x18, +0x0F,0x00,0x9A,0xE4,0xE4,0x00,0x04,0xF3,0xD2,0xE4,0x01,0xA6,0x0A,0xEE,0x01,0x56, +0xF7,0x08,0x22,0xE0,0x3C,0x9A,0xE3,0x0C,0x11,0x01,0x0E,0xED,0x00,0xE4,0x00,0x04, +0xC7,0x12,0xEF,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xEF,0x00,0xD2,0xE1,0x12,0xA1, +0x9A,0xE5,0x18,0x0F,0x00,0x0E,0xED,0x00,0xE4,0x00,0x04,0x91,0xD2,0xE5,0x09,0xF6, +0x12,0xEF,0x00,0x9E,0xE1,0x1A,0xEF,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x84, +0x22,0xE9,0x4A,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x19,0x56,0xF7,0x01,0x22,0xE1, +0x10,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xA1,0xC1,0x40,0x10,0x01,0xF2,0xEA,0x08, +0x11,0x22,0xE8,0x66,0x98,0x65,0xE7,0xFF,0xCF,0xB2,0x98,0x61,0xE7,0xFF,0xB2,0x1C, +0x9A,0xE1,0xFA,0xEA,0x08,0x11,0xE4,0x00,0x01,0x75,0xD2,0xE1,0x05,0x8E,0x98,0x65, +0xE7,0xFF,0xCF,0x7E,0x98,0x61,0xE7,0xFF,0xB1,0xE8,0xF8,0x0A,0x08,0x11,0xE4,0x00, +0x01,0x45,0x0B,0x0B,0x00,0x0B,0x4C,0x00,0x43,0x38,0xD5,0x5F,0x39,0x06,0x4E,0xF9, +0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0x5E,0xEC,0x99,0x20,0x00,0x7D,0x0A,0xEC,0x03, +0x0B,0x2B,0x03,0x43,0x39,0xBD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42, +0xF9,0xBD,0xC2,0xE0,0x10,0xE8,0x20,0x01,0x95,0xC3,0x20,0x10,0x01,0xF2,0xF9,0x08, +0xA1,0x22,0xE8,0xB6,0x8F,0x1A,0x43,0x18,0xB8,0x0F,0x0A,0x17,0xC3,0x00,0x10,0x01, +0xEB,0x58,0x08,0x2A,0xC3,0x00,0x10,0x01,0xEB,0x18,0x0B,0x72,0x8F,0x1A,0x42,0xF8, +0xB8,0x0E,0xEA,0x19,0x9A,0xE1,0xFA,0xF9,0x08,0xA1,0xE4,0x00,0x00,0x45,0x22,0xE4, +0x66,0xC2,0xE0,0x10,0x01,0x0F,0x0A,0x17,0xEA,0xF7,0x08,0x2B,0xF8,0x19,0x08,0xA1, +0x0E,0xEA,0x19,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00,0x9A,0xE1,0x98,0x61, +0x1A,0xEA,0x00,0xE7,0xFF,0xB0,0xAE,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00, +0x12,0xEF,0x00,0xD2,0xE2,0x09,0xE9,0x98,0x62,0x0C,0x11,0x01,0xE7,0xFF,0xD2,0xCE, +0xE7,0xFF,0x0A,0x5E,0xC2,0xE0,0x10,0x01,0x9B,0x03,0xFB,0x17,0x08,0x50,0xE7,0xFF, +0xD1,0x30,0xE7,0xFF,0x46,0xBC,0x98,0x60,0xE7,0xFF,0xB0,0x44,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x67,0x9A,0xE6,0xE4,0x00,0x02,0x0F,0xD2,0xE6,0x08,0x36,0x0A,0xEE, +0x01,0x56,0xF7,0x40,0x22,0xE0,0x26,0x98,0x64,0xE7,0xFF,0xEB,0xA6,0xC3,0x00,0x10, +0x01,0xF2,0xF8,0x08,0x67,0x9E,0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x08,0x67,0x5E,0xE6, +0x53,0x0A,0xEE,0x01,0x20,0x01,0x35,0x56,0xF7,0x40,0x22,0xE0,0x50,0x9A,0xE1,0x0E, +0xED,0x00,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x76,0xE4,0x00,0x01,0x8D,0x0C,0x0D, +0x00,0x98,0x60,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E, +0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81, +0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0xE7,0xFF,0xEA, +0xDF,0x56,0xF7,0x08,0xD2,0xE0,0x04,0x62,0x18,0x10,0x00,0x9A,0xE2,0xE4,0x00,0x01, +0x01,0xC3,0x6F,0xFF,0xE4,0x23,0xE2,0x95,0xE7,0xFF,0xF1,0x73,0x0B,0x8C,0x01,0x43, +0x98,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x6C, +0x99,0x23,0xE5,0x33,0xE7,0xFF,0xF2,0xC5,0x98,0x62,0xE7,0xFF,0xCC,0x4A,0xFE,0xE0, +0x7F,0xFF,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC, +0x09,0x0E,0xEC,0x0B,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0xE7,0xFF,0xF0,0xEF,0x0A,0xF1, +0x01,0xCB,0x00,0xFF,0xFD,0x9E,0xE1,0x5E,0xF7,0x04,0xD6,0xF8,0xD0,0xAD,0xE7,0xFF, +0xF4,0x27,0xFE,0xE0,0x7F,0xFF,0x18,0x0F,0x00,0x0E,0xEB,0x01,0x0E,0xEB,0x03,0x0E, +0xEB,0x05,0x0E,0xEB,0x07,0x18,0x10,0x00,0x1B,0x10,0x01,0x9A,0xE5,0x0E,0xED,0x00, +0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E, +0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61, +0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xE6,0x12,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xE5,0xF3,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x3D,0xF9,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D, +0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01, +0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08,0x13,0x17,0x00, +0xC2,0xE0,0x10,0x01,0xFB,0x17,0x00,0xC0,0xF3,0x17,0x00,0xC0,0x23,0x00,0x2C,0xF2, +0xF7,0x00,0xC0,0xD2,0xE1,0x30,0x2E,0xC1,0x80,0x10,0x01,0xC1,0xE0,0x10,0x01,0xFD, +0x8C,0x08,0x86,0xFD,0xEF,0x00,0xE0,0x0A,0xEC,0x01,0x56,0xF7,0x80,0xD2,0xE0,0x2E, +0x1E,0xC2,0xE0,0x10,0x01,0xC1,0xA0,0x10,0x01,0xF3,0x17,0x00,0xC0,0xFD,0xAD,0x09, +0x0C,0x23,0x08,0xB2,0xF2,0xF7,0x00,0xC0,0x22,0xE8,0x68,0x0B,0x2D,0x02,0x9B,0x42, +0xCF,0x19,0x00,0x03,0x0A,0xED,0x00,0x43,0x18,0xD0,0xD6,0xF8,0x02,0x14,0xE4,0x00, +0x00,0x9B,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x09,0x22,0xE3,0x86,0x8B,0x0D,0x9A, +0xE0,0x9B,0x22,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3,0x01,0x20,0x00,0x25,0x5E, +0xE3,0x29,0x20,0x00,0x31,0x0B,0x58,0x00,0x43,0x5A,0xC8,0x0F,0x58,0x01,0x9E,0xE1, +0x9F,0x02,0x5E,0xE3,0x49,0x23,0xFF,0x79,0xE7,0xFF,0xFF,0x67,0x42,0xF7,0xC5,0x43, +0x57,0xD0,0x8F,0x1A,0x0F,0x0D,0x01,0xE4,0x00,0x00,0x43,0x4E,0xF7,0x08,0x9B,0x1D, +0x43,0x17,0xC0,0x8F,0x38,0x9B,0x0B,0xCF,0x39,0x00,0x0A,0x43,0x39,0xC0,0x9B,0x03, +0x42,0xF7,0xC0,0x8E,0xF9,0x0E,0xED,0x03,0x0A,0xED,0x30,0x0B,0x0D,0x32,0x4F,0x37, +0x08,0xD7,0x19,0x00,0xC0,0xCE,0xF7,0xFF,0xFE,0x9B,0x43,0x8F,0x17,0x43,0x18,0xD0, +0x8F,0x38,0x0F,0x2D,0x33,0xE4,0x00,0x00,0x37,0x9B,0x22,0x43,0x18,0xC8,0x53,0x20, +0x14,0x42,0xF7,0xC5,0xCE,0xF7,0x00,0x13,0x42,0xF7,0xC8,0x8F,0x17,0x0F,0x0D,0x31, +0xC1,0x40,0x10,0x01,0xFD,0x4A,0x0B,0x1A,0x12,0xEA,0x04,0x10,0x6A,0x01,0x40,0x63, +0xBB,0xE7,0xFF,0xCC,0xD8,0x13,0x0A,0x01,0xC3,0x20,0x10,0x01,0x13,0x4A,0x04,0xEA, +0xF9,0x09,0xBC,0x43,0x5A,0xC3,0xFF,0x79,0x09,0xBC,0x9B,0x00,0xE4,0x00,0x00,0x35, +0x4F,0x38,0x10,0x9F,0x01,0x8F,0x3B,0x5F,0x18,0x00,0x0F,0x39,0x02,0x5F,0x99,0x06, +0x5F,0x37,0x1D,0x4A,0xFC,0xB8,0xD7,0x58,0xFF,0x54,0xC1,0x40,0x10,0x01,0xC2,0xE2, +0x32,0x88,0xFD,0x4A,0x01,0x64,0x20,0x00,0x35,0x4E,0xF7,0x0A,0x0E,0xEA,0x19,0xE4, +0x00,0x00,0x2F,0x53,0x00,0xDF,0xC2,0xE0,0x6F,0x68,0x20,0x00,0x25,0x4E,0xF7,0x12, +0x5F,0x17,0x06,0x0F,0x0A,0x19,0x88,0x6A,0xE7,0xFF,0x14,0xEE,0xC1,0x60,0x10,0x01, +0x89,0xCD,0xFD,0x6B,0x0B,0x90,0x8A,0xED,0x12,0x2B,0x00,0x53,0x20,0x14,0x0B,0x17, +0x00,0xCF,0x18,0x00,0x19,0x43,0x18,0xC8,0x0F,0x17,0x01,0xC3,0x00,0x10,0x01,0x9E, +0xE2,0xFF,0x18,0x09,0x40,0xD6,0xF8,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x14,0x88,0xC2, +0x00,0x10,0x01,0x9A,0xE0,0xFE,0x10,0x08,0x26,0x22,0x20,0x4A,0x13,0x0B,0x00,0x27, +0x04,0x33,0x12,0xF0,0x00,0x5E,0xE0,0x01,0x4A,0xE1,0x01,0x13,0x0B,0x00,0x23,0x09, +0x2E,0x13,0x10,0x00,0x23,0x05,0x3A,0x13,0x2B,0x07,0x13,0x0B,0x37,0xD7,0x38,0x02, +0x2A,0x0F,0x0B,0x0A,0x23,0x04,0xFA,0x0F,0x0B,0x3A,0x23,0x04,0xE2,0xC3,0x00,0x10, +0x01,0xEB,0x38,0x0B,0x72,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0xA5,0xFF,0x39,0xFC,0x01, +0x4F,0x19,0xFA,0x47,0x38,0xCE,0x43,0x19,0xC5,0xC3,0x20,0x10,0x01,0xEB,0x59,0x0B, +0x25,0xD7,0x1A,0x00,0xA4,0xE4,0x00,0x00,0x1B,0x23,0x04,0x26,0x13,0x10,0x00,0x23, +0x00,0x18,0x22,0xE0,0x9C,0x53,0x00,0x19,0x0A,0xEE,0x00,0xCE,0xF7,0x00,0x14,0x42, +0xF7,0xC0,0x0E,0xEE,0x01,0xC3,0x40,0x10,0x01,0x9D,0xC2,0xFF,0x5A,0x09,0x40,0xD5, +0xDA,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x13,0x54,0x0E,0xEF,0x02,0x22,0xE4,0x26,0x98, +0x61,0xE7,0xFF,0xCA,0xC4,0x12,0xEB,0x00,0x22,0xE0,0x5A,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x08,0x38,0x13,0x2B,0x00,0xD3,0x20,0x09,0x86,0xE4,0x00,0x02,0x93,0x98,0x61, +0x98,0x81,0x88,0xAA,0xE7,0xFF,0x0E,0x1C,0x0A,0xEA,0x10,0x0B,0x0A,0x06,0x0B,0x2A, +0x12,0x5D,0xD7,0x04,0x42,0x38,0xBD,0x40,0xB8,0xCD,0xCA,0xE0,0x07,0xFF,0x43,0x37, +0xCD,0x0B,0x4A,0x02,0x0B,0x6A,0x08,0x40,0x97,0xC5,0x5C,0xF9,0x04,0x13,0xCB,0x00, +0x0B,0x2A,0x0A,0x40,0x78,0xD5,0x42,0x77,0xCD,0x40,0xDA,0xC5,0xC2,0xE0,0x10,0x01, +0x42,0x59,0xDD,0x42,0x9B,0xCD,0xFE,0xF7,0x0B,0xA8,0x9B,0xA0,0xC9,0x00,0x07,0xFF, +0xE4,0x00,0x00,0xC5,0x0B,0x97,0xFE,0xD7,0x1C,0x00,0x98,0x43,0x9C,0xD5,0x43,0x9C, +0x8B,0x43,0x9C,0x18,0x8F,0x8E,0xE4,0x00,0x00,0x2D,0xD7,0x84,0x00,0xA8,0x43,0x88, +0xE5,0x43,0x9C,0xD5,0x43,0x9C,0x2B,0x43,0x9C,0x30,0x8F,0x87,0x0F,0x97,0xFF,0x0B, +0x97,0x00,0xD7,0x3C,0x00,0x88,0x43,0x9C,0xDD,0x43,0x9C,0xCB,0x43,0x9C,0x90,0xE4, +0x00,0x00,0x31,0xD7,0x93,0x00,0xB8,0x43,0x88,0xE5,0x43,0x9C,0xDD,0x43,0x9C,0xCB, +0x43,0x9C,0xA0,0xFF,0x9C,0x07,0xFF,0x0F,0x97,0x01,0x9F,0xA1,0x1E,0xF7,0x30,0x5F, +0xBD,0x00,0xD7,0xBE,0xFD,0x16,0x0B,0x0A,0x12,0xCA,0xE0,0x07,0xFF,0x0B,0x2A,0x10, +0x0B,0x4A,0x0C,0x43,0x77,0xCD,0x42,0xF7,0xD5,0x43,0x7B,0xC5,0x0B,0x0A,0x0E,0x43, +0x97,0xC5,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xFE,0xF7,0x0B,0xA6,0xE4,0x00,0x00,0x59, +0x0B,0xB7,0x00,0x43,0xBD,0xCD,0xCF,0xBD,0x07,0xFF,0x43,0xBD,0xD8,0x9F,0x01,0x0F, +0xB7,0x01,0x5F,0x18,0x00,0x0B,0xB7,0x02,0x43,0xBD,0xD5,0xCF,0xBD,0x07,0xFF,0x43, +0xBD,0xE0,0x0F,0xB7,0x03,0x1E,0xF7,0x30,0xD7,0x1E,0xFE,0xC6,0xE7,0xFF,0xFD,0xBF, +0xCF,0x57,0x00,0x30,0x9E,0xE1,0x8F,0x4B,0x0F,0x5A,0x0E,0xC3,0x40,0x95,0xEC,0x4B, +0x18,0x0A,0xE4,0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x5F,0x57,0x00,0xD7,0x3A,0xFF, +0x1D,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x38,0x0A,0xEC,0x01,0x52,0xF7,0x08,0xE4, +0x00,0x00,0x33,0x9B,0x07,0xC2,0xE0,0x10,0x01,0x18,0x10,0x00,0xEF,0x17,0x03,0x71, +0x0A,0xEC,0x01,0x9B,0x17,0x46,0xF7,0xC4,0x0E,0xEC,0x01,0xC1,0xC0,0x10,0x01,0x0E, +0xEF,0x02,0xFD,0x4E,0x08,0x30,0xD2,0xE1,0x0A,0x6E,0xE7,0xFF,0xE1,0x48,0xC2,0xE0, +0x10,0x01,0x99,0x60,0xEE,0xF7,0x07,0x8E,0x22,0xE5,0x6A,0xE4,0x00,0x02,0x29,0x1C, +0x61,0x01,0x88,0x8F,0x98,0xA3,0xE7,0xFF,0x6A,0x14,0x1E,0xE1,0x08,0x8E,0xEB,0x12, +0xF7,0xF9,0x1F,0x17,0x1A,0x4E,0xF7,0x08,0x4F,0x18,0x08,0x8E,0xF0,0x8F,0x0D,0x0A, +0xF7,0x01,0x0B,0x18,0x00,0xD7,0x17,0x00,0x98,0x9A,0xE1,0x0B,0x0A,0x01,0x4E,0xF7, +0x5C,0x46,0xF7,0xC5,0xE4,0x00,0x00,0x25,0x9A,0xE1,0x0B,0x0A,0x01,0x4E,0xF7,0x5C, +0x46,0xF7,0xBF,0x46,0xF7,0xC4,0x9D,0x61,0x0E,0xEA,0x01,0x5D,0x6B,0x00,0xE4,0x00, +0x00,0x31,0xC1,0xF8,0x00,0x21,0xC2,0x00,0x10,0x01,0xC1,0xC0,0x10,0x01,0xFD,0xEF, +0xB4,0xBA,0xFE,0x10,0x03,0x72,0xF2,0xEE,0x08,0x66,0xD6,0xEB,0xFC,0xAD,0x0A,0xEA, +0x01,0x22,0xE0,0x34,0x0A,0xEC,0x01,0x52,0xF7,0x10,0xE4,0x00,0x00,0x3B,0x0A,0xEC, +0x01,0x57,0x17,0x10,0x23,0x00,0x34,0x9B,0x21,0xC3,0x00,0x10,0x01,0xFB,0x38,0x08, +0x50,0x1F,0x40,0xEF,0x46,0xF7,0xD4,0x0E,0xEC,0x01,0xC1,0x40,0x10,0x01,0xC3,0x00, +0x10,0x01,0xEE,0xEA,0x08,0x5A,0xFF,0x18,0x08,0x77,0x22,0xE0,0x56,0x18,0x18,0x00, +0x0A,0xEC,0x01,0x56,0xF7,0x10,0x22,0xE1,0x64,0x9A,0xE1,0xE4,0x00,0x00,0x41,0x22, +0xE4,0x92,0x12,0xF8,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xF8,0x00,0x0B,0x0C,0x01, +0x57,0x18,0x10,0x23,0x00,0xE0,0x26,0xE4,0xE5,0x9A,0xE2,0xEE,0xEA,0x08,0x58,0xE4, +0x00,0x00,0x61,0x22,0xE8,0x7E,0x18,0x18,0x00,0x0A,0xEC,0x01,0x56,0xF7,0x10,0x22, +0xE0,0x34,0x98,0x62,0xE7,0xFF,0xA3,0x4C,0xE4,0x00,0x00,0x2F,0x9A,0xE3,0xE7,0xFF, +0xFF,0xBB,0x22,0xEC,0x36,0x98,0x60,0xE7,0xFF,0xA3,0x26,0xEC,0x0A,0x08,0x58,0x0B, +0x0C,0x00,0xC2,0xE0,0x10,0x01,0x27,0x1C,0x56,0xF3,0x17,0x08,0x3C,0xD3,0x09,0x08, +0x1D,0x9F,0x01,0xFB,0x17,0x08,0x3C,0xE4,0x00,0x01,0xF3,0xF8,0x17,0x08,0x3C,0xE4, +0x00,0x01,0xFB,0x0E,0xEF,0x02,0xD2,0xE2,0x07,0xB6,0x0A,0xEC,0x01,0x56,0xF7,0x40, +0x22,0xE0,0x26,0x98,0x63,0xE7,0xFF,0xF4,0xEE,0x12,0xEB,0x00,0x22,0xE0,0x36,0x98, +0x60,0x98,0x80,0x98,0xA0,0xE4,0x00,0x00,0x3B,0x22,0xE4,0x3E,0x08,0x6B,0x17,0x08, +0x8B,0x19,0x98,0xA1,0xE4,0x00,0x00,0x1D,0xD2,0xE1,0x06,0x21,0x98,0x60,0x98,0x80, +0x98,0xA2,0x1C,0xC1,0x04,0xE7,0xFF,0xBD,0xD2,0xD0,0x61,0x05,0x9E,0x0E,0xE1,0x06, +0x22,0xE0,0x2A,0x52,0xE0,0x58,0xE4,0x00,0x00,0xD9,0x9E,0xFF,0xD2,0xEB,0x03,0x6D, +0x4E,0xF7,0x10,0xC3,0x18,0x00,0x21,0xFF,0x18,0xBB,0x3C,0x8E,0xF8,0x0E,0xF7,0x02, +0x86,0xE9,0x52,0xE0,0x60,0xE4,0x00,0x00,0x9B,0x52,0xE0,0x61,0xE4,0x00,0x00,0x8D, +0x52,0xE0,0x62,0xE4,0x00,0x00,0x7F,0x52,0xE0,0x63,0xE4,0x00,0x00,0x71,0x52,0xE0, +0x64,0xE4,0x00,0x00,0x63,0x52,0xE0,0x65,0xE4,0x00,0x00,0x55,0x52,0xE0,0x66,0xE4, +0x00,0x00,0x47,0x52,0xE0,0x67,0xE4,0x00,0x00,0x39,0x52,0xE0,0x68,0xE4,0x00,0x00, +0x2B,0x52,0xE0,0x69,0xE4,0x00,0x00,0x1D,0x52,0xE0,0x6A,0xE4,0x00,0x00,0x0F,0x52, +0xE0,0x6B,0x0E,0xEA,0x01,0xE4,0x00,0x00,0x6F,0x0C,0x0A,0x01,0xE4,0x00,0x00,0x61, +0x0E,0xEF,0x02,0x22,0xE4,0xA6,0x9B,0x05,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x60, +0x9B,0x03,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFB,0x17,0x08,0x50,0xE7,0xFF,0xA0,0xFC, +0xE7,0xFF,0x9B,0xCC,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x9C,0xA6,0xC2,0xE0,0x10,0x01, +0xEB,0x17,0x08,0x33,0xC3,0x00,0x7D,0x0A,0x20,0x00,0x61,0xC3,0x00,0x10,0x01,0x9B, +0x5E,0xF3,0x38,0x08,0x1A,0xEC,0x17,0x08,0x33,0x47,0x39,0xD4,0xFB,0x38,0x08,0x1A, +0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D, +0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41, +0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21, +0x04,0x89,0x43,0x20,0x84,0x46,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xD8,0x92,0x98,0x68, +0xE4,0x00,0x00,0x1D,0x98,0x62,0x88,0x8A,0xE7,0xFF,0xD8,0x76,0x98,0x69,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x9C,0x28,0xE7,0xFF,0xD8,0x57,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xD8,0x32,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xD8,0x13,0xD0,0x69, +0x08,0x05,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x6C,0x8E,0xF8,0xC3, +0x20,0x10,0x01,0x0F,0x77,0x02,0xC3,0x40,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0, +0x10,0x01,0xFF,0x39,0x09,0xF8,0xFF,0x5A,0x09,0x48,0xFF,0x18,0x0C,0x96,0xFE,0xF7, +0x09,0x0C,0x87,0x69,0xCC,0x63,0x00,0x1A,0x5C,0x63,0x00,0x4F,0x23,0x08,0x4C,0x63, +0x10,0x8F,0x19,0x8E,0xF9,0x8F,0x43,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F, +0x99,0x08,0x0B,0xBD,0x01,0x8F,0x9A,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5, +0x0F,0x9B,0x01,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x01,0x27,0x9C, +0x7E,0xCC,0x63,0x00,0x1A,0x5C,0x63,0x00,0x4F,0x43,0x08,0x4C,0x63,0x10,0x8F,0x1A, +0x8C,0x79,0x8E,0xFA,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F,0x99,0x08,0x0B, +0xBD,0x01,0x8F,0x83,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5,0x0F,0x9B,0x01, +0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x00,0xAD,0x0B,0x78,0x35,0x0F, +0x3A,0x6A,0x4F,0x39,0x42,0x43,0x3B,0xCD,0x0B,0x78,0x37,0x0F,0x37,0x35,0x0F,0x3A, +0x6E,0x4F,0x39,0x42,0x43,0x3B,0xCD,0x0F,0x37,0x37,0x0F,0x3A,0x72,0xE4,0x00,0x00, +0x4B,0x0F,0x59,0x6A,0x0B,0x78,0x35,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0B,0x78,0x37, +0x0F,0x57,0x35,0x0F,0x59,0x6E,0x0F,0x39,0x72,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0F, +0x57,0x37,0x4F,0x39,0x42,0x0B,0x18,0x39,0x43,0x18,0xCD,0x0F,0x17,0x39,0x85,0x29, +0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x3E,0x98,0x60,0xE7,0xFF,0xFD,0xE8,0x98,0x68, +0xE4,0x00,0x00,0x19,0x98,0x62,0xE7,0xFF,0xFD,0xD0,0x98,0x69,0x0D,0x21,0x06,0x9C, +0x28,0xE7,0xFF,0xFD,0xBB,0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0xA4, +0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFD,0x8F,0x9C,0x38,0x0D,0x21,0x04, +0xE7,0xFF,0xA8,0x66,0x20,0x60,0x5E,0xE7,0xFF,0xA8,0x44,0x98,0x80,0xE7,0xFF,0xB5, +0x9A,0xE7,0xFF,0xA8,0x30,0x98,0x82,0xE4,0x00,0x00,0x37,0xE7,0xFF,0xA8,0x30,0x20, +0x64,0x86,0xE7,0xFF,0xA8,0x0E,0x98,0x81,0xE7,0xFF,0xB5,0x64,0xE7,0xFF,0xA7,0xFA, +0x98,0x83,0xE7,0xFF,0xB2,0xB8,0xE7,0xFF,0xCF,0x2C,0x9A,0xE0,0xE4,0x00,0x00,0x8D, +0xE7,0xFF,0xA7,0xE6,0x20,0x68,0x36,0xE7,0xFF,0xA7,0xC4,0x98,0x82,0xE4,0x00,0x00, +0x23,0xE7,0xFF,0xA7,0xC4,0x20,0x6C,0x5E,0xE7,0xFF,0xA7,0xA2,0x98,0x83,0xE7,0xFF, +0xB4,0xF8,0xE7,0xFF,0xA7,0x8E,0x98,0x87,0xE7,0xFF,0xFF,0x95,0xE7,0xFF,0xA7,0x8E, +0x9A,0xE0,0xD0,0x67,0x00,0x86,0xE7,0xFF,0xA7,0x66,0x98,0x87,0xE7,0xFF,0xB4,0xBC, +0x9A,0xE1,0x88,0x77,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x21, +0x14,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x80,0x01,0x80,0x01,0x80,0x01, +0x80,0x01,0xE7,0xFF,0x93,0x8C,0x0C,0x61,0x00,0xE7,0xFF,0x93,0x86,0x0C,0x61,0x04, +0x0E,0xE1,0x02,0xD2,0xE0,0x14,0xA2,0x0E,0xE1,0x02,0xC1,0x60,0x10,0x01,0xC1,0x40, +0x10,0x01,0x57,0x17,0x10,0xFD,0x6B,0x00,0xE6,0xFD,0x4A,0x00,0xD4,0xD3,0x00,0x06, +0xCA,0x50,0x60,0x10,0xE7,0xFF,0x93,0x68,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xC3, +0x9F,0x01,0x5F,0x18,0x04,0xEF,0x17,0x00,0xC3,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08, +0x33,0x23,0x00,0x24,0x9F,0x01,0xEF,0x17,0x08,0x33,0xE7,0xFF,0x93,0x6C,0x0A,0xEB, +0x0B,0x40,0x63,0xBD,0x5E,0xE3,0x04,0x5E,0xE3,0xBB,0x20,0x02,0x3F,0xC2,0xE0,0x10, +0x01,0xEA,0xF7,0x06,0x87,0x56,0xF7,0x20,0xD2,0xE0,0x04,0x0A,0x98,0x61,0xE7,0xFF, +0xB5,0xAC,0x20,0x61,0xDE,0xE7,0xFF,0xA6,0x08,0x20,0x64,0x56,0xC2,0xE0,0x10,0x01, +0xF2,0xF7,0x00,0xC8,0x56,0xF7,0x01,0x22,0xE1,0x8A,0xE4,0x00,0x00,0x1F,0xE7,0xFF, +0xA5,0xD6,0x20,0x63,0xA8,0xE4,0x00,0x00,0xA9,0xE7,0xFF,0xCC,0x18,0xC2,0xE0,0x10, +0x01,0xEB,0x17,0x06,0x87,0xC7,0x18,0xFF,0xDF,0xEF,0x17,0x06,0x87,0xE7,0xFF,0xA5, +0x98,0x20,0x60,0x5E,0x98,0x81,0x98,0xA0,0xE7,0xFF,0x2A,0xF2,0x98,0x60,0x88,0x83, +0xE7,0xFF,0xB0,0x3C,0xE4,0x00,0x00,0x43,0x98,0x80,0x98,0x62,0xE7,0xFF,0xB0,0x24, +0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x5C,0x5E,0x98,0x60,0xE7,0xFF,0x2F,0xDC,0xE7,0xFF, +0x92,0x44,0x0C,0x6B,0x09,0xE7,0xFF,0xCC,0x6E,0x0A,0xEA,0x01,0x52,0xF7,0x10,0x0E, +0xEA,0x01,0xE4,0x00,0x03,0xEF,0x57,0x17,0x40,0x23,0x00,0x38,0x50,0x60,0x40,0xE7, +0xFF,0x91,0xB2,0xE4,0x00,0x03,0xCD,0xC6,0xF7,0x01,0x00,0xD2,0xE0,0x0E,0xF2,0x98, +0x60,0xE7,0xFF,0x91,0x5E,0xFC,0x60,0x01,0x00,0xE7,0xFF,0x91,0x5E,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0x91,0x6E,0xE7,0xFF,0xA4,0xA8,0xD0,0x67,0x0D,0xA5,0xC2,0xF8,0x00, +0x21,0xFE,0xF7,0xBB,0x98,0x4C,0x63,0x10,0x8C,0x77,0x0E,0xE3,0x02,0x86,0xE9,0xE7, +0xFF,0xA4,0x88,0x20,0x60,0x46,0x98,0x80,0xE7,0xFF,0xB1,0xC4,0x98,0x60,0x98,0x87, +0xE4,0x00,0x02,0x77,0xE7,0xFF,0xA4,0x5E,0xD0,0x67,0x0C,0x2E,0x98,0x60,0x98,0x87, +0xE4,0x00,0x01,0xFF,0xE7,0xFF,0xFB,0xCE,0xD0,0x60,0x0B,0xAA,0xE7,0xFF,0xB2,0xEA, +0x5D,0x83,0x04,0x98,0x61,0xE7,0xFF,0xB3,0x9E,0xD0,0x60,0x07,0x56,0xC1,0x80,0x19, +0x0A,0x20,0x03,0x89,0xE7,0xFF,0x2E,0xE4,0xE7,0xFF,0x2E,0xB4,0x5C,0x63,0x00,0x24, +0x64,0x33,0x98,0x61,0xC1,0x80,0x32,0x0A,0x20,0x01,0xE9,0x98,0x80,0x98,0x62,0xE7, +0xFF,0xAE,0x7E,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x5A,0xB8,0x98,0x60,0xE7,0xFF,0x2E, +0x36,0xE7,0xFF,0x90,0x9E,0x0C,0x6B,0x09,0xE4,0x00,0x01,0xAF,0xE7,0xFF,0xFB,0x1E, +0xD0,0x60,0x08,0xEA,0xE7,0xFF,0xB2,0x3A,0xE7,0xFF,0x5A,0xF8,0xE7,0xFF,0x5B,0x88, +0xD0,0x61,0x04,0x9A,0xE7,0xFF,0x5B,0xA8,0x20,0x64,0xD2,0xE7,0xFF,0x2D,0xC6,0x5C, +0x63,0x00,0xC0,0x60,0x18,0xEE,0x20,0x00,0x1D,0xE7,0xFF,0x2D,0xD2,0xE7,0xFF,0x2D, +0xA2,0x98,0x80,0x5D,0x43,0x00,0x98,0x62,0xE7,0xFF,0xAD,0xCC,0xCC,0x6A,0x00,0x64, +0xFC,0x63,0x01,0x5E,0xE7,0xFF,0x59,0xFE,0xE4,0x00,0x01,0x0F,0xE7,0xFF,0x5B,0x58, +0x98,0x62,0x98,0x80,0xE4,0x00,0x00,0xEF,0xE7,0xFF,0xA2,0xD6,0x20,0x64,0x3E,0xE7, +0xFF,0xA2,0xC8,0x88,0x83,0x98,0x64,0xE4,0x00,0x00,0x71,0xE7,0xFF,0xA2,0xB0,0x20, +0x63,0xC0,0xE7,0xFF,0xA2,0xA2,0xD0,0x60,0x05,0x3E,0x98,0x64,0x98,0x80,0xE7,0xFF, +0xAF,0xD8,0x98,0x64,0xE4,0x00,0x00,0x8B,0x98,0x64,0x98,0x89,0xE4,0x00,0x00,0x27, +0xE7,0xFF,0xA2,0x66,0x20,0x64,0x76,0xE7,0xFF,0xA2,0x58,0x88,0x83,0x98,0x67,0xE7, +0xFF,0xAF,0x96,0x0A,0xEA,0x01,0xCA,0xF7,0x01,0x00,0x0E,0xEA,0x01,0xE4,0x00,0x00, +0xE1,0xE7,0xFF,0xA2,0x24,0x20,0x63,0x88,0xE7,0xFF,0xA2,0x16,0x20,0x61,0x86,0x98, +0x67,0x98,0x80,0xE7,0xFF,0xAF,0x4E,0x98,0x67,0x98,0x81,0xE7,0xFF,0xAC,0xA6,0xE7, +0xFF,0xC9,0x1A,0xE4,0x00,0x00,0x95,0x0E,0xE1,0x06,0x22,0xE1,0x3C,0x0E,0xE1,0x06, +0x56,0xF7,0x20,0x22,0xE1,0x18,0x98,0x60,0xE7,0xFF,0x8E,0x30,0x50,0x60,0x20,0xE7, +0xFF,0x8E,0x3A,0xE7,0xFF,0x80,0xB4,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD9,0xC7, +0x18,0xFF,0xFE,0x50,0x60,0x20,0xEF,0x17,0x00,0xD9,0xE7,0xFF,0x8E,0x14,0xC2,0xE0, +0x10,0x01,0xEB,0x17,0x00,0xD7,0x53,0x18,0x20,0xEF,0x17,0x00,0xD7,0xC2,0xE0,0x10, +0x01,0xF0,0x77,0x03,0x6E,0xE7,0xFF,0x8D,0xB6,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D, +0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x0C,0x63,0x02,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x0C,0x83,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x24,0x14,0x0B,0x17,0x01,0x53,0x18,0x01,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF,0x0F, +0x17,0x01,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D, +0x81,0x00,0xC1,0x54,0x00,0x01,0xC9,0x8A,0x22,0x28,0x0A,0xEC,0x01,0xC6,0xF7,0xFF, +0xFB,0xC9,0x6A,0x22,0x04,0x0E,0xEC,0x01,0xFF,0x00,0x80,0x00,0x0A,0xEB,0x01,0x46, +0xF7,0xC5,0x5E,0xF7,0x04,0xC9,0x4A,0x24,0xA8,0x0E,0xEB,0x01,0x0A,0xEA,0x01,0xCA, +0xF7,0x30,0x00,0x50,0x60,0x64,0x0E,0xEA,0x01,0xE4,0x00,0x28,0x4A,0x0A,0xEC,0x01, +0x52,0xF7,0x04,0x50,0x60,0x1E,0x0E,0xEC,0x01,0xE4,0x00,0x28,0x2A,0x0A,0xEB,0x01, +0xC6,0xF7,0x7F,0xFF,0x0E,0xEB,0x01,0x0A,0xEA,0x01,0xC6,0xF7,0xCF,0xFF,0x0E,0xEA, +0x01,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x2C,0x08,0x77,0x01,0x4C,0x63,0x09, +0x54,0x63,0x1F,0x9C,0x61,0x85,0x29,0x9C,0x7F,0x5C,0x63,0x00,0x5C,0x62,0xFB,0x20, +0x00,0x81,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x08,0xCA,0xF7,0x24,0x2C,0x54,0x63,0x3E, +0x0B,0x17,0x01,0x1F,0x20,0xC1,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77,0x01,0x85, +0x29,0x9B,0x19,0x20,0x60,0x62,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x37, +0x01,0x47,0x19,0xC4,0x53,0x18,0x04,0xE4,0x00,0x00,0x87,0x20,0x64,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0x53,0x18,0x06,0xE4,0x00,0x00,0x5D, +0x20,0x68,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0xC7,0x18, +0xFF,0xF9,0xE4,0x00,0x00,0x31,0x20,0x6C,0x5E,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x10,0x0B,0x37,0x01,0x47,0x19,0xC4,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0x5C, +0x63,0x00,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0C,0xA1,0x04,0x95,0x50,0xC9, +0x4A,0x20,0x80,0x8D,0x43,0x4D,0x4A,0x18,0x88,0x6A,0xE7,0xFF,0xFC,0xE0,0x0C,0xA1, +0x06,0x1C,0x6A,0x04,0x0D,0x21,0x0E,0x0D,0x41,0x0A,0x88,0x85,0x1C,0x21,0x10,0xE7, +0xFF,0xFC,0xB7,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x5D,0x44,0x00,0x4E,0xEA,0x08,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x5D,0x65,0x00,0x5C,0x63,0x00,0x4D,0x83,0x18,0x8D,0x8B, +0x8D,0x97,0x06,0xE0,0x81,0xCA,0xF7,0x04,0x00,0x0D,0x21,0x14,0x0D,0xA1,0x04,0xC5, +0x8C,0x1F,0xFC,0x5D,0xA6,0x00,0x8D,0x97,0x88,0x6C,0xE7,0xFF,0xFC,0x00,0x55,0x4A, +0x01,0x50,0x80,0xFF,0x4D,0x4A,0x08,0x8D,0x6A,0x4D,0x6B,0x18,0x4C,0x84,0x5C,0x4D, +0x6D,0x5C,0x44,0x84,0x27,0x0D,0xA1,0x06,0x44,0x83,0x24,0x0D,0x41,0x12,0x88,0x6C, +0x44,0x84,0x5D,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x21,0x16,0x1C,0x21,0x18,0xE7, +0xFF,0xFB,0xD7,0x5C,0x84,0x04,0x20,0x60,0x28,0x20,0x64,0xC2,0xE4,0x00,0x00,0x33, +0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA,0xF7,0x24,0x34,0xC4,0x84,0x01, +0xFF,0xE4,0x00,0x00,0x2B,0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA,0xF7, +0x24,0x38,0xC4,0x84,0x01,0xFF,0x0C,0x97,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18, +0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01, +0x47,0x64,0x27,0xCB,0x37,0x24,0x3C,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x40,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27, +0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F, +0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7, +0xCB,0x37,0x24,0x3C,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x40,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27, +0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18, +0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01, +0x47,0x64,0x27,0xCB,0x37,0x24,0x1C,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x20,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27, +0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F, +0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7, +0xCB,0x37,0x24,0x1C,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x20,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27, +0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB, +0x17,0x24,0x80,0x0B,0x38,0x01,0x5F,0x23,0x04,0x0F,0x38,0x01,0x07,0x20,0xFF,0xCB, +0x39,0xFF,0xFF,0xCA,0xF7,0x24,0x84,0x44,0x63,0xCC,0x0B,0x17,0x01,0x4C,0x63,0x81, +0xFF,0x20,0xFF,0x00,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77,0x01,0x85,0x29,0x07, +0x00,0xFF,0xCB,0x18,0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D, +0xC2,0xF4,0x00,0x01,0x47,0x64,0x27,0xCB,0x37,0x24,0x24,0x0B,0x59,0x01,0x47,0x5A, +0xDC,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18, +0x81,0x44,0x84,0x27,0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4, +0x47,0x04,0xC5,0x0F,0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00, +0x01,0x47,0x9A,0xD7,0xCB,0x37,0x24,0x24,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A, +0xDD,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84, +0x81,0x47,0x24,0x27,0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0xC3, +0x14,0x00,0x01,0xCA,0xF8,0x22,0x08,0x20,0x64,0x3A,0x0B,0x37,0x01,0xCB,0x39,0x10, +0x00,0xE4,0x00,0x00,0x1D,0x20,0x60,0x36,0x0B,0x37,0x01,0xC7,0x39,0xEF,0xFF,0x0F, +0x37,0x01,0xCA,0xF8,0x22,0x08,0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x84,0x00,0x1F,0x00,0x80,0x20,0x60,0x28,0x20,0x64,0xAA,0xE4,0x00, +0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x54,0xE4,0x00,0x00,0x19,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0x64,0x0B,0x37,0x01,0x54,0x84,0x7F,0x47,0x19,0xC4,0x47, +0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x20,0x60,0x28,0x20,0x64,0xAA, +0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x50,0xE4,0x00,0x00,0x19, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x61,0x13,0x17,0x00,0x54,0x84,0x1F,0x57,0x18, +0xE0,0x44,0x84,0xC5,0x18,0x97,0x00,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61, +0x04,0x0D,0x21,0x0C,0x5D,0x44,0x00,0x89,0x63,0x1C,0x8A,0xF1,0x4C,0x84,0x08,0x5C, +0x83,0xF3,0x20,0x00,0x19,0x50,0x80,0x1F,0x88,0x6B,0xE7,0xFF,0xFF,0x5A,0x1F,0x00, +0x80,0x21,0x60,0x28,0x21,0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x24,0x4C,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x60,0x0B, +0x37,0x01,0x55,0x4A,0x7F,0x47,0x19,0xC4,0x47,0x0A,0xC5,0x0F,0x17,0x01,0x0D,0x61, +0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x20,0x64,0x8E,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0x53,0x39, +0xF0,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xF0,0xE4,0x00,0x00,0x47,0x20, +0x60,0x8A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38, +0x01,0xC7,0x39,0xFF,0x0F,0x0F,0x38,0x01,0x0B,0x17,0x01,0x53,0x18,0x0F,0x0F,0x17, +0x01,0x85,0x29,0x20,0x64,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7, +0x22,0x60,0x0B,0x38,0x01,0x53,0x39,0x08,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18, +0xFE,0xFF,0xE4,0x00,0x00,0x49,0x20,0x60,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22, +0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0xC7,0x39,0xFF,0xF7,0x0F,0x38,0x01,0x0B, +0x17,0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xCB,0x18,0x02,0x00,0xE4,0x00,0x00, +0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xC7, +0x18,0xFD,0xFF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x54,0x63,0x7F,0xCA, +0xF7,0x24,0xA0,0x1F,0x20,0x80,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x40,0xCA,0xF7,0x24,0xA0,0xC4, +0x63,0x7F,0x00,0x0B,0x17,0x01,0xFF,0x20,0x80,0xFF,0x47,0x18,0xCC,0x47,0x03,0xC5, +0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA1,0x10,0x77,0x00, +0x54,0x63,0x7F,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0xE4,0x00,0x00,0x2B,0x20,0x60,0x52,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x53,0x18,0x80,0x0F,0x17,0x01,0x85, +0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0xC7, +0x18,0x7F,0xFF,0xE4,0x00,0x00,0x39,0x20,0x60,0x6E,0xC2,0xF4,0x00,0x01,0xFF,0x20, +0x80,0x00,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C,0x63,0x00,0xCA,0xF7,0x22,0x0C,0xFF, +0x20,0xFF,0x00,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xFF,0x40,0xFF,0x00,0xCA,0xF7,0x22,0xF0, +0x47,0x03,0xD4,0x0B,0x37,0x01,0x5F,0x39,0x00,0x47,0x18,0xCD,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x38,0x0B,0x17,0x01,0x0C, +0x77,0x01,0x85,0x29,0x20,0x64,0x6A,0xC2,0xF4,0x00,0x01,0x9B,0x3C,0xCA,0xF7,0x25, +0xC0,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x01,0xE4,0x00,0x00,0x3F,0x20,0x60, +0x7A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x38,0xCA,0xF7,0x25,0xC0,0x0B,0x38,0x01, +0x0C,0x18,0x01,0x0B,0x17,0x01,0x53,0x18,0x03,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84, +0x00,0x20,0x64,0x62,0x4C,0x63,0x24,0xC2,0xF4,0x00,0x01,0x5C,0x63,0x04,0xCA,0xF7, +0x22,0xCC,0x0C,0x77,0x01,0xE4,0x00,0x00,0x25,0x20,0x60,0x3A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x22,0xCC,0x0C,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4,0x00,0x00,0x2B,0x20, +0x64,0x52,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0x53,0x18,0x01, +0x0F,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8, +0x0B,0x17,0x01,0xC7,0x18,0xF0,0xFF,0xE4,0x00,0x00,0x2D,0x20,0x64,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xCB,0x18,0x0F,0x00,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x63,0x00,0xC4,0x84,0x03,0xFF,0x20,0x64,0x70,0x20,0x60,0x34,0x20, +0x68,0x88,0x20,0x6C,0xDA,0xE4,0x00,0x00,0x51,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x68,0xE4,0x00,0x00,0x49,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x6C,0xE4,0x00,0x00, +0x31,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x70,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x24,0x74,0x0C,0x97,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x5C,0x63,0x00,0x07,0x00, +0x20,0xCB,0x18,0x41,0x00,0x44,0x63,0xC5,0x4C,0x63,0x10,0x0C,0x83,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xFC,0x21,0xFE,0x88,0x50,0xA0, +0x96,0xED,0x21,0x01,0x74,0xED,0x41,0x01,0x70,0xED,0x61,0x01,0x6C,0x88,0x61,0xC1, +0x78,0x00,0x21,0xFD,0x6B,0xB4,0xBE,0x88,0x8B,0xE7,0xFF,0x4A,0x4E,0xFD,0x41,0x00, +0x96,0xFC,0x8B,0x00,0x96,0x88,0x6A,0x50,0xA0,0xD2,0xE7,0xFF,0x4A,0x2C,0x8A,0xE1, +0xC3,0x54,0x00,0x01,0xFF,0x60,0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39, +0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x47,0xB9,0xCF,0x8F, +0x1A,0x0B,0x98,0x01,0x47,0x9C,0xEC,0x0B,0xB7,0x05,0x47,0x39,0xEC,0x47,0x3C,0xCD, +0x0F,0x38,0x01,0x9E,0xE6,0xD5,0x57,0xFE,0x9E,0xFE,0xE1,0x00,0x96,0xFF,0x81,0x01, +0x68,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08, +0x8F,0x19,0x0B,0x37,0x03,0x47,0xD9,0xCF,0x8F,0x1A,0x0B,0xB8,0x01,0x47,0xBD,0xF4, +0x0B,0xD7,0x05,0x47,0x39,0xF4,0x47,0x3D,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x97, +0xFE,0x9E,0xED,0x61,0x01,0x6E,0xED,0x41,0x01,0x72,0xED,0x21,0x01,0x76,0xFC,0x21, +0x01,0x78,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x00,0x0C,0x18,0x01,0xCA, +0xF7,0x24,0x14,0xFF,0x20,0xFF,0x07,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x30, +0x0F,0x17,0x01,0x85,0x29,0x1C,0x21,0xD8,0xC3,0x54,0x00,0x01,0x0D,0x21,0x24,0xCA, +0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00,0x57,0x37,0xFF,0x4F,0x39,0x10,0x8F,0x3A,0x0C, +0x19,0x01,0x9E,0xE1,0xC3,0x14,0x00,0x01,0xC2,0xE2,0x2B,0x84,0x23,0xFF,0xAD,0xCA, +0xF8,0x23,0x70,0x0C,0x17,0x01,0xCA,0xF8,0x23,0x74,0xCB,0x18,0x23,0x78,0x0C,0x17, +0x01,0x0C,0x18,0x01,0x1C,0x61,0x02,0xC0,0x98,0x00,0x21,0x50,0xA0,0x1E,0xFC,0x84, +0xB4,0xBE,0xFC,0x84,0x01,0x68,0xE7,0xFF,0x48,0x34,0x1E,0xE1,0x02,0x1F,0x41,0x20, +0x0B,0x37,0x01,0xFF,0x60,0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10, +0x4F,0x18,0x08,0x8F,0x19,0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99, +0xCF,0x0B,0x78,0x01,0x47,0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD, +0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x57,0xFE,0x5E,0x0D,0x21,0x26,0xFC,0x60,0x01,0xF4, +0x1C,0x21,0x28,0xE4,0x00,0x16,0xB7,0x5C,0x84,0x00,0x9B,0x10,0x20,0x60,0x28,0x20, +0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x10,0xE4,0x00, +0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x14,0x0B,0x37,0x01,0x54,0x84,0x0F, +0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0x1C,0x21,0xE0,0xC0,0x98, +0x00,0x21,0x0D,0x21,0x1C,0x88,0x61,0xFC,0x84,0xB4,0xBE,0x50,0xA0,0x18,0xFC,0x84, +0x01,0x86,0xE7,0xFF,0x46,0xFC,0x8A,0xE1,0x1F,0x41,0x18,0x0B,0x37,0x01,0xFF,0x60, +0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19, +0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47, +0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6, +0xD7,0x57,0xFE,0x5E,0xC3,0x54,0x00,0x01,0xCA,0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00, +0x57,0x37,0xFF,0x4F,0x39,0x10,0x8F,0x3A,0x0C,0x19,0x01,0x9E,0xE1,0xC3,0x14,0x00, +0x01,0xC2,0xE2,0x2B,0x84,0x23,0xFF,0xAD,0xCA,0xF8,0x23,0x70,0x0C,0x17,0x01,0xCA, +0xF8,0x23,0x74,0x0C,0x17,0x01,0xCB,0x18,0x23,0x78,0x0C,0x18,0x01,0x0D,0x21,0x1E, +0x1C,0x21,0x20,0x85,0x29,0x1C,0x21,0xE0,0xC0,0x98,0x00,0x21,0x0D,0x21,0x1C,0x1C, +0x61,0x06,0xFC,0x84,0xB4,0xBE,0x50,0xA0,0x12,0xFC,0x84,0x01,0x9E,0xE7,0xFF,0x45, +0xC6,0x1E,0xE1,0x06,0x1F,0x41,0x18,0x0B,0x37,0x01,0xFF,0x60,0xFF,0x00,0x47,0x19, +0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0xC3,0x34,0x00,0x01, +0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47,0x7B,0xE4,0x0B,0x97, +0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x57,0xFE,0x5E, +0xC3,0x74,0x00,0x01,0xCA,0xE0,0x11,0x50,0xCB,0x7B,0x22,0x00,0xFF,0x40,0x11,0x11, +0x57,0x37,0xFF,0x4F,0x39,0x10,0x8F,0x3B,0x0F,0x59,0x01,0x9E,0xE1,0xC3,0x14,0x00, +0x01,0xC2,0xE2,0x2B,0x84,0x23,0xFF,0xAD,0xCB,0x38,0x23,0x70,0x9A,0xFF,0x0E,0xF9, +0x01,0xCB,0x38,0x23,0x74,0x0E,0xF9,0x01,0xCB,0x18,0x23,0x78,0x0E,0xF8,0x01,0x0D, +0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x74,0xD8,0x18, +0x18,0x00,0xCB,0x37,0x74,0x10,0x5C,0x63,0x00,0x18,0x79,0x00,0xCB,0x37,0x76,0x30, +0x18,0x19,0x00,0x53,0x40,0x24,0xCB,0x37,0x74,0x00,0x1B,0x59,0x00,0xCB,0x77,0x74, +0x28,0x53,0x20,0x60,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x30,0x1B,0x3B,0x00,0xCB,0x77, +0x74,0x38,0x53,0x20,0x1C,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x40,0x1B,0x3B,0x00,0xCB, +0x37,0x74,0xA8,0x13,0x39,0x00,0xCB,0x37,0x74,0x78,0x9B,0x69,0x1B,0x79,0x00,0xCB, +0x37,0x74,0x70,0x18,0x19,0x00,0xCB,0x37,0x74,0x60,0x13,0x79,0x00,0x1B,0x59,0x00, +0xCA,0xF7,0x74,0x61,0x13,0x37,0x00,0x18,0x17,0x00,0x98,0x61,0x12,0xF8,0x00,0x52, +0xF7,0x01,0x1A,0xF8,0x00,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x74,0x20,0x18,0x77,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFE,0xFF,0x0F,0x17,0x01,0x85, +0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63,0x21,0x54, +0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xE0,0x10,0x77,0x00,0x4C, +0x63,0x09,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10, +0x77,0x00,0x4C,0x63,0x29,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x74,0xE0,0x10,0x77,0x00,0x4C,0x63,0x19,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63,0x11,0x54,0x63,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x08,0x77,0x01,0x4C,0x63,0x49,0x54,0x63, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x08,0x77,0x01,0x4C,0x63, +0x51,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x61,0x13,0x17, +0x00,0x57,0x18,0xFD,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74, +0x61,0x13,0x17,0x00,0x53,0x18,0x02,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x74,0xC0,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74, +0xA8,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xC8,0x12,0xF7, +0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xA0,0x12,0xF7,0x00,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x20,0x10,0x77,0x00,0x85,0x29,0x5C,0x63,0x00, +0xC3,0x14,0x00,0x01,0x4E,0xE3,0x10,0xCB,0x18,0x2A,0x00,0x8E,0xF8,0x08,0x77,0x00, +0x9A,0xE8,0xCC,0x63,0x00,0x03,0x40,0x63,0xB8,0x85,0x29,0x5C,0x84,0x04,0x5E,0xE4, +0x00,0xD2,0xEF,0x05,0xAD,0x4E,0xF7,0x10,0xC3,0x18,0x00,0x21,0xFF,0x18,0xBD,0x1C, +0x8E,0xF8,0xC3,0x34,0x00,0x01,0x0F,0x17,0x02,0xCA,0xF9,0x26,0x18,0x0B,0x57,0x01, +0xC7,0x5A,0xFF,0xF3,0x1F,0x60,0xCF,0x0F,0x57,0x01,0x0B,0x57,0x01,0x47,0x5A,0xDC, +0x53,0x5A,0x10,0x4C,0x84,0x49,0x0F,0x57,0x01,0x9A,0xE1,0xCB,0x59,0x26,0x20,0xE4, +0x00,0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1,0x8F,0x38,0x5E,0xF7,0x04,0x0B,0x39,0x01, +0xC7,0x39,0x3F,0xFF,0x0F,0x3A,0x01,0xC3,0x34,0x00,0x01,0xD6,0xE4,0xFF,0x40,0x20, +0x60,0x96,0xCB,0x39,0x26,0x38,0x0B,0x18,0x01,0x0A,0xF9,0x01,0x4F,0x18,0x60,0xFF, +0x40,0x8F,0xFF,0xC7,0x18,0x70,0x00,0x46,0xF7,0xD4,0x46,0xF8,0xBD,0x0E,0xF9,0x01, +0xE4,0x00,0x00,0x4B,0x20,0x64,0x86,0xCA,0xF9,0x26,0x38,0xFF,0x60,0xF8,0xFF,0x0B, +0x38,0x01,0x0B,0x57,0x01,0x4F,0x39,0x40,0x47,0x1A,0xDC,0xC7,0x39,0x07,0x00,0x47, +0x19,0xC5,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x18,0x0B,0x17,0x01, +0x53,0x18,0x30,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0xD0,0x8F,0x03,0x9D,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBC,0x44,0x4C,0x84,0x10,0xC3,0x14,0x00,0x01,0x8C,0x97, +0xCB,0x38,0x26,0x34,0x0E,0xE4,0x02,0x0B,0x59,0x01,0x0B,0x77,0x03,0xFF,0x80,0xC0, +0x00,0xC7,0x7B,0x3F,0xFF,0x47,0x5A,0xE4,0x47,0x5B,0xD5,0x0F,0x59,0x01,0x20,0x60, +0x7E,0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F,0x39,0x60,0x0B,0x58,0x01,0xFF,0x60, +0x8F,0xFF,0xC7,0x39,0x70,0x00,0x46,0xFA,0xDC,0xE4,0x00,0x00,0x3F,0x20,0x64,0x86, +0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F,0x39,0x40,0x0B,0x58,0x01,0xFF,0x80,0xF8, +0xFF,0xC7,0x39,0x07,0x00,0x46,0xFA,0xE4,0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29, +0x5C,0x84,0x00,0xD0,0x8C,0x04,0x1D,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBC,0x44,0x4C, +0x84,0x10,0xFF,0x40,0xC0,0x00,0x8C,0x97,0x0E,0xE4,0x02,0x20,0x60,0xD6,0xC3,0x14, +0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26,0xC4,0xC7,0x7B,0x3F,0xFF,0x0B,0x99,0x01, +0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18,0x26,0x38,0x0F,0x59,0x01,0x1F,0x60,0x8F, +0x0B,0x37,0x01,0x0B,0x58,0x01,0x4F,0x39,0x20,0x57,0x39,0x70,0xE4,0x00,0x00,0x63, +0x20,0x64,0xDA,0xC3,0x14,0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26,0xC8,0xC7,0x7B, +0x3F,0xFF,0x0B,0x99,0x01,0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18,0x26,0x38,0x0F, +0x59,0x01,0x9B,0x78,0x0B,0x37,0x01,0x0B,0x58,0x01,0x57,0x39,0x07,0x46,0xFA,0xDC, +0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x28,0x20,0x64, +0xEE,0xE4,0x00,0x00,0x39,0xC2,0xF4,0x00,0x01,0x4C,0x84,0x41,0xCA,0xF7,0x26,0xC0, +0x54,0x84,0x3F,0x0B,0x17,0x01,0x1F,0x20,0xC0,0xE4,0x00,0x00,0x2F,0xC2,0xF4,0x00, +0x01,0xC4,0x84,0x3F,0x00,0xCA,0xF7,0x26,0xC0,0xFF,0x20,0xC0,0xFF,0x0B,0x17,0x01, +0x47,0x18,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0x20,0x61,0x52,0x20,0x84, +0x84,0x20,0x80,0x2C,0xD0,0x82,0x04,0xD6,0xE4,0x00,0x00,0x5D,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0x3F,0xFF,0xE4,0x00,0x01,0x01,0xC2, +0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18, +0x3F,0xFF,0xE4,0x00,0x00,0x27,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xC0,0x00,0xCA,0xF7, +0x26,0x30,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0xA1,0x20, +0x65,0x3E,0x20,0x84,0x80,0x20,0x80,0x28,0x20,0x89,0x1A,0xE4,0x00,0x00,0x63,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0xCF,0xFF,0xE4,0x00, +0x00,0x5B,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xCF,0xFF,0xCA,0xF7,0x26,0x30,0x0B,0x17, +0x01,0x47,0x18,0xCC,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x27,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xCB,0x18,0x30,0x00,0x0F,0x17,0x01,0x85,0x29, +0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26,0x24,0x0B, +0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF,0x0F,0x17, +0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17, +0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0xDF,0xFF,0x0F,0x17,0x01,0x85,0x29, +0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18, +0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26, +0x24,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18,0x10,0x00,0xE4, +0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17, +0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x9C,0x38,0xC2,0xF4,0x00,0x01, +0x0D,0x21,0x04,0xCA,0xF7,0x26,0x18,0x0B,0x17,0x01,0xCB,0x18,0x40,0x00,0x98,0x60, +0x0F,0x17,0x01,0xE7,0xFF,0xFF,0x1A,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF, +0xFF,0x5F,0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26, +0x00,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0x2D,0x20,0x60, +0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF, +0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00, +0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xDF,0xFF,0x0F,0x17,0x01, +0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01, +0xCB,0x18,0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20, +0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x10, +0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00, +0x0B,0x17,0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x08,0x00,0xE4,0x00, +0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01, +0xC7,0x18,0xF7,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x04,0x00,0xE4,0x00,0x00,0x2D,0x20, +0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFB, +0xFF,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0x4F,0x23,0x40, +0xCA,0xF7,0x26,0x14,0x4C,0x63,0x60,0x0B,0x17,0x01,0x44,0x79,0x1D,0x5F,0x18,0x00, +0x44,0x63,0xC5,0x5C,0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xFF, +0x20,0xF0,0x00,0xCB,0x17,0x26,0x0C,0xC4,0x63,0x0F,0xFF,0x0B,0x58,0x01,0x5C,0x63, +0x06,0x47,0x5A,0xCC,0x47,0x43,0xD5,0x0F,0x58,0x01,0xCA,0xF7,0x26,0x10,0x0B,0x17, +0x01,0x47,0x38,0xCC,0x44,0x63,0xCD,0x0C,0x77,0x01,0x85,0x29,0x9C,0x38,0xFF,0x00, +0xE0,0x00,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC1,0x54,0x00,0x01,0xCA,0xEA,0x26,0x04, +0x0B,0x37,0x01,0x47,0x39,0xC4,0xCB,0x39,0x0F,0xA0,0x0F,0x37,0x01,0xCA,0xEA,0x26, +0x08,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x10,0x60,0x98,0x60,0x0F,0x17,0x01, +0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF9,0x28,0xCA,0xEA,0x26,0xC0,0xFF,0x20,0xC0,0xFF, +0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x08,0x00,0x98,0x60,0x0F,0x17,0x01,0xFC, +0x80,0x08,0x03,0xE7,0xFF,0xF7,0xDA,0x98,0x61,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF7, +0xC6,0xCA,0xEA,0x26,0x00,0x0B,0x17,0x01,0x53,0x18,0x0F,0x0F,0x17,0x01,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0x7F,0x0F,0x17,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xBF,0x98, +0x68,0x0F,0x17,0x01,0xE7,0xFF,0xFE,0x44,0x0D,0x21,0x06,0x0D,0x41,0x02,0xFC,0x60, +0x01,0x2C,0x9C,0x28,0xE7,0xFF,0xFE,0x6F,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00, +0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x78,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFD,0x0F,0x17,0x01,0x85,0x29,0x9C, +0x7F,0x5C,0x63,0x00,0xD0,0x64,0x05,0x15,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBE,0xDC, +0x4C,0x63,0x10,0xFF,0x00,0xFC,0xFF,0x8C,0x77,0xC2,0xF4,0x00,0x01,0x0F,0x23,0x02, +0x87,0x29,0xCB,0x17,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x38,0x01,0x53,0x39,0x01, +0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFC,0xFF,0xE4,0x00,0x00,0xD3,0xCB,0x37, +0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01,0x53,0x5A,0x01,0x0F,0x59,0x01,0x0B, +0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x01,0x00,0xE4,0x00,0x00,0x95,0xCB,0x37,0x3D, +0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01,0x53,0x5A,0x01,0x0F,0x59,0x01,0x0B,0x37, +0x01,0x47,0x19,0xC4,0xCB,0x18,0x02,0x00,0xE4,0x00,0x00,0x57,0xCA,0xF7,0x3D,0x3C, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4,0x00,0x00,0x39,0xCB,0x17,0x3C,0x10,0xCA, +0xF7,0x3C,0x14,0x0B,0x38,0x01,0x53,0x39,0x01,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7, +0x18,0xFF,0xFD,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xFB,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0x5C,0x84,0x00, +0x9A,0xE0,0x24,0x64,0x43,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBE,0xF0,0x8C,0x77,0x12, +0xE3,0x00,0xC3,0x14,0x00,0x01,0xCB,0x18,0x78,0x01,0x4E,0xF7,0x10,0x5C,0x80,0x29, +0x46,0xF7,0xC5,0x4B,0x00,0x1A,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C, +0x84,0x04,0xCB,0x17,0x79,0x04,0xCC,0x84,0x17,0x70,0x4F,0x24,0x81,0x5C,0x84,0x04, +0x0F,0x38,0x01,0xCA,0xF7,0x79,0x00,0x0C,0x97,0x01,0x98,0x81,0xE7,0xFF,0xFF,0x5D, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xCC,0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x7A,0x30,0xCB,0x37,0x7A,0x34,0xCB, +0x57,0x7A,0x10,0xCA,0xF7,0x7A,0x14,0x0B,0x18,0x01,0x0B,0x39,0x01,0x0B,0x5A,0x01, +0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63,0x80,0x8E,0xF8,0x8C,0x7A,0x44,0x63,0x1F, +0x44,0x63,0xBC,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x7A,0x70,0xCB,0x37,0x7A, +0x74,0xCB,0x57,0x7A,0x50,0xCA,0xF7,0x7A,0x54,0x0B,0x18,0x01,0x0B,0x39,0x01,0x0B, +0x5A,0x01,0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63,0x80,0x8E,0xF8,0x8C,0x7A,0x44, +0x63,0x1F,0x44,0x63,0xBC,0x85,0x29,0x5C,0x63,0x06,0xC2,0xF4,0x00,0x01,0x47,0x23, +0x1F,0xCA,0xF7,0x7A,0x10,0x0B,0x17,0x01,0x47,0x19,0xC4,0x44,0x63,0xC5,0x5C,0x63, +0x04,0x0C,0x77,0x01,0x85,0x29,0x5C,0x63,0x06,0xC2,0xF4,0x00,0x01,0x47,0x23,0x1F, +0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47,0x19,0xC4,0x44,0x63,0xC5,0x5C,0x63,0x04, +0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x44,0x63,0x1F,0xCA,0xF7,0x7A,0x10, +0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x44, +0x63,0x1F,0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x7A,0x30,0x0C,0x77,0x01,0x85, +0x29,0x9B,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x7A,0x70,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xFF,0x20,0xAA,0x55,0xCB,0x17,0x78,0xC0,0x0F,0x38,0x01,0x5F, +0x03,0x04,0x27,0x08,0x17,0x98,0x63,0xCA,0xF7,0x78,0xC4,0x5C,0x63,0x04,0xCB,0x00, +0x03,0xE8,0x43,0x04,0xC1,0x40,0x63,0xC3,0x4C,0x63,0x81,0x44,0x63,0x1F,0x0C,0x77, +0x01,0x06,0xE0,0x5B,0xCA,0xF7,0x8D,0x80,0x5C,0x97,0x0D,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x3C,0x44,0x0B,0x17,0x01,0x20,0x00,0x2D,0xC7,0x18,0xFF,0xBF,0xE4,0x00,0x00, +0x15,0x5F,0x18,0x04,0x53,0x18,0x40,0x0F,0x17,0x01,0x85,0x29,0xFF,0x00,0xAA,0x55, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0,0x0F,0x17,0x01,0x85,0x29,0xFF,0x00,0x55, +0xAA,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0,0x0F,0x17,0x01,0x85,0x29,0xCA,0xE0, +0x03,0x20,0xC3,0x14,0x00,0x01,0x5C,0x63,0x04,0xC0,0x60,0x63,0xEA,0x48,0x63,0xB8, +0xCA,0xF8,0x79,0x10,0x0B,0x37,0x01,0x53,0x39,0x01,0x0F,0x37,0x01,0xCB,0x58,0x79, +0x00,0xCB,0x38,0x79,0x08,0x9C,0x38,0x0A,0xF9,0x01,0xCB,0x18,0x3C,0x44,0x0B,0x7A, +0x01,0x0B,0x39,0x01,0x0F,0x21,0x07,0x0B,0x18,0x01,0x57,0x18,0x40,0x5F,0x18,0x04, +0x23,0x00,0x40,0x4C,0x63,0x29,0x5C,0x60,0x09,0x48,0x63,0x0A,0xE4,0x00,0x00,0x3F, +0xCC,0x63,0x00,0x06,0x5C,0x63,0x04,0xE4,0x00,0x00,0x29,0x0A,0xF8,0x01,0x52,0xF7, +0x01,0x0E,0xF8,0x01,0x0A,0xF9,0x01,0xE4,0x00,0x00,0x21,0xC3,0x34,0x00,0x01,0xCB, +0x19,0x79,0x10,0xCB,0x39,0x79,0x08,0x0B,0x41,0x07,0x43,0x57,0xD5,0xD4,0x7A,0x00, +0xB8,0x0B,0x41,0x07,0xD7,0x57,0xFE,0xB9,0x0B,0x41,0x07,0x43,0x5B,0xD5,0x8E,0xFA, +0xD4,0x77,0xFE,0x5C,0x9C,0x28,0x85,0x29,0x5C,0x63,0x04,0xE4,0x00,0x00,0x2D,0x42, +0xE4,0x2C,0xC3,0x38,0x00,0x01,0x43,0x05,0xCC,0x8F,0x03,0x13,0x18,0x00,0x1B,0x17, +0x00,0x9C,0xBF,0x20,0xBF,0xB2,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0x20, +0x60,0xCE,0xCA,0xF7,0x2C,0x30,0x0B,0x17,0x01,0xCB,0x18,0x02,0x00,0x0F,0x17,0x01, +0x80,0x01,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3C,0x44,0xCA,0xF7,0x3C,0xA8,0x0B,0x38, +0x01,0xC7,0x39,0xFF,0xF3,0x0F,0x38,0x01,0x0B,0x17,0x01,0x53,0x18,0x01,0xE4,0x00, +0x00,0x9F,0xCB,0x17,0x3C,0xA8,0x0B,0x38,0x01,0x53,0x39,0x01,0xCA,0xF7,0x3C,0x5C, +0x0F,0x38,0x01,0x1F,0x00,0xC0,0x0B,0x37,0x00,0x47,0x39,0xC4,0x9B,0x02,0x24,0x64, +0x25,0x54,0x63,0x3F,0x5F,0x03,0x06,0x47,0x18,0xCD,0x5C,0x78,0x04,0xC3,0x14,0x00, +0x01,0x0C,0x77,0x01,0xCA,0xF8,0x3C,0xA8,0x0B,0x37,0x01,0xC7,0x39,0xFF,0xFE,0x0F, +0x37,0x01,0xCA,0xF8,0x2C,0x30,0x0B,0x17,0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01, +0x85,0x29,0x80,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x1E,0xB0,0x0B,0x17,0x01,0x53, +0x18,0x03,0x0F,0x17,0x01,0x80,0x01,0x9B,0x1F,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0D,0xCA,0xE0,0x48,0x04,0xC3,0x17,0x00,0x0D,0x80,0x01,0xCA,0xE0,0x40,0x00,0xC3, +0x17,0x00,0x0F,0x53,0x18,0x40,0xC3,0x17,0x00,0x0D,0xC3,0x17,0x00,0x0F,0x1F,0x20, +0xBF,0x47,0x18,0xCC,0xC3,0x17,0x00,0x0D,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x3D,0x80,0x0B,0x38,0x01,0xCB,0x39,0x08,0x00,0x0F,0x38,0x01,0xCA,0xF7,0x3D,0x84, +0x0B,0x17,0x01,0xCB,0x18,0x08,0x00,0x0F,0x17,0x01,0x85,0x29,0xE7,0xFF,0xFF,0xBD, +0x56,0xE3,0xFF,0x4E,0xF7,0x08,0x5C,0x84,0x04,0xC4,0x63,0xFF,0x00,0x8C,0x77,0xC2, +0xF4,0x00,0x01,0x4C,0x63,0x08,0x8C,0x77,0x0C,0x83,0x01,0x85,0x29,0x1C,0x21,0xC8, +0xC0,0x98,0x00,0x21,0x0D,0x21,0x34,0x1C,0x61,0x06,0xFC,0x84,0xB6,0x6E,0x50,0xA0, +0x2A,0xE7,0xFF,0x2D,0x1E,0x1E,0xE1,0x06,0x1F,0x41,0x30,0x0B,0x37,0x01,0xFF,0x60, +0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19, +0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47, +0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6, +0xD7,0x57,0xFE,0x5E,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xFC,0x21,0xFF,0x38, +0x50,0xA0,0x3C,0xED,0x21,0x00,0xC4,0xED,0x41,0x00,0xC0,0xED,0x61,0x00,0xBC,0xED, +0x81,0x00,0xB8,0xED,0xA1,0x00,0xB4,0xED,0xC1,0x00,0xB0,0xED,0xE1,0x00,0xAC,0xEE, +0x01,0x00,0xA8,0xC1,0x58,0x00,0x21,0x1C,0x61,0x6C,0xFD,0x4A,0xB6,0x6E,0x1C,0x8A, +0x2A,0xE7,0xFF,0x2C,0x1E,0x50,0xA0,0x24,0x1C,0x8A,0x66,0x1C,0x61,0x48,0xE7,0xFF, +0x2C,0x04,0x98,0x61,0x98,0x82,0xE7,0xFF,0xEE,0x8A,0x98,0x61,0xFC,0x80,0x3E,0x0C, +0xE7,0xFF,0xD5,0xA6,0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE7,0xFF,0xEB,0xDC,0x98,0x61, +0x88,0x83,0xE7,0xFF,0xD8,0x5A,0x98,0x61,0x88,0x83,0xE7,0xFF,0xD5,0xE2,0x98,0x60, +0x98,0x81,0xE7,0xFF,0xD6,0xD2,0x98,0x60,0x05,0x4F,0x0F,0xC9,0x4A,0x0F,0x0F,0x88, +0x8A,0xE7,0xFF,0xE0,0x92,0x98,0x61,0x88,0x8A,0xE7,0xFF,0xE0,0x82,0xC3,0x54,0x00, +0x01,0xCA,0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00,0x57,0x17,0xFF,0x4F,0x18,0x10,0x8F, +0x1A,0x1F,0x61,0x2A,0x0B,0x38,0x01,0x4F,0x17,0x08,0x8F,0x1B,0xEF,0x38,0xDD,0x61, +0x9E,0xE1,0xC2,0xE2,0x2B,0xE4,0x23,0xFF,0x8D,0x1E,0xE1,0x6C,0xFF,0x41,0x00,0xA8, +0xC1,0x94,0x00,0x01,0xFD,0xA0,0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0x6C,0x5F,0x39, +0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x8F,0x0C,0x0F,0x38, +0x01,0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0x1E,0xE1,0x48,0x1F,0x41,0x6C,0x0B,0x37,0x01, +0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37, +0x03,0x8F,0x0C,0x0F,0x38,0x01,0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0xE7,0xFF,0xD1,0xAC, +0x99,0xE0,0x89,0xC3,0x98,0x61,0xE7,0xFF,0xD1,0xC2,0xD1,0xE0,0x05,0xBE,0x98,0x60, +0x1D,0x61,0x0A,0xE7,0xFF,0xD1,0xFC,0x99,0x40,0xE4,0x00,0x01,0x45,0x98,0x61,0x88, +0x8A,0x22,0x01,0x0A,0xE7,0xFF,0xDD,0x94,0x98,0x60,0xE7,0xFF,0xDD,0xDE,0xFC,0x60, +0x01,0x00,0xE7,0xFF,0xF7,0x86,0xE7,0xFF,0xCF,0xC8,0xE7,0xFF,0xF6,0x32,0xC4,0x63, +0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0xDC,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0xF7,0xA0,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE8,0x04,0xE4, +0x00,0x00,0x8B,0xE7,0xFF,0xDD,0x16,0x98,0x61,0xE7,0xFF,0xDD,0x60,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0xF7,0x08,0xE7,0xFF,0xCF,0x4A,0xE7,0xFF,0xF5,0xB4,0xC4,0x63,0x01, +0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x5E,0xFC,0x60,0x01,0x00, +0xE7,0xFF,0xF7,0x22,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE7,0x86,0x0A,0xEB, +0x01,0x40,0x63,0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2,0x02,0xFB,0x8E, +0x9D,0x41,0x9D,0x62,0x5D,0x4A,0x00,0xD1,0x44,0x05,0xEA,0x9A,0x00,0xE7,0xFF,0xFE, +0xC1,0x98,0x61,0x1D,0x61,0x12,0xE7,0xFF,0xD0,0x96,0x99,0x40,0xE4,0x00,0x01,0x45, +0x98,0x61,0x88,0x8A,0x22,0x01,0x0A,0xE7,0xFF,0xDC,0x2E,0x98,0x60,0xE7,0xFF,0xDC, +0x78,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x20,0xE7,0xFF,0xCE,0x62,0xE7,0xFF,0xF4, +0xCC,0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF5,0x76, +0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x3A,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF, +0xE6,0x9E,0xE4,0x00,0x00,0x8B,0xE7,0xFF,0xDB,0xB0,0x98,0x61,0xE7,0xFF,0xDB,0xFA, +0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF5,0xA2,0xE7,0xFF,0xCD,0xE4,0xE7,0xFF,0xF4,0x4E, +0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF4,0xF8,0xFC, +0x60,0x01,0x00,0xE7,0xFF,0xF5,0xBC,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE6, +0x20,0x0A,0xEB,0x01,0x40,0x63,0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2, +0x02,0xFB,0x8E,0x9D,0x41,0x9D,0x62,0x5D,0x4A,0x00,0xD1,0x44,0x00,0x52,0x9A,0x00, +0xE7,0xFF,0xFE,0xC1,0x9D,0xE1,0x5D,0xEF,0x00,0xD1,0xE2,0xF4,0x8E,0x0B,0x21,0x0A, +0x0B,0x01,0x12,0x0F,0x21,0x07,0x1E,0xE1,0x0C,0x1F,0x81,0x12,0x0B,0x77,0x01,0x8B, +0x59,0x5F,0xBB,0x06,0xD7,0x3D,0x00,0x30,0x8B,0x5B,0x5F,0x3A,0x06,0x0B,0x77,0x09, +0x8B,0x58,0x5F,0xBB,0x06,0xD7,0x1D,0x00,0x30,0x8B,0x5B,0x5F,0x1A,0x06,0x9E,0xE2, +0xD7,0x97,0xFE,0xE6,0x0F,0x21,0x07,0x9A,0xE0,0x0F,0x01,0x09,0x1F,0x21,0x1A,0x8B, +0x57,0xFD,0x00,0x3F,0xFF,0xE4,0x00,0x00,0x69,0x43,0x7E,0xC4,0x0B,0x9B,0x00,0x43, +0x79,0xC4,0x23,0x80,0x32,0x0D,0x1B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x23,0x09,0x5D, +0x00,0xCD,0x4A,0x1F,0xFF,0x43,0x8A,0xE0,0x0F,0x9B,0x01,0x9F,0x02,0xD3,0x08,0xFE, +0xE6,0x9F,0x28,0x9E,0xE2,0xD2,0xE4,0x00,0xBA,0x1F,0x01,0x0A,0x4F,0xD7,0x10,0x1F, +0xA1,0x06,0x8F,0xD8,0x8F,0xB7,0x9B,0x00,0xE7,0xFF,0xFF,0x83,0xC3,0x94,0x00,0x01, +0x9A,0xE0,0xCB,0x9C,0x24,0x00,0xE4,0x00,0x00,0x47,0x43,0xB9,0xC4,0x43,0xDB,0xC4, +0x57,0xBD,0xFF,0x0B,0xDE,0x01,0x4F,0xBD,0x10,0x8F,0xBC,0x0F,0xDD,0x01,0x9F,0x02, +0xD3,0x08,0xFF,0x56,0x9E,0xE1,0x22,0xE8,0x54,0x1F,0x21,0x1A,0x4F,0x77,0x18,0x9B, +0x00,0x8F,0x79,0xFF,0x37,0x12,0x46,0xE7,0xFF,0xFF,0xA7,0x9A,0xE0,0x4F,0x17,0x08, +0x1F,0x61,0x6C,0x8F,0x1B,0x0B,0x38,0x01,0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39, +0x10,0x4F,0x18,0x08,0x8F,0x19,0x1F,0x21,0x2A,0x8F,0x0C,0x8F,0x37,0x0B,0x39,0x01, +0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE3,0xC9,0x23,0xFF,0x55,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x25,0x38,0x0B,0x17,0x01,0x23,0x40,0x34,0x5F,0x18,0x04,0x53,0x18,0x0F,0xE4, +0x00,0x00,0x11,0xC7,0x18,0xFF,0xF0,0x0F,0x17,0x01,0x98,0x60,0x98,0x80,0xE7,0xFF, +0xDA,0x38,0x98,0x80,0x98,0x61,0xE7,0xFF,0xDA,0x28,0x98,0x60,0xE7,0xFF,0xD8,0xDA, +0x98,0x60,0x98,0x80,0xE7,0xFF,0xD8,0x74,0x88,0x6E,0xEE,0x01,0x00,0xAA,0xED,0xE1, +0x00,0xAE,0xED,0xC1,0x00,0xB2,0xED,0xA1,0x00,0xB6,0xED,0x81,0x00,0xBA,0xED,0x61, +0x00,0xBE,0xED,0x41,0x00,0xC2,0xED,0x21,0x00,0xC6,0xFC,0x21,0x00,0xC8,0xE7,0xFF, +0xCC,0x13,0xC2,0xF4,0x00,0x01,0x53,0x20,0x1F,0xCB,0x17,0x3C,0x30,0x0F,0x38,0x01, +0xCC,0x63,0x61,0xA8,0xCB,0x17,0x3C,0x90,0xCA,0xF7,0x3C,0x38,0x0B,0x18,0x01,0x43, +0x03,0xC1,0x4F,0x18,0x29,0x9F,0x1F,0x5F,0x18,0x04,0x0F,0x17,0x01,0x85,0x29,0xC2, +0xF4,0x00,0x01,0x54,0x63,0x62,0xCA,0xF7,0x3C,0x94,0x50,0x63,0x02,0x0B,0x17,0x01, +0x1F,0x20,0x9D,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63, +0x04,0xC6,0xE3,0x02,0x00,0x5E,0xF7,0x04,0x22,0xE0,0x70,0xC2,0xF4,0x00,0x01,0xFF, +0x20,0xFC,0xFF,0xCA,0xF7,0x2C,0x54,0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x01, +0x00,0x0F,0x17,0x01,0xC6,0xE3,0x04,0x00,0x5E,0xF7,0x04,0x22,0xE0,0xB8,0xC2,0xF4, +0x00,0x01,0xFF,0x00,0xA5,0x5A,0xCB,0x37,0x30,0xCC,0x0F,0x19,0x01,0xCB,0x37,0x30, +0xD0,0x0F,0x19,0x01,0xCA,0xF7,0x31,0x04,0xFF,0x40,0x8F,0xFF,0x0B,0x17,0x01,0x47, +0x18,0xD4,0xCB,0x18,0x30,0x00,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3C, +0x98,0x0B,0x38,0x01,0xFF,0x20,0x01,0x01,0x0F,0x38,0x01,0xCB,0x17,0x3C,0xA0,0x0B, +0x58,0x01,0x0F,0x38,0x01,0x1F,0x40,0x88,0xCB,0x17,0x3C,0xB4,0x0B,0x38,0x01,0x47, +0x39,0xD4,0x53,0x39,0x33,0x0F,0x38,0x01,0xCB,0x17,0x3C,0xB0,0x0B,0x38,0x01,0x5F, +0x39,0x00,0xCB,0x39,0x03,0x00,0x0F,0x38,0x01,0xCA,0xF7,0x3C,0x94,0xC4,0x63,0x07, +0x00,0x0B,0x17,0x01,0xFF,0x20,0xF8,0xFF,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77, +0x01,0x85,0x29,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC8,0x80, +0xAA,0x55,0xC0,0x74,0x00,0x01,0xC8,0x63,0x78,0xC0,0x0C,0x83,0x00,0xC0,0x74,0x00, +0x01,0xC8,0x63,0x1F,0xDC,0x50,0x80,0x80,0x0C,0x83,0x00,0x04,0x20,0x80,0xC8,0x21, +0x17,0xFC,0x1C,0x40,0xFD,0x44,0x21,0x14,0x28,0x00,0x74,0xC0,0x40,0x00,0x01,0xC8, +0x42,0x3E,0x06,0x84,0x49,0x0C,0x41,0x0C,0x0C,0x61,0x10,0x0C,0x81,0x14,0x0C,0xA1, +0x18,0x0C,0xC1,0x1C,0x0C,0xE1,0x20,0x0D,0x01,0x24,0x0D,0x21,0x28,0x0D,0x41,0x2C, +0x0D,0x61,0x30,0x0D,0x81,0x34,0x0D,0xA1,0x38,0x0D,0xC1,0x3C,0x0D,0xE1,0x40,0x0E, +0x01,0x44,0x0E,0x21,0x48,0x0E,0x41,0x4C,0x0E,0x61,0x50,0x0E,0x81,0x54,0x0E,0xA1, +0x58,0x0E,0xC1,0x5C,0x0E,0xE1,0x60,0x0F,0x01,0x64,0x0F,0x21,0x68,0x0F,0x41,0x6C, +0x0F,0x61,0x70,0x0F,0x81,0x74,0x0F,0xA1,0x78,0x0F,0xC1,0x7C,0x1C,0x61,0x00,0xC1, +0x00,0x00,0x01,0xC9,0x08,0xAD,0x50,0x85,0x08,0x90,0x23,0x00,0xC0,0x40,0x10,0x01, +0xC8,0x42,0x03,0xB0,0xC0,0x60,0x10,0x01,0xC8,0x63,0x0D,0x04,0x5C,0x43,0x1F,0x20, +0x00,0x2D,0x0C,0x02,0x00,0x1C,0x42,0x04,0x93,0xF4,0x85,0x29,0xC0,0x80,0x01,0x1F, +0xC0,0x7F,0xFF,0xE1,0xC8,0x63,0xFF,0xF9,0x44,0x84,0x1C,0xC0,0x80,0x01,0x1D,0x0C, +0x61,0x02,0xC0,0x60,0x02,0x0D,0x0C,0x61,0x06,0xC0,0x60,0x04,0x0D,0x0C,0x41,0x0E, +0x0C,0x61,0x12,0x0C,0x81,0x16,0x0C,0xA1,0x1A,0x0C,0xC1,0x1E,0x0C,0xE1,0x22,0x0D, +0x01,0x26,0x0D,0x21,0x2A,0x0D,0x41,0x2E,0x0D,0x61,0x32,0x0D,0x81,0x36,0x0D,0xA1, +0x3A,0x0D,0xC1,0x3E,0x0D,0xE1,0x42,0x0E,0x01,0x46,0x0E,0x21,0x4A,0x0E,0x41,0x4E, +0x0E,0x61,0x52,0x0E,0x81,0x56,0x0E,0xA1,0x5A,0x0E,0xC1,0x5E,0x0E,0xE1,0x62,0x0F, +0x01,0x66,0x0F,0x21,0x6A,0x0F,0x41,0x6E,0x0F,0x61,0x72,0x0F,0x81,0x76,0x0F,0xA1, +0x7A,0x0F,0xC1,0x7E,0xEF,0xE1,0x00,0x82,0x0C,0x21,0x0A,0x84,0x00,0x00,0x00,0x00, +0x9C,0x30,0xCA,0xE0,0x48,0x02,0x0D,0x41,0x08,0x0D,0x21,0x0C,0x89,0x43,0xC2,0xF7, +0x00,0x0F,0x9B,0x1C,0x46,0xF7,0xC4,0x0E,0xE1,0x04,0x0E,0xE1,0x06,0x56,0xF7,0x04, +0x22,0xE0,0xE0,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00,0x0F,0x9B,0x1B,0x47,0x39,0xC4, +0xC3,0x37,0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3, +0x17,0x00,0x0D,0x98,0x82,0xE7,0xFF,0xBE,0x8C,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D,0x0E,0xE1,0x06,0x56,0xF7,0x08,0x22,0xE0, +0xE8,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00,0x0F,0x9B,0x17,0x47,0x39,0xC4,0xC3,0x37, +0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3,0x17,0x00, +0x0D,0x98,0x83,0x88,0x6A,0xE7,0xFF,0xBE,0x0C,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0F,0x53,0x18,0x08,0xC3,0x17,0x00,0x0D,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21, +0x10,0x85,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0x00,0xA0,0x26,0x01, +0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xA0,0x66,0x00, +0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x00,0x2F,0x00,0x07,0x00,0x0D,0x01, +0xE0,0xFF,0x5C,0x00,0x00,0x00,0x00,0x00,0x1B,0x00,0x1B,0x00,0x01,0x00,0x10,0x00, +0xDF,0x00,0x9E,0x00,0x5B,0x00,0x5B,0x00,0x1A,0x00,0x32,0x00,0x90,0x01,0x80,0x00, +0x94,0x01,0x80,0x00,0x19,0x00,0x32,0x00,0x98,0xB9,0x00,0xC0,0x02,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0xF5,0xB9,0x00,0xC0,0x02,0x02,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0xD7,0xB9,0x00,0xC0,0x02,0x03,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0xCD,0xB9,0x00,0xC0,0x02,0x04,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0x08,0xBA,0x00,0xC0,0x0B,0x05,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x64,0x2C,0x9A,0xB9,0x00,0xC0,0x0D,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0xA7,0xB9,0x00,0xC0,0x0B,0x07,0x00,0x00, +0x01,0x00,0x00,0x00,0x28,0x14,0x28,0x14,0xE7,0xB9,0x00,0xC0,0x0E,0x08,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x37,0x19,0xD9,0xB9,0x00,0xC0,0x06,0x09,0x00,0x00, +0x01,0x00,0x00,0x00,0x1E,0x14,0x30,0x1E,0x13,0xBA,0x00,0xC0,0x0E,0x0A,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1C,0x3C,0x22,0x27,0xBA,0x00,0xC0,0x0F,0x0B,0x00,0x00, +0x01,0x00,0x00,0x00,0x46,0x19,0x28,0x14,0x6A,0xB9,0x00,0xC0,0x06,0x0C,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x28,0x14,0x82,0xB9,0x00,0xC0,0x0E,0x0A,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1C,0x3C,0x22,0xCF,0xB9,0x00,0xC0,0x08,0x05,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x78,0x2C,0xFD,0xB9,0x00,0xC0,0x0B,0x05,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x78,0x2C,0xDF,0xB9,0x00,0xC0,0x08,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0xB2,0xB9,0x00,0xC0,0x0C,0x08,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x37,0x19,0xF7,0xB9,0x00,0xC0,0x06,0x07,0x00,0x00, +0x01,0x00,0x00,0x00,0x28,0x14,0x28,0x14,0xC6,0xB9,0x00,0xC0,0x07,0x07,0x00,0x00, +0x01,0x00,0x00,0x00,0x28,0x14,0x28,0x14,0x90,0xB9,0x00,0xC0,0x08,0x0B,0x00,0x00, +0x01,0x00,0x00,0x00,0x46,0x19,0x28,0x14,0x21,0xBA,0x00,0xC0,0x06,0x09,0x00,0x00, +0x01,0x00,0x00,0x00,0x1E,0x14,0x30,0x1E,0xBE,0xB9,0x00,0xC0,0x08,0x0C,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x28,0x14,0x36,0xBA,0x00,0xC0,0x09,0x09,0x00,0x00, +0x01,0x00,0x00,0x00,0x1E,0x14,0x30,0x1E,0x70,0xB9,0x00,0xC0,0x0A,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0x7A,0xB9,0x00,0xC0,0x08,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0x92,0x01,0x80,0x00,0x86,0x01,0x80,0x00, +0x01,0x00,0x00,0x00,0x64,0x00,0x14,0x00,0x14,0x00,0x06,0x00,0x06,0x00,0x5A,0x00, +0x14,0x00,0x14,0x00,0x06,0x00,0x06,0x00,0x64,0x00,0x01,0x00,0x5F,0x00,0x01,0x00, +0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x50,0x00,0x96,0x00,0x40,0x06,0x00,0x00,0x80,0x0C,0x00,0x00,0x01,0x03,0x07,0x00, +0x00,0x01,0x02,0x00,0x07,0x00,0xC8,0x00,0xC8,0x00,0xC8,0x00,0xF4,0x01,0xF4,0x01, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x03,0x04,0x05,0x02,0x00,0x04,0x00,0x06,0x00, +0x08,0x00,0x0A,0x00,0x0C,0x00,0x10,0x00,0x14,0x00,0x18,0x00,0x20,0x00,0x28,0x00, +0x32,0x00,0x3E,0x00,0x40,0x00,0x64,0x00,0x80,0x00,0x00,0x01,0x02,0x00,0x00,0x11, +0xFF,0xFF,0xFF,0xFF,0x01,0x11,0xFF,0xFF,0x18,0x50,0x02,0x11,0xFF,0x7F,0xFF,0x0E, +0x03,0x11,0xFF,0x00,0x66,0x00,0x04,0x11,0xFF,0x0F,0x72,0x07,0x05,0x11,0xFF,0x0F, +0x72,0x07,0x06,0x11,0xFF,0x00,0x00,0x00,0x07,0x11,0x03,0x00,0x00,0x00,0x08,0x11, +0x73,0x00,0x00,0x00,0x09,0x11,0xFF,0xFF,0x00,0x00,0x09,0x11,0xFF,0x7F,0x00,0x00, +0x0A,0x11,0xFF,0x7F,0x87,0x10,0x0E,0x11,0xFF,0xFF,0x00,0x00,0x0F,0x11,0xFF,0xFF, +0x00,0x00,0x17,0x11,0x0F,0xFF,0x00,0x00,0x18,0x11,0xFF,0xFF,0x00,0x02,0x19,0x11, +0xFF,0x00,0x0E,0x00,0x1E,0x11,0xFF,0xFF,0x00,0x00,0x1F,0x11,0xFF,0x00,0x00,0x00, +0x33,0x11,0x0F,0x00,0x00,0x00,0x3A,0x11,0x37,0x0F,0x00,0x00,0x3B,0x11,0x77,0x00, +0x77,0x00,0x3C,0x11,0x00,0xFF,0x00,0xA0,0x3D,0x11,0x77,0x00,0x00,0x00,0x3E,0x11, +0xFF,0x00,0x00,0x00,0x04,0x12,0x06,0x00,0x00,0x00,0x05,0x12,0xFF,0x00,0x00,0x00, +0x07,0x12,0xFF,0xFF,0x00,0x00,0x08,0x12,0xFF,0x00,0x00,0x00,0x09,0x12,0xFF,0xFF, +0x00,0x00,0x0A,0x12,0xFF,0x00,0x00,0x00,0x0B,0x12,0x3F,0x00,0x2E,0x00,0x0D,0x12, +0x1F,0x00,0x05,0x00,0x0E,0x12,0x1F,0x00,0x05,0x00,0x0F,0x12,0xFF,0xFF,0x00,0x00, +0x10,0x12,0xFF,0x00,0x00,0x00,0x11,0x12,0xFF,0x0F,0x00,0x00,0x12,0x12,0x87,0x1F, +0x00,0x00,0x13,0x12,0x7F,0x0F,0x14,0x00,0x14,0x12,0x9F,0xFF,0x0A,0x09,0x15,0x12, +0x7F,0x0F,0x0C,0x0F,0x16,0x12,0xFF,0x0F,0x00,0x07,0x17,0x12,0x1F,0xFF,0x0A,0x5C, +0x18,0x12,0x7F,0x1F,0x14,0x0A,0x19,0x12,0xFF,0xFF,0x8C,0x21,0x1A,0x12,0xFF,0x03, +0x00,0x00,0x1B,0x12,0xFF,0x03,0x00,0x00,0x1C,0x12,0xFF,0x03,0x00,0x00,0x1D,0x12, +0xFF,0x03,0x00,0x00,0x1E,0x12,0x1F,0x1F,0x12,0x07,0x1F,0x12,0x3F,0x3F,0x00,0x00, +0x20,0x12,0xFF,0xFF,0x00,0x00,0x21,0x12,0xFF,0x00,0x00,0x00,0x23,0x12,0x3F,0x3F, +0x02,0x00,0x24,0x12,0x3F,0x00,0x00,0x00,0x28,0x12,0xFF,0xFF,0x83,0x81,0x2D,0x12, +0x01,0x00,0x01,0x00,0x50,0x12,0xFF,0xFF,0x00,0x00,0x51,0x12,0xFF,0x00,0x00,0x00, +0x70,0x12,0x03,0x00,0x03,0x00,0x01,0x11,0x06,0x00,0x02,0x00,0x02,0x11,0x00,0x08, +0x00,0x08,0x2A,0x12,0x00,0xFF,0x00,0xBA,0x2B,0x12,0xFF,0x30,0xF0,0x20,0x01,0x11, +0x06,0x00,0x00,0x00,0x2A,0x12,0x00,0xFF,0x00,0x00,0x2B,0x12,0xFF,0x30,0x00,0x00, +0x01,0x11,0x00,0x50,0x00,0x50,0x02,0x11,0x3F,0x06,0x2F,0x06,0x01,0x11,0x00,0x50, +0x00,0x00,0x02,0x11,0x3F,0x06,0x00,0x00,0x2A,0x12,0x00,0x30,0x00,0x20,0x11,0x1E, +0xFF,0x7F,0x00,0x00,0x12,0x1E,0xFF,0x00,0x00,0x00,0x13,0x1E,0x0F,0x00,0x00,0x00, +0x15,0x1E,0x73,0x07,0x00,0x00,0x16,0x1E,0x0F,0x00,0x00,0x00,0x18,0x1E,0x3F,0x00, +0x08,0x00,0x2A,0x1E,0x05,0x00,0x01,0x00,0x50,0x11,0x11,0x11,0x51,0x11,0x11,0x11, +0x52,0x11,0x11,0x11,0x53,0x11,0x11,0x11,0x54,0x11,0x11,0x11,0x55,0x11,0x11,0x11, +0x56,0x11,0x11,0x11,0x57,0x11,0x11,0x11,0x58,0x11,0x11,0x11,0x59,0x11,0x11,0x11, +0x5A,0x11,0x11,0x11,0x5B,0x11,0x11,0x11,0x5C,0x11,0xFF,0xFF,0x5D,0x11,0xFF,0xFF, +0x5E,0x11,0xFF,0xFF,0x46,0x12,0x00,0x00,0x47,0x12,0x00,0x00,0x48,0x12,0x00,0x00, +0x49,0x12,0x00,0x00,0x4A,0x12,0x00,0x00,0x4B,0x12,0x00,0x00,0x4C,0x12,0x00,0x00, +0x4D,0x12,0x00,0x00,0x4E,0x12,0x0F,0x00,0x02,0x03,0x5C,0x54,0x47,0x37,0x00,0x00, +0x31,0x00,0x94,0x00,0xFA,0x00,0x66,0x01,0xD9,0x01,0x57,0x02,0xE6,0x02,0x8A,0x03, +0x4F,0x04,0x44,0x05,0x84,0x06,0x42,0x08,0xEB,0x0A,0x98,0x0F,0x55,0x1A,0xF3,0x07, +0xFF,0xFF,0x0F,0x00,0x52,0x00,0x69,0x00,0xD9,0x00,0x00,0x00,0x3B,0x40,0x00,0x00, +0xDB,0x40,0x00,0x00,0xFA,0x40,0x00,0x00,0xCD,0x41,0x00,0x00,0xE4,0x41,0x00,0x00, +0x95,0x00,0x89,0x00,0x7E,0x00,0x72,0x00,0x67,0x00,0x5B,0x00,0x50,0x00,0x44,0x00, +0x39,0x00,0x2D,0x00,0x22,0x00,0x16,0x00,0x0B,0x00,0x00,0x00,0xFF,0x00,0x8D,0x09, +0x1A,0x00,0xFE,0x00,0x1B,0x07,0x3F,0x00,0xFE,0x00,0x9D,0x0A,0x78,0x00,0xFD,0x00, +0xEC,0x12,0xA8,0x00,0xFC,0x00,0x6B,0x18,0xD0,0x00,0xFB,0x00,0x7C,0x19,0x0A,0x01, +0xF9,0x00,0x55,0x20,0x4E,0x01,0xF8,0x00,0x85,0x26,0x86,0x01,0xFF,0x00,0x48,0x0D, +0x09,0x00,0xFE,0x00,0x9E,0x0B,0x1E,0x00,0xFE,0x00,0x34,0x0E,0x44,0x00,0xFD,0x00, +0x35,0x14,0x66,0x00,0xFD,0x00,0x1A,0x18,0x7F,0x00,0xFC,0x00,0x11,0x19,0x9C,0x00, +0xFB,0x00,0x3C,0x1C,0xBF,0x00,0xFB,0x00,0x94,0x21,0xDB,0x00,0xFA,0x00,0xE6,0x24, +0xF7,0x00,0xF9,0x00,0xFB,0x24,0x29,0x01,0xFE,0x00,0xE0,0x0D,0x04,0x00,0xFE,0x00, +0xF6,0x10,0x18,0x00,0xFE,0x00,0xC8,0x12,0x30,0x00,0xFD,0x00,0xEB,0x14,0x4A,0x00, +0xFD,0x00,0x74,0x16,0x69,0x00,0xFC,0x00,0xB9,0x1C,0x7E,0x00,0xFC,0x00,0x68,0x20, +0x8E,0x00,0xFB,0x00,0xCE,0x21,0xA6,0x00,0xFB,0x00,0x52,0x23,0xC8,0x00,0xFA,0x00, +0x0A,0x29,0xE2,0x00,0xF9,0x00,0x4D,0x2C,0xFC,0x00,0xFE,0x00,0x85,0x13,0xF8,0xFF, +0xFE,0x00,0xF6,0x12,0x07,0x00,0xFD,0x00,0xC9,0x13,0x24,0x00,0xFD,0x00,0x6E,0x18, +0x3E,0x00,0xFC,0x00,0x47,0x1C,0x4E,0x00,0xFC,0x00,0x83,0x1D,0x5E,0x00,0xFC,0x00, +0xFB,0x1F,0x74,0x00,0xFB,0x00,0xF7,0x25,0x86,0x00,0xFA,0x00,0xB8,0x29,0x93,0x00, +0xFA,0x00,0xA4,0x29,0xAB,0x00,0xF9,0x00,0x13,0x2B,0xCB,0x00,0xF9,0x00,0x37,0x30, +0xE5,0x00,0xFD,0x00,0x0D,0x1F,0xDC,0xFF,0xFD,0x00,0x3D,0x1E,0xE7,0xFF,0xFD,0x00, +0xD0,0x1C,0x02,0x00,0xFC,0x00,0xCD,0x1E,0x1B,0x00,0xFC,0x00,0x4B,0x22,0x29,0x00, +0xFC,0x00,0x4F,0x25,0x33,0x00,0xFB,0x00,0x83,0x27,0x43,0x00,0xFA,0x00,0xE6,0x2C, +0x4F,0x00,0xFA,0x00,0x48,0x30,0x57,0x00,0xFA,0x00,0x0E,0x31,0x62,0x00,0xF9,0x00, +0x76,0x31,0x77,0x00,0xF9,0x00,0x65,0x36,0x87,0x00,0xF8,0x00,0xB3,0x38,0x94,0x00, +0xF8,0x00,0x27,0x37,0xAC,0x00,0x05,0x03,0x03,0x04,0x04,0x00,0x11,0x00,0xC1,0x09, +0xD9,0xFF,0x36,0x01,0x0E,0x00,0x1C,0x00,0xDD,0x03,0x03,0x00,0x40,0x00,0x14,0x00, +0x4C,0x00,0x95,0x03,0x05,0x00,0x07,0x00,0x18,0x00,0xA5,0x00,0x4B,0x06,0x9B,0xFF, +0x03,0x00,0x19,0x00,0xC8,0x00,0x14,0x03,0x3B,0x00,0x00,0x00,0x1A,0x00,0x16,0x00, +0x40,0x05,0xE4,0xFF,0xA2,0x00,0x14,0x00,0x3B,0x00,0x67,0x04,0xF0,0xFF,0x3B,0x00, +0x1A,0x00,0x6F,0x00,0x22,0x04,0xF8,0xFF,0x03,0x00,0x20,0x00,0x1C,0x00,0x48,0x05, +0xDB,0xFF,0x98,0x00,0x16,0x00,0x57,0x00,0x90,0x04,0xEC,0xFF,0x19,0x00,0x21,0x00, +0x95,0x00,0x08,0x04,0xFE,0xFF,0x02,0x00,0x24,0x00,0x23,0x00,0xC4,0x05,0xCC,0xFF, +0xA6,0x00,0x17,0x00,0x62,0x00,0x9C,0x04,0xEC,0xFF,0x17,0x00,0x25,0x00,0xA0,0x00, +0x0E,0x04,0xFB,0xFF,0x02,0x00,0x28,0x00,0x0D,0x01,0x7D,0x04,0xE1,0xFF,0xFC,0xFF, +0x2A,0x00,0x33,0x00,0x30,0x07,0xA2,0xFF,0xD3,0x00,0x18,0x00,0x6F,0x00,0xAD,0x04, +0xED,0xFF,0x23,0x00,0x2B,0x00,0x9C,0x00,0x14,0x03,0x27,0x00,0x03,0x00,0x2F,0x00, +0xE1,0x00,0x53,0x05,0xAB,0xFF,0x02,0x00,0x30,0x00,0x00,0x00,0x13,0x1A,0x05,0x00, +0x30,0x34,0x38,0x0C,0x10,0x34,0x30,0x0E,0x30,0x0A,0x35,0x02,0x09,0x10,0x35,0x10, +0x0A,0x34,0x1E,0x18,0x14,0x0E,0x0B,0x07,0x01,0x3C,0x37,0x34,0x30,0x2A,0x26,0x23, +0x1C,0x17,0x0E,0x05,0x03,0x10,0x19,0x1B,0x2F,0x2F,0x10,0x0E,0x0A,0x05,0x00,0x39, +0x33,0x30,0x10,0x0B,0x04,0x35,0x30,0x28,0x22,0x1E,0x19,0x13,0x10,0x0B,0x07,0x02, +0x3D,0x39,0x00,0x3C,0x38,0x34,0x2E,0x23,0x1D,0x16,0x10,0x0B,0x05,0x01,0x3F,0x00, +0x0A,0x17,0x1A,0x10,0x02,0x3F,0x21,0x1D,0x19,0x14,0x0E,0x04,0x01,0x00,0x00,0x32, +0x33,0x05,0x0D,0x3D,0x35,0x09,0x10,0x1F,0x1F,0x0D,0x0D,0x0D,0x0D,0x35,0x35,0x0E, +0x0D,0x36,0x32,0x09,0x0D,0x37,0x33,0x00,0x3C,0x36,0x2A,0x23,0x1E,0x1A,0x15,0x10, +0x0B,0x08,0x03,0x3C,0x39,0x0F,0x0F,0x1D,0x18,0x12,0x0A,0x04,0x01,0x10,0x10,0x32, +0x3E,0x0D,0x10,0x33,0x38,0x01,0x0D,0x10,0x30,0x34,0x00,0x0D,0x10,0x32,0x34,0x3A, +0x07,0x0D,0x10,0x01,0x05,0x0B,0x0E,0x13,0x1A,0x1F,0x25,0x29,0x2E,0x34,0x36,0x3B, +0x00,0x10,0x0E,0x07,0x3C,0x33,0x30,0x28,0x22,0x1D,0x19,0x14,0x10,0x0A,0x05,0x0B, +0x13,0x1A,0x1D,0x22,0x26,0x2B,0x3D,0x02,0x10,0x09,0x3D,0x34,0x30,0x0B,0x04,0x00, +0xB7,0x60,0x00,0x00,0xB7,0x60,0x00,0x00,0xCC,0x60,0x00,0x00,0xCC,0x60,0x00,0x00, +0x2B,0x62,0x00,0x00,0x2B,0x62,0x00,0x00,0x2B,0x62,0x00,0x00,0x55,0x61,0x00,0x00, +0x2B,0x62,0x00,0x00,0xB2,0x61,0x00,0x00,0x06,0x64,0x00,0x00,0x06,0x64,0x00,0x00, +0x2F,0x64,0x00,0x00,0xFC,0x63,0x00,0x00,0x58,0x64,0x00,0x00,0x88,0x64,0x00,0x00, +0x70,0x64,0x00,0x00,0x61,0x67,0x00,0x00,0x85,0x67,0x00,0x00,0x95,0x67,0x00,0x00, +0xD0,0x67,0x00,0x00,0xCA,0x67,0x00,0x00,0xCA,0x67,0x00,0x00,0xD0,0x67,0x00,0x00, +0xCA,0x67,0x00,0x00,0x0A,0x0B,0x2C,0x1B,0x09,0x07,0x1C,0x1A,0x25,0x05,0x1D,0x19, +0x26,0x00,0x1E,0x18,0x27,0x04,0x1F,0x17,0x28,0x06,0x20,0x0D,0x29,0x08,0x2B,0x0C, +0x2A,0x00,0x00,0x00,0x57,0x75,0x00,0x00,0x57,0x75,0x00,0x00,0x88,0x75,0x00,0x00, +0x88,0x75,0x00,0x00,0xBA,0x75,0x00,0x00,0xBA,0x75,0x00,0x00,0xBA,0x75,0x00,0x00, +0xBA,0x75,0x00,0x00,0x39,0x75,0x00,0x00,0x1B,0x75,0x00,0x00,0x1B,0x76,0x00,0x00, +0x1B,0x76,0x00,0x00,0x4E,0x76,0x00,0x00,0x4E,0x76,0x00,0x00,0x83,0x76,0x00,0x00, +0x83,0x76,0x00,0x00,0x83,0x76,0x00,0x00,0x83,0x76,0x00,0x00,0xF4,0x75,0x00,0x00, +0xE2,0x75,0x00,0x00,0x72,0x77,0x00,0x00,0x72,0x77,0x00,0x00,0xC6,0x77,0x00,0x00, +0xC6,0x77,0x00,0x00,0xA8,0x78,0x00,0x00,0xA8,0x78,0x00,0x00,0xA8,0x78,0x00,0x00, +0xA8,0x78,0x00,0x00,0x20,0x78,0x00,0x00,0x66,0x78,0x00,0x00,0xE2,0x89,0x00,0x00, +0xE9,0x89,0x00,0x00,0xF0,0x89,0x00,0x00,0xF7,0x89,0x00,0x00,0xFE,0x89,0x00,0x00, +0x05,0x8A,0x00,0x00,0x0C,0x8A,0x00,0x00,0x13,0x8A,0x00,0x00,0x1A,0x8A,0x00,0x00, +0x21,0x8A,0x00,0x00,0x28,0x8A,0x00,0x00,0x2F,0x8A,0x00,0x00,0x44,0x8B,0x00,0x00, +0x44,0x8B,0x00,0x00,0x7F,0x8B,0x00,0x00,0x7F,0x8B,0x00,0x00,0x0E,0x8C,0x00,0x00, +0x0E,0x8C,0x00,0x00,0x0E,0x8C,0x00,0x00,0x0E,0x8C,0x00,0x00,0xBC,0x8B,0x00,0x00, +0xE1,0x8B,0x00,0x00,0x00,0x01,0x00,0x00,0x3F,0x8E,0x00,0x00,0x64,0x8E,0x00,0x00, +0xBC,0x8E,0x00,0x00,0xDD,0x8F,0x00,0x00,0x18,0x8F,0x00,0x00,0x48,0x8F,0x00,0x00, +0xDD,0x8F,0x00,0x00,0x50,0x8F,0x00,0x00,0x04,0x00,0x1D,0x00,0x2E,0x00,0x50,0x00, +0x82,0x00,0xC7,0x00,0x23,0x01,0x9B,0x01,0x32,0x02,0xEE,0x02,0xD0,0x03,0xDE,0x04, +0x19,0x06,0x82,0x07,0x1A,0x09,0xE0,0x0A,0xD0,0x0C,0xE7,0x0E,0x1F,0x11,0x71,0x13, +0xD3,0x15,0x3D,0x18,0xA2,0x1A,0xF9,0x1C,0x34,0x1F,0x47,0x21,0x28,0x23,0xCB,0x24, +0x27,0x26,0x33,0x27,0xEA,0x27,0x46,0x28,0x04,0x00,0x1C,0x00,0x2B,0x00,0x4B,0x00, +0x78,0x00,0xB7,0x00,0x0A,0x01,0x75,0x01,0xFC,0x01,0xA3,0x02,0x6D,0x03,0x5E,0x04, +0x76,0x05,0xB9,0x06,0x26,0x08,0xBE,0x09,0x7D,0x0B,0x61,0x0D,0x67,0x0F,0x87,0x11, +0xBB,0x13,0xFC,0x15,0x3F,0x18,0x7B,0x1A,0xA6,0x1C,0xB6,0x1E,0x9F,0x20,0x57,0x22, +0xD7,0x23,0x14,0x25,0x08,0x26,0xAF,0x26,0x03,0x27,0x05,0x00,0x08,0x21,0x05,0x00, +0x00,0x20,0x00,0x00,0x80,0xBD,0x00,0xC0,0x90,0xBD,0x00,0xC0,0xA2,0xBD,0x00,0xC0, +0xA6,0xBD,0x00,0xC0,0x18,0xBD,0x00,0xC0,0x60,0xBD,0x00,0xC0,0xC0,0xBD,0x00,0xC0, +0xDE,0xBD,0x00,0xC0,0xE2,0xBD,0x00,0xC0,0x08,0xBE,0x00,0xC0,0x96,0xBE,0x00,0xC0, +0xD8,0xBE,0x00,0xC0,0x3A,0xBC,0x00,0xC0,0x3E,0xBC,0x00,0xC0,0x14,0xBD,0x00,0xC0, +0x5C,0xBD,0x00,0xC0,0x05,0x00,0x2A,0x00,0x2A,0x00,0x3E,0x00,0x58,0x00,0x79,0x00, +0xA1,0x00,0xD3,0x00,0x0F,0x01,0x56,0x01,0xAA,0x01,0x0C,0x02,0x7D,0x02,0xFE,0x02, +0x91,0x03,0x37,0x04,0xF0,0x04,0xBE,0x05,0xA0,0x06,0x99,0x07,0xA7,0x08,0xCC,0x09, +0x06,0x0B,0x56,0x0C,0xBB,0x0D,0x34,0x0F,0xC0,0x10,0x5D,0x12,0x0A,0x14,0xC5,0x15, +0x8A,0x17,0x59,0x19,0x2D,0x1B,0x05,0x1D,0xDC,0x1E,0xB0,0x20,0x7D,0x22,0x40,0x24, +0xF5,0x25,0x98,0x27,0x27,0x29,0x9E,0x2A,0xF9,0x2B,0x37,0x2D,0x53,0x2E,0x4B,0x2F, +0x1E,0x30,0xC9,0x30,0x4A,0x31,0xA1,0x31,0xCD,0x31,0x04,0x00,0x2D,0x00,0x6D,0x00, +0xE7,0x00,0xAD,0x01,0xD8,0x02,0x81,0x04,0xBE,0x06,0xA0,0x09,0x30,0x0D,0x6D,0x11, +0x47,0x16,0xA3,0x1B,0x56,0x21,0x29,0x27,0xDC,0x2C,0x2A,0x32,0xCF,0x36,0x8B,0x3A, +0x29,0x3D,0x81,0x3E,0x06,0x00,0xF5,0x28,0x03,0x00,0x33,0x33,0x64,0xBD,0x00,0xC0, +0x7A,0xBD,0x00,0xC0,0x0C,0xBE,0x00,0xC0,0x9A,0xBE,0x00,0xC0,0x84,0xBD,0x00,0xC0, +0x94,0xBD,0x00,0xC0,0x68,0xBD,0x00,0xC0,0xAA,0xBD,0x00,0xC0,0xC4,0xBD,0x00,0xC0, +0xE6,0xBD,0x00,0xC0,0xEA,0xBC,0x00,0xC0,0xA4,0xBE,0x00,0xC0,0xB8,0xBB,0x00,0xC0, +0xF8,0xBB,0x00,0xC0,0x84,0xBC,0x00,0xC0,0x14,0xBE,0x00,0xC0,0x06,0x00,0x00,0x20, +0x03,0x00,0xAA,0x2A,0x00,0x00,0x00,0x20,0x02,0x00,0x45,0x00,0x5D,0x01,0x1B,0x04, +0x31,0x09,0xA2,0x10,0x55,0x19,0x32,0x21,0xE5,0x25,0x01,0x00,0x10,0x10,0xEF,0x2F, +0x00,0x00,0x00,0x20,0x02,0x00,0x49,0x01,0x6C,0x07,0xB1,0x15,0x60,0x29,0x38,0x38, +0x01,0x00,0x00,0x20,0x02,0x00,0xAC,0x00,0xCB,0x03,0x95,0x0B,0x6B,0x18,0xE0,0x26, +0xA6,0x30,0x02,0x00,0xAA,0x2A,0x02,0x00,0x00,0x20,0x03,0x00,0x4D,0x00,0x51,0x01, +0xBD,0x03,0x48,0x08,0x6B,0x0F,0x0D,0x19,0x47,0x24,0x73,0x2F,0x86,0x38,0x9F,0x3D, +0x03,0x00,0x00,0x20,0x03,0x00,0x33,0x00,0xC4,0x00,0x08,0x02,0x5B,0x04,0x11,0x08, +0x55,0x0D,0x0D,0x14,0xCC,0x1B,0xCF,0x23,0x1E,0x2B,0xB5,0x30,0xBD,0x33,0x04,0x00, +0x33,0x33,0x04,0x00,0xAA,0x2A,0x03,0x00,0x1F,0x00,0x5B,0x00,0xD6,0x00,0xAB,0x01, +0xF6,0x02,0xD5,0x04,0x59,0x07,0x87,0x0A,0x52,0x0E,0x96,0x12,0x1C,0x17,0x9B,0x1B, +0xC0,0x1F,0x37,0x23,0xB6,0x25,0x05,0x27,0x04,0x00,0x00,0x20,0x01,0x00,0x65,0x04, +0x5D,0x14,0x3D,0x27,0x05,0x00,0x26,0x00,0x1D,0x00,0x28,0x00,0x36,0x00,0x47,0x00, +0x5A,0x00,0x72,0x00,0x8D,0x00,0xAE,0x00,0xD3,0x00,0xFD,0x00,0x2D,0x01,0x64,0x01, +0xA2,0x01,0xE6,0x01,0x33,0x02,0x87,0x02,0xE5,0x02,0x4B,0x03,0xBA,0x03,0x33,0x04, +0xB6,0x04,0x43,0x05,0xDB,0x05,0x7C,0x06,0x29,0x07,0xDF,0x07,0xA1,0x08,0x6C,0x09, +0x41,0x0A,0x21,0x0B,0x09,0x0C,0xFA,0x0C,0xF4,0x0D,0xF5,0x0E,0xFE,0x0F,0x0C,0x11, +0x20,0x12,0x38,0x13,0x53,0x14,0x71,0x15,0x90,0x16,0xAF,0x17,0xCD,0x18,0xE8,0x19, +0x00,0x1B,0x12,0x1C,0x1E,0x1D,0x23,0x1E,0x1F,0x1F,0x10,0x20,0xF7,0x20,0xD0,0x21, +0x9C,0x22,0x59,0x23,0x07,0x24,0xA3,0x24,0x2E,0x25,0xA7,0x25,0x0C,0x26,0x5E,0x26, +0x9C,0x26,0xC6,0x26,0xDA,0x26,0x05,0x00,0x33,0x33,0x01,0x00,0x7E,0x01,0x41,0x08, +0x4A,0x15,0xF4,0x20,0x04,0x00,0x23,0x00,0x45,0x00,0x84,0x00,0xE4,0x00,0x6F,0x01, +0x2F,0x02,0x2F,0x03,0x76,0x04,0x0F,0x06,0xFD,0x07,0x45,0x0A,0xE6,0x0C,0xDA,0x0F, +0x19,0x13,0x93,0x16,0x37,0x1A,0xEF,0x1D,0xA0,0x21,0x2F,0x25,0x80,0x28,0x77,0x2B, +0xFA,0x2D,0xF2,0x2F,0x4D,0x31,0xFD,0x31,0x05,0x00,0xF5,0x28,0x72,0xA2,0x00,0x00, +0x8E,0xA2,0x00,0x00,0xAD,0xA2,0x00,0x00,0xCC,0xA2,0x00,0x00,0xDB,0xA2,0x00,0x00, +0x44,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x0F,0x70,0x8A,0xF7, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,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,0x00,0x03,0x00, +0x00,0x00,0x56,0x30,0x31,0x2E,0x30,0x30,0x37,0x2E,0x30,0x34,0x46,0xC9,0xF5,0x89 +}; diff --git a/drivers/input/touchscreen/msg2233/msg21xxa_yyyy_update_bin.h b/drivers/input/touchscreen/msg2233/msg21xxa_yyyy_update_bin.h new file mode 100755 index 00000000..1f4bfde8 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/msg21xxa_yyyy_update_bin.h @@ -0,0 +1,3106 @@ +u8 msg21xxa_yyyy_update_bin[49664]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xD3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xC5,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x1C,0x40,0x00,0x1C, +0x60,0x00,0x1C,0x80,0x00,0x1C,0xA0,0x00,0x1C,0xC0,0x00,0x1C,0xE0,0x00,0x1D,0x00, +0x00,0x1D,0x20,0x00,0x1D,0x40,0x00,0x1D,0x60,0x00,0x1D,0x80,0x00,0x1D,0xA0,0x00, +0x1D,0xC0,0x00,0x1D,0xE0,0x00,0x1E,0x00,0x00,0x1E,0x20,0x00,0x1E,0x40,0x00,0x1E, +0x60,0x00,0x1E,0x80,0x00,0x1E,0xA0,0x00,0x1E,0xC0,0x00,0x1E,0xE0,0x00,0x1F,0x00, +0x00,0x1F,0x20,0x00,0x1F,0x40,0x00,0x1F,0x60,0x00,0x1F,0x80,0x00,0x1F,0xA0,0x00, +0x1F,0xC0,0x00,0x1F,0xE0,0x00,0xC0,0x60,0x00,0x01,0xC8,0x63,0xAC,0x04,0x84,0x69, +0x80,0x01,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00, +0xFC,0x21,0xFF,0x60,0xEF,0xE1,0x00,0x80,0xFF,0xE1,0x00,0xA0,0x0F,0xE1,0x08,0xC3, +0xE0,0x02,0x0F,0x0F,0xE1,0x00,0xC3,0xE0,0x04,0x0F,0x0F,0xE1,0x04,0xC3,0xE0,0x03, +0x0F,0xEF,0xE1,0x00,0x84,0xC3,0xE0,0x05,0x0F,0xEF,0xE1,0x00,0x88,0xC3,0xE0,0x05, +0x1F,0xEF,0xE1,0x00,0x8C,0xE4,0x01,0x53,0x41,0x90,0x00,0x90,0x00,0x90,0x00,0x90, +0x00,0x90,0x00,0x90,0x00,0x90,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x30,0x44,0x0B, +0x17,0x01,0x98,0x60,0x56,0xF8,0x01,0x4F,0x18,0x79,0x22,0xE0,0x14,0x98,0x62,0x23, +0x00,0x18,0x58,0x77,0x01,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0C,0x81,0x04,0x0D, +0x21,0x0C,0x5D,0x43,0x00,0xE7,0xFF,0xFF,0xA4,0x0C,0x81,0x06,0x5C,0x63,0x00,0x20, +0x60,0x66,0x9B,0x00,0x21,0x40,0x30,0x21,0x44,0x24,0x5D,0x40,0x41,0x4B,0x01,0x01, +0xD0,0x81,0x04,0x66,0xE4,0x00,0x01,0x17,0xE7,0xFF,0xFF,0x5E,0x5C,0x63,0x00,0x20, +0x64,0x4E,0xD1,0x40,0x05,0xD2,0xD1,0x41,0x05,0xB2,0xD1,0x42,0x05,0x96,0xE4,0x00, +0x00,0xE3,0xE7,0xFF,0xFF,0x2A,0x5C,0x63,0x00,0xD0,0x62,0x05,0x1E,0x9B,0x01,0x21, +0x40,0x24,0x5D,0x40,0x21,0x4B,0x01,0x01,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00, +0xCB,0x57,0x23,0x78,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01, +0xCB,0x57,0x23,0x6C,0x0B,0x7A,0x01,0xC7,0x7B,0x8F,0xFF,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xD4,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xE0,0x0B,0x7A,0x01,0xC7,0x7B,0x7F,0xFF,0x0F,0x7A,0x01,0xCA,0xF7,0x3C,0xEC, +0x0B,0x57,0x01,0x47,0x39,0xD5,0x5F,0x39,0x04,0x0F,0x37,0x01,0x23,0x01,0x00,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x3D,0xE8,0x0B,0x38,0x01,0xFF,0x20,0x11,0x11,0x0F,0x38, +0x01,0xCB,0x17,0x3D,0xEC,0x0B,0x38,0x01,0xFF,0x20,0x22,0x22,0x0F,0x38,0x01,0xCB, +0x17,0x3D,0xF0,0x0B,0x38,0x01,0xFF,0x20,0x33,0x33,0x0F,0x38,0x01,0xCA,0xF7,0x78, +0xC0,0xFF,0x00,0xAA,0x55,0x0F,0x17,0x01,0xE4,0x00,0x00,0x01,0x0D,0x41,0x0A,0x0D, +0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x03,0xF0,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x03,0xE8,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x03,0xEC,0xC2, +0xE0,0x10,0x01,0xEC,0xD7,0x04,0x04,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x03,0xFC,0xC2, +0xE0,0x10,0x01,0x0F,0x01,0x02,0xED,0x17,0x04,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x04,0x10,0xC2,0xE0,0x10,0x01,0x0F,0x01,0x06,0xEF,0x17,0x03,0xD4,0xC2,0xE0,0x10, +0x01,0x0F,0x01,0x0A,0xEF,0x17,0x03,0xF4,0x85,0x29,0x5C,0x84,0x00,0xC2,0xE0,0x10, +0x01,0x4C,0x84,0x10,0xFE,0xF7,0x04,0x08,0x8E,0xE4,0x0C,0x77,0x00,0x85,0x29,0x5C, +0x63,0x00,0x9B,0x00,0x24,0x68,0x25,0x1F,0x03,0xFE,0x5F,0x18,0x00,0xC2,0xE0,0x10, +0x01,0xF3,0x57,0x0B,0x1E,0x1E,0xE3,0x01,0x1F,0x9A,0xFF,0x5F,0x3C,0x00,0xD7,0x97, +0x00,0x50,0x1F,0x23,0x02,0x5F,0x39,0x00,0xC2,0xEF,0xFF,0xE1,0xCA,0xF7,0xFF,0xFF, +0xE4,0x00,0x00,0x2F,0x4F,0x78,0x10,0x9F,0x01,0x8F,0x64,0x5F,0x18,0x00,0x0F,0x7B, +0x02,0x5E,0xFB,0x15,0x4A,0xF7,0xD8,0xD7,0x19,0xFF,0x69,0x4F,0x03,0x10,0xC3,0x20, +0x10,0x01,0x8F,0x04,0xEF,0x39,0x03,0xF6,0x0F,0x18,0x02,0xD7,0x38,0x01,0x41,0xC3, +0x20,0x10,0x01,0xEF,0x79,0x03,0xF2,0xC3,0x20,0x10,0x01,0xEF,0xB9,0x03,0xEA,0xC3, +0x20,0x10,0x01,0xEF,0xD9,0x03,0xEE,0xC3,0x20,0x10,0x01,0xEF,0x39,0x04,0x06,0xE4, +0x00,0x00,0x49,0xC3,0x20,0x10,0x01,0xEF,0x79,0x03,0xFE,0xC3,0x20,0x10,0x01,0xEF, +0xB9,0x04,0x02,0xC3,0x20,0x10,0x01,0xEF,0xD9,0x04,0x12,0xC3,0x20,0x10,0x01,0xEF, +0x39,0x03,0xD6,0x20,0x60,0xDE,0x0F,0x44,0x02,0x0F,0x84,0x06,0xCF,0x5A,0x00,0x32, +0x40,0xE7,0xE3,0xD7,0x47,0x05,0xDC,0x42,0xF7,0x2D,0x40,0xA5,0xCB,0x43,0x77,0xDB, +0x43,0x3B,0x2C,0xCC,0xC6,0x00,0x0A,0x9B,0x4A,0x8C,0xD9,0x98,0x61,0x40,0xC6,0xD0, +0xD7,0x06,0x04,0xF4,0x98,0x60,0xE4,0x00,0x01,0x31,0x20,0x64,0x6A,0x0F,0x44,0x02, +0x0F,0x64,0x06,0xCF,0x5A,0x00,0x32,0x40,0xE7,0xDB,0x98,0x60,0xD7,0x47,0x04,0x14, +0xE4,0x00,0x00,0x55,0x1C,0xFA,0xFE,0xD4,0x67,0x01,0x9E,0x4C,0x63,0x10,0x9F,0x5F, +0x4F,0x5A,0x10,0x8F,0x44,0x8C,0x83,0x0F,0x5A,0x02,0x0F,0x64,0x02,0xCF,0x5A,0x00, +0x32,0x41,0x08,0xDB,0x98,0x60,0xD7,0x48,0x02,0xC4,0x42,0xF7,0x2D,0x40,0xA5,0xCB, +0x43,0xB7,0xEB,0x43,0x3D,0x2C,0xE7,0xFF,0xFF,0x3B,0xD4,0x7C,0x01,0x3E,0x9F,0x5F, +0x4C,0xE7,0x10,0x4F,0x5A,0x10,0x98,0x60,0x8F,0x44,0x8C,0x87,0x0F,0x5A,0x02,0x0F, +0x84,0x02,0xCF,0x5A,0x00,0x32,0x41,0x08,0xE3,0xD7,0x48,0x01,0x2C,0xE7,0xFF,0xFE, +0xD5,0x42,0xF7,0x2D,0xCC,0xC6,0x00,0x0A,0x43,0xD7,0xF3,0x40,0xA5,0xCB,0x9B,0x4A, +0x43,0x3E,0x2C,0x8C,0xD9,0x40,0xC6,0xD0,0xD7,0x06,0xFB,0x60,0x98,0x61,0x85,0x29, +0xC2,0xE0,0x10,0x01,0x9B,0x21,0xEA,0xF7,0x01,0x79,0x9E,0xFF,0x5E,0xF7,0x04,0x26, +0xE4,0x43,0xC3,0x18,0x00,0x21,0xFF,0x18,0xB6,0xF8,0x8E,0xF8,0x13,0x37,0x00,0xC3, +0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x0B,0x1A,0xFE,0xF7,0x09,0x0C,0xD0, +0x60,0x05,0x16,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43,0xDE, +0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B,0x40, +0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7,0x08, +0xBD,0x01,0x40,0xB9,0x2B,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08,0x5F, +0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x01,0x43,0xB9,0xEB,0x0F,0xBC,0x01,0xE4,0x00,0x00, +0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF,0xAC, +0x0B,0x37,0x02,0x0B,0x57,0x00,0x8F,0x59,0xC3,0x20,0x10,0x01,0xFF,0x39,0x09,0xBC, +0x0F,0x59,0x00,0x13,0x58,0x04,0x1F,0xBA,0xFF,0x4F,0xBD,0x10,0x43,0xDD,0xCC,0x8F, +0xB7,0x4F,0x9A,0x08,0x09,0x1D,0x00,0x1F,0x7C,0xFF,0x4F,0xBB,0x08,0x8F,0xB7,0x0B, +0xBD,0x00,0x8F,0xA8,0x0F,0xBE,0x00,0x13,0x18,0x01,0x27,0x05,0xAF,0xE4,0x00,0x01, +0x45,0x20,0x66,0xFE,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43, +0xDE,0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B, +0x40,0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7, +0x08,0xBD,0x00,0x40,0xA5,0xC8,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08, +0x5F,0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x00,0x43,0xBD,0xC8,0x0F,0xBC,0x01,0xE4,0x00, +0x00,0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF, +0xAC,0xE7,0xFF,0xFE,0xBF,0x4F,0x1A,0x10,0x9F,0x81,0x43,0x58,0xCC,0x43,0xB8,0xBC, +0x4F,0x9C,0x08,0x0B,0xBD,0x00,0x8F,0x97,0x0B,0x9C,0x00,0x8F,0x9D,0x0F,0x9A,0x00, +0x4F,0x7B,0x10,0x1F,0x58,0xFE,0x8F,0x3B,0x4F,0x5A,0x08,0x9F,0x1F,0x8F,0x57,0x4F, +0x18,0x08,0x0B,0x5A,0x00,0x8E,0xF8,0x0A,0xF7,0x00,0x8E,0xFA,0x0E,0xF9,0x00,0x85, +0x29,0x5C,0xE7,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x0B,0x1E,0x42,0xE7,0xBB,0x5E, +0xF7,0x00,0x9B,0x00,0x8C,0xB7,0x8C,0xD7,0xC3,0x80,0x10,0x01,0xC3,0x40,0x10,0x01, +0x5C,0xC6,0x00,0x5C,0xA5,0x00,0x8B,0x38,0x9A,0xE0,0xFF,0x9C,0x09,0xBC,0xFF,0x5A, +0x09,0x0C,0xE4,0x00,0x00,0x49,0x4F,0x65,0x10,0x43,0xBB,0xE4,0x0F,0xBD,0x02,0x9C, +0xA1,0x8E,0xFD,0x5C,0xA5,0x00,0x8B,0xBB,0x8F,0x7A,0x8F,0xBA,0x0B,0x7B,0x00,0x0B, +0xBD,0x02,0x8F,0x1B,0x8F,0x3D,0xD4,0xA6,0xFF,0x01,0x26,0xE0,0xE8,0x27,0x20,0xDC, +0x27,0x00,0xD0,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x04,0x08,0x4C,0xE7,0x10,0xCF,0x18, +0xFF,0xF6,0x8C,0xFA,0x0F,0x47,0x02,0x43,0x3A,0xCB,0x9F,0x56,0x8F,0x19,0x43,0x58, +0xD0,0xCF,0x5A,0x07,0xFF,0x43,0x5A,0xB8,0x0F,0x43,0x01,0x0E,0xE4,0x00,0x98,0x61, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x85,0x29,0x9A,0xE3,0x9B,0x01,0xE4,0x00,0x00,0x11, +0x8F,0x17,0x9E,0xE2,0xD7,0x03,0xFF,0xE1,0x4C,0x77,0x09,0x9C,0x7F,0x85,0x29,0xFF, +0x00,0x7F,0xFF,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x03,0xD8,0x0F,0x17,0x01,0x0F,0x17, +0x03,0x0F,0x17,0x05,0x0F,0x17,0x07,0x0F,0x17,0x09,0x0F,0x17,0x0B,0x85,0x29,0xC3, +0x00,0x10,0x01,0xFE,0xF8,0x03,0xD8,0xC3,0x00,0x10,0x01,0x0B,0x37,0x08,0xFF,0x18, +0x0B,0x90,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x05,0x0F,0x37,0x09,0x0B, +0x37,0x07,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x09,0x0B,0x38,0x19,0x0F, +0x37,0x0B,0x0B,0x37,0x04,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x01,0x0F, +0x37,0x05,0x0B,0x37,0x03,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x05,0x0B, +0x38,0x19,0x0F,0x37,0x07,0x0B,0x38,0x17,0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17, +0x03,0x85,0x29,0x1C,0x21,0xD8,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x24,0x0D,0x41,0x20, +0x0D,0x61,0x1C,0xFD,0x57,0x03,0xD8,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x0D,0xC1,0x10, +0x09,0xAA,0x07,0x0B,0x0A,0x03,0x43,0x18,0x6D,0x5F,0x18,0x06,0x0F,0x01,0x0B,0x43, +0x18,0xC3,0xE9,0x97,0x03,0xD9,0x09,0xCA,0x05,0x41,0x8C,0x75,0x5D,0x8C,0x06,0x40, +0x6C,0x63,0x8C,0x78,0xE7,0xFF,0xFE,0x48,0x0A,0xEA,0x09,0x41,0xCE,0xBD,0x0A,0xEA, +0x0B,0x42,0xED,0xBD,0x5E,0xF7,0x06,0x0E,0xE1,0x0F,0x42,0xF7,0xBB,0x5D,0x63,0x06, +0x5D,0x4E,0x06,0x40,0x6A,0x53,0x8C,0x77,0xE7,0xFF,0xFE,0x00,0x5E,0xE3,0x06,0x98, +0x61,0x21,0x60,0xAC,0x22,0xE0,0xA0,0x43,0x0B,0xB8,0xD3,0x05,0x01,0x14,0x41,0x4C, +0x53,0x0B,0x01,0x0E,0x09,0x81,0x0A,0x41,0x6B,0xBB,0x43,0x0C,0xC3,0x8D,0x58,0xCD, +0x4A,0x00,0x64,0x42,0xEA,0x58,0x5E,0xE8,0xB1,0x48,0x61,0x01,0x0D,0xC1,0x12,0x0D, +0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21, +0x28,0x85,0x29,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0x0D,0x61,0x0C, +0x0D,0x81,0x08,0x0D,0xC1,0x00,0xF1,0x97,0x08,0x72,0xC1,0x40,0x10,0x01,0x1D,0x6C, +0xFF,0x0D,0x21,0x14,0x0D,0xA1,0x04,0x5D,0xC3,0x00,0x5D,0x6B,0x00,0xFD,0x4A,0x0B, +0x90,0x4E,0xEE,0x5D,0x56,0xF7,0x01,0x22,0xE0,0xD4,0x8A,0xEB,0xE4,0x00,0x00,0x43, +0xCC,0x77,0x00,0x30,0x1D,0xB7,0x01,0x8C,0x6A,0xCC,0x8D,0x00,0x30,0x9C,0x64,0x8C, +0x8A,0x50,0xA0,0x30,0x9C,0x84,0xE4,0x00,0x67,0xF4,0x5E,0xED,0x00,0xD5,0x97,0xFF, +0x1D,0x12,0xEA,0x00,0x22,0xE0,0x20,0x9E,0xFF,0x1A,0xEA,0x00,0x21,0x60,0x30,0x9D, +0x7F,0x5D,0x6B,0x00,0xE7,0xFF,0xFF,0x7B,0x12,0xEA,0x00,0x22,0xE0,0x52,0xC2,0xE0, +0x10,0x01,0x9B,0x37,0xEB,0x17,0x08,0x87,0x47,0x18,0xCC,0xEF,0x17,0x08,0x87,0x0D, +0xC1,0x02,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21, +0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xEB,0x37, +0x01,0x78,0xFF,0x18,0x04,0x1C,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x23,0x24, +0xA6,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F,0x4F,0x57,0x08,0x1F, +0x77,0xFF,0x8F,0x58,0x4F,0x7B,0x10,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6, +0xF9,0xFF,0x68,0xE4,0x00,0x00,0x9D,0x23,0x28,0x38,0x13,0x37,0x04,0x9A,0xE0,0x9F, +0x21,0xE4,0x00,0x00,0x79,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F, +0x4F,0x57,0x08,0xCF,0x77,0x00,0x06,0x8F,0x58,0x9F,0x79,0x9E,0xE1,0x0F,0x7A,0x01, +0x5E,0xF7,0x00,0xD6,0xF9,0xFF,0x68,0xE4,0x00,0x00,0x35,0x4F,0x57,0x08,0x4F,0x77, +0x08,0x8F,0x58,0x9F,0x7F,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6,0xF9,0xFF, +0x70,0x85,0x29,0x9C,0x30,0x5C,0xC6,0x00,0x0D,0x61,0x08,0x0D,0x81,0x04,0x0D,0xA1, +0x00,0x0D,0x41,0x0C,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x1A,0x13,0xD8,0x04,0x40, +0xC6,0xF3,0x5E,0xE6,0x00,0x5F,0xA3,0x06,0x8C,0x97,0x8C,0xB7,0x5F,0x7D,0x04,0x0A, +0xF8,0x0B,0x11,0x58,0x0C,0x40,0xFB,0xBC,0x41,0x9B,0xBD,0xC1,0xA0,0x10,0x01,0xC3, +0x00,0x10,0x01,0x5C,0xA5,0x00,0x4D,0x77,0x08,0x5C,0xE7,0x04,0x5D,0x8C,0x04,0x5C, +0x84,0x00,0xFD,0xAD,0x04,0x1C,0xFF,0x18,0x09,0x0C,0x53,0x20,0x64,0xE4,0x00,0x01, +0x21,0x43,0x44,0x35,0x9F,0x41,0x4F,0x5A,0x08,0x8F,0x4D,0x09,0x1A,0x00,0x41,0x08, +0xBB,0x41,0x08,0x50,0x5F,0x88,0x04,0x43,0x5C,0xDD,0x5F,0x5A,0x06,0x4C,0x7A,0xFA, +0x47,0x43,0xD6,0x43,0x5A,0x1D,0xD6,0xFA,0x03,0x14,0xD5,0x7A,0x02,0x70,0x5D,0x08, +0x06,0xD5,0x1D,0x00,0x58,0x43,0x9C,0x3D,0xE4,0x00,0x00,0x0F,0x43,0x8C,0xE5,0x5F, +0x9C,0x06,0x4F,0x44,0x10,0x43,0x97,0xE5,0x8F,0x58,0xCF,0x9C,0x00,0x64,0x09,0x1A, +0x00,0x43,0x9C,0xB8,0xC7,0x9C,0xFF,0xFF,0x41,0x1C,0x43,0x41,0x08,0xC8,0x0D,0x1A, +0x01,0x4F,0x44,0x10,0x9F,0x42,0x8F,0x58,0x09,0x1A,0x00,0x43,0x9C,0x43,0x43,0x9C, +0xC8,0x0F,0x9A,0x01,0xE4,0x00,0x00,0x29,0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x01, +0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x03,0x9C,0x81,0x5C,0x84,0x00,0xD4,0x85,0xFB, +0xA0,0xC2,0xE0,0x10,0x01,0x0D,0xA1,0x02,0xF0,0x77,0x0B,0x1B,0x0D,0x81,0x06,0x0D, +0x61,0x0A,0x0D,0x41,0x0E,0x40,0x7E,0x1B,0x1C,0x21,0x10,0xE4,0x00,0xC1,0x25,0x5C, +0x63,0x00,0x5C,0x84,0x00,0xC2,0xE0,0x10,0x01,0x43,0x64,0x1D,0xF2,0xF7,0x0B,0x1E, +0x9F,0x61,0x40,0xA5,0xBB,0x5F,0x7B,0x00,0x5C,0xA5,0x00,0x20,0xE4,0x3E,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x0C,0xD0,0xE4,0x00,0x00,0x19,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x09,0x0C,0x43,0x23,0x2C,0x9B,0x00,0x4F,0x39,0x10,0x9F,0x22,0x8F,0x37,0xC2,0xEF, +0xFF,0xE1,0xCA,0xF7,0xFF,0xFF,0xE4,0x00,0x00,0x3D,0x0B,0x99,0xFE,0x0B,0x59,0x00, +0x9F,0x24,0x8F,0x5C,0x4F,0x98,0x10,0x5E,0xFA,0x15,0x8F,0x86,0x4A,0xF7,0xD0,0x0F, +0x5C,0x00,0x9F,0x01,0x5F,0x58,0x00,0xD7,0x7A,0xFF,0x1D,0x9B,0x00,0xE4,0x00,0x00, +0x29,0x0F,0x26,0x02,0x9F,0x01,0x43,0x39,0xBD,0x5F,0x18,0x00,0x0F,0x26,0x00,0x9C, +0xC4,0xD7,0x78,0xFF,0x85,0x85,0x29,0x1C,0x21,0x88,0x0D,0x41,0x70,0x0D,0x61,0x6C, +0x5D,0x44,0x00,0x0D,0x81,0x68,0x5C,0x85,0x00,0x0D,0xA1,0x64,0x88,0xA6,0x41,0xA4, +0x55,0x0D,0x21,0x74,0x89,0x83,0x88,0xC1,0x88,0x6A,0xE7,0xFF,0xFE,0xAA,0xC2,0xE0, +0x10,0x01,0x9D,0xA1,0xEB,0x57,0x01,0x78,0x9B,0x20,0x5D,0xAD,0x00,0x8B,0x19,0x9A, +0xE0,0x89,0x61,0xE4,0x00,0x00,0x5B,0x4F,0x79,0x10,0x43,0x99,0x54,0x8F,0x6B,0x0F, +0x7B,0x02,0x8E,0xFB,0x23,0x44,0x54,0x23,0x48,0x36,0xCF,0x9C,0x00,0x06,0x9F,0x9F, +0xE4,0x00,0x00,0x13,0x4F,0x9C,0x08,0x9F,0x81,0x43,0x7C,0xDB,0x9F,0x21,0x8F,0x1B, +0x5F,0x79,0x00,0xD5,0xBB,0xFE,0xA5,0x26,0xE1,0x34,0xC3,0x20,0x10,0x01,0xEB,0x39, +0x0B,0x25,0x43,0x18,0xCB,0x23,0x44,0x32,0x4F,0x37,0x0A,0x8F,0x19,0xE4,0x00,0x00, +0x35,0x23,0x48,0x46,0xCF,0x37,0x00,0x03,0xCE,0xF7,0x00,0x06,0x8F,0x19,0xE4,0x00, +0x00,0x13,0x8F,0x17,0x4E,0xF7,0x08,0x42,0xF8,0xB8,0xC2,0xE0,0xFF,0xE8,0xCB,0x00, +0x07,0xFF,0x98,0x61,0x4A,0xF7,0xC0,0x5E,0xFF,0xF9,0x4A,0xF7,0x00,0x0E,0xEC,0x01, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1,0x66,0x0D,0x81,0x6A,0x0D,0x61,0x6E,0x0D, +0x41,0x72,0x0D,0x21,0x76,0x1C,0x21,0x78,0x85,0x29,0xFC,0x21,0xFF,0x78,0xED,0x41, +0x00,0x80,0x0D,0x81,0x78,0x0D,0xA1,0x74,0x0D,0xC1,0x70,0x0D,0xE1,0x6C,0x0E,0x01, +0x68,0x0E,0xC1,0x64,0xED,0x21,0x00,0x84,0x0D,0x61,0x7C,0xC1,0x40,0x10,0x01,0xFD, +0x4A,0x0B,0x1A,0x11,0x6A,0x04,0x4E,0xEB,0x08,0x9E,0xE8,0xC6,0xF7,0x03,0xF8,0xFE, +0xC1,0x00,0x88,0x5D,0xC4,0x00,0x5D,0xA5,0x00,0x8A,0x03,0x5C,0xA6,0x00,0x89,0xE1, +0x41,0x65,0x5B,0x40,0x21,0xBD,0x88,0x6E,0x88,0x8D,0xFC,0xD6,0xFF,0x78,0xE7,0xFF, +0xFC,0xA2,0xC3,0x40,0x10,0x01,0x89,0x81,0x5D,0x6B,0x00,0x13,0x2A,0x04,0x9A,0xE0, +0xFF,0x5A,0x04,0x1C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08,0x9E,0xE1,0x43,0x6C,0xC4, +0x8F,0x1A,0x0B,0x18,0x03,0x0F,0x1B,0x01,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x6D,0x43, +0x4B,0x74,0x8D,0xAB,0x5F,0x5A,0x00,0x5D,0xAD,0x00,0x9A,0xE0,0x1F,0x2D,0x01,0x43, +0x39,0xD5,0x5F,0x39,0x00,0xE4,0x00,0x00,0x33,0x4F,0x77,0x10,0xFF,0x96,0xFF,0x78, +0x8F,0x7C,0x0F,0x7B,0x02,0x27,0x60,0x4A,0xD5,0xB8,0x03,0x19,0x9E,0xE1,0x5F,0x17, +0x00,0xD7,0x38,0xFF,0x45,0x8B,0x1A,0x1F,0x36,0xD8,0x1F,0x76,0xD8,0x4E,0xF8,0x10, +0x8E,0xF9,0x0F,0x37,0xA2,0x1E,0xF8,0x01,0x43,0x39,0xCB,0x4E,0xF7,0x10,0x8E,0xFB, +0x0E,0xF7,0xA2,0x42,0xF7,0xBB,0x5F,0x37,0x15,0x4B,0x77,0xC8,0x27,0x60,0xBC,0x8F, +0x1A,0x0B,0x6A,0x0B,0x41,0x78,0x5D,0x13,0x4A,0x0C,0x4D,0x6B,0x08,0x98,0x61,0x8D, +0x8B,0x0B,0x0C,0x00,0x43,0x18,0xDB,0x43,0x77,0xDB,0x43,0x18,0xD0,0x8E,0xF9,0x42, +0xFB,0xB8,0x8E,0xF8,0x0E,0xF0,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x88,0x2F,0x0E, +0xC1,0x66,0x0E,0x01,0x6A,0x0D,0xE1,0x6E,0x0D,0xC1,0x72,0x0D,0xA1,0x76,0x0D,0x81, +0x7A,0x0D,0x61,0x7E,0xED,0x41,0x00,0x82,0xED,0x21,0x00,0x86,0xFC,0x21,0x00,0x88, +0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40,0xC1,0x40,0x10,0x01,0x0D,0x61,0x3C,0x0D, +0x81,0x38,0x0D,0xC1,0x30,0x0E,0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0E,0xA1, +0x14,0x0E,0xC1,0x10,0x0D,0x21,0x44,0x0D,0xA1,0x34,0x0D,0xE1,0x2C,0x0E,0x01,0x28, +0x0E,0x21,0x24,0x5E,0x63,0x00,0x5E,0x44,0x00,0xC1,0xC0,0x10,0x01,0xF0,0x8A,0x0B, +0x1A,0xFD,0xCE,0x0C,0x5C,0x98,0xA0,0x88,0x6E,0x99,0x80,0x8A,0xCA,0xE4,0x00,0xBE, +0x36,0xC1,0x40,0x10,0x01,0x89,0x6C,0xC2,0xA0,0x10,0x01,0x9A,0x81,0xFD,0x4A,0x0B, +0x90,0xE4,0x00,0x01,0x19,0xCC,0x6B,0x00,0x30,0xEA,0xF5,0x08,0x3F,0x41,0xA3,0x54, +0x56,0xF7,0x02,0x12,0x2D,0x04,0x12,0x0D,0x05,0x11,0xED,0x07,0x22,0xE1,0x0C,0x1C, +0x61,0x04,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0xDA,0x20,0x61, +0x14,0x1C,0x61,0x06,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFC,0x5C, +0x20,0x60,0xCC,0x0B,0x01,0x04,0xCF,0x18,0x00,0x07,0x0A,0xE1,0x06,0xCE,0xF7,0x00, +0x03,0x8E,0xF8,0x9B,0x0A,0x42,0xF7,0xC0,0x0E,0xED,0x17,0xE4,0x00,0x00,0x43,0x8C, +0x6A,0x88,0x91,0x1C,0x63,0x16,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0x56, +0x20,0x60,0x32,0x4E,0xF4,0x5C,0x45,0x8C,0xBD,0x5D,0x8C,0x00,0x88,0x6E,0xF0,0x96, +0x0B,0x1A,0x98,0xA1,0x9D,0x61,0xE4,0x00,0xBD,0x04,0x5D,0x6B,0x00,0x12,0xEA,0x00, +0xD6,0xEB,0xFB,0xAD,0x88,0x6C,0xE7,0xFF,0xF4,0x7A,0x12,0xEA,0x00,0x22,0xE0,0x6C, +0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x25,0x56,0xF7,0x40,0x22,0xE0,0x34,0xC2,0xE0, +0x10,0x01,0xEE,0xF7,0x03,0xE6,0x86,0xE8,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xF0,0x97, +0x0B,0x1A,0x98,0xA1,0xE4,0x00,0xBC,0x88,0xC2,0xE0,0x10,0x01,0x99,0x80,0xEA,0xF7, +0x08,0x25,0x89,0x6C,0x56,0xF7,0x80,0x99,0xA1,0x22,0xE0,0xFC,0xC2,0xE0,0x10,0x01, +0xEE,0xF7,0x03,0xFA,0x86,0xE8,0xE4,0x00,0x00,0x7F,0xCE,0xEB,0x00,0x30,0x40,0x6A, +0xBC,0x8A,0xE3,0x88,0x83,0x10,0xB7,0x04,0x1C,0x63,0x18,0x9C,0x8C,0x10,0xD7,0x05, +0x10,0xF7,0x07,0xE7,0xFF,0xEF,0xDC,0x20,0x60,0x32,0x4E,0xED,0x5C,0x45,0x8C,0xBD, +0x5D,0x8C,0x00,0x9D,0x61,0x5D,0x6B,0x00,0x12,0xEA,0x00,0xD6,0xEB,0xFE,0x7D,0x88, +0x6C,0xE7,0xFF,0xF3,0x64,0x22,0x61,0x5C,0x22,0x40,0xFE,0xE4,0x00,0x00,0xA3,0xCD, +0x6C,0x00,0x30,0x8D,0x6A,0x0A,0xEB,0x16,0x0E,0xE1,0x08,0x0A,0xEB,0x18,0x1C,0x61, +0x08,0x0E,0xE1,0x0C,0x1C,0x81,0x0C,0xEE,0xED,0x03,0xD2,0x0C,0xAB,0x0E,0x88,0xCE, +0x86,0xE8,0x0E,0xE1,0x0A,0x9D,0x81,0x0E,0xEB,0x17,0x5D,0x8C,0x00,0x0E,0xE1,0x0E, +0x0E,0xEB,0x19,0xE4,0x00,0x00,0x25,0xC1,0xC0,0x10,0x01,0x99,0x80,0xC1,0xA0,0x10, +0x01,0xFD,0xCE,0x01,0x64,0x12,0xEA,0x00,0xD6,0xEC,0xFD,0xBD,0xC2,0xE0,0x10,0x01, +0x13,0x6A,0x00,0xEB,0x97,0x08,0x3F,0x9B,0x20,0xC2,0xE0,0x10,0x01,0x57,0x9C,0x01, +0xFE,0xF7,0x0B,0xA8,0xCB,0xA0,0x07,0xFF,0xE4,0x00,0x00,0x89,0x0B,0x57,0x01,0x13, +0xD7,0xEF,0x5F,0x1A,0x06,0x47,0x18,0xC7,0x4F,0x18,0xFA,0x47,0x1A,0xC4,0x5F,0x58, +0x06,0xC3,0x40,0xFF,0xE8,0x20,0x00,0x1D,0xFF,0x00,0x07,0xFF,0x0F,0x17,0x01,0x5F, +0x58,0x06,0x23,0x80,0x48,0xCF,0x1A,0x03,0xFF,0x4F,0x5E,0x50,0x43,0x18,0xE8,0x8F, +0x1A,0x0F,0x17,0x01,0x9F,0x21,0x1E,0xF7,0x30,0x5F,0x39,0x00,0xD7,0x3B,0xFE,0x06, +0x0E,0xC1,0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E, +0x21,0x26,0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81, +0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85,0x29,0x1C, +0x21,0xC8,0xC2,0xE0,0x10,0x01,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0E,0x61,0x0C,0x0E, +0xC1,0x00,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0xC1,0x20,0x0D,0xE1, +0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x81,0x08,0x0E,0xA1,0x04, +0xC1,0x80,0x10,0x01,0xF3,0x57,0x08,0x72,0xFD,0x8C,0x0B,0x90,0xC2,0xE0,0x10,0x01, +0x1E,0xC1,0x38,0x89,0xA3,0x8A,0x61,0x18,0x0C,0x00,0xFE,0xF7,0x0B,0x98,0x9B,0x00, +0x9B,0x3F,0xE4,0x00,0x00,0x2B,0x0C,0x17,0x00,0x1B,0x37,0xFE,0x1B,0x37,0xFF,0x9F, +0x01,0x1E,0xF7,0x30,0x5F,0x18,0x00,0xD7,0x1A,0xFF,0x7E,0xC1,0xE0,0x10,0x01,0xFD, +0xEF,0x0B,0x1A,0x12,0xEF,0x04,0x10,0x6F,0x01,0x40,0x63,0xBB,0xE4,0x00,0xB6,0x22, +0x13,0x2F,0x04,0x4E,0xF9,0x10,0x9E,0xEA,0xC6,0xF7,0x07,0xF8,0xC3,0x60,0x10,0x01, +0x40,0x21,0xBD,0x0A,0x0D,0x18,0x89,0x61,0x9B,0x00,0xCA,0xE0,0x20,0x00,0xFF,0x7B, +0x09,0xBC,0xE4,0x00,0x00,0x3B,0x4F,0x58,0x10,0x9F,0x01,0x43,0x9A,0xDC,0x8F,0x4B, +0x0E,0x3C,0x02,0x5E,0x37,0x15,0x0E,0x3A,0x00,0x4A,0xF1,0xB8,0x5E,0xF7,0x06,0x5F, +0x58,0x00,0xD7,0x3A,0xFF,0x25,0x46,0x37,0xBF,0x99,0x40,0x4E,0x31,0xFA,0x89,0xCA, +0x46,0x31,0xBC,0xC2,0x80,0x10,0x01,0x9A,0x42,0x8A,0xAC,0xE4,0x00,0x04,0x4B,0x0B, +0x0D,0x18,0x21,0x41,0x32,0x0E,0xEB,0x02,0xD7,0x17,0x0E,0xEC,0x0F,0x0B,0x06,0xD6, +0xF8,0x00,0x7C,0xD6,0xF8,0x0E,0x96,0x0F,0x0B,0x0A,0xD6,0xF8,0x0E,0x58,0x98,0x60, +0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE5,0xE6, +0xD0,0x60,0x0D,0xAA,0x12,0xEC,0x00,0x99,0x41,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E, +0xEC,0x18,0x17,0x04,0x18,0x17,0x06,0x1A,0x57,0x05,0xE4,0x00,0x03,0x4F,0x21,0x45, +0x56,0x0E,0xEB,0x06,0xD7,0x17,0x0C,0x8C,0x0F,0x0B,0x02,0xD7,0x17,0x0C,0x54,0x0F, +0x0B,0x0A,0xD6,0xF8,0x00,0x7C,0xD6,0xF8,0x0B,0xFE,0x0F,0x0B,0x0E,0xD6,0xF8,0x0B, +0xC0,0x98,0x61,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7, +0xFF,0xE5,0x40,0xD0,0x60,0x0B,0x12,0x12,0xEC,0x00,0x9B,0x01,0x8E,0xEE,0x99,0x42, +0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x18,0x17,0x04,0x1B,0x17,0x06,0x1A,0x57,0x05,0xE4, +0x00,0x02,0xA5,0x25,0x45,0xC5,0x1F,0x37,0xFE,0xD7,0x2A,0x03,0x58,0x4E,0xEA,0x10, +0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x09,0x84,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F, +0x0B,0x0F,0x18,0x02,0xD6,0xF8,0x01,0x34,0xD6,0xF8,0x08,0xEE,0x1F,0x2A,0xFE,0x4F, +0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x08,0x70,0x1F,0x4A,0x01,0x4F,0x5A, +0x10,0x8F,0x4B,0x0F,0x5A,0x02,0xD7,0x59,0x07,0xF8,0x1F,0x2A,0x01,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x03,0x2C,0xD6,0xF9,0x07,0x66,0x1F,0x2A,0x02, +0x4F,0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x06,0xE8,0xD7,0x19,0x06,0xC8, +0xE4,0x00,0x00,0x95,0x4F,0x0A,0x10,0x1F,0x57,0xFE,0x0B,0x2D,0x18,0x8F,0x0B,0xD5, +0x5A,0x03,0x6E,0x0F,0x18,0x02,0xD7,0x38,0x05,0xFC,0x1F,0x37,0xFF,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD7,0x38,0x05,0x84,0x1F,0x37,0xFD,0x4F,0x39,0x10,0x8F, +0x2B,0x0F,0x39,0x02,0xD7,0x19,0x00,0xB4,0xD7,0x19,0x04,0xEE,0x9E,0xFC,0x4E,0xF7, +0x10,0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x04,0x78,0x88,0x6A,0x88,0x8B,0x88,0xB1, +0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE3,0x6E,0x20,0x61,0xE4,0x12, +0xEC,0x00,0x1F,0x0A,0xFF,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x19,0x57,0x06, +0x1B,0x17,0x04,0x9D,0x41,0x5D,0x4A,0x00,0xE4,0x00,0x00,0xAD,0x0E,0xF8,0x02,0xD7, +0x37,0x02,0xB4,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18,0x02,0xD6,0xF8, +0x00,0xBC,0xD6,0xF8,0x02,0x1E,0x1F,0x0A,0xFE,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18, +0x02,0xD6,0xF8,0x01,0xA0,0x88,0x6A,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C, +0x09,0x0D,0x1E,0xE7,0xFF,0xE2,0xB8,0x20,0x60,0x78,0x12,0xEC,0x00,0x1F,0x0A,0xFE, +0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x1B,0x17,0x04,0x19,0x57,0x06,0x19,0x57, +0x05,0xE4,0x00,0x00,0x21,0x9D,0x41,0x5D,0x4A,0x00,0x12,0xEF,0x04,0xD6,0xEA,0xF0, +0x95,0x12,0xEF,0x04,0xD6,0xEA,0x01,0x61,0x12,0xEC,0x00,0x8E,0xEE,0xCE,0xF7,0x00, +0x30,0x43,0x17,0x64,0x13,0x18,0x05,0xD5,0x58,0x00,0x55,0x1D,0x58,0x01,0x5D,0x4A, +0x00,0x8E,0xF5,0x9B,0x01,0x9D,0xC1,0x18,0x17,0x07,0x0F,0x17,0x08,0x5D,0xCE,0x00, +0x12,0xEF,0x04,0xD6,0xEA,0x00,0x61,0xF2,0xF4,0x08,0x72,0xD6,0xEE,0xFD,0xFC,0x12, +0xEC,0x00,0x8D,0xD7,0x19,0xCC,0x00,0x88,0x33,0x0E,0xC1,0x02,0x0E,0xA1,0x06,0x0E, +0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1, +0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32, +0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01, +0xF8,0x77,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x0B,0x25,0xEE,0xF8,0x04,0x5D, +0xC3,0x00,0x10,0x01,0xCF,0x37,0x00,0x05,0x4E,0xF7,0x10,0xEF,0x38,0x04,0x5B,0xC3, +0x00,0x10,0x01,0xEE,0xF8,0x04,0x59,0x85,0x29,0x5C,0x63,0x06,0x20,0x84,0x5A,0x0B, +0x05,0x00,0x0B,0x25,0x02,0x0B,0x45,0x04,0x0B,0x85,0x06,0x0B,0x65,0x08,0xE4,0x00, +0x00,0x27,0x0B,0x05,0x0A,0x0B,0x25,0x0C,0x0B,0x45,0x0E,0x0B,0x85,0x10,0x0B,0x65, +0x12,0xC2,0xE0,0x10,0x01,0x9B,0xA2,0xEA,0xF7,0x0B,0x25,0x43,0x9C,0xBB,0x43,0x9C, +0xE8,0x43,0x80,0xE5,0xFF,0x9C,0x03,0xFF,0xD4,0x7C,0x00,0xC8,0x43,0x9B,0xBB,0x43, +0xBC,0xE8,0xFF,0xBD,0x03,0xFF,0xD7,0xA3,0x01,0x08,0x5C,0x78,0x04,0xE4,0x00,0x00, +0xE3,0x24,0x7C,0x58,0x43,0x03,0xC3,0x40,0x7C,0x1D,0x43,0x43,0xD3,0x40,0x78,0xD4, +0x40,0x63,0xE0,0xE4,0x00,0x00,0xB1,0x9B,0x82,0x43,0x7B,0xBB,0x43,0x7B,0xE0,0xFF, +0x9B,0x03,0xFF,0xD7,0x83,0x01,0x7C,0xC0,0x60,0xFF,0xEC,0x20,0x00,0xCD,0x43,0x60, +0xDD,0xFE,0xFB,0xFC,0x01,0x8E,0xE3,0x43,0x37,0xCB,0xCA,0xE0,0x07,0xFF,0x40,0x77, +0x1D,0xFF,0x7B,0x04,0x00,0x43,0x03,0xC3,0x40,0x79,0xC4,0x40,0x63,0xD8,0xE4,0x00, +0x00,0x3B,0x24,0x7C,0x32,0x8C,0x77,0x40,0x63,0xD3,0xE4,0x00,0x00,0x1D,0xFF,0x17, +0x07,0xFF,0x40,0x78,0x1D,0x40,0x63,0xCB,0x40,0x63,0xB8,0x5C,0x63,0x04,0x85,0x29, +0x9C,0x38,0x0C,0x01,0x04,0xC3,0x00,0x10,0x01,0xC3,0x40,0x10,0x01,0xFF,0x18,0x0B, +0x1A,0xFF,0x9A,0x04,0x1C,0x0B,0x38,0x0B,0x0B,0xBC,0x00,0x13,0x18,0x0C,0x5F,0x79, +0x06,0x5E,0xE3,0x06,0x43,0x7D,0xDB,0x43,0x7B,0xC0,0xD6,0xFB,0x00,0x4C,0x9B,0x41, +0x0F,0x41,0x04,0x0F,0x41,0x06,0x98,0x7F,0x23,0x40,0x5E,0x0B,0x5C,0x02,0x43,0x5A, +0xCB,0x43,0x5A,0xC0,0xD7,0x57,0x00,0x58,0x9B,0x41,0x98,0x60,0x0F,0x41,0x04,0x0F, +0x41,0x06,0x23,0x41,0x1E,0xC3,0x40,0x10,0x01,0xC3,0x60,0x10,0x01,0xF3,0xBA,0x0B, +0x1E,0xFF,0x7B,0x04,0x20,0x9B,0x41,0xE4,0x00,0x00,0x57,0x0B,0xDB,0xFE,0x43,0xDE, +0xCB,0x43,0xDE,0xC0,0xD7,0xD7,0x00,0xD4,0x0B,0xDB,0x00,0x43,0xDE,0xCB,0x43,0xDE, +0xC0,0xD7,0xD7,0x00,0x68,0x9B,0x41,0x0F,0x41,0x04,0xE4,0x00,0x00,0x1F,0x9F,0x41, +0x9F,0x62,0x5C,0x7A,0x02,0xD7,0x5D,0xFE,0xB0,0x0F,0x41,0x06,0x23,0x40,0x9E,0xC3, +0x40,0x10,0x01,0xF3,0x5A,0x0B,0x1E,0x9F,0x41,0x4F,0x7A,0x08,0x8F,0x9B,0x0B,0x7C, +0x00,0x43,0x3B,0xCB,0x43,0x19,0xC0,0xD7,0x17,0x00,0x64,0x9A,0xE1,0x5C,0x7A,0x02, +0x0E,0xE1,0x04,0x9C,0x28,0x85,0x29,0xC3,0x20,0x10,0x01,0x5C,0x63,0x06,0x5C,0xC6, +0x02,0x5C,0xE7,0x00,0xFF,0x39,0x09,0x0C,0x24,0xC0,0x98,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x0B,0x1E,0xD4,0xD8,0x00,0xDC,0x43,0x18,0x3B,0x1E,0xE6,0xFF,0x8E,0xF8,0x4F, +0x17,0x10,0x8F,0x19,0x0B,0x78,0x02,0x0B,0x58,0x00,0xE4,0x00,0x00,0x11,0x9B,0x40, +0x8B,0x7A,0xC2,0xE0,0x10,0x01,0xF3,0x97,0x0B,0x1E,0xD7,0x86,0x01,0x08,0xD0,0xDF, +0x04,0x28,0x42,0xFC,0x3B,0x8E,0xE6,0x4F,0x17,0x10,0x4E,0xF7,0x10,0x8F,0x19,0x8F, +0x37,0x0B,0x18,0x02,0x0B,0xD9,0x00,0xE4,0x00,0x00,0x17,0x24,0xDD,0xA0,0x9B,0xC0, +0x8B,0x1E,0xD4,0xDC,0x03,0x0C,0x4E,0xE6,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04, +0x1C,0x8E,0xE7,0x9C,0xC1,0x09,0x17,0x00,0x4C,0xC6,0x08,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x0B,0x1A,0x8C,0xE6,0x0B,0x97,0x0B,0x13,0x37,0x0C,0x0A,0xE7,0x00,0x40,0xD7, +0xE3,0x42,0xF7,0x45,0x43,0xA8,0xE3,0x40,0xC6,0xC8,0x43,0xBD,0xC8,0x43,0x97,0xE3, +0x43,0xA3,0xED,0x43,0x3C,0xC8,0x40,0x66,0x1D,0x43,0x18,0xEB,0x43,0x7B,0x1B,0x42, +0xFE,0xEB,0x8F,0x1B,0x40,0x7A,0x1B,0x43,0x18,0xC8,0x8E,0xE3,0x42,0xF7,0xC8,0xE4, +0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x0F,0x04,0x01,0x0E,0xE5,0x01,0x85,0x29,0x1C, +0x21,0xD8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x5D,0x84, +0x00,0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x5D,0xA5,0x00,0x5D,0x63,0x04, +0x0C,0xC1,0x04,0x0D,0x21,0x24,0x89,0xE8,0x0D,0xC1,0x2A,0xC1,0x40,0x10,0x01,0x9A, +0x02,0xFD,0x4A,0x0B,0x1A,0x0C,0xE1,0x00,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x40,0x63, +0x80,0x40,0x6B,0x1D,0xE7,0xFF,0xFC,0x38,0x0C,0x81,0x06,0x88,0xC3,0x5E,0xE3,0x02, +0x0C,0xA1,0x02,0x26,0xFC,0x36,0x0C,0x04,0x01,0x0C,0x05,0x01,0xE4,0x00,0x00,0x2D, +0x0A,0xEA,0x0B,0x42,0xEC,0xBB,0x88,0xED,0x40,0x77,0x80,0x40,0x6B,0x1D,0xE7,0xFF, +0xFD,0x72,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x4C,0x63,0x0A,0x8C,0x6B,0xE7,0xFF,0xFB, +0xC6,0x12,0xEA,0x04,0x88,0xC3,0x5F,0x03,0x02,0xD7,0x17,0x00,0x70,0x0C,0x0F,0x01, +0x0C,0x0E,0x01,0xE4,0x00,0x00,0x69,0x08,0x6A,0x0B,0x41,0x8C,0x1B,0x88,0x8F,0x4C, +0x6C,0x0A,0x88,0xAE,0x8C,0x6B,0x88,0xED,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1, +0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26, +0x1C,0x21,0x28,0xE7,0xFF,0xFC,0xC9,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12, +0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C, +0x21,0x28,0x85,0x29,0x1C,0x21,0x90,0x0D,0x41,0x68,0x0D,0x81,0x60,0x0D,0xA1,0x5C, +0x0D,0xE1,0x54,0x0E,0x01,0x50,0x0E,0x21,0x4C,0x0D,0x21,0x6C,0xC2,0x20,0x10,0x01, +0x0D,0x61,0x64,0x0D,0xC1,0x58,0x0E,0x41,0x48,0x0E,0x61,0x44,0x0E,0x81,0x40,0x0E, +0xA1,0x3C,0x0E,0xC1,0x38,0x89,0xA3,0x8A,0x04,0x89,0x85,0x5D,0xE6,0x00,0x99,0x40, +0xFE,0x31,0x0B,0x90,0xE4,0x00,0x00,0xA1,0xCF,0x0A,0x00,0x30,0x8F,0x11,0x1E,0xE1, +0x20,0x10,0xB8,0x07,0x0B,0x98,0x17,0x43,0x2D,0x2C,0x4D,0x05,0x08,0x13,0x59,0x00, +0x1F,0x61,0x38,0x8D,0x1A,0x9F,0x41,0x4D,0x08,0x08,0x1B,0x59,0x00,0x8F,0x68,0x08, +0x78,0x17,0x0F,0x9B,0xD9,0x1F,0x01,0x30,0x8F,0x08,0x88,0x8F,0x0F,0x01,0x00,0x1C, +0xC1,0x18,0x1C,0xE1,0x28,0x8C,0xC8,0x8C,0xE8,0x9D,0x41,0x8D,0x17,0x5D,0x4A,0x00, +0xE7,0xFF,0xFD,0x1E,0x12,0xF1,0x00,0xD6,0xEA,0xFD,0x8D,0xC2,0xE0,0x10,0x01,0x8B, +0x10,0xF2,0x57,0x04,0x64,0x9B,0x41,0x8A,0xED,0xE4,0x00,0x00,0x23,0x13,0x37,0x00, +0x27,0x24,0x19,0x0F,0x58,0x00,0x9E,0xE1,0x9F,0x04,0x43,0x37,0x6D,0x5F,0x39,0x00, +0xD6,0x59,0xFF,0x6D,0x99,0x60,0xC2,0x60,0x10,0x01,0x89,0x4B,0xC2,0x80,0x10,0x01, +0xE4,0x00,0x03,0x07,0x42,0xF0,0x5C,0x0E,0xF7,0x02,0x22,0xE0,0x48,0x1E,0xE1,0x10, +0x8E,0xEB,0x0B,0x57,0x00,0x0B,0x77,0x02,0xE4,0x00,0x01,0x5D,0x42,0xED,0x54,0x12, +0xF7,0x00,0x22,0xE1,0xE0,0x1E,0xE1,0x18,0x8E,0xEB,0x0B,0x17,0x00,0x1E,0xE1,0x28, +0x8E,0xEB,0x0A,0xF7,0x00,0x8E,0xF8,0x1F,0x01,0x30,0x8F,0x0B,0x0B,0x18,0x00,0x8E, +0xF8,0x1F,0x01,0x20,0x8F,0x0B,0x0B,0x18,0x00,0x8E,0xF8,0x9B,0x04,0x42,0xF7,0xC0, +0x0E,0xEC,0x00,0xE4,0x00,0x02,0x55,0xCE,0xEE,0x00,0x30,0x8E,0xF1,0x41,0x0E,0xCC, +0x08,0x77,0x17,0x4D,0x08,0x08,0x1E,0xE1,0x30,0x8E,0xE8,0x0E,0xE1,0x00,0x1E,0xE1, +0x20,0x0F,0x01,0x0C,0x0F,0x21,0x08,0x88,0x8F,0x88,0xB5,0x1C,0xC1,0x18,0x1C,0xE1, +0x28,0x8C,0xC8,0x8C,0xE8,0x8D,0x17,0xE7,0xFF,0xFB,0x90,0x9D,0xC1,0x0F,0x01,0x0E, +0x5D,0xCE,0x00,0x0F,0x21,0x0A,0xE4,0x00,0x00,0x23,0x9A,0xC1,0x99,0xC0,0x42,0xD6, +0x55,0x4F,0x2A,0x08,0x43,0x0D,0xB4,0x12,0xF8,0x00,0xD6,0xEE,0xFD,0x6D,0x4E,0xD6, +0x10,0x43,0x10,0xB4,0x0F,0x18,0x02,0xD3,0x00,0x05,0x0A,0x1F,0x01,0x38,0x8E,0xD8, +0x0B,0x56,0xD8,0x0B,0x76,0xDA,0x43,0x3A,0xDD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0xEB, +0x93,0x04,0x5B,0x47,0x37,0xCE,0x43,0x39,0xBD,0x52,0xE0,0x64,0x5F,0x39,0x06,0xD7, +0x3C,0x00,0xF4,0xEB,0x14,0x04,0x59,0x9A,0xE0,0xD7,0x19,0x00,0xA4,0x42,0xF9,0xC5, +0x43,0x1C,0xC5,0xCE,0xF7,0x00,0x64,0x42,0xF7,0xC0,0x5E,0xF7,0x00,0x5F,0x7A,0x15, +0x4B,0x81,0x01,0x4F,0x2A,0x08,0x4B,0x00,0x0A,0x8F,0x19,0x8F,0x3C,0x1F,0x81,0x38, +0x1F,0x41,0x38,0x53,0x60,0xC8,0x4F,0x39,0x08,0x43,0x7B,0xBD,0x8F,0x3C,0x0B,0x99, +0xE0,0x4F,0x18,0x08,0x8F,0x1A,0x0B,0xB8,0xE8,0x0B,0x58,0xF8,0x8F,0x5D,0x8F,0x5C, +0x0B,0x99,0xF0,0x8F,0x5C,0x43,0x5B,0xD3,0x0B,0x79,0xE8,0x0B,0x39,0xF8,0x8F,0x79, +0x0B,0x38,0xE0,0x8F,0x79,0x0B,0x38,0xF0,0x43,0x1B,0xCC,0x42,0xF7,0xC3,0xCB,0x00, +0x03,0x20,0x8E,0xFA,0xE7,0xFF,0xFD,0xF3,0x22,0xE0,0x88,0x1F,0x01,0x38,0x4E,0xEA, +0x10,0x8E,0xF8,0x0B,0x17,0xF0,0x0B,0x37,0xE0,0x8F,0x38,0x0B,0x17,0xF8,0x8F,0x38, +0x0B,0x17,0xE8,0x42,0xF9,0xC4,0xE7,0xFF,0xFD,0xAB,0x0C,0x0C,0x00,0x9D,0x41,0x9D, +0x84,0x9D,0x64,0x5E,0xAA,0x00,0xD6,0x55,0xF3,0xF5,0x0E,0xC1,0x3A,0x0E,0xA1,0x3E, +0x0E,0x81,0x42,0x0E,0x61,0x46,0x0E,0x41,0x4A,0x0E,0x21,0x4E,0x0E,0x01,0x52,0x0D, +0xE1,0x56,0x0D,0xC1,0x5A,0x0D,0xA1,0x5E,0x0D,0x81,0x62,0x0D,0x61,0x66,0x0D,0x41, +0x6A,0x0D,0x21,0x6E,0x1C,0x21,0x70,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x89,0xA3,0xC2,0xE0,0x10, +0x01,0x5C,0x64,0x06,0xEA,0xF7,0x08,0x3F,0x5D,0x85,0x00,0x5D,0x66,0x00,0x5D,0x47, +0x00,0x56,0xF7,0x04,0x22,0xE0,0x34,0x88,0x8C,0x88,0xAB,0x88,0xCA,0xE7,0xFF,0xE0, +0xEC,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x1E,0x43,0x0A,0xC3,0x5F,0x18,0x00,0x9B, +0x20,0x42,0xF8,0x64,0x8D,0x78,0xC3,0x40,0x10,0x01,0x5D,0x6B,0x00,0x5E,0xF7,0x00, +0x8B,0x19,0xFF,0x5A,0x09,0x0C,0xE4,0x00,0x00,0x3B,0x4F,0x77,0x10,0x8F,0x7A,0x0B, +0x7B,0x02,0x8F,0x1B,0x4F,0x77,0x10,0x9E,0xE1,0x8F,0x7A,0x5E,0xF7,0x00,0x0B,0x7B, +0x00,0x8F,0x3B,0xD6,0xEB,0xFF,0x38,0x27,0x21,0x14,0x27,0x01,0x08,0xC2,0xE0,0x10, +0x01,0xFE,0xF7,0x03,0x30,0x4F,0x39,0x40,0x9D,0x44,0x4D,0x4A,0x10,0x8D,0x57,0x0A, +0xEA,0x06,0x43,0x19,0xC0,0x9B,0x4A,0xFF,0x18,0xFF,0x00,0x53,0x20,0x64,0x43,0x18, +0xBB,0x0A,0xEA,0x04,0x43,0x18,0xD0,0x4E,0xF7,0x40,0x42,0xF7,0xC8,0x8E,0xF8,0x5E, +0xE0,0x09,0x0E,0xED,0x00,0x48,0x61,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1, +0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18, +0x85,0x29,0xCA,0xE0,0x01,0x00,0xFC,0x21,0xFF,0x80,0x5C,0xE7,0x00,0x0D,0x41,0x78, +0x0D,0x61,0x74,0x0D,0x81,0x70,0x0E,0x21,0x5C,0x0E,0x41,0x58,0x0E,0x61,0x54,0x0E, +0x81,0x50,0x0E,0xA1,0x4C,0x0E,0xC1,0x48,0x0D,0x21,0x7C,0x0D,0xA1,0x6C,0x0D,0xC1, +0x68,0x0D,0xE1,0x64,0x0E,0x01,0x60,0xCE,0x44,0x00,0x0A,0x42,0x52,0x1B,0x42,0x52, +0xB8,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x11,0xD7,0x04,0x41,0x87,0x73,0x5F, +0x0C,0x00,0xCC,0x84,0x0A,0x00,0x8C,0xB8,0x8C,0xD8,0xC2,0xA0,0x10,0x01,0xC2,0x20, +0x10,0x01,0xC1,0x60,0x10,0x01,0xC3,0x00,0x10,0x01,0xFD,0x6B,0x09,0x0C,0x42,0x64, +0x18,0x5E,0x86,0x00,0x09,0xF7,0x0B,0x12,0x17,0x0C,0x5D,0x45,0x00,0xFE,0xB5,0x03, +0x30,0xFE,0x31,0x04,0x1C,0x8A,0xCB,0xFF,0x18,0x09,0xBC,0xE4,0x00,0x01,0x61,0x0F, +0x01,0x04,0x88,0x95,0x50,0xA0,0x3C,0x1C,0x61,0x08,0xE4,0x00,0x44,0xAC,0x41,0xAA, +0x65,0x1E,0xED,0x01,0x4E,0xF7,0x08,0x8E,0xF1,0x98,0x82,0x08,0x77,0x00,0x1C,0xA1, +0x08,0x40,0x63,0x7B,0x40,0x63,0x80,0xE7,0xFF,0xF1,0x44,0x0F,0x01,0x06,0x5C,0x63, +0x04,0xD5,0x4C,0x00,0x5E,0x1E,0xEE,0xFF,0xD5,0xB7,0x01,0x92,0xCB,0x20,0x03,0xE8, +0x43,0x43,0x9B,0x4E,0xEA,0x10,0x43,0x63,0x93,0x9E,0xE2,0x43,0x7B,0xC8,0x8E,0xEB, +0x0B,0x97,0x01,0x43,0x7C,0xDD,0x0F,0x77,0x01,0x43,0x3A,0xC8,0x4E,0xEA,0x10,0x8E, +0xEB,0x0B,0x57,0x01,0x43,0x3A,0xCD,0x0F,0x37,0x01,0x4E,0xEA,0x08,0x1F,0x37,0x01, +0x4F,0x59,0x08,0x8F,0x4B,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4F,0x57, +0x08,0x8F,0x56,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4E,0xF7,0x08,0x8E, +0xEB,0x4F,0x4A,0x10,0x0B,0x77,0x00,0x8F,0x58,0x4F,0x39,0x08,0x9D,0x41,0x8F,0x2B, +0x5D,0x4A,0x00,0x0A,0xF9,0x00,0x8E,0xFB,0x0E,0xFA,0x00,0xD5,0x54,0xFA,0xA0,0x0E, +0xC1,0x4A,0x0E,0xA1,0x4E,0x0E,0x81,0x52,0x0E,0x61,0x56,0x0E,0x41,0x5A,0x0E,0x21, +0x5E,0x0E,0x01,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D,0xA1,0x6E,0x0D,0x81,0x72, +0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21,0x00,0x80,0x85,0x29,0x1C, +0x21,0xB8,0x98,0x60,0x0D,0x21,0x44,0x0D,0x41,0x40,0x0D,0x61,0x3C,0x0D,0x81,0x38, +0x0D,0xA1,0x34,0x0D,0xC1,0x30,0x0D,0xE1,0x2C,0x0E,0x01,0x28,0x0E,0x21,0x24,0x0E, +0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0C,0x01,0x08,0x0C,0x01,0x0C,0x18,0x01, +0x02,0x18,0x01,0x03,0x0C,0x01,0x10,0x0C,0x01,0x14,0xE7,0xFF,0xD3,0x4C,0x1C,0x61, +0x02,0x1C,0x81,0x10,0x1C,0xA1,0x08,0x98,0xC4,0xE7,0xFF,0xF5,0xD6,0xC2,0xE0,0x10, +0x01,0xF3,0x97,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEB,0xB7,0x08,0x1D,0xC2,0xE0,0x10, +0x01,0xEF,0x77,0x04,0x56,0xC2,0xE0,0x10,0x01,0x57,0xBD,0x20,0xEF,0xD7,0x04,0x62, +0xC3,0x20,0x10,0x01,0x4F,0xBD,0x29,0x1E,0xE1,0x08,0xFF,0x39,0x03,0x50,0x9B,0x40, +0xE4,0x00,0x00,0x63,0x0F,0x17,0x02,0x09,0x19,0xFC,0x0F,0x19,0x00,0x43,0x18,0x45, +0x5F,0x1F,0xF9,0x4B,0x18,0x00,0x0F,0x17,0x00,0x23,0xA0,0x3C,0x23,0x60,0x30,0x43, +0x18,0xF3,0x43,0x18,0xD8,0x0F,0x17,0x00,0x9F,0x41,0x9E,0xE4,0x5F,0x5A,0x00,0x9F, +0x28,0xD7,0x5C,0xFE,0x9E,0x98,0x61,0x99,0x60,0xC2,0x20,0x10,0x01,0xC2,0x80,0x10, +0x01,0xE7,0xFF,0xD2,0x3E,0x89,0x4B,0xFD,0xB1,0x0B,0x90,0x9A,0x41,0xC2,0x60,0x10, +0x01,0xFE,0x94,0x0C,0x5C,0xE4,0x00,0x00,0xF9,0xCE,0x0A,0x00,0x30,0x42,0xF0,0x6C, +0x1C,0x61,0x04,0x11,0xF7,0x04,0x11,0xD7,0x05,0x11,0x97,0x07,0x08,0x97,0x17,0x88, +0xAF,0x88,0xCE,0x88,0xEC,0xE7,0xFF,0xF9,0x88,0x20,0x60,0xF8,0x98,0x60,0xE7,0xFF, +0xD1,0xC4,0x1F,0x01,0x18,0x4E,0xEC,0x10,0x8E,0xF8,0x88,0xAF,0x0C,0x97,0xF2,0x88, +0xCE,0x88,0xEC,0x0C,0x61,0x06,0xE7,0xFF,0xFA,0xF8,0x98,0x61,0xE7,0xFF,0xD1,0x88, +0x40,0x6D,0x84,0x88,0xAF,0x88,0x83,0x88,0xCE,0x1C,0x63,0x18,0x9C,0x8C,0x88,0xEC, +0xE7,0xFF,0xD4,0x42,0x20,0x60,0x32,0x4E,0xF2,0x54,0x45,0x6B,0xBD,0x5D,0x6B,0x00, +0x88,0x74,0xF0,0x93,0x0B,0x1A,0x98,0xA1,0x9D,0x41,0xE4,0x00,0xA0,0x3C,0x5D,0x4A, +0x00,0xF2,0xF1,0x0B,0x90,0xD6,0xEA,0xFC,0x25,0x88,0x6B,0xE7,0xFF,0xD7,0xB0,0x0D, +0x21,0x46,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,0x0E,0x01, +0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,0x61,0x3E, +0x0D,0x41,0x42,0x1C,0x21,0x48,0x85,0x29,0xFC,0x21,0xFF,0x00,0x98,0xA0,0xED,0x41, +0x00,0xF8,0xED,0x61,0x00,0xF4,0xED,0xC1,0x00,0xE8,0xED,0xE1,0x00,0xE4,0xEE,0x01, +0x00,0xE0,0xEE,0x21,0x00,0xDC,0xEE,0x41,0x00,0xD8,0xEE,0x61,0x00,0xD4,0xED,0x21, +0x00,0xFC,0xED,0x81,0x00,0xF0,0xED,0xA1,0x00,0xEC,0xEE,0x81,0x00,0xD0,0xEE,0xA1, +0x00,0xCC,0xEE,0xC1,0x00,0xC8,0xC2,0x20,0x10,0x01,0xC2,0x60,0x10,0x01,0xFE,0x31, +0x0C,0x5C,0xFD,0x73,0x0B,0x1A,0x88,0x71,0x10,0x8B,0x00,0xE4,0x00,0x9F,0x1A,0xC2, +0xE0,0x10,0x01,0xEA,0xF7,0x08,0x25,0xC6,0xF7,0x02,0x00,0xC2,0x40,0x10,0x01,0x5E, +0xE0,0x01,0xC1,0xE0,0x10,0x01,0x4A,0xE1,0x13,0xC1,0x40,0x10,0x01,0xC1,0xC0,0x10, +0x01,0x0E,0xE1,0x0C,0x9A,0x00,0xFE,0x52,0x03,0x30,0xFD,0xEF,0x09,0x0C,0xFD,0x4A, +0x09,0xBC,0xFD,0xCE,0x0B,0x90,0x98,0x60,0x0C,0x01,0x58,0x0C,0x01,0x5C,0x18,0x01, +0x56,0x18,0x01,0x57,0x0C,0x01,0x60,0x0C,0x01,0x64,0xE7,0xFF,0xCF,0x6C,0x1C,0x61, +0x56,0x1C,0x81,0x60,0x1C,0xA1,0x58,0x98,0xC3,0xE7,0xFF,0xF1,0xF6,0xC2,0xE0,0x10, +0x01,0xEB,0x97,0x08,0x1D,0xC2,0xE0,0x10,0x01,0xC3,0x20,0x10,0x01,0xEF,0x77,0x04, +0x56,0xC2,0xE0,0x10,0x01,0xF3,0x59,0x04,0x64,0x57,0x9C,0x20,0xEF,0xB7,0x04,0x62, +0x4F,0x9C,0x29,0x1E,0xE1,0x58,0x9B,0x20,0xE4,0x00,0x00,0x5D,0x0F,0xD7,0x02,0x4F, +0x19,0x18,0x8F,0x12,0x0B,0x18,0x1C,0x43,0x1E,0xC5,0x5F,0x1F,0xF9,0x4B,0x18,0x00, +0x0F,0x17,0x00,0x23,0x80,0x3C,0x23,0x60,0x30,0x43,0x18,0xEB,0x43,0x18,0xD8,0x0F, +0x17,0x00,0x9F,0x21,0x9E,0xE4,0x5F,0x19,0x00,0xD7,0x58,0xFE,0x9D,0x13,0x0B,0x04, +0x09,0xAB,0x0B,0x12,0x8B,0x0C,0x9A,0xA0,0xE4,0x00,0x01,0xA1,0xFE,0xE1,0x00,0xC8, +0x8E,0xF5,0x12,0xF7,0x8E,0x22,0xE0,0x72,0xFF,0x61,0x00,0xC8,0x9A,0xE1,0x42,0xF7, +0xAD,0x4E,0xF7,0x10,0x8E,0xFB,0x0F,0x37,0x92,0x4E,0xF5,0x10,0x8E,0xFB,0x0F,0x37, +0x90,0x41,0x95,0xC3,0x1F,0xB5,0x01,0x5E,0xCC,0x00,0x43,0xBD,0xC3,0xE4,0x00,0x01, +0x25,0x0F,0x01,0x00,0x0F,0x41,0x04,0x0F,0xA1,0x08,0x88,0x92,0x50,0xA0,0x3C,0x1C, +0x61,0x10,0xE4,0x00,0x3D,0x1C,0x42,0xF6,0x65,0xC3,0x80,0x10,0x01,0x9E,0xE1,0xFF, +0x9C,0x04,0x1C,0x4E,0xF7,0x08,0x8E,0xFC,0x98,0x81,0x08,0x77,0x00,0x1C,0xA1,0x10, +0x40,0x63,0x6B,0x40,0x63,0xA0,0xE7,0xFF,0xE9,0xA6,0x53,0x60,0x64,0x4E,0xF6,0x10, +0x5C,0x63,0x04,0x4F,0x35,0x10,0xFD,0x21,0x00,0xC8,0x9E,0xE2,0x8F,0x29,0x8E,0xEF, +0x0F,0x39,0x92,0x43,0x23,0xCB,0x43,0x39,0xD8,0x0B,0x77,0x01,0x5F,0x39,0x04,0x43, +0x7B,0xCD,0x0F,0x77,0x01,0x0F,0xA1,0x0A,0x4F,0x76,0x10,0x0F,0x41,0x06,0x43,0x9B, +0x7C,0x9E,0xC1,0x0B,0xDC,0x01,0x8F,0x6A,0x43,0x3E,0xCD,0x5E,0xD6,0x00,0x5F,0x39, +0x06,0x0F,0x01,0x02,0x0F,0x3C,0x01,0x0A,0xF7,0x00,0x8F,0x37,0x0F,0x3B,0x00,0xD7, +0xB6,0xFB,0x94,0x9E,0xA1,0x5E,0xB5,0x00,0xD7,0x55,0xF9,0xA5,0x98,0x61,0xE7,0xFF, +0xCC,0xC4,0x13,0x6B,0x04,0x13,0x4B,0x01,0xC3,0x00,0x10,0x01,0x43,0x5A,0xDB,0x9A, +0xE0,0xFF,0x18,0x0C,0xD0,0xE4,0x00,0x00,0x4F,0x4F,0x37,0x10,0x43,0x99,0xC4,0x8F, +0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0x4F,0x37,0x10,0x9E,0xE1,0x9F,0x22,0x5E,0xF7, +0x00,0x43,0x99,0xC4,0x8F,0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0xD7,0x57,0xFE,0xEC, +0xC3,0x20,0x10,0x01,0x12,0x8E,0x00,0xFF,0x39,0x0B,0x96,0x9B,0xA0,0x8B,0x19,0x8B, +0xCA,0xE4,0x00,0x01,0x3D,0x1F,0x98,0x02,0x12,0xF8,0xFE,0x12,0xB8,0xFF,0x11,0x98, +0x01,0x13,0x58,0x00,0x0D,0x1C,0x02,0x21,0x04,0x5E,0x43,0x8C,0xDB,0x8F,0x9A,0x4F, +0x9C,0x10,0x8F,0x8A,0x0F,0x9C,0x02,0x41,0x8C,0xDB,0xE4,0x00,0x00,0xCD,0x4D,0xBA, +0x10,0x43,0x9A,0xDC,0x8D,0xAA,0x4F,0x9C,0x10,0x0D,0xAD,0x02,0x8F,0x8A,0x0F,0x9C, +0x02,0x8F,0x8D,0xE7,0xFF,0xFF,0xC9,0x21,0x04,0x5A,0x41,0xB7,0x64,0x4D,0xAD,0x10, +0x8D,0xAA,0x0D,0xAD,0x02,0xD5,0xBC,0x01,0x94,0xE4,0x00,0x00,0x65,0x4D,0xB7,0x10, +0x42,0xD7,0xDC,0x8D,0xBE,0x4E,0xD6,0x10,0x0D,0xAD,0x02,0x8E,0xDE,0x0E,0xD6,0x02, +0x8E,0xCD,0xD6,0xDC,0x00,0xC8,0x43,0x57,0x64,0x4F,0x5A,0x10,0x8F,0x5E,0x0F,0x9A, +0x02,0x8F,0x8D,0xE4,0x00,0x00,0x0D,0x8B,0x8D,0x8B,0x57,0x9E,0xE1,0x5E,0xF7,0x00, +0xD6,0xF5,0xFD,0xB8,0x1B,0x58,0x00,0x9F,0xA1,0x1F,0x18,0x30,0x5F,0xBD,0x00,0xD7, +0xB4,0xFB,0x36,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x1E,0xC2,0xE0,0x10,0x01,0x1F, +0x98,0xFF,0xF3,0x57,0x04,0x50,0x1F,0xB8,0xFD,0xC2,0xE0,0x10,0x01,0x1E,0xB8,0xFC, +0x11,0x8E,0x00,0x5D,0x1C,0x00,0x1D,0xB8,0xFE,0xFE,0xF7,0x0B,0x95,0x9B,0x60,0x8A, +0x9C,0x5F,0xBD,0x00,0x5E,0xB5,0x00,0x9A,0xC2,0x1C,0x78,0xFD,0xE4,0x00,0x00,0xEB, +0x13,0x17,0x01,0xD7,0x1C,0x00,0x76,0x19,0x17,0x00,0x18,0x77,0xFF,0xE4,0x00,0x00, +0xB9,0x23,0x00,0x36,0x1A,0xD7,0x00,0x18,0x17,0xFF,0xE4,0x00,0x00,0x9F,0x23,0x04, +0x56,0x5F,0x40,0x29,0x9F,0x1F,0x4B,0xC2,0x1B,0x1B,0x17,0xFF,0x1B,0xD7,0x00,0xE4, +0x00,0x00,0x75,0xD7,0x0D,0x00,0x8E,0x5F,0x40,0x29,0x1A,0x97,0x00,0x4B,0xDD,0xA8, +0xE4,0x00,0x00,0x4D,0x1F,0xD8,0x01,0x5F,0xDE,0x00,0x23,0x44,0x22,0x9F,0x02,0x5F, +0xD8,0x00,0x1B,0xD7,0x00,0x13,0xD7,0x01,0x23,0x44,0x26,0x9F,0xDE,0xE4,0x00,0x00, +0x0D,0x9F,0xDF,0x5F,0xDE,0x00,0x1B,0xD7,0xFF,0x9F,0x61,0x1E,0xF7,0x30,0x5F,0x7B, +0x00,0xD7,0x6C,0xFC,0x7E,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x25,0x56,0xF7,0x08, +0xD2,0xE0,0x08,0x6A,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xF3,0x57,0x0B,0x1E,0x9B,0xA0, +0xC2,0xE0,0x10,0x01,0x1E,0xDA,0xFE,0xEA,0x97,0x01,0x7E,0x8B,0x78,0x8B,0x9D,0x98, +0x60,0x9A,0xA1,0xE4,0x00,0x01,0xBF,0x12,0xF9,0x00,0xD2,0xE1,0x06,0x99,0xD6,0xD7, +0x06,0x78,0x1D,0x17,0xFF,0x1D,0xB7,0x01,0x1D,0x39,0x02,0x5D,0x08,0x00,0x5D,0xAD, +0x00,0x0F,0xC9,0x02,0x23,0xC4,0xDE,0x13,0x79,0x01,0x43,0x7A,0xDB,0x5F,0x7B,0x00, +0x8D,0xBB,0x8D,0x1B,0x8E,0xFB,0x4D,0xAD,0x10,0x4D,0x08,0x10,0x8D,0xAA,0x8D,0x0A, +0x0F,0xAD,0x02,0x0F,0x88,0x02,0x4E,0xF7,0x10,0x5F,0xBC,0x15,0x8E,0xEA,0x4B,0x9D, +0xE0,0x0F,0x77,0x02,0x5F,0x9C,0x06,0xE4,0x00,0x00,0xCD,0x23,0xC9,0xA2,0x13,0x79, +0x01,0x43,0xBB,0xD3,0x5F,0xBD,0x00,0x43,0x8D,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x43, +0x75,0xDD,0x0F,0xDC,0x02,0x43,0x7A,0xDB,0x5F,0x7B,0x00,0x8D,0xBB,0x4D,0xAD,0x10, +0x8D,0xAA,0x0F,0x8D,0x02,0x8F,0xDC,0x43,0x88,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x8D, +0x1B,0x0D,0xBC,0x02,0x8F,0xB7,0x4D,0x08,0x10,0x8E,0xFB,0x8D,0x0A,0x4F,0xBD,0x10, +0x0F,0x88,0x02,0x8F,0xAA,0x8F,0x8D,0x4E,0xF7,0x10,0x5F,0xDC,0x15,0x8E,0xEA,0x4B, +0x9E,0xE0,0x0F,0x7D,0x02,0x0E,0xF7,0x02,0x5F,0x9C,0x06,0x8F,0x77,0x8B,0xB4,0xE4, +0x00,0x00,0x0F,0x23,0xC0,0x68,0xC3,0x60,0x7C,0xEC,0x20,0x00,0x4D,0x42,0xFB,0xE5, +0xD7,0xB7,0x00,0x68,0x4E,0xF5,0xC4,0x44,0x63,0xBD,0x5C,0x63,0x00,0x9F,0x01,0x1F, +0x39,0x30,0x5E,0xF8,0x00,0xD5,0x97,0xF9,0x15,0xE7,0xFF,0xCD,0xF4,0x1E,0xC1,0x68, +0x10,0x8B,0x00,0x88,0x76,0x98,0xA0,0x99,0xA0,0xE4,0x00,0x96,0x3E,0x89,0x8D,0xC2, +0x80,0x10,0x01,0xE4,0x00,0x01,0x3F,0xCC,0x6C,0x00,0x30,0xEB,0x74,0x08,0x3F,0x42, +0xA3,0x74,0x57,0x7B,0x02,0x13,0x55,0x04,0x13,0x35,0x05,0x13,0x15,0x07,0x23,0x61, +0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x0F,0x01,0x00,0x0F,0x21,0x08,0x0F,0x41,0x04, +0x1C,0x61,0x52,0x98,0xE1,0xE7,0xFF,0xD2,0xE4,0x0F,0x01,0x02,0x0F,0x21,0x0A,0x0F, +0x41,0x06,0x20,0x61,0x14,0x1C,0x61,0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD4,0x54,0x20,0x60,0xCC,0x0B,0x21,0x52,0x0B,0x01,0x54,0xCF,0x39,0x00, +0x07,0xCF,0x18,0x00,0x03,0x9A,0xEA,0x8F,0x19,0x43,0x18,0xB8,0x0F,0x15,0x17,0xE4, +0x00,0x00,0x47,0x8C,0x6E,0x88,0x9A,0x1C,0x63,0x16,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD2,0x4E,0x20,0x60,0x3A,0x9A,0xE1,0x4E,0xF7,0x64,0x45,0xAD,0xBD,0x5D, +0xAD,0x00,0x88,0x76,0x10,0x8B,0x00,0x98,0xA1,0x9D,0x81,0xE4,0x00,0x94,0xFA,0x5D, +0x8C,0x00,0x12,0xEE,0x00,0xD6,0xEC,0xFB,0x15,0x88,0x6D,0xE7,0xFF,0xCC,0x70,0x9E, +0x01,0x0F,0x21,0x0E,0x5E,0x10,0x00,0xD7,0x30,0xD8,0x7D,0x88,0x71,0x10,0x8B,0x00, +0x98,0xA1,0xE4,0x00,0x94,0xAC,0xED,0x21,0x00,0xFE,0xEE,0xC1,0x00,0xCA,0xEE,0xA1, +0x00,0xCE,0xEE,0x81,0x00,0xD2,0xEE,0x61,0x00,0xD6,0xEE,0x41,0x00,0xDA,0xEE,0x21, +0x00,0xDE,0xEE,0x01,0x00,0xE2,0xED,0xE1,0x00,0xE6,0xED,0xC1,0x00,0xEA,0xED,0xA1, +0x00,0xEE,0xED,0x81,0x00,0xF2,0xED,0x61,0x00,0xF6,0xED,0x41,0x00,0xFA,0xFC,0x21, +0x01,0x00,0x85,0x29,0x20,0x60,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x34,0x85, +0x29,0x20,0x60,0x4E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x00,0xFC,0xC2,0xE0,0x10,0x01, +0xEC,0xB7,0x01,0x30,0x85,0x29,0x20,0x60,0x5E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04, +0x8C,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0x90,0xE4,0x00,0x00,0x5D,0x20,0x64,0x5E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0xBC,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0xB4, +0xE4,0x00,0x00,0x2F,0x20,0x68,0x4E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0xAC,0xC2, +0xE0,0x10,0x01,0xEC,0xB7,0x04,0x88,0x85,0x29,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01, +0xEC,0x97,0x04,0xA8,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x3E,0xC2,0xE0,0x10,0x01, +0xEC,0x97,0x01,0x3B,0xE4,0x00,0x00,0x3D,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC, +0x97,0x01,0x1D,0xE4,0x00,0x00,0x1F,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97, +0x01,0x41,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97, +0x01,0x01,0xE4,0x00,0x00,0x3D,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01, +0x39,0xE4,0x00,0x00,0x1F,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x19, +0x85,0x29,0x5C,0x84,0x04,0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x1B, +0x85,0x29,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0x81, +0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14, +0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0x0E,0xC1,0x00,0x20, +0x65,0x70,0x20,0x60,0x4C,0xD0,0x62,0x04,0x42,0x99,0xC0,0x89,0xEE,0xD0,0x63,0x06, +0x66,0xE4,0x00,0x01,0x71,0xC2,0xE0,0x10,0x01,0xEE,0xD7,0x00,0xFE,0xC2,0xE0,0x10, +0x01,0xEE,0xB7,0x01,0x32,0xC2,0xE0,0x10,0x01,0xEE,0x97,0x04,0x8E,0xC2,0xE0,0x10, +0x01,0xEE,0x77,0x04,0x92,0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01,0x3B,0xC2,0xE0,0x10, +0x01,0x9A,0x00,0xE9,0xD7,0x01,0x01,0x99,0xA0,0xC2,0xE0,0x10,0x01,0x9A,0x21,0xED, +0x77,0x01,0x36,0x9A,0x45,0x89,0x90,0xE4,0x00,0x00,0xD9,0xC2,0xE0,0x10,0x01,0xEE, +0x97,0x04,0xBE,0xC2,0xE0,0x10,0x01,0xEE,0x77,0x04,0xB6,0xC2,0xE0,0x10,0x01,0x99, +0xA0,0xE9,0xF7,0x01,0x1D,0x9A,0x00,0xC2,0xE0,0x10,0x01,0x8A,0x2D,0xE9,0xD7,0x01, +0x39,0x9A,0x40,0x99,0x61,0x89,0x90,0x9A,0xA0,0xE4,0x00,0x00,0x71,0xC2,0xE0,0x10, +0x01,0xEE,0x97,0x04,0xAE,0xC2,0xE0,0x10,0x01,0xEE,0x17,0x04,0xAA,0xC2,0xE0,0x10, +0x01,0xE9,0xF7,0x01,0x41,0xC2,0xE0,0x10,0x01,0x99,0x81,0xE9,0xD7,0x01,0x19,0x9A, +0x21,0xC2,0xE0,0x10,0x01,0x9A,0x40,0xE9,0xB7,0x01,0x1B,0x99,0x61,0x9A,0x60,0x8A, +0xAC,0x9A,0xC1,0x99,0x41,0xE4,0x00,0x00,0x55,0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01, +0x3B,0xC2,0xE0,0x10,0x01,0xE9,0xD7,0x01,0x01,0x99,0xA0,0x9A,0x40,0x9A,0x00,0x9A, +0x80,0x9A,0xA0,0x8A,0x2D,0x89,0x72,0x8A,0x70,0x89,0x94,0x8A,0xD5,0x99,0x40,0x88, +0x6A,0xE4,0x00,0xDF,0xF6,0x88,0x6A,0xE4,0x00,0xE0,0x78,0x88,0x76,0xE4,0x00,0xF4, +0x26,0x88,0x75,0xE4,0x00,0xF4,0x80,0x88,0x74,0xE4,0x00,0xE1,0xD8,0x88,0x73,0xE4, +0x00,0xE2,0x24,0x88,0x72,0xE4,0x00,0xE1,0x26,0x88,0x71,0xE4,0x00,0xE1,0x52,0x88, +0x6A,0xE4,0x00,0xF5,0xA2,0x88,0x70,0xE4,0x00,0xF5,0xFC,0x98,0x60,0xE4,0x00,0xF6, +0x4A,0x98,0x60,0xE4,0x00,0xF6,0x98,0x98,0x60,0xE4,0x00,0xF6,0xE6,0x98,0x60,0xE4, +0x00,0xF7,0x34,0x88,0x6F,0xE4,0x00,0xE2,0x1E,0x88,0x6E,0xE4,0x00,0xE2,0x4C,0x88, +0x6D,0xE4,0x00,0xE2,0x80,0x88,0x6C,0xE4,0x00,0xE2,0x9A,0x88,0x6B,0x0E,0xC1,0x02, +0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E, +0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61, +0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0xE4,0x00,0xDF,0xE3,0xC2,0xE0, +0x10,0x01,0xF0,0x77,0x04,0xA4,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x04,0xA4, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x04,0xA4,0x9F,0x01,0xFB,0x17,0x04,0xA4, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x04,0xB8,0x85,0x29,0xC2,0xE0,0x10,0x01, +0xF8,0x77,0x04,0xB8,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x04,0xB8,0x9F,0x01, +0xFB,0x17,0x04,0xB8,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x01,0x14,0x85,0x29, +0xC3,0x40,0x10,0x01,0xFF,0x5A,0x01,0x04,0x0C,0x1A,0x00,0x9A,0xE1,0xC3,0x20,0x10, +0x01,0xFF,0x39,0x01,0x20,0x0E,0xF9,0x00,0xC3,0x00,0x10,0x01,0xFF,0x18,0x04,0x94, +0x0C,0x18,0x00,0x0C,0x1A,0x04,0x0E,0xF9,0x04,0x0C,0x18,0x04,0x0C,0x1A,0x08,0x0E, +0xF9,0x08,0x0C,0x18,0x08,0x0C,0x1A,0x0C,0x0E,0xF9,0x0C,0x0C,0x18,0x0C,0xC3,0x00, +0x10,0x01,0xEE,0xF8,0x01,0x3C,0x85,0x29,0x9C,0x38,0x0D,0x41,0x04,0xC3,0x00,0x10, +0x01,0xC2,0xE0,0x10,0x01,0x5C,0xA5,0x00,0x5C,0xC6,0x00,0xF3,0x38,0x04,0xB9,0xFE, +0xF7,0x01,0x3C,0xD7,0x25,0x00,0x6A,0xF8,0xB8,0x04,0xB9,0x9B,0x01,0x0F,0x17,0x00, +0xC3,0x80,0x10,0x01,0xC3,0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x9C,0x01,0x20,0xFF, +0x18,0x01,0x04,0x23,0x24,0x9A,0x0B,0xA3,0x00,0x4F,0x46,0x18,0x43,0x78,0xD4,0x0F, +0xBB,0x00,0x0B,0xA4,0x00,0x0F,0xBB,0x04,0x8F,0x5C,0x0F,0x3A,0x00,0x0F,0x3A,0x04, +0x40,0xA5,0x35,0x20,0xA4,0x1A,0x0C,0x17,0x00,0x4E,0xE6,0x18,0x8E,0xF8,0x0C,0xF7, +0x02,0x08,0xA3,0x00,0x0D,0x17,0x02,0x0F,0xB7,0x06,0x0F,0x37,0x06,0x42,0xE7,0x2D, +0x4C,0xF7,0xFA,0x46,0xE7,0xBE,0x0B,0x44,0x00,0x40,0xF7,0x3D,0x43,0x39,0xD5,0x4E, +0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0x41,0x08,0x2D,0x43,0xBD,0xD5,0x4F,0xC8, +0xFA,0x4F,0x7D,0xFA,0x45,0x1E,0x46,0x47,0xBB,0xEE,0x43,0xC8,0xF5,0x43,0x7D,0xDD, +0x43,0xC7,0xF3,0x43,0x7B,0xBB,0x9B,0x21,0x8F,0x7E,0x9A,0xE3,0xE4,0x00,0x00,0x11, +0x8F,0x37,0x9E,0xE2,0xD7,0x3B,0xFF,0xE1,0xC3,0x20,0x10,0x01,0x4E,0xF7,0x09,0x53, +0x40,0x1E,0x9E,0xFF,0x5E,0xF7,0x06,0xEE,0xF9,0x04,0xC0,0xC3,0x20,0x10,0x01,0x42, +0xF7,0xD1,0xEF,0x39,0x01,0x16,0x42,0xF7,0xBB,0x43,0x39,0xBD,0xC2,0xE0,0x10,0x01, +0x5F,0x23,0x11,0x20,0x00,0x1B,0x53,0x20,0x19,0xEF,0x37,0x04,0xB0,0xC3,0xA0,0x10, +0x01,0xEC,0xB7,0x04,0xB2,0x4C,0xC6,0x08,0x9A,0xE0,0xFF,0xBD,0x04,0x94,0xCB,0x40, +0x10,0x00,0x43,0x26,0xBC,0x4F,0x39,0x10,0x43,0x7C,0xCC,0xC9,0x40,0xA0,0x00,0x0D, +0x1B,0x02,0x0F,0xDB,0x02,0x43,0x68,0x53,0xCF,0xDE,0x00,0x0A,0x8F,0xC5,0x43,0xDB, +0xF0,0x43,0x7D,0xCC,0x0F,0xDB,0x00,0x5F,0xD7,0x00,0x23,0xC0,0x92,0x43,0xD8,0xCC, +0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E,0x02,0x0B,0xC3,0x00,0x43,0x3E,0xCD,0x43, +0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F,0x23,0x01,0xE4,0x00,0x00,0x43,0x43,0xD8, +0xCC,0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E,0x02,0x0B,0xC4,0x00,0x43,0x3E,0xCD, +0x43,0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F,0x24,0x01,0x43,0x66,0xBC,0x4F,0x7B, +0x10,0x43,0xD8,0xDC,0x0F,0x3E,0x00,0x43,0x3C,0xDC,0x8F,0x7D,0x0F,0xD9,0x02,0x0D, +0x1B,0x02,0x0F,0x79,0x02,0x43,0x68,0xDB,0x43,0x7B,0xD0,0x43,0x7E,0xDD,0x0F,0x79, +0x00,0x9E,0xE1,0xD2,0xE2,0xFB,0x7E,0x0D,0x41,0x06,0x9C,0x28,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x05,0x1A,0x13,0x17,0x20,0x43,0x37,0xC4,0x9F,0x01,0x18,0x79, +0x00,0x5F,0x18,0x00,0x1B,0x17,0x20,0xC3,0x20,0x10,0x01,0xC2,0xE0,0x10,0x01,0x5F, +0x04,0xDB,0xFF,0x39,0x05,0x4E,0xFE,0xF7,0x05,0xA0,0x20,0x00,0x91,0x4F,0x18,0x08, +0xC3,0x40,0x10,0x01,0x8F,0x38,0xEB,0x5A,0x05,0x49,0x8F,0x17,0x0F,0x59,0x01,0xC2, +0xE0,0x10,0x01,0xEA,0xF7,0x05,0xF3,0x0E,0xF8,0x01,0xE4,0x00,0x00,0x1D,0xFF,0x00, +0x7F,0xFF,0x0F,0x19,0x4F,0x0F,0x17,0x4F,0x85,0x29,0xC3,0x00,0x10,0x01,0x5C,0x84, +0x02,0x9A,0xE0,0xFF,0x18,0x05,0x1A,0xE4,0x00,0x00,0x51,0x43,0x38,0xBC,0x43,0x63, +0xBC,0x13,0x59,0x00,0x9E,0xE1,0x8F,0x44,0x5E,0xF7,0x00,0x1F,0x5A,0x40,0x4F,0x3A, +0xFA,0x4F,0x39,0xD1,0x8F,0x59,0x57,0x5A,0x3F,0x43,0x3A,0xCD,0x1B,0x3B,0x00,0x13, +0x38,0x20,0xD7,0x37,0xFE,0xCD,0x85,0x29,0xC3,0x18,0x00,0x21,0x5F,0x23,0x00,0xFF, +0x18,0xB6,0xFE,0x9A,0xE0,0x5C,0x77,0x00,0x0B,0x78,0x01,0x9B,0x5F,0x5C,0x62,0x01, +0x20,0x00,0x19,0x0B,0x58,0x03,0xD7,0x64,0x01,0x7D,0xD7,0x44,0x01,0x59,0x23,0x24, +0x36,0x40,0x60,0xBD,0x54,0x63,0x3F,0xE4,0x00,0x00,0x57,0x23,0x28,0x2A,0x1C,0x63, +0x20,0xE4,0x00,0x00,0x1B,0x23,0x2C,0x76,0x52,0xE0,0x20,0x40,0x77,0x1D,0x5C,0x63, +0x00,0xE4,0x00,0x00,0x23,0x9E,0xE1,0x9F,0x02,0x5E,0xE2,0x29,0x23,0xFE,0xE5,0x50, +0x60,0xFF,0x85,0x29,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x06,0x4A,0x0B,0x17,0x07,0x0A, +0xF7,0x01,0x40,0x63,0xC3,0x40,0x63,0xB8,0x9A,0xEA,0x40,0x63,0xB8,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x01,0x44,0x0B,0x17,0x06,0x0A,0xF7,0x04,0xD7,0x17,0x00, +0x92,0xCC,0x63,0x07,0xD0,0x42,0xF8,0xBD,0x40,0x63,0xB8,0xE4,0x00,0x00,0x0D,0x98, +0x60,0x85,0x29,0x8B,0x23,0x20,0x80,0x96,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFE,0xF7, +0x01,0x44,0x0B,0x17,0x02,0x0A,0xF7,0x00,0xD7,0x17,0x00,0xDA,0xCC,0x79,0x07,0xD0, +0x42,0xF8,0xBD,0x40,0x63,0xB8,0xE4,0x00,0x00,0x1B,0x20,0x84,0x1E,0xE7,0xFF,0xFF, +0x65,0x98,0x60,0x85,0x29,0x5C,0x84,0x00,0x5C,0xA5,0x00,0x4C,0x84,0x30,0x5C,0xC6, +0x00,0x8C,0x85,0x4C,0x84,0x08,0x8C,0x64,0xD0,0xC8,0x00,0x59,0x0C,0x03,0x01,0xE4, +0x00,0x00,0x3F,0x52,0xE0,0x64,0x20,0xC0,0x54,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB6, +0xFA,0x9C,0xC1,0x4C,0xC6,0x0A,0x8C,0xD7,0x12,0xE6,0xFF,0x0E,0xE3,0x01,0x85,0x29, +0xFC,0x21,0xFE,0x88,0xEE,0x21,0x01,0x54,0xEE,0x41,0x01,0x50,0xED,0x21,0x01,0x74, +0xED,0x41,0x01,0x70,0xED,0x61,0x01,0x6C,0xED,0x81,0x01,0x68,0xED,0xA1,0x01,0x64, +0xED,0xC1,0x01,0x60,0xED,0xE1,0x01,0x5C,0xEE,0x01,0x01,0x58,0xEE,0x61,0x01,0x4C, +0xEE,0x81,0x01,0x48,0xEE,0xA1,0x01,0x44,0x5E,0x23,0x00,0x8A,0x44,0x5C,0xA5,0x00, +0x4F,0x11,0x08,0x9A,0xE1,0xD4,0xB8,0x00,0x94,0x43,0x18,0x28,0x9A,0xE0,0x23,0x00, +0x24,0x1E,0xF8,0x01,0x5E,0xF7,0x00,0x43,0x05,0xBB,0x5F,0x08,0x11,0x20,0x00,0x21, +0x9E,0xFF,0x5E,0xF7,0x00,0x42,0x17,0x2B,0x8B,0x41,0x5E,0x10,0x00,0x9B,0x00,0x41, +0xD0,0x8D,0x9D,0xC2,0x5D,0xCE,0x00,0xE4,0x00,0x00,0x4D,0x43,0x7A,0xCC,0x13,0xBC, +0x00,0x9F,0x21,0x1B,0xBB,0x00,0xE4,0x00,0x00,0x13,0x9B,0x20,0x43,0x86,0xC4,0x5F, +0x79,0x00,0xD6,0xFB,0xFF,0x4D,0x9F,0x01,0x8F,0x57,0x5F,0x18,0x00,0xD7,0x05,0xFF, +0x6E,0x99,0x60,0x52,0x80,0x40,0xE4,0x00,0x01,0xC9,0x21,0x60,0x56,0x13,0x12,0x00, +0x1E,0xE1,0x00,0x1F,0x18,0x40,0x8E,0xED,0x12,0xF7,0x00,0xE4,0x00,0x00,0x21,0x13, +0x15,0x00,0x42,0xF3,0x6C,0x1F,0x18,0x40,0x12,0xF7,0xFF,0x43,0x18,0xBD,0x4E,0xF8, +0xFA,0x4E,0xF7,0xD1,0x40,0xD8,0xBC,0x54,0xC6,0x3F,0x40,0xC6,0xBD,0x5C,0xC6,0x00, +0x5C,0xC4,0x13,0x20,0x00,0x25,0x40,0xD4,0x35,0x5C,0xC6,0x00,0x1C,0x61,0x40,0x21, +0x60,0x7A,0x98,0x80,0x88,0xAC,0xE7,0xFF,0xFD,0x9E,0x21,0x81,0x78,0x0B,0x0A,0x81, +0xEA,0xEA,0xFF,0x7F,0x8E,0xF8,0x0E,0xEA,0x81,0xE4,0x00,0x00,0x9F,0x98,0x81,0x88, +0xAC,0x21,0x64,0x56,0xE7,0xFF,0xFD,0x62,0x21,0x81,0x00,0x0B,0x0A,0xFF,0xEA,0xEA, +0xFF,0x7F,0xE4,0x00,0x00,0x45,0xE7,0xFF,0xFD,0x3E,0x21,0x80,0x52,0xEB,0x01,0x00, +0xC1,0x0A,0xE1,0x41,0x8E,0xF8,0xEE,0xE1,0x00,0xC1,0xE4,0x00,0x00,0x3D,0x0B,0x0A, +0xFF,0x0A,0xEA,0x81,0x5F,0x57,0x04,0x5F,0x38,0x04,0xD7,0x3A,0x00,0x31,0x8A,0xF8, +0x0B,0x0A,0x01,0x8E,0xF8,0x0E,0xEA,0x01,0x9D,0xA1,0x9D,0x42,0x5D,0x8D,0x00,0xD5, +0xCC,0xFA,0x5D,0x21,0x60,0x76,0x9D,0x61,0x5D,0x6B,0x00,0xE4,0x00,0x00,0x3F,0x0B, +0x0F,0x01,0x9E,0xE1,0x0F,0x0F,0x81,0x5E,0xF7,0x00,0x9D,0xE2,0xE4,0x00,0x00,0x0D, +0x9A,0xE0,0xD6,0xEE,0xFF,0x6E,0xE7,0xFF,0xFF,0xC1,0xD5,0x71,0x00,0xC2,0xFD,0xE1, +0x00,0xC0,0x1E,0x61,0x00,0x89,0x4F,0x99,0xA0,0x42,0xB2,0x5C,0x8E,0x6B,0xE7,0xFF, +0xFF,0x7D,0x21,0x64,0x26,0x9D,0xDF,0xE4,0x00,0x00,0x0F,0x1D,0xCE,0x3F,0xFE,0xE1, +0x01,0x40,0x4D,0xCE,0x08,0x8D,0xD7,0xE8,0x6E,0xFF,0x01,0x42,0x03,0x80,0xEE,0xA1, +0x01,0x46,0x5C,0x70,0x00,0xEE,0x81,0x01,0x4A,0xEE,0x61,0x01,0x4E,0xEE,0x41,0x01, +0x52,0xEE,0x21,0x01,0x56,0xEE,0x01,0x01,0x5A,0xED,0xE1,0x01,0x5E,0xED,0xC1,0x01, +0x62,0xED,0xA1,0x01,0x66,0xED,0x81,0x01,0x6A,0xED,0x61,0x01,0x6E,0xED,0x41,0x01, +0x72,0xED,0x21,0x01,0x76,0xFC,0x21,0x01,0x78,0x85,0x29,0x5C,0x84,0x06,0x5C,0xA5, +0x06,0x43,0x24,0x2C,0x9B,0x02,0x43,0x19,0xC0,0x53,0x20,0x1E,0x5E,0xE3,0x06,0xC7, +0x18,0xFF,0xFF,0x40,0x84,0x2D,0x98,0x60,0xCC,0x84,0x00,0x0A,0x40,0x84,0xC8,0xC4, +0x84,0xFF,0xFF,0x43,0x38,0x25,0xD6,0xF9,0x00,0x60,0x8C,0x98,0x5C,0x97,0x1D,0x48, +0x61,0x01,0x85,0x29,0x24,0x80,0x68,0x24,0x7C,0x34,0xCE,0xE3,0x03,0xE8,0x98,0x61, +0xE4,0x00,0x00,0x49,0xCE,0xE3,0xFC,0x18,0x98,0x64,0xE4,0x00,0x00,0x35,0x20,0x80, +0x74,0x24,0x7C,0x34,0xCE,0xE3,0xFC,0x18,0x98,0x62,0xE4,0x00,0x00,0x15,0xCE,0xE3, +0x03,0xE8,0x98,0x63,0x40,0x97,0x20,0xE7,0xFF,0xF9,0x23,0x9A,0xE0,0x20,0x60,0x3C, +0x5C,0x60,0x11,0x52,0xE0,0x30,0x53,0x00,0x10,0x4A,0xF8,0xB8,0x88,0x77,0x85,0x29, +0x0A,0xE3,0x00,0x26,0xFC,0x60,0xC3,0x00,0x10,0x01,0xEB,0x18,0x06,0x51,0x5F,0x38, +0x06,0x5E,0xF8,0x1D,0x4A,0xF9,0xB8,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x0E,0xE3,0x01, +0xC3,0x00,0x10,0x01,0x0A,0xE4,0x00,0xFF,0x18,0x06,0x4A,0x26,0xFC,0x4C,0x0B,0x38, +0x07,0x5F,0x59,0x06,0x5E,0xF9,0x1D,0x4A,0xFA,0xB8,0xE4,0x00,0x00,0x0D,0x9A,0xE0, +0x0E,0xE4,0x01,0x13,0x38,0x04,0x23,0x28,0x64,0x23,0x2C,0x8C,0x23,0x20,0xA6,0x0B, +0x23,0x00,0x0E,0xE3,0x01,0x0A,0xF8,0x07,0x42,0xF7,0xCD,0xE4,0x00,0x00,0x15,0x0B, +0x18,0x09,0x42,0xF8,0xBD,0x0E,0xE4,0x01,0xE4,0x00,0x00,0x1B,0x0B,0x03,0x00,0x0E, +0xE3,0x01,0x0F,0x04,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0x6D,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x06,0x59,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D, +0x61,0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0C,0x61,0x07,0x0C,0x81,0x05,0x0D,0x21, +0x2C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E,0x21,0x0C,0x5D,0xA5,0x00, +0x1C,0x61,0x06,0x1C,0x81,0x04,0xE7,0xFF,0xFE,0x94,0xC2,0xE0,0x10,0x01,0x09,0x81, +0x04,0xFF,0x17,0x06,0x4A,0xEA,0xF7,0x06,0x4B,0x0B,0x18,0x03,0x41,0x8C,0xC3,0x41, +0x8C,0xB8,0x5D,0x8C,0x06,0x0D,0x81,0x05,0xC1,0x40,0x10,0x01,0xC1,0x60,0x10,0x01, +0xFD,0x4A,0x05,0x3C,0xFD,0x6B,0x05,0x40,0xD1,0xA1,0x06,0x9E,0xC1,0xC0,0x10,0x01, +0xC1,0xA0,0x10,0x01,0x0E,0xEA,0x02,0xFD,0xCE,0x05,0x18,0xFD,0xAD,0x05,0x9E,0x22, +0xE4,0x68,0x22,0xE0,0x34,0x98,0x60,0xD2,0xE3,0x08,0x25,0xE4,0x00,0x00,0xD7,0x0A, +0xE1,0x07,0x0E,0xED,0x01,0xE4,0x00,0x00,0xAB,0xC2,0xE0,0x10,0x01,0x0A,0x21,0x06, +0xEE,0x37,0x05,0x15,0xC2,0xE0,0x10,0x01,0x09,0xED,0x00,0xED,0x97,0x06,0x47,0x41, +0xEF,0x8D,0x4E,0xEF,0xFA,0x0A,0x0E,0x00,0x45,0xF7,0x7E,0x42,0x10,0x65,0x41,0xEF, +0xBD,0x4E,0xF0,0xFA,0x46,0x17,0x86,0x42,0x10,0xBD,0xC2,0xE0,0x10,0x01,0xE8,0x77, +0x06,0x59,0xE7,0xFF,0xF7,0x04,0x42,0x10,0x83,0x41,0xEF,0x7B,0x40,0x63,0x1B,0x8D, +0xF0,0x9A,0xE3,0xD5,0xE3,0x05,0x18,0x0E,0x2D,0x01,0x0D,0x8E,0x01,0x0C,0x0B,0x01, +0x9A,0xE2,0xE4,0x00,0x01,0x29,0x0A,0xE1,0x06,0x09,0xAD,0x00,0x41,0xAD,0xBD,0x4E, +0xED,0xFA,0x45,0xB7,0x6E,0x41,0xAD,0xBD,0x0A,0xEE,0x00,0x41,0x97,0x65,0x4E,0xEC, +0xFA,0x45,0x97,0x66,0x41,0x8C,0xBD,0xC2,0xE0,0x10,0x01,0x41,0x8C,0x63,0xE8,0x77, +0x06,0x59,0x41,0xAD,0x6B,0xE7,0xFF,0xF6,0x5E,0x8D,0x8D,0x40,0x63,0x1B,0xD5,0x83, +0x01,0x88,0x9A,0xE4,0x0E,0xEA,0x00,0xE4,0x00,0x00,0x51,0x21,0xA1,0x26,0x0E,0xEA, +0x02,0x22,0xE8,0x60,0x26,0xE8,0x2B,0x22,0xE5,0x0A,0xE4,0x00,0x00,0x2B,0x22,0xEC, +0x90,0xD2,0xE4,0x01,0xC6,0xE4,0x00,0x00,0x51,0x9A,0xE1,0xE4,0x00,0x00,0x57,0xC2, +0xE0,0x10,0x01,0x0B,0x0B,0x01,0xEA,0xF7,0x06,0x6D,0xD7,0x17,0x00,0xF9,0xE4,0x00, +0x00,0x2D,0x9A,0xE4,0x98,0x61,0x0E,0xEA,0x00,0xE4,0x00,0x00,0x25,0x0C,0x0A,0x00, +0xE4,0x00,0x00,0x13,0x9A,0xE4,0x0E,0xEA,0x00,0x98,0x60,0x0A,0xEB,0x01,0x0E,0x21, +0x0E,0x9E,0xE1,0x0E,0x01,0x12,0x0E,0xEB,0x01,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D, +0xA1,0x1E,0x0D,0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21, +0x30,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x05,0x45,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x06,0x5C,0x85,0x29,0x9B,0x01,0xC2,0xE0,0x10,0x01,0x1C,0x21,0xB0,0xFB,0x17, +0x05,0x42,0x0D,0x41,0x48,0x0D,0x61,0x44,0x0D,0x81,0x40,0x0E,0x01,0x30,0x0E,0x21, +0x2C,0x0E,0x41,0x28,0x0E,0x61,0x24,0x0E,0x81,0x20,0x0E,0xA1,0x1C,0x0E,0xC1,0x18, +0x0C,0x61,0x17,0x0C,0x81,0x15,0x0D,0x21,0x4C,0x0D,0xA1,0x3C,0x0D,0xC1,0x38,0x0D, +0xE1,0x34,0x1C,0x61,0x16,0x1C,0x81,0x14,0xE7,0xFF,0xFA,0xF0,0xC2,0xE0,0x10,0x01, +0x09,0x41,0x16,0xED,0x57,0x05,0x49,0xC2,0xE0,0x10,0x01,0xFF,0x17,0x06,0x4A,0xEA, +0xF7,0x06,0x4B,0x0B,0x18,0x03,0x09,0x61,0x14,0x41,0x6B,0xC3,0x41,0x6B,0xB8,0xC2, +0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x5D,0x6B,0x06,0xED,0x77,0x05,0xF3,0xEA,0xF8, +0x05,0x45,0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xF8,0x05,0x45,0xC3,0x20,0x10,0x01,0xC2, +0x60,0x10,0x01,0xC2,0x40,0x10,0x01,0xC2,0x80,0x10,0x01,0xC2,0xA0,0x10,0x01,0xC3, +0x00,0x10,0x01,0xC2,0xC0,0x10,0x01,0xC3,0x40,0x10,0x01,0xFF,0x39,0x06,0x48,0xFE, +0x73,0x05,0x4A,0xFE,0x52,0x05,0x16,0xFE,0x34,0x05,0x4C,0xFE,0x15,0x06,0x44,0xFF, +0x18,0x05,0xF4,0xFE,0xD6,0x04,0xC4,0xFD,0x9A,0x01,0x44,0xD2,0xE1,0x04,0x3E,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x05,0x3A,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x05,0x46,0xC2, +0xE0,0x10,0x01,0xC3,0x60,0x10,0x01,0xEC,0x17,0x06,0x5C,0xC3,0x40,0x10,0x01,0x0D, +0x4C,0x01,0x0D,0x4C,0x03,0x0D,0x6C,0x05,0x0D,0x6C,0x07,0x0D,0x4C,0x09,0x0D,0x6C, +0x0B,0x0C,0x0C,0x10,0x0C,0x0C,0x14,0x0D,0x53,0x01,0x0D,0x72,0x01,0x0D,0x51,0x01, +0x0D,0x70,0x01,0x9A,0xE0,0xFF,0x7B,0x05,0x4E,0xFF,0x5A,0x05,0xA0,0x43,0x98,0xBC, +0x0C,0x1C,0x01,0x43,0x96,0xBC,0x0C,0x1C,0x01,0x43,0x9B,0xBC,0x0C,0x1C,0x01,0x43, +0x9A,0xBC,0x0C,0x1C,0x01,0x9E,0xE2,0x5E,0xEA,0x09,0x23,0xFF,0x8D,0x9A,0xE1,0x0D, +0x58,0x01,0x0D,0x76,0x01,0x0D,0x5B,0x01,0x0D,0x7A,0x01,0x1A,0xF9,0x00,0xE4,0x00, +0x03,0x49,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x05,0x3A,0x5E,0xE3,0xBB,0x20,0x04,0xF5, +0x09,0xF3,0x00,0x40,0x8A,0x7D,0x0F,0x01,0x04,0x0C,0x81,0x0C,0x0F,0x21,0x08,0x50, +0x60,0x23,0xE7,0xFF,0xF2,0x44,0x09,0xD2,0x00,0x0C,0x81,0x0E,0x41,0xAB,0x75,0x43, +0x64,0x23,0x42,0xED,0x6B,0x40,0x63,0x1B,0x8E,0xFB,0x0F,0x01,0x06,0x0F,0x21,0x0A, +0xD6,0xE3,0x0B,0x10,0x12,0xF9,0x00,0x5E,0xE4,0xDB,0x20,0x00,0x51,0x4F,0x77,0x08, +0x8F,0x1B,0x8E,0xDB,0x0D,0x58,0x01,0x0D,0x76,0x01,0xE4,0x00,0x00,0x1D,0xFF,0x60, +0x7F,0xFF,0x0F,0x78,0x4F,0x0F,0x76,0x4F,0x1E,0xD7,0x01,0x5E,0xD6,0x00,0x1A,0xD9, +0x00,0x0A,0xEC,0x00,0xD6,0xEA,0x00,0x38,0x0D,0x4C,0x01,0x0B,0x0C,0x02,0x8A,0xEC, +0xD5,0x58,0x00,0x38,0x0D,0x4C,0x03,0x0B,0x17,0x04,0xD7,0x0B,0x00,0x38,0x0D,0x77, +0x05,0x0A,0xEC,0x06,0xD5,0x77,0x00,0x38,0x0D,0x6C,0x07,0x4E,0xE4,0xFA,0x47,0x17, +0x26,0x42,0xF8,0xBD,0x0F,0x0C,0x12,0x8E,0xF8,0x0E,0xEC,0x10,0x4E,0xED,0xFA,0x47, +0x17,0x6E,0x42,0xF8,0xBD,0x0F,0x0C,0x16,0x8E,0xF8,0x88,0x6D,0x0E,0xEC,0x14,0xE7, +0xFF,0xF6,0xCA,0xC3,0x00,0x10,0x01,0xF8,0x78,0x05,0x3B,0xC1,0xA0,0x10,0x01,0x89, +0x83,0x5E,0xE3,0x00,0xFD,0xAD,0x05,0xF0,0x22,0xC9,0x94,0x26,0xC9,0x95,0x13,0x2D, +0x00,0x1F,0x39,0x40,0x43,0x39,0xBD,0x4F,0x19,0xFA,0x4F,0x18,0xD1,0x42,0xF9,0xC4, +0x56,0xF7,0x3F,0x42,0xD7,0xC5,0x5E,0xF6,0x00,0x0E,0xE1,0x10,0x26,0xEC,0x31,0x57, +0x16,0xFF,0x5F,0x07,0x91,0x20,0x01,0x65,0xC3,0x00,0x10,0x01,0xF3,0x18,0x05,0x3A, +0x23,0x00,0xC2,0x08,0x91,0x00,0x40,0x8F,0x25,0x08,0x70,0x00,0x40,0x6E,0x1D,0xE7, +0xFF,0xF6,0x0A,0xE7,0xFF,0xEE,0x56,0x0E,0xE1,0x12,0xD2,0xE7,0x00,0x69,0x56,0xF6, +0xFF,0x5E,0xE7,0x11,0x20,0x01,0x71,0x0D,0xF1,0x01,0x0D,0xD0,0x01,0x19,0x8D,0x00, +0x0D,0x53,0x01,0x0D,0x72,0x01,0xE4,0x00,0x00,0xB9,0x5E,0xE3,0xC9,0x20,0x01,0x55, +0x9B,0x01,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x06,0x5C,0xE4,0x00,0x00,0x91,0x0B,0x10, +0x00,0x0B,0x31,0x00,0x43,0x18,0x75,0x43,0x39,0x7D,0x0F,0x01,0x04,0x0F,0x21,0x08, +0x50,0x60,0x23,0xE7,0xFF,0xEF,0xA2,0x0F,0x21,0x0A,0x0F,0x01,0x06,0x43,0x39,0xCB, +0x43,0x18,0xC3,0x40,0x63,0x1B,0x8F,0x19,0xD7,0x03,0xFC,0x5C,0xE7,0xFF,0xFE,0xF9, +0xC2,0xE0,0x10,0x01,0xF3,0x17,0x05,0x46,0x9F,0x01,0xFB,0x17,0x05,0x46,0xE7,0xFF, +0xFF,0x33,0x0E,0xC1,0x1A,0x0E,0xA1,0x1E,0x0E,0x81,0x22,0x0E,0x61,0x26,0x0E,0x41, +0x2A,0x0E,0x21,0x2E,0x0E,0x01,0x32,0x0D,0xE1,0x36,0x0D,0xC1,0x3A,0x0D,0xA1,0x3E, +0x0D,0x81,0x42,0x0D,0x61,0x46,0x0D,0x41,0x4A,0x0D,0x21,0x4E,0x1C,0x21,0x50,0x85, +0x29,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x06,0x68,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06, +0x64,0x85,0x29,0xFC,0x21,0xFF,0x58,0xED,0x61,0x00,0x9C,0x0E,0xC1,0x70,0xED,0x21, +0x00,0xA4,0xED,0x41,0x00,0xA0,0xED,0x81,0x00,0x98,0xED,0xA1,0x00,0x94,0xED,0xC1, +0x00,0x90,0xED,0xE1,0x00,0x8C,0xEE,0x01,0x00,0x88,0xEE,0x21,0x00,0x84,0xEE,0x41, +0x00,0x80,0x0E,0x61,0x7C,0x0E,0x81,0x78,0x0E,0xA1,0x74,0xFE,0xC1,0x00,0xA8,0xC2, +0xE0,0x10,0x01,0xC1,0x60,0x10,0x01,0xEA,0xF7,0x05,0x4A,0xFD,0x6B,0x01,0x44,0xC3, +0x00,0x10,0x01,0x0C,0x76,0xA0,0xEB,0x18,0x05,0x16,0x0C,0x36,0xA4,0x0E,0xEB,0x0D, +0x0F,0x0B,0x0F,0xC3,0x20,0x10,0x01,0xF3,0x39,0x05,0x3A,0x5F,0x23,0xDB,0x20,0x00, +0x85,0xC3,0x20,0x10,0x01,0xE8,0x79,0x06,0x44,0xC3,0x20,0x10,0x01,0xE8,0x99,0x05, +0x4C,0x40,0x97,0x25,0x40,0x78,0x1D,0xE7,0xFF,0xF3,0x7A,0xE7,0xFF,0xEB,0xC6,0x0C, +0x6B,0x12,0x0D,0x4B,0x16,0x98,0x80,0x0C,0x6B,0x18,0x0D,0x4B,0x1C,0xE7,0xFF,0xEE, +0x0C,0x0C,0x6B,0x10,0x88,0x6A,0xE7,0xFF,0xED,0xB2,0x0B,0x0B,0x00,0x0C,0x6B,0x14, +0xC2,0xE0,0x10,0x01,0x0B,0x2B,0x02,0xEA,0xF7,0x06,0x54,0x43,0x39,0xC5,0xC3,0x00, +0x10,0x01,0xFE,0x38,0x06,0x60,0xD6,0xF9,0x00,0x88,0x0B,0x4B,0x06,0x0B,0x2B,0x04, +0x43,0x3A,0xCD,0xD6,0xF9,0x00,0xEC,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x06,0x5E,0x22, +0xE4,0x44,0xC2,0xE0,0x10,0x01,0xFD,0x57,0x05,0x1A,0x13,0x2A,0x20,0x27,0x24,0x5B, +0xC2,0xE0,0x10,0x01,0xEC,0x16,0xFF,0x78,0xEC,0x17,0x06,0x5C,0x0C,0x16,0x80,0xE4, +0x00,0x10,0x67,0x0C,0x36,0x9C,0x0F,0x31,0x02,0xEC,0x16,0xFF,0x78,0x0F,0x39,0x02, +0x0C,0x16,0x80,0x0B,0x39,0x01,0x0C,0x16,0x90,0x9F,0x27,0x99,0x80,0x4F,0x39,0x19, +0x4F,0x39,0x18,0x40,0x21,0xCD,0xEC,0x36,0xFF,0x70,0x40,0x21,0xCD,0xEC,0x36,0xFF, +0x64,0xE4,0x00,0x0F,0xCB,0x4F,0x0C,0x20,0xEF,0x16,0xFF,0x68,0x0E,0xF7,0x06,0x8E, +0xF8,0x11,0xB7,0x05,0x5D,0xA3,0xFB,0x20,0x00,0x45,0xC3,0x20,0x10,0x01,0xEF,0x19, +0x06,0x6A,0x8B,0x2D,0xE4,0x00,0x00,0x25,0x1F,0x2D,0xE0,0xC3,0x40,0x10,0x01,0x5F, +0x39,0x00,0xEF,0x1A,0x06,0x66,0x9B,0x41,0x4F,0x3A,0xCC,0x47,0x19,0xC4,0xD3,0x00, +0x0A,0x12,0x1F,0x0D,0xFF,0x27,0x0D,0x13,0x10,0xB7,0x04,0x0C,0xD7,0x02,0x10,0x6A, +0x20,0x9A,0xE0,0x20,0xA0,0x30,0x88,0x8A,0xE7,0xFF,0xED,0x10,0x5E,0xE3,0x00,0xEF, +0x16,0xFF,0x72,0x8F,0x0C,0x1A,0xF8,0x00,0x0E,0xF1,0x02,0xEF,0x16,0xFF,0x6A,0x0E, +0xF7,0x06,0x8E,0xF8,0x10,0xAA,0x20,0x10,0x77,0x04,0x0C,0x97,0x02,0x88,0xCA,0x9A, +0xE0,0xD0,0xA0,0x07,0x5E,0xE4,0x00,0x01,0xDD,0x99,0xC0,0x99,0xFB,0x8A,0x0E,0xD1, +0xAA,0x03,0x66,0x99,0xE0,0x1C,0x76,0xA8,0x88,0x8F,0xE7,0xFF,0xEA,0x00,0x0E,0xF1, +0x02,0xEF,0x36,0xFF,0x6A,0x0E,0xF7,0x06,0x10,0x6A,0x20,0x8E,0xF9,0x10,0xB7,0x04, +0x0C,0xD7,0x02,0x20,0xA0,0x54,0x1C,0x96,0xA8,0xE7,0xFF,0xEC,0x4E,0x5C,0x63,0x00, +0xD4,0x70,0x00,0x41,0x8A,0x03,0x89,0xCF,0x9D,0xE4,0x5D,0xEF,0x00,0x5D,0xE8,0x09, +0x23,0xFF,0x15,0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x1A,0x17,0x00,0x5E,0x09,0x73,0x20, +0x02,0xA9,0x1C,0x76,0xA8,0x88,0x8E,0xE7,0xFF,0xE9,0x66,0x0E,0xF1,0x02,0xEF,0x56, +0xFF,0x6A,0x0E,0xF7,0x06,0x8E,0xFA,0xE4,0x00,0x00,0xC9,0x1C,0x76,0xA8,0x88,0x8F, +0xE7,0xFF,0xE9,0x34,0x0E,0xF1,0x02,0xEF,0x16,0xFF,0x6A,0x0E,0xF7,0x06,0x10,0x6A, +0x20,0x8E,0xF8,0x10,0xB7,0x04,0x0C,0xD7,0x02,0x20,0xA0,0x54,0x1C,0x96,0xA8,0xE7, +0xFF,0xEB,0x82,0x5C,0x63,0x00,0xD4,0x70,0x00,0x41,0x8A,0x03,0x89,0xCF,0x9D,0xE1, +0x5D,0xEF,0x02,0xD1,0xE6,0xFE,0x46,0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x1A,0x17,0x00, +0x5E,0x09,0x73,0x20,0x01,0x19,0x1C,0x76,0xA8,0x88,0x8E,0xE7,0xFF,0xE8,0x9E,0x0E, +0xF1,0x02,0xEF,0x36,0xFF,0x6A,0x0E,0xF7,0x06,0x8E,0xF9,0x10,0x77,0x04,0x0C,0x97, +0x02,0x10,0xAA,0x20,0x9A,0xE0,0x20,0xA0,0x34,0x1C,0xD6,0xA8,0xE7,0xFF,0xEA,0xE8, +0x5E,0xE3,0x00,0xEF,0x16,0xFF,0x66,0x8F,0x0C,0x1A,0xF8,0x00,0xE4,0x00,0x00,0x2D, +0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x18,0x17,0x00,0xEE,0xF6,0xFF,0x66,0x8E,0xEC,0x18, +0x17,0x00,0xEE,0xF6,0xFF,0x72,0x8E,0xEC,0x12,0xF7,0x00,0x0E,0xF6,0x94,0x5E,0xE9, +0x53,0x20,0x19,0x01,0xEE,0xF6,0xFF,0x66,0x8E,0xEC,0x12,0xF7,0x00,0x0E,0xF6,0x98, +0x5E,0xE8,0xB3,0x20,0x18,0xB9,0x0B,0x4B,0x08,0x0A,0xEB,0x02,0x0B,0x0B,0x00,0x0B, +0x2B,0x06,0xEF,0x56,0xFF,0x58,0xEE,0xF6,0xFF,0x60,0xEF,0x16,0xFF,0x74,0xEF,0x36, +0xFF,0x5C,0x0A,0x0B,0x0C,0x09,0xEB,0x0A,0x09,0xCB,0x0E,0x0A,0x6B,0x04,0xD1,0xA7, +0x01,0x36,0xD5,0xEE,0x2F,0xF8,0x41,0xCE,0x7D,0x4C,0x6E,0xFA,0x45,0xC3,0x76,0x40, +0x6E,0x1D,0xE7,0xFF,0xE8,0xBA,0xC0,0x60,0x18,0xE8,0x20,0x17,0x9D,0x12,0xEA,0x20, +0xE4,0x00,0x08,0xB3,0xEF,0x56,0xFF,0x5A,0x43,0x5A,0x85,0x4E,0xFA,0xFA,0x0F,0x56, +0x84,0x46,0x97,0xD6,0xEF,0x36,0xFF,0x62,0x42,0x94,0xBD,0xEF,0x56,0xFF,0x76,0x42, +0xEF,0x75,0x43,0x39,0xD5,0xEE,0xF6,0xFF,0x7C,0xEF,0x36,0xFF,0x6C,0x4E,0xF7,0xFA, +0xEF,0x16,0xFF,0x7E,0x46,0xB7,0xC6,0x42,0xB5,0xBD,0xEE,0xF6,0xFF,0x5E,0x42,0x57, +0x9D,0xD1,0xA8,0x08,0x7E,0x40,0x77,0x7D,0xE7,0xFF,0xE8,0x0E,0xC0,0x60,0xCE,0x48, +0x20,0x00,0x95,0xEF,0x16,0xFF,0x62,0x98,0x80,0x40,0x78,0x85,0xE7,0xFF,0xE8,0x2E, +0xC0,0x60,0x19,0x08,0x20,0x00,0x45,0x12,0xEA,0x20,0x8E,0xEA,0x12,0xF7,0xFF,0x5E, +0xE5,0xFB,0x20,0x15,0xBD,0x42,0xB5,0xAB,0x42,0x94,0xA3,0x42,0x52,0x93,0x8E,0x95, +0xEF,0x36,0xFF,0x6E,0xCE,0x94,0x00,0x64,0x42,0xF9,0xCB,0x8E,0x57,0x4E,0x52,0x18, +0xD6,0x54,0x00,0x91,0x40,0x6E,0x9D,0xE7,0xFF,0xE7,0x70,0xC0,0x60,0x18,0xE8,0x20, +0x15,0x09,0xEF,0x56,0xFF,0x62,0xEE,0xF6,0xFF,0x5A,0x98,0x80,0x40,0x7A,0xBD,0xE7, +0xFF,0xE7,0x88,0xC0,0x60,0x4A,0xE8,0x20,0x14,0xA9,0x11,0xEA,0x00,0x1E,0xEF,0xF0, +0x5E,0xE3,0xDB,0x20,0x00,0x45,0x12,0xEA,0x01,0x9E,0xF0,0x5E,0xF7,0x00,0x5E,0xE3, +0xD3,0x20,0x14,0x41,0xC3,0x20,0x10,0x01,0xFF,0x39,0x05,0x1A,0x13,0x19,0x20,0x8F, +0x19,0x12,0xF8,0xFF,0x1F,0x37,0xEF,0x5F,0x23,0xDB,0x20,0x00,0x49,0x13,0x18,0xFE, +0x5F,0x02,0x13,0x20,0x00,0x25,0x5F,0x05,0xF3,0x20,0x13,0xA1,0x9E,0xF4,0xD2,0xE6, +0x00,0x9D,0xEC,0x76,0xFF,0x7E,0xE7,0xFF,0xE6,0x92,0xC0,0x60,0x9C,0x4C,0x20,0x13, +0x4D,0x9D,0xF8,0xD1,0xE7,0x21,0xD5,0xEF,0x56,0xFF,0x5E,0x41,0xCE,0xD5,0x4C,0x6E, +0xFA,0x45,0xC3,0x76,0x40,0x6E,0x1D,0xE7,0xFF,0xE6,0x50,0xC0,0x60,0x7C,0xEC,0x20, +0x10,0x79,0xEE,0xF6,0xFF,0x62,0x98,0x80,0x42,0x10,0xBD,0x4C,0x70,0xFA,0x46,0x03, +0x86,0x40,0x70,0x1D,0xE7,0xFF,0xE6,0x5E,0xC0,0x60,0x3E,0x68,0xE4,0x00,0x07,0xFD, +0xD1,0xAA,0x0E,0xFE,0xEF,0x16,0xFF,0x5A,0x43,0x10,0xC5,0x4E,0xF8,0xFA,0x0F,0x16, +0x88,0x44,0x77,0xC6,0x98,0x80,0x40,0x63,0xBD,0xE7,0xFF,0xE6,0x14,0x0C,0x76,0x8C, +0xC0,0x60,0xAF,0x0C,0x20,0x00,0x69,0x40,0x6E,0x7D,0x4E,0xE3,0xFA,0x44,0x77,0x1E, +0x40,0x63,0xBD,0xE7,0xFF,0xE5,0x98,0xC0,0x60,0xAF,0x08,0x20,0x00,0xF5,0xEF,0x36, +0xFF,0x5E,0x88,0x6F,0x88,0x99,0x88,0xB3,0xE7,0xFF,0xEA,0x86,0x20,0x60,0x52,0xEF, +0x56,0xFF,0x5E,0x88,0x6E,0x88,0x9A,0x88,0xB3,0xE7,0xFF,0xEA,0x64,0x20,0x60,0x6C, +0xEE,0xF6,0xFF,0x5A,0xD6,0x17,0x00,0xA0,0x0C,0x76,0x8A,0x98,0x80,0xE7,0xFF,0xE5, +0x6C,0xC0,0x60,0x32,0x0C,0x20,0x10,0x71,0xEF,0x16,0xFF,0x6E,0x42,0xF8,0xC3,0x42, +0xB5,0xAB,0x42,0x94,0xA3,0x42,0x52,0x93,0x8E,0x95,0x8E,0x57,0xCE,0x94,0x00,0x64, +0x4E,0xF2,0x18,0xD6,0x97,0x01,0xA1,0x40,0x6E,0x9D,0xE7,0xFF,0xE4,0xCA,0xC0,0x60, +0x18,0xEC,0x20,0x00,0x95,0x12,0xEA,0x01,0x9E,0xF0,0x5E,0xF7,0x00,0x5E,0xE3,0xD3, +0x20,0x00,0x5D,0xEF,0x36,0xFF,0x76,0x98,0x80,0x40,0x70,0xCD,0xE7,0xFF,0xE4,0xCE, +0xC0,0x60,0x2B,0xCC,0x20,0x0F,0x35,0x12,0xAA,0x00,0x1E,0xF5,0xF8,0x5E,0xE6,0x13, +0x20,0x00,0xAD,0xEF,0x56,0xFF,0x5E,0x40,0x7A,0x7D,0xE7,0xFF,0xE4,0x4A,0xC0,0x60, +0xC7,0xEC,0x20,0x00,0x65,0x40,0x6F,0x9D,0xE7,0xFF,0xE4,0x2E,0xC0,0x60,0xC7,0xEC, +0x20,0x00,0x2D,0xCE,0xF2,0x00,0x06,0xD6,0x97,0x1C,0xD5,0xCE,0x52,0x00,0x0C,0xD6, +0x92,0x01,0x39,0x12,0xEA,0x01,0xD2,0xEF,0x01,0x05,0x0C,0x76,0x86,0x98,0x80,0xE7, +0xFF,0xE4,0x28,0x5C,0x6C,0x91,0x20,0x00,0x41,0x40,0x6E,0x7D,0xE7,0xFF,0xE3,0xC6, +0x5C,0x6C,0x99,0x20,0x0D,0xB9,0x1E,0xB5,0xDB,0x5E,0xA2,0x3B,0x20,0x00,0x85,0x12, +0xEA,0x20,0x8E,0xEA,0x12,0xF7,0xFF,0x5E,0xE4,0x93,0x20,0x00,0x4D,0x5E,0xE6,0xDB, +0x20,0x00,0x35,0x0E,0xF6,0x8E,0xC2,0xE0,0x7D,0x0C,0x20,0x0D,0x1D,0xEC,0x76,0xFF, +0x7E,0xE7,0xFF,0xE3,0x5C,0xC0,0x60,0xBB,0x88,0x20,0x00,0x65,0xEF,0x16,0xFF,0x62, +0xEF,0x36,0xFF,0x76,0x88,0x70,0x88,0x98,0x88,0xB9,0xE7,0xFF,0xE8,0x42,0xD0,0x60, +0x19,0x1E,0x40,0x6E,0x7D,0x4E,0xE3,0xFA,0x44,0x77,0x1E,0x40,0x63,0xBD,0xE7,0xFF, +0xE3,0x02,0xC0,0x60,0xBB,0x88,0x20,0x00,0x5D,0xEF,0x56,0xFF,0x5E,0xD5,0xFA,0x18, +0x22,0xD5,0xF3,0x18,0x02,0xD5,0xDA,0x17,0xE2,0xD5,0xD3,0x17,0xC2,0x0E,0xF6,0x8E, +0xC2,0xE0,0xBB,0x88,0x20,0x00,0x7D,0xEF,0x16,0xFF,0x5A,0xEF,0x36,0xFF,0x62,0xD7, +0x19,0x17,0x12,0xEF,0x56,0xFF,0x76,0xD7,0x1A,0x16,0xD2,0xD6,0x19,0x16,0xB2,0xD6, +0x1A,0x16,0x92,0xEE,0xF6,0xFF,0x62,0xEF,0x16,0xFF,0x5A,0x98,0x80,0x40,0x77,0xC5, +0xE7,0xFF,0xE2,0xA6,0xC0,0x60,0xBB,0x8C,0x4A,0xE1,0x01,0xE4,0x00,0x04,0x49,0xC2, +0xE0,0x10,0x01,0x1F,0x0D,0xFD,0xFE,0xF7,0x06,0x4A,0x27,0x04,0xE7,0x0B,0x17,0x03, +0x0B,0x37,0x01,0xCF,0x18,0x01,0x2C,0x43,0x18,0xC8,0xD6,0x58,0x14,0xBC,0x0B,0x17, +0x07,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x03,0x2A,0x12,0xF7,0x00,0x42,0xF8,0xBB,0x53, +0x00,0x64,0x42,0xF7,0xC0,0x0F,0x0B,0x1A,0xD6,0xF8,0x13,0xCC,0x0E,0xEB,0x12,0xE4, +0x00,0x01,0x51,0x1F,0x0D,0xFF,0xD3,0x01,0x05,0x65,0x13,0x4A,0x20,0x13,0x2A,0x00, +0x23,0x44,0x98,0x13,0x0A,0x01,0x43,0x99,0xC5,0x8F,0x38,0x4F,0x7C,0xFA,0x4F,0x39, +0x0A,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x7B,0x00,0x5F,0x63,0xFB,0x20,0x00,0x1B, +0x1F,0x39,0x20,0x57,0x39,0x3F,0x9B,0x00,0x1F,0xB9,0x40,0x53,0xC0,0x40,0xE4,0x00, +0x00,0x63,0x43,0x2A,0xC4,0x13,0x99,0x00,0x43,0x9D,0xE5,0x4F,0x7C,0xFA,0x4F,0x7B, +0xD1,0x43,0x3C,0xDC,0x57,0x39,0x3F,0x43,0x39,0xDD,0x5F,0x39,0x00,0x5F,0x24,0x13, +0x20,0x00,0x25,0x43,0x3E,0xCD,0x5F,0x39,0x00,0x9F,0x01,0xD3,0x24,0x10,0x35,0x5F, +0x78,0x00,0xD7,0x5B,0xFE,0x85,0xE4,0x00,0x04,0x8D,0xC3,0x20,0x10,0x01,0xEF,0x19, +0x03,0x26,0x13,0x38,0x00,0x0B,0x17,0x09,0x43,0x39,0xC3,0x53,0x00,0x64,0x43,0x39, +0xC1,0x0B,0x17,0x03,0x43,0x39,0xC3,0x0B,0x17,0x01,0x42,0xF9,0xC0,0x0F,0x0B,0x1E, +0xD6,0xF8,0x0E,0x8C,0x0E,0xEB,0x16,0xC2,0xE1,0x06,0x8C,0x20,0x07,0x19,0xE4,0x00, +0x02,0x5F,0xD1,0xA9,0x02,0x46,0xC3,0x40,0x10,0x01,0xF6,0xFA,0x05,0x46,0xD2,0xE3, +0x0D,0x9C,0xEE,0xF6,0xFF,0x5A,0x50,0x60,0x64,0x42,0x10,0xBD,0xE7,0xFF,0xDF,0xF0, +0xD4,0x70,0x0D,0x0C,0x12,0xEA,0x20,0xD2,0xE5,0x08,0x31,0x13,0x0A,0x01,0x9F,0x10, +0x5F,0x18,0x00,0x5F,0x03,0xDB,0x20,0x03,0xDD,0x8E,0xEA,0x12,0xF7,0xFE,0x9E,0xF0, +0x5E,0xF7,0x00,0x5E,0xE3,0xD3,0xE4,0x00,0x01,0x35,0xD1,0xA5,0x01,0x16,0x40,0x6E, +0x9D,0xE7,0xFF,0xDF,0xBC,0xC0,0x60,0xA2,0x88,0x20,0x03,0x51,0x12,0xEA,0x00,0x9E, +0xF8,0x5E,0xF7,0x00,0xD2,0xEE,0x0A,0xE9,0xE4,0x00,0x01,0x8B,0xD1,0xA6,0x03,0xDE, +0xEF,0x16,0xFF,0x5E,0x40,0x78,0x7D,0xE7,0xFF,0xDF,0x70,0xC0,0x60,0x9C,0x48,0x20, +0x00,0x79,0x40,0x6E,0x9D,0xE7,0xFF,0xDF,0x54,0xC0,0x60,0x3E,0x6C,0x20,0x00,0x41, +0x12,0xEA,0x00,0x1E,0xF7,0xD8,0x5E,0xF7,0x00,0xD2,0xEE,0x09,0x41,0xEF,0x36,0xFF, +0x5E,0x40,0x79,0x75,0xE7,0xFF,0xDF,0x16,0xC0,0x60,0x7D,0x08,0x20,0x02,0x05,0x40, +0x6F,0x9D,0xE7,0xFF,0xDE,0xFA,0xC0,0x60,0xE0,0xEC,0x20,0x01,0xCD,0x12,0xEA,0x20, +0x8E,0xEA,0x13,0x17,0xFF,0xD3,0x07,0x00,0x7D,0x12,0xF7,0xFE,0xD2,0xE7,0x07,0xAD, +0xE4,0x00,0x00,0xBB,0x5F,0x02,0xD3,0x20,0x03,0xA9,0x12,0xF7,0xFE,0x5E,0xE2,0xD3, +0x20,0x03,0x85,0xE4,0x00,0x00,0x95,0x9A,0xE0,0xD1,0xAB,0x02,0x36,0xEF,0x56,0xFF, +0x5A,0xD6,0x1A,0x00,0x40,0xD5,0xCF,0x06,0x64,0x41,0xCE,0x7D,0x4C,0x6E,0xFA,0x45, +0xC3,0x76,0x40,0x6E,0x1D,0xE7,0xFF,0xDE,0x54,0xC0,0x60,0x25,0x6C,0x20,0x00,0x81, +0xEE,0xF6,0xFF,0x5A,0x98,0x80,0x42,0x10,0xBD,0x4C,0x70,0xFA,0x46,0x03,0x86,0x40, +0x70,0x1D,0xE7,0xFF,0xDE,0x62,0xC0,0x60,0x25,0x68,0x20,0x02,0x5D,0x9A,0xE0,0xEF, +0x36,0xFF,0x6A,0x0F,0x11,0x02,0x0F,0x18,0x06,0x8F,0x19,0x0F,0x38,0x0A,0x23,0x25, +0x92,0x0F,0x4B,0x12,0x23,0x41,0x78,0x0F,0x2B,0x16,0x23,0x21,0x60,0x11,0xD8,0x0C, +0x13,0xD8,0x0D,0x97,0x63,0x11,0x18,0x0E,0xCB,0x7B,0x34,0x50,0x13,0xB8,0x0F,0x41, +0xCE,0xDB,0xCF,0x9E,0x07,0xD0,0xCF,0x1D,0x07,0xD0,0xD1,0xAA,0x00,0xAE,0x22,0xE0, +0x44,0xCF,0x9E,0x46,0x50,0xCF,0x1D,0x46,0x50,0x43,0x9C,0x69,0x43,0x18,0x69,0xCE, +0xFA,0x07,0xD0,0xD6,0xEE,0x01,0xF5,0xCF,0x5A,0x00,0x14,0xD7,0x9A,0x01,0xB5,0xCE, +0xF9,0x07,0xD0,0x43,0x68,0xDB,0xD6,0xFB,0x01,0x5D,0xCF,0x39,0x00,0x14,0xD7,0x19, +0x01,0x1D,0x0E,0xF6,0x96,0x0F,0x56,0x9A,0x0F,0x16,0x92,0x8E,0xFA,0x4E,0xF7,0x0A, +0xD6,0xF8,0x00,0x88,0x5E,0xF7,0x00,0x0D,0x96,0x80,0x0E,0xF6,0x90,0xEE,0xF6,0xFF, +0x78,0x9D,0x81,0x5D,0x8C,0x00,0x0E,0xF1,0x02,0x0F,0x17,0x02,0x0B,0x18,0x01,0xD7, +0x0C,0xC0,0xB5,0xC2,0xE0,0x10,0x01,0xEF,0x36,0xFF,0x7A,0x0C,0x36,0x9E,0xFB,0x37, +0x05,0x43,0xE7,0xFF,0xE7,0x22,0x98,0x62,0xEF,0x56,0xFF,0x7A,0x23,0x41,0x14,0x0E, +0xF1,0x02,0x0F,0x36,0x82,0x0F,0x17,0x06,0x0F,0x56,0xA2,0x4E,0xF9,0x20,0x98,0x61, +0x8E,0xF8,0x12,0xF7,0x05,0x0E,0xFA,0x00,0xE4,0x00,0x00,0x53,0xEF,0x36,0xFF,0x6E, +0x4F,0x19,0xFA,0x46,0x78,0xCE,0x42,0x73,0xC5,0x4F,0x12,0xFA,0x46,0x58,0x96,0x42, +0x52,0xC5,0x4E,0x52,0x12,0xFE,0x52,0x01,0x2C,0xD6,0x72,0xFC,0xC4,0xE7,0xFF,0xFB, +0x3B,0x0C,0x36,0xA6,0x0E,0xC1,0x72,0x0E,0xA1,0x76,0x0E,0x81,0x7A,0x0E,0x61,0x7E, +0xEE,0x41,0x00,0x82,0xEE,0x21,0x00,0x86,0xEE,0x01,0x00,0x8A,0xED,0xE1,0x00,0x8E, +0xED,0xC1,0x00,0x92,0xED,0xA1,0x00,0x96,0xED,0x81,0x00,0x9A,0xED,0x61,0x00,0x9E, +0xED,0x41,0x00,0xA2,0xED,0x21,0x00,0xA6,0xFC,0x21,0x00,0xA8,0x85,0x29,0xC2,0xE0, +0x10,0x01,0x9C,0x38,0xEC,0x77,0x06,0x60,0x0D,0x21,0x04,0x0D,0x41,0x00,0x08,0x61, +0x09,0xC1,0x40,0x10,0x01,0xEC,0x8A,0x06,0x4B,0xFD,0x4A,0x06,0x4A,0x0C,0xAA,0x03, +0x0C,0xCA,0x07,0x0C,0xEA,0x09,0x19,0x0A,0x04,0xE7,0xFF,0xDA,0xF6,0x0D,0x21,0x06, +0x0C,0x6A,0x0B,0x0D,0x41,0x02,0x9C,0x28,0x85,0x29,0x9C,0x30,0x5C,0x63,0x00,0x0D, +0x41,0x08,0x0D,0x61,0x04,0x4C,0x63,0x08,0xC2,0xF8,0x00,0x21,0x0D,0x21,0x0C,0xFE, +0xF7,0xB7,0x22,0x99,0x40,0x8E,0xE3,0x09,0x77,0x01,0x88,0x6A,0x88,0x8B,0x9D,0x41, +0xE4,0x00,0xB7,0xC4,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x9E,0x0D,0x61,0x06,0x0D,0x41, +0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06, +0x71,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0x76,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06, +0x6E,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0x72,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06, +0x79,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06, +0x7C,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0x71,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x06,0x6E,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06,0x76,0xC2,0xE0,0x10,0x01,0xF8, +0x77,0x06,0x72,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x79,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x7C,0x24,0x6C,0x1F,0xE7,0xFF, +0xFE,0x99,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x5C,0x63,0x04,0xEC, +0x77,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0x7C,0xF3,0x78,0x06,0x6E,0xC3, +0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xFF,0x5A,0x06,0x76,0xFF, +0x39,0x06,0x72,0x23,0x60,0x2C,0xEB,0x78,0x06,0x79,0xD7,0x63,0x00,0xA1,0x13,0x5A, +0x00,0xEC,0x78,0x06,0x79,0x1B,0x59,0x00,0x9B,0x01,0xEF,0x17,0x06,0x7C,0x85,0x29, +0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06,0x75,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0x71, +0x5E,0xF8,0x1F,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0x6E, +0x5E,0xE0,0x5B,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x06,0x6E, +0x27,0x08,0x7B,0x9F,0x01,0xFB,0x17,0x06,0x6E,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06, +0x76,0x9C,0x61,0x54,0x63,0x03,0xF8,0x77,0x06,0x76,0xE7,0xFF,0xFD,0x61,0x85,0x29, +0x8B,0x03,0x56,0xE3,0x03,0x22,0xE0,0x98,0x9B,0x04,0x42,0xF8,0xBD,0x5F,0x44,0x00, +0x5E,0xE5,0x17,0x4B,0x37,0x28,0x9A,0xE0,0xE4,0x00,0x00,0x13,0x1B,0x58,0x00,0x9E, +0xE1,0x43,0x03,0xBC,0xD6,0xF9,0xFF,0xC6,0x40,0xA5,0xBD,0x4E,0xE4,0x80,0x4F,0x64, +0xC0,0x47,0x7B,0xBD,0x4E,0xE4,0x40,0x47,0x7B,0x25,0x4F,0x45,0x11,0x47,0x7B,0xBD, +0x9A,0xE0,0xE4,0x00,0x00,0x17,0x8F,0x38,0x9E,0xE1,0x0F,0x79,0x00,0x4F,0x37,0x10, +0xD6,0xFA,0xFF,0xB6,0x8F,0x19,0x9A,0xE0,0x54,0xA5,0x03,0x5C,0x84,0x00,0xE4,0x00, +0x00,0x19,0x43,0x37,0xC4,0x9E,0xE1,0x18,0x99,0x00,0xD4,0xB7,0xFF,0xC5,0x85,0x29, +0x46,0xE4,0x1D,0x56,0xF7,0x03,0x22,0xE0,0x82,0x9A,0xFC,0x47,0x45,0xBC,0x9A,0xE0, +0xE4,0x00,0x00,0x51,0x43,0x03,0xBC,0x43,0x24,0xBC,0x9E,0xE1,0x13,0x39,0x00,0x1B, +0x38,0x00,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0xD6,0xE5,0xFF,0x66,0xE4,0x00,0x00,0x63, +0x0F,0x39,0x02,0x9E,0xE4,0x0F,0x38,0x00,0x43,0x03,0xBC,0x43,0x24,0xBC,0xD6,0xFA, +0xFF,0x96,0x9A,0xE0,0x54,0xA5,0x03,0xE4,0x00,0x00,0x25,0x43,0x57,0xC4,0x43,0x77, +0xCC,0x9E,0xE1,0x13,0x7B,0x00,0x1B,0x7A,0x00,0xD4,0xB7,0xFF,0x95,0x85,0x29,0x9C, +0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,0x21,0x0C,0x89,0x63,0x99,0x40,0xE4,0x00, +0x20,0xCA,0x20,0x64,0xD2,0xE4,0x00,0x22,0xF6,0x20,0x64,0x82,0xE4,0x00,0x22,0xD4, +0xC2,0xE0,0x10,0x01,0xFF,0x20,0xFF,0x7F,0xEB,0x17,0x08,0x87,0x99,0x41,0x47,0x18, +0xCC,0xEF,0x17,0x08,0x87,0xE4,0x00,0x00,0x23,0xE4,0x00,0x22,0xEA,0x20,0x67,0x7C, +0x88,0x6B,0xE4,0x00,0x22,0x4A,0x88,0x6A,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21, +0x0E,0x1C,0x21,0x10,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x21,0x2C,0x0D,0x41,0x28,0x0D, +0x61,0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01, +0x10,0x0E,0x21,0x0C,0x0E,0x41,0x08,0x0E,0x61,0x04,0xE4,0x00,0x68,0x1A,0xC1,0x80, +0x10,0x01,0xC0,0x60,0x00,0x21,0xFD,0x4C,0x00,0xD4,0xFC,0x63,0xB0,0xE4,0xC0,0x80, +0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0x84,0x00,0x00,0xFC,0xA5,0x03,0x80,0x40,0xA5, +0x25,0xE4,0x00,0x63,0x5E,0x0C,0x0A,0x01,0x0C,0x0A,0x03,0x0C,0x0A,0x05,0x0C,0x0A, +0x08,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x00,0xC3,0x0C,0x0A,0x0C,0x9A,0xEA,0xC1,0xC0, +0x10,0x01,0x0E,0xEA,0x11,0xEC,0x0E,0x06,0x8C,0x50,0x60,0x26,0xE4,0x00,0x22,0xE4, +0xC8,0x80,0xE1,0x00,0x98,0x60,0xE4,0x00,0x31,0x9C,0x98,0x63,0xE4,0x00,0x30,0x24, +0xE4,0x00,0x07,0x2A,0xC2,0xE0,0x10,0x01,0x9B,0x3C,0xF3,0x17,0x08,0x19,0x47,0x18, +0xCC,0xFC,0x60,0x0B,0xB8,0xFB,0x17,0x08,0x19,0x05,0x60,0x5B,0xC9,0x6B,0x8D,0x80, +0x88,0x8B,0xE4,0x00,0x30,0x5C,0x98,0x61,0xC2,0x58,0x00,0x21,0x8A,0x6B,0xC1,0x80, +0x10,0x01,0xC1,0xA0,0x10,0x01,0xC1,0x60,0x10,0x01,0xE4,0x00,0x30,0x34,0xC2,0x00, +0x10,0x01,0xC1,0xE0,0x10,0x01,0xC2,0x20,0x10,0x01,0xFE,0x52,0xB7,0x2C,0xFD,0x8C, +0x06,0x86,0xFD,0xAD,0x08,0x86,0xFD,0x6B,0x06,0x80,0xE4,0x00,0x2F,0xE4,0x0E,0xEA, +0x0E,0x22,0xE5,0xA0,0x22,0xE0,0x2C,0xD2,0xE2,0x18,0x9E,0xE4,0x00,0x02,0x5F,0xE4, +0x00,0x62,0x0A,0xE4,0x00,0x2F,0xFA,0x0C,0x6A,0x13,0xE4,0x00,0x2F,0xEC,0x0C,0x6A, +0x17,0xE4,0x00,0x2F,0xDE,0x0C,0x6A,0x1B,0xE4,0x00,0x2F,0xD0,0x0C,0x6A,0x19,0x0A, +0xEC,0x01,0xC6,0xF7,0xFF,0xDF,0x0E,0xEC,0x01,0x0A,0xEC,0x01,0xC6,0xF7,0xFF,0x7F, +0x0E,0xEC,0x01,0x9A,0xE1,0x0E,0xEA,0x0C,0x0A,0xED,0x01,0x52,0xF7,0x80,0xEC,0x0E, +0x06,0x8C,0x0E,0xED,0x01,0x98,0x61,0xE4,0x00,0x1D,0x3A,0x98,0x60,0xE4,0x00,0x37, +0x1A,0xE4,0x00,0x31,0xEA,0xE4,0x00,0x05,0x6B,0xEE,0xF0,0x06,0x8A,0x22,0xE4,0x4E, +0x9A,0xE2,0x0E,0xEA,0x0C,0x0C,0x0B,0x00,0xEC,0x10,0x06,0x88,0xE4,0x00,0x05,0x3D, +0xEE,0xEE,0x06,0x8E,0x22,0xE0,0x2C,0xD2,0xE1,0x14,0x9E,0xE4,0x00,0x00,0x3D,0x98, +0x61,0xE7,0xFF,0xFC,0x5C,0xD0,0x61,0x14,0x2E,0xEC,0x0F,0x08,0x60,0xEC,0x6E,0x06, +0x8C,0xE4,0x00,0x69,0x6E,0xE4,0x00,0x02,0xBB,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00, +0xD2,0xE0,0x13,0x52,0xE4,0x00,0x2E,0xB8,0x0A,0xEA,0x13,0x0B,0x0A,0x11,0x40,0x63, +0xBD,0x5E,0xE3,0x04,0xD7,0x17,0x12,0xB5,0xE4,0x00,0x2E,0x90,0x0C,0x6A,0x13,0x0A, +0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4,0x00,0x63,0x44,0xE4,0x00,0x69, +0x66,0xE4,0x00,0x68,0x96,0xEE,0xEF,0x08,0x62,0xEE,0xF1,0x08,0x8C,0xE4,0x00,0x64, +0x30,0x98,0x61,0xE4,0x00,0x98,0x5A,0xE4,0x00,0x64,0xA8,0x98,0x61,0xE4,0x00,0x65, +0x00,0xE4,0x00,0x66,0x40,0xE4,0x00,0x88,0x52,0x0A,0xED,0x01,0x56,0xF7,0x80,0xD2, +0xE0,0x10,0x5A,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00,0x22,0xE3,0xE4,0x0A,0xEA,0x01, +0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0x9A,0xE1,0x0E,0xEA,0x0C,0xEC,0x0E,0x06,0x8C, +0x98,0x61,0xE4,0x00,0x1B,0x84,0xE4,0x00,0x03,0xC9,0x0E,0xEB,0x02,0xD2,0xE4,0x0E, +0xED,0x4E,0xF7,0x10,0x8E,0xF2,0x0E,0xF7,0x02,0x86,0xE9,0x0A,0xEC,0x01,0xC6,0xF7, +0xFF,0xDF,0x0E,0xEC,0x01,0x0A,0xEC,0x01,0xC6,0xF7,0xFF,0x7F,0xFF,0x00,0xFF,0x7F, +0x0E,0xEC,0x01,0x0A,0xED,0x01,0x46,0xF7,0xC4,0x0E,0xED,0x01,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x48,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x9C,0xC2,0xE0,0x10,0x01, +0xEC,0x17,0x08,0x33,0xC2,0xE0,0x10,0x01,0x9B,0x3E,0xF3,0x17,0x08,0x1A,0x47,0x18, +0xCC,0xFB,0x17,0x08,0x1A,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x50,0xE4,0x00,0x59, +0x4A,0xE4,0x00,0x66,0x28,0x98,0x62,0xE4,0x00,0x2C,0x52,0x50,0x60,0x40,0xE4,0x00, +0x2C,0x64,0x50,0x60,0x19,0xE4,0x00,0x63,0x80,0xE4,0x00,0x04,0x04,0x50,0x60,0xC8, +0xE4,0x00,0x2C,0xC4,0xE4,0x00,0x6B,0xA6,0x50,0x60,0x40,0xE4,0x00,0x63,0x4C,0xC8, +0x80,0x7D,0x00,0xFC,0x60,0x0B,0xB8,0xE4,0x00,0x2C,0x32,0xFC,0x60,0x06,0x00,0xE4, +0x00,0x63,0x34,0xE4,0x00,0x03,0xC0,0xE4,0x00,0x02,0x5D,0x98,0x60,0xE7,0xFF,0xF9, +0xA4,0xD0,0x61,0x09,0x4E,0x9A,0xE2,0xEC,0x0F,0x08,0x60,0x0E,0xEB,0x00,0xE4,0x00, +0x67,0x14,0xE4,0x00,0x66,0x54,0xE4,0x00,0x02,0x29,0x0A,0xEA,0x01,0xC6,0xF7,0x01, +0x00,0xD2,0xE0,0x05,0x8A,0x0A,0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4, +0x00,0x03,0x48,0x98,0x60,0x98,0x80,0xE4,0x00,0x2B,0x3A,0xFC,0x60,0x0B,0xB8,0xC8, +0x80,0x7D,0x00,0xE4,0x00,0x2B,0x7A,0xE4,0x00,0x2B,0xA2,0xFC,0x60,0x0B,0xB8,0x88, +0x93,0xE4,0x00,0x2B,0x5E,0x98,0x81,0x98,0x60,0xE4,0x00,0x2A,0xF6,0xE4,0x00,0x02, +0xE4,0x98,0x62,0xE4,0x00,0x2B,0x72,0xE4,0x00,0x2B,0x72,0x0C,0x6A,0x13,0x0A,0xEA, +0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4,0x00,0x60,0x26,0xE4,0x00,0x61,0x32, +0xE4,0x00,0x95,0xAA,0x98,0x80,0x98,0x64,0xE4,0x00,0x48,0xEC,0xE4,0x00,0x65,0x60, +0xEE,0xEF,0x08,0x62,0xEE,0xF1,0x08,0x8C,0xE4,0x00,0x61,0x86,0x98,0x60,0xE4,0x00, +0x61,0xDE,0xE4,0x00,0x63,0x1E,0xE4,0x00,0x85,0x30,0x0A,0xED,0x01,0x56,0xF7,0x80, +0x22,0xE0,0x88,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00,0x22,0xE3,0xE4,0x0A,0xEA,0x01, +0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0x9A,0xE1,0x98,0x60,0x0E,0xEB,0x00,0xE4,0x00, +0x18,0x6C,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x31,0x5E,0xEB,0x01,0x20,0x00,0x29, +0x1E,0xF7,0xA0,0xD2,0xEB,0x02,0x3D,0x9A,0xE3,0xE4,0x00,0x00,0x7D,0x98,0x63,0xE4, +0x00,0x32,0x16,0xE4,0x00,0x2C,0xE6,0xE4,0x00,0x2A,0x52,0x9A,0xE4,0x0C,0x6A,0x17, +0xE4,0x00,0x00,0x4F,0xE4,0x00,0x2A,0x38,0x0A,0xEA,0x17,0x40,0x63,0xBD,0x5E,0xE3, +0x04,0xC2,0xE0,0x7C,0xEA,0x20,0x00,0x55,0x98,0x60,0xE4,0x00,0x29,0x32,0xE4,0x00, +0x2A,0x04,0x0C,0x6A,0x17,0x9A,0xE2,0x0E,0xEB,0x00,0x0E,0xEA,0x0A,0xFC,0x60,0x1E, +0x7F,0x9E,0xE1,0x0E,0xEA,0x08,0x0C,0x8A,0x0A,0xE4,0x00,0x2B,0xA6,0xE4,0x00,0x2A, +0x76,0xE7,0xFF,0xF9,0x93,0xE4,0x00,0xAB,0xCB,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41, +0x00,0xE4,0x00,0xAD,0x26,0x98,0x6D,0xE4,0x00,0x9D,0xA0,0x98,0x60,0xFC,0x80,0x3E, +0x0C,0xE4,0x00,0x9F,0xE4,0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x9F,0xD0,0x98, +0x60,0x50,0x80,0x14,0xE4,0x00,0xA4,0xCA,0x98,0x60,0x98,0x8C,0xE4,0x00,0xA3,0xEC, +0x98,0x61,0x50,0x80,0x14,0xE4,0x00,0xA4,0xA8,0x98,0x61,0x98,0x8C,0x99,0x40,0xE4, +0x00,0xA3,0xC6,0x88,0x6A,0x98,0x80,0x9D,0x41,0xE4,0x00,0xAA,0x32,0x5D,0x4A,0x00, +0xD1,0x44,0xFF,0x9E,0x98,0x60,0x05,0x40,0xFF,0xC9,0x4A,0xFF,0xFF,0x88,0x8A,0xE4, +0x00,0xA2,0x20,0x88,0x8A,0x98,0x60,0xE4,0x00,0x9F,0xA8,0x88,0x8A,0x0D,0x21,0x06, +0x0D,0x41,0x02,0x98,0x60,0x9C,0x28,0xE4,0x00,0xA0,0x89,0xE4,0x00,0xAC,0x75,0xE4, +0x00,0xAE,0x19,0xE4,0x00,0xAF,0x45,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0x9C,0x1C, +0x21,0xB0,0x0E,0xE1,0x10,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0x90,0x0D,0x41,0x4C, +0x0D,0x61,0x48,0x0D,0x81,0x44,0x0D,0xE1,0x38,0x0E,0x01,0x34,0x0E,0x21,0x30,0x0E, +0x41,0x2C,0x0E,0x61,0x28,0x0E,0x81,0x24,0x0D,0xA1,0x40,0x0D,0xC1,0x3C,0x0E,0xA1, +0x20,0x0E,0xC1,0x1C,0x0E,0xE1,0x0C,0xC2,0x60,0x10,0x01,0xC2,0x40,0x10,0x01,0xFE, +0x73,0x06,0xB0,0xFE,0x52,0x06,0xA8,0xC2,0x20,0x10,0x01,0xC2,0x00,0x10,0x01,0xFE, +0x31,0x06,0xA0,0xFE,0x10,0x06,0xB4,0xC1,0xE0,0x10,0x01,0xC1,0x8F,0xFF,0xE1,0xFD, +0xEF,0x06,0xAC,0x9B,0x80,0xC2,0x98,0x00,0x21,0xC0,0xD8,0x00,0x21,0x13,0x53,0x00, +0x0E,0xF2,0x02,0x0D,0x51,0x02,0x0F,0xB0,0x02,0x0F,0x6F,0x02,0x99,0x60,0xC9,0x8C, +0xFF,0xFF,0x88,0xFC,0x53,0x20,0xFF,0xFE,0x94,0xB8,0xA6,0xFC,0xC6,0xB8,0xAC,0xE4, +0x00,0x01,0xC5,0x41,0x14,0xC4,0x9F,0x01,0x11,0x08,0x00,0x8D,0xA8,0x5D,0xAD,0x00, +0xE4,0x00,0x00,0x11,0x9B,0x00,0x89,0xB8,0x5D,0x18,0x00,0xD7,0xC8,0xFF,0x45,0xC3, +0x18,0x00,0x21,0xFF,0x18,0xB8,0xA6,0x8F,0x0B,0x99,0x00,0x12,0xB8,0x00,0xCF,0x0D, +0x00,0x0A,0x1E,0xD5,0xFF,0x8F,0x06,0x0E,0xC1,0x08,0x0F,0x01,0x14,0xE4,0x00,0x01, +0x37,0x0F,0x01,0x16,0xCD,0xE8,0x00,0x0A,0x8D,0xF8,0x0A,0xCF,0x00,0x0E,0xC1,0x04, +0x0F,0x01,0x0E,0x0E,0xC1,0x0A,0xD5,0x16,0x00,0x3A,0x0B,0x0F,0x0A,0x0D,0xE1,0x06, +0xD5,0xE4,0x03,0xB4,0xD4,0x98,0x03,0x94,0x8D,0xCD,0x5D,0xCE,0x00,0xCF,0x0E,0x00, +0x0A,0x8F,0x06,0x09,0xF8,0x06,0x0B,0x18,0x08,0x4F,0x18,0x50,0x41,0xEF,0x23,0x8D, +0xF8,0xFD,0xEF,0x02,0x00,0x4D,0xEF,0x52,0x5D,0xEF,0x06,0x41,0xEF,0x7B,0x43,0x03, +0x7D,0x4E,0xD8,0xFA,0x47,0x16,0xC6,0x43,0x18,0xB5,0xD7,0x0C,0x01,0x4C,0xC3,0x20, +0x1F,0xE4,0x20,0x00,0x2D,0x89,0x5D,0x89,0x97,0x8B,0x3A,0x88,0xFC,0x8B,0xAA,0x8A, +0xEC,0x8B,0x59,0x8B,0x87,0x8B,0x78,0x89,0x4F,0x89,0x98,0x88,0xEE,0x8B,0x3E,0xE4, +0x00,0x00,0x2F,0xC3,0x40,0x1F,0xE0,0x20,0x00,0x1D,0xD6,0xF8,0x00,0x60,0x8B,0xAF, +0x8A,0xF8,0x8B,0x5E,0x8B,0x8E,0x9D,0x01,0x5D,0xC8,0x00,0xD6,0xAE,0xFB,0x35,0x9D, +0x61,0x5F,0xCB,0x00,0x0E,0xC1,0x12,0xD6,0xDE,0xF9,0x6D,0xC3,0x00,0x10,0x01,0x1B, +0x53,0x00,0xFF,0x18,0x06,0xAC,0x0E,0xF2,0x00,0x0D,0x51,0x00,0x0F,0xB0,0x00,0x0F, +0x78,0x00,0xC3,0x20,0x1F,0xE0,0x20,0x01,0x55,0xCF,0x9C,0x00,0x0A,0xCC,0xE7,0x00, +0x0A,0x8C,0xE6,0x0B,0x07,0x04,0x4F,0x18,0x50,0x8C,0xDC,0x08,0x67,0x02,0x0B,0x86, +0x02,0x40,0x63,0x23,0x0B,0x46,0x04,0x8C,0x78,0x43,0x1B,0xBC,0xFC,0x63,0x02,0x00, +0x4C,0x63,0x52,0x23,0x00,0xA8,0xC2,0xE0,0x1F,0xE0,0x20,0x00,0x8D,0x40,0x63,0xBB, +0x40,0x9C,0x23,0x4E,0xFA,0x50,0x8E,0xE4,0xFE,0xF7,0x02,0x00,0x4E,0xF7,0x52,0x43, +0x77,0xDB,0x8C,0x7B,0x40,0x63,0xC0,0xE4,0x00,0x00,0x0D,0x88,0x64,0x0E,0xC1,0x1E, +0x0E,0xA1,0x22,0x0E,0x81,0x26,0x0E,0x61,0x2A,0x0E,0x41,0x2E,0x0E,0x21,0x32,0x0E, +0x01,0x36,0x0D,0xE1,0x3A,0x0D,0xC1,0x3E,0x0D,0xA1,0x42,0x0D,0x81,0x46,0x0D,0x61, +0x4A,0x0D,0x41,0x4E,0x1B,0x25,0x00,0x1C,0x21,0x50,0x85,0x29,0x8B,0x23,0xC2,0xE0, +0x10,0x01,0x5C,0xA5,0x00,0xF2,0xF7,0x06,0x9C,0x98,0x60,0xD6,0xE5,0x0C,0xB9,0xD3, +0x3F,0x0C,0x98,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0xF2, +0xF7,0x06,0x95,0xFF,0x18,0x06,0x93,0xFF,0x7B,0x06,0x94,0x22,0xE8,0x42,0x13,0x18, +0x00,0x5F,0x08,0x9B,0x20,0x00,0x51,0xE4,0x00,0x01,0x3B,0xD2,0xE1,0x04,0xCE,0x13, +0x18,0x00,0x5F,0x05,0x93,0x20,0x02,0x3D,0x24,0xA4,0x4B,0x9B,0x43,0x43,0x5A,0x2D, +0x4F,0x5A,0x08,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x37,0x20,0xA8,0x54,0x9B,0x44,0x43, +0x5A,0x2D,0x4F,0x5A,0x08,0x5F,0x5A,0x00,0x20,0xAC,0xEE,0xE4,0x00,0x00,0x51,0x9B, +0x43,0x9A,0xE0,0x13,0x9B,0x00,0x8B,0x17,0xE4,0x00,0x00,0x27,0x4F,0xB8,0x08,0x9F, +0x01,0x8F,0xBC,0x5F,0x18,0x00,0x8E,0xFD,0x5E,0xF7,0x00,0xD7,0x05,0xFF,0x8E,0xE4, +0x00,0x00,0x49,0x5E,0xE0,0x21,0x53,0x00,0x1D,0x52,0xE0,0x2F,0x4A,0xF8,0xB8,0xE4, +0x00,0x00,0x4B,0x5E,0xE0,0x29,0x53,0x00,0x41,0x52,0xE0,0x29,0x4A,0xF8,0xB8,0xE4, +0x00,0x00,0x2B,0x27,0x04,0x33,0x9F,0x9F,0x4F,0x18,0x08,0xE4,0x00,0x00,0x8B,0x9B, +0x0A,0x20,0xA9,0x10,0x13,0x1B,0x00,0x9C,0xBF,0x9F,0x1F,0x4C,0xA5,0x08,0x8F,0x05, +0xE4,0x00,0x00,0x65,0x9B,0x43,0x13,0xBB,0x00,0x43,0x5A,0x2D,0x9A,0xE0,0x4F,0x5A, +0x08,0x8B,0x77,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x21,0x8F,0x9D,0x9F,0x61,0x8E,0xFC, +0x5F,0x7B,0x00,0x5E,0xF7,0x00,0x4F,0x9B,0x08,0xD7,0x65,0xFF,0x8E,0x1F,0x1D,0xFF, +0x8F,0x1C,0x5F,0x18,0x00,0x4F,0x5A,0x08,0xC3,0xB8,0x00,0x21,0xFF,0xBD,0xB7,0x40, +0x8F,0xBA,0x9B,0x40,0xE4,0x00,0x01,0x0B,0x4F,0x7A,0x08,0x8F,0x7D,0x0B,0x9B,0x00, +0xD7,0x3C,0x03,0xBC,0x0B,0x7B,0x02,0xD7,0x79,0x03,0x84,0x8E,0xFA,0xC3,0xB8,0x00, +0x21,0xCF,0x17,0x00,0x06,0xFF,0xBD,0xB7,0x5C,0x8F,0x1D,0x1F,0x57,0x01,0x14,0xD8, +0x00,0xCF,0x5A,0x00,0x06,0x09,0x18,0x02,0x8F,0x5D,0x98,0x60,0x0B,0xB8,0x04,0x14, +0xBA,0x00,0x0B,0xDA,0x02,0x0B,0x1A,0x04,0xD7,0x9B,0x02,0x52,0x42,0xF9,0xDD,0x40, +0x77,0x33,0x43,0x3C,0xCD,0x43,0x59,0x2B,0x43,0xD9,0xF3,0x8F,0x43,0x40,0x77,0x43, +0x43,0x5A,0x23,0x8C,0x7E,0x8C,0x7A,0x42,0xF7,0xEB,0x40,0x83,0x23,0x97,0x41,0x43, +0x39,0xC3,0xCB,0x5A,0x86,0xA0,0x8F,0x37,0x40,0x64,0xD0,0x43,0x7C,0xDD,0x8C,0x79, +0x40,0x63,0xD8,0xE4,0x00,0x00,0x1F,0x9F,0x41,0x5F,0x7A,0x00,0xD7,0x1B,0xFB,0xE5, +0x98,0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x06,0x95,0xC2,0xE0,0x10,0x01, +0xF8,0x97,0x06,0x92,0xC2,0xE0,0x10,0x01,0xF8,0xB7,0x06,0x93,0xC2,0xE0,0x10,0x01, +0xF8,0xD7,0x06,0x94,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x06,0x91,0x85,0x29,0x9A,0xFF, +0x1C,0x21,0xD8,0x0D,0xE1,0x0C,0x1A,0xE1,0x07,0xC1,0xE0,0x10,0x01,0xFD,0xEF,0x06, +0xB0,0x1A,0xEF,0x00,0x52,0xE0,0xFF,0xC3,0x00,0x10,0x01,0x0D,0x41,0x20,0x0D,0x61, +0x1C,0x0D,0xA1,0x14,0x0D,0xC1,0x10,0xCB,0x20,0xFF,0xFF,0xC1,0xC0,0x10,0x01,0xEF, +0x38,0x06,0xB8,0xFD,0xCE,0x06,0xAC,0xC1,0xA0,0x10,0x01,0x0E,0xEE,0x00,0xFD,0xAD, +0x06,0xA8,0x0D,0x21,0x24,0x0E,0xED,0x00,0x0D,0x81,0x18,0xC2,0xE0,0x10,0x01,0x0E, +0x01,0x08,0x89,0x63,0xF3,0x17,0x06,0x95,0x89,0x44,0x88,0x65,0xC2,0xE0,0x10,0x01, +0x23,0x08,0x56,0xC3,0x00,0x10,0x01,0xF3,0x18,0x06,0x93,0x5F,0x08,0x9B,0x20,0x00, +0x61,0xE4,0x00,0x00,0x37,0x23,0x04,0x5E,0xC3,0x00,0x10,0x01,0xF3,0x18,0x06,0x93, +0x5F,0x05,0x93,0x20,0x00,0x25,0x9B,0x05,0xE4,0x00,0x00,0x0D,0x9B,0x04,0xFB,0x17, +0x06,0x9C,0xC2,0x00,0x10,0x01,0x0E,0xEB,0x02,0xEE,0xF0,0x06,0xB8,0x0A,0xE6,0x06, +0x0C,0x8B,0x02,0xD4,0x97,0x04,0xCC,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x71,0x53, +0x18,0x01,0x1C,0xA1,0x07,0xEF,0x17,0x08,0x71,0xE7,0xFF,0xF6,0x9C,0x0C,0x6B,0x00, +0x0C,0x8A,0x02,0xED,0x90,0x06,0xBA,0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF,0xFA,0xC0, +0xC2,0xE0,0x10,0x01,0x89,0x63,0xEC,0x77,0x06,0x98,0x10,0xA1,0x07,0x0C,0x8A,0x02, +0x88,0x6C,0xE7,0xFF,0xFA,0x94,0xC3,0x00,0x10,0x01,0xEC,0x78,0x06,0xA4,0x0F,0x6E, +0x02,0x0F,0x2D,0x02,0x0F,0x4A,0x02,0x43,0x1B,0xCC,0x23,0x00,0xEC,0xC3,0x20,0x1F, +0xE0,0x20,0x00,0xD1,0xC3,0x80,0x10,0x01,0xEF,0xBC,0x06,0xA2,0xC3,0x80,0x10,0x01, +0xEF,0x9C,0x06,0xB6,0x43,0xBD,0xE5,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5, +0xD7,0x1C,0x00,0xAC,0x41,0x6B,0xDB,0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17,0xC0,0x8F, +0x58,0xE4,0x00,0x01,0x55,0x42,0xFA,0x1C,0xE4,0x00,0x01,0x5B,0xC9,0x80,0x07,0xFF, +0x42,0xEC,0xBD,0xD6,0xE4,0x05,0x2C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x71,0x53, +0x18,0x01,0x40,0x8C,0x25,0xEF,0x17,0x08,0x71,0x1C,0xA1,0x07,0xE7,0xFF,0xF5,0x56, +0x40,0x6C,0x1D,0x0C,0x6B,0x00,0xEE,0xF0,0x06,0xBA,0x0C,0x8A,0x02,0x41,0x8C,0xBD, +0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF,0xF9,0x6E,0xC2,0xE0,0x10,0x01,0x89,0x63,0xEC, +0x77,0x06,0x98,0x10,0xA1,0x07,0x0C,0x8A,0x02,0x88,0x6C,0xE7,0xFF,0xF9,0x42,0xC3, +0x00,0x10,0x01,0xEC,0x78,0x06,0xA4,0x0F,0x6E,0x02,0x0F,0x2D,0x02,0x0F,0x4A,0x02, +0x43,0x1B,0xCC,0x23,0x00,0xFC,0xC3,0x20,0x1F,0xE0,0x20,0x00,0xE1,0xC3,0x80,0x10, +0x01,0xEF,0xBC,0x06,0xA2,0xC3,0x80,0x10,0x01,0xEF,0x9C,0x06,0xB6,0x43,0xBD,0xE5, +0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xD7,0x1C,0x00,0xCC,0x41,0x6B,0xDB, +0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17,0xC0,0x43,0x5A,0xC5,0x0F,0x4A,0x00,0xE4,0x00, +0x00,0x15,0x42,0xFA,0x1D,0x0E,0xEA,0x00,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1, +0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26, +0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x61,0x24,0x0D,0x81, +0x20,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E,0x21,0x0C, +0x0E,0x41,0x08,0x5E,0x23,0x00,0x0E,0x61,0x04,0x56,0x11,0x03,0x4E,0xF1,0x11,0x5E, +0x00,0x09,0x99,0xC0,0x4A,0x41,0x01,0x99,0x80,0x9A,0x64,0x0D,0x21,0x2C,0x8E,0x57, +0x89,0x44,0x89,0xAE,0x89,0x6C,0x99,0xE0,0x42,0x73,0x25,0xE4,0x00,0x00,0xF3,0x42, +0xF3,0x54,0xD6,0xF1,0x01,0xD8,0x22,0x04,0x4A,0x51,0xC0,0x10,0x11,0x6A,0x00,0x89, +0xAE,0x51,0x80,0x10,0xE4,0x00,0x00,0x6B,0x22,0x08,0x4A,0x51,0xC0,0x10,0x11,0x6A, +0x00,0x11,0x8A,0x01,0x89,0xAE,0xE4,0x00,0x00,0x47,0x22,0x0C,0x7E,0x11,0x6A,0x00, +0x11,0x8A,0x01,0x11,0xAA,0x02,0x51,0xC0,0x10,0xE4,0x00,0x00,0x21,0x11,0x6A,0x00, +0x11,0x8A,0x01,0x11,0xAA,0x02,0x11,0xCA,0x03,0x4E,0xEC,0x80,0x4C,0x8C,0xC0,0x8C, +0x97,0x4E,0xEE,0x80,0x4F,0x0B,0x40,0x4C,0xAE,0xC0,0x8C,0xB7,0x4E,0xED,0x40,0x88, +0x6F,0x8C,0x8B,0x8C,0xAD,0x8C,0x98,0x8C,0xB7,0x9D,0xE1,0xE4,0x00,0x90,0x48,0x5D, +0xEF,0x00,0x9D,0x44,0xD5,0xF2,0xFC,0x5E,0x0E,0x61,0x06,0x0E,0x41,0x0A,0x0E,0x21, +0x0E,0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22, +0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xEE,0xF7,0x00,0xE2,0x5E,0xE0,0x41,0x1C,0x21,0xE8,0x0D,0x61,0x0C,0x0D, +0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x0D,0x41,0x10,0x89,0x63,0x5D,0x84,0x00, +0x49,0xA1,0x01,0xE4,0x00,0x54,0xDE,0xC3,0x14,0x00,0x01,0xCB,0x18,0x7A,0x30,0x0A, +0xF8,0x01,0xC6,0xF7,0x01,0x00,0x5E,0xF7,0x04,0x22,0xE3,0xD8,0xFC,0x60,0x01,0x00, +0x99,0x40,0xE4,0x00,0x19,0xEC,0xE4,0x00,0x00,0x31,0x88,0x6A,0x98,0x81,0x88,0xAD, +0x9D,0x41,0xE4,0x00,0xA5,0x16,0x5D,0x4A,0x00,0x0C,0x6B,0x01,0x9D,0x62,0xD5,0x4C, +0xFF,0x66,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21, +0x16,0x1C,0x21,0x18,0x85,0x29,0xFC,0x21,0xFD,0xF0,0xED,0x41,0x02,0x08,0xED,0xE1, +0x01,0xF4,0xEE,0x01,0x01,0xF0,0xED,0x21,0x02,0x0C,0xED,0x61,0x02,0x04,0xED,0x81, +0x02,0x00,0xED,0xA1,0x01,0xFC,0xED,0xC1,0x01,0xF8,0xEE,0x21,0x01,0xEC,0xEE,0x41, +0x01,0xE8,0xEE,0x61,0x01,0xE4,0xC2,0x00,0x10,0x01,0xC1,0xE0,0x10,0x01,0x89,0x43, +0xFE,0x10,0x07,0xE8,0xFD,0xEF,0x08,0x06,0x20,0x60,0x30,0x20,0x68,0x88,0x20,0x64, +0x30,0x24,0x64,0x63,0x99,0x80,0xE4,0x00,0x00,0x0D,0x99,0x81,0xCD,0x8C,0x00,0x1A, +0x51,0x60,0x1A,0x8D,0x90,0xE4,0x00,0x00,0x29,0xD0,0x64,0x00,0x62,0x99,0x80,0x89, +0x6C,0xE4,0x00,0x00,0x11,0x89,0x8F,0x99,0x63,0x9A,0xE0,0x89,0xC1,0x53,0x20,0x10, +0xE4,0x00,0x00,0x19,0x43,0x0E,0xBC,0x9E,0xE1,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5, +0x78,0xFF,0xAD,0x88,0x6B,0x88,0x81,0x99,0xA3,0xE7,0xFF,0xFC,0x18,0x89,0xC1,0xFE, +0x20,0xFE,0xB0,0xCA,0x40,0x01,0x50,0x52,0x60,0x3F,0x1C,0x61,0x60,0x88,0x8B,0xE7, +0xFF,0xFD,0xBE,0x1F,0x21,0x60,0x8B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x93,0x0A,0xF9, +0x00,0xC2,0xFF,0xD5,0xEC,0x20,0x00,0x39,0x43,0x71,0xBD,0xC3,0x60,0x2A,0x0C,0xE4, +0x00,0x00,0x0F,0x5E,0xE0,0x19,0x4B,0x61,0x01,0x23,0x60,0x98,0xFE,0xF7,0x01,0x50, +0x13,0x58,0x00,0x42,0xF7,0x90,0x8E,0xFA,0x5E,0xF7,0x06,0x26,0xFC,0x34,0x5E,0xE7, +0xF1,0x4A,0xF7,0x98,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x1A,0xF8,0x00,0x9B,0x40,0x9F, +0x01,0x9F,0x22,0x42,0xF8,0x75,0x5E,0xF7,0x00,0xD5,0x77,0xFD,0xAD,0x23,0x40,0x24, +0x9A,0xE0,0xE4,0x00,0x00,0x51,0x88,0x6B,0x88,0x81,0x9D,0xBF,0xE7,0xFF,0xFB,0x12, +0x5D,0xAD,0x00,0x21,0xA2,0x1E,0xE7,0xFF,0xFF,0xD5,0x43,0x0C,0xBC,0x1F,0x21,0x00, +0x8F,0x37,0x9E,0xE1,0x13,0x39,0x00,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5,0x78,0xFF, +0x6D,0x21,0x40,0x64,0x21,0x48,0x28,0x21,0x44,0x8C,0xD1,0x44,0x01,0xCA,0x99,0x60, +0x99,0x80,0x88,0x8B,0x89,0x4C,0xE4,0x00,0x00,0x77,0xC1,0x80,0x10,0x01,0x99,0x60, +0x88,0x90,0xFD,0x8C,0x0A,0x9C,0xE4,0x00,0x00,0x2D,0xC0,0x80,0x10,0x01,0xC1,0x80, +0x10,0x01,0x99,0x61,0xFC,0x84,0x08,0x02,0xFD,0x8C,0x0B,0x04,0x51,0x40,0x1A,0xE4, +0x00,0x00,0x25,0xC1,0x80,0x10,0x01,0x99,0x68,0x88,0x8F,0xFD,0x8C,0x0B,0x28,0x99, +0x43,0x88,0x6A,0xE7,0xFF,0xFA,0x24,0xFD,0xA1,0x01,0x20,0x88,0x8A,0x88,0x6D,0xE7, +0xFF,0xFB,0xDE,0x9A,0xE0,0xE4,0x00,0x00,0x33,0x4F,0x17,0x10,0x4F,0x37,0x08,0x8F, +0x0C,0x8F,0x2D,0x9E,0xE1,0x0B,0x39,0x00,0x4F,0x39,0x40,0x0F,0x38,0x00,0x5F,0x17, +0x00,0xD5,0x58,0xFF,0x45,0x88,0x6B,0xE4,0x00,0x52,0x3C,0xED,0x21,0x02,0x0E,0xEE, +0x61,0x01,0xE6,0xEE,0x41,0x01,0xEA,0xEE,0x21,0x01,0xEE,0xEE,0x01,0x01,0xF2,0xED, +0xE1,0x01,0xF6,0xED,0xC1,0x01,0xFA,0xED,0xA1,0x01,0xFE,0xED,0x81,0x02,0x02,0xED, +0x61,0x02,0x06,0xED,0x41,0x02,0x0A,0xFC,0x21,0x02,0x10,0x85,0x29,0x9C,0x38,0xC2, +0xE0,0x10,0x01,0x0D,0x21,0x04,0xFE,0xF7,0x07,0xE8,0x9B,0x00,0x13,0x37,0x00,0x4F, +0x39,0x08,0x9E,0xE1,0x8F,0x19,0xC3,0x20,0x10,0x01,0xFF,0x39,0x08,0x02,0xD6,0xF9, +0xFF,0x76,0xC2,0xE0,0x10,0x01,0xF3,0x57,0x08,0x06,0xFE,0xF7,0x08,0x06,0x13,0x37, +0x02,0x13,0x77,0x01,0x98,0x60,0x42,0xFB,0xD4,0x98,0x80,0x8E,0xF9,0x53,0x20,0x37, +0x4E,0xF7,0x08,0x8E,0xF8,0x97,0x03,0x4E,0xF7,0x09,0xCB,0x18,0xD0,0x8F,0xCE,0xF7, +0x03,0x5B,0x42,0xF7,0xC9,0xCE,0xF7,0x00,0x1D,0xD6,0xF8,0x00,0xA1,0x97,0x2F,0x98, +0x60,0xCB,0x39,0x42,0x3F,0x98,0x82,0xD6,0xF9,0x00,0x31,0x98,0x87,0xE4,0x00,0x9A, +0x14,0x0D,0x21,0x06,0x98,0x61,0x98,0x80,0x9C,0x28,0xE4,0x00,0x99,0xFB,0x9C,0x38, +0x98,0x80,0x0D,0x21,0x04,0x98,0x66,0xE4,0x00,0x2E,0x6A,0x98,0x60,0xE7,0xFF,0xFA, +0xF2,0x98,0x66,0x98,0x87,0xE4,0x00,0x2E,0x4E,0x0D,0x21,0x06,0x98,0x64,0x9C,0x28, +0xE7,0xFF,0xFA,0xCD,0xC2,0xE0,0x10,0x01,0x5C,0xA0,0x29,0xF3,0x37,0x0B,0x1A,0x53, +0x40,0x40,0x52,0xE0,0x20,0xC3,0x60,0x10,0x01,0x4B,0x5A,0xB8,0xFF,0x7B,0x09,0x0C, +0x20,0x60,0x6C,0xE4,0x00,0x00,0x55,0x4F,0x17,0x08,0x9E,0xE1,0x8F,0x1B,0x0B,0x18, +0x00,0xD7,0x58,0x00,0x78,0x98,0x61,0xE4,0x00,0x00,0xD9,0x9A,0xE0,0x43,0x40,0xD5, +0x5F,0x17,0x00,0xD7,0x38,0xFF,0x25,0x98,0x60,0xE4,0x00,0x00,0xB5,0x20,0x67,0xEA, +0x9A,0xE0,0x20,0x80,0xA6,0x9A,0xE0,0x43,0x80,0xD5,0xE4,0x00,0x00,0x7D,0x4F,0x17, +0x08,0x8F,0x1B,0x0B,0x18,0x00,0x4F,0x98,0xFA,0x47,0x1C,0xC6,0x43,0x18,0xE5,0x0B, +0x84,0x00,0xD7,0x1C,0x00,0x38,0x0F,0x04,0x01,0x9E,0xE1,0x5F,0x17,0x00,0xD7,0x38, +0xFF,0x05,0xE7,0xFF,0xFF,0xA7,0x4F,0x17,0x08,0x8F,0x1B,0x0B,0x18,0x00,0xD7,0x98, +0xFD,0x3C,0x9E,0xE1,0xD7,0x1A,0xFD,0x0C,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x5D,0xE7, +0xFF,0xFF,0x51,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF3,0xB7,0x0B, +0x1A,0xC3,0xC0,0x10,0x01,0x9A,0xE0,0xFF,0x18,0x06,0xC0,0x8B,0x37,0xFF,0xDE,0x09, +0x0C,0xE4,0x00,0x00,0x5B,0x4F,0x57,0x08,0x0B,0x98,0x00,0x8F,0x5E,0x0B,0x5A,0x00, +0x43,0x9A,0xE5,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x66,0x11,0x20, +0x00,0x21,0x9F,0x21,0x5F,0x39,0x00,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02,0x5F,0x57, +0x00,0xD7,0xBA,0xFE,0xA5,0x5F,0x20,0x93,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xC3,0x40,0x10,0x01,0xF3,0x37,0x0B,0x1A,0xC3,0x60,0x10,0x01,0x9A,0xE0,0xFF, +0x5A,0x06,0xC0,0xFF,0x7B,0x09,0x0C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08,0x9E,0xE1, +0x43,0x9A,0xC4,0x8F,0x1B,0x0B,0x18,0x01,0x0F,0x1C,0x01,0x5F,0x17,0x00,0xD7,0x38, +0xFF,0x6D,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8A,0xC2,0xE0,0x10,0x01, +0x9C,0x38,0xF8,0x17,0x08,0x83,0x0D,0x21,0x04,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0x9D,0x20,0x64,0x26,0x98,0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80,0xE4,0x00, +0x2F,0xA0,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEC,0x17,0x06,0xBC,0x9C,0x28,0xE4, +0x00,0x4B,0xFB,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0xEB,0x17,0x00, +0xD5,0x0D,0x21,0x14,0x0D,0x61,0x0C,0x0C,0x01,0x07,0x89,0x43,0xC7,0x18,0x01,0x00, +0x98,0x60,0xD3,0x00,0x06,0x3A,0xEB,0x17,0x00,0xD5,0xC7,0x18,0xFE,0xFF,0xEF,0x17, +0x00,0xD5,0xE4,0x00,0x46,0x32,0xE4,0x00,0x47,0x3E,0x21,0x44,0x36,0x98,0x61,0xE4, +0x00,0x7B,0x62,0xE4,0x00,0x00,0x11,0xE4,0x00,0x7B,0x9C,0xC2,0xE0,0x10,0x01,0xED, +0x77,0x06,0xBE,0x5D,0x60,0x01,0x0C,0x01,0x07,0x98,0x61,0x1C,0x81,0x06,0x98,0xA1, +0x48,0x84,0x00,0x88,0xCA,0xE7,0xFF,0xFC,0x5E,0xC2,0xE0,0x10,0x01,0x20,0x60,0xE6, +0xF3,0x17,0x08,0x8A,0x9F,0x01,0xFB,0x17,0x08,0x8A,0x0A,0xE1,0x06,0xD2,0xEF,0x00, +0x94,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0x83,0x9F,0x01,0xFB,0x17,0x08,0x83,0x98, +0x63,0x21,0x44,0x36,0x98,0x81,0xE4,0x00,0x78,0x06,0xE4,0x00,0x00,0x6B,0xE4,0x00, +0x78,0x5C,0xE4,0x00,0x00,0x5B,0xF8,0x17,0x08,0x8A,0xC2,0xE0,0x10,0x01,0xF8,0x17, +0x08,0x83,0x21,0x63,0x76,0x0A,0xE1,0x06,0x5E,0xEC,0x11,0x23,0xFF,0x51,0x21,0x44, +0x36,0x98,0x61,0xE4,0x00,0x4F,0xEA,0xE4,0x00,0x00,0x11,0xE4,0x00,0x50,0x24,0x9B, +0x01,0xC2,0xE0,0x10,0x01,0x98,0x61,0xEF,0x17,0x06,0xBC,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x08,0x9D,0x9F,0x01,0xFB,0x17,0x08,0x9D,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D, +0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x26,0x98, +0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80,0xE4,0x00,0x2D,0x6A,0x0D,0x21,0x06, +0x9C,0x28,0xE4,0x00,0x49,0xD5,0x98,0x81,0x98,0x60,0x88,0xA4,0xE7,0xFF,0xA7,0xEB, +0xC2,0xE0,0x10,0x01,0x98,0x61,0xF2,0xF7,0x08,0x8A,0xD2,0xEA,0x00,0x95,0xC2,0xE0, +0x10,0x01,0xF2,0xF7,0x08,0x83,0x5E,0xE0,0xBB,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xF2,0xF7,0x08,0x9D,0x5E,0xE1,0xDB,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x00,0x00,0x0C,0x17,0x00,0x0C,0x17,0x19,0x0C,0x17,0x1B,0xEC, +0x17,0x00,0xA1,0xEC,0x17,0x00,0xA3,0xEC,0x17,0x00,0xA5,0xEC,0x17,0x00,0xA7,0xF8, +0x17,0x00,0xA8,0xEC,0x17,0x00,0xAC,0x1F,0x17,0x08,0xEC,0x17,0x00,0xA1,0x0F,0x17, +0x04,0x1F,0x17,0x20,0x0F,0x17,0x1C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD9,0x53, +0x18,0x02,0xEF,0x17,0x00,0xD9,0x85,0x29,0xC3,0x20,0x10,0x01,0xFF,0x19,0x00,0x00, +0x1E,0xF8,0x20,0x5C,0x63,0x04,0x0E,0xF8,0x1C,0x9A,0xE0,0xE4,0x00,0x00,0x29,0x0F, +0x38,0x1E,0x43,0x44,0xBC,0x8F,0x37,0x13,0x5A,0x00,0x9E,0xE1,0x1B,0x59,0x00,0x5F, +0x37,0x04,0xD4,0x79,0xFF,0x6D,0x9A,0xE1,0xEE,0xF8,0x00,0xAC,0x85,0x29,0x9C,0x38, +0x0D,0x21,0x04,0x0D,0x41,0x00,0x5D,0x43,0x00,0xE7,0xFF,0xFE,0xEA,0x88,0x6A,0xE4, +0x00,0x95,0xF0,0x0D,0x21,0x06,0x0D,0x41,0x02,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE0, +0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0x0D, +0xE1,0x04,0x0D,0x21,0x1C,0x0E,0x01,0x00,0xC1,0xA0,0x10,0x01,0xE4,0x00,0x97,0x62, +0xC1,0x80,0x10,0x01,0xC1,0xC0,0x10,0x01,0xC1,0xE0,0x10,0x01,0x5C,0x63,0x00,0xFD, +0xAD,0x00,0xC8,0xFD,0x8C,0x08,0x1A,0xFD,0x6E,0x00,0xC0,0xFD,0x4F,0x00,0x00,0xD0, +0x60,0x23,0xFA,0xE4,0x00,0x97,0x60,0x5C,0x63,0x00,0x20,0x60,0xDC,0x0C,0x0A,0x19, +0xE4,0x00,0x97,0xEC,0xE4,0x00,0x0D,0x38,0xEC,0x6A,0x00,0xA5,0xE4,0x00,0x00,0x4B, +0x0E,0xEA,0x06,0x0A,0x0A,0x19,0x8E,0x17,0xE4,0x00,0x97,0xF0,0x18,0x70,0x00,0x0A, +0xEA,0x19,0xD2,0xEE,0x00,0x8D,0x0A,0xEA,0x19,0x9E,0xE1,0x5E,0xF7,0x04,0x0E,0xEA, +0x19,0x99,0xC0,0xE4,0x00,0x96,0x6E,0x5C,0x63,0x00,0x20,0x63,0x5A,0x0E,0xEA,0x06, +0x13,0x17,0x00,0x5F,0x0A,0x09,0x20,0x00,0x65,0x0A,0xEA,0x19,0xD2,0xE4,0x04,0x0E, +0xE4,0x00,0x97,0x18,0x0A,0xEA,0x19,0xD2,0xE0,0x04,0x4E,0xE4,0x00,0x0B,0x0B,0x13, +0x17,0x00,0x23,0x08,0x36,0x0A,0xEA,0x19,0x22,0xE9,0x96,0xE7,0xFF,0xFF,0xCB,0x13, +0x17,0x00,0x23,0x04,0x36,0x0A,0xEA,0x19,0x22,0xE5,0x56,0xE7,0xFF,0xFF,0xAB,0x13, +0x17,0x00,0x5F,0x0A,0x29,0x20,0x01,0x0B,0x13,0x17,0x00,0x5F,0x0A,0x49,0x23,0xFE, +0xEF,0x13,0x17,0x00,0x5F,0x0A,0x69,0x20,0x00,0xC3,0x13,0x17,0x00,0x5F,0x0A,0x89, +0x20,0x00,0x9F,0x13,0x17,0x00,0x5F,0x0B,0x09,0x20,0x00,0x7B,0x13,0x17,0x00,0x5F, +0x0B,0x29,0x23,0xFE,0x5F,0x13,0x17,0x00,0x5F,0x04,0x09,0x20,0x00,0x33,0x12,0xF7, +0x00,0x5E,0xE4,0x29,0x20,0x00,0x25,0x0A,0xEA,0x19,0x22,0xEE,0x18,0x98,0x61,0xE4, +0x00,0xA7,0x5E,0x9D,0xC1,0xC1,0xC4,0xE2,0x0E,0x23,0xFD,0x6B,0xE7,0xFF,0xFE,0xE9, +0x0E,0xEA,0x06,0x13,0x17,0x00,0xD3,0x00,0x27,0xD2,0x13,0x17,0x00,0x5F,0x0B,0x9B, +0x20,0x13,0xC1,0x13,0x17,0x00,0x5F,0x0A,0x49,0x07,0x00,0x80,0x20,0x00,0xA5,0x0B, +0x2A,0x19,0xD3,0x24,0x1B,0x16,0x13,0x37,0x01,0x13,0x57,0x02,0x12,0xF7,0x03,0x4F, +0x39,0x40,0x47,0x39,0xD5,0xC3,0x22,0x7F,0xEE,0x20,0x0D,0x2D,0x8F,0x19,0x1A,0xF8, +0x00,0xE4,0x00,0x06,0x87,0x13,0x37,0x00,0x5F,0x2A,0x69,0x20,0x02,0xCD,0x0B,0x2A, +0x19,0xD3,0x23,0x25,0x7E,0x13,0x57,0x01,0x13,0x37,0x02,0x4E,0xFA,0x40,0x46,0xF7, +0xCD,0xCB,0x20,0x14,0x00,0xC2,0xE2,0x80,0x0A,0x4A,0xF7,0xC8,0x8E,0xF8,0x0E,0xEA, +0x1C,0xFE,0xE0,0x08,0x00,0xEE,0xEA,0x00,0xA1,0xE4,0x00,0x00,0x1D,0xE4,0x00,0x0A, +0x3E,0x98,0x61,0xE4,0x00,0x0A,0x72,0xE4,0x00,0x93,0xE0,0x5C,0x63,0x00,0x20,0x63, +0xBC,0xEC,0x0A,0x00,0xA3,0xE4,0x00,0x94,0xE8,0xE4,0x00,0x94,0x7A,0xEB,0x0A,0x00, +0xA3,0xEA,0xEA,0x00,0xA1,0xD7,0x17,0x01,0x26,0xEA,0xEA,0x00,0xA3,0xEA,0xEA,0x00, +0xA1,0xE4,0x00,0x94,0x70,0xE4,0x00,0x94,0xDC,0xE4,0x00,0x94,0xA0,0xEC,0x0A,0x00, +0xA3,0xEC,0x0A,0x00,0xA1,0xE4,0x00,0x08,0x77,0xE4,0x00,0x93,0xCE,0x5C,0x63,0x00, +0x20,0x63,0x66,0xE4,0x00,0x93,0x22,0x5C,0x63,0x00,0x20,0x63,0x0C,0xEA,0xEA,0x00, +0xA3,0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x92,0x9C,0xEA,0xEA,0x00, +0xA3,0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xE7,0xFF,0xFF,0x47,0x13,0x17, +0x00,0xD3,0x01,0x04,0x26,0x0A,0xEA,0x19,0xD2,0xE1,0x13,0xE6,0xFE,0xEA,0x00,0xB4, +0xEE,0xEA,0x00,0xB0,0x12,0xEB,0x00,0x22,0xE0,0x4A,0x9A,0xE8,0x53,0x00,0x52,0xFA, +0xEA,0x00,0xBC,0x9A,0xE8,0xE4,0x00,0x00,0x21,0x9A,0xE8,0x53,0x00,0x62,0xFA,0xEA, +0x00,0xBC,0x52,0xE0,0x80,0x1F,0x20,0x81,0xFB,0x2A,0x00,0xB4,0x13,0x2B,0x00,0xFB, +0x2A,0x00,0xB5,0xFB,0x0A,0x00,0xB6,0xF8,0x0A,0x00,0xB7,0x5E,0xF7,0x00,0xFA,0xEA, +0x00,0xB8,0xF8,0x0A,0x00,0xB9,0xF8,0x0A,0x00,0xBA,0xC2,0xE0,0x10,0x01,0xF8,0x0A, +0x00,0xBB,0xEB,0x17,0x00,0xD9,0xC7,0x18,0xFF,0xFD,0xEF,0x17,0x00,0xD9,0x12,0xEC, +0x00,0x52,0xF7,0x01,0x9B,0x01,0x1A,0xEC,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08, +0x33,0xE4,0x00,0x04,0x07,0x13,0x17,0x00,0x23,0x09,0x4A,0x0B,0x0A,0x19,0xD3,0x02, +0x0F,0xB6,0x12,0xF7,0x01,0x22,0xE0,0x4A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9, +0x18,0x17,0x00,0xE4,0x00,0x00,0x29,0x22,0xE4,0x5E,0xC2,0xF4,0x00,0x01,0x9B,0x01, +0xCA,0xF7,0x3D,0xF9,0x1B,0x17,0x00,0x12,0xF7,0x00,0xE4,0x00,0x00,0x2D,0xD2,0xE2, +0x0E,0x36,0xC3,0x14,0x00,0x01,0xCB,0x18,0x3D,0xF9,0x1A,0xF8,0x00,0x12,0xF8,0x00, +0x5E,0xF7,0x00,0x1A,0xEB,0x00,0xE4,0x00,0x03,0x5D,0x13,0x17,0x00,0x5F,0x0B,0x01, +0x20,0x00,0x31,0x13,0x17,0x00,0x5F,0x0B,0x29,0x20,0x04,0xB5,0x0B,0x0A,0x19,0x23, +0x0C,0xB6,0xC3,0x00,0x10,0x01,0x9B,0x21,0xEF,0x38,0x06,0x88,0x13,0x17,0x01,0x12, +0xF7,0x02,0x4F,0x18,0x40,0x47,0x18,0xBD,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x20, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x34,0xE4,0x00,0x02,0xD9,0x0B,0x0A,0x19,0xD3, +0x04,0x0B,0x2E,0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xFE,0x23,0x00,0x68,0xEB,0x2A, +0x00,0xA5,0xEB,0x0A,0x00,0xA7,0x43,0x19,0xC5,0xD3,0x0A,0x00,0x60,0xF3,0x0A,0x00, +0xA8,0xF8,0x0A,0x00,0xA8,0x11,0xD7,0x01,0xC1,0xA0,0x10,0x01,0x13,0x57,0x02,0xFD, +0x6D,0x07,0x00,0x13,0x17,0x03,0x4E,0xEE,0x08,0x43,0x2B,0xBC,0x9E,0xE1,0x1B,0x59, +0x00,0x8E,0xEB,0x1B,0x17,0x00,0xC2,0xE0,0x10,0x01,0x99,0x81,0xED,0x97,0x06,0xFC, +0xE4,0x00,0x06,0xA0,0xEC,0x6A,0x00,0xA7,0xF2,0xEA,0x00,0xA8,0x4D,0xCC,0x74,0x45, +0xCE,0xBD,0x5D,0xCE,0x00,0xF9,0xCA,0x00,0xA8,0xF2,0xEA,0x00,0xA8,0x56,0xF7,0x01, +0xD2,0xE0,0x07,0xA2,0xF2,0xEA,0x00,0xA8,0x56,0xF7,0x02,0xD2,0xE0,0x07,0x4A,0xF2, +0xEA,0x00,0xA8,0x56,0xF7,0x04,0xD2,0xE0,0x06,0xF2,0xF2,0xEA,0x00,0xA8,0x56,0xF7, +0x08,0xD2,0xE0,0x06,0x9A,0xF3,0x4D,0x07,0x00,0x13,0x0B,0x01,0x12,0xEB,0x02,0x4E, +0xF7,0x40,0x13,0x2B,0x03,0x4F,0x5A,0xC0,0x4F,0x18,0x80,0x47,0x1A,0xC5,0x47,0x18, +0xCD,0x47,0x18,0xBD,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x34,0x13,0x4B,0x04,0x13, +0x0B,0x05,0x12,0xEB,0x06,0x4E,0xF7,0x40,0x13,0x2B,0x07,0x4F,0x5A,0xC0,0x4F,0x18, +0x80,0x47,0x1A,0xC5,0x47,0x18,0xCD,0x47,0x18,0xBD,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x08,0x20,0xF2,0xEA,0x00,0xA8,0xF8,0x0A,0x00,0xA8,0xC2,0xE0,0x10,0x01,0xED,0x97, +0x06,0x88,0xE4,0x00,0x00,0xE5,0x13,0x17,0x00,0x5F,0x04,0x09,0x20,0x00,0x99,0x0B, +0x0A,0x19,0x23,0x0D,0x8A,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9,0x40,0x46,0xF7, +0xC5,0xC2,0xEB,0x54,0xA4,0x20,0x01,0x3D,0x12,0xED,0x00,0x52,0xF7,0x03,0xE4,0x00, +0x00,0x87,0x13,0x17,0x00,0x5F,0x04,0x29,0x20,0x06,0xE1,0x0B,0x0A,0x19,0x23,0x0C, +0xDA,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9,0x40,0x46,0xF7,0xC5,0xC3,0x00,0x10, +0x01,0xEE,0xF8,0x00,0xCC,0x12,0xED,0x00,0x57,0x37,0x01,0x23,0x20,0x64,0xEF,0x18, +0x00,0xCE,0x23,0x00,0x32,0x9B,0x1B,0x46,0xF7,0xC4,0xE4,0x00,0x00,0x0F,0x52,0xF7, +0x04,0x1A,0xED,0x00,0x0C,0x0A,0x00,0x0C,0x0A,0x19,0xE4,0x00,0x02,0xED,0xE4,0x00, +0x8D,0xD2,0x5C,0x63,0x00,0xD0,0x60,0x0B,0x5A,0xE4,0x00,0x8F,0x14,0xE4,0x00,0x8E, +0xD8,0x50,0x60,0x20,0xE4,0x00,0x03,0xD0,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9, +0x12,0xF7,0x00,0x1A,0xEB,0x00,0x12,0xEB,0x00,0x22,0xE0,0x42,0xC2,0xE0,0x10,0x01, +0x99,0xC6,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0xD8,0x12,0xEB,0x00,0x22,0xE0,0x4E,0x12, +0xED,0x00,0x56,0xF7,0x01,0x5E,0xE0,0x09,0x49,0xC4,0x43,0xE4,0x00,0x00,0x43,0x12, +0xEB,0x00,0x22,0xE4,0x2A,0x51,0xC0,0x80,0xE4,0x00,0x00,0x29,0x12,0xEB,0x00,0x22, +0xEB,0xD8,0x12,0xEB,0x00,0x22,0xEF,0xC0,0xC9,0xC0,0xFF,0xFF,0xEE,0xEA,0x00,0xAE, +0x22,0xE4,0x2E,0xED,0xCA,0x00,0xA1,0xEC,0x0A,0x00,0xAC,0xE4,0x00,0x8D,0xFC,0xEA, +0xEA,0x00,0xA1,0xD5,0xD7,0x00,0x71,0x12,0xEC,0x00,0x56,0xF7,0x01,0xD2,0xE0,0x05, +0x22,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0x50,0x23,0x00,0x24,0x9F,0x1F,0xFB,0x17, +0x08,0x50,0xEC,0x0A,0x00,0xA3,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x2C,0xF1, +0xAA,0x00,0xBC,0xE4,0x00,0x00,0xAD,0xE9,0xAA,0x00,0xA1,0xE4,0x00,0x00,0x9D,0x12, +0xEB,0x00,0x22,0xE0,0x42,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x56,0xE4,0x00, +0x00,0x3D,0xE4,0x00,0x8B,0xDE,0x5C,0x63,0x00,0x20,0x63,0xE4,0xE7,0xFF,0xFF,0xD3, +0xEA,0xEA,0x00,0xA3,0xEF,0x0A,0x00,0xB2,0xE4,0x00,0x00,0x17,0xEA,0xEA,0x00,0xA3, +0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x8B,0x5E,0xEA,0xEA,0x00,0xA3, +0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xEA,0xEA,0x00,0xA3,0xD6,0xED,0xFD, +0x96,0xE4,0x00,0x8D,0x04,0xE4,0x00,0x8C,0xC8,0xEC,0x0A,0x00,0xA1,0xEC,0x0A,0x00, +0xA3,0xE4,0x00,0x00,0x45,0x98,0x60,0x9D,0x61,0xE4,0x00,0x8A,0xFC,0xE4,0x00,0x00, +0x0D,0x99,0x60,0xD5,0xCB,0xFF,0x95,0xE4,0x00,0x8C,0xB8,0xE4,0x00,0x8C,0x7C,0xEC, +0x0A,0x00,0xA1,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD9,0x53,0x18,0x02,0xEF,0x17, +0x00,0xD9,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x33,0xC3,0x00,0x32,0x0A,0x20,0x00, +0x49,0x13,0x0C,0x00,0x9B,0x3E,0xEC,0x17,0x08,0x33,0x47,0x18,0xCC,0x1B,0x0C,0x00, +0x0E,0x01,0x02,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D, +0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0xE4,0x00,0x93,0x30,0x98,0x60,0x88,0x83,0xE4,0x00,0x90,0x62,0x98,0x61, +0x98,0x82,0xE4,0x00,0x90,0x52,0x98,0x60,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x8C,0x3E, +0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x8D,0xA4,0x0D,0x21,0x06,0x9C,0x28,0xE4, +0x00,0x95,0xFB,0x20,0x64,0x1E,0xE4,0x00,0x97,0x25,0xE4,0x00,0x97,0x43,0x9C,0x38, +0x0D,0x21,0x04,0xE4,0x00,0x97,0x58,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x97,0x1F, +0xE4,0x00,0x99,0x17,0xE4,0x00,0x98,0xAD,0xE4,0x00,0x99,0x77,0xE4,0x00,0x99,0xD3, +0xE4,0x00,0x9D,0xB1,0xE4,0x00,0x9B,0x1B,0xE4,0x00,0x9A,0x1F,0xE4,0x00,0x9A,0x55, +0xE4,0x00,0x9A,0x8B,0xE4,0x00,0x9A,0xAF,0xE4,0x00,0x9A,0xD3,0xE4,0x00,0x99,0x09, +0xE4,0x00,0x9B,0x01,0x20,0x60,0x28,0x20,0x64,0x3E,0xE4,0x00,0x00,0x11,0xE4,0x00, +0x9B,0x9D,0xE4,0x00,0x9B,0xB7,0x85,0x29,0xE4,0x00,0x9E,0x55,0xE4,0x00,0x9B,0xC5, +0xC2,0xE0,0x10,0x01,0xE8,0x77,0x00,0xC3,0xEB,0x17,0x00,0xC3,0xD4,0x78,0xFF,0xC6, +0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,0x21,0x0C,0x5D,0x43,0x04, +0xE7,0xFF,0xFF,0xC0,0xC2,0xE0,0x10,0x01,0xFF,0x17,0x00,0xE6,0x89,0x77,0x0C,0x78, +0x03,0xE7,0xFF,0xFF,0x9E,0xFF,0x0B,0x00,0xE6,0x0B,0x18,0x03,0x40,0x63,0xC5,0x5F, +0x03,0x04,0xD5,0x58,0xFF,0x7D,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C, +0x21,0x10,0x85,0x29,0xE4,0x00,0x9E,0x71,0xC3,0x34,0x00,0x01,0xCA,0xF9,0x23,0xFC, +0x0A,0xF7,0x00,0xD2,0xFF,0x04,0x3C,0xC3,0x00,0x10,0x01,0xF2,0xF8,0x07,0x08,0x9E, +0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x07,0x08,0x22,0xE1,0xCA,0xC3,0x00,0x10,0x01,0xC3, +0x60,0x10,0x01,0xFF,0x18,0x03,0x72,0xCA,0xE0,0x11,0x7D,0xCB,0x39,0x22,0x00,0xFF, +0x7B,0x09,0x0C,0x1F,0x57,0xFD,0x57,0x5A,0xFF,0x4F,0x5A,0x10,0x8F,0x59,0x0B,0x9A, +0x01,0x4F,0x97,0x08,0x8F,0x9B,0xEB,0x9C,0xDD,0x3B,0x0F,0x9A,0x01,0x5F,0x57,0x00, +0x5F,0x4F,0xE9,0x57,0x57,0xFF,0x4F,0x5A,0x10,0x8F,0x59,0x0B,0x9A,0x01,0x20,0x00, +0x6D,0xFF,0xA0,0x80,0x00,0x5F,0x9C,0x04,0x47,0x9C,0xEC,0x0B,0xB8,0x01,0xC7,0xBD, +0x7F,0xFF,0x47,0x9C,0xED,0xE4,0x00,0x00,0x0F,0x0B,0x98,0x01,0x0F,0x9A,0x01,0x9E, +0xE1,0x9F,0x02,0xC2,0xE2,0x30,0x04,0x23,0xFE,0xB1,0x85,0x29,0x5C,0x63,0x04,0xE4, +0x00,0x9D,0x43,0x9A,0xE0,0x8B,0x17,0xE4,0x00,0x00,0x1D,0x43,0x23,0xBC,0x9E,0xE1, +0x13,0x39,0x00,0x8F,0x19,0xD4,0x97,0xFF,0xB4,0x40,0x60,0xC5,0x85,0x29,0x9C,0x38, +0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFC,0xFC,0x98,0x61,0xE7,0xFF,0xFC,0xF0,0xC2, +0xE0,0x10,0x01,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0x3A,0x50,0x60,0xC8,0xE7,0xFF,0xFD, +0xCA,0xE4,0x00,0x00,0x15,0x98,0x6F,0xE7,0xFF,0xFD,0x8A,0x0D,0x21,0x06,0x98,0x60, +0x9C,0x28,0xE7,0xFF,0xFC,0xA3,0x9C,0x38,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x04,0xEC, +0x17,0x08,0x31,0x0D,0x41,0x00,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x00,0xC0,0x23,0x00, +0x42,0xC3,0x00,0x10,0x01,0x98,0x66,0xEF,0x18,0x00,0xE2,0x23,0x08,0x78,0xF2,0xF7, +0x00,0xC0,0x50,0x60,0x80,0x22,0xE0,0x52,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xC8, +0x56,0xF7,0x01,0x5E,0xE0,0x09,0x48,0x64,0x43,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00, +0xD9,0x56,0xF7,0x02,0x22,0xE0,0x6C,0xC0,0x80,0x10,0x01,0xFC,0x84,0x07,0x0A,0xE7, +0xFF,0xEE,0x32,0xEA,0xEA,0x00,0xD9,0xC6,0xF7,0xFF,0xFD,0xEE,0xEA,0x00,0xD9,0x0D, +0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFE,0xAF,0x9C,0x30,0xC3,0x00,0x10, +0x01,0x0D,0x21,0x0C,0xFC,0x98,0x07,0x0A,0x0D,0x41,0x08,0x8A,0xE4,0x8B,0x24,0x18, +0x17,0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0x8C,0xD6,0xF8,0xFF,0x9E, +0x52,0xE0,0x62,0x1F,0x19,0x1F,0x1A,0xE4,0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x07, +0x0B,0x18,0x17,0x00,0x9E,0xE1,0xD7,0x17,0xFF,0xDE,0x1E,0xE0,0x9E,0xC3,0x60,0x10, +0x01,0x1A,0xE4,0x1F,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF8,0x12,0xF7,0x00,0xFA, +0xFB,0x07,0x09,0xF2,0xFB,0x07,0x09,0x22,0xEC,0xCC,0xC2,0xE0,0x10,0x01,0xC3,0x40, +0x10,0x01,0xF3,0xB7,0x0B,0x1A,0x9B,0x00,0xC2,0xE0,0x10,0x01,0xC3,0xC0,0x10,0x01, +0xC1,0x00,0x10,0x01,0xFE,0xF7,0x07,0x2A,0xFF,0x5A,0x09,0x48,0x8B,0x38,0xFF,0xDE, +0x0C,0x96,0xFD,0x08,0x09,0x0C,0xE4,0x00,0x01,0x09,0xC3,0x80,0x10,0x01,0x9A,0xE0, +0xFF,0x9C,0x0B,0x04,0x8B,0x64,0x43,0x17,0xE4,0x0B,0x38,0x00,0x43,0x17,0xDC,0x4F, +0x59,0x42,0x1B,0x38,0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0xA5, +0x0C,0x81,0x04,0x50,0x60,0x20,0xE7,0xFF,0xFA,0xBC,0xC1,0x40,0x10,0x01,0xEA,0xEA, +0x00,0xD9,0x0C,0x81,0x06,0x56,0xF7,0x02,0x22,0xE1,0x74,0xE4,0x00,0x00,0x8F,0xF3, +0x9B,0x07,0x09,0x23,0x84,0x34,0x23,0x88,0x68,0x43,0x98,0x44,0xE4,0x00,0x00,0x0F, +0x43,0x98,0xF4,0x15,0x5C,0x01,0x19,0x57,0x00,0x0B,0x9C,0x01,0xE4,0x00,0x00,0x21, +0x0F,0x9A,0x02,0x4D,0x5C,0x82,0x4F,0x9C,0x42,0x19,0x57,0x00,0x1B,0x97,0x01,0x9F, +0x21,0x9F,0x02,0x5F,0x39,0x04,0x9E,0xE2,0x9F,0x44,0xD7,0xB9,0xFE,0x2D,0xE7,0xFF, +0xFF,0x45,0x50,0x60,0x80,0xE7,0xFF,0xEB,0xC6,0xEA,0xEA,0x00,0xD9,0xC6,0xF7,0xFF, +0xFD,0xEE,0xEA,0x00,0xD9,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF, +0xFC,0x41,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF0,0x77,0x0B,0x90,0xC3,0x20, +0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x0B,0xA2,0xFE,0xF7,0x07,0x90,0xFF,0x39, +0x07,0x98,0x9B,0x60,0x98,0x81,0xE4,0x00,0x01,0x7D,0x0B,0x57,0x01,0xC3,0x4F,0xFF, +0xE0,0x20,0x00,0x35,0x0B,0x57,0x03,0xC3,0x4F,0xFF,0xE4,0x20,0x00,0x49,0x0B,0x58, +0x01,0x18,0x19,0x00,0x0F,0x57,0x01,0x0B,0x58,0x03,0x0F,0x57,0x03,0x13,0x59,0x00, +0x23,0x41,0x22,0x0B,0x98,0x03,0x0B,0x57,0x03,0x43,0x5C,0xD5,0x5F,0x5A,0x06,0x4F, +0xDA,0xFA,0x0B,0xB8,0x01,0x47,0x5E,0xD6,0x09,0x17,0x01,0x43,0x5A,0xF5,0x41,0x1D, +0x45,0x5D,0x08,0x06,0x4F,0xC8,0xFA,0x45,0x1E,0x46,0x43,0xC8,0xF5,0x8F,0xDA,0x5F, +0xCC,0x99,0x20,0x00,0x25,0x5F,0x46,0x51,0x20,0x01,0x11,0x18,0x99,0x00,0x0F,0xB7, +0x01,0x0F,0x97,0x03,0xE4,0x00,0x00,0x71,0x0B,0x98,0x01,0x0B,0xD7,0x01,0x43,0xDC, +0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x0B,0x58,0x03,0x41,0x1E,0xED, +0x0B,0xD7,0x03,0x43,0xDA,0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43, +0xBD,0xF5,0xD7,0xA8,0x00,0x52,0x0F,0x97,0x01,0x0F,0x57,0x03,0x0B,0x57,0x01,0x9F, +0x61,0x0F,0x58,0x01,0x5F,0x7B,0x00,0x0B,0x57,0x03,0x9F,0x21,0x0F,0x58,0x03,0x9E, +0xE4,0x1F,0x18,0x30,0xD7,0x63,0xFA,0x36,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x3D,0xF9,0x1C,0x21,0xD8,0xCA,0xF7,0x3D,0xF8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D, +0x81,0x18,0x0D,0xA1,0x14,0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x0E,0x21, +0x04,0x0D,0x21,0x24,0xC1,0x80,0x10,0x01,0xFD,0x8C,0x08,0x86,0x0A,0x2C,0x01,0xC6, +0x31,0x7F,0xFF,0x0E,0x2C,0x01,0x13,0x38,0x00,0xC3,0x00,0x10,0x01,0xFB,0x38,0x00, +0xC0,0x13,0x37,0x00,0xC2,0xE0,0x10,0x01,0xFB,0x37,0x07,0x09,0xC1,0xE0,0x10,0x01, +0xC1,0xC0,0x10,0x01,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0x5D,0xA3,0x00,0xFD, +0xEF,0x09,0x0C,0xFD,0xCE,0x07,0x8C,0xFE,0x00,0x80,0x00,0xFD,0x5B,0x07,0x0A,0xFD, +0x7A,0x0B,0x90,0xD1,0xA1,0x12,0x8E,0x0B,0x2B,0x16,0x0A,0xEB,0x18,0x46,0x11,0x85, +0x0E,0xEB,0x17,0x0E,0x0C,0x01,0x0F,0x2B,0x19,0x13,0x0B,0x00,0xD3,0x01,0x1F,0x79, +0x0B,0x6B,0x46,0x0B,0x0B,0x48,0x0F,0x6B,0x49,0x0F,0x0B,0x47,0xD7,0x17,0x1F,0x4C, +0x0E,0xEB,0x47,0x0F,0x0B,0x17,0x0F,0x2B,0x49,0x0F,0x6B,0x19,0xE4,0x00,0x07,0xB3, +0xC2,0xE0,0x10,0x01,0x5F,0x98,0x04,0xEA,0xF7,0x0B,0x21,0x5F,0x17,0x15,0x4A,0xFC, +0xB8,0x0E,0xEB,0x13,0xCF,0x39,0x00,0x30,0x9A,0xE0,0x8F,0x2B,0x0B,0x19,0x18,0x27, +0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x23,0x5F,0x17,0x15, +0x4A,0xF9,0xB8,0x0E,0xEB,0x15,0xCE,0xFB,0x00,0x30,0x8E,0xEB,0x0B,0x17,0x16,0x9A, +0xE0,0x27,0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x21,0x5F, +0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB,0x43,0xCF,0x7B,0x00,0x30,0x9A,0xE0,0x8F,0x6B, +0x0B,0x1B,0x18,0x27,0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B, +0x23,0x5F,0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB,0x45,0xE4,0x00,0x00,0x63,0xC3,0x00, +0x10,0x01,0x5F,0x77,0x04,0xEB,0x18,0x0B,0x21,0x5E,0xF8,0x15,0x4B,0x1B,0xC0,0x0F, +0x0B,0x13,0x9A,0xE0,0x27,0x3C,0x50,0xC2,0xE0,0x10,0x01,0x5F,0x19,0x04,0xEA,0xF7, +0x0B,0x23,0x5F,0x37,0x15,0x4A,0xF8,0xB8,0x0E,0xEB,0x15,0xE7,0xFF,0xFB,0x6E,0x12, +0xEB,0x00,0x26,0xE4,0x7D,0x0B,0x2B,0x43,0x0B,0x0B,0x13,0x43,0x19,0xC5,0x0B,0x2B, +0x45,0x0F,0x0B,0x1B,0x0B,0x0B,0x15,0x43,0x19,0xC5,0x0F,0x0B,0x1D,0xE4,0x00,0x00, +0x15,0x0C,0x0B,0x1B,0x0C,0x0B,0x1D,0xC3,0x00,0x10,0x01,0xF3,0x18,0x00,0xC0,0x23, +0x01,0x9E,0x53,0x00,0x52,0x0B,0x2B,0x13,0x1B,0x0A,0x00,0x4F,0x79,0x41,0x0B,0x0B, +0x15,0x4F,0x7B,0x20,0x4F,0x58,0x41,0x1B,0x2A,0x02,0x57,0x5A,0x0F,0x1B,0x0A,0x03, +0x47,0x5B,0xD5,0x1B,0x4A,0x01,0x26,0xE4,0xA1,0x0B,0x0B,0x1A,0x0A,0xEB,0x1C,0x4F, +0x38,0x42,0x4F,0x57,0x42,0x5F,0x39,0x04,0x57,0x5A,0x0F,0x4F,0x39,0x20,0x1B,0x0A, +0x05,0x47,0x39,0xD5,0x1A,0xEA,0x06,0x1B,0x2A,0x04,0xE4,0x00,0x00,0x1B,0x18,0x0A, +0x04,0x18,0x0A,0x05,0x18,0x0A,0x06,0x88,0x6A,0x98,0x87,0xE7,0xFF,0xF6,0x50,0x18, +0x6A,0x07,0xE4,0x00,0x01,0x8B,0x8B,0x0A,0x18,0x18,0x00,0xC3,0x20,0x10,0x01,0x9F, +0x01,0xFF,0x39,0x07,0x8C,0xD7,0x19,0xFF,0x9E,0x53,0x00,0x62,0x1B,0x0A,0x00,0x0B, +0x0B,0x13,0x4F,0x38,0x41,0x1B,0x0A,0x02,0x0B,0x0B,0x15,0x1B,0x2A,0x01,0x1B,0x0A, +0x04,0x4F,0x38,0x41,0x57,0x17,0x01,0x4E,0xF7,0x20,0x53,0x18,0x20,0x52,0xF7,0x02, +0x1B,0x0A,0x11,0x1A,0xEA,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B, +0x0A,0x0D,0x0A,0xEB,0x1C,0x4F,0x17,0x42,0x1B,0x2A,0x03,0x1B,0x0A,0x0F,0x1A,0xEA, +0x10,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF5,0x7A,0xC2,0xE0,0x10,0x01,0xC3,0x20, +0x10,0x01,0xC3,0x80,0x10,0x01,0x18,0x6A,0x1F,0xFE,0xF7,0x07,0x2A,0xFF,0x39,0x09, +0x48,0x9B,0x00,0xC3,0x60,0x10,0x01,0xFF,0x9C,0x0C,0x96,0xF3,0x5B,0x07,0x09,0x23, +0x44,0x34,0x23,0x48,0x68,0x43,0x58,0x7C,0xE4,0x00,0x00,0x0F,0x43,0x58,0xE4,0x17, +0xBA,0x01,0x1B,0xB7,0x00,0x0B,0x5A,0x01,0xE4,0x00,0x00,0x21,0x0F,0x59,0x02,0x4F, +0xBA,0x82,0x4F,0x5A,0x42,0x1B,0xB7,0x00,0x1B,0x57,0x01,0x9F,0x02,0x9E,0xE2,0x9F, +0x24,0x5F,0x07,0x49,0x23,0xFF,0x1D,0x0A,0xEC,0x00,0xD2,0xFF,0x0F,0x6C,0x9A,0xE1, +0xE4,0x00,0x02,0xF5,0xD1,0xA0,0x05,0x66,0xFE,0xE0,0x7F,0xFF,0xC3,0x20,0x10,0x01, +0xC3,0x40,0x10,0x01,0xEE,0xF9,0x07,0x91,0xF8,0x1A,0x07,0x98,0xFF,0x39,0x07,0x90, +0xFF,0x5A,0x07,0x98,0x0E,0xF9,0x03,0x0E,0xF9,0x05,0x0E,0xF9,0x07,0x18,0x1A,0x01, +0xF2,0xF8,0x00,0xC0,0x22,0xE0,0xB2,0x52,0xE0,0x52,0x1A,0xEA,0x00,0x9A,0xFF,0x88, +0x6A,0x1A,0xEA,0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x05, +0x1A,0xEA,0x06,0x98,0x87,0xE7,0xFF,0xF3,0xFC,0x18,0x6A,0x07,0xE4,0x00,0x00,0x89, +0x8A,0xEA,0x18,0x17,0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0x8C,0xD6, +0xF8,0xFF,0x9E,0x52,0xE0,0x62,0x9B,0x1F,0x1A,0xEA,0x00,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x07,0x0B,0x1B,0x17,0x00,0xC3,0x20,0x10,0x01,0x9E,0xE1,0xFF,0x39,0x07,0x29, +0xD6,0xF9,0xFF,0x9E,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF3,0x74,0x18,0x6A,0x1F, +0x0A,0xEC,0x01,0x0C,0x0E,0x00,0x46,0x10,0xBD,0x0E,0x0C,0x01,0xE4,0x00,0x02,0x77, +0xD1,0xA2,0x06,0x8E,0xF2,0xF8,0x00,0xC0,0x22,0xE0,0xD2,0x52,0xE0,0x52,0xC3,0x00, +0x10,0x01,0x1A,0xEA,0x00,0xEB,0x18,0x08,0x31,0x9A,0xFF,0x1B,0x0A,0x05,0x1A,0xEA, +0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x06,0x88,0x6A,0x98, +0x87,0xE7,0xFF,0xF2,0xE4,0x18,0x6A,0x07,0xE4,0x00,0x01,0x15,0x8A,0xEA,0x18,0x17, +0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0x8C,0xD6,0xF8,0xFF,0x9E,0x52, +0xE0,0x62,0x1A,0xEA,0x00,0x0A,0xEB,0x13,0x4F,0x17,0x41,0x1A,0xEA,0x02,0x1B,0x0A, +0x01,0x0A,0xEB,0x15,0x4F,0x17,0x41,0x1A,0xEA,0x04,0x1B,0x0A,0x03,0x12,0xEB,0x00, +0x57,0x17,0x01,0x4E,0xF7,0x20,0x53,0x18,0x20,0x52,0xF7,0x02,0x1B,0x0A,0x11,0x1A, +0xEA,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B,0x0A,0x0D,0x0A,0xEB, +0x1C,0x4F,0x17,0x42,0x1A,0xEA,0x10,0x1B,0x0A,0x0F,0x88,0x6A,0x50,0x80,0x1F,0xE7, +0xFF,0xF2,0x08,0x9A,0xE0,0x18,0x6A,0x1F,0x43,0x17,0x7C,0x0B,0x38,0x00,0x43,0x17, +0x54,0x4F,0x59,0x42,0x1B,0x38,0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE7,0x49,0x23, +0xFF,0xA5,0x46,0x11,0x85,0x9A,0xE2,0x0E,0x0C,0x01,0x0E,0xEE,0x00,0xE4,0x00,0x00, +0xD5,0x21,0xAD,0x9A,0x1E,0xE0,0xA7,0x1A,0xEA,0x00,0x9A,0xE6,0x1A,0xEA,0x02,0x52, +0xE0,0x50,0x1A,0xEA,0x03,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x31,0x46,0x11,0x85, +0x18,0x0A,0x01,0x0E,0x0C,0x01,0x1A,0xEA,0x04,0x88,0x6A,0x98,0x85,0xE7,0xFF,0xF1, +0x4C,0x0D,0xAE,0x00,0x18,0x6A,0x05,0xE4,0x00,0x00,0x61,0x9B,0x00,0xD2,0xFF,0xE6, +0x10,0xE7,0xFF,0xF9,0x5B,0x0A,0xEB,0x46,0x0B,0x0B,0x16,0x5E,0xF8,0x15,0x4B,0x21, +0x01,0xCE,0xF9,0x00,0x30,0x8E,0xEB,0x4B,0x60,0x0A,0x0B,0x17,0x16,0x9A,0xE0,0xD3, +0x1F,0xE0,0x8C,0xE7,0xFF,0xF8,0x3D,0x0E,0x21,0x06,0x0E,0x01,0x0A,0x0D,0xE1,0x0E, +0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D, +0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x81,0x20, +0x5D,0x43,0x00,0x5D,0x84,0x00,0x42,0xEC,0x55,0x9E,0xE1,0x5E,0xF7,0x00,0x57,0x17, +0x03,0x4E,0xF7,0x11,0x5F,0x00,0x09,0x0D,0x61,0x24,0x0D,0xA1,0x1C,0x0D,0xC1,0x18, +0x49,0xA1,0x01,0x0D,0x21,0x2C,0x8D,0xB7,0xC1,0xD8,0x00,0x21,0xE4,0x00,0x60,0xE2, +0x99,0x60,0xFD,0xCE,0xBA,0xA7,0xE4,0x00,0x00,0xE3,0x88,0x61,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xB9,0xDC,0x9A,0xE4,0x43,0x0E,0x54,0x13,0x58,0x00,0x1F,0x01, +0x18,0x4F,0x3A,0x09,0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B, +0x50,0x7B,0x47,0x5A,0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18, +0x02,0x1F,0x61,0x18,0x47,0x18,0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x9D,0x41,0x5D,0x4A, +0x00,0xD5,0x4C,0x00,0xE1,0x06,0xE0,0x81,0xCC,0x6B,0x00,0x18,0x88,0x81,0x8C,0x77, +0x50,0xA0,0x18,0x9D,0x61,0xE7,0xFF,0xBA,0x16,0xE4,0x00,0x00,0x1D,0x9E,0xE1,0xD2, +0xE8,0xFD,0x4E,0xE7,0xFF,0xFF,0xC5,0x5E,0xEB,0x00,0xD5,0xB7,0xFC,0x85,0xE4,0x00, +0x60,0x04,0x0D,0x21,0x2E,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22,0x0D,0x61, +0x26,0x0D,0x41,0x2A,0x1C,0x21,0x30,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x03, +0x2E,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x07,0xE6,0x85,0x29,0x1C,0x21,0xD0, +0x0D,0x21,0x2C,0x0D,0x41,0x28,0x0D,0x61,0x24,0xD0,0x69,0x0C,0x95,0x4F,0x03,0x10, +0xC2,0xF8,0x00,0x21,0xC1,0x78,0x00,0x21,0xFE,0xF7,0xBA,0x40,0xFD,0x6B,0xBA,0xA7, +0x8E,0xF8,0x0E,0xF7,0x02,0x86,0xE9,0x1C,0x83,0x01,0xCC,0x63,0x00,0x1A,0xCC,0x84, +0x00,0x1A,0x9C,0x9F,0xE7,0xFF,0xFD,0xC6,0xE4,0x00,0x02,0xC7,0x0C,0x61,0x04,0xE4, +0x00,0x5E,0xFC,0x0C,0x61,0x06,0x99,0x40,0x9C,0x7E,0x5C,0x63,0x00,0xCC,0x63,0x00, +0x1A,0x8D,0x63,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xB7,0xE8, +0x8B,0x2A,0x9A,0xE4,0x5F,0x23,0x39,0x20,0x00,0xDD,0x43,0x0B,0xCC,0x13,0x98,0x00, +0x4F,0x7C,0x09,0x57,0x9C,0x01,0x5F,0x80,0x01,0x4B,0x50,0x7B,0x1F,0x01,0x20,0x8F, +0x1B,0x17,0x18,0xE8,0x47,0x1A,0xC4,0x5F,0x57,0x02,0x20,0x00,0x25,0x4F,0x57,0x20, +0x5F,0x5A,0x02,0x1F,0x81,0x20,0x47,0x5A,0xC5,0x8F,0x7C,0x1B,0x5B,0xE8,0x9F,0x21, +0x9E,0xE1,0xD2,0xE8,0xFE,0x16,0x06,0xE0,0x81,0xCC,0x6A,0x00,0x06,0x1C,0x81,0x08, +0x8C,0x77,0x50,0xA0,0x18,0xE7,0xFF,0xB8,0x16,0x9D,0x44,0x5D,0x43,0x89,0x23,0xFE, +0x55,0xE4,0x00,0x01,0xAD,0xE4,0x00,0x5D,0xF0,0x1C,0x61,0x08,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xB6,0xFC,0xC3,0x78,0x00,0x21,0x9A,0xE4,0xFF,0x7B,0xBA,0xA4, +0xD2,0xE7,0x01,0xC2,0x43,0x1B,0xBC,0x13,0x58,0xFC,0x1F,0x01,0x20,0x4F,0x3A,0x09, +0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50,0x7B,0x47,0x5A, +0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x81,0x20, +0x47,0x18,0xD5,0x8F,0x3C,0x1B,0x19,0xE8,0x9E,0xE1,0xD2,0xE8,0xFE,0x36,0xE4,0x00, +0x00,0xD9,0xE4,0x00,0x5D,0x36,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7, +0xFF,0xB6,0x42,0x8B,0x0B,0xE4,0x00,0x00,0x9F,0x43,0x38,0xBC,0x13,0x79,0xFC,0x1F, +0x21,0x20,0x4F,0x5B,0x09,0x57,0x7B,0x01,0x8F,0x3A,0x13,0x39,0xE8,0x5F,0x60,0x01, +0x4B,0x70,0x7B,0x47,0x7B,0xCC,0x5F,0x37,0x02,0x5F,0x7B,0x02,0x20,0x00,0x25,0x4F, +0x37,0x20,0x5F,0x39,0x02,0x1F,0x81,0x20,0x47,0x39,0xDD,0x8F,0x5C,0x1B,0x3A,0xE8, +0x9E,0xE1,0xD2,0xE8,0xFE,0x3E,0xC2,0xF8,0x00,0x21,0x9F,0x04,0xFE,0xF7,0xBA,0xBF, +0xD7,0x17,0x00,0x52,0x9A,0xE4,0xE7,0xFF,0xFF,0x67,0x04,0x60,0x81,0x1C,0x81,0x08, +0x50,0xA0,0x18,0xE7,0xFF,0xB6,0x5A,0xE4,0x00,0x5C,0x72,0x0D,0x61,0x26,0x0D,0x41, +0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x0D, +0x21,0x14,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x89,0x43,0xD0,0x67,0x06, +0x3A,0xD0,0x67,0x00,0x65,0xD0,0x61,0x0B,0x1D,0xE4,0x00,0x00,0x19,0xD0,0x69,0x0A, +0xDE,0xE4,0x00,0x02,0x19,0xC1,0xA0,0x10,0x01,0xCD,0x63,0x00,0x1A,0xFD,0xAD,0x07, +0xE8,0x99,0x80,0x8D,0x6D,0x13,0x4B,0x01,0x13,0x2B,0x00,0x13,0x0B,0x03,0x12,0xEB, +0x02,0x4C,0x9A,0xC0,0x4C,0xB8,0xC0,0x4F,0x5A,0x80,0x4F,0x18,0x80,0x8C,0x9A,0x8C, +0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x88,0x6C,0x8C,0x99,0x8C, +0xB7,0x9D,0x81,0xE4,0x00,0x5D,0xD8,0x5D,0x8C,0x00,0x9D,0x64,0xD1,0x86,0xFE,0x4E, +0x98,0x66,0x98,0x80,0x98,0xA0,0xCD,0x4A,0x00,0x1A,0x8D,0x4D,0x10,0xCA,0x18,0xE4, +0x00,0x5E,0x08,0x98,0x66,0x98,0x80,0x98,0xA1,0x10,0xCA,0x18,0xE4,0x00,0x5D,0xEE, +0x98,0x66,0x98,0x81,0x98,0xA0,0x10,0xCA,0x19,0xE4,0x00,0x5D,0xD4,0x98,0x66,0x98, +0x81,0x98,0xA1,0x10,0xCA,0x19,0xE4,0x00,0x5D,0xBA,0x98,0x66,0x98,0x82,0x98,0xA0, +0x98,0xC0,0xE4,0x00,0x5D,0xA2,0x98,0x66,0x98,0x82,0x98,0xA1,0x98,0xC0,0xE4,0x00, +0x5D,0x8A,0x98,0x66,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x5D,0x72,0x98,0x66, +0xE4,0x00,0x00,0x83,0xC1,0xA0,0x10,0x01,0x99,0x40,0xFD,0xAD,0x08,0x06,0x5D,0x8A, +0x00,0x41,0x6A,0x6C,0x98,0x60,0x88,0x8C,0x98,0xA0,0x10,0xCB,0x00,0xE4,0x00,0x5D, +0x2C,0x98,0x60,0x88,0x8C,0x98,0xA1,0x10,0xCB,0x00,0x9D,0x41,0xE4,0x00,0x5D,0x0E, +0x21,0x4F,0x7A,0x98,0x60,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x5C,0xF0,0x98, +0x60,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16, +0x98,0x83,0x98,0xA1,0x98,0xC0,0x1C,0x21,0x18,0xE4,0x00,0x5C,0xB5,0xC3,0x00,0x10, +0x01,0x0D,0xA1,0x06,0xFE,0xF8,0x08,0x02,0xF3,0x38,0x08,0x02,0x13,0x57,0x01,0x13, +0x17,0x03,0x4C,0x9A,0xC0,0x12,0xF7,0x02,0x4C,0xB8,0xC0,0x4F,0x5A,0x80,0x4F,0x18, +0x80,0x8C,0x9A,0x8C,0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x0D, +0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x98,0x60,0x8C,0x99,0x8C, +0xB7,0x1C,0x21,0x18,0xE4,0x00,0x5B,0xB7,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61, +0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x1C,0x21,0xE0,0x0D, +0xC1,0x08,0x0D,0x21,0x1C,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1, +0x0C,0x0D,0xE1,0x04,0x89,0xC4,0xD0,0x66,0x00,0xB5,0xC2,0xF8,0x00,0x21,0xFE,0xF7, +0xBA,0x68,0x4C,0x63,0x10,0x8C,0x77,0x0E,0xE3,0x02,0x86,0xE9,0x99,0xED,0xC9,0x80, +0x3E,0x0C,0xE4,0x00,0x01,0xC9,0xD0,0x81,0x04,0x41,0x1E,0xE4,0xFE,0xD2,0xE1,0x04, +0x89,0x5C,0x80,0xE1,0xCA,0xE0,0x3E,0x0C,0xC9,0x80,0x10,0x06,0x49,0xE1,0x6B,0x49, +0x8C,0xB8,0x99,0xA2,0x99,0x41,0x99,0x60,0x48,0x60,0x1A,0xE4,0x00,0x01,0x87,0xD0, +0x81,0x04,0x09,0x1E,0xE4,0xFE,0xD2,0xE1,0x04,0x51,0x5C,0x80,0xE1,0xCA,0xE0,0x3E, +0x0C,0xC9,0x80,0x10,0x06,0x99,0xA0,0x49,0xE1,0x6B,0x49,0x8C,0xB8,0x89,0x4D,0x99, +0x60,0x48,0x61,0x1B,0xE4,0x00,0x01,0x35,0x24,0x85,0xE9,0x5C,0x80,0xE1,0xCA,0xE0, +0x3E,0x0C,0xC9,0x80,0x08,0x03,0x49,0xE1,0x6B,0x49,0x8C,0xB8,0xE4,0x00,0x00,0xD9, +0x24,0x85,0xC1,0x5C,0x80,0xE1,0xCA,0xE0,0x3E,0x0C,0xC9,0x80,0x10,0x06,0x49,0xE1, +0x6B,0x49,0x8C,0xB8,0xE4,0x00,0x00,0xC5,0x99,0xE1,0xE4,0x00,0x00,0x95,0x99,0xE7, +0xC9,0x80,0x3E,0x0C,0x99,0xA2,0x99,0x41,0x99,0x60,0xE4,0x00,0x00,0x21,0x99,0xE7, +0xC9,0x80,0x3E,0x0C,0x99,0xA2,0x99,0x41,0x99,0x63,0x98,0x60,0xE4,0x00,0x00,0x85, +0x99,0xA0,0x99,0xE7,0xC9,0x80,0x3E,0x0C,0x89,0x4D,0x99,0x60,0xE4,0x00,0x00,0x21, +0x99,0xA0,0x99,0xE7,0xC9,0x80,0x3E,0x0C,0x89,0x4D,0x99,0x63,0x98,0x61,0xE4,0x00, +0x00,0x41,0x99,0xE7,0xC9,0x80,0x08,0x03,0x99,0xA0,0x89,0x4D,0xE4,0x00,0x00,0x1D, +0x99,0xE7,0xC9,0x80,0x10,0x06,0x99,0xA2,0x99,0x41,0x99,0x60,0x98,0x63,0xE7,0xFF, +0x7E,0x28,0x88,0x6A,0x88,0x8D,0xE4,0x00,0x73,0x4A,0x88,0x6A,0x88,0x8C,0xE4,0x00, +0x5A,0x6A,0x21,0xA0,0x3E,0x88,0x6A,0x88,0x8C,0xE4,0x00,0x6F,0x24,0xE4,0x00,0x00, +0x1F,0x21,0xA0,0x2C,0x88,0x6A,0x88,0x8C,0xE4,0x00,0x70,0x80,0x88,0x6A,0x05,0x80, +0xFF,0xC9,0x8C,0xFF,0xFF,0x88,0x8C,0xE4,0x00,0x5C,0xF0,0x88,0x8C,0x88,0x6A,0xE4, +0x00,0x5A,0x78,0x98,0x62,0xE4,0x00,0x57,0xF8,0xC2,0xE0,0x10,0x01,0x98,0x60,0xEC, +0x17,0x07,0xDC,0xC1,0xA0,0x10,0x01,0xEC,0x0D,0x07,0xE0,0xE4,0x00,0x64,0x34,0x98, +0x60,0xE4,0x00,0x5C,0x34,0x98,0x60,0x88,0x8C,0xE4,0x00,0x5B,0x24,0x88,0x6F,0xE4, +0x00,0x57,0x50,0x98,0x60,0xE4,0x00,0x5D,0x74,0x21,0x64,0x5E,0xED,0x6D,0x07,0xE0, +0x98,0x61,0xE4,0x00,0x63,0xE6,0x98,0x63,0xE4,0x00,0x5B,0xE6,0xE4,0x00,0x00,0x2B, +0x21,0x6C,0x46,0x98,0x61,0x88,0x8C,0xE4,0x00,0x5A,0xC8,0x98,0x61,0xE4,0x00,0x5D, +0x24,0xE4,0x00,0x61,0x08,0x1C,0x63,0x13,0x5C,0x83,0x00,0x88,0x6A,0x5C,0x82,0x93, +0x20,0x00,0x1B,0x50,0x80,0x14,0xE4,0x00,0x5E,0x26,0x88,0x6A,0x98,0x8C,0xE4,0x00, +0x5D,0x48,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xED,0xD7,0x07,0xE4,0xE7,0xFF,0xF5,0xA2, +0x88,0x6E,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61, +0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0xE7,0xFF,0xF8,0xBF,0xC2,0xE0, +0x10,0x01,0x9C,0x38,0xEC,0x77,0x03,0x2C,0x0D,0x41,0x00,0x0D,0x21,0x04,0x89,0x43, +0xE7,0xFF,0xFB,0xB8,0x25,0x44,0xD3,0x99,0x40,0x88,0x6A,0x98,0x80,0x9D,0x41,0xE4, +0x00,0x63,0x26,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x9E,0xE7,0xFF,0xE1,0xEC,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x00,0xE6,0x0C,0x77,0x0B,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06, +0x87,0x53,0x18,0x20,0xEF,0x17,0x06,0x87,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28, +0x85,0x29,0x1C,0x21,0xD8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x20,0x0D,0xC1,0x10,0xEE, +0xF7,0x00,0xE2,0x0D,0x21,0x24,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x0D, +0xE1,0x0C,0x0E,0x01,0x08,0x0E,0x21,0x04,0x0E,0x41,0x00,0x5E,0xE0,0x41,0x89,0x43, +0x49,0xC1,0x01,0x24,0x64,0x59,0x1E,0xE3,0xFE,0xD2,0xE1,0x04,0x11,0xD0,0x67,0x04, +0x2A,0xD0,0x69,0x04,0x3A,0xE4,0x00,0x00,0xED,0x51,0x60,0x1A,0x9A,0xE0,0x20,0x60, +0x5C,0x9A,0xE0,0xD1,0x45,0x00,0x92,0x9A,0xE1,0x21,0x44,0x30,0x21,0x4C,0x24,0xD1, +0x46,0x00,0x32,0x9A,0xE0,0xCE,0xF7,0x00,0x34,0xC1,0xE0,0x10,0x01,0xC2,0x00,0x10, +0x01,0xFD,0xEF,0x08,0xD8,0xFE,0x10,0x07,0xA8,0x99,0x80,0xC2,0x40,0x10,0x01,0x8D, +0xF7,0x8E,0x17,0x89,0xAC,0x1E,0x2A,0xFE,0xFE,0x52,0x08,0x4A,0x88,0x6D,0x98,0x81, +0x88,0xAE,0xE4,0x00,0x6B,0x76,0x42,0xEF,0x64,0x25,0x44,0x41,0x42,0xF0,0x64,0x26, +0x24,0x29,0xD1,0x47,0x00,0x56,0x42,0xEC,0x94,0x0C,0x77,0x01,0x9D,0xA1,0x9D,0x82, +0x5D,0xAD,0x00,0xD5,0x6D,0xFE,0xCD,0xE4,0x00,0x00,0x41,0x51,0x60,0x1A,0xE4,0x00, +0x00,0x21,0x99,0x63,0xE7,0xFF,0xFF,0x3F,0x99,0x64,0xE7,0xFF,0xFF,0x33,0x9A,0xE0, +0x21,0x4A,0x06,0xE7,0xFF,0xFF,0x25,0x0E,0x41,0x02,0x0E,0x21,0x06,0x0E,0x01,0x0A, +0x0D,0xE1,0x0E,0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D, +0x41,0x22,0x0D,0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40, +0x0D,0x21,0x44,0x0D,0x61,0x3C,0x0D,0x81,0x38,0x89,0x44,0xD0,0x67,0x04,0xAD,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBA,0x84,0x4C,0x63,0x10,0xC1,0x60,0x10,0x01,0x8C,0x77, +0xC1,0x80,0x10,0x01,0x0E,0xE3,0x02,0xFD,0x6B,0x0A,0x9C,0xFD,0x8C,0x08,0xD8,0x86, +0xE9,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06,0x87,0xC7,0x18,0xFF,0xDF,0xEF,0x17,0x06, +0x87,0xD0,0x88,0x02,0xFD,0x9A,0xE1,0x4E,0xF7,0x24,0xC6,0xF7,0x01,0x83,0x22,0xE1, +0x48,0xE4,0x00,0x00,0x93,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x06,0x87,0xC7,0x18,0xFF, +0xDF,0xEF,0x17,0x06,0x87,0xD1,0x47,0x01,0xDD,0x9A,0xE1,0x4E,0xF7,0x54,0x57,0x17, +0x8C,0x23,0x00,0xA6,0x56,0xF7,0x03,0x22,0xE0,0xA4,0x88,0x6A,0xE7,0xFF,0xFD,0x0C, +0xCC,0x8A,0x00,0x34,0xCC,0xAA,0x00,0x68,0x1C,0x61,0x04,0x8C,0x8C,0x8C,0xAB,0x50, +0xC0,0x1A,0xE4,0x00,0x18,0x54,0xE4,0x00,0x00,0x15,0x88,0x6A,0xE7,0xFF,0xFC,0xCC, +0x0D,0x81,0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85, +0x29,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFE,0xF7,0x07,0xA8,0xCB,0x40,0xFF,0xFE,0x0B, +0x37,0x00,0x4F,0x19,0xFA,0x47,0x38,0xCE,0x43,0x19,0xC5,0x8C,0x78,0x5F,0x03,0x04, +0xCB,0x20,0xFF,0xFE,0x9E,0xE2,0x5C,0x79,0x17,0x48,0x78,0xD0,0xC3,0x00,0x10,0x01, +0xFF,0x18,0x07,0xDC,0xD6,0xF8,0xFE,0xDE,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x07,0x9C,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x07,0xA0,0xC2,0xE0,0x10,0x01,0x9B,0x04, +0xEC,0x17,0x07,0xA4,0x98,0x64,0xC2,0xE0,0x10,0x01,0x98,0x80,0xEF,0x17,0x03,0x2C, +0xE7,0xFF,0xF7,0x19,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0x9E,0xE4, +0x00,0x00,0x41,0x20,0x68,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xA2,0xE4,0x00, +0x00,0x23,0x9A,0xE0,0x20,0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xA6,0x88, +0x77,0x85,0x29,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x07,0x9C,0xE4,0x00, +0x00,0x3D,0x20,0x68,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x07,0xA0,0xE4,0x00,0x00, +0x1F,0x20,0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x07,0xA4,0x85,0x29,0x1C,0x21, +0xE0,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1, +0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0xEE,0xF7,0x08,0x22,0x0D,0x21,0x1C,0xC1,0x80, +0x10,0x01,0xC1,0x60,0x10,0x01,0x5D,0xE3,0x06,0x5D,0xC4,0x06,0x89,0x45,0x89,0xA6, +0x56,0xF7,0x01,0xFD,0x8C,0x08,0x44,0xFD,0x6B,0x08,0x14,0x22,0xE0,0xE0,0x98,0xA2, +0x25,0x44,0x43,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x94,0x8E,0xEA,0x10,0xB7,0x00, +0x0E,0xEB,0x02,0x5E,0xE0,0x29,0x88,0x6F,0x88,0x8E,0x48,0xA5,0x12,0xE7,0xFF,0x87, +0x58,0x5C,0x63,0x00,0x20,0x60,0x3C,0x0C,0x0C,0x00,0x0C,0x0D,0x00,0x98,0x61,0xE4, +0x00,0x00,0xED,0x21,0x45,0x38,0x21,0x40,0x28,0x21,0x4D,0x8E,0xE4,0x00,0x00,0xA7, +0x0E,0xEB,0x02,0x22,0xE4,0x36,0xE7,0xFF,0x8A,0x5A,0x98,0x62,0xE4,0x00,0x00,0x5D, +0x0E,0xEC,0x02,0x22,0xE4,0x86,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x08,0x36,0xC2,0xE0, +0x10,0x01,0xEC,0x97,0x08,0x22,0xE7,0xFF,0x90,0x76,0x88,0x6D,0xE7,0xFF,0x90,0x8E, +0xE4,0x00,0x00,0x15,0xE7,0xFF,0x89,0xFE,0x98,0x60,0x0C,0x0B,0x00,0xE4,0x00,0x00, +0x4B,0x88,0x6F,0x88,0x8E,0xE7,0xFF,0x8A,0x00,0x98,0x60,0xE4,0x00,0x00,0x2F,0xE7, +0xFF,0x89,0xC8,0x9A,0xE1,0x0E,0xEB,0x00,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x89,0xAE, +0x98,0x62,0x0D,0x4C,0x00,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81, +0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0xC3, +0x80,0x10,0x01,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3, +0x00,0x10,0x01,0xFF,0x9C,0x08,0x28,0xFF,0x7B,0x08,0x78,0xFF,0x5A,0x08,0x19,0xFF, +0x39,0x0B,0x70,0xFF,0x18,0x08,0x68,0x20,0x69,0x7A,0x0A,0xFC,0x04,0x0B,0xD9,0x09, +0x43,0xD7,0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43,0xBE,0xED,0x5F, +0xAC,0x99,0x20,0x00,0x7D,0x0B,0xBC,0x07,0x0B,0x99,0x0B,0x43,0xBD,0xE5,0x5F,0xBD, +0x06,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xC3,0x80,0x10,0xE8,0x20,0x05, +0x19,0x0E,0xF8,0x01,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x2F,0x0B,0x99,0x0B,0x0E, +0xF8,0x03,0x0B,0x39,0x0F,0x12,0xFA,0x00,0x0F,0x9B,0x01,0x0F,0x3B,0x03,0x52,0xF7, +0x02,0xE4,0x00,0x01,0x57,0xC3,0xA0,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0xBD,0x08, +0x11,0xFE,0xF7,0x0B,0x90,0x20,0x6D,0x92,0x0B,0x79,0x01,0x0B,0xDC,0x01,0x43,0xDE, +0xDD,0x5F,0xDE,0x06,0x4F,0x7E,0xFA,0x47,0xDB,0xF6,0x43,0x7E,0xDD,0x5F,0x6C,0x99, +0x20,0x00,0x7D,0x0B,0x39,0x03,0x0B,0x7C,0x03,0x43,0x7B,0xCD,0x5F,0x7B,0x06,0x4F, +0x3B,0xFA,0x47,0x79,0xDE,0x43,0x3B,0xCD,0xC3,0x20,0x10,0xE8,0x20,0x03,0x61,0x0B, +0x37,0x17,0x0F,0x38,0x01,0x0B,0x37,0x19,0x0F,0x38,0x03,0x0B,0x37,0x47,0x0A,0xF7, +0x49,0x0E,0xF8,0x07,0x12,0xFA,0x00,0x52,0xF7,0x01,0x0F,0x38,0x05,0x1A,0xFA,0x00, +0x9A,0xE2,0x1A,0xFD,0x00,0xE4,0x00,0x01,0x5F,0xD0,0x64,0x01,0xD6,0x0B,0x3B,0x00, +0x0B,0x7B,0x02,0x43,0x79,0xDD,0x9F,0x6E,0x5F,0x63,0x9B,0x20,0x00,0x2F,0xC3,0x20, +0x10,0x01,0xEB,0x39,0x08,0x6B,0x0B,0x18,0x01,0x0F,0x17,0x47,0x9B,0x02,0x0F,0x37, +0x49,0x1B,0x17,0x00,0x12,0xFA,0x00,0x9B,0x1D,0x46,0xF7,0xC4,0x1A,0xFA,0x00,0xE4, +0x00,0x00,0xEB,0xD0,0x65,0x03,0x8E,0x13,0x7D,0x00,0x23,0x68,0xFE,0x0B,0x98,0x00, +0x0B,0x59,0x00,0x8F,0x5C,0x43,0x5A,0xD8,0x0B,0x98,0x02,0x0F,0x57,0x17,0x0B,0x59, +0x02,0x8F,0x5C,0x43,0x5A,0xD8,0x0B,0x98,0x04,0x0F,0x57,0x19,0x0B,0x59,0x08,0x8F, +0x5C,0x43,0x5A,0xD8,0x0F,0x57,0x47,0x0B,0x58,0x06,0x0B,0x19,0x0A,0x8F,0x1A,0x43, +0x78,0xD8,0x0F,0x77,0x49,0xE4,0x00,0x00,0x55,0x23,0x64,0x9A,0x0B,0x38,0x01,0x0F, +0x37,0x17,0x0B,0x38,0x03,0x0F,0x37,0x19,0x0B,0x38,0x05,0x0B,0x18,0x07,0x0F,0x37, +0x47,0x0F,0x17,0x49,0x9B,0x3E,0x13,0x1A,0x00,0x47,0x18,0xCC,0x1B,0x1A,0x00,0x9B, +0x02,0x1B,0x17,0x00,0x85,0x29,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0x28,0xFE,0xE0, +0x7F,0xFF,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x9B,0x01, +0xC3,0x20,0x10,0x01,0xFF,0x39,0x03,0x6C,0x1B,0x19,0x01,0xC3,0x00,0x10,0x01,0xFF, +0x18,0x08,0x94,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0xC3, +0x00,0x10,0x01,0xF8,0x18,0x08,0x84,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x70,0x0E, +0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x0E,0xF8,0x09,0x0E,0xF8, +0x0B,0x0E,0xF8,0x0D,0x0E,0xF8,0x0F,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xA1,0xC2, +0xE0,0x10,0x01,0x18,0x19,0x00,0xF3,0x17,0x08,0x19,0x9B,0x3C,0x47,0x18,0xCC,0xFB, +0x17,0x08,0x19,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x11,0x85,0x29,0xC3,0x00,0x10, +0x01,0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFF,0x18,0x09,0x0C,0x9A,0xE0,0xFF,0x5A, +0x09,0xBC,0xE4,0x00,0x00,0x31,0x4F,0x37,0x10,0x0B,0x98,0x00,0x0B,0x78,0x02,0x8F, +0x3A,0x8F,0x7C,0x9E,0xE1,0x0F,0x79,0x00,0x9F,0x04,0x5F,0x37,0x00,0xD4,0x79,0xFF, +0x4D,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0xC1,0x08,0x0D, +0x21,0x1C,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x18,0x01,0x07,0xC1,0x40,0x10,0x01,0xC1, +0x60,0x10,0x01,0x5D,0xC3,0x00,0xFD,0x4A,0x08,0x13,0xFD,0x6B,0x08,0x12,0x21,0xC8, +0x36,0x18,0x0A,0x00,0x18,0x0B,0x00,0xE4,0x00,0x00,0x15,0x21,0xCC,0x1A,0x18,0x0A, +0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x10,0x77,0x01,0x12,0xF7,0x04,0xC1, +0xA0,0x10,0x01,0x40,0x63,0xBB,0xC1,0x80,0x10,0x01,0xE7,0xFF,0xFE,0xE6,0xFD,0xAD, +0x08,0x18,0xFD,0x8C,0x0B,0x90,0xD1,0xC1,0x04,0x2E,0x12,0xEA,0x00,0x22,0xE1,0xFA, +0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x09,0xBC,0x0F,0x17,0x02,0xC3,0x00,0x29,0xA8,0x20, +0x00,0x39,0x13,0x01,0x07,0x9F,0x01,0x5F,0x18,0x00,0x1B,0x01,0x07,0xC3,0x00,0x10, +0x01,0x9E,0xE4,0xFF,0x18,0x09,0xF0,0xD6,0xF8,0xFF,0x0E,0x12,0xE1,0x07,0xD2,0xE4, +0x01,0x49,0xE7,0xFF,0xE7,0xAE,0x20,0x68,0x84,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08, +0x3C,0xD2,0xE9,0x00,0xB5,0x12,0xEC,0x00,0x26,0xE4,0x3D,0x12,0xEB,0x00,0x9E,0xE1, +0x1A,0xEB,0x00,0xE4,0x00,0x00,0x0F,0x18,0x0B,0x00,0x12,0xEB,0x00,0x26,0xE5,0x01, +0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0x2A,0x18,0x0D,0x00,0xE4,0x00, +0x00,0x59,0x9A,0xE1,0x1A,0xEA,0x00,0xE4,0x00,0x00,0x47,0x12,0xEA,0x00,0x22,0xE4, +0x7E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0x2A,0x18,0x0D,0x00,0xE4, +0x00,0x00,0x1D,0xE7,0xFF,0xE6,0xEC,0x20,0x68,0x18,0x18,0x0C,0x00,0x12,0xED,0x00, +0x22,0xE0,0x2C,0x9E,0xFF,0x18,0x0C,0x00,0x1A,0xED,0x00,0x0D,0xC1,0x0A,0x0D,0xA1, +0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20, +0x85,0x29,0x98,0x62,0xE7,0xFF,0xFD,0x9F,0xC3,0x00,0x10,0x01,0x5C,0x84,0x00,0xFF, +0x18,0x09,0x0C,0x20,0xA0,0x6C,0xE4,0x00,0x00,0x4B,0x4F,0x37,0x08,0x9E,0xE1,0x43, +0x59,0xC4,0x8F,0x23,0x0B,0x5A,0x00,0x0F,0x59,0x01,0xE4,0x00,0x00,0x0D,0x9A,0xE0, +0x5F,0x37,0x00,0xD4,0x99,0xFF,0x3D,0xE4,0x00,0x00,0x7B,0x20,0xA4,0xE6,0xE4,0x00, +0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1,0x43,0x43,0xCC,0x8F,0x38,0x0B,0x5A,0x00,0x0F, +0x59,0x01,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x5F,0x37,0x00,0xD4,0x99,0xFF,0x3D,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x1A,0x10,0x77,0x01,0x12,0xF7,0x04,0x40,0x63,0xBB, +0xE7,0xFF,0xFC,0x5B,0x85,0x29,0x9C,0x38,0x98,0x63,0x0D,0x21,0x04,0xE7,0xFF,0x6C, +0xAA,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x72,0xAD,0x9A,0xED,0x1C,0x21,0xE8,0x0D, +0x41,0x10,0x0D,0x61,0x0C,0xC1,0x60,0x10,0x01,0xFD,0x4B,0x0B,0x1A,0x1A,0xEA,0x04, +0x9A,0xE1,0x1A,0xEA,0x01,0xFE,0xE0,0x07,0xFF,0x0E,0xEA,0x07,0x0E,0xEA,0x09,0xC2, +0xE0,0x10,0x01,0x9B,0x02,0xFB,0x17,0x08,0x72,0x52,0xE0,0xAA,0x0D,0x21,0x14,0x0E, +0xEA,0x0B,0x50,0x60,0x19,0x98,0x80,0xE7,0xFF,0x2C,0x66,0x52,0xE0,0x1D,0xFA,0xEB, +0x0B,0x1A,0x9A,0xE4,0x1A,0xEA,0x0C,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x00,0xD5,0xC2, +0xE0,0x10,0x01,0xEC,0x17,0x08,0x60,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x8C,0xC2, +0xE0,0x10,0x01,0xEC,0x17,0x08,0x87,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x54,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x5C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8A,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x83,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x48,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x9C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x76,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x67,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x65,0xC2, +0xE0,0x10,0x01,0xEC,0x17,0x08,0x58,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x31,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0x77,0xC2,0xE0,0x10,0x01,0x9B,0x03,0xFB,0x17,0x08, +0x66,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x07,0x8C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0x84,0xC2,0xE0,0x10,0x01,0xFF,0x00,0x01,0xF4,0xEF,0x17,0x06,0x85,0xC2,0xE0,0x10, +0x01,0x50,0x60,0x14,0xF8,0x17,0x08,0x9D,0x50,0x80,0x50,0xE7,0xFF,0x7B,0xB8,0x52, +0xE0,0x64,0x50,0x80,0x35,0x0E,0xE1,0x01,0x50,0xA0,0x59,0xFC,0xC0,0x07,0xFF,0xFC, +0xE0,0x07,0xFF,0x99,0x00,0xC0,0x60,0x10,0x01,0xFC,0x63,0x01,0x88,0xE7,0xFF,0x98, +0xE2,0xC0,0x60,0x10,0x01,0x98,0x80,0xFC,0x63,0x09,0xBC,0x50,0xA0,0x3C,0xE7,0xFF, +0x9B,0xE4,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x90,0x18,0x17,0x04,0x18,0x17,0x05, +0x18,0x17,0x06,0x18,0x17,0x34,0x18,0x17,0x35,0x18,0x17,0x36,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x50,0xC2,0xE0,0x10,0x01,0xF3,0x37,0x00,0xC0,0xC2,0xF4,0x00,0x01, +0xCB,0x17,0x3D,0xF9,0xCA,0xF7,0x3D,0xF8,0x1B,0x38,0x00,0xC3,0x00,0x10,0x01,0xF3, +0x18,0x07,0x09,0x1B,0x17,0x00,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x3F,0x53,0x18, +0x04,0xEF,0x17,0x08,0x3F,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x1D, +0x58,0xEF,0x17,0x03,0xE4,0xC2,0xE0,0x10,0x01,0x53,0x00,0xDF,0xEF,0x17,0x08,0x93, +0xC2,0xE0,0x10,0x01,0x53,0x00,0xCA,0xEF,0x17,0x08,0x25,0xC2,0xE0,0x10,0x01,0xC3, +0x00,0x00,0x01,0xFF,0x18,0x1B,0xCF,0xEF,0x17,0x03,0xF8,0xC2,0xE0,0x10,0x01,0xC3, +0x00,0x00,0x01,0xFF,0x18,0x19,0x89,0xEF,0x17,0x04,0x18,0xC2,0xE0,0x10,0x01,0xC3, +0x00,0x00,0x01,0xFF,0x18,0x1A,0x62,0xEF,0x17,0x04,0x14,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x0B,0x40,0xFE,0xF7,0x0B,0x40,0xC3,0x60,0x10,0x01,0x18,0x17,0x01,0x18,0x17, +0x02,0x18,0x17,0x03,0x0C,0x17,0x05,0x0C,0x17,0x07,0x0C,0x17,0x0B,0x0C,0x17,0x09, +0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0x9A,0xE0,0xFF,0x7B,0x09,0x0C,0xFF,0x5A, +0x0C,0x96,0xFF,0x39,0x09,0x48,0x43,0x17,0xDC,0x0C,0x18,0x01,0x43,0x17,0xD4,0x0C, +0x18,0x01,0x4F,0x17,0x08,0x8F,0x19,0x0C,0x18,0x00,0x9E,0xE2,0x5E,0xE7,0x49,0x23, +0xFF,0x9D,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29, +0xE4,0x00,0x6A,0xF1,0x1C,0x21,0xE8,0x0D,0x21,0x14,0xE7,0xFF,0xCD,0x74,0xE7,0xFF, +0xA4,0x36,0xE7,0xFF,0xCC,0x96,0xE7,0xFF,0xF0,0x08,0x98,0x60,0x98,0x81,0xE7,0xFF, +0x66,0x0C,0x98,0x81,0x98,0x60,0x88,0xA4,0xE7,0xFF,0x66,0x12,0x98,0x81,0x98,0x60, +0x88,0xA4,0xE7,0xFF,0x66,0x28,0x98,0x80,0x98,0x61,0x88,0xA4,0xE7,0xFF,0x66,0x14, +0x98,0xA0,0x98,0x62,0x98,0x81,0xE7,0xFF,0x66,0x00,0x98,0x62,0x98,0x80,0xE7,0xFF, +0x66,0x76,0x98,0x60,0x50,0x80,0x66,0xE7,0xFF,0x66,0x7E,0x98,0x61,0x50,0x80,0x66, +0xE7,0xFF,0x66,0x6C,0x98,0x62,0x50,0x80,0xF3,0xE7,0xFF,0x66,0x5A,0x98,0x60,0xFC, +0x80,0xA0,0x00,0xE7,0xFF,0x66,0xA2,0x98,0x61,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x66, +0x8E,0x98,0x62,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x66,0x7A,0xFC,0x80,0x01,0x26,0x98, +0x62,0xE7,0xFF,0x66,0xC2,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x96,0x60,0xE7,0xFF,0xFA, +0x3A,0x98,0x61,0xE7,0xFF,0x45,0xCA,0xE7,0xFF,0x31,0xFE,0x50,0x60,0x1B,0xE7,0xFF, +0x6A,0xB0,0x9A,0xEE,0x0E,0xE1,0x00,0x52,0xE0,0x14,0x0E,0xE1,0x04,0xCA,0xE0,0x07, +0xD0,0x98,0xC8,0x0E,0xE1,0x08,0x98,0xAE,0x88,0xE6,0x99,0x0A,0x98,0x6A,0x98,0x8C, +0xE7,0xFF,0x26,0x0E,0x98,0x81,0x98,0x60,0xE7,0xFF,0xCB,0xB0,0x50,0x60,0x10,0xE7, +0xFF,0xCB,0xE2,0xE4,0x00,0x3F,0x22,0xE7,0xFF,0xF9,0x7E,0x98,0x80,0x98,0x60,0xE7, +0xFF,0x23,0xD0,0xE7,0xFF,0xB7,0x36,0xE7,0xFF,0xB6,0x2C,0xC2,0xE0,0x10,0x01,0xF0, +0x77,0x03,0x6E,0xE7,0xFF,0xCB,0x7A,0x9B,0x00,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0D,0xC3,0x17,0x00,0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D,0xC3,0x17,0x00,0x0F, +0x53,0x18,0x08,0xC3,0x17,0x00,0x0D,0xC2,0xE0,0x01,0x1F,0x52,0xF7,0x06,0xC2,0xE0, +0x01,0x1D,0xFC,0x60,0x01,0x40,0xE7,0xFF,0xCB,0x24,0x50,0x60,0x20,0xE7,0xFF,0xCB, +0x2E,0x98,0x61,0x50,0x80,0x13,0x50,0xA0,0x37,0x98,0xC8,0xFC,0xE0,0x01,0x0D,0xE7, +0xFF,0xAA,0x6A,0xC3,0x00,0x00,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x46,0xAE,0x0D, +0x21,0x16,0xEF,0x17,0x03,0xD0,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEF, +0x17,0x00,0xE2,0x23,0x05,0x08,0xEE,0xF7,0x00,0xE2,0x22,0xE8,0xEC,0xC3,0x00,0x10, +0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x08,0x4A,0xFE,0xF7,0x08,0x7C,0x0B,0x38,0x01, +0xC3,0x60,0x10,0x01,0x0F,0x37,0x01,0xC3,0x40,0x10,0x01,0x0B,0x38,0x03,0xFF,0x7B, +0x0A,0x8C,0x0F,0x37,0x03,0x0B,0x18,0x05,0xFF,0x5A,0x0B,0x80,0x0F,0x17,0x05,0x9A, +0xE0,0xE4,0x00,0x00,0x5D,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0x9A,0xE0,0xFF, +0x7B,0x08,0xA4,0xFF,0x5A,0x08,0xD8,0x43,0x17,0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01, +0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xE7,0xFF,0xFF,0x45,0x43, +0x17,0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01,0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE2,0x09, +0x23,0xFF,0xBD,0x85,0x29,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0x9A,0xE0,0xFF, +0x18,0x0C,0x96,0xFF,0x7B,0x08,0xA4,0x43,0x37,0xC4,0x43,0x57,0xDC,0x0B,0x5A,0x01, +0x0F,0x59,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x08,0x7C,0x0B,0x37,0x01,0x0F,0x38,0x35,0x0B,0x37,0x03,0x0A,0xF7,0x05,0x0F, +0x38,0x37,0x0E,0xF8,0x39,0x85,0x29,0xE4,0x00,0x68,0xED,0xC2,0xE0,0x10,0x01,0xFF, +0x20,0xDF,0x9F,0xEB,0x17,0x08,0x87,0x47,0x18,0xCC,0x9B,0x3E,0xEF,0x17,0x08,0x87, +0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x71,0x47,0x18,0xCC,0xEF,0x17,0x08,0x71,0x85, +0x29,0xE4,0x00,0x71,0x9D,0xE4,0x00,0x71,0x3B,0xE4,0x00,0x71,0xCB,0xC2,0xE0,0x10, +0x01,0x88,0xC3,0xF3,0x17,0x00,0xC0,0x23,0x08,0x4A,0xF2,0xF7,0x00,0xC0,0x22,0xE8, +0x2E,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x09,0xC3,0x00,0x10,0x01,0x9A,0xE0,0xFF, +0x18,0x09,0x0C,0x8B,0x38,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3,0x01,0x20,0x00, +0x25,0x5E,0xE3,0x29,0x20,0x00,0x31,0x0B,0x59,0x01,0x4F,0x5A,0x08,0x0F,0x59,0x01, +0x9E,0xE1,0x9F,0x22,0x5E,0xE3,0x49,0x23,0xFF,0x79,0xC2,0xE0,0x10,0x01,0xC3,0x40, +0x10,0x01,0xF3,0x77,0x0B,0x1A,0xFF,0x5A,0x08,0x86,0x1F,0xBB,0xFF,0x0A,0xFA,0x01, +0x9B,0x20,0xE4,0x00,0x00,0x57,0xD7,0xB9,0x00,0xB8,0x0B,0xD8,0x00,0x0B,0x98,0x02, +0x8F,0x9E,0xCB,0xD7,0x20,0x00,0xC3,0x80,0x1B,0xCC,0x4A,0xFE,0xB8,0x0B,0x98,0x00, +0x53,0xD7,0x40,0x5F,0x84,0x19,0x9F,0x21,0x4A,0xFE,0xB8,0x9F,0x02,0x5F,0x99,0x04, +0xD7,0x7C,0xFE,0xB5,0x98,0x60,0x0E,0xFA,0x01,0x88,0x83,0x98,0xA0,0xE7,0xFF,0xB3, +0x4F,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x40,0x10,0x01,0x20,0x64,0x62, +0xE7,0xFF,0xB4,0x6A,0x20,0x64,0x56,0xF2,0xEA,0x08,0x48,0x9E,0xE1,0xFA,0xEA,0x08, +0x48,0xE4,0x00,0x00,0x19,0xE7,0xFF,0xB4,0xF0,0xF8,0x0A,0x08,0x48,0xE7,0xFF,0xDA, +0x78,0x9A,0xE3,0x20,0x64,0x34,0xE7,0xFF,0xDA,0x66,0x5C,0x60,0x49,0x4A,0xE3,0x4B, +0xC3,0x00,0x10,0x01,0xF3,0x38,0x08,0x48,0xD6,0xF9,0x02,0x1D,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x9C,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8A,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x83,0xC2,0xE0,0x10,0x01,0xF8,0x18,0x08,0x48,0xF8,0x17,0x08,0x9D, +0x0D,0x41,0x02,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEB,0x17,0x08,0x87,0x9C,0x28, +0x53,0x18,0x80,0xEF,0x17,0x08,0x87,0xE7,0xFF,0x64,0xF3,0x0D,0x41,0x02,0x0D,0x21, +0x06,0x9C,0x28,0x85,0x29,0x9C,0x38,0xC3,0x14,0x00,0x01,0x0D,0x21,0x04,0xCA,0xF8, +0x22,0x00,0x0B,0x37,0x01,0xCB,0x18,0x26,0x18,0x9B,0x3F,0x0F,0x37,0x01,0x0B,0x38, +0x01,0x53,0x39,0x02,0x0F,0x38,0x01,0x0B,0x17,0x01,0xFC,0x60,0x01,0x00,0x0C,0x17, +0x01,0xE7,0xFF,0xC6,0x0E,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEB,0x17,0x00,0xD5, +0x9C,0x28,0xC7,0x18,0xFE,0xFF,0xEF,0x17,0x00,0xD5,0x85,0x29,0x5C,0xC6,0x00,0x9A, +0xE0,0xE4,0x00,0x00,0x45,0x4F,0x17,0x08,0x4F,0x57,0x10,0x43,0x23,0xC4,0x8F,0x45, +0x8F,0x04,0x0F,0x5A,0x02,0x0B,0x18,0x01,0x4F,0x5A,0x42,0x9E,0xE1,0x43,0x18,0xD5, +0x0F,0x19,0x01,0x5F,0x17,0x00,0xD4,0xD8,0xFE,0xFD,0x85,0x29,0x9C,0x38,0x0D,0x21, +0x04,0xE4,0x00,0x38,0x32,0x0D,0x21,0x06,0xFC,0x60,0x01,0x00,0x9C,0x28,0xE7,0xFF, +0xC5,0x45,0x9C,0x38,0x0D,0x21,0x04,0xE4,0x00,0x38,0x06,0x0D,0x21,0x06,0xFC,0x60, +0x01,0x00,0x9C,0x28,0xE7,0xFF,0xC5,0x09,0x9C,0x38,0x98,0x80,0x0D,0x21,0x04,0x98, +0x61,0xE7,0xFF,0xE3,0x1A,0x98,0x60,0xE7,0xFF,0x63,0x2A,0x98,0x61,0x98,0x80,0xE7, +0xFF,0xE8,0x28,0x98,0x62,0x98,0x80,0xE7,0xFF,0xE8,0x18,0x0D,0x21,0x06,0x98,0x63, +0x98,0x80,0x9C,0x28,0xE7,0xFF,0xE7,0xFF,0x98,0x64,0x98,0x80,0xE7,0xFF,0xE2,0xC5, +0x9C,0x38,0x0D,0x21,0x04,0xE7,0xFF,0xD7,0xE8,0x24,0x64,0x29,0x20,0x69,0x8A,0xE4, +0x00,0x00,0x19,0xE7,0xFF,0xD7,0xCC,0xE4,0x00,0x00,0x57,0xE7,0xFF,0xC4,0xCA,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x00,0xE6,0x0A,0xF7,0x09,0x40,0x63,0xBD,0x5E,0xE3,0x04, +0xC2,0xE1,0x76,0xEA,0x20,0x00,0x7D,0x98,0x62,0xE7,0xFF,0xE7,0x16,0x20,0x60,0x5A, +0x98,0x61,0x98,0x80,0xE7,0xFF,0xE2,0x34,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7, +0xFF,0x62,0x3B,0x98,0x62,0x98,0x80,0xE7,0xFF,0xE2,0x0E,0xFC,0x60,0x01,0x5E,0xE7, +0xFF,0x8E,0x48,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF,0x61,0xBD,0x0D,0x21, +0x06,0x9C,0x28,0x85,0x29,0xD0,0x69,0x06,0x2D,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21, +0xFE,0xF7,0xBA,0xC4,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x18,0x09, +0x48,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x09,0xF8,0x87,0x29,0xC3,0x00,0x10,0x01,0xFF, +0x18,0x0B,0x34,0x0F,0x38,0x02,0x0F,0x37,0x68,0x0F,0x38,0x06,0x0F,0x18,0x0A,0x0F, +0x37,0x6C,0x0F,0x17,0x70,0xE4,0x00,0x01,0x0B,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B, +0x28,0x0F,0x37,0x02,0x0F,0x38,0x68,0x0F,0x37,0x06,0x0E,0xF7,0x0A,0x0F,0x38,0x6C, +0x0E,0xF8,0x70,0xE4,0x00,0x00,0xCF,0xCE,0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xCC, +0x63,0x00,0x1A,0xFF,0x7B,0x0A,0x9C,0x4C,0x63,0x10,0x8F,0x77,0x8F,0x03,0x9A,0xE0, +0x43,0x38,0xBC,0x43,0x5B,0xBC,0x0F,0x5A,0x02,0x0F,0x59,0x00,0x9E,0xE4,0x5E,0xED, +0x09,0x23,0xFF,0xBD,0xE4,0x00,0x00,0x6D,0x9C,0x7E,0xC3,0x40,0x10,0x01,0x5C,0x63, +0x00,0xFF,0x5A,0x0B,0xF4,0xCF,0x03,0x00,0x68,0xCC,0x63,0x00,0x1A,0x8F,0x58,0x4C, +0x63,0x10,0x8C,0x77,0x9A,0xE0,0x43,0x03,0xBC,0x43,0x3A,0xBC,0x0F,0x39,0x02,0x0F, +0x38,0x00,0x9E,0xE4,0x5E,0xED,0x09,0x23,0xFF,0xBD,0x85,0x29,0xD0,0x69,0x06,0x3D, +0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBA,0xEC,0x8E,0xF8,0xC3,0x00,0x10, +0x01,0x0F,0x37,0x02,0xFF,0x18,0x08,0xA4,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x08,0x7C, +0x87,0x29,0x0B,0x37,0x00,0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18,0x0B,0x34, +0xE4,0x00,0x00,0x25,0x0B,0x37,0x00,0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18, +0x0B,0x28,0x0F,0x38,0x00,0x0B,0x37,0x02,0x0A,0xF7,0x04,0x4F,0x39,0x40,0x4E,0xF7, +0x40,0x0F,0x38,0x04,0x0E,0xF8,0x08,0xE4,0x00,0x00,0xD9,0xCE,0xE3,0x00,0x34,0x8F, +0x17,0xCE,0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x0A,0x9C,0x8F,0x77,0x9A, +0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC,0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F, +0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xA9,0xE4,0x00,0x00,0x73,0x1E,0xE3, +0xFE,0x5E,0xF7,0x00,0xCF,0x37,0x00,0x34,0xCE,0xF7,0x00,0x68,0xC3,0x60,0x10,0x01, +0x8F,0x19,0xFF,0x7B,0x0B,0xF4,0x8F,0x77,0x9A,0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC, +0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F,0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89, +0x23,0xFF,0xA9,0xE7,0xFF,0xFC,0xE5,0x9C,0x38,0x98,0x64,0x0D,0x41,0x00,0x0D,0x21, +0x04,0x98,0x80,0xE7,0xFF,0xDE,0x96,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00,0xD5,0xC6, +0xF7,0xFE,0xFF,0xEE,0xEA,0x00,0xD5,0xE7,0xFF,0xFA,0xEA,0xEA,0xEA,0x00,0xD5,0xC6, +0xF7,0x01,0x00,0x22,0xE3,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xC0,0x3C,0xFC,0x60, +0x01,0x00,0xE7,0xFF,0xC0,0x0C,0xE7,0xFF,0xF5,0x4A,0x0D,0x21,0x06,0x0D,0x41,0x02, +0x98,0x60,0x9C,0x28,0xE7,0xFF,0xFD,0xD1,0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x3E, +0x98,0x60,0xE7,0xFF,0xFD,0xB4,0x98,0x68,0xE4,0x00,0x00,0x19,0x98,0x62,0xE7,0xFF, +0xFD,0x9C,0x98,0x69,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFD,0x87,0x9C,0x38,0x98, +0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0x70,0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7, +0xFF,0xFD,0x5B,0x20,0x80,0x64,0xD0,0x84,0x00,0xFA,0x20,0x88,0x90,0x20,0x8C,0xA8, +0x5C,0x80,0x21,0x4B,0x0A,0x01,0x8A,0xF8,0xE4,0x00,0x00,0x49,0x53,0x00,0x19,0x8A, +0xF8,0xE4,0x00,0x00,0x37,0x53,0x00,0x19,0x9A,0xE1,0xE4,0x00,0x00,0x25,0x53,0x00, +0x32,0x8A,0xF8,0xE4,0x00,0x00,0x13,0x53,0x00,0x50,0x8A,0xF8,0xD0,0x69,0x0A,0xE5, +0x4F,0x43,0x10,0xC3,0x38,0x00,0x21,0xFF,0x39,0xBB,0x14,0x8F,0x3A,0xC3,0x40,0x10, +0x01,0x0F,0x79,0x02,0xFF,0x5A,0x08,0xA4,0xC3,0x20,0x10,0x01,0xFF,0x39,0x08,0x7C, +0x87,0x69,0xCF,0x23,0x00,0x68,0xCC,0xA3,0x00,0x34,0xC0,0x80,0x10,0x01,0x8C,0xBA, +0xFC,0x84,0x0A,0x9C,0x99,0x02,0x8C,0x99,0xCB,0xA0,0x01,0xF4,0x9B,0x20,0x43,0x65, +0xCC,0x0B,0x9B,0x00,0x4F,0x79,0x08,0x4F,0x9C,0x40,0x8F,0x64,0x0F,0x5B,0x02,0x5F, +0x5C,0x1D,0x4B,0xD8,0xB8,0x43,0x9C,0xD5,0x43,0x9E,0xE3,0xCF,0xDA,0x01,0xF4,0x43, +0x9C,0x40,0x8F,0x9E,0x43,0x9C,0xE8,0x0F,0x9B,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23, +0xFF,0x3D,0xE4,0x00,0x01,0xCD,0x1F,0x23,0xFE,0x5F,0x39,0x00,0xCC,0xB9,0x00,0x34, +0xCF,0x39,0x00,0x68,0xC0,0x80,0x10,0x01,0x8C,0xBA,0xFC,0x84,0x0B,0xF4,0x99,0x02, +0x8C,0x99,0xCB,0xA0,0x01,0xF4,0x9B,0x20,0x43,0x65,0xCC,0x0B,0x9B,0x00,0x4F,0x79, +0x08,0x4F,0x9C,0x40,0x8F,0x64,0x0F,0x5B,0x02,0x5F,0x5C,0x1D,0x4B,0xD8,0xB8,0x43, +0x9C,0xD5,0x43,0x9E,0xE3,0xCF,0xDA,0x01,0xF4,0x43,0x9C,0x40,0x8F,0x9E,0x43,0x9C, +0xE8,0x0F,0x9B,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x3D,0xE4,0x00,0x01,0x19, +0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B,0x28,0xCB,0xA0,0x01,0xF4,0x0F,0x7A, +0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8, +0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F, +0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44,0xFF,0x7B,0x08,0x82,0xD7,0x3B, +0xFE,0x86,0xE4,0x00,0x00,0x8D,0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B,0x34, +0xCB,0xA0,0x01,0xF4,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D, +0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0, +0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44, +0xFF,0x7B,0x08,0x82,0xD7,0x3B,0xFE,0x86,0xE7,0xFF,0xF8,0x9B,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xFC,0xB2,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFC,0x93,0x1C,0x21, +0xC8,0x0D,0x41,0x30,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01,0x18, +0x0D,0x21,0x34,0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E, +0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0xC1,0xC0,0x10,0x01,0xFD,0xCE,0x08,0x86, +0x0A,0xEE,0x01,0xC7,0x17,0x7F,0xFF,0x0F,0x0E,0x01,0xC2,0x00,0x10,0x01,0xC1,0xA0, +0x10,0x01,0xC1,0xE0,0x10,0x01,0xC1,0x40,0x10,0x01,0x56,0xF7,0x08,0xFE,0x10,0x08, +0x54,0xFD,0xAD,0x08,0x60,0xFD,0xEF,0x08,0x5C,0xFD,0x4A,0x0B,0x90,0x22,0xE1,0x6C, +0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0x8E,0x22,0xE5,0x40,0xC3,0x00,0x10,0x01,0x0A, +0xEA,0x18,0xFF,0x18,0x01,0x64,0x0B,0x58,0x0A,0xD7,0x57,0x01,0x04,0xCB,0x20,0x07, +0xFF,0x43,0x59,0xD5,0xD6,0xFA,0x00,0xAC,0x0A,0xEA,0x16,0x0B,0x18,0x06,0xD7,0x17, +0x00,0x5C,0x43,0x19,0xC5,0xD6,0xF8,0x01,0x18,0xE7,0xFF,0xE3,0xBA,0x9A,0xE3,0x0E, +0xED,0x00,0xC2,0xE0,0x10,0x01,0x18,0x10,0x00,0xF8,0x17,0x08,0x76,0x18,0x0F,0x00, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x67,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x50, +0x22,0xE0,0x24,0x98,0x60,0xE7,0xFF,0xC2,0x8A,0x0E,0xED,0x02,0x22,0xE0,0x96,0x0A, +0xEE,0x01,0x56,0xF7,0x40,0xD2,0xE0,0x4B,0x62,0x98,0x63,0xE7,0xFF,0xE4,0xB0,0xE7, +0xFF,0x1C,0x40,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x76,0x9A,0xE1,0xE4,0x00,0x14, +0x21,0x22,0xE5,0x0E,0x0A,0xEE,0x01,0x57,0x17,0x08,0x23,0x00,0x2C,0xE7,0xFF,0xE2, +0xF2,0xE4,0x00,0x12,0xEF,0x57,0x17,0x40,0x23,0x00,0x94,0xC6,0xF7,0x20,0x00,0x22, +0xE0,0x7A,0xC2,0xE0,0x10,0x01,0x98,0x62,0xF3,0x17,0x08,0x76,0xC3,0x00,0x19,0x0A, +0x20,0x24,0x8F,0x9F,0x01,0xFB,0x17,0x08,0x76,0xE4,0x00,0x13,0xAF,0x0C,0x0D,0x00, +0xE4,0x00,0x13,0xA1,0xC2,0x20,0x10,0x01,0xFE,0x31,0x08,0x64,0x22,0xE8,0xAA,0x0A, +0xEE,0x01,0x56,0xF7,0x08,0x22,0xE0,0x68,0x12,0xF0,0x00,0x9E,0xE1,0x1A,0xF0,0x00, +0xE7,0xFF,0x1B,0x9E,0x12,0xF0,0x00,0xD2,0xE1,0x4D,0x49,0xE4,0x00,0x0E,0x75,0x18, +0x10,0x00,0xE4,0x00,0x11,0x25,0xC1,0x80,0x10,0x01,0xC1,0x60,0x10,0x01,0xFD,0x8C, +0x0B,0x70,0xFD,0x6B,0x08,0x28,0xD2,0xE3,0x38,0x96,0xE7,0xFF,0xCC,0x5E,0xC3,0x00, +0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x20,0x03,0xE8,0x20,0x68,0x1C,0xFF,0x20,0x01, +0xF4,0xEF,0x37,0x03,0x7B,0xEF,0x38,0x03,0x79,0x0A,0xEE,0x01,0x56,0xF7,0x08,0xD2, +0xE0,0x37,0x02,0xC1,0xC0,0x10,0x01,0xC2,0x00,0x10,0x01,0x12,0xEA,0x00,0xFD,0xCE, +0x08,0x94,0xFE,0x10,0x03,0x6C,0xD2,0xE1,0x0F,0xB9,0x0B,0x8B,0x04,0xC3,0x8F,0xFF, +0xE0,0x20,0x06,0x6D,0x08,0xAA,0x48,0x0B,0x2B,0x06,0x0B,0x6B,0x00,0x43,0xA5,0xCD, +0x08,0xCA,0x46,0x0B,0x4B,0x02,0x43,0xC6,0xE5,0x0B,0x0A,0x18,0x08,0x8A,0x16,0x42, +0xFA,0xC5,0x41,0x04,0xDD,0x42,0xFE,0xBB,0x41,0x3D,0x43,0x8E,0xE9,0x22,0xE1,0x84, +0x42,0x7C,0xDD,0x41,0x3A,0xCD,0x42,0x9D,0x9B,0x42,0x5E,0x4B,0x8E,0x92,0x22,0x80, +0x40,0x26,0x80,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x8F,0x26,0xFD,0x0E,0x4E,0xB7, +0xFA,0x46,0x55,0xBE,0x42,0x52,0xAD,0x4E,0xB4,0xFA,0x46,0x95,0xA6,0x42,0xB4,0xAD, +0xD6,0xB2,0x01,0x74,0x42,0x98,0xD5,0x41,0x28,0x4B,0x42,0x74,0x9B,0x8E,0x69,0x22, +0x60,0x40,0x26,0x60,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x2D,0x26,0xFC,0x4A,0x4E, +0xF3,0xFA,0x46,0x77,0x9E,0x42,0x73,0xBD,0x9A,0xE1,0xD6,0x72,0x06,0x18,0x42,0x45, +0xD5,0x42,0x66,0xDD,0x42,0x84,0xE5,0x42,0xF9,0xC5,0x41,0x32,0xA3,0x42,0xF3,0xBB, +0x8E,0xE9,0x22,0xE0,0xDC,0x43,0x9B,0xE5,0x41,0x39,0xD5,0x40,0xF2,0xE3,0x42,0xB3, +0x4B,0x8C,0xF5,0x20,0xE0,0x40,0x24,0xE0,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x3B, +0x26,0xFC,0x66,0x4E,0xB7,0xFA,0x44,0x75,0xBE,0x40,0x63,0xAD,0x4E,0xA7,0xFA,0x44, +0xF5,0x3E,0x42,0xA7,0xAD,0xD6,0xA3,0x01,0xA0,0x43,0x58,0xD5,0x41,0x08,0x43,0x43, +0x5A,0xD3,0x43,0x38,0xCD,0x42,0x94,0xA3,0x43,0x39,0xCB,0x8F,0x48,0x8E,0x99,0x9A, +0xE0,0xD6,0x9A,0x00,0x45,0x8B,0x54,0x9A,0xE1,0x42,0x73,0x9B,0x42,0x52,0x93,0x8E, +0x53,0xD6,0x5A,0x01,0xB1,0xE4,0x00,0x00,0x6F,0x42,0xB8,0xCD,0x41,0x34,0x4B,0x43, +0x95,0xE3,0x8F,0x89,0x23,0x80,0x40,0x27,0x80,0x28,0x26,0xE0,0x2A,0xE7,0xFF,0xFF, +0x79,0x26,0xFE,0xE2,0x4E,0xFC,0xFA,0x47,0x97,0xE6,0x43,0x9C,0xBD,0x9A,0xE0,0xD7, +0x83,0x00,0xF0,0xE7,0xFF,0xFF,0x4D,0x8B,0x52,0x52,0xE0,0x10,0x43,0xDE,0xF3,0x43, +0xBD,0xEB,0x53,0x20,0x11,0x8F,0xBE,0x5F,0xBA,0x1F,0x4A,0xF7,0xC8,0x4F,0x37,0x21, +0x46,0xF7,0xCE,0x56,0xF7,0x0F,0xD2,0xE0,0x3B,0x5A,0x0C,0xCA,0x17,0x0C,0xAA,0x19, +0x0C,0x8A,0x47,0x0F,0x0A,0x49,0xE4,0x00,0x0E,0xB7,0xC2,0xE0,0x10,0x01,0x9B,0x3E, +0xF3,0x17,0x08,0x19,0x47,0x18,0xCC,0x98,0x63,0xFB,0x17,0x08,0x19,0xE7,0xFF,0xDB, +0x24,0x12,0xF0,0x00,0x1A,0xEA,0x10,0x12,0xF0,0x01,0x1A,0xEA,0x40,0xE7,0xFF,0x17, +0xA4,0x12,0xEA,0x00,0xD2,0xE1,0x3B,0xD6,0xE4,0x00,0x02,0x73,0x0A,0xEB,0x00,0xC2, +0xEF,0xFF,0xE4,0x23,0xFF,0x7B,0x0B,0xCB,0x02,0x0B,0x2A,0x16,0x0B,0x0A,0x18,0x43, +0xB9,0xBD,0x43,0x98,0xF5,0x0B,0x6A,0x46,0x0B,0x4A,0x48,0x42,0xFB,0xBD,0x43,0xDA, +0xF5,0x42,0xF7,0xBB,0x43,0xDE,0xF3,0x8E,0xFE,0x43,0xBD,0xEB,0x43,0x9C,0xE3,0x8F, +0x9D,0x5E,0xFC,0x1F,0x52,0xE0,0x10,0x4A,0xE0,0xB8,0x22,0xE2,0x9C,0x0F,0x6A,0x17, +0x0F,0x4A,0x19,0x0F,0x2A,0x47,0x0F,0x0A,0x49,0xE7,0xFF,0xFF,0x31,0x22,0xE6,0x52, +0x0A,0xEB,0x04,0xC2,0xEF,0xFF,0xE0,0x23,0xFE,0x29,0x0B,0xCA,0x16,0x0B,0xAA,0x18, +0x0B,0x0B,0x00,0x0B,0x2B,0x02,0x43,0x9E,0xC5,0x43,0x7D,0xCD,0x43,0xDE,0xBD,0x0B, +0x4B,0x06,0x43,0xDE,0xF3,0x43,0xBD,0xD5,0x43,0x9C,0xE3,0x43,0xBD,0xEB,0x43,0x7B, +0xDB,0x8F,0xBE,0x8F,0x7C,0xD7,0xBB,0x35,0x39,0xE4,0x00,0x0D,0x7F,0x0B,0x8C,0x03, +0x43,0x99,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0xC3, +0x60,0x10,0xE8,0x20,0x00,0xD9,0x0B,0x8C,0x03,0xC3,0x60,0x10,0x01,0xEF,0x9B,0x08, +0x79,0xFF,0x7B,0x08,0x78,0x0B,0x8C,0x07,0x0F,0x9B,0x03,0xC3,0x60,0x10,0x01,0xEF, +0x1B,0x08,0x69,0xC3,0x00,0x10,0x01,0xFF,0x7B,0x08,0x68,0x0F,0x3B,0x03,0xF3,0x38, +0x08,0x19,0x53,0x39,0x02,0xFB,0x38,0x08,0x19,0x0B,0x0E,0x05,0x0F,0x0E,0x01,0x0B, +0x0E,0x07,0x0F,0x0E,0x03,0x0B,0x0C,0x09,0x0F,0x0C,0x01,0x0B,0x0C,0x0B,0x0F,0x0C, +0x03,0x0B,0x0C,0x0D,0x0E,0xEB,0x01,0x0F,0x0C,0x05,0xFE,0xE0,0x7F,0xFF,0x0B,0x0C, +0x0F,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC,0x09, +0x0E,0xEC,0x0B,0x0F,0x0C,0x07,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0x9B,0x01,0x12,0xF0, +0x01,0x0F,0x4B,0x03,0x1A,0xF0,0x00,0x42,0xF8,0xBD,0x1A,0xF0,0x01,0xE7,0xFF,0xFD, +0x69,0x0A,0xEA,0x17,0x0B,0x0B,0x01,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8,0xFA, +0x47,0x17,0xC6,0x42,0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x03,0x78,0xD6,0xF9, +0x01,0x2C,0x0A,0xEA,0x19,0x0B,0x0B,0x03,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8, +0xFA,0x47,0x17,0xC6,0x42,0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x03,0x7A,0xD6, +0xF9,0x2F,0xF8,0xE7,0xFF,0x15,0x60,0xD0,0x60,0x2F,0xBA,0xE7,0xFF,0xDB,0x36,0xC2, +0xE0,0x10,0x01,0xEF,0x17,0x07,0x8E,0xD3,0x01,0x2F,0x3E,0xE4,0x00,0x0B,0xEF,0x9A, +0xFE,0x0E,0xF1,0x01,0xC1,0xA0,0x10,0x01,0x13,0x2A,0x00,0xFD,0xAD,0x0B,0xA6,0x9B, +0x00,0x8A,0xED,0xE4,0x00,0x00,0x35,0x0B,0x57,0x01,0x9F,0x01,0x0F,0x4B,0x01,0x5F, +0x18,0x00,0x0B,0x57,0x03,0x1E,0xF7,0x30,0x0F,0x4B,0x03,0x9D,0x64,0xD7,0x19,0xFF, +0x56,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x3A,0x22,0xE4,0x26,0x99,0x60,0xE4,0x00, +0x00,0x5F,0xE7,0xFF,0xC4,0xEE,0x20,0x6B,0xD8,0xE7,0xFF,0xC4,0xE0,0x20,0x6C,0xAE, +0xE7,0xFF,0xFF,0xD9,0xCC,0x8B,0x00,0x30,0x88,0xCB,0x1C,0x84,0x10,0x9D,0x61,0x8C, +0x8A,0x5D,0x6B,0x00,0x1C,0x64,0x06,0x9C,0x88,0xE7,0xFF,0x50,0x5E,0x10,0xAA,0x00, +0xD4,0xAB,0xFF,0x25,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x4F,0xB0,0xE7,0xFF,0xC4,0x7A, +0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0x20,0x68,0xD6,0x53, +0x40,0x4B,0xEF,0x58,0x08,0x89,0xEF,0x59,0x08,0x53,0x53,0x00,0x25,0xEF,0x17,0x08, +0x9F,0xC2,0x20,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFE,0x31,0x08,0x40,0xEF,0x17,0x08, +0x75,0x99,0x60,0xC2,0x60,0x10,0x01,0xC2,0x80,0x10,0x01,0x8A,0x51,0xE4,0x00,0x03, +0x19,0x53,0x40,0x32,0xEF,0x58,0x08,0x89,0xEF,0x59,0x08,0x53,0x53,0x00,0x19,0xE7, +0xFF,0xFF,0x9D,0x4E,0xEB,0x10,0x8E,0xEE,0x0B,0x17,0x00,0xC3,0x0F,0xFF,0xE4,0x20, +0x05,0x3B,0x0B,0x37,0x02,0xC3,0x2F,0xFF,0xE0,0x20,0x05,0x11,0xCE,0xEB,0x00,0x30, +0x8E,0xEA,0x0A,0x17,0x17,0x42,0x18,0x85,0x5E,0x10,0x06,0x4F,0x10,0xFA,0x0A,0xF7, +0x19,0x46,0x18,0x86,0x42,0xF9,0xBD,0x42,0x10,0xC5,0x5E,0xF7,0x06,0x4F,0x17,0xFA, +0x5E,0x10,0x06,0x46,0xF8,0xBE,0xE9,0xF3,0x08,0x89,0x42,0xF7,0xC5,0x43,0x11,0x5C, +0x5E,0xF7,0x06,0x13,0x58,0x00,0xD6,0xEF,0x00,0xE4,0xC3,0x00,0x10,0x01,0xEB,0x18, +0x08,0x53,0xD6,0x18,0x00,0x84,0x9B,0x03,0x27,0x48,0x57,0x1F,0x1A,0x01,0xE4,0x00, +0x00,0x19,0x9B,0x00,0x23,0x40,0x24,0x1F,0x1A,0xFF,0x5F,0x18,0x00,0x43,0x52,0x5C, +0x1B,0x1A,0x00,0x43,0x11,0x5C,0x13,0x18,0x00,0xD3,0x02,0x06,0xA1,0xEB,0x14,0x08, +0x75,0xD6,0xF8,0x00,0x8C,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0F,0x37,0x19,0xE4,0x00, +0x00,0x9B,0xD6,0xEF,0x02,0x4C,0x43,0x2F,0xC5,0x40,0x77,0xC5,0x43,0x39,0xCB,0x42, +0xF8,0xBD,0x43,0x4F,0x7B,0x40,0x63,0xBB,0x8C,0x79,0x40,0x63,0xD3,0x40,0x63,0xC8, +0xE7,0xFF,0x10,0xD0,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17,0x02,0x41, +0xEF,0x1D,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x18,0xD7,0x19,0x00,0x58,0x41, +0xF8,0x7D,0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x19,0xC2,0xE0,0x10,0x01,0xEA, +0xF7,0x08,0x9F,0xD6,0x17,0x00,0xCC,0xCE,0xEB,0x00,0x30,0x4F,0x0B,0x10,0x8E,0xEA, +0x8F,0x0E,0x0B,0x18,0x01,0x0F,0x17,0x17,0xE4,0x00,0x00,0xAB,0xC3,0x00,0x10,0x01, +0xE9,0xF8,0x08,0x53,0xD6,0x0F,0x02,0x4C,0x43,0x0F,0xBD,0x43,0x2F,0x7B,0x43,0x18, +0xC3,0x40,0x70,0xBD,0x42,0x17,0x85,0x40,0x63,0x83,0x8C,0x78,0x40,0x63,0xCB,0x40, +0x63,0xC0,0xE7,0xFF,0x0F,0xEC,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17, +0x00,0x41,0xEF,0x1D,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x16,0xD7,0x19,0x00, +0x58,0x41,0xF8,0x7D,0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x17,0x4E,0xEB,0x10, +0xCF,0x0B,0x00,0x30,0x8E,0xEE,0x8F,0x0A,0x9D,0x61,0x0B,0x38,0x17,0x5D,0x6B,0x00, +0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17,0x03,0x12,0xEA,0x00,0xD6,0xEB,0xF4,0x3D, +0xE7,0xFF,0xC0,0xD2,0x20,0x68,0x36,0x9B,0x08,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x03, +0x71,0xC2,0xE0,0x10,0x01,0x13,0x2A,0x00,0xF3,0x77,0x08,0x84,0x8B,0x0D,0xC2,0xE0, +0x10,0x01,0x9B,0x80,0xFE,0xF7,0x0B,0x74,0xFF,0x40,0x7F,0xFF,0xE4,0x00,0x00,0x9F, +0xD7,0x79,0x00,0x92,0x0F,0x57,0xFD,0x0F,0x57,0xFF,0x0F,0x57,0x01,0x0F,0x57,0x03, +0x8B,0x79,0x0B,0xB7,0x00,0xC3,0xAF,0xFF,0xE0,0x20,0x00,0x41,0x0B,0xB7,0xFD,0x0F, +0xB7,0x01,0x0B,0xB7,0xFF,0xE4,0x00,0x00,0x1B,0x0B,0xB8,0x01,0x0F,0xB7,0x01,0x0B, +0xB8,0x03,0x0F,0xB7,0x03,0x0B,0xB8,0x01,0x9F,0x81,0x0F,0xB7,0xFD,0x5F,0x9C,0x00, +0x0B,0xB8,0x03,0x1F,0x18,0x30,0x0F,0xB7,0xFF,0x9E,0xE8,0xD7,0x99,0xFD,0xAE,0xC2, +0xE0,0x10,0x01,0xFB,0x77,0x08,0x84,0xC2,0xE0,0x10,0x01,0x23,0x24,0x7A,0x9B,0x02, +0xFB,0x17,0x08,0xA1,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x03,0x70,0x9B,0x0A,0x9B,0x4A, +0x43,0x18,0xBD,0x9A,0xE0,0xE4,0x00,0x00,0x8F,0xF8,0x17,0x08,0xA1,0xE7,0xFF,0xFF, +0xCF,0x0B,0x6C,0x04,0x0B,0x8C,0x00,0x0B,0xAC,0x06,0x43,0x9C,0xDD,0x9E,0xE1,0x43, +0x98,0xE3,0x5E,0xF7,0x00,0x43,0x9C,0xD0,0x8F,0x9B,0x0B,0x6C,0x02,0x0F,0x8D,0x01, +0x43,0x7B,0xED,0x0F,0x8C,0x01,0x43,0x78,0xDB,0x43,0x7B,0xD0,0x8F,0x7D,0x5F,0x7B, +0x06,0x0F,0x6D,0x03,0x0F,0x6C,0x03,0x1D,0xAD,0x30,0x9D,0x88,0xD6,0xF9,0xFE,0x2E, +0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x19,0x56,0xF7,0x02,0x22,0xE0,0x24,0x98,0x64, +0xE7,0xFF,0xD1,0x1E,0x13,0x0A,0x00,0xC2,0xE0,0x10,0x01,0x0E,0xA1,0x06,0x0E,0x81, +0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E, +0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D, +0x21,0x36,0xFB,0x17,0x08,0x26,0x98,0x61,0x1C,0x21,0x38,0xE7,0xFF,0xB3,0x1F,0x18, +0x0F,0x00,0x9A,0xE4,0xE4,0x00,0x04,0xF3,0xD2,0xE4,0x01,0xA6,0x0A,0xEE,0x01,0x56, +0xF7,0x08,0x22,0xE0,0x3C,0x9A,0xE3,0x0C,0x11,0x01,0x0E,0xED,0x00,0xE4,0x00,0x04, +0xC7,0x12,0xEF,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xEF,0x00,0xD2,0xE1,0x12,0xA1, +0x9A,0xE5,0x18,0x0F,0x00,0x0E,0xED,0x00,0xE4,0x00,0x04,0x91,0xD2,0xE5,0x09,0xF6, +0x12,0xEF,0x00,0x9E,0xE1,0x1A,0xEF,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x84, +0x22,0xE9,0x4A,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x19,0x56,0xF7,0x01,0x22,0xE1, +0x10,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xA1,0xC1,0x40,0x10,0x01,0xF2,0xEA,0x08, +0x11,0x22,0xE8,0x66,0x98,0x65,0xE7,0xFF,0xCF,0xB2,0x98,0x61,0xE7,0xFF,0xB2,0x1C, +0x9A,0xE1,0xFA,0xEA,0x08,0x11,0xE4,0x00,0x01,0x75,0xD2,0xE1,0x05,0x8E,0x98,0x65, +0xE7,0xFF,0xCF,0x7E,0x98,0x61,0xE7,0xFF,0xB1,0xE8,0xF8,0x0A,0x08,0x11,0xE4,0x00, +0x01,0x45,0x0B,0x0B,0x00,0x0B,0x4C,0x00,0x43,0x38,0xD5,0x5F,0x39,0x06,0x4E,0xF9, +0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0x5E,0xEC,0x99,0x20,0x00,0x7D,0x0A,0xEC,0x03, +0x0B,0x2B,0x03,0x43,0x39,0xBD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42, +0xF9,0xBD,0xC2,0xE0,0x10,0xE8,0x20,0x01,0x95,0xC3,0x20,0x10,0x01,0xF2,0xF9,0x08, +0xA1,0x22,0xE8,0xB6,0x8F,0x1A,0x43,0x18,0xB8,0x0F,0x0A,0x17,0xC3,0x00,0x10,0x01, +0xEB,0x58,0x08,0x2A,0xC3,0x00,0x10,0x01,0xEB,0x18,0x0B,0x72,0x8F,0x1A,0x42,0xF8, +0xB8,0x0E,0xEA,0x19,0x9A,0xE1,0xFA,0xF9,0x08,0xA1,0xE4,0x00,0x00,0x45,0x22,0xE4, +0x66,0xC2,0xE0,0x10,0x01,0x0F,0x0A,0x17,0xEA,0xF7,0x08,0x2B,0xF8,0x19,0x08,0xA1, +0x0E,0xEA,0x19,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00,0x9A,0xE1,0x98,0x61, +0x1A,0xEA,0x00,0xE7,0xFF,0xB0,0xAE,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00, +0x12,0xEF,0x00,0xD2,0xE2,0x09,0xE9,0x98,0x62,0x0C,0x11,0x01,0xE7,0xFF,0xD2,0xCE, +0xE7,0xFF,0x0A,0x5E,0xC2,0xE0,0x10,0x01,0x9B,0x03,0xFB,0x17,0x08,0x50,0xE7,0xFF, +0xD1,0x30,0xE7,0xFF,0x46,0xBC,0x98,0x60,0xE7,0xFF,0xB0,0x44,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x67,0x9A,0xE6,0xE4,0x00,0x02,0x0F,0xD2,0xE6,0x08,0x36,0x0A,0xEE, +0x01,0x56,0xF7,0x40,0x22,0xE0,0x26,0x98,0x64,0xE7,0xFF,0xEB,0xA6,0xC3,0x00,0x10, +0x01,0xF2,0xF8,0x08,0x67,0x9E,0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x08,0x67,0x5E,0xE6, +0x53,0x0A,0xEE,0x01,0x20,0x01,0x35,0x56,0xF7,0x40,0x22,0xE0,0x50,0x9A,0xE1,0x0E, +0xED,0x00,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x76,0xE4,0x00,0x01,0x8D,0x0C,0x0D, +0x00,0x98,0x60,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E, +0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81, +0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0xE7,0xFF,0xEA, +0xDF,0x56,0xF7,0x08,0xD2,0xE0,0x04,0x62,0x18,0x10,0x00,0x9A,0xE2,0xE4,0x00,0x01, +0x01,0xC3,0x6F,0xFF,0xE4,0x23,0xE2,0x95,0xE7,0xFF,0xF1,0x73,0x0B,0x8C,0x01,0x43, +0x98,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x6C, +0x99,0x23,0xE5,0x33,0xE7,0xFF,0xF2,0xC5,0x98,0x62,0xE7,0xFF,0xCC,0x4A,0xFE,0xE0, +0x7F,0xFF,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC, +0x09,0x0E,0xEC,0x0B,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0xE7,0xFF,0xF0,0xEF,0x0A,0xF1, +0x01,0xCB,0x00,0xFF,0xFD,0x9E,0xE1,0x5E,0xF7,0x04,0xD6,0xF8,0xD0,0xAD,0xE7,0xFF, +0xF4,0x27,0xFE,0xE0,0x7F,0xFF,0x18,0x0F,0x00,0x0E,0xEB,0x01,0x0E,0xEB,0x03,0x0E, +0xEB,0x05,0x0E,0xEB,0x07,0x18,0x10,0x00,0x1B,0x10,0x01,0x9A,0xE5,0x0E,0xED,0x00, +0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E, +0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61, +0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xE6,0x12,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xE5,0xF3,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x3D,0xF9,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D, +0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01, +0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08,0x13,0x17,0x00, +0xC2,0xE0,0x10,0x01,0xFB,0x17,0x00,0xC0,0xF3,0x17,0x00,0xC0,0x23,0x00,0x2C,0xF2, +0xF7,0x00,0xC0,0xD2,0xE1,0x30,0x2E,0xC1,0x80,0x10,0x01,0xC1,0xE0,0x10,0x01,0xFD, +0x8C,0x08,0x86,0xFD,0xEF,0x00,0xE0,0x0A,0xEC,0x01,0x56,0xF7,0x80,0xD2,0xE0,0x2E, +0x1E,0xC2,0xE0,0x10,0x01,0xC1,0xA0,0x10,0x01,0xF3,0x17,0x00,0xC0,0xFD,0xAD,0x09, +0x0C,0x23,0x08,0xB2,0xF2,0xF7,0x00,0xC0,0x22,0xE8,0x68,0x0B,0x2D,0x02,0x9B,0x42, +0xCF,0x19,0x00,0x03,0x0A,0xED,0x00,0x43,0x18,0xD0,0xD6,0xF8,0x02,0x14,0xE4,0x00, +0x00,0x9B,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x09,0x22,0xE3,0x86,0x8B,0x0D,0x9A, +0xE0,0x9B,0x22,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3,0x01,0x20,0x00,0x25,0x5E, +0xE3,0x29,0x20,0x00,0x31,0x0B,0x58,0x00,0x43,0x5A,0xC8,0x0F,0x58,0x01,0x9E,0xE1, +0x9F,0x02,0x5E,0xE3,0x49,0x23,0xFF,0x79,0xE7,0xFF,0xFF,0x67,0x42,0xF7,0xC5,0x43, +0x57,0xD0,0x8F,0x1A,0x0F,0x0D,0x01,0xE4,0x00,0x00,0x43,0x4E,0xF7,0x08,0x9B,0x1D, +0x43,0x17,0xC0,0x8F,0x38,0x9B,0x0B,0xCF,0x39,0x00,0x0A,0x43,0x39,0xC0,0x9B,0x03, +0x42,0xF7,0xC0,0x8E,0xF9,0x0E,0xED,0x03,0x0A,0xED,0x30,0x0B,0x0D,0x32,0x4F,0x37, +0x08,0xD7,0x19,0x00,0xC0,0xCE,0xF7,0xFF,0xFE,0x9B,0x43,0x8F,0x17,0x43,0x18,0xD0, +0x8F,0x38,0x0F,0x2D,0x33,0xE4,0x00,0x00,0x37,0x9B,0x22,0x43,0x18,0xC8,0x53,0x20, +0x14,0x42,0xF7,0xC5,0xCE,0xF7,0x00,0x13,0x42,0xF7,0xC8,0x8F,0x17,0x0F,0x0D,0x31, +0xC1,0x40,0x10,0x01,0xFD,0x4A,0x0B,0x1A,0x12,0xEA,0x04,0x10,0x6A,0x01,0x40,0x63, +0xBB,0xE7,0xFF,0xCC,0xD8,0x13,0x0A,0x01,0xC3,0x20,0x10,0x01,0x13,0x4A,0x04,0xEA, +0xF9,0x09,0xBC,0x43,0x5A,0xC3,0xFF,0x79,0x09,0xBC,0x9B,0x00,0xE4,0x00,0x00,0x35, +0x4F,0x38,0x10,0x9F,0x01,0x8F,0x3B,0x5F,0x18,0x00,0x0F,0x39,0x02,0x5F,0x99,0x06, +0x5F,0x37,0x1D,0x4A,0xFC,0xB8,0xD7,0x58,0xFF,0x54,0xC1,0x40,0x10,0x01,0xC2,0xE2, +0x32,0x88,0xFD,0x4A,0x01,0x64,0x20,0x00,0x35,0x4E,0xF7,0x0A,0x0E,0xEA,0x19,0xE4, +0x00,0x00,0x2F,0x53,0x00,0xDF,0xC2,0xE0,0x6F,0x68,0x20,0x00,0x25,0x4E,0xF7,0x12, +0x5F,0x17,0x06,0x0F,0x0A,0x19,0x88,0x6A,0xE7,0xFF,0x14,0xEE,0xC1,0x60,0x10,0x01, +0x89,0xCD,0xFD,0x6B,0x0B,0x90,0x8A,0xED,0x12,0x2B,0x00,0x53,0x20,0x14,0x0B,0x17, +0x00,0xCF,0x18,0x00,0x19,0x43,0x18,0xC8,0x0F,0x17,0x01,0xC3,0x00,0x10,0x01,0x9E, +0xE2,0xFF,0x18,0x09,0x40,0xD6,0xF8,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x14,0x88,0xC2, +0x00,0x10,0x01,0x9A,0xE0,0xFE,0x10,0x08,0x26,0x22,0x20,0x4A,0x13,0x0B,0x00,0x27, +0x04,0x33,0x12,0xF0,0x00,0x5E,0xE0,0x01,0x4A,0xE1,0x01,0x13,0x0B,0x00,0x23,0x09, +0x2E,0x13,0x10,0x00,0x23,0x05,0x3A,0x13,0x2B,0x07,0x13,0x0B,0x37,0xD7,0x38,0x02, +0x2A,0x0F,0x0B,0x0A,0x23,0x04,0xFA,0x0F,0x0B,0x3A,0x23,0x04,0xE2,0xC3,0x00,0x10, +0x01,0xEB,0x38,0x0B,0x72,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0xA5,0xFF,0x39,0xFC,0x01, +0x4F,0x19,0xFA,0x47,0x38,0xCE,0x43,0x19,0xC5,0xC3,0x20,0x10,0x01,0xEB,0x59,0x0B, +0x25,0xD7,0x1A,0x00,0xA4,0xE4,0x00,0x00,0x1B,0x23,0x04,0x26,0x13,0x10,0x00,0x23, +0x00,0x18,0x22,0xE0,0x9C,0x53,0x00,0x19,0x0A,0xEE,0x00,0xCE,0xF7,0x00,0x14,0x42, +0xF7,0xC0,0x0E,0xEE,0x01,0xC3,0x40,0x10,0x01,0x9D,0xC2,0xFF,0x5A,0x09,0x40,0xD5, +0xDA,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x13,0x54,0x0E,0xEF,0x02,0x22,0xE4,0x26,0x98, +0x61,0xE7,0xFF,0xCA,0xC4,0x12,0xEB,0x00,0x22,0xE0,0x5A,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x08,0x38,0x13,0x2B,0x00,0xD3,0x20,0x09,0x86,0xE4,0x00,0x02,0x93,0x98,0x61, +0x98,0x81,0x88,0xAA,0xE7,0xFF,0x0E,0x1C,0x0A,0xEA,0x10,0x0B,0x0A,0x06,0x0B,0x2A, +0x12,0x5D,0xD7,0x04,0x42,0x38,0xBD,0x40,0xB8,0xCD,0xCA,0xE0,0x07,0xFF,0x43,0x37, +0xCD,0x0B,0x4A,0x02,0x0B,0x6A,0x08,0x40,0x97,0xC5,0x5C,0xF9,0x04,0x13,0xCB,0x00, +0x0B,0x2A,0x0A,0x40,0x78,0xD5,0x42,0x77,0xCD,0x40,0xDA,0xC5,0xC2,0xE0,0x10,0x01, +0x42,0x59,0xDD,0x42,0x9B,0xCD,0xFE,0xF7,0x0B,0xA8,0x9B,0xA0,0xC9,0x00,0x07,0xFF, +0xE4,0x00,0x00,0xC5,0x0B,0x97,0xFE,0xD7,0x1C,0x00,0x98,0x43,0x9C,0xD5,0x43,0x9C, +0x8B,0x43,0x9C,0x18,0x8F,0x8E,0xE4,0x00,0x00,0x2D,0xD7,0x84,0x00,0xA8,0x43,0x88, +0xE5,0x43,0x9C,0xD5,0x43,0x9C,0x2B,0x43,0x9C,0x30,0x8F,0x87,0x0F,0x97,0xFF,0x0B, +0x97,0x00,0xD7,0x3C,0x00,0x88,0x43,0x9C,0xDD,0x43,0x9C,0xCB,0x43,0x9C,0x90,0xE4, +0x00,0x00,0x31,0xD7,0x93,0x00,0xB8,0x43,0x88,0xE5,0x43,0x9C,0xDD,0x43,0x9C,0xCB, +0x43,0x9C,0xA0,0xFF,0x9C,0x07,0xFF,0x0F,0x97,0x01,0x9F,0xA1,0x1E,0xF7,0x30,0x5F, +0xBD,0x00,0xD7,0xBE,0xFD,0x16,0x0B,0x0A,0x12,0xCA,0xE0,0x07,0xFF,0x0B,0x2A,0x10, +0x0B,0x4A,0x0C,0x43,0x77,0xCD,0x42,0xF7,0xD5,0x43,0x7B,0xC5,0x0B,0x0A,0x0E,0x43, +0x97,0xC5,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xFE,0xF7,0x0B,0xA6,0xE4,0x00,0x00,0x59, +0x0B,0xB7,0x00,0x43,0xBD,0xCD,0xCF,0xBD,0x07,0xFF,0x43,0xBD,0xD8,0x9F,0x01,0x0F, +0xB7,0x01,0x5F,0x18,0x00,0x0B,0xB7,0x02,0x43,0xBD,0xD5,0xCF,0xBD,0x07,0xFF,0x43, +0xBD,0xE0,0x0F,0xB7,0x03,0x1E,0xF7,0x30,0xD7,0x1E,0xFE,0xC6,0xE7,0xFF,0xFD,0xBF, +0xCF,0x57,0x00,0x30,0x9E,0xE1,0x8F,0x4B,0x0F,0x5A,0x0E,0xC3,0x40,0x95,0xEC,0x4B, +0x18,0x0A,0xE4,0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x5F,0x57,0x00,0xD7,0x3A,0xFF, +0x1D,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x38,0x0A,0xEC,0x01,0x52,0xF7,0x08,0xE4, +0x00,0x00,0x33,0x9B,0x07,0xC2,0xE0,0x10,0x01,0x18,0x10,0x00,0xEF,0x17,0x03,0x71, +0x0A,0xEC,0x01,0x9B,0x17,0x46,0xF7,0xC4,0x0E,0xEC,0x01,0xC1,0xC0,0x10,0x01,0x0E, +0xEF,0x02,0xFD,0x4E,0x08,0x30,0xD2,0xE1,0x0A,0x6E,0xE7,0xFF,0xE1,0x48,0xC2,0xE0, +0x10,0x01,0x99,0x60,0xEE,0xF7,0x07,0x8E,0x22,0xE5,0x6A,0xE4,0x00,0x02,0x29,0x1C, +0x61,0x01,0x88,0x8F,0x98,0xA3,0xE7,0xFF,0x6A,0x14,0x1E,0xE1,0x08,0x8E,0xEB,0x12, +0xF7,0xF9,0x1F,0x17,0x1A,0x4E,0xF7,0x08,0x4F,0x18,0x08,0x8E,0xF0,0x8F,0x0D,0x0A, +0xF7,0x01,0x0B,0x18,0x00,0xD7,0x17,0x00,0x98,0x9A,0xE1,0x0B,0x0A,0x01,0x4E,0xF7, +0x5C,0x46,0xF7,0xC5,0xE4,0x00,0x00,0x25,0x9A,0xE1,0x0B,0x0A,0x01,0x4E,0xF7,0x5C, +0x46,0xF7,0xBF,0x46,0xF7,0xC4,0x9D,0x61,0x0E,0xEA,0x01,0x5D,0x6B,0x00,0xE4,0x00, +0x00,0x31,0xC1,0xF8,0x00,0x21,0xC2,0x00,0x10,0x01,0xC1,0xC0,0x10,0x01,0xFD,0xEF, +0xB4,0xBA,0xFE,0x10,0x03,0x72,0xF2,0xEE,0x08,0x66,0xD6,0xEB,0xFC,0xAD,0x0A,0xEA, +0x01,0x22,0xE0,0x34,0x0A,0xEC,0x01,0x52,0xF7,0x10,0xE4,0x00,0x00,0x3B,0x0A,0xEC, +0x01,0x57,0x17,0x10,0x23,0x00,0x34,0x9B,0x21,0xC3,0x00,0x10,0x01,0xFB,0x38,0x08, +0x50,0x1F,0x40,0xEF,0x46,0xF7,0xD4,0x0E,0xEC,0x01,0xC1,0x40,0x10,0x01,0xC3,0x00, +0x10,0x01,0xEE,0xEA,0x08,0x5A,0xFF,0x18,0x08,0x77,0x22,0xE0,0x56,0x18,0x18,0x00, +0x0A,0xEC,0x01,0x56,0xF7,0x10,0x22,0xE1,0x64,0x9A,0xE1,0xE4,0x00,0x00,0x41,0x22, +0xE4,0x92,0x12,0xF8,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xF8,0x00,0x0B,0x0C,0x01, +0x57,0x18,0x10,0x23,0x00,0xE0,0x26,0xE4,0xE5,0x9A,0xE2,0xEE,0xEA,0x08,0x58,0xE4, +0x00,0x00,0x61,0x22,0xE8,0x7E,0x18,0x18,0x00,0x0A,0xEC,0x01,0x56,0xF7,0x10,0x22, +0xE0,0x34,0x98,0x62,0xE7,0xFF,0xA3,0x4C,0xE4,0x00,0x00,0x2F,0x9A,0xE3,0xE7,0xFF, +0xFF,0xBB,0x22,0xEC,0x36,0x98,0x60,0xE7,0xFF,0xA3,0x26,0xEC,0x0A,0x08,0x58,0x0B, +0x0C,0x00,0xC2,0xE0,0x10,0x01,0x27,0x1C,0x56,0xF3,0x17,0x08,0x3C,0xD3,0x09,0x08, +0x1D,0x9F,0x01,0xFB,0x17,0x08,0x3C,0xE4,0x00,0x01,0xF3,0xF8,0x17,0x08,0x3C,0xE4, +0x00,0x01,0xFB,0x0E,0xEF,0x02,0xD2,0xE2,0x07,0xB6,0x0A,0xEC,0x01,0x56,0xF7,0x40, +0x22,0xE0,0x26,0x98,0x63,0xE7,0xFF,0xF4,0xEE,0x12,0xEB,0x00,0x22,0xE0,0x36,0x98, +0x60,0x98,0x80,0x98,0xA0,0xE4,0x00,0x00,0x3B,0x22,0xE4,0x3E,0x08,0x6B,0x17,0x08, +0x8B,0x19,0x98,0xA1,0xE4,0x00,0x00,0x1D,0xD2,0xE1,0x06,0x21,0x98,0x60,0x98,0x80, +0x98,0xA2,0x1C,0xC1,0x04,0xE7,0xFF,0xBD,0xD2,0xD0,0x61,0x05,0x9E,0x0E,0xE1,0x06, +0x22,0xE0,0x2A,0x52,0xE0,0x58,0xE4,0x00,0x00,0xD9,0x9E,0xFF,0xD2,0xEB,0x03,0x6D, +0x4E,0xF7,0x10,0xC3,0x18,0x00,0x21,0xFF,0x18,0xBB,0x3C,0x8E,0xF8,0x0E,0xF7,0x02, +0x86,0xE9,0x52,0xE0,0x60,0xE4,0x00,0x00,0x9B,0x52,0xE0,0x61,0xE4,0x00,0x00,0x8D, +0x52,0xE0,0x62,0xE4,0x00,0x00,0x7F,0x52,0xE0,0x63,0xE4,0x00,0x00,0x71,0x52,0xE0, +0x64,0xE4,0x00,0x00,0x63,0x52,0xE0,0x65,0xE4,0x00,0x00,0x55,0x52,0xE0,0x66,0xE4, +0x00,0x00,0x47,0x52,0xE0,0x67,0xE4,0x00,0x00,0x39,0x52,0xE0,0x68,0xE4,0x00,0x00, +0x2B,0x52,0xE0,0x69,0xE4,0x00,0x00,0x1D,0x52,0xE0,0x6A,0xE4,0x00,0x00,0x0F,0x52, +0xE0,0x6B,0x0E,0xEA,0x01,0xE4,0x00,0x00,0x6F,0x0C,0x0A,0x01,0xE4,0x00,0x00,0x61, +0x0E,0xEF,0x02,0x22,0xE4,0xA6,0x9B,0x05,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x60, +0x9B,0x03,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFB,0x17,0x08,0x50,0xE7,0xFF,0xA0,0xFC, +0xE7,0xFF,0x9B,0xCC,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x9C,0xA6,0xC2,0xE0,0x10,0x01, +0xEB,0x17,0x08,0x33,0xC3,0x00,0x7D,0x0A,0x20,0x00,0x61,0xC3,0x00,0x10,0x01,0x9B, +0x5E,0xF3,0x38,0x08,0x1A,0xEC,0x17,0x08,0x33,0x47,0x39,0xD4,0xFB,0x38,0x08,0x1A, +0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D, +0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41, +0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21, +0x04,0x89,0x43,0x20,0x84,0x46,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xD8,0x92,0x98,0x68, +0xE4,0x00,0x00,0x1D,0x98,0x62,0x88,0x8A,0xE7,0xFF,0xD8,0x76,0x98,0x69,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x9C,0x28,0xE7,0xFF,0xD8,0x57,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xD8,0x32,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xD8,0x13,0xD0,0x69, +0x08,0x05,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x6C,0x8E,0xF8,0xC3, +0x20,0x10,0x01,0x0F,0x77,0x02,0xC3,0x40,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0, +0x10,0x01,0xFF,0x39,0x09,0xF8,0xFF,0x5A,0x09,0x48,0xFF,0x18,0x0C,0x96,0xFE,0xF7, +0x09,0x0C,0x87,0x69,0xCC,0x63,0x00,0x1A,0x5C,0x63,0x00,0x4F,0x23,0x08,0x4C,0x63, +0x10,0x8F,0x19,0x8E,0xF9,0x8F,0x43,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F, +0x99,0x08,0x0B,0xBD,0x01,0x8F,0x9A,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5, +0x0F,0x9B,0x01,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x01,0x27,0x9C, +0x7E,0xCC,0x63,0x00,0x1A,0x5C,0x63,0x00,0x4F,0x43,0x08,0x4C,0x63,0x10,0x8F,0x1A, +0x8C,0x79,0x8E,0xFA,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F,0x99,0x08,0x0B, +0xBD,0x01,0x8F,0x83,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5,0x0F,0x9B,0x01, +0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x00,0xAD,0x0B,0x78,0x35,0x0F, +0x3A,0x6A,0x4F,0x39,0x42,0x43,0x3B,0xCD,0x0B,0x78,0x37,0x0F,0x37,0x35,0x0F,0x3A, +0x6E,0x4F,0x39,0x42,0x43,0x3B,0xCD,0x0F,0x37,0x37,0x0F,0x3A,0x72,0xE4,0x00,0x00, +0x4B,0x0F,0x59,0x6A,0x0B,0x78,0x35,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0B,0x78,0x37, +0x0F,0x57,0x35,0x0F,0x59,0x6E,0x0F,0x39,0x72,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0F, +0x57,0x37,0x4F,0x39,0x42,0x0B,0x18,0x39,0x43,0x18,0xCD,0x0F,0x17,0x39,0x85,0x29, +0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x3E,0x98,0x60,0xE7,0xFF,0xFD,0xE8,0x98,0x68, +0xE4,0x00,0x00,0x19,0x98,0x62,0xE7,0xFF,0xFD,0xD0,0x98,0x69,0x0D,0x21,0x06,0x9C, +0x28,0xE7,0xFF,0xFD,0xBB,0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0xA4, +0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFD,0x8F,0x9C,0x38,0x0D,0x21,0x04, +0xE7,0xFF,0xA8,0x66,0x20,0x60,0x5E,0xE7,0xFF,0xA8,0x44,0x98,0x80,0xE7,0xFF,0xB5, +0x9A,0xE7,0xFF,0xA8,0x30,0x98,0x82,0xE4,0x00,0x00,0x37,0xE7,0xFF,0xA8,0x30,0x20, +0x64,0x86,0xE7,0xFF,0xA8,0x0E,0x98,0x81,0xE7,0xFF,0xB5,0x64,0xE7,0xFF,0xA7,0xFA, +0x98,0x83,0xE7,0xFF,0xB2,0xB8,0xE7,0xFF,0xCF,0x2C,0x9A,0xE0,0xE4,0x00,0x00,0x8D, +0xE7,0xFF,0xA7,0xE6,0x20,0x68,0x36,0xE7,0xFF,0xA7,0xC4,0x98,0x82,0xE4,0x00,0x00, +0x23,0xE7,0xFF,0xA7,0xC4,0x20,0x6C,0x5E,0xE7,0xFF,0xA7,0xA2,0x98,0x83,0xE7,0xFF, +0xB4,0xF8,0xE7,0xFF,0xA7,0x8E,0x98,0x87,0xE7,0xFF,0xFF,0x95,0xE7,0xFF,0xA7,0x8E, +0x9A,0xE0,0xD0,0x67,0x00,0x86,0xE7,0xFF,0xA7,0x66,0x98,0x87,0xE7,0xFF,0xB4,0xBC, +0x9A,0xE1,0x88,0x77,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x21, +0x14,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x80,0x01,0x80,0x01,0x80,0x01, +0x80,0x01,0xE7,0xFF,0x93,0x8C,0x0C,0x61,0x00,0xE7,0xFF,0x93,0x86,0x0C,0x61,0x04, +0x0E,0xE1,0x02,0xD2,0xE0,0x14,0xA2,0x0E,0xE1,0x02,0xC1,0x60,0x10,0x01,0xC1,0x40, +0x10,0x01,0x57,0x17,0x10,0xFD,0x6B,0x00,0xE6,0xFD,0x4A,0x00,0xD4,0xD3,0x00,0x06, +0xCA,0x50,0x60,0x10,0xE7,0xFF,0x93,0x68,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xC3, +0x9F,0x01,0x5F,0x18,0x04,0xEF,0x17,0x00,0xC3,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08, +0x33,0x23,0x00,0x24,0x9F,0x01,0xEF,0x17,0x08,0x33,0xE7,0xFF,0x93,0x6C,0x0A,0xEB, +0x0B,0x40,0x63,0xBD,0x5E,0xE3,0x04,0x5E,0xE3,0xBB,0x20,0x02,0x3F,0xC2,0xE0,0x10, +0x01,0xEA,0xF7,0x06,0x87,0x56,0xF7,0x20,0xD2,0xE0,0x04,0x0A,0x98,0x61,0xE7,0xFF, +0xB5,0xAC,0x20,0x61,0xDE,0xE7,0xFF,0xA6,0x08,0x20,0x64,0x56,0xC2,0xE0,0x10,0x01, +0xF2,0xF7,0x00,0xC8,0x56,0xF7,0x01,0x22,0xE1,0x8A,0xE4,0x00,0x00,0x1F,0xE7,0xFF, +0xA5,0xD6,0x20,0x63,0xA8,0xE4,0x00,0x00,0xA9,0xE7,0xFF,0xCC,0x18,0xC2,0xE0,0x10, +0x01,0xEB,0x17,0x06,0x87,0xC7,0x18,0xFF,0xDF,0xEF,0x17,0x06,0x87,0xE7,0xFF,0xA5, +0x98,0x20,0x60,0x5E,0x98,0x81,0x98,0xA0,0xE7,0xFF,0x2A,0xF2,0x98,0x60,0x88,0x83, +0xE7,0xFF,0xB0,0x3C,0xE4,0x00,0x00,0x43,0x98,0x80,0x98,0x62,0xE7,0xFF,0xB0,0x24, +0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x5C,0x5E,0x98,0x60,0xE7,0xFF,0x2F,0xDC,0xE7,0xFF, +0x92,0x44,0x0C,0x6B,0x09,0xE7,0xFF,0xCC,0x6E,0x0A,0xEA,0x01,0x52,0xF7,0x10,0x0E, +0xEA,0x01,0xE4,0x00,0x03,0xEF,0x57,0x17,0x40,0x23,0x00,0x38,0x50,0x60,0x40,0xE7, +0xFF,0x91,0xB2,0xE4,0x00,0x03,0xCD,0xC6,0xF7,0x01,0x00,0xD2,0xE0,0x0E,0xF2,0x98, +0x60,0xE7,0xFF,0x91,0x5E,0xFC,0x60,0x01,0x00,0xE7,0xFF,0x91,0x5E,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0x91,0x6E,0xE7,0xFF,0xA4,0xA8,0xD0,0x67,0x0D,0xA5,0xC2,0xF8,0x00, +0x21,0xFE,0xF7,0xBB,0x98,0x4C,0x63,0x10,0x8C,0x77,0x0E,0xE3,0x02,0x86,0xE9,0xE7, +0xFF,0xA4,0x88,0x20,0x60,0x46,0x98,0x80,0xE7,0xFF,0xB1,0xC4,0x98,0x60,0x98,0x87, +0xE4,0x00,0x02,0x77,0xE7,0xFF,0xA4,0x5E,0xD0,0x67,0x0C,0x2E,0x98,0x60,0x98,0x87, +0xE4,0x00,0x01,0xFF,0xE7,0xFF,0xFB,0xCE,0xD0,0x60,0x0B,0xAA,0xE7,0xFF,0xB2,0xEA, +0x5D,0x83,0x04,0x98,0x61,0xE7,0xFF,0xB3,0x9E,0xD0,0x60,0x07,0x56,0xC1,0x80,0x19, +0x0A,0x20,0x03,0x89,0xE7,0xFF,0x2E,0xE4,0xE7,0xFF,0x2E,0xB4,0x5C,0x63,0x00,0x24, +0x64,0x33,0x98,0x61,0xC1,0x80,0x32,0x0A,0x20,0x01,0xE9,0x98,0x80,0x98,0x62,0xE7, +0xFF,0xAE,0x7E,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x5A,0xB8,0x98,0x60,0xE7,0xFF,0x2E, +0x36,0xE7,0xFF,0x90,0x9E,0x0C,0x6B,0x09,0xE4,0x00,0x01,0xAF,0xE7,0xFF,0xFB,0x1E, +0xD0,0x60,0x08,0xEA,0xE7,0xFF,0xB2,0x3A,0xE7,0xFF,0x5A,0xF8,0xE7,0xFF,0x5B,0x88, +0xD0,0x61,0x04,0x9A,0xE7,0xFF,0x5B,0xA8,0x20,0x64,0xD2,0xE7,0xFF,0x2D,0xC6,0x5C, +0x63,0x00,0xC0,0x60,0x18,0xEE,0x20,0x00,0x1D,0xE7,0xFF,0x2D,0xD2,0xE7,0xFF,0x2D, +0xA2,0x98,0x80,0x5D,0x43,0x00,0x98,0x62,0xE7,0xFF,0xAD,0xCC,0xCC,0x6A,0x00,0x64, +0xFC,0x63,0x01,0x5E,0xE7,0xFF,0x59,0xFE,0xE4,0x00,0x01,0x0F,0xE7,0xFF,0x5B,0x58, +0x98,0x62,0x98,0x80,0xE4,0x00,0x00,0xEF,0xE7,0xFF,0xA2,0xD6,0x20,0x64,0x3E,0xE7, +0xFF,0xA2,0xC8,0x88,0x83,0x98,0x64,0xE4,0x00,0x00,0x71,0xE7,0xFF,0xA2,0xB0,0x20, +0x63,0xC0,0xE7,0xFF,0xA2,0xA2,0xD0,0x60,0x05,0x3E,0x98,0x64,0x98,0x80,0xE7,0xFF, +0xAF,0xD8,0x98,0x64,0xE4,0x00,0x00,0x8B,0x98,0x64,0x98,0x89,0xE4,0x00,0x00,0x27, +0xE7,0xFF,0xA2,0x66,0x20,0x64,0x76,0xE7,0xFF,0xA2,0x58,0x88,0x83,0x98,0x67,0xE7, +0xFF,0xAF,0x96,0x0A,0xEA,0x01,0xCA,0xF7,0x01,0x00,0x0E,0xEA,0x01,0xE4,0x00,0x00, +0xE1,0xE7,0xFF,0xA2,0x24,0x20,0x63,0x88,0xE7,0xFF,0xA2,0x16,0x20,0x61,0x86,0x98, +0x67,0x98,0x80,0xE7,0xFF,0xAF,0x4E,0x98,0x67,0x98,0x81,0xE7,0xFF,0xAC,0xA6,0xE7, +0xFF,0xC9,0x1A,0xE4,0x00,0x00,0x95,0x0E,0xE1,0x06,0x22,0xE1,0x3C,0x0E,0xE1,0x06, +0x56,0xF7,0x20,0x22,0xE1,0x18,0x98,0x60,0xE7,0xFF,0x8E,0x30,0x50,0x60,0x20,0xE7, +0xFF,0x8E,0x3A,0xE7,0xFF,0x80,0xB4,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD9,0xC7, +0x18,0xFF,0xFE,0x50,0x60,0x20,0xEF,0x17,0x00,0xD9,0xE7,0xFF,0x8E,0x14,0xC2,0xE0, +0x10,0x01,0xEB,0x17,0x00,0xD7,0x53,0x18,0x20,0xEF,0x17,0x00,0xD7,0xC2,0xE0,0x10, +0x01,0xF0,0x77,0x03,0x6E,0xE7,0xFF,0x8D,0xB6,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D, +0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x0C,0x63,0x02,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x0C,0x83,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x24,0x14,0x0B,0x17,0x01,0x53,0x18,0x01,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF,0x0F, +0x17,0x01,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D, +0x81,0x00,0xC1,0x54,0x00,0x01,0xC9,0x8A,0x22,0x28,0x0A,0xEC,0x01,0xC6,0xF7,0xFF, +0xFB,0xC9,0x6A,0x22,0x04,0x0E,0xEC,0x01,0xFF,0x00,0x80,0x00,0x0A,0xEB,0x01,0x46, +0xF7,0xC5,0x5E,0xF7,0x04,0xC9,0x4A,0x24,0xA8,0x0E,0xEB,0x01,0x0A,0xEA,0x01,0xCA, +0xF7,0x30,0x00,0x50,0x60,0x64,0x0E,0xEA,0x01,0xE4,0x00,0x28,0x4A,0x0A,0xEC,0x01, +0x52,0xF7,0x04,0x50,0x60,0x1E,0x0E,0xEC,0x01,0xE4,0x00,0x28,0x2A,0x0A,0xEB,0x01, +0xC6,0xF7,0x7F,0xFF,0x0E,0xEB,0x01,0x0A,0xEA,0x01,0xC6,0xF7,0xCF,0xFF,0x0E,0xEA, +0x01,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x2C,0x08,0x77,0x01,0x4C,0x63,0x09, +0x54,0x63,0x1F,0x9C,0x61,0x85,0x29,0x9C,0x7F,0x5C,0x63,0x00,0x5C,0x62,0xFB,0x20, +0x00,0x81,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x08,0xCA,0xF7,0x24,0x2C,0x54,0x63,0x3E, +0x0B,0x17,0x01,0x1F,0x20,0xC1,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77,0x01,0x85, +0x29,0x9B,0x19,0x20,0x60,0x62,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x37, +0x01,0x47,0x19,0xC4,0x53,0x18,0x04,0xE4,0x00,0x00,0x87,0x20,0x64,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0x53,0x18,0x06,0xE4,0x00,0x00,0x5D, +0x20,0x68,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0xC7,0x18, +0xFF,0xF9,0xE4,0x00,0x00,0x31,0x20,0x6C,0x5E,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x10,0x0B,0x37,0x01,0x47,0x19,0xC4,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0x5C, +0x63,0x00,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0C,0xA1,0x04,0x95,0x50,0xC9, +0x4A,0x20,0x80,0x8D,0x43,0x4D,0x4A,0x18,0x88,0x6A,0xE7,0xFF,0xFC,0xE0,0x0C,0xA1, +0x06,0x1C,0x6A,0x04,0x0D,0x21,0x0E,0x0D,0x41,0x0A,0x88,0x85,0x1C,0x21,0x10,0xE7, +0xFF,0xFC,0xB7,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x5D,0x44,0x00,0x4E,0xEA,0x08,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x5D,0x65,0x00,0x5C,0x63,0x00,0x4D,0x83,0x18,0x8D,0x8B, +0x8D,0x97,0x06,0xE0,0x81,0xCA,0xF7,0x04,0x00,0x0D,0x21,0x14,0x0D,0xA1,0x04,0xC5, +0x8C,0x1F,0xFC,0x5D,0xA6,0x00,0x8D,0x97,0x88,0x6C,0xE7,0xFF,0xFC,0x00,0x55,0x4A, +0x01,0x50,0x80,0xFF,0x4D,0x4A,0x08,0x8D,0x6A,0x4D,0x6B,0x18,0x4C,0x84,0x5C,0x4D, +0x6D,0x5C,0x44,0x84,0x27,0x0D,0xA1,0x06,0x44,0x83,0x24,0x0D,0x41,0x12,0x88,0x6C, +0x44,0x84,0x5D,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x21,0x16,0x1C,0x21,0x18,0xE7, +0xFF,0xFB,0xD7,0x5C,0x84,0x04,0x20,0x60,0x28,0x20,0x64,0xC2,0xE4,0x00,0x00,0x33, +0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA,0xF7,0x24,0x34,0xC4,0x84,0x01, +0xFF,0xE4,0x00,0x00,0x2B,0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA,0xF7, +0x24,0x38,0xC4,0x84,0x01,0xFF,0x0C,0x97,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18, +0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01, +0x47,0x64,0x27,0xCB,0x37,0x24,0x3C,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x40,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27, +0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F, +0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7, +0xCB,0x37,0x24,0x3C,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x40,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27, +0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18, +0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01, +0x47,0x64,0x27,0xCB,0x37,0x24,0x1C,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x20,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27, +0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F, +0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7, +0xCB,0x37,0x24,0x1C,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x20,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27, +0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB, +0x17,0x24,0x80,0x0B,0x38,0x01,0x5F,0x23,0x04,0x0F,0x38,0x01,0x07,0x20,0xFF,0xCB, +0x39,0xFF,0xFF,0xCA,0xF7,0x24,0x84,0x44,0x63,0xCC,0x0B,0x17,0x01,0x4C,0x63,0x81, +0xFF,0x20,0xFF,0x00,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77,0x01,0x85,0x29,0x07, +0x00,0xFF,0xCB,0x18,0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D, +0xC2,0xF4,0x00,0x01,0x47,0x64,0x27,0xCB,0x37,0x24,0x24,0x0B,0x59,0x01,0x47,0x5A, +0xDC,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18, +0x81,0x44,0x84,0x27,0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4, +0x47,0x04,0xC5,0x0F,0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00, +0x01,0x47,0x9A,0xD7,0xCB,0x37,0x24,0x24,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A, +0xDD,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84, +0x81,0x47,0x24,0x27,0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0xC3, +0x14,0x00,0x01,0xCA,0xF8,0x22,0x08,0x20,0x64,0x3A,0x0B,0x37,0x01,0xCB,0x39,0x10, +0x00,0xE4,0x00,0x00,0x1D,0x20,0x60,0x36,0x0B,0x37,0x01,0xC7,0x39,0xEF,0xFF,0x0F, +0x37,0x01,0xCA,0xF8,0x22,0x08,0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x84,0x00,0x1F,0x00,0x80,0x20,0x60,0x28,0x20,0x64,0xAA,0xE4,0x00, +0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x54,0xE4,0x00,0x00,0x19,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0x64,0x0B,0x37,0x01,0x54,0x84,0x7F,0x47,0x19,0xC4,0x47, +0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x20,0x60,0x28,0x20,0x64,0xAA, +0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x50,0xE4,0x00,0x00,0x19, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x61,0x13,0x17,0x00,0x54,0x84,0x1F,0x57,0x18, +0xE0,0x44,0x84,0xC5,0x18,0x97,0x00,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61, +0x04,0x0D,0x21,0x0C,0x5D,0x44,0x00,0x89,0x63,0x1C,0x8A,0xF1,0x4C,0x84,0x08,0x5C, +0x83,0xF3,0x20,0x00,0x19,0x50,0x80,0x1F,0x88,0x6B,0xE7,0xFF,0xFF,0x5A,0x1F,0x00, +0x80,0x21,0x60,0x28,0x21,0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x24,0x4C,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x60,0x0B, +0x37,0x01,0x55,0x4A,0x7F,0x47,0x19,0xC4,0x47,0x0A,0xC5,0x0F,0x17,0x01,0x0D,0x61, +0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x20,0x64,0x8E,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0x53,0x39, +0xF0,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xF0,0xE4,0x00,0x00,0x47,0x20, +0x60,0x8A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38, +0x01,0xC7,0x39,0xFF,0x0F,0x0F,0x38,0x01,0x0B,0x17,0x01,0x53,0x18,0x0F,0x0F,0x17, +0x01,0x85,0x29,0x20,0x64,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7, +0x22,0x60,0x0B,0x38,0x01,0x53,0x39,0x08,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18, +0xFE,0xFF,0xE4,0x00,0x00,0x49,0x20,0x60,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22, +0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0xC7,0x39,0xFF,0xF7,0x0F,0x38,0x01,0x0B, +0x17,0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xCB,0x18,0x02,0x00,0xE4,0x00,0x00, +0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xC7, +0x18,0xFD,0xFF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x54,0x63,0x7F,0xCA, +0xF7,0x24,0xA0,0x1F,0x20,0x80,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x40,0xCA,0xF7,0x24,0xA0,0xC4, +0x63,0x7F,0x00,0x0B,0x17,0x01,0xFF,0x20,0x80,0xFF,0x47,0x18,0xCC,0x47,0x03,0xC5, +0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA1,0x10,0x77,0x00, +0x54,0x63,0x7F,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0xE4,0x00,0x00,0x2B,0x20,0x60,0x52,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x53,0x18,0x80,0x0F,0x17,0x01,0x85, +0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0xC7, +0x18,0x7F,0xFF,0xE4,0x00,0x00,0x39,0x20,0x60,0x6E,0xC2,0xF4,0x00,0x01,0xFF,0x20, +0x80,0x00,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C,0x63,0x00,0xCA,0xF7,0x22,0x0C,0xFF, +0x20,0xFF,0x00,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xFF,0x40,0xFF,0x00,0xCA,0xF7,0x22,0xF0, +0x47,0x03,0xD4,0x0B,0x37,0x01,0x5F,0x39,0x00,0x47,0x18,0xCD,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x38,0x0B,0x17,0x01,0x0C, +0x77,0x01,0x85,0x29,0x20,0x64,0x6A,0xC2,0xF4,0x00,0x01,0x9B,0x3C,0xCA,0xF7,0x25, +0xC0,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x01,0xE4,0x00,0x00,0x3F,0x20,0x60, +0x7A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x38,0xCA,0xF7,0x25,0xC0,0x0B,0x38,0x01, +0x0C,0x18,0x01,0x0B,0x17,0x01,0x53,0x18,0x03,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84, +0x00,0x20,0x64,0x62,0x4C,0x63,0x24,0xC2,0xF4,0x00,0x01,0x5C,0x63,0x04,0xCA,0xF7, +0x22,0xCC,0x0C,0x77,0x01,0xE4,0x00,0x00,0x25,0x20,0x60,0x3A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x22,0xCC,0x0C,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4,0x00,0x00,0x2B,0x20, +0x64,0x52,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0x53,0x18,0x01, +0x0F,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8, +0x0B,0x17,0x01,0xC7,0x18,0xF0,0xFF,0xE4,0x00,0x00,0x2D,0x20,0x64,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xCB,0x18,0x0F,0x00,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x63,0x00,0xC4,0x84,0x03,0xFF,0x20,0x64,0x70,0x20,0x60,0x34,0x20, +0x68,0x88,0x20,0x6C,0xDA,0xE4,0x00,0x00,0x51,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x68,0xE4,0x00,0x00,0x49,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x6C,0xE4,0x00,0x00, +0x31,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x70,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x24,0x74,0x0C,0x97,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x5C,0x63,0x00,0x07,0x00, +0x20,0xCB,0x18,0x41,0x00,0x44,0x63,0xC5,0x4C,0x63,0x10,0x0C,0x83,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xFC,0x21,0xFE,0x88,0x50,0xA0, +0x96,0xED,0x21,0x01,0x74,0xED,0x41,0x01,0x70,0xED,0x61,0x01,0x6C,0x88,0x61,0xC1, +0x78,0x00,0x21,0xFD,0x6B,0xB4,0xBE,0x88,0x8B,0xE7,0xFF,0x4A,0x4E,0xFD,0x41,0x00, +0x96,0xFC,0x8B,0x00,0x96,0x88,0x6A,0x50,0xA0,0xD2,0xE7,0xFF,0x4A,0x2C,0x8A,0xE1, +0xC3,0x54,0x00,0x01,0xFF,0x60,0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39, +0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x47,0xB9,0xCF,0x8F, +0x1A,0x0B,0x98,0x01,0x47,0x9C,0xEC,0x0B,0xB7,0x05,0x47,0x39,0xEC,0x47,0x3C,0xCD, +0x0F,0x38,0x01,0x9E,0xE6,0xD5,0x57,0xFE,0x9E,0xFE,0xE1,0x00,0x96,0xFF,0x81,0x01, +0x68,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08, +0x8F,0x19,0x0B,0x37,0x03,0x47,0xD9,0xCF,0x8F,0x1A,0x0B,0xB8,0x01,0x47,0xBD,0xF4, +0x0B,0xD7,0x05,0x47,0x39,0xF4,0x47,0x3D,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x97, +0xFE,0x9E,0xED,0x61,0x01,0x6E,0xED,0x41,0x01,0x72,0xED,0x21,0x01,0x76,0xFC,0x21, +0x01,0x78,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x00,0x0C,0x18,0x01,0xCA, +0xF7,0x24,0x14,0xFF,0x20,0xFF,0x07,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x30, +0x0F,0x17,0x01,0x85,0x29,0x1C,0x21,0xD8,0xC3,0x54,0x00,0x01,0x0D,0x21,0x24,0xCA, +0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00,0x57,0x37,0xFF,0x4F,0x39,0x10,0x8F,0x3A,0x0C, +0x19,0x01,0x9E,0xE1,0xC3,0x14,0x00,0x01,0xC2,0xE2,0x2B,0x84,0x23,0xFF,0xAD,0xCA, +0xF8,0x23,0x70,0x0C,0x17,0x01,0xCA,0xF8,0x23,0x74,0xCB,0x18,0x23,0x78,0x0C,0x17, +0x01,0x0C,0x18,0x01,0x1C,0x61,0x02,0xC0,0x98,0x00,0x21,0x50,0xA0,0x1E,0xFC,0x84, +0xB4,0xBE,0xFC,0x84,0x01,0x68,0xE7,0xFF,0x48,0x34,0x1E,0xE1,0x02,0x1F,0x41,0x20, +0x0B,0x37,0x01,0xFF,0x60,0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10, +0x4F,0x18,0x08,0x8F,0x19,0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99, +0xCF,0x0B,0x78,0x01,0x47,0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD, +0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x57,0xFE,0x5E,0x0D,0x21,0x26,0xFC,0x60,0x01,0xF4, +0x1C,0x21,0x28,0xE4,0x00,0x16,0xB7,0x5C,0x84,0x00,0x9B,0x10,0x20,0x60,0x28,0x20, +0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x10,0xE4,0x00, +0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x14,0x0B,0x37,0x01,0x54,0x84,0x0F, +0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0x1C,0x21,0xE0,0xC0,0x98, +0x00,0x21,0x0D,0x21,0x1C,0x88,0x61,0xFC,0x84,0xB4,0xBE,0x50,0xA0,0x18,0xFC,0x84, +0x01,0x86,0xE7,0xFF,0x46,0xFC,0x8A,0xE1,0x1F,0x41,0x18,0x0B,0x37,0x01,0xFF,0x60, +0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19, +0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47, +0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6, +0xD7,0x57,0xFE,0x5E,0xC3,0x54,0x00,0x01,0xCA,0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00, +0x57,0x37,0xFF,0x4F,0x39,0x10,0x8F,0x3A,0x0C,0x19,0x01,0x9E,0xE1,0xC3,0x14,0x00, +0x01,0xC2,0xE2,0x2B,0x84,0x23,0xFF,0xAD,0xCA,0xF8,0x23,0x70,0x0C,0x17,0x01,0xCA, +0xF8,0x23,0x74,0x0C,0x17,0x01,0xCB,0x18,0x23,0x78,0x0C,0x18,0x01,0x0D,0x21,0x1E, +0x1C,0x21,0x20,0x85,0x29,0x1C,0x21,0xE0,0xC0,0x98,0x00,0x21,0x0D,0x21,0x1C,0x1C, +0x61,0x06,0xFC,0x84,0xB4,0xBE,0x50,0xA0,0x12,0xFC,0x84,0x01,0x9E,0xE7,0xFF,0x45, +0xC6,0x1E,0xE1,0x06,0x1F,0x41,0x18,0x0B,0x37,0x01,0xFF,0x60,0xFF,0x00,0x47,0x19, +0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0xC3,0x34,0x00,0x01, +0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47,0x7B,0xE4,0x0B,0x97, +0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x57,0xFE,0x5E, +0xC3,0x74,0x00,0x01,0xCA,0xE0,0x11,0x50,0xCB,0x7B,0x22,0x00,0xFF,0x40,0x11,0x11, +0x57,0x37,0xFF,0x4F,0x39,0x10,0x8F,0x3B,0x0F,0x59,0x01,0x9E,0xE1,0xC3,0x14,0x00, +0x01,0xC2,0xE2,0x2B,0x84,0x23,0xFF,0xAD,0xCB,0x38,0x23,0x70,0x9A,0xFF,0x0E,0xF9, +0x01,0xCB,0x38,0x23,0x74,0x0E,0xF9,0x01,0xCB,0x18,0x23,0x78,0x0E,0xF8,0x01,0x0D, +0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x74,0xD8,0x18, +0x18,0x00,0xCB,0x37,0x74,0x10,0x5C,0x63,0x00,0x18,0x79,0x00,0xCB,0x37,0x76,0x30, +0x18,0x19,0x00,0x53,0x40,0x24,0xCB,0x37,0x74,0x00,0x1B,0x59,0x00,0xCB,0x77,0x74, +0x28,0x53,0x20,0x60,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x30,0x1B,0x3B,0x00,0xCB,0x77, +0x74,0x38,0x53,0x20,0x1C,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x40,0x1B,0x3B,0x00,0xCB, +0x37,0x74,0xA8,0x13,0x39,0x00,0xCB,0x37,0x74,0x78,0x9B,0x69,0x1B,0x79,0x00,0xCB, +0x37,0x74,0x70,0x18,0x19,0x00,0xCB,0x37,0x74,0x60,0x13,0x79,0x00,0x1B,0x59,0x00, +0xCA,0xF7,0x74,0x61,0x13,0x37,0x00,0x18,0x17,0x00,0x98,0x61,0x12,0xF8,0x00,0x52, +0xF7,0x01,0x1A,0xF8,0x00,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x74,0x20,0x18,0x77,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFE,0xFF,0x0F,0x17,0x01,0x85, +0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63,0x21,0x54, +0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xE0,0x10,0x77,0x00,0x4C, +0x63,0x09,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10, +0x77,0x00,0x4C,0x63,0x29,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x74,0xE0,0x10,0x77,0x00,0x4C,0x63,0x19,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63,0x11,0x54,0x63,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x08,0x77,0x01,0x4C,0x63,0x49,0x54,0x63, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x08,0x77,0x01,0x4C,0x63, +0x51,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x61,0x13,0x17, +0x00,0x57,0x18,0xFD,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74, +0x61,0x13,0x17,0x00,0x53,0x18,0x02,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x74,0xC0,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74, +0xA8,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xC8,0x12,0xF7, +0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xA0,0x12,0xF7,0x00,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x20,0x10,0x77,0x00,0x85,0x29,0x5C,0x63,0x00, +0xC3,0x14,0x00,0x01,0x4E,0xE3,0x10,0xCB,0x18,0x2A,0x00,0x8E,0xF8,0x08,0x77,0x00, +0x9A,0xE8,0xCC,0x63,0x00,0x03,0x40,0x63,0xB8,0x85,0x29,0x5C,0x84,0x04,0x5E,0xE4, +0x00,0xD2,0xEF,0x05,0xAD,0x4E,0xF7,0x10,0xC3,0x18,0x00,0x21,0xFF,0x18,0xBD,0x1C, +0x8E,0xF8,0xC3,0x34,0x00,0x01,0x0F,0x17,0x02,0xCA,0xF9,0x26,0x18,0x0B,0x57,0x01, +0xC7,0x5A,0xFF,0xF3,0x1F,0x60,0xCF,0x0F,0x57,0x01,0x0B,0x57,0x01,0x47,0x5A,0xDC, +0x53,0x5A,0x10,0x4C,0x84,0x49,0x0F,0x57,0x01,0x9A,0xE1,0xCB,0x59,0x26,0x20,0xE4, +0x00,0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1,0x8F,0x38,0x5E,0xF7,0x04,0x0B,0x39,0x01, +0xC7,0x39,0x3F,0xFF,0x0F,0x3A,0x01,0xC3,0x34,0x00,0x01,0xD6,0xE4,0xFF,0x40,0x20, +0x60,0x96,0xCB,0x39,0x26,0x38,0x0B,0x18,0x01,0x0A,0xF9,0x01,0x4F,0x18,0x60,0xFF, +0x40,0x8F,0xFF,0xC7,0x18,0x70,0x00,0x46,0xF7,0xD4,0x46,0xF8,0xBD,0x0E,0xF9,0x01, +0xE4,0x00,0x00,0x4B,0x20,0x64,0x86,0xCA,0xF9,0x26,0x38,0xFF,0x60,0xF8,0xFF,0x0B, +0x38,0x01,0x0B,0x57,0x01,0x4F,0x39,0x40,0x47,0x1A,0xDC,0xC7,0x39,0x07,0x00,0x47, +0x19,0xC5,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x18,0x0B,0x17,0x01, +0x53,0x18,0x30,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0xD0,0x8F,0x03,0x9D,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBC,0x44,0x4C,0x84,0x10,0xC3,0x14,0x00,0x01,0x8C,0x97, +0xCB,0x38,0x26,0x34,0x0E,0xE4,0x02,0x0B,0x59,0x01,0x0B,0x77,0x03,0xFF,0x80,0xC0, +0x00,0xC7,0x7B,0x3F,0xFF,0x47,0x5A,0xE4,0x47,0x5B,0xD5,0x0F,0x59,0x01,0x20,0x60, +0x7E,0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F,0x39,0x60,0x0B,0x58,0x01,0xFF,0x60, +0x8F,0xFF,0xC7,0x39,0x70,0x00,0x46,0xFA,0xDC,0xE4,0x00,0x00,0x3F,0x20,0x64,0x86, +0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F,0x39,0x40,0x0B,0x58,0x01,0xFF,0x80,0xF8, +0xFF,0xC7,0x39,0x07,0x00,0x46,0xFA,0xE4,0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29, +0x5C,0x84,0x00,0xD0,0x8C,0x04,0x1D,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBC,0x44,0x4C, +0x84,0x10,0xFF,0x40,0xC0,0x00,0x8C,0x97,0x0E,0xE4,0x02,0x20,0x60,0xD6,0xC3,0x14, +0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26,0xC4,0xC7,0x7B,0x3F,0xFF,0x0B,0x99,0x01, +0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18,0x26,0x38,0x0F,0x59,0x01,0x1F,0x60,0x8F, +0x0B,0x37,0x01,0x0B,0x58,0x01,0x4F,0x39,0x20,0x57,0x39,0x70,0xE4,0x00,0x00,0x63, +0x20,0x64,0xDA,0xC3,0x14,0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26,0xC8,0xC7,0x7B, +0x3F,0xFF,0x0B,0x99,0x01,0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18,0x26,0x38,0x0F, +0x59,0x01,0x9B,0x78,0x0B,0x37,0x01,0x0B,0x58,0x01,0x57,0x39,0x07,0x46,0xFA,0xDC, +0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x28,0x20,0x64, +0xEE,0xE4,0x00,0x00,0x39,0xC2,0xF4,0x00,0x01,0x4C,0x84,0x41,0xCA,0xF7,0x26,0xC0, +0x54,0x84,0x3F,0x0B,0x17,0x01,0x1F,0x20,0xC0,0xE4,0x00,0x00,0x2F,0xC2,0xF4,0x00, +0x01,0xC4,0x84,0x3F,0x00,0xCA,0xF7,0x26,0xC0,0xFF,0x20,0xC0,0xFF,0x0B,0x17,0x01, +0x47,0x18,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0x20,0x61,0x52,0x20,0x84, +0x84,0x20,0x80,0x2C,0xD0,0x82,0x04,0xD6,0xE4,0x00,0x00,0x5D,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0x3F,0xFF,0xE4,0x00,0x01,0x01,0xC2, +0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18, +0x3F,0xFF,0xE4,0x00,0x00,0x27,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xC0,0x00,0xCA,0xF7, +0x26,0x30,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0xA1,0x20, +0x65,0x3E,0x20,0x84,0x80,0x20,0x80,0x28,0x20,0x89,0x1A,0xE4,0x00,0x00,0x63,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0xCF,0xFF,0xE4,0x00, +0x00,0x5B,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xCF,0xFF,0xCA,0xF7,0x26,0x30,0x0B,0x17, +0x01,0x47,0x18,0xCC,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x27,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xCB,0x18,0x30,0x00,0x0F,0x17,0x01,0x85,0x29, +0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26,0x24,0x0B, +0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF,0x0F,0x17, +0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17, +0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0xDF,0xFF,0x0F,0x17,0x01,0x85,0x29, +0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18, +0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26, +0x24,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18,0x10,0x00,0xE4, +0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17, +0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x9C,0x38,0xC2,0xF4,0x00,0x01, +0x0D,0x21,0x04,0xCA,0xF7,0x26,0x18,0x0B,0x17,0x01,0xCB,0x18,0x40,0x00,0x98,0x60, +0x0F,0x17,0x01,0xE7,0xFF,0xFF,0x1A,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF, +0xFF,0x5F,0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26, +0x00,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0x2D,0x20,0x60, +0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF, +0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00, +0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xDF,0xFF,0x0F,0x17,0x01, +0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01, +0xCB,0x18,0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20, +0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x10, +0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00, +0x0B,0x17,0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x08,0x00,0xE4,0x00, +0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01, +0xC7,0x18,0xF7,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x04,0x00,0xE4,0x00,0x00,0x2D,0x20, +0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFB, +0xFF,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0x4F,0x23,0x40, +0xCA,0xF7,0x26,0x14,0x4C,0x63,0x60,0x0B,0x17,0x01,0x44,0x79,0x1D,0x5F,0x18,0x00, +0x44,0x63,0xC5,0x5C,0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xFF, +0x20,0xF0,0x00,0xCB,0x17,0x26,0x0C,0xC4,0x63,0x0F,0xFF,0x0B,0x58,0x01,0x5C,0x63, +0x06,0x47,0x5A,0xCC,0x47,0x43,0xD5,0x0F,0x58,0x01,0xCA,0xF7,0x26,0x10,0x0B,0x17, +0x01,0x47,0x38,0xCC,0x44,0x63,0xCD,0x0C,0x77,0x01,0x85,0x29,0x9C,0x38,0xFF,0x00, +0xE0,0x00,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC1,0x54,0x00,0x01,0xCA,0xEA,0x26,0x04, +0x0B,0x37,0x01,0x47,0x39,0xC4,0xCB,0x39,0x0F,0xA0,0x0F,0x37,0x01,0xCA,0xEA,0x26, +0x08,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x10,0x60,0x98,0x60,0x0F,0x17,0x01, +0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF9,0x28,0xCA,0xEA,0x26,0xC0,0xFF,0x20,0xC0,0xFF, +0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x08,0x00,0x98,0x60,0x0F,0x17,0x01,0xFC, +0x80,0x08,0x03,0xE7,0xFF,0xF7,0xDA,0x98,0x61,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF7, +0xC6,0xCA,0xEA,0x26,0x00,0x0B,0x17,0x01,0x53,0x18,0x0F,0x0F,0x17,0x01,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0x7F,0x0F,0x17,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xBF,0x98, +0x68,0x0F,0x17,0x01,0xE7,0xFF,0xFE,0x44,0x0D,0x21,0x06,0x0D,0x41,0x02,0xFC,0x60, +0x01,0x2C,0x9C,0x28,0xE7,0xFF,0xFE,0x6F,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00, +0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x78,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFD,0x0F,0x17,0x01,0x85,0x29,0x9C, +0x7F,0x5C,0x63,0x00,0xD0,0x64,0x05,0x15,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBE,0xDC, +0x4C,0x63,0x10,0xFF,0x00,0xFC,0xFF,0x8C,0x77,0xC2,0xF4,0x00,0x01,0x0F,0x23,0x02, +0x87,0x29,0xCB,0x17,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x38,0x01,0x53,0x39,0x01, +0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFC,0xFF,0xE4,0x00,0x00,0xD3,0xCB,0x37, +0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01,0x53,0x5A,0x01,0x0F,0x59,0x01,0x0B, +0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x01,0x00,0xE4,0x00,0x00,0x95,0xCB,0x37,0x3D, +0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01,0x53,0x5A,0x01,0x0F,0x59,0x01,0x0B,0x37, +0x01,0x47,0x19,0xC4,0xCB,0x18,0x02,0x00,0xE4,0x00,0x00,0x57,0xCA,0xF7,0x3D,0x3C, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4,0x00,0x00,0x39,0xCB,0x17,0x3C,0x10,0xCA, +0xF7,0x3C,0x14,0x0B,0x38,0x01,0x53,0x39,0x01,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7, +0x18,0xFF,0xFD,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xFB,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0x5C,0x84,0x00, +0x9A,0xE0,0x24,0x64,0x43,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBE,0xF0,0x8C,0x77,0x12, +0xE3,0x00,0xC3,0x14,0x00,0x01,0xCB,0x18,0x78,0x01,0x4E,0xF7,0x10,0x5C,0x80,0x29, +0x46,0xF7,0xC5,0x4B,0x00,0x1A,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C, +0x84,0x04,0xCB,0x17,0x79,0x04,0xCC,0x84,0x17,0x70,0x4F,0x24,0x81,0x5C,0x84,0x04, +0x0F,0x38,0x01,0xCA,0xF7,0x79,0x00,0x0C,0x97,0x01,0x98,0x81,0xE7,0xFF,0xFF,0x5D, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xCC,0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x7A,0x30,0xCB,0x37,0x7A,0x34,0xCB, +0x57,0x7A,0x10,0xCA,0xF7,0x7A,0x14,0x0B,0x18,0x01,0x0B,0x39,0x01,0x0B,0x5A,0x01, +0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63,0x80,0x8E,0xF8,0x8C,0x7A,0x44,0x63,0x1F, +0x44,0x63,0xBC,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x7A,0x70,0xCB,0x37,0x7A, +0x74,0xCB,0x57,0x7A,0x50,0xCA,0xF7,0x7A,0x54,0x0B,0x18,0x01,0x0B,0x39,0x01,0x0B, +0x5A,0x01,0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63,0x80,0x8E,0xF8,0x8C,0x7A,0x44, +0x63,0x1F,0x44,0x63,0xBC,0x85,0x29,0x5C,0x63,0x06,0xC2,0xF4,0x00,0x01,0x47,0x23, +0x1F,0xCA,0xF7,0x7A,0x10,0x0B,0x17,0x01,0x47,0x19,0xC4,0x44,0x63,0xC5,0x5C,0x63, +0x04,0x0C,0x77,0x01,0x85,0x29,0x5C,0x63,0x06,0xC2,0xF4,0x00,0x01,0x47,0x23,0x1F, +0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47,0x19,0xC4,0x44,0x63,0xC5,0x5C,0x63,0x04, +0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x44,0x63,0x1F,0xCA,0xF7,0x7A,0x10, +0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x44, +0x63,0x1F,0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x7A,0x30,0x0C,0x77,0x01,0x85, +0x29,0x9B,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x7A,0x70,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xFF,0x20,0xAA,0x55,0xCB,0x17,0x78,0xC0,0x0F,0x38,0x01,0x5F, +0x03,0x04,0x27,0x08,0x17,0x98,0x63,0xCA,0xF7,0x78,0xC4,0x5C,0x63,0x04,0xCB,0x00, +0x03,0xE8,0x43,0x04,0xC1,0x40,0x63,0xC3,0x4C,0x63,0x81,0x44,0x63,0x1F,0x0C,0x77, +0x01,0x06,0xE0,0x5B,0xCA,0xF7,0x8D,0x80,0x5C,0x97,0x0D,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x3C,0x44,0x0B,0x17,0x01,0x20,0x00,0x2D,0xC7,0x18,0xFF,0xBF,0xE4,0x00,0x00, +0x15,0x5F,0x18,0x04,0x53,0x18,0x40,0x0F,0x17,0x01,0x85,0x29,0xFF,0x00,0xAA,0x55, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0,0x0F,0x17,0x01,0x85,0x29,0xFF,0x00,0x55, +0xAA,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0,0x0F,0x17,0x01,0x85,0x29,0xCA,0xE0, +0x03,0x20,0xC3,0x14,0x00,0x01,0x5C,0x63,0x04,0xC0,0x60,0x63,0xEA,0x48,0x63,0xB8, +0xCA,0xF8,0x79,0x10,0x0B,0x37,0x01,0x53,0x39,0x01,0x0F,0x37,0x01,0xCB,0x58,0x79, +0x00,0xCB,0x38,0x79,0x08,0x9C,0x38,0x0A,0xF9,0x01,0xCB,0x18,0x3C,0x44,0x0B,0x7A, +0x01,0x0B,0x39,0x01,0x0F,0x21,0x07,0x0B,0x18,0x01,0x57,0x18,0x40,0x5F,0x18,0x04, +0x23,0x00,0x40,0x4C,0x63,0x29,0x5C,0x60,0x09,0x48,0x63,0x0A,0xE4,0x00,0x00,0x3F, +0xCC,0x63,0x00,0x06,0x5C,0x63,0x04,0xE4,0x00,0x00,0x29,0x0A,0xF8,0x01,0x52,0xF7, +0x01,0x0E,0xF8,0x01,0x0A,0xF9,0x01,0xE4,0x00,0x00,0x21,0xC3,0x34,0x00,0x01,0xCB, +0x19,0x79,0x10,0xCB,0x39,0x79,0x08,0x0B,0x41,0x07,0x43,0x57,0xD5,0xD4,0x7A,0x00, +0xB8,0x0B,0x41,0x07,0xD7,0x57,0xFE,0xB9,0x0B,0x41,0x07,0x43,0x5B,0xD5,0x8E,0xFA, +0xD4,0x77,0xFE,0x5C,0x9C,0x28,0x85,0x29,0x5C,0x63,0x04,0xE4,0x00,0x00,0x2D,0x42, +0xE4,0x2C,0xC3,0x38,0x00,0x01,0x43,0x05,0xCC,0x8F,0x03,0x13,0x18,0x00,0x1B,0x17, +0x00,0x9C,0xBF,0x20,0xBF,0xB2,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0x20, +0x60,0xCE,0xCA,0xF7,0x2C,0x30,0x0B,0x17,0x01,0xCB,0x18,0x02,0x00,0x0F,0x17,0x01, +0x80,0x01,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3C,0x44,0xCA,0xF7,0x3C,0xA8,0x0B,0x38, +0x01,0xC7,0x39,0xFF,0xF3,0x0F,0x38,0x01,0x0B,0x17,0x01,0x53,0x18,0x01,0xE4,0x00, +0x00,0x9F,0xCB,0x17,0x3C,0xA8,0x0B,0x38,0x01,0x53,0x39,0x01,0xCA,0xF7,0x3C,0x5C, +0x0F,0x38,0x01,0x1F,0x00,0xC0,0x0B,0x37,0x00,0x47,0x39,0xC4,0x9B,0x02,0x24,0x64, +0x25,0x54,0x63,0x3F,0x5F,0x03,0x06,0x47,0x18,0xCD,0x5C,0x78,0x04,0xC3,0x14,0x00, +0x01,0x0C,0x77,0x01,0xCA,0xF8,0x3C,0xA8,0x0B,0x37,0x01,0xC7,0x39,0xFF,0xFE,0x0F, +0x37,0x01,0xCA,0xF8,0x2C,0x30,0x0B,0x17,0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01, +0x85,0x29,0x80,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x1E,0xB0,0x0B,0x17,0x01,0x53, +0x18,0x03,0x0F,0x17,0x01,0x80,0x01,0x9B,0x1F,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0D,0xCA,0xE0,0x48,0x04,0xC3,0x17,0x00,0x0D,0x80,0x01,0xCA,0xE0,0x40,0x00,0xC3, +0x17,0x00,0x0F,0x53,0x18,0x40,0xC3,0x17,0x00,0x0D,0xC3,0x17,0x00,0x0F,0x1F,0x20, +0xBF,0x47,0x18,0xCC,0xC3,0x17,0x00,0x0D,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x3D,0x80,0x0B,0x38,0x01,0xCB,0x39,0x08,0x00,0x0F,0x38,0x01,0xCA,0xF7,0x3D,0x84, +0x0B,0x17,0x01,0xCB,0x18,0x08,0x00,0x0F,0x17,0x01,0x85,0x29,0xE7,0xFF,0xFF,0xBD, +0x56,0xE3,0xFF,0x4E,0xF7,0x08,0x5C,0x84,0x04,0xC4,0x63,0xFF,0x00,0x8C,0x77,0xC2, +0xF4,0x00,0x01,0x4C,0x63,0x08,0x8C,0x77,0x0C,0x83,0x01,0x85,0x29,0x1C,0x21,0xC8, +0xC0,0x98,0x00,0x21,0x0D,0x21,0x34,0x1C,0x61,0x06,0xFC,0x84,0xB6,0x6E,0x50,0xA0, +0x2A,0xE7,0xFF,0x2D,0x1E,0x1E,0xE1,0x06,0x1F,0x41,0x30,0x0B,0x37,0x01,0xFF,0x60, +0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19, +0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47, +0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6, +0xD7,0x57,0xFE,0x5E,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xFC,0x21,0xFF,0x38, +0x50,0xA0,0x3C,0xED,0x21,0x00,0xC4,0xED,0x41,0x00,0xC0,0xED,0x61,0x00,0xBC,0xED, +0x81,0x00,0xB8,0xED,0xA1,0x00,0xB4,0xED,0xC1,0x00,0xB0,0xED,0xE1,0x00,0xAC,0xEE, +0x01,0x00,0xA8,0xC1,0x58,0x00,0x21,0x1C,0x61,0x6C,0xFD,0x4A,0xB6,0x6E,0x1C,0x8A, +0x2A,0xE7,0xFF,0x2C,0x1E,0x50,0xA0,0x24,0x1C,0x8A,0x66,0x1C,0x61,0x48,0xE7,0xFF, +0x2C,0x04,0x98,0x61,0x98,0x82,0xE7,0xFF,0xEE,0x8A,0x98,0x61,0xFC,0x80,0x3E,0x0C, +0xE7,0xFF,0xD5,0xA6,0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE7,0xFF,0xEB,0xDC,0x98,0x61, +0x88,0x83,0xE7,0xFF,0xD8,0x5A,0x98,0x61,0x88,0x83,0xE7,0xFF,0xD5,0xE2,0x98,0x60, +0x98,0x81,0xE7,0xFF,0xD6,0xD2,0x98,0x60,0x05,0x4F,0x0F,0xC9,0x4A,0x0F,0x0F,0x88, +0x8A,0xE7,0xFF,0xE0,0x92,0x98,0x61,0x88,0x8A,0xE7,0xFF,0xE0,0x82,0xC3,0x54,0x00, +0x01,0xCA,0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00,0x57,0x17,0xFF,0x4F,0x18,0x10,0x8F, +0x1A,0x1F,0x61,0x2A,0x0B,0x38,0x01,0x4F,0x17,0x08,0x8F,0x1B,0xEF,0x38,0xDD,0x61, +0x9E,0xE1,0xC2,0xE2,0x2B,0xE4,0x23,0xFF,0x8D,0x1E,0xE1,0x6C,0xFF,0x41,0x00,0xA8, +0xC1,0x94,0x00,0x01,0xFD,0xA0,0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0x6C,0x5F,0x39, +0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x8F,0x0C,0x0F,0x38, +0x01,0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0x1E,0xE1,0x48,0x1F,0x41,0x6C,0x0B,0x37,0x01, +0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37, +0x03,0x8F,0x0C,0x0F,0x38,0x01,0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0xE7,0xFF,0xD1,0xAC, +0x99,0xE0,0x89,0xC3,0x98,0x61,0xE7,0xFF,0xD1,0xC2,0xD1,0xE0,0x05,0xBE,0x98,0x60, +0x1D,0x61,0x0A,0xE7,0xFF,0xD1,0xFC,0x99,0x40,0xE4,0x00,0x01,0x45,0x98,0x61,0x88, +0x8A,0x22,0x01,0x0A,0xE7,0xFF,0xDD,0x94,0x98,0x60,0xE7,0xFF,0xDD,0xDE,0xFC,0x60, +0x01,0x00,0xE7,0xFF,0xF7,0x86,0xE7,0xFF,0xCF,0xC8,0xE7,0xFF,0xF6,0x32,0xC4,0x63, +0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0xDC,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0xF7,0xA0,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE8,0x04,0xE4, +0x00,0x00,0x8B,0xE7,0xFF,0xDD,0x16,0x98,0x61,0xE7,0xFF,0xDD,0x60,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0xF7,0x08,0xE7,0xFF,0xCF,0x4A,0xE7,0xFF,0xF5,0xB4,0xC4,0x63,0x01, +0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x5E,0xFC,0x60,0x01,0x00, +0xE7,0xFF,0xF7,0x22,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE7,0x86,0x0A,0xEB, +0x01,0x40,0x63,0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2,0x02,0xFB,0x8E, +0x9D,0x41,0x9D,0x62,0x5D,0x4A,0x00,0xD1,0x44,0x05,0xEA,0x9A,0x00,0xE7,0xFF,0xFE, +0xC1,0x98,0x61,0x1D,0x61,0x12,0xE7,0xFF,0xD0,0x96,0x99,0x40,0xE4,0x00,0x01,0x45, +0x98,0x61,0x88,0x8A,0x22,0x01,0x0A,0xE7,0xFF,0xDC,0x2E,0x98,0x60,0xE7,0xFF,0xDC, +0x78,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x20,0xE7,0xFF,0xCE,0x62,0xE7,0xFF,0xF4, +0xCC,0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF5,0x76, +0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x3A,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF, +0xE6,0x9E,0xE4,0x00,0x00,0x8B,0xE7,0xFF,0xDB,0xB0,0x98,0x61,0xE7,0xFF,0xDB,0xFA, +0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF5,0xA2,0xE7,0xFF,0xCD,0xE4,0xE7,0xFF,0xF4,0x4E, +0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF4,0xF8,0xFC, +0x60,0x01,0x00,0xE7,0xFF,0xF5,0xBC,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE6, +0x20,0x0A,0xEB,0x01,0x40,0x63,0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2, +0x02,0xFB,0x8E,0x9D,0x41,0x9D,0x62,0x5D,0x4A,0x00,0xD1,0x44,0x00,0x52,0x9A,0x00, +0xE7,0xFF,0xFE,0xC1,0x9D,0xE1,0x5D,0xEF,0x00,0xD1,0xE2,0xF4,0x8E,0x0B,0x21,0x0A, +0x0B,0x01,0x12,0x0F,0x21,0x07,0x1E,0xE1,0x0C,0x1F,0x81,0x12,0x0B,0x77,0x01,0x8B, +0x59,0x5F,0xBB,0x06,0xD7,0x3D,0x00,0x30,0x8B,0x5B,0x5F,0x3A,0x06,0x0B,0x77,0x09, +0x8B,0x58,0x5F,0xBB,0x06,0xD7,0x1D,0x00,0x30,0x8B,0x5B,0x5F,0x1A,0x06,0x9E,0xE2, +0xD7,0x97,0xFE,0xE6,0x0F,0x21,0x07,0x9A,0xE0,0x0F,0x01,0x09,0x1F,0x21,0x1A,0x8B, +0x57,0xFD,0x00,0x3F,0xFF,0xE4,0x00,0x00,0x69,0x43,0x7E,0xC4,0x0B,0x9B,0x00,0x43, +0x79,0xC4,0x23,0x80,0x32,0x0D,0x1B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x23,0x09,0x5D, +0x00,0xCD,0x4A,0x1F,0xFF,0x43,0x8A,0xE0,0x0F,0x9B,0x01,0x9F,0x02,0xD3,0x08,0xFE, +0xE6,0x9F,0x28,0x9E,0xE2,0xD2,0xE4,0x00,0xBA,0x1F,0x01,0x0A,0x4F,0xD7,0x10,0x1F, +0xA1,0x06,0x8F,0xD8,0x8F,0xB7,0x9B,0x00,0xE7,0xFF,0xFF,0x83,0xC3,0x94,0x00,0x01, +0x9A,0xE0,0xCB,0x9C,0x24,0x00,0xE4,0x00,0x00,0x47,0x43,0xB9,0xC4,0x43,0xDB,0xC4, +0x57,0xBD,0xFF,0x0B,0xDE,0x01,0x4F,0xBD,0x10,0x8F,0xBC,0x0F,0xDD,0x01,0x9F,0x02, +0xD3,0x08,0xFF,0x56,0x9E,0xE1,0x22,0xE8,0x54,0x1F,0x21,0x1A,0x4F,0x77,0x18,0x9B, +0x00,0x8F,0x79,0xFF,0x37,0x12,0x46,0xE7,0xFF,0xFF,0xA7,0x9A,0xE0,0x4F,0x17,0x08, +0x1F,0x61,0x6C,0x8F,0x1B,0x0B,0x38,0x01,0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39, +0x10,0x4F,0x18,0x08,0x8F,0x19,0x1F,0x21,0x2A,0x8F,0x0C,0x8F,0x37,0x0B,0x39,0x01, +0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE3,0xC9,0x23,0xFF,0x55,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x25,0x38,0x0B,0x17,0x01,0x23,0x40,0x34,0x5F,0x18,0x04,0x53,0x18,0x0F,0xE4, +0x00,0x00,0x11,0xC7,0x18,0xFF,0xF0,0x0F,0x17,0x01,0x98,0x60,0x98,0x80,0xE7,0xFF, +0xDA,0x38,0x98,0x80,0x98,0x61,0xE7,0xFF,0xDA,0x28,0x98,0x60,0xE7,0xFF,0xD8,0xDA, +0x98,0x60,0x98,0x80,0xE7,0xFF,0xD8,0x74,0x88,0x6E,0xEE,0x01,0x00,0xAA,0xED,0xE1, +0x00,0xAE,0xED,0xC1,0x00,0xB2,0xED,0xA1,0x00,0xB6,0xED,0x81,0x00,0xBA,0xED,0x61, +0x00,0xBE,0xED,0x41,0x00,0xC2,0xED,0x21,0x00,0xC6,0xFC,0x21,0x00,0xC8,0xE7,0xFF, +0xCC,0x13,0xC2,0xF4,0x00,0x01,0x53,0x20,0x1F,0xCB,0x17,0x3C,0x30,0x0F,0x38,0x01, +0xCC,0x63,0x61,0xA8,0xCB,0x17,0x3C,0x90,0xCA,0xF7,0x3C,0x38,0x0B,0x18,0x01,0x43, +0x03,0xC1,0x4F,0x18,0x29,0x9F,0x1F,0x5F,0x18,0x04,0x0F,0x17,0x01,0x85,0x29,0xC2, +0xF4,0x00,0x01,0x54,0x63,0x62,0xCA,0xF7,0x3C,0x94,0x50,0x63,0x02,0x0B,0x17,0x01, +0x1F,0x20,0x9D,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63, +0x04,0xC6,0xE3,0x02,0x00,0x5E,0xF7,0x04,0x22,0xE0,0x70,0xC2,0xF4,0x00,0x01,0xFF, +0x20,0xFC,0xFF,0xCA,0xF7,0x2C,0x54,0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x01, +0x00,0x0F,0x17,0x01,0xC6,0xE3,0x04,0x00,0x5E,0xF7,0x04,0x22,0xE0,0xB8,0xC2,0xF4, +0x00,0x01,0xFF,0x00,0xA5,0x5A,0xCB,0x37,0x30,0xCC,0x0F,0x19,0x01,0xCB,0x37,0x30, +0xD0,0x0F,0x19,0x01,0xCA,0xF7,0x31,0x04,0xFF,0x40,0x8F,0xFF,0x0B,0x17,0x01,0x47, +0x18,0xD4,0xCB,0x18,0x30,0x00,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3C, +0x98,0x0B,0x38,0x01,0xFF,0x20,0x01,0x01,0x0F,0x38,0x01,0xCB,0x17,0x3C,0xA0,0x0B, +0x58,0x01,0x0F,0x38,0x01,0x1F,0x40,0x88,0xCB,0x17,0x3C,0xB4,0x0B,0x38,0x01,0x47, +0x39,0xD4,0x53,0x39,0x33,0x0F,0x38,0x01,0xCB,0x17,0x3C,0xB0,0x0B,0x38,0x01,0x5F, +0x39,0x00,0xCB,0x39,0x03,0x00,0x0F,0x38,0x01,0xCA,0xF7,0x3C,0x94,0xC4,0x63,0x07, +0x00,0x0B,0x17,0x01,0xFF,0x20,0xF8,0xFF,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77, +0x01,0x85,0x29,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC8,0x80, +0xAA,0x55,0xC0,0x74,0x00,0x01,0xC8,0x63,0x78,0xC0,0x0C,0x83,0x00,0xC0,0x74,0x00, +0x01,0xC8,0x63,0x1F,0xDC,0x50,0x80,0x80,0x0C,0x83,0x00,0x04,0x20,0x80,0xC8,0x21, +0x17,0xFC,0x1C,0x40,0xFD,0x44,0x21,0x14,0x28,0x00,0x74,0xC0,0x40,0x00,0x01,0xC8, +0x42,0x3E,0x06,0x84,0x49,0x0C,0x41,0x0C,0x0C,0x61,0x10,0x0C,0x81,0x14,0x0C,0xA1, +0x18,0x0C,0xC1,0x1C,0x0C,0xE1,0x20,0x0D,0x01,0x24,0x0D,0x21,0x28,0x0D,0x41,0x2C, +0x0D,0x61,0x30,0x0D,0x81,0x34,0x0D,0xA1,0x38,0x0D,0xC1,0x3C,0x0D,0xE1,0x40,0x0E, +0x01,0x44,0x0E,0x21,0x48,0x0E,0x41,0x4C,0x0E,0x61,0x50,0x0E,0x81,0x54,0x0E,0xA1, +0x58,0x0E,0xC1,0x5C,0x0E,0xE1,0x60,0x0F,0x01,0x64,0x0F,0x21,0x68,0x0F,0x41,0x6C, +0x0F,0x61,0x70,0x0F,0x81,0x74,0x0F,0xA1,0x78,0x0F,0xC1,0x7C,0x1C,0x61,0x00,0xC1, +0x00,0x00,0x01,0xC9,0x08,0xAD,0x50,0x85,0x08,0x90,0x23,0x00,0xC0,0x40,0x10,0x01, +0xC8,0x42,0x03,0xB0,0xC0,0x60,0x10,0x01,0xC8,0x63,0x0D,0x04,0x5C,0x43,0x1F,0x20, +0x00,0x2D,0x0C,0x02,0x00,0x1C,0x42,0x04,0x93,0xF4,0x85,0x29,0xC0,0x80,0x01,0x1F, +0xC0,0x7F,0xFF,0xE1,0xC8,0x63,0xFF,0xF9,0x44,0x84,0x1C,0xC0,0x80,0x01,0x1D,0x0C, +0x61,0x02,0xC0,0x60,0x02,0x0D,0x0C,0x61,0x06,0xC0,0x60,0x04,0x0D,0x0C,0x41,0x0E, +0x0C,0x61,0x12,0x0C,0x81,0x16,0x0C,0xA1,0x1A,0x0C,0xC1,0x1E,0x0C,0xE1,0x22,0x0D, +0x01,0x26,0x0D,0x21,0x2A,0x0D,0x41,0x2E,0x0D,0x61,0x32,0x0D,0x81,0x36,0x0D,0xA1, +0x3A,0x0D,0xC1,0x3E,0x0D,0xE1,0x42,0x0E,0x01,0x46,0x0E,0x21,0x4A,0x0E,0x41,0x4E, +0x0E,0x61,0x52,0x0E,0x81,0x56,0x0E,0xA1,0x5A,0x0E,0xC1,0x5E,0x0E,0xE1,0x62,0x0F, +0x01,0x66,0x0F,0x21,0x6A,0x0F,0x41,0x6E,0x0F,0x61,0x72,0x0F,0x81,0x76,0x0F,0xA1, +0x7A,0x0F,0xC1,0x7E,0xEF,0xE1,0x00,0x82,0x0C,0x21,0x0A,0x84,0x00,0x00,0x00,0x00, +0x9C,0x30,0xCA,0xE0,0x48,0x02,0x0D,0x41,0x08,0x0D,0x21,0x0C,0x89,0x43,0xC2,0xF7, +0x00,0x0F,0x9B,0x1C,0x46,0xF7,0xC4,0x0E,0xE1,0x04,0x0E,0xE1,0x06,0x56,0xF7,0x04, +0x22,0xE0,0xE0,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00,0x0F,0x9B,0x1B,0x47,0x39,0xC4, +0xC3,0x37,0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3, +0x17,0x00,0x0D,0x98,0x82,0xE7,0xFF,0xBE,0x8C,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D,0x0E,0xE1,0x06,0x56,0xF7,0x08,0x22,0xE0, +0xE8,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00,0x0F,0x9B,0x17,0x47,0x39,0xC4,0xC3,0x37, +0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3,0x17,0x00, +0x0D,0x98,0x83,0x88,0x6A,0xE7,0xFF,0xBE,0x0C,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0F,0x53,0x18,0x08,0xC3,0x17,0x00,0x0D,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21, +0x10,0x85,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0xA0,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1B,0x00,0x00,0x00,0x00,0xA0,0x26,0x01, +0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0xA0,0x66,0x00, +0x01,0x00,0x00,0x00,0xF3,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC4,0x00,0x2F,0x00,0x07,0x00,0x0D,0x01, +0xE0,0xFF,0x5C,0x00,0x00,0x00,0x00,0x00,0x1B,0x00,0x1B,0x00,0x01,0x00,0x10,0x00, +0xDF,0x00,0x9E,0x00,0x5B,0x00,0x5B,0x00,0x1A,0x00,0x32,0x00,0x90,0x01,0x80,0x00, +0x94,0x01,0x80,0x00,0x19,0x00,0x32,0x00,0x98,0xB9,0x00,0xC0,0x02,0x01,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0xF5,0xB9,0x00,0xC0,0x02,0x02,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0xD7,0xB9,0x00,0xC0,0x02,0x03,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0xCD,0xB9,0x00,0xC0,0x02,0x04,0x00,0x00, +0x00,0x00,0x00,0x00,0x14,0x14,0x14,0x14,0x08,0xBA,0x00,0xC0,0x0B,0x05,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x64,0x2C,0x9A,0xB9,0x00,0xC0,0x0D,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0xA7,0xB9,0x00,0xC0,0x0B,0x07,0x00,0x00, +0x01,0x00,0x00,0x00,0x28,0x14,0x28,0x14,0xE7,0xB9,0x00,0xC0,0x0E,0x08,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x37,0x19,0xD9,0xB9,0x00,0xC0,0x06,0x09,0x00,0x00, +0x01,0x00,0x00,0x00,0x1E,0x14,0x30,0x1E,0x13,0xBA,0x00,0xC0,0x0E,0x0A,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1C,0x3C,0x22,0x27,0xBA,0x00,0xC0,0x0F,0x0B,0x00,0x00, +0x01,0x00,0x00,0x00,0x46,0x19,0x28,0x14,0x6A,0xB9,0x00,0xC0,0x06,0x0C,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x28,0x14,0x82,0xB9,0x00,0xC0,0x0E,0x0A,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1C,0x3C,0x22,0xCF,0xB9,0x00,0xC0,0x08,0x05,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x78,0x2C,0xFD,0xB9,0x00,0xC0,0x0B,0x05,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x78,0x2C,0xDF,0xB9,0x00,0xC0,0x08,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0xB2,0xB9,0x00,0xC0,0x0C,0x08,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x37,0x19,0xF7,0xB9,0x00,0xC0,0x06,0x07,0x00,0x00, +0x01,0x00,0x00,0x00,0x28,0x14,0x28,0x14,0xC6,0xB9,0x00,0xC0,0x07,0x07,0x00,0x00, +0x01,0x00,0x00,0x00,0x28,0x14,0x28,0x14,0x90,0xB9,0x00,0xC0,0x08,0x0B,0x00,0x00, +0x01,0x00,0x00,0x00,0x46,0x19,0x28,0x14,0x21,0xBA,0x00,0xC0,0x06,0x09,0x00,0x00, +0x01,0x00,0x00,0x00,0x1E,0x14,0x30,0x1E,0xBE,0xB9,0x00,0xC0,0x08,0x0C,0x00,0x00, +0x01,0x00,0x00,0x00,0x3C,0x1E,0x28,0x14,0x36,0xBA,0x00,0xC0,0x09,0x09,0x00,0x00, +0x01,0x00,0x00,0x00,0x1E,0x14,0x30,0x1E,0x70,0xB9,0x00,0xC0,0x0A,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0x7A,0xB9,0x00,0xC0,0x08,0x06,0x00,0x00, +0x01,0x00,0x00,0x00,0x37,0x14,0x5A,0x2C,0x92,0x01,0x80,0x00,0x86,0x01,0x80,0x00, +0x01,0x00,0x00,0x00,0x64,0x00,0x14,0x00,0x14,0x00,0x06,0x00,0x06,0x00,0x5A,0x00, +0x14,0x00,0x14,0x00,0x06,0x00,0x06,0x00,0x64,0x00,0x01,0x00,0x5F,0x00,0x01,0x00, +0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x50,0x00,0x96,0x00,0x40,0x06,0x00,0x00,0x80,0x0C,0x00,0x00,0x01,0x03,0x07,0x00, +0x00,0x01,0x02,0x00,0x07,0x00,0xC8,0x00,0xC8,0x00,0xC8,0x00,0xF4,0x01,0xF4,0x01, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x03,0x04,0x05,0x02,0x00,0x04,0x00,0x06,0x00, +0x08,0x00,0x0A,0x00,0x0C,0x00,0x10,0x00,0x14,0x00,0x18,0x00,0x20,0x00,0x28,0x00, +0x32,0x00,0x3E,0x00,0x40,0x00,0x64,0x00,0x80,0x00,0x00,0x01,0x02,0x00,0x00,0x11, +0xFF,0xFF,0xFF,0xFF,0x01,0x11,0xFF,0xFF,0x18,0x50,0x02,0x11,0xFF,0x7F,0xFF,0x0E, +0x03,0x11,0xFF,0x00,0x66,0x00,0x04,0x11,0xFF,0x0F,0x72,0x07,0x05,0x11,0xFF,0x0F, +0x72,0x07,0x06,0x11,0xFF,0x00,0x00,0x00,0x07,0x11,0x03,0x00,0x00,0x00,0x08,0x11, +0x73,0x00,0x00,0x00,0x09,0x11,0xFF,0xFF,0x00,0x00,0x09,0x11,0xFF,0x7F,0x00,0x00, +0x0A,0x11,0xFF,0x7F,0x87,0x10,0x0E,0x11,0xFF,0xFF,0x00,0x00,0x0F,0x11,0xFF,0xFF, +0x00,0x00,0x17,0x11,0x0F,0xFF,0x00,0x00,0x18,0x11,0xFF,0xFF,0x00,0x02,0x19,0x11, +0xFF,0x00,0x0E,0x00,0x1E,0x11,0xFF,0xFF,0x00,0x00,0x1F,0x11,0xFF,0x00,0x00,0x00, +0x33,0x11,0x0F,0x00,0x00,0x00,0x3A,0x11,0x37,0x0F,0x00,0x00,0x3B,0x11,0x77,0x00, +0x77,0x00,0x3C,0x11,0x00,0xFF,0x00,0xA0,0x3D,0x11,0x77,0x00,0x00,0x00,0x3E,0x11, +0xFF,0x00,0x00,0x00,0x04,0x12,0x06,0x00,0x00,0x00,0x05,0x12,0xFF,0x00,0x00,0x00, +0x07,0x12,0xFF,0xFF,0x00,0x00,0x08,0x12,0xFF,0x00,0x00,0x00,0x09,0x12,0xFF,0xFF, +0x00,0x00,0x0A,0x12,0xFF,0x00,0x00,0x00,0x0B,0x12,0x3F,0x00,0x2E,0x00,0x0D,0x12, +0x1F,0x00,0x05,0x00,0x0E,0x12,0x1F,0x00,0x05,0x00,0x0F,0x12,0xFF,0xFF,0x00,0x00, +0x10,0x12,0xFF,0x00,0x00,0x00,0x11,0x12,0xFF,0x0F,0x00,0x00,0x12,0x12,0x87,0x1F, +0x00,0x00,0x13,0x12,0x7F,0x0F,0x14,0x00,0x14,0x12,0x9F,0xFF,0x0A,0x09,0x15,0x12, +0x7F,0x0F,0x0C,0x0F,0x16,0x12,0xFF,0x0F,0x00,0x07,0x17,0x12,0x1F,0xFF,0x0A,0x5C, +0x18,0x12,0x7F,0x1F,0x14,0x0A,0x19,0x12,0xFF,0xFF,0x8C,0x21,0x1A,0x12,0xFF,0x03, +0x00,0x00,0x1B,0x12,0xFF,0x03,0x00,0x00,0x1C,0x12,0xFF,0x03,0x00,0x00,0x1D,0x12, +0xFF,0x03,0x00,0x00,0x1E,0x12,0x1F,0x1F,0x12,0x07,0x1F,0x12,0x3F,0x3F,0x00,0x00, +0x20,0x12,0xFF,0xFF,0x00,0x00,0x21,0x12,0xFF,0x00,0x00,0x00,0x23,0x12,0x3F,0x3F, +0x02,0x00,0x24,0x12,0x3F,0x00,0x00,0x00,0x28,0x12,0xFF,0xFF,0x83,0x81,0x2D,0x12, +0x01,0x00,0x01,0x00,0x50,0x12,0xFF,0xFF,0x00,0x00,0x51,0x12,0xFF,0x00,0x00,0x00, +0x70,0x12,0x03,0x00,0x03,0x00,0x01,0x11,0x06,0x00,0x02,0x00,0x02,0x11,0x00,0x08, +0x00,0x08,0x2A,0x12,0x00,0xFF,0x00,0xBA,0x2B,0x12,0xFF,0x30,0xF0,0x20,0x01,0x11, +0x06,0x00,0x00,0x00,0x2A,0x12,0x00,0xFF,0x00,0x00,0x2B,0x12,0xFF,0x30,0x00,0x00, +0x01,0x11,0x00,0x50,0x00,0x50,0x02,0x11,0x3F,0x06,0x2F,0x06,0x01,0x11,0x00,0x50, +0x00,0x00,0x02,0x11,0x3F,0x06,0x00,0x00,0x2A,0x12,0x00,0x30,0x00,0x20,0x11,0x1E, +0xFF,0x7F,0x00,0x00,0x12,0x1E,0xFF,0x00,0x00,0x00,0x13,0x1E,0x0F,0x00,0x00,0x00, +0x15,0x1E,0x73,0x07,0x00,0x00,0x16,0x1E,0x0F,0x00,0x00,0x00,0x18,0x1E,0x3F,0x00, +0x08,0x00,0x2A,0x1E,0x05,0x00,0x01,0x00,0x50,0x11,0x11,0x11,0x51,0x11,0x11,0x11, +0x52,0x11,0x11,0x11,0x53,0x11,0x11,0x11,0x54,0x11,0x11,0x11,0x55,0x11,0x11,0x11, +0x56,0x11,0x11,0x11,0x57,0x11,0x11,0x11,0x58,0x11,0x11,0x11,0x59,0x11,0x11,0x11, +0x5A,0x11,0x11,0x11,0x5B,0x11,0x11,0x11,0x5C,0x11,0xFF,0xFF,0x5D,0x11,0xFF,0xFF, +0x5E,0x11,0xFF,0xFF,0x46,0x12,0x00,0x00,0x47,0x12,0x00,0x00,0x48,0x12,0x00,0x00, +0x49,0x12,0x00,0x00,0x4A,0x12,0x00,0x00,0x4B,0x12,0x00,0x00,0x4C,0x12,0x00,0x00, +0x4D,0x12,0x00,0x00,0x4E,0x12,0x0F,0x00,0x02,0x03,0x5C,0x54,0x47,0x37,0x00,0x00, +0x31,0x00,0x94,0x00,0xFA,0x00,0x66,0x01,0xD9,0x01,0x57,0x02,0xE6,0x02,0x8A,0x03, +0x4F,0x04,0x44,0x05,0x84,0x06,0x42,0x08,0xEB,0x0A,0x98,0x0F,0x55,0x1A,0xF3,0x07, +0xFF,0xFF,0x0F,0x00,0x52,0x00,0x69,0x00,0xD9,0x00,0x00,0x00,0x3B,0x40,0x00,0x00, +0xDB,0x40,0x00,0x00,0xFA,0x40,0x00,0x00,0xCD,0x41,0x00,0x00,0xE4,0x41,0x00,0x00, +0x95,0x00,0x89,0x00,0x7E,0x00,0x72,0x00,0x67,0x00,0x5B,0x00,0x50,0x00,0x44,0x00, +0x39,0x00,0x2D,0x00,0x22,0x00,0x16,0x00,0x0B,0x00,0x00,0x00,0xFF,0x00,0x8D,0x09, +0x1A,0x00,0xFE,0x00,0x1B,0x07,0x3F,0x00,0xFE,0x00,0x9D,0x0A,0x78,0x00,0xFD,0x00, +0xEC,0x12,0xA8,0x00,0xFC,0x00,0x6B,0x18,0xD0,0x00,0xFB,0x00,0x7C,0x19,0x0A,0x01, +0xF9,0x00,0x55,0x20,0x4E,0x01,0xF8,0x00,0x85,0x26,0x86,0x01,0xFF,0x00,0x48,0x0D, +0x09,0x00,0xFE,0x00,0x9E,0x0B,0x1E,0x00,0xFE,0x00,0x34,0x0E,0x44,0x00,0xFD,0x00, +0x35,0x14,0x66,0x00,0xFD,0x00,0x1A,0x18,0x7F,0x00,0xFC,0x00,0x11,0x19,0x9C,0x00, +0xFB,0x00,0x3C,0x1C,0xBF,0x00,0xFB,0x00,0x94,0x21,0xDB,0x00,0xFA,0x00,0xE6,0x24, +0xF7,0x00,0xF9,0x00,0xFB,0x24,0x29,0x01,0xFE,0x00,0xE0,0x0D,0x04,0x00,0xFE,0x00, +0xF6,0x10,0x18,0x00,0xFE,0x00,0xC8,0x12,0x30,0x00,0xFD,0x00,0xEB,0x14,0x4A,0x00, +0xFD,0x00,0x74,0x16,0x69,0x00,0xFC,0x00,0xB9,0x1C,0x7E,0x00,0xFC,0x00,0x68,0x20, +0x8E,0x00,0xFB,0x00,0xCE,0x21,0xA6,0x00,0xFB,0x00,0x52,0x23,0xC8,0x00,0xFA,0x00, +0x0A,0x29,0xE2,0x00,0xF9,0x00,0x4D,0x2C,0xFC,0x00,0xFE,0x00,0x85,0x13,0xF8,0xFF, +0xFE,0x00,0xF6,0x12,0x07,0x00,0xFD,0x00,0xC9,0x13,0x24,0x00,0xFD,0x00,0x6E,0x18, +0x3E,0x00,0xFC,0x00,0x47,0x1C,0x4E,0x00,0xFC,0x00,0x83,0x1D,0x5E,0x00,0xFC,0x00, +0xFB,0x1F,0x74,0x00,0xFB,0x00,0xF7,0x25,0x86,0x00,0xFA,0x00,0xB8,0x29,0x93,0x00, +0xFA,0x00,0xA4,0x29,0xAB,0x00,0xF9,0x00,0x13,0x2B,0xCB,0x00,0xF9,0x00,0x37,0x30, +0xE5,0x00,0xFD,0x00,0x0D,0x1F,0xDC,0xFF,0xFD,0x00,0x3D,0x1E,0xE7,0xFF,0xFD,0x00, +0xD0,0x1C,0x02,0x00,0xFC,0x00,0xCD,0x1E,0x1B,0x00,0xFC,0x00,0x4B,0x22,0x29,0x00, +0xFC,0x00,0x4F,0x25,0x33,0x00,0xFB,0x00,0x83,0x27,0x43,0x00,0xFA,0x00,0xE6,0x2C, +0x4F,0x00,0xFA,0x00,0x48,0x30,0x57,0x00,0xFA,0x00,0x0E,0x31,0x62,0x00,0xF9,0x00, +0x76,0x31,0x77,0x00,0xF9,0x00,0x65,0x36,0x87,0x00,0xF8,0x00,0xB3,0x38,0x94,0x00, +0xF8,0x00,0x27,0x37,0xAC,0x00,0x05,0x03,0x03,0x04,0x04,0x00,0x11,0x00,0xC1,0x09, +0xD9,0xFF,0x36,0x01,0x0E,0x00,0x1C,0x00,0xDD,0x03,0x03,0x00,0x40,0x00,0x14,0x00, +0x4C,0x00,0x95,0x03,0x05,0x00,0x07,0x00,0x18,0x00,0xA5,0x00,0x4B,0x06,0x9B,0xFF, +0x03,0x00,0x19,0x00,0xC8,0x00,0x14,0x03,0x3B,0x00,0x00,0x00,0x1A,0x00,0x16,0x00, +0x40,0x05,0xE4,0xFF,0xA2,0x00,0x14,0x00,0x3B,0x00,0x67,0x04,0xF0,0xFF,0x3B,0x00, +0x1A,0x00,0x6F,0x00,0x22,0x04,0xF8,0xFF,0x03,0x00,0x20,0x00,0x1C,0x00,0x48,0x05, +0xDB,0xFF,0x98,0x00,0x16,0x00,0x57,0x00,0x90,0x04,0xEC,0xFF,0x19,0x00,0x21,0x00, +0x95,0x00,0x08,0x04,0xFE,0xFF,0x02,0x00,0x24,0x00,0x23,0x00,0xC4,0x05,0xCC,0xFF, +0xA6,0x00,0x17,0x00,0x62,0x00,0x9C,0x04,0xEC,0xFF,0x17,0x00,0x25,0x00,0xA0,0x00, +0x0E,0x04,0xFB,0xFF,0x02,0x00,0x28,0x00,0x0D,0x01,0x7D,0x04,0xE1,0xFF,0xFC,0xFF, +0x2A,0x00,0x33,0x00,0x30,0x07,0xA2,0xFF,0xD3,0x00,0x18,0x00,0x6F,0x00,0xAD,0x04, +0xED,0xFF,0x23,0x00,0x2B,0x00,0x9C,0x00,0x14,0x03,0x27,0x00,0x03,0x00,0x2F,0x00, +0xE1,0x00,0x53,0x05,0xAB,0xFF,0x02,0x00,0x30,0x00,0x00,0x00,0x13,0x1A,0x05,0x00, +0x30,0x34,0x38,0x0C,0x10,0x34,0x30,0x0E,0x30,0x0A,0x35,0x02,0x09,0x10,0x35,0x10, +0x0A,0x34,0x1E,0x18,0x14,0x0E,0x0B,0x07,0x01,0x3C,0x37,0x34,0x30,0x2A,0x26,0x23, +0x1C,0x17,0x0E,0x05,0x03,0x10,0x19,0x1B,0x2F,0x2F,0x10,0x0E,0x0A,0x05,0x00,0x39, +0x33,0x30,0x10,0x0B,0x04,0x35,0x30,0x28,0x22,0x1E,0x19,0x13,0x10,0x0B,0x07,0x02, +0x3D,0x39,0x00,0x3C,0x38,0x34,0x2E,0x23,0x1D,0x16,0x10,0x0B,0x05,0x01,0x3F,0x00, +0x0A,0x17,0x1A,0x10,0x02,0x3F,0x21,0x1D,0x19,0x14,0x0E,0x04,0x01,0x00,0x00,0x32, +0x33,0x05,0x0D,0x3D,0x35,0x09,0x10,0x1F,0x1F,0x0D,0x0D,0x0D,0x0D,0x35,0x35,0x0E, +0x0D,0x36,0x32,0x09,0x0D,0x37,0x33,0x00,0x3C,0x36,0x2A,0x23,0x1E,0x1A,0x15,0x10, +0x0B,0x08,0x03,0x3C,0x39,0x0F,0x0F,0x1D,0x18,0x12,0x0A,0x04,0x01,0x10,0x10,0x32, +0x3E,0x0D,0x10,0x33,0x38,0x01,0x0D,0x10,0x30,0x34,0x00,0x0D,0x10,0x32,0x34,0x3A, +0x07,0x0D,0x10,0x01,0x05,0x0B,0x0E,0x13,0x1A,0x1F,0x25,0x29,0x2E,0x34,0x36,0x3B, +0x00,0x10,0x0E,0x07,0x3C,0x33,0x30,0x28,0x22,0x1D,0x19,0x14,0x10,0x0A,0x05,0x0B, +0x13,0x1A,0x1D,0x22,0x26,0x2B,0x3D,0x02,0x10,0x09,0x3D,0x34,0x30,0x0B,0x04,0x00, +0xB7,0x60,0x00,0x00,0xB7,0x60,0x00,0x00,0xCC,0x60,0x00,0x00,0xCC,0x60,0x00,0x00, +0x2B,0x62,0x00,0x00,0x2B,0x62,0x00,0x00,0x2B,0x62,0x00,0x00,0x55,0x61,0x00,0x00, +0x2B,0x62,0x00,0x00,0xB2,0x61,0x00,0x00,0x06,0x64,0x00,0x00,0x06,0x64,0x00,0x00, +0x2F,0x64,0x00,0x00,0xFC,0x63,0x00,0x00,0x58,0x64,0x00,0x00,0x88,0x64,0x00,0x00, +0x70,0x64,0x00,0x00,0x61,0x67,0x00,0x00,0x85,0x67,0x00,0x00,0x95,0x67,0x00,0x00, +0xD0,0x67,0x00,0x00,0xCA,0x67,0x00,0x00,0xCA,0x67,0x00,0x00,0xD0,0x67,0x00,0x00, +0xCA,0x67,0x00,0x00,0x0A,0x0B,0x2C,0x1B,0x09,0x07,0x1C,0x1A,0x25,0x05,0x1D,0x19, +0x26,0x00,0x1E,0x18,0x27,0x04,0x1F,0x17,0x28,0x06,0x20,0x0D,0x29,0x08,0x2B,0x0C, +0x2A,0x00,0x00,0x00,0x57,0x75,0x00,0x00,0x57,0x75,0x00,0x00,0x88,0x75,0x00,0x00, +0x88,0x75,0x00,0x00,0xBA,0x75,0x00,0x00,0xBA,0x75,0x00,0x00,0xBA,0x75,0x00,0x00, +0xBA,0x75,0x00,0x00,0x39,0x75,0x00,0x00,0x1B,0x75,0x00,0x00,0x1B,0x76,0x00,0x00, +0x1B,0x76,0x00,0x00,0x4E,0x76,0x00,0x00,0x4E,0x76,0x00,0x00,0x83,0x76,0x00,0x00, +0x83,0x76,0x00,0x00,0x83,0x76,0x00,0x00,0x83,0x76,0x00,0x00,0xF4,0x75,0x00,0x00, +0xE2,0x75,0x00,0x00,0x72,0x77,0x00,0x00,0x72,0x77,0x00,0x00,0xC6,0x77,0x00,0x00, +0xC6,0x77,0x00,0x00,0xA8,0x78,0x00,0x00,0xA8,0x78,0x00,0x00,0xA8,0x78,0x00,0x00, +0xA8,0x78,0x00,0x00,0x20,0x78,0x00,0x00,0x66,0x78,0x00,0x00,0xE2,0x89,0x00,0x00, +0xE9,0x89,0x00,0x00,0xF0,0x89,0x00,0x00,0xF7,0x89,0x00,0x00,0xFE,0x89,0x00,0x00, +0x05,0x8A,0x00,0x00,0x0C,0x8A,0x00,0x00,0x13,0x8A,0x00,0x00,0x1A,0x8A,0x00,0x00, +0x21,0x8A,0x00,0x00,0x28,0x8A,0x00,0x00,0x2F,0x8A,0x00,0x00,0x44,0x8B,0x00,0x00, +0x44,0x8B,0x00,0x00,0x7F,0x8B,0x00,0x00,0x7F,0x8B,0x00,0x00,0x0E,0x8C,0x00,0x00, +0x0E,0x8C,0x00,0x00,0x0E,0x8C,0x00,0x00,0x0E,0x8C,0x00,0x00,0xBC,0x8B,0x00,0x00, +0xE1,0x8B,0x00,0x00,0x00,0x01,0x00,0x00,0x3F,0x8E,0x00,0x00,0x64,0x8E,0x00,0x00, +0xBC,0x8E,0x00,0x00,0xDD,0x8F,0x00,0x00,0x18,0x8F,0x00,0x00,0x48,0x8F,0x00,0x00, +0xDD,0x8F,0x00,0x00,0x50,0x8F,0x00,0x00,0x04,0x00,0x1D,0x00,0x2E,0x00,0x50,0x00, +0x82,0x00,0xC7,0x00,0x23,0x01,0x9B,0x01,0x32,0x02,0xEE,0x02,0xD0,0x03,0xDE,0x04, +0x19,0x06,0x82,0x07,0x1A,0x09,0xE0,0x0A,0xD0,0x0C,0xE7,0x0E,0x1F,0x11,0x71,0x13, +0xD3,0x15,0x3D,0x18,0xA2,0x1A,0xF9,0x1C,0x34,0x1F,0x47,0x21,0x28,0x23,0xCB,0x24, +0x27,0x26,0x33,0x27,0xEA,0x27,0x46,0x28,0x04,0x00,0x1C,0x00,0x2B,0x00,0x4B,0x00, +0x78,0x00,0xB7,0x00,0x0A,0x01,0x75,0x01,0xFC,0x01,0xA3,0x02,0x6D,0x03,0x5E,0x04, +0x76,0x05,0xB9,0x06,0x26,0x08,0xBE,0x09,0x7D,0x0B,0x61,0x0D,0x67,0x0F,0x87,0x11, +0xBB,0x13,0xFC,0x15,0x3F,0x18,0x7B,0x1A,0xA6,0x1C,0xB6,0x1E,0x9F,0x20,0x57,0x22, +0xD7,0x23,0x14,0x25,0x08,0x26,0xAF,0x26,0x03,0x27,0x05,0x00,0x08,0x21,0x05,0x00, +0x00,0x20,0x00,0x00,0x80,0xBD,0x00,0xC0,0x90,0xBD,0x00,0xC0,0xA2,0xBD,0x00,0xC0, +0xA6,0xBD,0x00,0xC0,0x18,0xBD,0x00,0xC0,0x60,0xBD,0x00,0xC0,0xC0,0xBD,0x00,0xC0, +0xDE,0xBD,0x00,0xC0,0xE2,0xBD,0x00,0xC0,0x08,0xBE,0x00,0xC0,0x96,0xBE,0x00,0xC0, +0xD8,0xBE,0x00,0xC0,0x3A,0xBC,0x00,0xC0,0x3E,0xBC,0x00,0xC0,0x14,0xBD,0x00,0xC0, +0x5C,0xBD,0x00,0xC0,0x05,0x00,0x2A,0x00,0x2A,0x00,0x3E,0x00,0x58,0x00,0x79,0x00, +0xA1,0x00,0xD3,0x00,0x0F,0x01,0x56,0x01,0xAA,0x01,0x0C,0x02,0x7D,0x02,0xFE,0x02, +0x91,0x03,0x37,0x04,0xF0,0x04,0xBE,0x05,0xA0,0x06,0x99,0x07,0xA7,0x08,0xCC,0x09, +0x06,0x0B,0x56,0x0C,0xBB,0x0D,0x34,0x0F,0xC0,0x10,0x5D,0x12,0x0A,0x14,0xC5,0x15, +0x8A,0x17,0x59,0x19,0x2D,0x1B,0x05,0x1D,0xDC,0x1E,0xB0,0x20,0x7D,0x22,0x40,0x24, +0xF5,0x25,0x98,0x27,0x27,0x29,0x9E,0x2A,0xF9,0x2B,0x37,0x2D,0x53,0x2E,0x4B,0x2F, +0x1E,0x30,0xC9,0x30,0x4A,0x31,0xA1,0x31,0xCD,0x31,0x04,0x00,0x2D,0x00,0x6D,0x00, +0xE7,0x00,0xAD,0x01,0xD8,0x02,0x81,0x04,0xBE,0x06,0xA0,0x09,0x30,0x0D,0x6D,0x11, +0x47,0x16,0xA3,0x1B,0x56,0x21,0x29,0x27,0xDC,0x2C,0x2A,0x32,0xCF,0x36,0x8B,0x3A, +0x29,0x3D,0x81,0x3E,0x06,0x00,0xF5,0x28,0x03,0x00,0x33,0x33,0x64,0xBD,0x00,0xC0, +0x7A,0xBD,0x00,0xC0,0x0C,0xBE,0x00,0xC0,0x9A,0xBE,0x00,0xC0,0x84,0xBD,0x00,0xC0, +0x94,0xBD,0x00,0xC0,0x68,0xBD,0x00,0xC0,0xAA,0xBD,0x00,0xC0,0xC4,0xBD,0x00,0xC0, +0xE6,0xBD,0x00,0xC0,0xEA,0xBC,0x00,0xC0,0xA4,0xBE,0x00,0xC0,0xB8,0xBB,0x00,0xC0, +0xF8,0xBB,0x00,0xC0,0x84,0xBC,0x00,0xC0,0x14,0xBE,0x00,0xC0,0x06,0x00,0x00,0x20, +0x03,0x00,0xAA,0x2A,0x00,0x00,0x00,0x20,0x02,0x00,0x45,0x00,0x5D,0x01,0x1B,0x04, +0x31,0x09,0xA2,0x10,0x55,0x19,0x32,0x21,0xE5,0x25,0x01,0x00,0x10,0x10,0xEF,0x2F, +0x00,0x00,0x00,0x20,0x02,0x00,0x49,0x01,0x6C,0x07,0xB1,0x15,0x60,0x29,0x38,0x38, +0x01,0x00,0x00,0x20,0x02,0x00,0xAC,0x00,0xCB,0x03,0x95,0x0B,0x6B,0x18,0xE0,0x26, +0xA6,0x30,0x02,0x00,0xAA,0x2A,0x02,0x00,0x00,0x20,0x03,0x00,0x4D,0x00,0x51,0x01, +0xBD,0x03,0x48,0x08,0x6B,0x0F,0x0D,0x19,0x47,0x24,0x73,0x2F,0x86,0x38,0x9F,0x3D, +0x03,0x00,0x00,0x20,0x03,0x00,0x33,0x00,0xC4,0x00,0x08,0x02,0x5B,0x04,0x11,0x08, +0x55,0x0D,0x0D,0x14,0xCC,0x1B,0xCF,0x23,0x1E,0x2B,0xB5,0x30,0xBD,0x33,0x04,0x00, +0x33,0x33,0x04,0x00,0xAA,0x2A,0x03,0x00,0x1F,0x00,0x5B,0x00,0xD6,0x00,0xAB,0x01, +0xF6,0x02,0xD5,0x04,0x59,0x07,0x87,0x0A,0x52,0x0E,0x96,0x12,0x1C,0x17,0x9B,0x1B, +0xC0,0x1F,0x37,0x23,0xB6,0x25,0x05,0x27,0x04,0x00,0x00,0x20,0x01,0x00,0x65,0x04, +0x5D,0x14,0x3D,0x27,0x05,0x00,0x26,0x00,0x1D,0x00,0x28,0x00,0x36,0x00,0x47,0x00, +0x5A,0x00,0x72,0x00,0x8D,0x00,0xAE,0x00,0xD3,0x00,0xFD,0x00,0x2D,0x01,0x64,0x01, +0xA2,0x01,0xE6,0x01,0x33,0x02,0x87,0x02,0xE5,0x02,0x4B,0x03,0xBA,0x03,0x33,0x04, +0xB6,0x04,0x43,0x05,0xDB,0x05,0x7C,0x06,0x29,0x07,0xDF,0x07,0xA1,0x08,0x6C,0x09, +0x41,0x0A,0x21,0x0B,0x09,0x0C,0xFA,0x0C,0xF4,0x0D,0xF5,0x0E,0xFE,0x0F,0x0C,0x11, +0x20,0x12,0x38,0x13,0x53,0x14,0x71,0x15,0x90,0x16,0xAF,0x17,0xCD,0x18,0xE8,0x19, +0x00,0x1B,0x12,0x1C,0x1E,0x1D,0x23,0x1E,0x1F,0x1F,0x10,0x20,0xF7,0x20,0xD0,0x21, +0x9C,0x22,0x59,0x23,0x07,0x24,0xA3,0x24,0x2E,0x25,0xA7,0x25,0x0C,0x26,0x5E,0x26, +0x9C,0x26,0xC6,0x26,0xDA,0x26,0x05,0x00,0x33,0x33,0x01,0x00,0x7E,0x01,0x41,0x08, +0x4A,0x15,0xF4,0x20,0x04,0x00,0x23,0x00,0x45,0x00,0x84,0x00,0xE4,0x00,0x6F,0x01, +0x2F,0x02,0x2F,0x03,0x76,0x04,0x0F,0x06,0xFD,0x07,0x45,0x0A,0xE6,0x0C,0xDA,0x0F, +0x19,0x13,0x93,0x16,0x37,0x1A,0xEF,0x1D,0xA0,0x21,0x2F,0x25,0x80,0x28,0x77,0x2B, +0xFA,0x2D,0xF2,0x2F,0x4D,0x31,0xFD,0x31,0x05,0x00,0xF5,0x28,0x72,0xA2,0x00,0x00, +0x8E,0xA2,0x00,0x00,0xAD,0xA2,0x00,0x00,0xCC,0xA2,0x00,0x00,0xDB,0xA2,0x00,0x00, +0x44,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x0F,0x70,0x8A,0xF7, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,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,0x00,0x03,0x00, +0x00,0x00,0x56,0x30,0x31,0x2E,0x30,0x30,0x37,0x2E,0x30,0x34,0x46,0xC9,0xF5,0x89 +}; diff --git a/drivers/input/touchscreen/msg2233/msg22xx_xxxx_update_bin.h b/drivers/input/touchscreen/msg2233/msg22xx_xxxx_update_bin.h new file mode 100755 index 00000000..c61f10a7 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/msg22xx_xxxx_update_bin.h @@ -0,0 +1,3106 @@ +u8 msg22xx_xxxx_update_bin[49664]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xD3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xC5,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x1C,0x40,0x00,0x1C, +0x60,0x00,0x1C,0x80,0x00,0x1C,0xA0,0x00,0x1C,0xC0,0x00,0x1C,0xE0,0x00,0x1D,0x00, +0x00,0x1D,0x20,0x00,0x1D,0x40,0x00,0x1D,0x60,0x00,0x1D,0x80,0x00,0x1D,0xA0,0x00, +0x1D,0xC0,0x00,0x1D,0xE0,0x00,0x1E,0x00,0x00,0x1E,0x20,0x00,0x1E,0x40,0x00,0x1E, +0x60,0x00,0x1E,0x80,0x00,0x1E,0xA0,0x00,0x1E,0xC0,0x00,0x1E,0xE0,0x00,0x1F,0x00, +0x00,0x1F,0x20,0x00,0x1F,0x40,0x00,0x1F,0x60,0x00,0x1F,0x80,0x00,0x1F,0xA0,0x00, +0x1F,0xC0,0x00,0x1F,0xE0,0x00,0xC0,0x60,0x00,0x01,0xC8,0x63,0x9D,0xFC,0x84,0x69, +0x80,0x01,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00, +0xFC,0x21,0xFF,0x60,0xEF,0xE1,0x00,0x80,0xFF,0xE1,0x00,0xA0,0x0F,0xE1,0x08,0xC3, +0xE0,0x02,0x0F,0x0F,0xE1,0x00,0xC3,0xE0,0x04,0x0F,0x0F,0xE1,0x04,0xC3,0xE0,0x03, +0x0F,0xEF,0xE1,0x00,0x84,0xC3,0xE0,0x05,0x0F,0xEF,0xE1,0x00,0x88,0xC3,0xE0,0x05, +0x1F,0xEF,0xE1,0x00,0x8C,0xE4,0x01,0x37,0x31,0x90,0x00,0x90,0x00,0x90,0x00,0x90, +0x00,0x90,0x00,0x90,0x00,0x90,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x30,0x44,0x0B, +0x17,0x01,0x98,0x60,0x56,0xF8,0x01,0x4F,0x18,0x79,0x22,0xE0,0x14,0x98,0x62,0x23, +0x00,0x18,0x58,0x77,0x01,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0C,0x81,0x04,0x0D, +0x21,0x0C,0x5D,0x43,0x00,0xE7,0xFF,0xFF,0xA4,0x0C,0x81,0x06,0x5C,0x63,0x00,0x20, +0x60,0x66,0x9B,0x00,0x21,0x40,0x30,0x21,0x44,0x24,0x5D,0x40,0x41,0x4B,0x01,0x01, +0xD0,0x81,0x04,0x66,0xE4,0x00,0x01,0x17,0xE7,0xFF,0xFF,0x5E,0x5C,0x63,0x00,0x20, +0x64,0x4E,0xD1,0x40,0x05,0xD2,0xD1,0x41,0x05,0xB2,0xD1,0x42,0x05,0x96,0xE4,0x00, +0x00,0xE3,0xE7,0xFF,0xFF,0x2A,0x5C,0x63,0x00,0xD0,0x62,0x05,0x1E,0x9B,0x01,0x21, +0x40,0x24,0x5D,0x40,0x21,0x4B,0x01,0x01,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00, +0xCB,0x57,0x23,0x78,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01, +0xCB,0x57,0x23,0x6C,0x0B,0x7A,0x01,0xC7,0x7B,0x8F,0xFF,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xD4,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xE0,0x0B,0x7A,0x01,0xC7,0x7B,0x7F,0xFF,0x0F,0x7A,0x01,0xCA,0xF7,0x3C,0xEC, +0x0B,0x57,0x01,0x47,0x39,0xD5,0x5F,0x39,0x04,0x0F,0x37,0x01,0x23,0x01,0x00,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x3D,0xE8,0x0B,0x38,0x01,0xFF,0x20,0x11,0x11,0x0F,0x38, +0x01,0xCB,0x17,0x3D,0xEC,0x0B,0x38,0x01,0xFF,0x20,0x22,0x22,0x0F,0x38,0x01,0xCB, +0x17,0x3D,0xF0,0x0B,0x38,0x01,0xFF,0x20,0x33,0x33,0x0F,0x38,0x01,0xCA,0xF7,0x78, +0xC0,0xFF,0x00,0xAA,0x55,0x0F,0x17,0x01,0xE4,0x00,0x00,0x01,0x0D,0x41,0x0A,0x0D, +0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x03,0xF0,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x03,0xE8,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x03,0xEC,0xC2, +0xE0,0x10,0x01,0xEC,0xD7,0x04,0x04,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x03,0xFC,0xC2, +0xE0,0x10,0x01,0x0F,0x01,0x02,0xED,0x17,0x04,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x04,0x10,0xC2,0xE0,0x10,0x01,0x0F,0x01,0x06,0xEF,0x17,0x03,0xD4,0xC2,0xE0,0x10, +0x01,0x0F,0x01,0x0A,0xEF,0x17,0x03,0xF4,0x85,0x29,0x5C,0x84,0x00,0xC2,0xE0,0x10, +0x01,0x4C,0x84,0x10,0xFE,0xF7,0x04,0x08,0x8E,0xE4,0x0C,0x77,0x00,0x85,0x29,0x5C, +0x63,0x00,0x9B,0x00,0x24,0x68,0x25,0x1F,0x03,0xFE,0x5F,0x18,0x00,0xC2,0xE0,0x10, +0x01,0xF3,0x57,0x0B,0x7A,0x1E,0xE3,0x01,0x1F,0x9A,0xFF,0x5F,0x3C,0x00,0xD7,0x97, +0x00,0x50,0x1F,0x23,0x02,0x5F,0x39,0x00,0xC2,0xEF,0xFF,0xE1,0xCA,0xF7,0xFF,0xFF, +0xE4,0x00,0x00,0x2F,0x4F,0x78,0x10,0x9F,0x01,0x8F,0x64,0x5F,0x18,0x00,0x0F,0x7B, +0x02,0x5E,0xFB,0x15,0x4A,0xF7,0xD8,0xD7,0x19,0xFF,0x69,0x4F,0x03,0x10,0xC3,0x20, +0x10,0x01,0x8F,0x04,0xEF,0x39,0x03,0xF6,0x0F,0x18,0x02,0xD7,0x38,0x01,0x41,0xC3, +0x20,0x10,0x01,0xEF,0x79,0x03,0xF2,0xC3,0x20,0x10,0x01,0xEF,0xB9,0x03,0xEA,0xC3, +0x20,0x10,0x01,0xEF,0xD9,0x03,0xEE,0xC3,0x20,0x10,0x01,0xEF,0x39,0x04,0x06,0xE4, +0x00,0x00,0x49,0xC3,0x20,0x10,0x01,0xEF,0x79,0x03,0xFE,0xC3,0x20,0x10,0x01,0xEF, +0xB9,0x04,0x02,0xC3,0x20,0x10,0x01,0xEF,0xD9,0x04,0x12,0xC3,0x20,0x10,0x01,0xEF, +0x39,0x03,0xD6,0x20,0x60,0xDE,0x0F,0x44,0x02,0x0F,0x84,0x06,0xCF,0x5A,0x00,0x32, +0x40,0xE7,0xE3,0xD7,0x47,0x05,0xDC,0x42,0xF7,0x2D,0x40,0xA5,0xCB,0x43,0x77,0xDB, +0x43,0x3B,0x2C,0xCC,0xC6,0x00,0x0A,0x9B,0x4A,0x8C,0xD9,0x98,0x61,0x40,0xC6,0xD0, +0xD7,0x06,0x04,0xF4,0x98,0x60,0xE4,0x00,0x01,0x31,0x20,0x64,0x6A,0x0F,0x44,0x02, +0x0F,0x64,0x06,0xCF,0x5A,0x00,0x32,0x40,0xE7,0xDB,0x98,0x60,0xD7,0x47,0x04,0x14, +0xE4,0x00,0x00,0x55,0x1C,0xFA,0xFE,0xD4,0x67,0x01,0x9E,0x4C,0x63,0x10,0x9F,0x5F, +0x4F,0x5A,0x10,0x8F,0x44,0x8C,0x83,0x0F,0x5A,0x02,0x0F,0x64,0x02,0xCF,0x5A,0x00, +0x32,0x41,0x08,0xDB,0x98,0x60,0xD7,0x48,0x02,0xC4,0x42,0xF7,0x2D,0x40,0xA5,0xCB, +0x43,0xB7,0xEB,0x43,0x3D,0x2C,0xE7,0xFF,0xFF,0x3B,0xD4,0x7C,0x01,0x3E,0x9F,0x5F, +0x4C,0xE7,0x10,0x4F,0x5A,0x10,0x98,0x60,0x8F,0x44,0x8C,0x87,0x0F,0x5A,0x02,0x0F, +0x84,0x02,0xCF,0x5A,0x00,0x32,0x41,0x08,0xE3,0xD7,0x48,0x01,0x2C,0xE7,0xFF,0xFE, +0xD5,0x42,0xF7,0x2D,0xCC,0xC6,0x00,0x0A,0x43,0xD7,0xF3,0x40,0xA5,0xCB,0x9B,0x4A, +0x43,0x3E,0x2C,0x8C,0xD9,0x40,0xC6,0xD0,0xD7,0x06,0xFB,0x60,0x98,0x61,0x85,0x29, +0xC2,0xE0,0x10,0x01,0x9B,0x21,0xEA,0xF7,0x01,0x51,0x9E,0xFF,0x5E,0xF7,0x04,0x26, +0xE4,0x43,0xC3,0x18,0x00,0x21,0xFF,0x18,0xB6,0xF8,0x8E,0xF8,0x13,0x37,0x00,0xC3, +0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x0B,0x76,0xFE,0xF7,0x09,0x68,0xD0, +0x60,0x05,0x16,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43,0xDE, +0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B,0x40, +0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7,0x08, +0xBD,0x01,0x40,0xB9,0x2B,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08,0x5F, +0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x01,0x43,0xB9,0xEB,0x0F,0xBC,0x01,0xE4,0x00,0x00, +0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF,0xAC, +0x0B,0x37,0x02,0x0B,0x57,0x00,0x8F,0x59,0xC3,0x20,0x10,0x01,0xFF,0x39,0x0A,0x18, +0x0F,0x59,0x00,0x13,0x58,0x04,0x1F,0xBA,0xFF,0x4F,0xBD,0x10,0x43,0xDD,0xCC,0x8F, +0xB7,0x4F,0x9A,0x08,0x09,0x1D,0x00,0x1F,0x7C,0xFF,0x4F,0xBB,0x08,0x8F,0xB7,0x0B, +0xBD,0x00,0x8F,0xA8,0x0F,0xBE,0x00,0x13,0x18,0x01,0x27,0x05,0xAF,0xE4,0x00,0x01, +0x45,0x20,0x66,0xFE,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43, +0xDE,0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B, +0x40,0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7, +0x08,0xBD,0x00,0x40,0xA5,0xC8,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08, +0x5F,0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x00,0x43,0xBD,0xC8,0x0F,0xBC,0x01,0xE4,0x00, +0x00,0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF, +0xAC,0xE7,0xFF,0xFE,0xBF,0x4F,0x1A,0x10,0x9F,0x81,0x43,0x58,0xCC,0x43,0xB8,0xBC, +0x4F,0x9C,0x08,0x0B,0xBD,0x00,0x8F,0x97,0x0B,0x9C,0x00,0x8F,0x9D,0x0F,0x9A,0x00, +0x4F,0x7B,0x10,0x1F,0x58,0xFE,0x8F,0x3B,0x4F,0x5A,0x08,0x9F,0x1F,0x8F,0x57,0x4F, +0x18,0x08,0x0B,0x5A,0x00,0x8E,0xF8,0x0A,0xF7,0x00,0x8E,0xFA,0x0E,0xF9,0x00,0x85, +0x29,0x5C,0xE7,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x0B,0x7A,0x42,0xE7,0xBB,0x5E, +0xF7,0x00,0x9B,0x00,0x8C,0xB7,0x8C,0xD7,0xC3,0x80,0x10,0x01,0xC3,0x40,0x10,0x01, +0x5C,0xC6,0x00,0x5C,0xA5,0x00,0x8B,0x38,0x9A,0xE0,0xFF,0x9C,0x0A,0x18,0xFF,0x5A, +0x09,0x68,0xE4,0x00,0x00,0x49,0x4F,0x65,0x10,0x43,0xBB,0xE4,0x0F,0xBD,0x02,0x9C, +0xA1,0x8E,0xFD,0x5C,0xA5,0x00,0x8B,0xBB,0x8F,0x7A,0x8F,0xBA,0x0B,0x7B,0x00,0x0B, +0xBD,0x02,0x8F,0x1B,0x8F,0x3D,0xD4,0xA6,0xFF,0x01,0x26,0xE0,0xE8,0x27,0x20,0xDC, +0x27,0x00,0xD0,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x04,0x08,0x4C,0xE7,0x10,0xCF,0x18, +0xFF,0xF6,0x8C,0xFA,0x0F,0x47,0x02,0x43,0x3A,0xCB,0x9F,0x56,0x8F,0x19,0x43,0x58, +0xD0,0xCF,0x5A,0x07,0xFF,0x43,0x5A,0xB8,0x0F,0x43,0x01,0x0E,0xE4,0x00,0x98,0x61, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x85,0x29,0x9A,0xE3,0x9B,0x01,0xE4,0x00,0x00,0x11, +0x8F,0x17,0x9E,0xE2,0xD7,0x03,0xFF,0xE1,0x4C,0x77,0x09,0x9C,0x7F,0x85,0x29,0xFF, +0x00,0x7F,0xFF,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x03,0xD8,0x0F,0x17,0x01,0x0F,0x17, +0x03,0x0F,0x17,0x05,0x0F,0x17,0x07,0x0F,0x17,0x09,0x0F,0x17,0x0B,0x85,0x29,0xC3, +0x00,0x10,0x01,0xFE,0xF8,0x03,0xD8,0xC3,0x00,0x10,0x01,0x0B,0x37,0x08,0xFF,0x18, +0x0B,0xEC,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x05,0x0F,0x37,0x09,0x0B, +0x37,0x07,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x09,0x0B,0x38,0x19,0x0F, +0x37,0x0B,0x0B,0x37,0x04,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x01,0x0F, +0x37,0x05,0x0B,0x37,0x03,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x05,0x0B, +0x38,0x19,0x0F,0x37,0x07,0x0B,0x38,0x17,0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17, +0x03,0x85,0x29,0x1C,0x21,0xD8,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x24,0x0D,0x41,0x20, +0x0D,0x61,0x1C,0xFD,0x57,0x03,0xD8,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x0D,0xC1,0x10, +0x09,0xAA,0x07,0x0B,0x0A,0x03,0x43,0x18,0x6D,0x5F,0x18,0x06,0x0F,0x01,0x0B,0x43, +0x18,0xC3,0xE9,0x97,0x03,0xD9,0x09,0xCA,0x05,0x41,0x8C,0x75,0x5D,0x8C,0x06,0x40, +0x6C,0x63,0x8C,0x78,0xE7,0xFF,0xFE,0x48,0x0A,0xEA,0x09,0x41,0xCE,0xBD,0x0A,0xEA, +0x0B,0x42,0xED,0xBD,0x5E,0xF7,0x06,0x0E,0xE1,0x0F,0x42,0xF7,0xBB,0x5D,0x63,0x06, +0x5D,0x4E,0x06,0x40,0x6A,0x53,0x8C,0x77,0xE7,0xFF,0xFE,0x00,0x5E,0xE3,0x06,0x98, +0x61,0x21,0x60,0xAC,0x22,0xE0,0xA0,0x43,0x0B,0xB8,0xD3,0x05,0x01,0x14,0x41,0x4C, +0x53,0x0B,0x01,0x0E,0x09,0x81,0x0A,0x41,0x6B,0xBB,0x43,0x0C,0xC3,0x8D,0x58,0xCD, +0x4A,0x00,0x64,0x42,0xEA,0x58,0x5E,0xE8,0xB1,0x48,0x61,0x01,0x0D,0xC1,0x12,0x0D, +0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21, +0x28,0x85,0x29,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0x0D,0x61,0x0C, +0x0D,0x81,0x08,0x0D,0xC1,0x00,0xF1,0x97,0x08,0xCE,0xC1,0x40,0x10,0x01,0x1D,0x6C, +0xFF,0x0D,0x21,0x14,0x0D,0xA1,0x04,0x5D,0xC3,0x00,0x5D,0x6B,0x00,0xFD,0x4A,0x0B, +0xEC,0x4E,0xEE,0x5D,0x56,0xF7,0x01,0x22,0xE0,0xD4,0x8A,0xEB,0xE4,0x00,0x00,0x43, +0xCC,0x77,0x00,0x30,0x1D,0xB7,0x01,0x8C,0x6A,0xCC,0x8D,0x00,0x30,0x9C,0x64,0x8C, +0x8A,0x50,0xA0,0x30,0x9C,0x84,0xE4,0x00,0x50,0x46,0x5E,0xED,0x00,0xD5,0x97,0xFF, +0x1D,0x12,0xEA,0x00,0x22,0xE0,0x20,0x9E,0xFF,0x1A,0xEA,0x00,0x21,0x60,0x30,0x9D, +0x7F,0x5D,0x6B,0x00,0xE7,0xFF,0xFF,0x7B,0x12,0xEA,0x00,0x22,0xE0,0x52,0xC2,0xE0, +0x10,0x01,0x9B,0x37,0xEB,0x17,0x08,0xE3,0x47,0x18,0xCC,0xEF,0x17,0x08,0xE3,0x0D, +0xC1,0x02,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21, +0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xEB,0x37, +0x01,0x50,0xFF,0x18,0x04,0x1C,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x76,0x23,0x24, +0xA6,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F,0x4F,0x57,0x08,0x1F, +0x77,0xFF,0x8F,0x58,0x4F,0x7B,0x10,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6, +0xF9,0xFF,0x68,0xE4,0x00,0x00,0x9D,0x23,0x28,0x38,0x13,0x37,0x04,0x9A,0xE0,0x9F, +0x21,0xE4,0x00,0x00,0x79,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F, +0x4F,0x57,0x08,0xCF,0x77,0x00,0x06,0x8F,0x58,0x9F,0x79,0x9E,0xE1,0x0F,0x7A,0x01, +0x5E,0xF7,0x00,0xD6,0xF9,0xFF,0x68,0xE4,0x00,0x00,0x35,0x4F,0x57,0x08,0x4F,0x77, +0x08,0x8F,0x58,0x9F,0x7F,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6,0xF9,0xFF, +0x70,0x85,0x29,0x9C,0x30,0x5C,0xC6,0x00,0x0D,0x61,0x08,0x0D,0x81,0x04,0x0D,0xA1, +0x00,0x0D,0x41,0x0C,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x76,0x13,0xD8,0x04,0x40, +0xC6,0xF3,0x5E,0xE6,0x00,0x5F,0xA3,0x06,0x8C,0x97,0x8C,0xB7,0x5F,0x7D,0x04,0x0A, +0xF8,0x0B,0x11,0x58,0x0C,0x40,0xFB,0xBC,0x41,0x9B,0xBD,0xC1,0xA0,0x10,0x01,0xC3, +0x00,0x10,0x01,0x5C,0xA5,0x00,0x4D,0x77,0x08,0x5C,0xE7,0x04,0x5D,0x8C,0x04,0x5C, +0x84,0x00,0xFD,0xAD,0x04,0x1C,0xFF,0x18,0x09,0x68,0x53,0x20,0x64,0xE4,0x00,0x01, +0x21,0x43,0x44,0x35,0x9F,0x41,0x4F,0x5A,0x08,0x8F,0x4D,0x09,0x1A,0x00,0x41,0x08, +0xBB,0x41,0x08,0x50,0x5F,0x88,0x04,0x43,0x5C,0xDD,0x5F,0x5A,0x06,0x4C,0x7A,0xFA, +0x47,0x43,0xD6,0x43,0x5A,0x1D,0xD6,0xFA,0x03,0x14,0xD5,0x7A,0x02,0x70,0x5D,0x08, +0x06,0xD5,0x1D,0x00,0x58,0x43,0x9C,0x3D,0xE4,0x00,0x00,0x0F,0x43,0x8C,0xE5,0x5F, +0x9C,0x06,0x4F,0x44,0x10,0x43,0x97,0xE5,0x8F,0x58,0xCF,0x9C,0x00,0x64,0x09,0x1A, +0x00,0x43,0x9C,0xB8,0xC7,0x9C,0xFF,0xFF,0x41,0x1C,0x43,0x41,0x08,0xC8,0x0D,0x1A, +0x01,0x4F,0x44,0x10,0x9F,0x42,0x8F,0x58,0x09,0x1A,0x00,0x43,0x9C,0x43,0x43,0x9C, +0xC8,0x0F,0x9A,0x01,0xE4,0x00,0x00,0x29,0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x01, +0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x03,0x9C,0x81,0x5C,0x84,0x00,0xD4,0x85,0xFB, +0xA0,0xC2,0xE0,0x10,0x01,0x0D,0xA1,0x02,0xF0,0x77,0x0B,0x77,0x0D,0x81,0x06,0x0D, +0x61,0x0A,0x0D,0x41,0x0E,0x40,0x7E,0x1B,0x1C,0x21,0x10,0xE4,0x00,0xA4,0xF9,0x5C, +0x63,0x00,0x5C,0x84,0x00,0xC2,0xE0,0x10,0x01,0x43,0x64,0x1D,0xF2,0xF7,0x0B,0x7A, +0x9F,0x61,0x40,0xA5,0xBB,0x5F,0x7B,0x00,0x5C,0xA5,0x00,0x20,0xE4,0x3E,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x0D,0x2C,0xE4,0x00,0x00,0x19,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x09,0x68,0x43,0x23,0x2C,0x9B,0x00,0x4F,0x39,0x10,0x9F,0x22,0x8F,0x37,0xC2,0xEF, +0xFF,0xE1,0xCA,0xF7,0xFF,0xFF,0xE4,0x00,0x00,0x3D,0x0B,0x99,0xFE,0x0B,0x59,0x00, +0x9F,0x24,0x8F,0x5C,0x4F,0x98,0x10,0x5E,0xFA,0x15,0x8F,0x86,0x4A,0xF7,0xD0,0x0F, +0x5C,0x00,0x9F,0x01,0x5F,0x58,0x00,0xD7,0x7A,0xFF,0x1D,0x9B,0x00,0xE4,0x00,0x00, +0x29,0x0F,0x26,0x02,0x9F,0x01,0x43,0x39,0xBD,0x5F,0x18,0x00,0x0F,0x26,0x00,0x9C, +0xC4,0xD7,0x78,0xFF,0x85,0x85,0x29,0x1C,0x21,0x88,0x0D,0x41,0x70,0x0D,0x61,0x6C, +0x5D,0x44,0x00,0x0D,0x81,0x68,0x5C,0x85,0x00,0x0D,0xA1,0x64,0x88,0xA6,0x41,0xA4, +0x55,0x0D,0x21,0x74,0x89,0x83,0x88,0xC1,0x88,0x6A,0xE7,0xFF,0xFE,0xAA,0xC2,0xE0, +0x10,0x01,0x9D,0xA1,0xEB,0x57,0x01,0x50,0x9B,0x20,0x5D,0xAD,0x00,0x8B,0x19,0x9A, +0xE0,0x89,0x61,0xE4,0x00,0x00,0x5B,0x4F,0x79,0x10,0x43,0x99,0x54,0x8F,0x6B,0x0F, +0x7B,0x02,0x8E,0xFB,0x23,0x44,0x54,0x23,0x48,0x36,0xCF,0x9C,0x00,0x06,0x9F,0x9F, +0xE4,0x00,0x00,0x13,0x4F,0x9C,0x08,0x9F,0x81,0x43,0x7C,0xDB,0x9F,0x21,0x8F,0x1B, +0x5F,0x79,0x00,0xD5,0xBB,0xFE,0xA5,0x26,0xE1,0x34,0xC3,0x20,0x10,0x01,0xEB,0x39, +0x0B,0x81,0x43,0x18,0xCB,0x23,0x44,0x32,0x4F,0x37,0x0A,0x8F,0x19,0xE4,0x00,0x00, +0x35,0x23,0x48,0x46,0xCF,0x37,0x00,0x03,0xCE,0xF7,0x00,0x06,0x8F,0x19,0xE4,0x00, +0x00,0x13,0x8F,0x17,0x4E,0xF7,0x08,0x42,0xF8,0xB8,0xC2,0xE0,0xFF,0xE8,0xCB,0x00, +0x07,0xFF,0x98,0x61,0x4A,0xF7,0xC0,0x5E,0xFF,0xF9,0x4A,0xF7,0x00,0x0E,0xEC,0x01, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1,0x66,0x0D,0x81,0x6A,0x0D,0x61,0x6E,0x0D, +0x41,0x72,0x0D,0x21,0x76,0x1C,0x21,0x78,0x85,0x29,0xFC,0x21,0xFF,0x78,0xED,0x41, +0x00,0x80,0x0D,0x81,0x78,0x0D,0xA1,0x74,0x0D,0xC1,0x70,0x0D,0xE1,0x6C,0x0E,0x01, +0x68,0x0E,0xC1,0x64,0xED,0x21,0x00,0x84,0x0D,0x61,0x7C,0xC1,0x40,0x10,0x01,0xFD, +0x4A,0x0B,0x76,0x11,0x6A,0x04,0x4E,0xEB,0x08,0x9E,0xE8,0xC6,0xF7,0x03,0xF8,0xFE, +0xC1,0x00,0x88,0x5D,0xC4,0x00,0x5D,0xA5,0x00,0x8A,0x03,0x5C,0xA6,0x00,0x89,0xE1, +0x41,0x65,0x5B,0x40,0x21,0xBD,0x88,0x6E,0x88,0x8D,0xFC,0xD6,0xFF,0x78,0xE7,0xFF, +0xFC,0xA2,0xC3,0x40,0x10,0x01,0x89,0x81,0x5D,0x6B,0x00,0x13,0x2A,0x04,0x9A,0xE0, +0xFF,0x5A,0x04,0x1C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08,0x9E,0xE1,0x43,0x6C,0xC4, +0x8F,0x1A,0x0B,0x18,0x03,0x0F,0x1B,0x01,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x6D,0x43, +0x4B,0x74,0x8D,0xAB,0x5F,0x5A,0x00,0x5D,0xAD,0x00,0x9A,0xE0,0x1F,0x2D,0x01,0x43, +0x39,0xD5,0x5F,0x39,0x00,0xE4,0x00,0x00,0x33,0x4F,0x77,0x10,0xFF,0x96,0xFF,0x78, +0x8F,0x7C,0x0F,0x7B,0x02,0x27,0x60,0x4A,0xD5,0xB8,0x03,0x19,0x9E,0xE1,0x5F,0x17, +0x00,0xD7,0x38,0xFF,0x45,0x8B,0x1A,0x1F,0x36,0xD8,0x1F,0x76,0xD8,0x4E,0xF8,0x10, +0x8E,0xF9,0x0F,0x37,0xA2,0x1E,0xF8,0x01,0x43,0x39,0xCB,0x4E,0xF7,0x10,0x8E,0xFB, +0x0E,0xF7,0xA2,0x42,0xF7,0xBB,0x5F,0x37,0x15,0x4B,0x77,0xC8,0x27,0x60,0xBC,0x8F, +0x1A,0x0B,0x6A,0x0B,0x41,0x78,0x5D,0x13,0x4A,0x0C,0x4D,0x6B,0x08,0x98,0x61,0x8D, +0x8B,0x0B,0x0C,0x00,0x43,0x18,0xDB,0x43,0x77,0xDB,0x43,0x18,0xD0,0x8E,0xF9,0x42, +0xFB,0xB8,0x8E,0xF8,0x0E,0xF0,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x88,0x2F,0x0E, +0xC1,0x66,0x0E,0x01,0x6A,0x0D,0xE1,0x6E,0x0D,0xC1,0x72,0x0D,0xA1,0x76,0x0D,0x81, +0x7A,0x0D,0x61,0x7E,0xED,0x41,0x00,0x82,0xED,0x21,0x00,0x86,0xFC,0x21,0x00,0x88, +0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40,0xC1,0x40,0x10,0x01,0x0D,0x61,0x3C,0x0D, +0x81,0x38,0x0D,0xC1,0x30,0x0E,0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0E,0xA1, +0x14,0x0E,0xC1,0x10,0x0D,0x21,0x44,0x0D,0xA1,0x34,0x0D,0xE1,0x2C,0x0E,0x01,0x28, +0x0E,0x21,0x24,0x5E,0x63,0x00,0x5E,0x44,0x00,0xC1,0xC0,0x10,0x01,0xF0,0x8A,0x0B, +0x76,0xFD,0xCE,0x0C,0xB8,0x98,0xA0,0x88,0x6E,0x99,0x80,0x8A,0xCA,0xE4,0x00,0x9F, +0xA0,0xC1,0x40,0x10,0x01,0x89,0x6C,0xC2,0xA0,0x10,0x01,0x9A,0x81,0xFD,0x4A,0x0B, +0xEC,0xE4,0x00,0x01,0x19,0xCC,0x6B,0x00,0x30,0xEA,0xF5,0x08,0x9F,0x41,0xA3,0x54, +0x56,0xF7,0x02,0x12,0x2D,0x04,0x12,0x0D,0x05,0x11,0xED,0x07,0x22,0xE1,0x0C,0x1C, +0x61,0x04,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0xDA,0x20,0x61, +0x14,0x1C,0x61,0x06,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFC,0x5C, +0x20,0x60,0xCC,0x0B,0x01,0x04,0xCF,0x18,0x00,0x07,0x0A,0xE1,0x06,0xCE,0xF7,0x00, +0x03,0x8E,0xF8,0x9B,0x0A,0x42,0xF7,0xC0,0x0E,0xED,0x17,0xE4,0x00,0x00,0x43,0x8C, +0x6A,0x88,0x91,0x1C,0x63,0x16,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0x56, +0x20,0x60,0x32,0x4E,0xF4,0x5C,0x45,0x8C,0xBD,0x5D,0x8C,0x00,0x88,0x6E,0xF0,0x96, +0x0B,0x76,0x98,0xA1,0x9D,0x61,0xE4,0x00,0x9E,0x6E,0x5D,0x6B,0x00,0x12,0xEA,0x00, +0xD6,0xEB,0xFB,0xAD,0x88,0x6C,0xE7,0xFF,0xF4,0x7A,0x12,0xEA,0x00,0x22,0xE0,0x6C, +0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x8B,0x56,0xF7,0x40,0x22,0xE0,0x34,0xC2,0xE0, +0x10,0x01,0xEE,0xF7,0x03,0xE6,0x86,0xE8,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xF0,0x97, +0x0B,0x76,0x98,0xA1,0xE4,0x00,0x9D,0xF2,0xC2,0xE0,0x10,0x01,0x99,0x80,0xEA,0xF7, +0x08,0x8B,0x89,0x6C,0x56,0xF7,0x80,0x99,0xA1,0x22,0xE0,0xFC,0xC2,0xE0,0x10,0x01, +0xEE,0xF7,0x03,0xFA,0x86,0xE8,0xE4,0x00,0x00,0x7F,0xCE,0xEB,0x00,0x30,0x40,0x6A, +0xBC,0x8A,0xE3,0x88,0x83,0x10,0xB7,0x04,0x1C,0x63,0x18,0x9C,0x8C,0x10,0xD7,0x05, +0x10,0xF7,0x07,0xE7,0xFF,0xEF,0xDC,0x20,0x60,0x32,0x4E,0xED,0x5C,0x45,0x8C,0xBD, +0x5D,0x8C,0x00,0x9D,0x61,0x5D,0x6B,0x00,0x12,0xEA,0x00,0xD6,0xEB,0xFE,0x7D,0x88, +0x6C,0xE7,0xFF,0xF3,0x64,0x22,0x61,0x5C,0x22,0x40,0xFE,0xE4,0x00,0x00,0xA3,0xCD, +0x6C,0x00,0x30,0x8D,0x6A,0x0A,0xEB,0x16,0x0E,0xE1,0x08,0x0A,0xEB,0x18,0x1C,0x61, +0x08,0x0E,0xE1,0x0C,0x1C,0x81,0x0C,0xEE,0xED,0x03,0xD2,0x0C,0xAB,0x0E,0x88,0xCE, +0x86,0xE8,0x0E,0xE1,0x0A,0x9D,0x81,0x0E,0xEB,0x17,0x5D,0x8C,0x00,0x0E,0xE1,0x0E, +0x0E,0xEB,0x19,0xE4,0x00,0x00,0x25,0xC1,0xC0,0x10,0x01,0x99,0x80,0xC1,0xA0,0x10, +0x01,0xFD,0xCE,0x01,0x3C,0x12,0xEA,0x00,0xD6,0xEC,0xFD,0xBD,0xC2,0xE0,0x10,0x01, +0x13,0x6A,0x00,0xEB,0x97,0x08,0x9F,0x9B,0x20,0xC2,0xE0,0x10,0x01,0x57,0x9C,0x01, +0xFE,0xF7,0x0C,0x04,0xCB,0xA0,0x07,0xFF,0xE4,0x00,0x00,0x89,0x0B,0x57,0x01,0x13, +0xD7,0xEF,0x5F,0x1A,0x06,0x47,0x18,0xC7,0x4F,0x18,0xFA,0x47,0x1A,0xC4,0x5F,0x58, +0x06,0xC3,0x40,0xFF,0xE8,0x20,0x00,0x1D,0xFF,0x00,0x07,0xFF,0x0F,0x17,0x01,0x5F, +0x58,0x06,0x23,0x80,0x48,0xCF,0x1A,0x03,0xFF,0x4F,0x5E,0x50,0x43,0x18,0xE8,0x8F, +0x1A,0x0F,0x17,0x01,0x9F,0x21,0x1E,0xF7,0x30,0x5F,0x39,0x00,0xD7,0x3B,0xFE,0x06, +0x0E,0xC1,0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E, +0x21,0x26,0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81, +0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85,0x29,0x1C, +0x21,0xC8,0xC2,0xE0,0x10,0x01,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0E,0x61,0x0C,0x0E, +0xC1,0x00,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0xC1,0x20,0x0D,0xE1, +0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x81,0x08,0x0E,0xA1,0x04, +0xC1,0x80,0x10,0x01,0xF3,0x57,0x08,0xCE,0xFD,0x8C,0x0B,0xEC,0xC2,0xE0,0x10,0x01, +0x1E,0xC1,0x38,0x89,0xA3,0x8A,0x61,0x18,0x0C,0x00,0xFE,0xF7,0x0B,0xF4,0x9B,0x00, +0x9B,0x3F,0xE4,0x00,0x00,0x2B,0x0C,0x17,0x00,0x1B,0x37,0xFE,0x1B,0x37,0xFF,0x9F, +0x01,0x1E,0xF7,0x30,0x5F,0x18,0x00,0xD7,0x1A,0xFF,0x7E,0xC1,0xE0,0x10,0x01,0xFD, +0xEF,0x0B,0x76,0x12,0xEF,0x04,0x10,0x6F,0x01,0x40,0x63,0xBB,0xE4,0x00,0x99,0xF6, +0x13,0x2F,0x04,0x4E,0xF9,0x10,0x9E,0xEA,0xC6,0xF7,0x07,0xF8,0xC3,0x60,0x10,0x01, +0x40,0x21,0xBD,0x0A,0x0D,0x18,0x89,0x61,0x9B,0x00,0xCA,0xE0,0x20,0x00,0xFF,0x7B, +0x0A,0x18,0xE4,0x00,0x00,0x3B,0x4F,0x58,0x10,0x9F,0x01,0x43,0x9A,0xDC,0x8F,0x4B, +0x0E,0x3C,0x02,0x5E,0x37,0x15,0x0E,0x3A,0x00,0x4A,0xF1,0xB8,0x5E,0xF7,0x06,0x5F, +0x58,0x00,0xD7,0x3A,0xFF,0x25,0x46,0x37,0xBF,0x99,0x40,0x4E,0x31,0xFA,0x89,0xCA, +0x46,0x31,0xBC,0xC2,0x80,0x10,0x01,0x9A,0x42,0x8A,0xAC,0xE4,0x00,0x04,0x4B,0x0B, +0x0D,0x18,0x21,0x41,0x32,0x0E,0xEB,0x02,0xD7,0x17,0x0E,0xEC,0x0F,0x0B,0x06,0xD6, +0xF8,0x00,0x7C,0xD6,0xF8,0x0E,0x96,0x0F,0x0B,0x0A,0xD6,0xF8,0x0E,0x58,0x98,0x60, +0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE5,0xE6, +0xD0,0x60,0x0D,0xAA,0x12,0xEC,0x00,0x99,0x41,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E, +0xEC,0x18,0x17,0x04,0x18,0x17,0x06,0x1A,0x57,0x05,0xE4,0x00,0x03,0x4F,0x21,0x45, +0x56,0x0E,0xEB,0x06,0xD7,0x17,0x0C,0x8C,0x0F,0x0B,0x02,0xD7,0x17,0x0C,0x54,0x0F, +0x0B,0x0A,0xD6,0xF8,0x00,0x7C,0xD6,0xF8,0x0B,0xFE,0x0F,0x0B,0x0E,0xD6,0xF8,0x0B, +0xC0,0x98,0x61,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7, +0xFF,0xE5,0x40,0xD0,0x60,0x0B,0x12,0x12,0xEC,0x00,0x9B,0x01,0x8E,0xEE,0x99,0x42, +0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x18,0x17,0x04,0x1B,0x17,0x06,0x1A,0x57,0x05,0xE4, +0x00,0x02,0xA5,0x25,0x45,0xC5,0x1F,0x37,0xFE,0xD7,0x2A,0x03,0x58,0x4E,0xEA,0x10, +0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x09,0x84,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F, +0x0B,0x0F,0x18,0x02,0xD6,0xF8,0x01,0x34,0xD6,0xF8,0x08,0xEE,0x1F,0x2A,0xFE,0x4F, +0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x08,0x70,0x1F,0x4A,0x01,0x4F,0x5A, +0x10,0x8F,0x4B,0x0F,0x5A,0x02,0xD7,0x59,0x07,0xF8,0x1F,0x2A,0x01,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x03,0x2C,0xD6,0xF9,0x07,0x66,0x1F,0x2A,0x02, +0x4F,0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x06,0xE8,0xD7,0x19,0x06,0xC8, +0xE4,0x00,0x00,0x95,0x4F,0x0A,0x10,0x1F,0x57,0xFE,0x0B,0x2D,0x18,0x8F,0x0B,0xD5, +0x5A,0x03,0x6E,0x0F,0x18,0x02,0xD7,0x38,0x05,0xFC,0x1F,0x37,0xFF,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD7,0x38,0x05,0x84,0x1F,0x37,0xFD,0x4F,0x39,0x10,0x8F, +0x2B,0x0F,0x39,0x02,0xD7,0x19,0x00,0xB4,0xD7,0x19,0x04,0xEE,0x9E,0xFC,0x4E,0xF7, +0x10,0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x04,0x78,0x88,0x6A,0x88,0x8B,0x88,0xB1, +0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE3,0x6E,0x20,0x61,0xE4,0x12, +0xEC,0x00,0x1F,0x0A,0xFF,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x19,0x57,0x06, +0x1B,0x17,0x04,0x9D,0x41,0x5D,0x4A,0x00,0xE4,0x00,0x00,0xAD,0x0E,0xF8,0x02,0xD7, +0x37,0x02,0xB4,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18,0x02,0xD6,0xF8, +0x00,0xBC,0xD6,0xF8,0x02,0x1E,0x1F,0x0A,0xFE,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18, +0x02,0xD6,0xF8,0x01,0xA0,0x88,0x6A,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C, +0x09,0x0D,0x1E,0xE7,0xFF,0xE2,0xB8,0x20,0x60,0x78,0x12,0xEC,0x00,0x1F,0x0A,0xFE, +0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x1B,0x17,0x04,0x19,0x57,0x06,0x19,0x57, +0x05,0xE4,0x00,0x00,0x21,0x9D,0x41,0x5D,0x4A,0x00,0x12,0xEF,0x04,0xD6,0xEA,0xF0, +0x95,0x12,0xEF,0x04,0xD6,0xEA,0x01,0x61,0x12,0xEC,0x00,0x8E,0xEE,0xCE,0xF7,0x00, +0x30,0x43,0x17,0x64,0x13,0x18,0x05,0xD5,0x58,0x00,0x55,0x1D,0x58,0x01,0x5D,0x4A, +0x00,0x8E,0xF5,0x9B,0x01,0x9D,0xC1,0x18,0x17,0x07,0x0F,0x17,0x08,0x5D,0xCE,0x00, +0x12,0xEF,0x04,0xD6,0xEA,0x00,0x61,0xF2,0xF4,0x08,0xCE,0xD6,0xEE,0xFD,0xFC,0x12, +0xEC,0x00,0x8D,0xD7,0x19,0xCC,0x00,0x88,0x33,0x0E,0xC1,0x02,0x0E,0xA1,0x06,0x0E, +0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1, +0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32, +0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01, +0xF8,0x77,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x0B,0x81,0xEE,0xF8,0x04,0x5D, +0xC3,0x00,0x10,0x01,0xCF,0x37,0x00,0x05,0x4E,0xF7,0x10,0xEF,0x38,0x04,0x5B,0xC3, +0x00,0x10,0x01,0xEE,0xF8,0x04,0x59,0x85,0x29,0x5C,0x63,0x06,0x20,0x84,0x5A,0x0B, +0x05,0x00,0x0B,0x25,0x02,0x0B,0x45,0x04,0x0B,0x85,0x06,0x0B,0x65,0x08,0xE4,0x00, +0x00,0x27,0x0B,0x05,0x0A,0x0B,0x25,0x0C,0x0B,0x45,0x0E,0x0B,0x85,0x10,0x0B,0x65, +0x12,0xC2,0xE0,0x10,0x01,0x9B,0xA2,0xEA,0xF7,0x0B,0x81,0x43,0x9C,0xBB,0x43,0x9C, +0xE8,0x43,0x80,0xE5,0xFF,0x9C,0x03,0xFF,0xD4,0x7C,0x00,0xC8,0x43,0x9B,0xBB,0x43, +0xBC,0xE8,0xFF,0xBD,0x03,0xFF,0xD7,0xA3,0x01,0x08,0x5C,0x78,0x04,0xE4,0x00,0x00, +0xE3,0x24,0x7C,0x58,0x43,0x03,0xC3,0x40,0x7C,0x1D,0x43,0x43,0xD3,0x40,0x78,0xD4, +0x40,0x63,0xE0,0xE4,0x00,0x00,0xB1,0x9B,0x82,0x43,0x7B,0xBB,0x43,0x7B,0xE0,0xFF, +0x9B,0x03,0xFF,0xD7,0x83,0x01,0x7C,0xC0,0x60,0xFF,0xEC,0x20,0x00,0xCD,0x43,0x60, +0xDD,0xFE,0xFB,0xFC,0x01,0x8E,0xE3,0x43,0x37,0xCB,0xCA,0xE0,0x07,0xFF,0x40,0x77, +0x1D,0xFF,0x7B,0x04,0x00,0x43,0x03,0xC3,0x40,0x79,0xC4,0x40,0x63,0xD8,0xE4,0x00, +0x00,0x3B,0x24,0x7C,0x32,0x8C,0x77,0x40,0x63,0xD3,0xE4,0x00,0x00,0x1D,0xFF,0x17, +0x07,0xFF,0x40,0x78,0x1D,0x40,0x63,0xCB,0x40,0x63,0xB8,0x5C,0x63,0x04,0x85,0x29, +0x9C,0x38,0x0C,0x01,0x04,0xC3,0x00,0x10,0x01,0xC3,0x40,0x10,0x01,0xFF,0x18,0x0B, +0x76,0xFF,0x9A,0x04,0x1C,0x0B,0x38,0x0B,0x0B,0xBC,0x00,0x13,0x18,0x0C,0x5F,0x79, +0x06,0x5E,0xE3,0x06,0x43,0x7D,0xDB,0x43,0x7B,0xC0,0xD6,0xFB,0x00,0x4C,0x9B,0x41, +0x0F,0x41,0x04,0x0F,0x41,0x06,0x98,0x7F,0x23,0x40,0x5E,0x0B,0x5C,0x02,0x43,0x5A, +0xCB,0x43,0x5A,0xC0,0xD7,0x57,0x00,0x58,0x9B,0x41,0x98,0x60,0x0F,0x41,0x04,0x0F, +0x41,0x06,0x23,0x41,0x1E,0xC3,0x40,0x10,0x01,0xC3,0x60,0x10,0x01,0xF3,0xBA,0x0B, +0x7A,0xFF,0x7B,0x04,0x20,0x9B,0x41,0xE4,0x00,0x00,0x57,0x0B,0xDB,0xFE,0x43,0xDE, +0xCB,0x43,0xDE,0xC0,0xD7,0xD7,0x00,0xD4,0x0B,0xDB,0x00,0x43,0xDE,0xCB,0x43,0xDE, +0xC0,0xD7,0xD7,0x00,0x68,0x9B,0x41,0x0F,0x41,0x04,0xE4,0x00,0x00,0x1F,0x9F,0x41, +0x9F,0x62,0x5C,0x7A,0x02,0xD7,0x5D,0xFE,0xB0,0x0F,0x41,0x06,0x23,0x40,0x9E,0xC3, +0x40,0x10,0x01,0xF3,0x5A,0x0B,0x7A,0x9F,0x41,0x4F,0x7A,0x08,0x8F,0x9B,0x0B,0x7C, +0x00,0x43,0x3B,0xCB,0x43,0x19,0xC0,0xD7,0x17,0x00,0x64,0x9A,0xE1,0x5C,0x7A,0x02, +0x0E,0xE1,0x04,0x9C,0x28,0x85,0x29,0xC3,0x20,0x10,0x01,0x5C,0x63,0x06,0x5C,0xC6, +0x02,0x5C,0xE7,0x00,0xFF,0x39,0x09,0x68,0x24,0xC0,0x98,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x0B,0x7A,0xD4,0xD8,0x00,0xDC,0x43,0x18,0x3B,0x1E,0xE6,0xFF,0x8E,0xF8,0x4F, +0x17,0x10,0x8F,0x19,0x0B,0x78,0x02,0x0B,0x58,0x00,0xE4,0x00,0x00,0x11,0x9B,0x40, +0x8B,0x7A,0xC2,0xE0,0x10,0x01,0xF3,0x97,0x0B,0x7A,0xD7,0x86,0x01,0x08,0xD0,0xDF, +0x04,0x28,0x42,0xFC,0x3B,0x8E,0xE6,0x4F,0x17,0x10,0x4E,0xF7,0x10,0x8F,0x19,0x8F, +0x37,0x0B,0x18,0x02,0x0B,0xD9,0x00,0xE4,0x00,0x00,0x17,0x24,0xDD,0xA0,0x9B,0xC0, +0x8B,0x1E,0xD4,0xDC,0x03,0x0C,0x4E,0xE6,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04, +0x1C,0x8E,0xE7,0x9C,0xC1,0x09,0x17,0x00,0x4C,0xC6,0x08,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x0B,0x76,0x8C,0xE6,0x0B,0x97,0x0B,0x13,0x37,0x0C,0x0A,0xE7,0x00,0x40,0xD7, +0xE3,0x42,0xF7,0x45,0x43,0xA8,0xE3,0x40,0xC6,0xC8,0x43,0xBD,0xC8,0x43,0x97,0xE3, +0x43,0xA3,0xED,0x43,0x3C,0xC8,0x40,0x66,0x1D,0x43,0x18,0xEB,0x43,0x7B,0x1B,0x42, +0xFE,0xEB,0x8F,0x1B,0x40,0x7A,0x1B,0x43,0x18,0xC8,0x8E,0xE3,0x42,0xF7,0xC8,0xE4, +0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x0F,0x04,0x01,0x0E,0xE5,0x01,0x85,0x29,0x1C, +0x21,0xD8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x5D,0x84, +0x00,0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x5D,0xA5,0x00,0x5D,0x63,0x04, +0x0C,0xC1,0x04,0x0D,0x21,0x24,0x89,0xE8,0x0D,0xC1,0x2A,0xC1,0x40,0x10,0x01,0x9A, +0x02,0xFD,0x4A,0x0B,0x76,0x0C,0xE1,0x00,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x40,0x63, +0x80,0x40,0x6B,0x1D,0xE7,0xFF,0xFC,0x38,0x0C,0x81,0x06,0x88,0xC3,0x5E,0xE3,0x02, +0x0C,0xA1,0x02,0x26,0xFC,0x36,0x0C,0x04,0x01,0x0C,0x05,0x01,0xE4,0x00,0x00,0x2D, +0x0A,0xEA,0x0B,0x42,0xEC,0xBB,0x88,0xED,0x40,0x77,0x80,0x40,0x6B,0x1D,0xE7,0xFF, +0xFD,0x72,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x4C,0x63,0x0A,0x8C,0x6B,0xE7,0xFF,0xFB, +0xC6,0x12,0xEA,0x04,0x88,0xC3,0x5F,0x03,0x02,0xD7,0x17,0x00,0x70,0x0C,0x0F,0x01, +0x0C,0x0E,0x01,0xE4,0x00,0x00,0x69,0x08,0x6A,0x0B,0x41,0x8C,0x1B,0x88,0x8F,0x4C, +0x6C,0x0A,0x88,0xAE,0x8C,0x6B,0x88,0xED,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1, +0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26, +0x1C,0x21,0x28,0xE7,0xFF,0xFC,0xC9,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12, +0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C, +0x21,0x28,0x85,0x29,0x1C,0x21,0x90,0x0D,0x41,0x68,0x0D,0x81,0x60,0x0D,0xA1,0x5C, +0x0D,0xE1,0x54,0x0E,0x01,0x50,0x0E,0x21,0x4C,0x0D,0x21,0x6C,0xC2,0x20,0x10,0x01, +0x0D,0x61,0x64,0x0D,0xC1,0x58,0x0E,0x41,0x48,0x0E,0x61,0x44,0x0E,0x81,0x40,0x0E, +0xA1,0x3C,0x0E,0xC1,0x38,0x89,0xA3,0x8A,0x04,0x89,0x85,0x5D,0xE6,0x00,0x99,0x40, +0xFE,0x31,0x0B,0xEC,0xE4,0x00,0x00,0xA1,0xCF,0x0A,0x00,0x30,0x8F,0x11,0x1E,0xE1, +0x20,0x10,0xB8,0x07,0x0B,0x98,0x17,0x43,0x2D,0x2C,0x4D,0x05,0x08,0x13,0x59,0x00, +0x1F,0x61,0x38,0x8D,0x1A,0x9F,0x41,0x4D,0x08,0x08,0x1B,0x59,0x00,0x8F,0x68,0x08, +0x78,0x17,0x0F,0x9B,0xD9,0x1F,0x01,0x30,0x8F,0x08,0x88,0x8F,0x0F,0x01,0x00,0x1C, +0xC1,0x18,0x1C,0xE1,0x28,0x8C,0xC8,0x8C,0xE8,0x9D,0x41,0x8D,0x17,0x5D,0x4A,0x00, +0xE7,0xFF,0xFD,0x1E,0x12,0xF1,0x00,0xD6,0xEA,0xFD,0x8D,0xC2,0xE0,0x10,0x01,0x8B, +0x10,0xF2,0x57,0x04,0x64,0x9B,0x41,0x8A,0xED,0xE4,0x00,0x00,0x23,0x13,0x37,0x00, +0x27,0x24,0x19,0x0F,0x58,0x00,0x9E,0xE1,0x9F,0x04,0x43,0x37,0x6D,0x5F,0x39,0x00, +0xD6,0x59,0xFF,0x6D,0x99,0x60,0xC2,0x60,0x10,0x01,0x89,0x4B,0xC2,0x80,0x10,0x01, +0xE4,0x00,0x03,0x07,0x42,0xF0,0x5C,0x0E,0xF7,0x02,0x22,0xE0,0x48,0x1E,0xE1,0x10, +0x8E,0xEB,0x0B,0x57,0x00,0x0B,0x77,0x02,0xE4,0x00,0x01,0x5D,0x42,0xED,0x54,0x12, +0xF7,0x00,0x22,0xE1,0xE0,0x1E,0xE1,0x18,0x8E,0xEB,0x0B,0x17,0x00,0x1E,0xE1,0x28, +0x8E,0xEB,0x0A,0xF7,0x00,0x8E,0xF8,0x1F,0x01,0x30,0x8F,0x0B,0x0B,0x18,0x00,0x8E, +0xF8,0x1F,0x01,0x20,0x8F,0x0B,0x0B,0x18,0x00,0x8E,0xF8,0x9B,0x04,0x42,0xF7,0xC0, +0x0E,0xEC,0x00,0xE4,0x00,0x02,0x55,0xCE,0xEE,0x00,0x30,0x8E,0xF1,0x41,0x0E,0xCC, +0x08,0x77,0x17,0x4D,0x08,0x08,0x1E,0xE1,0x30,0x8E,0xE8,0x0E,0xE1,0x00,0x1E,0xE1, +0x20,0x0F,0x01,0x0C,0x0F,0x21,0x08,0x88,0x8F,0x88,0xB5,0x1C,0xC1,0x18,0x1C,0xE1, +0x28,0x8C,0xC8,0x8C,0xE8,0x8D,0x17,0xE7,0xFF,0xFB,0x90,0x9D,0xC1,0x0F,0x01,0x0E, +0x5D,0xCE,0x00,0x0F,0x21,0x0A,0xE4,0x00,0x00,0x23,0x9A,0xC1,0x99,0xC0,0x42,0xD6, +0x55,0x4F,0x2A,0x08,0x43,0x0D,0xB4,0x12,0xF8,0x00,0xD6,0xEE,0xFD,0x6D,0x4E,0xD6, +0x10,0x43,0x10,0xB4,0x0F,0x18,0x02,0xD3,0x00,0x05,0x0A,0x1F,0x01,0x38,0x8E,0xD8, +0x0B,0x56,0xD8,0x0B,0x76,0xDA,0x43,0x3A,0xDD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0xEB, +0x93,0x04,0x5B,0x47,0x37,0xCE,0x43,0x39,0xBD,0x52,0xE0,0x64,0x5F,0x39,0x06,0xD7, +0x3C,0x00,0xF4,0xEB,0x14,0x04,0x59,0x9A,0xE0,0xD7,0x19,0x00,0xA4,0x42,0xF9,0xC5, +0x43,0x1C,0xC5,0xCE,0xF7,0x00,0x64,0x42,0xF7,0xC0,0x5E,0xF7,0x00,0x5F,0x7A,0x15, +0x4B,0x81,0x01,0x4F,0x2A,0x08,0x4B,0x00,0x0A,0x8F,0x19,0x8F,0x3C,0x1F,0x81,0x38, +0x1F,0x41,0x38,0x53,0x60,0xC8,0x4F,0x39,0x08,0x43,0x7B,0xBD,0x8F,0x3C,0x0B,0x99, +0xE0,0x4F,0x18,0x08,0x8F,0x1A,0x0B,0xB8,0xE8,0x0B,0x58,0xF8,0x8F,0x5D,0x8F,0x5C, +0x0B,0x99,0xF0,0x8F,0x5C,0x43,0x5B,0xD3,0x0B,0x79,0xE8,0x0B,0x39,0xF8,0x8F,0x79, +0x0B,0x38,0xE0,0x8F,0x79,0x0B,0x38,0xF0,0x43,0x1B,0xCC,0x42,0xF7,0xC3,0xCB,0x00, +0x03,0x20,0x8E,0xFA,0xE7,0xFF,0xFD,0xF3,0x22,0xE0,0x88,0x1F,0x01,0x38,0x4E,0xEA, +0x10,0x8E,0xF8,0x0B,0x17,0xF0,0x0B,0x37,0xE0,0x8F,0x38,0x0B,0x17,0xF8,0x8F,0x38, +0x0B,0x17,0xE8,0x42,0xF9,0xC4,0xE7,0xFF,0xFD,0xAB,0x0C,0x0C,0x00,0x9D,0x41,0x9D, +0x84,0x9D,0x64,0x5E,0xAA,0x00,0xD6,0x55,0xF3,0xF5,0x0E,0xC1,0x3A,0x0E,0xA1,0x3E, +0x0E,0x81,0x42,0x0E,0x61,0x46,0x0E,0x41,0x4A,0x0E,0x21,0x4E,0x0E,0x01,0x52,0x0D, +0xE1,0x56,0x0D,0xC1,0x5A,0x0D,0xA1,0x5E,0x0D,0x81,0x62,0x0D,0x61,0x66,0x0D,0x41, +0x6A,0x0D,0x21,0x6E,0x1C,0x21,0x70,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x89,0xA3,0xC2,0xE0,0x10, +0x01,0x5C,0x64,0x06,0xEA,0xF7,0x08,0x9F,0x5D,0x85,0x00,0x5D,0x66,0x00,0x5D,0x47, +0x00,0x56,0xF7,0x04,0x22,0xE0,0x34,0x88,0x8C,0x88,0xAB,0x88,0xCA,0xE7,0xFF,0xE0, +0xEC,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x7A,0x43,0x0A,0xC3,0x5F,0x18,0x00,0x9B, +0x20,0x42,0xF8,0x64,0x8D,0x78,0xC3,0x40,0x10,0x01,0x5D,0x6B,0x00,0x5E,0xF7,0x00, +0x8B,0x19,0xFF,0x5A,0x09,0x68,0xE4,0x00,0x00,0x3B,0x4F,0x77,0x10,0x8F,0x7A,0x0B, +0x7B,0x02,0x8F,0x1B,0x4F,0x77,0x10,0x9E,0xE1,0x8F,0x7A,0x5E,0xF7,0x00,0x0B,0x7B, +0x00,0x8F,0x3B,0xD6,0xEB,0xFF,0x38,0x27,0x21,0x14,0x27,0x01,0x08,0xC2,0xE0,0x10, +0x01,0xFE,0xF7,0x01,0x64,0x4F,0x39,0x40,0x9D,0x44,0x4D,0x4A,0x10,0x8D,0x57,0x0A, +0xEA,0x06,0x43,0x19,0xC0,0x9B,0x4A,0xFF,0x18,0xFF,0x00,0x53,0x20,0x64,0x43,0x18, +0xBB,0x0A,0xEA,0x04,0x43,0x18,0xD0,0x4E,0xF7,0x40,0x42,0xF7,0xC8,0x8E,0xF8,0x5E, +0xE0,0x09,0x0E,0xED,0x00,0x48,0x61,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1, +0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18, +0x85,0x29,0xCA,0xE0,0x01,0x00,0xFC,0x21,0xFF,0x80,0x5C,0xE7,0x00,0x0D,0x41,0x78, +0x0D,0x61,0x74,0x0D,0x81,0x70,0x0E,0x21,0x5C,0x0E,0x41,0x58,0x0E,0x61,0x54,0x0E, +0x81,0x50,0x0E,0xA1,0x4C,0x0E,0xC1,0x48,0x0D,0x21,0x7C,0x0D,0xA1,0x6C,0x0D,0xC1, +0x68,0x0D,0xE1,0x64,0x0E,0x01,0x60,0xCE,0x44,0x00,0x0A,0x42,0x52,0x1B,0x42,0x52, +0xB8,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x76,0x11,0xD7,0x04,0x41,0x87,0x73,0x5F, +0x0C,0x00,0xCC,0x84,0x0A,0x00,0x8C,0xB8,0x8C,0xD8,0xC2,0xA0,0x10,0x01,0xC2,0x20, +0x10,0x01,0xC1,0x60,0x10,0x01,0xC3,0x00,0x10,0x01,0xFD,0x6B,0x09,0x68,0x42,0x64, +0x18,0x5E,0x86,0x00,0x09,0xF7,0x0B,0x12,0x17,0x0C,0x5D,0x45,0x00,0xFE,0xB5,0x01, +0x64,0xFE,0x31,0x04,0x1C,0x8A,0xCB,0xFF,0x18,0x0A,0x18,0xE4,0x00,0x01,0x61,0x0F, +0x01,0x04,0x88,0x95,0x50,0xA0,0x3C,0x1C,0x61,0x08,0xE4,0x00,0x2C,0xFE,0x41,0xAA, +0x65,0x1E,0xED,0x01,0x4E,0xF7,0x08,0x8E,0xF1,0x98,0x82,0x08,0x77,0x00,0x1C,0xA1, +0x08,0x40,0x63,0x7B,0x40,0x63,0x80,0xE7,0xFF,0xF1,0x44,0x0F,0x01,0x06,0x5C,0x63, +0x04,0xD5,0x4C,0x00,0x5E,0x1E,0xEE,0xFF,0xD5,0xB7,0x01,0x92,0xCB,0x20,0x03,0xE8, +0x43,0x43,0x9B,0x4E,0xEA,0x10,0x43,0x63,0x93,0x9E,0xE2,0x43,0x7B,0xC8,0x8E,0xEB, +0x0B,0x97,0x01,0x43,0x7C,0xDD,0x0F,0x77,0x01,0x43,0x3A,0xC8,0x4E,0xEA,0x10,0x8E, +0xEB,0x0B,0x57,0x01,0x43,0x3A,0xCD,0x0F,0x37,0x01,0x4E,0xEA,0x08,0x1F,0x37,0x01, +0x4F,0x59,0x08,0x8F,0x4B,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4F,0x57, +0x08,0x8F,0x56,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4E,0xF7,0x08,0x8E, +0xEB,0x4F,0x4A,0x10,0x0B,0x77,0x00,0x8F,0x58,0x4F,0x39,0x08,0x9D,0x41,0x8F,0x2B, +0x5D,0x4A,0x00,0x0A,0xF9,0x00,0x8E,0xFB,0x0E,0xFA,0x00,0xD5,0x54,0xFA,0xA0,0x0E, +0xC1,0x4A,0x0E,0xA1,0x4E,0x0E,0x81,0x52,0x0E,0x61,0x56,0x0E,0x41,0x5A,0x0E,0x21, +0x5E,0x0E,0x01,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D,0xA1,0x6E,0x0D,0x81,0x72, +0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21,0x00,0x80,0x85,0x29,0x1C, +0x21,0xB8,0x98,0x60,0x0D,0x21,0x44,0x0D,0x41,0x40,0x0D,0x61,0x3C,0x0D,0x81,0x38, +0x0D,0xA1,0x34,0x0D,0xC1,0x30,0x0D,0xE1,0x2C,0x0E,0x01,0x28,0x0E,0x21,0x24,0x0E, +0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0C,0x01,0x08,0x0C,0x01,0x0C,0x18,0x01, +0x02,0x18,0x01,0x03,0x0C,0x01,0x10,0x0C,0x01,0x14,0xE7,0xFF,0xD3,0x4C,0x1C,0x61, +0x02,0x1C,0x81,0x10,0x1C,0xA1,0x08,0x98,0xC4,0xE7,0xFF,0xF5,0xD6,0xC2,0xE0,0x10, +0x01,0xF3,0x97,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEB,0xB7,0x08,0x87,0xC2,0xE0,0x10, +0x01,0xEF,0x77,0x04,0x56,0xC2,0xE0,0x10,0x01,0x57,0xBD,0x20,0xEF,0xD7,0x04,0x62, +0xC3,0x20,0x10,0x01,0x4F,0xBD,0x29,0x1E,0xE1,0x08,0xFF,0x39,0x01,0x84,0x9B,0x40, +0xE4,0x00,0x00,0x63,0x0F,0x17,0x02,0x09,0x19,0xFC,0x0F,0x19,0x00,0x43,0x18,0x45, +0x5F,0x1F,0xF9,0x4B,0x18,0x00,0x0F,0x17,0x00,0x23,0xA0,0x3C,0x23,0x60,0x30,0x43, +0x18,0xF3,0x43,0x18,0xD8,0x0F,0x17,0x00,0x9F,0x41,0x9E,0xE4,0x5F,0x5A,0x00,0x9F, +0x28,0xD7,0x5C,0xFE,0x9E,0x98,0x61,0x99,0x60,0xC2,0x20,0x10,0x01,0xC2,0x80,0x10, +0x01,0xE7,0xFF,0xD2,0x3E,0x89,0x4B,0xFD,0xB1,0x0B,0xEC,0x9A,0x41,0xC2,0x60,0x10, +0x01,0xFE,0x94,0x0C,0xB8,0xE4,0x00,0x00,0xF9,0xCE,0x0A,0x00,0x30,0x42,0xF0,0x6C, +0x1C,0x61,0x04,0x11,0xF7,0x04,0x11,0xD7,0x05,0x11,0x97,0x07,0x08,0x97,0x17,0x88, +0xAF,0x88,0xCE,0x88,0xEC,0xE7,0xFF,0xF9,0x88,0x20,0x60,0xF8,0x98,0x60,0xE7,0xFF, +0xD1,0xC4,0x1F,0x01,0x18,0x4E,0xEC,0x10,0x8E,0xF8,0x88,0xAF,0x0C,0x97,0xF2,0x88, +0xCE,0x88,0xEC,0x0C,0x61,0x06,0xE7,0xFF,0xFA,0xF8,0x98,0x61,0xE7,0xFF,0xD1,0x88, +0x40,0x6D,0x84,0x88,0xAF,0x88,0x83,0x88,0xCE,0x1C,0x63,0x18,0x9C,0x8C,0x88,0xEC, +0xE7,0xFF,0xD4,0x42,0x20,0x60,0x32,0x4E,0xF2,0x54,0x45,0x6B,0xBD,0x5D,0x6B,0x00, +0x88,0x74,0xF0,0x93,0x0B,0x76,0x98,0xA1,0x9D,0x41,0xE4,0x00,0x81,0xA6,0x5D,0x4A, +0x00,0xF2,0xF1,0x0B,0xEC,0xD6,0xEA,0xFC,0x25,0x88,0x6B,0xE7,0xFF,0xD7,0xB0,0x0D, +0x21,0x46,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,0x0E,0x01, +0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,0x61,0x3E, +0x0D,0x41,0x42,0x1C,0x21,0x48,0x85,0x29,0xFC,0x21,0xFF,0x00,0x98,0xA0,0xED,0x41, +0x00,0xF8,0xED,0x61,0x00,0xF4,0xED,0xC1,0x00,0xE8,0xED,0xE1,0x00,0xE4,0xEE,0x01, +0x00,0xE0,0xEE,0x21,0x00,0xDC,0xEE,0x41,0x00,0xD8,0xEE,0x61,0x00,0xD4,0xED,0x21, +0x00,0xFC,0xED,0x81,0x00,0xF0,0xED,0xA1,0x00,0xEC,0xEE,0x81,0x00,0xD0,0xEE,0xA1, +0x00,0xCC,0xEE,0xC1,0x00,0xC8,0xC2,0x20,0x10,0x01,0xC2,0x60,0x10,0x01,0xFE,0x31, +0x0C,0xB8,0xFD,0x73,0x0B,0x76,0x88,0x71,0x10,0x8B,0x00,0xE4,0x00,0x80,0x84,0xC2, +0xE0,0x10,0x01,0xEA,0xF7,0x08,0x8B,0xC6,0xF7,0x02,0x00,0xC2,0x40,0x10,0x01,0x5E, +0xE0,0x01,0xC1,0xE0,0x10,0x01,0x4A,0xE1,0x13,0xC1,0x40,0x10,0x01,0xC1,0xC0,0x10, +0x01,0x0E,0xE1,0x0C,0x9A,0x00,0xFE,0x52,0x01,0x64,0xFD,0xEF,0x09,0x68,0xFD,0x4A, +0x0A,0x18,0xFD,0xCE,0x0B,0xEC,0x98,0x60,0x0C,0x01,0x58,0x0C,0x01,0x5C,0x18,0x01, +0x56,0x18,0x01,0x57,0x0C,0x01,0x60,0x0C,0x01,0x64,0xE7,0xFF,0xCF,0x6C,0x1C,0x61, +0x56,0x1C,0x81,0x60,0x1C,0xA1,0x58,0x98,0xC3,0xE7,0xFF,0xF1,0xF6,0xC2,0xE0,0x10, +0x01,0xEB,0x97,0x08,0x87,0xC2,0xE0,0x10,0x01,0xC3,0x20,0x10,0x01,0xEF,0x77,0x04, +0x56,0xC2,0xE0,0x10,0x01,0xF3,0x59,0x04,0x64,0x57,0x9C,0x20,0xEF,0xB7,0x04,0x62, +0x4F,0x9C,0x29,0x1E,0xE1,0x58,0x9B,0x20,0xE4,0x00,0x00,0x5D,0x0F,0xD7,0x02,0x4F, +0x19,0x18,0x8F,0x12,0x0B,0x18,0x1C,0x43,0x1E,0xC5,0x5F,0x1F,0xF9,0x4B,0x18,0x00, +0x0F,0x17,0x00,0x23,0x80,0x3C,0x23,0x60,0x30,0x43,0x18,0xEB,0x43,0x18,0xD8,0x0F, +0x17,0x00,0x9F,0x21,0x9E,0xE4,0x5F,0x19,0x00,0xD7,0x58,0xFE,0x9D,0x13,0x0B,0x04, +0x09,0xAB,0x0B,0x12,0x8B,0x0C,0x9A,0xA0,0xE4,0x00,0x01,0xA1,0xFE,0xE1,0x00,0xC8, +0x8E,0xF5,0x12,0xF7,0x8E,0x22,0xE0,0x72,0xFF,0x61,0x00,0xC8,0x9A,0xE1,0x42,0xF7, +0xAD,0x4E,0xF7,0x10,0x8E,0xFB,0x0F,0x37,0x92,0x4E,0xF5,0x10,0x8E,0xFB,0x0F,0x37, +0x90,0x41,0x95,0xC3,0x1F,0xB5,0x01,0x5E,0xCC,0x00,0x43,0xBD,0xC3,0xE4,0x00,0x01, +0x25,0x0F,0x01,0x00,0x0F,0x41,0x04,0x0F,0xA1,0x08,0x88,0x92,0x50,0xA0,0x3C,0x1C, +0x61,0x10,0xE4,0x00,0x25,0x6E,0x42,0xF6,0x65,0xC3,0x80,0x10,0x01,0x9E,0xE1,0xFF, +0x9C,0x04,0x1C,0x4E,0xF7,0x08,0x8E,0xFC,0x98,0x81,0x08,0x77,0x00,0x1C,0xA1,0x10, +0x40,0x63,0x6B,0x40,0x63,0xA0,0xE7,0xFF,0xE9,0xA6,0x53,0x60,0x64,0x4E,0xF6,0x10, +0x5C,0x63,0x04,0x4F,0x35,0x10,0xFD,0x21,0x00,0xC8,0x9E,0xE2,0x8F,0x29,0x8E,0xEF, +0x0F,0x39,0x92,0x43,0x23,0xCB,0x43,0x39,0xD8,0x0B,0x77,0x01,0x5F,0x39,0x04,0x43, +0x7B,0xCD,0x0F,0x77,0x01,0x0F,0xA1,0x0A,0x4F,0x76,0x10,0x0F,0x41,0x06,0x43,0x9B, +0x7C,0x9E,0xC1,0x0B,0xDC,0x01,0x8F,0x6A,0x43,0x3E,0xCD,0x5E,0xD6,0x00,0x5F,0x39, +0x06,0x0F,0x01,0x02,0x0F,0x3C,0x01,0x0A,0xF7,0x00,0x8F,0x37,0x0F,0x3B,0x00,0xD7, +0xB6,0xFB,0x94,0x9E,0xA1,0x5E,0xB5,0x00,0xD7,0x55,0xF9,0xA5,0x98,0x61,0xE7,0xFF, +0xCC,0xC4,0x13,0x6B,0x04,0x13,0x4B,0x01,0xC3,0x00,0x10,0x01,0x43,0x5A,0xDB,0x9A, +0xE0,0xFF,0x18,0x0D,0x2C,0xE4,0x00,0x00,0x4F,0x4F,0x37,0x10,0x43,0x99,0xC4,0x8F, +0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0x4F,0x37,0x10,0x9E,0xE1,0x9F,0x22,0x5E,0xF7, +0x00,0x43,0x99,0xC4,0x8F,0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0xD7,0x57,0xFE,0xEC, +0xC3,0x20,0x10,0x01,0x12,0x8E,0x00,0xFF,0x39,0x0B,0xF2,0x9B,0xA0,0x8B,0x19,0x8B, +0xCA,0xE4,0x00,0x01,0x3D,0x1F,0x98,0x02,0x12,0xF8,0xFE,0x12,0xB8,0xFF,0x11,0x98, +0x01,0x13,0x58,0x00,0x0D,0x1C,0x02,0x21,0x04,0x5E,0x43,0x8C,0xDB,0x8F,0x9A,0x4F, +0x9C,0x10,0x8F,0x8A,0x0F,0x9C,0x02,0x41,0x8C,0xDB,0xE4,0x00,0x00,0xCD,0x4D,0xBA, +0x10,0x43,0x9A,0xDC,0x8D,0xAA,0x4F,0x9C,0x10,0x0D,0xAD,0x02,0x8F,0x8A,0x0F,0x9C, +0x02,0x8F,0x8D,0xE7,0xFF,0xFF,0xC9,0x21,0x04,0x5A,0x41,0xB7,0x64,0x4D,0xAD,0x10, +0x8D,0xAA,0x0D,0xAD,0x02,0xD5,0xBC,0x01,0x94,0xE4,0x00,0x00,0x65,0x4D,0xB7,0x10, +0x42,0xD7,0xDC,0x8D,0xBE,0x4E,0xD6,0x10,0x0D,0xAD,0x02,0x8E,0xDE,0x0E,0xD6,0x02, +0x8E,0xCD,0xD6,0xDC,0x00,0xC8,0x43,0x57,0x64,0x4F,0x5A,0x10,0x8F,0x5E,0x0F,0x9A, +0x02,0x8F,0x8D,0xE4,0x00,0x00,0x0D,0x8B,0x8D,0x8B,0x57,0x9E,0xE1,0x5E,0xF7,0x00, +0xD6,0xF5,0xFD,0xB8,0x1B,0x58,0x00,0x9F,0xA1,0x1F,0x18,0x30,0x5F,0xBD,0x00,0xD7, +0xB4,0xFB,0x36,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x7A,0xC2,0xE0,0x10,0x01,0x1F, +0x98,0xFF,0xF3,0x57,0x04,0x50,0x1F,0xB8,0xFD,0xC2,0xE0,0x10,0x01,0x1E,0xB8,0xFC, +0x11,0x8E,0x00,0x5D,0x1C,0x00,0x1D,0xB8,0xFE,0xFE,0xF7,0x0B,0xF1,0x9B,0x60,0x8A, +0x9C,0x5F,0xBD,0x00,0x5E,0xB5,0x00,0x9A,0xC2,0x1C,0x78,0xFD,0xE4,0x00,0x00,0xEB, +0x13,0x17,0x01,0xD7,0x1C,0x00,0x76,0x19,0x17,0x00,0x18,0x77,0xFF,0xE4,0x00,0x00, +0xB9,0x23,0x00,0x36,0x1A,0xD7,0x00,0x18,0x17,0xFF,0xE4,0x00,0x00,0x9F,0x23,0x04, +0x56,0x5F,0x40,0x29,0x9F,0x1F,0x4B,0xC2,0x1B,0x1B,0x17,0xFF,0x1B,0xD7,0x00,0xE4, +0x00,0x00,0x75,0xD7,0x0D,0x00,0x8E,0x5F,0x40,0x29,0x1A,0x97,0x00,0x4B,0xDD,0xA8, +0xE4,0x00,0x00,0x4D,0x1F,0xD8,0x01,0x5F,0xDE,0x00,0x23,0x44,0x22,0x9F,0x02,0x5F, +0xD8,0x00,0x1B,0xD7,0x00,0x13,0xD7,0x01,0x23,0x44,0x26,0x9F,0xDE,0xE4,0x00,0x00, +0x0D,0x9F,0xDF,0x5F,0xDE,0x00,0x1B,0xD7,0xFF,0x9F,0x61,0x1E,0xF7,0x30,0x5F,0x7B, +0x00,0xD7,0x6C,0xFC,0x7E,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x8B,0x56,0xF7,0x08, +0xD2,0xE0,0x08,0x6A,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xF3,0x57,0x0B,0x7A,0x9B,0xA0, +0xC2,0xE0,0x10,0x01,0x1E,0xDA,0xFE,0xEA,0x97,0x01,0x56,0x8B,0x78,0x8B,0x9D,0x98, +0x60,0x9A,0xA1,0xE4,0x00,0x01,0xBF,0x12,0xF9,0x00,0xD2,0xE1,0x06,0x99,0xD6,0xD7, +0x06,0x78,0x1D,0x17,0xFF,0x1D,0xB7,0x01,0x1D,0x39,0x02,0x5D,0x08,0x00,0x5D,0xAD, +0x00,0x0F,0xC9,0x02,0x23,0xC4,0xDE,0x13,0x79,0x01,0x43,0x7A,0xDB,0x5F,0x7B,0x00, +0x8D,0xBB,0x8D,0x1B,0x8E,0xFB,0x4D,0xAD,0x10,0x4D,0x08,0x10,0x8D,0xAA,0x8D,0x0A, +0x0F,0xAD,0x02,0x0F,0x88,0x02,0x4E,0xF7,0x10,0x5F,0xBC,0x15,0x8E,0xEA,0x4B,0x9D, +0xE0,0x0F,0x77,0x02,0x5F,0x9C,0x06,0xE4,0x00,0x00,0xCD,0x23,0xC9,0xA2,0x13,0x79, +0x01,0x43,0xBB,0xD3,0x5F,0xBD,0x00,0x43,0x8D,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x43, +0x75,0xDD,0x0F,0xDC,0x02,0x43,0x7A,0xDB,0x5F,0x7B,0x00,0x8D,0xBB,0x4D,0xAD,0x10, +0x8D,0xAA,0x0F,0x8D,0x02,0x8F,0xDC,0x43,0x88,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x8D, +0x1B,0x0D,0xBC,0x02,0x8F,0xB7,0x4D,0x08,0x10,0x8E,0xFB,0x8D,0x0A,0x4F,0xBD,0x10, +0x0F,0x88,0x02,0x8F,0xAA,0x8F,0x8D,0x4E,0xF7,0x10,0x5F,0xDC,0x15,0x8E,0xEA,0x4B, +0x9E,0xE0,0x0F,0x7D,0x02,0x0E,0xF7,0x02,0x5F,0x9C,0x06,0x8F,0x77,0x8B,0xB4,0xE4, +0x00,0x00,0x0F,0x23,0xC0,0x68,0xC3,0x60,0x7C,0xEC,0x20,0x00,0x4D,0x42,0xFB,0xE5, +0xD7,0xB7,0x00,0x68,0x4E,0xF5,0xC4,0x44,0x63,0xBD,0x5C,0x63,0x00,0x9F,0x01,0x1F, +0x39,0x30,0x5E,0xF8,0x00,0xD5,0x97,0xF9,0x15,0xE7,0xFF,0xCD,0xF4,0x1E,0xC1,0x68, +0x10,0x8B,0x00,0x88,0x76,0x98,0xA0,0x99,0xA0,0xE4,0x00,0x77,0xA8,0x89,0x8D,0xC2, +0x80,0x10,0x01,0xE4,0x00,0x01,0x3F,0xCC,0x6C,0x00,0x30,0xEB,0x74,0x08,0x9F,0x42, +0xA3,0x74,0x57,0x7B,0x02,0x13,0x55,0x04,0x13,0x35,0x05,0x13,0x15,0x07,0x23,0x61, +0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x0F,0x01,0x00,0x0F,0x21,0x08,0x0F,0x41,0x04, +0x1C,0x61,0x52,0x98,0xE1,0xE7,0xFF,0xD2,0xE4,0x0F,0x01,0x02,0x0F,0x21,0x0A,0x0F, +0x41,0x06,0x20,0x61,0x14,0x1C,0x61,0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD4,0x54,0x20,0x60,0xCC,0x0B,0x21,0x52,0x0B,0x01,0x54,0xCF,0x39,0x00, +0x07,0xCF,0x18,0x00,0x03,0x9A,0xEA,0x8F,0x19,0x43,0x18,0xB8,0x0F,0x15,0x17,0xE4, +0x00,0x00,0x47,0x8C,0x6E,0x88,0x9A,0x1C,0x63,0x16,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD2,0x4E,0x20,0x60,0x3A,0x9A,0xE1,0x4E,0xF7,0x64,0x45,0xAD,0xBD,0x5D, +0xAD,0x00,0x88,0x76,0x10,0x8B,0x00,0x98,0xA1,0x9D,0x81,0xE4,0x00,0x76,0x64,0x5D, +0x8C,0x00,0x12,0xEE,0x00,0xD6,0xEC,0xFB,0x15,0x88,0x6D,0xE7,0xFF,0xCC,0x70,0x9E, +0x01,0x0F,0x21,0x0E,0x5E,0x10,0x00,0xD7,0x30,0xD8,0x7D,0x88,0x71,0x10,0x8B,0x00, +0x98,0xA1,0xE4,0x00,0x76,0x16,0xED,0x21,0x00,0xFE,0xEE,0xC1,0x00,0xCA,0xEE,0xA1, +0x00,0xCE,0xEE,0x81,0x00,0xD2,0xEE,0x61,0x00,0xD6,0xEE,0x41,0x00,0xDA,0xEE,0x21, +0x00,0xDE,0xEE,0x01,0x00,0xE2,0xED,0xE1,0x00,0xE6,0xED,0xC1,0x00,0xEA,0xED,0xA1, +0x00,0xEE,0xED,0x81,0x00,0xF2,0xED,0x61,0x00,0xF6,0xED,0x41,0x00,0xFA,0xFC,0x21, +0x01,0x00,0x85,0x29,0xC2,0xE0,0x10,0x01,0x1C,0x21,0xA0,0xF3,0x37,0x06,0xA8,0x0D, +0x41,0x5C,0x9A,0xE0,0xE4,0x00,0x00,0x23,0x4F,0x17,0x10,0x1D,0x41,0x00,0x9E,0xE1, +0x8F,0x0A,0x0C,0x18,0x00,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x85,0xC2,0xE0,0x10,0x01, +0xC3,0x60,0x10,0x01,0xEB,0x57,0x04,0x93,0x1D,0x19,0xFF,0x9A,0xE0,0xFF,0x7B,0x04, +0xC8,0xE4,0x00,0x00,0xFB,0x9B,0x80,0xD6,0xE8,0x00,0x4A,0x9F,0x01,0x5F,0x98,0x00, +0x9B,0x00,0x4F,0xB7,0x28,0x4F,0x9C,0x28,0xE4,0x00,0x00,0x5B,0x4F,0xD8,0x08,0x40, +0xDD,0xC4,0x40,0xBC,0xC4,0x1D,0x41,0x58,0x4C,0xC6,0x08,0x8F,0xCA,0x8C,0xDB,0x4C, +0xA5,0x08,0x08,0xC6,0x01,0x8C,0xBB,0x9F,0x01,0x08,0xA5,0x01,0x5F,0x18,0x00,0x40, +0xA6,0x2D,0x0C,0xBE,0xC1,0xD7,0x58,0xFE,0xBD,0x4F,0x97,0x10,0x1F,0xA1,0x58,0x9B, +0x00,0x8F,0x9D,0xE4,0x00,0x00,0x4B,0x4F,0xB8,0x08,0x1F,0xC1,0x58,0x8F,0xBE,0x0C, +0xBC,0xAA,0x0B,0xDD,0xC0,0x9F,0x01,0x4F,0xBE,0xFA,0x5F,0x18,0x00,0x47,0xDD,0xF6, +0x43,0xBE,0xED,0x8F,0xA5,0x0F,0xBC,0xA8,0xD7,0x58,0xFE,0xFD,0x9E,0xE1,0x5F,0x17, +0x00,0xD7,0x38,0xFC,0x25,0x0F,0x41,0x02,0x1F,0x61,0x04,0x9B,0x01,0x9A,0xE0,0xE4, +0x00,0x00,0x39,0x0F,0x9B,0x02,0xD7,0x5C,0x00,0x55,0x8B,0x9A,0xE4,0x00,0x00,0x0D, +0x8A,0xF8,0x9F,0x01,0x9F,0x64,0x5F,0x18,0x00,0x8B,0x5C,0xD7,0x38,0xFF,0x45,0x9F, +0x3F,0xD6,0xF9,0x00,0x76,0x1A,0xE3,0x00,0x18,0x04,0x00,0xE4,0x00,0x00,0x21,0xD7, +0x37,0x00,0x60,0x1A,0xE3,0x00,0x9E,0xE1,0x1A,0xE4,0x00,0x0D,0x41,0x5E,0x1C,0x21, +0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0xB7,0x06,0xA8,0xC2,0xE0,0x10,0x01,0xF3, +0xD7,0x04,0x88,0xC2,0xE0,0x10,0x01,0xC3,0x40,0x10,0x01,0xE9,0x17,0x04,0x93,0xC3, +0x20,0x10,0x01,0x9A,0xE0,0xFF,0x5A,0x04,0xC8,0xFF,0x39,0x06,0x48,0xE4,0x00,0x00, +0xAB,0x4C,0x78,0x08,0x4C,0x98,0x18,0x8C,0x7B,0x8C,0x9C,0x9F,0x01,0x08,0x84,0x01, +0x0C,0x83,0x01,0x5C,0x78,0x00,0xD7,0xC3,0xFF,0x5D,0x9B,0x00,0x4F,0x97,0x28,0x4C, +0x77,0x18,0xE4,0x00,0x00,0x4F,0x43,0x7C,0xC4,0x4C,0x98,0x11,0x4F,0x7B,0x08,0x8C, +0x83,0x8F,0x7A,0x4C,0x84,0x08,0x08,0xBB,0x01,0x8C,0x99,0x9F,0x01,0x08,0x84,0x01, +0x5F,0x18,0x00,0x40,0x85,0x25,0x0C,0x9B,0x01,0xD5,0x18,0xFE,0xED,0x9E,0xE1,0x5E, +0xF7,0x00,0xD6,0xFD,0x00,0xA2,0x4F,0x97,0x30,0x4F,0x77,0x20,0x8F,0x9A,0x8F,0x79, +0x9B,0x00,0xE7,0xFF,0xFF,0x63,0x85,0x29,0xC2,0xE0,0x10,0x01,0x5C,0x63,0x00,0x5C, +0x84,0x00,0xEB,0x97,0x04,0x93,0xC3,0x00,0x10,0x01,0x4F,0xA3,0x28,0xC3,0x20,0x10, +0x01,0x4F,0xC4,0x28,0x9A,0xE0,0xFF,0x18,0x04,0xC8,0xFF,0x39,0x06,0x48,0x4C,0x63, +0x18,0x4C,0x84,0x18,0xE4,0x00,0x00,0x83,0x4F,0x77,0x11,0x41,0x03,0xDC,0x4D,0x08, +0x08,0x8D,0x19,0x43,0x5D,0xBC,0x08,0xA8,0x01,0x4F,0x5A,0x08,0x8F,0x64,0x8F,0x58, +0x4F,0x7B,0x08,0x09,0x1A,0x01,0x8F,0x79,0x8D,0x05,0x0D,0x1A,0x01,0x43,0x5E,0xBC, +0x09,0x1B,0x01,0x4F,0x5A,0x08,0x9E,0xE1,0x8F,0x58,0x5E,0xF7,0x00,0x0B,0x7A,0x01, +0x8F,0x68,0x0F,0x7A,0x01,0xD7,0x97,0xFE,0x1D,0x85,0x29,0x20,0x60,0x2E,0xC2,0xE0, +0x10,0x01,0xEC,0x97,0x01,0x2C,0x85,0x29,0x20,0x60,0x4E,0xC2,0xE0,0x10,0x01,0xEC, +0x97,0x00,0xF4,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x01,0x28,0x85,0x29,0x20,0x60,0x5E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0x98,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0x9C, +0xE4,0x00,0x00,0x5D,0x20,0x64,0x5E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x06,0xB4,0xC2, +0xE0,0x10,0x01,0xEC,0xB7,0x04,0xC4,0xE4,0x00,0x00,0x2F,0x20,0x68,0x4E,0xC2,0xE0, +0x10,0x01,0xEC,0x97,0x04,0xBC,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0x8C,0x85,0x29, +0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0xB8,0x85,0x29,0x5C,0x84,0x04, +0x20,0x60,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x33,0xE4,0x00,0x00,0x3D,0x20, +0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x15,0xE4,0x00,0x00,0x1F,0x20,0x68, +0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x39,0x85,0x29,0x5C,0x84,0x04,0x20,0x60, +0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x00,0xF9,0xE4,0x00,0x00,0x3D,0x20,0x64,0x3E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x31,0xE4,0x00,0x00,0x1F,0x20,0x68,0x2E,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x01,0x11,0x85,0x29,0x5C,0x84,0x04,0x20,0x68,0x2E,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x01,0x13,0x85,0x29,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D, +0x41,0x30,0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1, +0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08, +0x0E,0xA1,0x04,0x0E,0xC1,0x00,0x20,0x65,0x70,0x20,0x60,0x4C,0xD0,0x62,0x04,0x42, +0x99,0xC0,0x89,0xEE,0xD0,0x63,0x06,0x66,0xE4,0x00,0x01,0x71,0xC2,0xE0,0x10,0x01, +0xEE,0xD7,0x00,0xF6,0xC2,0xE0,0x10,0x01,0xEE,0xB7,0x01,0x2A,0xC2,0xE0,0x10,0x01, +0xEE,0x97,0x04,0x9A,0xC2,0xE0,0x10,0x01,0xEE,0x77,0x04,0x9E,0xC2,0xE0,0x10,0x01, +0xE9,0xF7,0x01,0x33,0xC2,0xE0,0x10,0x01,0x9A,0x00,0xE9,0xD7,0x00,0xF9,0x99,0xA0, +0xC2,0xE0,0x10,0x01,0x9A,0x21,0xED,0x77,0x01,0x2E,0x9A,0x45,0x89,0x90,0xE4,0x00, +0x00,0xD9,0xC2,0xE0,0x10,0x01,0xEE,0x97,0x06,0xB6,0xC2,0xE0,0x10,0x01,0xEE,0x77, +0x04,0xC6,0xC2,0xE0,0x10,0x01,0x99,0xA0,0xE9,0xF7,0x01,0x15,0x9A,0x00,0xC2,0xE0, +0x10,0x01,0x8A,0x2D,0xE9,0xD7,0x01,0x31,0x9A,0x40,0x99,0x61,0x89,0x90,0x9A,0xA0, +0xE4,0x00,0x00,0x71,0xC2,0xE0,0x10,0x01,0xEE,0x97,0x04,0xBE,0xC2,0xE0,0x10,0x01, +0xEE,0x17,0x04,0xBA,0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01,0x39,0xC2,0xE0,0x10,0x01, +0x99,0x81,0xE9,0xD7,0x01,0x11,0x9A,0x21,0xC2,0xE0,0x10,0x01,0x9A,0x40,0xE9,0xB7, +0x01,0x13,0x99,0x61,0x9A,0x60,0x8A,0xAC,0x9A,0xC1,0x99,0x41,0xE4,0x00,0x00,0x55, +0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01,0x33,0xC2,0xE0,0x10,0x01,0xE9,0xD7,0x00,0xF9, +0x99,0xA0,0x9A,0x40,0x9A,0x00,0x9A,0x80,0x9A,0xA0,0x8A,0x2D,0x89,0x72,0x8A,0x70, +0x89,0x94,0x8A,0xD5,0x99,0x40,0x88,0x6A,0xE4,0x00,0xC6,0x08,0x88,0x6A,0xE4,0x00, +0xC6,0x8A,0x88,0x76,0xE4,0x00,0xD6,0x7C,0x88,0x75,0xE4,0x00,0xD6,0xD6,0x88,0x74, +0xE4,0x00,0xC7,0xEA,0x88,0x73,0xE4,0x00,0xC8,0x36,0x88,0x72,0xE4,0x00,0xC7,0x38, +0x88,0x71,0xE4,0x00,0xC7,0x64,0x88,0x6A,0xE4,0x00,0xD7,0xF8,0x88,0x70,0xE4,0x00, +0xD8,0x52,0x98,0x60,0xE4,0x00,0xD8,0xA0,0x98,0x60,0xE4,0x00,0xD8,0xEE,0x98,0x60, +0xE4,0x00,0xD9,0x3C,0x98,0x60,0xE4,0x00,0xD9,0x8A,0x88,0x6F,0xE4,0x00,0xC8,0x30, +0x88,0x6E,0xE4,0x00,0xC8,0x5E,0x88,0x6D,0xE4,0x00,0xC8,0x92,0x88,0x6C,0xE4,0x00, +0xC8,0xAC,0x88,0x6B,0x0E,0xC1,0x02,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E, +0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D, +0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21, +0x38,0xE4,0x00,0xC5,0xF5,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x04,0xB4,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xF8,0x77,0x04,0xB4,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x04, +0xB4,0x9F,0x01,0xFB,0x17,0x04,0xB4,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06, +0xA9,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x06,0xA9,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xF3,0x17,0x06,0xA9,0x9F,0x01,0xFB,0x17,0x06,0xA9,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xEC,0x77,0x01,0x0C,0x85,0x29,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x00,0xFC,0x0C, +0x1A,0x00,0x9A,0xE1,0xC3,0x20,0x10,0x01,0xFF,0x39,0x01,0x18,0x0E,0xF9,0x00,0xC3, +0x00,0x10,0x01,0xFF,0x18,0x04,0xA0,0x0C,0x18,0x00,0x0C,0x1A,0x04,0x0E,0xF9,0x04, +0x0C,0x18,0x04,0x0C,0x1A,0x08,0x0E,0xF9,0x08,0x0C,0x18,0x08,0x0C,0x1A,0x0C,0x0E, +0xF9,0x0C,0x0C,0x18,0x0C,0xC3,0x00,0x10,0x01,0xEE,0xF8,0x01,0x34,0x85,0x29,0x9C, +0x38,0x0D,0x41,0x04,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0x5C,0xA5,0x00,0x5C, +0xC6,0x00,0xF3,0x38,0x06,0xAA,0xFE,0xF7,0x01,0x34,0xD7,0x25,0x00,0x6A,0xF8,0xB8, +0x06,0xAA,0x9B,0x01,0x0F,0x17,0x00,0xC3,0x80,0x10,0x01,0xC3,0x00,0x10,0x01,0x0F, +0x37,0x02,0xFF,0x9C,0x01,0x18,0xFF,0x18,0x00,0xFC,0x23,0x24,0x9A,0x0B,0xA3,0x00, +0x4F,0x46,0x18,0x43,0x78,0xD4,0x0F,0xBB,0x00,0x0B,0xA4,0x00,0x0F,0xBB,0x04,0x8F, +0x5C,0x0F,0x3A,0x00,0x0F,0x3A,0x04,0x40,0xA5,0x35,0x20,0xA4,0x1A,0x0C,0x17,0x00, +0x4E,0xE6,0x18,0x8E,0xF8,0x0C,0xF7,0x02,0x08,0xA3,0x00,0x0D,0x17,0x02,0x0F,0xB7, +0x06,0x0F,0x37,0x06,0x42,0xE7,0x2D,0x4C,0xF7,0xFA,0x46,0xE7,0xBE,0x0B,0x44,0x00, +0x40,0xF7,0x3D,0x43,0x39,0xD5,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0x41, +0x08,0x2D,0x43,0xBD,0xD5,0x4F,0xC8,0xFA,0x4F,0x7D,0xFA,0x45,0x1E,0x46,0x47,0xBB, +0xEE,0x43,0xC8,0xF5,0x43,0x7D,0xDD,0x43,0xC7,0xF3,0x43,0x7B,0xBB,0x9B,0x21,0x8F, +0x7E,0x9A,0xE3,0xE4,0x00,0x00,0x11,0x8F,0x37,0x9E,0xE2,0xD7,0x3B,0xFF,0xE1,0xC3, +0x20,0x10,0x01,0x4E,0xF7,0x09,0x53,0x40,0x1E,0x9E,0xFF,0x5E,0xF7,0x06,0xEE,0xF9, +0x06,0xB8,0xC3,0x20,0x10,0x01,0x42,0xF7,0xD1,0xEF,0x39,0x01,0x0E,0x42,0xF7,0xBB, +0x43,0x39,0xBD,0xC2,0xE0,0x10,0x01,0x5F,0x23,0x11,0x20,0x00,0x1B,0x53,0x20,0x19, +0xEF,0x37,0x04,0xC0,0xC3,0xA0,0x10,0x01,0xEC,0xB7,0x04,0xC2,0x4C,0xC6,0x08,0x9A, +0xE0,0xFF,0xBD,0x04,0xA0,0xCB,0x40,0x10,0x00,0x43,0x26,0xBC,0x4F,0x39,0x10,0x43, +0x7C,0xCC,0xC9,0x40,0xA0,0x00,0x0D,0x1B,0x02,0x0F,0xDB,0x02,0x43,0x68,0x53,0xCF, +0xDE,0x00,0x0A,0x8F,0xC5,0x43,0xDB,0xF0,0x43,0x7D,0xCC,0x0F,0xDB,0x00,0x5F,0xD7, +0x00,0x23,0xC0,0x92,0x43,0xD8,0xCC,0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E,0x02, +0x0B,0xC3,0x00,0x43,0x3E,0xCD,0x43,0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F,0x23, +0x01,0xE4,0x00,0x00,0x43,0x43,0xD8,0xCC,0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E, +0x02,0x0B,0xC4,0x00,0x43,0x3E,0xCD,0x43,0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F, +0x24,0x01,0x43,0x66,0xBC,0x4F,0x7B,0x10,0x43,0xD8,0xDC,0x0F,0x3E,0x00,0x43,0x3C, +0xDC,0x8F,0x7D,0x0F,0xD9,0x02,0x0D,0x1B,0x02,0x0F,0x79,0x02,0x43,0x68,0xDB,0x43, +0x7B,0xD0,0x43,0x7E,0xDD,0x0F,0x79,0x00,0x9E,0xE1,0xD2,0xE2,0xFB,0x7E,0x0D,0x41, +0x06,0x9C,0x28,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0x95,0xC2,0xE0,0x10, +0x01,0x5C,0x63,0x04,0xEC,0x77,0x04,0x93,0x56,0xE3,0x03,0x5E,0xE0,0x09,0x4A,0xE1, +0x01,0x4C,0x63,0x11,0x8C,0x77,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x04,0x88,0xC2,0xE0, +0x10,0x01,0xF8,0xB7,0x06,0xA8,0xC2,0xE0,0x10,0x01,0xEC,0xD7,0x04,0xB0,0xC2,0xE0, +0x10,0x01,0xEC,0xF7,0x06,0xAD,0xC2,0xE0,0x10,0x01,0x0B,0x01,0x01,0xED,0x17,0x06, +0xB1,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x04,0x91,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x06,0xAE,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x06,0xAE,0xC2,0xE0,0x10, +0x01,0xF2,0xF7,0x06,0xA8,0x9E,0xFF,0x5E,0xF8,0x15,0x48,0x61,0x01,0x85,0x29,0x9C, +0x38,0x0D,0x21,0x04,0xE7,0xFF,0xFF,0xC2,0x9A,0xE0,0x20,0x60,0x4E,0xC2,0xE0,0x10, +0x01,0xF3,0x17,0x06,0xAE,0x9F,0x01,0xFB,0x17,0x06,0xAE,0x9A,0xE1,0x88,0x77,0x0D, +0x21,0x06,0x9C,0x28,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x04,0x93,0xC2,0xE0, +0x10,0x01,0xC3,0x20,0x10,0x01,0xF3,0x57,0x06,0xAE,0xFF,0x39,0x04,0xC8,0x9A,0xE0, +0x4F,0x5A,0x28,0xE4,0x00,0x00,0x39,0x4F,0x77,0x08,0x8F,0x63,0x0B,0x9B,0x00,0x43, +0x7A,0xBC,0x9E,0xE1,0x4F,0x7B,0x08,0x5E,0xF7,0x00,0x8F,0x79,0x0F,0x9B,0x01,0xD7, +0x17,0xFF,0x45,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x18,0x01,0x06, +0x89,0x43,0x18,0x01,0x07,0xE7,0xFF,0xF2,0x5C,0x1C,0x61,0x06,0x1C,0x81,0x07,0xE7, +0xFF,0xF0,0x2A,0x10,0x61,0x06,0x10,0x81,0x07,0xE7,0xFF,0xF3,0x5E,0xC2,0xE0,0x10, +0x01,0x13,0x41,0x06,0xEB,0x37,0x04,0x93,0x13,0x61,0x07,0xC3,0x00,0x10,0x01,0x9A, +0xE0,0xFF,0x18,0x04,0xC8,0x4F,0x5A,0x28,0x4F,0x7B,0x28,0x9B,0x82,0xE4,0x00,0x00, +0x59,0x43,0xDA,0xBC,0x4F,0xDE,0x08,0x8F,0xD8,0x4F,0xB7,0x08,0x09,0x1E,0x00,0x8F, +0xAA,0x43,0xDB,0xBC,0x9E,0xE1,0x4F,0xDE,0x08,0x5E,0xF7,0x00,0x8F,0xD8,0x0B,0xDE, +0x00,0x8F,0xC8,0x43,0xDE,0xE0,0x0F,0xDD,0x01,0xD7,0x37,0xFE,0xC5,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x1C,0x21,0xC8,0x0D,0x41,0x30,0x0D,0x61, +0x2C,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x5D,0xA5,0x04,0x0D,0x21,0x34,0x50,0xA0,0x20, +0x0D,0x81,0x28,0x89,0x43,0x89,0x64,0x5D,0xC6,0x04,0x88,0x61,0xC0,0x98,0x00,0x21, +0xFC,0x84,0xB4,0x94,0x9C,0x86,0xE4,0x00,0x0B,0xA6,0xC2,0xE0,0x10,0x01,0xC3,0x00, +0x10,0x01,0xEB,0x77,0x06,0xAD,0xC2,0xE0,0x10,0x01,0xF3,0x58,0x04,0x88,0xEB,0x97, +0x06,0xB1,0x9F,0x61,0x9F,0x81,0x5F,0x7B,0x04,0x5F,0x9C,0x04,0xCC,0xAD,0x00,0x18, +0xC2,0xE0,0x10,0x01,0x43,0xDB,0xE4,0xEA,0xF7,0x04,0x91,0x4F,0xDE,0x18,0x0B,0x01, +0x01,0x8F,0xD7,0x43,0xDE,0xD3,0x43,0xC5,0xF0,0x5F,0xDE,0x04,0xD7,0x1E,0x00,0x69, +0x0F,0x0A,0x01,0x9B,0x20,0xE4,0x00,0x00,0x4D,0x9B,0x00,0x89,0x81,0x8B,0x38,0x4F, +0xB8,0x08,0x5D,0x18,0x00,0x8F,0xAC,0x0B,0xBD,0x01,0xD7,0xBE,0x00,0x8D,0x0F,0xAA, +0x01,0x9F,0x01,0x8B,0x28,0x5F,0x02,0x09,0x23,0xFF,0x9D,0x43,0x1C,0xDC,0x0B,0x6A, +0x01,0x4F,0x18,0x18,0x43,0x5B,0xD3,0xCC,0xCE,0x00,0x18,0x43,0x78,0xBC,0x43,0x7A, +0xDB,0xD4,0xDB,0x01,0x11,0xE4,0x00,0x00,0x2F,0x43,0x77,0xC4,0x43,0x7B,0xD3,0xD7, +0x66,0x00,0x41,0xD4,0xBB,0x00,0x85,0x9E,0xE1,0x5E,0xF7,0x04,0xC2,0xE0,0x7F,0xEA, +0x23,0xFF,0xA5,0x0E,0xEB,0x01,0x0D,0xC1,0x22,0x0A,0xEA,0x01,0x0D,0xA1,0x26,0x4E, +0xF7,0x40,0x0D,0x81,0x2A,0x47,0x39,0xBD,0x0D,0x61,0x2E,0x0F,0x2A,0x01,0x0D,0x21, +0x36,0x0D,0x41,0x32,0x1C,0x21,0x38,0x85,0x29,0x9C,0x30,0x5C,0x63,0x00,0x0D,0x41, +0x08,0x0D,0x61,0x04,0x4C,0x63,0x08,0xC2,0xF8,0x00,0x21,0x0D,0x21,0x0C,0xFE,0xF7, +0xB6,0xFA,0x99,0x40,0x8E,0xE3,0x09,0x77,0x01,0x88,0x6A,0x88,0x8B,0x9D,0x41,0xE4, +0x00,0xC0,0x26,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x9E,0x0D,0x61,0x06,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0xDD, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0xF0,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0xD8, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0xE4,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF3, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF8, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0xDD,0xC2,0xE0,0x10,0x01,0xF8,0x17, +0x06,0xD8,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06,0xF0,0xC2,0xE0,0x10,0x01,0xF8,0x77, +0x06,0xE4,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF3,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF8,0x24,0x6C,0x1F,0xE7,0xFF,0xFE, +0x99,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x5C,0x63,0x04,0xEC,0x77, +0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF8,0xF3,0x78,0x06,0xD8,0xC3,0x40, +0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xFF,0x5A,0x06,0xF0,0xFF,0x39, +0x06,0xE4,0x23,0x60,0x2C,0xEB,0x78,0x06,0xF3,0xD7,0x63,0x00,0xA1,0x13,0x5A,0x00, +0xEC,0x78,0x06,0xF3,0x1B,0x59,0x00,0x9B,0x01,0xEF,0x17,0x06,0xF8,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xEB,0x17,0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0xDD,0x5E, +0xF8,0x1F,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0xD8,0x5E, +0xE0,0x5B,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x06,0xD8,0x27, +0x08,0x7B,0x9F,0x01,0xFB,0x17,0x06,0xD8,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06,0xF0, +0x9C,0x61,0x54,0x63,0x03,0xF8,0x77,0x06,0xF0,0xE7,0xFF,0xFD,0x61,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xF8,0x77,0x01,0x3A,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x06,0xE0,0xC2, +0xE0,0x10,0x01,0xEC,0xB7,0x06,0xD4,0xC2,0xE0,0x10,0x01,0xEC,0xD7,0x06,0xEC,0x85, +0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xEE,0x5C,0x63,0x04, +0xEC,0x77,0x06,0xDB,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0xF4,0x4E,0xF7,0x08,0x8E, +0xF8,0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xD6,0x0A,0xF7,0x01,0xCB,0x20,0xFF,0xFF, +0x4E,0xF7,0x08,0x8E,0xF8,0x0B,0x17,0x01,0xD7,0x19,0x00,0x5E,0x0C,0x77,0x01,0xE4, +0x00,0x00,0x4B,0xC3,0x20,0x10,0x01,0xEB,0x39,0x08,0xE3,0xC7,0x39,0x20,0x00,0x23, +0x20,0x54,0xCF,0x18,0x00,0x07,0xCC,0x63,0x00,0x03,0x9B,0x2A,0x8F,0x03,0x43,0x18, +0xC8,0x0F,0x17,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0x9C,0x38,0xC3,0x20,0x10,0x01, +0x0E,0xC1,0x04,0xF3,0x17,0x01,0x3A,0x4E,0xF8,0x08,0x9E,0xE8,0xC6,0xF7,0x03,0xF8, +0x1E,0xC1,0x08,0x88,0x81,0xEF,0xB9,0x06,0xD6,0x40,0x21,0xBD,0x9B,0x20,0x8A,0xE1, +0x8B,0x59,0xE4,0x00,0x00,0x43,0x4F,0x99,0x08,0x43,0x7D,0xE4,0x8F,0x97,0x0B,0x7B, +0x01,0x0F,0x7C,0x01,0xCB,0x80,0xFF,0xFF,0xD7,0x7C,0x00,0x4E,0x9F,0x41,0x5F,0x5A, +0x00,0x9F,0x21,0x5F,0x79,0x00,0xD7,0x1B,0xFF,0x05,0xC3,0x60,0x10,0x01,0xFF,0x7B, +0x06,0xE6,0x0C,0x1B,0x01,0x9B,0x20,0x23,0x40,0xE0,0xE4,0x00,0x00,0x8F,0x1F,0x99, +0x01,0x4F,0x39,0x08,0x5F,0x9C,0x00,0x8F,0x37,0x8B,0x5C,0xE4,0x00,0x00,0x3D,0x4F, +0xBA,0x08,0x0B,0xD9,0x01,0x8F,0xB7,0x09,0x1D,0x01,0xD7,0xC8,0x00,0x51,0x0D,0x19, +0x01,0x0F,0xDD,0x01,0x9F,0x41,0x5F,0x5A,0x00,0xD7,0x58,0xFF,0x36,0x8B,0x3C,0xD7, +0x38,0xFE,0x7E,0x0B,0x17,0x01,0x0A,0xF7,0x03,0x8E,0xF8,0x4E,0xF7,0x0A,0x0E,0xFB, +0x01,0x08,0x7B,0x01,0x88,0x24,0x0E,0xC1,0x06,0x9C,0x28,0x85,0x29,0x5C,0x63,0x04, +0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xEE,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0xF4, +0x4E,0xF7,0x08,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0A,0xF7,0x01,0xEF,0x18,0x06,0xD6, +0x4E,0xF7,0x08,0x8E,0xF8,0x0A,0xF7,0x01,0x5E,0xE3,0x1F,0x48,0x61,0x01,0x85,0x29, +0x5C,0x63,0x04,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0xDB,0x5E,0xE3,0x1F,0x48,0x61, +0x01,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x61,0x14,0x0E,0xC1,0x04,0x0D,0x21,0x1C,0x0D, +0x41,0x18,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0xC3,0x20,0x10,0x01,0xC2, +0xE0,0x10,0x01,0xF3,0x59,0x06,0xF4,0xF2,0xF7,0x01,0x3A,0x9F,0x41,0x5F,0x5A,0x00, +0x43,0x1A,0xB9,0x43,0x18,0xBB,0x43,0x1A,0xC5,0x5F,0x18,0x00,0xFB,0x19,0x06,0xF4, +0x1E,0xC1,0x20,0x89,0x61,0xD3,0x00,0x04,0xA6,0x4F,0x17,0x08,0x9F,0x08,0xC7,0x18, +0x03,0xF8,0x89,0x81,0x40,0x21,0xC5,0xC3,0x00,0x10,0x01,0x8B,0x61,0xEF,0x58,0x06, +0xD6,0x9B,0x00,0xE4,0x00,0x00,0x29,0x4F,0x38,0x08,0x9F,0x01,0x43,0x9B,0xCC,0x8F, +0x3A,0x0B,0x39,0x01,0x0F,0x3C,0x01,0x5F,0x38,0x00,0xD6,0xF9,0xFF,0x6D,0xC3,0x00, +0x10,0x01,0xEF,0x98,0x06,0xEE,0x9B,0x00,0x8B,0x3C,0xE4,0x00,0x00,0x93,0x1F,0xB8, +0x01,0x4F,0x18,0x08,0x5F,0xBD,0x00,0x8F,0x1B,0x8B,0x5D,0xE4,0x00,0x00,0x61,0x4F, +0xDA,0x08,0x09,0x58,0x01,0x41,0x1B,0xF4,0x08,0x68,0x01,0xD5,0x43,0x00,0xD9,0x0C, +0x78,0x01,0x0D,0x48,0x01,0x8F,0xDC,0x09,0x19,0x01,0x09,0x5E,0x01,0x0D,0x59,0x01, +0x55,0x08,0xFF,0x0D,0x1E,0x01,0x9F,0x41,0x5F,0x5A,0x00,0xD7,0x57,0xFE,0xA6,0x9F, +0x22,0x8B,0x1D,0xD7,0x17,0xFD,0xDE,0x88,0x2C,0x99,0x40,0xC1,0x80,0x10,0x01,0xC1, +0xA0,0x10,0x01,0xC1,0xC0,0x10,0x01,0xEF,0x0D,0x06,0xEE,0xF2,0xEE,0x06,0xF4,0x4E, +0xF7,0x08,0x8E,0xF8,0xEF,0x0C,0x06,0xE2,0x0A,0xF7,0x01,0x4E,0xF7,0x08,0x8E,0xF8, +0x88,0x6A,0x08,0x97,0x01,0x9D,0x41,0xE4,0x00,0xB8,0xB6,0x5D,0x4A,0x00,0xD1,0x44, +0xFE,0xCE,0x88,0x2B,0x0E,0xC1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12, +0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x1C,0x21, +0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1, +0x04,0x0D,0x21,0x14,0xF8,0x17,0x06,0xF4,0x99,0x40,0xC1,0x60,0x10,0x01,0xC1,0x80, +0x10,0x01,0x89,0xB7,0xEF,0x0C,0x06,0xEE,0xF2,0xED,0x06,0xF4,0x4E,0xF7,0x08,0x8E, +0xF8,0xEF,0x0B,0x06,0xE2,0x0A,0xF7,0x01,0x4E,0xF7,0x08,0x8E,0xF8,0x88,0x6A,0x08, +0x97,0x01,0x9D,0x41,0xE4,0x00,0xB7,0xDC,0x5D,0x4A,0x00,0xD1,0x44,0xFE,0xCE,0xC2, +0xE0,0x10,0x01,0xF3,0x37,0x01,0x3A,0xC2,0xE0,0x10,0x01,0x9B,0x5F,0xEF,0x17,0x06, +0xD6,0x9A,0xE0,0xE4,0x00,0x00,0x1D,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02,0x5E,0xF7, +0x00,0xD6,0xF9,0xFF,0xB6,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41, +0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x8B,0x03,0x56,0xE3,0x03,0x22,0xE0, +0x98,0x9B,0x04,0x42,0xF8,0xBD,0x5F,0x44,0x00,0x5E,0xE5,0x17,0x4B,0x37,0x28,0x9A, +0xE0,0xE4,0x00,0x00,0x13,0x1B,0x58,0x00,0x9E,0xE1,0x43,0x03,0xBC,0xD6,0xF9,0xFF, +0xC6,0x40,0xA5,0xBD,0x4E,0xE4,0x80,0x4F,0x64,0xC0,0x47,0x7B,0xBD,0x4E,0xE4,0x40, +0x47,0x7B,0x25,0x4F,0x45,0x11,0x47,0x7B,0xBD,0x9A,0xE0,0xE4,0x00,0x00,0x17,0x8F, +0x38,0x9E,0xE1,0x0F,0x79,0x00,0x4F,0x37,0x10,0xD6,0xFA,0xFF,0xB6,0x8F,0x19,0x9A, +0xE0,0x54,0xA5,0x03,0x5C,0x84,0x00,0xE4,0x00,0x00,0x19,0x43,0x37,0xC4,0x9E,0xE1, +0x18,0x99,0x00,0xD4,0xB7,0xFF,0xC5,0x85,0x29,0x46,0xE4,0x1D,0x56,0xF7,0x03,0x22, +0xE0,0x82,0x9A,0xFC,0x47,0x45,0xBC,0x9A,0xE0,0xE4,0x00,0x00,0x51,0x43,0x03,0xBC, +0x43,0x24,0xBC,0x9E,0xE1,0x13,0x39,0x00,0x1B,0x38,0x00,0xE4,0x00,0x00,0x0D,0x9A, +0xE0,0xD6,0xE5,0xFF,0x66,0xE4,0x00,0x00,0x63,0x0F,0x39,0x02,0x9E,0xE4,0x0F,0x38, +0x00,0x43,0x03,0xBC,0x43,0x24,0xBC,0xD6,0xFA,0xFF,0x96,0x9A,0xE0,0x54,0xA5,0x03, +0xE4,0x00,0x00,0x25,0x43,0x57,0xC4,0x43,0x77,0xCC,0x9E,0xE1,0x13,0x7B,0x00,0x1B, +0x7A,0x00,0xD4,0xB7,0xFF,0x95,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x21,0x1C,0x0D,0x41, +0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04, +0x0E,0x01,0x00,0xE4,0x00,0x62,0x06,0xC1,0x60,0x10,0x01,0xC0,0x60,0x00,0x21,0xFD, +0x4B,0x00,0xCC,0xFC,0x63,0xB0,0xE4,0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC, +0x84,0x00,0x00,0xFC,0xA5,0x01,0xD8,0x40,0xA5,0x25,0xE4,0x00,0x5C,0xDC,0x0C,0x0A, +0x01,0x0C,0x0A,0x03,0x0C,0x0A,0x05,0x0C,0x0A,0x08,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x00,0xBB,0x0C,0x0A,0x0C,0x9A,0xEA,0xC1,0xA0,0x10,0x01,0x0E,0xEA,0x11,0xEC,0x0D, +0x07,0x00,0x50,0x60,0x26,0xE4,0x00,0x1F,0x86,0xC8,0x80,0xE1,0x00,0x98,0x60,0xE4, +0x00,0x2A,0xD6,0x98,0x63,0xE4,0x00,0x29,0xF2,0xE4,0x00,0x03,0x54,0xC2,0xE0,0x10, +0x01,0x9B,0x3C,0xF3,0x17,0x08,0x83,0x47,0x18,0xCC,0xFC,0x60,0x0B,0xB8,0xFB,0x17, +0x08,0x83,0x04,0x80,0x5B,0xC8,0x84,0x8D,0x80,0xE4,0x00,0x2A,0x26,0x98,0x61,0xC1, +0x80,0x10,0x01,0xE4,0x00,0x2A,0x1A,0x99,0xC1,0xC1,0x60,0x10,0x01,0xC1,0xE0,0x10, +0x01,0xC2,0x00,0x10,0x01,0xE4,0x00,0x29,0xE6,0x0E,0xEA,0x0E,0x22,0xE0,0x2C,0xD2, +0xE1,0x0A,0x4E,0xE4,0x00,0x00,0xC5,0xE4,0x00,0x5B,0xCA,0xE4,0x00,0x29,0xFA,0x0C, +0x6A,0x13,0xE4,0x00,0x29,0xEC,0x0C,0x6A,0x17,0xE4,0x00,0x29,0xDE,0x0C,0x6A,0x1B, +0xE4,0x00,0x29,0xD0,0x0C,0x6A,0x19,0xEA,0xEC,0x06,0xFF,0xC6,0xF7,0xFF,0xDF,0xEE, +0xEC,0x06,0xFF,0xEA,0xEC,0x06,0xFF,0xC6,0xF7,0xFF,0x7F,0xEE,0xEC,0x06,0xFF,0x0D, +0xCA,0x0C,0xEA,0xEB,0x08,0xE3,0x52,0xF7,0x80,0xEC,0x0D,0x07,0x00,0xEE,0xEB,0x08, +0xE3,0x98,0x61,0xE4,0x00,0x1A,0x06,0x98,0x60,0xE4,0x00,0x30,0x3A,0xE4,0x00,0x2B, +0x32,0xE4,0x00,0x01,0xCF,0xEE,0xED,0x07,0x02,0x22,0xE0,0x2C,0xD2,0xE1,0x06,0xE6, +0xE4,0x00,0x00,0x9B,0x98,0x61,0xE4,0x00,0x1A,0x3E,0xD0,0x61,0x06,0x76,0xE4,0x00, +0x1C,0x90,0x20,0x64,0xAA,0xE4,0x00,0x1C,0x6E,0xEA,0xEB,0x08,0xE3,0xFF,0x00,0xFF, +0x7F,0x46,0xF7,0xC4,0xEC,0x0F,0x08,0xBC,0xEE,0xEB,0x08,0xE3,0xED,0xCD,0x07,0x00, +0xE4,0x00,0x64,0x14,0xE4,0x00,0x63,0xB4,0xE4,0x00,0x01,0x41,0xE4,0x00,0x1C,0x70, +0x20,0x67,0x54,0x98,0x61,0xE4,0x00,0x1B,0xD0,0xE4,0x00,0x01,0x1F,0x0A,0xEA,0x01, +0xC6,0xF7,0x01,0x00,0xD2,0xE0,0x04,0x22,0xE4,0x00,0x28,0x80,0x0A,0xEA,0x13,0x0B, +0x0A,0x11,0x40,0x63,0xBD,0x5E,0xE3,0x04,0xD7,0x17,0x03,0x85,0xE4,0x00,0x28,0x58, +0x0C,0x6A,0x13,0x0A,0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4,0x00,0x5D, +0x3A,0xE4,0x00,0x64,0x1E,0xE4,0x00,0x63,0x12,0xEE,0xEF,0x08,0xBE,0xEE,0xF0,0x08, +0xE8,0xE4,0x00,0x5E,0x26,0x98,0x61,0xE4,0x00,0x8A,0x06,0xE4,0x00,0x5E,0x9E,0x98, +0x61,0xE4,0x00,0x5E,0xDE,0xE4,0x00,0x60,0x92,0xE4,0x00,0x8B,0x66,0xEA,0xEB,0x08, +0xE3,0x56,0xF7,0x80,0x22,0xE0,0x90,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00,0x22,0xE3, +0xE4,0x0A,0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0x0D,0xCA,0x0C,0xEC,0x0D, +0x07,0x00,0x98,0x61,0xE4,0x00,0x18,0x24,0x0E,0xEA,0x0A,0xFC,0x60,0x1E,0x7F,0x9E, +0xE1,0x0E,0xEA,0x08,0x0C,0x8A,0x0A,0xE4,0x00,0x28,0xB6,0xE4,0x00,0x27,0x86,0xE7, +0xFF,0xFD,0x2D,0xE4,0x00,0xB2,0x4F,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00,0xE4, +0x00,0xB3,0xAA,0x98,0x6D,0xE4,0x00,0xA4,0x24,0x98,0x60,0xFC,0x80,0x3E,0x0C,0xE4, +0x00,0xA6,0x68,0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0xA6,0x54,0x98,0x60,0x50, +0x80,0x14,0xE4,0x00,0xAB,0x4E,0x98,0x60,0x98,0x8C,0xE4,0x00,0xAA,0x70,0x98,0x61, +0x50,0x80,0x14,0xE4,0x00,0xAB,0x2C,0x98,0x61,0x98,0x8C,0x99,0x40,0xE4,0x00,0xAA, +0x4A,0x88,0x6A,0x98,0x80,0x9D,0x41,0xE4,0x00,0xB0,0xB6,0x5D,0x4A,0x00,0xD1,0x44, +0xFF,0x9E,0x98,0x60,0x05,0x40,0xFF,0xC9,0x4A,0xFF,0xFF,0x88,0x8A,0xE4,0x00,0xA8, +0xA4,0x88,0x8A,0x98,0x60,0xE4,0x00,0xA6,0x2C,0x88,0x8A,0x0D,0x21,0x06,0x0D,0x41, +0x02,0x98,0x60,0x9C,0x28,0xE4,0x00,0xA7,0x0D,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07, +0x10,0x1C,0x21,0xB0,0x0E,0xE1,0x10,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x07,0x04,0x0D, +0x41,0x4C,0x0D,0x61,0x48,0x0D,0x81,0x44,0x0D,0xE1,0x38,0x0E,0x01,0x34,0x0E,0x21, +0x30,0x0E,0x41,0x2C,0x0E,0x61,0x28,0x0E,0x81,0x24,0x0D,0xA1,0x40,0x0D,0xC1,0x3C, +0x0E,0xA1,0x20,0x0E,0xC1,0x1C,0x0E,0xE1,0x0C,0xC2,0x60,0x10,0x01,0xC2,0x40,0x10, +0x01,0xFE,0x73,0x07,0x24,0xFE,0x52,0x07,0x1C,0xC2,0x20,0x10,0x01,0xC2,0x00,0x10, +0x01,0xFE,0x31,0x07,0x14,0xFE,0x10,0x07,0x28,0xC1,0xE0,0x10,0x01,0xC1,0x8F,0xFF, +0xE1,0xFD,0xEF,0x07,0x20,0x9B,0x80,0xC2,0x98,0x00,0x21,0xC0,0xD8,0x00,0x21,0x13, +0x53,0x00,0x0E,0xF2,0x02,0x0D,0x51,0x02,0x0F,0xB0,0x02,0x0F,0x6F,0x02,0x99,0x60, +0xC9,0x8C,0xFF,0xFF,0x88,0xFC,0x53,0x20,0xFF,0xFE,0x94,0xB8,0x68,0xFC,0xC6,0xB8, +0x6E,0xE4,0x00,0x01,0xC5,0x41,0x14,0xC4,0x9F,0x01,0x11,0x08,0x00,0x8D,0xA8,0x5D, +0xAD,0x00,0xE4,0x00,0x00,0x11,0x9B,0x00,0x89,0xB8,0x5D,0x18,0x00,0xD7,0xC8,0xFF, +0x45,0xC3,0x18,0x00,0x21,0xFF,0x18,0xB8,0x68,0x8F,0x0B,0x99,0x00,0x12,0xB8,0x00, +0xCF,0x0D,0x00,0x0A,0x1E,0xD5,0xFF,0x8F,0x06,0x0E,0xC1,0x08,0x0F,0x01,0x14,0xE4, +0x00,0x01,0x37,0x0F,0x01,0x16,0xCD,0xE8,0x00,0x0A,0x8D,0xF8,0x0A,0xCF,0x00,0x0E, +0xC1,0x04,0x0F,0x01,0x0E,0x0E,0xC1,0x0A,0xD5,0x16,0x00,0x3A,0x0B,0x0F,0x0A,0x0D, +0xE1,0x06,0xD5,0xE4,0x03,0xB4,0xD4,0x98,0x03,0x94,0x8D,0xCD,0x5D,0xCE,0x00,0xCF, +0x0E,0x00,0x0A,0x8F,0x06,0x09,0xF8,0x06,0x0B,0x18,0x08,0x4F,0x18,0x50,0x41,0xEF, +0x23,0x8D,0xF8,0xFD,0xEF,0x02,0x00,0x4D,0xEF,0x52,0x5D,0xEF,0x06,0x41,0xEF,0x7B, +0x43,0x03,0x7D,0x4E,0xD8,0xFA,0x47,0x16,0xC6,0x43,0x18,0xB5,0xD7,0x0C,0x01,0x4C, +0xC3,0x20,0x1F,0xE4,0x20,0x00,0x2D,0x89,0x5D,0x89,0x97,0x8B,0x3A,0x88,0xFC,0x8B, +0xAA,0x8A,0xEC,0x8B,0x59,0x8B,0x87,0x8B,0x78,0x89,0x4F,0x89,0x98,0x88,0xEE,0x8B, +0x3E,0xE4,0x00,0x00,0x2F,0xC3,0x40,0x1F,0xE0,0x20,0x00,0x1D,0xD6,0xF8,0x00,0x60, +0x8B,0xAF,0x8A,0xF8,0x8B,0x5E,0x8B,0x8E,0x9D,0x01,0x5D,0xC8,0x00,0xD6,0xAE,0xFB, +0x35,0x9D,0x61,0x5F,0xCB,0x00,0x0E,0xC1,0x12,0xD6,0xDE,0xF9,0x6D,0xC3,0x00,0x10, +0x01,0x1B,0x53,0x00,0xFF,0x18,0x07,0x20,0x0E,0xF2,0x00,0x0D,0x51,0x00,0x0F,0xB0, +0x00,0x0F,0x78,0x00,0xC3,0x20,0x1F,0xE0,0x20,0x01,0x55,0xCF,0x9C,0x00,0x0A,0xCC, +0xE7,0x00,0x0A,0x8C,0xE6,0x0B,0x07,0x04,0x4F,0x18,0x50,0x8C,0xDC,0x08,0x67,0x02, +0x0B,0x86,0x02,0x40,0x63,0x23,0x0B,0x46,0x04,0x8C,0x78,0x43,0x1B,0xBC,0xFC,0x63, +0x02,0x00,0x4C,0x63,0x52,0x23,0x00,0xA8,0xC2,0xE0,0x1F,0xE0,0x20,0x00,0x8D,0x40, +0x63,0xBB,0x40,0x9C,0x23,0x4E,0xFA,0x50,0x8E,0xE4,0xFE,0xF7,0x02,0x00,0x4E,0xF7, +0x52,0x43,0x77,0xDB,0x8C,0x7B,0x40,0x63,0xC0,0xE4,0x00,0x00,0x0D,0x88,0x64,0x0E, +0xC1,0x1E,0x0E,0xA1,0x22,0x0E,0x81,0x26,0x0E,0x61,0x2A,0x0E,0x41,0x2E,0x0E,0x21, +0x32,0x0E,0x01,0x36,0x0D,0xE1,0x3A,0x0D,0xC1,0x3E,0x0D,0xA1,0x42,0x0D,0x81,0x46, +0x0D,0x61,0x4A,0x0D,0x41,0x4E,0x1B,0x25,0x00,0x1C,0x21,0x50,0x85,0x29,0x8B,0x23, +0xC2,0xE0,0x10,0x01,0x5C,0xA5,0x00,0xF2,0xF7,0x07,0x10,0x98,0x60,0xD6,0xE5,0x0C, +0xB9,0xD3,0x3F,0x0C,0x98,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10, +0x01,0xF2,0xF7,0x07,0x09,0xFF,0x18,0x07,0x07,0xFF,0x7B,0x07,0x08,0x22,0xE8,0x42, +0x13,0x18,0x00,0x5F,0x08,0x9B,0x20,0x00,0x51,0xE4,0x00,0x01,0x3B,0xD2,0xE1,0x04, +0xCE,0x13,0x18,0x00,0x5F,0x05,0x93,0x20,0x02,0x3D,0x24,0xA4,0x4B,0x9B,0x43,0x43, +0x5A,0x2D,0x4F,0x5A,0x08,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x37,0x20,0xA8,0x54,0x9B, +0x44,0x43,0x5A,0x2D,0x4F,0x5A,0x08,0x5F,0x5A,0x00,0x20,0xAC,0xEE,0xE4,0x00,0x00, +0x51,0x9B,0x43,0x9A,0xE0,0x13,0x9B,0x00,0x8B,0x17,0xE4,0x00,0x00,0x27,0x4F,0xB8, +0x08,0x9F,0x01,0x8F,0xBC,0x5F,0x18,0x00,0x8E,0xFD,0x5E,0xF7,0x00,0xD7,0x05,0xFF, +0x8E,0xE4,0x00,0x00,0x49,0x5E,0xE0,0x21,0x53,0x00,0x1D,0x52,0xE0,0x2F,0x4A,0xF8, +0xB8,0xE4,0x00,0x00,0x4B,0x5E,0xE0,0x29,0x53,0x00,0x41,0x52,0xE0,0x29,0x4A,0xF8, +0xB8,0xE4,0x00,0x00,0x2B,0x27,0x04,0x33,0x9F,0x9F,0x4F,0x18,0x08,0xE4,0x00,0x00, +0x8B,0x9B,0x0A,0x20,0xA9,0x10,0x13,0x1B,0x00,0x9C,0xBF,0x9F,0x1F,0x4C,0xA5,0x08, +0x8F,0x05,0xE4,0x00,0x00,0x65,0x9B,0x43,0x13,0xBB,0x00,0x43,0x5A,0x2D,0x9A,0xE0, +0x4F,0x5A,0x08,0x8B,0x77,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x21,0x8F,0x9D,0x9F,0x61, +0x8E,0xFC,0x5F,0x7B,0x00,0x5E,0xF7,0x00,0x4F,0x9B,0x08,0xD7,0x65,0xFF,0x8E,0x1F, +0x1D,0xFF,0x8F,0x1C,0x5F,0x18,0x00,0x4F,0x5A,0x08,0xC3,0xB8,0x00,0x21,0xFF,0xBD, +0xB7,0x02,0x8F,0xBA,0x9B,0x40,0xE4,0x00,0x01,0x0B,0x4F,0x7A,0x08,0x8F,0x7D,0x0B, +0x9B,0x00,0xD7,0x3C,0x03,0xBC,0x0B,0x7B,0x02,0xD7,0x79,0x03,0x84,0x8E,0xFA,0xC3, +0xB8,0x00,0x21,0xCF,0x17,0x00,0x06,0xFF,0xBD,0xB7,0x1E,0x8F,0x1D,0x1F,0x57,0x01, +0x14,0xD8,0x00,0xCF,0x5A,0x00,0x06,0x09,0x18,0x02,0x8F,0x5D,0x98,0x60,0x0B,0xB8, +0x04,0x14,0xBA,0x00,0x0B,0xDA,0x02,0x0B,0x1A,0x04,0xD7,0x9B,0x02,0x52,0x42,0xF9, +0xDD,0x40,0x77,0x33,0x43,0x3C,0xCD,0x43,0x59,0x2B,0x43,0xD9,0xF3,0x8F,0x43,0x40, +0x77,0x43,0x43,0x5A,0x23,0x8C,0x7E,0x8C,0x7A,0x42,0xF7,0xEB,0x40,0x83,0x23,0x97, +0x41,0x43,0x39,0xC3,0xCB,0x5A,0x86,0xA0,0x8F,0x37,0x40,0x64,0xD0,0x43,0x7C,0xDD, +0x8C,0x79,0x40,0x63,0xD8,0xE4,0x00,0x00,0x1F,0x9F,0x41,0x5F,0x7A,0x00,0xD7,0x1B, +0xFB,0xE5,0x98,0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x07,0x09,0xC2,0xE0, +0x10,0x01,0xF8,0x97,0x07,0x06,0xC2,0xE0,0x10,0x01,0xF8,0xB7,0x07,0x07,0xC2,0xE0, +0x10,0x01,0xF8,0xD7,0x07,0x08,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x07,0x05,0x85,0x29, +0x9A,0xFF,0x1C,0x21,0xD8,0x0D,0xE1,0x0C,0x1A,0xE1,0x07,0xC1,0xE0,0x10,0x01,0xFD, +0xEF,0x07,0x24,0x1A,0xEF,0x00,0x52,0xE0,0xFF,0xC3,0x00,0x10,0x01,0x0D,0x41,0x20, +0x0D,0x61,0x1C,0x0D,0xA1,0x14,0x0D,0xC1,0x10,0xCB,0x20,0xFF,0xFF,0xC1,0xC0,0x10, +0x01,0xEF,0x38,0x07,0x2C,0xFD,0xCE,0x07,0x20,0xC1,0xA0,0x10,0x01,0x0E,0xEE,0x00, +0xFD,0xAD,0x07,0x1C,0x0D,0x21,0x24,0x0E,0xED,0x00,0x0D,0x81,0x18,0xC2,0xE0,0x10, +0x01,0x0E,0x01,0x08,0x89,0x63,0xF3,0x17,0x07,0x09,0x89,0x44,0x88,0x65,0xC2,0xE0, +0x10,0x01,0x23,0x08,0x56,0xC3,0x00,0x10,0x01,0xF3,0x18,0x07,0x07,0x5F,0x08,0x9B, +0x20,0x00,0x61,0xE4,0x00,0x00,0x37,0x23,0x04,0x5E,0xC3,0x00,0x10,0x01,0xF3,0x18, +0x07,0x07,0x5F,0x05,0x93,0x20,0x00,0x25,0x9B,0x05,0xE4,0x00,0x00,0x0D,0x9B,0x04, +0xFB,0x17,0x07,0x10,0xC2,0x00,0x10,0x01,0x0E,0xEB,0x02,0xEE,0xF0,0x07,0x2C,0x0A, +0xE6,0x06,0x0C,0x8B,0x02,0xD4,0x97,0x04,0xCC,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08, +0xCD,0x53,0x18,0x01,0x1C,0xA1,0x07,0xEF,0x17,0x08,0xCD,0xE7,0xFF,0xF6,0x9C,0x0C, +0x6B,0x00,0x0C,0x8A,0x02,0xED,0x90,0x07,0x2E,0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF, +0xFA,0xC0,0xC2,0xE0,0x10,0x01,0x89,0x63,0xEC,0x77,0x07,0x0C,0x10,0xA1,0x07,0x0C, +0x8A,0x02,0x88,0x6C,0xE7,0xFF,0xFA,0x94,0xC3,0x00,0x10,0x01,0xEC,0x78,0x07,0x18, +0x0F,0x6E,0x02,0x0F,0x2D,0x02,0x0F,0x4A,0x02,0x43,0x1B,0xCC,0x23,0x00,0xEC,0xC3, +0x20,0x1F,0xE0,0x20,0x00,0xD1,0xC3,0x80,0x10,0x01,0xEF,0xBC,0x07,0x16,0xC3,0x80, +0x10,0x01,0xEF,0x9C,0x07,0x2A,0x43,0xBD,0xE5,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43, +0x9D,0xE5,0xD7,0x1C,0x00,0xAC,0x41,0x6B,0xDB,0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17, +0xC0,0x8F,0x58,0xE4,0x00,0x01,0x55,0x42,0xFA,0x1C,0xE4,0x00,0x01,0x5B,0xC9,0x80, +0x07,0xFF,0x42,0xEC,0xBD,0xD6,0xE4,0x05,0x2C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08, +0xCD,0x53,0x18,0x01,0x40,0x8C,0x25,0xEF,0x17,0x08,0xCD,0x1C,0xA1,0x07,0xE7,0xFF, +0xF5,0x56,0x40,0x6C,0x1D,0x0C,0x6B,0x00,0xEE,0xF0,0x07,0x2E,0x0C,0x8A,0x02,0x41, +0x8C,0xBD,0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF,0xF9,0x6E,0xC2,0xE0,0x10,0x01,0x89, +0x63,0xEC,0x77,0x07,0x0C,0x10,0xA1,0x07,0x0C,0x8A,0x02,0x88,0x6C,0xE7,0xFF,0xF9, +0x42,0xC3,0x00,0x10,0x01,0xEC,0x78,0x07,0x18,0x0F,0x6E,0x02,0x0F,0x2D,0x02,0x0F, +0x4A,0x02,0x43,0x1B,0xCC,0x23,0x00,0xFC,0xC3,0x20,0x1F,0xE0,0x20,0x00,0xE1,0xC3, +0x80,0x10,0x01,0xEF,0xBC,0x07,0x16,0xC3,0x80,0x10,0x01,0xEF,0x9C,0x07,0x2A,0x43, +0xBD,0xE5,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xD7,0x1C,0x00,0xCC,0x41, +0x6B,0xDB,0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17,0xC0,0x43,0x5A,0xC5,0x0F,0x4A,0x00, +0xE4,0x00,0x00,0x15,0x42,0xFA,0x1D,0x0E,0xEA,0x00,0x0E,0x01,0x0A,0x0D,0xE1,0x0E, +0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D, +0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x61,0x24, +0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E, +0x21,0x0C,0x0E,0x41,0x08,0x5E,0x23,0x00,0x0E,0x61,0x04,0x56,0x11,0x03,0x4E,0xF1, +0x11,0x5E,0x00,0x09,0x99,0xC0,0x4A,0x41,0x01,0x99,0x80,0x9A,0x64,0x0D,0x21,0x2C, +0x8E,0x57,0x89,0x44,0x89,0xAE,0x89,0x6C,0x99,0xE0,0x42,0x73,0x25,0xE4,0x00,0x00, +0xF3,0x42,0xF3,0x54,0xD6,0xF1,0x01,0xD8,0x22,0x04,0x4A,0x51,0xC0,0x10,0x11,0x6A, +0x00,0x89,0xAE,0x51,0x80,0x10,0xE4,0x00,0x00,0x6B,0x22,0x08,0x4A,0x51,0xC0,0x10, +0x11,0x6A,0x00,0x11,0x8A,0x01,0x89,0xAE,0xE4,0x00,0x00,0x47,0x22,0x0C,0x7E,0x11, +0x6A,0x00,0x11,0x8A,0x01,0x11,0xAA,0x02,0x51,0xC0,0x10,0xE4,0x00,0x00,0x21,0x11, +0x6A,0x00,0x11,0x8A,0x01,0x11,0xAA,0x02,0x11,0xCA,0x03,0x4E,0xEC,0x80,0x4C,0x8C, +0xC0,0x8C,0x97,0x4E,0xEE,0x80,0x4F,0x0B,0x40,0x4C,0xAE,0xC0,0x8C,0xB7,0x4E,0xED, +0x40,0x88,0x6F,0x8C,0x8B,0x8C,0xAD,0x8C,0x98,0x8C,0xB7,0x9D,0xE1,0xE4,0x00,0x96, +0xE4,0x5D,0xEF,0x00,0x9D,0x44,0xD5,0xF2,0xFC,0x5E,0x0E,0x61,0x06,0x0E,0x41,0x0A, +0x0E,0x21,0x0E,0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D, +0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29, +0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x00,0xDA,0x5E,0xE0,0x41,0x1C,0x21,0xE8,0x0D,0x61, +0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x0D,0x41,0x10,0x89,0x63,0x5D, +0x84,0x00,0x49,0xA1,0x01,0xE4,0x00,0x53,0x3E,0xC3,0x14,0x00,0x01,0xCB,0x18,0x7A, +0x30,0x0A,0xF8,0x01,0xC6,0xF7,0x01,0x00,0x5E,0xF7,0x04,0x22,0xE3,0xD8,0xFC,0x60, +0x01,0x00,0x99,0x40,0xE4,0x00,0x17,0xA0,0xE4,0x00,0x00,0x31,0x88,0x6A,0x98,0x81, +0x88,0xAD,0x9D,0x41,0xE4,0x00,0xA7,0xF6,0x5D,0x4A,0x00,0x0C,0x6B,0x01,0x9D,0x62, +0xD5,0x4C,0xFF,0x66,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12, +0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0xFC,0x21,0xFD,0xF0,0xED,0x41,0x02,0x08, +0xED,0xC1,0x01,0xF8,0xED,0xE1,0x01,0xF4,0xEE,0x01,0x01,0xF0,0xED,0x21,0x02,0x0C, +0xED,0x61,0x02,0x04,0xED,0x81,0x02,0x00,0xED,0xA1,0x01,0xFC,0xEE,0x21,0x01,0xEC, +0xEE,0x41,0x01,0xE8,0xEE,0x61,0x01,0xE4,0xEE,0x81,0x01,0xE0,0xC2,0x00,0x10,0x01, +0xC1,0xC0,0x10,0x01,0xC1,0xE0,0x10,0x01,0x89,0x43,0xFE,0x10,0x08,0x54,0xFD,0xCE, +0x08,0x75,0xFD,0xEF,0x08,0x72,0x20,0x60,0x30,0x20,0x68,0x98,0x20,0x64,0x30,0x24, +0x64,0x63,0x99,0x80,0xE4,0x00,0x00,0x0D,0x99,0x81,0xCD,0x8C,0x00,0x1A,0x51,0x60, +0x1A,0x8D,0x90,0xE4,0x00,0x00,0x41,0xD0,0x64,0x00,0x82,0xD0,0x65,0x00,0xA2,0x99, +0x80,0x89,0x6C,0xE4,0x00,0x00,0x21,0x89,0x8F,0x99,0x63,0xE4,0x00,0x00,0x11,0x89, +0x8E,0x99,0x68,0x9A,0xE0,0x8A,0x81,0x53,0x20,0x10,0xE4,0x00,0x00,0x19,0x43,0x14, +0xBC,0x9E,0xE1,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5,0x78,0xFF,0xAD,0x88,0x6B,0x88, +0x81,0x99,0xA3,0xE7,0xFF,0xFB,0xE8,0x8A,0x81,0xFE,0x20,0xFE,0xB0,0xCA,0x40,0x01, +0x50,0x52,0x60,0x3F,0x1C,0x61,0x60,0x88,0x8B,0xE7,0xFF,0xFD,0x8E,0x1F,0x21,0x60, +0x8B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x93,0x0A,0xF9,0x00,0xC2,0xFF,0xD5,0xEC,0x20, +0x00,0x39,0x43,0x71,0xBD,0xC3,0x60,0x2A,0x0C,0xE4,0x00,0x00,0x0F,0x5E,0xE0,0x19, +0x4B,0x61,0x01,0x23,0x60,0x98,0xFE,0xF7,0x01,0x50,0x13,0x58,0x00,0x42,0xF7,0x90, +0x8E,0xFA,0x5E,0xF7,0x06,0x26,0xFC,0x34,0x5E,0xE7,0xF1,0x4A,0xF7,0x98,0xE4,0x00, +0x00,0x0D,0x9A,0xE0,0x1A,0xF8,0x00,0x9B,0x40,0x9F,0x01,0x9F,0x22,0x42,0xF8,0xA5, +0x5E,0xF7,0x00,0xD5,0x77,0xFD,0xAD,0x23,0x40,0x24,0x9A,0xE0,0xE4,0x00,0x00,0x51, +0x88,0x6B,0x88,0x81,0x9D,0xBF,0xE7,0xFF,0xFA,0xE2,0x5D,0xAD,0x00,0x21,0xA2,0x1E, +0xE7,0xFF,0xFF,0xD5,0x43,0x0C,0xBC,0x1F,0x21,0x00,0x8F,0x37,0x9E,0xE1,0x13,0x39, +0x00,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5,0x78,0xFF,0x6D,0x21,0x40,0x74,0x21,0x48, +0x38,0x21,0x44,0x9C,0xD1,0x44,0x01,0xEA,0xD1,0x45,0x02,0x5A,0x99,0x60,0x99,0x80, +0x88,0x8B,0x89,0x4C,0xE4,0x00,0x00,0x9B,0xC1,0x80,0x10,0x01,0x99,0x60,0x88,0x90, +0xFD,0x8C,0x0A,0xF8,0xE4,0x00,0x00,0x2D,0xC0,0x80,0x10,0x01,0xC1,0x80,0x10,0x01, +0x99,0x61,0xFC,0x84,0x08,0x6E,0xFD,0x8C,0x0B,0x60,0x51,0x40,0x1A,0xE4,0x00,0x00, +0x49,0xC1,0x80,0x10,0x01,0x99,0x68,0x88,0x8F,0xFD,0x8C,0x0B,0x84,0x99,0x43,0xE4, +0x00,0x00,0x25,0xC1,0x80,0x10,0x01,0x99,0x6D,0x88,0x8E,0xFD,0x8C,0x0B,0xAC,0x99, +0x48,0x88,0x6A,0xE7,0xFF,0xF9,0xC8,0xFD,0xA1,0x01,0x20,0x88,0x8A,0x88,0x6D,0xE7, +0xFF,0xFB,0x82,0x9A,0xE0,0xE4,0x00,0x00,0x33,0x4F,0x17,0x10,0x4F,0x37,0x08,0x8F, +0x0C,0x8F,0x2D,0x9E,0xE1,0x0B,0x39,0x00,0x4F,0x39,0x40,0x0F,0x38,0x00,0x5F,0x17, +0x00,0xD5,0x58,0xFF,0x45,0x88,0x6B,0xE4,0x00,0x51,0x4E,0xED,0x21,0x02,0x0E,0xEE, +0x81,0x01,0xE2,0xEE,0x61,0x01,0xE6,0xEE,0x41,0x01,0xEA,0xEE,0x21,0x01,0xEE,0xEE, +0x01,0x01,0xF2,0xED,0xE1,0x01,0xF6,0xED,0xC1,0x01,0xFA,0xED,0xA1,0x01,0xFE,0xED, +0x81,0x02,0x02,0xED,0x61,0x02,0x06,0xED,0x41,0x02,0x0A,0xFC,0x21,0x02,0x10,0x85, +0x29,0x9C,0x38,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x04,0xFE,0xF7,0x08,0x54,0x9B,0x00, +0x13,0x37,0x00,0x4F,0x39,0x08,0x9E,0xE1,0x8F,0x19,0xC3,0x20,0x10,0x01,0xFF,0x39, +0x08,0x6E,0xD6,0xF9,0xFF,0x76,0xC2,0xE0,0x10,0x01,0xF3,0x57,0x08,0x72,0xFE,0xF7, +0x08,0x72,0x13,0x37,0x02,0x13,0x77,0x01,0x98,0x60,0x42,0xFB,0xD4,0x98,0x80,0x8E, +0xF9,0x53,0x20,0x37,0x4E,0xF7,0x08,0x8E,0xF8,0x97,0x03,0x4E,0xF7,0x09,0xCB,0x18, +0xD0,0x8F,0xCE,0xF7,0x03,0x5B,0x42,0xF7,0xC9,0xCE,0xF7,0x00,0x1D,0xD6,0xF8,0x00, +0xA1,0x97,0x2F,0x98,0x60,0xCB,0x39,0x42,0x3F,0x98,0x82,0xD6,0xF9,0x00,0x31,0x98, +0x87,0xE4,0x00,0x9F,0x08,0x0D,0x21,0x06,0x98,0x61,0x98,0x80,0x9C,0x28,0xE4,0x00, +0x9E,0xEF,0x9C,0x38,0x98,0x80,0x0D,0x21,0x04,0x98,0x66,0xE4,0x00,0x2E,0x14,0x98, +0x60,0xE7,0xFF,0xFA,0x8E,0x98,0x87,0x98,0x66,0xE4,0x00,0x2D,0xF8,0x98,0x64,0xE7, +0xFF,0xFA,0x72,0x98,0x66,0x98,0x88,0xE4,0x00,0x2D,0xDC,0x0D,0x21,0x06,0x98,0x65, +0x9C,0x28,0xE7,0xFF,0xFA,0x4D,0xC2,0xE0,0x10,0x01,0x5C,0xA0,0x29,0xF3,0x37,0x0B, +0x76,0x53,0x40,0x40,0x52,0xE0,0x20,0xC3,0x60,0x10,0x01,0x4B,0x5A,0xB8,0xFF,0x7B, +0x09,0x68,0x20,0x60,0x6C,0xE4,0x00,0x00,0x55,0x4F,0x17,0x08,0x9E,0xE1,0x8F,0x1B, +0x0B,0x18,0x00,0xD7,0x58,0x00,0x78,0x98,0x61,0xE4,0x00,0x00,0xD9,0x9A,0xE0,0x43, +0x40,0xD5,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x25,0x98,0x60,0xE4,0x00,0x00,0xB5,0x20, +0x67,0xEA,0x9A,0xE0,0x20,0x80,0xA6,0x9A,0xE0,0x43,0x80,0xD5,0xE4,0x00,0x00,0x7D, +0x4F,0x17,0x08,0x8F,0x1B,0x0B,0x18,0x00,0x4F,0x98,0xFA,0x47,0x1C,0xC6,0x43,0x18, +0xE5,0x0B,0x84,0x00,0xD7,0x1C,0x00,0x38,0x0F,0x04,0x01,0x9E,0xE1,0x5F,0x17,0x00, +0xD7,0x38,0xFF,0x05,0xE7,0xFF,0xFF,0xA7,0x4F,0x17,0x08,0x8F,0x1B,0x0B,0x18,0x00, +0xD7,0x98,0xFD,0x3C,0x9E,0xE1,0xD7,0x1A,0xFD,0x0C,0x5F,0x17,0x00,0xD7,0x38,0xFF, +0x5D,0xE7,0xFF,0xFF,0x51,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF3, +0xB7,0x0B,0x76,0xC3,0xC0,0x10,0x01,0x9A,0xE0,0xFF,0x18,0x07,0x34,0x8B,0x37,0xFF, +0xDE,0x09,0x68,0xE4,0x00,0x00,0x5B,0x4F,0x57,0x08,0x0B,0x98,0x00,0x8F,0x5E,0x0B, +0x5A,0x00,0x43,0x9A,0xE5,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x66, +0x11,0x20,0x00,0x21,0x9F,0x21,0x5F,0x39,0x00,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02, +0x5F,0x57,0x00,0xD7,0xBA,0xFE,0xA5,0x5F,0x20,0x93,0x48,0x61,0x01,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xC3,0x40,0x10,0x01,0xF3,0x37,0x0B,0x76,0xC3,0x60,0x10,0x01,0x9A, +0xE0,0xFF,0x5A,0x07,0x34,0xFF,0x7B,0x09,0x68,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08, +0x9E,0xE1,0x43,0x9A,0xC4,0x8F,0x1B,0x0B,0x18,0x01,0x0F,0x1C,0x01,0x5F,0x17,0x00, +0xD7,0x38,0xFF,0x6D,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xE6,0xC2,0xE0, +0x10,0x01,0x9C,0x38,0xF8,0x17,0x08,0xDF,0x0D,0x21,0x04,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xF9,0x20,0x64,0x26,0x98,0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80, +0xE4,0x00,0x2F,0xE6,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEC,0x17,0x07,0x30,0x9C, +0x28,0xE4,0x00,0x49,0xDB,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0xEB, +0x17,0x00,0xCD,0x0D,0x21,0x14,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0C,0x01,0x07,0x89, +0x43,0xC7,0x18,0x01,0x00,0x98,0x60,0xD3,0x00,0x06,0xAA,0xEB,0x17,0x00,0xCD,0xC7, +0x18,0xFE,0xFF,0xEF,0x17,0x00,0xCD,0xE4,0x00,0x43,0x86,0xE4,0x00,0x44,0x92,0x21, +0x44,0x36,0x98,0x61,0xE4,0x00,0x70,0x6C,0xE4,0x00,0x00,0x11,0xE4,0x00,0x70,0xBE, +0xC1,0x60,0x10,0x01,0xEE,0xEB,0x07,0x32,0x5E,0xE0,0x01,0x98,0x6A,0x98,0x83,0x0C, +0x01,0x07,0x1D,0x81,0x06,0x49,0x8C,0x00,0xE4,0x00,0x4F,0x66,0x98,0x61,0x88,0x8C, +0x98,0xA1,0x88,0xCA,0xE7,0xFF,0xFC,0x44,0xC2,0xE0,0x10,0x01,0x20,0x60,0xE6,0xF3, +0x17,0x08,0xE6,0x9F,0x01,0xFB,0x17,0x08,0xE6,0x0A,0xE1,0x06,0xD2,0xEF,0x00,0x94, +0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0xDF,0x9F,0x01,0xFB,0x17,0x08,0xDF,0x98,0x63, +0x21,0x44,0x36,0x98,0x81,0xE4,0x00,0x6C,0x1C,0xE4,0x00,0x00,0x73,0xE4,0x00,0x6C, +0x72,0xE4,0x00,0x00,0x63,0xF8,0x17,0x08,0xE6,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0xDF,0xEE,0xEB,0x07,0x32,0x22,0xE3,0x66,0x0A,0xE1,0x06,0x5E,0xEC,0x11,0x23,0xFF, +0x41,0x21,0x44,0x36,0x98,0x61,0xE4,0x00,0x4E,0x14,0xE4,0x00,0x00,0x11,0xE4,0x00, +0x4E,0x4E,0x9B,0x01,0xC2,0xE0,0x10,0x01,0x98,0x61,0xEF,0x17,0x07,0x30,0xC2,0xE0, +0x10,0x01,0xF3,0x17,0x08,0xF9,0x9F,0x01,0xFB,0x17,0x08,0xF9,0x0D,0x81,0x0A,0x0D, +0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0x20,0x64,0x26,0x98,0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80,0xE4, +0x00,0x2D,0x88,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x47,0x8D,0x98,0x60,0x98,0xA0, +0x88,0x83,0xE7,0xFF,0xC7,0xCD,0xC2,0xE0,0x10,0x01,0x98,0x61,0xF2,0xF7,0x08,0xE6, +0xD2,0xEA,0x00,0x95,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0xDF,0x5E,0xE0,0xBB,0x48, +0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0xF9,0x5E,0xE1,0xDB,0x48, +0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x00,0x00,0x0C,0x17,0x00,0x0C, +0x17,0x19,0x0C,0x17,0x1B,0xEC,0x17,0x00,0xA1,0xEC,0x17,0x00,0xA3,0xEC,0x17,0x00, +0xA4,0x1F,0x17,0x08,0xEC,0x17,0x00,0xA1,0x0F,0x17,0x04,0x1F,0x17,0x20,0x0F,0x17, +0x1C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD1,0x53,0x18,0x02,0xEF,0x17,0x00,0xD1, +0x85,0x29,0xC3,0x20,0x10,0x01,0xFF,0x19,0x00,0x00,0x1E,0xF8,0x20,0x5C,0x63,0x04, +0x0E,0xF8,0x1C,0x9A,0xE0,0xE4,0x00,0x00,0x29,0x0F,0x38,0x1E,0x43,0x44,0xBC,0x8F, +0x37,0x13,0x5A,0x00,0x9E,0xE1,0x1B,0x59,0x00,0x5F,0x37,0x04,0xD4,0x79,0xFF,0x6D, +0x9A,0xE1,0xEE,0xF8,0x00,0xA4,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00, +0x5D,0x43,0x00,0xE7,0xFF,0xFF,0x02,0x88,0x6A,0xE4,0x00,0x98,0x40,0x0D,0x21,0x06, +0x0D,0x41,0x02,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x41,0x18,0x0D,0x61,0x14, +0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xE1,0x04,0x0D,0x21,0x1C,0x0D,0xC1,0x08,0x0E, +0x01,0x00,0xC1,0xA0,0x10,0x01,0xE4,0x00,0x99,0xB2,0xC1,0x80,0x10,0x01,0xC1,0x60, +0x10,0x01,0xC1,0xE0,0x10,0x01,0x5C,0x63,0x00,0xFD,0xAD,0x00,0xC0,0xFD,0x8C,0x08, +0x85,0xFD,0x6B,0x00,0xB8,0xFD,0x4F,0x00,0x00,0xD0,0x60,0x19,0x42,0xE4,0x00,0x99, +0xB0,0x5C,0x63,0x00,0x20,0x60,0xBC,0x0C,0x0A,0x19,0xE4,0x00,0x9A,0x3C,0xE4,0x00, +0x00,0x4B,0x0E,0xEA,0x06,0x0A,0x0A,0x19,0x8E,0x17,0xE4,0x00,0x9A,0x50,0x18,0x70, +0x00,0x0A,0xEA,0x19,0xD2,0xEE,0x00,0x8D,0x0A,0xEA,0x19,0x9E,0xE1,0x5E,0xF7,0x04, +0x0E,0xEA,0x19,0x99,0xC0,0xE4,0x00,0x98,0xCE,0x5C,0x63,0x00,0x20,0x63,0x5A,0x0E, +0xEA,0x06,0x13,0x17,0x00,0x5F,0x0A,0x09,0x20,0x00,0x61,0x0A,0xEA,0x19,0xD2,0xE4, +0x03,0x76,0xE4,0x00,0x99,0x78,0x0A,0xEA,0x19,0x22,0xE1,0xDA,0xE4,0x00,0x08,0x49, +0x13,0x17,0x00,0x23,0x08,0x36,0x0A,0xEA,0x19,0x22,0xE9,0x4E,0xE7,0xFF,0xFF,0xCD, +0x13,0x17,0x00,0x23,0x04,0x36,0x0A,0xEA,0x19,0x22,0xE5,0x0E,0xE7,0xFF,0xFF,0xAD, +0x13,0x17,0x00,0x5F,0x0A,0x29,0x20,0x00,0xC3,0x13,0x17,0x00,0x5F,0x0A,0x49,0x23, +0xFE,0xF3,0x13,0x17,0x00,0x5F,0x0A,0x69,0x20,0x00,0x7B,0x13,0x17,0x00,0x5F,0x0A, +0x89,0x20,0x00,0x57,0x13,0x17,0x00,0x5F,0x04,0x09,0x20,0x00,0x33,0x12,0xF7,0x00, +0x5E,0xE4,0x29,0x20,0x00,0x25,0x0A,0xEA,0x19,0x22,0xEE,0x64,0x98,0x61,0xE4,0x00, +0xA9,0xE4,0x9D,0xC1,0xC1,0xC4,0xE2,0x0E,0x23,0xFD,0xB7,0xE7,0xFF,0xFF,0x0F,0x0E, +0xEA,0x06,0x13,0x17,0x00,0xD3,0x00,0x1D,0x5A,0x13,0x17,0x00,0x5F,0x0B,0x9B,0x20, +0x0E,0x85,0x13,0x17,0x00,0x5F,0x0A,0x49,0x07,0x00,0x80,0x20,0x00,0xA5,0x0B,0x2A, +0x19,0xD3,0x24,0x11,0x36,0x13,0x37,0x01,0x13,0x57,0x02,0x12,0xF7,0x03,0x4F,0x39, +0x40,0x47,0x39,0xD5,0xC3,0x22,0x7F,0xEE,0x20,0x08,0x3D,0x8F,0x19,0x1A,0xF8,0x00, +0xE4,0x00,0x04,0x0F,0x13,0x37,0x00,0x5F,0x2A,0x69,0x20,0x02,0xCD,0x0B,0x2A,0x19, +0xD3,0x23,0x1B,0x06,0x13,0x57,0x01,0x13,0x37,0x02,0x4E,0xFA,0x40,0x46,0xF7,0xCD, +0xCB,0x20,0x14,0x00,0xC2,0xE2,0x80,0x0A,0x4A,0xF7,0xC8,0x8E,0xF8,0x0E,0xEA,0x1C, +0xFE,0xE0,0x08,0x00,0xEE,0xEA,0x00,0xA1,0xE4,0x00,0x00,0x1D,0xE4,0x00,0x07,0x98, +0x98,0x61,0xE4,0x00,0x07,0xC4,0xE4,0x00,0x96,0x66,0x5C,0x63,0x00,0x20,0x63,0xBC, +0xEC,0x0A,0x00,0xA3,0xE4,0x00,0x97,0x6E,0xE4,0x00,0x97,0x00,0xEB,0x0A,0x00,0xA3, +0xEA,0xEA,0x00,0xA1,0xD7,0x17,0x01,0x26,0xEA,0xEA,0x00,0xA3,0xEA,0xEA,0x00,0xA1, +0xE4,0x00,0x96,0xF6,0xE4,0x00,0x97,0x62,0xE4,0x00,0x97,0x26,0xEC,0x0A,0x00,0xA3, +0xEC,0x0A,0x00,0xA1,0xE4,0x00,0x05,0xD9,0xE4,0x00,0x96,0x54,0x5C,0x63,0x00,0x20, +0x63,0x66,0xE4,0x00,0x95,0xA8,0x5C,0x63,0x00,0x20,0x63,0x0C,0xEA,0xEA,0x00,0xA3, +0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x95,0x22,0xEA,0xEA,0x00,0xA3, +0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xE7,0xFF,0xFF,0x47,0x13,0x17,0x00, +0xD3,0x01,0x04,0x26,0x0A,0xEA,0x19,0xD2,0xE1,0x0A,0x06,0xFE,0xEA,0x00,0xAC,0xEE, +0xEA,0x00,0xA8,0x12,0xEB,0x00,0x22,0xE0,0x4A,0x9A,0xE8,0x53,0x00,0x52,0xFA,0xEA, +0x00,0xB4,0x9A,0xE8,0xE4,0x00,0x00,0x21,0x9A,0xE8,0x53,0x00,0x62,0xFA,0xEA,0x00, +0xB4,0x52,0xE0,0x80,0x1F,0x20,0x81,0xFB,0x2A,0x00,0xAC,0x13,0x2B,0x00,0xFB,0x2A, +0x00,0xAD,0xFB,0x0A,0x00,0xAE,0xF8,0x0A,0x00,0xAF,0x5E,0xF7,0x00,0xFA,0xEA,0x00, +0xB0,0xF8,0x0A,0x00,0xB1,0xF8,0x0A,0x00,0xB2,0xC2,0xE0,0x10,0x01,0xF8,0x0A,0x00, +0xB3,0xEB,0x17,0x00,0xD1,0xC7,0x18,0xFF,0xFD,0xEF,0x17,0x00,0xD1,0x12,0xEC,0x00, +0x52,0xF7,0x01,0x9B,0x01,0x1A,0xEC,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x81, +0xE4,0x00,0x01,0x8F,0x13,0x17,0x00,0x23,0x09,0x4A,0x0B,0x0A,0x19,0xD3,0x02,0x05, +0xD6,0x12,0xF7,0x01,0x22,0xE0,0x4A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9,0x18, +0x17,0x00,0xE4,0x00,0x00,0x29,0x22,0xE4,0x5E,0xC2,0xF4,0x00,0x01,0x9B,0x01,0xCA, +0xF7,0x3D,0xF9,0x1B,0x17,0x00,0x12,0xF7,0x00,0xE4,0x00,0x00,0x2D,0xD2,0xE2,0x04, +0x56,0xC3,0x14,0x00,0x01,0xCB,0x18,0x3D,0xF9,0x1A,0xF8,0x00,0x12,0xF8,0x00,0x5E, +0xF7,0x00,0x1A,0xEB,0x00,0xE4,0x00,0x00,0xE5,0x13,0x17,0x00,0x5F,0x04,0x09,0x20, +0x00,0x99,0x0B,0x0A,0x19,0x23,0x0D,0x8A,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9, +0x40,0x46,0xF7,0xC5,0xC2,0xEB,0x54,0xA4,0x20,0x01,0x3D,0x12,0xED,0x00,0x52,0xF7, +0x03,0xE4,0x00,0x00,0x87,0x13,0x17,0x00,0x5F,0x04,0x29,0x20,0x06,0x95,0x0B,0x0A, +0x19,0x23,0x0C,0xDA,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9,0x40,0x46,0xF7,0xC5, +0xC3,0x00,0x10,0x01,0xEE,0xF8,0x00,0xC4,0x12,0xED,0x00,0x57,0x37,0x01,0x23,0x20, +0x64,0xEF,0x18,0x00,0xC6,0x23,0x00,0x32,0x9B,0x1B,0x46,0xF7,0xC4,0xE4,0x00,0x00, +0x0F,0x52,0xF7,0x04,0x1A,0xED,0x00,0x0C,0x0A,0x00,0x0C,0x0A,0x19,0xE4,0x00,0x02, +0xC7,0xE4,0x00,0x92,0xD0,0x5C,0x63,0x00,0xD0,0x60,0x0A,0xC2,0xE4,0x00,0x94,0x12, +0xE4,0x00,0x93,0xD6,0x50,0x60,0x20,0xE4,0x00,0x03,0xA2,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x3D,0xF9,0x12,0xF7,0x00,0x1A,0xEB,0x00,0x12,0xEB,0x00,0x22,0xE0,0x4E,0x12, +0xED,0x00,0x56,0xF7,0x01,0x5E,0xE0,0x09,0x49,0xA4,0x43,0xE4,0x00,0x00,0x43,0x12, +0xEB,0x00,0x22,0xE4,0x2A,0x51,0xA0,0x80,0xE4,0x00,0x00,0x29,0x12,0xEB,0x00,0x22, +0xEB,0xD8,0x12,0xEB,0x00,0x22,0xEF,0xC0,0xC9,0xA0,0xFF,0xFF,0xEE,0xEA,0x00,0xA6, +0x22,0xE4,0x2E,0xED,0xAA,0x00,0xA1,0xEC,0x0A,0x00,0xA4,0xE4,0x00,0x93,0x20,0xEA, +0xEA,0x00,0xA1,0xD5,0xB7,0x00,0x71,0x12,0xEC,0x00,0x56,0xF7,0x01,0xD2,0xE0,0x05, +0x22,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0xAC,0x23,0x00,0x24,0x9F,0x1F,0xFB,0x17, +0x08,0xAC,0xEC,0x0A,0x00,0xA3,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x2C,0xF1, +0xAA,0x00,0xB4,0xE4,0x00,0x00,0xAD,0xE9,0xAA,0x00,0xA1,0xE4,0x00,0x00,0x9D,0x12, +0xEB,0x00,0x22,0xE0,0x42,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x56,0xE4,0x00, +0x00,0x3D,0xE4,0x00,0x91,0x02,0x5C,0x63,0x00,0x20,0x63,0xE4,0xE7,0xFF,0xFF,0xD3, +0xEA,0xEA,0x00,0xA3,0xEF,0x0A,0x00,0xAA,0xE4,0x00,0x00,0x17,0xEA,0xEA,0x00,0xA3, +0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x90,0x82,0xEA,0xEA,0x00,0xA3, +0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xEA,0xEA,0x00,0xA3,0xD6,0xED,0xFD, +0x96,0xE4,0x00,0x92,0x28,0xE4,0x00,0x91,0xEC,0xEC,0x0A,0x00,0xA1,0xEC,0x0A,0x00, +0xA3,0xE4,0x00,0x00,0x45,0x98,0x60,0x9D,0x61,0xE4,0x00,0x90,0x20,0xE4,0x00,0x00, +0x0D,0x99,0x60,0xD5,0xAB,0xFF,0x95,0xE4,0x00,0x91,0xDC,0xE4,0x00,0x91,0xA0,0xEC, +0x0A,0x00,0xA1,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD1,0x53,0x18,0x02,0xEF,0x17, +0x00,0xD1,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x81,0xC3,0x00,0x32,0x0A,0x20,0x00, +0x49,0x13,0x0C,0x00,0x9B,0x3E,0xEC,0x17,0x08,0x81,0x47,0x18,0xCC,0x1B,0x0C,0x00, +0x0E,0x01,0x02,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D, +0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0xE4,0x00,0x98,0x54,0x98,0x60,0x88,0x83,0xE4,0x00,0x95,0x86,0x98,0x61, +0x98,0x82,0xE4,0x00,0x95,0x76,0x98,0x60,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x91,0x62, +0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE4,0x00,0x92,0xC8,0x0D,0x21,0x06,0x9C,0x28,0xE4, +0x00,0x9B,0x1F,0x20,0x64,0x1E,0xE4,0x00,0x9C,0x49,0xE4,0x00,0x9C,0x67,0x9C,0x38, +0x0D,0x21,0x04,0xE4,0x00,0x9C,0x7C,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x9C,0x43, +0xE4,0x00,0x9E,0x3B,0xE4,0x00,0x9E,0xA3,0xE4,0x00,0x9E,0xFF,0xE4,0x00,0xA2,0xDD, +0xE4,0x00,0xA0,0x47,0xE4,0x00,0x9F,0x4B,0xE4,0x00,0x9F,0x81,0xE4,0x00,0x9F,0xB7, +0xE4,0x00,0x9F,0xDB,0xE4,0x00,0x9F,0xFF,0xE4,0x00,0x9E,0x35,0xE4,0x00,0xA0,0x2D, +0x20,0x60,0x28,0x20,0x64,0x3E,0xE4,0x00,0x00,0x11,0xE4,0x00,0xA0,0xC9,0xE4,0x00, +0xA0,0xE3,0x85,0x29,0xE4,0x00,0xA0,0xF9,0xC2,0xE0,0x10,0x01,0xE8,0x77,0x00,0xBB, +0xEB,0x17,0x00,0xBB,0xD4,0x78,0xFF,0xC6,0x85,0x29,0xE4,0x00,0xA3,0x99,0xC3,0x34, +0x00,0x01,0xCA,0xF9,0x23,0xFC,0x0A,0xF7,0x00,0xD2,0xFF,0x04,0x3C,0xC3,0x00,0x10, +0x01,0xF2,0xF8,0x07,0x6E,0x9E,0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x07,0x6E,0x22,0xE1, +0xCA,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0xFF,0x18,0x01,0xBE,0xCA,0xE0,0x11, +0x7D,0xCB,0x39,0x22,0x00,0xFF,0x7B,0x09,0x68,0x1F,0x57,0xFD,0x57,0x5A,0xFF,0x4F, +0x5A,0x10,0x8F,0x59,0x0B,0x9A,0x01,0x4F,0x97,0x08,0x8F,0x9B,0xEB,0x9C,0xDD,0x3B, +0x0F,0x9A,0x01,0x5F,0x57,0x00,0x5F,0x4F,0xE9,0x57,0x57,0xFF,0x4F,0x5A,0x10,0x8F, +0x59,0x0B,0x9A,0x01,0x20,0x00,0x6D,0xFF,0xA0,0x80,0x00,0x5F,0x9C,0x04,0x47,0x9C, +0xEC,0x0B,0xB8,0x01,0xC7,0xBD,0x7F,0xFF,0x47,0x9C,0xED,0xE4,0x00,0x00,0x0F,0x0B, +0x98,0x01,0x0F,0x9A,0x01,0x9E,0xE1,0x9F,0x02,0xC2,0xE2,0x30,0x04,0x23,0xFE,0xB1, +0x85,0x29,0x5C,0x63,0x04,0xE4,0x00,0xA2,0x6B,0x9A,0xE0,0x8B,0x17,0xE4,0x00,0x00, +0x1D,0x43,0x23,0xBC,0x9E,0xE1,0x13,0x39,0x00,0x8F,0x19,0xD4,0x97,0xFF,0xB4,0x40, +0x60,0xC5,0x85,0x29,0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0x90,0x98, +0x61,0xE7,0xFF,0xFD,0x84,0x98,0x6F,0xE7,0xFF,0xFE,0x3A,0x0D,0x21,0x06,0x98,0x60, +0x9C,0x28,0xE7,0xFF,0xFD,0x63,0x9C,0x38,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x04,0xEC, +0x17,0x08,0x7F,0x0D,0x41,0x00,0xC2,0xE0,0x10,0x01,0x50,0x60,0x80,0xF2,0xF7,0x00, +0xB8,0x22,0xE0,0x52,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xC0,0x56,0xF7,0x01,0x5E, +0xE0,0x09,0x48,0x64,0x43,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00,0xD1,0x56,0xF7,0x02, +0x22,0xE0,0x6C,0xC0,0x80,0x10,0x01,0xFC,0x84,0x07,0x70,0xE7,0xFF,0xF1,0xEE,0xEA, +0xEA,0x00,0xD1,0xC6,0xF7,0xFF,0xFD,0xEE,0xEA,0x00,0xD1,0x0D,0x41,0x02,0x0D,0x21, +0x06,0x9C,0x28,0xE7,0xFF,0xFF,0x03,0x9C,0x30,0xC3,0x00,0x10,0x01,0x0D,0x21,0x0C, +0xFC,0x98,0x07,0x70,0x0D,0x41,0x08,0x8A,0xE4,0x8B,0x24,0x18,0x17,0x00,0xC3,0x00, +0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0xF2,0xD6,0xF8,0xFF,0x9E,0x52,0xE0,0x62,0x1F, +0x19,0x1F,0x1A,0xE4,0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x07,0x71,0x18,0x17,0x00, +0x9E,0xE1,0xD7,0x17,0xFF,0xDE,0x1E,0xE0,0x9E,0xC3,0x60,0x10,0x01,0x1A,0xE4,0x1F, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF8,0x12,0xF7,0x00,0xFA,0xFB,0x07,0x6F,0xF2, +0xFB,0x07,0x6F,0x22,0xEC,0xCC,0xC2,0xE0,0x10,0x01,0xC3,0x40,0x10,0x01,0xF3,0xB7, +0x0B,0x76,0x9B,0x00,0xC2,0xE0,0x10,0x01,0xC3,0xC0,0x10,0x01,0xC1,0x00,0x10,0x01, +0xFE,0xF7,0x07,0x90,0xFF,0x5A,0x09,0xA4,0x8B,0x38,0xFF,0xDE,0x0C,0xF2,0xFD,0x08, +0x09,0x68,0xE4,0x00,0x01,0x09,0xC3,0x80,0x10,0x01,0x9A,0xE0,0xFF,0x9C,0x0B,0x60, +0x8B,0x64,0x43,0x17,0xE4,0x0B,0x38,0x00,0x43,0x17,0xDC,0x4F,0x59,0x42,0x1B,0x38, +0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0xA5,0x0C,0x81,0x04,0x50, +0x60,0x20,0xE7,0xFF,0xFB,0x9C,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00,0xD1,0x0C,0x81, +0x06,0x56,0xF7,0x02,0x22,0xE1,0x74,0xE4,0x00,0x00,0x8F,0xF3,0x9B,0x07,0x6F,0x23, +0x84,0x34,0x23,0x88,0x68,0x43,0x98,0x44,0xE4,0x00,0x00,0x0F,0x43,0x98,0xF4,0x15, +0x5C,0x01,0x19,0x57,0x00,0x0B,0x9C,0x01,0xE4,0x00,0x00,0x21,0x0F,0x9A,0x02,0x4D, +0x5C,0x82,0x4F,0x9C,0x42,0x19,0x57,0x00,0x1B,0x97,0x01,0x9F,0x21,0x9F,0x02,0x5F, +0x39,0x04,0x9E,0xE2,0x9F,0x44,0xD7,0xB9,0xFE,0x2D,0xE7,0xFF,0xFF,0x45,0x50,0x60, +0x80,0xE7,0xFF,0xEF,0x82,0xEA,0xEA,0x00,0xD1,0xC6,0xF7,0xFF,0xFD,0xEE,0xEA,0x00, +0xD1,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xFC,0x95,0xC2,0xE0, +0x10,0x01,0xC3,0x00,0x10,0x01,0xF0,0x77,0x0B,0xEC,0xC3,0x20,0x10,0x01,0xC2,0xE0, +0x10,0x01,0xFF,0x18,0x0B,0xFE,0xFE,0xF7,0x07,0xF8,0xFF,0x39,0x08,0x00,0x9B,0x60, +0x98,0x81,0xE4,0x00,0x01,0x7D,0x0B,0x57,0x01,0xC3,0x4F,0xFF,0xE0,0x20,0x00,0x35, +0x0B,0x57,0x03,0xC3,0x4F,0xFF,0xE4,0x20,0x00,0x49,0x0B,0x58,0x01,0x18,0x19,0x00, +0x0F,0x57,0x01,0x0B,0x58,0x03,0x0F,0x57,0x03,0x13,0x59,0x00,0x23,0x41,0x22,0x0B, +0x98,0x03,0x0B,0x57,0x03,0x43,0x5C,0xD5,0x5F,0x5A,0x06,0x4F,0xDA,0xFA,0x0B,0xB8, +0x01,0x47,0x5E,0xD6,0x09,0x17,0x01,0x43,0x5A,0xF5,0x41,0x1D,0x45,0x5D,0x08,0x06, +0x4F,0xC8,0xFA,0x45,0x1E,0x46,0x43,0xC8,0xF5,0x8F,0xDA,0x5F,0xCC,0x99,0x20,0x00, +0x25,0x5F,0x46,0x51,0x20,0x01,0x11,0x18,0x99,0x00,0x0F,0xB7,0x01,0x0F,0x97,0x03, +0xE4,0x00,0x00,0x71,0x0B,0x98,0x01,0x0B,0xD7,0x01,0x43,0xDC,0xF5,0x5F,0xDE,0x06, +0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x0B,0x58,0x03,0x41,0x1E,0xED,0x0B,0xD7,0x03,0x43, +0xDA,0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43,0xBD,0xF5,0xD7,0xA8, +0x00,0x52,0x0F,0x97,0x01,0x0F,0x57,0x03,0x0B,0x57,0x01,0x9F,0x61,0x0F,0x58,0x01, +0x5F,0x7B,0x00,0x0B,0x57,0x03,0x9F,0x21,0x0F,0x58,0x03,0x9E,0xE4,0x1F,0x18,0x30, +0xD7,0x63,0xFA,0x36,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3D,0xF9,0x1C,0x21, +0xE0,0xCA,0xF7,0x3D,0xF8,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1, +0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0x0E,0x01,0x00,0x0D,0x21,0x1C,0xC1,0x80,0x10, +0x01,0xFD,0x8C,0x08,0xE2,0x0A,0x0C,0x01,0xC6,0x10,0x7F,0xFF,0x0E,0x0C,0x01,0x13, +0x38,0x00,0xC3,0x00,0x10,0x01,0xFB,0x38,0x00,0xB8,0x13,0x37,0x00,0xC2,0xE0,0x10, +0x01,0xFB,0x37,0x07,0x6F,0xC1,0xA0,0x10,0x01,0xC1,0xC0,0x10,0x01,0xC3,0x60,0x10, +0x01,0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFD,0xAD,0x07,0xF4,0xFD,0xCE,0x09,0x68, +0xFD,0xE0,0x80,0x00,0xFD,0x5B,0x07,0x70,0xFD,0x7A,0x0B,0xEC,0xD0,0x61,0x14,0x46, +0x0B,0x2B,0x16,0x0A,0xEB,0x18,0x45,0xF0,0x7D,0x0E,0xEB,0x17,0x0D,0xEC,0x01,0x0F, +0x2B,0x19,0x13,0x0B,0x00,0xD3,0x01,0x1F,0x61,0x0B,0x6B,0x46,0x0B,0x0B,0x48,0x0F, +0x6B,0x49,0x0F,0x0B,0x47,0xD7,0x17,0x1F,0x34,0x0E,0xEB,0x47,0x0F,0x0B,0x17,0x0F, +0x2B,0x49,0x0F,0x6B,0x19,0xE4,0x00,0x07,0xAD,0xC2,0xE0,0x10,0x01,0x5F,0x98,0x04, +0xEA,0xF7,0x0B,0x7D,0x5F,0x17,0x15,0x4A,0xFC,0xB8,0x0E,0xEB,0x13,0xCF,0x39,0x00, +0x30,0x9A,0xE0,0x8F,0x2B,0x0B,0x19,0x18,0x27,0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F, +0x38,0x04,0xEA,0xF7,0x0B,0x7F,0x5F,0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB,0x15,0xCE, +0xFB,0x00,0x30,0x8E,0xEB,0x0B,0x17,0x16,0x9A,0xE0,0x27,0x1C,0x50,0xC2,0xE0,0x10, +0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x7D,0x5F,0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB, +0x43,0xCF,0x7B,0x00,0x30,0x9A,0xE0,0x8F,0x6B,0x0B,0x1B,0x18,0x27,0x1C,0x50,0xC2, +0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x7F,0x5F,0x17,0x15,0x4A,0xF9,0xB8, +0x0E,0xEB,0x45,0xE4,0x00,0x00,0x63,0xC3,0x00,0x10,0x01,0x5F,0x77,0x04,0xEB,0x18, +0x0B,0x7D,0x5E,0xF8,0x15,0x4B,0x1B,0xC0,0x0F,0x0B,0x13,0x9A,0xE0,0x27,0x3C,0x50, +0xC2,0xE0,0x10,0x01,0x5F,0x19,0x04,0xEA,0xF7,0x0B,0x7F,0x5F,0x37,0x15,0x4A,0xF8, +0xB8,0x0E,0xEB,0x15,0xE7,0xFF,0xFB,0x74,0xC2,0xE0,0x10,0x01,0x13,0x0B,0x00,0xFE, +0xF7,0x0C,0x00,0x9B,0x20,0x9B,0x4C,0xFF,0x60,0x07,0xF9,0xE4,0x00,0x00,0x47,0x0B, +0x97,0x01,0xD3,0x8B,0x00,0x3D,0x0F,0x57,0x01,0x0B,0x97,0x01,0xC3,0x80,0xFF,0x2A, +0x20,0x00,0x19,0x0F,0x77,0x01,0x9F,0x21,0x1E,0xF7,0x30,0x5F,0x39,0x04,0xD7,0x19, +0xFF,0x0D,0x27,0x04,0x7D,0x0B,0x2B,0x43,0x0A,0xEB,0x13,0x42,0xF9,0xBD,0x0B,0x2B, +0x45,0x0E,0xEB,0x1B,0x0A,0xEB,0x15,0x42,0xF9,0xBD,0x0E,0xEB,0x1D,0xE4,0x00,0x00, +0x15,0x0C,0x0B,0x1B,0x0C,0x0B,0x1D,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xB8,0x22, +0xE1,0x9E,0x52,0xE0,0x52,0x0B,0x2B,0x13,0x1A,0xEA,0x00,0x4F,0x79,0x41,0x0A,0xEB, +0x15,0x4F,0x7B,0x20,0x4F,0x57,0x41,0x1B,0x2A,0x02,0x57,0x5A,0x0F,0x1A,0xEA,0x03, +0x47,0x5B,0xD5,0x1B,0x4A,0x01,0x27,0x04,0xA1,0x0B,0x0B,0x1A,0x0A,0xEB,0x1C,0x4F, +0x38,0x42,0x4F,0x57,0x42,0x5F,0x39,0x04,0x57,0x5A,0x0F,0x4F,0x39,0x20,0x1B,0x0A, +0x05,0x47,0x39,0xD5,0x1A,0xEA,0x06,0x1B,0x2A,0x04,0xE4,0x00,0x00,0x1B,0x18,0x0A, +0x04,0x18,0x0A,0x05,0x18,0x0A,0x06,0x88,0x6A,0x98,0x87,0xE7,0xFF,0xF6,0x3C,0x18, +0x6A,0x07,0xE4,0x00,0x01,0x8B,0x8A,0xEA,0x18,0x17,0x00,0xC3,0x20,0x10,0x01,0x9E, +0xE1,0xFF,0x39,0x07,0xF2,0xD6,0xF9,0xFF,0x9E,0x52,0xE0,0x62,0x1A,0xEA,0x00,0x0A, +0xEB,0x13,0x4F,0x37,0x41,0x1A,0xEA,0x02,0x0A,0xEB,0x15,0x1B,0x2A,0x01,0x1A,0xEA, +0x04,0x4F,0x37,0x41,0x56,0xF8,0x01,0x4F,0x18,0x20,0x52,0xF7,0x20,0x53,0x18,0x02, +0x1A,0xEA,0x11,0x1B,0x0A,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B, +0x0A,0x0D,0x0A,0xEB,0x1C,0x4F,0x17,0x42,0x1B,0x2A,0x03,0x1B,0x0A,0x0F,0x1A,0xEA, +0x10,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF5,0x66,0xC2,0xE0,0x10,0x01,0xC3,0x20, +0x10,0x01,0xC3,0x80,0x10,0x01,0x18,0x6A,0x1F,0xFE,0xF7,0x07,0x90,0xFF,0x39,0x09, +0xA4,0x9B,0x00,0xC3,0x60,0x10,0x01,0xFF,0x9C,0x0C,0xF2,0xF3,0x5B,0x07,0x6F,0x23, +0x44,0x34,0x23,0x48,0x68,0x43,0x58,0x74,0xE4,0x00,0x00,0x0F,0x43,0x58,0xE4,0x17, +0xBA,0x01,0x1B,0xB7,0x00,0x0B,0x5A,0x01,0xE4,0x00,0x00,0x21,0x0F,0x59,0x02,0x4F, +0xBA,0x82,0x4F,0x5A,0x42,0x1B,0xB7,0x00,0x1B,0x57,0x01,0x9F,0x02,0x9E,0xE2,0x9F, +0x24,0x5F,0x07,0x49,0x23,0xFF,0x1D,0x0A,0xEC,0x00,0xD2,0xFF,0x0D,0x9C,0x9A,0xE1, +0xE4,0x00,0x02,0xF5,0xD0,0x60,0x05,0x66,0xFE,0xE0,0x7F,0xFF,0xC3,0x20,0x10,0x01, +0xC3,0x40,0x10,0x01,0xEE,0xF9,0x07,0xF9,0xF8,0x1A,0x08,0x00,0xFF,0x39,0x07,0xF8, +0xFF,0x5A,0x08,0x00,0x0E,0xF9,0x03,0x0E,0xF9,0x05,0x0E,0xF9,0x07,0x18,0x1A,0x01, +0xF2,0xF8,0x00,0xB8,0x22,0xE0,0xB2,0x52,0xE0,0x52,0x1A,0xEA,0x00,0x9A,0xFF,0x88, +0x6A,0x1A,0xEA,0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x05, +0x1A,0xEA,0x06,0x98,0x87,0xE7,0xFF,0xF3,0xE8,0x18,0x6A,0x07,0xE4,0x00,0x00,0x89, +0x8A,0xEA,0x18,0x17,0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0xF2,0xD6, +0xF8,0xFF,0x9E,0x52,0xE0,0x62,0x9B,0x1F,0x1A,0xEA,0x00,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x07,0x71,0x1B,0x17,0x00,0xC3,0x20,0x10,0x01,0x9E,0xE1,0xFF,0x39,0x07,0x8F, +0xD6,0xF9,0xFF,0x9E,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF3,0x60,0x18,0x6A,0x1F, +0x0A,0xEC,0x01,0x0C,0x0D,0x00,0x45,0xEF,0xBD,0x0D,0xEC,0x01,0xE4,0x00,0x02,0x03, +0xD0,0x62,0x07,0xEE,0xF2,0xF8,0x00,0xB8,0x22,0xE0,0xD2,0x52,0xE0,0x52,0xC3,0x00, +0x10,0x01,0x1A,0xEA,0x00,0xEB,0x18,0x08,0x7F,0x9A,0xFF,0x1B,0x0A,0x05,0x1A,0xEA, +0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x06,0x88,0x6A,0x98, +0x87,0xE7,0xFF,0xF2,0xD0,0x18,0x6A,0x07,0xE4,0x00,0x01,0x15,0x8A,0xEA,0x18,0x17, +0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0xF2,0xD6,0xF8,0xFF,0x9E,0x52, +0xE0,0x62,0x1A,0xEA,0x00,0x0A,0xEB,0x13,0x4F,0x17,0x41,0x1A,0xEA,0x02,0x1B,0x0A, +0x01,0x0A,0xEB,0x15,0x4F,0x17,0x41,0x1A,0xEA,0x04,0x1B,0x0A,0x03,0x12,0xEB,0x00, +0x57,0x17,0x01,0x4E,0xF7,0x20,0x53,0x18,0x20,0x52,0xF7,0x02,0x1B,0x0A,0x11,0x1A, +0xEA,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B,0x0A,0x0D,0x0A,0xEB, +0x1C,0x4F,0x17,0x42,0x1A,0xEA,0x10,0x1B,0x0A,0x0F,0x88,0x6A,0x50,0x80,0x1F,0xE7, +0xFF,0xF1,0xF4,0x9A,0xE0,0x18,0x6A,0x1F,0x43,0x17,0x74,0x0B,0x38,0x00,0x43,0x17, +0x54,0x4F,0x59,0x42,0x1B,0x38,0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE7,0x49,0x23, +0xFF,0xA5,0x45,0xF0,0x7D,0x9A,0xE2,0x0D,0xEC,0x01,0x0E,0xED,0x00,0xE4,0x00,0x00, +0x61,0x9B,0x00,0xD2,0xFF,0xE6,0x28,0xE7,0xFF,0xF9,0x61,0x0A,0xEB,0x46,0x0B,0x0B, +0x16,0x5E,0xF8,0x15,0x4B,0x21,0x01,0xCE,0xF9,0x00,0x30,0x8E,0xEB,0x4B,0x60,0x0A, +0x0B,0x17,0x16,0x9A,0xE0,0xD3,0x1F,0xE0,0xA4,0xE7,0xFF,0xF8,0x43,0x0E,0x01,0x02, +0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D, +0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x5C,0x63,0x00,0xCF,0x03,0x00, +0x34,0xCE,0xE3,0x00,0x68,0x1C,0x21,0xC0,0xC0,0x80,0x10,0x01,0x0D,0x21,0x3C,0x1C, +0x61,0x04,0xFC,0x84,0x09,0x34,0xC0,0xA0,0x10,0x01,0x8C,0x98,0xFC,0xA5,0x0A,0xF8, +0x50,0xC0,0x1A,0x8C,0xB7,0xE4,0x00,0x29,0xD2,0x0D,0x21,0x3E,0x1C,0x21,0x40,0x85, +0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x81,0x20,0x5D,0x43,0x00,0x5D,0x84,0x00, +0x42,0xEC,0x55,0x9E,0xE1,0x5E,0xF7,0x00,0x57,0x17,0x03,0x4E,0xF7,0x11,0x5F,0x00, +0x09,0x0D,0x61,0x24,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x49,0xA1,0x01,0x0D,0x21,0x2C, +0x8D,0xB7,0xC1,0xD8,0x00,0x21,0xE4,0x00,0x6A,0x4E,0x99,0x60,0xFD,0xCE,0xB9,0xDF, +0xE4,0x00,0x00,0xE3,0x88,0x61,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xC1,0x5A, +0x9A,0xE4,0x43,0x0E,0x54,0x13,0x58,0x00,0x1F,0x01,0x18,0x4F,0x3A,0x09,0x57,0x5A, +0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50,0x7B,0x47,0x5A,0xC4,0x5F, +0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x61,0x18,0x47,0x18, +0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x9D,0x41,0x5D,0x4A,0x00,0xD5,0x4C,0x00,0xE1,0x06, +0xE0,0x81,0xCC,0x6B,0x00,0x18,0x88,0x81,0x8C,0x77,0x50,0xA0,0x18,0x9D,0x61,0xE7, +0xFF,0xC1,0x94,0xE4,0x00,0x00,0x1D,0x9E,0xE1,0xD2,0xE8,0xFD,0x4E,0xE7,0xFF,0xFF, +0xC5,0x5E,0xEB,0x00,0xD5,0xB7,0xFC,0x85,0xE4,0x00,0x69,0x70,0x0D,0x21,0x2E,0x0D, +0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x1C,0x21, +0x30,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x01,0x62,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xEC,0x77,0x08,0x52,0x85,0x29,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30, +0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0xD0,0x69,0x15,0xE5, +0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xC1,0x98,0x00,0x21,0xFE,0xF7,0xB9,0x2C,0xC1, +0x78,0x00,0x21,0x8E,0xF8,0xFD,0x8C,0xB9,0xDC,0x0E,0xF7,0x02,0x05,0xA0,0x81,0xFD, +0x6B,0xB9,0xDF,0x86,0xE9,0x1C,0x83,0x01,0xCC,0x63,0x00,0x1A,0xCC,0x84,0x00,0x1A, +0x9C,0x9F,0xE7,0xFF,0xFD,0x9E,0xE4,0x00,0x05,0x05,0x0C,0x61,0x04,0xE4,0x00,0x68, +0x40,0x0C,0x61,0x06,0x99,0x40,0x9C,0x7E,0x5C,0x63,0x00,0xCC,0x63,0x00,0x1A,0x8D, +0x63,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xBF,0x3E,0x8B,0x0A, +0x9A,0xE4,0x5F,0x03,0x39,0x20,0x00,0xDD,0x43,0x2B,0xC4,0x13,0x79,0x00,0x1F,0x21, +0x20,0x4F,0x5B,0x09,0x57,0x7B,0x01,0x8F,0x3A,0x17,0x39,0xE8,0x5F,0x60,0x01,0x4B, +0x70,0x7B,0x47,0x7B,0xCC,0x5F,0x37,0x02,0x20,0x00,0x25,0x4F,0x37,0x20,0x5F,0x39, +0x02,0x1D,0x01,0x20,0x47,0x39,0xDD,0x8F,0x48,0x1B,0x3A,0xE8,0x9F,0x01,0x9E,0xE1, +0xD2,0xE8,0xFE,0x16,0xCC,0x6A,0x00,0x06,0x1C,0x81,0x08,0x8C,0x6D,0x50,0xA0,0x18, +0xE7,0xFF,0xBF,0x72,0x9D,0x44,0x5D,0x43,0x89,0x23,0xFE,0x61,0xE4,0x00,0x01,0x99, +0xE4,0x00,0x67,0x3A,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xBE, +0x58,0x9A,0xE4,0xD2,0xE7,0x01,0xC2,0x43,0x0C,0xBC,0x13,0x58,0xFC,0x1F,0x01,0x20, +0x4F,0x3A,0x09,0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50, +0x7B,0x47,0x5A,0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02, +0x1F,0x61,0x20,0x47,0x18,0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x9E,0xE1,0xD2,0xE8,0xFE, +0x36,0xE4,0x00,0x00,0xD5,0xE4,0x00,0x66,0x90,0x1C,0x61,0x08,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xBD,0xAE,0xE4,0x00,0x00,0x9F,0x43,0x0B,0xBC,0x13,0x58,0xFC, +0x1F,0x01,0x20,0x4F,0x3A,0x09,0x57,0x5A,0x01,0x8F,0x19,0x13,0x18,0xE8,0x5F,0x40, +0x01,0x4B,0x50,0x7B,0x47,0x5A,0xC4,0x5F,0x17,0x02,0x5F,0x5A,0x02,0x20,0x00,0x25, +0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x81,0x20,0x47,0x18,0xD5,0x8F,0x3C,0x1B,0x19, +0xE8,0x9E,0xE1,0xD2,0xE8,0xFE,0x3E,0xC1,0x18,0x00,0x21,0x9D,0x64,0xFD,0x08,0xB9, +0xF7,0xD5,0x68,0x00,0x52,0x9A,0xE4,0xE7,0xFF,0xFF,0x67,0x04,0x60,0x81,0x1C,0x81, +0x08,0x50,0xA0,0x18,0xE7,0xFF,0xBD,0xCA,0xE4,0x00,0x65,0xD0,0xE4,0x00,0x02,0x59, +0xE4,0x00,0x65,0x9A,0x99,0x40,0x51,0xC0,0x22,0x1C,0x61,0x08,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xBC,0xAE,0x5E,0xEA,0x00,0x22,0xE0,0xE6,0x12,0xE1,0x15,0x56, +0xF7,0x0F,0x52,0xF7,0x40,0x1A,0xE1,0x15,0x12,0xE1,0x0C,0x56,0xF7,0x0F,0x52,0xF7, +0x50,0x13,0x01,0x0E,0x1A,0xE1,0x0C,0x9A,0xF0,0x47,0x17,0xC4,0x53,0x18,0x06,0x1B, +0x01,0x0E,0x13,0x01,0x1D,0x46,0xF7,0xC4,0x52,0xF7,0x07,0x1A,0xE1,0x1D,0xE4,0x00, +0x01,0x49,0x9A,0xE4,0x43,0x0C,0xBC,0x13,0x58,0xFC,0x1F,0x01,0x20,0x4F,0x3A,0x09, +0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50,0x7B,0x47,0x5A, +0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x61,0x20, +0x47,0x18,0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x1F,0x77,0xFD,0x9E,0xE1,0x5F,0x7B,0x00, +0xD2,0xE7,0xFE,0x26,0xE4,0x00,0x00,0xF7,0x5F,0x97,0x00,0x27,0x84,0x2B,0x11,0x1A, +0x00,0xE4,0x00,0x00,0x0F,0x11,0x19,0x00,0x4F,0xA8,0x09,0x55,0x08,0x01,0x1F,0xC1, +0x20,0x5D,0x00,0x01,0x8F,0xDD,0x49,0x10,0x7B,0x17,0x9E,0xE8,0x47,0x88,0xE4,0x1B, +0x9E,0xE8,0x8B,0xDC,0x5F,0x98,0x02,0x20,0x00,0x31,0x43,0x9B,0xBC,0x4F,0x9C,0x20, +0x5F,0x9C,0x02,0x47,0x9C,0xF5,0x1D,0x01,0x20,0x8F,0xA8,0x1B,0x9D,0xE8,0x9E,0xE1, +0x9F,0x01,0x1F,0x5A,0x15,0x5F,0x18,0x00,0x1F,0x39,0x13,0x5F,0x97,0x00,0xD4,0x7C, +0xFD,0x55,0xCC,0x6A,0x00,0x18,0x19,0xC1,0x1F,0x8C,0x6D,0x1C,0x81,0x08,0x50,0xA0, +0x18,0x9D,0x41,0xE7,0xFF,0xBB,0xAC,0xD1,0x42,0xF7,0x8A,0xE7,0xFF,0xFD,0xFD,0x98, +0x64,0x1F,0x4B,0x02,0x40,0x63,0xDD,0x1F,0x2B,0x03,0x9F,0x64,0x5C,0x63,0x00,0x5F, +0x1B,0x00,0x9A,0xE0,0xE7,0xFF,0xFE,0xE9,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81, +0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x1C, +0x21,0xE8,0x0D,0x61,0x0C,0x0D,0x21,0x14,0x0D,0x41,0x10,0x0D,0x81,0x08,0x0D,0xA1, +0x04,0x89,0x63,0xD0,0x69,0x0C,0xF5,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7, +0xB9,0x54,0x8E,0xF8,0x0E,0xF7,0x02,0x86,0xE9,0xCD,0x43,0x00,0x1A,0xC1,0xA0,0x10, +0x01,0x99,0x80,0xFD,0xAD,0x08,0x54,0x8D,0x4D,0x13,0x4A,0x01,0x13,0x2A,0x00,0x13, +0x0A,0x03,0x12,0xEA,0x02,0x4C,0x9A,0xC0,0x4C,0xB8,0xC0,0x4F,0x5A,0x80,0x4F,0x18, +0x80,0x8C,0x9A,0x8C,0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x88, +0x6C,0x8C,0x99,0x8C,0xB7,0x9D,0x81,0xE4,0x00,0x64,0xD0,0x5D,0x8C,0x00,0x9D,0x44, +0xD1,0x86,0xFE,0x4E,0x98,0x66,0x98,0x80,0x98,0xA0,0xCD,0x4B,0x00,0x1A,0x8D,0x4D, +0x10,0xCA,0x18,0xE4,0x00,0x65,0x00,0x98,0x66,0x98,0x80,0x98,0xA1,0x10,0xCA,0x18, +0xE4,0x00,0x64,0xE6,0x98,0x66,0x98,0x81,0x98,0xA0,0x10,0xCA,0x19,0xE4,0x00,0x64, +0xCC,0x98,0x66,0x98,0x81,0x98,0xA1,0x10,0xCA,0x19,0xE4,0x00,0x64,0xB2,0x98,0x66, +0x98,0x82,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x64,0x9A,0x98,0x66,0x98,0x82,0x98,0xA1, +0x98,0xC0,0xE4,0x00,0x64,0x82,0x98,0x66,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4,0x00, +0x64,0x6A,0x98,0x66,0xE4,0x00,0x00,0x83,0xC1,0xA0,0x10,0x01,0x99,0x40,0xFD,0xAD, +0x08,0x72,0x5D,0x8A,0x00,0x41,0x6A,0x6C,0x98,0x60,0x88,0x8C,0x98,0xA0,0x10,0xCB, +0x00,0xE4,0x00,0x64,0x24,0x98,0x60,0x88,0x8C,0x98,0xA1,0x10,0xCB,0x00,0x9D,0x41, +0xE4,0x00,0x64,0x06,0x21,0x4F,0x7A,0x98,0x60,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4, +0x00,0x63,0xE8,0x98,0x60,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41, +0x12,0x0D,0x21,0x16,0x98,0x83,0x98,0xA1,0x98,0xC0,0x1C,0x21,0x18,0xE4,0x00,0x63, +0xAD,0xC3,0x00,0x10,0x01,0x0D,0xA1,0x06,0xFE,0xF8,0x08,0x6E,0xF3,0x38,0x08,0x6E, +0x13,0x57,0x01,0x13,0x17,0x03,0x4C,0x9A,0xC0,0x12,0xF7,0x02,0x4C,0xB8,0xC0,0x4F, +0x5A,0x80,0x4F,0x18,0x80,0x8C,0x9A,0x8C,0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40, +0x4E,0xF7,0x40,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x98, +0x60,0x8C,0x99,0x8C,0xB7,0x1C,0x21,0x18,0xE4,0x00,0x62,0xAF,0xC1,0x60,0x10,0x01, +0x99,0x40,0xFD,0x6B,0x08,0x75,0x4D,0xAA,0x11,0x55,0x8A,0x03,0x10,0xCB,0x00,0x88, +0x6D,0x88,0x8C,0x98,0xA0,0xE4,0x00,0x62,0xDC,0x10,0xCB,0x00,0x88,0x6D,0x88,0x8C, +0x98,0xA1,0x9D,0x41,0xE4,0x00,0x62,0xBE,0x5D,0x4A,0x00,0x9D,0x61,0xD1,0x48,0xFE, +0xCE,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16, +0x1C,0x21,0x18,0x85,0x29,0x1C,0x21,0xE0,0x0D,0xC1,0x08,0x0D,0x21,0x1C,0x0D,0x41, +0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xE1,0x04,0x89,0xC4,0xD0, +0x66,0x00,0xB5,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0x7C,0x4C,0x63,0x10,0x8C,0x77, +0x0E,0xE3,0x02,0x86,0xE9,0x99,0xED,0xC9,0x80,0x3E,0x0C,0xE4,0x00,0x02,0x81,0x24, +0x84,0x47,0xC2,0xE0,0x10,0x01,0x99,0xE7,0xE9,0x97,0x01,0x5F,0xE4,0x00,0x01,0x6B, +0x1E,0xE4,0xFE,0xD2,0xE1,0x04,0xC1,0xD0,0x87,0x05,0x22,0x5D,0xC1,0x01,0xCA,0xE0, +0x3E,0x0C,0x49,0xE2,0x6B,0xC9,0x80,0x10,0x06,0xE4,0x00,0x00,0xDD,0xD0,0x81,0x05, +0x01,0x1E,0xE4,0xFE,0xD2,0xE1,0x05,0x19,0xD0,0x87,0x05,0x7A,0x5C,0x81,0x01,0xCA, +0xE0,0x3E,0x0C,0xC9,0x80,0x10,0x06,0x99,0xA0,0x49,0xE2,0x6B,0x49,0x8C,0xB8,0x89, +0x4D,0xE4,0x00,0x00,0x9B,0xD0,0x81,0x05,0x21,0x1E,0xE4,0xFE,0xD2,0xE1,0x05,0x19, +0xD0,0x87,0xFD,0xDE,0xE4,0x00,0x01,0x57,0xD0,0x81,0x05,0xC9,0x5C,0x80,0xE1,0xCA, +0xE0,0x3E,0x0C,0xC9,0x80,0x08,0x03,0x49,0xE1,0x6B,0x49,0x8C,0xB8,0xE4,0x00,0x01, +0x55,0xD0,0x81,0x05,0x71,0xD0,0x87,0x05,0x82,0x5C,0x81,0x01,0xCA,0xE0,0x3E,0x0C, +0x49,0xE2,0x6B,0xC9,0x80,0x20,0x09,0x49,0x8C,0xB8,0x99,0xA2,0x99,0x41,0x49,0x61, +0x01,0xE4,0x00,0x01,0x41,0x99,0xE1,0xE4,0x00,0x00,0xF9,0x99,0xE7,0xC9,0x80,0x3E, +0x0C,0x99,0xA2,0x99,0x41,0x99,0x63,0xE4,0x00,0x00,0x21,0x99,0xE1,0xC9,0x80,0x32, +0x0B,0x99,0xA2,0x99,0x41,0x99,0x60,0x98,0x60,0xE4,0x00,0x00,0xF5,0x99,0xE7,0xC9, +0x80,0x3E,0x0C,0xE4,0x00,0x00,0x35,0x99,0xA0,0x99,0xE7,0xC9,0x80,0x3E,0x0C,0x89, +0x4D,0x99,0x63,0xE4,0x00,0x00,0x21,0x99,0xE1,0xC9,0x80,0x32,0x0B,0x99,0xA0,0x99, +0x60,0x89,0x4D,0x98,0x61,0xE4,0x00,0x00,0x9D,0x99,0xE7,0xE4,0x00,0x00,0x2D,0x99, +0xE7,0xC9,0x80,0x3E,0x0C,0x99,0xA2,0x99,0x41,0x99,0x63,0xE4,0x00,0x00,0x21,0x99, +0xE1,0xC9,0x80,0x32,0x0B,0x99,0xA2,0x99,0x41,0x99,0x60,0x98,0x62,0xE4,0x00,0x00, +0x4D,0x99,0xE7,0xC9,0x80,0x08,0x03,0x99,0xA0,0x89,0x4D,0xE4,0x00,0x00,0x29,0x99, +0xE7,0xE4,0x00,0x00,0x0D,0x99,0xE1,0xC9,0x80,0x10,0x06,0x99,0xA2,0x99,0x41,0x99, +0x60,0x98,0x63,0xE7,0xFF,0x9D,0xEC,0x88,0x6A,0x88,0x8D,0xE4,0x00,0x75,0x64,0x88, +0x6A,0x88,0x8C,0xE4,0x00,0x60,0x40,0x21,0xA0,0x3E,0x88,0x6A,0x88,0x8C,0xE4,0x00, +0x71,0x3E,0xE4,0x00,0x00,0x1F,0x21,0xA0,0x2C,0x88,0x6A,0x88,0x8C,0xE4,0x00,0x72, +0x9A,0x88,0x6A,0x05,0x80,0xFF,0xC9,0x8C,0xFF,0xFF,0x88,0x8C,0xE4,0x00,0x62,0xC6, +0x88,0x8C,0x88,0x6A,0xE4,0x00,0x60,0x4E,0x98,0x62,0xE4,0x00,0x5D,0xCE,0xC2,0xE0, +0x10,0x01,0x98,0x60,0xEC,0x17,0x08,0x48,0xC1,0xA0,0x10,0x01,0xEC,0x0D,0x08,0x4C, +0xE4,0x00,0x6A,0x0A,0x98,0x60,0xE4,0x00,0x62,0x0A,0x98,0x60,0x88,0x8C,0xE4,0x00, +0x60,0xFA,0x88,0x6F,0xE4,0x00,0x5D,0x26,0x98,0x60,0xE4,0x00,0x63,0x4A,0x21,0x64, +0x5E,0xED,0x6D,0x08,0x4C,0x98,0x61,0xE4,0x00,0x69,0xBC,0x98,0x63,0xE4,0x00,0x61, +0xBC,0xE4,0x00,0x00,0x2B,0x21,0x6C,0x46,0x98,0x61,0x88,0x8C,0xE4,0x00,0x60,0x9E, +0x98,0x61,0xE4,0x00,0x62,0xFA,0xE4,0x00,0x66,0xDE,0x1C,0x63,0x13,0x5C,0x83,0x00, +0x88,0x6A,0x5C,0x82,0x93,0x20,0x00,0x1B,0x50,0x80,0x14,0xE4,0x00,0x63,0xFC,0x88, +0x6A,0x98,0x8C,0xE4,0x00,0x63,0x1E,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xED,0xD7,0x08, +0x50,0xE7,0xFF,0xF2,0x0C,0x88,0x6E,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E, +0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0xE7, +0xFF,0xF7,0xA1,0xC2,0xE0,0x10,0x01,0x9C,0x30,0xEC,0x77,0x01,0x60,0x0D,0x41,0x08, +0x0D,0x61,0x04,0x0D,0x21,0x0C,0x0D,0x81,0x00,0x89,0x43,0xC1,0x60,0x10,0x01,0xE7, +0xFF,0xFA,0xEC,0xFD,0x6B,0x00,0xDE,0x25,0x44,0x29,0x21,0x4D,0x32,0xE4,0x00,0x00, +0x67,0x99,0x40,0xC1,0x80,0x10,0x01,0x88,0x6A,0xE8,0x8C,0x08,0x11,0x9D,0x41,0xE4, +0x00,0x68,0xC6,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x8E,0xE7,0xFF,0xDE,0x9C,0xC2,0xE0, +0x10,0x01,0x0C,0x6B,0x0B,0xEB,0x17,0x06,0xFF,0x53,0x18,0x20,0xE4,0x00,0x00,0x2D, +0xE7,0xFF,0xDE,0x70,0xC2,0xE0,0x10,0x01,0x0C,0x6B,0x0F,0xEB,0x17,0x06,0xFF,0x53, +0x18,0x80,0xEF,0x17,0x06,0xFF,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D, +0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x1C,0x21,0xD0,0xC2,0xE0,0x10,0x01,0x0D,0x41, +0x28,0x0D,0xC1,0x18,0xEE,0xF7,0x00,0xDA,0x0D,0x21,0x2C,0x0D,0x61,0x24,0x0D,0x81, +0x20,0x0D,0xA1,0x1C,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E,0x21,0x0C,0x0E,0x41,0x08, +0x0E,0x61,0x04,0x5E,0xE0,0x41,0x89,0x43,0x49,0xC1,0x01,0x24,0x64,0x69,0x1E,0xE3, +0xFE,0xD2,0xE1,0x04,0xA9,0xD0,0x67,0x04,0xC2,0xD0,0x69,0x04,0xD2,0xD0,0x68,0x04, +0xE2,0xE4,0x00,0x01,0x0B,0x51,0x60,0x1A,0x9A,0xE0,0x20,0x60,0x5C,0x9A,0xE0,0xD1, +0x45,0x00,0x92,0x9A,0xE1,0x21,0x44,0x30,0x21,0x4C,0x24,0xD1,0x46,0x00,0x32,0x9A, +0xE0,0xCE,0xF7,0x00,0x34,0xC1,0xE0,0x10,0x01,0xC2,0x00,0x10,0x01,0xFD,0xEF,0x09, +0x34,0xFE,0x10,0x08,0x12,0x99,0x80,0xC2,0x40,0x10,0x01,0xC2,0x60,0x10,0x01,0x8D, +0xF7,0x8E,0x17,0x89,0xAC,0x1E,0x2A,0xFE,0xFE,0x52,0x0B,0xDC,0xFE,0x73,0x08,0xA6, +0x88,0x6D,0x98,0x81,0x88,0xAE,0xE4,0x00,0x6D,0x12,0x42,0xEF,0x64,0x25,0x44,0x5D, +0x42,0xF0,0x64,0x26,0x24,0x45,0x42,0xEC,0x9C,0xD1,0x47,0x00,0x5A,0xD1,0x48,0x00, +0x56,0x42,0xEC,0x94,0x0C,0x77,0x01,0x9D,0xA1,0x9D,0x82,0x5D,0xAD,0x00,0xD5,0x6D, +0xFE,0x95,0xE4,0x00,0x00,0x4F,0x51,0x60,0x1A,0xE4,0x00,0x00,0x2D,0x99,0x63,0xE7, +0xFF,0xFF,0x21,0x99,0x64,0xE7,0xFF,0xFF,0x15,0x99,0x68,0xE7,0xFF,0xFF,0x09,0x9A, +0xE0,0xD1,0x42,0xFB,0x66,0xE7,0xFF,0xFE,0xF9,0x0E,0x61,0x06,0x0E,0x41,0x0A,0x0E, +0x21,0x0E,0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81, +0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29,0x9C, +0x30,0x0D,0x41,0x08,0x0D,0x21,0x0C,0x0D,0x61,0x04,0x89,0x44,0xD0,0x67,0x08,0x15, +0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0x98,0x4C,0x63,0x10,0x8C,0x77,0xC2,0xE0,0x10, +0x01,0x0F,0x03,0x02,0xFE,0xF7,0x06,0xFE,0x87,0x09,0x0B,0x17,0x01,0xC7,0x18,0xFF, +0xDF,0x0F,0x17,0x01,0xD0,0x88,0x06,0xD5,0x9A,0xE1,0x4E,0xF7,0x24,0xC6,0xF7,0x01, +0x83,0xD2,0xE0,0x06,0x6A,0xE4,0x00,0x01,0x6F,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF, +0x0F,0x17,0x01,0xD0,0x88,0x05,0xDD,0x9A,0xE1,0x4E,0xF7,0x24,0xC7,0x17,0x01,0x8C, +0xD3,0x00,0x04,0xE6,0x56,0xF7,0x03,0xD2,0xE0,0x05,0x3A,0x88,0x64,0xE7,0xFF,0xFC, +0xF4,0xCE,0xEA,0x00,0x34,0xC1,0x60,0x10,0x01,0xFD,0x6B,0x09,0x34,0x8D,0x77,0x88, +0x6B,0xE7,0xFF,0xA1,0x0A,0xE7,0xFF,0xA0,0x80,0xD0,0x60,0x04,0x2A,0x88,0x6B,0xE7, +0xFF,0xA1,0x6C,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x01,0x62,0x22,0xE5,0xCE,0xE4,0x00, +0x00,0x41,0xD0,0x88,0x03,0x65,0x9A,0xE1,0x4E,0xF7,0x24,0xC7,0x17,0x01,0x8C,0x23, +0x01,0x36,0x56,0xF7,0x03,0x22,0xE1,0x64,0x88,0x6A,0xE7,0xFF,0xFC,0x5A,0x88,0x6A, +0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xEA,0xBD, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0x0F,0x17,0x01,0xD0,0x88,0x01,0xA5,0x4F,0x04, +0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0xB8,0x8E,0xF8,0x0E,0xF7,0x02,0x86,0xE9, +0x98,0x67,0xE4,0x00,0x00,0x19,0x98,0x68,0xE4,0x00,0x00,0x0D,0x88,0x6A,0x0D,0x61, +0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xFB,0xBB,0x0D,0x61, +0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01, +0x98,0x60,0xFE,0xF7,0x08,0x12,0xCB,0x40,0xFF,0xFE,0x0B,0x37,0x00,0x4F,0x19,0xFA, +0x47,0x38,0xCE,0x43,0x19,0xC5,0x8C,0x78,0x5F,0x03,0x04,0xCB,0x20,0xFF,0xFE,0x9E, +0xE2,0x5C,0x79,0x17,0x48,0x78,0xD0,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0x46,0xD6, +0xF8,0xFE,0xDE,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x04,0xC2,0xE0,0x10, +0x01,0xEC,0x17,0x08,0x08,0xC2,0xE0,0x10,0x01,0x9B,0x04,0xEC,0x17,0x08,0x0C,0x98, +0x64,0xC2,0xE0,0x10,0x01,0x98,0x80,0xEF,0x17,0x01,0x60,0xE7,0xFF,0xF4,0xF5,0x20, +0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x06,0xE4,0x00,0x00,0x41,0x20,0x68, +0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x0A,0xE4,0x00,0x00,0x23,0x9A,0xE0,0x20, +0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x0E,0x88,0x77,0x85,0x29,0x20,0x64, +0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x08,0x04,0xE4,0x00,0x00,0x3D,0x20,0x68,0x3E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x08,0x08,0xE4,0x00,0x00,0x1F,0x20,0x6C,0x2E,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x08,0x0C,0x85,0x29,0xC3,0x80,0x10,0x01,0xC3,0x60,0x10, +0x01,0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xFF,0x9C,0x08, +0x8C,0xFF,0x7B,0x08,0xD4,0xFF,0x5A,0x08,0x83,0xFF,0x39,0x0B,0xCC,0xFF,0x18,0x08, +0xC4,0x20,0x69,0x7A,0x0A,0xFC,0x04,0x0B,0xD9,0x09,0x43,0xD7,0xF5,0x5F,0xDE,0x06, +0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43,0xBE,0xED,0x5F,0xAC,0x99,0x20,0x00,0x7D,0x0B, +0xBC,0x07,0x0B,0x99,0x0B,0x43,0xBD,0xE5,0x5F,0xBD,0x06,0x4F,0x9D,0xFA,0x47,0xBC, +0xEE,0x43,0x9D,0xE5,0xC3,0x80,0x10,0xE8,0x20,0x05,0x19,0x0E,0xF8,0x01,0xC2,0xE0, +0x10,0x01,0xEA,0xF7,0x08,0x93,0x0B,0x99,0x0B,0x0E,0xF8,0x03,0x0B,0x39,0x0F,0x12, +0xFA,0x00,0x0F,0x9B,0x01,0x0F,0x3B,0x03,0x52,0xF7,0x02,0xE4,0x00,0x01,0x57,0xC3, +0xA0,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0xBD,0x08,0x88,0xFE,0xF7,0x0B,0xEC,0x20, +0x6D,0x92,0x0B,0x79,0x01,0x0B,0xDC,0x01,0x43,0xDE,0xDD,0x5F,0xDE,0x06,0x4F,0x7E, +0xFA,0x47,0xDB,0xF6,0x43,0x7E,0xDD,0x5F,0x6C,0x99,0x20,0x00,0x7D,0x0B,0x39,0x03, +0x0B,0x7C,0x03,0x43,0x7B,0xCD,0x5F,0x7B,0x06,0x4F,0x3B,0xFA,0x47,0x79,0xDE,0x43, +0x3B,0xCD,0xC3,0x20,0x10,0xE8,0x20,0x03,0x61,0x0B,0x37,0x17,0x0F,0x38,0x01,0x0B, +0x37,0x19,0x0F,0x38,0x03,0x0B,0x37,0x47,0x0A,0xF7,0x49,0x0E,0xF8,0x07,0x12,0xFA, +0x00,0x52,0xF7,0x01,0x0F,0x38,0x05,0x1A,0xFA,0x00,0x9A,0xE2,0x1A,0xFD,0x00,0xE4, +0x00,0x01,0x5F,0xD0,0x64,0x01,0xD6,0x0B,0x3B,0x00,0x0B,0x7B,0x02,0x43,0x79,0xDD, +0x9F,0x6E,0x5F,0x63,0x9B,0x20,0x00,0x2F,0xC3,0x20,0x10,0x01,0xEB,0x39,0x08,0xC7, +0x0B,0x18,0x01,0x0F,0x17,0x47,0x9B,0x02,0x0F,0x37,0x49,0x1B,0x17,0x00,0x12,0xFA, +0x00,0x9B,0x1D,0x46,0xF7,0xC4,0x1A,0xFA,0x00,0xE4,0x00,0x00,0xEB,0xD0,0x65,0x03, +0x8E,0x13,0x7D,0x00,0x23,0x68,0xFE,0x0B,0x98,0x00,0x0B,0x59,0x00,0x8F,0x5C,0x43, +0x5A,0xD8,0x0B,0x98,0x02,0x0F,0x57,0x17,0x0B,0x59,0x02,0x8F,0x5C,0x43,0x5A,0xD8, +0x0B,0x98,0x04,0x0F,0x57,0x19,0x0B,0x59,0x08,0x8F,0x5C,0x43,0x5A,0xD8,0x0F,0x57, +0x47,0x0B,0x58,0x06,0x0B,0x19,0x0A,0x8F,0x1A,0x43,0x78,0xD8,0x0F,0x77,0x49,0xE4, +0x00,0x00,0x55,0x23,0x64,0x9A,0x0B,0x38,0x01,0x0F,0x37,0x17,0x0B,0x38,0x03,0x0F, +0x37,0x19,0x0B,0x38,0x05,0x0B,0x18,0x07,0x0F,0x37,0x47,0x0F,0x17,0x49,0x9B,0x3E, +0x13,0x1A,0x00,0x47,0x18,0xCC,0x1B,0x1A,0x00,0x9B,0x02,0x1B,0x17,0x00,0x85,0x29, +0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0x8C,0xFE,0xE0,0x7F,0xFF,0x0E,0xF8,0x01,0x0E, +0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x9B,0x01,0xC3,0x20,0x10,0x01,0xFF,0x39, +0x01,0xAC,0x1B,0x19,0x01,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0xF0,0x0E,0xF8,0x01, +0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0xC3,0x00,0x10,0x01,0xF8,0x18,0x08, +0xE0,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0xCC,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E, +0xF8,0x05,0x0E,0xF8,0x07,0x0E,0xF8,0x09,0x0E,0xF8,0x0B,0x0E,0xF8,0x0D,0x0E,0xF8, +0x0F,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xFD,0xC2,0xE0,0x10,0x01,0x18,0x19,0x00, +0xF3,0x17,0x08,0x83,0x9B,0x3C,0x47,0x18,0xCC,0xFB,0x17,0x08,0x83,0xC2,0xE0,0x10, +0x01,0xF8,0x17,0x08,0x88,0x85,0x29,0xC3,0x00,0x10,0x01,0xC3,0x40,0x10,0x01,0x5C, +0x63,0x00,0xFF,0x18,0x09,0x68,0x9A,0xE0,0xFF,0x5A,0x0A,0x18,0xE4,0x00,0x00,0x31, +0x4F,0x37,0x10,0x0B,0x98,0x00,0x0B,0x78,0x02,0x8F,0x3A,0x8F,0x7C,0x9E,0xE1,0x0F, +0x79,0x00,0x9F,0x04,0x5F,0x37,0x00,0xD4,0x79,0xFF,0x4D,0x85,0x29,0xC3,0x00,0x10, +0x01,0x5C,0x84,0x00,0xFF,0x18,0x09,0x68,0x20,0xA0,0x6C,0xE4,0x00,0x00,0x4B,0x4F, +0x37,0x08,0x9E,0xE1,0x43,0x59,0xC4,0x8F,0x23,0x0B,0x5A,0x00,0x0F,0x59,0x01,0xE4, +0x00,0x00,0x0D,0x9A,0xE0,0x5F,0x37,0x00,0xD4,0x99,0xFF,0x3D,0xE4,0x00,0x00,0x7B, +0x20,0xA4,0xE6,0xE4,0x00,0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1,0x43,0x43,0xCC,0x8F, +0x38,0x0B,0x5A,0x00,0x0F,0x59,0x01,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x5F,0x37,0x00, +0xD4,0x99,0xFF,0x3D,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x76,0x10,0x77,0x01,0x12, +0xF7,0x04,0x40,0x63,0xBB,0xE7,0xFF,0xFE,0xC5,0x85,0x29,0x9C,0x38,0x98,0x63,0x0D, +0x21,0x04,0xE7,0xFF,0x8F,0x6E,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x77,0x37,0x9A, +0xED,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0xC1,0x60,0x10,0x01,0xFD,0x4B,0x0B, +0x76,0x1A,0xEA,0x04,0x9A,0xE1,0x1A,0xEA,0x01,0xFE,0xE0,0x07,0xFF,0x0E,0xEA,0x07, +0x0E,0xEA,0x09,0xC2,0xE0,0x10,0x01,0x9B,0x02,0xFB,0x17,0x08,0xCE,0x52,0xE0,0xAA, +0x0D,0x21,0x0C,0x0E,0xEA,0x0B,0x50,0x60,0x19,0x98,0x80,0xE7,0xFF,0x4A,0xFE,0x52, +0xE0,0x1D,0xFA,0xEB,0x0B,0x76,0x9A,0xE4,0x1A,0xEA,0x0C,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x00,0xCD,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xBC,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x08,0xE8,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xE3,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xB0,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xB8,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xE6,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xDF,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xA4,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xF8,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xD2,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xC3,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x08,0xC1,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xB4,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x08,0x7F,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xD3,0xC2,0xE0,0x10,0x01,0x9B, +0x03,0xFB,0x17,0x08,0xC2,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x07,0xF4,0xC2,0xE0,0x10, +0x01,0xF8,0x17,0x08,0xE0,0xC2,0xE0,0x10,0x01,0xFF,0x00,0x01,0xF4,0xEF,0x17,0x06, +0xFD,0xC2,0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0xF8,0x17,0x08,0xF9,0xFC,0x63,0x0A, +0x18,0x98,0x80,0x50,0xA0,0x3C,0xE7,0xFF,0xA3,0x26,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x0B,0xEC,0x18,0x17,0x04,0x18,0x17,0x05,0x18,0x17,0x06,0x18,0x17,0x34,0x18,0x17, +0x35,0x18,0x17,0x36,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xAC,0xC2,0xE0,0x10,0x01, +0xF3,0x37,0x00,0xB8,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3D,0xF9,0xCA,0xF7,0x3D,0xF8, +0x1B,0x38,0x00,0xC3,0x00,0x10,0x01,0xF3,0x18,0x07,0x6F,0x1B,0x17,0x00,0xC2,0xE0, +0x10,0x01,0xEB,0x17,0x08,0x9F,0x53,0x18,0x04,0xEF,0x17,0x08,0x9F,0xC2,0xE0,0x10, +0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x1D,0x58,0xEF,0x17,0x03,0xE4,0xC2,0xE0,0x10, +0x01,0x53,0x00,0xF0,0xEF,0x17,0x08,0xEF,0xC2,0xE0,0x10,0x01,0x53,0x00,0xCA,0xEF, +0x17,0x08,0x8B,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x1B,0xCF,0xEF, +0x17,0x03,0xF8,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x19,0x89,0xEF, +0x17,0x04,0x18,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x1A,0x62,0xEF, +0x17,0x04,0x14,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x0B,0x9C,0xFE,0xF7,0x0B,0x9C,0xC3, +0x60,0x10,0x01,0x18,0x17,0x01,0x18,0x17,0x02,0x18,0x17,0x03,0x0C,0x17,0x05,0x0C, +0x17,0x07,0x0C,0x17,0x0B,0x0C,0x17,0x09,0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01, +0x9A,0xE0,0xFF,0x7B,0x09,0x68,0xFF,0x5A,0x0C,0xF2,0xFF,0x39,0x09,0xA4,0x43,0x17, +0xDC,0x0C,0x18,0x01,0x43,0x17,0xD4,0x0C,0x18,0x01,0x4F,0x17,0x08,0x8F,0x19,0x0C, +0x18,0x00,0x9E,0xE2,0x5E,0xE7,0x49,0x23,0xFF,0x9D,0x0D,0x61,0x06,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xE4,0x00,0x70,0x65,0x1C,0x21,0xE8,0x0D, +0x21,0x14,0xE7,0xFF,0xCD,0xBC,0xE7,0xFF,0xA6,0xE2,0xE7,0xFF,0xCC,0xE6,0xE7,0xFF, +0xF4,0xCE,0x50,0xE0,0x14,0x99,0x0C,0x0C,0x01,0x01,0x50,0x60,0x1A,0x50,0x80,0x1A, +0x98,0xA4,0x04,0xC1,0x6E,0xC8,0xC6,0x36,0x00,0xE7,0xFF,0x92,0xB8,0xFC,0xC0,0x01, +0x78,0xFC,0xA0,0x02,0xD6,0xC0,0x60,0x10,0x01,0xC0,0x80,0x10,0x01,0xFC,0x63,0x01, +0x5E,0xFC,0x84,0x08,0x10,0xE7,0xFF,0x95,0x46,0x98,0x60,0x88,0x83,0xE7,0xFF,0x88, +0xBC,0x98,0x60,0x98,0xA0,0x88,0x83,0xE7,0xFF,0x88,0xC2,0x98,0x60,0x98,0xA0,0x88, +0x83,0xE7,0xFF,0x88,0xD8,0x98,0x80,0x98,0x61,0x88,0xA4,0xE7,0xFF,0x88,0xC4,0x98, +0xA0,0x98,0x62,0x98,0x81,0xE7,0xFF,0x88,0xB0,0x98,0x62,0x98,0x80,0xE7,0xFF,0x89, +0x26,0x98,0x60,0x50,0x80,0x66,0xE7,0xFF,0x89,0x2E,0x98,0x61,0x50,0x80,0x66,0xE7, +0xFF,0x89,0x1C,0x98,0x62,0x50,0x80,0xF3,0xE7,0xFF,0x89,0x0A,0x98,0x60,0xFC,0x80, +0xA0,0x00,0xE7,0xFF,0x89,0x52,0x98,0x61,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x89,0x3E, +0x98,0x62,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x89,0x2A,0xFC,0x80,0x01,0x26,0x98,0x62, +0xE7,0xFF,0x89,0x72,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x96,0xC0,0xE7,0xFF,0xFA,0x26, +0x98,0x61,0xE7,0xFF,0x64,0x4C,0xE7,0xFF,0x50,0x80,0x50,0x60,0x1B,0xE7,0xFF,0x8D, +0x60,0x9A,0xEE,0x0E,0xE1,0x00,0x52,0xE0,0x14,0x0E,0xE1,0x04,0xCA,0xE0,0x07,0xD0, +0x98,0xC8,0x0E,0xE1,0x08,0x98,0xAE,0x88,0xE6,0x99,0x0A,0x98,0x6A,0x98,0x8C,0xE7, +0xFF,0x44,0x90,0x98,0x81,0x98,0x60,0xE7,0xFF,0xCB,0x92,0x50,0x60,0x10,0xE7,0xFF, +0xCB,0xBC,0xE4,0x00,0x47,0xE4,0xE7,0xFF,0xF9,0x6A,0x98,0x80,0x98,0x60,0xE7,0xFF, +0x42,0x52,0xE7,0xFF,0xB9,0xC0,0xE7,0xFF,0xB8,0xB6,0xC2,0xE0,0x10,0x01,0xF0,0x77, +0x01,0xAE,0xE7,0xFF,0xCB,0x54,0x9B,0x00,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00,0x0D, +0xC3,0x17,0x00,0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D,0xC3,0x17,0x00,0x0F,0x53, +0x18,0x08,0xC3,0x17,0x00,0x0D,0xC2,0xE0,0x01,0x1F,0x52,0xF7,0x06,0xC2,0xE0,0x01, +0x1D,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xCA,0xFE,0x50,0x60,0x20,0xE7,0xFF,0xCB,0x08, +0x98,0x61,0x50,0x80,0x13,0x50,0xA0,0x37,0x98,0xC8,0xFC,0xE0,0x01,0x0D,0xE7,0xFF, +0xAC,0x90,0xC3,0x00,0x00,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x38,0x80,0x0D,0x21, +0x16,0xEF,0x17,0x03,0xD0,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x00,0xDA,0x23,0x05,0x08,0xEE,0xF7,0x00,0xDA,0x22,0xE8,0xEC,0xC3,0x00,0x10,0x01, +0xC2,0xE0,0x10,0x01,0xFF,0x18,0x08,0xA6,0xFE,0xF7,0x08,0xD8,0x0B,0x38,0x01,0xC3, +0x60,0x10,0x01,0x0F,0x37,0x01,0xC3,0x40,0x10,0x01,0x0B,0x38,0x03,0xFF,0x7B,0x0A, +0xE8,0x0F,0x37,0x03,0x0B,0x18,0x05,0xFF,0x5A,0x0B,0xDC,0x0F,0x17,0x05,0x9A,0xE0, +0xE4,0x00,0x00,0x5D,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0x9A,0xE0,0xFF,0x7B, +0x09,0x00,0xFF,0x5A,0x09,0x34,0x43,0x17,0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01,0x0F, +0x38,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xE7,0xFF,0xFF,0x45,0x43,0x17, +0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01,0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE2,0x09,0x23, +0xFF,0xBD,0x85,0x29,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0x9A,0xE0,0xFF,0x18, +0x0C,0xF2,0xFF,0x7B,0x09,0x00,0x43,0x37,0xC4,0x43,0x57,0xDC,0x0B,0x5A,0x01,0x0F, +0x59,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x08,0xD8,0x0B,0x37,0x01,0x0F,0x38,0x35,0x0B,0x37,0x03,0x0A,0xF7,0x05,0x0F,0x38, +0x37,0x0E,0xF8,0x39,0x85,0x29,0xE4,0x00,0x6D,0x63,0xC2,0xE0,0x10,0x01,0xFF,0x20, +0xDF,0x9F,0xEB,0x17,0x08,0xE3,0x47,0x18,0xCC,0x9B,0x3E,0xEF,0x17,0x08,0xE3,0xC2, +0xE0,0x10,0x01,0xEB,0x17,0x08,0xCD,0x47,0x18,0xCC,0xEF,0x17,0x08,0xCD,0x85,0x29, +0xC2,0xE0,0x10,0x01,0x88,0xC3,0xF3,0x17,0x00,0xB8,0x23,0x08,0x4A,0xF2,0xF7,0x00, +0xB8,0x22,0xE8,0x2E,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x6F,0xC3,0x00,0x10,0x01, +0x9A,0xE0,0xFF,0x18,0x09,0x68,0x8B,0x38,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3, +0x01,0x20,0x00,0x25,0x5E,0xE3,0x29,0x20,0x00,0x31,0x0B,0x59,0x01,0x4F,0x5A,0x08, +0x0F,0x59,0x01,0x9E,0xE1,0x9F,0x22,0x5E,0xE3,0x49,0x23,0xFF,0x79,0xC2,0xE0,0x10, +0x01,0xC3,0x80,0x10,0x01,0xF3,0xD7,0x0B,0x76,0xFF,0x5C,0x08,0xE2,0xC3,0xA0,0x10, +0x01,0x1C,0x7E,0xFF,0xFF,0xBD,0x08,0xA4,0x0A,0xFA,0x01,0x13,0x7D,0x00,0x9B,0x20, +0xE4,0x00,0x00,0x65,0xD4,0x79,0x00,0xF0,0x08,0x98,0x00,0x09,0x18,0x02,0x8D,0x04, +0xC1,0x00,0x1D,0xE8,0x20,0x00,0x39,0xC1,0x00,0x59,0xE8,0xCA,0xF7,0x20,0x00,0x4B, +0x7B,0x00,0x09,0x18,0x00,0x50,0x97,0x40,0x5D,0x04,0x19,0x9F,0x21,0x4A,0xE4,0xB8, +0x9F,0x02,0x5D,0x19,0x04,0xD7,0xC8,0xFE,0x7D,0xC3,0x00,0x10,0x01,0x0E,0xFA,0x01, +0x1B,0x7D,0x00,0xFF,0x18,0x0B,0x60,0x0B,0x38,0x00,0x53,0x77,0x20,0x5F,0x2C,0x99, +0x9F,0x02,0xC3,0x20,0x10,0x01,0x4A,0xFB,0xB8,0xFF,0x39,0x0B,0x70,0xD7,0x19,0xFF, +0x56,0x98,0x60,0x0E,0xFA,0x01,0x88,0x83,0x98,0xA0,0xE7,0xFF,0xB5,0x99,0x9C,0x38, +0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x40,0x10,0x01,0x20,0x64,0x62,0xE7,0xFF,0xB6, +0xB4,0x20,0x64,0x56,0xF2,0xEA,0x08,0xA4,0x9E,0xE1,0xFA,0xEA,0x08,0xA4,0xE4,0x00, +0x00,0x19,0xE7,0xFF,0xB7,0x3A,0xF8,0x0A,0x08,0xA4,0xE7,0xFF,0xD9,0x72,0x20,0x64, +0x26,0x99,0x43,0xE4,0x00,0x00,0x29,0xE7,0xFF,0xD9,0x58,0x99,0x49,0x20,0x68,0x28, +0xE7,0xFF,0xD9,0x46,0x20,0x6F,0xB6,0xC2,0xE0,0x10,0x01,0xC3,0x20,0x10,0x01,0xF3, +0x17,0x08,0xA4,0xF3,0x39,0x0B,0xEC,0x23,0x21,0x1A,0xD5,0x58,0x02,0x1D,0xF8,0x17, +0x08,0xA4,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xE6,0xC2,0xE0,0x10,0x01,0xC3,0x00, +0x10,0x01,0xF8,0x17,0x08,0xDF,0xC2,0xE0,0x10,0x01,0xF8,0x18,0x08,0xF8,0xF8,0x17, +0x08,0xF9,0x0D,0x41,0x02,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEB,0x17,0x08,0xE3, +0x9C,0x28,0x53,0x18,0x80,0xEF,0x17,0x08,0xE3,0xE7,0xFF,0x87,0x1D,0x0D,0x41,0x02, +0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x9C,0x38,0xC3,0x14,0x00,0x01,0x0D,0x21,0x04, +0xCA,0xF8,0x22,0x00,0x0B,0x37,0x01,0xCB,0x18,0x26,0x18,0x9B,0x3F,0x0F,0x37,0x01, +0x0B,0x38,0x01,0x53,0x39,0x02,0x0F,0x38,0x01,0x0B,0x17,0x01,0xFC,0x60,0x01,0x00, +0x0C,0x17,0x01,0xE7,0xFF,0xC5,0x62,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEB,0x17, +0x00,0xCD,0x9C,0x28,0xC7,0x18,0xFE,0xFF,0xEF,0x17,0x00,0xCD,0x85,0x29,0x5C,0xC6, +0x00,0x9A,0xE0,0xE4,0x00,0x00,0x45,0x4F,0x17,0x08,0x4F,0x57,0x10,0x43,0x23,0xC4, +0x8F,0x45,0x8F,0x04,0x0F,0x5A,0x02,0x0B,0x18,0x01,0x4F,0x5A,0x42,0x9E,0xE1,0x43, +0x18,0xD5,0x0F,0x19,0x01,0x5F,0x17,0x00,0xD4,0xD8,0xFE,0xFD,0x85,0x29,0x9C,0x38, +0x0D,0x21,0x04,0xE4,0x00,0x40,0x6E,0x0D,0x21,0x06,0xFC,0x60,0x01,0x00,0x9C,0x28, +0xE7,0xFF,0xC4,0x99,0x9C,0x38,0x0D,0x21,0x04,0xE4,0x00,0x40,0x42,0x0D,0x21,0x06, +0xFC,0x60,0x01,0x00,0x9C,0x28,0xE7,0xFF,0xC4,0x5D,0x9C,0x38,0x0D,0x21,0x04,0xE7, +0xFF,0x8A,0x38,0x98,0x80,0x98,0x61,0xE7,0xFF,0xE5,0x78,0x98,0x60,0xE7,0xFF,0x85, +0x4C,0x98,0x61,0x98,0x80,0xE7,0xFF,0xEB,0xF2,0x98,0x62,0x98,0x80,0xE7,0xFF,0xEB, +0xE2,0x98,0x63,0x98,0x80,0xE7,0xFF,0xEB,0xD2,0x98,0x66,0xC0,0x80,0x10,0x01,0xC0, +0xA0,0x10,0x01,0xFC,0x84,0x01,0xB0,0xFC,0xA5,0x01,0xC8,0xC0,0xC0,0x10,0x01,0xFC, +0xC6,0x01,0xA0,0xE7,0xFF,0x90,0x78,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0x95,0xC5, +0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x40,0x10,0x01,0xE7,0xFF,0xD6,0x6E, +0xFD,0x4A,0x00,0xDE,0x20,0x68,0x68,0x24,0x64,0x2D,0xD0,0x63,0x05,0xD6,0xE4,0x00, +0x00,0xCB,0xE7,0xFF,0x89,0x52,0xE7,0xFF,0xD6,0x3A,0xE4,0x00,0x00,0x4F,0xE7,0xFF, +0xC3,0xB4,0x0A,0xEA,0x09,0x40,0x63,0xBD,0x5E,0xE3,0x04,0xC2,0xE1,0x76,0xEA,0x20, +0x00,0x99,0x98,0x62,0xE7,0xFF,0xEA,0x96,0x20,0x60,0x76,0xE7,0xFF,0x89,0x00,0x98, +0x61,0x98,0x80,0xE7,0xFF,0xE4,0x40,0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x60,0x9C, +0x28,0xE7,0xFF,0x84,0x05,0x98,0x62,0x98,0x80,0xE7,0xFF,0xE4,0x14,0xFC,0x60,0x01, +0x5E,0xE7,0xFF,0x8D,0xC2,0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x60,0x9C,0x28,0xE7, +0xFF,0x83,0x81,0xE7,0xFF,0xC3,0x0A,0x0A,0xEA,0x0D,0x40,0x63,0xBD,0x5E,0xE3,0x04, +0xC2,0xE0,0xBB,0x6A,0x20,0x00,0x31,0x98,0x63,0xE7,0xFF,0xE9,0xEC,0x20,0x62,0xB8, +0xE7,0xFF,0xE9,0x18,0x5C,0x63,0x04,0xC0,0x60,0x19,0x0E,0x20,0x00,0x49,0xC2,0xE0, +0x10,0x01,0xEA,0xF7,0x08,0xE3,0xC6,0xF7,0x20,0x00,0x22,0xE0,0x28,0xE7,0xFF,0xC2, +0x96,0x0C,0x6A,0x0D,0x0D,0x41,0x02,0x0D,0x21,0x06,0x98,0x63,0x98,0x80,0x9C,0x28, +0xE7,0xFF,0xE3,0x47,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0xD0,0x69, +0x06,0x2D,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0xFC,0x8E,0xF8,0xC3, +0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x18,0x09,0xA4,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x0A,0x54,0x87,0x29,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x90,0x0F,0x38,0x02,0x0F, +0x37,0x68,0x0F,0x38,0x06,0x0F,0x18,0x0A,0x0F,0x37,0x6C,0x0F,0x17,0x70,0xE4,0x00, +0x01,0x0B,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x84,0x0F,0x37,0x02,0x0F,0x38,0x68, +0x0F,0x37,0x06,0x0E,0xF7,0x0A,0x0F,0x38,0x6C,0x0E,0xF8,0x70,0xE4,0x00,0x00,0xCF, +0xCE,0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xCC,0x63,0x00,0x1A,0xFF,0x7B,0x0A,0xF8, +0x4C,0x63,0x10,0x8F,0x77,0x8F,0x03,0x9A,0xE0,0x43,0x38,0xBC,0x43,0x5B,0xBC,0x0F, +0x5A,0x02,0x0F,0x59,0x00,0x9E,0xE4,0x5E,0xED,0x09,0x23,0xFF,0xBD,0xE4,0x00,0x00, +0x6D,0x9C,0x7E,0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFF,0x5A,0x0C,0x50,0xCF,0x03, +0x00,0x68,0xCC,0x63,0x00,0x1A,0x8F,0x58,0x4C,0x63,0x10,0x8C,0x77,0x9A,0xE0,0x43, +0x03,0xBC,0x43,0x3A,0xBC,0x0F,0x39,0x02,0x0F,0x38,0x00,0x9E,0xE4,0x5E,0xED,0x09, +0x23,0xFF,0xBD,0x85,0x29,0xD0,0x69,0x06,0x3D,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21, +0xFE,0xF7,0xBA,0x24,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x18,0x09, +0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x08,0xD8,0x87,0x29,0x0B,0x37,0x00,0xC3,0x00, +0x10,0x01,0x4F,0x39,0x40,0xFF,0x18,0x0B,0x90,0xE4,0x00,0x00,0x25,0x0B,0x37,0x00, +0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18,0x0B,0x84,0x0F,0x38,0x00,0x0B,0x37, +0x02,0x0A,0xF7,0x04,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x0F,0x38,0x04,0x0E,0xF8,0x08, +0xE4,0x00,0x00,0xD9,0xCE,0xE3,0x00,0x34,0x8F,0x17,0xCE,0xE3,0x00,0x68,0xC3,0x60, +0x10,0x01,0xFF,0x7B,0x0A,0xF8,0x8F,0x77,0x9A,0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC, +0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F,0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89, +0x23,0xFF,0xA9,0xE4,0x00,0x00,0x73,0x1E,0xE3,0xFE,0x5E,0xF7,0x00,0xCF,0x37,0x00, +0x34,0xCE,0xF7,0x00,0x68,0xC3,0x60,0x10,0x01,0x8F,0x19,0xFF,0x7B,0x0C,0x50,0x8F, +0x77,0x9A,0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC,0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A, +0x40,0x0F,0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xA9,0xE7,0xFF,0xFC,0xE5, +0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x3E,0x98,0x60,0xE7,0xFF,0xFE,0x56,0x98,0x68, +0xE4,0x00,0x00,0x19,0x98,0x62,0xE7,0xFF,0xFE,0x3E,0x98,0x69,0x0D,0x21,0x06,0x9C, +0x28,0xE7,0xFF,0xFE,0x29,0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFE,0x12, +0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFD,0xFD,0x20,0x80,0x64,0xD0,0x84, +0x00,0xFA,0x20,0x88,0x90,0x20,0x8C,0xA8,0x5C,0x80,0x21,0x4B,0x0A,0x01,0x8A,0xF8, +0xE4,0x00,0x00,0x49,0x53,0x00,0x19,0x8A,0xF8,0xE4,0x00,0x00,0x37,0x53,0x00,0x19, +0x9A,0xE1,0xE4,0x00,0x00,0x25,0x53,0x00,0x32,0x8A,0xF8,0xE4,0x00,0x00,0x13,0x53, +0x00,0x50,0x8A,0xF8,0xD0,0x6B,0x0F,0xAD,0x4F,0x43,0x10,0xC3,0x38,0x00,0x21,0xFF, +0x39,0xBA,0x4C,0x8F,0x3A,0xC3,0x60,0x10,0x01,0x0F,0x99,0x02,0xC3,0x40,0x10,0x01, +0xC3,0x20,0x10,0x01,0xFF,0x7B,0x09,0x00,0xFF,0x5A,0x0A,0xE8,0xFF,0x39,0x08,0xD8, +0x87,0x89,0xCF,0x23,0x00,0x34,0x8F,0x79,0xCF,0x23,0x00,0x68,0xC0,0xA0,0x10,0x01, +0x99,0x02,0xFC,0xA5,0x0A,0xF8,0xCB,0xC0,0x01,0xF4,0x8C,0xB9,0x9B,0x20,0x43,0x5B, +0xCC,0x4F,0x99,0x08,0x0B,0xBA,0x00,0x8F,0x85,0x4F,0xBD,0x40,0x0F,0x5C,0x02,0x5F, +0x5D,0x1D,0x43,0xBD,0xD5,0x48,0x98,0xB8,0xCF,0x5A,0x01,0xF4,0x43,0xA4,0xEB,0x43, +0xBD,0x40,0x8F,0x5D,0x43,0x5A,0xF0,0x0F,0x5C,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23, +0xFF,0x3D,0xE4,0x00,0x02,0xEF,0x1F,0x23,0xFE,0x5F,0x39,0x00,0xCC,0xB9,0x00,0x34, +0xCF,0x39,0x00,0x68,0xC0,0x80,0x10,0x01,0x8C,0xBB,0xFC,0x84,0x0C,0x50,0x9B,0xC2, +0x8C,0x99,0xCB,0xA0,0x01,0xF4,0x9B,0x20,0x43,0x45,0xCC,0x0B,0x9A,0x00,0x4F,0x59, +0x08,0x4F,0x9C,0x40,0x43,0x64,0xD4,0x0F,0x5B,0x02,0x5F,0x5C,0x1D,0x43,0x9C,0xD5, +0x49,0x18,0xB8,0xCF,0x5A,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x5C,0x43, +0x5A,0xE8,0x0F,0x5B,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x39,0xE4,0x00,0x02, +0x39,0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B,0x84,0xCB,0xA0,0x01,0xF4,0x0F, +0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18, +0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8, +0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44,0xFF,0x7B,0x08,0xDE,0xD7, +0x3B,0xFE,0x86,0xE4,0x00,0x01,0xAD,0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B, +0x90,0xCB,0xA0,0x01,0xF4,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C, +0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C, +0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F, +0x44,0xFF,0x7B,0x08,0xDE,0xD7,0x3B,0xFE,0x86,0xE4,0x00,0x01,0x21,0x8B,0x3A,0x9B, +0xC2,0xC3,0x40,0x10,0x01,0xCB,0xA0,0x01,0xF4,0xFF,0x5A,0x0B,0xAC,0x0F,0x7A,0x02, +0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF, +0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A, +0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44,0xFF,0x7B,0x0A,0xF8,0xD7,0x3B,0xFE, +0x86,0xE4,0x00,0x00,0x91,0x8B,0x3A,0x9B,0xC2,0xC3,0x40,0x10,0x01,0xCB,0xA0,0x01, +0xF4,0xFF,0x5A,0x0A,0xC8,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C, +0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C, +0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F, +0x44,0xFF,0x7B,0x0A,0xF8,0xD7,0x3B,0xFE,0x86,0xE7,0xFF,0xF8,0x0B,0x9C,0x38,0x0D, +0x21,0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xFB,0x80,0x88, +0x8A,0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFB,0x61,0x1C, +0x21,0xC8,0x0D,0xC1,0x20,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0x81, +0x28,0x0D,0xA1,0x24,0x0D,0xE1,0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10, +0x0E,0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0xC1,0xC0,0x10,0x01,0xFD,0xCE,0x08, +0xE2,0x0B,0x6E,0x01,0xC6,0xFB,0x7F,0xFF,0x0E,0xEE,0x01,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x09,0x68,0x0B,0x57,0x34,0x0B,0x37,0x36,0x47,0x1A,0xD7,0x43,0x9A,0xCC,0x4F, +0x18,0xFA,0x5F,0x9C,0x04,0x47,0x1A,0xC4,0x5E,0xF8,0x06,0xD7,0x37,0x00,0x30,0x8B, +0x19,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x06,0xEA,0xF7,0x09,0xA0,0xD6,0xF9,0x00,0x30, +0x8B,0x17,0x8E,0xFC,0x5F,0x18,0x06,0x1E,0xF7,0xEB,0x5E,0xF7,0x04,0xC2,0xE0,0x18, +0xCE,0x20,0x00,0xE9,0xC3,0x00,0x12,0xAC,0x20,0x00,0xCD,0xD3,0x0F,0x01,0x80,0xC2, +0xE0,0x10,0x01,0xEB,0x37,0x09,0x68,0xFE,0xF7,0x09,0x68,0x0B,0x17,0x02,0x8F,0x19, +0x0B,0x37,0x04,0x0A,0xF7,0x06,0x8E,0xF9,0xCE,0xF7,0x00,0x0B,0xD6,0xF8,0x00,0x78, +0x53,0x00,0x64,0xC2,0xE0,0x10,0x01,0xE4,0x00,0x00,0x23,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x08,0x89,0x23,0x00,0x24,0x9F,0x1F,0xFB,0x17,0x08,0x89,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0x95,0xC1,0xA0,0x10,0x01,0xC1,0xE0,0x10,0x01,0xC1,0x40,0x10,0x01, +0x57,0x7B,0x08,0xFD,0xAD,0x08,0xBC,0xFD,0xEF,0x08,0xB8,0xFD,0x4A,0x0B,0xEC,0x23, +0x61,0x48,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xF6,0x22,0xE5,0x1C,0x0A,0xEA,0x19, +0x1E,0xF7,0xCE,0x5E,0xF7,0x04,0xC2,0xE0,0xF3,0x6E,0x20,0x00,0x4D,0x0A,0xEA,0x16, +0x5E,0xE9,0xF1,0x20,0x00,0x29,0xC2,0xE0,0xF5,0xE8,0x20,0x00,0x9D,0xE7,0xFF,0xE2, +0xE6,0x9A,0xE3,0x0E,0xED,0x00,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xB0,0xC2,0xE0, +0x10,0x01,0x18,0x0F,0x00,0xF8,0x17,0x08,0xD2,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0xC3,0xC2,0xE0,0x10,0x01,0x9B,0x01,0xFB,0x17,0x08,0x95,0xC2,0xE0,0x10,0x01,0xF2, +0xF7,0x08,0xAC,0x22,0xE0,0x24,0x98,0x60,0xE7,0xFF,0xBE,0x3C,0x0E,0xED,0x02,0x22, +0xE1,0x82,0x0A,0xEE,0x01,0x56,0xF7,0x40,0x22,0xE0,0x54,0xE7,0xFF,0x37,0x88,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x08,0xD2,0x9A,0xE1,0xE4,0x00,0x14,0xFD,0x98,0x60,0xE7, +0xFF,0xFC,0xBC,0x0A,0xEE,0x01,0x56,0xF7,0x20,0xD2,0xE0,0x54,0x76,0x0E,0xA1,0x06, +0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D, +0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41, +0x32,0x0D,0x21,0x36,0x98,0x6A,0x98,0x82,0x1C,0x21,0x38,0xE7,0xFF,0xF7,0xE1,0x22, +0xE5,0x0E,0x0A,0xEE,0x01,0x57,0x17,0x08,0x23,0x00,0x2C,0xE7,0xFF,0xE1,0x8A,0xE4, +0x00,0x13,0x65,0x57,0x17,0x40,0x23,0x00,0x94,0xC6,0xF7,0x20,0x00,0x22,0xE0,0x7A, +0xC2,0xE0,0x10,0x01,0x98,0x62,0xF3,0x17,0x08,0xD2,0xC3,0x00,0x19,0x0A,0x20,0x25, +0x7B,0x9F,0x01,0xFB,0x17,0x08,0xD2,0xE4,0x00,0x14,0x41,0x0C,0x0D,0x00,0xE4,0x00, +0x14,0x33,0xC2,0x40,0x10,0x01,0xFE,0x52,0x08,0x82,0x22,0xE8,0xCA,0x0A,0xEE,0x01, +0xC1,0x40,0x10,0x01,0x56,0xF7,0x08,0x22,0xE0,0x74,0xF2,0xEA,0x08,0xB0,0x9E,0xE1, +0xFA,0xEA,0x08,0xB0,0xE7,0xFF,0x36,0x56,0xF2,0xEA,0x08,0xB0,0xD2,0xE0,0x4F,0x5A, +0xE4,0x00,0x0E,0xD9,0xF8,0x0A,0x08,0xB0,0xE4,0x00,0x11,0x8B,0xC2,0x00,0x10,0x01, +0xC1,0x80,0x10,0x01,0xC1,0x60,0x10,0x01,0xFE,0x10,0x08,0x83,0xFD,0x8C,0x0B,0xCC, +0xFD,0x6B,0x08,0x8C,0xD2,0xE3,0x39,0xDE,0x12,0xEA,0x00,0x22,0xE4,0x1A,0x18,0x12, +0x00,0xE7,0xFF,0xC7,0xC4,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x20,0x03, +0xE8,0x20,0x68,0x1C,0xFF,0x20,0x01,0xF4,0xEF,0x37,0x01,0xC7,0xEF,0x38,0x01,0xC5, +0x0A,0xEE,0x01,0x56,0xF7,0x08,0xD2,0xE0,0x38,0x02,0xC1,0xC0,0x10,0x01,0xC2,0x20, +0x10,0x01,0x12,0xEA,0x00,0xFD,0xCE,0x08,0xF0,0xFE,0x31,0x01,0xAC,0xD2,0xE1,0x10, +0xF1,0x0B,0x8B,0x04,0xC3,0x8F,0xFF,0xE0,0x20,0x05,0xF9,0x08,0x8A,0x48,0x0B,0x2B, +0x06,0x0B,0x6B,0x00,0x43,0xA4,0xCD,0x08,0xAA,0x46,0x0B,0x4B,0x02,0x43,0xC5,0xE5, +0x0B,0x0A,0x18,0x08,0x6A,0x16,0x42,0xFA,0xC5,0x41,0x03,0xDD,0x42,0xFE,0xBB,0x41, +0x3D,0x43,0x8E,0xE9,0x22,0xE1,0x84,0x42,0x7C,0xDD,0x41,0x3A,0xCD,0x42,0x9D,0x9B, +0x42,0x5E,0x4B,0x8E,0x92,0x22,0x80,0x40,0x26,0x80,0x28,0x26,0xE0,0x2A,0xE4,0x00, +0x00,0x8F,0x26,0xFD,0x0E,0x4E,0xB7,0xFA,0x46,0x55,0xBE,0x42,0x52,0xAD,0x4E,0xB4, +0xFA,0x46,0x95,0xA6,0x42,0xB4,0xAD,0xD6,0xB2,0x01,0x74,0x42,0x98,0xD5,0x41,0x28, +0x4B,0x42,0x74,0x9B,0x8E,0x69,0x22,0x60,0x40,0x26,0x60,0x28,0x26,0xE0,0x2A,0xE4, +0x00,0x00,0x2D,0x26,0xFC,0x4A,0x4E,0xF3,0xFA,0x46,0x77,0x9E,0x42,0x73,0xBD,0x9A, +0xE1,0xD6,0x72,0x06,0x18,0x42,0x44,0xD5,0x42,0x65,0xDD,0x42,0x83,0xE5,0x42,0xF9, +0xC5,0x41,0x32,0xA3,0x42,0xF3,0xBB,0x8E,0xE9,0x22,0xE0,0xDC,0x43,0x9B,0xE5,0x40, +0xF9,0xD5,0x40,0xD2,0xE3,0x41,0x33,0x3B,0x8C,0xC9,0x20,0xC0,0x40,0x24,0xC0,0x28, +0x26,0xE0,0x2A,0xE4,0x00,0x00,0x3B,0x26,0xFC,0x66,0x4D,0x37,0xFA,0x46,0xA9,0xBE, +0x42,0xB5,0x4D,0x4D,0x26,0xFA,0x44,0xC9,0x36,0x41,0x26,0x4D,0xD5,0x35,0x01,0xA0, +0x43,0x58,0xD5,0x41,0x08,0x43,0x43,0x5A,0xD3,0x43,0x38,0xCD,0x42,0x94,0xA3,0x43, +0x39,0xCB,0x8F,0x48,0x8E,0x99,0x9A,0xE0,0xD6,0x9A,0x00,0x45,0x8B,0x54,0x9A,0xE1, +0x42,0x73,0x9B,0x42,0x52,0x93,0x8E,0x53,0xD6,0x5A,0x01,0xB1,0xE4,0x00,0x00,0x6F, +0x41,0x38,0xCD,0x40,0xF4,0x3B,0x43,0x89,0xE3,0x8F,0x87,0x23,0x80,0x40,0x27,0x80, +0x28,0x26,0xE0,0x2A,0xE7,0xFF,0xFF,0x79,0x26,0xFE,0xE2,0x4E,0xFC,0xFA,0x47,0x97, +0xE6,0x43,0x9C,0xBD,0x9A,0xE0,0xD7,0x95,0x00,0xF0,0xE7,0xFF,0xFF,0x4D,0x8B,0x52, +0x52,0xE0,0x10,0x43,0xDE,0xF3,0x43,0xBD,0xEB,0x53,0x20,0x11,0x8F,0xBE,0x5F,0xBA, +0x1F,0x4A,0xF7,0xC8,0x4F,0x37,0x21,0x46,0xF7,0xCE,0x56,0xF7,0x0F,0xD2,0xE0,0x3C, +0x92,0x0C,0xAA,0x17,0x0C,0x8A,0x19,0x0C,0x6A,0x47,0x0F,0x0A,0x49,0xE4,0x00,0x0F, +0x05,0x12,0xF0,0x00,0x9B,0x1E,0x46,0xF7,0xC4,0x98,0x63,0x1A,0xF0,0x00,0xE7,0xFF, +0xD9,0x96,0xE4,0x00,0x00,0xEF,0x0B,0x0B,0x00,0xC3,0x0F,0xFF,0xE4,0x20,0x01,0xB3, +0x13,0x32,0x00,0x0A,0x6B,0x02,0x9F,0x21,0x0B,0x6A,0x16,0x5F,0x39,0x00,0x41,0x1B, +0xC5,0x0B,0x4A,0x18,0x0B,0xAA,0x46,0x43,0xDA,0x9D,0x43,0x1D,0xC5,0x0B,0x8A,0x48, +0x43,0x18,0xC3,0x42,0x7C,0x9D,0x1B,0x32,0x00,0x42,0x73,0x9B,0x8F,0x13,0x41,0x08, +0x43,0x43,0xDE,0xF3,0x8F,0xC8,0x5F,0x1E,0x1F,0x53,0x00,0x10,0x4B,0x00,0xC0,0x23, +0x00,0x3C,0x0F,0xAA,0x17,0x0F,0x8A,0x19,0x0F,0x6A,0x47,0x0F,0x4A,0x49,0x27,0x28, +0xDB,0x9E,0xFF,0x9B,0x3C,0x1A,0xEA,0x00,0x12,0xF0,0x00,0x46,0xF7,0xCC,0x1A,0xF0, +0x00,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x88,0x12,0xF1,0x00,0x1A,0xEA,0x10,0x12, +0xF1,0x01,0x1A,0xEA,0x40,0xE7,0xFF,0x31,0x54,0x12,0xEA,0x00,0xD2,0xE1,0x3A,0x96, +0xE4,0x00,0x01,0xD9,0x18,0x12,0x00,0xE7,0xFF,0xFF,0xC5,0x22,0xE7,0x7A,0x18,0x12, +0x00,0x0A,0xEB,0x04,0xC2,0xEF,0xFF,0xE0,0x23,0xFF,0x45,0x0B,0xCA,0x16,0x0B,0xAA, +0x18,0x0B,0x2B,0x00,0x0B,0x0B,0x02,0x43,0x9E,0xCD,0x43,0x7D,0xC5,0x43,0xDE,0xBD, +0x0B,0x4B,0x06,0x43,0xDE,0xF3,0x43,0xBD,0xD5,0x43,0x9C,0xE3,0x43,0xBD,0xEB,0x43, +0x7B,0xDB,0x8F,0xBE,0x8F,0x7C,0xD7,0xBB,0x36,0x51,0xE4,0x00,0x0D,0x41,0x0B,0x8C, +0x03,0x43,0x98,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD, +0xC3,0x60,0x10,0xE8,0x20,0x00,0xC1,0x0B,0x8C,0x03,0xC3,0x60,0x10,0x01,0xEF,0x9B, +0x08,0xD5,0xFF,0x7B,0x08,0xD4,0x0B,0x8C,0x07,0x0F,0x9B,0x03,0xC3,0x60,0x10,0x01, +0xEF,0x3B,0x08,0xC5,0xFF,0x7B,0x08,0xC4,0x0F,0x1B,0x03,0x13,0x10,0x00,0x53,0x18, +0x02,0x1B,0x10,0x00,0x0B,0x0E,0x05,0x0F,0x0E,0x01,0x0B,0x0E,0x07,0x0F,0x0E,0x03, +0x0B,0x0C,0x09,0x0F,0x0C,0x01,0x0B,0x0C,0x0B,0x0F,0x0C,0x03,0x0B,0x0C,0x0D,0x0E, +0xEB,0x01,0x0F,0x0C,0x05,0xFE,0xE0,0x7F,0xFF,0x0B,0x0C,0x0F,0x0E,0xEB,0x05,0x0E, +0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC,0x09,0x0E,0xEC,0x0B,0x0F,0x0C, +0x07,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0x9B,0x01,0x12,0xF1,0x01,0x0F,0x4B,0x03,0x1A, +0xF1,0x00,0x42,0xF8,0xBD,0x1A,0xF1,0x01,0xE7,0xFF,0xFE,0x03,0x0A,0xEA,0x17,0x0B, +0x0B,0x01,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8,0xFA,0x47,0x17,0xC6,0x42,0xF8, +0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x01,0xC4,0xD6,0xF9,0x01,0x2C,0x0A,0xEA,0x19, +0x0B,0x0B,0x03,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8,0xFA,0x47,0x17,0xC6,0x42, +0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x01,0xC6,0xD6,0xF9,0x31,0x20,0xE7,0xFF, +0x2F,0xAA,0xD0,0x60,0x30,0xE2,0xE7,0xFF,0xD9,0x54,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x07,0xF6,0xD3,0x01,0x30,0x66,0xE4,0x00,0x0B,0xCD,0x9B,0x1E,0xEF,0x17,0x08,0xC1, +0xC1,0xA0,0x10,0x01,0x13,0x2A,0x00,0xFD,0xAD,0x0C,0x02,0x9B,0x00,0x8A,0xED,0xE4, +0x00,0x00,0x35,0x0B,0x57,0x01,0x9F,0x01,0x0F,0x4B,0x01,0x5F,0x18,0x00,0x0B,0x57, +0x03,0x1E,0xF7,0x30,0x0F,0x4B,0x03,0x9D,0x64,0xD7,0x19,0xFF,0x56,0xC2,0xE0,0x10, +0x01,0xEE,0xF7,0x08,0x9A,0x22,0xE4,0x26,0x99,0x60,0xE4,0x00,0x00,0x5F,0xE7,0xFF, +0xC0,0x0A,0x20,0x6B,0xD8,0xE7,0xFF,0xBF,0xFC,0x20,0x6C,0xAE,0xE7,0xFF,0xFF,0xD9, +0xCC,0x8B,0x00,0x30,0x88,0xCB,0x1C,0x84,0x10,0x9D,0x61,0x8C,0x8A,0x5D,0x6B,0x00, +0x1C,0x64,0x06,0x9C,0x88,0xE7,0xFF,0x6E,0xD4,0x10,0xAA,0x00,0xD4,0xAB,0xFF,0x25, +0xE4,0x00,0x00,0x11,0xE7,0xFF,0x6E,0x26,0xE7,0xFF,0xBF,0x96,0xC3,0x20,0x10,0x01, +0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0x20,0x68,0xD6,0x53,0x40,0x4B,0xEF,0x58, +0x08,0xE5,0xEF,0x59,0x08,0xAF,0x53,0x00,0x25,0xEF,0x17,0x08,0xFB,0xC2,0xA0,0x10, +0x01,0xC2,0xE0,0x10,0x01,0xFE,0xB5,0x08,0xA0,0xEF,0x17,0x08,0xD1,0x99,0x60,0xC2, +0x60,0x10,0x01,0xC2,0x80,0x10,0x01,0x8A,0x55,0xE4,0x00,0x03,0x19,0x53,0x40,0x32, +0xEF,0x58,0x08,0xE5,0xEF,0x59,0x08,0xAF,0x53,0x00,0x19,0xE7,0xFF,0xFF,0x9D,0x4E, +0xEB,0x10,0x8E,0xEE,0x0B,0x17,0x00,0xC3,0x0F,0xFF,0xE4,0x20,0x05,0x3B,0x0B,0x37, +0x02,0xC3,0x2F,0xFF,0xE0,0x20,0x05,0x11,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0A,0x37, +0x17,0x42,0x38,0x8D,0x5E,0x31,0x06,0x4F,0x11,0xFA,0x0A,0xF7,0x19,0x46,0x38,0x8E, +0x42,0xF9,0xBD,0x42,0x31,0xC5,0x5E,0xF7,0x06,0x4F,0x17,0xFA,0x5E,0x31,0x06,0x46, +0xF8,0xBE,0xE9,0xF3,0x08,0xE5,0x42,0xF7,0xC5,0x43,0x15,0x5C,0x5E,0xF7,0x06,0x13, +0x58,0x00,0xD6,0xEF,0x00,0xE4,0xC3,0x00,0x10,0x01,0xEB,0x18,0x08,0xAF,0xD6,0x38, +0x00,0x84,0x9B,0x03,0x27,0x48,0x57,0x1F,0x1A,0x01,0xE4,0x00,0x00,0x19,0x9B,0x00, +0x23,0x40,0x24,0x1F,0x1A,0xFF,0x5F,0x18,0x00,0x43,0x52,0x5C,0x1B,0x1A,0x00,0x43, +0x15,0x5C,0x13,0x18,0x00,0xD3,0x02,0x06,0xA1,0xEB,0x14,0x08,0xD1,0xD6,0xF8,0x00, +0x8C,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0F,0x37,0x19,0xE4,0x00,0x00,0x9B,0xD6,0xEF, +0x02,0x4C,0x43,0x2F,0xC5,0x40,0x77,0xC5,0x43,0x39,0xCB,0x42,0xF8,0xBD,0x43,0x4F, +0x7B,0x40,0x63,0xBB,0x8C,0x79,0x40,0x63,0xD3,0x40,0x63,0xC8,0xE7,0xFF,0x2B,0x18, +0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17,0x02,0x41,0xEF,0x1D,0xCE,0xEB, +0x00,0x30,0x8E,0xEA,0x0B,0x37,0x18,0xD7,0x19,0x00,0x58,0x41,0xF8,0x7D,0xE4,0x00, +0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x19,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0xFB,0xD6, +0x37,0x00,0xCC,0xCE,0xEB,0x00,0x30,0x4F,0x0B,0x10,0x8E,0xEA,0x8F,0x0E,0x0B,0x18, +0x01,0x0F,0x17,0x17,0xE4,0x00,0x00,0xAB,0xC3,0x00,0x10,0x01,0xE9,0xF8,0x08,0xAF, +0xD6,0x2F,0x02,0x4C,0x43,0x0F,0xBD,0x43,0x2F,0x7B,0x43,0x18,0xC3,0x40,0x71,0xBD, +0x42,0x37,0x8D,0x40,0x63,0x8B,0x8C,0x78,0x40,0x63,0xCB,0x40,0x63,0xC0,0xE7,0xFF, +0x2A,0x34,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17,0x00,0x41,0xEF,0x1D, +0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x16,0xD7,0x19,0x00,0x58,0x41,0xF8,0x7D, +0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x17,0x4E,0xEB,0x10,0xCF,0x0B,0x00,0x30, +0x8E,0xEE,0x8F,0x0A,0x9D,0x61,0x0B,0x38,0x17,0x5D,0x6B,0x00,0x0B,0x18,0x19,0x0F, +0x37,0x01,0x0F,0x17,0x03,0x12,0xEA,0x00,0xD6,0xEB,0xF4,0x3D,0xE7,0xFF,0xBB,0xEE, +0x20,0x68,0x36,0x9B,0x08,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x01,0xBD,0xC2,0xE0,0x10, +0x01,0x13,0x2A,0x00,0xF3,0x77,0x08,0xE0,0x8B,0x0D,0xC2,0xE0,0x10,0x01,0x9B,0x80, +0xFE,0xF7,0x0B,0xD0,0xFF,0x40,0x7F,0xFF,0xE4,0x00,0x00,0x9F,0xD7,0x79,0x00,0x92, +0x0F,0x57,0xFD,0x0F,0x57,0xFF,0x0F,0x57,0x01,0x0F,0x57,0x03,0x8B,0x79,0x0B,0xB7, +0x00,0xC3,0xAF,0xFF,0xE0,0x20,0x00,0x41,0x0B,0xB7,0xFD,0x0F,0xB7,0x01,0x0B,0xB7, +0xFF,0xE4,0x00,0x00,0x1B,0x0B,0xB8,0x01,0x0F,0xB7,0x01,0x0B,0xB8,0x03,0x0F,0xB7, +0x03,0x0B,0xB8,0x01,0x9F,0x81,0x0F,0xB7,0xFD,0x5F,0x9C,0x00,0x0B,0xB8,0x03,0x1F, +0x18,0x30,0x0F,0xB7,0xFF,0x9E,0xE8,0xD7,0x99,0xFD,0xAE,0xC2,0xE0,0x10,0x01,0xFB, +0x77,0x08,0xE0,0xC2,0xE0,0x10,0x01,0x23,0x24,0x7A,0x9B,0x02,0xFB,0x17,0x08,0xFD, +0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x01,0xBC,0x9B,0x0A,0x9B,0x4A,0x43,0x18,0xBD,0x9A, +0xE0,0xE4,0x00,0x00,0x8F,0xF8,0x17,0x08,0xFD,0xE7,0xFF,0xFF,0xCF,0x0B,0x6C,0x04, +0x0B,0x8C,0x00,0x0B,0xAC,0x06,0x43,0x9C,0xDD,0x9E,0xE1,0x43,0x98,0xE3,0x5E,0xF7, +0x00,0x43,0x9C,0xD0,0x8F,0x9B,0x0B,0x6C,0x02,0x0F,0x8D,0x01,0x43,0x7B,0xED,0x0F, +0x8C,0x01,0x43,0x78,0xDB,0x43,0x7B,0xD0,0x8F,0x7D,0x5F,0x7B,0x06,0x0F,0x6D,0x03, +0x0F,0x6C,0x03,0x1D,0xAD,0x30,0x9D,0x88,0xD6,0xF9,0xFE,0x2E,0x12,0xF0,0x00,0x56, +0xF7,0x02,0x22,0xE0,0x24,0x98,0x64,0xE7,0xFF,0xCF,0x44,0x13,0x0A,0x00,0xC2,0xE0, +0x10,0x01,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21, +0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A, +0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0xFB,0x17,0x08,0x84,0x98,0x61,0x1C, +0x21,0x38,0xE7,0xFF,0xAD,0xE9,0x18,0x0F,0x00,0x9A,0xE4,0xE4,0x00,0x04,0xD9,0xD2, +0xE4,0x01,0xE6,0x0A,0xEE,0x01,0x56,0xF7,0x08,0x22,0xE0,0x5C,0x9A,0xE3,0x18,0x12, +0x00,0x0E,0xED,0x00,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC1,0xE4,0x00,0x04,0xD7, +0x12,0xEF,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xEF,0x00,0xD2,0xE1,0x12,0xE1,0x9A, +0xE5,0x18,0x0F,0x00,0x0E,0xED,0x00,0xE4,0x00,0x04,0xA1,0xD2,0xE5,0x09,0xC6,0x12, +0xEF,0x00,0x9E,0xE1,0x1A,0xEF,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0xE0,0x22, +0xE9,0x36,0x12,0xF0,0x00,0x56,0xF7,0x01,0x22,0xE1,0x10,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xFD,0xC1,0x40,0x10,0x01,0xF2,0xEA,0x08,0x88,0x22,0xE8,0x66,0x98,0x65, +0xE7,0xFF,0xCD,0xD2,0x98,0x61,0xE7,0xFF,0xAC,0xE0,0x9A,0xE1,0xFA,0xEA,0x08,0x88, +0xE4,0x00,0x01,0x75,0xD2,0xE1,0x05,0x8E,0x98,0x65,0xE7,0xFF,0xCD,0x9E,0x98,0x61, +0xE7,0xFF,0xAC,0xAC,0xF8,0x0A,0x08,0x88,0xE4,0x00,0x01,0x45,0x0B,0x0B,0x00,0x0B, +0x4C,0x00,0x43,0x38,0xD5,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9, +0xBD,0x5E,0xEC,0x99,0x20,0x00,0x7D,0x0A,0xEC,0x03,0x0B,0x2B,0x03,0x43,0x39,0xBD, +0x5F,0x39,0x06,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0xC2,0xE0,0x10,0xE8, +0x20,0x01,0x95,0xC3,0x20,0x10,0x01,0xF2,0xF9,0x08,0xFD,0x22,0xE8,0xB6,0x8F,0x1A, +0x43,0x18,0xB8,0x0F,0x0A,0x17,0xC3,0x00,0x10,0x01,0xEB,0x58,0x08,0x8E,0xC3,0x00, +0x10,0x01,0xEB,0x18,0x0B,0xCE,0x8F,0x1A,0x42,0xF8,0xB8,0x0E,0xEA,0x19,0x9A,0xE1, +0xFA,0xF9,0x08,0xFD,0xE4,0x00,0x00,0x45,0x22,0xE4,0x66,0xC2,0xE0,0x10,0x01,0x0F, +0x0A,0x17,0xEA,0xF7,0x08,0x8F,0xF8,0x19,0x08,0xFD,0x0E,0xEA,0x19,0xE4,0x00,0x00, +0x13,0x9A,0xE3,0x1A,0xEF,0x00,0x9A,0xE1,0x98,0x61,0x1A,0xEA,0x00,0xE7,0xFF,0xAB, +0x72,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00,0x12,0xEF,0x00,0xD2,0xE2,0x0A, +0x51,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC1,0xE7,0xFF,0x24,0xAC,0xC2,0xE0,0x10, +0x01,0x9B,0x03,0xFB,0x17,0x08,0xAC,0xE7,0xFF,0xCF,0x52,0xE7,0xFF,0x65,0x38,0x98, +0x60,0xE7,0xFF,0xAB,0x0A,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xC3,0x9A,0xE6,0xE4, +0x00,0x01,0xF1,0xD2,0xE6,0x08,0xA6,0x0A,0xEE,0x01,0x56,0xF7,0x40,0x22,0xE0,0x26, +0x98,0x64,0xE7,0xFF,0xE9,0x96,0xC3,0x00,0x10,0x01,0xF2,0xF8,0x08,0xC3,0x9E,0xE1, +0x5E,0xF7,0x00,0xFA,0xF8,0x08,0xC3,0x5E,0xE6,0x53,0x0A,0xEE,0x01,0x20,0x01,0x35, +0x56,0xF7,0x40,0x22,0xE0,0x50,0x9A,0xE1,0x0E,0xED,0x00,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xD2,0xE4,0x00,0x01,0xA9,0x0C,0x0D,0x00,0x98,0x60,0x0E,0xA1,0x06,0x0E, +0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1, +0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32, +0x0D,0x21,0x36,0x1C,0x21,0x38,0xE7,0xFF,0xE8,0xCF,0x56,0xF7,0x08,0xD2,0xE0,0x04, +0xD2,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xB0,0x9A,0xE2,0xE4,0x00,0x00,0xD9,0xC3, +0x6F,0xFF,0xE4,0x23,0xE1,0xF9,0xE7,0xFF,0xF2,0x07,0x98,0x62,0xE7,0xFF,0xCA,0x9A, +0xFE,0xE0,0x7F,0xFF,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07, +0x0E,0xEC,0x09,0x0E,0xEC,0x0B,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0xE7,0xFF,0xF1,0xBB, +0x0B,0x8C,0x01,0x43,0x99,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43, +0x7C,0xDD,0x5F,0x6C,0x99,0x23,0xE4,0xA7,0xE7,0xFF,0xF2,0x7F,0xFE,0xE0,0x7F,0xFF, +0x18,0x0F,0x00,0x0E,0xEB,0x01,0x0E,0xEB,0x03,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x18, +0x11,0x00,0x1B,0x11,0x01,0x9A,0xE5,0x0E,0xED,0x00,0xE4,0x00,0x00,0x3B,0xC2,0xE0, +0x10,0x01,0xCB,0x20,0xFF,0xFD,0xEB,0x17,0x08,0xC1,0x9F,0x01,0x5F,0x18,0x04,0xD7, +0x19,0xCF,0x5D,0xE7,0xFF,0xF3,0xD3,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E, +0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D, +0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21, +0x38,0x85,0x29,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21,0x04,0x89,0x43,0x20,0x84,0x46, +0x98,0x60,0x88,0x8A,0xE7,0xFF,0xE2,0xAE,0x98,0x68,0xE4,0x00,0x00,0x1D,0x98,0x62, +0x88,0x8A,0xE7,0xFF,0xE2,0x92,0x98,0x69,0x88,0x8A,0x0D,0x21,0x06,0x0D,0x41,0x02, +0x9C,0x28,0xE7,0xFF,0xE2,0x73,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00,0x89,0x43, +0x98,0x60,0x88,0x8A,0xE7,0xFF,0xE2,0x4E,0x88,0x8A,0x0D,0x21,0x06,0x0D,0x41,0x02, +0x98,0x68,0x9C,0x28,0xE7,0xFF,0xE2,0x2F,0xD0,0x6B,0x0B,0x85,0x4F,0x03,0x10,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBA,0x7C,0x8E,0xF8,0xC3,0x40,0x10,0x01,0x0F,0xB7,0x02, +0xC3,0x60,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x80,0x10,0x01,0xC3,0x00,0x10,0x01, +0xC2,0xE0,0x10,0x01,0xFF,0x5A,0x09,0xA4,0xFF,0x7B,0x0A,0xE8,0xFF,0x39,0x0A,0x54, +0xFF,0x9C,0x0B,0x60,0xFF,0x18,0x0C,0xF2,0xFE,0xF7,0x09,0x68,0x87,0xA9,0xCC,0x63, +0x00,0x1A,0x5C,0x63,0x00,0x4F,0x23,0x08,0x4C,0x63,0x10,0x8F,0x19,0x8E,0xF9,0x8F, +0x43,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F,0x99,0x08,0x0B,0xBD,0x01,0x8F, +0x9A,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5,0x0F,0x9B,0x01,0x9F,0x22,0x5F, +0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x01,0xE7,0x9C,0x7E,0xCC,0x63,0x00,0x1A,0x5C, +0x63,0x00,0x4F,0x43,0x08,0x4C,0x63,0x10,0x8F,0x1A,0x8C,0x79,0x8E,0xFA,0x9B,0x20, +0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F,0x99,0x08,0x0B,0xBD,0x01,0x8F,0x83,0x0F,0x9C, +0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5,0x0F,0x9B,0x01,0x9F,0x22,0x5F,0x26,0x89,0x23, +0xFF,0x85,0xE4,0x00,0x01,0x6D,0x0B,0x78,0x35,0x0F,0x3A,0x6A,0x4F,0x39,0x42,0x43, +0x3B,0xCD,0x0B,0x78,0x37,0x0F,0x37,0x35,0x0F,0x3A,0x6E,0x4F,0x39,0x42,0x43,0x3B, +0xCD,0x0F,0x37,0x37,0x0F,0x3A,0x72,0xE4,0x00,0x00,0x4B,0x0F,0x59,0x6A,0x0B,0x78, +0x35,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0B,0x78,0x37,0x0F,0x57,0x35,0x0F,0x59,0x6E, +0x0F,0x39,0x72,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0F,0x57,0x37,0x4F,0x39,0x42,0x0B, +0x18,0x39,0x43,0x18,0xCD,0x0F,0x17,0x39,0xE4,0x00,0x00,0xC1,0xC3,0xA0,0x10,0x01, +0x9A,0xE0,0xFF,0xBD,0x0B,0xAC,0x43,0x17,0xE4,0x43,0x57,0xDC,0x4F,0x37,0x08,0x0B, +0x5A,0x01,0x8F,0x3D,0x0F,0x39,0x02,0x4F,0x39,0x42,0x43,0x3A,0xCD,0x0F,0x38,0x01, +0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0x85,0xE4,0x00,0x00,0x61,0xC3,0xA0,0x10,0x01, +0x9A,0xE0,0xFF,0xBD,0x0A,0xC8,0x43,0x17,0xE4,0x43,0x57,0xDC,0x4F,0x37,0x08,0x0B, +0x5A,0x01,0x8F,0x3D,0x0F,0x39,0x02,0x4F,0x39,0x42,0x43,0x3A,0xCD,0x0F,0x38,0x01, +0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0x85,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x20, +0x64,0x56,0x98,0x60,0xE7,0xFF,0xFD,0x08,0x98,0x68,0xE7,0xFF,0xFC,0xFC,0x98,0x6A, +0xE4,0x00,0x00,0x25,0x98,0x62,0xE7,0xFF,0xFC,0xE4,0x98,0x69,0xE7,0xFF,0xFC,0xD8, +0x98,0x6B,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFC,0xC3,0x9C,0x38,0x98,0x60,0x0D, +0x21,0x04,0xE7,0xFF,0xFC,0xAC,0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFC, +0x97,0xC2,0xE0,0x10,0x01,0xCB,0x00,0x7F,0xFF,0xFE,0xF7,0x0B,0x60,0x8B,0x37,0x0B, +0x79,0x00,0x5F,0x1B,0x15,0x4B,0x58,0xD8,0x9F,0x22,0x5F,0x1A,0x06,0xC3,0x40,0x10, +0x01,0xFF,0x5A,0x0B,0x70,0xD7,0x3A,0xFF,0x56,0x9B,0x20,0x0B,0x57,0x00,0x43,0x5A, +0xC5,0x9E,0xE2,0xC3,0x40,0x3E,0x88,0xC3,0x40,0x10,0x01,0x4B,0x39,0x0A,0xFF,0x5A, +0x0B,0x70,0xD6,0xFA,0xFF,0x4E,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x23,0x20, +0x64,0xEB,0x37,0x08,0x8B,0xCB,0x39,0x08,0x00,0xEF,0x37,0x08,0x8B,0x9A,0xE1,0xFA, +0xF8,0x08,0x94,0xE4,0x00,0x00,0x2F,0xEB,0x37,0x08,0x8B,0xFF,0x40,0xF7,0xFF,0xF8, +0x18,0x08,0x94,0x47,0x39,0xD4,0xEF,0x37,0x08,0x8B,0x85,0x29,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x3D,0xF9,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C, +0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1,0x1C,0x0E,0x01,0x18,0x0E, +0x21,0x14,0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08,0x13,0x17,0x00,0xC2,0xE0, +0x10,0x01,0xFB,0x17,0x00,0xB8,0xF3,0x17,0x00,0xB8,0x23,0x00,0x2C,0xF2,0xF7,0x00, +0xB8,0xD2,0xE1,0x2F,0xAE,0xC1,0xA0,0x10,0x01,0xC1,0xE0,0x10,0x01,0xFD,0xAD,0x08, +0xE2,0xFD,0xEF,0x00,0xD8,0x0A,0xED,0x01,0x56,0xF7,0x80,0xD2,0xE0,0x2D,0x9E,0xC2, +0xE0,0x10,0x01,0xC1,0x60,0x10,0x01,0xF3,0x17,0x00,0xB8,0xFD,0x6B,0x09,0x68,0x23, +0x08,0xB2,0xF2,0xF7,0x00,0xB8,0x22,0xE8,0x68,0x0B,0x2B,0x02,0x9B,0x02,0xCF,0x59, +0x00,0x03,0x0A,0xEB,0x00,0x43,0x1A,0xC0,0xD6,0xF8,0x02,0x14,0xE4,0x00,0x00,0xA9, +0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x6F,0x22,0xE3,0x86,0x8B,0x0B,0x9A,0xE0,0x9B, +0x22,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3,0x01,0x20,0x00,0x25,0x5E,0xE3,0x29, +0x20,0x00,0x31,0x0B,0x58,0x00,0x43,0x5A,0xC8,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02, +0x5E,0xE3,0x49,0x23,0xFF,0x79,0xE7,0xFF,0xFF,0x67,0x42,0xF7,0xC5,0x53,0x20,0x15, +0xCE,0xF7,0x00,0x0A,0x42,0xF7,0xC8,0x8F,0x17,0x0F,0x0B,0x01,0xE4,0x00,0x00,0x43, +0x4E,0xF7,0x08,0x9B,0x1D,0x43,0x17,0xC0,0x8F,0x38,0x9B,0x07,0xCF,0x39,0x00,0x06, +0x43,0x39,0xC0,0x9B,0x03,0x42,0xF7,0xC0,0x8E,0xF9,0x0E,0xEB,0x03,0x0B,0x2B,0x30, +0x0B,0x0B,0x32,0x4E,0xF9,0x08,0xD7,0x17,0x00,0xC0,0xCF,0x39,0xFF,0xFE,0x9B,0x4B, +0x8F,0x19,0xCF,0x18,0x00,0x03,0x43,0x18,0xD0,0x8E,0xF8,0x0E,0xEB,0x33,0x0A,0xEB, +0x32,0x9B,0x12,0x43,0x17,0xC0,0x8E,0xF8,0x53,0x00,0xF0,0x0E,0xEB,0x33,0xC2,0xE0, +0x10,0x01,0xEF,0x17,0x01,0x55,0x0E,0xEF,0x02,0x22,0xE4,0x1E,0xE7,0xFF,0xFC,0x8A, +0xC1,0x80,0x10,0x01,0xFD,0x8C,0x0B,0x76,0x12,0xEC,0x04,0x10,0x6C,0x01,0x40,0x63, +0xBB,0xE7,0xFF,0xC5,0xEC,0xC1,0xC0,0x10,0x01,0x13,0x2C,0x04,0xFD,0xCE,0x0A,0x18, +0x10,0x6C,0x01,0x0A,0xEE,0x00,0x43,0x79,0x1B,0x9B,0x00,0xE4,0x00,0x00,0x35,0x4F, +0x58,0x10,0x9F,0x01,0x8F,0x4E,0x5F,0x18,0x00,0x0F,0x5A,0x02,0x5F,0x9A,0x06,0x5F, +0x57,0x1D,0x4A,0xFC,0xB8,0xD7,0x78,0xFF,0x54,0xC1,0x40,0x10,0x01,0xC2,0xE2,0x32, +0x88,0xFD,0x4A,0x01,0x3C,0x20,0x00,0x35,0x4E,0xF7,0x0A,0x0E,0xEA,0x19,0xE4,0x00, +0x00,0x2F,0x53,0x00,0xF0,0xC2,0xE0,0x77,0xE8,0x20,0x00,0x25,0x4E,0xF7,0x12,0x5F, +0x17,0x06,0x0F,0x0A,0x19,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0x94,0x22,0xE1,0x54, +0x40,0x63,0xCB,0xE7,0xFF,0xC5,0x08,0x12,0xEC,0x01,0x13,0x6C,0x04,0x0B,0x2E,0x00, +0x43,0x7B,0xBB,0x9A,0xE0,0x8B,0x17,0xE4,0x00,0x00,0x35,0x4F,0x58,0x10,0x8F,0x4E, +0x0F,0x5A,0x02,0xD7,0x59,0x00,0x48,0x5F,0x3A,0x06,0x8A,0xF8,0x9F,0x01,0x5F,0x18, +0x00,0xD7,0x78,0xFF,0x54,0x26,0xE8,0x3D,0xD2,0xEB,0x00,0x62,0xD2,0xEC,0x00,0x42, +0xD2,0xEA,0x00,0x66,0xFE,0xE0,0x02,0x58,0xE4,0x00,0x00,0x0F,0x52,0xE0,0xC8,0x0E, +0xEA,0x19,0x88,0x6A,0xE7,0xFF,0x29,0x76,0xC1,0x80,0x10,0x01,0x89,0xCB,0xFD,0x8C, +0x0B,0xEC,0x8A,0xEB,0x12,0x2C,0x00,0x53,0x20,0x14,0x0B,0x17,0x00,0xCF,0x18,0x00, +0x23,0x43,0x18,0xC8,0x0F,0x17,0x01,0xC3,0x00,0x10,0x01,0x9E,0xE2,0xFF,0x18,0x09, +0x9C,0xD6,0xF8,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x29,0x10,0xC2,0x00,0x10,0x01,0x9A, +0xE0,0xFE,0x10,0x08,0x84,0x22,0x20,0x4A,0x13,0x0C,0x00,0x27,0x04,0x33,0x12,0xF0, +0x00,0x5E,0xE0,0x01,0x4A,0xE1,0x01,0x13,0x0C,0x00,0x23,0x09,0x2E,0x13,0x10,0x00, +0x23,0x05,0x3A,0x13,0x2C,0x07,0x13,0x0C,0x37,0xD7,0x38,0x02,0x2A,0x0F,0x0C,0x0A, +0x23,0x04,0xFA,0x0F,0x0C,0x3A,0x23,0x04,0xE2,0xC3,0x00,0x10,0x01,0xEB,0x38,0x0B, +0xCE,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0xA5,0xFF,0x39,0xFC,0x01,0x4F,0x19,0xFA,0x47, +0x38,0xCE,0x43,0x19,0xC5,0xC3,0x20,0x10,0x01,0xEB,0x59,0x0B,0x81,0xD7,0x1A,0x00, +0xA4,0xE4,0x00,0x00,0x1B,0x23,0x04,0x26,0x13,0x10,0x00,0x23,0x00,0x18,0x22,0xE0, +0x9C,0x53,0x00,0x23,0x0A,0xEE,0x00,0xCE,0xF7,0x00,0x14,0x42,0xF7,0xC0,0x0E,0xEE, +0x01,0xC3,0x40,0x10,0x01,0x9D,0xC2,0xFF,0x5A,0x09,0x9C,0xD5,0xDA,0xFF,0x4E,0x88, +0x6A,0xE7,0xFF,0x27,0xDC,0x12,0xEC,0x00,0x22,0xE0,0x5A,0xC2,0xE0,0x10,0x01,0xEC, +0x17,0x08,0x98,0x13,0x2C,0x00,0xD3,0x20,0x0A,0xBE,0xE4,0x00,0x02,0xE1,0x98,0x61, +0x98,0x81,0x88,0xAA,0xE7,0xFF,0x22,0xBC,0x0A,0xEA,0x10,0x0B,0x0A,0x06,0x0B,0x2A, +0x12,0x5D,0xD7,0x04,0x42,0x38,0xBD,0x40,0xB8,0xCD,0xCA,0xE0,0x07,0xFF,0x43,0x37, +0xCD,0x0B,0x4A,0x02,0x0B,0x6A,0x08,0x40,0x97,0xC5,0x5C,0xF9,0x04,0x11,0x0C,0x00, +0x0B,0x2A,0x0A,0x40,0x78,0xD5,0x42,0x59,0xDD,0x42,0x77,0xCD,0x40,0xDA,0xC5,0xC2, +0xE0,0x10,0x01,0x9E,0x4A,0x42,0x9B,0xCD,0xFE,0xF7,0x0C,0x04,0x9B,0xA0,0xCB,0xC0, +0x07,0xFF,0xE4,0x00,0x00,0xC9,0x0B,0x97,0xFE,0xD7,0x1C,0x00,0x98,0x43,0x9C,0xD5, +0x43,0x9C,0x8B,0x43,0x9C,0x18,0x8F,0x8E,0xE4,0x00,0x00,0x2D,0xD7,0x84,0x00,0xA8, +0x43,0x9E,0xE5,0x43,0x9C,0xD5,0x43,0x9C,0x2B,0x43,0x9C,0x30,0x8F,0x87,0x0F,0x97, +0xFF,0x0B,0x97,0x00,0xD7,0x3C,0x00,0x98,0x43,0x9C,0xDD,0x9F,0x8A,0x43,0x9C,0xCB, +0x43,0x9C,0x90,0xE4,0x00,0x00,0x31,0xD7,0x93,0x00,0xB8,0x43,0x9E,0xE5,0x43,0x9C, +0xDD,0x43,0x9C,0xCB,0x43,0x9C,0xA0,0xFF,0x9C,0x07,0xFF,0x0F,0x97,0x01,0x9F,0xA1, +0x1E,0xF7,0x30,0x5F,0xBD,0x00,0xD7,0xA8,0xFD,0x06,0xCA,0xE0,0x07,0xFF,0x0B,0x0A, +0x12,0x0B,0x4A,0x10,0x0B,0x6A,0x0C,0x43,0xB7,0xD5,0x42,0xF7,0xDD,0x43,0xBD,0xC5, +0x0B,0x0A,0x0E,0x43,0xD7,0xC5,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xF1,0x17,0x08,0x94, +0x12,0xEC,0x00,0xE4,0x00,0x00,0x93,0xCF,0x38,0x00,0x30,0x8F,0x2C,0x0B,0x99,0x16, +0x09,0x59,0x18,0x43,0x9C,0xD5,0x41,0x4A,0xDD,0xCF,0x9C,0x07,0xFF,0xCD,0x4A,0x07, +0xFF,0x43,0x9C,0xE8,0x41,0x4A,0xF0,0x0F,0x99,0x17,0x0D,0x59,0x19,0x1F,0x9C,0x9C, +0x5F,0x9C,0x04,0xC3,0x80,0xE6,0xEA,0x20,0x00,0x41,0x21,0x00,0x34,0x8B,0x37,0x22, +0xE0,0x14,0x9B,0x21,0x5E,0xF9,0x00,0x9F,0x01,0x5F,0x18,0x00,0xD6,0xF8,0xFD,0xDD, +0x1A,0xEC,0x00,0xE7,0xFF,0xFD,0x71,0xCF,0x57,0x00,0x30,0x9E,0xE1,0x8F,0x4C,0x0F, +0x5A,0x0E,0xC3,0x40,0x95,0xEC,0x4B,0x18,0x0A,0xE4,0x00,0x00,0x11,0x9A,0xE0,0x8B, +0x17,0x5F,0x57,0x00,0xD7,0x3A,0xFF,0x1D,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x98, +0x0A,0xED,0x01,0x52,0xF7,0x08,0xE4,0x00,0x00,0x33,0x9B,0x07,0xC2,0xE0,0x10,0x01, +0x18,0x10,0x00,0xEF,0x17,0x01,0xBD,0x0A,0xED,0x01,0x9B,0x17,0x46,0xF7,0xC4,0x0E, +0xED,0x01,0x0E,0xEF,0x02,0xD2,0xE1,0x0D,0xAE,0xE7,0xFF,0xD9,0x4C,0xC2,0xE0,0x10, +0x01,0xEE,0xF7,0x07,0xF6,0xD2,0xE1,0x0A,0xAA,0x0B,0x2B,0x35,0x0A,0xEB,0x39,0x0B, +0x0B,0x36,0x5F,0x77,0x06,0x5F,0x59,0x06,0xD7,0x5B,0x00,0x30,0x8A,0xF9,0x5F,0x37, +0x06,0xC1,0xF8,0x00,0x21,0x47,0x39,0xCF,0xC2,0x00,0x10,0x01,0x4F,0x39,0xFA,0x99, +0x40,0x46,0xF7,0xCC,0xC1,0xC0,0x10,0x01,0x5E,0xF7,0x06,0xFD,0xEF,0xB4,0xBA,0x4E, +0xF7,0x08,0xFE,0x10,0x01,0xBE,0x5E,0xF8,0x15,0xC1,0x80,0x10,0x01,0x4A,0xF7,0xC0, +0x43,0x18,0xBD,0x0F,0x0B,0x37,0xE4,0x00,0x00,0xAD,0x1C,0x61,0x05,0x88,0x8F,0x98, +0xA3,0xE7,0xFF,0x66,0x30,0x1E,0xE1,0x08,0x8E,0xEA,0x12,0xF7,0xFD,0x1F,0x17,0x1A, +0x4E,0xF7,0x08,0x4F,0x18,0x08,0x8E,0xF0,0x8F,0x0B,0x0A,0xF7,0x01,0x0B,0x18,0x00, +0xD7,0x17,0x00,0xA0,0x9A,0xE1,0xEB,0x0C,0x08,0x7F,0x4E,0xF7,0x54,0x46,0xF7,0xC5, +0xE4,0x00,0x00,0x27,0x9A,0xE1,0xEB,0x0C,0x08,0x7F,0x4E,0xF7,0x54,0x46,0xF7,0xBF, +0x46,0xF7,0xC4,0x9D,0x41,0xEE,0xEC,0x08,0x7F,0x5D,0x4A,0x00,0xF2,0xEE,0x08,0xC2, +0xD6,0xEA,0xFD,0x55,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x7F,0x22,0xE0,0x34,0x0A, +0xED,0x01,0x52,0xF7,0x10,0xE4,0x00,0x00,0x3B,0x0A,0xED,0x01,0x57,0x17,0x10,0x23, +0x00,0x34,0x9B,0x21,0xC3,0x00,0x10,0x01,0xFB,0x38,0x08,0xAC,0x1F,0x40,0xEF,0x46, +0xF7,0xD4,0x0E,0xED,0x01,0xC1,0x40,0x10,0x01,0xC3,0x00,0x10,0x01,0xEE,0xEA,0x08, +0xB6,0xFF,0x18,0x08,0xD3,0x22,0xE0,0x56,0x18,0x18,0x00,0x0A,0xED,0x01,0x56,0xF7, +0x10,0x22,0xE1,0x64,0x9A,0xE1,0xE4,0x00,0x00,0x41,0x22,0xE4,0x92,0x12,0xF8,0x00, +0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xF8,0x00,0x0B,0x0D,0x01,0x57,0x18,0x10,0x23,0x00, +0xE0,0x26,0xE4,0xE5,0x9A,0xE2,0xEE,0xEA,0x08,0xB4,0xE4,0x00,0x00,0x61,0x22,0xE8, +0x7E,0x18,0x18,0x00,0x0A,0xED,0x01,0x56,0xF7,0x10,0x22,0xE0,0x34,0x98,0x62,0xE7, +0xFF,0x97,0xAE,0xE4,0x00,0x00,0x2F,0x9A,0xE3,0xE7,0xFF,0xFF,0xBB,0x22,0xEC,0x36, +0x98,0x60,0xE7,0xFF,0x97,0x88,0xEC,0x0A,0x08,0xB4,0x0B,0x0D,0x00,0xC2,0xE0,0x10, +0x01,0x27,0x1C,0x56,0xF3,0x17,0x08,0x9C,0xD3,0x09,0x01,0xB5,0x9F,0x01,0xFB,0x17, +0x08,0x9C,0xE4,0x00,0x00,0x59,0xF8,0x17,0x08,0x9C,0xE4,0x00,0x00,0x61,0x0E,0xEF, +0x02,0x22,0xE4,0xA6,0x9B,0x05,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0xBC,0x9B,0x03, +0xC2,0xE0,0x10,0x01,0x98,0x60,0xFB,0x17,0x08,0xAC,0xE7,0xFF,0x96,0xF8,0xE7,0xFF, +0x91,0xF0,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x92,0xA2,0xC2,0xE0,0x10,0x01,0xEB,0x17, +0x08,0x81,0xC3,0x00,0x7D,0x0A,0x20,0x00,0x61,0xC3,0x00,0x10,0x01,0x9B,0x5E,0xF3, +0x38,0x08,0x85,0xEC,0x17,0x08,0x81,0x47,0x39,0xD4,0xFB,0x38,0x08,0x85,0x0E,0x81, +0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E, +0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D, +0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0xE7,0xFF,0xA1,0xE2, +0x20,0x60,0xE6,0xE7,0xFF,0xA1,0xC0,0x20,0x64,0x7A,0x98,0x80,0xE7,0xFF,0xB3,0x46, +0xE7,0xFF,0x54,0xFE,0x20,0x60,0x26,0x98,0x61,0xE4,0x00,0x00,0x35,0x98,0x61,0x98, +0x80,0xE4,0x00,0x00,0x7B,0xE7,0xFF,0xA1,0x7C,0x98,0x80,0xE7,0xFF,0xB3,0x08,0xE7, +0xFF,0xA1,0x68,0x98,0x82,0xE4,0x00,0x00,0x53,0xE7,0xFF,0xA1,0x68,0x20,0x65,0x0E, +0xE7,0xFF,0xA1,0x46,0x20,0x64,0xA2,0x98,0x81,0xE7,0xFF,0xB2,0xCC,0xE7,0xFF,0x54, +0x84,0x20,0x60,0x26,0x98,0x61,0xE4,0x00,0x00,0x49,0x98,0x61,0x88,0x83,0xE7,0xFF, +0xAF,0x6A,0xE7,0xFF,0xC9,0x78,0x9A,0xE0,0xE4,0x00,0x00,0xED,0xE7,0xFF,0xA0,0xEE, +0x98,0x81,0xE7,0xFF,0xB2,0x7A,0xE7,0xFF,0xA0,0xDA,0x98,0x83,0xE7,0xFF,0xFF,0xC5, +0xE7,0xFF,0xA0,0xDA,0x20,0x68,0x36,0xE7,0xFF,0xA0,0xB8,0x98,0x82,0xE4,0x00,0x00, +0x23,0xE7,0xFF,0xA0,0xB8,0x20,0x6C,0x5E,0xE7,0xFF,0xA0,0x96,0x98,0x83,0xE7,0xFF, +0xB2,0x22,0xE7,0xFF,0xA0,0x82,0x98,0x87,0xE7,0xFF,0xFF,0x6D,0xE7,0xFF,0xA0,0x82, +0xD0,0x67,0x00,0xC6,0xE7,0xFF,0xA0,0x5E,0x98,0x87,0xE7,0xFF,0xB1,0xEA,0xE7,0xFF, +0xA0,0x4A,0x98,0x88,0xE7,0xFF,0xFF,0x35,0xE7,0xFF,0xA0,0x4A,0x9A,0xE0,0xD0,0x68, +0x00,0x86,0xE7,0xFF,0xA0,0x22,0x98,0x88,0xE7,0xFF,0xB1,0xAE,0x9A,0xE1,0x88,0x77, +0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x21,0x14,0x0D,0x41,0x10, +0x0D,0x61,0x0C,0x0D,0x81,0x08,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xE7,0xFF, +0x8C,0xCC,0x0C,0x61,0x00,0xE7,0xFF,0x8C,0xC6,0x0C,0x61,0x04,0x0E,0xE1,0x02,0xD2, +0xE0,0x1D,0x42,0x0E,0xE1,0x02,0xC1,0x80,0x10,0x01,0xC1,0x40,0x10,0x01,0x57,0x17, +0x10,0xFD,0x8C,0x00,0xDE,0xFD,0x4A,0x00,0xCC,0xD3,0x00,0x0A,0x92,0x50,0x60,0x10, +0xE7,0xFF,0x8C,0xA8,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xBB,0x9F,0x01,0x5F,0x18, +0x04,0xEF,0x17,0x00,0xBB,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x81,0x23,0x00,0x24, +0x9F,0x01,0xEF,0x17,0x08,0x81,0xE7,0xFF,0x8C,0xA4,0x0A,0xEC,0x0B,0xC1,0x60,0x10, +0x01,0x40,0x63,0xBD,0xFD,0x6B,0x06,0xFE,0x5E,0xE3,0x04,0x5E,0xE3,0xBB,0x20,0x02, +0x0F,0x0A,0xEB,0x01,0x56,0xF7,0x20,0x22,0xE1,0xE8,0x98,0x61,0xE7,0xFF,0xB3,0x66, +0x20,0x61,0xC6,0xE7,0xFF,0x9E,0xC0,0x20,0x64,0x56,0xC2,0xE0,0x10,0x01,0xF2,0xF7, +0x00,0xC0,0x56,0xF7,0x01,0x22,0xE1,0x72,0xE4,0x00,0x00,0x1F,0xE7,0xFF,0x9E,0x8E, +0x20,0x63,0xA8,0xE4,0x00,0x00,0x9D,0xE7,0xFF,0xC6,0x00,0x0A,0xEB,0x01,0xC6,0xF7, +0xFF,0xDF,0x0E,0xEB,0x01,0xE7,0xFF,0x9E,0x5C,0x20,0x60,0x5E,0x98,0x81,0x98,0xA0, +0xE7,0xFF,0x47,0x10,0x98,0x60,0x88,0x83,0xE7,0xFF,0xAC,0x96,0xE4,0x00,0x00,0x43, +0x98,0x80,0x98,0x62,0xE7,0xFF,0xAC,0x7E,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x56,0x2C, +0x98,0x60,0xE7,0xFF,0x4B,0xFA,0xE7,0xFF,0x8B,0x84,0x0C,0x6C,0x09,0xE7,0xFF,0xC6, +0x62,0xE7,0xFF,0x8B,0x6E,0x0A,0xEC,0x0F,0x40,0x63,0xBD,0x5E,0xE3,0x04,0xC2,0xE0, +0x3E,0x6E,0x20,0x01,0xB3,0x0A,0xEB,0x01,0x56,0xF7,0x80,0x22,0xE1,0x8C,0xE7,0xFF, +0x9D,0xAA,0x20,0x6D,0x72,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xC0,0x56,0xF7,0x01, +0x22,0xE1,0x3A,0xC1,0x80,0x10,0x01,0xEA,0xEC,0x0D,0x63,0x9E,0xE1,0xEE,0xEC,0x0D, +0x63,0xE7,0xFF,0xC4,0xEC,0x0A,0xEB,0x01,0xC6,0xF7,0xFF,0x7F,0x0E,0xEB,0x01,0xEA, +0xEC,0x0D,0x63,0xD2,0xEC,0x00,0xF9,0x98,0x63,0xE7,0xFF,0xB1,0xCC,0x20,0x60,0x56, +0x98,0x61,0x98,0x80,0xE7,0xFF,0xAB,0x7E,0x98,0x60,0xE7,0xFF,0x4B,0x52,0xE4,0x00, +0x00,0x19,0x98,0x63,0x98,0x80,0xE7,0xFF,0xAB,0x5A,0xE7,0xFF,0xC5,0x68,0x0A,0xEA, +0x01,0x52,0xF7,0x10,0x0E,0xEA,0x01,0xE4,0x00,0x05,0x25,0xC6,0xF7,0x01,0x00,0xD2, +0xE0,0x14,0x52,0xC2,0xE0,0x10,0x01,0x98,0x60,0xEC,0x17,0x0D,0x63,0xE7,0xFF,0x89, +0xBE,0xFC,0x60,0x01,0x00,0xE7,0xFF,0x89,0xBE,0xFC,0x60,0x01,0x00,0xE7,0xFF,0x89, +0xCE,0xE7,0xFF,0x9C,0x84,0xD0,0x67,0x12,0xC5,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBA, +0xAC,0x4C,0x63,0x10,0x8C,0x77,0x0E,0xE3,0x02,0x86,0xE9,0xE7,0xFF,0x9C,0x64,0x20, +0x60,0x46,0x98,0x80,0xE7,0xFF,0xAD,0xD6,0x98,0x60,0x98,0x87,0xE4,0x00,0x03,0xBF, +0xE7,0xFF,0x9C,0x3A,0xD0,0x67,0x11,0x4E,0x98,0x60,0x98,0x87,0xE4,0x00,0x03,0x47, +0xE7,0xFF,0xFA,0x2E,0xD0,0x60,0x10,0xCA,0xE7,0xFF,0xAF,0xC8,0x5D,0x63,0x04,0x98, +0x61,0xE7,0xFF,0xB0,0x7C,0xD0,0x60,0x0C,0x76,0xC1,0x60,0x19,0x0A,0x20,0x06,0x19, +0xE7,0xFF,0x4A,0x1A,0xE7,0xFF,0x49,0xEA,0x5C,0x63,0x00,0x24,0x64,0x2B,0xC1,0x60, +0x32,0x0A,0x20,0x00,0x91,0x98,0x80,0x98,0x62,0xE7,0xFF,0xA9,0xF4,0xFC,0x60,0x01, +0x5E,0xE7,0xFF,0x53,0xA2,0x98,0x60,0xE7,0xFF,0x49,0x70,0xE7,0xFF,0x88,0xFA,0x0C, +0x6C,0x09,0xE4,0x00,0x02,0xFB,0xE7,0xFF,0x4E,0x6A,0x98,0x61,0xE4,0x00,0x01,0xDF, +0xE7,0xFF,0xF9,0x6E,0xD0,0x60,0x0D,0xCA,0xE7,0xFF,0xAF,0x08,0xE7,0xFF,0x53,0xCE, +0xE7,0xFF,0x54,0x5E,0xD0,0x61,0x09,0x7A,0xE7,0xFF,0x54,0x7E,0x20,0x65,0x06,0xE7, +0xFF,0x49,0x14,0x98,0x62,0xE7,0xFF,0xAF,0x94,0x20,0x60,0x82,0xE7,0xFF,0x48,0xD2, +0x5C,0x63,0x00,0x20,0x60,0x58,0x98,0x63,0x98,0x80,0xE7,0xFF,0xA9,0x32,0xE7,0xFF, +0x88,0x54,0x0C,0x6C,0x0D,0xE4,0x00,0x02,0x55,0x98,0x62,0x98,0x80,0xE7,0xFF,0xA9, +0x0C,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x52,0xBA,0xE4,0x00,0x02,0x2D,0xE7,0xFF,0x54, +0x14,0x98,0x62,0xE4,0x00,0x01,0x11,0xE7,0xFF,0xF8,0xA0,0xD0,0x60,0x0A,0x92,0xE7, +0xFF,0xAE,0x3A,0xE7,0xFF,0x54,0x7C,0xE7,0xFF,0x55,0x3E,0xC1,0x80,0x10,0x01,0x89, +0x63,0xFD,0x8C,0x0D,0x60,0x5E,0xEB,0x04,0xC2,0xE0,0x25,0x6E,0x20,0x00,0x1D,0xFC, +0x60,0x01,0x2C,0xE7,0xFF,0x56,0x74,0x20,0x60,0x54,0x0A,0xEC,0x01,0x9E,0xE1,0x5E, +0xF7,0x04,0x0E,0xEC,0x01,0x26,0xE4,0x8B,0xE4,0x00,0x00,0x55,0x5E,0xEB,0x04,0x88, +0x6B,0xC2,0xE0,0x4A,0xEE,0x20,0x00,0x1D,0xFC,0x60,0x02,0x58,0xE7,0xFF,0x56,0x88, +0x20,0x63,0x6A,0xE4,0x00,0x00,0x5D,0xE7,0xFF,0x56,0x98,0x0C,0x0C,0x01,0xE4,0x00, +0x00,0x37,0x5E,0xEB,0x04,0x88,0x6B,0xC2,0xE0,0x4A,0xEE,0x20,0x00,0x1D,0xFC,0x60, +0x02,0x58,0xE7,0xFF,0x56,0x3C,0x20,0x63,0x86,0x98,0x63,0x98,0x80,0xE4,0x00,0x00, +0xFD,0x0C,0x0C,0x01,0xE4,0x00,0x00,0x9F,0xE7,0xFF,0x99,0x6A,0x20,0x64,0x3E,0xE7, +0xFF,0x99,0x5C,0x88,0x83,0x98,0x64,0xE4,0x00,0x00,0x71,0xE7,0xFF,0x99,0x44,0x20, +0x63,0xC0,0xE7,0xFF,0x99,0x36,0xD0,0x60,0x05,0x3E,0x98,0x64,0x98,0x80,0xE7,0xFF, +0xAA,0xA2,0x98,0x64,0xE4,0x00,0x00,0x8B,0x98,0x64,0x98,0x89,0xE4,0x00,0x00,0x27, +0xE7,0xFF,0x98,0xFA,0x20,0x64,0x76,0xE7,0xFF,0x98,0xEC,0x88,0x83,0x98,0x67,0xE7, +0xFF,0xAA,0x60,0x0A,0xEA,0x01,0xCA,0xF7,0x01,0x00,0x0E,0xEA,0x01,0xE4,0x00,0x00, +0xE1,0xE7,0xFF,0x98,0xB8,0x20,0x63,0x88,0xE7,0xFF,0x98,0xAA,0x20,0x61,0x86,0x98, +0x67,0x98,0x80,0xE7,0xFF,0xAA,0x18,0x98,0x67,0x98,0x81,0xE7,0xFF,0xA6,0xD0,0xE7, +0xFF,0xC0,0xDE,0xE4,0x00,0x00,0x95,0x0E,0xE1,0x06,0x22,0xE1,0x3C,0x0E,0xE1,0x06, +0x56,0xF7,0x20,0x22,0xE1,0x18,0x98,0x60,0xE7,0xFF,0x85,0x48,0x50,0x60,0x20,0xE7, +0xFF,0x85,0x52,0xE7,0xFF,0x7A,0xA8,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD1,0xC7, +0x18,0xFF,0xFE,0x50,0x60,0x20,0xEF,0x17,0x00,0xD1,0xE7,0xFF,0x85,0x2C,0xC2,0xE0, +0x10,0x01,0xEB,0x17,0x00,0xCF,0x53,0x18,0x20,0xEF,0x17,0x00,0xCF,0xC2,0xE0,0x10, +0x01,0xF0,0x77,0x01,0xAE,0xE7,0xFF,0x84,0xCE,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D, +0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x0C,0x63,0x02,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x0C,0x83,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x24,0x14,0x0B,0x17,0x01,0x53,0x18,0x01,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF,0x0F, +0x17,0x01,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D, +0x81,0x00,0xC1,0x54,0x00,0x01,0xC9,0x8A,0x22,0x28,0x0A,0xEC,0x01,0xC6,0xF7,0xFF, +0xFB,0xC9,0x6A,0x22,0x04,0x0E,0xEC,0x01,0xFF,0x00,0x80,0x00,0x0A,0xEB,0x01,0x46, +0xF7,0xC5,0x5E,0xF7,0x04,0xC9,0x4A,0x24,0xA8,0x0E,0xEB,0x01,0x0A,0xEA,0x01,0xCA, +0xF7,0x30,0x00,0x50,0x60,0x64,0x0E,0xEA,0x01,0xE4,0x00,0x24,0x8E,0x0A,0xEC,0x01, +0x52,0xF7,0x04,0x50,0x60,0x1E,0x0E,0xEC,0x01,0xE4,0x00,0x24,0x6E,0x0A,0xEB,0x01, +0xC6,0xF7,0x7F,0xFF,0x0E,0xEB,0x01,0x0A,0xEA,0x01,0xC6,0xF7,0xCF,0xFF,0x0E,0xEA, +0x01,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x2C,0x08,0x77,0x01,0x4C,0x63,0x09, +0x54,0x63,0x1F,0x9C,0x61,0x85,0x29,0x9C,0x7F,0x5C,0x63,0x00,0x5C,0x62,0xFB,0x20, +0x00,0x81,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x08,0xCA,0xF7,0x24,0x2C,0x54,0x63,0x3E, +0x0B,0x17,0x01,0x1F,0x20,0xC1,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77,0x01,0x85, +0x29,0x9B,0x19,0x20,0x60,0x62,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x37, +0x01,0x47,0x19,0xC4,0x53,0x18,0x04,0xE4,0x00,0x00,0x87,0x20,0x64,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0x53,0x18,0x06,0xE4,0x00,0x00,0x5D, +0x20,0x68,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0xC7,0x18, +0xFF,0xF9,0xE4,0x00,0x00,0x31,0x20,0x6C,0x5E,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x10,0x0B,0x37,0x01,0x47,0x19,0xC4,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0x5C, +0x63,0x00,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x0C,0xA1,0x04,0x95,0x50,0xC9, +0x4A,0x20,0x80,0x8D,0x43,0x4D,0x4A,0x18,0x88,0x6A,0xE7,0xFF,0xFC,0xE0,0x0C,0xA1, +0x06,0x1C,0x6A,0x04,0x0D,0x21,0x0E,0x0D,0x41,0x0A,0x88,0x85,0x1C,0x21,0x10,0xE7, +0xFF,0xFC,0xB7,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x5D,0x44,0x00,0x4E,0xEA,0x08,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x5D,0x65,0x00,0x5C,0x63,0x00,0x4D,0x83,0x18,0x8D,0x8B, +0x8D,0x97,0x06,0xE0,0x81,0xCA,0xF7,0x04,0x00,0x0D,0x21,0x14,0x0D,0xA1,0x04,0xC5, +0x8C,0x1F,0xFC,0x5D,0xA6,0x00,0x8D,0x97,0x88,0x6C,0xE7,0xFF,0xFC,0x00,0x55,0x4A, +0x01,0x50,0x80,0xFF,0x4D,0x4A,0x08,0x8D,0x6A,0x4D,0x6B,0x18,0x4C,0x84,0x5C,0x4D, +0x6D,0x5C,0x44,0x84,0x27,0x0D,0xA1,0x06,0x44,0x83,0x24,0x0D,0x41,0x12,0x88,0x6C, +0x44,0x84,0x5D,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x21,0x16,0x1C,0x21,0x18,0xE7, +0xFF,0xFB,0xD7,0x5C,0x84,0x04,0x20,0x60,0x28,0x20,0x64,0xC2,0xE4,0x00,0x00,0x33, +0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA,0xF7,0x24,0x34,0xC4,0x84,0x01, +0xFF,0xE4,0x00,0x00,0x2B,0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA,0xF7, +0x24,0x38,0xC4,0x84,0x01,0xFF,0x0C,0x97,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18, +0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01, +0x47,0x64,0x27,0xCB,0x37,0x24,0x3C,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x40,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27, +0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F, +0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7, +0xCB,0x37,0x24,0x3C,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x40,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27, +0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18, +0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01, +0x47,0x64,0x27,0xCB,0x37,0x24,0x1C,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x20,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27, +0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F, +0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7, +0xCB,0x37,0x24,0x1C,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01, +0xCA,0xF7,0x24,0x20,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27, +0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB, +0x17,0x24,0x80,0x0B,0x38,0x01,0x5F,0x23,0x04,0x0F,0x38,0x01,0x07,0x20,0xFF,0xCB, +0x39,0xFF,0xFF,0xCA,0xF7,0x24,0x84,0x44,0x63,0xCC,0x0B,0x17,0x01,0x4C,0x63,0x81, +0xFF,0x20,0xFF,0x00,0x47,0x18,0xCC,0x44,0x63,0xC5,0x0C,0x77,0x01,0x85,0x29,0x07, +0x00,0xFF,0xCB,0x18,0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00,0x00,0x7D, +0xC2,0xF4,0x00,0x01,0x47,0x64,0x27,0xCB,0x37,0x24,0x24,0x0B,0x59,0x01,0x47,0x5A, +0xDC,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x47,0x04,0xC4,0x0B,0x37,0x01,0x4F,0x18, +0x81,0x44,0x84,0x27,0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47,0x19,0xC4, +0x47,0x04,0xC5,0x0F,0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2,0xF4,0x00, +0x01,0x47,0x9A,0xD7,0xCB,0x37,0x24,0x24,0x0B,0x79,0x01,0x47,0x7B,0xE4,0x47,0x5A, +0xDD,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x44,0x84,0xC4,0x0B,0x57,0x01,0x4C,0x84, +0x81,0x47,0x24,0x27,0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0xC3, +0x14,0x00,0x01,0xCA,0xF8,0x22,0x08,0x20,0x64,0x3A,0x0B,0x37,0x01,0xCB,0x39,0x10, +0x00,0xE4,0x00,0x00,0x1D,0x20,0x60,0x36,0x0B,0x37,0x01,0xC7,0x39,0xEF,0xFF,0x0F, +0x37,0x01,0xCA,0xF8,0x22,0x08,0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x84,0x00,0x1F,0x00,0x80,0x20,0x60,0x28,0x20,0x64,0xAA,0xE4,0x00, +0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x54,0xE4,0x00,0x00,0x19,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0x64,0x0B,0x37,0x01,0x54,0x84,0x7F,0x47,0x19,0xC4,0x47, +0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x20,0x60,0x28,0x20,0x64,0xAA, +0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x50,0xE4,0x00,0x00,0x19, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x61,0x13,0x17,0x00,0x54,0x84,0x1F,0x57,0x18, +0xE0,0x44,0x84,0xC5,0x18,0x97,0x00,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61, +0x04,0x0D,0x21,0x0C,0x5D,0x44,0x00,0x89,0x63,0x1C,0x8A,0xF1,0x4C,0x84,0x08,0x5C, +0x83,0xF3,0x20,0x00,0x19,0x50,0x80,0x1F,0x88,0x6B,0xE7,0xFF,0xFF,0x5A,0x1F,0x00, +0x80,0x21,0x60,0x28,0x21,0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x24,0x4C,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x60,0x0B, +0x37,0x01,0x55,0x4A,0x7F,0x47,0x19,0xC4,0x47,0x0A,0xC5,0x0F,0x17,0x01,0x0D,0x61, +0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x20,0x64,0x8E,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0x53,0x39, +0xF0,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xF0,0xE4,0x00,0x00,0x47,0x20, +0x60,0x8A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38, +0x01,0xC7,0x39,0xFF,0x0F,0x0F,0x38,0x01,0x0B,0x17,0x01,0x53,0x18,0x0F,0x0F,0x17, +0x01,0x85,0x29,0x20,0x64,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7, +0x22,0x60,0x0B,0x38,0x01,0x53,0x39,0x08,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18, +0xFE,0xFF,0xE4,0x00,0x00,0x49,0x20,0x60,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22, +0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0xC7,0x39,0xFF,0xF7,0x0F,0x38,0x01,0x0B, +0x17,0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xCB,0x18,0x02,0x00,0xE4,0x00,0x00, +0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xC7, +0x18,0xFD,0xFF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x54,0x63,0x7F,0xCA, +0xF7,0x24,0xA0,0x1F,0x20,0x80,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x40,0xCA,0xF7,0x24,0xA0,0xC4, +0x63,0x7F,0x00,0x0B,0x17,0x01,0xFF,0x20,0x80,0xFF,0x47,0x18,0xCC,0x47,0x03,0xC5, +0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA1,0x10,0x77,0x00, +0x54,0x63,0x7F,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0xE4,0x00,0x00,0x2B,0x20,0x60,0x52,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x53,0x18,0x80,0x0F,0x17,0x01,0x85, +0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0xC7, +0x18,0x7F,0xFF,0xE4,0x00,0x00,0x39,0x20,0x60,0x6E,0xC2,0xF4,0x00,0x01,0xFF,0x20, +0x80,0x00,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C,0x63,0x00,0xCA,0xF7,0x22,0x0C,0xFF, +0x20,0xFF,0x00,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xFF,0x40,0xFF,0x00,0xCA,0xF7,0x22,0xF0, +0x47,0x03,0xD4,0x0B,0x37,0x01,0x5F,0x39,0x00,0x47,0x18,0xCD,0x0F,0x17,0x01,0x85, +0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x38,0x0B,0x17,0x01,0x0C, +0x77,0x01,0x85,0x29,0x20,0x64,0x6A,0xC2,0xF4,0x00,0x01,0x9B,0x3C,0xCA,0xF7,0x25, +0xC0,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x01,0xE4,0x00,0x00,0x3F,0x20,0x60, +0x7A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x38,0xCA,0xF7,0x25,0xC0,0x0B,0x38,0x01, +0x0C,0x18,0x01,0x0B,0x17,0x01,0x53,0x18,0x03,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84, +0x00,0x20,0x64,0x62,0x4C,0x63,0x24,0xC2,0xF4,0x00,0x01,0x5C,0x63,0x04,0xCA,0xF7, +0x22,0xCC,0x0C,0x77,0x01,0xE4,0x00,0x00,0x25,0x20,0x60,0x3A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x22,0xCC,0x0C,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4,0x00,0x00,0x2B,0x20, +0x64,0x52,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0x53,0x18,0x01, +0x0F,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8, +0x0B,0x17,0x01,0xC7,0x18,0xF0,0xFF,0xE4,0x00,0x00,0x2D,0x20,0x64,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xCB,0x18,0x0F,0x00,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x63,0x00,0xC4,0x84,0x03,0xFF,0x20,0x64,0x70,0x20,0x60,0x34,0x20, +0x68,0x88,0x20,0x6C,0xDA,0xE4,0x00,0x00,0x51,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x68,0xE4,0x00,0x00,0x49,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x6C,0xE4,0x00,0x00, +0x31,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x70,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x24,0x74,0x0C,0x97,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17,0x01,0x5C,0x63,0x00,0x07,0x00, +0x20,0xCB,0x18,0x41,0x00,0x44,0x63,0xC5,0x4C,0x63,0x10,0x0C,0x83,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0xFC,0x21,0xFE,0x88,0x50,0xA0, +0x96,0xED,0x21,0x01,0x74,0xED,0x41,0x01,0x70,0xED,0x61,0x01,0x6C,0x88,0x61,0xC1, +0x78,0x00,0x21,0xFD,0x6B,0xB4,0xBE,0x88,0x8B,0xE7,0xFF,0x48,0x60,0xFD,0x41,0x00, +0x96,0xFC,0x8B,0x00,0x96,0x88,0x6A,0x50,0xA0,0xD2,0xE7,0xFF,0x48,0x3E,0x8A,0xE1, +0xC3,0x54,0x00,0x01,0xFF,0x60,0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39, +0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x47,0xB9,0xCF,0x8F, +0x1A,0x0B,0x98,0x01,0x47,0x9C,0xEC,0x0B,0xB7,0x05,0x47,0x39,0xEC,0x47,0x3C,0xCD, +0x0F,0x38,0x01,0x9E,0xE6,0xD5,0x57,0xFE,0x9E,0xFE,0xE1,0x00,0x96,0xFF,0x81,0x01, +0x68,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08, +0x8F,0x19,0x0B,0x37,0x03,0x47,0xD9,0xCF,0x8F,0x1A,0x0B,0xB8,0x01,0x47,0xBD,0xF4, +0x0B,0xD7,0x05,0x47,0x39,0xF4,0x47,0x3D,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x97, +0xFE,0x9E,0xED,0x61,0x01,0x6E,0xED,0x41,0x01,0x72,0xED,0x21,0x01,0x76,0xFC,0x21, +0x01,0x78,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x00,0x0C,0x18,0x01,0xCA, +0xF7,0x24,0x14,0xFF,0x20,0xFF,0x07,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x30, +0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x9B,0x10,0x20,0x60,0x28,0x20,0x64,0xAA, +0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x10,0xE4,0x00,0x00,0x19, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x14,0x0B,0x37,0x01,0x54,0x84,0x0F,0x47,0x19, +0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x74, +0xD8,0x18,0x18,0x00,0xCB,0x37,0x74,0x10,0x5C,0x63,0x00,0x18,0x79,0x00,0xCB,0x37, +0x76,0x30,0x18,0x19,0x00,0x53,0x40,0x24,0xCB,0x37,0x74,0x00,0x1B,0x59,0x00,0xCB, +0x77,0x74,0x28,0x53,0x20,0x60,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x30,0x1B,0x3B,0x00, +0xCB,0x77,0x74,0x38,0x53,0x20,0x1C,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x40,0x1B,0x3B, +0x00,0xCB,0x37,0x74,0xA8,0x13,0x39,0x00,0xCB,0x37,0x74,0x78,0x9B,0x69,0x1B,0x79, +0x00,0xCB,0x37,0x74,0x70,0x18,0x19,0x00,0xCB,0x37,0x74,0x60,0x13,0x79,0x00,0x1B, +0x59,0x00,0xCA,0xF7,0x74,0x61,0x13,0x37,0x00,0x18,0x17,0x00,0x98,0x61,0x12,0xF8, +0x00,0x52,0xF7,0x01,0x1A,0xF8,0x00,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x74,0x20,0x18,0x77,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFE,0xFF,0x0F,0x17, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63, +0x21,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xE0,0x10,0x77, +0x00,0x4C,0x63,0x09,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74, +0x68,0x10,0x77,0x00,0x4C,0x63,0x29,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x74,0xE0,0x10,0x77,0x00,0x4C,0x63,0x19,0x54,0x63,0x01,0x85,0x29,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63,0x11,0x54,0x63,0x01, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x08,0x77,0x01,0x4C,0x63,0x49, +0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x08,0x77,0x01, +0x4C,0x63,0x51,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x61, +0x13,0x17,0x00,0x57,0x18,0xFD,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x74,0x61,0x13,0x17,0x00,0x53,0x18,0x02,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x74,0xC0,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x74,0xA8,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xC8, +0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xA0,0x12,0xF7,0x00, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x20,0x10,0x77,0x00,0x85,0x29,0x5C, +0x63,0x00,0xC3,0x14,0x00,0x01,0x4E,0xE3,0x10,0xCB,0x18,0x2A,0x00,0x8E,0xF8,0x08, +0x77,0x00,0x9A,0xE8,0xCC,0x63,0x00,0x03,0x40,0x63,0xB8,0x85,0x29,0x5C,0x84,0x04, +0x5E,0xE4,0x00,0xD2,0xEF,0x05,0xAD,0x4E,0xF7,0x10,0xC3,0x18,0x00,0x21,0xFF,0x18, +0xBC,0x30,0x8E,0xF8,0xC3,0x34,0x00,0x01,0x0F,0x17,0x02,0xCA,0xF9,0x26,0x18,0x0B, +0x57,0x01,0xC7,0x5A,0xFF,0xF3,0x1F,0x60,0xCF,0x0F,0x57,0x01,0x0B,0x57,0x01,0x47, +0x5A,0xDC,0x53,0x5A,0x10,0x4C,0x84,0x49,0x0F,0x57,0x01,0x9A,0xE1,0xCB,0x59,0x26, +0x20,0xE4,0x00,0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1,0x8F,0x38,0x5E,0xF7,0x04,0x0B, +0x39,0x01,0xC7,0x39,0x3F,0xFF,0x0F,0x3A,0x01,0xC3,0x34,0x00,0x01,0xD6,0xE4,0xFF, +0x40,0x20,0x60,0x96,0xCB,0x39,0x26,0x38,0x0B,0x18,0x01,0x0A,0xF9,0x01,0x4F,0x18, +0x60,0xFF,0x40,0x8F,0xFF,0xC7,0x18,0x70,0x00,0x46,0xF7,0xD4,0x46,0xF8,0xBD,0x0E, +0xF9,0x01,0xE4,0x00,0x00,0x4B,0x20,0x64,0x86,0xCA,0xF9,0x26,0x38,0xFF,0x60,0xF8, +0xFF,0x0B,0x38,0x01,0x0B,0x57,0x01,0x4F,0x39,0x40,0x47,0x1A,0xDC,0xC7,0x39,0x07, +0x00,0x47,0x19,0xC5,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x18,0x0B, +0x17,0x01,0x53,0x18,0x30,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0xD0,0x8F,0x03, +0x9D,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x58,0x4C,0x84,0x10,0xC3,0x14,0x00,0x01, +0x8C,0x97,0xCB,0x38,0x26,0x34,0x0E,0xE4,0x02,0x0B,0x59,0x01,0x0B,0x77,0x03,0xFF, +0x80,0xC0,0x00,0xC7,0x7B,0x3F,0xFF,0x47,0x5A,0xE4,0x47,0x5B,0xD5,0x0F,0x59,0x01, +0x20,0x60,0x7E,0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F,0x39,0x60,0x0B,0x58,0x01, +0xFF,0x60,0x8F,0xFF,0xC7,0x39,0x70,0x00,0x46,0xFA,0xDC,0xE4,0x00,0x00,0x3F,0x20, +0x64,0x86,0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F,0x39,0x40,0x0B,0x58,0x01,0xFF, +0x80,0xF8,0xFF,0xC7,0x39,0x07,0x00,0x46,0xFA,0xE4,0x46,0xF9,0xBD,0x0E,0xF8,0x01, +0x85,0x29,0x5C,0x84,0x00,0xD0,0x8C,0x04,0x1D,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB, +0x58,0x4C,0x84,0x10,0xFF,0x40,0xC0,0x00,0x8C,0x97,0x0E,0xE4,0x02,0x20,0x60,0xD6, +0xC3,0x14,0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26,0xC4,0xC7,0x7B,0x3F,0xFF,0x0B, +0x99,0x01,0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18,0x26,0x38,0x0F,0x59,0x01,0x1F, +0x60,0x8F,0x0B,0x37,0x01,0x0B,0x58,0x01,0x4F,0x39,0x20,0x57,0x39,0x70,0xE4,0x00, +0x00,0x63,0x20,0x64,0xDA,0xC3,0x14,0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26,0xC8, +0xC7,0x7B,0x3F,0xFF,0x0B,0x99,0x01,0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18,0x26, +0x38,0x0F,0x59,0x01,0x9B,0x78,0x0B,0x37,0x01,0x0B,0x58,0x01,0x57,0x39,0x07,0x46, +0xFA,0xDC,0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29,0x5C,0x84,0x04,0x20,0x60,0x28, +0x20,0x64,0xEE,0xE4,0x00,0x00,0x39,0xC2,0xF4,0x00,0x01,0x4C,0x84,0x41,0xCA,0xF7, +0x26,0xC0,0x54,0x84,0x3F,0x0B,0x17,0x01,0x1F,0x20,0xC0,0xE4,0x00,0x00,0x2F,0xC2, +0xF4,0x00,0x01,0xC4,0x84,0x3F,0x00,0xCA,0xF7,0x26,0xC0,0xFF,0x20,0xC0,0xFF,0x0B, +0x17,0x01,0x47,0x18,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85,0x29,0x20,0x61,0x52, +0x20,0x84,0x84,0x20,0x80,0x2C,0xD0,0x82,0x04,0xD6,0xE4,0x00,0x00,0x5D,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0x3F,0xFF,0xE4,0x00,0x01, +0x01,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01, +0xC7,0x18,0x3F,0xFF,0xE4,0x00,0x00,0x27,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xC0,0x00, +0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00, +0xA1,0x20,0x65,0x3E,0x20,0x84,0x80,0x20,0x80,0x28,0x20,0x89,0x1A,0xE4,0x00,0x00, +0x63,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0xCF,0xFF, +0xE4,0x00,0x00,0x5B,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xCF,0xFF,0xCA,0xF7,0x26,0x30, +0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x27,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xCB,0x18,0x30,0x00,0x0F,0x17,0x01, +0x85,0x29,0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26, +0x24,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0x2D,0x20,0x60, +0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF, +0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24, +0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0xDF,0xFF,0x0F,0x17,0x01, +0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01, +0xCB,0x18,0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20, +0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18,0x10, +0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24, +0x0B,0x17,0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x9C,0x38,0xC2,0xF4, +0x00,0x01,0x0D,0x21,0x04,0xCA,0xF7,0x26,0x18,0x0B,0x17,0x01,0xCB,0x18,0x40,0x00, +0x98,0x60,0x0F,0x17,0x01,0xE7,0xFF,0xFF,0x1A,0x0D,0x21,0x06,0x98,0x60,0x9C,0x28, +0xE7,0xFF,0xFF,0x5F,0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA, +0xF7,0x26,0x00,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04,0xE4,0x00,0x00,0x2D, +0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18, +0x7F,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xDF,0xFF,0x0F, +0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B, +0x17,0x01,0xCB,0x18,0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF,0x0F,0x17,0x01,0x85, +0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB, +0x18,0x10,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64, +0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x08,0x00, +0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B, +0x17,0x01,0xC7,0x18,0xF7,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x04,0x00,0xE4,0x00,0x00, +0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7, +0x18,0xFB,0xFF,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0x4F, +0x23,0x40,0xCA,0xF7,0x26,0x14,0x4C,0x63,0x60,0x0B,0x17,0x01,0x44,0x79,0x1D,0x5F, +0x18,0x00,0x44,0x63,0xC5,0x5C,0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xFF,0x20,0xF0,0x00,0xCB,0x17,0x26,0x0C,0xC4,0x63,0x0F,0xFF,0x0B,0x58,0x01, +0x5C,0x63,0x06,0x47,0x5A,0xCC,0x47,0x43,0xD5,0x0F,0x58,0x01,0xCA,0xF7,0x26,0x10, +0x0B,0x17,0x01,0x47,0x38,0xCC,0x44,0x63,0xCD,0x0C,0x77,0x01,0x85,0x29,0x9C,0x38, +0xFF,0x00,0xE0,0x00,0x0D,0x21,0x04,0x0D,0x41,0x00,0xC1,0x54,0x00,0x01,0xCA,0xEA, +0x26,0x04,0x0B,0x37,0x01,0x47,0x39,0xC4,0xCB,0x39,0x0F,0xA0,0x0F,0x37,0x01,0xCA, +0xEA,0x26,0x08,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x10,0x60,0x98,0x60,0x0F, +0x17,0x01,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF9,0x28,0xCA,0xEA,0x26,0xC0,0xFF,0x20, +0xC0,0xFF,0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x08,0x00,0x98,0x60,0x0F,0x17, +0x01,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF7,0xDA,0x98,0x61,0xFC,0x80,0x08,0x03,0xE7, +0xFF,0xF7,0xC6,0xCA,0xEA,0x26,0x00,0x0B,0x17,0x01,0x53,0x18,0x0F,0x0F,0x17,0x01, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0x0F,0x17,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF, +0xBF,0x98,0x68,0x0F,0x17,0x01,0xE7,0xFF,0xFE,0x44,0x0D,0x21,0x06,0x0D,0x41,0x02, +0xFC,0x60,0x01,0x2C,0x9C,0x28,0xE7,0xFF,0xFE,0x6F,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x78,0x00,0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x78,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFD,0x0F,0x17,0x01,0x85, +0x29,0x9C,0x7F,0x5C,0x63,0x00,0xD0,0x64,0x05,0x15,0xC2,0xF8,0x00,0x21,0xFE,0xF7, +0xBD,0xF0,0x4C,0x63,0x10,0xFF,0x00,0xFC,0xFF,0x8C,0x77,0xC2,0xF4,0x00,0x01,0x0F, +0x23,0x02,0x87,0x29,0xCB,0x17,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x38,0x01,0x53, +0x39,0x01,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFC,0xFF,0xE4,0x00,0x00,0xD3, +0xCB,0x37,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01,0x53,0x5A,0x01,0x0F,0x59, +0x01,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x01,0x00,0xE4,0x00,0x00,0x95,0xCB, +0x37,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01,0x53,0x5A,0x01,0x0F,0x59,0x01, +0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x02,0x00,0xE4,0x00,0x00,0x57,0xCA,0xF7, +0x3D,0x3C,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4,0x00,0x00,0x39,0xCB,0x17,0x3C, +0x10,0xCA,0xF7,0x3C,0x14,0x0B,0x38,0x01,0x53,0x39,0x01,0x0F,0x38,0x01,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xFD,0x0F,0x17,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFB,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0x5C, +0x84,0x00,0x9A,0xE0,0x24,0x64,0x43,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBE,0x04,0x8C, +0x77,0x12,0xE3,0x00,0xC3,0x14,0x00,0x01,0xCB,0x18,0x78,0x01,0x4E,0xF7,0x10,0x5C, +0x80,0x29,0x46,0xF7,0xC5,0x4B,0x00,0x1A,0x1B,0x17,0x00,0x85,0x29,0xC2,0xF4,0x00, +0x01,0x5C,0x84,0x04,0xCB,0x17,0x79,0x04,0xCC,0x84,0x17,0x70,0x4F,0x24,0x81,0x5C, +0x84,0x04,0x0F,0x38,0x01,0xCA,0xF7,0x79,0x00,0x0C,0x97,0x01,0x98,0x81,0xE7,0xFF, +0xFF,0x5D,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xCC,0x0B,0x17,0x01,0x53,0x18,0x02, +0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x7A,0x30,0xCB,0x37,0x7A, +0x34,0xCB,0x57,0x7A,0x10,0xCA,0xF7,0x7A,0x14,0x0B,0x18,0x01,0x0B,0x39,0x01,0x0B, +0x5A,0x01,0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63,0x80,0x8E,0xF8,0x8C,0x7A,0x44, +0x63,0x1F,0x44,0x63,0xBC,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x7A,0x70,0xCB, +0x37,0x7A,0x74,0xCB,0x57,0x7A,0x50,0xCA,0xF7,0x7A,0x54,0x0B,0x18,0x01,0x0B,0x39, +0x01,0x0B,0x5A,0x01,0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63,0x80,0x8E,0xF8,0x8C, +0x7A,0x44,0x63,0x1F,0x44,0x63,0xBC,0x85,0x29,0x5C,0x63,0x06,0xC2,0xF4,0x00,0x01, +0x47,0x23,0x1F,0xCA,0xF7,0x7A,0x10,0x0B,0x17,0x01,0x47,0x19,0xC4,0x44,0x63,0xC5, +0x5C,0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0x5C,0x63,0x06,0xC2,0xF4,0x00,0x01,0x47, +0x23,0x1F,0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47,0x19,0xC4,0x44,0x63,0xC5,0x5C, +0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x44,0x63,0x1F,0xCA,0xF7, +0x7A,0x10,0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0x44,0x63,0x1F,0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17, +0x01,0x85,0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x7A,0x30,0x0C,0x77, +0x01,0x85,0x29,0x9B,0x01,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x7A,0x70,0x0F,0x17,0x01, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xAA,0x55,0xCB,0x17,0x78,0xC0,0x0F,0x38, +0x01,0x5F,0x03,0x04,0x27,0x08,0x17,0x98,0x63,0xCA,0xF7,0x78,0xC4,0x5C,0x63,0x04, +0xCB,0x00,0x03,0xE8,0x43,0x04,0xC1,0x40,0x63,0xC3,0x4C,0x63,0x81,0x44,0x63,0x1F, +0x0C,0x77,0x01,0x06,0xE0,0x5B,0xCA,0xF7,0x8D,0x80,0x5C,0x97,0x0D,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x3C,0x44,0x0B,0x17,0x01,0x20,0x00,0x2D,0xC7,0x18,0xFF,0xBF,0xE4, +0x00,0x00,0x15,0x5F,0x18,0x04,0x53,0x18,0x40,0x0F,0x17,0x01,0x85,0x29,0xFF,0x00, +0xAA,0x55,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0,0x0F,0x17,0x01,0x85,0x29,0xFF, +0x00,0x55,0xAA,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0,0x0F,0x17,0x01,0x85,0x29, +0xCA,0xE0,0x03,0x20,0xC3,0x14,0x00,0x01,0x5C,0x63,0x04,0xC0,0x60,0x63,0xEA,0x48, +0x63,0xB8,0xCA,0xF8,0x79,0x10,0x0B,0x37,0x01,0x53,0x39,0x01,0x0F,0x37,0x01,0xCB, +0x58,0x79,0x00,0xCB,0x38,0x79,0x08,0x9C,0x38,0x0A,0xF9,0x01,0xCB,0x18,0x3C,0x44, +0x0B,0x7A,0x01,0x0B,0x39,0x01,0x0F,0x21,0x07,0x0B,0x18,0x01,0x57,0x18,0x40,0x5F, +0x18,0x04,0x23,0x00,0x40,0x4C,0x63,0x29,0x5C,0x60,0x09,0x48,0x63,0x0A,0xE4,0x00, +0x00,0x3F,0xCC,0x63,0x00,0x06,0x5C,0x63,0x04,0xE4,0x00,0x00,0x29,0x0A,0xF8,0x01, +0x52,0xF7,0x01,0x0E,0xF8,0x01,0x0A,0xF9,0x01,0xE4,0x00,0x00,0x21,0xC3,0x34,0x00, +0x01,0xCB,0x19,0x79,0x10,0xCB,0x39,0x79,0x08,0x0B,0x41,0x07,0x43,0x57,0xD5,0xD4, +0x7A,0x00,0xB8,0x0B,0x41,0x07,0xD7,0x57,0xFE,0xB9,0x0B,0x41,0x07,0x43,0x5B,0xD5, +0x8E,0xFA,0xD4,0x77,0xFE,0x5C,0x9C,0x28,0x85,0x29,0x5C,0x63,0x04,0xE4,0x00,0x00, +0x2D,0x42,0xE4,0x2C,0xC3,0x38,0x00,0x01,0x43,0x05,0xCC,0x8F,0x03,0x13,0x18,0x00, +0x1B,0x17,0x00,0x9C,0xBF,0x20,0xBF,0xB2,0x85,0x29,0x5C,0x63,0x00,0xC2,0xF4,0x00, +0x01,0x20,0x60,0xCE,0xCA,0xF7,0x2C,0x30,0x0B,0x17,0x01,0xCB,0x18,0x02,0x00,0x0F, +0x17,0x01,0x80,0x01,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3C,0x44,0xCA,0xF7,0x3C,0xA8, +0x0B,0x38,0x01,0xC7,0x39,0xFF,0xF3,0x0F,0x38,0x01,0x0B,0x17,0x01,0x53,0x18,0x01, +0xE4,0x00,0x00,0x9F,0xCB,0x17,0x3C,0xA8,0x0B,0x38,0x01,0x53,0x39,0x01,0xCA,0xF7, +0x3C,0x5C,0x0F,0x38,0x01,0x1F,0x00,0xC0,0x0B,0x37,0x00,0x47,0x39,0xC4,0x9B,0x02, +0x24,0x64,0x25,0x54,0x63,0x3F,0x5F,0x03,0x06,0x47,0x18,0xCD,0x5C,0x78,0x04,0xC3, +0x14,0x00,0x01,0x0C,0x77,0x01,0xCA,0xF8,0x3C,0xA8,0x0B,0x37,0x01,0xC7,0x39,0xFF, +0xFE,0x0F,0x37,0x01,0xCA,0xF8,0x2C,0x30,0x0B,0x17,0x01,0xCB,0x18,0x01,0x00,0x0F, +0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3D,0x80,0x0B,0x38,0x01,0xCB, +0x39,0x08,0x00,0x0F,0x38,0x01,0xCA,0xF7,0x3D,0x84,0x0B,0x17,0x01,0xCB,0x18,0x08, +0x00,0x0F,0x17,0x01,0x85,0x29,0xE7,0xFF,0xFF,0xBD,0x56,0xE3,0xFF,0x4E,0xF7,0x08, +0x5C,0x84,0x04,0xC4,0x63,0xFF,0x00,0x8C,0x77,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x08, +0x8C,0x77,0x0C,0x83,0x01,0x85,0x29,0x1C,0x21,0xC8,0xC0,0x98,0x00,0x21,0x0D,0x21, +0x34,0x1C,0x61,0x06,0xFC,0x84,0xB6,0x6E,0x50,0xA0,0x2A,0xE7,0xFF,0x2F,0x7C,0x1E, +0xE1,0x06,0x1F,0x41,0x30,0x0B,0x37,0x01,0xFF,0x60,0xFF,0x00,0x47,0x19,0xDC,0x5F, +0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0xC3,0x34,0x00,0x01,0x8F,0x19, +0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47,0x7B,0xE4,0x0B,0x97,0x05,0x47, +0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD7,0x57,0xFE,0x5E,0x0D,0x21, +0x36,0x1C,0x21,0x38,0x85,0x29,0xFC,0x21,0xFF,0x38,0x50,0xA0,0x3C,0xED,0x21,0x00, +0xC4,0xED,0x41,0x00,0xC0,0xED,0x61,0x00,0xBC,0xED,0x81,0x00,0xB8,0xED,0xA1,0x00, +0xB4,0xED,0xC1,0x00,0xB0,0xED,0xE1,0x00,0xAC,0xEE,0x01,0x00,0xA8,0xC1,0x58,0x00, +0x21,0x1C,0x61,0x6C,0xFD,0x4A,0xB6,0x6E,0x1C,0x8A,0x2A,0xE7,0xFF,0x2E,0x7C,0x50, +0xA0,0x24,0x1C,0x8A,0x66,0x1C,0x61,0x48,0xE7,0xFF,0x2E,0x62,0x98,0x61,0x98,0x82, +0xE7,0xFF,0xEF,0x1A,0x98,0x61,0xFC,0x80,0x3E,0x0C,0xE7,0xFF,0xD9,0xF2,0x98,0x61, +0xFC,0x80,0x3E,0x0C,0xE7,0xFF,0xEC,0x6C,0x98,0x61,0x88,0x83,0xE7,0xFF,0xDC,0xA6, +0x98,0x61,0x88,0x83,0xE7,0xFF,0xDA,0x2E,0x98,0x60,0x98,0x81,0xE7,0xFF,0xDB,0x1E, +0x98,0x60,0x05,0x4F,0x0F,0xC9,0x4A,0x0F,0x0F,0x88,0x8A,0xE7,0xFF,0xE4,0xDE,0x98, +0x61,0x88,0x8A,0xE7,0xFF,0xE4,0xCE,0xC3,0x54,0x00,0x01,0xCA,0xE0,0x11,0x50,0xCB, +0x5A,0x22,0x00,0x57,0x17,0xFF,0x4F,0x18,0x10,0x8F,0x1A,0x1F,0x61,0x2A,0x0B,0x38, +0x01,0x4F,0x17,0x08,0x8F,0x1B,0xEF,0x38,0xDD,0x61,0x9E,0xE1,0xC2,0xE2,0x2B,0xE4, +0x23,0xFF,0x8D,0x1E,0xE1,0x6C,0xFF,0x41,0x00,0xA8,0xC1,0x94,0x00,0x01,0xFD,0xA0, +0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18, +0x08,0x8F,0x19,0x0B,0x37,0x03,0x8F,0x0C,0x0F,0x38,0x01,0x9E,0xE4,0xD7,0x57,0xFF, +0x2E,0x1E,0xE1,0x48,0x1F,0x41,0x6C,0x0B,0x37,0x01,0x47,0x19,0x6C,0x5F,0x39,0x00, +0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x8F,0x0C,0x0F,0x38,0x01, +0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0xE7,0xFF,0xD5,0xF8,0x99,0xE0,0x89,0xC3,0x98,0x61, +0xE7,0xFF,0xD6,0x0E,0xD1,0xE0,0x05,0xBE,0x98,0x60,0x1D,0x61,0x0A,0xE7,0xFF,0xD6, +0x48,0x99,0x40,0xE4,0x00,0x01,0x45,0x98,0x61,0x88,0x8A,0x22,0x01,0x0A,0xE7,0xFF, +0xE1,0xE0,0x98,0x60,0xE7,0xFF,0xE2,0x2A,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF8,0x16, +0xE7,0xFF,0xD4,0x14,0xE7,0xFF,0xF6,0xC2,0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC, +0x60,0x01,0x00,0xE7,0xFF,0xF7,0x6C,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF8,0x30,0x88, +0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE8,0x94,0xE4,0x00,0x00,0x8B,0xE7,0xFF,0xE1, +0x62,0x98,0x61,0xE7,0xFF,0xE1,0xAC,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF7,0x98,0xE7, +0xFF,0xD3,0x96,0xE7,0xFF,0xF6,0x44,0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60, +0x01,0x00,0xE7,0xFF,0xF6,0xEE,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF7,0xB2,0x88,0x6A, +0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE8,0x16,0x0A,0xEB,0x01,0x40,0x63,0xBD,0x0C,0x6B, +0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2,0x02,0xFB,0x8E,0x9D,0x41,0x9D,0x62,0x5D,0x4A, +0x00,0xD1,0x44,0x05,0xEA,0x9A,0x00,0xE7,0xFF,0xFE,0xC1,0x98,0x61,0x1D,0x61,0x12, +0xE7,0xFF,0xD4,0xE2,0x99,0x40,0xE4,0x00,0x01,0x45,0x98,0x61,0x88,0x8A,0x22,0x01, +0x0A,0xE7,0xFF,0xE0,0x7A,0x98,0x60,0xE7,0xFF,0xE0,0xC4,0xFC,0x60,0x01,0x00,0xE7, +0xFF,0xF6,0xB0,0xE7,0xFF,0xD2,0xAE,0xE7,0xFF,0xF5,0x5C,0xC4,0x63,0x01,0x00,0x20, +0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x06,0xFC,0x60,0x01,0x00,0xE7,0xFF, +0xF6,0xCA,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE7,0x2E,0xE4,0x00,0x00,0x8B, +0xE7,0xFF,0xDF,0xFC,0x98,0x61,0xE7,0xFF,0xE0,0x46,0xFC,0x60,0x01,0x00,0xE7,0xFF, +0xF6,0x32,0xE7,0xFF,0xD2,0x30,0xE7,0xFF,0xF4,0xDE,0xC4,0x63,0x01,0x00,0x20,0x63, +0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF5,0x88,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6, +0x4C,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE6,0xB0,0x0A,0xEB,0x01,0x40,0x63, +0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2,0x02,0xFB,0x8E,0x9D,0x41,0x9D, +0x62,0x5D,0x4A,0x00,0xD1,0x44,0x00,0x52,0x9A,0x00,0xE7,0xFF,0xFE,0xC1,0x9D,0xE1, +0x5D,0xEF,0x00,0xD1,0xE2,0xF4,0x8E,0x0B,0x21,0x0A,0x0B,0x01,0x12,0x0F,0x21,0x07, +0x1E,0xE1,0x0C,0x1F,0x81,0x12,0x0B,0x77,0x01,0x8B,0x59,0x5F,0xBB,0x06,0xD7,0x3D, +0x00,0x30,0x8B,0x5B,0x5F,0x3A,0x06,0x0B,0x77,0x09,0x8B,0x58,0x5F,0xBB,0x06,0xD7, +0x1D,0x00,0x30,0x8B,0x5B,0x5F,0x1A,0x06,0x9E,0xE2,0xD7,0x97,0xFE,0xE6,0x0F,0x21, +0x07,0x9A,0xE0,0x0F,0x01,0x09,0x1F,0x21,0x1A,0x8B,0x57,0xFD,0x00,0x3F,0xFF,0xE4, +0x00,0x00,0x69,0x43,0x7E,0xC4,0x0B,0x9B,0x00,0x43,0x79,0xC4,0x23,0x80,0x32,0x0D, +0x1B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x23,0x09,0x5D,0x00,0xCD,0x4A,0x1F,0xFF,0x43, +0x8A,0xE0,0x0F,0x9B,0x01,0x9F,0x02,0xD3,0x08,0xFE,0xE6,0x9F,0x28,0x9E,0xE2,0xD2, +0xE4,0x00,0xBA,0x1F,0x01,0x0A,0x4F,0xD7,0x10,0x1F,0xA1,0x06,0x8F,0xD8,0x8F,0xB7, +0x9B,0x00,0xE7,0xFF,0xFF,0x83,0xC3,0x94,0x00,0x01,0x9A,0xE0,0xCB,0x9C,0x24,0x00, +0xE4,0x00,0x00,0x47,0x43,0xB9,0xC4,0x43,0xDB,0xC4,0x57,0xBD,0xFF,0x0B,0xDE,0x01, +0x4F,0xBD,0x10,0x8F,0xBC,0x0F,0xDD,0x01,0x9F,0x02,0xD3,0x08,0xFF,0x56,0x9E,0xE1, +0x22,0xE8,0x54,0x1F,0x21,0x1A,0x4F,0x77,0x18,0x9B,0x00,0x8F,0x79,0xFF,0x37,0x12, +0x46,0xE7,0xFF,0xFF,0xA7,0x9A,0xE0,0x4F,0x17,0x08,0x1F,0x61,0x6C,0x8F,0x1B,0x0B, +0x38,0x01,0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19, +0x1F,0x21,0x2A,0x8F,0x0C,0x8F,0x37,0x0B,0x39,0x01,0x0F,0x38,0x01,0x9E,0xE2,0x5E, +0xE3,0xC9,0x23,0xFF,0x55,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x25,0x38,0x0B,0x17,0x01, +0x23,0x40,0x34,0x5F,0x18,0x04,0x53,0x18,0x0F,0xE4,0x00,0x00,0x11,0xC7,0x18,0xFF, +0xF0,0x0F,0x17,0x01,0x98,0x60,0x98,0x80,0xE7,0xFF,0xDE,0x84,0x98,0x80,0x98,0x61, +0xE7,0xFF,0xDE,0x74,0x98,0x60,0xE7,0xFF,0xDD,0x26,0x98,0x60,0x98,0x80,0xE7,0xFF, +0xDC,0xC0,0x88,0x6E,0xEE,0x01,0x00,0xAA,0xED,0xE1,0x00,0xAE,0xED,0xC1,0x00,0xB2, +0xED,0xA1,0x00,0xB6,0xED,0x81,0x00,0xBA,0xED,0x61,0x00,0xBE,0xED,0x41,0x00,0xC2, +0xED,0x21,0x00,0xC6,0xFC,0x21,0x00,0xC8,0xE7,0xFF,0xD0,0x5F,0x80,0x01,0x80,0x01, +0x80,0x01,0x80,0x01,0x80,0x01,0xC8,0x80,0xAA,0x55,0xC0,0x74,0x00,0x01,0xC8,0x63, +0x78,0xC0,0x0C,0x83,0x00,0xC0,0x74,0x00,0x01,0xC8,0x63,0x1F,0xDC,0x50,0x80,0x80, +0x0C,0x83,0x00,0x04,0x20,0x80,0xC8,0x21,0x17,0xFC,0x1C,0x40,0xFD,0x44,0x21,0x14, +0x28,0x00,0x74,0xC0,0x40,0x00,0x01,0xC8,0x42,0x31,0xD8,0x84,0x49,0x0C,0x41,0x0C, +0x0C,0x61,0x10,0x0C,0x81,0x14,0x0C,0xA1,0x18,0x0C,0xC1,0x1C,0x0C,0xE1,0x20,0x0D, +0x01,0x24,0x0D,0x21,0x28,0x0D,0x41,0x2C,0x0D,0x61,0x30,0x0D,0x81,0x34,0x0D,0xA1, +0x38,0x0D,0xC1,0x3C,0x0D,0xE1,0x40,0x0E,0x01,0x44,0x0E,0x21,0x48,0x0E,0x41,0x4C, +0x0E,0x61,0x50,0x0E,0x81,0x54,0x0E,0xA1,0x58,0x0E,0xC1,0x5C,0x0E,0xE1,0x60,0x0F, +0x01,0x64,0x0F,0x21,0x68,0x0F,0x41,0x6C,0x0F,0x61,0x70,0x0F,0x81,0x74,0x0F,0xA1, +0x78,0x0F,0xC1,0x7C,0x1C,0x61,0x00,0xC1,0x00,0x00,0x01,0xC9,0x08,0x9F,0x48,0x85, +0x08,0x90,0x23,0x00,0xC0,0x40,0x10,0x01,0xC8,0x42,0x03,0xB0,0xC0,0x60,0x10,0x01, +0xC8,0x63,0x0D,0x64,0x5C,0x43,0x1F,0x20,0x00,0x2D,0x0C,0x02,0x00,0x1C,0x42,0x04, +0x93,0xF4,0x85,0x29,0xC0,0x80,0x01,0x1F,0xC0,0x7F,0xFF,0xE1,0xC8,0x63,0xFF,0xF9, +0x44,0x84,0x1C,0xC0,0x80,0x01,0x1D,0x0C,0x61,0x02,0xC0,0x60,0x02,0x0D,0x0C,0x61, +0x06,0xC0,0x60,0x04,0x0D,0x0C,0x41,0x0E,0x0C,0x61,0x12,0x0C,0x81,0x16,0x0C,0xA1, +0x1A,0x0C,0xC1,0x1E,0x0C,0xE1,0x22,0x0D,0x01,0x26,0x0D,0x21,0x2A,0x0D,0x41,0x2E, +0x0D,0x61,0x32,0x0D,0x81,0x36,0x0D,0xA1,0x3A,0x0D,0xC1,0x3E,0x0D,0xE1,0x42,0x0E, +0x01,0x46,0x0E,0x21,0x4A,0x0E,0x41,0x4E,0x0E,0x61,0x52,0x0E,0x81,0x56,0x0E,0xA1, +0x5A,0x0E,0xC1,0x5E,0x0E,0xE1,0x62,0x0F,0x01,0x66,0x0F,0x21,0x6A,0x0F,0x41,0x6E, +0x0F,0x61,0x72,0x0F,0x81,0x76,0x0F,0xA1,0x7A,0x0F,0xC1,0x7E,0xEF,0xE1,0x00,0x82, +0x0C,0x21,0x0A,0x84,0x00,0x00,0x00,0x00,0x9C,0x30,0xCA,0xE0,0x48,0x02,0x0D,0x41, +0x08,0x0D,0x21,0x0C,0x89,0x43,0xC2,0xF7,0x00,0x0F,0x9B,0x1C,0x46,0xF7,0xC4,0x0E, +0xE1,0x04,0x0E,0xE1,0x06,0x56,0xF7,0x04,0x22,0xE0,0xE0,0xCA,0xE0,0x48,0x00,0xC3, +0x37,0x00,0x0F,0x9B,0x1B,0x47,0x39,0xC4,0xC3,0x37,0x00,0x0D,0xCA,0xE0,0x48,0x02, +0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3,0x17,0x00,0x0D,0x98,0x82,0xE7,0xFF,0xC2, +0xB4,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00,0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D, +0x0E,0xE1,0x06,0x56,0xF7,0x08,0x22,0xE0,0xE8,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00, +0x0F,0x9B,0x17,0x47,0x39,0xC4,0xC3,0x37,0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37, +0x00,0x0F,0x47,0x19,0xC4,0xC3,0x17,0x00,0x0D,0x98,0x83,0x88,0x6A,0xE7,0xFF,0xC2, +0x34,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00,0x0F,0x53,0x18,0x08,0xC3,0x17,0x00,0x0D, +0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +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,0x00,0x00,0x00,0x00,0xA0,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x1B,0x00,0x00,0x00,0x00,0xA0,0x26,0x01,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x00,0xA0,0x66,0x00,0x01,0x00,0x00,0x00,0xF3,0x00,0x06,0x00, +0xC4,0x00,0x2F,0x00,0x07,0x00,0x0D,0x01,0xF6,0xFF,0x5C,0x00,0xFB,0xFF,0x00,0x00, +0x1B,0x00,0x1B,0x00,0x01,0x00,0x10,0x00,0xF0,0x00,0x9E,0x00,0x6F,0x00,0x6F,0x00, +0x1A,0x00,0x0C,0x3E,0x01,0x00,0x00,0x00,0x64,0x00,0x14,0x00,0x14,0x00,0x06,0x00, +0x06,0x00,0x5A,0x00,0x14,0x00,0x14,0x00,0x06,0x00,0x06,0x00,0x64,0x00,0x01,0x00, +0x5F,0x00,0x01,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x50,0x00,0x96,0x00,0x40,0x06,0x00,0x00,0x80,0x0C,0x00,0x00, +0x01,0x03,0x07,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00, +0x00,0x01,0x02,0x00,0x14,0x00,0x2D,0x00,0x46,0x00,0x5F,0x00,0x78,0x00,0x91,0x00, +0x07,0x00,0xC8,0x00,0xC8,0x00,0xC8,0x00,0xF4,0x01,0xF4,0x01,0xFF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x03,0x04,0x05,0x02,0x00,0x04,0x00,0x06,0x00, +0x08,0x00,0x0A,0x00,0x0C,0x00,0x10,0x00,0x14,0x00,0x18,0x00,0x20,0x00,0x28,0x00, +0x32,0x00,0x3E,0x00,0x40,0x00,0x64,0x00,0x80,0x00,0x00,0x01,0x02,0x00,0x00,0x11, +0xFF,0xFF,0xFF,0xFF,0x01,0x11,0xFF,0xFF,0x18,0x50,0x02,0x11,0xFF,0x7F,0xFF,0x0E, +0x03,0x11,0xFF,0x00,0x66,0x00,0x04,0x11,0xFF,0x0F,0x72,0x07,0x05,0x11,0xFF,0x0F, +0x72,0x07,0x06,0x11,0xFF,0x00,0x00,0x00,0x07,0x11,0x03,0x00,0x00,0x00,0x08,0x11, +0x73,0x00,0x00,0x00,0x09,0x11,0xFF,0xFF,0x00,0x00,0x09,0x11,0xFF,0x7F,0x00,0x00, +0x0A,0x11,0xFF,0x7F,0x87,0x10,0x0E,0x11,0xFF,0xFF,0x00,0x00,0x0F,0x11,0xFF,0xFF, +0x00,0x00,0x17,0x11,0x0F,0xFF,0x00,0x00,0x18,0x11,0xFF,0xFF,0x00,0x02,0x19,0x11, +0xFF,0x00,0x0E,0x00,0x1E,0x11,0xFF,0xFF,0x00,0x00,0x1F,0x11,0xFF,0x00,0x00,0x00, +0x33,0x11,0x0F,0x00,0x00,0x00,0x3A,0x11,0x37,0x0F,0x00,0x00,0x3B,0x11,0x77,0x00, +0x77,0x00,0x3C,0x11,0x00,0xFF,0x00,0xA0,0x3D,0x11,0x77,0x00,0x00,0x00,0x3E,0x11, +0xFF,0x00,0x00,0x00,0x04,0x12,0x06,0x00,0x00,0x00,0x05,0x12,0xFF,0x00,0x00,0x00, +0x07,0x12,0xFF,0xFF,0x00,0x00,0x08,0x12,0xFF,0x00,0x00,0x00,0x09,0x12,0xFF,0xFF, +0x00,0x00,0x0A,0x12,0xFF,0x00,0x00,0x00,0x0B,0x12,0x3F,0x00,0x2E,0x00,0x0D,0x12, +0x1F,0x00,0x05,0x00,0x0E,0x12,0x1F,0x00,0x05,0x00,0x0F,0x12,0xFF,0xFF,0x00,0x00, +0x10,0x12,0xFF,0x00,0x00,0x00,0x11,0x12,0xFF,0x0F,0x00,0x00,0x12,0x12,0x87,0x1F, +0x00,0x00,0x13,0x12,0x7F,0x0F,0x14,0x00,0x14,0x12,0x9F,0xFF,0x0A,0x09,0x15,0x12, +0x7F,0x0F,0x0C,0x0F,0x16,0x12,0xFF,0x0F,0x00,0x07,0x17,0x12,0x1F,0xFF,0x0A,0x5C, +0x18,0x12,0x7F,0x1F,0x14,0x0A,0x19,0x12,0xFF,0xFF,0x8C,0x21,0x1A,0x12,0xFF,0x03, +0x00,0x00,0x1B,0x12,0xFF,0x03,0x00,0x00,0x1C,0x12,0xFF,0x03,0x00,0x00,0x1D,0x12, +0xFF,0x03,0x00,0x00,0x1E,0x12,0x1F,0x1F,0x12,0x07,0x1F,0x12,0x3F,0x3F,0x00,0x00, +0x20,0x12,0xFF,0xFF,0x00,0x00,0x21,0x12,0xFF,0x00,0x00,0x00,0x23,0x12,0x3F,0x3F, +0x02,0x00,0x24,0x12,0x3F,0x00,0x00,0x00,0x28,0x12,0xFF,0xFF,0x83,0x81,0x2D,0x12, +0x01,0x00,0x01,0x00,0x50,0x12,0xFF,0xFF,0x00,0x00,0x51,0x12,0xFF,0x00,0x00,0x00, +0x70,0x12,0x03,0x00,0x03,0x00,0x01,0x11,0x06,0x00,0x02,0x00,0x02,0x11,0x00,0x08, +0x00,0x08,0x2A,0x12,0x00,0xFF,0x00,0xBA,0x2B,0x12,0xFF,0x30,0xF0,0x20,0x01,0x11, +0x06,0x00,0x00,0x00,0x2A,0x12,0x00,0xFF,0x00,0x00,0x2B,0x12,0xFF,0x30,0x00,0x00, +0x01,0x11,0x00,0x50,0x00,0x50,0x02,0x11,0x3F,0x06,0x2F,0x06,0x01,0x11,0x00,0x50, +0x00,0x00,0x02,0x11,0x3F,0x06,0x00,0x00,0x2A,0x12,0x00,0x30,0x00,0x20,0x11,0x1E, +0xFF,0x7F,0x00,0x00,0x12,0x1E,0xFF,0x00,0x00,0x00,0x13,0x1E,0x0F,0x00,0x00,0x00, +0x15,0x1E,0x73,0x07,0x00,0x00,0x16,0x1E,0x0F,0x00,0x00,0x00,0x18,0x1E,0x3F,0x00, +0x08,0x00,0x2A,0x1E,0x05,0x00,0x01,0x00,0x50,0x11,0x11,0x11,0x51,0x11,0x11,0x11, +0x52,0x11,0x11,0x11,0x53,0x11,0x11,0x11,0x54,0x11,0x11,0x11,0x55,0x11,0x11,0x11, +0x56,0x11,0x11,0x11,0x57,0x11,0x11,0x11,0x58,0x11,0x11,0x11,0x59,0x11,0x11,0x11, +0x5A,0x11,0x11,0x11,0x5B,0x11,0x11,0x11,0x5C,0x11,0xFF,0xFF,0x5D,0x11,0xFF,0xFF, +0x5E,0x11,0xFF,0xFF,0x46,0x12,0x00,0x00,0x47,0x12,0x00,0x00,0x48,0x12,0x00,0x00, +0x49,0x12,0x00,0x00,0x4A,0x12,0x00,0x00,0x4B,0x12,0x00,0x00,0x4C,0x12,0x00,0x00, +0x4D,0x12,0x00,0x00,0x4E,0x12,0x0F,0x00,0x02,0x03,0x0F,0x00,0x52,0x00,0x69,0x00, +0xD9,0x00,0x95,0x00,0x89,0x00,0x7E,0x00,0x72,0x00,0x67,0x00,0x5B,0x00,0x50,0x00, +0x44,0x00,0x39,0x00,0x2D,0x00,0x22,0x00,0x16,0x00,0x0B,0x00,0x00,0x00,0xFF,0x00, +0x8D,0x09,0x1A,0x00,0xFE,0x00,0x1B,0x07,0x3F,0x00,0xFE,0x00,0x9D,0x0A,0x78,0x00, +0xFD,0x00,0xEC,0x12,0xA8,0x00,0xFC,0x00,0x6B,0x18,0xD0,0x00,0xFB,0x00,0x7C,0x19, +0x0A,0x01,0xF9,0x00,0x55,0x20,0x4E,0x01,0xF8,0x00,0x85,0x26,0x86,0x01,0xFF,0x00, +0x48,0x0D,0x09,0x00,0xFE,0x00,0x9E,0x0B,0x1E,0x00,0xFE,0x00,0x34,0x0E,0x44,0x00, +0xFD,0x00,0x35,0x14,0x66,0x00,0xFD,0x00,0x1A,0x18,0x7F,0x00,0xFC,0x00,0x11,0x19, +0x9C,0x00,0xFB,0x00,0x3C,0x1C,0xBF,0x00,0xFB,0x00,0x94,0x21,0xDB,0x00,0xFA,0x00, +0xE6,0x24,0xF7,0x00,0xF9,0x00,0xFB,0x24,0x29,0x01,0xFE,0x00,0xE0,0x0D,0x04,0x00, +0xFE,0x00,0xF6,0x10,0x18,0x00,0xFE,0x00,0xC8,0x12,0x30,0x00,0xFD,0x00,0xEB,0x14, +0x4A,0x00,0xFD,0x00,0x74,0x16,0x69,0x00,0xFC,0x00,0xB9,0x1C,0x7E,0x00,0xFC,0x00, +0x68,0x20,0x8E,0x00,0xFB,0x00,0xCE,0x21,0xA6,0x00,0xFB,0x00,0x52,0x23,0xC8,0x00, +0xFA,0x00,0x0A,0x29,0xE2,0x00,0xF9,0x00,0x4D,0x2C,0xFC,0x00,0xFE,0x00,0x85,0x13, +0xF8,0xFF,0xFE,0x00,0xF6,0x12,0x07,0x00,0xFD,0x00,0xC9,0x13,0x24,0x00,0xFD,0x00, +0x6E,0x18,0x3E,0x00,0xFC,0x00,0x47,0x1C,0x4E,0x00,0xFC,0x00,0x83,0x1D,0x5E,0x00, +0xFC,0x00,0xFB,0x1F,0x74,0x00,0xFB,0x00,0xF7,0x25,0x86,0x00,0xFA,0x00,0xB8,0x29, +0x93,0x00,0xFA,0x00,0xA4,0x29,0xAB,0x00,0xF9,0x00,0x13,0x2B,0xCB,0x00,0xF9,0x00, +0x37,0x30,0xE5,0x00,0xFD,0x00,0x0D,0x1F,0xDC,0xFF,0xFD,0x00,0x3D,0x1E,0xE7,0xFF, +0xFD,0x00,0xD0,0x1C,0x02,0x00,0xFC,0x00,0xCD,0x1E,0x1B,0x00,0xFC,0x00,0x4B,0x22, +0x29,0x00,0xFC,0x00,0x4F,0x25,0x33,0x00,0xFB,0x00,0x83,0x27,0x43,0x00,0xFA,0x00, +0xE6,0x2C,0x4F,0x00,0xFA,0x00,0x48,0x30,0x57,0x00,0xFA,0x00,0x0E,0x31,0x62,0x00, +0xF9,0x00,0x76,0x31,0x77,0x00,0xF9,0x00,0x65,0x36,0x87,0x00,0xF8,0x00,0xB3,0x38, +0x94,0x00,0xF8,0x00,0x27,0x37,0xAC,0x00,0x05,0x03,0x03,0x04,0x04,0x00,0x11,0x00, +0xC1,0x09,0xD9,0xFF,0x36,0x01,0x0E,0x00,0x1C,0x00,0xDD,0x03,0x03,0x00,0x40,0x00, +0x14,0x00,0x4C,0x00,0x95,0x03,0x05,0x00,0x07,0x00,0x18,0x00,0xA5,0x00,0x4B,0x06, +0x9B,0xFF,0x03,0x00,0x19,0x00,0xC8,0x00,0x14,0x03,0x3B,0x00,0x00,0x00,0x1A,0x00, +0x16,0x00,0x40,0x05,0xE4,0xFF,0xA2,0x00,0x14,0x00,0x3B,0x00,0x67,0x04,0xF0,0xFF, +0x3B,0x00,0x1A,0x00,0x6F,0x00,0x22,0x04,0xF8,0xFF,0x03,0x00,0x20,0x00,0x1C,0x00, +0x48,0x05,0xDB,0xFF,0x98,0x00,0x16,0x00,0x57,0x00,0x90,0x04,0xEC,0xFF,0x19,0x00, +0x21,0x00,0x95,0x00,0x08,0x04,0xFE,0xFF,0x02,0x00,0x24,0x00,0x23,0x00,0xC4,0x05, +0xCC,0xFF,0xA6,0x00,0x17,0x00,0x62,0x00,0x9C,0x04,0xEC,0xFF,0x17,0x00,0x25,0x00, +0xA0,0x00,0x0E,0x04,0xFB,0xFF,0x02,0x00,0x28,0x00,0x0D,0x01,0x7D,0x04,0xE1,0xFF, +0xFC,0xFF,0x2A,0x00,0x33,0x00,0x30,0x07,0xA2,0xFF,0xD3,0x00,0x18,0x00,0x6F,0x00, +0xAD,0x04,0xED,0xFF,0x23,0x00,0x2B,0x00,0x9C,0x00,0x14,0x03,0x27,0x00,0x03,0x00, +0x2F,0x00,0xE1,0x00,0x53,0x05,0xAB,0xFF,0x02,0x00,0x30,0x00,0x35,0x51,0x00,0x00, +0x35,0x51,0x00,0x00,0x4A,0x51,0x00,0x00,0x4A,0x51,0x00,0x00,0xC8,0x53,0x00,0x00, +0xC8,0x53,0x00,0x00,0xC8,0x53,0x00,0x00,0xD0,0x51,0x00,0x00,0xA0,0x52,0x00,0x00, +0x25,0x52,0x00,0x00,0x09,0x54,0x00,0x00,0x09,0x54,0x00,0x00,0x91,0x55,0x00,0x00, +0x91,0x55,0x00,0x00,0x91,0x55,0x00,0x00,0x91,0x55,0x00,0x00,0x91,0x55,0x00,0x00, +0xB8,0x54,0x00,0x00,0x5C,0x55,0x00,0x00,0x11,0x55,0x00,0x00,0xDF,0x55,0x00,0x00, +0xDF,0x55,0x00,0x00,0x0D,0x56,0x00,0x00,0x35,0x56,0x00,0x00,0x48,0x56,0x00,0x00, +0x85,0x56,0x00,0x00,0x61,0x56,0x00,0x00,0xDA,0x59,0x00,0x00,0xF9,0x59,0x00,0x00, +0x52,0x5A,0x00,0x00,0x80,0x5A,0x00,0x00,0xAC,0x5A,0x00,0x00,0xAC,0x5A,0x00,0x00, +0xBE,0x5A,0x00,0x00,0xAC,0x5A,0x00,0x00,0x68,0x5A,0x00,0x00,0x68,0x5A,0x00,0x00, +0xAC,0x5A,0x00,0x00,0xAC,0x5A,0x00,0x00,0xBE,0x5A,0x00,0x00,0xBE,0x5A,0x00,0x00, +0xBE,0x5A,0x00,0x00,0xA0,0x5A,0x00,0x00,0xA6,0x5A,0x00,0x00,0x0A,0x0B,0x2C,0x1B, +0x09,0x07,0x1C,0x1A,0x25,0x05,0x1D,0x19,0x26,0x00,0x1E,0x18,0x27,0x04,0x1F,0x17, +0x28,0x06,0x20,0x0D,0x29,0x08,0x2B,0x0C,0x2A,0x00,0x00,0x00,0xE0,0x66,0x00,0x00, +0xE0,0x66,0x00,0x00,0x11,0x67,0x00,0x00,0x11,0x67,0x00,0x00,0x43,0x67,0x00,0x00, +0x43,0x67,0x00,0x00,0x43,0x67,0x00,0x00,0x43,0x67,0x00,0x00,0xC2,0x66,0x00,0x00, +0xA4,0x66,0x00,0x00,0xA4,0x67,0x00,0x00,0xA4,0x67,0x00,0x00,0xD7,0x67,0x00,0x00, +0xD7,0x67,0x00,0x00,0x0C,0x68,0x00,0x00,0x0C,0x68,0x00,0x00,0x0C,0x68,0x00,0x00, +0x0C,0x68,0x00,0x00,0x7D,0x67,0x00,0x00,0x6B,0x67,0x00,0x00,0xB2,0x68,0x00,0x00, +0xB2,0x68,0x00,0x00,0x06,0x69,0x00,0x00,0x06,0x69,0x00,0x00,0x79,0x6A,0x00,0x00, +0x79,0x6A,0x00,0x00,0x79,0x6A,0x00,0x00,0x79,0x6A,0x00,0x00,0x61,0x69,0x00,0x00, +0xA7,0x69,0x00,0x00,0xED,0x69,0x00,0x00,0x35,0x6A,0x00,0x00,0x7E,0x77,0x00,0x00, +0x7E,0x77,0x00,0x00,0xB9,0x77,0x00,0x00,0xB9,0x77,0x00,0x00,0xA8,0x78,0x00,0x00, +0xA8,0x78,0x00,0x00,0xA8,0x78,0x00,0x00,0xA8,0x78,0x00,0x00,0xF6,0x77,0x00,0x00, +0x1B,0x78,0x00,0x00,0x4C,0x78,0x00,0x00,0x7C,0x78,0x00,0x00,0xBB,0x82,0x00,0x00, +0xE0,0x82,0x00,0x00,0x40,0x83,0x00,0x00,0xA7,0x83,0x00,0x00,0x38,0x84,0x00,0x00, +0x68,0x84,0x00,0x00,0xFD,0x84,0x00,0x00,0x70,0x84,0x00,0x00,0x04,0x00,0x1D,0x00, +0x2E,0x00,0x50,0x00,0x82,0x00,0xC7,0x00,0x23,0x01,0x9B,0x01,0x32,0x02,0xEE,0x02, +0xD0,0x03,0xDE,0x04,0x19,0x06,0x82,0x07,0x1A,0x09,0xE0,0x0A,0xD0,0x0C,0xE7,0x0E, +0x1F,0x11,0x71,0x13,0xD3,0x15,0x3D,0x18,0xA2,0x1A,0xF9,0x1C,0x34,0x1F,0x47,0x21, +0x28,0x23,0xCB,0x24,0x27,0x26,0x33,0x27,0xEA,0x27,0x46,0x28,0x04,0x00,0x1C,0x00, +0x2B,0x00,0x4B,0x00,0x78,0x00,0xB7,0x00,0x0A,0x01,0x75,0x01,0xFC,0x01,0xA3,0x02, +0x6D,0x03,0x5E,0x04,0x76,0x05,0xB9,0x06,0x26,0x08,0xBE,0x09,0x7D,0x0B,0x61,0x0D, +0x67,0x0F,0x87,0x11,0xBB,0x13,0xFC,0x15,0x3F,0x18,0x7B,0x1A,0xA6,0x1C,0xB6,0x1E, +0x9F,0x20,0x57,0x22,0xD7,0x23,0x14,0x25,0x08,0x26,0xAF,0x26,0x03,0x27,0x05,0x00, +0x08,0x21,0x05,0x00,0x00,0x20,0x00,0x00,0x94,0xBC,0x00,0xC0,0xA4,0xBC,0x00,0xC0, +0xB6,0xBC,0x00,0xC0,0xBA,0xBC,0x00,0xC0,0x2C,0xBC,0x00,0xC0,0x74,0xBC,0x00,0xC0, +0xD4,0xBC,0x00,0xC0,0xF2,0xBC,0x00,0xC0,0xF6,0xBC,0x00,0xC0,0x1C,0xBD,0x00,0xC0, +0xAA,0xBD,0x00,0xC0,0xEC,0xBD,0x00,0xC0,0x4E,0xBB,0x00,0xC0,0x52,0xBB,0x00,0xC0, +0x28,0xBC,0x00,0xC0,0x70,0xBC,0x00,0xC0,0x05,0x00,0x2A,0x00,0x2A,0x00,0x3E,0x00, +0x58,0x00,0x79,0x00,0xA1,0x00,0xD3,0x00,0x0F,0x01,0x56,0x01,0xAA,0x01,0x0C,0x02, +0x7D,0x02,0xFE,0x02,0x91,0x03,0x37,0x04,0xF0,0x04,0xBE,0x05,0xA0,0x06,0x99,0x07, +0xA7,0x08,0xCC,0x09,0x06,0x0B,0x56,0x0C,0xBB,0x0D,0x34,0x0F,0xC0,0x10,0x5D,0x12, +0x0A,0x14,0xC5,0x15,0x8A,0x17,0x59,0x19,0x2D,0x1B,0x05,0x1D,0xDC,0x1E,0xB0,0x20, +0x7D,0x22,0x40,0x24,0xF5,0x25,0x98,0x27,0x27,0x29,0x9E,0x2A,0xF9,0x2B,0x37,0x2D, +0x53,0x2E,0x4B,0x2F,0x1E,0x30,0xC9,0x30,0x4A,0x31,0xA1,0x31,0xCD,0x31,0x04,0x00, +0x2D,0x00,0x6D,0x00,0xE7,0x00,0xAD,0x01,0xD8,0x02,0x81,0x04,0xBE,0x06,0xA0,0x09, +0x30,0x0D,0x6D,0x11,0x47,0x16,0xA3,0x1B,0x56,0x21,0x29,0x27,0xDC,0x2C,0x2A,0x32, +0xCF,0x36,0x8B,0x3A,0x29,0x3D,0x81,0x3E,0x06,0x00,0xF5,0x28,0x03,0x00,0x33,0x33, +0x78,0xBC,0x00,0xC0,0x8E,0xBC,0x00,0xC0,0x20,0xBD,0x00,0xC0,0xAE,0xBD,0x00,0xC0, +0x98,0xBC,0x00,0xC0,0xA8,0xBC,0x00,0xC0,0x7C,0xBC,0x00,0xC0,0xBE,0xBC,0x00,0xC0, +0xD8,0xBC,0x00,0xC0,0xFA,0xBC,0x00,0xC0,0xFE,0xBB,0x00,0xC0,0xB8,0xBD,0x00,0xC0, +0xCC,0xBA,0x00,0xC0,0x0C,0xBB,0x00,0xC0,0x98,0xBB,0x00,0xC0,0x28,0xBD,0x00,0xC0, +0x06,0x00,0x00,0x20,0x03,0x00,0xAA,0x2A,0x00,0x00,0x00,0x20,0x02,0x00,0x45,0x00, +0x5D,0x01,0x1B,0x04,0x31,0x09,0xA2,0x10,0x55,0x19,0x32,0x21,0xE5,0x25,0x01,0x00, +0x10,0x10,0xEF,0x2F,0x00,0x00,0x00,0x20,0x02,0x00,0x49,0x01,0x6C,0x07,0xB1,0x15, +0x60,0x29,0x38,0x38,0x01,0x00,0x00,0x20,0x02,0x00,0xAC,0x00,0xCB,0x03,0x95,0x0B, +0x6B,0x18,0xE0,0x26,0xA6,0x30,0x02,0x00,0xAA,0x2A,0x02,0x00,0x00,0x20,0x03,0x00, +0x4D,0x00,0x51,0x01,0xBD,0x03,0x48,0x08,0x6B,0x0F,0x0D,0x19,0x47,0x24,0x73,0x2F, +0x86,0x38,0x9F,0x3D,0x03,0x00,0x00,0x20,0x03,0x00,0x33,0x00,0xC4,0x00,0x08,0x02, +0x5B,0x04,0x11,0x08,0x55,0x0D,0x0D,0x14,0xCC,0x1B,0xCF,0x23,0x1E,0x2B,0xB5,0x30, +0xBD,0x33,0x04,0x00,0x33,0x33,0x04,0x00,0xAA,0x2A,0x03,0x00,0x1F,0x00,0x5B,0x00, +0xD6,0x00,0xAB,0x01,0xF6,0x02,0xD5,0x04,0x59,0x07,0x87,0x0A,0x52,0x0E,0x96,0x12, +0x1C,0x17,0x9B,0x1B,0xC0,0x1F,0x37,0x23,0xB6,0x25,0x05,0x27,0x04,0x00,0x00,0x20, +0x01,0x00,0x65,0x04,0x5D,0x14,0x3D,0x27,0x05,0x00,0x26,0x00,0x1D,0x00,0x28,0x00, +0x36,0x00,0x47,0x00,0x5A,0x00,0x72,0x00,0x8D,0x00,0xAE,0x00,0xD3,0x00,0xFD,0x00, +0x2D,0x01,0x64,0x01,0xA2,0x01,0xE6,0x01,0x33,0x02,0x87,0x02,0xE5,0x02,0x4B,0x03, +0xBA,0x03,0x33,0x04,0xB6,0x04,0x43,0x05,0xDB,0x05,0x7C,0x06,0x29,0x07,0xDF,0x07, +0xA1,0x08,0x6C,0x09,0x41,0x0A,0x21,0x0B,0x09,0x0C,0xFA,0x0C,0xF4,0x0D,0xF5,0x0E, +0xFE,0x0F,0x0C,0x11,0x20,0x12,0x38,0x13,0x53,0x14,0x71,0x15,0x90,0x16,0xAF,0x17, +0xCD,0x18,0xE8,0x19,0x00,0x1B,0x12,0x1C,0x1E,0x1D,0x23,0x1E,0x1F,0x1F,0x10,0x20, +0xF7,0x20,0xD0,0x21,0x9C,0x22,0x59,0x23,0x07,0x24,0xA3,0x24,0x2E,0x25,0xA7,0x25, +0x0C,0x26,0x5E,0x26,0x9C,0x26,0xC6,0x26,0xDA,0x26,0x05,0x00,0x33,0x33,0x01,0x00, +0x7E,0x01,0x41,0x08,0x4A,0x15,0xF4,0x20,0x04,0x00,0x23,0x00,0x45,0x00,0x84,0x00, +0xE4,0x00,0x6F,0x01,0x2F,0x02,0x2F,0x03,0x76,0x04,0x0F,0x06,0xFD,0x07,0x45,0x0A, +0xE6,0x0C,0xDA,0x0F,0x19,0x13,0x93,0x16,0x37,0x1A,0xEF,0x1D,0xA0,0x21,0x2F,0x25, +0x80,0x28,0x77,0x2B,0xFA,0x2D,0xF2,0x2F,0x4D,0x31,0xFD,0x31,0x05,0x00,0xF5,0x28, +0xB4,0x95,0x00,0x00,0xD0,0x95,0x00,0x00,0xEF,0x95,0x00,0x00,0x0E,0x96,0x00,0x00, +0x1D,0x96,0x00,0x00,0x44,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x2D,0x40,0x5B,0x76, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,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,0x00,0x00,0x01,0x00,0x08,0x00, +0x00,0x00,0x56,0x30,0x31,0x2E,0x30,0x30,0x37,0x2E,0x30,0x34,0x56,0xFF,0xB2,0x89 +}; diff --git a/drivers/input/touchscreen/msg2233/msg22xx_yyyy_update_bin.h b/drivers/input/touchscreen/msg2233/msg22xx_yyyy_update_bin.h new file mode 100755 index 00000000..26c9c95f --- /dev/null +++ b/drivers/input/touchscreen/msg2233/msg22xx_yyyy_update_bin.h @@ -0,0 +1,3106 @@ +u8 msg22xx_yyyy_update_bin[49664]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x1A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x91,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xEF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xE1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xD3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x90,0xC5,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x1C,0x40,0x00,0x1C, +0x60,0x00,0x1C,0x80,0x00,0x1C,0xA0,0x00,0x1C,0xC0,0x00,0x1C,0xE0,0x00,0x1D,0x00, +0x00,0x1D,0x20,0x00,0x1D,0x40,0x00,0x1D,0x60,0x00,0x1D,0x80,0x00,0x1D,0xA0,0x00, +0x1D,0xC0,0x00,0x1D,0xE0,0x00,0x1E,0x00,0x00,0x1E,0x20,0x00,0x1E,0x40,0x00,0x1E, +0x60,0x00,0x1E,0x80,0x00,0x1E,0xA0,0x00,0x1E,0xC0,0x00,0x1E,0xE0,0x00,0x1F,0x00, +0x00,0x1F,0x20,0x00,0x1F,0x40,0x00,0x1F,0x60,0x00,0x1F,0x80,0x00,0x1F,0xA0,0x00, +0x1F,0xC0,0x00,0x1F,0xE0,0x00,0xC0,0x60,0x00,0x01,0xC8,0x63,0x9E,0x34,0x84,0x69, +0x80,0x01,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00,0x90,0x00, +0xFC,0x21,0xFF,0x60,0xEF,0xE1,0x00,0x80,0xFF,0xE1,0x00,0xA0,0x0F,0xE1,0x08,0xC3, +0xE0,0x02,0x0F,0x0F,0xE1,0x00,0xC3,0xE0,0x04,0x0F,0x0F,0xE1,0x04,0xC3,0xE0,0x03, +0x0F,0xEF,0xE1,0x00,0x84,0xC3,0xE0,0x05,0x0F,0xEF,0xE1,0x00,0x88,0xC3,0xE0,0x05, +0x1F,0xEF,0xE1,0x00,0x8C,0xE4,0x01,0x37,0xA1,0x90,0x00,0x90,0x00,0x90,0x00,0x90, +0x00,0x90,0x00,0x90,0x00,0x90,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x30,0x44,0x0B, +0x17,0x01,0x98,0x60,0x56,0xF8,0x01,0x4F,0x18,0x79,0x22,0xE0,0x14,0x98,0x62,0x23, +0x00,0x18,0x58,0x77,0x01,0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0C,0x81,0x04,0x0D, +0x21,0x0C,0x5D,0x43,0x00,0xE7,0xFF,0xFF,0xA4,0x0C,0x81,0x06,0x5C,0x63,0x00,0x20, +0x60,0x66,0x9B,0x00,0x21,0x40,0x30,0x21,0x44,0x24,0x5D,0x40,0x41,0x4B,0x01,0x01, +0xD0,0x81,0x04,0x66,0xE4,0x00,0x01,0x17,0xE7,0xFF,0xFF,0x5E,0x5C,0x63,0x00,0x20, +0x64,0x4E,0xD1,0x40,0x05,0xD2,0xD1,0x41,0x05,0xB2,0xD1,0x42,0x05,0x96,0xE4,0x00, +0x00,0xE3,0xE7,0xFF,0xFF,0x2A,0x5C,0x63,0x00,0xD0,0x62,0x05,0x1E,0x9B,0x01,0x21, +0x40,0x24,0x5D,0x40,0x21,0x4B,0x01,0x01,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00, +0xCB,0x57,0x23,0x78,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01, +0xCB,0x57,0x23,0x6C,0x0B,0x7A,0x01,0xC7,0x7B,0x8F,0xFF,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xD4,0x0B,0x7A,0x01,0x47,0x79,0xDD,0x5F,0x7B,0x04,0x0F,0x7A,0x01,0xCB,0x57, +0x3C,0xE0,0x0B,0x7A,0x01,0xC7,0x7B,0x7F,0xFF,0x0F,0x7A,0x01,0xCA,0xF7,0x3C,0xEC, +0x0B,0x57,0x01,0x47,0x39,0xD5,0x5F,0x39,0x04,0x0F,0x37,0x01,0x23,0x01,0x00,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x3D,0xE8,0x0B,0x38,0x01,0xFF,0x20,0x11,0x11,0x0F,0x38, +0x01,0xCB,0x17,0x3D,0xEC,0x0B,0x38,0x01,0xFF,0x20,0x22,0x22,0x0F,0x38,0x01,0xCB, +0x17,0x3D,0xF0,0x0B,0x38,0x01,0xFF,0x20,0x33,0x33,0x0F,0x38,0x01,0xCA,0xF7,0x78, +0xC0,0xFF,0x00,0xAA,0x55,0x0F,0x17,0x01,0xE4,0x00,0x00,0x01,0x0D,0x41,0x0A,0x0D, +0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x03,0xF0,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x03,0xE8,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x03,0xEC,0xC2, +0xE0,0x10,0x01,0xEC,0xD7,0x04,0x04,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x03,0xFC,0xC2, +0xE0,0x10,0x01,0x0F,0x01,0x02,0xED,0x17,0x04,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17, +0x04,0x10,0xC2,0xE0,0x10,0x01,0x0F,0x01,0x06,0xEF,0x17,0x03,0xD4,0xC2,0xE0,0x10, +0x01,0x0F,0x01,0x0A,0xEF,0x17,0x03,0xF4,0x85,0x29,0x5C,0x84,0x00,0xC2,0xE0,0x10, +0x01,0x4C,0x84,0x10,0xFE,0xF7,0x04,0x08,0x8E,0xE4,0x0C,0x77,0x00,0x85,0x29,0x5C, +0x63,0x00,0x9B,0x00,0x24,0x68,0x25,0x1F,0x03,0xFE,0x5F,0x18,0x00,0xC2,0xE0,0x10, +0x01,0xF3,0x57,0x0B,0x7E,0x1E,0xE3,0x01,0x1F,0x9A,0xFF,0x5F,0x3C,0x00,0xD7,0x97, +0x00,0x50,0x1F,0x23,0x02,0x5F,0x39,0x00,0xC2,0xEF,0xFF,0xE1,0xCA,0xF7,0xFF,0xFF, +0xE4,0x00,0x00,0x2F,0x4F,0x78,0x10,0x9F,0x01,0x8F,0x64,0x5F,0x18,0x00,0x0F,0x7B, +0x02,0x5E,0xFB,0x15,0x4A,0xF7,0xD8,0xD7,0x19,0xFF,0x69,0x4F,0x03,0x10,0xC3,0x20, +0x10,0x01,0x8F,0x04,0xEF,0x39,0x03,0xF6,0x0F,0x18,0x02,0xD7,0x38,0x01,0x41,0xC3, +0x20,0x10,0x01,0xEF,0x79,0x03,0xF2,0xC3,0x20,0x10,0x01,0xEF,0xB9,0x03,0xEA,0xC3, +0x20,0x10,0x01,0xEF,0xD9,0x03,0xEE,0xC3,0x20,0x10,0x01,0xEF,0x39,0x04,0x06,0xE4, +0x00,0x00,0x49,0xC3,0x20,0x10,0x01,0xEF,0x79,0x03,0xFE,0xC3,0x20,0x10,0x01,0xEF, +0xB9,0x04,0x02,0xC3,0x20,0x10,0x01,0xEF,0xD9,0x04,0x12,0xC3,0x20,0x10,0x01,0xEF, +0x39,0x03,0xD6,0x20,0x60,0xDE,0x0F,0x44,0x02,0x0F,0x84,0x06,0xCF,0x5A,0x00,0x32, +0x40,0xE7,0xE3,0xD7,0x47,0x05,0xDC,0x42,0xF7,0x2D,0x40,0xA5,0xCB,0x43,0x77,0xDB, +0x43,0x3B,0x2C,0xCC,0xC6,0x00,0x0A,0x9B,0x4A,0x8C,0xD9,0x98,0x61,0x40,0xC6,0xD0, +0xD7,0x06,0x04,0xF4,0x98,0x60,0xE4,0x00,0x01,0x31,0x20,0x64,0x6A,0x0F,0x44,0x02, +0x0F,0x64,0x06,0xCF,0x5A,0x00,0x32,0x40,0xE7,0xDB,0x98,0x60,0xD7,0x47,0x04,0x14, +0xE4,0x00,0x00,0x55,0x1C,0xFA,0xFE,0xD4,0x67,0x01,0x9E,0x4C,0x63,0x10,0x9F,0x5F, +0x4F,0x5A,0x10,0x8F,0x44,0x8C,0x83,0x0F,0x5A,0x02,0x0F,0x64,0x02,0xCF,0x5A,0x00, +0x32,0x41,0x08,0xDB,0x98,0x60,0xD7,0x48,0x02,0xC4,0x42,0xF7,0x2D,0x40,0xA5,0xCB, +0x43,0xB7,0xEB,0x43,0x3D,0x2C,0xE7,0xFF,0xFF,0x3B,0xD4,0x7C,0x01,0x3E,0x9F,0x5F, +0x4C,0xE7,0x10,0x4F,0x5A,0x10,0x98,0x60,0x8F,0x44,0x8C,0x87,0x0F,0x5A,0x02,0x0F, +0x84,0x02,0xCF,0x5A,0x00,0x32,0x41,0x08,0xE3,0xD7,0x48,0x01,0x2C,0xE7,0xFF,0xFE, +0xD5,0x42,0xF7,0x2D,0xCC,0xC6,0x00,0x0A,0x43,0xD7,0xF3,0x40,0xA5,0xCB,0x9B,0x4A, +0x43,0x3E,0x2C,0x8C,0xD9,0x40,0xC6,0xD0,0xD7,0x06,0xFB,0x60,0x98,0x61,0x85,0x29, +0xC2,0xE0,0x10,0x01,0x9B,0x21,0xEA,0xF7,0x01,0x51,0x9E,0xFF,0x5E,0xF7,0x04,0x26, +0xE4,0x43,0xC3,0x18,0x00,0x21,0xFF,0x18,0xB6,0xF8,0x8E,0xF8,0x13,0x37,0x00,0xC3, +0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x0B,0x7A,0xFE,0xF7,0x09,0x6C,0xD0, +0x60,0x05,0x16,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43,0xDE, +0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B,0x40, +0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7,0x08, +0xBD,0x01,0x40,0xB9,0x2B,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08,0x5F, +0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x01,0x43,0xB9,0xEB,0x0F,0xBC,0x01,0xE4,0x00,0x00, +0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF,0xAC, +0x0B,0x37,0x02,0x0B,0x57,0x00,0x8F,0x59,0xC3,0x20,0x10,0x01,0xFF,0x39,0x0A,0x1C, +0x0F,0x59,0x00,0x13,0x58,0x04,0x1F,0xBA,0xFF,0x4F,0xBD,0x10,0x43,0xDD,0xCC,0x8F, +0xB7,0x4F,0x9A,0x08,0x09,0x1D,0x00,0x1F,0x7C,0xFF,0x4F,0xBB,0x08,0x8F,0xB7,0x0B, +0xBD,0x00,0x8F,0xA8,0x0F,0xBE,0x00,0x13,0x18,0x01,0x27,0x05,0xAF,0xE4,0x00,0x01, +0x45,0x20,0x66,0xFE,0x13,0x58,0x04,0x13,0xD8,0x01,0x1F,0x7A,0xFF,0x9F,0xC1,0x43, +0xDE,0xD3,0x4F,0x5A,0x08,0xCD,0x1B,0x00,0x03,0x5C,0x9A,0x00,0x4F,0x7B,0x08,0x9B, +0x40,0x5C,0x7B,0x00,0xE4,0x00,0x00,0x73,0x43,0x9A,0xDC,0x4F,0xBC,0x08,0x8F,0xB7, +0x08,0xBD,0x00,0x40,0xA5,0xC8,0x0C,0xBD,0x01,0x9F,0x81,0x8F,0x63,0x4F,0x9C,0x08, +0x5F,0x7B,0x00,0x8F,0x97,0x0B,0xBC,0x00,0x43,0xBD,0xC8,0x0F,0xBC,0x01,0xE4,0x00, +0x00,0x0D,0x9B,0x60,0xD5,0x1B,0xFE,0xA4,0x8F,0x44,0x5F,0x5A,0x00,0xD7,0xDA,0xFF, +0xAC,0xE7,0xFF,0xFE,0xBF,0x4F,0x1A,0x10,0x9F,0x81,0x43,0x58,0xCC,0x43,0xB8,0xBC, +0x4F,0x9C,0x08,0x0B,0xBD,0x00,0x8F,0x97,0x0B,0x9C,0x00,0x8F,0x9D,0x0F,0x9A,0x00, +0x4F,0x7B,0x10,0x1F,0x58,0xFE,0x8F,0x3B,0x4F,0x5A,0x08,0x9F,0x1F,0x8F,0x57,0x4F, +0x18,0x08,0x0B,0x5A,0x00,0x8E,0xF8,0x0A,0xF7,0x00,0x8E,0xFA,0x0E,0xF9,0x00,0x85, +0x29,0x5C,0xE7,0x00,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x0B,0x7E,0x42,0xE7,0xBB,0x5E, +0xF7,0x00,0x9B,0x00,0x8C,0xB7,0x8C,0xD7,0xC3,0x80,0x10,0x01,0xC3,0x40,0x10,0x01, +0x5C,0xC6,0x00,0x5C,0xA5,0x00,0x8B,0x38,0x9A,0xE0,0xFF,0x9C,0x0A,0x1C,0xFF,0x5A, +0x09,0x6C,0xE4,0x00,0x00,0x49,0x4F,0x65,0x10,0x43,0xBB,0xE4,0x0F,0xBD,0x02,0x9C, +0xA1,0x8E,0xFD,0x5C,0xA5,0x00,0x8B,0xBB,0x8F,0x7A,0x8F,0xBA,0x0B,0x7B,0x00,0x0B, +0xBD,0x02,0x8F,0x1B,0x8F,0x3D,0xD4,0xA6,0xFF,0x01,0x26,0xE0,0xE8,0x27,0x20,0xDC, +0x27,0x00,0xD0,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x04,0x08,0x4C,0xE7,0x10,0xCF,0x18, +0xFF,0xF6,0x8C,0xFA,0x0F,0x47,0x02,0x43,0x3A,0xCB,0x9F,0x56,0x8F,0x19,0x43,0x58, +0xD0,0xCF,0x5A,0x07,0xFF,0x43,0x5A,0xB8,0x0F,0x43,0x01,0x0E,0xE4,0x00,0x98,0x61, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x85,0x29,0x9A,0xE3,0x9B,0x01,0xE4,0x00,0x00,0x11, +0x8F,0x17,0x9E,0xE2,0xD7,0x03,0xFF,0xE1,0x4C,0x77,0x09,0x9C,0x7F,0x85,0x29,0xFF, +0x00,0x7F,0xFF,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x03,0xD8,0x0F,0x17,0x01,0x0F,0x17, +0x03,0x0F,0x17,0x05,0x0F,0x17,0x07,0x0F,0x17,0x09,0x0F,0x17,0x0B,0x85,0x29,0xC3, +0x00,0x10,0x01,0xFE,0xF8,0x03,0xD8,0xC3,0x00,0x10,0x01,0x0B,0x37,0x08,0xFF,0x18, +0x0B,0xF0,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x05,0x0F,0x37,0x09,0x0B, +0x37,0x07,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x09,0x0B,0x38,0x19,0x0F, +0x37,0x0B,0x0B,0x37,0x04,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0x41,0x0B,0x37,0x01,0x0F, +0x37,0x05,0x0B,0x37,0x03,0xE4,0x00,0x00,0x1B,0x0B,0x38,0x17,0x0F,0x37,0x05,0x0B, +0x38,0x19,0x0F,0x37,0x07,0x0B,0x38,0x17,0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17, +0x03,0x85,0x29,0x1C,0x21,0xD8,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x24,0x0D,0x41,0x20, +0x0D,0x61,0x1C,0xFD,0x57,0x03,0xD8,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x0D,0xC1,0x10, +0x09,0xAA,0x07,0x0B,0x0A,0x03,0x43,0x18,0x6D,0x5F,0x18,0x06,0x0F,0x01,0x0B,0x43, +0x18,0xC3,0xE9,0x97,0x03,0xD9,0x09,0xCA,0x05,0x41,0x8C,0x75,0x5D,0x8C,0x06,0x40, +0x6C,0x63,0x8C,0x78,0xE7,0xFF,0xFE,0x48,0x0A,0xEA,0x09,0x41,0xCE,0xBD,0x0A,0xEA, +0x0B,0x42,0xED,0xBD,0x5E,0xF7,0x06,0x0E,0xE1,0x0F,0x42,0xF7,0xBB,0x5D,0x63,0x06, +0x5D,0x4E,0x06,0x40,0x6A,0x53,0x8C,0x77,0xE7,0xFF,0xFE,0x00,0x5E,0xE3,0x06,0x98, +0x61,0x21,0x60,0xAC,0x22,0xE0,0xA0,0x43,0x0B,0xB8,0xD3,0x05,0x01,0x14,0x41,0x4C, +0x53,0x0B,0x01,0x0E,0x09,0x81,0x0A,0x41,0x6B,0xBB,0x43,0x0C,0xC3,0x8D,0x58,0xCD, +0x4A,0x00,0x64,0x42,0xEA,0x58,0x5E,0xE8,0xB1,0x48,0x61,0x01,0x0D,0xC1,0x12,0x0D, +0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C,0x21, +0x28,0x85,0x29,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0x0D,0x61,0x0C, +0x0D,0x81,0x08,0x0D,0xC1,0x00,0xF1,0x97,0x08,0xD2,0xC1,0x40,0x10,0x01,0x1D,0x6C, +0xFF,0x0D,0x21,0x14,0x0D,0xA1,0x04,0x5D,0xC3,0x00,0x5D,0x6B,0x00,0xFD,0x4A,0x0B, +0xF0,0x4E,0xEE,0x5D,0x56,0xF7,0x01,0x22,0xE0,0xD4,0x8A,0xEB,0xE4,0x00,0x00,0x43, +0xCC,0x77,0x00,0x30,0x1D,0xB7,0x01,0x8C,0x6A,0xCC,0x8D,0x00,0x30,0x9C,0x64,0x8C, +0x8A,0x50,0xA0,0x30,0x9C,0x84,0xE4,0x00,0x50,0x46,0x5E,0xED,0x00,0xD5,0x97,0xFF, +0x1D,0x12,0xEA,0x00,0x22,0xE0,0x20,0x9E,0xFF,0x1A,0xEA,0x00,0x21,0x60,0x30,0x9D, +0x7F,0x5D,0x6B,0x00,0xE7,0xFF,0xFF,0x7B,0x12,0xEA,0x00,0x22,0xE0,0x52,0xC2,0xE0, +0x10,0x01,0x9B,0x37,0xEB,0x17,0x08,0xE7,0x47,0x18,0xCC,0xEF,0x17,0x08,0xE7,0x0D, +0xC1,0x02,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21, +0x16,0x1C,0x21,0x18,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xEB,0x37, +0x01,0x50,0xFF,0x18,0x04,0x1C,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x7A,0x23,0x24, +0xA6,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F,0x4F,0x57,0x08,0x1F, +0x77,0xFF,0x8F,0x58,0x4F,0x7B,0x10,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6, +0xF9,0xFF,0x68,0xE4,0x00,0x00,0x9D,0x23,0x28,0x38,0x13,0x37,0x04,0x9A,0xE0,0x9F, +0x21,0xE4,0x00,0x00,0x79,0x13,0x37,0x04,0x9A,0xE0,0x9F,0x21,0xE4,0x00,0x00,0x2F, +0x4F,0x57,0x08,0xCF,0x77,0x00,0x06,0x8F,0x58,0x9F,0x79,0x9E,0xE1,0x0F,0x7A,0x01, +0x5E,0xF7,0x00,0xD6,0xF9,0xFF,0x68,0xE4,0x00,0x00,0x35,0x4F,0x57,0x08,0x4F,0x77, +0x08,0x8F,0x58,0x9F,0x7F,0x9E,0xE1,0x0F,0x7A,0x01,0x5E,0xF7,0x00,0xD6,0xF9,0xFF, +0x70,0x85,0x29,0x9C,0x30,0x5C,0xC6,0x00,0x0D,0x61,0x08,0x0D,0x81,0x04,0x0D,0xA1, +0x00,0x0D,0x41,0x0C,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0x7A,0x13,0xD8,0x04,0x40, +0xC6,0xF3,0x5E,0xE6,0x00,0x5F,0xA3,0x06,0x8C,0x97,0x8C,0xB7,0x5F,0x7D,0x04,0x0A, +0xF8,0x0B,0x11,0x58,0x0C,0x40,0xFB,0xBC,0x41,0x9B,0xBD,0xC1,0xA0,0x10,0x01,0xC3, +0x00,0x10,0x01,0x5C,0xA5,0x00,0x4D,0x77,0x08,0x5C,0xE7,0x04,0x5D,0x8C,0x04,0x5C, +0x84,0x00,0xFD,0xAD,0x04,0x1C,0xFF,0x18,0x09,0x6C,0x53,0x20,0x64,0xE4,0x00,0x01, +0x21,0x43,0x44,0x35,0x9F,0x41,0x4F,0x5A,0x08,0x8F,0x4D,0x09,0x1A,0x00,0x41,0x08, +0xBB,0x41,0x08,0x50,0x5F,0x88,0x04,0x43,0x5C,0xDD,0x5F,0x5A,0x06,0x4C,0x7A,0xFA, +0x47,0x43,0xD6,0x43,0x5A,0x1D,0xD6,0xFA,0x03,0x14,0xD5,0x7A,0x02,0x70,0x5D,0x08, +0x06,0xD5,0x1D,0x00,0x58,0x43,0x9C,0x3D,0xE4,0x00,0x00,0x0F,0x43,0x8C,0xE5,0x5F, +0x9C,0x06,0x4F,0x44,0x10,0x43,0x97,0xE5,0x8F,0x58,0xCF,0x9C,0x00,0x64,0x09,0x1A, +0x00,0x43,0x9C,0xB8,0xC7,0x9C,0xFF,0xFF,0x41,0x1C,0x43,0x41,0x08,0xC8,0x0D,0x1A, +0x01,0x4F,0x44,0x10,0x9F,0x42,0x8F,0x58,0x09,0x1A,0x00,0x43,0x9C,0x43,0x43,0x9C, +0xC8,0x0F,0x9A,0x01,0xE4,0x00,0x00,0x29,0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x01, +0x4F,0x44,0x10,0x8F,0x58,0x0C,0x1A,0x03,0x9C,0x81,0x5C,0x84,0x00,0xD4,0x85,0xFB, +0xA0,0xC2,0xE0,0x10,0x01,0x0D,0xA1,0x02,0xF0,0x77,0x0B,0x7B,0x0D,0x81,0x06,0x0D, +0x61,0x0A,0x0D,0x41,0x0E,0x40,0x7E,0x1B,0x1C,0x21,0x10,0xE4,0x00,0xA5,0x63,0x5C, +0x63,0x00,0x5C,0x84,0x00,0xC2,0xE0,0x10,0x01,0x43,0x64,0x1D,0xF2,0xF7,0x0B,0x7E, +0x9F,0x61,0x40,0xA5,0xBB,0x5F,0x7B,0x00,0x5C,0xA5,0x00,0x20,0xE4,0x3E,0xC2,0xE0, +0x10,0x01,0xFE,0xF7,0x0D,0x30,0xE4,0x00,0x00,0x19,0xC2,0xE0,0x10,0x01,0xFE,0xF7, +0x09,0x6C,0x43,0x23,0x2C,0x9B,0x00,0x4F,0x39,0x10,0x9F,0x22,0x8F,0x37,0xC2,0xEF, +0xFF,0xE1,0xCA,0xF7,0xFF,0xFF,0xE4,0x00,0x00,0x3D,0x0B,0x99,0xFE,0x0B,0x59,0x00, +0x9F,0x24,0x8F,0x5C,0x4F,0x98,0x10,0x5E,0xFA,0x15,0x8F,0x86,0x4A,0xF7,0xD0,0x0F, +0x5C,0x00,0x9F,0x01,0x5F,0x58,0x00,0xD7,0x7A,0xFF,0x1D,0x9B,0x00,0xE4,0x00,0x00, +0x29,0x0F,0x26,0x02,0x9F,0x01,0x43,0x39,0xBD,0x5F,0x18,0x00,0x0F,0x26,0x00,0x9C, +0xC4,0xD7,0x78,0xFF,0x85,0x85,0x29,0x1C,0x21,0x88,0x0D,0x41,0x70,0x0D,0x61,0x6C, +0x5D,0x44,0x00,0x0D,0x81,0x68,0x5C,0x85,0x00,0x0D,0xA1,0x64,0x88,0xA6,0x41,0xA4, +0x55,0x0D,0x21,0x74,0x89,0x83,0x88,0xC1,0x88,0x6A,0xE7,0xFF,0xFE,0xAA,0xC2,0xE0, +0x10,0x01,0x9D,0xA1,0xEB,0x57,0x01,0x50,0x9B,0x20,0x5D,0xAD,0x00,0x8B,0x19,0x9A, +0xE0,0x89,0x61,0xE4,0x00,0x00,0x5B,0x4F,0x79,0x10,0x43,0x99,0x54,0x8F,0x6B,0x0F, +0x7B,0x02,0x8E,0xFB,0x23,0x44,0x54,0x23,0x48,0x36,0xCF,0x9C,0x00,0x06,0x9F,0x9F, +0xE4,0x00,0x00,0x13,0x4F,0x9C,0x08,0x9F,0x81,0x43,0x7C,0xDB,0x9F,0x21,0x8F,0x1B, +0x5F,0x79,0x00,0xD5,0xBB,0xFE,0xA5,0x26,0xE1,0x34,0xC3,0x20,0x10,0x01,0xEB,0x39, +0x0B,0x85,0x43,0x18,0xCB,0x23,0x44,0x32,0x4F,0x37,0x0A,0x8F,0x19,0xE4,0x00,0x00, +0x35,0x23,0x48,0x46,0xCF,0x37,0x00,0x03,0xCE,0xF7,0x00,0x06,0x8F,0x19,0xE4,0x00, +0x00,0x13,0x8F,0x17,0x4E,0xF7,0x08,0x42,0xF8,0xB8,0xC2,0xE0,0xFF,0xE8,0xCB,0x00, +0x07,0xFF,0x98,0x61,0x4A,0xF7,0xC0,0x5E,0xFF,0xF9,0x4A,0xF7,0x00,0x0E,0xEC,0x01, +0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1,0x66,0x0D,0x81,0x6A,0x0D,0x61,0x6E,0x0D, +0x41,0x72,0x0D,0x21,0x76,0x1C,0x21,0x78,0x85,0x29,0xFC,0x21,0xFF,0x78,0xED,0x41, +0x00,0x80,0x0D,0x81,0x78,0x0D,0xA1,0x74,0x0D,0xC1,0x70,0x0D,0xE1,0x6C,0x0E,0x01, +0x68,0x0E,0xC1,0x64,0xED,0x21,0x00,0x84,0x0D,0x61,0x7C,0xC1,0x40,0x10,0x01,0xFD, +0x4A,0x0B,0x7A,0x11,0x6A,0x04,0x4E,0xEB,0x08,0x9E,0xE8,0xC6,0xF7,0x03,0xF8,0xFE, +0xC1,0x00,0x88,0x5D,0xC4,0x00,0x5D,0xA5,0x00,0x8A,0x03,0x5C,0xA6,0x00,0x89,0xE1, +0x41,0x65,0x5B,0x40,0x21,0xBD,0x88,0x6E,0x88,0x8D,0xFC,0xD6,0xFF,0x78,0xE7,0xFF, +0xFC,0xA2,0xC3,0x40,0x10,0x01,0x89,0x81,0x5D,0x6B,0x00,0x13,0x2A,0x04,0x9A,0xE0, +0xFF,0x5A,0x04,0x1C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08,0x9E,0xE1,0x43,0x6C,0xC4, +0x8F,0x1A,0x0B,0x18,0x03,0x0F,0x1B,0x01,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x6D,0x43, +0x4B,0x74,0x8D,0xAB,0x5F,0x5A,0x00,0x5D,0xAD,0x00,0x9A,0xE0,0x1F,0x2D,0x01,0x43, +0x39,0xD5,0x5F,0x39,0x00,0xE4,0x00,0x00,0x33,0x4F,0x77,0x10,0xFF,0x96,0xFF,0x78, +0x8F,0x7C,0x0F,0x7B,0x02,0x27,0x60,0x4A,0xD5,0xB8,0x03,0x19,0x9E,0xE1,0x5F,0x17, +0x00,0xD7,0x38,0xFF,0x45,0x8B,0x1A,0x1F,0x36,0xD8,0x1F,0x76,0xD8,0x4E,0xF8,0x10, +0x8E,0xF9,0x0F,0x37,0xA2,0x1E,0xF8,0x01,0x43,0x39,0xCB,0x4E,0xF7,0x10,0x8E,0xFB, +0x0E,0xF7,0xA2,0x42,0xF7,0xBB,0x5F,0x37,0x15,0x4B,0x77,0xC8,0x27,0x60,0xBC,0x8F, +0x1A,0x0B,0x6A,0x0B,0x41,0x78,0x5D,0x13,0x4A,0x0C,0x4D,0x6B,0x08,0x98,0x61,0x8D, +0x8B,0x0B,0x0C,0x00,0x43,0x18,0xDB,0x43,0x77,0xDB,0x43,0x18,0xD0,0x8E,0xF9,0x42, +0xFB,0xB8,0x8E,0xF8,0x0E,0xF0,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x88,0x2F,0x0E, +0xC1,0x66,0x0E,0x01,0x6A,0x0D,0xE1,0x6E,0x0D,0xC1,0x72,0x0D,0xA1,0x76,0x0D,0x81, +0x7A,0x0D,0x61,0x7E,0xED,0x41,0x00,0x82,0xED,0x21,0x00,0x86,0xFC,0x21,0x00,0x88, +0x85,0x29,0x1C,0x21,0xB8,0x0D,0x41,0x40,0xC1,0x40,0x10,0x01,0x0D,0x61,0x3C,0x0D, +0x81,0x38,0x0D,0xC1,0x30,0x0E,0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0E,0xA1, +0x14,0x0E,0xC1,0x10,0x0D,0x21,0x44,0x0D,0xA1,0x34,0x0D,0xE1,0x2C,0x0E,0x01,0x28, +0x0E,0x21,0x24,0x5E,0x63,0x00,0x5E,0x44,0x00,0xC1,0xC0,0x10,0x01,0xF0,0x8A,0x0B, +0x7A,0xFD,0xCE,0x0C,0xBC,0x98,0xA0,0x88,0x6E,0x99,0x80,0x8A,0xCA,0xE4,0x00,0xA0, +0x0A,0xC1,0x40,0x10,0x01,0x89,0x6C,0xC2,0xA0,0x10,0x01,0x9A,0x81,0xFD,0x4A,0x0B, +0xF0,0xE4,0x00,0x01,0x19,0xCC,0x6B,0x00,0x30,0xEA,0xF5,0x08,0xA3,0x41,0xA3,0x54, +0x56,0xF7,0x02,0x12,0x2D,0x04,0x12,0x0D,0x05,0x11,0xED,0x07,0x22,0xE1,0x0C,0x1C, +0x61,0x04,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0xDA,0x20,0x61, +0x14,0x1C,0x61,0x06,0x88,0x91,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFC,0x5C, +0x20,0x60,0xCC,0x0B,0x01,0x04,0xCF,0x18,0x00,0x07,0x0A,0xE1,0x06,0xCE,0xF7,0x00, +0x03,0x8E,0xF8,0x9B,0x0A,0x42,0xF7,0xC0,0x0E,0xED,0x17,0xE4,0x00,0x00,0x43,0x8C, +0x6A,0x88,0x91,0x1C,0x63,0x16,0x88,0xB0,0x88,0xCF,0x98,0xE0,0xE7,0xFF,0xFA,0x56, +0x20,0x60,0x32,0x4E,0xF4,0x5C,0x45,0x8C,0xBD,0x5D,0x8C,0x00,0x88,0x6E,0xF0,0x96, +0x0B,0x7A,0x98,0xA1,0x9D,0x61,0xE4,0x00,0x9E,0xD8,0x5D,0x6B,0x00,0x12,0xEA,0x00, +0xD6,0xEB,0xFB,0xAD,0x88,0x6C,0xE7,0xFF,0xF4,0x7A,0x12,0xEA,0x00,0x22,0xE0,0x6C, +0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x8F,0x56,0xF7,0x40,0x22,0xE0,0x34,0xC2,0xE0, +0x10,0x01,0xEE,0xF7,0x03,0xE6,0x86,0xE8,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xF0,0x97, +0x0B,0x7A,0x98,0xA1,0xE4,0x00,0x9E,0x5C,0xC2,0xE0,0x10,0x01,0x99,0x80,0xEA,0xF7, +0x08,0x8F,0x89,0x6C,0x56,0xF7,0x80,0x99,0xA1,0x22,0xE0,0xFC,0xC2,0xE0,0x10,0x01, +0xEE,0xF7,0x03,0xFA,0x86,0xE8,0xE4,0x00,0x00,0x7F,0xCE,0xEB,0x00,0x30,0x40,0x6A, +0xBC,0x8A,0xE3,0x88,0x83,0x10,0xB7,0x04,0x1C,0x63,0x18,0x9C,0x8C,0x10,0xD7,0x05, +0x10,0xF7,0x07,0xE7,0xFF,0xEF,0xDC,0x20,0x60,0x32,0x4E,0xED,0x5C,0x45,0x8C,0xBD, +0x5D,0x8C,0x00,0x9D,0x61,0x5D,0x6B,0x00,0x12,0xEA,0x00,0xD6,0xEB,0xFE,0x7D,0x88, +0x6C,0xE7,0xFF,0xF3,0x64,0x22,0x61,0x5C,0x22,0x40,0xFE,0xE4,0x00,0x00,0xA3,0xCD, +0x6C,0x00,0x30,0x8D,0x6A,0x0A,0xEB,0x16,0x0E,0xE1,0x08,0x0A,0xEB,0x18,0x1C,0x61, +0x08,0x0E,0xE1,0x0C,0x1C,0x81,0x0C,0xEE,0xED,0x03,0xD2,0x0C,0xAB,0x0E,0x88,0xCE, +0x86,0xE8,0x0E,0xE1,0x0A,0x9D,0x81,0x0E,0xEB,0x17,0x5D,0x8C,0x00,0x0E,0xE1,0x0E, +0x0E,0xEB,0x19,0xE4,0x00,0x00,0x25,0xC1,0xC0,0x10,0x01,0x99,0x80,0xC1,0xA0,0x10, +0x01,0xFD,0xCE,0x01,0x3C,0x12,0xEA,0x00,0xD6,0xEC,0xFD,0xBD,0xC2,0xE0,0x10,0x01, +0x13,0x6A,0x00,0xEB,0x97,0x08,0xA3,0x9B,0x20,0xC2,0xE0,0x10,0x01,0x57,0x9C,0x01, +0xFE,0xF7,0x0C,0x08,0xCB,0xA0,0x07,0xFF,0xE4,0x00,0x00,0x89,0x0B,0x57,0x01,0x13, +0xD7,0xEF,0x5F,0x1A,0x06,0x47,0x18,0xC7,0x4F,0x18,0xFA,0x47,0x1A,0xC4,0x5F,0x58, +0x06,0xC3,0x40,0xFF,0xE8,0x20,0x00,0x1D,0xFF,0x00,0x07,0xFF,0x0F,0x17,0x01,0x5F, +0x58,0x06,0x23,0x80,0x48,0xCF,0x1A,0x03,0xFF,0x4F,0x5E,0x50,0x43,0x18,0xE8,0x8F, +0x1A,0x0F,0x17,0x01,0x9F,0x21,0x1E,0xF7,0x30,0x5F,0x39,0x00,0xD7,0x3B,0xFE,0x06, +0x0E,0xC1,0x12,0x0E,0xA1,0x16,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E, +0x21,0x26,0x0E,0x01,0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81, +0x3A,0x0D,0x61,0x3E,0x0D,0x41,0x42,0x0D,0x21,0x46,0x1C,0x21,0x48,0x85,0x29,0x1C, +0x21,0xC8,0xC2,0xE0,0x10,0x01,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0E,0x61,0x0C,0x0E, +0xC1,0x00,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0xC1,0x20,0x0D,0xE1, +0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x81,0x08,0x0E,0xA1,0x04, +0xC1,0x80,0x10,0x01,0xF3,0x57,0x08,0xD2,0xFD,0x8C,0x0B,0xF0,0xC2,0xE0,0x10,0x01, +0x1E,0xC1,0x38,0x89,0xA3,0x8A,0x61,0x18,0x0C,0x00,0xFE,0xF7,0x0B,0xF8,0x9B,0x00, +0x9B,0x3F,0xE4,0x00,0x00,0x2B,0x0C,0x17,0x00,0x1B,0x37,0xFE,0x1B,0x37,0xFF,0x9F, +0x01,0x1E,0xF7,0x30,0x5F,0x18,0x00,0xD7,0x1A,0xFF,0x7E,0xC1,0xE0,0x10,0x01,0xFD, +0xEF,0x0B,0x7A,0x12,0xEF,0x04,0x10,0x6F,0x01,0x40,0x63,0xBB,0xE4,0x00,0x9A,0x60, +0x13,0x2F,0x04,0x4E,0xF9,0x10,0x9E,0xEA,0xC6,0xF7,0x07,0xF8,0xC3,0x60,0x10,0x01, +0x40,0x21,0xBD,0x0A,0x0D,0x18,0x89,0x61,0x9B,0x00,0xCA,0xE0,0x20,0x00,0xFF,0x7B, +0x0A,0x1C,0xE4,0x00,0x00,0x3B,0x4F,0x58,0x10,0x9F,0x01,0x43,0x9A,0xDC,0x8F,0x4B, +0x0E,0x3C,0x02,0x5E,0x37,0x15,0x0E,0x3A,0x00,0x4A,0xF1,0xB8,0x5E,0xF7,0x06,0x5F, +0x58,0x00,0xD7,0x3A,0xFF,0x25,0x46,0x37,0xBF,0x99,0x40,0x4E,0x31,0xFA,0x89,0xCA, +0x46,0x31,0xBC,0xC2,0x80,0x10,0x01,0x9A,0x42,0x8A,0xAC,0xE4,0x00,0x04,0x4B,0x0B, +0x0D,0x18,0x21,0x41,0x32,0x0E,0xEB,0x02,0xD7,0x17,0x0E,0xEC,0x0F,0x0B,0x06,0xD6, +0xF8,0x00,0x7C,0xD6,0xF8,0x0E,0x96,0x0F,0x0B,0x0A,0xD6,0xF8,0x0E,0x58,0x98,0x60, +0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE5,0xE6, +0xD0,0x60,0x0D,0xAA,0x12,0xEC,0x00,0x99,0x41,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E, +0xEC,0x18,0x17,0x04,0x18,0x17,0x06,0x1A,0x57,0x05,0xE4,0x00,0x03,0x4F,0x21,0x45, +0x56,0x0E,0xEB,0x06,0xD7,0x17,0x0C,0x8C,0x0F,0x0B,0x02,0xD7,0x17,0x0C,0x54,0x0F, +0x0B,0x0A,0xD6,0xF8,0x00,0x7C,0xD6,0xF8,0x0B,0xFE,0x0F,0x0B,0x0E,0xD6,0xF8,0x0B, +0xC0,0x98,0x61,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7, +0xFF,0xE5,0x40,0xD0,0x60,0x0B,0x12,0x12,0xEC,0x00,0x9B,0x01,0x8E,0xEE,0x99,0x42, +0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x18,0x17,0x04,0x1B,0x17,0x06,0x1A,0x57,0x05,0xE4, +0x00,0x02,0xA5,0x25,0x45,0xC5,0x1F,0x37,0xFE,0xD7,0x2A,0x03,0x58,0x4E,0xEA,0x10, +0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x09,0x84,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F, +0x0B,0x0F,0x18,0x02,0xD6,0xF8,0x01,0x34,0xD6,0xF8,0x08,0xEE,0x1F,0x2A,0xFE,0x4F, +0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x08,0x70,0x1F,0x4A,0x01,0x4F,0x5A, +0x10,0x8F,0x4B,0x0F,0x5A,0x02,0xD7,0x59,0x07,0xF8,0x1F,0x2A,0x01,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x03,0x2C,0xD6,0xF9,0x07,0x66,0x1F,0x2A,0x02, +0x4F,0x39,0x10,0x8F,0x2B,0x0F,0x39,0x02,0xD6,0xF9,0x06,0xE8,0xD7,0x19,0x06,0xC8, +0xE4,0x00,0x00,0x95,0x4F,0x0A,0x10,0x1F,0x57,0xFE,0x0B,0x2D,0x18,0x8F,0x0B,0xD5, +0x5A,0x03,0x6E,0x0F,0x18,0x02,0xD7,0x38,0x05,0xFC,0x1F,0x37,0xFF,0x4F,0x39,0x10, +0x8F,0x2B,0x0F,0x39,0x02,0xD7,0x38,0x05,0x84,0x1F,0x37,0xFD,0x4F,0x39,0x10,0x8F, +0x2B,0x0F,0x39,0x02,0xD7,0x19,0x00,0xB4,0xD7,0x19,0x04,0xEE,0x9E,0xFC,0x4E,0xF7, +0x10,0x8E,0xEB,0x0E,0xF7,0x02,0xD7,0x17,0x04,0x78,0x88,0x6A,0x88,0x8B,0x88,0xB1, +0x88,0xD0,0x08,0xED,0x1C,0x09,0x0D,0x1E,0xE7,0xFF,0xE3,0x6E,0x20,0x61,0xE4,0x12, +0xEC,0x00,0x1F,0x0A,0xFF,0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x19,0x57,0x06, +0x1B,0x17,0x04,0x9D,0x41,0x5D,0x4A,0x00,0xE4,0x00,0x00,0xAD,0x0E,0xF8,0x02,0xD7, +0x37,0x02,0xB4,0x1F,0x0A,0xFF,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18,0x02,0xD6,0xF8, +0x00,0xBC,0xD6,0xF8,0x02,0x1E,0x1F,0x0A,0xFE,0x4F,0x18,0x10,0x8F,0x0B,0x0F,0x18, +0x02,0xD6,0xF8,0x01,0xA0,0x88,0x6A,0x88,0x8B,0x88,0xB1,0x88,0xD0,0x08,0xED,0x1C, +0x09,0x0D,0x1E,0xE7,0xFF,0xE2,0xB8,0x20,0x60,0x78,0x12,0xEC,0x00,0x1F,0x0A,0xFE, +0x8E,0xEE,0xCE,0xF7,0x00,0x30,0x8E,0xEC,0x1B,0x17,0x04,0x19,0x57,0x06,0x19,0x57, +0x05,0xE4,0x00,0x00,0x21,0x9D,0x41,0x5D,0x4A,0x00,0x12,0xEF,0x04,0xD6,0xEA,0xF0, +0x95,0x12,0xEF,0x04,0xD6,0xEA,0x01,0x61,0x12,0xEC,0x00,0x8E,0xEE,0xCE,0xF7,0x00, +0x30,0x43,0x17,0x64,0x13,0x18,0x05,0xD5,0x58,0x00,0x55,0x1D,0x58,0x01,0x5D,0x4A, +0x00,0x8E,0xF5,0x9B,0x01,0x9D,0xC1,0x18,0x17,0x07,0x0F,0x17,0x08,0x5D,0xCE,0x00, +0x12,0xEF,0x04,0xD6,0xEA,0x00,0x61,0xF2,0xF4,0x08,0xD2,0xD6,0xEE,0xFD,0xFC,0x12, +0xEC,0x00,0x8D,0xD7,0x19,0xCC,0x00,0x88,0x33,0x0E,0xC1,0x02,0x0E,0xA1,0x06,0x0E, +0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1, +0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32, +0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01, +0xF8,0x77,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x0B,0x85,0xEE,0xF8,0x04,0x5D, +0xC3,0x00,0x10,0x01,0xCF,0x37,0x00,0x05,0x4E,0xF7,0x10,0xEF,0x38,0x04,0x5B,0xC3, +0x00,0x10,0x01,0xEE,0xF8,0x04,0x59,0x85,0x29,0x5C,0x63,0x06,0x20,0x84,0x5A,0x0B, +0x05,0x00,0x0B,0x25,0x02,0x0B,0x45,0x04,0x0B,0x85,0x06,0x0B,0x65,0x08,0xE4,0x00, +0x00,0x27,0x0B,0x05,0x0A,0x0B,0x25,0x0C,0x0B,0x45,0x0E,0x0B,0x85,0x10,0x0B,0x65, +0x12,0xC2,0xE0,0x10,0x01,0x9B,0xA2,0xEA,0xF7,0x0B,0x85,0x43,0x9C,0xBB,0x43,0x9C, +0xE8,0x43,0x80,0xE5,0xFF,0x9C,0x03,0xFF,0xD4,0x7C,0x00,0xC8,0x43,0x9B,0xBB,0x43, +0xBC,0xE8,0xFF,0xBD,0x03,0xFF,0xD7,0xA3,0x01,0x08,0x5C,0x78,0x04,0xE4,0x00,0x00, +0xE3,0x24,0x7C,0x58,0x43,0x03,0xC3,0x40,0x7C,0x1D,0x43,0x43,0xD3,0x40,0x78,0xD4, +0x40,0x63,0xE0,0xE4,0x00,0x00,0xB1,0x9B,0x82,0x43,0x7B,0xBB,0x43,0x7B,0xE0,0xFF, +0x9B,0x03,0xFF,0xD7,0x83,0x01,0x7C,0xC0,0x60,0xFF,0xEC,0x20,0x00,0xCD,0x43,0x60, +0xDD,0xFE,0xFB,0xFC,0x01,0x8E,0xE3,0x43,0x37,0xCB,0xCA,0xE0,0x07,0xFF,0x40,0x77, +0x1D,0xFF,0x7B,0x04,0x00,0x43,0x03,0xC3,0x40,0x79,0xC4,0x40,0x63,0xD8,0xE4,0x00, +0x00,0x3B,0x24,0x7C,0x32,0x8C,0x77,0x40,0x63,0xD3,0xE4,0x00,0x00,0x1D,0xFF,0x17, +0x07,0xFF,0x40,0x78,0x1D,0x40,0x63,0xCB,0x40,0x63,0xB8,0x5C,0x63,0x04,0x85,0x29, +0x9C,0x38,0x0C,0x01,0x04,0xC3,0x00,0x10,0x01,0xC3,0x40,0x10,0x01,0xFF,0x18,0x0B, +0x7A,0xFF,0x9A,0x04,0x1C,0x0B,0x38,0x0B,0x0B,0xBC,0x00,0x13,0x18,0x0C,0x5F,0x79, +0x06,0x5E,0xE3,0x06,0x43,0x7D,0xDB,0x43,0x7B,0xC0,0xD6,0xFB,0x00,0x4C,0x9B,0x41, +0x0F,0x41,0x04,0x0F,0x41,0x06,0x98,0x7F,0x23,0x40,0x5E,0x0B,0x5C,0x02,0x43,0x5A, +0xCB,0x43,0x5A,0xC0,0xD7,0x57,0x00,0x58,0x9B,0x41,0x98,0x60,0x0F,0x41,0x04,0x0F, +0x41,0x06,0x23,0x41,0x1E,0xC3,0x40,0x10,0x01,0xC3,0x60,0x10,0x01,0xF3,0xBA,0x0B, +0x7E,0xFF,0x7B,0x04,0x20,0x9B,0x41,0xE4,0x00,0x00,0x57,0x0B,0xDB,0xFE,0x43,0xDE, +0xCB,0x43,0xDE,0xC0,0xD7,0xD7,0x00,0xD4,0x0B,0xDB,0x00,0x43,0xDE,0xCB,0x43,0xDE, +0xC0,0xD7,0xD7,0x00,0x68,0x9B,0x41,0x0F,0x41,0x04,0xE4,0x00,0x00,0x1F,0x9F,0x41, +0x9F,0x62,0x5C,0x7A,0x02,0xD7,0x5D,0xFE,0xB0,0x0F,0x41,0x06,0x23,0x40,0x9E,0xC3, +0x40,0x10,0x01,0xF3,0x5A,0x0B,0x7E,0x9F,0x41,0x4F,0x7A,0x08,0x8F,0x9B,0x0B,0x7C, +0x00,0x43,0x3B,0xCB,0x43,0x19,0xC0,0xD7,0x17,0x00,0x64,0x9A,0xE1,0x5C,0x7A,0x02, +0x0E,0xE1,0x04,0x9C,0x28,0x85,0x29,0xC3,0x20,0x10,0x01,0x5C,0x63,0x06,0x5C,0xC6, +0x02,0x5C,0xE7,0x00,0xFF,0x39,0x09,0x6C,0x24,0xC0,0x98,0xC2,0xE0,0x10,0x01,0xF3, +0x17,0x0B,0x7E,0xD4,0xD8,0x00,0xDC,0x43,0x18,0x3B,0x1E,0xE6,0xFF,0x8E,0xF8,0x4F, +0x17,0x10,0x8F,0x19,0x0B,0x78,0x02,0x0B,0x58,0x00,0xE4,0x00,0x00,0x11,0x9B,0x40, +0x8B,0x7A,0xC2,0xE0,0x10,0x01,0xF3,0x97,0x0B,0x7E,0xD7,0x86,0x01,0x08,0xD0,0xDF, +0x04,0x28,0x42,0xFC,0x3B,0x8E,0xE6,0x4F,0x17,0x10,0x4E,0xF7,0x10,0x8F,0x19,0x8F, +0x37,0x0B,0x18,0x02,0x0B,0xD9,0x00,0xE4,0x00,0x00,0x17,0x24,0xDD,0xA0,0x9B,0xC0, +0x8B,0x1E,0xD4,0xDC,0x03,0x0C,0x4E,0xE6,0x08,0xC0,0xE0,0x10,0x01,0xFC,0xE7,0x04, +0x1C,0x8E,0xE7,0x9C,0xC1,0x09,0x17,0x00,0x4C,0xC6,0x08,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x0B,0x7A,0x8C,0xE6,0x0B,0x97,0x0B,0x13,0x37,0x0C,0x0A,0xE7,0x00,0x40,0xD7, +0xE3,0x42,0xF7,0x45,0x43,0xA8,0xE3,0x40,0xC6,0xC8,0x43,0xBD,0xC8,0x43,0x97,0xE3, +0x43,0xA3,0xED,0x43,0x3C,0xC8,0x40,0x66,0x1D,0x43,0x18,0xEB,0x43,0x7B,0x1B,0x42, +0xFE,0xEB,0x8F,0x1B,0x40,0x7A,0x1B,0x43,0x18,0xC8,0x8E,0xE3,0x42,0xF7,0xC8,0xE4, +0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x0F,0x04,0x01,0x0E,0xE5,0x01,0x85,0x29,0x1C, +0x21,0xD8,0x0D,0x41,0x20,0x0D,0x61,0x1C,0x0D,0x81,0x18,0x0D,0xA1,0x14,0x5D,0x84, +0x00,0x0D,0xC1,0x10,0x0D,0xE1,0x0C,0x0E,0x01,0x08,0x5D,0xA5,0x00,0x5D,0x63,0x04, +0x0C,0xC1,0x04,0x0D,0x21,0x24,0x89,0xE8,0x0D,0xC1,0x2A,0xC1,0x40,0x10,0x01,0x9A, +0x02,0xFD,0x4A,0x0B,0x7A,0x0C,0xE1,0x00,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x40,0x63, +0x80,0x40,0x6B,0x1D,0xE7,0xFF,0xFC,0x38,0x0C,0x81,0x06,0x88,0xC3,0x5E,0xE3,0x02, +0x0C,0xA1,0x02,0x26,0xFC,0x36,0x0C,0x04,0x01,0x0C,0x05,0x01,0xE4,0x00,0x00,0x2D, +0x0A,0xEA,0x0B,0x42,0xEC,0xBB,0x88,0xED,0x40,0x77,0x80,0x40,0x6B,0x1D,0xE7,0xFF, +0xFD,0x72,0x08,0x6A,0x0B,0x40,0x6C,0x1B,0x4C,0x63,0x0A,0x8C,0x6B,0xE7,0xFF,0xFB, +0xC6,0x12,0xEA,0x04,0x88,0xC3,0x5F,0x03,0x02,0xD7,0x17,0x00,0x70,0x0C,0x0F,0x01, +0x0C,0x0E,0x01,0xE4,0x00,0x00,0x69,0x08,0x6A,0x0B,0x41,0x8C,0x1B,0x88,0x8F,0x4C, +0x6C,0x0A,0x88,0xAE,0x8C,0x6B,0x88,0xED,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1, +0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26, +0x1C,0x21,0x28,0xE7,0xFF,0xFC,0xC9,0x0E,0x01,0x0A,0x0D,0xE1,0x0E,0x0D,0xC1,0x12, +0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D,0x21,0x26,0x1C, +0x21,0x28,0x85,0x29,0x1C,0x21,0x90,0x0D,0x41,0x68,0x0D,0x81,0x60,0x0D,0xA1,0x5C, +0x0D,0xE1,0x54,0x0E,0x01,0x50,0x0E,0x21,0x4C,0x0D,0x21,0x6C,0xC2,0x20,0x10,0x01, +0x0D,0x61,0x64,0x0D,0xC1,0x58,0x0E,0x41,0x48,0x0E,0x61,0x44,0x0E,0x81,0x40,0x0E, +0xA1,0x3C,0x0E,0xC1,0x38,0x89,0xA3,0x8A,0x04,0x89,0x85,0x5D,0xE6,0x00,0x99,0x40, +0xFE,0x31,0x0B,0xF0,0xE4,0x00,0x00,0xA1,0xCF,0x0A,0x00,0x30,0x8F,0x11,0x1E,0xE1, +0x20,0x10,0xB8,0x07,0x0B,0x98,0x17,0x43,0x2D,0x2C,0x4D,0x05,0x08,0x13,0x59,0x00, +0x1F,0x61,0x38,0x8D,0x1A,0x9F,0x41,0x4D,0x08,0x08,0x1B,0x59,0x00,0x8F,0x68,0x08, +0x78,0x17,0x0F,0x9B,0xD9,0x1F,0x01,0x30,0x8F,0x08,0x88,0x8F,0x0F,0x01,0x00,0x1C, +0xC1,0x18,0x1C,0xE1,0x28,0x8C,0xC8,0x8C,0xE8,0x9D,0x41,0x8D,0x17,0x5D,0x4A,0x00, +0xE7,0xFF,0xFD,0x1E,0x12,0xF1,0x00,0xD6,0xEA,0xFD,0x8D,0xC2,0xE0,0x10,0x01,0x8B, +0x10,0xF2,0x57,0x04,0x64,0x9B,0x41,0x8A,0xED,0xE4,0x00,0x00,0x23,0x13,0x37,0x00, +0x27,0x24,0x19,0x0F,0x58,0x00,0x9E,0xE1,0x9F,0x04,0x43,0x37,0x6D,0x5F,0x39,0x00, +0xD6,0x59,0xFF,0x6D,0x99,0x60,0xC2,0x60,0x10,0x01,0x89,0x4B,0xC2,0x80,0x10,0x01, +0xE4,0x00,0x03,0x07,0x42,0xF0,0x5C,0x0E,0xF7,0x02,0x22,0xE0,0x48,0x1E,0xE1,0x10, +0x8E,0xEB,0x0B,0x57,0x00,0x0B,0x77,0x02,0xE4,0x00,0x01,0x5D,0x42,0xED,0x54,0x12, +0xF7,0x00,0x22,0xE1,0xE0,0x1E,0xE1,0x18,0x8E,0xEB,0x0B,0x17,0x00,0x1E,0xE1,0x28, +0x8E,0xEB,0x0A,0xF7,0x00,0x8E,0xF8,0x1F,0x01,0x30,0x8F,0x0B,0x0B,0x18,0x00,0x8E, +0xF8,0x1F,0x01,0x20,0x8F,0x0B,0x0B,0x18,0x00,0x8E,0xF8,0x9B,0x04,0x42,0xF7,0xC0, +0x0E,0xEC,0x00,0xE4,0x00,0x02,0x55,0xCE,0xEE,0x00,0x30,0x8E,0xF1,0x41,0x0E,0xCC, +0x08,0x77,0x17,0x4D,0x08,0x08,0x1E,0xE1,0x30,0x8E,0xE8,0x0E,0xE1,0x00,0x1E,0xE1, +0x20,0x0F,0x01,0x0C,0x0F,0x21,0x08,0x88,0x8F,0x88,0xB5,0x1C,0xC1,0x18,0x1C,0xE1, +0x28,0x8C,0xC8,0x8C,0xE8,0x8D,0x17,0xE7,0xFF,0xFB,0x90,0x9D,0xC1,0x0F,0x01,0x0E, +0x5D,0xCE,0x00,0x0F,0x21,0x0A,0xE4,0x00,0x00,0x23,0x9A,0xC1,0x99,0xC0,0x42,0xD6, +0x55,0x4F,0x2A,0x08,0x43,0x0D,0xB4,0x12,0xF8,0x00,0xD6,0xEE,0xFD,0x6D,0x4E,0xD6, +0x10,0x43,0x10,0xB4,0x0F,0x18,0x02,0xD3,0x00,0x05,0x0A,0x1F,0x01,0x38,0x8E,0xD8, +0x0B,0x56,0xD8,0x0B,0x76,0xDA,0x43,0x3A,0xDD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0xEB, +0x93,0x04,0x5B,0x47,0x37,0xCE,0x43,0x39,0xBD,0x52,0xE0,0x64,0x5F,0x39,0x06,0xD7, +0x3C,0x00,0xF4,0xEB,0x14,0x04,0x59,0x9A,0xE0,0xD7,0x19,0x00,0xA4,0x42,0xF9,0xC5, +0x43,0x1C,0xC5,0xCE,0xF7,0x00,0x64,0x42,0xF7,0xC0,0x5E,0xF7,0x00,0x5F,0x7A,0x15, +0x4B,0x81,0x01,0x4F,0x2A,0x08,0x4B,0x00,0x0A,0x8F,0x19,0x8F,0x3C,0x1F,0x81,0x38, +0x1F,0x41,0x38,0x53,0x60,0xC8,0x4F,0x39,0x08,0x43,0x7B,0xBD,0x8F,0x3C,0x0B,0x99, +0xE0,0x4F,0x18,0x08,0x8F,0x1A,0x0B,0xB8,0xE8,0x0B,0x58,0xF8,0x8F,0x5D,0x8F,0x5C, +0x0B,0x99,0xF0,0x8F,0x5C,0x43,0x5B,0xD3,0x0B,0x79,0xE8,0x0B,0x39,0xF8,0x8F,0x79, +0x0B,0x38,0xE0,0x8F,0x79,0x0B,0x38,0xF0,0x43,0x1B,0xCC,0x42,0xF7,0xC3,0xCB,0x00, +0x03,0x20,0x8E,0xFA,0xE7,0xFF,0xFD,0xF3,0x22,0xE0,0x88,0x1F,0x01,0x38,0x4E,0xEA, +0x10,0x8E,0xF8,0x0B,0x17,0xF0,0x0B,0x37,0xE0,0x8F,0x38,0x0B,0x17,0xF8,0x8F,0x38, +0x0B,0x17,0xE8,0x42,0xF9,0xC4,0xE7,0xFF,0xFD,0xAB,0x0C,0x0C,0x00,0x9D,0x41,0x9D, +0x84,0x9D,0x64,0x5E,0xAA,0x00,0xD6,0x55,0xF3,0xF5,0x0E,0xC1,0x3A,0x0E,0xA1,0x3E, +0x0E,0x81,0x42,0x0E,0x61,0x46,0x0E,0x41,0x4A,0x0E,0x21,0x4E,0x0E,0x01,0x52,0x0D, +0xE1,0x56,0x0D,0xC1,0x5A,0x0D,0xA1,0x5E,0x0D,0x81,0x62,0x0D,0x61,0x66,0x0D,0x41, +0x6A,0x0D,0x21,0x6E,0x1C,0x21,0x70,0x85,0x29,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x0D, +0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x89,0xA3,0xC2,0xE0,0x10, +0x01,0x5C,0x64,0x06,0xEA,0xF7,0x08,0xA3,0x5D,0x85,0x00,0x5D,0x66,0x00,0x5D,0x47, +0x00,0x56,0xF7,0x04,0x22,0xE0,0x34,0x88,0x8C,0x88,0xAB,0x88,0xCA,0xE7,0xFF,0xE0, +0xEC,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x7E,0x43,0x0A,0xC3,0x5F,0x18,0x00,0x9B, +0x20,0x42,0xF8,0x64,0x8D,0x78,0xC3,0x40,0x10,0x01,0x5D,0x6B,0x00,0x5E,0xF7,0x00, +0x8B,0x19,0xFF,0x5A,0x09,0x6C,0xE4,0x00,0x00,0x3B,0x4F,0x77,0x10,0x8F,0x7A,0x0B, +0x7B,0x02,0x8F,0x1B,0x4F,0x77,0x10,0x9E,0xE1,0x8F,0x7A,0x5E,0xF7,0x00,0x0B,0x7B, +0x00,0x8F,0x3B,0xD6,0xEB,0xFF,0x38,0x27,0x21,0x14,0x27,0x01,0x08,0xC2,0xE0,0x10, +0x01,0xFE,0xF7,0x01,0x64,0x4F,0x39,0x40,0x9D,0x44,0x4D,0x4A,0x10,0x8D,0x57,0x0A, +0xEA,0x06,0x43,0x19,0xC0,0x9B,0x4A,0xFF,0x18,0xFF,0x00,0x53,0x20,0x64,0x43,0x18, +0xBB,0x0A,0xEA,0x04,0x43,0x18,0xD0,0x4E,0xF7,0x40,0x42,0xF7,0xC8,0x8E,0xF8,0x5E, +0xE0,0x09,0x0E,0xED,0x00,0x48,0x61,0x01,0xE4,0x00,0x00,0x0D,0x98,0x60,0x0D,0xA1, +0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18, +0x85,0x29,0xCA,0xE0,0x01,0x00,0xFC,0x21,0xFF,0x80,0x5C,0xE7,0x00,0x0D,0x41,0x78, +0x0D,0x61,0x74,0x0D,0x81,0x70,0x0E,0x21,0x5C,0x0E,0x41,0x58,0x0E,0x61,0x54,0x0E, +0x81,0x50,0x0E,0xA1,0x4C,0x0E,0xC1,0x48,0x0D,0x21,0x7C,0x0D,0xA1,0x6C,0x0D,0xC1, +0x68,0x0D,0xE1,0x64,0x0E,0x01,0x60,0xCE,0x44,0x00,0x0A,0x42,0x52,0x1B,0x42,0x52, +0xB8,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x7A,0x11,0xD7,0x04,0x41,0x87,0x73,0x5F, +0x0C,0x00,0xCC,0x84,0x0A,0x00,0x8C,0xB8,0x8C,0xD8,0xC2,0xA0,0x10,0x01,0xC2,0x20, +0x10,0x01,0xC1,0x60,0x10,0x01,0xC3,0x00,0x10,0x01,0xFD,0x6B,0x09,0x6C,0x42,0x64, +0x18,0x5E,0x86,0x00,0x09,0xF7,0x0B,0x12,0x17,0x0C,0x5D,0x45,0x00,0xFE,0xB5,0x01, +0x64,0xFE,0x31,0x04,0x1C,0x8A,0xCB,0xFF,0x18,0x0A,0x1C,0xE4,0x00,0x01,0x61,0x0F, +0x01,0x04,0x88,0x95,0x50,0xA0,0x3C,0x1C,0x61,0x08,0xE4,0x00,0x2C,0xFE,0x41,0xAA, +0x65,0x1E,0xED,0x01,0x4E,0xF7,0x08,0x8E,0xF1,0x98,0x82,0x08,0x77,0x00,0x1C,0xA1, +0x08,0x40,0x63,0x7B,0x40,0x63,0x80,0xE7,0xFF,0xF1,0x44,0x0F,0x01,0x06,0x5C,0x63, +0x04,0xD5,0x4C,0x00,0x5E,0x1E,0xEE,0xFF,0xD5,0xB7,0x01,0x92,0xCB,0x20,0x03,0xE8, +0x43,0x43,0x9B,0x4E,0xEA,0x10,0x43,0x63,0x93,0x9E,0xE2,0x43,0x7B,0xC8,0x8E,0xEB, +0x0B,0x97,0x01,0x43,0x7C,0xDD,0x0F,0x77,0x01,0x43,0x3A,0xC8,0x4E,0xEA,0x10,0x8E, +0xEB,0x0B,0x57,0x01,0x43,0x3A,0xCD,0x0F,0x37,0x01,0x4E,0xEA,0x08,0x1F,0x37,0x01, +0x4F,0x59,0x08,0x8F,0x4B,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4F,0x57, +0x08,0x8F,0x56,0x0B,0x7A,0x00,0x27,0x7C,0x1A,0x0C,0x1A,0x01,0x4E,0xF7,0x08,0x8E, +0xEB,0x4F,0x4A,0x10,0x0B,0x77,0x00,0x8F,0x58,0x4F,0x39,0x08,0x9D,0x41,0x8F,0x2B, +0x5D,0x4A,0x00,0x0A,0xF9,0x00,0x8E,0xFB,0x0E,0xFA,0x00,0xD5,0x54,0xFA,0xA0,0x0E, +0xC1,0x4A,0x0E,0xA1,0x4E,0x0E,0x81,0x52,0x0E,0x61,0x56,0x0E,0x41,0x5A,0x0E,0x21, +0x5E,0x0E,0x01,0x62,0x0D,0xE1,0x66,0x0D,0xC1,0x6A,0x0D,0xA1,0x6E,0x0D,0x81,0x72, +0x0D,0x61,0x76,0x0D,0x41,0x7A,0x0D,0x21,0x7E,0xFC,0x21,0x00,0x80,0x85,0x29,0x1C, +0x21,0xB8,0x98,0x60,0x0D,0x21,0x44,0x0D,0x41,0x40,0x0D,0x61,0x3C,0x0D,0x81,0x38, +0x0D,0xA1,0x34,0x0D,0xC1,0x30,0x0D,0xE1,0x2C,0x0E,0x01,0x28,0x0E,0x21,0x24,0x0E, +0x41,0x20,0x0E,0x61,0x1C,0x0E,0x81,0x18,0x0C,0x01,0x08,0x0C,0x01,0x0C,0x18,0x01, +0x02,0x18,0x01,0x03,0x0C,0x01,0x10,0x0C,0x01,0x14,0xE7,0xFF,0xD3,0x4C,0x1C,0x61, +0x02,0x1C,0x81,0x10,0x1C,0xA1,0x08,0x98,0xC4,0xE7,0xFF,0xF5,0xD6,0xC2,0xE0,0x10, +0x01,0xF3,0x97,0x04,0x64,0xC2,0xE0,0x10,0x01,0xEB,0xB7,0x08,0x8B,0xC2,0xE0,0x10, +0x01,0xEF,0x77,0x04,0x56,0xC2,0xE0,0x10,0x01,0x57,0xBD,0x20,0xEF,0xD7,0x04,0x62, +0xC3,0x20,0x10,0x01,0x4F,0xBD,0x29,0x1E,0xE1,0x08,0xFF,0x39,0x01,0x84,0x9B,0x40, +0xE4,0x00,0x00,0x63,0x0F,0x17,0x02,0x09,0x19,0xFC,0x0F,0x19,0x00,0x43,0x18,0x45, +0x5F,0x1F,0xF9,0x4B,0x18,0x00,0x0F,0x17,0x00,0x23,0xA0,0x3C,0x23,0x60,0x30,0x43, +0x18,0xF3,0x43,0x18,0xD8,0x0F,0x17,0x00,0x9F,0x41,0x9E,0xE4,0x5F,0x5A,0x00,0x9F, +0x28,0xD7,0x5C,0xFE,0x9E,0x98,0x61,0x99,0x60,0xC2,0x20,0x10,0x01,0xC2,0x80,0x10, +0x01,0xE7,0xFF,0xD2,0x3E,0x89,0x4B,0xFD,0xB1,0x0B,0xF0,0x9A,0x41,0xC2,0x60,0x10, +0x01,0xFE,0x94,0x0C,0xBC,0xE4,0x00,0x00,0xF9,0xCE,0x0A,0x00,0x30,0x42,0xF0,0x6C, +0x1C,0x61,0x04,0x11,0xF7,0x04,0x11,0xD7,0x05,0x11,0x97,0x07,0x08,0x97,0x17,0x88, +0xAF,0x88,0xCE,0x88,0xEC,0xE7,0xFF,0xF9,0x88,0x20,0x60,0xF8,0x98,0x60,0xE7,0xFF, +0xD1,0xC4,0x1F,0x01,0x18,0x4E,0xEC,0x10,0x8E,0xF8,0x88,0xAF,0x0C,0x97,0xF2,0x88, +0xCE,0x88,0xEC,0x0C,0x61,0x06,0xE7,0xFF,0xFA,0xF8,0x98,0x61,0xE7,0xFF,0xD1,0x88, +0x40,0x6D,0x84,0x88,0xAF,0x88,0x83,0x88,0xCE,0x1C,0x63,0x18,0x9C,0x8C,0x88,0xEC, +0xE7,0xFF,0xD4,0x42,0x20,0x60,0x32,0x4E,0xF2,0x54,0x45,0x6B,0xBD,0x5D,0x6B,0x00, +0x88,0x74,0xF0,0x93,0x0B,0x7A,0x98,0xA1,0x9D,0x41,0xE4,0x00,0x82,0x10,0x5D,0x4A, +0x00,0xF2,0xF1,0x0B,0xF0,0xD6,0xEA,0xFC,0x25,0x88,0x6B,0xE7,0xFF,0xD7,0xB0,0x0D, +0x21,0x46,0x0E,0x81,0x1A,0x0E,0x61,0x1E,0x0E,0x41,0x22,0x0E,0x21,0x26,0x0E,0x01, +0x2A,0x0D,0xE1,0x2E,0x0D,0xC1,0x32,0x0D,0xA1,0x36,0x0D,0x81,0x3A,0x0D,0x61,0x3E, +0x0D,0x41,0x42,0x1C,0x21,0x48,0x85,0x29,0xFC,0x21,0xFF,0x00,0x98,0xA0,0xED,0x41, +0x00,0xF8,0xED,0x61,0x00,0xF4,0xED,0xC1,0x00,0xE8,0xED,0xE1,0x00,0xE4,0xEE,0x01, +0x00,0xE0,0xEE,0x21,0x00,0xDC,0xEE,0x41,0x00,0xD8,0xEE,0x61,0x00,0xD4,0xED,0x21, +0x00,0xFC,0xED,0x81,0x00,0xF0,0xED,0xA1,0x00,0xEC,0xEE,0x81,0x00,0xD0,0xEE,0xA1, +0x00,0xCC,0xEE,0xC1,0x00,0xC8,0xC2,0x20,0x10,0x01,0xC2,0x60,0x10,0x01,0xFE,0x31, +0x0C,0xBC,0xFD,0x73,0x0B,0x7A,0x88,0x71,0x10,0x8B,0x00,0xE4,0x00,0x80,0xEE,0xC2, +0xE0,0x10,0x01,0xEA,0xF7,0x08,0x8F,0xC6,0xF7,0x02,0x00,0xC2,0x40,0x10,0x01,0x5E, +0xE0,0x01,0xC1,0xE0,0x10,0x01,0x4A,0xE1,0x13,0xC1,0x40,0x10,0x01,0xC1,0xC0,0x10, +0x01,0x0E,0xE1,0x0C,0x9A,0x00,0xFE,0x52,0x01,0x64,0xFD,0xEF,0x09,0x6C,0xFD,0x4A, +0x0A,0x1C,0xFD,0xCE,0x0B,0xF0,0x98,0x60,0x0C,0x01,0x58,0x0C,0x01,0x5C,0x18,0x01, +0x56,0x18,0x01,0x57,0x0C,0x01,0x60,0x0C,0x01,0x64,0xE7,0xFF,0xCF,0x6C,0x1C,0x61, +0x56,0x1C,0x81,0x60,0x1C,0xA1,0x58,0x98,0xC3,0xE7,0xFF,0xF1,0xF6,0xC2,0xE0,0x10, +0x01,0xEB,0x97,0x08,0x8B,0xC2,0xE0,0x10,0x01,0xC3,0x20,0x10,0x01,0xEF,0x77,0x04, +0x56,0xC2,0xE0,0x10,0x01,0xF3,0x59,0x04,0x64,0x57,0x9C,0x20,0xEF,0xB7,0x04,0x62, +0x4F,0x9C,0x29,0x1E,0xE1,0x58,0x9B,0x20,0xE4,0x00,0x00,0x5D,0x0F,0xD7,0x02,0x4F, +0x19,0x18,0x8F,0x12,0x0B,0x18,0x1C,0x43,0x1E,0xC5,0x5F,0x1F,0xF9,0x4B,0x18,0x00, +0x0F,0x17,0x00,0x23,0x80,0x3C,0x23,0x60,0x30,0x43,0x18,0xEB,0x43,0x18,0xD8,0x0F, +0x17,0x00,0x9F,0x21,0x9E,0xE4,0x5F,0x19,0x00,0xD7,0x58,0xFE,0x9D,0x13,0x0B,0x04, +0x09,0xAB,0x0B,0x12,0x8B,0x0C,0x9A,0xA0,0xE4,0x00,0x01,0xA1,0xFE,0xE1,0x00,0xC8, +0x8E,0xF5,0x12,0xF7,0x8E,0x22,0xE0,0x72,0xFF,0x61,0x00,0xC8,0x9A,0xE1,0x42,0xF7, +0xAD,0x4E,0xF7,0x10,0x8E,0xFB,0x0F,0x37,0x92,0x4E,0xF5,0x10,0x8E,0xFB,0x0F,0x37, +0x90,0x41,0x95,0xC3,0x1F,0xB5,0x01,0x5E,0xCC,0x00,0x43,0xBD,0xC3,0xE4,0x00,0x01, +0x25,0x0F,0x01,0x00,0x0F,0x41,0x04,0x0F,0xA1,0x08,0x88,0x92,0x50,0xA0,0x3C,0x1C, +0x61,0x10,0xE4,0x00,0x25,0x6E,0x42,0xF6,0x65,0xC3,0x80,0x10,0x01,0x9E,0xE1,0xFF, +0x9C,0x04,0x1C,0x4E,0xF7,0x08,0x8E,0xFC,0x98,0x81,0x08,0x77,0x00,0x1C,0xA1,0x10, +0x40,0x63,0x6B,0x40,0x63,0xA0,0xE7,0xFF,0xE9,0xA6,0x53,0x60,0x64,0x4E,0xF6,0x10, +0x5C,0x63,0x04,0x4F,0x35,0x10,0xFD,0x21,0x00,0xC8,0x9E,0xE2,0x8F,0x29,0x8E,0xEF, +0x0F,0x39,0x92,0x43,0x23,0xCB,0x43,0x39,0xD8,0x0B,0x77,0x01,0x5F,0x39,0x04,0x43, +0x7B,0xCD,0x0F,0x77,0x01,0x0F,0xA1,0x0A,0x4F,0x76,0x10,0x0F,0x41,0x06,0x43,0x9B, +0x7C,0x9E,0xC1,0x0B,0xDC,0x01,0x8F,0x6A,0x43,0x3E,0xCD,0x5E,0xD6,0x00,0x5F,0x39, +0x06,0x0F,0x01,0x02,0x0F,0x3C,0x01,0x0A,0xF7,0x00,0x8F,0x37,0x0F,0x3B,0x00,0xD7, +0xB6,0xFB,0x94,0x9E,0xA1,0x5E,0xB5,0x00,0xD7,0x55,0xF9,0xA5,0x98,0x61,0xE7,0xFF, +0xCC,0xC4,0x13,0x6B,0x04,0x13,0x4B,0x01,0xC3,0x00,0x10,0x01,0x43,0x5A,0xDB,0x9A, +0xE0,0xFF,0x18,0x0D,0x30,0xE4,0x00,0x00,0x4F,0x4F,0x37,0x10,0x43,0x99,0xC4,0x8F, +0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0x4F,0x37,0x10,0x9E,0xE1,0x9F,0x22,0x5E,0xF7, +0x00,0x43,0x99,0xC4,0x8F,0x2F,0x0B,0x39,0x01,0x0F,0x3C,0x01,0xD7,0x57,0xFE,0xEC, +0xC3,0x20,0x10,0x01,0x12,0x8E,0x00,0xFF,0x39,0x0B,0xF6,0x9B,0xA0,0x8B,0x19,0x8B, +0xCA,0xE4,0x00,0x01,0x3D,0x1F,0x98,0x02,0x12,0xF8,0xFE,0x12,0xB8,0xFF,0x11,0x98, +0x01,0x13,0x58,0x00,0x0D,0x1C,0x02,0x21,0x04,0x5E,0x43,0x8C,0xDB,0x8F,0x9A,0x4F, +0x9C,0x10,0x8F,0x8A,0x0F,0x9C,0x02,0x41,0x8C,0xDB,0xE4,0x00,0x00,0xCD,0x4D,0xBA, +0x10,0x43,0x9A,0xDC,0x8D,0xAA,0x4F,0x9C,0x10,0x0D,0xAD,0x02,0x8F,0x8A,0x0F,0x9C, +0x02,0x8F,0x8D,0xE7,0xFF,0xFF,0xC9,0x21,0x04,0x5A,0x41,0xB7,0x64,0x4D,0xAD,0x10, +0x8D,0xAA,0x0D,0xAD,0x02,0xD5,0xBC,0x01,0x94,0xE4,0x00,0x00,0x65,0x4D,0xB7,0x10, +0x42,0xD7,0xDC,0x8D,0xBE,0x4E,0xD6,0x10,0x0D,0xAD,0x02,0x8E,0xDE,0x0E,0xD6,0x02, +0x8E,0xCD,0xD6,0xDC,0x00,0xC8,0x43,0x57,0x64,0x4F,0x5A,0x10,0x8F,0x5E,0x0F,0x9A, +0x02,0x8F,0x8D,0xE4,0x00,0x00,0x0D,0x8B,0x8D,0x8B,0x57,0x9E,0xE1,0x5E,0xF7,0x00, +0xD6,0xF5,0xFD,0xB8,0x1B,0x58,0x00,0x9F,0xA1,0x1F,0x18,0x30,0x5F,0xBD,0x00,0xD7, +0xB4,0xFB,0x36,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x0B,0x7E,0xC2,0xE0,0x10,0x01,0x1F, +0x98,0xFF,0xF3,0x57,0x04,0x50,0x1F,0xB8,0xFD,0xC2,0xE0,0x10,0x01,0x1E,0xB8,0xFC, +0x11,0x8E,0x00,0x5D,0x1C,0x00,0x1D,0xB8,0xFE,0xFE,0xF7,0x0B,0xF5,0x9B,0x60,0x8A, +0x9C,0x5F,0xBD,0x00,0x5E,0xB5,0x00,0x9A,0xC2,0x1C,0x78,0xFD,0xE4,0x00,0x00,0xEB, +0x13,0x17,0x01,0xD7,0x1C,0x00,0x76,0x19,0x17,0x00,0x18,0x77,0xFF,0xE4,0x00,0x00, +0xB9,0x23,0x00,0x36,0x1A,0xD7,0x00,0x18,0x17,0xFF,0xE4,0x00,0x00,0x9F,0x23,0x04, +0x56,0x5F,0x40,0x29,0x9F,0x1F,0x4B,0xC2,0x1B,0x1B,0x17,0xFF,0x1B,0xD7,0x00,0xE4, +0x00,0x00,0x75,0xD7,0x0D,0x00,0x8E,0x5F,0x40,0x29,0x1A,0x97,0x00,0x4B,0xDD,0xA8, +0xE4,0x00,0x00,0x4D,0x1F,0xD8,0x01,0x5F,0xDE,0x00,0x23,0x44,0x22,0x9F,0x02,0x5F, +0xD8,0x00,0x1B,0xD7,0x00,0x13,0xD7,0x01,0x23,0x44,0x26,0x9F,0xDE,0xE4,0x00,0x00, +0x0D,0x9F,0xDF,0x5F,0xDE,0x00,0x1B,0xD7,0xFF,0x9F,0x61,0x1E,0xF7,0x30,0x5F,0x7B, +0x00,0xD7,0x6C,0xFC,0x7E,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x8F,0x56,0xF7,0x08, +0xD2,0xE0,0x08,0x6A,0xC2,0xE0,0x10,0x01,0x9B,0x00,0xF3,0x57,0x0B,0x7E,0x9B,0xA0, +0xC2,0xE0,0x10,0x01,0x1E,0xDA,0xFE,0xEA,0x97,0x01,0x56,0x8B,0x78,0x8B,0x9D,0x98, +0x60,0x9A,0xA1,0xE4,0x00,0x01,0xBF,0x12,0xF9,0x00,0xD2,0xE1,0x06,0x99,0xD6,0xD7, +0x06,0x78,0x1D,0x17,0xFF,0x1D,0xB7,0x01,0x1D,0x39,0x02,0x5D,0x08,0x00,0x5D,0xAD, +0x00,0x0F,0xC9,0x02,0x23,0xC4,0xDE,0x13,0x79,0x01,0x43,0x7A,0xDB,0x5F,0x7B,0x00, +0x8D,0xBB,0x8D,0x1B,0x8E,0xFB,0x4D,0xAD,0x10,0x4D,0x08,0x10,0x8D,0xAA,0x8D,0x0A, +0x0F,0xAD,0x02,0x0F,0x88,0x02,0x4E,0xF7,0x10,0x5F,0xBC,0x15,0x8E,0xEA,0x4B,0x9D, +0xE0,0x0F,0x77,0x02,0x5F,0x9C,0x06,0xE4,0x00,0x00,0xCD,0x23,0xC9,0xA2,0x13,0x79, +0x01,0x43,0xBB,0xD3,0x5F,0xBD,0x00,0x43,0x8D,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x43, +0x75,0xDD,0x0F,0xDC,0x02,0x43,0x7A,0xDB,0x5F,0x7B,0x00,0x8D,0xBB,0x4D,0xAD,0x10, +0x8D,0xAA,0x0F,0x8D,0x02,0x8F,0xDC,0x43,0x88,0xEC,0x4F,0x9C,0x10,0x8F,0x8A,0x8D, +0x1B,0x0D,0xBC,0x02,0x8F,0xB7,0x4D,0x08,0x10,0x8E,0xFB,0x8D,0x0A,0x4F,0xBD,0x10, +0x0F,0x88,0x02,0x8F,0xAA,0x8F,0x8D,0x4E,0xF7,0x10,0x5F,0xDC,0x15,0x8E,0xEA,0x4B, +0x9E,0xE0,0x0F,0x7D,0x02,0x0E,0xF7,0x02,0x5F,0x9C,0x06,0x8F,0x77,0x8B,0xB4,0xE4, +0x00,0x00,0x0F,0x23,0xC0,0x68,0xC3,0x60,0x7C,0xEC,0x20,0x00,0x4D,0x42,0xFB,0xE5, +0xD7,0xB7,0x00,0x68,0x4E,0xF5,0xC4,0x44,0x63,0xBD,0x5C,0x63,0x00,0x9F,0x01,0x1F, +0x39,0x30,0x5E,0xF8,0x00,0xD5,0x97,0xF9,0x15,0xE7,0xFF,0xCD,0xF4,0x1E,0xC1,0x68, +0x10,0x8B,0x00,0x88,0x76,0x98,0xA0,0x99,0xA0,0xE4,0x00,0x78,0x12,0x89,0x8D,0xC2, +0x80,0x10,0x01,0xE4,0x00,0x01,0x3F,0xCC,0x6C,0x00,0x30,0xEB,0x74,0x08,0xA3,0x42, +0xA3,0x74,0x57,0x7B,0x02,0x13,0x55,0x04,0x13,0x35,0x05,0x13,0x15,0x07,0x23,0x61, +0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x0F,0x01,0x00,0x0F,0x21,0x08,0x0F,0x41,0x04, +0x1C,0x61,0x52,0x98,0xE1,0xE7,0xFF,0xD2,0xE4,0x0F,0x01,0x02,0x0F,0x21,0x0A,0x0F, +0x41,0x06,0x20,0x61,0x14,0x1C,0x61,0x54,0x88,0x9A,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD4,0x54,0x20,0x60,0xCC,0x0B,0x21,0x52,0x0B,0x01,0x54,0xCF,0x39,0x00, +0x07,0xCF,0x18,0x00,0x03,0x9A,0xEA,0x8F,0x19,0x43,0x18,0xB8,0x0F,0x15,0x17,0xE4, +0x00,0x00,0x47,0x8C,0x6E,0x88,0x9A,0x1C,0x63,0x16,0x88,0xB9,0x88,0xD8,0x98,0xE1, +0xE7,0xFF,0xD2,0x4E,0x20,0x60,0x3A,0x9A,0xE1,0x4E,0xF7,0x64,0x45,0xAD,0xBD,0x5D, +0xAD,0x00,0x88,0x76,0x10,0x8B,0x00,0x98,0xA1,0x9D,0x81,0xE4,0x00,0x76,0xCE,0x5D, +0x8C,0x00,0x12,0xEE,0x00,0xD6,0xEC,0xFB,0x15,0x88,0x6D,0xE7,0xFF,0xCC,0x70,0x9E, +0x01,0x0F,0x21,0x0E,0x5E,0x10,0x00,0xD7,0x30,0xD8,0x7D,0x88,0x71,0x10,0x8B,0x00, +0x98,0xA1,0xE4,0x00,0x76,0x80,0xED,0x21,0x00,0xFE,0xEE,0xC1,0x00,0xCA,0xEE,0xA1, +0x00,0xCE,0xEE,0x81,0x00,0xD2,0xEE,0x61,0x00,0xD6,0xEE,0x41,0x00,0xDA,0xEE,0x21, +0x00,0xDE,0xEE,0x01,0x00,0xE2,0xED,0xE1,0x00,0xE6,0xED,0xC1,0x00,0xEA,0xED,0xA1, +0x00,0xEE,0xED,0x81,0x00,0xF2,0xED,0x61,0x00,0xF6,0xED,0x41,0x00,0xFA,0xFC,0x21, +0x01,0x00,0x85,0x29,0xC2,0xE0,0x10,0x01,0x1C,0x21,0xA0,0xF3,0x37,0x06,0xA8,0x0D, +0x41,0x5C,0x9A,0xE0,0xE4,0x00,0x00,0x23,0x4F,0x17,0x10,0x1D,0x41,0x00,0x9E,0xE1, +0x8F,0x0A,0x0C,0x18,0x00,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x85,0xC2,0xE0,0x10,0x01, +0xC3,0x60,0x10,0x01,0xEB,0x57,0x04,0x93,0x1D,0x19,0xFF,0x9A,0xE0,0xFF,0x7B,0x04, +0xC8,0xE4,0x00,0x00,0xFB,0x9B,0x80,0xD6,0xE8,0x00,0x4A,0x9F,0x01,0x5F,0x98,0x00, +0x9B,0x00,0x4F,0xB7,0x28,0x4F,0x9C,0x28,0xE4,0x00,0x00,0x5B,0x4F,0xD8,0x08,0x40, +0xDD,0xC4,0x40,0xBC,0xC4,0x1D,0x41,0x58,0x4C,0xC6,0x08,0x8F,0xCA,0x8C,0xDB,0x4C, +0xA5,0x08,0x08,0xC6,0x01,0x8C,0xBB,0x9F,0x01,0x08,0xA5,0x01,0x5F,0x18,0x00,0x40, +0xA6,0x2D,0x0C,0xBE,0xC1,0xD7,0x58,0xFE,0xBD,0x4F,0x97,0x10,0x1F,0xA1,0x58,0x9B, +0x00,0x8F,0x9D,0xE4,0x00,0x00,0x4B,0x4F,0xB8,0x08,0x1F,0xC1,0x58,0x8F,0xBE,0x0C, +0xBC,0xAA,0x0B,0xDD,0xC0,0x9F,0x01,0x4F,0xBE,0xFA,0x5F,0x18,0x00,0x47,0xDD,0xF6, +0x43,0xBE,0xED,0x8F,0xA5,0x0F,0xBC,0xA8,0xD7,0x58,0xFE,0xFD,0x9E,0xE1,0x5F,0x17, +0x00,0xD7,0x38,0xFC,0x25,0x0F,0x41,0x02,0x1F,0x61,0x04,0x9B,0x01,0x9A,0xE0,0xE4, +0x00,0x00,0x39,0x0F,0x9B,0x02,0xD7,0x5C,0x00,0x55,0x8B,0x9A,0xE4,0x00,0x00,0x0D, +0x8A,0xF8,0x9F,0x01,0x9F,0x64,0x5F,0x18,0x00,0x8B,0x5C,0xD7,0x38,0xFF,0x45,0x9F, +0x3F,0xD6,0xF9,0x00,0x76,0x1A,0xE3,0x00,0x18,0x04,0x00,0xE4,0x00,0x00,0x21,0xD7, +0x37,0x00,0x60,0x1A,0xE3,0x00,0x9E,0xE1,0x1A,0xE4,0x00,0x0D,0x41,0x5E,0x1C,0x21, +0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0xB7,0x06,0xA8,0xC2,0xE0,0x10,0x01,0xF3, +0xD7,0x04,0x88,0xC2,0xE0,0x10,0x01,0xC3,0x40,0x10,0x01,0xE9,0x17,0x04,0x93,0xC3, +0x20,0x10,0x01,0x9A,0xE0,0xFF,0x5A,0x04,0xC8,0xFF,0x39,0x06,0x48,0xE4,0x00,0x00, +0xAB,0x4C,0x78,0x08,0x4C,0x98,0x18,0x8C,0x7B,0x8C,0x9C,0x9F,0x01,0x08,0x84,0x01, +0x0C,0x83,0x01,0x5C,0x78,0x00,0xD7,0xC3,0xFF,0x5D,0x9B,0x00,0x4F,0x97,0x28,0x4C, +0x77,0x18,0xE4,0x00,0x00,0x4F,0x43,0x7C,0xC4,0x4C,0x98,0x11,0x4F,0x7B,0x08,0x8C, +0x83,0x8F,0x7A,0x4C,0x84,0x08,0x08,0xBB,0x01,0x8C,0x99,0x9F,0x01,0x08,0x84,0x01, +0x5F,0x18,0x00,0x40,0x85,0x25,0x0C,0x9B,0x01,0xD5,0x18,0xFE,0xED,0x9E,0xE1,0x5E, +0xF7,0x00,0xD6,0xFD,0x00,0xA2,0x4F,0x97,0x30,0x4F,0x77,0x20,0x8F,0x9A,0x8F,0x79, +0x9B,0x00,0xE7,0xFF,0xFF,0x63,0x85,0x29,0xC2,0xE0,0x10,0x01,0x5C,0x63,0x00,0x5C, +0x84,0x00,0xEB,0x97,0x04,0x93,0xC3,0x00,0x10,0x01,0x4F,0xA3,0x28,0xC3,0x20,0x10, +0x01,0x4F,0xC4,0x28,0x9A,0xE0,0xFF,0x18,0x04,0xC8,0xFF,0x39,0x06,0x48,0x4C,0x63, +0x18,0x4C,0x84,0x18,0xE4,0x00,0x00,0x83,0x4F,0x77,0x11,0x41,0x03,0xDC,0x4D,0x08, +0x08,0x8D,0x19,0x43,0x5D,0xBC,0x08,0xA8,0x01,0x4F,0x5A,0x08,0x8F,0x64,0x8F,0x58, +0x4F,0x7B,0x08,0x09,0x1A,0x01,0x8F,0x79,0x8D,0x05,0x0D,0x1A,0x01,0x43,0x5E,0xBC, +0x09,0x1B,0x01,0x4F,0x5A,0x08,0x9E,0xE1,0x8F,0x58,0x5E,0xF7,0x00,0x0B,0x7A,0x01, +0x8F,0x68,0x0F,0x7A,0x01,0xD7,0x97,0xFE,0x1D,0x85,0x29,0x20,0x60,0x2E,0xC2,0xE0, +0x10,0x01,0xEC,0x97,0x01,0x2C,0x85,0x29,0x20,0x60,0x4E,0xC2,0xE0,0x10,0x01,0xEC, +0x97,0x00,0xF4,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x01,0x28,0x85,0x29,0x20,0x60,0x5E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0x98,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0x9C, +0xE4,0x00,0x00,0x5D,0x20,0x64,0x5E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x06,0xB4,0xC2, +0xE0,0x10,0x01,0xEC,0xB7,0x04,0xC4,0xE4,0x00,0x00,0x2F,0x20,0x68,0x4E,0xC2,0xE0, +0x10,0x01,0xEC,0x97,0x04,0xBC,0xC2,0xE0,0x10,0x01,0xEC,0xB7,0x04,0x8C,0x85,0x29, +0x20,0x68,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0xB8,0x85,0x29,0x5C,0x84,0x04, +0x20,0x60,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x33,0xE4,0x00,0x00,0x3D,0x20, +0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x15,0xE4,0x00,0x00,0x1F,0x20,0x68, +0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x39,0x85,0x29,0x5C,0x84,0x04,0x20,0x60, +0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x00,0xF9,0xE4,0x00,0x00,0x3D,0x20,0x64,0x3E, +0xC2,0xE0,0x10,0x01,0xEC,0x97,0x01,0x31,0xE4,0x00,0x00,0x1F,0x20,0x68,0x2E,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x01,0x11,0x85,0x29,0x5C,0x84,0x04,0x20,0x68,0x2E,0xC2, +0xE0,0x10,0x01,0xEC,0x97,0x01,0x13,0x85,0x29,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D, +0x41,0x30,0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D,0xE1, +0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08, +0x0E,0xA1,0x04,0x0E,0xC1,0x00,0x20,0x65,0x70,0x20,0x60,0x4C,0xD0,0x62,0x04,0x42, +0x99,0xC0,0x89,0xEE,0xD0,0x63,0x06,0x66,0xE4,0x00,0x01,0x71,0xC2,0xE0,0x10,0x01, +0xEE,0xD7,0x00,0xF6,0xC2,0xE0,0x10,0x01,0xEE,0xB7,0x01,0x2A,0xC2,0xE0,0x10,0x01, +0xEE,0x97,0x04,0x9A,0xC2,0xE0,0x10,0x01,0xEE,0x77,0x04,0x9E,0xC2,0xE0,0x10,0x01, +0xE9,0xF7,0x01,0x33,0xC2,0xE0,0x10,0x01,0x9A,0x00,0xE9,0xD7,0x00,0xF9,0x99,0xA0, +0xC2,0xE0,0x10,0x01,0x9A,0x21,0xED,0x77,0x01,0x2E,0x9A,0x45,0x89,0x90,0xE4,0x00, +0x00,0xD9,0xC2,0xE0,0x10,0x01,0xEE,0x97,0x06,0xB6,0xC2,0xE0,0x10,0x01,0xEE,0x77, +0x04,0xC6,0xC2,0xE0,0x10,0x01,0x99,0xA0,0xE9,0xF7,0x01,0x15,0x9A,0x00,0xC2,0xE0, +0x10,0x01,0x8A,0x2D,0xE9,0xD7,0x01,0x31,0x9A,0x40,0x99,0x61,0x89,0x90,0x9A,0xA0, +0xE4,0x00,0x00,0x71,0xC2,0xE0,0x10,0x01,0xEE,0x97,0x04,0xBE,0xC2,0xE0,0x10,0x01, +0xEE,0x17,0x04,0xBA,0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01,0x39,0xC2,0xE0,0x10,0x01, +0x99,0x81,0xE9,0xD7,0x01,0x11,0x9A,0x21,0xC2,0xE0,0x10,0x01,0x9A,0x40,0xE9,0xB7, +0x01,0x13,0x99,0x61,0x9A,0x60,0x8A,0xAC,0x9A,0xC1,0x99,0x41,0xE4,0x00,0x00,0x55, +0xC2,0xE0,0x10,0x01,0xE9,0xF7,0x01,0x33,0xC2,0xE0,0x10,0x01,0xE9,0xD7,0x00,0xF9, +0x99,0xA0,0x9A,0x40,0x9A,0x00,0x9A,0x80,0x9A,0xA0,0x8A,0x2D,0x89,0x72,0x8A,0x70, +0x89,0x94,0x8A,0xD5,0x99,0x40,0x88,0x6A,0xE4,0x00,0xC6,0x74,0x88,0x6A,0xE4,0x00, +0xC6,0xF6,0x88,0x76,0xE4,0x00,0xD6,0xE8,0x88,0x75,0xE4,0x00,0xD7,0x42,0x88,0x74, +0xE4,0x00,0xC8,0x56,0x88,0x73,0xE4,0x00,0xC8,0xA2,0x88,0x72,0xE4,0x00,0xC7,0xA4, +0x88,0x71,0xE4,0x00,0xC7,0xD0,0x88,0x6A,0xE4,0x00,0xD8,0x64,0x88,0x70,0xE4,0x00, +0xD8,0xBE,0x98,0x60,0xE4,0x00,0xD9,0x0C,0x98,0x60,0xE4,0x00,0xD9,0x5A,0x98,0x60, +0xE4,0x00,0xD9,0xA8,0x98,0x60,0xE4,0x00,0xD9,0xF6,0x88,0x6F,0xE4,0x00,0xC8,0x9C, +0x88,0x6E,0xE4,0x00,0xC8,0xCA,0x88,0x6D,0xE4,0x00,0xC8,0xFE,0x88,0x6C,0xE4,0x00, +0xC9,0x18,0x88,0x6B,0x0E,0xC1,0x02,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E, +0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D, +0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21, +0x38,0xE4,0x00,0xC6,0x61,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x04,0xB4,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xF8,0x77,0x04,0xB4,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x04, +0xB4,0x9F,0x01,0xFB,0x17,0x04,0xB4,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06, +0xA9,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x06,0xA9,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xF3,0x17,0x06,0xA9,0x9F,0x01,0xFB,0x17,0x06,0xA9,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xEC,0x77,0x01,0x0C,0x85,0x29,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x00,0xFC,0x0C, +0x1A,0x00,0x9A,0xE1,0xC3,0x20,0x10,0x01,0xFF,0x39,0x01,0x18,0x0E,0xF9,0x00,0xC3, +0x00,0x10,0x01,0xFF,0x18,0x04,0xA0,0x0C,0x18,0x00,0x0C,0x1A,0x04,0x0E,0xF9,0x04, +0x0C,0x18,0x04,0x0C,0x1A,0x08,0x0E,0xF9,0x08,0x0C,0x18,0x08,0x0C,0x1A,0x0C,0x0E, +0xF9,0x0C,0x0C,0x18,0x0C,0xC3,0x00,0x10,0x01,0xEE,0xF8,0x01,0x34,0x85,0x29,0x9C, +0x38,0x0D,0x41,0x04,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0x5C,0xA5,0x00,0x5C, +0xC6,0x00,0xF3,0x38,0x06,0xAA,0xFE,0xF7,0x01,0x34,0xD7,0x25,0x00,0x6A,0xF8,0xB8, +0x06,0xAA,0x9B,0x01,0x0F,0x17,0x00,0xC3,0x80,0x10,0x01,0xC3,0x00,0x10,0x01,0x0F, +0x37,0x02,0xFF,0x9C,0x01,0x18,0xFF,0x18,0x00,0xFC,0x23,0x24,0x9A,0x0B,0xA3,0x00, +0x4F,0x46,0x18,0x43,0x78,0xD4,0x0F,0xBB,0x00,0x0B,0xA4,0x00,0x0F,0xBB,0x04,0x8F, +0x5C,0x0F,0x3A,0x00,0x0F,0x3A,0x04,0x40,0xA5,0x35,0x20,0xA4,0x1A,0x0C,0x17,0x00, +0x4E,0xE6,0x18,0x8E,0xF8,0x0C,0xF7,0x02,0x08,0xA3,0x00,0x0D,0x17,0x02,0x0F,0xB7, +0x06,0x0F,0x37,0x06,0x42,0xE7,0x2D,0x4C,0xF7,0xFA,0x46,0xE7,0xBE,0x0B,0x44,0x00, +0x40,0xF7,0x3D,0x43,0x39,0xD5,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9,0xBD,0x41, +0x08,0x2D,0x43,0xBD,0xD5,0x4F,0xC8,0xFA,0x4F,0x7D,0xFA,0x45,0x1E,0x46,0x47,0xBB, +0xEE,0x43,0xC8,0xF5,0x43,0x7D,0xDD,0x43,0xC7,0xF3,0x43,0x7B,0xBB,0x9B,0x21,0x8F, +0x7E,0x9A,0xE3,0xE4,0x00,0x00,0x11,0x8F,0x37,0x9E,0xE2,0xD7,0x3B,0xFF,0xE1,0xC3, +0x20,0x10,0x01,0x4E,0xF7,0x09,0x53,0x40,0x1E,0x9E,0xFF,0x5E,0xF7,0x06,0xEE,0xF9, +0x06,0xB8,0xC3,0x20,0x10,0x01,0x42,0xF7,0xD1,0xEF,0x39,0x01,0x0E,0x42,0xF7,0xBB, +0x43,0x39,0xBD,0xC2,0xE0,0x10,0x01,0x5F,0x23,0x11,0x20,0x00,0x1B,0x53,0x20,0x19, +0xEF,0x37,0x04,0xC0,0xC3,0xA0,0x10,0x01,0xEC,0xB7,0x04,0xC2,0x4C,0xC6,0x08,0x9A, +0xE0,0xFF,0xBD,0x04,0xA0,0xCB,0x40,0x10,0x00,0x43,0x26,0xBC,0x4F,0x39,0x10,0x43, +0x7C,0xCC,0xC9,0x40,0xA0,0x00,0x0D,0x1B,0x02,0x0F,0xDB,0x02,0x43,0x68,0x53,0xCF, +0xDE,0x00,0x0A,0x8F,0xC5,0x43,0xDB,0xF0,0x43,0x7D,0xCC,0x0F,0xDB,0x00,0x5F,0xD7, +0x00,0x23,0xC0,0x92,0x43,0xD8,0xCC,0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E,0x02, +0x0B,0xC3,0x00,0x43,0x3E,0xCD,0x43,0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F,0x23, +0x01,0xE4,0x00,0x00,0x43,0x43,0xD8,0xCC,0x0D,0x1E,0x02,0x0F,0x7B,0x02,0x0F,0x3E, +0x02,0x0B,0xC4,0x00,0x43,0x3E,0xCD,0x43,0x3B,0xCB,0x43,0x39,0xD0,0x8F,0x28,0x0F, +0x24,0x01,0x43,0x66,0xBC,0x4F,0x7B,0x10,0x43,0xD8,0xDC,0x0F,0x3E,0x00,0x43,0x3C, +0xDC,0x8F,0x7D,0x0F,0xD9,0x02,0x0D,0x1B,0x02,0x0F,0x79,0x02,0x43,0x68,0xDB,0x43, +0x7B,0xD0,0x43,0x7E,0xDD,0x0F,0x79,0x00,0x9E,0xE1,0xD2,0xE2,0xFB,0x7E,0x0D,0x41, +0x06,0x9C,0x28,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x04,0x95,0xC2,0xE0,0x10, +0x01,0x5C,0x63,0x04,0xEC,0x77,0x04,0x93,0x56,0xE3,0x03,0x5E,0xE0,0x09,0x4A,0xE1, +0x01,0x4C,0x63,0x11,0x8C,0x77,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x04,0x88,0xC2,0xE0, +0x10,0x01,0xF8,0xB7,0x06,0xA8,0xC2,0xE0,0x10,0x01,0xEC,0xD7,0x04,0xB0,0xC2,0xE0, +0x10,0x01,0xEC,0xF7,0x06,0xAD,0xC2,0xE0,0x10,0x01,0x0B,0x01,0x01,0xED,0x17,0x06, +0xB1,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x04,0x91,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x06,0xAE,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x06,0xAE,0xC2,0xE0,0x10, +0x01,0xF2,0xF7,0x06,0xA8,0x9E,0xFF,0x5E,0xF8,0x15,0x48,0x61,0x01,0x85,0x29,0x9C, +0x38,0x0D,0x21,0x04,0xE7,0xFF,0xFF,0xC2,0x9A,0xE0,0x20,0x60,0x4E,0xC2,0xE0,0x10, +0x01,0xF3,0x17,0x06,0xAE,0x9F,0x01,0xFB,0x17,0x06,0xAE,0x9A,0xE1,0x88,0x77,0x0D, +0x21,0x06,0x9C,0x28,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x04,0x93,0xC2,0xE0, +0x10,0x01,0xC3,0x20,0x10,0x01,0xF3,0x57,0x06,0xAE,0xFF,0x39,0x04,0xC8,0x9A,0xE0, +0x4F,0x5A,0x28,0xE4,0x00,0x00,0x39,0x4F,0x77,0x08,0x8F,0x63,0x0B,0x9B,0x00,0x43, +0x7A,0xBC,0x9E,0xE1,0x4F,0x7B,0x08,0x5E,0xF7,0x00,0x8F,0x79,0x0F,0x9B,0x01,0xD7, +0x17,0xFF,0x45,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08,0x18,0x01,0x06, +0x89,0x43,0x18,0x01,0x07,0xE7,0xFF,0xF2,0x5C,0x1C,0x61,0x06,0x1C,0x81,0x07,0xE7, +0xFF,0xF0,0x2A,0x10,0x61,0x06,0x10,0x81,0x07,0xE7,0xFF,0xF3,0x5E,0xC2,0xE0,0x10, +0x01,0x13,0x41,0x06,0xEB,0x37,0x04,0x93,0x13,0x61,0x07,0xC3,0x00,0x10,0x01,0x9A, +0xE0,0xFF,0x18,0x04,0xC8,0x4F,0x5A,0x28,0x4F,0x7B,0x28,0x9B,0x82,0xE4,0x00,0x00, +0x59,0x43,0xDA,0xBC,0x4F,0xDE,0x08,0x8F,0xD8,0x4F,0xB7,0x08,0x09,0x1E,0x00,0x8F, +0xAA,0x43,0xDB,0xBC,0x9E,0xE1,0x4F,0xDE,0x08,0x5E,0xF7,0x00,0x8F,0xD8,0x0B,0xDE, +0x00,0x8F,0xC8,0x43,0xDE,0xE0,0x0F,0xDD,0x01,0xD7,0x37,0xFE,0xC5,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0x1C,0x21,0xC8,0x0D,0x41,0x30,0x0D,0x61, +0x2C,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x5D,0xA5,0x04,0x0D,0x21,0x34,0x50,0xA0,0x20, +0x0D,0x81,0x28,0x89,0x43,0x89,0x64,0x5D,0xC6,0x04,0x88,0x61,0xC0,0x98,0x00,0x21, +0xFC,0x84,0xB4,0x94,0x9C,0x86,0xE4,0x00,0x0B,0xA6,0xC2,0xE0,0x10,0x01,0xC3,0x00, +0x10,0x01,0xEB,0x77,0x06,0xAD,0xC2,0xE0,0x10,0x01,0xF3,0x58,0x04,0x88,0xEB,0x97, +0x06,0xB1,0x9F,0x61,0x9F,0x81,0x5F,0x7B,0x04,0x5F,0x9C,0x04,0xCC,0xAD,0x00,0x18, +0xC2,0xE0,0x10,0x01,0x43,0xDB,0xE4,0xEA,0xF7,0x04,0x91,0x4F,0xDE,0x18,0x0B,0x01, +0x01,0x8F,0xD7,0x43,0xDE,0xD3,0x43,0xC5,0xF0,0x5F,0xDE,0x04,0xD7,0x1E,0x00,0x69, +0x0F,0x0A,0x01,0x9B,0x20,0xE4,0x00,0x00,0x4D,0x9B,0x00,0x89,0x81,0x8B,0x38,0x4F, +0xB8,0x08,0x5D,0x18,0x00,0x8F,0xAC,0x0B,0xBD,0x01,0xD7,0xBE,0x00,0x8D,0x0F,0xAA, +0x01,0x9F,0x01,0x8B,0x28,0x5F,0x02,0x09,0x23,0xFF,0x9D,0x43,0x1C,0xDC,0x0B,0x6A, +0x01,0x4F,0x18,0x18,0x43,0x5B,0xD3,0xCC,0xCE,0x00,0x18,0x43,0x78,0xBC,0x43,0x7A, +0xDB,0xD4,0xDB,0x01,0x11,0xE4,0x00,0x00,0x2F,0x43,0x77,0xC4,0x43,0x7B,0xD3,0xD7, +0x66,0x00,0x41,0xD4,0xBB,0x00,0x85,0x9E,0xE1,0x5E,0xF7,0x04,0xC2,0xE0,0x7F,0xEA, +0x23,0xFF,0xA5,0x0E,0xEB,0x01,0x0D,0xC1,0x22,0x0A,0xEA,0x01,0x0D,0xA1,0x26,0x4E, +0xF7,0x40,0x0D,0x81,0x2A,0x47,0x39,0xBD,0x0D,0x61,0x2E,0x0F,0x2A,0x01,0x0D,0x21, +0x36,0x0D,0x41,0x32,0x1C,0x21,0x38,0x85,0x29,0x9C,0x30,0x5C,0x63,0x00,0x0D,0x41, +0x08,0x0D,0x61,0x04,0x4C,0x63,0x08,0xC2,0xF8,0x00,0x21,0x0D,0x21,0x0C,0xFE,0xF7, +0xB6,0xFA,0x99,0x40,0x8E,0xE3,0x09,0x77,0x01,0x88,0x6A,0x88,0x8B,0x9D,0x41,0xE4, +0x00,0xC0,0x92,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x9E,0x0D,0x61,0x06,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0xDD, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0xF0,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0xD8, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x06,0xE4,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF3, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF8, +0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x06,0xDD,0xC2,0xE0,0x10,0x01,0xF8,0x17, +0x06,0xD8,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06,0xF0,0xC2,0xE0,0x10,0x01,0xF8,0x77, +0x06,0xE4,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF3,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF8,0x24,0x6C,0x1F,0xE7,0xFF,0xFE, +0x99,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0x5C,0x63,0x04,0xEC,0x77, +0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x06,0xF8,0xF3,0x78,0x06,0xD8,0xC3,0x40, +0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xFF,0x5A,0x06,0xF0,0xFF,0x39, +0x06,0xE4,0x23,0x60,0x2C,0xEB,0x78,0x06,0xF3,0xD7,0x63,0x00,0xA1,0x13,0x5A,0x00, +0xEC,0x78,0x06,0xF3,0x1B,0x59,0x00,0x9B,0x01,0xEF,0x17,0x06,0xF8,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xEB,0x17,0x06,0xE9,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0xDD,0x5E, +0xF8,0x1F,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0xD8,0x5E, +0xE0,0x5B,0x48,0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x06,0xD8,0x27, +0x08,0x7B,0x9F,0x01,0xFB,0x17,0x06,0xD8,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x06,0xF0, +0x9C,0x61,0x54,0x63,0x03,0xF8,0x77,0x06,0xF0,0xE7,0xFF,0xFD,0x61,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xF8,0x77,0x01,0x3A,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x06,0xE0,0xC2, +0xE0,0x10,0x01,0xEC,0xB7,0x06,0xD4,0xC2,0xE0,0x10,0x01,0xEC,0xD7,0x06,0xEC,0x85, +0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xEE,0x5C,0x63,0x04, +0xEC,0x77,0x06,0xDB,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0xF4,0x4E,0xF7,0x08,0x8E, +0xF8,0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xD6,0x0A,0xF7,0x01,0xCB,0x20,0xFF,0xFF, +0x4E,0xF7,0x08,0x8E,0xF8,0x0B,0x17,0x01,0xD7,0x19,0x00,0x5E,0x0C,0x77,0x01,0xE4, +0x00,0x00,0x4B,0xC3,0x20,0x10,0x01,0xEB,0x39,0x08,0xE7,0xC7,0x39,0x20,0x00,0x23, +0x20,0x54,0xCF,0x18,0x00,0x07,0xCC,0x63,0x00,0x03,0x9B,0x2A,0x8F,0x03,0x43,0x18, +0xC8,0x0F,0x17,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0x9C,0x38,0xC3,0x20,0x10,0x01, +0x0E,0xC1,0x04,0xF3,0x17,0x01,0x3A,0x4E,0xF8,0x08,0x9E,0xE8,0xC6,0xF7,0x03,0xF8, +0x1E,0xC1,0x08,0x88,0x81,0xEF,0xB9,0x06,0xD6,0x40,0x21,0xBD,0x9B,0x20,0x8A,0xE1, +0x8B,0x59,0xE4,0x00,0x00,0x43,0x4F,0x99,0x08,0x43,0x7D,0xE4,0x8F,0x97,0x0B,0x7B, +0x01,0x0F,0x7C,0x01,0xCB,0x80,0xFF,0xFF,0xD7,0x7C,0x00,0x4E,0x9F,0x41,0x5F,0x5A, +0x00,0x9F,0x21,0x5F,0x79,0x00,0xD7,0x1B,0xFF,0x05,0xC3,0x60,0x10,0x01,0xFF,0x7B, +0x06,0xE6,0x0C,0x1B,0x01,0x9B,0x20,0x23,0x40,0xE0,0xE4,0x00,0x00,0x8F,0x1F,0x99, +0x01,0x4F,0x39,0x08,0x5F,0x9C,0x00,0x8F,0x37,0x8B,0x5C,0xE4,0x00,0x00,0x3D,0x4F, +0xBA,0x08,0x0B,0xD9,0x01,0x8F,0xB7,0x09,0x1D,0x01,0xD7,0xC8,0x00,0x51,0x0D,0x19, +0x01,0x0F,0xDD,0x01,0x9F,0x41,0x5F,0x5A,0x00,0xD7,0x58,0xFF,0x36,0x8B,0x3C,0xD7, +0x38,0xFE,0x7E,0x0B,0x17,0x01,0x0A,0xF7,0x03,0x8E,0xF8,0x4E,0xF7,0x0A,0x0E,0xFB, +0x01,0x08,0x7B,0x01,0x88,0x24,0x0E,0xC1,0x06,0x9C,0x28,0x85,0x29,0x5C,0x63,0x04, +0xC3,0x00,0x10,0x01,0xEF,0x18,0x06,0xEE,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x06,0xF4, +0x4E,0xF7,0x08,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0A,0xF7,0x01,0xEF,0x18,0x06,0xD6, +0x4E,0xF7,0x08,0x8E,0xF8,0x0A,0xF7,0x01,0x5E,0xE3,0x1F,0x48,0x61,0x01,0x85,0x29, +0x5C,0x63,0x04,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x06,0xDB,0x5E,0xE3,0x1F,0x48,0x61, +0x01,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x61,0x14,0x0E,0xC1,0x04,0x0D,0x21,0x1C,0x0D, +0x41,0x18,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0xC3,0x20,0x10,0x01,0xC2, +0xE0,0x10,0x01,0xF3,0x59,0x06,0xF4,0xF2,0xF7,0x01,0x3A,0x9F,0x41,0x5F,0x5A,0x00, +0x43,0x1A,0xB9,0x43,0x18,0xBB,0x43,0x1A,0xC5,0x5F,0x18,0x00,0xFB,0x19,0x06,0xF4, +0x1E,0xC1,0x20,0x89,0x61,0xD3,0x00,0x04,0xA6,0x4F,0x17,0x08,0x9F,0x08,0xC7,0x18, +0x03,0xF8,0x89,0x81,0x40,0x21,0xC5,0xC3,0x00,0x10,0x01,0x8B,0x61,0xEF,0x58,0x06, +0xD6,0x9B,0x00,0xE4,0x00,0x00,0x29,0x4F,0x38,0x08,0x9F,0x01,0x43,0x9B,0xCC,0x8F, +0x3A,0x0B,0x39,0x01,0x0F,0x3C,0x01,0x5F,0x38,0x00,0xD6,0xF9,0xFF,0x6D,0xC3,0x00, +0x10,0x01,0xEF,0x98,0x06,0xEE,0x9B,0x00,0x8B,0x3C,0xE4,0x00,0x00,0x93,0x1F,0xB8, +0x01,0x4F,0x18,0x08,0x5F,0xBD,0x00,0x8F,0x1B,0x8B,0x5D,0xE4,0x00,0x00,0x61,0x4F, +0xDA,0x08,0x09,0x58,0x01,0x41,0x1B,0xF4,0x08,0x68,0x01,0xD5,0x43,0x00,0xD9,0x0C, +0x78,0x01,0x0D,0x48,0x01,0x8F,0xDC,0x09,0x19,0x01,0x09,0x5E,0x01,0x0D,0x59,0x01, +0x55,0x08,0xFF,0x0D,0x1E,0x01,0x9F,0x41,0x5F,0x5A,0x00,0xD7,0x57,0xFE,0xA6,0x9F, +0x22,0x8B,0x1D,0xD7,0x17,0xFD,0xDE,0x88,0x2C,0x99,0x40,0xC1,0x80,0x10,0x01,0xC1, +0xA0,0x10,0x01,0xC1,0xC0,0x10,0x01,0xEF,0x0D,0x06,0xEE,0xF2,0xEE,0x06,0xF4,0x4E, +0xF7,0x08,0x8E,0xF8,0xEF,0x0C,0x06,0xE2,0x0A,0xF7,0x01,0x4E,0xF7,0x08,0x8E,0xF8, +0x88,0x6A,0x08,0x97,0x01,0x9D,0x41,0xE4,0x00,0xB9,0x22,0x5D,0x4A,0x00,0xD1,0x44, +0xFE,0xCE,0x88,0x2B,0x0E,0xC1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12, +0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x1C,0x21, +0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0D,0xA1, +0x04,0x0D,0x21,0x14,0xF8,0x17,0x06,0xF4,0x99,0x40,0xC1,0x60,0x10,0x01,0xC1,0x80, +0x10,0x01,0x89,0xB7,0xEF,0x0C,0x06,0xEE,0xF2,0xED,0x06,0xF4,0x4E,0xF7,0x08,0x8E, +0xF8,0xEF,0x0B,0x06,0xE2,0x0A,0xF7,0x01,0x4E,0xF7,0x08,0x8E,0xF8,0x88,0x6A,0x08, +0x97,0x01,0x9D,0x41,0xE4,0x00,0xB8,0x48,0x5D,0x4A,0x00,0xD1,0x44,0xFE,0xCE,0xC2, +0xE0,0x10,0x01,0xF3,0x37,0x01,0x3A,0xC2,0xE0,0x10,0x01,0x9B,0x5F,0xEF,0x17,0x06, +0xD6,0x9A,0xE0,0xE4,0x00,0x00,0x1D,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02,0x5E,0xF7, +0x00,0xD6,0xF9,0xFF,0xB6,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41, +0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x8B,0x03,0x56,0xE3,0x03,0x22,0xE0, +0x98,0x9B,0x04,0x42,0xF8,0xBD,0x5F,0x44,0x00,0x5E,0xE5,0x17,0x4B,0x37,0x28,0x9A, +0xE0,0xE4,0x00,0x00,0x13,0x1B,0x58,0x00,0x9E,0xE1,0x43,0x03,0xBC,0xD6,0xF9,0xFF, +0xC6,0x40,0xA5,0xBD,0x4E,0xE4,0x80,0x4F,0x64,0xC0,0x47,0x7B,0xBD,0x4E,0xE4,0x40, +0x47,0x7B,0x25,0x4F,0x45,0x11,0x47,0x7B,0xBD,0x9A,0xE0,0xE4,0x00,0x00,0x17,0x8F, +0x38,0x9E,0xE1,0x0F,0x79,0x00,0x4F,0x37,0x10,0xD6,0xFA,0xFF,0xB6,0x8F,0x19,0x9A, +0xE0,0x54,0xA5,0x03,0x5C,0x84,0x00,0xE4,0x00,0x00,0x19,0x43,0x37,0xC4,0x9E,0xE1, +0x18,0x99,0x00,0xD4,0xB7,0xFF,0xC5,0x85,0x29,0x46,0xE4,0x1D,0x56,0xF7,0x03,0x22, +0xE0,0x82,0x9A,0xFC,0x47,0x45,0xBC,0x9A,0xE0,0xE4,0x00,0x00,0x51,0x43,0x03,0xBC, +0x43,0x24,0xBC,0x9E,0xE1,0x13,0x39,0x00,0x1B,0x38,0x00,0xE4,0x00,0x00,0x0D,0x9A, +0xE0,0xD6,0xE5,0xFF,0x66,0xE4,0x00,0x00,0x63,0x0F,0x39,0x02,0x9E,0xE4,0x0F,0x38, +0x00,0x43,0x03,0xBC,0x43,0x24,0xBC,0xD6,0xFA,0xFF,0x96,0x9A,0xE0,0x54,0xA5,0x03, +0xE4,0x00,0x00,0x25,0x43,0x57,0xC4,0x43,0x77,0xCC,0x9E,0xE1,0x13,0x7B,0x00,0x1B, +0x7A,0x00,0xD4,0xB7,0xFF,0x95,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x21,0x1C,0x0D,0x41, +0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04, +0x0E,0x01,0x00,0xE4,0x00,0x62,0x70,0xC1,0x60,0x10,0x01,0xC0,0x60,0x00,0x21,0xFD, +0x4B,0x00,0xCC,0xFC,0x63,0xB0,0xE4,0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC, +0x84,0x00,0x00,0xFC,0xA5,0x01,0xD8,0x40,0xA5,0x25,0xE4,0x00,0x5D,0x46,0x0C,0x0A, +0x01,0x0C,0x0A,0x03,0x0C,0x0A,0x05,0x0C,0x0A,0x08,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x00,0xBB,0x0C,0x0A,0x0C,0x9A,0xEA,0xC1,0xA0,0x10,0x01,0x0E,0xEA,0x11,0xEC,0x0D, +0x07,0x00,0x50,0x60,0x26,0xE4,0x00,0x1F,0x86,0xC8,0x80,0xE1,0x00,0x98,0x60,0xE4, +0x00,0x2A,0xD6,0x98,0x63,0xE4,0x00,0x29,0xF2,0xE4,0x00,0x03,0x54,0xC2,0xE0,0x10, +0x01,0x9B,0x3C,0xF3,0x17,0x08,0x87,0x47,0x18,0xCC,0xFC,0x60,0x0B,0xB8,0xFB,0x17, +0x08,0x87,0x04,0x80,0x5B,0xC8,0x84,0x8D,0x80,0xE4,0x00,0x2A,0x26,0x98,0x61,0xC1, +0x80,0x10,0x01,0xE4,0x00,0x2A,0x1A,0x99,0xC1,0xC1,0x60,0x10,0x01,0xC1,0xE0,0x10, +0x01,0xC2,0x00,0x10,0x01,0xE4,0x00,0x29,0xE6,0x0E,0xEA,0x0E,0x22,0xE0,0x2C,0xD2, +0xE1,0x0A,0x4E,0xE4,0x00,0x00,0xC5,0xE4,0x00,0x5C,0x34,0xE4,0x00,0x29,0xFA,0x0C, +0x6A,0x13,0xE4,0x00,0x29,0xEC,0x0C,0x6A,0x17,0xE4,0x00,0x29,0xDE,0x0C,0x6A,0x1B, +0xE4,0x00,0x29,0xD0,0x0C,0x6A,0x19,0xEA,0xEC,0x06,0xFF,0xC6,0xF7,0xFF,0xDF,0xEE, +0xEC,0x06,0xFF,0xEA,0xEC,0x06,0xFF,0xC6,0xF7,0xFF,0x7F,0xEE,0xEC,0x06,0xFF,0x0D, +0xCA,0x0C,0xEA,0xEB,0x08,0xE7,0x52,0xF7,0x80,0xEC,0x0D,0x07,0x00,0xEE,0xEB,0x08, +0xE7,0x98,0x61,0xE4,0x00,0x1A,0x06,0x98,0x60,0xE4,0x00,0x30,0x3A,0xE4,0x00,0x2B, +0x32,0xE4,0x00,0x01,0xCF,0xEE,0xED,0x07,0x02,0x22,0xE0,0x2C,0xD2,0xE1,0x06,0xE6, +0xE4,0x00,0x00,0x9B,0x98,0x61,0xE4,0x00,0x1A,0x3E,0xD0,0x61,0x06,0x76,0xE4,0x00, +0x1C,0x90,0x20,0x64,0xAA,0xE4,0x00,0x1C,0x6E,0xEA,0xEB,0x08,0xE7,0xFF,0x00,0xFF, +0x7F,0x46,0xF7,0xC4,0xEC,0x0F,0x08,0xC0,0xEE,0xEB,0x08,0xE7,0xED,0xCD,0x07,0x00, +0xE4,0x00,0x64,0x7E,0xE4,0x00,0x64,0x1E,0xE4,0x00,0x01,0x41,0xE4,0x00,0x1C,0x70, +0x20,0x67,0x54,0x98,0x61,0xE4,0x00,0x1B,0xD0,0xE4,0x00,0x01,0x1F,0x0A,0xEA,0x01, +0xC6,0xF7,0x01,0x00,0xD2,0xE0,0x04,0x22,0xE4,0x00,0x28,0x80,0x0A,0xEA,0x13,0x0B, +0x0A,0x11,0x40,0x63,0xBD,0x5E,0xE3,0x04,0xD7,0x17,0x03,0x85,0xE4,0x00,0x28,0x58, +0x0C,0x6A,0x13,0x0A,0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0xE4,0x00,0x5D, +0xA4,0xE4,0x00,0x64,0x88,0xE4,0x00,0x63,0x7C,0xEE,0xEF,0x08,0xC2,0xEE,0xF0,0x08, +0xEC,0xE4,0x00,0x5E,0x90,0x98,0x61,0xE4,0x00,0x8A,0x72,0xE4,0x00,0x5F,0x08,0x98, +0x61,0xE4,0x00,0x5F,0x48,0xE4,0x00,0x60,0xFC,0xE4,0x00,0x8B,0xD2,0xEA,0xEB,0x08, +0xE7,0x56,0xF7,0x80,0x22,0xE0,0x90,0x0A,0xEA,0x01,0xC6,0xF7,0x01,0x00,0x22,0xE3, +0xE4,0x0A,0xEA,0x01,0xC6,0xF7,0xFE,0xFF,0x0E,0xEA,0x01,0x0D,0xCA,0x0C,0xEC,0x0D, +0x07,0x00,0x98,0x61,0xE4,0x00,0x18,0x24,0x0E,0xEA,0x0A,0xFC,0x60,0x1E,0x7F,0x9E, +0xE1,0x0E,0xEA,0x08,0x0C,0x8A,0x0A,0xE4,0x00,0x28,0xB6,0xE4,0x00,0x27,0x86,0xE7, +0xFF,0xFD,0x2D,0xE4,0x00,0xB2,0xBB,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00,0xE4, +0x00,0xB4,0x16,0x98,0x6D,0xE4,0x00,0xA4,0x90,0x98,0x60,0xFC,0x80,0x18,0x08,0xE4, +0x00,0xA6,0xD4,0x98,0x61,0xFC,0x80,0x18,0x08,0xE4,0x00,0xA6,0xC0,0x98,0x60,0x50, +0x80,0x14,0xE4,0x00,0xAB,0xBA,0x98,0x60,0x98,0x8C,0xE4,0x00,0xAA,0xDC,0x98,0x61, +0x50,0x80,0x14,0xE4,0x00,0xAB,0x98,0x98,0x61,0x98,0x8C,0x99,0x40,0xE4,0x00,0xAA, +0xB6,0x88,0x6A,0x98,0x80,0x9D,0x41,0xE4,0x00,0xB1,0x22,0x5D,0x4A,0x00,0xD1,0x44, +0xFF,0x9E,0x98,0x60,0x05,0x40,0xFF,0xC9,0x4A,0xFF,0xFF,0x88,0x8A,0xE4,0x00,0xA9, +0x10,0x88,0x8A,0x98,0x60,0xE4,0x00,0xA6,0x98,0x88,0x8A,0x0D,0x21,0x06,0x0D,0x41, +0x02,0x98,0x60,0x9C,0x28,0xE4,0x00,0xA7,0x79,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07, +0x10,0x1C,0x21,0xB0,0x0E,0xE1,0x10,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x07,0x04,0x0D, +0x41,0x4C,0x0D,0x61,0x48,0x0D,0x81,0x44,0x0D,0xE1,0x38,0x0E,0x01,0x34,0x0E,0x21, +0x30,0x0E,0x41,0x2C,0x0E,0x61,0x28,0x0E,0x81,0x24,0x0D,0xA1,0x40,0x0D,0xC1,0x3C, +0x0E,0xA1,0x20,0x0E,0xC1,0x1C,0x0E,0xE1,0x0C,0xC2,0x60,0x10,0x01,0xC2,0x40,0x10, +0x01,0xFE,0x73,0x07,0x24,0xFE,0x52,0x07,0x1C,0xC2,0x20,0x10,0x01,0xC2,0x00,0x10, +0x01,0xFE,0x31,0x07,0x14,0xFE,0x10,0x07,0x28,0xC1,0xE0,0x10,0x01,0xC1,0x8F,0xFF, +0xE1,0xFD,0xEF,0x07,0x20,0x9B,0x80,0xC2,0x98,0x00,0x21,0xC0,0xD8,0x00,0x21,0x13, +0x53,0x00,0x0E,0xF2,0x02,0x0D,0x51,0x02,0x0F,0xB0,0x02,0x0F,0x6F,0x02,0x99,0x60, +0xC9,0x8C,0xFF,0xFF,0x88,0xFC,0x53,0x20,0xFF,0xFE,0x94,0xB8,0x68,0xFC,0xC6,0xB8, +0x6E,0xE4,0x00,0x01,0xC5,0x41,0x14,0xC4,0x9F,0x01,0x11,0x08,0x00,0x8D,0xA8,0x5D, +0xAD,0x00,0xE4,0x00,0x00,0x11,0x9B,0x00,0x89,0xB8,0x5D,0x18,0x00,0xD7,0xC8,0xFF, +0x45,0xC3,0x18,0x00,0x21,0xFF,0x18,0xB8,0x68,0x8F,0x0B,0x99,0x00,0x12,0xB8,0x00, +0xCF,0x0D,0x00,0x0A,0x1E,0xD5,0xFF,0x8F,0x06,0x0E,0xC1,0x08,0x0F,0x01,0x14,0xE4, +0x00,0x01,0x37,0x0F,0x01,0x16,0xCD,0xE8,0x00,0x0A,0x8D,0xF8,0x0A,0xCF,0x00,0x0E, +0xC1,0x04,0x0F,0x01,0x0E,0x0E,0xC1,0x0A,0xD5,0x16,0x00,0x3A,0x0B,0x0F,0x0A,0x0D, +0xE1,0x06,0xD5,0xE4,0x03,0xB4,0xD4,0x98,0x03,0x94,0x8D,0xCD,0x5D,0xCE,0x00,0xCF, +0x0E,0x00,0x0A,0x8F,0x06,0x09,0xF8,0x06,0x0B,0x18,0x08,0x4F,0x18,0x50,0x41,0xEF, +0x23,0x8D,0xF8,0xFD,0xEF,0x02,0x00,0x4D,0xEF,0x52,0x5D,0xEF,0x06,0x41,0xEF,0x7B, +0x43,0x03,0x7D,0x4E,0xD8,0xFA,0x47,0x16,0xC6,0x43,0x18,0xB5,0xD7,0x0C,0x01,0x4C, +0xC3,0x20,0x1F,0xE4,0x20,0x00,0x2D,0x89,0x5D,0x89,0x97,0x8B,0x3A,0x88,0xFC,0x8B, +0xAA,0x8A,0xEC,0x8B,0x59,0x8B,0x87,0x8B,0x78,0x89,0x4F,0x89,0x98,0x88,0xEE,0x8B, +0x3E,0xE4,0x00,0x00,0x2F,0xC3,0x40,0x1F,0xE0,0x20,0x00,0x1D,0xD6,0xF8,0x00,0x60, +0x8B,0xAF,0x8A,0xF8,0x8B,0x5E,0x8B,0x8E,0x9D,0x01,0x5D,0xC8,0x00,0xD6,0xAE,0xFB, +0x35,0x9D,0x61,0x5F,0xCB,0x00,0x0E,0xC1,0x12,0xD6,0xDE,0xF9,0x6D,0xC3,0x00,0x10, +0x01,0x1B,0x53,0x00,0xFF,0x18,0x07,0x20,0x0E,0xF2,0x00,0x0D,0x51,0x00,0x0F,0xB0, +0x00,0x0F,0x78,0x00,0xC3,0x20,0x1F,0xE0,0x20,0x01,0x55,0xCF,0x9C,0x00,0x0A,0xCC, +0xE7,0x00,0x0A,0x8C,0xE6,0x0B,0x07,0x04,0x4F,0x18,0x50,0x8C,0xDC,0x08,0x67,0x02, +0x0B,0x86,0x02,0x40,0x63,0x23,0x0B,0x46,0x04,0x8C,0x78,0x43,0x1B,0xBC,0xFC,0x63, +0x02,0x00,0x4C,0x63,0x52,0x23,0x00,0xA8,0xC2,0xE0,0x1F,0xE0,0x20,0x00,0x8D,0x40, +0x63,0xBB,0x40,0x9C,0x23,0x4E,0xFA,0x50,0x8E,0xE4,0xFE,0xF7,0x02,0x00,0x4E,0xF7, +0x52,0x43,0x77,0xDB,0x8C,0x7B,0x40,0x63,0xC0,0xE4,0x00,0x00,0x0D,0x88,0x64,0x0E, +0xC1,0x1E,0x0E,0xA1,0x22,0x0E,0x81,0x26,0x0E,0x61,0x2A,0x0E,0x41,0x2E,0x0E,0x21, +0x32,0x0E,0x01,0x36,0x0D,0xE1,0x3A,0x0D,0xC1,0x3E,0x0D,0xA1,0x42,0x0D,0x81,0x46, +0x0D,0x61,0x4A,0x0D,0x41,0x4E,0x1B,0x25,0x00,0x1C,0x21,0x50,0x85,0x29,0x8B,0x23, +0xC2,0xE0,0x10,0x01,0x5C,0xA5,0x00,0xF2,0xF7,0x07,0x10,0x98,0x60,0xD6,0xE5,0x0C, +0xB9,0xD3,0x3F,0x0C,0x98,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10, +0x01,0xF2,0xF7,0x07,0x09,0xFF,0x18,0x07,0x07,0xFF,0x7B,0x07,0x08,0x22,0xE8,0x42, +0x13,0x18,0x00,0x5F,0x08,0x9B,0x20,0x00,0x51,0xE4,0x00,0x01,0x3B,0xD2,0xE1,0x04, +0xCE,0x13,0x18,0x00,0x5F,0x05,0x93,0x20,0x02,0x3D,0x24,0xA4,0x4B,0x9B,0x43,0x43, +0x5A,0x2D,0x4F,0x5A,0x08,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x37,0x20,0xA8,0x54,0x9B, +0x44,0x43,0x5A,0x2D,0x4F,0x5A,0x08,0x5F,0x5A,0x00,0x20,0xAC,0xEE,0xE4,0x00,0x00, +0x51,0x9B,0x43,0x9A,0xE0,0x13,0x9B,0x00,0x8B,0x17,0xE4,0x00,0x00,0x27,0x4F,0xB8, +0x08,0x9F,0x01,0x8F,0xBC,0x5F,0x18,0x00,0x8E,0xFD,0x5E,0xF7,0x00,0xD7,0x05,0xFF, +0x8E,0xE4,0x00,0x00,0x49,0x5E,0xE0,0x21,0x53,0x00,0x1D,0x52,0xE0,0x2F,0x4A,0xF8, +0xB8,0xE4,0x00,0x00,0x4B,0x5E,0xE0,0x29,0x53,0x00,0x41,0x52,0xE0,0x29,0x4A,0xF8, +0xB8,0xE4,0x00,0x00,0x2B,0x27,0x04,0x33,0x9F,0x9F,0x4F,0x18,0x08,0xE4,0x00,0x00, +0x8B,0x9B,0x0A,0x20,0xA9,0x10,0x13,0x1B,0x00,0x9C,0xBF,0x9F,0x1F,0x4C,0xA5,0x08, +0x8F,0x05,0xE4,0x00,0x00,0x65,0x9B,0x43,0x13,0xBB,0x00,0x43,0x5A,0x2D,0x9A,0xE0, +0x4F,0x5A,0x08,0x8B,0x77,0x5F,0x5A,0x00,0xE4,0x00,0x00,0x21,0x8F,0x9D,0x9F,0x61, +0x8E,0xFC,0x5F,0x7B,0x00,0x5E,0xF7,0x00,0x4F,0x9B,0x08,0xD7,0x65,0xFF,0x8E,0x1F, +0x1D,0xFF,0x8F,0x1C,0x5F,0x18,0x00,0x4F,0x5A,0x08,0xC3,0xB8,0x00,0x21,0xFF,0xBD, +0xB7,0x02,0x8F,0xBA,0x9B,0x40,0xE4,0x00,0x01,0x0B,0x4F,0x7A,0x08,0x8F,0x7D,0x0B, +0x9B,0x00,0xD7,0x3C,0x03,0xBC,0x0B,0x7B,0x02,0xD7,0x79,0x03,0x84,0x8E,0xFA,0xC3, +0xB8,0x00,0x21,0xCF,0x17,0x00,0x06,0xFF,0xBD,0xB7,0x1E,0x8F,0x1D,0x1F,0x57,0x01, +0x14,0xD8,0x00,0xCF,0x5A,0x00,0x06,0x09,0x18,0x02,0x8F,0x5D,0x98,0x60,0x0B,0xB8, +0x04,0x14,0xBA,0x00,0x0B,0xDA,0x02,0x0B,0x1A,0x04,0xD7,0x9B,0x02,0x52,0x42,0xF9, +0xDD,0x40,0x77,0x33,0x43,0x3C,0xCD,0x43,0x59,0x2B,0x43,0xD9,0xF3,0x8F,0x43,0x40, +0x77,0x43,0x43,0x5A,0x23,0x8C,0x7E,0x8C,0x7A,0x42,0xF7,0xEB,0x40,0x83,0x23,0x97, +0x41,0x43,0x39,0xC3,0xCB,0x5A,0x86,0xA0,0x8F,0x37,0x40,0x64,0xD0,0x43,0x7C,0xDD, +0x8C,0x79,0x40,0x63,0xD8,0xE4,0x00,0x00,0x1F,0x9F,0x41,0x5F,0x7A,0x00,0xD7,0x1B, +0xFB,0xE5,0x98,0x60,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x77,0x07,0x09,0xC2,0xE0, +0x10,0x01,0xF8,0x97,0x07,0x06,0xC2,0xE0,0x10,0x01,0xF8,0xB7,0x07,0x07,0xC2,0xE0, +0x10,0x01,0xF8,0xD7,0x07,0x08,0xC2,0xE0,0x10,0x01,0xEC,0xF7,0x07,0x05,0x85,0x29, +0x9A,0xFF,0x1C,0x21,0xD8,0x0D,0xE1,0x0C,0x1A,0xE1,0x07,0xC1,0xE0,0x10,0x01,0xFD, +0xEF,0x07,0x24,0x1A,0xEF,0x00,0x52,0xE0,0xFF,0xC3,0x00,0x10,0x01,0x0D,0x41,0x20, +0x0D,0x61,0x1C,0x0D,0xA1,0x14,0x0D,0xC1,0x10,0xCB,0x20,0xFF,0xFF,0xC1,0xC0,0x10, +0x01,0xEF,0x38,0x07,0x2C,0xFD,0xCE,0x07,0x20,0xC1,0xA0,0x10,0x01,0x0E,0xEE,0x00, +0xFD,0xAD,0x07,0x1C,0x0D,0x21,0x24,0x0E,0xED,0x00,0x0D,0x81,0x18,0xC2,0xE0,0x10, +0x01,0x0E,0x01,0x08,0x89,0x63,0xF3,0x17,0x07,0x09,0x89,0x44,0x88,0x65,0xC2,0xE0, +0x10,0x01,0x23,0x08,0x56,0xC3,0x00,0x10,0x01,0xF3,0x18,0x07,0x07,0x5F,0x08,0x9B, +0x20,0x00,0x61,0xE4,0x00,0x00,0x37,0x23,0x04,0x5E,0xC3,0x00,0x10,0x01,0xF3,0x18, +0x07,0x07,0x5F,0x05,0x93,0x20,0x00,0x25,0x9B,0x05,0xE4,0x00,0x00,0x0D,0x9B,0x04, +0xFB,0x17,0x07,0x10,0xC2,0x00,0x10,0x01,0x0E,0xEB,0x02,0xEE,0xF0,0x07,0x2C,0x0A, +0xE6,0x06,0x0C,0x8B,0x02,0xD4,0x97,0x04,0xCC,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08, +0xD1,0x53,0x18,0x01,0x1C,0xA1,0x07,0xEF,0x17,0x08,0xD1,0xE7,0xFF,0xF6,0x9C,0x0C, +0x6B,0x00,0x0C,0x8A,0x02,0xED,0x90,0x07,0x2E,0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF, +0xFA,0xC0,0xC2,0xE0,0x10,0x01,0x89,0x63,0xEC,0x77,0x07,0x0C,0x10,0xA1,0x07,0x0C, +0x8A,0x02,0x88,0x6C,0xE7,0xFF,0xFA,0x94,0xC3,0x00,0x10,0x01,0xEC,0x78,0x07,0x18, +0x0F,0x6E,0x02,0x0F,0x2D,0x02,0x0F,0x4A,0x02,0x43,0x1B,0xCC,0x23,0x00,0xEC,0xC3, +0x20,0x1F,0xE0,0x20,0x00,0xD1,0xC3,0x80,0x10,0x01,0xEF,0xBC,0x07,0x16,0xC3,0x80, +0x10,0x01,0xEF,0x9C,0x07,0x2A,0x43,0xBD,0xE5,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43, +0x9D,0xE5,0xD7,0x1C,0x00,0xAC,0x41,0x6B,0xDB,0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17, +0xC0,0x8F,0x58,0xE4,0x00,0x01,0x55,0x42,0xFA,0x1C,0xE4,0x00,0x01,0x5B,0xC9,0x80, +0x07,0xFF,0x42,0xEC,0xBD,0xD6,0xE4,0x05,0x2C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08, +0xD1,0x53,0x18,0x01,0x40,0x8C,0x25,0xEF,0x17,0x08,0xD1,0x1C,0xA1,0x07,0xE7,0xFF, +0xF5,0x56,0x40,0x6C,0x1D,0x0C,0x6B,0x00,0xEE,0xF0,0x07,0x2E,0x0C,0x8A,0x02,0x41, +0x8C,0xBD,0x10,0xAF,0x00,0x88,0x6C,0xE7,0xFF,0xF9,0x6E,0xC2,0xE0,0x10,0x01,0x89, +0x63,0xEC,0x77,0x07,0x0C,0x10,0xA1,0x07,0x0C,0x8A,0x02,0x88,0x6C,0xE7,0xFF,0xF9, +0x42,0xC3,0x00,0x10,0x01,0xEC,0x78,0x07,0x18,0x0F,0x6E,0x02,0x0F,0x2D,0x02,0x0F, +0x4A,0x02,0x43,0x1B,0xCC,0x23,0x00,0xFC,0xC3,0x20,0x1F,0xE0,0x20,0x00,0xE1,0xC3, +0x80,0x10,0x01,0xEF,0xBC,0x07,0x16,0xC3,0x80,0x10,0x01,0xEF,0x9C,0x07,0x2A,0x43, +0xBD,0xE5,0x4F,0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xD7,0x1C,0x00,0xCC,0x41, +0x6B,0xDB,0x42,0xE3,0xCB,0x8E,0xEB,0x43,0x17,0xC0,0x43,0x5A,0xC5,0x0F,0x4A,0x00, +0xE4,0x00,0x00,0x15,0x42,0xFA,0x1D,0x0E,0xEA,0x00,0x0E,0x01,0x0A,0x0D,0xE1,0x0E, +0x0D,0xC1,0x12,0x0D,0xA1,0x16,0x0D,0x81,0x1A,0x0D,0x61,0x1E,0x0D,0x41,0x22,0x0D, +0x21,0x26,0x1C,0x21,0x28,0x85,0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x61,0x24, +0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E, +0x21,0x0C,0x0E,0x41,0x08,0x5E,0x23,0x00,0x0E,0x61,0x04,0x56,0x11,0x03,0x4E,0xF1, +0x11,0x5E,0x00,0x09,0x99,0xC0,0x4A,0x41,0x01,0x99,0x80,0x9A,0x64,0x0D,0x21,0x2C, +0x8E,0x57,0x89,0x44,0x89,0xAE,0x89,0x6C,0x99,0xE0,0x42,0x73,0x25,0xE4,0x00,0x00, +0xF3,0x42,0xF3,0x54,0xD6,0xF1,0x01,0xD8,0x22,0x04,0x4A,0x51,0xC0,0x10,0x11,0x6A, +0x00,0x89,0xAE,0x51,0x80,0x10,0xE4,0x00,0x00,0x6B,0x22,0x08,0x4A,0x51,0xC0,0x10, +0x11,0x6A,0x00,0x11,0x8A,0x01,0x89,0xAE,0xE4,0x00,0x00,0x47,0x22,0x0C,0x7E,0x11, +0x6A,0x00,0x11,0x8A,0x01,0x11,0xAA,0x02,0x51,0xC0,0x10,0xE4,0x00,0x00,0x21,0x11, +0x6A,0x00,0x11,0x8A,0x01,0x11,0xAA,0x02,0x11,0xCA,0x03,0x4E,0xEC,0x80,0x4C,0x8C, +0xC0,0x8C,0x97,0x4E,0xEE,0x80,0x4F,0x0B,0x40,0x4C,0xAE,0xC0,0x8C,0xB7,0x4E,0xED, +0x40,0x88,0x6F,0x8C,0x8B,0x8C,0xAD,0x8C,0x98,0x8C,0xB7,0x9D,0xE1,0xE4,0x00,0x97, +0x50,0x5D,0xEF,0x00,0x9D,0x44,0xD5,0xF2,0xFC,0x5E,0x0E,0x61,0x06,0x0E,0x41,0x0A, +0x0E,0x21,0x0E,0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1,0x1E,0x0D, +0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30,0x85,0x29, +0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x00,0xDA,0x5E,0xE0,0x41,0x1C,0x21,0xE8,0x0D,0x61, +0x0C,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x0D,0x21,0x14,0x0D,0x41,0x10,0x89,0x63,0x5D, +0x84,0x00,0x49,0xA1,0x01,0xE4,0x00,0x53,0xA8,0xC3,0x14,0x00,0x01,0xCB,0x18,0x7A, +0x30,0x0A,0xF8,0x01,0xC6,0xF7,0x01,0x00,0x5E,0xF7,0x04,0x22,0xE3,0xD8,0xFC,0x60, +0x01,0x00,0x99,0x40,0xE4,0x00,0x17,0xA0,0xE4,0x00,0x00,0x31,0x88,0x6A,0x98,0x81, +0x88,0xAD,0x9D,0x41,0xE4,0x00,0xA8,0x62,0x5D,0x4A,0x00,0x0C,0x6B,0x01,0x9D,0x62, +0xD5,0x4C,0xFF,0x66,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12, +0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0xFC,0x21,0xFD,0xF0,0xED,0x41,0x02,0x08, +0xED,0xC1,0x01,0xF8,0xED,0xE1,0x01,0xF4,0xEE,0x01,0x01,0xF0,0xED,0x21,0x02,0x0C, +0xED,0x61,0x02,0x04,0xED,0x81,0x02,0x00,0xED,0xA1,0x01,0xFC,0xEE,0x21,0x01,0xEC, +0xEE,0x41,0x01,0xE8,0xEE,0x61,0x01,0xE4,0xEE,0x81,0x01,0xE0,0xC2,0x00,0x10,0x01, +0xC1,0xC0,0x10,0x01,0xC1,0xE0,0x10,0x01,0x89,0x43,0xFE,0x10,0x08,0x58,0xFD,0xCE, +0x08,0x79,0xFD,0xEF,0x08,0x76,0x20,0x60,0x30,0x20,0x68,0x98,0x20,0x64,0x30,0x24, +0x64,0x63,0x99,0x80,0xE4,0x00,0x00,0x0D,0x99,0x81,0xCD,0x8C,0x00,0x1A,0x51,0x60, +0x1A,0x8D,0x90,0xE4,0x00,0x00,0x41,0xD0,0x64,0x00,0x82,0xD0,0x65,0x00,0xA2,0x99, +0x80,0x89,0x6C,0xE4,0x00,0x00,0x21,0x89,0x8F,0x99,0x63,0xE4,0x00,0x00,0x11,0x89, +0x8E,0x99,0x68,0x9A,0xE0,0x8A,0x81,0x53,0x20,0x10,0xE4,0x00,0x00,0x19,0x43,0x14, +0xBC,0x9E,0xE1,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5,0x78,0xFF,0xAD,0x88,0x6B,0x88, +0x81,0x99,0xA3,0xE7,0xFF,0xFB,0xE8,0x8A,0x81,0xFE,0x20,0xFE,0xB0,0xCA,0x40,0x01, +0x50,0x52,0x60,0x3F,0x1C,0x61,0x60,0x88,0x8B,0xE7,0xFF,0xFD,0x8E,0x1F,0x21,0x60, +0x8B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x93,0x0A,0xF9,0x00,0xC2,0xFF,0xD5,0xEC,0x20, +0x00,0x39,0x43,0x71,0xBD,0xC3,0x60,0x2A,0x0C,0xE4,0x00,0x00,0x0F,0x5E,0xE0,0x19, +0x4B,0x61,0x01,0x23,0x60,0x98,0xFE,0xF7,0x01,0x50,0x13,0x58,0x00,0x42,0xF7,0x90, +0x8E,0xFA,0x5E,0xF7,0x06,0x26,0xFC,0x34,0x5E,0xE7,0xF1,0x4A,0xF7,0x98,0xE4,0x00, +0x00,0x0D,0x9A,0xE0,0x1A,0xF8,0x00,0x9B,0x40,0x9F,0x01,0x9F,0x22,0x42,0xF8,0xA5, +0x5E,0xF7,0x00,0xD5,0x77,0xFD,0xAD,0x23,0x40,0x24,0x9A,0xE0,0xE4,0x00,0x00,0x51, +0x88,0x6B,0x88,0x81,0x9D,0xBF,0xE7,0xFF,0xFA,0xE2,0x5D,0xAD,0x00,0x21,0xA2,0x1E, +0xE7,0xFF,0xFF,0xD5,0x43,0x0C,0xBC,0x1F,0x21,0x00,0x8F,0x37,0x9E,0xE1,0x13,0x39, +0x00,0x1B,0x38,0x00,0x5F,0x17,0x00,0xD5,0x78,0xFF,0x6D,0x21,0x40,0x74,0x21,0x48, +0x38,0x21,0x44,0x9C,0xD1,0x44,0x01,0xEA,0xD1,0x45,0x02,0x5A,0x99,0x60,0x99,0x80, +0x88,0x8B,0x89,0x4C,0xE4,0x00,0x00,0x9B,0xC1,0x80,0x10,0x01,0x99,0x60,0x88,0x90, +0xFD,0x8C,0x0A,0xFC,0xE4,0x00,0x00,0x2D,0xC0,0x80,0x10,0x01,0xC1,0x80,0x10,0x01, +0x99,0x61,0xFC,0x84,0x08,0x72,0xFD,0x8C,0x0B,0x64,0x51,0x40,0x1A,0xE4,0x00,0x00, +0x49,0xC1,0x80,0x10,0x01,0x99,0x68,0x88,0x8F,0xFD,0x8C,0x0B,0x88,0x99,0x43,0xE4, +0x00,0x00,0x25,0xC1,0x80,0x10,0x01,0x99,0x6D,0x88,0x8E,0xFD,0x8C,0x0B,0xB0,0x99, +0x48,0x88,0x6A,0xE7,0xFF,0xF9,0xC8,0xFD,0xA1,0x01,0x20,0x88,0x8A,0x88,0x6D,0xE7, +0xFF,0xFB,0x82,0x9A,0xE0,0xE4,0x00,0x00,0x33,0x4F,0x17,0x10,0x4F,0x37,0x08,0x8F, +0x0C,0x8F,0x2D,0x9E,0xE1,0x0B,0x39,0x00,0x4F,0x39,0x40,0x0F,0x38,0x00,0x5F,0x17, +0x00,0xD5,0x58,0xFF,0x45,0x88,0x6B,0xE4,0x00,0x51,0xB8,0xED,0x21,0x02,0x0E,0xEE, +0x81,0x01,0xE2,0xEE,0x61,0x01,0xE6,0xEE,0x41,0x01,0xEA,0xEE,0x21,0x01,0xEE,0xEE, +0x01,0x01,0xF2,0xED,0xE1,0x01,0xF6,0xED,0xC1,0x01,0xFA,0xED,0xA1,0x01,0xFE,0xED, +0x81,0x02,0x02,0xED,0x61,0x02,0x06,0xED,0x41,0x02,0x0A,0xFC,0x21,0x02,0x10,0x85, +0x29,0x9C,0x38,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x04,0xFE,0xF7,0x08,0x58,0x9B,0x00, +0x13,0x37,0x00,0x4F,0x39,0x08,0x9E,0xE1,0x8F,0x19,0xC3,0x20,0x10,0x01,0xFF,0x39, +0x08,0x72,0xD6,0xF9,0xFF,0x76,0xC2,0xE0,0x10,0x01,0xF3,0x57,0x08,0x76,0xFE,0xF7, +0x08,0x76,0x13,0x37,0x02,0x13,0x77,0x01,0x98,0x60,0x42,0xFB,0xD4,0x98,0x80,0x8E, +0xF9,0x53,0x20,0x37,0x4E,0xF7,0x08,0x8E,0xF8,0x97,0x03,0x4E,0xF7,0x09,0xCB,0x18, +0xD0,0x8F,0xCE,0xF7,0x03,0x5B,0x42,0xF7,0xC9,0xCE,0xF7,0x00,0x1D,0xD6,0xF8,0x00, +0xA1,0x97,0x2F,0x98,0x60,0xCB,0x39,0x42,0x3F,0x98,0x82,0xD6,0xF9,0x00,0x31,0x98, +0x87,0xE4,0x00,0x9F,0x74,0x0D,0x21,0x06,0x98,0x61,0x98,0x80,0x9C,0x28,0xE4,0x00, +0x9F,0x5B,0x9C,0x38,0x98,0x80,0x0D,0x21,0x04,0x98,0x66,0xE4,0x00,0x2E,0x14,0x98, +0x60,0xE7,0xFF,0xFA,0x8E,0x98,0x87,0x98,0x66,0xE4,0x00,0x2D,0xF8,0x98,0x64,0xE7, +0xFF,0xFA,0x72,0x98,0x66,0x98,0x88,0xE4,0x00,0x2D,0xDC,0x0D,0x21,0x06,0x98,0x65, +0x9C,0x28,0xE7,0xFF,0xFA,0x4D,0xC2,0xE0,0x10,0x01,0x5C,0xA0,0x29,0xF3,0x37,0x0B, +0x7A,0x53,0x40,0x40,0x52,0xE0,0x20,0xC3,0x60,0x10,0x01,0x4B,0x5A,0xB8,0xFF,0x7B, +0x09,0x6C,0x20,0x60,0x6C,0xE4,0x00,0x00,0x55,0x4F,0x17,0x08,0x9E,0xE1,0x8F,0x1B, +0x0B,0x18,0x00,0xD7,0x58,0x00,0x78,0x98,0x61,0xE4,0x00,0x00,0xD9,0x9A,0xE0,0x43, +0x40,0xD5,0x5F,0x17,0x00,0xD7,0x38,0xFF,0x25,0x98,0x60,0xE4,0x00,0x00,0xB5,0x20, +0x67,0xEA,0x9A,0xE0,0x20,0x80,0xA6,0x9A,0xE0,0x43,0x80,0xD5,0xE4,0x00,0x00,0x7D, +0x4F,0x17,0x08,0x8F,0x1B,0x0B,0x18,0x00,0x4F,0x98,0xFA,0x47,0x1C,0xC6,0x43,0x18, +0xE5,0x0B,0x84,0x00,0xD7,0x1C,0x00,0x38,0x0F,0x04,0x01,0x9E,0xE1,0x5F,0x17,0x00, +0xD7,0x38,0xFF,0x05,0xE7,0xFF,0xFF,0xA7,0x4F,0x17,0x08,0x8F,0x1B,0x0B,0x18,0x00, +0xD7,0x98,0xFD,0x3C,0x9E,0xE1,0xD7,0x1A,0xFD,0x0C,0x5F,0x17,0x00,0xD7,0x38,0xFF, +0x5D,0xE7,0xFF,0xFF,0x51,0x85,0x29,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF3, +0xB7,0x0B,0x7A,0xC3,0xC0,0x10,0x01,0x9A,0xE0,0xFF,0x18,0x07,0x34,0x8B,0x37,0xFF, +0xDE,0x09,0x6C,0xE4,0x00,0x00,0x5B,0x4F,0x57,0x08,0x0B,0x98,0x00,0x8F,0x5E,0x0B, +0x5A,0x00,0x43,0x9A,0xE5,0x4F,0x7C,0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0x5F,0x66, +0x11,0x20,0x00,0x21,0x9F,0x21,0x5F,0x39,0x00,0x0F,0x58,0x01,0x9E,0xE1,0x9F,0x02, +0x5F,0x57,0x00,0xD7,0xBA,0xFE,0xA5,0x5F,0x20,0x93,0x48,0x61,0x01,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xC3,0x40,0x10,0x01,0xF3,0x37,0x0B,0x7A,0xC3,0x60,0x10,0x01,0x9A, +0xE0,0xFF,0x5A,0x07,0x34,0xFF,0x7B,0x09,0x6C,0xE4,0x00,0x00,0x29,0x4F,0x17,0x08, +0x9E,0xE1,0x43,0x9A,0xC4,0x8F,0x1B,0x0B,0x18,0x01,0x0F,0x1C,0x01,0x5F,0x17,0x00, +0xD7,0x38,0xFF,0x6D,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xEA,0xC2,0xE0, +0x10,0x01,0x9C,0x38,0xF8,0x17,0x08,0xE3,0x0D,0x21,0x04,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xFD,0x20,0x64,0x26,0x98,0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80, +0xE4,0x00,0x30,0x24,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x06,0xEC,0x17,0x07,0x30,0x9C, +0x28,0xE4,0x00,0x4A,0x45,0x1C,0x21,0xE8,0xC2,0xE0,0x10,0x01,0x0D,0x41,0x10,0xEB, +0x17,0x00,0xCD,0x0D,0x21,0x14,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x0C,0x01,0x07,0x89, +0x43,0xC7,0x18,0x01,0x00,0x98,0x60,0xD3,0x00,0x06,0xAA,0xEB,0x17,0x00,0xCD,0xC7, +0x18,0xFE,0xFF,0xEF,0x17,0x00,0xCD,0xE4,0x00,0x43,0xF0,0xE4,0x00,0x44,0xFC,0x21, +0x44,0x36,0x98,0x61,0xE4,0x00,0x70,0xD8,0xE4,0x00,0x00,0x11,0xE4,0x00,0x71,0x2A, +0xC1,0x60,0x10,0x01,0xEE,0xEB,0x07,0x32,0x5E,0xE0,0x01,0x98,0x6A,0x98,0x83,0x0C, +0x01,0x07,0x1D,0x81,0x06,0x49,0x8C,0x00,0xE4,0x00,0x4F,0xD0,0x98,0x61,0x88,0x8C, +0x98,0xA1,0x88,0xCA,0xE7,0xFF,0xFC,0x44,0xC2,0xE0,0x10,0x01,0x20,0x60,0xE6,0xF3, +0x17,0x08,0xEA,0x9F,0x01,0xFB,0x17,0x08,0xEA,0x0A,0xE1,0x06,0xD2,0xEF,0x00,0x94, +0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0xE3,0x9F,0x01,0xFB,0x17,0x08,0xE3,0x98,0x63, +0x21,0x44,0x36,0x98,0x81,0xE4,0x00,0x6C,0x88,0xE4,0x00,0x00,0x73,0xE4,0x00,0x6C, +0xDE,0xE4,0x00,0x00,0x63,0xF8,0x17,0x08,0xEA,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0xE3,0xEE,0xEB,0x07,0x32,0x22,0xE3,0x66,0x0A,0xE1,0x06,0x5E,0xEC,0x11,0x23,0xFF, +0x41,0x21,0x44,0x36,0x98,0x61,0xE4,0x00,0x4E,0x7E,0xE4,0x00,0x00,0x11,0xE4,0x00, +0x4E,0xB8,0x9B,0x01,0xC2,0xE0,0x10,0x01,0x98,0x61,0xEF,0x17,0x07,0x30,0xC2,0xE0, +0x10,0x01,0xF3,0x17,0x08,0xFD,0x9F,0x01,0xFB,0x17,0x08,0xFD,0x0D,0x81,0x0A,0x0D, +0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0x20,0x64,0x26,0x98,0x60,0xE4,0x00,0x00,0x0D,0x98,0x64,0x98,0x80,0xE4, +0x00,0x2D,0xC6,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x47,0xF7,0x98,0x60,0x98,0xA0, +0x88,0x83,0xE7,0xFF,0xC7,0xCD,0xC2,0xE0,0x10,0x01,0x98,0x61,0xF2,0xF7,0x08,0xEA, +0xD2,0xEA,0x00,0x95,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0xE3,0x5E,0xE0,0xBB,0x48, +0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x08,0xFD,0x5E,0xE1,0xDB,0x48, +0x61,0x01,0x85,0x29,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x00,0x00,0x0C,0x17,0x00,0x0C, +0x17,0x19,0x0C,0x17,0x1B,0xEC,0x17,0x00,0xA1,0xEC,0x17,0x00,0xA3,0xEC,0x17,0x00, +0xA4,0x1F,0x17,0x08,0xEC,0x17,0x00,0xA1,0x0F,0x17,0x04,0x1F,0x17,0x20,0x0F,0x17, +0x1C,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD1,0x53,0x18,0x02,0xEF,0x17,0x00,0xD1, +0x85,0x29,0xC3,0x20,0x10,0x01,0xFF,0x19,0x00,0x00,0x1E,0xF8,0x20,0x5C,0x63,0x04, +0x0E,0xF8,0x1C,0x9A,0xE0,0xE4,0x00,0x00,0x29,0x0F,0x38,0x1E,0x43,0x44,0xBC,0x8F, +0x37,0x13,0x5A,0x00,0x9E,0xE1,0x1B,0x59,0x00,0x5F,0x37,0x04,0xD4,0x79,0xFF,0x6D, +0x9A,0xE1,0xEE,0xF8,0x00,0xA4,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0x0D,0x41,0x00, +0x5D,0x43,0x00,0xE7,0xFF,0xFF,0x02,0x88,0x6A,0xE4,0x00,0x98,0xAC,0x0D,0x21,0x06, +0x0D,0x41,0x02,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE0,0x0D,0x41,0x18,0x0D,0x61,0x14, +0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xE1,0x04,0x0D,0x21,0x1C,0x0D,0xC1,0x08,0x0E, +0x01,0x00,0xC1,0xA0,0x10,0x01,0xE4,0x00,0x9A,0x1E,0xC1,0x80,0x10,0x01,0xC1,0x60, +0x10,0x01,0xC1,0xE0,0x10,0x01,0x5C,0x63,0x00,0xFD,0xAD,0x00,0xC0,0xFD,0x8C,0x08, +0x89,0xFD,0x6B,0x00,0xB8,0xFD,0x4F,0x00,0x00,0xD0,0x60,0x19,0x42,0xE4,0x00,0x9A, +0x1C,0x5C,0x63,0x00,0x20,0x60,0xBC,0x0C,0x0A,0x19,0xE4,0x00,0x9A,0xA8,0xE4,0x00, +0x00,0x4B,0x0E,0xEA,0x06,0x0A,0x0A,0x19,0x8E,0x17,0xE4,0x00,0x9A,0xBC,0x18,0x70, +0x00,0x0A,0xEA,0x19,0xD2,0xEE,0x00,0x8D,0x0A,0xEA,0x19,0x9E,0xE1,0x5E,0xF7,0x04, +0x0E,0xEA,0x19,0x99,0xC0,0xE4,0x00,0x99,0x3A,0x5C,0x63,0x00,0x20,0x63,0x5A,0x0E, +0xEA,0x06,0x13,0x17,0x00,0x5F,0x0A,0x09,0x20,0x00,0x61,0x0A,0xEA,0x19,0xD2,0xE4, +0x03,0x76,0xE4,0x00,0x99,0xE4,0x0A,0xEA,0x19,0x22,0xE1,0xDA,0xE4,0x00,0x08,0x49, +0x13,0x17,0x00,0x23,0x08,0x36,0x0A,0xEA,0x19,0x22,0xE9,0x4E,0xE7,0xFF,0xFF,0xCD, +0x13,0x17,0x00,0x23,0x04,0x36,0x0A,0xEA,0x19,0x22,0xE5,0x0E,0xE7,0xFF,0xFF,0xAD, +0x13,0x17,0x00,0x5F,0x0A,0x29,0x20,0x00,0xC3,0x13,0x17,0x00,0x5F,0x0A,0x49,0x23, +0xFE,0xF3,0x13,0x17,0x00,0x5F,0x0A,0x69,0x20,0x00,0x7B,0x13,0x17,0x00,0x5F,0x0A, +0x89,0x20,0x00,0x57,0x13,0x17,0x00,0x5F,0x04,0x09,0x20,0x00,0x33,0x12,0xF7,0x00, +0x5E,0xE4,0x29,0x20,0x00,0x25,0x0A,0xEA,0x19,0x22,0xEE,0x64,0x98,0x61,0xE4,0x00, +0xAA,0x50,0x9D,0xC1,0xC1,0xC4,0xE2,0x0E,0x23,0xFD,0xB7,0xE7,0xFF,0xFF,0x0F,0x0E, +0xEA,0x06,0x13,0x17,0x00,0xD3,0x00,0x1D,0x5A,0x13,0x17,0x00,0x5F,0x0B,0x9B,0x20, +0x0E,0x85,0x13,0x17,0x00,0x5F,0x0A,0x49,0x07,0x00,0x80,0x20,0x00,0xA5,0x0B,0x2A, +0x19,0xD3,0x24,0x11,0x36,0x13,0x37,0x01,0x13,0x57,0x02,0x12,0xF7,0x03,0x4F,0x39, +0x40,0x47,0x39,0xD5,0xC3,0x22,0x7F,0xEE,0x20,0x08,0x3D,0x8F,0x19,0x1A,0xF8,0x00, +0xE4,0x00,0x04,0x0F,0x13,0x37,0x00,0x5F,0x2A,0x69,0x20,0x02,0xCD,0x0B,0x2A,0x19, +0xD3,0x23,0x1B,0x06,0x13,0x57,0x01,0x13,0x37,0x02,0x4E,0xFA,0x40,0x46,0xF7,0xCD, +0xCB,0x20,0x14,0x00,0xC2,0xE2,0x80,0x0A,0x4A,0xF7,0xC8,0x8E,0xF8,0x0E,0xEA,0x1C, +0xFE,0xE0,0x08,0x00,0xEE,0xEA,0x00,0xA1,0xE4,0x00,0x00,0x1D,0xE4,0x00,0x07,0x98, +0x98,0x61,0xE4,0x00,0x07,0xC4,0xE4,0x00,0x96,0xD2,0x5C,0x63,0x00,0x20,0x63,0xBC, +0xEC,0x0A,0x00,0xA3,0xE4,0x00,0x97,0xDA,0xE4,0x00,0x97,0x6C,0xEB,0x0A,0x00,0xA3, +0xEA,0xEA,0x00,0xA1,0xD7,0x17,0x01,0x26,0xEA,0xEA,0x00,0xA3,0xEA,0xEA,0x00,0xA1, +0xE4,0x00,0x97,0x62,0xE4,0x00,0x97,0xCE,0xE4,0x00,0x97,0x92,0xEC,0x0A,0x00,0xA3, +0xEC,0x0A,0x00,0xA1,0xE4,0x00,0x05,0xD9,0xE4,0x00,0x96,0xC0,0x5C,0x63,0x00,0x20, +0x63,0x66,0xE4,0x00,0x96,0x14,0x5C,0x63,0x00,0x20,0x63,0x0C,0xEA,0xEA,0x00,0xA3, +0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x95,0x8E,0xEA,0xEA,0x00,0xA3, +0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xE7,0xFF,0xFF,0x47,0x13,0x17,0x00, +0xD3,0x01,0x04,0x26,0x0A,0xEA,0x19,0xD2,0xE1,0x0A,0x06,0xFE,0xEA,0x00,0xAC,0xEE, +0xEA,0x00,0xA8,0x12,0xEB,0x00,0x22,0xE0,0x4A,0x9A,0xE8,0x53,0x00,0x52,0xFA,0xEA, +0x00,0xB4,0x9A,0xE8,0xE4,0x00,0x00,0x21,0x9A,0xE8,0x53,0x00,0x62,0xFA,0xEA,0x00, +0xB4,0x52,0xE0,0x80,0x1F,0x20,0x81,0xFB,0x2A,0x00,0xAC,0x13,0x2B,0x00,0xFB,0x2A, +0x00,0xAD,0xFB,0x0A,0x00,0xAE,0xF8,0x0A,0x00,0xAF,0x5E,0xF7,0x00,0xFA,0xEA,0x00, +0xB0,0xF8,0x0A,0x00,0xB1,0xF8,0x0A,0x00,0xB2,0xC2,0xE0,0x10,0x01,0xF8,0x0A,0x00, +0xB3,0xEB,0x17,0x00,0xD1,0xC7,0x18,0xFF,0xFD,0xEF,0x17,0x00,0xD1,0x12,0xEC,0x00, +0x52,0xF7,0x01,0x9B,0x01,0x1A,0xEC,0x00,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x08,0x85, +0xE4,0x00,0x01,0x8F,0x13,0x17,0x00,0x23,0x09,0x4A,0x0B,0x0A,0x19,0xD3,0x02,0x05, +0xD6,0x12,0xF7,0x01,0x22,0xE0,0x4A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9,0x18, +0x17,0x00,0xE4,0x00,0x00,0x29,0x22,0xE4,0x5E,0xC2,0xF4,0x00,0x01,0x9B,0x01,0xCA, +0xF7,0x3D,0xF9,0x1B,0x17,0x00,0x12,0xF7,0x00,0xE4,0x00,0x00,0x2D,0xD2,0xE2,0x04, +0x56,0xC3,0x14,0x00,0x01,0xCB,0x18,0x3D,0xF9,0x1A,0xF8,0x00,0x12,0xF8,0x00,0x5E, +0xF7,0x00,0x1A,0xEB,0x00,0xE4,0x00,0x00,0xE5,0x13,0x17,0x00,0x5F,0x04,0x09,0x20, +0x00,0x99,0x0B,0x0A,0x19,0x23,0x0D,0x8A,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9, +0x40,0x46,0xF7,0xC5,0xC2,0xEB,0x54,0xA4,0x20,0x01,0x3D,0x12,0xED,0x00,0x52,0xF7, +0x03,0xE4,0x00,0x00,0x87,0x13,0x17,0x00,0x5F,0x04,0x29,0x20,0x06,0x95,0x0B,0x0A, +0x19,0x23,0x0C,0xDA,0x13,0x37,0x01,0x13,0x17,0x02,0x4E,0xF9,0x40,0x46,0xF7,0xC5, +0xC3,0x00,0x10,0x01,0xEE,0xF8,0x00,0xC4,0x12,0xED,0x00,0x57,0x37,0x01,0x23,0x20, +0x64,0xEF,0x18,0x00,0xC6,0x23,0x00,0x32,0x9B,0x1B,0x46,0xF7,0xC4,0xE4,0x00,0x00, +0x0F,0x52,0xF7,0x04,0x1A,0xED,0x00,0x0C,0x0A,0x00,0x0C,0x0A,0x19,0xE4,0x00,0x02, +0xC7,0xE4,0x00,0x93,0x3C,0x5C,0x63,0x00,0xD0,0x60,0x0A,0xC2,0xE4,0x00,0x94,0x7E, +0xE4,0x00,0x94,0x42,0x50,0x60,0x20,0xE4,0x00,0x03,0xA2,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x3D,0xF9,0x12,0xF7,0x00,0x1A,0xEB,0x00,0x12,0xEB,0x00,0x22,0xE0,0x4E,0x12, +0xED,0x00,0x56,0xF7,0x01,0x5E,0xE0,0x09,0x49,0xA4,0x43,0xE4,0x00,0x00,0x43,0x12, +0xEB,0x00,0x22,0xE4,0x2A,0x51,0xA0,0x80,0xE4,0x00,0x00,0x29,0x12,0xEB,0x00,0x22, +0xEB,0xD8,0x12,0xEB,0x00,0x22,0xEF,0xC0,0xC9,0xA0,0xFF,0xFF,0xEE,0xEA,0x00,0xA6, +0x22,0xE4,0x2E,0xED,0xAA,0x00,0xA1,0xEC,0x0A,0x00,0xA4,0xE4,0x00,0x93,0x8C,0xEA, +0xEA,0x00,0xA1,0xD5,0xB7,0x00,0x71,0x12,0xEC,0x00,0x56,0xF7,0x01,0xD2,0xE0,0x05, +0x22,0xC2,0xE0,0x10,0x01,0xF3,0x17,0x08,0xB0,0x23,0x00,0x24,0x9F,0x1F,0xFB,0x17, +0x08,0xB0,0xEC,0x0A,0x00,0xA3,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x2C,0xF1, +0xAA,0x00,0xB4,0xE4,0x00,0x00,0xAD,0xE9,0xAA,0x00,0xA1,0xE4,0x00,0x00,0x9D,0x12, +0xEB,0x00,0x22,0xE0,0x42,0x12,0xEC,0x00,0x56,0xF7,0x01,0x22,0xE0,0x56,0xE4,0x00, +0x00,0x3D,0xE4,0x00,0x91,0x6E,0x5C,0x63,0x00,0x20,0x63,0xE4,0xE7,0xFF,0xFF,0xD3, +0xEA,0xEA,0x00,0xA3,0xEF,0x0A,0x00,0xAA,0xE4,0x00,0x00,0x17,0xEA,0xEA,0x00,0xA3, +0x0F,0x0A,0x1E,0x8E,0xF8,0x10,0x77,0x00,0xE4,0x00,0x90,0xEE,0xEA,0xEA,0x00,0xA3, +0x9E,0xE1,0x5E,0xF7,0x04,0xEE,0xEA,0x00,0xA3,0xEA,0xEA,0x00,0xA3,0xD6,0xED,0xFD, +0x96,0xE4,0x00,0x92,0x94,0xE4,0x00,0x92,0x58,0xEC,0x0A,0x00,0xA1,0xEC,0x0A,0x00, +0xA3,0xE4,0x00,0x00,0x45,0x98,0x60,0x9D,0x61,0xE4,0x00,0x90,0x8C,0xE4,0x00,0x00, +0x0D,0x99,0x60,0xD5,0xAB,0xFF,0x95,0xE4,0x00,0x92,0x48,0xE4,0x00,0x92,0x0C,0xEC, +0x0A,0x00,0xA1,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xD1,0x53,0x18,0x02,0xEF,0x17, +0x00,0xD1,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x85,0xC3,0x00,0x32,0x0A,0x20,0x00, +0x49,0x13,0x0C,0x00,0x9B,0x3E,0xEC,0x17,0x08,0x85,0x47,0x18,0xCC,0x1B,0x0C,0x00, +0x0E,0x01,0x02,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D, +0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0xE4,0x00,0x98,0xC0,0x98,0x60,0x88,0x83,0xE4,0x00,0x95,0xF2,0x98,0x61, +0x98,0x82,0xE4,0x00,0x95,0xE2,0x98,0x60,0xFC,0x80,0x18,0x08,0xE4,0x00,0x91,0xCE, +0x98,0x61,0xFC,0x80,0x18,0x08,0xE4,0x00,0x93,0x34,0x0D,0x21,0x06,0x9C,0x28,0xE4, +0x00,0x9B,0x8B,0x20,0x64,0x1E,0xE4,0x00,0x9C,0xB5,0xE4,0x00,0x9C,0xD3,0x9C,0x38, +0x0D,0x21,0x04,0xE4,0x00,0x9C,0xE8,0x0D,0x21,0x06,0x9C,0x28,0xE4,0x00,0x9C,0xAF, +0xE4,0x00,0x9E,0xA7,0xE4,0x00,0x9F,0x0F,0xE4,0x00,0x9F,0x6B,0xE4,0x00,0xA3,0x49, +0xE4,0x00,0xA0,0xB3,0xE4,0x00,0x9F,0xB7,0xE4,0x00,0x9F,0xED,0xE4,0x00,0xA0,0x23, +0xE4,0x00,0xA0,0x47,0xE4,0x00,0xA0,0x6B,0xE4,0x00,0x9E,0xA1,0xE4,0x00,0xA0,0x99, +0x20,0x60,0x28,0x20,0x64,0x3E,0xE4,0x00,0x00,0x11,0xE4,0x00,0xA1,0x35,0xE4,0x00, +0xA1,0x4F,0x85,0x29,0xE4,0x00,0xA1,0x65,0xC2,0xE0,0x10,0x01,0xE8,0x77,0x00,0xBB, +0xEB,0x17,0x00,0xBB,0xD4,0x78,0xFF,0xC6,0x85,0x29,0xE4,0x00,0xA4,0x05,0xC3,0x34, +0x00,0x01,0xCA,0xF9,0x23,0xFC,0x0A,0xF7,0x00,0xD2,0xFF,0x04,0x3C,0xC3,0x00,0x10, +0x01,0xF2,0xF8,0x07,0x6E,0x9E,0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x07,0x6E,0x22,0xE1, +0xCA,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10,0x01,0xFF,0x18,0x01,0xBE,0xCA,0xE0,0x11, +0x7D,0xCB,0x39,0x22,0x00,0xFF,0x7B,0x09,0x6C,0x1F,0x57,0xFD,0x57,0x5A,0xFF,0x4F, +0x5A,0x10,0x8F,0x59,0x0B,0x9A,0x01,0x4F,0x97,0x08,0x8F,0x9B,0xEB,0x9C,0xDD,0x3B, +0x0F,0x9A,0x01,0x5F,0x57,0x00,0x5F,0x4F,0xE9,0x57,0x57,0xFF,0x4F,0x5A,0x10,0x8F, +0x59,0x0B,0x9A,0x01,0x20,0x00,0x6D,0xFF,0xA0,0x80,0x00,0x5F,0x9C,0x04,0x47,0x9C, +0xEC,0x0B,0xB8,0x01,0xC7,0xBD,0x7F,0xFF,0x47,0x9C,0xED,0xE4,0x00,0x00,0x0F,0x0B, +0x98,0x01,0x0F,0x9A,0x01,0x9E,0xE1,0x9F,0x02,0xC2,0xE2,0x30,0x04,0x23,0xFE,0xB1, +0x85,0x29,0x5C,0x63,0x04,0xE4,0x00,0xA2,0xD7,0x9A,0xE0,0x8B,0x17,0xE4,0x00,0x00, +0x1D,0x43,0x23,0xBC,0x9E,0xE1,0x13,0x39,0x00,0x8F,0x19,0xD4,0x97,0xFF,0xB4,0x40, +0x60,0xC5,0x85,0x29,0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFD,0x90,0x98, +0x61,0xE7,0xFF,0xFD,0x84,0x98,0x6F,0xE7,0xFF,0xFE,0x3A,0x0D,0x21,0x06,0x98,0x60, +0x9C,0x28,0xE7,0xFF,0xFD,0x63,0x9C,0x38,0xC2,0xE0,0x10,0x01,0x0D,0x21,0x04,0xEC, +0x17,0x08,0x83,0x0D,0x41,0x00,0xC2,0xE0,0x10,0x01,0x50,0x60,0x80,0xF2,0xF7,0x00, +0xB8,0x22,0xE0,0x52,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xC0,0x56,0xF7,0x01,0x5E, +0xE0,0x09,0x48,0x64,0x43,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00,0xD1,0x56,0xF7,0x02, +0x22,0xE0,0x6C,0xC0,0x80,0x10,0x01,0xFC,0x84,0x07,0x70,0xE7,0xFF,0xF1,0xEE,0xEA, +0xEA,0x00,0xD1,0xC6,0xF7,0xFF,0xFD,0xEE,0xEA,0x00,0xD1,0x0D,0x41,0x02,0x0D,0x21, +0x06,0x9C,0x28,0xE7,0xFF,0xFF,0x03,0x9C,0x30,0xC3,0x00,0x10,0x01,0x0D,0x21,0x0C, +0xFC,0x98,0x07,0x70,0x0D,0x41,0x08,0x8A,0xE4,0x8B,0x24,0x18,0x17,0x00,0xC3,0x00, +0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0xF2,0xD6,0xF8,0xFF,0x9E,0x52,0xE0,0x62,0x1F, +0x19,0x1F,0x1A,0xE4,0x00,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x07,0x71,0x18,0x17,0x00, +0x9E,0xE1,0xD7,0x17,0xFF,0xDE,0x1E,0xE0,0x9E,0xC3,0x60,0x10,0x01,0x1A,0xE4,0x1F, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF8,0x12,0xF7,0x00,0xFA,0xFB,0x07,0x6F,0xF2, +0xFB,0x07,0x6F,0x22,0xEC,0xCC,0xC2,0xE0,0x10,0x01,0xC3,0x40,0x10,0x01,0xF3,0xB7, +0x0B,0x7A,0x9B,0x00,0xC2,0xE0,0x10,0x01,0xC3,0xC0,0x10,0x01,0xC1,0x00,0x10,0x01, +0xFE,0xF7,0x07,0x90,0xFF,0x5A,0x09,0xA8,0x8B,0x38,0xFF,0xDE,0x0C,0xF6,0xFD,0x08, +0x09,0x6C,0xE4,0x00,0x01,0x09,0xC3,0x80,0x10,0x01,0x9A,0xE0,0xFF,0x9C,0x0B,0x64, +0x8B,0x64,0x43,0x17,0xE4,0x0B,0x38,0x00,0x43,0x17,0xDC,0x4F,0x59,0x42,0x1B,0x38, +0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0xA5,0x0C,0x81,0x04,0x50, +0x60,0x20,0xE7,0xFF,0xFB,0x9C,0xC1,0x40,0x10,0x01,0xEA,0xEA,0x00,0xD1,0x0C,0x81, +0x06,0x56,0xF7,0x02,0x22,0xE1,0x74,0xE4,0x00,0x00,0x8F,0xF3,0x9B,0x07,0x6F,0x23, +0x84,0x34,0x23,0x88,0x68,0x43,0x98,0x44,0xE4,0x00,0x00,0x0F,0x43,0x98,0xF4,0x15, +0x5C,0x01,0x19,0x57,0x00,0x0B,0x9C,0x01,0xE4,0x00,0x00,0x21,0x0F,0x9A,0x02,0x4D, +0x5C,0x82,0x4F,0x9C,0x42,0x19,0x57,0x00,0x1B,0x97,0x01,0x9F,0x21,0x9F,0x02,0x5F, +0x39,0x04,0x9E,0xE2,0x9F,0x44,0xD7,0xB9,0xFE,0x2D,0xE7,0xFF,0xFF,0x45,0x50,0x60, +0x80,0xE7,0xFF,0xEF,0x82,0xEA,0xEA,0x00,0xD1,0xC6,0xF7,0xFF,0xFD,0xEE,0xEA,0x00, +0xD1,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xFC,0x95,0xC2,0xE0, +0x10,0x01,0xC3,0x00,0x10,0x01,0xF0,0x77,0x0B,0xF0,0xC3,0x20,0x10,0x01,0xC2,0xE0, +0x10,0x01,0xFF,0x18,0x0C,0x02,0xFE,0xF7,0x07,0xF8,0xFF,0x39,0x08,0x00,0x9B,0x60, +0x98,0x81,0xE4,0x00,0x01,0x7D,0x0B,0x57,0x01,0xC3,0x4F,0xFF,0xE0,0x20,0x00,0x35, +0x0B,0x57,0x03,0xC3,0x4F,0xFF,0xE4,0x20,0x00,0x49,0x0B,0x58,0x01,0x18,0x19,0x00, +0x0F,0x57,0x01,0x0B,0x58,0x03,0x0F,0x57,0x03,0x13,0x59,0x00,0x23,0x41,0x22,0x0B, +0x98,0x03,0x0B,0x57,0x03,0x43,0x5C,0xD5,0x5F,0x5A,0x06,0x4F,0xDA,0xFA,0x0B,0xB8, +0x01,0x47,0x5E,0xD6,0x09,0x17,0x01,0x43,0x5A,0xF5,0x41,0x1D,0x45,0x5D,0x08,0x06, +0x4F,0xC8,0xFA,0x45,0x1E,0x46,0x43,0xC8,0xF5,0x8F,0xDA,0x5F,0xCC,0x99,0x20,0x00, +0x25,0x5F,0x46,0x51,0x20,0x01,0x11,0x18,0x99,0x00,0x0F,0xB7,0x01,0x0F,0x97,0x03, +0xE4,0x00,0x00,0x71,0x0B,0x98,0x01,0x0B,0xD7,0x01,0x43,0xDC,0xF5,0x5F,0xDE,0x06, +0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x0B,0x58,0x03,0x41,0x1E,0xED,0x0B,0xD7,0x03,0x43, +0xDA,0xF5,0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43,0xBD,0xF5,0xD7,0xA8, +0x00,0x52,0x0F,0x97,0x01,0x0F,0x57,0x03,0x0B,0x57,0x01,0x9F,0x61,0x0F,0x58,0x01, +0x5F,0x7B,0x00,0x0B,0x57,0x03,0x9F,0x21,0x0F,0x58,0x03,0x9E,0xE4,0x1F,0x18,0x30, +0xD7,0x63,0xFA,0x36,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3D,0xF9,0x1C,0x21, +0xE0,0xCA,0xF7,0x3D,0xF8,0x0D,0x41,0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1, +0x0C,0x0D,0xC1,0x08,0x0D,0xE1,0x04,0x0E,0x01,0x00,0x0D,0x21,0x1C,0xC1,0x80,0x10, +0x01,0xFD,0x8C,0x08,0xE6,0x0A,0x0C,0x01,0xC6,0x10,0x7F,0xFF,0x0E,0x0C,0x01,0x13, +0x38,0x00,0xC3,0x00,0x10,0x01,0xFB,0x38,0x00,0xB8,0x13,0x37,0x00,0xC2,0xE0,0x10, +0x01,0xFB,0x37,0x07,0x6F,0xC1,0xA0,0x10,0x01,0xC1,0xC0,0x10,0x01,0xC3,0x60,0x10, +0x01,0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFD,0xAD,0x07,0xF4,0xFD,0xCE,0x09,0x6C, +0xFD,0xE0,0x80,0x00,0xFD,0x5B,0x07,0x70,0xFD,0x7A,0x0B,0xF0,0xD0,0x61,0x14,0x46, +0x0B,0x2B,0x16,0x0A,0xEB,0x18,0x45,0xF0,0x7D,0x0E,0xEB,0x17,0x0D,0xEC,0x01,0x0F, +0x2B,0x19,0x13,0x0B,0x00,0xD3,0x01,0x1F,0x61,0x0B,0x6B,0x46,0x0B,0x0B,0x48,0x0F, +0x6B,0x49,0x0F,0x0B,0x47,0xD7,0x17,0x1F,0x34,0x0E,0xEB,0x47,0x0F,0x0B,0x17,0x0F, +0x2B,0x49,0x0F,0x6B,0x19,0xE4,0x00,0x07,0xAD,0xC2,0xE0,0x10,0x01,0x5F,0x98,0x04, +0xEA,0xF7,0x0B,0x81,0x5F,0x17,0x15,0x4A,0xFC,0xB8,0x0E,0xEB,0x13,0xCF,0x39,0x00, +0x30,0x9A,0xE0,0x8F,0x2B,0x0B,0x19,0x18,0x27,0x1C,0x50,0xC2,0xE0,0x10,0x01,0x5F, +0x38,0x04,0xEA,0xF7,0x0B,0x83,0x5F,0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB,0x15,0xCE, +0xFB,0x00,0x30,0x8E,0xEB,0x0B,0x17,0x16,0x9A,0xE0,0x27,0x1C,0x50,0xC2,0xE0,0x10, +0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x81,0x5F,0x17,0x15,0x4A,0xF9,0xB8,0x0E,0xEB, +0x43,0xCF,0x7B,0x00,0x30,0x9A,0xE0,0x8F,0x6B,0x0B,0x1B,0x18,0x27,0x1C,0x50,0xC2, +0xE0,0x10,0x01,0x5F,0x38,0x04,0xEA,0xF7,0x0B,0x83,0x5F,0x17,0x15,0x4A,0xF9,0xB8, +0x0E,0xEB,0x45,0xE4,0x00,0x00,0x63,0xC3,0x00,0x10,0x01,0x5F,0x77,0x04,0xEB,0x18, +0x0B,0x81,0x5E,0xF8,0x15,0x4B,0x1B,0xC0,0x0F,0x0B,0x13,0x9A,0xE0,0x27,0x3C,0x50, +0xC2,0xE0,0x10,0x01,0x5F,0x19,0x04,0xEA,0xF7,0x0B,0x83,0x5F,0x37,0x15,0x4A,0xF8, +0xB8,0x0E,0xEB,0x15,0xE7,0xFF,0xFB,0x74,0xC2,0xE0,0x10,0x01,0x13,0x0B,0x00,0xFE, +0xF7,0x0C,0x04,0x9B,0x20,0x9B,0x4C,0xFF,0x60,0x07,0xF9,0xE4,0x00,0x00,0x47,0x0B, +0x97,0x01,0xD3,0x8B,0x00,0x3D,0x0F,0x57,0x01,0x0B,0x97,0x01,0xC3,0x80,0xFF,0x2A, +0x20,0x00,0x19,0x0F,0x77,0x01,0x9F,0x21,0x1E,0xF7,0x30,0x5F,0x39,0x04,0xD7,0x19, +0xFF,0x0D,0x27,0x04,0x7D,0x0B,0x2B,0x43,0x0A,0xEB,0x13,0x42,0xF9,0xBD,0x0B,0x2B, +0x45,0x0E,0xEB,0x1B,0x0A,0xEB,0x15,0x42,0xF9,0xBD,0x0E,0xEB,0x1D,0xE4,0x00,0x00, +0x15,0x0C,0x0B,0x1B,0x0C,0x0B,0x1D,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xB8,0x22, +0xE1,0x9E,0x52,0xE0,0x52,0x0B,0x2B,0x13,0x1A,0xEA,0x00,0x4F,0x79,0x41,0x0A,0xEB, +0x15,0x4F,0x7B,0x20,0x4F,0x57,0x41,0x1B,0x2A,0x02,0x57,0x5A,0x0F,0x1A,0xEA,0x03, +0x47,0x5B,0xD5,0x1B,0x4A,0x01,0x27,0x04,0xA1,0x0B,0x0B,0x1A,0x0A,0xEB,0x1C,0x4F, +0x38,0x42,0x4F,0x57,0x42,0x5F,0x39,0x04,0x57,0x5A,0x0F,0x4F,0x39,0x20,0x1B,0x0A, +0x05,0x47,0x39,0xD5,0x1A,0xEA,0x06,0x1B,0x2A,0x04,0xE4,0x00,0x00,0x1B,0x18,0x0A, +0x04,0x18,0x0A,0x05,0x18,0x0A,0x06,0x88,0x6A,0x98,0x87,0xE7,0xFF,0xF6,0x3C,0x18, +0x6A,0x07,0xE4,0x00,0x01,0x8B,0x8A,0xEA,0x18,0x17,0x00,0xC3,0x20,0x10,0x01,0x9E, +0xE1,0xFF,0x39,0x07,0xF2,0xD6,0xF9,0xFF,0x9E,0x52,0xE0,0x62,0x1A,0xEA,0x00,0x0A, +0xEB,0x13,0x4F,0x37,0x41,0x1A,0xEA,0x02,0x0A,0xEB,0x15,0x1B,0x2A,0x01,0x1A,0xEA, +0x04,0x4F,0x37,0x41,0x56,0xF8,0x01,0x4F,0x18,0x20,0x52,0xF7,0x20,0x53,0x18,0x02, +0x1A,0xEA,0x11,0x1B,0x0A,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B, +0x0A,0x0D,0x0A,0xEB,0x1C,0x4F,0x17,0x42,0x1B,0x2A,0x03,0x1B,0x0A,0x0F,0x1A,0xEA, +0x10,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF5,0x66,0xC2,0xE0,0x10,0x01,0xC3,0x20, +0x10,0x01,0xC3,0x80,0x10,0x01,0x18,0x6A,0x1F,0xFE,0xF7,0x07,0x90,0xFF,0x39,0x09, +0xA8,0x9B,0x00,0xC3,0x60,0x10,0x01,0xFF,0x9C,0x0C,0xF6,0xF3,0x5B,0x07,0x6F,0x23, +0x44,0x34,0x23,0x48,0x68,0x43,0x58,0x74,0xE4,0x00,0x00,0x0F,0x43,0x58,0xE4,0x17, +0xBA,0x01,0x1B,0xB7,0x00,0x0B,0x5A,0x01,0xE4,0x00,0x00,0x21,0x0F,0x59,0x02,0x4F, +0xBA,0x82,0x4F,0x5A,0x42,0x1B,0xB7,0x00,0x1B,0x57,0x01,0x9F,0x02,0x9E,0xE2,0x9F, +0x24,0x5F,0x07,0x49,0x23,0xFF,0x1D,0x0A,0xEC,0x00,0xD2,0xFF,0x0D,0x9C,0x9A,0xE1, +0xE4,0x00,0x02,0xF5,0xD0,0x60,0x05,0x66,0xFE,0xE0,0x7F,0xFF,0xC3,0x20,0x10,0x01, +0xC3,0x40,0x10,0x01,0xEE,0xF9,0x07,0xF9,0xF8,0x1A,0x08,0x00,0xFF,0x39,0x07,0xF8, +0xFF,0x5A,0x08,0x00,0x0E,0xF9,0x03,0x0E,0xF9,0x05,0x0E,0xF9,0x07,0x18,0x1A,0x01, +0xF2,0xF8,0x00,0xB8,0x22,0xE0,0xB2,0x52,0xE0,0x52,0x1A,0xEA,0x00,0x9A,0xFF,0x88, +0x6A,0x1A,0xEA,0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x05, +0x1A,0xEA,0x06,0x98,0x87,0xE7,0xFF,0xF3,0xE8,0x18,0x6A,0x07,0xE4,0x00,0x00,0x89, +0x8A,0xEA,0x18,0x17,0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0xF2,0xD6, +0xF8,0xFF,0x9E,0x52,0xE0,0x62,0x9B,0x1F,0x1A,0xEA,0x00,0xC2,0xE0,0x10,0x01,0xFE, +0xF7,0x07,0x71,0x1B,0x17,0x00,0xC3,0x20,0x10,0x01,0x9E,0xE1,0xFF,0x39,0x07,0x8F, +0xD6,0xF9,0xFF,0x9E,0x88,0x6A,0x50,0x80,0x1F,0xE7,0xFF,0xF3,0x60,0x18,0x6A,0x1F, +0x0A,0xEC,0x01,0x0C,0x0D,0x00,0x45,0xEF,0xBD,0x0D,0xEC,0x01,0xE4,0x00,0x02,0x03, +0xD0,0x62,0x07,0xEE,0xF2,0xF8,0x00,0xB8,0x22,0xE0,0xD2,0x52,0xE0,0x52,0xC3,0x00, +0x10,0x01,0x1A,0xEA,0x00,0xEB,0x18,0x08,0x83,0x9A,0xFF,0x1B,0x0A,0x05,0x1A,0xEA, +0x01,0x1A,0xEA,0x02,0x1A,0xEA,0x03,0x1A,0xEA,0x04,0x1A,0xEA,0x06,0x88,0x6A,0x98, +0x87,0xE7,0xFF,0xF2,0xD0,0x18,0x6A,0x07,0xE4,0x00,0x01,0x15,0x8A,0xEA,0x18,0x17, +0x00,0xC3,0x00,0x10,0x01,0x9E,0xE1,0xFF,0x18,0x07,0xF2,0xD6,0xF8,0xFF,0x9E,0x52, +0xE0,0x62,0x1A,0xEA,0x00,0x0A,0xEB,0x13,0x4F,0x17,0x41,0x1A,0xEA,0x02,0x1B,0x0A, +0x01,0x0A,0xEB,0x15,0x4F,0x17,0x41,0x1A,0xEA,0x04,0x1B,0x0A,0x03,0x12,0xEB,0x00, +0x57,0x17,0x01,0x4E,0xF7,0x20,0x53,0x18,0x20,0x52,0xF7,0x02,0x1B,0x0A,0x11,0x1A, +0xEA,0x12,0x0A,0xEB,0x1A,0x4F,0x17,0x42,0x1A,0xEA,0x0E,0x1B,0x0A,0x0D,0x0A,0xEB, +0x1C,0x4F,0x17,0x42,0x1A,0xEA,0x10,0x1B,0x0A,0x0F,0x88,0x6A,0x50,0x80,0x1F,0xE7, +0xFF,0xF1,0xF4,0x9A,0xE0,0x18,0x6A,0x1F,0x43,0x17,0x74,0x0B,0x38,0x00,0x43,0x17, +0x54,0x4F,0x59,0x42,0x1B,0x38,0x21,0x1B,0x58,0x20,0x9E,0xE2,0x5E,0xE7,0x49,0x23, +0xFF,0xA5,0x45,0xF0,0x7D,0x9A,0xE2,0x0D,0xEC,0x01,0x0E,0xED,0x00,0xE4,0x00,0x00, +0x61,0x9B,0x00,0xD2,0xFF,0xE6,0x28,0xE7,0xFF,0xF9,0x61,0x0A,0xEB,0x46,0x0B,0x0B, +0x16,0x5E,0xF8,0x15,0x4B,0x21,0x01,0xCE,0xF9,0x00,0x30,0x8E,0xEB,0x4B,0x60,0x0A, +0x0B,0x17,0x16,0x9A,0xE0,0xD3,0x1F,0xE0,0xA4,0xE7,0xFF,0xF8,0x43,0x0E,0x01,0x02, +0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D,0x81,0x12,0x0D,0x61,0x16,0x0D, +0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0x85,0x29,0x5C,0x63,0x00,0xCF,0x03,0x00, +0x34,0xCE,0xE3,0x00,0x68,0x1C,0x21,0xC0,0xC0,0x80,0x10,0x01,0x0D,0x21,0x3C,0x1C, +0x61,0x04,0xFC,0x84,0x09,0x38,0xC0,0xA0,0x10,0x01,0x8C,0x98,0xFC,0xA5,0x0A,0xFC, +0x50,0xC0,0x1A,0x8C,0xB7,0xE4,0x00,0x2A,0x3C,0x0D,0x21,0x3E,0x1C,0x21,0x40,0x85, +0x29,0x1C,0x21,0xD0,0x0D,0x41,0x28,0x0D,0x81,0x20,0x5D,0x43,0x00,0x5D,0x84,0x00, +0x42,0xEC,0x55,0x9E,0xE1,0x5E,0xF7,0x00,0x57,0x17,0x03,0x4E,0xF7,0x11,0x5F,0x00, +0x09,0x0D,0x61,0x24,0x0D,0xA1,0x1C,0x0D,0xC1,0x18,0x49,0xA1,0x01,0x0D,0x21,0x2C, +0x8D,0xB7,0xC1,0xD8,0x00,0x21,0xE4,0x00,0x6A,0xBA,0x99,0x60,0xFD,0xCE,0xB9,0xDF, +0xE4,0x00,0x00,0xE3,0x88,0x61,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xC1,0x5A, +0x9A,0xE4,0x43,0x0E,0x54,0x13,0x58,0x00,0x1F,0x01,0x18,0x4F,0x3A,0x09,0x57,0x5A, +0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50,0x7B,0x47,0x5A,0xC4,0x5F, +0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x61,0x18,0x47,0x18, +0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x9D,0x41,0x5D,0x4A,0x00,0xD5,0x4C,0x00,0xE1,0x06, +0xE0,0x81,0xCC,0x6B,0x00,0x18,0x88,0x81,0x8C,0x77,0x50,0xA0,0x18,0x9D,0x61,0xE7, +0xFF,0xC1,0x94,0xE4,0x00,0x00,0x1D,0x9E,0xE1,0xD2,0xE8,0xFD,0x4E,0xE7,0xFF,0xFF, +0xC5,0x5E,0xEB,0x00,0xD5,0xB7,0xFC,0x85,0xE4,0x00,0x69,0xDC,0x0D,0x21,0x2E,0x0D, +0xC1,0x1A,0x0D,0xA1,0x1E,0x0D,0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x1C,0x21, +0x30,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x77,0x01,0x62,0x85,0x29,0xC2,0xE0,0x10, +0x01,0xEC,0x77,0x08,0x56,0x85,0x29,0x1C,0x21,0xC8,0x0D,0x21,0x34,0x0D,0x41,0x30, +0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0xD0,0x69,0x15,0xE5, +0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xC1,0x98,0x00,0x21,0xFE,0xF7,0xB9,0x2C,0xC1, +0x78,0x00,0x21,0x8E,0xF8,0xFD,0x8C,0xB9,0xDC,0x0E,0xF7,0x02,0x05,0xA0,0x81,0xFD, +0x6B,0xB9,0xDF,0x86,0xE9,0x1C,0x83,0x01,0xCC,0x63,0x00,0x1A,0xCC,0x84,0x00,0x1A, +0x9C,0x9F,0xE7,0xFF,0xFD,0x9E,0xE4,0x00,0x05,0x05,0x0C,0x61,0x04,0xE4,0x00,0x68, +0xAC,0x0C,0x61,0x06,0x99,0x40,0x9C,0x7E,0x5C,0x63,0x00,0xCC,0x63,0x00,0x1A,0x8D, +0x63,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xBF,0x3E,0x8B,0x0A, +0x9A,0xE4,0x5F,0x03,0x39,0x20,0x00,0xDD,0x43,0x2B,0xC4,0x13,0x79,0x00,0x1F,0x21, +0x20,0x4F,0x5B,0x09,0x57,0x7B,0x01,0x8F,0x3A,0x17,0x39,0xE8,0x5F,0x60,0x01,0x4B, +0x70,0x7B,0x47,0x7B,0xCC,0x5F,0x37,0x02,0x20,0x00,0x25,0x4F,0x37,0x20,0x5F,0x39, +0x02,0x1D,0x01,0x20,0x47,0x39,0xDD,0x8F,0x48,0x1B,0x3A,0xE8,0x9F,0x01,0x9E,0xE1, +0xD2,0xE8,0xFE,0x16,0xCC,0x6A,0x00,0x06,0x1C,0x81,0x08,0x8C,0x6D,0x50,0xA0,0x18, +0xE7,0xFF,0xBF,0x72,0x9D,0x44,0x5D,0x43,0x89,0x23,0xFE,0x61,0xE4,0x00,0x01,0x99, +0xE4,0x00,0x67,0xA6,0x1C,0x61,0x08,0x50,0x80,0x22,0x50,0xA0,0x18,0xE7,0xFF,0xBE, +0x58,0x9A,0xE4,0xD2,0xE7,0x01,0xC2,0x43,0x0C,0xBC,0x13,0x58,0xFC,0x1F,0x01,0x20, +0x4F,0x3A,0x09,0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50, +0x7B,0x47,0x5A,0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02, +0x1F,0x61,0x20,0x47,0x18,0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x9E,0xE1,0xD2,0xE8,0xFE, +0x36,0xE4,0x00,0x00,0xD5,0xE4,0x00,0x66,0xFC,0x1C,0x61,0x08,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xBD,0xAE,0xE4,0x00,0x00,0x9F,0x43,0x0B,0xBC,0x13,0x58,0xFC, +0x1F,0x01,0x20,0x4F,0x3A,0x09,0x57,0x5A,0x01,0x8F,0x19,0x13,0x18,0xE8,0x5F,0x40, +0x01,0x4B,0x50,0x7B,0x47,0x5A,0xC4,0x5F,0x17,0x02,0x5F,0x5A,0x02,0x20,0x00,0x25, +0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x81,0x20,0x47,0x18,0xD5,0x8F,0x3C,0x1B,0x19, +0xE8,0x9E,0xE1,0xD2,0xE8,0xFE,0x3E,0xC1,0x18,0x00,0x21,0x9D,0x64,0xFD,0x08,0xB9, +0xF7,0xD5,0x68,0x00,0x52,0x9A,0xE4,0xE7,0xFF,0xFF,0x67,0x04,0x60,0x81,0x1C,0x81, +0x08,0x50,0xA0,0x18,0xE7,0xFF,0xBD,0xCA,0xE4,0x00,0x66,0x3C,0xE4,0x00,0x02,0x59, +0xE4,0x00,0x66,0x06,0x99,0x40,0x51,0xC0,0x22,0x1C,0x61,0x08,0x50,0x80,0x22,0x50, +0xA0,0x18,0xE7,0xFF,0xBC,0xAE,0x5E,0xEA,0x00,0x22,0xE0,0xE6,0x12,0xE1,0x15,0x56, +0xF7,0x0F,0x52,0xF7,0x40,0x1A,0xE1,0x15,0x12,0xE1,0x0C,0x56,0xF7,0x0F,0x52,0xF7, +0x50,0x13,0x01,0x0E,0x1A,0xE1,0x0C,0x9A,0xF0,0x47,0x17,0xC4,0x53,0x18,0x06,0x1B, +0x01,0x0E,0x13,0x01,0x1D,0x46,0xF7,0xC4,0x52,0xF7,0x07,0x1A,0xE1,0x1D,0xE4,0x00, +0x01,0x49,0x9A,0xE4,0x43,0x0C,0xBC,0x13,0x58,0xFC,0x1F,0x01,0x20,0x4F,0x3A,0x09, +0x57,0x5A,0x01,0x8F,0x19,0x17,0x18,0xE8,0x5F,0x40,0x01,0x4B,0x50,0x7B,0x47,0x5A, +0xC4,0x5F,0x17,0x02,0x20,0x00,0x25,0x4F,0x17,0x20,0x5F,0x18,0x02,0x1F,0x61,0x20, +0x47,0x18,0xD5,0x8F,0x3B,0x1B,0x19,0xE8,0x1F,0x77,0xFD,0x9E,0xE1,0x5F,0x7B,0x00, +0xD2,0xE7,0xFE,0x26,0xE4,0x00,0x00,0xF7,0x5F,0x97,0x00,0x27,0x84,0x2B,0x11,0x1A, +0x00,0xE4,0x00,0x00,0x0F,0x11,0x19,0x00,0x4F,0xA8,0x09,0x55,0x08,0x01,0x1F,0xC1, +0x20,0x5D,0x00,0x01,0x8F,0xDD,0x49,0x10,0x7B,0x17,0x9E,0xE8,0x47,0x88,0xE4,0x1B, +0x9E,0xE8,0x8B,0xDC,0x5F,0x98,0x02,0x20,0x00,0x31,0x43,0x9B,0xBC,0x4F,0x9C,0x20, +0x5F,0x9C,0x02,0x47,0x9C,0xF5,0x1D,0x01,0x20,0x8F,0xA8,0x1B,0x9D,0xE8,0x9E,0xE1, +0x9F,0x01,0x1F,0x5A,0x15,0x5F,0x18,0x00,0x1F,0x39,0x13,0x5F,0x97,0x00,0xD4,0x7C, +0xFD,0x55,0xCC,0x6A,0x00,0x18,0x19,0xC1,0x1F,0x8C,0x6D,0x1C,0x81,0x08,0x50,0xA0, +0x18,0x9D,0x41,0xE7,0xFF,0xBB,0xAC,0xD1,0x42,0xF7,0x8A,0xE7,0xFF,0xFD,0xFD,0x98, +0x64,0x1F,0x4B,0x02,0x40,0x63,0xDD,0x1F,0x2B,0x03,0x9F,0x64,0x5C,0x63,0x00,0x5F, +0x1B,0x00,0x9A,0xE0,0xE7,0xFF,0xFE,0xE9,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81, +0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x1C, +0x21,0xE8,0x0D,0x61,0x0C,0x0D,0x21,0x14,0x0D,0x41,0x10,0x0D,0x81,0x08,0x0D,0xA1, +0x04,0x89,0x63,0xD0,0x69,0x0C,0xF5,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7, +0xB9,0x54,0x8E,0xF8,0x0E,0xF7,0x02,0x86,0xE9,0xCD,0x43,0x00,0x1A,0xC1,0xA0,0x10, +0x01,0x99,0x80,0xFD,0xAD,0x08,0x58,0x8D,0x4D,0x13,0x4A,0x01,0x13,0x2A,0x00,0x13, +0x0A,0x03,0x12,0xEA,0x02,0x4C,0x9A,0xC0,0x4C,0xB8,0xC0,0x4F,0x5A,0x80,0x4F,0x18, +0x80,0x8C,0x9A,0x8C,0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x88, +0x6C,0x8C,0x99,0x8C,0xB7,0x9D,0x81,0xE4,0x00,0x65,0x3C,0x5D,0x8C,0x00,0x9D,0x44, +0xD1,0x86,0xFE,0x4E,0x98,0x66,0x98,0x80,0x98,0xA0,0xCD,0x4B,0x00,0x1A,0x8D,0x4D, +0x10,0xCA,0x18,0xE4,0x00,0x65,0x6C,0x98,0x66,0x98,0x80,0x98,0xA1,0x10,0xCA,0x18, +0xE4,0x00,0x65,0x52,0x98,0x66,0x98,0x81,0x98,0xA0,0x10,0xCA,0x19,0xE4,0x00,0x65, +0x38,0x98,0x66,0x98,0x81,0x98,0xA1,0x10,0xCA,0x19,0xE4,0x00,0x65,0x1E,0x98,0x66, +0x98,0x82,0x98,0xA0,0x98,0xC0,0xE4,0x00,0x65,0x06,0x98,0x66,0x98,0x82,0x98,0xA1, +0x98,0xC0,0xE4,0x00,0x64,0xEE,0x98,0x66,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4,0x00, +0x64,0xD6,0x98,0x66,0xE4,0x00,0x00,0x83,0xC1,0xA0,0x10,0x01,0x99,0x40,0xFD,0xAD, +0x08,0x76,0x5D,0x8A,0x00,0x41,0x6A,0x6C,0x98,0x60,0x88,0x8C,0x98,0xA0,0x10,0xCB, +0x00,0xE4,0x00,0x64,0x90,0x98,0x60,0x88,0x8C,0x98,0xA1,0x10,0xCB,0x00,0x9D,0x41, +0xE4,0x00,0x64,0x72,0x21,0x4F,0x7A,0x98,0x60,0x98,0x83,0x98,0xA0,0x98,0xC0,0xE4, +0x00,0x64,0x54,0x98,0x60,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41, +0x12,0x0D,0x21,0x16,0x98,0x83,0x98,0xA1,0x98,0xC0,0x1C,0x21,0x18,0xE4,0x00,0x64, +0x19,0xC3,0x00,0x10,0x01,0x0D,0xA1,0x06,0xFE,0xF8,0x08,0x72,0xF3,0x38,0x08,0x72, +0x13,0x57,0x01,0x13,0x17,0x03,0x4C,0x9A,0xC0,0x12,0xF7,0x02,0x4C,0xB8,0xC0,0x4F, +0x5A,0x80,0x4F,0x18,0x80,0x8C,0x9A,0x8C,0xB8,0x8C,0x99,0x8C,0xB7,0x4F,0x39,0x40, +0x4E,0xF7,0x40,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x98, +0x60,0x8C,0x99,0x8C,0xB7,0x1C,0x21,0x18,0xE4,0x00,0x63,0x1B,0xC1,0x60,0x10,0x01, +0x99,0x40,0xFD,0x6B,0x08,0x79,0x4D,0xAA,0x11,0x55,0x8A,0x03,0x10,0xCB,0x00,0x88, +0x6D,0x88,0x8C,0x98,0xA0,0xE4,0x00,0x63,0x48,0x10,0xCB,0x00,0x88,0x6D,0x88,0x8C, +0x98,0xA1,0x9D,0x41,0xE4,0x00,0x63,0x2A,0x5D,0x4A,0x00,0x9D,0x61,0xD1,0x48,0xFE, +0xCE,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16, +0x1C,0x21,0x18,0x85,0x29,0x1C,0x21,0xE0,0x0D,0xC1,0x08,0x0D,0x21,0x1C,0x0D,0x41, +0x18,0x0D,0x61,0x14,0x0D,0x81,0x10,0x0D,0xA1,0x0C,0x0D,0xE1,0x04,0x89,0xC4,0xD0, +0x66,0x00,0xB5,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0x7C,0x4C,0x63,0x10,0x8C,0x77, +0x0E,0xE3,0x02,0x86,0xE9,0x99,0xED,0xC9,0x60,0x18,0x08,0xE4,0x00,0x02,0xBF,0x24, +0x84,0xC3,0xC2,0xE0,0x10,0x01,0xE9,0x77,0x01,0x5F,0xC2,0xE0,0x10,0x01,0xC1,0x61, +0x00,0x64,0x20,0x00,0x4D,0x9B,0x01,0x99,0xE7,0xFB,0x17,0x08,0x50,0xC9,0x60,0x20, +0x09,0xE4,0x00,0x01,0x7F,0xF8,0x17,0x08,0x50,0x99,0xE7,0xE4,0x00,0x01,0x6B,0x1E, +0xE4,0xFE,0xD2,0xE1,0x04,0xC1,0xD0,0x87,0x05,0x22,0x5D,0xC1,0x01,0xCA,0xE0,0x18, +0x08,0x49,0xE2,0x6B,0xC9,0x60,0x10,0x06,0xE4,0x00,0x00,0xDD,0xD0,0x81,0x05,0x01, +0x1E,0xE4,0xFE,0xD2,0xE1,0x05,0x19,0xD0,0x87,0x05,0x7A,0x5C,0x81,0x01,0xCA,0xE0, +0x18,0x08,0xC9,0x60,0x10,0x06,0x99,0xA0,0x49,0xE2,0x6B,0x49,0x6B,0xB8,0x89,0x4D, +0xE4,0x00,0x00,0x9B,0xD0,0x81,0x05,0x21,0x1E,0xE4,0xFE,0xD2,0xE1,0x05,0x19,0xD0, +0x87,0xFD,0xDE,0xE4,0x00,0x01,0x57,0xD0,0x81,0x05,0xC9,0x5C,0x80,0xE1,0xCA,0xE0, +0x18,0x08,0xC9,0x60,0x08,0x03,0x49,0xE1,0x6B,0x49,0x6B,0xB8,0xE4,0x00,0x01,0x55, +0xD0,0x81,0x05,0x71,0xD0,0x87,0x05,0x82,0x5C,0x81,0x01,0xCA,0xE0,0x18,0x08,0x49, +0xE2,0x6B,0xC9,0x60,0x20,0x09,0x49,0x6B,0xB8,0x99,0xA2,0x99,0x41,0x49,0x81,0x01, +0xE4,0x00,0x01,0x41,0x99,0xE1,0xE4,0x00,0x00,0xF9,0x99,0xE7,0xC9,0x60,0x18,0x08, +0x99,0xA2,0x99,0x41,0x99,0x83,0xE4,0x00,0x00,0x21,0x99,0xE1,0xC9,0x60,0x32,0x0B, +0x99,0xA2,0x99,0x41,0x99,0x80,0x98,0x60,0xE4,0x00,0x00,0xF5,0x99,0xE7,0xC9,0x60, +0x18,0x08,0xE4,0x00,0x00,0x35,0x99,0xA0,0x99,0xE7,0xC9,0x60,0x18,0x08,0x89,0x4D, +0x99,0x83,0xE4,0x00,0x00,0x21,0x99,0xE1,0xC9,0x60,0x32,0x0B,0x99,0xA0,0x99,0x80, +0x89,0x4D,0x98,0x61,0xE4,0x00,0x00,0x9D,0x99,0xE7,0xE4,0x00,0x00,0x2D,0x99,0xE7, +0xC9,0x60,0x18,0x08,0x99,0xA2,0x99,0x41,0x99,0x83,0xE4,0x00,0x00,0x21,0x99,0xE1, +0xC9,0x60,0x32,0x0B,0x99,0xA2,0x99,0x41,0x99,0x80,0x98,0x62,0xE4,0x00,0x00,0x4D, +0x99,0xE7,0xC9,0x60,0x08,0x03,0x99,0xA0,0x89,0x4D,0xE4,0x00,0x00,0x29,0x99,0xE7, +0xE4,0x00,0x00,0x0D,0x99,0xE1,0xC9,0x60,0x10,0x06,0x99,0xA2,0x99,0x41,0x99,0x80, +0x98,0x63,0xE7,0xFF,0x9D,0xAE,0x88,0x6A,0x88,0x8D,0xE4,0x00,0x75,0x92,0x88,0x6A, +0x88,0x8B,0xE4,0x00,0x60,0x6E,0x21,0xA0,0x3E,0x88,0x6A,0x88,0x8B,0xE4,0x00,0x71, +0x6C,0xE4,0x00,0x00,0x1F,0x21,0xA0,0x2C,0x88,0x6A,0x88,0x8B,0xE4,0x00,0x72,0xC8, +0x88,0x6A,0x05,0x60,0xFF,0xC9,0x6B,0xFF,0xFF,0x88,0x8B,0xE4,0x00,0x62,0xF4,0x88, +0x8B,0x88,0x6A,0xE4,0x00,0x60,0x7C,0x98,0x62,0xE4,0x00,0x5D,0xFC,0xC2,0xE0,0x10, +0x01,0x98,0x60,0xEC,0x17,0x08,0x48,0xC1,0xA0,0x10,0x01,0xEC,0x0D,0x08,0x4C,0xE4, +0x00,0x6A,0x38,0x98,0x60,0xE4,0x00,0x62,0x38,0x98,0x60,0x88,0x8B,0xE4,0x00,0x61, +0x28,0x88,0x6F,0xE4,0x00,0x5D,0x54,0x98,0x60,0xE4,0x00,0x63,0x78,0x21,0x84,0x5E, +0xED,0x8D,0x08,0x4C,0x98,0x61,0xE4,0x00,0x69,0xEA,0x98,0x63,0xE4,0x00,0x61,0xEA, +0xE4,0x00,0x00,0x2B,0x21,0x8C,0x46,0x98,0x61,0x88,0x8B,0xE4,0x00,0x60,0xCC,0x98, +0x61,0xE4,0x00,0x63,0x28,0xE4,0x00,0x67,0x0C,0x1C,0x63,0x13,0x5C,0x83,0x00,0x88, +0x6A,0x5C,0x82,0x93,0x20,0x00,0x1B,0x50,0x80,0x14,0xE4,0x00,0x64,0x2A,0x88,0x6A, +0x98,0x8C,0xE4,0x00,0x63,0x4C,0xC2,0xE0,0x10,0x01,0x88,0x6E,0xED,0xD7,0x08,0x54, +0xE7,0xFF,0xF1,0xCE,0x88,0x6E,0x0D,0xE1,0x06,0x0D,0xC1,0x0A,0x0D,0xA1,0x0E,0x0D, +0x81,0x12,0x0D,0x61,0x16,0x0D,0x41,0x1A,0x0D,0x21,0x1E,0x1C,0x21,0x20,0xE7,0xFF, +0xF7,0x63,0xC2,0xE0,0x10,0x01,0x1C,0x21,0xE8,0xEC,0x77,0x01,0x60,0x0D,0x41,0x10, +0x0D,0x61,0x0C,0x0D,0x21,0x14,0x0D,0x81,0x08,0x0D,0xA1,0x04,0x89,0x43,0xC1,0x60, +0x10,0x01,0xE7,0xFF,0xFA,0xA6,0xFD,0x6B,0x00,0xDE,0x25,0x44,0x29,0x21,0x4D,0x66, +0xE4,0x00,0x00,0x81,0x99,0x40,0xC1,0x80,0x10,0x01,0xC1,0xA0,0x10,0x01,0xF2,0xEC, +0x08,0x50,0x88,0x6A,0x98,0x80,0x22,0xE4,0x1C,0xE8,0x8D,0x08,0x11,0x9D,0x41,0xE4, +0x00,0x68,0xD2,0x5D,0x4A,0x00,0xD1,0x44,0xFF,0x46,0xE7,0xFF,0xDE,0x3C,0xC2,0xE0, +0x10,0x01,0x0C,0x6B,0x0B,0xEB,0x17,0x06,0xFF,0x53,0x18,0x20,0xE4,0x00,0x00,0x2D, +0xE7,0xFF,0xDE,0x10,0xC2,0xE0,0x10,0x01,0x0C,0x6B,0x0F,0xEB,0x17,0x06,0xFF,0x53, +0x18,0x80,0xEF,0x17,0x06,0xFF,0x0D,0xA1,0x06,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D, +0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29,0x1C,0x21,0xD0,0xC2,0xE0,0x10, +0x01,0x0D,0x41,0x28,0x0D,0xC1,0x18,0xEE,0xF7,0x00,0xDA,0x0D,0x21,0x2C,0x0D,0x61, +0x24,0x0D,0x81,0x20,0x0D,0xA1,0x1C,0x0D,0xE1,0x14,0x0E,0x01,0x10,0x0E,0x21,0x0C, +0x0E,0x41,0x08,0x0E,0x61,0x04,0x5E,0xE0,0x41,0x89,0x43,0x49,0xC1,0x01,0x24,0x64, +0x69,0x1E,0xE3,0xFE,0xD2,0xE1,0x04,0xA9,0xD0,0x67,0x04,0xC2,0xD0,0x69,0x04,0xD2, +0xD0,0x68,0x04,0xE2,0xE4,0x00,0x01,0x0B,0x51,0x60,0x1A,0x9A,0xE0,0x20,0x60,0x5C, +0x9A,0xE0,0xD1,0x45,0x00,0x92,0x9A,0xE1,0x21,0x44,0x30,0x21,0x4C,0x24,0xD1,0x46, +0x00,0x32,0x9A,0xE0,0xCE,0xF7,0x00,0x34,0xC1,0xE0,0x10,0x01,0xC2,0x00,0x10,0x01, +0xFD,0xEF,0x09,0x38,0xFE,0x10,0x08,0x12,0x99,0x80,0xC2,0x40,0x10,0x01,0xC2,0x60, +0x10,0x01,0x8D,0xF7,0x8E,0x17,0x89,0xAC,0x1E,0x2A,0xFE,0xFE,0x52,0x0B,0xE0,0xFE, +0x73,0x08,0xAA,0x88,0x6D,0x98,0x81,0x88,0xAE,0xE4,0x00,0x6D,0x18,0x42,0xEF,0x64, +0x25,0x44,0x5D,0x42,0xF0,0x64,0x26,0x24,0x45,0x42,0xEC,0x9C,0xD1,0x47,0x00,0x5A, +0xD1,0x48,0x00,0x56,0x42,0xEC,0x94,0x0C,0x77,0x01,0x9D,0xA1,0x9D,0x82,0x5D,0xAD, +0x00,0xD5,0x6D,0xFE,0x95,0xE4,0x00,0x00,0x4F,0x51,0x60,0x1A,0xE4,0x00,0x00,0x2D, +0x99,0x63,0xE7,0xFF,0xFF,0x21,0x99,0x64,0xE7,0xFF,0xFF,0x15,0x99,0x68,0xE7,0xFF, +0xFF,0x09,0x9A,0xE0,0xD1,0x42,0xFB,0x66,0xE7,0xFF,0xFE,0xF9,0x0E,0x61,0x06,0x0E, +0x41,0x0A,0x0E,0x21,0x0E,0x0E,0x01,0x12,0x0D,0xE1,0x16,0x0D,0xC1,0x1A,0x0D,0xA1, +0x1E,0x0D,0x81,0x22,0x0D,0x61,0x26,0x0D,0x41,0x2A,0x0D,0x21,0x2E,0x1C,0x21,0x30, +0x85,0x29,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x21,0x0C,0x0D,0x61,0x04,0x89,0x44,0xD0, +0x67,0x08,0x15,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0x98,0x4C,0x63,0x10,0x8C,0x77, +0xC2,0xE0,0x10,0x01,0x0F,0x03,0x02,0xFE,0xF7,0x06,0xFE,0x87,0x09,0x0B,0x17,0x01, +0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0xD0,0x88,0x06,0xD5,0x9A,0xE1,0x4E,0xF7,0x24, +0xC6,0xF7,0x01,0x83,0xD2,0xE0,0x06,0x6A,0xE4,0x00,0x01,0x6F,0x0B,0x17,0x01,0xC7, +0x18,0xFF,0xDF,0x0F,0x17,0x01,0xD0,0x88,0x05,0xDD,0x9A,0xE1,0x4E,0xF7,0x24,0xC7, +0x17,0x01,0x8C,0xD3,0x00,0x04,0xE6,0x56,0xF7,0x03,0xD2,0xE0,0x05,0x3A,0x88,0x64, +0xE7,0xFF,0xFC,0xF4,0xCE,0xEA,0x00,0x34,0xC1,0x60,0x10,0x01,0xFD,0x6B,0x09,0x38, +0x8D,0x77,0x88,0x6B,0xE7,0xFF,0xA0,0xA4,0xE7,0xFF,0xA0,0x1A,0xD0,0x60,0x04,0x2A, +0x88,0x6B,0xE7,0xFF,0xA1,0x06,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x01,0x62,0x22,0xE5, +0xCE,0xE4,0x00,0x00,0x41,0xD0,0x88,0x03,0x65,0x9A,0xE1,0x4E,0xF7,0x24,0xC7,0x17, +0x01,0x8C,0x23,0x01,0x36,0x56,0xF7,0x03,0x22,0xE1,0x64,0x88,0x6A,0xE7,0xFF,0xFC, +0x5A,0x88,0x6A,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7, +0xFF,0xEA,0x57,0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0x0F,0x17,0x01,0xD0,0x88,0x01, +0xA5,0x4F,0x04,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xB9,0xB8,0x8E,0xF8,0x0E,0xF7, +0x02,0x86,0xE9,0x98,0x67,0xE4,0x00,0x00,0x19,0x98,0x68,0xE4,0x00,0x00,0x0D,0x88, +0x6A,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0xE7,0xFF,0xFB, +0xBB,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2, +0xE0,0x10,0x01,0x98,0x60,0xFE,0xF7,0x08,0x12,0xCB,0x40,0xFF,0xFE,0x0B,0x37,0x00, +0x4F,0x19,0xFA,0x47,0x38,0xCE,0x43,0x19,0xC5,0x8C,0x78,0x5F,0x03,0x04,0xCB,0x20, +0xFF,0xFE,0x9E,0xE2,0x5C,0x79,0x17,0x48,0x78,0xD0,0xC3,0x00,0x10,0x01,0xFF,0x18, +0x08,0x46,0xD6,0xF8,0xFE,0xDE,0x85,0x29,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x04, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x08,0xC2,0xE0,0x10,0x01,0x9B,0x04,0xEC,0x17, +0x08,0x0C,0x98,0x64,0xC2,0xE0,0x10,0x01,0x98,0x80,0xEF,0x17,0x01,0x60,0xE7,0xFF, +0xF4,0x8F,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x06,0xE4,0x00,0x00, +0x41,0x20,0x68,0x3E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x0A,0xE4,0x00,0x00,0x23, +0x9A,0xE0,0x20,0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x0E,0x88,0x77,0x85, +0x29,0x20,0x64,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x08,0x04,0xE4,0x00,0x00,0x3D, +0x20,0x68,0x3E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x08,0x08,0xE4,0x00,0x00,0x1F,0x20, +0x6C,0x2E,0xC2,0xE0,0x10,0x01,0xEC,0x97,0x08,0x0C,0x85,0x29,0xC3,0x80,0x10,0x01, +0xC3,0x60,0x10,0x01,0xC3,0x40,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01, +0xFF,0x9C,0x08,0x90,0xFF,0x7B,0x08,0xD8,0xFF,0x5A,0x08,0x87,0xFF,0x39,0x0B,0xD0, +0xFF,0x18,0x08,0xC8,0x20,0x69,0x7E,0x0A,0xFC,0x04,0x0B,0xD9,0x09,0x43,0xD7,0xF5, +0x5F,0xDE,0x06,0x4F,0xBE,0xFA,0x47,0xDD,0xF6,0x43,0xBE,0xED,0xC3,0xA0,0x19,0x0C, +0x20,0x00,0x7D,0x0B,0xBC,0x07,0x0B,0x99,0x0B,0x43,0xBD,0xE5,0x5F,0xBD,0x06,0x4F, +0x9D,0xFA,0x47,0xBC,0xEE,0x43,0x9D,0xE5,0xC3,0x80,0x1F,0x48,0x20,0x05,0x1D,0x0E, +0xF8,0x01,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0x97,0x0B,0x99,0x0B,0x0E,0xF8,0x03, +0x0B,0x39,0x0F,0x12,0xFA,0x00,0x0F,0x9B,0x01,0x0F,0x3B,0x03,0x52,0xF7,0x02,0xE4, +0x00,0x01,0x59,0xC3,0xA0,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0xBD,0x08,0x8C,0xFE, +0xF7,0x0B,0xF0,0x20,0x6D,0x96,0x0B,0x79,0x01,0x0B,0xDC,0x01,0x43,0xDE,0xDD,0x5F, +0xDE,0x06,0x4F,0x7E,0xFA,0x47,0xDB,0xF6,0x43,0x7E,0xDD,0xC3,0x60,0x19,0x0C,0x20, +0x00,0x7D,0x0B,0x39,0x03,0x0B,0x7C,0x03,0x43,0x7B,0xCD,0x5F,0x7B,0x06,0x4F,0x3B, +0xFA,0x47,0x79,0xDE,0x43,0x3B,0xCD,0xC3,0x20,0x1F,0x48,0x20,0x03,0x61,0x0B,0x37, +0x17,0x0F,0x38,0x01,0x0B,0x37,0x19,0x0F,0x38,0x03,0x0B,0x37,0x47,0x0A,0xF7,0x49, +0x0E,0xF8,0x07,0x12,0xFA,0x00,0x52,0xF7,0x01,0x0F,0x38,0x05,0x1A,0xFA,0x00,0x9A, +0xE2,0x1A,0xFD,0x00,0xE4,0x00,0x01,0x5F,0xD0,0x64,0x01,0xD6,0x0B,0x3B,0x00,0x0B, +0x7B,0x02,0x43,0x79,0xDD,0x9F,0x6E,0x5F,0x63,0x9B,0x20,0x00,0x2F,0xC3,0x20,0x10, +0x01,0xEB,0x39,0x08,0xCB,0x0B,0x18,0x01,0x0F,0x17,0x47,0x9B,0x02,0x0F,0x37,0x49, +0x1B,0x17,0x00,0x12,0xFA,0x00,0x9B,0x1D,0x46,0xF7,0xC4,0x1A,0xFA,0x00,0xE4,0x00, +0x00,0xEB,0xD0,0x65,0x03,0x8E,0x13,0x7D,0x00,0x23,0x68,0xFE,0x0B,0x98,0x00,0x0B, +0x59,0x00,0x8F,0x5C,0x43,0x5A,0xD8,0x0B,0x98,0x02,0x0F,0x57,0x17,0x0B,0x59,0x02, +0x8F,0x5C,0x43,0x5A,0xD8,0x0B,0x98,0x04,0x0F,0x57,0x19,0x0B,0x59,0x08,0x8F,0x5C, +0x43,0x5A,0xD8,0x0F,0x57,0x47,0x0B,0x58,0x06,0x0B,0x19,0x0A,0x8F,0x1A,0x43,0x78, +0xD8,0x0F,0x77,0x49,0xE4,0x00,0x00,0x55,0x23,0x64,0x9A,0x0B,0x38,0x01,0x0F,0x37, +0x17,0x0B,0x38,0x03,0x0F,0x37,0x19,0x0B,0x38,0x05,0x0B,0x18,0x07,0x0F,0x37,0x47, +0x0F,0x17,0x49,0x9B,0x3E,0x13,0x1A,0x00,0x47,0x18,0xCC,0x1B,0x1A,0x00,0x9B,0x02, +0x1B,0x17,0x00,0x85,0x29,0xC3,0x00,0x10,0x01,0xFF,0x18,0x08,0x90,0xFE,0xE0,0x7F, +0xFF,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x9B,0x01,0xC3, +0x20,0x10,0x01,0xFF,0x39,0x01,0xAC,0x1B,0x19,0x01,0xC3,0x00,0x10,0x01,0xFF,0x18, +0x08,0xF4,0x0E,0xF8,0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0xC3,0x00, +0x10,0x01,0xF8,0x18,0x08,0xE4,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B,0xD0,0x0E,0xF8, +0x01,0x0E,0xF8,0x03,0x0E,0xF8,0x05,0x0E,0xF8,0x07,0x0E,0xF8,0x09,0x0E,0xF8,0x0B, +0x0E,0xF8,0x0D,0x0E,0xF8,0x0F,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x09,0x01,0xC2,0xE0, +0x10,0x01,0x18,0x19,0x00,0xF3,0x17,0x08,0x87,0x9B,0x3C,0x47,0x18,0xCC,0xFB,0x17, +0x08,0x87,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8C,0x85,0x29,0xC3,0x00,0x10,0x01, +0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFF,0x18,0x09,0x6C,0x9A,0xE0,0xFF,0x5A,0x0A, +0x1C,0xE4,0x00,0x00,0x31,0x4F,0x37,0x10,0x0B,0x98,0x00,0x0B,0x78,0x02,0x8F,0x3A, +0x8F,0x7C,0x9E,0xE1,0x0F,0x79,0x00,0x9F,0x04,0x5F,0x37,0x00,0xD4,0x79,0xFF,0x4D, +0x85,0x29,0xC3,0x00,0x10,0x01,0x5C,0x84,0x00,0xFF,0x18,0x09,0x6C,0x20,0xA0,0x6C, +0xE4,0x00,0x00,0x4B,0x4F,0x37,0x08,0x9E,0xE1,0x43,0x59,0xC4,0x8F,0x23,0x0B,0x5A, +0x00,0x0F,0x59,0x01,0xE4,0x00,0x00,0x0D,0x9A,0xE0,0x5F,0x37,0x00,0xD4,0x99,0xFF, +0x3D,0xE4,0x00,0x00,0x7B,0x20,0xA4,0xE6,0xE4,0x00,0x00,0x31,0x4F,0x37,0x08,0x9E, +0xE1,0x43,0x43,0xCC,0x8F,0x38,0x0B,0x5A,0x00,0x0F,0x59,0x01,0xE4,0x00,0x00,0x0D, +0x9A,0xE0,0x5F,0x37,0x00,0xD4,0x99,0xFF,0x3D,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B, +0x7A,0x10,0x77,0x01,0x12,0xF7,0x04,0x40,0x63,0xBB,0xE7,0xFF,0xFE,0xC5,0x85,0x29, +0x9C,0x38,0x98,0x63,0x0D,0x21,0x04,0xE7,0xFF,0x8F,0x04,0x0D,0x21,0x06,0x9C,0x28, +0xE4,0x00,0x77,0x39,0x9A,0xED,0x9C,0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0xC1,0x60, +0x10,0x01,0xFD,0x4B,0x0B,0x7A,0x1A,0xEA,0x04,0x9A,0xE1,0x1A,0xEA,0x01,0xFE,0xE0, +0x07,0xFF,0x0E,0xEA,0x07,0x0E,0xEA,0x09,0xC2,0xE0,0x10,0x01,0x9B,0x02,0xFB,0x17, +0x08,0xD2,0x52,0xE0,0xAA,0x0D,0x21,0x0C,0x0E,0xEA,0x0B,0x50,0x60,0x19,0x98,0x80, +0xE7,0xFF,0x4A,0x94,0x52,0xE0,0x1D,0xFA,0xEB,0x0B,0x7A,0x9A,0xE4,0x1A,0xEA,0x0C, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x00,0xCD,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC0, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xEC,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xE7, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xB4,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xBC, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xEA,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xE3, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xA8,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xFC, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xD6,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xC7, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC5,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xB8, +0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x83,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xD7, +0xC2,0xE0,0x10,0x01,0x9B,0x03,0xFB,0x17,0x08,0xC6,0xC2,0xE0,0x10,0x01,0xEC,0x17, +0x07,0xF4,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xE4,0xC2,0xE0,0x10,0x01,0xFF,0x00, +0x01,0xF4,0xEF,0x17,0x06,0xFD,0xC2,0xE0,0x10,0x01,0xC0,0x60,0x10,0x01,0xF8,0x17, +0x08,0xFD,0xFC,0x63,0x0A,0x1C,0x98,0x80,0x50,0xA0,0x3C,0xE7,0xFF,0xA2,0xBC,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x0B,0xF0,0x18,0x17,0x04,0x18,0x17,0x05,0x18,0x17,0x06, +0x18,0x17,0x34,0x18,0x17,0x35,0x18,0x17,0x36,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08, +0xB0,0xC2,0xE0,0x10,0x01,0xF3,0x37,0x00,0xB8,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x3D, +0xF9,0xCA,0xF7,0x3D,0xF8,0x1B,0x38,0x00,0xC3,0x00,0x10,0x01,0xF3,0x18,0x07,0x6F, +0x1B,0x17,0x00,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0xA3,0x53,0x18,0x04,0xEF,0x17, +0x08,0xA3,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01,0xFF,0x18,0x1D,0x58,0xEF,0x17, +0x03,0xE4,0xC2,0xE0,0x10,0x01,0x53,0x00,0xF0,0xEF,0x17,0x08,0xF3,0xC2,0xE0,0x10, +0x01,0x53,0x00,0xCA,0xEF,0x17,0x08,0x8F,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01, +0xFF,0x18,0x1B,0xCF,0xEF,0x17,0x03,0xF8,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01, +0xFF,0x18,0x19,0x89,0xEF,0x17,0x04,0x18,0xC2,0xE0,0x10,0x01,0xC3,0x00,0x00,0x01, +0xFF,0x18,0x1A,0x62,0xEF,0x17,0x04,0x14,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x0B,0xA0, +0xFE,0xF7,0x0B,0xA0,0xC3,0x60,0x10,0x01,0x18,0x17,0x01,0x18,0x17,0x02,0x18,0x17, +0x03,0x0C,0x17,0x05,0x0C,0x17,0x07,0x0C,0x17,0x0B,0x0C,0x17,0x09,0xC3,0x40,0x10, +0x01,0xC3,0x20,0x10,0x01,0x9A,0xE0,0xFF,0x7B,0x09,0x6C,0xFF,0x5A,0x0C,0xF6,0xFF, +0x39,0x09,0xA8,0x43,0x17,0xDC,0x0C,0x18,0x01,0x43,0x17,0xD4,0x0C,0x18,0x01,0x4F, +0x17,0x08,0x8F,0x19,0x0C,0x18,0x00,0x9E,0xE2,0x5E,0xE7,0x49,0x23,0xFF,0x9D,0x0D, +0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xE4,0x00,0x70, +0x67,0x1C,0x21,0xE8,0x0D,0x21,0x14,0xE7,0xFF,0xCD,0x52,0xE7,0xFF,0xA6,0x78,0xE7, +0xFF,0xCC,0x7C,0xE7,0xFF,0xF4,0xCA,0x50,0xE0,0x14,0x99,0x0C,0x0C,0x01,0x01,0x50, +0x60,0x1A,0x50,0x80,0x1A,0x98,0xA4,0x04,0xC1,0x6E,0xC8,0xC6,0x36,0x00,0xE7,0xFF, +0x92,0x4E,0xFC,0xC0,0x01,0x78,0xFC,0xA0,0x02,0xD6,0xC0,0x60,0x10,0x01,0xC0,0x80, +0x10,0x01,0xFC,0x63,0x01,0x5E,0xFC,0x84,0x08,0x10,0xE7,0xFF,0x94,0xDC,0x98,0x60, +0x88,0x83,0xE7,0xFF,0x88,0x52,0x98,0x60,0x98,0xA0,0x88,0x83,0xE7,0xFF,0x88,0x58, +0x98,0x60,0x98,0xA0,0x88,0x83,0xE7,0xFF,0x88,0x6E,0x98,0x80,0x98,0x61,0x88,0xA4, +0xE7,0xFF,0x88,0x5A,0x98,0xA0,0x98,0x62,0x98,0x81,0xE7,0xFF,0x88,0x46,0x98,0x62, +0x98,0x80,0xE7,0xFF,0x88,0xBC,0x98,0x60,0x50,0x80,0x66,0xE7,0xFF,0x88,0xC4,0x98, +0x61,0x50,0x80,0x66,0xE7,0xFF,0x88,0xB2,0x98,0x62,0x50,0x80,0xF3,0xE7,0xFF,0x88, +0xA0,0x98,0x60,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x88,0xE8,0x98,0x61,0xFC,0x80,0xA0, +0x00,0xE7,0xFF,0x88,0xD4,0x98,0x62,0xFC,0x80,0xA0,0x00,0xE7,0xFF,0x88,0xC0,0xFC, +0x80,0x01,0x26,0x98,0x62,0xE7,0xFF,0x89,0x08,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x96, +0x56,0xE7,0xFF,0xFA,0x26,0x98,0x61,0xE7,0xFF,0x63,0xE2,0xE7,0xFF,0x50,0x16,0x50, +0x60,0x1B,0xE7,0xFF,0x8C,0xF6,0x9A,0xEE,0x0E,0xE1,0x00,0x52,0xE0,0x14,0x0E,0xE1, +0x04,0xCA,0xE0,0x07,0xD0,0x98,0xC8,0x0E,0xE1,0x08,0x98,0xAE,0x88,0xE6,0x99,0x0A, +0x98,0x6A,0x98,0x8C,0xE7,0xFF,0x44,0x26,0x98,0x81,0x98,0x60,0xE7,0xFF,0xCB,0x28, +0x50,0x60,0x10,0xE7,0xFF,0xCB,0x52,0xE4,0x00,0x47,0xE6,0xE7,0xFF,0xF9,0x6A,0x98, +0x80,0x98,0x60,0xE7,0xFF,0x41,0xE8,0xE7,0xFF,0xB9,0x56,0xE7,0xFF,0xB8,0x4C,0xC2, +0xE0,0x10,0x01,0xF0,0x77,0x01,0xAE,0xE7,0xFF,0xCA,0xEA,0x9B,0x00,0xCA,0xE0,0x48, +0x00,0xC3,0x17,0x00,0x0D,0xC3,0x17,0x00,0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D, +0xC3,0x17,0x00,0x0F,0x53,0x18,0x08,0xC3,0x17,0x00,0x0D,0xC2,0xE0,0x01,0x1F,0x52, +0xF7,0x06,0xC2,0xE0,0x01,0x1D,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xCA,0x94,0x50,0x60, +0x20,0xE7,0xFF,0xCA,0x9E,0x98,0x61,0x50,0x80,0x13,0x50,0xA0,0x37,0x98,0xC8,0xFC, +0xE0,0x01,0x0D,0xE7,0xFF,0xAC,0x26,0xC3,0x00,0x00,0x01,0xC2,0xE0,0x10,0x01,0xFF, +0x18,0x38,0x80,0x0D,0x21,0x16,0xEF,0x17,0x03,0xD0,0x1C,0x21,0x18,0x85,0x29,0xC2, +0xE0,0x10,0x01,0xEF,0x17,0x00,0xDA,0x23,0x05,0x08,0xEE,0xF7,0x00,0xDA,0x22,0xE8, +0xEC,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x18,0x08,0xAA,0xFE,0xF7,0x08, +0xDC,0x0B,0x38,0x01,0xC3,0x60,0x10,0x01,0x0F,0x37,0x01,0xC3,0x40,0x10,0x01,0x0B, +0x38,0x03,0xFF,0x7B,0x0A,0xEC,0x0F,0x37,0x03,0x0B,0x18,0x05,0xFF,0x5A,0x0B,0xE0, +0x0F,0x17,0x05,0x9A,0xE0,0xE4,0x00,0x00,0x5D,0xC3,0x60,0x10,0x01,0xC3,0x40,0x10, +0x01,0x9A,0xE0,0xFF,0x7B,0x09,0x04,0xFF,0x5A,0x09,0x38,0x43,0x17,0xDC,0x43,0x37, +0xD4,0x0B,0x39,0x01,0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xE7, +0xFF,0xFF,0x45,0x43,0x17,0xDC,0x43,0x37,0xD4,0x0B,0x39,0x01,0x0F,0x38,0x01,0x9E, +0xE2,0x5E,0xE2,0x09,0x23,0xFF,0xBD,0x85,0x29,0xC3,0x00,0x10,0x01,0xC3,0x60,0x10, +0x01,0x9A,0xE0,0xFF,0x18,0x0C,0xF6,0xFF,0x7B,0x09,0x04,0x43,0x37,0xC4,0x43,0x57, +0xDC,0x0B,0x5A,0x01,0x0F,0x59,0x01,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xBD,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x08,0xDC,0x0B,0x37,0x01,0x0F,0x38,0x35,0x0B,0x37,0x03, +0x0A,0xF7,0x05,0x0F,0x38,0x37,0x0E,0xF8,0x39,0x85,0x29,0xE4,0x00,0x6D,0x65,0xC2, +0xE0,0x10,0x01,0xFF,0x20,0xDF,0x9F,0xEB,0x17,0x08,0xE7,0x47,0x18,0xCC,0x9B,0x3E, +0xEF,0x17,0x08,0xE7,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0xD1,0x47,0x18,0xCC,0xEF, +0x17,0x08,0xD1,0x85,0x29,0xC2,0xE0,0x10,0x01,0x88,0xC3,0xF3,0x17,0x00,0xB8,0x23, +0x08,0x4A,0xF2,0xF7,0x00,0xB8,0x22,0xE8,0x2E,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07, +0x6F,0xC3,0x00,0x10,0x01,0x9A,0xE0,0xFF,0x18,0x09,0x6C,0x8B,0x38,0x5F,0x57,0x00, +0x27,0x44,0x3D,0x5E,0xE3,0x01,0x20,0x00,0x25,0x5E,0xE3,0x29,0x20,0x00,0x31,0x0B, +0x59,0x01,0x4F,0x5A,0x08,0x0F,0x59,0x01,0x9E,0xE1,0x9F,0x22,0x5E,0xE3,0x49,0x23, +0xFF,0x79,0xC2,0xE0,0x10,0x01,0xC3,0x80,0x10,0x01,0xF3,0xD7,0x0B,0x7A,0xFF,0x5C, +0x08,0xE6,0xC3,0xA0,0x10,0x01,0x1C,0x7E,0xFF,0xFF,0xBD,0x08,0xA8,0x0A,0xFA,0x01, +0x13,0x7D,0x00,0x9B,0x20,0xE4,0x00,0x00,0x65,0xD4,0x79,0x00,0xF0,0x08,0x98,0x00, +0x09,0x18,0x02,0x8D,0x04,0xC1,0x00,0x1D,0xE8,0x20,0x00,0x39,0xC1,0x00,0x59,0xE8, +0xCA,0xF7,0x20,0x00,0x4B,0x7B,0x00,0x09,0x18,0x00,0x50,0x97,0x40,0x5D,0x04,0x19, +0x9F,0x21,0x4A,0xE4,0xB8,0x9F,0x02,0x5D,0x19,0x04,0xD7,0xC8,0xFE,0x7D,0xC3,0x00, +0x10,0x01,0x0E,0xFA,0x01,0x1B,0x7D,0x00,0xFF,0x18,0x0B,0x64,0x0B,0x38,0x00,0x53, +0x77,0x20,0x5F,0x2C,0x99,0x9F,0x02,0xC3,0x20,0x10,0x01,0x4A,0xFB,0xB8,0xFF,0x39, +0x0B,0x74,0xD7,0x19,0xFF,0x56,0x98,0x60,0x0E,0xFA,0x01,0x88,0x83,0x98,0xA0,0xE7, +0xFF,0xB5,0x2F,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x40,0x10,0x01,0x20, +0x64,0x62,0xE7,0xFF,0xB6,0x4A,0x20,0x64,0x56,0xF2,0xEA,0x08,0xA8,0x9E,0xE1,0xFA, +0xEA,0x08,0xA8,0xE4,0x00,0x00,0x19,0xE7,0xFF,0xB6,0xD0,0xF8,0x0A,0x08,0xA8,0xE7, +0xFF,0xD9,0x08,0x20,0x64,0x26,0x99,0x43,0xE4,0x00,0x00,0x29,0xE7,0xFF,0xD8,0xEE, +0x99,0x49,0x20,0x68,0x28,0xE7,0xFF,0xD8,0xDC,0x20,0x6F,0xB6,0xC2,0xE0,0x10,0x01, +0xC3,0x20,0x10,0x01,0xF3,0x17,0x08,0xA8,0xF3,0x39,0x0B,0xF0,0x23,0x21,0x1A,0xD5, +0x58,0x02,0x1D,0xF8,0x17,0x08,0xA8,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xEA,0xC2, +0xE0,0x10,0x01,0xC3,0x00,0x10,0x01,0xF8,0x17,0x08,0xE3,0xC2,0xE0,0x10,0x01,0xF8, +0x18,0x08,0xFC,0xF8,0x17,0x08,0xFD,0x0D,0x41,0x02,0xC2,0xE0,0x10,0x01,0x0D,0x21, +0x06,0xEB,0x17,0x08,0xE7,0x9C,0x28,0x53,0x18,0x80,0xEF,0x17,0x08,0xE7,0xE7,0xFF, +0x86,0xB3,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x9C,0x38,0xC3,0x14, +0x00,0x01,0x0D,0x21,0x04,0xCA,0xF8,0x22,0x00,0x0B,0x37,0x01,0xCB,0x18,0x26,0x18, +0x9B,0x3F,0x0F,0x37,0x01,0x0B,0x38,0x01,0x53,0x39,0x02,0x0F,0x38,0x01,0x0B,0x17, +0x01,0xFC,0x60,0x01,0x00,0x0C,0x17,0x01,0xE7,0xFF,0xC4,0xF8,0xC2,0xE0,0x10,0x01, +0x0D,0x21,0x06,0xEB,0x17,0x00,0xCD,0x9C,0x28,0xC7,0x18,0xFE,0xFF,0xEF,0x17,0x00, +0xCD,0x85,0x29,0x5C,0xC6,0x00,0x9A,0xE0,0xE4,0x00,0x00,0x45,0x4F,0x17,0x08,0x4F, +0x57,0x10,0x43,0x23,0xC4,0x8F,0x45,0x8F,0x04,0x0F,0x5A,0x02,0x0B,0x18,0x01,0x4F, +0x5A,0x42,0x9E,0xE1,0x43,0x18,0xD5,0x0F,0x19,0x01,0x5F,0x17,0x00,0xD4,0xD8,0xFE, +0xFD,0x85,0x29,0x9C,0x38,0x0D,0x21,0x04,0xE4,0x00,0x40,0x70,0x0D,0x21,0x06,0xFC, +0x60,0x01,0x00,0x9C,0x28,0xE7,0xFF,0xC4,0x2F,0x9C,0x38,0x0D,0x21,0x04,0xE4,0x00, +0x40,0x44,0x0D,0x21,0x06,0xFC,0x60,0x01,0x00,0x9C,0x28,0xE7,0xFF,0xC3,0xF3,0x9C, +0x38,0x0D,0x21,0x04,0xE7,0xFF,0x89,0xCE,0x98,0x80,0x98,0x61,0xE7,0xFF,0xE5,0x4C, +0x98,0x60,0xE7,0xFF,0x84,0xE2,0x98,0x61,0x98,0x80,0xE7,0xFF,0xEB,0xEE,0x98,0x62, +0x98,0x80,0xE7,0xFF,0xEB,0xDE,0x98,0x63,0x98,0x80,0xE7,0xFF,0xEB,0xCE,0x98,0x66, +0xC0,0x80,0x10,0x01,0xC0,0xA0,0x10,0x01,0xFC,0x84,0x01,0xB0,0xFC,0xA5,0x01,0xC8, +0xC0,0xC0,0x10,0x01,0xFC,0xC6,0x01,0xA0,0xE7,0xFF,0x90,0x0E,0x0D,0x21,0x06,0x9C, +0x28,0xE7,0xFF,0x95,0x5B,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21,0x04,0xC1,0x40,0x10, +0x01,0xE7,0xFF,0xD6,0x04,0xFD,0x4A,0x00,0xDE,0x20,0x68,0x68,0x24,0x64,0x2D,0xD0, +0x63,0x05,0xD6,0xE4,0x00,0x00,0xCB,0xE7,0xFF,0x88,0xE8,0xE7,0xFF,0xD5,0xD0,0xE4, +0x00,0x00,0x4F,0xE7,0xFF,0xC3,0x4A,0x0A,0xEA,0x09,0x40,0x63,0xBD,0x5E,0xE3,0x04, +0xC2,0xE1,0x76,0xEA,0x20,0x00,0x99,0x98,0x62,0xE7,0xFF,0xEA,0x92,0x20,0x60,0x76, +0xE7,0xFF,0x88,0x96,0x98,0x61,0x98,0x80,0xE7,0xFF,0xE4,0x14,0x0D,0x21,0x06,0x0D, +0x41,0x02,0x98,0x60,0x9C,0x28,0xE7,0xFF,0x83,0x9B,0x98,0x62,0x98,0x80,0xE7,0xFF, +0xE3,0xE8,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x8D,0x58,0x0D,0x21,0x06,0x0D,0x41,0x02, +0x98,0x60,0x9C,0x28,0xE7,0xFF,0x83,0x17,0xE7,0xFF,0xC2,0xA0,0x0A,0xEA,0x0D,0x40, +0x63,0xBD,0x5E,0xE3,0x04,0xC2,0xE0,0xBB,0x6A,0x20,0x00,0x31,0x98,0x63,0xE7,0xFF, +0xE9,0xE8,0x20,0x62,0xB8,0xE7,0xFF,0xE9,0x14,0x5C,0x63,0x04,0xC0,0x60,0x19,0x0E, +0x20,0x00,0x49,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x08,0xE7,0xC6,0xF7,0x20,0x00,0x22, +0xE0,0x28,0xE7,0xFF,0xC2,0x2C,0x0C,0x6A,0x0D,0x0D,0x41,0x02,0x0D,0x21,0x06,0x98, +0x63,0x98,0x80,0x9C,0x28,0xE7,0xFF,0xE3,0x1B,0x0D,0x41,0x02,0x0D,0x21,0x06,0x9C, +0x28,0x85,0x29,0xD0,0x69,0x06,0x2D,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7, +0xB9,0xFC,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0F,0x37,0x02,0xFF,0x18,0x09,0xA8,0xC2, +0xE0,0x10,0x01,0xFE,0xF7,0x0A,0x58,0x87,0x29,0xC3,0x00,0x10,0x01,0xFF,0x18,0x0B, +0x94,0x0F,0x38,0x02,0x0F,0x37,0x68,0x0F,0x38,0x06,0x0F,0x18,0x0A,0x0F,0x37,0x6C, +0x0F,0x17,0x70,0xE4,0x00,0x01,0x0B,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x0B,0x88,0x0F, +0x37,0x02,0x0F,0x38,0x68,0x0F,0x37,0x06,0x0E,0xF7,0x0A,0x0F,0x38,0x6C,0x0E,0xF8, +0x70,0xE4,0x00,0x00,0xCF,0xCE,0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xCC,0x63,0x00, +0x1A,0xFF,0x7B,0x0A,0xFC,0x4C,0x63,0x10,0x8F,0x77,0x8F,0x03,0x9A,0xE0,0x43,0x38, +0xBC,0x43,0x5B,0xBC,0x0F,0x5A,0x02,0x0F,0x59,0x00,0x9E,0xE4,0x5E,0xED,0x09,0x23, +0xFF,0xBD,0xE4,0x00,0x00,0x6D,0x9C,0x7E,0xC3,0x40,0x10,0x01,0x5C,0x63,0x00,0xFF, +0x5A,0x0C,0x54,0xCF,0x03,0x00,0x68,0xCC,0x63,0x00,0x1A,0x8F,0x58,0x4C,0x63,0x10, +0x8C,0x77,0x9A,0xE0,0x43,0x03,0xBC,0x43,0x3A,0xBC,0x0F,0x39,0x02,0x0F,0x38,0x00, +0x9E,0xE4,0x5E,0xED,0x09,0x23,0xFF,0xBD,0x85,0x29,0xD0,0x69,0x06,0x3D,0x4F,0x03, +0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBA,0x24,0x8E,0xF8,0xC3,0x00,0x10,0x01,0x0F, +0x37,0x02,0xFF,0x18,0x09,0x04,0xC2,0xE0,0x10,0x01,0xFE,0xF7,0x08,0xDC,0x87,0x29, +0x0B,0x37,0x00,0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18,0x0B,0x94,0xE4,0x00, +0x00,0x25,0x0B,0x37,0x00,0xC3,0x00,0x10,0x01,0x4F,0x39,0x40,0xFF,0x18,0x0B,0x88, +0x0F,0x38,0x00,0x0B,0x37,0x02,0x0A,0xF7,0x04,0x4F,0x39,0x40,0x4E,0xF7,0x40,0x0F, +0x38,0x04,0x0E,0xF8,0x08,0xE4,0x00,0x00,0xD9,0xCE,0xE3,0x00,0x34,0x8F,0x17,0xCE, +0xE3,0x00,0x68,0xC3,0x60,0x10,0x01,0xFF,0x7B,0x0A,0xFC,0x8F,0x77,0x9A,0xE0,0x4F, +0x37,0x08,0x43,0x58,0xBC,0x8F,0x3B,0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F,0x59,0x00, +0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF,0xA9,0xE4,0x00,0x00,0x73,0x1E,0xE3,0xFE,0x5E, +0xF7,0x00,0xCF,0x37,0x00,0x34,0xCE,0xF7,0x00,0x68,0xC3,0x60,0x10,0x01,0x8F,0x19, +0xFF,0x7B,0x0C,0x54,0x8F,0x77,0x9A,0xE0,0x4F,0x37,0x08,0x43,0x58,0xBC,0x8F,0x3B, +0x0B,0x5A,0x00,0x4F,0x5A,0x40,0x0F,0x59,0x00,0x9E,0xE2,0x5E,0xE6,0x89,0x23,0xFF, +0xA9,0xE7,0xFF,0xFC,0xE5,0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x3E,0x98,0x60,0xE7, +0xFF,0xFE,0x56,0x98,0x68,0xE4,0x00,0x00,0x19,0x98,0x62,0xE7,0xFF,0xFE,0x3E,0x98, +0x69,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFE,0x29,0x9C,0x38,0x98,0x60,0x0D,0x21, +0x04,0xE7,0xFF,0xFE,0x12,0x0D,0x21,0x06,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFD,0xFD, +0x20,0x80,0x64,0xD0,0x84,0x00,0xE2,0x20,0x88,0x84,0x20,0x8C,0x9C,0x5C,0x80,0x21, +0x4B,0x0A,0x01,0x8A,0xF8,0xE4,0x00,0x00,0x43,0x9B,0x01,0xE4,0x00,0x00,0x0F,0x53, +0x00,0x19,0x9A,0xE1,0xE4,0x00,0x00,0x25,0x53,0x00,0x32,0x8A,0xF8,0xE4,0x00,0x00, +0x13,0x53,0x00,0x50,0x8A,0xF8,0xD0,0x6B,0x0F,0xAD,0x4F,0x43,0x10,0xC3,0x38,0x00, +0x21,0xFF,0x39,0xBA,0x4C,0x8F,0x3A,0xC3,0x60,0x10,0x01,0x0F,0x99,0x02,0xC3,0x40, +0x10,0x01,0xC3,0x20,0x10,0x01,0xFF,0x7B,0x09,0x04,0xFF,0x5A,0x0A,0xEC,0xFF,0x39, +0x08,0xDC,0x87,0x89,0xCF,0x23,0x00,0x34,0x8F,0x79,0xCF,0x23,0x00,0x68,0xC0,0xA0, +0x10,0x01,0x99,0x02,0xFC,0xA5,0x0A,0xFC,0xCB,0xC0,0x01,0xF4,0x8C,0xB9,0x9B,0x20, +0x43,0x5B,0xCC,0x4F,0x99,0x08,0x0B,0xBA,0x00,0x8F,0x85,0x4F,0xBD,0x40,0x0F,0x5C, +0x02,0x5F,0x5D,0x1D,0x43,0xBD,0xD5,0x48,0x98,0xB8,0xCF,0x5A,0x01,0xF4,0x43,0xA4, +0xEB,0x43,0xBD,0x40,0x8F,0x5D,0x43,0x5A,0xF0,0x0F,0x5C,0x00,0x9F,0x22,0x5F,0x26, +0x89,0x23,0xFF,0x3D,0xE4,0x00,0x02,0xEF,0x1F,0x23,0xFE,0x5F,0x39,0x00,0xCC,0xB9, +0x00,0x34,0xCF,0x39,0x00,0x68,0xC0,0x80,0x10,0x01,0x8C,0xBB,0xFC,0x84,0x0C,0x54, +0x9B,0xC2,0x8C,0x99,0xCB,0xA0,0x01,0xF4,0x9B,0x20,0x43,0x45,0xCC,0x0B,0x9A,0x00, +0x4F,0x59,0x08,0x4F,0x9C,0x40,0x43,0x64,0xD4,0x0F,0x5B,0x02,0x5F,0x5C,0x1D,0x43, +0x9C,0xD5,0x49,0x18,0xB8,0xCF,0x5A,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F, +0x5C,0x43,0x5A,0xE8,0x0F,0x5B,0x00,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x39,0xE4, +0x00,0x02,0x39,0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF,0x5A,0x0B,0x88,0xCB,0xA0,0x01, +0xF4,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D,0x43,0x9C,0xDD, +0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x7C,0x43, +0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44,0xFF,0x7B,0x08, +0xE2,0xD7,0x3B,0xFE,0x86,0xE4,0x00,0x01,0xAD,0xC3,0x40,0x10,0x01,0x9B,0xC2,0xFF, +0x5A,0x0B,0x94,0xCB,0xA0,0x01,0xF4,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40, +0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3, +0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10, +0x01,0x9F,0x44,0xFF,0x7B,0x08,0xE2,0xD7,0x3B,0xFE,0x86,0xE4,0x00,0x01,0x21,0x8B, +0x3A,0x9B,0xC2,0xC3,0x40,0x10,0x01,0xCB,0xA0,0x01,0xF4,0xFF,0x5A,0x0B,0xB0,0x0F, +0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40,0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18, +0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3,0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8, +0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10,0x01,0x9F,0x44,0xFF,0x7B,0x0A,0xFC,0xD7, +0x3B,0xFE,0x86,0xE4,0x00,0x00,0x91,0x8B,0x3A,0x9B,0xC2,0xC3,0x40,0x10,0x01,0xCB, +0xA0,0x01,0xF4,0xFF,0x5A,0x0A,0xCC,0x0F,0x7A,0x02,0x0B,0x99,0x00,0x4F,0x9C,0x40, +0x5F,0x7C,0x1D,0x43,0x9C,0xDD,0x49,0x18,0xB8,0xCF,0x7B,0x01,0xF4,0x43,0x88,0xE3, +0x43,0x9C,0xF0,0x8F,0x7C,0x43,0x7B,0xE8,0x0F,0x7A,0x00,0x9F,0x22,0xC3,0x60,0x10, +0x01,0x9F,0x44,0xFF,0x7B,0x0A,0xFC,0xD7,0x3B,0xFE,0x86,0xE7,0xFF,0xF8,0x11,0x9C, +0x38,0x0D,0x21,0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xFB, +0x86,0x88,0x8A,0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xFB, +0x67,0x1C,0x21,0xC8,0x0D,0xC1,0x20,0x0D,0x21,0x34,0x0D,0x41,0x30,0x0D,0x61,0x2C, +0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xE1,0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E, +0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81,0x08,0x0E,0xA1,0x04,0xC1,0xC0,0x10,0x01,0xFD, +0xCE,0x08,0xE6,0x0B,0x6E,0x01,0xC6,0xFB,0x7F,0xFF,0x0E,0xEE,0x01,0xC2,0xE0,0x10, +0x01,0xFE,0xF7,0x09,0x6C,0x0B,0x57,0x34,0x0B,0x37,0x36,0x47,0x1A,0xD7,0x43,0x9A, +0xCC,0x4F,0x18,0xFA,0x5F,0x9C,0x04,0x47,0x1A,0xC4,0x5E,0xF8,0x06,0xD7,0x37,0x00, +0x30,0x8B,0x19,0xC2,0xE0,0x10,0x01,0x5F,0x38,0x06,0xEA,0xF7,0x09,0xA4,0xD6,0xF9, +0x00,0x30,0x8B,0x17,0x8E,0xFC,0x5F,0x18,0x06,0x1E,0xF7,0xEB,0x5E,0xF7,0x04,0xC2, +0xE0,0x18,0xCE,0x20,0x00,0xE9,0xC3,0x00,0x12,0xAC,0x20,0x00,0xCD,0xD3,0x0F,0x01, +0x80,0xC2,0xE0,0x10,0x01,0xEB,0x37,0x09,0x6C,0xFE,0xF7,0x09,0x6C,0x0B,0x17,0x02, +0x8F,0x19,0x0B,0x37,0x04,0x0A,0xF7,0x06,0x8E,0xF9,0xCE,0xF7,0x00,0x0B,0xD6,0xF8, +0x00,0x78,0x53,0x00,0x64,0xC2,0xE0,0x10,0x01,0xE4,0x00,0x00,0x23,0xC2,0xE0,0x10, +0x01,0xF3,0x17,0x08,0x8D,0x23,0x00,0x24,0x9F,0x1F,0xFB,0x17,0x08,0x8D,0xC2,0xE0, +0x10,0x01,0xF8,0x17,0x08,0x99,0xC1,0xE0,0x10,0x01,0xC1,0xA0,0x10,0x01,0xC1,0x40, +0x10,0x01,0x57,0x7B,0x08,0xFD,0xEF,0x08,0xBC,0xFD,0xAD,0x08,0xC0,0xFD,0x4A,0x0B, +0xF0,0x23,0x61,0x48,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xF6,0x22,0xE5,0x1C,0x0A, +0xEA,0x19,0x1E,0xF7,0xCE,0x5E,0xF7,0x04,0xC2,0xE0,0xF3,0x6E,0x20,0x00,0x4D,0x0A, +0xEA,0x16,0x5E,0xE9,0xF1,0x20,0x00,0x29,0xC2,0xE0,0xF5,0xE8,0x20,0x00,0x9D,0xE7, +0xFF,0xE2,0xEC,0x9A,0xE3,0x0E,0xED,0x00,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xB4, +0xC2,0xE0,0x10,0x01,0x18,0x0F,0x00,0xF8,0x17,0x08,0xD6,0xC2,0xE0,0x10,0x01,0xF8, +0x17,0x08,0xC7,0xC2,0xE0,0x10,0x01,0x9B,0x01,0xFB,0x17,0x08,0x99,0xC2,0xE0,0x10, +0x01,0xF2,0xF7,0x08,0xB0,0x22,0xE0,0x24,0x98,0x60,0xE7,0xFF,0xBD,0xD8,0x0E,0xED, +0x02,0x22,0xE0,0xE2,0x0A,0xEE,0x01,0x56,0xF7,0x40,0x22,0xE0,0x60,0xE7,0xFF,0x37, +0x24,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xD6,0x9A,0xE1,0x0E,0xED,0x00,0xE4,0x00, +0x00,0x37,0x98,0x60,0xE7,0xFF,0xFC,0xB6,0x0A,0xEE,0x01,0x56,0xF7,0x20,0x22,0xE0, +0x2E,0x98,0x6A,0x98,0x82,0xE7,0xFF,0xF8,0x36,0x0E,0xED,0x02,0x22,0xE5,0x52,0x0A, +0xEE,0x01,0x57,0x17,0x08,0x23,0x00,0x60,0xE7,0xFF,0xE1,0xDA,0xC2,0xE0,0x10,0x01, +0xF8,0x17,0x08,0xB4,0x9A,0xE2,0x0E,0xED,0x00,0xE4,0x00,0x00,0x6F,0x57,0x17,0x40, +0x23,0x00,0xB4,0xC6,0xF7,0x20,0x00,0x22,0xE0,0x9A,0xC2,0xE0,0x10,0x01,0xF3,0x17, +0x08,0xD6,0xC3,0x00,0x19,0x0A,0x20,0x00,0x35,0x98,0x62,0xE7,0xFF,0xFC,0x08,0xE4, +0x00,0x00,0x23,0x9F,0x01,0xFB,0x17,0x08,0xD6,0xE4,0x00,0x00,0x0F,0x0C,0x0D,0x00, +0xC2,0x40,0x10,0x01,0x0E,0xED,0x02,0xFE,0x52,0x08,0x86,0x22,0xE9,0x0A,0x0A,0xEE, +0x01,0xC1,0x60,0x10,0x01,0x56,0xF7,0x08,0x22,0xE0,0xB0,0xF2,0xEB,0x08,0xB4,0x9E, +0xE1,0xFA,0xEB,0x08,0xB4,0xE7,0xFF,0x36,0x14,0xF2,0xEB,0x08,0xB4,0x22,0xE0,0x80, +0x9A,0xE3,0x18,0x12,0x00,0x0E,0xED,0x00,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC5, +0xE4,0x00,0x00,0x1B,0x9A,0xE6,0xF8,0x0B,0x08,0xB4,0x0E,0xED,0x00,0xC2,0x00,0x10, +0x01,0xC1,0x80,0x10,0x01,0xC1,0x60,0x10,0x01,0x0E,0xED,0x02,0xFE,0x10,0x08,0x87, +0xFD,0x8C,0x0B,0xD0,0xFD,0x6B,0x08,0x90,0xD2,0xE3,0x39,0xDE,0x12,0xEA,0x00,0x22, +0xE4,0x1A,0x18,0x12,0x00,0xE7,0xFF,0xC7,0x5C,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10, +0x01,0xFF,0x20,0x03,0xE8,0x20,0x68,0x1C,0xFF,0x20,0x01,0xF4,0xEF,0x37,0x01,0xC7, +0xEF,0x38,0x01,0xC5,0x0A,0xEE,0x01,0x56,0xF7,0x08,0xD2,0xE0,0x38,0x02,0xC1,0xC0, +0x10,0x01,0xC2,0x20,0x10,0x01,0x12,0xEA,0x00,0xFD,0xCE,0x08,0xF4,0xFE,0x31,0x01, +0xAC,0xD2,0xE1,0x10,0xF1,0x0B,0x8B,0x04,0xC3,0x8F,0xFF,0xE0,0x20,0x05,0xF9,0x08, +0x8A,0x48,0x0B,0x2B,0x06,0x0B,0x6B,0x00,0x43,0xA4,0xCD,0x08,0xAA,0x46,0x0B,0x4B, +0x02,0x43,0xC5,0xE5,0x0B,0x0A,0x18,0x08,0x6A,0x16,0x42,0xFA,0xC5,0x41,0x03,0xDD, +0x42,0xFE,0xBB,0x41,0x3D,0x43,0x8E,0xE9,0x22,0xE1,0x84,0x42,0x7C,0xDD,0x41,0x3A, +0xCD,0x42,0x9D,0x9B,0x42,0x5E,0x4B,0x8E,0x92,0x22,0x80,0x40,0x26,0x80,0x28,0x26, +0xE0,0x2A,0xE4,0x00,0x00,0x8F,0x26,0xFD,0x0E,0x4E,0xB7,0xFA,0x46,0x55,0xBE,0x42, +0x52,0xAD,0x4E,0xB4,0xFA,0x46,0x95,0xA6,0x42,0xB4,0xAD,0xD6,0xB2,0x01,0x74,0x42, +0x98,0xD5,0x41,0x28,0x4B,0x42,0x74,0x9B,0x8E,0x69,0x22,0x60,0x40,0x26,0x60,0x28, +0x26,0xE0,0x2A,0xE4,0x00,0x00,0x2D,0x26,0xFC,0x4A,0x4E,0xF3,0xFA,0x46,0x77,0x9E, +0x42,0x73,0xBD,0x9A,0xE1,0xD6,0x72,0x06,0x18,0x42,0x44,0xD5,0x42,0x65,0xDD,0x42, +0x83,0xE5,0x42,0xF9,0xC5,0x41,0x32,0xA3,0x42,0xF3,0xBB,0x8E,0xE9,0x22,0xE0,0xDC, +0x43,0x9B,0xE5,0x40,0xF9,0xD5,0x40,0xD2,0xE3,0x41,0x33,0x3B,0x8C,0xC9,0x20,0xC0, +0x40,0x24,0xC0,0x28,0x26,0xE0,0x2A,0xE4,0x00,0x00,0x3B,0x26,0xFC,0x66,0x4D,0x37, +0xFA,0x46,0xA9,0xBE,0x42,0xB5,0x4D,0x4D,0x26,0xFA,0x44,0xC9,0x36,0x41,0x26,0x4D, +0xD5,0x35,0x01,0xA0,0x43,0x58,0xD5,0x41,0x08,0x43,0x43,0x5A,0xD3,0x43,0x38,0xCD, +0x42,0x94,0xA3,0x43,0x39,0xCB,0x8F,0x48,0x8E,0x99,0x9A,0xE0,0xD6,0x9A,0x00,0x45, +0x8B,0x54,0x9A,0xE1,0x42,0x73,0x9B,0x42,0x52,0x93,0x8E,0x53,0xD6,0x5A,0x01,0xB1, +0xE4,0x00,0x00,0x6F,0x41,0x38,0xCD,0x40,0xF4,0x3B,0x43,0x89,0xE3,0x8F,0x87,0x23, +0x80,0x40,0x27,0x80,0x28,0x26,0xE0,0x2A,0xE7,0xFF,0xFF,0x79,0x26,0xFE,0xE2,0x4E, +0xFC,0xFA,0x47,0x97,0xE6,0x43,0x9C,0xBD,0x9A,0xE0,0xD7,0x95,0x00,0xF0,0xE7,0xFF, +0xFF,0x4D,0x8B,0x52,0x52,0xE0,0x10,0x43,0xDE,0xF3,0x43,0xBD,0xEB,0x53,0x20,0x11, +0x8F,0xBE,0x5F,0xBA,0x1F,0x4A,0xF7,0xC8,0x4F,0x37,0x21,0x46,0xF7,0xCE,0x56,0xF7, +0x0F,0xD2,0xE0,0x3C,0x9A,0x0C,0xAA,0x17,0x0C,0x8A,0x19,0x0C,0x6A,0x47,0x0F,0x0A, +0x49,0xE4,0x00,0x0F,0x07,0x12,0xF0,0x00,0x9B,0x1E,0x46,0xF7,0xC4,0x98,0x63,0x1A, +0xF0,0x00,0xE7,0xFF,0xD9,0x94,0xE4,0x00,0x00,0xEF,0x0B,0x0B,0x00,0xC3,0x0F,0xFF, +0xE4,0x20,0x01,0xB3,0x13,0x32,0x00,0x0A,0x6B,0x02,0x9F,0x21,0x0B,0x6A,0x16,0x5F, +0x39,0x00,0x41,0x1B,0xC5,0x0B,0x4A,0x18,0x0B,0xAA,0x46,0x43,0xDA,0x9D,0x43,0x1D, +0xC5,0x0B,0x8A,0x48,0x43,0x18,0xC3,0x42,0x7C,0x9D,0x1B,0x32,0x00,0x42,0x73,0x9B, +0x8F,0x13,0x41,0x08,0x43,0x43,0xDE,0xF3,0x8F,0xC8,0x5F,0x1E,0x1F,0x53,0x00,0x10, +0x4B,0x00,0xC0,0x23,0x00,0x3C,0x0F,0xAA,0x17,0x0F,0x8A,0x19,0x0F,0x6A,0x47,0x0F, +0x4A,0x49,0x27,0x28,0xDB,0x9E,0xFF,0x9B,0x3C,0x1A,0xEA,0x00,0x12,0xF0,0x00,0x46, +0xF7,0xCC,0x1A,0xF0,0x00,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0x8C,0x12,0xF1,0x00, +0x1A,0xEA,0x10,0x12,0xF1,0x01,0x1A,0xEA,0x40,0xE7,0xFF,0x30,0xEC,0x12,0xEA,0x00, +0xD2,0xE1,0x3A,0xA6,0xE4,0x00,0x01,0xD9,0x18,0x12,0x00,0xE7,0xFF,0xFF,0xC5,0x22, +0xE7,0x7A,0x18,0x12,0x00,0x0A,0xEB,0x04,0xC2,0xEF,0xFF,0xE0,0x23,0xFF,0x45,0x0B, +0xCA,0x16,0x0B,0xAA,0x18,0x0B,0x2B,0x00,0x0B,0x0B,0x02,0x43,0x9E,0xCD,0x43,0x7D, +0xC5,0x43,0xDE,0xBD,0x0B,0x4B,0x06,0x43,0xDE,0xF3,0x43,0xBD,0xD5,0x43,0x9C,0xE3, +0x43,0xBD,0xEB,0x43,0x7B,0xDB,0x8F,0xBE,0x8F,0x7C,0xD7,0xBB,0x36,0x59,0xE4,0x00, +0x0D,0x43,0x0B,0x8C,0x03,0x43,0x98,0xE5,0x5F,0x9C,0x06,0x4F,0x7C,0xFA,0x47,0x9B, +0xE6,0x43,0x7C,0xDD,0xC3,0x60,0x1F,0x48,0x20,0x00,0xC1,0x0B,0x8C,0x03,0xC3,0x60, +0x10,0x01,0xEF,0x9B,0x08,0xD9,0xFF,0x7B,0x08,0xD8,0x0B,0x8C,0x07,0x0F,0x9B,0x03, +0xC3,0x60,0x10,0x01,0xEF,0x3B,0x08,0xC9,0xFF,0x7B,0x08,0xC8,0x0F,0x1B,0x03,0x13, +0x10,0x00,0x53,0x18,0x02,0x1B,0x10,0x00,0x0B,0x0E,0x05,0x0F,0x0E,0x01,0x0B,0x0E, +0x07,0x0F,0x0E,0x03,0x0B,0x0C,0x09,0x0F,0x0C,0x01,0x0B,0x0C,0x0B,0x0F,0x0C,0x03, +0x0B,0x0C,0x0D,0x0E,0xEB,0x01,0x0F,0x0C,0x05,0xFE,0xE0,0x7F,0xFF,0x0B,0x0C,0x0F, +0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E,0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC,0x09,0x0E, +0xEC,0x0B,0x0F,0x0C,0x07,0x0E,0xEC,0x0D,0x0E,0xEC,0x0F,0x9B,0x01,0x12,0xF1,0x01, +0x0F,0x4B,0x03,0x1A,0xF1,0x00,0x42,0xF8,0xBD,0x1A,0xF1,0x01,0xE7,0xFF,0xFE,0x03, +0x0A,0xEA,0x17,0x0B,0x0B,0x01,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8,0xFA,0x47, +0x17,0xC6,0x42,0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x01,0xC4,0xD6,0xF9,0x01, +0x2C,0x0A,0xEA,0x19,0x0B,0x0B,0x03,0x43,0x18,0xBD,0x5F,0x18,0x06,0x4E,0xF8,0xFA, +0x47,0x17,0xC6,0x42,0xF8,0xBD,0xC3,0x00,0x10,0x01,0xEB,0x38,0x01,0xC6,0xD6,0xF9, +0x31,0x30,0xE7,0xFF,0x2F,0x42,0xD0,0x60,0x30,0xF2,0xE7,0xFF,0xD9,0x56,0xC2,0xE0, +0x10,0x01,0xEF,0x17,0x07,0xF6,0xD3,0x01,0x30,0x76,0xE4,0x00,0x0B,0xD1,0x9B,0x1E, +0xEF,0x17,0x08,0xC5,0xC1,0xA0,0x10,0x01,0x13,0x2A,0x00,0xFD,0xAD,0x0C,0x06,0x9B, +0x00,0x8A,0xED,0xE4,0x00,0x00,0x35,0x0B,0x57,0x01,0x9F,0x01,0x0F,0x4B,0x01,0x5F, +0x18,0x00,0x0B,0x57,0x03,0x1E,0xF7,0x30,0x0F,0x4B,0x03,0x9D,0x64,0xD7,0x19,0xFF, +0x56,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x08,0x9E,0x22,0xE4,0x26,0x99,0x60,0xE4,0x00, +0x00,0x5F,0xE7,0xFF,0xBF,0xA2,0x20,0x6B,0xD8,0xE7,0xFF,0xBF,0x94,0x20,0x6C,0xAE, +0xE7,0xFF,0xFF,0xD9,0xCC,0x8B,0x00,0x30,0x88,0xCB,0x1C,0x84,0x10,0x9D,0x61,0x8C, +0x8A,0x5D,0x6B,0x00,0x1C,0x64,0x06,0x9C,0x88,0xE7,0xFF,0x6E,0x6C,0x10,0xAA,0x00, +0xD4,0xAB,0xFF,0x25,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x6D,0xBE,0xE7,0xFF,0xBF,0x2E, +0xC3,0x20,0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0x20,0x68,0xD6,0x53, +0x40,0x4B,0xEF,0x58,0x08,0xE9,0xEF,0x59,0x08,0xB3,0x53,0x00,0x25,0xEF,0x17,0x08, +0xFF,0xC2,0xA0,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFE,0xB5,0x08,0xA4,0xEF,0x17,0x08, +0xD5,0x99,0x60,0xC2,0x60,0x10,0x01,0xC2,0x80,0x10,0x01,0x8A,0x55,0xE4,0x00,0x03, +0x19,0x53,0x40,0x32,0xEF,0x58,0x08,0xE9,0xEF,0x59,0x08,0xB3,0x53,0x00,0x19,0xE7, +0xFF,0xFF,0x9D,0x4E,0xEB,0x10,0x8E,0xEE,0x0B,0x17,0x00,0xC3,0x0F,0xFF,0xE4,0x20, +0x05,0x3B,0x0B,0x37,0x02,0xC3,0x2F,0xFF,0xE0,0x20,0x05,0x11,0xCE,0xEB,0x00,0x30, +0x8E,0xEA,0x0A,0x37,0x17,0x42,0x38,0x8D,0x5E,0x31,0x06,0x4F,0x11,0xFA,0x0A,0xF7, +0x19,0x46,0x38,0x8E,0x42,0xF9,0xBD,0x42,0x31,0xC5,0x5E,0xF7,0x06,0x4F,0x17,0xFA, +0x5E,0x31,0x06,0x46,0xF8,0xBE,0xE9,0xF3,0x08,0xE9,0x42,0xF7,0xC5,0x43,0x15,0x5C, +0x5E,0xF7,0x06,0x13,0x58,0x00,0xD6,0xEF,0x00,0xE4,0xC3,0x00,0x10,0x01,0xEB,0x18, +0x08,0xB3,0xD6,0x38,0x00,0x84,0x9B,0x03,0x27,0x48,0x57,0x1F,0x1A,0x01,0xE4,0x00, +0x00,0x19,0x9B,0x00,0x23,0x40,0x24,0x1F,0x1A,0xFF,0x5F,0x18,0x00,0x43,0x52,0x5C, +0x1B,0x1A,0x00,0x43,0x15,0x5C,0x13,0x18,0x00,0xD3,0x02,0x06,0xA1,0xEB,0x14,0x08, +0xD5,0xD6,0xF8,0x00,0x8C,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0F,0x37,0x19,0xE4,0x00, +0x00,0x9B,0xD6,0xEF,0x02,0x4C,0x43,0x2F,0xC5,0x40,0x77,0xC5,0x43,0x39,0xCB,0x42, +0xF8,0xBD,0x43,0x4F,0x7B,0x40,0x63,0xBB,0x8C,0x79,0x40,0x63,0xD3,0x40,0x63,0xC8, +0xE7,0xFF,0x2A,0xB0,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17,0x02,0x41, +0xEF,0x1D,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x18,0xD7,0x19,0x00,0x58,0x41, +0xF8,0x7D,0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x19,0xC2,0xE0,0x10,0x01,0xEA, +0xF7,0x08,0xFF,0xD6,0x37,0x00,0xCC,0xCE,0xEB,0x00,0x30,0x4F,0x0B,0x10,0x8E,0xEA, +0x8F,0x0E,0x0B,0x18,0x01,0x0F,0x17,0x17,0xE4,0x00,0x00,0xAB,0xC3,0x00,0x10,0x01, +0xE9,0xF8,0x08,0xB3,0xD6,0x2F,0x02,0x4C,0x43,0x0F,0xBD,0x43,0x2F,0x7B,0x43,0x18, +0xC3,0x40,0x71,0xBD,0x42,0x37,0x8D,0x40,0x63,0x8B,0x8C,0x78,0x40,0x63,0xCB,0x40, +0x63,0xC0,0xE7,0xFF,0x29,0xCC,0x4E,0xEB,0x10,0x8E,0xEE,0x5C,0x63,0x06,0x0B,0x17, +0x00,0x41,0xEF,0x1D,0xCE,0xEB,0x00,0x30,0x8E,0xEA,0x0B,0x37,0x16,0xD7,0x19,0x00, +0x58,0x41,0xF8,0x7D,0xE4,0x00,0x00,0x0D,0x8D,0xF8,0x0D,0xF7,0x17,0x4E,0xEB,0x10, +0xCF,0x0B,0x00,0x30,0x8E,0xEE,0x8F,0x0A,0x9D,0x61,0x0B,0x38,0x17,0x5D,0x6B,0x00, +0x0B,0x18,0x19,0x0F,0x37,0x01,0x0F,0x17,0x03,0x12,0xEA,0x00,0xD6,0xEB,0xF4,0x3D, +0xE7,0xFF,0xBB,0x86,0x20,0x68,0x36,0x9B,0x08,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x01, +0xBD,0xC2,0xE0,0x10,0x01,0x13,0x2A,0x00,0xF3,0x77,0x08,0xE4,0x8B,0x0D,0xC2,0xE0, +0x10,0x01,0x9B,0x80,0xFE,0xF7,0x0B,0xD4,0xFF,0x40,0x7F,0xFF,0xE4,0x00,0x00,0x9F, +0xD7,0x79,0x00,0x92,0x0F,0x57,0xFD,0x0F,0x57,0xFF,0x0F,0x57,0x01,0x0F,0x57,0x03, +0x8B,0x79,0x0B,0xB7,0x00,0xC3,0xAF,0xFF,0xE0,0x20,0x00,0x41,0x0B,0xB7,0xFD,0x0F, +0xB7,0x01,0x0B,0xB7,0xFF,0xE4,0x00,0x00,0x1B,0x0B,0xB8,0x01,0x0F,0xB7,0x01,0x0B, +0xB8,0x03,0x0F,0xB7,0x03,0x0B,0xB8,0x01,0x9F,0x81,0x0F,0xB7,0xFD,0x5F,0x9C,0x00, +0x0B,0xB8,0x03,0x1F,0x18,0x30,0x0F,0xB7,0xFF,0x9E,0xE8,0xD7,0x99,0xFD,0xAE,0xC2, +0xE0,0x10,0x01,0xFB,0x77,0x08,0xE4,0xC2,0xE0,0x10,0x01,0x23,0x24,0x7A,0x9B,0x02, +0xFB,0x17,0x09,0x01,0xC2,0xE0,0x10,0x01,0xEA,0xF7,0x01,0xBC,0x9B,0x0A,0x9B,0x4A, +0x43,0x18,0xBD,0x9A,0xE0,0xE4,0x00,0x00,0x8F,0xF8,0x17,0x09,0x01,0xE7,0xFF,0xFF, +0xCF,0x0B,0x6C,0x04,0x0B,0x8C,0x00,0x0B,0xAC,0x06,0x43,0x9C,0xDD,0x9E,0xE1,0x43, +0x98,0xE3,0x5E,0xF7,0x00,0x43,0x9C,0xD0,0x8F,0x9B,0x0B,0x6C,0x02,0x0F,0x8D,0x01, +0x43,0x7B,0xED,0x0F,0x8C,0x01,0x43,0x78,0xDB,0x43,0x7B,0xD0,0x8F,0x7D,0x5F,0x7B, +0x06,0x0F,0x6D,0x03,0x0F,0x6C,0x03,0x1D,0xAD,0x30,0x9D,0x88,0xD6,0xF9,0xFE,0x2E, +0x12,0xF0,0x00,0x56,0xF7,0x02,0x22,0xE0,0x24,0x98,0x64,0xE7,0xFF,0xCF,0x42,0x13, +0x0A,0x00,0xC2,0xE0,0x10,0x01,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E, +0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1, +0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0xFB,0x17,0x08, +0x88,0x98,0x61,0x1C,0x21,0x38,0xE7,0xFF,0xAD,0x81,0x18,0x0F,0x00,0x9A,0xE4,0xE4, +0x00,0x04,0xDD,0xD2,0xE4,0x01,0xE6,0x0A,0xEE,0x01,0x56,0xF7,0x08,0x22,0xE0,0x5C, +0x9A,0xE3,0x18,0x12,0x00,0x0E,0xED,0x00,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC5, +0xE4,0x00,0x04,0xDB,0x12,0xEF,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xEF,0x00,0xD2, +0xE1,0x12,0xF1,0x9A,0xE5,0x18,0x0F,0x00,0x0E,0xED,0x00,0xE4,0x00,0x04,0xA5,0xD2, +0xE5,0x09,0xCE,0x12,0xEF,0x00,0x9E,0xE1,0x1A,0xEF,0x00,0xC2,0xE0,0x10,0x01,0xF2, +0xF7,0x08,0xE4,0x22,0xE9,0x36,0x12,0xF0,0x00,0x56,0xF7,0x01,0x22,0xE1,0x10,0xC2, +0xE0,0x10,0x01,0xF8,0x17,0x09,0x01,0xC1,0x40,0x10,0x01,0xF2,0xEA,0x08,0x8C,0x22, +0xE8,0x66,0x98,0x65,0xE7,0xFF,0xCD,0xD0,0x98,0x61,0xE7,0xFF,0xAC,0x78,0x9A,0xE1, +0xFA,0xEA,0x08,0x8C,0xE4,0x00,0x01,0x77,0xD2,0xE1,0x05,0x96,0x98,0x65,0xE7,0xFF, +0xCD,0x9C,0x98,0x61,0xE7,0xFF,0xAC,0x44,0xF8,0x0A,0x08,0x8C,0xE4,0x00,0x01,0x47, +0x0B,0x0B,0x00,0x0B,0x4C,0x00,0x43,0x38,0xD5,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0x47, +0x37,0xCE,0x42,0xF9,0xBD,0xC2,0xE0,0x19,0x0C,0x20,0x00,0x7D,0x0A,0xEC,0x03,0x0B, +0x2B,0x03,0x43,0x39,0xBD,0x5F,0x39,0x06,0x4E,0xF9,0xFA,0x47,0x37,0xCE,0x42,0xF9, +0xBD,0xC2,0xE0,0x1F,0x48,0x20,0x01,0x95,0xC3,0x20,0x10,0x01,0xF2,0xF9,0x09,0x01, +0x22,0xE8,0xB6,0x8F,0x1A,0x43,0x18,0xB8,0x0F,0x0A,0x17,0xC3,0x00,0x10,0x01,0xEB, +0x58,0x08,0x92,0xC3,0x00,0x10,0x01,0xEB,0x18,0x0B,0xD2,0x8F,0x1A,0x42,0xF8,0xB8, +0x0E,0xEA,0x19,0x9A,0xE1,0xFA,0xF9,0x09,0x01,0xE4,0x00,0x00,0x45,0x22,0xE4,0x66, +0xC2,0xE0,0x10,0x01,0x0F,0x0A,0x17,0xEA,0xF7,0x08,0x93,0xF8,0x19,0x09,0x01,0x0E, +0xEA,0x19,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00,0x9A,0xE1,0x98,0x61,0x1A, +0xEA,0x00,0xE7,0xFF,0xAB,0x08,0xE4,0x00,0x00,0x13,0x9A,0xE3,0x1A,0xEF,0x00,0x12, +0xEF,0x00,0xD2,0xE2,0x0A,0x59,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0xC5,0xE7,0xFF, +0x24,0x42,0xC2,0xE0,0x10,0x01,0x9B,0x03,0xFB,0x17,0x08,0xB0,0xE7,0xFF,0xCF,0x52, +0xE7,0xFF,0x64,0xCE,0x98,0x60,0xE7,0xFF,0xAA,0xA0,0xC2,0xE0,0x10,0x01,0xF8,0x17, +0x08,0xC7,0x9A,0xE6,0xE4,0x00,0x01,0xF3,0xD2,0xE6,0x08,0xAE,0x0A,0xEE,0x01,0x56, +0xF7,0x40,0x22,0xE0,0x26,0x98,0x64,0xE7,0xFF,0xE9,0x90,0xC3,0x00,0x10,0x01,0xF2, +0xF8,0x08,0xC7,0x9E,0xE1,0x5E,0xF7,0x00,0xFA,0xF8,0x08,0xC7,0x5E,0xE6,0x53,0x0A, +0xEE,0x01,0x20,0x01,0x35,0x56,0xF7,0x40,0x22,0xE0,0x50,0x9A,0xE1,0x0E,0xED,0x00, +0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xD6,0xE4,0x00,0x01,0xAB,0x0C,0x0D,0x00,0x98, +0x60,0x0E,0xA1,0x06,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16, +0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D, +0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0xE7,0xFF,0xE8,0xC9,0x56, +0xF7,0x08,0xD2,0xE0,0x04,0xDA,0xC2,0xE0,0x10,0x01,0xF8,0x17,0x08,0xB4,0x9A,0xE2, +0xE4,0x00,0x00,0xDB,0xC3,0x6F,0xFF,0xE4,0x23,0xE1,0xF5,0xE7,0xFF,0xF2,0x05,0x98, +0x62,0xE7,0xFF,0xCA,0x96,0xFE,0xE0,0x7F,0xFF,0x0E,0xEB,0x05,0x0E,0xEB,0x07,0x0E, +0xEE,0x05,0x0E,0xEE,0x07,0x0E,0xEC,0x09,0x0E,0xEC,0x0B,0x0E,0xEC,0x0D,0x0E,0xEC, +0x0F,0xE7,0xFF,0xF1,0xB9,0x0B,0x8C,0x01,0x43,0x99,0xE5,0x5F,0x9C,0x06,0x4F,0x7C, +0xFA,0x47,0x9B,0xE6,0x43,0x7C,0xDD,0xC3,0x60,0x19,0x0C,0x23,0xE4,0x9F,0xE7,0xFF, +0xF2,0x7B,0xFE,0xE0,0x7F,0xFF,0x18,0x0F,0x00,0x0E,0xEB,0x01,0x0E,0xEB,0x03,0x0E, +0xEB,0x05,0x0E,0xEB,0x07,0x18,0x11,0x00,0x1B,0x11,0x01,0x9A,0xE5,0x0E,0xED,0x00, +0xE4,0x00,0x00,0x3B,0xC2,0xE0,0x10,0x01,0xCB,0x20,0xFF,0xFD,0xEB,0x17,0x08,0xC5, +0x9F,0x01,0x5F,0x18,0x04,0xD7,0x19,0xCF,0x4D,0xE7,0xFF,0xF3,0xCF,0x0E,0xA1,0x06, +0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16,0x0E,0x01,0x1A,0x0D, +0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D,0x61,0x2E,0x0D,0x41, +0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D,0x41,0x00,0x0D,0x21, +0x04,0x89,0x43,0x20,0x84,0x46,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xE2,0xAC,0x98,0x68, +0xE4,0x00,0x00,0x1D,0x98,0x62,0x88,0x8A,0xE7,0xFF,0xE2,0x90,0x98,0x69,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x9C,0x28,0xE7,0xFF,0xE2,0x71,0x9C,0x38,0x0D,0x21, +0x04,0x0D,0x41,0x00,0x89,0x43,0x98,0x60,0x88,0x8A,0xE7,0xFF,0xE2,0x4C,0x88,0x8A, +0x0D,0x21,0x06,0x0D,0x41,0x02,0x98,0x68,0x9C,0x28,0xE7,0xFF,0xE2,0x2D,0xD0,0x6B, +0x0B,0x85,0x4F,0x03,0x10,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBA,0x7C,0x8E,0xF8,0xC3, +0x40,0x10,0x01,0x0F,0xB7,0x02,0xC3,0x60,0x10,0x01,0xC3,0x20,0x10,0x01,0xC3,0x80, +0x10,0x01,0xC3,0x00,0x10,0x01,0xC2,0xE0,0x10,0x01,0xFF,0x5A,0x09,0xA8,0xFF,0x7B, +0x0A,0xEC,0xFF,0x39,0x0A,0x58,0xFF,0x9C,0x0B,0x64,0xFF,0x18,0x0C,0xF6,0xFE,0xF7, +0x09,0x6C,0x87,0xA9,0xCC,0x63,0x00,0x1A,0x5C,0x63,0x00,0x4F,0x23,0x08,0x4C,0x63, +0x10,0x8F,0x19,0x8E,0xF9,0x8F,0x43,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F, +0x99,0x08,0x0B,0xBD,0x01,0x8F,0x9A,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5, +0x0F,0x9B,0x01,0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x01,0xE7,0x9C, +0x7E,0xCC,0x63,0x00,0x1A,0x5C,0x63,0x00,0x4F,0x43,0x08,0x4C,0x63,0x10,0x8F,0x1A, +0x8C,0x79,0x8E,0xFA,0x9B,0x20,0x43,0x77,0xCC,0x43,0xB8,0xCC,0x4F,0x99,0x08,0x0B, +0xBD,0x01,0x8F,0x83,0x0F,0x9C,0x02,0x4F,0x9C,0x42,0x43,0x9D,0xE5,0x0F,0x9B,0x01, +0x9F,0x22,0x5F,0x26,0x89,0x23,0xFF,0x85,0xE4,0x00,0x01,0x6D,0x0B,0x78,0x35,0x0F, +0x3A,0x6A,0x4F,0x39,0x42,0x43,0x3B,0xCD,0x0B,0x78,0x37,0x0F,0x37,0x35,0x0F,0x3A, +0x6E,0x4F,0x39,0x42,0x43,0x3B,0xCD,0x0F,0x37,0x37,0x0F,0x3A,0x72,0xE4,0x00,0x00, +0x4B,0x0F,0x59,0x6A,0x0B,0x78,0x35,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0B,0x78,0x37, +0x0F,0x57,0x35,0x0F,0x59,0x6E,0x0F,0x39,0x72,0x4F,0x5A,0x42,0x43,0x5B,0xD5,0x0F, +0x57,0x37,0x4F,0x39,0x42,0x0B,0x18,0x39,0x43,0x18,0xCD,0x0F,0x17,0x39,0xE4,0x00, +0x00,0xC1,0xC3,0xA0,0x10,0x01,0x9A,0xE0,0xFF,0xBD,0x0B,0xB0,0x43,0x17,0xE4,0x43, +0x57,0xDC,0x4F,0x37,0x08,0x0B,0x5A,0x01,0x8F,0x3D,0x0F,0x39,0x02,0x4F,0x39,0x42, +0x43,0x3A,0xCD,0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0x85,0xE4,0x00, +0x00,0x61,0xC3,0xA0,0x10,0x01,0x9A,0xE0,0xFF,0xBD,0x0A,0xCC,0x43,0x17,0xE4,0x43, +0x57,0xDC,0x4F,0x37,0x08,0x0B,0x5A,0x01,0x8F,0x3D,0x0F,0x39,0x02,0x4F,0x39,0x42, +0x43,0x3A,0xCD,0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE2,0x09,0x23,0xFF,0x85,0x85,0x29, +0x9C,0x38,0x0D,0x21,0x04,0x20,0x64,0x56,0x98,0x60,0xE7,0xFF,0xFD,0x08,0x98,0x68, +0xE7,0xFF,0xFC,0xFC,0x98,0x6A,0xE4,0x00,0x00,0x25,0x98,0x62,0xE7,0xFF,0xFC,0xE4, +0x98,0x69,0xE7,0xFF,0xFC,0xD8,0x98,0x6B,0x0D,0x21,0x06,0x9C,0x28,0xE7,0xFF,0xFC, +0xC3,0x9C,0x38,0x98,0x60,0x0D,0x21,0x04,0xE7,0xFF,0xFC,0xAC,0x0D,0x21,0x06,0x98, +0x68,0x9C,0x28,0xE7,0xFF,0xFC,0x97,0xC2,0xE0,0x10,0x01,0xCB,0x00,0x7F,0xFF,0xFE, +0xF7,0x0B,0x64,0x8B,0x37,0x0B,0x79,0x00,0x5F,0x1B,0x15,0x4B,0x58,0xD8,0x9F,0x22, +0x5F,0x1A,0x06,0xC3,0x40,0x10,0x01,0xFF,0x5A,0x0B,0x74,0xD7,0x3A,0xFF,0x56,0x9B, +0x20,0x0B,0x57,0x00,0x43,0x5A,0xC5,0x9E,0xE2,0xC3,0x40,0x3E,0x88,0xC3,0x40,0x10, +0x01,0x4B,0x39,0x0A,0xFF,0x5A,0x0B,0x74,0xD6,0xFA,0xFF,0x4E,0xC2,0xE0,0x10,0x01, +0xC3,0x00,0x10,0x01,0x23,0x20,0x64,0xEB,0x37,0x08,0x8F,0xCB,0x39,0x08,0x00,0xEF, +0x37,0x08,0x8F,0x9A,0xE1,0xFA,0xF8,0x08,0x98,0xE4,0x00,0x00,0x2F,0xEB,0x37,0x08, +0x8F,0xFF,0x40,0xF7,0xFF,0xF8,0x18,0x08,0x98,0x47,0x39,0xD4,0xEF,0x37,0x08,0x8F, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3D,0xF9,0x1C,0x21,0xC8,0x0D,0x21,0x34, +0x0D,0x41,0x30,0x0D,0x61,0x2C,0x0D,0x81,0x28,0x0D,0xA1,0x24,0x0D,0xC1,0x20,0x0D, +0xE1,0x1C,0x0E,0x01,0x18,0x0E,0x21,0x14,0x0E,0x41,0x10,0x0E,0x61,0x0C,0x0E,0x81, +0x08,0x13,0x17,0x00,0xC2,0xE0,0x10,0x01,0xFB,0x17,0x00,0xB8,0xF3,0x17,0x00,0xB8, +0x23,0x00,0x2C,0xF2,0xF7,0x00,0xB8,0xD2,0xE1,0x2F,0xAE,0xC1,0xA0,0x10,0x01,0xC1, +0xE0,0x10,0x01,0xFD,0xAD,0x08,0xE6,0xFD,0xEF,0x00,0xD8,0x0A,0xED,0x01,0x56,0xF7, +0x80,0xD2,0xE0,0x2D,0x9E,0xC2,0xE0,0x10,0x01,0xC1,0x60,0x10,0x01,0xF3,0x17,0x00, +0xB8,0xFD,0x6B,0x09,0x6C,0x23,0x08,0xB2,0xF2,0xF7,0x00,0xB8,0x22,0xE8,0x68,0x0B, +0x2B,0x02,0x9B,0x02,0xCF,0x59,0x00,0x03,0x0A,0xEB,0x00,0x43,0x1A,0xC0,0xD6,0xF8, +0x02,0x14,0xE4,0x00,0x00,0xA9,0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x07,0x6F,0x22,0xE3, +0x86,0x8B,0x0B,0x9A,0xE0,0x9B,0x22,0x5F,0x57,0x00,0x27,0x44,0x3D,0x5E,0xE3,0x01, +0x20,0x00,0x25,0x5E,0xE3,0x29,0x20,0x00,0x31,0x0B,0x58,0x00,0x43,0x5A,0xC8,0x0F, +0x58,0x01,0x9E,0xE1,0x9F,0x02,0x5E,0xE3,0x49,0x23,0xFF,0x79,0xE7,0xFF,0xFF,0x67, +0x42,0xF7,0xC5,0x53,0x20,0x15,0xCE,0xF7,0x00,0x0A,0x42,0xF7,0xC8,0x8F,0x17,0x0F, +0x0B,0x01,0xE4,0x00,0x00,0x43,0x4E,0xF7,0x08,0x9B,0x1D,0x43,0x17,0xC0,0x8F,0x38, +0x9B,0x07,0xCF,0x39,0x00,0x06,0x43,0x39,0xC0,0x9B,0x03,0x42,0xF7,0xC0,0x8E,0xF9, +0x0E,0xEB,0x03,0x0B,0x2B,0x30,0x0B,0x0B,0x32,0x4E,0xF9,0x08,0xD7,0x17,0x00,0xC0, +0xCF,0x39,0xFF,0xFE,0x9B,0x4B,0x8F,0x19,0xCF,0x18,0x00,0x03,0x43,0x18,0xD0,0x8E, +0xF8,0x0E,0xEB,0x33,0x0A,0xEB,0x32,0x9B,0x12,0x43,0x17,0xC0,0x8E,0xF8,0x53,0x00, +0xF0,0x0E,0xEB,0x33,0xC2,0xE0,0x10,0x01,0xEF,0x17,0x01,0x55,0x0E,0xEF,0x02,0x22, +0xE4,0x1E,0xE7,0xFF,0xFC,0x8A,0xC1,0x80,0x10,0x01,0xFD,0x8C,0x0B,0x7A,0x12,0xEC, +0x04,0x10,0x6C,0x01,0x40,0x63,0xBB,0xE7,0xFF,0xC5,0xEA,0xC1,0xC0,0x10,0x01,0x13, +0x2C,0x04,0xFD,0xCE,0x0A,0x1C,0x10,0x6C,0x01,0x0A,0xEE,0x00,0x43,0x79,0x1B,0x9B, +0x00,0xE4,0x00,0x00,0x35,0x4F,0x58,0x10,0x9F,0x01,0x8F,0x4E,0x5F,0x18,0x00,0x0F, +0x5A,0x02,0x5F,0x9A,0x06,0x5F,0x57,0x1D,0x4A,0xFC,0xB8,0xD7,0x78,0xFF,0x54,0xC1, +0x40,0x10,0x01,0xC2,0xE2,0x32,0x88,0xFD,0x4A,0x01,0x3C,0x20,0x00,0x35,0x4E,0xF7, +0x0A,0x0E,0xEA,0x19,0xE4,0x00,0x00,0x2F,0x53,0x00,0xF0,0xC2,0xE0,0x77,0xE8,0x20, +0x00,0x25,0x4E,0xF7,0x12,0x5F,0x17,0x06,0x0F,0x0A,0x19,0xC2,0xE0,0x10,0x01,0xF2, +0xF7,0x08,0x98,0x22,0xE1,0x54,0x40,0x63,0xCB,0xE7,0xFF,0xC5,0x06,0x12,0xEC,0x01, +0x13,0x6C,0x04,0x0B,0x2E,0x00,0x43,0x7B,0xBB,0x9A,0xE0,0x8B,0x17,0xE4,0x00,0x00, +0x35,0x4F,0x58,0x10,0x8F,0x4E,0x0F,0x5A,0x02,0xD7,0x59,0x00,0x48,0x5F,0x3A,0x06, +0x8A,0xF8,0x9F,0x01,0x5F,0x18,0x00,0xD7,0x78,0xFF,0x54,0x26,0xE8,0x3D,0xD2,0xEB, +0x00,0x62,0xD2,0xEC,0x00,0x42,0xD2,0xEA,0x00,0x66,0xFE,0xE0,0x02,0x58,0xE4,0x00, +0x00,0x0F,0x52,0xE0,0xC8,0x0E,0xEA,0x19,0x88,0x6A,0xE7,0xFF,0x29,0x0A,0xC1,0x80, +0x10,0x01,0x89,0xCB,0xFD,0x8C,0x0B,0xF0,0x8A,0xEB,0x12,0x2C,0x00,0x53,0x20,0x14, +0x0B,0x17,0x00,0xCF,0x18,0x00,0x23,0x43,0x18,0xC8,0x0F,0x17,0x01,0xC3,0x00,0x10, +0x01,0x9E,0xE2,0xFF,0x18,0x09,0xA0,0xD6,0xF8,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x28, +0xA4,0xC2,0x00,0x10,0x01,0x9A,0xE0,0xFE,0x10,0x08,0x88,0x22,0x20,0x4A,0x13,0x0C, +0x00,0x27,0x04,0x33,0x12,0xF0,0x00,0x5E,0xE0,0x01,0x4A,0xE1,0x01,0x13,0x0C,0x00, +0x23,0x09,0x2E,0x13,0x10,0x00,0x23,0x05,0x3A,0x13,0x2C,0x07,0x13,0x0C,0x37,0xD7, +0x38,0x02,0x2A,0x0F,0x0C,0x0A,0x23,0x04,0xFA,0x0F,0x0C,0x3A,0x23,0x04,0xE2,0xC3, +0x00,0x10,0x01,0xEB,0x38,0x0B,0xD2,0xC3,0x2F,0xFF,0xE0,0x20,0x00,0xA5,0xFF,0x39, +0xFC,0x01,0x4F,0x19,0xFA,0x47,0x38,0xCE,0x43,0x19,0xC5,0xC3,0x20,0x10,0x01,0xEB, +0x59,0x0B,0x85,0xD7,0x1A,0x00,0xA4,0xE4,0x00,0x00,0x1B,0x23,0x04,0x26,0x13,0x10, +0x00,0x23,0x00,0x18,0x22,0xE0,0x9C,0x53,0x00,0x23,0x0A,0xEE,0x00,0xCE,0xF7,0x00, +0x14,0x42,0xF7,0xC0,0x0E,0xEE,0x01,0xC3,0x40,0x10,0x01,0x9D,0xC2,0xFF,0x5A,0x09, +0xA0,0xD5,0xDA,0xFF,0x4E,0x88,0x6A,0xE7,0xFF,0x27,0x70,0x12,0xEC,0x00,0x22,0xE0, +0x5A,0xC2,0xE0,0x10,0x01,0xEC,0x17,0x08,0x9C,0x13,0x2C,0x00,0xD3,0x20,0x0A,0xBE, +0xE4,0x00,0x02,0xE1,0x98,0x61,0x98,0x81,0x88,0xAA,0xE7,0xFF,0x22,0x50,0x0A,0xEA, +0x10,0x0B,0x0A,0x06,0x0B,0x2A,0x12,0x5D,0xD7,0x04,0x42,0x38,0xBD,0x40,0xB8,0xCD, +0xCA,0xE0,0x07,0xFF,0x43,0x37,0xCD,0x0B,0x4A,0x02,0x0B,0x6A,0x08,0x40,0x97,0xC5, +0x5C,0xF9,0x04,0x11,0x0C,0x00,0x0B,0x2A,0x0A,0x40,0x78,0xD5,0x42,0x59,0xDD,0x42, +0x77,0xCD,0x40,0xDA,0xC5,0xC2,0xE0,0x10,0x01,0x9E,0x4A,0x42,0x9B,0xCD,0xFE,0xF7, +0x0C,0x08,0x9B,0xA0,0xCB,0xC0,0x07,0xFF,0xE4,0x00,0x00,0xC9,0x0B,0x97,0xFE,0xD7, +0x1C,0x00,0x98,0x43,0x9C,0xD5,0x43,0x9C,0x8B,0x43,0x9C,0x18,0x8F,0x8E,0xE4,0x00, +0x00,0x2D,0xD7,0x84,0x00,0xA8,0x43,0x9E,0xE5,0x43,0x9C,0xD5,0x43,0x9C,0x2B,0x43, +0x9C,0x30,0x8F,0x87,0x0F,0x97,0xFF,0x0B,0x97,0x00,0xD7,0x3C,0x00,0x98,0x43,0x9C, +0xDD,0x9F,0x8A,0x43,0x9C,0xCB,0x43,0x9C,0x90,0xE4,0x00,0x00,0x31,0xD7,0x93,0x00, +0xB8,0x43,0x9E,0xE5,0x43,0x9C,0xDD,0x43,0x9C,0xCB,0x43,0x9C,0xA0,0xFF,0x9C,0x07, +0xFF,0x0F,0x97,0x01,0x9F,0xA1,0x1E,0xF7,0x30,0x5F,0xBD,0x00,0xD7,0xA8,0xFD,0x06, +0xCA,0xE0,0x07,0xFF,0x0B,0x0A,0x12,0x0B,0x4A,0x10,0x0B,0x6A,0x0C,0x43,0xB7,0xD5, +0x42,0xF7,0xDD,0x43,0xBD,0xC5,0x0B,0x0A,0x0E,0x43,0xD7,0xC5,0xC2,0xE0,0x10,0x01, +0x9B,0x00,0xF1,0x17,0x08,0x98,0x12,0xEC,0x00,0xE4,0x00,0x00,0x93,0xCF,0x38,0x00, +0x30,0x8F,0x2C,0x0B,0x99,0x16,0x09,0x59,0x18,0x43,0x9C,0xD5,0x41,0x4A,0xDD,0xCF, +0x9C,0x07,0xFF,0xCD,0x4A,0x07,0xFF,0x43,0x9C,0xE8,0x41,0x4A,0xF0,0x0F,0x99,0x17, +0x0D,0x59,0x19,0x1F,0x9C,0x9C,0x5F,0x9C,0x04,0xC3,0x80,0xE6,0xEA,0x20,0x00,0x41, +0x21,0x00,0x34,0x8B,0x37,0x22,0xE0,0x14,0x9B,0x21,0x5E,0xF9,0x00,0x9F,0x01,0x5F, +0x18,0x00,0xD6,0xF8,0xFD,0xDD,0x1A,0xEC,0x00,0xE7,0xFF,0xFD,0x71,0xCF,0x57,0x00, +0x30,0x9E,0xE1,0x8F,0x4C,0x0F,0x5A,0x0E,0xC3,0x40,0x95,0xEC,0x4B,0x18,0x0A,0xE4, +0x00,0x00,0x11,0x9A,0xE0,0x8B,0x17,0x5F,0x57,0x00,0xD7,0x3A,0xFF,0x1D,0xC2,0xE0, +0x10,0x01,0xEF,0x17,0x08,0x9C,0x0A,0xED,0x01,0x52,0xF7,0x08,0xE4,0x00,0x00,0x33, +0x9B,0x07,0xC2,0xE0,0x10,0x01,0x18,0x10,0x00,0xEF,0x17,0x01,0xBD,0x0A,0xED,0x01, +0x9B,0x17,0x46,0xF7,0xC4,0x0E,0xED,0x01,0x0E,0xEF,0x02,0xD2,0xE1,0x0D,0xAE,0xE7, +0xFF,0xD9,0x44,0xC2,0xE0,0x10,0x01,0xEE,0xF7,0x07,0xF6,0xD2,0xE1,0x0A,0xAA,0x0B, +0x2B,0x35,0x0A,0xEB,0x39,0x0B,0x0B,0x36,0x5F,0x77,0x06,0x5F,0x59,0x06,0xD7,0x5B, +0x00,0x30,0x8A,0xF9,0x5F,0x37,0x06,0xC1,0xF8,0x00,0x21,0x47,0x39,0xCF,0xC2,0x00, +0x10,0x01,0x4F,0x39,0xFA,0x99,0x40,0x46,0xF7,0xCC,0xC1,0xC0,0x10,0x01,0x5E,0xF7, +0x06,0xFD,0xEF,0xB4,0xBA,0x4E,0xF7,0x08,0xFE,0x10,0x01,0xBE,0x5E,0xF8,0x15,0xC1, +0x80,0x10,0x01,0x4A,0xF7,0xC0,0x43,0x18,0xBD,0x0F,0x0B,0x37,0xE4,0x00,0x00,0xAD, +0x1C,0x61,0x05,0x88,0x8F,0x98,0xA3,0xE7,0xFF,0x65,0xC4,0x1E,0xE1,0x08,0x8E,0xEA, +0x12,0xF7,0xFD,0x1F,0x17,0x1A,0x4E,0xF7,0x08,0x4F,0x18,0x08,0x8E,0xF0,0x8F,0x0B, +0x0A,0xF7,0x01,0x0B,0x18,0x00,0xD7,0x17,0x00,0xA0,0x9A,0xE1,0xEB,0x0C,0x08,0x83, +0x4E,0xF7,0x54,0x46,0xF7,0xC5,0xE4,0x00,0x00,0x27,0x9A,0xE1,0xEB,0x0C,0x08,0x83, +0x4E,0xF7,0x54,0x46,0xF7,0xBF,0x46,0xF7,0xC4,0x9D,0x41,0xEE,0xEC,0x08,0x83,0x5D, +0x4A,0x00,0xF2,0xEE,0x08,0xC6,0xD6,0xEA,0xFD,0x55,0xC2,0xE0,0x10,0x01,0xEA,0xF7, +0x08,0x83,0x22,0xE0,0x34,0x0A,0xED,0x01,0x52,0xF7,0x10,0xE4,0x00,0x00,0x3B,0x0A, +0xED,0x01,0x57,0x17,0x10,0x23,0x00,0x34,0x9B,0x21,0xC3,0x00,0x10,0x01,0xFB,0x38, +0x08,0xB0,0x1F,0x40,0xEF,0x46,0xF7,0xD4,0x0E,0xED,0x01,0xC1,0x40,0x10,0x01,0xC3, +0x00,0x10,0x01,0xEE,0xEA,0x08,0xBA,0xFF,0x18,0x08,0xD7,0x22,0xE0,0x56,0x18,0x18, +0x00,0x0A,0xED,0x01,0x56,0xF7,0x10,0x22,0xE1,0x64,0x9A,0xE1,0xE4,0x00,0x00,0x41, +0x22,0xE4,0x92,0x12,0xF8,0x00,0x9E,0xE1,0x5E,0xF7,0x00,0x1A,0xF8,0x00,0x0B,0x0D, +0x01,0x57,0x18,0x10,0x23,0x00,0xE0,0x26,0xE4,0xE5,0x9A,0xE2,0xEE,0xEA,0x08,0xB8, +0xE4,0x00,0x00,0x61,0x22,0xE8,0x7E,0x18,0x18,0x00,0x0A,0xED,0x01,0x56,0xF7,0x10, +0x22,0xE0,0x34,0x98,0x62,0xE7,0xFF,0x97,0x42,0xE4,0x00,0x00,0x2F,0x9A,0xE3,0xE7, +0xFF,0xFF,0xBB,0x22,0xEC,0x36,0x98,0x60,0xE7,0xFF,0x97,0x1C,0xEC,0x0A,0x08,0xB8, +0x0B,0x0D,0x00,0xC2,0xE0,0x10,0x01,0x27,0x1C,0x56,0xF3,0x17,0x08,0xA0,0xD3,0x09, +0x01,0xB5,0x9F,0x01,0xFB,0x17,0x08,0xA0,0xE4,0x00,0x00,0x59,0xF8,0x17,0x08,0xA0, +0xE4,0x00,0x00,0x61,0x0E,0xEF,0x02,0x22,0xE4,0xA6,0x9B,0x05,0xC2,0xE0,0x10,0x01, +0xEF,0x17,0x08,0xC0,0x9B,0x03,0xC2,0xE0,0x10,0x01,0x98,0x60,0xFB,0x17,0x08,0xB0, +0xE7,0xFF,0x96,0x8C,0xE7,0xFF,0x91,0x84,0xE4,0x00,0x00,0x11,0xE7,0xFF,0x92,0x36, +0xC2,0xE0,0x10,0x01,0xEB,0x17,0x08,0x85,0xC3,0x00,0x7D,0x0A,0x20,0x00,0x61,0xC3, +0x00,0x10,0x01,0x9B,0x5E,0xF3,0x38,0x08,0x89,0xEC,0x17,0x08,0x85,0x47,0x39,0xD4, +0xFB,0x38,0x08,0x89,0x0E,0x81,0x0A,0x0E,0x61,0x0E,0x0E,0x41,0x12,0x0E,0x21,0x16, +0x0E,0x01,0x1A,0x0D,0xE1,0x1E,0x0D,0xC1,0x22,0x0D,0xA1,0x26,0x0D,0x81,0x2A,0x0D, +0x61,0x2E,0x0D,0x41,0x32,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0x9C,0x38,0x0D, +0x21,0x04,0xE7,0xFF,0xA1,0x76,0x20,0x60,0xE6,0xE7,0xFF,0xA1,0x54,0x20,0x64,0x7A, +0x98,0x80,0xE7,0xFF,0xB3,0x40,0xE7,0xFF,0x54,0x92,0x20,0x60,0x26,0x98,0x61,0xE4, +0x00,0x00,0x35,0x98,0x61,0x98,0x80,0xE4,0x00,0x00,0x7B,0xE7,0xFF,0xA1,0x10,0x98, +0x80,0xE7,0xFF,0xB3,0x02,0xE7,0xFF,0xA0,0xFC,0x98,0x82,0xE4,0x00,0x00,0x53,0xE7, +0xFF,0xA0,0xFC,0x20,0x65,0x0E,0xE7,0xFF,0xA0,0xDA,0x20,0x64,0xA2,0x98,0x81,0xE7, +0xFF,0xB2,0xC6,0xE7,0xFF,0x54,0x18,0x20,0x60,0x26,0x98,0x61,0xE4,0x00,0x00,0x49, +0x98,0x61,0x88,0x83,0xE7,0xFF,0xAF,0x3C,0xE7,0xFF,0xC9,0x76,0x9A,0xE0,0xE4,0x00, +0x00,0xED,0xE7,0xFF,0xA0,0x82,0x98,0x81,0xE7,0xFF,0xB2,0x74,0xE7,0xFF,0xA0,0x6E, +0x98,0x83,0xE7,0xFF,0xFF,0xC5,0xE7,0xFF,0xA0,0x6E,0x20,0x68,0x36,0xE7,0xFF,0xA0, +0x4C,0x98,0x82,0xE4,0x00,0x00,0x23,0xE7,0xFF,0xA0,0x4C,0x20,0x6C,0x5E,0xE7,0xFF, +0xA0,0x2A,0x98,0x83,0xE7,0xFF,0xB2,0x1C,0xE7,0xFF,0xA0,0x16,0x98,0x87,0xE7,0xFF, +0xFF,0x6D,0xE7,0xFF,0xA0,0x16,0xD0,0x67,0x00,0xC6,0xE7,0xFF,0x9F,0xF2,0x98,0x87, +0xE7,0xFF,0xB1,0xE4,0xE7,0xFF,0x9F,0xDE,0x98,0x88,0xE7,0xFF,0xFF,0x35,0xE7,0xFF, +0x9F,0xDE,0x9A,0xE0,0xD0,0x68,0x00,0x86,0xE7,0xFF,0x9F,0xB6,0x98,0x88,0xE7,0xFF, +0xB1,0xA8,0x9A,0xE1,0x88,0x77,0x0D,0x21,0x06,0x9C,0x28,0x85,0x29,0x1C,0x21,0xE8, +0x0D,0x21,0x14,0x0D,0x41,0x10,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x80,0x01,0x80,0x01, +0x80,0x01,0x80,0x01,0xE7,0xFF,0x8C,0x60,0x0C,0x61,0x00,0xE7,0xFF,0x8C,0x5A,0x0C, +0x61,0x04,0x0E,0xE1,0x02,0xD2,0xE0,0x1D,0x42,0x0E,0xE1,0x02,0xC1,0x80,0x10,0x01, +0xC1,0x40,0x10,0x01,0x57,0x17,0x10,0xFD,0x8C,0x00,0xDE,0xFD,0x4A,0x00,0xCC,0xD3, +0x00,0x0A,0x92,0x50,0x60,0x10,0xE7,0xFF,0x8C,0x3C,0xC2,0xE0,0x10,0x01,0xEB,0x17, +0x00,0xBB,0x9F,0x01,0x5F,0x18,0x04,0xEF,0x17,0x00,0xBB,0xC2,0xE0,0x10,0x01,0xEB, +0x17,0x08,0x85,0x23,0x00,0x24,0x9F,0x01,0xEF,0x17,0x08,0x85,0xE7,0xFF,0x8C,0x38, +0x0A,0xEC,0x0B,0xC1,0x60,0x10,0x01,0x40,0x63,0xBD,0xFD,0x6B,0x06,0xFE,0x5E,0xE3, +0x04,0x5E,0xE3,0xBB,0x20,0x02,0x0F,0x0A,0xEB,0x01,0x56,0xF7,0x20,0x22,0xE1,0xE8, +0x98,0x61,0xE7,0xFF,0xB3,0x60,0x20,0x61,0xC6,0xE7,0xFF,0x9E,0x54,0x20,0x64,0x56, +0xC2,0xE0,0x10,0x01,0xF2,0xF7,0x00,0xC0,0x56,0xF7,0x01,0x22,0xE1,0x72,0xE4,0x00, +0x00,0x1F,0xE7,0xFF,0x9E,0x22,0x20,0x63,0xA8,0xE4,0x00,0x00,0x9D,0xE7,0xFF,0xC5, +0xFE,0x0A,0xEB,0x01,0xC6,0xF7,0xFF,0xDF,0x0E,0xEB,0x01,0xE7,0xFF,0x9D,0xF0,0x20, +0x60,0x5E,0x98,0x81,0x98,0xA0,0xE7,0xFF,0x46,0xA4,0x98,0x60,0x88,0x83,0xE7,0xFF, +0xAC,0x68,0xE4,0x00,0x00,0x43,0x98,0x80,0x98,0x62,0xE7,0xFF,0xAC,0x50,0xFC,0x60, +0x01,0x5E,0xE7,0xFF,0x55,0xC0,0x98,0x60,0xE7,0xFF,0x4B,0x8E,0xE7,0xFF,0x8B,0x18, +0x0C,0x6C,0x09,0xE7,0xFF,0xC6,0x60,0xE7,0xFF,0x8B,0x02,0x0A,0xEC,0x0F,0x40,0x63, +0xBD,0x5E,0xE3,0x04,0xC2,0xE0,0x3E,0x6E,0x20,0x01,0xB3,0x0A,0xEB,0x01,0x56,0xF7, +0x80,0x22,0xE1,0x8C,0xE7,0xFF,0x9D,0x3E,0x20,0x6D,0x72,0xC2,0xE0,0x10,0x01,0xF2, +0xF7,0x00,0xC0,0x56,0xF7,0x01,0x22,0xE1,0x3A,0xC1,0x80,0x10,0x01,0xEA,0xEC,0x0D, +0x67,0x9E,0xE1,0xEE,0xEC,0x0D,0x67,0xE7,0xFF,0xC4,0xEA,0x0A,0xEB,0x01,0xC6,0xF7, +0xFF,0x7F,0x0E,0xEB,0x01,0xEA,0xEC,0x0D,0x67,0xD2,0xEC,0x00,0xF9,0x98,0x63,0xE7, +0xFF,0xB1,0xC6,0x20,0x60,0x56,0x98,0x61,0x98,0x80,0xE7,0xFF,0xAB,0x50,0x98,0x60, +0xE7,0xFF,0x4A,0xE6,0xE4,0x00,0x00,0x19,0x98,0x63,0x98,0x80,0xE7,0xFF,0xAB,0x2C, +0xE7,0xFF,0xC5,0x66,0x0A,0xEA,0x01,0x52,0xF7,0x10,0x0E,0xEA,0x01,0xE4,0x00,0x05, +0x25,0xC6,0xF7,0x01,0x00,0xD2,0xE0,0x14,0x52,0xC2,0xE0,0x10,0x01,0x98,0x60,0xEC, +0x17,0x0D,0x67,0xE7,0xFF,0x89,0x52,0xFC,0x60,0x01,0x00,0xE7,0xFF,0x89,0x52,0xFC, +0x60,0x01,0x00,0xE7,0xFF,0x89,0x62,0xE7,0xFF,0x9C,0x18,0xD0,0x67,0x12,0xC5,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBA,0xAC,0x4C,0x63,0x10,0x8C,0x77,0x0E,0xE3,0x02,0x86, +0xE9,0xE7,0xFF,0x9B,0xF8,0x20,0x60,0x46,0x98,0x80,0xE7,0xFF,0xAD,0xD0,0x98,0x60, +0x98,0x87,0xE4,0x00,0x03,0xBF,0xE7,0xFF,0x9B,0xCE,0xD0,0x67,0x11,0x4E,0x98,0x60, +0x98,0x87,0xE4,0x00,0x03,0x47,0xE7,0xFF,0xFA,0x2E,0xD0,0x60,0x10,0xCA,0xE7,0xFF, +0xAF,0xC2,0x5D,0x63,0x04,0x98,0x61,0xE7,0xFF,0xB0,0x76,0xD0,0x60,0x0C,0x76,0xC1, +0x60,0x19,0x0A,0x20,0x06,0x19,0xE7,0xFF,0x49,0xAE,0xE7,0xFF,0x49,0x7E,0x5C,0x63, +0x00,0x24,0x64,0x2B,0xC1,0x60,0x32,0x0A,0x20,0x00,0x91,0x98,0x80,0x98,0x62,0xE7, +0xFF,0xA9,0xC6,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x53,0x36,0x98,0x60,0xE7,0xFF,0x49, +0x04,0xE7,0xFF,0x88,0x8E,0x0C,0x6C,0x09,0xE4,0x00,0x02,0xFB,0xE7,0xFF,0x4D,0xFE, +0x98,0x61,0xE4,0x00,0x01,0xDF,0xE7,0xFF,0xF9,0x6E,0xD0,0x60,0x0D,0xCA,0xE7,0xFF, +0xAF,0x02,0xE7,0xFF,0x53,0x62,0xE7,0xFF,0x53,0xF2,0xD0,0x61,0x09,0x7A,0xE7,0xFF, +0x54,0x12,0x20,0x65,0x06,0xE7,0xFF,0x48,0xA8,0x98,0x62,0xE7,0xFF,0xAF,0x8E,0x20, +0x60,0x82,0xE7,0xFF,0x48,0x66,0x5C,0x63,0x00,0x20,0x60,0x58,0x98,0x63,0x98,0x80, +0xE7,0xFF,0xA9,0x04,0xE7,0xFF,0x87,0xE8,0x0C,0x6C,0x0D,0xE4,0x00,0x02,0x55,0x98, +0x62,0x98,0x80,0xE7,0xFF,0xA8,0xDE,0xFC,0x60,0x01,0x5E,0xE7,0xFF,0x52,0x4E,0xE4, +0x00,0x02,0x2D,0xE7,0xFF,0x53,0xA8,0x98,0x62,0xE4,0x00,0x01,0x11,0xE7,0xFF,0xF8, +0xA0,0xD0,0x60,0x0A,0x92,0xE7,0xFF,0xAE,0x34,0xE7,0xFF,0x54,0x10,0xE7,0xFF,0x54, +0xD2,0xC1,0x80,0x10,0x01,0x89,0x63,0xFD,0x8C,0x0D,0x64,0x5E,0xEB,0x04,0xC2,0xE0, +0x25,0x6E,0x20,0x00,0x1D,0xFC,0x60,0x01,0x2C,0xE7,0xFF,0x56,0x08,0x20,0x60,0x54, +0x0A,0xEC,0x01,0x9E,0xE1,0x5E,0xF7,0x04,0x0E,0xEC,0x01,0x26,0xE4,0x8B,0xE4,0x00, +0x00,0x55,0x5E,0xEB,0x04,0x88,0x6B,0xC2,0xE0,0x4A,0xEE,0x20,0x00,0x1D,0xFC,0x60, +0x02,0x58,0xE7,0xFF,0x56,0x1C,0x20,0x63,0x6A,0xE4,0x00,0x00,0x5D,0xE7,0xFF,0x56, +0x2C,0x0C,0x0C,0x01,0xE4,0x00,0x00,0x37,0x5E,0xEB,0x04,0x88,0x6B,0xC2,0xE0,0x4A, +0xEE,0x20,0x00,0x1D,0xFC,0x60,0x02,0x58,0xE7,0xFF,0x55,0xD0,0x20,0x63,0x86,0x98, +0x63,0x98,0x80,0xE4,0x00,0x00,0xFD,0x0C,0x0C,0x01,0xE4,0x00,0x00,0x9F,0xE7,0xFF, +0x98,0xFE,0x20,0x64,0x3E,0xE7,0xFF,0x98,0xF0,0x88,0x83,0x98,0x64,0xE4,0x00,0x00, +0x71,0xE7,0xFF,0x98,0xD8,0x20,0x63,0xC0,0xE7,0xFF,0x98,0xCA,0xD0,0x60,0x05,0x3E, +0x98,0x64,0x98,0x80,0xE7,0xFF,0xAA,0x9C,0x98,0x64,0xE4,0x00,0x00,0x8B,0x98,0x64, +0x98,0x89,0xE4,0x00,0x00,0x27,0xE7,0xFF,0x98,0x8E,0x20,0x64,0x76,0xE7,0xFF,0x98, +0x80,0x88,0x83,0x98,0x67,0xE7,0xFF,0xAA,0x5A,0x0A,0xEA,0x01,0xCA,0xF7,0x01,0x00, +0x0E,0xEA,0x01,0xE4,0x00,0x00,0xE1,0xE7,0xFF,0x98,0x4C,0x20,0x63,0x88,0xE7,0xFF, +0x98,0x3E,0x20,0x61,0x86,0x98,0x67,0x98,0x80,0xE7,0xFF,0xAA,0x12,0x98,0x67,0x98, +0x81,0xE7,0xFF,0xA6,0xA2,0xE7,0xFF,0xC0,0xDC,0xE4,0x00,0x00,0x95,0x0E,0xE1,0x06, +0x22,0xE1,0x3C,0x0E,0xE1,0x06,0x56,0xF7,0x20,0x22,0xE1,0x18,0x98,0x60,0xE7,0xFF, +0x84,0xDC,0x50,0x60,0x20,0xE7,0xFF,0x84,0xE6,0xE7,0xFF,0x7A,0x3C,0xC2,0xE0,0x10, +0x01,0xEB,0x17,0x00,0xD1,0xC7,0x18,0xFF,0xFE,0x50,0x60,0x20,0xEF,0x17,0x00,0xD1, +0xE7,0xFF,0x84,0xC0,0xC2,0xE0,0x10,0x01,0xEB,0x17,0x00,0xCF,0x53,0x18,0x20,0xEF, +0x17,0x00,0xCF,0xC2,0xE0,0x10,0x01,0xF0,0x77,0x01,0xAE,0xE7,0xFF,0x84,0x62,0x0D, +0x81,0x0A,0x0D,0x61,0x0E,0x0D,0x41,0x12,0x0D,0x21,0x16,0x1C,0x21,0x18,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17, +0x01,0x0C,0x63,0x02,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17, +0x01,0x0C,0x83,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x14,0x0B,0x17,0x01,0x53,0x18,0x01,0x0F,0x17, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18, +0x20,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17, +0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29,0x9C,0x30,0x0D,0x21,0x0C,0x0D, +0x41,0x08,0x0D,0x61,0x04,0x0D,0x81,0x00,0xC1,0x54,0x00,0x01,0xC9,0x8A,0x22,0x28, +0x0A,0xEC,0x01,0xC6,0xF7,0xFF,0xFB,0xC9,0x6A,0x22,0x04,0x0E,0xEC,0x01,0xFF,0x00, +0x80,0x00,0x0A,0xEB,0x01,0x46,0xF7,0xC5,0x5E,0xF7,0x04,0xC9,0x4A,0x24,0xA8,0x0E, +0xEB,0x01,0x0A,0xEA,0x01,0xCA,0xF7,0x30,0x00,0x50,0x60,0x64,0x0E,0xEA,0x01,0xE4, +0x00,0x24,0x8E,0x0A,0xEC,0x01,0x52,0xF7,0x04,0x50,0x60,0x1E,0x0E,0xEC,0x01,0xE4, +0x00,0x24,0x6E,0x0A,0xEB,0x01,0xC6,0xF7,0x7F,0xFF,0x0E,0xEB,0x01,0x0A,0xEA,0x01, +0xC6,0xF7,0xCF,0xFF,0x0E,0xEA,0x01,0x0D,0x81,0x02,0x0D,0x61,0x06,0x0D,0x41,0x0A, +0x0D,0x21,0x0E,0x1C,0x21,0x10,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x2C, +0x08,0x77,0x01,0x4C,0x63,0x09,0x54,0x63,0x1F,0x9C,0x61,0x85,0x29,0x9C,0x7F,0x5C, +0x63,0x00,0x5C,0x62,0xFB,0x20,0x00,0x81,0xC2,0xF4,0x00,0x01,0x4C,0x63,0x08,0xCA, +0xF7,0x24,0x2C,0x54,0x63,0x3E,0x0B,0x17,0x01,0x1F,0x20,0xC1,0x47,0x18,0xCC,0x44, +0x63,0xC5,0x0C,0x77,0x01,0x85,0x29,0x9B,0x19,0x20,0x60,0x62,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x24,0x10,0x0B,0x37,0x01,0x47,0x19,0xC4,0x53,0x18,0x04,0xE4,0x00,0x00, +0x87,0x20,0x64,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x17,0x01,0x53, +0x18,0x06,0xE4,0x00,0x00,0x5D,0x20,0x68,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24, +0x10,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xF9,0xE4,0x00,0x00,0x31,0x20,0x6C,0x5E,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x24,0x10,0x0B,0x37,0x01,0x47,0x19,0xC4,0x53,0x18,0x02, +0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0x9C,0x30,0x0D,0x21,0x0C,0x0D,0x41,0x08, +0x0C,0xA1,0x04,0x95,0x50,0xC9,0x4A,0x20,0x80,0x8D,0x43,0x4D,0x4A,0x18,0x88,0x6A, +0xE7,0xFF,0xFC,0xE0,0x0C,0xA1,0x06,0x1C,0x6A,0x04,0x0D,0x21,0x0E,0x0D,0x41,0x0A, +0x88,0x85,0x1C,0x21,0x10,0xE7,0xFF,0xFC,0xB7,0x1C,0x21,0xE8,0x0D,0x41,0x10,0x5D, +0x44,0x00,0x4E,0xEA,0x08,0x0D,0x61,0x0C,0x0D,0x81,0x08,0x5D,0x65,0x00,0x5C,0x63, +0x00,0x4D,0x83,0x18,0x8D,0x8B,0x8D,0x97,0x06,0xE0,0x81,0xCA,0xF7,0x04,0x00,0x0D, +0x21,0x14,0x0D,0xA1,0x04,0xC5,0x8C,0x1F,0xFC,0x5D,0xA6,0x00,0x8D,0x97,0x88,0x6C, +0xE7,0xFF,0xFC,0x00,0x55,0x4A,0x01,0x50,0x80,0xFF,0x4D,0x4A,0x08,0x8D,0x6A,0x4D, +0x6B,0x18,0x4C,0x84,0x5C,0x4D,0x6D,0x5C,0x44,0x84,0x27,0x0D,0xA1,0x06,0x44,0x83, +0x24,0x0D,0x41,0x12,0x88,0x6C,0x44,0x84,0x5D,0x0D,0x81,0x0A,0x0D,0x61,0x0E,0x0D, +0x21,0x16,0x1C,0x21,0x18,0xE7,0xFF,0xFB,0xD7,0x5C,0x84,0x04,0x20,0x60,0x28,0x20, +0x64,0xC2,0xE4,0x00,0x00,0x33,0x4C,0x84,0x41,0xC2,0xF4,0x00,0x01,0x9C,0x9F,0xCA, +0xF7,0x24,0x34,0xC4,0x84,0x01,0xFF,0xE4,0x00,0x00,0x2B,0x4C,0x84,0x41,0xC2,0xF4, +0x00,0x01,0x9C,0x9F,0xCA,0xF7,0x24,0x38,0xC4,0x84,0x01,0xFF,0x0C,0x97,0x01,0x85, +0x29,0x07,0x00,0xFF,0xCB,0x18,0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00, +0x00,0x7D,0xC2,0xF4,0x00,0x01,0x47,0x64,0x27,0xCB,0x37,0x24,0x3C,0x0B,0x59,0x01, +0x47,0x5A,0xDC,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x40,0x47,0x04,0xC4,0x0B,0x37,0x01, +0x4F,0x18,0x81,0x44,0x84,0x27,0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47, +0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2, +0xF4,0x00,0x01,0x47,0x9A,0xD7,0xCB,0x37,0x24,0x3C,0x0B,0x79,0x01,0x47,0x7B,0xE4, +0x47,0x5A,0xDD,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x40,0x44,0x84,0xC4,0x0B,0x57,0x01, +0x4C,0x84,0x81,0x47,0x24,0x27,0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85, +0x29,0x07,0x00,0xFF,0xCB,0x18,0xFF,0xFF,0x20,0x60,0x28,0x20,0x65,0xD2,0xE4,0x00, +0x00,0x7D,0xC2,0xF4,0x00,0x01,0x47,0x64,0x27,0xCB,0x37,0x24,0x1C,0x0B,0x59,0x01, +0x47,0x5A,0xDC,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x20,0x47,0x04,0xC4,0x0B,0x37,0x01, +0x4F,0x18,0x81,0x44,0x84,0x27,0x4C,0x84,0x81,0x44,0x84,0xC4,0x47,0x18,0xC7,0x47, +0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0xE4,0x00,0x00,0x6F,0x5F,0x44,0x04,0xC2, +0xF4,0x00,0x01,0x47,0x9A,0xD7,0xCB,0x37,0x24,0x1C,0x0B,0x79,0x01,0x47,0x7B,0xE4, +0x47,0x5A,0xDD,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x20,0x44,0x84,0xC4,0x0B,0x57,0x01, +0x4C,0x84,0x81,0x47,0x24,0x27,0x47,0x1A,0xCC,0x44,0x84,0xC5,0x0C,0x97,0x01,0x85, +0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x24,0x80,0x0B,0x38,0x01,0x5F,0x23,0x04,0x0F, +0x38,0x01,0x07,0x20,0xFF,0xCB,0x39,0xFF,0xFF,0xCA,0xF7,0x24,0x84,0x44,0x63,0xCC, +0x0B,0x17,0x01,0x4C,0x63,0x81,0xFF,0x20,0xFF,0x00,0x47,0x18,0xCC,0x44,0x63,0xC5, +0x0C,0x77,0x01,0x85,0x29,0x07,0x00,0xFF,0xCB,0x18,0xFF,0xFF,0x20,0x60,0x28,0x20, +0x65,0xD2,0xE4,0x00,0x00,0x7D,0xC2,0xF4,0x00,0x01,0x47,0x64,0x27,0xCB,0x37,0x24, +0x24,0x0B,0x59,0x01,0x47,0x5A,0xDC,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x47,0x04, +0xC4,0x0B,0x37,0x01,0x4F,0x18,0x81,0x44,0x84,0x27,0x4C,0x84,0x81,0x44,0x84,0xC4, +0x47,0x18,0xC7,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0xE4,0x00,0x00,0x6F, +0x5F,0x44,0x04,0xC2,0xF4,0x00,0x01,0x47,0x9A,0xD7,0xCB,0x37,0x24,0x24,0x0B,0x79, +0x01,0x47,0x7B,0xE4,0x47,0x5A,0xDD,0x0F,0x59,0x01,0xCA,0xF7,0x24,0x28,0x44,0x84, +0xC4,0x0B,0x57,0x01,0x4C,0x84,0x81,0x47,0x24,0x27,0x47,0x1A,0xCC,0x44,0x84,0xC5, +0x0C,0x97,0x01,0x85,0x29,0xC3,0x14,0x00,0x01,0xCA,0xF8,0x22,0x08,0x20,0x64,0x3A, +0x0B,0x37,0x01,0xCB,0x39,0x10,0x00,0xE4,0x00,0x00,0x1D,0x20,0x60,0x36,0x0B,0x37, +0x01,0xC7,0x39,0xEF,0xFF,0x0F,0x37,0x01,0xCA,0xF8,0x22,0x08,0x0B,0x17,0x01,0xCB, +0x18,0x20,0x00,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x1F,0x00,0x80,0x20,0x60, +0x28,0x20,0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x54, +0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x64,0x0B,0x37,0x01,0x54, +0x84,0x7F,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00, +0x20,0x60,0x28,0x20,0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x24,0x50,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x61,0x13,0x17, +0x00,0x54,0x84,0x1F,0x57,0x18,0xE0,0x44,0x84,0xC5,0x18,0x97,0x00,0x85,0x29,0x9C, +0x30,0x0D,0x41,0x08,0x0D,0x61,0x04,0x0D,0x21,0x0C,0x5D,0x44,0x00,0x89,0x63,0x1C, +0x8A,0xF1,0x4C,0x84,0x08,0x5C,0x83,0xF3,0x20,0x00,0x19,0x50,0x80,0x1F,0x88,0x6B, +0xE7,0xFF,0xFF,0x5A,0x1F,0x00,0x80,0x21,0x60,0x28,0x21,0x64,0xAA,0xE4,0x00,0x00, +0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x4C,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x24,0x60,0x0B,0x37,0x01,0x55,0x4A,0x7F,0x47,0x19,0xC4,0x47,0x0A, +0xC5,0x0F,0x17,0x01,0x0D,0x61,0x06,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21,0x10, +0x85,0x29,0x20,0x64,0x8E,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22, +0x60,0x0B,0x38,0x01,0x53,0x39,0xF0,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF, +0xF0,0xE4,0x00,0x00,0x47,0x20,0x60,0x8A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x04, +0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0xC7,0x39,0xFF,0x0F,0x0F,0x38,0x01,0x0B,0x17, +0x01,0x53,0x18,0x0F,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x8E,0xC2,0xF4,0x00,0x01, +0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0x53,0x39,0x08,0x0F,0x38, +0x01,0x0B,0x17,0x01,0xC7,0x18,0xFE,0xFF,0xE4,0x00,0x00,0x49,0x20,0x60,0x8E,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x22,0x04,0xCA,0xF7,0x22,0x60,0x0B,0x38,0x01,0xC7,0x39, +0xFF,0xF7,0x0F,0x38,0x01,0x0B,0x17,0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01,0x85, +0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x60,0x0B,0x17,0x01,0xCB, +0x18,0x02,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x22,0x60,0x0B,0x17,0x01,0xC7,0x18,0xFD,0xFF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4, +0x00,0x01,0x54,0x63,0x7F,0xCA,0xF7,0x24,0xA0,0x1F,0x20,0x80,0x0B,0x17,0x01,0x47, +0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x4C,0x63, +0x40,0xCA,0xF7,0x24,0xA0,0xC4,0x63,0x7F,0x00,0x0B,0x17,0x01,0xFF,0x20,0x80,0xFF, +0x47,0x18,0xCC,0x47,0x03,0xC5,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x24,0xA1,0x10,0x77,0x00,0x54,0x63,0x7F,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0xE4,0x00,0x00, +0x2B,0x20,0x60,0x52,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x53, +0x18,0x80,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x24,0xA0,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF,0xE4,0x00,0x00,0x39,0x20,0x60,0x6E, +0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x24,0xA0,0x0B,0x17,0x01,0x47, +0x18,0xCD,0x5F,0x18,0x04,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C,0x63, +0x00,0xCA,0xF7,0x22,0x0C,0xFF,0x20,0xFF,0x00,0x0B,0x17,0x01,0x47,0x18,0xCC,0x47, +0x03,0xC5,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xFF,0x40, +0xFF,0x00,0xCA,0xF7,0x22,0xF0,0x47,0x03,0xD4,0x0B,0x37,0x01,0x5F,0x39,0x00,0x47, +0x18,0xCD,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x22,0x38,0x0B,0x17,0x01,0x0C,0x77,0x01,0x85,0x29,0x20,0x64,0x6A,0xC2,0xF4,0x00, +0x01,0x9B,0x3C,0xCA,0xF7,0x25,0xC0,0x0B,0x17,0x01,0x47,0x18,0xCC,0x53,0x18,0x01, +0xE4,0x00,0x00,0x3F,0x20,0x60,0x7A,0xC2,0xF4,0x00,0x01,0xCB,0x17,0x22,0x38,0xCA, +0xF7,0x25,0xC0,0x0B,0x38,0x01,0x0C,0x18,0x01,0x0B,0x17,0x01,0x53,0x18,0x03,0x0F, +0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x20,0x64,0x62,0x4C,0x63,0x24,0xC2,0xF4,0x00, +0x01,0x5C,0x63,0x04,0xCA,0xF7,0x22,0xCC,0x0C,0x77,0x01,0xE4,0x00,0x00,0x25,0x20, +0x60,0x3A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xCC,0x0C,0x17,0x01,0x85,0x29,0x20, +0x60,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xC7,0x18,0xFF, +0xFE,0xE4,0x00,0x00,0x2B,0x20,0x64,0x52,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8, +0x0B,0x17,0x01,0x53,0x18,0x01,0x0F,0x17,0x01,0x85,0x29,0x20,0x60,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xC7,0x18,0xF0,0xFF,0xE4,0x00,0x00, +0x2D,0x20,0x64,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0xE8,0x0B,0x17,0x01,0xCB, +0x18,0x0F,0x00,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x00,0xC4,0x84,0x03,0xFF,0x20, +0x64,0x70,0x20,0x60,0x34,0x20,0x68,0x88,0x20,0x6C,0xDA,0xE4,0x00,0x00,0x51,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x24,0x68,0xE4,0x00,0x00,0x49,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x24,0x6C,0xE4,0x00,0x00,0x31,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x70,0xE4, +0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x24,0x74,0x0C,0x97,0x01,0x85,0x29, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x23,0x24,0x0B,0x17,0x01,0x53,0x18,0x20,0x0F,0x17, +0x01,0x5C,0x63,0x00,0x07,0x00,0x20,0xCB,0x18,0x41,0x00,0x44,0x63,0xC5,0x4C,0x63, +0x10,0x0C,0x83,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xDF,0x0F,0x17,0x01,0x85,0x29, +0xFC,0x21,0xFE,0x88,0x50,0xA0,0x96,0xED,0x21,0x01,0x74,0xED,0x41,0x01,0x70,0xED, +0x61,0x01,0x6C,0x88,0x61,0xC1,0x78,0x00,0x21,0xFD,0x6B,0xB4,0xBE,0x88,0x8B,0xE7, +0xFF,0x47,0xF4,0xFD,0x41,0x00,0x96,0xFC,0x8B,0x00,0x96,0x88,0x6A,0x50,0xA0,0xD2, +0xE7,0xFF,0x47,0xD2,0x8A,0xE1,0xC3,0x54,0x00,0x01,0xFF,0x60,0xFF,0x00,0x0B,0x37, +0x01,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B, +0x37,0x03,0x47,0xB9,0xCF,0x8F,0x1A,0x0B,0x98,0x01,0x47,0x9C,0xEC,0x0B,0xB7,0x05, +0x47,0x39,0xEC,0x47,0x3C,0xCD,0x0F,0x38,0x01,0x9E,0xE6,0xD5,0x57,0xFE,0x9E,0xFE, +0xE1,0x00,0x96,0xFF,0x81,0x01,0x68,0x0B,0x37,0x01,0x47,0x19,0xDC,0x5F,0x39,0x00, +0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x47,0xD9,0xCF,0x8F,0x1A, +0x0B,0xB8,0x01,0x47,0xBD,0xF4,0x0B,0xD7,0x05,0x47,0x39,0xF4,0x47,0x3D,0xCD,0x0F, +0x38,0x01,0x9E,0xE6,0xD7,0x97,0xFE,0x9E,0xED,0x61,0x01,0x6E,0xED,0x41,0x01,0x72, +0xED,0x21,0x01,0x76,0xFC,0x21,0x01,0x78,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x22,0x00,0x0C,0x18,0x01,0xCA,0xF7,0x24,0x14,0xFF,0x20,0xFF,0x07,0x0B,0x17,0x01, +0x47,0x18,0xCC,0x53,0x18,0x30,0x0F,0x17,0x01,0x85,0x29,0x5C,0x84,0x00,0x9B,0x10, +0x20,0x60,0x28,0x20,0x64,0xAA,0xE4,0x00,0x00,0x21,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x22,0x10,0xE4,0x00,0x00,0x19,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x22,0x14,0x0B,0x37, +0x01,0x54,0x84,0x0F,0x47,0x19,0xC4,0x47,0x04,0xC5,0x0F,0x17,0x01,0x85,0x29,0xC2, +0xF4,0x00,0x01,0xCB,0x17,0x74,0xD8,0x18,0x18,0x00,0xCB,0x37,0x74,0x10,0x5C,0x63, +0x00,0x18,0x79,0x00,0xCB,0x37,0x76,0x30,0x18,0x19,0x00,0x53,0x40,0x24,0xCB,0x37, +0x74,0x00,0x1B,0x59,0x00,0xCB,0x77,0x74,0x28,0x53,0x20,0x60,0x1B,0x3B,0x00,0xCB, +0x77,0x74,0x30,0x1B,0x3B,0x00,0xCB,0x77,0x74,0x38,0x53,0x20,0x1C,0x1B,0x3B,0x00, +0xCB,0x77,0x74,0x40,0x1B,0x3B,0x00,0xCB,0x37,0x74,0xA8,0x13,0x39,0x00,0xCB,0x37, +0x74,0x78,0x9B,0x69,0x1B,0x79,0x00,0xCB,0x37,0x74,0x70,0x18,0x19,0x00,0xCB,0x37, +0x74,0x60,0x13,0x79,0x00,0x1B,0x59,0x00,0xCA,0xF7,0x74,0x61,0x13,0x37,0x00,0x18, +0x17,0x00,0x98,0x61,0x12,0xF8,0x00,0x52,0xF7,0x01,0x1A,0xF8,0x00,0x85,0x29,0x5C, +0x63,0x00,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x20,0x18,0x77,0x00,0x0B,0x17,0x01, +0xC7,0x18,0xFE,0xFF,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74, +0x68,0x10,0x77,0x00,0x4C,0x63,0x21,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x74,0xE0,0x10,0x77,0x00,0x4C,0x63,0x09,0x54,0x63,0x01,0x85,0x29,0xC2, +0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00,0x4C,0x63,0x29,0x54,0x63,0x01, +0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xE0,0x10,0x77,0x00,0x4C,0x63,0x19, +0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68,0x10,0x77,0x00, +0x4C,0x63,0x11,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x68, +0x08,0x77,0x01,0x4C,0x63,0x49,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x74,0x68,0x08,0x77,0x01,0x4C,0x63,0x51,0x54,0x63,0x01,0x85,0x29,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x74,0x61,0x13,0x17,0x00,0x57,0x18,0xFD,0x1B,0x17,0x00,0x85, +0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x61,0x13,0x17,0x00,0x53,0x18,0x02,0x1B, +0x17,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xC0,0x12,0xF7,0x00,0x85, +0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0xA8,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x74,0xC8,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x74,0xA0,0x12,0xF7,0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x74,0x20, +0x10,0x77,0x00,0x85,0x29,0x5C,0x63,0x00,0xC3,0x14,0x00,0x01,0x4E,0xE3,0x10,0xCB, +0x18,0x2A,0x00,0x8E,0xF8,0x08,0x77,0x00,0x9A,0xE8,0xCC,0x63,0x00,0x03,0x40,0x63, +0xB8,0x85,0x29,0x5C,0x84,0x04,0x5E,0xE4,0x00,0xD2,0xEF,0x05,0xAD,0x4E,0xF7,0x10, +0xC3,0x18,0x00,0x21,0xFF,0x18,0xBC,0x30,0x8E,0xF8,0xC3,0x34,0x00,0x01,0x0F,0x17, +0x02,0xCA,0xF9,0x26,0x18,0x0B,0x57,0x01,0xC7,0x5A,0xFF,0xF3,0x1F,0x60,0xCF,0x0F, +0x57,0x01,0x0B,0x57,0x01,0x47,0x5A,0xDC,0x53,0x5A,0x10,0x4C,0x84,0x49,0x0F,0x57, +0x01,0x9A,0xE1,0xCB,0x59,0x26,0x20,0xE4,0x00,0x00,0x31,0x4F,0x37,0x08,0x9E,0xE1, +0x8F,0x38,0x5E,0xF7,0x04,0x0B,0x39,0x01,0xC7,0x39,0x3F,0xFF,0x0F,0x3A,0x01,0xC3, +0x34,0x00,0x01,0xD6,0xE4,0xFF,0x40,0x20,0x60,0x96,0xCB,0x39,0x26,0x38,0x0B,0x18, +0x01,0x0A,0xF9,0x01,0x4F,0x18,0x60,0xFF,0x40,0x8F,0xFF,0xC7,0x18,0x70,0x00,0x46, +0xF7,0xD4,0x46,0xF8,0xBD,0x0E,0xF9,0x01,0xE4,0x00,0x00,0x4B,0x20,0x64,0x86,0xCA, +0xF9,0x26,0x38,0xFF,0x60,0xF8,0xFF,0x0B,0x38,0x01,0x0B,0x57,0x01,0x4F,0x39,0x40, +0x47,0x1A,0xDC,0xC7,0x39,0x07,0x00,0x47,0x19,0xC5,0x0F,0x17,0x01,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x26,0x18,0x0B,0x17,0x01,0x53,0x18,0x30,0x0F,0x17,0x01,0x85,0x29, +0x5C,0x84,0x00,0xD0,0x8F,0x03,0x9D,0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x58,0x4C, +0x84,0x10,0xC3,0x14,0x00,0x01,0x8C,0x97,0xCB,0x38,0x26,0x34,0x0E,0xE4,0x02,0x0B, +0x59,0x01,0x0B,0x77,0x03,0xFF,0x80,0xC0,0x00,0xC7,0x7B,0x3F,0xFF,0x47,0x5A,0xE4, +0x47,0x5B,0xD5,0x0F,0x59,0x01,0x20,0x60,0x7E,0x0B,0x37,0x01,0xCB,0x18,0x26,0x38, +0x4F,0x39,0x60,0x0B,0x58,0x01,0xFF,0x60,0x8F,0xFF,0xC7,0x39,0x70,0x00,0x46,0xFA, +0xDC,0xE4,0x00,0x00,0x3F,0x20,0x64,0x86,0x0B,0x37,0x01,0xCB,0x18,0x26,0x38,0x4F, +0x39,0x40,0x0B,0x58,0x01,0xFF,0x80,0xF8,0xFF,0xC7,0x39,0x07,0x00,0x46,0xFA,0xE4, +0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29,0x5C,0x84,0x00,0xD0,0x8C,0x04,0x1D,0xC2, +0xF8,0x00,0x21,0xFE,0xF7,0xBB,0x58,0x4C,0x84,0x10,0xFF,0x40,0xC0,0x00,0x8C,0x97, +0x0E,0xE4,0x02,0x20,0x60,0xD6,0xC3,0x14,0x00,0x01,0x0B,0x77,0x03,0xCB,0x38,0x26, +0xC4,0xC7,0x7B,0x3F,0xFF,0x0B,0x99,0x01,0x47,0x5C,0xD4,0x47,0x5B,0xD5,0xCB,0x18, +0x26,0x38,0x0F,0x59,0x01,0x1F,0x60,0x8F,0x0B,0x37,0x01,0x0B,0x58,0x01,0x4F,0x39, +0x20,0x57,0x39,0x70,0xE4,0x00,0x00,0x63,0x20,0x64,0xDA,0xC3,0x14,0x00,0x01,0x0B, +0x77,0x03,0xCB,0x38,0x26,0xC8,0xC7,0x7B,0x3F,0xFF,0x0B,0x99,0x01,0x47,0x5C,0xD4, +0x47,0x5B,0xD5,0xCB,0x18,0x26,0x38,0x0F,0x59,0x01,0x9B,0x78,0x0B,0x37,0x01,0x0B, +0x58,0x01,0x57,0x39,0x07,0x46,0xFA,0xDC,0x46,0xF9,0xBD,0x0E,0xF8,0x01,0x85,0x29, +0x5C,0x84,0x04,0x20,0x60,0x28,0x20,0x64,0xEE,0xE4,0x00,0x00,0x39,0xC2,0xF4,0x00, +0x01,0x4C,0x84,0x41,0xCA,0xF7,0x26,0xC0,0x54,0x84,0x3F,0x0B,0x17,0x01,0x1F,0x20, +0xC0,0xE4,0x00,0x00,0x2F,0xC2,0xF4,0x00,0x01,0xC4,0x84,0x3F,0x00,0xCA,0xF7,0x26, +0xC0,0xFF,0x20,0xC0,0xFF,0x0B,0x17,0x01,0x47,0x18,0xCC,0x44,0x84,0xC5,0x0C,0x97, +0x01,0x85,0x29,0x20,0x61,0x52,0x20,0x84,0x84,0x20,0x80,0x2C,0xD0,0x82,0x04,0xD6, +0xE4,0x00,0x00,0x5D,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7, +0x18,0x3F,0xFF,0xE4,0x00,0x01,0x01,0xC2,0xF4,0x00,0x01,0xFF,0x20,0x80,0x00,0xCA, +0xF7,0x26,0x30,0x0B,0x17,0x01,0xC7,0x18,0x3F,0xFF,0xE4,0x00,0x00,0x27,0xC2,0xF4, +0x00,0x01,0xFF,0x20,0xC0,0x00,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0x47,0x18,0xCD, +0x5F,0x18,0x04,0xE4,0x00,0x00,0xA1,0x20,0x65,0x3E,0x20,0x84,0x80,0x20,0x80,0x28, +0x20,0x89,0x1A,0xE4,0x00,0x00,0x63,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B, +0x17,0x01,0xC7,0x18,0xCF,0xFF,0xE4,0x00,0x00,0x5B,0xC2,0xF4,0x00,0x01,0xFF,0x20, +0xCF,0xFF,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18,0x20,0x00, +0xE4,0x00,0x00,0x27,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x30,0x0B,0x17,0x01,0xCB, +0x18,0x30,0x00,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x72,0xC2,0xF4,0x00,0x01,0xFF, +0x20,0x80,0x00,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F,0x18,0x04, +0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B, +0x17,0x01,0xC7,0x18,0x7F,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0xE4,0x00,0x00, +0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7, +0x18,0xDF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x26,0x24,0x0B,0x17,0x01,0xCB,0x18,0x40,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60, +0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0xBF,0xFF, +0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x24, +0x0B,0x17,0x01,0xCB,0x18,0x10,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x26,0x24,0x0B,0x17,0x01,0xC7,0x18,0xEF,0xFF,0x0F,0x17,0x01, +0x85,0x29,0x9C,0x38,0xC2,0xF4,0x00,0x01,0x0D,0x21,0x04,0xCA,0xF7,0x26,0x18,0x0B, +0x17,0x01,0xCB,0x18,0x40,0x00,0x98,0x60,0x0F,0x17,0x01,0xE7,0xFF,0xFF,0x1A,0x0D, +0x21,0x06,0x98,0x60,0x9C,0x28,0xE7,0xFF,0xFF,0x5F,0x20,0x64,0x72,0xC2,0xF4,0x00, +0x01,0xFF,0x20,0x80,0x00,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0x47,0x18,0xCD,0x5F, +0x18,0x04,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26, +0x00,0x0B,0x17,0x01,0xC7,0x18,0x7F,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x20,0x00,0xE4, +0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17, +0x01,0xC7,0x18,0xDF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x40,0x00,0xE4,0x00,0x00,0x2D, +0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18, +0xBF,0xFF,0x0F,0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x26,0x00,0x0B,0x17,0x01,0xCB,0x18,0x10,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xEF,0xFF,0x0F, +0x17,0x01,0x85,0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B, +0x17,0x01,0xCB,0x18,0x08,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00, +0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xF7,0xFF,0x0F,0x17,0x01,0x85, +0x29,0x20,0x64,0x5A,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x26,0x00,0x0B,0x17,0x01,0xCB, +0x18,0x04,0x00,0xE4,0x00,0x00,0x2D,0x20,0x60,0x56,0xC2,0xF4,0x00,0x01,0xCA,0xF7, +0x26,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFB,0xFF,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63, +0x00,0xC2,0xF4,0x00,0x01,0x4F,0x23,0x40,0xCA,0xF7,0x26,0x14,0x4C,0x63,0x60,0x0B, +0x17,0x01,0x44,0x79,0x1D,0x5F,0x18,0x00,0x44,0x63,0xC5,0x5C,0x63,0x04,0x0C,0x77, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xF0,0x00,0xCB,0x17,0x26,0x0C,0xC4, +0x63,0x0F,0xFF,0x0B,0x58,0x01,0x5C,0x63,0x06,0x47,0x5A,0xCC,0x47,0x43,0xD5,0x0F, +0x58,0x01,0xCA,0xF7,0x26,0x10,0x0B,0x17,0x01,0x47,0x38,0xCC,0x44,0x63,0xCD,0x0C, +0x77,0x01,0x85,0x29,0x9C,0x38,0xFF,0x00,0xE0,0x00,0x0D,0x21,0x04,0x0D,0x41,0x00, +0xC1,0x54,0x00,0x01,0xCA,0xEA,0x26,0x04,0x0B,0x37,0x01,0x47,0x39,0xC4,0xCB,0x39, +0x0F,0xA0,0x0F,0x37,0x01,0xCA,0xEA,0x26,0x08,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB, +0x18,0x10,0x60,0x98,0x60,0x0F,0x17,0x01,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF9,0x28, +0xCA,0xEA,0x26,0xC0,0xFF,0x20,0xC0,0xFF,0x0B,0x17,0x01,0x47,0x18,0xCC,0xCB,0x18, +0x08,0x00,0x98,0x60,0x0F,0x17,0x01,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF7,0xDA,0x98, +0x61,0xFC,0x80,0x08,0x03,0xE7,0xFF,0xF7,0xC6,0xCA,0xEA,0x26,0x00,0x0B,0x17,0x01, +0x53,0x18,0x0F,0x0F,0x17,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0x7F,0x0F,0x17,0x01, +0x0B,0x17,0x01,0xC7,0x18,0xFF,0xBF,0x98,0x68,0x0F,0x17,0x01,0xE7,0xFF,0xFE,0x44, +0x0D,0x21,0x06,0x0D,0x41,0x02,0xFC,0x60,0x01,0x2C,0x9C,0x28,0xE7,0xFF,0xFE,0x6F, +0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00,0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0x00,0x0B,0x17,0x01,0xC7,0x18, +0xFF,0xFD,0x0F,0x17,0x01,0x85,0x29,0x9C,0x7F,0x5C,0x63,0x00,0xD0,0x64,0x05,0x15, +0xC2,0xF8,0x00,0x21,0xFE,0xF7,0xBD,0xF0,0x4C,0x63,0x10,0xFF,0x00,0xFC,0xFF,0x8C, +0x77,0xC2,0xF4,0x00,0x01,0x0F,0x23,0x02,0x87,0x29,0xCB,0x17,0x3D,0x3C,0xCA,0xF7, +0x31,0x04,0x0B,0x38,0x01,0x53,0x39,0x01,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18, +0xFC,0xFF,0xE4,0x00,0x00,0xD3,0xCB,0x37,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59, +0x01,0x53,0x5A,0x01,0x0F,0x59,0x01,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x01, +0x00,0xE4,0x00,0x00,0x95,0xCB,0x37,0x3D,0x3C,0xCA,0xF7,0x31,0x04,0x0B,0x59,0x01, +0x53,0x5A,0x01,0x0F,0x59,0x01,0x0B,0x37,0x01,0x47,0x19,0xC4,0xCB,0x18,0x02,0x00, +0xE4,0x00,0x00,0x57,0xCA,0xF7,0x3D,0x3C,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFE,0xE4, +0x00,0x00,0x39,0xCB,0x17,0x3C,0x10,0xCA,0xF7,0x3C,0x14,0x0B,0x38,0x01,0x53,0x39, +0x01,0x0F,0x38,0x01,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFD,0x0F,0x17,0x01,0xC2,0xF4, +0x00,0x01,0xCA,0xF7,0x78,0x00,0x0B,0x17,0x01,0xC7,0x18,0xFF,0xFB,0x0F,0x17,0x01, +0x85,0x29,0x5C,0x63,0x00,0x5C,0x84,0x00,0x9A,0xE0,0x24,0x64,0x43,0xC2,0xF8,0x00, +0x21,0xFE,0xF7,0xBE,0x04,0x8C,0x77,0x12,0xE3,0x00,0xC3,0x14,0x00,0x01,0xCB,0x18, +0x78,0x01,0x4E,0xF7,0x10,0x5C,0x80,0x29,0x46,0xF7,0xC5,0x4B,0x00,0x1A,0x1B,0x17, +0x00,0x85,0x29,0xC2,0xF4,0x00,0x01,0x5C,0x84,0x04,0xCB,0x17,0x79,0x04,0xCC,0x84, +0x17,0x70,0x4F,0x24,0x81,0x5C,0x84,0x04,0x0F,0x38,0x01,0xCA,0xF7,0x79,0x00,0x0C, +0x97,0x01,0x98,0x81,0xE7,0xFF,0xFF,0x5D,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xCC, +0x0B,0x17,0x01,0x53,0x18,0x02,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB, +0x17,0x7A,0x30,0xCB,0x37,0x7A,0x34,0xCB,0x57,0x7A,0x10,0xCA,0xF7,0x7A,0x14,0x0B, +0x18,0x01,0x0B,0x39,0x01,0x0B,0x5A,0x01,0x08,0x77,0x01,0x4E,0xF9,0x80,0x4C,0x63, +0x80,0x8E,0xF8,0x8C,0x7A,0x44,0x63,0x1F,0x44,0x63,0xBC,0x85,0x29,0xC2,0xF4,0x00, +0x01,0xCB,0x17,0x7A,0x70,0xCB,0x37,0x7A,0x74,0xCB,0x57,0x7A,0x50,0xCA,0xF7,0x7A, +0x54,0x0B,0x18,0x01,0x0B,0x39,0x01,0x0B,0x5A,0x01,0x08,0x77,0x01,0x4E,0xF9,0x80, +0x4C,0x63,0x80,0x8E,0xF8,0x8C,0x7A,0x44,0x63,0x1F,0x44,0x63,0xBC,0x85,0x29,0x5C, +0x63,0x06,0xC2,0xF4,0x00,0x01,0x47,0x23,0x1F,0xCA,0xF7,0x7A,0x10,0x0B,0x17,0x01, +0x47,0x19,0xC4,0x44,0x63,0xC5,0x5C,0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0x5C,0x63, +0x06,0xC2,0xF4,0x00,0x01,0x47,0x23,0x1F,0xCA,0xF7,0x7A,0x50,0x0B,0x17,0x01,0x47, +0x19,0xC4,0x44,0x63,0xC5,0x5C,0x63,0x04,0x0C,0x77,0x01,0x85,0x29,0xC2,0xF4,0x00, +0x01,0x44,0x63,0x1F,0xCA,0xF7,0x7A,0x10,0x0B,0x17,0x01,0x47,0x18,0x1C,0x0F,0x17, +0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0x44,0x63,0x1F,0xCA,0xF7,0x7A,0x50,0x0B,0x17, +0x01,0x47,0x18,0x1C,0x0F,0x17,0x01,0x85,0x29,0x5C,0x63,0x04,0xC2,0xF4,0x00,0x01, +0xCA,0xF7,0x7A,0x30,0x0C,0x77,0x01,0x85,0x29,0x9B,0x01,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x7A,0x70,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xFF,0x20,0xAA,0x55, +0xCB,0x17,0x78,0xC0,0x0F,0x38,0x01,0x5F,0x03,0x04,0x27,0x08,0x17,0x98,0x63,0xCA, +0xF7,0x78,0xC4,0x5C,0x63,0x04,0xCB,0x00,0x03,0xE8,0x43,0x04,0xC1,0x40,0x63,0xC3, +0x4C,0x63,0x81,0x44,0x63,0x1F,0x0C,0x77,0x01,0x06,0xE0,0x5B,0xCA,0xF7,0x8D,0x80, +0x5C,0x97,0x0D,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x3C,0x44,0x0B,0x17,0x01,0x20,0x00, +0x2D,0xC7,0x18,0xFF,0xBF,0xE4,0x00,0x00,0x15,0x5F,0x18,0x04,0x53,0x18,0x40,0x0F, +0x17,0x01,0x85,0x29,0xFF,0x00,0xAA,0x55,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78,0xC0, +0x0F,0x17,0x01,0x85,0x29,0xFF,0x00,0x55,0xAA,0xC2,0xF4,0x00,0x01,0xCA,0xF7,0x78, +0xC0,0x0F,0x17,0x01,0x85,0x29,0xCA,0xE0,0x03,0x20,0xC3,0x14,0x00,0x01,0x5C,0x63, +0x04,0xC0,0x60,0x63,0xEA,0x48,0x63,0xB8,0xCA,0xF8,0x79,0x10,0x0B,0x37,0x01,0x53, +0x39,0x01,0x0F,0x37,0x01,0xCB,0x58,0x79,0x00,0xCB,0x38,0x79,0x08,0x9C,0x38,0x0A, +0xF9,0x01,0xCB,0x18,0x3C,0x44,0x0B,0x7A,0x01,0x0B,0x39,0x01,0x0F,0x21,0x07,0x0B, +0x18,0x01,0x57,0x18,0x40,0x5F,0x18,0x04,0x23,0x00,0x40,0x4C,0x63,0x29,0x5C,0x60, +0x09,0x48,0x63,0x0A,0xE4,0x00,0x00,0x3F,0xCC,0x63,0x00,0x06,0x5C,0x63,0x04,0xE4, +0x00,0x00,0x29,0x0A,0xF8,0x01,0x52,0xF7,0x01,0x0E,0xF8,0x01,0x0A,0xF9,0x01,0xE4, +0x00,0x00,0x21,0xC3,0x34,0x00,0x01,0xCB,0x19,0x79,0x10,0xCB,0x39,0x79,0x08,0x0B, +0x41,0x07,0x43,0x57,0xD5,0xD4,0x7A,0x00,0xB8,0x0B,0x41,0x07,0xD7,0x57,0xFE,0xB9, +0x0B,0x41,0x07,0x43,0x5B,0xD5,0x8E,0xFA,0xD4,0x77,0xFE,0x5C,0x9C,0x28,0x85,0x29, +0x5C,0x63,0x04,0xE4,0x00,0x00,0x2D,0x42,0xE4,0x2C,0xC3,0x38,0x00,0x01,0x43,0x05, +0xCC,0x8F,0x03,0x13,0x18,0x00,0x1B,0x17,0x00,0x9C,0xBF,0x20,0xBF,0xB2,0x85,0x29, +0x5C,0x63,0x00,0xC2,0xF4,0x00,0x01,0x20,0x60,0xCE,0xCA,0xF7,0x2C,0x30,0x0B,0x17, +0x01,0xCB,0x18,0x02,0x00,0x0F,0x17,0x01,0x80,0x01,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x3C,0x44,0xCA,0xF7,0x3C,0xA8,0x0B,0x38,0x01,0xC7,0x39,0xFF,0xF3,0x0F,0x38,0x01, +0x0B,0x17,0x01,0x53,0x18,0x01,0xE4,0x00,0x00,0x9F,0xCB,0x17,0x3C,0xA8,0x0B,0x38, +0x01,0x53,0x39,0x01,0xCA,0xF7,0x3C,0x5C,0x0F,0x38,0x01,0x1F,0x00,0xC0,0x0B,0x37, +0x00,0x47,0x39,0xC4,0x9B,0x02,0x24,0x64,0x25,0x54,0x63,0x3F,0x5F,0x03,0x06,0x47, +0x18,0xCD,0x5C,0x78,0x04,0xC3,0x14,0x00,0x01,0x0C,0x77,0x01,0xCA,0xF8,0x3C,0xA8, +0x0B,0x37,0x01,0xC7,0x39,0xFF,0xFE,0x0F,0x37,0x01,0xCA,0xF8,0x2C,0x30,0x0B,0x17, +0x01,0xCB,0x18,0x01,0x00,0x0F,0x17,0x01,0x85,0x29,0xC2,0xF4,0x00,0x01,0xCB,0x17, +0x3D,0x80,0x0B,0x38,0x01,0xCB,0x39,0x08,0x00,0x0F,0x38,0x01,0xCA,0xF7,0x3D,0x84, +0x0B,0x17,0x01,0xCB,0x18,0x08,0x00,0x0F,0x17,0x01,0x85,0x29,0xE7,0xFF,0xFF,0xBD, +0x56,0xE3,0xFF,0x4E,0xF7,0x08,0x5C,0x84,0x04,0xC4,0x63,0xFF,0x00,0x8C,0x77,0xC2, +0xF4,0x00,0x01,0x4C,0x63,0x08,0x8C,0x77,0x0C,0x83,0x01,0x85,0x29,0x1C,0x21,0xC8, +0xC0,0x98,0x00,0x21,0x0D,0x21,0x34,0x1C,0x61,0x06,0xFC,0x84,0xB6,0x6E,0x50,0xA0, +0x2A,0xE7,0xFF,0x2F,0x10,0x1E,0xE1,0x06,0x1F,0x41,0x30,0x0B,0x37,0x01,0xFF,0x60, +0xFF,0x00,0x47,0x19,0xDC,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19, +0xC3,0x34,0x00,0x01,0x8F,0x19,0x0B,0x37,0x03,0x47,0x99,0xCF,0x0B,0x78,0x01,0x47, +0x7B,0xE4,0x0B,0x97,0x05,0x47,0x39,0xE4,0x47,0x3B,0xCD,0x0F,0x38,0x01,0x9E,0xE6, +0xD7,0x57,0xFE,0x5E,0x0D,0x21,0x36,0x1C,0x21,0x38,0x85,0x29,0xFC,0x21,0xFF,0x38, +0x50,0xA0,0x3C,0xED,0x21,0x00,0xC4,0xED,0x41,0x00,0xC0,0xED,0x61,0x00,0xBC,0xED, +0x81,0x00,0xB8,0xED,0xA1,0x00,0xB4,0xED,0xC1,0x00,0xB0,0xED,0xE1,0x00,0xAC,0xEE, +0x01,0x00,0xA8,0xC1,0x58,0x00,0x21,0x1C,0x61,0x6C,0xFD,0x4A,0xB6,0x6E,0x1C,0x8A, +0x2A,0xE7,0xFF,0x2E,0x10,0x50,0xA0,0x24,0x1C,0x8A,0x66,0x1C,0x61,0x48,0xE7,0xFF, +0x2D,0xF6,0x98,0x61,0x98,0x82,0xE7,0xFF,0xEF,0x1A,0x98,0x61,0xFC,0x80,0x18,0x08, +0xE7,0xFF,0xD9,0xF2,0x98,0x61,0xFC,0x80,0x18,0x08,0xE7,0xFF,0xEC,0x6C,0x98,0x61, +0x88,0x83,0xE7,0xFF,0xDC,0xA6,0x98,0x61,0x88,0x83,0xE7,0xFF,0xDA,0x2E,0x98,0x60, +0x98,0x81,0xE7,0xFF,0xDB,0x1E,0x98,0x60,0x05,0x4F,0x0F,0xC9,0x4A,0x0F,0x0F,0x88, +0x8A,0xE7,0xFF,0xE4,0xDE,0x98,0x61,0x88,0x8A,0xE7,0xFF,0xE4,0xCE,0xC3,0x54,0x00, +0x01,0xCA,0xE0,0x11,0x50,0xCB,0x5A,0x22,0x00,0x57,0x17,0xFF,0x4F,0x18,0x10,0x8F, +0x1A,0x1F,0x61,0x2A,0x0B,0x38,0x01,0x4F,0x17,0x08,0x8F,0x1B,0xEF,0x38,0xDD,0x61, +0x9E,0xE1,0xC2,0xE2,0x2B,0xE4,0x23,0xFF,0x8D,0x1E,0xE1,0x6C,0xFF,0x41,0x00,0xA8, +0xC1,0x94,0x00,0x01,0xFD,0xA0,0xFF,0x00,0x0B,0x37,0x01,0x47,0x19,0x6C,0x5F,0x39, +0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37,0x03,0x8F,0x0C,0x0F,0x38, +0x01,0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0x1E,0xE1,0x48,0x1F,0x41,0x6C,0x0B,0x37,0x01, +0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39,0x10,0x4F,0x18,0x08,0x8F,0x19,0x0B,0x37, +0x03,0x8F,0x0C,0x0F,0x38,0x01,0x9E,0xE4,0xD7,0x57,0xFF,0x2E,0xE7,0xFF,0xD5,0xF8, +0x99,0xE0,0x89,0xC3,0x98,0x61,0xE7,0xFF,0xD6,0x0E,0xD1,0xE0,0x05,0xBE,0x98,0x60, +0x1D,0x61,0x0A,0xE7,0xFF,0xD6,0x48,0x99,0x40,0xE4,0x00,0x01,0x45,0x98,0x61,0x88, +0x8A,0x22,0x01,0x0A,0xE7,0xFF,0xE1,0xE0,0x98,0x60,0xE7,0xFF,0xE2,0x2A,0xFC,0x60, +0x01,0x00,0xE7,0xFF,0xF8,0x16,0xE7,0xFF,0xD4,0x14,0xE7,0xFF,0xF6,0xC2,0xC4,0x63, +0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF7,0x6C,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0xF8,0x30,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE8,0x94,0xE4, +0x00,0x00,0x8B,0xE7,0xFF,0xE1,0x62,0x98,0x61,0xE7,0xFF,0xE1,0xAC,0xFC,0x60,0x01, +0x00,0xE7,0xFF,0xF7,0x98,0xE7,0xFF,0xD3,0x96,0xE7,0xFF,0xF6,0x44,0xC4,0x63,0x01, +0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0xEE,0xFC,0x60,0x01,0x00, +0xE7,0xFF,0xF7,0xB2,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE8,0x16,0x0A,0xEB, +0x01,0x40,0x63,0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2,0x02,0xFB,0x8E, +0x9D,0x41,0x9D,0x62,0x5D,0x4A,0x00,0xD1,0x44,0x05,0xEA,0x9A,0x00,0xE7,0xFF,0xFE, +0xC1,0x98,0x61,0x1D,0x61,0x12,0xE7,0xFF,0xD4,0xE2,0x99,0x40,0xE4,0x00,0x01,0x45, +0x98,0x61,0x88,0x8A,0x22,0x01,0x0A,0xE7,0xFF,0xE0,0x7A,0x98,0x60,0xE7,0xFF,0xE0, +0xC4,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0xB0,0xE7,0xFF,0xD2,0xAE,0xE7,0xFF,0xF5, +0x5C,0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x06, +0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0xCA,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF, +0xE7,0x2E,0xE4,0x00,0x00,0x8B,0xE7,0xFF,0xDF,0xFC,0x98,0x61,0xE7,0xFF,0xE0,0x46, +0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF6,0x32,0xE7,0xFF,0xD2,0x30,0xE7,0xFF,0xF4,0xDE, +0xC4,0x63,0x01,0x00,0x20,0x63,0xE0,0xFC,0x60,0x01,0x00,0xE7,0xFF,0xF5,0x88,0xFC, +0x60,0x01,0x00,0xE7,0xFF,0xF6,0x4C,0x88,0x6A,0x98,0x81,0x98,0xA0,0xE7,0xFF,0xE6, +0xB0,0x0A,0xEB,0x01,0x40,0x63,0xBD,0x0C,0x6B,0x01,0x9E,0x01,0x5E,0x10,0x00,0xD2, +0x02,0xFB,0x8E,0x9D,0x41,0x9D,0x62,0x5D,0x4A,0x00,0xD1,0x44,0x00,0x52,0x9A,0x00, +0xE7,0xFF,0xFE,0xC1,0x9D,0xE1,0x5D,0xEF,0x00,0xD1,0xE2,0xF4,0x8E,0x0B,0x21,0x0A, +0x0B,0x01,0x12,0x0F,0x21,0x07,0x1E,0xE1,0x0C,0x1F,0x81,0x12,0x0B,0x77,0x01,0x8B, +0x59,0x5F,0xBB,0x06,0xD7,0x3D,0x00,0x30,0x8B,0x5B,0x5F,0x3A,0x06,0x0B,0x77,0x09, +0x8B,0x58,0x5F,0xBB,0x06,0xD7,0x1D,0x00,0x30,0x8B,0x5B,0x5F,0x1A,0x06,0x9E,0xE2, +0xD7,0x97,0xFE,0xE6,0x0F,0x21,0x07,0x9A,0xE0,0x0F,0x01,0x09,0x1F,0x21,0x1A,0x8B, +0x57,0xFD,0x00,0x3F,0xFF,0xE4,0x00,0x00,0x69,0x43,0x7E,0xC4,0x0B,0x9B,0x00,0x43, +0x79,0xC4,0x23,0x80,0x32,0x0D,0x1B,0x01,0x9B,0x41,0xE4,0x00,0x00,0x23,0x09,0x5D, +0x00,0xCD,0x4A,0x1F,0xFF,0x43,0x8A,0xE0,0x0F,0x9B,0x01,0x9F,0x02,0xD3,0x08,0xFE, +0xE6,0x9F,0x28,0x9E,0xE2,0xD2,0xE4,0x00,0xBA,0x1F,0x01,0x0A,0x4F,0xD7,0x10,0x1F, +0xA1,0x06,0x8F,0xD8,0x8F,0xB7,0x9B,0x00,0xE7,0xFF,0xFF,0x83,0xC3,0x94,0x00,0x01, +0x9A,0xE0,0xCB,0x9C,0x24,0x00,0xE4,0x00,0x00,0x47,0x43,0xB9,0xC4,0x43,0xDB,0xC4, +0x57,0xBD,0xFF,0x0B,0xDE,0x01,0x4F,0xBD,0x10,0x8F,0xBC,0x0F,0xDD,0x01,0x9F,0x02, +0xD3,0x08,0xFF,0x56,0x9E,0xE1,0x22,0xE8,0x54,0x1F,0x21,0x1A,0x4F,0x77,0x18,0x9B, +0x00,0x8F,0x79,0xFF,0x37,0x12,0x46,0xE7,0xFF,0xFF,0xA7,0x9A,0xE0,0x4F,0x17,0x08, +0x1F,0x61,0x6C,0x8F,0x1B,0x0B,0x38,0x01,0x47,0x19,0x6C,0x5F,0x39,0x00,0x4F,0x39, +0x10,0x4F,0x18,0x08,0x8F,0x19,0x1F,0x21,0x2A,0x8F,0x0C,0x8F,0x37,0x0B,0x39,0x01, +0x0F,0x38,0x01,0x9E,0xE2,0x5E,0xE3,0xC9,0x23,0xFF,0x55,0xC2,0xF4,0x00,0x01,0xCA, +0xF7,0x25,0x38,0x0B,0x17,0x01,0x23,0x40,0x34,0x5F,0x18,0x04,0x53,0x18,0x0F,0xE4, +0x00,0x00,0x11,0xC7,0x18,0xFF,0xF0,0x0F,0x17,0x01,0x98,0x60,0x98,0x80,0xE7,0xFF, +0xDE,0x84,0x98,0x80,0x98,0x61,0xE7,0xFF,0xDE,0x74,0x98,0x60,0xE7,0xFF,0xDD,0x26, +0x98,0x60,0x98,0x80,0xE7,0xFF,0xDC,0xC0,0x88,0x6E,0xEE,0x01,0x00,0xAA,0xED,0xE1, +0x00,0xAE,0xED,0xC1,0x00,0xB2,0xED,0xA1,0x00,0xB6,0xED,0x81,0x00,0xBA,0xED,0x61, +0x00,0xBE,0xED,0x41,0x00,0xC2,0xED,0x21,0x00,0xC6,0xFC,0x21,0x00,0xC8,0xE7,0xFF, +0xD0,0x5F,0x00,0x00,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC8,0x80, +0xAA,0x55,0xC0,0x74,0x00,0x01,0xC8,0x63,0x78,0xC0,0x0C,0x83,0x00,0xC0,0x74,0x00, +0x01,0xC8,0x63,0x1F,0xDC,0x50,0x80,0x80,0x0C,0x83,0x00,0x04,0x20,0x80,0xC8,0x21, +0x17,0xFC,0x1C,0x40,0xFD,0x44,0x21,0x14,0x28,0x00,0x74,0xC0,0x40,0x00,0x01,0xC8, +0x42,0x31,0xD8,0x84,0x49,0x0C,0x41,0x0C,0x0C,0x61,0x10,0x0C,0x81,0x14,0x0C,0xA1, +0x18,0x0C,0xC1,0x1C,0x0C,0xE1,0x20,0x0D,0x01,0x24,0x0D,0x21,0x28,0x0D,0x41,0x2C, +0x0D,0x61,0x30,0x0D,0x81,0x34,0x0D,0xA1,0x38,0x0D,0xC1,0x3C,0x0D,0xE1,0x40,0x0E, +0x01,0x44,0x0E,0x21,0x48,0x0E,0x41,0x4C,0x0E,0x61,0x50,0x0E,0x81,0x54,0x0E,0xA1, +0x58,0x0E,0xC1,0x5C,0x0E,0xE1,0x60,0x0F,0x01,0x64,0x0F,0x21,0x68,0x0F,0x41,0x6C, +0x0F,0x61,0x70,0x0F,0x81,0x74,0x0F,0xA1,0x78,0x0F,0xC1,0x7C,0x1C,0x61,0x00,0xC1, +0x00,0x00,0x01,0xC9,0x08,0x9F,0x80,0x85,0x08,0x90,0x23,0x00,0xC0,0x40,0x10,0x01, +0xC8,0x42,0x03,0xB0,0xC0,0x60,0x10,0x01,0xC8,0x63,0x0D,0x68,0x5C,0x43,0x1F,0x20, +0x00,0x2D,0x0C,0x02,0x00,0x1C,0x42,0x04,0x93,0xF4,0x85,0x29,0xC0,0x80,0x01,0x1F, +0xC0,0x7F,0xFF,0xE1,0xC8,0x63,0xFF,0xF9,0x44,0x84,0x1C,0xC0,0x80,0x01,0x1D,0x0C, +0x61,0x02,0xC0,0x60,0x02,0x0D,0x0C,0x61,0x06,0xC0,0x60,0x04,0x0D,0x0C,0x41,0x0E, +0x0C,0x61,0x12,0x0C,0x81,0x16,0x0C,0xA1,0x1A,0x0C,0xC1,0x1E,0x0C,0xE1,0x22,0x0D, +0x01,0x26,0x0D,0x21,0x2A,0x0D,0x41,0x2E,0x0D,0x61,0x32,0x0D,0x81,0x36,0x0D,0xA1, +0x3A,0x0D,0xC1,0x3E,0x0D,0xE1,0x42,0x0E,0x01,0x46,0x0E,0x21,0x4A,0x0E,0x41,0x4E, +0x0E,0x61,0x52,0x0E,0x81,0x56,0x0E,0xA1,0x5A,0x0E,0xC1,0x5E,0x0E,0xE1,0x62,0x0F, +0x01,0x66,0x0F,0x21,0x6A,0x0F,0x41,0x6E,0x0F,0x61,0x72,0x0F,0x81,0x76,0x0F,0xA1, +0x7A,0x0F,0xC1,0x7E,0xEF,0xE1,0x00,0x82,0x0C,0x21,0x0A,0x84,0x00,0x00,0x00,0x00, +0x9C,0x30,0xCA,0xE0,0x48,0x02,0x0D,0x41,0x08,0x0D,0x21,0x0C,0x89,0x43,0xC2,0xF7, +0x00,0x0F,0x9B,0x1C,0x46,0xF7,0xC4,0x0E,0xE1,0x04,0x0E,0xE1,0x06,0x56,0xF7,0x04, +0x22,0xE0,0xE0,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00,0x0F,0x9B,0x1B,0x47,0x39,0xC4, +0xC3,0x37,0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3, +0x17,0x00,0x0D,0x98,0x82,0xE7,0xFF,0xC2,0xB0,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0F,0x53,0x18,0x04,0xC3,0x17,0x00,0x0D,0x0E,0xE1,0x06,0x56,0xF7,0x08,0x22,0xE0, +0xE8,0xCA,0xE0,0x48,0x00,0xC3,0x37,0x00,0x0F,0x9B,0x17,0x47,0x39,0xC4,0xC3,0x37, +0x00,0x0D,0xCA,0xE0,0x48,0x02,0xC3,0x37,0x00,0x0F,0x47,0x19,0xC4,0xC3,0x17,0x00, +0x0D,0x98,0x83,0x88,0x6A,0xE7,0xFF,0xC2,0x30,0xCA,0xE0,0x48,0x00,0xC3,0x17,0x00, +0x0F,0x53,0x18,0x08,0xC3,0x17,0x00,0x0D,0x0D,0x41,0x0A,0x0D,0x21,0x0E,0x1C,0x21, +0x10,0x85,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +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,0x00,0x00,0x00,0x00,0xA0,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x1B,0x00,0x00,0x00,0x00,0xA0,0x26,0x01,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00, +0x01,0x00,0x00,0x00,0x00,0xA0,0x66,0x00,0x01,0x00,0x00,0x00,0xF3,0x00,0x06,0x00, +0xC4,0x00,0x2F,0x00,0x07,0x00,0x0D,0x01,0xF6,0xFF,0x5C,0x00,0xFB,0xFF,0x00,0x00, +0x1B,0x00,0x1B,0x00,0x01,0x00,0x10,0x00,0xF0,0x00,0x9E,0x00,0x6F,0x00,0x6F,0x00, +0x1A,0x00,0x08,0x18,0x01,0x00,0x00,0x00,0x64,0x00,0x14,0x00,0x14,0x00,0x06,0x00, +0x06,0x00,0x5A,0x00,0x14,0x00,0x14,0x00,0x06,0x00,0x06,0x00,0x64,0x00,0x01,0x00, +0x5F,0x00,0x01,0x00,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x50,0x00,0x96,0x00,0x40,0x06,0x00,0x00,0x80,0x0C,0x00,0x00, +0x01,0x03,0x07,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00, +0x00,0x01,0x02,0x00,0x14,0x00,0x2D,0x00,0x46,0x00,0x5F,0x00,0x78,0x00,0x91,0x00, +0x07,0x00,0xC8,0x00,0xC8,0x00,0xC8,0x00,0xF4,0x01,0xF4,0x01,0xFF,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x03,0x04,0x05,0x02,0x00,0x04,0x00,0x06,0x00, +0x08,0x00,0x0A,0x00,0x0C,0x00,0x10,0x00,0x14,0x00,0x18,0x00,0x20,0x00,0x28,0x00, +0x32,0x00,0x3E,0x00,0x40,0x00,0x64,0x00,0x80,0x00,0x00,0x01,0x02,0x00,0x00,0x11, +0xFF,0xFF,0xFF,0xFF,0x01,0x11,0xFF,0xFF,0x18,0x50,0x02,0x11,0xFF,0x7F,0xFF,0x0E, +0x03,0x11,0xFF,0x00,0x66,0x00,0x04,0x11,0xFF,0x0F,0x72,0x07,0x05,0x11,0xFF,0x0F, +0x72,0x07,0x06,0x11,0xFF,0x00,0x00,0x00,0x07,0x11,0x03,0x00,0x00,0x00,0x08,0x11, +0x73,0x00,0x00,0x00,0x09,0x11,0xFF,0xFF,0x00,0x00,0x09,0x11,0xFF,0x7F,0x00,0x00, +0x0A,0x11,0xFF,0x7F,0x87,0x10,0x0E,0x11,0xFF,0xFF,0x00,0x00,0x0F,0x11,0xFF,0xFF, +0x00,0x00,0x17,0x11,0x0F,0xFF,0x00,0x00,0x18,0x11,0xFF,0xFF,0x00,0x02,0x19,0x11, +0xFF,0x00,0x0E,0x00,0x1E,0x11,0xFF,0xFF,0x00,0x00,0x1F,0x11,0xFF,0x00,0x00,0x00, +0x33,0x11,0x0F,0x00,0x00,0x00,0x3A,0x11,0x37,0x0F,0x00,0x00,0x3B,0x11,0x77,0x00, +0x77,0x00,0x3C,0x11,0x00,0xFF,0x00,0xA0,0x3D,0x11,0x77,0x00,0x00,0x00,0x3E,0x11, +0xFF,0x00,0x00,0x00,0x04,0x12,0x06,0x00,0x00,0x00,0x05,0x12,0xFF,0x00,0x00,0x00, +0x07,0x12,0xFF,0xFF,0x00,0x00,0x08,0x12,0xFF,0x00,0x00,0x00,0x09,0x12,0xFF,0xFF, +0x00,0x00,0x0A,0x12,0xFF,0x00,0x00,0x00,0x0B,0x12,0x3F,0x00,0x2E,0x00,0x0D,0x12, +0x1F,0x00,0x05,0x00,0x0E,0x12,0x1F,0x00,0x05,0x00,0x0F,0x12,0xFF,0xFF,0x00,0x00, +0x10,0x12,0xFF,0x00,0x00,0x00,0x11,0x12,0xFF,0x0F,0x00,0x00,0x12,0x12,0x87,0x1F, +0x00,0x00,0x13,0x12,0x7F,0x0F,0x14,0x00,0x14,0x12,0x9F,0xFF,0x0A,0x09,0x15,0x12, +0x7F,0x0F,0x0C,0x0F,0x16,0x12,0xFF,0x0F,0x00,0x07,0x17,0x12,0x1F,0xFF,0x0A,0x5C, +0x18,0x12,0x7F,0x1F,0x14,0x0A,0x19,0x12,0xFF,0xFF,0x8C,0x21,0x1A,0x12,0xFF,0x03, +0x00,0x00,0x1B,0x12,0xFF,0x03,0x00,0x00,0x1C,0x12,0xFF,0x03,0x00,0x00,0x1D,0x12, +0xFF,0x03,0x00,0x00,0x1E,0x12,0x1F,0x1F,0x12,0x07,0x1F,0x12,0x3F,0x3F,0x00,0x00, +0x20,0x12,0xFF,0xFF,0x00,0x00,0x21,0x12,0xFF,0x00,0x00,0x00,0x23,0x12,0x3F,0x3F, +0x02,0x00,0x24,0x12,0x3F,0x00,0x00,0x00,0x28,0x12,0xFF,0xFF,0x83,0x81,0x2D,0x12, +0x01,0x00,0x01,0x00,0x50,0x12,0xFF,0xFF,0x00,0x00,0x51,0x12,0xFF,0x00,0x00,0x00, +0x70,0x12,0x03,0x00,0x03,0x00,0x01,0x11,0x06,0x00,0x02,0x00,0x02,0x11,0x00,0x08, +0x00,0x08,0x2A,0x12,0x00,0xFF,0x00,0xBA,0x2B,0x12,0xFF,0x30,0xF0,0x20,0x01,0x11, +0x06,0x00,0x00,0x00,0x2A,0x12,0x00,0xFF,0x00,0x00,0x2B,0x12,0xFF,0x30,0x00,0x00, +0x01,0x11,0x00,0x50,0x00,0x50,0x02,0x11,0x3F,0x06,0x2F,0x06,0x01,0x11,0x00,0x50, +0x00,0x00,0x02,0x11,0x3F,0x06,0x00,0x00,0x2A,0x12,0x00,0x30,0x00,0x20,0x11,0x1E, +0xFF,0x7F,0x00,0x00,0x12,0x1E,0xFF,0x00,0x00,0x00,0x13,0x1E,0x0F,0x00,0x00,0x00, +0x15,0x1E,0x73,0x07,0x00,0x00,0x16,0x1E,0x0F,0x00,0x00,0x00,0x18,0x1E,0x3F,0x00, +0x08,0x00,0x2A,0x1E,0x05,0x00,0x01,0x00,0x50,0x11,0x11,0x11,0x51,0x11,0x11,0x11, +0x52,0x11,0x11,0x11,0x53,0x11,0x11,0x11,0x54,0x11,0x11,0x11,0x55,0x11,0x11,0x11, +0x56,0x11,0x11,0x11,0x57,0x11,0x11,0x11,0x58,0x11,0x11,0x11,0x59,0x11,0x11,0x11, +0x5A,0x11,0x11,0x11,0x5B,0x11,0x11,0x11,0x5C,0x11,0xFF,0xFF,0x5D,0x11,0xFF,0xFF, +0x5E,0x11,0xFF,0xFF,0x46,0x12,0x00,0x00,0x47,0x12,0x00,0x00,0x48,0x12,0x00,0x00, +0x49,0x12,0x00,0x00,0x4A,0x12,0x00,0x00,0x4B,0x12,0x00,0x00,0x4C,0x12,0x00,0x00, +0x4D,0x12,0x00,0x00,0x4E,0x12,0x0F,0x00,0x02,0x03,0x0F,0x00,0x52,0x00,0x69,0x00, +0xD9,0x00,0x95,0x00,0x89,0x00,0x7E,0x00,0x72,0x00,0x67,0x00,0x5B,0x00,0x50,0x00, +0x44,0x00,0x39,0x00,0x2D,0x00,0x22,0x00,0x16,0x00,0x0B,0x00,0x00,0x00,0xFF,0x00, +0x8D,0x09,0x1A,0x00,0xFE,0x00,0x1B,0x07,0x3F,0x00,0xFE,0x00,0x9D,0x0A,0x78,0x00, +0xFD,0x00,0xEC,0x12,0xA8,0x00,0xFC,0x00,0x6B,0x18,0xD0,0x00,0xFB,0x00,0x7C,0x19, +0x0A,0x01,0xF9,0x00,0x55,0x20,0x4E,0x01,0xF8,0x00,0x85,0x26,0x86,0x01,0xFF,0x00, +0x48,0x0D,0x09,0x00,0xFE,0x00,0x9E,0x0B,0x1E,0x00,0xFE,0x00,0x34,0x0E,0x44,0x00, +0xFD,0x00,0x35,0x14,0x66,0x00,0xFD,0x00,0x1A,0x18,0x7F,0x00,0xFC,0x00,0x11,0x19, +0x9C,0x00,0xFB,0x00,0x3C,0x1C,0xBF,0x00,0xFB,0x00,0x94,0x21,0xDB,0x00,0xFA,0x00, +0xE6,0x24,0xF7,0x00,0xF9,0x00,0xFB,0x24,0x29,0x01,0xFE,0x00,0xE0,0x0D,0x04,0x00, +0xFE,0x00,0xF6,0x10,0x18,0x00,0xFE,0x00,0xC8,0x12,0x30,0x00,0xFD,0x00,0xEB,0x14, +0x4A,0x00,0xFD,0x00,0x74,0x16,0x69,0x00,0xFC,0x00,0xB9,0x1C,0x7E,0x00,0xFC,0x00, +0x68,0x20,0x8E,0x00,0xFB,0x00,0xCE,0x21,0xA6,0x00,0xFB,0x00,0x52,0x23,0xC8,0x00, +0xFA,0x00,0x0A,0x29,0xE2,0x00,0xF9,0x00,0x4D,0x2C,0xFC,0x00,0xFE,0x00,0x85,0x13, +0xF8,0xFF,0xFE,0x00,0xF6,0x12,0x07,0x00,0xFD,0x00,0xC9,0x13,0x24,0x00,0xFD,0x00, +0x6E,0x18,0x3E,0x00,0xFC,0x00,0x47,0x1C,0x4E,0x00,0xFC,0x00,0x83,0x1D,0x5E,0x00, +0xFC,0x00,0xFB,0x1F,0x74,0x00,0xFB,0x00,0xF7,0x25,0x86,0x00,0xFA,0x00,0xB8,0x29, +0x93,0x00,0xFA,0x00,0xA4,0x29,0xAB,0x00,0xF9,0x00,0x13,0x2B,0xCB,0x00,0xF9,0x00, +0x37,0x30,0xE5,0x00,0xFD,0x00,0x0D,0x1F,0xDC,0xFF,0xFD,0x00,0x3D,0x1E,0xE7,0xFF, +0xFD,0x00,0xD0,0x1C,0x02,0x00,0xFC,0x00,0xCD,0x1E,0x1B,0x00,0xFC,0x00,0x4B,0x22, +0x29,0x00,0xFC,0x00,0x4F,0x25,0x33,0x00,0xFB,0x00,0x83,0x27,0x43,0x00,0xFA,0x00, +0xE6,0x2C,0x4F,0x00,0xFA,0x00,0x48,0x30,0x57,0x00,0xFA,0x00,0x0E,0x31,0x62,0x00, +0xF9,0x00,0x76,0x31,0x77,0x00,0xF9,0x00,0x65,0x36,0x87,0x00,0xF8,0x00,0xB3,0x38, +0x94,0x00,0xF8,0x00,0x27,0x37,0xAC,0x00,0x05,0x03,0x03,0x04,0x04,0x00,0x11,0x00, +0xC1,0x09,0xD9,0xFF,0x36,0x01,0x0E,0x00,0x1C,0x00,0xDD,0x03,0x03,0x00,0x40,0x00, +0x14,0x00,0x4C,0x00,0x95,0x03,0x05,0x00,0x07,0x00,0x18,0x00,0xA5,0x00,0x4B,0x06, +0x9B,0xFF,0x03,0x00,0x19,0x00,0xC8,0x00,0x14,0x03,0x3B,0x00,0x00,0x00,0x1A,0x00, +0x16,0x00,0x40,0x05,0xE4,0xFF,0xA2,0x00,0x14,0x00,0x3B,0x00,0x67,0x04,0xF0,0xFF, +0x3B,0x00,0x1A,0x00,0x6F,0x00,0x22,0x04,0xF8,0xFF,0x03,0x00,0x20,0x00,0x1C,0x00, +0x48,0x05,0xDB,0xFF,0x98,0x00,0x16,0x00,0x57,0x00,0x90,0x04,0xEC,0xFF,0x19,0x00, +0x21,0x00,0x95,0x00,0x08,0x04,0xFE,0xFF,0x02,0x00,0x24,0x00,0x23,0x00,0xC4,0x05, +0xCC,0xFF,0xA6,0x00,0x17,0x00,0x62,0x00,0x9C,0x04,0xEC,0xFF,0x17,0x00,0x25,0x00, +0xA0,0x00,0x0E,0x04,0xFB,0xFF,0x02,0x00,0x28,0x00,0x0D,0x01,0x7D,0x04,0xE1,0xFF, +0xFC,0xFF,0x2A,0x00,0x33,0x00,0x30,0x07,0xA2,0xFF,0xD3,0x00,0x18,0x00,0x6F,0x00, +0xAD,0x04,0xED,0xFF,0x23,0x00,0x2B,0x00,0x9C,0x00,0x14,0x03,0x27,0x00,0x03,0x00, +0x2F,0x00,0xE1,0x00,0x53,0x05,0xAB,0xFF,0x02,0x00,0x30,0x00,0x35,0x51,0x00,0x00, +0x35,0x51,0x00,0x00,0x4A,0x51,0x00,0x00,0x4A,0x51,0x00,0x00,0xC8,0x53,0x00,0x00, +0xC8,0x53,0x00,0x00,0xC8,0x53,0x00,0x00,0xD0,0x51,0x00,0x00,0xA0,0x52,0x00,0x00, +0x25,0x52,0x00,0x00,0x09,0x54,0x00,0x00,0x09,0x54,0x00,0x00,0x91,0x55,0x00,0x00, +0x91,0x55,0x00,0x00,0x91,0x55,0x00,0x00,0x91,0x55,0x00,0x00,0x91,0x55,0x00,0x00, +0xB8,0x54,0x00,0x00,0x5C,0x55,0x00,0x00,0x11,0x55,0x00,0x00,0xDF,0x55,0x00,0x00, +0xDF,0x55,0x00,0x00,0x2C,0x56,0x00,0x00,0x54,0x56,0x00,0x00,0x67,0x56,0x00,0x00, +0xA4,0x56,0x00,0x00,0x80,0x56,0x00,0x00,0x0D,0x5A,0x00,0x00,0x2C,0x5A,0x00,0x00, +0x85,0x5A,0x00,0x00,0xB3,0x5A,0x00,0x00,0xDF,0x5A,0x00,0x00,0xDF,0x5A,0x00,0x00, +0xF1,0x5A,0x00,0x00,0xDF,0x5A,0x00,0x00,0x9B,0x5A,0x00,0x00,0x9B,0x5A,0x00,0x00, +0xDF,0x5A,0x00,0x00,0xDF,0x5A,0x00,0x00,0xF1,0x5A,0x00,0x00,0xF1,0x5A,0x00,0x00, +0xF1,0x5A,0x00,0x00,0xD3,0x5A,0x00,0x00,0xD9,0x5A,0x00,0x00,0x0A,0x0B,0x2C,0x1B, +0x09,0x07,0x1C,0x1A,0x25,0x05,0x1D,0x19,0x26,0x00,0x1E,0x18,0x27,0x04,0x1F,0x17, +0x28,0x06,0x20,0x0D,0x29,0x08,0x2B,0x0C,0x2A,0x00,0x00,0x00,0x15,0x67,0x00,0x00, +0x15,0x67,0x00,0x00,0x46,0x67,0x00,0x00,0x46,0x67,0x00,0x00,0x78,0x67,0x00,0x00, +0x78,0x67,0x00,0x00,0x78,0x67,0x00,0x00,0x78,0x67,0x00,0x00,0xF7,0x66,0x00,0x00, +0xD9,0x66,0x00,0x00,0xD9,0x67,0x00,0x00,0xD9,0x67,0x00,0x00,0x0C,0x68,0x00,0x00, +0x0C,0x68,0x00,0x00,0x41,0x68,0x00,0x00,0x41,0x68,0x00,0x00,0x41,0x68,0x00,0x00, +0x41,0x68,0x00,0x00,0xB2,0x67,0x00,0x00,0xA0,0x67,0x00,0x00,0xE4,0x68,0x00,0x00, +0xE4,0x68,0x00,0x00,0x38,0x69,0x00,0x00,0x38,0x69,0x00,0x00,0xAB,0x6A,0x00,0x00, +0xAB,0x6A,0x00,0x00,0xAB,0x6A,0x00,0x00,0xAB,0x6A,0x00,0x00,0x93,0x69,0x00,0x00, +0xD9,0x69,0x00,0x00,0x1F,0x6A,0x00,0x00,0x67,0x6A,0x00,0x00,0xB4,0x77,0x00,0x00, +0xB4,0x77,0x00,0x00,0xEF,0x77,0x00,0x00,0xEF,0x77,0x00,0x00,0xDE,0x78,0x00,0x00, +0xDE,0x78,0x00,0x00,0xDE,0x78,0x00,0x00,0xDE,0x78,0x00,0x00,0x2C,0x78,0x00,0x00, +0x51,0x78,0x00,0x00,0x82,0x78,0x00,0x00,0xB2,0x78,0x00,0x00,0xF1,0x82,0x00,0x00, +0x16,0x83,0x00,0x00,0x76,0x83,0x00,0x00,0xDD,0x83,0x00,0x00,0x6E,0x84,0x00,0x00, +0x9E,0x84,0x00,0x00,0x33,0x85,0x00,0x00,0xA6,0x84,0x00,0x00,0x04,0x00,0x1D,0x00, +0x2E,0x00,0x50,0x00,0x82,0x00,0xC7,0x00,0x23,0x01,0x9B,0x01,0x32,0x02,0xEE,0x02, +0xD0,0x03,0xDE,0x04,0x19,0x06,0x82,0x07,0x1A,0x09,0xE0,0x0A,0xD0,0x0C,0xE7,0x0E, +0x1F,0x11,0x71,0x13,0xD3,0x15,0x3D,0x18,0xA2,0x1A,0xF9,0x1C,0x34,0x1F,0x47,0x21, +0x28,0x23,0xCB,0x24,0x27,0x26,0x33,0x27,0xEA,0x27,0x46,0x28,0x04,0x00,0x1C,0x00, +0x2B,0x00,0x4B,0x00,0x78,0x00,0xB7,0x00,0x0A,0x01,0x75,0x01,0xFC,0x01,0xA3,0x02, +0x6D,0x03,0x5E,0x04,0x76,0x05,0xB9,0x06,0x26,0x08,0xBE,0x09,0x7D,0x0B,0x61,0x0D, +0x67,0x0F,0x87,0x11,0xBB,0x13,0xFC,0x15,0x3F,0x18,0x7B,0x1A,0xA6,0x1C,0xB6,0x1E, +0x9F,0x20,0x57,0x22,0xD7,0x23,0x14,0x25,0x08,0x26,0xAF,0x26,0x03,0x27,0x05,0x00, +0x08,0x21,0x05,0x00,0x00,0x20,0x00,0x00,0x94,0xBC,0x00,0xC0,0xA4,0xBC,0x00,0xC0, +0xB6,0xBC,0x00,0xC0,0xBA,0xBC,0x00,0xC0,0x2C,0xBC,0x00,0xC0,0x74,0xBC,0x00,0xC0, +0xD4,0xBC,0x00,0xC0,0xF2,0xBC,0x00,0xC0,0xF6,0xBC,0x00,0xC0,0x1C,0xBD,0x00,0xC0, +0xAA,0xBD,0x00,0xC0,0xEC,0xBD,0x00,0xC0,0x4E,0xBB,0x00,0xC0,0x52,0xBB,0x00,0xC0, +0x28,0xBC,0x00,0xC0,0x70,0xBC,0x00,0xC0,0x05,0x00,0x2A,0x00,0x2A,0x00,0x3E,0x00, +0x58,0x00,0x79,0x00,0xA1,0x00,0xD3,0x00,0x0F,0x01,0x56,0x01,0xAA,0x01,0x0C,0x02, +0x7D,0x02,0xFE,0x02,0x91,0x03,0x37,0x04,0xF0,0x04,0xBE,0x05,0xA0,0x06,0x99,0x07, +0xA7,0x08,0xCC,0x09,0x06,0x0B,0x56,0x0C,0xBB,0x0D,0x34,0x0F,0xC0,0x10,0x5D,0x12, +0x0A,0x14,0xC5,0x15,0x8A,0x17,0x59,0x19,0x2D,0x1B,0x05,0x1D,0xDC,0x1E,0xB0,0x20, +0x7D,0x22,0x40,0x24,0xF5,0x25,0x98,0x27,0x27,0x29,0x9E,0x2A,0xF9,0x2B,0x37,0x2D, +0x53,0x2E,0x4B,0x2F,0x1E,0x30,0xC9,0x30,0x4A,0x31,0xA1,0x31,0xCD,0x31,0x04,0x00, +0x2D,0x00,0x6D,0x00,0xE7,0x00,0xAD,0x01,0xD8,0x02,0x81,0x04,0xBE,0x06,0xA0,0x09, +0x30,0x0D,0x6D,0x11,0x47,0x16,0xA3,0x1B,0x56,0x21,0x29,0x27,0xDC,0x2C,0x2A,0x32, +0xCF,0x36,0x8B,0x3A,0x29,0x3D,0x81,0x3E,0x06,0x00,0xF5,0x28,0x03,0x00,0x33,0x33, +0x78,0xBC,0x00,0xC0,0x8E,0xBC,0x00,0xC0,0x20,0xBD,0x00,0xC0,0xAE,0xBD,0x00,0xC0, +0x98,0xBC,0x00,0xC0,0xA8,0xBC,0x00,0xC0,0x7C,0xBC,0x00,0xC0,0xBE,0xBC,0x00,0xC0, +0xD8,0xBC,0x00,0xC0,0xFA,0xBC,0x00,0xC0,0xFE,0xBB,0x00,0xC0,0xB8,0xBD,0x00,0xC0, +0xCC,0xBA,0x00,0xC0,0x0C,0xBB,0x00,0xC0,0x98,0xBB,0x00,0xC0,0x28,0xBD,0x00,0xC0, +0x06,0x00,0x00,0x20,0x03,0x00,0xAA,0x2A,0x00,0x00,0x00,0x20,0x02,0x00,0x45,0x00, +0x5D,0x01,0x1B,0x04,0x31,0x09,0xA2,0x10,0x55,0x19,0x32,0x21,0xE5,0x25,0x01,0x00, +0x10,0x10,0xEF,0x2F,0x00,0x00,0x00,0x20,0x02,0x00,0x49,0x01,0x6C,0x07,0xB1,0x15, +0x60,0x29,0x38,0x38,0x01,0x00,0x00,0x20,0x02,0x00,0xAC,0x00,0xCB,0x03,0x95,0x0B, +0x6B,0x18,0xE0,0x26,0xA6,0x30,0x02,0x00,0xAA,0x2A,0x02,0x00,0x00,0x20,0x03,0x00, +0x4D,0x00,0x51,0x01,0xBD,0x03,0x48,0x08,0x6B,0x0F,0x0D,0x19,0x47,0x24,0x73,0x2F, +0x86,0x38,0x9F,0x3D,0x03,0x00,0x00,0x20,0x03,0x00,0x33,0x00,0xC4,0x00,0x08,0x02, +0x5B,0x04,0x11,0x08,0x55,0x0D,0x0D,0x14,0xCC,0x1B,0xCF,0x23,0x1E,0x2B,0xB5,0x30, +0xBD,0x33,0x04,0x00,0x33,0x33,0x04,0x00,0xAA,0x2A,0x03,0x00,0x1F,0x00,0x5B,0x00, +0xD6,0x00,0xAB,0x01,0xF6,0x02,0xD5,0x04,0x59,0x07,0x87,0x0A,0x52,0x0E,0x96,0x12, +0x1C,0x17,0x9B,0x1B,0xC0,0x1F,0x37,0x23,0xB6,0x25,0x05,0x27,0x04,0x00,0x00,0x20, +0x01,0x00,0x65,0x04,0x5D,0x14,0x3D,0x27,0x05,0x00,0x26,0x00,0x1D,0x00,0x28,0x00, +0x36,0x00,0x47,0x00,0x5A,0x00,0x72,0x00,0x8D,0x00,0xAE,0x00,0xD3,0x00,0xFD,0x00, +0x2D,0x01,0x64,0x01,0xA2,0x01,0xE6,0x01,0x33,0x02,0x87,0x02,0xE5,0x02,0x4B,0x03, +0xBA,0x03,0x33,0x04,0xB6,0x04,0x43,0x05,0xDB,0x05,0x7C,0x06,0x29,0x07,0xDF,0x07, +0xA1,0x08,0x6C,0x09,0x41,0x0A,0x21,0x0B,0x09,0x0C,0xFA,0x0C,0xF4,0x0D,0xF5,0x0E, +0xFE,0x0F,0x0C,0x11,0x20,0x12,0x38,0x13,0x53,0x14,0x71,0x15,0x90,0x16,0xAF,0x17, +0xCD,0x18,0xE8,0x19,0x00,0x1B,0x12,0x1C,0x1E,0x1D,0x23,0x1E,0x1F,0x1F,0x10,0x20, +0xF7,0x20,0xD0,0x21,0x9C,0x22,0x59,0x23,0x07,0x24,0xA3,0x24,0x2E,0x25,0xA7,0x25, +0x0C,0x26,0x5E,0x26,0x9C,0x26,0xC6,0x26,0xDA,0x26,0x05,0x00,0x33,0x33,0x01,0x00, +0x7E,0x01,0x41,0x08,0x4A,0x15,0xF4,0x20,0x04,0x00,0x23,0x00,0x45,0x00,0x84,0x00, +0xE4,0x00,0x6F,0x01,0x2F,0x02,0x2F,0x03,0x76,0x04,0x0F,0x06,0xFD,0x07,0x45,0x0A, +0xE6,0x0C,0xDA,0x0F,0x19,0x13,0x93,0x16,0x37,0x1A,0xEF,0x1D,0xA0,0x21,0x2F,0x25, +0x80,0x28,0x77,0x2B,0xFA,0x2D,0xF2,0x2F,0x4D,0x31,0xFD,0x31,0x05,0x00,0xF5,0x28, +0xEA,0x95,0x00,0x00,0x06,0x96,0x00,0x00,0x25,0x96,0x00,0x00,0x44,0x96,0x00,0x00, +0x53,0x96,0x00,0x00,0x44,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x24,0xB1,0x5A,0x07, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,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,0x00,0x00,0x02,0x00,0x08,0x00, +0x00,0x00,0x56,0x30,0x31,0x2E,0x30,0x30,0x37,0x2E,0x30,0x34,0x4C,0xFF,0xB2,0x89 +}; diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_common.c b/drivers/input/touchscreen/msg2233/mstar_drv_common.c new file mode 100644 index 00000000..bb47994c --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_common.c @@ -0,0 +1,155 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_common.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_common.h" + +/*=============================================================*/ +// MACRO DEFINITION +/*=============================================================*/ + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u32 _gCrc32Table[256]; + +/*=============================================================*/ +// DATA TYPE DEFINITION +/*=============================================================*/ + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +/// CRC +u32 DrvCommonCrcDoReflect(u32 nRef, s8 nCh) +{ + u32 nValue = 0; + u32 i = 0; + + for (i = 1; i < (nCh + 1); i ++) + { + if (nRef & 1) + { + nValue |= 1 << (nCh - i); + } + nRef >>= 1; + } + + return nValue; +} + +u32 DrvCommonCrcGetValue(u32 nText, u32 nPrevCRC) +{ + u32 nCRC = nPrevCRC; + + nCRC = (nCRC >> 8) ^ _gCrc32Table[(nCRC & 0xFF) ^ nText]; + + return nCRC; +} + +void DrvCommonCrcInitTable(void) +{ + u32 nMagicNumber = 0x04c11db7; + u32 i, j; + + for (i = 0; i <= 0xFF; i ++) + { + _gCrc32Table[i] = DrvCommonCrcDoReflect(i, 8) << 24; + for (j = 0; j < 8; j ++) + { + _gCrc32Table[i] = (_gCrc32Table[i] << 1) ^ (_gCrc32Table[i] & (0x80000000L) ? nMagicNumber : 0); + } + _gCrc32Table[i] = DrvCommonCrcDoReflect(_gCrc32Table[i], 32); + } +} + +u8 DrvCommonCalculateCheckSum(u8 *pMsg, u32 nLength) +{ + s32 nCheckSum = 0; + u32 i; + + for (i = 0; i < nLength; i ++) + { + nCheckSum += pMsg[i]; + } + + return (u8)((-nCheckSum) & 0xFF); +} + +u32 DrvCommonConvertCharToHexDigit(char *pCh, u32 nLength) +{ + u32 nRetVal = 0; + u32 i; + + DBG("nLength = %d\n", nLength); + + for (i = 0; i < nLength; i ++) + { + char ch = *pCh++; + u32 n = 0; + u8 nIsValidDigit = 0; + + if ((i == 0 && ch == '0') || (i == 1 && ch == 'x')) + { + continue; + } + + if ('0' <= ch && ch <= '9') + { + n = ch-'0'; + nIsValidDigit = 1; + } + else if ('a' <= ch && ch <= 'f') + { + n = 10 + ch-'a'; + nIsValidDigit = 1; + } + else if ('A' <= ch && ch <= 'F') + { + n = 10 + ch-'A'; + nIsValidDigit = 1; + } + + if (1 == nIsValidDigit) + { + nRetVal = n + nRetVal*16; + } + } + + return nRetVal; +} + +//------------------------------------------------------------------------------// \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_common.h b/drivers/input/touchscreen/msg2233/mstar_drv_common.h new file mode 100644 index 00000000..ef0dd022 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_common.h @@ -0,0 +1,548 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_common.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_COMMON_H__ +#define __MSTAR_DRV_COMMON_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*--------------------------------------------------------------------------*/ +/* TOUCH DEVICE DRIVER RELEASE VERSION */ +/*--------------------------------------------------------------------------*/ + +#define DEVICE_DRIVER_RELEASE_VERSION ("3.2.0.0") + +#define CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K + + +/*--------------------------------------------------------------------------*/ +/* COMPILE OPTION DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling for distinct smart phone developer platform. + * For running on Spreadtrum platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM. + * For running on Qualcomm platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM. + * For running on MediaTek platform, please define the compile option CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM. + */ +#define CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM +//#define CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM +//#define CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling for mutual-capacitive ic or self-capacitive ic. + * For a mutual-capacitive ic project(MSG26xxM/MSG28xx), please define the compile option CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC. + * For a self-capacitive ic project(MSG21xxA/MSG22xx), please define the compile option CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC. + */ +//#define CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +#define CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC + + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling to make sure main board can supply power to touch ic for some specific BB chip of MTK(EX. MT6582)/SPRD(EX. SC7715)/QCOM(EX. MSM8610). + * By default, this compile option is disabled. + */ +#define CONFIG_ENABLE_REGULATOR_POWER_ON + +/* + * Note. + * The below compile option is used to distinguish different workqueue scheduling mechanism when firmware report finger touch to device driver by IRQ interrupt. + * For MTK platform, there are two type of workqueue scheduling mechanism available. + * Please refer to the related code which is enclosed by compile option CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM in mstar_drv_platform_porting_layer.c for more detail. + * This compile option is used for MTK platform only. + * By default, this compile option is disabled. + */ + +//#define CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + +/* + * Note. + * The below compile option is used to apply DMA mode for read/write data between device driver and firmware by I2C. + * The DMA mode is used to reslove I2C read/write 8 bytes limitation for specific MTK BB chip(EX. MT6589/MT6572/...) + * This compile option is used for MTK platform only. + * By default, this compile option is disabled. + */ +#define CONFIG_ENABLE_DMA_IIC + + +/* + * Note. + * The below compile option is used to enable the specific device driver code handling when touch panel support virtual key(EX. Menu, Home, Back, Search). + * If this compile option is not defined, the function for virtual key handling will be disabled. + * By default, this compile option is enabled. + */ +#define CONFIG_TP_HAVE_KEY + +/* + * Note. + * Since specific MTK BB chip report virtual key touch by using coordinate instead of key code, the below compile option is used to enable the code handling for reporting key with coordinate. + * This compile option is used for MTK platform only. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + +/* + * Note. + * The below flag is used to enable debug mode data log for firmware. + * Please make sure firmware support debug mode data log firstly, then you can enable this flag. + * By default, this flag is enabled. + */ +#define CONFIG_ENABLE_FIRMWARE_DATA_LOG (0) // 1 : Enable, 0 : Disable + +/* + * Note. + * The below compile option is used to enable segment read debug mode finger touch data for MSG26XXM/MSG28XX only. + * Since I2C transaction length limitation for some specific MTK BB chip(EX. MT6589/MT6572/...) or QCOM BB chip, the debug mode finger touch data of MSG26XXM/MSG28XX can not be retrieved by one time I2C read operation. + * So we need to retrieve the complete finger touch data by segment read. + * By default, this compile option is enabled. + */ +#define CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +/* + * Note. + * The below compile option is used to enable gesture wakeup. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_GESTURE_WAKEUP + +// ------------------- #ifdef CONFIG_ENABLE_GESTURE_WAKEUP ------------------- // +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +/* + * Note. + * The below compile option is used to enable device driver to support at most 64 types of gesture wakeup mode. + * If the below compile option is not enabled, device driver can only support at most 16 types of gesture wakeup mode. + * By the way, 64 types of gesture wakeup mode is ready for MSG22XX/MSG28XX only. + * But, 64 types of gesture wakeup mode for MSG21XXA/MSG26XXM is not supported. + * By default, this compile option is disabled. + */ +//#define CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + +/* + * Note. + * The below compile option is used to enable gesture debug mode. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_GESTURE_DEBUG_MODE + +/* + * Note. + * The below compile option is used to enable gesture information mode. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP +// ------------------- #endif CONFIG_ENABLE_GESTURE_WAKEUP ------------------- // + + +/* + * Note. + * The below compile option is used to enable phone level MP test handling. + * By the way, phone level MP test is ready for MSG21XXA/MSG22XX/MSG26XXM. + * But, phone level MP test for MSG28XX is not ready yet. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_ITO_MP_TEST + +// ------------------- #ifdef CONFIG_ENABLE_ITO_MP_TEST ------------------- // +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +/* + * Note. + * The below compile option is used to enable the specific short test item of 2R triangle pattern for self-capacitive touch ic. + * This compile option is used for MSG21XXA/MSG22XX only. + * Please enable the compile option if the ITO pattern is 2R triangle pattern for MSG21XXA/MSG22XX. + * Please disable the compile option if the ITO pattern is H(horizontal) triangle pattern for MSG21XXA/MSG22XX. + * By default, this compile option is enabled. + */ +#define CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + +#endif //CONFIG_ENABLE_ITO_MP_TEST +// ------------------- #endif CONFIG_ENABLE_ITO_MP_TEST ------------------- // + + +/* + * Note. + * If this compile option is not defined, the SW ID mechanism for updating firmware will be disabled. + * By default, this compile option is disabled. + */ +#define CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +// ------------------- #ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID ------------------- // +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/* + * Note. + * If this compile option is defined, the update firmware bin file shall be stored in a two dimensional array format. + * Else, the update firmware bin file shall be stored in an one dimensional array format. + * Be careful, MSG22XX only support storing update firmware bin file in an one dimensional array format, it does not support two dimensional array format. + * By default, this compile option is enabled. + */ +//#define CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID +// ------------------- #endif CONFIG_UPDATE_FIRMWARE_BY_SW_ID ------------------- // + +/* + * Note. + * The below compile option is used to enable hotknot and only supports MSG28XX. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_HOTKNOT + + +/* + * Note. + * The below compile option is used to enable proximity detection. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_PROXIMITY_DETECTION + +/* + * Note. + * The below compile option is used to enable notifier feedback handling for QCOM platform. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_NOTIFIER_FB + + +/* + * Note. + * The below compile option is used to enable report rate calculation. + * By default, this compile option is enabled. + */ +#define CONFIG_ENABLE_COUNT_REPORT_RATE + + +/* + * Note. + * The below compile option is used to enable glove mode and only supports MSG28XX. + * By default, this compile option is disabled. + */ +//#define CONFIG_ENABLE_GLOVE_MODE + + +/* + * Note. + * The below compile option is used to enable jni interface. + * By default, this compile option is enabled. + */ +#define CONFIG_ENABLE_JNI_INTERFACE + + +/* + * Note. + * The below compile option is used to enable the debug code for clarifying some issues. For example, to debug the delay time issue for IC hardware reset. + * By the way, this feature is supported for MSG28XX only. + * By default, this compile option is disabled. + */ +#define CONFIG_ENABLE_CODE_FOR_DEBUG + + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define u8 unsigned char +#define u16 unsigned short +#define u32 unsigned int +#define s8 signed char +#define s16 signed short +#define s32 signed int +#define s64 int64_t +#define u64 uint64_t + + +#define CHIP_TYPE_MSG21XX (0x01) // EX. MSG2133 +#define CHIP_TYPE_MSG21XXA (0x02) // EX. MSG2133A/MSG2138A(Besides, use version to distinguish MSG2133A/MSG2138A, you may refer to _DrvFwCtrlUpdateFirmwareCash()) +#define CHIP_TYPE_MSG26XXM (0x03) // EX. MSG2633M +#define CHIP_TYPE_MSG22XX (0x7A) // EX. MSG2238/MSG2256 +#define CHIP_TYPE_MSG28XX (0x85) // EX. MSG2856 + +#define PACKET_TYPE_TOOTH_PATTERN (0x20) +#define PACKET_TYPE_GESTURE_WAKEUP (0x50) +#define PACKET_TYPE_GESTURE_DEBUG (0x51) +#define PACKET_TYPE_GESTURE_INFORMATION (0x52) + +#define TOUCH_SCREEN_X_MIN (0) +#define TOUCH_SCREEN_Y_MIN (0) +/* + * Note. + * Please change the below touch screen resolution according to the touch panel that you are using. + */ +//#define TOUCH_SCREEN_X_MAX (480) //LCD_WIDTH +//#define TOUCH_SCREEN_Y_MAX (800) //LCD_HEIGHT +/* + * Note. + * Please do not change the below setting. + */ +#define TPD_WIDTH (2048) +#define TPD_HEIGHT (2048) + + +#define BIT0 (1<<0) // 0x0001 +#define BIT1 (1<<1) // 0x0002 +#define BIT2 (1<<2) // 0x0004 +#define BIT3 (1<<3) // 0x0008 +#define BIT4 (1<<4) // 0x0010 +#define BIT5 (1<<5) // 0x0020 +#define BIT6 (1<<6) // 0x0040 +#define BIT7 (1<<7) // 0x0080 +#define BIT8 (1<<8) // 0x0100 +#define BIT9 (1<<9) // 0x0200 +#define BIT10 (1<<10) // 0x0400 +#define BIT11 (1<<11) // 0x0800 +#define BIT12 (1<<12) // 0x1000 +#define BIT13 (1<<13) // 0x2000 +#define BIT14 (1<<14) // 0x4000 +#define BIT15 (1<<15) // 0x8000 + + +#define MAX_DEBUG_REGISTER_NUM (10) +#define MAX_DEBUG_COMMAND_ARGUMENT_NUM (4) + +#define MAX_UPDATE_FIRMWARE_BUFFER_SIZE (130) // 130KB. The size shall be large enough for stored any kind firmware size of MSG21XXA(33KB)/MSG22XX(48.5KB)/MSG26XXM(40KB)/MSG28XX(130KB). + +#define MAX_I2C_TRANSACTION_LENGTH_LIMIT (250) // Please change the value depends on the I2C transaction limitation for the platform that you are using. +#define MAX_TOUCH_IC_REGISTER_BANK_SIZE (256) // It is a fixed value and shall not be modified. + + +#define PROCFS_AUTHORITY (0666) + + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#define GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG 0x00000001 //0000 0000 0000 0000 0000 0000 0000 0001 +#define GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG 0x00000002 //0000 0000 0000 0000 0000 0000 0000 0010 +#define GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG 0x00000004 //0000 0000 0000 0000 0000 0000 0000 0100 +#define GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG 0x00000008 //0000 0000 0000 0000 0000 0000 0000 1000 +#define GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG 0x00000010 //0000 0000 0000 0000 0000 0000 0001 0000 +#define GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG 0x00000020 //0000 0000 0000 0000 0000 0000 0010 0000 +#define GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG 0x00000040 //0000 0000 0000 0000 0000 0000 0100 0000 +#define GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG 0x00000080 //0000 0000 0000 0000 0000 0000 1000 0000 +#define GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG 0x00000100 //0000 0000 0000 0000 0000 0001 0000 0000 +#define GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG 0x00000200 //0000 0000 0000 0000 0000 0010 0000 0000 +#define GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG 0x00000400 //0000 0000 0000 0000 0000 0100 0000 0000 +#define GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG 0x00000800 //0000 0000 0000 0000 0000 1000 0000 0000 +#define GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG 0x00001000 //0000 0000 0000 0000 0001 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE1_FLAG 0x00002000 //0000 0000 0000 0000 0010 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE2_FLAG 0x00004000 //0000 0000 0000 0000 0100 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE3_FLAG 0x00008000 //0000 0000 0000 0000 1000 0000 0000 0000 + +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE +#define GESTURE_WAKEUP_MODE_RESERVE4_FLAG 0x00010000 //0000 0000 0000 0001 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE5_FLAG 0x00020000 //0000 0000 0000 0010 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE6_FLAG 0x00040000 //0000 0000 0000 0100 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE7_FLAG 0x00080000 //0000 0000 0000 1000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE8_FLAG 0x00100000 //0000 0000 0001 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE9_FLAG 0x00200000 //0000 0000 0010 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE10_FLAG 0x00400000 //0000 0000 0100 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE11_FLAG 0x00800000 //0000 0000 1000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE12_FLAG 0x01000000 //0000 0001 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE13_FLAG 0x02000000 //0000 0010 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE14_FLAG 0x04000000 //0000 0100 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE15_FLAG 0x08000000 //0000 1000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE16_FLAG 0x10000000 //0001 0000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE17_FLAG 0x20000000 //0010 0000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE18_FLAG 0x40000000 //0100 0000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE19_FLAG 0x80000000 //1000 0000 0000 0000 0000 0000 0000 0000 + +#define GESTURE_WAKEUP_MODE_RESERVE20_FLAG 0x00000001 //0000 0000 0000 0000 0000 0000 0000 0001 +#define GESTURE_WAKEUP_MODE_RESERVE21_FLAG 0x00000002 //0000 0000 0000 0000 0000 0000 0000 0010 +#define GESTURE_WAKEUP_MODE_RESERVE22_FLAG 0x00000004 //0000 0000 0000 0000 0000 0000 0000 0100 +#define GESTURE_WAKEUP_MODE_RESERVE23_FLAG 0x00000008 //0000 0000 0000 0000 0000 0000 0000 1000 +#define GESTURE_WAKEUP_MODE_RESERVE24_FLAG 0x00000010 //0000 0000 0000 0000 0000 0000 0001 0000 +#define GESTURE_WAKEUP_MODE_RESERVE25_FLAG 0x00000020 //0000 0000 0000 0000 0000 0000 0010 0000 +#define GESTURE_WAKEUP_MODE_RESERVE26_FLAG 0x00000040 //0000 0000 0000 0000 0000 0000 0100 0000 +#define GESTURE_WAKEUP_MODE_RESERVE27_FLAG 0x00000080 //0000 0000 0000 0000 0000 0000 1000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE28_FLAG 0x00000100 //0000 0000 0000 0000 0000 0001 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE29_FLAG 0x00000200 //0000 0000 0000 0000 0000 0010 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE30_FLAG 0x00000400 //0000 0000 0000 0000 0000 0100 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE31_FLAG 0x00000800 //0000 0000 0000 0000 0000 1000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE32_FLAG 0x00001000 //0000 0000 0000 0000 0001 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE33_FLAG 0x00002000 //0000 0000 0000 0000 0010 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE34_FLAG 0x00004000 //0000 0000 0000 0000 0100 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE35_FLAG 0x00008000 //0000 0000 0000 0000 1000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE36_FLAG 0x00010000 //0000 0000 0000 0001 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE37_FLAG 0x00020000 //0000 0000 0000 0010 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE38_FLAG 0x00040000 //0000 0000 0000 0100 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE39_FLAG 0x00080000 //0000 0000 0000 1000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE40_FLAG 0x00100000 //0000 0000 0001 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE41_FLAG 0x00200000 //0000 0000 0010 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE42_FLAG 0x00400000 //0000 0000 0100 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE43_FLAG 0x00800000 //0000 0000 1000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE44_FLAG 0x01000000 //0000 0001 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE45_FLAG 0x02000000 //0000 0010 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE46_FLAG 0x04000000 //0000 0100 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE47_FLAG 0x08000000 //0000 1000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE48_FLAG 0x10000000 //0001 0000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE49_FLAG 0x20000000 //0010 0000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE50_FLAG 0x40000000 //0100 0000 0000 0000 0000 0000 0000 0000 +#define GESTURE_WAKEUP_MODE_RESERVE51_FLAG 0x80000000 //1000 0000 0000 0000 0000 0000 0000 0000 +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + +#define GESTURE_WAKEUP_PACKET_LENGTH (6) + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +#define GESTURE_DEBUG_MODE_PACKET_LENGTH (128) +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#define GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH (128) +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#define FEATURE_GESTURE_WAKEUP_MODE 0x0001 +#define FEATURE_GESTURE_DEBUG_MODE 0x0002 +#define FEATURE_GESTURE_INFORMATION_MODE 0x0003 + +#define FEATURE_TOUCH_DRIVER_DEBUG_LOG 0x0010 +#define FEATURE_FIRMWARE_DATA_LOG 0x0011 + +/* + * Note. + * The below flag is used to enable the output log mechanism while touch device driver is running. + * If this flag is not defined, the function for output log will be disabled. + * By default, this flag is enabled. + */ +#define CONFIG_ENABLE_TOUCH_DRIVER_DEBUG_LOG (0) // 1 : Enable, 0 : Disable + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern u8 IS_TOUCH_DRIVER_DEBUG_LOG_ENABLED; + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define DBG(fmt, arg...) do {\ + if (IS_TOUCH_DRIVER_DEBUG_LOG_ENABLED == 1)\ + printk(fmt, ##arg);\ + } while (0) + + +struct msg2138_ts_platform_data{ + int irq_gpio_number; + int reset_gpio_number; + const char *vdd_name; + int virtualkeys[12]; + int TP_MAX_X; + int TP_MAX_Y; +}; +extern struct i2c_client *g_I2cClient; +extern int MS_TS_MSG_IC_GPIO_RST; +extern int MS_TS_MSG_IC_GPIO_INT; +extern int TOUCH_SCREEN_X_MAX; +extern int TOUCH_SCREEN_Y_MAX; +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +typedef enum +{ + EMEM_ALL = 0, + EMEM_MAIN, + EMEM_INFO +} EmemType_e; + +typedef enum +{ + ITO_TEST_MODE_OPEN_TEST = 1, + ITO_TEST_MODE_SHORT_TEST = 2, + ITO_TEST_MODE_WATERPROOF_TEST = 3 +} ItoTestMode_e; + +typedef enum +{ + ITO_TEST_OK = 0, + ITO_TEST_FAIL, + ITO_TEST_GET_TP_TYPE_ERROR, + ITO_TEST_UNDEFINED_ERROR, + ITO_TEST_UNDER_TESTING + +} ItoTestResult_e; + +typedef enum +{ + ADDRESS_MODE_8BIT = 0, + ADDRESS_MODE_16BIT = 1 +} AddressMode_e; + +typedef enum +{ + MUTUAL = 0, + SELF, + WATERPROOF, + MUTUAL_SINGLE_DRIVE +} ItoTestFwMode_e; + +/*--------------------------------------------------------------------------*/ +/* GLOBAL VARIABLE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern u8 DrvCommonCalculateCheckSum(u8 *pMsg, u32 nLength); +extern u32 DrvCommonConvertCharToHexDigit(char *pCh, u32 nLength); +extern u32 DrvCommonCrcDoReflect(u32 nRef, s8 nCh); +extern u32 DrvCommonCrcGetValue(u32 nText, u32 nPrevCRC); +extern void DrvCommonCrcInitTable(void); + +#endif /* __MSTAR_DRV_COMMON_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_extern.h b/drivers/input/touchscreen/msg2233/mstar_drv_extern.h new file mode 100755 index 00000000..f184c144 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_extern.h @@ -0,0 +1,46 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_extern.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_EXTERN_H__ +#define __MSTAR_DRV_EXTERN_H__ + + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +//#include "mstar_drv_common.h" + +/*=============================================================*/ +// EXTERN FUNCTION DECLARATION +/*=============================================================*/ + +//#ifdef CONFIG_ENABLE_CHARGER_DETECTION +extern void DrvFwCtrlChargerDetection(u8 nChargerStatus); +//#endif //CONFIG_ENABLE_CHARGER_DETECTION + + +#endif /* __MSTAR_DRV_EXTERN_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_hotknot.c b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot.c new file mode 100644 index 00000000..e33da4ee --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot.c @@ -0,0 +1,848 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_hotknot.c + * + * @brief This file defines the hotknot functions + * + * + */ + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include "mstar_drv_hotknot.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_hotknot_queue.h" +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +#include "mstar_drv_mutual_fw_control.h" +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + +#ifdef CONFIG_ENABLE_HOTKNOT +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// + + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ +u8 g_HotKnotState; +struct mutex g_QMutex; //queue mutex + + + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ +extern struct mutex g_Mutex; +extern struct i2c_client *g_I2cClient; + +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; + +extern u16 FIRMWARE_MODE_UNKNOWN_MODE; +extern u16 FIRMWARE_MODE_DEMO_MODE; +extern u16 FIRMWARE_MODE_DEBUG_MODE; +//extern u16 FIRMWARE_MODE_RAW_DATA_MODE; + +extern u16 g_FirmwareMode; + +extern u8 IS_FIRMWARE_DATA_LOG_ENABLED; + +extern u8 g_IsHotknotEnabled; + + +//////////////////////////////////////////////////////////// +/// LOCAL VARIABLE DEFINITION +//////////////////////////////////////////////////////////// +DrvCmd_t * _gDrvCmdStack; +unsigned long _gArgStack; +u8 * _gHKPacket; +u16 _gHKLength; + +static int _gHKFlag = 0; +static DECLARE_WAIT_QUEUE_HEAD(_gHKWaiter); + +#ifdef CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING +static int _gHKRcvFlag = 0; +static int _gHKRcvWaitEnable = 0; +static DECLARE_WAIT_QUEUE_HEAD(_gHKRcvWaiter); +#endif + +static DrvCmd_t * _gCmdIn; +static u8 * _gSndData; +static u8 * _gRcvData; +static u16 * _gFwMode; + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Implementation +//////////////////////////////////////////////////////////// + +u8 _GetCheckSum(u8 *pBuf, int nLen) +{ + s32 nSum = 0; + int i; + for(i=0; i < nLen; i++) + { + nSum += pBuf[i]; + } + return (u8)(-nSum&0xFF); +} + + +void _DebugShowArray(u8 *pBuf, u16 nLen) +{ + int i; + + for(i=0; i < nLen; i++) + { + DBG("%02X ", pBuf[i]); + + if(i%16==15){ + DBG("\n"); + } + } + DBG("\n"); +} + + +int PushHotKnotData(u8 * pBuf, u16 nLength) +{ + int nQRet; + mutex_lock(&g_QMutex); + nQRet = PushQueue(pBuf, nLength); + mutex_unlock(&g_QMutex); + + return nQRet; +} + + +int PopHotKnotData(u8 * pBuf, u16 nLength) +{ + int nQRet; + mutex_lock(&g_QMutex); + nQRet = PopQueue(pBuf, nLength); + mutex_unlock(&g_QMutex); + + return nQRet; +} + + +int ShowHotKnotData(u8 * pBuf, u16 nLength) +{ + int nQRet; + mutex_lock(&g_QMutex); + nQRet = ShowQueue(pBuf, nLength); + mutex_unlock(&g_QMutex); + + return nQRet; +} + + +void _HotKnotRcvInterruptHandler(u8 *pPacket, u16 nLength) //receive hotknot packet in interrupt +{ + u16 nPacketDataLen = 0; + u16 nQPushLen = 0; + + DBG("*** %s() ***\n", __func__); + + if(g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + nPacketDataLen = (((DemoHotKnotRcvRet_t*)pPacket)->nActualDataLen_H << 8) | (((DemoHotKnotRcvRet_t*)pPacket)->nActualDataLen_L & 0xFF); + nQPushLen = ((((DemoHotKnotRcvRet_t*)pPacket)->szData)[0]&0x7F) + 1; + if(nPacketDataLen >= nQPushLen) + { + if(PushHotKnotData(((DemoHotKnotRcvRet_t*)pPacket)->szData, nQPushLen)<0) + { + DBG("Error: HotKnot# Over push data into queue."); + } +#ifdef CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING + else + { + if(_gHKRcvWaitEnable == 1) + { + _gHKRcvFlag = 1; + DBG("*** wait up receive_wait. ***\n"); + wake_up_interruptible(&_gHKRcvWaiter); + } + } +#endif //CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING + } + else + { + DBG("Error: HotKnot# Receive data error."); + } + } + else if(IS_FIRMWARE_DATA_LOG_ENABLED && (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE)) + { + nPacketDataLen = (((DebugHotKnotRcvRet_t*)pPacket)->nActualDataLen_H << 8) | (((DebugHotKnotRcvRet_t*)pPacket)->nActualDataLen_L & 0xFF); + nQPushLen = ((((DemoHotKnotRcvRet_t*)pPacket)->szData)[0]&0x7F) + 1; + + if(nPacketDataLen >= nQPushLen) + { + if(PushHotKnotData(((DebugHotKnotRcvRet_t*)pPacket)->szData, nQPushLen)<0) + { + DBG("Error: HotKnot# Over push data into queue."); + } +#ifdef CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING + else + { + if(_gHKRcvWaitEnable == 1) + { + _gHKRcvFlag = 1; + DBG("*** wait up receive_wait. ***\n"); + wake_up_interruptible(&_gHKRcvWaiter); + } + } +#endif //CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING + } + else + { + DBG("Error: HotKnot# Receive data error."); + } + } +} + + +void ReportHotKnotCmd(u8 *pPacket, u16 nLength) +{ + //DBG("*** %s() ***\n", __func__); + + if(g_HotKnotState == HOTKNOT_TRANS_STATE && pPacket[0] == HOTKNOT_PACKET_ID && pPacket[3] == HOTKNOT_RECEIVE_PACKET_TYPE) + { + _HotKnotRcvInterruptHandler(pPacket, nLength); + } + else if(_gDrvCmdStack!=NULL && _gArgStack!=0) + { + _gHKPacket = pPacket; + _gHKLength = nLength; + + _gHKFlag = 1; + wake_up_interruptible(&_gHKWaiter); + } +} + + +void _HotKnotCmdInterruptHandler(u8 *pPacket, u16 nLength) +{ + //DBG("*** %s() ***\n", __func__); + + if(_gDrvCmdStack->nCmdId == HOTKNOT_CMD) + { + if(g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + HotKnotCmd_t *pSnd = (HotKnotCmd_t*)_gDrvCmdStack->pSndData; + DemoHotKnotCmdRet_t *pRcv = (DemoHotKnotCmdRet_t*)pPacket; + if(pRcv->nHeader == DEMO_PD_PACKET_ID && pSnd->nInstruction == pRcv->nInstruction) + { + if(pRcv->nResult == RESULT_OK) + { + if(pRcv->nInstruction == READ_PAIR_STATE) + { + g_HotKnotState = HOTKNOT_BEFORE_TRANS_STATE; + ClearQueue(); + } + else if(pRcv->nInstruction == ENTER_TRANSFER_MODE) + { + g_HotKnotState = HOTKNOT_TRANS_STATE; + } + else if(pRcv->nInstruction == EXIT_TRANSFER_MODE) + { + g_HotKnotState = HOTKNOT_AFTER_TRANS_STATE; + } + else if(pRcv->nInstruction == ENTER_SLAVE_MODE) + { + g_HotKnotState = HOTKNOT_NOT_TRANS_STATE; + } + + if(pRcv->nInstruction == ENABLE_HOTKNOT || pRcv->nInstruction == ENTER_MASTER_MODE || pRcv->nInstruction == ENTER_SLAVE_MODE) + { + g_IsHotknotEnabled = 1; + DBG("*** g_IsHotknotEnabled = %d ***\n", g_IsHotknotEnabled); + } + else if(pRcv->nInstruction == DISABLE_HOTKNOT) + { + g_IsHotknotEnabled = 0; + DBG("*** g_IsHotknotEnabled = %d ***\n", g_IsHotknotEnabled); + } + } + + memcpy(_gDrvCmdStack->pRcvData, pPacket, nLength); + //_gDrvCmdStack->nRcvLen = nLength; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEMO_MODE; + } + } + else if(IS_FIRMWARE_DATA_LOG_ENABLED && (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE)) + { + HotKnotCmd_t *pSnd = (HotKnotCmd_t*)_gDrvCmdStack->pSndData; + DebugHotKnotCmdRet_t *pRcv = (DebugHotKnotCmdRet_t*)pPacket; + if(pRcv->nHeader == HOTKNOT_PACKET_ID && pSnd->nInstruction == pRcv->nInstruction) + { + if(pRcv->nResult == RESULT_OK) + { + if(pRcv->nInstruction == READ_PAIR_STATE) + { + g_HotKnotState = HOTKNOT_BEFORE_TRANS_STATE; + ClearQueue(); + } + else if(pRcv->nInstruction == ENTER_TRANSFER_MODE) + { + g_HotKnotState = HOTKNOT_TRANS_STATE; + } + else if(pRcv->nInstruction == EXIT_TRANSFER_MODE) + { + g_HotKnotState = HOTKNOT_AFTER_TRANS_STATE; + } + else if(pRcv->nInstruction == ENTER_SLAVE_MODE) + { + g_HotKnotState = HOTKNOT_NOT_TRANS_STATE; + } + + if(pRcv->nInstruction == ENABLE_HOTKNOT || pRcv->nInstruction == ENTER_MASTER_MODE || pRcv->nInstruction == ENTER_SLAVE_MODE) + { + g_IsHotknotEnabled = 1; + DBG("*** g_IsHotknotEnabled = %d ***\n", g_IsHotknotEnabled); + } + else if(pRcv->nInstruction == DISABLE_HOTKNOT) + { + g_IsHotknotEnabled = 0; + DBG("*** g_IsHotknotEnabled = %d ***\n", g_IsHotknotEnabled); + } + } + + memcpy(_gDrvCmdStack->pRcvData, pPacket, nLength); + //_gDrvCmdStack->nRcvLen = nLength; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEBUG_MODE; + } + } + } + else if(_gDrvCmdStack->nCmdId == HOTKNOT_SEND) + { + if(g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + HotKnotSnd_t *pSnd = (HotKnotSnd_t*)_gDrvCmdStack->pSndData; + DemoHotKnotSndRet_t *pRcv = (DemoHotKnotSndRet_t*)pPacket; + if(pRcv->nHeader == HOTKNOT_PACKET_ID && pRcv->nType == HOTKNOT_PACKET_TYPE && pSnd->nInstruction == pRcv->nInstruction) + { + //kthread_stop(_gHotKnotTask); + memcpy(_gDrvCmdStack->pRcvData, pPacket, nLength); + //_gDrvCmdStack->nRcvLen = nLength; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEMO_MODE; + } + } + else if(IS_FIRMWARE_DATA_LOG_ENABLED && (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE)) + { + HotKnotSnd_t *pSnd = (HotKnotSnd_t*)_gDrvCmdStack->pSndData; + DebugHotKnotSndRet_t *pRcv = (DebugHotKnotSndRet_t*)pPacket; + if(pRcv->nHeader == HOTKNOT_PACKET_ID && pRcv->nType == HOTKNOT_PACKET_TYPE && pSnd->nInstruction == pRcv->nInstruction) + { + //kthread_stop(_gHotKnotTask); + memcpy(_gDrvCmdStack->pRcvData, pPacket, nLength); + //_gDrvCmdStack->nRcvLen = nLength; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEBUG_MODE; + } + } + } +} + + +void _HotKnotTimeOutHandler(void) +{ + DBG("*** %s() ***\n", __func__); + + //handle timeout case + if(_gDrvCmdStack->nCmdId == HOTKNOT_CMD) + { + if(g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + HotKnotSnd_t *pSnd = (HotKnotSnd_t*)_gDrvCmdStack->pSndData; + DemoHotKnotCmdRet_t *pRcv = (DemoHotKnotCmdRet_t*)_gDrvCmdStack->pRcvData; + memset(pRcv, 0xFF, DEMO_PD_PACKET_RET_LEN); + pRcv->nHeader = DEMO_PD_PACKET_ID; + pRcv->nInstruction = pSnd->nInstruction; + pRcv->nResult = RESULT_TIMEOUT; + pRcv->nIdentify = DEMO_PD_PACKET_IDENTIFY; + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEMO_PD_PACKET_RET_LEN-1); + //_gDrvCmdStack->nRcvLen = DEMO_PD_PACKET_RET_LEN; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEMO_MODE; + } + else if(IS_FIRMWARE_DATA_LOG_ENABLED && (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE)) + { + HotKnotSnd_t *pSnd = (HotKnotSnd_t*)_gDrvCmdStack->pSndData; + DebugHotKnotCmdRet_t *pRcv = (DebugHotKnotCmdRet_t*)_gDrvCmdStack->pRcvData; + memset(_gDrvCmdStack->pRcvData, 0xFF, MAX_PD_PACKET_RET_LEN); + pRcv->nHeader = HOTKNOT_PACKET_ID; + pRcv->nPacketLen_H = MAX_PD_PACKET_RET_LEN>>8; + pRcv->nPacketLen_L = MAX_PD_PACKET_RET_LEN&0xFF; + pRcv->nType = HOTKNOT_PACKET_TYPE; + pRcv->nInstruction = pSnd->nInstruction; + pRcv->nResult = RESULT_TIMEOUT; + _gDrvCmdStack->pRcvData[MAX_PD_PACKET_RET_LEN-1] = _GetCheckSum((u8*)pRcv, MAX_PD_PACKET_RET_LEN-1); + //_gDrvCmdStack->nRcvLen = MAX_PD_PACKET_RET_LEN; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEBUG_MODE; + } + } + else if(_gDrvCmdStack->nCmdId == HOTKNOT_SEND) + { + if(g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + HotKnotSnd_t *pSnd = (HotKnotSnd_t*)_gDrvCmdStack->pSndData; + DemoHotKnotSndRet_t *pRcv = (DemoHotKnotSndRet_t*)_gDrvCmdStack->pRcvData; + memset(_gDrvCmdStack->pRcvData, 0, DEMO_HOTKNOT_SEND_RET_LEN); + pRcv->nHeader = HOTKNOT_PACKET_ID; + pRcv->nPacketLen_H = DEMO_HOTKNOT_SEND_RET_LEN>>8; + pRcv->nPacketLen_L = DEMO_HOTKNOT_SEND_RET_LEN&0xFF; + pRcv->nType = HOTKNOT_PACKET_TYPE; + pRcv->nInstruction = pSnd->nInstruction; + pRcv->nResult = RESULT_TIMEOUT; + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEMO_HOTKNOT_SEND_RET_LEN-1); + //_gDrvCmdStack->nRcvLen = DEMO_HOTKNOT_SEND_RET_LEN; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEMO_MODE; + } + else if(IS_FIRMWARE_DATA_LOG_ENABLED && (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE)) + { + HotKnotSnd_t *pSnd = (HotKnotSnd_t*)_gDrvCmdStack->pSndData; + DebugHotKnotSndRet_t *pRcv = (DebugHotKnotSndRet_t*)_gDrvCmdStack->pRcvData; + memset(_gDrvCmdStack->pRcvData, 0, DEBUG_HOTKNOT_SEND_RET_LEN); + pRcv->nHeader = HOTKNOT_PACKET_ID; + pRcv->nPacketLen_H = DEBUG_HOTKNOT_SEND_RET_LEN>>8; + pRcv->nPacketLen_L = DEBUG_HOTKNOT_SEND_RET_LEN&0xFF; + pRcv->nType = HOTKNOT_PACKET_TYPE; + pRcv->nInstruction = pSnd->nInstruction; + pRcv->nResult = RESULT_TIMEOUT; + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEBUG_HOTKNOT_SEND_RET_LEN-1); + //_gDrvCmdStack->nRcvLen = DEBUG_HOTKNOT_SEND_RET_LEN; + *(_gDrvCmdStack->pFwMode) = FIRMWARE_MODE_DEBUG_MODE; + } + } +} + + +int _DrvHandleHotKnotCmd(DrvCmd_t *pCmd, unsigned long nArg) +{ + long nRet; + + DBG("*** %s() ***\n", __func__); + + mutex_lock(&g_Mutex); +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + IicWriteData(SLAVE_I2C_ID_DWI2C, pCmd->pSndData, pCmd->nSndLen); //send HOTKNOT_CMD to fw + + mutex_unlock(&g_Mutex); + + + _gDrvCmdStack = pCmd; + _gArgStack = nArg; + + set_current_state(TASK_INTERRUPTIBLE); + nRet = wait_event_interruptible_timeout(_gHKWaiter, _gHKFlag != 0, pCmd->nTimeOut/1000 * HZ); + _gHKFlag = 0; + + if(nRet == 0) + { + _HotKnotTimeOutHandler(); + } + else + { + _HotKnotCmdInterruptHandler(_gHKPacket, _gHKLength); + } + + return 0; +} + + +void _DrvHandleHotKnotAuth(DrvCmd_t *pCmd) +{ + DBG("*** %s() ***\n", __func__); + + mutex_lock(&g_Mutex); +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + //for(i=0; i < pCmd->nSndLen; i++) + //{ + // DBG("%02X ", pCmd->pSndData[i]); + //} + + IicWriteData(SLAVE_I2C_ID_DWI2C, pCmd->pSndData, pCmd->nSndLen); + IicReadData(SLAVE_I2C_ID_DWI2C, pCmd->pRcvData, pCmd->nRcvLen); + + //for(i=0; i < pCmd->nRcvLen; i++) + //{ + // DBG("%02X ", pCmd->pRcvData[i]); + //} + + mutex_unlock(&g_Mutex); +} + + +#ifdef CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING +void _DrvHandleHotKnotRcv(DrvCmd_t *pCmd) +{ + u8 nQueueData; + int nDataLen = -1; + long nRet; + DemoHotKnotLibRcvRet_t *pRcv = NULL; + + DBG("*** %s() ***\n", __func__); + + pCmd->nRcvLen = DEMO_HOTKNOT_RECEIVE_RET_LEN; + pRcv = (DemoHotKnotLibRcvRet_t*)pCmd->pRcvData; + memset(pRcv, 0, DEMO_HOTKNOT_RECEIVE_RET_LEN); + pRcv->nHeader = RECEIVE_DATA; + + if(ShowHotKnotData(&nQueueData, 1) <= 0) //check how many bytes to fetch + { + DBG("ShowHotKnotData: No hotknot data in first check.\n"); + } + else + { + nDataLen = PopHotKnotData(pRcv->szData, (nQueueData&0x7F) + 1); + } + + if(nDataLen > 0) + { + pRcv->nActualHotKnotLen_H = nDataLen>>8; + pRcv->nActualHotKnotLen_L = nDataLen&0xFF; + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEMO_HOTKNOT_RECEIVE_RET_LEN-1); + return; + } + + _gHKRcvWaitEnable = 1; //in wait status + DBG("*** _gHKRcvWaitEnable = 1, receive_timeout = %d***\n", pCmd->nTimeOut * HZ/1000); + set_current_state(TASK_INTERRUPTIBLE); + nRet = wait_event_interruptible_timeout(_gHKRcvWaiter, _gHKRcvFlag != 0, pCmd->nTimeOut * HZ/1000); + _gHKRcvWaitEnable = 0; //no wait + DBG("*** _gHKRcvWaitEnable = 0 ***\n"); + _gHKRcvFlag = 0; + + + if(nRet == 0) //timeout + { + DBG("*** receive_timeout ***\n"); + pRcv->nActualHotKnotLen_H = 0; + pRcv->nActualHotKnotLen_L = 0; + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEMO_HOTKNOT_RECEIVE_RET_LEN-1); + } + else + { + DBG("*** receive_get_data ***\n"); + int nDataLen = -1; + if(ShowHotKnotData(&nQueueData, 1) <= 0) //check how many bytes to fetch + { + DBG("ShowHotKnotData: No hotknot data\n"); + } + else + { + nDataLen = PopHotKnotData(pRcv->szData, (nQueueData&0x7F) + 1); + } + + if(nDataLen < 0) + { + pRcv->nActualHotKnotLen_H = 0; + pRcv->nActualHotKnotLen_L = 0; + } + else + { + pRcv->nActualHotKnotLen_H = nDataLen>>8; + pRcv->nActualHotKnotLen_L = nDataLen&0xFF; + } + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEMO_HOTKNOT_RECEIVE_RET_LEN-1); + } +} +#else +void _DrvHandleHotKnotRcv(DrvCmd_t *pCmd) +{ + u8 nQueueData; + int nDataLen = -1; + DemoHotKnotLibRcvRet_t *pRcv = NULL; + + DBG("*** %s() ***\n", __func__); + + pCmd->nRcvLen = DEMO_HOTKNOT_RECEIVE_RET_LEN; + pRcv = (DemoHotKnotLibRcvRet_t*)pCmd->pRcvData; + memset(pRcv, 0, DEMO_HOTKNOT_RECEIVE_RET_LEN); + pRcv->nHeader = RECEIVE_DATA; + + if(ShowHotKnotData(&nQueueData, 1) <= 0) //check how many bytes to fetch + { + DBG("ShowHotKnotData: No hotknot data\n"); + } + else + { + nDataLen = PopHotKnotData(pRcv->szData, (nQueueData&0x7F) + 1); + } + + if(nDataLen < 0) + { + pRcv->nActualHotKnotLen_H = 0; + pRcv->nActualHotKnotLen_L = 0; + } + else + { + pRcv->nActualHotKnotLen_H = nDataLen>>8; + pRcv->nActualHotKnotLen_L = nDataLen&0xFF; + } + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, DEMO_HOTKNOT_RECEIVE_RET_LEN-1); +} +#endif + + +void _DrvHandleHotKnotGetQueue(DrvCmd_t *pCmd) +{ + DemoHotKnotGetQRet_t *pRcv = NULL; + + DBG("*** %s() ***\n", __func__); + + pCmd->nRcvLen = HOTKNOT_QUEUE_SIZE+6; + pRcv = (DemoHotKnotGetQRet_t*)pCmd->pRcvData; + memset(pRcv, 0, HOTKNOT_QUEUE_SIZE+6); + pRcv->nHeader = GET_QUEUE; + ShowAllQueue(pRcv->szData, &(pRcv->nFront), &(pRcv->nRear)); + pRcv->nCheckSum = _GetCheckSum((u8*)pRcv, HOTKNOT_QUEUE_SIZE+5); +} + + +void _DrvHandleHotKnotSndTest(DrvCmd_t *pCmd) +{ + u16 nQPushLen = 0; + HotKnotSnd_t *pSnd = NULL; + + DBG("*** %s() ***\n", __func__); + + pSnd = (HotKnotSnd_t*)pCmd->pSndData; + nQPushLen = (pSnd->nDataLen_H << 8) | (pSnd->nDataLen_L & 0xFF); + + DBG("nQPushLen = %d\n", nQPushLen); + if(PushHotKnotData(pSnd->szData, nQPushLen)<0) + { + DBG("Error: HotKnot# Over push data into queue."); + } + + //u8 * pShowArray = (u8*)kmalloc(sizeof(u8)* 256, GFP_KERNEL ); + //ShowHotKnotData(pShowArray, 256); //check queue data + //_DebugShowArray(pShowArray, 256); + //kfree(pShowArray); +} + + +/* +static DrvCmd_t* _TransCmdFromUser( unsigned long nArg ) +{ + long nRet; + DrvCmd_t tCmdIn; + DrvCmd_t *pTransCmd = (DrvCmd_t*)kmalloc( sizeof( DrvCmd_t ), GFP_KERNEL ); + + nRet = copy_from_user( &tCmdIn, (void*)nArg, sizeof( DrvCmd_t ) ); + pTransCmd->nCmdId = tCmdIn.nCmdId; + + pTransCmd->nSndLen = tCmdIn.nSndLen; + pTransCmd->pSndData = (u8*)kmalloc(sizeof(u8)*pTransCmd->nSndLen, GFP_KERNEL ); + nRet = copy_from_user( pTransCmd->pSndData, tCmdIn.pSndData, pTransCmd->nSndLen ); + + pTransCmd->nRcvLen = tCmdIn.nRcvLen; + pTransCmd->pRcvData = (u8*)kmalloc(sizeof(u8)*pTransCmd->nRcvLen, GFP_KERNEL ); + + pTransCmd->pFwMode= (u16*)kmalloc(sizeof(u16), GFP_KERNEL ); + pTransCmd->nTimeOut = tCmdIn.nTimeOut; + + return pTransCmd; +} + + +static void _TransCmdToUser( DrvCmd_t *pTransCmd, unsigned long nArg ) +{ + DrvCmd_t tCmdOut; + long nRet; + + nRet = copy_from_user( &tCmdOut, (void*)nArg, sizeof( DrvCmd_t ) ); + nRet = copy_to_user( tCmdOut.pRcvData, pTransCmd->pRcvData, tCmdOut.nRcvLen); + nRet = copy_to_user( tCmdOut.pFwMode, pTransCmd->pFwMode, sizeof(u16)); + + if ( pTransCmd ) + { + kfree( pTransCmd->pSndData ); + kfree( pTransCmd->pRcvData ); + kfree( pTransCmd->pFwMode ); + kfree( pTransCmd ); + } +} +*/ + + +void _ClearHotKnotMem(void) +{ + DBG("*** %s() ***\n", __func__); + + memset(_gCmdIn, 0, sizeof( DrvCmd_t )); + memset(_gSndData, 0, DEBUG_HOTKNOT_SEND_RET_LEN); + memset(_gRcvData, 0, DEBUG_HOTKNOT_RECEIVE_RET_LEN); + memset(_gFwMode, 0, sizeof(u16)); +} + + +static DrvCmd_t* _TransCmdFromUser( unsigned long nArg ) +{ + long nRet; + DrvCmd_t tCmdIn; + DrvCmd_t *pTransCmd; + + _ClearHotKnotMem(); + pTransCmd = (DrvCmd_t *)_gCmdIn; + nRet = copy_from_user( &tCmdIn, (void*)nArg, sizeof( DrvCmd_t ) ); + pTransCmd->nCmdId = tCmdIn.nCmdId; + + pTransCmd->nSndLen = tCmdIn.nSndLen; + pTransCmd->pSndData = _gSndData; + nRet = copy_from_user( pTransCmd->pSndData, tCmdIn.pSndData, pTransCmd->nSndLen ); + + pTransCmd->nRcvLen = tCmdIn.nRcvLen; + pTransCmd->pRcvData = _gRcvData; + + pTransCmd->pFwMode= _gFwMode; + pTransCmd->nTimeOut = tCmdIn.nTimeOut; + + return pTransCmd; +} + + +static void _TransCmdToUser( DrvCmd_t *pTransCmd, unsigned long nArg ) +{ + DrvCmd_t tCmdOut; + long nRet; + + nRet = copy_from_user( &tCmdOut, (void*)nArg, sizeof( DrvCmd_t ) ); + nRet = copy_to_user( tCmdOut.pRcvData, pTransCmd->pRcvData, tCmdOut.nRcvLen); + nRet = copy_to_user( tCmdOut.pFwMode, pTransCmd->pFwMode, sizeof(u16)); +} + + +long HotKnotIoctl( struct file *pFile, unsigned int nCmd, unsigned long nArg ) +{ + long nRet = 0; + + switch ( nCmd ) + { + case HOTKNOT_IOCTL_RUN_CMD: + { + DrvCmd_t *pTransCmd; + + DBG("*** %s() ***\n", __func__); + + pTransCmd = _TransCmdFromUser( nArg ); + + if(pTransCmd->nCmdId == HOTKNOT_CMD || + (pTransCmd->nCmdId == HOTKNOT_SEND && pTransCmd->pSndData[1] == SEND_DATA)) + { + _DrvHandleHotKnotCmd(pTransCmd, nArg); + _TransCmdToUser(_gDrvCmdStack, _gArgStack); + _gDrvCmdStack = NULL; + _gArgStack = 0; + } + else if(pTransCmd->nCmdId == HOTKNOT_AUTH || + (pTransCmd->nCmdId == HOTKNOT_SEND && pTransCmd->pSndData[1] == AUTH_WRITECIPHER)) + { + _DrvHandleHotKnotAuth(pTransCmd); + _TransCmdToUser(pTransCmd, nArg); + } + else if(pTransCmd->nCmdId == HOTKNOT_RECEIVE && pTransCmd->pSndData[1] == RECEIVE_DATA) + { + _DrvHandleHotKnotRcv(pTransCmd); + _TransCmdToUser(pTransCmd, nArg); + } + else if(pTransCmd->nCmdId == HOTKNOT_RECEIVE && pTransCmd->pSndData[1] == GET_QUEUE) + { + _DrvHandleHotKnotGetQueue(pTransCmd); + _TransCmdToUser(pTransCmd, nArg); + } + else if(pTransCmd->nCmdId == HOTKNOT_SEND && pTransCmd->pSndData[1] == SEND_DATA_TEST) + { + _DrvHandleHotKnotSndTest(pTransCmd); + } + } + break; + + case HOTKNOT_IOCTL_QUERY_VENDOR: + { + char szVendorName[30] = "msg28xx"; + + DBG("*** Query vendor name! ***\n"); + //_DebugShowArray(szVendorName,30); + if(copy_to_user((void*)nArg, szVendorName, 30)) + { + DBG("*** Query vendor name failed! ***\n"); + } + } + break; + + default: + nRet = -EINVAL; + break; + } + + return nRet; +} + + +void CreateHotKnotMem() +{ + DBG("*** %s() ***\n", __func__); + + _gCmdIn = (DrvCmd_t*)kmalloc( sizeof( DrvCmd_t ), GFP_KERNEL ); + _gSndData = (u8*)kmalloc(DEBUG_HOTKNOT_SEND_RET_LEN, GFP_KERNEL ); + _gRcvData = (u8*)kmalloc(DEBUG_HOTKNOT_RECEIVE_RET_LEN, GFP_KERNEL ); + _gFwMode= (u16*)kmalloc(sizeof(u16), GFP_KERNEL ); +} + + +void DeleteHotKnotMem() +{ + DBG("*** %s() ***\n", __func__); + + kfree(_gCmdIn); + kfree(_gSndData); + kfree(_gRcvData); + kfree(_gFwMode); +} + +#endif //CONFIG_ENABLE_HOTKNOT) diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_hotknot.h b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot.h new file mode 100644 index 00000000..1c6da72f --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot.h @@ -0,0 +1,332 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_hotknot.h + * + * @brief This file defines the hotknot functions + * + * + */ + +#ifndef __MSTAR_DRV_HOTKNOT_H__ +#define __MSTAR_DRV_HOTKNOT_H__ + + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include "mstar_drv_common.h" +#include "mstar_drv_hotknot_queue.h" + + +#ifdef CONFIG_ENABLE_HOTKNOT +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// +//typedef int bool; + +//#define false 0 +//#define true !false + + +//////////////////////////////////////////////////////////// +/// Function Prototype +//////////////////////////////////////////////////////////// +extern void CreateHotKnotMem(void); +extern void DeleteHotKnotMem(void); + + +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// +typedef struct +{ + u8 nCmdId; + u8 *pSndData; //send data to fw + u16 nSndLen; + u8 *pRcvData; //receive data from fw + u16 nRcvLen; + u16 *pFwMode; + s32 nTimeOut; +} DrvCmd_t; + + +//hotknot cmd +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u8 szReserved[2]; +} HotKnotCmd_t; + +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u8 nResult; + u8 szReserved[38]; + u8 nIdentify; + u8 nCheckSum; +} DemoHotKnotCmdRet_t; + +typedef struct +{ + u8 nHeader; + u8 nPacketLen_H; + u8 nPacketLen_L; + u8 nType; + u8 nInstruction; + u8 nResult; + //u8 szReserved[40]; //unknown size + //u8 nCheckSum; +} DebugHotKnotCmdRet_t; + + +//hotknot auth +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u8 szReserved[2]; +} HotKnotAuth_t; + + +//hotknot writecipher +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u16 nSMBusAdr; + u8 szData[16]; + u8 nCheckSum; +} HotKnotWriteCipher_t; +//return 0 if success, return 1 if fail + + +//hotknot send +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u16 nSMBusAdr; + u8 szData[129]; + u8 nDataLen_H; + u8 nDataLen_L; + u8 nCheckSum; +} HotKnotSnd_t; + +typedef struct +{ + u8 nHeader; + u8 nPacketLen_H; + u8 nPacketLen_L; + u8 nType; + u8 nInstruction; + u8 nResult; + u8 szReserved[143]; + u8 nCheckSum; +} DemoHotKnotSndRet_t; + +typedef struct +{ + u8 nHeader; + u8 nPacketLen_H; + u8 nPacketLen_L; + u8 nType; + u8 nInstruction; + u8 nResult; + u8 szReserved[143]; + u8 szDebug[100]; + u8 nCheckSum; +} DebugHotKnotSndRet_t; + + +//hotknot receive +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u8 nRequireDataLen_H; + u8 nRequireDataLen_L; +} HotKnotRcv_t; + +typedef struct +{ + u8 nHeader; + u8 nActualHotKnotLen_H; + u8 nActualHotKnotLen_L; + u8 szData[146]; + u8 nCheckSum; +} DemoHotKnotLibRcvRet_t; + +typedef struct +{ + u8 nHeader; + u8 nPacketLen_H; + u8 nPacketLen_L; + u8 nType; + u8 szData[143]; + u8 nActualDataLen_H; + u8 nActualDataLen_L; + u8 nCheckSum; +} DemoHotKnotRcvRet_t; + +typedef struct +{ + u8 nHeader; + u8 nPacketLen_H; + u8 nPacketLen_L; + u8 nType; + u8 szData[143]; + u8 nActualDataLen_H; + u8 nActualDataLen_L; + u8 szDebug[100]; + u8 nCheckSum; +} DebugHotKnotRcvRet_t; + + +//hotknot get queue data +typedef struct +{ + u8 nHeader; + u8 nInstruction; + u8 nRequireDataLen_H; + u8 nRequireDataLen_L; +} HotKnotGetQ_t; + +typedef struct +{ + u8 nHeader; + u16 nFront; + u16 nRear; + u8 szData[HOTKNOT_QUEUE_SIZE]; + u8 nCheckSum; +} DemoHotKnotGetQRet_t; + + +//////////////////////////////////////////////////////////// +/// Variables +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// +#define HOTKNOT_IOCTL_BASE 99 +#define HOTKNOT_IOCTL_RUN_CMD _IOWR(HOTKNOT_IOCTL_BASE, 0, long) +#define HOTKNOT_IOCTL_QUERY_VENDOR _IOR('G', 28, char[30]) + + +#define HOTKNOT_CMD 0x60 +#define HOTKNOT_AUTH 0x61 +#define HOTKNOT_SEND 0x62 +#define HOTKNOT_RECEIVE 0x63 + + +//HotKnot CMD +#define ENABLE_HOTKNOT 0xA0 +#define DISABLE_HOTKNOT 0xA1 +#define ENTER_MASTER_MODE 0xA2 +#define EXIT_MASTER_MODE 0xA3 +#define ENTER_SLAVE_MODE 0xA4 +#define EXIT_SLAVE_MODE 0xA5 +#define READ_PAIR_STATE 0xA6 +#define EXIT_READ_PAIR_STATE 0xA7 +#define ENTER_TRANSFER_MODE 0xA8 +#define EXIT_TRANSFER_MODE 0xA9 +#define READ_DEPART_STATE 0xAA + +//HotKnot AUTH +#define AUTH_INIT 0xB0 +#define AUTH_GETKEYINDEX 0xB1 +#define AUTH_READSCRAMBLECIPHER 0xB2 + +//Hotknot QueryVersion +#define QUERY_VERSION 0xB3 + +//HotKnot Send +#define AUTH_WRITECIPHER 0xC0 +#define SEND_DATA 0xC1 +#define ADAPTIVEMOD_BEGIN 0xC3 //notice fw to begin adaptive modulation + +//HotKnot Receive +#define RECEIVE_DATA 0xD0 + +//HotKnot Send Test +#define SEND_DATA_TEST 0xC2 + +//HotKnot Get Queue +#define GET_QUEUE 0xD1 //decide the size to get queue data + +// +#define DEMO_PD_PACKET_ID 0x5A //only for PD state in demo mode +#define DEMO_PD_PACKET_IDENTIFY 0xC0 //only for PD state in demo mode +#define HOTKNOT_PACKET_ID 0xA7 +#define HOTKNOT_PACKET_TYPE 0x41 //for command and send packet +#define HOTKNOT_RECEIVE_PACKET_TYPE 0x40 + +//send length +#define HOTKNOT_CMD_LEN 4 +#define HOTKNOT_AUTH_LEN 4 +#define HOTKNOT_WRITECIPHER_LEN 21 +#define HOTKNOT_SEND_LEN 136 +#define HOTKNOT_RECEIVE_LEN 4 //TBD +#define HOTKNOT_MAX_DATA_LEN 128 +#define HOTKNOT_GETQUEUE_LEN 4 + +//receive length +#define KEYINDEX_LEN 4 +#define QUERYVERSION_LEN 4 +#define CIPHER_LEN 16 +#define DEMO_PD_PACKET_RET_LEN 43 +#define MAX_PD_PACKET_RET_LEN 100 //TBD +#define DEMO_HOTKNOT_SEND_RET_LEN 150 +#define DEMO_HOTKNOT_RECEIVE_RET_LEN 150 +#define DEBUG_HOTKNOT_SEND_RET_LEN 250 +#define DEBUG_HOTKNOT_RECEIVE_RET_LEN 250 + +//result +#define RESULT_OK 0 +#define RESULT_FAIL 1 +#define RESULT_TIMEOUT 2 + +//hotknot mode +#define HOTKNOT_BEFORE_TRANS_STATE 0x91 //read_pair_state success, fw send 43 bytes to driver +#define HOTKNOT_TRANS_STATE 0x92 //enter_transfer_mode success, fw send 150 bytes to driver +#define HOTKNOT_AFTER_TRANS_STATE 0x93 //exit_transfer_mode, fw send 43 bytes to driver +#define HOTKNOT_NOT_TRANS_STATE 0x94 //enter_slave_mode success, fw send 43 bytes to driver + + + +//////////////////////////////////////////////////////////// +/// COMPILE OPTION DEFINITION +//////////////////////////////////////////////////////////// +//#define CONFIG_ENABLE_HOTKNOT_RCV_BLOCKING + + + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// +extern void ReportHotKnotCmd(u8 *pPacket, u16 nLength); +extern long HotKnotIoctl( struct file *pFile, unsigned int nCmd, unsigned long nArg ); + + +#endif //CONFIG_ENABLE_HOTKNOT +#endif // __MSTAR_DRV_HOTKNOT_H__ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.c b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.c new file mode 100644 index 00000000..9dc386de --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.c @@ -0,0 +1,281 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_hotknot_queue.c + * + * @brief This file defines the queue structure for hotknot + * + * + */ + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include "mstar_drv_hotknot_queue.h" + + +#ifdef CONFIG_ENABLE_HOTKNOT +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////// +/// LOCAL VARIABLE DEFINITION +//////////////////////////////////////////////////////////// +static u8 * _gQueue; +static u16 _gQFront=0; +static u16 _gQRear; +static u16 _gQSize = HOTKNOT_QUEUE_SIZE; + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// +#define RESULT_OK 0 +#define RESULT_OVERPUSH -1 +#define RESULT_OVERPOP -2 + + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Implementation +//////////////////////////////////////////////////////////// + +void _DebugShowQueueArray(u8 *pBuf, u16 nLen) +{ + int i; + + for(i=0; i < nLen; i++) + { + DBG("%02X ", pBuf[i]); + + if(i%16==15){ + DBG("\n"); + } + } + DBG("\n"); +} + + +void CreateQueue() +{ + DBG("*** %s() ***\n", __func__); + + _gQueue = (u8*)kmalloc(sizeof(u8)*_gQSize, GFP_KERNEL ); + _gQFront = _gQRear = 0; +} + + +void ClearQueue() +{ + DBG("*** %s() ***\n", __func__); + + _gQFront = _gQRear = 0; +} + + +int PushQueue(u8 * pBuf, u16 nLength) +{ + u16 nPushLen = nLength; + + DBG("*** %s() ***\n", __func__); + + //DBG("*** Show data to PushQueue() ***\n", __func__); + //_DebugShowQueueArray(pBuf, nLength); + //DBG("*** Show Queue data before PushQueue() ***\n", __func__); + //_DebugShowQueueArray(_gQueue, _gQSize); + + DBG("*** Before PushQueue: _gQFront = %d, _gQRear = %d ***\n", _gQFront, _gQRear); + + if(_gQRear >= _gQFront) + { + if(nPushLen > 0 && _gQFront == 0 && _gQRear == _gQSize-1) //full + { + DBG("*** PushQueue: RESULT_OVERPUSH ***\n"); + return RESULT_OVERPUSH; + } + + if(nPushLen > _gQSize-1 - (_gQRear - _gQFront)) //over push + { + DBG("*** PushQueue: RESULT_OVERPUSH ***\n"); + return RESULT_OVERPUSH; + } + + if(_gQRear+nPushLen <= _gQSize-1) + { + memcpy(&_gQueue[_gQRear+1], pBuf, nPushLen); + _gQRear = _gQRear + nPushLen; + } + else + { + u16 nQTmp = (_gQSize-1) -_gQRear; + memcpy(&_gQueue[_gQRear+1], pBuf, nQTmp); //push data from rear to end + memcpy(_gQueue, &pBuf[nQTmp], nPushLen - nQTmp); //push data lest + _gQRear = nPushLen - nQTmp - 1; + } + } + else //_gQRear < _gQFront + { + if(nPushLen > 0 && _gQFront == _gQRear+1) //full + { + DBG("*** PushQueue: RESULT_OVERPUSH ***\n"); + return RESULT_OVERPUSH; + } + + if(nPushLen > (_gQFront - _gQRear) - 1) //over push + { + DBG("*** PushQueue: RESULT_OVERPUSH ***\n"); + return RESULT_OVERPUSH; + } + + memcpy(&_gQueue[_gQRear+1], pBuf, nPushLen); + _gQRear = _gQRear + nPushLen; + } + + //DBG("*** Show Queue data after PushQueue() ***\n", __func__); + //_DebugShowQueueArray(_gQueue, _gQSize); + + DBG("*** After PushQueue: _gQFront = %d, _gQRear = %d ***\n", _gQFront, _gQRear); + return nPushLen; +} + + +int PopQueue(u8 * pBuf, u16 nLength) +{ + u16 nPopLen = nLength; + + DBG("*** %s() ***\n", __func__); + + DBG("*** Before PopQueue: _gQFront = %d, _gQRear = %d ***\n", _gQFront, _gQRear); + + if(_gQRear >= _gQFront) + { + if(nPopLen > 0 && _gQRear == _gQFront) //empty + { + DBG("*** PushQueue: RESULT_OVERPOP ***\n"); + return RESULT_OVERPOP; + } + + if(nPopLen > _gQRear - _gQFront) //over pop + { + DBG("*** PushQueue: RESULT_OVERPOP ***\n"); + return RESULT_OVERPOP; + } + + memcpy(pBuf, &_gQueue[_gQFront+1], nPopLen); + _gQFront = _gQFront + nPopLen; + } + else //_gQRear < _gQFront + { + if(nPopLen > _gQSize - (_gQFront - _gQRear)) //over pop + { + DBG("*** PushQueue: RESULT_OVERPOP ***\n"); + return RESULT_OVERPOP; + } + + if(_gQFront + nPopLen <= _gQSize-1) + { + memcpy(pBuf, &_gQueue[_gQFront+1], nPopLen); + _gQFront = _gQFront + nPopLen; + } + else + { + u16 nQTmp = (_gQSize-1) -_gQFront; + memcpy(pBuf, &_gQueue[_gQFront+1], nQTmp); //pop data from rear to end + memcpy(&pBuf[nQTmp], _gQueue, nPopLen - nQTmp); //pop data lest + _gQFront = nPopLen - nQTmp - 1; + } + } + + DBG("*** After PopQueue: _gQFront = %d, _gQRear = %d ***\n", _gQFront, _gQRear); + return nPopLen; +} + + +int ShowQueue(u8 * pBuf, u16 nLength) //just show data, not fetch data +{ + u16 nShowLen = nLength; + + DBG("*** %s() ***\n", __func__); + + if(_gQRear >= _gQFront) + { + if(nShowLen > 0 && _gQRear == _gQFront) //empty + { + return RESULT_OVERPOP; + } + + if(nShowLen > _gQRear - _gQFront) //over pop + { + return RESULT_OVERPOP; + } + + memcpy(pBuf, &_gQueue[_gQFront+1], nShowLen); + //_gQFront = _gQFront + nPopLen; + } + else //_gQRear < _gQFront + { + if(nShowLen > _gQSize - (_gQFront - _gQRear)) //over pop + { + return RESULT_OVERPOP; + } + + if(_gQFront + nShowLen <= _gQSize-1) + { + memcpy(pBuf, &_gQueue[_gQFront+1], nShowLen); + //_gQFront = _gQFront + nPopLen; + } + else + { + u16 nQTmp = (_gQSize-1) -_gQFront; + memcpy(pBuf, &_gQueue[_gQFront+1], nQTmp); //pop data from rear to end + memcpy(&pBuf[nQTmp], _gQueue, nShowLen - nQTmp); //pop data lest + //_gQFront = nPopLen - nQTmp - 1; + } + } + + return nShowLen; +} + + +void ShowAllQueue(u8 * pBuf, u16 * pFront, u16 * pRear) //just show data, not fetch data +{ + DBG("*** %s() ***\n", __func__); + + memcpy(pBuf, _gQueue, HOTKNOT_QUEUE_SIZE); //pop data from rear to end + *pFront = _gQFront; + *pRear = _gQRear; +} + + +void DeleteQueue() +{ + DBG("*** %s() ***\n", __func__); + + _gQFront = _gQRear = 0; + kfree(_gQueue); +} + +#endif //CONFIG_ENABLE_HOTKNOT diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.h b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.h new file mode 100644 index 00000000..edc4f8a4 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_hotknot_queue.h @@ -0,0 +1,63 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_hotknot_queue.h + * + * @brief This file defines the queue structure for hotknot + * + * + */ + +#ifndef __MSTAR_DRV_HOTKNOT_QUEUE_H__ +#define __MSTAR_DRV_HOTKNOT_QUEUE_H__ + + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// + +#include "mstar_drv_common.h" + + +#ifdef CONFIG_ENABLE_HOTKNOT +//////////////////////////////////////////////////////////// +/// Constant +//////////////////////////////////////////////////////////// +#define HOTKNOT_QUEUE_SIZE 1024 + + +//////////////////////////////////////////////////////////// +/// Variables +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Prototype +//////////////////////////////////////////////////////////// +extern void CreateQueue(void); +extern void ClearQueue(void); +extern int PushQueue(u8 * pBuf, u16 nLength); +extern int PopQueue(u8 * pBuf, u16 nLength); +extern int ShowQueue(u8 * pBuf, u16 nLength); //just show data, not fetch data +extern void ShowAllQueue(u8 * pBuf, u16 * pFront, u16 * pRear); //just show data, not fetch data +extern void DeleteQueue(void); + + +#endif //CONFIG_ENABLE_HOTKNOT +#endif // __MSTAR_DRV_HOTKNOT_QUEUE_H__ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.c b/drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.c new file mode 100644 index 00000000..9a5e4af9 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.c @@ -0,0 +1,313 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_ic_fw_porting_layer.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_ic_fw_porting_layer.h" + + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern u32 g_GestureWakeupMode[2]; +extern u8 g_GestureWakeupFlag; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +void DrvIcFwLyrVariableInitialize(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlVariableInitialize(); +} + +void DrvIcFwLyrOptimizeCurrentConsumption(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlOptimizeCurrentConsumption(); +} + +u8 DrvIcFwLyrGetChipType(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlGetChipType(); +} + +void DrvIcFwLyrGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlGetCustomerFirmwareVersion(pMajor, pMinor, ppVersion); +} + +void DrvIcFwLyrGetPlatformFirmwareVersion(u8 **ppVersion) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlGetPlatformFirmwareVersion(ppVersion); +} + +s32 DrvIcFwLyrUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlUpdateFirmware(szFwData, eEmemType); +} + +s32 DrvIcFwLyrUpdateFirmwareBySdCard(const char *pFilePath) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlUpdateFirmwareBySdCard(pFilePath); +} + +u32 DrvIcFwLyrIsRegisterFingerTouchInterruptHandler(void) +{ + DBG("*** %s() ***\n", __func__); + + return 1; // Indicate that it is necessary to register interrupt handler with GPIO INT pin when firmware is running on IC +} + +void DrvIcFwLyrHandleFingerTouch(u8 *pPacket, u16 nLength) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlHandleFingerTouch(); +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +void DrvIcFwLyrOpenGestureWakeup(u32 *pWakeupMode) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlOpenGestureWakeup(pWakeupMode); +} + +void DrvIcFwLyrCloseGestureWakeup(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlCloseGestureWakeup(); +} + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +void DrvIcFwLyrOpenGestureDebugMode(u8 nGestureFlag) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlOpenGestureDebugMode(nGestureFlag); +} + +void DrvIcFwLyrCloseGestureDebugMode(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlCloseGestureDebugMode(); +} +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +u32 DrvIcFwLyrReadDQMemValue(u16 nAddr) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlReadDQMemValue(nAddr); +} + +void DrvIcFwLyrWriteDQMemValue(u16 nAddr, u32 nData) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlWriteDQMemValue(nAddr, nData); +} + +//------------------------------------------------------------------------------// + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) // use for MSG26XXM only +u16 DrvIcFwLyrGetFirmwareMode(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlGetFirmwareMode(); +} +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + +u16 DrvIcFwLyrChangeFirmwareMode(u16 nMode) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlChangeFirmwareMode(nMode); +} + +void DrvIcFwLyrGetFirmwareInfo(FirmwareInfo_t *pInfo) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlGetFirmwareInfo(pInfo); +} + +void DrvIcFwLyrRestoreFirmwareModeToLogDataMode(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlRestoreFirmwareModeToLogDataMode(); +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +void DrvIcFwLyrCheckFirmwareUpdateBySwId(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvFwCtrlCheckFirmwareUpdateBySwId(); +} +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +void DrvIcFwLyrCreateMpTestWorkQueue(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvMpTestCreateMpTestWorkQueue(); +} + +void DrvIcFwLyrScheduleMpTestWork(ItoTestMode_e eItoTestMode) +{ +// DBG("*** %s() ***\n", __func__); + + DrvMpTestScheduleMpTestWork(eItoTestMode); +} + +s32 DrvIcFwLyrGetMpTestResult(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestResult(); +} + +void DrvIcFwLyrGetMpTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestFailChannel(eItoTestMode, pFailChannel, pFailChannelCount); +} + +void DrvIcFwLyrGetMpTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestDataLog(eItoTestMode, pDataLog, pLength); +} + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +void DrvIcFwLyrGetMpTestScope(TestScopeInfo_t *pInfo) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvMpTestGetTestScope(pInfo); +} +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + +#endif //CONFIG_ENABLE_ITO_MP_TEST + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +void DrvIcFwLyrGetTouchPacketAddress(u16 *pDataAddress, u16 *pFlagAddress) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlGetTouchPacketAddress(pDataAddress, pFlagAddress); +} +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + +s32 DrvIcFwLyrEnableProximity(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlEnableProximity(); +} + +s32 DrvIcFwLyrDisableProximity(void) +{ +// DBG("*** %s() ***\n", __func__); + + return DrvFwCtrlDisableProximity(); +} + +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GLOVE_MODE +void DrvIcFwLyrOpenGloveMode(void) +{ +// DBG("*** %s() ***\n", __func__); + + DrvIcFwCtrlOpenGloveMode(); +} + +void DrvIcFwLyrCloseGloveMode(void) +{ +// DBG("*** %s() ***\n", __func__); + DrvIcFwCtrlCloseGloveMode(); +} + +void DrvIcFwLyrGetGloveInfo(u8 *pGloveMode) +{ +// DBG("*** %s() ***\n", __func__); + + DrvIcFwCtrlGetGloveInfo(pGloveMode); +} +#endif //CONFIG_ENABLE_GLOVE_MODE +//------------------------------------------------------------------------------// + + diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.h b/drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.h new file mode 100644 index 00000000..75508ad1 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_ic_fw_porting_layer.h @@ -0,0 +1,119 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_ic_fw_porting_layer.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ +#define __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +#include "mstar_drv_mutual_fw_control.h" +#ifdef CONFIG_ENABLE_ITO_MP_TEST +#include "mstar_drv_mutual_mp_test.h" +#endif //CONFIG_ENABLE_ITO_MP_TEST +#elif defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) +#include "mstar_drv_self_fw_control.h" +#ifdef CONFIG_ENABLE_ITO_MP_TEST +#include "mstar_drv_self_mp_test.h" +#endif //CONFIG_ENABLE_ITO_MP_TEST +#endif + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern void DrvIcFwLyrOpenGestureWakeup(u32 *pWakeupMode); +extern void DrvIcFwLyrCloseGestureWakeup(void); + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern void DrvIcFwLyrOpenGestureDebugMode(u8 nGestureFlag); +extern void DrvIcFwLyrCloseGestureDebugMode(void); +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +extern u32 DrvIcFwLyrReadDQMemValue(u16 nAddr); +extern void DrvIcFwLyrWriteDQMemValue(u16 nAddr, u32 nData); + +extern u16 DrvIcFwLyrChangeFirmwareMode(u16 nMode); +extern void DrvIcFwLyrGetFirmwareInfo(FirmwareInfo_t *pInfo); +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) // use for MSG26XXM only +extern u16 DrvIcFwLyrGetFirmwareMode(void); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +extern void DrvIcFwLyrRestoreFirmwareModeToLogDataMode(void); + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +extern void DrvIcFwLyrCheckFirmwareUpdateBySwId(void); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +extern void DrvIcFwLyrVariableInitialize(void); +extern void DrvIcFwLyrOptimizeCurrentConsumption(void); +extern u8 DrvIcFwLyrGetChipType(void); +extern void DrvIcFwLyrGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion); +extern void DrvIcFwLyrGetPlatformFirmwareVersion(u8 **ppVersion); +extern void DrvIcFwLyrHandleFingerTouch(u8 *pPacket, u16 nLength); +extern u32 DrvIcFwLyrIsRegisterFingerTouchInterruptHandler(void); +extern s32 DrvIcFwLyrUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType); +extern s32 DrvIcFwLyrUpdateFirmwareBySdCard(const char *pFilePath); + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +extern void DrvIcFwLyrCreateMpTestWorkQueue(void); +extern void DrvIcFwLyrScheduleMpTestWork(ItoTestMode_e eItoTestMode); +extern void DrvIcFwLyrGetMpTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength); +extern void DrvIcFwLyrGetMpTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount); +extern s32 DrvIcFwLyrGetMpTestResult(void); +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +extern void DrvIcFwLyrGetMpTestScope(TestScopeInfo_t *pInfo); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +extern void DrvIcFwLyrGetTouchPacketAddress(u16 *pDataAddress, u16 *pFlagAddress); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +extern s32 DrvIcFwLyrEnableProximity(void); +extern s32 DrvIcFwLyrDisableProximity(void); +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GLOVE_MODE +extern void DrvIcFwLyrOpenGloveMode(void); +extern void DrvIcFwLyrCloseGloveMode(void); +extern void DrvIcFwLyrGetGloveInfo(u8 *pGloveMode); +#endif //CONFIG_ENABLE_GLOVE_MODE + +#endif /* __MSTAR_DRV_IC_FW_PORTING_LAYER_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.c b/drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.c new file mode 100644 index 00000000..4a10ed60 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.c @@ -0,0 +1,287 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_jni_interface.c + * + * @brief This file defines the jni interface functions + * + * + */ + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include +#include +#include +#include +#include "mstar_drv_jni_interface.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_platform_porting_layer.h" + + +#ifdef CONFIG_ENABLE_JNI_INTERFACE +//////////////////////////////////////////////////////////// +/// EXTERN VARIABLE DECLARATION +//////////////////////////////////////////////////////////// +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; +extern u8 g_IsHotknotEnabled; +extern u8 g_IsBypassHotknot; +extern u8 g_IsHotknotAlive; + + +//////////////////////////////////////////////////////////// +/// LOCAL VARIABLE DEFINITION +//////////////////////////////////////////////////////////// +static MsgToolDrvCmd_t * _gMsgToolCmdIn; +static u8 * _gSndCmdData; +static u8 * _gRtnCmdData; + + + +void _DebugJniShowArray(u8 *pBuf, u16 nLen) +{ + int i; + + for(i=0; i < nLen; i++) + { + DBG("%02X ", pBuf[i]); + + if(i%16==15){ + DBG("\n"); + } + } + DBG("\n"); +} + + +u64 PtrToU64(u8 * pValue) +{ + uintptr_t nValue = (uintptr_t)pValue; + return (u64)(0xFFFFFFFFFFFFFFFF&nValue); +} + +u8 * U64ToPtr(u64 nValue) +{ + uintptr_t pValue = (uintptr_t)nValue; + return (u8 *)pValue; +} + + +ssize_t MsgToolRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + long nRet = 0; + u8 nBusType = 0; + u16 nReadLen = 0; + u8 szCmdData[20] = {0}; + + + DBG("*** %s() ***\n", __func__); + //DBG("*** nCount = %d ***\n", (int)nCount); + nBusType = nCount&0xFF; + nReadLen = (nCount >> 8)&0xFFFF; + if(nBusType == SLAVE_I2C_ID_DBBUS || nBusType == SLAVE_I2C_ID_DWI2C) + { + IicReadData(nBusType, &szCmdData[0], nReadLen); + } + + nRet = copy_to_user(pBuffer, &szCmdData[0], nReadLen); + + return nRet; +} + + +ssize_t MsgToolWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + long nRet = 0; + u8 nBusType = 0; + u16 nWriteLen = 0; + u8 szCmdData[20] = {0}; + + + DBG("*** %s() ***\n", __func__); + //DBG("*** nCount = %d ***\n", (int)nCount); + nBusType = nCount&0xFF; + nWriteLen = (nCount >> 8)&0xFFFF; + nRet = copy_from_user(szCmdData, &pBuffer[0], nWriteLen); + if(nBusType == SLAVE_I2C_ID_DBBUS || nBusType == SLAVE_I2C_ID_DWI2C) + { + IicWriteData(nBusType, &szCmdData[0], nWriteLen); + } + + return nRet; +} + + +void _RegGetXByteData(MsgToolDrvCmd_t * pCmd) +{ + u16 nAddr = 0; + + DBG("*** %s() ***\n", __func__); + nAddr = (_gSndCmdData[1]<<8)|_gSndCmdData[0]; + RegGetXBitValue(nAddr, _gRtnCmdData, pCmd->nRtnCmdLen, MAX_I2C_TRANSACTION_LENGTH_LIMIT); + //_DebugJniShowArray(_gRtnCmdData, pCmd->nRtnCmdLen); +} + + +void _ClearMsgToolMem(void) +{ + DBG("*** %s() ***\n", __func__); + + memset(_gMsgToolCmdIn, 0, sizeof( MsgToolDrvCmd_t )); + memset(_gSndCmdData, 0, 1024); + memset(_gRtnCmdData, 0, 1024); +} + + +static MsgToolDrvCmd_t* _TransCmdFromUser( unsigned long nArg ) +{ + long nRet; + MsgToolDrvCmd_t tCmdIn; + MsgToolDrvCmd_t *pTransCmd; + + DBG("*** %s() ***\n", __func__); + _ClearMsgToolMem(); + pTransCmd = (MsgToolDrvCmd_t *)_gMsgToolCmdIn; + nRet = copy_from_user( &tCmdIn, (void*)nArg, sizeof( MsgToolDrvCmd_t ) ); + pTransCmd->nCmdId = tCmdIn.nCmdId; + + //_DebugJniShowArray(&tCmdIn, sizeof( MsgToolDrvCmd_t)); + if(tCmdIn.nSndCmdLen > 0) + { + pTransCmd->nSndCmdLen = tCmdIn.nSndCmdLen; + nRet = copy_from_user( _gSndCmdData, U64ToPtr(tCmdIn.nSndCmdDataPtr), pTransCmd->nSndCmdLen ); + } + + if(tCmdIn.nRtnCmdLen > 0) + { + pTransCmd->nRtnCmdLen = tCmdIn.nRtnCmdLen; + nRet = copy_from_user( _gRtnCmdData, U64ToPtr(tCmdIn.nRtnCmdDataPtr), pTransCmd->nRtnCmdLen ); + } + + return pTransCmd; +} + + +static void _TransCmdToUser( MsgToolDrvCmd_t *pTransCmd, unsigned long nArg ) +{ + MsgToolDrvCmd_t tCmdOut; + long nRet; + + DBG("*** %s() ***\n", __func__); + nRet = copy_from_user( &tCmdOut, (void*)nArg, sizeof( MsgToolDrvCmd_t ) ); + + //_DebugJniShowArray(&tCmdOut, sizeof( MsgToolDrvCmd_t)); + nRet = copy_to_user( U64ToPtr(tCmdOut.nRtnCmdDataPtr), _gRtnCmdData, tCmdOut.nRtnCmdLen); +} + + +long MsgToolIoctl( struct file *pFile, unsigned int nCmd, unsigned long nArg ) +{ + long nRet = 0; + + DBG("*** %s() ***\n", __func__); + switch ( nCmd ) + { + case MSGTOOL_IOCTL_RUN_CMD: + { + MsgToolDrvCmd_t *pTransCmd; + pTransCmd = _TransCmdFromUser( nArg ); + switch (pTransCmd->nCmdId) + { + case MSGTOOL_RESETHW: + DrvPlatformLyrTouchDeviceResetHw(); + break; + case MSGTOOL_REGGETXBYTEVALUE: + _RegGetXByteData(pTransCmd); + _TransCmdToUser(pTransCmd, nArg); + break; + case MSGTOOL_HOTKNOTSTATUS: + _gRtnCmdData[0] = g_IsHotknotEnabled; + _TransCmdToUser(pTransCmd, nArg); + break; + case MSGTOOL_FINGERTOUCH: + if(pTransCmd->nSndCmdLen == 1) + { + DBG("*** JNI enable touch ***\n"); + DrvPlatformLyrEnableFingerTouchReport(); + } + else if(pTransCmd->nSndCmdLen == 0) + { + DBG("*** JNI disable touch ***\n"); + DrvPlatformLyrDisableFingerTouchReport(); + } + break; + case MSGTOOL_BYPASSHOTKNOT: + if(pTransCmd->nSndCmdLen == 1) + { + DBG("*** JNI enable bypass hotknot ***\n"); + g_IsBypassHotknot = 1; + while(g_IsHotknotAlive == 1) + { + //DBG("*** JNI hotknot is alive ***\n"); + mdelay(1); + } + DBG("*** JNI hotknot is paused ***\n"); + } + else if(pTransCmd->nSndCmdLen == 0) + { + DBG("*** JNI disable bypass hotknot ***\n"); + g_IsBypassHotknot = 0; + } + break; + case MSGTOOL_DEVICEPOWEROFF: + DrvPlatformLyrTouchDevicePowerOff(); + break; + default: + break; + } + } + break; + + default: + nRet = -EINVAL; + break; + } + + return nRet; +} + + +void CreateMsgToolMem(void) +{ + DBG("*** %s() ***\n", __func__); + + _gMsgToolCmdIn = (MsgToolDrvCmd_t*)kmalloc( sizeof( MsgToolDrvCmd_t ), GFP_KERNEL ); + _gSndCmdData = (u8*)kmalloc(1024, GFP_KERNEL ); + _gRtnCmdData = (u8*)kmalloc(1024, GFP_KERNEL ); +} + + +void DeleteMsgToolMem(void) +{ + DBG("*** %s() ***\n", __func__); + + kfree(_gMsgToolCmdIn); + kfree(_gSndCmdData); + kfree(_gRtnCmdData); +} + +#endif //CONFIG_ENABLE_JNI_INTERFACE diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.h b/drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.h new file mode 100644 index 00000000..962d1dc7 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_jni_interface.h @@ -0,0 +1,91 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2012 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_hotknot.h + * + * @brief This file defines the hotknot functions + * + * + */ + +#ifndef __MSTAR_DRV_JNI_INTERFACE_H__ +#define __MSTAR_DRV_JNI_INTERFACE_H__ + + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include "mstar_drv_common.h" + + +#ifdef CONFIG_ENABLE_JNI_INTERFACE +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// +/* +typedef struct +{ + u64 nCmdId; + u8 *pSndCmdData; //send data to fw + u64 nSndCmdLen; + u8 *pRtnCmdData; //receive data from fw + u64 nRtnCmdLen; +} MsgToolDrvCmd_t; +*/ + +typedef struct +{ + u64 nCmdId; + u64 nSndCmdDataPtr; //send data to fw + u64 nSndCmdLen; + u64 nRtnCmdDataPtr; //receive data from fw + u64 nRtnCmdLen; +} MsgToolDrvCmd_t; + + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// +#define MSGTOOL_MAGIC_NUMBER 96 +#define MSGTOOL_IOCTL_RUN_CMD _IO(MSGTOOL_MAGIC_NUMBER, 1) + + +#define MSGTOOL_RESETHW 0x01 +#define MSGTOOL_REGGETXBYTEVALUE 0x02 +#define MSGTOOL_HOTKNOTSTATUS 0x03 +#define MSGTOOL_FINGERTOUCH 0x04 +#define MSGTOOL_BYPASSHOTKNOT 0x05 +#define MSGTOOL_DEVICEPOWEROFF 0x06 + + + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + +extern ssize_t MsgToolRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t MsgToolWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern long MsgToolIoctl( struct file *pFile, unsigned int nCmd, unsigned long nArg ); +extern void CreateMsgToolMem(void); +extern void DeleteMsgToolMem(void); + + +#endif //CONFIG_ENABLE_JNI_INTERFACE +#endif // __MSTAR_DRV_JNI_INTERFACE_H__ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_main.c b/drivers/input/touchscreen/msg2233/mstar_drv_main.c new file mode 100644 index 00000000..c67dddd6 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_main.c @@ -0,0 +1,3379 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_main.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_main.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_platform_porting_layer.h" +#include "mstar_drv_ic_fw_porting_layer.h" + +#ifdef CONFIG_ENABLE_HOTKNOT +#include "mstar_drv_hotknot.h" +#include "mstar_drv_hotknot_queue.h" +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_JNI_INTERFACE +#include "mstar_drv_jni_interface.h" +#endif //CONFIG_ENABLE_JNI_INTERFACE + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern FirmwareInfo_t g_FirmwareInfo; +extern u8 g_LogModePacket[DEBUG_MODE_PACKET_LENGTH]; +extern u16 g_FirmwareMode; + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern u32 g_GestureWakeupMode[2]; + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern u8 g_LogGestureDebug[128]; +extern u8 g_GestureDebugFlag; +extern u8 g_GestureDebugMode; + +extern struct input_dev *g_InputDevice; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +extern u32 g_LogGestureInfor[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH]; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +extern u8 g_ChipType; + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +extern TestScopeInfo_t g_TestScopeInfo; +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +#endif //CONFIG_ENABLE_ITO_MP_TEST + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u16 _gDebugReg[MAX_DEBUG_REGISTER_NUM] = {0}; +static u16 _gDebugRegValue[MAX_DEBUG_REGISTER_NUM] = {0}; +static u32 _gDebugRegCount = 0; + +static u8 _gDebugCmdArgu[MAX_DEBUG_COMMAND_ARGUMENT_NUM] = {0}; +static u16 _gDebugCmdArguCount = 0; +static u32 _gDebugReadDataSize = 0; + +static u8 *_gPlatformFwVersion = NULL; // internal use firmware version for MStar + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +static ItoTestMode_e _gItoTestMode = 0; +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +static u32 _gLogGestureCount = 0; +static u8 _gLogGestureInforType = 0; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +static u32 _gIsUpdateComplete = 0; + +u8 *_gFwVersion = NULL; // customer firmware version + +static u32 _gFeatureSupportStatus = 0; + +static struct proc_dir_entry *_gProcClass = NULL; +static struct proc_dir_entry *_gProcMsTouchScreenMsg20xx = NULL; +static struct proc_dir_entry *_gProcDevice = NULL; + +static const struct file_operations _gProcChipType = { + .read = DrvMainProcfsChipTypeRead, + .write = DrvMainProcfsChipTypeWrite, +}; + +static const struct file_operations _gProcFirmwareData = { + .read = DrvMainProcfsFirmwareDataRead, + .write = DrvMainProcfsFirmwareDataWrite, +}; + +static const struct file_operations _gProcApkFirmwareUpdate = { + .read = DrvMainProcfsFirmwareUpdateRead, + .write = DrvMainProcfsFirmwareUpdateWrite, +}; + +static const struct file_operations _gProcCustomerFirmwareVersion = { + .read = DrvMainProcfsCustomerFirmwareVersionRead, + .write = DrvMainProcfsCustomerFirmwareVersionWrite, +}; + +static const struct file_operations _gProcPlatformFirmwareVersion = { + .read = DrvMainProcfsPlatformFirmwareVersionRead, + .write = DrvMainProcfsPlatformFirmwareVersionWrite, +}; + +static const struct file_operations _gProcDeviceDriverVersion = { + .read = DrvMainProcfsDeviceDriverVersionRead, + .write = DrvMainProcfsDeviceDriverVersionWrite, +}; + +static const struct file_operations _gProcSdCardFirmwareUpdate = { + .read = DrvMainProcfsSdCardFirmwareUpdateRead, + .write = DrvMainProcfsSdCardFirmwareUpdateWrite, +}; + +static const struct file_operations _gProcFirmwareDebug = { + .read = DrvMainProcfsFirmwareDebugRead, + .write = DrvMainProcfsFirmwareDebugWrite, +}; + +static const struct file_operations _gProcFirmwareSetDebugValue = { + .read = DrvMainProcfsFirmwareSetDebugValueRead, + .write = DrvMainProcfsFirmwareSetDebugValueWrite, +}; + +static const struct file_operations _gProcFirmwareSmBusDebug = { + .read = DrvMainProcfsFirmwareSmBusDebugRead, + .write = DrvMainProcfsFirmwareSmBusDebugWrite, +}; + +static const struct file_operations _gProcFirmwareSetDQMemValue = { + .read = DrvMainProcfsFirmwareSetDQMemValueRead, + .write = DrvMainProcfsFirmwareSetDQMemValueWrite, +}; + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +static const struct file_operations _gProcMpTest = { + .read = DrvMainProcfsMpTestRead, + .write = DrvMainProcfsMpTestWrite, +}; + +static const struct file_operations _gProcMpTestLog = { + .read = DrvMainProcfsMpTestLogRead, + .write = DrvMainProcfsMpTestLogWrite, +}; + +static const struct file_operations _gProcMpTestFailChannel = { + .read = DrvMainProcfsMpTestFailChannelRead, + .write = DrvMainProcfsMpTestFailChannelWrite, +}; + +static const struct file_operations _gProcMpTestScope = { + .read = DrvMainProcfsMpTestScopeRead, + .write = DrvMainProcfsMpTestScopeWrite, +}; +#endif //CONFIG_ENABLE_ITO_MP_TEST + + +static const struct file_operations _gProcFirmwareMode = { + .read = DrvMainProcfsFirmwareModeRead, + .write = DrvMainProcfsFirmwareModeWrite, +}; + +static const struct file_operations _gProcFirmwareSensor = { + .read = DrvMainProcfsFirmwareSensorRead, + .write = DrvMainProcfsFirmwareSensorWrite, +}; + +static const struct file_operations _gProcFirmwarePacketHeader = { + .read = DrvMainProcfsFirmwarePacketHeaderRead, + .write = DrvMainProcfsFirmwarePacketHeaderWrite, +}; + + +static const struct file_operations _gProcQueryFeatureSupportStatus = { + .read = DrvMainProcfsQueryFeatureSupportStatusRead, + .write = DrvMainProcfsQueryFeatureSupportStatusWrite, +}; + +static const struct file_operations _gProcChangeFeatureSupportStatus = { + .read = DrvMainProcfsChangeFeatureSupportStatusRead, + .write = DrvMainProcfsChangeFeatureSupportStatusWrite, +}; + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +static const struct file_operations _gProcGestureWakeupMode = { + .read = DrvMainProcfsGestureWakeupModeRead, + .write = DrvMainProcfsGestureWakeupModeWrite, +}; +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +static const struct file_operations _gProcGestureDebugMode = { + .read = DrvMainProcfsGestureDebugModeRead, + .write = DrvMainProcfsGestureDebugModeWrite, +}; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +static const struct file_operations _gProcGestureInforMode = { + .read = DrvMainProcfsGestureInforModeRead, + .write = DrvMainProcfsGestureInforModeWrite, +}; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +static const struct file_operations _gProcReportRate = { + .read = DrvMainProcfsReportRateRead, + .write = DrvMainProcfsReportRateWrite, +}; +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +#ifdef CONFIG_ENABLE_GLOVE_MODE +static const struct file_operations _gProcGloveMode= { + .read = DrvMainProcfsGloveModeRead, + .write = DrvMainProcfsGloveModeWrite, +}; + +static const struct file_operations _gProcOpenGloveMode= { + .read = DrvMainProcfsOpenGloveModeRead, +// .write = DrvMainProcfsOpenGloveModeWrite, +}; + +static const struct file_operations _gProcCloseGloveMode= { + .read = DrvMainProcfsCloseGloveModeRead, +// .write = DrvMainProcfsCloseGloveModeWrite, +}; +#endif //CONFIG_ENABLE_GLOVE_MODE + +#ifdef CONFIG_ENABLE_JNI_INTERFACE +static const struct file_operations _gProcJniMethod = { + .read = MsgToolRead, + .write = MsgToolWrite, + .unlocked_ioctl = MsgToolIoctl, + .compat_ioctl = MsgToolIoctl, +}; +#endif //CONFIG_ENABLE_JNI_INTERFACE + + +#ifdef CONFIG_ENABLE_HOTKNOT +struct mutex g_HKMutex; +extern struct mutex g_QMutex; +#endif //CONFIG_ENABLE_HOTKNOT + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +//u32 SLAVE_I2C_ID_DBBUS = (0xC4>>1); //0x62 // for MSG21XX/MSG21XXA/MSG26XXM/MSG28XX +u32 SLAVE_I2C_ID_DBBUS = (0xB2>>1); //0x59 // for MSG22XX +u32 SLAVE_I2C_ID_DWI2C = (0x4C>>1); //0x26 + + +u16 FIRMWARE_MODE_UNKNOWN_MODE = 0xFFFF; +u16 FIRMWARE_MODE_DEMO_MODE = 0xFFFF; +u16 FIRMWARE_MODE_DEBUG_MODE = 0xFFFF; +u16 FIRMWARE_MODE_RAW_DATA_MODE = 0xFFFF; + +struct kset *g_TouchKSet = NULL; +struct kobject *g_TouchKObj = NULL; +u8 g_IsSwitchModeByAPK = 0; + + +u8 IS_GESTURE_WAKEUP_ENABLED = 0; +u8 IS_GESTURE_DEBUG_MODE_ENABLED = 0; +u8 IS_GESTURE_INFORMATION_MODE_ENABLED = 0; +u8 IS_GESTURE_WAKEUP_MODE_SUPPORT_64_TYPES_ENABLED = 0; + +u8 IS_TOUCH_DRIVER_DEBUG_LOG_ENABLED = CONFIG_ENABLE_TOUCH_DRIVER_DEBUG_LOG; +u8 IS_FIRMWARE_DATA_LOG_ENABLED = CONFIG_ENABLE_FIRMWARE_DATA_LOG; + + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +struct kset *g_GestureKSet = NULL; +struct kobject *g_GestureKObj = NULL; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +u16 g_FwPacketDataAddress = 0; +u16 g_FwPacketFlagAddress = 0; +u8 g_FwSupportSegment = 0; +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +u32 g_IsEnableReportRate = 0; +u32 g_InterruptCount = 0; +u32 g_ValidTouchCount = 0; +u32 g_InterruptReportRate = 0; +u32 g_ValidTouchReportRate = 0; + +struct timeval g_StartTime; +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +#ifdef CONFIG_ENABLE_GLOVE_MODE +u8 g_IsEnableGloveMode = 0; +#endif //CONFIG_ENABLE_GLOVE_MODE + +u8 g_FwData[MAX_UPDATE_FIRMWARE_BUFFER_SIZE][1024]; +u32 g_FwDataCount = 0; + +u8 g_IsHotknotEnabled = 0; +u8 g_IsBypassHotknot = 0; +u8 g_IsHotknotAlive = 0; + + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static s32 _DrvMainCreateProcfsDirEntry(void); +#ifdef CONFIG_ENABLE_HOTKNOT +static s32 _DrvMainHotknotRegistry(void); +#endif //CONFIG_ENABLE_HOTKNOT + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +//------------------------------------------------------------------------------// + +ssize_t DrvMainProcfsChipTypeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%d", g_ChipType); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsChipTypeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + +// g_ChipType = DrvIcFwLyrGetChipType(); + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareDataRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + *pPos += g_FwDataCount; + + return g_FwDataCount; +} + +ssize_t DrvMainProcfsFirmwareDataWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nNum = nCount / 1024; + u32 nRemainder = nCount % 1024; + u32 i; + + DBG("*** %s() ***\n", __func__); + + if (nNum > 0) // nCount >= 1024 + { + for (i = 0; i < nNum; i ++) + { + memcpy(g_FwData[g_FwDataCount], pBuffer+(i*1024), 1024); + + g_FwDataCount ++; + } + + if (nRemainder > 0) // Handle special firmware size like MSG22XX(48.5KB) + { + DBG("nRemainder = %d\n", nRemainder); + + memcpy(g_FwData[g_FwDataCount], pBuffer+(i*1024), nRemainder); + + g_FwDataCount ++; + } + } + else // nCount < 1024 + { + if (nCount > 0) + { + memcpy(g_FwData[g_FwDataCount], pBuffer, nCount); + + g_FwDataCount ++; + } + } + + DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount); + + if (pBuffer != NULL) + { + DBG("*** buf[0] = %c ***\n", pBuffer[0]); + } + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareUpdateRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%d", _gIsUpdateComplete); + + DBG("*** _gIsUpdateComplete = %d ***\n", _gIsUpdateComplete); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareUpdateWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DrvPlatformLyrDisableFingerTouchReport(); + + DBG("*** %s() g_FwDataCount = %d ***\n", __func__, g_FwDataCount); + + if (0 != DrvIcFwLyrUpdateFirmware(g_FwData, EMEM_ALL)) + { + _gIsUpdateComplete = 0; + DBG("Update FAILED\n"); + } + else + { + _gIsUpdateComplete = 1; + DBG("Update SUCCESS\n"); + } + + DrvPlatformLyrEnableFingerTouchReport(); + + return nCount; +} + +ssize_t DrvMainProcfsCustomerFirmwareVersionRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + u16 nMajor = 0, nMinor = 0; + + DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion); + + DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%s\n", _gFwVersion); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsCustomerFirmwareVersionWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u16 nMajor = 0, nMinor = 0; + + DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion); + + DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion); + + return nCount; +} + +ssize_t DrvMainProcfsPlatformFirmwareVersionRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%s\n", _gPlatformFwVersion); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsPlatformFirmwareVersionWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DrvIcFwLyrGetPlatformFirmwareVersion(&_gPlatformFwVersion); + + DBG("*** %s() _gPlatformFwVersion = %s ***\n", __func__, _gPlatformFwVersion); + + return nCount; +} + +ssize_t DrvMainProcfsDeviceDriverVersionRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%s", DEVICE_DRIVER_RELEASE_VERSION); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsDeviceDriverVersionWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + + return nCount; +} + +ssize_t DrvMainProcfsSdCardFirmwareUpdateRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u16 nMajor = 0, nMinor = 0; + u32 nLength = 0; + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion); + + DBG("*** %s() _gFwVersion = %s ***\n", __func__, _gFwVersion); + + nLength = sprintf(pBuffer, "%s\n", _gFwVersion); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsSdCardFirmwareUpdateWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + char *pValid = NULL; + char *pTmpFilePath = NULL; + char szFilePath[100] = {0}; + + DBG("*** %s() ***\n", __func__); + DBG("pBuffer = %s\n", pBuffer); + + if (pBuffer != NULL) + { + pValid = strstr(pBuffer, ".bin"); + + if (pValid) + { + pTmpFilePath = strsep((char **)&pBuffer, "."); + + DBG("pTmpFilePath = %s\n", pTmpFilePath); + + strcat(szFilePath, pTmpFilePath); + strcat(szFilePath, ".bin"); + + DBG("szFilePath = %s\n", szFilePath); + + if (0 != DrvFwCtrlUpdateFirmwareBySdCard(szFilePath)) + { + DBG("Update FAILED\n"); + } + else + { + DBG("Update SUCCESS\n"); + } + } + else + { + DBG("The file type of the update firmware bin file is not a .bin file.\n"); + } + } + else + { + DBG("The file path of the update firmware bin file is NULL.\n"); + } + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareDebugRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, nLength = 0; + u8 nBank, nAddr; + u16 szRegData[MAX_DEBUG_REGISTER_NUM] = {0}; + u8 szOut[MAX_DEBUG_REGISTER_NUM*25] = {0}, szValue[10] = {0}; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + for (i = 0; i < _gDebugRegCount; i ++) + { + szRegData[i] = RegGet16BitValue(_gDebugReg[i]); + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + for (i = 0; i < _gDebugRegCount; i ++) + { + nBank = (_gDebugReg[i] >> 8) & 0xFF; + nAddr = _gDebugReg[i] & 0xFF; + + DBG("reg(0x%02X,0x%02X)=0x%04X\n", nBank, nAddr, szRegData[i]); + + strcat(szOut, "reg("); + sprintf(szValue, "0x%02X", nBank); + strcat(szOut, szValue); + strcat(szOut, ","); + sprintf(szValue, "0x%02X", nAddr); + strcat(szOut, szValue); + strcat(szOut, ")="); + sprintf(szValue, "0x%04X", szRegData[i]); + strcat(szOut, szValue); + strcat(szOut, "\n"); + } + + nLength = sprintf(pBuffer, "%s\n", szOut); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareDebugWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i; + char *pCh; + char *pData = NULL; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + DBG("*** pBuffer[0] = %c ***\n", pBuffer[0]); + DBG("*** pBuffer[1] = %c ***\n", pBuffer[1]); + DBG("*** pBuffer[2] = %c ***\n", pBuffer[2]); + DBG("*** pBuffer[3] = %c ***\n", pBuffer[3]); + DBG("*** pBuffer[4] = %c ***\n", pBuffer[4]); + DBG("*** pBuffer[5] = %c ***\n", pBuffer[5]); + + DBG("nCount = %d\n", (int)nCount); + + pData = kmalloc(nCount, GFP_KERNEL); + if (!pData) + { + return -ENOMEM; + } + + if (copy_from_user(pData, pBuffer, nCount)) + { + DBG("copy_from_user() failed\n"); + + kfree(pData); + return -EFAULT; + } + + i = 0; + + while ((pCh = strsep((char **)&pData, " ,")) && (i < MAX_DEBUG_REGISTER_NUM)) + { + DBG("pCh = %s\n", pCh); + + _gDebugReg[i] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + + DBG("_gDebugReg[%d] = 0x%04X\n", i, _gDebugReg[i]); + i ++; + } + _gDebugRegCount = i; + + DBG("_gDebugRegCount = %d\n", _gDebugRegCount); + + kfree(pData); + } + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareSetDebugValueRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, nLength = 0; + u8 nBank, nAddr; + u16 szRegData[MAX_DEBUG_REGISTER_NUM] = {0}; + u8 szOut[MAX_DEBUG_REGISTER_NUM*25] = {0}, szValue[10] = {0}; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + for (i = 0; i < _gDebugRegCount; i ++) + { + szRegData[i] = RegGet16BitValue(_gDebugReg[i]); + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + for (i = 0; i < _gDebugRegCount; i ++) + { + nBank = (_gDebugReg[i] >> 8) & 0xFF; + nAddr = _gDebugReg[i] & 0xFF; + + DBG("reg(0x%02X,0x%02X)=0x%04X\n", nBank, nAddr, szRegData[i]); + + strcat(szOut, "reg("); + sprintf(szValue, "0x%02X", nBank); + strcat(szOut, szValue); + strcat(szOut, ","); + sprintf(szValue, "0x%02X", nAddr); + strcat(szOut, szValue); + strcat(szOut, ")="); + sprintf(szValue, "0x%04X", szRegData[i]); + strcat(szOut, szValue); + strcat(szOut, "\n"); + } + + nLength = sprintf(pBuffer, "%s\n", szOut); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareSetDebugValueWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, j, k; + char *pCh; + char *pData = NULL; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + DBG("*** pBuffer[0] = %c ***\n", pBuffer[0]); + DBG("*** pBuffer[1] = %c ***\n", pBuffer[1]); + + DBG("nCount = %d\n", (int)nCount); + + pData = kmalloc(nCount, GFP_KERNEL); + if (!pData) + { + return -ENOMEM; + } + + if (copy_from_user(pData, pBuffer, nCount)) + { + DBG("copy_from_user() failed\n"); + + kfree(pData); + return -EFAULT; + } + + i = 0; + j = 0; + k = 0; + + while ((pCh = strsep((char **)&pData, " ,")) && (i < 2)) + { + DBG("pCh = %s\n", pCh); + + if ((i%2) == 0) + { + _gDebugReg[j] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("_gDebugReg[%d] = 0x%04X\n", j, _gDebugReg[j]); + j ++; + } + else // (i%2) == 1 + { + _gDebugRegValue[k] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("_gDebugRegValue[%d] = 0x%04X\n", k, _gDebugRegValue[k]); + k ++; + } + + i ++; + } + _gDebugRegCount = j; + + DBG("_gDebugRegCount = %d\n", _gDebugRegCount); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + for (i = 0; i < _gDebugRegCount; i ++) + { + RegSet16BitValue(_gDebugReg[i], _gDebugRegValue[i]); + DBG("_gDebugReg[%d] = 0x%04X, _gDebugRegValue[%d] = 0x%04X\n", i, _gDebugReg[i], i , _gDebugRegValue[i]); // add for debug + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + kfree(pData); + } + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareSmBusDebugRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, nLength = 0; + u8 szSmBusRxData[MAX_I2C_TRANSACTION_LENGTH_LIMIT] = {0}; + u8 szOut[MAX_I2C_TRANSACTION_LENGTH_LIMIT*2] = {0}; + u8 szValue[10] = {0}; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + if (_gDebugCmdArguCount > 0) // Send write command + { + DBG("Execute I2C SMBUS write command\n"); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDebugCmdArgu[0], _gDebugCmdArguCount); + } + + if (_gDebugReadDataSize > 0) // Send read command + { + DBG("Execute I2C SMBUS read command\n"); + + IicReadData(SLAVE_I2C_ID_DWI2C, &szSmBusRxData[0], _gDebugReadDataSize); + } + + for (i = 0; i < _gDebugReadDataSize; i ++) + { + DBG("szSmBusRxData[%d] = 0x%x\n", i, szSmBusRxData[i]); + + sprintf(szValue, "0x%02X", szSmBusRxData[i]); + strcat(szOut, szValue); + strcat(szOut, "\n"); + } + + nLength = sprintf(pBuffer, "%s\n", szOut); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareSmBusDebugWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, j; + char szCmdType[5] = {0}; + char *pCh = NULL; + char *pData = NULL; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + DBG("*** pBuffer[0] = %c ***\n", pBuffer[0]); + DBG("*** pBuffer[1] = %c ***\n", pBuffer[1]); + DBG("*** pBuffer[2] = %c ***\n", pBuffer[2]); + DBG("*** pBuffer[3] = %c ***\n", pBuffer[3]); + DBG("*** pBuffer[4] = %c ***\n", pBuffer[4]); + DBG("*** pBuffer[5] = %c ***\n", pBuffer[5]); + + DBG("nCount = %d\n", (int)nCount); + + pData = kmalloc(nCount, GFP_KERNEL); + if (!pData) + { + return -ENOMEM; + } + + if (copy_from_user(pData, pBuffer, nCount)) + { + DBG("copy_from_user() failed\n"); + + kfree(pData); + return -EFAULT; + } + + // Reset to 0 before parsing the adb command + _gDebugCmdArguCount = 0; + _gDebugReadDataSize = 0; + + i = 0; + j = 0; + + while ((pCh = strsep((char **)&pData, " ,")) && (j < MAX_DEBUG_COMMAND_ARGUMENT_NUM)) + { + DBG("pCh = %s\n", pCh); + + if (strcmp(pCh, "w") == 0 || strcmp(pCh, "r") == 0) + { + memcpy(szCmdType, pCh, strlen(pCh)); + } + else if (strcmp(szCmdType, "w") == 0) + { + _gDebugCmdArgu[j] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("_gDebugCmdArgu[%d] = 0x%02X\n", j, _gDebugCmdArgu[j]); + + j ++; + + _gDebugCmdArguCount = j; + DBG("_gDebugCmdArguCount = %d\n", _gDebugCmdArguCount); + } + else if (strcmp(szCmdType, "r") == 0) + { + sscanf(pCh, "%d", &_gDebugReadDataSize); + DBG("_gDebugReadDataSize = %d\n", _gDebugReadDataSize); + } + else + { + DBG("Un-supported adb command format!\n"); + } + + i ++; + } + + kfree(pData); + } + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareSetDQMemValueRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, nLength = 0; + u8 nBank, nAddr; + u32 szRegData[MAX_DEBUG_REGISTER_NUM] = {0}; + u8 szOut[MAX_DEBUG_REGISTER_NUM*25] = {0}, szValue[10] = {0}; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + for (i = 0; i < _gDebugRegCount; i ++) + { + szRegData[i] = DrvIcFwLyrReadDQMemValue(_gDebugReg[i]); + } + + for (i = 0; i < _gDebugRegCount; i ++) + { + nBank = (_gDebugReg[i] >> 8) & 0xFF; + nAddr = _gDebugReg[i] & 0xFF; + + DBG("reg(0x%02X,0x%02X)=0x%08X\n", nBank, nAddr, szRegData[i]); + + strcat(szOut, "reg("); + sprintf(szValue, "0x%02X", nBank); + strcat(szOut, szValue); + strcat(szOut, ","); + sprintf(szValue, "0x%02X", nAddr); + strcat(szOut, szValue); + strcat(szOut, ")="); + sprintf(szValue, "0x%04X", szRegData[i]); + strcat(szOut, szValue); + strcat(szOut, "\n"); + } + + nLength = sprintf(pBuffer, "%s\n", szOut); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareSetDQMemValueWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i, j, k; + char *pCh; + char *pData = NULL; + u16 nRealDQMemAddr = 0; + u32 nRealDQMemValue = 0; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + DBG("*** pBuffer[0] = %c ***\n", pBuffer[0]); + DBG("*** pBuffer[1] = %c ***\n", pBuffer[1]); + + DBG("nCount = %d\n", (int)nCount); + + pData = kmalloc(nCount, GFP_KERNEL); + if (!pData) + { + return -ENOMEM; + } + + if (copy_from_user(pData, pBuffer, nCount)) + { + DBG("copy_from_user() failed\n"); + + kfree(pData); + return -EFAULT; + } + + i = 0; + j = 0; + k = 0; + + while ((pCh = strsep((char **)&pData, " ,")) && (i < 2)) + { + DBG("pCh = %s\n", pCh); + + if ((i%2) == 0) + { + _gDebugReg[j] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("_gDebugReg[%d] = 0x%04X\n", j, _gDebugReg[j]); + j ++; + } + else // (i%2) == 1 + { + _gDebugRegValue[k] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("_gDebugRegValue[%d] = 0x%04X\n", k, _gDebugRegValue[k]); + k ++; + } + + i ++; + } + _gDebugRegCount = j; + + DBG("_gDebugRegCount = %d\n", _gDebugRegCount); + + if ((_gDebugReg[0] % 4) == 0) + { + nRealDQMemAddr = _gDebugReg[0]; + nRealDQMemValue = DrvIcFwLyrReadDQMemValue(nRealDQMemAddr); + _gDebugReg[0] = nRealDQMemAddr; + DBG("nRealDQMemValue Raw = %X\n", nRealDQMemValue); + nRealDQMemValue &= 0xFFFF0000; + nRealDQMemValue |= _gDebugRegValue[0]; + DBG("nRealDQMemValue Modify = %X\n", nRealDQMemValue); + DrvIcFwLyrWriteDQMemValue(nRealDQMemAddr, nRealDQMemValue); + } + else if ((_gDebugReg[0] % 4) == 2) + { + nRealDQMemAddr = _gDebugReg[0] - 2; + nRealDQMemValue = DrvIcFwLyrReadDQMemValue(nRealDQMemAddr); + _gDebugReg[0] = nRealDQMemAddr; + DBG("nRealDQMemValue Raw = %X\n", nRealDQMemValue); + + nRealDQMemValue &= 0x0000FFFF; + nRealDQMemValue |= (_gDebugRegValue[0] << 16); + DBG("nRealDQMemValue Modify = %X\n", nRealDQMemValue); + DrvIcFwLyrWriteDQMemValue(nRealDQMemAddr, nRealDQMemValue); + } + + kfree(pData); + } + + return nCount; +} + +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +ssize_t DrvMainProcfsMpTestRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DBG("*** ctp mp test status = %d ***\n", DrvIcFwLyrGetMpTestResult()); + + nLength = sprintf(pBuffer, "%d", DrvIcFwLyrGetMpTestResult()); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsMpTestWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nMode = 0; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + sscanf(pBuffer, "%x", &nMode); + + DBG("Mp Test Mode = 0x%x\n", nMode); + + if (nMode == ITO_TEST_MODE_OPEN_TEST) //open test + { + _gItoTestMode = ITO_TEST_MODE_OPEN_TEST; + DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_OPEN_TEST); + } + else if (nMode == ITO_TEST_MODE_SHORT_TEST) //short test + { + _gItoTestMode = ITO_TEST_MODE_SHORT_TEST; + DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_SHORT_TEST); + } + else if (nMode == ITO_TEST_MODE_WATERPROOF_TEST) //waterproof test + { + _gItoTestMode = ITO_TEST_MODE_WATERPROOF_TEST; + DrvIcFwLyrScheduleMpTestWork(ITO_TEST_MODE_WATERPROOF_TEST); + } + else + { + DBG("*** Undefined MP Test Mode ***\n"); + } + } + + return nCount; +} + +ssize_t DrvMainProcfsMpTestLogRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DrvIcFwLyrGetMpTestDataLog(_gItoTestMode, pBuffer, &nLength); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsMpTestLogWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + + return nCount; +} + +ssize_t DrvMainProcfsMpTestFailChannelRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DrvIcFwLyrGetMpTestFailChannel(_gItoTestMode, pBuffer, &nLength); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsMpTestFailChannelWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + + return nCount; +} + +ssize_t DrvMainProcfsMpTestScopeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + DrvIcFwLyrGetMpTestScope(&g_TestScopeInfo); + + nLength = sprintf(pBuffer, "%d,%d", g_TestScopeInfo.nMx, g_TestScopeInfo.nMy); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsMpTestScopeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + + return nCount; +} + +#endif //CONFIG_ENABLE_ITO_MP_TEST + +/*--------------------------------------------------------------------------*/ + +ssize_t DrvMainProcfsFirmwareModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + g_FirmwareMode = DrvIcFwLyrGetFirmwareMode(); + + DBG("%s() firmware mode = 0x%x\n", __func__, g_FirmwareMode); + + nLength = sprintf(pBuffer, "%x", g_FirmwareMode); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); + g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; + + DBG("%s() firmware mode = 0x%x\n", __func__, g_FirmwareInfo.nFirmwareMode); + + nLength = sprintf(pBuffer, "%x", g_FirmwareInfo.nFirmwareMode); + } +#elif defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) + if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG22XX) + { + DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); + g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; + + DBG("%s() firmware mode = 0x%x, can change firmware mode = %d\n", __func__, g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode); + + nLength = sprintf(pBuffer, "%x,%d", g_FirmwareInfo.nFirmwareMode, g_FirmwareInfo.nIsCanChangeFirmwareMode); + } +#endif + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nMode; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + sscanf(pBuffer, "%x", &nMode); + DBG("firmware mode = 0x%x\n", nMode); + + g_IsSwitchModeByAPK = 0; + + if (nMode == FIRMWARE_MODE_DEMO_MODE) //demo mode + { + g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEMO_MODE); + } + else if (nMode == FIRMWARE_MODE_DEBUG_MODE) //debug mode + { + g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE); + g_IsSwitchModeByAPK = 1; + } +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) + else if (nMode == FIRMWARE_MODE_RAW_DATA_MODE) //raw data mode + { + g_FirmwareMode = DrvIcFwLyrChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE); + g_IsSwitchModeByAPK = 1; + } +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC + else + { + DBG("*** Undefined Firmware Mode ***\n"); + } + } + + DBG("*** g_FirmwareMode = 0x%x ***\n", g_FirmwareMode); + + return nCount; +} + +ssize_t DrvMainProcfsFirmwareSensorRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + if (g_FirmwareInfo.nLogModePacketHeader == 0xA5 || g_FirmwareInfo.nLogModePacketHeader == 0xAB) + { + nLength = sprintf(pBuffer, "%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy); + } + else if (g_FirmwareInfo.nLogModePacketHeader == 0xA7) + { + nLength = sprintf(pBuffer, "%d,%d,%d,%d", g_FirmwareInfo.nMx, g_FirmwareInfo.nMy, g_FirmwareInfo.nSs, g_FirmwareInfo.nSd); + } + else + { + DBG("Undefined debug mode packet format : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + nLength = 0; + } +#elif defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) + nLength = sprintf(pBuffer, "%d", g_FirmwareInfo.nLogModePacketLength); +#endif + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwareSensorWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + +// DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); +// if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG22XX || g_ChipType == CHIP_TYPE_MSG28XX) +// { +// g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; +// } + + return nCount; +} + +ssize_t DrvMainProcfsFirmwarePacketHeaderRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%d", g_FirmwareInfo.nLogModePacketHeader); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsFirmwarePacketHeaderWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + +// DrvIcFwLyrGetFirmwareInfo(&g_FirmwareInfo); +// if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG22XX || g_ChipType == CHIP_TYPE_MSG28XX) +// { +// g_FirmwareMode = g_FirmwareInfo.nFirmwareMode; +// } + + return nCount; +} + +ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf) +{ + u32 i = 0; + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + if (strcmp(pAttr->attr.name, "packet") == 0) + { + if (g_LogModePacket != NULL) + { + DBG("g_FirmwareMode=%x, g_LogModePacket[0]=%x, g_LogModePacket[1]=%x\n", g_FirmwareMode, g_LogModePacket[0], g_LogModePacket[1]); + DBG("g_LogModePacket[2]=%x, g_LogModePacket[3]=%x\n", g_LogModePacket[2], g_LogModePacket[3]); + DBG("g_LogModePacket[4]=%x, g_LogModePacket[5]=%x\n", g_LogModePacket[4], g_LogModePacket[5]); + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) && (g_LogModePacket[0] == 0xA5 || g_LogModePacket[0] == 0xAB || g_LogModePacket[0] == 0xA7)) +#elif defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) + if ((g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) && (g_LogModePacket[0] == 0x62)) +#endif + { + for (i = 0; i < g_FirmwareInfo.nLogModePacketLength; i ++) + { + pBuf[i] = g_LogModePacket[i]; + } + + nLength = g_FirmwareInfo.nLogModePacketLength; + DBG("nLength = %d\n", nLength); + } + else + { + DBG("CURRENT MODE IS NOT DEBUG MODE/WRONG DEBUG MODE HEADER\n"); + } + } + else + { + DBG("g_LogModePacket is NULL\n"); + } + } + else + { + DBG("pAttr->attr.name = %s \n", pAttr->attr.name); + } + + return nLength; +} + +ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount) +{ + DBG("*** %s() ***\n", __func__); +/* + if (strcmp(pAttr->attr.name, "packet") == 0) + { + + } +*/ + return nCount; +} + +static struct kobj_attribute packet_attr = __ATTR(packet, 0666, DrvMainKObjectPacketShow, DrvMainKObjectPacketStore); + +/* Create a group of attributes so that we can create and destroy them all at once. */ +static struct attribute *attrs[] = { + &packet_attr.attr, + NULL, /* need to NULL terminate the list of attributes */ +}; + +/* + * An unnamed attribute group will put all of the attributes directly in + * the kobject directory. If we specify a name, a subdirectory will be + * created for the attributes with the directory being the name of the + * attribute group. + */ +struct attribute_group attr_group = { + .attrs = attrs, +}; + + +//------------------------------------------------------------------------------// + +ssize_t DrvMainProcfsQueryFeatureSupportStatusRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%d", _gFeatureSupportStatus); + + DBG("*** _gFeatureSupportStatus = %d ***\n", _gFeatureSupportStatus); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsQueryFeatureSupportStatusWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nFeature; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + sscanf(pBuffer, "%x", &nFeature); + DBG("nFeature = 0x%x\n", nFeature); + + if (nFeature == FEATURE_GESTURE_WAKEUP_MODE) + { + _gFeatureSupportStatus = IS_GESTURE_WAKEUP_ENABLED; + } + else if (nFeature == FEATURE_GESTURE_DEBUG_MODE) + { + _gFeatureSupportStatus = IS_GESTURE_DEBUG_MODE_ENABLED; + } + else if (nFeature == FEATURE_GESTURE_INFORMATION_MODE) + { + _gFeatureSupportStatus = IS_GESTURE_INFORMATION_MODE_ENABLED; + } + else if (nFeature == FEATURE_TOUCH_DRIVER_DEBUG_LOG) + { + _gFeatureSupportStatus = IS_TOUCH_DRIVER_DEBUG_LOG_ENABLED; + } + else if (nFeature == FEATURE_FIRMWARE_DATA_LOG) + { + _gFeatureSupportStatus = IS_FIRMWARE_DATA_LOG_ENABLED; + } + else + { + DBG("*** Undefined Feature ***\n"); + } + } + + DBG("*** _gFeatureSupportStatus = %d ***\n", _gFeatureSupportStatus); + + return nCount; +} + +ssize_t DrvMainProcfsChangeFeatureSupportStatusRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + nLength = sprintf(pBuffer, "%d", _gFeatureSupportStatus); + + DBG("*** _gFeatureSupportStatus = %d ***\n", _gFeatureSupportStatus); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsChangeFeatureSupportStatusWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 i; + u32 nFeature = 0, nNewValue = 0; + char *pCh; + char *pData = NULL; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + DBG("nCount = %d\n", (int)nCount); + + pData = kmalloc(nCount, GFP_KERNEL); + if (!pData) + { + return -ENOMEM; + } + + if (copy_from_user(pData, pBuffer, nCount)) + { + DBG("copy_from_user() failed\n"); + + kfree(pData); + return -EFAULT; + } + + i = 0; + + while ((pCh = strsep((char **)&pData, " ,")) && (i < 3)) + { + DBG("pCh = %s\n", pCh); + + if (i == 0) + { + nFeature = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("nFeature = 0x%04X\n", nFeature); + } + else if (i == 1) + { + nNewValue = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + DBG("nNewValue = %d\n", nNewValue); + } + else + { + DBG("End of parsing adb command.\n"); + } + + i ++; + } + + if (nFeature == FEATURE_GESTURE_WAKEUP_MODE) + { + IS_GESTURE_WAKEUP_ENABLED = nNewValue; + _gFeatureSupportStatus = IS_GESTURE_WAKEUP_ENABLED; + } + else if (nFeature == FEATURE_GESTURE_DEBUG_MODE) + { + IS_GESTURE_DEBUG_MODE_ENABLED = nNewValue; + _gFeatureSupportStatus = IS_GESTURE_DEBUG_MODE_ENABLED; + } + else if (nFeature == FEATURE_GESTURE_INFORMATION_MODE) + { + IS_GESTURE_INFORMATION_MODE_ENABLED = nNewValue; + _gFeatureSupportStatus = IS_GESTURE_INFORMATION_MODE_ENABLED; + } + else if (nFeature == FEATURE_TOUCH_DRIVER_DEBUG_LOG) + { + IS_TOUCH_DRIVER_DEBUG_LOG_ENABLED = nNewValue; + _gFeatureSupportStatus = IS_TOUCH_DRIVER_DEBUG_LOG_ENABLED; + } + else if (nFeature == FEATURE_FIRMWARE_DATA_LOG) + { + IS_FIRMWARE_DATA_LOG_ENABLED = nNewValue; + _gFeatureSupportStatus = IS_FIRMWARE_DATA_LOG_ENABLED; + } + else + { + DBG("*** Undefined Feature ***\n"); + } + + DBG("*** _gFeatureSupportStatus = %d ***\n", _gFeatureSupportStatus); + + kfree(pData); + } + + return nCount; +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +ssize_t DrvMainProcfsGestureWakeupModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + DBG("g_GestureWakeupMode = 0x%x, 0x%x\n", g_GestureWakeupMode[0], g_GestureWakeupMode[1]); + + nLength = sprintf(pBuffer, "%x,%x", g_GestureWakeupMode[0], g_GestureWakeupMode[1]); +#else + DBG("g_GestureWakeupMode = 0x%x\n", g_GestureWakeupMode[0]); + + nLength = sprintf(pBuffer, "%x", g_GestureWakeupMode[0]); +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsGestureWakeupModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength; + u32 nWakeupMode[2] = {0}; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + u32 i; + char *pCh; + + i = 0; + while ((pCh = strsep((char **)&pBuffer, " ,")) && (i < 2)) + { + DBG("pCh = %s\n", pCh); + + nWakeupMode[i] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + + DBG("nWakeupMode[%d] = 0x%04X\n", i, nWakeupMode[i]); + i ++; + } +#else + sscanf(pBuffer, "%x", &nWakeupMode[0]); + DBG("nWakeupMode = 0x%x\n", nWakeupMode[0]); +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + + nLength = nCount; + DBG("nLength = %d\n", nLength); + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG) == GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG) == GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG) == GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE1_FLAG) == GESTURE_WAKEUP_MODE_RESERVE1_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE1_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE1_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE2_FLAG) == GESTURE_WAKEUP_MODE_RESERVE2_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE2_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE2_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE3_FLAG) == GESTURE_WAKEUP_MODE_RESERVE3_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE3_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE3_FLAG); + } + +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE4_FLAG) == GESTURE_WAKEUP_MODE_RESERVE4_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE4_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE4_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE5_FLAG) == GESTURE_WAKEUP_MODE_RESERVE5_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE5_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE5_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE6_FLAG) == GESTURE_WAKEUP_MODE_RESERVE6_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE6_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE6_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE7_FLAG) == GESTURE_WAKEUP_MODE_RESERVE7_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE7_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE7_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE8_FLAG) == GESTURE_WAKEUP_MODE_RESERVE8_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE8_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE8_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE9_FLAG) == GESTURE_WAKEUP_MODE_RESERVE9_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE9_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE9_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE10_FLAG) == GESTURE_WAKEUP_MODE_RESERVE10_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE10_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE10_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE11_FLAG) == GESTURE_WAKEUP_MODE_RESERVE11_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE11_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE11_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE12_FLAG) == GESTURE_WAKEUP_MODE_RESERVE12_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE12_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE12_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE13_FLAG) == GESTURE_WAKEUP_MODE_RESERVE13_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE13_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE13_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE14_FLAG) == GESTURE_WAKEUP_MODE_RESERVE14_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE14_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE14_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE15_FLAG) == GESTURE_WAKEUP_MODE_RESERVE15_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE15_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE15_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE16_FLAG) == GESTURE_WAKEUP_MODE_RESERVE16_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE16_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE16_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE17_FLAG) == GESTURE_WAKEUP_MODE_RESERVE17_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE17_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE17_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE18_FLAG) == GESTURE_WAKEUP_MODE_RESERVE18_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE18_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE18_FLAG); + } + + if ((nWakeupMode[0] & GESTURE_WAKEUP_MODE_RESERVE19_FLAG) == GESTURE_WAKEUP_MODE_RESERVE19_FLAG) + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] | GESTURE_WAKEUP_MODE_RESERVE19_FLAG; + } + else + { + g_GestureWakeupMode[0] = g_GestureWakeupMode[0] & (~GESTURE_WAKEUP_MODE_RESERVE19_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE20_FLAG) == GESTURE_WAKEUP_MODE_RESERVE20_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE20_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE20_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE21_FLAG) == GESTURE_WAKEUP_MODE_RESERVE21_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE21_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE21_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE22_FLAG) == GESTURE_WAKEUP_MODE_RESERVE22_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE22_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE22_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE23_FLAG) == GESTURE_WAKEUP_MODE_RESERVE23_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE23_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE23_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE24_FLAG) == GESTURE_WAKEUP_MODE_RESERVE24_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE24_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE24_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE25_FLAG) == GESTURE_WAKEUP_MODE_RESERVE25_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE25_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE25_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE26_FLAG) == GESTURE_WAKEUP_MODE_RESERVE26_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE26_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE26_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE27_FLAG) == GESTURE_WAKEUP_MODE_RESERVE27_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE27_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE27_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE28_FLAG) == GESTURE_WAKEUP_MODE_RESERVE28_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE28_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE28_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE29_FLAG) == GESTURE_WAKEUP_MODE_RESERVE29_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE29_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE29_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE30_FLAG) == GESTURE_WAKEUP_MODE_RESERVE30_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE30_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE30_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE31_FLAG) == GESTURE_WAKEUP_MODE_RESERVE31_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE31_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE31_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE32_FLAG) == GESTURE_WAKEUP_MODE_RESERVE32_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE32_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE32_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE33_FLAG) == GESTURE_WAKEUP_MODE_RESERVE33_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE33_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE33_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE34_FLAG) == GESTURE_WAKEUP_MODE_RESERVE34_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE34_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE34_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE35_FLAG) == GESTURE_WAKEUP_MODE_RESERVE35_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE35_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE35_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE36_FLAG) == GESTURE_WAKEUP_MODE_RESERVE36_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE36_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE36_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE37_FLAG) == GESTURE_WAKEUP_MODE_RESERVE37_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE37_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE37_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE38_FLAG) == GESTURE_WAKEUP_MODE_RESERVE38_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE38_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE38_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE39_FLAG) == GESTURE_WAKEUP_MODE_RESERVE39_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE39_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE39_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE40_FLAG) == GESTURE_WAKEUP_MODE_RESERVE40_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE40_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE40_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE41_FLAG) == GESTURE_WAKEUP_MODE_RESERVE41_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE41_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE41_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE42_FLAG) == GESTURE_WAKEUP_MODE_RESERVE42_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE42_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE42_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE43_FLAG) == GESTURE_WAKEUP_MODE_RESERVE43_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE43_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE43_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE44_FLAG) == GESTURE_WAKEUP_MODE_RESERVE44_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE44_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE44_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE45_FLAG) == GESTURE_WAKEUP_MODE_RESERVE45_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE45_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE45_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE46_FLAG) == GESTURE_WAKEUP_MODE_RESERVE46_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE46_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE46_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE47_FLAG) == GESTURE_WAKEUP_MODE_RESERVE47_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE47_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE47_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE48_FLAG) == GESTURE_WAKEUP_MODE_RESERVE48_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE48_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE48_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE49_FLAG) == GESTURE_WAKEUP_MODE_RESERVE49_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE49_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE49_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE50_FLAG) == GESTURE_WAKEUP_MODE_RESERVE50_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE50_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE50_FLAG); + } + + if ((nWakeupMode[1] & GESTURE_WAKEUP_MODE_RESERVE51_FLAG) == GESTURE_WAKEUP_MODE_RESERVE51_FLAG) + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] | GESTURE_WAKEUP_MODE_RESERVE51_FLAG; + } + else + { + g_GestureWakeupMode[1] = g_GestureWakeupMode[1] & (~GESTURE_WAKEUP_MODE_RESERVE51_FLAG); + } +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + + DBG("g_GestureWakeupMode = 0x%x, 0x%x\n", g_GestureWakeupMode[0], g_GestureWakeupMode[1]); + } + + return nCount; +} + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + +ssize_t DrvMainProcfsGestureDebugModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + DBG("g_GestureDebugMode = 0x%x\n", g_GestureDebugMode); // add for debug + + nLength = sprintf(pBuffer, "%d", g_GestureDebugMode); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsGestureDebugModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u8 ucGestureMode[2]; + u8 i; + char *pCh; + + if (pBuffer != NULL) + { + i = 0; + while ((pCh = strsep((char **)&pBuffer, " ,")) && (i < 2)) + { + DBG("pCh = %s\n", pCh); + + ucGestureMode[i] = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + + DBG("ucGestureMode[%d] = 0x%04X\n", i, ucGestureMode[i]); + i ++; + } + + g_GestureDebugMode = ucGestureMode[0]; + g_GestureDebugFlag = ucGestureMode[1]; + + DBG("Gesture flag = 0x%x\n", g_GestureDebugFlag); + + if (g_GestureDebugMode == 0x01) //open gesture debug mode + { + DrvIcFwLyrOpenGestureDebugMode(g_GestureDebugFlag); + +// input_report_key(g_InputDevice, RESERVER42, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER42, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + } + else if (g_GestureDebugMode == 0x00) //close gesture debug mode + { + DrvIcFwLyrCloseGestureDebugMode(); + } + else + { + DBG("*** Undefined Gesture Debug Mode ***\n"); + } + } + + return nCount; +} + +ssize_t DrvMainKObjectGestureDebugShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf) +{ + u32 i = 0; + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + if (strcmp(pAttr->attr.name, "gesture_debug") == 0) + { + if (g_LogGestureDebug != NULL) + { + DBG("g_LogGestureDebug[0]=%x, g_LogGestureDebug[1]=%x\n", g_LogGestureDebug[0], g_LogGestureDebug[1]); + DBG("g_LogGestureDebug[2]=%x, g_LogGestureDebug[3]=%x\n", g_LogGestureDebug[2], g_LogGestureDebug[3]); + DBG("g_LogGestureDebug[4]=%x, g_LogGestureDebug[5]=%x\n", g_LogGestureDebug[4], g_LogGestureDebug[5]); + + if (g_LogGestureDebug[0] == 0xA7 && g_LogGestureDebug[3] == 0x51) + { + for (i = 0; i < 0x80; i ++) + { + pBuf[i] = g_LogGestureDebug[i]; + } + + nLength = 0x80; + DBG("nLength = %d\n", nLength); + } + else + { + DBG("CURRENT MODE IS NOT GESTURE DEBUG MODE/WRONG GESTURE DEBUG MODE HEADER\n"); + } + } + else + { + DBG("g_LogGestureDebug is NULL\n"); + } + } + else + { + DBG("pAttr->attr.name = %s \n", pAttr->attr.name); + } + + return nLength; +} + +ssize_t DrvMainKObjectGestureDebugStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount) +{ + DBG("*** %s() ***\n", __func__); +/* + if (strcmp(pAttr->attr.name, "packet") == 0) + { + + } +*/ + return nCount; +} + +static struct kobj_attribute gesture_attr = __ATTR(gesture_debug, 0666, DrvMainKObjectGestureDebugShow, DrvMainKObjectGestureDebugStore); + +/* Create a group of attributes so that we can create and destroy them all at once. */ +static struct attribute *gestureattrs[] = { + &gesture_attr.attr, + NULL, /* need to NULL terminate the list of attributes */ +}; + +/* + * An unnamed attribute group will put all of the attributes directly in + * the kobject directory. If we specify a name, a subdirectory will be + * created for the attributes with the directory being the name of the + * attribute group. + */ +struct attribute_group gestureattr_group = { + .attrs = gestureattrs, +}; + +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +ssize_t DrvMainProcfsGestureInforModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u8 szOut[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH*5] = {0}, szValue[10] = {0}; + u32 szLogGestureInfo[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH] = {0}; + u32 i = 0; + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + _gLogGestureCount = 0; + if (_gLogGestureInforType == FIRMWARE_GESTURE_INFORMATION_MODE_A) //FIRMWARE_GESTURE_INFORMATION_MODE_A + { + for (i = 0; i < 2; i ++)//0 EventFlag; 1 RecordNum + { + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[4 + i]; + _gLogGestureCount ++; + } + + for (i = 2; i < 8; i ++)//2~3 Xst Yst; 4~5 Xend Yend; 6~7 char_width char_height + { + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[4 + i]; + _gLogGestureCount ++; + } + } + else if (_gLogGestureInforType == FIRMWARE_GESTURE_INFORMATION_MODE_B) //FIRMWARE_GESTURE_INFORMATION_MODE_B + { + for (i = 0; i < 2; i ++)//0 EventFlag; 1 RecordNum + { + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[4 + i]; + _gLogGestureCount ++; + } + + for (i = 0; i< g_LogGestureInfor[5]*2 ; i ++)//(X and Y)*RecordNum + { + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[12 + i]; + _gLogGestureCount ++; + } + } + else if (_gLogGestureInforType == FIRMWARE_GESTURE_INFORMATION_MODE_C) //FIRMWARE_GESTURE_INFORMATION_MODE_C + { + for (i = 0; i < 6; i ++)//header + { + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[i]; + _gLogGestureCount ++; + } + + for (i = 6; i < 86; i ++) + { + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[i]; + _gLogGestureCount ++; + } + + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[86];//dummy + _gLogGestureCount ++; + szLogGestureInfo[_gLogGestureCount] = g_LogGestureInfor[87];//checksum + _gLogGestureCount++; + } + else + { + DBG("*** Undefined GESTURE INFORMATION MODE ***\n"); + } + + for (i = 0; i < _gLogGestureCount; i ++) + { + sprintf(szValue, "%d", szLogGestureInfo[i]); + strcat(szOut, szValue); + strcat(szOut, ","); + } + + nLength = sprintf(pBuffer, "%s\n", szOut); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsGestureInforModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nMode; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + sscanf(pBuffer, "%x", &nMode); + _gLogGestureInforType = nMode; + } + + DBG("*** _gLogGestureInforType type = 0x%x ***\n", _gLogGestureInforType); + + return nCount; +} + +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +ssize_t DrvMainProcfsReportRateRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + struct timeval tEndTime; + suseconds_t nStartTime, nEndTime, nElapsedTime; + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + DBG("g_InterruptCount = %d, g_ValidTouchCount = %d\n", g_InterruptCount, g_ValidTouchCount); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + // Get end time + do_gettimeofday(&tEndTime); + + nStartTime = g_StartTime.tv_sec + g_StartTime.tv_usec/1000000; + nEndTime = tEndTime.tv_sec + tEndTime.tv_usec/1000000; + + nElapsedTime = nEndTime - nStartTime; + + DBG("Start time : %lu sec, %lu msec\n", g_StartTime.tv_sec, g_StartTime.tv_usec); + DBG("End time : %lu sec, %lu msec\n", tEndTime.tv_sec, tEndTime.tv_usec); + + DBG("Elapsed time : %lu sec\n", nElapsedTime); + + // Calculate report rate + if (nElapsedTime != 0) + { + g_InterruptReportRate = g_InterruptCount / nElapsedTime; + g_ValidTouchReportRate = g_ValidTouchCount / nElapsedTime; + } + else + { + g_InterruptReportRate = 0; + g_ValidTouchReportRate = 0; + } + + DBG("g_InterruptReportRate = %d, g_ValidTouchReportRate = %d\n", g_InterruptReportRate, g_ValidTouchReportRate); + + g_InterruptCount = 0; // Reset count + g_ValidTouchCount = 0; + + nLength = sprintf(pBuffer, "%d,%d", g_InterruptReportRate, g_ValidTouchReportRate); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsReportRateWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + sscanf(pBuffer, "%d", &g_IsEnableReportRate); + + DBG("g_IsEnableReportRate = %d\n", g_IsEnableReportRate); // 1 : enable report rate calculation, 0 : disable report rate calculation, 2 : reset count + + g_InterruptCount = 0; // Reset count + g_ValidTouchCount = 0; + } + + return nCount; +} +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GLOVE_MODE +ssize_t DrvMainProcfsGloveModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + u8 ucGloveMode = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + if (g_ChipType == CHIP_TYPE_MSG28XX) + { + DrvPlatformLyrDisableFingerTouchReport(); + + DrvIcFwLyrGetGloveInfo(&ucGloveMode); + + DrvPlatformLyrEnableFingerTouchReport(); + + DBG("Glove Mode = 0x%x\n", ucGloveMode); + + nLength = sprintf(pBuffer, "%x", ucGloveMode); + } + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsGloveModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nGloveMode = 0; + u32 i = 0; + char *pCh = NULL; + + DBG("*** %s() ***\n", __func__); + + if (pBuffer != NULL) + { + i = 0; + while ((pCh = strsep((char **)&pBuffer, ",")) && (i < 1)) + { + DBG("pCh = %s\n", pCh); + + nGloveMode = DrvCommonConvertCharToHexDigit(pCh, strlen(pCh)); + + i ++; + } + + DBG("Glove Mode = 0x%x\n", nGloveMode); + + DrvPlatformLyrDisableFingerTouchReport(); + + if (nGloveMode == 0x01) //open glove mode + { + DrvIcFwLyrOpenGloveMode(); + g_IsEnableGloveMode = 1; + } + else if (nGloveMode == 0x00) //close glove mode + { + DrvIcFwLyrCloseGloveMode(); + g_IsEnableGloveMode = 0; + } + else + { + DBG("*** Undefined Glove Mode ***\n"); + } + DBG("g_IsEnableGloveMode = 0x%x\n", g_IsEnableGloveMode); + + DrvPlatformLyrEnableFingerTouchReport(); + } + + return nCount; +} + +ssize_t DrvMainProcfsOpenGloveModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + if (g_ChipType == CHIP_TYPE_MSG28XX) + { + DrvPlatformLyrDisableFingerTouchReport(); + + DrvIcFwLyrOpenGloveMode(); + g_IsEnableGloveMode = 1; + + DrvPlatformLyrEnableFingerTouchReport(); + } + DBG("g_IsEnableGloveMode = 0x%x\n", g_IsEnableGloveMode); + + *pPos += nLength; + + return nLength; +} + +ssize_t DrvMainProcfsCloseGloveModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos) +{ + u32 nLength = 0; + + DBG("*** %s() ***\n", __func__); + + // If file position is non-zero, then assume the string has been read and indicate there is no more data to be read. + if (*pPos != 0) + { + return 0; + } + + if (g_ChipType == CHIP_TYPE_MSG28XX) + { + DrvPlatformLyrDisableFingerTouchReport(); + + DrvIcFwLyrCloseGloveMode(); + g_IsEnableGloveMode = 0; + + DrvPlatformLyrEnableFingerTouchReport(); + } + DBG("g_IsEnableGloveMode = 0x%x\n", g_IsEnableGloveMode); + + *pPos += nLength; + + return nLength; +} +#endif //CONFIG_ENABLE_GLOVE_MODE + + +#ifdef CONFIG_ENABLE_HOTKNOT +static long hotknot_ioctl( struct file *file, unsigned int cmd, unsigned long arg ) +{ + long nRet = 0; + + DBG("*** %s ***\n", __FUNCTION__); + + if (g_IsBypassHotknot == 0) + { + mutex_lock(&g_HKMutex); + g_IsHotknotAlive = 1; + nRet = HotKnotIoctl(file, cmd, arg); + g_IsHotknotAlive = 0; + mutex_unlock(&g_HKMutex); + } + + return nRet; +} + +static int hotknot_value; + +static ssize_t hotknot_value_show( struct kobject *kobj, struct kobj_attribute *attr, char *buf ) +{ + return sprintf( buf, "%d\n", hotknot_value ); +} + +static ssize_t hotknot_value_store( struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count ) +{ + sscanf( buf, "%d", &hotknot_value ); + + return count; +} + +static struct kobj_attribute hotknot_value_attr = __ATTR( hotknot_value, 0666, hotknot_value_show, hotknot_value_store ); +static struct attribute *hotknot_attrs[] = +{ + &hotknot_value_attr.attr, 0 +}; + +static struct attribute_group hotknot_attr_group = +{ + .attrs = hotknot_attrs +}; + +static const struct file_operations hotknot_fops = +{ + .owner = THIS_MODULE, + .unlocked_ioctl = hotknot_ioctl +}; + +//static struct miscdevice hotknot_miscdevice = +struct miscdevice hotknot_miscdevice = +{ + .minor = MISC_DYNAMIC_MINOR, + .name = "hotknot", + .nodename = "hotknot", + .mode = 0666, + .fops = &hotknot_fops +}; +#endif //CONFIG_ENABLE_HOTKNOT + +//------------------------------------------------------------------------------// + +s32 DrvMainTouchDeviceInitialize(void) +{ + s32 nRetVal = 0; +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + int nErr; + struct hwmsen_object tObjPs; +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + + DBG("*** %s() ***\n", __func__); + + _DrvMainCreateProcfsDirEntry(); // Create procfs directory entry + +#ifdef CONFIG_ENABLE_HOTKNOT + _DrvMainHotknotRegistry(); //register hotknot here... +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_JNI_INTERFACE + CreateMsgToolMem(); +#endif //CONFIG_ENABLE_JNI_INTERFACE + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + DrvIcFwLyrCreateMpTestWorkQueue(); +#endif //CONFIG_ENABLE_ITO_MP_TEST + + g_ChipType = DrvIcFwLyrGetChipType(); // Try to get chip type by SLAVE_I2C_ID_DBBUS(0x62) firstly. + + if (g_ChipType == 0) // If failed, try to get chip type by SLAVE_I2C_ID_DBBUS(0x59) again. + { + SLAVE_I2C_ID_DBBUS = (0xB2>>1); //0x59 + + g_ChipType = DrvIcFwLyrGetChipType(); + } + + DrvPlatformLyrTouchDeviceResetHw(); + + if (g_ChipType != 0) // To make sure TP is attached on cell phone. + { + memset(&g_FirmwareInfo, 0x0, sizeof(FirmwareInfo_t)); + + DrvIcFwLyrVariableInitialize(); + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + DrvIcFwLyrGetTouchPacketAddress(&g_FwPacketDataAddress, &g_FwPacketFlagAddress); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + tsps_assist_register_callback("msg2xxx", &DrvPlatformLyrTpPsEnable, &DrvPlatformLyrGetTpPsData); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + tObjPs.polling = 0; //interrupt mode + tObjPs.sensor_operate = DrvPlatformLyrTpPsOperate; + + if ((nErr = hwmsen_attach(ID_PROXIMITY, &tObjPs))) + { + DBG("call hwmsen_attach() failed = %d\n", nErr); + } +#endif +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + } + else + { + nRetVal = -ENODEV; + } + + return nRetVal; +} + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static s32 _DrvMainCreateProcfsDirEntry(void) +{ + s32 nRetVal = 0; + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + u8 *pGesturePath = NULL; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + u8 *pDevicePath = NULL; + + DBG("*** %s() ***\n", __func__); + + _gProcClass = proc_mkdir(PROC_NODE_CLASS, NULL); + + _gProcMsTouchScreenMsg20xx = proc_mkdir(PROC_NODE_MS_TOUCHSCREEN_MSG20XX, _gProcClass); + + _gProcDevice = proc_mkdir(PROC_NODE_DEVICE, _gProcMsTouchScreenMsg20xx); + + if (NULL == proc_create(PROC_NODE_CHIP_TYPE, PROCFS_AUTHORITY, _gProcDevice, &_gProcChipType)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_CHIP_TYPE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_CHIP_TYPE); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_DATA, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareData)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_DATA); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_DATA); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_UPDATE, PROCFS_AUTHORITY, _gProcDevice, &_gProcApkFirmwareUpdate)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_UPDATE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_UPDATE); + } + + if (NULL == proc_create(PROC_NODE_CUSTOMER_FIRMWARE_VERSION, PROCFS_AUTHORITY, _gProcDevice, &_gProcCustomerFirmwareVersion)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_CUSTOMER_FIRMWARE_VERSION); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_CUSTOMER_FIRMWARE_VERSION); + } + + if (NULL == proc_create(PROC_NODE_PLATFORM_FIRMWARE_VERSION, PROCFS_AUTHORITY, _gProcDevice, &_gProcPlatformFirmwareVersion)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_PLATFORM_FIRMWARE_VERSION); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_PLATFORM_FIRMWARE_VERSION); + } + + if (NULL == proc_create(PROC_NODE_DEVICE_DRIVER_VERSION, PROCFS_AUTHORITY, _gProcDevice, &_gProcDeviceDriverVersion)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_DEVICE_DRIVER_VERSION); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_DEVICE_DRIVER_VERSION); + } + + if (NULL == proc_create(PROC_NODE_SDCARD_FIRMWARE_UPDATE, PROCFS_AUTHORITY, _gProcDevice, &_gProcSdCardFirmwareUpdate)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_SDCARD_FIRMWARE_UPDATE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_SDCARD_FIRMWARE_UPDATE); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_DEBUG, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareDebug)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_DEBUG); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_DEBUG); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_SET_DEBUG_VALUE, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareSetDebugValue)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_SET_DEBUG_VALUE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_SET_DEBUG_VALUE); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_SMBUS_DEBUG, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareSmBusDebug)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_SMBUS_DEBUG); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_SMBUS_DEBUG); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_SET_DQMEM_VALUE, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareSetDQMemValue)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_SET_DQMEM_VALUE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_SET_DQMEM_VALUE); + } + +#ifdef CONFIG_ENABLE_ITO_MP_TEST + if (NULL == proc_create(PROC_NODE_MP_TEST, PROCFS_AUTHORITY, _gProcDevice, &_gProcMpTest)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_MP_TEST); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_MP_TEST); + } + + if (NULL == proc_create(PROC_NODE_MP_TEST_LOG, PROCFS_AUTHORITY, _gProcDevice, &_gProcMpTestLog)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_MP_TEST_LOG); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_MP_TEST_LOG); + } + + if (NULL == proc_create(PROC_NODE_MP_TEST_FAIL_CHANNEL, PROCFS_AUTHORITY, _gProcDevice, &_gProcMpTestFailChannel)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_MP_TEST_FAIL_CHANNEL); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_MP_TEST_FAIL_CHANNEL); + } + + if (NULL == proc_create(PROC_NODE_MP_TEST_SCOPE, PROCFS_AUTHORITY, _gProcDevice, &_gProcMpTestScope)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_MP_TEST_SCOPE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_MP_TEST_SCOPE); + } +#endif //CONFIG_ENABLE_ITO_MP_TEST + + + if (NULL == proc_create(PROC_NODE_FIRMWARE_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_MODE); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_SENSOR, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwareSensor)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_SENSOR); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_SENSOR); + } + + if (NULL == proc_create(PROC_NODE_FIRMWARE_PACKET_HEADER, PROCFS_AUTHORITY, _gProcDevice, &_gProcFirmwarePacketHeader)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_FIRMWARE_PACKET_HEADER); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_FIRMWARE_PACKET_HEADER); + } + + /* create a kset with the name of "kset_example" which is located under /sys/kernel/ */ + g_TouchKSet = kset_create_and_add("kset_example", NULL, kernel_kobj); + if (!g_TouchKSet) + { + DBG("*** kset_create_and_add() failed, nRetVal = %d ***\n", nRetVal); + + nRetVal = -ENOMEM; + } + + g_TouchKObj = kobject_create(); + if (!g_TouchKObj) + { + DBG("*** kobject_create() failed, nRetVal = %d ***\n", nRetVal); + + nRetVal = -ENOMEM; + kset_unregister(g_TouchKSet); + g_TouchKSet = NULL; + } + + g_TouchKObj->kset = g_TouchKSet; + + nRetVal = kobject_add(g_TouchKObj, NULL, "%s", "kobject_example"); + if (nRetVal != 0) + { + DBG("*** kobject_add() failed, nRetVal = %d ***\n", nRetVal); + + kobject_put(g_TouchKObj); + g_TouchKObj = NULL; + kset_unregister(g_TouchKSet); + g_TouchKSet = NULL; + } + + /* create the files associated with this kobject */ + nRetVal = sysfs_create_group(g_TouchKObj, &attr_group); + if (nRetVal != 0) + { + DBG("*** sysfs_create_file() failed, nRetVal = %d ***\n", nRetVal); + + kobject_put(g_TouchKObj); + g_TouchKObj = NULL; + kset_unregister(g_TouchKSet); + g_TouchKSet = NULL; + } + + pDevicePath = kobject_get_path(g_TouchKObj, GFP_KERNEL); + DBG("DEVPATH = %s\n", pDevicePath); + + + if (NULL == proc_create(PROC_NODE_QUERY_FEATURE_SUPPORT_STATUS, PROCFS_AUTHORITY, _gProcDevice, &_gProcQueryFeatureSupportStatus)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_QUERY_FEATURE_SUPPORT_STATUS); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_QUERY_FEATURE_SUPPORT_STATUS); + } + + if (NULL == proc_create(PROC_NODE_CHANGE_FEATURE_SUPPORT_STATUS, PROCFS_AUTHORITY, _gProcDevice, &_gProcChangeFeatureSupportStatus)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_CHANGE_FEATURE_SUPPORT_STATUS); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_CHANGE_FEATURE_SUPPORT_STATUS); + } + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (NULL == proc_create(PROC_NODE_GESTURE_WAKEUP_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcGestureWakeupMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_GESTURE_WAKEUP_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_GESTURE_WAKEUP_MODE); + } + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + if (NULL == proc_create(PROC_NODE_GESTURE_DEBUG_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcGestureDebugMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_GESTURE_DEBUG_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_GESTURE_DEBUG_MODE); + } + + /* create a kset with the name of "kset_gesture" which is located under /sys/kernel/ */ + g_GestureKSet = kset_create_and_add("kset_gesture", NULL, kernel_kobj); + if (!g_GestureKSet) + { + DBG("*** kset_create_and_add() failed, nRetVal = %d ***\n", nRetVal); + nRetVal = -ENOMEM; + } + + g_GestureKObj = kobject_create(); + if (!g_GestureKObj) + { + DBG("*** kobject_create() failed, nRetVal = %d ***\n", nRetVal); + + nRetVal = -ENOMEM; + kset_unregister(g_GestureKSet); + g_GestureKSet = NULL; + } + + g_GestureKObj->kset = g_GestureKSet; + + nRetVal = kobject_add(g_GestureKObj, NULL, "%s", "kobject_gesture"); + if (nRetVal != 0) + { + DBG("*** kobject_add() failed, nRetVal = %d ***\n", nRetVal); + + kobject_put(g_GestureKObj); + g_GestureKObj = NULL; + kset_unregister(g_GestureKSet); + g_GestureKSet = NULL; + } + + /* create the files associated with this g_GestureKObj */ + nRetVal = sysfs_create_group(g_GestureKObj, &gestureattr_group); + if (nRetVal != 0) + { + DBG("*** sysfs_create_file() failed, nRetVal = %d ***\n", nRetVal); + + kobject_put(g_GestureKObj); + g_GestureKObj = NULL; + kset_unregister(g_GestureKSet); + g_GestureKSet = NULL; + } + + pGesturePath = kobject_get_path(g_GestureKObj, GFP_KERNEL); + DBG("DEVPATH = %s\n", pGesturePath); +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + if (NULL == proc_create(PROC_NODE_GESTURE_INFORMATION_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcGestureInforMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_GESTURE_INFORMATION_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_GESTURE_INFORMATION_MODE); + } +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE + if (NULL == proc_create(PROC_NODE_REPORT_RATE, PROCFS_AUTHORITY, _gProcDevice, &_gProcReportRate)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_REPORT_RATE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_REPORT_RATE); + } +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +#ifdef CONFIG_ENABLE_GLOVE_MODE + if (NULL == proc_create(PROC_NODE_GLOVE_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcGloveMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_GLOVE_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_GLOVE_MODE); + } + + if (NULL == proc_create(PROC_NODE_OPEN_GLOVE_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcOpenGloveMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_OPEN_GLOVE_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_OPEN_GLOVE_MODE); + } + + if (NULL == proc_create(PROC_NODE_CLOSE_GLOVE_MODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcCloseGloveMode)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_CLOSE_GLOVE_MODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_CLOSE_GLOVE_MODE); + } +#endif //CONFIG_ENABLE_GLOVE_MODE + +#ifdef CONFIG_ENABLE_JNI_INTERFACE + if (NULL == proc_create(PROC_NODE_JNI_NODE, PROCFS_AUTHORITY, _gProcDevice, &_gProcJniMethod)) + { + DBG("Failed to create procfs file node(%s)!\n", PROC_NODE_JNI_NODE); + } + else + { + DBG("Create procfs file node(%s) OK!\n", PROC_NODE_JNI_NODE); + } +#endif //CONFIG_ENABLE_JNI_INTERFACE + + return nRetVal; +} + +#ifdef CONFIG_ENABLE_HOTKNOT +//register hotknot ioctl handler +static s32 _DrvMainHotknotRegistry(void) +{ + s32 nRetVal = 0; + + nRetVal = misc_register( &hotknot_miscdevice ); + if ( nRetVal < 0 ) + { + DBG( "Failed to register misc device. Err:%d\n", nRetVal ); + } + DBG( "*** Misc device registered ***\n" ); + + nRetVal = sysfs_create_group( &hotknot_miscdevice.this_device->kobj, &hotknot_attr_group ); + if ( nRetVal < 0 ) + { + DBG( "Failed to create attribute group. Err:%d\n", nRetVal ); + //misc_deregister( &hotknot_miscdevice ); + } + DBG( "*** Attribute group created ***\n" ); + + mutex_init(&g_HKMutex); + mutex_init(&g_QMutex); + CreateQueue(); + CreateHotKnotMem(); + + return nRetVal; +} +#endif //CONFIG_ENABLE_HOTKNOT diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_main.h b/drivers/input/touchscreen/msg2233/mstar_drv_main.h new file mode 100644 index 00000000..e298ffeb --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_main.h @@ -0,0 +1,186 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_main.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_MAIN_H__ +#define __MSTAR_DRV_MAIN_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define PROC_NODE_CLASS "class" +#define PROC_NODE_MS_TOUCHSCREEN_MSG20XX "ms-touchscreen-msg20xx" +#define PROC_NODE_DEVICE "device" +#define PROC_NODE_CHIP_TYPE "chip_type" +#define PROC_NODE_FIRMWARE_DATA "data" +#define PROC_NODE_FIRMWARE_UPDATE "update" +#define PROC_NODE_CUSTOMER_FIRMWARE_VERSION "version" +#define PROC_NODE_PLATFORM_FIRMWARE_VERSION "platform_version" +#define PROC_NODE_DEVICE_DRIVER_VERSION "driver_version" +#define PROC_NODE_SDCARD_FIRMWARE_UPDATE "sdcard_update" +#define PROC_NODE_FIRMWARE_DEBUG "debug" +#define PROC_NODE_FIRMWARE_SET_DEBUG_VALUE "set_debug_value" +#define PROC_NODE_FIRMWARE_SMBUS_DEBUG "smbus_debug" + +#define PROC_NODE_FIRMWARE_SET_DQMEM_VALUE "set_dqmem_value" + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +#define PROC_NODE_MP_TEST "test" +#define PROC_NODE_MP_TEST_LOG "test_log" +#define PROC_NODE_MP_TEST_FAIL_CHANNEL "test_fail_channel" +#define PROC_NODE_MP_TEST_SCOPE "test_scope" +#endif //CONFIG_ENABLE_ITO_MP_TEST + +#define PROC_NODE_FIRMWARE_MODE "mode" +#define PROC_NODE_FIRMWARE_SENSOR "sensor" +#define PROC_NODE_FIRMWARE_PACKET_HEADER "header" + +#define PROC_NODE_QUERY_FEATURE_SUPPORT_STATUS "query_feature_support_status" +#define PROC_NODE_CHANGE_FEATURE_SUPPORT_STATUS "change_feature_support_status" + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#define PROC_NODE_GESTURE_WAKEUP_MODE "gesture_wakeup_mode" +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +#define PROC_NODE_GESTURE_DEBUG_MODE "gesture_debug" +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#define PROC_NODE_GESTURE_INFORMATION_MODE "gesture_infor" +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +#define PROC_NODE_REPORT_RATE "report_rate" +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +#ifdef CONFIG_ENABLE_GLOVE_MODE +#define PROC_NODE_GLOVE_MODE "glove_mode" +#define PROC_NODE_OPEN_GLOVE_MODE "open_glove_mode" +#define PROC_NODE_CLOSE_GLOVE_MODE "close_glove_mode" +#endif //CONFIG_ENABLE_GLOVE_MODE + +#ifdef CONFIG_ENABLE_JNI_INTERFACE +#define PROC_NODE_JNI_NODE "msgtool" +#endif //CONFIG_ENABLE_JNI_INTERFACE + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern ssize_t DrvMainProcfsChipTypeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsChipTypeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareDataRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareDataWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareUpdateRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareUpdateWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsCustomerFirmwareVersionRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsCustomerFirmwareVersionWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsPlatformFirmwareVersionRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsPlatformFirmwareVersionWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsDeviceDriverVersionRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsDeviceDriverVersionWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsSdCardFirmwareUpdateRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsSdCardFirmwareUpdateWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareDebugRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareDebugWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSetDebugValueRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSetDebugValueWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSmBusDebugRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSmBusDebugWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); + +extern ssize_t DrvMainProcfsFirmwareSetDQMemValueRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSetDQMemValueWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); + +#ifdef CONFIG_ENABLE_ITO_MP_TEST +extern ssize_t DrvMainProcfsMpTestRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestLogRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestLogWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestFailChannelRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestFailChannelWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestScopeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsMpTestScopeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +#endif //CONFIG_ENABLE_ITO_MP_TEST + +extern ssize_t DrvMainProcfsFirmwareModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSensorRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwareSensorWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwarePacketHeaderRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsFirmwarePacketHeaderWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainKObjectPacketShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainKObjectPacketStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount); + +extern ssize_t DrvMainProcfsQueryFeatureSupportStatusRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsQueryFeatureSupportStatusWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsChangeFeatureSupportStatusRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsChangeFeatureSupportStatusWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern ssize_t DrvMainProcfsGestureWakeupModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsGestureWakeupModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern ssize_t DrvMainProcfsGestureDebugModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsGestureDebugModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainKObjectGestureDebugShow(struct kobject *pKObj, struct kobj_attribute *pAttr, char *pBuf); +extern ssize_t DrvMainKObjectGestureDebugStore(struct kobject *pKObj, struct kobj_attribute *pAttr, const char *pBuf, size_t nCount); +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +extern ssize_t DrvMainProcfsGestureInforModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsGestureInforModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +extern ssize_t DrvMainProcfsReportRateRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsReportRateWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +#ifdef CONFIG_ENABLE_GLOVE_MODE +extern ssize_t DrvMainProcfsGloveModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsGloveModeWrite(struct file *pFile, const char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsOpenGloveModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +extern ssize_t DrvMainProcfsCloseGloveModeRead(struct file *pFile, char __user *pBuffer, size_t nCount, loff_t *pPos); +#endif //CONFIG_ENABLE_GLOVE_MODE + +extern s32 DrvMainTouchDeviceInitialize(void); + +#endif /* __MSTAR_DRV_MAIN_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_mtk.c b/drivers/input/touchscreen/msg2233/mstar_drv_mtk.c new file mode 100644 index 00000000..3d4eb087 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_mtk.c @@ -0,0 +1,275 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_mtk.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include "tpd.h" +#include "cust_gpio_usage.h" + +#include "mstar_drv_platform_interface.h" + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + +#define MSG_TP_IC_NAME "msg2xxx" //"msg21xxA" or "msg22xx" or "msg26xxM" /* Please define the mstar touch ic name based on the mutual-capacitive ic or self capacitive ic that you are using */ +#define I2C_BUS_ID (1) // i2c bus id : 0 or 1 + +#define TPD_OK (0) + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_TP_HAVE_KEY +extern const int g_TpVirtualKey[]; + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +extern const int g_TpVirtualKeyDimLocal[][4]; +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#endif //CONFIG_TP_HAVE_KEY + +extern struct tpd_device *tpd; + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +/* +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) +static int tpd_wb_start_local[TPD_WARP_CNT] = TPD_WARP_START; +static int tpd_wb_end_local[TPD_WARP_CNT] = TPD_WARP_END; +#endif + +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) +static int tpd_calmat_local[8] = TPD_CALIBRATION_MATRIX; +static int tpd_def_calmat_local[8] = TPD_CALIBRATION_MATRIX; +#endif +*/ +struct i2c_client *g_I2cClient = NULL; + +//static int boot_mode = 0; + +/*=============================================================*/ +// FUNCTION DECLARATION +/*=============================================================*/ + +/*=============================================================*/ +// FUNCTION DEFINITION +/*=============================================================*/ + +/* probe function is used for matching and initializing input device */ +static int /*__devinit*/ tpd_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + TPD_DMESG("TPD probe\n"); + + if (client == NULL) + { + TPD_DMESG("i2c client is NULL\n"); + return -1; + } + g_I2cClient = client; + + MsDrvInterfaceTouchDeviceSetIicDataRate(g_I2cClient, 100000); // 100 KHZ + + MsDrvInterfaceTouchDeviceProbe(g_I2cClient, id); + + tpd_load_status = 1; + + TPD_DMESG("TPD probe done\n"); + + return TPD_OK; +} + +static int tpd_detect(struct i2c_client *client, struct i2c_board_info *info) +{ + strcpy(info->type, TPD_DEVICE); +// strcpy(info->type, MSG_TP_IC_NAME); + + return TPD_OK; +} + +static int /*__devexit*/ tpd_remove(struct i2c_client *client) +{ + TPD_DEBUG("TPD removed\n"); + + MsDrvInterfaceTouchDeviceRemove(client); + + return TPD_OK; +} + +static struct i2c_board_info __initdata i2c_tpd = {I2C_BOARD_INFO(MSG_TP_IC_NAME, (0x4C>>1))}; + +/* The I2C device list is used for matching I2C device and I2C device driver. */ +static const struct i2c_device_id tpd_device_id[] = +{ + {MSG_TP_IC_NAME, 0}, + {}, /* should not omitted */ +}; + +MODULE_DEVICE_TABLE(i2c, tpd_device_id); + +static struct i2c_driver tpd_i2c_driver = { + .driver = { + .name = MSG_TP_IC_NAME, + }, + .probe = tpd_probe, + //.remove = __devexit_p(tpd_remove), + .remove = tpd_remove, + .id_table = tpd_device_id, + .detect = tpd_detect, +}; + +static int tpd_local_init(void) +{ + TPD_DMESG("TPD init device driver (Built %s @ %s)\n", __DATE__, __TIME__); +/* + // Software reset mode will be treated as normal boot + boot_mode = get_boot_mode(); + if (boot_mode == 3) + { + boot_mode = NORMAL_BOOT; + } +*/ + if (i2c_add_driver(&tpd_i2c_driver) != 0) + { + TPD_DMESG("unable to add i2c driver.\n"); + + return -1; + } + + if (tpd_load_status == 0) + { + TPD_DMESG("add error touch panel driver.\n"); + + i2c_del_driver(&tpd_i2c_driver); + return -1; + } + +#ifdef CONFIG_TP_HAVE_KEY +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + // initialize tpd button data + tpd_button_setting(4, g_TpVirtualKey, g_TpVirtualKeyDimLocal); //MAX_KEY_NUM +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#endif //CONFIG_TP_HAVE_KEY + +/* +#if (defined(TPD_WARP_START) && defined(TPD_WARP_END)) + TPD_DO_WARP = 1; + memcpy(tpd_wb_start, tpd_wb_start_local, TPD_WARP_CNT*4); + memcpy(tpd_wb_end, tpd_wb_start_local, TPD_WARP_CNT*4); +#endif + +#if (defined(TPD_HAVE_CALIBRATION) && !defined(TPD_CUSTOM_CALIBRATION)) + memcpy(tpd_calmat, tpd_def_calmat_local, 8*4); + memcpy(tpd_def_calmat, tpd_def_calmat_local, 8*4); +#endif +*/ + TPD_DMESG("TPD init done %s, %d\n", __FUNCTION__, __LINE__); + + return TPD_OK; +} + +static void tpd_resume(struct early_suspend *h) +{ + TPD_DMESG("TPD wake up\n"); + + MsDrvInterfaceTouchDeviceResume(h); + + TPD_DMESG("TPD wake up done\n"); +} + +static void tpd_suspend(struct early_suspend *h) +{ + TPD_DMESG("TPD enter sleep\n"); + + MsDrvInterfaceTouchDeviceSuspend(h); + + TPD_DMESG("TPD enter sleep done\n"); +} + +static struct tpd_driver_t tpd_device_driver = { + .tpd_device_name = MSG_TP_IC_NAME, + .tpd_local_init = tpd_local_init, + .suspend = tpd_suspend, + .resume = tpd_resume, +#ifdef CONFIG_TP_HAVE_KEY +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + .tpd_have_button = 1, +#else + .tpd_have_button = 0, +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#endif //CONFIG_TP_HAVE_KEY +}; + +static int __init tpd_driver_init(void) +{ + TPD_DMESG("touch panel driver init\n"); + + i2c_register_board_info(I2C_BUS_ID, &i2c_tpd, 1); + if (tpd_driver_add(&tpd_device_driver) < 0) + { + TPD_DMESG("TPD add driver failed\n"); + } + + return 0; +} + +static void __exit tpd_driver_exit(void) +{ + TPD_DMESG("touch panel driver exit\n"); + + tpd_driver_remove(&tpd_device_driver); +} + +module_init(tpd_driver_init); +module_exit(tpd_driver_exit); +MODULE_LICENSE("GPL"); \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.c b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.c new file mode 100644 index 00000000..0c6458ed --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.c @@ -0,0 +1,6412 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_mutual_fw_control.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_mutual_fw_control.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_platform_porting_layer.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; + +#ifdef CONFIG_TP_HAVE_KEY +extern const int g_TpVirtualKey[]; + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +extern const int g_TpVirtualKeyDimLocal[][4]; +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#endif //CONFIG_TP_HAVE_KEY + +extern struct input_dev *g_InputDevice; + +extern u8 g_FwData[MAX_UPDATE_FIRMWARE_BUFFER_SIZE][1024]; +extern u32 g_FwDataCount; + +extern struct mutex g_Mutex; + +extern u16 FIRMWARE_MODE_UNKNOWN_MODE; +extern u16 FIRMWARE_MODE_DEMO_MODE; +extern u16 FIRMWARE_MODE_DEBUG_MODE; +extern u16 FIRMWARE_MODE_RAW_DATA_MODE; + +extern struct kobject *g_TouchKObj; +extern u8 g_IsSwitchModeByAPK; + +extern u8 IS_FIRMWARE_DATA_LOG_ENABLED; + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +extern u16 g_FwPacketDataAddress; +extern u16 g_FwPacketFlagAddress; + +extern u8 g_FwSupportSegment; +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern struct kobject *g_GestureKObj; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +extern u32 g_IsEnableReportRate; +extern u32 g_InterruptCount; +extern u32 g_ValidTouchCount; + +extern struct timeval g_StartTime; +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +#ifdef CONFIG_ENABLE_HOTKNOT +extern u8 g_HotKnotState; +#endif //CONFIG_ENABLE_HOTKNOT + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +//static u8 _gTpVendorCode[3] = {0}; // used for MSG28XX + +static u8 _gOneDimenFwData[MSG28XX_FIRMWARE_WHOLE_SIZE*1024] = {0}; // used for MSG28XX + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +/* + * Note. + * Please modify the name of the below .h depends on the vendor TP that you are using. + */ +#include "msg26xxm_xxxx_update_bin.h" // for MSG26xxM +#include "msg26xxm_yyyy_update_bin.h" + +#include "msg28xx_xxxx_update_bin.h" // for MSG28xx +#include "msg28xx_yyyy_update_bin.h" + +static u32 _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; +static u32 _gIsUpdateInfoBlockFirst = 0; +static struct work_struct _gUpdateFirmwareBySwIdWork; +static struct workqueue_struct *_gUpdateFirmwareBySwIdWorkQueue = NULL; +static u8 _gTempData[1024]; +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +static u32 _gGestureWakeupValue[2] = {0}; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +static u8 _gTouchPacketFlag[2] = {0}; +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +static u8 _gIsDisableFinagerTouch = 0; + +static u16 _gSFR_ADDR3_BYTE0_1_VALUE = 0x0000; +static u16 _gSFR_ADDR3_BYTE2_3_VALUE = 0x0000; + + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +u8 g_ChipType = 0; +u8 g_DemoModePacket[DEMO_MODE_PACKET_LENGTH] = {0}; + +#ifdef CONFIG_ENABLE_HOTKNOT +u8 g_DemoModeHotKnotSndRetPacket[DEMO_HOTKNOT_SEND_RET_LEN] = {0}; +u8 g_DebugModeHotKnotSndRetPacket[DEBUG_HOTKNOT_SEND_RET_LEN] = {0}; +#endif //CONFIG_ENABLE_HOTKNOT + +FirmwareInfo_t g_FirmwareInfo; +u8 g_LogModePacket[DEBUG_MODE_PACKET_LENGTH] = {0}; +u16 g_FirmwareMode; + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +#if defined(CONFIG_ENABLE_GESTURE_DEBUG_MODE) +u8 _gGestureWakeupPacket[GESTURE_DEBUG_MODE_PACKET_LENGTH] = {0}; +#elif defined(CONFIG_ENABLE_GESTURE_INFORMATION_MODE) +u8 _gGestureWakeupPacket[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH] = {0}; +#else +u8 _gGestureWakeupPacket[GESTURE_WAKEUP_PACKET_LENGTH] = {0}; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +u8 g_GestureDebugFlag = 0x00; +u8 g_GestureDebugMode = 0x00; +u8 g_LogGestureDebug[GESTURE_DEBUG_MODE_PACKET_LENGTH] = {0}; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +u32 g_LogGestureInfor[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH] = {0}; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +u32 g_GestureWakeupMode[2] = {0xFFFFFFFF, 0xFFFFFFFF}; +u8 g_GestureWakeupFlag = 0; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +u8 g_EnableTpProximity = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +u8 g_FaceClosingTp = 0; // for QCOM platform -> 1 : close to, 0 : far away +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +u8 g_FaceClosingTp = 1; // for MTK platform -> 0 : close to, 1 : far away +#endif +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GLOVE_MODE +u8 g_IsGloveModeOpen = 0; +#endif //CONFIG_ENABLE_GLOVE_MODE + +u8 g_IsUpdateFirmware = 0x00; + +/*=============================================================*/ +// LOCAL FUNCTION DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +static void _DrvFwCtrlCoordinate(u8 *pRawData, u32 *pTranX, u32 *pTranY); +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static s32 _DrvFwCtrlParsePacket(u8 *pPacket, u16 nLength, TouchInfo_t *pInfo) +{ + u32 i; + u8 nCheckSum = 0; + u32 nX = 0, nY = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE + if (g_IsEnableReportRate == 1) + { + if (g_InterruptCount == 4294967296) + { + g_InterruptCount = 0; // Reset count if overflow + DBG("g_InterruptCount reset to 0\n"); + } + + if (g_InterruptCount == 0) + { + // Get start time + do_gettimeofday(&g_StartTime); + + DBG("Start time : %lu sec, %lu msec\n", g_StartTime.tv_sec, g_StartTime.tv_usec); + } + + g_InterruptCount ++; + + DBG("g_InterruptCount = %d\n", g_InterruptCount); + } +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + + nCheckSum = DrvCommonCalculateCheckSum(&pPacket[0], (nLength-1)); + DBG("checksum : [%x] == [%x]? \n", pPacket[nLength-1], nCheckSum); + + if (pPacket[nLength-1] != nCheckSum) + { + DBG("WRONG CHECKSUM\n"); + return -1; + } + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + u8 nWakeupMode = 0; + u8 bIsCorrectFormat = 0; + + DBG("received raw data from touch panel as following:\n"); + DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x pPacket[5]=%x \n", \ + pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5]); + + if (pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x06 && pPacket[3] == PACKET_TYPE_GESTURE_WAKEUP) + { + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + } +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + else if (pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x80 && pPacket[3] == PACKET_TYPE_GESTURE_DEBUG) + { + u32 a = 0; + + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + + for (a = 0; a < 0x80; a ++) + { + g_LogGestureDebug[a] = pPacket[a]; + } + + if (!(pPacket[5] >> 7))// LCM Light Flag = 0 + { + nWakeupMode = 0xFE; + DBG("gesture debug mode LCM flag = 0\n"); + } + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + else if (pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x80 && pPacket[3] == PACKET_TYPE_GESTURE_INFORMATION) + { + u32 a = 0; + u32 nTmpCount = 0; + + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + + for (a = 0; a < 6; a ++)//header + { + g_LogGestureInfor[nTmpCount] = pPacket[a]; + nTmpCount++; + } + + for (a = 6; a < 126; a = a+3)//parse packet to coordinate + { + u32 nTranX = 0; + u32 nTranY = 0; + + _DrvFwCtrlCoordinate(&pPacket[a], &nTranX, &nTranY); + g_LogGestureInfor[nTmpCount] = nTranX; + nTmpCount++; + g_LogGestureInfor[nTmpCount] = nTranY; + nTmpCount++; + } + + g_LogGestureInfor[nTmpCount] = pPacket[126]; //Dummy + nTmpCount++; + g_LogGestureInfor[nTmpCount] = pPacket[127]; //checksum + nTmpCount++; + DBG("gesture information mode Count = %d\n", nTmpCount); + } +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + + if (bIsCorrectFormat) + { + DBG("nWakeupMode = 0x%x\n", nWakeupMode); + + switch (nWakeupMode) + { + case 0x58: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG; + + DBG("Light up screen by DOUBLE_CLICK gesture wakeup.\n"); + + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x60: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG; + + DBG("Light up screen by UP_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_UP, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_UP, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x61: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG; + + DBG("Light up screen by DOWN_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_DOWN, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_DOWN, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x62: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG; + + DBG("Light up screen by LEFT_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_LEFT, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_LEFT, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x63: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG; + + DBG("Light up screen by RIGHT_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_RIGHT, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_RIGHT, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x64: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG; + + DBG("Light up screen by m_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_M, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_M, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x65: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG; + + DBG("Light up screen by W_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_W, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_W, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x66: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG; + + DBG("Light up screen by C_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_C, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_C, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x67: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG; + + DBG("Light up screen by e_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_E, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_E, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x68: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG; + + DBG("Light up screen by V_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_V, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_V, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x69: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG; + + DBG("Light up screen by O_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_O, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_O, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6A: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG; + + DBG("Light up screen by S_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_S, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_S, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6B: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG; + + DBG("Light up screen by Z_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_Z, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_Z, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6C: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE1_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE1_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER1, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER1, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6D: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE2_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE2_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER2, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER2, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6E: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE3_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE3_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER3, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER3, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + case 0x6F: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE4_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE4_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER4, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER4, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x70: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE5_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE5_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER5, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER5, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x71: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE6_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE6_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER6, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER6, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x72: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE7_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE7_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER7, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER7, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x73: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE8_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE8_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER8, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER8, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x74: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE9_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE9_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER9, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER9, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x75: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE10_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE10_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER10, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER10, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x76: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE11_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE11_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER11, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER11, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x77: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE12_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE12_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER12, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER12, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x78: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE13_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE13_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER13, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER13, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x79: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE14_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE14_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER14, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER14, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7A: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE15_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE15_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER15, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER15, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7B: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE16_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE16_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER16, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER16, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7C: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE17_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE17_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER17, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER17, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7D: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE18_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE18_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER18, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER18, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7E: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE19_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE19_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER19, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER19, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7F: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE20_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE20_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER20, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER20, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x80: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE21_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE21_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER21, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER21, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x81: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE22_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE22_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER22, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER22, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x82: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE23_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE23_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER23, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER23, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x83: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE24_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE24_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER24, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER24, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x84: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE25_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE25_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER25, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER25, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x85: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE26_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE26_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER26, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER26, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x86: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE27_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE27_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER27, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER27, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x87: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE28_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE28_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER28, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER28, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x88: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE29_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE29_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER29, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER29, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x89: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE30_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE30_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER30, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER30, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8A: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE31_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE31_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER31, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER31, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8B: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE32_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE32_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER32, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER32, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8C: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE33_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE33_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER33, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER33, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8D: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE34_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE34_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER34, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER34, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8E: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE35_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE35_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER35, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER35, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8F: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE36_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE36_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER36, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER36, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x90: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE37_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE37_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER37, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER37, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x91: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE38_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE38_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER38, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER38, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x92: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE39_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE39_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER39, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER39, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x93: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE40_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE40_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER40, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER40, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x94: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE41_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE41_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER41, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER41, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x95: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE42_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE42_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER42, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER42, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x96: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE43_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE43_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER43, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER43, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x97: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE44_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE44_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER44, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER44, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x98: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE45_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE45_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER45, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER45, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x99: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE46_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE46_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER46, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER46, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9A: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE47_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE47_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER47, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER47, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9B: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE48_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE48_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER48, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER48, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9C: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE49_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE49_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER49, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER49, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9D: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE50_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE50_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER50, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER50, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9E: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE51_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE51_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER51, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER51, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + case 0xFF://Gesture Fail + _gGestureWakeupValue[1] = 0xFF; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_FAIL gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER51, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER51, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + + default: + _gGestureWakeupValue[0] = 0; + _gGestureWakeupValue[1] = 0; + DBG("Un-supported gesture wakeup mode. Please check your device driver code.\n"); + break; + } + + DBG("_gGestureWakeupValue = 0x%x, 0x%x\n", _gGestureWakeupValue[0], _gGestureWakeupValue[1]); + } + else + { + DBG("gesture wakeup packet format is incorrect.\n"); + } + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + // Notify android application to retrieve log data mode packet from device driver by sysfs. + if (g_GestureKObj != NULL && pPacket[3] == PACKET_TYPE_GESTURE_DEBUG) + { + char *pEnvp[2]; + s32 nRetVal = 0; + + pEnvp[0] = "STATUS=GET_GESTURE_DEBUG"; + pEnvp[1] = NULL; + + nRetVal = kobject_uevent_env(g_GestureKObj, KOBJ_CHANGE, pEnvp); + DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal); + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + + return -1; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + DBG("received raw data from touch panel as following:\n"); + DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x \n pPacket[5]=%x pPacket[6]=%x pPacket[7]=%x pPacket[8]=%x \n", \ + pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5], pPacket[6], pPacket[7], pPacket[8]); + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE && pPacket[0] != 0x5A) + { +#ifdef CONFIG_ENABLE_HOTKNOT + if (pPacket[3] != HOTKNOT_PACKET_TYPE && pPacket[3] != HOTKNOT_RECEIVE_PACKET_TYPE) +#endif //CONFIG_ENABLE_HOTKNOT + { + DBG("WRONG DEMO MODE HEADER\n"); + return -1; + } + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && pPacket[0] != 0xA5 && pPacket[0] != 0xAB && (pPacket[0] != 0xA7 && pPacket[3] != PACKET_TYPE_TOOTH_PATTERN)) + { + DBG("WRONG DEBUG MODE HEADER\n"); + return -1; + } + } + else + { + if (pPacket[0] != 0x5A) + { +#ifdef CONFIG_ENABLE_HOTKNOT + if (pPacket[3] != HOTKNOT_PACKET_TYPE && pPacket[3] != HOTKNOT_RECEIVE_PACKET_TYPE) +#endif //CONFIG_ENABLE_HOTKNOT + { + DBG("WRONG DEMO MODE HEADER\n"); + return -1; + } + } + } //IS_FIRMWARE_DATA_LOG_ENABLED + + // Process raw data... + if (pPacket[0] == 0x5A) + { +#ifdef CONFIG_ENABLE_HOTKNOT + if (((DemoHotKnotCmdRet_t*)pPacket)->nIdentify == DEMO_PD_PACKET_IDENTIFY) + { + ReportHotKnotCmd(pPacket, nLength); + return -1; //return 0 will run key procedure + } + else +#endif //CONFIG_ENABLE_HOTKNOT + { + for (i = 0; i < MAX_TOUCH_NUM; i ++) + { + if ((pPacket[(4*i)+1] == 0xFF) && (pPacket[(4*i)+2] == 0xFF) && (pPacket[(4*i)+3] == 0xFF)) + { + continue; + } + + nX = (((pPacket[(4*i)+1] & 0xF0) << 4) | (pPacket[(4*i)+2])); + nY = (((pPacket[(4*i)+1] & 0x0F) << 8) | (pPacket[(4*i)+3])); + + pInfo->tPoint[pInfo->nCount].nX = nX * TOUCH_SCREEN_X_MAX / TPD_WIDTH; + pInfo->tPoint[pInfo->nCount].nY = nY * TOUCH_SCREEN_Y_MAX / TPD_HEIGHT; + pInfo->tPoint[pInfo->nCount].nP = pPacket[4*(i+1)]; + pInfo->tPoint[pInfo->nCount].nId = i; + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("point[%d] : (%d,%d) = %d\n", pInfo->tPoint[pInfo->nCount].nId, pInfo->tPoint[pInfo->nCount].nX, pInfo->tPoint[pInfo->nCount].nY, pInfo->tPoint[pInfo->nCount].nP); + + pInfo->nCount ++; + } + } + } + else if (pPacket[0] == 0xA5 || pPacket[0] == 0xAB) + { + for (i = 0; i < MAX_TOUCH_NUM; i ++) + { + if ((pPacket[(3*i)+4] == 0xFF) && (pPacket[(3*i)+5] == 0xFF) && (pPacket[(3*i)+6] == 0xFF)) + { + continue; + } + + nX = (((pPacket[(3*i)+4] & 0xF0) << 4) | (pPacket[(3*i)+5])); + nY = (((pPacket[(3*i)+4] & 0x0F) << 8) | (pPacket[(3*i)+6])); + + pInfo->tPoint[pInfo->nCount].nX = nX * TOUCH_SCREEN_X_MAX / TPD_WIDTH; + pInfo->tPoint[pInfo->nCount].nY = nY * TOUCH_SCREEN_Y_MAX / TPD_HEIGHT; + pInfo->tPoint[pInfo->nCount].nP = 1; + pInfo->tPoint[pInfo->nCount].nId = i; + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("point[%d] : (%d,%d) = %d\n", pInfo->tPoint[pInfo->nCount].nId, pInfo->tPoint[pInfo->nCount].nX, pInfo->tPoint[pInfo->nCount].nY, pInfo->tPoint[pInfo->nCount].nP); + + pInfo->nCount ++; + } + + // Notify android application to retrieve debug mode packet from device driver by sysfs. + if (g_TouchKObj != NULL) + { + char *pEnvp[2]; + s32 nRetVal = 0; + + pEnvp[0] = "STATUS=GET_DEBUG_MODE_PACKET"; + pEnvp[1] = NULL; + + nRetVal = kobject_uevent_env(g_TouchKObj, KOBJ_CHANGE, pEnvp); + DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal); + } + } + else if (pPacket[0] == 0xA7 && pPacket[3] == PACKET_TYPE_TOOTH_PATTERN) + { + for (i = 0; i < MAX_TOUCH_NUM; i ++) + { + if ((pPacket[(3*i)+5] == 0xFF) && (pPacket[(3*i)+6] == 0xFF) && (pPacket[(3*i)+7] == 0xFF)) + { + continue; + } + + nX = (((pPacket[(3*i)+5] & 0xF0) << 4) | (pPacket[(3*i)+6])); + nY = (((pPacket[(3*i)+5] & 0x0F) << 8) | (pPacket[(3*i)+7])); + + pInfo->tPoint[pInfo->nCount].nX = nX * TOUCH_SCREEN_X_MAX / TPD_WIDTH; + pInfo->tPoint[pInfo->nCount].nY = nY * TOUCH_SCREEN_Y_MAX / TPD_HEIGHT; + pInfo->tPoint[pInfo->nCount].nP = 1; + pInfo->tPoint[pInfo->nCount].nId = i; + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("point[%d] : (%d,%d) = %d\n", pInfo->tPoint[pInfo->nCount].nId, pInfo->tPoint[pInfo->nCount].nX, pInfo->tPoint[pInfo->nCount].nY, pInfo->tPoint[pInfo->nCount].nP); + + pInfo->nCount ++; + } + + // Notify android application to retrieve debug mode packet from device driver by sysfs. + if (g_TouchKObj != NULL) + { + char *pEnvp[2]; + s32 nRetVal = 0; + + pEnvp[0] = "STATUS=GET_DEBUG_MODE_PACKET"; + pEnvp[1] = NULL; + + nRetVal = kobject_uevent_env(g_TouchKObj, KOBJ_CHANGE, pEnvp); + DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal); + } + } +#ifdef CONFIG_ENABLE_HOTKNOT + else if (pPacket[0] == 0xA7) + { + if (pPacket[3] == HOTKNOT_PACKET_TYPE || pPacket[3] == HOTKNOT_RECEIVE_PACKET_TYPE) + { + ReportHotKnotCmd(pPacket, nLength); + return -1; //return 0 will run key procedure + } + } +#endif //CONFIG_ENABLE_HOTKNOT + + +#ifdef CONFIG_TP_HAVE_KEY + if (pPacket[0] == 0x5A) + { + u8 nButton = pPacket[nLength-2]; //Since the key value is stored in 0th~3th bit of variable "button", we can only retrieve 0th~3th bit of it. + +// if (nButton) + if (nButton != 0xFF) + { + DBG("button = %x\n", nButton); + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + DBG("g_EnableTpProximity = %d, pPacket[nLength-2] = 0x%x\n", g_EnableTpProximity, pPacket[nLength-2]); + + if (g_EnableTpProximity && ((pPacket[nLength-2] == 0x80) || (pPacket[nLength-2] == 0x40))) + { + if (pPacket[nLength-2] == 0x80) // close to + { + g_FaceClosingTp = 1; + } + else if (pPacket[nLength-2] == 0x40) // far away + { + g_FaceClosingTp = 0; + } + + DBG("g_FaceClosingTp = %d\n", g_FaceClosingTp); + + return -1; + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_EnableTpProximity && ((pPacket[nLength-2] == 0x80) || (pPacket[nLength-2] == 0x40))) + { + int nErr; + hwm_sensor_data tSensorData; + + if (pPacket[nLength-2] == 0x80) // close to + { + g_FaceClosingTp = 0; + } + else if (pPacket[nLength-2] == 0x40) // far away + { + g_FaceClosingTp = 1; + } + + DBG("g_FaceClosingTp = %d\n", g_FaceClosingTp); + + // map and store data to hwm_sensor_data + tSensorData.values[0] = DrvPlatformLyrGetTpPsData(); + tSensorData.value_divide = 1; + tSensorData.status = SENSOR_STATUS_ACCURACY_MEDIUM; + // let up layer to know + if ((nErr = hwmsen_get_interrupt_data(ID_PROXIMITY, &tSensorData))) + { + DBG("call hwmsen_get_interrupt_data() failed = %d\n", nErr); + } + + return -1; + } +#endif +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + + for (i = 0; i < MAX_KEY_NUM; i ++) + { + if ((nButton & (1<nKeyCode == 0) + { + pInfo->nKeyCode = i; + + DBG("key[%d]=%d ...\n", i, g_TpVirtualKey[i]); + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + pInfo->nKeyCode = 0xFF; + pInfo->nCount = 1; + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[i][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[i][1]; + pInfo->tPoint[0].nP = 1; + pInfo->tPoint[0].nId = 0; +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + } + else + { + /// if pressing multi-key => no report + pInfo->nKeyCode = 0xFF; + } + } + } + } + else + { + pInfo->nKeyCode = 0xFF; + } + } + else if (pPacket[0] == 0xA5 || pPacket[0] == 0xAB || (pPacket[0] == 0xA7 && pPacket[3] == PACKET_TYPE_TOOTH_PATTERN)) + { + // TODO : waiting for firmware define the virtual key + + if (pPacket[0] == 0xA5) + { + // Do nothing because of 0xA5 not define virtual key in the packet + } + else if (pPacket[0] == 0xAB || (pPacket[0] == 0xA7 && pPacket[3] == PACKET_TYPE_TOOTH_PATTERN)) + { + u8 nButton = 0xFF; + + if (pPacket[0] == 0xAB) + { + nButton = pPacket[3]; // The pressed virtual key is stored in 4th byte for debug mode packet 0xAB. + } + else if (pPacket[0] == 0xA7 && pPacket[3] == PACKET_TYPE_TOOTH_PATTERN) + { + nButton = pPacket[4]; // The pressed virtual key is stored in 5th byte for debug mode packet 0xA7. + } + + if (nButton != 0xFF) + { + DBG("button = %x\n", nButton); + + for (i = 0; i < MAX_KEY_NUM; i ++) + { + if ((nButton & (1<nKeyCode == 0) + { + pInfo->nKeyCode = i; + + DBG("key[%d]=%d ...\n", i, g_TpVirtualKey[i]); + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + pInfo->nKeyCode = 0xFF; + pInfo->nCount = 1; + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[i][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[i][1]; + pInfo->tPoint[0].nP = 1; + pInfo->tPoint[0].nId = 0; +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + } + else + { + /// if pressing multi-key => no report + pInfo->nKeyCode = 0xFF; + } + } + } + } + else + { + pInfo->nKeyCode = 0xFF; + } + } + } +#endif //CONFIG_TP_HAVE_KEY + + return 0; +} + +static void _DrvFwCtrlStoreFirmwareData(u8 *pBuf, u32 nSize) +{ + u32 nCount = nSize / 1024; + u32 nRemainder = nSize % 1024; + u32 i; + + DBG("*** %s() ***\n", __func__); + + if (nCount > 0) // nSize >= 1024 + { + for (i = 0; i < nCount; i ++) + { + memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024); + + g_FwDataCount ++; + } + + if (nRemainder > 0) // Handle special firmware size like MSG22XX(48.5KB) + { + DBG("nRemainder = %d\n", nRemainder); + + memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), nRemainder); + + g_FwDataCount ++; + } + } + else // nSize < 1024 + { + if (nSize > 0) + { + memcpy(g_FwData[g_FwDataCount], pBuf, nSize); + + g_FwDataCount ++; + } + } + + DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount); + + if (pBuf != NULL) + { + DBG("*** buf[0] = %c ***\n", pBuf[0]); + } +} + +static u16 _DrvFwCtrlMsg26xxmGetSwId(EmemType_e eEmemType) +{ + u16 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + szDbBusTxData[0] = 0x72; + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x2A; + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + szDbBusTxData[1] = 0x80; + szDbBusTxData[2] = 0x04; + } + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + /* + Ex. SW ID in Main Block : + Major low byte at address 0x002A + Major high byte at address 0x002B + + SW ID in Info Block : + Major low byte at address 0x8004 + Major high byte at address 0x8005 + */ + + nRetVal = szDbBusRxData[1]; + nRetVal = (nRetVal << 8) | szDbBusRxData[0]; + + DBG("SW ID = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg26xxmUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 i, j; + u32 nCrcMain, nCrcMainTp; + u32 nCrcInfo, nCrcInfoTp; + u16 nRegData = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + + ///////////////////////// + // Erase + ///////////////////////// + + DBG("erase 0\n"); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + DBG("erase 1\n"); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // Set PROGRAM password + RegSet16BitValue(0x161A, 0xABBA); //bank:emem, addr:h000D + + // Clear pce + RegSetLByteValue(0x1618, 0x80); //bank:emem, addr:h000C + + DBG("erase 2\n"); + // Clear setting + RegSetLByteValue(0x1618, 0x40); //bank:emem, addr:h000C + + mdelay(10); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); //bank:emem, addr:h000C + + DBG("erase 3\n"); + // Trigger erase + if (eEmemType == EMEM_ALL) + { + RegSetLByteValue(0x160E, 0x08); //all chip //bank:emem, addr:h0007 + } + else + { + RegSetLByteValue(0x160E, 0x04); //sector //bank:emem, addr:h0007 + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + mdelay(1000); + DBG("erase OK\n"); + + ///////////////////////// + // Program + ///////////////////////// + + DBG("program 0\n"); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + DBG("program 1\n"); + + // Check_Loader_Ready: Polling 0x3CE4 is 0x1C70 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x1C70); + + DBG("program 2\n"); + + RegSet16BitValue(0x3CE4, 0xE38F); //all chip + mdelay(100); + + // Check_Loader_Ready2Program: Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + DBG("program 3\n"); + + // prepare CRC & send data + DrvCommonCrcInitTable(); + + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) // Main : 32KB + Info : 8KB + { + if (i > 31) + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo); + } + } + else if (i < 31) + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + else ///if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } + mdelay(100); + + // Check_Program_Done: Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + // Continue_Program + RegSet16BitValue(0x3CE4, 0x2F43); + } + + DBG("program 4\n"); + + // Notify_Write_Done + RegSet16BitValue(0x3CE4, 0x1380); + mdelay(100); + + DBG("program 5\n"); + + // Check_CRC_Done: Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + + DBG("program 6\n"); + + // check CRC + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + // read CRC from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", + nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static void _DrvFwCtrlMsg28xxConvertFwDataTwoDimenToOneDimen(u8 szTwoDimenFwData[][1024], u8* pOneDimenFwData) +{ + u32 i, j; + + DBG("*** %s() ***\n", __func__); + + for (i = 0; i < MSG28XX_FIRMWARE_WHOLE_SIZE; i ++) + { + for (j = 0; j < 1024; j ++) + { + pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j]; + } + } +} + +static u32 _DrvFwCtrlMsg28xxCalculateCrc(u8 *pFwData, u32 nOffset, u32 nSize) +{ + u32 i; + u32 nData = 0, nCrc = 0; + u32 nCrcRule = 0x0C470C06; // 0000 1100 0100 0111 0000 1100 0000 0110 + + for (i = 0; i < nSize; i += 4) + { + nData = (pFwData[nOffset+i]) | (pFwData[nOffset+i+1] << 8) | (pFwData[nOffset+i+2] << 16) | (pFwData[nOffset+i+3] << 24); + nCrc = (nCrc >> 1) ^ (nCrc << 1) ^ (nCrc & nCrcRule) ^ nData; + } + + return nCrc; +} + +static void _DrvFwCtrlMsg28xxAccessEFlashInit(void) +{ + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Disable cpu read flash + RegSetLByteValue(0x1606, 0x20); + RegSetLByteValue(0x1608, 0x20); + + // Clear PROGRAM erase password + RegSet16BitValue(0x1618, 0xA55A); +} + +static void _DrvFwCtrlMsg28xxIspBurstWriteEFlashStart(u16 nStartAddr, u8 *pFirstData, u32 nBlockSize, u16 nPageNum, EmemType_e eEmemType) +{ + u16 nWriteAddr = nStartAddr/4; + u8 szDbBusTxData[3] = {0}; + + DBG("*** %s() nStartAddr = 0x%x, nBlockSize = %d, nPageNum = %d, eEmemType = %d ***\n", __func__, nStartAddr, nBlockSize, nPageNum, eEmemType); + + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + + // Set e-flash mode to page write mode + RegSet16BitValue(0x1606, 0x0080); + + // Set data align + RegSetLByteValue(0x1640, 0x01); + + if (eEmemType == EMEM_INFO) + { + RegSetLByteValue(0x1607, 0x08); + } + + // Set double buffer + RegSetLByteValue(0x1604, 0x01); + + // Set page write number + RegSet16BitValue(0x161A, nPageNum); + + // Set e-flash mode trigger(Trigger write mode) + RegSetLByteValue(0x1606, 0x81); + + // Set init data + RegSetLByteValue(0x1602, pFirstData[0]); + RegSetLByteValue(0x1602, pFirstData[1]); + RegSetLByteValue(0x1602, pFirstData[2]); + RegSetLByteValue(0x1602, pFirstData[3]); + + // Set initial address(for latch SA, CA) + RegSet16BitValue(0x1600, nWriteAddr); + + // Set initial address(for latch PA) + RegSet16BitValue(0x1600, nWriteAddr); + + // Enable burst mode + RegSetLByteValue(0x1608, 0x21); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; +// szDbBusTxData[1] = 0x00; +// szDbBusTxData[2] = 0x00; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); +} + +static void _DrvFwCtrlMsg28xxIspBurstWriteEFlashDoWrite(u8 *pBufferData, u32 nLength) +{ + u32 i; + u8 szDbBusTxData[3+MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE] = {0}; + + DBG("*** %s() nLength = %d ***\n", __func__, nLength); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + for (i = 0; i < nLength; i ++) + { + szDbBusTxData[3+i] = pBufferData[i]; + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+nLength); +} + +static void _DrvFwCtrlMsg28xxIspBurstWriteEFlashEnd(void) +{ + u8 szDbBusTxData[1] = {0}; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x21; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + szDbBusTxData[0] = 0x7E; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + // Clear burst mode + RegSetLByteValue(0x1608, 0x20); +} + +static void _DrvFwCtrlMsg28xxWriteEFlashStart(u16 nStartAddr, u8 *pFirstData, EmemType_e eEmemType) +{ + u16 nWriteAddr = nStartAddr/4; + + DBG("*** %s() nStartAddr = 0x%x, eEmemType = %d ***\n", __func__, nStartAddr, eEmemType); + + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + + // Set e-flash mode to write mode + RegSet16BitValue(0x1606, 0x0040); + + // Set data align + RegSetLByteValue(0x1640, 0x01); + + if (eEmemType == EMEM_INFO) + { + RegSetLByteValue(0x1607, 0x08); + } + + // Set double buffer + RegSetLByteValue(0x1604, 0x01); + + // Set e-flash mode trigger(Trigger write mode) + RegSetLByteValue(0x1606, 0x81); + + // Set init data + RegSetLByteValue(0x1602, pFirstData[0]); + RegSetLByteValue(0x1602, pFirstData[1]); + RegSetLByteValue(0x1602, pFirstData[2]); + RegSetLByteValue(0x1602, pFirstData[3]); + + // Set initial address(for latch SA, CA) + RegSet16BitValue(0x1600, nWriteAddr); + + // Set initial address(for latch PA) + RegSet16BitValue(0x1600, nWriteAddr); +} + +static void _DrvFwCtrlMsg28xxWriteEFlashDoWrite(u16 nStartAddr, u8 *pBufferData) +{ + u16 nWriteAddr = nStartAddr/4; + + DBG("*** %s() nWriteAddr = %d ***\n", __func__, nWriteAddr); + + // Write data + RegSetLByteValue(0x1602, pBufferData[0]); + RegSetLByteValue(0x1602, pBufferData[1]); + RegSetLByteValue(0x1602, pBufferData[2]); + RegSetLByteValue(0x1602, pBufferData[3]); + + // Set address + RegSet16BitValue(0x1600, nWriteAddr); +} + +static void _DrvFwCtrlMsg28xxWriteEFlashEnd(void) +{ + DBG("*** %s() ***\n", __func__); + + // Do nothing +} + +static void _DrvFwCtrlMsg28xxReadEFlashStart(u16 nStartAddr, EmemType_e eEmemType) +{ + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + + RegSetLByteValue(0x1606, 0x02); + + RegSet16BitValue(0x1600, nStartAddr); + + if (eEmemType == EMEM_MAIN) + { + // Set main block + RegSetLByteValue(0x1607, 0x00); + + // Set main double buffer + RegSetLByteValue(0x1604, 0x01); + + // Set e-flash mode to read mode for main + RegSet16BitValue(0x1606, 0x0001); + } + else if (eEmemType == EMEM_INFO) + { + // Set info block + RegSetLByteValue(0x1607, 0x08); + + // Set info double buffer + RegSetLByteValue(0x1604, 0x01); + + // Set e-flash mode to read mode for info + RegSet16BitValue(0x1606, 0x0801); + } +} + +static void _DrvFwCtrlMsg28xxReadEFlashDoRead(u16 nReadAddr, u8 *pReadData) +{ + u16 nRegData1 = 0, nRegData2 = 0; + + DBG("*** %s() nReadAddr = 0x%x ***\n", __func__, nReadAddr); + + // Set read address + RegSet16BitValue(0x1600, nReadAddr); + + // Read 16+16 bits + nRegData1 = RegGet16BitValue(0x160A); + nRegData2 = RegGet16BitValue(0x160C); + + pReadData[0] = nRegData1 & 0xFF; + pReadData[1] = (nRegData1 >> 8) & 0xFF; + pReadData[2] = nRegData2 & 0xFF; + pReadData[3] = (nRegData2 >> 8) & 0xFF; +} + +static void _DrvFwCtrlMsg28xxReadEFlashEnd(void) +{ + DBG("*** %s() ***\n", __func__); + + // Set read done + RegSetLByteValue(0x1606, 0x02); + + // Unset info flag + RegSetLByteValue(0x1607, 0x00); + + // Clear address + RegSet16BitValue(0x1600, 0x0000); +} + +/* +static void _DrvFwCtrlMsg28xxGetTpVendorCode(u8 *pTpVendorCode) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG28XX) + { + u16 nReadAddr = 0; + u8 szTmpData[4] = {0}; + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + _DrvFwCtrlMsg28xxReadEFlashStart(0x81FA, EMEM_INFO); + nReadAddr = 0x81FA; + + _DrvFwCtrlMsg28xxReadEFlashDoRead(nReadAddr, &szTmpData[0]); + + DBG("szTmpData[0] = 0x%x\n", szTmpData[0]); // add for debug + DBG("szTmpData[1] = 0x%x\n", szTmpData[1]); // add for debug + DBG("szTmpData[2] = 0x%x\n", szTmpData[2]); // add for debug + DBG("szTmpData[3] = 0x%x\n", szTmpData[3]); // add for debug + + _DrvFwCtrlMsg28xxReadEFlashEnd(); + + pTpVendorCode[0] = szTmpData[1]; + pTpVendorCode[1] = szTmpData[2]; + pTpVendorCode[2] = szTmpData[3]; + + DBG("pTpVendorCode[0] = 0x%x , %c \n", pTpVendorCode[0], pTpVendorCode[0]); + DBG("pTpVendorCode[1] = 0x%x , %c \n", pTpVendorCode[1], pTpVendorCode[1]); + DBG("pTpVendorCode[2] = 0x%x , %c \n", pTpVendorCode[2], pTpVendorCode[2]); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + } +} +*/ + +static void _DrvFwCtrlMsg28xxGetSfrAddr3Value(void) +{ + DBG("*** %s() ***\n", __func__); + + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + + // Set e-flash mode to read mode + RegSetLByteValue(0x1606, 0x01); + RegSetLByteValue(0x1610, 0x01); + RegSetLByteValue(0x1607, 0x20); + + // Set read address + RegSetLByteValue(0x1600, 0x03); + RegSetLByteValue(0x1601, 0x00); + + _gSFR_ADDR3_BYTE0_1_VALUE = RegGet16BitValue(0x160A); + _gSFR_ADDR3_BYTE2_3_VALUE = RegGet16BitValue(0x160C); + + DBG("_gSFR_ADDR3_BYTE0_1_VALUE = 0x%4X, _gSFR_ADDR3_BYTE2_3_VALUE = 0x%4X\n", _gSFR_ADDR3_BYTE0_1_VALUE, _gSFR_ADDR3_BYTE2_3_VALUE); +} + +static void _DrvFwCtrlMsg28xxUnsetProtectBit(void) +{ + u8 nB0, nB1, nB2, nB3; + + DBG("*** %s() ***\n", __func__); + + _DrvFwCtrlMsg28xxGetSfrAddr3Value(); + + nB0 = _gSFR_ADDR3_BYTE0_1_VALUE & 0xFF; + nB1 = (_gSFR_ADDR3_BYTE0_1_VALUE & 0xFF00) >> 8; + + nB2 = _gSFR_ADDR3_BYTE2_3_VALUE & 0xFF; + nB3 = (_gSFR_ADDR3_BYTE2_3_VALUE & 0xFF00) >> 8; + + DBG("nB0 = 0x%2X, nB1 = 0x%2X, nB2 = 0x%2X, nB3 = 0x%2X\n", nB0, nB1, nB2, nB3); + + nB2 = nB2 & 0xBF; // 10111111 + nB3 = nB3 & 0xFC; // 11111100 + + DBG("nB0 = 0x%2X, nB1 = 0x%2X, nB2 = 0x%2X, nB3 = 0x%2X\n", nB0, nB1, nB2, nB3); + + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + RegSetLByteValue(0x1610, 0x80); + RegSetLByteValue(0x1607, 0x10); + + // Trigger SFR write + RegSetLByteValue(0x1606, 0x01); + + // Set write data + RegSetLByteValue(0x1602, nB0); + RegSetLByteValue(0x1602, nB1); + RegSetLByteValue(0x1602, nB2); + RegSetLByteValue(0x1602, nB3); + + // Set write address + RegSetLByteValue(0x1600, 0x03); + RegSetLByteValue(0x1601, 0x00); + + // Set TM mode = 0 + RegSetLByteValue(0x1607, 0x00); +} + +static void _DrvFwCtrlMsg28xxSetProtectBit(void) +{ + u8 nB0, nB1, nB2, nB3; + + DBG("*** %s() ***\n", __func__); + + nB0 = _gSFR_ADDR3_BYTE0_1_VALUE & 0xFF; + nB1 = (_gSFR_ADDR3_BYTE0_1_VALUE & 0xFF00) >> 8; + + nB2 = _gSFR_ADDR3_BYTE2_3_VALUE & 0xFF; + nB3 = (_gSFR_ADDR3_BYTE2_3_VALUE & 0xFF00) >> 8; + + DBG("nB0 = 0x%2X, nB1 = 0x%2X, nB2 = 0x%2X, nB3 = 0x%2X\n", nB0, nB1, nB2, nB3); + + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + RegSetLByteValue(0x1610, 0x80); + RegSetLByteValue(0x1607, 0x10); + + // Trigger SFR write + RegSetLByteValue(0x1606, 0x01); + + // Set write data + RegSetLByteValue(0x1602, nB0); + RegSetLByteValue(0x1602, nB1); + RegSetLByteValue(0x1602, nB2); + RegSetLByteValue(0x1602, nB3); + + // Set write address + RegSetLByteValue(0x1600, 0x03); + RegSetLByteValue(0x1601, 0x00); + RegSetLByteValue(0x1606, 0x02); +} + +static void _DrvFwCtrlMsg28xxEraseEmem(EmemType_e eEmemType) +{ + u32 nInfoAddr = 0x20; + u32 nTimeOut = 0; + u8 nRegData = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + DBG("Erase start\n"); + + _DrvFwCtrlMsg28xxAccessEFlashInit(); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Set PROGRAM erase password + RegSet16BitValue(0x1618, 0x5AA5); + + _DrvFwCtrlMsg28xxUnsetProtectBit(); + + if (eEmemType == EMEM_MAIN) // 128KB + { + DBG("Erase main block\n"); + + // Set main block + RegSetLByteValue(0x1607, 0x00); + + // Set e-flash mode to erase mode + RegSetLByteValue(0x1606, 0xC0); + + // Set page erase main + RegSetLByteValue(0x1607, 0x03); + + // e-flash mode trigger + RegSetLByteValue(0x1606, 0xC1); + + nTimeOut = 0; + while (1) // Wait erase done + { + nRegData = RegGetLByteValue(0x160E); + nRegData = (nRegData & BIT3); + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT3) + { + break; + } + + mdelay(10); + + if ((nTimeOut ++) > 10) + { + DBG("Erase main block failed. Timeout.\n"); + + goto EraseEnd; + } + } + } + else if (eEmemType == EMEM_INFO) // 2KB + { + DBG("Erase info block\n"); + + // Set info block + RegSetLByteValue(0x1607, 0x08); + + // Set info double buffer + RegSetLByteValue(0x1604, 0x01); + + // Set e-flash mode to erase mode + RegSetLByteValue(0x1606, 0xC0); + + // Set page erase info + RegSetLByteValue(0x1607, 0x09); + + for (nInfoAddr = 0x20; nInfoAddr <= MSG28XX_EMEM_INFO_MAX_ADDR; nInfoAddr += 0x20) + { + DBG("nInfoAddr = 0x%x\n", nInfoAddr); // add for debug + + // Set address + RegSet16BitValue(0x1600, nInfoAddr); + + // e-flash mode trigger + RegSetLByteValue(0x1606, 0xC1); + + nTimeOut = 0; + while (1) // Wait erase done + { + nRegData = RegGetLByteValue(0x160E); + nRegData = (nRegData & BIT3); + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT3) + { + break; + } + + mdelay(10); + + if ((nTimeOut ++) > 10) + { + DBG("Erase info block failed. Timeout.\n"); + + // Set main block + RegSetLByteValue(0x1607, 0x00); + + goto EraseEnd; + } + } + } + + // Set main block + RegSetLByteValue(0x1607, 0x00); + } + + EraseEnd: + + _DrvFwCtrlMsg28xxSetProtectBit(); + + RegSetLByteValue(0x1606, 0x00); + RegSetLByteValue(0x1607, 0x00); + + // Clear PROGRAM erase password + RegSet16BitValue(0x1618, 0xA55A); + + DBG("Erase end\n"); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); +} + +static void _DrvFwCtrlMsg28xxProgramEmem(EmemType_e eEmemType) +{ + u32 i, j; + u32 nPageNum = 0, nLength = 0, nIndex = 0, nWordNum = 0; + u32 nRetryTime = 0; + u8 nRegData = 0; + u8 szFirstData[MSG28XX_EMEM_SIZE_BYTES_ONE_WORD] = {0}; + u8 szBufferData[MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + DBG("Program start\n"); + + _DrvFwCtrlMsg28xxAccessEFlashInit(); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Set PROGRAM erase password + RegSet16BitValue(0x1618, 0x5AA5); + + _DrvFwCtrlMsg28xxUnsetProtectBit(); + + if (eEmemType == EMEM_MAIN) // Program main block + { + DBG("Program main block\n"); + + nPageNum = (MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024) / MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE; // 128*1024/128=1024 + nIndex = 0; + + for (i = 0; i < nPageNum; i ++) + { + if (i == 0) + { + // Read first data 4 bytes + nLength = MSG28XX_EMEM_SIZE_BYTES_ONE_WORD; + + szFirstData[0] = g_FwData[0][0]; + szFirstData[1] = g_FwData[0][1]; + szFirstData[2] = g_FwData[0][2]; + szFirstData[3] = g_FwData[0][3]; + + _DrvFwCtrlMsg28xxIspBurstWriteEFlashStart(nIndex, &szFirstData[0], MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE*1024, nPageNum, EMEM_MAIN); + + nIndex += nLength; + + nLength = MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE - MSG28XX_EMEM_SIZE_BYTES_ONE_WORD; // 124 = 128 - 4 + + for (j = 0; j < nLength; j ++) + { + szBufferData[j] = g_FwData[0][4+j]; + } + } + else + { + nLength = MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE; + + for (j = 0; j < nLength; j ++) + { + szBufferData[j] = g_FwData[i/8][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE*(i-(8*(i/8)))+j]; + } + } + + _DrvFwCtrlMsg28xxIspBurstWriteEFlashDoWrite(&szBufferData[0], nLength); + + udelay(2000); // delay about 2ms + + nIndex += nLength; + } + + _DrvFwCtrlMsg28xxIspBurstWriteEFlashEnd(); + + // Set write done + RegSet16BitValueOn(0x1606, BIT2); + + // Check RBB + nRegData = RegGetLByteValue(0x160E); + nRetryTime = 0; + + while ((nRegData & BIT3) != BIT3) + { + mdelay(10); + + nRegData = RegGetLByteValue(0x160E); + + if (nRetryTime ++ > 100) + { + DBG("main block can't wait write to done.\n"); + + goto ProgramEnd; + } + } + } + else if (eEmemType == EMEM_INFO) // Program info block + { + DBG("Program info block\n"); + + nPageNum = (MSG28XX_FIRMWARE_INFO_BLOCK_SIZE * 1024) / MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE; // 2*1024/128=16 + nIndex = 0; + nIndex += MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE; + + // Skip firt page(page 0) & Update page 1~14 by isp burst write mode + for (i = 1; i < (nPageNum - 1); i ++) + { + if (i == 1) + { + // Read first data 4 bytes + nLength = MSG28XX_EMEM_SIZE_BYTES_ONE_WORD; + + szFirstData[0] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE]; + szFirstData[1] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+1]; + szFirstData[2] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+2]; + szFirstData[3] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+3]; + + _DrvFwCtrlMsg28xxIspBurstWriteEFlashStart(nIndex, &szFirstData[0], MSG28XX_FIRMWARE_INFO_BLOCK_SIZE*1024, nPageNum-1, EMEM_INFO); + + nIndex += nLength; + + nLength = MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE - MSG28XX_EMEM_SIZE_BYTES_ONE_WORD; // 124 = 128 - 4 + + for (j = 0; j < nLength; j ++) + { + szBufferData[j] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+4+j]; + } + } + else + { + nLength = MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE; + + if (i < 8) // 1 < i < 8 + { + for (j = 0; j < nLength; j ++) + { + szBufferData[j] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE*i+j]; + } + } + else // i >= 8 + { + for (j = 0; j < nLength; j ++) + { + szBufferData[j] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+1][MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE*(i-8)+j]; + } + } + } + + _DrvFwCtrlMsg28xxIspBurstWriteEFlashDoWrite(&szBufferData[0], nLength); + + udelay(2000); // delay about 2ms + + nIndex += nLength; + } + + _DrvFwCtrlMsg28xxIspBurstWriteEFlashEnd(); + + // Set write done + RegSet16BitValueOn(0x1606, BIT2); + + // Check RBB + nRegData = RegGetLByteValue(0x160E); + nRetryTime = 0; + + while ((nRegData & BIT3) != BIT3) + { + mdelay(10); + + nRegData = RegGetLByteValue(0x160E); + + if (nRetryTime ++ > 100) + { + DBG("Info block page 1~14 can't wait write to done.\n"); + + goto ProgramEnd; + } + } + + RegSet16BitValueOff(0x1EBE, BIT15); + + // Update page 15 by write mode + nIndex = 15 * MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE; + nWordNum = MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE / MSG28XX_EMEM_SIZE_BYTES_ONE_WORD; // 128/4=32 + nLength = MSG28XX_EMEM_SIZE_BYTES_ONE_WORD; + + for (i = 0; i < nWordNum; i ++) + { + if (i == 0) + { + szFirstData[0] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+1][7*MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE]; + szFirstData[1] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+1][7*MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+1]; + szFirstData[2] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+1][7*MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+2]; + szFirstData[3] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+1][7*MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+3]; + + _DrvFwCtrlMsg28xxWriteEFlashStart(nIndex, &szFirstData[0], EMEM_INFO); + } + else + { + for (j = 0; j < nLength; j ++) + { + szFirstData[j] = g_FwData[MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+1][7*MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE+(4*i)+j]; + } + + _DrvFwCtrlMsg28xxWriteEFlashDoWrite(nIndex, &szFirstData[0]); + } + + udelay(2000); // delay about 2ms + + nIndex += nLength; + } + + _DrvFwCtrlMsg28xxWriteEFlashEnd(); + + // Set write done + RegSet16BitValueOn(0x1606, BIT2); + + // Check RBB + nRegData = RegGetLByteValue(0x160E); + nRetryTime = 0; + + while ((nRegData & BIT3) != BIT3) + { + mdelay(10); + + nRegData = RegGetLByteValue(0x160E); + + if (nRetryTime ++ > 100) + { + DBG("Info block page 15 can't wait write to done.\n"); + + goto ProgramEnd; + } + } + } + + ProgramEnd: + + _DrvFwCtrlMsg28xxSetProtectBit(); + + // Clear PROGRAM erase password + RegSet16BitValue(0x1618, 0xA55A); + + DBG("Program end\n"); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); +} + +static u16 _DrvFwCtrlMsg28xxGetSwId(EmemType_e eEmemType) +{ + u16 nRetVal = 0; + u16 nReadAddr = 0; + u8 szTmpData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + _DrvFwCtrlMsg28xxReadEFlashStart(0x7FFD, EMEM_MAIN); + nReadAddr = 0x7FFD; + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + _DrvFwCtrlMsg28xxReadEFlashStart(0x81FB, EMEM_INFO); + nReadAddr = 0x81FB; + } + + _DrvFwCtrlMsg28xxReadEFlashDoRead(nReadAddr, &szTmpData[0]); + + _DrvFwCtrlMsg28xxReadEFlashEnd(); + + /* + Ex. SW ID in Main Block : + Major low byte at address 0x7FFD + + SW ID in Info Block : + Major low byte at address 0x81FB + */ + + nRetVal = (szTmpData[1] << 8); + nRetVal |= szTmpData[0]; + + DBG("SW ID = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EmemType_e eEmemType) +{ + u32 nRetVal = 0; + u32 nRetryTime = 0; + u32 nCrcEndAddr = 0; + u16 nCrcDown = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + _DrvFwCtrlMsg28xxAccessEFlashInit(); + + if (eEmemType == EMEM_MAIN) + { + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + + // Set read flag + RegSet16BitValue(0x1610, 0x0001); + + // Mode reset main block + RegSet16BitValue(0x1606, 0x0000); + + // CRC reset + RegSet16BitValue(0x1620, 0x0002); + + RegSet16BitValue(0x1620, 0x0000); + + // Set CRC e-flash block start address => Main Block : 0x0000 ~ 0x7FFE + RegSet16BitValue(0x1600, 0x0000); + + nCrcEndAddr = (MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE*1024)/4-2; + + RegSet16BitValue(0x1622, nCrcEndAddr); + + // Trigger CRC check + RegSet16BitValue(0x1620, 0x0001); + + nCrcDown = RegGet16BitValue(0x1620); + + nRetryTime = 0; + while ((nCrcDown >> 15) == 0) + { + mdelay(10); + + nCrcDown = RegGet16BitValue(0x1620); + nRetryTime ++; + + if (nRetryTime > 30) + { + DBG("Wait main block nCrcDown failed.\n"); + break; + } + } + + nRetVal = RegGet16BitValue(0x1626); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x1624); + } + else if (eEmemType == EMEM_INFO) + { + // Disable cpu read flash + RegSetLByteValue(0x1608, 0x20); + RegSetLByteValue(0x1606, 0x20); + + // Set read flag + RegSet16BitValue(0x1610, 0x0001); + + // Mode reset info block + RegSet16BitValue(0x1606, 0x0800); + + RegSetLByteValue(0x1604, 0x01); + + // CRC reset + RegSet16BitValue(0x1620, 0x0002); + + RegSet16BitValue(0x1620, 0x0000); + + // Set CRC e-flash block start address => Info Block : 0x0020 ~ 0x01FE + RegSet16BitValue(0x1600, 0x0020); + RegSet16BitValue(0x1622, 0x01FE); + + // Trigger CRC check + RegSet16BitValue(0x1620, 0x0001); + + nCrcDown = RegGet16BitValue(0x1620); + + nRetryTime = 0; + while ((nCrcDown >> 15) == 0) + { + mdelay(10); + + nCrcDown = RegGet16BitValue(0x1620); + nRetryTime ++; + + if (nRetryTime > 30) + { + DBG("Wait info block nCrcDown failed.\n"); + break; + } + } + + nRetVal = RegGet16BitValue(0x1626); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x1624); + } + + DBG("Hardware CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg28xxUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 nCrcMain = 0, nCrcMainTp = 0; + u32 nCrcInfo = 0, nCrcInfoTp = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + ///////////////////////// + // Erase + ///////////////////////// + + if (eEmemType == EMEM_ALL) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg28xxEraseEmem(EMEM_INFO); + } + else if (eEmemType == EMEM_MAIN) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_MAIN); + } + else if (eEmemType == EMEM_INFO) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_INFO); + } + + DBG("erase OK\n"); + + ///////////////////////// + // Program + ///////////////////////// + + if (eEmemType == EMEM_ALL) + { + _DrvFwCtrlMsg28xxProgramEmem(EMEM_MAIN); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_INFO); + } + else if (eEmemType == EMEM_MAIN) + { + _DrvFwCtrlMsg28xxProgramEmem(EMEM_MAIN); + } + else if (eEmemType == EMEM_INFO) + { + _DrvFwCtrlMsg28xxProgramEmem(EMEM_INFO); + } + + DBG("program OK\n"); + + /* Calculate main block & info block CRC by device driver itself */ + _DrvFwCtrlMsg28xxConvertFwDataTwoDimenToOneDimen(szFwData, _gOneDimenFwData); + + /* Read main block CRC from TP */ + if (eEmemType == EMEM_ALL) + { + nCrcMain = _DrvFwCtrlMsg28xxCalculateCrc(_gOneDimenFwData, 0, MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE*1024-MSG28XX_EMEM_SIZE_BYTES_ONE_WORD); + nCrcInfo = _DrvFwCtrlMsg28xxCalculateCrc(_gOneDimenFwData, MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE*1024+MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE, MSG28XX_FIRMWARE_INFO_BLOCK_SIZE*1024-MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE-MSG28XX_EMEM_SIZE_BYTES_ONE_WORD); + + nCrcMainTp = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + nCrcInfoTp = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_INFO); + } + else if (eEmemType == EMEM_MAIN) + { + nCrcMain = _DrvFwCtrlMsg28xxCalculateCrc(_gOneDimenFwData, 0, MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE*1024-MSG28XX_EMEM_SIZE_BYTES_ONE_WORD); + + nCrcMainTp = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + } + else if (eEmemType == EMEM_INFO) + { + nCrcInfo = _DrvFwCtrlMsg28xxCalculateCrc(_gOneDimenFwData, MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE*1024+MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE, MSG28XX_FIRMWARE_INFO_BLOCK_SIZE*1024-MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE-MSG28XX_EMEM_SIZE_BYTES_ONE_WORD); + + nCrcInfoTp = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_INFO); + } + + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", + nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + if (eEmemType == EMEM_ALL) + { + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + } + else if (eEmemType == EMEM_MAIN) + { + if (nCrcMainTp != nCrcMain) + { + DBG("Update FAILED\n"); + + return -1; + } + } + else if (eEmemType == EMEM_INFO) + { + if (nCrcInfoTp != nCrcInfo) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlUpdateFirmwareCash(u8 szFwData[][1024], EmemType_e eEmemType) +{ + DBG("*** %s() ***\n", __func__); + + DBG("chip type = 0x%x\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) // (0x03) + { + return _DrvFwCtrlMsg26xxmUpdateFirmware(szFwData, eEmemType); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) // (0x85) + { + u16 eSwId = 0x0000; + u16 eVendorId = 0x0000; + + eVendorId = szFwData[129][1005] << 8 | szFwData[129][1004]; // Retrieve major from info block + eSwId = _DrvFwCtrlMsg28xxGetSwId(EMEM_INFO); + + DBG("eVendorId = 0x%x, eSwId = 0x%x\n", eVendorId, eSwId); + + // Check if the vendor id of the update firmware bin file is equal to the vendor id on e-flash. YES => allow update, NO => not allow update + if (eSwId != eVendorId) + { + DrvPlatformLyrTouchDeviceResetHw(); // Reset HW here to avoid touch may be not worked after get sw id. + + DBG("The vendor id of the update firmware bin file is different from the vendor id on e-flash. Not allow to update.\n"); + + return -1; + } + else + { + return _DrvFwCtrlMsg28xxUpdateFirmware(szFwData, EMEM_MAIN); + } + } + else + { + DBG("Undefined chip type.\n"); + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + return -1; + } +} + +static s32 _DrvFwCtrlUpdateFirmwareBySdCard(const char *pFilePath) +{ + s32 nRetVal = 0; + struct file *pfile = NULL; + struct inode *inode; + s32 fsize = 0; + u8 *pbt_buf = NULL; + mm_segment_t old_fs; + loff_t pos; + u16 eSwId = 0x0000; + u16 eVendorId = 0x0000; + + DBG("*** %s() ***\n", __func__); + + pfile = filp_open(pFilePath, O_RDONLY, 0); + if (IS_ERR(pfile)) + { + DBG("Error occured while opening file %s.\n", pFilePath); + return -1; + } + + inode = pfile->f_dentry->d_inode; + fsize = inode->i_size; + + DBG("fsize = %d\n", fsize); + + if (fsize <= 0) + { + filp_close(pfile, NULL); + return -1; + } + + // read firmware + pbt_buf = kmalloc(fsize, GFP_KERNEL); + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + pos = 0; + vfs_read(pfile, pbt_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + + _DrvFwCtrlStoreFirmwareData(pbt_buf, fsize); + + kfree(pbt_buf); + + DrvPlatformLyrDisableFingerTouchReport(); + + DrvPlatformLyrTouchDeviceResetHw(); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + eVendorId = g_FwData[0][0x2B] <<8 | g_FwData[0][0x2A]; + eSwId = _DrvFwCtrlMsg26xxmGetSwId(EMEM_MAIN); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + eVendorId = g_FwData[127][1013] <<8 | g_FwData[127][1012]; + eSwId = _DrvFwCtrlMsg28xxGetSwId(EMEM_MAIN); + } + + DBG("eVendorId = 0x%x, eSwId = 0x%x\n", eVendorId, eSwId); + + if (eSwId == eVendorId) + { + if ((g_ChipType == CHIP_TYPE_MSG26XXM && fsize == 40960/* 40KB */) || (g_ChipType == CHIP_TYPE_MSG28XX && fsize == 133120/* 130KB */)) + { + nRetVal = _DrvFwCtrlUpdateFirmwareCash(g_FwData, EMEM_ALL); + } + else + { + DBG("The file size of the update firmware bin file is not supported, fsize = %d\n", fsize); + nRetVal = -1; + } + } + else + { + DBG("The vendor id of the update firmware bin file is different from the vendor id on e-flash. Not allow to update.\n"); + nRetVal = -1; + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DrvPlatformLyrEnableFingerTouchReport(); + + return nRetVal; +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +void DrvFwCtrlOpenGestureWakeup(u32 *pMode) +{ + u8 szDbBusTxData[4] = {0}; + u32 i = 0; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + DBG("wakeup mode 0 = 0x%x\n", pMode[0]); + DBG("wakeup mode 1 = 0x%x\n", pMode[1]); + +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = ((pMode[1] & 0xFF000000) >> 24); + szDbBusTxData[3] = ((pMode[1] & 0x00FF0000) >> 16); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mdelay(10); // delay 10ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 0 success\n"); + break; + } + + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 0 failed\n"); + } + + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = ((pMode[1] & 0x0000FF00) >> 8); + szDbBusTxData[3] = ((pMode[1] & 0x000000FF) >> 0); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mdelay(10); // delay 10ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 1 success\n"); + break; + } + + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 1 failed\n"); + } + + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x02; + szDbBusTxData[2] = ((pMode[0] & 0xFF000000) >> 24); + szDbBusTxData[3] = ((pMode[0] & 0x00FF0000) >> 16); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mdelay(10); // delay 10ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 2 success\n"); + break; + } + + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 2 failed\n"); + } + + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x03; + szDbBusTxData[2] = ((pMode[0] & 0x0000FF00) >> 8); + szDbBusTxData[3] = ((pMode[0] & 0x000000FF) >> 0); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mdelay(10); // delay 10ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 3 success\n"); + break; + } + + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 3 failed\n"); + } + + g_GestureWakeupFlag = 1; // gesture wakeup is enabled + +#else + + szDbBusTxData[0] = 0x58; + szDbBusTxData[1] = ((pMode[0] & 0x0000FF00) >> 8); + szDbBusTxData[2] = ((pMode[0] & 0x000000FF) >> 0); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + + if (rc > 0) + { + DBG("Enable gesture wakeup success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup failed\n"); + } + + g_GestureWakeupFlag = 1; // gesture wakeup is enabled +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE +} + +void DrvFwCtrlCloseGestureWakeup(void) +{ + DBG("*** %s() ***\n", __func__); + + g_GestureWakeupFlag = 0; // gesture wakeup is disabled +} + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +void DrvFwCtrlOpenGestureDebugMode(u8 nGestureFlag) +{ + u8 szDbBusTxData[3] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + DBG("Gesture Flag = 0x%x\n", nGestureFlag); + + szDbBusTxData[0] = 0x30; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = nGestureFlag; + + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc < 0) + { + DBG("Enable gesture debug mode failed\n"); + } + else + { + DBG("Enable gesture debug mode success\n"); + } + + g_GestureDebugMode = 1; // gesture debug mode is enabled +} + +void DrvFwCtrlCloseGestureDebugMode(void) +{ + u8 szDbBusTxData[3] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x30; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x00; + + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc < 0) + { + DBG("Disable gesture debug mode failed\n"); + } + else + { + DBG("Disable gesture debug mode success\n"); + } + + g_GestureDebugMode = 0; // gesture debug mode is disabled +} +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +static void _DrvFwCtrlCoordinate(u8 *pRawData, u32 *pTranX, u32 *pTranY) +{ + u32 nX; + u32 nY; +#ifdef CONFIG_SWAP_X_Y + u32 nTempX; + u32 nTempY; +#endif + + nX = (((pRawData[0] & 0xF0) << 4) | pRawData[1]); // parse the packet to coordinate + nY = (((pRawData[0] & 0x0F) << 8) | pRawData[2]); + + DBG("[x,y]=[%d,%d]\n", nX, nY); + +#ifdef CONFIG_SWAP_X_Y + nTempY = nX; + nTempX = nY; + nX = nTempX; + nY = nTempY; +#endif + +#ifdef CONFIG_REVERSE_X + nX = 2047 - nX; +#endif + +#ifdef CONFIG_REVERSE_Y + nY = 2047 - nY; +#endif + + /* + * pRawData[0]~pRawData[2] : the point abs, + * pRawData[0]~pRawData[2] all are 0xFF, release touch + */ + if ((pRawData[0] == 0xFF) && (pRawData[1] == 0xFF) && (pRawData[2] == 0xFF)) + { + *pTranX = 0; // final X coordinate + *pTranY = 0; // final Y coordinate + } + else + { + /* one touch point */ + *pTranX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + *pTranY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY); + DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, *pTranX, *pTranY); + } +} +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +static void _DrvFwCtrlReadReadDQMemStart(void) +{ + u8 nParCmdSelUseCfg = 0x7F; + u8 nParCmdAdByteEn0 = 0x50; + u8 nParCmdAdByteEn1 = 0x51; + u8 nParCmdDaByteEn0 = 0x54; + u8 nParCmdUSetSelB0 = 0x80; + u8 nParCmdUSetSelB1 = 0x82; + u8 nParCmdSetSelB2 = 0x85; + u8 nParCmdIicUse = 0x35; + //u8 nParCmdWr = 0x10; + + DBG("*** %s() ***\n", __func__); + + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSelUseCfg, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdDaByteEn0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdUSetSelB0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdUSetSelB1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSetSelB2, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdIicUse, 1); +} + +static void _DrvFwCtrlReadReadDQMemEnd(void) +{ + u8 nParCmdNSelUseCfg = 0x7E; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdNSelUseCfg, 1); +} + +u32 DrvFwCtrlReadDQMemValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF}; + u8 rx_data[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + DBG("DQMem Addr = 0x%x\n", nAddr); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + mdelay(100); + + _DrvFwCtrlReadReadDQMemStart(); + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data[0], 4); + + _DrvFwCtrlReadReadDQMemEnd(); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return (rx_data[3] <<24 | rx_data[2] <<16 | rx_data[1] << 8 | rx_data[0]); +} + +void DrvFwCtrlWriteDQMemValue(u16 nAddr, u32 nData) +{ + u8 szDbBusTxData[7] = {0}; + + DBG("*** %s() ***\n", __func__); + + DBG("DQMem Addr = 0x%x\n", nAddr); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + mdelay(100); + + _DrvFwCtrlReadReadDQMemStart(); + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = ((nAddr >> 8) & 0xff); + szDbBusTxData[2] = (nAddr & 0xff); + szDbBusTxData[3] = nData & 0x000000FF; + szDbBusTxData[4] = ((nData & 0x0000FF00) >> 8); + szDbBusTxData[5] = ((nData & 0x00FF0000) >> 16); + szDbBusTxData[6] = ((nData & 0xFF000000) >> 24); + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 7); + + _DrvFwCtrlReadReadDQMemEnd(); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + mdelay(100); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//-------------------------Start of SW ID for MSG26XXM----------------------------// + +static u32 _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EmemType_e eEmemType, u8 nIsNeedResetHW) +{ + u32 nRetVal = 0; + u16 nRegData = 0; + + DBG("*** %s() eEmemType = %d, nIsNeedResetHW = %d ***\n", __func__, eEmemType, nIsNeedResetHW); + + if (1 == nIsNeedResetHW) + { + DrvPlatformLyrTouchDeviceResetHw(); + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xDF4C); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x9432); + + if (eEmemType == EMEM_MAIN) // Read calculated main block CRC(32K-8) from register + { + nRetVal = RegGet16BitValue(0x3C80); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x3C82); + + DBG("Main Block CRC = 0x%x\n", nRetVal); + } + else if (eEmemType == EMEM_INFO) // Read calculated info block CRC(8K) from register + { + nRetVal = RegGet16BitValue(0x3CA0); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x3CA2); + + DBG("Info Block CRC = 0x%x\n", nRetVal); + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg26xxmRetrieveFirmwareCrcFromMainBlock(EmemType_e eEmemType) +{ + u32 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + szDbBusTxData[0] = 0x72; + if (eEmemType == EMEM_MAIN) // Read main block CRC(32K-8) from main block + { + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0xF8; + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(8K) from main block + { + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0xFC; + } + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + /* + The order of 4 bytes [ 0 : 1 : 2 : 3 ] + Ex. CRC32 = 0x12345678 + 0x7FF8 = 0x78, 0x7FF9 = 0x56, + 0x7FFA = 0x34, 0x7FFB = 0x12 + */ + + nRetVal = szDbBusRxData[3]; + nRetVal = (nRetVal << 8) | szDbBusRxData[2]; + nRetVal = (nRetVal << 8) | szDbBusRxData[1]; + nRetVal = (nRetVal << 8) | szDbBusRxData[0]; + + DBG("CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg26xxmRetrieveInfoCrcFromInfoBlock(void) +{ + u32 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + + // Read info CRC(8K-4) from info block + szDbBusTxData[0] = 0x72; + szDbBusTxData[1] = 0x80; + szDbBusTxData[2] = 0x00; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + nRetVal = szDbBusRxData[3]; + nRetVal = (nRetVal << 8) | szDbBusRxData[2]; + nRetVal = (nRetVal << 8) | szDbBusRxData[1]; + nRetVal = (nRetVal << 8) | szDbBusRxData[0]; + + DBG("CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(u8 szTmpBuf[][1024], EmemType_e eEmemType) +{ + u32 nRetVal = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + if (szTmpBuf != NULL) + { + if (eEmemType == EMEM_MAIN) // Read main block CRC(32K-8) from bin file + { + nRetVal = szTmpBuf[31][1019]; + nRetVal = (nRetVal << 8) | szTmpBuf[31][1018]; + nRetVal = (nRetVal << 8) | szTmpBuf[31][1017]; + nRetVal = (nRetVal << 8) | szTmpBuf[31][1016]; + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(8K) from bin file + { + nRetVal = szTmpBuf[31][1023]; + nRetVal = (nRetVal << 8) | szTmpBuf[31][1022]; + nRetVal = (nRetVal << 8) | szTmpBuf[31][1021]; + nRetVal = (nRetVal << 8) | szTmpBuf[31][1020]; + } + } + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg26xxmCalculateInfoCrcByDeviceDriver(void) +{ + u32 nRetVal = 0xffffffff; + u32 i, j; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + DrvCommonCrcInitTable(); + + // Read info data(8K) from info block + szDbBusTxData[0] = 0x72; + szDbBusTxData[3] = 0x00; // read 128 bytes + szDbBusTxData[4] = 0x80; + + for (i = 0; i < 8; i ++) + { + for (j = 0; j < 8; j ++) + { + szDbBusTxData[1] = 0x80 + (i*0x04) + (((j*128)&0xff00)>>8); + szDbBusTxData[2] = (j*128)&0x00ff; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + + // Receive info data + IicReadData(SLAVE_I2C_ID_DWI2C, &_gTempData[j*128], 128); + } + + if (i == 0) + { + for (j = 4; j < 1024; j ++) + { + nRetVal = DrvCommonCrcGetValue(_gTempData[j], nRetVal); + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nRetVal = DrvCommonCrcGetValue(_gTempData[j], nRetVal); + } + } + } + + nRetVal = nRetVal ^ 0xffffffff; + + DBG("Info(8K-4) CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg26xxmCompare8BytesForCrc(u8 szTmpBuf[][1024]) +{ + s32 nRetVal = -1; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[8] = {0}; + u8 crc[8] = {0}; + + DBG("*** %s() ***\n", __func__); + + // Read 8 bytes from bin file + if (szTmpBuf != NULL) + { + crc[0] = szTmpBuf[31][1016]; + crc[1] = szTmpBuf[31][1017]; + crc[2] = szTmpBuf[31][1018]; + crc[3] = szTmpBuf[31][1019]; + crc[4] = szTmpBuf[31][1020]; + crc[5] = szTmpBuf[31][1021]; + crc[6] = szTmpBuf[31][1022]; + crc[7] = szTmpBuf[31][1023]; + } + + // Read 8 bytes from the firmware on e-flash + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + szDbBusTxData[0] = 0x72; + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0xF8; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x08; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 8); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + if (crc[0] == szDbBusRxData[0] + && crc[1] == szDbBusRxData[1] + && crc[2] == szDbBusRxData[2] + && crc[3] == szDbBusRxData[3] + && crc[4] == szDbBusRxData[4] + && crc[5] == szDbBusRxData[5] + && crc[6] == szDbBusRxData[6] + && crc[7] == szDbBusRxData[7]) + { + nRetVal = 0; + } + else + { + nRetVal = -1; + } + + DBG("compare 8bytes for CRC = %d\n", nRetVal); + + return nRetVal; +} + +static void _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EmemType_e eEmemType) +{ + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DBG("erase 0\n"); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0x78C5); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + DBG("erase 1\n"); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // Set PROGRAM password + RegSet16BitValue(0x161A, 0xABBA); //bank:emem, addr:h000D + + if (eEmemType == EMEM_INFO) + { + RegSet16BitValue(0x1600, 0x8000); //bank:emem, addr:h0000 + } + + // Clear pce + RegSetLByteValue(0x1618, 0x80); //bank:emem, addr:h000C + + DBG("erase 2\n"); + + // Clear setting + RegSetLByteValue(0x1618, 0x40); //bank:emem, addr:h000C + + mdelay(10); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); //bank:emem, addr:h000C + + DBG("erase 3\n"); + + // Trigger erase + if (eEmemType == EMEM_ALL) + { + RegSetLByteValue(0x160E, 0x08); //all chip //bank:emem, addr:h0007 + } + else if (eEmemType == EMEM_MAIN || eEmemType == EMEM_INFO) + { + RegSetLByteValue(0x160E, 0x04); //sector //bank:emem, addr:h0007 + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + mdelay(200); + + DBG("erase OK\n"); +} + +static void _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EmemType_e eEmemType) +{ + u32 nStart = 0, nEnd = 0; + u32 i, j; + u16 nRegData = 0; +// u16 nRegData2 = 0, nRegData3 = 0; // add for debug + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DBG("program 0\n"); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + if (eEmemType == EMEM_INFO || eEmemType == EMEM_MAIN) + { + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0x78C5); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + nRegData = RegGet16BitValue(0x1618); +// DBG("*** reg(0x16, 0x18) = 0x%x ***\n", nRegData); // add for debug + + nRegData |= 0x40; +// DBG("*** nRegData = 0x%x ***\n", nRegData); // add for debug + + RegSetLByteValue(0x1618, nRegData); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + } + + DBG("program 1\n"); + + RegSet16BitValue(0x0F52, 0xDB00); // add for analysis + + // Check_Loader_Ready: Polling 0x3CE4 is 0x1C70 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 +// DBG("*** reg(0x3C, 0xE4) = 0x%x ***\n", nRegData); // add for debug + +// nRegData2 = RegGet16BitValue(0x0F00); // add for debug +// DBG("*** reg(0x0F, 0x00) = 0x%x ***\n", nRegData2); + +// nRegData3 = RegGet16BitValue(0x1E04); // add for debug +// DBG("*** reg(0x1E, 0x04) = 0x%x ***\n", nRegData3); + + } while (nRegData != 0x1C70); + + DBG("program 2\n"); + + if (eEmemType == EMEM_ALL) + { + RegSet16BitValue(0x3CE4, 0xE38F); //all chip + + nStart = 0; + nEnd = MSG26XXM_FIRMWARE_WHOLE_SIZE; //32K + 8K + } + else if (eEmemType == EMEM_MAIN) + { + RegSet16BitValue(0x3CE4, 0x7731); //main block + + nStart = 0; + nEnd = MSG26XXM_FIRMWARE_MAIN_BLOCK_SIZE; //32K + } + else if (eEmemType == EMEM_INFO) + { + RegSet16BitValue(0x3CE4, 0xB9D6); //info block + + nStart = MSG26XXM_FIRMWARE_MAIN_BLOCK_SIZE; + nEnd = MSG26XXM_FIRMWARE_MAIN_BLOCK_SIZE + MSG26XXM_FIRMWARE_INFO_BLOCK_SIZE; + } + + // Check_Loader_Ready2Program: Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + DBG("program 3\n"); + + for (i = nStart; i < nEnd; i ++) + { + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &g_FwData[i][j*128], 128); + } + + mdelay(100); + + // Check_Program_Done: Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + // Continue_Program + RegSet16BitValue(0x3CE4, 0x2F43); + } + + DBG("program 4\n"); + + // Notify_Write_Done + RegSet16BitValue(0x3CE4, 0x1380); + mdelay(100); + + DBG("program 5\n"); + + // Check_CRC_Done: Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + + DBG("program 6\n"); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + mdelay(300); + + DBG("program OK\n"); +} + +static s32 _DrvFwCtrlMsg26xxmUpdateFirmwareBySwId(void) +{ + s32 nRetVal = -1; + u32 nCrcInfoA = 0, nCrcInfoB = 0, nCrcMainA = 0, nCrcMainB = 0; + + DBG("*** %s() ***\n", __func__); + + DBG("_gIsUpdateInfoBlockFirst = %d, g_IsUpdateFirmware = 0x%x\n", _gIsUpdateInfoBlockFirst, g_IsUpdateFirmware); + + if (_gIsUpdateInfoBlockFirst == 1) + { + if ((g_IsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EMEM_INFO); + _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_INFO, 0); + + DBG("nCrcInfoA = 0x%x, nCrcInfoB = 0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EMEM_MAIN); + _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_MAIN, 0); + + DBG("nCrcMainA = 0x%x, nCrcMainB = 0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + nRetVal = _DrvFwCtrlMsg26xxmCompare8BytesForCrc(g_FwData); + + if (nRetVal == 0) + { + g_IsUpdateFirmware = 0x00; + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else if ((g_IsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EMEM_MAIN); + _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_MAIN, 0); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + nRetVal = _DrvFwCtrlMsg26xxmCompare8BytesForCrc(g_FwData); + + if (nRetVal == 0) + { + g_IsUpdateFirmware = 0x00; + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + } + else //_gIsUpdateInfoBlockFirst == 0 + { + if ((g_IsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EMEM_MAIN); + _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_MAIN, 0); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EMEM_INFO); + _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_INFO, 0); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + nRetVal = _DrvFwCtrlMsg26xxmCompare8BytesForCrc(g_FwData); + + if (nRetVal == 0) + { + g_IsUpdateFirmware = 0x00; + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else if ((g_IsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg26xxmEraseFirmwareOnEFlash(EMEM_INFO); + _DrvFwCtrlMsg26xxmProgramFirmwareOnEFlash(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg26xxmRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_INFO, 0); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + nRetVal = _DrvFwCtrlMsg26xxmCompare8BytesForCrc(g_FwData); + + if (nRetVal == 0) + { + g_IsUpdateFirmware = 0x00; + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + } + + return nRetVal; +} + +void _DrvFwCtrlMsg26xxmCheckFirmwareUpdateBySwId(void) +{ + u32 nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB; + u32 i; + u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0; + u16 nMajor = 0, nMinor = 0; + u8 *pVersion = NULL; + Msg26xxmSwId_e eSwId = MSG26XXM_SW_ID_UNDEFINED; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrDisableFingerTouchReport(); + + nCrcMainA = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_MAIN, 1); + nCrcMainB = _DrvFwCtrlMsg26xxmRetrieveFirmwareCrcFromMainBlock(EMEM_MAIN); + + nCrcInfoA = _DrvFwCtrlMsg26xxmCalculateFirmwareCrcFromEFlash(EMEM_INFO, 1); + nCrcInfoB = _DrvFwCtrlMsg26xxmRetrieveFirmwareCrcFromMainBlock(EMEM_INFO); + + _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id"); + INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork); + + DBG("nCrcMainA=0x%x, nCrcInfoA=0x%x, nCrcMainB=0x%x, nCrcInfoB=0x%x\n", nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB); + + if (nCrcMainA == nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 1. Main Block:OK, Info Block:OK + { + eSwId = _DrvFwCtrlMsg26xxmGetSwId(EMEM_MAIN); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG26XXM_SW_ID_XXXX) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg26xxm_xxxx_update_bin[0][0x2B]<<8 | msg26xxm_xxxx_update_bin[0][0x2A]; + nUpdateBinMinor = msg26xxm_xxxx_update_bin[0][0x2D]<<8 | msg26xxm_xxxx_update_bin[0][0x2C]; +#else // By one dimensional array + nUpdateBinMajor = msg26xxm_xxxx_update_bin[0x002B]<<8 | msg26xxm_xxxx_update_bin[0x002A]; + nUpdateBinMinor = msg26xxm_xxxx_update_bin[0x002D]<<8 | msg26xxm_xxxx_update_bin[0x002C]; +#endif + } + else if (eSwId == MSG26XXM_SW_ID_YYYY) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg26xxm_yyyy_update_bin[0][0x2B]<<8 | msg26xxm_yyyy_update_bin[0][0x2A]; + nUpdateBinMinor = msg26xxm_yyyy_update_bin[0][0x2D]<<8 | msg26xxm_yyyy_update_bin[0][0x2C]; +#else // By one dimensional array + nUpdateBinMajor = msg26xxm_yyyy_update_bin[0x002B]<<8 | msg26xxm_yyyy_update_bin[0x002A]; + nUpdateBinMinor = msg26xxm_yyyy_update_bin[0x002D]<<8 | msg26xxm_yyyy_update_bin[0x002C]; +#endif + } + else //eSwId == MSG26XXM_SW_ID_UNDEFINED + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG26XXM_SW_ID_UNDEFINED; + nUpdateBinMajor = 0; + nUpdateBinMinor = 0; + } + + DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion); + + DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor); + + if (nUpdateBinMinor > nMinor) + { + if (eSwId == MSG26XXM_SW_ID_XXXX) + { + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg26xxm_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg26xxm_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG26XXM_SW_ID_YYYY) + { + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg26xxm_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg26xxm_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG26XXM_SW_ID_UNDEFINED; + } + + if (eSwId < MSG26XXM_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else if (nCrcMainA == nCrcMainB && nCrcInfoA != nCrcInfoB) // Case 2. Main Block:OK, Info Block:FAIL + { + eSwId = _DrvFwCtrlMsg26xxmGetSwId(EMEM_MAIN); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG26XXM_SW_ID_XXXX) + { + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg26xxm_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg26xxm_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG26XXM_SW_ID_YYYY) + { + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg26xxm_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg26xxm_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG26XXM_SW_ID_UNDEFINED; + } + + if (eSwId < MSG26XXM_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else // Case 3. Main Block:FAIL, Info Block:FAIL/OK + { + nCrcInfoA = _DrvFwCtrlMsg26xxmRetrieveInfoCrcFromInfoBlock(); + nCrcInfoB = _DrvFwCtrlMsg26xxmCalculateInfoCrcByDeviceDriver(); + + DBG("8K-4 : nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) // Check if info block is actually OK. + { + eSwId = _DrvFwCtrlMsg26xxmGetSwId(EMEM_INFO); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG26XXM_SW_ID_XXXX) + { + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg26xxm_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg26xxm_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG26XXM_SW_ID_YYYY) + { + for (i = 0; i < MSG26XXM_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg26xxm_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg26xxm_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG26XXM_SW_ID_UNDEFINED; + } + + if (eSwId < MSG26XXM_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 0; // Set 0 for indicating main block is broken + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("Info block is broken.\n"); + } + } + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); +} + +//-------------------------End of SW ID for MSG26XXM----------------------------// + +//-------------------------Start of SW ID for MSG28XX----------------------------// + +static u32 _DrvFwCtrlMsg28xxRetrieveFirmwareCrcFromEFlash(EmemType_e eEmemType) +{ + u32 nRetVal = 0; + u16 nReadAddr = 0; + u8 szTmpData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + if (eEmemType == EMEM_MAIN) // Read main block CRC(128KB-4) from main block + { + _DrvFwCtrlMsg28xxReadEFlashStart(0x7FFF, EMEM_MAIN); + nReadAddr = 0x7FFF; + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(2KB-MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE-4) from info block + { + _DrvFwCtrlMsg28xxReadEFlashStart(0x81FF, EMEM_INFO); + nReadAddr = 0x81FF; + } + + _DrvFwCtrlMsg28xxReadEFlashDoRead(nReadAddr, &szTmpData[0]); + + DBG("szTmpData[0] = 0x%x\n", szTmpData[0]); // add for debug + DBG("szTmpData[1] = 0x%x\n", szTmpData[1]); // add for debug + DBG("szTmpData[2] = 0x%x\n", szTmpData[2]); // add for debug + DBG("szTmpData[3] = 0x%x\n", szTmpData[3]); // add for debug + + _DrvFwCtrlMsg28xxReadEFlashEnd(); + + nRetVal = (szTmpData[3] << 24); + nRetVal |= (szTmpData[2] << 16); + nRetVal |= (szTmpData[1] << 8); + nRetVal |= szTmpData[0]; + + DBG("CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(u8 szTmpBuf[][1024], EmemType_e eEmemType) +{ + u32 nRetVal = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + if (szTmpBuf != NULL) + { + if (eEmemType == EMEM_MAIN) + { + nRetVal = szTmpBuf[127][1023]; + nRetVal = (nRetVal << 8) | szTmpBuf[127][1022]; + nRetVal = (nRetVal << 8) | szTmpBuf[127][1021]; + nRetVal = (nRetVal << 8) | szTmpBuf[127][1020]; + } + else if (eEmemType == EMEM_INFO) + { + nRetVal = szTmpBuf[129][1023]; + nRetVal = (nRetVal << 8) | szTmpBuf[129][1022]; + nRetVal = (nRetVal << 8) | szTmpBuf[129][1021]; + nRetVal = (nRetVal << 8) | szTmpBuf[129][1020]; + } + } + + return nRetVal; +} + +/* +static s32 _DrvFwCtrlMsg28xxUpdateFirmwareBySwId(void) +{ + s32 nRetVal = -1; + u32 nCrcInfoA = 0, nCrcInfoB = 0, nCrcMainA = 0, nCrcMainB = 0; + + DBG("*** %s() ***\n", __func__); + + DBG("_gIsUpdateInfoBlockFirst = %d, g_IsUpdateFirmware = 0x%x\n", _gIsUpdateInfoBlockFirst, g_IsUpdateFirmware); + + if (_gIsUpdateInfoBlockFirst == 1) + { + if ((g_IsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA = 0x%x, nCrcInfoB = 0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA = 0x%x, nCrcMainB = 0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else if ((g_IsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + } + else //_gIsUpdateInfoBlockFirst == 0 + { + if ((g_IsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else if ((g_IsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg28xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg28xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg28xxRetrieveFrimwareCrcFromBinFile(g_FwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + } + + return nRetVal; +} +*/ + +void _DrvFwCtrlMsg28xxCheckFirmwareUpdateBySwId(void) +{ + u32 nCrcMainA, nCrcMainB; + u32 i; + u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0; + u16 nMajor = 0, nMinor = 0; + u8 nIsCompareVersion = 0; + u8 *pVersion = NULL; + Msg28xxSwId_e eMainSwId = MSG28XX_SW_ID_UNDEFINED, eInfoSwId = MSG28XX_SW_ID_UNDEFINED, eSwId = MSG28XX_SW_ID_UNDEFINED; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrDisableFingerTouchReport(); + + nCrcMainA = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg28xxRetrieveFirmwareCrcFromEFlash(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + +#ifdef CONFIG_ENABLE_CODE_FOR_DEBUG // TODO : add for debug + { + if (nCrcMainA != nCrcMainB) + { + for (i = 0; i < 5; i ++) + { + nCrcMainA = _DrvFwCtrlMsg28xxGetFirmwareCrcByHardware(EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg28xxRetrieveFirmwareCrcFromEFlash(EMEM_MAIN); + + DBG("*** Retry[%d] : nCrcMainA=0x%x, nCrcMainB=0x%x ***\n", i, nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + break; + } + + mdelay(50); + } + } + } +#endif //CONFIG_ENABLE_CODE_FOR_DEBUG + + _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id"); + INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork); + + if (nCrcMainA == nCrcMainB) + { + eMainSwId = _DrvFwCtrlMsg28xxGetSwId(EMEM_MAIN); + eInfoSwId = _DrvFwCtrlMsg28xxGetSwId(EMEM_INFO); + + DBG("eMainSwId=0x%x, eInfoSwId=0x%x\n", eMainSwId, eInfoSwId); + + if (eMainSwId == eInfoSwId) + { + eSwId = eMainSwId; + nIsCompareVersion = 1; + + DrvFwCtrlGetCustomerFirmwareVersionByDbBus(EMEM_MAIN, &nMajor, &nMinor, &pVersion); + } + else + { + eSwId = eInfoSwId; + nIsCompareVersion = 0; + } + + if (eSwId == MSG28XX_SW_ID_XXXX) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg28xx_xxxx_update_bin[127][1013]<<8 | msg28xx_xxxx_update_bin[127][1012]; + nUpdateBinMinor = msg28xx_xxxx_update_bin[127][1015]<<8 | msg28xx_xxxx_update_bin[127][1014]; +#else // By one dimensional array + nUpdateBinMajor = msg28xx_xxxx_update_bin[0x1FFF5]<<8 | msg28xx_xxxx_update_bin[0x1FFF4]; + nUpdateBinMinor = msg28xx_xxxx_update_bin[0x1FFF7]<<8 | msg28xx_xxxx_update_bin[0x1FFF6]; +#endif + } + else if (eSwId == MSG28XX_SW_ID_YYYY) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg28xx_yyyy_update_bin[127][1013]<<8 | msg28xx_yyyy_update_bin[127][1012]; + nUpdateBinMinor = msg28xx_yyyy_update_bin[127][1015]<<8 | msg28xx_yyyy_update_bin[127][1014]; +#else // By one dimensional array + nUpdateBinMajor = msg28xx_yyyy_update_bin[0x1FFF5]<<8 | msg28xx_yyyy_update_bin[0x1FFF4]; + nUpdateBinMinor = msg28xx_yyyy_update_bin[0x1FFF7]<<8 | msg28xx_yyyy_update_bin[0x1FFF6]; +#endif + } + else //eSwId == MSG28XX_SW_ID_UNDEFINED + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG28XX_SW_ID_UNDEFINED; + nUpdateBinMajor = 0; + nUpdateBinMinor = 0; + } + + + DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor); + + if ((nUpdateBinMinor > nMinor && nIsCompareVersion == 1) || (nIsCompareVersion == 0)) + { + if (eSwId == MSG28XX_SW_ID_XXXX) + { + for (i = 0; i < MSG28XX_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg28xx_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg28xx_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG28XX_SW_ID_YYYY) + { + for (i = 0; i < MSG28XX_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg28xx_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg28xx_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG28XX_SW_ID_UNDEFINED; + } + + if (eSwId < MSG28XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + eSwId = _DrvFwCtrlMsg28xxGetSwId(EMEM_INFO); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG28XX_SW_ID_XXXX) + { + for (i = 0; i < MSG28XX_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg28xx_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg28xx_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG28XX_SW_ID_YYYY) + { + for (i = 0; i < MSG28XX_FIRMWARE_WHOLE_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg28xx_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg28xx_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG28XX_SW_ID_UNDEFINED; + } + + if (eSwId < MSG28XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 0; // Set 0 for indicating main block is broken + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); +} + +//-------------------------End of SW ID for MSG28XX----------------------------// + +static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork) +{ + s32 nRetVal = 0; + + DBG("*** %s() _gUpdateRetryCount = %d ***\n", __func__, _gUpdateRetryCount); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + nRetVal = _DrvFwCtrlMsg26xxmUpdateFirmwareBySwId(); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + nRetVal = _DrvFwCtrlMsg28xxUpdateFirmware(g_FwData, EMEM_MAIN); + } + else + { + DBG("This chip type (0x%x) does not support update firmware by sw id\n", g_ChipType); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + nRetVal = -1; + return; + } + + DBG("*** update firmware by sw id result = %d ***\n", nRetVal); + + if (nRetVal == 0) + { + DBG("update firmware by sw id success\n"); + + _gIsUpdateInfoBlockFirst = 0; + g_IsUpdateFirmware = 0x00; + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + } + else //nRetVal == -1 + { + _gUpdateRetryCount --; + if (_gUpdateRetryCount > 0) + { + DBG("_gUpdateRetryCount = %d\n", _gUpdateRetryCount); + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + } + else + { + DBG("update firmware by sw id failed\n"); + + _gIsUpdateInfoBlockFirst = 0; + g_IsUpdateFirmware = 0x00; + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + } + } +} + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +void DrvFwCtrlVariableInitialize(void) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + FIRMWARE_MODE_UNKNOWN_MODE = MSG26XXM_FIRMWARE_MODE_UNKNOWN_MODE; + FIRMWARE_MODE_DEMO_MODE = MSG26XXM_FIRMWARE_MODE_DEMO_MODE; + FIRMWARE_MODE_DEBUG_MODE = MSG26XXM_FIRMWARE_MODE_DEBUG_MODE; +// FIRMWARE_MODE_RAW_DATA_MODE = MSG26XXM_FIRMWARE_MODE_RAW_DATA_MODE; + + g_FirmwareMode = FIRMWARE_MODE_DEMO_MODE; + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + FIRMWARE_MODE_UNKNOWN_MODE = MSG28XX_FIRMWARE_MODE_UNKNOWN_MODE; + FIRMWARE_MODE_DEMO_MODE = MSG28XX_FIRMWARE_MODE_DEMO_MODE; + FIRMWARE_MODE_DEBUG_MODE = MSG28XX_FIRMWARE_MODE_DEBUG_MODE; +// FIRMWARE_MODE_RAW_DATA_MODE = MSG28XX_FIRMWARE_MODE_RAW_DATA_MODE; + + g_FirmwareMode = FIRMWARE_MODE_DEMO_MODE; + } +} + +void DrvFwCtrlOptimizeCurrentConsumption(void) +{ + u32 i; + u8 szDbBusTxData[35] = {0}; + + DBG("g_ChipType = 0x%x\n", g_ChipType); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + return; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + if (g_ChipType == CHIP_TYPE_MSG28XX) + { + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + // Enable burst mode + RegSetLByteValue(0x1608, 0x21); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x15; + szDbBusTxData[2] = 0x20; //bank:0x15, addr:h0010 + + for (i = 0; i < 8; i ++) + { + szDbBusTxData[i+3] = 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+8); // Write 0xFF for reg 0x1510~0x1513 + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x15; + szDbBusTxData[2] = 0x28; //bank:0x15, addr:h0014 + + for (i = 0; i < 16; i ++) + { + szDbBusTxData[i+3] = 0x00; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+16); // Write 0x00 for reg 0x1514~0x151B + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x21; + szDbBusTxData[2] = 0x40; //bank:0x21, addr:h0020 + + for (i = 0; i < 8; i ++) + { + szDbBusTxData[i+3] = 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+8); // Write 0xFF for reg 0x2120~0x2123 + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x21; + szDbBusTxData[2] = 0x20; //bank:0x21, addr:h0010 + + for (i = 0; i < 32; i ++) + { + szDbBusTxData[i+3] = 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+32); // Write 0xFF for reg 0x2110~0x211F + + // Clear burst mode + RegSetLByteValue(0x1608, 0x20); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + } +} + +u8 DrvFwCtrlGetChipType(void) +{ + s32 rc =0; + u8 nChipType = 0; + + DBG("*** %s() ***\n", __func__); + + // Erase TP Flash first + rc = DbBusEnterSerialDebugMode(); + if (rc < 0) + { + DBG("*** DbBusEnterSerialDebugMode() failed, rc = %d ***\n", rc); + return nChipType; + } + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + // Stop MCU + RegSetLByteValue(0x0FE6, 0x01); + + // Disable watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + nChipType = RegGet16BitValue(0x1ECC) & 0xFF; + + if (nChipType != CHIP_TYPE_MSG21XX && // (0x01) + nChipType != CHIP_TYPE_MSG21XXA && // (0x02) + nChipType != CHIP_TYPE_MSG26XXM && // (0x03) + nChipType != CHIP_TYPE_MSG22XX && // (0x7A) + nChipType != CHIP_TYPE_MSG28XX) // (0x85) + { + nChipType = 0; + } + + DBG("*** Chip Type = 0x%x ***\n", nChipType); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nChipType; +} + +void DrvFwCtrlGetCustomerFirmwareVersionByDbBus(EmemType_e eEmemType, u16 *pMajor, u16 *pMinor, u8 **ppVersion) // support MSG28xx only +{ + u16 nReadAddr = 0; + u8 szTmpData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + if (g_ChipType == CHIP_TYPE_MSG28XX) + { + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + _DrvFwCtrlMsg28xxReadEFlashStart(0x7FFD, EMEM_MAIN); + nReadAddr = 0x7FFD; + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + _DrvFwCtrlMsg28xxReadEFlashStart(0x81FB, EMEM_INFO); + nReadAddr = 0x81FB; + } + + _DrvFwCtrlMsg28xxReadEFlashDoRead(nReadAddr, &szTmpData[0]); + + _DrvFwCtrlMsg28xxReadEFlashEnd(); + + /* + Ex. Major in Main Block : + Major low byte at address 0x7FFD + + Major in Info Block : + Major low byte at address 0x81FB + */ + + *pMajor = (szTmpData[1] << 8); + *pMajor |= szTmpData[0]; + *pMinor = (szTmpData[3] << 8); + *pMinor |= szTmpData[2]; + + DBG("*** major = %d ***\n", *pMajor); + DBG("*** minor = %d ***\n", *pMinor); + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*6, GFP_KERNEL); + } + + sprintf(*ppVersion, "%03d%03d", *pMajor, *pMinor); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + } +} + +void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion) +{ + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x2A; + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + mutex_unlock(&g_Mutex); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + szDbBusTxData[0] = 0x03; + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + mutex_unlock(&g_Mutex); + } + + DBG("szDbBusRxData[0] = 0x%x\n", szDbBusRxData[0]); // add for debug + DBG("szDbBusRxData[1] = 0x%x\n", szDbBusRxData[1]); // add for debug + DBG("szDbBusRxData[2] = 0x%x\n", szDbBusRxData[2]); // add for debug + DBG("szDbBusRxData[3] = 0x%x\n", szDbBusRxData[3]); // add for debug + + *pMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0]; + *pMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2]; + + DBG("*** major = %d ***\n", *pMajor); + DBG("*** minor = %d ***\n", *pMinor); + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*6, GFP_KERNEL); + } + + sprintf(*ppVersion, "%03d%03d", *pMajor, *pMinor); +} + +void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + u32 i; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[16] = {0}; + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + // Read platform firmware version from info block + szDbBusTxData[0] = 0x72; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x08; + + for (i = 0; i < 2; i ++) + { + szDbBusTxData[1] = 0x80; + szDbBusTxData[2] = 0x10 + ((i*8)&0x00ff); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + + mdelay(50); + + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[i*8], 8); + } + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*16, GFP_KERNEL); + } + + sprintf(*ppVersion, "%.16s", szDbBusRxData); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(100); + + mutex_unlock(&g_Mutex); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + u8 szDbBusTxData[1] = {0}; + u8 szDbBusRxData[10] = {0}; + + szDbBusTxData[0] = 0x04; + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 10); + + mutex_unlock(&g_Mutex); + + DBG("szDbBusRxData[0] = 0x%x , %c \n", szDbBusRxData[0], szDbBusRxData[0]); // add for debug + DBG("szDbBusRxData[1] = 0x%x , %c \n", szDbBusRxData[1], szDbBusRxData[1]); // add for debug + DBG("szDbBusRxData[2] = 0x%x , %c \n", szDbBusRxData[2], szDbBusRxData[2]); // add for debug + DBG("szDbBusRxData[3] = 0x%x , %c \n", szDbBusRxData[3], szDbBusRxData[3]); // add for debug + DBG("szDbBusRxData[4] = 0x%x , %c \n", szDbBusRxData[4], szDbBusRxData[4]); // add for debug + DBG("szDbBusRxData[5] = 0x%x , %c \n", szDbBusRxData[5], szDbBusRxData[5]); // add for debug + DBG("szDbBusRxData[6] = 0x%x , %c \n", szDbBusRxData[6], szDbBusRxData[6]); // add for debug + DBG("szDbBusRxData[7] = 0x%x , %c \n", szDbBusRxData[7], szDbBusRxData[7]); // add for debug + DBG("szDbBusRxData[8] = 0x%x , %c \n", szDbBusRxData[8], szDbBusRxData[8]); // add for debug + DBG("szDbBusRxData[9] = 0x%x , %c \n", szDbBusRxData[9], szDbBusRxData[9]); // add for debug + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL); + } + + sprintf(*ppVersion, "%.10s", szDbBusRxData); + } + + DBG("*** platform firmware version = %s ***\n", *ppVersion); +} + +s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + DBG("*** %s() ***\n", __func__); + + return _DrvFwCtrlUpdateFirmwareCash(szFwData, eEmemType); +} + +s32 DrvFwCtrlUpdateFirmwareBySdCard(const char *pFilePath) +{ + s32 nRetVal = -1; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM || g_ChipType == CHIP_TYPE_MSG28XX) + { + nRetVal = _DrvFwCtrlUpdateFirmwareBySdCard(pFilePath); + } + else + { + DBG("This chip type (0x%x) does not support update firmware by sd card\n", g_ChipType); + } + + return nRetVal; +} + +//------------------------------------------------------------------------------// + +u16 DrvFwCtrlGetFirmwareMode(void) // use for MSG26XXM only +{ + u16 nMode = 0; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + nMode = RegGet16BitValue(0x3CF4); //bank:reg_PIU_MISC0, addr:h007a + + DBG("firmware mode = 0x%x\n", nMode); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + mdelay(100); + } + + return nMode; +} + +u16 DrvFwCtrlChangeFirmwareMode(u16 nMode) +{ + DBG("*** %s() *** nMode = 0x%x\n", __func__, nMode); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + RegSet16BitValue(0x3CF4, nMode); //bank:reg_PIU_MISC0, addr:h007a + nMode = RegGet16BitValue(0x3CF4); + + DBG("firmware mode = 0x%x\n", nMode); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + u8 szDbBusTxData[2] = {0}; + u32 i = 0; + s32 rc; + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send change firmware mode i2c command to firmware. + + szDbBusTxData[0] = 0x02; + szDbBusTxData[1] = (u8)nMode; + + mdelay(20); + + mutex_lock(&g_Mutex); + DBG("*** %s() *** mutex_lock(&g_Mutex)\n", __func__); // add for debug + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 2); + if (rc > 0) + { + DBG("Change firmware mode success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Change firmware mode failed, rc = %d\n", rc); + } + + DBG("*** %s() *** mutex_unlock(&g_Mutex)\n", __func__); // add for debug + mutex_unlock(&g_Mutex); + + _gIsDisableFinagerTouch = 0; + } + + return nMode; +} + +void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[8] = {0}; + u32 i = 0; + s32 rc; + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send get firmware info i2c command to firmware. + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x48; + + mutex_lock(&g_Mutex); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc > 0) + { + DBG("Get firmware info IicWriteData() success\n"); + } + mdelay(20); + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 8); + if (rc > 0) + { + DBG("Get firmware info IicReadData() success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Get firmware info failed, rc = %d\n", rc); + } + + mutex_unlock(&g_Mutex); + + if (szDbBusRxData[0] == 8 && szDbBusRxData[1] == 0 && szDbBusRxData[2] == 9 && szDbBusRxData[3] == 0) + { + DBG("*** Debug Mode Packet Header is 0xA5 ***\n"); +/* + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); +*/ + pInfo->nLogModePacketHeader = 0xA5; + pInfo->nMy = 0; + pInfo->nMx = 0; +// *pDriveLineNumber = AnaGetMutualSubframeNum(); +// *pSenseLineNumber = AnaGetMutualChannelNum(); + +/* + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + mdelay(100); +*/ + } + else if (szDbBusRxData[0] == 0xAB) + { + DBG("*** Debug Mode Packet Header is 0xAB ***\n"); + + pInfo->nLogModePacketHeader = szDbBusRxData[0]; + pInfo->nMy = szDbBusRxData[1]; + pInfo->nMx = szDbBusRxData[2]; +// pInfo->nSd = szDbBusRxData[1]; +// pInfo->nSs = szDbBusRxData[2]; + } + else if (szDbBusRxData[0] == 0xA7 && szDbBusRxData[3] == PACKET_TYPE_TOOTH_PATTERN) + { + DBG("*** Debug Packet Header is 0xA7 ***\n"); + + pInfo->nLogModePacketHeader = szDbBusRxData[0]; + pInfo->nType = szDbBusRxData[3]; + pInfo->nMy = szDbBusRxData[4]; + pInfo->nMx = szDbBusRxData[5]; + pInfo->nSd = szDbBusRxData[6]; + pInfo->nSs = szDbBusRxData[7]; + } + + if (pInfo->nLogModePacketHeader == 0xA5) + { + if (pInfo->nMy != 0 && pInfo->nMx != 0) + { + // for parsing debug mode packet 0xA5 + pInfo->nLogModePacketLength = 1+1+1+1+10*3+pInfo->nMx*pInfo->nMy*2+1; + } + else + { + DBG("Failed to retrieve channel number or subframe number for debug mode packet 0xA5.\n"); + } + } + else if (pInfo->nLogModePacketHeader == 0xAB) + { + if (pInfo->nMy != 0 && pInfo->nMx != 0) + { + // for parsing debug mode packet 0xAB + pInfo->nLogModePacketLength = 1+1+1+1+10*3+pInfo->nMy*pInfo->nMx*2+pInfo->nMy*2+pInfo->nMx*2+2*2+8*2+1; + } + else + { + DBG("Failed to retrieve channel number or subframe number for debug mode packet 0xAB.\n"); + } + } + else if (pInfo->nLogModePacketHeader == 0xA7 && pInfo->nType == PACKET_TYPE_TOOTH_PATTERN) + { + if (pInfo->nMy != 0 && pInfo->nMx != 0 && pInfo->nSd != 0 && pInfo->nSs != 0) + { + // for parsing debug mode packet 0xA7 + pInfo->nLogModePacketLength = 1+1+1+1+1+10*3+pInfo->nMy*pInfo->nMx*2+pInfo->nSd*2+pInfo->nSs*2+10*2+1; + } + else + { + DBG("Failed to retrieve channel number or subframe number for debug mode packet 0xA7.\n"); + } + } + else + { + DBG("Undefined debug mode packet header = 0x%x\n", pInfo->nLogModePacketHeader); + } + + DBG("*** debug mode packet header = 0x%x ***\n", pInfo->nLogModePacketHeader); + DBG("*** debug mode packet length = %d ***\n", pInfo->nLogModePacketLength); + DBG("*** Type = 0x%x ***\n", pInfo->nType); + DBG("*** My = %d ***\n", pInfo->nMy); + DBG("*** Mx = %d ***\n", pInfo->nMx); + DBG("*** Sd = %d ***\n", pInfo->nSd); + DBG("*** Ss = %d ***\n", pInfo->nSs); + + _gIsDisableFinagerTouch = 0; + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + u8 szDbBusTxData[1] = {0}; + u8 szDbBusRxData[10] = {0}; + u32 i = 0; + s32 rc; + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send get firmware info i2c command to firmware. + + szDbBusTxData[0] = 0x01; + + mutex_lock(&g_Mutex); + DBG("*** %s() *** mutex_lock(&g_Mutex)\n", __func__); // add for debug + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1); + if (rc > 0) + { + DBG("Get firmware info IicWriteData() success\n"); + } + mdelay(20); + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 10); + if (rc > 0) + { + DBG("Get firmware info IicReadData() success\n"); + + if (szDbBusRxData[1] == FIRMWARE_MODE_DEMO_MODE || szDbBusRxData[1] == FIRMWARE_MODE_DEBUG_MODE) + { + break; + } + else + { + i = 0; + } + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Get firmware info failed, rc = %d\n", rc); + } + + DBG("*** %s() *** mutex_unlock(&g_Mutex)\n", __func__); // add for debug + mutex_unlock(&g_Mutex); + + // Add protection for incorrect firmware info check + if ((szDbBusRxData[1] == FIRMWARE_MODE_DEBUG_MODE && szDbBusRxData[2] == 0xA7 && szDbBusRxData[5] == PACKET_TYPE_TOOTH_PATTERN) || (szDbBusRxData[1] == FIRMWARE_MODE_DEMO_MODE && szDbBusRxData[2] == 0x5A)) + { + pInfo->nFirmwareMode = szDbBusRxData[1]; + DBG("pInfo->nFirmwareMode = 0x%x\n", pInfo->nFirmwareMode); + + pInfo->nLogModePacketHeader = szDbBusRxData[2]; + pInfo->nLogModePacketLength = (szDbBusRxData[3]<<8) + szDbBusRxData[4]; + pInfo->nType = szDbBusRxData[5]; + pInfo->nMy = szDbBusRxData[6]; + pInfo->nMx = szDbBusRxData[7]; + pInfo->nSd = szDbBusRxData[8]; + pInfo->nSs = szDbBusRxData[9]; + + DBG("pInfo->nLogModePacketHeader = 0x%x\n", pInfo->nLogModePacketHeader); + DBG("pInfo->nLogModePacketLength = %d\n", pInfo->nLogModePacketLength); + DBG("pInfo->nType = 0x%x\n", pInfo->nType); + DBG("pInfo->nMy = %d\n", pInfo->nMy); + DBG("pInfo->nMx = %d\n", pInfo->nMx); + DBG("pInfo->nSd = %d\n", pInfo->nSd); + DBG("pInfo->nSs = %d\n", pInfo->nSs); + } + else + { + DBG("Firmware info before correcting :\n"); + + DBG("FirmwareMode = 0x%x\n", szDbBusRxData[1]); + DBG("LogModePacketHeader = 0x%x\n", szDbBusRxData[2]); + DBG("LogModePacketLength = %d\n", (szDbBusRxData[3]<<8) + szDbBusRxData[4]); + DBG("Type = 0x%x\n", szDbBusRxData[5]); + DBG("My = %d\n", szDbBusRxData[6]); + DBG("Mx = %d\n", szDbBusRxData[7]); + DBG("Sd = %d\n", szDbBusRxData[8]); + DBG("Ss = %d\n", szDbBusRxData[9]); + + // Set firmware mode to demo mode(default) + pInfo->nFirmwareMode = FIRMWARE_MODE_DEMO_MODE; + pInfo->nLogModePacketHeader = 0x5A; + pInfo->nLogModePacketLength = DEMO_MODE_PACKET_LENGTH; + pInfo->nType = 0; + pInfo->nMy = 0; + pInfo->nMx = 0; + pInfo->nSd = 0; + pInfo->nSs = 0; + + DBG("Firmware info after correcting :\n"); + + DBG("pInfo->nFirmwareMode = 0x%x\n", pInfo->nFirmwareMode); + DBG("pInfo->nLogModePacketHeader = 0x%x\n", pInfo->nLogModePacketHeader); + DBG("pInfo->nLogModePacketLength = %d\n", pInfo->nLogModePacketLength); + DBG("pInfo->nType = 0x%x\n", pInfo->nType); + DBG("pInfo->nMy = %d\n", pInfo->nMy); + DBG("pInfo->nMx = %d\n", pInfo->nMx); + DBG("pInfo->nSd = %d\n", pInfo->nSd); + DBG("pInfo->nSs = %d\n", pInfo->nSs); + } + + _gIsDisableFinagerTouch = 0; + } +} + +void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void) +{ + DBG("*** %s() g_IsSwitchModeByAPK = %d ***\n", __func__, g_IsSwitchModeByAPK); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + if (g_IsSwitchModeByAPK == 1) + { + DBG("g_FirmwareMode = 0x%x\n", g_FirmwareMode); + + // Since reset_hw() will reset the firmware mode to demo mode, we must reset the firmware mode again after reset_hw(). + if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && FIRMWARE_MODE_DEMO_MODE == DrvFwCtrlGetFirmwareMode()) + { + g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE); + } + else + { + DBG("firmware mode is not restored\n"); + } + } + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + if (g_IsSwitchModeByAPK == 1) + { + FirmwareInfo_t tInfo; + + memset(&tInfo, 0x0, sizeof(FirmwareInfo_t)); + + DrvFwCtrlGetFirmwareInfo(&tInfo); + + DBG("g_FirmwareMode = 0x%x, tInfo.nFirmwareMode = 0x%x\n", g_FirmwareMode, tInfo.nFirmwareMode); + + // Since reset_hw() will reset the firmware mode to demo mode, we must reset the firmware mode again after reset_hw(). + if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && FIRMWARE_MODE_DEBUG_MODE != tInfo.nFirmwareMode) + { + g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE); + } + else + { + DBG("firmware mode is not restored\n"); + } + } + } +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +void DrvFwCtrlCheckFirmwareUpdateBySwId(void) +{ + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + _DrvFwCtrlMsg26xxmCheckFirmwareUpdateBySwId(); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + _DrvFwCtrlMsg28xxCheckFirmwareUpdateBySwId(); + } + else + { + DBG("This chip type (0x%x) does not support update firmware by sw id\n", g_ChipType); + } +} + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +void DrvFwCtrlGetTouchPacketAddress(u16* pDataAddress, u16* pFlagAddress) +{ + s32 rc = 0; + u8 szDbBusTxData[1] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x05; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1); + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + if (rc < 0) + { + g_FwSupportSegment = 0; + } + else + { + *pDataAddress = (szDbBusRxData[0]<<8) + szDbBusRxData[1]; + *pFlagAddress = (szDbBusRxData[2]<<8) + szDbBusRxData[3]; + + g_FwSupportSegment = 1; + + DBG("*** *pDataAddress = 0x%2X ***\n", *pDataAddress); // add for debug + DBG("*** *pFlagAddress = 0x%2X ***\n", *pFlagAddress); // add for debug + } +} + +static int _DrvFwCtrlCheckFingerTouchPacketFlagBit1(void) +{ + u8 szDbBusTxData[3] = {0}; + s32 nRetVal; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = (g_FwPacketFlagAddress >> 8) & 0xFF; + szDbBusTxData[2] = g_FwPacketFlagAddress & 0xFF; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &_gTouchPacketFlag[0], 2); + + if ((_gTouchPacketFlag[0] & BIT1) == 0x00) + { + nRetVal = 0; // Bit1 is 0 + } + else + { + nRetVal = 1; // Bit1 is 1 + } + DBG("Bit1 = %d\n", nRetVal); + + return nRetVal; +} + +static void _DrvFwCtrlResetFingerTouchPacketFlagBit1(void) +{ + u8 szDbBusTxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x52; + szDbBusTxData[1] = (g_FwPacketFlagAddress >> 8) & 0xFF; + szDbBusTxData[2] = g_FwPacketFlagAddress & 0xFF; + szDbBusTxData[3] = _gTouchPacketFlag[0] | BIT1; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); +} +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + +s32 DrvFwCtrlEnableProximity(void) +{ + u8 szDbBusTxData[4] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x52; + szDbBusTxData[1] = 0x00; + + if (g_ChipType == CHIP_TYPE_MSG26XXM || g_ChipType == CHIP_TYPE_MSG28XX) + { + szDbBusTxData[2] = 0x47; + } + else + { + DBG("*** Un-recognized chip type = 0x%x ***\n", g_ChipType); + return -1; + } + + szDbBusTxData[3] = 0xa0; + + mutex_lock(&g_Mutex); + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mutex_unlock(&g_Mutex); + + if (rc > 0) + { + DBG("Enable proximity detection success\n"); + } + else + { + DBG("Enable proximity detection failed\n"); + } + + g_EnableTpProximity = 1; + + return rc; +} + +s32 DrvFwCtrlDisableProximity(void) +{ + u8 szDbBusTxData[4] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x52; + szDbBusTxData[1] = 0x00; + + if (g_ChipType == CHIP_TYPE_MSG26XXM || g_ChipType == CHIP_TYPE_MSG28XX) + { + szDbBusTxData[2] = 0x47; + } + else + { + DBG("*** Un-recognized chip type = 0x%x ***\n", g_ChipType); + return -1; + } + + szDbBusTxData[3] = 0xa1; + + mutex_lock(&g_Mutex); + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mutex_unlock(&g_Mutex); + + if (rc > 0) + { + DBG("Disable proximity detection success\n"); + } + else + { + DBG("Disable proximity detection failed\n"); + } + + g_EnableTpProximity = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + g_FaceClosingTp = 0; +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM || CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM + + return rc; +} + +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GLOVE_MODE +void DrvIcFwCtrlOpenGloveMode(void) +{ + s32 rc = 0; + u8 szDbBusTxData[3] = {0}; + u32 i = 0; + + DBG("*** %s() ***\n", __func__); + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send change firmware mode i2c command to firmware. + + szDbBusTxData[0] = 0x06; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = 0x01; + + mdelay(20); + + mutex_lock(&g_Mutex); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc > 0) + { + DBG("Open glove mode success\n"); + break; + } + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Open glove mode failed, rc = %d\n", rc); + } + + mutex_unlock(&g_Mutex); + + g_IsGloveModeOpen = 1; + + _gIsDisableFinagerTouch = 0; +} + +void DrvIcFwCtrlCloseGloveMode(void) +{ + s32 rc = 0; + u8 szDbBusTxData[3] = {0}; + u32 i = 0; + + DBG("*** %s() ***\n", __func__); + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send change firmware mode i2c command to firmware. + + szDbBusTxData[0] = 0x06; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = 0x00; + + mdelay(20); + + mutex_lock(&g_Mutex); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc > 0) + { + DBG("Close glove mode success\n"); + break; + } + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Close glove mode failed, rc = %d\n", rc); + } + + mutex_unlock(&g_Mutex); + + g_IsGloveModeOpen = 0; + + _gIsDisableFinagerTouch = 0; +} + +void DrvIcFwCtrlGetGloveInfo(u8 *pGloveMode) +{ + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[2] = {0}; + u32 i = 0; + s32 rc; + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send get firmware info i2c command to firmware. + + szDbBusTxData[0] = 0x06; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = 0x02; + + mutex_lock(&g_Mutex); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc > 0) + { + DBG("Get glove info IicWriteData() success\n"); + } + mdelay(20); + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 1); + if (rc > 0) + { + DBG("Get glove info IicReadData() success\n"); + + if (szDbBusRxData[0] == 0x00 || szDbBusRxData[0] == 0x01) + { + break; + } + else + { + i = 0; + } + } + + mdelay(10); + i++; + } + + if (i == 5) + { + DBG("Get glove info failed, rc = %d\n", rc); + } + + mutex_unlock(&g_Mutex); + + *pGloveMode = szDbBusRxData[0]; + + DBG("pGloveMode = 0x%x\n", *pGloveMode); + + _gIsDisableFinagerTouch = 0; +} + +#endif //CONFIG_ENABLE_GLOVE_MODE +//------------------------------------------------------------------------------// + +static s32 _DrvFwCtrlReadFingerTouchData(u8 *pPacket, u16 nReportPacketLength) +{ + s32 rc; + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + return -1; + } + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) + { +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + DBG("*** g_FwPacketDataAddress = 0x%2X ***\n", g_FwPacketDataAddress); // add for debug + DBG("*** g_FwPacketFlagAddress = 0x%2X ***\n", g_FwPacketFlagAddress); // add for debug + + if (g_FwSupportSegment == 0) + { + DBG("g_FwPacketDataAddress & g_FwPacketFlagAddress is un-initialized\n"); + return -1; + } + + if (_gIsDisableFinagerTouch == 1) + { + DBG("Skip finger touch for handling get firmware info or change firmware mode\n"); + return -1; + } + + IicSegmentReadDataBySmBus(g_FwPacketDataAddress, &pPacket[0], nReportPacketLength, MAX_I2C_TRANSACTION_LENGTH_LIMIT); + + _DrvFwCtrlCheckFingerTouchPacketFlagBit1(); + _DrvFwCtrlResetFingerTouchPacketFlagBit1(); +#else + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + return -1; + } +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + } + else + { + DBG("WRONG FIRMWARE MODE : 0x%x\n", g_FirmwareMode); + return -1; + } + } + else + { + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + return -1; + } + } //IS_FIRMWARE_DATA_LOG_ENABLED + + return 0; +} + +//------------------------------------------------------------------------------// + +void DrvFwCtrlHandleFingerTouch(void) +{ + TouchInfo_t tInfo; + u32 i = 0; + static u32 nLastKeyCode = 0xFF; + static u32 nLastCount = 0; + u8 *pPacket = NULL; + u16 nReportPacketLength = 0; + +// DBG("*** %s() ***\n", __func__); // add for debug + + if (_gIsDisableFinagerTouch == 1) + { + DBG("Skip finger touch for handling get firmware info or change firmware mode\n"); + return; + } + + mutex_lock(&g_Mutex); + DBG("*** %s() *** mutex_lock(&g_Mutex)\n", __func__); // add for debug + + memset(&tInfo, 0x0, sizeof(TouchInfo_t)); + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { +#ifdef CONFIG_ENABLE_HOTKNOT //demo mode + if (g_HotKnotState == HOTKNOT_TRANS_STATE) + { + nReportPacketLength = DEMO_HOTKNOT_SEND_RET_LEN; + pPacket = g_DemoModeHotKnotSndRetPacket; + } + else +#endif //CONFIG_ENABLE_HOTKNOT + { + DBG("FIRMWARE_MODE_DEMO_MODE\n"); + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = g_DemoModePacket; + } + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) + { + DBG("FIRMWARE_MODE_DEBUG_MODE\n"); + + if (g_FirmwareInfo.nLogModePacketHeader != 0xA5 && g_FirmwareInfo.nLogModePacketHeader != 0xAB && g_FirmwareInfo.nLogModePacketHeader != 0xA7) + { + DBG("WRONG DEBUG MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + goto TouchHandleEnd; + } + +#ifdef CONFIG_ENABLE_HOTKNOT //debug mode + if(g_HotKnotState == HOTKNOT_TRANS_STATE) + { + nReportPacketLength = DEBUG_HOTKNOT_SEND_RET_LEN; + pPacket = g_DebugModeHotKnotSndRetPacket; + } + else +#endif //CONFIG_ENABLE_HOTKNOT + { + nReportPacketLength = g_FirmwareInfo.nLogModePacketLength; + pPacket = g_LogModePacket; + } + } + else + { + DBG("WRONG FIRMWARE MODE : 0x%x\n", g_FirmwareMode); + goto TouchHandleEnd; + } + } + else + { +#ifdef CONFIG_ENABLE_HOTKNOT //demo mode + if (g_HotKnotState == HOTKNOT_TRANS_STATE) + { + nReportPacketLength = DEMO_HOTKNOT_SEND_RET_LEN; + pPacket = g_DemoModeHotKnotSndRetPacket; + } + else +#endif //CONFIG_ENABLE_HOTKNOT + { + DBG("FIRMWARE_MODE_DEMO_MODE\n"); + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = g_DemoModePacket; + } + } //IS_FIRMWARE_DATA_LOG_ENABLED + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + if (g_GestureDebugMode == 1 && g_GestureWakeupFlag == 1) + { + DBG("Set gesture debug mode packet length, g_ChipType=%d\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG26XXM || g_ChipType == CHIP_TYPE_MSG28XX) + { + nReportPacketLength = GESTURE_DEBUG_MODE_PACKET_LENGTH; + pPacket = _gGestureWakeupPacket; + } + else + { + DBG("This chip type does not support gesture debug mode.\n"); + goto TouchHandleEnd; + } + } + else if (g_GestureWakeupFlag == 1) + { + DBG("Set gesture wakeup packet length\n"); + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + nReportPacketLength = GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH; +#else + nReportPacketLength = GESTURE_WAKEUP_PACKET_LENGTH; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + + pPacket = _gGestureWakeupPacket; + } + +#else + + if (g_GestureWakeupFlag == 1) + { + DBG("Set gesture wakeup packet length\n"); + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + nReportPacketLength = GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH; +#else + nReportPacketLength = GESTURE_WAKEUP_PACKET_LENGTH; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + + pPacket = _gGestureWakeupPacket; + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + s32 rc; + + while (i < 5) + { + mdelay(50); + + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + + if (rc > 0) + { + break; + } + + i ++; + } + if (i == 5) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + goto TouchHandleEnd; + } + } + else + { + if (0 != _DrvFwCtrlReadFingerTouchData(&pPacket[0], nReportPacketLength)) + { + goto TouchHandleEnd; + } + } +#else + if (0 != _DrvFwCtrlReadFingerTouchData(&pPacket[0], nReportPacketLength)) + { + goto TouchHandleEnd; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + if (0 != _DrvFwCtrlReadFingerTouchData(&pPacket[0], nReportPacketLength)) + { + goto TouchHandleEnd; + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + { + s32 nRetVal = 0; + +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC + + nRetVal = _DrvFwCtrlReadFingerTouchData(&pPacket[0], nReportPacketLength); + if (0 != nRetVal) + { + goto TouchHandleEnd; + } + } +#endif + + if (0 == _DrvFwCtrlParsePacket(pPacket, nReportPacketLength, &tInfo)) + { +#ifdef CONFIG_TP_HAVE_KEY + if (tInfo.nKeyCode != 0xFF) //key touch pressed + { + DBG("tInfo.nKeyCode=%x, nLastKeyCode=%x, g_TpVirtualKey[%d]=%d\n", tInfo.nKeyCode, nLastKeyCode, tInfo.nKeyCode, g_TpVirtualKey[tInfo.nKeyCode]); + + if (tInfo.nKeyCode < MAX_KEY_NUM) + { + if (tInfo.nKeyCode != nLastKeyCode) + { + DBG("key touch pressed\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 1); + input_report_key(g_InputDevice, g_TpVirtualKey[tInfo.nKeyCode], 1); + + input_sync(g_InputDevice); + + nLastKeyCode = tInfo.nKeyCode; + } + else + { + /// pass duplicate key-pressing + DBG("REPEATED KEY\n"); + } + } + else + { + DBG("WRONG KEY\n"); + } + } + else //key touch released + { + if (nLastKeyCode != 0xFF) + { + DBG("key touch released\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 0); + input_report_key(g_InputDevice, g_TpVirtualKey[nLastKeyCode], 0); + + input_sync(g_InputDevice); + + nLastKeyCode = 0xFF; + } + } +#endif //CONFIG_TP_HAVE_KEY + + DBG("tInfo.nCount = %d, nLastCount = %d\n", tInfo.nCount, nLastCount); + + if (tInfo.nCount > 0) //point touch pressed + { + for (i = 0; i < tInfo.nCount; i ++) + { + DrvPlatformLyrFingerTouchPressed(tInfo.tPoint[i].nX, tInfo.tPoint[i].nY, tInfo.tPoint[i].nP, tInfo.tPoint[i].nId); + } + + input_sync(g_InputDevice); + + nLastCount = tInfo.nCount; + } + else //point touch released + { + if (nLastCount > 0) + { + DrvPlatformLyrFingerTouchReleased(tInfo.tPoint[0].nX, tInfo.tPoint[0].nY); + + input_sync(g_InputDevice); + + nLastCount = 0; + } + } + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE + if (g_IsEnableReportRate == 1) + { + if (g_ValidTouchCount == 4294967296) + { + g_ValidTouchCount = 0; // Reset count if overflow + DBG("g_ValidTouchCount reset to 0\n"); + } + + g_ValidTouchCount ++; + + DBG("g_ValidTouchCount = %d\n", g_ValidTouchCount); + } +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + } + + TouchHandleEnd: + + DBG("*** %s() *** mutex_unlock(&g_Mutex)\n", __func__); // add for debug + mutex_unlock(&g_Mutex); +} + +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.h b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.h new file mode 100644 index 00000000..89ba829a --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_fw_control.h @@ -0,0 +1,203 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_mutual_fw_control.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_MUTUAL_FW_CONTROL_H__ +#define __MSTAR_DRV_MUTUAL_FW_CONTROL_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" +#ifdef CONFIG_ENABLE_HOTKNOT +#include "mstar_drv_hotknot.h" +#endif //CONFIG_ENABLE_HOTKNOT + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define DEMO_MODE_PACKET_LENGTH (43) +#define MAX_TOUCH_NUM (10) + +#define MSG26XXM_FIRMWARE_MAIN_BLOCK_SIZE (32) //32K +#define MSG26XXM_FIRMWARE_INFO_BLOCK_SIZE (8) //8K +#define MSG26XXM_FIRMWARE_WHOLE_SIZE (MSG26XXM_FIRMWARE_MAIN_BLOCK_SIZE+MSG26XXM_FIRMWARE_INFO_BLOCK_SIZE) //40K + +#define MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE (128) //128K +#define MSG28XX_FIRMWARE_INFO_BLOCK_SIZE (2) //2K +#define MSG28XX_FIRMWARE_WHOLE_SIZE (MSG28XX_FIRMWARE_MAIN_BLOCK_SIZE+MSG28XX_FIRMWARE_INFO_BLOCK_SIZE) //130K + +#define MSG28XX_EMEM_SIZE_BYTES_PER_ONE_PAGE (128) +#define MSG28XX_EMEM_SIZE_BYTES_ONE_WORD (4) + +#define MSG28XX_EMEM_MAIN_MAX_ADDR (0x3FFF) //0~0x3FFF = 0x4000 = 16384 = 65536/4 +#define MSG28XX_EMEM_INFO_MAX_ADDR (0x1FF) //0~0x1FF = 0x200 = 512 = 2048/4 + + +#define MSG26XXM_FIRMWARE_MODE_UNKNOWN_MODE (0xFFFF) +#define MSG26XXM_FIRMWARE_MODE_DEMO_MODE (0x0005) +#define MSG26XXM_FIRMWARE_MODE_DEBUG_MODE (0x0105) + +#define MSG28XX_FIRMWARE_MODE_UNKNOWN_MODE (0xFF) +#define MSG28XX_FIRMWARE_MODE_DEMO_MODE (0x00) +#define MSG28XX_FIRMWARE_MODE_DEBUG_MODE (0x01) + + +#define DEBUG_MODE_PACKET_LENGTH (1280) //It is a predefined maximum packet length, not the actual packet length which queried from firmware. + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +#define UPDATE_FIRMWARE_RETRY_COUNT (2) +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#define FIRMWARE_GESTURE_INFORMATION_MODE_A (0x00) +#define FIRMWARE_GESTURE_INFORMATION_MODE_B (0x01) +#define FIRMWARE_GESTURE_INFORMATION_MODE_C (0x02) +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +typedef struct +{ + u16 nId; + u16 nX; + u16 nY; + u16 nP; +} TouchPoint_t; + +/// max 80+1+1 = 82 bytes +typedef struct +{ + u8 nCount; + u8 nKeyCode; + TouchPoint_t tPoint[MAX_TOUCH_NUM]; +} TouchInfo_t; + +typedef struct +{ + u16 nFirmwareMode; + u8 nType; + u8 nLogModePacketHeader; + u8 nMy; + u8 nMx; + u8 nSd; + u8 nSs; + u16 nLogModePacketLength; +} FirmwareInfo_t; + + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +/* + * Note. + * 0x0000 and 0xFFFF are not allowed to be defined as SW ID. + * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it. + * Please modify the SW ID of the below enum value depends on the TP vendor that you are using. + */ +typedef enum { + MSG26XXM_SW_ID_XXXX = 0x0001, + MSG26XXM_SW_ID_YYYY = 0x0002, + MSG26XXM_SW_ID_UNDEFINED +} Msg26xxmSwId_e; + +/* + * Note. + * 0x0000 and 0xFFFF are not allowed to be defined as SW ID. + * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it. + * Please modify the SW ID of the below enum value depends on the TP vendor that you are using. + */ +typedef enum { + MSG28XX_SW_ID_XXXX = 0x0001, + MSG28XX_SW_ID_YYYY = 0x0002, + MSG28XX_SW_ID_UNDEFINED +} Msg28xxSwId_e; +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern void DrvFwCtrlOpenGestureWakeup(u32 *pMode); +extern void DrvFwCtrlCloseGestureWakeup(void); + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern void DrvFwCtrlOpenGestureDebugMode(u8 nGestureFlag); +extern void DrvFwCtrlCloseGestureDebugMode(void); +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +extern u32 DrvFwCtrlReadDQMemValue(u16 nAddr); +extern void DrvFwCtrlWriteDQMemValue(u16 nAddr, u32 nData); + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +extern void DrvFwCtrlCheckFirmwareUpdateBySwId(void); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +extern u16 DrvFwCtrlChangeFirmwareMode(u16 nMode); +extern void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo); +extern u16 DrvFwCtrlGetFirmwareMode(void); +extern void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void); + +#ifdef CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA +extern void DrvFwCtrlGetTouchPacketAddress(u16 *pDataAddress, u16 *pFlagAddress); +#endif //CONFIG_ENABLE_SEGMENT_READ_FINGER_TOUCH_DATA + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +extern s32 DrvFwCtrlEnableProximity(void); +extern s32 DrvFwCtrlDisableProximity(void); +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +extern void DrvFwCtrlVariableInitialize(void); +extern void DrvFwCtrlOptimizeCurrentConsumption(void); +extern u8 DrvFwCtrlGetChipType(void); +extern void DrvFwCtrlGetCustomerFirmwareVersionByDbBus(EmemType_e eEmemType, u16 *pMajor, u16 *pMinor, u8 **ppVersion); +extern void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion); +extern void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion); +extern void DrvFwCtrlHandleFingerTouch(void); +extern s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType); +extern s32 DrvFwCtrlUpdateFirmwareBySdCard(const char *pFilePath); + +#ifdef CONFIG_ENABLE_HOTKNOT +extern void ReportHotKnotCmd(u8 *pPacket, u16 nLength); +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_GLOVE_MODE +extern void DrvIcFwCtrlOpenGloveMode(void); +extern void DrvIcFwCtrlCloseGloveMode(void); +extern void DrvIcFwCtrlGetGloveInfo(u8 *pGloveMode); +#endif //CONFIG_ENABLE_GLOVE_MODE + +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + +#endif /* __MSTAR_DRV_MUTUAL_FW_CONTROL_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.c b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.c new file mode 100644 index 00000000..b506ad47 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.c @@ -0,0 +1,3421 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_mutual_mp_test.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_mutual_mp_test.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_mutual_fw_control.h" +#include "mstar_drv_platform_porting_layer.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +#include "msg26xxm_open_test_X.h" +#include "msg26xxm_short_test_X.h" +#include "msg28xx_mp_test_X.h" + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; + +extern u8 g_ChipType; + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u32 _gIsInMpTest = 0; +static u32 _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT; +static ItoTestMode_e _gItoTestMode = 0; + +static s32 _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING; + +static u16 _gSenseLineNum = 0; +static u16 _gDriveLineNum = 0; +static u16 _gWaterProofNum = 0; + +static struct work_struct _gCtpItoTestWork; +static struct workqueue_struct *_gCtpMpTestWorkQueue = NULL; + +static s32 _gDeltaC[MAX_MUTUAL_NUM] = {0}; +static s32 _gResult[MAX_MUTUAL_NUM] = {0}; +static s32 _gDeltaCWater[12] = {0}; +static s32 _gResultWater[12] = {0}; +//static u8 _gMode[MAX_MUTUAL_NUM] = {0}; +static s32 _gSenseR[MAX_CHANNEL_NUM] = {0}; +static s32 _gDriveR[MAX_CHANNEL_NUM] = {0}; +static s32 _gGRR[MAX_CHANNEL_NUM] = {0}; +static s32 _gTempDeltaC[MAX_MUTUAL_NUM] = {0}; + +static u8 _gTestFailChannel[MAX_MUTUAL_NUM] = {0}; +static u32 _gTestFailChannelCount = 0; + +static u8 _gShortTestChannel[MAX_CHANNEL_NUM] = {0}; + +TestScopeInfo_t g_TestScopeInfo = {0}; + +static u8 _gTestAutoSwitchFlag = 1; +static u8 _gTestSwitchMode = 0; + +u16 _gMuxMem_20_3E_0_Settings[16] = {0}; +u16 _gMuxMem_20_3E_1_Settings[16] = {0}; +u16 _gMuxMem_20_3E_2_Settings[16] = {0}; +u16 _gMuxMem_20_3E_3_Settings[16] = {0}; +u16 _gMuxMem_20_3E_4_Settings[16] = {0}; +u16 _gMuxMem_20_3E_5_Settings[16] = {0}; +u16 _gMuxMem_20_3E_6_Settings[16] = {0}; + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static void _DrvMpTestItoTestMsg26xxmSetToNormalMode(void) +{ + u16 nRegData = 0; + u16 nTmpAddr = 0, nAddr = 0; + u16 nDriveNumGeg = 0, nSenseNumGeg = 0; + u16 i = 0; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x0FE6, 0x0001); + + nRegData = RegGet16BitValue(0x110E); + + if (nRegData == 0x1D08) + { + DBG("Wrong mode 0\n"); + } + + nRegData &= 0x0800; + + if (nRegData > 1) + { + DBG("Wrong mode\n"); + } + + RegSet16BitValueOff(0x110E, 0x0800); + RegSet16BitValueOn(0x1116, 0x0005); + RegSet16BitValueOn(0x114A, 0x0001); + + for (i = 0; i < 7; i ++) + { + nTmpAddr = 0x3C + i; + nTmpAddr = nTmpAddr * 2; + nAddr = (0x11 << 8) | nTmpAddr; + RegSet16BitValue(nAddr, MSG26XXM_open_ANA1_N_X[i]); + } + + RegSet16BitValue(0x1E66, 0x0000); + RegSet16BitValue(0x1E67, 0x0000); + RegSet16BitValue(0x1E68, 0x0000); + RegSet16BitValue(0x1E69, 0x0000); + RegSet16BitValue(0x1E6A, 0x0000); + RegSet16BitValue(0x1E6B, 0x0000); + + for (i = 0; i < 21; i ++) + { + nTmpAddr = 3 + i; + nTmpAddr = nTmpAddr * 2; + nAddr = (0x10 << 8) | nTmpAddr; + RegSet16BitValue(nAddr, MSG26XXM_open_ANA3_N_X[i]); + } + + nDriveNumGeg = ((MSG26XXM_DRIVE_NUM - 1) << 8 & 0xFF00); + nSenseNumGeg = (MSG26XXM_SENSE_NUM & 0x00FF); + + RegSet16BitValue(0x1216, nDriveNumGeg); + RegSet16BitValue(0x102E, nSenseNumGeg); + + RegSet16BitValue(0x0FE6, 0x0001); + + DBG("Wrong mode correction\n"); +} + +/* +static void _DrvMpTestItoTestMsg26xxmSetToWaterProofMode(void) +{ + u16 nTmpAddr = 0, nAddr = 0; + u16 i = 0; + u16 nCsubWPdata = 0; + + DBG("*** %s() ***\n", __func__); + + nCsubWPdata = (WATERPROOF_CSUB_REF << 8) | WATERPROOF_CSUB_REF; + + for (i = 0; i < 7; i ++) + { + nTmpAddr = 0x3C + i; + nTmpAddr = nTmpAddr * 2; + nAddr = (0x11 << 8) | nTmpAddr; + RegSet16BitValue(nAddr, MSG26XXM_WATERPROOF_ANA1_N_X[i]); + } + + for (i = 0; i < 21; i ++) + { + nTmpAddr = 3 + i; + nTmpAddr = nTmpAddr * 2; + nAddr = (0x10 << 8) | nTmpAddr; + RegSet16BitValue(nAddr, MSG26XXM_WATERPROOF_ANA3_N_X[i]); + } + + // ana2 write + RegSet16BitValue(0x1216, 0x0000); + + for (i = 0; i < 6; i ++) + { + nTmpAddr = 0x20 + i; + nTmpAddr = nTmpAddr * 2; + nAddr = (0x10 << 8) | nTmpAddr; + RegSet16BitValue(nAddr, nCsubWPdata); + } + + RegSet16BitValueOn(0x1116, 0x0005); + RegSet16BitValueOn(0x114A, 0x0001); + RegSet16BitValue(0x1208, 0x0002); + + DBG("WaterProof : Wrong mode correction\n"); +} +*/ + +void _ItoTestDebugShowArray(void *pBuf, u16 nLen, int nDataType, int nCarry, int nChangeLine) +{ + u8 * pU8Buf = NULL; + s8 * pS8Buf = NULL; + u16 * pU16Buf = NULL; + s16 * pS16Buf = NULL; + u32 * pU32Buf = NULL; + s32 * pS32Buf = NULL; + int i; + + if(nDataType == 8) + pU8Buf = (u8 *)pBuf; + else if(nDataType == -8) + pS8Buf = (s8 *)pBuf; + else if(nDataType == 16) + pU16Buf = (u16 *)pBuf; + else if(nDataType == -16) + pS16Buf = (s16 *)pBuf; + else if(nDataType == 32) + pU32Buf = (u32 *)pBuf; + else if(nDataType == -32) + pS32Buf = (s32 *)pBuf; + + for(i=0; i < nLen; i++) + { + if(nCarry == 16) + { + if(nDataType == 8) + DBG("%02X ", pU8Buf[i]); + else if(nDataType == -8) + DBG("%02X ", pS8Buf[i]); + else if(nDataType == 16) + DBG("%04X ", pU16Buf[i]); + else if(nDataType == -16) + DBG("%04X ", pS16Buf[i]); + else if(nDataType == 32) + DBG("%08X ", pU32Buf[i]); + else if(nDataType == -32) + DBG("%08X ", pS32Buf[i]); + } + else if(nCarry == 10) + { + if(nDataType == 8) + DBG("%6d ", pU8Buf[i]); + else if(nDataType == -8) + DBG("%6d ", pS8Buf[i]); + else if(nDataType == 16) + DBG("%6d ", pU16Buf[i]); + else if(nDataType == -16) + DBG("%6d ", pS16Buf[i]); + else if(nDataType == 32) + DBG("%6d ", pU32Buf[i]); + else if(nDataType == -32) + DBG("%6d ", pS32Buf[i]); + } + + if(i%nChangeLine == nChangeLine-1){ + DBG("\n"); + } + } + DBG("\n"); +} + +void _ItoTestDebugShowS32Array(s32 *pBuf, u16 nRow, u16 nCol) +{ + int i, j; + + for(j=0; j < nRow; j++) + { + for(i=0; i < nCol; i++) + { + DBG("%4d ", pBuf[i * nRow + j]); + } + DBG("\n"); + } + DBG("\n"); +} + +static void _DrvMpTestItoTestMsg26xxmMcuStop(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 +} + +static void _DrvMpTestItoTestMsg26xxmAnaSwitchToMutual(void) +{ + u16 nTemp = 0; + + DBG("*** %s() ***\n", __func__); + + nTemp = RegGet16BitValue(0x114A); //bank:ana, addr:h0025 + nTemp |= BIT0; + RegSet16BitValue(0x114A, nTemp); + nTemp = RegGet16BitValue(0x1116); //bank:ana, addr:h000b + nTemp |= (BIT2 | BIT0); + RegSet16BitValue(0x1116, nTemp); +} + +static u16 _DrvMpTestItoTestAnaGetMutualChannelNum(void) +{ + u16 nSenseLineNum = 0; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nRegData = RegGet16BitValue(0x102E); //bank:ana3, addr:h0017 + nSenseLineNum = nRegData & 0x000F; + + DBG("nSenseLineNum = %d\n", nSenseLineNum); + + return nSenseLineNum; +} + +static u16 _DrvMpTestItoTestAnaGetMutualSubFrameNum(void) +{ + u16 nDriveLineNum = 0; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nRegData = RegGet16BitValue(0x1216); //bank:ana2, addr:h000b + nDriveLineNum = ((nRegData & 0xFF00) >> 8) + 1; //Since we only retrieve 8th~12th bit of reg_m_sf_num, 0xFF00 shall be changed to 0x1F00. + + DBG("nDriveLineNum = %d\n", nDriveLineNum); + + return nDriveLineNum; +} + +/* +static void _DrvMpTestItoOpenTestMsg26xxmAnaGetMutualCSub(u8 *pMode) +{ + u16 i, j; + u16 nSenseLineNum; + u16 nDriveLineNum; + u16 nTotalNum; + u8 szDataAna4[3]; + u8 szDataAna3[3]; + u8 szDataAna41[ANA4_MUTUAL_CSUB_NUMBER]; //200 = 392 - 192 + u8 szDataAna31[ANA3_MUTUAL_CSUB_NUMBER]; //192 = 14 * 13 + 10 + u8 szModeTemp[MAX_MUTUAL_NUM]; + + DBG("*** %s() ***\n", __func__); + + nTotalNum = MAX_MUTUAL_NUM; + + nSenseLineNum = _DrvMpTestItoTestAnaGetMutualChannelNum(); + nDriveLineNum = _DrvMpTestItoTestAnaGetMutualSubFrameNum(); + + if (ANA4_MUTUAL_CSUB_NUMBER > 0) + { + mdelay(100); + for (i = 0; i < ANA4_MUTUAL_CSUB_NUMBER; i ++) + { + szDataAna41[i] = 0; + } + + szDataAna4[0] = 0x10; + szDataAna4[1] = 0x15; //bank:ana4, addr:h0000 + szDataAna4[2] = 0x00; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDataAna4[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &szDataAna41[0], ANA4_MUTUAL_CSUB_NUMBER); //200 + + nTotalNum -= (u16)ANA4_MUTUAL_CSUB_NUMBER; + } + + for (i = 0; i < nTotalNum; i ++) + { + szDataAna31[i] = 0; + } + + mdelay(100); + + szDataAna3[0] = 0x10; + szDataAna3[1] = 0x10; //bank:ana3, addr:h0020 + szDataAna3[2] = 0x40; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDataAna3[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &szDataAna31[0], ANA3_MUTUAL_CSUB_NUMBER); //192 + + for (i = 0; i < ANA3_MUTUAL_CSUB_NUMBER; i ++) + { + szModeTemp[i] = szDataAna31[i]; + } + + for (i = ANA3_MUTUAL_CSUB_NUMBER; i < (ANA3_MUTUAL_CSUB_NUMBER + ANA4_MUTUAL_CSUB_NUMBER); i ++) + { + szModeTemp[i] = szDataAna41[i - ANA3_MUTUAL_CSUB_NUMBER]; + } + + for (i = 0; i < nDriveLineNum; i ++) + { + for (j = 0; j < nSenseLineNum; j ++) + { + _gMode[j * nDriveLineNum + i] = szModeTemp[i * MAX_CHANNEL_SEN + j]; + +// DBG("_gMode[%d] = %d\n", j * nDriveLineNum + i, _gMode[j * nDriveLineNum + i]); + } + } +} +*/ + +static void _DrvMpTestItoOpenTestMsg26xxmAnaSetMutualCSub(u16 nCSub) +{ + u16 i = 0; + u8 szDbBusTxData[256] = {0}; + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x15; //bank:ana4, addr:h0000 + szDbBusTxData[2] = 0x00; + + for (i = 3; i < (3+ANA4_MUTUAL_CSUB_NUMBER); i ++) + { + szDbBusTxData[i] = (u8)nCSub; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+ANA4_MUTUAL_CSUB_NUMBER); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x10; //bank:ana3, addr:h0020 + szDbBusTxData[2] = 0x40; + + for (i = 3; i < 3+ANA3_MUTUAL_CSUB_NUMBER; i ++) + { + szDbBusTxData[i] = (u8)nCSub; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+ANA3_MUTUAL_CSUB_NUMBER); +} + +static void _DrvMpTestItoTestMsg26xxmDisableFilterNoiseDetect(void) +{ + u16 nTemp = 0; + + DBG("*** %s() ***\n", __func__); + + nTemp = RegGet16BitValue(0x1302); //bank:fir, addr:h0001 + nTemp &= (~(BIT2 | BIT1 | BIT0)); + RegSet16BitValue(0x1302, nTemp); +} + +static void _DrvMpTestItoTestMsg26xxmAnaSwReset(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x1100, 0xFFFF); //bank:ana, addr:h0000 + RegSet16BitValue(0x1100, 0x0000); + mdelay(100); +} + +static void _DrvMpTestItoTestMsg26xxmEnableAdcOneShot(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x130C, BIT15); //bank:fir, addr:h0006 + RegSet16BitValue(0x1214, 0x0031); +} + +static void _DrvMpTestItoTestGetMutualOneShotRawIir(u16 wszResultData[][MAX_CHANNEL_DRV], u16 nDriveLineNum, u16 nSenseLineNum) +{ + u16 nRegData; + u16 i, j; + u16 nTemp; + u16 nReadSize; + u8 szDbBusTxData[3]; + u8 szShotData1[FILTER1_MUTUAL_DELTA_C_NUMBER]; //190 = (6 * 14 + 11) * 2 + u8 szShotData2[FILTER2_MUTUAL_DELTA_C_NUMBER]; //594 = (MAX_MUTUAL_NUM - (6 * 14 + 11)) * 2 + + DBG("*** %s() ***\n", __func__); + + nTemp = RegGet16BitValue(0x3D08); //bank:intr_ctrl, addr:h0004 + nTemp &= (~(BIT8 | BIT4)); + RegSet16BitValue(0x3D08, nTemp); + + _DrvMpTestItoTestMsg26xxmEnableAdcOneShot(); + + nRegData = 0; + while (0x0000 == (nRegData & BIT8)) + { + nRegData = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c + } + + for (i = 0; i < FILTER1_MUTUAL_DELTA_C_NUMBER; i ++) + { + szShotData1[i] = 0; + } + + for (i = 0; i < FILTER2_MUTUAL_DELTA_C_NUMBER; i ++) + { + szShotData2[i] = 0; + } + + mdelay(100); + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x13; //bank:fir, addr:h0021 + szDbBusTxData[2] = 0x42; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &szShotData1[0], FILTER1_MUTUAL_DELTA_C_NUMBER); //190 + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mdelay(100); + nReadSize = IicSegmentReadDataByDbBus(0x20, 0x00, &szShotData2[0], FILTER2_MUTUAL_DELTA_C_NUMBER, MAX_I2C_TRANSACTION_LENGTH_LIMIT); //594 + DBG("*** nReadSize = %d ***\n", nReadSize); // add for debug +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + mdelay(100); + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x20; //bank:fir2, addr:h0000 + szDbBusTxData[2] = 0x00; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &szShotData2[0], FILTER2_MUTUAL_DELTA_C_NUMBER); //594 +#endif + + for (j = 0; j < nDriveLineNum; j ++) + { + for (i = 0; i < nSenseLineNum; i ++) + { + // FILTER1 : SF0~SF5, AFE0~AFE13; SF6, AFE0~AFE10 + if ((j <= 5) || ((j == 6) && (i <= 10))) + { + nRegData = (u16)(szShotData1[(j * 14 + i) * 2] | szShotData1[(j * 14 + i) * 2 + 1] << 8); + wszResultData[i][ j] = (short)nRegData; + } + else + { + // FILTER2 : SF6, AFE11~AFE13 + if ((j == 6) && (i > 10)) + { + nRegData = (u16)(szShotData2[((j - 6) * 14 + (i - 11)) * 2] | szShotData2[((j - 6) * 14 + (i - 11)) * 2 + 1] << 8); + wszResultData[i][j] = (short)nRegData; + } + else + { + nRegData = (u16)(szShotData2[6 + ((j - 7) * 14 + i) * 2] | szShotData2[6 + ((j - 7) * 14 + i) * 2 + 1] << 8); + wszResultData[i][j] = (short)nRegData; + } + } + } + } + + nTemp = RegGet16BitValue(0x3D08); //bank:intr_ctrl, addr:h0004 + nTemp |= (BIT8 | BIT4); + RegSet16BitValue(0x3D08, nTemp); +} + +static void _DrvMpTestItoTestMsg26xxmGetDeltaC(s32 *pTarget) +{ + s16 nTemp; + u16 wszRawData[MAX_CHANNEL_SEN][MAX_CHANNEL_DRV]; + u16 i, j; + u16 nDriveLineNum = 0, nSenseLineNum = 0, nShift = 0; + + DBG("*** %s() ***\n", __func__); + + nSenseLineNum = _DrvMpTestItoTestAnaGetMutualChannelNum(); + nDriveLineNum = _DrvMpTestItoTestAnaGetMutualSubFrameNum(); + + _DrvMpTestItoTestGetMutualOneShotRawIir(wszRawData, nDriveLineNum, nSenseLineNum); + + for (i = 0; i < nSenseLineNum; i ++) + { + for (j = 0; j < nDriveLineNum; j ++) + { + nShift = (u16)(i * nDriveLineNum + j); + nTemp = (s16)wszRawData[i][j]; + pTarget[nShift] = nTemp; + +// DBG("wszRawData[%d][%d] = %d\n", i, j, nTemp); + } + } +} + +static s32 _DrvMpTestItoTestMsg26xxmReadTrunkFwVersion(u32* pVersion) +{ + u16 nMajor = 0; + u16 nMinor = 0; + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x24; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + DBG("szDbBusRxData[0] = 0x%x\n", szDbBusRxData[0]); // add for debug + DBG("szDbBusRxData[1] = 0x%x\n", szDbBusRxData[1]); // add for debug + DBG("szDbBusRxData[2] = 0x%x\n", szDbBusRxData[2]); // add for debug + DBG("szDbBusRxData[3] = 0x%x\n", szDbBusRxData[3]); // add for debug + + nMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0]; + nMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2]; + + DBG("*** major = %x ***\n", nMajor); + DBG("*** minor = %x ***\n", nMinor); + + *pVersion = (nMajor << 16) + nMinor; + + return 0; +} + +static s32 _DrvMpTestItoTestMsg26xxmGetSwitchFlag(void) +{ + u32 nFwVersion = 0; + + DBG("*** %s() ***\n", __func__); + + if(_DrvMpTestItoTestMsg26xxmReadTrunkFwVersion(&nFwVersion) < 0) + { + _gTestSwitchMode = 0; + return 0; + } + + if(nFwVersion >= 0x10030000) + _gTestSwitchMode = 1; + else + _gTestSwitchMode = 0; + + return 0; +} + +static s32 _DrvMpTestItoTestMsg26xxmCheckSwitchStatus(void) +{ + u32 nRegData = 0; + int nTimeOut = 100; + int nT = 0; + + DBG("*** %s() ***\n", __func__); + + do + { + nRegData = RegGet16BitValue(0x3CE4); + mdelay(20); + nT++; + if (nT > nTimeOut) + { + return -1; + } + DBG("*** %s() nRegData:%x***\n", __func__ , nRegData); + + } while (nRegData != 0x7447); + + return 0; +} + +static s32 _DrvMpTestItoTestMsg26xxmSwitchFwMode(u8 nFWMode) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x0FE6, 0x0001); //MCU_stop + mdelay(150); + + RegSet16BitValue(0X3C60, 0xAA55); // disable watch dog + + RegSet16BitValue(0X3D08, 0xFFFF); + RegSet16BitValue(0X3D18, 0xFFFF); + + RegSet16BitValue(0x3CE4, 0x7474); + + //RegSet16BitValue(0x1E04, 0x7D60); + RegSet16BitValue(0x1E04, 0x829F); + RegSet16BitValue(0x0FE6, 0x0000); + mdelay(150); + + if (_DrvMpTestItoTestMsg26xxmCheckSwitchStatus() < 0) + { + DBG("*** Msg26xx MP Test# CheckSwitchStatus failed! ***\n"); + return -1; + } + + switch (nFWMode) + { + case MUTUAL: + RegSet16BitValue(0x3CE4, 0x5705); + break; + + case SELF: + RegSet16BitValue(0x3CE4, 0x6278); + break; + + case WATERPROOF: + RegSet16BitValue(0x3CE4, 0x7992); + DBG("*** Msg26xx MP Test# WATERPROOF mode***\n"); + break; + + default: + return -1; + } + if (_DrvMpTestItoTestMsg26xxmCheckSwitchStatus()<0) + { + DBG("*** Msg26xx MP Test# CheckSwitchStatus failed! ***\n"); + return -1; + } + + RegSet16BitValue(0x0FE6, 0x0001);// stop mcu + RegSet16BitValue(0x3D08, 0xFEFF);//open timer + + return 0; +} + +static s32 _DrvMpTestItoTestMsg26xxmSwitchMode(u8 nSwitchMode, u8 nFMode) +{ + if (_gTestSwitchMode != 0) + { + if (_DrvMpTestItoTestMsg26xxmSwitchFwMode(nFMode) < 0) + { + if (nFMode == MUTUAL) + { + _DrvMpTestItoTestMsg26xxmSetToNormalMode(); + } + else + { + //_DrvMpTestItoTestMsg26xxmSetToWaterProofMode(); + DBG("*** Msg26xx MP Test# _DrvMpTestItoTestMsg26xxmSwitchMode failed! ***\n"); + return -1; + } + } + } + else + { + if (nFMode == MUTUAL) + { + _DrvMpTestItoTestMsg26xxmSetToNormalMode(); + } + else + { + //_DrvMpTestItoTestMsg26xxmSetToWaterProofMode(); + DBG("*** Msg26xx MP Test# _DrvMpTestItoTestMsg26xxmSwitchMode failed! ***\n"); + return -1; + } + } + + return 0; +} + +s32 _DrvMpTestMsg26xxmItoOpenTestEntry(void) +{ + s32 nRetVal = 0; + s32 nPrev = 0, nDelta = 0; + u16 i = 0, j = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrDisableFingerTouchReport(); + + DrvPlatformLyrTouchDeviceResetHw(); + + //auto detetc fw version to decide switch fw mode + if (_gTestAutoSwitchFlag != 0) + { + _DrvMpTestItoTestMsg26xxmGetSwitchFlag(); + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + _DrvMpTestItoTestMsg26xxmSwitchMode(_gTestSwitchMode, MUTUAL); + + _DrvMpTestItoTestMsg26xxmMcuStop(); + mdelay(10); + + for (i = 0; i < MAX_MUTUAL_NUM; i ++) + { + _gTestFailChannel[i] = 0; + } + + _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start + + _gSenseLineNum = _DrvMpTestItoTestAnaGetMutualChannelNum(); + _gDriveLineNum = _DrvMpTestItoTestAnaGetMutualSubFrameNum(); + + _DrvMpTestItoOpenTestMsg26xxmAnaSetMutualCSub(MSG26XXM_OPEN_CSUB_REF_X); + _DrvMpTestItoTestMsg26xxmDisableFilterNoiseDetect(); + + // Set charge&dump time + RegSet16BitValue(0x1224, 0xFFC0); + RegSet16BitValue(0x122A, 0x0C0A); + + _DrvMpTestItoTestMsg26xxmAnaSwReset(); + _DrvMpTestItoTestMsg26xxmGetDeltaC(_gDeltaC); + + for (i = 0; i < _gSenseLineNum; i ++) + { + DBG("\nSense[%02d]\t", i); + + for (j = 0; j < _gDriveLineNum; j ++) + { + _gResult[i * _gDriveLineNum + j] = (4464*MSG26XXM_OPEN_CSUB_REF_X - _gDeltaC[i * _gDriveLineNum + j]); + DBG("%d %d %d\t", _gResult[i * _gDriveLineNum + j], 4464*MSG26XXM_OPEN_CSUB_REF_X, _gDeltaC[i * _gDriveLineNum + j]); + } + } + + DBG("\n\n\n"); + +// for (j = 0; j < _gDriveLineNum; j ++) + for (j = 0; j < (_gDriveLineNum-1); j ++) + { + for (i = 0; i < _gSenseLineNum; i ++) + { + if (_gResult[i * _gDriveLineNum + j] < FIR_THRESHOLD) + { + _gTestFailChannel[i * _gDriveLineNum + j] = 1; + _gTestFailChannelCount ++; + nRetVal = -1; + DBG("\nSense%d, Drive%d, MIN_Threshold = %d\t", i, j, _gResult[i * _gDriveLineNum + j]); + } + + if (i > 0) + { + nDelta = _gResult[i * _gDriveLineNum + j] > nPrev ? (_gResult[i * _gDriveLineNum + j] - nPrev) : (nPrev - _gResult[i * _gDriveLineNum + j]); + if (nDelta > nPrev*FIR_RATIO/100) + { + if (0 == _gTestFailChannel[i * _gDriveLineNum + j]) // for avoid _gTestFailChannelCount to be added twice + { + _gTestFailChannel[i * _gDriveLineNum + j] = 1; + _gTestFailChannelCount ++; + } + nRetVal = -1; + DBG("\nSense%d, Drive%d, MAX_Ratio = %d,%d\t", i, j, nDelta, nPrev); + } + } + nPrev = _gResult[i * _gDriveLineNum + j]; + } + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + DrvPlatformLyrEnableFingerTouchReport(); + + return nRetVal; +} + +static void _DrvMpTestItoOpenTestSetMutualCsubViaDBbus(s16 nCSub) +{ + u8 nBaseLen = 6; + u16 nFilter = 0x3F; + u16 nLastFilter = 0xFFF; + u8 nBasePattern = nCSub & nFilter; + u8 nPattern; + u16 n16BitsPattern; + u16 nCSub16Bits[5] = {0}; + int i; + + DBG("*** %s() ***\n", __func__); + + for(i=0; i<5; i++) + { + if(i == 0) + { + nPattern = nBasePattern; //Patn => Pattern + } + + n16BitsPattern = ((nPattern & 0xF) << nBaseLen*2) | (nPattern << nBaseLen) | nPattern; + + if(i == 4) + { + nCSub16Bits[i] = n16BitsPattern & nLastFilter; + } + else + { + nCSub16Bits[i] = n16BitsPattern; + } + nPattern = (u8)((n16BitsPattern >> 4) & nFilter); + } + + RegSet16BitValue(0x215C, 0x1FFF); + + for (i = 0; i < 5; i++) + { + RegSet16BitValue(0x2148 + 2 * i, nCSub16Bits[i]); + RegSet16BitValue(0x2152 + 2 * i, nCSub16Bits[i]); + } +} + +/* +static void _DrvMpTestItoOpenTestAFEGainOne(void) +{ + u8 nRegData = 0; + u16 nAFECoef = 0; + + DBG("*** %s() ***\n", __func__); + + // AFE gain = 1X + RegSet16BitValue(0x1318, 0x4440); + RegSet16BitValue(0x131A, 0x4444); + RegSet16BitValue(0x13D6, 0x2000); + + RegSet16BitValue(0x2160, 0x0040); + RegSet16BitValue(0x2162, 0x0040); + RegSet16BitValue(0x2164, 0x0040); + RegSet16BitValue(0x2166, 0x0040); + RegSet16BitValue(0x2168, 0x0040); + RegSet16BitValue(0x216A, 0x0040); + RegSet16BitValue(0x216C, 0x0040); + RegSet16BitValue(0x216E, 0x0040); + RegSet16BitValue(0x2170, 0x0040); + RegSet16BitValue(0x2172, 0x0040); + RegSet16BitValue(0x2174, 0x0040); + RegSet16BitValue(0x2176, 0x0040); + RegSet16BitValue(0x2178, 0x0040); + RegSet16BitValue(0x217A, 0x1FFF); + RegSet16BitValue(0x217C, 0x1FFF); + + /// reg_hvbuf_sel_gain + RegSet16BitValue(0x1564, 0x0077); + + /// all AFE Cfb use defalt (50p) + RegSet16BitValue(0x1508, 0x1FFF);// all AFE Cfb: SW control + RegSet16BitValue(0x1550, 0x0000);// all AFE Cfb use defalt (50p) + + ///ADC: AFE Gain bypass + RegSet16BitValue(0x1260, 0x1FFF); + + //AFE coef + nRegData = RegGetLByteValue(0x101A); + nAFECoef = (u16)(0x10000/nRegData); + RegSet16BitValue(0x13D6, nAFECoef); +} +*/ + +static void _DrvMpTestItoOpenTestAFEGainOne(void) +{ + // AFE gain = 1X + u16 nAfeGain = 0; + u16 nDriOpening = 0; + u8 nRegData = 0; + u16 nAfeCoef = 0; + u16 i = 0; + + + //proto.MstarReadReg(loopDevice, (uint)0x1312, ref regdata); //get dri num + nRegData = RegGetLByteValue(0x1312); + nDriOpening = nRegData; + + ///filter unit gain + if (nDriOpening == 11 || nDriOpening == 15) + { + RegSet16BitValue(0x1318, 0x4470); + } + else if (nDriOpening == 7) + { + RegSet16BitValue(0x1318, 0x4460); + } + + //proto.MstarWriteReg_16(loopDevice, 0x131A, 0x4444); + RegSet16BitValue(0x131A, 0x4444); + + ///AFE coef + //proto.MstarReadReg(loopDevice, (uint)0x101A, ref regdata); + nRegData = RegGetLByteValue(0x101A); + nAfeCoef = 0x10000 / nRegData; + //proto.MstarWriteReg_16(loopDevice, (uint)0x13D6, AFE_coef); + RegSet16BitValue(0x13D6, nAfeCoef); + + ///AFE gain + if (nDriOpening == 7 || nDriOpening == 15) + { + nAfeGain = 0x0040; + } + else if (nDriOpening == 11) + { + nAfeGain = 0x0055; + } + + for (i = 0; i < 13; i++) + { + RegSet16BitValue(0x2160 + 2 * i, nAfeGain); + } + + ///AFE gain: over write enable + RegSet16BitValue(0x217A, 0x1FFF); + RegSet16BitValue(0x217C, 0x1FFF); + + /// all AFE Cfb use defalt (50p) + RegSet16BitValue(0x1508, 0x1FFF);// all AFE Cfb: SW control + RegSet16BitValue(0x1550, 0x0000);// all AFE Cfb use defalt (50p) + + /// reg_hvbuf_sel_gain + RegSet16BitValue(0x1564, 0x0077); + + ///ADC: AFE Gain bypass + RegSet16BitValue(0x1260, 0x1FFF); +} + +static void _DrvMpTestItoOpenTestCalibrateMutualCsub(s16 nCSub) +{ + u8 nChipVer; + + DBG("*** %s() ***\n", __func__); + + nChipVer = RegGetLByteValue(0x1ECE); + DBG("*** Msg28xx Open Test# Chip ID = %d ***\n", nChipVer); + + if (nChipVer != 0) + RegSet16BitValue(0x10F0, 0x0004);//bit2 + + _DrvMpTestItoOpenTestSetMutualCsubViaDBbus(nCSub); + _DrvMpTestItoOpenTestAFEGainOne(); +} + +static void _DrvMpTestItoTestDBBusReadDQMemStart(void) +{ + u8 nParCmdSelUseCfg = 0x7F; + u8 nParCmdAdByteEn0 = 0x50; + u8 nParCmdAdByteEn1 = 0x51; + u8 nParCmdDaByteEn0 = 0x54; + u8 nParCmdUSetSelB0 = 0x80; + u8 nParCmdUSetSelB1 = 0x82; + u8 nParCmdSetSelB2 = 0x85; + u8 nParCmdIicUse = 0x35; + //u8 nParCmdWr = 0x10; + + DBG("*** %s() ***\n", __func__); + + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSelUseCfg, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdDaByteEn0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdUSetSelB0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdUSetSelB1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSetSelB2, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdIicUse, 1); +} + +/* +static void _DrvMpTestItoTestDBBusReadDQMemStartAddr24(void) +{ + u8 nParCmdSelUseCfg = 0x7F; +// u8 nParCmdAdByteEn0 = 0x50; +// u8 nParCmdAdByteEn1 = 0x51; + u8 nParCmdAdByteEn2 = 0x52; +// u8 nParCmdDaByteEn0 = 0x54; + u8 nParCmdUSetSelB0 = 0x80; + u8 nParCmdUSetSelB1 = 0x82; + u8 nParCmdSetSelB2 = 0x85; + u8 nParCmdIicUse = 0x35; + //u8 nParCmdWr = 0x10; + + DBG("*** %s() ***\n", __func__); + + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSelUseCfg, 1); + //IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn0, 1); + //IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn2, 1); + //IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdDaByteEn0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdUSetSelB0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdUSetSelB1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSetSelB2, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdIicUse, 1); +} +*/ + +static void _DrvMpTestItoTestDBBusReadDQMemEnd(void) +{ + u8 nParCmdNSelUseCfg = 0x7E; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdNSelUseCfg, 1); +} + +/* +static void _DrvMpTestItoTestDBBusReadDQMemEndAddr24(void) +{ + u8 nParCmdSelUseCfg = 0x7F; + u8 nParCmdAdByteEn1 = 0x51; + u8 nParCmdSetSelB0 = 0x81; + u8 nParCmdSetSelB1 = 0x83; + u8 nParCmdNSetSelB2 = 0x84; + u8 nParCmdIicUse = 0x35; + u8 nParCmdNSelUseCfg = 0x7E; + u8 nParCmdNIicUse = 0x34; + + DBG("*** %s() ***\n", __func__); + RegSetLByteValue(0, 0); + + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSelUseCfg, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdAdByteEn1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSetSelB0, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdSetSelB1, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdNSetSelB2, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdIicUse, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdNSelUseCfg, 1); + IicWriteData(SLAVE_I2C_ID_DBBUS, &nParCmdNIicUse, 1); +} +*/ + +static void _DrvMpTestItoTestMsg28xxEnableAdcOneShot(void) +{ + RegSet16BitValueOn(0x100a, BIT0); + + return; +} + +static s32 _DrvMpTestItoTestMsg28xxTriggerMutualOneShot(s16 * pResultData, u16 * pSenNum, u16 * pDrvNum) +{ + u16 nAddr = 0x5000, nAddrNextSF = 0x1A4; + u16 nSF = 0, nAfeOpening = 0, nDriOpening = 0; + u16 nMaxDataNumOfOneSF = 0; + u16 nDriMode = 0; + int nDataShift = -1; + u16 i, j, k; + u8 nRegData = 0; + u8 nShotData[392] = {0};//13*15*2 + u16 nRegDataU16 = 0; + s16 * pShotDataAll = NULL; + + DBG("*** %s() ***\n", __func__); + + nRegData = RegGetLByteValue(0x130A); + nSF = nRegData>>4; + nAfeOpening = nRegData & 0x0f; + + if (nSF == 0) + { + return -1; + } + + nRegData = RegGetLByteValue(0x100B); + nDriMode = nRegData; + + nRegData = RegGetLByteValue(0x1312); + nDriOpening = nRegData; + + DBG("*** Msg28xx MP Test# TriggerMutualOneShot nSF=%d, nAfeOpening=%d, nDriMode=%d, nDriOpening=%d. ***\n", nSF, nAfeOpening, nDriMode, nDriOpening); + + nMaxDataNumOfOneSF = nAfeOpening * nDriOpening; + + pShotDataAll = kzalloc(sizeof(s16) * nSF * nMaxDataNumOfOneSF, GFP_KERNEL); + + RegSet16BitValueOff(0x3D08, BIT8); ///FIQ_E_FRAME_READY_MASK + + ///polling frame-ready interrupt status + _DrvMpTestItoTestMsg28xxEnableAdcOneShot(); + + while (0x0000 == (nRegDataU16 & BIT8)) + { + nRegDataU16 = RegGet16BitValue(0x3D18); + } + + if (nDriMode == 2) // for short test + { + if (nAfeOpening % 2 == 0) + nDataShift = -1; + else + nDataShift = 0; //special case + //s16 nShortResultData[nSF][nAfeOpening]; + + /// get ALL raw data + for (i = 0; i < nSF; i++) + { + _DrvMpTestItoTestDBBusReadDQMemStart(); + RegGetXBitValue(nAddr + i * nAddrNextSF, nShotData, 28, MAX_I2C_TRANSACTION_LENGTH_LIMIT); + _DrvMpTestItoTestDBBusReadDQMemEnd(); + + //_ItoTestDebugShowArray(nShotData, 26, 8, 16, 16); + for (j = 0; j < nAfeOpening; j++) + { + pResultData[i*MAX_CHANNEL_DRV+j] = (s16)(nShotData[2 * j] | nShotData[2 * j + 1] << 8); + + if (nDataShift == 0 && (j == nAfeOpening-1)) + { + pResultData[i*MAX_CHANNEL_DRV+j] = (s16)(nShotData[2 * (j + 1)] | nShotData[2 * (j + 1) + 1] << 8); + } + } + } + + *pSenNum = nSF; + *pDrvNum = nAfeOpening; + } + else // for open test + { + //s16 nOpenResultData[nSF * nAfeOpening][nDriOpening]; + + if (nAfeOpening % 2 == 0 || nDriOpening % 2 == 0) + nDataShift = -1; + else + nDataShift = 0; //special case + + /// get ALL raw data, combine and handle datashift. + for (i = 0; i < nSF; i++) + { + _DrvMpTestItoTestDBBusReadDQMemStart(); + RegGetXBitValue(nAddr + i * nAddrNextSF, nShotData, 392, MAX_I2C_TRANSACTION_LENGTH_LIMIT); + _DrvMpTestItoTestDBBusReadDQMemEnd(); + + //_ItoTestDebugShowArray(nShotData, 390, 8, 10, 16); + for (j = 0; j < nMaxDataNumOfOneSF; j++) + { + pShotDataAll[i*nMaxDataNumOfOneSF+j] = (s16)(nShotData[2 * j] | nShotData[2 * j + 1] << 8); + + if (nDataShift == 0 && j == (nMaxDataNumOfOneSF - 1)) + pShotDataAll[i*nMaxDataNumOfOneSF+j] = (s16)(nShotData[2 * (j + 1)] | nShotData[2 * (j + 1) + 1] << 8); + } + } + + //problem here + for (k = 0; k < nSF; k++) + { + for (i = k * nAfeOpening; i < nAfeOpening * (k + 1); i++) //Sen + { + for (j = 0; j < nDriOpening; j++) //Dri + { + pResultData[i*MAX_CHANNEL_DRV+j] = pShotDataAll[k*nMaxDataNumOfOneSF + (j + (i - nAfeOpening * k) * nDriOpening)]; //resultData[Sen, Dri] + } + } + } + + *pSenNum = nSF * nAfeOpening; + *pDrvNum = nDriOpening; + } + RegSet16BitValueOn(0x3D08, BIT8); ///FIQ_E_FRAME_READY_MASK + RegSet16BitValueOn(0x3D08, BIT4); ///FIQ_E_TIMER0_MASK + + kfree(pShotDataAll); + + return 0; +} + +static s32 _DrvMpTestItoTestMsg28xxGetMutualOneShotRawIIR(s16 * nResultData, u16 * pSenNum, u16 * pDrvNum) +{ + return _DrvMpTestItoTestMsg28xxTriggerMutualOneShot(nResultData, pSenNum, pDrvNum); +} + +static s32 _DrvMpTestItoTestMsg28xxGetDeltaC(s32 *pDeltaC) +{ + s16 * pRawData = NULL; + s16 nRawDataOverlapDone[SENSE_NUM][DRIVE_NUM] = {{0}}; + //s16 nDeltaC[MAX_MUTUAL_NUM] = {0}; + u16 nDrvPos = 0, nSenPos = 0, nShift = 0; + u16 nSenNumBak = 0; + u16 nDrvNumBak = 0; + s16 i, j; + + DBG("*** %s() ***\n", __func__); + + pRawData = kzalloc(sizeof(s16) * MAX_CHANNEL_SEN*2 * MAX_CHANNEL_DRV, GFP_KERNEL); + + if(_DrvMpTestItoTestMsg28xxGetMutualOneShotRawIIR(pRawData, &nSenNumBak, &nDrvNumBak) < 0) + { + DBG("*** Msg28xx Open Test# GetMutualOneShotRawIIR failed! ***\n"); + return -1; + } + + DBG("*** Msg28xx Open Test# nSenNumBak=%d nDrvNumBak=%d ***\n", nSenNumBak, nDrvNumBak); + + for (i = 0; i < nSenNumBak; i++) + { + for (j = 0; j < nDrvNumBak; j++) + { + nShift = (u16)(i * nDrvNumBak + j); + nDrvPos = g_MapVaMutual[nShift][1]; + nSenPos = g_MapVaMutual[nShift][0]; + if (nDrvPos != 0xFF && nSenPos != 0xFF) + nRawDataOverlapDone[nSenPos][nDrvPos] = pRawData[i*MAX_CHANNEL_DRV+j]; + } + } + + for (i = 0; i < _gSenseLineNum; i++) + { + for (j = 0; j < _gDriveLineNum; j++) + { + nShift = (u16)(i * _gDriveLineNum + j); + pDeltaC[nShift] = (s32)nRawDataOverlapDone[i][j]; + } + } + + DBG("*** Msg28xx Open Test# gDeltaC ***\n"); + _ItoTestDebugShowArray(pDeltaC, _gSenseLineNum * _gDriveLineNum, -32, 10, _gSenseLineNum); + + kfree(pRawData); + + return 0; +} + +static void _DrvMpTestItoTestMsg28xxAnaSwReset(void) +{ + DBG("*** %s() ***\n", __func__); + + /// reset ANA + RegSet16BitValueOn(0x1002, (BIT0 | BIT1 | BIT2 | BIT3)); ///reg_tgen_soft_rst: 1 to reset + RegSet16BitValueOff(0x1002, (BIT0 | BIT1 | BIT2 | BIT3)); + + /// delay + mdelay(20); +} + +static s32 _DrvMpTestMsg28xxItoOpenTest(void) +{ + DBG("*** %s() ***\n", __func__); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + _DrvMpTestItoOpenTestCalibrateMutualCsub(CSUB_REF); + RegSet16BitValue(0x156A, 0x000A); ///DAC com voltage + _DrvMpTestItoTestMsg28xxAnaSwReset(); + + + if(_DrvMpTestItoTestMsg28xxGetDeltaC(_gDeltaC) < 0) + { + DBG("*** Msg28xx Open Test# GetDeltaC failed! ***\n"); + return -1; + } + + return 0; +} + +static u8 _DrvMpTestItoTestCheckValueInRange(s32 nValue, s32 nMax, s32 nMin) +{ + if (nValue <= nMax && nValue >= nMin) + { + return 1; + } + else + { + return 0; + } +} + +static s32 _DrvMpTestItoOpenTestMsg28xxOpenJudge(u16 nItemID, s8 pNormalTestResult[][2], u16 pNormalTestResultCheck[][13]/*, u16 nDriOpening*/) +{ + s32 nRetVal = 0; + u16 nCSub = CSUB_REF; + u16 nRowNum = 0, nColumnNum = 0; + u32 nSum=0, nAvg=0, nDelta=0, nPrev=0; + u16 i, j, k; + + DBG("*** %s() ***\n", __func__); + + for (i = 0; i < _gSenseLineNum * _gDriveLineNum; i++) + { + //deltaC_result[i] = deltaC[i]; + //_gResult[i] = 1673 * nCSub - _gDeltaC[i] * 2 / (nDriOpening + 1); + if (_gDeltaC[i] > 31000) + { + return -1; + } + + _gResult[i] = 1673 * nCSub - _gDeltaC[i]; + + // For mutual key, last column if not be used, show number "one". + if ((MUTUAL_KEY == 1 || MUTUAL_KEY == 2) && (KEY_NUM != 0)) + { + if ((_gSenseLineNum < _gDriveLineNum) && ((i + 1) % _gDriveLineNum == 0)) + { + _gResult[i] = -32000; + for (k = 0; k < KEY_NUM; k++) + if ((i + 1) / _gDriveLineNum == KEYSEN[k]) + { + //_gResult[i] = 1673 * nCSub - _gDeltaC[i] * 2 / (nDriOpening + 1); + _gResult[i] = 1673 * nCSub - _gDeltaC[i]; + } + } + + if ((_gSenseLineNum > _gDriveLineNum) && (i > (_gSenseLineNum - 1) * _gDriveLineNum - 1)) + { + _gResult[i] = -32000; + for (k = 0; k < KEY_NUM; k++) + if (((i + 1) - (_gSenseLineNum - 1) * _gDriveLineNum) == KEYSEN[k]) + { + //_gResult[i] = 1673 * nCSub - _gDeltaC[i] * 2 / (nDriOpening + 1); + _gResult[i] = 1673 * nCSub - _gDeltaC[i]; + } + } + } + } + + if(_gDriveLineNum >= _gSenseLineNum) + { + nRowNum = _gDriveLineNum; + nColumnNum = _gSenseLineNum; + } + else + { + nRowNum = _gSenseLineNum; + nColumnNum = _gDriveLineNum; + } + + DBG("*** Msg28xx Open Test# Show _gResult ***\n"); + //_ItoTestDebugShowS32Array(_gResult, nRowNum, nColumnNum); + _ItoTestDebugShowArray(_gResult, nRowNum*nColumnNum, -32, 10, nColumnNum); + + //for (j = 0; j < nRowNum; j ++) + for (j = 0; j < (nRowNum-1); j ++) + { + nSum = 0; + for (i = 0; i < nColumnNum; i++) + { + nSum = nSum + _gResult[i * nRowNum + j]; + } + + nAvg = nSum / nColumnNum; + //DBG("*** Msg28xx Open Test# OpenJudge average=%d ***\n", nAvg); + for (i = 0; i < nColumnNum; i ++) + { + if (0 == _DrvMpTestItoTestCheckValueInRange(_gResult[i * nRowNum + j], (s32)(nAvg + nAvg * DC_RANGE/100), (s32)(nAvg - nAvg * DC_RANGE/100))) + { + _gTestFailChannel[i * nRowNum + j] = 1; + _gTestFailChannelCount ++; + nRetVal = -1; + } + + if (i > 0) + { + nDelta = _gResult[i * nRowNum + j] > nPrev ? (_gResult[i * nRowNum + j] - nPrev) : (nPrev - _gResult[i * nRowNum + j]); + if (nDelta > nPrev*FIR_RATIO/100) + { + if (0 == _gTestFailChannel[i * nRowNum + j]) // for avoid _gTestFailChannelCount to be added twice + { + _gTestFailChannel[i * nRowNum + j] = 1; + _gTestFailChannelCount ++; + } + nRetVal = -1; + DBG("\nSense%d, Drive%d, MAX_Ratio = %d,%d\t", i, j, nDelta, nPrev); + } + } + nPrev = _gResult[i * nRowNum + j]; + } + } + + //DBG("*** Msg28xx Open Test# OpenJudge _gTestFailChannelCount=%d ***\n", _gTestFailChannelCount); + return nRetVal; +} + +static s32 _DrvMpTestItoTestCheckSwitchStatus(void) +{ + u32 nRegData = 0; + int nTimeOut = 100; + int nT = 0; + + do + { + nRegData = RegGet16BitValue(0x1402); + mdelay(20); + nT++; + if (nT > nTimeOut) + { + return -1; + } + + } while (nRegData != 0x7447); + + return 0; +} + +static s32 _DrvMpTestMsg28xxItoTestSwitchFwMode(u8 nFMode) +{ + DBG("*** %s() ***\n", __func__); + + mdelay(100); + RegSet16BitValue(0x0FE6, 0x0001); //MCU_stop + RegSet16BitValue(0X3C60, 0xAA55); // disable watch dog + + RegSet16BitValue(0X3D08, 0xFFFF); + RegSet16BitValue(0X3D18, 0xFFFF); + + RegSet16BitValue(0x1402, 0x7474); + + //RegSet16BitValue((uint)0x1E04, (uint)0x7D60); + RegSet16BitValue(0x1E04, 0x829F); + RegSet16BitValue(0x0FE6, 0x0000); + mdelay(150); + + if (_DrvMpTestItoTestCheckSwitchStatus()<0) + { + DBG("*** Msg28xx MP Test# CheckSwitchStatus failed! ***\n"); + return -1; + } + + switch (nFMode) + { + case MUTUAL: + RegSet16BitValue(0x1402, 0x5705); + break; + + case SELF: + RegSet16BitValue(0x1402, 0x6278); + break; + + case WATERPROOF: + RegSet16BitValue(0x1402, 0x7992); + break; + + case MUTUAL_SINGLE_DRIVE: + RegSet16BitValue(0x1402, 0x0158); + break; + + default: + return -1; + } + if (_DrvMpTestItoTestCheckSwitchStatus()<0) + { + DBG("*** Msg28xx MP Test# CheckSwitchStatus failed! ***\n"); + return -1; + } + + RegSet16BitValue(0x0FE6, 0x0001);// stop mcu + RegSet16BitValue(0x3D08, 0xFEFF);//open timer + + return 0; +} + +s32 _DrvMpTestMsg28xxItoOpenTestEntry(void) +{ + s32 nRetVal = 0; +// u8 nDrvOpening = 0; + //u16 nCheckState = 0; + s8 nNormalTestResult[8][2] = {{0}}; //0:golden 1:ratio + u16 nNormalTestResultCheck[6][13] = {{0}}; //6:max subframe 13:max afe + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _gSenseLineNum = SENSE_NUM; + _gDriveLineNum = DRIVE_NUM; + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + //reset_only + DbBusResetSlave(); + DbBusEnterSerialDebugMode(); + //DbBusWaitMCU(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + if(_DrvMpTestMsg28xxItoTestSwitchFwMode(MUTUAL) < 0) + { + DBG("*** Msg28xx Open Test# SwitchFwMode failed! ***\n"); + return -1; + } + + //nDrvOpening = RegGetLByteValue(0x1312); + + if(_DrvMpTestMsg28xxItoOpenTest() < 0) + { + DBG("*** Msg28xx Open Test# OpenTest failed! ***\n"); + return -1; + } + + mdelay(10); + + nRetVal = _DrvMpTestItoOpenTestMsg28xxOpenJudge(0, nNormalTestResult, nNormalTestResultCheck/*, nDrvOpening*/); + DBG("*** Msg28xx Open Test# OpenTestOpenJudge return value = %d ***\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + DrvPlatformLyrEnableFingerTouchReport(); + + return nRetVal; +} + +s32 _DrvMpTestItoOpenTest(void) +{ + s32 nRetVal = -1; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + nRetVal = _DrvMpTestMsg26xxmItoOpenTestEntry(); + } + else if (g_ChipType == CHIP_TYPE_MSG28XX) + { + nRetVal = _DrvMpTestMsg28xxItoOpenTestEntry(); + } + + return nRetVal; +} + +static void _DrvMpTestItoTestSendDataIn(u16 nAddr, u16 nLength, u16 *data) +{ + u8 szDbBusTxData[256] = {0}; + int i = 0; + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = (nAddr >> 8) & 0xFF; + szDbBusTxData[2] = (nAddr & 0xFF); + + for (i = 0; i <= nLength ; i ++) + { + szDbBusTxData[3+2*i] = (data[i] & 0xFF); + szDbBusTxData[4+2*i] = (data[i] >> 8) & 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+nLength*2); +} + +static void _DrvMpTestItoShortTestMsg26xxmSetPAD2GPO(u8 nItemID) +{ + u16 gpioSetting[MAX_CHANNEL_NUM] = {0}; + u16 gpioEnabling[MAX_CHANNEL_NUM] = {0}; + u16 gpioZero[MAX_CHANNEL_NUM] = {0}; + u8 gpioNum = 0; + u16 *gpioPIN = NULL; + int i = 0; + int j = 0; + + DBG("*** %s() ***\n", __func__); + + if (nItemID == 1) + { + gpioNum = SHORT_N1_GPO_NUMBER_X; + gpioPIN = kzalloc(sizeof(u16) * gpioNum, GFP_KERNEL); + + for (i = 0; i < gpioNum; i++) + { + gpioPIN[i] = SHORT_N1_GPO_PIN_X[i]; + } + } + else if (nItemID == 2) + { + gpioNum = SHORT_N2_GPO_NUMBER_X; + gpioPIN = kzalloc(sizeof(u16) * gpioNum, GFP_KERNEL); + + for (i = 0; i < gpioNum; i++) + { + gpioPIN[i] = SHORT_N2_GPO_PIN_X[i]; + } + } + else if (nItemID == 3) + { + gpioNum = SHORT_S1_GPO_NUMBER_X; + gpioPIN = kzalloc(sizeof(u16) * gpioNum, GFP_KERNEL); + + for (i = 0; i < gpioNum; i++) + { + gpioPIN[i] = SHORT_S1_GPO_PIN_X[i]; + } + } + else if (nItemID == 4) + { + gpioNum = SHORT_S2_GPO_NUMBER_X; + gpioPIN = kzalloc(sizeof(u16) * gpioNum, GFP_KERNEL); + + for (i = 0; i < gpioNum; i++) + { + gpioPIN[i] = SHORT_S2_GPO_PIN_X[i]; + } + } + DBG("ItemID %d, gpioNum %d",nItemID, gpioNum); + + for (i = 0; i < MAX_CHANNEL_NUM; i++) + { + gpioEnabling[i] = 0xFFFF; + } + + for (i = 0; i < gpioNum; i++) + { + gpioSetting[gpioPIN[i] / 16] |= (u16)(1 << (gpioPIN[i] % 16)); + gpioEnabling[gpioPIN[i] / 16] &= (u16)(~(1 << (gpioPIN[i] % 16))); + } + + ///cts sw overwrite + { + _DrvMpTestItoTestSendDataIn(0x1E66, gpioNum, &gpioSetting[0]); ///who -> will be controlled + _DrvMpTestItoTestSendDataIn(0x1E6C, gpioNum, &gpioEnabling[0]); ///who -> enable sw overwrite + _DrvMpTestItoTestSendDataIn(0x1E72, gpioNum, &gpioZero[0]); ///who -> set2GPO + _DrvMpTestItoTestSendDataIn(0x1E78, gpioNum, &gpioZero[0]); ///who -> GPO2GND + } + + for (j = 0; j < gpioNum; j++) + { + if (PIN_GUARD_RING == gpioPIN[j]) + { + u16 u16RegData; + u16RegData = RegGet16BitValue(0x1E12); + u16RegData = ((u16RegData & 0xFFF9) | BIT0); + RegSet16BitValue(0x1E12, u16RegData); + } + } + + kfree(gpioPIN); +} + +static void _DrvMpTestItoShortTestMsg26xxmChangeANASetting(u8 nItemID) +{ + u16 SHORT_MAP_ANA1[7] = {0}; + u16 SHORT_MAP_ANA2[1] = {0}; + u16 SHORT_MAP_ANA3[21] = {0}; + int i = 0; + + DBG("*** %s() ***\n", __func__); + + if (nItemID == 1) + { + for (i = 0; i < 7; i++) + { + SHORT_MAP_ANA1[i] = short_ANA1_N1_X[i]; + } + + for (i = 0; i < 21; i++) + { + SHORT_MAP_ANA3[i] = short_ANA3_N1_X[i]; + } + + SHORT_MAP_ANA2[0] = short_ANA2_N1_X[0]; + } + else if (nItemID == 2) + { + for (i = 0; i < 7; i++) + { + SHORT_MAP_ANA1[i] = short_ANA1_N2_X[i]; + } + + for (i = 0; i < 21; i++) + { + SHORT_MAP_ANA3[i] = short_ANA3_N2_X[i]; + } + + SHORT_MAP_ANA2[0] = short_ANA2_N2_X[0]; + } + else if (nItemID == 3) + { + for (i = 0; i < 7; i++) + { + SHORT_MAP_ANA1[i] = short_ANA1_S1_X[i]; + } + + for (i = 0; i < 21; i++) + { + SHORT_MAP_ANA3[i] = short_ANA3_S1_X[i]; + } + + SHORT_MAP_ANA2[0] = short_ANA2_S1_X[0]; + } + else if (nItemID == 4) + { + for (i = 0; i < 7; i++) + { + SHORT_MAP_ANA1[i] = short_ANA1_S2_X[i]; + } + + for (i = 0; i < 21; i++) + { + SHORT_MAP_ANA3[i] = short_ANA3_S2_X[i]; + } + + SHORT_MAP_ANA2[0] = short_ANA2_S2_X[0]; + } + + ///change ANA setting + { + _DrvMpTestItoTestSendDataIn(0x1178, 7, &SHORT_MAP_ANA1[0]); ///ANA1_3C_42 + _DrvMpTestItoTestSendDataIn(0x1216, 1, &SHORT_MAP_ANA2[0]); ///ANA2_0B + _DrvMpTestItoTestSendDataIn(0x1006, 21, &SHORT_MAP_ANA3[0]); ///ANA3_03_17 + } +} + +static void _DrvMpTestItoShortTestMsg26xxmAnaFixPrs(u16 nOption) +{ + u16 nTemp = 0; + + DBG("*** %s() ***\n", __func__); + + nTemp = RegGet16BitValue(0x1208); //bank:ana2, addr:h000a + nTemp &= 0x00F1; + nTemp |= (u16)((nOption << 1) & 0x000E); + RegSet16BitValue(0x1208, nTemp); +} + +static void _DrvMpTestItoShortTestMsg26xxmSetNoiseSensorMode(u8 nEnable) +{ + DBG("*** %s() ***\n", __func__); + + if (nEnable) + { + RegSet16BitValueOn(0x110E, BIT11); + RegSet16BitValueOff(0x1116, BIT2); + } + else + { + RegSet16BitValueOff(0x110E, BIT11); + } +} + +static void _DrvMpTestItoShortTestMsg26xxmAndChangeCDtime(u16 nTime1, u16 nTime2) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x1224, nTime1); + RegSet16BitValue(0x122A, nTime2); +} + +static void _DrvMpTestMsg26xxmItoShortTest(u8 nItemID) +{ + int i; + + DBG("*** %s() ***\n", __func__); + + _DrvMpTestItoTestMsg26xxmMcuStop(); + _DrvMpTestItoShortTestMsg26xxmSetPAD2GPO(nItemID); + _DrvMpTestItoShortTestMsg26xxmChangeANASetting(nItemID); + _DrvMpTestItoTestMsg26xxmAnaSwitchToMutual(); + _DrvMpTestItoShortTestMsg26xxmAnaFixPrs(7); + _DrvMpTestItoTestMsg26xxmDisableFilterNoiseDetect(); + _DrvMpTestItoShortTestMsg26xxmSetNoiseSensorMode(1); + _DrvMpTestItoShortTestMsg26xxmAndChangeCDtime(SHORT_Charge_X, SHORT_Dump1_X); + _DrvMpTestItoTestMsg26xxmAnaSwReset(); + _DrvMpTestItoTestMsg26xxmGetDeltaC(_gTempDeltaC); + + _DrvMpTestItoTestMsg26xxmMcuStop(); + _DrvMpTestItoShortTestMsg26xxmSetPAD2GPO(nItemID); + _DrvMpTestItoShortTestMsg26xxmChangeANASetting(nItemID); + _DrvMpTestItoTestMsg26xxmAnaSwitchToMutual(); + _DrvMpTestItoShortTestMsg26xxmAnaFixPrs(7); + _DrvMpTestItoTestMsg26xxmDisableFilterNoiseDetect(); + _DrvMpTestItoShortTestMsg26xxmSetNoiseSensorMode(1); + _DrvMpTestItoShortTestMsg26xxmAndChangeCDtime(SHORT_Charge_X, SHORT_Dump2_X); + _DrvMpTestItoTestMsg26xxmAnaSwReset(); + _DrvMpTestItoTestMsg26xxmGetDeltaC(_gDeltaC); + + for (i = 0; i < MAX_MUTUAL_NUM ; i++) + { + if ((_gDeltaC[i] <= -(IIR_MAX)) || (_gTempDeltaC[i] <= -(IIR_MAX)) || (_gDeltaC[i] >= (IIR_MAX)) || (_gTempDeltaC[i] >= (IIR_MAX))) + { + _gDeltaC[i] = 0x7FFF; + } + else + { + _gDeltaC[i] = abs(_gDeltaC[i] - _gTempDeltaC[i]); + } + //DBG("ItemID%d, MUTUAL_NUM %d, _gDeltaC = %d\t", nItemID, i, _gDeltaC[i]); + } + DBG("\n"); +} + +static s32 _DrvMpTestItoShortTestCovertRValue(s32 nValue) +{ + if (nValue == 0) + { + nValue = 1; + } + + if (nValue >= IIR_MAX) + { + return 0; + } + + return ((500*11398) / (nValue)); +} + +static ItoTestResult_e _DrvMpTestItoShortTestMsg26xxmJudge(u8 nItemID) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u8 nTestPinLength = 0; + u16 i = 0; + u8 nGpioNum = 0; + u8* nTestGpio = NULL; + + DBG("*** %s() ***\n", __func__); + + if (nItemID == 1) + { + nGpioNum = SHORT_N1_TEST_NUMBER_X; + nTestGpio = kzalloc(sizeof(u16) * nGpioNum, GFP_KERNEL); + + for (i = 0; i < nGpioNum; i++) + { + nTestGpio[i] = SHORT_N1_TEST_PIN_X[i]; + } + } + else if (nItemID == 2) + { + nGpioNum = SHORT_N2_TEST_NUMBER_X; + nTestGpio = kzalloc(sizeof(u16) * nGpioNum, GFP_KERNEL); + + for (i = 0; i < nGpioNum; i++) + { + nTestGpio[i] = SHORT_N2_TEST_PIN_X[i]; + } + } + else if (nItemID == 3) + { + nGpioNum = SHORT_S1_TEST_NUMBER_X; + nTestGpio = kzalloc(sizeof(u16) * nGpioNum, GFP_KERNEL); + + for (i = 0; i < nGpioNum; i++) + { + nTestGpio[i] = SHORT_S1_TEST_PIN_X[i]; + } + } + else if (nItemID == 4) + { + nGpioNum = SHORT_S2_TEST_NUMBER_X; + nTestGpio = kzalloc(sizeof(u16) * nGpioNum, GFP_KERNEL); + + for (i = 0; i < nGpioNum; i++) + { + nTestGpio[i] = SHORT_S2_TEST_PIN_X[i]; + } + } + + nTestPinLength = nGpioNum; + + for (i = 0;i < nTestPinLength; i++) + { + _gShortTestChannel[i] = nTestGpio[i]; + + if (0 == _DrvMpTestItoTestCheckValueInRange(_gDeltaC[i], SHORT_VALUE, -SHORT_VALUE)) + { + nRetVal = ITO_TEST_FAIL; + _gTestFailChannelCount++; + DBG("_gShortTestChannel i = %d, _gDeltaC = %d\t", i, _gDeltaC[i]); + } + } + kfree(nTestGpio); + + return nRetVal; +} + +static ItoTestResult_e _DrvMpTestMsg26xxmItoShortTestEntry(void) +{ + ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK, nRetVal4 = ITO_TEST_OK, nRetVal5 = ITO_TEST_OK; + u32 i = 0; + u32 j = 0; + u16 nTestPinCount = 0; + s32 nShortThreshold = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrDisableFingerTouchReport(); + + DrvPlatformLyrTouchDeviceResetHw(); + + //auto detetc fw version to decide switch fw mode + if (_gTestAutoSwitchFlag!=0) + { + _DrvMpTestItoTestMsg26xxmGetSwitchFlag(); + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + _DrvMpTestItoTestMsg26xxmSwitchMode(_gTestSwitchMode, MUTUAL); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gShortTestChannel[i] = 0; + } + + for (i = 0; i < MAX_MUTUAL_NUM; i ++) + { + _gDeltaC[i] = 0; + } + + _gSenseLineNum = _DrvMpTestItoTestAnaGetMutualChannelNum(); + _gDriveLineNum = _DrvMpTestItoTestAnaGetMutualSubFrameNum(); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gShortTestChannel[i] = 0xff; + } + + _gTestFailChannelCount = 0; + + nTestPinCount = 0; // Reset nTestPinCount to 0 before test start + + //N1_ShortTest + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + _DrvMpTestMsg26xxmItoShortTest(1); + } + + nRetVal2 = _DrvMpTestItoShortTestMsg26xxmJudge(1); + + for (i = 0; i < MAX_CHANNEL_NUM; i++) + { + if (_gShortTestChannel[i] != 0) + { + nTestPinCount++; + } + } + + for (i = 0; i < nTestPinCount; i++) + { + for (j = 0; j < _gSenseLineNum; j++) + { + if (_gShortTestChannel[i] == SENSE_X[j]) + { + _gSenseR[j] = _DrvMpTestItoShortTestCovertRValue(_gDeltaC[i]); + + DBG("_gSenseR[%d] = %d\t", j , _gSenseR[j]); + } + } + } + DBG("\n"); + + //clear + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gShortTestChannel[i] = 0xff; + } + + nTestPinCount = 0; + + //N2_ShortTest + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + _DrvMpTestMsg26xxmItoShortTest(2); + } + + nRetVal3 = _DrvMpTestItoShortTestMsg26xxmJudge(2); + + for (i = 0; i < MAX_CHANNEL_NUM; i++) + { + if (_gShortTestChannel[i] != 0) + { + nTestPinCount++; + } + } + + for (i = 0; i < nTestPinCount; i++) + { + for (j = 0; j < _gSenseLineNum; j++) + { + if (_gShortTestChannel[i] == SENSE_X[j]) + { + _gSenseR[j] = _DrvMpTestItoShortTestCovertRValue(_gDeltaC[i]); + + DBG("_gSenseR[%d] = %d\t", j , _gSenseR[j]); + } + } + } + DBG("\n"); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gShortTestChannel[i] = 0xff; + } + nTestPinCount = 0; + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + _DrvMpTestMsg26xxmItoShortTest(3); + } + + nRetVal4 = _DrvMpTestItoShortTestMsg26xxmJudge(3); + + for (i = 0; i < MAX_CHANNEL_NUM; i++) + { + if (_gShortTestChannel[i] != 0) + { + nTestPinCount++; + } + } + + for (i = 0; i < nTestPinCount; i++) + { + for (j = 0; j < _gDriveLineNum; j++) + { + if (_gShortTestChannel[i] == DRIVE_X[j]) + { + _gDriveR[j] = _DrvMpTestItoShortTestCovertRValue(_gDeltaC[i]); + DBG("_gDriveR[%d] = %d\t", j , _gDriveR[j]); + } + } + } + DBG("\n"); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gShortTestChannel[i] = 0xff; + } + nTestPinCount = 0; + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + _DrvMpTestMsg26xxmItoShortTest(4); + } + + nRetVal4 = _DrvMpTestItoShortTestMsg26xxmJudge(4); + + for (i = 0; i < MAX_CHANNEL_NUM; i++) + { + if (_gShortTestChannel[i] != 0) + { + nTestPinCount++; + } + } + + for (i = 0; i < nTestPinCount; i++) + { + for (j = 0; j < _gDriveLineNum ; j++) + { + if (_gShortTestChannel[i] == DRIVE_X[j]) + { + _gDriveR[j] = _DrvMpTestItoShortTestCovertRValue(_gDeltaC[i]); + DBG("_gDriveR[%d] = %d\t", j , _gDriveR[j]); + } + } + } + DBG("\n"); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gShortTestChannel[i] = 0xff; + } + nTestPinCount = 0; + nShortThreshold = _DrvMpTestItoShortTestCovertRValue(SHORT_VALUE); + + for (i = 0; i < _gSenseLineNum; i++) + { + _gResult[i] = _gSenseR[i]; + } + + for (i = 0; i < _gDriveLineNum; i++) + { + _gResult[i + _gSenseLineNum] = _gDriveR[i]; + } + + for (i = 0; i < (_gSenseLineNum + _gDriveLineNum); i++) + { + if (_gResult[i] < nShortThreshold) + { + _gTestFailChannel[i] = 1; + } + else + { + _gTestFailChannel[i] = 0; + } + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + DrvPlatformLyrEnableFingerTouchReport(); + + DBG("short test end\n"); + + DBG("nRetVal1 = %d, nRetVal2 = %d, nRetVal3 = %d, nRetVal4 = %d, nRetVal5 = %d\n",nRetVal1,nRetVal2,nRetVal3,nRetVal4,nRetVal5); + + if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK) && (nRetVal4 == ITO_TEST_OK) && (nRetVal5 == ITO_TEST_OK)) + { + return ITO_TEST_GET_TP_TYPE_ERROR; + } + else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK) || (nRetVal4 != ITO_TEST_OK) || (nRetVal5 != ITO_TEST_OK))) + { + return -1; + } + else + { + return ITO_TEST_OK; + } +} + +static void _DrvMpTestItoShortTestMsg28xxSetNoiseSensorMode(u8 nEnable) +{ + s16 j; + + DBG("*** %s() ***\n", __func__); + + if (nEnable) + { + RegSet16BitValueOn(0x1546, BIT4); + for (j = 0; j < 10; j++) + { + RegSet16BitValue(0x2148 + 2 * j, 0x0000); + } + RegSet16BitValue(0x215C, 0x1FFF); + } +} + +static void _DrvMpTestItoShortTestMsg28xxAnaFixPrs(u16 nOption) +{ + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x0FE6, 0x0001); + + nRegData = RegGet16BitValue(0x1008); + nRegData &= 0x00F1; + nRegData |= (u16)((nOption << 1) & 0x000E); + RegSet16BitValue(0x1008, nRegData); +} + +static void _DrvMpTestItoShortTestMsg28xxAndChangeCDtime(u16 nTime1, u16 nTime2) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x1026, nTime1); + RegSet16BitValue(0x1030, nTime2); +} + +static void _DrvMpTestItoShortTestMsg28xxChangeANASetting(void) +{ + int i, nMappingItem; + u8 nChipVer; + + + DBG("*** %s() ***\n", __func__); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + nChipVer = RegGetLByteValue(0x1ECE); + //uint chip_ver = Convert.ToUInt16((uint)regdata[0]); //for U01 (SF shift). + + if (nChipVer != 0) + RegSetLByteValue(0x131E, 0x01); + + for (nMappingItem = 0; nMappingItem < 6; nMappingItem++) + { + /// sensor mux sram read/write base address / write length + RegSetLByteValue(0x2192, 0x00); + RegSetLByteValue(0x2102, 0x01); + RegSetLByteValue(0x2102, 0x00); + RegSetLByteValue(0x2182, 0x08); + RegSetLByteValue(0x2180, 0x08 * nMappingItem); + RegSetLByteValue(0x2188, 0x01); + + for (i = 0; i < 8; i++) + { + if (nMappingItem == 0 && nChipVer == 0x0) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_0_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_0_Settings[2 * i + 1]); + } + if ((nMappingItem == 1 && nChipVer == 0x0) || (nMappingItem == 0 && nChipVer != 0x0)) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_1_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_1_Settings[2 * i + 1]); + } + if ((nMappingItem == 2 && nChipVer == 0x0) || (nMappingItem == 1 && nChipVer != 0x0)) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_2_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_2_Settings[2 * i + 1]); + } + if ((nMappingItem == 3 && nChipVer == 0x0) || (nMappingItem == 2 && nChipVer != 0x0)) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_3_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_3_Settings[2 * i + 1]); + } + if ((nMappingItem == 4 && nChipVer == 0x0) || (nMappingItem == 3 && nChipVer != 0x0)) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_4_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_4_Settings[2 * i + 1]); + } + if ((nMappingItem == 5 && nChipVer == 0x0) || (nMappingItem == 4 && nChipVer != 0x0)) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_5_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_5_Settings[2 * i + 1]); + } + if (nMappingItem == 5 && nChipVer != 0x0) + { + RegSet16BitValue(0x218A, _gMuxMem_20_3E_6_Settings[2 * i]); + RegSet16BitValue(0x218C, _gMuxMem_20_3E_6_Settings[2 * i + 1]); + } + } + } +} + +static void _DrvMpTestItoReadSetting(u16 * pPad2Sense, u16 * pPad2Drive, u16 * pPad2GR) +{ + DBG("*** %s() ***\n", __func__); + + memcpy(_gMuxMem_20_3E_1_Settings, SHORT_N1_MUX_MEM_20_3E, sizeof(u16) * 16); + memcpy(_gMuxMem_20_3E_2_Settings, SHORT_N2_MUX_MEM_20_3E, sizeof(u16) * 16); + memcpy(_gMuxMem_20_3E_3_Settings, SHORT_S1_MUX_MEM_20_3E, sizeof(u16) * 16); + memcpy(_gMuxMem_20_3E_4_Settings, SHORT_S2_MUX_MEM_20_3E, sizeof(u16) * 16); + + if(SHORT_TEST_5_TYPE != 0) + { + memcpy(_gMuxMem_20_3E_5_Settings, SHORT_X_MUX_MEM_20_3E, sizeof(u16) * 16); + } + + memcpy(pPad2Sense, PAD_TABLE_SENSE, sizeof(u16) * _gSenseLineNum); + memcpy(pPad2Drive, PAD_TABLE_DRIVE, sizeof(u16) * _gDriveLineNum); + + if (GR_NUM != 0) + { + memcpy(pPad2GR, PAD_TABLE_GR, sizeof(u16) * GR_NUM); + } +} + +static s32 _DrvMpTestItoShortTestMsg28xxGetValueR(s32 * pTarget) +{ + s16 * pRawData = NULL; + u16 nSenNumBak = 0; + u16 nDrvNumBak = 0; + u16 nShift = 0; + s16 i, j; + + DBG("*** %s() ***\n", __func__); + + pRawData = kzalloc(sizeof(s16) * MAX_CHANNEL_SEN*2 * MAX_CHANNEL_DRV, GFP_KERNEL); + + if (_DrvMpTestItoTestMsg28xxGetMutualOneShotRawIIR(pRawData, &nSenNumBak, &nDrvNumBak) < 0) + { + DBG("*** Msg28xx Short Test# GetMutualOneShotRawIIR failed! ***\n"); + return -1; + } + + for (i = 0; i < 5; i++) + { + for (j = 0; j < 13; j++) + { + nShift = (u16)(j + 13 * i); + pTarget[nShift] = pRawData[i*MAX_CHANNEL_DRV+j]; + } + } + + kfree(pRawData); + + return 0; +} + +static s32 _DrvMpTestMsg28xxItoShortTest(u8 nItemID) +{ + s16 i; + u8 nRegData = 0; + u16 nAfeCoef = 0; + + DBG("*** %s() ***\n", __func__); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + ///set Subframe = 6 ; Sensor = 13 + RegSetLByteValue(0x130A, 0x6D); + RegSetLByteValue(0x1103, 0x06); + RegSetLByteValue(0x1016, 0x0C); + + RegSetLByteValue(0x1104, 0x0C); + RegSetLByteValue(0x100C, 0x0C); + RegSetLByteValue(0x1B10, 0x0C); + + /// adc analog+digital pipe delay, 60= 13 AFE. + RegSetLByteValue(0x102F, 0x60); + + ///trim: Fout 52M & 1.2V + RegSet16BitValue(0x1420, 0xA55A);//password + RegSet16BitValue(0x1428, 0xA55A);//password + RegSet16BitValue(0x1422, 0xFC4C);//go + + _DrvMpTestItoShortTestMsg28xxSetNoiseSensorMode(1); + _DrvMpTestItoShortTestMsg28xxAnaFixPrs(3); + _DrvMpTestItoShortTestMsg28xxAndChangeCDtime(0x007E, 0x001F); + + ///DAC overwrite + RegSet16BitValue(0x150C, 0x80A2); //bit15 //AE:3.5v for test + RegSet16BitValue(0x1520, 0xFFFF);//After DAC overwrite, output DC + RegSet16BitValue(0x1522, 0xFFFF); + RegSet16BitValue(0x1524, 0xFFFF); + RegSet16BitValue(0x1526, 0xFFFF); + + /// all AFE Cfb use defalt (50p) + RegSet16BitValue(0x1508, 0x1FFF);// all AFE Cfb: SW control + RegSet16BitValue(0x1550, 0x0000);// all AFE Cfb use defalt (50p) + + /// reg_afe_icmp disenable + RegSet16BitValue(0x1552, 0x0000); + + /// reg_hvbuf_sel_gain + RegSet16BitValue(0x1564, 0x0077); + + ///ADC: AFE Gain bypass + RegSet16BitValue(0x1260, 0x1FFF); + + ///reg_sel_ros disenable + RegSet16BitValue(0x156A, 0x0000); + + ///reg_adc_desp_invert disenable + RegSetLByteValue(0x1221, 0x00); + + + ///AFE coef + //protoHandle.MstarReadReg(mdkDevice, (uint)0x101A, ref regdata); + nRegData = RegGetLByteValue(0x101A); + nAfeCoef = 0x10000 / nRegData; + //protoHandle.MstarWriteReg_16(mdkDevice, (uint)0x13D6, AFE_coef); + RegSet16BitValue(0x13D6, nAfeCoef); + + /// AFE gain = 1X + //RegSet16BitValue(0x1318, 0x4440); + //RegSet16BitValue(0x131A, 0x4444); + //RegSet16BitValue(0x13D6, 0x2000); + + _DrvMpTestItoShortTestMsg28xxChangeANASetting(); + _DrvMpTestItoTestMsg28xxAnaSwReset(); + + if (_DrvMpTestItoShortTestMsg28xxGetValueR(_gDeltaC)<0) + { + DBG("*** Msg28xx Short Test# GetValueR failed! ***\n"); + return -1; + } + _ItoTestDebugShowArray(_gDeltaC, 128, -32, 10, 8); + + for (i = 0; i < 65; i++) // 13 AFE * 5 subframe + { + if (_gDeltaC[i] <= -1000 || _gDeltaC[i] >= (IIR_MAX)) + _gDeltaC[i] = 0x7FFF; + else + _gDeltaC[i] = abs(_gDeltaC[i]); + } + return 0; +} + +static s32 _DrvMpTestItoShortTestReadTestPins(u8 nItemID, u16 * pTestPins) +{ + u16 nCount = 0; + s16 i; + + DBG("*** %s() ***\n", __func__); + + switch (nItemID) + { + case 1: + case 11: + nCount = SHORT_N1_TEST_NUMBER; + memcpy(pTestPins, SHORT_N1_TEST_PIN, sizeof(u16) * nCount); + break; + case 2: + case 12: + nCount = SHORT_N2_TEST_NUMBER; + memcpy(pTestPins, SHORT_N2_TEST_PIN, sizeof(u16) * nCount); + break; + case 3: + case 13: + nCount = SHORT_S1_TEST_NUMBER; + memcpy(pTestPins, SHORT_S1_TEST_PIN, sizeof(u16) * nCount); + break; + case 4: + case 14: + nCount = SHORT_S2_TEST_NUMBER; + memcpy(pTestPins, SHORT_S2_TEST_PIN, sizeof(u16) * nCount); + break; + + case 5: + case 15: + if(SHORT_TEST_5_TYPE != 0) + { + nCount = SHORT_X_TEST_NUMBER; + memcpy(pTestPins, SHORT_X_TEST_PIN, sizeof(u16) * nCount); + } + break; + + case 0: + default: + return 0; + } + + for (i = nCount; i < MAX_CHANNEL_NUM; i++) + { + pTestPins[i] = 0xFFFF; //PIN_NO_ERROR + } + + return nCount; +} + +static s32 _DrvMpTestItoShortTestMsg28xxJudge(u8 nItemID, /*s8 pNormalTestResult[][2],*/ u16 pTestPinMap[][13], u16 * pTestPinCount) +{ + s32 nRetVal = 0; + u16 nTestPins[MAX_CHANNEL_NUM]; + s16 i; + + DBG("*** %s() ***\n", __func__); + + *pTestPinCount = _DrvMpTestItoShortTestReadTestPins(nItemID, nTestPins); + //_ItoTestDebugShowArray(nTestPins, *pTestPinCount, 16, 10, 8); + if (*pTestPinCount == 0) + { + if (nItemID == 5 && SHORT_TEST_5_TYPE == 0) + { + + } + else + { + DBG("*** Msg28xx Short Test# TestPinCount = 0 ***\n"); + return -1; + } + } + + /* + u16 nCountTestPin = 0; + for (i = 0; i < testPins.Length; i++) + { + if (pTestPins[i] != 0xFFFF) + nCountTestPin++; + } + */ + + for (i = (nItemID - 1) * 13; i < (13 * nItemID); i++) + { + _gResult[i] = _gDeltaC[i]; + } + + for (i = 0; i < *pTestPinCount; i++) + { + pTestPinMap[nItemID][i] = nTestPins[i]; + if (0 == _DrvMpTestItoTestCheckValueInRange(_gResult[i + (nItemID - 1) * 13], SHORTVALUE, -1000)) //0: false 1: true + { + //pNormalTestResult[nItemID][0] = -1; //-1: failed 0: success + // //0: golden 1: ratio + DBG("*** Msg28xx Short Test# ShortTestMsg28xxJudge failed! ***\n"); + nRetVal = -1; + } + } + + DBG("*** Msg28xx Short Test# nItemID = %d ***\n", nItemID); + //_ItoTestDebugShowArray(pTestPinMap[nItemID], *pTestPinCount, 16, 10, 8); + + return nRetVal; +} + +static s32 _DrvMpTestItoShortTestMsg28xxCovertRValue(s32 nValue) +{ + if (nValue >= IIR_MAX) + { + return 0; + } + + //return ((3.53 - 1.3) * 10 / (50 * (((float)nValue - 0 ) / 32768 * 1.1))); + return 223 * 32768 / (nValue * 550); +} + +static s32 _DrvMpTestMsg28xxItoShortTestEntry(void) +{ + //ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK, nRetVal4 = ITO_TEST_OK, nRetVal5 = ITO_TEST_OK; + s16 i = 0, j = 0; + //u16 nTestPinCount = 0; + //s32 nShortThreshold = 0; + u16 nPad2Drive[DRIVE_NUM] = {0}; + u16 nPad2Sense[SENSE_NUM] = {0}; + u16 nPad2GR[MAX_CHANNEL_NUM] = {0}; + s32 nResultTemp[(MAX_CHANNEL_SEN+MAX_CHANNEL_DRV)*2] = {0}; + + ///short test1 to 5. + //u16 nTestPinCount = 0; + u16 nTestItemLoop = 6; + u16 nTestItem = 0; + //s8 nNormalTestResult[8][2] = {0}; //0:golden 1:ratio + u16 nTestPinMap[6][13] = {{0}}; //6:max subframe 13:max afe + u16 nTestPinNum = 0; +// s32 nThrs = 0; + u32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _gSenseLineNum = SENSE_NUM; + _gDriveLineNum = DRIVE_NUM; + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + //reset_only + DbBusResetSlave(); + DbBusEnterSerialDebugMode(); + DbBusWaitMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + if(_DrvMpTestMsg28xxItoTestSwitchFwMode(MUTUAL_SINGLE_DRIVE) < 0) + { + DBG("*** Msg28xx Short Test# Switch FW mode failed! ***\n"); + return -1; + } + + _DrvMpTestItoReadSetting(nPad2Sense, nPad2Drive, nPad2GR); + + + //N1_ShortTest + if(_DrvMpTestMsg28xxItoShortTest(1) < 0) + { + DBG("*** Msg28xx Short Test# Get DeltaC failed! ***\n"); + return -1; + } + + for (nTestItem = 1; nTestItem < nTestItemLoop; nTestItem++) + { + DBG("*** Short test item %d ***\n", nTestItem); + if (_DrvMpTestItoShortTestMsg28xxJudge(nTestItem, /*nNormalTestResult,*/ nTestPinMap, &nTestPinNum) < 0) + { + DBG("*** Msg28xx Short Test# Item %d is failed! ***\n", nTestItem); + nRetVal = -1; + } + + if (nTestItem == 1 || nTestItem == 2 || (nTestItem == 5 && SHORT_TEST_5_TYPE == 1)) + { + for (i = 0; i < nTestPinNum; i++) + { + for (j = 0; j < _gSenseLineNum; j++) + { + if (nTestPinMap[nTestItem][i] == nPad2Sense[j]) + { + //_gSenseR[j] = _DrvMpTestItoShortTestMsg28xxCovertRValue(_gResult[i + (nTestItem - 1) * 13]); + _gSenseR[j] = _gResult[i + (nTestItem - 1) * 13]; //change comparison way because float computing in driver is prohibited + } + } + } + } + + if (nTestItem == 3 || nTestItem == 4 || (nTestItem == 5 && SHORT_TEST_5_TYPE == 2)) + { + for (i = 0; i < nTestPinNum; i++) + { + for (j = 0; j < _gDriveLineNum; j++) + { + if (nTestPinMap[nTestItem][i] == nPad2Drive[j]) + { + //_gDriveR[j] = _DrvMpTestItoShortTestMsg28xxCovertRValue(_gResult[i + (nTestItem - 1) * 13]); + _gDriveR[j] = _gResult[i + (nTestItem - 1) * 13]; //change comparison way because float computing in driver is prohibited + } + } + } + } + + if (nTestItem == 5 && SHORT_TEST_5_TYPE == 3) + { + for (i = 0; i < nTestPinNum; i++) + { + for (j = 0; j < GR_NUM; j++) + { + if (nTestPinMap[nTestItem][i] == nPad2GR[j]) + { + //_gGRR[j] = _DrvMpTestItoShortTestMsg28xxCovertRValue(_gResult[i + (nTestItem - 1) * 13]); + _gGRR[j] = _gResult[i + (nTestItem - 1) * 13]; //change comparison way because float computing in driver is prohibited + } + } + } + } + } + + for (i = 0; i < _gSenseLineNum; i++) + { + nResultTemp[i] = _gSenseR[i]; + } + + //for (i = 0; i < _gDriveLineNum - 1; i++) + for (i = 0; i < _gDriveLineNum; i++) + { + nResultTemp[i + _gSenseLineNum] = _gDriveR[i]; + } + + //nThrs = _DrvMpTestItoShortTestMsg28xxCovertRValue(SHORTVALUE); + for (i = 0; i < _gSenseLineNum + _gDriveLineNum; i++) + { + if(nResultTemp[i] == 0) + { + _gResult[i] = _DrvMpTestItoShortTestMsg28xxCovertRValue(1); + } + else + { + _gResult[i] = _DrvMpTestItoShortTestMsg28xxCovertRValue(nResultTemp[i]); + } + } + + _ItoTestDebugShowArray(_gResult, _gSenseLineNum + _gDriveLineNum, -32, 10, 8); + //for (i = 0; i < (_gSenseLineNum + _gDriveLineNum - 1); i++) + for (i = 0; i < (_gSenseLineNum + _gDriveLineNum); i++) + { + if (nResultTemp[i] > SHORTVALUE) //change comparison way because float computing in driver is prohibited + { + _gTestFailChannel[i] = 1; + _gTestFailChannelCount++; + nRetVal = -1; + } + else + { + _gTestFailChannel[i] = 0; + } + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + DrvPlatformLyrEnableFingerTouchReport(); + return nRetVal; +} + +static s32 _DrvMpTestItoShortTest(void) +{ + s32 nRetVal = -1; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG26XXM) + { + return _DrvMpTestMsg26xxmItoShortTestEntry(); + } + else if(g_ChipType == CHIP_TYPE_MSG28XX) + { + return _DrvMpTestMsg28xxItoShortTestEntry(); + } + + return nRetVal; +} + +static s32 _DrvMpTestItoTestMsg26xxmGetWaterProofOneShotRawIir(u16 wszResultData[]) +{ + u16 nRegData; + u16 i; + u16 nTemp; + u8 szDbBusTxData[3]; + u32 nGetdataNum = 12; + u8 szShotData[24] = {0}; //Get 12 FIR data + + DBG("*** %s() ***\n", __func__); + + nTemp = RegGet16BitValue(0x3D08); //bank:intr_ctrl, addr:h0004 + nTemp &= (~(BIT8)); + RegSet16BitValue(0x3D08, nTemp); + //RegSet16BitValueOff(0x3D08, BIT8); ///FIQ_E_FRAME_READY_MASK + + _DrvMpTestItoTestMsg26xxmEnableAdcOneShot(); + + nRegData = 0; + while (0x0000 == (nRegData & BIT8)) + { + nRegData = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c + } + + for (i = 0; i < nGetdataNum * 2; i ++) + { + szShotData[i] = 0; + } + + mdelay(200); + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x13; //bank:fir, addr:h0021 + szDbBusTxData[2] = 0x42; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &szShotData[0], 24); //12 + + for (i = 0; i < nGetdataNum; i ++) + { + nRegData = (u16)(szShotData[i * 2] | szShotData[i * 2 + 1] << 8); + wszResultData[i] = (short)nRegData; + + //DBG("wszResultData[%d] = %x\t", i , wszResultData[i]); + } + + nTemp = RegGet16BitValue(0x3D08); //bank:intr_ctrl, addr:h0004 + nTemp |= (BIT8 | BIT4); + RegSet16BitValue(0x3D08, nTemp); + + return 0; +} + +static s32 _DrvMpTestItoTestMsg26xxmGetWaterProofDeltaC(s32 *pTarget) +{ + u16 wszRawData[12]; + u16 i; + + DBG("*** %s() ***\n", __func__); + + if (_DrvMpTestItoTestMsg26xxmGetWaterProofOneShotRawIir(wszRawData) < 0) + { + DBG("*** Msg26xxm WaterProof Test# GetMutualOneShotRawIIR failed! ***\n"); + return -1; + } + + for (i = 0; i < 12; i ++) + { + pTarget[i] = (s16)wszRawData[i]; + } + + return 0; +} + +static s32 _DrvMpTestMsg26xxmItoWaterProofTest(void) +{ + DBG("*** %s() ***\n", __func__); + + // Stop mcu + //RegSet16BitValue(0x0FE6, 0x0001); + + _DrvMpTestItoTestMsg26xxmAnaSwReset(); + + _DrvMpTestItoShortTestMsg26xxmAndChangeCDtime(WATERPROOF_Charge_X, WATERPROOF_Dump_X); + + if(_DrvMpTestItoTestMsg26xxmGetWaterProofDeltaC(_gDeltaC) < 0) + { + DBG("*** Msg26xxm WaterProof Test# GetWaterDeltaC failed! ***\n"); + return -1; + } + + return 0; +} + +static s32 _DrvMpTestMsg26xxmItoWaterProofTestJudge(void) +{ + u16 i; + u32 nGetdataNum = 12; + + DBG("*** %s() ***\n", __func__); + + for (i = 0; i < nGetdataNum; i ++) + { + _gResultWater[i] = 0; + } + + for (i = 0; i < nGetdataNum; i++) + { + _gResultWater[i] = _gDeltaC[i]; + } + + return 0; +} + +s32 _DrvMpTestMsg26xxmItoWaterProofTestEntry(void) +{ + s32 nRetVal = 0; + u32 nRegData = 0; + u16 i = 0; + s32 nResultTemp[12] = {0}; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _gWaterProofNum = 12; + + DrvPlatformLyrDisableFingerTouchReport(); + + DrvPlatformLyrTouchDeviceResetHw(); + + //auto detetc fw version to decide switch fw mode + if (_gTestAutoSwitchFlag!=0) + { + _DrvMpTestItoTestMsg26xxmGetSwitchFlag(); + } + + DbBusResetSlave(); + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + if(_DrvMpTestItoTestMsg26xxmSwitchMode(_gTestSwitchMode, WATERPROOF) < 0) + { + DBG("*** Msg26xxm WaterProof Test# Switch FW mode failed! ***\n"); + return -1; + } + + _DrvMpTestItoTestMsg26xxmMcuStop(); + + nRegData = RegGet16BitValue(0x3CE4); + + if (nRegData == 0x8bbd)//// if polling 0X8BBD, means the FW is NOT supporting WP. + { + DBG("*** Msg26xxm WaterProof Test# No supporting this function! ***\n"); + return -1; + } + + mdelay(10); + + for (i = 0; i < MAX_MUTUAL_NUM; i ++) + { + _gTestFailChannel[i] = 0; + } + + _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start + + if(_DrvMpTestMsg26xxmItoWaterProofTest() < 0) + { + DBG("*** Msg26xxm WaterProof Test# Get DeltaC failed! ***\n"); + return -1; + } + + _DrvMpTestMsg26xxmItoWaterProofTestJudge(); + + for (i = 0; i < 12; i++) + { + nResultTemp[i] = _gResultWater[i]; + } + + _ItoTestDebugShowArray(_gResultWater, 12, -32, 10, 8); + for (i = 0; i < 12; i++) + { + if (nResultTemp[i] < WATERPROOFVALUE) //change comparison way because float computing in driver is prohibited + { + _gTestFailChannel[i] = 1; + _gTestFailChannelCount++; + nRetVal = -1; + } + else + { + _gTestFailChannel[i] = 0; + } + } + + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + DrvPlatformLyrEnableFingerTouchReport(); + + return nRetVal; +} + +static s32 _DrvMpTestItoWaterProofTestMsg28xxTriggerWaterProofOneShot(s16 * pResultData, u32 nDelay) +{ + u16 nAddr = 0x5000, nAddrNextSF = 0x1A4; + u16 nSF = 0, nAfeOpening = 0, nDriOpening = 0; + u16 nMaxDataNumOfOneSF = 0; + u16 nDriMode = 0; + u16 i; + u8 nRegData = 0; + u8 nShotData[390] = {0};//13*15*2 + u16 nRegDataU16 = 0; + + DBG("*** %s() ***\n", __func__); + + nRegData = RegGetLByteValue(0x130A); + nSF = nRegData>>4; + nAfeOpening = nRegData & 0x0f; + + if(nSF == 0) + { + return -1; + } + + nRegData = RegGetLByteValue(0x100B); + nDriMode = nRegData; + + nRegData = RegGetLByteValue(0x1312); + nDriOpening = nRegData; + + DBG("*** Msg28xx WaterProof Test# TriggerWaterProofOneShot nSF=%d, nAfeOpening=%d, nDriMode=%d, nDriOpening=%d. ***\n", nSF, nAfeOpening, nDriMode, nDriOpening); + + nMaxDataNumOfOneSF = nAfeOpening * nDriOpening; + + RegSet16BitValueOff(0x3D08, BIT8); ///FIQ_E_FRAME_READY_MASK + + ///polling frame-ready interrupt status + _DrvMpTestItoTestMsg28xxEnableAdcOneShot(); + + while (0x0000 == (nRegDataU16 & BIT8)) + { + nRegDataU16 = RegGet16BitValue(0x3D18); + } + + RegSet16BitValueOn(0x3D08, BIT8); ///FIQ_E_FRAME_READY_MASK + RegSet16BitValueOn(0x3D08, BIT4); ///FIQ_E_TIMER0_MASK + + if (PATTERN_TYPE == 1) // for short test + { + //s16 nShortResultData[nSF][nAfeOpening]; + + /// get ALL raw data + _DrvMpTestItoTestDBBusReadDQMemStart(); + RegGetXBitValue(nAddr, nShotData, 16, MAX_I2C_TRANSACTION_LENGTH_LIMIT); + _DrvMpTestItoTestDBBusReadDQMemEnd(); + + //_ItoTestDebugShowArray(nShotData, 26, 8, 16, 16); + for (i = 0; i < 8; i++) + { + pResultData[i] = (s16)(nShotData[2 * i] | nShotData[2 * i + 1] << 8); + } + } + else if(PATTERN_TYPE == 3 || PATTERN_TYPE == 4)// for open test + { + //s16 nOpenResultData[nSF * nAfeOpening][nDriOpening]; + + if(nSF >4) + nSF = 4; + + /// get ALL raw data, combine and handle datashift. + for (i = 0; i < nSF; i++) + { + _DrvMpTestItoTestDBBusReadDQMemStart(); + RegGetXBitValue(nAddr + i * nAddrNextSF, nShotData, 16, MAX_I2C_TRANSACTION_LENGTH_LIMIT); + _DrvMpTestItoTestDBBusReadDQMemEnd(); + + //_ItoTestDebugShowArray(nShotData, 390, 8, 10, 16); + pResultData[2 * i] = (s16)(nShotData[4 * i] | nShotData[4 * i + 1] << 8); + pResultData[2 * i + 1] = (s16)(nShotData[4 * i + 2] | nShotData[4 * i + 3] << 8); + } + } + else + { + return -1; + } + + return 0; +} + +static s32 _DrvMpTestItoWaterProofTesMsg28xxtGetWaterProofOneShotRawIIR(s16 * pRawDataWP, u32 nDelay) +{ + return _DrvMpTestItoWaterProofTestMsg28xxTriggerWaterProofOneShot(pRawDataWP, nDelay); +} + +static s32 _DrvMpTestItoWaterProofTestMsg28xxGetDeltaCWP(s32 *pTarget, s8 nSwap, u32 nDelay) +{ + s16 nRawDataWP[12] = {0}; + s16 i; + + DBG("*** %s() ***\n", __func__); + + if(_DrvMpTestItoWaterProofTesMsg28xxtGetWaterProofOneShotRawIIR(nRawDataWP, nDelay) < 0) + { + DBG("*** Msg28xx Open Test# GetMutualOneShotRawIIR failed! ***\n"); + return -1; + } + + for (i = 0; i < _gWaterProofNum; i++) + { + pTarget[i] = nRawDataWP[i]; + } + + return 0; +} + +static s32 _DrvMpTestMsg28xxItoWaterProofTest(u32 nDelay) +{ + DBG("*** %s() ***\n", __func__); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + _DrvMpTestItoTestMsg28xxAnaSwReset(); + + if (_DrvMpTestItoWaterProofTestMsg28xxGetDeltaCWP(_gDeltaCWater, -1, nDelay)<0) + { + DBG("*** Msg28xx WaterProof Test# GetDeltaCWP failed! ***\n"); + return -1; + } + + _ItoTestDebugShowArray(_gDeltaCWater, 12, -32, 10, 16); + + return 0; +} + +static void _DrvMpTestMsg28xxItoWaterProofTestMsgJudge(void) +{ + int i; + + DBG("*** %s() ***\n", __func__); + + for (i = 0; i < _gWaterProofNum; i++) + { + _gResultWater[i] = abs(_gDeltaCWater[i]); + } +} + +static s32 _DrvMpTestMsg28xxItoWaterProofTestEntry(void) +{ + s16 i = 0; + u32 nRetVal = 0; + u16 nRegDataWP = 0; + u32 nDelay = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _gWaterProofNum = 12; + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + //reset_only + DbBusResetSlave(); + DbBusEnterSerialDebugMode(); + DbBusWaitMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + if(_DrvMpTestMsg28xxItoTestSwitchFwMode(WATERPROOF) < 0) + { + DBG("*** Msg28xx WaterProof Test# Switch FW mode failed! ***\n"); + return -1; + } + + nRegDataWP = RegGet16BitValue(0x1402); + if(nRegDataWP == 0x8BBD) + { + DBG("*** Msg28xx WaterProof Test# FW don't support waterproof! ***\n"); + } + + if(_DrvMpTestMsg28xxItoWaterProofTest(nDelay) < 0) + { + DBG("*** Msg28xx WaterProof Test# Get DeltaC failed! ***\n"); + return -1; + } + + _DrvMpTestMsg28xxItoWaterProofTestMsgJudge(); + + for (i = 0; i < _gWaterProofNum; i++) + { + if (_gResultWater[i] > WATERVALUE) //change comparison way because float computing in driver is prohibited + { + _gTestFailChannel[i] = 1; + _gTestFailChannelCount++; + nRetVal = -1; + } + else + { + _gTestFailChannel[i] = 0; + } + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(300); + + DrvPlatformLyrEnableFingerTouchReport(); + return nRetVal; +} + +static s32 _DrvMpTestItoWaterProofTest(void) +{ + s32 nRetVal = -1; + + DBG("*** %s() ***\n", __func__); + + if(g_ChipType == CHIP_TYPE_MSG26XXM) + { + return _DrvMpTestMsg26xxmItoWaterProofTestEntry(); + } + else if(g_ChipType == CHIP_TYPE_MSG28XX) + { + return _DrvMpTestMsg28xxItoWaterProofTestEntry(); + } + + return nRetVal; +} + +static void _DrvMpTestItoTestDoWork(struct work_struct *pWork) +{ + s32 nRetVal = 0; + + DBG("*** %s() _gIsInMpTest = %d, _gTestRetryCount = %d ***\n", __func__, _gIsInMpTest, _gTestRetryCount); + + if (_gItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { + nRetVal = _DrvMpTestItoOpenTest(); + } + else if (_gItoTestMode == ITO_TEST_MODE_SHORT_TEST) + { + nRetVal = _DrvMpTestItoShortTest(); + } + else if (_gItoTestMode == ITO_TEST_MODE_WATERPROOF_TEST) + { + nRetVal = _DrvMpTestItoWaterProofTest(); + } + else + { + DBG("*** Undefined Mp Test Mode = %d ***\n", _gItoTestMode); + return; + } + + DBG("*** ctp mp test result = %d ***\n", nRetVal); + + if (nRetVal == 0) + { + _gCtpMpTestStatus = ITO_TEST_OK; //PASS + _gIsInMpTest = 0; + DBG("mp test success\n"); + } + else + { + _gTestRetryCount --; + if (_gTestRetryCount > 0) + { + DBG("_gTestRetryCount = %d\n", _gTestRetryCount); + queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork); + } + else + { + if (nRetVal == -1) + { + _gCtpMpTestStatus = ITO_TEST_FAIL; + } + else + { + _gCtpMpTestStatus = ITO_TEST_UNDEFINED_ERROR; + } + + _gIsInMpTest = 0; + DBG("mp test failed\n"); + } + } +} + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +s32 DrvMpTestGetTestResult(void) +{ + DBG("*** %s() ***\n", __func__); + DBG("_gCtpMpTestStatus = %d\n", _gCtpMpTestStatus); + + return _gCtpMpTestStatus; +} + +void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount) +{ + u32 i; + + DBG("*** %s() ***\n", __func__); + DBG("_gTestFailChannelCount = %d\n", _gTestFailChannelCount); + + for (i = 0; i < MAX_MUTUAL_NUM; i ++) + { + pFailChannel[i] = _gTestFailChannel[i]; + } + + *pFailChannelCount = MAX_MUTUAL_NUM; // Return the test result of all channels, APK will filter out the fail channels. +} + +void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength) +{ + u32 i, j, k; + + DBG("*** %s() ***\n", __func__); + + if (eItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { + k = 0; + + for (j = 0; j < _gDriveLineNum; j ++) +// for (j = 0; j < (_gDriveLineNum-1); j ++) + { + for (i = 0; i < _gSenseLineNum; i ++) + { +// DBG("\nDrive%d, Sense%d, Value = %d\t", j, i, _gResult[i * _gDriveLineNum + j]); // add for debug + + if (_gResult[i * _gDriveLineNum + j] >= 0) + { + pDataLog[k*5] = 0; // + : a positive number + } + else + { + pDataLog[k*5] = 1; // - : a negative number + } + + pDataLog[k*5+1] = (_gResult[i * _gDriveLineNum + j] >> 24) & 0xFF; + pDataLog[k*5+2] = (_gResult[i * _gDriveLineNum + j] >> 16) & 0xFF; + pDataLog[k*5+3] = (_gResult[i * _gDriveLineNum + j] >> 8) & 0xFF; + pDataLog[k*5+4] = (_gResult[i * _gDriveLineNum + j]) & 0xFF; + + k ++; + } + } + + DBG("\nk = %d\n", k); + + *pLength = k*5; + } + else if (eItoTestMode == ITO_TEST_MODE_SHORT_TEST) + { + k = 0; + + for (i = 0; i < (_gDriveLineNum-1 + _gSenseLineNum); i++) + { + if (_gResult[i] >= 0) + { + pDataLog[k*5] = 0; // + : a positive number + } + else + { + pDataLog[k*5] = 1; // - : a negative number + } + + pDataLog[k*5+1] = (_gResult[i] >> 24) & 0xFF; + pDataLog[k*5+2] = (_gResult[i] >> 16) & 0xFF; + pDataLog[k*5+3] = (_gResult[i] >> 8) & 0xFF; + pDataLog[k*5+4] = (_gResult[i]) & 0xFF; + k ++; + } + + DBG("\nk = %d\n", k); + + *pLength = k*5; + } + else if (eItoTestMode == ITO_TEST_MODE_WATERPROOF_TEST) + { + k = 0; + + for (i = 0; i < _gWaterProofNum; i++) + { + if (_gResultWater[i] >= 0) + { + pDataLog[k*5] = 0; // + : a positive number + } + else + { + pDataLog[k*5] = 1; // - : a negative number + } + + pDataLog[k*5+1] = (_gResultWater[i] >> 24) & 0xFF; + pDataLog[k*5+2] = (_gResultWater[i] >> 16) & 0xFF; + pDataLog[k*5+3] = (_gResultWater[i] >> 8) & 0xFF; + pDataLog[k*5+4] = (_gResultWater[i]) & 0xFF; + k ++; + } + + DBG("\nk = %d\n", k); + + *pLength = k*5; + } + else + { + DBG("*** Undefined MP Test Mode ***\n"); + } +} + +void DrvMpTestGetTestScope(TestScopeInfo_t *pInfo) +{ + DBG("*** %s() ***\n", __func__); + + pInfo->nMy = _gDriveLineNum; + pInfo->nMx = _gSenseLineNum; + + DBG("*** My = %d ***\n", pInfo->nMy); + DBG("*** Mx = %d ***\n", pInfo->nMx); +} + +void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode) +{ + DBG("*** %s() ***\n", __func__); + + if (_gIsInMpTest == 0) + { + DBG("ctp mp test start\n"); + + _gItoTestMode = eItoTestMode; + _gIsInMpTest = 1; + _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT; + _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING; + + queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork); + } +} + +void DrvMpTestCreateMpTestWorkQueue(void) +{ + DBG("*** %s() ***\n", __func__); + + _gCtpMpTestWorkQueue = create_singlethread_workqueue("ctp_mp_test"); + INIT_WORK(&_gCtpItoTestWork, _DrvMpTestItoTestDoWork); +} + +#endif //CONFIG_ENABLE_ITO_MP_TEST +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.h b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.h new file mode 100644 index 00000000..c1ca9e48 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_mutual_mp_test.h @@ -0,0 +1,94 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_mutual_mp_test.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_MUTUAL_MP_TEST_H__ +#define __MSTAR_DRV_MUTUAL_MP_TEST_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define MAX_CHANNEL_NUM 38 +#define MAX_CHANNEL_DRV 30 +#define MAX_CHANNEL_SEN 20 +#define MAX_MUTUAL_NUM (MAX_CHANNEL_DRV * MAX_CHANNEL_SEN) +#define ANA3_MUTUAL_CSUB_NUMBER (192) //192 = 14 * 13 + 10 +#define ANA4_MUTUAL_CSUB_NUMBER (MAX_MUTUAL_NUM - ANA3_MUTUAL_CSUB_NUMBER) //200 = 392 - 192 +#define FILTER1_MUTUAL_DELTA_C_NUMBER (190) //190 = (6 * 14 + 11) * 2 +#define FILTER2_MUTUAL_DELTA_C_NUMBER (594) //594 = (MAX_MUTUAL_NUM - (6 * 14 + 11)) * 2 + +#define FIR_THRESHOLD 6553 +#define FIR_RATIO 50 //25 + +#define IIR_MAX 32600 +#define SHORT_VALUE 2000 +#define PIN_GUARD_RING (38) + +#define CTP_MP_TEST_RETRY_COUNT (3) + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +typedef struct +{ + u8 nMy; + u8 nMx; +} TestScopeInfo_t; + +/*--------------------------------------------------------------------------*/ +/* GLOBAL VARIABLE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern void DrvMpTestCreateMpTestWorkQueue(void); +extern void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength); +extern void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount); +extern s32 DrvMpTestGetTestResult(void); +extern void DrvMpTestGetTestScope(TestScopeInfo_t *pInfo); +extern void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode); + +#endif //CONFIG_ENABLE_ITO_MP_TEST +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + +#endif /* __MSTAR_DRV_MUTUAL_MP_TEST_H__ */ \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.c b/drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.c new file mode 100644 index 00000000..7b9d8457 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.c @@ -0,0 +1,448 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_interface.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_platform_interface.h" +#include "mstar_drv_main.h" +#include "mstar_drv_ic_fw_porting_layer.h" +#include "mstar_drv_platform_porting_layer.h" +#include "mstar_drv_utility_adaption.h" +#include + + +#ifdef CONFIG_ENABLE_HOTKNOT +#include "mstar_drv_hotknot.h" +#endif //CONFIG_ENABLE_HOTKNOT + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern u32 g_GestureWakeupMode[2]; +extern u8 g_GestureWakeupFlag; + +extern int _gIrq; + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern u8 g_GestureDebugFlag; +extern u8 g_GestureDebugMode; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +extern u8 g_EnableTpProximity; +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GLOVE_MODE +extern u8 g_IsEnableGloveMode; +extern u8 g_IsGloveModeOpen; +#endif //CONFIG_ENABLE_GLOVE_MODE + +extern u8 g_IsUpdateFirmware; +extern u8 *_gFwVersion; + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +extern struct input_dev *g_InputDevice; + +#ifdef CONFIG_ENABLE_HOTKNOT +extern u8 g_HotKnotState; +extern u32 SLAVE_I2C_ID_DWI2C; +#endif //CONFIG_ENABLE_HOTKNOT + +extern u8 IS_FIRMWARE_DATA_LOG_ENABLED; + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_HOTKNOT +static u8 _gAMStartCmd[4] = {HOTKNOT_SEND, ADAPTIVEMOD_BEGIN, 0, 0}; +#endif //CONFIG_ENABLE_HOTKNOT + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_NOTIFIER_FB +int MsDrvInterfaceTouchDeviceFbNotifierCallback(struct notifier_block *pSelf, unsigned long nEvent, void *pData) +{ + struct fb_event *pEventData = pData; + int *pBlank; + + if (pEventData && pEventData->data && nEvent == FB_EVENT_BLANK) + { + pBlank = pEventData->data; + + if (*pBlank == FB_BLANK_UNBLANK) + { + DBG("*** %s() TP Resume ***\n", __func__); + + if (g_IsUpdateFirmware != 0) // Check whether update frimware by sw id is finished + { + DBG("Not Allow to power on/off touch ic while update firmware by sw id.\n"); + return 0; + } + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + if (g_EnableTpProximity == 1) + { + DBG("g_EnableTpProximity = %d\n", g_EnableTpProximity); + return 0; + } +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + if (g_GestureDebugMode == 1) + { + DrvIcFwLyrCloseGestureDebugMode(); + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + + if (g_GestureWakeupFlag == 1) + { + DrvIcFwLyrCloseGestureWakeup(); + } + else + { + DrvPlatformLyrEnableFingerTouchReport(); + } + } +#ifdef CONFIG_ENABLE_HOTKNOT + else // Enable touch in hotknot transfer mode + { + DrvPlatformLyrEnableFingerTouchReport(); + } +#endif //CONFIG_ENABLE_HOTKNOT +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + DrvPlatformLyrTouchDevicePowerOn(); + } + +#ifdef CONFIG_ENABLE_GLOVE_MODE + if (g_IsEnableGloveMode == 1) + { + if (g_IsGloveModeOpen == 0) + { + DrvIcFwCtrlOpenGloveMode(); + } + } +#endif //CONFIG_ENABLE_GLOVE_MODE + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + DrvIcFwLyrRestoreFirmwareModeToLogDataMode(); // Mark this function call for avoiding device driver may spend longer time to resume from suspend state. + } //IS_FIRMWARE_DATA_LOG_ENABLED + +#ifndef CONFIG_ENABLE_GESTURE_WAKEUP + DrvPlatformLyrEnableFingerTouchReport(); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + } + else if (*pBlank == FB_BLANK_POWERDOWN) + { + DBG("*** %s() TP Suspend ***\n", __func__); + + if (g_IsUpdateFirmware != 0) // Check whether update frimware by sw id is finished + { + DBG("Not Allow to power on/off touch ic while update firmware by sw id.\n"); + return 0; + } + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + if (g_EnableTpProximity == 1) + { + DBG("g_EnableTpProximity = %d\n", g_EnableTpProximity); + return 0; + } +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + if (g_GestureWakeupMode[0] != 0x00000000 || g_GestureWakeupMode[1] != 0x00000000) + { + DrvIcFwLyrOpenGestureWakeup(&g_GestureWakeupMode[0]); + return 0; + } + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState == HOTKNOT_BEFORE_TRANS_STATE || g_HotKnotState == HOTKNOT_TRANS_STATE || g_HotKnotState == HOTKNOT_AFTER_TRANS_STATE) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gAMStartCmd[0], 4); + } +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_GLOVE_MODE + if (g_IsEnableGloveMode == 1) + { + if (g_IsGloveModeOpen == 1) + { + DrvIcFwCtrlCloseGloveMode(); + } + } +#endif //CONFIG_ENABLE_GLOVE_MODE + + DrvPlatformLyrFingerTouchReleased(0, 0); // Send touch end for clearing point touch + input_sync(g_InputDevice); + + DrvPlatformLyrDisableFingerTouchReport(); + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + DrvPlatformLyrTouchDevicePowerOff(); + } + } + } + + return 0; +} + +#else + +void MsDrvInterfaceTouchDeviceSuspend(struct early_suspend *pSuspend) +{ + DBG("*** %s() ***\n", __func__); + + if (g_IsUpdateFirmware != 0) // Check whether update frimware by sw id is finished + { + DBG("Not Allow to power on/off touch ic while update firmware by sw id.\n"); + return; + } + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + if (g_EnableTpProximity == 1) + { + DBG("g_EnableTpProximity = %d\n", g_EnableTpProximity); + return; + } +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + irq_set_irq_type(_gIrq,IRQF_TRIGGER_HIGH | IRQF_NO_SUSPEND | IRQF_ONESHOT); + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + if (g_GestureWakeupMode[0] != 0x00000000 || g_GestureWakeupMode[1] != 0x00000000) + { + DrvIcFwLyrOpenGestureWakeup(&g_GestureWakeupMode[0]); + return; + } + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState == HOTKNOT_BEFORE_TRANS_STATE || g_HotKnotState == HOTKNOT_TRANS_STATE || g_HotKnotState == HOTKNOT_AFTER_TRANS_STATE) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gAMStartCmd[0], 4); + } +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_GLOVE_MODE + if (g_IsEnableGloveMode == 1) + { + if (g_IsGloveModeOpen == 1) + { + DrvIcFwCtrlCloseGloveMode(); + } + } +#endif //CONFIG_ENABLE_GLOVE_MODE + + DrvPlatformLyrFingerTouchReleased(0, 0); // Send touch end for clearing point touch + input_sync(g_InputDevice); + + DrvPlatformLyrDisableFingerTouchReport(); + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + DrvPlatformLyrTouchDevicePowerOff(); + } +} + +void MsDrvInterfaceTouchDeviceResume(struct early_suspend *pSuspend) +{ + DBG("*** %s() ***\n", __func__); + + if (g_IsUpdateFirmware != 0) // Check whether update frimware by sw id is finished + { + DBG("Not Allow to power on/off touch ic while update firmware by sw id.\n"); + return; + } + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + if (g_EnableTpProximity == 1) + { + DBG("g_EnableTpProximity = %d\n", g_EnableTpProximity); + return; + } +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + + irq_set_irq_type(_gIrq,IRQF_TRIGGER_RISING | IRQF_NO_SUSPEND | IRQF_ONESHOT); + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + if (g_GestureDebugMode == 1) + { + DrvIcFwLyrCloseGestureDebugMode(); + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + + if (g_GestureWakeupFlag == 1) + { + DrvIcFwLyrCloseGestureWakeup(); + } + else + { + DrvPlatformLyrEnableFingerTouchReport(); + } + } +#ifdef CONFIG_ENABLE_HOTKNOT + else // Enable touch in hotknot transfer mode + { + DrvPlatformLyrEnableFingerTouchReport(); + } +#endif //CONFIG_ENABLE_HOTKNOT +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE && g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_AFTER_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + DrvPlatformLyrTouchDevicePowerOn(); + } + +#ifdef CONFIG_ENABLE_GLOVE_MODE + if (g_IsEnableGloveMode == 1) + { + if (g_IsGloveModeOpen == 0) + { + DrvIcFwCtrlOpenGloveMode(); + } + } +#endif //CONFIG_ENABLE_GLOVE_MODE + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + DrvIcFwLyrRestoreFirmwareModeToLogDataMode(); // Mark this function call for avoiding device driver may spend longer time to resume from suspend state. + } //IS_FIRMWARE_DATA_LOG_ENABLED + +#ifndef CONFIG_ENABLE_GESTURE_WAKEUP + DrvPlatformLyrEnableFingerTouchReport(); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +} + +#endif //CONFIG_ENABLE_NOTIFIER_FB + +/* probe function is used for matching and initializing input device */ +s32 /*__devinit*/ MsDrvInterfaceTouchDeviceProbe(struct i2c_client *pClient, const struct i2c_device_id *pDeviceId) +{ + s32 nRetVal = 0; + u16 nMajor = 0, nMinor = 0; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrInputDeviceInitialize(pClient); + + DrvPlatformLyrTouchDeviceRequestGPIO(); + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON + DrvPlatformLyrTouchDeviceRegulatorPowerOn(); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + DrvPlatformLyrTouchDevicePowerOn(); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaAlloc(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + nRetVal = DrvMainTouchDeviceInitialize(); + if (nRetVal == -ENODEV) + { + DrvPlatformLyrTouchDeviceRemove(pClient); + return nRetVal; + } + + DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(); + + DrvPlatformLyrTouchDeviceRegisterEarlySuspend(); + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + DrvIcFwLyrCheckFirmwareUpdateBySwId(); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + + DBG("*** MStar touch driver registered ***\n"); + + //DrvIcFwLyrGetCustomerFirmwareVersion(&nMajor, &nMinor, &_gFwVersion); + return nRetVal; +} + +/* remove function is triggered when the input device is removed from input sub-system */ +s32 /*__devexit*/ MsDrvInterfaceTouchDeviceRemove(struct i2c_client *pClient) +{ + DBG("*** %s() ***\n", __func__); + + return DrvPlatformLyrTouchDeviceRemove(pClient); +} + +void MsDrvInterfaceTouchDeviceSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate) +{ + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrSetIicDataRate(pClient, nIicDataRate); +} diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.h b/drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.h new file mode 100644 index 00000000..99915e9c --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_platform_interface.h @@ -0,0 +1,50 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_interface.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_PLATFORM_INTERFACE_H__ +#define __MSTAR_DRV_PLATFORM_INTERFACE_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern s32 /*__devinit*/ MsDrvInterfaceTouchDeviceProbe(struct i2c_client *pClient, const struct i2c_device_id *pDeviceId); +extern s32 /*__devexit*/ MsDrvInterfaceTouchDeviceRemove(struct i2c_client *pClient); +#ifdef CONFIG_ENABLE_NOTIFIER_FB +extern int MsDrvInterfaceTouchDeviceFbNotifierCallback(struct notifier_block *pSelf, unsigned long nEvent, void *pData); +#else +extern void MsDrvInterfaceTouchDeviceResume(struct early_suspend *pSuspend); +extern void MsDrvInterfaceTouchDeviceSuspend(struct early_suspend *pSuspend); +#endif //CONFIG_ENABLE_NOTIFIER_FB +extern void MsDrvInterfaceTouchDeviceSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate); + +#endif /* __MSTAR_DRV_PLATFORM_INTERFACE_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.c b/drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.c new file mode 100644 index 00000000..d07e81dc --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.c @@ -0,0 +1,910 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_porting_layer.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_platform_porting_layer.h" +#include "mstar_drv_ic_fw_porting_layer.h" +#include "mstar_drv_platform_interface.h" +#include "mstar_drv_utility_adaption.h" +#include + +#ifdef CONFIG_ENABLE_HOTKNOT +#include "mstar_drv_hotknot_queue.h" +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_JNI_INTERFACE +#include "mstar_drv_jni_interface.h" +#endif //CONFIG_ENABLE_JNI_INTERFACE + +/*=============================================================*/ +// EXTREN VARIABLE DECLARATION +/*=============================================================*/ + +extern struct kset *g_TouchKSet; +extern struct kobject *g_TouchKObj; +extern u8 g_GestureWakeupFlag; + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +extern u8 g_FaceClosingTp; +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +extern struct tpd_device *tpd; +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +extern struct regulator *g_ReguVdd; +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON +#endif + +#ifdef CONFIG_ENABLE_HOTKNOT +extern struct miscdevice hotknot_miscdevice; +extern u8 g_HotKnotState; +#endif //CONFIG_ENABLE_HOTKNOT + +extern u8 IS_FIRMWARE_DATA_LOG_ENABLED; +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +struct mutex g_Mutex; +spinlock_t _gIrqLock; +extern struct wake_lock mstar_irq_lock; + +static struct work_struct _gFingerTouchWork; +static int _gInterruptFlag = 0; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +#ifdef CONFIG_ENABLE_NOTIFIER_FB +static struct notifier_block _gFbNotifier; +#else +static struct early_suspend _gEarlySuspend; +#endif //CONFIG_ENABLE_NOTIFIER_FB +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM || CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifndef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +static DECLARE_WAIT_QUEUE_HEAD(_gWaiter); +static struct task_struct *_gThread = NULL; +static int _gTpdFlag = 0; +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +#ifdef CONFIG_TP_HAVE_KEY +const int g_TpVirtualKey[] = {TOUCH_KEY_HOME, TOUCH_KEY_MENU, TOUCH_KEY_BACK, TOUCH_KEY_SEARCH}; + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#define BUTTON_W (100) +#define BUTTON_H (100) + +const int g_TpVirtualKeyDimLocal[MAX_KEY_NUM][4] = {{BUTTON_W/2*1,TOUCH_SCREEN_Y_MAX+BUTTON_H/2,BUTTON_W,BUTTON_H},{BUTTON_W/2*3,TOUCH_SCREEN_Y_MAX+BUTTON_H/2,BUTTON_W,BUTTON_H},{BUTTON_W/2*5,TOUCH_SCREEN_Y_MAX+BUTTON_H/2,BUTTON_W,BUTTON_H},{BUTTON_W/2*7,TOUCH_SCREEN_Y_MAX+BUTTON_H/2,BUTTON_W,BUTTON_H}}; +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#endif //CONFIG_TP_HAVE_KEY + +struct input_dev *g_InputDevice = NULL; +int _gIrq = -1; + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +/* read data through I2C then report data to input sub-system when interrupt occurred */ +static void _DrvPlatformLyrFingerTouchDoWork(struct work_struct *pWork) +{ + unsigned long nIrqFlag; + + DBG("*** %s() ***\n", __func__); + + DrvIcFwLyrHandleFingerTouch(NULL, 0); + + DBG("*** %s() _gInterruptFlag = %d ***\n", __func__, _gInterruptFlag); // add for debug + +// DBG("*** %s() spin_lock_irqsave() ***\n", __func__); // add for debug + spin_lock_irqsave(&_gIrqLock, nIrqFlag); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + + if (_gInterruptFlag == 0) + { + enable_irq(_gIrq); +// DBG("*** %s() enable_irq(_gIrq) ***\n", __func__); // add for debug + + _gInterruptFlag = 1; + } + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + + if (_gInterruptFlag == 0) + { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +// DBG("*** %s() mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM) ***\n", __func__); // add for debug + + _gInterruptFlag = 1; + } + +#endif + spin_unlock_irqrestore(&_gIrqLock, nIrqFlag); +/* +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + wake_unlock(&mstar_irq_lock); +#endif*/ + //wake_unlock(&mstar_irq_lock); +// DBG("*** %s() spin_unlock_irqrestore() ***\n", __func__); // add for debug +} + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +/* The interrupt service routine will be triggered when interrupt occurred */ +static irqreturn_t _DrvPlatformLyrFingerTouchInterruptHandler(s32 nIrq, void *pDeviceId) +{ + unsigned long nIrqFlag; + + //wake_lock_timeout(&mstar_irq_lock,msecs_to_jiffies(20000)); + + DBG("*** %s() ***\n", __func__); + + DBG("*** %s() _gInterruptFlag = %d ***\n", __func__, _gInterruptFlag); // add for debug + +// DBG("*** %s() spin_lock_irqsave() ***\n", __func__); // add for debug + spin_lock_irqsave(&_gIrqLock, nIrqFlag); + + if (_gInterruptFlag == 1) + { + disable_irq_nosync(_gIrq); +// DBG("*** %s() disable_irq_nosync(_gIrq) ***\n", __func__); // add for debug + + _gInterruptFlag = 0; + + schedule_work(&_gFingerTouchWork); + } + + spin_unlock_irqrestore(&_gIrqLock, nIrqFlag); +// DBG("*** %s() spin_unlock_irqrestore() ***\n", __func__); // add for debug + return IRQ_HANDLED; +} +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +static void _DrvPlatformLyrFingerTouchInterruptHandler(void) +{ + unsigned long nIrqFlag; + + DBG("*** %s() ***\n", __func__); + + DBG("*** %s() _gInterruptFlag = %d ***\n", __func__, _gInterruptFlag); // add for debug + +// DBG("*** %s() spin_lock_irqsave() ***\n", __func__); // add for debug + spin_lock_irqsave(&_gIrqLock, nIrqFlag); + +#ifdef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + + if (_gInterruptFlag == 1) + { + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); +// DBG("*** %s() mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM) ***\n", __func__); // add for debug + + _gInterruptFlag = 0; + + schedule_work(&_gFingerTouchWork); + } + +#else + + if (_gInterruptFlag == 1) + { + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); +// DBG("*** %s() mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM) ***\n", __func__); // add for debug + + _gInterruptFlag = 0; + + _gTpdFlag = 1; + wake_up_interruptible(&_gWaiter); + } +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + + spin_unlock_irqrestore(&_gIrqLock, nIrqFlag); +// DBG("*** %s() spin_unlock_irqrestore() ***\n", __func__); // add for debug +} + +#ifndef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +static int _DrvPlatformLyrFingerTouchHandler(void *pUnUsed) +{ + unsigned long nIrqFlag; + struct sched_param param = { .sched_priority = RTPM_PRIO_TPD }; + sched_setscheduler(current, SCHED_RR, ¶m); + + DBG("*** %s() ***\n", __func__); + + do + { + set_current_state(TASK_INTERRUPTIBLE); + wait_event_interruptible(_gWaiter, _gTpdFlag != 0); + _gTpdFlag = 0; + + set_current_state(TASK_RUNNING); + + DrvIcFwLyrHandleFingerTouch(NULL, 0); + + DBG("*** %s() _gInterruptFlag = %d ***\n", __func__, _gInterruptFlag); // add for debug + +// DBG("*** %s() spin_lock_irqsave() ***\n", __func__); // add for debug + spin_lock_irqsave(&_gIrqLock, nIrqFlag); + + if (_gInterruptFlag == 0) + { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +// DBG("*** %s() mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM) ***\n", __func__); // add for debug + + _gInterruptFlag = 1; + } + + spin_unlock_irqrestore(&_gIrqLock, nIrqFlag); +// DBG("*** %s() spin_unlock_irqrestore() ***\n", __func__); // add for debug + + } while (!kthread_should_stop()); + + return 0; +} +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +#endif + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +void DrvPlatformLyrTouchDeviceRegulatorPowerOn(void) +{ +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + nRetVal = regulator_set_voltage(g_ReguVdd, 2800000, 2800000); // For specific SPRD BB chip(ex. SC7715) or QCOM BB chip(ex. MSM8610), need to enable this function call for correctly power on Touch IC. + + if (nRetVal) + { + DBG("Could not set to 2800mv.\n"); + } + regulator_enable(g_ReguVdd); + + mdelay(20); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + //hwPowerOn(MT6323_POWER_LDO_VGP1, VOL_2800, "TP"); // For specific MTK BB chip(ex. MT6582), need to enable this function call for correctly power on Touch IC. + hwPowerOn(PMIC_APP_CAP_TOUCH_VDD, VOL_2800, "TP"); // For specific MTK BB chip(ex. MT6735), need to enable this function call for correctly power on Touch IC. +#endif +} +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +void DrvPlatformLyrTouchDevicePowerOn(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 1); +// gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + udelay(100); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0); + udelay(100); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + mdelay(25); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + udelay(100); + + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO); + udelay(100); + +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); + mdelay(100); + hwPowerOn(TPD_POWER_SOURCE, VOL_2800, "TP"); + mdelay(10); // reset pulse +#endif //TPD_CLOSE_POWER_IN_SLEEP + + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + mdelay(25); +#endif +} + +void DrvPlatformLyrTouchDevicePowerOff(void) +{ + DBG("*** %s() ***\n", __func__); + + DrvIcFwLyrOptimizeCurrentConsumption(); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +// gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 0); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO); +#ifdef TPD_CLOSE_POWER_IN_SLEEP + hwPowerDown(TPD_POWER_SOURCE, "TP"); +#endif //TPD_CLOSE_POWER_IN_SLEEP +#endif +} + +void DrvPlatformLyrTouchDeviceResetHw(void) +{ + DBG("*** %s() MS_TS_MSG_IC_GPIO_RST=%d***\n", __func__,MS_TS_MSG_IC_GPIO_RST); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + gpio_direction_output(MS_TS_MSG_IC_GPIO_RST, 1); +// gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + udelay(100); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 0); + udelay(100); + gpio_set_value(MS_TS_MSG_IC_GPIO_RST, 1); + mdelay(25); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + udelay(100); + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ZERO); + udelay(100); + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_RST, GPIO_CTP_RST_PIN_M_GPIO); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_RST, GPIO_DIR_OUT); + mt_set_gpio_out(MS_TS_MSG_IC_GPIO_RST, GPIO_OUT_ONE); + mdelay(25); +#endif +} + +void DrvPlatformLyrDisableFingerTouchReport(void) +{ + unsigned long nIrqFlag; + + DBG("*** %s() ***\n", __func__); + + DBG("*** %s() _gInterruptFlag = %d ***\n", __func__, _gInterruptFlag); // add for debug + + spin_lock_irqsave(&_gIrqLock, nIrqFlag); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + if (_gInterruptFlag == 1) + { + printk("DrvPlatformLyrDisableFingerTouchReport___gIrq=%d\n",_gIrq); + disable_irq(_gIrq); + + _gInterruptFlag = 0; + } + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + +#ifdef CONFIG_ENABLE_HOTKNOT + if (g_HotKnotState != HOTKNOT_TRANS_STATE && g_HotKnotState != HOTKNOT_BEFORE_TRANS_STATE) +#endif //CONFIG_ENABLE_HOTKNOT + { + if (_gInterruptFlag == 1) + { + mt_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); + + _gInterruptFlag = 0; + } + } +#endif + + spin_unlock_irqrestore(&_gIrqLock, nIrqFlag); +} + +void DrvPlatformLyrEnableFingerTouchReport(void) +{ + unsigned long nIrqFlag; + + DBG("*** %s() ***\n", __func__); + + DBG("*** %s() _gInterruptFlag = %d ***\n", __func__, _gInterruptFlag); // add for debug + +// DBG("*** %s() spin_lock_irqsave() ***\n", __func__); // add for debug + spin_lock_irqsave(&_gIrqLock, nIrqFlag); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + + if (_gInterruptFlag == 0) + { + enable_irq(_gIrq); +// DBG("*** %s() enable_irq(_gIrq) ***\n", __func__); // add for debug + + _gInterruptFlag = 1; + } + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + + if (_gInterruptFlag == 0) + { + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); +// DBG("*** %s() mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM) ***\n", __func__); // add for debug + + _gInterruptFlag = 1; + } + +#endif + + spin_unlock_irqrestore(&_gIrqLock, nIrqFlag); +// DBG("*** %s() spin_unlock_irqrestore() ***\n", __func__); // add for debug +} + +void DrvPlatformLyrFingerTouchPressed(s32 nX, s32 nY, s32 nPressure, s32 nId) +{ + DBG("*** %s() ***\n", __func__); + DBG("point touch pressed\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 1); +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + input_report_abs(g_InputDevice, ABS_MT_TRACKING_ID, nId); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + input_report_abs(g_InputDevice, ABS_MT_TOUCH_MAJOR, 1); + input_report_abs(g_InputDevice, ABS_MT_WIDTH_MAJOR, 1); + input_report_abs(g_InputDevice, ABS_MT_POSITION_X, nX); + input_report_abs(g_InputDevice, ABS_MT_POSITION_Y, nY); + + input_mt_sync(g_InputDevice); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_TP_HAVE_KEY + if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode()) + { + tpd_button(nX, nY, 1); + } +#endif //CONFIG_TP_HAVE_KEY + + TPD_EM_PRINT(nX, nY, nX, nY, nId, 1); +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +} + +void DrvPlatformLyrFingerTouchReleased(s32 nX, s32 nY) +{ + DBG("*** %s() ***\n", __func__); + DBG("point touch released\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 0); + input_mt_sync(g_InputDevice); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_TP_HAVE_KEY + if (FACTORY_BOOT == get_boot_mode() || RECOVERY_BOOT == get_boot_mode()) + { + tpd_button(nX, nY, 0); +// tpd_button(0, 0, 0); + } +#endif //CONFIG_TP_HAVE_KEY + + TPD_EM_PRINT(nX, nY, nX, nY, 0, 0); +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +} + +s32 DrvPlatformLyrInputDeviceInitialize(struct i2c_client *pClient) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + mutex_init(&g_Mutex); + spin_lock_init(&_gIrqLock); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + /* allocate an input device */ + g_InputDevice = input_allocate_device(); + if (g_InputDevice == NULL) + { + DBG("*** input device allocation failed ***\n"); + return -ENOMEM; + } + + g_InputDevice->name = pClient->name; + g_InputDevice->phys = "I2C"; + g_InputDevice->dev.parent = &pClient->dev; + g_InputDevice->id.bustype = BUS_I2C; + + /* set the supported event type for input device */ + set_bit(EV_ABS, g_InputDevice->evbit); + set_bit(EV_SYN, g_InputDevice->evbit); + set_bit(EV_KEY, g_InputDevice->evbit); + set_bit(BTN_TOUCH, g_InputDevice->keybit); + set_bit(INPUT_PROP_DIRECT, g_InputDevice->propbit); + +#ifdef CONFIG_TP_HAVE_KEY + // Method 1. + { + u32 i; + for (i = 0; i < MAX_KEY_NUM; i ++) + { + input_set_capability(g_InputDevice, EV_KEY, g_TpVirtualKey[i]); + } + } +#endif +/* +#ifdef CONFIG_TP_HAVE_KEY + // Method 2. + set_bit(TOUCH_KEY_MENU, g_InputDevice->keybit); //Menu + set_bit(TOUCH_KEY_HOME, g_InputDevice->keybit); //Home + set_bit(TOUCH_KEY_BACK, g_InputDevice->keybit); //Back + set_bit(TOUCH_KEY_SEARCH, g_InputDevice->keybit); //Search +#endif +*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + input_set_capability(g_InputDevice, EV_KEY, KEY_POWER); + input_set_capability(g_InputDevice, EV_KEY, KEY_UP); + input_set_capability(g_InputDevice, EV_KEY, KEY_DOWN); + input_set_capability(g_InputDevice, EV_KEY, KEY_LEFT); + input_set_capability(g_InputDevice, EV_KEY, KEY_RIGHT); + input_set_capability(g_InputDevice, EV_KEY, KEY_W); + input_set_capability(g_InputDevice, EV_KEY, KEY_Z); + input_set_capability(g_InputDevice, EV_KEY, KEY_V); + input_set_capability(g_InputDevice, EV_KEY, KEY_O); + input_set_capability(g_InputDevice, EV_KEY, KEY_M); + input_set_capability(g_InputDevice, EV_KEY, KEY_C); + input_set_capability(g_InputDevice, EV_KEY, KEY_E); + input_set_capability(g_InputDevice, EV_KEY, KEY_S); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + input_set_abs_params(g_InputDevice, ABS_MT_TRACKING_ID, 0, 255, 0, 0); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC + input_set_abs_params(g_InputDevice, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_X, TOUCH_SCREEN_X_MIN, TOUCH_SCREEN_X_MAX, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_Y, TOUCH_SCREEN_Y_MIN, TOUCH_SCREEN_Y_MAX, 0, 0); + + /* register the input device to input sub-system */ + nRetVal = input_register_device(g_InputDevice); + if (nRetVal < 0) + { + DBG("*** Unable to register touch input device ***\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + g_InputDevice = tpd->dev; +/* + g_InputDevice->phys = "I2C"; + g_InputDevice->dev.parent = &pClient->dev; + g_InputDevice->id.bustype = BUS_I2C; + + // set the supported event type for input device + set_bit(EV_ABS, g_InputDevice->evbit); + set_bit(EV_SYN, g_InputDevice->evbit); + set_bit(EV_KEY, g_InputDevice->evbit); + set_bit(BTN_TOUCH, g_InputDevice->keybit); + set_bit(INPUT_PROP_DIRECT, g_InputDevice->propbit); +*/ + +#ifdef CONFIG_TP_HAVE_KEY + { + u32 i; + for (i = 0; i < MAX_KEY_NUM; i ++) + { + input_set_capability(g_InputDevice, EV_KEY, g_TpVirtualKey[i]); + } + } +#endif + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + input_set_capability(g_InputDevice, EV_KEY, KEY_POWER); + input_set_capability(g_InputDevice, EV_KEY, KEY_UP); + input_set_capability(g_InputDevice, EV_KEY, KEY_DOWN); + input_set_capability(g_InputDevice, EV_KEY, KEY_LEFT); + input_set_capability(g_InputDevice, EV_KEY, KEY_RIGHT); + input_set_capability(g_InputDevice, EV_KEY, KEY_W); + input_set_capability(g_InputDevice, EV_KEY, KEY_Z); + input_set_capability(g_InputDevice, EV_KEY, KEY_V); + input_set_capability(g_InputDevice, EV_KEY, KEY_O); + input_set_capability(g_InputDevice, EV_KEY, KEY_M); + input_set_capability(g_InputDevice, EV_KEY, KEY_C); + input_set_capability(g_InputDevice, EV_KEY, KEY_E); + input_set_capability(g_InputDevice, EV_KEY, KEY_S); +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC) + input_set_abs_params(g_InputDevice, ABS_MT_TRACKING_ID, 0, (MAX_TOUCH_NUM-1), 0, 0); +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_MUTUAL_IC +/* + input_set_abs_params(g_InputDevice, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_WIDTH_MAJOR, 0, 15, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_X, TOUCH_SCREEN_X_MIN, TOUCH_SCREEN_X_MAX, 0, 0); + input_set_abs_params(g_InputDevice, ABS_MT_POSITION_Y, TOUCH_SCREEN_Y_MIN, TOUCH_SCREEN_Y_MAX, 0, 0); +*/ + +#endif + + return nRetVal; +} + +s32 DrvPlatformLyrTouchDeviceRequestGPIO(void) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + nRetVal = gpio_request(MS_TS_MSG_IC_GPIO_RST, "C_TP_RST"); + if (nRetVal < 0) + { + DBG("*** Failed to request GPIO %d, error %d ***\n", MS_TS_MSG_IC_GPIO_RST, nRetVal); + } + + nRetVal = gpio_request(MS_TS_MSG_IC_GPIO_INT, "C_TP_INT"); + if (nRetVal < 0) + { + DBG("*** Failed to request GPIO %d, error %d ***\n", MS_TS_MSG_IC_GPIO_INT, nRetVal); + } +#endif + + return nRetVal; +} + +s32 DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(void) +{ + s32 nRetVal = 0; + + DBG("*** %s() ***\n", __func__); + + if (DrvIcFwLyrIsRegisterFingerTouchInterruptHandler()) + { +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + /* initialize the finger touch work queue */ + INIT_WORK(&_gFingerTouchWork, _DrvPlatformLyrFingerTouchDoWork); + + _gIrq = gpio_to_irq(MS_TS_MSG_IC_GPIO_INT); + + /* request an irq and register the isr */ + nRetVal = request_threaded_irq(_gIrq/*MS_TS_MSG_IC_GPIO_INT*/,NULL, _DrvPlatformLyrFingerTouchInterruptHandler, + IRQF_TRIGGER_RISING | IRQF_ONESHOT | IRQF_NO_SUSPEND /*//* IRQF_TRIGGER_FALLING */, + "msg2xxx", NULL); + +// nRetVal = request_irq(_gIrq/*MS_TS_MSG_IC_GPIO_INT*/, _DrvPlatformLyrFingerTouchInterruptHandler, +// IRQF_TRIGGER_RISING /* | IRQF_NO_SUSPEND *//* IRQF_TRIGGER_FALLING */, +// "msg2xxx", NULL); + + _gInterruptFlag = 1; + + if (nRetVal != 0) + { + DBG("*** Unable to claim irq %d; error %d ***\n", MS_TS_MSG_IC_GPIO_INT, nRetVal); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + mt_set_gpio_mode(MS_TS_MSG_IC_GPIO_INT, GPIO_CTP_EINT_PIN_M_EINT); + mt_set_gpio_dir(MS_TS_MSG_IC_GPIO_INT, GPIO_DIR_IN); + mt_set_gpio_pull_enable(MS_TS_MSG_IC_GPIO_INT, GPIO_PULL_ENABLE); + mt_set_gpio_pull_select(MS_TS_MSG_IC_GPIO_INT, GPIO_PULL_UP); + + mt_eint_set_hw_debounce(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_CN); + mt_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_TYPE/* EINTF_TRIGGER_RISING */, _DrvPlatformLyrFingerTouchInterruptHandler, 1); + + mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); + + _gInterruptFlag = 1; + +#ifdef CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM + /* initialize the finger touch work queue */ + INIT_WORK(&_gFingerTouchWork, _DrvPlatformLyrFingerTouchDoWork); +#else + _gThread = kthread_run(_DrvPlatformLyrFingerTouchHandler, 0, TPD_DEVICE); + if (IS_ERR(_gThread)) + { + nRetVal = PTR_ERR(_gThread); + DBG("Failed to create kernel thread: %d\n", nRetVal); + } +#endif //CONFIG_USE_IRQ_INTERRUPT_FOR_MTK_PLATFORM +#endif + } + + return nRetVal; +} + +void DrvPlatformLyrTouchDeviceRegisterEarlySuspend(void) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +#ifdef CONFIG_ENABLE_NOTIFIER_FB + _gFbNotifier.notifier_call = MsDrvInterfaceTouchDeviceFbNotifierCallback; + fb_register_client(&_gFbNotifier); +#else + _gEarlySuspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN; + _gEarlySuspend.suspend = MsDrvInterfaceTouchDeviceSuspend; + _gEarlySuspend.resume = MsDrvInterfaceTouchDeviceResume; + register_early_suspend(&_gEarlySuspend); +#endif //CONFIG_ENABLE_NOTIFIER_FB +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM || CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM +} + +/* remove function is triggered when the input device is removed from input sub-system */ +s32 DrvPlatformLyrTouchDeviceRemove(struct i2c_client *pClient) +{ + DBG("*** %s() ***\n", __func__); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + free_irq(_gIrq, g_InputDevice); + gpio_free(MS_TS_MSG_IC_GPIO_INT); + gpio_free(MS_TS_MSG_IC_GPIO_RST); + input_unregister_device(g_InputDevice); +#endif + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + kset_unregister(g_TouchKSet); + kobject_put(g_TouchKObj); + } //IS_FIRMWARE_DATA_LOG_ENABLED + +#ifdef CONFIG_ENABLE_HOTKNOT + DeleteQueue(); + DeleteHotKnotMem(); + DBG("Deregister hotknot misc device.\n"); + misc_deregister( &hotknot_miscdevice ); +#endif //CONFIG_ENABLE_HOTKNOT + +#ifdef CONFIG_ENABLE_JNI_INTERFACE + DeleteMsgToolMem(); +#endif //CONFIG_ENABLE_JNI_INTERFACE + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaFree(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + return 0; +} +extern void sprd_i2c_ctl_chg_clk(unsigned int id_nr, unsigned int freq); + +void DrvPlatformLyrSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate) +{ + DBG("*** %s() nIicDataRate = %d ***\n", __func__, nIicDataRate); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + // TODO : Please FAE colleague to confirm with customer device driver engineer for how to set i2c data rate on SPRD platform + sprd_i2c_ctl_chg_clk(pClient->adapter->nr, nIicDataRate); + mdelay(100); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + // TODO : Please FAE colleague to confirm with customer device driver engineer for how to set i2c data rate on QCOM platform +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + pClient->timing = nIicDataRate/1000; +#endif +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + +int DrvPlatformLyrGetTpPsData(void) +{ + DBG("*** %s() g_FaceClosingTp = %d ***\n", __func__, g_FaceClosingTp); + + return g_FaceClosingTp; +} + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +void DrvPlatformLyrTpPsEnable(int nEnable) +{ + DBG("*** %s() nEnable = %d ***\n", __func__, nEnable); + + if (nEnable) + { + DrvIcFwLyrEnableProximity(); + } + else + { + DrvIcFwLyrDisableProximity(); + } +} +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +int DrvPlatformLyrTpPsOperate(void* pSelf, u32 nCommand, void* pBuffIn, int nSizeIn, + void* pBuffOut, int nSizeOut, int* pActualOut) +{ + int nErr = 0; + int nValue; + hwm_sensor_data *pSensorData; + + switch (nCommand) + { + case SENSOR_DELAY: + if ((pBuffIn == NULL) || (nSizeIn < sizeof(int))) + { + nErr = -EINVAL; + } + // Do nothing + break; + + case SENSOR_ENABLE: + if ((pBuffIn == NULL) || (nSizeIn < sizeof(int))) + { + nErr = -EINVAL; + } + else + { + nValue = *(int *)pBuffIn; + if (nValue) + { + if (DrvIcFwLyrEnableProximity() < 0) + { + DBG("Enable ps fail: %d\n", nErr); + return -1; + } + } + else + { + if (DrvIcFwLyrDisableProximity() < 0) + { + DBG("Disable ps fail: %d\n", nErr); + return -1; + } + } + } + break; + + case SENSOR_GET_DATA: + if ((pBuffOut == NULL) || (nSizeOut < sizeof(hwm_sensor_data))) + { + DBG("Get sensor data parameter error!\n"); + nErr = -EINVAL; + } + else + { + pSensorData = (hwm_sensor_data *)pBuffOut; + + pSensorData->values[0] = DrvPlatformLyrGetTpPsData(); + pSensorData->value_divide = 1; + pSensorData->status = SENSOR_STATUS_ACCURACY_MEDIUM; + } + break; + + default: + DBG("Un-recognized parameter %d!\n", nCommand); + nErr = -1; + break; + } + + return nErr; +} +#endif + +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +//------------------------------------------------------------------------------// + diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.h b/drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.h new file mode 100644 index 00000000..3ab6f9cd --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_platform_porting_layer.h @@ -0,0 +1,178 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_platform_porting_layer.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ +#define __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + +#include +#include + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#include +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +#ifdef CONFIG_ENABLE_NOTIFIER_FB +#include +#include +#endif //CONFIG_ENABLE_NOTIFIER_FB + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#include +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#include +#include +#include +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#include +#include +#include +#include + +#include +#include "tpd.h" +#include "cust_gpio_usage.h" +#include + +#endif + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/* + * Note. + * Please change the below GPIO pin setting to follow the platform that you are using(EX. MediaTek, Spreadtrum, Qualcomm). + */ +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + +// TODO : Please FAE colleague to confirm with customer device driver engineer about the value of RST and INT GPIO setting +//#define MS_TS_MSG_IC_GPIO_RST GPIO_TOUCH_RESET //53 //35 +//#define MS_TS_MSG_IC_GPIO_INT GPIO_TOUCH_IRQ //52 //37 + +#ifdef CONFIG_TP_HAVE_KEY +#define TOUCH_KEY_MENU (139) //229 +#define TOUCH_KEY_HOME (172) //102 +#define TOUCH_KEY_BACK (158) +#define TOUCH_KEY_SEARCH (217) + +#define MAX_KEY_NUM (4) +#endif //CONFIG_TP_HAVE_KEY + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + +// TODO : Please FAE colleague to confirm with customer device driver engineer about the value of RST and INT GPIO setting +#define MS_TS_MSG_IC_GPIO_RST 0 +#define MS_TS_MSG_IC_GPIO_INT 1 + +#ifdef CONFIG_TP_HAVE_KEY +#define TOUCH_KEY_MENU (139) //229 +#define TOUCH_KEY_HOME (172) //102 +#define TOUCH_KEY_BACK (158) +#define TOUCH_KEY_SEARCH (217) + +#define MAX_KEY_NUM (4) +#endif //CONFIG_TP_HAVE_KEY + +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + +#define MS_TS_MSG_IC_GPIO_RST (GPIO_CTP_RST_PIN) +#define MS_TS_MSG_IC_GPIO_INT (GPIO_CTP_EINT_PIN) + +#ifdef CONFIG_TP_HAVE_KEY +#define TOUCH_KEY_MENU KEY_MENU +#define TOUCH_KEY_HOME KEY_HOMEPAGE +#define TOUCH_KEY_BACK KEY_BACK +#define TOUCH_KEY_SEARCH KEY_SEARCH + +#define MAX_KEY_NUM (4) +#endif //CONFIG_TP_HAVE_KEY + +#endif + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern void DrvPlatformLyrDisableFingerTouchReport(void); +extern void DrvPlatformLyrEnableFingerTouchReport(void); +extern void DrvPlatformLyrFingerTouchPressed(s32 nX, s32 nY, s32 nPressure, s32 nId); +extern void DrvPlatformLyrFingerTouchReleased(s32 nX, s32 nY); +extern s32 DrvPlatformLyrInputDeviceInitialize(struct i2c_client *pClient); +extern void DrvPlatformLyrSetIicDataRate(struct i2c_client *pClient, u32 nIicDataRate); +extern void DrvPlatformLyrTouchDevicePowerOff(void); +extern void DrvPlatformLyrTouchDevicePowerOn(void); +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +extern void DrvPlatformLyrTouchDeviceRegulatorPowerOn(void); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON +extern void DrvPlatformLyrTouchDeviceRegisterEarlySuspend(void); +extern s32 DrvPlatformLyrTouchDeviceRegisterFingerTouchInterruptHandler(void); +extern s32 DrvPlatformLyrTouchDeviceRemove(struct i2c_client *pClient); +extern s32 DrvPlatformLyrTouchDeviceRequestGPIO(void); +extern void DrvPlatformLyrTouchDeviceResetHw(void); +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +extern int DrvPlatformLyrGetTpPsData(void); +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +extern void DrvPlatformLyrTpPsEnable(int nEnable); +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +extern int DrvPlatformLyrTpPsOperate(void* pSelf, u32 nCommand, void* pBuffIn, int nSizeIn, void* pBuffOut, int nSizeOut, int* pActualOut); +#endif +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +#endif /* __MSTAR_DRV_PLATFORM_PORTING_LAYER_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_qcom.c b/drivers/input/touchscreen/msg2233/mstar_drv_qcom.c new file mode 100644 index 00000000..cf1f6c2b --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_qcom.c @@ -0,0 +1,156 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_qcom.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "mstar_drv_platform_interface.h" + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + +#define MSG_TP_IC_NAME "msg2xxx" //"msg21xxA" or "msg22xx" or "msg26xxM" /* Please define the mstar touch ic name based on the mutual-capacitive ic or self capacitive ic that you are using */ + +/*=============================================================*/ +// VARIABLE DEFINITION +/*=============================================================*/ + +struct i2c_client *g_I2cClient = NULL; + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +struct regulator *g_ReguVdd = NULL; +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +/*=============================================================*/ +// FUNCTION DEFINITION +/*=============================================================*/ + +/* probe function is used for matching and initializing input device */ +static int __devinit touch_driver_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON + const char *vdd_name = "vdd"; +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + DBG("*** %s ***\n", __FUNCTION__); + + if (client == NULL) + { + DBG("i2c client is NULL\n"); + return -1; + } + g_I2cClient = client; + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON + g_ReguVdd = regulator_get(&g_I2cClient->dev, vdd_name); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + return MsDrvInterfaceTouchDeviceProbe(g_I2cClient, id); +} + +/* remove function is triggered when the input device is removed from input sub-system */ +static int touch_driver_remove(struct i2c_client *client) +{ + DBG("*** %s ***\n", __FUNCTION__); + + return MsDrvInterfaceTouchDeviceRemove(client); +} + +/* The I2C device list is used for matching I2C device and I2C device driver. */ +static const struct i2c_device_id touch_device_id[] = +{ + {MSG_TP_IC_NAME, 0}, + {}, /* should not omitted */ +}; + +MODULE_DEVICE_TABLE(i2c, touch_device_id); + +static struct of_device_id touch_match_table[] = { + { .compatible = "mstar,msg2xxx",}, + {}, +}; + +static struct i2c_driver touch_device_driver = +{ + .driver = { + .name = MSG_TP_IC_NAME, + .owner = THIS_MODULE, + .of_match_table = touch_match_table, + }, + .probe = touch_driver_probe, + .remove = touch_driver_remove, + .id_table = touch_device_id, +}; + +static int __init touch_driver_init(void) +{ + int ret; + + /* register driver */ + ret = i2c_add_driver(&touch_device_driver); + if (ret < 0) + { + DBG("add touch device driver i2c driver failed.\n"); + return -ENODEV; + } + DBG("add touch device driver i2c driver.\n"); + + return ret; +} + +static void __exit touch_driver_exit(void) +{ + DBG("remove touch device driver i2c driver.\n"); + + i2c_del_driver(&touch_device_driver); +} + +module_init(touch_driver_init); +module_exit(touch_driver_exit); +MODULE_LICENSE("GPL"); \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.c b/drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.c new file mode 100644 index 00000000..a544ef4c --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.c @@ -0,0 +1,5747 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_fw_control.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_self_fw_control.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_platform_porting_layer.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; + +#ifdef CONFIG_TP_HAVE_KEY +extern const int g_TpVirtualKey[]; + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +extern const int g_TpVirtualKeyDimLocal[][4]; +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE +#endif //CONFIG_TP_HAVE_KEY + +extern struct input_dev *g_InputDevice; + +extern u8 g_FwData[MAX_UPDATE_FIRMWARE_BUFFER_SIZE][1024]; +extern u32 g_FwDataCount; + +extern struct mutex g_Mutex; + +extern u16 FIRMWARE_MODE_UNKNOWN_MODE; +extern u16 FIRMWARE_MODE_DEMO_MODE; +extern u16 FIRMWARE_MODE_DEBUG_MODE; +extern u16 FIRMWARE_MODE_RAW_DATA_MODE; + +extern struct kobject *g_TouchKObj; +extern u8 g_IsSwitchModeByAPK; + +extern u8 IS_FIRMWARE_DATA_LOG_ENABLED; + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern struct kobject *g_GestureKObj; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE +extern u32 g_IsEnableReportRate; +extern u32 g_InterruptCount; +extern u32 g_ValidTouchCount; + +extern struct timeval g_StartTime; +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u8 _gTpVendorCode[3] = {0}; + +static u8 _gDwIicInfoData[1024]; +static u8 _gOneDimenFwData[MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE*1024+MSG22XX_FIRMWARE_INFO_BLOCK_SIZE] = {0}; // used for MSG22XX + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +/* + * Note. + * Please modify the name of the below .h depends on the vendor TP that you are using. + */ +#include "msg21xxa_xxxx_update_bin.h" // for MSG21xxA +#include "msg21xxa_yyyy_update_bin.h" + +#include "msg22xx_xxxx_update_bin.h" // for MSG22xx +#include "msg22xx_yyyy_update_bin.h" + +static u32 _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; +static struct work_struct _gUpdateFirmwareBySwIdWork; +static struct workqueue_struct *_gUpdateFirmwareBySwIdWorkQueue = NULL; + +static u32 _gIsUpdateInfoBlockFirst = 0; + + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +static u32 _gGestureWakeupValue[2] = {0}; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +static u8 _gIsDisableFinagerTouch = 0; + +/*=============================================================*/ +// GLOBAL VARIABLE DEFINITION +/*=============================================================*/ + +u8 g_ChipType = 0; +u8 g_DemoModePacket[DEMO_MODE_PACKET_LENGTH] = {0}; + +FirmwareInfo_t g_FirmwareInfo; +u8 g_LogModePacket[DEBUG_MODE_PACKET_LENGTH] = {0}; +u16 g_FirmwareMode; + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +#if defined(CONFIG_ENABLE_GESTURE_DEBUG_MODE) +u8 _gGestureWakeupPacket[GESTURE_DEBUG_MODE_PACKET_LENGTH] = {0}; +#elif defined(CONFIG_ENABLE_GESTURE_INFORMATION_MODE) +u8 _gGestureWakeupPacket[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH] = {0}; +#else +u8 _gGestureWakeupPacket[DEMO_MODE_PACKET_LENGTH] = {0}; // for MSG21XXA : packet length(DEMO_MODE_PACKET_LENGTH) , for MSG22XX : packet length(GESTURE_WAKEUP_PACKET_LENGTH) +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +u8 g_GestureDebugFlag = 0x00; +u8 g_GestureDebugMode = 0x00; +u8 g_LogGestureDebug[GESTURE_DEBUG_MODE_PACKET_LENGTH] = {0}; +#endif // CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +u32 g_LogGestureInfor[GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH] = {0}; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +u32 g_GestureWakeupMode[2] = {0xFFFFFFFF, 0xFFFFFFFF}; +u8 g_GestureWakeupFlag = 0; +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +u8 g_EnableTpProximity = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) +u8 g_FaceClosingTp = 0; // for QCOM platform -> 1 : close to, 0 : far away +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) +u8 g_FaceClosingTp = 1; // for MTK platform -> 0 : close to, 1 : far away +#endif +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +u8 g_IsUpdateFirmware = 0x00; + +/*=============================================================*/ +// LOCAL FUNCTION DECLARATION +/*=============================================================*/ + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +static void _DrvFwCtrlCoordinate(u8 *pRawData, u32 *pTranX, u32 *pTranY); +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +static s32 _DrvFwCtrlMsg22xxUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType); + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static void _DrvFwCtrlEraseEmemC32(void) +{ + DBG("*** %s() ***\n", __func__); + + ///////////////////////// + //Erase all + ///////////////////////// + + // Enter gpio mode + RegSet16BitValue(0x161E, 0xBEAF); + + // Before gpio mode, set the control pin as the orginal status + RegSet16BitValue(0x1608, 0x0000); + RegSetLByteValue(0x160E, 0x10); + mdelay(10); + + // ptrim = 1, h'04[2] + RegSetLByteValue(0x1608, 0x04); + RegSetLByteValue(0x160E, 0x10); + mdelay(10); + + // ptm = 6, h'04[12:14] = b'110 + RegSetLByteValue(0x1609, 0x60); + RegSetLByteValue(0x160E, 0x10); + + // pmasi = 1, h'04[6] + RegSetLByteValue(0x1608, 0x44); + // pce = 1, h'04[11] + RegSetLByteValue(0x1609, 0x68); + // perase = 1, h'04[7] + RegSetLByteValue(0x1608, 0xC4); + // pnvstr = 1, h'04[5] + RegSetLByteValue(0x1608, 0xE4); + // pwe = 1, h'04[9] + RegSetLByteValue(0x1609, 0x6A); + // trigger gpio load + RegSetLByteValue(0x160E, 0x10); +} + +static void _DrvFwCtrlEraseEmemC33(EmemType_e eEmemType) +{ + DBG("*** %s() ***\n", __func__); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Set PROGRAM password + RegSetLByteValue(0x161A, 0xBA); + RegSetLByteValue(0x161B, 0xAB); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + + if (eEmemType == EMEM_ALL) + { + RegSetLByteValue(0x1608, 0x10); //mark + } + + RegSetLByteValue(0x1618, 0x40); + mdelay(10); + + RegSetLByteValue(0x1618, 0x80); + + // erase trigger + if (eEmemType == EMEM_MAIN) + { + RegSetLByteValue(0x160E, 0x04); //erase main + } + else + { + RegSetLByteValue(0x160E, 0x08); //erase all block + } +} + +static void _DrvFwCtrlMsg22xxGetTpVendorCode(u8 *pTpVendorCode) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + u16 nRegData1, nRegData2; + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + RegSet16BitValue(0x1600, 0xC1E9); // Set start address for tp vendor code on info block(Actually, start reading from 0xC1E8) + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + pTpVendorCode[0] = ((nRegData1 >> 8) & 0xFF); + pTpVendorCode[1] = (nRegData2 & 0xFF); + pTpVendorCode[2] = ((nRegData2 >> 8) & 0xFF); + + DBG("pTpVendorCode[0] = 0x%x , %c \n", pTpVendorCode[0], pTpVendorCode[0]); + DBG("pTpVendorCode[1] = 0x%x , %c \n", pTpVendorCode[1], pTpVendorCode[1]); + DBG("pTpVendorCode[2] = 0x%x , %c \n", pTpVendorCode[2], pTpVendorCode[2]); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + } +} + +static u16 _DrvFwCtrlMsg22xxGetTrimByte1(void) +{ + u16 nRegData = 0; + u16 nTrimByte1 = 0; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x161E, 0xBEAF); + RegSet16BitValue(0x1608, 0x0006); + RegSet16BitValue(0x160E, 0x0010); + RegSet16BitValue(0x1608, 0x1006); + RegSet16BitValue(0x1600, 0x0001); + RegSet16BitValue(0x160E, 0x0010); + + mdelay(10); + + RegSet16BitValue(0x1608, 0x1846); + RegSet16BitValue(0x160E, 0x0010); + + mdelay(10); + + nRegData = RegGet16BitValue(0x1624); + nRegData = nRegData & 0xFF; + + RegSet16BitValue(0x161E, 0x0000); + + nTrimByte1 = nRegData; + + DBG("nTrimByte1 = 0x%X ***\n", nTrimByte1); + + return nTrimByte1; +} + +static void _DrvFwCtrlMsg22xxChangeVoltage(void) +{ + u16 nTrimValue = 0; + u16 nNewTrimValue = 0; + u16 nTempValue = 0; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x1840, 0xA55A); + + udelay(1000); // delay 1 ms + + nTrimValue = RegGet16BitValue(0x1820); + + udelay(1000); // delay 1 ms + + nTrimValue = nTrimValue & 0x1F; + nTempValue = 0x1F & nTrimValue; + nNewTrimValue = (nTempValue + 0x07); + + if (nNewTrimValue >= 0x20) + { + nNewTrimValue = nNewTrimValue - 0x20; + } + else + { + nNewTrimValue = nNewTrimValue; + } + + if ((nTempValue & 0x10) != 0x10) + { + if (nNewTrimValue >= 0x0F && nNewTrimValue < 0x1F) + { + nNewTrimValue = 0x0F; + } + else + { + nNewTrimValue = nNewTrimValue; + } + } + + RegSet16BitValue(0x1842, nNewTrimValue); + + udelay(1000); // delay 1 ms + + RegSet16BitValueOn(0x1842, BIT5); + + udelay(1000); // delay 1 ms +} + +static void _DrvFwCtrlMsg22xxRestoreVoltage(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValueOff(0x1842, BIT5); + + udelay(1000); // delay 1 ms + + RegSet16BitValue(0x1840, 0x0000); + + udelay(1000); // delay 1 ms +} + +static void _DrvFwCtrlMsg22xxEraseEmem(EmemType_e eEmemType) +{ + u32 i = 0; + u32 nEraseCount = 0; + u32 nMaxEraseTimes = 0; + u32 nTimeOut = 0; + u16 nRegData = 0; + u16 nTrimByte1 = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + DBG("Erase start\n"); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + nTrimByte1 = _DrvFwCtrlMsg22xxGetTrimByte1(); + + _DrvFwCtrlMsg22xxChangeVoltage(); + + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Set PROGRAM password + RegSetLByteValue(0x161A, 0xBA); + RegSetLByteValue(0x161B, 0xAB); + + if (nTrimByte1 == 0xCA) + { + nMaxEraseTimes = MAX_ERASE_EFLASH_TIMES; + } + else + { + nMaxEraseTimes = 1; + } + + for (nEraseCount = 0; nEraseCount < nMaxEraseTimes; nEraseCount ++) + { + if (eEmemType == EMEM_ALL) // 48KB + 512Byte + { + DBG("Erase all block %d times\n", nEraseCount); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(100); + + // Chip erase + RegSet16BitValue(0x160E, BIT3); + + DBG("Wait erase done flag\n"); + + while (1) // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + + mdelay(50); + + if ((nTimeOut ++) > 30) + { + DBG("Erase all block %d times failed. Timeout.\n", nEraseCount); + + if (nEraseCount == (nMaxEraseTimes - 1)) + { + goto EraseEnd; + } + } + } + } + else if (eEmemType == EMEM_MAIN) // 48KB (32+8+8) + { + DBG("Erase main block %d times\n", nEraseCount); + + for (i = 0; i < 3; i ++) + { + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + if (i == 0) + { + RegSet16BitValue(0x1600, 0x0000); + } + else if (i == 1) + { + RegSet16BitValue(0x1600, 0x8000); + } + else if (i == 2) + { + RegSet16BitValue(0x1600, 0xA000); + } + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + nRegData = 0; + nTimeOut = 0; + + while (1) // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(50); + + if ((nTimeOut ++) > 30) + { + DBG("Erase main block %d times failed. Timeout.\n", nEraseCount); + + if (nEraseCount == (nMaxEraseTimes - 1)) + { + goto EraseEnd; + } + } + } + } + } + else if (eEmemType == EMEM_INFO) // 512Byte + { + DBG("Erase info block %d times\n", nEraseCount); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + RegSet16BitValue(0x1600, 0xC000); + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + while (1) // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(50); + + if ((nTimeOut ++) > 30) + { + DBG("Erase info block %d times failed. Timeout.\n", nEraseCount); + + if (nEraseCount == (nMaxEraseTimes - 1)) + { + goto EraseEnd; + } + } + } + } + } + + _DrvFwCtrlMsg22xxRestoreVoltage(); + + EraseEnd: + + DBG("Erase end\n"); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); +} +static void _DrvFwCtrlMsg22xxProgramEmem(EmemType_e eEmemType) +{ + u32 i, j; + u32 nRemainSize = 0, nBlockSize = 0, nSize = 0, index = 0; + u32 nTimeOut = 0; + u16 nRegData = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + u8 szDbBusTxData[128] = {0}; +#ifdef CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K + u32 nSizePerWrite = 1; +#else + u32 nSizePerWrite = 125; +#endif //CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + u8 szDbBusTxData[1024] = {0}; +#ifdef CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K + u32 nSizePerWrite = 1; +#else + u32 nSizePerWrite = 1021; +#endif //CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K +#endif + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + // Hold reset pin before program + RegSetLByteValue(0x1E06, 0x00); + + DBG("Program start\n"); + + RegSet16BitValue(0x161A, 0xABBA); + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + if (eEmemType == EMEM_MAIN) + { + DBG("Program main block\n"); + + RegSet16BitValue(0x1600, 0x0000); // Set start address of main block + nRemainSize = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; //48KB + index = 0; + } + else if (eEmemType == EMEM_INFO) + { + DBG("Program info block\n"); + + RegSet16BitValue(0x1600, 0xC000); // Set start address of info block + nRemainSize = MSG22XX_FIRMWARE_INFO_BLOCK_SIZE; //512Byte + index = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; + } + else + { + DBG("eEmemType = %d is not supported for program e-memory.\n", eEmemType); + return; + } + + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode + + // Program start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + i = 0; + + while (nRemainSize > 0) + { + if (nRemainSize > nSizePerWrite) + { + nBlockSize = nSizePerWrite; + } + else + { + nBlockSize = nRemainSize; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + nSize = 3; + + for (j = 0; j < nBlockSize; j ++) + { + szDbBusTxData[3+j] = _gOneDimenFwData[index+(i*nSizePerWrite)+j]; + nSize ++; + } + i ++; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize); + + nRemainSize = nRemainSize - nBlockSize; + } + + // Program end + szDbBusTxData[0] = 0x21; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); // Clear burst mode + + DBG("Wait write done flag\n"); + + while (1) // Wait write done flag + { + // Polling 0x1610 is 0x0002 + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait write done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(10); + + if ((nTimeOut ++) > 30) + { + DBG("Write failed. Timeout.\n"); + + goto ProgramEnd; + } + } + + ProgramEnd: + + DBG("Program end\n"); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); +} + +static u32 _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EmemType_e eEmemType) +{ + u16 nCrcDown = 0; + u32 nRetVal = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + +#ifdef CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K + // Stop MCU + RegSetLByteValue(0x0FE6, 0x01); + + // Change MCU clock deglich mux source + RegSet16BitValue(0x1E54, (RegGet16BitValue(0x1E54) | BIT0)); + + // Change PIU clock to 48 MHz + RegSet16BitValue(0x1E22, (RegGet16BitValue(0x1E22) | BIT14)); + + // Set MCU clock setting + RegSet16BitValue(0x1E22, (RegGet16BitValue(0x1E22) & (~(BIT3 | BIT2)))); + + // Set DB bus clock setting + RegSet16BitValue(0x1E24, (RegGet16BitValue(0x1E24) & (~(BIT3 | BIT2)))); +#endif //CONFIG_ENABLE_UPDATE_FIRMWARE_WITH_SUPPORT_I2C_SPEED_400K + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + // Set PCE high + RegSetLByteValue(0x1618, 0x40); + + if (eEmemType == EMEM_MAIN) + { + // Set start address and end address for main block + RegSet16BitValue(0x1600, 0x0000); + RegSet16BitValue(0x1640, 0xBFF8); + } + else if (eEmemType == EMEM_INFO) + { + // Set start address and end address for info block + RegSet16BitValue(0x1600, 0xC000); + RegSet16BitValue(0x1640, 0xC1F8); + } + + // CRC reset + RegSet16BitValue(0x164E, 0x0001); + + RegSet16BitValue(0x164E, 0x0000); + + // Trigger CRC check + RegSetLByteValue(0x160E, 0x20); + mdelay(10); + + nCrcDown = RegGet16BitValue(0x164E); + + while (nCrcDown != 2) + { + DBG("Wait CRC down\n"); + mdelay(10); + nCrcDown = RegGet16BitValue(0x164E); + } + + nRetVal = RegGet16BitValue(0x1652); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x1650); + + DBG("Hardware CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static void _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(u8 szTwoDimenFwData[][1024], u8* pOneDimenFwData) +{ + u32 i, j; + + DBG("*** %s() ***\n", __func__); + + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + for (j = 0; j < 1024; j ++) + { + pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j]; + } + } + else // i == 48 + { + for (j = 0; j < 512; j ++) + { + pOneDimenFwData[i*1024+j] = szTwoDimenFwData[i][j]; + } + } + } +} + +static s32 _DrvFwCtrlParsePacket(u8 *pPacket, u16 nLength, TouchInfo_t *pInfo) +{ + u8 nCheckSum = 0; + u32 nDeltaX = 0, nDeltaY = 0; + u32 nX = 0; + u32 nY = 0; +#ifdef CONFIG_SWAP_X_Y + u32 nTempX; + u32 nTempY; +#endif + u8 nCheckSumIndex = nLength-1; //Set default checksum index for demo mode + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE + if (g_IsEnableReportRate == 1) + { + if (g_InterruptCount == 4294967296) + { + g_InterruptCount = 0; // Reset count if overflow + DBG("g_InterruptCount reset to 0\n"); + } + + if (g_InterruptCount == 0) + { + // Get start time + do_gettimeofday(&g_StartTime); + + DBG("Start time : %lu sec, %lu msec\n", g_StartTime.tv_sec, g_StartTime.tv_usec); + } + + g_InterruptCount ++; + + DBG("g_InterruptCount = %d\n", g_InterruptCount); + } +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + nCheckSumIndex = 7; + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE || g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) + { + nCheckSumIndex = 31; + } + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + nCheckSumIndex = nLength-1; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + } //IS_FIRMWARE_DATA_LOG_ENABLED + + nCheckSum = DrvCommonCalculateCheckSum(&pPacket[0], nCheckSumIndex); + DBG("check sum : [%x] == [%x]? \n", pPacket[nCheckSumIndex], nCheckSum); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + u8 nWakeupMode = 0; + u8 bIsCorrectFormat = 0; + + DBG("received raw data from touch panel as following:\n"); + DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x pPacket[5]=%x \n", \ + pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5]); + + if (g_ChipType == CHIP_TYPE_MSG22XX && pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x06 && pPacket[3] == PACKET_TYPE_GESTURE_WAKEUP) + { + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + } +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + else if (g_ChipType == CHIP_TYPE_MSG22XX && pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x80 && pPacket[3] == PACKET_TYPE_GESTURE_DEBUG) + { + u32 a = 0; + + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + + for (a = 0; a < 0x80; a ++) + { + g_LogGestureDebug[a] = pPacket[a]; + } + + if (!(pPacket[5] >> 7))// LCM Light Flag = 0 + { + nWakeupMode = 0xFE; + DBG("gesture debug mode LCM flag = 0\n"); + } + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + else if (g_ChipType == CHIP_TYPE_MSG22XX && pPacket[0] == 0xA7 && pPacket[1] == 0x00 && pPacket[2] == 0x80 && pPacket[3] == PACKET_TYPE_GESTURE_INFORMATION) + { + u32 a = 0; + u32 nTmpCount = 0; + + nWakeupMode = pPacket[4]; + bIsCorrectFormat = 1; + + for (a = 0; a < 6; a ++)//header + { + g_LogGestureInfor[nTmpCount] = pPacket[a]; + nTmpCount++; + } + + for (a = 6; a < 126; a = a+3)//parse packet to coordinate + { + u32 nTranX = 0; + u32 nTranY = 0; + + _DrvFwCtrlCoordinate(&pPacket[a], &nTranX, &nTranY); + g_LogGestureInfor[nTmpCount] = nTranX; + nTmpCount++; + g_LogGestureInfor[nTmpCount] = nTranY; + nTmpCount++; + } + + g_LogGestureInfor[nTmpCount] = pPacket[126]; //Dummy + nTmpCount++; + g_LogGestureInfor[nTmpCount] = pPacket[127]; //checksum + nTmpCount++; + DBG("gesture information mode Count = %d\n", nTmpCount); + } +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + else if (g_ChipType == CHIP_TYPE_MSG21XXA && pPacket[0] == 0x52 && pPacket[1] == 0xFF && pPacket[2] == 0xFF && pPacket[3] == 0xFF && pPacket[4] == 0xFF && pPacket[6] == 0xFF) + { + nWakeupMode = pPacket[5]; + bIsCorrectFormat = 1; + } + + if (bIsCorrectFormat) + { + DBG("nWakeupMode = 0x%x\n", nWakeupMode); + + switch (nWakeupMode) + { + + + case 0x58: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_DOUBLE_CLICK_FLAG; + + DBG("Light up screen by DOUBLE_CLICK gesture wakeup.\n"); + + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x60: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_UP_DIRECT_FLAG; + + DBG("Light up screen by UP_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_UP, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_UP, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x61: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_DOWN_DIRECT_FLAG; + + DBG("Light up screen by DOWN_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_DOWN, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_DOWN, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x62: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_LEFT_DIRECT_FLAG; + + DBG("Light up screen by LEFT_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_LEFT, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_LEFT, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x63: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RIGHT_DIRECT_FLAG; + + DBG("Light up screen by RIGHT_DIRECT gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_RIGHT, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_RIGHT, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x64: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_m_CHARACTER_FLAG; + + DBG("Light up screen by m_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_M, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_M, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x65: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_W_CHARACTER_FLAG; + + DBG("Light up screen by W_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_W, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_W, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x66: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_C_CHARACTER_FLAG; + + DBG("Light up screen by C_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_C, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_C, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x67: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_e_CHARACTER_FLAG; + + DBG("Light up screen by e_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_E, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_E, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x68: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_V_CHARACTER_FLAG; + + DBG("Light up screen by V_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_V, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_V, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x69: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_O_CHARACTER_FLAG; + + DBG("Light up screen by O_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_O, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_O, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6A: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_S_CHARACTER_FLAG; + + DBG("Light up screen by S_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_S, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_S, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6B: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_Z_CHARACTER_FLAG; + + DBG("Light up screen by Z_CHARACTER gesture wakeup.\n"); + +// input_report_key(g_InputDevice, KEY_Z, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, KEY_Z, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6C: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE1_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE1_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER1, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER1, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6D: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE2_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE2_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER2, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER2, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x6E: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE3_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE3_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER3, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER3, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + case 0x6F: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE4_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE4_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER4, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER4, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x70: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE5_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE5_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER5, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER5, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x71: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE6_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE6_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER6, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER6, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x72: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE7_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE7_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER7, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER7, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x73: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE8_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE8_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER8, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER8, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x74: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE9_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE9_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER9, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER9, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x75: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE10_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE10_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER10, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER10, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x76: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE11_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE11_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER11, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER11, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x77: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE12_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE12_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER12, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER12, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x78: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE13_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE13_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER13, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER13, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x79: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE14_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE14_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER14, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER14, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7A: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE15_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE15_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER15, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER15, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7B: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE16_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE16_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER16, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER16, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7C: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE17_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE17_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER17, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER17, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7D: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE18_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE18_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER18, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER18, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7E: + _gGestureWakeupValue[0] = GESTURE_WAKEUP_MODE_RESERVE19_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE19_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER19, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER19, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x7F: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE20_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE20_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER20, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER20, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x80: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE21_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE21_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER21, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER21, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x81: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE22_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE22_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER22, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER22, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x82: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE23_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE23_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER23, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER23, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x83: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE24_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE24_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER24, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER24, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x84: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE25_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE25_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER25, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER25, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x85: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE26_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE26_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER26, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER26, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x86: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE27_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE27_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER27, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER27, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x87: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE28_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE28_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER28, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER28, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x88: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE29_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE29_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER29, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER29, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x89: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE30_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE30_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER30, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER30, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8A: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE31_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE31_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER31, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER31, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8B: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE32_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE32_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER32, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER32, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8C: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE33_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE33_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER33, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER33, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8D: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE34_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE34_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER34, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER34, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8E: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE35_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE35_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER35, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER35, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x8F: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE36_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE36_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER36, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER36, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x90: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE37_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE37_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER37, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER37, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x91: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE38_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE38_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER38, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER38, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x92: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE39_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE39_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER39, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER39, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x93: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE40_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE40_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER40, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER40, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x94: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE41_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE41_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER41, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER41, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x95: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE42_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE42_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER42, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER42, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x96: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE43_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE43_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER43, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER43, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x97: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE44_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE44_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER44, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER44, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x98: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE45_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE45_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER45, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER45, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x99: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE46_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE46_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER46, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER46, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9A: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE47_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE47_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER47, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER47, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9B: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE48_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE48_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER48, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER48, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9C: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE49_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE49_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER49, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER49, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9D: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE50_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE50_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER50, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER50, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; + case 0x9E: + _gGestureWakeupValue[1] = GESTURE_WAKEUP_MODE_RESERVE51_FLAG; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_RESERVE51_FLAG gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER51, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER51, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + case 0xFF://Gesture Fail + _gGestureWakeupValue[1] = 0xFF; + + DBG("Light up screen by GESTURE_WAKEUP_MODE_FAIL gesture wakeup.\n"); + +// input_report_key(g_InputDevice, RESERVER51, 1); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); +// input_report_key(g_InputDevice, RESERVER51, 0); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice); + break; +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + default: + _gGestureWakeupValue[0] = 0; + _gGestureWakeupValue[1] = 0; + DBG("Un-supported gesture wakeup mode. Please check your device driver code.\n"); + break; + } + + DBG("_gGestureWakeupValue[0] = 0x%x\n", _gGestureWakeupValue[0]); + DBG("_gGestureWakeupValue[1] = 0x%x\n", _gGestureWakeupValue[1]); + } + else + { + /*DBG("gesture wakeup fail1111111111111.\n"); + input_report_key(g_InputDevice, KEY_POWER, 1); + input_sync(g_InputDevice); + input_report_key(g_InputDevice, KEY_POWER, 0); + input_sync(g_InputDevice);*/ + DBG("gesture wakeup packet format is incorrect.\n"); + } + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + // Notify android application to retrieve log data mode packet from device driver by sysfs. + if (g_GestureKObj != NULL && pPacket[3] == PACKET_TYPE_GESTURE_DEBUG) + { + char *pEnvp[2]; + s32 nRetVal = 0; + + pEnvp[0] = "STATUS=GET_GESTURE_DEBUG"; + pEnvp[1] = NULL; + + nRetVal = kobject_uevent_env(g_GestureKObj, KOBJ_CHANGE, pEnvp); + DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal); + + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + + return -1; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + DBG("received raw data from touch panel as following:\n"); + DBG("pPacket[0]=%x \n pPacket[1]=%x pPacket[2]=%x pPacket[3]=%x pPacket[4]=%x \n pPacket[5]=%x pPacket[6]=%x pPacket[7]=%x \n", \ + pPacket[0], pPacket[1], pPacket[2], pPacket[3], pPacket[4], pPacket[5], pPacket[6], pPacket[7]); + + if ((pPacket[nCheckSumIndex] == nCheckSum) && (pPacket[0] == 0x52)) // check the checksum of packet + { + nX = (((pPacket[1] & 0xF0) << 4) | pPacket[2]); // parse the packet to coordinate + nY = (((pPacket[1] & 0x0F) << 8) | pPacket[3]); + + nDeltaX = (((pPacket[4] & 0xF0) << 4) | pPacket[5]); + nDeltaY = (((pPacket[4] & 0x0F) << 8) | pPacket[6]); + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("[delta_x,delta_y]=[%d,%d]\n", nDeltaX, nDeltaY); + +#ifdef CONFIG_SWAP_X_Y + nTempY = nX; + nTempX = nY; + nX = nTempX; + nY = nTempY; + + nTempY = nDeltaX; + nTempX = nDeltaY; + nDeltaX = nTempX; + nDeltaY = nTempY; +#endif + +#ifdef CONFIG_REVERSE_X + nX = 2047 - nX; + nDeltaX = 4095 - nDeltaX; +#endif + +#ifdef CONFIG_REVERSE_Y + nY = 2047 - nY; + nDeltaY = 4095 - nDeltaY; +#endif + + /* + * pPacket[0]:id, pPacket[1]~pPacket[3]:the first point abs, pPacket[4]~pPacket[6]:the relative distance between the first point abs and the second point abs + * when pPacket[1]~pPacket[4], pPacket[6] is 0xFF, keyevent, pPacket[5] to judge which key press. + * pPacket[1]~pPacket[6] all are 0xFF, release touch + */ + if ((pPacket[1] == 0xFF) && (pPacket[2] == 0xFF) && (pPacket[3] == 0xFF) && (pPacket[4] == 0xFF) && (pPacket[6] == 0xFF)) + { + pInfo->tPoint[0].nX = 0; // final X coordinate + pInfo->tPoint[0].nY = 0; // final Y coordinate + + if ((pPacket[5] != 0x00) && (pPacket[5] != 0xFF)) /* pPacket[5] is key value */ + { /* 0x00 is key up, 0xff is touch screen up */ +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + DBG("g_EnableTpProximity = %d, pPacket[5] = 0x%x\n", g_EnableTpProximity, pPacket[5]); + + if (g_EnableTpProximity && ((pPacket[5] == 0x80) || (pPacket[5] == 0x40))) + { + if (pPacket[5] == 0x80) // close to + { + g_FaceClosingTp = 1; + } + else if (pPacket[5] == 0x40) // far away + { + g_FaceClosingTp = 0; + } + + DBG("g_FaceClosingTp = %d\n", g_FaceClosingTp); + + return -1; + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_EnableTpProximity && ((pPacket[5] == 0x80) || (pPacket[5] == 0x40))) + { + int nErr; + hwm_sensor_data tSensorData; + + if (pPacket[5] == 0x80) // close to + { + g_FaceClosingTp = 0; + } + else if (pPacket[5] == 0x40) // far away + { + g_FaceClosingTp = 1; + } + + DBG("g_FaceClosingTp = %d\n", g_FaceClosingTp); + + // map and store data to hwm_sensor_data + tSensorData.values[0] = DrvPlatformLyrGetTpPsData(); + tSensorData.value_divide = 1; + tSensorData.status = SENSOR_STATUS_ACCURACY_MEDIUM; + // let up layer to know + if ((nErr = hwmsen_get_interrupt_data(ID_PROXIMITY, &tSensorData))) + { + DBG("call hwmsen_get_interrupt_data() failed = %d\n", nErr); + } + + return -1; + } +#endif +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + + /* 0x00 is key up, 0xff is touch screen up */ + DBG("touch key down pPacket[5]=%d\n", pPacket[5]); + + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = pPacket[5]; + pInfo->nTouchKeyMode = 1; + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + + if (pPacket[5] == 4) // TOUCH_KEY_HOME + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[1][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[1][1]; + } + else if (pPacket[5] == 1) // TOUCH_KEY_MENU + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[0][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[0][1]; + } + else if (pPacket[5] == 2) // TOUCH_KEY_BACK + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[2][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[2][1]; + } + else if (pPacket[5] == 8) // TOUCH_KEY_SEARCH + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[3][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[3][1]; + } + else + { + DBG("multi-key is pressed.\n"); + + return -1; + } +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + } + else + { /* key up or touch up */ + DBG("touch end\n"); + pInfo->nFingerNum = 0; //touch end + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + } + } + else + { + pInfo->nTouchKeyMode = 0; //Touch on screen... + +// if ((nDeltaX == 0) && (nDeltaY == 0)) + if ( +#ifdef CONFIG_REVERSE_X + (nDeltaX == 4095) +#else + (nDeltaX == 0) +#endif + && +#ifdef CONFIG_REVERSE_Y + (nDeltaY == 4095) +#else + (nDeltaY == 0) +#endif + ) + { /* one touch point */ + pInfo->nFingerNum = 1; // one touch + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY); + DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + } + else + { /* two touch points */ + u32 nX2, nY2; + + pInfo->nFingerNum = 2; // two touch + /* Finger 1 */ + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point1[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + /* Finger 2 */ + if (nDeltaX > 2048) // transform the unsigned value to signed value + { + nDeltaX -= 4096; + } + + if (nDeltaY > 2048) + { + nDeltaY -= 4096; + } + + nX2 = (u32)(nX + nDeltaX); + nY2 = (u32)(nY + nDeltaY); + + pInfo->tPoint[1].nX = (nX2 * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[1].nY = (nY2 * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point2[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[1].nX, pInfo->tPoint[1].nY); + } + } + } + else if (pPacket[nCheckSumIndex] == nCheckSum && pPacket[0] == 0x62) + { + nX = ((pPacket[1] << 8) | pPacket[2]); // Position_X + nY = ((pPacket[3] << 8) | pPacket[4]); // Position_Y + + nDeltaX = ((pPacket[13] << 8) | pPacket[14]); // Distance_X + nDeltaY = ((pPacket[15] << 8) | pPacket[16]); // Distance_Y + + DBG("[x,y]=[%d,%d]\n", nX, nY); + DBG("[delta_x,delta_y]=[%d,%d]\n", nDeltaX, nDeltaY); + +#ifdef CONFIG_SWAP_X_Y + nTempY = nX; + nTempX = nY; + nX = nTempX; + nY = nTempY; + + nTempY = nDeltaX; + nTempX = nDeltaY; + nDeltaX = nTempX; + nDeltaY = nTempY; +#endif + +#ifdef CONFIG_REVERSE_X + nX = 2047 - nX; + nDeltaX = 4095 - nDeltaX; +#endif + +#ifdef CONFIG_REVERSE_Y + nY = 2047 - nY; + nDeltaY = 4095 - nDeltaY; +#endif + + /* + * pPacket[0]:id, pPacket[1]~pPacket[4]:the first point abs, pPacket[13]~pPacket[16]:the relative distance between the first point abs and the second point abs + * when pPacket[1]~pPacket[7] is 0xFF, keyevent, pPacket[8] to judge which key press. + * pPacket[1]~pPacket[8] all are 0xFF, release touch + */ + if ((pPacket[1] == 0xFF) && (pPacket[2] == 0xFF) && (pPacket[3] == 0xFF) && (pPacket[4] == 0xFF) && (pPacket[5] == 0xFF) && (pPacket[6] == 0xFF) && (pPacket[7] == 0xFF)) + { + pInfo->tPoint[0].nX = 0; // final X coordinate + pInfo->tPoint[0].nY = 0; // final Y coordinate + + if ((pPacket[8] != 0x00) && (pPacket[8] != 0xFF)) /* pPacket[8] is key value */ + { /* 0x00 is key up, 0xff is touch screen up */ + DBG("touch key down pPacket[8]=%d\n", pPacket[8]); + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = pPacket[8]; + pInfo->nTouchKeyMode = 1; + +#ifdef CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + pInfo->nFingerNum = 1; + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + + if (pPacket[8] == 4) // TOUCH_KEY_HOME + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[1][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[1][1]; + } + else if (pPacket[8] == 1) // TOUCH_KEY_MENU + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[0][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[0][1]; + } + else if (pPacket[8] == 2) // TOUCH_KEY_BACK + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[2][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[2][1]; + } + else if (pPacket[8] == 8) // TOUCH_KEY_SEARCH + { + pInfo->tPoint[0].nX = g_TpVirtualKeyDimLocal[3][0]; + pInfo->tPoint[0].nY = g_TpVirtualKeyDimLocal[3][1]; + } + else + { + DBG("multi-key is pressed.\n"); + + return -1; + } +#endif //CONFIG_ENABLE_REPORT_KEY_WITH_COORDINATE + } + else + { /* key up or touch up */ + DBG("touch end\n"); + pInfo->nFingerNum = 0; //touch end + pInfo->nTouchKeyCode = 0; + pInfo->nTouchKeyMode = 0; + } + } + else + { + pInfo->nTouchKeyMode = 0; //Touch on screen... + +// if ((nDeltaX == 0) && (nDeltaY == 0)) + if ( +#ifdef CONFIG_REVERSE_X + (nDeltaX == 4095) +#else + (nDeltaX == 0) +#endif + && +#ifdef CONFIG_REVERSE_Y + (nDeltaY == 4095) +#else + (nDeltaY == 0) +#endif + ) + { /* one touch point */ + pInfo->nFingerNum = 1; // one touch + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY); + DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + } + else + { /* two touch points */ + u32 nX2, nY2; + + pInfo->nFingerNum = 2; // two touch + /* Finger 1 */ + pInfo->tPoint[0].nX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[0].nY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point1[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[0].nX, pInfo->tPoint[0].nY); + /* Finger 2 */ + if (nDeltaX > 2048) // transform the unsigned value to signed value + { + nDeltaX -= 4096; + } + + if (nDeltaY > 2048) + { + nDeltaY -= 4096; + } + + nX2 = (u32)(nX + nDeltaX); + nY2 = (u32)(nY + nDeltaY); + + pInfo->tPoint[1].nX = (nX2 * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + pInfo->tPoint[1].nY = (nY2 * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: point2[x,y]=[%d,%d]\n", __func__, pInfo->tPoint[1].nX, pInfo->tPoint[1].nY); + } + + // Notify android application to retrieve log data mode packet from device driver by sysfs. + if (g_TouchKObj != NULL) + { + char *pEnvp[2]; + s32 nRetVal = 0; + + pEnvp[0] = "STATUS=GET_PACKET"; + pEnvp[1] = NULL; + + nRetVal = kobject_uevent_env(g_TouchKObj, KOBJ_CHANGE, pEnvp); + DBG("kobject_uevent_env() nRetVal = %d\n", nRetVal); + } + } + } + else + { + DBG("pPacket[0]=0x%x, pPacket[7]=0x%x, nCheckSum=0x%x\n", pPacket[0], pPacket[7], nCheckSum); + + if (pPacket[nCheckSumIndex] != nCheckSum) + { + DBG("WRONG CHECKSUM\n"); + return -1; + } + + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE && pPacket[0] != 0x52) + { + DBG("WRONG DEMO MODE HEADER\n"); + return -1; + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && pPacket[0] != 0x62) + { + DBG("WRONG DEBUG MODE HEADER\n"); + return -1; + } + else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE && pPacket[0] != 0x62) + { + DBG("WRONG RAW DATA MODE HEADER\n"); + return -1; + } + } + + return 0; +} + +static void _DrvFwCtrlStoreFirmwareData(u8 *pBuf, u32 nSize) +{ + u32 nCount = nSize / 1024; + u32 nRemainder = nSize % 1024; + u32 i; + + DBG("*** %s() ***\n", __func__); + + if (nCount > 0) // nSize >= 1024 + { + for (i = 0; i < nCount; i ++) + { + memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), 1024); + + g_FwDataCount ++; + } + + if (nRemainder > 0) // Handle special firmware size like MSG22XX(48.5KB) + { + DBG("nRemainder = %d\n", nRemainder); + + memcpy(g_FwData[g_FwDataCount], pBuf+(i*1024), nRemainder); + + g_FwDataCount ++; + } + } + else // nSize < 1024 + { + if (nSize > 0) + { + memcpy(g_FwData[g_FwDataCount], pBuf, nSize); + + g_FwDataCount ++; + } + } + + DBG("*** g_FwDataCount = %d ***\n", g_FwDataCount); + + if (pBuf != NULL) + { + DBG("*** buf[0] = %c ***\n", pBuf[0]); + } +} + +static u16 _DrvFwCtrlMsg21xxaGetSwId(EmemType_e eEmemType) +{ + u16 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + szDbBusTxData[0] = 0x72; + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0x55; + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + szDbBusTxData[1] = 0x83; + szDbBusTxData[2] = 0x00; + } + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + DBG("szDbBusRxData[0,1,2,3] = 0x%x,0x%x,0x%x,0x%x\n", szDbBusRxData[0], szDbBusRxData[1], szDbBusRxData[2], szDbBusRxData[3]); + + if ((szDbBusRxData[0] >= 0x30 && szDbBusRxData[0] <= 0x39) + &&(szDbBusRxData[1] >= 0x30 && szDbBusRxData[1] <= 0x39) + &&(szDbBusRxData[2] >= 0x31 && szDbBusRxData[2] <= 0x39)) + { + nRetVal = (szDbBusRxData[0]-0x30)*100+(szDbBusRxData[1]-0x30)*10+(szDbBusRxData[2]-0x30); + } + + DBG("SW ID = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u16 _DrvFwCtrlMsg22xxGetSwId(EmemType_e eEmemType) +{ + u16 nRetVal = 0; + u16 nRegData1 = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + if (eEmemType == EMEM_MAIN) // Read SW ID from main block + { + RegSet16BitValue(0x1600, 0xBFF4); // Set start address for main block SW ID + } + else if (eEmemType == EMEM_INFO) // Read SW ID from info block + { + RegSet16BitValue(0x1600, 0xC1EC); // Set start address for info block SW ID + } + + /* + Ex. SW ID in Main Block : + Major low byte at address 0xBFF4 + Major high byte at address 0xBFF5 + + SW ID in Info Block : + Major low byte at address 0xC1EC + Major high byte at address 0xC1ED + */ + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); +// nRegData2 = RegGet16BitValue(0x1606); + + nRetVal = ((nRegData1 >> 8) & 0xFF) << 8; + nRetVal |= (nRegData1 & 0xFF); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DBG("SW ID = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +u32 DrvFwCtrlReadDQMemValue(u16 nAddr) +{ + // TODO : not support yet + + return 0; +} + +void DrvFwCtrlWriteDQMemValue(u16 nAddr, u32 nData) +{ + // TODO : not support yet +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//-------------------------Start of SW ID for MSG22XX----------------------------// + +static u32 _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EmemType_e eEmemType) +{ + u32 nRetVal = 0; + u16 nRegData1 = 0, nRegData2 = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + if (eEmemType == EMEM_MAIN) // Read main block CRC(48KB-4) from main block + { + RegSet16BitValue(0x1600, 0xBFFC); // Set start address for main block CRC + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(512Byte-4) from info block + { + RegSet16BitValue(0x1600, 0xC1FC); // Set start address for info block CRC + } + + // Enable burst mode + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + nRetVal = ((nRegData2 >> 8) & 0xFF) << 24; + nRetVal |= (nRegData2 & 0xFF) << 16; + nRetVal |= ((nRegData1 >> 8) & 0xFF) << 8; + nRetVal |= (nRegData1 & 0xFF); + + DBG("CRC = 0x%x\n", nRetVal); + + // Clear burst mode + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(u8 szTmpBuf[], EmemType_e eEmemType) +{ + u32 nRetVal = 0; + + DBG("*** %s() eEmemType = %d ***\n", __func__, eEmemType); + + if (szTmpBuf != NULL) + { + if (eEmemType == EMEM_MAIN) // Read main block CRC(48KB-4) from bin file + { + nRetVal = szTmpBuf[0xBFFF] << 24; + nRetVal |= szTmpBuf[0xBFFE] << 16; + nRetVal |= szTmpBuf[0xBFFD] << 8; + nRetVal |= szTmpBuf[0xBFFC]; + } + else if (eEmemType == EMEM_INFO) // Read info block CRC(512Byte-4) from bin file + { + nRetVal = szTmpBuf[0xC1FF] << 24; + nRetVal |= szTmpBuf[0xC1FE] << 16; + nRetVal |= szTmpBuf[0xC1FD] << 8; + nRetVal |= szTmpBuf[0xC1FC]; + } + } + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg22xxUpdateFirmwareBySwId(void) +{ + s32 nRetVal = -1; + u32 nCrcInfoA = 0, nCrcInfoB = 0, nCrcMainA = 0, nCrcMainB = 0; + + DBG("*** %s() ***\n", __func__); + + DBG("_gIsUpdateInfoBlockFirst = %d, g_IsUpdateFirmware = 0x%x\n", _gIsUpdateInfoBlockFirst, g_IsUpdateFirmware); + + _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(g_FwData, _gOneDimenFwData); + + if (_gIsUpdateInfoBlockFirst == 1) + { + if ((g_IsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA = 0x%x, nCrcInfoB = 0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA = 0x%x, nCrcMainB = 0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else if ((g_IsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + } + else //_gIsUpdateInfoBlockFirst == 0 + { + if ((g_IsUpdateFirmware & 0x10) == 0x10) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_MAIN); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_MAIN); + + nCrcMainA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + else + { + g_IsUpdateFirmware = 0x11; + } + } + else if ((g_IsUpdateFirmware & 0x01) == 0x01) + { + _DrvFwCtrlMsg22xxEraseEmem(EMEM_INFO); + _DrvFwCtrlMsg22xxProgramEmem(EMEM_INFO); + + nCrcInfoA = _DrvFwCtrlMsg22xxRetrieveFrimwareCrcFromBinFile(_gOneDimenFwData, EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfoA=0x%x, nCrcInfoB=0x%x\n", nCrcInfoA, nCrcInfoB); + + if (nCrcInfoA == nCrcInfoB) + { + g_IsUpdateFirmware = 0x00; + nRetVal = 0; + } + else + { + g_IsUpdateFirmware = 0x01; + } + } + } + + return nRetVal; +} + +void _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId(void) +{ + u32 nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB; + u32 i; + u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0; + u16 nMajor = 0, nMinor = 0; + u8 *pVersion = NULL; + Msg22xxSwId_e eSwId = MSG22XX_SW_ID_UNDEFINED; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrDisableFingerTouchReport(); + + nCrcMainA = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + nCrcMainB = _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EMEM_MAIN); + + nCrcInfoA = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + nCrcInfoB = _DrvFwCtrlMsg22xxRetrieveFirmwareCrcFromEFlash(EMEM_INFO); + + _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id"); + INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork); + + DBG("nCrcMainA=0x%x, nCrcInfoA=0x%x, nCrcMainB=0x%x, nCrcInfoB=0x%x\n", nCrcMainA, nCrcInfoA, nCrcMainB, nCrcInfoB); + + if (nCrcMainA == nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 1. Main Block:OK, Info Block:OK + { + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN); + + if (eSwId == MSG22XX_SW_ID_XXXX) + { + nUpdateBinMajor = msg22xx_xxxx_update_bin[0xBFF5]<<8 | msg22xx_xxxx_update_bin[0xBFF4]; + nUpdateBinMinor = msg22xx_xxxx_update_bin[0xBFF7]<<8 | msg22xx_xxxx_update_bin[0xBFF6]; + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + nUpdateBinMajor = msg22xx_yyyy_update_bin[0xBFF5]<<8 | msg22xx_yyyy_update_bin[0xBFF4]; + nUpdateBinMinor = msg22xx_yyyy_update_bin[0xBFF7]<<8 | msg22xx_yyyy_update_bin[0xBFF6]; + } + else //eSwId == MSG22XX_SW_ID_UNDEFINED + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG22XX_SW_ID_UNDEFINED; + nUpdateBinMajor = 0; + nUpdateBinMinor = 0; + } + + DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion); + + DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor); + + if (nUpdateBinMinor > nMinor) + { + if (eSwId == MSG22XX_SW_ID_XXXX) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_xxxx_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_xxxx_update_bin[i*1024]), 512); + } + } + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_yyyy_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_yyyy_update_bin[i*1024]), 512); + } + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG22XX_SW_ID_UNDEFINED; + } + + if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else if (nCrcMainA == nCrcMainB && nCrcInfoA != nCrcInfoB) // Case 2. Main Block:OK, Info Block:FAIL + { + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG22XX_SW_ID_XXXX) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_xxxx_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_xxxx_update_bin[i*1024]), 512); + } + } + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_yyyy_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_yyyy_update_bin[i*1024]), 512); + } + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG22XX_SW_ID_UNDEFINED; + } + + if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 1; // Set 1 for indicating main block is complete + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else if (nCrcMainA != nCrcMainB && nCrcInfoA == nCrcInfoB) // Case 3. Main Block:FAIL, Info Block:OK + { + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_INFO); + + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG22XX_SW_ID_XXXX) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_xxxx_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_xxxx_update_bin[i*1024]), 512); + } + } + } + else if (eSwId == MSG22XX_SW_ID_YYYY) + { + for (i = 0; i < (MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE+1); i ++) + { + if (i < MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE) // i < 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_yyyy_update_bin[i*1024]), 1024); + } + else // i == 48 + { + _DrvFwCtrlStoreFirmwareData(&(msg22xx_yyyy_update_bin[i*1024]), 512); + } + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG22XX_SW_ID_UNDEFINED; + } + + if (eSwId < MSG22XX_SW_ID_UNDEFINED && eSwId != 0x0000 && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + _gIsUpdateInfoBlockFirst = 0; // Set 0 for indicating main block is broken + g_IsUpdateFirmware = 0x11; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else // Case 4. Main Block:FAIL, Info Block:FAIL + { + DBG("Main block and Info block are broken.\n"); + DBG("Go to normal boot up process.\n"); + } + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); +} + +//-------------------------End of SW ID for MSG22XX----------------------------// + +//-------------------------Start of SW ID for MSG21XXA----------------------------// + +static u32 _DrvFwCtrlMsg21xxaCalculateMainCrcFromEFlash(void) +{ + u32 nRetVal = 0; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop Watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xDF4C); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 +// DBG("*** reg(0x3C, 0xE4) = 0x%x ***\n", nRegData); // add for debug + + } while (nRegData != 0x9432); + + // Read calculated main block CRC from register + nRetVal = RegGet16BitValue(0x3C80); + nRetVal = (nRetVal << 16) | RegGet16BitValue(0x3C82); + + DBG("Main Block CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static u32 _DrvFwCtrlMsg21xxaRetrieveMainCrcFromMainBlock(void) +{ + u32 nRetVal = 0; + u16 nRegData = 0; + u8 szDbBusTxData[5] = {0}; + u8 szDbBusRxData[4] = {0}; + + DBG("*** %s() ***\n", __func__); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + // cmd + RegSet16BitValue(0x3CE4, 0xA4AB); //bank:reg_PIU_MISC_0, addr:h0072 + + // TP SW reset + RegSet16BitValue(0x1E04, 0x7d60); //bank:chip, addr:h0002 + RegSet16BitValue(0x1E04, 0x829F); + + // Start mcu + RegSetLByteValue(0x0FE6, 0x00); //bank:mheg5, addr:h0073 + + mdelay(100); + + // Polling 0x3CE4 is 0x5B58 + do + { + nRegData = RegGet16BitValue(0x3CE4); //bank:reg_PIU_MISC_0, addr:h0072 + } while (nRegData != 0x5B58); + + // Read main block CRC from main block + szDbBusTxData[0] = 0x72; + szDbBusTxData[1] = 0x7F; + szDbBusTxData[2] = 0xFC; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x04; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + nRetVal = szDbBusRxData[0]; + nRetVal = (nRetVal << 8) | szDbBusRxData[1]; + nRetVal = (nRetVal << 8) | szDbBusRxData[2]; + nRetVal = (nRetVal << 8) | szDbBusRxData[3]; + + DBG("CRC = 0x%x\n", nRetVal); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nRetVal; +} + +static s32 _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 i, j, nCalculateCrcSize; + u32 nCrcMain = 0, nCrcMainTp = 0; + u32 nCrcInfo = 0, nCrcInfoTp = 0; + u32 nCrcTemp = 0; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // erase main + _DrvFwCtrlEraseEmemC33(EMEM_MAIN); + mdelay(1000); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + ///////////////////////// + // Program + ///////////////////////// + + // Polling 0x3CE4 is 0x1C70 + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x1C70); + } + + switch (eEmemType) + { + case EMEM_ALL: + RegSet16BitValue(0x3CE4, 0xE38F); // for all blocks + break; + case EMEM_MAIN: + RegSet16BitValue(0x3CE4, 0x7731); // for main block + break; + case EMEM_INFO: + RegSet16BitValue(0x3CE4, 0x7731); // for info block + + RegSetLByteValue(0x0FE6, 0x01); + + RegSetLByteValue(0x3CE4, 0xC5); + RegSetLByteValue(0x3CE5, 0x78); + + RegSetLByteValue(0x1E04, 0x9F); + RegSetLByteValue(0x1E05, 0x82); + + RegSetLByteValue(0x0FE6, 0x00); + mdelay(100); + break; + } + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Calculate CRC 32 + DrvCommonCrcInitTable(); + + if (eEmemType == EMEM_ALL) + { + nCalculateCrcSize = MSG21XXA_FIRMWARE_WHOLE_SIZE; + } + else if (eEmemType == EMEM_MAIN) + { + nCalculateCrcSize = MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; + } + else if (eEmemType == EMEM_INFO) + { + nCalculateCrcSize = MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE; + } + else + { + nCalculateCrcSize = 0; + } + + for (i = 0; i < nCalculateCrcSize; i ++) + { + if (eEmemType == EMEM_INFO) + { + i = 32; + } + + if (i < 32) // emem_main + { + if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + + nCrcTemp = nCrcMain; + nCrcTemp = nCrcTemp ^ 0xffffffff; + + DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug + + for (j = 0; j < 4; j ++) + { + szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF); + + DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug + DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + } + else // emem_info + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo); + } + + if (eEmemType == EMEM_MAIN) + { + break; + } + } + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + RegSet16BitValue(0x3CE4, 0x2F43); + } + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // write file done and check crc + RegSet16BitValue(0x3CE4, 0x1380); + } + mdelay(10); + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + } + + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // CRC Main from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + } + + if (eEmemType == EMEM_ALL) + { + // CRC Info from TP + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + } + + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + if (nCrcMainTp != nCrcMain) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + if (eEmemType == EMEM_ALL) + { + if (nCrcInfoTp != nCrcInfo) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +void _DrvFwCtrlMsg21xxaCheckFirmwareUpdateBySwId(void) +{ + u32 nCrcMainA, nCrcMainB; + u32 i; + u16 nUpdateBinMajor = 0, nUpdateBinMinor = 0; + u16 nMajor = 0, nMinor = 0; + u8 nIsCompareVersion = 0; + u8 *pVersion = NULL; + Msg21xxaSwId_e eMainSwId = MSG21XXA_SW_ID_UNDEFINED, eInfoSwId = MSG21XXA_SW_ID_UNDEFINED, eSwId = MSG21XXA_SW_ID_UNDEFINED; + + DBG("*** %s() ***\n", __func__); + + DrvPlatformLyrDisableFingerTouchReport(); + + nCrcMainA = _DrvFwCtrlMsg21xxaCalculateMainCrcFromEFlash(); + nCrcMainB = _DrvFwCtrlMsg21xxaRetrieveMainCrcFromMainBlock(); + + _gUpdateFirmwareBySwIdWorkQueue = create_singlethread_workqueue("update_firmware_by_sw_id"); + INIT_WORK(&_gUpdateFirmwareBySwIdWork, _DrvFwCtrlUpdateFirmwareBySwIdDoWork); + + DBG("nCrcMainA=0x%x, nCrcMainB=0x%x\n", nCrcMainA, nCrcMainB); + + if (nCrcMainA == nCrcMainB) + { + eMainSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_MAIN); + eInfoSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_INFO); + + DBG("Check firmware integrity success\n"); + DBG("eMainSwId=0x%x, eInfoSwId=0x%x\n", eMainSwId, eInfoSwId); + + if (eMainSwId == eInfoSwId) + { + eSwId = eMainSwId; + nIsCompareVersion = 1; + } + else + { + eSwId = eInfoSwId; + nIsCompareVersion = 0; + } + + if (eSwId == MSG21XXA_SW_ID_XXXX) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg21xxa_xxxx_update_bin[31][0x34F]<<8 | msg21xxa_xxxx_update_bin[31][0x34E]; + nUpdateBinMinor = msg21xxa_xxxx_update_bin[31][0x351]<<8 | msg21xxa_xxxx_update_bin[31][0x350]; +#else // By one dimensional array + nUpdateBinMajor = msg21xxa_xxxx_update_bin[0x7F4F]<<8 | msg21xxa_xxxx_update_bin[0x7F4E]; + nUpdateBinMinor = msg21xxa_xxxx_update_bin[0x7F51]<<8 | msg21xxa_xxxx_update_bin[0x7F50]; +#endif + } + else if (eSwId == MSG21XXA_SW_ID_YYYY) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + nUpdateBinMajor = msg21xxa_yyyy_update_bin[31][0x34F]<<8 | msg21xxa_yyyy_update_bin[31][0x34E]; + nUpdateBinMinor = msg21xxa_yyyy_update_bin[31][0x351]<<8 | msg21xxa_yyyy_update_bin[31][0x350]; +#else // By one dimensional array + nUpdateBinMajor = msg21xxa_yyyy_update_bin[0x7F4F]<<8 | msg21xxa_yyyy_update_bin[0x7F4E]; + nUpdateBinMinor = msg21xxa_yyyy_update_bin[0x7F51]<<8 | msg21xxa_yyyy_update_bin[0x7F50]; +#endif + } + else //eSwId == MSG21XXA_SW_ID_UNDEFINED + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG21XXA_SW_ID_UNDEFINED; + nUpdateBinMajor = 0; + nUpdateBinMinor = 0; + } + + DrvFwCtrlGetCustomerFirmwareVersion(&nMajor, &nMinor, &pVersion); + + DBG("eSwId=0x%x, nMajor=%d, nMinor=%d, nUpdateBinMajor=%d, nUpdateBinMinor=%d\n", eSwId, nMajor, nMinor, nUpdateBinMajor, nUpdateBinMinor); + + if ((nUpdateBinMinor > nMinor && nIsCompareVersion == 1) || (nIsCompareVersion == 0)) + { + if (eSwId == MSG21XXA_SW_ID_XXXX) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg21xxa_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg21xxa_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG21XXA_SW_ID_YYYY) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg21xxa_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg21xxa_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG21XXA_SW_ID_UNDEFINED; + } + + if (eSwId < MSG21XXA_SW_ID_UNDEFINED && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + DBG("The update bin version is older than or equal to the current firmware version on e-flash.\n"); + DBG("Go to normal boot up process.\n"); + } + } + else + { + eSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_INFO); + + DBG("Check firmware integrity failed\n"); + DBG("eSwId=0x%x\n", eSwId); + + if (eSwId == MSG21XXA_SW_ID_XXXX) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg21xxa_xxxx_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg21xxa_xxxx_update_bin[i*1024]), 1024); +#endif + } + } + else if (eSwId == MSG21XXA_SW_ID_YYYY) + { + for (i = 0; i < MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE; i ++) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_TWO_DIMENSIONAL_ARRAY // By two dimensional array + _DrvFwCtrlStoreFirmwareData(msg21xxa_yyyy_update_bin[i], 1024); +#else // By one dimensional array + _DrvFwCtrlStoreFirmwareData(&(msg21xxa_yyyy_update_bin[i*1024]), 1024); +#endif + } + } + else + { + DBG("eSwId = 0x%x is an undefined SW ID.\n", eSwId); + + eSwId = MSG21XXA_SW_ID_UNDEFINED; + } + + if (eSwId < MSG21XXA_SW_ID_UNDEFINED && eSwId != 0xFFFF) + { + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after copying update firmware data to temp buffer + + _gUpdateRetryCount = UPDATE_FIRMWARE_RETRY_COUNT; + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + return; + } + else + { + DBG("The sw id is invalid.\n"); + DBG("Go to normal boot up process.\n"); + } + } + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); +} + +//-------------------------End of SW ID for MSG21XXA----------------------------// + +static void _DrvFwCtrlUpdateFirmwareBySwIdDoWork(struct work_struct *pWork) +{ + s32 nRetVal = 0; + + DBG("*** %s() _gUpdateRetryCount = %d ***\n", __func__, _gUpdateRetryCount); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nRetVal = _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(g_FwData, EMEM_MAIN); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvFwCtrlMsg22xxGetTpVendorCode(_gTpVendorCode); + + if (_gTpVendorCode[0] == 'C' && _gTpVendorCode[1] == 'N' && _gTpVendorCode[2] == 'T') // for specific TP vendor which store some important information in info block, only update firmware for main block, do not update firmware for info block. + { + nRetVal = _DrvFwCtrlMsg22xxUpdateFirmware(g_FwData, EMEM_MAIN); + } + else + { + nRetVal = _DrvFwCtrlMsg22xxUpdateFirmwareBySwId(); + } + } + else + { + DBG("This chip type (%d) does not support update firmware by sw id\n", g_ChipType); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + nRetVal = -1; + return; + } + + DBG("*** update firmware by sw id result = %d ***\n", nRetVal); + + if (nRetVal == 0) + { + DBG("update firmware by sw id success\n"); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gIsUpdateInfoBlockFirst = 0; + g_IsUpdateFirmware = 0x00; + } + } + else //nRetVal == -1 + { + _gUpdateRetryCount --; + if (_gUpdateRetryCount > 0) + { + DBG("_gUpdateRetryCount = %d\n", _gUpdateRetryCount); + queue_work(_gUpdateFirmwareBySwIdWorkQueue, &_gUpdateFirmwareBySwIdWork); + } + else + { + DBG("update firmware by sw id failed\n"); + + DrvPlatformLyrTouchDeviceResetHw(); + + DrvPlatformLyrEnableFingerTouchReport(); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gIsUpdateInfoBlockFirst = 0; + g_IsUpdateFirmware = 0x00; + } + } + } +} + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// + +static void _DrvFwCtrlReadInfoC33(void) +{ + u8 szDbBusTxData[5] = {0}; + u16 nRegData = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + u32 i; +#endif + + DBG("*** %s() ***\n", __func__); + + mdelay(300); + + // Stop Watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + RegSet16BitValue(0x3CE4, 0xA4AB); + + RegSet16BitValue(0x1E04, 0x7d60); + + // TP SW reset + RegSet16BitValue(0x1E04, 0x829F); + mdelay(1); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x0F; + szDbBusTxData[2] = 0xE6; + szDbBusTxData[3] = 0x00; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 4); + mdelay(100); + + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x5B58); + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + szDbBusTxData[0] = 0x72; + szDbBusTxData[3] = 0x00; + szDbBusTxData[4] = 0x80; // read 128 bytes + + for (i = 0; i < 8; i ++) + { + szDbBusTxData[1] = 0x80 + (((i*128)&0xff00)>>8); + szDbBusTxData[2] = (i*128)&0x00ff; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 5); + + mdelay(50); + + // Receive info data + IicReadData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[i*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + szDbBusTxData[0] = 0x72; + szDbBusTxData[1] = 0x80; + szDbBusTxData[2] = 0x00; + szDbBusTxData[3] = 0x04; // read 1024 bytes + szDbBusTxData[4] = 0x00; + + IicWriteData(SLAVE_I2C_ID_DWI2C, szDbBusTxData, 5); + + mdelay(50); + + // Receive info data + IicReadData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[0], 1024); +#endif +} + +static s32 _DrvFwCtrlUpdateFirmwareC32(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 i, j; + u32 nCrcMain, nCrcMainTp; + u32 nCrcInfo, nCrcInfoTp; + u32 nCrcTemp; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + ///////////////////////// + // Erase all + ///////////////////////// + _DrvFwCtrlEraseEmemC32(); + mdelay(1000); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Reset watch dog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + ///////////////////////// + // Program + ///////////////////////// + + // Polling 0x3CE4 is 0x1C70 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x1C70); + + RegSet16BitValue(0x3CE4, 0xE38F); // for all-blocks + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Calculate CRC 32 + DrvCommonCrcInitTable(); + + for (i = 0; i < 33; i ++) // total 33 KB : 2 byte per R/W + { + if (i < 32) // emem_main + { + if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + + nCrcTemp = nCrcMain; + nCrcTemp = nCrcTemp ^ 0xffffffff; + + DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug + + for (j = 0; j < 4; j ++) + { + szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF); + + DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug + DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + } + else // emem_info + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(szFwData[i][j], nCrcInfo); + } + } + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + RegSet16BitValue(0x3CE4, 0x2F43); + } + + // Write file done + RegSet16BitValue(0x3CE4, 0x1380); + + mdelay(10); + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + // CRC Main from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + + // CRC Info from TP + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", + nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlUpdateFirmwareC33(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u8 szLifeCounter[2]; + u32 i, j; + u32 nCrcMain, nCrcMainTp; + u32 nCrcInfo, nCrcInfoTp; + u32 nCrcTemp; + u16 nRegData = 0; + + DBG("*** %s() ***\n", __func__); + + nCrcMain = 0xffffffff; + nCrcInfo = 0xffffffff; + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _DrvFwCtrlReadInfoC33(); + + if (_gDwIicInfoData[0] == 'M' && _gDwIicInfoData[1] == 'S' && _gDwIicInfoData[2] == 'T' && _gDwIicInfoData[3] == 'A' && _gDwIicInfoData[4] == 'R' && _gDwIicInfoData[5] == 'T' && _gDwIicInfoData[6] == 'P' && _gDwIicInfoData[7] == 'C') + { + _gDwIicInfoData[8] = szFwData[32][8]; + _gDwIicInfoData[9] = szFwData[32][9]; + _gDwIicInfoData[10] = szFwData[32][10]; + _gDwIicInfoData[11] = szFwData[32][11]; + // updata life counter + szLifeCounter[1] = ((((_gDwIicInfoData[13] << 8) | _gDwIicInfoData[12]) + 1) >> 8) & 0xFF; + szLifeCounter[0] = (((_gDwIicInfoData[13] << 8) | _gDwIicInfoData[12]) + 1) & 0xFF; + _gDwIicInfoData[12] = szLifeCounter[0]; + _gDwIicInfoData[13] = szLifeCounter[1]; + + RegSet16BitValue(0x3CE4, 0x78C5); + RegSet16BitValue(0x1E04, 0x7d60); + // TP SW reset + RegSet16BitValue(0x1E04, 0x829F); + + mdelay(50); + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Transmit lk info data +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, &_gDwIicInfoData[0], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + } + + // erase main + _DrvFwCtrlEraseEmemC33(EMEM_MAIN); + mdelay(1000); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + ///////////////////////// + // Program + ///////////////////////// + + // Polling 0x3CE4 is 0x1C70 + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x1C70); + } + + switch (eEmemType) + { + case EMEM_ALL: + RegSet16BitValue(0x3CE4, 0xE38F); // for all blocks + break; + case EMEM_MAIN: + RegSet16BitValue(0x3CE4, 0x7731); // for main block + break; + case EMEM_INFO: + RegSet16BitValue(0x3CE4, 0x7731); // for info block + + RegSetLByteValue(0x0FE6, 0x01); + + RegSetLByteValue(0x3CE4, 0xC5); + RegSetLByteValue(0x3CE5, 0x78); + + RegSetLByteValue(0x1E04, 0x9F); + RegSetLByteValue(0x1E05, 0x82); + + RegSetLByteValue(0x0FE6, 0x00); + mdelay(100); + break; + } + + // Polling 0x3CE4 is 0x2F43 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x2F43); + + // Calculate CRC 32 + DrvCommonCrcInitTable(); + + for (i = 0; i < 33; i ++) // total 33 KB : 2 byte per R/W + { + if (eEmemType == EMEM_INFO) + { + i = 32; + } + + if (i < 32) // emem_main + { + if (i == 31) + { + szFwData[i][1014] = 0x5A; + szFwData[i][1015] = 0xA5; + + for (j = 0; j < 1016; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + + nCrcTemp = nCrcMain; + nCrcTemp = nCrcTemp ^ 0xffffffff; + + DBG("nCrcTemp=%x\n", nCrcTemp); // add for debug + + for (j = 0; j < 4; j ++) + { + szFwData[i][1023-j] = ((nCrcTemp>>(8*j)) & 0xFF); + + DBG("((nCrcTemp>>(8*%d)) & 0xFF)=%x\n", j, ((nCrcTemp>>(8*j)) & 0xFF)); // add for debug + DBG("Update main clock crc32 into bin buffer szFwData[%d][%d]=%x\n", i, (1020+j), szFwData[i][1020+j]); // add for debug + } + } + else + { + for (j = 0; j < 1024; j ++) + { + nCrcMain = DrvCommonCrcGetValue(szFwData[i][j], nCrcMain); + } + } + } + else // emem_info + { + for (j = 0; j < 1024; j ++) + { + nCrcInfo = DrvCommonCrcGetValue(_gDwIicInfoData[j], nCrcInfo); + } + + if (eEmemType == EMEM_MAIN) + { + break; + } + } + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + for (j = 0; j < 8; j ++) + { + IicWriteData(SLAVE_I2C_ID_DWI2C, &szFwData[i][j*128], 128); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + IicWriteData(SLAVE_I2C_ID_DWI2C, szFwData[i], 1024); +#endif + + // Polling 0x3CE4 is 0xD0BC + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0xD0BC); + + RegSet16BitValue(0x3CE4, 0x2F43); + } + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // write file done and check crc + RegSet16BitValue(0x3CE4, 0x1380); + } + mdelay(10); + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // Polling 0x3CE4 is 0x9432 + do + { + nRegData = RegGet16BitValue(0x3CE4); + } while (nRegData != 0x9432); + } + + nCrcMain = nCrcMain ^ 0xffffffff; + nCrcInfo = nCrcInfo ^ 0xffffffff; + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + // CRC Main from TP + nCrcMainTp = RegGet16BitValue(0x3C80); + nCrcMainTp = (nCrcMainTp << 16) | RegGet16BitValue(0x3C82); + + // CRC Info from TP + nCrcInfoTp = RegGet16BitValue(0x3CA0); + nCrcInfoTp = (nCrcInfoTp << 16) | RegGet16BitValue(0x3CA2); + } + DBG("nCrcMain=0x%x, nCrcInfo=0x%x, nCrcMainTp=0x%x, nCrcInfoTp=0x%x\n", nCrcMain, nCrcInfo, nCrcMainTp, nCrcInfoTp); + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + + if ((eEmemType == EMEM_ALL) || (eEmemType == EMEM_MAIN)) + { + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlMsg22xxUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + u32 i, index; + u32 nCrcMain = 0, nCrcMainTp = 0; + u32 nCrcInfo = 0, nCrcInfoTp = 0; + u32 nRemainSize, nBlockSize, nSize; + u32 nTimeOut = 0; + u16 nRegData = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + u8 szDbBusTxData[128] = {0}; + u32 nSizePerWrite = 125; +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) + u8 szDbBusTxData[1024] = {0}; + u32 nSizePerWrite = 1021; +#endif + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + _DrvFwCtrlMsg22xxConvertFwDataTwoDimenToOneDimen(szFwData, _gOneDimenFwData); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + DBG("Erase start\n"); + + // Stop mcu + RegSet16BitValue(0x0FE6, 0x0001); + + // Disable watchdog + RegSetLByteValue(0x3C60, 0x55); + RegSetLByteValue(0x3C61, 0xAA); + + // Set PROGRAM password + RegSetLByteValue(0x161A, 0xBA); + RegSetLByteValue(0x161B, 0xAB); + + if (eEmemType == EMEM_ALL) // 48KB + 512Byte + { + DBG("Erase all block\n"); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(100); + + // Chip erase + RegSet16BitValue(0x160E, BIT3); + + DBG("Wait erase done flag\n"); + + while (1) // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + + mdelay(50); + + if ((nTimeOut ++) > 30) + { + DBG("Erase all block failed. Timeout.\n"); + + goto UpdateEnd; + } + } + } + else if (eEmemType == EMEM_MAIN) // 48KB (32+8+8) + { + DBG("Erase main block\n"); + + for (i = 0; i < 3; i ++) + { + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + if (i == 0) + { + RegSet16BitValue(0x1600, 0x0000); + } + else if (i == 1) + { + RegSet16BitValue(0x1600, 0x8000); + } + else if (i == 2) + { + RegSet16BitValue(0x1600, 0xA000); + } + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + while (1) // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(50); + + if ((nTimeOut ++) > 30) + { + DBG("Erase main block failed. Timeout.\n"); + + goto UpdateEnd; + } + } + } + } + else if (eEmemType == EMEM_INFO) // 512Byte + { + DBG("Erase info block\n"); + + // Clear pce + RegSetLByteValue(0x1618, 0x80); + mdelay(10); + + RegSet16BitValue(0x1600, 0xC000); + + // Sector erase + RegSet16BitValue(0x160E, (RegGet16BitValue(0x160E) | BIT2)); + + DBG("Wait erase done flag\n"); + + while (1) // Wait erase done flag + { + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait erase done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(50); + + if ((nTimeOut ++) > 30) + { + DBG("Erase info block failed. Timeout.\n"); + + goto UpdateEnd; + } + } + } + + DBG("Erase end\n"); + + // Hold reset pin before program + RegSetLByteValue(0x1E06, 0x00); + + ///////////////////////// + // Program + ///////////////////////// + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_MAIN) // 48KB + { + DBG("Program main block start\n"); + + // Program main block + RegSet16BitValue(0x161A, 0xABBA); + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0x0000); // Set start address of main block + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode + + // Program start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRemainSize = MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE * 1024; //48KB + index = 0; + + while (nRemainSize > 0) + { + if (nRemainSize > nSizePerWrite) + { + nBlockSize = nSizePerWrite; + } + else + { + nBlockSize = nRemainSize; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + nSize = 3; + + for (i = 0; i < nBlockSize; i ++) + { + szDbBusTxData[3+i] = _gOneDimenFwData[index*nSizePerWrite+i]; + nSize ++; + } + index ++; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize); + + nRemainSize = nRemainSize - nBlockSize; + } + + // Program end + szDbBusTxData[0] = 0x21; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRegData = RegGet16BitValue(0x160C); + RegSet16BitValue(0x160C, nRegData & (~0x01)); + + DBG("Wait main block write done flag\n"); + + while (1) // Wait write done flag + { + // Polling 0x1610 is 0x0002 + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait write done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(10); + + if ((nTimeOut ++) > 30) + { + DBG("Write failed. Timeout.\n"); + + goto UpdateEnd; + } + } + + DBG("Program main block end\n"); + } + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_INFO) // 512 Byte + { + DBG("Program info block start\n"); + + // Program info block + RegSet16BitValue(0x161A, 0xABBA); + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + RegSet16BitValue(0x1600, 0xC000); // Set start address of info block + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); // Enable burst mode + + // Program start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + + szDbBusTxData[0] = 0x20; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRemainSize = MSG22XX_FIRMWARE_INFO_BLOCK_SIZE; //512Byte + index = 0; + + while (nRemainSize > 0) + { + if (nRemainSize > nSizePerWrite) + { + nBlockSize = nSizePerWrite; + } + else + { + nBlockSize = nRemainSize; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x16; + szDbBusTxData[2] = 0x02; + + nSize = 3; + + for (i = 0; i < nBlockSize; i ++) + { + szDbBusTxData[3+i] = _gOneDimenFwData[(MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE*1024)+(index*nSizePerWrite)+i]; + nSize ++; + } + index ++; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], nSize); + + nRemainSize = nRemainSize - nBlockSize; + } + + // Program end + szDbBusTxData[0] = 0x21; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 1); + + nRegData = RegGet16BitValue(0x160C); + RegSet16BitValue(0x160C, nRegData & (~0x01)); + + DBG("Wait info block write done flag\n"); + + while (1) // Wait write done flag + { + // Polling 0x1610 is 0x0002 + nRegData = RegGet16BitValue(0x1610); // Memory status + nRegData = nRegData & BIT1; + + DBG("Wait write done flag nRegData = 0x%x\n", nRegData); + + if (nRegData == BIT1) + { + break; + } + mdelay(10); + + if ((nTimeOut ++) > 30) + { + DBG("Write failed. Timeout.\n"); + + goto UpdateEnd; + } + } + + DBG("Program info block end\n"); + } + + UpdateEnd: + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_MAIN) + { + // Get CRC 32 from updated firmware bin file + nCrcMain = _gOneDimenFwData[0xBFFF] << 24; + nCrcMain |= _gOneDimenFwData[0xBFFE] << 16; + nCrcMain |= _gOneDimenFwData[0xBFFD] << 8; + nCrcMain |= _gOneDimenFwData[0xBFFC]; + + // CRC Main from TP + DBG("Get Main CRC from TP\n"); + + nCrcMainTp = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_MAIN); + + DBG("nCrcMain=0x%x, nCrcMainTp=0x%x\n", nCrcMain, nCrcMainTp); + } + + if (eEmemType == EMEM_ALL || eEmemType == EMEM_INFO) + { + nCrcInfo = _gOneDimenFwData[0xC1FF] << 24; + nCrcInfo |= _gOneDimenFwData[0xC1FE] << 16; + nCrcInfo |= _gOneDimenFwData[0xC1FD] << 8; + nCrcInfo |= _gOneDimenFwData[0xC1FC]; + + // CRC Info from TP + DBG("Get Info CRC from TP\n"); + + nCrcInfoTp = _DrvFwCtrlMsg22xxGetFirmwareCrcByHardware(EMEM_INFO); + + DBG("nCrcInfo=0x%x, nCrcInfoTp=0x%x\n", nCrcInfo, nCrcInfoTp); + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + if (eEmemType == EMEM_ALL) + { + if ((nCrcMainTp != nCrcMain) || (nCrcInfoTp != nCrcInfo)) + { + DBG("Update FAILED\n"); + + return -1; + } + } + else if (eEmemType == EMEM_MAIN) + { + if (nCrcMainTp != nCrcMain) + { + DBG("Update FAILED\n"); + + return -1; + } + } + else if (eEmemType == EMEM_INFO) + { + if (nCrcInfoTp != nCrcInfo) + { + DBG("Update FAILED\n"); + + return -1; + } + } + + DBG("Update SUCCESS\n"); + + return 0; +} + +static s32 _DrvFwCtrlUpdateFirmwareCash(u8 szFwData[][1024]) +{ + DBG("*** %s() ***\n", __func__); + + DBG("g_ChipType = 0x%x\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) // (0x02) + { +// u16 nChipType; + u8 nChipVersion = 0; + + DrvPlatformLyrTouchDeviceResetHw(); + + // Erase TP Flash first + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop MCU + RegSetLByteValue(0x0FE6, 0x01); + + // Disable watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + ///////////////////////// + // Difference between C2 and C3 + ///////////////////////// + // c2:MSG2133(1) c32:MSG2133A(2) c33:MSG2138A(2) + // check ic type +// nChipType = RegGet16BitValue(0x1ECC) & 0xFF; + + // check ic version + nChipVersion = RegGet16BitValue(0x3CEA) & 0xFF; + + DBG("chip version = 0x%x\n", nChipVersion); + + if (nChipVersion == 3) + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + return _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(szFwData, EMEM_MAIN); +#else + return _DrvFwCtrlUpdateFirmwareC33(szFwData, EMEM_MAIN); +#endif + } + else + { +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + return _DrvFwCtrlMsg21xxaUpdateFirmwareBySwId(szFwData, EMEM_MAIN); +#else + return _DrvFwCtrlUpdateFirmwareC32(szFwData, EMEM_ALL); +#endif + } + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) // (0x7A) + { + _DrvFwCtrlMsg22xxGetTpVendorCode(_gTpVendorCode); + + if (_gTpVendorCode[0] == 'C' && _gTpVendorCode[1] == 'N' && _gTpVendorCode[2] == 'T') // for specific TP vendor which store some important information in info block, only update firmware for main block, do not update firmware for info block. + { + return _DrvFwCtrlMsg22xxUpdateFirmware(szFwData, EMEM_MAIN); + } + else + { + return _DrvFwCtrlMsg22xxUpdateFirmware(szFwData, EMEM_ALL); + } + } + else // CHIP_TYPE_MSG21XX (0x01) + { + DBG("Can not update firmware. Catch-2 is no need to be maintained now.\n"); + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + return -1; + } +} + +static s32 _DrvFwCtrlUpdateFirmwareBySdCard(const char *pFilePath) +{ + s32 nRetVal = 0; + struct file *pfile = NULL; + struct inode *inode; + s32 fsize = 0; + u8 *pbt_buf = NULL; + mm_segment_t old_fs; + loff_t pos; + u16 eSwId = 0x0000; + u16 eVendorId = 0x0000; + + DBG("*** %s() ***\n", __func__); + + pfile = filp_open(pFilePath, O_RDONLY, 0); + if (IS_ERR(pfile)) + { + DBG("Error occured while opening file %s.\n", pFilePath); + return -1; + } + + inode = pfile->f_dentry->d_inode; + fsize = inode->i_size; + + DBG("fsize = %d\n", fsize); + + if (fsize <= 0) + { + filp_close(pfile, NULL); + return -1; + } + + // read firmware + pbt_buf = kmalloc(fsize, GFP_KERNEL); + + old_fs = get_fs(); + set_fs(KERNEL_DS); + + pos = 0; + vfs_read(pfile, pbt_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + + _DrvFwCtrlStoreFirmwareData(pbt_buf, fsize); + + kfree(pbt_buf); + + DrvPlatformLyrDisableFingerTouchReport(); + + DrvPlatformLyrTouchDeviceResetHw(); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + eVendorId = g_FwData[31][0x34F] <<8 | g_FwData[31][0x34E]; + eSwId = _DrvFwCtrlMsg21xxaGetSwId(EMEM_MAIN); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + eVendorId = g_FwData[47][1013] <<8 | g_FwData[47][1012]; + eSwId = _DrvFwCtrlMsg22xxGetSwId(EMEM_MAIN); + } + + DBG("eVendorId = 0x%x, eSwId = 0x%x\n", eVendorId, eSwId); + + if (eSwId == eVendorId) + { + if ((g_ChipType == CHIP_TYPE_MSG21XXA && fsize == 33792/* 33KB */) || (g_ChipType == CHIP_TYPE_MSG22XX && fsize == 49664/* 48.5KB */)) + { + nRetVal = _DrvFwCtrlUpdateFirmwareCash(g_FwData); + } + else + { + DBG("The file size of the update firmware bin file is not supported, fsize = %d\n", fsize); + nRetVal = -1; + } + } + else + { + DBG("The vendor id of the update firmware bin file is different from the vendor id on e-flash.\n"); + nRetVal = -1; + } + + g_FwDataCount = 0; // Reset g_FwDataCount to 0 after update firmware + + DrvPlatformLyrEnableFingerTouchReport(); + + return nRetVal; +} + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +void DrvFwCtrlVariableInitialize(void) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { +// FIRMWARE_MODE_UNKNOWN_MODE = MSG21XXA_FIRMWARE_MODE_UNKNOWN_MODE; + FIRMWARE_MODE_DEMO_MODE = MSG21XXA_FIRMWARE_MODE_DEMO_MODE; + FIRMWARE_MODE_DEBUG_MODE = MSG21XXA_FIRMWARE_MODE_DEBUG_MODE; + FIRMWARE_MODE_RAW_DATA_MODE = MSG21XXA_FIRMWARE_MODE_RAW_DATA_MODE; + + g_FirmwareMode = FIRMWARE_MODE_DEMO_MODE; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { +// FIRMWARE_MODE_UNKNOWN_MODE = MSG22XX_FIRMWARE_MODE_UNKNOWN_MODE; + FIRMWARE_MODE_DEMO_MODE = MSG22XX_FIRMWARE_MODE_DEMO_MODE; + FIRMWARE_MODE_DEBUG_MODE = MSG22XX_FIRMWARE_MODE_DEBUG_MODE; + FIRMWARE_MODE_RAW_DATA_MODE = MSG22XX_FIRMWARE_MODE_RAW_DATA_MODE; + + g_FirmwareMode = FIRMWARE_MODE_DEMO_MODE; + } +} + +void DrvFwCtrlOptimizeCurrentConsumption(void) +{ + u32 i; + u8 szDbBusTxData[27] = {0}; + + DBG("g_ChipType = 0x%x\n", g_ChipType); + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + return; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + RegSet16BitValue(0x1618, (RegGet16BitValue(0x1618) | 0x80)); + + // Enable burst mode + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x11; + szDbBusTxData[2] = 0xA0; //bank:0x11, addr:h0050 + + for (i = 0; i < 24; i ++) + { + szDbBusTxData[i+3] = 0x11; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+24); // Write 0x11 for reg 0x1150~0x115B + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x11; + szDbBusTxData[2] = 0xB8; //bank:0x11, addr:h005C + + for (i = 0; i < 6; i ++) + { + szDbBusTxData[i+3] = 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+6); // Write 0xFF for reg 0x115C~0x115E + + // Clear burst mode + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + } +} + +u8 DrvFwCtrlGetChipType(void) +{ + s32 rc =0; + u8 nChipType = 0; + + DBG("*** %s() ***\n", __func__); + + // Erase TP Flash first + rc = DbBusEnterSerialDebugMode(); + if (rc < 0) + { + DBG("*** DbBusEnterSerialDebugMode() failed, rc = %d ***\n", rc); + return nChipType; + } + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + + // Stop MCU + RegSetLByteValue(0x0FE6, 0x01); + + // Disable watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + ///////////////////////// + // Difference between C2 and C3 + ///////////////////////// + // c2:MSG2133(1) c32:MSG2133A(2) c33:MSG2138A(2) + // check ic type + nChipType = RegGet16BitValue(0x1ECC) & 0xFF; + + if (nChipType != CHIP_TYPE_MSG21XX && // (0x01) + nChipType != CHIP_TYPE_MSG21XXA && // (0x02) + nChipType != CHIP_TYPE_MSG26XXM && // (0x03) + nChipType != CHIP_TYPE_MSG22XX && // (0x7A) + nChipType != CHIP_TYPE_MSG28XX) // (0x85) + { + nChipType = 0; + } + + DBG("*** Chip Type = 0x%x ***\n", nChipType); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + return nChipType; +} + +void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion) +{ + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG21XX) + { + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[4] = {0}; + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + szDbBusTxData[2] = 0x2A; + } + else if (g_ChipType == CHIP_TYPE_MSG21XX) + { + szDbBusTxData[2] = 0x74; + } + else + { + szDbBusTxData[2] = 0x2A; + } + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + mutex_unlock(&g_Mutex); + + *pMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0]; + *pMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2]; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + u16 nRegData1, nRegData2; + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + RegSet16BitValue(0x1600, 0xBFF4); // Set start address for customer firmware version on main block + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + *pMajor = (((nRegData1 >> 8) & 0xFF) << 8) + (nRegData1 & 0xFF); + *pMinor = (((nRegData2 >> 8) & 0xFF) << 8) + (nRegData2 & 0xFF); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + mutex_unlock(&g_Mutex); + } + + DBG("*** major = %d ***\n", *pMajor); + DBG("*** minor = %d ***\n", *pMinor); + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*6, GFP_KERNEL); + } + + sprintf(*ppVersion, "%03d%03d", *pMajor, *pMinor); +} + +void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion) +{ + u32 i; + u16 nRegData1, nRegData2; + u8 szDbBusRxData[12] = {0}; + + DBG("*** %s() ***\n", __func__); + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + if (g_ChipType == CHIP_TYPE_MSG22XX) // Only MSG22XX support platform firmware version + { + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + RegSet16BitValue(0x1600, 0xC1F2); // Set start address for platform firmware version on info block(Actually, start reading from 0xC1F0) + + // Enable burst mode + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + for (i = 0; i < 3; i ++) + { + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + szDbBusRxData[i*4+0] = (nRegData1 & 0xFF); + szDbBusRxData[i*4+1] = ((nRegData1 >> 8 ) & 0xFF); + +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+0, szDbBusRxData[i*4+0], szDbBusRxData[i*4+0]); // add for debug +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+1, szDbBusRxData[i*4+1], szDbBusRxData[i*4+1]); // add for debug + + szDbBusRxData[i*4+2] = (nRegData2 & 0xFF); + szDbBusRxData[i*4+3] = ((nRegData2 >> 8 ) & 0xFF); + +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+2, szDbBusRxData[i*4+2], szDbBusRxData[i*4+2]); // add for debug +// DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+3, szDbBusRxData[i*4+3], szDbBusRxData[i*4+3]); // add for debug + } + + // Clear burst mode + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL); + } + + sprintf(*ppVersion, "%c%c%c%c%c%c%c%c%c%c", szDbBusRxData[2], szDbBusRxData[3], szDbBusRxData[4], + szDbBusRxData[5], szDbBusRxData[6], szDbBusRxData[7], szDbBusRxData[8], szDbBusRxData[9], szDbBusRxData[10], szDbBusRxData[11]); + } + else + { + if (*ppVersion == NULL) + { + *ppVersion = kzalloc(sizeof(u8)*10, GFP_KERNEL); + } + + sprintf(*ppVersion, "%s", "N/A"); + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + mutex_unlock(&g_Mutex); + + DBG("*** platform firmware version = %s ***\n", *ppVersion); +} + +s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType) +{ + DBG("*** %s() ***\n", __func__); + + return _DrvFwCtrlUpdateFirmwareCash(szFwData); +} + +s32 DrvFwCtrlUpdateFirmwareBySdCard(const char *pFilePath) +{ + s32 nRetVal = -1; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG22XX) + { + nRetVal = _DrvFwCtrlUpdateFirmwareBySdCard(pFilePath); + } + else + { + DBG("This chip type (%d) does not support update firmware by sd card\n", g_ChipType); + } + + return nRetVal; +} + +void DrvFwCtrlHandleFingerTouch(void) +{ + TouchInfo_t tInfo; + u32 i; + u8 nTouchKeyCode = 0; + static u32 nLastKeyCode = 0; + u8 *pPacket = NULL; + u16 nReportPacketLength = 0; + s32 rc; + +// DBG("*** %s() ***\n", __func__); // add for debug + + if (_gIsDisableFinagerTouch == 1) + { + DBG("Skip finger touch for handling get firmware info or change firmware mode\n"); + return; + } + + mutex_lock(&g_Mutex); + DBG("*** %s() *** mutex_lock(&g_Mutex)\n", __func__); // add for debug + + memset(&tInfo, 0x0, sizeof(TouchInfo_t)); + + if (IS_FIRMWARE_DATA_LOG_ENABLED) + { + if (g_FirmwareMode == FIRMWARE_MODE_DEMO_MODE) + { + DBG("FIRMWARE_MODE_DEMO_MODE\n"); + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = g_DemoModePacket; + } + else if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE) + { + DBG("FIRMWARE_MODE_DEBUG_MODE\n"); + + if (g_FirmwareInfo.nLogModePacketHeader != 0x62) + { + DBG("WRONG DEBUG MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + goto TouchHandleEnd; + } + + nReportPacketLength = g_FirmwareInfo.nLogModePacketLength; + pPacket = g_LogModePacket; + } + else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE) + { + DBG("FIRMWARE_MODE_RAW_DATA_MODE\n"); + + if (g_FirmwareInfo.nLogModePacketHeader != 0x62) + { + DBG("WRONG RAW DATA MODE HEADER : 0x%x\n", g_FirmwareInfo.nLogModePacketHeader); + goto TouchHandleEnd; + } + + nReportPacketLength = g_FirmwareInfo.nLogModePacketLength; + pPacket = g_LogModePacket; + } + else + { + DBG("WRONG FIRMWARE MODE : 0x%x\n", g_FirmwareMode); + goto TouchHandleEnd; + } + } + else + { + DBG("FIRMWARE_MODE_DEMO_MODE\n"); + + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = g_DemoModePacket; + } //IS_FIRMWARE_DATA_LOG_ENABLED + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE + if (g_GestureDebugMode == 1 && g_GestureWakeupFlag == 1) + { + DBG("Set gesture debug mode packet length, g_ChipType=%d\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + nReportPacketLength = GESTURE_DEBUG_MODE_PACKET_LENGTH; + pPacket = _gGestureWakeupPacket; + } + else + { + DBG("This chip type does not support gesture debug mode.\n"); + goto TouchHandleEnd; + } + } + else if (g_GestureWakeupFlag == 1) + { + DBG("Set gesture wakeup packet length, g_ChipType=%d\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + nReportPacketLength = GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH; +#else + nReportPacketLength = GESTURE_WAKEUP_PACKET_LENGTH; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + pPacket = _gGestureWakeupPacket; + } + else if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = _gGestureWakeupPacket; + } + else + { + DBG("This chip type does not support gesture wakeup.\n"); + goto TouchHandleEnd; + } + } + +#else + + if (g_GestureWakeupFlag == 1) + { + DBG("Set gesture wakeup packet length, g_ChipType=%d\n", g_ChipType); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE + nReportPacketLength = GESTURE_WAKEUP_INFORMATION_PACKET_LENGTH; +#else + nReportPacketLength = GESTURE_WAKEUP_PACKET_LENGTH; +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + + pPacket = _gGestureWakeupPacket; + } + else if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nReportPacketLength = DEMO_MODE_PACKET_LENGTH; + pPacket = _gGestureWakeupPacket; + } + else + { + DBG("This chip type does not support gesture wakeup.\n"); + goto TouchHandleEnd; + } + } +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + if (g_GestureWakeupFlag == 1) + { + u32 i = 0; + + while (i < 5) + { + mdelay(50); + + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + + if (rc > 0) + { + break; + } + + i++; + } + if (i == 5) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + goto TouchHandleEnd; + } + } + else + { + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + goto TouchHandleEnd; + } + } +#else + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + goto TouchHandleEnd; + } +#endif //CONFIG_ENABLE_GESTURE_WAKEUP +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + goto TouchHandleEnd; + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (nReportPacketLength > 8) + { +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + } + else + { + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &pPacket[0], nReportPacketLength); + } + + if (rc < 0) + { + DBG("I2C read packet data failed, rc = %d\n", rc); + goto TouchHandleEnd; + } +#endif + + if (0 == _DrvFwCtrlParsePacket(pPacket, nReportPacketLength, &tInfo)) + { + //report... + if ((tInfo.nFingerNum) == 0) //touch end + { + if (nLastKeyCode != 0) + { + DBG("key touch released\n"); + + input_report_key(g_InputDevice, BTN_TOUCH, 0); + input_report_key(g_InputDevice, nLastKeyCode, 0); + + input_sync(g_InputDevice); + + nLastKeyCode = 0; //clear key status.. + } + else + { + DrvPlatformLyrFingerTouchReleased(0, 0); + + input_sync(g_InputDevice); + } + } + else //touch on screen + { + if (tInfo.nTouchKeyCode != 0) + { +#ifdef CONFIG_TP_HAVE_KEY + if (tInfo.nTouchKeyCode == 4) // TOUCH_KEY_HOME + { + nTouchKeyCode = g_TpVirtualKey[1]; + } + else if (tInfo.nTouchKeyCode == 1) // TOUCH_KEY_MENU + { + nTouchKeyCode = g_TpVirtualKey[0]; + } + else if (tInfo.nTouchKeyCode == 2) // TOUCH_KEY_BACK + { + nTouchKeyCode = g_TpVirtualKey[2]; + } + else if (tInfo.nTouchKeyCode == 8) // TOUCH_KEY_SEARCH + { + nTouchKeyCode = g_TpVirtualKey[3]; + } + + if (nLastKeyCode != nTouchKeyCode) + { + DBG("key touch pressed\n"); + DBG("nTouchKeyCode = %d, nLastKeyCode = %d\n", nTouchKeyCode, nLastKeyCode); + + nLastKeyCode = nTouchKeyCode; + + input_report_key(g_InputDevice, BTN_TOUCH, 1); + input_report_key(g_InputDevice, nTouchKeyCode, 1); + + input_sync(g_InputDevice); + } +#endif //CONFIG_TP_HAVE_KEY + } + else + { + DBG("tInfo->nFingerNum = %d...............\n", tInfo.nFingerNum); + + for (i = 0; i < tInfo.nFingerNum; i ++) + { + DrvPlatformLyrFingerTouchPressed(tInfo.tPoint[i].nX, tInfo.tPoint[i].nY, 0, 0); + } + + input_sync(g_InputDevice); + } + } + +#ifdef CONFIG_ENABLE_COUNT_REPORT_RATE + if (g_IsEnableReportRate == 1) + { + if (g_ValidTouchCount == 4294967296) + { + g_ValidTouchCount = 0; // Reset count if overflow + DBG("g_ValidTouchCount reset to 0\n"); + } + + g_ValidTouchCount ++; + + DBG("g_ValidTouchCount = %d\n", g_ValidTouchCount); + } +#endif //CONFIG_ENABLE_COUNT_REPORT_RATE + } + + TouchHandleEnd: + + DBG("*** %s() *** mutex_unlock(&g_Mutex)\n", __func__); // add for debug + mutex_unlock(&g_Mutex); +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP + +void DrvFwCtrlOpenGestureWakeup(u32 *pMode) +{ + u8 szDbBusTxData[4] = {0}; + u32 i = 0; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + DBG("wakeup mode 0 = 0x%x\n", pMode[0]); + DBG("wakeup mode 1 = 0x%x\n", pMode[1]); + +#ifdef CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = ((pMode[1] & 0xFF000000) >> 24); + szDbBusTxData[3] = ((pMode[1] & 0x00FF0000) >> 16); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + udelay(1000); // delay 1ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 0 success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 0 failed\n"); + } + + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = ((pMode[1] & 0x0000FF00) >> 8); + szDbBusTxData[3] = ((pMode[1] & 0x000000FF) >> 0); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + udelay(1000); // delay 1ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 1 success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 1 failed\n"); + } + + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x02; + szDbBusTxData[2] = ((pMode[0] & 0xFF000000) >> 24); + szDbBusTxData[3] = ((pMode[0] & 0x00FF0000) >> 16); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + udelay(1000); // delay 1ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 2 success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 2 failed\n"); + } + + szDbBusTxData[0] = 0x59; + szDbBusTxData[1] = 0x03; + szDbBusTxData[2] = ((pMode[0] & 0x0000FF00) >> 8); + szDbBusTxData[3] = ((pMode[0] & 0x000000FF) >> 0); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + udelay(1000); // delay 1ms + + if (rc > 0) + { + DBG("Enable gesture wakeup index 3 success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup index 3 failed\n"); + } + + g_GestureWakeupFlag = 1; // gesture wakeup is enabled + +#else + + szDbBusTxData[0] = 0x58; + szDbBusTxData[1] = ((pMode[0] & 0x0000FF00) >> 8); + szDbBusTxData[2] = ((pMode[0] & 0x000000FF) >> 0); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + + if (rc > 0) + { + DBG("Enable gesture wakeup success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Enable gesture wakeup failed\n"); + } + + g_GestureWakeupFlag = 1; // gesture wakeup is enabled +#endif //CONFIG_SUPPORT_64_TYPES_GESTURE_WAKEUP_MODE +} + +void DrvFwCtrlCloseGestureWakeup(void) +{ + DBG("*** %s() ***\n", __func__); + + g_GestureWakeupFlag = 0; // gesture wakeup is disabled +} + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +void DrvFwCtrlOpenGestureDebugMode(u8 nGestureFlag) +{ + u8 szDbBusTxData[3] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + DBG("Gesture Flag = 0x%x\n", nGestureFlag); + + szDbBusTxData[0] = 0x30; + szDbBusTxData[1] = 0x01; + szDbBusTxData[2] = nGestureFlag; + + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc < 0) + { + DBG("Enable gesture debug mode failed\n"); + } + else + { + DBG("Enable gesture debug mode success\n"); + } + + g_GestureDebugMode = 1; // gesture debug mode is enabled +} + +void DrvFwCtrlCloseGestureDebugMode(void) +{ + u8 szDbBusTxData[3] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x30; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x00; + + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + if (rc < 0) + { + DBG("Disable gesture debug mode failed\n"); + } + else + { + DBG("Disable gesture debug mode success\n"); + } + + g_GestureDebugMode = 0; // gesture debug mode is disabled +} +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE + +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +static void _DrvFwCtrlCoordinate(u8 *pRawData, u32 *pTranX, u32 *pTranY) +{ + u32 nX; + u32 nY; +#ifdef CONFIG_SWAP_X_Y + u32 nTempX; + u32 nTempY; +#endif + + nX = (((pRawData[0] & 0xF0) << 4) | pRawData[1]); // parse the packet to coordinate + nY = (((pRawData[0] & 0x0F) << 8) | pRawData[2]); + + DBG("[x,y]=[%d,%d]\n", nX, nY); + +#ifdef CONFIG_SWAP_X_Y + nTempY = nX; + nTempX = nY; + nX = nTempX; + nY = nTempY; +#endif + +#ifdef CONFIG_REVERSE_X + nX = 2047 - nX; +#endif + +#ifdef CONFIG_REVERSE_Y + nY = 2047 - nY; +#endif + + /* + * pRawData[0]~nRawData[2] : the point abs, + * pRawData[0]~nRawData[2] all are 0xFF, release touch + */ + if ((pRawData[0] == 0xFF) && (pRawData[1] == 0xFF) && (pRawData[2] == 0xFF)) + { + *pTranX = 0; // final X coordinate + *pTranY = 0; // final Y coordinate + } + else + { + /* one touch point */ + *pTranX = (nX * TOUCH_SCREEN_X_MAX) / TPD_WIDTH; + *pTranY = (nY * TOUCH_SCREEN_Y_MAX) / TPD_HEIGHT; + DBG("[%s]: [x,y]=[%d,%d]\n", __func__, nX, nY); + DBG("[%s]: point[x,y]=[%d,%d]\n", __func__, *pTranX, *pTranY); + } +} +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE + +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +//------------------------------------------------------------------------------// + +u16 DrvFwCtrlChangeFirmwareMode(u16 nMode) +{ + u8 szDbBusTxData[2] = {0}; + u32 i = 0; + s32 rc; + + DBG("*** %s() *** nMode = 0x%x\n", __func__, nMode); + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send change firmware mode i2c command to firmware. + + szDbBusTxData[0] = 0x02; + szDbBusTxData[1] = (u8)nMode; + + mutex_lock(&g_Mutex); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 2); + if (rc > 0) + { + DBG("Change firmware mode success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Change firmware mode failed, rc = %d\n", rc); + } + + mutex_unlock(&g_Mutex); + + _gIsDisableFinagerTouch = 0; + + return nMode; +} + +void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo) +{ + u8 szDbBusTxData[1] = {0}; + u8 szDbBusRxData[8] = {0}; + u32 i = 0; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + _gIsDisableFinagerTouch = 1; // Disable finger touch ISR handling temporarily for device driver can send get firmware info i2c command to firmware. + + szDbBusTxData[0] = 0x01; + + mutex_lock(&g_Mutex); + + while (i < 5) + { + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 1); + if (rc > 0) + { + DBG("Get firmware info IicWriteData() success\n"); + } + mdelay(20); + rc = IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 8); + if (rc > 0) + { + DBG("Get firmware info IicReadData() success\n"); + break; + } + + mdelay(10); + i++; + } + if (i == 5) + { + DBG("Get firmware info failed, rc = %d\n", rc); + } + + mutex_unlock(&g_Mutex); + + if ((szDbBusRxData[1] & 0x80) == 0x80) + { + pInfo->nIsCanChangeFirmwareMode = 0; + } + else + { + pInfo->nIsCanChangeFirmwareMode = 1; + } + + pInfo->nFirmwareMode = szDbBusRxData[1] & 0x7F; + pInfo->nLogModePacketHeader = szDbBusRxData[2]; + pInfo->nLogModePacketLength = (szDbBusRxData[3]<<8) + szDbBusRxData[4]; + + DBG("pInfo->nFirmwareMode=0x%x, pInfo->nLogModePacketHeader=0x%x, pInfo->nLogModePacketLength=%d, pInfo->nIsCanChangeFirmwareMode=%d\n", pInfo->nFirmwareMode, pInfo->nLogModePacketHeader, pInfo->nLogModePacketLength, pInfo->nIsCanChangeFirmwareMode); + + _gIsDisableFinagerTouch = 0; +} + +void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void) +{ + DBG("*** %s() g_IsSwitchModeByAPK = %d ***\n", __func__, g_IsSwitchModeByAPK); + + if (g_IsSwitchModeByAPK == 1) + { + FirmwareInfo_t tInfo; + + memset(&tInfo, 0x0, sizeof(FirmwareInfo_t)); + + DrvFwCtrlGetFirmwareInfo(&tInfo); + + DBG("g_FirmwareMode = 0x%x, tInfo.nFirmwareMode = 0x%x\n", g_FirmwareMode, tInfo.nFirmwareMode); + + // Since reset_hw() will reset the firmware mode to demo mode, we must reset the firmware mode again after reset_hw(). + if (g_FirmwareMode == FIRMWARE_MODE_DEBUG_MODE && FIRMWARE_MODE_DEBUG_MODE != tInfo.nFirmwareMode) + { + g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_DEBUG_MODE); + } + else if (g_FirmwareMode == FIRMWARE_MODE_RAW_DATA_MODE && FIRMWARE_MODE_RAW_DATA_MODE != tInfo.nFirmwareMode) + { + g_FirmwareMode = DrvFwCtrlChangeFirmwareMode(FIRMWARE_MODE_RAW_DATA_MODE); + } + else + { + DBG("firmware mode is not restored\n"); + } + } +} + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +void DrvFwCtrlCheckFirmwareUpdateBySwId(void) +{ + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvFwCtrlMsg21xxaCheckFirmwareUpdateBySwId(); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvFwCtrlMsg22xxCheckFirmwareUpdateBySwId(); + } + else + { + DBG("This chip type (%d) does not support update firmware by sw id\n", g_ChipType); + } +} + +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +//------------------------------------------------------------------------------// + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION + +s32 DrvFwCtrlEnableProximity(void) +{ + u8 szDbBusTxData[4] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x52; + szDbBusTxData[1] = 0x00; + + if (g_ChipType == CHIP_TYPE_MSG21XX) + { + szDbBusTxData[2] = 0x62; + } + else if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG22XX) + { + szDbBusTxData[2] = 0x4a; + } + else + { + DBG("*** Un-recognized chip type = 0x%x ***\n", g_ChipType); + return -1; + } + + szDbBusTxData[3] = 0xa0; + + mutex_lock(&g_Mutex); + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mutex_unlock(&g_Mutex); + + if (rc > 0) + { + DBG("Enable proximity detection success\n"); + } + else + { + DBG("Enable proximity detection failed\n"); + } + + g_EnableTpProximity = 1; + + return rc; +} + +s32 DrvFwCtrlDisableProximity(void) +{ + u8 szDbBusTxData[4] = {0}; + s32 rc; + + DBG("*** %s() ***\n", __func__); + + szDbBusTxData[0] = 0x52; + szDbBusTxData[1] = 0x00; + + if (g_ChipType == CHIP_TYPE_MSG21XX) + { + szDbBusTxData[2] = 0x62; + } + else if (g_ChipType == CHIP_TYPE_MSG21XXA || g_ChipType == CHIP_TYPE_MSG22XX) + { + szDbBusTxData[2] = 0x4a; + } + else + { + DBG("*** Un-recognized chip type = 0x%x ***\n", g_ChipType); + return -1; + } + + szDbBusTxData[3] = 0xa1; + + mutex_lock(&g_Mutex); + rc = IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 4); + mutex_unlock(&g_Mutex); + + if (rc > 0) + { + DBG("Disable proximity detection success\n"); + } + else + { + DBG("Disable proximity detection failed\n"); + } + + g_EnableTpProximity = 0; +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + g_FaceClosingTp = 0; +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM || CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM + + return rc; +} + +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +//------------------------------------------------------------------------------// + +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.h b/drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.h new file mode 100644 index 00000000..8d7abd6d --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_self_fw_control.h @@ -0,0 +1,185 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_fw_control.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_SELF_FW_CONTROL_H__ +#define __MSTAR_DRV_SELF_FW_CONTROL_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) + +/*--------------------------------------------------------------------------*/ +/* COMPILE OPTION DEFINITION */ +/*--------------------------------------------------------------------------*/ + +//#define CONFIG_SWAP_X_Y + +//#define CONFIG_REVERSE_X +//#define CONFIG_REVERSE_Y + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define DEMO_MODE_PACKET_LENGTH (8) +#define MAX_TOUCH_NUM (2) + +#define MAX_ERASE_EFLASH_TIMES (2) // for update firmware of MSG22xx + +#define MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE (32) //32K +#define MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE (1) //1K +#define MSG21XXA_FIRMWARE_WHOLE_SIZE (MSG21XXA_FIRMWARE_MAIN_BLOCK_SIZE+MSG21XXA_FIRMWARE_INFO_BLOCK_SIZE) //33K + +#define MSG22XX_FIRMWARE_MAIN_BLOCK_SIZE (48) //48K +#define MSG22XX_FIRMWARE_INFO_BLOCK_SIZE (512) //512Byte + + +//#define MSG21XXA_FIRMWARE_MODE_UNKNOWN_MODE (0xFF) +#define MSG21XXA_FIRMWARE_MODE_DEMO_MODE (0x00) +#define MSG21XXA_FIRMWARE_MODE_DEBUG_MODE (0x01) +#define MSG21XXA_FIRMWARE_MODE_RAW_DATA_MODE (0x02) + +//#define MSG22XX_FIRMWARE_MODE_UNKNOWN_MODE (0xFF) +#define MSG22XX_FIRMWARE_MODE_DEMO_MODE (0x00) +#define MSG22XX_FIRMWARE_MODE_DEBUG_MODE (0x01) +#define MSG22XX_FIRMWARE_MODE_RAW_DATA_MODE (0x02) + + +#define DEBUG_MODE_PACKET_LENGTH (128) + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +#define UPDATE_FIRMWARE_RETRY_COUNT (2) +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +#ifdef CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#define FIRMWARE_GESTURE_INFORMATION_MODE_A (0x00) +#define FIRMWARE_GESTURE_INFORMATION_MODE_B (0x01) +#define FIRMWARE_GESTURE_INFORMATION_MODE_C (0x02) +#endif //CONFIG_ENABLE_GESTURE_INFORMATION_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + +typedef struct +{ + u16 nX; + u16 nY; +} TouchPoint_t; + +typedef struct +{ + u8 nTouchKeyMode; + u8 nTouchKeyCode; + u8 nFingerNum; + TouchPoint_t tPoint[MAX_TOUCH_NUM]; +} TouchInfo_t; + +typedef struct +{ + u8 nFirmwareMode; + u8 nLogModePacketHeader; + u16 nLogModePacketLength; + u8 nIsCanChangeFirmwareMode; +} FirmwareInfo_t; + + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +/* + * Note. + * The following is sw id enum definition for MSG22XX. + * 0x0000 and 0xFFFF are not allowed to be defined as SW ID. + * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it. + * Please modify the SW ID of the below enum value depends on the TP vendor that you are using. + */ +typedef enum { + MSG22XX_SW_ID_XXXX = 0x0001, + MSG22XX_SW_ID_YYYY = 0x0002, + MSG22XX_SW_ID_UNDEFINED +} Msg22xxSwId_e; + + +/* + * Note. + * The following is sw id enum definition for MSG21XXA. + * SW_ID_UNDEFINED is a reserved enum value, do not delete it or modify it. + * Please modify the SW ID of the below enum value depends on the TP vendor that you are using. + */ +typedef enum { + MSG21XXA_SW_ID_XXXX = 0, + MSG21XXA_SW_ID_YYYY, + MSG21XXA_SW_ID_UNDEFINED +} Msg21xxaSwId_e; +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +#ifdef CONFIG_ENABLE_GESTURE_WAKEUP +extern void DrvFwCtrlOpenGestureWakeup(u32 *pMode); +extern void DrvFwCtrlCloseGestureWakeup(void); + +#ifdef CONFIG_ENABLE_GESTURE_DEBUG_MODE +extern void DrvFwCtrlOpenGestureDebugMode(u8 nGestureFlag); +extern void DrvFwCtrlCloseGestureDebugMode(void); +#endif //CONFIG_ENABLE_GESTURE_DEBUG_MODE +#endif //CONFIG_ENABLE_GESTURE_WAKEUP + +extern u32 DrvFwCtrlReadDQMemValue(u16 nAddr); +extern void DrvFwCtrlWriteDQMemValue(u16 nAddr, u32 nData); + +extern u16 DrvFwCtrlChangeFirmwareMode(u16 nMode); +extern void DrvFwCtrlGetFirmwareInfo(FirmwareInfo_t *pInfo); +extern void DrvFwCtrlRestoreFirmwareModeToLogDataMode(void); + +#ifdef CONFIG_UPDATE_FIRMWARE_BY_SW_ID +extern void DrvFwCtrlCheckFirmwareUpdateBySwId(void); +#endif //CONFIG_UPDATE_FIRMWARE_BY_SW_ID + +#ifdef CONFIG_ENABLE_PROXIMITY_DETECTION +extern s32 DrvFwCtrlEnableProximity(void); +extern s32 DrvFwCtrlDisableProximity(void); +#endif //CONFIG_ENABLE_PROXIMITY_DETECTION + +extern void DrvFwCtrlVariableInitialize(void); +extern void DrvFwCtrlOptimizeCurrentConsumption(void); +extern u8 DrvFwCtrlGetChipType(void); +extern void DrvFwCtrlGetCustomerFirmwareVersion(u16 *pMajor, u16 *pMinor, u8 **ppVersion); +extern void DrvFwCtrlGetPlatformFirmwareVersion(u8 **ppVersion); +extern void DrvFwCtrlHandleFingerTouch(void); +extern s32 DrvFwCtrlUpdateFirmware(u8 szFwData[][1024], EmemType_e eEmemType); +extern s32 DrvFwCtrlUpdateFirmwareBySdCard(const char *pFilePath); + +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC + +#endif /* __MSTAR_DRV_SELF_FW_CONTROL_H__ */ diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.c b/drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.c new file mode 100644 index 00000000..2aa3662d --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.c @@ -0,0 +1,2805 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_mp_test.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include "mstar_drv_self_mp_test.h" +#include "mstar_drv_utility_adaption.h" +#include "mstar_drv_self_fw_control.h" +#include "mstar_drv_platform_porting_layer.h" +#include "mstar_drv_ic_fw_porting_layer.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +// Modify. +#include "msg21xxa_open_test_ANA1_X.h" +#include "msg21xxa_open_test_ANA2_X.h" +#include "msg21xxa_open_test_ANA1_B_X.h" +#include "msg21xxa_open_test_ANA2_B_X.h" +#include "msg21xxa_open_test_ANA3_X.h" + +#include "msg21xxa_open_test_ANA1_Y.h" +#include "msg21xxa_open_test_ANA2_Y.h" +#include "msg21xxa_open_test_ANA1_B_Y.h" +#include "msg21xxa_open_test_ANA2_B_Y.h" +#include "msg21xxa_open_test_ANA3_Y.h" + +// Modify. +#include "msg21xxa_short_test_ANA1_X.h" +#include "msg21xxa_short_test_ANA2_X.h" +#include "msg21xxa_short_test_ANA3_X.h" +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +#include "msg21xxa_short_test_ANA4_X.h" +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + +#include "msg21xxa_short_test_ANA1_Y.h" +#include "msg21xxa_short_test_ANA2_Y.h" +#include "msg21xxa_short_test_ANA3_Y.h" +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +#include "msg21xxa_short_test_ANA4_Y.h" +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + +// Modify. +#include "msg22xx_open_test_RIU1_X.h" +#include "msg22xx_open_test_RIU2_X.h" +#include "msg22xx_open_test_RIU3_X.h" + +#include "msg22xx_open_test_RIU1_Y.h" +#include "msg22xx_open_test_RIU2_Y.h" +#include "msg22xx_open_test_RIU3_Y.h" + +// Modify. +#include "msg22xx_short_test_RIU1_X.h" +#include "msg22xx_short_test_RIU2_X.h" +#include "msg22xx_short_test_RIU3_X.h" +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +#include "msg22xx_short_test_RIU4_X.h" +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + +#include "msg22xx_short_test_RIU1_Y.h" +#include "msg22xx_short_test_RIU2_Y.h" +#include "msg22xx_short_test_RIU3_Y.h" +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +#include "msg22xx_short_test_RIU4_Y.h" +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + +/*=============================================================*/ +// PREPROCESSOR CONSTANT DEFINITION +/*=============================================================*/ + +// Modify. +#define TP_OF_X (1) //(2) +#define TP_OF_Y (4) + +/*=============================================================*/ +// EXTERN VARIABLE DECLARATION +/*=============================================================*/ + +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; + +extern u8 g_ChipType; + +extern struct i2c_client *g_I2cClient; +extern struct mutex g_Mutex; + +/*=============================================================*/ +// LOCAL VARIABLE DEFINITION +/*=============================================================*/ + +static u32 _gIsInMpTest = 0; +static u32 _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT; +static ItoTestMode_e _gItoTestMode = 0; + +static s32 _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING; +static u8 _gTestFailChannel[MAX_CHANNEL_NUM] = {0}; +static u32 _gTestFailChannelCount = 0; + +static struct work_struct _gCtpItoTestWork; +static struct workqueue_struct *_gCtpMpTestWorkQueue = NULL; + +static s16 _gRawData1[MAX_CHANNEL_NUM] = {0}; +static s16 _gRawData2[MAX_CHANNEL_NUM] = {0}; +static s16 _gRawData3[MAX_CHANNEL_NUM] = {0}; +static s16 _gRawData4[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag1[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag2[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag3[MAX_CHANNEL_NUM] = {0}; +static s8 _gDataFlag4[MAX_CHANNEL_NUM] = {0}; + +static u8 _gItoTestKeyNum = 0; +static u8 _gItoTestDummyNum = 0; +static u8 _gItoTestTriangleNum = 0; +static u8 _gIsEnable2R = 0; + + +static u8 _gLTP = 1; + +// _gOpen1~_gOpen3 are for MSG21XXA +static u16 *_gOpen1 = NULL; +static u16 *_gOpen1B = NULL; +static u16 *_gOpen2 = NULL; +static u16 *_gOpen2B = NULL; +static u16 *_gOpen3 = NULL; + +// _gShort_1~_gShort_4 are for MSG21XXA +static u16 *_gShort_1 = NULL; +static u16 *_gShort_2 = NULL; +static u16 *_gShort_3 = NULL; + +// _gShort_1_GPO~_gShort_4_GPO are for MSG21XXA +static u16 *_gShort_1_GPO = NULL; +static u16 *_gShort_2_GPO = NULL; +static u16 *_gShort_3_GPO = NULL; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +static u16 *_gShort_4 = NULL; +static u16 *_gShort_4_GPO = NULL; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + +static u8 _gIsOldFirmwareVersion = 0; + +// _gOpenRIU1~_gOpenRIU3 are for MSG22XX +static u32 *_gOpenRIU1 = NULL; +static u32 *_gOpenRIU2 = NULL; +static u32 *_gOpenRIU3 = NULL; + +// _gShort_RIU1~_gShort_RIU4 are for MSG22XX +static u32 *_gShort_RIU1 = NULL; +static u32 *_gShort_RIU2 = NULL; +static u32 *_gShort_RIU3 = NULL; + +// _gOpenSubFrameNum1~_gShortSubFrameNum4 are for MSG22XX +static u8 _gOpenSubFrameNum1 = 0; +static u8 _gOpenSubFrameNum2 = 0; +static u8 _gOpenSubFrameNum3 = 0; +static u8 _gShortSubFrameNum1 = 0; +static u8 _gShortSubFrameNum2 = 0; +static u8 _gShortSubFrameNum3 = 0; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +static u32 *_gShort_RIU4 = NULL; +static u8 _gShortSubFrameNum4 = 0; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + +static u8 *_gMAP1 = NULL; +static u8 *_gMAP2 = NULL; +static u8 *_gMAP3 = NULL; +static u8 *_gMAP40_1 = NULL; +static u8 *_gMAP40_2 = NULL; +static u8 *_gMAP41_1 = NULL; +static u8 *_gMAP41_2 = NULL; + +static u8 *_gSHORT_MAP1 = NULL; +static u8 *_gSHORT_MAP2 = NULL; +static u8 *_gSHORT_MAP3 = NULL; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +static u8 *_gMAP40_3 = NULL; +static u8 *_gMAP40_4 = NULL; +static u8 *_gMAP41_3 = NULL; +static u8 *_gMAP41_4 = NULL; + +static u8 *_gSHORT_MAP4 = NULL; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + +ItoTestResult_e _gItoTestResult = ITO_TEST_OK; + +/*=============================================================*/ +// EXTERN FUNCTION DECLARATION +/*=============================================================*/ + + +/*=============================================================*/ +// LOCAL FUNCTION DEFINITION +/*=============================================================*/ + +static u16 _DrvMpTestItoTestGetTpType(void) +{ + u16 nMajor = 0, nMinor = 0; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + u8 szDbBusTxData[3] = {0}; + u8 szDbBusRxData[4] = {0}; + + szDbBusTxData[0] = 0x53; + szDbBusTxData[1] = 0x00; + szDbBusTxData[2] = 0x2A; + + IicWriteData(SLAVE_I2C_ID_DWI2C, &szDbBusTxData[0], 3); + IicReadData(SLAVE_I2C_ID_DWI2C, &szDbBusRxData[0], 4); + + nMajor = (szDbBusRxData[1]<<8) + szDbBusRxData[0]; + nMinor = (szDbBusRxData[3]<<8) + szDbBusRxData[2]; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + u16 nRegData1, nRegData2; + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + + RegSet16BitValue(0x1600, 0xBFF4); // Set start address for customer firmware version on main block + + // Enable burst mode +// RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + nMajor = (((nRegData1 >> 8) & 0xFF) << 8) + (nRegData1 & 0xFF); + nMinor = (((nRegData2 >> 8) & 0xFF) << 8) + (nRegData2 & 0xFF); + + // Clear burst mode +// RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + mdelay(100); + } + + DBG("*** major = %d ***\n", nMajor); + DBG("*** minor = %d ***\n", nMinor); + + return nMajor; +} + +static u16 _DrvMpTestItoTestChooseTpType(void) +{ + u16 nTpType = 0; + u32 i = 0; + + DBG("*** %s() ***\n", __func__); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + // _gOpen1~_gOpen3 are for MSG21XXA + _gOpen1 = NULL; + _gOpen1B = NULL; + _gOpen2 = NULL; + _gOpen2B = NULL; + _gOpen3 = NULL; + + // _gShort_1~_gShort_4 are for MSG21XXA + _gShort_1 = NULL; + _gShort_2 = NULL; + _gShort_3 = NULL; + + _gShort_1_GPO = NULL; + _gShort_2_GPO = NULL; + _gShort_3_GPO = NULL; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gShort_4 = NULL; + _gShort_4_GPO = NULL; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + // _gOpenRIU1~_gOpenRIU3 are for MSG22XX + _gOpenRIU1 = NULL; + _gOpenRIU2 = NULL; + _gOpenRIU3 = NULL; + + // _gShort_RIU1~_gShort_RIU4 are for MSG22XX + _gShort_RIU1 = NULL; + _gShort_RIU2 = NULL; + _gShort_RIU3 = NULL; + + _gOpenSubFrameNum1 = 0; + _gOpenSubFrameNum2 = 0; + _gOpenSubFrameNum3 = 0; + _gShortSubFrameNum1 = 0; + _gShortSubFrameNum2 = 0; + _gShortSubFrameNum3 = 0; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gShort_RIU4 = NULL; + _gShortSubFrameNum4 = 0; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + } + + _gMAP1 = NULL; + _gMAP2 = NULL; + _gMAP3 = NULL; + _gMAP40_1 = NULL; + _gMAP40_2 = NULL; + _gMAP41_1 = NULL; + _gMAP41_2 = NULL; + + _gSHORT_MAP1 = NULL; + _gSHORT_MAP2 = NULL; + _gSHORT_MAP3 = NULL; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gMAP40_3 = NULL; + _gMAP40_4 = NULL; + _gMAP41_3 = NULL; + _gMAP41_4 = NULL; + + _gSHORT_MAP4 = NULL; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gItoTestKeyNum = 0; + _gItoTestDummyNum = 0; + _gItoTestTriangleNum = 0; + _gIsEnable2R = 0; + + for (i = 0; i < 10; i ++) + { + nTpType = _DrvMpTestItoTestGetTpType(); + DBG("nTpType = %d, i = %d\n", nTpType, i); + + if (TP_OF_X == nTpType || TP_OF_Y == nTpType) // Modify. + { + break; + } + else if (i < 5) + { + mdelay(100); + } + else + { + DrvPlatformLyrTouchDeviceResetHw(); + } + } + + if (TP_OF_X == nTpType) // Modify. + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _gOpen1 = MSG21XXA_open_1_X; + _gOpen1B = MSG21XXA_open_1B_X; + _gOpen2 = MSG21XXA_open_2_X; + _gOpen2B = MSG21XXA_open_2B_X; + _gOpen3 = MSG21XXA_open_3_X; + + _gShort_1 = MSG21XXA_short_1_X; + _gShort_2 = MSG21XXA_short_2_X; + _gShort_3 = MSG21XXA_short_3_X; + + _gShort_1_GPO = MSG21XXA_short_1_X_GPO; + _gShort_2_GPO = MSG21XXA_short_2_X_GPO; + _gShort_3_GPO = MSG21XXA_short_3_X_GPO; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gShort_4 = MSG21XXA_short_4_X; + _gShort_4_GPO = MSG21XXA_short_4_X_GPO; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gMAP1 = MSG21XXA_MAP1_X; + _gMAP2 = MSG21XXA_MAP2_X; + _gMAP3 = MSG21XXA_MAP3_X; + _gMAP40_1 = MSG21XXA_MAP40_1_X; + _gMAP40_2 = MSG21XXA_MAP40_2_X; + _gMAP41_1 = MSG21XXA_MAP41_1_X; + _gMAP41_2 = MSG21XXA_MAP41_2_X; + + _gSHORT_MAP1 = MSG21XXA_SHORT_MAP1_X; + _gSHORT_MAP2 = MSG21XXA_SHORT_MAP2_X; + _gSHORT_MAP3 = MSG21XXA_SHORT_MAP3_X; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gMAP40_3 = MSG21XXA_MAP40_3_X; + _gMAP40_4 = MSG21XXA_MAP40_4_X; + _gMAP41_3 = MSG21XXA_MAP41_3_X; + _gMAP41_4 = MSG21XXA_MAP41_4_X; + + _gSHORT_MAP4 = MSG21XXA_SHORT_MAP4_X; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gItoTestKeyNum = MSG21XXA_NUM_KEY_X; + _gItoTestDummyNum = MSG21XXA_NUM_DUMMY_X; + _gItoTestTriangleNum = MSG21XXA_NUM_SENSOR_X; + _gIsEnable2R = MSG21XXA_ENABLE_2R_X; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gOpenRIU1 = MSG22XX_open_1_X; + _gOpenRIU2 = MSG22XX_open_2_X; + _gOpenRIU3 = MSG22XX_open_3_X; + + _gShort_RIU1 = MSG22XX_short_1_X; + _gShort_RIU2 = MSG22XX_short_2_X; + _gShort_RIU3 = MSG22XX_short_3_X; + + _gOpenSubFrameNum1 = MSG22XX_NUM_OPEN_1_SENSOR_X; + _gOpenSubFrameNum2 = MSG22XX_NUM_OPEN_2_SENSOR_X; + _gOpenSubFrameNum3 = MSG22XX_NUM_OPEN_3_SENSOR_X; + _gShortSubFrameNum1 = MSG22XX_NUM_SHORT_1_SENSOR_X; + _gShortSubFrameNum2 = MSG22XX_NUM_SHORT_2_SENSOR_X; + _gShortSubFrameNum3 = MSG22XX_NUM_SHORT_3_SENSOR_X; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gShort_RIU4 = MSG22XX_short_4_X; + _gShortSubFrameNum4 = MSG22XX_NUM_SHORT_4_SENSOR_X; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gMAP1 = MSG22XX_MAP1_X; + _gMAP2 = MSG22XX_MAP2_X; + _gMAP3 = MSG22XX_MAP3_X; + _gMAP40_1 = MSG22XX_MAP40_1_X; + _gMAP40_2 = MSG22XX_MAP40_2_X; + _gMAP41_1 = MSG22XX_MAP41_1_X; + _gMAP41_2 = MSG22XX_MAP41_2_X; + + _gSHORT_MAP1 = MSG22XX_SHORT_MAP1_X; + _gSHORT_MAP2 = MSG22XX_SHORT_MAP2_X; + _gSHORT_MAP3 = MSG22XX_SHORT_MAP3_X; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gMAP40_3 = MSG22XX_MAP40_3_X; + _gMAP40_4 = MSG22XX_MAP40_4_X; + _gMAP41_3 = MSG22XX_MAP41_3_X; + _gMAP41_4 = MSG22XX_MAP41_4_X; + + _gSHORT_MAP4 = MSG22XX_SHORT_MAP4_X; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gItoTestKeyNum = MSG22XX_NUM_KEY_X; + _gItoTestDummyNum = MSG22XX_NUM_DUMMY_X; + _gItoTestTriangleNum = MSG22XX_NUM_SENSOR_X; + _gIsEnable2R = MSG22XX_ENABLE_2R_X; + } + } + else if (TP_OF_Y == nTpType) // Modify. + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _gOpen1 = MSG21XXA_open_1_Y; + _gOpen1B = MSG21XXA_open_1B_Y; + _gOpen2 = MSG21XXA_open_2_Y; + _gOpen2B = MSG21XXA_open_2B_Y; + _gOpen3 = MSG21XXA_open_3_Y; + + _gShort_1 = MSG21XXA_short_1_Y; + _gShort_2 = MSG21XXA_short_2_Y; + _gShort_3 = MSG21XXA_short_3_Y; + + _gShort_1_GPO = MSG21XXA_short_1_Y_GPO; + _gShort_2_GPO = MSG21XXA_short_2_Y_GPO; + _gShort_3_GPO = MSG21XXA_short_3_Y_GPO; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gShort_4 = MSG21XXA_short_4_Y; + _gShort_4_GPO = MSG21XXA_short_4_Y_GPO; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gMAP1 = MSG21XXA_MAP1_Y; + _gMAP2 = MSG21XXA_MAP2_Y; + _gMAP3 = MSG21XXA_MAP3_Y; + _gMAP40_1 = MSG21XXA_MAP40_1_Y; + _gMAP40_2 = MSG21XXA_MAP40_2_Y; + _gMAP41_1 = MSG21XXA_MAP41_1_Y; + _gMAP41_2 = MSG21XXA_MAP41_2_Y; + + _gSHORT_MAP1 = MSG21XXA_SHORT_MAP1_Y; + _gSHORT_MAP2 = MSG21XXA_SHORT_MAP2_Y; + _gSHORT_MAP3 = MSG21XXA_SHORT_MAP3_Y; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gMAP40_3 = MSG21XXA_MAP40_3_Y; + _gMAP40_4 = MSG21XXA_MAP40_4_Y; + _gMAP41_3 = MSG21XXA_MAP41_3_Y; + _gMAP41_4 = MSG21XXA_MAP41_4_Y; + + _gSHORT_MAP4 = MSG21XXA_SHORT_MAP4_Y; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gItoTestKeyNum = MSG21XXA_NUM_KEY_Y; + _gItoTestDummyNum = MSG21XXA_NUM_DUMMY_Y; + _gItoTestTriangleNum = MSG21XXA_NUM_SENSOR_Y; + _gIsEnable2R = MSG21XXA_ENABLE_2R_Y; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gOpenRIU1 = MSG22XX_open_1_Y; + _gOpenRIU2 = MSG22XX_open_2_Y; + _gOpenRIU3 = MSG22XX_open_3_Y; + + _gShort_RIU1 = MSG22XX_short_1_Y; + _gShort_RIU2 = MSG22XX_short_2_Y; + _gShort_RIU3 = MSG22XX_short_3_Y; + + _gOpenSubFrameNum1 = MSG22XX_NUM_OPEN_1_SENSOR_Y; + _gOpenSubFrameNum2 = MSG22XX_NUM_OPEN_2_SENSOR_Y; + _gOpenSubFrameNum3 = MSG22XX_NUM_OPEN_3_SENSOR_Y; + _gShortSubFrameNum1 = MSG22XX_NUM_SHORT_1_SENSOR_Y; + _gShortSubFrameNum2 = MSG22XX_NUM_SHORT_2_SENSOR_Y; + _gShortSubFrameNum3 = MSG22XX_NUM_SHORT_3_SENSOR_Y; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gShort_RIU4 = MSG22XX_short_4_Y; + _gShortSubFrameNum4 = MSG22XX_NUM_SHORT_4_SENSOR_Y; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gMAP1 = MSG22XX_MAP1_Y; + _gMAP2 = MSG22XX_MAP2_Y; + _gMAP3 = MSG22XX_MAP3_Y; + _gMAP40_1 = MSG22XX_MAP40_1_Y; + _gMAP40_2 = MSG22XX_MAP40_2_Y; + _gMAP41_1 = MSG22XX_MAP41_1_Y; + _gMAP41_2 = MSG22XX_MAP41_2_Y; + + _gSHORT_MAP1 = MSG22XX_SHORT_MAP1_Y; + _gSHORT_MAP2 = MSG22XX_SHORT_MAP2_Y; + _gSHORT_MAP3 = MSG22XX_SHORT_MAP3_Y; + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + _gMAP40_3 = MSG22XX_MAP40_3_Y; + _gMAP40_4 = MSG22XX_MAP40_4_Y; + _gMAP41_3 = MSG22XX_MAP41_3_Y; + _gMAP41_4 = MSG22XX_MAP41_4_Y; + + _gSHORT_MAP4 = MSG22XX_SHORT_MAP4_Y; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + _gItoTestKeyNum = MSG22XX_NUM_KEY_Y; + _gItoTestDummyNum = MSG22XX_NUM_DUMMY_Y; + _gItoTestTriangleNum = MSG22XX_NUM_SENSOR_Y; + _gIsEnable2R = MSG22XX_ENABLE_2R_Y; + } + } + else + { + nTpType = 0; + } + + return nTpType; +} + +static void _DrvMpTestItoTestAnaSwReset(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x1100, 0xFFFF); // reset ANA - analog + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + RegSet16BitValueOn(0x130C, BIT1); // reset Filter - digital + } + + RegSet16BitValue(0x1100, 0x0000); + mdelay(15); +} + +//------------------------------------------------------------------------------// + + +static u16 _DrvMpTestItoTestGetNum(void) +{ + u32 i; + u16 nSensorNum = 0; + u16 nRegVal1, nRegVal2; + + DBG("*** %s() ***\n", __func__); + + nRegVal1 = RegGet16BitValue(0x114A); //bank:ana, addr:h0025 + DBG("nRegValue1 = %d\n", nRegVal1); + + if ((nRegVal1 & BIT1) == BIT1) + { + nRegVal1 = RegGet16BitValue(0x120A); //bank:ana2, addr:h0005 + nRegVal1 = nRegVal1 & 0x0F; + + nRegVal2 = RegGet16BitValue(0x1216); //bank:ana2, addr:h000b + nRegVal2 = ((nRegVal2 >> 1) & 0x0F) + 1; + + nSensorNum = nRegVal1 * nRegVal2; + } + else + { + for (i = 0; i < 4; i ++) + { + nSensorNum += (RegGet16BitValue(0x120A)>>(4*i))&0x0F; //bank:ana2, addr:h0005 + } + } + DBG("nSensorNum = %d\n", nSensorNum); + + return nSensorNum; +} + +static void _DrvMpTestItoTestDisableFilterNoiseDetect(void) +{ + u16 nRegValue; + + DBG("*** %s() ***\n", __func__); + + // Disable DIG/ANA drop + nRegValue = RegGet16BitValue(0x1302); + + RegSet16BitValue(0x1302, nRegValue & (~(BIT2 | BIT1 | BIT0))); +} + +static void _DrvMpTestItoTestPolling(void) +{ + u16 nRegInt = 0x0000; + u16 nRegVal; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValue(0x130C, BIT15); //bank:fir, addr:h0006 + RegSet16BitValue(0x1214, (RegGet16BitValue(0x1214) | BIT0)); //bank:ana2, addr:h000a + + DBG("polling start\n"); + + do + { + nRegInt = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c + } while(( nRegInt & FIQ_E_FRAME_READY_MASK ) == 0x0000); + + DBG("polling end\n"); + + nRegVal = RegGet16BitValue(0x3D18); + RegSet16BitValue(0x3D18, nRegVal & (~FIQ_E_FRAME_READY_MASK)); +} + +static void _DrvMpTestItoOpenTestSetV(u8 nEnable, u8 nPrs) +{ + u16 nRegVal; + + DBG("*** %s() nEnable = %d, nPrs = %d ***\n", __func__, nEnable, nPrs); + + nRegVal = RegGet16BitValue(0x1208); //bank:ana2, addr:h0004 + nRegVal = nRegVal & 0xF1; + + if (nPrs == 0) + { + RegSet16BitValue(0x1208, nRegVal|0x0C); + } + else if (nPrs == 1) + { + RegSet16BitValue(0x1208, nRegVal|0x0E); + } + else + { + RegSet16BitValue(0x1208, nRegVal|0x02); + } + + if (nEnable) + { + nRegVal = RegGet16BitValue(0x1106); //bank:ana, addr:h0003 + RegSet16BitValue(0x1106, nRegVal|0x03); + } + else + { + nRegVal = RegGet16BitValue(0x1106); + nRegVal = nRegVal & 0xFC; + RegSet16BitValue(0x1106, nRegVal); + } +} + +static u16 _DrvMpTestItoTestMsg21xxaGetDataOut(s16 *pRawData) +{ + u32 i; + u16 szRawData[MAX_CHANNEL_NUM] = {0}; + u16 nSensorNum; + u16 nRegInt; + u8 szDbBusTxData[8] = {0}; + u8 szDbBusRxData[MAX_CHANNEL_NUM*2] = {0}; + + DBG("*** %s() ***\n", __func__); + + nSensorNum = _DrvMpTestItoTestGetNum(); + + if ((nSensorNum*2) > (MAX_CHANNEL_NUM*2)) + { + DBG("Danger. nSensorNum = %d\n", nSensorNum); + return nSensorNum; + } + + nRegInt = RegGet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1)); + RegSet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1), (nRegInt & (u16)(~FIQ_E_FRAME_READY_MASK))); + + _DrvMpTestItoTestPolling(); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x13; //bank:fir, addr:h0020 + szDbBusTxData[2] = 0x40; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + mdelay(20); + IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (nSensorNum * 2)); + mdelay(100); + + for (i = 0; i < nSensorNum * 2; i ++) + { + DBG("szDbBusRxData[%d] = %d\n", i, szDbBusRxData[i]); // add for debug + } + + nRegInt = RegGet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1)); + RegSet16BitValue((0x3d<<8) | (REG_INTR_FIQ_MASK<<1), (nRegInt | (u16)FIQ_E_FRAME_READY_MASK)); + + for (i = 0; i < nSensorNum; i ++) + { + szRawData[i] = (szDbBusRxData[2 * i + 1] << 8 ) | (szDbBusRxData[2 * i]); + pRawData[i] = (s16)szRawData[i]; + } + + return nSensorNum; +} + +static void _DrvMpTestItoTestMsg21xxaSendDataIn(u8 nStep) +{ + u32 i; + u16 *pType = NULL; + u8 szDbBusTxData[512] = {0}; + + DBG("*** %s() nStep = %d ***\n", __func__, nStep); + + if (nStep == 1) //39-1 + { + pType = &_gShort_1[0]; + } + else if (nStep == 2) //39-2 + { + pType = &_gShort_2[0]; + } + else if (nStep == 3) //39-3 + { + pType = &_gShort_3[0]; + } +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nStep == 0) //39-4 (2R) + { + pType = &_gShort_4[0]; + } +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nStep == 4) + { + pType = &_gOpen1[0]; + } + else if (nStep == 5) + { + pType = &_gOpen2[0]; + } + else if (nStep == 6) + { + pType = &_gOpen3[0]; + } + else if (nStep == 9) + { + pType = &_gOpen1B[0]; + } + else if (nStep == 10) + { + pType = &_gOpen2B[0]; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x11; //bank:ana, addr:h0000 + szDbBusTxData[2] = 0x00; + for (i = 0; i <= 0x3E ; i ++) + { + szDbBusTxData[3+2*i] = pType[i] & 0xFF; + szDbBusTxData[4+2*i] = (pType[i] >> 8) & 0xFF; + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+0x3F*2); + + szDbBusTxData[2] = 0x7A * 2; //bank:ana, addr:h007a + for (i = 0x7A; i <= 0x7D ; i ++) + { + szDbBusTxData[3+2*(i-0x7A)] = 0; + szDbBusTxData[4+2*(i-0x7A)] = 0; + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+8); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x12; //bank:ana2, addr:h0005 + + szDbBusTxData[2] = 0x05 * 2; + szDbBusTxData[3] = pType[128+0x05] & 0xFF; + szDbBusTxData[4] = (pType[128+0x05] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + szDbBusTxData[2] = 0x0B * 2; //bank:ana2, addr:h000b + szDbBusTxData[3] = pType[128+0x0B] & 0xFF; + szDbBusTxData[4] = (pType[128+0x0B] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + szDbBusTxData[2] = 0x12 * 2; //bank:ana2, addr:h0012 + szDbBusTxData[3] = pType[128+0x12] & 0xFF; + szDbBusTxData[4] = (pType[128+0x12] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + szDbBusTxData[2] = 0x15 * 2; //bank:ana2, addr:h0015 + szDbBusTxData[3] = pType[128+0x15] & 0xFF; + szDbBusTxData[4] = (pType[128+0x15] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 5); + + if (_gItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { +//#if 1 //for AC mod + szDbBusTxData[1] = 0x13; + szDbBusTxData[2] = 0x12 * 2; + szDbBusTxData[3] = 0x30; + szDbBusTxData[4] = 0x30; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + + szDbBusTxData[2] = 0x14 * 2; + szDbBusTxData[3] = 0X30; + szDbBusTxData[4] = 0X30; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + + szDbBusTxData[1] = 0x12; + for (i = 0x0D; i <= 0x10; i ++) //for AC noise(++) + { + szDbBusTxData[2] = i * 2; + szDbBusTxData[3] = pType[128+i] & 0xFF; + szDbBusTxData[4] = (pType[128+i] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + } + + for (i = 0x16; i <= 0x18; i ++) //for AC noise + { + szDbBusTxData[2] = i * 2; + szDbBusTxData[3] = pType[128+i] & 0xFF; + szDbBusTxData[4] = (pType[128+i] >> 8) & 0xFF; + IicWriteData(SLAVE_I2C_ID_DBBUS, szDbBusTxData, 5); + } +//#endif + } +} + +static void _DrvMpTestItoOpenTestMsg21xxaSetC(u8 nCSubStep) +{ + u32 i; + u8 szDbBusTxData[MAX_CHANNEL_NUM+3]; + u8 nHighLevelCSub = 0; + u8 nCSubNew; + + DBG("*** %s() nCSubStep = %d ***\n", __func__, nCSubStep); + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x11; //bank:ana, addr:h0042 + szDbBusTxData[2] = 0x84; + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nCSubNew = nCSubStep; + nHighLevelCSub = 0; + + if (nCSubNew > 0x1F) + { + nCSubNew = nCSubNew - 0x14; + nHighLevelCSub = 1; + } + + szDbBusTxData[3+i] = nCSubNew & 0x1F; + if (nHighLevelCSub == 1) + { + szDbBusTxData[3+i] |= BIT5; + } + } + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], MAX_CHANNEL_NUM+3); + + szDbBusTxData[2] = 0xB4; //bank:ana, addr:h005a + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], MAX_CHANNEL_NUM+3); +} + +static void _DrvMpTestItoOpenTestMsg21xxaFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i, j; + s16 szTmpRawData[MAX_CHANNEL_NUM] = {0}; + u16 nRegVal; + u8 nLoop; + u8 nSensorNum1 = 0, nSensorNum2 = 0, nTotalSensor = 0; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + RegSet16BitValue(0x1E24, 0x0500); //bank:chip, addr:h0012 + RegSet16BitValue(0x1E2A, 0x0000); //bank:chip, addr:h0015 + RegSet16BitValue(0x1EE6, 0x6E00); //bank:chip, addr:h0073 + RegSet16BitValue(0x1EE8, 0x0071); //bank:chip, addr:h0074 + + if (nItemId == 40) + { + pMapping = &_gMAP1[0]; + if (_gIsEnable2R) + { + nTotalSensor = _gItoTestTriangleNum/2; + } + else + { + nTotalSensor = _gItoTestTriangleNum/2 + _gItoTestKeyNum + _gItoTestDummyNum; + } + } + else if (nItemId == 41) + { + pMapping = &_gMAP2[0]; + if (_gIsEnable2R) + { + nTotalSensor = _gItoTestTriangleNum/2; + } + else + { + nTotalSensor = _gItoTestTriangleNum/2 + _gItoTestKeyNum + _gItoTestDummyNum; + } + } + else if (nItemId == 42) + { + pMapping = &_gMAP3[0]; + nTotalSensor = _gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum; + } + + nLoop = 1; + if (nItemId != 42) + { + if (nTotalSensor > 11) + { + nLoop = 2; + } + } + + DBG("nLoop = %d\n", nLoop); + + for (i = 0; i < nLoop; i ++) + { + if (i == 0) + { + _DrvMpTestItoTestMsg21xxaSendDataIn(nItemId - 36); + } + else + { + if (nItemId == 40) + { + _DrvMpTestItoTestMsg21xxaSendDataIn(9); + } + else + { + _DrvMpTestItoTestMsg21xxaSendDataIn(10); + } + } + + _DrvMpTestItoTestDisableFilterNoiseDetect(); + + _DrvMpTestItoOpenTestSetV(1, 0); + nRegVal = RegGet16BitValue(0x110E); //bank:ana, addr:h0007 + RegSet16BitValue(0x110E, nRegVal | BIT11); + + if (_gLTP == 1) + { + _DrvMpTestItoOpenTestMsg21xxaSetC(32); + } + else + { + _DrvMpTestItoOpenTestMsg21xxaSetC(0); + } + + _DrvMpTestItoTestAnaSwReset(); + + if (i == 0) + { + nSensorNum1 = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData); + DBG("nSensorNum1 = %d\n", nSensorNum1); + } + else + { + nSensorNum2 = _DrvMpTestItoTestMsg21xxaGetDataOut(&szTmpRawData[nSensorNum1]); + DBG("nSensorNum1 = %d, nSensorNum2 = %d\n", nSensorNum1, nSensorNum2); + } + } + + for (j = 0; j < nTotalSensor; j ++) + { + if (_gLTP == 1) + { + pRawData[pMapping[j]] = szTmpRawData[j] + 4096; + pDataFlag[pMapping[j]] = 1; + } + else + { + pRawData[pMapping[j]] = szTmpRawData[j]; + pDataFlag[pMapping[j]] = 1; + } + } +} + +static void _DrvMpTestItoShortTestChangeGPOSetting(u8 nItemId) +{ + u8 szDbBusTxData[3+GPO_SETTING_SIZE*2] = {0}; + u16 szGPOSetting[3] = {0}; + u32 i; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 1) // 39-1 + { + szGPOSetting[0] = _gShort_1_GPO[0]; + szGPOSetting[1] = _gShort_1_GPO[1]; + szGPOSetting[2] = _gShort_1_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } + else if (nItemId == 2) // 39-2 + { + szGPOSetting[0] = _gShort_2_GPO[0]; + szGPOSetting[1] = _gShort_2_GPO[1]; + szGPOSetting[2] = _gShort_2_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } + else if (nItemId == 3) // 39-3 + { + szGPOSetting[0] = _gShort_3_GPO[0]; + szGPOSetting[1] = _gShort_3_GPO[1]; + szGPOSetting[2] = _gShort_3_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nItemId == 0) // 39-4 (2R) + { + szGPOSetting[0] = _gShort_4_GPO[0]; + szGPOSetting[1] = _gShort_4_GPO[1]; + szGPOSetting[2] = _gShort_4_GPO[2]; + szGPOSetting[2] |= (1 << (int)(PIN_GUARD_RING % 16)); + } +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else + { + DBG("Invalid item id for changing GPIO setting of short test.\n"); + + return; + } + + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x12; + szDbBusTxData[2] = 0x48; + + for (i = 0; i < GPO_SETTING_SIZE; i ++) + { + szDbBusTxData[3+2*i] = szGPOSetting[i] & 0xFF; + szDbBusTxData[4+2*i] = (szGPOSetting[i] >> 8) & 0xFF; + } + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3+GPO_SETTING_SIZE*2); +} + +static void _DrvMpTestItoShortTestChangeRmodeSetting(u8 nMode) +{ + u8 szDbBusTxData[6] = {0}; + + DBG("*** %s() nMode = %d ***\n", __func__, nMode); + + // AFE R-mode enable(Bit-12) + RegSetLByteValue(0x1103, 0x10); + + // drv_mux_OV (Bit-8 1:enable) + RegSetLByteValue(0x1107, 0x55); + + if (nMode == 1) // P_CODE: 0V + { + RegSet16BitValue(0x110E, 0x073A); + } + else if (nMode == 0) // N_CODE: 2.4V + { + RegSet16BitValue(0x110E, 0x073B); + } + + // SW2 rising & SW3 rising return to 0 + RegSetLByteValue(0x1227, 0x01); + // turn off the chopping + RegSetLByteValue(0x1208, 0x0C); + // idle driver ov + RegSetLByteValue(0x1241, 0xC0); + + // AFE ov + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x12; + szDbBusTxData[2] = 0x44; + szDbBusTxData[3] = 0xFF; + szDbBusTxData[4] = 0xFF; + szDbBusTxData[5] = 0xFF; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 6); +} + +static void _DrvMpTestItoShortTestMsg21xxaFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i; + s16 szTmpRawData[MAX_CHANNEL_NUM] = {0}; + s16 szTmpRawData2[MAX_CHANNEL_NUM] = {0}; + u8 nSensorNum, nSensorNum2, nNumOfSensorMapping1, nNumOfSensorMapping2, nSensorCount = 0; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + // chip top op0 + RegSet16BitValue(0x1E24, 0x0500); //bank:chip, addr:h0012 + RegSet16BitValue(0x1E2A, 0x0000); //bank:chip, addr:h0015 + RegSet16BitValue(0x1EE6, 0x6E00); //bank:chip, addr:h0073 + RegSet16BitValue(0x1EE8, 0x0071); //bank:chip, addr:h0074 + + if ((_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) % 2 != 0) + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2 + 1; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + } + else + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + if (nNumOfSensorMapping2 % 2 != 0) + { + nNumOfSensorMapping2 ++; + } + } + + if (nItemId == 1) // 39-1 + { + pMapping = &_gSHORT_MAP1[0]; + nSensorCount = nNumOfSensorMapping1; + } + else if (nItemId == 2) // 39-2 + { + pMapping = &_gSHORT_MAP2[0]; + nSensorCount = nNumOfSensorMapping2; + } + else if (nItemId == 3) // 39-3 + { + pMapping = &_gSHORT_MAP3[0]; + nSensorCount = _gItoTestTriangleNum; + } +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nItemId == 0) // 39-4 (2R) + { + pMapping = &_gSHORT_MAP4[0]; + nSensorCount = _gItoTestTriangleNum/2; + } +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + DBG("nSensorCount = %d\n", nSensorCount); + + _DrvMpTestItoTestMsg21xxaSendDataIn(nItemId); + + _DrvMpTestItoTestDisableFilterNoiseDetect(); + + _DrvMpTestItoShortTestChangeRmodeSetting(1); + _DrvMpTestItoShortTestChangeGPOSetting(nItemId); + _DrvMpTestItoTestAnaSwReset(); + nSensorNum = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData); + DBG("nSensorNum = %d\n", nSensorNum); + + _DrvMpTestItoShortTestChangeRmodeSetting(0); + _DrvMpTestItoShortTestChangeGPOSetting(nItemId); + _DrvMpTestItoTestAnaSwReset(); + nSensorNum2 = _DrvMpTestItoTestMsg21xxaGetDataOut(szTmpRawData2); + DBG("nSensorNum2 = %d\n", nSensorNum2); + + for (i = 0; i < nSensorCount; i ++) + { + pRawData[pMapping[i]] = szTmpRawData[i] - szTmpRawData2[i]; + pDataFlag[pMapping[i]] = 1; + } +} + + +static u16 _DrvMpTestItoTestMsg22xxGetDataOut(s16 *pRawData, u16 nSubFrameNum) +{ + u32 i; + u16 szRawData[MAX_CHANNEL_NUM*2] = {0}; + u16 nRegInt = 0x0000; + u16 nSize = nSubFrameNum * 4; // 1SF 4AFE + u8 szDbBusTxData[8] = {0}; + u8 szDbBusRxData[MAX_CHANNEL_NUM*4] = {0}; + + DBG("*** %s() ***\n", __func__); + + RegSet16BitValueOff(0x120A, BIT1); //one-shot mode + RegSet16BitValueOff(0x3D08, BIT8); //FIQ_E_FRAME_READY_MASK + //RegSet16BitValue(0x130C, BIT15); //MCU read done + RegSet16BitValueOn(0x120A, BIT0); //trigger one-shot + + DBG("polling start\n"); + + //Polling frame-ready interrupt status + do + { + nRegInt = RegGet16BitValue(0x3D18); //bank:intr_ctrl, addr:h000c + } while(( nRegInt & FIQ_E_FRAME_READY_MASK ) == 0x0000); + + DBG("polling end\n"); + + RegSet16BitValueOff(0x3D18, BIT8); //Clear frame-ready interrupt status + + //ReadRegBurst start + szDbBusTxData[0] = 0x10; + szDbBusTxData[1] = 0x15; //bank:fout, addr:h0000 + szDbBusTxData[2] = 0x00; + IicWriteData(SLAVE_I2C_ID_DBBUS, &szDbBusTxData[0], 3); + mdelay(20); + IicReadData(SLAVE_I2C_ID_DBBUS, &szDbBusRxData[0], (nSubFrameNum * 4 * 2)); + mdelay(100); + + for (i = 0; i < (nSubFrameNum * 4 * 2); i ++) + { + DBG("szDbBusRxData[%d] = %d\n", i, szDbBusRxData[i]); // add for debug + } + //ReadRegBurst stop + + RegSet16BitValueOn(0x3D08, BIT8); //FIQ_E_FRAME_READY_MASK + + for (i = 0; i < nSize; i ++) + { + szRawData[i] = (szDbBusRxData[2 * i + 1] << 8 ) | (szDbBusRxData[2 * i]); + pRawData[i] = (s16)szRawData[i]; + } + + return nSize; +} + +static void _DrvMpTestItoTestMsg22xxSendDataIn(u8 nStep, u16 nRiuWriteLength) +{ + u32 i; + u32 *pType = NULL; + + DBG("*** %s() nStep = %d, nRiuWriteLength = %d ***\n", __func__, nStep, nRiuWriteLength); + + if (nStep == 1) //39-1 + { + pType = &_gShort_RIU1[0]; + } + else if (nStep == 2) //39-2 + { + pType = &_gShort_RIU2[0]; + } + else if (nStep == 3) //39-3 + { + pType = &_gShort_RIU3[0]; + } +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nStep == 0) //39-4 (2R) + { + pType = &_gShort_RIU4[0]; + } +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nStep == 4) + { + pType = &_gOpenRIU1[0]; + } + else if (nStep == 5) + { + pType = &_gOpenRIU2[0]; + } + else if (nStep == 6) + { + pType = &_gOpenRIU3[0]; + } + + RegSet16BitValueOn(0x1192, BIT4); // force on enable sensor mux and csub sel sram clock + RegSet16BitValueOff(0x1192, BIT5); // mem clk sel + RegSet16BitValueOff(0x1100, BIT3); // tgen soft rst + RegSet16BitValue(0x1180, RIU_BASE_ADDR); // sensor mux sram read/write base address + RegSet16BitValue(0x1182, nRiuWriteLength); // sensor mux sram write length + RegSet16BitValueOn(0x1188, BIT0); // reg_mem0_w_start + + for (i = RIU_BASE_ADDR; i < (RIU_BASE_ADDR + nRiuWriteLength); i ++) + { + RegSet16BitValue(0x118A, (u16)(pType[i])); + RegSet16BitValue(0x118C, (u16)(pType[i] >> 16)); + } +} + +static void _DrvMpTestItoTestMsg22xxSetC(u8 nCSubStep) +{ + u32 i; + u16 nRegVal; + u32 nCSubNew; + + DBG("*** %s() nCSubStep = %d ***\n", __func__, nCSubStep); + + nCSubNew = (nCSubStep > CSUB_REF_MAX) ? CSUB_REF_MAX : nCSubStep; // 6 bits + nCSubNew = (nCSubNew | (nCSubNew << 8) | (nCSubNew << 16) | (nCSubNew << 24)); + + nRegVal = RegGet16BitValue(0x11C8); // csub sel overwrite enable, will referance value of 11C0 + + if (nRegVal == 0x000F) + { + RegSet16BitValue(0x11C0, nCSubNew); // prs 0 + RegSet16BitValue(0x11C2, (nCSubNew >> 16)); // prs 0 + RegSet16BitValue(0x11C4, nCSubNew); // prs 1 + RegSet16BitValue(0x11C6, (nCSubNew >> 16)); // prs 1 + } + else + { + RegSet16BitValueOn(0x1192, BIT4); // force on enable sensor mux and csub sel sram clock + RegSet16BitValueOff(0x1192, BIT5); // mem clk sel + RegSet16BitValueOff(0x1100, BIT3); // tgen soft rst + RegSet16BitValue(0x1184, 0); // nAddr + RegSet16BitValue(0x1186, MAX_CHANNEL_NUM); // nLen + RegSet16BitValueOn(0x1188, BIT2); // reg_mem0_w_start + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + RegSet16BitValue(0x118E, nCSubNew); + RegSet16BitValue(0x1190, (nCSubNew >> 16)); + } + } +} + +static void _DrvMpTestItoTestMsg22xxRegisterReset(void) +{ + DBG("*** %s() ***\n", __func__); + + RegSet16BitValueOn(0x1102, (BIT3 | BIT4 | BIT5 | BIT6 | BIT7)); + RegSet16BitValueOff(0x1130, (BIT0 | BIT1 | BIT2 | BIT3 | BIT8)); + + RegSet16BitValueOn(0x1312, BIT15); + RegSet16BitValueOff(0x1312, BIT13); + + RegMask16BitValue(0x1250, 0x007F, ((5 << 0) & 0x007F), ADDRESS_MODE_8BIT); + + RegMask16BitValue(0x1250, 0x7F00, ((1 << 8) & 0x7F00), ADDRESS_MODE_8BIT); + + RegSet16BitValueOff(0x1250, 0x8080); + + RegSet16BitValueOff(0x1312, (BIT12 | BIT14)); + + RegSet16BitValueOn(0x1300, BIT15); + RegSet16BitValueOff(0x1300, (BIT10 | BIT11 | BIT12 | BIT13 | BIT14)); + + RegSet16BitValueOn(0x1130, BIT9); + + RegSet16BitValueOn(0x1318, (BIT12 | BIT13)); + + RegSet16BitValue(0x121A, ((8 - 1) & 0x01FF)); // sampling number group A + RegSet16BitValue(0x121C, ((8 - 1) & 0x01FF)); // sampling number group B + + RegMask16BitValue(0x131A, 0x3FFF, 0x2000, ADDRESS_MODE_8BIT); + + RegMask16BitValue(0x131C, (BIT8 | BIT9 | BIT10), (2 << 8), ADDRESS_MODE_8BIT); + + RegSet16BitValueOff(0x1174, 0x0F00); + + RegSet16BitValueOff(0x1240, 0xFFFF); // mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + RegSet16BitValueOff(0x1242, 0x00FF); // mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + + RegSet16BitValueOn(0x1212, 0xFFFF); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B + RegSet16BitValueOn(0x1214, 0x00FF); // timing group A/B selection for total 24 subframes, 0: group A, 1: group B + + RegSet16BitValueOn(0x121E, 0xFFFF); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B + RegSet16BitValueOn(0x1220, 0x00FF); //sample number group A/B selection for total 24 subframes, 0: group A, 1: group B + + RegSet16BitValueOff(0x120E, 0xFFFF); // noise sense mode selection for total 24 subframes + RegSet16BitValueOff(0x1210, 0x00FF); // noise sense mode selection for total 24 subframes + + RegSet16BitValue(0x128C, 0x0F); // ADC afe gain correction bypass + RegSet16BitValueOff(0x1104, BIT12); +} + +static void _DrvMpTestItoTestMsg22xxRegisterResetPatch(void) +{ + DBG("*** %s() *** _gIsOldFirmwareVersion = %d\n", __func__, _gIsOldFirmwareVersion); + + if (_gIsOldFirmwareVersion == 0) // Only need to patch register reset for MSG22XX firmware older than V01.005.02; + { + return; + } + + RegMask16BitValue(0x1101, 0xFFFF, 0x501E, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1102, 0x7FFF, 0x06FF, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1104, 0x0FFF, 0x0772, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1105, 0x0FFF, 0x0770, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1106, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1107, 0x0003, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1108, 0x0073, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1109, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x110A, 0x7FFF, 0x1087, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x110E, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x110F, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1117, 0xFF0F, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1118, 0xFFFF, 0x0200, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1119, 0x00FF, 0x000E, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x111E, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x111F, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1133, 0x000F, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x113A, 0x0F37, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x113B, 0x0077, 0x0077, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x113C, 0xFF00, 0xA000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x113D, 0x0077, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x113E, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + + RegMask16BitValue(0x1204, 0x0006, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1205, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1207, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1208, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1209, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x120A, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x120B, 0x003F, 0x002E, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x120D, 0x001F, 0x0005, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x120E, 0x001F, 0x0005, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x120F, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1210, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1211, 0x0FFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1212, 0x1F87, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1213, 0x0F7F, 0x0014, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1214, 0xFF9F, 0x090A, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1215, 0x0F7F, 0x0F0C, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1216, 0x0FFF, 0x0700, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1217, 0xFF1F, 0x5C0A, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1218, 0x1F7F, 0x0A14, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1219, 0xFFFF, 0x218C, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x121E, 0x1F1F, 0x0712, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x121F, 0x3F3F, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1220, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1221, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1223, 0x3F3F, 0x0002, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1224, 0x003F, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1228, 0xFFFF, 0x8183, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x122D, 0x0001, 0x0001, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1250, 0xFFFF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1251, 0x00FF, 0x0000, ADDRESS_MODE_16BIT); + RegMask16BitValue(0x1270, 0x0003, 0x0003, ADDRESS_MODE_16BIT); + + RegSet16BitValueByAddressMode(0x115C, 0x0000, ADDRESS_MODE_16BIT); //sensor ov enable + RegSet16BitValueByAddressMode(0x115D, 0x0000, ADDRESS_MODE_16BIT); //sensor ov enable + RegSet16BitValueByAddressMode(0x115E, 0x0000, ADDRESS_MODE_16BIT); //sensor and gr ov enable + + RegSet16BitValueByAddressMode(0x124E, 0x000F, ADDRESS_MODE_16BIT); //bypass mode +} + +static void _DrvMpTestItoTestMsg22xxGetChargeDumpTime(u16 nMode, u16 *pChargeTime, u16 *pDumpTime) +{ + u16 nChargeTime = 0, nDumpTime = 0; + u16 nMinChargeTime = 0xFFFF, nMinDumpTime = 0xFFFF, nMaxChargeTime = 0x0000, nMaxDumpTime = 0x0000; + + DBG("*** %s() ***\n", __func__); + + nChargeTime = RegGet16BitValue(0x1226); + nDumpTime = RegGet16BitValue(0x122A); + + if (nMinChargeTime > nChargeTime) + { + nMinChargeTime = nChargeTime; + } + + if (nMaxChargeTime < nChargeTime) + { + nMaxChargeTime = nChargeTime; + } + + if (nMinDumpTime > nDumpTime) + { + nMinDumpTime = nDumpTime; + } + + if (nMaxDumpTime < nDumpTime) + { + nMaxDumpTime = nDumpTime; + } + + DBG("nChargeTime = %d, nDumpTime = %d\n", nChargeTime, nDumpTime); + + if (nMode == 1) + { + *pChargeTime = nMaxChargeTime; + *pDumpTime = nMaxDumpTime; + } + else + { + *pChargeTime = nMinChargeTime; + *pDumpTime = nMinDumpTime; + } +} + +static void _DrvMpTestItoOpenTestMsg22xxFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i; + s16 szTmpRawData[MAX_CHANNEL_NUM*2] = {0}; + u16 nSubFrameNum = 0; + u16 nChargeTime, nDumpTime; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 40) + { + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + _DrvMpTestItoTestMsg22xxRegisterResetPatch(); + _DrvMpTestItoTestMsg22xxRegisterReset(); + } + + switch (nItemId) + { + case 40: + pMapping = &_gMAP1[0]; + nSubFrameNum = _gOpenSubFrameNum1; + break; + case 41: + pMapping = &_gMAP2[0]; + nSubFrameNum = _gOpenSubFrameNum2; + break; + case 42: + pMapping = &_gMAP3[0]; + nSubFrameNum = _gOpenSubFrameNum3; + break; + } + + if (nSubFrameNum > 24) // MAX_CHANNEL_NUM/2 + { + nSubFrameNum = 24; + } + + _DrvMpTestItoTestMsg22xxSendDataIn(nItemId - 36, nSubFrameNum * 6); + RegSet16BitValue(0x1216, (nSubFrameNum - 1) << 1); // subframe numbers, 0:1subframe, 1:2subframe + + if (nItemId == 40) + { + if (1) + { + RegSet16BitValue(0x1110, 0x0060); //2.4V -> 1.2V + } + else + { + RegSet16BitValue(0x1110, 0x0020); //3.0V -> 0.6V + } + + RegSet16BitValue(0x11C8, 0x000F); //csub sel overwrite enable, will referance value of 11C0 + RegSet16BitValue(0x1174, 0x0F06); // 1 : sel idel driver for sensor pad that connected to AFE + RegSet16BitValue(0x1208, 0x0006); //PRS1 + RegSet16BitValue(0x1240, 0xFFFF); //mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + RegSet16BitValue(0x1242, 0x00FF); //mutual cap mode selection for total 24 subframes, 0: normal sense, 1: mutual cap sense + + _DrvMpTestItoTestMsg22xxGetChargeDumpTime(1, &nChargeTime, &nDumpTime); + + RegSet16BitValue(0x1226, nChargeTime); + RegSet16BitValue(0x122A, nDumpTime); + + _DrvMpTestItoTestMsg22xxSetC(CSUB_REF); + _DrvMpTestItoTestAnaSwReset(); + } + + _DrvMpTestItoTestMsg22xxGetDataOut(szTmpRawData, nSubFrameNum); + + for (i = 0; i < nSubFrameNum; i ++) + { +// DBG("szTmpRawData[%d * 4] >> 3 = %d\n", i, szTmpRawData[i * 4] >> 3); // add for debug +// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug + + pRawData[pMapping[i]] = (szTmpRawData[i * 4] >> 3); // Filter to ADC + pDataFlag[pMapping[i]] = 1; + } +} + +static void _DrvMpTestItoShortTestMsg22xxFirst(u8 nItemId, s16 *pRawData, s8 *pDataFlag) +{ + u32 i, j; + s16 szIIR1[MAX_SUBFRAME_NUM*MAX_AFE_NUM] = {32767}; + s16 szIIR2[MAX_SUBFRAME_NUM*MAX_AFE_NUM] = {32767}; + s16 szIIRTmp[MAX_SUBFRAME_NUM*MAX_AFE_NUM] = {32767}; + u16 nSensorNum = 0, nSubFrameNum = 0; + u8 *pMapping = NULL; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if ((nItemId == 0 && _gIsEnable2R == 1) || (nItemId == 1 && _gIsEnable2R == 0)) + { + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + _DrvMpTestItoTestMsg22xxRegisterResetPatch(); + _DrvMpTestItoTestMsg22xxRegisterReset(); + } + + switch(nItemId) + { +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + case 0: // 39-4 (2R) + pMapping = &_gSHORT_MAP4[0]; + nSensorNum = _gShortSubFrameNum4; + break; +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + case 1: // 39-1 + pMapping = &_gSHORT_MAP1[0]; + nSensorNum = _gShortSubFrameNum1; + break; + case 2: // 39-2 + pMapping = &_gSHORT_MAP2[0]; + nSensorNum = _gShortSubFrameNum2; + break; + case 3: // 39-3 + pMapping = &_gSHORT_MAP3[0]; + nSensorNum = _gShortSubFrameNum3; + break; + } + + if (nSensorNum > 24) // MAX_CHANNEL_NUM/2 + { + nSubFrameNum = 24; + } + else + { + nSubFrameNum = nSensorNum; + } + + _DrvMpTestItoTestMsg22xxSendDataIn(nItemId, nSubFrameNum * 6); + RegSet16BitValue(0x1216, (nSubFrameNum - 1) << 1); // subframe numbers, 0:1subframe, 1:2subframe + + if ((nItemId == 0 && _gIsEnable2R == 1) || (nItemId == 1 && _gIsEnable2R == 0)) + { + RegSet16BitValue(0x1110, 0x0030); // [6:4} 011 : 2.1V -> 1.5V +// RegSet16BitValue(0x1110, 0x0060); // 2.4V -> 1.2V + RegSet16BitValue(0x11C8, 0x000F); // csub sel overwrite enable, will referance value of 11C0 + RegSet16BitValue(0x1174, 0x0000); // [11:8] 000 : sel active driver for sensor pad that connected to AFE + RegSet16BitValue(0x1208, 0x0006); // PRS 1 + RegSet16BitValueOn(0x1104, BIT14); // R mode + RegSet16BitValue(0x1176, 0x0000); // CFB 10p + + _DrvMpTestItoTestMsg22xxSetC(CSUB_REF); + + RegMask16BitValue(0x1213, 0x007F, 0x003B, ADDRESS_MODE_16BIT); // Charge 20ns (group A) + RegMask16BitValue(0x1218, 0x007F, 0x003B, ADDRESS_MODE_16BIT); // Charge 20ns (group B) + } + + RegMask16BitValue(0x1215, 0x007F, 0x000B, ADDRESS_MODE_16BIT); // Dump 4ns (group A) + RegMask16BitValue(0x1219, 0x007F, 0x000B, ADDRESS_MODE_16BIT); // Dump 4ns (group B) + + _DrvMpTestItoTestAnaSwReset(); + _DrvMpTestItoTestMsg22xxGetDataOut(szIIRTmp, nSubFrameNum); + + if (nSensorNum > MAX_SUBFRAME_NUM) + { + j = 0; + + for (i = 0; i < MAX_SUBFRAME_NUM; i ++) + { + szIIR1[j] = (szIIRTmp[i * 4] >> 3); + j ++; + + if ((nSensorNum - MAX_SUBFRAME_NUM) > i) + { + szIIR1[j] = (szIIRTmp[i * 4 + 1] >> 3); + j ++; + } + } + } + else + { + for (i = 0; i < nSensorNum; i ++) + { + szIIR1[i] = (szIIRTmp[i * 4 + 1] >> 3); + } + } + + RegMask16BitValue(0x1215, 0x007F, 0x0017, ADDRESS_MODE_16BIT); // Dump 8ns (group A) + RegMask16BitValue(0x1219, 0x007F, 0x0017, ADDRESS_MODE_16BIT); // Dump 8ns (group B) + + _DrvMpTestItoTestAnaSwReset(); + _DrvMpTestItoTestMsg22xxGetDataOut(szIIRTmp, nSubFrameNum); + + if (nSensorNum > MAX_SUBFRAME_NUM) + { + j = 0; + + for (i = 0; i < MAX_SUBFRAME_NUM; i ++) + { + szIIR2[j] = (szIIRTmp[i * 4] >> 3); + j ++; + + if ((nSensorNum - MAX_SUBFRAME_NUM) > i) + { + szIIR2[j] = (szIIRTmp[i * 4 + 1] >> 3); + j ++; + } + } + } + else + { + for (i = 0; i < nSensorNum; i ++) + { + szIIR2[i] = (szIIRTmp[i * 4 + 1] >> 3); + } + } + + for (i = 0; i < nSensorNum; i ++) + { + if ((abs(szIIR1[i]) > 4000) || (abs(szIIR2[i]) > 4000)) + { + pRawData[pMapping[i]] = 8192; + } + else + { + pRawData[pMapping[i]] = ((szIIR2[i] - szIIR1[i]) * 4); + } + pDataFlag[pMapping[i]] = 1; + +// DBG("szIIR1[%d] = %d, szIIR2[%d] = %d\n", i, szIIR1[i], i, szIIR2[i]); // add for debug +// DBG("pRawData[%d] = %d\n", pMapping[i], pRawData[pMapping[i]]); // add for debug +// DBG("pMapping[%d] = %d\n", i, pMapping[i]); // add for debug + } +} + +static u8 _DrvMpTestMsg22xxCheckFirmwareVersion(void) // Only MSG22XX support platform firmware version +{ + u32 i; + s32 nDiff; + u16 nRegData1, nRegData2; + u8 szDbBusRxData[12] = {0}; + u8 szCompareFwVersion[10] = {0x56, 0x30, 0x31, 0x2E, 0x30, 0x30, 0x35, 0x2E, 0x30, 0x32}; //{'V', '0', '1', '.', '0', '0', '5', '.', '0', '2'} + u8 nIsOldFirmwareVersion = 0; + + DBG("*** %s() ***\n", __func__); + + mutex_lock(&g_Mutex); + + DrvPlatformLyrTouchDeviceResetHw(); + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop mcu + RegSetLByteValue(0x0FE6, 0x01); + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); + + // RIU password + RegSet16BitValue(0x161A, 0xABBA); + + + RegSet16BitValue(0x1600, 0xC1F2); // Set start address for platform firmware version on info block(Actually, start reading from 0xC1F0) + + // Enable burst mode + RegSet16BitValue(0x160C, (RegGet16BitValue(0x160C) | 0x01)); + + + for (i = 0; i < 3; i ++) + { + RegSetLByteValue(0x160E, 0x01); + + nRegData1 = RegGet16BitValue(0x1604); + nRegData2 = RegGet16BitValue(0x1606); + + szDbBusRxData[i*4+0] = (nRegData1 & 0xFF); + szDbBusRxData[i*4+1] = ((nRegData1 >> 8 ) & 0xFF); + + DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+0, szDbBusRxData[i*4+0], szDbBusRxData[i*4+0]); // add for debug + DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+1, szDbBusRxData[i*4+1], szDbBusRxData[i*4+1]); // add for debug + + szDbBusRxData[i*4+2] = (nRegData2 & 0xFF); + szDbBusRxData[i*4+3] = ((nRegData2 >> 8 ) & 0xFF); + + DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+2, szDbBusRxData[i*4+2], szDbBusRxData[i*4+2]); // add for debug + DBG("szDbBusRxData[%d] = 0x%x , %c \n", i*4+3, szDbBusRxData[i*4+3], szDbBusRxData[i*4+3]); // add for debug + } + + // Clear burst mode + RegSet16BitValue(0x160C, RegGet16BitValue(0x160C) & (~0x01)); + + RegSet16BitValue(0x1600, 0x0000); + + // Clear RIU password + RegSet16BitValue(0x161A, 0x0000); + + for (i = 0; i < 10; i ++) + { + nDiff = szDbBusRxData[2+i] - szCompareFwVersion[i]; + + DBG("i = %d, nDiff = %d\n", i, nDiff); + + if (nDiff < 0) + { + nIsOldFirmwareVersion = 1; + break; + } + else if (nDiff > 0) + { + nIsOldFirmwareVersion = 0; + break; + } + } + + DbBusIICNotUseBus(); + DbBusNotStopMCU(); + DbBusExitSerialDebugMode(); + + DrvPlatformLyrTouchDeviceResetHw(); + + mutex_unlock(&g_Mutex); + + return nIsOldFirmwareVersion; +} + + +//------------------------------------------------------------------------------// + +static ItoTestResult_e _DrvMpTestItoOpenTestSecond(u8 nItemId) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u32 i; + s32 nTmpRawDataJg1 = 0; + s32 nTmpRawDataJg2 = 0; + s32 nTmpJgAvgThMax1 = 0; + s32 nTmpJgAvgThMin1 = 0; + s32 nTmpJgAvgThMax2 = 0; + s32 nTmpJgAvgThMin2 = 0; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + nTmpRawDataJg1 += _gRawData1[_gMAP40_1[i]]; + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData1[_gMAP40_2[i]]; + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + nTmpRawDataJg1 += _gRawData2[_gMAP41_1[i]]; + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData2[_gMAP41_2[i]]; + } + } + + nTmpJgAvgThMax1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/2)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/2)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax2 = (nTmpRawDataJg2 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin2 = (nTmpRawDataJg2 / 2 ) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + + DBG("nItemId = %d, nTmpRawDataJg1 = %d, nTmpJgAvgThMax1 = %d, nTmpJgAvgThMin1 = %d, nTmpRawDataJg2 = %d, nTmpJgAvgThMax2 = %d, nTmpJgAvgThMin2 = %d\n", nItemId, nTmpRawDataJg1, nTmpJgAvgThMax1, nTmpJgAvgThMin1, nTmpRawDataJg2, nTmpJgAvgThMax2, nTmpJgAvgThMin2); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + if (_gRawData1[_gMAP40_1[i]] > nTmpJgAvgThMax1 || _gRawData1[_gMAP40_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData1[_gMAP40_2[i]] > nTmpJgAvgThMax2 || _gRawData1[_gMAP40_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/2)-2; i ++) + { + if (_gRawData2[_gMAP41_1[i]] > nTmpJgAvgThMax1 || _gRawData2[_gMAP41_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData2[_gMAP41_2[i]] > nTmpJgAvgThMax2 || _gRawData2[_gMAP41_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + + return nRetVal; +} + +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE +static ItoTestResult_e _DrvMpTestItoOpenTestSecond2r(u8 nItemId) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u32 i; + s32 nTmpRawDataJg1 = 0; + s32 nTmpRawDataJg2 = 0; + s32 nTmpRawDataJg3 = 0; + s32 nTmpRawDataJg4 = 0; + s32 nTmpJgAvgThMax1 = 0; + s32 nTmpJgAvgThMin1 = 0; + s32 nTmpJgAvgThMax2 = 0; + s32 nTmpJgAvgThMin2 = 0; + s32 nTmpJgAvgThMax3 = 0; + s32 nTmpJgAvgThMin3 = 0; + s32 nTmpJgAvgThMax4 = 0; + s32 nTmpJgAvgThMin4 = 0; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg1 += _gRawData1[_gMAP40_1[i]]; //first region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData1[_gMAP40_2[i]]; //first region: border + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg3 += _gRawData1[_gMAP40_3[i]]; //second region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg4 += _gRawData1[_gMAP40_4[i]]; //second region: border + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg1 += _gRawData2[_gMAP41_1[i]]; //first region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg2 += _gRawData2[_gMAP41_2[i]]; //first region: border + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + nTmpRawDataJg3 += _gRawData2[_gMAP41_3[i]]; //second region: non-border + } + + for (i = 0; i < 2; i ++) + { + nTmpRawDataJg4 += _gRawData2[_gMAP41_4[i]]; //second region: border + } + } + + nTmpJgAvgThMax1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/4)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin1 = (nTmpRawDataJg1 / ((_gItoTestTriangleNum/4)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax2 = (nTmpRawDataJg2 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin2 = (nTmpRawDataJg2 / 2) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax3 = (nTmpRawDataJg3 / ((_gItoTestTriangleNum/4)-2)) * ( 100 + OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin3 = (nTmpRawDataJg3 / ((_gItoTestTriangleNum/4)-2)) * ( 100 - OPEN_TEST_NON_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMax4 = (nTmpRawDataJg4 / 2) * ( 100 + OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + nTmpJgAvgThMin4 = (nTmpRawDataJg4 / 2) * ( 100 - OPEN_TEST_BORDER_AREA_THRESHOLD) / 100; + + DBG("nItemId = %d, nTmpRawDataJg1 = %d, nTmpJgAvgThMax1 = %d, nTmpJgAvgThMin1 = %d, nTmpRawDataJg2 = %d, nTmpJgAvgThMax2 = %d, nTmpJgAvgThMin2 = %d\n", nItemId, nTmpRawDataJg1, nTmpJgAvgThMax1, nTmpJgAvgThMin1, nTmpRawDataJg2, nTmpJgAvgThMax2, nTmpJgAvgThMin2); + DBG("nTmpRawDataJg3 = %d, nTmpJgAvgThMax3 = %d, nTmpJgAvgThMin3 = %d, nTmpRawDataJg4 = %d, nTmpJgAvgThMax4 = %d, nTmpJgAvgThMin4 = %d\n", nTmpRawDataJg3, nTmpJgAvgThMax3, nTmpJgAvgThMin3, nTmpRawDataJg4, nTmpJgAvgThMax4, nTmpJgAvgThMin4); + + if (nItemId == 40) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData1[_gMAP40_1[i]] > nTmpJgAvgThMax1 || _gRawData1[_gMAP40_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData1[_gMAP40_2[i]] > nTmpJgAvgThMax2 || _gRawData1[_gMAP40_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData1[_gMAP40_3[i]] > nTmpJgAvgThMax3 || _gRawData1[_gMAP40_3[i]] < nTmpJgAvgThMin3) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_3[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData1[_gMAP40_4[i]] > nTmpJgAvgThMax4 || _gRawData1[_gMAP40_4[i]] < nTmpJgAvgThMin4) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP40_4[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 41) + { + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData2[_gMAP41_1[i]] > nTmpJgAvgThMax1 || _gRawData2[_gMAP41_1[i]] < nTmpJgAvgThMin1) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData2[_gMAP41_2[i]] > nTmpJgAvgThMax2 || _gRawData2[_gMAP41_2[i]] < nTmpJgAvgThMin2) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < (_gItoTestTriangleNum/4)-2; i ++) + { + if (_gRawData2[_gMAP41_3[i]] > nTmpJgAvgThMax3 || _gRawData2[_gMAP41_3[i]] < nTmpJgAvgThMin3) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_3[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + + for (i = 0; i < 2; i ++) + { + if (_gRawData2[_gMAP41_4[i]] > nTmpJgAvgThMax4 || _gRawData2[_gMAP41_4[i]] < nTmpJgAvgThMin4) + { + _gTestFailChannel[_gTestFailChannelCount] = _gMAP41_4[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + + return nRetVal; +} +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + +static ItoTestResult_e _DrvMpTestItoShortTestSecond(u8 nItemId) +{ + ItoTestResult_e nRetVal = ITO_TEST_OK; + u32 i; + u8 nSensorCount = 0; + u8 nNumOfSensorMapping1 = 0, nNumOfSensorMapping2 = 0; + + DBG("*** %s() nItemId = %d ***\n", __func__, nItemId); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + if ((_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) % 2 != 0) + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2 + 1; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + } + else + { + nNumOfSensorMapping1 = (_gItoTestTriangleNum + _gItoTestKeyNum + _gItoTestDummyNum) / 2; + nNumOfSensorMapping2 = nNumOfSensorMapping1; + if (nNumOfSensorMapping2 % 2 != 0) + { + nNumOfSensorMapping2 ++; + } + } + } + + if (nItemId == 1) // 39-1 + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nSensorCount = nNumOfSensorMapping1; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + nSensorCount = _gShortSubFrameNum1; + } + + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData1[_gSHORT_MAP1[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP1[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 2) // 39-2 + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nSensorCount = nNumOfSensorMapping2; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + nSensorCount = _gShortSubFrameNum2; + } + + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData2[_gSHORT_MAP2[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP2[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } + else if (nItemId == 3) // 39-3 + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nSensorCount = _gItoTestTriangleNum; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + nSensorCount = _gShortSubFrameNum3; + } + + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData3[_gSHORT_MAP3[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP3[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + else if (nItemId == 0) // 39-4 (2R) + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + nSensorCount = _gItoTestTriangleNum/2; + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + nSensorCount = _gShortSubFrameNum4; + } + + for (i = 0; i < nSensorCount; i ++) + { + if (_gRawData4[_gSHORT_MAP4[i]] > SHORT_TEST_THRESHOLD) + { + _gTestFailChannel[_gTestFailChannelCount] = _gSHORT_MAP4[i]; + _gTestFailChannelCount ++; + nRetVal = ITO_TEST_FAIL; + } + } + } +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + + DBG("nSensorCount = %d\n", nSensorCount); + + return nRetVal; +} + +s32 _DrvMpTestItoOpenTest(void) +{ + ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK; + u32 i; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DBG("open test start\n"); + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 50000); //50 KHZ + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + if (!_DrvMpTestItoTestChooseTpType()) + { + DBG("Choose Tp Type failed\n"); + nRetVal1 = ITO_TEST_GET_TP_TYPE_ERROR; + goto ITO_TEST_END; + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + mdelay(50); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gRawData1[i] = 0; + _gRawData2[i] = 0; + _gRawData3[i] = 0; + _gDataFlag1[i] = 0; + _gDataFlag2[i] = 0; + _gDataFlag3[i] = 0; + _gTestFailChannel[i] = 0; + } + + _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoOpenTestMsg21xxaFirst(40, _gRawData1, _gDataFlag1); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoOpenTestMsg22xxFirst(40, _gRawData1, _gDataFlag1); + } + + if (_gIsEnable2R) + { +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + nRetVal2 = _DrvMpTestItoOpenTestSecond2r(40); +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + } + else + { + nRetVal2 = _DrvMpTestItoOpenTestSecond(40); + } + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoOpenTestMsg21xxaFirst(41, _gRawData2, _gDataFlag2); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoOpenTestMsg22xxFirst(41, _gRawData2, _gDataFlag2); + } + + if (_gIsEnable2R) + { +#ifdef CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + nRetVal3 = _DrvMpTestItoOpenTestSecond2r(41); +#endif //CONFIG_ENABLE_MP_TEST_ITEM_FOR_2R_TRIANGLE + } + else + { + nRetVal3 = _DrvMpTestItoOpenTestSecond(41); + } +/* + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoOpenTestMsg21xxaFirst(42, _gRawData3, _gDataFlag3); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoOpenTestMsg22xxFirst(42, _gRawData3, _gDataFlag3); + } +*/ + + ITO_TEST_END: + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 100000); //100 KHZ + + DrvPlatformLyrTouchDeviceResetHw(); + DrvPlatformLyrEnableFingerTouchReport(); + + DBG("open test end\n"); + + if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK)) + { + return ITO_TEST_GET_TP_TYPE_ERROR; + } + else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK))) + { + return ITO_TEST_FAIL; + } + else + { + return ITO_TEST_OK; + } +} + +static ItoTestResult_e _DrvMpTestItoShortTest(void) +{ + ItoTestResult_e nRetVal1 = ITO_TEST_OK, nRetVal2 = ITO_TEST_OK, nRetVal3 = ITO_TEST_OK, nRetVal4 = ITO_TEST_OK, nRetVal5 = ITO_TEST_OK; + u32 i = 0; + + DBG("*** %s() ***\n", __func__); + +#ifdef CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM +#ifdef CONFIG_ENABLE_DMA_IIC + DmaReset(); +#endif //CONFIG_ENABLE_DMA_IIC +#endif //CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM + + DBG("short test start\n"); + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 50000); //50 KHZ + + DrvPlatformLyrDisableFingerTouchReport(); + DrvPlatformLyrTouchDeviceResetHw(); + + if (!_DrvMpTestItoTestChooseTpType()) + { + DBG("Choose Tp Type failed\n"); + nRetVal1 = ITO_TEST_GET_TP_TYPE_ERROR; + goto ITO_TEST_END; + } + + DbBusEnterSerialDebugMode(); + DbBusStopMCU(); + DbBusIICUseBus(); + DbBusIICReshape(); + mdelay(100); + + // Stop cpu + RegSet16BitValue(0x0FE6, 0x0001); //bank:mheg5, addr:h0073 + + // Stop watchdog + RegSet16BitValue(0x3C60, 0xAA55); //bank:reg_PIU_MISC_0, addr:h0030 + + mdelay(50); + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + _gRawData1[i] = 0; + _gRawData2[i] = 0; + _gRawData3[i] = 0; + _gRawData4[i] = 0; + _gDataFlag1[i] = 0; + _gDataFlag2[i] = 0; + _gDataFlag3[i] = 0; + _gDataFlag4[i] = 0; + _gTestFailChannel[i] = 0; + } + + _gTestFailChannelCount = 0; // Reset _gTestFailChannelCount to 0 before test start + + if (_gIsEnable2R) + { + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoShortTestMsg21xxaFirst(0, _gRawData4, _gDataFlag4); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoShortTestMsg22xxFirst(0, _gRawData4, _gDataFlag4); + } + + nRetVal2 = _DrvMpTestItoShortTestSecond(0); + } + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoShortTestMsg21xxaFirst(1, _gRawData1, _gDataFlag1); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoShortTestMsg22xxFirst(1, _gRawData1, _gDataFlag1); + } + + nRetVal3 = _DrvMpTestItoShortTestSecond(1); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoShortTestMsg21xxaFirst(2, _gRawData2, _gDataFlag2); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoShortTestMsg22xxFirst(2, _gRawData2, _gDataFlag2); + } + + nRetVal4 = _DrvMpTestItoShortTestSecond(2); + + if (g_ChipType == CHIP_TYPE_MSG21XXA) + { + _DrvMpTestItoShortTestMsg21xxaFirst(3, _gRawData3, _gDataFlag3); + } + else if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _DrvMpTestItoShortTestMsg22xxFirst(3, _gRawData3, _gDataFlag3); + } + + nRetVal5 = _DrvMpTestItoShortTestSecond(3); + + ITO_TEST_END: + + DrvPlatformLyrSetIicDataRate(g_I2cClient, 100000); //100 KHZ + + DrvPlatformLyrTouchDeviceResetHw(); + DrvPlatformLyrEnableFingerTouchReport(); + + DBG("short test end\n"); + + if ((nRetVal1 != ITO_TEST_OK) && (nRetVal2 == ITO_TEST_OK) && (nRetVal3 == ITO_TEST_OK) && (nRetVal4 == ITO_TEST_OK) && (nRetVal5 == ITO_TEST_OK)) + { + return ITO_TEST_GET_TP_TYPE_ERROR; + } + else if ((nRetVal1 == ITO_TEST_OK) && ((nRetVal2 != ITO_TEST_OK) || (nRetVal3 != ITO_TEST_OK) || (nRetVal4 != ITO_TEST_OK) || (nRetVal5 != ITO_TEST_OK))) + { + return ITO_TEST_FAIL; + } + else + { + return ITO_TEST_OK; + } +} + +static void _DrvMpTestItoTestDoWork(struct work_struct *pWork) +{ + s32 nRetVal = ITO_TEST_OK; + + DBG("*** %s() _gIsInMpTest = %d, _gTestRetryCount = %d ***\n", __func__, _gIsInMpTest, _gTestRetryCount); + + if (_gItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { + nRetVal = _DrvMpTestItoOpenTest(); + } + else if (_gItoTestMode == ITO_TEST_MODE_SHORT_TEST) + { + nRetVal = _DrvMpTestItoShortTest(); + } + else + { + DBG("*** Undefined Mp Test Mode = %d ***\n", _gItoTestMode); + return; + } + + DBG("*** ctp mp test result = %d ***\n", nRetVal); + + if (nRetVal == ITO_TEST_OK) + { + _gCtpMpTestStatus = ITO_TEST_OK; + _gIsInMpTest = 0; + DBG("mp test success\n"); + } + else + { + _gTestRetryCount --; + if (_gTestRetryCount > 0) + { + DBG("_gTestRetryCount = %d\n", _gTestRetryCount); + queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork); + } + else + { + if (nRetVal == ITO_TEST_FAIL) + { + _gCtpMpTestStatus = ITO_TEST_FAIL; + } + else if (nRetVal == ITO_TEST_GET_TP_TYPE_ERROR) + { + _gCtpMpTestStatus = ITO_TEST_GET_TP_TYPE_ERROR; + } + else + { + _gCtpMpTestStatus = ITO_TEST_UNDEFINED_ERROR; + } + + _gIsInMpTest = 0; + DBG("mp test failed\n"); + } + } +} + +/*=============================================================*/ +// GLOBAL FUNCTION DEFINITION +/*=============================================================*/ + +s32 DrvMpTestGetTestResult(void) +{ + DBG("*** %s() ***\n", __func__); + DBG("_gCtpMpTestStatus = %d\n", _gCtpMpTestStatus); + + return _gCtpMpTestStatus; +} + +void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount) +{ + u32 i; + + DBG("*** %s() ***\n", __func__); + DBG("_gTestFailChannelCount = %d\n", _gTestFailChannelCount); + + for (i = 0; i < _gTestFailChannelCount; i ++) + { + pFailChannel[i] = _gTestFailChannel[i]; + } + + *pFailChannelCount = _gTestFailChannelCount; +} + +void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength) +{ + u32 i; + u8 nHighByte, nLowByte; + + DBG("*** %s() ***\n", __func__); + + if (eItoTestMode == ITO_TEST_MODE_OPEN_TEST) + { + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData1[i] >> 8) & 0xFF; + nLowByte = (_gRawData1[i]) & 0xFF; + + if (_gDataFlag1[i] == 1) + { + pDataLog[i*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData1[i] >= 0) + { + pDataLog[i*4+1] = 0; // + : a positive number + } + else + { + pDataLog[i*4+1] = 1; // - : a negative number + } + + pDataLog[i*4+2] = nHighByte; + pDataLog[i*4+3] = nLowByte; + } + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData2[i] >> 8) & 0xFF; + nLowByte = (_gRawData2[i]) & 0xFF; + + if (_gDataFlag2[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData2[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 1; // - : a negative number + } + + pDataLog[(i*4+2)+MAX_CHANNEL_NUM*4] = nHighByte; + pDataLog[(i*4+3)+MAX_CHANNEL_NUM*4] = nLowByte; + } + + *pLength = MAX_CHANNEL_NUM*8; + } + else if (eItoTestMode == ITO_TEST_MODE_SHORT_TEST) + { + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData1[i] >> 8) & 0xFF; + nLowByte = (_gRawData1[i]) & 0xFF; + + if (_gDataFlag1[i] == 1) + { + pDataLog[i*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData1[i] >= 0) + { + pDataLog[i*4+1] = 0; // + : a positive number + } + else + { + pDataLog[i*4+1] = 1; // - : a negative number + } + + pDataLog[i*4+2] = nHighByte; + pDataLog[i*4+3] = nLowByte; + } + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData2[i] >> 8) & 0xFF; + nLowByte = (_gRawData2[i]) & 0xFF; + + if (_gDataFlag2[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*4] = 0; // indicate it is a non-use channel number + } + + if (_gRawData2[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*4] = 1; // - : a negative number + } + + pDataLog[i*4+2+MAX_CHANNEL_NUM*4] = nHighByte; + pDataLog[i*4+3+MAX_CHANNEL_NUM*4] = nLowByte; + } + + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData3[i] >> 8) & 0xFF; + nLowByte = (_gRawData3[i]) & 0xFF; + + if (_gDataFlag3[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*8] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*8] = 0; // indicate it is a non-use channel number + } + + if (_gRawData3[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*8] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*8] = 1; // - : a negative number + } + + pDataLog[(i*4+2)+MAX_CHANNEL_NUM*8] = nHighByte; + pDataLog[(i*4+3)+MAX_CHANNEL_NUM*8] = nLowByte; + } + + if (_gIsEnable2R) + { + for (i = 0; i < MAX_CHANNEL_NUM; i ++) + { + nHighByte = (_gRawData4[i] >> 8) & 0xFF; + nLowByte = (_gRawData4[i]) & 0xFF; + + if (_gDataFlag4[i] == 1) + { + pDataLog[i*4+MAX_CHANNEL_NUM*12] = 1; // indicate it is a on-use channel number + } + else + { + pDataLog[i*4+MAX_CHANNEL_NUM*12] = 0; // indicate it is a non-use channel number + } + + if (_gRawData4[i] >= 0) + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*12] = 0; // + : a positive number + } + else + { + pDataLog[(i*4+1)+MAX_CHANNEL_NUM*12] = 1; // - : a negative number + } + + pDataLog[(i*4+2)+MAX_CHANNEL_NUM*12] = nHighByte; + pDataLog[(i*4+3)+MAX_CHANNEL_NUM*12] = nLowByte; + } + } + + *pLength = MAX_CHANNEL_NUM*16; + } + else + { + DBG("*** Undefined MP Test Mode ***\n"); + } +} + +void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode) +{ + DBG("*** %s() ***\n", __func__); + + if (_gIsInMpTest == 0) + { + DBG("ctp mp test start\n"); + + if (g_ChipType == CHIP_TYPE_MSG22XX) + { + _gIsOldFirmwareVersion = _DrvMpTestMsg22xxCheckFirmwareVersion(); + } + + _gItoTestMode = eItoTestMode; + _gIsInMpTest = 1; + _gTestRetryCount = CTP_MP_TEST_RETRY_COUNT; + _gCtpMpTestStatus = ITO_TEST_UNDER_TESTING; + + queue_work(_gCtpMpTestWorkQueue, &_gCtpItoTestWork); + } +} + +void DrvMpTestCreateMpTestWorkQueue(void) +{ + DBG("*** %s() ***\n", __func__); + + _gCtpMpTestWorkQueue = create_singlethread_workqueue("ctp_mp_test"); + INIT_WORK(&_gCtpItoTestWork, _DrvMpTestItoTestDoWork); +} + +#endif //CONFIG_ENABLE_ITO_MP_TEST +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.h b/drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.h new file mode 100644 index 00000000..c816f16f --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_self_mp_test.h @@ -0,0 +1,101 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_self_mp_test.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_SELF_MP_TEST_H__ +#define __MSTAR_DRV_SELF_MP_TEST_H__ + +/*--------------------------------------------------------------------------*/ +/* INCLUDE FILE */ +/*--------------------------------------------------------------------------*/ + +#include "mstar_drv_common.h" + +#if defined(CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC) +#ifdef CONFIG_ENABLE_ITO_MP_TEST + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR CONSTANT DEFINITION */ +/*--------------------------------------------------------------------------*/ + +#define CTP_MP_TEST_RETRY_COUNT (3) + + +#define OPEN_TEST_NON_BORDER_AREA_THRESHOLD (35) // range : 25~60 +#define OPEN_TEST_BORDER_AREA_THRESHOLD (40) // range : 25~60 + +#define SHORT_TEST_THRESHOLD (3500) + +#define MP_TEST_MODE_OPEN_TEST (0x01) +#define MP_TEST_MODE_SHORT_TEST (0x02) + +#define MAX_CHANNEL_NUM (48) + +// define for MSG21XXA +#define PIN_GUARD_RING (46) +#define GPO_SETTING_SIZE (3) + +// define for MSG22XX +#define RIU_BASE_ADDR (0) +#define RIU_WRITE_LENGTH (144) +#define CSUB_REF (0) //(18) +#define CSUB_REF_MAX (0x3F) + +#define MAX_SUBFRAME_NUM (24) +#define MAX_AFE_NUM (4) + + +#define REG_INTR_FIQ_MASK (0x04) +#define FIQ_E_FRAME_READY_MASK (1 << 8) + + +/*--------------------------------------------------------------------------*/ +/* PREPROCESSOR MACRO DEFINITION */ +/*--------------------------------------------------------------------------*/ + +/*--------------------------------------------------------------------------*/ +/* DATA TYPE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL VARIABLE DEFINITION */ +/*--------------------------------------------------------------------------*/ + + +/*--------------------------------------------------------------------------*/ +/* GLOBAL FUNCTION DECLARATION */ +/*--------------------------------------------------------------------------*/ + +extern void DrvMpTestCreateMpTestWorkQueue(void); +extern void DrvMpTestGetTestDataLog(ItoTestMode_e eItoTestMode, u8 *pDataLog, u32 *pLength); +extern void DrvMpTestGetTestFailChannel(ItoTestMode_e eItoTestMode, u8 *pFailChannel, u32 *pFailChannelCount); +extern s32 DrvMpTestGetTestResult(void); +extern void DrvMpTestScheduleMpTestWork(ItoTestMode_e eItoTestMode); + +#endif //CONFIG_ENABLE_ITO_MP_TEST +#endif //CONFIG_ENABLE_TOUCH_DRIVER_FOR_SELF_IC + +#endif /* __MSTAR_DRV_SELF_MP_TEST_H__ */ \ No newline at end of file diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_sprd.c b/drivers/input/touchscreen/msg2233/mstar_drv_sprd.c new file mode 100644 index 00000000..58754864 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_sprd.c @@ -0,0 +1,242 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_sprd.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +/*=============================================================*/ +// INCLUDE FILE +/*=============================================================*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mstar_drv_platform_interface.h" + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +#include +#include +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +#include +#include +#include +#include + +/*=============================================================*/ +// CONSTANT VALUE DEFINITION +/*=============================================================*/ + +#define MSG_TP_IC_NAME "msg2xxx" //"msg21xxA" or "msg22xx" or "msg26xxM" /* Please define the mstar touch ic name based on the mutual-capacitive ic or self capacitive ic that you are using */ + +/*=============================================================*/ +// VARIABLE DEFINITION +/*=============================================================*/ + +struct i2c_client *g_I2cClient = NULL; +int TOUCH_SCREEN_X_MAX = 0; +int TOUCH_SCREEN_Y_MAX = 0; +int MS_TS_MSG_IC_GPIO_RST = 0; +int MS_TS_MSG_IC_GPIO_INT = 0; + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON +struct regulator *g_ReguVdd = NULL; +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + +struct wake_lock mstar_irq_lock; + +#ifdef CONFIG_OF +static struct msg2138_ts_platform_data *pixcir_ts_parse_dt(struct device *dev) +{ + struct msg2138_ts_platform_data *pdata = NULL; + struct device_node *np = dev->of_node; + int ret; + + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + dev_err(dev, "Could not allocate struct msg2138_ts_platform_data"); + return NULL; + } + pdata->reset_gpio_number = of_get_gpio(np, 0); + if(pdata->reset_gpio_number < 0){ + dev_err(dev, "fail to get reset_gpio_number\n"); + goto fail; + } + pdata->irq_gpio_number = of_get_gpio(np, 1); + if(pdata->irq_gpio_number < 0){ + dev_err(dev, "fail to get irq_gpio_number\n"); + goto fail; + } + ret = of_property_read_string(np, "vdd_name", &pdata->vdd_name); + if(ret){ + dev_err(dev, "fail to get vdd_name\n"); + goto fail; + } + ret = of_property_read_u32_array(np, "virtualkeys", &pdata->virtualkeys,12); + if(ret){ + dev_err(dev, "fail to get virtualkeys\n"); + goto fail; + } + ret = of_property_read_u32(np, "TP_MAX_X", &pdata->TP_MAX_X); + if(ret){ + dev_err(dev, "fail to get TP_MAX_X\n"); + goto fail; + } + ret = of_property_read_u32(np, "TP_MAX_Y", &pdata->TP_MAX_Y); + if(ret){ + dev_err(dev, "fail to get TP_MAX_Y\n"); + goto fail; + } + + return pdata; +fail: + kfree(pdata); + return NULL; +} +#endif + +/*=============================================================*/ +// FUNCTION DEFINITION +/*=============================================================*/ + +/* probe function is used for matching and initializing input device */ +static int /*__devinit*/ touch_driver_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ +// const char *vdd_name = "vdd"; + struct msg2138_ts_platform_data *pdata = client->dev.platform_data; + int err = 0; + + DBG("*** %s ***\n", __FUNCTION__); + + if (client == NULL) + { + DBG("i2c client is NULL\n"); + return -1; + } + + #ifdef CONFIG_OF + struct device_node *np = client->dev.of_node; + if (np && !pdata){ + pdata = pixcir_ts_parse_dt(&client->dev); + if(pdata){ + client->dev.platform_data = pdata; + } else { + err = -ENOMEM; + goto exit_alloc_platform_data_failed; + } + } + #endif + + g_I2cClient = client; + MS_TS_MSG_IC_GPIO_RST = pdata->reset_gpio_number; + MS_TS_MSG_IC_GPIO_INT = pdata->irq_gpio_number; + TOUCH_SCREEN_X_MAX = pdata->TP_MAX_X; + TOUCH_SCREEN_Y_MAX = pdata->TP_MAX_Y; + +#ifdef CONFIG_ENABLE_REGULATOR_POWER_ON + g_ReguVdd = regulator_get(&g_I2cClient->dev, pdata->vdd_name); +#endif //CONFIG_ENABLE_REGULATOR_POWER_ON + + + wake_lock_init(&mstar_irq_lock, WAKE_LOCK_SUSPEND, "mstar_irq_lock"); + + return MsDrvInterfaceTouchDeviceProbe(g_I2cClient, id); +exit_alloc_platform_data_failed: + return err; +} + +/* remove function is triggered when the input device is removed from input sub-system */ +static int /*__devexit*/ touch_driver_remove(struct i2c_client *client) +{ + DBG("*** %s ***\n", __FUNCTION__); + + return MsDrvInterfaceTouchDeviceRemove(client); +} + +/* The I2C device list is used for matching I2C device and I2C device driver. */ +static const struct i2c_device_id touch_device_id[] = +{ + {MSG_TP_IC_NAME, 0}, //SLAVE_I2C_ID_DWI2C + {}, /* should not omitted */ +}; + +MODULE_DEVICE_TABLE(i2c, touch_device_id); + +static const struct of_device_id msg2xxx_of_match[] = { + { .compatible = "msg2xxx,msg2233", }, + { } +}; + +static struct i2c_driver touch_device_driver = +{ + .driver = { + .name = MSG_TP_IC_NAME, + .owner = THIS_MODULE, + .of_match_table = msg2xxx_of_match, + }, + .probe = touch_driver_probe, + .remove = touch_driver_remove, +/* .remove = __devexit_p(touch_driver_remove), */ + .id_table = touch_device_id, +}; + +static int /*__init*/ touch_driver_init(void) +{ + int ret; + + /* register driver */ + ret = i2c_add_driver(&touch_device_driver); + if (ret < 0) + { + DBG("add touch device driver i2c driver failed.\n"); + return -ENODEV; + } + DBG("add touch device driver i2c driver.\n"); + + return ret; +} + +static void /*__exit*/ touch_driver_exit(void) +{ + DBG("remove touch device driver i2c driver.\n"); + + i2c_del_driver(&touch_device_driver); +} + +module_init(touch_driver_init); +module_exit(touch_driver_exit); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.c b/drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.c new file mode 100644 index 00000000..73a08263 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.c @@ -0,0 +1,1157 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_utility_adaption.c + * + * @brief This file defines the interface of touch screen + * + * + */ + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// +#include "mstar_drv_utility_adaption.h" + +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Constant +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Variables +//////////////////////////////////////////////////////////// +extern u32 SLAVE_I2C_ID_DBBUS; +extern u32 SLAVE_I2C_ID_DWI2C; + +extern struct i2c_client *g_I2cClient; +extern struct input_dev *g_InputDevice; + +extern u8 g_ChipType; +extern u8 g_IsUpdateFirmware; + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Function Implementation +//////////////////////////////////////////////////////////// + + +#ifdef CONFIG_ENABLE_DMA_IIC +#include +#include +#include +#include +#include +#include + +static unsigned char *I2CDMABuf_va = NULL; +static dma_addr_t I2CDMABuf_pa = NULL; + +void DmaAlloc(void) +{ + if (NULL == I2CDMABuf_va) + { + g_InputDevice->dev.coherent_dma_mask = DMA_BIT_MASK(32); + I2CDMABuf_va = (u8 *)dma_alloc_coherent(&g_InputDevice->dev, MAX_I2C_TRANSACTION_LENGTH_LIMIT, &I2CDMABuf_pa, GFP_KERNEL); + } + + if (NULL == I2CDMABuf_va) + { + DBG("DmaAlloc FAILED!\n"); + } + else + { + DBG("DmaAlloc SUCCESS!\n"); + } +} + +void DmaReset(void) +{ + DBG("Dma memory reset!\n"); + + memset(I2CDMABuf_va, 0, MAX_I2C_TRANSACTION_LENGTH_LIMIT); +} + +void DmaFree(void) +{ + if (NULL != I2CDMABuf_va) + { + dma_free_coherent(&g_InputDevice->dev, MAX_I2C_TRANSACTION_LENGTH_LIMIT, I2CDMABuf_va, I2CDMABuf_pa); + I2CDMABuf_va = NULL; + I2CDMABuf_pa = 0; + + DBG("DmaFree SUCCESS!\n"); + } +} +#endif //CONFIG_ENABLE_DMA_IIC + +//------------------------------------------------------------------------------// + +u16 RegGet16BitValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF}; + u8 rx_data[2] = {0}; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data[0], 2); + + return (rx_data[1] << 8 | rx_data[0]); +} + +u8 RegGetLByteValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF}; + u8 rx_data = {0}; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data, 1); + + return (rx_data); +} + +u8 RegGetHByteValue(u16 nAddr) +{ + u8 tx_data[3] = {0x10, (nAddr >> 8) & 0xFF, (nAddr & 0xFF) + 1}; + u8 rx_data = {0}; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &rx_data, 1); + + return (rx_data); +} + +void RegGetXBitValue(u16 nAddr, u8 * pRxData, u16 nLength, u16 nMaxI2cLengthLimit) +{ + u16 nReadAddr = nAddr; + u16 nReadSize = 0; + u16 nLeft = nLength; + u16 nOffset = 0; + u8 tx_data[3] = {0}; + + tx_data[0] = 0x10; + + while(nLeft > 0) + { + if(nLeft >= nMaxI2cLengthLimit) + { + nReadSize = nMaxI2cLengthLimit; + //DBG("*** RegGetXBitValue# Length >= I2cMax nReadAddr=%x, nReadSize=%d ***\n", nReadAddr, nReadSize); + + tx_data[1] = (nReadAddr >> 8) & 0xFF; + tx_data[2] = nReadAddr & 0xFF; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &pRxData[nOffset], nReadSize); + + nReadAddr = nReadAddr + nReadSize; //set next read address + nLeft = nLeft - nReadSize; + nOffset = nOffset + nReadSize; + //DBG("*** RegGetXBitValue# Length >= I2cMax nLeft=%d, nOffset=%d ***\n", nLeft, nOffset); + } + else + { + nReadSize = nLeft; + //DBG("*** RegGetXBitValue# Length < I2cMax nReadAddr=%x, nReadSize=%d ***\n", nReadAddr, nReadSize); + + tx_data[1] = (nReadAddr >> 8) & 0xFF; + tx_data[2] = nReadAddr & 0xFF; + + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 3); + IicReadData(SLAVE_I2C_ID_DBBUS, &pRxData[nOffset], nReadSize); + + nLeft = 0; + nOffset = nOffset + nReadSize; + //DBG("*** RegGetXBitValue# Length < I2cMax nLeft=%d, nOffset=%d ***\n", nLeft, nOffset); + } + } +} + +void RegSet16BitValue(u16 nAddr, u16 nData) +{ + u8 tx_data[5] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF, nData & 0xFF, nData >> 8}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 5); +} + +void RegSetLByteValue(u16 nAddr, u8 nData) +{ + u8 tx_data[4] = {0x10, (nAddr >> 8) & 0xFF, nAddr & 0xFF, nData}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 4); +} + +void RegSetHByteValue(u16 nAddr, u8 nData) +{ + u8 tx_data[4] = {0x10, (nAddr >> 8) & 0xFF, (nAddr & 0xFF) + 1, nData}; + IicWriteData(SLAVE_I2C_ID_DBBUS, &tx_data[0], 4); +} + +void RegSet16BitValueOn(u16 nAddr, u16 nData) //Set bit on nData from 0 to 1 +{ + u16 rData = RegGet16BitValue(nAddr); + rData |= nData; + RegSet16BitValue(nAddr, rData); +} + +void RegSet16BitValueOff(u16 nAddr, u16 nData) //Set bit on nData from 1 to 0 +{ + u16 rData = RegGet16BitValue(nAddr); + rData &= (~nData); + RegSet16BitValue(nAddr, rData); +} + +u16 RegGet16BitValueByAddressMode(u16 nAddr, AddressMode_e eAddressMode) +{ + u16 nData = 0; + + if (eAddressMode == ADDRESS_MODE_16BIT) + { + nAddr = nAddr - (nAddr & 0xFF) + ((nAddr & 0xFF) << 1); + } + + nData = RegGet16BitValue(nAddr); + + return nData; +} + +void RegSet16BitValueByAddressMode(u16 nAddr, u16 nData, AddressMode_e eAddressMode) +{ + if (eAddressMode == ADDRESS_MODE_16BIT) + { + nAddr = nAddr - (nAddr & 0xFF) + ((nAddr & 0xFF) << 1); + } + + RegSet16BitValue(nAddr, nData); +} + +void RegMask16BitValue(u16 nAddr, u16 nMask, u16 nData, AddressMode_e eAddressMode) +{ + u16 nTmpData = 0; + + if (nData > nMask) + { + return; + } + + nTmpData = RegGet16BitValueByAddressMode(nAddr, eAddressMode); + nTmpData = (nTmpData & (~nMask)); + nTmpData = (nTmpData | nData); + RegSet16BitValueByAddressMode(nAddr, nTmpData, eAddressMode); +} + +s32 DbBusEnterSerialDebugMode(void) +{ + s32 rc = 0; + u8 data[5]; + + // Enter the Serial Debug Mode + data[0] = 0x53; + data[1] = 0x45; + data[2] = 0x52; + data[3] = 0x44; + data[4] = 0x42; + + rc = IicWriteData(SLAVE_I2C_ID_DBBUS, data, 5); + + return rc; +} + +void DbBusExitSerialDebugMode(void) +{ + u8 data[1]; + // Exit the Serial Debug Mode + data[0] = 0x45; + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); + // Delay some interval to guard the next transaction +// udelay(200); // delay about 0.2ms +} + +void DbBusIICUseBus(void) +{ + u8 data[1]; + + // IIC Use Bus + data[0] = 0x35; + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusIICNotUseBus(void) +{ + u8 data[1]; + + // IIC Not Use Bus + data[0] = 0x34; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusIICReshape(void) +{ + u8 data[1]; + + // IIC Re-shape + data[0] = 0x71; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusStopMCU(void) +{ + u8 data[1]; + + // Stop the MCU + data[0] = 0x37; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusNotStopMCU(void) +{ + u8 data[1]; + + // Not Stop the MCU + data[0] = 0x36; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusResetSlave(void) +{ + u8 data[1]; + + // IIC Reset Slave + data[0] = 0x00; + + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +void DbBusWaitMCU(void) +{ + u8 data[1]; + + // Stop the MCU + data[0] = 0x37; + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); + + data[0] = 0x61; + IicWriteData(SLAVE_I2C_ID_DBBUS, data, 1); +} + +s32 IicWriteData(u8 nSlaveId, u8* pBuf, u16 nSize) +{ + s32 rc = 0; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + struct i2c_msg msgs[] = + { + { + .addr = nSlaveId, + .flags = 0, // if read flag is undefined, then it means write flag. + .len = nSize, + .buf = pBuf, + }, + }; + + /* If everything went ok (i.e. 1 msg transmitted), return #bytes + transmitted, else error code. */ + if (g_I2cClient != NULL) + { + if (g_ChipType == CHIP_TYPE_MSG28XX && nSlaveId == SLAVE_I2C_ID_DWI2C && g_IsUpdateFirmware != 0) + { + PRINTF_ERR("Not allow to execute SmBus command while update firmware.\n"); + } + else + { + rc = i2c_transfer(g_I2cClient->adapter, msgs, 1); + + if (rc == 1) + { + rc = nSize; + } + else // rc < 0 + { + PRINTF_ERR("IicWriteData() error %d\n", rc); + } + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_I2cClient != NULL) + { + if (g_ChipType == CHIP_TYPE_MSG28XX && nSlaveId == SLAVE_I2C_ID_DWI2C && g_IsUpdateFirmware != 0) + { + PRINTF_ERR("Not allow to execute SmBus command while update firmware.\n"); + } + else + { + u8 nAddrBefore = g_I2cClient->addr; + g_I2cClient->addr = nSlaveId; + +#ifdef CONFIG_ENABLE_DMA_IIC + if (nSize > 8 && NULL != I2CDMABuf_va) + { + s32 i = 0; + + for (i = 0; i < nSize; i ++) + { + I2CDMABuf_va[i] = pBuf[i]; + } + g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG; + rc = i2c_master_send(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nSize); + } + else + { + g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG); + rc = i2c_master_send(g_I2cClient, pBuf, nSize); + } +#else + rc = i2c_master_send(g_I2cClient, pBuf, nSize); +#endif //CONFIG_ENABLE_DMA_IIC + g_I2cClient->addr = nAddrBefore; + + if (rc < 0) + { + PRINTF_ERR("IicWriteData() error %d, nSlaveId=%d, nSize=%d\n", rc, nSlaveId, nSize); + } + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#endif + + return rc; +} + +s32 IicReadData(u8 nSlaveId, u8* pBuf, u16 nSize) +{ + s32 rc = 0; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + struct i2c_msg msgs[] = + { + { + .addr = nSlaveId, + .flags = I2C_M_RD, // read flag + .len = nSize, + .buf = pBuf, + }, + }; + + /* If everything went ok (i.e. 1 msg transmitted), return #bytes + transmitted, else error code. */ + if (g_I2cClient != NULL) + { + if (g_ChipType == CHIP_TYPE_MSG28XX && nSlaveId == SLAVE_I2C_ID_DWI2C && g_IsUpdateFirmware != 0) + { + PRINTF_ERR("Not Allow to execute SmBus command while update firmware by sw id.\n"); + } + else + { + rc = i2c_transfer(g_I2cClient->adapter, msgs, 1); + + if (rc == 1) + { + rc = nSize; + } + else // rc < 0 + { + PRINTF_ERR("IicReadData() error %d\n", rc); + } + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_I2cClient != NULL) + { + if (g_ChipType == CHIP_TYPE_MSG28XX && nSlaveId == SLAVE_I2C_ID_DWI2C && g_IsUpdateFirmware != 0) + { + PRINTF_ERR("Not Allow to execute SmBus command while update firmware by sw id.\n"); + } + else + { + u8 nAddrBefore = g_I2cClient->addr; + g_I2cClient->addr = nSlaveId; + +#ifdef CONFIG_ENABLE_DMA_IIC + if (nSize > 8 && NULL != I2CDMABuf_va) + { + s32 i = 0; + + g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG; + rc = i2c_master_recv(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nSize); + + for (i = 0; i < nSize; i ++) + { + pBuf[i] = I2CDMABuf_va[i]; + } + } + else + { + g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG); + rc = i2c_master_recv(g_I2cClient, pBuf, nSize); + } +#else + rc = i2c_master_recv(g_I2cClient, pBuf, nSize); +#endif //CONFIG_ENABLE_DMA_IIC + g_I2cClient->addr = nAddrBefore; + + if (rc < 0) + { + PRINTF_ERR("IicReadData() error %d, nSlaveId=%d, nSize=%d\n", rc, nSlaveId, nSize); + } + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#endif + + return rc; +} + +s32 IicSegmentReadDataByDbBus(u8 nRegBank, u8 nRegAddr, u8* pBuf, u16 nSize, u16 nMaxI2cLengthLimit) +{ + s32 rc = 0; + u16 nLeft = nSize; + u16 nOffset = 0; + u16 nSegmentLength = 0; + u16 nReadSize = 0; + u16 nOver = 0; + u8 szWriteBuf[3] = {0}; + u8 nNextRegBank = nRegBank; + u8 nNextRegAddr = nRegAddr; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + struct i2c_msg msgs[2] = + { + { + .addr = SLAVE_I2C_ID_DBBUS, + .flags = 0, // write flag + .len = 3, + .buf = szWriteBuf, + }, + { + .addr = SLAVE_I2C_ID_DBBUS, + .flags = I2C_M_RD, // read flag + }, + }; + + // If everything went ok (i.e. 1 msg transmitted), return #bytes transmitted, else error code. + if (g_I2cClient != NULL) + { + if (nMaxI2cLengthLimit >= 256) + { + nSegmentLength = 256; + } + else + { + nSegmentLength = 128; + } + + PRINTF_ERR("nSegmentLength = %d\n", nSegmentLength); // add for debug + + while (nLeft > 0) + { + szWriteBuf[0] = 0x10; + nRegBank = nNextRegBank; + szWriteBuf[1] = nRegBank; + nRegAddr = nNextRegAddr; + szWriteBuf[2] = nRegAddr; + + PRINTF_ERR("nRegBank = 0x%x\n", nRegBank); // add for debug + PRINTF_ERR("nRegAddr = 0x%x\n", nRegAddr); // add for debug + + msgs[1].buf = &pBuf[nOffset]; + + if (nLeft > nSegmentLength) + { + if ((nRegAddr + nSegmentLength) < MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = nRegAddr + nSegmentLength; + + PRINTF_ERR("nNextRegAddr = 0x%x\n", nNextRegAddr); // add for debug + + msgs[1].len = nSegmentLength; + nLeft -= nSegmentLength; + nOffset += msgs[1].len; + } + else if ((nRegAddr + nSegmentLength) == MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + msgs[1].len = nSegmentLength; + nLeft -= nSegmentLength; + nOffset += msgs[1].len; + } + else // ((nRegAddr + nSegmentLength) > MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_INFO("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nOver = (nRegAddr + nSegmentLength) - MAX_TOUCH_IC_REGISTER_BANK_SIZE; + + PRINTF_ERR("nOver = 0x%x\n", nOver); // add for debug + + msgs[1].len = nSegmentLength - nOver; + nLeft -= msgs[1].len; + nOffset += msgs[1].len; + } + } + else + { + if ((nRegAddr + nLeft) < MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = nRegAddr + nLeft; + + PRINTF_ERR("nNextRegAddr = 0x%x\n", nNextRegAddr); // add for debug + + msgs[1].len = nLeft; + nLeft = 0; +// nOffset += msgs[1].len; + } + else if ((nRegAddr + nLeft) == MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + msgs[1].len = nLeft; + nLeft = 0; +// nOffset += msgs[1].len; + } + else // ((nRegAddr + nLeft) > MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nOver = (nRegAddr + nLeft) - MAX_TOUCH_IC_REGISTER_BANK_SIZE; + + PRINTF_ERR("nOver = 0x%x\n", nOver); // add for debug + + msgs[1].len = nLeft - nOver; + nLeft -= msgs[1].len; + nOffset += msgs[1].len; + } + } + + rc = i2c_transfer(g_I2cClient->adapter, &msgs[0], 2); + if (rc == 2) + { + nReadSize = nReadSize + msgs[1].len; + } + else // rc < 0 + { + PRINTF_ERR("IicSegmentReadDataByDbBus() -> i2c_transfer() error %d\n", rc); + + return rc; + } + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_I2cClient != NULL) + { + u8 *pReadBuf = NULL; + u16 nLength = 0; + u8 nAddrBefore = g_I2cClient->addr; + + g_I2cClient->addr = SLAVE_I2C_ID_DBBUS; + + if (nMaxI2cLengthLimit >= 256) + { + nSegmentLength = 256; + } + else + { + nSegmentLength = 128; + } + + PRINTF_ERR("nSegmentLength = %d\n", nSegmentLength); // add for debug + +#ifdef CONFIG_ENABLE_DMA_IIC + if (NULL != I2CDMABuf_va) + { + s32 i = 0; + + while (nLeft > 0) + { + szWriteBuf[0] = 0x10; + nRegBank = nNextRegBank; + szWriteBuf[1] = nRegBank; + nRegAddr = nNextRegAddr; + szWriteBuf[2] = nRegAddr; + + PRINTF_ERR("nRegBank = 0x%x\n", nRegBank); // add for debug + PRINTF_ERR("nRegAddr = 0x%x\n", nRegAddr); // add for debug + + if (nLeft > nSegmentLength) + { + if ((nRegAddr + nSegmentLength) < MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = nRegAddr + nSegmentLength; + + PRINTF_ERR("nNextRegAddr = 0x%x\n", nNextRegAddr); // add for debug + + nLength = nSegmentLength; + nLeft -= nSegmentLength; + } + else if ((nRegAddr + nSegmentLength) == MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nLength = nSegmentLength; + nLeft -= nSegmentLength; + } + else // ((nRegAddr + nSegmentLength) > MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_INFO("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nOver = (nRegAddr + nSegmentLength) - MAX_TOUCH_IC_REGISTER_BANK_SIZE; + + PRINTF_ERR("nOver = 0x%x\n", nOver); // add for debug + + nLength = nSegmentLength - nOver; + nLeft -= nLength; + } + } + else + { + if ((nRegAddr + nLeft) < MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = nRegAddr + nLeft; + + PRINTF_ERR("nNextRegAddr = 0x%x\n", nNextRegAddr); // add for debug + + nLength = nLeft; + nLeft = 0; + } + else if ((nRegAddr + nLeft) == MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nLength = nLeft; + nLeft = 0; + } + else // ((nRegAddr + nLeft) > MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nOver = (nRegAddr + nLeft) - MAX_TOUCH_IC_REGISTER_BANK_SIZE; + + PRINTF_ERR("nOver = 0x%x\n", nOver); // add for debug + + nLength = nLeft - nOver; + nLeft -= nLength; + } + } + + g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG); + rc = i2c_master_send(g_I2cClient, &szWriteBuf[0], 3); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataByDbBus() -> i2c_master_send() error %d\n", rc); + + return rc; + } + + g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG; + rc = i2c_master_recv(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nLength); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataByDbBus() -> i2c_master_recv() error %d\n", rc); + + return rc; + } + else + { + for (i = 0; i < nLength; i ++) + { + pBuf[i+nOffset] = I2CDMABuf_va[i]; + } + nOffset += nLength; + + nReadSize = nReadSize + nLength; + } + } + } + else + { + PRINTF_ERR("IicSegmentReadDataByDbBus() -> I2CDMABuf_va is NULL\n"); + } +#else + while (nLeft > 0) + { + szWriteBuf[0] = 0x10; + nRegBank = nNextRegBank; + szWriteBuf[1] = nRegBank; + nRegAddr = nNextRegAddr; + szWriteBuf[2] = nRegAddr; + + PRINTF_ERR("nRegBank = 0x%x\n", nRegBank); // add for debug + PRINTF_ERR("nRegAddr = 0x%x\n", nRegAddr); // add for debug + + pReadBuf = &pBuf[nOffset]; + + if (nLeft > nSegmentLength) + { + if ((nRegAddr + nSegmentLength) < MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = nRegAddr + nSegmentLength; + + PRINTF_ERR("nNextRegAddr = 0x%x\n", nNextRegAddr); // add for debug + + nLength = nSegmentLength; + nLeft -= nSegmentLength; + nOffset += nLength; + } + else if ((nRegAddr + nSegmentLength) == MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nLength = nSegmentLength; + nLeft -= nSegmentLength; + nOffset += nLength; + } + else // ((nRegAddr + nSegmentLength) > MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_INFO("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nOver = (nRegAddr + nSegmentLength) - MAX_TOUCH_IC_REGISTER_BANK_SIZE; + + PRINTF_ERR("nOver = 0x%x\n", nOver); // add for debug + + nLength = nSegmentLength - nOver; + nLeft -= nLength; + nOffset += nLength; + } + } + else + { + if ((nRegAddr + nLeft) < MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = nRegAddr + nLeft; + + PRINTF_ERR("nNextRegAddr = 0x%x\n", nNextRegAddr); // add for debug + + nLength = nLeft; + nLeft = 0; +// nOffset += nLength; + } + else if ((nRegAddr + nLeft) == MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nLength = nLeft; + nLeft = 0; +// nOffset += nLength; + } + else // ((nRegAddr + nLeft) > MAX_TOUCH_IC_REGISTER_BANK_SIZE) + { + nNextRegAddr = 0x00; + nNextRegBank = nRegBank + 1; // shift to read data from next register bank + + PRINTF_ERR("nNextRegBank = 0x%x\n", nNextRegBank); // add for debug + + nOver = (nRegAddr + nLeft) - MAX_TOUCH_IC_REGISTER_BANK_SIZE; + + PRINTF_ERR("nOver = 0x%x\n", nOver); // add for debug + + nLength = nLeft - nOver; + nLeft -= nLength; + nOffset += nLength; + } + } + + rc = i2c_master_send(g_I2cClient, &szWriteBuf[0], 3); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataByDbBus() -> i2c_master_send() error %d\n", rc); + + return rc; + } + + rc = i2c_master_recv(g_I2cClient, pReadBuf, nLength); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataByDbBus() -> i2c_master_recv() error %d\n", rc); + + return rc; + } + else + { + nReadSize = nReadSize + nLength; + } + } +#endif //CONFIG_ENABLE_DMA_IIC + g_I2cClient->addr = nAddrBefore; + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#endif + + return nReadSize; +} + +s32 IicSegmentReadDataBySmBus(u16 nAddr, u8* pBuf, u16 nSize, u16 nMaxI2cLengthLimit) +{ + s32 rc = 0; + u16 nLeft = nSize; + u16 nOffset = 0; + u16 nReadSize = 0; + u8 szWriteBuf[3] = {0}; + +#if defined(CONFIG_TOUCH_DRIVER_RUN_ON_SPRD_PLATFORM) || defined(CONFIG_TOUCH_DRIVER_RUN_ON_QCOM_PLATFORM) + struct i2c_msg msgs[2] = + { + { + .addr = SLAVE_I2C_ID_DWI2C, + .flags = 0, // write flag + .len = 3, + .buf = szWriteBuf, + }, + { + .addr = SLAVE_I2C_ID_DWI2C, + .flags = I2C_M_RD, // read flag + }, + }; + + // If everything went ok (i.e. 1 msg transmitted), return #bytes transmitted, else error code. + if (g_I2cClient != NULL) + { + while (nLeft > 0) + { + szWriteBuf[0] = 0x53; + szWriteBuf[1] = ((nAddr + nOffset) >> 8) & 0xFF; + szWriteBuf[2] = (nAddr + nOffset) & 0xFF; + + msgs[1].buf = &pBuf[nOffset]; + + if (nLeft > nMaxI2cLengthLimit) + { + msgs[1].len = nMaxI2cLengthLimit; + nLeft -= nMaxI2cLengthLimit; + nOffset += msgs[1].len; + } + else + { + msgs[1].len = nLeft; + nLeft = 0; +// nOffset += msgs[1].len; + } + + rc = i2c_transfer(g_I2cClient->adapter, &msgs[0], 2); + if (rc == 2) + { + nReadSize = nReadSize + msgs[1].len; + } + else // rc < 0 + { + PRINTF_ERR("IicSegmentReadDataBySmBus() -> i2c_transfer() error %d\n", rc); + + return rc; + } + } + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#elif defined(CONFIG_TOUCH_DRIVER_RUN_ON_MTK_PLATFORM) + if (g_I2cClient != NULL) + { + u8 *pReadBuf = NULL; + u16 nLength = 0; + u8 nAddrBefore = g_I2cClient->addr; + + g_I2cClient->addr = SLAVE_I2C_ID_DWI2C; + +#ifdef CONFIG_ENABLE_DMA_IIC + while (nLeft > 0) + { + s32 i = 0; + + szWriteBuf[0] = 0x53; + szWriteBuf[1] = ((nAddr + nOffset) >> 8) & 0xFF; + szWriteBuf[2] = (nAddr + nOffset) & 0xFF; + + if (nLeft > nMaxI2cLengthLimit) + { + nLength = nMaxI2cLengthLimit; + nLeft -= nMaxI2cLengthLimit; + } + else + { + nLength = nLeft; + nLeft = 0; + } + + g_I2cClient->ext_flag = g_I2cClient->ext_flag & (~I2C_DMA_FLAG); + rc = i2c_master_send(g_I2cClient, &szWriteBuf[0], 3); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataBySmBus() -> i2c_master_send() error %d\n", rc); + + return rc; + } + + g_I2cClient->ext_flag = g_I2cClient->ext_flag | I2C_DMA_FLAG; + rc = i2c_master_recv(g_I2cClient, (unsigned char *)I2CDMABuf_pa, nLength); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataBySmBus() -> i2c_master_recv() error %d\n", rc); + + return rc; + } + else + { + for (i = 0; i < nLength; i ++) + { + pBuf[i+nOffset] = I2CDMABuf_va[i]; + } + nOffset += nLength; + + nReadSize = nReadSize + nLength; + } + } +#else + while (nLeft > 0) + { + szWriteBuf[0] = 0x53; + szWriteBuf[1] = ((nAddr + nOffset) >> 8) & 0xFF; + szWriteBuf[2] = (nAddr + nOffset) & 0xFF; + + pReadBuf = &pBuf[nOffset]; + + if (nLeft > nMaxI2cLengthLimit) + { + nLength = nMaxI2cLengthLimit; + nLeft -= nMaxI2cLengthLimit; + nOffset += nLength; + } + else + { + nLength = nLeft; + nLeft = 0; +// nOffset += nLength; + } + + rc = i2c_master_send(g_I2cClient, &szWriteBuf[0], 3); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataBySmBus() -> i2c_master_send() error %d\n", rc); + + return rc; + } + + rc = i2c_master_recv(g_I2cClient, pReadBuf, nLength); + if (rc < 0) + { + PRINTF_ERR("IicSegmentReadDataBySmBus() -> i2c_master_recv() error %d\n", rc); + + return rc; + } + else + { + nReadSize = nReadSize + nLength; + } + } +#endif //CONFIG_ENABLE_DMA_IIC + g_I2cClient->addr = nAddrBefore; + } + else + { + PRINTF_ERR("i2c client is NULL\n"); + } +#endif + + return nReadSize; +} + +void mstpMemSet(void *pDst, s8 nVal, u32 nSize) +{ + memset(pDst, nVal, nSize); +} + +void mstpMemCopy(void *pDst, void *pSource, u32 nSize) +{ + memcpy(pDst, pSource, nSize); +} + +void mstpDelay(u32 nTime) +{ + mdelay(nTime); +} + +//------------------------------------------------------------------------------// diff --git a/drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.h b/drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.h new file mode 100644 index 00000000..c473ceb1 --- /dev/null +++ b/drivers/input/touchscreen/msg2233/mstar_drv_utility_adaption.h @@ -0,0 +1,109 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2006-2014 MStar Semiconductor, Inc. +// All rights reserved. +// +// Unless otherwise stipulated in writing, any and all information contained +// herein regardless in any format shall remain the sole proprietary of +// MStar Semiconductor Inc. and be kept in strict confidence +// (??MStar Confidential Information??) by the recipient. +// Any unauthorized act including without limitation unauthorized disclosure, +// copying, use, reproduction, sale, distribution, modification, disassembling, +// reverse engineering and compiling of the contents of MStar Confidential +// Information is unlawful and strictly prohibited. MStar hereby reserves the +// rights to any and all damages, losses, costs and expenses resulting therefrom. +// +//////////////////////////////////////////////////////////////////////////////// + +/** + * + * @file mstar_drv_utility_adaption.h + * + * @brief This file defines the interface of touch screen + * + * + */ + +#ifndef __MSTAR_DRV_UTILITY_ADAPTION_H__ +#define __MSTAR_DRV_UTILITY_ADAPTION_H__ (1) + + +//////////////////////////////////////////////////////////// +/// Included Files +//////////////////////////////////////////////////////////// + +#include "mstar_drv_common.h" + +//////////////////////////////////////////////////////////// +/// Constant +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Data Types +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Variables +//////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////// +/// Macro +//////////////////////////////////////////////////////////// +#define BK_REG8_WL(addr,val) ( RegSetLByteValue( addr, val ) ) +#define BK_REG8_WH(addr,val) ( RegSetHByteValue( addr, val ) ) +#define BK_REG16_W(addr,val) ( RegSet16BitValue( addr, val ) ) +#define BK_REG8_RL(addr) ( RegGetLByteValue( addr ) ) +#define BK_REG8_RH(addr) ( RegGetHByteValue( addr ) ) +#define BK_REG16_R(addr) ( RegGet16BitValue( addr ) ) + +#define PRINTF_EMERG(fmt, ...) printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_ALERT(fmt, ...) printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_CRIT(fmt, ...) printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_ERR(fmt, ...) printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_WARN(fmt, ...) printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_NOTICE(fmt, ...) printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_INFO(fmt, ...) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) +#define PRINTF_DEBUG(fmt, ...) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) + +//////////////////////////////////////////////////////////// +/// Function Prototypes +//////////////////////////////////////////////////////////// + +#ifdef CONFIG_ENABLE_DMA_IIC +extern void DmaAlloc(void); +extern void DmaReset(void); +extern void DmaFree(void); +#endif //CONFIG_ENABLE_DMA_IIC +extern u16 RegGet16BitValue(u16 nAddr); +extern u8 RegGetLByteValue(u16 nAddr); +extern u8 RegGetHByteValue(u16 nAddr); +extern void RegGetXBitValue(u16 nAddr, u8 * pRxData, u16 nLength, u16 nMaxI2cLengthLimit); +extern void RegSet16BitValue(u16 nAddr, u16 nData); +extern void RegSetLByteValue(u16 nAddr, u8 nData); +extern void RegSetHByteValue(u16 nAddr, u8 nData); +extern void RegSet16BitValueOn(u16 nAddr, u16 nData); +extern void RegSet16BitValueOff(u16 nAddr, u16 nData); +extern u16 RegGet16BitValueByAddressMode(u16 nAddr, AddressMode_e eAddressMode); +extern void RegSet16BitValueByAddressMode(u16 nAddr, u16 nData, AddressMode_e eAddressMode); +extern void RegMask16BitValue(u16 nAddr, u16 nMask, u16 nData, AddressMode_e eAddressMode); +extern s32 DbBusEnterSerialDebugMode(void); +extern void DbBusExitSerialDebugMode(void); +extern void DbBusIICUseBus(void); +extern void DbBusIICNotUseBus(void); +extern void DbBusIICReshape(void); +extern void DbBusStopMCU(void); +extern void DbBusNotStopMCU(void); +extern void DbBusResetSlave(void); +extern void DbBusWaitMCU(void); +extern s32 IicWriteData(u8 nSlaveId, u8* pBuf, u16 nSize); +extern s32 IicReadData(u8 nSlaveId, u8* pBuf, u16 nSize); +extern s32 IicSegmentReadDataByDbBus(u8 nRegBank, u8 nRegAddr, u8* pBuf, u16 nSize, u16 nMaxI2cLengthLimit); +extern s32 IicSegmentReadDataBySmBus(u16 nAddr, u8* pBuf, u16 nSize, u16 nMaxI2cLengthLimit); +extern void mstpMemSet(void *pDst, s8 nVal, u32 nSize); +extern void mstpMemCopy(void *pDst, void *pSource, u32 nSize); +extern void mstpDelay(u32 nTime); + +#endif // __MSTAR_DRV_UTILITY_ADAPTION_H__ diff --git a/drivers/input/touchscreen/mtouch.c b/drivers/input/touchscreen/mtouch.c new file mode 100644 index 00000000..eb66b7c3 --- /dev/null +++ b/drivers/input/touchscreen/mtouch.c @@ -0,0 +1,205 @@ +/* + * MicroTouch (3M) serial touchscreen driver + * + * Copyright (c) 2004 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +/* + * 2005/02/19 Dan Streetman + * Copied elo.c and edited for MicroTouch protocol + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "MicroTouch serial touchscreen driver" + +MODULE_AUTHOR("Vojtech Pavlik "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define MTOUCH_FORMAT_TABLET_STATUS_BIT 0x80 +#define MTOUCH_FORMAT_TABLET_TOUCH_BIT 0x40 +#define MTOUCH_FORMAT_TABLET_LENGTH 5 +#define MTOUCH_RESPONSE_BEGIN_BYTE 0x01 +#define MTOUCH_RESPONSE_END_BYTE 0x0d + +/* todo: check specs for max length of all responses */ +#define MTOUCH_MAX_LENGTH 16 + +#define MTOUCH_MIN_XC 0 +#define MTOUCH_MAX_XC 0x3fff +#define MTOUCH_MIN_YC 0 +#define MTOUCH_MAX_YC 0x3fff + +#define MTOUCH_GET_XC(data) (((data[2])<<7) | data[1]) +#define MTOUCH_GET_YC(data) (((data[4])<<7) | data[3]) +#define MTOUCH_GET_TOUCHED(data) (MTOUCH_FORMAT_TABLET_TOUCH_BIT & data[0]) + +/* + * Per-touchscreen data. + */ + +struct mtouch { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[MTOUCH_MAX_LENGTH]; + char phys[32]; +}; + +static void mtouch_process_format_tablet(struct mtouch *mtouch) +{ + struct input_dev *dev = mtouch->dev; + + if (MTOUCH_FORMAT_TABLET_LENGTH == ++mtouch->idx) { + input_report_abs(dev, ABS_X, MTOUCH_GET_XC(mtouch->data)); + input_report_abs(dev, ABS_Y, MTOUCH_MAX_YC - MTOUCH_GET_YC(mtouch->data)); + input_report_key(dev, BTN_TOUCH, MTOUCH_GET_TOUCHED(mtouch->data)); + input_sync(dev); + + mtouch->idx = 0; + } +} + +static void mtouch_process_response(struct mtouch *mtouch) +{ + if (MTOUCH_RESPONSE_END_BYTE == mtouch->data[mtouch->idx++]) { + /* FIXME - process response */ + mtouch->idx = 0; + } else if (MTOUCH_MAX_LENGTH == mtouch->idx) { + printk(KERN_ERR "mtouch.c: too many response bytes\n"); + mtouch->idx = 0; + } +} + +static irqreturn_t mtouch_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct mtouch* mtouch = serio_get_drvdata(serio); + + mtouch->data[mtouch->idx] = data; + + if (MTOUCH_FORMAT_TABLET_STATUS_BIT & mtouch->data[0]) + mtouch_process_format_tablet(mtouch); + else if (MTOUCH_RESPONSE_BEGIN_BYTE == mtouch->data[0]) + mtouch_process_response(mtouch); + else + printk(KERN_DEBUG "mtouch.c: unknown/unsynchronized data from device, byte %x\n",mtouch->data[0]); + + return IRQ_HANDLED; +} + +/* + * mtouch_disconnect() is the opposite of mtouch_connect() + */ + +static void mtouch_disconnect(struct serio *serio) +{ + struct mtouch* mtouch = serio_get_drvdata(serio); + + input_get_device(mtouch->dev); + input_unregister_device(mtouch->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(mtouch->dev); + kfree(mtouch); +} + +/* + * mtouch_connect() is the routine that is called when someone adds a + * new serio device that supports MicroTouch (Format Tablet) protocol and registers it as + * an input device. + */ + +static int mtouch_connect(struct serio *serio, struct serio_driver *drv) +{ + struct mtouch *mtouch; + struct input_dev *input_dev; + int err; + + mtouch = kzalloc(sizeof(struct mtouch), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!mtouch || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + mtouch->serio = serio; + mtouch->dev = input_dev; + snprintf(mtouch->phys, sizeof(mtouch->phys), "%s/input0", serio->phys); + + input_dev->name = "MicroTouch Serial TouchScreen"; + input_dev->phys = mtouch->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_MICROTOUCH; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(mtouch->dev, ABS_X, MTOUCH_MIN_XC, MTOUCH_MAX_XC, 0, 0); + input_set_abs_params(mtouch->dev, ABS_Y, MTOUCH_MIN_YC, MTOUCH_MAX_YC, 0, 0); + + serio_set_drvdata(serio, mtouch); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(mtouch->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(mtouch); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id mtouch_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_MICROTOUCH, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, mtouch_serio_ids); + +static struct serio_driver mtouch_drv = { + .driver = { + .name = "mtouch", + }, + .description = DRIVER_DESC, + .id_table = mtouch_serio_ids, + .interrupt = mtouch_interrupt, + .connect = mtouch_connect, + .disconnect = mtouch_disconnect, +}; + +module_serio_driver(mtouch_drv); diff --git a/drivers/input/touchscreen/pcap_ts.c b/drivers/input/touchscreen/pcap_ts.c new file mode 100644 index 00000000..f22e04dd --- /dev/null +++ b/drivers/input/touchscreen/pcap_ts.c @@ -0,0 +1,260 @@ +/* + * Driver for Motorola PCAP2 touchscreen as found in the EZX phone platform. + * + * Copyright (C) 2006 Harald Welte + * Copyright (C) 2009 Daniel Ribeiro + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct pcap_ts { + struct pcap_chip *pcap; + struct input_dev *input; + struct delayed_work work; + u16 x, y; + u16 pressure; + u8 read_state; +}; + +#define SAMPLE_DELAY 20 /* msecs */ + +#define X_AXIS_MIN 0 +#define X_AXIS_MAX 1023 +#define Y_AXIS_MAX X_AXIS_MAX +#define Y_AXIS_MIN X_AXIS_MIN +#define PRESSURE_MAX X_AXIS_MAX +#define PRESSURE_MIN X_AXIS_MIN + +static void pcap_ts_read_xy(void *data, u16 res[2]) +{ + struct pcap_ts *pcap_ts = data; + + switch (pcap_ts->read_state) { + case PCAP_ADC_TS_M_PRESSURE: + /* pressure reading is unreliable */ + if (res[0] > PRESSURE_MIN && res[0] < PRESSURE_MAX) + pcap_ts->pressure = res[0]; + pcap_ts->read_state = PCAP_ADC_TS_M_XY; + schedule_delayed_work(&pcap_ts->work, 0); + break; + case PCAP_ADC_TS_M_XY: + pcap_ts->y = res[0]; + pcap_ts->x = res[1]; + if (pcap_ts->x <= X_AXIS_MIN || pcap_ts->x >= X_AXIS_MAX || + pcap_ts->y <= Y_AXIS_MIN || pcap_ts->y >= Y_AXIS_MAX) { + /* pen has been released */ + input_report_abs(pcap_ts->input, ABS_PRESSURE, 0); + input_report_key(pcap_ts->input, BTN_TOUCH, 0); + + pcap_ts->read_state = PCAP_ADC_TS_M_STANDBY; + schedule_delayed_work(&pcap_ts->work, 0); + } else { + /* pen is touching the screen */ + input_report_abs(pcap_ts->input, ABS_X, pcap_ts->x); + input_report_abs(pcap_ts->input, ABS_Y, pcap_ts->y); + input_report_key(pcap_ts->input, BTN_TOUCH, 1); + input_report_abs(pcap_ts->input, ABS_PRESSURE, + pcap_ts->pressure); + + /* switch back to pressure read mode */ + pcap_ts->read_state = PCAP_ADC_TS_M_PRESSURE; + schedule_delayed_work(&pcap_ts->work, + msecs_to_jiffies(SAMPLE_DELAY)); + } + input_sync(pcap_ts->input); + break; + default: + dev_warn(&pcap_ts->input->dev, + "pcap_ts: Warning, unhandled read_state %d\n", + pcap_ts->read_state); + break; + } +} + +static void pcap_ts_work(struct work_struct *work) +{ + struct delayed_work *dw = container_of(work, struct delayed_work, work); + struct pcap_ts *pcap_ts = container_of(dw, struct pcap_ts, work); + u8 ch[2]; + + pcap_set_ts_bits(pcap_ts->pcap, + pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT); + + if (pcap_ts->read_state == PCAP_ADC_TS_M_STANDBY) + return; + + /* start adc conversion */ + ch[0] = PCAP_ADC_CH_TS_X1; + ch[1] = PCAP_ADC_CH_TS_Y1; + pcap_adc_async(pcap_ts->pcap, PCAP_ADC_BANK_1, 0, ch, + pcap_ts_read_xy, pcap_ts); +} + +static irqreturn_t pcap_ts_event_touch(int pirq, void *data) +{ + struct pcap_ts *pcap_ts = data; + + if (pcap_ts->read_state == PCAP_ADC_TS_M_STANDBY) { + pcap_ts->read_state = PCAP_ADC_TS_M_PRESSURE; + schedule_delayed_work(&pcap_ts->work, 0); + } + return IRQ_HANDLED; +} + +static int pcap_ts_open(struct input_dev *dev) +{ + struct pcap_ts *pcap_ts = input_get_drvdata(dev); + + pcap_ts->read_state = PCAP_ADC_TS_M_STANDBY; + schedule_delayed_work(&pcap_ts->work, 0); + + return 0; +} + +static void pcap_ts_close(struct input_dev *dev) +{ + struct pcap_ts *pcap_ts = input_get_drvdata(dev); + + cancel_delayed_work_sync(&pcap_ts->work); + + pcap_ts->read_state = PCAP_ADC_TS_M_NONTS; + pcap_set_ts_bits(pcap_ts->pcap, + pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT); +} + +static int pcap_ts_probe(struct platform_device *pdev) +{ + struct input_dev *input_dev; + struct pcap_ts *pcap_ts; + int err = -ENOMEM; + + pcap_ts = kzalloc(sizeof(*pcap_ts), GFP_KERNEL); + if (!pcap_ts) + return err; + + pcap_ts->pcap = dev_get_drvdata(pdev->dev.parent); + platform_set_drvdata(pdev, pcap_ts); + + input_dev = input_allocate_device(); + if (!input_dev) + goto fail; + + INIT_DELAYED_WORK(&pcap_ts->work, pcap_ts_work); + + pcap_ts->read_state = PCAP_ADC_TS_M_NONTS; + pcap_set_ts_bits(pcap_ts->pcap, + pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT); + + pcap_ts->input = input_dev; + input_set_drvdata(input_dev, pcap_ts); + + input_dev->name = "pcap-touchscreen"; + input_dev->phys = "pcap_ts/input0"; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0001; + input_dev->id.product = 0x0002; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &pdev->dev; + input_dev->open = pcap_ts_open; + input_dev->close = pcap_ts_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0); + input_set_abs_params(input_dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, PRESSURE_MIN, + PRESSURE_MAX, 0, 0); + + err = input_register_device(pcap_ts->input); + if (err) + goto fail_allocate; + + err = request_irq(pcap_to_irq(pcap_ts->pcap, PCAP_IRQ_TS), + pcap_ts_event_touch, 0, "Touch Screen", pcap_ts); + if (err) + goto fail_register; + + return 0; + +fail_register: + input_unregister_device(input_dev); + goto fail; +fail_allocate: + input_free_device(input_dev); +fail: + kfree(pcap_ts); + + return err; +} + +static int pcap_ts_remove(struct platform_device *pdev) +{ + struct pcap_ts *pcap_ts = platform_get_drvdata(pdev); + + free_irq(pcap_to_irq(pcap_ts->pcap, PCAP_IRQ_TS), pcap_ts); + cancel_delayed_work_sync(&pcap_ts->work); + + input_unregister_device(pcap_ts->input); + + kfree(pcap_ts); + + return 0; +} + +#ifdef CONFIG_PM +static int pcap_ts_suspend(struct device *dev) +{ + struct pcap_ts *pcap_ts = dev_get_drvdata(dev); + + pcap_set_ts_bits(pcap_ts->pcap, PCAP_ADC_TS_REF_LOWPWR); + return 0; +} + +static int pcap_ts_resume(struct device *dev) +{ + struct pcap_ts *pcap_ts = dev_get_drvdata(dev); + + pcap_set_ts_bits(pcap_ts->pcap, + pcap_ts->read_state << PCAP_ADC_TS_M_SHIFT); + return 0; +} + +static const struct dev_pm_ops pcap_ts_pm_ops = { + .suspend = pcap_ts_suspend, + .resume = pcap_ts_resume, +}; +#define PCAP_TS_PM_OPS (&pcap_ts_pm_ops) +#else +#define PCAP_TS_PM_OPS NULL +#endif + +static struct platform_driver pcap_ts_driver = { + .probe = pcap_ts_probe, + .remove = pcap_ts_remove, + .driver = { + .name = "pcap-ts", + .owner = THIS_MODULE, + .pm = PCAP_TS_PM_OPS, + }, +}; +module_platform_driver(pcap_ts_driver); + +MODULE_DESCRIPTION("Motorola PCAP2 touchscreen driver"); +MODULE_AUTHOR("Daniel Ribeiro / Harald Welte"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:pcap_ts"); diff --git a/drivers/input/touchscreen/penmount.c b/drivers/input/touchscreen/penmount.c new file mode 100644 index 00000000..b49f0b83 --- /dev/null +++ b/drivers/input/touchscreen/penmount.c @@ -0,0 +1,320 @@ +/* + * Penmount serial touchscreen driver + * + * Copyright (c) 2006 Rick Koch + * Copyright (c) 2011 John Sung + * + * Based on ELO driver (drivers/input/touchscreen/elo.c) + * Copyright (c) 2004 Vojtech Pavlik + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "PenMount serial touchscreen driver" + +MODULE_AUTHOR("Rick Koch "); +MODULE_AUTHOR("John Sung "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define PM_MAX_LENGTH 6 +#define PM_MAX_MTSLOT 16 +#define PM_3000_MTSLOT 2 +#define PM_6250_MTSLOT 12 + +/* + * Multi-touch slot + */ + +struct mt_slot { + unsigned short x, y; + bool active; /* is the touch valid? */ +}; + +/* + * Per-touchscreen data. + */ + +struct pm { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[PM_MAX_LENGTH]; + char phys[32]; + unsigned char packetsize; + unsigned char maxcontacts; + struct mt_slot slots[PM_MAX_MTSLOT]; + void (*parse_packet)(struct pm *); +}; + +/* + * pm_mtevent() sends mt events and also emulates pointer movement + */ + +static void pm_mtevent(struct pm *pm, struct input_dev *input) +{ + int i; + + for (i = 0; i < pm->maxcontacts; ++i) { + input_mt_slot(input, i); + input_mt_report_slot_state(input, MT_TOOL_FINGER, + pm->slots[i].active); + if (pm->slots[i].active) { + input_event(input, EV_ABS, ABS_MT_POSITION_X, pm->slots[i].x); + input_event(input, EV_ABS, ABS_MT_POSITION_Y, pm->slots[i].y); + } + } + + input_mt_report_pointer_emulation(input, true); + input_sync(input); +} + +/* + * pm_checkpacket() checks if data packet is valid + */ + +static bool pm_checkpacket(unsigned char *packet) +{ + int total = 0; + int i; + + for (i = 0; i < 5; i++) + total += packet[i]; + + return packet[5] == (unsigned char)~(total & 0xff); +} + +static void pm_parse_9000(struct pm *pm) +{ + struct input_dev *dev = pm->dev; + + if ((pm->data[0] & 0x80) && pm->packetsize == ++pm->idx) { + input_report_abs(dev, ABS_X, pm->data[1] * 128 + pm->data[2]); + input_report_abs(dev, ABS_Y, pm->data[3] * 128 + pm->data[4]); + input_report_key(dev, BTN_TOUCH, !!(pm->data[0] & 0x40)); + input_sync(dev); + pm->idx = 0; + } +} + +static void pm_parse_6000(struct pm *pm) +{ + struct input_dev *dev = pm->dev; + + if ((pm->data[0] & 0xbf) == 0x30 && pm->packetsize == ++pm->idx) { + if (pm_checkpacket(pm->data)) { + input_report_abs(dev, ABS_X, + pm->data[2] * 256 + pm->data[1]); + input_report_abs(dev, ABS_Y, + pm->data[4] * 256 + pm->data[3]); + input_report_key(dev, BTN_TOUCH, pm->data[0] & 0x40); + input_sync(dev); + } + pm->idx = 0; + } +} + +static void pm_parse_3000(struct pm *pm) +{ + struct input_dev *dev = pm->dev; + + if ((pm->data[0] & 0xce) == 0x40 && pm->packetsize == ++pm->idx) { + if (pm_checkpacket(pm->data)) { + int slotnum = pm->data[0] & 0x0f; + pm->slots[slotnum].active = pm->data[0] & 0x30; + pm->slots[slotnum].x = pm->data[2] * 256 + pm->data[1]; + pm->slots[slotnum].y = pm->data[4] * 256 + pm->data[3]; + pm_mtevent(pm, dev); + } + pm->idx = 0; + } +} + +static void pm_parse_6250(struct pm *pm) +{ + struct input_dev *dev = pm->dev; + + if ((pm->data[0] & 0xb0) == 0x30 && pm->packetsize == ++pm->idx) { + if (pm_checkpacket(pm->data)) { + int slotnum = pm->data[0] & 0x0f; + pm->slots[slotnum].active = pm->data[0] & 0x40; + pm->slots[slotnum].x = pm->data[2] * 256 + pm->data[1]; + pm->slots[slotnum].y = pm->data[4] * 256 + pm->data[3]; + pm_mtevent(pm, dev); + } + pm->idx = 0; + } +} + +static irqreturn_t pm_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct pm *pm = serio_get_drvdata(serio); + + pm->data[pm->idx] = data; + + pm->parse_packet(pm); + + return IRQ_HANDLED; +} + +/* + * pm_disconnect() is the opposite of pm_connect() + */ + +static void pm_disconnect(struct serio *serio) +{ + struct pm *pm = serio_get_drvdata(serio); + + serio_close(serio); + + input_unregister_device(pm->dev); + kfree(pm); + + serio_set_drvdata(serio, NULL); +} + +/* + * pm_connect() is the routine that is called when someone adds a + * new serio device that supports PenMount protocol and registers it as + * an input device. + */ + +static int pm_connect(struct serio *serio, struct serio_driver *drv) +{ + struct pm *pm; + struct input_dev *input_dev; + int max_x, max_y; + int err; + + pm = kzalloc(sizeof(struct pm), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!pm || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + pm->serio = serio; + pm->dev = input_dev; + snprintf(pm->phys, sizeof(pm->phys), "%s/input0", serio->phys); + pm->maxcontacts = 1; + + input_dev->name = "PenMount Serial TouchScreen"; + input_dev->phys = pm->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_PENMOUNT; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + switch (serio->id.id) { + default: + case 0: + pm->packetsize = 5; + pm->parse_packet = pm_parse_9000; + input_dev->id.product = 0x9000; + max_x = max_y = 0x3ff; + break; + + case 1: + pm->packetsize = 6; + pm->parse_packet = pm_parse_6000; + input_dev->id.product = 0x6000; + max_x = max_y = 0x3ff; + break; + + case 2: + pm->packetsize = 6; + pm->parse_packet = pm_parse_3000; + input_dev->id.product = 0x3000; + max_x = max_y = 0x7ff; + pm->maxcontacts = PM_3000_MTSLOT; + break; + + case 3: + pm->packetsize = 6; + pm->parse_packet = pm_parse_6250; + input_dev->id.product = 0x6250; + max_x = max_y = 0x3ff; + pm->maxcontacts = PM_6250_MTSLOT; + break; + } + + input_set_abs_params(pm->dev, ABS_X, 0, max_x, 0, 0); + input_set_abs_params(pm->dev, ABS_Y, 0, max_y, 0, 0); + + if (pm->maxcontacts > 1) { + input_mt_init_slots(pm->dev, pm->maxcontacts, 0); + input_set_abs_params(pm->dev, + ABS_MT_POSITION_X, 0, max_x, 0, 0); + input_set_abs_params(pm->dev, + ABS_MT_POSITION_Y, 0, max_y, 0, 0); + } + + serio_set_drvdata(serio, pm); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(pm->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(pm); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id pm_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_PENMOUNT, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, pm_serio_ids); + +static struct serio_driver pm_drv = { + .driver = { + .name = "serio-penmount", + }, + .description = DRIVER_DESC, + .id_table = pm_serio_ids, + .interrupt = pm_interrupt, + .connect = pm_connect, + .disconnect = pm_disconnect, +}; + +module_serio_driver(pm_drv); diff --git a/drivers/input/touchscreen/pixcir_i2c_ts.c b/drivers/input/touchscreen/pixcir_i2c_ts.c new file mode 100644 index 00000000..6cc6b366 --- /dev/null +++ b/drivers/input/touchscreen/pixcir_i2c_ts.c @@ -0,0 +1,229 @@ +/* + * Driver for Pixcir I2C touchscreen controllers. + * + * Copyright (C) 2010-2011 Pixcir, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include + +struct pixcir_i2c_ts_data { + struct i2c_client *client; + struct input_dev *input; + const struct pixcir_ts_platform_data *chip; + bool exiting; +}; + +static void pixcir_ts_poscheck(struct pixcir_i2c_ts_data *data) +{ + struct pixcir_i2c_ts_data *tsdata = data; + u8 rdbuf[10], wrbuf[1] = { 0 }; + u8 touch; + int ret; + + ret = i2c_master_send(tsdata->client, wrbuf, sizeof(wrbuf)); + if (ret != sizeof(wrbuf)) { + dev_err(&tsdata->client->dev, + "%s: i2c_master_send failed(), ret=%d\n", + __func__, ret); + return; + } + + ret = i2c_master_recv(tsdata->client, rdbuf, sizeof(rdbuf)); + if (ret != sizeof(rdbuf)) { + dev_err(&tsdata->client->dev, + "%s: i2c_master_recv failed(), ret=%d\n", + __func__, ret); + return; + } + + touch = rdbuf[0]; + if (touch) { + u16 posx1 = (rdbuf[3] << 8) | rdbuf[2]; + u16 posy1 = (rdbuf[5] << 8) | rdbuf[4]; + u16 posx2 = (rdbuf[7] << 8) | rdbuf[6]; + u16 posy2 = (rdbuf[9] << 8) | rdbuf[8]; + + input_report_key(tsdata->input, BTN_TOUCH, 1); + input_report_abs(tsdata->input, ABS_X, posx1); + input_report_abs(tsdata->input, ABS_Y, posy1); + + input_report_abs(tsdata->input, ABS_MT_POSITION_X, posx1); + input_report_abs(tsdata->input, ABS_MT_POSITION_Y, posy1); + input_mt_sync(tsdata->input); + + if (touch == 2) { + input_report_abs(tsdata->input, + ABS_MT_POSITION_X, posx2); + input_report_abs(tsdata->input, + ABS_MT_POSITION_Y, posy2); + input_mt_sync(tsdata->input); + } + } else { + input_report_key(tsdata->input, BTN_TOUCH, 0); + } + + input_sync(tsdata->input); +} + +static irqreturn_t pixcir_ts_isr(int irq, void *dev_id) +{ + struct pixcir_i2c_ts_data *tsdata = dev_id; + + while (!tsdata->exiting) { + pixcir_ts_poscheck(tsdata); + + if (tsdata->chip->attb_read_val()) + break; + + msleep(20); + } + + return IRQ_HANDLED; +} + +#ifdef CONFIG_PM_SLEEP +static int pixcir_i2c_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(&client->dev)) + enable_irq_wake(client->irq); + + return 0; +} + +static int pixcir_i2c_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + if (device_may_wakeup(&client->dev)) + disable_irq_wake(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(pixcir_dev_pm_ops, + pixcir_i2c_ts_suspend, pixcir_i2c_ts_resume); + +static int pixcir_i2c_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + const struct pixcir_ts_platform_data *pdata = client->dev.platform_data; + struct pixcir_i2c_ts_data *tsdata; + struct input_dev *input; + int error; + + if (!pdata) { + dev_err(&client->dev, "platform data not defined\n"); + return -EINVAL; + } + + tsdata = kzalloc(sizeof(*tsdata), GFP_KERNEL); + input = input_allocate_device(); + if (!tsdata || !input) { + dev_err(&client->dev, "Failed to allocate driver data!\n"); + error = -ENOMEM; + goto err_free_mem; + } + + tsdata->client = client; + tsdata->input = input; + tsdata->chip = pdata; + + input->name = client->name; + input->id.bustype = BUS_I2C; + input->dev.parent = &client->dev; + + __set_bit(EV_KEY, input->evbit); + __set_bit(EV_ABS, input->evbit); + __set_bit(BTN_TOUCH, input->keybit); + input_set_abs_params(input, ABS_X, 0, pdata->x_max, 0, 0); + input_set_abs_params(input, ABS_Y, 0, pdata->y_max, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_X, 0, pdata->x_max, 0, 0); + input_set_abs_params(input, ABS_MT_POSITION_Y, 0, pdata->y_max, 0, 0); + + input_set_drvdata(input, tsdata); + + error = request_threaded_irq(client->irq, NULL, pixcir_ts_isr, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->name, tsdata); + if (error) { + dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); + goto err_free_mem; + } + + error = input_register_device(input); + if (error) + goto err_free_irq; + + i2c_set_clientdata(client, tsdata); + device_init_wakeup(&client->dev, 1); + + return 0; + +err_free_irq: + free_irq(client->irq, tsdata); +err_free_mem: + input_free_device(input); + kfree(tsdata); + return error; +} + +static int pixcir_i2c_ts_remove(struct i2c_client *client) +{ + struct pixcir_i2c_ts_data *tsdata = i2c_get_clientdata(client); + + device_init_wakeup(&client->dev, 0); + + tsdata->exiting = true; + mb(); + free_irq(client->irq, tsdata); + + input_unregister_device(tsdata->input); + kfree(tsdata); + + return 0; +} + +static const struct i2c_device_id pixcir_i2c_ts_id[] = { + { "pixcir_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, pixcir_i2c_ts_id); + +static struct i2c_driver pixcir_i2c_ts_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "pixcir_ts", + .pm = &pixcir_dev_pm_ops, + }, + .probe = pixcir_i2c_ts_probe, + .remove = pixcir_i2c_ts_remove, + .id_table = pixcir_i2c_ts_id, +}; + +module_i2c_driver(pixcir_i2c_ts_driver); + +MODULE_AUTHOR("Jianchun Bian , Dequan Meng "); +MODULE_DESCRIPTION("Pixcir I2C Touchscreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/qt602240_ts.c b/drivers/input/touchscreen/qt602240_ts.c new file mode 100644 index 00000000..59fa8b64 --- /dev/null +++ b/drivers/input/touchscreen/qt602240_ts.c @@ -0,0 +1,1679 @@ +/* + * AT42QT602240/ATMXT224 Touchscreen driver + * + * Copyright (C) 2010 Samsung Electronics Co.Ltd + * Author: Joonyoung Shim + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Version */ +#define QT602240_VER_16 16 +#define QT602240_VER_20 20 +#define QT602240_VER_21 21 +#define QT602240_VER_22 22 +#define QT602240_VER_32 32 + +/* Slave addresses */ +#define QT602240_APP_LOW 0x4a +#define QT602240_APP_HIGH 0x4b +#define QT602240_BOOT_LOW 0x24 +#define QT602240_BOOT_HIGH 0x25 + +/* Firmware */ +#define QT602240_FW_NAME "qt602240.fw" + +/* Registers */ +#define QT602240_FAMILY_ID 0x00 +#define QT602240_VARIANT_ID 0x01 +#define QT602240_VERSION 0x02 +#define QT602240_BUILD 0x03 +#define QT602240_MATRIX_X_SIZE 0x04 +#define QT602240_MATRIX_Y_SIZE 0x05 +#define QT602240_OBJECT_NUM 0x06 +#define QT602240_OBJECT_START 0x07 + +#define QT602240_OBJECT_SIZE 6 + +/* Object types */ +#define QT602240_DEBUG_DIAGNOSTIC 37 +#define QT602240_GEN_MESSAGE 5 +#define QT602240_GEN_COMMAND 6 +#define QT602240_GEN_POWER 7 +#define QT602240_GEN_ACQUIRE 8 +#define QT602240_TOUCH_MULTI 9 +#define QT602240_TOUCH_KEYARRAY 15 +#define QT602240_TOUCH_PROXIMITY 23 +#define QT602240_PROCI_GRIPFACE 20 +#define QT602240_PROCG_NOISE 22 +#define QT602240_PROCI_ONETOUCH 24 +#define QT602240_PROCI_TWOTOUCH 27 +#define QT602240_SPT_COMMSCONFIG 18 /* firmware ver 21 over */ +#define QT602240_SPT_GPIOPWM 19 +#define QT602240_SPT_SELFTEST 25 +#define QT602240_SPT_CTECONFIG 28 +#define QT602240_SPT_USERDATA 38 /* firmware ver 21 over */ + +/* QT602240_GEN_COMMAND field */ +#define QT602240_COMMAND_RESET 0 +#define QT602240_COMMAND_BACKUPNV 1 +#define QT602240_COMMAND_CALIBRATE 2 +#define QT602240_COMMAND_REPORTALL 3 +#define QT602240_COMMAND_DIAGNOSTIC 5 + +/* QT602240_GEN_POWER field */ +#define QT602240_POWER_IDLEACQINT 0 +#define QT602240_POWER_ACTVACQINT 1 +#define QT602240_POWER_ACTV2IDLETO 2 + +/* QT602240_GEN_ACQUIRE field */ +#define QT602240_ACQUIRE_CHRGTIME 0 +#define QT602240_ACQUIRE_TCHDRIFT 2 +#define QT602240_ACQUIRE_DRIFTST 3 +#define QT602240_ACQUIRE_TCHAUTOCAL 4 +#define QT602240_ACQUIRE_SYNC 5 +#define QT602240_ACQUIRE_ATCHCALST 6 +#define QT602240_ACQUIRE_ATCHCALSTHR 7 + +/* QT602240_TOUCH_MULTI field */ +#define QT602240_TOUCH_CTRL 0 +#define QT602240_TOUCH_XORIGIN 1 +#define QT602240_TOUCH_YORIGIN 2 +#define QT602240_TOUCH_XSIZE 3 +#define QT602240_TOUCH_YSIZE 4 +#define QT602240_TOUCH_BLEN 6 +#define QT602240_TOUCH_TCHTHR 7 +#define QT602240_TOUCH_TCHDI 8 +#define QT602240_TOUCH_ORIENT 9 +#define QT602240_TOUCH_MOVHYSTI 11 +#define QT602240_TOUCH_MOVHYSTN 12 +#define QT602240_TOUCH_NUMTOUCH 14 +#define QT602240_TOUCH_MRGHYST 15 +#define QT602240_TOUCH_MRGTHR 16 +#define QT602240_TOUCH_AMPHYST 17 +#define QT602240_TOUCH_XRANGE_LSB 18 +#define QT602240_TOUCH_XRANGE_MSB 19 +#define QT602240_TOUCH_YRANGE_LSB 20 +#define QT602240_TOUCH_YRANGE_MSB 21 +#define QT602240_TOUCH_XLOCLIP 22 +#define QT602240_TOUCH_XHICLIP 23 +#define QT602240_TOUCH_YLOCLIP 24 +#define QT602240_TOUCH_YHICLIP 25 +#define QT602240_TOUCH_XEDGECTRL 26 +#define QT602240_TOUCH_XEDGEDIST 27 +#define QT602240_TOUCH_YEDGECTRL 28 +#define QT602240_TOUCH_YEDGEDIST 29 +#define QT602240_TOUCH_JUMPLIMIT 30 /* firmware ver 22 over */ + +/* QT602240_PROCI_GRIPFACE field */ +#define QT602240_GRIPFACE_CTRL 0 +#define QT602240_GRIPFACE_XLOGRIP 1 +#define QT602240_GRIPFACE_XHIGRIP 2 +#define QT602240_GRIPFACE_YLOGRIP 3 +#define QT602240_GRIPFACE_YHIGRIP 4 +#define QT602240_GRIPFACE_MAXTCHS 5 +#define QT602240_GRIPFACE_SZTHR1 7 +#define QT602240_GRIPFACE_SZTHR2 8 +#define QT602240_GRIPFACE_SHPTHR1 9 +#define QT602240_GRIPFACE_SHPTHR2 10 +#define QT602240_GRIPFACE_SUPEXTTO 11 + +/* QT602240_PROCI_NOISE field */ +#define QT602240_NOISE_CTRL 0 +#define QT602240_NOISE_OUTFLEN 1 +#define QT602240_NOISE_GCAFUL_LSB 3 +#define QT602240_NOISE_GCAFUL_MSB 4 +#define QT602240_NOISE_GCAFLL_LSB 5 +#define QT602240_NOISE_GCAFLL_MSB 6 +#define QT602240_NOISE_ACTVGCAFVALID 7 +#define QT602240_NOISE_NOISETHR 8 +#define QT602240_NOISE_FREQHOPSCALE 10 +#define QT602240_NOISE_FREQ0 11 +#define QT602240_NOISE_FREQ1 12 +#define QT602240_NOISE_FREQ2 13 +#define QT602240_NOISE_FREQ3 14 +#define QT602240_NOISE_FREQ4 15 +#define QT602240_NOISE_IDLEGCAFVALID 16 + +/* QT602240_SPT_COMMSCONFIG */ +#define QT602240_COMMS_CTRL 0 +#define QT602240_COMMS_CMD 1 + +/* QT602240_SPT_CTECONFIG field */ +#define QT602240_CTE_CTRL 0 +#define QT602240_CTE_CMD 1 +#define QT602240_CTE_MODE 2 +#define QT602240_CTE_IDLEGCAFDEPTH 3 +#define QT602240_CTE_ACTVGCAFDEPTH 4 +#define QT602240_CTE_VOLTAGE 5 /* firmware ver 21 over */ + +#define QT602240_VOLTAGE_DEFAULT 2700000 +#define QT602240_VOLTAGE_STEP 10000 + +/* Define for QT602240_GEN_COMMAND */ +#define QT602240_BOOT_VALUE 0xa5 +#define QT602240_BACKUP_VALUE 0x55 +#define QT602240_BACKUP_TIME 25 /* msec */ +#define QT602240_RESET_TIME 100 /* msec */ + +#define QT602240_FWRESET_TIME 175 /* msec */ + +/* Command to unlock bootloader */ +#define QT602240_UNLOCK_CMD_MSB 0xaa +#define QT602240_UNLOCK_CMD_LSB 0xdc + +/* Bootloader mode status */ +#define QT602240_WAITING_BOOTLOAD_CMD 0xc0 /* valid 7 6 bit only */ +#define QT602240_WAITING_FRAME_DATA 0x80 /* valid 7 6 bit only */ +#define QT602240_FRAME_CRC_CHECK 0x02 +#define QT602240_FRAME_CRC_FAIL 0x03 +#define QT602240_FRAME_CRC_PASS 0x04 +#define QT602240_APP_CRC_FAIL 0x40 /* valid 7 8 bit only */ +#define QT602240_BOOT_STATUS_MASK 0x3f + +/* Touch status */ +#define QT602240_SUPPRESS (1 << 1) +#define QT602240_AMP (1 << 2) +#define QT602240_VECTOR (1 << 3) +#define QT602240_MOVE (1 << 4) +#define QT602240_RELEASE (1 << 5) +#define QT602240_PRESS (1 << 6) +#define QT602240_DETECT (1 << 7) + +/* Touchscreen absolute values */ +#define QT602240_MAX_XC 539 +#define QT602240_MAX_YC 959 +#define QT602240_MAX_XW 539 +#define QT602240_MAX_YH 1023 +#define QT602240_MAX_AREA 0xff + +#define QT602240_MAX_FINGER 10 + +#define TOUCH_VIRTUAL_KEYS + +extern int sprd_3rdparty_gpio_tp_rst ; +extern int sprd_3rdparty_gpio_tp_irq ; + +static int qt602240_irq; + +/* Initial register values recommended from chip vendor */ +//mxt112E, version=1.0 (0x10) +static const u8 init_vals_ver_16[] = { + + + /* QT602240_GEN_COMMAND(6) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_USERDATA(38) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_GEN_POWER(7) */ + 0x20, 0x10, 0x32, + /* QT602240_GEN_ACQUIRE(8) */ + 0x10, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + /* QT602240_TOUCH_MULTI(9) */ + 0x83, 0x00, 0x00, 0x0d, 0x08, 0x00, 0x10, 60, 0x02, 0x05, + 0x00, 0x05, 0x05, 0x00, 0x04, 0x0a, 0x0a, 0x0a, 0x1f, 0x03, + 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_COMMCFG(18) */ + 0x00, 0x00, + /* QT602240_SPT_SELFTEST(25) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_GRIP(40) */ + 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_TOUCH(42) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_CTECONFIG(46) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_STYLUS(47) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_NOISE(48) */ + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 100, 0x04, 64, + 0x00, 0x00, 20, 0x00, 0x00, 28, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +static const u8 init_vals_ver_20[] = { + /* QT602240_GEN_COMMAND(6) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_GEN_POWER(7) */ + 0x20, 0xff, 0x32, + /* QT602240_GEN_ACQUIRE(8) */ + 0x08, 0x05, 0x05, 0x00, 0x00, 0x00, 0x05, 0x14, + /* QT602240_TOUCH_MULTI(9) */ + 0x00, 0x00, 0x00, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x64, + /* QT602240_TOUCH_KEYARRAY(15) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, + /* QT602240_SPT_GPIOPWM(19) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, + /* QT602240_PROCI_GRIPFACE(20) */ + 0x00, 0x64, 0x64, 0x64, 0x64, 0x00, 0x00, 0x1e, 0x14, 0x04, + 0x1e, 0x00, + /* QT602240_PROCG_NOISE(22) */ + 0x05, 0x00, 0x00, 0x19, 0x00, 0xe7, 0xff, 0x04, 0x32, 0x00, + 0x01, 0x0a, 0x0f, 0x14, 0x00, 0x00, 0xe8, + /* QT602240_TOUCH_PROXIMITY(23) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + /* QT602240_PROCI_ONETOUCH(24) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_SELFTEST(25) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_TWOTOUCH(27) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_CTECONFIG(28) */ + 0x00, 0x00, 0x00, 0x04, 0x08, +}; + +static const u8 init_vals_ver_21[] = { + /* QT602240_GEN_COMMAND(6) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_GEN_POWER(7) */ + 0x20, 0xff, 0x32, + /* QT602240_GEN_ACQUIRE(8) */ + 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23, + /* QT602240_TOUCH_MULTI(9) */ + 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_TOUCH_KEYARRAY(15) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, + /* QT602240_SPT_GPIOPWM(19) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_GRIPFACE(20) */ + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04, + 0x0f, 0x0a, + /* QT602240_PROCG_NOISE(22) */ + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00, + 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03, + /* QT602240_TOUCH_PROXIMITY(23) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, + /* QT602240_PROCI_ONETOUCH(24) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_SELFTEST(25) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_TWOTOUCH(27) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_CTECONFIG(28) */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, +}; + +static const u8 init_vals_ver_22[] = { + /* QT602240_GEN_COMMAND(6) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_GEN_POWER(7) */ + 0x20, 0x10, 0x32, + /* QT602240_GEN_ACQUIRE(8) */ + 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x23, + /* QT602240_TOUCH_MULTI(9) */ + 0x00, 0x00, 0x00, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x01, 0x01, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, + /* QT602240_TOUCH_KEYARRAY(15) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, + /* QT602240_SPT_GPIOPWM(19) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_GRIPFACE(20) */ + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x28, 0x04, + 0x0f, 0x0a, + /* QT602240_PROCG_NOISE(22) */ + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x23, 0x00, + 0x00, 0x05, 0x0f, 0x19, 0x23, 0x2d, 0x03, + /* QT602240_TOUCH_PROXIMITY(23) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_ONETOUCH(24) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_SELFTEST(25) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_TWOTOUCH(27) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_CTECONFIG(28) */ + 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, +}; + +static const u8 init_vals_ver_32[] = { + /* QT602240_GEN_COMMAND(6) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_GEN_POWER(7) */ + 0x1e, 0xff, 0x32, + /* QT602240_GEN_ACQUIRE(8) */ + 0x06, 0x00, 0x14, 0x14, 0x00, 0x00, 0x05, 0x14, 0x00, 0x00, + /* QT602240_TOUCH_MULTI(9) */ + 0x83, 0x00, 0x00, 0x13, 0x0b, 0x01, 0x20, 0x32, 0x03, 0x01, + 0x0a, 0x06, 0x03, 0x3f, 0x05, 0x1e, 0x1e, 0x1e, 0xff, 0x03, + 0x1b, 0x02, 0x11, 0x0a, 0x0f, 0x13, 0xd0, 0x2b, 0xd0, 0x52, + 0x12, 0x0a, + /* QT602240_TOUCH_KEYARRAY(15) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, + /* QT602240_SPT_GPIOPWM(19) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_GRIPFACE(20) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, + /* QT602240_PROCG_NOISE(22) */ + 0x8d, 0x00, 0x00, 0x19, 0x00, 0xe7, 0xff, 0x04, 0x32, 0x00, + 0x00, 0x10, 0x1f, 0x39, 0x41, 0x10, 0x04, + /* QT602240_TOUCH_PROXIMITY(23) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_PROCI_ONETOUCH(24) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_SELFTEST(25) */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + /* QT602240_SPT_CTECONFIG(28) */ + 0x00, 0x00, 0x03, 0x10, 0x10, 0x1e, +}; + + +struct qt602240_info { + u8 family_id; + u8 variant_id; + u8 version; + u8 build; + u8 matrix_xsize; + u8 matrix_ysize; + u8 object_num; +}; + +struct qt602240_object { + u8 type; + u16 start_address; + u8 size; + u8 instances; + u8 num_report_ids; + + /* to map object and message */ + u8 max_reportid; +}; + +struct qt602240_message { + u8 reportid; + u8 message[7]; + u8 checksum; +}; + +struct qt602240_finger { + int status; + int x; + int y; + int area; +}; + +static ssize_t qt602240_set_calibrate(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len); + +/* Each client has this additional data */ +struct qt602240_data { + struct i2c_client *client; + struct input_dev *input_dev; + const struct qt602240_platform_data *pdata; + struct qt602240_object *object_table; + struct qt602240_info info; + struct qt602240_finger finger[QT602240_MAX_FINGER]; + struct early_suspend qt602240_early_suspend; + unsigned int irq; +}; +static struct qt602240_data *g_qt602240_ts; +static bool qt602240_object_readable(unsigned int type) +{ + switch (type) { + case QT602240_GEN_MESSAGE: + case QT602240_GEN_COMMAND: + case QT602240_GEN_POWER: + case QT602240_GEN_ACQUIRE: + case QT602240_TOUCH_MULTI: + case QT602240_TOUCH_KEYARRAY: + case QT602240_TOUCH_PROXIMITY: + case QT602240_PROCI_GRIPFACE: + case QT602240_PROCG_NOISE: + case QT602240_PROCI_ONETOUCH: + case QT602240_PROCI_TWOTOUCH: + case QT602240_SPT_COMMSCONFIG: + case QT602240_SPT_GPIOPWM: + case QT602240_SPT_SELFTEST: + case QT602240_SPT_CTECONFIG: + case QT602240_SPT_USERDATA: + return true; + default: + return false; + } +} + +static bool qt602240_object_writable(unsigned int type) +{ + switch (type) { + case QT602240_GEN_COMMAND: + case QT602240_GEN_POWER: + case QT602240_GEN_ACQUIRE: + case QT602240_TOUCH_MULTI: + case QT602240_TOUCH_KEYARRAY: + case QT602240_TOUCH_PROXIMITY: + case QT602240_PROCI_GRIPFACE: + case QT602240_PROCG_NOISE: + case QT602240_PROCI_ONETOUCH: + case QT602240_PROCI_TWOTOUCH: + case QT602240_SPT_GPIOPWM: + case QT602240_SPT_SELFTEST: + case QT602240_SPT_CTECONFIG: + return true; + default: + return false; + } +} + +static void qt602240_dump_message(struct device *dev, + struct qt602240_message *message) +{ + dev_dbg(dev, "reportid:\t0x%x\n", message->reportid); + dev_dbg(dev, "message1:\t0x%x\n", message->message[0]); + dev_dbg(dev, "message2:\t0x%x\n", message->message[1]); + dev_dbg(dev, "message3:\t0x%x\n", message->message[2]); + dev_dbg(dev, "message4:\t0x%x\n", message->message[3]); + dev_dbg(dev, "message5:\t0x%x\n", message->message[4]); + dev_dbg(dev, "message6:\t0x%x\n", message->message[5]); + dev_dbg(dev, "message7:\t0x%x\n", message->message[6]); + dev_dbg(dev, "checksum:\t0x%x\n", message->checksum); +} + +static int qt602240_check_bootloader(struct i2c_client *client, + unsigned int state) +{ + u8 val; + +recheck: + if (i2c_master_recv(client, &val, 1) != 1) { + dev_err(&client->dev, "%s: i2c recv failed\n", __func__); + return -EIO; + } + + switch (state) { + case QT602240_WAITING_BOOTLOAD_CMD: + case QT602240_WAITING_FRAME_DATA: + val &= ~QT602240_BOOT_STATUS_MASK; + break; + case QT602240_FRAME_CRC_PASS: + if (val == QT602240_FRAME_CRC_CHECK) + goto recheck; + break; + default: + return -EINVAL; + } + + if (val != state) { + dev_err(&client->dev, "Unvalid bootloader mode state\n"); + return -EINVAL; + } + + return 0; +} + +static int qt602240_unlock_bootloader(struct i2c_client *client) +{ + u8 buf[2]; + + buf[0] = QT602240_UNLOCK_CMD_LSB; + buf[1] = QT602240_UNLOCK_CMD_MSB; + + if (i2c_master_send(client, buf, 2) != 2) { + dev_err(&client->dev, "%s: i2c send failed\n", __func__); + return -EIO; + } + + return 0; +} + +static int qt602240_fw_write(struct i2c_client *client, + const u8 *data, unsigned int frame_size) +{ + if (i2c_master_send(client, data, frame_size) != frame_size) { + dev_err(&client->dev, "%s: i2c send failed\n", __func__); + return -EIO; + } + + return 0; +} + +static int __qt602240_read_reg(struct i2c_client *client, + u16 reg, u16 len, void *val) +{ + struct i2c_msg xfer[2]; + u8 buf[2]; + + buf[0] = reg & 0xff; + buf[1] = (reg >> 8) & 0xff; + + /* Write register */ + xfer[0].addr = client->addr; + xfer[0].flags = 0; + xfer[0].len = 2; + xfer[0].buf = buf; + + /* Read data */ + xfer[1].addr = client->addr; + xfer[1].flags = I2C_M_RD; + xfer[1].len = len; + xfer[1].buf = val; + + if (i2c_transfer(client->adapter, xfer, 2) != 2) { + dev_err(&client->dev, "%s: i2c transfer failed\n", __func__); + return -EIO; + } + + return 0; +} + +static int qt602240_read_reg(struct i2c_client *client, u16 reg, u8 *val) +{ + return __qt602240_read_reg(client, reg, 1, val); +} + +static int qt602240_write_reg(struct i2c_client *client, u16 reg, u8 val) +{ + u8 buf[3]; + + buf[0] = reg & 0xff; + buf[1] = (reg >> 8) & 0xff; + buf[2] = val; + + if (i2c_master_send(client, buf, 3) != 3) { + dev_err(&client->dev, "%s: i2c send failed\n", __func__); + return -EIO; + } + + return 0; +} + +static int qt602240_read_object_table(struct i2c_client *client, + u16 reg, u8 *object_buf) +{ + return __qt602240_read_reg(client, reg, QT602240_OBJECT_SIZE, + object_buf); +} + +static struct qt602240_object * +qt602240_get_object(struct qt602240_data *data, u8 type) +{ + struct qt602240_object *object; + int i; + + for (i = 0; i < data->info.object_num; i++) { + object = data->object_table + i; + if (object->type == type) + return object; + } + + dev_err(&data->client->dev, "Invalid object type\n"); + return NULL; +} + +static int qt602240_read_message(struct qt602240_data *data, + struct qt602240_message *message) +{ + struct qt602240_object *object; + u16 reg; + + object = qt602240_get_object(data, QT602240_GEN_MESSAGE); + if (!object) + return -EINVAL; + + reg = object->start_address; + return __qt602240_read_reg(data->client, reg, + sizeof(struct qt602240_message), message); +} + +static int qt602240_read_object(struct qt602240_data *data, + u8 type, u8 offset, u8 *val) +{ + struct qt602240_object *object; + u16 reg; + + object = qt602240_get_object(data, type); + if (!object) + return -EINVAL; + + reg = object->start_address; + return __qt602240_read_reg(data->client, reg + offset, 1, val); +} + +static int qt602240_write_object(struct qt602240_data *data, + u8 type, u8 offset, u8 val) +{ + struct qt602240_object *object; + u16 reg; + + object = qt602240_get_object(data, type); + if (!object) + return -EINVAL; + + reg = object->start_address; + return qt602240_write_reg(data->client, reg + offset, val); +} + +#ifdef TOUCH_VIRTUAL_KEYS + +static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, + __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":100:1020:80:65" + ":" __stringify(EV_KEY) ":" __stringify(KEY_HOME) ":280:1020:80:65" + ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":470:1020:80:65" + "\n"); +} + +static struct kobj_attribute virtual_keys_attr = { + .attr = { + .name = "virtualkeys.qt602240_ts", + .mode = S_IRUGO, + }, + .show = &virtual_keys_show, +}; + +static struct attribute *properties_attrs[] = { + &virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group properties_attr_group = { + .attrs = properties_attrs, +}; + +static void qt602240_ts_virtual_keys_init(void) +{ + int ret; + struct kobject *properties_kobj; + + printk("%s\n",__func__); + + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &properties_attr_group); + if (!properties_kobj || ret) + pr_err("failed to create board_properties\n"); +} + +#endif + +static DEVICE_ATTR(calibrate, S_IRUGO | S_IWUSR, NULL, qt602240_set_calibrate); + +static ssize_t qt602240_set_calibrate(struct device* cd, struct device_attribute *attr, + const char* buf, size_t len) +{ + unsigned long on_off = simple_strtoul(buf, NULL, 10); + struct i2c_client *client = to_i2c_client(cd); + struct qt602240_data *data = i2c_get_clientdata(client); + + if(on_off==1) + { + printk("qt602240 calibrate\n"); + qt602240_write_object(data, QT602240_GEN_COMMAND, + QT602240_COMMAND_CALIBRATE, 1); + msleep(1000); + } + + return len; +} + +static int qt602240_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + printk("%s\n", __func__); + + err = device_create_file(dev, &dev_attr_calibrate); + + return err; +} + +static void qt602240_input_report(struct qt602240_data *data, int single_id) +{ + struct qt602240_finger *finger = data->finger; + struct input_dev *input_dev = data->input_dev; + int status = finger[single_id].status; + int finger_num = 0; + int id; + + for (id = 0; id < QT602240_MAX_FINGER; id++) { + if (!finger[id].status) + continue; + + input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, + finger[id].status != QT602240_RELEASE ? + finger[id].area : 0); + input_report_abs(input_dev, ABS_MT_POSITION_X, + finger[id].x); + input_report_abs(input_dev, ABS_MT_POSITION_Y, + finger[id].y); + input_mt_sync(input_dev); + + if (finger[id].status == QT602240_RELEASE) + finger[id].status = 0; + else + finger_num++; + } + + input_report_key(input_dev, BTN_TOUCH, finger_num > 0); + + if (status != QT602240_RELEASE) { + input_report_abs(input_dev, ABS_X, finger[single_id].x); + input_report_abs(input_dev, ABS_Y, finger[single_id].y); + } + input_sync(input_dev); +} + +static void qt602240_input_touchevent(struct qt602240_data *data, + struct qt602240_message *message, int id) +{ + struct qt602240_finger *finger = data->finger; + struct device *dev = &data->client->dev; + struct input_dev *input_dev = data->input_dev; + u8 status = message->message[0]; + int x; + int y; + int area; + + /* Check the touch is present on the screen */ + if (!(status & QT602240_DETECT)) { + if (status & QT602240_RELEASE) { + dev_dbg(dev, "[%d] released\n", id); + + finger[id].status = QT602240_RELEASE; + qt602240_input_report(data, id); + } + return; + } + + /* Check only AMP detection */ + if (!(status & (QT602240_PRESS | QT602240_MOVE))) + return; + + x = (message->message[1] << 2) | ((message->message[3] & ~0x3f) >> 6); + y = (message->message[2] << 2) | ((message->message[3] & ~0xf3) >> 2); + area = message->message[4]; + + finger[id].status = status & QT602240_MOVE ? + QT602240_MOVE : QT602240_PRESS; + finger[id].x = QT602240_MAX_XW - x; + finger[id].y = QT602240_MAX_YH - y; + finger[id].area = area; + + dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id, + status & QT602240_MOVE ? "moved" : "pressed", + finger[id].x, finger[id].y, area); + + qt602240_input_report(data, id); +} + +static irqreturn_t qt602240_interrupt(int irq, void *dev_id) +{ + struct qt602240_data *data = dev_id; + struct qt602240_message message; + struct qt602240_object *object; + struct device *dev = &data->client->dev; + int id; + u8 reportid; + u8 max_reportid; + u8 min_reportid; + int count = 20; + + disable_irq_nosync(data->client->irq); + + do { + if (qt602240_read_message(data, &message)) { + dev_err(dev, "Failed to read message\n"); + } + + reportid = message.reportid; + + /* whether reportid is thing of QT602240_TOUCH_MULTI */ + object = qt602240_get_object(data, QT602240_TOUCH_MULTI); + + max_reportid = object->max_reportid; + min_reportid = max_reportid - object->num_report_ids + 1; + id = reportid - min_reportid; + + if (reportid >= min_reportid && reportid <= max_reportid) + qt602240_input_touchevent(data, &message, id); + else + qt602240_dump_message(dev, &message); + } while((reportid != 0xff) && --count); + enable_irq(data->client->irq); + return IRQ_HANDLED; +} + +static int qt602240_check_reg_init(struct qt602240_data *data) +{ + struct qt602240_object *object; + struct device *dev = &data->client->dev; + int index = 0; + int i, j; + u8 version = data->info.version; + u8 *init_vals; + + switch (version) { + case QT602240_VER_16: + init_vals = (u8 *)init_vals_ver_16; + break; + case QT602240_VER_20: + init_vals = (u8 *)init_vals_ver_20; + break; + case QT602240_VER_21: + init_vals = (u8 *)init_vals_ver_21; + break; + case QT602240_VER_22: + init_vals = (u8 *)init_vals_ver_22; + break; + case QT602240_VER_32: + init_vals = (u8 *)init_vals_ver_32; + break; + default: + dev_err(dev, "Firmware version %d doesn't support\n", version); + return -EINVAL; + } + + for (i = 0; i < data->info.object_num; i++) { + object = data->object_table + i; + + if (!qt602240_object_writable(object->type)) + continue; + + for (j = 0; j < object->size + 1; j++) + qt602240_write_object(data, object->type, j, + init_vals[index + j]); + + index += object->size + 1; + } + + return 0; +} + +#if 0 +static int qt602240_check_matrix_size(struct qt602240_data *data) +{ + const struct qt602240_platform_data *pdata = data->pdata; + struct device *dev = &data->client->dev; + int mode = -1; + int error; + u8 val; + + dev_dbg(dev, "Number of X lines: %d\n", pdata->x_line); + dev_dbg(dev, "Number of Y lines: %d\n", pdata->y_line); + + switch (pdata->x_line) { + case 0 ... 15: + if (pdata->y_line <= 14) + mode = 0; + break; + case 16: + if (pdata->y_line <= 12) + mode = 1; + if (pdata->y_line == 13 || pdata->y_line == 14) + mode = 0; + break; + case 17: + if (pdata->y_line <= 11) + mode = 2; + if (pdata->y_line == 12 || pdata->y_line == 13) + mode = 1; + break; + case 18: + if (pdata->y_line <= 10) + mode = 3; + if (pdata->y_line == 11 || pdata->y_line == 12) + mode = 2; + break; + case 19: + if (pdata->y_line <= 9) + mode = 4; + if (pdata->y_line == 10 || pdata->y_line == 11) + mode = 3; + break; + case 20: + mode = 4; + } + + if (mode < 0) { + dev_err(dev, "Invalid X/Y lines\n"); + return -EINVAL; + } + + error = qt602240_read_object(data, QT602240_SPT_CTECONFIG, + QT602240_CTE_MODE, &val); + if (error) + return error; + + if (mode == val) + return 0; + + /* Change the CTE configuration */ + qt602240_write_object(data, QT602240_SPT_CTECONFIG, + QT602240_CTE_CTRL, 1); + qt602240_write_object(data, QT602240_SPT_CTECONFIG, + QT602240_CTE_MODE, mode); + qt602240_write_object(data, QT602240_SPT_CTECONFIG, + QT602240_CTE_CTRL, 0); + + return 0; +} +#endif + +static int qt602240_make_highchg(struct qt602240_data *data) +{ + struct qt602240_message message; + struct device *dev = &data->client->dev; + int count = 10; + + /* Read dummy message to make high CHG pin */ + + do { + qt602240_read_message(data, &message); + } while ((message.reportid != 0xff) && --count); + + if (!count) { + dev_err(dev, "CHG pin isn't cleared\n"); + return -EBUSY; + } + + return 0; +} +#if 0 +static void qt602240_handle_pdata(struct qt602240_data *data) +{ + const struct qt602240_platform_data *pdata = data->pdata; + u8 voltage; + + /* Set touchscreen lines */ + qt602240_write_object(data, QT602240_TOUCH_MULTI, QT602240_TOUCH_XSIZE, + pdata->x_line); + qt602240_write_object(data, QT602240_TOUCH_MULTI, QT602240_TOUCH_YSIZE, + pdata->y_line); + + /* Set touchscreen orient */ + qt602240_write_object(data, QT602240_TOUCH_MULTI, QT602240_TOUCH_ORIENT, + pdata->orient); + + /* Set touchscreen burst length */ + qt602240_write_object(data, QT602240_TOUCH_MULTI, + QT602240_TOUCH_BLEN, pdata->blen); + + /* Set touchscreen threshold */ + qt602240_write_object(data, QT602240_TOUCH_MULTI, + QT602240_TOUCH_TCHTHR, pdata->threshold); + + /* Set touchscreen resolution */ + qt602240_write_object(data, QT602240_TOUCH_MULTI, + QT602240_TOUCH_XRANGE_LSB, (pdata->x_size - 1) & 0xff); + qt602240_write_object(data, QT602240_TOUCH_MULTI, + QT602240_TOUCH_XRANGE_MSB, (pdata->x_size - 1) >> 8); + qt602240_write_object(data, QT602240_TOUCH_MULTI, + QT602240_TOUCH_YRANGE_LSB, (pdata->y_size - 1) & 0xff); + qt602240_write_object(data, QT602240_TOUCH_MULTI, + QT602240_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8); + + /* Set touchscreen voltage */ + if (data->info.version >= QT602240_VER_21 && pdata->voltage) { + if (pdata->voltage < QT602240_VOLTAGE_DEFAULT) { + voltage = (QT602240_VOLTAGE_DEFAULT - pdata->voltage) / + QT602240_VOLTAGE_STEP; + voltage = 0xff - voltage + 1; + } else + voltage = (pdata->voltage - QT602240_VOLTAGE_DEFAULT) / + QT602240_VOLTAGE_STEP; + + qt602240_write_object(data, QT602240_SPT_CTECONFIG, + QT602240_CTE_VOLTAGE, voltage); + } +} +#endif +static int qt602240_get_info(struct qt602240_data *data) +{ + struct i2c_client *client = data->client; + struct qt602240_info *info = &data->info; + int error; + u8 val; + + error = qt602240_read_reg(client, QT602240_FAMILY_ID, &val); + if (error) + return error; + info->family_id = val; + + error = qt602240_read_reg(client, QT602240_VARIANT_ID, &val); + if (error) + return error; + info->variant_id = val; + + error = qt602240_read_reg(client, QT602240_VERSION, &val); + if (error) + return error; + info->version = val; + + error = qt602240_read_reg(client, QT602240_BUILD, &val); + if (error) + return error; + info->build = val; + + error = qt602240_read_reg(client, QT602240_OBJECT_NUM, &val); + if (error) + return error; + info->object_num = val; + + return 0; +} + +static int qt602240_get_object_table(struct qt602240_data *data) +{ + int error; + int i; + u16 reg; + u8 reportid = 0; + u8 buf[QT602240_OBJECT_SIZE]; + + for (i = 0; i < data->info.object_num; i++) { + struct qt602240_object *object = data->object_table + i; + + reg = QT602240_OBJECT_START + QT602240_OBJECT_SIZE * i; + error = qt602240_read_object_table(data->client, reg, buf); + if (error) + return error; + + object->type = buf[0]; + object->start_address = (buf[2] << 8) | buf[1]; + object->size = buf[3]; + object->instances = buf[4]; + object->num_report_ids = buf[5]; + + if (object->num_report_ids) { + reportid += object->num_report_ids * + (object->instances + 1); + object->max_reportid = reportid; + } + } + + return 0; +} + +static void qt602240_pininit(int irq_pin, int rst_pin) +{ + printk(KERN_INFO "%s [irq=%d];[rst=%d]\n",__func__,irq_pin,rst_pin); + gpio_request(irq_pin, "ts_irq_pin"); + gpio_request(rst_pin, "ts_rst_pin"); + gpio_set_debounce(irq_pin, 1); +} + +static void qt602240_pwron(struct device *dev) +{ + struct regulator *reg_vdd; + reg_vdd = regulator_get(dev, REGU_NAME_TP); + regulator_set_voltage(reg_vdd, 2700000, 2800000); + regulator_enable(reg_vdd); + msleep(20); +} + +static void qt602240_reset(int reset_pin) +{ + gpio_direction_output(reset_pin, 1); + msleep(3); + gpio_set_value(reset_pin, 0); + msleep(10); + gpio_set_value(reset_pin,1); + msleep(30); +} + +static int qt602240_initialize(struct qt602240_data *data) +{ + struct i2c_client *client = data->client; + struct qt602240_info *info = &data->info; + int error; + u8 val; + + error = qt602240_get_info(data); + if (error) + return error; + + data->object_table = kcalloc(info->object_num, + sizeof(struct qt602240_data), + GFP_KERNEL); + if (!data->object_table) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + /* Get object table information */ + error = qt602240_get_object_table(data); + if (error) + return error; + + /* Check register init values */ + error = qt602240_check_reg_init(data); + if (error) + return error; + + /* Check X/Y matrix size */ + //error = qt602240_check_matrix_size(data); + //if (error) + // return error; + + error = qt602240_make_highchg(data); + if (error) + return error; + + //qt602240_handle_pdata(data); + + /* Backup to memory */ + qt602240_write_object(data, QT602240_GEN_COMMAND, + QT602240_COMMAND_BACKUPNV, + QT602240_BACKUP_VALUE); + msleep(QT602240_BACKUP_TIME); + + /* Soft reset */ + qt602240_write_object(data, QT602240_GEN_COMMAND, + QT602240_COMMAND_RESET, 1); + msleep(QT602240_RESET_TIME); + + error = qt602240_make_highchg(data); + if (error) + return error; + + /* Update matrix size at info struct */ + error = qt602240_read_reg(client, QT602240_MATRIX_X_SIZE, &val); + if (error) + return error; + info->matrix_xsize = val; + + error = qt602240_read_reg(client, QT602240_MATRIX_Y_SIZE, &val); + if (error) + return error; + info->matrix_ysize = val; + + dev_info(&client->dev, + "Family ID: %d Variant ID: %d Version: %d Build: %d\n", + info->family_id, info->variant_id, info->version, + info->build); + + dev_info(&client->dev, + "Matrix X Size: %d Matrix Y Size: %d Object Num: %d\n", + info->matrix_xsize, info->matrix_ysize, + info->object_num); + + return 0; +} + +static ssize_t qt602240_object_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct qt602240_data *data = dev_get_drvdata(dev); + struct qt602240_object *object; + int count = 0; + int i, j; + int error; + u8 val; + + qt602240_make_highchg(data); + + for (i = 0; i < data->info.object_num; i++) { + object = data->object_table + i; + + count += sprintf(buf + count, + "Object Table Element %d(Type %d)\n", + i + 1, object->type); + + if (!qt602240_object_readable(object->type)) { + count += sprintf(buf + count, "\n"); + continue; + } + + for (j = 0; j < object->size + 1; j++) { + error = qt602240_read_object(data, + object->type, j, &val); + if (error) + return error; + + count += sprintf(buf + count, + " Byte %d: 0x%x (%d)\n", j, val, val); + } + + count += sprintf(buf + count, "\n"); + } + + return count; +} + +static int qt602240_load_fw(struct device *dev, const char *fn) +{ + struct qt602240_data *data = dev_get_drvdata(dev); + struct i2c_client *client = data->client; + const struct firmware *fw = NULL; + unsigned int frame_size; + unsigned int pos = 0; + int ret; + + ret = request_firmware(&fw, fn, dev); + if (ret) { + dev_err(dev, "Unable to open firmware %s\n", fn); + return ret; + } + + /* Change to the bootloader mode */ + qt602240_write_object(data, QT602240_GEN_COMMAND, + QT602240_COMMAND_RESET, QT602240_BOOT_VALUE); + msleep(QT602240_RESET_TIME); + + /* Change to slave address of bootloader */ + if (client->addr == QT602240_APP_LOW) + client->addr = QT602240_BOOT_LOW; + else + client->addr = QT602240_BOOT_HIGH; + + ret = qt602240_check_bootloader(client, QT602240_WAITING_BOOTLOAD_CMD); + if (ret) + goto out; + + /* Unlock bootloader */ + qt602240_unlock_bootloader(client); + + while (pos < fw->size) { + ret = qt602240_check_bootloader(client, + QT602240_WAITING_FRAME_DATA); + if (ret) + goto out; + + frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1)); + + /* We should add 2 at frame size as the the firmware data is not + * included the CRC bytes. + */ + frame_size += 2; + + /* Write one frame to device */ + qt602240_fw_write(client, fw->data + pos, frame_size); + + ret = qt602240_check_bootloader(client, + QT602240_FRAME_CRC_PASS); + if (ret) + goto out; + + pos += frame_size; + + dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size); + } + +out: + release_firmware(fw); + + /* Change to slave address of application */ + if (client->addr == QT602240_BOOT_LOW) + client->addr = QT602240_APP_LOW; + else + client->addr = QT602240_APP_HIGH; + + return ret; +} + +static ssize_t qt602240_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct qt602240_data *data = dev_get_drvdata(dev); + unsigned int version; + int error; + + if (sscanf(buf, "%u", &version) != 1) { + dev_err(dev, "Invalid values\n"); + return -EINVAL; + } + + if (data->info.version < QT602240_VER_21 || version < QT602240_VER_21) { + dev_err(dev, "FW update supported starting with version 21\n"); + return -EINVAL; + } + + disable_irq(data->irq); + + error = qt602240_load_fw(dev, QT602240_FW_NAME); + if (error) { + dev_err(dev, "The firmware update failed(%d)\n", error); + count = error; + } else { + dev_dbg(dev, "The firmware update succeeded\n"); + + /* Wait for reset */ + msleep(QT602240_FWRESET_TIME); + + kfree(data->object_table); + data->object_table = NULL; + + qt602240_initialize(data); + } + + enable_irq(data->irq); + + return count; +} + + +static DEVICE_ATTR(object, 0444, qt602240_object_show, NULL); +static DEVICE_ATTR(update_fw, 0664, NULL, qt602240_update_fw_store); + +static struct attribute *qt602240_attrs[] = { + &dev_attr_object.attr, + &dev_attr_update_fw.attr, + NULL +}; + +static const struct attribute_group qt602240_attr_group = { + .attrs = qt602240_attrs, +}; + +static void qt602240_start(struct qt602240_data *data) +{ + /* Touch enable */ + qt602240_write_object(data, + QT602240_TOUCH_MULTI, QT602240_TOUCH_CTRL, 0x83); +} + +static void qt602240_stop(struct qt602240_data *data) +{ + /* Touch disable */ + qt602240_write_object(data, + QT602240_TOUCH_MULTI, QT602240_TOUCH_CTRL, 0); +} + +static int qt602240_input_open(struct input_dev *dev) +{ + struct qt602240_data *data = input_get_drvdata(dev); + + qt602240_start(data); + + return 0; +} + +static void qt602240_input_close(struct input_dev *dev) +{ + struct qt602240_data *data = input_get_drvdata(dev); + + qt602240_stop(data); +} + +static void qt602240_ts_suspend(struct early_suspend *handler) +{ + struct qt602240_data *data = g_qt602240_ts; + struct input_dev *input_dev = data->input_dev; + + printk(KERN_INFO "==%s==, irq=%d\n", __func__,qt602240_irq); + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + qt602240_stop(data); + + mutex_unlock(&input_dev->mutex); +} + +static void qt602240_ts_resume(struct early_suspend *handler) +{ + struct qt602240_data *data = g_qt602240_ts; + struct input_dev *input_dev = data->input_dev; + + printk(KERN_INFO "==%s==, irq=%d\n", __func__,qt602240_irq); + /* Soft reset */ + qt602240_write_object(data, QT602240_GEN_COMMAND, + QT602240_COMMAND_RESET, 1); + + msleep(QT602240_RESET_TIME); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + qt602240_start(data); + + mutex_unlock(&input_dev->mutex); +} + +static int __devinit qt602240_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct qt602240_data *data; + struct input_dev *input_dev; + struct qt602240_platform_data *pdata = client->dev.platform_data; + int error; + + if (!pdata) + return -EINVAL; + + data = kzalloc(sizeof(struct qt602240_data), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!data || !input_dev) { + dev_err(&client->dev, "Failed to allocate memory\n"); + error = -ENOMEM; + goto err_free_mem; + } + + g_qt602240_ts = data; + +#ifdef TOUCH_VIRTUAL_KEYS + qt602240_ts_virtual_keys_init(); +#endif + + input_dev->name = client->name; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->open = qt602240_input_open; + input_dev->close = qt602240_input_close; + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_SYN, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(ABS_MT_TOUCH_MAJOR, input_dev->absbit); + __set_bit(ABS_MT_POSITION_X, input_dev->absbit); + __set_bit(ABS_MT_POSITION_Y, input_dev->absbit); + __set_bit(ABS_MT_WIDTH_MAJOR, input_dev->absbit); + __set_bit(KEY_MENU, input_dev->keybit); + __set_bit(KEY_BACK, input_dev->keybit); + __set_bit(KEY_HOME, input_dev->keybit); + + /* For single touch */ + input_set_abs_params(input_dev, ABS_X, + 0, QT602240_MAX_XC, 0, 0); + input_set_abs_params(input_dev, ABS_Y, + 0, QT602240_MAX_YC, 0, 0); + + /* For multi touch */ + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, + 0, QT602240_MAX_AREA, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, + 0, QT602240_MAX_XC, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, + 0, QT602240_MAX_YC, 0, 0); + + input_set_drvdata(input_dev, data); + + qt602240_pininit(pdata->irq_gpio_number,pdata->reset_gpio_number); + + qt602240_pwron(&client->dev); + + qt602240_reset(pdata->reset_gpio_number); + + client->irq = gpio_to_irq(pdata->irq_gpio_number); + + data->client = client; + data->input_dev = input_dev; + data->pdata = pdata; + data->irq = client->irq; + + i2c_set_clientdata(client, data); + + error = qt602240_initialize(data); + if (error) + goto err_free_object; + + error = input_register_device(input_dev); + if (error) + goto err_free_object; + + printk("irq data->client->irq=%d\n",data->client->irq); + error = request_threaded_irq(client->irq, NULL, qt602240_interrupt, + IRQF_TRIGGER_LOW, client->dev.driver->name, data); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + goto err_free_irq; + } + + data->qt602240_early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + data->qt602240_early_suspend.suspend = qt602240_ts_suspend; + data->qt602240_early_suspend.resume = qt602240_ts_resume; + register_early_suspend(&data->qt602240_early_suspend); + + qt602240_create_sysfs(client); + error = sysfs_create_group(&client->dev.kobj, &qt602240_attr_group); + if (error) + goto err_unregister_device; + + return 0; + +err_unregister_device: + input_unregister_device(input_dev); + input_dev = NULL; +err_free_irq: + free_irq(client->irq, data); +err_free_object: + kfree(data->object_table); +err_free_mem: + input_free_device(input_dev); + kfree(data); + return error; +} + +static int __devexit qt602240_remove(struct i2c_client *client) +{ + struct qt602240_data *data = i2c_get_clientdata(client); + + sysfs_remove_group(&client->dev.kobj, &qt602240_attr_group); + free_irq(data->irq, data); + input_unregister_device(data->input_dev); + kfree(data->object_table); + kfree(data); + + return 0; +} + +#if 0 +#ifdef CONFIG_PM +static int qt602240_suspend(struct i2c_client *client, pm_message_t mesg) +{ + struct qt602240_data *data = i2c_get_clientdata(client); + struct input_dev *input_dev = data->input_dev; + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + qt602240_stop(data); + + mutex_unlock(&input_dev->mutex); + + return 0; +} + +static int qt602240_resume(struct i2c_client *client) +{ + struct qt602240_data *data = i2c_get_clientdata(client); + struct input_dev *input_dev = data->input_dev; + + /* Soft reset */ + qt602240_write_object(data, QT602240_GEN_COMMAND, + QT602240_COMMAND_RESET, 1); + + msleep(QT602240_RESET_TIME); + + mutex_lock(&input_dev->mutex); + + if (input_dev->users) + qt602240_start(data); + + mutex_unlock(&input_dev->mutex); + + return 0; +} +#else +#define qt602240_suspend NULL +#define qt602240_resume NULL +#endif +#endif + +static const struct i2c_device_id qt602240_id[] = { + { "qt602240_ts", 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, qt602240_id); + +static struct i2c_driver qt602240_driver = { + .driver = { + .name = "qt602240_ts", + .owner = THIS_MODULE, + }, + .probe = qt602240_probe, + .remove = __devexit_p(qt602240_remove), + //.suspend = qt602240_suspend, + //.resume = qt602240_resume, + .id_table = qt602240_id, +}; + +static int __init qt602240_init(void) +{ + return i2c_add_driver(&qt602240_driver); +} + +static void __exit qt602240_exit(void) +{ + i2c_del_driver(&qt602240_driver); +} + +module_init(qt602240_init); +module_exit(qt602240_exit); + +/* Module information */ +MODULE_AUTHOR("Joonyoung Shim "); +MODULE_DESCRIPTION("AT42QT602240/ATMXT224 Touchscreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/s3c2410_ts.c b/drivers/input/touchscreen/s3c2410_ts.c new file mode 100644 index 00000000..b061af2c --- /dev/null +++ b/drivers/input/touchscreen/s3c2410_ts.c @@ -0,0 +1,441 @@ +/* + * Samsung S3C24XX touchscreen driver + * + * This program is free software; you can redistribute it and/or modify + * it under the term of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Copyright 2004 Arnaud Patard + * Copyright 2008 Ben Dooks + * Copyright 2009 Simtec Electronics + * + * Additional work by Herbert Pötzl and + * Harald Welte + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define TSC_SLEEP (S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_XY_PST(0)) + +#define INT_DOWN (0) +#define INT_UP (1 << 8) + +#define WAIT4INT (S3C2410_ADCTSC_YM_SEN | \ + S3C2410_ADCTSC_YP_SEN | \ + S3C2410_ADCTSC_XP_SEN | \ + S3C2410_ADCTSC_XY_PST(3)) + +#define AUTOPST (S3C2410_ADCTSC_YM_SEN | \ + S3C2410_ADCTSC_YP_SEN | \ + S3C2410_ADCTSC_XP_SEN | \ + S3C2410_ADCTSC_AUTO_PST | \ + S3C2410_ADCTSC_XY_PST(0)) + +#define FEAT_PEN_IRQ (1 << 0) /* HAS ADCCLRINTPNDNUP */ + +/* Per-touchscreen data. */ + +/** + * struct s3c2410ts - driver touchscreen state. + * @client: The ADC client we registered with the core driver. + * @dev: The device we are bound to. + * @input: The input device we registered with the input subsystem. + * @clock: The clock for the adc. + * @io: Pointer to the IO base. + * @xp: The accumulated X position data. + * @yp: The accumulated Y position data. + * @irq_tc: The interrupt number for pen up/down interrupt + * @count: The number of samples collected. + * @shift: The log2 of the maximum count to read in one go. + * @features: The features supported by the TSADC MOdule. + */ +struct s3c2410ts { + struct s3c_adc_client *client; + struct device *dev; + struct input_dev *input; + struct clk *clock; + void __iomem *io; + unsigned long xp; + unsigned long yp; + int irq_tc; + int count; + int shift; + int features; +}; + +static struct s3c2410ts ts; + +/** + * get_down - return the down state of the pen + * @data0: The data read from ADCDAT0 register. + * @data1: The data read from ADCDAT1 register. + * + * Return non-zero if both readings show that the pen is down. + */ +static inline bool get_down(unsigned long data0, unsigned long data1) +{ + /* returns true if both data values show stylus down */ + return (!(data0 & S3C2410_ADCDAT0_UPDOWN) && + !(data1 & S3C2410_ADCDAT0_UPDOWN)); +} + +static void touch_timer_fire(unsigned long data) +{ + unsigned long data0; + unsigned long data1; + bool down; + + data0 = readl(ts.io + S3C2410_ADCDAT0); + data1 = readl(ts.io + S3C2410_ADCDAT1); + + down = get_down(data0, data1); + + if (down) { + if (ts.count == (1 << ts.shift)) { + ts.xp >>= ts.shift; + ts.yp >>= ts.shift; + + dev_dbg(ts.dev, "%s: X=%lu, Y=%lu, count=%d\n", + __func__, ts.xp, ts.yp, ts.count); + + input_report_abs(ts.input, ABS_X, ts.xp); + input_report_abs(ts.input, ABS_Y, ts.yp); + + input_report_key(ts.input, BTN_TOUCH, 1); + input_sync(ts.input); + + ts.xp = 0; + ts.yp = 0; + ts.count = 0; + } + + s3c_adc_start(ts.client, 0, 1 << ts.shift); + } else { + ts.xp = 0; + ts.yp = 0; + ts.count = 0; + + input_report_key(ts.input, BTN_TOUCH, 0); + input_sync(ts.input); + + writel(WAIT4INT | INT_DOWN, ts.io + S3C2410_ADCTSC); + } +} + +static DEFINE_TIMER(touch_timer, touch_timer_fire, 0, 0); + +/** + * stylus_irq - touchscreen stylus event interrupt + * @irq: The interrupt number + * @dev_id: The device ID. + * + * Called when the IRQ_TC is fired for a pen up or down event. + */ +static irqreturn_t stylus_irq(int irq, void *dev_id) +{ + unsigned long data0; + unsigned long data1; + bool down; + + data0 = readl(ts.io + S3C2410_ADCDAT0); + data1 = readl(ts.io + S3C2410_ADCDAT1); + + down = get_down(data0, data1); + + /* TODO we should never get an interrupt with down set while + * the timer is running, but maybe we ought to verify that the + * timer isn't running anyways. */ + + if (down) + s3c_adc_start(ts.client, 0, 1 << ts.shift); + else + dev_dbg(ts.dev, "%s: count=%d\n", __func__, ts.count); + + if (ts.features & FEAT_PEN_IRQ) { + /* Clear pen down/up interrupt */ + writel(0x0, ts.io + S3C64XX_ADCCLRINTPNDNUP); + } + + return IRQ_HANDLED; +} + +/** + * s3c24xx_ts_conversion - ADC conversion callback + * @client: The client that was registered with the ADC core. + * @data0: The reading from ADCDAT0. + * @data1: The reading from ADCDAT1. + * @left: The number of samples left. + * + * Called when a conversion has finished. + */ +static void s3c24xx_ts_conversion(struct s3c_adc_client *client, + unsigned data0, unsigned data1, + unsigned *left) +{ + dev_dbg(ts.dev, "%s: %d,%d\n", __func__, data0, data1); + + ts.xp += data0; + ts.yp += data1; + + ts.count++; + + /* From tests, it seems that it is unlikely to get a pen-up + * event during the conversion process which means we can + * ignore any pen-up events with less than the requisite + * count done. + * + * In several thousand conversions, no pen-ups where detected + * before count completed. + */ +} + +/** + * s3c24xx_ts_select - ADC selection callback. + * @client: The client that was registered with the ADC core. + * @select: The reason for select. + * + * Called when the ADC core selects (or deslects) us as a client. + */ +static void s3c24xx_ts_select(struct s3c_adc_client *client, unsigned select) +{ + if (select) { + writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST, + ts.io + S3C2410_ADCTSC); + } else { + mod_timer(&touch_timer, jiffies+1); + writel(WAIT4INT | INT_UP, ts.io + S3C2410_ADCTSC); + } +} + +/** + * s3c2410ts_probe - device core probe entry point + * @pdev: The device we are being bound to. + * + * Initialise, find and allocate any resources we need to run and then + * register with the ADC and input systems. + */ +static int s3c2410ts_probe(struct platform_device *pdev) +{ + struct s3c2410_ts_mach_info *info; + struct device *dev = &pdev->dev; + struct input_dev *input_dev; + struct resource *res; + int ret = -EINVAL; + + /* Initialise input stuff */ + memset(&ts, 0, sizeof(struct s3c2410ts)); + + ts.dev = dev; + + info = pdev->dev.platform_data; + if (!info) { + dev_err(dev, "no platform data, cannot attach\n"); + return -EINVAL; + } + + dev_dbg(dev, "initialising touchscreen\n"); + + ts.clock = clk_get(dev, "adc"); + if (IS_ERR(ts.clock)) { + dev_err(dev, "cannot get adc clock source\n"); + return -ENOENT; + } + + clk_enable(ts.clock); + dev_dbg(dev, "got and enabled clocks\n"); + + ts.irq_tc = ret = platform_get_irq(pdev, 0); + if (ret < 0) { + dev_err(dev, "no resource for interrupt\n"); + goto err_clk; + } + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(dev, "no resource for registers\n"); + ret = -ENOENT; + goto err_clk; + } + + ts.io = ioremap(res->start, resource_size(res)); + if (ts.io == NULL) { + dev_err(dev, "cannot map registers\n"); + ret = -ENOMEM; + goto err_clk; + } + + /* inititalise the gpio */ + if (info->cfg_gpio) + info->cfg_gpio(to_platform_device(ts.dev)); + + ts.client = s3c_adc_register(pdev, s3c24xx_ts_select, + s3c24xx_ts_conversion, 1); + if (IS_ERR(ts.client)) { + dev_err(dev, "failed to register adc client\n"); + ret = PTR_ERR(ts.client); + goto err_iomap; + } + + /* Initialise registers */ + if ((info->delay & 0xffff) > 0) + writel(info->delay & 0xffff, ts.io + S3C2410_ADCDLY); + + writel(WAIT4INT | INT_DOWN, ts.io + S3C2410_ADCTSC); + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(dev, "Unable to allocate the input device !!\n"); + ret = -ENOMEM; + goto err_iomap; + } + + ts.input = input_dev; + ts.input->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + ts.input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(ts.input, ABS_X, 0, 0x3FF, 0, 0); + input_set_abs_params(ts.input, ABS_Y, 0, 0x3FF, 0, 0); + + ts.input->name = "S3C24XX TouchScreen"; + ts.input->id.bustype = BUS_HOST; + ts.input->id.vendor = 0xDEAD; + ts.input->id.product = 0xBEEF; + ts.input->id.version = 0x0102; + + ts.shift = info->oversampling_shift; + ts.features = platform_get_device_id(pdev)->driver_data; + + ret = request_irq(ts.irq_tc, stylus_irq, 0, + "s3c2410_ts_pen", ts.input); + if (ret) { + dev_err(dev, "cannot get TC interrupt\n"); + goto err_inputdev; + } + + dev_info(dev, "driver attached, registering input device\n"); + + /* All went ok, so register to the input system */ + ret = input_register_device(ts.input); + if (ret < 0) { + dev_err(dev, "failed to register input device\n"); + ret = -EIO; + goto err_tcirq; + } + + return 0; + + err_tcirq: + free_irq(ts.irq_tc, ts.input); + err_inputdev: + input_free_device(ts.input); + err_iomap: + iounmap(ts.io); + err_clk: + del_timer_sync(&touch_timer); + clk_put(ts.clock); + return ret; +} + +/** + * s3c2410ts_remove - device core removal entry point + * @pdev: The device we are being removed from. + * + * Free up our state ready to be removed. + */ +static int s3c2410ts_remove(struct platform_device *pdev) +{ + free_irq(ts.irq_tc, ts.input); + del_timer_sync(&touch_timer); + + clk_disable(ts.clock); + clk_put(ts.clock); + + input_unregister_device(ts.input); + iounmap(ts.io); + + return 0; +} + +#ifdef CONFIG_PM +static int s3c2410ts_suspend(struct device *dev) +{ + writel(TSC_SLEEP, ts.io + S3C2410_ADCTSC); + disable_irq(ts.irq_tc); + clk_disable(ts.clock); + + return 0; +} + +static int s3c2410ts_resume(struct device *dev) +{ + struct platform_device *pdev = to_platform_device(dev); + struct s3c2410_ts_mach_info *info = pdev->dev.platform_data; + + clk_enable(ts.clock); + enable_irq(ts.irq_tc); + + /* Initialise registers */ + if ((info->delay & 0xffff) > 0) + writel(info->delay & 0xffff, ts.io + S3C2410_ADCDLY); + + writel(WAIT4INT | INT_DOWN, ts.io + S3C2410_ADCTSC); + + return 0; +} + +static const struct dev_pm_ops s3c_ts_pmops = { + .suspend = s3c2410ts_suspend, + .resume = s3c2410ts_resume, +}; +#endif + +static struct platform_device_id s3cts_driver_ids[] = { + { "s3c2410-ts", 0 }, + { "s3c2440-ts", 0 }, + { "s3c64xx-ts", FEAT_PEN_IRQ }, + { } +}; +MODULE_DEVICE_TABLE(platform, s3cts_driver_ids); + +static struct platform_driver s3c_ts_driver = { + .driver = { + .name = "samsung-ts", + .owner = THIS_MODULE, +#ifdef CONFIG_PM + .pm = &s3c_ts_pmops, +#endif + }, + .id_table = s3cts_driver_ids, + .probe = s3c2410ts_probe, + .remove = s3c2410ts_remove, +}; +module_platform_driver(s3c_ts_driver); + +MODULE_AUTHOR("Arnaud Patard , " + "Ben Dooks , " + "Simtec Electronics "); +MODULE_DESCRIPTION("S3C24XX Touchscreen driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/st1232.c b/drivers/input/touchscreen/st1232.c new file mode 100644 index 00000000..1740a249 --- /dev/null +++ b/drivers/input/touchscreen/st1232.c @@ -0,0 +1,310 @@ +/* + * ST1232 Touchscreen Controller Driver + * + * Copyright (C) 2010 Renesas Solutions Corp. + * Tony SIM + * + * Using code from: + * - android.git.kernel.org: projects/kernel/common.git: synaptics_i2c_rmi.c + * Copyright (C) 2007 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ST1232_TS_NAME "st1232-ts" + +#define MIN_X 0x00 +#define MIN_Y 0x00 +#define MAX_X 0x31f /* (800 - 1) */ +#define MAX_Y 0x1df /* (480 - 1) */ +#define MAX_AREA 0xff +#define MAX_FINGERS 2 + +struct st1232_ts_finger { + u16 x; + u16 y; + u8 t; + bool is_valid; +}; + +struct st1232_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct st1232_ts_finger finger[MAX_FINGERS]; + struct dev_pm_qos_request low_latency_req; + int reset_gpio; +}; + +static int st1232_ts_read_data(struct st1232_ts_data *ts) +{ + struct st1232_ts_finger *finger = ts->finger; + struct i2c_client *client = ts->client; + struct i2c_msg msg[2]; + int error; + u8 start_reg; + u8 buf[10]; + + /* read touchscreen data from ST1232 */ + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].len = 1; + msg[0].buf = &start_reg; + start_reg = 0x10; + + msg[1].addr = ts->client->addr; + msg[1].flags = I2C_M_RD; + msg[1].len = sizeof(buf); + msg[1].buf = buf; + + error = i2c_transfer(client->adapter, msg, 2); + if (error < 0) + return error; + + /* get "valid" bits */ + finger[0].is_valid = buf[2] >> 7; + finger[1].is_valid = buf[5] >> 7; + + /* get xy coordinate */ + if (finger[0].is_valid) { + finger[0].x = ((buf[2] & 0x0070) << 4) | buf[3]; + finger[0].y = ((buf[2] & 0x0007) << 8) | buf[4]; + finger[0].t = buf[8]; + } + + if (finger[1].is_valid) { + finger[1].x = ((buf[5] & 0x0070) << 4) | buf[6]; + finger[1].y = ((buf[5] & 0x0007) << 8) | buf[7]; + finger[1].t = buf[9]; + } + + return 0; +} + +static irqreturn_t st1232_ts_irq_handler(int irq, void *dev_id) +{ + struct st1232_ts_data *ts = dev_id; + struct st1232_ts_finger *finger = ts->finger; + struct input_dev *input_dev = ts->input_dev; + int count = 0; + int i, ret; + + ret = st1232_ts_read_data(ts); + if (ret < 0) + goto end; + + /* multi touch protocol */ + for (i = 0; i < MAX_FINGERS; i++) { + if (!finger[i].is_valid) + continue; + + input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, finger[i].t); + input_report_abs(input_dev, ABS_MT_POSITION_X, finger[i].x); + input_report_abs(input_dev, ABS_MT_POSITION_Y, finger[i].y); + input_mt_sync(input_dev); + count++; + } + + /* SYN_MT_REPORT only if no contact */ + if (!count) { + input_mt_sync(input_dev); + if (ts->low_latency_req.dev) { + dev_pm_qos_remove_request(&ts->low_latency_req); + ts->low_latency_req.dev = NULL; + } + } else if (!ts->low_latency_req.dev) { + /* First contact, request 100 us latency. */ + dev_pm_qos_add_ancestor_request(&ts->client->dev, + &ts->low_latency_req, 100); + } + + /* SYN_REPORT */ + input_sync(input_dev); + +end: + return IRQ_HANDLED; +} + +static void st1232_ts_power(struct st1232_ts_data *ts, bool poweron) +{ + if (gpio_is_valid(ts->reset_gpio)) + gpio_direction_output(ts->reset_gpio, poweron); +} + +static int st1232_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct st1232_ts_data *ts; + struct st1232_pdata *pdata = client->dev.platform_data; + struct input_dev *input_dev; + int error; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "need I2C_FUNC_I2C\n"); + return -EIO; + } + + if (!client->irq) { + dev_err(&client->dev, "no IRQ?\n"); + return -EINVAL; + } + + ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + input_dev = devm_input_allocate_device(&client->dev); + if (!input_dev) + return -ENOMEM; + + ts->client = client; + ts->input_dev = input_dev; + + if (pdata) + ts->reset_gpio = pdata->reset_gpio; + else if (client->dev.of_node) + ts->reset_gpio = of_get_gpio(client->dev.of_node, 0); + else + ts->reset_gpio = -ENODEV; + + if (gpio_is_valid(ts->reset_gpio)) { + error = devm_gpio_request(&client->dev, ts->reset_gpio, NULL); + if (error) { + dev_err(&client->dev, + "Unable to request GPIO pin %d.\n", + ts->reset_gpio); + return error; + } + } + + st1232_ts_power(ts, true); + + input_dev->name = "st1232-touchscreen"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + __set_bit(EV_SYN, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, MAX_AREA, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, MIN_X, MAX_X, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, MIN_Y, MAX_Y, 0, 0); + + error = devm_request_threaded_irq(&client->dev, client->irq, + NULL, st1232_ts_irq_handler, + IRQF_ONESHOT, + client->name, ts); + if (error) { + dev_err(&client->dev, "Failed to register interrupt\n"); + return error; + } + + error = input_register_device(ts->input_dev); + if (error) { + dev_err(&client->dev, "Unable to register %s input device\n", + input_dev->name); + return error; + } + + i2c_set_clientdata(client, ts); + device_init_wakeup(&client->dev, 1); + + return 0; +} + +static int st1232_ts_remove(struct i2c_client *client) +{ + struct st1232_ts_data *ts = i2c_get_clientdata(client); + + device_init_wakeup(&client->dev, 0); + st1232_ts_power(ts, false); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int st1232_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct st1232_ts_data *ts = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) { + enable_irq_wake(client->irq); + } else { + disable_irq(client->irq); + st1232_ts_power(ts, false); + } + + return 0; +} + +static int st1232_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct st1232_ts_data *ts = i2c_get_clientdata(client); + + if (device_may_wakeup(&client->dev)) { + disable_irq_wake(client->irq); + } else { + st1232_ts_power(ts, true); + enable_irq(client->irq); + } + + return 0; +} + +#endif + +static SIMPLE_DEV_PM_OPS(st1232_ts_pm_ops, + st1232_ts_suspend, st1232_ts_resume); + +static const struct i2c_device_id st1232_ts_id[] = { + { ST1232_TS_NAME, 0 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, st1232_ts_id); + +#ifdef CONFIG_OF +static const struct of_device_id st1232_ts_dt_ids[] = { + { .compatible = "sitronix,st1232", }, + { } +}; +MODULE_DEVICE_TABLE(of, st1232_ts_dt_ids); +#endif + +static struct i2c_driver st1232_ts_driver = { + .probe = st1232_ts_probe, + .remove = st1232_ts_remove, + .id_table = st1232_ts_id, + .driver = { + .name = ST1232_TS_NAME, + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(st1232_ts_dt_ids), + .pm = &st1232_ts_pm_ops, + }, +}; + +module_i2c_driver(st1232_ts_driver); + +MODULE_AUTHOR("Tony SIM "); +MODULE_DESCRIPTION("SITRONIX ST1232 Touchscreen Controller Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/stmpe-ts.c b/drivers/input/touchscreen/stmpe-ts.c new file mode 100644 index 00000000..59e81b00 --- /dev/null +++ b/drivers/input/touchscreen/stmpe-ts.c @@ -0,0 +1,398 @@ +/* + * STMicroelectronics STMPE811 Touchscreen Driver + * + * (C) 2010 Luotao Fu + * 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 as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +/* Register layouts and functionalities are identical on all stmpexxx variants + * with touchscreen controller + */ +#define STMPE_REG_INT_STA 0x0B +#define STMPE_REG_ADC_CTRL1 0x20 +#define STMPE_REG_ADC_CTRL2 0x21 +#define STMPE_REG_TSC_CTRL 0x40 +#define STMPE_REG_TSC_CFG 0x41 +#define STMPE_REG_FIFO_TH 0x4A +#define STMPE_REG_FIFO_STA 0x4B +#define STMPE_REG_FIFO_SIZE 0x4C +#define STMPE_REG_TSC_DATA_XYZ 0x52 +#define STMPE_REG_TSC_FRACTION_Z 0x56 +#define STMPE_REG_TSC_I_DRIVE 0x58 + +#define OP_MOD_XYZ 0 + +#define STMPE_TSC_CTRL_TSC_EN (1<<0) + +#define STMPE_FIFO_STA_RESET (1<<0) + +#define STMPE_IRQ_TOUCH_DET 0 + +#define SAMPLE_TIME(x) ((x & 0xf) << 4) +#define MOD_12B(x) ((x & 0x1) << 3) +#define REF_SEL(x) ((x & 0x1) << 1) +#define ADC_FREQ(x) (x & 0x3) +#define AVE_CTRL(x) ((x & 0x3) << 6) +#define DET_DELAY(x) ((x & 0x7) << 3) +#define SETTLING(x) (x & 0x7) +#define FRACTION_Z(x) (x & 0x7) +#define I_DRIVE(x) (x & 0x1) +#define OP_MODE(x) ((x & 0x7) << 1) + +#define STMPE_TS_NAME "stmpe-ts" +#define XY_MASK 0xfff + +struct stmpe_touch { + struct stmpe *stmpe; + struct input_dev *idev; + struct delayed_work work; + struct device *dev; + u8 sample_time; + u8 mod_12b; + u8 ref_sel; + u8 adc_freq; + u8 ave_ctrl; + u8 touch_det_delay; + u8 settling; + u8 fraction_z; + u8 i_drive; +}; + +static int __stmpe_reset_fifo(struct stmpe *stmpe) +{ + int ret; + + ret = stmpe_set_bits(stmpe, STMPE_REG_FIFO_STA, + STMPE_FIFO_STA_RESET, STMPE_FIFO_STA_RESET); + if (ret) + return ret; + + return stmpe_set_bits(stmpe, STMPE_REG_FIFO_STA, + STMPE_FIFO_STA_RESET, 0); +} + +static void stmpe_work(struct work_struct *work) +{ + int int_sta; + u32 timeout = 40; + + struct stmpe_touch *ts = + container_of(work, struct stmpe_touch, work.work); + + int_sta = stmpe_reg_read(ts->stmpe, STMPE_REG_INT_STA); + + /* + * touch_det sometimes get desasserted or just get stuck. This appears + * to be a silicon bug, We still have to clearify this with the + * manufacture. As a workaround We release the key anyway if the + * touch_det keeps coming in after 4ms, while the FIFO contains no value + * during the whole time. + */ + while ((int_sta & (1 << STMPE_IRQ_TOUCH_DET)) && (timeout > 0)) { + timeout--; + int_sta = stmpe_reg_read(ts->stmpe, STMPE_REG_INT_STA); + udelay(100); + } + + /* reset the FIFO before we report release event */ + __stmpe_reset_fifo(ts->stmpe); + + input_report_abs(ts->idev, ABS_PRESSURE, 0); + input_report_key(ts->idev, BTN_TOUCH, 0); + input_sync(ts->idev); +} + +static irqreturn_t stmpe_ts_handler(int irq, void *data) +{ + u8 data_set[4]; + int x, y, z; + struct stmpe_touch *ts = data; + + /* + * Cancel scheduled polling for release if we have new value + * available. Wait if the polling is already running. + */ + cancel_delayed_work_sync(&ts->work); + + /* + * The FIFO sometimes just crashes and stops generating interrupts. This + * appears to be a silicon bug. We still have to clearify this with + * the manufacture. As a workaround we disable the TSC while we are + * collecting data and flush the FIFO after reading + */ + stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL, + STMPE_TSC_CTRL_TSC_EN, 0); + + stmpe_block_read(ts->stmpe, STMPE_REG_TSC_DATA_XYZ, 4, data_set); + + x = (data_set[0] << 4) | (data_set[1] >> 4); + y = ((data_set[1] & 0xf) << 8) | data_set[2]; + z = data_set[3]; + + input_report_abs(ts->idev, ABS_X, x); + input_report_abs(ts->idev, ABS_Y, y); + input_report_abs(ts->idev, ABS_PRESSURE, z); + input_report_key(ts->idev, BTN_TOUCH, 1); + input_sync(ts->idev); + + /* flush the FIFO after we have read out our values. */ + __stmpe_reset_fifo(ts->stmpe); + + /* reenable the tsc */ + stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL, + STMPE_TSC_CTRL_TSC_EN, STMPE_TSC_CTRL_TSC_EN); + + /* start polling for touch_det to detect release */ + schedule_delayed_work(&ts->work, HZ / 50); + + return IRQ_HANDLED; +} + +static int stmpe_init_hw(struct stmpe_touch *ts) +{ + int ret; + u8 adc_ctrl1, adc_ctrl1_mask, tsc_cfg, tsc_cfg_mask; + struct stmpe *stmpe = ts->stmpe; + struct device *dev = ts->dev; + + ret = stmpe_enable(stmpe, STMPE_BLOCK_TOUCHSCREEN | STMPE_BLOCK_ADC); + if (ret) { + dev_err(dev, "Could not enable clock for ADC and TS\n"); + return ret; + } + + adc_ctrl1 = SAMPLE_TIME(ts->sample_time) | MOD_12B(ts->mod_12b) | + REF_SEL(ts->ref_sel); + adc_ctrl1_mask = SAMPLE_TIME(0xff) | MOD_12B(0xff) | REF_SEL(0xff); + + ret = stmpe_set_bits(stmpe, STMPE_REG_ADC_CTRL1, + adc_ctrl1_mask, adc_ctrl1); + if (ret) { + dev_err(dev, "Could not setup ADC\n"); + return ret; + } + + ret = stmpe_set_bits(stmpe, STMPE_REG_ADC_CTRL2, + ADC_FREQ(0xff), ADC_FREQ(ts->adc_freq)); + if (ret) { + dev_err(dev, "Could not setup ADC\n"); + return ret; + } + + tsc_cfg = AVE_CTRL(ts->ave_ctrl) | DET_DELAY(ts->touch_det_delay) | + SETTLING(ts->settling); + tsc_cfg_mask = AVE_CTRL(0xff) | DET_DELAY(0xff) | SETTLING(0xff); + + ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_CFG, tsc_cfg_mask, tsc_cfg); + if (ret) { + dev_err(dev, "Could not config touch\n"); + return ret; + } + + ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_FRACTION_Z, + FRACTION_Z(0xff), FRACTION_Z(ts->fraction_z)); + if (ret) { + dev_err(dev, "Could not config touch\n"); + return ret; + } + + ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_I_DRIVE, + I_DRIVE(0xff), I_DRIVE(ts->i_drive)); + if (ret) { + dev_err(dev, "Could not config touch\n"); + return ret; + } + + /* set FIFO to 1 for single point reading */ + ret = stmpe_reg_write(stmpe, STMPE_REG_FIFO_TH, 1); + if (ret) { + dev_err(dev, "Could not set FIFO\n"); + return ret; + } + + ret = stmpe_set_bits(stmpe, STMPE_REG_TSC_CTRL, + OP_MODE(0xff), OP_MODE(OP_MOD_XYZ)); + if (ret) { + dev_err(dev, "Could not set mode\n"); + return ret; + } + + return 0; +} + +static int stmpe_ts_open(struct input_dev *dev) +{ + struct stmpe_touch *ts = input_get_drvdata(dev); + int ret = 0; + + ret = __stmpe_reset_fifo(ts->stmpe); + if (ret) + return ret; + + return stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL, + STMPE_TSC_CTRL_TSC_EN, STMPE_TSC_CTRL_TSC_EN); +} + +static void stmpe_ts_close(struct input_dev *dev) +{ + struct stmpe_touch *ts = input_get_drvdata(dev); + + cancel_delayed_work_sync(&ts->work); + + stmpe_set_bits(ts->stmpe, STMPE_REG_TSC_CTRL, + STMPE_TSC_CTRL_TSC_EN, 0); +} + +static void stmpe_ts_get_platform_info(struct platform_device *pdev, + struct stmpe_touch *ts) +{ + struct stmpe *stmpe = dev_get_drvdata(pdev->dev.parent); + struct device_node *np = pdev->dev.of_node; + struct stmpe_ts_platform_data *ts_pdata = NULL; + + ts->stmpe = stmpe; + + if (stmpe->pdata && stmpe->pdata->ts) { + ts_pdata = stmpe->pdata->ts; + + ts->sample_time = ts_pdata->sample_time; + ts->mod_12b = ts_pdata->mod_12b; + ts->ref_sel = ts_pdata->ref_sel; + ts->adc_freq = ts_pdata->adc_freq; + ts->ave_ctrl = ts_pdata->ave_ctrl; + ts->touch_det_delay = ts_pdata->touch_det_delay; + ts->settling = ts_pdata->settling; + ts->fraction_z = ts_pdata->fraction_z; + ts->i_drive = ts_pdata->i_drive; + } else if (np) { + u32 val; + + if (!of_property_read_u32(np, "st,sample-time", &val)) + ts->sample_time = val; + if (!of_property_read_u32(np, "st,mod-12b", &val)) + ts->mod_12b = val; + if (!of_property_read_u32(np, "st,ref-sel", &val)) + ts->ref_sel = val; + if (!of_property_read_u32(np, "st,adc-freq", &val)) + ts->adc_freq = val; + if (!of_property_read_u32(np, "st,ave-ctrl", &val)) + ts->ave_ctrl = val; + if (!of_property_read_u32(np, "st,touch-det-delay", &val)) + ts->touch_det_delay = val; + if (!of_property_read_u32(np, "st,settling", &val)) + ts->settling = val; + if (!of_property_read_u32(np, "st,fraction-z", &val)) + ts->fraction_z = val; + if (!of_property_read_u32(np, "st,i-drive", &val)) + ts->i_drive = val; + } +} + +static int stmpe_input_probe(struct platform_device *pdev) +{ + struct stmpe_touch *ts; + struct input_dev *idev; + int error; + int ts_irq; + + ts_irq = platform_get_irq_byname(pdev, "FIFO_TH"); + if (ts_irq < 0) + return ts_irq; + + ts = devm_kzalloc(&pdev->dev, sizeof(*ts), GFP_KERNEL); + if (!ts) + return -ENOMEM; + + idev = devm_input_allocate_device(&pdev->dev); + if (!idev) + return -ENOMEM; + + platform_set_drvdata(pdev, ts); + ts->idev = idev; + ts->dev = &pdev->dev; + + stmpe_ts_get_platform_info(pdev, ts); + + INIT_DELAYED_WORK(&ts->work, stmpe_work); + + error = devm_request_threaded_irq(&pdev->dev, ts_irq, + NULL, stmpe_ts_handler, + IRQF_ONESHOT, STMPE_TS_NAME, ts); + if (error) { + dev_err(&pdev->dev, "Failed to request IRQ %d\n", ts_irq); + return error; + } + + error = stmpe_init_hw(ts); + if (error) + return error; + + idev->name = STMPE_TS_NAME; + idev->phys = STMPE_TS_NAME"/input0"; + idev->id.bustype = BUS_I2C; + idev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + idev->open = stmpe_ts_open; + idev->close = stmpe_ts_close; + + input_set_drvdata(idev, ts); + + input_set_abs_params(idev, ABS_X, 0, XY_MASK, 0, 0); + input_set_abs_params(idev, ABS_Y, 0, XY_MASK, 0, 0); + input_set_abs_params(idev, ABS_PRESSURE, 0x0, 0xff, 0, 0); + + error = input_register_device(idev); + if (error) { + dev_err(&pdev->dev, "Could not register input device\n"); + return error; + } + + return 0; +} + +static int stmpe_ts_remove(struct platform_device *pdev) +{ + struct stmpe_touch *ts = platform_get_drvdata(pdev); + + stmpe_disable(ts->stmpe, STMPE_BLOCK_TOUCHSCREEN); + + return 0; +} + +static struct platform_driver stmpe_ts_driver = { + .driver = { + .name = STMPE_TS_NAME, + .owner = THIS_MODULE, + }, + .probe = stmpe_input_probe, + .remove = stmpe_ts_remove, +}; +module_platform_driver(stmpe_ts_driver); + +MODULE_AUTHOR("Luotao Fu "); +MODULE_DESCRIPTION("STMPEXXX touchscreen driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" STMPE_TS_NAME); diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c new file mode 100644 index 00000000..51e7b878 --- /dev/null +++ b/drivers/input/touchscreen/ti_am335x_tsc.c @@ -0,0 +1,398 @@ +/* + * TI Touch Screen driver + * + * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define ADCFSM_STEPID 0x10 +#define SEQ_SETTLE 275 +#define MAX_12BIT ((1 << 12) - 1) + +struct titsc { + struct input_dev *input; + struct ti_tscadc_dev *mfd_tscadc; + unsigned int irq; + unsigned int wires; + unsigned int x_plate_resistance; + bool pen_down; + int steps_to_configure; +}; + +static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) +{ + return readl(ts->mfd_tscadc->tscadc_base + reg); +} + +static void titsc_writel(struct titsc *tsc, unsigned int reg, + unsigned int val) +{ + writel(val, tsc->mfd_tscadc->tscadc_base + reg); +} + +static void titsc_step_config(struct titsc *ts_dev) +{ + unsigned int config; + int i, total_steps; + + /* Configure the Step registers */ + total_steps = 2 * ts_dev->steps_to_configure; + + config = STEPCONFIG_MODE_HWSYNC | + STEPCONFIG_AVG_16 | STEPCONFIG_XPP; + switch (ts_dev->wires) { + case 4: + config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN; + break; + case 5: + config |= STEPCONFIG_YNN | + STEPCONFIG_INP_AN4 | STEPCONFIG_XNN | + STEPCONFIG_YPP; + break; + case 8: + config |= STEPCONFIG_INP_AN2 | STEPCONFIG_XNN; + break; + } + + for (i = 1; i <= ts_dev->steps_to_configure; i++) { + titsc_writel(ts_dev, REG_STEPCONFIG(i), config); + titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY); + } + + config = 0; + config = STEPCONFIG_MODE_HWSYNC | + STEPCONFIG_AVG_16 | STEPCONFIG_YNN | + STEPCONFIG_INM_ADCREFM | STEPCONFIG_FIFO1; + switch (ts_dev->wires) { + case 4: + config |= STEPCONFIG_YPP; + break; + case 5: + config |= STEPCONFIG_XPP | STEPCONFIG_INP_AN4 | + STEPCONFIG_XNP | STEPCONFIG_YPN; + break; + case 8: + config |= STEPCONFIG_YPP; + break; + } + + for (i = (ts_dev->steps_to_configure + 1); i <= total_steps; i++) { + titsc_writel(ts_dev, REG_STEPCONFIG(i), config); + titsc_writel(ts_dev, REG_STEPDELAY(i), STEPCONFIG_OPENDLY); + } + + config = 0; + /* Charge step configuration */ + config = STEPCONFIG_XPP | STEPCONFIG_YNN | + STEPCHARGE_RFP_XPUL | STEPCHARGE_RFM_XNUR | + STEPCHARGE_INM_AN1 | STEPCHARGE_INP_AN1; + + titsc_writel(ts_dev, REG_CHARGECONFIG, config); + titsc_writel(ts_dev, REG_CHARGEDELAY, CHARGEDLY_OPENDLY); + + config = 0; + /* Configure to calculate pressure */ + config = STEPCONFIG_MODE_HWSYNC | + STEPCONFIG_AVG_16 | STEPCONFIG_YPP | + STEPCONFIG_XNN | STEPCONFIG_INM_ADCREFM; + titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 1), config); + titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 1), + STEPCONFIG_OPENDLY); + + config |= STEPCONFIG_INP_AN3 | STEPCONFIG_FIFO1; + titsc_writel(ts_dev, REG_STEPCONFIG(total_steps + 2), config); + titsc_writel(ts_dev, REG_STEPDELAY(total_steps + 2), + STEPCONFIG_OPENDLY); + + titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC); +} + +static void titsc_read_coordinates(struct titsc *ts_dev, + unsigned int *x, unsigned int *y) +{ + unsigned int fifocount = titsc_readl(ts_dev, REG_FIFO0CNT); + unsigned int prev_val_x = ~0, prev_val_y = ~0; + unsigned int prev_diff_x = ~0, prev_diff_y = ~0; + unsigned int read, diff; + unsigned int i, channel; + + /* + * Delta filter is used to remove large variations in sampled + * values from ADC. The filter tries to predict where the next + * coordinate could be. This is done by taking a previous + * coordinate and subtracting it form current one. Further the + * algorithm compares the difference with that of a present value, + * if true the value is reported to the sub system. + */ + for (i = 0; i < fifocount - 1; i++) { + read = titsc_readl(ts_dev, REG_FIFO0); + channel = read & 0xf0000; + channel = channel >> 0x10; + if ((channel >= 0) && (channel < ts_dev->steps_to_configure)) { + read &= 0xfff; + diff = abs(read - prev_val_x); + if (diff < prev_diff_x) { + prev_diff_x = diff; + *x = read; + } + prev_val_x = read; + } + + read = titsc_readl(ts_dev, REG_FIFO1); + channel = read & 0xf0000; + channel = channel >> 0x10; + if ((channel >= ts_dev->steps_to_configure) && + (channel < (2 * ts_dev->steps_to_configure - 1))) { + read &= 0xfff; + diff = abs(read - prev_val_y); + if (diff < prev_diff_y) { + prev_diff_y = diff; + *y = read; + } + prev_val_y = read; + } + } +} + +static irqreturn_t titsc_irq(int irq, void *dev) +{ + struct titsc *ts_dev = dev; + struct input_dev *input_dev = ts_dev->input; + unsigned int status, irqclr = 0; + unsigned int x = 0, y = 0; + unsigned int z1, z2, z; + unsigned int fsm; + unsigned int fifo1count, fifo0count; + int i; + + status = titsc_readl(ts_dev, REG_IRQSTATUS); + if (status & IRQENB_FIFO0THRES) { + titsc_read_coordinates(ts_dev, &x, &y); + + z1 = titsc_readl(ts_dev, REG_FIFO0) & 0xfff; + z2 = titsc_readl(ts_dev, REG_FIFO1) & 0xfff; + + fifo1count = titsc_readl(ts_dev, REG_FIFO1CNT); + for (i = 0; i < fifo1count; i++) + titsc_readl(ts_dev, REG_FIFO1); + + fifo0count = titsc_readl(ts_dev, REG_FIFO0CNT); + for (i = 0; i < fifo0count; i++) + titsc_readl(ts_dev, REG_FIFO0); + + if (ts_dev->pen_down && z1 != 0 && z2 != 0) { + /* + * Calculate pressure using formula + * Resistance(touch) = x plate resistance * + * x postion/4096 * ((z2 / z1) - 1) + */ + z = z2 - z1; + z *= x; + z *= ts_dev->x_plate_resistance; + z /= z1; + z = (z + 2047) >> 12; + + if (z <= MAX_12BIT) { + input_report_abs(input_dev, ABS_X, x); + input_report_abs(input_dev, ABS_Y, y); + input_report_abs(input_dev, ABS_PRESSURE, z); + input_report_key(input_dev, BTN_TOUCH, 1); + input_sync(input_dev); + } + } + irqclr |= IRQENB_FIFO0THRES; + } + + /* + * Time for sequencer to settle, to read + * correct state of the sequencer. + */ + udelay(SEQ_SETTLE); + + status = titsc_readl(ts_dev, REG_RAWIRQSTATUS); + if (status & IRQENB_PENUP) { + /* Pen up event */ + fsm = titsc_readl(ts_dev, REG_ADCFSM); + if (fsm == ADCFSM_STEPID) { + ts_dev->pen_down = false; + input_report_key(input_dev, BTN_TOUCH, 0); + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_sync(input_dev); + } else { + ts_dev->pen_down = true; + } + irqclr |= IRQENB_PENUP; + } + + titsc_writel(ts_dev, REG_IRQSTATUS, irqclr); + + titsc_writel(ts_dev, REG_SE, STPENB_STEPENB_TC); + return IRQ_HANDLED; +} + +/* + * The functions for inserting/removing driver as a module. + */ + +static int titsc_probe(struct platform_device *pdev) +{ + struct titsc *ts_dev; + struct input_dev *input_dev; + struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data; + struct mfd_tscadc_board *pdata; + int err; + + pdata = tscadc_dev->dev->platform_data; + + if (!pdata) { + dev_err(&pdev->dev, "Could not find platform data\n"); + return -EINVAL; + } + + /* Allocate memory for device */ + ts_dev = kzalloc(sizeof(struct titsc), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts_dev || !input_dev) { + dev_err(&pdev->dev, "failed to allocate memory.\n"); + err = -ENOMEM; + goto err_free_mem; + } + + tscadc_dev->tsc = ts_dev; + ts_dev->mfd_tscadc = tscadc_dev; + ts_dev->input = input_dev; + ts_dev->irq = tscadc_dev->irq; + ts_dev->wires = pdata->tsc_init->wires; + ts_dev->x_plate_resistance = pdata->tsc_init->x_plate_resistance; + ts_dev->steps_to_configure = pdata->tsc_init->steps_to_configure; + + err = request_irq(ts_dev->irq, titsc_irq, + 0, pdev->dev.driver->name, ts_dev); + if (err) { + dev_err(&pdev->dev, "failed to allocate irq.\n"); + goto err_free_mem; + } + + titsc_writel(ts_dev, REG_IRQENABLE, IRQENB_FIFO0THRES); + titsc_step_config(ts_dev); + titsc_writel(ts_dev, REG_FIFO0THR, ts_dev->steps_to_configure); + + input_dev->name = "ti-tsc"; + input_dev->dev.parent = &pdev->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, 0, 0); + + /* register to the input system */ + err = input_register_device(input_dev); + if (err) + goto err_free_irq; + + platform_set_drvdata(pdev, ts_dev); + return 0; + +err_free_irq: + free_irq(ts_dev->irq, ts_dev); +err_free_mem: + input_free_device(input_dev); + kfree(ts_dev); + return err; +} + +static int titsc_remove(struct platform_device *pdev) +{ + struct ti_tscadc_dev *tscadc_dev = pdev->dev.platform_data; + struct titsc *ts_dev = tscadc_dev->tsc; + + free_irq(ts_dev->irq, ts_dev); + + input_unregister_device(ts_dev->input); + + platform_set_drvdata(pdev, NULL); + kfree(ts_dev); + return 0; +} + +#ifdef CONFIG_PM +static int titsc_suspend(struct device *dev) +{ + struct ti_tscadc_dev *tscadc_dev = dev->platform_data; + struct titsc *ts_dev = tscadc_dev->tsc; + unsigned int idle; + + if (device_may_wakeup(tscadc_dev->dev)) { + idle = titsc_readl(ts_dev, REG_IRQENABLE); + titsc_writel(ts_dev, REG_IRQENABLE, + (idle | IRQENB_HW_PEN)); + titsc_writel(ts_dev, REG_IRQWAKEUP, IRQWKUP_ENB); + } + return 0; +} + +static int titsc_resume(struct device *dev) +{ + struct ti_tscadc_dev *tscadc_dev = dev->platform_data; + struct titsc *ts_dev = tscadc_dev->tsc; + + if (device_may_wakeup(tscadc_dev->dev)) { + titsc_writel(ts_dev, REG_IRQWAKEUP, + 0x00); + titsc_writel(ts_dev, REG_IRQCLR, IRQENB_HW_PEN); + } + titsc_step_config(ts_dev); + titsc_writel(ts_dev, REG_FIFO0THR, + ts_dev->steps_to_configure); + return 0; +} + +static const struct dev_pm_ops titsc_pm_ops = { + .suspend = titsc_suspend, + .resume = titsc_resume, +}; +#define TITSC_PM_OPS (&titsc_pm_ops) +#else +#define TITSC_PM_OPS NULL +#endif + +static struct platform_driver ti_tsc_driver = { + .probe = titsc_probe, + .remove = titsc_remove, + .driver = { + .name = "tsc", + .owner = THIS_MODULE, + .pm = TITSC_PM_OPS, + }, +}; +module_platform_driver(ti_tsc_driver); + +MODULE_DESCRIPTION("TI touchscreen controller driver"); +MODULE_AUTHOR("Rachna Patil "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/tnetv107x-ts.c b/drivers/input/touchscreen/tnetv107x-ts.c new file mode 100644 index 00000000..acfb8760 --- /dev/null +++ b/drivers/input/touchscreen/tnetv107x-ts.c @@ -0,0 +1,386 @@ +/* + * Texas Instruments TNETV107X Touchscreen Driver + * + * Copyright (C) 2010 Texas Instruments + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation version 2. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define TSC_PENUP_POLL (HZ / 5) +#define IDLE_TIMEOUT 100 /* msec */ + +/* + * The first and last samples of a touch interval are usually garbage and need + * to be filtered out with these devices. The following definitions control + * the number of samples skipped. + */ +#define TSC_HEAD_SKIP 1 +#define TSC_TAIL_SKIP 1 +#define TSC_SKIP (TSC_HEAD_SKIP + TSC_TAIL_SKIP + 1) +#define TSC_SAMPLES (TSC_SKIP + 1) + +/* Register Offsets */ +struct tsc_regs { + u32 rev; + u32 tscm; + u32 bwcm; + u32 swc; + u32 adcchnl; + u32 adcdata; + u32 chval[4]; +}; + +/* TSC Mode Configuration Register (tscm) bits */ +#define WMODE BIT(0) +#define TSKIND BIT(1) +#define ZMEASURE_EN BIT(2) +#define IDLE BIT(3) +#define TSC_EN BIT(4) +#define STOP BIT(5) +#define ONE_SHOT BIT(6) +#define SINGLE BIT(7) +#define AVG BIT(8) +#define AVGNUM(x) (((x) & 0x03) << 9) +#define PVSTC(x) (((x) & 0x07) << 11) +#define PON BIT(14) +#define PONBG BIT(15) +#define AFERST BIT(16) + +/* ADC DATA Capture Register bits */ +#define DATA_VALID BIT(16) + +/* Register Access Macros */ +#define tsc_read(ts, reg) __raw_readl(&(ts)->regs->reg) +#define tsc_write(ts, reg, val) __raw_writel(val, &(ts)->regs->reg); +#define tsc_set_bits(ts, reg, val) \ + tsc_write(ts, reg, tsc_read(ts, reg) | (val)) +#define tsc_clr_bits(ts, reg, val) \ + tsc_write(ts, reg, tsc_read(ts, reg) & ~(val)) + +struct sample { + int x, y, p; +}; + +struct tsc_data { + struct input_dev *input_dev; + struct resource *res; + struct tsc_regs __iomem *regs; + struct timer_list timer; + spinlock_t lock; + struct clk *clk; + struct device *dev; + int sample_count; + struct sample samples[TSC_SAMPLES]; + int tsc_irq; +}; + +static int tsc_read_sample(struct tsc_data *ts, struct sample* sample) +{ + int x, y, z1, z2, t, p = 0; + u32 val; + + val = tsc_read(ts, chval[0]); + if (val & DATA_VALID) + x = val & 0xffff; + else + return -EINVAL; + + y = tsc_read(ts, chval[1]) & 0xffff; + z1 = tsc_read(ts, chval[2]) & 0xffff; + z2 = tsc_read(ts, chval[3]) & 0xffff; + + if (z1) { + t = ((600 * x) * (z2 - z1)); + p = t / (u32) (z1 << 12); + if (p < 0) + p = 0; + } + + sample->x = x; + sample->y = y; + sample->p = p; + + return 0; +} + +static void tsc_poll(unsigned long data) +{ + struct tsc_data *ts = (struct tsc_data *)data; + unsigned long flags; + int i, val, x, y, p; + + spin_lock_irqsave(&ts->lock, flags); + + if (ts->sample_count >= TSC_SKIP) { + input_report_abs(ts->input_dev, ABS_PRESSURE, 0); + input_report_key(ts->input_dev, BTN_TOUCH, 0); + input_sync(ts->input_dev); + } else if (ts->sample_count > 0) { + /* + * A touch event lasted less than our skip count. Salvage and + * report anyway. + */ + for (i = 0, val = 0; i < ts->sample_count; i++) + val += ts->samples[i].x; + x = val / ts->sample_count; + + for (i = 0, val = 0; i < ts->sample_count; i++) + val += ts->samples[i].y; + y = val / ts->sample_count; + + for (i = 0, val = 0; i < ts->sample_count; i++) + val += ts->samples[i].p; + p = val / ts->sample_count; + + input_report_abs(ts->input_dev, ABS_X, x); + input_report_abs(ts->input_dev, ABS_Y, y); + input_report_abs(ts->input_dev, ABS_PRESSURE, p); + input_report_key(ts->input_dev, BTN_TOUCH, 1); + input_sync(ts->input_dev); + } + + ts->sample_count = 0; + + spin_unlock_irqrestore(&ts->lock, flags); +} + +static irqreturn_t tsc_irq(int irq, void *dev_id) +{ + struct tsc_data *ts = (struct tsc_data *)dev_id; + struct sample *sample; + int index; + + spin_lock(&ts->lock); + + index = ts->sample_count % TSC_SAMPLES; + sample = &ts->samples[index]; + if (tsc_read_sample(ts, sample) < 0) + goto out; + + if (++ts->sample_count >= TSC_SKIP) { + index = (ts->sample_count - TSC_TAIL_SKIP - 1) % TSC_SAMPLES; + sample = &ts->samples[index]; + + input_report_abs(ts->input_dev, ABS_X, sample->x); + input_report_abs(ts->input_dev, ABS_Y, sample->y); + input_report_abs(ts->input_dev, ABS_PRESSURE, sample->p); + if (ts->sample_count == TSC_SKIP) + input_report_key(ts->input_dev, BTN_TOUCH, 1); + input_sync(ts->input_dev); + } + mod_timer(&ts->timer, jiffies + TSC_PENUP_POLL); +out: + spin_unlock(&ts->lock); + return IRQ_HANDLED; +} + +static int tsc_start(struct input_dev *dev) +{ + struct tsc_data *ts = input_get_drvdata(dev); + unsigned long timeout = jiffies + msecs_to_jiffies(IDLE_TIMEOUT); + u32 val; + + clk_enable(ts->clk); + + /* Go to idle mode, before any initialization */ + while (time_after(timeout, jiffies)) { + if (tsc_read(ts, tscm) & IDLE) + break; + } + + if (time_before(timeout, jiffies)) { + dev_warn(ts->dev, "timeout waiting for idle\n"); + clk_disable(ts->clk); + return -EIO; + } + + /* Configure TSC Control register*/ + val = (PONBG | PON | PVSTC(4) | ONE_SHOT | ZMEASURE_EN); + tsc_write(ts, tscm, val); + + /* Bring TSC out of reset: Clear AFE reset bit */ + val &= ~(AFERST); + tsc_write(ts, tscm, val); + + /* Configure all pins for hardware control*/ + tsc_write(ts, bwcm, 0); + + /* Finally enable the TSC */ + tsc_set_bits(ts, tscm, TSC_EN); + + return 0; +} + +static void tsc_stop(struct input_dev *dev) +{ + struct tsc_data *ts = input_get_drvdata(dev); + + tsc_clr_bits(ts, tscm, TSC_EN); + synchronize_irq(ts->tsc_irq); + del_timer_sync(&ts->timer); + clk_disable(ts->clk); +} + +static int tsc_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct tsc_data *ts; + int error = 0; + u32 rev = 0; + + ts = kzalloc(sizeof(struct tsc_data), GFP_KERNEL); + if (!ts) { + dev_err(dev, "cannot allocate device info\n"); + return -ENOMEM; + } + + ts->dev = dev; + spin_lock_init(&ts->lock); + setup_timer(&ts->timer, tsc_poll, (unsigned long)ts); + platform_set_drvdata(pdev, ts); + + ts->tsc_irq = platform_get_irq(pdev, 0); + if (ts->tsc_irq < 0) { + dev_err(dev, "cannot determine device interrupt\n"); + error = -ENODEV; + goto error_res; + } + + ts->res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!ts->res) { + dev_err(dev, "cannot determine register area\n"); + error = -ENODEV; + goto error_res; + } + + if (!request_mem_region(ts->res->start, resource_size(ts->res), + pdev->name)) { + dev_err(dev, "cannot claim register memory\n"); + ts->res = NULL; + error = -EINVAL; + goto error_res; + } + + ts->regs = ioremap(ts->res->start, resource_size(ts->res)); + if (!ts->regs) { + dev_err(dev, "cannot map register memory\n"); + error = -ENOMEM; + goto error_map; + } + + ts->clk = clk_get(dev, NULL); + if (IS_ERR(ts->clk)) { + dev_err(dev, "cannot claim device clock\n"); + error = PTR_ERR(ts->clk); + goto error_clk; + } + + error = request_threaded_irq(ts->tsc_irq, NULL, tsc_irq, IRQF_ONESHOT, + dev_name(dev), ts); + if (error < 0) { + dev_err(ts->dev, "Could not allocate ts irq\n"); + goto error_irq; + } + + ts->input_dev = input_allocate_device(); + if (!ts->input_dev) { + dev_err(dev, "cannot allocate input device\n"); + error = -ENOMEM; + goto error_input; + } + input_set_drvdata(ts->input_dev, ts); + + ts->input_dev->name = pdev->name; + ts->input_dev->id.bustype = BUS_HOST; + ts->input_dev->dev.parent = &pdev->dev; + ts->input_dev->open = tsc_start; + ts->input_dev->close = tsc_stop; + + clk_enable(ts->clk); + rev = tsc_read(ts, rev); + ts->input_dev->id.product = ((rev >> 8) & 0x07); + ts->input_dev->id.version = ((rev >> 16) & 0xfff); + clk_disable(ts->clk); + + __set_bit(EV_KEY, ts->input_dev->evbit); + __set_bit(EV_ABS, ts->input_dev->evbit); + __set_bit(BTN_TOUCH, ts->input_dev->keybit); + + input_set_abs_params(ts->input_dev, ABS_X, 0, 0xffff, 5, 0); + input_set_abs_params(ts->input_dev, ABS_Y, 0, 0xffff, 5, 0); + input_set_abs_params(ts->input_dev, ABS_PRESSURE, 0, 4095, 128, 0); + + error = input_register_device(ts->input_dev); + if (error < 0) { + dev_err(dev, "failed input device registration\n"); + goto error_reg; + } + + return 0; + +error_reg: + input_free_device(ts->input_dev); +error_input: + free_irq(ts->tsc_irq, ts); +error_irq: + clk_put(ts->clk); +error_clk: + iounmap(ts->regs); +error_map: + release_mem_region(ts->res->start, resource_size(ts->res)); +error_res: + platform_set_drvdata(pdev, NULL); + kfree(ts); + + return error; +} + +static int tsc_remove(struct platform_device *pdev) +{ + struct tsc_data *ts = platform_get_drvdata(pdev); + + input_unregister_device(ts->input_dev); + free_irq(ts->tsc_irq, ts); + clk_put(ts->clk); + iounmap(ts->regs); + release_mem_region(ts->res->start, resource_size(ts->res)); + platform_set_drvdata(pdev, NULL); + kfree(ts); + + return 0; +} + +static struct platform_driver tsc_driver = { + .probe = tsc_probe, + .remove = tsc_remove, + .driver.name = "tnetv107x-ts", + .driver.owner = THIS_MODULE, +}; +module_platform_driver(tsc_driver); + +MODULE_AUTHOR("Cyril Chemparathy"); +MODULE_DESCRIPTION("TNETV107X Touchscreen Driver"); +MODULE_ALIAS("platform:tnetv107x-ts"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/touchit213.c b/drivers/input/touchscreen/touchit213.c new file mode 100644 index 00000000..5f29e5b8 --- /dev/null +++ b/drivers/input/touchscreen/touchit213.c @@ -0,0 +1,219 @@ +/* + * Sahara TouchIT-213 serial touchscreen driver + * + * Copyright (c) 2007-2008 Claudio Nieder + * + * Based on Touchright driver (drivers/input/touchscreen/touchright.c) + * Copyright (c) 2006 Rick Koch + * Copyright (c) 2004 Vojtech Pavlik + * and Dan Streetman + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Sahara TouchIT-213 serial touchscreen driver" + +MODULE_AUTHOR("Claudio Nieder "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +/* + * Data is received through COM1 at 9600bit/s,8bit,no parity in packets + * of 5 byte each. + * + * +--------+ +--------+ +--------+ +--------+ +--------+ + * |1000000p| |0xxxxxxx| |0xxxxxxx| |0yyyyyyy| |0yyyyyyy| + * +--------+ +--------+ +--------+ +--------+ +--------+ + * MSB LSB MSB LSB + * + * The value of p is 1 as long as the screen is touched and 0 when + * reporting the location where touching stopped, e.g. where the pen was + * lifted from the screen. + * + * When holding the screen in landscape mode as the BIOS text output is + * presented, x is the horizontal axis with values growing from left to + * right and y is the vertical axis with values growing from top to + * bottom. + * + * When holding the screen in portrait mode with the Sahara logo in its + * correct position, x ist the vertical axis with values growing from + * top to bottom and y is the horizontal axis with values growing from + * right to left. + */ + +#define T213_FORMAT_TOUCH_BIT 0x01 +#define T213_FORMAT_STATUS_BYTE 0x80 +#define T213_FORMAT_STATUS_MASK ~T213_FORMAT_TOUCH_BIT + +/* + * On my Sahara Touch-IT 213 I have observed x values from 0 to 0x7f0 + * and y values from 0x1d to 0x7e9, so the actual measurement is + * probably done with an 11 bit precision. + */ +#define T213_MIN_XC 0 +#define T213_MAX_XC 0x07ff +#define T213_MIN_YC 0 +#define T213_MAX_YC 0x07ff + +/* + * Per-touchscreen data. + */ + +struct touchit213 { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char csum; + unsigned char data[5]; + char phys[32]; +}; + +static irqreturn_t touchit213_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct touchit213 *touchit213 = serio_get_drvdata(serio); + struct input_dev *dev = touchit213->dev; + + touchit213->data[touchit213->idx] = data; + + switch (touchit213->idx++) { + case 0: + if ((touchit213->data[0] & T213_FORMAT_STATUS_MASK) != + T213_FORMAT_STATUS_BYTE) { + pr_debug("unsynchronized data: 0x%02x\n", data); + touchit213->idx = 0; + } + break; + + case 4: + touchit213->idx = 0; + input_report_abs(dev, ABS_X, + (touchit213->data[1] << 7) | touchit213->data[2]); + input_report_abs(dev, ABS_Y, + (touchit213->data[3] << 7) | touchit213->data[4]); + input_report_key(dev, BTN_TOUCH, + touchit213->data[0] & T213_FORMAT_TOUCH_BIT); + input_sync(dev); + break; + } + + return IRQ_HANDLED; +} + +/* + * touchit213_disconnect() is the opposite of touchit213_connect() + */ + +static void touchit213_disconnect(struct serio *serio) +{ + struct touchit213 *touchit213 = serio_get_drvdata(serio); + + input_get_device(touchit213->dev); + input_unregister_device(touchit213->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(touchit213->dev); + kfree(touchit213); +} + +/* + * touchit213_connect() is the routine that is called when someone adds a + * new serio device that supports the Touchright protocol and registers it as + * an input device. + */ + +static int touchit213_connect(struct serio *serio, struct serio_driver *drv) +{ + struct touchit213 *touchit213; + struct input_dev *input_dev; + int err; + + touchit213 = kzalloc(sizeof(struct touchit213), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!touchit213 || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + touchit213->serio = serio; + touchit213->dev = input_dev; + snprintf(touchit213->phys, sizeof(touchit213->phys), + "%s/input0", serio->phys); + + input_dev->name = "Sahara Touch-iT213 Serial TouchScreen"; + input_dev->phys = touchit213->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_TOUCHIT213; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(touchit213->dev, ABS_X, + T213_MIN_XC, T213_MAX_XC, 0, 0); + input_set_abs_params(touchit213->dev, ABS_Y, + T213_MIN_YC, T213_MAX_YC, 0, 0); + + serio_set_drvdata(serio, touchit213); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(touchit213->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(touchit213); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id touchit213_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_TOUCHIT213, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, touchit213_serio_ids); + +static struct serio_driver touchit213_drv = { + .driver = { + .name = "touchit213", + }, + .description = DRIVER_DESC, + .id_table = touchit213_serio_ids, + .interrupt = touchit213_interrupt, + .connect = touchit213_connect, + .disconnect = touchit213_disconnect, +}; + +module_serio_driver(touchit213_drv); diff --git a/drivers/input/touchscreen/touchright.c b/drivers/input/touchscreen/touchright.c new file mode 100644 index 00000000..8a2887da --- /dev/null +++ b/drivers/input/touchscreen/touchright.c @@ -0,0 +1,179 @@ +/* + * Touchright serial touchscreen driver + * + * Copyright (c) 2006 Rick Koch + * + * Based on MicroTouch driver (drivers/input/touchscreen/mtouch.c) + * Copyright (c) 2004 Vojtech Pavlik + * and Dan Streetman + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Touchright serial touchscreen driver" + +MODULE_AUTHOR("Rick Koch "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define TR_FORMAT_TOUCH_BIT 0x01 +#define TR_FORMAT_STATUS_BYTE 0x40 +#define TR_FORMAT_STATUS_MASK ~TR_FORMAT_TOUCH_BIT + +#define TR_LENGTH 5 + +#define TR_MIN_XC 0 +#define TR_MAX_XC 0x1ff +#define TR_MIN_YC 0 +#define TR_MAX_YC 0x1ff + +/* + * Per-touchscreen data. + */ + +struct tr { + struct input_dev *dev; + struct serio *serio; + int idx; + unsigned char data[TR_LENGTH]; + char phys[32]; +}; + +static irqreturn_t tr_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct tr *tr = serio_get_drvdata(serio); + struct input_dev *dev = tr->dev; + + tr->data[tr->idx] = data; + + if ((tr->data[0] & TR_FORMAT_STATUS_MASK) == TR_FORMAT_STATUS_BYTE) { + if (++tr->idx == TR_LENGTH) { + input_report_abs(dev, ABS_X, + (tr->data[1] << 5) | (tr->data[2] >> 1)); + input_report_abs(dev, ABS_Y, + (tr->data[3] << 5) | (tr->data[4] >> 1)); + input_report_key(dev, BTN_TOUCH, + tr->data[0] & TR_FORMAT_TOUCH_BIT); + input_sync(dev); + tr->idx = 0; + } + } + + return IRQ_HANDLED; +} + +/* + * tr_disconnect() is the opposite of tr_connect() + */ + +static void tr_disconnect(struct serio *serio) +{ + struct tr *tr = serio_get_drvdata(serio); + + input_get_device(tr->dev); + input_unregister_device(tr->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(tr->dev); + kfree(tr); +} + +/* + * tr_connect() is the routine that is called when someone adds a + * new serio device that supports the Touchright protocol and registers it as + * an input device. + */ + +static int tr_connect(struct serio *serio, struct serio_driver *drv) +{ + struct tr *tr; + struct input_dev *input_dev; + int err; + + tr = kzalloc(sizeof(struct tr), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!tr || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + tr->serio = serio; + tr->dev = input_dev; + snprintf(tr->phys, sizeof(tr->phys), "%s/input0", serio->phys); + + input_dev->name = "Touchright Serial TouchScreen"; + input_dev->phys = tr->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_TOUCHRIGHT; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(tr->dev, ABS_X, TR_MIN_XC, TR_MAX_XC, 0, 0); + input_set_abs_params(tr->dev, ABS_Y, TR_MIN_YC, TR_MAX_YC, 0, 0); + + serio_set_drvdata(serio, tr); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(tr->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(tr); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id tr_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_TOUCHRIGHT, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, tr_serio_ids); + +static struct serio_driver tr_drv = { + .driver = { + .name = "touchright", + }, + .description = DRIVER_DESC, + .id_table = tr_serio_ids, + .interrupt = tr_interrupt, + .connect = tr_connect, + .disconnect = tr_disconnect, +}; + +module_serio_driver(tr_drv); diff --git a/drivers/input/touchscreen/touchwin.c b/drivers/input/touchscreen/touchwin.c new file mode 100644 index 00000000..588cdcb8 --- /dev/null +++ b/drivers/input/touchscreen/touchwin.c @@ -0,0 +1,186 @@ +/* + * Touchwindow serial touchscreen driver + * + * Copyright (c) 2006 Rick Koch + * + * Based on MicroTouch driver (drivers/input/touchscreen/mtouch.c) + * Copyright (c) 2004 Vojtech Pavlik + * and Dan Streetman + */ + +/* + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation. + */ + +/* + * 2005/02/19 Rick Koch: + * The Touchwindow I used is made by Edmark Corp. and + * constantly outputs a stream of 0's unless it is touched. + * It then outputs 3 bytes: X, Y, and a copy of Y. + */ + +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Touchwindow serial touchscreen driver" + +MODULE_AUTHOR("Rick Koch "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +/* + * Definitions & global arrays. + */ + +#define TW_LENGTH 3 + +#define TW_MIN_XC 0 +#define TW_MAX_XC 0xff +#define TW_MIN_YC 0 +#define TW_MAX_YC 0xff + +/* + * Per-touchscreen data. + */ + +struct tw { + struct input_dev *dev; + struct serio *serio; + int idx; + int touched; + unsigned char data[TW_LENGTH]; + char phys[32]; +}; + +static irqreturn_t tw_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct tw *tw = serio_get_drvdata(serio); + struct input_dev *dev = tw->dev; + + if (data) { /* touch */ + tw->touched = 1; + tw->data[tw->idx++] = data; + /* verify length and that the two Y's are the same */ + if (tw->idx == TW_LENGTH && tw->data[1] == tw->data[2]) { + input_report_abs(dev, ABS_X, tw->data[0]); + input_report_abs(dev, ABS_Y, tw->data[1]); + input_report_key(dev, BTN_TOUCH, 1); + input_sync(dev); + tw->idx = 0; + } + } else if (tw->touched) { /* untouch */ + input_report_key(dev, BTN_TOUCH, 0); + input_sync(dev); + tw->idx = 0; + tw->touched = 0; + } + + return IRQ_HANDLED; +} + +/* + * tw_disconnect() is the opposite of tw_connect() + */ + +static void tw_disconnect(struct serio *serio) +{ + struct tw *tw = serio_get_drvdata(serio); + + input_get_device(tw->dev); + input_unregister_device(tw->dev); + serio_close(serio); + serio_set_drvdata(serio, NULL); + input_put_device(tw->dev); + kfree(tw); +} + +/* + * tw_connect() is the routine that is called when someone adds a + * new serio device that supports the Touchwin protocol and registers it as + * an input device. + */ + +static int tw_connect(struct serio *serio, struct serio_driver *drv) +{ + struct tw *tw; + struct input_dev *input_dev; + int err; + + tw = kzalloc(sizeof(struct tw), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!tw || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + tw->serio = serio; + tw->dev = input_dev; + snprintf(tw->phys, sizeof(tw->phys), "%s/input0", serio->phys); + + input_dev->name = "Touchwindow Serial TouchScreen"; + input_dev->phys = tw->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_TOUCHWIN; + input_dev->id.product = 0; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(tw->dev, ABS_X, TW_MIN_XC, TW_MAX_XC, 0, 0); + input_set_abs_params(tw->dev, ABS_Y, TW_MIN_YC, TW_MAX_YC, 0, 0); + + serio_set_drvdata(serio, tw); + + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = input_register_device(tw->dev); + if (err) + goto fail3; + + return 0; + + fail3: serio_close(serio); + fail2: serio_set_drvdata(serio, NULL); + fail1: input_free_device(input_dev); + kfree(tw); + return err; +} + +/* + * The serio driver structure. + */ + +static struct serio_device_id tw_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_TOUCHWIN, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, tw_serio_ids); + +static struct serio_driver tw_drv = { + .driver = { + .name = "touchwin", + }, + .description = DRIVER_DESC, + .id_table = tw_serio_ids, + .interrupt = tw_interrupt, + .connect = tw_connect, + .disconnect = tw_disconnect, +}; + +module_serio_driver(tw_drv); diff --git a/drivers/input/touchscreen/tp_sprd.c b/drivers/input/touchscreen/tp_sprd.c new file mode 100644 index 00000000..ad29f2d3 --- /dev/null +++ b/drivers/input/touchscreen/tp_sprd.c @@ -0,0 +1,802 @@ +/* + * Copyright (C) 2012 Spreadtrum Communications Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +/* #define TP_DEBUG */ +#ifdef TP_DEBUG +#define TP_PRINT printk +#else +#define TP_PRINT(...) +#endif + +#define SCI_PASSERT(condition, format...) \ + do { \ + if(!(condition)) { \ + pr_err("function :%s\r\n", __FUNCTION__);\ + BUG(); \ + } \ + }while(0) + +#define ANA_REG_BASE SPRD_ANA_BASE +#define SPRD_ANA_BASE (SPRD_MISC_BASE + 0x600) +#define ANA_AGEN (ANA_REG_BASE + 0x00) + +#define TPC_REG_BASE (SPRD_MISC_BASE+0x280) +#define TPC_CTRL (TPC_REG_BASE + 0x0000) +#define TPC_SAMPLE_CTRL0 (TPC_REG_BASE + 0x0004) +#define TPC_SAMPLE_CTRL1 (TPC_REG_BASE + 0x0008) +#define TPC_BOUNCE_CTRL (TPC_REG_BASE + 0x000C) +#define TPC_FILTER_CTRL (TPC_REG_BASE + 0x0010) +#define TPC_CALC_CTRL (TPC_REG_BASE + 0x0014) +#define TPC_CALC_X_COEF_A (TPC_REG_BASE + 0x0018) +#define TPC_CALC_X_COEF_B (TPC_REG_BASE + 0x001C) +#define TPC_CALC_Y_COEF_A (TPC_REG_BASE + 0x0020) +#define TPC_CALC_Y_COEF_B (TPC_REG_BASE + 0x0024) +#define TPC_INT_EN (TPC_REG_BASE + 0x0028) +#define TPC_INT_STS (TPC_REG_BASE + 0x002C) +#define TPC_INT_RAW (TPC_REG_BASE + 0x0030) +#define TPC_INT_CLR (TPC_REG_BASE + 0x0034) +#define TPC_BUF_CTRL (TPC_REG_BASE + 0x0038) +#define TPC_X_DATA (TPC_REG_BASE + 0x003C) +#define TPC_Y_DATA (TPC_REG_BASE + 0x0040) +#define TPC_Z_DATA (TPC_REG_BASE + 0x0044) + +/* TPC_CTRL BIT map */ +#define TPC_STOP_BIT BIT(5) +#define TPC_RUN_BIT BIT(4) +#define TPC_TPC_MODE_BIT BIT(3) +#define TPC_PEN_REQ_POL_BIT BIT(1) +#define TPC_EN_BIT BIT(0) + +#define TPC_PRESCALE_OFFSET 0x08 +#define TPC_PRESCALE_MSK (0xFF << TPC_PRESCALE_OFFSET) + +/* TPC_SAMPLE_CTRL0 BIT map */ +#define TPC_SAMPLE_INTERVAL_OFFSET 0 +#define TPC_SAMPLE_INTERVAL_MSK (0xFF << TPC_SAMPLE_INTERVAL_OFFSET) +#define TPC_POINT_INTERVAL_OFFSET 8 +#define TPC_POINT_INTERVAL_MSK (0xFF << TPC_POINT_INTERVAL_OFFSET) + +/* TPC_SAMPLE_CTRL1 BIT map */ +#define TPC_DATA_INTERVAL_OFFSET 0 +#define TPC_DATA_INTERVAL_MSK (0xFFF << TPC_DATA_INTERVAL_OFFSET) +#define TPC_SAMPLE_NUM_OFFSET 12 +#define TPC_SAMPLE_NUM_MSK (0xF << TPC_SAMPLE_NUM_OFFSET) + +/* TPC_BOUNCE_CTRL BIT map */ +#define TPC_DEBOUNCE_EN_BIT BIT(0) +#define TPC_DEBOUNCE_NUM_OFFSET 1 +#define TPC_DEBOUNCE_NUM_MSK (0xFF << TPC_DEBOUNCE_NUM_OFFSET) + + +/* TPC_FILTER_CTRL BIT map */ +#define TPC_FILTER_EN_BIT BIT(0) +#define TPC_FILTER_MODE_BIT BIT(1) +#define TPC_FILTER_MODE_OFFSET 2 +#define TPC_FILTER_MODE_MSK (0xF << TPC_FILTER_MODE_OFFSET) + +/* TPC_BUF_CTRL BIT map */ +#define TPC_BUF_EMP_BIT BIT(5) +#define TPC_BUF_FULL BIT(4) +#define TPC_BUF_LENGTH_OFFSET 0 +#define TPC_BUF_LENGTH_MSK (0xF << TPC_BUF_LENGTH_OFFSET) + +#define TPC_DONE_IRQ_MSK_BIT BIT(2) +#define TPC_UP_IRQ_MSK_BIT BIT(1) +#define TPC_DOWN_IRQ_MSK_BIT BIT(0) + +#define ADC_REG_BASE (SPRD_MISC_BASE+0x300) +#define ADC_CTRL (ADC_REG_BASE + 0x0000) +#define ADC_CS (ADC_REG_BASE + 0x0004) +#define ADC_TPC_CH_CTRL (ADC_REG_BASE + 0x0008) +#define ADC_DAT (ADC_REG_BASE + 0x00C) +#define ADC_INT_EN (ADC_REG_BASE + 0x0010) +#define ADC_INT_CLR (ADC_REG_BASE + 0x0014) +#define ADC_INT_STAT (ADC_REG_BASE + 0x0018) +#define ADC_INT_SRC (ADC_REG_BASE + 0x001C) + +/* ADC_CTRL */ +#define ADC_STATUS_BIT BIT(4) +#define ADC_TPC_CH_ON_BIT BIT(2) +#define SW_CH_ON_BIT BIT(1) +#define ADC_EN_BIT BIT(0) + +/* ADC_CS bit map */ +#define ADC_SCALE_BIT BIT(4) +#define ADC_SLOW_BIT BIT(5) +#define ADC_CS_BIT_MSK 0x0F + +#define ADC_SCALE_3V 0 +#define ADC_SCALE_1V2 1 + +/* ADC TPC channel control */ +#define ADC_TPC_CH_DELAT_OFFSET 8 +#define ADC_TPC_CH_DELAY_MASK (0xFF << ADC_TPC_CH_DELAT_OFFSET) + +#define TPC_BUF_LENGTH 4 +#define TPC_DELTA_DATA 15 +#define CLEAR_TPC_INT(msk) \ + do{ \ + sci_adi_raw_write(TPC_INT_CLR, (msk));\ + while(sci_adi_read(TPC_INT_RAW) & (msk)); \ + }while(0) + +#define X_MIN 0 +#define X_MAX 0x3ff +#define Y_MIN 0 +#define Y_MAX 0x3ff + +#define TPC_CHANNEL_X 2 +#define TPC_CHANNEL_Y 3 +#define ADC_CH_MAX_NUM 8 + +#define SCI_TRUE 1 +#define SCI_FALSE 0 + +/* fit touch panel to LCD size */ +#define TP_LCD_WIDTH 320 +#define TP_LCD_HEIGHT 480 +/* +int a= 35337; +int b= -305; +int c= -8622664; +int d= -105; +int e= 43086; +int f= -8445728; +int g= 65536; +*/ + +typedef union +{ + struct + { + int16_t y; + int16_t x; + } data; + int32_t dwValue; +} TPC_DATA_U; + + +typedef struct{ + uint16_t x_coef_a; + uint16_t x_coef_b; + uint16_t y_coef_a; + uint16_t y_coef_b; +}TPC_COEF; + +struct sprd_tp{ + struct input_dev *input; + + unsigned int irq; + unsigned int is_first_down; + + struct timer_list timer; + TPC_DATA_U tp_data; +}; + + +static uint8_t cal_mode_en = 0; +static TPC_DATA_U cal_data; +static TPC_COEF cal_coef; +static struct sprd_tp *sprd_tp_data = NULL; +static uint16_t tp_fix_cx = (TP_LCD_WIDTH>>1); +static uint16_t tp_fix_cy = (TP_LCD_HEIGHT>>1); + +static void ADC_Init(void) +{ +#if CONFIG_ARCH_SC8810 +/* 8810 TODO */ + sci_adi_set (ANA_AGEN, (BIT(5) | BIT(13) | BIT(14) )); /* AUXAD controller APB clock enable */ +#else + sci_adi_set (ANA_AGEN, AGEN_ADC_EN); /* AUXAD controller APB clock enable */ + sci_adi_set (ANA_CLK_CTL, ACLK_CTL_AUXAD_EN | ACLK_CTL_AUXADC_EN);//enable AUXAD clock generation + sci_adi_set (ADC_CTRL, ADC_EN_BIT);/* ADC module enable */ +#endif + /* Set ADC conversion speed to slow mode, this bit is used for TPC + channel only */ + sci_adi_set(ADC_CS, ADC_SLOW_BIT); + + /* Set TPC channel sampling delay */ + sci_adi_set(ADC_TPC_CH_CTRL, ADC_TPC_CH_DELAY_MASK); +} +static void ADC_SetScale (uint32_t scale) +{ + if (scale == ADC_SCALE_1V2) + { + /* Set ADC small scalel */ + sci_adi_clr (ADC_CS, ADC_SCALE_BIT); + } + else if ( (scale == ADC_SCALE_3V)) + { + /* Set ADC large scalel */ + sci_adi_set (ADC_CS, ADC_SCALE_BIT); + } +} + +static void sci_adi_msk_or(uint32_t addr,uint32_t value,uint32_t msk) +{ + unsigned short adi_tmp_val; + adi_tmp_val = sci_adi_read(addr); + adi_tmp_val &= (unsigned short)(~(msk)); + adi_tmp_val |= (unsigned short)((value)&(msk)); + sci_adi_raw_write(addr, adi_tmp_val); +} + +static void ADC_SetCs (uint32_t source) +{ + SCI_PASSERT( (source < ADC_CH_MAX_NUM), ("error: source =%d",source)); + sci_adi_msk_or (ADC_CS, source, ADC_CS_BIT_MSK); + + +} + void ADC_OpenTPC (void) +{ + /* Open TPC channel */ + sci_adi_set (ADC_CTRL, ADC_TPC_CH_ON_BIT); + + TP_PRINT( "ADC:ADC_OpenTPC\n"); + +} + void ADC_CloseTPC (void) +{ + /* Close TPC channel */ + sci_adi_clr (ADC_CTRL, ADC_TPC_CH_ON_BIT); + + TP_PRINT( "ADC:ADC_CloseTPC\n"); +} +static void tp_init(void) +{ +#if CONFIG_ARCH_SC8810 + sci_adi_set (ANA_AGEN, BIT(12) | BIT(4) );/* Touch panel controller APB clock enable */ +#else + sci_adi_set (ANA_AGEN, AGEN_TPC_EN | AGEN_RTC_TPC_EN);/* Touch panel controller APB clock enable */ +#endif + /* Enable TPC module */ + sci_adi_set (TPC_CTRL, TPC_EN_BIT); + //Config pen request polarity + sci_adi_clr (TPC_CTRL, TPC_PEN_REQ_POL_BIT); + + /* Config tpc mode */ + sci_adi_clr ( TPC_CTRL, TPC_TPC_MODE_BIT); + + /* 500KHz */ + sci_adi_msk_or (TPC_CTRL, (0x0D<< TPC_PRESCALE_OFFSET), TPC_PRESCALE_MSK);/* prescale */ + + /* Config ADC channel */ + ADC_SetScale (ADC_SCALE_3V); + + /* Config TPC sample properity */ + sci_adi_raw_write (TPC_SAMPLE_CTRL0, + (0x10 << TPC_SAMPLE_INTERVAL_OFFSET) | (0x30 <= X_MAX || + cur_data.data.y <= Y_MIN || cur_data.data.y >= Y_MAX) + return SCI_FALSE; + + if (pre_data.dwValue != 0) + { + delta_x = pre_data.data.x - cur_data.data.x; + delta_x = (delta_x > 0) ? delta_x : (- delta_x); + delta_y = pre_data.data.y - cur_data.data.y; + delta_y = (delta_y > 0) ? delta_y : (- delta_y); + + TP_PRINT("delta_x=%d,delta_y=%d\n",delta_x,delta_y); + + if ( (delta_x + delta_y) >= TPC_DELTA_DATA) + { + TP_PRINT ("func[%s]: fetch data failed !delta_x = %d delta_y = %d\n",__FUNCTION__,delta_x, delta_y); + result = SCI_FALSE; + } + } + + pre_data.dwValue = cur_data.dwValue; + + } + + /* Get the last data */ + tp_data->dwValue = cur_data.dwValue; + + return result; + +} + +static irqreturn_t tp_irq(int irq, void *dev_id) +{ + struct sprd_tp *tp=(struct sprd_tp *)dev_id; + uint32_t int_status; + int32_t xd,yd; + int32_t xl,yl; + + TP_PRINT ("TP: enter tp_irq!\n"); + + int_status = sci_adi_read (TPC_INT_STS); + + /* Pen Down interrtup */ + if (int_status & TPC_DOWN_IRQ_MSK_BIT) + { + TP_PRINT("DOWN\n"); + tp->is_first_down = 1; + + /* Clear down interrupt*/ + CLEAR_TPC_INT (TPC_DOWN_IRQ_MSK_BIT); + /* Run TPC */ + tp_run(); + + /* enable done interrupt */ + sci_adi_set (TPC_INT_EN, TPC_DONE_IRQ_MSK_BIT); + + } + /* Pen Up interrupt */ + else if(int_status & TPC_UP_IRQ_MSK_BIT) + { + TP_PRINT("UP\n"); + + /* disable interrupt */ + sci_adi_clr (TPC_INT_EN, TPC_DONE_IRQ_MSK_BIT); + /* Clear up interrupt*/ + CLEAR_TPC_INT ( (TPC_UP_IRQ_MSK_BIT|TPC_DONE_IRQ_MSK_BIT)); + /* Stop TPC */ + tp_stop(); + + input_report_key(tp->input, BTN_TOUCH, 0); + input_report_abs(tp->input, ABS_PRESSURE, 0); + input_sync(tp->input); + } + /* Sample Done interrupt */ + else if(int_status & TPC_DONE_IRQ_MSK_BIT) + { + TP_PRINT("DONE\n"); + /* + *trace_TP_PRINT("DONE\n"); + *Clear done interrupt + */ + CLEAR_TPC_INT (TPC_DONE_IRQ_MSK_BIT); + + /* Get data from TP buffer */ + if (tp_fetch_data(&(tp->tp_data))) { + /* TP_PRINT("fetch data finish\n"); */ + /* xd=765-tp->tp_data.data.x; */ + /* yd=816-tp->tp_data.data.y; */ + if (cal_mode_en == 0) { + #if 0 + xd=X_MAX-tp->tp_data.data.x; + yd=Y_MAX-tp->tp_data.data.y; + if(0 == a+b+c+d+e+f+g){ + input_report_abs(tp->input, ABS_X, xd); + input_report_abs(tp->input, ABS_Y, yd); + TP_PRINT("cal params all zero.\n"); + }else{ + xl=(a*xd+b*yd+c)/g; + yl=(d*xd+e*yd+f)/g; + xl=(xl+20)*3; + yl=(yl+15)*2; + + } + #endif + xl = tp->tp_data.data.x; + yl = tp->tp_data.data.y; + + input_report_abs(tp->input, ABS_X, xl); + input_report_abs(tp->input, ABS_Y, yl); + + } + else { + /* calibration enable, 1: sampling mode + 2: verification mode. */ + cal_data.data.x = tp->tp_data.data.x; + cal_data.data.y = tp->tp_data.data.y; + xd = tp_fix_cx;/* tp->tp_data.data.x; */ + yd = tp_fix_cy;/* tp->tp_data.data.y; */ + input_report_abs(tp->input, ABS_X, xd); + input_report_abs(tp->input, ABS_Y, yd); + + /* TP_PRINT("TP cal mode: x = %d, y = %d\n", xd, yd); */ + } + + /* TP_PRINT("xd=%d,yd=%d\n",xd,yd); */ + TP_PRINT("xl=%d,yl=%d\n",xl,yl); + input_report_abs(tp->input, ABS_PRESSURE,1); + input_report_key(tp->input, BTN_TOUCH, 1); + input_sync(tp->input); + /* TP_PRINT("report finish\n"); */ + + } + else{ + TP_PRINT("func[%s]: done interrupt rise,but can not fetch data!\n",__FUNCTION__); + /* sci_adi_clr (TPC_INT_EN, TPC_DONE_IRQ_MSK_BIT); */ + } + /* sci_adi_clr (TPC_INT_EN, TPC_DONE_IRQ_MSK_BIT); */ + } + /* Error occured */ + else{ + TP_PRINT("func[%s]: uncundefined irq\n",__FUNCTION__); + } + return IRQ_HANDLED; +} + + +static ssize_t cal_mode_sysfs_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + char *endp,*startp; + uint8_t cal_en = 0; + + startp = endp = (char*)buf; + + cal_en = simple_strtol(startp, &endp, 10); + if (cal_en > 2) return size; + + if (cal_en == 1) { + sci_adi_clr (TPC_CALC_CTRL, BIT(0)); /* calibration mode */ + } + else { + sci_adi_set (TPC_CALC_CTRL, BIT(0)); /* normal mode */ + } + + cal_mode_en = cal_en; + + return size; +} + +static ssize_t cal_mode_sysfs_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int len; + + len = sprintf(buf, "%d\n", cal_mode_en); + + return len; +} + +static DEVICE_ATTR(cal_mode, 0666, cal_mode_sysfs_show, cal_mode_sysfs_store); + + +static ssize_t cal_data_sysfs_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int len; + + if (cal_mode_en == 0) + len = sprintf(buf, "0 0 \n"); + else + len = sprintf(buf, "%d %d \n", cal_data.data.x, cal_data.data.y); + + return len; +} + + +static DEVICE_ATTR(cal_data, 0444, cal_data_sysfs_show, NULL); + + +static ssize_t cal_coef_sysfs_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int len; + len = sprintf(buf, "%#x %#x %#x %#x\n", + cal_coef.x_coef_a, + cal_coef.x_coef_b, + cal_coef.y_coef_a, + cal_coef.y_coef_b); + + return len; +} + +static ssize_t cal_coef_sysfs_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + long para[4]; + int num; + char *endp,*startp; + + startp = endp = (char*)buf; + + num=0; + while(*startp && num < 4){ + + para[num++] =simple_strtol(startp, &endp, 16); + if(endp){ + endp++; + startp=endp; + } + } + + sci_adi_raw_write(TPC_CALC_X_COEF_A, para[0]); + sci_adi_raw_write(TPC_CALC_X_COEF_B, para[1]); + sci_adi_raw_write(TPC_CALC_Y_COEF_A, para[2]); + sci_adi_raw_write(TPC_CALC_Y_COEF_B, para[3]); + + cal_coef.x_coef_a = para[0]; + cal_coef.x_coef_b = para[1]; + cal_coef.y_coef_a = para[2]; + cal_coef.y_coef_b = para[3]; + + return size; +} + +static DEVICE_ATTR(cal_coef, 0666, cal_coef_sysfs_show, cal_coef_sysfs_store); + + +/* + * The functions for inserting/removing us as a module. + */ +static int sprd_tp_probe(struct platform_device *pdev) +{ + struct sprd_tp *tp; + struct input_dev *input_dev; + int ret; + + TP_PRINT("func[%s]: touch panel device will be probed\n", __func__); + tp = kzalloc(sizeof(struct sprd_tp), GFP_KERNEL); + if (!tp){ + TP_PRINT("func[%s]:kzalloc failed!\n",__FUNCTION__); + return -ENOMEM; + } + + tp->irq = IRQ_ANA_TPC_INT; + + TP_PRINT("before enter input_allocate_device\n"); + input_dev = input_allocate_device(); + if (!input_dev) { + TP_PRINT("alloc input device failed \n"); + ret = -ENOMEM; + goto err_alloc; + } + sprd_tp_data = tp; + tp->input=input_dev; + tp->input->name = "sprd_touch_screen"; + tp->input->phys = "TP"; + tp->input->id.bustype = BUS_HOST; + tp->input->id.vendor = 0x8800; + tp->input->id.product = 0xCAFE; + tp->input->id.version = 0x0001; + tp->input->dev.parent = &pdev->dev; + + tp->input->evbit[0] = tp->input->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + tp->input->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(tp->input, ABS_X, X_MIN, TP_LCD_WIDTH, 0, 0); + input_set_abs_params(tp->input, ABS_Y, Y_MIN, TP_LCD_HEIGHT, 0, 0); + input_set_abs_params(tp->input, ABS_PRESSURE, 0, 1, 0, 0); + /*init adc*/ + ADC_Init(); + /*init tpc*/ + tp_init(); + + TP_PRINT("before enter request_irq\n"); + ret = request_irq(tp->irq,tp_irq, IRQF_DISABLED, "touch_screen", tp); + if (ret != 0) { + TP_PRINT("func[%s]: Could not allocate tp IRQ!\n",__FUNCTION__); + ret = -EIO; + goto err_irq; + } + + TP_PRINT("before enter input_register_device\n"); + /* All went ok, so register to the input system */ + ret = input_register_device(tp->input); + if(ret) { + TP_PRINT("func[%s]: Could not register input device(touchscreen)!\n",__FUNCTION__); + ret = -EIO; + goto err_reg; + } + platform_set_drvdata(pdev, tp); +#if 0 + if(tp_create_proc()) + TP_PRINT("create touch panel proc file failed!\n"); + + if(device_create_file(&tp->input->dev, &dev_attr_tp)) { + TP_PRINT("create touch panel sysfs file tp failed!\n"); + } +#endif + if(device_create_file(&tp->input->dev, &dev_attr_cal_mode)) { + TP_PRINT("create touch panel sysfs file cal_mode failed!\n"); + } + if(device_create_file(&tp->input->dev, &dev_attr_cal_data)) { + TP_PRINT("create touch panel sysfs file cal_data failed!\n"); + } + + if(device_create_file(&tp->input->dev, &dev_attr_cal_coef)) { + TP_PRINT("create touch panel sysfs file cal_coef failed!\n"); + } + + sci_adi_set(TPC_INT_EN,(TPC_UP_IRQ_MSK_BIT |TPC_DOWN_IRQ_MSK_BIT)); + + + return 0; + +err_reg: + input_free_device(tp->input); +err_irq: + free_irq(tp->irq, tp); +err_alloc: + kfree(tp); + + return ret; +} + +static int sprd_tp_remove(struct platform_device *pdev) +{ + struct sprd_tp *tp = platform_get_drvdata(pdev); + + platform_set_drvdata(pdev, NULL); + + input_unregister_device(tp->input); + + free_irq(tp->irq, tp); + + kfree(tp); +#if 0 + tp_remove_proc(); + device_remove_file(&tp->input->dev, &dev_attr_tp); +#endif + device_remove_file(&tp->input->dev, &dev_attr_cal_mode); + device_remove_file(&tp->input->dev, &dev_attr_cal_data); + device_remove_file(&tp->input->dev, &dev_attr_cal_coef); + + return 0; +} + + +#ifdef CONFIG_PM +static int sprd_tp_suspend(struct platform_device *pdev, pm_message_t mesg) +{ + TP_PRINT("func[%s]: touch panel will be disabled\n", __func__); + + /* + * Disable tp interrupt(up, down and done) and clear these interrupt bits, + * Then stop tp module and close ADC(tp_stop()) + */ + sci_adi_clr(TPC_INT_EN, (TPC_UP_IRQ_MSK_BIT|TPC_DOWN_IRQ_MSK_BIT|TPC_DONE_IRQ_MSK_BIT)); + CLEAR_TPC_INT(TPC_UP_IRQ_MSK_BIT|TPC_DOWN_IRQ_MSK_BIT|TPC_DONE_IRQ_MSK_BIT); + + tp_stop(); + + return 0; +} + +static int sprd_tp_resume(struct platform_device *pdev) +{ + TP_PRINT("func[%s]: touch panel will be enabled\n", __func__); + + /* Enable tp interrupt(up and down) */ + sci_adi_set(TPC_INT_EN,(TPC_UP_IRQ_MSK_BIT |TPC_DOWN_IRQ_MSK_BIT)); + + return 0; +} +#else +#define sprd_tp_suspend NULL +#define sprd_tp_resume NULL +#endif + +static struct platform_driver sprd_tp_driver = { + .probe = sprd_tp_probe, + .remove = sprd_tp_remove, + .suspend = sprd_tp_suspend, + .resume = sprd_tp_resume, + .driver = { + .owner = THIS_MODULE, + .name = "sprd-tp", + }, +}; + +static int __init tp_sprd_init(void) +{ + TP_PRINT("TP:SC8800G Touch Panel driver $Revision:1.0 $\n"); + + return platform_driver_register(&sprd_tp_driver); +} + +static void __exit tp_sprd_exit(void) +{ + TP_PRINT("TP:SC8800G Touch Panel remove!\n"); + platform_driver_unregister(&sprd_tp_driver); +} + +module_init(tp_sprd_init); +module_exit(tp_sprd_exit); + +MODULE_DESCRIPTION("SC8800 Touch Panel driver"); +MODULE_AUTHOR("Ke Wang, "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/tps6507x-ts.c b/drivers/input/touchscreen/tps6507x-ts.c new file mode 100644 index 00000000..820a066c --- /dev/null +++ b/drivers/input/touchscreen/tps6507x-ts.c @@ -0,0 +1,377 @@ +/* + * Touchscreen driver for the tps6507x chip. + * + * Copyright (c) 2009 RidgeRun (todd.fischer@ridgerun.com) + * + * Credits: + * + * Using code from tsc2007, MtekVision Co., Ltd. + * + * For licencing details see kernel-base/COPYING + * + * TPS65070, TPS65073, TPS650731, and TPS650732 support + * 10 bit touch screen interface. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define TSC_DEFAULT_POLL_PERIOD 30 /* ms */ +#define TPS_DEFAULT_MIN_PRESSURE 0x30 +#define MAX_10BIT ((1 << 10) - 1) + +#define TPS6507X_ADCONFIG_CONVERT_TS (TPS6507X_ADCONFIG_AD_ENABLE | \ + TPS6507X_ADCONFIG_START_CONVERSION | \ + TPS6507X_ADCONFIG_INPUT_REAL_TSC) +#define TPS6507X_ADCONFIG_POWER_DOWN_TS (TPS6507X_ADCONFIG_INPUT_REAL_TSC) + +struct ts_event { + u16 x; + u16 y; + u16 pressure; +}; + +struct tps6507x_ts { + struct input_dev *input_dev; + struct device *dev; + char phys[32]; + struct delayed_work work; + unsigned polling; /* polling is active */ + struct ts_event tc; + struct tps6507x_dev *mfd; + u16 model; + unsigned pendown; + int irq; + void (*clear_penirq)(void); + unsigned long poll_period; /* ms */ + u16 min_pressure; + int vref; /* non-zero to leave vref on */ +}; + +static int tps6507x_read_u8(struct tps6507x_ts *tsc, u8 reg, u8 *data) +{ + int err; + + err = tsc->mfd->read_dev(tsc->mfd, reg, 1, data); + + if (err) + return err; + + return 0; +} + +static int tps6507x_write_u8(struct tps6507x_ts *tsc, u8 reg, u8 data) +{ + return tsc->mfd->write_dev(tsc->mfd, reg, 1, &data); +} + +static s32 tps6507x_adc_conversion(struct tps6507x_ts *tsc, + u8 tsc_mode, u16 *value) +{ + s32 ret; + u8 adc_status; + u8 result; + + /* Route input signal to A/D converter */ + + ret = tps6507x_write_u8(tsc, TPS6507X_REG_TSCMODE, tsc_mode); + if (ret) { + dev_err(tsc->dev, "TSC mode read failed\n"); + goto err; + } + + /* Start A/D conversion */ + + ret = tps6507x_write_u8(tsc, TPS6507X_REG_ADCONFIG, + TPS6507X_ADCONFIG_CONVERT_TS); + if (ret) { + dev_err(tsc->dev, "ADC config write failed\n"); + return ret; + } + + do { + ret = tps6507x_read_u8(tsc, TPS6507X_REG_ADCONFIG, + &adc_status); + if (ret) { + dev_err(tsc->dev, "ADC config read failed\n"); + goto err; + } + } while (adc_status & TPS6507X_ADCONFIG_START_CONVERSION); + + ret = tps6507x_read_u8(tsc, TPS6507X_REG_ADRESULT_2, &result); + if (ret) { + dev_err(tsc->dev, "ADC result 2 read failed\n"); + goto err; + } + + *value = (result & TPS6507X_REG_ADRESULT_2_MASK) << 8; + + ret = tps6507x_read_u8(tsc, TPS6507X_REG_ADRESULT_1, &result); + if (ret) { + dev_err(tsc->dev, "ADC result 1 read failed\n"); + goto err; + } + + *value |= result; + + dev_dbg(tsc->dev, "TSC channel %d = 0x%X\n", tsc_mode, *value); + +err: + return ret; +} + +/* Need to call tps6507x_adc_standby() after using A/D converter for the + * touch screen interrupt to work properly. + */ + +static s32 tps6507x_adc_standby(struct tps6507x_ts *tsc) +{ + s32 ret; + s32 loops = 0; + u8 val; + + ret = tps6507x_write_u8(tsc, TPS6507X_REG_ADCONFIG, + TPS6507X_ADCONFIG_INPUT_TSC); + if (ret) + return ret; + + ret = tps6507x_write_u8(tsc, TPS6507X_REG_TSCMODE, + TPS6507X_TSCMODE_STANDBY); + if (ret) + return ret; + + ret = tps6507x_read_u8(tsc, TPS6507X_REG_INT, &val); + if (ret) + return ret; + + while (val & TPS6507X_REG_TSC_INT) { + mdelay(10); + ret = tps6507x_read_u8(tsc, TPS6507X_REG_INT, &val); + if (ret) + return ret; + loops++; + } + + return ret; +} + +static void tps6507x_ts_handler(struct work_struct *work) +{ + struct tps6507x_ts *tsc = container_of(work, + struct tps6507x_ts, work.work); + struct input_dev *input_dev = tsc->input_dev; + int pendown; + int schd; + int poll = 0; + s32 ret; + + ret = tps6507x_adc_conversion(tsc, TPS6507X_TSCMODE_PRESSURE, + &tsc->tc.pressure); + if (ret) + goto done; + + pendown = tsc->tc.pressure > tsc->min_pressure; + + if (unlikely(!pendown && tsc->pendown)) { + dev_dbg(tsc->dev, "UP\n"); + input_report_key(input_dev, BTN_TOUCH, 0); + input_report_abs(input_dev, ABS_PRESSURE, 0); + input_sync(input_dev); + tsc->pendown = 0; + } + + if (pendown) { + + if (!tsc->pendown) { + dev_dbg(tsc->dev, "DOWN\n"); + input_report_key(input_dev, BTN_TOUCH, 1); + } else + dev_dbg(tsc->dev, "still down\n"); + + ret = tps6507x_adc_conversion(tsc, TPS6507X_TSCMODE_X_POSITION, + &tsc->tc.x); + if (ret) + goto done; + + ret = tps6507x_adc_conversion(tsc, TPS6507X_TSCMODE_Y_POSITION, + &tsc->tc.y); + if (ret) + goto done; + + input_report_abs(input_dev, ABS_X, tsc->tc.x); + input_report_abs(input_dev, ABS_Y, tsc->tc.y); + input_report_abs(input_dev, ABS_PRESSURE, tsc->tc.pressure); + input_sync(input_dev); + tsc->pendown = 1; + poll = 1; + } + +done: + /* always poll if not using interrupts */ + poll = 1; + + if (poll) { + schd = schedule_delayed_work(&tsc->work, + msecs_to_jiffies(tsc->poll_period)); + if (schd) + tsc->polling = 1; + else { + tsc->polling = 0; + dev_err(tsc->dev, "re-schedule failed"); + } + } else + tsc->polling = 0; + + ret = tps6507x_adc_standby(tsc); +} + +static int tps6507x_ts_probe(struct platform_device *pdev) +{ + int error; + struct tps6507x_ts *tsc; + struct tps6507x_dev *tps6507x_dev = dev_get_drvdata(pdev->dev.parent); + struct touchscreen_init_data *init_data; + struct input_dev *input_dev; + struct tps6507x_board *tps_board; + int schd; + + /** + * tps_board points to pmic related constants + * coming from the board-evm file. + */ + + tps_board = (struct tps6507x_board *)tps6507x_dev->dev->platform_data; + + if (!tps_board) { + dev_err(tps6507x_dev->dev, + "Could not find tps6507x platform data\n"); + return -EIO; + } + + /** + * init_data points to array of regulator_init structures + * coming from the board-evm file. + */ + + init_data = tps_board->tps6507x_ts_init_data; + + tsc = kzalloc(sizeof(struct tps6507x_ts), GFP_KERNEL); + if (!tsc) { + dev_err(tps6507x_dev->dev, "failed to allocate driver data\n"); + error = -ENOMEM; + goto err0; + } + + tps6507x_dev->ts = tsc; + tsc->mfd = tps6507x_dev; + tsc->dev = tps6507x_dev->dev; + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(tsc->dev, "Failed to allocate input device.\n"); + error = -ENOMEM; + goto err1; + } + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, 0, MAX_10BIT, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, MAX_10BIT, 0, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_10BIT, 0, 0); + + input_dev->name = "TPS6507x Touchscreen"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = tsc->dev; + + snprintf(tsc->phys, sizeof(tsc->phys), + "%s/input0", dev_name(tsc->dev)); + input_dev->phys = tsc->phys; + + dev_dbg(tsc->dev, "device: %s\n", input_dev->phys); + + input_set_drvdata(input_dev, tsc); + + tsc->input_dev = input_dev; + + INIT_DELAYED_WORK(&tsc->work, tps6507x_ts_handler); + + if (init_data) { + tsc->poll_period = init_data->poll_period; + tsc->vref = init_data->vref; + tsc->min_pressure = init_data->min_pressure; + input_dev->id.vendor = init_data->vendor; + input_dev->id.product = init_data->product; + input_dev->id.version = init_data->version; + } else { + tsc->poll_period = TSC_DEFAULT_POLL_PERIOD; + tsc->min_pressure = TPS_DEFAULT_MIN_PRESSURE; + } + + error = tps6507x_adc_standby(tsc); + if (error) + goto err2; + + error = input_register_device(input_dev); + if (error) + goto err2; + + schd = schedule_delayed_work(&tsc->work, + msecs_to_jiffies(tsc->poll_period)); + + if (schd) + tsc->polling = 1; + else { + tsc->polling = 0; + dev_err(tsc->dev, "schedule failed"); + goto err2; + } + platform_set_drvdata(pdev, tps6507x_dev); + + return 0; + +err2: + cancel_delayed_work_sync(&tsc->work); + input_free_device(input_dev); +err1: + kfree(tsc); + tps6507x_dev->ts = NULL; +err0: + return error; +} + +static int tps6507x_ts_remove(struct platform_device *pdev) +{ + struct tps6507x_dev *tps6507x_dev = platform_get_drvdata(pdev); + struct tps6507x_ts *tsc = tps6507x_dev->ts; + struct input_dev *input_dev = tsc->input_dev; + + cancel_delayed_work_sync(&tsc->work); + + input_unregister_device(input_dev); + + tps6507x_dev->ts = NULL; + kfree(tsc); + + return 0; +} + +static struct platform_driver tps6507x_ts_driver = { + .driver = { + .name = "tps6507x-ts", + .owner = THIS_MODULE, + }, + .probe = tps6507x_ts_probe, + .remove = tps6507x_ts_remove, +}; +module_platform_driver(tps6507x_ts_driver); + +MODULE_AUTHOR("Todd Fischer "); +MODULE_DESCRIPTION("TPS6507x - TouchScreen driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:tps6507x-ts"); diff --git a/drivers/input/touchscreen/tsc2005.c b/drivers/input/touchscreen/tsc2005.c new file mode 100644 index 00000000..7213e8b0 --- /dev/null +++ b/drivers/input/touchscreen/tsc2005.c @@ -0,0 +1,756 @@ +/* + * TSC2005 touchscreen driver + * + * Copyright (C) 2006-2010 Nokia Corporation + * + * Author: Lauri Leukkunen + * based on TSC2301 driver by Klaus K. Pedersen + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * The touchscreen interface operates as follows: + * + * 1) Pen is pressed against the touchscreen. + * 2) TSC2005 performs AD conversion. + * 3) After the conversion is done TSC2005 drives DAV line down. + * 4) GPIO IRQ is received and tsc2005_irq_thread() is scheduled. + * 5) tsc2005_irq_thread() queues up an spi transfer to fetch the x, y, z1, z2 + * values. + * 6) tsc2005_irq_thread() reports coordinates to input layer and sets up + * tsc2005_penup_timer() to be called after TSC2005_PENUP_TIME_MS (40ms). + * 7) When the penup timer expires, there have not been touch or DAV interrupts + * during the last 40ms which means the pen has been lifted. + * + * ESD recovery via a hardware reset is done if the TSC2005 doesn't respond + * after a configurable period (in ms) of activity. If esd_timeout is 0, the + * watchdog is disabled. + */ + +/* control byte 1 */ +#define TSC2005_CMD 0x80 +#define TSC2005_CMD_NORMAL 0x00 +#define TSC2005_CMD_STOP 0x01 +#define TSC2005_CMD_12BIT 0x04 + +/* control byte 0 */ +#define TSC2005_REG_READ 0x0001 +#define TSC2005_REG_PND0 0x0002 +#define TSC2005_REG_X 0x0000 +#define TSC2005_REG_Y 0x0008 +#define TSC2005_REG_Z1 0x0010 +#define TSC2005_REG_Z2 0x0018 +#define TSC2005_REG_TEMP_HIGH 0x0050 +#define TSC2005_REG_CFR0 0x0060 +#define TSC2005_REG_CFR1 0x0068 +#define TSC2005_REG_CFR2 0x0070 + +/* configuration register 0 */ +#define TSC2005_CFR0_PRECHARGE_276US 0x0040 +#define TSC2005_CFR0_STABTIME_1MS 0x0300 +#define TSC2005_CFR0_CLOCK_1MHZ 0x1000 +#define TSC2005_CFR0_RESOLUTION12 0x2000 +#define TSC2005_CFR0_PENMODE 0x8000 +#define TSC2005_CFR0_INITVALUE (TSC2005_CFR0_STABTIME_1MS | \ + TSC2005_CFR0_CLOCK_1MHZ | \ + TSC2005_CFR0_RESOLUTION12 | \ + TSC2005_CFR0_PRECHARGE_276US | \ + TSC2005_CFR0_PENMODE) + +/* bits common to both read and write of configuration register 0 */ +#define TSC2005_CFR0_RW_MASK 0x3fff + +/* configuration register 1 */ +#define TSC2005_CFR1_BATCHDELAY_4MS 0x0003 +#define TSC2005_CFR1_INITVALUE TSC2005_CFR1_BATCHDELAY_4MS + +/* configuration register 2 */ +#define TSC2005_CFR2_MAVE_Z 0x0004 +#define TSC2005_CFR2_MAVE_Y 0x0008 +#define TSC2005_CFR2_MAVE_X 0x0010 +#define TSC2005_CFR2_AVG_7 0x0800 +#define TSC2005_CFR2_MEDIUM_15 0x3000 +#define TSC2005_CFR2_INITVALUE (TSC2005_CFR2_MAVE_X | \ + TSC2005_CFR2_MAVE_Y | \ + TSC2005_CFR2_MAVE_Z | \ + TSC2005_CFR2_MEDIUM_15 | \ + TSC2005_CFR2_AVG_7) + +#define MAX_12BIT 0xfff +#define TSC2005_SPI_MAX_SPEED_HZ 10000000 +#define TSC2005_PENUP_TIME_MS 40 + +struct tsc2005_spi_rd { + struct spi_transfer spi_xfer; + u32 spi_tx; + u32 spi_rx; +}; + +struct tsc2005 { + struct spi_device *spi; + + struct spi_message spi_read_msg; + struct tsc2005_spi_rd spi_x; + struct tsc2005_spi_rd spi_y; + struct tsc2005_spi_rd spi_z1; + struct tsc2005_spi_rd spi_z2; + + struct input_dev *idev; + char phys[32]; + + struct mutex mutex; + + /* raw copy of previous x,y,z */ + int in_x; + int in_y; + int in_z1; + int in_z2; + + spinlock_t lock; + struct timer_list penup_timer; + + unsigned int esd_timeout; + struct delayed_work esd_work; + unsigned long last_valid_interrupt; + + unsigned int x_plate_ohm; + + bool opened; + bool suspended; + + bool pen_down; + + void (*set_reset)(bool enable); +}; + +static int tsc2005_cmd(struct tsc2005 *ts, u8 cmd) +{ + u8 tx = TSC2005_CMD | TSC2005_CMD_12BIT | cmd; + struct spi_transfer xfer = { + .tx_buf = &tx, + .len = 1, + .bits_per_word = 8, + }; + struct spi_message msg; + int error; + + spi_message_init(&msg); + spi_message_add_tail(&xfer, &msg); + + error = spi_sync(ts->spi, &msg); + if (error) { + dev_err(&ts->spi->dev, "%s: failed, command: %x, error: %d\n", + __func__, cmd, error); + return error; + } + + return 0; +} + +static int tsc2005_write(struct tsc2005 *ts, u8 reg, u16 value) +{ + u32 tx = ((reg | TSC2005_REG_PND0) << 16) | value; + struct spi_transfer xfer = { + .tx_buf = &tx, + .len = 4, + .bits_per_word = 24, + }; + struct spi_message msg; + int error; + + spi_message_init(&msg); + spi_message_add_tail(&xfer, &msg); + + error = spi_sync(ts->spi, &msg); + if (error) { + dev_err(&ts->spi->dev, + "%s: failed, register: %x, value: %x, error: %d\n", + __func__, reg, value, error); + return error; + } + + return 0; +} + +static void tsc2005_setup_read(struct tsc2005_spi_rd *rd, u8 reg, bool last) +{ + memset(rd, 0, sizeof(*rd)); + + rd->spi_tx = (reg | TSC2005_REG_READ) << 16; + rd->spi_xfer.tx_buf = &rd->spi_tx; + rd->spi_xfer.rx_buf = &rd->spi_rx; + rd->spi_xfer.len = 4; + rd->spi_xfer.bits_per_word = 24; + rd->spi_xfer.cs_change = !last; +} + +static int tsc2005_read(struct tsc2005 *ts, u8 reg, u16 *value) +{ + struct tsc2005_spi_rd spi_rd; + struct spi_message msg; + int error; + + tsc2005_setup_read(&spi_rd, reg, true); + + spi_message_init(&msg); + spi_message_add_tail(&spi_rd.spi_xfer, &msg); + + error = spi_sync(ts->spi, &msg); + if (error) + return error; + + *value = spi_rd.spi_rx; + return 0; +} + +static void tsc2005_update_pen_state(struct tsc2005 *ts, + int x, int y, int pressure) +{ + if (pressure) { + input_report_abs(ts->idev, ABS_X, x); + input_report_abs(ts->idev, ABS_Y, y); + input_report_abs(ts->idev, ABS_PRESSURE, pressure); + if (!ts->pen_down) { + input_report_key(ts->idev, BTN_TOUCH, !!pressure); + ts->pen_down = true; + } + } else { + input_report_abs(ts->idev, ABS_PRESSURE, 0); + if (ts->pen_down) { + input_report_key(ts->idev, BTN_TOUCH, 0); + ts->pen_down = false; + } + } + input_sync(ts->idev); + dev_dbg(&ts->spi->dev, "point(%4d,%4d), pressure (%4d)\n", x, y, + pressure); +} + +static irqreturn_t tsc2005_irq_thread(int irq, void *_ts) +{ + struct tsc2005 *ts = _ts; + unsigned long flags; + unsigned int pressure; + u32 x, y; + u32 z1, z2; + int error; + + /* read the coordinates */ + error = spi_sync(ts->spi, &ts->spi_read_msg); + if (unlikely(error)) + goto out; + + x = ts->spi_x.spi_rx; + y = ts->spi_y.spi_rx; + z1 = ts->spi_z1.spi_rx; + z2 = ts->spi_z2.spi_rx; + + /* validate position */ + if (unlikely(x > MAX_12BIT || y > MAX_12BIT)) + goto out; + + /* Skip reading if the pressure components are out of range */ + if (unlikely(z1 == 0 || z2 > MAX_12BIT || z1 >= z2)) + goto out; + + /* + * Skip point if this is a pen down with the exact same values as + * the value before pen-up - that implies SPI fed us stale data + */ + if (!ts->pen_down && + ts->in_x == x && ts->in_y == y && + ts->in_z1 == z1 && ts->in_z2 == z2) { + goto out; + } + + /* + * At this point we are happy we have a valid and useful reading. + * Remember it for later comparisons. We may now begin downsampling. + */ + ts->in_x = x; + ts->in_y = y; + ts->in_z1 = z1; + ts->in_z2 = z2; + + /* Compute touch pressure resistance using equation #1 */ + pressure = x * (z2 - z1) / z1; + pressure = pressure * ts->x_plate_ohm / 4096; + if (unlikely(pressure > MAX_12BIT)) + goto out; + + spin_lock_irqsave(&ts->lock, flags); + + tsc2005_update_pen_state(ts, x, y, pressure); + mod_timer(&ts->penup_timer, + jiffies + msecs_to_jiffies(TSC2005_PENUP_TIME_MS)); + + spin_unlock_irqrestore(&ts->lock, flags); + + ts->last_valid_interrupt = jiffies; +out: + return IRQ_HANDLED; +} + +static void tsc2005_penup_timer(unsigned long data) +{ + struct tsc2005 *ts = (struct tsc2005 *)data; + unsigned long flags; + + spin_lock_irqsave(&ts->lock, flags); + tsc2005_update_pen_state(ts, 0, 0, 0); + spin_unlock_irqrestore(&ts->lock, flags); +} + +static void tsc2005_start_scan(struct tsc2005 *ts) +{ + tsc2005_write(ts, TSC2005_REG_CFR0, TSC2005_CFR0_INITVALUE); + tsc2005_write(ts, TSC2005_REG_CFR1, TSC2005_CFR1_INITVALUE); + tsc2005_write(ts, TSC2005_REG_CFR2, TSC2005_CFR2_INITVALUE); + tsc2005_cmd(ts, TSC2005_CMD_NORMAL); +} + +static void tsc2005_stop_scan(struct tsc2005 *ts) +{ + tsc2005_cmd(ts, TSC2005_CMD_STOP); +} + +/* must be called with ts->mutex held */ +static void __tsc2005_disable(struct tsc2005 *ts) +{ + tsc2005_stop_scan(ts); + + disable_irq(ts->spi->irq); + del_timer_sync(&ts->penup_timer); + + cancel_delayed_work_sync(&ts->esd_work); + + enable_irq(ts->spi->irq); +} + +/* must be called with ts->mutex held */ +static void __tsc2005_enable(struct tsc2005 *ts) +{ + tsc2005_start_scan(ts); + + if (ts->esd_timeout && ts->set_reset) { + ts->last_valid_interrupt = jiffies; + schedule_delayed_work(&ts->esd_work, + round_jiffies_relative( + msecs_to_jiffies(ts->esd_timeout))); + } + +} + +static ssize_t tsc2005_selftest_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct spi_device *spi = to_spi_device(dev); + struct tsc2005 *ts = spi_get_drvdata(spi); + u16 temp_high; + u16 temp_high_orig; + u16 temp_high_test; + bool success = true; + int error; + + mutex_lock(&ts->mutex); + + /* + * Test TSC2005 communications via temp high register. + */ + __tsc2005_disable(ts); + + error = tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high_orig); + if (error) { + dev_warn(dev, "selftest failed: read error %d\n", error); + success = false; + goto out; + } + + temp_high_test = (temp_high_orig - 1) & MAX_12BIT; + + error = tsc2005_write(ts, TSC2005_REG_TEMP_HIGH, temp_high_test); + if (error) { + dev_warn(dev, "selftest failed: write error %d\n", error); + success = false; + goto out; + } + + error = tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); + if (error) { + dev_warn(dev, "selftest failed: read error %d after write\n", + error); + success = false; + goto out; + } + + if (temp_high != temp_high_test) { + dev_warn(dev, "selftest failed: %d != %d\n", + temp_high, temp_high_test); + success = false; + } + + /* hardware reset */ + ts->set_reset(false); + usleep_range(100, 500); /* only 10us required */ + ts->set_reset(true); + + if (!success) + goto out; + + /* test that the reset really happened */ + error = tsc2005_read(ts, TSC2005_REG_TEMP_HIGH, &temp_high); + if (error) { + dev_warn(dev, "selftest failed: read error %d after reset\n", + error); + success = false; + goto out; + } + + if (temp_high != temp_high_orig) { + dev_warn(dev, "selftest failed after reset: %d != %d\n", + temp_high, temp_high_orig); + success = false; + } + +out: + __tsc2005_enable(ts); + mutex_unlock(&ts->mutex); + + return sprintf(buf, "%d\n", success); +} + +static DEVICE_ATTR(selftest, S_IRUGO, tsc2005_selftest_show, NULL); + +static struct attribute *tsc2005_attrs[] = { + &dev_attr_selftest.attr, + NULL +}; + +static umode_t tsc2005_attr_is_visible(struct kobject *kobj, + struct attribute *attr, int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct spi_device *spi = to_spi_device(dev); + struct tsc2005 *ts = spi_get_drvdata(spi); + umode_t mode = attr->mode; + + if (attr == &dev_attr_selftest.attr) { + if (!ts->set_reset) + mode = 0; + } + + return mode; +} + +static const struct attribute_group tsc2005_attr_group = { + .is_visible = tsc2005_attr_is_visible, + .attrs = tsc2005_attrs, +}; + +static void tsc2005_esd_work(struct work_struct *work) +{ + struct tsc2005 *ts = container_of(work, struct tsc2005, esd_work.work); + int error; + u16 r; + + if (!mutex_trylock(&ts->mutex)) { + /* + * If the mutex is taken, it means that disable or enable is in + * progress. In that case just reschedule the work. If the work + * is not needed, it will be canceled by disable. + */ + goto reschedule; + } + + if (time_is_after_jiffies(ts->last_valid_interrupt + + msecs_to_jiffies(ts->esd_timeout))) + goto out; + + /* We should be able to read register without disabling interrupts. */ + error = tsc2005_read(ts, TSC2005_REG_CFR0, &r); + if (!error && + !((r ^ TSC2005_CFR0_INITVALUE) & TSC2005_CFR0_RW_MASK)) { + goto out; + } + + /* + * If we could not read our known value from configuration register 0 + * then we should reset the controller as if from power-up and start + * scanning again. + */ + dev_info(&ts->spi->dev, "TSC2005 not responding - resetting\n"); + + disable_irq(ts->spi->irq); + del_timer_sync(&ts->penup_timer); + + tsc2005_update_pen_state(ts, 0, 0, 0); + + ts->set_reset(false); + usleep_range(100, 500); /* only 10us required */ + ts->set_reset(true); + + enable_irq(ts->spi->irq); + tsc2005_start_scan(ts); + +out: + mutex_unlock(&ts->mutex); +reschedule: + /* re-arm the watchdog */ + schedule_delayed_work(&ts->esd_work, + round_jiffies_relative( + msecs_to_jiffies(ts->esd_timeout))); +} + +static int tsc2005_open(struct input_dev *input) +{ + struct tsc2005 *ts = input_get_drvdata(input); + + mutex_lock(&ts->mutex); + + if (!ts->suspended) + __tsc2005_enable(ts); + + ts->opened = true; + + mutex_unlock(&ts->mutex); + + return 0; +} + +static void tsc2005_close(struct input_dev *input) +{ + struct tsc2005 *ts = input_get_drvdata(input); + + mutex_lock(&ts->mutex); + + if (!ts->suspended) + __tsc2005_disable(ts); + + ts->opened = false; + + mutex_unlock(&ts->mutex); +} + +static void tsc2005_setup_spi_xfer(struct tsc2005 *ts) +{ + tsc2005_setup_read(&ts->spi_x, TSC2005_REG_X, false); + tsc2005_setup_read(&ts->spi_y, TSC2005_REG_Y, false); + tsc2005_setup_read(&ts->spi_z1, TSC2005_REG_Z1, false); + tsc2005_setup_read(&ts->spi_z2, TSC2005_REG_Z2, true); + + spi_message_init(&ts->spi_read_msg); + spi_message_add_tail(&ts->spi_x.spi_xfer, &ts->spi_read_msg); + spi_message_add_tail(&ts->spi_y.spi_xfer, &ts->spi_read_msg); + spi_message_add_tail(&ts->spi_z1.spi_xfer, &ts->spi_read_msg); + spi_message_add_tail(&ts->spi_z2.spi_xfer, &ts->spi_read_msg); +} + +static int tsc2005_probe(struct spi_device *spi) +{ + const struct tsc2005_platform_data *pdata = spi->dev.platform_data; + struct tsc2005 *ts; + struct input_dev *input_dev; + unsigned int max_x, max_y, max_p; + unsigned int fudge_x, fudge_y, fudge_p; + int error; + + if (!pdata) { + dev_dbg(&spi->dev, "no platform data\n"); + return -ENODEV; + } + + fudge_x = pdata->ts_x_fudge ? : 4; + fudge_y = pdata->ts_y_fudge ? : 8; + fudge_p = pdata->ts_pressure_fudge ? : 2; + max_x = pdata->ts_x_max ? : MAX_12BIT; + max_y = pdata->ts_y_max ? : MAX_12BIT; + max_p = pdata->ts_pressure_max ? : MAX_12BIT; + + if (spi->irq <= 0) { + dev_dbg(&spi->dev, "no irq\n"); + return -ENODEV; + } + + spi->mode = SPI_MODE_0; + spi->bits_per_word = 8; + if (!spi->max_speed_hz) + spi->max_speed_hz = TSC2005_SPI_MAX_SPEED_HZ; + + error = spi_setup(spi); + if (error) + return error; + + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + error = -ENOMEM; + goto err_free_mem; + } + + ts->spi = spi; + ts->idev = input_dev; + + ts->x_plate_ohm = pdata->ts_x_plate_ohm ? : 280; + ts->esd_timeout = pdata->esd_timeout_ms; + ts->set_reset = pdata->set_reset; + + mutex_init(&ts->mutex); + + spin_lock_init(&ts->lock); + setup_timer(&ts->penup_timer, tsc2005_penup_timer, (unsigned long)ts); + + INIT_DELAYED_WORK(&ts->esd_work, tsc2005_esd_work); + + tsc2005_setup_spi_xfer(ts); + + snprintf(ts->phys, sizeof(ts->phys), + "%s/input-ts", dev_name(&spi->dev)); + + input_dev->name = "TSC2005 touchscreen"; + input_dev->phys = ts->phys; + input_dev->id.bustype = BUS_SPI; + input_dev->dev.parent = &spi->dev; + input_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, 0, max_x, fudge_x, 0); + input_set_abs_params(input_dev, ABS_Y, 0, max_y, fudge_y, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, max_p, fudge_p, 0); + + input_dev->open = tsc2005_open; + input_dev->close = tsc2005_close; + + input_set_drvdata(input_dev, ts); + + /* Ensure the touchscreen is off */ + tsc2005_stop_scan(ts); + + error = request_threaded_irq(spi->irq, NULL, tsc2005_irq_thread, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "tsc2005", ts); + if (error) { + dev_err(&spi->dev, "Failed to request irq, err: %d\n", error); + goto err_free_mem; + } + + spi_set_drvdata(spi, ts); + error = sysfs_create_group(&spi->dev.kobj, &tsc2005_attr_group); + if (error) { + dev_err(&spi->dev, + "Failed to create sysfs attributes, err: %d\n", error); + goto err_clear_drvdata; + } + + error = input_register_device(ts->idev); + if (error) { + dev_err(&spi->dev, + "Failed to register input device, err: %d\n", error); + goto err_remove_sysfs; + } + + irq_set_irq_wake(spi->irq, 1); + return 0; + +err_remove_sysfs: + sysfs_remove_group(&spi->dev.kobj, &tsc2005_attr_group); +err_clear_drvdata: + spi_set_drvdata(spi, NULL); + free_irq(spi->irq, ts); +err_free_mem: + input_free_device(input_dev); + kfree(ts); + return error; +} + +static int tsc2005_remove(struct spi_device *spi) +{ + struct tsc2005 *ts = spi_get_drvdata(spi); + + sysfs_remove_group(&ts->spi->dev.kobj, &tsc2005_attr_group); + + free_irq(ts->spi->irq, ts); + input_unregister_device(ts->idev); + kfree(ts); + + spi_set_drvdata(spi, NULL); + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int tsc2005_suspend(struct device *dev) +{ + struct spi_device *spi = to_spi_device(dev); + struct tsc2005 *ts = spi_get_drvdata(spi); + + mutex_lock(&ts->mutex); + + if (!ts->suspended && ts->opened) + __tsc2005_disable(ts); + + ts->suspended = true; + + mutex_unlock(&ts->mutex); + + return 0; +} + +static int tsc2005_resume(struct device *dev) +{ + struct spi_device *spi = to_spi_device(dev); + struct tsc2005 *ts = spi_get_drvdata(spi); + + mutex_lock(&ts->mutex); + + if (ts->suspended && ts->opened) + __tsc2005_enable(ts); + + ts->suspended = false; + + mutex_unlock(&ts->mutex); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(tsc2005_pm_ops, tsc2005_suspend, tsc2005_resume); + +static struct spi_driver tsc2005_driver = { + .driver = { + .name = "tsc2005", + .owner = THIS_MODULE, + .pm = &tsc2005_pm_ops, + }, + .probe = tsc2005_probe, + .remove = tsc2005_remove, +}; + +module_spi_driver(tsc2005_driver); + +MODULE_AUTHOR("Lauri Leukkunen "); +MODULE_DESCRIPTION("TSC2005 Touchscreen Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:tsc2005"); diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c new file mode 100644 index 00000000..0b67ba47 --- /dev/null +++ b/drivers/input/touchscreen/tsc2007.c @@ -0,0 +1,406 @@ +/* + * drivers/input/touchscreen/tsc2007.c + * + * Copyright (c) 2008 MtekVision Co., Ltd. + * Kwangwoo Lee + * + * Using code from: + * - ads7846.c + * Copyright (c) 2005 David Brownell + * Copyright (c) 2006 Nokia Corporation + * - corgi_ts.c + * Copyright (C) 2004-2005 Richard Purdie + * - omap_ts.[hc], ads7846.h, ts_osk.c + * Copyright (C) 2002 MontaVista Software + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2005 Dirk Behme + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include + +#define TSC2007_MEASURE_TEMP0 (0x0 << 4) +#define TSC2007_MEASURE_AUX (0x2 << 4) +#define TSC2007_MEASURE_TEMP1 (0x4 << 4) +#define TSC2007_ACTIVATE_XN (0x8 << 4) +#define TSC2007_ACTIVATE_YN (0x9 << 4) +#define TSC2007_ACTIVATE_YP_XN (0xa << 4) +#define TSC2007_SETUP (0xb << 4) +#define TSC2007_MEASURE_X (0xc << 4) +#define TSC2007_MEASURE_Y (0xd << 4) +#define TSC2007_MEASURE_Z1 (0xe << 4) +#define TSC2007_MEASURE_Z2 (0xf << 4) + +#define TSC2007_POWER_OFF_IRQ_EN (0x0 << 2) +#define TSC2007_ADC_ON_IRQ_DIS0 (0x1 << 2) +#define TSC2007_ADC_OFF_IRQ_EN (0x2 << 2) +#define TSC2007_ADC_ON_IRQ_DIS1 (0x3 << 2) + +#define TSC2007_12BIT (0x0 << 1) +#define TSC2007_8BIT (0x1 << 1) + +#define MAX_12BIT ((1 << 12) - 1) + +#define ADC_ON_12BIT (TSC2007_12BIT | TSC2007_ADC_ON_IRQ_DIS0) + +#define READ_Y (ADC_ON_12BIT | TSC2007_MEASURE_Y) +#define READ_Z1 (ADC_ON_12BIT | TSC2007_MEASURE_Z1) +#define READ_Z2 (ADC_ON_12BIT | TSC2007_MEASURE_Z2) +#define READ_X (ADC_ON_12BIT | TSC2007_MEASURE_X) +#define PWRDOWN (TSC2007_12BIT | TSC2007_POWER_OFF_IRQ_EN) + +struct ts_event { + u16 x; + u16 y; + u16 z1, z2; +}; + +struct tsc2007 { + struct input_dev *input; + char phys[32]; + + struct i2c_client *client; + + u16 model; + u16 x_plate_ohms; + u16 max_rt; + unsigned long poll_delay; + unsigned long poll_period; + + int irq; + + wait_queue_head_t wait; + bool stopped; + + int (*get_pendown_state)(void); + void (*clear_penirq)(void); +}; + +static inline int tsc2007_xfer(struct tsc2007 *tsc, u8 cmd) +{ + s32 data; + u16 val; + + data = i2c_smbus_read_word_data(tsc->client, cmd); + if (data < 0) { + dev_err(&tsc->client->dev, "i2c io error: %d\n", data); + return data; + } + + /* The protocol and raw data format from i2c interface: + * S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P + * Where DataLow has [D11-D4], DataHigh has [D3-D0 << 4 | Dummy 4bit]. + */ + val = swab16(data) >> 4; + + dev_dbg(&tsc->client->dev, "data: 0x%x, val: 0x%x\n", data, val); + + return val; +} + +static void tsc2007_read_values(struct tsc2007 *tsc, struct ts_event *tc) +{ + /* y- still on; turn on only y+ (and ADC) */ + tc->y = tsc2007_xfer(tsc, READ_Y); + + /* turn y- off, x+ on, then leave in lowpower */ + tc->x = tsc2007_xfer(tsc, READ_X); + + /* turn y+ off, x- on; we'll use formula #1 */ + tc->z1 = tsc2007_xfer(tsc, READ_Z1); + tc->z2 = tsc2007_xfer(tsc, READ_Z2); + + /* Prepare for next touch reading - power down ADC, enable PENIRQ */ + tsc2007_xfer(tsc, PWRDOWN); +} + +static u32 tsc2007_calculate_pressure(struct tsc2007 *tsc, struct ts_event *tc) +{ + u32 rt = 0; + + /* range filtering */ + if (tc->x == MAX_12BIT) + tc->x = 0; + + if (likely(tc->x && tc->z1)) { + /* compute touch pressure resistance using equation #1 */ + rt = tc->z2 - tc->z1; + rt *= tc->x; + rt *= tsc->x_plate_ohms; + rt /= tc->z1; + rt = (rt + 2047) >> 12; + } + + return rt; +} + +static bool tsc2007_is_pen_down(struct tsc2007 *ts) +{ + /* + * NOTE: We can't rely on the pressure to determine the pen down + * state, even though this controller has a pressure sensor. + * The pressure value can fluctuate for quite a while after + * lifting the pen and in some cases may not even settle at the + * expected value. + * + * The only safe way to check for the pen up condition is in the + * work function by reading the pen signal state (it's a GPIO + * and IRQ). Unfortunately such callback is not always available, + * in that case we assume that the pen is down and expect caller + * to fall back on the pressure reading. + */ + + if (!ts->get_pendown_state) + return true; + + return ts->get_pendown_state(); +} + +static irqreturn_t tsc2007_soft_irq(int irq, void *handle) +{ + struct tsc2007 *ts = handle; + struct input_dev *input = ts->input; + struct ts_event tc; + u32 rt; + + while (!ts->stopped && tsc2007_is_pen_down(ts)) { + + /* pen is down, continue with the measurement */ + tsc2007_read_values(ts, &tc); + + rt = tsc2007_calculate_pressure(ts, &tc); + + if (rt == 0 && !ts->get_pendown_state) { + /* + * If pressure reported is 0 and we don't have + * callback to check pendown state, we have to + * assume that pen was lifted up. + */ + break; + } + + if (rt <= ts->max_rt) { + dev_dbg(&ts->client->dev, + "DOWN point(%4d,%4d), pressure (%4u)\n", + tc.x, tc.y, rt); + + input_report_key(input, BTN_TOUCH, 1); + input_report_abs(input, ABS_X, tc.x); + input_report_abs(input, ABS_Y, tc.y); + input_report_abs(input, ABS_PRESSURE, rt); + + input_sync(input); + + } else { + /* + * Sample found inconsistent by debouncing or pressure is + * beyond the maximum. Don't report it to user space, + * repeat at least once more the measurement. + */ + dev_dbg(&ts->client->dev, "ignored pressure %d\n", rt); + } + + wait_event_timeout(ts->wait, ts->stopped, + msecs_to_jiffies(ts->poll_period)); + } + + dev_dbg(&ts->client->dev, "UP\n"); + + input_report_key(input, BTN_TOUCH, 0); + input_report_abs(input, ABS_PRESSURE, 0); + input_sync(input); + + if (ts->clear_penirq) + ts->clear_penirq(); + + return IRQ_HANDLED; +} + +static irqreturn_t tsc2007_hard_irq(int irq, void *handle) +{ + struct tsc2007 *ts = handle; + + if (!ts->get_pendown_state || likely(ts->get_pendown_state())) + return IRQ_WAKE_THREAD; + + if (ts->clear_penirq) + ts->clear_penirq(); + + return IRQ_HANDLED; +} + +static void tsc2007_stop(struct tsc2007 *ts) +{ + ts->stopped = true; + mb(); + wake_up(&ts->wait); + + disable_irq(ts->irq); +} + +static int tsc2007_open(struct input_dev *input_dev) +{ + struct tsc2007 *ts = input_get_drvdata(input_dev); + int err; + + ts->stopped = false; + mb(); + + enable_irq(ts->irq); + + /* Prepare for touch readings - power down ADC and enable PENIRQ */ + err = tsc2007_xfer(ts, PWRDOWN); + if (err < 0) { + tsc2007_stop(ts); + return err; + } + + return 0; +} + +static void tsc2007_close(struct input_dev *input_dev) +{ + struct tsc2007 *ts = input_get_drvdata(input_dev); + + tsc2007_stop(ts); +} + +static int tsc2007_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct tsc2007 *ts; + struct tsc2007_platform_data *pdata = client->dev.platform_data; + struct input_dev *input_dev; + int err; + + if (!pdata) { + dev_err(&client->dev, "platform data is required!\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, + I2C_FUNC_SMBUS_READ_WORD_DATA)) + return -EIO; + + ts = kzalloc(sizeof(struct tsc2007), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ts || !input_dev) { + err = -ENOMEM; + goto err_free_mem; + } + + ts->client = client; + ts->irq = client->irq; + ts->input = input_dev; + init_waitqueue_head(&ts->wait); + + ts->model = pdata->model; + ts->x_plate_ohms = pdata->x_plate_ohms; + ts->max_rt = pdata->max_rt ? : MAX_12BIT; + ts->poll_delay = pdata->poll_delay ? : 1; + ts->poll_period = pdata->poll_period ? : 1; + ts->get_pendown_state = pdata->get_pendown_state; + ts->clear_penirq = pdata->clear_penirq; + + if (pdata->x_plate_ohms == 0) { + dev_err(&client->dev, "x_plate_ohms is not set up in platform data"); + err = -EINVAL; + goto err_free_mem; + } + + snprintf(ts->phys, sizeof(ts->phys), + "%s/input0", dev_name(&client->dev)); + + input_dev->name = "TSC2007 Touchscreen"; + input_dev->phys = ts->phys; + input_dev->id.bustype = BUS_I2C; + + input_dev->open = tsc2007_open; + input_dev->close = tsc2007_close; + + input_set_drvdata(input_dev, ts); + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, pdata->fuzzx, 0); + input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, pdata->fuzzy, 0); + input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT, + pdata->fuzzz, 0); + + if (pdata->init_platform_hw) + pdata->init_platform_hw(); + + err = request_threaded_irq(ts->irq, tsc2007_hard_irq, tsc2007_soft_irq, + IRQF_ONESHOT, client->dev.driver->name, ts); + if (err < 0) { + dev_err(&client->dev, "irq %d busy?\n", ts->irq); + goto err_free_mem; + } + + tsc2007_stop(ts); + + err = input_register_device(input_dev); + if (err) + goto err_free_irq; + + i2c_set_clientdata(client, ts); + + return 0; + + err_free_irq: + free_irq(ts->irq, ts); + if (pdata->exit_platform_hw) + pdata->exit_platform_hw(); + err_free_mem: + input_free_device(input_dev); + kfree(ts); + return err; +} + +static int tsc2007_remove(struct i2c_client *client) +{ + struct tsc2007 *ts = i2c_get_clientdata(client); + struct tsc2007_platform_data *pdata = client->dev.platform_data; + + free_irq(ts->irq, ts); + + if (pdata->exit_platform_hw) + pdata->exit_platform_hw(); + + input_unregister_device(ts->input); + kfree(ts); + + return 0; +} + +static const struct i2c_device_id tsc2007_idtable[] = { + { "tsc2007", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, tsc2007_idtable); + +static struct i2c_driver tsc2007_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "tsc2007" + }, + .id_table = tsc2007_idtable, + .probe = tsc2007_probe, + .remove = tsc2007_remove, +}; + +module_i2c_driver(tsc2007_driver); + +MODULE_AUTHOR("Kwangwoo Lee "); +MODULE_DESCRIPTION("TSC2007 TouchScreen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/tsc40.c b/drivers/input/touchscreen/tsc40.c new file mode 100644 index 00000000..eb96f168 --- /dev/null +++ b/drivers/input/touchscreen/tsc40.c @@ -0,0 +1,173 @@ +/* + * TSC-40 serial touchscreen driver. It should be compatible with + * TSC-10 and 25. + * + * Author: Sebastian Andrzej Siewior + * License: GPLv2 as published by the FSF. + */ + +#include +#include +#include +#include +#include +#include + +#define PACKET_LENGTH 5 +struct tsc_ser { + struct input_dev *dev; + struct serio *serio; + u32 idx; + unsigned char data[PACKET_LENGTH]; + char phys[32]; +}; + +static void tsc_process_data(struct tsc_ser *ptsc) +{ + struct input_dev *dev = ptsc->dev; + u8 *data = ptsc->data; + u32 x; + u32 y; + + x = ((data[1] & 0x03) << 8) | data[2]; + y = ((data[3] & 0x03) << 8) | data[4]; + + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + input_report_key(dev, BTN_TOUCH, 1); + + input_sync(dev); +} + +static irqreturn_t tsc_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct tsc_ser *ptsc = serio_get_drvdata(serio); + struct input_dev *dev = ptsc->dev; + + ptsc->data[ptsc->idx] = data; + switch (ptsc->idx++) { + case 0: + if (unlikely((data & 0x3e) != 0x10)) { + dev_dbg(&serio->dev, + "unsynchronized packet start (0x%02x)\n", data); + ptsc->idx = 0; + } else if (!(data & 0x01)) { + input_report_key(dev, BTN_TOUCH, 0); + input_sync(dev); + ptsc->idx = 0; + } + break; + + case 1: + case 3: + if (unlikely(data & 0xfc)) { + dev_dbg(&serio->dev, + "unsynchronized data 0x%02x at offset %d\n", + data, ptsc->idx - 1); + ptsc->idx = 0; + } + break; + + case 4: + tsc_process_data(ptsc); + ptsc->idx = 0; + break; + } + + return IRQ_HANDLED; +} + +static int tsc_connect(struct serio *serio, struct serio_driver *drv) +{ + struct tsc_ser *ptsc; + struct input_dev *input_dev; + int error; + + ptsc = kzalloc(sizeof(struct tsc_ser), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!ptsc || !input_dev) { + error = -ENOMEM; + goto fail1; + } + + ptsc->serio = serio; + ptsc->dev = input_dev; + snprintf(ptsc->phys, sizeof(ptsc->phys), "%s/input0", serio->phys); + + input_dev->name = "TSC-10/25/40 Serial TouchScreen"; + input_dev->phys = ptsc->phys; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = SERIO_TSC40; + input_dev->id.product = 40; + input_dev->id.version = 0x0001; + input_dev->dev.parent = &serio->dev; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + __set_bit(BTN_TOUCH, input_dev->keybit); + input_set_abs_params(ptsc->dev, ABS_X, 0, 0x3ff, 0, 0); + input_set_abs_params(ptsc->dev, ABS_Y, 0, 0x3ff, 0, 0); + + serio_set_drvdata(serio, ptsc); + + error = serio_open(serio, drv); + if (error) + goto fail2; + + error = input_register_device(ptsc->dev); + if (error) + goto fail3; + + return 0; + +fail3: + serio_close(serio); +fail2: + serio_set_drvdata(serio, NULL); +fail1: + input_free_device(input_dev); + kfree(ptsc); + return error; +} + +static void tsc_disconnect(struct serio *serio) +{ + struct tsc_ser *ptsc = serio_get_drvdata(serio); + + serio_close(serio); + + input_unregister_device(ptsc->dev); + kfree(ptsc); + + serio_set_drvdata(serio, NULL); +} + +static struct serio_device_id tsc_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_TSC40, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; +MODULE_DEVICE_TABLE(serio, tsc_serio_ids); + +#define DRIVER_DESC "TSC-10/25/40 serial touchscreen driver" + +static struct serio_driver tsc_drv = { + .driver = { + .name = "tsc40", + }, + .description = DRIVER_DESC, + .id_table = tsc_serio_ids, + .interrupt = tsc_interrupt, + .connect = tsc_connect, + .disconnect = tsc_disconnect, +}; + +module_serio_driver(tsc_drv); + +MODULE_AUTHOR("Sebastian Andrzej Siewior "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/ucb1400_ts.c b/drivers/input/touchscreen/ucb1400_ts.c new file mode 100644 index 00000000..1271f97b --- /dev/null +++ b/drivers/input/touchscreen/ucb1400_ts.c @@ -0,0 +1,467 @@ +/* + * Philips UCB1400 touchscreen driver + * + * Author: Nicolas Pitre + * Created: September 25, 2006 + * Copyright: MontaVista Software, Inc. + * + * Spliting done by: Marek Vasut + * If something doesn't work and it worked before spliting, e-mail me, + * dont bother Nicolas please ;-) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This code is heavily based on ucb1x00-*.c copyrighted by Russell King + * covering the UCB1100, UCB1200 and UCB1300.. Support for the UCB1400 has + * been made separate from ucb1x00-core/ucb1x00-ts on Russell's request. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define UCB1400_TS_POLL_PERIOD 10 /* ms */ + +static bool adcsync; +static int ts_delay = 55; /* us */ +static int ts_delay_pressure; /* us */ + +/* Switch to interrupt mode. */ +static void ucb1400_ts_mode_int(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | + UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | + UCB_TS_CR_MODE_INT); +} + +/* + * Switch to pressure mode, and read pressure. We don't need to wait + * here, since both plates are being driven. + */ +static unsigned int ucb1400_ts_read_pressure(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | + UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + + udelay(ts_delay_pressure); + + return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); +} + +/* + * Switch to X position mode and measure Y plate. We switch the plate + * configuration in pressure mode, then switch to position mode. This + * gives a faster response time. Even so, we need to wait about 55us + * for things to stabilise. + */ +static unsigned int ucb1400_ts_read_xpos(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | + UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); + + udelay(ts_delay); + + return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPY, adcsync); +} + +/* + * Switch to Y position mode and measure X plate. We switch the plate + * configuration in pressure mode, then switch to position mode. This + * gives a faster response time. Even so, we need to wait about 55us + * for things to stabilise. + */ +static int ucb1400_ts_read_ypos(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | + UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); + + udelay(ts_delay); + + return ucb1400_adc_read(ucb->ac97, UCB_ADC_INP_TSPX, adcsync); +} + +/* + * Switch to X plate resistance mode. Set MX to ground, PX to + * supply. Measure current. + */ +static unsigned int ucb1400_ts_read_xres(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + return ucb1400_adc_read(ucb->ac97, 0, adcsync); +} + +/* + * Switch to Y plate resistance mode. Set MY to ground, PY to + * supply. Measure current. + */ +static unsigned int ucb1400_ts_read_yres(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, + UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | + UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); + return ucb1400_adc_read(ucb->ac97, 0, adcsync); +} + +static int ucb1400_ts_pen_up(struct ucb1400_ts *ucb) +{ + unsigned short val = ucb1400_reg_read(ucb->ac97, UCB_TS_CR); + + return val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW); +} + +static void ucb1400_ts_irq_enable(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, UCB_IE_TSPX); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); + ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_TSPX); +} + +static void ucb1400_ts_irq_disable(struct ucb1400_ts *ucb) +{ + ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); +} + +static void ucb1400_ts_report_event(struct input_dev *idev, u16 pressure, u16 x, u16 y) +{ + input_report_abs(idev, ABS_X, x); + input_report_abs(idev, ABS_Y, y); + input_report_abs(idev, ABS_PRESSURE, pressure); + input_report_key(idev, BTN_TOUCH, 1); + input_sync(idev); +} + +static void ucb1400_ts_event_release(struct input_dev *idev) +{ + input_report_abs(idev, ABS_PRESSURE, 0); + input_report_key(idev, BTN_TOUCH, 0); + input_sync(idev); +} + +static void ucb1400_clear_pending_irq(struct ucb1400_ts *ucb) +{ + unsigned int isr; + + isr = ucb1400_reg_read(ucb->ac97, UCB_IE_STATUS); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, isr); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); + + if (isr & UCB_IE_TSPX) + ucb1400_ts_irq_disable(ucb); + else + dev_dbg(&ucb->ts_idev->dev, + "ucb1400: unexpected IE_STATUS = %#x\n", isr); +} + +/* + * A restriction with interrupts exists when using the ucb1400, as + * the codec read/write routines may sleep while waiting for codec + * access completion and uses semaphores for access control to the + * AC97 bus. Therefore the driver is forced to use threaded interrupt + * handler. + */ +static irqreturn_t ucb1400_irq(int irqnr, void *devid) +{ + struct ucb1400_ts *ucb = devid; + unsigned int x, y, p; + bool penup; + + if (unlikely(irqnr != ucb->irq)) + return IRQ_NONE; + + ucb1400_clear_pending_irq(ucb); + + /* Start with a small delay before checking pendown state */ + msleep(UCB1400_TS_POLL_PERIOD); + + while (!ucb->stopped && !(penup = ucb1400_ts_pen_up(ucb))) { + + ucb1400_adc_enable(ucb->ac97); + x = ucb1400_ts_read_xpos(ucb); + y = ucb1400_ts_read_ypos(ucb); + p = ucb1400_ts_read_pressure(ucb); + ucb1400_adc_disable(ucb->ac97); + + ucb1400_ts_report_event(ucb->ts_idev, p, x, y); + + wait_event_timeout(ucb->ts_wait, ucb->stopped, + msecs_to_jiffies(UCB1400_TS_POLL_PERIOD)); + } + + ucb1400_ts_event_release(ucb->ts_idev); + + if (!ucb->stopped) { + /* Switch back to interrupt mode. */ + ucb1400_ts_mode_int(ucb); + ucb1400_ts_irq_enable(ucb); + } + + return IRQ_HANDLED; +} + +static void ucb1400_ts_stop(struct ucb1400_ts *ucb) +{ + /* Signal IRQ thread to stop polling and disable the handler. */ + ucb->stopped = true; + mb(); + wake_up(&ucb->ts_wait); + disable_irq(ucb->irq); + + ucb1400_ts_irq_disable(ucb); + ucb1400_reg_write(ucb->ac97, UCB_TS_CR, 0); +} + +/* Must be called with ts->lock held */ +static void ucb1400_ts_start(struct ucb1400_ts *ucb) +{ + /* Tell IRQ thread that it may poll the device. */ + ucb->stopped = false; + mb(); + + ucb1400_ts_mode_int(ucb); + ucb1400_ts_irq_enable(ucb); + + enable_irq(ucb->irq); +} + +static int ucb1400_ts_open(struct input_dev *idev) +{ + struct ucb1400_ts *ucb = input_get_drvdata(idev); + + ucb1400_ts_start(ucb); + + return 0; +} + +static void ucb1400_ts_close(struct input_dev *idev) +{ + struct ucb1400_ts *ucb = input_get_drvdata(idev); + + ucb1400_ts_stop(ucb); +} + +#ifndef NO_IRQ +#define NO_IRQ 0 +#endif + +/* + * Try to probe our interrupt, rather than relying on lots of + * hard-coded machine dependencies. + */ +static int ucb1400_ts_detect_irq(struct ucb1400_ts *ucb, + struct platform_device *pdev) +{ + unsigned long mask, timeout; + + mask = probe_irq_on(); + + /* Enable the ADC interrupt. */ + ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, UCB_IE_ADC); + ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, UCB_IE_ADC); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); + + /* Cause an ADC interrupt. */ + ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA); + ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, UCB_ADC_ENA | UCB_ADC_START); + + /* Wait for the conversion to complete. */ + timeout = jiffies + HZ/2; + while (!(ucb1400_reg_read(ucb->ac97, UCB_ADC_DATA) & + UCB_ADC_DAT_VALID)) { + cpu_relax(); + if (time_after(jiffies, timeout)) { + dev_err(&pdev->dev, "timed out in IRQ probe\n"); + probe_irq_off(mask); + return -ENODEV; + } + } + ucb1400_reg_write(ucb->ac97, UCB_ADC_CR, 0); + + /* Disable and clear interrupt. */ + ucb1400_reg_write(ucb->ac97, UCB_IE_RIS, 0); + ucb1400_reg_write(ucb->ac97, UCB_IE_FAL, 0); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0xffff); + ucb1400_reg_write(ucb->ac97, UCB_IE_CLEAR, 0); + + /* Read triggered interrupt. */ + ucb->irq = probe_irq_off(mask); + if (ucb->irq < 0 || ucb->irq == NO_IRQ) + return -ENODEV; + + return 0; +} + +static int ucb1400_ts_probe(struct platform_device *pdev) +{ + struct ucb1400_ts *ucb = pdev->dev.platform_data; + int error, x_res, y_res; + u16 fcsr; + + ucb->ts_idev = input_allocate_device(); + if (!ucb->ts_idev) { + error = -ENOMEM; + goto err; + } + + /* Only in case the IRQ line wasn't supplied, try detecting it */ + if (ucb->irq < 0) { + error = ucb1400_ts_detect_irq(ucb, pdev); + if (error) { + dev_err(&pdev->dev, "IRQ probe failed\n"); + goto err_free_devs; + } + } + dev_dbg(&pdev->dev, "found IRQ %d\n", ucb->irq); + + init_waitqueue_head(&ucb->ts_wait); + + input_set_drvdata(ucb->ts_idev, ucb); + + ucb->ts_idev->dev.parent = &pdev->dev; + ucb->ts_idev->name = "UCB1400 touchscreen interface"; + ucb->ts_idev->id.vendor = ucb1400_reg_read(ucb->ac97, + AC97_VENDOR_ID1); + ucb->ts_idev->id.product = ucb->id; + ucb->ts_idev->open = ucb1400_ts_open; + ucb->ts_idev->close = ucb1400_ts_close; + ucb->ts_idev->evbit[0] = BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY); + ucb->ts_idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + /* + * Enable ADC filter to prevent horrible jitter on Colibri. + * This also further reduces jitter on boards where ADCSYNC + * pin is connected. + */ + fcsr = ucb1400_reg_read(ucb->ac97, UCB_FCSR); + ucb1400_reg_write(ucb->ac97, UCB_FCSR, fcsr | UCB_FCSR_AVE); + + ucb1400_adc_enable(ucb->ac97); + x_res = ucb1400_ts_read_xres(ucb); + y_res = ucb1400_ts_read_yres(ucb); + ucb1400_adc_disable(ucb->ac97); + dev_dbg(&pdev->dev, "x/y = %d/%d\n", x_res, y_res); + + input_set_abs_params(ucb->ts_idev, ABS_X, 0, x_res, 0, 0); + input_set_abs_params(ucb->ts_idev, ABS_Y, 0, y_res, 0, 0); + input_set_abs_params(ucb->ts_idev, ABS_PRESSURE, 0, 0, 0, 0); + + ucb1400_ts_stop(ucb); + + error = request_threaded_irq(ucb->irq, NULL, ucb1400_irq, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "UCB1400", ucb); + if (error) { + dev_err(&pdev->dev, + "unable to grab irq%d: %d\n", ucb->irq, error); + goto err_free_devs; + } + + error = input_register_device(ucb->ts_idev); + if (error) + goto err_free_irq; + + return 0; + +err_free_irq: + free_irq(ucb->irq, ucb); +err_free_devs: + input_free_device(ucb->ts_idev); +err: + return error; +} + +static int ucb1400_ts_remove(struct platform_device *pdev) +{ + struct ucb1400_ts *ucb = pdev->dev.platform_data; + + free_irq(ucb->irq, ucb); + input_unregister_device(ucb->ts_idev); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int ucb1400_ts_suspend(struct device *dev) +{ + struct ucb1400_ts *ucb = dev->platform_data; + struct input_dev *idev = ucb->ts_idev; + + mutex_lock(&idev->mutex); + + if (idev->users) + ucb1400_ts_start(ucb); + + mutex_unlock(&idev->mutex); + return 0; +} + +static int ucb1400_ts_resume(struct device *dev) +{ + struct ucb1400_ts *ucb = dev->platform_data; + struct input_dev *idev = ucb->ts_idev; + + mutex_lock(&idev->mutex); + + if (idev->users) + ucb1400_ts_stop(ucb); + + mutex_unlock(&idev->mutex); + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(ucb1400_ts_pm_ops, + ucb1400_ts_suspend, ucb1400_ts_resume); + +static struct platform_driver ucb1400_ts_driver = { + .probe = ucb1400_ts_probe, + .remove = ucb1400_ts_remove, + .driver = { + .name = "ucb1400_ts", + .owner = THIS_MODULE, + .pm = &ucb1400_ts_pm_ops, + }, +}; +module_platform_driver(ucb1400_ts_driver); + +module_param(adcsync, bool, 0444); +MODULE_PARM_DESC(adcsync, "Synchronize touch readings with ADCSYNC pin."); + +module_param(ts_delay, int, 0444); +MODULE_PARM_DESC(ts_delay, "Delay between panel setup and" + " position read. Default = 55us."); + +module_param(ts_delay_pressure, int, 0444); +MODULE_PARM_DESC(ts_delay_pressure, + "delay between panel setup and pressure read." + " Default = 0us."); + +MODULE_DESCRIPTION("Philips UCB1400 touchscreen driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c new file mode 100644 index 00000000..5f87bed0 --- /dev/null +++ b/drivers/input/touchscreen/usbtouchscreen.c @@ -0,0 +1,1759 @@ +/****************************************************************************** + * usbtouchscreen.c + * Driver for USB Touchscreens, supporting those devices: + * - eGalax Touchkit + * includes eTurboTouch CT-410/510/700 + * - 3M/Microtouch EX II series + * - ITM + * - PanJit TouchSet + * - eTurboTouch + * - Gunze AHL61 + * - DMC TSC-10/25 + * - IRTOUCHSYSTEMS/UNITOP + * - IdealTEK URTC1000 + * - General Touch + * - GoTop Super_Q2/GogoPen/PenPower tablets + * - JASTEC USB touch controller/DigiTech DTR-02U + * - Zytronic capacitive touchscreen + * - NEXIO/iNexio + * - Elo TouchSystems 2700 IntelliTouch + * - EasyTouch USB Dual/Multi touch controller from Data Modul + * + * Copyright (C) 2004-2007 by Daniel Ritz + * Copyright (C) by Todd E. Johnson (mtouchusb.c) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * Driver is based on touchkitusb.c + * - ITM parts are from itmtouch.c + * - 3M parts are from mtouchusb.c + * - PanJit parts are from an unmerged driver by Lanslott Gish + * - DMC TSC 10/25 are from Holger Schurig, with ideas from an unmerged + * driver from Marius Vollmer + * + *****************************************************************************/ + +//#define DEBUG + +#include +#include +#include +#include +#include +#include +#include +#include + + +#define DRIVER_VERSION "v0.6" +#define DRIVER_AUTHOR "Daniel Ritz " +#define DRIVER_DESC "USB Touchscreen Driver" + +static bool swap_xy; +module_param(swap_xy, bool, 0644); +MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped."); + +static bool hwcalib_xy; +module_param(hwcalib_xy, bool, 0644); +MODULE_PARM_DESC(hwcalib_xy, "If set hw-calibrated X/Y are used if available"); + +/* device specifc data/functions */ +struct usbtouch_usb; +struct usbtouch_device_info { + int min_xc, max_xc; + int min_yc, max_yc; + int min_press, max_press; + int rept_size; + + /* + * Always service the USB devices irq not just when the input device is + * open. This is useful when devices have a watchdog which prevents us + * from periodically polling the device. Leave this unset unless your + * touchscreen device requires it, as it does consume more of the USB + * bandwidth. + */ + bool irq_always; + + void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len); + + /* + * used to get the packet len. possible return values: + * > 0: packet len + * = 0: skip one byte + * < 0: -return value more bytes needed + */ + int (*get_pkt_len) (unsigned char *pkt, int len); + + int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt); + int (*alloc) (struct usbtouch_usb *usbtouch); + int (*init) (struct usbtouch_usb *usbtouch); + void (*exit) (struct usbtouch_usb *usbtouch); +}; + +/* a usbtouch device */ +struct usbtouch_usb { + unsigned char *data; + dma_addr_t data_dma; + int data_size; + unsigned char *buffer; + int buf_len; + struct urb *irq; + struct usb_interface *interface; + struct input_dev *input; + struct usbtouch_device_info *type; + char name[128]; + char phys[64]; + void *priv; + + int x, y; + int touch, press; +}; + + +/* device types */ +enum { + DEVTYPE_IGNORE = -1, + DEVTYPE_EGALAX, + DEVTYPE_PANJIT, + DEVTYPE_3M, + DEVTYPE_ITM, + DEVTYPE_ETURBO, + DEVTYPE_GUNZE, + DEVTYPE_DMC_TSC10, + DEVTYPE_IRTOUCH, + DEVTYPE_IDEALTEK, + DEVTYPE_GENERAL_TOUCH, + DEVTYPE_GOTOP, + DEVTYPE_JASTEC, + DEVTYPE_E2I, + DEVTYPE_ZYTRONIC, + DEVTYPE_TC45USB, + DEVTYPE_NEXIO, + DEVTYPE_ELO, + DEVTYPE_ETOUCH, +}; + +#define USB_DEVICE_HID_CLASS(vend, prod) \ + .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS \ + | USB_DEVICE_ID_MATCH_DEVICE, \ + .idVendor = (vend), \ + .idProduct = (prod), \ + .bInterfaceClass = USB_INTERFACE_CLASS_HID + +static const struct usb_device_id usbtouch_devices[] = { +#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX + /* ignore the HID capable devices, handled by usbhid */ + {USB_DEVICE_HID_CLASS(0x0eef, 0x0001), .driver_info = DEVTYPE_IGNORE}, + {USB_DEVICE_HID_CLASS(0x0eef, 0x0002), .driver_info = DEVTYPE_IGNORE}, + + /* normal device IDs */ + {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX}, + {USB_DEVICE(0x3823, 0x0002), .driver_info = DEVTYPE_EGALAX}, + {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX}, + {USB_DEVICE(0x0eef, 0x0001), .driver_info = DEVTYPE_EGALAX}, + {USB_DEVICE(0x0eef, 0x0002), .driver_info = DEVTYPE_EGALAX}, + {USB_DEVICE(0x1234, 0x0001), .driver_info = DEVTYPE_EGALAX}, + {USB_DEVICE(0x1234, 0x0002), .driver_info = DEVTYPE_EGALAX}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT + {USB_DEVICE(0x134c, 0x0001), .driver_info = DEVTYPE_PANJIT}, + {USB_DEVICE(0x134c, 0x0002), .driver_info = DEVTYPE_PANJIT}, + {USB_DEVICE(0x134c, 0x0003), .driver_info = DEVTYPE_PANJIT}, + {USB_DEVICE(0x134c, 0x0004), .driver_info = DEVTYPE_PANJIT}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_3M + {USB_DEVICE(0x0596, 0x0001), .driver_info = DEVTYPE_3M}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ITM + {USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM}, + {USB_DEVICE(0x16e3, 0xf9e9), .driver_info = DEVTYPE_ITM}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO + {USB_DEVICE(0x1234, 0x5678), .driver_info = DEVTYPE_ETURBO}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE + {USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10 + {USB_DEVICE(0x0afa, 0x03e8), .driver_info = DEVTYPE_DMC_TSC10}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH + {USB_DEVICE(0x595a, 0x0001), .driver_info = DEVTYPE_IRTOUCH}, + {USB_DEVICE(0x6615, 0x0001), .driver_info = DEVTYPE_IRTOUCH}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK + {USB_DEVICE(0x1391, 0x1000), .driver_info = DEVTYPE_IDEALTEK}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH + {USB_DEVICE(0x0dfc, 0x0001), .driver_info = DEVTYPE_GENERAL_TOUCH}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP + {USB_DEVICE(0x08f2, 0x007f), .driver_info = DEVTYPE_GOTOP}, + {USB_DEVICE(0x08f2, 0x00ce), .driver_info = DEVTYPE_GOTOP}, + {USB_DEVICE(0x08f2, 0x00f4), .driver_info = DEVTYPE_GOTOP}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC + {USB_DEVICE(0x0f92, 0x0001), .driver_info = DEVTYPE_JASTEC}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_E2I + {USB_DEVICE(0x1ac7, 0x0001), .driver_info = DEVTYPE_E2I}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC + {USB_DEVICE(0x14c8, 0x0003), .driver_info = DEVTYPE_ZYTRONIC}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC45USB + /* TC5UH */ + {USB_DEVICE(0x0664, 0x0309), .driver_info = DEVTYPE_TC45USB}, + /* TC4UM */ + {USB_DEVICE(0x0664, 0x0306), .driver_info = DEVTYPE_TC45USB}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_NEXIO + /* data interface only */ + {USB_DEVICE_AND_INTERFACE_INFO(0x10f0, 0x2002, 0x0a, 0x00, 0x00), + .driver_info = DEVTYPE_NEXIO}, + {USB_DEVICE_AND_INTERFACE_INFO(0x1870, 0x0001, 0x0a, 0x00, 0x00), + .driver_info = DEVTYPE_NEXIO}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ELO + {USB_DEVICE(0x04e7, 0x0020), .driver_info = DEVTYPE_ELO}, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_EASYTOUCH + {USB_DEVICE(0x7374, 0x0001), .driver_info = DEVTYPE_ETOUCH}, +#endif + + {} +}; + + +/***************************************************************************** + * e2i Part + */ + +#ifdef CONFIG_TOUCHSCREEN_USB_E2I +static int e2i_init(struct usbtouch_usb *usbtouch) +{ + int ret; + struct usb_device *udev = interface_to_usbdev(usbtouch->interface); + + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + 0x01, 0x02, 0x0000, 0x0081, + NULL, 0, USB_CTRL_SET_TIMEOUT); + + dev_dbg(&usbtouch->interface->dev, + "%s - usb_control_msg - E2I_RESET - bytes|err: %d\n", + __func__, ret); + return ret; +} + +static int e2i_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + int tmp = (pkt[0] << 8) | pkt[1]; + dev->x = (pkt[2] << 8) | pkt[3]; + dev->y = (pkt[4] << 8) | pkt[5]; + + tmp = tmp - 0xA000; + dev->touch = (tmp > 0); + dev->press = (tmp > 0 ? tmp : 0); + + return 1; +} +#endif + + +/***************************************************************************** + * eGalax part + */ + +#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX + +#ifndef MULTI_PACKET +#define MULTI_PACKET +#endif + +#define EGALAX_PKT_TYPE_MASK 0xFE +#define EGALAX_PKT_TYPE_REPT 0x80 +#define EGALAX_PKT_TYPE_DIAG 0x0A + +static int egalax_init(struct usbtouch_usb *usbtouch) +{ + int ret, i; + unsigned char *buf; + struct usb_device *udev = interface_to_usbdev(usbtouch->interface); + + /* + * An eGalax diagnostic packet kicks the device into using the right + * protocol. We send a "check active" packet. The response will be + * read later and ignored. + */ + + buf = kmalloc(3, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + buf[0] = EGALAX_PKT_TYPE_DIAG; + buf[1] = 1; /* length */ + buf[2] = 'A'; /* command - check active */ + + for (i = 0; i < 3; i++) { + ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + 0, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + 0, 0, buf, 3, + USB_CTRL_SET_TIMEOUT); + if (ret >= 0) { + ret = 0; + break; + } + if (ret != -EPIPE) + break; + } + + kfree(buf); + + return ret; +} + +static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) + return 0; + + dev->x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F); + dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F); + dev->touch = pkt[0] & 0x01; + + return 1; +} + +static int egalax_get_pkt_len(unsigned char *buf, int len) +{ + switch (buf[0] & EGALAX_PKT_TYPE_MASK) { + case EGALAX_PKT_TYPE_REPT: + return 5; + + case EGALAX_PKT_TYPE_DIAG: + if (len < 2) + return -1; + + return buf[1] + 2; + } + + return 0; +} +#endif + +/***************************************************************************** + * EasyTouch part + */ + +#ifdef CONFIG_TOUCHSCREEN_USB_EASYTOUCH + +#ifndef MULTI_PACKET +#define MULTI_PACKET +#endif + +#define ETOUCH_PKT_TYPE_MASK 0xFE +#define ETOUCH_PKT_TYPE_REPT 0x80 +#define ETOUCH_PKT_TYPE_REPT2 0xB0 +#define ETOUCH_PKT_TYPE_DIAG 0x0A + +static int etouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + if ((pkt[0] & ETOUCH_PKT_TYPE_MASK) != ETOUCH_PKT_TYPE_REPT && + (pkt[0] & ETOUCH_PKT_TYPE_MASK) != ETOUCH_PKT_TYPE_REPT2) + return 0; + + dev->x = ((pkt[1] & 0x1F) << 7) | (pkt[2] & 0x7F); + dev->y = ((pkt[3] & 0x1F) << 7) | (pkt[4] & 0x7F); + dev->touch = pkt[0] & 0x01; + + return 1; +} + +static int etouch_get_pkt_len(unsigned char *buf, int len) +{ + switch (buf[0] & ETOUCH_PKT_TYPE_MASK) { + case ETOUCH_PKT_TYPE_REPT: + case ETOUCH_PKT_TYPE_REPT2: + return 5; + + case ETOUCH_PKT_TYPE_DIAG: + if (len < 2) + return -1; + + return buf[1] + 2; + } + + return 0; +} +#endif + +/***************************************************************************** + * PanJit Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT +static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1]; + dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3]; + dev->touch = pkt[0] & 0x01; + + return 1; +} +#endif + + +/***************************************************************************** + * 3M/Microtouch Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_3M + +#define MTOUCHUSB_ASYNC_REPORT 1 +#define MTOUCHUSB_RESET 7 +#define MTOUCHUSB_REQ_CTRLLR_ID 10 + +static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + if (hwcalib_xy) { + dev->x = (pkt[4] << 8) | pkt[3]; + dev->y = 0xffff - ((pkt[6] << 8) | pkt[5]); + } else { + dev->x = (pkt[8] << 8) | pkt[7]; + dev->y = (pkt[10] << 8) | pkt[9]; + } + dev->touch = (pkt[2] & 0x40) ? 1 : 0; + + return 1; +} + +static int mtouch_init(struct usbtouch_usb *usbtouch) +{ + int ret, i; + struct usb_device *udev = interface_to_usbdev(usbtouch->interface); + + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + MTOUCHUSB_RESET, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); + dev_dbg(&usbtouch->interface->dev, + "%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d\n", + __func__, ret); + if (ret < 0) + return ret; + msleep(150); + + for (i = 0; i < 3; i++) { + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + MTOUCHUSB_ASYNC_REPORT, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); + dev_dbg(&usbtouch->interface->dev, + "%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d\n", + __func__, ret); + if (ret >= 0) + break; + if (ret != -EPIPE) + return ret; + } + + /* Default min/max xy are the raw values, override if using hw-calib */ + if (hwcalib_xy) { + input_set_abs_params(usbtouch->input, ABS_X, 0, 0xffff, 0, 0); + input_set_abs_params(usbtouch->input, ABS_Y, 0, 0xffff, 0, 0); + } + + return 0; +} +#endif + + +/***************************************************************************** + * ITM Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_ITM +static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + int touch; + /* + * ITM devices report invalid x/y data if not touched. + * if the screen was touched before but is not touched any more + * report touch as 0 with the last valid x/y data once. then stop + * reporting data until touched again. + */ + dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F); + + touch = ~pkt[7] & 0x20; + if (!touch) { + if (dev->touch) { + dev->touch = 0; + return 1; + } + + return 0; + } + + dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F); + dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); + dev->touch = touch; + + return 1; +} +#endif + + +/***************************************************************************** + * eTurboTouch part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO +#ifndef MULTI_PACKET +#define MULTI_PACKET +#endif +static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + unsigned int shift; + + /* packets should start with sync */ + if (!(pkt[0] & 0x80)) + return 0; + + shift = (6 - (pkt[0] & 0x03)); + dev->x = ((pkt[3] << 7) | pkt[4]) >> shift; + dev->y = ((pkt[1] << 7) | pkt[2]) >> shift; + dev->touch = (pkt[0] & 0x10) ? 1 : 0; + + return 1; +} + +static int eturbo_get_pkt_len(unsigned char *buf, int len) +{ + if (buf[0] & 0x80) + return 5; + if (buf[0] == 0x01) + return 3; + return 0; +} +#endif + + +/***************************************************************************** + * Gunze part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE +static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80)) + return 0; + + dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F); + dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F); + dev->touch = pkt[0] & 0x20; + + return 1; +} +#endif + +/***************************************************************************** + * DMC TSC-10/25 Part + * + * Documentation about the controller and it's protocol can be found at + * http://www.dmccoltd.com/files/controler/tsc10usb_pi_e.pdf + * http://www.dmccoltd.com/files/controler/tsc25_usb_e.pdf + */ +#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10 + +/* supported data rates. currently using 130 */ +#define TSC10_RATE_POINT 0x50 +#define TSC10_RATE_30 0x40 +#define TSC10_RATE_50 0x41 +#define TSC10_RATE_80 0x42 +#define TSC10_RATE_100 0x43 +#define TSC10_RATE_130 0x44 +#define TSC10_RATE_150 0x45 + +/* commands */ +#define TSC10_CMD_RESET 0x55 +#define TSC10_CMD_RATE 0x05 +#define TSC10_CMD_DATA1 0x01 + +static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) +{ + struct usb_device *dev = interface_to_usbdev(usbtouch->interface); + int ret = -ENOMEM; + unsigned char *buf; + + buf = kmalloc(2, GFP_NOIO); + if (!buf) + goto err_nobuf; + /* reset */ + buf[0] = buf[1] = 0xFF; + ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), + TSC10_CMD_RESET, + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + 0, 0, buf, 2, USB_CTRL_SET_TIMEOUT); + if (ret < 0) + goto err_out; + if (buf[0] != 0x06) { + ret = -ENODEV; + goto err_out; + } + + /* set coordinate output rate */ + buf[0] = buf[1] = 0xFF; + ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), + TSC10_CMD_RATE, + USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT); + if (ret < 0) + goto err_out; + if ((buf[0] != 0x06) && (buf[0] != 0x15 || buf[1] != 0x01)) { + ret = -ENODEV; + goto err_out; + } + + /* start sending data */ + ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), + TSC10_CMD_DATA1, + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, + 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); +err_out: + kfree(buf); +err_nobuf: + return ret; +} + + +static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = ((pkt[2] & 0x03) << 8) | pkt[1]; + dev->y = ((pkt[4] & 0x03) << 8) | pkt[3]; + dev->touch = pkt[0] & 0x01; + + return 1; +} +#endif + + +/***************************************************************************** + * IRTOUCH Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH +static int irtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = (pkt[3] << 8) | pkt[2]; + dev->y = (pkt[5] << 8) | pkt[4]; + dev->touch = (pkt[1] & 0x03) ? 1 : 0; + + return 1; +} +#endif + +/***************************************************************************** + * ET&T TC5UH/TC4UM part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC45USB +static int tc45usb_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1]; + dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3]; + dev->touch = pkt[0] & 0x01; + + return 1; +} +#endif + +/***************************************************************************** + * IdealTEK URTC1000 Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK +#ifndef MULTI_PACKET +#define MULTI_PACKET +#endif +static int idealtek_get_pkt_len(unsigned char *buf, int len) +{ + if (buf[0] & 0x80) + return 5; + if (buf[0] == 0x01) + return len; + return 0; +} + +static int idealtek_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + switch (pkt[0] & 0x98) { + case 0x88: + /* touch data in IdealTEK mode */ + dev->x = (pkt[1] << 5) | (pkt[2] >> 2); + dev->y = (pkt[3] << 5) | (pkt[4] >> 2); + dev->touch = (pkt[0] & 0x40) ? 1 : 0; + return 1; + + case 0x98: + /* touch data in MT emulation mode */ + dev->x = (pkt[2] << 5) | (pkt[1] >> 2); + dev->y = (pkt[4] << 5) | (pkt[3] >> 2); + dev->touch = (pkt[0] & 0x40) ? 1 : 0; + return 1; + + default: + return 0; + } +} +#endif + +/***************************************************************************** + * General Touch Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH +static int general_touch_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = (pkt[2] << 8) | pkt[1]; + dev->y = (pkt[4] << 8) | pkt[3]; + dev->press = pkt[5] & 0xff; + dev->touch = pkt[0] & 0x01; + + return 1; +} +#endif + +/***************************************************************************** + * GoTop Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP +static int gotop_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = ((pkt[1] & 0x38) << 4) | pkt[2]; + dev->y = ((pkt[1] & 0x07) << 7) | pkt[3]; + dev->touch = pkt[0] & 0x01; + + return 1; +} +#endif + +/***************************************************************************** + * JASTEC Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC +static int jastec_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = ((pkt[0] & 0x3f) << 6) | (pkt[2] & 0x3f); + dev->y = ((pkt[1] & 0x3f) << 6) | (pkt[3] & 0x3f); + dev->touch = (pkt[0] & 0x40) >> 6; + + return 1; +} +#endif + +/***************************************************************************** + * Zytronic Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC +static int zytronic_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + struct usb_interface *intf = dev->interface; + + switch (pkt[0]) { + case 0x3A: /* command response */ + dev_dbg(&intf->dev, "%s: Command response %d\n", __func__, pkt[1]); + break; + + case 0xC0: /* down */ + dev->x = (pkt[1] & 0x7f) | ((pkt[2] & 0x07) << 7); + dev->y = (pkt[3] & 0x7f) | ((pkt[4] & 0x07) << 7); + dev->touch = 1; + dev_dbg(&intf->dev, "%s: down %d,%d\n", __func__, dev->x, dev->y); + return 1; + + case 0x80: /* up */ + dev->x = (pkt[1] & 0x7f) | ((pkt[2] & 0x07) << 7); + dev->y = (pkt[3] & 0x7f) | ((pkt[4] & 0x07) << 7); + dev->touch = 0; + dev_dbg(&intf->dev, "%s: up %d,%d\n", __func__, dev->x, dev->y); + return 1; + + default: + dev_dbg(&intf->dev, "%s: Unknown return %d\n", __func__, pkt[0]); + break; + } + + return 0; +} +#endif + +/***************************************************************************** + * NEXIO Part + */ +#ifdef CONFIG_TOUCHSCREEN_USB_NEXIO + +#define NEXIO_TIMEOUT 5000 +#define NEXIO_BUFSIZE 1024 +#define NEXIO_THRESHOLD 50 + +struct nexio_priv { + struct urb *ack; + unsigned char *ack_buf; +}; + +struct nexio_touch_packet { + u8 flags; /* 0xe1 = touch, 0xe1 = release */ + __be16 data_len; /* total bytes of touch data */ + __be16 x_len; /* bytes for X axis */ + __be16 y_len; /* bytes for Y axis */ + u8 data[]; +} __attribute__ ((packed)); + +static unsigned char nexio_ack_pkt[2] = { 0xaa, 0x02 }; +static unsigned char nexio_init_pkt[4] = { 0x82, 0x04, 0x0a, 0x0f }; + +static void nexio_ack_complete(struct urb *urb) +{ +} + +static int nexio_alloc(struct usbtouch_usb *usbtouch) +{ + struct nexio_priv *priv; + int ret = -ENOMEM; + + usbtouch->priv = kmalloc(sizeof(struct nexio_priv), GFP_KERNEL); + if (!usbtouch->priv) + goto out_buf; + + priv = usbtouch->priv; + + priv->ack_buf = kmemdup(nexio_ack_pkt, sizeof(nexio_ack_pkt), + GFP_KERNEL); + if (!priv->ack_buf) + goto err_priv; + + priv->ack = usb_alloc_urb(0, GFP_KERNEL); + if (!priv->ack) { + dev_dbg(&usbtouch->interface->dev, + "%s - usb_alloc_urb failed: usbtouch->ack\n", __func__); + goto err_ack_buf; + } + + return 0; + +err_ack_buf: + kfree(priv->ack_buf); +err_priv: + kfree(priv); +out_buf: + return ret; +} + +static int nexio_init(struct usbtouch_usb *usbtouch) +{ + struct usb_device *dev = interface_to_usbdev(usbtouch->interface); + struct usb_host_interface *interface = usbtouch->interface->cur_altsetting; + struct nexio_priv *priv = usbtouch->priv; + int ret = -ENOMEM; + int actual_len, i; + unsigned char *buf; + char *firmware_ver = NULL, *device_name = NULL; + int input_ep = 0, output_ep = 0; + + /* find first input and output endpoint */ + for (i = 0; i < interface->desc.bNumEndpoints; i++) { + if (!input_ep && + usb_endpoint_dir_in(&interface->endpoint[i].desc)) + input_ep = interface->endpoint[i].desc.bEndpointAddress; + if (!output_ep && + usb_endpoint_dir_out(&interface->endpoint[i].desc)) + output_ep = interface->endpoint[i].desc.bEndpointAddress; + } + if (!input_ep || !output_ep) + return -ENXIO; + + buf = kmalloc(NEXIO_BUFSIZE, GFP_NOIO); + if (!buf) + goto out_buf; + + /* two empty reads */ + for (i = 0; i < 2; i++) { + ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, input_ep), + buf, NEXIO_BUFSIZE, &actual_len, + NEXIO_TIMEOUT); + if (ret < 0) + goto out_buf; + } + + /* send init command */ + memcpy(buf, nexio_init_pkt, sizeof(nexio_init_pkt)); + ret = usb_bulk_msg(dev, usb_sndbulkpipe(dev, output_ep), + buf, sizeof(nexio_init_pkt), &actual_len, + NEXIO_TIMEOUT); + if (ret < 0) + goto out_buf; + + /* read replies */ + for (i = 0; i < 3; i++) { + memset(buf, 0, NEXIO_BUFSIZE); + ret = usb_bulk_msg(dev, usb_rcvbulkpipe(dev, input_ep), + buf, NEXIO_BUFSIZE, &actual_len, + NEXIO_TIMEOUT); + if (ret < 0 || actual_len < 1 || buf[1] != actual_len) + continue; + switch (buf[0]) { + case 0x83: /* firmware version */ + if (!firmware_ver) + firmware_ver = kstrdup(&buf[2], GFP_NOIO); + break; + case 0x84: /* device name */ + if (!device_name) + device_name = kstrdup(&buf[2], GFP_NOIO); + break; + } + } + + printk(KERN_INFO "Nexio device: %s, firmware version: %s\n", + device_name, firmware_ver); + + kfree(firmware_ver); + kfree(device_name); + + usb_fill_bulk_urb(priv->ack, dev, usb_sndbulkpipe(dev, output_ep), + priv->ack_buf, sizeof(nexio_ack_pkt), + nexio_ack_complete, usbtouch); + ret = 0; + +out_buf: + kfree(buf); + return ret; +} + +static void nexio_exit(struct usbtouch_usb *usbtouch) +{ + struct nexio_priv *priv = usbtouch->priv; + + usb_kill_urb(priv->ack); + usb_free_urb(priv->ack); + kfree(priv->ack_buf); + kfree(priv); +} + +static int nexio_read_data(struct usbtouch_usb *usbtouch, unsigned char *pkt) +{ + struct nexio_touch_packet *packet = (void *) pkt; + struct nexio_priv *priv = usbtouch->priv; + unsigned int data_len = be16_to_cpu(packet->data_len); + unsigned int x_len = be16_to_cpu(packet->x_len); + unsigned int y_len = be16_to_cpu(packet->y_len); + int x, y, begin_x, begin_y, end_x, end_y, w, h, ret; + + /* got touch data? */ + if ((pkt[0] & 0xe0) != 0xe0) + return 0; + + if (data_len > 0xff) + data_len -= 0x100; + if (x_len > 0xff) + x_len -= 0x80; + + /* send ACK */ + ret = usb_submit_urb(priv->ack, GFP_ATOMIC); + + if (!usbtouch->type->max_xc) { + usbtouch->type->max_xc = 2 * x_len; + input_set_abs_params(usbtouch->input, ABS_X, + 0, usbtouch->type->max_xc, 0, 0); + usbtouch->type->max_yc = 2 * y_len; + input_set_abs_params(usbtouch->input, ABS_Y, + 0, usbtouch->type->max_yc, 0, 0); + } + /* + * The device reports state of IR sensors on X and Y axes. + * Each byte represents "darkness" percentage (0-100) of one element. + * 17" touchscreen reports only 64 x 52 bytes so the resolution is low. + * This also means that there's a limited multi-touch capability but + * it's disabled (and untested) here as there's no X driver for that. + */ + begin_x = end_x = begin_y = end_y = -1; + for (x = 0; x < x_len; x++) { + if (begin_x == -1 && packet->data[x] > NEXIO_THRESHOLD) { + begin_x = x; + continue; + } + if (end_x == -1 && begin_x != -1 && packet->data[x] < NEXIO_THRESHOLD) { + end_x = x - 1; + for (y = x_len; y < data_len; y++) { + if (begin_y == -1 && packet->data[y] > NEXIO_THRESHOLD) { + begin_y = y - x_len; + continue; + } + if (end_y == -1 && + begin_y != -1 && packet->data[y] < NEXIO_THRESHOLD) { + end_y = y - 1 - x_len; + w = end_x - begin_x; + h = end_y - begin_y; +#if 0 + /* multi-touch */ + input_report_abs(usbtouch->input, + ABS_MT_TOUCH_MAJOR, max(w,h)); + input_report_abs(usbtouch->input, + ABS_MT_TOUCH_MINOR, min(x,h)); + input_report_abs(usbtouch->input, + ABS_MT_POSITION_X, 2*begin_x+w); + input_report_abs(usbtouch->input, + ABS_MT_POSITION_Y, 2*begin_y+h); + input_report_abs(usbtouch->input, + ABS_MT_ORIENTATION, w > h); + input_mt_sync(usbtouch->input); +#endif + /* single touch */ + usbtouch->x = 2 * begin_x + w; + usbtouch->y = 2 * begin_y + h; + usbtouch->touch = packet->flags & 0x01; + begin_y = end_y = -1; + return 1; + } + } + begin_x = end_x = -1; + } + + } + return 0; +} +#endif + + +/***************************************************************************** + * ELO part + */ + +#ifdef CONFIG_TOUCHSCREEN_USB_ELO + +static int elo_read_data(struct usbtouch_usb *dev, unsigned char *pkt) +{ + dev->x = (pkt[3] << 8) | pkt[2]; + dev->y = (pkt[5] << 8) | pkt[4]; + dev->touch = pkt[6] > 0; + dev->press = pkt[6]; + + return 1; +} +#endif + + +/***************************************************************************** + * the different device descriptors + */ +#ifdef MULTI_PACKET +static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, + unsigned char *pkt, int len); +#endif + +static struct usbtouch_device_info usbtouch_dev_info[] = { +#ifdef CONFIG_TOUCHSCREEN_USB_ELO + [DEVTYPE_ELO] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .max_press = 0xff, + .rept_size = 8, + .read_data = elo_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_EGALAX + [DEVTYPE_EGALAX] = { + .min_xc = 0x0, + .max_xc = 0x07ff, + .min_yc = 0x0, + .max_yc = 0x07ff, + .rept_size = 16, + .process_pkt = usbtouch_process_multi, + .get_pkt_len = egalax_get_pkt_len, + .read_data = egalax_read_data, + .init = egalax_init, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_PANJIT + [DEVTYPE_PANJIT] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .rept_size = 8, + .read_data = panjit_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_3M + [DEVTYPE_3M] = { + .min_xc = 0x0, + .max_xc = 0x4000, + .min_yc = 0x0, + .max_yc = 0x4000, + .rept_size = 11, + .read_data = mtouch_read_data, + .init = mtouch_init, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ITM + [DEVTYPE_ITM] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .max_press = 0xff, + .rept_size = 8, + .read_data = itm_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ETURBO + [DEVTYPE_ETURBO] = { + .min_xc = 0x0, + .max_xc = 0x07ff, + .min_yc = 0x0, + .max_yc = 0x07ff, + .rept_size = 8, + .process_pkt = usbtouch_process_multi, + .get_pkt_len = eturbo_get_pkt_len, + .read_data = eturbo_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_GUNZE + [DEVTYPE_GUNZE] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .rept_size = 4, + .read_data = gunze_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_DMC_TSC10 + [DEVTYPE_DMC_TSC10] = { + .min_xc = 0x0, + .max_xc = 0x03ff, + .min_yc = 0x0, + .max_yc = 0x03ff, + .rept_size = 5, + .init = dmc_tsc10_init, + .read_data = dmc_tsc10_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_IRTOUCH + [DEVTYPE_IRTOUCH] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .rept_size = 8, + .read_data = irtouch_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_IDEALTEK + [DEVTYPE_IDEALTEK] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .rept_size = 8, + .process_pkt = usbtouch_process_multi, + .get_pkt_len = idealtek_get_pkt_len, + .read_data = idealtek_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_GENERAL_TOUCH + [DEVTYPE_GENERAL_TOUCH] = { + .min_xc = 0x0, + .max_xc = 0x7fff, + .min_yc = 0x0, + .max_yc = 0x7fff, + .rept_size = 7, + .read_data = general_touch_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_GOTOP + [DEVTYPE_GOTOP] = { + .min_xc = 0x0, + .max_xc = 0x03ff, + .min_yc = 0x0, + .max_yc = 0x03ff, + .rept_size = 4, + .read_data = gotop_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_JASTEC + [DEVTYPE_JASTEC] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .rept_size = 4, + .read_data = jastec_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_E2I + [DEVTYPE_E2I] = { + .min_xc = 0x0, + .max_xc = 0x7fff, + .min_yc = 0x0, + .max_yc = 0x7fff, + .rept_size = 6, + .init = e2i_init, + .read_data = e2i_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ZYTRONIC + [DEVTYPE_ZYTRONIC] = { + .min_xc = 0x0, + .max_xc = 0x03ff, + .min_yc = 0x0, + .max_yc = 0x03ff, + .rept_size = 5, + .read_data = zytronic_read_data, + .irq_always = true, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_ETT_TC45USB + [DEVTYPE_TC45USB] = { + .min_xc = 0x0, + .max_xc = 0x0fff, + .min_yc = 0x0, + .max_yc = 0x0fff, + .rept_size = 5, + .read_data = tc45usb_read_data, + }, +#endif + +#ifdef CONFIG_TOUCHSCREEN_USB_NEXIO + [DEVTYPE_NEXIO] = { + .rept_size = 1024, + .irq_always = true, + .read_data = nexio_read_data, + .alloc = nexio_alloc, + .init = nexio_init, + .exit = nexio_exit, + }, +#endif +#ifdef CONFIG_TOUCHSCREEN_USB_EASYTOUCH + [DEVTYPE_ETOUCH] = { + .min_xc = 0x0, + .max_xc = 0x07ff, + .min_yc = 0x0, + .max_yc = 0x07ff, + .rept_size = 16, + .process_pkt = usbtouch_process_multi, + .get_pkt_len = etouch_get_pkt_len, + .read_data = etouch_read_data, + }, +#endif +}; + + +/***************************************************************************** + * Generic Part + */ +static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, + unsigned char *pkt, int len) +{ + struct usbtouch_device_info *type = usbtouch->type; + + if (!type->read_data(usbtouch, pkt)) + return; + + input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch); + + if (swap_xy) { + input_report_abs(usbtouch->input, ABS_X, usbtouch->y); + input_report_abs(usbtouch->input, ABS_Y, usbtouch->x); + } else { + input_report_abs(usbtouch->input, ABS_X, usbtouch->x); + input_report_abs(usbtouch->input, ABS_Y, usbtouch->y); + } + if (type->max_press) + input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press); + input_sync(usbtouch->input); +} + + +#ifdef MULTI_PACKET +static void usbtouch_process_multi(struct usbtouch_usb *usbtouch, + unsigned char *pkt, int len) +{ + unsigned char *buffer; + int pkt_len, pos, buf_len, tmp; + + /* process buffer */ + if (unlikely(usbtouch->buf_len)) { + /* try to get size */ + pkt_len = usbtouch->type->get_pkt_len( + usbtouch->buffer, usbtouch->buf_len); + + /* drop? */ + if (unlikely(!pkt_len)) + goto out_flush_buf; + + /* need to append -pkt_len bytes before able to get size */ + if (unlikely(pkt_len < 0)) { + int append = -pkt_len; + if (unlikely(append > len)) + append = len; + if (usbtouch->buf_len + append >= usbtouch->type->rept_size) + goto out_flush_buf; + memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, append); + usbtouch->buf_len += append; + + pkt_len = usbtouch->type->get_pkt_len( + usbtouch->buffer, usbtouch->buf_len); + if (pkt_len < 0) + return; + } + + /* append */ + tmp = pkt_len - usbtouch->buf_len; + if (usbtouch->buf_len + tmp >= usbtouch->type->rept_size) + goto out_flush_buf; + memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, tmp); + usbtouch_process_pkt(usbtouch, usbtouch->buffer, pkt_len); + + buffer = pkt + tmp; + buf_len = len - tmp; + } else { + buffer = pkt; + buf_len = len; + } + + /* loop over the received packet, process */ + pos = 0; + while (pos < buf_len) { + /* get packet len */ + pkt_len = usbtouch->type->get_pkt_len(buffer + pos, + buf_len - pos); + + /* unknown packet: skip one byte */ + if (unlikely(!pkt_len)) { + pos++; + continue; + } + + /* full packet: process */ + if (likely((pkt_len > 0) && (pkt_len <= buf_len - pos))) { + usbtouch_process_pkt(usbtouch, buffer + pos, pkt_len); + } else { + /* incomplete packet: save in buffer */ + memcpy(usbtouch->buffer, buffer + pos, buf_len - pos); + usbtouch->buf_len = buf_len - pos; + return; + } + pos += pkt_len; + } + +out_flush_buf: + usbtouch->buf_len = 0; + return; +} +#endif + + +static void usbtouch_irq(struct urb *urb) +{ + struct usbtouch_usb *usbtouch = urb->context; + struct device *dev = &usbtouch->interface->dev; + int retval; + + switch (urb->status) { + case 0: + /* success */ + break; + case -ETIME: + /* this urb is timing out */ + dev_dbg(dev, + "%s - urb timed out - was the device unplugged?\n", + __func__); + return; + case -ECONNRESET: + case -ENOENT: + case -ESHUTDOWN: + case -EPIPE: + /* this urb is terminated, clean up */ + dev_dbg(dev, "%s - urb shutting down with status: %d\n", + __func__, urb->status); + return; + default: + dev_dbg(dev, "%s - nonzero urb status received: %d\n", + __func__, urb->status); + goto exit; + } + + usbtouch->type->process_pkt(usbtouch, usbtouch->data, urb->actual_length); + +exit: + usb_mark_last_busy(interface_to_usbdev(usbtouch->interface)); + retval = usb_submit_urb(urb, GFP_ATOMIC); + if (retval) + dev_err(dev, "%s - usb_submit_urb failed with result: %d\n", + __func__, retval); +} + +static int usbtouch_open(struct input_dev *input) +{ + struct usbtouch_usb *usbtouch = input_get_drvdata(input); + int r; + + usbtouch->irq->dev = interface_to_usbdev(usbtouch->interface); + + r = usb_autopm_get_interface(usbtouch->interface) ? -EIO : 0; + if (r < 0) + goto out; + + if (!usbtouch->type->irq_always) { + if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) { + r = -EIO; + goto out_put; + } + } + + usbtouch->interface->needs_remote_wakeup = 1; +out_put: + usb_autopm_put_interface(usbtouch->interface); +out: + return r; +} + +static void usbtouch_close(struct input_dev *input) +{ + struct usbtouch_usb *usbtouch = input_get_drvdata(input); + int r; + + if (!usbtouch->type->irq_always) + usb_kill_urb(usbtouch->irq); + r = usb_autopm_get_interface(usbtouch->interface); + usbtouch->interface->needs_remote_wakeup = 0; + if (!r) + usb_autopm_put_interface(usbtouch->interface); +} + +static int usbtouch_suspend +(struct usb_interface *intf, pm_message_t message) +{ + struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); + + usb_kill_urb(usbtouch->irq); + + return 0; +} + +static int usbtouch_resume(struct usb_interface *intf) +{ + struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); + struct input_dev *input = usbtouch->input; + int result = 0; + + mutex_lock(&input->mutex); + if (input->users || usbtouch->type->irq_always) + result = usb_submit_urb(usbtouch->irq, GFP_NOIO); + mutex_unlock(&input->mutex); + + return result; +} + +static int usbtouch_reset_resume(struct usb_interface *intf) +{ + struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); + struct input_dev *input = usbtouch->input; + int err = 0; + + /* reinit the device */ + if (usbtouch->type->init) { + err = usbtouch->type->init(usbtouch); + if (err) { + dev_dbg(&intf->dev, + "%s - type->init() failed, err: %d\n", + __func__, err); + return err; + } + } + + /* restart IO if needed */ + mutex_lock(&input->mutex); + if (input->users) + err = usb_submit_urb(usbtouch->irq, GFP_NOIO); + mutex_unlock(&input->mutex); + + return err; +} + +static void usbtouch_free_buffers(struct usb_device *udev, + struct usbtouch_usb *usbtouch) +{ + usb_free_coherent(udev, usbtouch->data_size, + usbtouch->data, usbtouch->data_dma); + kfree(usbtouch->buffer); +} + +static struct usb_endpoint_descriptor * +usbtouch_get_input_endpoint(struct usb_host_interface *interface) +{ + int i; + + for (i = 0; i < interface->desc.bNumEndpoints; i++) + if (usb_endpoint_dir_in(&interface->endpoint[i].desc)) + return &interface->endpoint[i].desc; + + return NULL; +} + +static int usbtouch_probe(struct usb_interface *intf, + const struct usb_device_id *id) +{ + struct usbtouch_usb *usbtouch; + struct input_dev *input_dev; + struct usb_endpoint_descriptor *endpoint; + struct usb_device *udev = interface_to_usbdev(intf); + struct usbtouch_device_info *type; + int err = -ENOMEM; + + /* some devices are ignored */ + if (id->driver_info == DEVTYPE_IGNORE) + return -ENODEV; + + endpoint = usbtouch_get_input_endpoint(intf->cur_altsetting); + if (!endpoint) + return -ENXIO; + + usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!usbtouch || !input_dev) + goto out_free; + + type = &usbtouch_dev_info[id->driver_info]; + usbtouch->type = type; + if (!type->process_pkt) + type->process_pkt = usbtouch_process_pkt; + + usbtouch->data_size = type->rept_size; + if (type->get_pkt_len) { + /* + * When dealing with variable-length packets we should + * not request more than wMaxPacketSize bytes at once + * as we do not know if there is more data coming or + * we filled exactly wMaxPacketSize bytes and there is + * nothing else. + */ + usbtouch->data_size = min(usbtouch->data_size, + usb_endpoint_maxp(endpoint)); + } + + usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size, + GFP_KERNEL, &usbtouch->data_dma); + if (!usbtouch->data) + goto out_free; + + if (type->get_pkt_len) { + usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL); + if (!usbtouch->buffer) + goto out_free_buffers; + } + + usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); + if (!usbtouch->irq) { + dev_dbg(&intf->dev, + "%s - usb_alloc_urb failed: usbtouch->irq\n", __func__); + goto out_free_buffers; + } + + usbtouch->interface = intf; + usbtouch->input = input_dev; + + if (udev->manufacturer) + strlcpy(usbtouch->name, udev->manufacturer, sizeof(usbtouch->name)); + + if (udev->product) { + if (udev->manufacturer) + strlcat(usbtouch->name, " ", sizeof(usbtouch->name)); + strlcat(usbtouch->name, udev->product, sizeof(usbtouch->name)); + } + + if (!strlen(usbtouch->name)) + snprintf(usbtouch->name, sizeof(usbtouch->name), + "USB Touchscreen %04x:%04x", + le16_to_cpu(udev->descriptor.idVendor), + le16_to_cpu(udev->descriptor.idProduct)); + + usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys)); + strlcat(usbtouch->phys, "/input0", sizeof(usbtouch->phys)); + + input_dev->name = usbtouch->name; + input_dev->phys = usbtouch->phys; + usb_to_input_id(udev, &input_dev->id); + input_dev->dev.parent = &intf->dev; + + input_set_drvdata(input_dev, usbtouch); + + input_dev->open = usbtouch_open; + input_dev->close = usbtouch_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + input_set_abs_params(input_dev, ABS_X, type->min_xc, type->max_xc, 0, 0); + input_set_abs_params(input_dev, ABS_Y, type->min_yc, type->max_yc, 0, 0); + if (type->max_press) + input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press, + type->max_press, 0, 0); + + if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) + usb_fill_int_urb(usbtouch->irq, udev, + usb_rcvintpipe(udev, endpoint->bEndpointAddress), + usbtouch->data, usbtouch->data_size, + usbtouch_irq, usbtouch, endpoint->bInterval); + else + usb_fill_bulk_urb(usbtouch->irq, udev, + usb_rcvbulkpipe(udev, endpoint->bEndpointAddress), + usbtouch->data, usbtouch->data_size, + usbtouch_irq, usbtouch); + + usbtouch->irq->dev = udev; + usbtouch->irq->transfer_dma = usbtouch->data_dma; + usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + + /* device specific allocations */ + if (type->alloc) { + err = type->alloc(usbtouch); + if (err) { + dev_dbg(&intf->dev, + "%s - type->alloc() failed, err: %d\n", + __func__, err); + goto out_free_urb; + } + } + + /* device specific initialisation*/ + if (type->init) { + err = type->init(usbtouch); + if (err) { + dev_dbg(&intf->dev, + "%s - type->init() failed, err: %d\n", + __func__, err); + goto out_do_exit; + } + } + + err = input_register_device(usbtouch->input); + if (err) { + dev_dbg(&intf->dev, + "%s - input_register_device failed, err: %d\n", + __func__, err); + goto out_do_exit; + } + + usb_set_intfdata(intf, usbtouch); + + if (usbtouch->type->irq_always) { + /* this can't fail */ + usb_autopm_get_interface(intf); + err = usb_submit_urb(usbtouch->irq, GFP_KERNEL); + if (err) { + usb_autopm_put_interface(intf); + dev_err(&intf->dev, + "%s - usb_submit_urb failed with result: %d\n", + __func__, err); + goto out_unregister_input; + } + } + + return 0; + +out_unregister_input: + input_unregister_device(input_dev); + input_dev = NULL; +out_do_exit: + if (type->exit) + type->exit(usbtouch); +out_free_urb: + usb_free_urb(usbtouch->irq); +out_free_buffers: + usbtouch_free_buffers(udev, usbtouch); +out_free: + input_free_device(input_dev); + kfree(usbtouch); + return err; +} + +static void usbtouch_disconnect(struct usb_interface *intf) +{ + struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); + + if (!usbtouch) + return; + + dev_dbg(&intf->dev, + "%s - usbtouch is initialized, cleaning up\n", __func__); + + usb_set_intfdata(intf, NULL); + /* this will stop IO via close */ + input_unregister_device(usbtouch->input); + usb_free_urb(usbtouch->irq); + if (usbtouch->type->exit) + usbtouch->type->exit(usbtouch); + usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch); + kfree(usbtouch); +} + +MODULE_DEVICE_TABLE(usb, usbtouch_devices); + +static struct usb_driver usbtouch_driver = { + .name = "usbtouchscreen", + .probe = usbtouch_probe, + .disconnect = usbtouch_disconnect, + .suspend = usbtouch_suspend, + .resume = usbtouch_resume, + .reset_resume = usbtouch_reset_resume, + .id_table = usbtouch_devices, + .supports_autosuspend = 1, +}; + +module_usb_driver(usbtouch_driver); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +MODULE_ALIAS("touchkitusb"); +MODULE_ALIAS("itmtouch"); +MODULE_ALIAS("mtouchusb"); diff --git a/drivers/input/touchscreen/w90p910_ts.c b/drivers/input/touchscreen/w90p910_ts.c new file mode 100644 index 00000000..d2ef8f05 --- /dev/null +++ b/drivers/input/touchscreen/w90p910_ts.c @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2008 Nuvoton technology corporation. + * + * Wan ZongShun + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation;version 2 of the License. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* ADC controller bit defines */ +#define ADC_DELAY 0xf00 +#define ADC_DOWN 0x01 +#define ADC_TSC_Y (0x01 << 8) +#define ADC_TSC_X (0x00 << 8) +#define TSC_FOURWIRE (~(0x03 << 1)) +#define ADC_CLK_EN (0x01 << 28) /* ADC clock enable */ +#define ADC_READ_CON (0x01 << 12) +#define ADC_CONV (0x01 << 13) +#define ADC_SEMIAUTO (0x01 << 14) +#define ADC_WAITTRIG (0x03 << 14) +#define ADC_RST1 (0x01 << 16) +#define ADC_RST0 (0x00 << 16) +#define ADC_EN (0x01 << 17) +#define ADC_INT (0x01 << 18) +#define WT_INT (0x01 << 20) +#define ADC_INT_EN (0x01 << 21) +#define LVD_INT_EN (0x01 << 22) +#define WT_INT_EN (0x01 << 23) +#define ADC_DIV (0x04 << 1) /* div = 6 */ + +enum ts_state { + TS_WAIT_NEW_PACKET, /* We are waiting next touch report */ + TS_WAIT_X_COORD, /* We are waiting for ADC to report X coord */ + TS_WAIT_Y_COORD, /* We are waiting for ADC to report Y coord */ + TS_IDLE, /* Input device is closed, don't do anything */ +}; + +struct w90p910_ts { + struct input_dev *input; + struct timer_list timer; + struct clk *clk; + int irq_num; + void __iomem *ts_reg; + spinlock_t lock; + enum ts_state state; +}; + +static void w90p910_report_event(struct w90p910_ts *w90p910_ts, bool down) +{ + struct input_dev *dev = w90p910_ts->input; + + if (down) { + input_report_abs(dev, ABS_X, + __raw_readl(w90p910_ts->ts_reg + 0x0c)); + input_report_abs(dev, ABS_Y, + __raw_readl(w90p910_ts->ts_reg + 0x10)); + } + + input_report_key(dev, BTN_TOUCH, down); + input_sync(dev); +} + +static void w90p910_prepare_x_reading(struct w90p910_ts *w90p910_ts) +{ + unsigned long ctlreg; + + __raw_writel(ADC_TSC_X, w90p910_ts->ts_reg + 0x04); + ctlreg = __raw_readl(w90p910_ts->ts_reg); + ctlreg &= ~(ADC_WAITTRIG | WT_INT | WT_INT_EN); + ctlreg |= ADC_SEMIAUTO | ADC_INT_EN | ADC_CONV; + __raw_writel(ctlreg, w90p910_ts->ts_reg); + + w90p910_ts->state = TS_WAIT_X_COORD; +} + +static void w90p910_prepare_y_reading(struct w90p910_ts *w90p910_ts) +{ + unsigned long ctlreg; + + __raw_writel(ADC_TSC_Y, w90p910_ts->ts_reg + 0x04); + ctlreg = __raw_readl(w90p910_ts->ts_reg); + ctlreg &= ~(ADC_WAITTRIG | ADC_INT | WT_INT_EN); + ctlreg |= ADC_SEMIAUTO | ADC_INT_EN | ADC_CONV; + __raw_writel(ctlreg, w90p910_ts->ts_reg); + + w90p910_ts->state = TS_WAIT_Y_COORD; +} + +static void w90p910_prepare_next_packet(struct w90p910_ts *w90p910_ts) +{ + unsigned long ctlreg; + + ctlreg = __raw_readl(w90p910_ts->ts_reg); + ctlreg &= ~(ADC_INT | ADC_INT_EN | ADC_SEMIAUTO | ADC_CONV); + ctlreg |= ADC_WAITTRIG | WT_INT_EN; + __raw_writel(ctlreg, w90p910_ts->ts_reg); + + w90p910_ts->state = TS_WAIT_NEW_PACKET; +} + +static irqreturn_t w90p910_ts_interrupt(int irq, void *dev_id) +{ + struct w90p910_ts *w90p910_ts = dev_id; + unsigned long flags; + + spin_lock_irqsave(&w90p910_ts->lock, flags); + + switch (w90p910_ts->state) { + case TS_WAIT_NEW_PACKET: + /* + * The controller only generates interrupts when pen + * is down. + */ + del_timer(&w90p910_ts->timer); + w90p910_prepare_x_reading(w90p910_ts); + break; + + + case TS_WAIT_X_COORD: + w90p910_prepare_y_reading(w90p910_ts); + break; + + case TS_WAIT_Y_COORD: + w90p910_report_event(w90p910_ts, true); + w90p910_prepare_next_packet(w90p910_ts); + mod_timer(&w90p910_ts->timer, jiffies + msecs_to_jiffies(100)); + break; + + case TS_IDLE: + break; + } + + spin_unlock_irqrestore(&w90p910_ts->lock, flags); + + return IRQ_HANDLED; +} + +static void w90p910_check_pen_up(unsigned long data) +{ + struct w90p910_ts *w90p910_ts = (struct w90p910_ts *) data; + unsigned long flags; + + spin_lock_irqsave(&w90p910_ts->lock, flags); + + if (w90p910_ts->state == TS_WAIT_NEW_PACKET && + !(__raw_readl(w90p910_ts->ts_reg + 0x04) & ADC_DOWN)) { + + w90p910_report_event(w90p910_ts, false); + } + + spin_unlock_irqrestore(&w90p910_ts->lock, flags); +} + +static int w90p910_open(struct input_dev *dev) +{ + struct w90p910_ts *w90p910_ts = input_get_drvdata(dev); + unsigned long val; + + /* enable the ADC clock */ + clk_enable(w90p910_ts->clk); + + __raw_writel(ADC_RST1, w90p910_ts->ts_reg); + msleep(1); + __raw_writel(ADC_RST0, w90p910_ts->ts_reg); + msleep(1); + + /* set delay and screen type */ + val = __raw_readl(w90p910_ts->ts_reg + 0x04); + __raw_writel(val & TSC_FOURWIRE, w90p910_ts->ts_reg + 0x04); + __raw_writel(ADC_DELAY, w90p910_ts->ts_reg + 0x08); + + w90p910_ts->state = TS_WAIT_NEW_PACKET; + wmb(); + + /* set trigger mode */ + val = __raw_readl(w90p910_ts->ts_reg); + val |= ADC_WAITTRIG | ADC_DIV | ADC_EN | WT_INT_EN; + __raw_writel(val, w90p910_ts->ts_reg); + + return 0; +} + +static void w90p910_close(struct input_dev *dev) +{ + struct w90p910_ts *w90p910_ts = input_get_drvdata(dev); + unsigned long val; + + /* disable trigger mode */ + + spin_lock_irq(&w90p910_ts->lock); + + w90p910_ts->state = TS_IDLE; + + val = __raw_readl(w90p910_ts->ts_reg); + val &= ~(ADC_WAITTRIG | ADC_DIV | ADC_EN | WT_INT_EN | ADC_INT_EN); + __raw_writel(val, w90p910_ts->ts_reg); + + spin_unlock_irq(&w90p910_ts->lock); + + /* Now that interrupts are shut off we can safely delete timer */ + del_timer_sync(&w90p910_ts->timer); + + /* stop the ADC clock */ + clk_disable(w90p910_ts->clk); +} + +static int w90x900ts_probe(struct platform_device *pdev) +{ + struct w90p910_ts *w90p910_ts; + struct input_dev *input_dev; + struct resource *res; + int err; + + w90p910_ts = kzalloc(sizeof(struct w90p910_ts), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!w90p910_ts || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + w90p910_ts->input = input_dev; + w90p910_ts->state = TS_IDLE; + spin_lock_init(&w90p910_ts->lock); + setup_timer(&w90p910_ts->timer, w90p910_check_pen_up, + (unsigned long)w90p910_ts); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + err = -ENXIO; + goto fail1; + } + + if (!request_mem_region(res->start, resource_size(res), + pdev->name)) { + err = -EBUSY; + goto fail1; + } + + w90p910_ts->ts_reg = ioremap(res->start, resource_size(res)); + if (!w90p910_ts->ts_reg) { + err = -ENOMEM; + goto fail2; + } + + w90p910_ts->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(w90p910_ts->clk)) { + err = PTR_ERR(w90p910_ts->clk); + goto fail3; + } + + input_dev->name = "W90P910 TouchScreen"; + input_dev->phys = "w90p910ts/event0"; + input_dev->id.bustype = BUS_HOST; + input_dev->id.vendor = 0x0005; + input_dev->id.product = 0x0001; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &pdev->dev; + input_dev->open = w90p910_open; + input_dev->close = w90p910_close; + + input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + + input_set_abs_params(input_dev, ABS_X, 0, 0x400, 0, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 0x400, 0, 0); + + input_set_drvdata(input_dev, w90p910_ts); + + w90p910_ts->irq_num = platform_get_irq(pdev, 0); + if (request_irq(w90p910_ts->irq_num, w90p910_ts_interrupt, + 0, "w90p910ts", w90p910_ts)) { + err = -EBUSY; + goto fail4; + } + + err = input_register_device(w90p910_ts->input); + if (err) + goto fail5; + + platform_set_drvdata(pdev, w90p910_ts); + + return 0; + +fail5: free_irq(w90p910_ts->irq_num, w90p910_ts); +fail4: clk_put(w90p910_ts->clk); +fail3: iounmap(w90p910_ts->ts_reg); +fail2: release_mem_region(res->start, resource_size(res)); +fail1: input_free_device(input_dev); + kfree(w90p910_ts); + return err; +} + +static int w90x900ts_remove(struct platform_device *pdev) +{ + struct w90p910_ts *w90p910_ts = platform_get_drvdata(pdev); + struct resource *res; + + free_irq(w90p910_ts->irq_num, w90p910_ts); + del_timer_sync(&w90p910_ts->timer); + iounmap(w90p910_ts->ts_reg); + + clk_put(w90p910_ts->clk); + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); + + input_unregister_device(w90p910_ts->input); + kfree(w90p910_ts); + + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static struct platform_driver w90x900ts_driver = { + .probe = w90x900ts_probe, + .remove = w90x900ts_remove, + .driver = { + .name = "nuc900-ts", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(w90x900ts_driver); + +MODULE_AUTHOR("Wan ZongShun "); +MODULE_DESCRIPTION("w90p910 touch screen driver!"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:nuc900-ts"); diff --git a/drivers/input/touchscreen/wacom_i2c.c b/drivers/input/touchscreen/wacom_i2c.c new file mode 100644 index 00000000..bf0d0762 --- /dev/null +++ b/drivers/input/touchscreen/wacom_i2c.c @@ -0,0 +1,282 @@ +/* + * Wacom Penabled Driver for I2C + * + * Copyright (c) 2011 Tatsunosuke Tobita, Wacom. + * + * + * This program is free software; you can redistribute it + * and/or modify it under the terms of the GNU General + * Public License as published by the Free Software + * Foundation; either version of 2 of the License, + * or (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define WACOM_CMD_QUERY0 0x04 +#define WACOM_CMD_QUERY1 0x00 +#define WACOM_CMD_QUERY2 0x33 +#define WACOM_CMD_QUERY3 0x02 +#define WACOM_CMD_THROW0 0x05 +#define WACOM_CMD_THROW1 0x00 +#define WACOM_QUERY_SIZE 19 +#define WACOM_RETRY_CNT 100 + +struct wacom_features { + int x_max; + int y_max; + int pressure_max; + char fw_version; +}; + +struct wacom_i2c { + struct i2c_client *client; + struct input_dev *input; + u8 data[WACOM_QUERY_SIZE]; +}; + +static int wacom_query_device(struct i2c_client *client, + struct wacom_features *features) +{ + int ret; + u8 cmd1[] = { WACOM_CMD_QUERY0, WACOM_CMD_QUERY1, + WACOM_CMD_QUERY2, WACOM_CMD_QUERY3 }; + u8 cmd2[] = { WACOM_CMD_THROW0, WACOM_CMD_THROW1 }; + u8 data[WACOM_QUERY_SIZE]; + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = sizeof(cmd1), + .buf = cmd1, + }, + { + .addr = client->addr, + .flags = 0, + .len = sizeof(cmd2), + .buf = cmd2, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = sizeof(data), + .buf = data, + }, + }; + + ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); + if (ret < 0) + return ret; + if (ret != ARRAY_SIZE(msgs)) + return -EIO; + + features->x_max = get_unaligned_le16(&data[3]); + features->y_max = get_unaligned_le16(&data[5]); + features->pressure_max = get_unaligned_le16(&data[11]); + features->fw_version = get_unaligned_le16(&data[13]); + + dev_dbg(&client->dev, + "x_max:%d, y_max:%d, pressure:%d, fw:%d\n", + features->x_max, features->y_max, + features->pressure_max, features->fw_version); + + return 0; +} + +static irqreturn_t wacom_i2c_irq(int irq, void *dev_id) +{ + struct wacom_i2c *wac_i2c = dev_id; + struct input_dev *input = wac_i2c->input; + u8 *data = wac_i2c->data; + unsigned int x, y, pressure; + unsigned char tsw, f1, f2, ers; + int error; + + error = i2c_master_recv(wac_i2c->client, + wac_i2c->data, sizeof(wac_i2c->data)); + if (error < 0) + goto out; + + tsw = data[3] & 0x01; + ers = data[3] & 0x04; + f1 = data[3] & 0x02; + f2 = data[3] & 0x10; + x = le16_to_cpup((__le16 *)&data[4]); + y = le16_to_cpup((__le16 *)&data[6]); + pressure = le16_to_cpup((__le16 *)&data[8]); + + input_report_key(input, BTN_TOUCH, tsw || ers); + input_report_key(input, BTN_TOOL_PEN, tsw); + input_report_key(input, BTN_TOOL_RUBBER, ers); + input_report_key(input, BTN_STYLUS, f1); + input_report_key(input, BTN_STYLUS2, f2); + input_report_abs(input, ABS_X, x); + input_report_abs(input, ABS_Y, y); + input_report_abs(input, ABS_PRESSURE, pressure); + input_sync(input); + +out: + return IRQ_HANDLED; +} + +static int wacom_i2c_open(struct input_dev *dev) +{ + struct wacom_i2c *wac_i2c = input_get_drvdata(dev); + struct i2c_client *client = wac_i2c->client; + + enable_irq(client->irq); + + return 0; +} + +static void wacom_i2c_close(struct input_dev *dev) +{ + struct wacom_i2c *wac_i2c = input_get_drvdata(dev); + struct i2c_client *client = wac_i2c->client; + + disable_irq(client->irq); +} + +static int wacom_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct wacom_i2c *wac_i2c; + struct input_dev *input; + struct wacom_features features = { 0 }; + int error; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "i2c_check_functionality error\n"); + return -EIO; + } + + error = wacom_query_device(client, &features); + if (error) + return error; + + wac_i2c = kzalloc(sizeof(*wac_i2c), GFP_KERNEL); + input = input_allocate_device(); + if (!wac_i2c || !input) { + error = -ENOMEM; + goto err_free_mem; + } + + wac_i2c->client = client; + wac_i2c->input = input; + + input->name = "Wacom I2C Digitizer"; + input->id.bustype = BUS_I2C; + input->id.vendor = 0x56a; + input->id.version = features.fw_version; + input->dev.parent = &client->dev; + input->open = wacom_i2c_open; + input->close = wacom_i2c_close; + + input->evbit[0] |= BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + + __set_bit(BTN_TOOL_PEN, input->keybit); + __set_bit(BTN_TOOL_RUBBER, input->keybit); + __set_bit(BTN_STYLUS, input->keybit); + __set_bit(BTN_STYLUS2, input->keybit); + __set_bit(BTN_TOUCH, input->keybit); + + input_set_abs_params(input, ABS_X, 0, features.x_max, 0, 0); + input_set_abs_params(input, ABS_Y, 0, features.y_max, 0, 0); + input_set_abs_params(input, ABS_PRESSURE, + 0, features.pressure_max, 0, 0); + + input_set_drvdata(input, wac_i2c); + + error = request_threaded_irq(client->irq, NULL, wacom_i2c_irq, + IRQF_TRIGGER_LOW | IRQF_ONESHOT, + "wacom_i2c", wac_i2c); + if (error) { + dev_err(&client->dev, + "Failed to enable IRQ, error: %d\n", error); + goto err_free_mem; + } + + /* Disable the IRQ, we'll enable it in wac_i2c_open() */ + disable_irq(client->irq); + + error = input_register_device(wac_i2c->input); + if (error) { + dev_err(&client->dev, + "Failed to register input device, error: %d\n", error); + goto err_free_irq; + } + + i2c_set_clientdata(client, wac_i2c); + return 0; + +err_free_irq: + free_irq(client->irq, wac_i2c); +err_free_mem: + input_free_device(input); + kfree(wac_i2c); + + return error; +} + +static int wacom_i2c_remove(struct i2c_client *client) +{ + struct wacom_i2c *wac_i2c = i2c_get_clientdata(client); + + free_irq(client->irq, wac_i2c); + input_unregister_device(wac_i2c->input); + kfree(wac_i2c); + + return 0; +} + +#ifdef CONFIG_PM_SLEEP +static int wacom_i2c_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + disable_irq(client->irq); + + return 0; +} + +static int wacom_i2c_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + + enable_irq(client->irq); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(wacom_i2c_pm, wacom_i2c_suspend, wacom_i2c_resume); + +static const struct i2c_device_id wacom_i2c_id[] = { + { "WAC_I2C_EMR", 0 }, + { }, +}; +MODULE_DEVICE_TABLE(i2c, wacom_i2c_id); + +static struct i2c_driver wacom_i2c_driver = { + .driver = { + .name = "wacom_i2c", + .owner = THIS_MODULE, + .pm = &wacom_i2c_pm, + }, + + .probe = wacom_i2c_probe, + .remove = wacom_i2c_remove, + .id_table = wacom_i2c_id, +}; +module_i2c_driver(wacom_i2c_driver); + +MODULE_AUTHOR("Tatsunosuke Tobita "); +MODULE_DESCRIPTION("WACOM EMR I2C Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/wacom_w8001.c b/drivers/input/touchscreen/wacom_w8001.c new file mode 100644 index 00000000..9a83be6b --- /dev/null +++ b/drivers/input/touchscreen/wacom_w8001.c @@ -0,0 +1,597 @@ +/* + * Wacom W8001 penabled serial touchscreen driver + * + * Copyright (c) 2008 Jaya Kumar + * Copyright (c) 2010 Red Hat, Inc. + * Copyright (c) 2010 - 2011 Ping Cheng, Wacom. + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive for + * more details. + * + * Layout based on Elo serial touchscreen driver by Vojtech Pavlik + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESC "Wacom W8001 serial touchscreen driver" + +MODULE_AUTHOR("Jaya Kumar "); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + +#define W8001_MAX_LENGTH 11 +#define W8001_LEAD_MASK 0x80 +#define W8001_LEAD_BYTE 0x80 +#define W8001_TAB_MASK 0x40 +#define W8001_TAB_BYTE 0x40 +/* set in first byte of touch data packets */ +#define W8001_TOUCH_MASK (0x10 | W8001_LEAD_MASK) +#define W8001_TOUCH_BYTE (0x10 | W8001_LEAD_BYTE) + +#define W8001_QUERY_PACKET 0x20 + +#define W8001_CMD_STOP '0' +#define W8001_CMD_START '1' +#define W8001_CMD_QUERY '*' +#define W8001_CMD_TOUCHQUERY '%' + +/* length of data packets in bytes, depends on device. */ +#define W8001_PKTLEN_TOUCH93 5 +#define W8001_PKTLEN_TOUCH9A 7 +#define W8001_PKTLEN_TPCPEN 9 +#define W8001_PKTLEN_TPCCTL 11 /* control packet */ +#define W8001_PKTLEN_TOUCH2FG 13 + +/* resolution in points/mm */ +#define W8001_PEN_RESOLUTION 100 +#define W8001_TOUCH_RESOLUTION 10 + +struct w8001_coord { + u8 rdy; + u8 tsw; + u8 f1; + u8 f2; + u16 x; + u16 y; + u16 pen_pressure; + u8 tilt_x; + u8 tilt_y; +}; + +/* touch query reply packet */ +struct w8001_touch_query { + u16 x; + u16 y; + u8 panel_res; + u8 capacity_res; + u8 sensor_id; +}; + +/* + * Per-touchscreen data. + */ + +struct w8001 { + struct input_dev *dev; + struct serio *serio; + struct completion cmd_done; + int id; + int idx; + unsigned char response_type; + unsigned char response[W8001_MAX_LENGTH]; + unsigned char data[W8001_MAX_LENGTH]; + char phys[32]; + int type; + unsigned int pktlen; + u16 max_touch_x; + u16 max_touch_y; + u16 max_pen_x; + u16 max_pen_y; + char name[64]; +}; + +static void parse_pen_data(u8 *data, struct w8001_coord *coord) +{ + memset(coord, 0, sizeof(*coord)); + + coord->rdy = data[0] & 0x20; + coord->tsw = data[0] & 0x01; + coord->f1 = data[0] & 0x02; + coord->f2 = data[0] & 0x04; + + coord->x = (data[1] & 0x7F) << 9; + coord->x |= (data[2] & 0x7F) << 2; + coord->x |= (data[6] & 0x60) >> 5; + + coord->y = (data[3] & 0x7F) << 9; + coord->y |= (data[4] & 0x7F) << 2; + coord->y |= (data[6] & 0x18) >> 3; + + coord->pen_pressure = data[5] & 0x7F; + coord->pen_pressure |= (data[6] & 0x07) << 7 ; + + coord->tilt_x = data[7] & 0x7F; + coord->tilt_y = data[8] & 0x7F; +} + +static void parse_single_touch(u8 *data, struct w8001_coord *coord) +{ + coord->x = (data[1] << 7) | data[2]; + coord->y = (data[3] << 7) | data[4]; + coord->tsw = data[0] & 0x01; +} + +static void scale_touch_coordinates(struct w8001 *w8001, + unsigned int *x, unsigned int *y) +{ + if (w8001->max_pen_x && w8001->max_touch_x) + *x = *x * w8001->max_pen_x / w8001->max_touch_x; + + if (w8001->max_pen_y && w8001->max_touch_y) + *y = *y * w8001->max_pen_y / w8001->max_touch_y; +} + +static void parse_multi_touch(struct w8001 *w8001) +{ + struct input_dev *dev = w8001->dev; + unsigned char *data = w8001->data; + unsigned int x, y; + int i; + int count = 0; + + for (i = 0; i < 2; i++) { + bool touch = data[0] & (1 << i); + + input_mt_slot(dev, i); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, touch); + if (touch) { + x = (data[6 * i + 1] << 7) | data[6 * i + 2]; + y = (data[6 * i + 3] << 7) | data[6 * i + 4]; + /* data[5,6] and [11,12] is finger capacity */ + + /* scale to pen maximum */ + scale_touch_coordinates(w8001, &x, &y); + + input_report_abs(dev, ABS_MT_POSITION_X, x); + input_report_abs(dev, ABS_MT_POSITION_Y, y); + count++; + } + } + + /* emulate single touch events when stylus is out of proximity. + * This is to make single touch backward support consistent + * across all Wacom single touch devices. + */ + if (w8001->type != BTN_TOOL_PEN && + w8001->type != BTN_TOOL_RUBBER) { + w8001->type = count == 1 ? BTN_TOOL_FINGER : KEY_RESERVED; + input_mt_report_pointer_emulation(dev, true); + } + + input_sync(dev); +} + +static void parse_touchquery(u8 *data, struct w8001_touch_query *query) +{ + memset(query, 0, sizeof(*query)); + + query->panel_res = data[1]; + query->sensor_id = data[2] & 0x7; + query->capacity_res = data[7]; + + query->x = data[3] << 9; + query->x |= data[4] << 2; + query->x |= (data[2] >> 5) & 0x3; + + query->y = data[5] << 9; + query->y |= data[6] << 2; + query->y |= (data[2] >> 3) & 0x3; + + /* Early days' single-finger touch models need the following defaults */ + if (!query->x && !query->y) { + query->x = 1024; + query->y = 1024; + if (query->panel_res) + query->x = query->y = (1 << query->panel_res); + query->panel_res = W8001_TOUCH_RESOLUTION; + } +} + +static void report_pen_events(struct w8001 *w8001, struct w8001_coord *coord) +{ + struct input_dev *dev = w8001->dev; + + /* + * We have 1 bit for proximity (rdy) and 3 bits for tip, side, + * side2/eraser. If rdy && f2 are set, this can be either pen + side2, + * or eraser. Assume: + * - if dev is already in proximity and f2 is toggled → pen + side2 + * - if dev comes into proximity with f2 set → eraser + * If f2 disappears after assuming eraser, fake proximity out for + * eraser and in for pen. + */ + + switch (w8001->type) { + case BTN_TOOL_RUBBER: + if (!coord->f2) { + input_report_abs(dev, ABS_PRESSURE, 0); + input_report_key(dev, BTN_TOUCH, 0); + input_report_key(dev, BTN_STYLUS, 0); + input_report_key(dev, BTN_STYLUS2, 0); + input_report_key(dev, BTN_TOOL_RUBBER, 0); + input_sync(dev); + w8001->type = BTN_TOOL_PEN; + } + break; + + case BTN_TOOL_FINGER: + input_report_key(dev, BTN_TOUCH, 0); + input_report_key(dev, BTN_TOOL_FINGER, 0); + input_sync(dev); + /* fall through */ + + case KEY_RESERVED: + w8001->type = coord->f2 ? BTN_TOOL_RUBBER : BTN_TOOL_PEN; + break; + + default: + input_report_key(dev, BTN_STYLUS2, coord->f2); + break; + } + + input_report_abs(dev, ABS_X, coord->x); + input_report_abs(dev, ABS_Y, coord->y); + input_report_abs(dev, ABS_PRESSURE, coord->pen_pressure); + input_report_key(dev, BTN_TOUCH, coord->tsw); + input_report_key(dev, BTN_STYLUS, coord->f1); + input_report_key(dev, w8001->type, coord->rdy); + input_sync(dev); + + if (!coord->rdy) + w8001->type = KEY_RESERVED; +} + +static void report_single_touch(struct w8001 *w8001, struct w8001_coord *coord) +{ + struct input_dev *dev = w8001->dev; + unsigned int x = coord->x; + unsigned int y = coord->y; + + /* scale to pen maximum */ + scale_touch_coordinates(w8001, &x, &y); + + input_report_abs(dev, ABS_X, x); + input_report_abs(dev, ABS_Y, y); + input_report_key(dev, BTN_TOUCH, coord->tsw); + input_report_key(dev, BTN_TOOL_FINGER, coord->tsw); + + input_sync(dev); + + w8001->type = coord->tsw ? BTN_TOOL_FINGER : KEY_RESERVED; +} + +static irqreturn_t w8001_interrupt(struct serio *serio, + unsigned char data, unsigned int flags) +{ + struct w8001 *w8001 = serio_get_drvdata(serio); + struct w8001_coord coord; + unsigned char tmp; + + w8001->data[w8001->idx] = data; + switch (w8001->idx++) { + case 0: + if ((data & W8001_LEAD_MASK) != W8001_LEAD_BYTE) { + pr_debug("w8001: unsynchronized data: 0x%02x\n", data); + w8001->idx = 0; + } + break; + + case W8001_PKTLEN_TOUCH93 - 1: + case W8001_PKTLEN_TOUCH9A - 1: + tmp = w8001->data[0] & W8001_TOUCH_BYTE; + if (tmp != W8001_TOUCH_BYTE) + break; + + if (w8001->pktlen == w8001->idx) { + w8001->idx = 0; + if (w8001->type != BTN_TOOL_PEN && + w8001->type != BTN_TOOL_RUBBER) { + parse_single_touch(w8001->data, &coord); + report_single_touch(w8001, &coord); + } + } + break; + + /* Pen coordinates packet */ + case W8001_PKTLEN_TPCPEN - 1: + tmp = w8001->data[0] & W8001_TAB_MASK; + if (unlikely(tmp == W8001_TAB_BYTE)) + break; + + tmp = w8001->data[0] & W8001_TOUCH_BYTE; + if (tmp == W8001_TOUCH_BYTE) + break; + + w8001->idx = 0; + parse_pen_data(w8001->data, &coord); + report_pen_events(w8001, &coord); + break; + + /* control packet */ + case W8001_PKTLEN_TPCCTL - 1: + tmp = w8001->data[0] & W8001_TOUCH_MASK; + if (tmp == W8001_TOUCH_BYTE) + break; + + w8001->idx = 0; + memcpy(w8001->response, w8001->data, W8001_MAX_LENGTH); + w8001->response_type = W8001_QUERY_PACKET; + complete(&w8001->cmd_done); + break; + + /* 2 finger touch packet */ + case W8001_PKTLEN_TOUCH2FG - 1: + w8001->idx = 0; + parse_multi_touch(w8001); + break; + } + + return IRQ_HANDLED; +} + +static int w8001_command(struct w8001 *w8001, unsigned char command, + bool wait_response) +{ + int rc; + + w8001->response_type = 0; + init_completion(&w8001->cmd_done); + + rc = serio_write(w8001->serio, command); + if (rc == 0 && wait_response) { + + wait_for_completion_timeout(&w8001->cmd_done, HZ); + if (w8001->response_type != W8001_QUERY_PACKET) + rc = -EIO; + } + + return rc; +} + +static int w8001_open(struct input_dev *dev) +{ + struct w8001 *w8001 = input_get_drvdata(dev); + + return w8001_command(w8001, W8001_CMD_START, false); +} + +static void w8001_close(struct input_dev *dev) +{ + struct w8001 *w8001 = input_get_drvdata(dev); + + w8001_command(w8001, W8001_CMD_STOP, false); +} + +static int w8001_setup(struct w8001 *w8001) +{ + struct input_dev *dev = w8001->dev; + struct w8001_coord coord; + struct w8001_touch_query touch; + int error; + + error = w8001_command(w8001, W8001_CMD_STOP, false); + if (error) + return error; + + msleep(250); /* wait 250ms before querying the device */ + + dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); + strlcat(w8001->name, "Wacom Serial", sizeof(w8001->name)); + + __set_bit(INPUT_PROP_DIRECT, dev->propbit); + + /* penabled? */ + error = w8001_command(w8001, W8001_CMD_QUERY, true); + if (!error) { + __set_bit(BTN_TOUCH, dev->keybit); + __set_bit(BTN_TOOL_PEN, dev->keybit); + __set_bit(BTN_TOOL_RUBBER, dev->keybit); + __set_bit(BTN_STYLUS, dev->keybit); + __set_bit(BTN_STYLUS2, dev->keybit); + + parse_pen_data(w8001->response, &coord); + w8001->max_pen_x = coord.x; + w8001->max_pen_y = coord.y; + + input_set_abs_params(dev, ABS_X, 0, coord.x, 0, 0); + input_set_abs_params(dev, ABS_Y, 0, coord.y, 0, 0); + input_abs_set_res(dev, ABS_X, W8001_PEN_RESOLUTION); + input_abs_set_res(dev, ABS_Y, W8001_PEN_RESOLUTION); + input_set_abs_params(dev, ABS_PRESSURE, 0, coord.pen_pressure, 0, 0); + if (coord.tilt_x && coord.tilt_y) { + input_set_abs_params(dev, ABS_TILT_X, 0, coord.tilt_x, 0, 0); + input_set_abs_params(dev, ABS_TILT_Y, 0, coord.tilt_y, 0, 0); + } + w8001->id = 0x90; + strlcat(w8001->name, " Penabled", sizeof(w8001->name)); + } + + /* Touch enabled? */ + error = w8001_command(w8001, W8001_CMD_TOUCHQUERY, true); + + /* + * Some non-touch devices may reply to the touch query. But their + * second byte is empty, which indicates touch is not supported. + */ + if (!error && w8001->response[1]) { + __set_bit(BTN_TOUCH, dev->keybit); + __set_bit(BTN_TOOL_FINGER, dev->keybit); + + parse_touchquery(w8001->response, &touch); + w8001->max_touch_x = touch.x; + w8001->max_touch_y = touch.y; + + if (w8001->max_pen_x && w8001->max_pen_y) { + /* if pen is supported scale to pen maximum */ + touch.x = w8001->max_pen_x; + touch.y = w8001->max_pen_y; + touch.panel_res = W8001_PEN_RESOLUTION; + } + + input_set_abs_params(dev, ABS_X, 0, touch.x, 0, 0); + input_set_abs_params(dev, ABS_Y, 0, touch.y, 0, 0); + input_abs_set_res(dev, ABS_X, touch.panel_res); + input_abs_set_res(dev, ABS_Y, touch.panel_res); + + switch (touch.sensor_id) { + case 0: + case 2: + w8001->pktlen = W8001_PKTLEN_TOUCH93; + w8001->id = 0x93; + strlcat(w8001->name, " 1FG", sizeof(w8001->name)); + break; + + case 1: + case 3: + case 4: + w8001->pktlen = W8001_PKTLEN_TOUCH9A; + strlcat(w8001->name, " 1FG", sizeof(w8001->name)); + w8001->id = 0x9a; + break; + + case 5: + w8001->pktlen = W8001_PKTLEN_TOUCH2FG; + + input_mt_init_slots(dev, 2, 0); + input_set_abs_params(dev, ABS_MT_POSITION_X, + 0, touch.x, 0, 0); + input_set_abs_params(dev, ABS_MT_POSITION_Y, + 0, touch.y, 0, 0); + input_set_abs_params(dev, ABS_MT_TOOL_TYPE, + 0, MT_TOOL_MAX, 0, 0); + + strlcat(w8001->name, " 2FG", sizeof(w8001->name)); + if (w8001->max_pen_x && w8001->max_pen_y) + w8001->id = 0xE3; + else + w8001->id = 0xE2; + break; + } + } + + strlcat(w8001->name, " Touchscreen", sizeof(w8001->name)); + + return 0; +} + +/* + * w8001_disconnect() is the opposite of w8001_connect() + */ + +static void w8001_disconnect(struct serio *serio) +{ + struct w8001 *w8001 = serio_get_drvdata(serio); + + serio_close(serio); + + input_unregister_device(w8001->dev); + kfree(w8001); + + serio_set_drvdata(serio, NULL); +} + +/* + * w8001_connect() is the routine that is called when someone adds a + * new serio device that supports the w8001 protocol and registers it as + * an input device. + */ + +static int w8001_connect(struct serio *serio, struct serio_driver *drv) +{ + struct w8001 *w8001; + struct input_dev *input_dev; + int err; + + w8001 = kzalloc(sizeof(struct w8001), GFP_KERNEL); + input_dev = input_allocate_device(); + if (!w8001 || !input_dev) { + err = -ENOMEM; + goto fail1; + } + + w8001->serio = serio; + w8001->dev = input_dev; + init_completion(&w8001->cmd_done); + snprintf(w8001->phys, sizeof(w8001->phys), "%s/input0", serio->phys); + + serio_set_drvdata(serio, w8001); + err = serio_open(serio, drv); + if (err) + goto fail2; + + err = w8001_setup(w8001); + if (err) + goto fail3; + + input_dev->name = w8001->name; + input_dev->phys = w8001->phys; + input_dev->id.product = w8001->id; + input_dev->id.bustype = BUS_RS232; + input_dev->id.vendor = 0x056a; + input_dev->id.version = 0x0100; + input_dev->dev.parent = &serio->dev; + + input_dev->open = w8001_open; + input_dev->close = w8001_close; + + input_set_drvdata(input_dev, w8001); + + err = input_register_device(w8001->dev); + if (err) + goto fail3; + + return 0; + +fail3: + serio_close(serio); +fail2: + serio_set_drvdata(serio, NULL); +fail1: + input_free_device(input_dev); + kfree(w8001); + return err; +} + +static struct serio_device_id w8001_serio_ids[] = { + { + .type = SERIO_RS232, + .proto = SERIO_W8001, + .id = SERIO_ANY, + .extra = SERIO_ANY, + }, + { 0 } +}; + +MODULE_DEVICE_TABLE(serio, w8001_serio_ids); + +static struct serio_driver w8001_drv = { + .driver = { + .name = "w8001", + }, + .description = DRIVER_DESC, + .id_table = w8001_serio_ids, + .interrupt = w8001_interrupt, + .connect = w8001_connect, + .disconnect = w8001_disconnect, +}; + +module_serio_driver(w8001_drv); diff --git a/drivers/input/touchscreen/wm831x-ts.c b/drivers/input/touchscreen/wm831x-ts.c new file mode 100644 index 00000000..6be2eb6a --- /dev/null +++ b/drivers/input/touchscreen/wm831x-ts.c @@ -0,0 +1,407 @@ +/* + * Touchscreen driver for WM831x PMICs + * + * Copyright 2011 Wolfson Microelectronics plc. + * Author: Mark Brown + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * R16424 (0x4028) - Touch Control 1 + */ +#define WM831X_TCH_ENA 0x8000 /* TCH_ENA */ +#define WM831X_TCH_CVT_ENA 0x4000 /* TCH_CVT_ENA */ +#define WM831X_TCH_SLPENA 0x1000 /* TCH_SLPENA */ +#define WM831X_TCH_Z_ENA 0x0400 /* TCH_Z_ENA */ +#define WM831X_TCH_Y_ENA 0x0200 /* TCH_Y_ENA */ +#define WM831X_TCH_X_ENA 0x0100 /* TCH_X_ENA */ +#define WM831X_TCH_DELAY_MASK 0x00E0 /* TCH_DELAY - [7:5] */ +#define WM831X_TCH_DELAY_SHIFT 5 /* TCH_DELAY - [7:5] */ +#define WM831X_TCH_DELAY_WIDTH 3 /* TCH_DELAY - [7:5] */ +#define WM831X_TCH_RATE_MASK 0x001F /* TCH_RATE - [4:0] */ +#define WM831X_TCH_RATE_SHIFT 0 /* TCH_RATE - [4:0] */ +#define WM831X_TCH_RATE_WIDTH 5 /* TCH_RATE - [4:0] */ + +/* + * R16425 (0x4029) - Touch Control 2 + */ +#define WM831X_TCH_PD_WK 0x2000 /* TCH_PD_WK */ +#define WM831X_TCH_5WIRE 0x1000 /* TCH_5WIRE */ +#define WM831X_TCH_PDONLY 0x0800 /* TCH_PDONLY */ +#define WM831X_TCH_ISEL 0x0100 /* TCH_ISEL */ +#define WM831X_TCH_RPU_MASK 0x000F /* TCH_RPU - [3:0] */ +#define WM831X_TCH_RPU_SHIFT 0 /* TCH_RPU - [3:0] */ +#define WM831X_TCH_RPU_WIDTH 4 /* TCH_RPU - [3:0] */ + +/* + * R16426-8 (0x402A-C) - Touch Data X/Y/X + */ +#define WM831X_TCH_PD 0x8000 /* TCH_PD1 */ +#define WM831X_TCH_DATA_MASK 0x0FFF /* TCH_DATA - [11:0] */ +#define WM831X_TCH_DATA_SHIFT 0 /* TCH_DATA - [11:0] */ +#define WM831X_TCH_DATA_WIDTH 12 /* TCH_DATA - [11:0] */ + +struct wm831x_ts { + struct input_dev *input_dev; + struct wm831x *wm831x; + unsigned int data_irq; + unsigned int pd_irq; + bool pressure; + bool pen_down; + struct work_struct pd_data_work; +}; + +static void wm831x_pd_data_work(struct work_struct *work) +{ + struct wm831x_ts *wm831x_ts = + container_of(work, struct wm831x_ts, pd_data_work); + + if (wm831x_ts->pen_down) { + enable_irq(wm831x_ts->data_irq); + dev_dbg(wm831x_ts->wm831x->dev, "IRQ PD->DATA done\n"); + } else { + enable_irq(wm831x_ts->pd_irq); + dev_dbg(wm831x_ts->wm831x->dev, "IRQ DATA->PD done\n"); + } +} + +static irqreturn_t wm831x_ts_data_irq(int irq, void *irq_data) +{ + struct wm831x_ts *wm831x_ts = irq_data; + struct wm831x *wm831x = wm831x_ts->wm831x; + static int data_types[] = { ABS_X, ABS_Y, ABS_PRESSURE }; + u16 data[3]; + int count; + int i, ret; + + if (wm831x_ts->pressure) + count = 3; + else + count = 2; + + wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1, + WM831X_TCHDATA_EINT, WM831X_TCHDATA_EINT); + + ret = wm831x_bulk_read(wm831x, WM831X_TOUCH_DATA_X, count, + data); + if (ret != 0) { + dev_err(wm831x->dev, "Failed to read touch data: %d\n", + ret); + return IRQ_NONE; + } + + /* + * We get a pen down reading on every reading, report pen up if any + * individual reading does so. + */ + wm831x_ts->pen_down = true; + for (i = 0; i < count; i++) { + if (!(data[i] & WM831X_TCH_PD)) { + wm831x_ts->pen_down = false; + continue; + } + input_report_abs(wm831x_ts->input_dev, data_types[i], + data[i] & WM831X_TCH_DATA_MASK); + } + + if (!wm831x_ts->pen_down) { + /* Switch from data to pen down */ + dev_dbg(wm831x->dev, "IRQ DATA->PD\n"); + + disable_irq_nosync(wm831x_ts->data_irq); + + /* Don't need data any more */ + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, + WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | + WM831X_TCH_Z_ENA, 0); + + /* Flush any final samples that arrived while reading */ + wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1, + WM831X_TCHDATA_EINT, WM831X_TCHDATA_EINT); + + wm831x_bulk_read(wm831x, WM831X_TOUCH_DATA_X, count, data); + + if (wm831x_ts->pressure) + input_report_abs(wm831x_ts->input_dev, + ABS_PRESSURE, 0); + + input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 0); + + schedule_work(&wm831x_ts->pd_data_work); + } else { + input_report_key(wm831x_ts->input_dev, BTN_TOUCH, 1); + } + + input_sync(wm831x_ts->input_dev); + + return IRQ_HANDLED; +} + +static irqreturn_t wm831x_ts_pen_down_irq(int irq, void *irq_data) +{ + struct wm831x_ts *wm831x_ts = irq_data; + struct wm831x *wm831x = wm831x_ts->wm831x; + int ena = 0; + + if (wm831x_ts->pen_down) + return IRQ_HANDLED; + + disable_irq_nosync(wm831x_ts->pd_irq); + + /* Start collecting data */ + if (wm831x_ts->pressure) + ena |= WM831X_TCH_Z_ENA; + + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, + WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, + WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | ena); + + wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1, + WM831X_TCHPD_EINT, WM831X_TCHPD_EINT); + + wm831x_ts->pen_down = true; + + /* Switch from pen down to data */ + dev_dbg(wm831x->dev, "IRQ PD->DATA\n"); + schedule_work(&wm831x_ts->pd_data_work); + + return IRQ_HANDLED; +} + +static int wm831x_ts_input_open(struct input_dev *idev) +{ + struct wm831x_ts *wm831x_ts = input_get_drvdata(idev); + struct wm831x *wm831x = wm831x_ts->wm831x; + + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, + WM831X_TCH_ENA | WM831X_TCH_CVT_ENA | + WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA | + WM831X_TCH_Z_ENA, WM831X_TCH_ENA); + + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, + WM831X_TCH_CVT_ENA, WM831X_TCH_CVT_ENA); + + return 0; +} + +static void wm831x_ts_input_close(struct input_dev *idev) +{ + struct wm831x_ts *wm831x_ts = input_get_drvdata(idev); + struct wm831x *wm831x = wm831x_ts->wm831x; + + /* Shut the controller down, disabling all other functionality too */ + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, + WM831X_TCH_ENA | WM831X_TCH_X_ENA | + WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, 0); + + /* Make sure any pending IRQs are done, the above will prevent + * new ones firing. + */ + synchronize_irq(wm831x_ts->data_irq); + synchronize_irq(wm831x_ts->pd_irq); + + /* Make sure the IRQ completion work is quiesced */ + flush_work(&wm831x_ts->pd_data_work); + + /* If we ended up with the pen down then make sure we revert back + * to pen detection state for the next time we start up. + */ + if (wm831x_ts->pen_down) { + disable_irq(wm831x_ts->data_irq); + enable_irq(wm831x_ts->pd_irq); + wm831x_ts->pen_down = false; + } +} + +static int wm831x_ts_probe(struct platform_device *pdev) +{ + struct wm831x_ts *wm831x_ts; + struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent); + struct wm831x_pdata *core_pdata = dev_get_platdata(pdev->dev.parent); + struct wm831x_touch_pdata *pdata = NULL; + struct input_dev *input_dev; + int error, irqf; + + if (core_pdata) + pdata = core_pdata->touch; + + wm831x_ts = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ts), + GFP_KERNEL); + input_dev = devm_input_allocate_device(&pdev->dev); + if (!wm831x_ts || !input_dev) { + error = -ENOMEM; + goto err_alloc; + } + + wm831x_ts->wm831x = wm831x; + wm831x_ts->input_dev = input_dev; + INIT_WORK(&wm831x_ts->pd_data_work, wm831x_pd_data_work); + + /* + * If we have a direct IRQ use it, otherwise use the interrupt + * from the WM831x IRQ controller. + */ + wm831x_ts->data_irq = wm831x_irq(wm831x, + platform_get_irq_byname(pdev, + "TCHDATA")); + if (pdata && pdata->data_irq) + wm831x_ts->data_irq = pdata->data_irq; + + wm831x_ts->pd_irq = wm831x_irq(wm831x, + platform_get_irq_byname(pdev, "TCHPD")); + if (pdata && pdata->pd_irq) + wm831x_ts->pd_irq = pdata->pd_irq; + + if (pdata) + wm831x_ts->pressure = pdata->pressure; + else + wm831x_ts->pressure = true; + + /* Five wire touchscreens can't report pressure */ + if (pdata && pdata->fivewire) { + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2, + WM831X_TCH_5WIRE, WM831X_TCH_5WIRE); + + /* Pressure measurements are not possible for five wire mode */ + WARN_ON(pdata->pressure && pdata->fivewire); + wm831x_ts->pressure = false; + } else { + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2, + WM831X_TCH_5WIRE, 0); + } + + if (pdata) { + switch (pdata->isel) { + default: + dev_err(&pdev->dev, "Unsupported ISEL setting: %d\n", + pdata->isel); + /* Fall through */ + case 200: + case 0: + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2, + WM831X_TCH_ISEL, 0); + break; + case 400: + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2, + WM831X_TCH_ISEL, WM831X_TCH_ISEL); + break; + } + } + + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2, + WM831X_TCH_PDONLY, 0); + + /* Default to 96 samples/sec */ + wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1, + WM831X_TCH_RATE_MASK, 6); + + if (pdata && pdata->data_irqf) + irqf = pdata->data_irqf; + else + irqf = IRQF_TRIGGER_HIGH; + + error = request_threaded_irq(wm831x_ts->data_irq, + NULL, wm831x_ts_data_irq, + irqf | IRQF_ONESHOT, + "Touchscreen data", wm831x_ts); + if (error) { + dev_err(&pdev->dev, "Failed to request data IRQ %d: %d\n", + wm831x_ts->data_irq, error); + goto err_alloc; + } + disable_irq(wm831x_ts->data_irq); + + if (pdata && pdata->pd_irqf) + irqf = pdata->pd_irqf; + else + irqf = IRQF_TRIGGER_HIGH; + + error = request_threaded_irq(wm831x_ts->pd_irq, + NULL, wm831x_ts_pen_down_irq, + irqf | IRQF_ONESHOT, + "Touchscreen pen down", wm831x_ts); + if (error) { + dev_err(&pdev->dev, "Failed to request pen down IRQ %d: %d\n", + wm831x_ts->pd_irq, error); + goto err_data_irq; + } + + /* set up touch configuration */ + input_dev->name = "WM831x touchscreen"; + input_dev->phys = "wm831x"; + input_dev->open = wm831x_ts_input_open; + input_dev->close = wm831x_ts_input_close; + + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + + input_set_abs_params(input_dev, ABS_X, 0, 4095, 5, 0); + input_set_abs_params(input_dev, ABS_Y, 0, 4095, 5, 0); + if (wm831x_ts->pressure) + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 4095, 5, 0); + + input_set_drvdata(input_dev, wm831x_ts); + input_dev->dev.parent = &pdev->dev; + + error = input_register_device(input_dev); + if (error) + goto err_pd_irq; + + platform_set_drvdata(pdev, wm831x_ts); + return 0; + +err_pd_irq: + free_irq(wm831x_ts->pd_irq, wm831x_ts); +err_data_irq: + free_irq(wm831x_ts->data_irq, wm831x_ts); +err_alloc: + + return error; +} + +static int wm831x_ts_remove(struct platform_device *pdev) +{ + struct wm831x_ts *wm831x_ts = platform_get_drvdata(pdev); + + free_irq(wm831x_ts->pd_irq, wm831x_ts); + free_irq(wm831x_ts->data_irq, wm831x_ts); + + return 0; +} + +static struct platform_driver wm831x_ts_driver = { + .driver = { + .name = "wm831x-touch", + .owner = THIS_MODULE, + }, + .probe = wm831x_ts_probe, + .remove = wm831x_ts_remove, +}; +module_platform_driver(wm831x_ts_driver); + +/* Module information */ +MODULE_AUTHOR("Mark Brown "); +MODULE_DESCRIPTION("WM831x PMIC touchscreen driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:wm831x-touch"); diff --git a/drivers/input/touchscreen/wm9705.c b/drivers/input/touchscreen/wm9705.c new file mode 100644 index 00000000..adc13a52 --- /dev/null +++ b/drivers/input/touchscreen/wm9705.c @@ -0,0 +1,350 @@ +/* + * wm9705.c -- Codec driver for Wolfson WM9705 AC97 Codec. + * + * Copyright 2003, 2004, 2005, 2006, 2007 Wolfson Microelectronics PLC. + * Author: Liam Girdwood + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * Russell King + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define TS_NAME "wm97xx" +#define WM9705_VERSION "1.00" +#define DEFAULT_PRESSURE 0xb0c0 + +/* + * Module parameters + */ + +/* + * Set current used for pressure measurement. + * + * Set pil = 2 to use 400uA + * pil = 1 to use 200uA and + * pil = 0 to disable pressure measurement. + * + * This is used to increase the range of values returned by the adc + * when measureing touchpanel pressure. + */ +static int pil; +module_param(pil, int, 0); +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); + +/* + * Set threshold for pressure measurement. + * + * Pen down pressure below threshold is ignored. + */ +static int pressure = DEFAULT_PRESSURE & 0xfff; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); + +/* + * Set adc sample delay. + * + * For accurate touchpanel measurements, some settling time may be + * required between the switch matrix applying a voltage across the + * touchpanel plate and the ADC sampling the signal. + * + * This delay can be set by setting delay = n, where n is the array + * position of the delay in the array delay_table below. + * Long delays > 1ms are supported for completeness, but are not + * recommended. + */ +static int delay = 4; +module_param(delay, int, 0); +MODULE_PARM_DESC(delay, "Set adc sample delay."); + +/* + * Pen detect comparator threshold. + * + * 0 to Vmid in 15 steps, 0 = use zero power comparator with Vmid threshold + * i.e. 1 = Vmid/15 threshold + * 15 = Vmid/1 threshold + * + * Adjust this value if you are having problems with pen detect not + * detecting any down events. + */ +static int pdd = 8; +module_param(pdd, int, 0); +MODULE_PARM_DESC(pdd, "Set pen detect comparator threshold"); + +/* + * Set adc mask function. + * + * Sources of glitch noise, such as signals driving an LCD display, may feed + * through to the touch screen plates and affect measurement accuracy. In + * order to minimise this, a signal may be applied to the MASK pin to delay or + * synchronise the sampling. + * + * 0 = No delay or sync + * 1 = High on pin stops conversions + * 2 = Edge triggered, edge on pin delays conversion by delay param (above) + * 3 = Edge triggered, edge on pin starts conversion after delay param + */ +static int mask; +module_param(mask, int, 0); +MODULE_PARM_DESC(mask, "Set adc mask function."); + +/* + * ADC sample delay times in uS + */ +static const int delay_table[] = { + 21, /* 1 AC97 Link frames */ + 42, /* 2 */ + 84, /* 4 */ + 167, /* 8 */ + 333, /* 16 */ + 667, /* 32 */ + 1000, /* 48 */ + 1333, /* 64 */ + 2000, /* 96 */ + 2667, /* 128 */ + 3333, /* 160 */ + 4000, /* 192 */ + 4667, /* 224 */ + 5333, /* 256 */ + 6000, /* 288 */ + 0 /* No delay, switch matrix always on */ +}; + +/* + * Delay after issuing a POLL command. + * + * The delay is 3 AC97 link frames + the touchpanel settling delay + */ +static inline void poll_delay(int d) +{ + udelay(3 * AC97_LINK_FRAME + delay_table[d]); +} + +/* + * set up the physical settings of the WM9705 + */ +static void wm9705_phy_init(struct wm97xx *wm) +{ + u16 dig1 = 0, dig2 = WM97XX_RPR; + + /* + * mute VIDEO and AUX as they share X and Y touchscreen + * inputs on the WM9705 + */ + wm97xx_reg_write(wm, AC97_AUX, 0x8000); + wm97xx_reg_write(wm, AC97_VIDEO, 0x8000); + + /* touchpanel pressure current*/ + if (pil == 2) { + dig2 |= WM9705_PIL; + dev_dbg(wm->dev, + "setting pressure measurement current to 400uA."); + } else if (pil) + dev_dbg(wm->dev, + "setting pressure measurement current to 200uA."); + if (!pil) + pressure = 0; + + /* polling mode sample settling delay */ + if (delay != 4) { + if (delay < 0 || delay > 15) { + dev_dbg(wm->dev, "supplied delay out of range."); + delay = 4; + } + } + dig1 &= 0xff0f; + dig1 |= WM97XX_DELAY(delay); + dev_dbg(wm->dev, "setting adc sample delay to %d u Secs.", + delay_table[delay]); + + /* WM9705 pdd */ + dig2 |= (pdd & 0x000f); + dev_dbg(wm->dev, "setting pdd to Vmid/%d", 1 - (pdd & 0x000f)); + + /* mask */ + dig2 |= ((mask & 0x3) << 4); + + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); +} + +static void wm9705_dig_enable(struct wm97xx *wm, int enable) +{ + if (enable) { + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, + wm->dig[2] | WM97XX_PRP_DET_DIG); + wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ + } else + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, + wm->dig[2] & ~WM97XX_PRP_DET_DIG); +} + +static void wm9705_aux_prepare(struct wm97xx *wm) +{ + memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); +} + +static void wm9705_dig_restore(struct wm97xx *wm) +{ + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); +} + +static inline int is_pden(struct wm97xx *wm) +{ + return wm->dig[2] & WM9705_PDEN; +} + +/* + * Read a sample from the WM9705 adc in polling mode. + */ +static int wm9705_poll_sample(struct wm97xx *wm, int adcsel, int *sample) +{ + int timeout = 5 * delay; + bool wants_pen = adcsel & WM97XX_PEN_DOWN; + + if (wants_pen && !wm->pen_probably_down) { + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (!(data & WM97XX_PEN_DOWN)) + return RC_PENUP; + wm->pen_probably_down = 1; + } + + /* set up digitiser */ + if (wm->mach_ops && wm->mach_ops->pre_sample) + wm->mach_ops->pre_sample(adcsel); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, (adcsel & WM97XX_ADCSEL_MASK) + | WM97XX_POLL | WM97XX_DELAY(delay)); + + /* wait 3 AC97 time slots + delay for conversion */ + poll_delay(delay); + + /* wait for POLL to go low */ + while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) + && timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + + if (timeout == 0) { + /* If PDEN is set, we can get a timeout when pen goes up */ + if (is_pden(wm)) + wm->pen_probably_down = 0; + else + dev_dbg(wm->dev, "adc sample timeout"); + return RC_PENUP; + } + + *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (wm->mach_ops && wm->mach_ops->post_sample) + wm->mach_ops->post_sample(adcsel); + + /* check we have correct sample */ + if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) { + dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x", + adcsel & WM97XX_ADCSEL_MASK, + *sample & WM97XX_ADCSEL_MASK); + return RC_PENUP; + } + + if (wants_pen && !(*sample & WM97XX_PEN_DOWN)) { + wm->pen_probably_down = 0; + return RC_PENUP; + } + + return RC_VALID; +} + +/* + * Sample the WM9705 touchscreen in polling mode + */ +static int wm9705_poll_touch(struct wm97xx *wm, struct wm97xx_data *data) +{ + int rc; + + rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_X | WM97XX_PEN_DOWN, &data->x); + if (rc != RC_VALID) + return rc; + rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_Y | WM97XX_PEN_DOWN, &data->y); + if (rc != RC_VALID) + return rc; + if (pil) { + rc = wm9705_poll_sample(wm, WM97XX_ADCSEL_PRES | WM97XX_PEN_DOWN, &data->p); + if (rc != RC_VALID) + return rc; + } else + data->p = DEFAULT_PRESSURE; + + return RC_VALID; +} + +/* + * Enable WM9705 continuous mode, i.e. touch data is streamed across + * an AC97 slot + */ +static int wm9705_acc_enable(struct wm97xx *wm, int enable) +{ + u16 dig1, dig2; + int ret = 0; + + dig1 = wm->dig[1]; + dig2 = wm->dig[2]; + + if (enable) { + /* continuous mode */ + if (wm->mach_ops->acc_startup && + (ret = wm->mach_ops->acc_startup(wm)) < 0) + return ret; + dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | + WM97XX_DELAY_MASK | WM97XX_SLT_MASK); + dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | + WM97XX_DELAY(delay) | + WM97XX_SLT(wm->acc_slot) | + WM97XX_RATE(wm->acc_rate); + if (pil) + dig1 |= WM97XX_ADCSEL_PRES; + dig2 |= WM9705_PDEN; + } else { + dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); + dig2 &= ~WM9705_PDEN; + if (wm->mach_ops->acc_shutdown) + wm->mach_ops->acc_shutdown(wm); + } + + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); + + return ret; +} + +struct wm97xx_codec_drv wm9705_codec = { + .id = WM9705_ID2, + .name = "wm9705", + .poll_sample = wm9705_poll_sample, + .poll_touch = wm9705_poll_touch, + .acc_enable = wm9705_acc_enable, + .phy_init = wm9705_phy_init, + .dig_enable = wm9705_dig_enable, + .dig_restore = wm9705_dig_restore, + .aux_prepare = wm9705_aux_prepare, +}; +EXPORT_SYMBOL_GPL(wm9705_codec); + +/* Module information */ +MODULE_AUTHOR("Liam Girdwood "); +MODULE_DESCRIPTION("WM9705 Touch Screen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c new file mode 100644 index 00000000..16b52115 --- /dev/null +++ b/drivers/input/touchscreen/wm9712.c @@ -0,0 +1,471 @@ +/* + * wm9712.c -- Codec driver for Wolfson WM9712 AC97 Codecs. + * + * Copyright 2003, 2004, 2005, 2006, 2007 Wolfson Microelectronics PLC. + * Author: Liam Girdwood + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * Russell King + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define TS_NAME "wm97xx" +#define WM9712_VERSION "1.00" +#define DEFAULT_PRESSURE 0xb0c0 + +/* + * Module parameters + */ + +/* + * Set internal pull up for pen detect. + * + * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) + * i.e. pull up resistance = 64k Ohms / rpu. + * + * Adjust this value if you are having problems with pen detect not + * detecting any down event. + */ +static int rpu = 8; +module_param(rpu, int, 0); +MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); + +/* + * Set current used for pressure measurement. + * + * Set pil = 2 to use 400uA + * pil = 1 to use 200uA and + * pil = 0 to disable pressure measurement. + * + * This is used to increase the range of values returned by the adc + * when measureing touchpanel pressure. + */ +static int pil; +module_param(pil, int, 0); +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); + +/* + * Set threshold for pressure measurement. + * + * Pen down pressure below threshold is ignored. + */ +static int pressure = DEFAULT_PRESSURE & 0xfff; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); + +/* + * Set adc sample delay. + * + * For accurate touchpanel measurements, some settling time may be + * required between the switch matrix applying a voltage across the + * touchpanel plate and the ADC sampling the signal. + * + * This delay can be set by setting delay = n, where n is the array + * position of the delay in the array delay_table below. + * Long delays > 1ms are supported for completeness, but are not + * recommended. + */ +static int delay = 3; +module_param(delay, int, 0); +MODULE_PARM_DESC(delay, "Set adc sample delay."); + +/* + * Set five_wire = 1 to use a 5 wire touchscreen. + * + * NOTE: Five wire mode does not allow for readback of pressure. + */ +static int five_wire; +module_param(five_wire, int, 0); +MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); + +/* + * Set adc mask function. + * + * Sources of glitch noise, such as signals driving an LCD display, may feed + * through to the touch screen plates and affect measurement accuracy. In + * order to minimise this, a signal may be applied to the MASK pin to delay or + * synchronise the sampling. + * + * 0 = No delay or sync + * 1 = High on pin stops conversions + * 2 = Edge triggered, edge on pin delays conversion by delay param (above) + * 3 = Edge triggered, edge on pin starts conversion after delay param + */ +static int mask; +module_param(mask, int, 0); +MODULE_PARM_DESC(mask, "Set adc mask function."); + +/* + * Coordinate Polling Enable. + * + * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together + * for every poll. + */ +static int coord; +module_param(coord, int, 0); +MODULE_PARM_DESC(coord, "Polling coordinate mode"); + +/* + * ADC sample delay times in uS + */ +static const int delay_table[] = { + 21, /* 1 AC97 Link frames */ + 42, /* 2 */ + 84, /* 4 */ + 167, /* 8 */ + 333, /* 16 */ + 667, /* 32 */ + 1000, /* 48 */ + 1333, /* 64 */ + 2000, /* 96 */ + 2667, /* 128 */ + 3333, /* 160 */ + 4000, /* 192 */ + 4667, /* 224 */ + 5333, /* 256 */ + 6000, /* 288 */ + 0 /* No delay, switch matrix always on */ +}; + +/* + * Delay after issuing a POLL command. + * + * The delay is 3 AC97 link frames + the touchpanel settling delay + */ +static inline void poll_delay(int d) +{ + udelay(3 * AC97_LINK_FRAME + delay_table[d]); +} + +/* + * set up the physical settings of the WM9712 + */ +static void wm9712_phy_init(struct wm97xx *wm) +{ + u16 dig1 = 0; + u16 dig2 = WM97XX_RPR | WM9712_RPU(1); + + /* WM9712 rpu */ + if (rpu) { + dig2 &= 0xffc0; + dig2 |= WM9712_RPU(rpu); + dev_dbg(wm->dev, "setting pen detect pull-up to %d Ohms\n", + 64000 / rpu); + } + + /* WM9712 five wire */ + if (five_wire) { + dig2 |= WM9712_45W; + dev_dbg(wm->dev, "setting 5-wire touchscreen mode.\n"); + + if (pil) { + dev_warn(wm->dev, "pressure measurement is not " + "supported in 5-wire mode\n"); + pil = 0; + } + } + + /* touchpanel pressure current*/ + if (pil == 2) { + dig2 |= WM9712_PIL; + dev_dbg(wm->dev, + "setting pressure measurement current to 400uA.\n"); + } else if (pil) + dev_dbg(wm->dev, + "setting pressure measurement current to 200uA.\n"); + if (!pil) + pressure = 0; + + /* polling mode sample settling delay */ + if (delay < 0 || delay > 15) { + dev_dbg(wm->dev, "supplied delay out of range.\n"); + delay = 4; + } + dig1 &= 0xff0f; + dig1 |= WM97XX_DELAY(delay); + dev_dbg(wm->dev, "setting adc sample delay to %d u Secs.\n", + delay_table[delay]); + + /* mask */ + dig2 |= ((mask & 0x3) << 6); + if (mask) { + u16 reg; + /* Set GPIO4 as Mask Pin*/ + reg = wm97xx_reg_read(wm, AC97_MISC_AFE); + wm97xx_reg_write(wm, AC97_MISC_AFE, reg | WM97XX_GPIO_4); + reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); + wm97xx_reg_write(wm, AC97_GPIO_CFG, reg | WM97XX_GPIO_4); + } + + /* wait - coord mode */ + if (coord) + dig2 |= WM9712_WAIT; + + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); +} + +static void wm9712_dig_enable(struct wm97xx *wm, int enable) +{ + u16 dig2 = wm->dig[2]; + + if (enable) { + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, + dig2 | WM97XX_PRP_DET_DIG); + wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ + } else + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, + dig2 & ~WM97XX_PRP_DET_DIG); +} + +static void wm9712_aux_prepare(struct wm97xx *wm) +{ + memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, 0); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, WM97XX_PRP_DET_DIG); +} + +static void wm9712_dig_restore(struct wm97xx *wm) +{ + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, wm->dig_save[1]); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, wm->dig_save[2]); +} + +static inline int is_pden(struct wm97xx *wm) +{ + return wm->dig[2] & WM9712_PDEN; +} + +/* + * Read a sample from the WM9712 adc in polling mode. + */ +static int wm9712_poll_sample(struct wm97xx *wm, int adcsel, int *sample) +{ + int timeout = 5 * delay; + bool wants_pen = adcsel & WM97XX_PEN_DOWN; + + if (wants_pen && !wm->pen_probably_down) { + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (!(data & WM97XX_PEN_DOWN)) + return RC_PENUP; + wm->pen_probably_down = 1; + } + + /* set up digitiser */ + if (wm->mach_ops && wm->mach_ops->pre_sample) + wm->mach_ops->pre_sample(adcsel); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, (adcsel & WM97XX_ADCSEL_MASK) + | WM97XX_POLL | WM97XX_DELAY(delay)); + + /* wait 3 AC97 time slots + delay for conversion */ + poll_delay(delay); + + /* wait for POLL to go low */ + while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) + && timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + + if (timeout <= 0) { + /* If PDEN is set, we can get a timeout when pen goes up */ + if (is_pden(wm)) + wm->pen_probably_down = 0; + else + dev_dbg(wm->dev, "adc sample timeout\n"); + return RC_PENUP; + } + + *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (wm->mach_ops && wm->mach_ops->post_sample) + wm->mach_ops->post_sample(adcsel); + + /* check we have correct sample */ + if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) { + dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x\n", + adcsel & WM97XX_ADCSEL_MASK, + *sample & WM97XX_ADCSEL_MASK); + return RC_AGAIN; + } + + if (wants_pen && !(*sample & WM97XX_PEN_DOWN)) { + /* Sometimes it reads a wrong value the first time. */ + *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (!(*sample & WM97XX_PEN_DOWN)) { + wm->pen_probably_down = 0; + return RC_PENUP; + } + } + + return RC_VALID; +} + +/* + * Read a coord from the WM9712 adc in polling mode. + */ +static int wm9712_poll_coord(struct wm97xx *wm, struct wm97xx_data *data) +{ + int timeout = 5 * delay; + + if (!wm->pen_probably_down) { + u16 data_rd = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (!(data_rd & WM97XX_PEN_DOWN)) + return RC_PENUP; + wm->pen_probably_down = 1; + } + + /* set up digitiser */ + if (wm->mach_ops && wm->mach_ops->pre_sample) + wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); + + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, + WM97XX_COO | WM97XX_POLL | WM97XX_DELAY(delay)); + + /* wait 3 AC97 time slots + delay for conversion and read x */ + poll_delay(delay); + data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + /* wait for POLL to go low */ + while ((wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER1) & WM97XX_POLL) + && timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + + if (timeout <= 0) { + /* If PDEN is set, we can get a timeout when pen goes up */ + if (is_pden(wm)) + wm->pen_probably_down = 0; + else + dev_dbg(wm->dev, "adc sample timeout\n"); + return RC_PENUP; + } + + /* read back y data */ + data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (pil) + data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + else + data->p = DEFAULT_PRESSURE; + + if (wm->mach_ops && wm->mach_ops->post_sample) + wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); + + /* check we have correct sample */ + if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) + goto err; + if (pil && !(data->p & WM97XX_ADCSEL_PRES)) + goto err; + + if (!(data->x & WM97XX_PEN_DOWN) || !(data->y & WM97XX_PEN_DOWN)) { + wm->pen_probably_down = 0; + return RC_PENUP; + } + return RC_VALID; +err: + return 0; +} + +/* + * Sample the WM9712 touchscreen in polling mode + */ +static int wm9712_poll_touch(struct wm97xx *wm, struct wm97xx_data *data) +{ + int rc; + + if (coord) { + rc = wm9712_poll_coord(wm, data); + if (rc != RC_VALID) + return rc; + } else { + rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_X | WM97XX_PEN_DOWN, + &data->x); + if (rc != RC_VALID) + return rc; + + rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_Y | WM97XX_PEN_DOWN, + &data->y); + if (rc != RC_VALID) + return rc; + + if (pil && !five_wire) { + rc = wm9712_poll_sample(wm, WM97XX_ADCSEL_PRES | WM97XX_PEN_DOWN, + &data->p); + if (rc != RC_VALID) + return rc; + } else + data->p = DEFAULT_PRESSURE; + } + return RC_VALID; +} + +/* + * Enable WM9712 continuous mode, i.e. touch data is streamed across + * an AC97 slot + */ +static int wm9712_acc_enable(struct wm97xx *wm, int enable) +{ + u16 dig1, dig2; + int ret = 0; + + dig1 = wm->dig[1]; + dig2 = wm->dig[2]; + + if (enable) { + /* continuous mode */ + if (wm->mach_ops->acc_startup) { + ret = wm->mach_ops->acc_startup(wm); + if (ret < 0) + return ret; + } + dig1 &= ~(WM97XX_CM_RATE_MASK | WM97XX_ADCSEL_MASK | + WM97XX_DELAY_MASK | WM97XX_SLT_MASK); + dig1 |= WM97XX_CTC | WM97XX_COO | WM97XX_SLEN | + WM97XX_DELAY(delay) | + WM97XX_SLT(wm->acc_slot) | + WM97XX_RATE(wm->acc_rate); + if (pil) + dig1 |= WM97XX_ADCSEL_PRES; + dig2 |= WM9712_PDEN; + } else { + dig1 &= ~(WM97XX_CTC | WM97XX_COO | WM97XX_SLEN); + dig2 &= ~WM9712_PDEN; + if (wm->mach_ops->acc_shutdown) + wm->mach_ops->acc_shutdown(wm); + } + + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER1, dig1); + wm97xx_reg_write(wm, AC97_WM97XX_DIGITISER2, dig2); + + return 0; +} + +struct wm97xx_codec_drv wm9712_codec = { + .id = WM9712_ID2, + .name = "wm9712", + .poll_sample = wm9712_poll_sample, + .poll_touch = wm9712_poll_touch, + .acc_enable = wm9712_acc_enable, + .phy_init = wm9712_phy_init, + .dig_enable = wm9712_dig_enable, + .dig_restore = wm9712_dig_restore, + .aux_prepare = wm9712_aux_prepare, +}; +EXPORT_SYMBOL_GPL(wm9712_codec); + +/* Module information */ +MODULE_AUTHOR("Liam Girdwood "); +MODULE_DESCRIPTION("WM9712 Touch Screen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c new file mode 100644 index 00000000..74053531 --- /dev/null +++ b/drivers/input/touchscreen/wm9713.c @@ -0,0 +1,481 @@ +/* + * wm9713.c -- Codec touch driver for Wolfson WM9713 AC97 Codec. + * + * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC. + * Author: Liam Girdwood + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * Russell King + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define TS_NAME "wm97xx" +#define WM9713_VERSION "1.00" +#define DEFAULT_PRESSURE 0xb0c0 + +/* + * Module parameters + */ + +/* + * Set internal pull up for pen detect. + * + * Pull up is in the range 1.02k (least sensitive) to 64k (most sensitive) + * i.e. pull up resistance = 64k Ohms / rpu. + * + * Adjust this value if you are having problems with pen detect not + * detecting any down event. + */ +static int rpu = 8; +module_param(rpu, int, 0); +MODULE_PARM_DESC(rpu, "Set internal pull up resitor for pen detect."); + +/* + * Set current used for pressure measurement. + * + * Set pil = 2 to use 400uA + * pil = 1 to use 200uA and + * pil = 0 to disable pressure measurement. + * + * This is used to increase the range of values returned by the adc + * when measureing touchpanel pressure. + */ +static int pil; +module_param(pil, int, 0); +MODULE_PARM_DESC(pil, "Set current used for pressure measurement."); + +/* + * Set threshold for pressure measurement. + * + * Pen down pressure below threshold is ignored. + */ +static int pressure = DEFAULT_PRESSURE & 0xfff; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Set threshold for pressure measurement."); + +/* + * Set adc sample delay. + * + * For accurate touchpanel measurements, some settling time may be + * required between the switch matrix applying a voltage across the + * touchpanel plate and the ADC sampling the signal. + * + * This delay can be set by setting delay = n, where n is the array + * position of the delay in the array delay_table below. + * Long delays > 1ms are supported for completeness, but are not + * recommended. + */ +static int delay = 4; +module_param(delay, int, 0); +MODULE_PARM_DESC(delay, "Set adc sample delay."); + +/* + * Set five_wire = 1 to use a 5 wire touchscreen. + * + * NOTE: Five wire mode does not allow for readback of pressure. + */ +static int five_wire; +module_param(five_wire, int, 0); +MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); + +/* + * Set adc mask function. + * + * Sources of glitch noise, such as signals driving an LCD display, may feed + * through to the touch screen plates and affect measurement accuracy. In + * order to minimise this, a signal may be applied to the MASK pin to delay or + * synchronise the sampling. + * + * 0 = No delay or sync + * 1 = High on pin stops conversions + * 2 = Edge triggered, edge on pin delays conversion by delay param (above) + * 3 = Edge triggered, edge on pin starts conversion after delay param + */ +static int mask; +module_param(mask, int, 0); +MODULE_PARM_DESC(mask, "Set adc mask function."); + +/* + * Coordinate Polling Enable. + * + * Set to 1 to enable coordinate polling. e.g. x,y[,p] is sampled together + * for every poll. + */ +static int coord; +module_param(coord, int, 0); +MODULE_PARM_DESC(coord, "Polling coordinate mode"); + +/* + * ADC sample delay times in uS + */ +static const int delay_table[] = { + 21, /* 1 AC97 Link frames */ + 42, /* 2 */ + 84, /* 4 */ + 167, /* 8 */ + 333, /* 16 */ + 667, /* 32 */ + 1000, /* 48 */ + 1333, /* 64 */ + 2000, /* 96 */ + 2667, /* 128 */ + 3333, /* 160 */ + 4000, /* 192 */ + 4667, /* 224 */ + 5333, /* 256 */ + 6000, /* 288 */ + 0 /* No delay, switch matrix always on */ +}; + +/* + * Delay after issuing a POLL command. + * + * The delay is 3 AC97 link frames + the touchpanel settling delay + */ +static inline void poll_delay(int d) +{ + udelay(3 * AC97_LINK_FRAME + delay_table[d]); +} + +/* + * set up the physical settings of the WM9713 + */ +static void wm9713_phy_init(struct wm97xx *wm) +{ + u16 dig1 = 0, dig2, dig3; + + /* default values */ + dig2 = WM97XX_DELAY(4) | WM97XX_SLT(5); + dig3 = WM9712_RPU(1); + + /* rpu */ + if (rpu) { + dig3 &= 0xffc0; + dig3 |= WM9712_RPU(rpu); + dev_info(wm->dev, "setting pen detect pull-up to %d Ohms\n", + 64000 / rpu); + } + + /* Five wire panel? */ + if (five_wire) { + dig3 |= WM9713_45W; + dev_info(wm->dev, "setting 5-wire touchscreen mode."); + + if (pil) { + dev_warn(wm->dev, + "Pressure measurement not supported in 5 " + "wire mode, disabling\n"); + pil = 0; + } + } + + /* touchpanel pressure */ + if (pil == 2) { + dig3 |= WM9712_PIL; + dev_info(wm->dev, + "setting pressure measurement current to 400uA."); + } else if (pil) + dev_info(wm->dev, + "setting pressure measurement current to 200uA."); + if (!pil) + pressure = 0; + + /* sample settling delay */ + if (delay < 0 || delay > 15) { + dev_info(wm->dev, "supplied delay out of range."); + delay = 4; + dev_info(wm->dev, "setting adc sample delay to %d u Secs.", + delay_table[delay]); + } + dig2 &= 0xff0f; + dig2 |= WM97XX_DELAY(delay); + + /* mask */ + dig3 |= ((mask & 0x3) << 4); + if (coord) + dig3 |= WM9713_WAIT; + + wm->misc = wm97xx_reg_read(wm, 0x5a); + + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); + wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); + wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); + wm97xx_reg_write(wm, AC97_GPIO_STICKY, 0x0); +} + +static void wm9713_dig_enable(struct wm97xx *wm, int enable) +{ + u16 val; + + if (enable) { + val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); + wm97xx_reg_write(wm, AC97_EXTENDED_MID, val & 0x7fff); + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] | + WM97XX_PRP_DET_DIG); + wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); /* dummy read */ + } else { + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2] & + ~WM97XX_PRP_DET_DIG); + val = wm97xx_reg_read(wm, AC97_EXTENDED_MID); + wm97xx_reg_write(wm, AC97_EXTENDED_MID, val | 0x8000); + } +} + +static void wm9713_dig_restore(struct wm97xx *wm) +{ + wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig_save[0]); + wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig_save[1]); + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig_save[2]); +} + +static void wm9713_aux_prepare(struct wm97xx *wm) +{ + memcpy(wm->dig_save, wm->dig, sizeof(wm->dig)); + wm97xx_reg_write(wm, AC97_WM9713_DIG1, 0); + wm97xx_reg_write(wm, AC97_WM9713_DIG2, 0); + wm97xx_reg_write(wm, AC97_WM9713_DIG3, WM97XX_PRP_DET_DIG); +} + +static inline int is_pden(struct wm97xx *wm) +{ + return wm->dig[2] & WM9713_PDEN; +} + +/* + * Read a sample from the WM9713 adc in polling mode. + */ +static int wm9713_poll_sample(struct wm97xx *wm, int adcsel, int *sample) +{ + u16 dig1; + int timeout = 5 * delay; + bool wants_pen = adcsel & WM97XX_PEN_DOWN; + + if (wants_pen && !wm->pen_probably_down) { + u16 data = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (!(data & WM97XX_PEN_DOWN)) + return RC_PENUP; + wm->pen_probably_down = 1; + } + + /* set up digitiser */ + dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); + dig1 &= ~WM9713_ADCSEL_MASK; + /* WM97XX_ADCSEL_* channels need to be converted to WM9713 format */ + dig1 |= 1 << ((adcsel & WM97XX_ADCSEL_MASK) >> 12); + + if (wm->mach_ops && wm->mach_ops->pre_sample) + wm->mach_ops->pre_sample(adcsel); + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1 | WM9713_POLL); + + /* wait 3 AC97 time slots + delay for conversion */ + poll_delay(delay); + + /* wait for POLL to go low */ + while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) && + timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + + if (timeout <= 0) { + /* If PDEN is set, we can get a timeout when pen goes up */ + if (is_pden(wm)) + wm->pen_probably_down = 0; + else + dev_dbg(wm->dev, "adc sample timeout"); + return RC_PENUP; + } + + *sample = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (wm->mach_ops && wm->mach_ops->post_sample) + wm->mach_ops->post_sample(adcsel); + + /* check we have correct sample */ + if ((*sample ^ adcsel) & WM97XX_ADCSEL_MASK) { + dev_dbg(wm->dev, "adc wrong sample, wanted %x got %x", + adcsel & WM97XX_ADCSEL_MASK, + *sample & WM97XX_ADCSEL_MASK); + return RC_PENUP; + } + + if (wants_pen && !(*sample & WM97XX_PEN_DOWN)) { + wm->pen_probably_down = 0; + return RC_PENUP; + } + + return RC_VALID; +} + +/* + * Read a coordinate from the WM9713 adc in polling mode. + */ +static int wm9713_poll_coord(struct wm97xx *wm, struct wm97xx_data *data) +{ + u16 dig1; + int timeout = 5 * delay; + + if (!wm->pen_probably_down) { + u16 val = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (!(val & WM97XX_PEN_DOWN)) + return RC_PENUP; + wm->pen_probably_down = 1; + } + + /* set up digitiser */ + dig1 = wm97xx_reg_read(wm, AC97_WM9713_DIG1); + dig1 &= ~WM9713_ADCSEL_MASK; + if (pil) + dig1 |= WM9713_ADCSEL_PRES; + + if (wm->mach_ops && wm->mach_ops->pre_sample) + wm->mach_ops->pre_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); + wm97xx_reg_write(wm, AC97_WM9713_DIG1, + dig1 | WM9713_POLL | WM9713_COO); + + /* wait 3 AC97 time slots + delay for conversion */ + poll_delay(delay); + data->x = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + /* wait for POLL to go low */ + while ((wm97xx_reg_read(wm, AC97_WM9713_DIG1) & WM9713_POLL) + && timeout) { + udelay(AC97_LINK_FRAME); + timeout--; + } + + if (timeout <= 0) { + /* If PDEN is set, we can get a timeout when pen goes up */ + if (is_pden(wm)) + wm->pen_probably_down = 0; + else + dev_dbg(wm->dev, "adc sample timeout"); + return RC_PENUP; + } + + /* read back data */ + data->y = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + if (pil) + data->p = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD); + else + data->p = DEFAULT_PRESSURE; + + if (wm->mach_ops && wm->mach_ops->post_sample) + wm->mach_ops->post_sample(WM97XX_ADCSEL_X | WM97XX_ADCSEL_Y); + + /* check we have correct sample */ + if (!(data->x & WM97XX_ADCSEL_X) || !(data->y & WM97XX_ADCSEL_Y)) + goto err; + if (pil && !(data->p & WM97XX_ADCSEL_PRES)) + goto err; + + if (!(data->x & WM97XX_PEN_DOWN) || !(data->y & WM97XX_PEN_DOWN)) { + wm->pen_probably_down = 0; + return RC_PENUP; + } + return RC_VALID; +err: + return 0; +} + +/* + * Sample the WM9713 touchscreen in polling mode + */ +static int wm9713_poll_touch(struct wm97xx *wm, struct wm97xx_data *data) +{ + int rc; + + if (coord) { + rc = wm9713_poll_coord(wm, data); + if (rc != RC_VALID) + return rc; + } else { + rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_X | WM97XX_PEN_DOWN, &data->x); + if (rc != RC_VALID) + return rc; + rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_Y | WM97XX_PEN_DOWN, &data->y); + if (rc != RC_VALID) + return rc; + if (pil) { + rc = wm9713_poll_sample(wm, WM97XX_ADCSEL_PRES | WM97XX_PEN_DOWN, + &data->p); + if (rc != RC_VALID) + return rc; + } else + data->p = DEFAULT_PRESSURE; + } + return RC_VALID; +} + +/* + * Enable WM9713 continuous mode, i.e. touch data is streamed across + * an AC97 slot + */ +static int wm9713_acc_enable(struct wm97xx *wm, int enable) +{ + u16 dig1, dig2, dig3; + int ret = 0; + + dig1 = wm->dig[0]; + dig2 = wm->dig[1]; + dig3 = wm->dig[2]; + + if (enable) { + /* continuous mode */ + if (wm->mach_ops->acc_startup && + (ret = wm->mach_ops->acc_startup(wm)) < 0) + return ret; + + dig1 &= ~WM9713_ADCSEL_MASK; + dig1 |= WM9713_CTC | WM9713_COO | WM9713_ADCSEL_X | + WM9713_ADCSEL_Y; + if (pil) + dig1 |= WM9713_ADCSEL_PRES; + dig2 &= ~(WM97XX_DELAY_MASK | WM97XX_SLT_MASK | + WM97XX_CM_RATE_MASK); + dig2 |= WM97XX_SLEN | WM97XX_DELAY(delay) | + WM97XX_SLT(wm->acc_slot) | WM97XX_RATE(wm->acc_rate); + dig3 |= WM9713_PDEN; + } else { + dig1 &= ~(WM9713_CTC | WM9713_COO); + dig2 &= ~WM97XX_SLEN; + dig3 &= ~WM9713_PDEN; + if (wm->mach_ops->acc_shutdown) + wm->mach_ops->acc_shutdown(wm); + } + + wm97xx_reg_write(wm, AC97_WM9713_DIG1, dig1); + wm97xx_reg_write(wm, AC97_WM9713_DIG2, dig2); + wm97xx_reg_write(wm, AC97_WM9713_DIG3, dig3); + + return ret; +} + +struct wm97xx_codec_drv wm9713_codec = { + .id = WM9713_ID2, + .name = "wm9713", + .poll_sample = wm9713_poll_sample, + .poll_touch = wm9713_poll_touch, + .acc_enable = wm9713_acc_enable, + .phy_init = wm9713_phy_init, + .dig_enable = wm9713_dig_enable, + .dig_restore = wm9713_dig_restore, + .aux_prepare = wm9713_aux_prepare, +}; +EXPORT_SYMBOL_GPL(wm9713_codec); + +/* Module information */ +MODULE_AUTHOR("Liam Girdwood "); +MODULE_DESCRIPTION("WM9713 Touch Screen Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c new file mode 100644 index 00000000..7e45c9f6 --- /dev/null +++ b/drivers/input/touchscreen/wm97xx-core.c @@ -0,0 +1,859 @@ +/* + * wm97xx-core.c -- Touch screen driver core for Wolfson WM9705, WM9712 + * and WM9713 AC97 Codecs. + * + * Copyright 2003, 2004, 2005, 2006, 2007, 2008 Wolfson Microelectronics PLC. + * Author: Liam Girdwood + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * Russell King + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * Notes: + * + * Features: + * - supports WM9705, WM9712, WM9713 + * - polling mode + * - continuous mode (arch-dependent) + * - adjustable rpu/dpp settings + * - adjustable pressure current + * - adjustable sample settle delay + * - 4 and 5 wire touchscreens (5 wire is WM9712 only) + * - pen down detection + * - battery monitor + * - sample AUX adcs + * - power management + * - codec GPIO + * - codec event notification + * Todo + * - Support for async sampling control for noisy LCDs. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TS_NAME "wm97xx" +#define WM_CORE_VERSION "1.00" +#define DEFAULT_PRESSURE 0xb0c0 + + +/* + * Touchscreen absolute values + * + * These parameters are used to help the input layer discard out of + * range readings and reduce jitter etc. + * + * o min, max:- indicate the min and max values your touch screen returns + * o fuzz:- use a higher number to reduce jitter + * + * The default values correspond to Mainstone II in QVGA mode + * + * Please read + * Documentation/input/input-programming.txt for more details. + */ + +static int abs_x[3] = {350, 3900, 5}; +module_param_array(abs_x, int, NULL, 0); +MODULE_PARM_DESC(abs_x, "Touchscreen absolute X min, max, fuzz"); + +static int abs_y[3] = {320, 3750, 40}; +module_param_array(abs_y, int, NULL, 0); +MODULE_PARM_DESC(abs_y, "Touchscreen absolute Y min, max, fuzz"); + +static int abs_p[3] = {0, 150, 4}; +module_param_array(abs_p, int, NULL, 0); +MODULE_PARM_DESC(abs_p, "Touchscreen absolute Pressure min, max, fuzz"); + +/* + * wm97xx IO access, all IO locking done by AC97 layer + */ +int wm97xx_reg_read(struct wm97xx *wm, u16 reg) +{ + if (wm->ac97) + return wm->ac97->bus->ops->read(wm->ac97, reg); + else + return -1; +} +EXPORT_SYMBOL_GPL(wm97xx_reg_read); + +void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val) +{ + /* cache digitiser registers */ + if (reg >= AC97_WM9713_DIG1 && reg <= AC97_WM9713_DIG3) + wm->dig[(reg - AC97_WM9713_DIG1) >> 1] = val; + + /* cache gpio regs */ + if (reg >= AC97_GPIO_CFG && reg <= AC97_MISC_AFE) + wm->gpio[(reg - AC97_GPIO_CFG) >> 1] = val; + + /* wm9713 irq reg */ + if (reg == 0x5a) + wm->misc = val; + + if (wm->ac97) + wm->ac97->bus->ops->write(wm->ac97, reg, val); +} +EXPORT_SYMBOL_GPL(wm97xx_reg_write); + +/** + * wm97xx_read_aux_adc - Read the aux adc. + * @wm: wm97xx device. + * @adcsel: codec ADC to be read + * + * Reads the selected AUX ADC. + */ + +int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel) +{ + int power_adc = 0, auxval; + u16 power = 0; + int rc = 0; + int timeout = 0; + + /* get codec */ + mutex_lock(&wm->codec_mutex); + + /* When the touchscreen is not in use, we may have to power up + * the AUX ADC before we can use sample the AUX inputs-> + */ + if (wm->id == WM9713_ID2 && + (power = wm97xx_reg_read(wm, AC97_EXTENDED_MID)) & 0x8000) { + power_adc = 1; + wm97xx_reg_write(wm, AC97_EXTENDED_MID, power & 0x7fff); + } + + /* Prepare the codec for AUX reading */ + wm->codec->aux_prepare(wm); + + /* Turn polling mode on to read AUX ADC */ + wm->pen_probably_down = 1; + + while (rc != RC_VALID && timeout++ < 5) + rc = wm->codec->poll_sample(wm, adcsel, &auxval); + + if (power_adc) + wm97xx_reg_write(wm, AC97_EXTENDED_MID, power | 0x8000); + + wm->codec->dig_restore(wm); + + wm->pen_probably_down = 0; + + if (timeout >= 5) { + dev_err(wm->dev, + "timeout reading auxadc %d, disabling digitiser\n", + adcsel); + wm->codec->dig_enable(wm, false); + } + + mutex_unlock(&wm->codec_mutex); + return (rc == RC_VALID ? auxval & 0xfff : -EBUSY); +} +EXPORT_SYMBOL_GPL(wm97xx_read_aux_adc); + +/** + * wm97xx_get_gpio - Get the status of a codec GPIO. + * @wm: wm97xx device. + * @gpio: gpio + * + * Get the status of a codec GPIO pin + */ + +enum wm97xx_gpio_status wm97xx_get_gpio(struct wm97xx *wm, u32 gpio) +{ + u16 status; + enum wm97xx_gpio_status ret; + + mutex_lock(&wm->codec_mutex); + status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); + + if (status & gpio) + ret = WM97XX_GPIO_HIGH; + else + ret = WM97XX_GPIO_LOW; + + mutex_unlock(&wm->codec_mutex); + return ret; +} +EXPORT_SYMBOL_GPL(wm97xx_get_gpio); + +/** + * wm97xx_set_gpio - Set the status of a codec GPIO. + * @wm: wm97xx device. + * @gpio: gpio + * + * + * Set the status of a codec GPIO pin + */ + +void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio, + enum wm97xx_gpio_status status) +{ + u16 reg; + + mutex_lock(&wm->codec_mutex); + reg = wm97xx_reg_read(wm, AC97_GPIO_STATUS); + + if (status == WM97XX_GPIO_HIGH) + reg |= gpio; + else + reg &= ~gpio; + + if (wm->id == WM9712_ID2 && wm->variant != WM97xx_WM1613) + wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg << 1); + else + wm97xx_reg_write(wm, AC97_GPIO_STATUS, reg); + mutex_unlock(&wm->codec_mutex); +} +EXPORT_SYMBOL_GPL(wm97xx_set_gpio); + +/* + * Codec GPIO pin configuration, this sets pin direction, polarity, + * stickyness and wake up. + */ +void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio, enum wm97xx_gpio_dir dir, + enum wm97xx_gpio_pol pol, enum wm97xx_gpio_sticky sticky, + enum wm97xx_gpio_wake wake) +{ + u16 reg; + + mutex_lock(&wm->codec_mutex); + reg = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); + + if (pol == WM97XX_GPIO_POL_HIGH) + reg |= gpio; + else + reg &= ~gpio; + + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, reg); + reg = wm97xx_reg_read(wm, AC97_GPIO_STICKY); + + if (sticky == WM97XX_GPIO_STICKY) + reg |= gpio; + else + reg &= ~gpio; + + wm97xx_reg_write(wm, AC97_GPIO_STICKY, reg); + reg = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); + + if (wake == WM97XX_GPIO_WAKE) + reg |= gpio; + else + reg &= ~gpio; + + wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, reg); + reg = wm97xx_reg_read(wm, AC97_GPIO_CFG); + + if (dir == WM97XX_GPIO_IN) + reg |= gpio; + else + reg &= ~gpio; + + wm97xx_reg_write(wm, AC97_GPIO_CFG, reg); + mutex_unlock(&wm->codec_mutex); +} +EXPORT_SYMBOL_GPL(wm97xx_config_gpio); + +/* + * Configure the WM97XX_PRP value to use while system is suspended. + * If a value other than 0 is set then WM97xx pen detection will be + * left enabled in the configured mode while the system is in suspend, + * the device has users and suspend has not been disabled via the + * wakeup sysfs entries. + * + * @wm: WM97xx device to configure + * @mode: WM97XX_PRP value to configure while suspended + */ +void wm97xx_set_suspend_mode(struct wm97xx *wm, u16 mode) +{ + wm->suspend_mode = mode; + device_init_wakeup(&wm->input_dev->dev, mode != 0); +} +EXPORT_SYMBOL_GPL(wm97xx_set_suspend_mode); + +/* + * Handle a pen down interrupt. + */ +static void wm97xx_pen_irq_worker(struct work_struct *work) +{ + struct wm97xx *wm = container_of(work, struct wm97xx, pen_event_work); + int pen_was_down = wm->pen_is_down; + + /* do we need to enable the touch panel reader */ + if (wm->id == WM9705_ID2) { + if (wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER_RD) & + WM97XX_PEN_DOWN) + wm->pen_is_down = 1; + else + wm->pen_is_down = 0; + } else { + u16 status, pol; + mutex_lock(&wm->codec_mutex); + status = wm97xx_reg_read(wm, AC97_GPIO_STATUS); + pol = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); + + if (WM97XX_GPIO_13 & pol & status) { + wm->pen_is_down = 1; + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol & + ~WM97XX_GPIO_13); + } else { + wm->pen_is_down = 0; + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, pol | + WM97XX_GPIO_13); + } + + if (wm->id == WM9712_ID2 && wm->variant != WM97xx_WM1613) + wm97xx_reg_write(wm, AC97_GPIO_STATUS, (status & + ~WM97XX_GPIO_13) << 1); + else + wm97xx_reg_write(wm, AC97_GPIO_STATUS, status & + ~WM97XX_GPIO_13); + mutex_unlock(&wm->codec_mutex); + } + + /* If the system is not using continuous mode or it provides a + * pen down operation then we need to schedule polls while the + * pen is down. Otherwise the machine driver is responsible + * for scheduling reads. + */ + if (!wm->mach_ops->acc_enabled || wm->mach_ops->acc_pen_down) { + if (wm->pen_is_down && !pen_was_down) { + /* Data is not available immediately on pen down */ + queue_delayed_work(wm->ts_workq, &wm->ts_reader, 1); + } + + /* Let ts_reader report the pen up for debounce. */ + if (!wm->pen_is_down && pen_was_down) + wm->pen_is_down = 1; + } + + if (!wm->pen_is_down && wm->mach_ops->acc_enabled) + wm->mach_ops->acc_pen_up(wm); + + wm->mach_ops->irq_enable(wm, 1); +} + +/* + * Codec PENDOWN irq handler + * + * We have to disable the codec interrupt in the handler because it + * can take up to 1ms to clear the interrupt source. We schedule a task + * in a work queue to do the actual interaction with the chip. The + * interrupt is then enabled again in the slow handler when the source + * has been cleared. + */ +static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id) +{ + struct wm97xx *wm = dev_id; + + if (!work_pending(&wm->pen_event_work)) { + wm->mach_ops->irq_enable(wm, 0); + queue_work(wm->ts_workq, &wm->pen_event_work); + } + + return IRQ_HANDLED; +} + +/* + * initialise pen IRQ handler and workqueue + */ +static int wm97xx_init_pen_irq(struct wm97xx *wm) +{ + u16 reg; + + /* If an interrupt is supplied an IRQ enable operation must also be + * provided. */ + BUG_ON(!wm->mach_ops->irq_enable); + + if (request_irq(wm->pen_irq, wm97xx_pen_interrupt, IRQF_SHARED, + "wm97xx-pen", wm)) { + dev_err(wm->dev, + "Failed to register pen down interrupt, polling"); + wm->pen_irq = 0; + return -EINVAL; + } + + /* Configure GPIO as interrupt source on WM971x */ + if (wm->id != WM9705_ID2) { + BUG_ON(!wm->mach_ops->irq_gpio); + reg = wm97xx_reg_read(wm, AC97_MISC_AFE); + wm97xx_reg_write(wm, AC97_MISC_AFE, + reg & ~(wm->mach_ops->irq_gpio)); + reg = wm97xx_reg_read(wm, 0x5a); + wm97xx_reg_write(wm, 0x5a, reg & ~0x0001); + } + + return 0; +} + +static int wm97xx_read_samples(struct wm97xx *wm) +{ + struct wm97xx_data data; + int rc; + + mutex_lock(&wm->codec_mutex); + + if (wm->mach_ops && wm->mach_ops->acc_enabled) + rc = wm->mach_ops->acc_pen_down(wm); + else + rc = wm->codec->poll_touch(wm, &data); + + if (rc & RC_PENUP) { + if (wm->pen_is_down) { + wm->pen_is_down = 0; + dev_dbg(wm->dev, "pen up\n"); + input_report_abs(wm->input_dev, ABS_PRESSURE, 0); + input_report_key(wm->input_dev, BTN_TOUCH, 0); + input_sync(wm->input_dev); + } else if (!(rc & RC_AGAIN)) { + /* We need high frequency updates only while + * pen is down, the user never will be able to + * touch screen faster than a few times per + * second... On the other hand, when the user + * is actively working with the touchscreen we + * don't want to lose the quick response. So we + * will slowly increase sleep time after the + * pen is up and quicky restore it to ~one task + * switch when pen is down again. + */ + if (wm->ts_reader_interval < HZ / 10) + wm->ts_reader_interval++; + } + + } else if (rc & RC_VALID) { + dev_dbg(wm->dev, + "pen down: x=%x:%d, y=%x:%d, pressure=%x:%d\n", + data.x >> 12, data.x & 0xfff, data.y >> 12, + data.y & 0xfff, data.p >> 12, data.p & 0xfff); + + if (abs_x[0] > (data.x & 0xfff) || + abs_x[1] < (data.x & 0xfff) || + abs_y[0] > (data.y & 0xfff) || + abs_y[1] < (data.y & 0xfff)) { + dev_dbg(wm->dev, "Measurement out of range, dropping it\n"); + rc = RC_AGAIN; + goto out; + } + + input_report_abs(wm->input_dev, ABS_X, data.x & 0xfff); + input_report_abs(wm->input_dev, ABS_Y, data.y & 0xfff); + input_report_abs(wm->input_dev, ABS_PRESSURE, data.p & 0xfff); + input_report_key(wm->input_dev, BTN_TOUCH, 1); + input_sync(wm->input_dev); + wm->pen_is_down = 1; + wm->ts_reader_interval = wm->ts_reader_min_interval; + } else if (rc & RC_PENDOWN) { + dev_dbg(wm->dev, "pen down\n"); + wm->pen_is_down = 1; + wm->ts_reader_interval = wm->ts_reader_min_interval; + } + +out: + mutex_unlock(&wm->codec_mutex); + return rc; +} + +/* +* The touchscreen sample reader. +*/ +static void wm97xx_ts_reader(struct work_struct *work) +{ + int rc; + struct wm97xx *wm = container_of(work, struct wm97xx, ts_reader.work); + + BUG_ON(!wm->codec); + + do { + rc = wm97xx_read_samples(wm); + } while (rc & RC_AGAIN); + + if (wm->pen_is_down || !wm->pen_irq) + queue_delayed_work(wm->ts_workq, &wm->ts_reader, + wm->ts_reader_interval); +} + +/** + * wm97xx_ts_input_open - Open the touch screen input device. + * @idev: Input device to be opened. + * + * Called by the input sub system to open a wm97xx touchscreen device. + * Starts the touchscreen thread and touch digitiser. + */ +static int wm97xx_ts_input_open(struct input_dev *idev) +{ + struct wm97xx *wm = input_get_drvdata(idev); + + wm->ts_workq = create_singlethread_workqueue("kwm97xx"); + if (wm->ts_workq == NULL) { + dev_err(wm->dev, + "Failed to create workqueue\n"); + return -EINVAL; + } + + /* start digitiser */ + if (wm->mach_ops && wm->mach_ops->acc_enabled) + wm->codec->acc_enable(wm, 1); + wm->codec->dig_enable(wm, 1); + + INIT_DELAYED_WORK(&wm->ts_reader, wm97xx_ts_reader); + INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker); + + wm->ts_reader_min_interval = HZ >= 100 ? HZ / 100 : 1; + if (wm->ts_reader_min_interval < 1) + wm->ts_reader_min_interval = 1; + wm->ts_reader_interval = wm->ts_reader_min_interval; + + wm->pen_is_down = 0; + if (wm->pen_irq) + wm97xx_init_pen_irq(wm); + else + dev_err(wm->dev, "No IRQ specified\n"); + + /* If we either don't have an interrupt for pen down events or + * failed to acquire it then we need to poll. + */ + if (wm->pen_irq == 0) + queue_delayed_work(wm->ts_workq, &wm->ts_reader, + wm->ts_reader_interval); + + return 0; +} + +/** + * wm97xx_ts_input_close - Close the touch screen input device. + * @idev: Input device to be closed. + * + * Called by the input sub system to close a wm97xx touchscreen + * device. Kills the touchscreen thread and stops the touch + * digitiser. + */ + +static void wm97xx_ts_input_close(struct input_dev *idev) +{ + struct wm97xx *wm = input_get_drvdata(idev); + u16 reg; + + if (wm->pen_irq) { + /* Return the interrupt to GPIO usage (disabling it) */ + if (wm->id != WM9705_ID2) { + BUG_ON(!wm->mach_ops->irq_gpio); + reg = wm97xx_reg_read(wm, AC97_MISC_AFE); + wm97xx_reg_write(wm, AC97_MISC_AFE, + reg | wm->mach_ops->irq_gpio); + } + + free_irq(wm->pen_irq, wm); + } + + wm->pen_is_down = 0; + + /* Balance out interrupt disables/enables */ + if (cancel_work_sync(&wm->pen_event_work)) + wm->mach_ops->irq_enable(wm, 1); + + /* ts_reader rearms itself so we need to explicitly stop it + * before we destroy the workqueue. + */ + cancel_delayed_work_sync(&wm->ts_reader); + + destroy_workqueue(wm->ts_workq); + + /* stop digitiser */ + wm->codec->dig_enable(wm, 0); + if (wm->mach_ops && wm->mach_ops->acc_enabled) + wm->codec->acc_enable(wm, 0); +} + +static int wm97xx_probe(struct device *dev) +{ + struct wm97xx *wm; + struct wm97xx_pdata *pdata = dev->platform_data; + int ret = 0, id = 0; + + wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL); + if (!wm) + return -ENOMEM; + mutex_init(&wm->codec_mutex); + + wm->dev = dev; + dev_set_drvdata(dev, wm); + wm->ac97 = to_ac97_t(dev); + + /* check that we have a supported codec */ + id = wm97xx_reg_read(wm, AC97_VENDOR_ID1); + if (id != WM97XX_ID1) { + dev_err(dev, "Device with vendor %04x is not a wm97xx\n", id); + ret = -ENODEV; + goto alloc_err; + } + + wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2); + + wm->variant = WM97xx_GENERIC; + + dev_info(wm->dev, "detected a wm97%02x codec\n", wm->id & 0xff); + + switch (wm->id & 0xff) { +#ifdef CONFIG_TOUCHSCREEN_WM9705 + case 0x05: + wm->codec = &wm9705_codec; + break; +#endif +#ifdef CONFIG_TOUCHSCREEN_WM9712 + case 0x12: + wm->codec = &wm9712_codec; + break; +#endif +#ifdef CONFIG_TOUCHSCREEN_WM9713 + case 0x13: + wm->codec = &wm9713_codec; + break; +#endif + default: + dev_err(wm->dev, "Support for wm97%02x not compiled in.\n", + wm->id & 0xff); + ret = -ENODEV; + goto alloc_err; + } + + /* set up physical characteristics */ + wm->codec->phy_init(wm); + + /* load gpio cache */ + wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); + wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); + wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); + wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); + wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); + wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); + + wm->input_dev = input_allocate_device(); + if (wm->input_dev == NULL) { + ret = -ENOMEM; + goto alloc_err; + } + + /* set up touch configuration */ + wm->input_dev->name = "wm97xx touchscreen"; + wm->input_dev->phys = "wm97xx"; + wm->input_dev->open = wm97xx_ts_input_open; + wm->input_dev->close = wm97xx_ts_input_close; + + __set_bit(EV_ABS, wm->input_dev->evbit); + __set_bit(EV_KEY, wm->input_dev->evbit); + __set_bit(BTN_TOUCH, wm->input_dev->keybit); + + input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1], + abs_x[2], 0); + input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1], + abs_y[2], 0); + input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1], + abs_p[2], 0); + + input_set_drvdata(wm->input_dev, wm); + wm->input_dev->dev.parent = dev; + + ret = input_register_device(wm->input_dev); + if (ret < 0) + goto dev_alloc_err; + + /* register our battery device */ + wm->battery_dev = platform_device_alloc("wm97xx-battery", -1); + if (!wm->battery_dev) { + ret = -ENOMEM; + goto batt_err; + } + platform_set_drvdata(wm->battery_dev, wm); + wm->battery_dev->dev.parent = dev; + wm->battery_dev->dev.platform_data = pdata; + ret = platform_device_add(wm->battery_dev); + if (ret < 0) + goto batt_reg_err; + + /* register our extended touch device (for machine specific + * extensions) */ + wm->touch_dev = platform_device_alloc("wm97xx-touch", -1); + if (!wm->touch_dev) { + ret = -ENOMEM; + goto touch_err; + } + platform_set_drvdata(wm->touch_dev, wm); + wm->touch_dev->dev.parent = dev; + wm->touch_dev->dev.platform_data = pdata; + ret = platform_device_add(wm->touch_dev); + if (ret < 0) + goto touch_reg_err; + + return ret; + + touch_reg_err: + platform_device_put(wm->touch_dev); + touch_err: + platform_device_del(wm->battery_dev); + batt_reg_err: + platform_device_put(wm->battery_dev); + batt_err: + input_unregister_device(wm->input_dev); + wm->input_dev = NULL; + dev_alloc_err: + input_free_device(wm->input_dev); + alloc_err: + kfree(wm); + + return ret; +} + +static int wm97xx_remove(struct device *dev) +{ + struct wm97xx *wm = dev_get_drvdata(dev); + + platform_device_unregister(wm->battery_dev); + platform_device_unregister(wm->touch_dev); + input_unregister_device(wm->input_dev); + kfree(wm); + + return 0; +} + +#ifdef CONFIG_PM +static int wm97xx_suspend(struct device *dev, pm_message_t state) +{ + struct wm97xx *wm = dev_get_drvdata(dev); + u16 reg; + int suspend_mode; + + if (device_may_wakeup(&wm->input_dev->dev)) + suspend_mode = wm->suspend_mode; + else + suspend_mode = 0; + + if (wm->input_dev->users) + cancel_delayed_work_sync(&wm->ts_reader); + + /* Power down the digitiser (bypassing the cache for resume) */ + reg = wm97xx_reg_read(wm, AC97_WM97XX_DIGITISER2); + reg &= ~WM97XX_PRP_DET_DIG; + if (wm->input_dev->users) + reg |= suspend_mode; + wm->ac97->bus->ops->write(wm->ac97, AC97_WM97XX_DIGITISER2, reg); + + /* WM9713 has an additional power bit - turn it off if there + * are no users or if suspend mode is zero. */ + if (wm->id == WM9713_ID2 && + (!wm->input_dev->users || !suspend_mode)) { + reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) | 0x8000; + wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); + } + + return 0; +} + +static int wm97xx_resume(struct device *dev) +{ + struct wm97xx *wm = dev_get_drvdata(dev); + + /* restore digitiser and gpios */ + if (wm->id == WM9713_ID2) { + wm97xx_reg_write(wm, AC97_WM9713_DIG1, wm->dig[0]); + wm97xx_reg_write(wm, 0x5a, wm->misc); + if (wm->input_dev->users) { + u16 reg; + reg = wm97xx_reg_read(wm, AC97_EXTENDED_MID) & 0x7fff; + wm97xx_reg_write(wm, AC97_EXTENDED_MID, reg); + } + } + + wm97xx_reg_write(wm, AC97_WM9713_DIG2, wm->dig[1]); + wm97xx_reg_write(wm, AC97_WM9713_DIG3, wm->dig[2]); + + wm97xx_reg_write(wm, AC97_GPIO_CFG, wm->gpio[0]); + wm97xx_reg_write(wm, AC97_GPIO_POLARITY, wm->gpio[1]); + wm97xx_reg_write(wm, AC97_GPIO_STICKY, wm->gpio[2]); + wm97xx_reg_write(wm, AC97_GPIO_WAKEUP, wm->gpio[3]); + wm97xx_reg_write(wm, AC97_GPIO_STATUS, wm->gpio[4]); + wm97xx_reg_write(wm, AC97_MISC_AFE, wm->gpio[5]); + + if (wm->input_dev->users && !wm->pen_irq) { + wm->ts_reader_interval = wm->ts_reader_min_interval; + queue_delayed_work(wm->ts_workq, &wm->ts_reader, + wm->ts_reader_interval); + } + + return 0; +} + +#else +#define wm97xx_suspend NULL +#define wm97xx_resume NULL +#endif + +/* + * Machine specific operations + */ +int wm97xx_register_mach_ops(struct wm97xx *wm, + struct wm97xx_mach_ops *mach_ops) +{ + mutex_lock(&wm->codec_mutex); + if (wm->mach_ops) { + mutex_unlock(&wm->codec_mutex); + return -EINVAL; + } + wm->mach_ops = mach_ops; + mutex_unlock(&wm->codec_mutex); + + return 0; +} +EXPORT_SYMBOL_GPL(wm97xx_register_mach_ops); + +void wm97xx_unregister_mach_ops(struct wm97xx *wm) +{ + mutex_lock(&wm->codec_mutex); + wm->mach_ops = NULL; + mutex_unlock(&wm->codec_mutex); +} +EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); + +static struct device_driver wm97xx_driver = { + .name = "wm97xx-ts", + .bus = &ac97_bus_type, + .owner = THIS_MODULE, + .probe = wm97xx_probe, + .remove = wm97xx_remove, + .suspend = wm97xx_suspend, + .resume = wm97xx_resume, +}; + +static int __init wm97xx_init(void) +{ + return driver_register(&wm97xx_driver); +} + +static void __exit wm97xx_exit(void) +{ + driver_unregister(&wm97xx_driver); +} + +module_init(wm97xx_init); +module_exit(wm97xx_exit); + +/* Module information */ +MODULE_AUTHOR("Liam Girdwood "); +MODULE_DESCRIPTION("WM97xx Core - Touch Screen / AUX ADC / GPIO Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/zinitix_bt541_firmware.h b/drivers/input/touchscreen/zinitix_bt541_firmware.h new file mode 100644 index 00000000..95080dea --- /dev/null +++ b/drivers/input/touchscreen/zinitix_bt541_firmware.h @@ -0,0 +1,4127 @@ +/* +* +* Zinitix touch driver +* +* Copyright (C) 2009 Zinitix, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ +/* +Release Date : 15/03/20, 21:10 + +Version Info : + Chip Code : 0xE240 + Firmware Version : 0x0004 + Firmware Minor Version : 0x0003 + Register Version : 0 +*/ +#ifndef _ZINITIX_ZXT_CODE_H +#define _ZINITIX_ZXT_CODE_H + +u8 m_firmware_data[] = { +0xC9, 0x00, 0x00, 0x48, 0x92, 0x00, 0x00, 0x48, +0x28, 0x00, 0x00, 0x48, 0x3D, 0x00, 0x00, 0x48, +0x52, 0x00, 0x00, 0x48, 0x68, 0x00, 0x00, 0x48, +0x66, 0x00, 0x00, 0x48, 0x64, 0x00, 0x00, 0x48, +0x62, 0x00, 0x00, 0x48, 0x60, 0x00, 0x00, 0x48, +0x5E, 0x00, 0x00, 0x48, 0x5C, 0x00, 0x00, 0x48, +0x00, 0x00, 0x00, 0x48, 0x04, 0x00, 0x00, 0x44, +0x03, 0x00, 0x00, 0x84, 0x00, 0x00, 0x03, 0x80, +0x40, 0xE2, 0x00, 0x44, 0x40, 0xE2, 0x00, 0x00, +0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, +0x00, 0x84, 0x00, 0x84, 0x00, 0x84, 0x00, 0x84, +0x20, 0x46, 0x21, 0x84, 0x21, 0x58, 0x80, 0x00, +0x50, 0xAE, 0x0A, 0x01, 0x00, 0x92, 0x00, 0x92, +0x00, 0x92, 0x00, 0x92, 0xFF, 0x3B, 0x00, 0x92, +0xFF, 0x3B, 0x84, 0xFC, 0xFF, 0x3B, 0x04, 0xFD, +0xFF, 0x3A, 0x04, 0xFE, 0x0F, 0x3A, 0x04, 0xBC, +0x00, 0x64, 0x04, 0xA8, 0x22, 0x84, 0x04, 0x00, +0x80, 0x00, 0x20, 0x46, 0x0A, 0x01, 0x21, 0x58, +0x00, 0x92, 0x50, 0xAE, 0x00, 0x92, 0x00, 0x92, +0x00, 0x92, 0x00, 0x92, 0x84, 0xFC, 0xFF, 0x3B, +0x04, 0xFD, 0xFF, 0x3B, 0x04, 0xFE, 0xFF, 0x3B, +0x04, 0xBC, 0xFF, 0x3A, 0x04, 0xA8, 0x0F, 0x3A, +0x04, 0x00, 0x00, 0x64, 0x20, 0x46, 0x23, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x0A, 0x01, +0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, +0x09, 0x00, 0x00, 0x40, 0x84, 0xFC, 0xFF, 0x3B, +0x04, 0xFD, 0xFF, 0x3B, 0x04, 0xFE, 0xFF, 0x3B, +0x04, 0xBC, 0xFF, 0x3A, 0x04, 0xA8, 0x0F, 0x3A, +0x04, 0x00, 0x00, 0x64, 0x3C, 0xA8, 0x0F, 0x3A, +0x3C, 0xBC, 0xFF, 0x3A, 0x3C, 0xFE, 0xFF, 0x3B, +0x3C, 0xFD, 0xFF, 0x3B, 0xBC, 0xFC, 0xFF, 0x3B, +0x20, 0x46, 0x24, 0x84, 0x21, 0x58, 0x80, 0x00, +0x50, 0xAE, 0x0A, 0x01, 0x00, 0x92, 0x00, 0x92, +0x00, 0x92, 0x00, 0x92, 0xFF, 0x3B, 0x00, 0x92, +0xFF, 0x3B, 0x84, 0xFC, 0xFF, 0x3B, 0x04, 0xFD, +0xFF, 0x3A, 0x04, 0xFE, 0x0F, 0x3A, 0x04, 0xBC, +0x00, 0x64, 0x04, 0xA8, 0x00, 0x92, 0x04, 0x00, +0x80, 0x00, 0xD0, 0x47, 0x68, 0x81, 0xDE, 0x59, +0x80, 0x00, 0xC0, 0x47, 0x68, 0x00, 0xCE, 0x59, +0x83, 0x00, 0xF0, 0x47, 0xF0, 0x8F, 0xFF, 0x59, +0x16, 0x00, 0x00, 0x46, 0xC0, 0x0D, 0x00, 0x58, +0x21, 0x00, 0x0E, 0x42, 0xF4, 0x02, 0x00, 0x49, +0x78, 0x03, 0x00, 0x49, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0xD9, 0x94, 0x68, 0xFA, +0x18, 0xA4, 0x62, 0x88, 0x0B, 0x00, 0x00, 0x42, +0x04, 0x00, 0x03, 0x4E, 0x48, 0x03, 0x00, 0x49, +0x80, 0x00, 0xD0, 0x47, 0x68, 0x81, 0xDE, 0x59, +0x80, 0x00, 0xC0, 0x47, 0x68, 0x00, 0xCE, 0x59, +0x83, 0x00, 0xF0, 0x47, 0xF0, 0x8F, 0xFF, 0x59, +0x03, 0x64, 0x02, 0x84, 0x00, 0x48, 0x03, 0x00, +0x21, 0x84, 0x11, 0x05, 0x80, 0x00, 0x20, 0x46, +0x03, 0x01, 0x21, 0x58, 0x10, 0x46, 0x50, 0xAE, +0x10, 0x58, 0x80, 0x00, 0x01, 0xB4, 0x4C, 0x80, +0x80, 0x00, 0x10, 0x44, 0x15, 0x4E, 0x41, 0x9A, +0x10, 0x44, 0x37, 0x00, 0x41, 0x9A, 0x9F, 0x00, +0x32, 0x00, 0x16, 0x4E, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0xD9, 0x94, 0x60, 0xFA, +0x18, 0xA5, 0x62, 0x88, 0x61, 0x9A, 0x23, 0x84, +0x0D, 0x00, 0x15, 0x4E, 0x80, 0x00, 0xF0, 0x46, +0x97, 0x80, 0x17, 0x02, 0xF0, 0x46, 0x21, 0x92, +0x17, 0x12, 0x01, 0x01, 0x00, 0x48, 0x0A, 0x80, +0x20, 0x84, 0x13, 0x02, 0x01, 0x01, 0xF0, 0x46, +0x0A, 0x80, 0x17, 0x12, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0xD9, 0x94, 0x69, 0xFA, +0x18, 0xA5, 0x62, 0x88, 0x40, 0x4C, 0x20, 0x84, +0x22, 0x84, 0x03, 0x82, 0x00, 0x82, 0x40, 0x4C, +0x81, 0x00, 0x10, 0x46, 0xFC, 0x88, 0x10, 0x58, +0x74, 0x01, 0x00, 0x48, 0x00, 0x02, 0x10, 0x44, +0x15, 0x4E, 0x41, 0x9A, 0x00, 0x44, 0x0C, 0x00, +0x46, 0xFE, 0xFF, 0x00, 0xF0, 0x46, 0x4E, 0x94, +0x17, 0x12, 0x01, 0x01, 0x00, 0x48, 0x0A, 0x80, +0x20, 0x84, 0xEB, 0x01, 0x2C, 0x82, 0x00, 0x4C, +0x00, 0x4C, 0x21, 0x84, 0x23, 0x84, 0x29, 0x82, +0xCC, 0x81, 0x00, 0x4C, 0x00, 0x4C, 0x24, 0x84, +0x21, 0x84, 0x10, 0xC0, 0x80, 0x00, 0x20, 0x46, +0x06, 0x01, 0x21, 0x58, 0x22, 0x84, 0x50, 0xAE, +0x80, 0x00, 0x20, 0x46, 0x14, 0x01, 0x21, 0x58, +0x00, 0x48, 0x50, 0xAE, 0x25, 0x84, 0xBB, 0x01, +0x10, 0xC0, 0x00, 0x4C, 0x20, 0x46, 0x21, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x06, 0x01, +0x20, 0x46, 0x22, 0x84, 0x21, 0x58, 0x80, 0x00, +0x50, 0xAE, 0x14, 0x01, 0xAA, 0x01, 0x00, 0x48, +0x00, 0x4C, 0x26, 0x84, 0x21, 0x84, 0x0A, 0xC0, +0x80, 0x00, 0x20, 0x46, 0x14, 0x01, 0x21, 0x58, +0x00, 0x48, 0x50, 0xAE, 0x28, 0x84, 0x9F, 0x01, +0x06, 0xC0, 0x00, 0x4C, 0x6A, 0x02, 0x00, 0x49, +0x10, 0x00, 0x00, 0x48, 0x00, 0x4C, 0x27, 0x84, +0x20, 0x46, 0x57, 0xC0, 0x21, 0x58, 0x81, 0x00, +0x68, 0xFA, 0xFC, 0x08, 0x62, 0x88, 0xD9, 0x94, +0x00, 0x42, 0x18, 0xA4, 0x18, 0xAC, 0x09, 0x04, +0x20, 0x46, 0x00, 0x84, 0x21, 0x58, 0x81, 0x00, +0x30, 0x44, 0xFC, 0x08, 0xD9, 0x94, 0x2E, 0x01, +0x18, 0xAC, 0x62, 0x88, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0x2C, 0x01, 0x30, 0x44, +0x62, 0x88, 0xD9, 0x94, 0x00, 0x80, 0x01, 0x12, +0xE0, 0x01, 0x00, 0x49, 0xA2, 0x02, 0x00, 0x49, +0x80, 0x00, 0x30, 0x46, 0x38, 0x81, 0x31, 0x58, +0x02, 0xFE, 0x18, 0xA4, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0x2E, 0x01, 0x30, 0x44, +0x62, 0x88, 0xD9, 0x94, 0x00, 0x80, 0x01, 0x12, +0xCC, 0x01, 0x00, 0x49, 0x8E, 0x02, 0x00, 0x49, +0x20, 0x46, 0x00, 0x84, 0x21, 0x58, 0x81, 0x00, +0x30, 0x44, 0xFC, 0x08, 0xD9, 0x94, 0x2C, 0x01, +0x18, 0xAC, 0x62, 0x88, 0x20, 0x46, 0x22, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x14, 0x01, +0x80, 0x00, 0x20, 0x46, 0x38, 0x01, 0x21, 0x58, +0x40, 0x84, 0x50, 0xA4, 0x06, 0xC0, 0x00, 0x4C, +0xAA, 0x55, 0x00, 0x44, 0x00, 0x80, 0x01, 0x12, +0x40, 0x01, 0x00, 0x48, 0x00, 0x4C, 0x29, 0x84, +0x01, 0x84, 0x0A, 0xC0, 0x80, 0x00, 0x20, 0x46, +0x40, 0x01, 0x21, 0x58, 0x00, 0x48, 0x10, 0xAC, +0x00, 0x92, 0x8F, 0x01, 0x00, 0x4C, 0x2F, 0x84, +0x21, 0x84, 0x0B, 0xC0, 0x80, 0x00, 0x20, 0x46, +0x19, 0x01, 0x21, 0x58, 0xFF, 0x3B, 0x50, 0xAE, +0x1E, 0xDD, 0x84, 0xFC, 0x80, 0x00, 0x10, 0x46, +0x4C, 0x80, 0x10, 0x58, 0x10, 0x44, 0x01, 0xB4, +0x41, 0x9A, 0x00, 0x02, 0x0A, 0x00, 0x15, 0x4E, +0x01, 0x01, 0x30, 0x46, 0x40, 0x80, 0x31, 0x58, +0xFF, 0x3B, 0x23, 0xB6, 0x1E, 0xDD, 0x84, 0xFC, +0x81, 0x00, 0x20, 0x46, 0xFC, 0x08, 0x21, 0x58, +0xD9, 0x94, 0x60, 0xFA, 0x98, 0xA4, 0x62, 0x88, +0x80, 0x00, 0xF0, 0x46, 0x67, 0x80, 0x27, 0x14, +0x81, 0x00, 0x10, 0x46, 0xFC, 0x88, 0x10, 0x58, +0x92, 0x00, 0x00, 0x49, 0x80, 0x00, 0xF0, 0x46, +0x12, 0x80, 0x27, 0x04, 0x51, 0x9A, 0x21, 0x84, +0x06, 0x00, 0x16, 0x4E, 0x84, 0xFC, 0xFF, 0x3B, +0x00, 0x78, 0x00, 0x4A, 0x80, 0x00, 0x10, 0x46, +0x4C, 0x80, 0x10, 0x58, 0x20, 0xFA, 0x01, 0xB4, +0x3C, 0xC0, 0x00, 0x4C, 0xEC, 0x00, 0x00, 0x49, +0x81, 0x00, 0x20, 0x46, 0xFC, 0x08, 0x21, 0x58, +0xD9, 0x94, 0x60, 0xFA, 0x18, 0xA4, 0x62, 0x88, +0x40, 0x46, 0xA1, 0x84, 0x42, 0x58, 0x80, 0x00, +0x60, 0xAF, 0x0B, 0x01, 0x41, 0x9A, 0x25, 0x84, +0x0E, 0x00, 0x17, 0x4E, 0x41, 0x9A, 0x23, 0x84, +0x0A, 0x00, 0x17, 0x4E, 0x20, 0x46, 0x22, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x14, 0x01, +0xD0, 0x00, 0x00, 0x48, 0x80, 0x00, 0xF0, 0x46, +0x67, 0x80, 0x07, 0x04, 0x41, 0x9A, 0x25, 0x84, +0x04, 0x00, 0x16, 0x4E, 0xC6, 0x00, 0x00, 0x48, +0x00, 0x00, 0x10, 0x46, 0x03, 0x80, 0x10, 0x58, +0x04, 0x40, 0x10, 0x4C, 0xBE, 0x00, 0x00, 0x48, +0x20, 0x46, 0x22, 0x84, 0x21, 0x58, 0x80, 0x00, +0x50, 0xAE, 0x14, 0x01, 0xB6, 0x00, 0x00, 0x48, +0x60, 0x00, 0x10, 0x44, 0x15, 0x4E, 0x41, 0x9A, +0x10, 0x44, 0x0F, 0x00, 0x41, 0x9A, 0x7F, 0x00, +0x0A, 0x00, 0x16, 0x4E, 0x20, 0x46, 0x22, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x14, 0x01, +0xA4, 0x00, 0x00, 0x48, 0x00, 0x01, 0x10, 0x44, +0x14, 0x4E, 0x41, 0x9A, 0xFF, 0x3B, 0x05, 0x00, +0x1E, 0xDD, 0x84, 0xFC, 0x16, 0x01, 0x10, 0x44, +0x06, 0xC0, 0x00, 0x4C, 0x84, 0xFC, 0xFF, 0x3B, +0x00, 0x78, 0x00, 0x4A, 0x6A, 0x01, 0x10, 0x44, +0x06, 0xC0, 0x00, 0x4C, 0x84, 0xFC, 0xFF, 0x3B, +0x00, 0x78, 0x00, 0x4A, 0x6C, 0x01, 0x10, 0x44, +0x06, 0xC0, 0x00, 0x4C, 0x84, 0xFC, 0xFF, 0x3B, +0x00, 0x78, 0x00, 0x4A, 0x4F, 0x01, 0x10, 0x44, +0x17, 0x4E, 0x41, 0x9A, 0xFF, 0x3B, 0x05, 0x00, +0x1E, 0xDD, 0x84, 0xFC, 0x20, 0x46, 0x22, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x14, 0x01, +0x74, 0x00, 0x00, 0x48, 0xBC, 0xFC, 0xFF, 0x3B, +0x20, 0x88, 0x01, 0x94, 0x80, 0x00, 0xF0, 0x46, +0x12, 0x80, 0x37, 0x04, 0x5D, 0xCB, 0x61, 0x8E, +0x01, 0x01, 0x30, 0x46, 0x40, 0x80, 0x31, 0x58, +0x08, 0xA4, 0x48, 0x84, 0x03, 0xB6, 0x00, 0x96, +0x08, 0xA4, 0xDC, 0x9C, 0x03, 0xB6, 0x08, 0x92, +0x4A, 0x9C, 0xDC, 0x9C, 0xF6, 0xCA, 0x41, 0x8E, +0x81, 0x00, 0x20, 0x46, 0xFC, 0x08, 0x21, 0x58, +0x1E, 0x01, 0x30, 0x44, 0x62, 0x88, 0xD9, 0x94, +0x10, 0x42, 0x58, 0xA4, 0x03, 0xC9, 0x0B, 0xBC, +0x3A, 0x00, 0x00, 0x48, 0x38, 0x00, 0x00, 0x48, +0x80, 0x00, 0x30, 0x46, 0x4C, 0x80, 0x31, 0x58, +0x30, 0x44, 0x23, 0xB5, 0x34, 0x40, 0x6C, 0x01, +0x03, 0xCB, 0x01, 0x8C, 0x2C, 0x00, 0x00, 0x48, +0x6A, 0x01, 0x30, 0x44, 0x62, 0x88, 0xD9, 0x94, +0x00, 0x80, 0x91, 0x02, 0x00, 0x00, 0x10, 0x46, +0xF0, 0x46, 0x21, 0x80, 0x17, 0x14, 0x00, 0x01, +0x30, 0x46, 0x01, 0x80, 0x31, 0x58, 0x01, 0x01, +0x92, 0x4E, 0x40, 0x80, 0x00, 0x85, 0x19, 0x00, +0xDC, 0x9C, 0x03, 0xB4, 0xDC, 0x9C, 0x23, 0xB4, +0x08, 0xA0, 0x10, 0x40, 0x00, 0x89, 0x01, 0x88, +0x93, 0x4E, 0x21, 0x8F, 0x20, 0x46, 0xF7, 0xFF, +0x21, 0x58, 0x81, 0x00, 0x30, 0x44, 0xFC, 0x08, +0xD9, 0x94, 0x6C, 0x01, 0x00, 0x88, 0x31, 0x40, +0x00, 0x80, 0x81, 0x12, 0x84, 0xFC, 0xFF, 0x3B, +0x00, 0x78, 0x00, 0x4A, 0xBC, 0xFC, 0xFF, 0x3B, +0x80, 0x00, 0x30, 0x46, 0x4C, 0x80, 0x31, 0x58, +0x03, 0xB4, 0x64, 0x8C, 0xFF, 0x3B, 0x08, 0xAC, +0x1E, 0xDD, 0x84, 0xFC, 0xBC, 0xFC, 0xFF, 0x3B, +0xF0, 0x46, 0x20, 0x84, 0x17, 0x10, 0x01, 0x01, +0xF0, 0x46, 0x28, 0x80, 0x07, 0x04, 0x03, 0x01, +0x10, 0x44, 0x01, 0x83, 0x0E, 0xFE, 0xFE, 0xFF, +0x03, 0x01, 0xF0, 0x46, 0x01, 0x83, 0x07, 0x14, +0x84, 0xFC, 0xFF, 0x3B, 0x00, 0x78, 0x00, 0x4A, +0xBC, 0xFC, 0xFF, 0x3B, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0x1E, 0x01, 0x30, 0x44, +0x62, 0x88, 0xD9, 0x94, 0x10, 0x42, 0x58, 0xA4, +0x03, 0xC9, 0x0B, 0xBC, 0x26, 0x00, 0x00, 0x48, +0x6A, 0x01, 0x30, 0x44, 0x62, 0x88, 0xD9, 0x94, +0x00, 0x80, 0x91, 0x02, 0x00, 0x00, 0x10, 0x46, +0xF0, 0x46, 0x21, 0x80, 0x17, 0x14, 0x00, 0x01, +0x30, 0x46, 0x01, 0x80, 0x63, 0x80, 0x8C, 0x00, +0x14, 0x00, 0x92, 0x4E, 0x00, 0x00, 0x80, 0x44, +0x01, 0x80, 0x01, 0x0A, 0x21, 0x8F, 0x00, 0x89, +0xFC, 0xFF, 0x93, 0x4E, 0x81, 0x00, 0x20, 0x46, +0xFC, 0x08, 0x21, 0x58, 0x6C, 0x01, 0x30, 0x44, +0x62, 0x88, 0xD9, 0x94, 0x00, 0x80, 0x81, 0x12, +0x00, 0x00, 0x00, 0x46, 0x01, 0x00, 0x00, 0x58, +0x00, 0x01, 0xF0, 0x46, 0x01, 0x80, 0x07, 0x14, +0xF0, 0x46, 0x11, 0xFA, 0x0F, 0xB6, 0x01, 0x01, +0x84, 0xFC, 0xFF, 0x3B, 0x00, 0x78, 0x00, 0x4A, +0xBC, 0xFC, 0xFF, 0x3B, 0x20, 0x46, 0x20, 0x84, +0x21, 0x58, 0x80, 0x00, 0x50, 0xAE, 0x06, 0x01, +0x20, 0x46, 0x22, 0x84, 0x21, 0x58, 0x80, 0x00, +0x50, 0xAE, 0x14, 0x01, 0x98, 0xFF, 0xFF, 0x49, +0x84, 0xFC, 0xFF, 0x3B, 0x00, 0x78, 0x00, 0x4A, +0xBC, 0xFC, 0xFF, 0x3B, 0x00, 0x00, 0x10, 0x44, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x17, 0x14, +0x81, 0x00, 0x10, 0x46, 0xFC, 0x88, 0x10, 0x58, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x07, 0x04, +0xF0, 0x46, 0x48, 0x98, 0x17, 0x14, 0x80, 0x00, +0x20, 0xFA, 0x0B, 0x80, 0x80, 0x00, 0xF0, 0x46, +0x0C, 0x80, 0x17, 0x14, 0x07, 0x00, 0x10, 0x46, +0x00, 0x85, 0x10, 0x58, 0x80, 0x00, 0xF0, 0x46, +0x5B, 0x80, 0x07, 0x04, 0xF0, 0x46, 0x48, 0x98, +0x17, 0x14, 0x80, 0x00, 0x00, 0x46, 0x0A, 0x80, +0x00, 0x58, 0x01, 0x00, 0x20, 0xDD, 0xD4, 0x0F, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x17, 0x04, +0x40, 0x80, 0x10, 0x50, 0x80, 0x00, 0xF0, 0x46, +0x5B, 0x80, 0x17, 0x14, 0xFF, 0x03, 0x00, 0x44, +0x15, 0x4E, 0x48, 0x9A, 0xFF, 0x3B, 0xCF, 0xFF, +0x1E, 0xDD, 0x84, 0xFC, 0xBC, 0xFC, 0xFF, 0x3B, +0x81, 0x00, 0x10, 0x46, 0xFC, 0x88, 0x10, 0x58, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x07, 0x04, +0xF0, 0x46, 0x48, 0x98, 0x17, 0x14, 0x80, 0x00, +0x10, 0x44, 0x0B, 0x80, 0xF0, 0x46, 0x00, 0x01, +0x17, 0x14, 0x80, 0x00, 0x10, 0x46, 0x0C, 0x80, +0x10, 0x58, 0x07, 0x00, 0xF0, 0x46, 0x00, 0x85, +0x17, 0x14, 0x80, 0x00, 0x00, 0x46, 0x0A, 0x80, +0x00, 0x58, 0x01, 0x00, 0x20, 0xDD, 0x70, 0x0F, +0x84, 0xFC, 0xFF, 0x3B, 0x00, 0x78, 0x00, 0x4A, +0xBC, 0xFC, 0xFF, 0x3B, 0x00, 0x00, 0x10, 0x44, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x17, 0x14, +0x80, 0x00, 0x10, 0x46, 0x94, 0x88, 0x10, 0x58, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x07, 0x04, +0xF0, 0x46, 0x48, 0x98, 0x17, 0x14, 0x80, 0x00, +0x20, 0xFA, 0x0B, 0x80, 0x80, 0x00, 0xF0, 0x46, +0x0C, 0x80, 0x17, 0x14, 0x07, 0x00, 0x10, 0x46, +0x00, 0x8A, 0x10, 0x58, 0x80, 0x00, 0xF0, 0x46, +0x5B, 0x80, 0x07, 0x04, 0xF0, 0x46, 0x48, 0x98, +0x17, 0x14, 0x80, 0x00, 0x00, 0x46, 0x0A, 0x80, +0x00, 0x58, 0x01, 0x00, 0x20, 0xDD, 0xD4, 0x0F, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x17, 0x04, +0x40, 0x80, 0x10, 0x50, 0x80, 0x00, 0xF0, 0x46, +0x5B, 0x80, 0x17, 0x14, 0x80, 0x04, 0x00, 0x44, +0x15, 0x4E, 0x48, 0x9A, 0xFF, 0x3B, 0xCF, 0xFF, +0x1E, 0xDD, 0x84, 0xFC, 0xBC, 0xFC, 0xFF, 0x3B, +0x80, 0x00, 0x10, 0x46, 0x94, 0x88, 0x10, 0x58, +0x80, 0x00, 0xF0, 0x46, 0x0B, 0x80, 0x17, 0x14, +0x20, 0x01, 0x10, 0x44, 0x80, 0x00, 0xF0, 0x46, +0x0C, 0x80, 0x17, 0x14, 0x07, 0x00, 0x10, 0x46, +0x00, 0x8A, 0x10, 0x58, 0x80, 0x00, 0xF0, 0x46, +0x0A, 0x80, 0x17, 0x14, 0x01, 0x00, 0x00, 0x46, +0x70, 0x0F, 0x00, 0x58, 0x01, 0x00, 0xE0, 0x4B, +0x84, 0xFC, 0xFF, 0x3B, 0x00, 0x78, 0x00, 0x4A, +0xBC, 0xFC, 0xFF, 0x3B, 0xF0, 0x46, 0x20, 0x84, +0x17, 0x14, 0x80, 0x00, 0x00, 0x46, 0x5B, 0x80, +0x00, 0x58, 0x80, 0x00, 0x40, 0xAC, 0x38, 0x01, +0x81, 0x00, 0x10, 0x46, 0x8C, 0x8D, 0x10, 0x58, +0x80, 0x00, 0xF0, 0x46, 0x0B, 0x80, 0x17, 0x14, +0x00, 0x01, 0x10, 0x44, 0x80, 0x00, 0xF0, 0x46, +0x0C, 0x80, 0x17, 0x14, 0x80, 0x00, 0xF0, 0x46, +0x5B, 0x80, 0x17, 0x04, 0x80, 0x00, 0xF0, 0x46, +0x0A, 0x80, 0x17, 0x14, 0x01, 0x00, 0x00, 0x46, +0x70, 0x0F, 0x00, 0x58, 0x01, 0x00, 0xE0, 0x4B, +0x00, 0x02, 0x20, 0x44, 0x81, 0x00, 0x10, 0x46, +0x8C, 0x8D, 0x10, 0x58, 0x80, 0x00, 0x00, 0x46, +0x38, 0x01, 0x00, 0x58, 0x08, 0xA4, 0xC0, 0xA4, +0x4A, 0x9C, 0x60, 0x88, 0xFC, 0xCA, 0x41, 0x8E, +0x80, 0x00, 0x00, 0x46, 0x38, 0x01, 0x00, 0x58, +0x00, 0x00, 0x30, 0x12, 0x80, 0x00, 0xF0, 0x46, +0x5B, 0x80, 0x17, 0x04, 0x00, 0x84, 0x10, 0x50, +0x80, 0x00, 0xF0, 0x46, 0x5B, 0x80, 0x17, 0x14, +0x00, 0x80, 0x00, 0x44, 0x04, 0x00, 0x10, 0x4C, +0xC0, 0xFF, 0xFF, 0x48, 0x84, 0xFC, 0xFF, 0x3B, +0x00, 0x92, 0x1E, 0xDD, 0x09, 0x00, 0x00, 0x40, +0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x40, +0x80, 0x00, 0x00, 0x46, 0x20, 0x84, 0x00, 0x80, +0x00, 0x02, 0x20, 0x44, 0x41, 0x8E, 0x41, 0xAA, +0x00, 0x46, 0xFE, 0xCA, 0x00, 0x58, 0x00, 0x00, +0x00, 0xDD, 0x7A, 0x01, 0x09, 0x00, 0x00, 0x40, +0xBC, 0xFD, 0xFF, 0x3B, 0x01, 0x00, 0x00, 0x46, +0xB0, 0x0F, 0x00, 0x58, 0x01, 0x00, 0xE0, 0x4B, +0x84, 0xFD, 0xFF, 0x3B, 0x00, 0x92, 0x9E, 0xDD, +0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0x40, +0x00, 0x84, 0x00, 0xFC, 0x9E, 0xFF, 0x07, 0x3E, +0xB1, 0xFF, 0x07, 0x3E, 0x00, 0xFC, 0x80, 0xFC, +0xF8, 0xFF, 0xFF, 0x49, 0x00, 0x0D, 0x14, 0x3C, +0x05, 0xE8, 0x24, 0xE4, 0x00, 0x0D, 0x04, 0x3C, +0x05, 0x00, 0x04, 0x4E, 0x18, 0x3C, 0x20, 0x84, +0x41, 0xDD, 0x00, 0x0D, 0x36, 0x01, 0x20, 0x22, +0x20, 0x14, 0x46, 0xEA, 0x10, 0x22, 0x04, 0x83, +0xF0, 0x5E, 0x25, 0x01, 0x06, 0xE9, 0x33, 0x80, +0x25, 0x01, 0x00, 0x22, 0x00, 0x01, 0xF0, 0x5E, +0x10, 0x44, 0x05, 0xE9, 0x18, 0x3C, 0x9B, 0x00, +0x41, 0xDD, 0xEF, 0x0C, 0x25, 0x01, 0x20, 0x02, +0xE7, 0xFF, 0x2B, 0x3C, 0x25, 0x01, 0x20, 0x22, +0x20, 0x14, 0x46, 0xEA, 0x41, 0x84, 0x09, 0x83, +0x08, 0x83, 0x20, 0x14, 0x10, 0x12, 0x39, 0xEA, +0x80, 0xFC, 0x2D, 0x01, 0x70, 0xEA, 0x00, 0xFC, +0x52, 0xDD, 0x20, 0xFA, 0x00, 0xFC, 0x80, 0xFC, +0x10, 0x44, 0x70, 0xEA, 0x52, 0xDD, 0xFF, 0xFF, +0x20, 0xFC, 0x80, 0xFC, 0x04, 0xC8, 0xE0, 0x80, +0x00, 0x48, 0x01, 0x84, 0x46, 0xDD, 0x95, 0x00, +0x02, 0x01, 0x10, 0x46, 0x08, 0x00, 0x28, 0x46, +0x04, 0x81, 0x10, 0x58, 0x43, 0xDD, 0x41, 0xB6, +0x10, 0x58, 0xC0, 0x84, 0xC1, 0xB6, 0x08, 0x81, +0x10, 0x58, 0x43, 0xDD, 0xC1, 0xB6, 0x0C, 0x81, +0x70, 0x07, 0x20, 0x46, 0x21, 0x58, 0x43, 0xDD, +0x10, 0x58, 0x77, 0x00, 0x41, 0xB6, 0x10, 0x81, +0x10, 0x58, 0x43, 0xDD, 0xC1, 0xB6, 0x14, 0x81, +0x10, 0x58, 0x43, 0xDD, 0xC1, 0xB6, 0x68, 0x80, +0x55, 0xEA, 0x72, 0xEA, 0x00, 0x01, 0x10, 0x46, +0x20, 0x88, 0x10, 0x58, 0x10, 0x46, 0xC1, 0xB6, +0x10, 0x58, 0x80, 0x00, 0x00, 0x44, 0x44, 0x80, +0x01, 0xB6, 0x5A, 0x00, 0x10, 0x58, 0x46, 0xEA, +0x00, 0x44, 0x04, 0x8C, 0x01, 0xB6, 0x10, 0x40, +0x00, 0x92, 0xFF, 0x83, 0x21, 0x58, 0x4F, 0xDD, +0x01, 0x84, 0x40, 0x08, 0x00, 0x92, 0x10, 0xAE, +0x21, 0x58, 0x4F, 0xDD, 0xE2, 0xB6, 0x08, 0x08, +0x4F, 0xDD, 0x00, 0x92, 0x04, 0x08, 0x21, 0x58, +0x02, 0xB6, 0x01, 0x84, 0xC2, 0xB6, 0x00, 0x92, +0xBD, 0xEA, 0x00, 0x92, 0x20, 0x00, 0x21, 0x58, +0x2F, 0x3E, 0x02, 0xB6, 0x90, 0xAF, 0x9B, 0xFF, +0x21, 0x58, 0x4F, 0xDD, 0x30, 0x44, 0x40, 0x0C, +0x62, 0xB6, 0x03, 0x03, 0x9E, 0xEA, 0x4F, 0xDD, +0xC1, 0xB6, 0x02, 0xB6, 0x46, 0xEA, 0x00, 0x92, +0x28, 0x8C, 0x10, 0x58, 0x00, 0x92, 0x01, 0xB6, +0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, +0x00, 0x92, 0x00, 0x92, 0x00, 0x92, 0x00, 0x92, +0x00, 0x92, 0x00, 0x92, 0xB1, 0x9D, 0x00, 0x92, +0xFD, 0x08, 0x68, 0x5A, 0x00, 0x4E, 0x00, 0x92, +0xBD, 0xEA, 0xBF, 0xFF, 0x60, 0x84, 0x4B, 0xEA, +0x20, 0x00, 0x21, 0x58, 0xC0, 0x00, 0x00, 0x58, +0x62, 0xB6, 0x00, 0xB4, 0x82, 0xB4, 0xBD, 0xEA, +0x42, 0x42, 0x04, 0x96, 0x82, 0xB6, 0x08, 0x3C, +0x9E, 0xEA, 0x4F, 0xDD, 0x4F, 0xDD, 0x62, 0xB6, +0x40, 0x08, 0x21, 0x58, 0x00, 0x92, 0xD0, 0xAE, +0x21, 0x58, 0x4F, 0xDD, 0x81, 0x84, 0x04, 0x08, +0x00, 0x92, 0x82, 0xB6, 0x00, 0x92, 0x62, 0xB6, +0x41, 0xB6, 0x40, 0xFA, 0x00, 0xFC, 0xA0, 0xFC, +0xE8, 0xFF, 0x13, 0x3C, 0x10, 0x44, 0x04, 0xC9, +0x02, 0xD5, 0xAA, 0x55, 0x18, 0x3C, 0x20, 0x84, +0x41, 0xDD, 0xF6, 0x0C, 0x60, 0x00, 0x10, 0x22, +0x04, 0x00, 0x16, 0x4E, 0x06, 0xD5, 0x20, 0xFA, +0x60, 0x00, 0x10, 0x22, 0x04, 0xE9, 0x39, 0xE4, +0x10, 0x12, 0x28, 0xFA, 0x10, 0x22, 0x60, 0x00, +0x16, 0x4E, 0x61, 0x00, 0x28, 0x84, 0x04, 0x00, +0x10, 0x22, 0x06, 0xD5, 0x2F, 0xE4, 0x61, 0x00, +0x2E, 0x84, 0x04, 0xE9, 0x61, 0x00, 0x10, 0x12, +0x8A, 0x0C, 0x14, 0x3C, 0x06, 0x00, 0x16, 0x4E, +0xD0, 0x02, 0x10, 0x44, 0x8A, 0x0C, 0x18, 0x3C, +0x8B, 0x0C, 0x14, 0x3C, 0x06, 0x00, 0x16, 0x4E, +0x00, 0x04, 0x10, 0x44, 0x8B, 0x0C, 0x18, 0x3C, +0x15, 0x00, 0x10, 0x22, 0x02, 0xE9, 0x2B, 0xE4, +0x10, 0x22, 0x05, 0xD5, 0x14, 0x4E, 0x15, 0x00, +0x2A, 0x84, 0x05, 0x00, 0x15, 0x00, 0x10, 0x12, +0x19, 0x00, 0x10, 0x22, 0x10, 0x00, 0x10, 0x12, +0x40, 0xE2, 0x1F, 0x44, 0x20, 0x01, 0x10, 0x12, +0x10, 0x12, 0x24, 0x84, 0x23, 0x84, 0x12, 0x00, +0x21, 0x01, 0x10, 0x12, 0x10, 0x12, 0x20, 0x84, +0x17, 0x3E, 0x6A, 0x01, 0x10, 0x12, 0x9C, 0xFF, +0x80, 0xFC, 0x16, 0x01, 0x0F, 0x3C, 0x00, 0xFC, +0x08, 0x3E, 0xFC, 0xFF, 0x20, 0x84, 0x54, 0x00, +0x42, 0xAE, 0x46, 0xAE, 0x80, 0xFC, 0x40, 0xAC, +0x45, 0xDD, 0x40, 0xFC, 0xFD, 0xFE, 0xFF, 0x49, +0x9B, 0xFF, 0xFF, 0x49, 0xC1, 0xFE, 0xFF, 0x49, +0x9D, 0x1B, 0x08, 0x3E, 0x3C, 0x00, 0x10, 0x50, +0x90, 0x18, 0x20, 0x85, 0x00, 0x4C, 0x06, 0x00, +0x7F, 0x3E, 0xFE, 0xFF, 0x37, 0xEA, 0xAC, 0xFF, +0x00, 0x49, 0xA5, 0xEA, 0x93, 0x10, 0x85, 0x13, +0xFF, 0x49, 0x00, 0x80, 0x2B, 0xEA, 0xE1, 0xFE, +0x08, 0xC0, 0x0E, 0x96, 0x94, 0x0D, 0x04, 0x3C, +0x05, 0x00, 0x07, 0x4E, 0x17, 0x3E, 0x21, 0x84, +0x00, 0x84, 0x9A, 0xFF, 0x0C, 0x00, 0x0E, 0x3C, +0xA0, 0xFF, 0x07, 0x3E, 0xA2, 0xFF, 0x07, 0x3E, +0x54, 0x00, 0x68, 0x3E, 0xB1, 0xFF, 0x07, 0x2E, +0x97, 0x3E, 0x05, 0xC0, 0xFF, 0x49, 0xB1, 0xFF, +0x07, 0x2E, 0x6D, 0xFE, 0x0D, 0xC0, 0x9E, 0xFF, +0x32, 0xAE, 0x02, 0x84, 0x31, 0x0D, 0x04, 0x3C, +0x00, 0x96, 0xBA, 0xF8, 0x4D, 0xDD, 0xF0, 0xC0, +0x97, 0x3E, 0x1F, 0xF9, 0xD0, 0xD5, 0x9E, 0xFF, +0x9E, 0xFF, 0x07, 0x2E, 0x32, 0xA6, 0x08, 0xC8, +0x06, 0x02, 0x08, 0x5A, 0x64, 0x00, 0x00, 0x44, +0xC6, 0xD5, 0x13, 0xF9, 0x00, 0x54, 0x26, 0xEA, +0x32, 0xC0, 0x00, 0x40, 0x20, 0x5A, 0xB2, 0xA6, +0x44, 0xDD, 0x30, 0x02, 0xEE, 0x80, 0x10, 0x50, +0x1F, 0x96, 0x0F, 0xA4, 0x0F, 0xA4, 0x25, 0xC0, +0x08, 0x5A, 0x1F, 0x96, 0x32, 0xAE, 0x04, 0x01, +0x0F, 0xA4, 0x21, 0xD5, 0x08, 0x5A, 0x1F, 0x96, +0x15, 0xCA, 0x20, 0x03, 0x99, 0xFF, 0x00, 0x22, +0x18, 0xE8, 0x06, 0xE4, 0x03, 0xC0, 0x4B, 0xDD, +0x16, 0xD5, 0xB0, 0xAC, 0x00, 0x00, 0x23, 0x22, +0x5D, 0x80, 0x10, 0x22, 0xF0, 0xAC, 0xD1, 0x9C, +0x0E, 0xE8, 0x22, 0xE0, 0x01, 0x84, 0x30, 0xAC, +0x0A, 0xD5, 0x32, 0xAE, 0x07, 0x01, 0x28, 0x5A, +0x04, 0xC0, 0x4B, 0xDD, 0xE0, 0xF8, 0x00, 0x84, +0x00, 0x84, 0x03, 0xD5, 0xB2, 0xA6, 0x30, 0xAC, +0x0D, 0x01, 0x28, 0x5A, 0xBB, 0x0C, 0x14, 0x3C, +0x06, 0x00, 0x17, 0x4E, 0x0C, 0x0D, 0x10, 0x3C, +0xE9, 0xFF, 0x1B, 0x3C, 0xAC, 0x0C, 0x04, 0x3C, +0x28, 0x5A, 0x08, 0xD5, 0x40, 0x84, 0x0A, 0x02, +0xE9, 0xFF, 0x2B, 0x3C, 0x31, 0x0D, 0x04, 0x3C, +0x00, 0x96, 0x5E, 0xF8, 0x00, 0x3C, 0x06, 0xD5, +0x0B, 0x3C, 0xBB, 0x0C, 0x0E, 0xD5, 0xE9, 0xFF, +0x32, 0xA6, 0x0D, 0xC0, 0x20, 0x84, 0x0B, 0xC0, +0x17, 0x3E, 0x70, 0xAC, 0xE2, 0x85, 0x9E, 0xFF, +0x86, 0xBF, 0x07, 0x4C, 0x64, 0x00, 0x00, 0x44, +0xA3, 0x3C, 0xB3, 0xF8, 0xA2, 0x4E, 0xEC, 0xFF, +0x20, 0x84, 0x09, 0x00, 0xEC, 0xFF, 0x1B, 0x3C, +0xAA, 0x2C, 0x00, 0x49, 0x5D, 0xFF, 0xFF, 0x48, +0x08, 0x5A, 0x38, 0xA6, 0x00, 0x3C, 0x0B, 0x01, +0x08, 0x5A, 0xDA, 0x0B, 0x00, 0x49, 0x07, 0x07, +0xA3, 0x10, 0xA2, 0x06, 0xA0, 0xF8, 0x00, 0x80, +0xE2, 0x85, 0x38, 0xA6, 0x4D, 0xBF, 0x07, 0x4C, +0x08, 0x5A, 0x38, 0xA6, 0x10, 0x3C, 0x0E, 0x01, +0x9D, 0xEA, 0x45, 0x0C, 0xA8, 0x3C, 0x40, 0x85, +0x00, 0x84, 0xCA, 0x0D, 0x00, 0x80, 0x93, 0x10, +0xA7, 0x3E, 0x4A, 0xEA, 0x41, 0xDD, 0xA5, 0xFF, +0x10, 0x22, 0x12, 0x8C, 0x23, 0xE4, 0x07, 0x00, +0x60, 0xF8, 0x2A, 0xE8, 0x2B, 0x3C, 0x40, 0x84, +0x40, 0x81, 0xF0, 0xFF, 0xA3, 0x4E, 0x5E, 0xF8, +0x5F, 0xF8, 0x03, 0x00, 0x56, 0x07, 0x04, 0x3C, +0xE7, 0x0B, 0x08, 0x3C, 0xF0, 0xFF, 0x07, 0x3C, +0xE6, 0x0C, 0x08, 0x3C, 0xB7, 0x2B, 0x00, 0x49, +0x26, 0xEA, 0x0C, 0xC0, 0x09, 0xC0, 0x04, 0x96, +0x46, 0x0C, 0x04, 0x3C, 0x0F, 0xFE, 0xFF, 0x49, +0x03, 0xC0, 0x00, 0x96, 0x64, 0xF8, 0x4D, 0xDD, +0x02, 0x00, 0x03, 0x22, 0x04, 0x00, 0x07, 0x4E, +0x32, 0xAC, 0x01, 0x9E, 0xAF, 0x2A, 0x00, 0x49, +0x54, 0x00, 0x00, 0x48, 0x10, 0x5A, 0x47, 0xA4, +0x47, 0xA4, 0x0B, 0x07, 0x08, 0x06, 0x10, 0x5A, +0x10, 0x5A, 0x47, 0xA4, 0x47, 0xA4, 0x05, 0x09, +0x10, 0x0B, 0x18, 0x5A, 0x4E, 0xDD, 0x53, 0xDD, +0x51, 0xDD, 0x41, 0x84, 0x49, 0xDD, 0x46, 0xDD, +0xDA, 0x0B, 0x00, 0x3C, 0x36, 0x09, 0x00, 0x5A, +0x00, 0x84, 0x48, 0xEA, 0x31, 0xD5, 0x5C, 0xDD, +0x10, 0x5A, 0x47, 0xA4, 0x47, 0xA4, 0x2F, 0x08, +0x05, 0x0C, 0x18, 0x5A, 0x20, 0x80, 0x00, 0x84, +0x47, 0xA4, 0x07, 0xD5, 0x07, 0x0D, 0x18, 0x5A, +0x55, 0x01, 0x10, 0x02, 0x7E, 0xEA, 0x01, 0x84, +0x47, 0xA4, 0x20, 0xD5, 0x05, 0x0E, 0x18, 0x5A, +0x66, 0x2E, 0x00, 0x49, 0x07, 0xA4, 0x1A, 0xD5, +0x05, 0x0F, 0x08, 0x5A, 0x06, 0x2F, 0x00, 0x49, +0x00, 0x49, 0x14, 0xD5, 0x40, 0x81, 0xA3, 0x06, +0x8B, 0x13, 0x00, 0x49, 0x0A, 0x00, 0xA3, 0x4E, +0x63, 0x04, 0x1C, 0x3C, 0xF0, 0x46, 0x49, 0x9C, +0x1E, 0x3C, 0x81, 0x00, 0xFF, 0x83, 0x63, 0x04, +0x56, 0x07, 0x14, 0x3C, 0xE7, 0x0B, 0x18, 0x3C, +0x0E, 0xF8, 0x4D, 0xDD, 0xBF, 0x2B, 0x00, 0x49, +0x49, 0x0C, 0x04, 0x3C, 0x91, 0x2F, 0x00, 0x49, +0x02, 0x4E, 0x50, 0xDD, 0x32, 0xA6, 0xD5, 0xFE, +0x05, 0x01, 0x08, 0x5A, 0xFF, 0x49, 0x00, 0x84, +0x00, 0x84, 0x97, 0xFE, 0xFF, 0x48, 0x30, 0xAC, +0x40, 0xFC, 0xCB, 0xFE, 0xC2, 0x80, 0x40, 0x84, +0x0D, 0xD5, 0x22, 0x80, 0x01, 0x00, 0x64, 0x0A, +0x63, 0x1A, 0xD9, 0x9C, 0x90, 0x3C, 0x01, 0x80, +0x9C, 0x99, 0x4A, 0x00, 0x69, 0xE0, 0x49, 0x9C, +0x91, 0x9C, 0xF6, 0xE9, 0x49, 0x00, 0x30, 0x3C, +0x09, 0xE8, 0x43, 0xE0, 0x00, 0x84, 0x80, 0x40, +0x00, 0x89, 0xF6, 0x99, 0xC7, 0x99, 0x86, 0x80, +0xEE, 0xD5, 0x60, 0x84, 0xD0, 0x00, 0x10, 0x02, +0xDB, 0x00, 0x60, 0x02, 0xB6, 0x00, 0x10, 0x12, +0xBB, 0x00, 0x60, 0x12, 0x44, 0xFC, 0xC0, 0xFC, +0x49, 0x00, 0x90, 0x3C, 0x4A, 0x00, 0x60, 0x3C, +0x40, 0x80, 0x00, 0x84, 0x94, 0x17, 0x58, 0x3E, +0x8F, 0x50, 0x2D, 0xEA, 0x27, 0xD5, 0x04, 0x80, +0x01, 0x80, 0xA0, 0x54, 0x0A, 0x84, 0x30, 0x40, +0x08, 0x00, 0xA2, 0x4E, 0xF3, 0x80, 0x31, 0x50, +0x11, 0x8D, 0x32, 0x38, 0x06, 0xD5, 0x68, 0x90, +0xF3, 0x80, 0x31, 0x50, 0x01, 0x8D, 0x32, 0x38, +0x6E, 0xE4, 0xD8, 0x96, 0x72, 0x38, 0x05, 0xE8, +0x74, 0x38, 0x01, 0x1D, 0x49, 0x9C, 0x09, 0x0D, +0x26, 0xE0, 0xC8, 0x99, 0x28, 0x80, 0xE6, 0xE9, +0x06, 0xD5, 0xC6, 0x98, 0x01, 0x80, 0x70, 0x2A, +0x09, 0x01, 0x72, 0x38, 0x01, 0x4C, 0x01, 0x9C, +0x91, 0x9C, 0xFB, 0xFF, 0x03, 0xE8, 0x49, 0xE0, +0xEF, 0xD5, 0x20, 0x84, 0x44, 0xFC, 0xC4, 0xFC, +0x00, 0x80, 0x2F, 0x44, 0x28, 0x3C, 0x58, 0xEA, +0x11, 0x02, 0xC9, 0x0B, 0x01, 0x96, 0xB0, 0x80, +0x12, 0x4E, 0x84, 0xF0, 0x41, 0x22, 0xF0, 0x00, +0x28, 0x3E, 0xB3, 0x80, 0x5C, 0xCC, 0x90, 0x00, +0xB4, 0x80, 0x11, 0x22, 0x02, 0x00, 0x91, 0x02, +0x24, 0x84, 0x14, 0x42, 0x00, 0x80, 0x6F, 0x44, +0x34, 0xEA, 0xE3, 0x80, 0x80, 0x50, 0x4B, 0xD5, +0xA1, 0x38, 0xB6, 0x00, 0x8A, 0xE0, 0x11, 0xA1, +0xA1, 0x38, 0x09, 0xE9, 0x81, 0x22, 0x11, 0xA1, +0x0A, 0x89, 0xB5, 0x80, 0x02, 0xE8, 0x88, 0xE0, +0x01, 0x9C, 0xA1, 0x84, 0xB0, 0x80, 0x81, 0x22, +0xEE, 0xE9, 0x08, 0xE0, 0x04, 0xF5, 0x04, 0xCD, +0x0F, 0xD5, 0x2B, 0x96, 0x10, 0x80, 0x03, 0x02, +0x0A, 0x06, 0x00, 0x5A, 0x10, 0x80, 0x03, 0x22, +0x0A, 0xE9, 0x0B, 0xE4, 0x10, 0x80, 0x03, 0x22, +0x06, 0xE8, 0x0F, 0xE4, 0x11, 0x05, 0x01, 0x38, +0x09, 0x05, 0x01, 0x38, 0x51, 0x38, 0x21, 0xD5, +0x01, 0x22, 0x11, 0x05, 0x2C, 0xFE, 0xBE, 0x80, +0x00, 0x40, 0x9B, 0xEA, 0xA0, 0x44, 0xB6, 0x14, +0x03, 0x96, 0x20, 0x4E, 0x09, 0x05, 0x01, 0x38, +0xA4, 0x00, 0x08, 0x3E, 0x11, 0x05, 0x51, 0x38, +0x11, 0x05, 0x80, 0x38, 0x01, 0x14, 0x55, 0x40, +0xC5, 0xE0, 0xA8, 0x8A, 0x61, 0x38, 0x09, 0xE8, +0x00, 0x38, 0x11, 0x05, 0x65, 0x40, 0x01, 0x05, +0xB0, 0x9B, 0x01, 0x18, 0x21, 0x9D, 0xB3, 0x97, +0x89, 0xE0, 0x49, 0x9C, 0x91, 0x00, 0xF2, 0x4E, +0x05, 0x80, 0xA0, 0x84, 0xA1, 0x22, 0xC0, 0xD5, +0x91, 0x02, 0xB4, 0x80, 0x11, 0xA4, 0x02, 0x00, +0x24, 0x40, 0x00, 0x85, 0x14, 0x50, 0x00, 0xA4, +0x4F, 0x44, 0x01, 0x80, 0x87, 0xF0, 0x00, 0x80, +0x85, 0xF2, 0x86, 0xF1, 0x01, 0x80, 0x8F, 0x14, +0x8F, 0x14, 0xC8, 0x83, 0x83, 0xF4, 0x02, 0x80, +0x03, 0x80, 0x1F, 0xB7, 0x11, 0x22, 0x66, 0xD5, +0x61, 0x98, 0xB4, 0x80, 0x03, 0xC0, 0x70, 0x4C, +0x91, 0x9C, 0xC1, 0x84, 0x11, 0x22, 0x89, 0x88, +0x41, 0xE0, 0xB5, 0x80, 0x69, 0x9D, 0xF5, 0xE9, +0xB0, 0x80, 0x11, 0x22, 0x04, 0xE8, 0xA1, 0xE0, +0x40, 0x84, 0x88, 0x80, 0x08, 0xCE, 0xF5, 0xD5, +0xB9, 0xEA, 0x04, 0xF1, 0x34, 0xEA, 0x0B, 0x97, +0x09, 0x15, 0x41, 0x38, 0x20, 0x02, 0x3C, 0xD5, +0x20, 0x5A, 0x10, 0x00, 0x20, 0x22, 0x0A, 0x06, +0x4B, 0xE4, 0x10, 0x00, 0x20, 0x22, 0x0C, 0xE9, +0x4F, 0xE4, 0x10, 0x00, 0xB9, 0xEA, 0x08, 0xE8, +0x22, 0x38, 0x2D, 0xEA, 0x22, 0x38, 0x11, 0x15, +0x29, 0xD5, 0x09, 0x15, 0x68, 0x3E, 0xB9, 0xEA, +0x43, 0x38, 0xC4, 0x1E, 0x78, 0x3E, 0x11, 0x15, +0x21, 0x22, 0xA4, 0x00, 0x10, 0x44, 0xBE, 0x80, +0xA4, 0xFE, 0x20, 0x4E, 0x21, 0x40, 0x87, 0xEA, +0x93, 0x96, 0x96, 0x10, 0x09, 0x15, 0x23, 0x38, +0x51, 0x40, 0x01, 0xF2, 0x23, 0x38, 0x00, 0x28, +0x43, 0x38, 0x11, 0x15, 0x8A, 0x9A, 0x11, 0x95, +0x03, 0xF4, 0x94, 0x9A, 0x0B, 0xE8, 0x82, 0xE0, +0x11, 0x15, 0x13, 0x38, 0x01, 0x95, 0x23, 0x38, +0x20, 0x4E, 0x50, 0x44, 0x4A, 0x9A, 0x69, 0x9A, +0x83, 0xF1, 0x4B, 0x96, 0x02, 0xF2, 0x3F, 0xB4, +0x01, 0xF5, 0x49, 0x9C, 0x05, 0xF1, 0x3F, 0xB6, +0x06, 0xF4, 0x49, 0x88, 0x82, 0xF2, 0x69, 0x99, +0xEF, 0x41, 0x81, 0xF5, 0x09, 0x89, 0x00, 0x10, +0x9F, 0xB4, 0x02, 0xF2, 0x71, 0x40, 0x07, 0xF5, +0x85, 0xE0, 0x00, 0x28, 0xC0, 0x84, 0x04, 0xE8, +0x9F, 0xD5, 0xA6, 0x80, 0x03, 0x80, 0xAF, 0x04, +0xC9, 0x0B, 0xA8, 0x3C, 0x68, 0x3C, 0x03, 0xD5, +0xC4, 0xFC, 0xC9, 0x0B, 0x4B, 0xDD, 0x40, 0xFC, +0x10, 0x3C, 0x05, 0xC8, 0x48, 0x96, 0xFA, 0x0B, +0x17, 0x3C, 0x03, 0xD5, 0x50, 0xDD, 0xDC, 0xFF, +0x10, 0x3C, 0x04, 0xC8, 0x28, 0x92, 0xFA, 0x0B, +0x48, 0x00, 0x80, 0x3C, 0xB2, 0x10, 0x74, 0x3C, +0x70, 0x21, 0x60, 0x2E, 0x00, 0x84, 0x2D, 0xEA, +0x50, 0x52, 0x8C, 0xEA, 0x1B, 0xD5, 0x20, 0x80, +0x02, 0xCE, 0x03, 0xCF, 0x32, 0x38, 0x08, 0xC9, +0x90, 0x44, 0x01, 0x01, 0x34, 0x40, 0x20, 0x4E, +0x0D, 0xD5, 0x01, 0x8C, 0x11, 0x01, 0x92, 0x38, +0x11, 0x01, 0x31, 0x38, 0x20, 0x4E, 0xA0, 0x44, +0x95, 0x40, 0xCC, 0xFE, 0x34, 0x42, 0x01, 0x24, +0x65, 0x92, 0x73, 0x94, 0x31, 0x38, 0xDB, 0x96, +0x01, 0x9C, 0x09, 0x01, 0xE5, 0xE9, 0x08, 0xE0, +0x00, 0xFC, 0xC0, 0xFC, 0x00, 0x50, 0x41, 0xDD, +0x83, 0xA4, 0x3A, 0x00, 0xAC, 0x0E, 0x18, 0x3E, +0x20, 0x12, 0x4C, 0xEA, 0x20, 0x02, 0xF7, 0xFF, +0x8C, 0xAE, 0x1E, 0x00, 0x8D, 0xAE, 0x40, 0x84, +0x20, 0x12, 0x84, 0xA4, 0x86, 0xA4, 0xF8, 0xFF, +0xF9, 0xFF, 0x20, 0x12, 0x20, 0x12, 0x85, 0xA4, +0x87, 0xA4, 0xFA, 0xFF, 0xFB, 0xFF, 0x20, 0x12, +0x95, 0x00, 0x20, 0x02, 0xFC, 0xFF, 0x20, 0x12, +0x26, 0x00, 0x20, 0x02, 0x20, 0x02, 0x88, 0xAC, +0x89, 0xAC, 0x27, 0x00, 0x94, 0x00, 0x20, 0x02, +0x20, 0x02, 0x8E, 0xAE, 0x8C, 0xAC, 0xA6, 0x00, +0x16, 0x00, 0x20, 0x02, 0x20, 0x02, 0x8D, 0xAC, +0x8E, 0xAC, 0x1A, 0x00, 0x17, 0x00, 0x20, 0x02, +0x22, 0x00, 0x00, 0x02, 0x00, 0x12, 0x8F, 0xAC, +0x80, 0xFC, 0x08, 0x80, 0x74, 0xEA, 0x20, 0xFC, +0x49, 0x96, 0x01, 0x96, 0x2F, 0x2E, 0x09, 0xC2, +0x42, 0xE4, 0xAF, 0xFF, 0x20, 0x3C, 0x05, 0xE9, +0x02, 0x98, 0xC7, 0x0D, 0x48, 0x2E, 0x01, 0x96, +0x40, 0x4C, 0xD0, 0x0E, 0x40, 0x84, 0x1E, 0x00, +0x88, 0x21, 0x38, 0x3E, 0x38, 0x00, 0x60, 0x44, +0x71, 0x42, 0xA2, 0x80, 0x88, 0x3E, 0x24, 0x18, +0xE8, 0x88, 0x74, 0x21, 0xFC, 0x97, 0xFC, 0xA7, +0x71, 0x20, 0x08, 0xC7, 0xE4, 0xE0, 0x00, 0x80, +0x18, 0xAE, 0x03, 0xE9, 0x58, 0xAF, 0x02, 0xD5, +0x31, 0x50, 0x91, 0x9C, 0x28, 0x5A, 0x38, 0x80, +0x00, 0x3E, 0xEE, 0x0F, 0x38, 0x2E, 0xD0, 0x0E, +0x30, 0x4C, 0xD2, 0x0E, 0x40, 0x84, 0x16, 0x80, +0x46, 0x03, 0x08, 0x3E, 0x0A, 0xD5, 0x82, 0x80, +0x00, 0x00, 0x60, 0x20, 0x03, 0xE9, 0xC3, 0xE0, +0x02, 0xD5, 0x40, 0xAE, 0x91, 0x9C, 0x00, 0xAF, +0x64, 0x3C, 0x01, 0x9C, 0x46, 0xE0, 0x7A, 0x0C, +0x10, 0x3E, 0xF4, 0xE9, 0xA0, 0xFC, 0xD2, 0x0E, +0x47, 0xDD, 0x00, 0xFC, 0x12, 0x02, 0x21, 0x50, +0x17, 0x7F, 0x11, 0x02, 0x2C, 0xEA, 0xD6, 0xA4, +0x59, 0x98, 0x0A, 0x8C, 0x11, 0x02, 0x42, 0xAC, +0xD6, 0xA4, 0x18, 0x7F, 0x43, 0xAC, 0x59, 0x98, +0x1A, 0x7F, 0x11, 0x02, 0x59, 0x98, 0xD6, 0xA4, +0x11, 0x02, 0x44, 0xAC, 0xD6, 0xA4, 0x19, 0x7F, +0x45, 0xAC, 0x59, 0x98, 0x1B, 0x7F, 0x11, 0x02, +0x59, 0x98, 0xD6, 0xA4, 0x11, 0x02, 0x46, 0xAC, +0xD6, 0xA4, 0xA9, 0x7F, 0x47, 0xAC, 0x59, 0x98, +0x0E, 0xC8, 0xC1, 0xEA, 0x0C, 0xC0, 0x4B, 0xDD, +0x32, 0x7F, 0x01, 0x02, 0x11, 0x02, 0xD7, 0xA4, +0x97, 0xA4, 0xA8, 0x7F, 0x51, 0x98, 0x18, 0x98, +0x49, 0x96, 0x01, 0x96, 0x41, 0xDD, 0xE7, 0xF8, +0x1A, 0x02, 0x00, 0x50, 0x18, 0x3E, 0x87, 0xA4, +0x4C, 0xEA, 0xAC, 0x0E, 0x20, 0x02, 0x88, 0xAC, +0x89, 0xAC, 0x5E, 0x00, 0xB6, 0x7F, 0x20, 0x02, +0x85, 0xA4, 0x8C, 0xAC, 0x86, 0xA4, 0x8D, 0xAC, +0x20, 0x02, 0x8E, 0xAC, 0x00, 0x02, 0x27, 0x7F, +0x8F, 0xAC, 0xF2, 0x00, 0x08, 0x80, 0x00, 0x12, +0x0D, 0xAE, 0x00, 0x84, 0x00, 0xFC, 0x80, 0xFC, +0xE0, 0x0C, 0x20, 0x3C, 0x20, 0x00, 0x08, 0x3E, +0x94, 0x96, 0x41, 0xA6, 0x11, 0x4C, 0x82, 0xAE, +0x22, 0x84, 0x06, 0x00, 0x81, 0xAE, 0x43, 0xAE, +0x83, 0xA6, 0x09, 0xD5, 0x02, 0xC1, 0x05, 0xCA, +0x40, 0xAE, 0x21, 0x84, 0x91, 0x9E, 0x03, 0xD5, +0x80, 0xFC, 0x83, 0xAE, 0x00, 0x2E, 0x00, 0xFC, +0x00, 0x5A, 0x93, 0x11, 0x06, 0xC0, 0x0B, 0x01, +0x0B, 0x02, 0x00, 0x5A, 0x0F, 0x03, 0x08, 0x5A, +0x00, 0x3C, 0x0A, 0xD5, 0x0C, 0xD5, 0xCA, 0x0C, +0x32, 0x0D, 0x00, 0x3C, 0x00, 0x3C, 0x09, 0xD5, +0x06, 0xD5, 0xE1, 0x0C, 0xE2, 0x0C, 0x00, 0x3C, +0x00, 0x3C, 0x03, 0xD5, 0x80, 0xFC, 0xCA, 0x0C, +0x01, 0x84, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFC, +0xD2, 0x0C, 0x20, 0x3C, 0x80, 0x11, 0x18, 0x3E, +0x13, 0x80, 0x00, 0x10, 0x8A, 0xAC, 0x01, 0x84, +0x81, 0xEA, 0x09, 0xAC, 0x00, 0xFC, 0x80, 0xFC, +0x08, 0x5A, 0xC1, 0xEA, 0x15, 0xD5, 0x03, 0x01, +0xE5, 0x0C, 0x34, 0x3C, 0x62, 0xE0, 0x9C, 0xEA, +0x03, 0x84, 0x03, 0xE8, 0x14, 0x3C, 0x08, 0xD5, +0x00, 0x3C, 0xE4, 0x0C, 0x20, 0xE0, 0xBF, 0x0B, +0x02, 0x84, 0x07, 0xE8, 0x20, 0x84, 0x5E, 0xF8, +0xC8, 0x08, 0x18, 0x3C, 0x03, 0x84, 0x03, 0xD5, +0x80, 0xFC, 0x58, 0xF8, 0x20, 0x84, 0x20, 0xFC, +0xDB, 0xFF, 0x1B, 0x3C, 0x04, 0x0C, 0x34, 0x3C, +0xBF, 0x0B, 0x10, 0x3C, 0x06, 0xE9, 0x61, 0xE0, +0x03, 0x0C, 0x24, 0x3C, 0x40, 0xE0, 0x79, 0xEA, +0x68, 0x3E, 0x12, 0xE8, 0x31, 0xA4, 0x80, 0x11, +0x0E, 0x01, 0x08, 0x5A, 0xD2, 0x0C, 0x10, 0x3C, +0x3F, 0xF8, 0x72, 0xAC, 0x31, 0xAC, 0x02, 0x84, +0x03, 0x12, 0x00, 0x84, 0x81, 0xEA, 0x08, 0x00, +0x66, 0x00, 0x00, 0x48, 0x28, 0x5A, 0x74, 0xEA, +0x24, 0x3C, 0x09, 0x02, 0x41, 0xE0, 0x12, 0x0D, +0x14, 0x3C, 0x5E, 0xE9, 0x09, 0xD5, 0xC8, 0x0C, +0x0D, 0x01, 0x28, 0x5A, 0xD8, 0x0C, 0x24, 0x3C, +0x55, 0xE9, 0x41, 0xE0, 0xD6, 0x0C, 0x14, 0x3C, +0x20, 0xE0, 0x79, 0xEA, 0x28, 0xE8, 0xFF, 0x83, +0x2B, 0xEA, 0x4E, 0xD5, 0x0F, 0xC0, 0x16, 0x96, +0x20, 0x00, 0x60, 0x2E, 0x34, 0x3C, 0x0C, 0xCE, +0x79, 0xEA, 0xE5, 0x0C, 0x07, 0xE8, 0x60, 0xE0, +0x13, 0xF8, 0x01, 0x84, 0xC8, 0x08, 0x68, 0x3C, +0x40, 0xD5, 0x06, 0x80, 0xD4, 0x0C, 0x34, 0x3C, +0x06, 0xE9, 0x61, 0xE0, 0xD5, 0x0C, 0x14, 0x3C, +0xE4, 0xFF, 0x00, 0x4E, 0x00, 0x3C, 0x0C, 0xE8, +0x08, 0x3C, 0xD2, 0x0C, 0x01, 0x84, 0xC2, 0x08, +0x83, 0xFF, 0xFF, 0x49, 0x08, 0x3C, 0x00, 0x84, +0x29, 0xD5, 0xC8, 0x08, 0x44, 0xDD, 0x1D, 0xC2, +0xFC, 0x80, 0x00, 0x22, 0x40, 0xE0, 0x9C, 0xEA, +0x68, 0x3E, 0x17, 0xE8, 0x03, 0x22, 0x80, 0x11, +0x81, 0x9E, 0x02, 0x00, 0x06, 0x4E, 0xB2, 0xAC, +0x00, 0x02, 0x1D, 0x00, 0x10, 0x02, 0x3B, 0x80, +0xFF, 0x49, 0xB1, 0x80, 0x00, 0x84, 0xA1, 0xFE, +0x13, 0x00, 0x03, 0x10, 0x00, 0x84, 0xAD, 0xEA, +0x32, 0xAC, 0x31, 0xAC, 0x24, 0x3C, 0x0E, 0xD5, +0x90, 0xEA, 0xC6, 0x0C, 0xFF, 0x83, 0x41, 0xE0, +0x10, 0x3C, 0x08, 0xE8, 0x18, 0x3C, 0xD2, 0x0C, +0x03, 0xD5, 0xC2, 0x08, 0x02, 0xD5, 0x00, 0x84, +0xA0, 0xFC, 0x01, 0x84, 0x56, 0xDD, 0x40, 0xFC, +0x00, 0x80, 0x1F, 0x44, 0x39, 0xEA, 0x42, 0xAC, +0x20, 0x84, 0x43, 0xAC, 0x40, 0x84, 0x44, 0xAC, +0x48, 0x00, 0x90, 0x3C, 0x00, 0x80, 0x4F, 0x44, +0xFF, 0x7F, 0x30, 0x44, 0x58, 0x3E, 0x02, 0x80, +0x7F, 0xEA, 0xC4, 0x1E, 0x78, 0x3E, 0xC8, 0xEA, +0x24, 0xD5, 0xE0, 0x0E, 0x11, 0x81, 0x62, 0x38, +0x20, 0x4E, 0xE0, 0x45, 0x01, 0x01, 0xA4, 0x38, +0x01, 0x18, 0x6F, 0x40, 0xB3, 0x97, 0xCA, 0x8A, +0x09, 0x81, 0x60, 0x38, 0x86, 0xE0, 0x66, 0xEA, +0x5D, 0xEA, 0x02, 0xE8, 0xC3, 0xE0, 0x66, 0xEA, +0xBC, 0xEA, 0x02, 0xE8, 0x11, 0x81, 0xA2, 0x38, +0x11, 0x81, 0x63, 0x38, 0x01, 0x18, 0x65, 0x40, +0x63, 0x42, 0x6F, 0xEA, 0xB1, 0x96, 0x00, 0x08, +0x11, 0x81, 0x62, 0x38, 0x09, 0x81, 0x63, 0x38, +0x09, 0xE0, 0x01, 0x9C, 0x56, 0xDD, 0xDC, 0xE9, +0xC3, 0xAC, 0x02, 0xAD, 0x4B, 0xDD, 0x84, 0xAC, +0xC1, 0xEA, 0x0D, 0xC0, 0x04, 0xF8, 0x02, 0xC8, +0xDB, 0xFF, 0x07, 0x3C, 0x10, 0x3C, 0x07, 0xC0, +0xC9, 0xEA, 0xDB, 0x0C, 0xDC, 0xFF, 0x1B, 0x3C, +0xC0, 0xFC, 0xFF, 0x83, 0x55, 0xDD, 0x00, 0xFC, +0x00, 0x01, 0x00, 0x54, 0x14, 0x3C, 0x25, 0xC0, +0x17, 0x4E, 0xC0, 0x0B, 0x04, 0x3C, 0x22, 0x00, +0x04, 0x4E, 0xC1, 0x0B, 0x47, 0xDD, 0x1E, 0x00, +0x30, 0x3C, 0x5B, 0xEA, 0x1C, 0xFF, 0x5D, 0x07, +0x42, 0x40, 0x52, 0xEA, 0x24, 0xE2, 0xB7, 0x0C, +0x41, 0x22, 0x13, 0xE9, 0x81, 0xE0, 0xDA, 0x00, +0x21, 0x22, 0x04, 0xE8, 0x03, 0xD5, 0xDC, 0x00, +0xDB, 0x00, 0x21, 0x22, 0x30, 0x40, 0x54, 0xFE, +0xDA, 0xFE, 0x37, 0x8C, 0x00, 0x40, 0xDB, 0x96, +0x31, 0xEA, 0x07, 0x0C, 0x01, 0x84, 0x02, 0xD5, +0x00, 0xFC, 0x80, 0xFC, 0x80, 0xFC, 0x01, 0x84, +0x80, 0xFC, 0x00, 0xFC, 0x04, 0x3C, 0x00, 0xFC, +0x10, 0x3C, 0xA3, 0x0C, 0x20, 0xE0, 0xC2, 0x0B, +0x15, 0xE8, 0xFF, 0x83, 0x00, 0x22, 0xC2, 0xEA, +0x11, 0xC8, 0x00, 0x80, 0x0C, 0x80, 0x20, 0x00, +0x0F, 0x3E, 0x0E, 0xCA, 0xC0, 0xA4, 0xE4, 0xFF, +0xA2, 0x0C, 0x44, 0x3C, 0x40, 0xAD, 0x59, 0x9D, +0x05, 0xE8, 0x83, 0xE0, 0x30, 0x10, 0x61, 0x84, +0x80, 0xAC, 0x0C, 0x80, 0x20, 0xFC, 0x80, 0xFC, +0xC1, 0x97, 0x45, 0xDD, 0x06, 0xC8, 0x50, 0xDD, +0x99, 0x0D, 0x14, 0x3C, 0x06, 0xFF, 0x00, 0x4E, +0x08, 0x3E, 0x24, 0xE8, 0x20, 0xB4, 0x3C, 0x00, +0xFF, 0x7F, 0x20, 0x44, 0x1E, 0x00, 0x11, 0x4C, +0x4B, 0x3C, 0x80, 0x84, 0x44, 0x3C, 0xEA, 0xFF, +0x50, 0x3C, 0x99, 0x0D, 0xA4, 0xE0, 0xBE, 0x0B, +0x34, 0x3C, 0x09, 0xE8, 0x09, 0x9D, 0x14, 0x0D, +0x61, 0xE0, 0x80, 0xB6, 0x40, 0xB6, 0x05, 0xE8, +0x20, 0x84, 0x0A, 0xF8, 0x04, 0x3C, 0x20, 0xB6, +0x70, 0x4C, 0xCA, 0x0C, 0x21, 0x84, 0xB3, 0x00, +0xA5, 0xFF, 0x17, 0x3E, 0xAE, 0x00, 0x00, 0x48, +0x63, 0x50, 0x22, 0xEA, 0x07, 0x3C, 0x8E, 0x03, +0x13, 0x22, 0xEA, 0xFF, 0x81, 0x9C, 0x06, 0x00, +0xEA, 0xFF, 0x2B, 0x3C, 0xF3, 0x4E, 0x01, 0xE0, +0x46, 0xDD, 0xA1, 0x00, 0x03, 0x01, 0x00, 0x46, +0x61, 0xEA, 0x59, 0xDD, 0x57, 0xDD, 0x52, 0xDD, +0x20, 0xB6, 0x20, 0x84, 0x42, 0xDD, 0xFF, 0x83, +0x0C, 0x00, 0x70, 0x12, 0x03, 0x12, 0x3B, 0x96, +0xAB, 0xEA, 0x98, 0x7F, 0x77, 0xA4, 0xB5, 0xA4, +0xB2, 0x10, 0x28, 0x3C, 0x23, 0x22, 0xA7, 0xEA, +0x13, 0x02, 0x98, 0x7F, 0x20, 0x4C, 0xA1, 0x7F, +0x23, 0x02, 0x11, 0xC0, 0x33, 0x22, 0x6E, 0x7F, +0x13, 0x22, 0xB1, 0x7E, 0x4B, 0x98, 0xA2, 0x7F, +0xE0, 0x01, 0x40, 0x46, 0xA7, 0xFE, 0x0C, 0xF8, +0x57, 0xFE, 0x49, 0x96, 0x10, 0xD5, 0xB4, 0xA4, +0x6E, 0x7F, 0x23, 0x02, 0xB1, 0x7E, 0x13, 0x22, +0xE0, 0x01, 0x30, 0x46, 0x90, 0x96, 0x44, 0xEA, +0xFF, 0x83, 0x60, 0xEA, 0x49, 0x96, 0x9F, 0xFE, +0x23, 0x02, 0x57, 0xFE, 0x27, 0x3E, 0x64, 0x7F, +0x42, 0xDD, 0xAA, 0xFF, 0x20, 0x84, 0x42, 0xA8, +0x17, 0x3E, 0xC9, 0xEA, 0xFF, 0x83, 0xA5, 0xFF, +0x10, 0x3C, 0x7B, 0xF8, 0x10, 0x54, 0x09, 0x00, +0x59, 0xC1, 0x00, 0x81, 0x10, 0x50, 0x44, 0xDD, +0x30, 0x22, 0x46, 0x82, 0x2F, 0x3E, 0xDD, 0xFF, +0x71, 0x4C, 0xCE, 0xFF, 0x90, 0xFA, 0x28, 0xC0, +0xCB, 0xB8, 0xD4, 0xBC, 0x38, 0x5A, 0xD0, 0xA4, +0xCA, 0xA4, 0x4B, 0x9B, 0xD0, 0xAC, 0xB6, 0xEA, +0x31, 0x14, 0x4F, 0xDD, 0x61, 0x84, 0x09, 0x03, +0x08, 0x03, 0x31, 0x14, 0x0E, 0xA5, 0xCF, 0xA4, +0x19, 0x80, 0x20, 0x02, 0x08, 0x40, 0x42, 0x40, +0x21, 0x40, 0x2E, 0xFF, 0x50, 0x44, 0x08, 0x20, +0x10, 0x02, 0x00, 0xFF, 0xAE, 0xFE, 0x18, 0x80, +0x48, 0x96, 0xA7, 0xFE, 0x04, 0x0F, 0x21, 0x40, +0x43, 0xDD, 0x8F, 0xFE, 0x17, 0x80, 0x20, 0x14, +0x10, 0xA4, 0x2B, 0xD5, 0x9B, 0x00, 0x10, 0x44, +0x11, 0x9B, 0x00, 0x5A, 0x03, 0x01, 0x00, 0x46, +0x09, 0x03, 0x10, 0x14, 0x21, 0x84, 0x50, 0xAC, +0x08, 0x03, 0x10, 0x14, 0x11, 0x46, 0x42, 0xDD, +0x10, 0x58, 0x00, 0xF0, 0x10, 0x14, 0x1F, 0x80, +0x20, 0x3C, 0x17, 0x00, 0x10, 0x44, 0x19, 0x0D, +0x8E, 0xFE, 0xFF, 0xF0, 0xF2, 0x0C, 0x00, 0x3C, +0x00, 0x06, 0x21, 0x58, 0x10, 0x46, 0xD4, 0xBA, +0xCB, 0xB8, 0x80, 0x00, 0x20, 0x46, 0x08, 0xC0, +0x17, 0xFE, 0x30, 0x10, 0x03, 0xD5, 0xCB, 0xB8, +0x02, 0xD5, 0x01, 0x84, 0xA0, 0xFC, 0x00, 0x84, +0x45, 0xDD, 0x00, 0xFC, 0x0C, 0xC0, 0x00, 0x96, +0x20, 0x4C, 0x27, 0xF8, 0x00, 0x4E, 0x07, 0xC0, +0x1E, 0x3C, 0x94, 0xFF, 0x17, 0xD5, 0x0F, 0x00, +0x00, 0x01, 0x00, 0x02, 0xFF, 0x49, 0x16, 0xD5, +0x17, 0x2E, 0xAB, 0xFD, 0x18, 0x5A, 0x9A, 0xFF, +0x00, 0x3C, 0x04, 0x01, 0x14, 0x3C, 0x32, 0x0D, +0x10, 0x4C, 0x29, 0x0D, 0x00, 0x84, 0x0B, 0x40, +0x0E, 0x3C, 0xC9, 0xEA, 0xFF, 0x83, 0x0F, 0x00, +0xA5, 0xFF, 0x07, 0x3E, 0x03, 0xD5, 0x01, 0x84, +0xFF, 0xFE, 0xFF, 0x49, 0x00, 0xFC, 0x80, 0xFC, +0xC1, 0x08, 0x30, 0x3C, 0x41, 0xDD, 0x2E, 0xC3, +0x5F, 0x01, 0x20, 0x22, 0xFF, 0x83, 0x77, 0xEA, +0x09, 0xC0, 0x20, 0x4C, 0xCF, 0x01, 0x10, 0x22, +0xFC, 0xFD, 0x00, 0x4E, 0x20, 0x84, 0x03, 0xE8, +0x44, 0xDD, 0xAB, 0xEA, 0xEA, 0xFF, 0x07, 0x3C, +0xCD, 0x81, 0x30, 0x22, 0x4B, 0x3C, 0x01, 0x9D, +0x60, 0xE0, 0xEA, 0xFF, 0x00, 0x22, 0x5C, 0xE8, +0x30, 0x3C, 0xCF, 0x81, 0x60, 0xE0, 0xBE, 0x0B, +0x0F, 0x3E, 0x56, 0xE8, 0xC0, 0xA4, 0xE8, 0xFF, +0xDB, 0x96, 0xD9, 0x9E, 0x34, 0x4E, 0xC0, 0xAC, +0x10, 0x02, 0x4F, 0x00, 0xAB, 0xEA, 0xCD, 0x81, +0x40, 0xAC, 0x20, 0x84, 0x3D, 0xD5, 0x00, 0x84, +0xB4, 0xFF, 0x27, 0x2E, 0x00, 0x50, 0x41, 0xDD, +0x19, 0xC2, 0x8E, 0x03, 0x08, 0x00, 0x20, 0x22, +0xBE, 0x0B, 0x40, 0x3C, 0xD4, 0xFF, 0x1F, 0x3E, +0x0F, 0xE8, 0x82, 0xE0, 0x3B, 0x3C, 0xC7, 0xA4, +0x20, 0x22, 0xF4, 0xFF, 0x30, 0x22, 0x00, 0x80, +0x11, 0x9D, 0x06, 0x00, 0x62, 0xE0, 0x08, 0xAD, +0x06, 0xA4, 0x2E, 0xE8, 0x2B, 0xD5, 0x08, 0xAC, +0x29, 0xD5, 0xC8, 0xAC, 0xB6, 0x10, 0x28, 0x3C, +0x06, 0x00, 0x40, 0x22, 0xEA, 0xFF, 0x17, 0x3C, +0x5B, 0x3C, 0x49, 0x9D, 0x81, 0xE0, 0xEA, 0xFF, +0x10, 0x22, 0x16, 0xE8, 0x40, 0x3C, 0x08, 0x00, +0x81, 0xE0, 0xBE, 0x0B, 0x1F, 0x3E, 0x10, 0xE8, +0x08, 0xA5, 0xE8, 0xFF, 0x23, 0x97, 0x21, 0x9F, +0x44, 0x4E, 0x08, 0xAD, 0x06, 0xA4, 0x09, 0x00, +0x0B, 0x3C, 0x88, 0xAC, 0x01, 0x84, 0xEA, 0xFF, +0x0A, 0xD5, 0x7C, 0xF9, 0x99, 0x0D, 0x24, 0x3C, +0xE1, 0xFD, 0x00, 0x4E, 0x10, 0x3C, 0x04, 0xE8, +0xA7, 0xEA, 0x98, 0x0D, 0x80, 0xFC, 0x01, 0x84, +0x45, 0xDD, 0x40, 0xFC, 0x91, 0x54, 0x00, 0x81, +0x46, 0xDD, 0xFF, 0x00, 0x03, 0x01, 0x10, 0x46, +0x01, 0x83, 0x00, 0x04, 0x94, 0x17, 0x58, 0x3E, +0x00, 0x14, 0x3A, 0xEA, 0x00, 0x4E, 0x01, 0x83, +0x02, 0x02, 0xB4, 0xFE, 0x08, 0x5A, 0x10, 0x80, +0x10, 0x46, 0x13, 0x09, 0x08, 0x80, 0x88, 0x00, +0x00, 0x82, 0x10, 0x58, 0xC0, 0x83, 0x20, 0x50, +0xC0, 0xAC, 0x61, 0xB4, 0x70, 0x92, 0xC9, 0xA2, +0x04, 0x9C, 0xC1, 0xAC, 0xFA, 0x7F, 0x11, 0x4C, +0x7C, 0x00, 0x00, 0x48, 0x68, 0x80, 0x57, 0xEA, +0x0F, 0x00, 0x62, 0x52, 0x72, 0x22, 0x01, 0x80, +0xEB, 0xE4, 0x10, 0x80, 0x72, 0x22, 0x08, 0xE9, +0xEF, 0xE4, 0x10, 0x80, 0x03, 0xF8, 0x04, 0xE8, +0x0C, 0xD5, 0xE7, 0xB4, 0x20, 0x26, 0xA2, 0x44, +0x00, 0xA8, 0x70, 0x40, 0xFF, 0x83, 0xFA, 0x95, +0x77, 0x2E, 0x47, 0xB5, 0x75, 0x40, 0xAA, 0xFF, +0xD8, 0xAD, 0x0D, 0x1C, 0x06, 0x40, 0x12, 0x4C, +0x0F, 0x80, 0x40, 0x50, 0x02, 0xD5, 0x4E, 0x98, +0x01, 0x9C, 0x49, 0x9C, 0x09, 0x5A, 0xDA, 0x9C, +0x40, 0x46, 0xE0, 0x50, 0xC0, 0x84, 0x88, 0x00, +0x00, 0x02, 0x42, 0x58, 0x38, 0x3E, 0x26, 0x80, +0xE4, 0x80, 0x68, 0x03, 0xF0, 0x80, 0x53, 0x0C, +0x69, 0x97, 0x07, 0xB4, 0x05, 0xF8, 0x01, 0x96, +0x83, 0x97, 0x02, 0xE8, 0x01, 0x85, 0x01, 0x38, +0x20, 0xEA, 0x28, 0x9A, 0xFF, 0x83, 0xC0, 0xE0, +0x61, 0x38, 0x07, 0xE8, 0xAE, 0x9B, 0x01, 0x85, +0xB3, 0x97, 0x6F, 0xEA, 0x51, 0x38, 0xFF, 0x83, +0x11, 0x5A, 0x09, 0x85, 0xA4, 0xB4, 0x1C, 0xD0, +0xB0, 0x92, 0x07, 0xB4, 0x1D, 0x82, 0x02, 0x40, +0xC0, 0xE0, 0x20, 0xEA, 0x83, 0x97, 0x02, 0xE8, +0x21, 0x38, 0x09, 0x9C, 0xAA, 0x9A, 0x01, 0x81, +0xC2, 0xE0, 0xA1, 0xEA, 0x61, 0x38, 0x05, 0xE8, +0x00, 0x4E, 0x01, 0x81, 0x4A, 0x9C, 0xE6, 0xFF, +0x09, 0x81, 0x51, 0x38, 0x19, 0x5A, 0x24, 0x9D, +0x00, 0x49, 0xCE, 0xD2, 0x10, 0x46, 0x45, 0x02, +0x08, 0x3C, 0x03, 0x01, 0x00, 0x04, 0xBE, 0x0B, +0x68, 0x3C, 0x01, 0x83, 0x00, 0x66, 0xBF, 0x0B, +0x00, 0x14, 0x00, 0x01, 0x04, 0x3C, 0x01, 0x83, +0x0C, 0xE4, 0xDA, 0x0B, 0x92, 0x4E, 0x03, 0xE9, +0x08, 0x80, 0x05, 0x00, 0x07, 0xFA, 0xFF, 0x49, +0x40, 0xFC, 0xC0, 0xFC, 0x22, 0xEA, 0x45, 0xDD, +0x18, 0x00, 0x03, 0x22, 0x45, 0xEA, 0xE0, 0x84, +0x18, 0x00, 0x03, 0x12, 0x00, 0x46, 0x46, 0xDD, +0x59, 0xDD, 0x03, 0x01, 0xE0, 0x01, 0x20, 0x46, +0x52, 0xDD, 0x61, 0xEA, 0x00, 0x01, 0x10, 0x46, +0x43, 0xDD, 0xE1, 0xB6, 0x00, 0x01, 0x03, 0x02, +0x0C, 0x80, 0x00, 0x12, 0xFE, 0xFF, 0x10, 0x44, +0x00, 0x01, 0x03, 0x22, 0x5F, 0x01, 0x03, 0x12, +0x34, 0x01, 0x03, 0x02, 0x43, 0xDD, 0x0E, 0xFE, +0x1C, 0x80, 0x00, 0x14, 0x35, 0x01, 0x13, 0x02, +0x78, 0x00, 0x03, 0x22, 0x45, 0xEA, 0x48, 0x96, +0x57, 0xFE, 0xAE, 0xEA, 0x0F, 0xFE, 0x01, 0x96, +0x98, 0xEA, 0x43, 0xDD, 0x03, 0xF8, 0x0A, 0xA8, +0x49, 0xDD, 0x51, 0xDD, 0x4E, 0xDD, 0x70, 0xA4, +0xFF, 0x83, 0x41, 0x84, 0x49, 0xDD, 0x51, 0xDD, +0x07, 0x80, 0xF0, 0xA4, 0x18, 0x3E, 0x34, 0xEA, +0x04, 0xD5, 0x2C, 0x07, 0x54, 0xEA, 0x99, 0xEA, +0x03, 0xE0, 0x01, 0x9C, 0x00, 0x84, 0xFC, 0xE9, +0x02, 0x85, 0xC1, 0x80, 0x53, 0xDD, 0x18, 0xD5, +0x41, 0x84, 0x02, 0x80, 0x49, 0xDD, 0x51, 0xDD, +0x00, 0x84, 0x53, 0xDD, 0x0C, 0xD5, 0x34, 0xEA, +0x11, 0x01, 0x43, 0x38, 0x11, 0x01, 0x31, 0x38, +0x31, 0x40, 0xDC, 0x98, 0xDB, 0x96, 0x96, 0xA0, +0x09, 0x01, 0x33, 0x38, 0x01, 0xE0, 0x01, 0x9C, +0x09, 0x9C, 0xF4, 0xE9, 0x41, 0x0C, 0x14, 0x3C, +0xE6, 0xE9, 0x01, 0xE0, 0x00, 0x44, 0x48, 0xEA, +0x5C, 0xDD, 0xFF, 0x7F, 0x48, 0x00, 0x40, 0x3C, +0x00, 0x84, 0x47, 0xEA, 0x28, 0x3E, 0x39, 0xEA, +0x06, 0xD5, 0x2C, 0x07, 0x11, 0x81, 0x51, 0x38, +0xB2, 0xEA, 0x02, 0xD9, 0x04, 0xE0, 0x01, 0x9C, +0x14, 0x3C, 0xFA, 0xE9, 0xB3, 0xEA, 0xE2, 0x0B, +0x18, 0x3C, 0x4B, 0x96, 0xC0, 0xFC, 0xE2, 0x0B, +0x45, 0xDD, 0x20, 0xFC, 0x63, 0x50, 0x22, 0xEA, +0x13, 0x02, 0x30, 0x02, 0x00, 0x85, 0xFF, 0x7E, +0xDC, 0xFF, 0x8B, 0x3C, 0x0C, 0x00, 0x08, 0x3E, +0x75, 0xA4, 0x40, 0xAC, 0x7C, 0x17, 0x78, 0x3E, +0x76, 0xA4, 0x41, 0xAC, 0x01, 0x80, 0x83, 0x12, +0x77, 0xA4, 0x42, 0xAC, 0x00, 0x80, 0x83, 0x12, +0xFF, 0x49, 0x43, 0xAC, 0x53, 0xDD, 0xCA, 0xFB, +0x4E, 0xDD, 0x41, 0x84, 0x03, 0x22, 0x51, 0xDD, +0x03, 0x12, 0x00, 0x80, 0x03, 0x22, 0xEC, 0x7F, +0x03, 0x12, 0x01, 0x80, 0x48, 0xEA, 0xEB, 0x7F, +0xFF, 0x7F, 0x00, 0x44, 0xFF, 0x49, 0x5C, 0xDD, +0x00, 0x2E, 0x9B, 0xFC, 0x31, 0xAC, 0x93, 0x11, +0x02, 0x80, 0x03, 0x22, 0x5B, 0x7F, 0x03, 0x12, +0x03, 0x80, 0x03, 0x22, 0x5C, 0x7F, 0x03, 0x12, +0x43, 0x96, 0x3C, 0xA4, 0x5A, 0x7F, 0x13, 0x12, +0xC1, 0x7F, 0x13, 0x22, 0x05, 0xE8, 0x20, 0xE0, +0xF2, 0xFF, 0x8B, 0x3C, 0xF5, 0xFF, 0x8B, 0x3C, +0x0E, 0x96, 0x2B, 0xEA, 0x07, 0x2E, 0x18, 0xC0, +0x08, 0x5A, 0x9A, 0xFF, 0xE0, 0x84, 0x15, 0x01, +0xC1, 0x08, 0x78, 0x3C, 0x00, 0x84, 0xAD, 0xEA, +0xF0, 0xFD, 0xFF, 0x49, 0x77, 0x3E, 0x03, 0xC8, +0x10, 0x3C, 0x9A, 0xFF, 0xA7, 0xEA, 0x94, 0x0D, +0x01, 0x84, 0x49, 0xDD, 0xD1, 0x0C, 0x08, 0x3C, +0x9F, 0x00, 0x00, 0x48, 0x2E, 0x96, 0x26, 0xEA, +0x28, 0xEA, 0x14, 0xC0, 0x3F, 0xEA, 0x12, 0xC9, +0xFF, 0x49, 0x10, 0xC8, 0xC0, 0x80, 0xD9, 0xFB, +0x42, 0xB9, 0x0E, 0xC8, 0x10, 0x44, 0x04, 0xC1, +0xC2, 0xB9, 0xF0, 0x00, 0x07, 0xC1, 0x50, 0xB9, +0xF0, 0x00, 0x10, 0x44, 0x03, 0xD5, 0xD0, 0xB9, +0xC1, 0x84, 0xAD, 0xEA, 0x0E, 0x96, 0x2B, 0xEA, +0x28, 0xEA, 0x1B, 0xC0, 0x3F, 0xEA, 0x19, 0xC9, +0xFF, 0x49, 0x17, 0xC8, 0x00, 0x81, 0xEA, 0xFD, +0x94, 0x17, 0x78, 0x3E, 0x80, 0x00, 0x10, 0x46, +0x07, 0x3C, 0x0B, 0xC8, 0xC8, 0x80, 0xF4, 0xFF, +0x49, 0x81, 0x03, 0x12, 0x02, 0x84, 0x49, 0xDD, +0x07, 0x81, 0x03, 0x12, 0x07, 0x3C, 0x4C, 0xF8, +0x03, 0x12, 0xF4, 0xFF, 0x4B, 0xDD, 0x49, 0x81, +0x81, 0xEA, 0x02, 0xC0, 0x14, 0x3C, 0x74, 0xEA, +0xD3, 0x96, 0xC2, 0x08, 0x30, 0x12, 0x41, 0xDD, +0x10, 0x12, 0x01, 0x01, 0x46, 0xEA, 0x02, 0x01, +0x01, 0x83, 0x30, 0x04, 0x00, 0x81, 0x31, 0x58, +0x01, 0x83, 0x30, 0x14, 0xB2, 0x10, 0x34, 0x3C, +0x05, 0x00, 0x36, 0x4E, 0x70, 0x21, 0x10, 0x2E, +0x10, 0x3C, 0x07, 0xC1, 0x00, 0x44, 0xFE, 0x0C, +0x46, 0xFE, 0xFE, 0xFF, 0x8A, 0xEA, 0x1A, 0xD5, +0x15, 0xC1, 0x6E, 0x96, 0xFC, 0x01, 0x10, 0x22, +0x11, 0xE9, 0x41, 0xE0, 0x34, 0x01, 0x20, 0x22, +0x21, 0x58, 0x43, 0xDD, 0x20, 0x14, 0x01, 0x00, +0x10, 0x22, 0x1C, 0x80, 0x00, 0x46, 0x24, 0x01, +0x47, 0xFE, 0xF0, 0x0F, 0x00, 0x58, 0x42, 0xDD, +0x06, 0xD5, 0xF8, 0x00, 0xFE, 0x0C, 0x14, 0x3C, +0x00, 0x58, 0x42, 0xDD, 0x20, 0xB6, 0x70, 0x00, +0x0B, 0xCE, 0x49, 0xDD, 0x09, 0xC9, 0x28, 0xEA, +0x07, 0xC8, 0x3F, 0xEA, 0x23, 0x84, 0x20, 0xF8, +0xD1, 0x0C, 0x18, 0x3C, 0x5C, 0x00, 0x00, 0x48, +0x2E, 0x96, 0x26, 0xEA, 0x28, 0xEA, 0x1F, 0xC0, +0x3F, 0xEA, 0x1D, 0xC9, 0x44, 0xDD, 0x1B, 0xC8, +0xFD, 0x80, 0x30, 0x22, 0x20, 0x22, 0x56, 0xDD, +0x62, 0xE0, 0x02, 0x00, 0x20, 0x22, 0x0C, 0xE9, +0x30, 0x22, 0x09, 0x81, 0x62, 0xE0, 0x03, 0x00, +0x10, 0x22, 0x06, 0xE9, 0x04, 0xA4, 0x05, 0x81, +0x08, 0xE8, 0x20, 0xE0, 0x50, 0xFC, 0xFF, 0x49, +0x18, 0x3C, 0x24, 0x84, 0xC0, 0x84, 0xD1, 0x0C, +0x00, 0x4E, 0x3A, 0xD5, 0x28, 0xE8, 0x4A, 0xFC, +0x26, 0xC9, 0x28, 0xEA, 0x24, 0xC8, 0x3F, 0xEA, +0x1E, 0xC0, 0x50, 0xDD, 0x10, 0xFC, 0xFF, 0x49, +0x04, 0x3C, 0x0D, 0xC0, 0x14, 0x3C, 0x0E, 0x0D, +0x20, 0xE0, 0xC0, 0x0B, 0x00, 0x49, 0x15, 0xE9, +0x04, 0xC0, 0xF3, 0x01, 0xF3, 0x00, 0x00, 0x49, +0x0F, 0x3E, 0x0F, 0xC8, 0x40, 0xA4, 0xEA, 0xFF, +0xA2, 0x0C, 0x24, 0x3C, 0xC0, 0xAC, 0xC9, 0x9C, +0x0A, 0xE8, 0x41, 0xE0, 0x20, 0x3E, 0x41, 0x84, +0x20, 0x84, 0x70, 0x21, 0x20, 0x84, 0x04, 0xD5, +0xEA, 0xFF, 0x0F, 0x3E, 0xFF, 0x49, 0x40, 0xAC, +0x68, 0x5A, 0x1A, 0xFC, 0xC0, 0x84, 0x05, 0x01, +0x06, 0x00, 0x63, 0x40, 0xB0, 0xF9, 0xFF, 0x49, +0x00, 0x84, 0x03, 0xC6, 0x05, 0x84, 0x02, 0xD5, +0xD1, 0x0C, 0x08, 0x3C, 0xA0, 0xFC, 0x06, 0x80, +0xA0, 0x84, 0x40, 0xFC, 0x78, 0x3E, 0x81, 0x84, +0x33, 0xD5, 0x94, 0x17, 0x0C, 0x08, 0x82, 0x40, +0x02, 0x18, 0x84, 0x40, 0x0B, 0x00, 0x82, 0x4E, +0x0A, 0x04, 0x81, 0x40, 0x62, 0x00, 0x84, 0x50, +0x01, 0xA1, 0x83, 0x38, 0x0C, 0x20, 0x82, 0x40, +0x81, 0x50, 0xBE, 0xEA, 0x92, 0x40, 0x01, 0x00, +0x94, 0x40, 0x0C, 0x20, 0x92, 0x4E, 0x02, 0x98, +0x01, 0x91, 0x0B, 0x00, 0x62, 0x00, 0x84, 0x50, +0x01, 0xA1, 0x83, 0x38, 0x82, 0x40, 0x08, 0x93, +0xBE, 0xEA, 0x0C, 0x20, 0x28, 0x5A, 0x92, 0x9C, +0x82, 0x40, 0xDF, 0x18, 0x94, 0x40, 0x0C, 0x08, +0x92, 0x4E, 0x02, 0x18, 0xBE, 0xEA, 0x03, 0x00, +0x28, 0x5A, 0x91, 0x9C, 0x30, 0x38, 0xF8, 0x20, +0x6C, 0x9D, 0x0A, 0x94, 0x07, 0x84, 0x50, 0x5A, +0x60, 0x38, 0x60, 0x84, 0x43, 0x80, 0x02, 0x14, +0xC0, 0xFC, 0xCA, 0xD5, 0x80, 0xFC, 0x00, 0xFC, +0xFF, 0x49, 0x00, 0xFC, 0x41, 0xDD, 0xFD, 0xFF, +0x2B, 0x01, 0x20, 0x02, 0xAA, 0xFF, 0x27, 0x3E, +0x10, 0x00, 0x10, 0x02, 0x09, 0x06, 0x10, 0x5A, +0x2B, 0xE4, 0x2A, 0xEA, 0x00, 0x22, 0x1E, 0xE9, +0x0F, 0xE4, 0x10, 0x00, 0x14, 0x3C, 0x1A, 0xE8, +0x2B, 0xE4, 0xDA, 0x0B, 0x04, 0x3C, 0x0F, 0xE9, +0x0F, 0xE4, 0xDA, 0x0B, 0x42, 0xDD, 0x0B, 0xE8, +0x33, 0x06, 0x10, 0x44, 0x44, 0x00, 0x10, 0x14, +0x10, 0x14, 0x20, 0x84, 0x10, 0x14, 0x40, 0x00, +0x42, 0xDD, 0x3F, 0x00, 0x00, 0x01, 0x10, 0x44, +0x10, 0x3C, 0x44, 0xA8, 0x07, 0xD5, 0xED, 0x0C, +0x10, 0x44, 0x42, 0xDD, 0x44, 0xA8, 0x00, 0x02, +0x43, 0x0C, 0x10, 0x3C, 0x10, 0x14, 0x42, 0xDD, +0x80, 0xFC, 0x19, 0x00, 0x10, 0x46, 0x00, 0xFC, +0x10, 0x58, 0x89, 0x00, 0xB0, 0xEA, 0xDC, 0x8F, +0x4C, 0xFF, 0x20, 0x50, 0xDB, 0x96, 0x61, 0xB4, +0x03, 0xE8, 0x03, 0xE0, 0x03, 0x96, 0x01, 0xB4, +0x11, 0x4C, 0x2C, 0x8E, 0x10, 0x46, 0xF9, 0x7F, +0x10, 0x58, 0x89, 0x00, 0x60, 0x84, 0xF0, 0x8F, +0x4C, 0xFF, 0x20, 0x50, 0xFF, 0xFF, 0x30, 0x1C, +0xFE, 0x7F, 0x11, 0x4C, 0x10, 0x04, 0x8B, 0xEA, +0x30, 0x3C, 0x68, 0x81, 0x30, 0x92, 0x86, 0x03, +0x31, 0x42, 0xCB, 0x9A, 0x03, 0xE0, 0x03, 0x80, +0x00, 0x3C, 0x05, 0xE8, 0x08, 0x9A, 0x86, 0x03, +0x28, 0x3E, 0x20, 0xEA, 0x30, 0x46, 0x0C, 0x07, +0x50, 0xAC, 0x88, 0x00, 0xA4, 0x85, 0x31, 0x58, +0x83, 0xB4, 0x21, 0x84, 0x01, 0x05, 0x51, 0x38, +0x65, 0x9B, 0x21, 0x97, 0x05, 0xE0, 0xC0, 0xEA, +0x01, 0x38, 0x05, 0xE8, 0x20, 0x9A, 0x01, 0x05, +0x41, 0x38, 0x20, 0xEA, 0x10, 0x5A, 0x09, 0x05, +0x09, 0x9D, 0x15, 0x0E, 0x61, 0x38, 0xA3, 0xB4, +0xB0, 0x92, 0x01, 0x11, 0x6F, 0xEA, 0xAE, 0x9B, +0x05, 0xE8, 0x06, 0xE0, 0x01, 0x11, 0x01, 0x38, +0x20, 0xEA, 0x28, 0x9A, 0x51, 0x38, 0x4A, 0x9C, +0xDC, 0x9C, 0x09, 0x11, 0xDF, 0x0F, 0x18, 0x5A, +0x46, 0xFC, 0x80, 0xFC, 0xE2, 0x0B, 0x00, 0x3C, +0x03, 0x4E, 0x04, 0x96, 0x14, 0x3C, 0xF5, 0x00, +0x14, 0x4E, 0x06, 0x00, 0x20, 0x3C, 0xF1, 0x00, +0x5F, 0xDD, 0x49, 0x00, 0x09, 0x9F, 0x7A, 0xEA, +0x88, 0xF1, 0x89, 0xF2, 0x7F, 0xB6, 0x81, 0xF0, +0x85, 0xF3, 0x84, 0xF3, 0x86, 0xF0, 0x82, 0xF3, +0x00, 0x48, 0x8B, 0xF4, 0x01, 0xF5, 0xAC, 0x00, +0x69, 0x9C, 0xC1, 0x87, 0x09, 0x96, 0xAB, 0x96, +0xEF, 0x15, 0x91, 0x9E, 0x8A, 0xF2, 0x03, 0x80, +0x92, 0x00, 0x00, 0x48, 0x03, 0xF2, 0x0A, 0xF1, +0xA0, 0x40, 0x47, 0xEA, 0x11, 0x38, 0x00, 0x88, +0x40, 0x44, 0x11, 0xA9, 0x12, 0x4C, 0xFF, 0x7F, +0xE0, 0x41, 0x82, 0x00, 0x11, 0x38, 0x11, 0x00, +0x12, 0x4C, 0x11, 0xF9, 0x41, 0x9C, 0x7C, 0x00, +0x11, 0x80, 0x90, 0x40, 0x11, 0xA5, 0x11, 0x38, +0x75, 0x00, 0x12, 0x4C, 0x2C, 0x07, 0x58, 0x3E, +0x11, 0xF9, 0x11, 0x38, 0x11, 0xF9, 0x72, 0x38, +0x11, 0xA9, 0x31, 0x38, 0x11, 0xA9, 0x62, 0x38, +0x51, 0x38, 0x34, 0xEA, 0x28, 0x3E, 0x11, 0x25, +0x41, 0x38, 0x2C, 0x07, 0xDC, 0x9A, 0x11, 0x25, +0x96, 0x9A, 0x9D, 0x98, 0x21, 0x40, 0x82, 0x84, +0x4F, 0x9A, 0x76, 0x10, 0xC4, 0x1E, 0x58, 0x3E, +0x11, 0xA9, 0x32, 0x38, 0x11, 0xA5, 0x62, 0x38, +0x7F, 0xEA, 0xDE, 0x9A, 0x6C, 0xEA, 0x4A, 0x9A, +0x87, 0xF1, 0x4B, 0x96, 0x2C, 0x07, 0x18, 0x3E, +0x11, 0xA5, 0x20, 0x38, 0x11, 0xA9, 0x50, 0x38, +0x61, 0x80, 0x9A, 0x98, 0x11, 0x79, 0x64, 0x38, +0x21, 0x38, 0x55, 0x9A, 0x44, 0x38, 0x11, 0xF9, +0xE8, 0x3F, 0x11, 0x29, 0x31, 0x38, 0x2C, 0x07, +0x54, 0x38, 0x11, 0xA9, 0x7F, 0x38, 0x11, 0x25, +0xE0, 0x45, 0x11, 0x25, 0x4F, 0x40, 0x20, 0x4E, +0x5F, 0x40, 0x01, 0x10, 0x6F, 0x9B, 0x01, 0x14, +0x01, 0x18, 0x6F, 0x40, 0xB2, 0x9B, 0xE3, 0x9A, +0x42, 0x84, 0xEB, 0x98, 0xB6, 0x88, 0x31, 0x40, +0xEF, 0x05, 0x02, 0xF5, 0xB3, 0x9A, 0x05, 0x80, +0x11, 0x29, 0x64, 0x38, 0x38, 0x3E, 0xA1, 0xEA, +0xD3, 0x97, 0x2C, 0x07, 0x11, 0x25, 0x24, 0x38, +0x11, 0xA9, 0x41, 0x38, 0x11, 0xA5, 0x31, 0x38, +0x9A, 0x9A, 0xF3, 0x9A, 0xA1, 0xEA, 0x94, 0x98, +0xBA, 0x98, 0x07, 0xF4, 0xD3, 0x96, 0x6C, 0xEA, +0x00, 0x14, 0x52, 0x42, 0x04, 0xF2, 0x61, 0x98, +0x4B, 0x96, 0x9F, 0xB4, 0x00, 0xF8, 0xE3, 0x43, +0x00, 0x88, 0x20, 0x42, 0x00, 0x0C, 0x42, 0x42, +0xEF, 0x15, 0x82, 0xF5, 0x84, 0xF2, 0x05, 0x80, +0x03, 0xF5, 0x9F, 0xB6, 0x69, 0x9D, 0x01, 0x9C, +0x01, 0x96, 0x83, 0xF5, 0x03, 0x80, 0xEF, 0x05, +0xFF, 0x40, 0x0B, 0xF1, 0xF3, 0x4E, 0x07, 0x04, +0x01, 0xF3, 0x6B, 0xFF, 0x06, 0xF2, 0x08, 0xF4, +0x91, 0x9C, 0x1C, 0x98, 0x86, 0xF2, 0x01, 0x96, +0x06, 0xF5, 0x81, 0xF0, 0x09, 0x80, 0xEF, 0x05, +0xF3, 0x4E, 0xBE, 0xE0, 0x02, 0xF1, 0x52, 0xFF, +0x9F, 0xB4, 0x05, 0xF3, 0x41, 0xDD, 0x04, 0xF5, +0xE1, 0x00, 0x10, 0x12, 0x65, 0x9A, 0x99, 0x9A, +0x4B, 0x96, 0x93, 0x96, 0x46, 0x01, 0x20, 0x12, +0xE0, 0x00, 0x10, 0x12, 0x5F, 0x01, 0x20, 0x22, +0x20, 0x4C, 0x77, 0xEA, 0x10, 0x22, 0x0F, 0xC0, +0x20, 0x22, 0x46, 0x01, 0x41, 0xE0, 0xDF, 0x00, +0x10, 0x22, 0x0E, 0xE8, 0x00, 0x22, 0xE1, 0x00, +0x20, 0xE0, 0x45, 0x01, 0x11, 0xD5, 0x08, 0xE8, +0x46, 0x01, 0x10, 0x22, 0xDF, 0x00, 0x00, 0x22, +0x0B, 0xE9, 0x01, 0xE0, 0xA8, 0x0C, 0x24, 0x3C, +0xAA, 0x0C, 0x04, 0x3C, 0x07, 0x00, 0x01, 0x40, +0x04, 0xD5, 0x31, 0xEA, 0x02, 0xD5, 0x01, 0x84, +0xC6, 0xFC, 0x00, 0x84, 0x26, 0xEA, 0x42, 0xFC, +0x00, 0x10, 0x00, 0x54, 0x01, 0x84, 0x03, 0xC8, +0x43, 0xEA, 0x47, 0xD5, 0x08, 0x00, 0x10, 0x02, +0x07, 0x00, 0xE0, 0x03, 0x45, 0xA4, 0x81, 0xF1, +0x02, 0x00, 0x80, 0x02, 0x49, 0x9C, 0x86, 0xA4, +0x04, 0x42, 0x1E, 0x80, 0x91, 0x9E, 0x73, 0x04, +0x01, 0x96, 0x82, 0xF2, 0x7F, 0x44, 0x40, 0x85, +0x83, 0xF1, 0x00, 0x80, 0xC4, 0x1E, 0x98, 0x3E, +0xB3, 0x96, 0x20, 0xD5, 0x01, 0x89, 0x44, 0x38, +0x01, 0x20, 0x31, 0x40, 0x34, 0x38, 0x48, 0x88, +0x24, 0x38, 0x11, 0x8D, 0x53, 0x98, 0x11, 0x89, +0x10, 0x40, 0x62, 0x84, 0x61, 0x9A, 0x56, 0x8C, +0x6C, 0xEA, 0x4B, 0x96, 0x02, 0xE8, 0xE1, 0xE0, +0xC8, 0x88, 0xCB, 0x97, 0xB1, 0x97, 0x69, 0x9D, +0x02, 0xF3, 0x03, 0xF2, 0x23, 0xE0, 0x55, 0x98, +0x01, 0x9C, 0xE5, 0xE9, 0x01, 0x96, 0x41, 0x8D, +0x15, 0x40, 0x01, 0xF2, 0x41, 0xE0, 0x00, 0x78, +0xC0, 0x80, 0x04, 0xE9, 0xF1, 0xD5, 0xA0, 0x84, +0xAA, 0x0C, 0x78, 0x3C, 0xA8, 0x0C, 0x04, 0x3C, +0x07, 0x80, 0x03, 0x40, 0xC2, 0xFC, 0x31, 0xEA, +0x35, 0xEA, 0x00, 0xFC, 0x00, 0xFC, 0x80, 0xFC, +0x80, 0xFC, 0x35, 0xEA, 0x45, 0xDD, 0x00, 0xFC, +0x00, 0x4E, 0x35, 0xEA, 0x10, 0x3C, 0x07, 0x02, +0x10, 0x5A, 0xDA, 0x0B, 0x14, 0x3C, 0x0A, 0x0C, +0x07, 0x46, 0xF7, 0x0C, 0x47, 0xFE, 0xF0, 0xFF, +0x10, 0x14, 0x42, 0xDD, 0x41, 0xDD, 0x41, 0x00, +0x37, 0x01, 0x20, 0x02, 0x20, 0x14, 0x43, 0xDD, +0x20, 0x02, 0x42, 0x80, 0x20, 0x14, 0x4C, 0x01, +0x2A, 0xEA, 0x43, 0x80, 0x0B, 0xE9, 0x2B, 0xE4, +0x10, 0x00, 0x00, 0x22, 0x07, 0xE8, 0x0F, 0xE4, +0x00, 0x58, 0x42, 0xDD, 0x10, 0x44, 0x10, 0x01, +0x06, 0xD5, 0x33, 0x06, 0x17, 0x0D, 0x10, 0x3C, +0x00, 0x58, 0x42, 0xDD, 0x20, 0xB6, 0x10, 0x01, +0x56, 0x00, 0x00, 0x2E, 0x08, 0x02, 0x08, 0x5A, +0x02, 0x01, 0x00, 0x46, 0x10, 0x14, 0x20, 0x84, +0x0D, 0xD5, 0x45, 0x00, 0x09, 0x00, 0x00, 0x3C, +0x00, 0x01, 0x00, 0x54, 0x1C, 0x3C, 0x0C, 0xC0, +0x42, 0xDD, 0x14, 0x00, 0x45, 0x00, 0x10, 0x14, +0x0B, 0x00, 0x1C, 0x3C, 0x10, 0x14, 0x42, 0xDD, +0x0F, 0xD5, 0x1A, 0x00, 0x19, 0x0D, 0x20, 0x3C, +0x20, 0x14, 0x42, 0xDD, 0x00, 0x3C, 0x45, 0x00, +0x04, 0xC0, 0xF2, 0x0C, 0x30, 0x10, 0x10, 0x46, +0x43, 0xDD, 0x0F, 0xFE, 0x1A, 0x80, 0x00, 0x14, +0x21, 0x84, 0x57, 0xDD, 0x42, 0xDD, 0x20, 0xB6, +0x80, 0xFC, 0x20, 0xB6, 0x45, 0xDD, 0x40, 0xFC, +0xFD, 0xB1, 0x88, 0xEE, 0x20, 0x44, 0x20, 0x84, +0x07, 0x80, 0x84, 0x00, 0x06, 0x46, 0xC2, 0xF8, +0x00, 0x58, 0x50, 0x37, 0x83, 0xF0, 0x67, 0x09, +0x24, 0x46, 0xC0, 0xF0, 0x00, 0x46, 0xA1, 0x6E, +0x21, 0x58, 0x42, 0xDD, 0x00, 0x58, 0xCF, 0x02, +0x84, 0xF2, 0x9F, 0x05, 0x85, 0xF0, 0xC1, 0xF2, +0x21, 0x46, 0xC2, 0xF0, 0x03, 0x46, 0x84, 0xBA, +0x21, 0x58, 0x09, 0x75, 0x00, 0x58, 0x3E, 0x0B, +0x86, 0xF2, 0x7C, 0x06, 0x87, 0xF0, 0xC3, 0xF2, +0x26, 0x46, 0xC4, 0xF0, 0x05, 0x46, 0x12, 0xEA, +0x21, 0x58, 0x25, 0xD4, 0x00, 0x58, 0xF8, 0x0C, +0x88, 0xF2, 0xF1, 0x09, 0x89, 0xF0, 0xC5, 0xF2, +0x23, 0x46, 0xC6, 0xF0, 0x07, 0x46, 0x4B, 0xA8, +0x21, 0x58, 0x96, 0x50, 0x00, 0x58, 0xE3, 0x03, +0x8A, 0xF2, 0xC6, 0x07, 0x8B, 0xF0, 0xC7, 0xF2, +0x26, 0x46, 0xC8, 0xF0, 0x05, 0x46, 0x2C, 0xA1, +0x21, 0x58, 0x59, 0x42, 0x00, 0x58, 0x8D, 0x0F, +0x8C, 0xF2, 0x1B, 0x0F, 0x8D, 0xF0, 0xC9, 0xF2, +0x22, 0x46, 0xCA, 0xF0, 0x05, 0x46, 0xB3, 0x84, +0x21, 0x58, 0x67, 0x09, 0x00, 0x58, 0x37, 0x0E, +0x8E, 0xF2, 0x6E, 0x0C, 0x8F, 0xF0, 0xCB, 0xF2, +0x22, 0x46, 0xCC, 0xF0, 0x04, 0x46, 0xCF, 0x12, +0x21, 0x58, 0x9F, 0x25, 0x00, 0x58, 0xDD, 0x08, +0x90, 0xF2, 0xBA, 0x01, 0x91, 0xF0, 0xCD, 0xF2, +0x87, 0x46, 0xCE, 0xF0, 0x37, 0x46, 0xEA, 0xC6, +0x47, 0x46, 0xD4, 0x8D, 0x20, 0x46, 0xA8, 0x1B, +0x00, 0x46, 0x3E, 0x4B, 0x31, 0x58, 0x7C, 0x96, +0x42, 0x58, 0x59, 0x82, 0x84, 0x58, 0xB3, 0x04, +0x21, 0x58, 0x2C, 0x01, 0x00, 0x58, 0x75, 0x03, +0xBE, 0xF3, 0xEA, 0x06, 0x8F, 0x14, 0xBF, 0xF4, +0x92, 0xF2, 0x3D, 0x80, 0x93, 0xF0, 0xCF, 0xF2, +0x21, 0x46, 0xD0, 0xF0, 0x02, 0x46, 0xF8, 0x2C, +0x21, 0x58, 0xF1, 0x59, 0x00, 0x58, 0xD4, 0x0D, +0x94, 0xF2, 0xA8, 0x0B, 0x95, 0xF0, 0xD1, 0xF2, +0x24, 0x46, 0xD2, 0xF0, 0x01, 0x46, 0xE3, 0xB3, +0x21, 0x58, 0xC6, 0x67, 0x00, 0x58, 0x50, 0x07, +0x96, 0xF2, 0xA1, 0x0E, 0x97, 0xF0, 0xD3, 0xF2, +0x22, 0x46, 0xD4, 0xF0, 0x05, 0x46, 0x8D, 0xCF, +0x21, 0x58, 0x1B, 0x9F, 0x00, 0x58, 0x42, 0x0D, +0x98, 0xF2, 0x84, 0x0A, 0x99, 0xF0, 0xD5, 0xF2, +0x23, 0x46, 0xD6, 0xF0, 0x06, 0x46, 0x37, 0x3E, +0x54, 0x46, 0x6E, 0x7C, 0xA1, 0x46, 0xDD, 0xF8, +0x93, 0x46, 0xBA, 0xF1, 0x52, 0x58, 0x75, 0xE3, +0x21, 0x58, 0x25, 0x84, 0x00, 0x58, 0x09, 0x05, +0xA5, 0x58, 0x12, 0x0A, 0x94, 0x58, 0x4B, 0x08, +0x9C, 0xB1, 0x96, 0x80, 0xD8, 0xF0, 0xD7, 0xF2, +0xAF, 0x14, 0xD9, 0xF5, 0x9F, 0x14, 0x5A, 0x80, +0x8F, 0x14, 0x5B, 0x80, 0x9A, 0xF2, 0x5C, 0x80, +0x20, 0x84, 0x9B, 0xF0, 0x84, 0x00, 0x20, 0x44, +0x82, 0xF3, 0x06, 0x80, 0xBF, 0xB6, 0x81, 0xF4, +0xA4, 0x24, 0x00, 0x49, 0x04, 0xF0, 0x03, 0xF2, +0x05, 0xF2, 0x9F, 0xF2, 0xA1, 0xF2, 0xA0, 0xF0, +0x07, 0xF2, 0x06, 0xF0, 0xA3, 0xF2, 0xA2, 0xF0, +0x09, 0xF2, 0x08, 0xF0, 0xA5, 0xF2, 0xA4, 0xF0, +0x0B, 0xF2, 0x0A, 0xF0, 0xA7, 0xF2, 0xA6, 0xF0, +0x0D, 0xF2, 0x0C, 0xF0, 0xA9, 0xF2, 0xA8, 0xF0, +0x0F, 0xF2, 0x0E, 0xF0, 0x01, 0xF4, 0x02, 0xF3, +0xAB, 0xF2, 0xAA, 0xF0, 0x11, 0xF2, 0x10, 0xF0, +0x9E, 0xF4, 0x9D, 0xF3, 0x8F, 0x14, 0xAC, 0xF0, +0xAD, 0xF2, 0x1C, 0x80, 0x13, 0xF2, 0x12, 0xF0, +0xAF, 0xF2, 0xAE, 0xF0, 0x15, 0xF2, 0x14, 0xF0, +0xB1, 0xF2, 0xB0, 0xF0, 0x17, 0xF2, 0x16, 0xF0, +0xB3, 0xF2, 0xB2, 0xF0, 0x19, 0xF2, 0x18, 0xF0, +0xB5, 0xF2, 0xB4, 0xF0, 0x1B, 0xF2, 0x1A, 0xF0, +0x10, 0x46, 0xBF, 0xB4, 0xB7, 0xF2, 0x00, 0x10, +0xB6, 0xF0, 0xBB, 0xF1, 0xAF, 0x14, 0xB8, 0xF5, +0x9F, 0x14, 0x39, 0x80, 0x35, 0xEA, 0x3A, 0x80, +0x03, 0x01, 0x10, 0x46, 0x01, 0x83, 0x20, 0x04, +0x00, 0x01, 0x21, 0x58, 0x01, 0x83, 0x20, 0x14, +0xDA, 0x0B, 0x24, 0x3C, 0x13, 0xE9, 0x4B, 0xE4, +0xDA, 0x0B, 0x14, 0x3C, 0x0F, 0xE8, 0x2F, 0xE4, +0x41, 0x80, 0x20, 0x84, 0x07, 0x80, 0x81, 0x84, +0x0C, 0x08, 0x32, 0x40, 0x33, 0x38, 0x91, 0x9C, +0x30, 0x38, 0x0A, 0x04, 0x4C, 0x9C, 0x0A, 0x04, +0xF8, 0x20, 0x28, 0x5A, 0x5C, 0xB0, 0x3D, 0xB0, +0x58, 0xFC, 0xFF, 0x49, 0x10, 0x02, 0x41, 0xDD, +0x18, 0x5A, 0x10, 0x00, 0x10, 0x02, 0x06, 0x06, +0xBA, 0xEA, 0x35, 0x01, 0x2A, 0xEA, 0x12, 0xD5, +0x0B, 0xE9, 0x2B, 0xE4, 0x2F, 0xE4, 0x2A, 0xEA, +0x10, 0x02, 0x08, 0xE8, 0xBA, 0xEA, 0x35, 0x01, +0x00, 0x58, 0x08, 0xF8, 0x17, 0xD5, 0x0C, 0x00, +0xFF, 0x0C, 0x10, 0x3C, 0x42, 0x0C, 0x04, 0x3C, +0xE0, 0x01, 0x70, 0x46, 0x48, 0x96, 0x45, 0xEA, +0x01, 0x96, 0xAE, 0xEA, 0x47, 0xFE, 0x7F, 0xFE, +0x42, 0xA8, 0x42, 0xDD, 0xFF, 0x83, 0x42, 0xDD, +0xF0, 0x01, 0x10, 0x46, 0x0C, 0x00, 0x00, 0x58, +0x01, 0x83, 0x10, 0x58, 0x47, 0xDD, 0x20, 0xB6, +0x10, 0x00, 0x01, 0x22, 0x20, 0xE9, 0x0B, 0xE4, +0x10, 0x00, 0x01, 0x22, 0x1C, 0xE8, 0x0F, 0xE4, +0x00, 0x84, 0x8B, 0xEA, 0x80, 0x80, 0x5C, 0xB1, +0x61, 0x02, 0xFD, 0xB0, 0x68, 0x5A, 0x10, 0x00, +0x81, 0xB6, 0x04, 0x0C, 0x62, 0x38, 0x04, 0xD5, +0xC1, 0xB6, 0x02, 0x80, 0x88, 0x00, 0x70, 0x46, +0x00, 0x81, 0x73, 0x58, 0x71, 0x38, 0x87, 0x99, +0x04, 0x9C, 0x02, 0x80, 0x4C, 0x9C, 0xE6, 0xB6, +0xED, 0x7C, 0x08, 0x5A, 0x75, 0xEA, 0x11, 0xD5, +0xFF, 0xFF, 0x17, 0x46, 0x88, 0x00, 0x20, 0x46, +0xFF, 0x8F, 0x10, 0x58, 0x7C, 0x00, 0x21, 0x58, +0x11, 0x1C, 0x60, 0x80, 0x04, 0x9C, 0x40, 0x80, +0x01, 0x4C, 0x23, 0xB6, 0x8B, 0xEA, 0xFB, 0x7F, +0x00, 0x10, 0x00, 0x46, 0x1F, 0x80, 0x00, 0x14, +0x5F, 0x80, 0x00, 0x14, 0xBD, 0xB0, 0x75, 0xEA, +0x80, 0x01, 0x00, 0x58, 0xD1, 0xA2, 0x7B, 0xEA, +0x00, 0x4C, 0xC1, 0xAA, 0x75, 0xEA, 0xFE, 0xFF, +0x00, 0x58, 0x9C, 0xB0, 0x7B, 0xEA, 0x80, 0x00, +0xC1, 0xAA, 0xD1, 0xA2, 0xFE, 0xFF, 0x00, 0x4C, +0xC0, 0xFC, 0x78, 0xED, 0x35, 0xEA, 0x00, 0xFC, +0x03, 0x01, 0x00, 0x46, 0x61, 0xEA, 0x59, 0xDD, +0xFF, 0x83, 0x52, 0xDD, 0x60, 0x84, 0x57, 0xDD, +0x75, 0xEA, 0x60, 0xB6, 0x98, 0x00, 0x10, 0x46, +0x40, 0x84, 0xC1, 0xAA, 0xFE, 0xFF, 0x00, 0x4C, +0x3F, 0x84, 0x57, 0xDD, 0x08, 0x02, 0x10, 0x14, +0x00, 0x50, 0x41, 0xDD, 0x30, 0x02, 0x6A, 0x02, +0x3B, 0x3C, 0xF0, 0x7F, 0x44, 0xA4, 0xE7, 0xFF, +0xB6, 0xEA, 0xC3, 0xA4, 0x04, 0x86, 0x31, 0x40, +0x30, 0x14, 0x43, 0xDD, 0x20, 0x14, 0x58, 0x80, +0x20, 0x14, 0x46, 0x80, 0x20, 0x14, 0x47, 0x80, +0x10, 0x02, 0x48, 0x80, 0x20, 0x02, 0xF2, 0x7F, +0x21, 0x40, 0xF1, 0x7F, 0x43, 0xDD, 0x04, 0x06, +0x49, 0x80, 0x20, 0x14, 0xF0, 0xFF, 0x17, 0x46, +0xF8, 0x7F, 0x20, 0x22, 0x43, 0xDD, 0x8F, 0xFE, +0x41, 0x80, 0x20, 0x14, 0x20, 0x14, 0x82, 0xA4, +0x20, 0x02, 0x42, 0x80, 0x20, 0x14, 0x17, 0x00, +0x20, 0x02, 0x43, 0x80, 0x20, 0x14, 0x18, 0x00, +0x20, 0x02, 0x44, 0x80, 0x20, 0x14, 0x1A, 0x00, +0x10, 0x02, 0x45, 0x80, 0x20, 0x02, 0xFD, 0x7F, +0x21, 0x40, 0xFC, 0x7F, 0x43, 0xDD, 0x04, 0x06, +0x18, 0x80, 0x20, 0x14, 0xF5, 0x7F, 0x30, 0x02, +0xF4, 0x7F, 0x40, 0x02, 0x42, 0x40, 0x87, 0xA4, +0x2E, 0xFF, 0x08, 0x40, 0x08, 0x20, 0x21, 0x40, +0x00, 0xFF, 0x50, 0x44, 0xAE, 0xFE, 0x46, 0xA4, +0x48, 0x96, 0xA7, 0xFE, 0x04, 0x0F, 0x21, 0x40, +0x43, 0xDD, 0x8F, 0xFE, 0x17, 0x80, 0x20, 0x14, +0xF3, 0x7F, 0x00, 0x02, 0x10, 0x46, 0x04, 0xC0, +0x0F, 0xFE, 0x30, 0x10, 0x00, 0x14, 0x43, 0xDD, +0x41, 0xDD, 0x1A, 0x80, 0x3D, 0x01, 0x20, 0x02, +0x1B, 0x80, 0x20, 0x14, 0x00, 0x01, 0x20, 0x02, +0x0C, 0x80, 0x20, 0x12, 0x00, 0x01, 0x10, 0x22, +0x5F, 0x01, 0x10, 0x12, 0x2B, 0xE4, 0x2A, 0xEA, +0x2A, 0xEA, 0x0A, 0xE9, 0x07, 0xE8, 0x2F, 0xE4, +0x41, 0x01, 0x20, 0x02, 0x89, 0xA8, 0x43, 0xDD, +0x07, 0xD5, 0x77, 0xEA, 0x0B, 0x0D, 0x20, 0x3C, +0x81, 0xA8, 0x42, 0xDD, 0xD0, 0x0C, 0x10, 0x3C, +0x10, 0x12, 0x42, 0xDD, 0x41, 0xDD, 0x2C, 0x00, +0x34, 0x01, 0x20, 0x02, 0xFE, 0xFF, 0x30, 0x44, +0x9E, 0xFE, 0x43, 0xDD, 0x1C, 0x80, 0x20, 0x14, +0xFF, 0x00, 0x2F, 0x44, 0x1D, 0x80, 0x20, 0x14, +0x3A, 0x01, 0x20, 0x22, 0x3A, 0x01, 0x00, 0x02, +0x04, 0x02, 0x21, 0x40, 0x00, 0x58, 0x42, 0xDD, +0x7B, 0xEA, 0x78, 0x00, 0x00, 0x4C, 0x81, 0xAA, +0x44, 0xDD, 0xFF, 0xFF, 0x3E, 0x81, 0x20, 0x22, +0xAF, 0xFE, 0xB6, 0xEA, 0x42, 0xDD, 0x40, 0xB6, +0x47, 0x81, 0x20, 0x22, 0x3F, 0x00, 0x20, 0x14, +0x40, 0x81, 0x00, 0x22, 0x4E, 0x81, 0x10, 0x02, +0x04, 0x06, 0x10, 0x40, 0x10, 0x14, 0x42, 0xDD, +0x20, 0x84, 0x40, 0x00, 0x4A, 0x00, 0x10, 0x14, +0x80, 0x00, 0x10, 0x44, 0x4B, 0x00, 0x10, 0x14, +0x10, 0x14, 0x49, 0x94, 0x10, 0x44, 0x4C, 0x00, +0x10, 0x14, 0x80, 0x01, 0x10, 0x44, 0x4D, 0x00, +0x10, 0x14, 0x00, 0x02, 0x10, 0x44, 0x4F, 0x00, +0x10, 0x14, 0xC0, 0x05, 0x10, 0x44, 0x50, 0x00, +0x10, 0x14, 0x80, 0x09, 0x10, 0x44, 0x51, 0x00, +0x10, 0x14, 0x40, 0x0D, 0x10, 0x44, 0x52, 0x00, +0x10, 0x14, 0xE0, 0x12, 0x59, 0x9C, 0x53, 0x00, +0x54, 0x00, 0x10, 0x14, 0x55, 0x00, 0x10, 0x14, +0x80, 0x18, 0x10, 0x44, 0x56, 0x00, 0x10, 0x14, +0xF0, 0x1F, 0x10, 0x44, 0x57, 0x00, 0x10, 0x14, +0x62, 0xFD, 0xFF, 0x49, 0x00, 0xFC, 0x80, 0xFC, +0x08, 0x00, 0x10, 0x3C, 0x00, 0x81, 0x10, 0x54, +0x10, 0x2E, 0x55, 0xC1, 0x10, 0x5A, 0x20, 0x00, +0x5B, 0xDD, 0x52, 0x01, 0x44, 0x01, 0x10, 0x22, +0x44, 0x01, 0x21, 0x52, 0x08, 0xE8, 0x0D, 0xF8, +0xC5, 0xE0, 0x50, 0xEA, 0x63, 0xEA, 0x05, 0xE8, +0x02, 0xE8, 0x64, 0xE0, 0x5B, 0xDD, 0x26, 0xF8, +0x44, 0x01, 0x31, 0x52, 0xD1, 0x9E, 0x9A, 0x9A, +0x11, 0x0D, 0x50, 0x38, 0x40, 0x38, 0xD1, 0x9C, +0x58, 0xEA, 0x11, 0x0D, 0xB2, 0x80, 0x61, 0x22, +0xFF, 0x83, 0xC1, 0xE0, 0x50, 0xEA, 0x08, 0xE8, +0x05, 0xE8, 0xC5, 0xE0, 0x64, 0xE0, 0x63, 0xEA, +0x24, 0xF8, 0x02, 0xE8, 0x10, 0x22, 0x5B, 0xDD, +0x21, 0x52, 0x4D, 0x01, 0x00, 0x4E, 0x4D, 0x01, +0x0F, 0xE8, 0xE8, 0xFF, 0xC5, 0xE0, 0x50, 0xEA, +0x63, 0xEA, 0x0C, 0xE8, 0x09, 0xE8, 0x64, 0xE0, +0xD9, 0x98, 0xEC, 0x98, 0x31, 0x40, 0xC3, 0x84, +0x30, 0x38, 0xD6, 0x98, 0xFF, 0x83, 0x09, 0x09, +0x31, 0x52, 0x5B, 0xDD, 0x9A, 0x9A, 0x4D, 0x01, +0xD3, 0xFF, 0x00, 0x4E, 0x50, 0xEA, 0x0F, 0xE8, +0x0C, 0xE8, 0xC5, 0xE0, 0x64, 0xE0, 0x63, 0xEA, +0x2C, 0x99, 0x09, 0xE8, 0x63, 0x84, 0x61, 0x98, +0x76, 0x8C, 0x10, 0x40, 0x09, 0x09, 0x10, 0x38, +0x80, 0xFC, 0xFF, 0x83, 0x45, 0xDD, 0x42, 0xFC, +0x08, 0x00, 0x20, 0x3C, 0x00, 0x02, 0x21, 0x54, +0xB6, 0x00, 0x22, 0x4E, 0x22, 0x4E, 0x74, 0xEA, +0x42, 0xBA, 0xB3, 0x00, 0x88, 0x82, 0x90, 0x50, +0x82, 0xF2, 0xD3, 0x96, 0x31, 0x12, 0x47, 0xDD, +0x50, 0xBB, 0x2E, 0x00, 0x81, 0xF3, 0x49, 0x81, +0x31, 0x12, 0xDB, 0x96, 0x80, 0x3C, 0x2F, 0x00, +0x70, 0x50, 0x4A, 0x00, 0x34, 0x52, 0x8A, 0x82, +0x83, 0xF3, 0x00, 0x00, 0x34, 0x42, 0x7E, 0x84, +0xE4, 0x53, 0x24, 0x0C, 0xC0, 0x84, 0x44, 0x01, +0x45, 0x22, 0xBF, 0xEA, 0xA4, 0xE0, 0x00, 0x00, +0xBF, 0xEA, 0x0B, 0xE9, 0xFE, 0xFF, 0x43, 0x22, +0x06, 0xE9, 0xA4, 0xE0, 0x43, 0x22, 0xBF, 0xEA, +0xA4, 0xE0, 0x00, 0x80, 0xB1, 0x9D, 0x02, 0xE8, +0x43, 0x89, 0x03, 0xF4, 0x00, 0x10, 0xEF, 0x41, +0x00, 0x20, 0x4F, 0x40, 0x46, 0x4E, 0xFB, 0x99, +0x02, 0xF2, 0xE9, 0xFF, 0xC5, 0xE4, 0x04, 0xCA, +0x03, 0xD5, 0x0A, 0xE8, 0x07, 0xE8, 0xC6, 0xE4, +0x7C, 0x0C, 0x34, 0x3C, 0x00, 0x80, 0x24, 0x22, +0x08, 0xE8, 0x62, 0xE0, 0xF1, 0x5C, 0x9C, 0xEA, +0x04, 0xE9, 0x33, 0x00, 0xF0, 0x00, 0x30, 0x44, +0x42, 0xBB, 0xC2, 0xBB, 0x03, 0x00, 0x37, 0x4E, +0x61, 0x84, 0x03, 0xD5, 0x20, 0x44, 0xC2, 0xBB, +0x62, 0x84, 0x44, 0x01, 0x95, 0x9A, 0x24, 0xEA, +0x0E, 0x00, 0x27, 0x4E, 0x60, 0x38, 0x51, 0x9D, +0x51, 0x9F, 0x11, 0x15, 0x11, 0x15, 0x50, 0x38, +0x52, 0x40, 0x75, 0x99, 0x50, 0x38, 0xD6, 0x8C, +0xF1, 0xD5, 0x09, 0x09, 0x70, 0x50, 0x5E, 0x84, +0xAC, 0xFE, 0x9A, 0x82, 0x00, 0x80, 0xE2, 0x53, +0x4D, 0x81, 0xA2, 0x52, 0x10, 0x50, 0x27, 0x81, +0xC0, 0x84, 0x9C, 0x82, 0x44, 0x22, 0xBB, 0xEA, +0x64, 0xE0, 0x00, 0x80, 0xBB, 0xEA, 0x0B, 0xE9, +0xFE, 0xFF, 0x40, 0x22, 0x06, 0xE9, 0x64, 0xE0, +0x40, 0x22, 0xBB, 0xEA, 0x64, 0xE0, 0x00, 0x80, +0xB1, 0x9D, 0x02, 0xE8, 0x35, 0x40, 0x5E, 0x89, +0x22, 0x89, 0x00, 0x14, 0x36, 0x4E, 0x4A, 0x98, +0x01, 0xF3, 0xEB, 0xFF, 0xC5, 0xE4, 0x04, 0xCB, +0x03, 0xD5, 0x0A, 0xE8, 0x07, 0xE8, 0xC6, 0xE4, +0x7C, 0x0C, 0x24, 0x3C, 0x00, 0x80, 0x13, 0x22, +0x08, 0xE8, 0x41, 0xE0, 0xF0, 0x5C, 0x90, 0xEA, +0x04, 0xE9, 0x33, 0x80, 0xF0, 0x00, 0x20, 0x44, +0x50, 0xBA, 0xD0, 0xBA, 0x03, 0x00, 0x27, 0x4E, +0x41, 0x84, 0x03, 0xD5, 0x10, 0x44, 0xD0, 0xBA, +0x42, 0x84, 0x4D, 0x01, 0x4C, 0x9A, 0x57, 0xEA, +0x0E, 0x00, 0x17, 0x4E, 0x50, 0x38, 0x09, 0x9D, +0x09, 0x9F, 0x11, 0x11, 0x11, 0x11, 0x40, 0x38, +0x42, 0x40, 0x2C, 0x99, 0x40, 0x38, 0xB6, 0x08, +0xF1, 0xD5, 0x09, 0x05, 0x40, 0xFC, 0xC2, 0xFC, +0x4F, 0x44, 0xDA, 0xF9, 0x05, 0xAD, 0x00, 0x80, +0x00, 0x84, 0x47, 0xA5, 0x48, 0x00, 0x90, 0x3C, +0x18, 0x3E, 0x61, 0x80, 0x7F, 0xEA, 0xDC, 0x14, +0x68, 0x3E, 0xAA, 0xEA, 0xE0, 0x80, 0xCC, 0x09, +0xE0, 0x39, 0x22, 0xD5, 0xA4, 0x38, 0x01, 0x81, +0xAF, 0x40, 0x01, 0x01, 0xA5, 0x40, 0x01, 0x28, +0xA0, 0x38, 0x11, 0x00, 0x62, 0xEA, 0x09, 0x81, +0x03, 0xE8, 0x8A, 0xE0, 0x41, 0x97, 0x5D, 0xEA, +0x43, 0xE1, 0x62, 0xEA, 0xBC, 0xEA, 0x02, 0xE8, +0xA5, 0x4E, 0x62, 0xEA, 0x62, 0xEA, 0x06, 0x00, +0x09, 0x01, 0xA1, 0x38, 0x71, 0x38, 0x03, 0xD5, +0xA1, 0x38, 0x09, 0x01, 0xA3, 0x38, 0x11, 0x01, +0x01, 0x9C, 0x09, 0x01, 0xDE, 0xE9, 0x09, 0xE0, +0x05, 0xAD, 0x56, 0xDD, 0xC6, 0xAC, 0x47, 0xAD, +0x00, 0xFC, 0xC0, 0xFC, 0x18, 0x3E, 0x21, 0xEA, +0x00, 0x84, 0xDC, 0x14, 0xA4, 0x00, 0x28, 0x3E, +0x40, 0x38, 0x09, 0xD5, 0x51, 0x38, 0x01, 0x81, +0x2C, 0x99, 0x01, 0x01, 0x54, 0xEA, 0x23, 0x97, +0x03, 0xE0, 0x01, 0x9C, 0x80, 0xFC, 0xF7, 0xE9, +0x43, 0xEA, 0x00, 0xFC, 0xC1, 0xA4, 0x20, 0x84, +0x45, 0xAC, 0x82, 0xA4, 0x44, 0xDD, 0x47, 0xAC, +0x5A, 0x81, 0x10, 0x50, 0x91, 0x9E, 0xD9, 0x9E, +0xD9, 0x96, 0x0B, 0xA5, 0xC6, 0xAC, 0x91, 0x96, +0x08, 0x00, 0x20, 0x12, 0x0E, 0xA5, 0x13, 0xC4, +0x4F, 0xA4, 0x09, 0xCC, 0x21, 0x84, 0x04, 0xC9, +0x0C, 0xD5, 0x45, 0xAC, 0xC6, 0xAC, 0xD9, 0x9E, +0x4F, 0xA4, 0x09, 0xD5, 0x21, 0x84, 0x04, 0xC9, +0x04, 0xD5, 0x47, 0xAC, 0x20, 0x12, 0x91, 0x9E, +0x80, 0xFC, 0x08, 0x00, 0xB0, 0xEA, 0x43, 0xFC, +0xC6, 0x0B, 0x08, 0x3C, 0x85, 0xA4, 0x43, 0xEA, +0x02, 0x00, 0x90, 0x02, 0x86, 0xA4, 0x83, 0xF2, +0xC7, 0x0B, 0xA0, 0x3C, 0x87, 0xA4, 0x84, 0xF2, +0x08, 0x00, 0x00, 0x02, 0x85, 0xF0, 0x03, 0xF1, +0x02, 0x80, 0x6E, 0xEA, 0x73, 0x84, 0x04, 0x42, +0x80, 0x40, 0x82, 0xF2, 0xE0, 0x80, 0x13, 0x00, +0x5F, 0x44, 0xC0, 0x84, 0xE8, 0x3F, 0x00, 0x80, +0x16, 0xD5, 0xCC, 0x09, 0x11, 0x09, 0x0F, 0x38, +0x04, 0xE8, 0xA0, 0xE0, 0x11, 0x09, 0x5F, 0x38, +0xD9, 0x9C, 0x43, 0x81, 0xD9, 0x96, 0x21, 0x9D, +0x02, 0xF1, 0x91, 0x9C, 0x05, 0xF1, 0x21, 0x98, +0xF1, 0xE8, 0x20, 0xE0, 0xB1, 0x9D, 0x01, 0xF2, +0x3D, 0xEA, 0x02, 0x89, 0x03, 0xF1, 0xE9, 0x88, +0x31, 0x98, 0x04, 0xF2, 0x05, 0xE9, 0x40, 0xE0, +0x68, 0x80, 0x47, 0x80, 0xEE, 0xD5, 0x80, 0x84, +0x20, 0x22, 0x56, 0xDD, 0x50, 0x12, 0x0A, 0x00, +0xA0, 0x12, 0x08, 0x00, 0x45, 0xE0, 0x09, 0x00, +0x50, 0x12, 0x03, 0xE8, 0xC3, 0xFC, 0x0A, 0x00, +0x8F, 0x2E, 0x40, 0xFC, 0x01, 0x9D, 0xAF, 0xFF, +0x0C, 0xFF, 0x34, 0xFA, 0xA4, 0x50, 0x5D, 0xDD, +0x21, 0x99, 0xFF, 0x7F, 0x11, 0xD5, 0xE0, 0x80, +0x03, 0x3A, 0xC4, 0x80, 0x52, 0x50, 0x04, 0x0C, +0xF9, 0x9D, 0xDC, 0x7F, 0x24, 0x00, 0x42, 0x50, +0x24, 0x8C, 0x02, 0x3A, 0x04, 0x0C, 0x03, 0x3A, +0x24, 0x8C, 0x02, 0x3A, 0xC5, 0xB6, 0xC6, 0xB4, +0xEF, 0xE9, 0xEA, 0xE0, 0xFF, 0x7F, 0x14, 0x50, +0x00, 0x46, 0x4A, 0x96, 0x88, 0xEA, 0x80, 0x00, +0x04, 0x00, 0x14, 0x4E, 0x88, 0xEA, 0x20, 0x84, +0x41, 0xFC, 0xC0, 0xFC, 0x0B, 0x3C, 0x00, 0x84, +0x0B, 0x3C, 0xE0, 0xFF, 0x20, 0x2E, 0xDD, 0xFF, +0x28, 0x5A, 0x84, 0x0C, 0x20, 0x3C, 0x04, 0x01, +0x40, 0x84, 0x0F, 0x0C, 0x64, 0x07, 0x08, 0x3C, +0x02, 0x81, 0x42, 0x81, 0x5F, 0xB6, 0x81, 0xF2, +0x90, 0x00, 0x00, 0x48, 0x15, 0x42, 0x14, 0xFA, +0x86, 0xEA, 0x24, 0x00, 0x20, 0x3C, 0x4A, 0x98, +0x4B, 0xA0, 0x64, 0x07, 0x07, 0xE8, 0x22, 0xE0, +0xA4, 0xEA, 0x0A, 0x80, 0x12, 0x4E, 0x5E, 0xDD, +0x41, 0x8F, 0x85, 0x00, 0x15, 0x42, 0x54, 0xFA, +0x82, 0xEA, 0x24, 0x08, 0x28, 0x8C, 0x4B, 0x98, +0xD1, 0x9C, 0x89, 0xA6, 0x5A, 0x9B, 0x88, 0xA6, +0x4A, 0xA6, 0x8B, 0xA6, 0x99, 0x9A, 0xD1, 0x9C, +0x24, 0x14, 0x71, 0x42, 0x04, 0xE8, 0x45, 0xE0, +0x76, 0x88, 0x12, 0x40, 0x11, 0x40, 0x03, 0xD5, +0xC9, 0x96, 0x76, 0x14, 0xDD, 0xFF, 0x13, 0x3C, +0x03, 0xE8, 0x23, 0xE2, 0xDD, 0xFF, 0x3B, 0x3C, +0x15, 0x42, 0x74, 0xFA, 0x25, 0xEA, 0x24, 0x0C, +0x8B, 0xA1, 0x48, 0x98, 0x0C, 0x0C, 0x14, 0x3C, +0x1D, 0xE8, 0xC1, 0xE0, 0x66, 0x96, 0xC5, 0xEA, +0x10, 0x3C, 0x53, 0xC1, 0x0C, 0xC9, 0xC1, 0x08, +0x24, 0x0C, 0x14, 0x3C, 0x0C, 0xE8, 0xA1, 0xE0, +0x24, 0x0C, 0x14, 0x3C, 0x08, 0xE8, 0x41, 0xE0, +0x06, 0x0C, 0x14, 0x3C, 0x14, 0x3C, 0x03, 0xD5, +0xE1, 0xE0, 0xC8, 0x0D, 0x01, 0xF0, 0x41, 0xE9, +0x01, 0x9C, 0x21, 0x84, 0x10, 0x3E, 0x81, 0xF0, +0x3A, 0xD5, 0x84, 0x0C, 0x6E, 0x96, 0xC5, 0xEA, +0x10, 0x2E, 0x37, 0xC1, 0x05, 0xC1, 0x6E, 0x0C, +0x0A, 0x0C, 0x14, 0x3C, 0x03, 0xD5, 0x21, 0x90, +0x0A, 0x0C, 0x10, 0x3C, 0x13, 0x3C, 0x09, 0x96, +0x27, 0xE0, 0xE0, 0xFF, 0x7B, 0x3C, 0x03, 0xE8, +0x10, 0x3C, 0xE0, 0xFF, 0x27, 0xE0, 0x6E, 0x07, +0x4A, 0xDD, 0x04, 0xE8, 0x67, 0x00, 0x00, 0x48, +0x3F, 0x0C, 0x14, 0x3C, 0x05, 0xE8, 0xA1, 0xE0, +0x3F, 0x0C, 0x14, 0x3C, 0x05, 0xE9, 0x41, 0xE0, +0x01, 0x9C, 0x1F, 0xB4, 0x10, 0xD5, 0x1F, 0xB6, +0x12, 0xE9, 0xE0, 0xE0, 0xB1, 0xEA, 0x5F, 0xB4, +0x66, 0x96, 0x91, 0x9C, 0x05, 0xC1, 0x5F, 0xB6, +0x10, 0x3E, 0x21, 0x84, 0x04, 0xD5, 0x6F, 0x0C, +0x10, 0x3E, 0x21, 0x84, 0x06, 0xE1, 0x70, 0x0C, +0x83, 0x40, 0x03, 0xE8, 0x41, 0x8D, 0x11, 0x00, +0x41, 0xE1, 0x5E, 0xDD, 0x70, 0xFF, 0xF3, 0x4E, +0x30, 0x22, 0x41, 0xDD, 0x48, 0x80, 0x46, 0x00, +0x5A, 0xEA, 0xD4, 0xFE, 0x56, 0x88, 0x31, 0x40, +0x38, 0x3C, 0x1F, 0xB5, 0x20, 0x22, 0x65, 0x07, +0x42, 0xE4, 0xEA, 0x00, 0x20, 0x22, 0x0C, 0xE9, +0x03, 0x3C, 0xEA, 0x00, 0x40, 0xE0, 0xDD, 0xFF, +0x41, 0x84, 0x06, 0xE8, 0x20, 0x3E, 0x01, 0x8D, +0x03, 0xD5, 0x6D, 0x0C, 0x32, 0x00, 0x82, 0x4E, +0x00, 0x50, 0x41, 0xDD, 0x87, 0xA4, 0x6E, 0x00, +0x04, 0xC2, 0x90, 0x96, 0x48, 0x92, 0x87, 0xA4, +0x03, 0xE5, 0x0B, 0xCA, 0x0C, 0xD5, 0x02, 0xE9, +0x03, 0x84, 0x01, 0xF3, 0x00, 0x0C, 0x14, 0x40, +0x07, 0x04, 0x10, 0x40, 0x87, 0xA4, 0x10, 0xD5, +0x02, 0xE1, 0x90, 0x96, 0x21, 0x84, 0x03, 0xE9, +0x07, 0xA4, 0x0A, 0xD5, 0x14, 0x40, 0x01, 0xF2, +0x08, 0x92, 0x00, 0x08, 0x07, 0x80, 0x10, 0x40, +0x01, 0x80, 0x10, 0x56, 0x4A, 0xDD, 0x48, 0x96, +0x21, 0x84, 0x05, 0xC1, 0x44, 0xAE, 0x41, 0xAE, +0x20, 0x3C, 0x08, 0xD5, 0x21, 0x84, 0xBA, 0x0C, +0x41, 0xAE, 0xA6, 0x96, 0x43, 0xAE, 0x02, 0xC2, +0x44, 0xFC, 0xC1, 0xFC, 0x39, 0xEA, 0x56, 0xDD, +0xFF, 0x83, 0x46, 0xAC, 0x00, 0x80, 0x1F, 0x44, +0x5B, 0xDD, 0x45, 0xAC, 0x49, 0x00, 0x10, 0x3C, +0x86, 0xF1, 0x82, 0xF2, 0x07, 0xA4, 0x93, 0xEA, +0x85, 0xF2, 0x96, 0x96, 0x06, 0xF2, 0x8A, 0xEA, +0x00, 0x88, 0x10, 0x54, 0x91, 0x9C, 0x83, 0xF0, +0x84, 0xF1, 0xB0, 0xEA, 0x39, 0xEA, 0x81, 0xF0, +0xA8, 0x3E, 0xC0, 0x87, 0x87, 0xF2, 0xDC, 0x14, +0xCC, 0x09, 0x98, 0x3E, 0x51, 0xEA, 0x64, 0xD5, +0x0A, 0x00, 0x04, 0x4E, 0x20, 0xEA, 0x51, 0xEA, +0x05, 0xE8, 0xA0, 0xE0, 0x11, 0x1D, 0x55, 0x38, +0x6B, 0x97, 0xC0, 0xEA, 0x07, 0x4E, 0x51, 0xEA, +0x51, 0xEA, 0x07, 0x00, 0x03, 0xE8, 0x40, 0xE0, +0x11, 0x1D, 0x25, 0x38, 0x01, 0x8D, 0x02, 0xF0, +0x06, 0xF0, 0xF8, 0x99, 0xE8, 0xE9, 0x00, 0xE1, +0x03, 0xC8, 0x05, 0xF0, 0x0A, 0xD5, 0x60, 0x80, +0x1B, 0x0C, 0x64, 0x3C, 0x24, 0x98, 0x32, 0x42, +0x64, 0x00, 0x60, 0x44, 0xD7, 0x98, 0x31, 0x40, +0x04, 0xF0, 0xDB, 0x96, 0x80, 0x80, 0x03, 0xC8, +0x44, 0x3C, 0x08, 0xD5, 0x9B, 0xEA, 0xBC, 0x0C, +0x42, 0x40, 0x14, 0xFF, 0x23, 0x97, 0xB7, 0x14, +0xBE, 0x80, 0xA2, 0xFE, 0xD3, 0x9A, 0xC1, 0x84, +0x4F, 0xEA, 0xE0, 0x84, 0x25, 0xD5, 0x01, 0x81, +0x01, 0x95, 0x24, 0x38, 0x93, 0x96, 0x9A, 0x98, +0x09, 0x95, 0x24, 0x38, 0x11, 0x95, 0x24, 0x38, +0x04, 0x00, 0x24, 0x4E, 0x09, 0x95, 0x74, 0x38, +0x11, 0x95, 0x24, 0x38, 0x02, 0xE0, 0x01, 0xF0, +0x14, 0x38, 0x06, 0xE8, 0xA9, 0x96, 0x11, 0x95, +0x83, 0xF2, 0x81, 0xF1, 0x11, 0x95, 0x14, 0x38, +0x04, 0xE8, 0x28, 0xE0, 0x11, 0x95, 0x04, 0x38, +0x04, 0x38, 0x00, 0x81, 0xB1, 0x9D, 0x11, 0x95, +0x09, 0x15, 0x02, 0x38, 0x68, 0x99, 0x02, 0xF0, +0x61, 0x4C, 0x07, 0xF2, 0x28, 0x80, 0xDB, 0x7F, +0x01, 0x00, 0xEF, 0x51, 0xFF, 0x40, 0x02, 0xF0, +0x06, 0xE8, 0x07, 0x00, 0xFE, 0x80, 0x40, 0x84, +0x02, 0x81, 0xA2, 0x80, 0x01, 0xF2, 0xAB, 0xD5, +0x85, 0xAC, 0x56, 0xDD, 0x46, 0xAC, 0x03, 0xF2, +0xC4, 0xFC, 0x87, 0xAC, 0xA4, 0x3C, 0x55, 0xFC, +0x55, 0xDD, 0x28, 0x0C, 0x02, 0x4E, 0x36, 0x96, +0x43, 0xEA, 0x06, 0x01, 0xE0, 0x03, 0x45, 0xA4, +0x87, 0xF1, 0x07, 0x00, 0x07, 0xF3, 0x82, 0xA4, +0x11, 0x42, 0x3E, 0x80, 0x82, 0xF2, 0x73, 0x0C, +0x00, 0x02, 0x86, 0xA4, 0x91, 0xF2, 0x08, 0x00, +0xC3, 0x9E, 0x1F, 0xB6, 0x02, 0x9E, 0x5F, 0xB4, +0x94, 0xF0, 0x97, 0xF3, 0x00, 0xF8, 0x30, 0x40, +0x91, 0x9E, 0x1F, 0xB4, 0x1C, 0xB1, 0x81, 0xF3, +0x08, 0x08, 0x3F, 0x40, 0x93, 0xF2, 0xE3, 0x98, +0xF7, 0x7F, 0x20, 0x50, 0x00, 0x04, 0x81, 0x40, +0x8B, 0xF3, 0x8C, 0x9D, 0x2F, 0x50, 0x20, 0x84, +0x3F, 0x50, 0x01, 0x00, 0x83, 0xF1, 0x02, 0x00, +0x9B, 0xF3, 0x9A, 0xF2, 0xA5, 0x00, 0x00, 0x48, +0x06, 0x40, 0x0F, 0x4C, 0x58, 0x3E, 0x32, 0x9E, +0x17, 0xD5, 0xCC, 0x09, 0x00, 0x4C, 0x1A, 0xF1, +0x23, 0xEA, 0x0F, 0xC0, 0x08, 0xF2, 0x31, 0x9E, +0x12, 0x38, 0x95, 0xEA, 0x01, 0x80, 0x11, 0x09, +0x53, 0xEA, 0x09, 0xF1, 0x42, 0x38, 0x0A, 0xF1, +0x5B, 0xD5, 0x11, 0x05, 0x01, 0x4C, 0x1B, 0xF2, +0x0F, 0xF0, 0x11, 0x40, 0xCC, 0x09, 0x58, 0x3E, +0x32, 0x38, 0x32, 0x9D, 0x12, 0x38, 0x11, 0x81, +0x22, 0x38, 0x11, 0x99, 0x34, 0x9D, 0x11, 0x91, +0x42, 0x38, 0x01, 0x80, 0xEE, 0xD5, 0x11, 0x91, +0x00, 0x4C, 0x18, 0xF1, 0x19, 0xF2, 0x09, 0xC0, +0x32, 0x38, 0x23, 0xEA, 0x08, 0xF0, 0x11, 0x09, +0xDE, 0xD5, 0x96, 0xEA, 0x01, 0x4C, 0x17, 0xF2, +0x06, 0xF0, 0x0D, 0x40, 0x32, 0x38, 0x23, 0xEA, +0x96, 0xEA, 0x11, 0x21, 0x05, 0xF1, 0x01, 0x80, +0xFF, 0x83, 0x53, 0xEA, 0xD4, 0xD5, 0x15, 0xF1, +0x01, 0x4C, 0x14, 0xF2, 0x0E, 0xF0, 0x0D, 0x40, +0x23, 0xEA, 0x0D, 0xF2, 0x12, 0x38, 0x95, 0xEA, +0x01, 0x80, 0x11, 0x09, 0x53, 0xEA, 0x0C, 0xF1, +0xC6, 0xD5, 0x16, 0xF1, 0x01, 0x4C, 0x13, 0xF2, +0x00, 0x4E, 0x06, 0x40, 0x12, 0xF1, 0xE4, 0xFF, +0x5F, 0xB4, 0xBF, 0xD5, 0x7A, 0x9D, 0x23, 0xEA, +0x0C, 0x40, 0x01, 0x4C, 0x7A, 0x9E, 0x3C, 0x9E, +0x02, 0x38, 0x95, 0xEA, 0x22, 0x38, 0x11, 0x05, +0x42, 0x38, 0x11, 0x1D, 0xB2, 0xD5, 0x11, 0x15, +0x11, 0x1D, 0x32, 0x38, 0x11, 0x15, 0x12, 0x38, +0x7E, 0x9C, 0x01, 0x80, 0x13, 0x50, 0x53, 0xEA, +0x12, 0x38, 0x08, 0x80, 0x81, 0x80, 0x11, 0x05, +0x01, 0x28, 0x10, 0x42, 0x01, 0xA8, 0x31, 0x42, +0x21, 0x42, 0x0B, 0x98, 0x02, 0x98, 0x01, 0x28, +0x01, 0x28, 0x12, 0x42, 0x01, 0x98, 0x04, 0xF3, +0x19, 0xAA, 0x02, 0x90, 0x84, 0xF3, 0x21, 0x8D, +0x3F, 0xB4, 0xF9, 0x9D, 0x00, 0xF8, 0x04, 0x40, +0xF2, 0x4E, 0x20, 0xE0, 0x01, 0xF2, 0x7B, 0xFF, +0x23, 0xEA, 0x60, 0x84, 0x0A, 0xD5, 0x10, 0xF5, +0x01, 0x09, 0x12, 0x38, 0xD9, 0x9C, 0x29, 0xA2, +0x03, 0x96, 0x08, 0x9A, 0x09, 0x09, 0x02, 0x38, +0x3F, 0xB4, 0x91, 0x9C, 0x00, 0xF8, 0x01, 0x40, +0xF3, 0xE8, 0x20, 0xE0, 0x03, 0xF2, 0x02, 0xF0, +0x91, 0x9C, 0x01, 0xF3, 0x83, 0xF2, 0xD8, 0x98, +0xB0, 0x99, 0x81, 0xF3, 0x74, 0x9E, 0x00, 0x89, +0x07, 0xF3, 0x03, 0xF2, 0x11, 0xF1, 0x8F, 0xF1, +0x20, 0xE0, 0x13, 0x98, 0x24, 0x50, 0x2B, 0xE9, +0x34, 0x50, 0x02, 0x00, 0x04, 0x50, 0x04, 0x00, +0x86, 0xF2, 0x08, 0x00, 0x24, 0x50, 0x85, 0xF3, +0x34, 0x50, 0x01, 0x00, 0x14, 0x50, 0x03, 0x00, +0x95, 0xF0, 0x09, 0x00, 0x04, 0x50, 0x8E, 0xF2, +0x0B, 0xF2, 0x05, 0x00, 0x01, 0xF3, 0x8D, 0xF3, +0x8C, 0xF0, 0x96, 0xF1, 0x06, 0x00, 0x14, 0x50, +0x03, 0x00, 0x0F, 0x50, 0x90, 0xF2, 0x92, 0xF1, +0x84, 0xF2, 0xDC, 0x9F, 0x73, 0x9E, 0x98, 0xF0, +0xF3, 0x9C, 0xB1, 0x9C, 0x20, 0x85, 0x35, 0x9C, +0x88, 0xF2, 0x99, 0xF1, 0x8A, 0xF0, 0x89, 0xF3, +0xD5, 0xFC, 0xAD, 0xD5, 0x90, 0x3C, 0x44, 0xFC, +0x0C, 0x84, 0x4A, 0x00, 0xE0, 0x84, 0x30, 0xEA, +0x0D, 0x84, 0x86, 0xF0, 0xA6, 0xEA, 0x30, 0xEA, +0x0E, 0x84, 0x85, 0xF0, 0xE0, 0x45, 0x30, 0xEA, +0x84, 0xF0, 0x1E, 0x00, 0x30, 0xEA, 0x0F, 0x84, +0x64, 0x00, 0xA0, 0x44, 0x04, 0x40, 0x83, 0xF0, +0x82, 0xF0, 0x08, 0x90, 0x30, 0xEA, 0x01, 0xFA, +0x07, 0x80, 0x9F, 0x14, 0x35, 0xD5, 0x81, 0xF0, +0x39, 0x98, 0x06, 0xF1, 0x11, 0x01, 0x44, 0x38, +0x78, 0x98, 0x05, 0xF0, 0x54, 0x38, 0x04, 0xF0, +0x78, 0x98, 0x11, 0x05, 0x11, 0x05, 0x34, 0x38, +0x24, 0xF8, 0x52, 0x42, 0x24, 0x78, 0x42, 0x42, +0x24, 0xF8, 0x31, 0x42, 0xD6, 0xA8, 0x52, 0x40, +0x78, 0x98, 0x03, 0xF0, 0x11, 0x05, 0x94, 0x38, +0x78, 0x98, 0x02, 0xF0, 0x01, 0x05, 0x24, 0x38, +0xD6, 0x28, 0x42, 0x40, 0xD6, 0xA8, 0x31, 0x40, +0x23, 0x98, 0x2C, 0x99, 0x95, 0x9A, 0x41, 0x97, +0x24, 0x38, 0x93, 0x96, 0x01, 0xF1, 0x09, 0x05, +0x39, 0x99, 0x04, 0x84, 0x76, 0x80, 0x14, 0x40, +0x11, 0x11, 0x24, 0x38, 0x11, 0x9A, 0xF9, 0x9D, +0x03, 0x96, 0x05, 0x9A, 0x09, 0x11, 0x04, 0x38, +0xE1, 0xE0, 0x07, 0xF1, 0xC4, 0xFC, 0xCA, 0xE9, +0x24, 0x3C, 0x41, 0xFC, 0xE0, 0x2F, 0xB2, 0x10, +0x38, 0x3E, 0x70, 0x21, 0x20, 0x84, 0x88, 0x21, +0x00, 0x96, 0x81, 0xF2, 0x20, 0x80, 0x21, 0x50, +0xE1, 0x80, 0xC1, 0x80, 0x3F, 0x85, 0x41, 0x81, +0x38, 0x00, 0x80, 0x44, 0x16, 0xCC, 0x01, 0xF4, +0x15, 0x00, 0xE3, 0x4F, 0x24, 0xA0, 0x40, 0x42, +0x74, 0x21, 0x58, 0x3E, 0x24, 0xA7, 0x25, 0x99, +0x0C, 0xC5, 0x64, 0x97, 0x0B, 0x18, 0x42, 0x42, +0x10, 0xA5, 0x09, 0xC4, 0x23, 0x97, 0x21, 0x9F, +0x47, 0x4E, 0x10, 0xAD, 0xB1, 0x9D, 0x04, 0x00, +0x71, 0x10, 0x08, 0xD5, 0xD8, 0xAF, 0xD0, 0x7F, +0x00, 0x00, 0xA1, 0x12, 0x01, 0x80, 0x91, 0x10, +0x31, 0x50, 0x49, 0x9C, 0x21, 0x50, 0x38, 0x80, +0x18, 0x5A, 0x38, 0x00, 0x05, 0xC6, 0xDD, 0x0F, +0x67, 0x3E, 0x80, 0xEA, 0x41, 0xD5, 0xA6, 0xFF, +0xA4, 0xFF, 0x67, 0x3E, 0xB3, 0xFF, 0x67, 0x3E, +0xAF, 0xFF, 0x67, 0x3E, 0x63, 0x04, 0x6E, 0x3C, +0x1D, 0x03, 0x6E, 0x3C, 0x17, 0x00, 0x6E, 0x3C, +0x13, 0x00, 0x6E, 0x3C, 0xAE, 0xFF, 0x67, 0x3E, +0xA6, 0xFF, 0x67, 0x3E, 0x07, 0x3E, 0x0C, 0xC8, +0x2C, 0xEA, 0xB4, 0xFF, 0x40, 0xA4, 0xC6, 0xA4, +0x11, 0x42, 0x43, 0x84, 0x22, 0x92, 0x73, 0x88, +0x04, 0xD5, 0x46, 0xAC, 0x07, 0x3E, 0x02, 0x84, +0x80, 0xEA, 0xB4, 0xFF, 0x17, 0x4E, 0x42, 0xEA, +0x49, 0x9E, 0x04, 0x00, 0x42, 0xEA, 0x40, 0xEA, +0x04, 0x00, 0x14, 0x4E, 0x40, 0xEA, 0x49, 0x9C, +0xE4, 0xFF, 0x07, 0x3C, 0x0B, 0x3C, 0x03, 0xC8, +0x5C, 0xEA, 0xE5, 0xFF, 0x20, 0x84, 0xB4, 0xEA, +0x98, 0xFF, 0x17, 0x3E, 0x0B, 0x3C, 0x00, 0x84, +0x0B, 0x3C, 0xDF, 0xFF, 0x0B, 0x3C, 0xDE, 0xFF, +0x00, 0x3E, 0xE1, 0xFF, 0xC0, 0x84, 0x8C, 0x0C, +0xC1, 0xFC, 0x06, 0x80, 0x41, 0xDD, 0x20, 0xFC, +0x30, 0x02, 0x00, 0x50, 0xFF, 0x7E, 0x20, 0x02, +0x0C, 0x00, 0x18, 0x3E, 0x85, 0xA4, 0x88, 0xAC, +0x89, 0xAC, 0xE0, 0x84, 0x07, 0xA4, 0x86, 0xA4, +0x0B, 0xAC, 0x8A, 0xAC, 0x88, 0x21, 0x08, 0x3E, +0x48, 0x03, 0x30, 0x50, 0x5F, 0x84, 0x20, 0x84, +0xF0, 0x7F, 0x10, 0x10, 0x70, 0x12, 0x40, 0xAE, +0x81, 0xAE, 0x10, 0x00, 0x01, 0x4C, 0x4E, 0xEA, +0x7B, 0x3C, 0xF9, 0xFF, 0x10, 0x3C, 0xEC, 0xFF, +0x00, 0x3C, 0x2A, 0x0C, 0x98, 0xEA, 0x2B, 0x0C, +0x0C, 0xFE, 0x32, 0xAC, 0x01, 0x96, 0x71, 0xAC, +0xE3, 0xFF, 0x0B, 0x3C, 0xC6, 0xF9, 0x30, 0xAC, +0x75, 0xA4, 0x36, 0xA4, 0x33, 0xAC, 0x05, 0xF8, +0x08, 0x00, 0x03, 0x02, 0x01, 0x9C, 0x77, 0xA4, +0x07, 0x94, 0x01, 0x9A, 0x34, 0xAC, 0xFF, 0x83, +0xCA, 0x0D, 0x78, 0x3C, 0x4A, 0xEA, 0x00, 0x84, +0x45, 0x0C, 0x14, 0x3C, 0xA5, 0xFF, 0x77, 0x3E, +0xEE, 0xFF, 0x7B, 0x3C, 0x16, 0x4E, 0x9D, 0xEA, +0x21, 0x84, 0x04, 0x00, 0x00, 0x84, 0x9D, 0xEA, +0x70, 0x21, 0x00, 0x3E, 0x6C, 0x0C, 0x18, 0x3E, +0x00, 0x10, 0x0A, 0xAE, 0x0C, 0xAE, 0x19, 0x80, +0x20, 0x84, 0x0B, 0xAE, 0x9A, 0xFF, 0x17, 0x3E, +0x56, 0x00, 0x00, 0x3E, 0x2A, 0x00, 0x18, 0x3C, +0x9D, 0xFF, 0x07, 0x3E, 0x07, 0x3E, 0x8E, 0xEA, +0x28, 0x3E, 0x9F, 0xFF, 0x51, 0xAC, 0x80, 0x11, +0x18, 0x3C, 0x52, 0xAC, 0x11, 0x12, 0x5C, 0x07, +0x44, 0xDD, 0x08, 0x00, 0xF1, 0x80, 0x30, 0x02, +0xE9, 0xFF, 0x3B, 0x3C, 0x20, 0x00, 0x28, 0x3E, +0x40, 0x02, 0x62, 0x84, 0xD3, 0xAE, 0xB2, 0x80, +0xBF, 0x80, 0x30, 0x22, 0x10, 0xAE, 0x12, 0xAE, +0x31, 0x40, 0x4D, 0xDD, 0xE4, 0xFE, 0xB6, 0x80, +0x1C, 0x00, 0x38, 0x3C, 0xB2, 0x80, 0x30, 0x02, +0xBF, 0x80, 0x10, 0x22, 0x36, 0x80, 0x00, 0x40, +0x08, 0x3C, 0x1C, 0xFE, 0xA0, 0xFC, 0x1D, 0x00, +0x49, 0x97, 0x41, 0xFC, 0x0E, 0x3C, 0x80, 0x84, +0xD3, 0x96, 0x05, 0x00, 0x4B, 0x3C, 0x43, 0xEA, +0x4B, 0x3C, 0xEF, 0xFF, 0x4B, 0x3C, 0xF1, 0xFF, +0x85, 0xA5, 0xF3, 0xFF, 0x87, 0xA4, 0x06, 0xA5, +0x08, 0x00, 0x10, 0x02, 0x21, 0x00, 0x37, 0x4E, +0x00, 0x80, 0x6F, 0x10, 0x02, 0x80, 0x2F, 0x10, +0x03, 0x80, 0x1F, 0x10, 0x01, 0x80, 0x4F, 0x10, +0x1F, 0xB4, 0x81, 0xB1, 0x45, 0x80, 0x26, 0x80, +0xAD, 0x08, 0x00, 0x49, 0x70, 0xA6, 0x31, 0xA6, +0x01, 0x9A, 0x01, 0x9C, 0xB2, 0xA6, 0x73, 0xA6, +0x4A, 0x9A, 0x49, 0x9C, 0x49, 0x96, 0x01, 0x96, +0xEF, 0xFF, 0x0B, 0x3C, 0x1B, 0x3C, 0x0C, 0xFE, +0x0B, 0x3C, 0xF1, 0xFF, 0xC1, 0xFC, 0xF3, 0xFF, +0xA9, 0xEA, 0x00, 0xFC, 0x20, 0x22, 0x41, 0xDD, +0x22, 0xE0, 0x26, 0x00, 0x93, 0xEA, 0x3C, 0xE9, +0x00, 0x20, 0x21, 0x54, 0x20, 0x02, 0x38, 0xC2, +0x04, 0xCA, 0x50, 0x00, 0x56, 0x07, 0x24, 0x3C, +0x20, 0x22, 0x08, 0xD5, 0x4D, 0xDD, 0x50, 0x00, +0x21, 0x40, 0x8C, 0xFE, 0x93, 0x96, 0x16, 0x00, +0x56, 0x07, 0x00, 0x3C, 0x02, 0xE8, 0x40, 0xE0, +0x10, 0x3C, 0x83, 0x96, 0x38, 0xEA, 0xC7, 0x0B, +0xAC, 0xFF, 0xFF, 0x49, 0x10, 0x22, 0x41, 0xDD, +0x23, 0x3C, 0x31, 0x00, 0x41, 0xE0, 0xEF, 0xFF, +0x10, 0x22, 0x0D, 0xE8, 0x23, 0x3C, 0x32, 0x00, +0x41, 0xE0, 0xF1, 0xFF, 0x00, 0x22, 0x07, 0xE8, +0x13, 0x3C, 0x36, 0x00, 0x20, 0xE0, 0xF3, 0xFF, +0x14, 0x3C, 0x0E, 0xE9, 0xF0, 0x46, 0x11, 0x0C, +0x04, 0x3C, 0x81, 0x00, 0x44, 0xFE, 0xC6, 0x0B, +0xFF, 0x83, 0x4D, 0xDD, 0x16, 0x80, 0x10, 0x40, +0x63, 0x07, 0x18, 0x3C, 0x00, 0xFC, 0x80, 0xFC, +0x4C, 0xDD, 0x80, 0x97, 0x4A, 0xEA, 0x06, 0x80, +0x2E, 0x00, 0x06, 0x4E, 0x93, 0x04, 0x00, 0x49, +0x17, 0x3E, 0x20, 0x84, 0x04, 0x3C, 0xA6, 0xFF, +0x14, 0x3C, 0xAD, 0x0C, 0x20, 0xE0, 0xC8, 0x0B, +0x02, 0xE9, 0xFF, 0x83, 0x20, 0x84, 0x38, 0xF9, +0x4A, 0xDD, 0xB4, 0xEA, 0x14, 0xC1, 0x42, 0xA6, +0x66, 0x96, 0xB1, 0xEA, 0x44, 0xA6, 0x0B, 0xC1, +0x00, 0x4E, 0x04, 0xC1, 0x05, 0xD5, 0x29, 0x04, +0x04, 0xC0, 0x03, 0xA6, 0x2C, 0x04, 0x00, 0x4E, +0x10, 0x3C, 0x40, 0xAC, 0x8E, 0xEA, 0x0B, 0x0C, +0x10, 0x3E, 0x20, 0x84, 0x4A, 0xDD, 0x6E, 0x0C, +0x44, 0xAE, 0x20, 0x84, 0x10, 0x10, 0x43, 0xAE, +0x43, 0xA8, 0x19, 0x00, 0x40, 0xFC, 0x80, 0xFC, +0x20, 0x84, 0x45, 0xDD, 0x18, 0x3C, 0xC0, 0x96, +0x10, 0x3E, 0xCA, 0x0D, 0x88, 0xEA, 0x96, 0x1B, +0x6D, 0x0C, 0x10, 0x3E, 0x84, 0x0C, 0x10, 0x3E, +0xEF, 0xFF, 0x1B, 0x3C, 0xF1, 0xFF, 0x1B, 0x3C, +0xF3, 0xFF, 0x1B, 0x3C, 0xAB, 0xFF, 0x17, 0x3E, +0x64, 0x21, 0x28, 0x3E, 0xC6, 0x0B, 0x18, 0x3C, +0x00, 0x00, 0x01, 0x22, 0xAC, 0x0E, 0x68, 0x3E, +0x0D, 0x00, 0x13, 0x12, 0x0E, 0x00, 0x13, 0x12, +0x0F, 0x00, 0x13, 0x12, 0x05, 0x00, 0x06, 0x4E, +0x0C, 0x00, 0x01, 0x00, 0x01, 0x84, 0x12, 0xC0, +0xE1, 0x85, 0x1A, 0xF8, 0xF6, 0xC3, 0x07, 0x4C, +0x60, 0x3E, 0xC0, 0x84, 0x00, 0x84, 0x70, 0x21, +0x4A, 0xDD, 0x4A, 0xEA, 0x84, 0xAF, 0x82, 0xAF, +0x60, 0x10, 0x83, 0xAF, 0x5A, 0xDD, 0x19, 0x00, +0x57, 0x3E, 0xA1, 0x84, 0x07, 0xCB, 0xA0, 0xFF, +0x52, 0xAC, 0xD1, 0xAC, 0x54, 0xAC, 0x53, 0xAC, +0x5A, 0xDD, 0x55, 0xAC, 0xDF, 0x03, 0x00, 0x49, +0x07, 0x4C, 0xE1, 0x85, 0x37, 0x2E, 0xDB, 0x83, +0x30, 0x5A, 0xB4, 0xFF, 0x38, 0x5A, 0x04, 0x01, +0x47, 0xDD, 0x24, 0x03, 0x77, 0xA4, 0x5B, 0xEA, +0x54, 0xDD, 0x0C, 0xFF, 0x53, 0x02, 0x84, 0xEA, +0x30, 0xAD, 0x08, 0x00, 0x2C, 0xFF, 0x5B, 0xEA, +0xFF, 0x83, 0x84, 0xEA, 0x09, 0x00, 0x53, 0x02, +0x00, 0x4E, 0x31, 0xAD, 0x53, 0x02, 0xF9, 0xFF, +0x32, 0xAD, 0x0A, 0x00, 0x21, 0x22, 0x5B, 0xEA, +0x2C, 0xFF, 0x3D, 0x00, 0x33, 0xAD, 0x84, 0xEA, +0x0B, 0x00, 0x43, 0x02, 0x11, 0x40, 0xA4, 0xFE, +0x74, 0xAC, 0x57, 0x04, 0x37, 0xA4, 0x0F, 0xD5, +0x08, 0x00, 0x13, 0x02, 0x71, 0xAC, 0x30, 0xAC, +0x09, 0x00, 0x23, 0x02, 0x0A, 0x00, 0x03, 0x02, +0x0B, 0x00, 0x13, 0x02, 0x33, 0xAC, 0xB2, 0xAC, +0x14, 0x3C, 0x74, 0xAC, 0x17, 0x4E, 0xC9, 0x0B, +0x41, 0xDD, 0x2C, 0x00, 0x5A, 0x01, 0x00, 0x50, +0x03, 0x00, 0x20, 0x22, 0x25, 0x00, 0x27, 0x4E, +0x43, 0x00, 0x20, 0x22, 0x21, 0x00, 0x24, 0x4E, +0x90, 0x96, 0x9A, 0x9E, 0x1C, 0xE8, 0x42, 0xE6, +0x0E, 0xCA, 0x86, 0xA4, 0x06, 0x80, 0x87, 0xA4, +0x81, 0xA4, 0x06, 0xCA, 0x14, 0xE8, 0x41, 0xE0, +0x12, 0xD5, 0x41, 0xAC, 0x41, 0xE0, 0x83, 0xA4, +0x43, 0xAC, 0x0F, 0xE8, 0x87, 0xA4, 0x0D, 0xD5, +0x06, 0xCA, 0x06, 0x80, 0x41, 0xE0, 0x84, 0xA4, +0x44, 0xAC, 0x07, 0xE8, 0x82, 0xA4, 0x05, 0xD5, +0x02, 0xE8, 0x41, 0xE0, 0x06, 0x80, 0x42, 0xAC, +0x0C, 0x00, 0x10, 0x02, 0xD8, 0x96, 0xDA, 0x9E, +0x62, 0xE6, 0x45, 0xAC, 0x24, 0x3C, 0x08, 0xE8, +0x54, 0xFE, 0x07, 0x0C, 0x10, 0x40, 0x5A, 0xEA, +0x45, 0xAC, 0x57, 0x88, 0x03, 0x3C, 0x75, 0xA4, +0x01, 0x98, 0xEB, 0xFF, 0xFF, 0x49, 0x35, 0xAC, +0xFF, 0x49, 0xC0, 0xF9, 0xB5, 0xEA, 0x0B, 0xFA, +0xA3, 0xF8, 0xFF, 0x49, 0x34, 0xFD, 0xFF, 0x49, +0x26, 0xFC, 0xFF, 0x49, 0x8F, 0xFB, 0xFF, 0x49, +0x18, 0x3E, 0x78, 0xEA, 0xFF, 0x49, 0xCC, 0x09, +0x36, 0xA4, 0xF3, 0xF8, 0x20, 0xE2, 0x70, 0xA4, +0x30, 0xAC, 0x02, 0xE8, 0x46, 0xA4, 0x2C, 0xEA, +0x41, 0xE2, 0x85, 0xA4, 0x45, 0xAC, 0x02, 0xE8, +0x80, 0x00, 0x10, 0x46, 0xE2, 0xFF, 0x07, 0x3C, +0x2B, 0x3C, 0x81, 0x9E, 0x07, 0x4E, 0xE2, 0xFF, +0x04, 0x3C, 0x0E, 0x00, 0x20, 0x3C, 0xC3, 0x0B, +0x40, 0xE0, 0x56, 0x07, 0xF0, 0x02, 0xF3, 0x4E, +0x20, 0xE0, 0xB7, 0xEA, 0x00, 0x48, 0x03, 0xE8, +0x20, 0x84, 0xEB, 0x02, 0x04, 0x3C, 0x8E, 0xEA, +0x20, 0x3C, 0xC3, 0x0B, 0x02, 0xE0, 0x56, 0x07, +0xB7, 0xEA, 0x2B, 0xE8, 0x28, 0xE8, 0x01, 0xE0, +0x5E, 0xDD, 0x7D, 0xEA, 0xFF, 0x83, 0x20, 0xE0, +0x07, 0x4E, 0x06, 0xE8, 0xF2, 0xF8, 0x05, 0x00, +0x4A, 0xF9, 0x02, 0xE8, 0x7D, 0xEA, 0xFB, 0xF8, +0x08, 0x00, 0x07, 0x4E, 0x05, 0xC0, 0x4B, 0xDD, +0xB8, 0x02, 0x00, 0x4E, 0x40, 0xF9, 0x02, 0xE8, +0x17, 0x3E, 0x20, 0x84, 0x00, 0x4E, 0xA1, 0xFF, +0x06, 0xE9, 0xC4, 0xFE, 0xF0, 0x46, 0x20, 0x84, +0x40, 0xEA, 0x80, 0x00, 0x20, 0x84, 0xFF, 0x83, +0x70, 0x2E, 0xB4, 0xEA, 0x73, 0x4E, 0x6E, 0x0C, +0xC7, 0x80, 0xBB, 0x02, 0x24, 0x3C, 0xAD, 0xF8, +0x54, 0xDD, 0xEF, 0x0B, 0x2C, 0xEA, 0x84, 0xFE, +0x36, 0x04, 0x21, 0x40, 0x49, 0x98, 0x47, 0xA4, +0x86, 0xAC, 0x91, 0x96, 0x02, 0xE8, 0x22, 0xE0, +0xFF, 0x49, 0x46, 0xAC, 0x00, 0x49, 0xC1, 0xF9, +0xE0, 0x80, 0x8C, 0x03, 0x60, 0x3C, 0x11, 0xC0, +0xBE, 0x97, 0x08, 0x00, 0x01, 0x84, 0x03, 0xC6, +0x07, 0x2E, 0x0B, 0xD5, 0x02, 0x4E, 0x9D, 0xFF, +0x10, 0x3C, 0x9C, 0x02, 0x49, 0x98, 0xC6, 0x0B, +0xC6, 0x0B, 0x18, 0x3C, 0x24, 0x3C, 0x89, 0xF8, +0x5C, 0xEA, 0xC6, 0x0B, 0x02, 0xE9, 0x41, 0xE0, +0x60, 0x3C, 0x24, 0xC0, 0xBE, 0x97, 0x08, 0x00, +0x22, 0xF8, 0x1D, 0xC6, 0xF0, 0x0B, 0x34, 0x3C, +0xC6, 0x0B, 0x44, 0x3C, 0x10, 0xE8, 0x83, 0xE0, +0xAD, 0x0C, 0x24, 0x3C, 0xC8, 0x0B, 0x14, 0x3C, +0x47, 0x3E, 0x80, 0x84, 0x22, 0xE0, 0xA1, 0xFF, +0x40, 0x84, 0x04, 0xE9, 0xE4, 0xFF, 0x2B, 0x3C, +0x28, 0x3C, 0x40, 0x84, 0x05, 0xE4, 0xC8, 0x0B, +0xE4, 0x01, 0xF3, 0x4E, 0x00, 0x48, 0x30, 0xF8, +0xFF, 0x49, 0xE1, 0x01, 0x60, 0xF8, 0x1B, 0xFE, +0x3E, 0x96, 0x2B, 0xEA, 0x00, 0x49, 0x69, 0xC0, +0x24, 0x3C, 0x2E, 0x04, 0x34, 0x3C, 0xAD, 0x0C, +0x62, 0xE0, 0xC6, 0x0B, 0x20, 0x3C, 0x05, 0xE9, +0x2B, 0x3C, 0xB1, 0x0C, 0x05, 0x4E, 0xE4, 0xFF, +0x00, 0x49, 0x5C, 0x00, 0x05, 0xC8, 0x7D, 0x03, +0xED, 0x03, 0x00, 0x49, 0x55, 0x00, 0x07, 0x4E, +0xAE, 0x0C, 0x14, 0x3C, 0xC6, 0x0B, 0x04, 0x3C, +0x03, 0xE9, 0x20, 0xE0, 0x02, 0x04, 0x00, 0x49, +0xEB, 0xFF, 0x03, 0x3C, 0x10, 0x3C, 0x08, 0xC8, +0x20, 0x3C, 0x11, 0x0C, 0x4A, 0x98, 0x5B, 0x07, +0x5B, 0x07, 0x18, 0x3C, 0x11, 0x0C, 0x10, 0x3C, +0x80, 0x00, 0xF0, 0x46, 0xEB, 0xFF, 0x1B, 0x3C, +0x28, 0x2E, 0xFF, 0x83, 0x00, 0x84, 0xD0, 0x0E, +0x88, 0x21, 0x18, 0x3E, 0x38, 0x00, 0x40, 0x44, +0x50, 0x42, 0x60, 0x80, 0x68, 0x3E, 0x24, 0x10, +0x6E, 0x99, 0x74, 0x21, 0x6C, 0x97, 0x6C, 0xA7, +0x50, 0x20, 0x08, 0xC5, 0xA2, 0xE0, 0x00, 0x80, +0x88, 0xAE, 0x03, 0xE9, 0xC8, 0xAE, 0x02, 0xD5, +0x10, 0x50, 0x01, 0x9C, 0x08, 0x5A, 0x38, 0x80, +0x34, 0x3C, 0xEE, 0x0F, 0x00, 0x3C, 0xF2, 0x0B, +0xC2, 0xEA, 0xC2, 0x0B, 0x04, 0xE8, 0x60, 0xE0, +0x0D, 0xAC, 0x00, 0x84, 0x0D, 0xA4, 0x08, 0xD5, +0x18, 0x0C, 0x24, 0x3C, 0xCD, 0xAC, 0xC1, 0x9C, +0x04, 0xE9, 0x40, 0xE0, 0x00, 0x48, 0xC1, 0x84, +0x4C, 0xDD, 0x7E, 0x01, 0x05, 0xD5, 0xB6, 0xF8, +0x54, 0xEA, 0x99, 0xEA, 0xFF, 0x83, 0x01, 0x9C, +0xFB, 0xE9, 0x03, 0xE0, 0x00, 0x84, 0x5A, 0xDD, +0xB7, 0x10, 0x08, 0x3C, 0xEB, 0xFF, 0x0B, 0x3C, +0x00, 0x3C, 0xA9, 0xEA, 0x20, 0xE0, 0x56, 0x07, +0xF3, 0x4E, 0xFF, 0x83, 0x00, 0x49, 0x67, 0x01, +0x07, 0xC8, 0x31, 0x0E, 0xDF, 0xFF, 0x0B, 0x3C, +0x6D, 0x0C, 0x00, 0x2E, 0x60, 0xF8, 0x2D, 0xC8, +0x0C, 0xFF, 0x00, 0x4E, 0x07, 0x4E, 0x0F, 0xE8, +0x00, 0x46, 0x0E, 0x00, 0x13, 0x3C, 0x80, 0x00, +0x49, 0x9C, 0xDF, 0xFF, 0x1B, 0x3C, 0x4B, 0x96, +0x22, 0xE4, 0xDF, 0xFF, 0x02, 0xE8, 0xFF, 0x83, +0x20, 0x84, 0x4F, 0xF8, 0x80, 0x00, 0xF0, 0x46, +0xDF, 0xFF, 0x1B, 0x3C, 0x21, 0xEA, 0xFF, 0x83, +0x00, 0x84, 0xAA, 0xEA, 0xCC, 0x09, 0x18, 0x3E, +0x00, 0x4E, 0x03, 0xD5, 0x03, 0xE0, 0xC7, 0xFF, +0x00, 0x2E, 0xFD, 0xE9, 0x08, 0x5A, 0x6E, 0x0C, +0x29, 0xEA, 0x06, 0x01, 0x03, 0x4E, 0x26, 0x96, +0xFF, 0x49, 0xC5, 0x00, 0x55, 0xDD, 0x4C, 0xF9, +0x05, 0xC8, 0x26, 0x96, 0x85, 0x0C, 0x00, 0x3E, +0x84, 0x0C, 0x00, 0x3E, 0x2E, 0x96, 0x55, 0xDD, +0x18, 0x3E, 0x07, 0xC8, 0x0A, 0xAE, 0x6C, 0x0C, +0x0C, 0xAE, 0x09, 0xAE, 0x26, 0xEA, 0x0B, 0xAE, +0x0A, 0xC0, 0x26, 0x96, 0x02, 0xE6, 0x4B, 0xDD, +0x4A, 0xDD, 0x07, 0xE9, 0x42, 0xAE, 0x20, 0x84, +0x44, 0xAE, 0x41, 0xAE, 0x29, 0xEA, 0x43, 0xAE, +0x05, 0xC8, 0x26, 0x96, 0x70, 0x0C, 0x00, 0x3E, +0x6F, 0x0C, 0x00, 0x3E, 0x20, 0xB4, 0x4A, 0xDD, +0x30, 0x92, 0x60, 0xEA, 0x19, 0x5A, 0x60, 0xEA, +0x10, 0x3C, 0x27, 0x00, 0x0A, 0xC1, 0xC1, 0x08, +0x20, 0x00, 0x10, 0x00, 0x20, 0x10, 0x89, 0x9C, +0x23, 0xE6, 0x20, 0x00, 0x00, 0x48, 0x03, 0xE8, +0xC0, 0x80, 0x82, 0x01, 0x91, 0xEA, 0x00, 0x84, +0x08, 0x3C, 0x33, 0xA8, 0x29, 0xEA, 0xB5, 0x10, +0x04, 0xC0, 0x26, 0x96, 0x32, 0xAE, 0x01, 0x84, +0x07, 0x2E, 0x0E, 0xD5, 0x03, 0xC0, 0x9D, 0xFF, +0x02, 0xD5, 0x4C, 0xDD, 0x01, 0x84, 0x79, 0xF9, +0x4A, 0xDD, 0x32, 0xAE, 0x49, 0x9C, 0x42, 0xA0, +0x53, 0x01, 0x00, 0x48, 0x42, 0xA6, 0x4A, 0xDD, +0xB1, 0xEA, 0x59, 0xC1, 0x09, 0xC9, 0x66, 0x96, +0x07, 0xC9, 0x41, 0xA6, 0x18, 0x00, 0x00, 0x00, +0x48, 0xDD, 0x04, 0xC8, 0x65, 0x01, 0x02, 0x4E, +0xF2, 0x0B, 0x04, 0x3C, 0xC2, 0x0B, 0x30, 0x3C, +0x60, 0xE0, 0xC2, 0xEA, 0x0B, 0xA4, 0x17, 0xE8, +0x18, 0x0C, 0x24, 0x3C, 0xCB, 0xAC, 0xC1, 0x9C, +0x12, 0xE8, 0x40, 0xE0, 0x54, 0xF9, 0x00, 0x84, +0x80, 0x00, 0xF0, 0x46, 0x8C, 0xEA, 0x21, 0xEA, +0xA3, 0xEA, 0x00, 0x84, 0x03, 0xD5, 0xFF, 0x83, +0x44, 0xFF, 0x00, 0x4E, 0xFD, 0xE9, 0x03, 0xE0, +0x00, 0x84, 0x5A, 0xDD, 0x29, 0xEA, 0x0B, 0xAC, +0x6C, 0x0C, 0x68, 0x3E, 0x26, 0xC8, 0x26, 0x96, +0x3F, 0x46, 0x06, 0xB4, 0x31, 0x58, 0x0F, 0xF0, +0x1E, 0xFE, 0x00, 0x8F, 0x83, 0x00, 0x17, 0xC8, +0x83, 0x4E, 0x18, 0x00, 0x33, 0xA0, 0x14, 0x00, +0x12, 0x0C, 0x14, 0x3C, 0xB3, 0xA8, 0x81, 0x9C, +0x08, 0xE9, 0x01, 0xE0, 0x02, 0x00, 0x83, 0x10, +0x19, 0x00, 0x83, 0x10, 0x03, 0x00, 0x83, 0x14, +0x4C, 0xDD, 0x28, 0xD5, 0x19, 0x00, 0x83, 0x10, +0x00, 0x84, 0x05, 0xD5, 0x91, 0xEA, 0x33, 0xA8, +0x32, 0xA0, 0x4C, 0xDD, 0x32, 0xA8, 0x01, 0x9C, +0x00, 0x84, 0x5A, 0xDD, 0x03, 0x10, 0x91, 0xEA, +0x4A, 0xDD, 0x18, 0x00, 0x10, 0x10, 0x20, 0x84, +0x10, 0x02, 0x20, 0x00, 0x18, 0x5A, 0x0C, 0x00, +0x10, 0x10, 0x04, 0x01, 0x10, 0x00, 0x19, 0x00, +0x08, 0xC1, 0x19, 0x00, 0x06, 0xC9, 0x5E, 0xDD, +0x00, 0x00, 0x47, 0xA8, 0x02, 0x4E, 0x18, 0x00, +0x20, 0x84, 0x04, 0x01, 0x22, 0x03, 0x1E, 0x3C, +0x00, 0x54, 0x55, 0xDD, 0x24, 0xC8, 0x00, 0x40, +0x20, 0x02, 0x2C, 0xEA, 0x14, 0x3C, 0x10, 0x00, +0x54, 0xFE, 0xC3, 0x0B, 0x10, 0x40, 0x5A, 0xEA, +0x80, 0xA4, 0x56, 0x88, 0x02, 0xE8, 0x41, 0xE0, +0x48, 0xDD, 0x40, 0xAC, 0x15, 0x00, 0x07, 0x4E, +0x54, 0xFB, 0xC0, 0x84, 0xB8, 0xEA, 0x0E, 0xD5, +0x48, 0x98, 0x25, 0xEA, 0x00, 0x4E, 0x4B, 0xA0, +0x06, 0xE8, 0xEA, 0xFE, 0xA4, 0xEA, 0x06, 0x80, +0x06, 0xC0, 0x48, 0xDD, 0xB1, 0x9D, 0xB1, 0x9F, +0xC0, 0xE0, 0x48, 0xDD, 0x48, 0xDD, 0xF1, 0xE9, +0x31, 0xE9, 0x02, 0xE4, 0x67, 0x07, 0x90, 0x3C, +0x2E, 0x00, 0x92, 0x4E, 0x14, 0xFE, 0x54, 0xFA, +0x94, 0x0C, 0x18, 0x3E, 0x00, 0x84, 0x81, 0x98, +0x30, 0x0A, 0x05, 0xD5, 0x00, 0x42, 0x12, 0x80, +0x11, 0x4C, 0x00, 0x0C, 0x17, 0x2E, 0xFC, 0x7F, +0x04, 0xC1, 0xAB, 0xFF, 0x0A, 0x04, 0x90, 0x40, +0x90, 0x42, 0x06, 0xD5, 0x54, 0xDD, 0x24, 0x24, +0x36, 0x84, 0x94, 0x40, 0x54, 0xFB, 0xC0, 0x84, +0x03, 0x42, 0x0F, 0xD5, 0x5D, 0xDD, 0x24, 0x28, +0x02, 0xA4, 0x01, 0x98, 0x07, 0xE8, 0x09, 0xE0, +0xA4, 0xEA, 0x06, 0x80, 0x00, 0x5A, 0x48, 0xDD, +0xB1, 0x9F, 0x07, 0x01, 0x48, 0xDD, 0xB1, 0x9D, +0xF0, 0xE9, 0xC0, 0xE0, 0x6D, 0x0C, 0x00, 0x2E, +0x07, 0x01, 0x08, 0x5A, 0x26, 0x96, 0x29, 0xEA, +0xC0, 0x84, 0x03, 0xC0, 0x2C, 0xEA, 0x4E, 0xD5, +0x0E, 0x00, 0x10, 0x02, 0x41, 0xE2, 0x85, 0xA4, +0x45, 0xAC, 0x02, 0xE8, 0x0F, 0x00, 0x10, 0x02, +0x41, 0xE2, 0x85, 0xA4, 0x45, 0xAC, 0x02, 0xE8, +0x14, 0x3C, 0xC0, 0x84, 0x00, 0x4E, 0x89, 0x0C, +0x10, 0x40, 0x70, 0xFC, 0x20, 0x3C, 0x17, 0x80, +0x41, 0xE0, 0x5B, 0x07, 0x18, 0x3C, 0x03, 0xE8, +0x50, 0xDD, 0x5B, 0x07, 0x41, 0xDD, 0x10, 0xC0, +0x26, 0x00, 0x20, 0x22, 0xC3, 0x0B, 0x14, 0x3C, +0x09, 0xE8, 0x41, 0xE0, 0x2A, 0x06, 0x24, 0x3C, +0x6D, 0x01, 0x20, 0x12, 0x33, 0x06, 0x14, 0x3C, +0x6E, 0x01, 0x10, 0x12, 0xE0, 0x0C, 0x00, 0x3C, +0x05, 0xC8, 0x26, 0x96, 0x03, 0xC0, 0x50, 0xDD, +0x1C, 0x02, 0x08, 0x5A, 0x00, 0x49, 0xB5, 0xEA, +0x1F, 0x3E, 0xB7, 0x0A, 0x08, 0x5A, 0xB4, 0xFF, +0x88, 0xA6, 0x0C, 0x01, 0x04, 0x00, 0x20, 0x4C, +0x05, 0x03, 0x28, 0x5A, 0xC4, 0xEA, 0x23, 0x84, +0x02, 0x84, 0x0C, 0xD5, 0x08, 0xA6, 0x09, 0xD5, +0x04, 0x03, 0x08, 0x5A, 0x04, 0xD5, 0x01, 0x84, +0x04, 0x02, 0x08, 0x5A, 0x08, 0xAE, 0x00, 0x84, +0xA6, 0xFF, 0x1F, 0x2E, 0x20, 0xE0, 0x48, 0xDD, +0x40, 0x3C, 0x1F, 0xE8, 0x0C, 0xCC, 0xC1, 0x08, +0x91, 0x0C, 0x34, 0x3C, 0x62, 0xE0, 0x53, 0xBA, +0x88, 0x3E, 0x17, 0xE8, 0x48, 0xB4, 0x5C, 0x00, +0x12, 0xE8, 0x42, 0xE4, 0x34, 0x3C, 0x0C, 0xD5, +0x53, 0xBA, 0x91, 0x0C, 0x62, 0xE0, 0x61, 0x90, +0x88, 0x3E, 0x0B, 0xE8, 0x48, 0xB4, 0x5C, 0x00, +0x06, 0xE8, 0x43, 0xE4, 0x08, 0xB4, 0x4C, 0xDD, +0x08, 0xB6, 0x01, 0x9C, 0x22, 0xCF, 0x5A, 0xDD, +0x03, 0x40, 0x10, 0x4C, 0x0A, 0xC6, 0xD7, 0xBF, +0x03, 0xC9, 0x64, 0xEA, 0xC4, 0xEA, 0x21, 0x84, +0x20, 0x84, 0x4C, 0xDD, 0x42, 0xA8, 0x4A, 0xDD, +0x48, 0xDD, 0x5A, 0xDD, 0x7D, 0xEA, 0x20, 0xC8, +0x13, 0x00, 0x07, 0x4E, 0x10, 0xC0, 0x4B, 0xDD, +0x80, 0x00, 0x10, 0x46, 0xDE, 0xFF, 0x03, 0x3C, +0xE1, 0xFF, 0x23, 0x3C, 0x44, 0x92, 0xC1, 0x9C, +0xDE, 0xFF, 0x3B, 0x3C, 0xFF, 0x83, 0x02, 0xE2, +0x4C, 0xDD, 0x03, 0xE8, 0x50, 0xDD, 0x4E, 0xD5, +0x00, 0x96, 0x02, 0x9E, 0x03, 0xE8, 0x02, 0xE6, +0x02, 0xD5, 0x01, 0x84, 0xFF, 0x49, 0x00, 0x84, +0x43, 0xD5, 0xF0, 0xFB, 0x80, 0x00, 0x00, 0x46, +0x03, 0xC9, 0x64, 0xEA, 0x04, 0xD5, 0x21, 0x84, +0x04, 0x02, 0x18, 0x5A, 0xC4, 0xEA, 0x23, 0x84, +0x00, 0x49, 0x4C, 0xDD, 0x10, 0x46, 0x03, 0x0F, +0x06, 0xC8, 0x80, 0x00, 0xAF, 0xFF, 0x27, 0x2E, +0xA6, 0xFF, 0x27, 0x3E, 0x27, 0x2E, 0x2E, 0xD5, +0x0F, 0x3E, 0xAF, 0xFF, 0x27, 0x3E, 0xC2, 0xFF, +0x40, 0xA4, 0xA6, 0xFF, 0x49, 0x96, 0x49, 0x9C, +0xF0, 0x5C, 0x40, 0xAC, 0x04, 0xE9, 0x31, 0x80, +0x30, 0x00, 0x10, 0x44, 0x20, 0x84, 0x40, 0xAC, +0xAE, 0xFF, 0x17, 0x3E, 0x6C, 0x0C, 0x68, 0x3E, +0x32, 0xA8, 0x00, 0x84, 0x32, 0xA6, 0x80, 0xEA, +0x29, 0xEA, 0x14, 0xC0, 0x11, 0xC0, 0x26, 0x96, +0x07, 0xC0, 0x34, 0xA6, 0x40, 0xA4, 0x9A, 0xEA, +0x20, 0x80, 0x10, 0x58, 0x08, 0xD5, 0xFF, 0x83, +0x07, 0xC0, 0x33, 0xA6, 0x40, 0xA4, 0x9A, 0xEA, +0x10, 0x80, 0x10, 0x58, 0x40, 0xAC, 0xFF, 0x83, +0x00, 0xFC, 0xC0, 0xFC, 0x00, 0x96, 0x28, 0xEA, +0xC5, 0xEA, 0x04, 0xC9, 0x3C, 0xC9, 0x4C, 0x96, +0xF2, 0x0B, 0x24, 0x3C, 0xC2, 0x0B, 0x10, 0x3C, +0x03, 0xE9, 0x41, 0xE0, 0x05, 0xC1, 0x64, 0xEA, +0x08, 0x3C, 0x04, 0xC8, 0x31, 0xD5, 0xB3, 0x10, +0xA0, 0xFF, 0x17, 0x2E, 0x8A, 0xEA, 0x09, 0xC1, +0x06, 0xC1, 0x6E, 0x96, 0xC6, 0x0C, 0x24, 0x3C, +0x41, 0xE0, 0x90, 0xEA, 0x20, 0x3C, 0x25, 0xE9, +0x91, 0x9C, 0xB3, 0x10, 0x28, 0x3C, 0x91, 0x96, +0x14, 0x3C, 0xB3, 0x10, 0x22, 0xE0, 0xF4, 0x0B, +0x21, 0xEA, 0x06, 0xE8, 0x00, 0x84, 0x8C, 0xEA, +0x07, 0xD5, 0xA3, 0xEA, 0x15, 0x01, 0x08, 0x5A, +0x99, 0xEA, 0xF9, 0xD5, 0x01, 0x9C, 0x54, 0xEA, +0xFC, 0xE9, 0x03, 0xE0, 0x64, 0x21, 0x08, 0x3E, +0x41, 0xAC, 0x20, 0x84, 0x00, 0x00, 0x10, 0x22, +0x03, 0x00, 0x16, 0x4E, 0x49, 0x9E, 0x03, 0xD5, +0x01, 0x84, 0x40, 0xAC, 0x00, 0x84, 0x02, 0xD5, +0x20, 0xFC, 0x80, 0xFC, 0x0E, 0x96, 0x55, 0xDD, +0x47, 0xDD, 0x55, 0xC8, 0x29, 0x00, 0x11, 0x22, +0xC2, 0x0B, 0x00, 0x3C, 0x03, 0xE9, 0x20, 0xE0, +0x05, 0xC0, 0x50, 0xDD, 0x18, 0x3C, 0x20, 0x84, +0x48, 0xD5, 0xB4, 0x10, 0xB4, 0x10, 0x30, 0x3C, +0xD9, 0x96, 0xD9, 0x9C, 0xB4, 0x10, 0x38, 0x3C, +0x2B, 0x00, 0x11, 0x22, 0x3E, 0xE8, 0x23, 0xE0, +0x48, 0x00, 0x40, 0x3C, 0xDC, 0x14, 0x38, 0x3E, +0x31, 0xD5, 0xA3, 0xEA, 0x11, 0x81, 0x50, 0x38, +0x11, 0x81, 0x71, 0x38, 0x2D, 0x00, 0x61, 0x22, +0xC5, 0xE0, 0xBE, 0x99, 0x60, 0x38, 0x07, 0xE8, +0x51, 0x02, 0x01, 0x81, 0x75, 0x9B, 0x2D, 0x00, +0x66, 0xEA, 0x1E, 0xD5, 0x11, 0x81, 0x71, 0x38, +0x2D, 0x00, 0x51, 0x22, 0xC5, 0xE0, 0x7D, 0x9B, +0xA8, 0xEA, 0x06, 0xE8, 0x2D, 0x00, 0x61, 0x02, +0x11, 0xD5, 0x75, 0x99, 0x11, 0x81, 0x50, 0x38, +0x11, 0x81, 0x61, 0x38, 0x04, 0xE8, 0xC5, 0xE0, +0x69, 0x9F, 0xA8, 0xEA, 0x66, 0xEA, 0x08, 0xD5, +0x11, 0x81, 0x51, 0x38, 0x06, 0xE8, 0xC5, 0xE0, +0x69, 0x9D, 0xA8, 0xEA, 0x50, 0x38, 0x6B, 0x97, +0x01, 0x9C, 0x09, 0x81, 0xCF, 0xE9, 0x04, 0xE0, +0x18, 0x3C, 0x20, 0x84, 0x01, 0x84, 0xB4, 0x10, +0x00, 0x84, 0x02, 0xD5, 0x41, 0xFC, 0xA0, 0xFC, +0x30, 0x22, 0x44, 0xDD, 0x24, 0x3C, 0x4B, 0x80, +0x62, 0xE0, 0xC3, 0x0B, 0x30, 0x3C, 0x36, 0xE9, +0xFE, 0x96, 0x06, 0x00, 0xE0, 0x3D, 0x32, 0xC3, +0xA0, 0x3C, 0xC5, 0x0B, 0x20, 0x85, 0x4A, 0x00, +0x77, 0x28, 0x4F, 0x40, 0x21, 0x97, 0x09, 0x81, +0x19, 0x97, 0x81, 0xF4, 0x4A, 0x80, 0x30, 0x22, +0x52, 0xEA, 0x9C, 0xFE, 0x76, 0x0C, 0x21, 0x40, +0x38, 0xEA, 0x21, 0xEA, 0x15, 0xD5, 0x93, 0x96, +0x13, 0x00, 0xE4, 0x4D, 0x11, 0x21, 0x50, 0x38, +0x0E, 0xE9, 0xA2, 0xE0, 0xD6, 0x28, 0x54, 0x40, +0xA6, 0x9B, 0x01, 0xF7, 0x70, 0x22, 0x7D, 0x9B, +0x6F, 0xEA, 0x4D, 0x80, 0x75, 0x99, 0xC0, 0xEA, +0x02, 0xE8, 0xE5, 0xE0, 0x01, 0x8D, 0x21, 0x8D, +0xEB, 0xE9, 0x03, 0xE1, 0x16, 0x0C, 0x04, 0x3C, +0x07, 0x80, 0x04, 0x40, 0x02, 0xD5, 0x31, 0xEA, +0xC1, 0xFC, 0x00, 0x84, 0x20, 0x3C, 0x40, 0xFC, +0x00, 0x3C, 0xC7, 0x0B, 0x11, 0x40, 0x4A, 0x00, +0x34, 0x3C, 0xD7, 0x00, 0x70, 0x3C, 0x00, 0x0C, +0x82, 0x80, 0x4D, 0x00, 0xB1, 0x97, 0x49, 0x96, +0xFF, 0xFF, 0x90, 0x50, 0x03, 0xE8, 0x27, 0xE0, +0x09, 0xD5, 0xA2, 0x80, 0xC8, 0xEA, 0x50, 0x9B, +0x11, 0x95, 0x10, 0x38, 0x03, 0xE9, 0x23, 0xE0, +0x02, 0xD5, 0x22, 0x84, 0x84, 0x50, 0x21, 0x84, +0x27, 0xE1, 0xFF, 0xFF, 0x68, 0x9B, 0x05, 0xE9, +0x02, 0xE9, 0x30, 0xF8, 0x70, 0x3C, 0x49, 0x9C, +0xE8, 0xE0, 0x4E, 0x00, 0xA2, 0x80, 0x03, 0xE8, +0x42, 0x99, 0x09, 0xD5, 0x24, 0x1C, 0x98, 0x3E, +0x11, 0x95, 0x94, 0x38, 0x02, 0xE9, 0x23, 0xE1, +0x07, 0xE1, 0x49, 0x9C, 0x28, 0x98, 0x08, 0xE8, +0x03, 0x38, 0x94, 0xEA, 0x03, 0xE0, 0x11, 0x81, +0x49, 0x9C, 0x02, 0xE9, 0x4F, 0x00, 0x70, 0x3C, +0xFF, 0x7F, 0x83, 0x50, 0x03, 0xE8, 0xC7, 0xE0, +0x09, 0xD5, 0xA2, 0x80, 0x78, 0xEA, 0x51, 0x9F, +0x11, 0x15, 0x00, 0x38, 0x03, 0xE9, 0x03, 0xE0, +0x02, 0xD5, 0x02, 0x84, 0x64, 0x50, 0x01, 0x84, +0x07, 0xE1, 0xFF, 0x7F, 0x69, 0x9F, 0x09, 0xE9, +0x53, 0x38, 0x94, 0xEA, 0xA3, 0xE0, 0x11, 0x95, +0x02, 0xE9, 0xFF, 0x83, 0x50, 0x3C, 0x01, 0x9C, +0xA6, 0xE0, 0x50, 0x00, 0x11, 0x9D, 0x05, 0xE9, +0x02, 0xE9, 0x06, 0xF8, 0xC5, 0xE0, 0x01, 0x9C, +0x21, 0x9D, 0x09, 0xE8, 0x21, 0x38, 0xAA, 0xEA, +0x43, 0xE0, 0x11, 0x11, 0x02, 0xE9, 0xFF, 0x83, +0x23, 0xE4, 0x01, 0x9C, 0x01, 0x84, 0x03, 0xE9, +0x22, 0x84, 0x04, 0xD5, 0x07, 0x80, 0x00, 0x40, +0x00, 0xFC, 0xC0, 0xFC, 0xE4, 0xFF, 0x03, 0x3C, +0x03, 0x96, 0x02, 0x9E, 0xE4, 0xFF, 0x0B, 0x3C, +0xB1, 0x0C, 0x14, 0x3C, 0x03, 0xE9, 0x20, 0xE0, +0xE5, 0xFF, 0x0B, 0x3C, 0xB1, 0x0C, 0x24, 0x3C, +0x04, 0xE8, 0x02, 0xE0, 0xB1, 0x0C, 0x10, 0x3C, +0x17, 0x3C, 0x40, 0xEA, 0x14, 0x4E, 0xE5, 0xFF, +0x02, 0xD5, 0x03, 0x00, 0x18, 0x3C, 0x42, 0xEA, +0x04, 0x3C, 0xB0, 0x0C, 0x80, 0xFC, 0xB0, 0x0C, +0x24, 0x3C, 0x00, 0xFC, 0x42, 0xEA, 0xB2, 0x0C, +0x03, 0xE8, 0x22, 0xE0, 0x40, 0xEA, 0x49, 0x9C, +0xE5, 0xFF, 0x17, 0x3C, 0x42, 0xEA, 0x02, 0xC9, +0xB0, 0x0C, 0x18, 0x3C, 0xB0, 0x0C, 0x04, 0x3C, +0x00, 0xFC, 0x80, 0xFC, 0x7C, 0x17, 0x68, 0x3E, +0x00, 0x3C, 0xB4, 0x9D, 0xB6, 0xA4, 0xAF, 0x0C, +0x84, 0xFE, 0x77, 0xA4, 0x93, 0x96, 0x4D, 0xDD, +0x16, 0x00, 0x21, 0x40, 0x93, 0x96, 0x38, 0xEA, +0xA4, 0xF9, 0xFF, 0x49, 0x5F, 0xDD, 0x37, 0xA5, +0x4E, 0x00, 0x30, 0x3C, 0x37, 0x04, 0x42, 0x40, +0xF1, 0xFF, 0x63, 0x3C, 0xEF, 0xFF, 0x03, 0x3C, +0x22, 0x40, 0x21, 0x97, 0x21, 0x5C, 0x03, 0x0C, +0x50, 0x98, 0x01, 0x00, 0xC0, 0xE0, 0x56, 0x99, +0x01, 0x80, 0x04, 0xE8, 0x02, 0xD5, 0x25, 0x80, +0x57, 0x2E, 0x05, 0x80, 0xA0, 0xE0, 0xA1, 0xFF, +0x07, 0x3E, 0x03, 0xE8, 0x6B, 0x97, 0xA1, 0xFF, +0x04, 0xE9, 0xA4, 0xE4, 0x6B, 0x3C, 0xC0, 0x84, +0x04, 0xE4, 0xE5, 0xFF, 0x04, 0x84, 0x03, 0xE9, +0x00, 0x5A, 0x0B, 0xD5, 0x22, 0xE4, 0x0A, 0x03, +0x01, 0x80, 0x03, 0xE9, 0x01, 0x9A, 0x05, 0xD5, +0x01, 0x84, 0x02, 0xC8, 0xA9, 0xEA, 0x02, 0x98, +0x36, 0x80, 0x00, 0x40, 0x83, 0x96, 0x44, 0xDD, +0xE9, 0x80, 0x20, 0x12, 0x31, 0x80, 0x20, 0x02, +0x32, 0x80, 0x50, 0x22, 0x31, 0x80, 0x10, 0x22, +0x0C, 0xFF, 0x69, 0x9A, 0x96, 0x0C, 0x32, 0x40, +0xDB, 0x96, 0xDA, 0x98, 0x04, 0xE8, 0x60, 0xE0, +0x79, 0xFF, 0xFF, 0x49, 0xFF, 0x49, 0x03, 0xD5, +0x80, 0xFC, 0x95, 0xFF, 0x41, 0xB0, 0x01, 0xFC, +0x01, 0x96, 0x81, 0xF0, 0x18, 0x3E, 0x89, 0xA4, +0x4A, 0x9C, 0x90, 0x00, 0x30, 0x4C, 0xCC, 0xA4, +0x0E, 0xA4, 0x0E, 0x40, 0x04, 0x40, 0x01, 0x4C, +0x22, 0xD5, 0x01, 0x84, 0x01, 0x4C, 0x0F, 0xA4, +0x02, 0x84, 0x04, 0x00, 0x03, 0x84, 0x1D, 0xD5, +0xCD, 0xA4, 0x1B, 0xD5, 0x0E, 0x40, 0x30, 0x4C, +0x01, 0x4C, 0x0E, 0xA4, 0x07, 0x84, 0x04, 0x40, +0x0F, 0xA4, 0x13, 0xD5, 0x04, 0x00, 0x01, 0x4C, +0x0E, 0xD5, 0x06, 0x84, 0x0C, 0xD5, 0x05, 0x84, +0x01, 0x4C, 0x0E, 0xA4, 0x08, 0x84, 0x04, 0x40, +0x0F, 0xA4, 0x07, 0xD5, 0x04, 0x40, 0x01, 0x4C, +0x02, 0xD5, 0x04, 0x84, 0x81, 0xFC, 0x00, 0x84, +0x5C, 0x3C, 0x20, 0xFC, 0x41, 0x80, 0x05, 0x00, +0x01, 0x00, 0x31, 0x2A, 0xDB, 0x98, 0xC0, 0x84, +0x41, 0x22, 0xEB, 0x98, 0x61, 0x84, 0x00, 0x80, +0x00, 0x00, 0x71, 0x22, 0xEF, 0x99, 0xFF, 0x99, +0x04, 0xE1, 0x7C, 0xEA, 0x43, 0x22, 0x04, 0xE8, +0xC3, 0x80, 0x00, 0x80, 0xD8, 0x96, 0xD9, 0x9C, +0x38, 0x5A, 0x92, 0x9C, 0x80, 0x98, 0xF3, 0x14, +0x4D, 0xEA, 0x6A, 0x99, 0x03, 0xE8, 0x82, 0xE0, +0x09, 0x99, 0x00, 0x38, 0x42, 0xFC, 0xA0, 0xFC, +0x83, 0xF1, 0x49, 0x96, 0x4F, 0x00, 0x30, 0x3C, +0x4D, 0x00, 0x10, 0x3C, 0xCC, 0xFE, 0x40, 0x85, +0x91, 0x40, 0x82, 0xF1, 0x00, 0x81, 0x13, 0x80, +0x97, 0x01, 0x00, 0x48, 0xB4, 0xFF, 0x37, 0x2E, +0x05, 0x02, 0x38, 0x5A, 0x11, 0x4C, 0x02, 0xF1, +0x20, 0x3C, 0x96, 0x01, 0x81, 0xF2, 0x4F, 0x00, +0x81, 0x01, 0x00, 0x48, 0x05, 0x00, 0xEC, 0x3D, +0x00, 0xA4, 0x54, 0x40, 0x02, 0x22, 0xBE, 0x88, +0x10, 0x3C, 0x00, 0x80, 0x02, 0xF2, 0x4D, 0x00, +0x48, 0x80, 0x20, 0x4C, 0x01, 0xF2, 0x97, 0xEA, +0x8B, 0x00, 0x51, 0x4C, 0x4E, 0x00, 0x50, 0x3C, +0x51, 0x4C, 0x02, 0xF2, 0x01, 0xF2, 0x86, 0x00, +0x83, 0x80, 0x21, 0x4C, 0x01, 0xE0, 0x03, 0xF1, +0x5D, 0x01, 0xF3, 0x4E, 0x54, 0x50, 0x5F, 0xDD, +0xA9, 0x9B, 0xFF, 0xFF, 0x15, 0xF8, 0xB6, 0x99, +0x55, 0x01, 0xF3, 0x4E, 0x01, 0x84, 0x64, 0x40, +0xDE, 0x88, 0xB6, 0x99, 0x06, 0xE0, 0x2F, 0xEA, +0xF3, 0x4E, 0xFF, 0x83, 0xAF, 0xEA, 0x4C, 0x01, +0xB6, 0x99, 0xA1, 0x9B, 0x2F, 0xEA, 0xDE, 0x88, +0xF2, 0x4E, 0xC0, 0xE0, 0xAD, 0x99, 0x44, 0x01, +0x2F, 0xEA, 0xDE, 0x88, 0xFF, 0x83, 0x06, 0xE0, +0x3D, 0x01, 0xF3, 0x4E, 0xDE, 0x88, 0xA4, 0x99, +0xC0, 0xE0, 0x2F, 0xEA, 0xF2, 0x4E, 0xFF, 0x83, +0x69, 0x99, 0x36, 0x01, 0xBE, 0x88, 0x6D, 0x99, +0x05, 0xE0, 0x3B, 0xEA, 0x2F, 0x01, 0xF3, 0x4E, +0x00, 0x84, 0x54, 0x40, 0xF2, 0x4E, 0xD0, 0xF8, +0x21, 0x99, 0x2A, 0x01, 0xD3, 0x00, 0x00, 0x48, +0x4F, 0x00, 0x60, 0x3C, 0x61, 0x4C, 0x01, 0xF2, +0x03, 0xF1, 0x21, 0x40, 0xF3, 0x4E, 0x01, 0xE0, +0xAF, 0xEA, 0x1E, 0x01, 0x9E, 0x88, 0x24, 0x99, +0xA0, 0xE0, 0x33, 0xEA, 0x17, 0x01, 0xF2, 0x4E, +0x80, 0x00, 0xF0, 0x46, 0xA9, 0x88, 0x24, 0xEA, +0xFF, 0x83, 0xAD, 0x99, 0xD5, 0xFF, 0x00, 0x4E, +0x0D, 0x01, 0xF2, 0x4E, 0x5B, 0x99, 0xE9, 0x9C, +0x00, 0x14, 0x3F, 0x40, 0x60, 0xE0, 0x41, 0xEA, +0x05, 0x01, 0xF2, 0x4E, 0xFE, 0x00, 0x00, 0x48, +0x21, 0x4C, 0x01, 0xF2, 0x72, 0x22, 0x22, 0xC0, +0x03, 0xF0, 0x00, 0x80, 0xF3, 0x4E, 0xE0, 0xE0, +0x34, 0x50, 0xFA, 0x00, 0x5B, 0x99, 0xFF, 0xFF, +0x3B, 0xEA, 0xBE, 0x88, 0xE5, 0xE0, 0xFF, 0x83, +0xF1, 0x00, 0xF3, 0x4E, 0xDA, 0xFF, 0x00, 0x4E, +0x2F, 0xEA, 0xDE, 0x88, 0xF2, 0x4E, 0xC7, 0xE0, +0xA9, 0x9E, 0xEA, 0x00, 0x3F, 0x40, 0x92, 0x98, +0x41, 0xEA, 0x00, 0x08, 0xF3, 0x4E, 0xE3, 0xE0, +0x00, 0x48, 0xE2, 0x00, 0x40, 0x3C, 0xD4, 0x00, +0x02, 0xF2, 0x4E, 0x00, 0x3C, 0x40, 0x22, 0x4C, +0x01, 0xF2, 0x97, 0xEA, 0x03, 0xF1, 0x1B, 0xDA, +0xF3, 0x4E, 0x01, 0xE0, 0x24, 0xEA, 0xD4, 0x00, +0x01, 0x94, 0x54, 0x40, 0x00, 0x4E, 0xAD, 0x99, +0xF3, 0x4E, 0x8D, 0xFF, 0xA9, 0x9C, 0xCC, 0x00, +0xBE, 0x88, 0x52, 0x99, 0xA0, 0xE0, 0x3B, 0xEA, +0xC5, 0x00, 0xF2, 0x4E, 0x01, 0x80, 0x74, 0x50, +0x3F, 0x40, 0xFF, 0x99, 0x00, 0x48, 0x00, 0x1C, +0x01, 0xF2, 0x8C, 0x00, 0x1C, 0xC0, 0x21, 0x4C, +0x01, 0xE0, 0x03, 0xF1, 0xB7, 0x00, 0xF3, 0x4E, +0x54, 0x40, 0x24, 0xEA, 0xA9, 0x9F, 0x01, 0x94, +0x60, 0xFF, 0x00, 0x4E, 0xAF, 0x00, 0xF3, 0x4E, +0xBE, 0x88, 0x6D, 0x99, 0x05, 0xE0, 0x3B, 0xEA, +0xF3, 0x4E, 0xFF, 0x83, 0x64, 0x50, 0xA8, 0x00, +0xB6, 0x99, 0xFF, 0xFF, 0x00, 0x18, 0x3F, 0x40, +0x92, 0x00, 0x00, 0x48, 0x20, 0x4C, 0x02, 0xF2, +0x03, 0xF1, 0x2A, 0xC0, 0xF3, 0x4E, 0x01, 0xE0, +0x64, 0x50, 0x9A, 0x00, 0x06, 0xF8, 0xFF, 0xFF, +0xF3, 0x4E, 0x05, 0xE0, 0x64, 0x50, 0x94, 0x00, +0xB6, 0x99, 0x01, 0x80, 0x53, 0x22, 0xDE, 0x88, +0xFF, 0x83, 0x00, 0x00, 0xF2, 0x4E, 0xA0, 0xE0, +0x24, 0xEA, 0x8A, 0x00, 0xC9, 0x88, 0xA9, 0x9F, +0x34, 0xFF, 0x00, 0x4E, 0x83, 0x00, 0xF3, 0x4E, +0x00, 0x94, 0x64, 0x40, 0x00, 0x4E, 0xB6, 0x99, +0xF2, 0x4E, 0x44, 0xFF, 0x69, 0x9D, 0x7C, 0x00, +0x6D, 0x99, 0xA9, 0x88, 0x00, 0x14, 0x3F, 0x40, +0x02, 0xF1, 0x43, 0xD5, 0x23, 0x40, 0x12, 0x4C, +0x02, 0xE0, 0x03, 0xF2, 0x54, 0x50, 0x6F, 0xE9, +0x00, 0x4E, 0xFF, 0xFF, 0x6A, 0xE9, 0xBF, 0xFF, +0xAB, 0xFF, 0x24, 0xEA, 0x00, 0x4E, 0xC9, 0x88, +0x64, 0xE9, 0x15, 0xFF, 0x01, 0x94, 0x64, 0x40, +0x10, 0xFF, 0x00, 0x4E, 0x52, 0x52, 0x5F, 0xE9, +0xA9, 0x88, 0x01, 0x80, 0xBE, 0x88, 0x6D, 0x99, +0xA0, 0xE0, 0x3B, 0xEA, 0x56, 0xE8, 0xFF, 0x83, +0x24, 0x99, 0xAF, 0xEA, 0x00, 0x10, 0x3F, 0x40, +0x97, 0xEA, 0x1F, 0xD5, 0x20, 0xD9, 0x01, 0xF1, +0x02, 0xE0, 0x03, 0xF2, 0x65, 0xEA, 0x4B, 0xE9, +0x01, 0x8C, 0x54, 0x40, 0x00, 0x4E, 0xAD, 0x99, +0x44, 0xE9, 0x05, 0xFF, 0x00, 0x4E, 0x69, 0x9D, +0x40, 0xE8, 0xE7, 0xFF, 0x01, 0x80, 0x54, 0x50, +0xE2, 0xFF, 0x00, 0x4E, 0x59, 0x9D, 0x3B, 0xE8, +0x00, 0x4E, 0xA9, 0x88, 0x36, 0xE8, 0xDD, 0xFF, +0xDB, 0x98, 0x69, 0x88, 0x41, 0xEA, 0x7E, 0x88, +0x30, 0xE8, 0x60, 0xE0, 0x01, 0xF2, 0x23, 0xD5, +0x2D, 0xC0, 0x21, 0x4C, 0x01, 0xE0, 0x03, 0xF1, +0x57, 0xEA, 0x29, 0xE9, 0x01, 0x90, 0x54, 0x40, +0x78, 0xFF, 0x00, 0x4E, 0x54, 0x40, 0x23, 0xE9, +0x00, 0x4E, 0x00, 0x90, 0x1E, 0xE8, 0xC5, 0xFF, +0xFF, 0xFF, 0x34, 0x50, 0x00, 0x4E, 0x5C, 0x9B, +0x18, 0xE9, 0x6D, 0xFF, 0x21, 0xFF, 0x00, 0x4E, +0x14, 0xE9, 0x05, 0xE0, 0x92, 0x98, 0x9C, 0x98, +0x00, 0x08, 0x3F, 0x40, 0x03, 0xE0, 0x41, 0xEA, +0xA8, 0x5A, 0x0D, 0xE9, 0x09, 0x80, 0x07, 0x14, +0xFF, 0x49, 0x28, 0x80, 0x06, 0xD5, 0x53, 0xFE, +0x09, 0x29, 0x94, 0x38, 0xA5, 0x54, 0x41, 0x8D, +0x01, 0xF0, 0xFF, 0x00, 0x91, 0x96, 0x81, 0x9C, +0x01, 0x80, 0x04, 0x50, 0x90, 0x40, 0x81, 0xF2, +0x30, 0x3C, 0x13, 0x00, 0x01, 0xF2, 0x50, 0x00, +0xF2, 0x4E, 0x62, 0xE2, 0x02, 0xF0, 0x7D, 0xFE, +0x91, 0x96, 0x81, 0x9C, 0x20, 0x3C, 0x82, 0xF2, +0x02, 0xF0, 0x4E, 0x00, 0xF2, 0x4E, 0x40, 0xE2, +0x0A, 0x80, 0x67, 0xFE, 0x20, 0xFC, 0xC2, 0xFC, +0x2C, 0x3C, 0x48, 0x96, 0x89, 0x9F, 0x05, 0x00, +0x19, 0xD5, 0x00, 0x84, 0x82, 0x80, 0x41, 0x9D, +0x02, 0x80, 0x92, 0x9C, 0x10, 0xD5, 0x65, 0x80, +0x00, 0x00, 0x82, 0x22, 0x00, 0x00, 0x70, 0x22, +0x08, 0xE8, 0x07, 0xE1, 0x00, 0x00, 0x72, 0x22, +0x00, 0x00, 0x80, 0x22, 0x00, 0x00, 0x82, 0x12, +0xD9, 0x9C, 0xC0, 0xAD, 0x61, 0xE0, 0x02, 0x9C, +0x05, 0x80, 0xF0, 0xE9, 0xE7, 0xE9, 0x06, 0xE0, +0x4A, 0xFC, 0xA0, 0xFC, 0x93, 0xF0, 0x13, 0xB1, +0x82, 0x00, 0xDB, 0x96, 0xE2, 0xA7, 0x01, 0x00, +0x48, 0x3E, 0xA3, 0xA7, 0x86, 0xF3, 0x90, 0x00, +0x91, 0x96, 0xE2, 0xA4, 0xB7, 0x0C, 0x21, 0x40, +0x01, 0x80, 0x8F, 0x14, 0x82, 0xF6, 0xFF, 0xB6, +0x90, 0x96, 0x00, 0x96, 0x4A, 0xAF, 0x68, 0x97, +0x88, 0xAE, 0x4B, 0xAF, 0x84, 0xF2, 0x89, 0xAE, +0x83, 0xF5, 0xA7, 0xA4, 0x22, 0x02, 0x91, 0xF2, +0x90, 0xF2, 0x08, 0x00, 0x26, 0xA5, 0xA5, 0xA4, +0x8E, 0xF4, 0x8F, 0xF2, 0x5C, 0x3C, 0x03, 0xF4, +0x82, 0x50, 0x05, 0x00, 0x3D, 0xEA, 0xFF, 0x7F, +0x11, 0x00, 0x74, 0x40, 0x07, 0x80, 0x8F, 0x14, +0x01, 0x00, 0x82, 0x50, 0x8F, 0x14, 0x04, 0xF4, +0x24, 0x40, 0x09, 0x80, 0x82, 0x50, 0x11, 0x00, +0x3D, 0xEA, 0xFF, 0x7F, 0x74, 0x40, 0x88, 0xF7, +0x8F, 0x14, 0x11, 0x00, 0x83, 0x42, 0x0B, 0x80, +0x85, 0xF5, 0x24, 0x8C, 0x8C, 0xF7, 0x8A, 0xF2, +0x12, 0x80, 0x8F, 0x14, 0x03, 0xF4, 0x11, 0xF2, +0x2A, 0xE8, 0x44, 0xE2, 0x8F, 0x04, 0x08, 0xF7, +0x70, 0x42, 0x05, 0x80, 0x5B, 0x99, 0x73, 0x0C, +0x0E, 0xD5, 0x2D, 0xF8, 0x80, 0x84, 0xCA, 0x80, +0x23, 0x38, 0x05, 0xD5, 0x32, 0xF8, 0x15, 0x14, +0x35, 0xF8, 0x04, 0xE8, 0x10, 0xD5, 0xFB, 0xE8, +0x42, 0x8F, 0x01, 0x8D, 0x07, 0xF2, 0x22, 0x85, +0xFF, 0xB4, 0x08, 0xF4, 0x01, 0x20, 0xE1, 0x41, +0x01, 0x20, 0x22, 0x40, 0x47, 0xE0, 0x89, 0xEA, +0x92, 0x4E, 0xEA, 0xE8, 0x6F, 0x50, 0x07, 0x00, +0xB0, 0x97, 0x01, 0x00, 0x04, 0xD5, 0xDF, 0xB6, +0x02, 0x80, 0x80, 0x00, 0x03, 0xF2, 0x1F, 0xB7, +0x44, 0xE2, 0x10, 0xF4, 0x0A, 0xF7, 0x35, 0xE8, +0x05, 0x80, 0x8F, 0x04, 0x73, 0x0C, 0x70, 0x42, +0xFF, 0x99, 0x9B, 0x99, 0x00, 0x1C, 0xA4, 0x40, +0x28, 0x81, 0x00, 0x85, 0x14, 0xD5, 0xFF, 0x83, +0x80, 0x84, 0xAA, 0x80, 0x22, 0x38, 0x08, 0xD5, +0x06, 0xF7, 0x15, 0x98, 0x47, 0xE0, 0x21, 0x9D, +0x07, 0xE8, 0xFF, 0x83, 0xA0, 0x98, 0x01, 0xF7, +0xFF, 0x83, 0xE2, 0xE0, 0x10, 0xD5, 0xF5, 0xE8, +0x42, 0x8D, 0x01, 0x8D, 0x09, 0xF2, 0x22, 0x85, +0x02, 0xF7, 0x0A, 0xF4, 0x00, 0x20, 0xE1, 0x41, +0x00, 0x10, 0x24, 0x40, 0xE2, 0xE0, 0x89, 0xEA, +0x92, 0x4E, 0xE4, 0xE8, 0x5F, 0x50, 0x07, 0x00, +0x68, 0x97, 0xFF, 0x7F, 0x04, 0xD5, 0x82, 0xF5, +0x8F, 0x14, 0xC6, 0xEA, 0x0F, 0xF2, 0x02, 0x80, +0x44, 0xE2, 0x04, 0xF4, 0x1F, 0xB5, 0x31, 0xE8, +0xFE, 0x84, 0x12, 0xF2, 0x24, 0x9C, 0x61, 0x42, +0x74, 0x40, 0x05, 0xF4, 0xFF, 0x99, 0x00, 0x08, +0xA2, 0x40, 0x20, 0x85, 0x09, 0x81, 0x00, 0x1C, +0x22, 0x2A, 0x10, 0xD5, 0x00, 0x4E, 0x01, 0x80, +0x08, 0xE8, 0xCA, 0xFF, 0x02, 0xF7, 0x1F, 0xB5, +0x00, 0x20, 0x22, 0x40, 0xF6, 0xE8, 0xE2, 0xE0, +0x21, 0x8D, 0x12, 0xD5, 0x02, 0x85, 0x46, 0x89, +0x0C, 0xF4, 0x0B, 0xF2, 0x01, 0x24, 0xE1, 0x41, +0x01, 0x24, 0x22, 0x40, 0x40, 0xE0, 0x89, 0xEA, +0xAA, 0x80, 0x04, 0xE9, 0xEB, 0xD5, 0x80, 0x84, +0x06, 0x00, 0x82, 0x4E, 0x01, 0x00, 0x4F, 0x50, +0x02, 0xD5, 0x20, 0x96, 0x04, 0xF7, 0x08, 0xA6, +0x0E, 0x80, 0x8F, 0x04, 0x36, 0xE8, 0xE8, 0xE2, +0xFF, 0xB4, 0xB9, 0x9D, 0x11, 0x00, 0xE3, 0x41, +0x73, 0x0C, 0x7F, 0x42, 0x9B, 0x98, 0x05, 0xF4, +0x20, 0x85, 0xFF, 0x99, 0xA2, 0x40, 0x8D, 0xF2, +0x09, 0x81, 0x00, 0x1C, 0x23, 0x2A, 0x14, 0xD5, +0x8F, 0x04, 0x01, 0x80, 0x21, 0x9D, 0x06, 0x80, +0x09, 0xE8, 0x48, 0xE0, 0x22, 0x40, 0x1F, 0xB5, +0x8F, 0x04, 0x00, 0x20, 0x02, 0xE1, 0x02, 0x80, +0x12, 0xD5, 0xF3, 0xE8, 0x21, 0x8D, 0x0D, 0xF2, +0x02, 0x85, 0x42, 0x89, 0x53, 0x40, 0x01, 0xF4, +0x24, 0x40, 0x00, 0x24, 0x6B, 0x97, 0x00, 0xF8, +0x04, 0xE9, 0x82, 0xE0, 0x80, 0x84, 0xEA, 0x80, +0x82, 0x4E, 0xEA, 0xD5, 0xA9, 0x9E, 0x06, 0x00, +0x81, 0xF2, 0x90, 0x96, 0xC9, 0xA7, 0x03, 0xD5, +0xC8, 0xA7, 0x81, 0xF7, 0x0F, 0x40, 0x70, 0x4C, +0x8F, 0x04, 0xC9, 0xA7, 0x74, 0x4C, 0x01, 0x80, +0xCA, 0xA7, 0x0A, 0x40, 0x71, 0x4C, 0x5F, 0xB4, +0xCB, 0xA7, 0x06, 0x40, 0x72, 0x4C, 0x02, 0xF4, +0x01, 0xF7, 0x0C, 0x00, 0x02, 0xF2, 0x1F, 0xB5, +0xC9, 0xAF, 0x08, 0xAE, 0x02, 0x80, 0x80, 0x10, +0xFF, 0x48, 0x8B, 0xAE, 0xCA, 0xFC, 0x15, 0xFF, +0xD3, 0xB0, 0x4A, 0xFC, 0x00, 0x96, 0x93, 0xF0, +0x1A, 0xA7, 0x59, 0xA7, 0x82, 0xF1, 0xDB, 0xA6, +0x49, 0xAF, 0x08, 0xAE, 0xCB, 0xAE, 0x0A, 0xAF, +0x20, 0x0C, 0x60, 0x3C, 0x62, 0x4E, 0x91, 0x96, +0x5F, 0xDD, 0x99, 0x01, 0x21, 0x40, 0x87, 0xF0, +0x60, 0x3C, 0xF7, 0x04, 0x3F, 0xB6, 0x48, 0x00, +0x89, 0xF5, 0x90, 0xF6, 0x8A, 0xF3, 0x84, 0xF4, +0x8D, 0xF2, 0x90, 0x96, 0x0D, 0xF0, 0xF8, 0x97, +0x60, 0x42, 0x8B, 0xF7, 0xB1, 0x97, 0x24, 0x04, +0x05, 0x00, 0x7C, 0x3C, 0x71, 0x9A, 0x8B, 0xFE, +0x91, 0xF2, 0x86, 0xF7, 0x92, 0xF1, 0x8E, 0xF6, +0x3F, 0xB4, 0x07, 0xF0, 0x0B, 0x80, 0xAF, 0x04, +0x24, 0x04, 0x40, 0x42, 0x05, 0x80, 0xAF, 0x14, +0x52, 0x40, 0x21, 0x97, 0x83, 0xF4, 0x00, 0x28, +0x13, 0x80, 0xE2, 0x41, 0x1F, 0xB4, 0x3F, 0xD5, +0x24, 0x40, 0x06, 0xF1, 0x11, 0x96, 0x01, 0x00, +0x88, 0x99, 0x00, 0x98, 0x21, 0x8D, 0x92, 0xEA, +0x6A, 0xEA, 0x11, 0xF2, 0x00, 0x08, 0x44, 0x40, +0x00, 0x98, 0x21, 0x96, 0x4D, 0xEA, 0x48, 0x99, +0x42, 0x89, 0xBA, 0x98, 0x00, 0x00, 0x23, 0x22, +0x00, 0x80, 0x72, 0x22, 0x00, 0x00, 0x43, 0x22, +0x76, 0xEA, 0xD3, 0x98, 0x61, 0x9A, 0xDF, 0x98, +0x03, 0x80, 0x00, 0x42, 0x1F, 0xB4, 0xD8, 0x9A, +0x00, 0x89, 0x09, 0xF1, 0x29, 0xE2, 0x3D, 0xEA, +0x14, 0x3C, 0xDB, 0xE8, 0x5A, 0xEA, 0x20, 0x0C, +0x24, 0x04, 0x05, 0x42, 0xFF, 0x7F, 0xEF, 0x51, +0x36, 0x08, 0x00, 0x40, 0x13, 0x00, 0xEF, 0x41, +0x08, 0xE8, 0x60, 0xE0, 0x01, 0x80, 0xAF, 0x04, +0xFF, 0x00, 0xA5, 0x54, 0x04, 0x80, 0xAF, 0x14, +0x01, 0xF0, 0x11, 0xD5, 0xFF, 0x7F, 0xA0, 0x50, +0xAF, 0x14, 0x71, 0xEA, 0x04, 0xF1, 0x01, 0x80, +0x22, 0xE0, 0x01, 0xF2, 0x60, 0x84, 0x07, 0xE8, +0x9F, 0x04, 0x1E, 0x81, 0x43, 0x81, 0x07, 0x80, +0x0B, 0xF0, 0xD7, 0xD5, 0x41, 0x9C, 0x03, 0xF2, +0x92, 0x40, 0x11, 0x99, 0xA0, 0x44, 0x13, 0x00, +0x6E, 0xEA, 0x64, 0x00, 0x10, 0xF0, 0x3C, 0xD5, +0xFF, 0x7F, 0x44, 0x50, 0x00, 0xE3, 0x21, 0x97, +0x06, 0xF1, 0x19, 0xE8, 0x8C, 0x99, 0x24, 0x99, +0x44, 0x40, 0x92, 0xEA, 0x4C, 0x99, 0x00, 0x20, +0x00, 0x80, 0x42, 0x22, 0x00, 0x00, 0x03, 0x22, +0xA2, 0x98, 0x76, 0xEA, 0xE1, 0x80, 0x97, 0x98, +0x00, 0x00, 0x43, 0x22, 0x76, 0xEA, 0xFB, 0x98, +0x21, 0x9B, 0xD8, 0x98, 0x03, 0x00, 0x02, 0x42, +0x1F, 0xB4, 0xD8, 0x9A, 0x00, 0x89, 0x21, 0x8D, +0x3D, 0xEA, 0x6A, 0xEA, 0x29, 0xE2, 0x09, 0xF1, +0x44, 0x3C, 0xDB, 0xE8, 0x01, 0xF0, 0x20, 0x0C, +0x24, 0x10, 0x11, 0x42, 0x01, 0x00, 0x90, 0x50, +0xB6, 0xA8, 0x10, 0x40, 0x6E, 0xEA, 0x6A, 0xEA, +0x05, 0xE8, 0x61, 0xE0, 0x48, 0x96, 0x05, 0xF1, +0x10, 0xD5, 0x8A, 0xF1, 0x11, 0x9C, 0x05, 0xF2, +0x85, 0xF0, 0x01, 0x96, 0x0A, 0xF1, 0x05, 0xF0, +0x08, 0xE8, 0x01, 0xE0, 0x8F, 0x04, 0x60, 0x84, +0x9F, 0x04, 0x01, 0x80, 0x43, 0x80, 0x07, 0x80, +0x1F, 0xB4, 0xDE, 0xD5, 0x42, 0xFE, 0x0D, 0xF2, +0x81, 0xF2, 0x49, 0x96, 0x0E, 0xF2, 0x8F, 0xF1, +0x12, 0xF0, 0x04, 0xF1, 0x48, 0x99, 0x0A, 0x99, +0x69, 0x97, 0x21, 0x97, 0x88, 0xF5, 0x85, 0xF4, +0xEF, 0x05, 0x8C, 0xF4, 0x3A, 0xD5, 0x0D, 0x80, +0x34, 0x40, 0x06, 0xF1, 0xCB, 0x99, 0x00, 0xA4, +0x55, 0x40, 0x7C, 0xEA, 0x8D, 0x99, 0x00, 0x28, +0x91, 0x9C, 0xC3, 0xEA, 0xEF, 0x41, 0x68, 0x88, +0x03, 0x22, 0x00, 0x0C, 0x21, 0x8D, 0x00, 0x80, +0x00, 0x00, 0x83, 0x22, 0x55, 0xF8, 0x41, 0x8D, +0x6A, 0xEA, 0x91, 0x96, 0xFF, 0x83, 0x71, 0xEA, +0x02, 0xE2, 0x0A, 0xF0, 0x0C, 0xF0, 0xE6, 0xE8, +0x20, 0x0C, 0x54, 0x3C, 0x81, 0x98, 0x0F, 0xF1, +0x8C, 0xF2, 0x91, 0x96, 0x0F, 0x42, 0x08, 0xF2, +0x51, 0x98, 0x24, 0x14, 0x88, 0xF1, 0x49, 0x96, +0x00, 0x40, 0x54, 0xDD, 0x80, 0xE0, 0xB6, 0x04, +0xEF, 0x05, 0x08, 0xE8, 0xEF, 0x55, 0x03, 0x80, +0xEF, 0x15, 0xFF, 0x00, 0x14, 0xD5, 0x07, 0x80, +0xE1, 0x51, 0x03, 0xF2, 0xEF, 0x41, 0xFF, 0x7F, +0xEF, 0x15, 0x13, 0x00, 0x07, 0xF0, 0x03, 0x80, +0x01, 0xE0, 0x03, 0xF1, 0x80, 0x84, 0x09, 0xE8, +0x08, 0x80, 0xAF, 0x04, 0x0C, 0x80, 0x9F, 0x04, +0xC4, 0x83, 0x04, 0xF2, 0x0E, 0xF2, 0xD2, 0xD5, +0x04, 0xF1, 0x1F, 0xB4, 0x4D, 0x99, 0x50, 0x99, +0x13, 0x80, 0xA2, 0x40, 0x64, 0x00, 0xE0, 0x45, +0x08, 0x80, 0xAF, 0x14, 0x10, 0xF0, 0x45, 0xD5, +0x1E, 0xE8, 0x20, 0xE3, 0x35, 0x40, 0x06, 0xF1, +0xCB, 0x99, 0x00, 0x28, 0x54, 0x40, 0x7C, 0xEA, +0x8D, 0x99, 0x00, 0xA4, 0x03, 0xF0, 0xC3, 0xEA, +0x03, 0x98, 0x68, 0x88, 0x00, 0x80, 0x33, 0x22, +0x03, 0x80, 0x83, 0xF0, 0x00, 0x00, 0x83, 0x22, +0x00, 0x80, 0x53, 0x22, 0x00, 0x20, 0x10, 0x40, +0x4C, 0x98, 0xC3, 0xEA, 0x02, 0x42, 0x6B, 0x9B, +0x08, 0x9B, 0x03, 0x80, 0x91, 0x9C, 0xFF, 0x83, +0x41, 0x8D, 0x21, 0x8D, 0x9E, 0xFF, 0x00, 0x4E, +0x22, 0xE2, 0x0A, 0xF1, 0x08, 0xF0, 0xD9, 0xE8, +0xA0, 0x40, 0x3F, 0xB4, 0x05, 0xF0, 0x00, 0x04, +0x20, 0x0C, 0x54, 0x3C, 0x91, 0x96, 0x81, 0x98, +0x03, 0xF2, 0x85, 0xF2, 0x24, 0x14, 0x11, 0x42, +0x10, 0x40, 0x71, 0xEA, 0xAF, 0x14, 0xB6, 0xF8, +0x81, 0xE0, 0x08, 0x80, 0x01, 0xF0, 0x05, 0xE8, +0x89, 0xF0, 0x00, 0x96, 0x01, 0xF1, 0x11, 0xD5, +0x01, 0x96, 0x09, 0x9C, 0x01, 0xF2, 0x81, 0xF0, +0x40, 0xE0, 0x09, 0xF0, 0x80, 0x84, 0x09, 0xE8, +0x05, 0x80, 0xAF, 0x04, 0x08, 0x80, 0x9F, 0x04, +0x83, 0xF4, 0x04, 0xF2, 0x02, 0xF1, 0xD6, 0xD5, +0x08, 0xA6, 0x07, 0xF2, 0x0F, 0x40, 0x01, 0x4C, +0x09, 0xF1, 0x09, 0xA6, 0x0B, 0xC0, 0x00, 0x4C, +0x04, 0xF1, 0x02, 0xF2, 0x00, 0x4C, 0x12, 0xA6, +0x13, 0xA6, 0x06, 0xC0, 0x01, 0x4C, 0x0A, 0xF2, +0x07, 0xF1, 0x0D, 0x00, 0x40, 0xAE, 0x02, 0xF0, +0x81, 0xAE, 0x09, 0xF2, 0x42, 0xAE, 0x04, 0xF1, +0x83, 0xAE, 0x0A, 0xF2, 0x86, 0xFE, 0xFF, 0x48, +0x40, 0xFC, 0xCA, 0xFC, 0x08, 0x80, 0x60, 0x50, +0x46, 0xB4, 0xC9, 0xA0, 0x18, 0x80, 0x80, 0x50, +0x41, 0x80, 0xDA, 0x98, 0x90, 0x04, 0x13, 0xA3, +0xDC, 0x98, 0x07, 0x80, 0x50, 0x50, 0x88, 0xB4, +0x89, 0x88, 0x20, 0x80, 0xA0, 0x04, 0x25, 0xB5, +0x89, 0x88, 0x04, 0x80, 0x70, 0x50, 0x22, 0xB5, +0x2A, 0x89, 0x14, 0x80, 0x2A, 0x89, 0x47, 0xB5, +0x24, 0x89, 0x23, 0x89, 0x92, 0x40, 0x20, 0xB7, +0xE3, 0x98, 0x01, 0x0C, 0x01, 0x00, 0x90, 0x14, +0x62, 0xB4, 0xC3, 0xA8, 0xDA, 0x98, 0x48, 0xB4, +0x5A, 0x98, 0x41, 0xB4, 0x46, 0xB4, 0x67, 0xB4, +0x65, 0xB4, 0x9A, 0x98, 0xD1, 0x9A, 0x93, 0x98, +0xC2, 0xA8, 0x51, 0x98, 0xC0, 0xFC, 0x44, 0xA8, +0xCB, 0xB0, 0x59, 0xFC, 0x00, 0x96, 0x8B, 0xF0, +0x85, 0xF0, 0x87, 0xF1, 0x1A, 0xA6, 0x5B, 0xA6, +0xD9, 0xA6, 0x88, 0xF2, 0x84, 0xF0, 0x8C, 0xB0, +0x81, 0xF2, 0x83, 0xF1, 0x64, 0xB1, 0x82, 0xF3, +0x80, 0x84, 0x62, 0x80, 0xFF, 0xDB, 0x19, 0xAB, +0xB2, 0xB1, 0xA4, 0xB0, 0x19, 0xAB, 0x62, 0x80, +0xFF, 0x7F, 0x33, 0x4C, 0xAF, 0xFF, 0x3F, 0x2E, +0x7F, 0xB6, 0x25, 0xEA, 0xBF, 0xB4, 0x74, 0xFA, +0x00, 0x80, 0x6F, 0x44, 0xD8, 0x98, 0xEC, 0xFE, +0x0C, 0x80, 0x91, 0x50, 0x60, 0x44, 0xC9, 0xB6, +0x9C, 0xA9, 0xFF, 0x7F, 0x4A, 0x00, 0x60, 0x3C, +0x05, 0x00, 0x8C, 0x3C, 0x86, 0xF6, 0x05, 0xF0, +0x09, 0x80, 0x8F, 0x14, 0x8A, 0xF3, 0x24, 0x80, +0x06, 0xF3, 0x2D, 0xD5, 0xE0, 0x43, 0x0A, 0xF4, +0x04, 0xF7, 0x24, 0x0C, 0x90, 0x80, 0xAF, 0x50, +0x10, 0x00, 0x82, 0x50, 0x09, 0xF5, 0x1E, 0xD5, +0x00, 0xF8, 0x33, 0x40, 0xEB, 0x98, 0xDB, 0x98, +0x4C, 0xB1, 0x41, 0xEA, 0x02, 0x82, 0x42, 0x38, +0x65, 0x38, 0xA9, 0xB4, 0xA3, 0xE0, 0x02, 0x1E, +0x69, 0xB6, 0x02, 0xE8, 0x65, 0xE0, 0xA8, 0xB4, +0x68, 0xB6, 0x02, 0xE8, 0x4B, 0x98, 0x1C, 0x99, +0xDE, 0x98, 0x4C, 0xB1, 0x0A, 0x1E, 0x35, 0x38, +0x0A, 0x82, 0x42, 0x38, 0xF9, 0x97, 0xF9, 0x9D, +0x67, 0xE2, 0x03, 0xF3, 0x01, 0x9C, 0xE1, 0xE8, +0x02, 0xF4, 0x01, 0x96, 0xD2, 0xE8, 0x80, 0xE2, +0xD4, 0xFA, 0xBF, 0xB4, 0x25, 0xEA, 0xAC, 0xFF, +0xB0, 0x99, 0x05, 0xF4, 0x08, 0x00, 0x33, 0x50, +0x70, 0x44, 0x18, 0xAF, 0x02, 0xF5, 0xFF, 0x7F, +0x01, 0x9C, 0x70, 0x42, 0xF2, 0xAD, 0x59, 0xAF, +0xD4, 0x8C, 0x04, 0xF0, 0x03, 0xF4, 0x1A, 0xAE, +0x60, 0x84, 0x1B, 0xAF, 0x01, 0xF4, 0x66, 0xB6, +0x04, 0xB4, 0xA3, 0x80, 0x51, 0x42, 0xE6, 0xB4, +0xE0, 0xE2, 0x73, 0x80, 0x06, 0xB6, 0x02, 0xE8, +0x24, 0x9D, 0xD9, 0x9C, 0xF7, 0x18, 0x38, 0x5A, +0xD4, 0xFA, 0x1F, 0xB4, 0x82, 0xEA, 0x84, 0xFF, +0xD8, 0x8C, 0xB3, 0x99, 0x66, 0xB6, 0x60, 0x84, +0x02, 0xB4, 0x83, 0x80, 0x41, 0x42, 0xE6, 0xB4, +0xE0, 0xE2, 0x73, 0x80, 0x06, 0xB6, 0x02, 0xE8, +0x94, 0x9C, 0xD9, 0x9C, 0xF7, 0x0E, 0x38, 0x5A, +0x44, 0xFF, 0x4D, 0xDD, 0x52, 0x40, 0x08, 0xF2, +0x07, 0xF3, 0xF7, 0x84, 0x32, 0x80, 0x62, 0x50, +0xF6, 0x00, 0x63, 0x40, 0x52, 0x42, 0xEF, 0x95, +0x73, 0x40, 0x24, 0x00, 0xB1, 0x97, 0x16, 0x81, +0x42, 0x40, 0x90, 0xAD, 0x73, 0x50, 0xB7, 0x84, +0xD8, 0xAD, 0x40, 0x80, 0x52, 0x50, 0x3F, 0xB4, +0x52, 0x40, 0x32, 0x00, 0x27, 0x95, 0xF6, 0x80, +0xD1, 0xAC, 0xE9, 0x96, 0x56, 0x00, 0x42, 0x40, +0x14, 0xFA, 0x07, 0xF5, 0x86, 0xEA, 0x0C, 0xFE, +0x42, 0x50, 0x02, 0x98, 0x29, 0xAD, 0x40, 0x00, +0x33, 0x42, 0x06, 0xF4, 0xC3, 0xAC, 0x73, 0x10, +0x41, 0xFC, 0xD9, 0xFC, 0x81, 0xF1, 0x81, 0xB0, +0x91, 0x02, 0x49, 0x96, 0x40, 0x84, 0x01, 0x00, +0x30, 0x38, 0x62, 0x80, 0x92, 0x9C, 0x09, 0x08, +0xFD, 0x32, 0x28, 0x5A, 0x07, 0x00, 0x8C, 0x3C, +0x28, 0x3E, 0x7E, 0x84, 0x15, 0xA5, 0x90, 0x00, +0xC4, 0xE0, 0x99, 0x99, 0x16, 0xA5, 0x1B, 0xE9, +0x18, 0xE9, 0x86, 0xE0, 0x9E, 0x84, 0xA0, 0x80, +0x07, 0x00, 0xA1, 0x02, 0x00, 0x24, 0x72, 0x40, +0x0C, 0xE9, 0xEA, 0xE0, 0x08, 0x00, 0xA1, 0x02, +0x08, 0xE9, 0x47, 0xE1, 0x02, 0x00, 0xA1, 0x02, +0x73, 0x28, 0x73, 0x42, 0x01, 0x1D, 0x74, 0x38, +0x21, 0x9D, 0xE8, 0xAD, 0x48, 0x5A, 0x6A, 0x9D, +0xD9, 0x9C, 0xED, 0x03, 0x38, 0x5A, 0x0A, 0x8C, +0xC1, 0xFC, 0xE0, 0x03, 0x20, 0x84, 0x00, 0xFC, +0x0A, 0x00, 0x30, 0x50, 0x40, 0xAC, 0x40, 0x80, +0x14, 0x00, 0x10, 0x12, 0x50, 0xAC, 0x02, 0x9C, +0x4A, 0x8C, 0x54, 0xAC, 0xF9, 0xFF, 0x01, 0x4C, +0x44, 0xFC, 0x80, 0xFC, 0x40, 0x85, 0x45, 0xDD, +0x90, 0x50, 0x84, 0xF1, 0x20, 0x80, 0x0A, 0x00, +0x14, 0x00, 0x80, 0x50, 0x84, 0x3C, 0x42, 0xD5, +0x14, 0x3C, 0x9F, 0x0C, 0x35, 0x40, 0xA0, 0x0C, +0x64, 0x3C, 0x00, 0x1C, 0x01, 0xF0, 0xA1, 0x0C, +0x01, 0x00, 0x40, 0x2A, 0x02, 0xF0, 0x81, 0xF0, +0x01, 0x00, 0x20, 0x2A, 0x25, 0x38, 0x22, 0x99, +0x82, 0xF0, 0x11, 0x1C, 0x21, 0x22, 0x22, 0x99, +0x62, 0x99, 0x02, 0x80, 0x00, 0x1C, 0x2F, 0x40, +0x02, 0x00, 0x41, 0x22, 0x11, 0x1C, 0x2F, 0x38, +0x24, 0x38, 0x22, 0x99, 0x22, 0x99, 0x11, 0x9C, +0x00, 0x9C, 0x24, 0x40, 0x02, 0x00, 0x21, 0x22, +0x22, 0x98, 0xFA, 0x9D, 0x24, 0x18, 0x30, 0x42, +0x32, 0x42, 0x05, 0xF2, 0x03, 0xF1, 0x73, 0x84, +0x01, 0x80, 0x00, 0x2A, 0x73, 0x20, 0x30, 0x42, +0xD1, 0xAA, 0x83, 0xF1, 0x78, 0x5A, 0x85, 0xF2, +0x09, 0x81, 0xCC, 0x06, 0xAF, 0x04, 0x2A, 0x81, +0x1F, 0x50, 0x07, 0x80, 0x4C, 0x8D, 0x0A, 0x00, +0x0A, 0x8D, 0x2A, 0x8D, 0x17, 0x24, 0xA0, 0x5A, +0x82, 0xF2, 0x8A, 0x9C, 0x00, 0x50, 0x04, 0xF2, +0xE5, 0x41, 0x0C, 0x80, 0x83, 0xF0, 0x00, 0x08, +0x16, 0x80, 0x00, 0x50, 0x07, 0x80, 0xAF, 0x14, +0x05, 0x80, 0xEF, 0x15, 0x81, 0xF0, 0x49, 0x81, +0xE0, 0x84, 0x86, 0xF2, 0xC1, 0x83, 0x28, 0x81, +0x01, 0x84, 0xAB, 0xD5, 0xFC, 0xFF, 0x6F, 0x3E, +0xF4, 0xFF, 0x5F, 0x3E, 0x06, 0xB6, 0x20, 0x84, +0x01, 0x80, 0x05, 0xB6, 0x11, 0xD5, 0x06, 0xF7, +0x04, 0xB4, 0x60, 0x80, 0x03, 0xE9, 0x60, 0xE0, +0x03, 0xD5, 0x03, 0x80, 0x45, 0xB6, 0x26, 0xB6, +0x24, 0x9D, 0x91, 0x9C, 0xF6, 0x03, 0x28, 0x5A, +0xEC, 0x8C, 0x49, 0x9C, 0x06, 0x00, 0x11, 0x4C, +0x60, 0x80, 0x87, 0x80, 0xEE, 0xD5, 0x40, 0x84, +0x49, 0x9E, 0x3F, 0xB9, 0x00, 0x46, 0xBF, 0xB9, +0x3D, 0xB9, 0x80, 0x00, 0xBD, 0xB9, 0x49, 0x9E, +0x53, 0xFC, 0xC4, 0xFC, 0x08, 0xB1, 0xC9, 0xB0, +0x88, 0xF1, 0x89, 0xF0, 0x87, 0xF0, 0x00, 0x96, +0x83, 0xF2, 0x1A, 0xA6, 0x99, 0xA6, 0x86, 0xF0, +0xDB, 0xA6, 0x21, 0xA4, 0x84, 0xF3, 0x85, 0xF2, +0xA0, 0x40, 0x82, 0xF0, 0x8B, 0xB1, 0x13, 0x80, +0x8F, 0x04, 0x18, 0xB1, 0xAF, 0x12, 0x02, 0x80, +0x8F, 0x12, 0x10, 0x80, 0x08, 0xF0, 0x11, 0x80, +0xFF, 0x49, 0x81, 0xF4, 0xAF, 0x12, 0x1D, 0xF9, +0x8F, 0x12, 0x10, 0x80, 0xE0, 0x80, 0x11, 0x80, +0x06, 0x80, 0x08, 0xF1, 0x0F, 0xFF, 0xFF, 0x49, +0x01, 0xF4, 0x2A, 0x81, 0x93, 0xEA, 0x07, 0xCF, +0x04, 0xCA, 0x9E, 0x96, 0xB0, 0xFF, 0x27, 0x2E, +0x06, 0x80, 0x06, 0xC2, 0xFF, 0x49, 0x81, 0xF4, +0x01, 0xF4, 0x37, 0xFF, 0x06, 0x80, 0x24, 0x80, +0xFF, 0x49, 0x81, 0xF4, 0x3D, 0x3C, 0x40, 0xFF, +0x01, 0xF4, 0xFF, 0xFF, 0x2D, 0x3C, 0x04, 0xCB, +0x22, 0xC2, 0xFD, 0xFF, 0x05, 0x40, 0xD9, 0x96, +0x02, 0xF2, 0x00, 0x0C, 0x13, 0x00, 0xA0, 0x40, +0xFA, 0xFF, 0x03, 0x3C, 0x49, 0x96, 0x50, 0x98, +0x07, 0xF1, 0x82, 0xF1, 0x0C, 0xE9, 0x41, 0xE3, +0x06, 0xF1, 0x02, 0xF2, 0x08, 0xE9, 0x41, 0xE2, +0x4A, 0xE2, 0x05, 0xF2, 0x04, 0xF1, 0x05, 0xE9, +0x22, 0xE2, 0x02, 0xF2, 0x02, 0xF1, 0xBB, 0xE8, +0x01, 0x0C, 0x35, 0x40, 0x01, 0x96, 0x08, 0x9A, +0xA1, 0x40, 0x82, 0xF0, 0x21, 0xB0, 0x13, 0x80, +0xFF, 0x49, 0x58, 0xB0, 0x21, 0xF4, 0xD4, 0xFD, +0x32, 0x42, 0x1E, 0x84, 0x41, 0xDD, 0x24, 0x00, +0xD0, 0x00, 0x40, 0x22, 0x22, 0x80, 0x8F, 0x04, +0x24, 0x20, 0x42, 0x42, 0x24, 0x80, 0x8F, 0x04, +0xE3, 0x80, 0xA3, 0x84, 0x73, 0x14, 0x74, 0x42, +0x16, 0x1D, 0x42, 0x40, 0xD1, 0x00, 0x70, 0x22, +0x23, 0x80, 0x8F, 0x04, 0x33, 0x42, 0x25, 0xF6, +0x73, 0x42, 0x73, 0x14, 0x50, 0x22, 0x24, 0xA0, +0x33, 0x40, 0xD0, 0x00, 0x22, 0xFF, 0xD6, 0x8C, +0xA4, 0xE0, 0xDA, 0xFE, 0x01, 0x84, 0x03, 0xE8, +0x00, 0x22, 0x06, 0xD5, 0x02, 0xFE, 0xD0, 0x00, +0x07, 0x00, 0x02, 0x40, 0x9B, 0x0C, 0x64, 0x3C, +0x02, 0xE8, 0xC3, 0xE0, 0x54, 0x3C, 0x06, 0xD5, +0x6A, 0xFF, 0x9A, 0x0C, 0x03, 0xE8, 0x65, 0xE0, +0x02, 0x00, 0x00, 0x58, 0x41, 0x00, 0xF2, 0x5E, +0x40, 0x44, 0x04, 0xE9, 0x05, 0xD5, 0x40, 0x00, +0xC0, 0xFF, 0x5F, 0x44, 0x00, 0x14, 0x42, 0x42, +0x41, 0x80, 0xF1, 0x5E, 0x30, 0x44, 0x04, 0xE9, +0x05, 0xD5, 0x40, 0x00, 0xC0, 0xFF, 0x5F, 0x44, +0x00, 0x94, 0x31, 0x42, 0x08, 0x1C, 0x55, 0x40, +0x02, 0xF1, 0x03, 0xF2, 0x40, 0x80, 0x52, 0x50, +0x10, 0xAD, 0x2C, 0x99, 0x42, 0x50, 0x0F, 0x95, +0xE3, 0x98, 0x40, 0x00, 0x1B, 0x3C, 0xD1, 0xAC, +0xAB, 0x3C, 0xFD, 0xFF, 0xD3, 0xFC, 0xFC, 0xFF, +0x00, 0x84, 0x00, 0xFC, 0x01, 0xFC, 0x80, 0xFC, +0x81, 0xF1, 0x81, 0xB0, 0x48, 0x96, 0x03, 0x96, +0x12, 0xA7, 0x51, 0xA7, 0x05, 0x4E, 0xD3, 0xA6, +0x5B, 0xDD, 0x11, 0x00, 0x16, 0x08, 0x20, 0x40, +0x41, 0xE2, 0x91, 0x96, 0xA2, 0xE2, 0x0A, 0xE9, +0x01, 0x96, 0x08, 0xE9, 0x05, 0xE9, 0x04, 0xE2, +0x06, 0x80, 0x01, 0x40, 0x02, 0xD5, 0x31, 0xEA, +0x81, 0xFC, 0x00, 0x84, 0x07, 0xB1, 0x44, 0xFC, +0x87, 0xF2, 0x84, 0xF0, 0xFF, 0x84, 0xD9, 0x96, +0x86, 0xF3, 0x48, 0x96, 0xAF, 0x04, 0x85, 0xF1, +0x27, 0x81, 0x04, 0x80, 0x83, 0xF7, 0x00, 0x85, +0x14, 0x00, 0x38, 0x3E, 0x05, 0x22, 0x21, 0xD5, +0x05, 0x4E, 0x00, 0x00, 0x24, 0xB4, 0x1A, 0x00, +0x81, 0xF3, 0xC0, 0x80, 0x36, 0xF8, 0x82, 0xF4, +0x02, 0xF4, 0x01, 0xF3, 0x11, 0x01, 0x08, 0x5A, +0xB6, 0x98, 0xA3, 0xB4, 0x4D, 0xEA, 0x6A, 0x99, +0x02, 0xE0, 0x03, 0xF0, 0x4D, 0xEA, 0x09, 0xE8, +0x40, 0xE0, 0x06, 0xF0, 0x76, 0xEA, 0x05, 0xE9, +0x83, 0xF1, 0xE8, 0x80, 0xC9, 0x80, 0x02, 0xD5, +0x42, 0x8D, 0x01, 0x8D, 0x05, 0xF0, 0x26, 0x81, +0xDE, 0xE9, 0x00, 0xE1, 0x06, 0xFF, 0x77, 0x5A, +0x3F, 0x84, 0x04, 0xF0, 0x09, 0x1D, 0x10, 0x38, +0xC4, 0xFC, 0x09, 0x80, 0x03, 0xB1, 0x42, 0xFC, +0x48, 0x97, 0x83, 0xF2, 0x20, 0x81, 0xD9, 0x96, +0x00, 0x85, 0xE1, 0x84, 0x1C, 0xD5, 0x44, 0x80, +0x00, 0x80, 0x64, 0x22, 0x17, 0xFF, 0x67, 0x5A, +0x06, 0x80, 0x22, 0xB4, 0x81, 0xF3, 0x5F, 0xB6, +0xFF, 0x49, 0x82, 0xF5, 0x5F, 0xB4, 0x96, 0xFF, +0x02, 0xF5, 0x01, 0xF3, 0x0B, 0x01, 0x08, 0x5A, +0x05, 0x00, 0x0C, 0x3C, 0x86, 0x99, 0xB6, 0x99, +0x00, 0x00, 0x03, 0x22, 0x02, 0xE9, 0x03, 0xE0, +0x01, 0x8D, 0xF9, 0x9D, 0x05, 0xE1, 0x22, 0x8D, +0x07, 0x80, 0xE4, 0xE9, 0x41, 0xFC, 0xC2, 0xFC, +0x81, 0xF0, 0x41, 0xB0, 0xC6, 0xEA, 0x8A, 0xA6, +0x08, 0xA6, 0xC9, 0xA7, 0x05, 0x00, 0x6C, 0x3C, +0x12, 0xD5, 0x80, 0x84, 0x22, 0x81, 0x65, 0xEA, +0x73, 0x0C, 0x90, 0x42, 0x34, 0x40, 0x22, 0x80, +0xF3, 0x98, 0x00, 0xA4, 0x49, 0x9C, 0x05, 0xD5, +0x01, 0x80, 0x41, 0x1A, 0x01, 0xE3, 0x49, 0x96, +0x01, 0x9C, 0xFB, 0xE8, 0xE0, 0xE2, 0x01, 0x96, +0xC1, 0xFC, 0xEE, 0xE8, 0x38, 0x3E, 0x44, 0xFC, +0x20, 0x84, 0x38, 0x00, 0x28, 0x3E, 0x86, 0xF0, +0x18, 0xA4, 0x44, 0x03, 0x0B, 0x3C, 0x50, 0xAC, +0x44, 0xDD, 0xF0, 0xFF, 0xB0, 0x80, 0x40, 0x02, +0xDD, 0x00, 0x42, 0x4E, 0xF0, 0x80, 0x40, 0x22, +0xD9, 0x00, 0x44, 0x4E, 0x0A, 0x00, 0x01, 0x50, +0x1A, 0x00, 0x41, 0x50, 0x82, 0xF3, 0x85, 0xF0, +0x30, 0x44, 0x00, 0x84, 0x84, 0xF4, 0x6D, 0x01, +0xB6, 0x00, 0x90, 0x44, 0x41, 0x81, 0x83, 0xF3, +0x87, 0xF0, 0x02, 0x81, 0xBD, 0x00, 0x00, 0x48, +0xB3, 0x00, 0x65, 0x22, 0x40, 0x3C, 0x09, 0xC6, +0xC0, 0x84, 0x49, 0x00, 0x8F, 0xEA, 0x81, 0xF4, +0xA6, 0x80, 0xE6, 0x80, 0x35, 0x22, 0x49, 0xD5, +0x8F, 0xEA, 0xB4, 0x00, 0x11, 0x25, 0x25, 0x38, +0x73, 0x0C, 0x2F, 0x42, 0x91, 0x96, 0x06, 0xF3, +0x1A, 0x99, 0x92, 0x98, 0xA6, 0x80, 0xE6, 0x80, +0x15, 0x38, 0x16, 0xD5, 0x69, 0x98, 0x11, 0x25, +0x3A, 0xE8, 0x3E, 0xE0, 0x00, 0x00, 0x22, 0x22, +0x11, 0x22, 0x02, 0xF3, 0x41, 0xE0, 0x00, 0x80, +0x12, 0x22, 0x08, 0xE9, 0xE1, 0xE0, 0x00, 0x00, +0x02, 0xD5, 0x02, 0xE9, 0xC1, 0x84, 0xE0, 0xA5, +0x22, 0x9D, 0x69, 0x9D, 0xB5, 0x00, 0x15, 0x22, +0xE8, 0xE9, 0xA1, 0xE0, 0x15, 0x38, 0x25, 0xD5, +0x01, 0xF4, 0x11, 0x25, 0x24, 0xE0, 0x69, 0x98, +0x15, 0x22, 0x1F, 0xE8, 0x25, 0x38, 0xB4, 0x00, +0xAA, 0x98, 0x11, 0x25, 0x73, 0x08, 0x1F, 0x42, +0x49, 0x96, 0x06, 0xF2, 0x51, 0x98, 0x49, 0x98, +0x00, 0x80, 0x30, 0x22, 0x22, 0x22, 0x02, 0xF4, +0x62, 0xE0, 0x00, 0x00, 0x20, 0x22, 0x08, 0xE9, +0xE2, 0xE0, 0x00, 0x80, 0x02, 0xD5, 0x02, 0xE9, +0xC1, 0x84, 0xC8, 0xA5, 0x15, 0x22, 0x69, 0x9D, +0xA1, 0xE0, 0xB5, 0x00, 0x68, 0x5A, 0xDD, 0xE9, +0x34, 0x00, 0x36, 0x01, 0xD9, 0x9C, 0x02, 0x00, +0x48, 0x2E, 0x5A, 0x97, 0x54, 0x10, 0xD2, 0x0E, +0xA4, 0xE0, 0x02, 0x00, 0x44, 0x10, 0x4B, 0xE9, +0x40, 0x3C, 0x02, 0x00, 0x23, 0x40, 0xA2, 0x01, +0xA7, 0xFE, 0x0C, 0x00, 0xA2, 0x01, 0x28, 0x3C, +0x28, 0x5A, 0x83, 0xEA, 0x27, 0x80, 0x06, 0x01, +0x45, 0x0A, 0x00, 0x49, 0x03, 0xF1, 0x05, 0xD5, +0x05, 0x38, 0x3B, 0x96, 0x04, 0xF2, 0x09, 0x05, +0x00, 0x5A, 0x10, 0xA6, 0xAC, 0xEA, 0x0C, 0x01, +0x9F, 0xFE, 0x7A, 0xEA, 0xCA, 0x0D, 0x28, 0x3C, +0x5B, 0x07, 0x00, 0x3C, 0x01, 0x92, 0x02, 0xF4, +0x04, 0xF1, 0x20, 0xAC, 0x01, 0x84, 0x05, 0xF2, +0x08, 0xAE, 0x61, 0x84, 0x87, 0xF3, 0xD0, 0xAD, +0x04, 0xF4, 0x21, 0xD5, 0x18, 0x5A, 0x60, 0xA6, +0x03, 0xF0, 0x11, 0x01, 0x9B, 0x7E, 0x30, 0x50, +0x0C, 0x8C, 0x10, 0x40, 0xA2, 0x01, 0x30, 0x3C, +0x18, 0x3C, 0x5F, 0xFE, 0xAC, 0xEA, 0xA2, 0x01, +0x9F, 0xFE, 0x7A, 0xEA, 0xCA, 0x0D, 0x28, 0x3C, +0x04, 0xF0, 0x03, 0xF4, 0x20, 0x84, 0x05, 0xF2, +0x09, 0x11, 0x15, 0x38, 0x14, 0x10, 0x40, 0xAE, +0x50, 0xAC, 0x02, 0x00, 0x02, 0xF3, 0xB7, 0xEA, +0x04, 0xF4, 0x58, 0xAC, 0x03, 0xF1, 0x05, 0xF0, +0x21, 0x9D, 0x02, 0xF2, 0x49, 0x9C, 0x02, 0x9C, +0x84, 0xF4, 0x92, 0x9C, 0x83, 0xF1, 0x85, 0xF0, +0x01, 0x8D, 0x82, 0xF2, 0x03, 0xF3, 0x21, 0x8D, +0xB0, 0x00, 0x15, 0x22, 0x93, 0xFE, 0x01, 0x50, +0xF3, 0x4E, 0x01, 0xE0, 0x07, 0xF0, 0x3F, 0xFF, +0x00, 0x84, 0x02, 0xD5, 0x00, 0xFC, 0xC4, 0xFC, +0x41, 0xDD, 0xC0, 0x80, 0xB0, 0x00, 0x10, 0x22, +0x1B, 0x00, 0x17, 0x4E, 0xB4, 0x00, 0x10, 0x22, +0x20, 0x22, 0x17, 0xC9, 0x0B, 0xCA, 0xB3, 0x00, +0xF0, 0x5C, 0x30, 0xA4, 0x03, 0xE8, 0x80, 0x00, +0x0E, 0xD5, 0xB0, 0xAC, 0x80, 0x7F, 0x00, 0x50, +0x0A, 0xD5, 0x30, 0xAC, 0xF0, 0x5C, 0x31, 0xA4, +0x03, 0xE8, 0x80, 0x00, 0x04, 0xD5, 0x71, 0xAC, +0x80, 0x7F, 0x00, 0x50, 0x00, 0x3C, 0x31, 0xAC, +0x70, 0xA4, 0x4B, 0x00, 0x02, 0xE8, 0x01, 0xE2, +0x10, 0x3C, 0x30, 0xAC, 0xB1, 0xA4, 0x4C, 0x00, +0x02, 0xE8, 0x22, 0xE2, 0x47, 0xDD, 0x71, 0xAC, +0xEC, 0x00, 0x41, 0x22, 0x64, 0xE0, 0xF0, 0xA4, +0x21, 0x02, 0x04, 0xE8, 0x09, 0xD5, 0xEC, 0x00, +0xED, 0x00, 0x41, 0x22, 0x83, 0xE0, 0x04, 0x9B, +0x21, 0x02, 0x05, 0xE8, 0x82, 0x9A, 0xED, 0x00, +0x47, 0xDD, 0xB0, 0xAC, 0xEE, 0x00, 0x41, 0x22, +0x64, 0xE0, 0xF1, 0xA4, 0x21, 0x02, 0x04, 0xE8, +0x09, 0xD5, 0xEE, 0x00, 0xEF, 0x00, 0x41, 0x22, +0x83, 0xE0, 0x0C, 0x9B, 0x21, 0x02, 0x05, 0xE8, +0x8A, 0x9A, 0xEF, 0x00, 0xB0, 0xA4, 0xB1, 0xAC, +0x80, 0x00, 0xF1, 0x5C, 0x59, 0xEA, 0x09, 0xE8, +0x34, 0x3C, 0xA2, 0xEA, 0x0E, 0xF8, 0xB6, 0x0C, +0x80, 0x00, 0x21, 0x52, 0x30, 0x50, 0x17, 0xD5, +0x43, 0xE0, 0x81, 0x7F, 0x59, 0xEA, 0x14, 0xE9, +0x80, 0x00, 0x21, 0x50, 0xB7, 0x0C, 0x34, 0x3C, +0x42, 0x52, 0x90, 0x9A, 0x91, 0x96, 0x80, 0x00, +0x31, 0x52, 0xA4, 0xFE, 0x21, 0x40, 0x80, 0x80, +0xFF, 0x83, 0x77, 0x0C, 0x80, 0x7F, 0x30, 0x50, +0xB0, 0xAC, 0x9A, 0x98, 0xF1, 0x5C, 0xB1, 0xA4, +0x09, 0xE8, 0x80, 0x00, 0xA2, 0xEA, 0x59, 0xEA, +0xB8, 0x0C, 0x34, 0x3C, 0xEB, 0xFF, 0x00, 0x4E, +0x10, 0xD5, 0xA2, 0xEA, 0x81, 0xFF, 0x30, 0x50, +0x0D, 0xE9, 0x43, 0xE0, 0x21, 0x50, 0x59, 0xEA, +0x34, 0x3C, 0x80, 0x00, 0x91, 0x9A, 0xB9, 0x0C, +0xDD, 0xFF, 0x00, 0x4E, 0x80, 0xFF, 0x30, 0x50, +0xB1, 0xAC, 0x9A, 0x98, 0x09, 0x04, 0x20, 0x40, +0x41, 0x50, 0xF0, 0xA4, 0x64, 0xE0, 0xE0, 0x7F, +0x50, 0x3C, 0x08, 0xE8, 0x13, 0xC5, 0x94, 0x0C, +0x94, 0x0C, 0x44, 0x3C, 0x0B, 0xD5, 0x14, 0x99, +0x20, 0x00, 0x41, 0x50, 0x0B, 0xE8, 0x83, 0xE0, +0x95, 0x0C, 0x50, 0x3C, 0x44, 0x3C, 0x08, 0xC5, +0x14, 0x9B, 0x95, 0x0C, 0x21, 0x40, 0xE4, 0xFE, +0xB0, 0xAC, 0x76, 0x88, 0x09, 0x84, 0x20, 0x40, +0x41, 0x50, 0xF1, 0xA4, 0x64, 0xE0, 0xE0, 0x7F, +0x50, 0x3C, 0x08, 0xE8, 0x13, 0xC5, 0x96, 0x0C, +0x96, 0x0C, 0x44, 0x3C, 0x0B, 0xD5, 0x14, 0x99, +0x20, 0x00, 0x41, 0x50, 0x0B, 0xE8, 0x83, 0xE0, +0x97, 0x0C, 0x50, 0x3C, 0x44, 0x3C, 0x08, 0xC5, +0x14, 0x9B, 0x97, 0x0C, 0x21, 0x40, 0xE4, 0xFE, +0xB1, 0xAC, 0x76, 0x88, 0x31, 0xA5, 0xF0, 0xA4, +0x30, 0xAD, 0xF1, 0xAC, 0x51, 0x22, 0x47, 0xDD, +0x2C, 0xFF, 0xC0, 0x00, 0x97, 0x04, 0x12, 0x40, +0x70, 0xAC, 0x49, 0x96, 0xC1, 0x00, 0x41, 0x22, +0x01, 0x40, 0xE4, 0xFE, 0x31, 0xAC, 0x77, 0x80, +0xC2, 0x00, 0x01, 0x02, 0x05, 0xC0, 0x04, 0x96, +0xC0, 0x00, 0x01, 0x02, 0x70, 0xAC, 0x41, 0x9A, +0x8C, 0x0C, 0x10, 0x3C, 0x06, 0xC1, 0x4E, 0x96, +0x8B, 0x0C, 0x00, 0x3C, 0x01, 0x9A, 0x71, 0xA4, +0x00, 0x3C, 0x31, 0xAC, 0x16, 0x96, 0x8C, 0x0C, +0x30, 0xA4, 0x05, 0xC0, 0x31, 0xAC, 0x71, 0xA4, +0x07, 0x2E, 0x70, 0xAC, 0x08, 0x5A, 0x9C, 0xFF, +0x06, 0x80, 0x05, 0x01, 0x30, 0x09, 0x00, 0x49, +0x0C, 0xFE, 0x39, 0xF9, 0x01, 0x98, 0x5D, 0xDD, +0x26, 0x80, 0x44, 0x84, 0x80, 0xFC, 0x6D, 0xEA, +0x45, 0xDD, 0x47, 0xFC, 0x0B, 0x3C, 0x00, 0x84, +0x0B, 0x3C, 0xF3, 0xFF, 0x0B, 0x3C, 0xEF, 0xFF, +0x94, 0xEA, 0xF1, 0xFF, 0x68, 0x3E, 0xC5, 0xBF, +0xC7, 0xBE, 0xCC, 0x09, 0x68, 0xEA, 0x5C, 0xEA, +0x2B, 0xF6, 0xFF, 0x49, 0x99, 0xFF, 0x07, 0x3E, +0x9C, 0x01, 0x02, 0x4E, 0x04, 0x96, 0x2B, 0xEA, +0x53, 0xDD, 0x0A, 0xC8, 0x23, 0x38, 0x06, 0xD5, +0x23, 0x38, 0x11, 0x81, 0x01, 0x9C, 0x09, 0x01, +0xFA, 0xE9, 0x01, 0xE0, 0x98, 0xEA, 0xC7, 0xBF, +0x30, 0xA6, 0xCA, 0x8C, 0xB4, 0xA6, 0x72, 0xA6, +0x0F, 0x10, 0xF6, 0xA6, 0x1F, 0x10, 0x28, 0x80, +0x3F, 0x10, 0x29, 0x80, 0x2F, 0x10, 0x2B, 0x80, +0x8D, 0xEA, 0x2A, 0x80, 0x30, 0x3C, 0x0A, 0xF2, +0x68, 0xEA, 0x56, 0x07, 0x82, 0xF0, 0x70, 0xF9, +0x07, 0x4C, 0xFF, 0x85, 0x78, 0x3E, 0x77, 0x81, +0x27, 0xB4, 0x14, 0x00, 0x48, 0x98, 0x00, 0x98, +0x00, 0x80, 0xA0, 0x22, 0x1A, 0x0C, 0x94, 0x3C, +0x43, 0x02, 0x02, 0xF1, 0x83, 0xF0, 0xFD, 0x7F, +0xB6, 0x90, 0x40, 0x40, 0x0E, 0x80, 0x4F, 0x12, +0x0F, 0x80, 0x5F, 0x12, 0xFF, 0x49, 0x07, 0xF0, +0x27, 0xC0, 0x97, 0xF5, 0x08, 0xE8, 0x03, 0xE6, +0x03, 0xF2, 0x87, 0xB4, 0x33, 0xEA, 0x22, 0x99, +0x57, 0x07, 0x40, 0x3C, 0x05, 0xE6, 0x09, 0xD5, +0x87, 0xB4, 0x0A, 0xE8, 0x23, 0x99, 0x03, 0xF3, +0x40, 0x3C, 0x33, 0xEA, 0xA4, 0xE0, 0x58, 0x07, +0x13, 0xD5, 0xBF, 0xE9, 0x08, 0xE8, 0x07, 0xE6, +0x03, 0xF0, 0x87, 0xB4, 0x33, 0xEA, 0x20, 0x99, +0x59, 0x07, 0x40, 0x3C, 0x09, 0xE6, 0xF5, 0xD5, +0x87, 0xB4, 0x08, 0xE8, 0x21, 0x99, 0x03, 0xF1, +0x40, 0x3C, 0x33, 0xEA, 0xEC, 0xD5, 0x5A, 0x07, +0x24, 0x24, 0x35, 0x42, 0x31, 0x40, 0x54, 0xDD, +0x5C, 0xEA, 0x36, 0x84, 0x22, 0x92, 0x85, 0xF1, +0x84, 0xF3, 0xDB, 0x96, 0x03, 0xE8, 0x61, 0xE0, +0x84, 0xF1, 0x4B, 0x96, 0x02, 0xF3, 0x03, 0xF2, +0x54, 0x3C, 0x47, 0xBC, 0xA6, 0xEA, 0x22, 0x0C, +0x11, 0x08, 0x42, 0x38, 0x05, 0x00, 0x8E, 0x3C, +0x99, 0x96, 0x0A, 0xF0, 0x4B, 0xB0, 0x04, 0xF3, +0x81, 0xF5, 0x9F, 0xB6, 0x73, 0xF7, 0xFF, 0x49, +0x7F, 0x00, 0x0B, 0xF0, 0xAF, 0x00, 0x2D, 0x80, +0x83, 0x3C, 0x2C, 0x80, 0x89, 0xF0, 0xEF, 0xFF, +0x01, 0xA8, 0x03, 0x40, 0x01, 0xF5, 0x9F, 0xB4, +0x05, 0xE9, 0x08, 0xE0, 0xEA, 0x8A, 0xF9, 0x9D, +0xEF, 0xFF, 0x7B, 0x3C, 0x2F, 0x80, 0x7F, 0x00, +0x2E, 0x80, 0xAF, 0x00, 0xF1, 0xFF, 0x83, 0x3C, +0x01, 0xA8, 0xE3, 0x41, 0x07, 0x20, 0xFF, 0x40, +0xF9, 0x9D, 0x05, 0xE9, 0x7B, 0x3C, 0xEA, 0x8A, +0x8F, 0x50, 0xF1, 0xFF, 0xC1, 0x9D, 0x01, 0x00, +0x24, 0x1C, 0x74, 0x42, 0x13, 0x80, 0x93, 0x40, +0xF3, 0xFF, 0x73, 0x3C, 0x03, 0xE8, 0xE9, 0xE2, +0xF3, 0xFF, 0x9B, 0x3C, 0x1C, 0x0C, 0x74, 0x3C, +0x8A, 0xF1, 0x0B, 0xF1, 0x17, 0xE8, 0x07, 0xE0, +0x1D, 0x0C, 0x74, 0x3C, 0x07, 0x1C, 0xFF, 0x40, +0x74, 0x3C, 0x12, 0xE8, 0xE9, 0xE0, 0x1E, 0x0C, +0x74, 0x3C, 0x0E, 0xE9, 0x27, 0xE1, 0x21, 0x0C, +0x45, 0xBE, 0x0A, 0xE9, 0xB2, 0x99, 0x03, 0xF2, +0x64, 0x3C, 0x92, 0xEA, 0x63, 0x40, 0x1F, 0x0C, +0x02, 0xD5, 0x07, 0x98, 0x12, 0x42, 0xC1, 0x84, +0x87, 0xEA, 0x24, 0x14, 0x96, 0x90, 0x10, 0x40, +0x0A, 0xF2, 0x05, 0xF3, 0x40, 0x42, 0x68, 0xEA, +0x8D, 0xEA, 0x00, 0x8C, 0xFF, 0x49, 0xE1, 0x96, +0x0A, 0xCE, 0xDB, 0xFC, 0x09, 0x01, 0x00, 0x5A, +0x40, 0x02, 0x44, 0xDD, 0x04, 0xC4, 0x56, 0x80, +0xC1, 0x08, 0x40, 0x3C, 0x4B, 0xDD, 0x56, 0xC4, +0x1F, 0x00, 0x12, 0xC0, 0x0F, 0x00, 0x2D, 0x80, +0x08, 0x9A, 0x2C, 0x80, 0x08, 0xE8, 0x03, 0xE4, +0x2F, 0x80, 0x1F, 0x00, 0x2E, 0x80, 0x0F, 0x00, +0x03, 0xE4, 0x08, 0x9A, 0x21, 0x84, 0x04, 0xE9, +0xAB, 0xFF, 0x17, 0x3E, 0x17, 0x3E, 0x20, 0x84, +0x4B, 0xF8, 0xB0, 0xFF, 0x08, 0xF1, 0x4E, 0xF8, +0x8C, 0xB0, 0x0B, 0xF0, 0x14, 0x3C, 0x4F, 0xF8, +0x3F, 0x00, 0x26, 0x0C, 0x2F, 0x00, 0x2D, 0x80, +0x9A, 0x9A, 0x2C, 0x80, 0x0A, 0xE8, 0x41, 0xE0, +0x27, 0x0C, 0x04, 0x3C, 0x2F, 0x80, 0x2F, 0x00, +0x2E, 0x80, 0x1F, 0x00, 0x20, 0xE0, 0x51, 0x9A, +0x1F, 0x02, 0x09, 0xE9, 0x2F, 0x02, 0x1A, 0x80, +0x0C, 0xB0, 0x1B, 0x80, 0x81, 0xAC, 0x40, 0xAC, +0xF0, 0x46, 0x11, 0xD5, 0x5E, 0xDD, 0x80, 0x00, +0xFF, 0x83, 0x14, 0xFA, 0x82, 0xEA, 0x44, 0xFE, +0x65, 0xEA, 0x4B, 0x98, 0xFC, 0xFF, 0x23, 0x3C, +0xFD, 0xFF, 0x03, 0x3C, 0x73, 0x88, 0x01, 0x42, +0x0C, 0xB0, 0x0B, 0xAC, 0x09, 0xF0, 0x4A, 0xF8, +0x7F, 0x2E, 0x68, 0xF8, 0x4B, 0xF8, 0xAF, 0xFF, +0x07, 0x3E, 0x4C, 0xF8, 0x0F, 0xE4, 0xAF, 0xFF, +0xD7, 0xFE, 0xF3, 0x4E, 0x62, 0x00, 0x00, 0x48, +0x57, 0x3E, 0xA1, 0x84, 0x02, 0xF2, 0xB0, 0xFF, +0x21, 0x81, 0x8C, 0xB1, 0x0A, 0xF0, 0x04, 0xF3, +0x91, 0x96, 0x4B, 0xB0, 0xE2, 0xF7, 0xFF, 0x49, +0x4D, 0xB0, 0x0B, 0xF0, 0xFF, 0x83, 0x88, 0xB0, +0xB8, 0xF9, 0xFF, 0x49, 0x0B, 0xF0, 0x08, 0xF1, +0xFF, 0x49, 0x46, 0x80, 0x14, 0x22, 0x48, 0xFB, +0x2F, 0x00, 0x5C, 0x80, 0x0F, 0x00, 0x2D, 0x80, +0x10, 0x9A, 0x2C, 0x80, 0x0A, 0xE8, 0x01, 0xE0, +0x5D, 0x80, 0x14, 0x22, 0x2F, 0x80, 0x2F, 0x00, +0x2E, 0x80, 0x0F, 0x00, 0x01, 0xE0, 0x10, 0x9A, +0xF2, 0xA4, 0x06, 0xE9, 0xF0, 0xAC, 0x33, 0xA4, +0x0E, 0xD5, 0x31, 0xAC, 0x14, 0xFA, 0x5E, 0xDD, +0x5D, 0xDD, 0x0C, 0xFE, 0x57, 0xEA, 0x41, 0x99, +0xFD, 0xFF, 0x03, 0x3C, 0xFC, 0xFF, 0x13, 0x3C, +0x73, 0x04, 0x02, 0x42, 0x06, 0x80, 0x2B, 0xAC, +0x73, 0xFD, 0xFF, 0x49, 0x1D, 0xF8, 0x0B, 0xF0, +0xAF, 0xFF, 0x7F, 0x2E, 0xDE, 0xFB, 0xFF, 0x49, +0x7C, 0xFE, 0x34, 0xFA, 0x4A, 0x98, 0x86, 0xEA, +0x11, 0x80, 0x00, 0x12, 0x02, 0x96, 0x39, 0x9C, +0x07, 0x3E, 0xFF, 0x83, 0x0F, 0xE4, 0xAF, 0xFF, +0x0A, 0xF2, 0x10, 0xE8, 0x30, 0x3C, 0x8D, 0xEA, +0x68, 0xEA, 0x56, 0x07, 0xE8, 0xFB, 0xFF, 0x49, +0x0F, 0x5A, 0x40, 0x80, 0x09, 0xF0, 0xAD, 0xFF, +0x47, 0xFC, 0xFF, 0x49, 0x75, 0xFE, 0xFF, 0x48, +0xC7, 0xFC, 0x01, 0x84, 0x00, 0x84, 0x00, 0xFC, +0x00, 0x4E, 0x67, 0xEA, 0x94, 0x96, 0xA7, 0x03, +0x01, 0x9C, 0x04, 0xC2, 0xFB, 0x0F, 0x08, 0x5A, +0x42, 0xFC, 0x80, 0xFC, 0x00, 0x84, 0x82, 0xF0, +0x88, 0x3E, 0x83, 0xF1, 0x81, 0xF0, 0x90, 0x0C, +0x80, 0x00, 0x00, 0x48, 0x08, 0xA4, 0x02, 0xF1, +0x00, 0x40, 0x01, 0xF1, 0xA0, 0x54, 0x0E, 0x04, +0xA3, 0x4E, 0x01, 0x00, 0xFF, 0x49, 0x72, 0x00, +0xE0, 0x80, 0xE3, 0xFF, 0x07, 0x4C, 0xEF, 0x85, +0x01, 0xF1, 0x76, 0x80, 0x40, 0x40, 0x01, 0x84, +0x02, 0xF0, 0x0C, 0x04, 0x80, 0xA4, 0x21, 0x84, +0x80, 0xAC, 0xA7, 0xFE, 0x40, 0x40, 0x03, 0xF0, +0x80, 0xA4, 0x0C, 0x9C, 0xA7, 0xFE, 0x67, 0xEA, +0x23, 0x42, 0x80, 0xAC, 0x58, 0xDD, 0x24, 0x84, +0x93, 0x50, 0x90, 0x99, 0x53, 0x50, 0x10, 0x00, +0x3F, 0x84, 0x20, 0x00, 0x14, 0x10, 0x01, 0x84, +0xA2, 0x12, 0x05, 0x80, 0x34, 0xAE, 0x00, 0x80, +0x28, 0xB4, 0x44, 0x84, 0x1A, 0x00, 0x03, 0x50, +0x28, 0x80, 0x26, 0xB6, 0x6D, 0xEA, 0xBF, 0xB6, +0x33, 0x42, 0x07, 0x84, 0x24, 0x02, 0x24, 0x80, +0xD9, 0x9C, 0x02, 0x00, 0x44, 0x04, 0x49, 0xEA, +0x20, 0x38, 0x03, 0x00, 0xBF, 0xB4, 0x09, 0x8F, +0xD9, 0x98, 0xDB, 0x94, 0x01, 0x80, 0xA2, 0x12, +0x19, 0xA9, 0xB3, 0xAC, 0x44, 0x02, 0x89, 0xB6, +0xF4, 0xA6, 0x11, 0x00, 0x30, 0x00, 0x53, 0x50, +0x32, 0x42, 0x32, 0xEA, 0xF4, 0xAE, 0x0D, 0x3C, +0x34, 0x02, 0x87, 0xEA, 0xA4, 0xFE, 0x00, 0x00, +0x45, 0xB6, 0xE4, 0xFE, 0x8A, 0xBB, 0x86, 0x83, +0x04, 0x80, 0x24, 0x00, 0x01, 0x00, 0x34, 0x02, +0xE4, 0xFE, 0x91, 0x9C, 0x8B, 0xBB, 0x92, 0x96, +0x09, 0x00, 0xA3, 0x14, 0x04, 0x80, 0x24, 0x10, +0xD0, 0x0E, 0x38, 0x2E, 0x0E, 0xE9, 0x43, 0xE0, +0x04, 0x80, 0x34, 0x10, 0x34, 0xA6, 0x21, 0x84, +0x19, 0x00, 0xF0, 0x44, 0x0D, 0xBC, 0x00, 0x42, +0x08, 0x2E, 0x34, 0xAE, 0x2A, 0xAC, 0xD1, 0x0E, +0xA2, 0x12, 0x03, 0xD5, 0x01, 0xF0, 0x02, 0x80, +0x24, 0x00, 0x84, 0x50, 0x81, 0xF0, 0x01, 0x9C, +0x01, 0xF1, 0x48, 0xDD, 0xF3, 0x4E, 0x20, 0xE0, +0xC2, 0xFC, 0x7F, 0xFF, 0x00, 0x84, 0x00, 0xFC, +0x0B, 0xD5, 0x26, 0x84, 0x24, 0x04, 0x30, 0x42, +0x94, 0x1B, 0x48, 0x3E, 0x31, 0x00, 0xDC, 0x98, +0xDC, 0x96, 0x09, 0x80, 0x01, 0x9C, 0x06, 0xC3, +0xDF, 0x0B, 0x34, 0x3C, 0xF3, 0xE9, 0x03, 0xE0, +0x42, 0xFC, 0x80, 0xFC, 0x83, 0xF1, 0x49, 0x96, +0x04, 0x00, 0x04, 0x4E, 0x2F, 0xD5, 0x1F, 0x85, +0x00, 0x42, 0x54, 0xFB, 0x77, 0x46, 0x24, 0x28, +0x5D, 0xDD, 0xFF, 0xFF, 0x50, 0x44, 0x39, 0xF8, +0xA0, 0x40, 0x38, 0x00, 0x33, 0x42, 0x00, 0x04, +0x58, 0xDD, 0x24, 0x14, 0x1C, 0xA7, 0xD8, 0x98, +0x1A, 0xC0, 0x24, 0x96, 0x00, 0x40, 0x03, 0xF1, +0x04, 0x96, 0x0E, 0x98, 0x84, 0x92, 0x15, 0xC8, +0x00, 0x00, 0x0C, 0x3C, 0x02, 0x4C, 0x0F, 0x97, +0x0A, 0xB4, 0x10, 0x40, 0x82, 0xF2, 0x23, 0xB4, +0x2E, 0xEA, 0x81, 0xF5, 0x01, 0xF5, 0x02, 0xF2, +0x06, 0xE8, 0x07, 0xE0, 0x83, 0x40, 0x02, 0xB6, +0xE0, 0x80, 0x10, 0x00, 0xB1, 0x9D, 0xFF, 0x83, +0xDF, 0x0F, 0x68, 0x5A, 0xC2, 0xFC, 0x08, 0x80, +0x49, 0x96, 0x43, 0xFC, 0x04, 0x4E, 0x85, 0xF1, +0x1F, 0x85, 0x04, 0x00, 0x40, 0x44, 0x38, 0xD5, +0x24, 0xFE, 0x38, 0x00, 0xFF, 0xFF, 0x77, 0x46, +0x98, 0x3E, 0x49, 0xEA, 0x1F, 0x85, 0xB2, 0x0C, +0xFF, 0x8F, 0x73, 0x58, 0xFF, 0x83, 0xC0, 0x84, +0xAF, 0xFF, 0x3F, 0x3E, 0x01, 0x99, 0xB4, 0xFA, +0x05, 0xF1, 0x22, 0xD5, 0x0E, 0x98, 0x00, 0x40, +0x1A, 0xC8, 0x04, 0x96, 0x00, 0x80, 0x04, 0x00, +0x00, 0x00, 0x1C, 0x3C, 0x15, 0x40, 0x10, 0x4C, +0x24, 0x14, 0x03, 0x42, 0x01, 0x98, 0x5D, 0xDD, +0x24, 0xB4, 0x00, 0xB4, 0x84, 0xF3, 0x82, 0xF2, +0x83, 0xF5, 0x81, 0xF4, 0x02, 0xF2, 0x2E, 0xEA, +0x01, 0xF4, 0x04, 0xF3, 0x07, 0xE0, 0x03, 0xF5, +0x00, 0x4E, 0x03, 0xE8, 0xB1, 0x9D, 0xC1, 0xFF, +0x24, 0x80, 0x94, 0x50, 0x00, 0x80, 0x01, 0x20, +0xDC, 0xE9, 0xC0, 0xE0, 0xC3, 0xFC, 0x08, 0x80, +0x45, 0xDD, 0x42, 0xFC, 0xC0, 0xBF, 0xE0, 0x84, +0x07, 0x80, 0x7F, 0x12, 0x06, 0x80, 0x7F, 0x12, +0x07, 0x81, 0xC7, 0x80, 0x04, 0x42, 0x5E, 0xEA, +0x49, 0xF8, 0x24, 0x28, 0x03, 0xC0, 0x04, 0x96, +0xB0, 0x97, 0xB1, 0x9D, 0x28, 0x3E, 0x61, 0x80, +0x7B, 0x99, 0x94, 0x11, 0x3E, 0xEA, 0x3A, 0x99, +0x73, 0x50, 0x01, 0x8D, 0xC8, 0xF8, 0x38, 0x80, +0xEF, 0x0F, 0x88, 0x5A, 0x48, 0xDD, 0x19, 0xCE, +0x17, 0x00, 0x07, 0x4E, 0x1F, 0x50, 0x03, 0xB0, +0xFF, 0x49, 0x0E, 0x80, 0x20, 0x84, 0xC4, 0xFE, +0x88, 0x21, 0x28, 0x3E, 0xAF, 0xFF, 0x3F, 0x2E, +0x07, 0x80, 0x9F, 0x02, 0x20, 0x00, 0x01, 0x50, +0x38, 0x00, 0x80, 0x44, 0xFF, 0x84, 0xA1, 0x80, +0x00, 0x48, 0x81, 0x80, 0x48, 0xDD, 0xDB, 0x01, +0xD1, 0x01, 0x03, 0x4E, 0xCF, 0x01, 0x63, 0x4E, +0x88, 0x21, 0x08, 0x3E, 0x48, 0x03, 0x30, 0x50, +0x5F, 0x84, 0x26, 0x80, 0xF0, 0x7F, 0x10, 0x10, +0x60, 0x12, 0x40, 0xAE, 0x81, 0xAE, 0x10, 0x00, +0x01, 0x4C, 0x4E, 0xEA, 0x00, 0x48, 0xF9, 0xFF, +0x0F, 0x02, 0xED, 0x01, 0x00, 0x40, 0x07, 0x80, +0x04, 0x96, 0x0E, 0x1C, 0x5E, 0xEA, 0x0F, 0xC8, +0x24, 0xA8, 0x03, 0x42, 0x01, 0x98, 0x49, 0xEA, +0xFF, 0x83, 0x04, 0xA6, 0x06, 0xC1, 0x44, 0x96, +0x40, 0xB9, 0x04, 0x92, 0x00, 0x4C, 0x0F, 0x96, +0xF9, 0x9D, 0x08, 0x80, 0xEA, 0xE9, 0xEF, 0xE4, +0x77, 0x4C, 0xEF, 0x85, 0x1F, 0x02, 0xA0, 0x81, +0x45, 0x80, 0x06, 0x80, 0x81, 0xF5, 0x07, 0x80, +0x01, 0xF5, 0x1A, 0xF8, 0xFF, 0x85, 0x00, 0x81, +0x95, 0x81, 0x87, 0x4C, 0x07, 0x80, 0x1F, 0x02, +0x08, 0x80, 0x45, 0x80, 0xFF, 0x49, 0x81, 0xF5, +0xC0, 0x80, 0x12, 0xFF, 0x70, 0x4C, 0x01, 0xF5, +0xFF, 0x85, 0xBF, 0x01, 0x87, 0x81, 0x07, 0x4C, +0x87, 0x4C, 0xFF, 0x85, 0x1F, 0x02, 0x84, 0x81, +0x45, 0x80, 0x06, 0x80, 0x3A, 0xFF, 0xFF, 0x49, +0x80, 0x4C, 0x01, 0xF5, 0xE6, 0x80, 0x05, 0x00, +0xE2, 0xD5, 0x00, 0x81, 0x07, 0x80, 0x1F, 0x02, +0x31, 0x40, 0x41, 0x84, 0xCF, 0xFE, 0x0C, 0x18, +0x06, 0x80, 0x1F, 0x02, 0x07, 0x80, 0x3F, 0x12, +0x0C, 0x20, 0x31, 0x40, 0x5E, 0xEA, 0xCF, 0xFE, +0x06, 0x80, 0x3F, 0x12, 0x58, 0xDD, 0x5F, 0xEA, +0x40, 0x84, 0x58, 0x98, 0x20, 0x50, 0x8C, 0xAE, +0xD4, 0xA6, 0x10, 0x80, 0xDA, 0x96, 0xD9, 0x9C, +0x48, 0x2E, 0xD4, 0xAE, 0x64, 0xE0, 0xD0, 0x0E, +0x12, 0x01, 0xF3, 0x4E, 0x01, 0x84, 0x14, 0xAF, +0xD1, 0x0E, 0x78, 0x2E, 0x70, 0x12, 0x20, 0x99, +0xC6, 0x95, 0x1A, 0x80, 0x32, 0x4C, 0xCC, 0xAF, +0x47, 0xDD, 0x15, 0x41, 0x31, 0x22, 0x4C, 0xEA, +0xC8, 0xA5, 0xC7, 0x00, 0xF2, 0x4E, 0xE3, 0xE0, +0x31, 0x22, 0x0D, 0x01, 0x4C, 0x3C, 0x4B, 0x01, +0x64, 0xE0, 0x63, 0x04, 0x06, 0x01, 0xF3, 0x4E, +0x4B, 0x01, 0x31, 0x22, 0x1D, 0x03, 0x4C, 0x3C, +0xF3, 0x4E, 0x64, 0xE0, 0x31, 0x22, 0xFF, 0x00, +0xEF, 0x05, 0xC6, 0x00, 0xFF, 0x40, 0x02, 0x80, +0xF3, 0x4E, 0x07, 0x0C, 0x37, 0x2E, 0xE1, 0x00, +0x1C, 0xCB, 0xAE, 0xFF, 0x28, 0x3E, 0xC3, 0x80, +0x49, 0xEA, 0x94, 0x11, 0x31, 0x99, 0x72, 0x99, +0x63, 0x50, 0x3E, 0xEA, 0xC7, 0xEA, 0x38, 0x00, +0xC7, 0xEA, 0x3E, 0xEA, 0xC7, 0xEA, 0x3E, 0xEA, +0x00, 0x84, 0x02, 0x3A, 0x20, 0x04, 0x02, 0x3A, +0x6B, 0x5A, 0xFF, 0x83, 0x21, 0x84, 0xEE, 0x48, +0xAE, 0xFF, 0x17, 0x3E, 0x06, 0x00, 0xEE, 0x3D, +0x11, 0x22, 0x33, 0xD5, 0x46, 0xBB, 0xC7, 0x00, +0x0A, 0x88, 0x01, 0x40, 0x03, 0xE8, 0x20, 0xE0, +0x04, 0xD5, 0xC3, 0x98, 0xC7, 0x00, 0x11, 0x22, +0xC6, 0xBB, 0xCB, 0x98, 0x7E, 0xE0, 0x46, 0xBB, +0xFE, 0xE0, 0x0D, 0xE8, 0x5F, 0xEA, 0x06, 0xE8, +0xD8, 0x98, 0x58, 0xDD, 0x10, 0x80, 0xE1, 0x13, +0x69, 0xEA, 0x5F, 0xEA, 0x00, 0x48, 0x5A, 0x98, +0x30, 0x3C, 0xB7, 0x00, 0x18, 0xC3, 0xC1, 0x08, +0xD9, 0x9D, 0x49, 0xBB, 0x62, 0xE4, 0xC9, 0xBF, +0xC0, 0x84, 0x13, 0xE8, 0x94, 0x11, 0xA8, 0x3E, +0x53, 0x40, 0x36, 0xEA, 0x33, 0x99, 0x00, 0x28, +0x63, 0x50, 0x3E, 0xEA, 0x00, 0x4E, 0x38, 0x00, +0x6B, 0x5A, 0xC0, 0xFF, 0x00, 0x84, 0xF5, 0x48, +0x00, 0x48, 0xC9, 0xB8, 0x00, 0x84, 0x10, 0x01, +0xAE, 0xFF, 0x07, 0x3E, 0xD3, 0xB9, 0x20, 0x84, +0xFF, 0x49, 0x81, 0xF5, 0xE0, 0x80, 0xAD, 0xFD, +0x0F, 0xE4, 0x01, 0xF5, 0x9F, 0xEA, 0x05, 0xE9, +0x3B, 0x80, 0x77, 0x04, 0x6A, 0x80, 0xC9, 0xF8, +0x24, 0x0C, 0x13, 0x42, 0x74, 0x21, 0xA8, 0x3E, +0xCC, 0xA6, 0x2A, 0x88, 0xF0, 0x44, 0x01, 0x84, +0x30, 0x42, 0x1C, 0x00, 0xCC, 0xAE, 0x0D, 0x3C, +0x60, 0x84, 0x40, 0x84, 0x10, 0x80, 0x20, 0x12, +0x1A, 0x80, 0x20, 0x12, 0x14, 0x80, 0x30, 0x10, +0x0C, 0x1C, 0x10, 0x40, 0x07, 0x80, 0x3F, 0x02, +0x5F, 0xFE, 0x5E, 0xEA, 0x07, 0x80, 0x1F, 0x12, +0x24, 0xA8, 0x13, 0x42, 0x88, 0x99, 0x58, 0xDD, +0x20, 0x00, 0xA3, 0x50, 0x00, 0x00, 0x25, 0x12, +0x10, 0x00, 0x93, 0x50, 0x14, 0x10, 0x3F, 0x84, +0x9F, 0xEA, 0x05, 0x80, 0x3B, 0x80, 0x17, 0x04, +0xF0, 0x44, 0x61, 0x84, 0x85, 0xEA, 0x1F, 0x00, +0x34, 0xFA, 0x74, 0xAE, 0x24, 0x04, 0x24, 0x42, +0x81, 0x40, 0x25, 0xEA, 0x28, 0xB4, 0x00, 0x00, +0x26, 0xB6, 0x44, 0x84, 0x1A, 0x00, 0x03, 0x50, +0x81, 0xF5, 0x28, 0x80, 0x07, 0x84, 0x6D, 0xEA, +0x24, 0x02, 0x3C, 0xFE, 0x36, 0xEA, 0x02, 0x00, +0x21, 0x38, 0x01, 0x9C, 0x14, 0x04, 0x09, 0x83, +0x03, 0x94, 0x03, 0x00, 0x60, 0x84, 0x03, 0x98, +0x01, 0x00, 0x35, 0x12, 0x41, 0xA8, 0xB3, 0xAC, +0x34, 0x02, 0x29, 0xB6, 0x34, 0xA6, 0x11, 0x00, +0x01, 0x00, 0x14, 0x02, 0x00, 0x00, 0x44, 0x02, +0x01, 0x42, 0x32, 0xEA, 0x52, 0xEA, 0x0D, 0xBC, +0x9C, 0xFE, 0x5C, 0xFE, 0x13, 0x14, 0x1C, 0xFF, +0x40, 0x85, 0x0B, 0x00, 0x30, 0x00, 0x13, 0x50, +0xA3, 0x14, 0x41, 0xB6, 0x43, 0x14, 0x09, 0x00, +0x20, 0x2E, 0x0A, 0x00, 0x24, 0x10, 0xD0, 0x0E, +0x41, 0x85, 0x04, 0x80, 0xD1, 0x0E, 0x28, 0x2E, +0x19, 0x00, 0xF0, 0x44, 0x0D, 0x3C, 0x05, 0x42, +0x34, 0xAE, 0x8A, 0xAC, 0x77, 0x04, 0x9F, 0xEA, +0x4D, 0xD5, 0x3B, 0x80, 0x03, 0xE8, 0xFE, 0xE0, +0x00, 0x80, 0xE0, 0x13, 0x36, 0xEA, 0xB8, 0xEA, +0x09, 0xD5, 0x4B, 0x98, 0x02, 0xF3, 0x4C, 0xEA, +0x83, 0xE0, 0x08, 0xA5, 0xC8, 0xAC, 0x02, 0xE8, +0x48, 0x98, 0xB8, 0xEA, 0x1A, 0x80, 0x00, 0x50, +0x81, 0xF5, 0x44, 0x84, 0x01, 0xF5, 0x6D, 0xEA, +0x69, 0xEA, 0x5F, 0xEA, 0x41, 0x02, 0xDA, 0x98, +0x53, 0xB9, 0x10, 0x80, 0x02, 0xE8, 0x24, 0xE0, +0x6A, 0x80, 0xD3, 0xBC, 0x24, 0x0C, 0x13, 0x42, +0x2A, 0x88, 0x42, 0x81, 0x40, 0xBC, 0xCC, 0xA6, +0x01, 0x80, 0x31, 0x58, 0x32, 0x42, 0x32, 0xEA, +0xCC, 0xAE, 0x0D, 0x3C, 0x24, 0x42, 0x74, 0xFA, +0x25, 0xEA, 0x24, 0x0C, 0x62, 0xB4, 0x90, 0x98, +0x67, 0x84, 0x61, 0xB6, 0xF4, 0xFE, 0x12, 0xA5, +0xD9, 0x9C, 0x0B, 0xAD, 0x45, 0x38, 0x30, 0x8C, +0x93, 0xA0, 0x09, 0x0F, 0x01, 0xB4, 0xDB, 0x94, +0x99, 0xA8, 0x6A, 0x88, 0x02, 0xE8, 0x02, 0xE0, +0xB0, 0x97, 0x41, 0xB6, 0x81, 0xF5, 0x06, 0x80, +0x97, 0x01, 0x00, 0x49, 0x00, 0x49, 0x06, 0x80, +0xE0, 0x84, 0x7E, 0x01, 0xFF, 0x48, 0x01, 0xF5, +0x40, 0xB9, 0x4A, 0xFE, 0xC0, 0xB9, 0x49, 0x9C, +0x42, 0xB1, 0x02, 0xD5, 0x06, 0x4E, 0x40, 0xB8, +0xE0, 0x84, 0x17, 0xFE, 0x54, 0xFE, 0xFF, 0x48, +0x0E, 0x84, 0x64, 0x40, 0x1D, 0xCE, 0xB4, 0x97, +0x24, 0xA0, 0x60, 0x42, 0x74, 0x21, 0xA8, 0x3E, +0xB4, 0xA7, 0xCA, 0x88, 0x0B, 0x18, 0xA3, 0x42, +0x0D, 0x00, 0xA2, 0x4E, 0x0A, 0xC6, 0xB4, 0x97, +0xB1, 0x9F, 0x80, 0xA5, 0x80, 0xAD, 0xB3, 0x97, +0x05, 0x00, 0x67, 0x4E, 0xDA, 0x96, 0xD9, 0x9C, +0x50, 0x10, 0x08, 0xD5, 0x50, 0xAF, 0xD0, 0x7F, +0x40, 0x12, 0xD1, 0xAF, 0x00, 0xAD, 0xF6, 0x7F, +0x21, 0x50, 0x49, 0x9C, 0x4E, 0xEA, 0x38, 0x00, +0xDC, 0x0F, 0x18, 0x5A, 0xAF, 0xFF, 0x37, 0x3E, +0xC2, 0xFC, 0x01, 0x84, 0x87, 0x4C, 0xFF, 0x85, +0xC8, 0xD5, 0x53, 0xFE, 0x14, 0x3C, 0x44, 0xFC, +0x16, 0x4E, 0xFF, 0x0B, 0x21, 0x84, 0x05, 0x00, +0xFF, 0x0B, 0x18, 0x3C, 0x89, 0x21, 0x08, 0x3E, +0x10, 0x50, 0x40, 0x84, 0x82, 0xF0, 0xF7, 0x7F, +0x83, 0xF2, 0x85, 0xF1, 0xA0, 0x50, 0x84, 0xF2, +0x9B, 0xEA, 0x13, 0x00, 0x94, 0x1B, 0x48, 0x3E, +0x00, 0x44, 0x04, 0xF3, 0x11, 0x42, 0x38, 0x00, +0x69, 0xEA, 0x24, 0x80, 0x4C, 0xA6, 0x4A, 0x98, +0x22, 0x4E, 0x8C, 0x96, 0x10, 0x42, 0xB8, 0x00, +0x12, 0x4E, 0x0B, 0x98, 0x02, 0xF3, 0xB4, 0x00, +0xFF, 0x0B, 0x64, 0x3C, 0x00, 0x80, 0x81, 0x20, +0x02, 0x00, 0x35, 0x04, 0x61, 0x40, 0x27, 0xEA, +0xF3, 0x5C, 0x57, 0x18, 0x04, 0xE9, 0x00, 0x01, +0xFF, 0x00, 0x60, 0x44, 0x02, 0xCE, 0x03, 0xD5, +0x87, 0x5A, 0xC1, 0x84, 0x8F, 0x5A, 0x52, 0xFF, +0x00, 0x48, 0x04, 0x80, 0xE0, 0xA4, 0x9C, 0x00, +0x21, 0x58, 0x26, 0x84, 0xA0, 0xAC, 0x00, 0x89, +0x24, 0x42, 0x04, 0xF0, 0x38, 0x3E, 0x24, 0x04, +0x67, 0xEA, 0x94, 0x1B, 0xFA, 0x9D, 0xD3, 0x99, +0x24, 0x04, 0x20, 0x42, 0x93, 0x98, 0x36, 0xEA, +0xFF, 0x83, 0x94, 0xA6, 0x31, 0x40, 0x21, 0x85, +0x29, 0x80, 0x09, 0x10, 0x85, 0xEA, 0x32, 0xEA, +0x9F, 0xB6, 0x7F, 0xAE, 0x81, 0xF5, 0x6A, 0xB4, +0x35, 0x04, 0x27, 0xEA, 0x2F, 0x12, 0x01, 0x00, +0x27, 0xEA, 0x0E, 0x80, 0x0F, 0x80, 0x2F, 0x12, +0x0F, 0x12, 0x39, 0xA4, 0x07, 0xF0, 0x0C, 0x80, +0x1F, 0x12, 0x7A, 0xA4, 0x06, 0xF1, 0x0D, 0x80, +0x20, 0x3C, 0x2E, 0xEA, 0x9F, 0xB4, 0x6A, 0x07, +0x40, 0xE0, 0x01, 0xF5, 0xE0, 0xA4, 0x14, 0xE8, +0x04, 0x80, 0x21, 0x58, 0x7F, 0xA6, 0xA0, 0xAC, +0x1D, 0x00, 0xF0, 0x44, 0x0D, 0xBC, 0x14, 0x42, +0x6A, 0xB4, 0x7F, 0xAE, 0x35, 0x04, 0x27, 0xEA, +0xFF, 0x83, 0x01, 0x00, 0xB9, 0xAC, 0xBE, 0xAF, +0xBA, 0xAC, 0x27, 0xEA, 0x28, 0x5A, 0x83, 0xEA, +0x08, 0x80, 0x3F, 0x01, 0x9F, 0xB6, 0x35, 0xD5, +0xFF, 0x49, 0x81, 0xF5, 0x24, 0x3C, 0xAD, 0xFC, +0x00, 0x81, 0xDF, 0x0B, 0x01, 0xF5, 0x9F, 0xB4, +0x07, 0x40, 0x01, 0x4C, 0x1F, 0x44, 0x02, 0xF0, +0x40, 0xAE, 0x80, 0xFF, 0xE0, 0xA4, 0x3F, 0xD5, +0x21, 0x58, 0x02, 0xF1, 0xA0, 0xAC, 0x03, 0x88, +0x08, 0xAE, 0x66, 0x84, 0x24, 0x0C, 0x20, 0x42, +0x94, 0x1B, 0x18, 0x3E, 0xD1, 0x99, 0x04, 0xF3, +0x21, 0x42, 0x67, 0xEA, 0x36, 0xEA, 0x24, 0x84, +0x94, 0xA6, 0x93, 0x98, 0x31, 0x40, 0x23, 0x84, +0x32, 0xEA, 0x09, 0x10, 0x13, 0x10, 0x85, 0xEA, +0x00, 0x4E, 0x09, 0x80, 0x63, 0x10, 0xC8, 0xFF, +0xBA, 0xAC, 0x08, 0x80, 0xBB, 0xAC, 0x27, 0xEA, +0x28, 0x5A, 0x83, 0xEA, 0x9F, 0xB6, 0x09, 0x01, +0x00, 0x49, 0x81, 0xF5, 0x9F, 0xB4, 0x33, 0x03, +0x09, 0xD5, 0x01, 0xF5, 0x34, 0x50, 0x05, 0xF0, +0x20, 0x22, 0xC0, 0x01, 0x44, 0xDD, 0x00, 0x00, +0x09, 0x8D, 0x20, 0x38, 0x21, 0x84, 0xA2, 0xA6, +0xA2, 0xAE, 0x91, 0x9C, 0x10, 0x40, 0x03, 0xF2, +0x00, 0x40, 0x0C, 0xA0, 0x01, 0x96, 0x04, 0x88, +0x04, 0xF3, 0x83, 0xF0, 0x05, 0xF1, 0x02, 0xF0, +0x4E, 0xEA, 0xD9, 0x9C, 0x38, 0x80, 0x10, 0x50, +0x82, 0xF0, 0x84, 0xF3, 0xA5, 0x50, 0x85, 0xF1, +0xEF, 0x85, 0x38, 0x00, 0x32, 0xFF, 0x37, 0x4C, +0x94, 0x1B, 0x28, 0x3E, 0x50, 0xA4, 0x00, 0x84, +0x49, 0x8C, 0xC6, 0x87, 0x94, 0x17, 0xA8, 0x3E, +0xE1, 0x84, 0x20, 0x81, 0x41, 0x40, 0x03, 0xF3, +0x24, 0x97, 0x0E, 0x80, 0x30, 0x42, 0x1A, 0xCC, +0x58, 0x3E, 0x24, 0x78, 0xDD, 0x98, 0x94, 0x1B, +0x5F, 0xA7, 0xDA, 0x9C, 0x03, 0xCD, 0x6C, 0x97, +0x0F, 0xD5, 0x50, 0xAF, 0xC0, 0x01, 0x50, 0x50, +0x09, 0x15, 0x45, 0x38, 0x00, 0x00, 0x91, 0x10, +0x09, 0x80, 0x10, 0x58, 0xF0, 0x44, 0x1F, 0xA7, +0x43, 0x42, 0x1C, 0x00, 0x1F, 0xAF, 0x0D, 0xBC, +0x96, 0x9C, 0x01, 0x9C, 0xE0, 0x0A, 0x08, 0x5A, +0x40, 0xAC, 0x9A, 0xEA, 0x00, 0x88, 0x10, 0x54, +0x43, 0xA6, 0x05, 0xC1, 0x04, 0xFF, 0x10, 0x5A, +0x43, 0xAE, 0x49, 0x9C, 0x00, 0xFC, 0xC4, 0xFC, +0xAC, 0x0E, 0x28, 0x3E, 0xD7, 0xA4, 0x5E, 0x8C, +0x09, 0xA0, 0x41, 0x40, 0x03, 0xE8, 0x81, 0xE2, +0x06, 0xD5, 0x21, 0x84, 0x61, 0xE2, 0xD8, 0x96, +0x56, 0xA4, 0x05, 0xE8, 0x20, 0xB6, 0x28, 0x92, +0x96, 0xA4, 0x0C, 0xD5, 0x64, 0xFE, 0x10, 0x97, +0x30, 0x40, 0x48, 0x92, 0xE3, 0x9A, 0x37, 0x8C, +0x62, 0xE2, 0x60, 0xB6, 0x40, 0xB6, 0x02, 0xE8, +0x03, 0xC9, 0x20, 0xB4, 0x20, 0xB6, 0x21, 0x84, +0x00, 0xFC, 0x80, 0xFC, 0x38, 0x00, 0x20, 0x44, +0x14, 0xFE, 0x00, 0x96, 0x02, 0x98, 0x69, 0xEA, +0x20, 0x50, 0x03, 0xA5, 0x10, 0x3C, 0x30, 0x00, +0x4D, 0xDD, 0x6D, 0x07, 0x24, 0xFE, 0xA2, 0xB4, +0x01, 0x42, 0xC9, 0x9E, 0x00, 0x40, 0x73, 0x94, +0x02, 0xB6, 0x37, 0x04, 0x41, 0xFC, 0x80, 0xFC, +0x38, 0x00, 0x70, 0x44, 0xFF, 0x00, 0x90, 0x54, +0x24, 0x9C, 0x74, 0x42, 0xF8, 0x99, 0x58, 0xDD, +0x0A, 0xB8, 0x87, 0x83, 0x00, 0x40, 0x54, 0xDD, +0x1F, 0x81, 0x57, 0x04, 0x00, 0x80, 0x0F, 0x12, +0x00, 0x40, 0x0B, 0xB8, 0x0F, 0x12, 0x37, 0x04, +0x3F, 0xB4, 0x01, 0x80, 0x2E, 0xEA, 0x07, 0xB4, +0x3F, 0xB4, 0xC0, 0x80, 0x1A, 0x80, 0x03, 0x50, +0x00, 0x00, 0x00, 0x3A, 0x55, 0xDD, 0x2E, 0xEA, +0x00, 0x10, 0x00, 0x54, 0x44, 0xDD, 0x1F, 0xC0, +0x02, 0xE4, 0x56, 0xEA, 0x73, 0x50, 0x1B, 0xE9, +0x67, 0xB4, 0x24, 0x80, 0x09, 0xE8, 0xC3, 0xE2, +0x01, 0x9E, 0x56, 0xEA, 0x73, 0x0C, 0x60, 0x42, +0x63, 0x40, 0x56, 0xEA, 0x0D, 0xD5, 0x17, 0x00, +0xCE, 0x80, 0x40, 0x22, 0x56, 0xEA, 0x42, 0x84, +0x56, 0x08, 0x12, 0x40, 0x60, 0x42, 0x49, 0x9E, +0x63, 0x40, 0x73, 0x8C, 0xC1, 0x92, 0x17, 0x00, +0x01, 0xB0, 0xC7, 0xB6, 0xFF, 0x49, 0x26, 0x80, +0x20, 0x44, 0x84, 0xFF, 0x24, 0x42, 0x38, 0x00, +0x58, 0xDD, 0x24, 0x88, 0x02, 0x80, 0x90, 0x98, +0x16, 0x00, 0x30, 0x0A, 0x51, 0x50, 0x01, 0xF4, +0x54, 0xDD, 0x28, 0x00, 0xCC, 0xFE, 0xE5, 0xB4, +0x33, 0x42, 0xA1, 0x9F, 0x91, 0xA4, 0x73, 0x1C, +0xF7, 0x90, 0x31, 0x40, 0x65, 0xB6, 0x54, 0xFE, +0x13, 0x42, 0x60, 0xB4, 0x10, 0x40, 0x73, 0x0C, +0x20, 0xB6, 0x97, 0x90, 0x00, 0xFC, 0xC1, 0xFC, +0x00, 0xFC, 0x80, 0xFC, 0xE9, 0xFF, 0x03, 0x3C, +0x13, 0x3C, 0x25, 0xC0, 0xC9, 0x9C, 0xEE, 0xFF, +0xEE, 0xFF, 0x3B, 0x3C, 0x1E, 0xE9, 0x20, 0xE2, +0x00, 0x46, 0x72, 0xEA, 0x59, 0xDD, 0x03, 0x01, +0x52, 0xDD, 0x44, 0xEA, 0x20, 0x84, 0x55, 0xEA, +0x4A, 0x0C, 0x18, 0x3C, 0x8C, 0x00, 0x20, 0x46, +0x4B, 0x0C, 0x18, 0x3C, 0x00, 0x58, 0x57, 0xDD, +0x20, 0xB6, 0x04, 0x00, 0x50, 0xAC, 0x20, 0xB6, +0x8C, 0x00, 0x20, 0x46, 0x02, 0x00, 0x21, 0x58, +0x21, 0x84, 0x50, 0xAC, 0x20, 0xB6, 0x20, 0xB6, +0x80, 0xFC, 0x83, 0xF9, 0x80, 0x97, 0x40, 0xFC, +0x59, 0xDD, 0x70, 0xEA, 0x94, 0x1B, 0x28, 0x3E, +0x52, 0xDD, 0x44, 0xEA, 0x00, 0x00, 0x01, 0x22, +0x01, 0x12, 0x58, 0xEA, 0x01, 0x02, 0x80, 0x80, +0x06, 0xC0, 0x19, 0x80, 0x19, 0x80, 0x01, 0x02, +0x07, 0x4C, 0xE2, 0x85, 0x10, 0x2E, 0x78, 0xC0, +0x08, 0x2E, 0x97, 0x1B, 0x71, 0x50, 0x96, 0x1B, +0x00, 0x40, 0xF4, 0x80, 0x03, 0x96, 0x04, 0x05, +0x03, 0xCE, 0x3F, 0xAC, 0x12, 0xD5, 0x46, 0x80, +0x00, 0x46, 0x55, 0xEA, 0x20, 0x84, 0x00, 0x01, +0x41, 0xA8, 0x41, 0xA8, 0x8C, 0x00, 0x00, 0x46, +0x40, 0xAC, 0x7E, 0xA4, 0x8C, 0x00, 0x00, 0x46, +0x00, 0x58, 0x7F, 0xA4, 0x40, 0xAC, 0x02, 0x00, +0x18, 0x3E, 0x42, 0x84, 0x40, 0x44, 0x9A, 0x1B, +0x00, 0x84, 0x82, 0x00, 0x48, 0xD5, 0x58, 0xEA, +0xFF, 0xFF, 0x50, 0x02, 0x71, 0x38, 0xEB, 0x97, +0xE1, 0x9D, 0x09, 0x91, 0x00, 0x80, 0x80, 0x22, +0x09, 0x9D, 0x81, 0x38, 0x02, 0x00, 0x82, 0x50, +0x90, 0x00, 0xCA, 0xA7, 0x93, 0x40, 0x03, 0x80, +0x94, 0x40, 0x04, 0xA5, 0x91, 0x38, 0x11, 0x80, +0x81, 0x02, 0x09, 0xA1, 0x88, 0x5A, 0x19, 0x80, +0x73, 0x40, 0x09, 0x02, 0x82, 0x50, 0x08, 0xA0, +0xFB, 0x97, 0x03, 0x00, 0x09, 0xA1, 0x71, 0x38, +0x84, 0x44, 0x24, 0xC6, 0x71, 0x40, 0x00, 0x60, +0xFF, 0x99, 0x00, 0x20, 0x74, 0x44, 0x78, 0xAD, +0x57, 0x99, 0x01, 0x60, 0x6D, 0x99, 0xC8, 0xA5, +0x02, 0x8D, 0xE8, 0xAD, 0xCA, 0xA7, 0x52, 0x9D, +0xC6, 0xEA, 0x48, 0x88, 0x73, 0x40, 0x92, 0x98, +0xD0, 0xAD, 0x04, 0xA1, 0x71, 0x02, 0xA9, 0x9C, +0x78, 0x5A, 0x19, 0x80, 0x74, 0x44, 0x0B, 0x02, +0x6F, 0x99, 0x01, 0x60, 0x6D, 0x99, 0xCA, 0xA7, +0x08, 0xA0, 0x73, 0x40, 0x91, 0x9C, 0xE8, 0xAD, +0x4E, 0x9C, 0x01, 0x9C, 0x51, 0x22, 0x24, 0x9D, +0x05, 0xE0, 0x15, 0x80, 0x41, 0xC6, 0xB6, 0xE9, +0x21, 0x84, 0x57, 0xDD, 0xFF, 0x83, 0x41, 0xA8, +0x51, 0x22, 0x3C, 0xD5, 0x58, 0x5A, 0x19, 0x80, +0x00, 0x84, 0x39, 0x01, 0x40, 0x44, 0x94, 0x9C, +0x20, 0x80, 0x82, 0x00, 0x2A, 0xD5, 0xE6, 0x84, +0x00, 0x00, 0x61, 0x22, 0x09, 0x91, 0x61, 0x38, +0x81, 0x22, 0xA1, 0x9D, 0x81, 0x38, 0x01, 0x00, +0xA2, 0x9D, 0x09, 0x99, 0x05, 0x00, 0x91, 0x00, +0x04, 0x00, 0x81, 0x00, 0x04, 0x25, 0x84, 0x40, +0x11, 0x00, 0x84, 0x40, 0x09, 0x99, 0x81, 0x38, +0x24, 0x9C, 0x60, 0x42, 0x94, 0x1B, 0x88, 0x3E, +0x63, 0x00, 0xC8, 0x88, 0x83, 0x54, 0x09, 0x00, +0x83, 0x4E, 0x01, 0x00, 0x63, 0x42, 0x05, 0x00, +0x05, 0xC6, 0x0B, 0x0C, 0x0C, 0x84, 0x62, 0x40, +0x01, 0x96, 0x37, 0xFE, 0x96, 0x9C, 0x49, 0x9C, +0x61, 0x22, 0x24, 0x9D, 0x26, 0xE0, 0x15, 0x80, +0x03, 0x96, 0xD4, 0xE9, 0x4B, 0x0C, 0x08, 0x3C, +0xA2, 0x01, 0x14, 0x3C, 0x74, 0x0C, 0x18, 0x3C, +0x00, 0xFC, 0xC0, 0xFC, 0x03, 0xC8, 0x50, 0xDD, +0x9D, 0xFF, 0x07, 0x3E, 0xA5, 0xFF, 0x17, 0x2E, +0x0C, 0xC8, 0x02, 0xC1, 0x0A, 0xC0, 0x65, 0xF8, +0x01, 0x84, 0x72, 0xEA, 0xA8, 0xF8, 0x6B, 0xF8, +0x17, 0x3E, 0x64, 0xEA, 0x01, 0x84, 0x9D, 0xFF, +0x00, 0x84, 0x02, 0xD5, 0x20, 0xFC, 0x80, 0xFC, +0x30, 0x46, 0x45, 0xDD, 0xE0, 0x80, 0x03, 0x01, +0x01, 0x83, 0x01, 0x04, 0x45, 0xEA, 0x01, 0x81, +0x01, 0x83, 0x01, 0x14, 0x55, 0xEA, 0xC2, 0x80, +0x00, 0x01, 0x40, 0x46, 0xE1, 0xA8, 0x60, 0x84, +0x40, 0x46, 0xE1, 0xA8, 0x07, 0x80, 0x8C, 0x00, +0x10, 0x0A, 0x06, 0xD5, 0xD9, 0x9C, 0x01, 0x00, +0x01, 0x00, 0x12, 0x1A, 0xFA, 0xE9, 0x68, 0xE0, +0x00, 0x60, 0x04, 0x44, 0x58, 0x98, 0x81, 0x9C, +0x2D, 0xC6, 0x1A, 0x98, 0x44, 0xDD, 0x89, 0x98, +0x80, 0x80, 0x40, 0x02, 0x10, 0xAD, 0x00, 0x98, +0x81, 0x80, 0x20, 0x02, 0x04, 0x44, 0x80, 0xAC, +0x58, 0x99, 0x02, 0x60, 0x02, 0x9C, 0x81, 0x9C, +0xD8, 0x98, 0x1A, 0x99, 0x24, 0x99, 0x6D, 0x99, +0x00, 0x44, 0xDB, 0x98, 0x40, 0x84, 0x82, 0x00, +0x60, 0x38, 0x11, 0xD5, 0x91, 0x9C, 0x01, 0x81, +0x03, 0x80, 0x62, 0x1A, 0x60, 0x38, 0x81, 0x9D, +0x62, 0x1A, 0x01, 0x99, 0x82, 0x9D, 0x03, 0x00, +0x01, 0x99, 0x60, 0x38, 0x61, 0x1A, 0x04, 0x9C, +0x60, 0x22, 0x03, 0x80, 0x46, 0xE0, 0x15, 0x80, +0x05, 0xD5, 0xED, 0xE9, 0x00, 0x98, 0x49, 0x98, +0x80, 0xAD, 0x88, 0xAD, 0x52, 0xFF, 0x00, 0x4E, +0x00, 0xFC, 0xA0, 0xFC, 0x04, 0x3C, 0x72, 0xEA, +0xF0, 0x46, 0xBA, 0x0C, 0x10, 0x3C, 0x81, 0x00, +0x0E, 0xFE, 0xCA, 0x0D, 0x04, 0xC0, 0xFF, 0x83, +0xFF, 0x49, 0x00, 0x84, 0x22, 0xEA, 0xBD, 0xFE, +0x37, 0xA4, 0xD2, 0x8C, 0x0C, 0x03, 0x08, 0x5A, +0x27, 0xE2, 0xFF, 0x49, 0xE7, 0x00, 0x33, 0x22, +0x38, 0xEA, 0x2B, 0xF8, 0x2E, 0xF8, 0x9E, 0xFE, +0x2E, 0xD5, 0x4C, 0xDD, 0x08, 0x5A, 0x37, 0xA4, +0x38, 0xEA, 0x04, 0x05, 0x37, 0xA4, 0x1F, 0xD5, +0x03, 0x04, 0x08, 0x5A, 0x37, 0xA4, 0x18, 0xD5, +0x05, 0x08, 0x08, 0x5A, 0x2C, 0x07, 0x08, 0x3E, +0x37, 0xA4, 0x15, 0xD5, 0x05, 0x0A, 0x08, 0x5A, +0xA4, 0x00, 0x08, 0x3E, 0x37, 0xA4, 0x0F, 0xD5, +0x0C, 0x0D, 0x00, 0x5A, 0x00, 0x5A, 0x37, 0xA4, +0x37, 0xA4, 0x09, 0x0C, 0x04, 0x0F, 0x00, 0x5A, +0x04, 0xD5, 0x4E, 0xDD, 0x02, 0xD5, 0xB5, 0xEA, +0x34, 0x3C, 0x78, 0xEA, 0xAC, 0xEA, 0xBA, 0x0C, +0x80, 0x00, 0xF0, 0x46, 0xFF, 0x83, 0x53, 0xDD, +0xFF, 0x49, 0x9E, 0xFE, 0x00, 0x49, 0x62, 0xFF, +0x80, 0xFC, 0x3A, 0x03, 0x21, 0x84, 0x00, 0xFC, +0x9C, 0xFF, 0x17, 0x3E, 0x00, 0x50, 0x41, 0xDD, +0x20, 0x84, 0xD2, 0x01, 0x30, 0x7F, 0x10, 0x12, +0x67, 0x00, 0x20, 0x22, 0x17, 0x00, 0x20, 0x12, +0x68, 0x00, 0x20, 0x22, 0x2E, 0x7F, 0x20, 0x12, +0x6E, 0x00, 0x20, 0x22, 0x34, 0x00, 0x20, 0x12, +0x11, 0x01, 0x20, 0x22, 0x35, 0x00, 0x20, 0x12, +0x12, 0x01, 0x20, 0x22, 0x36, 0x00, 0x20, 0x12, +0x20, 0x12, 0x3C, 0xEA, 0x3C, 0xEA, 0x37, 0x7F, +0x38, 0x7F, 0x20, 0x12, 0x20, 0x12, 0x3C, 0xEA, +0x3C, 0xEA, 0x39, 0x7F, 0x3A, 0x7F, 0x20, 0x12, +0x20, 0x12, 0x3C, 0xEA, 0x20, 0x22, 0x3B, 0x7F, +0x20, 0x12, 0x78, 0x00, 0x20, 0x22, 0xC9, 0x7F, +0x20, 0x12, 0x74, 0x00, 0x20, 0x22, 0x47, 0x7F, +0x20, 0x12, 0x77, 0x00, 0x20, 0x22, 0x4C, 0x7F, +0x20, 0x12, 0x79, 0x00, 0x20, 0x22, 0x52, 0x7F, +0x20, 0x12, 0x7A, 0x00, 0x20, 0x22, 0xC8, 0x7F, +0x20, 0x12, 0x7B, 0x00, 0x20, 0x22, 0xEC, 0x7F, +0x20, 0x12, 0x7C, 0x00, 0x20, 0x22, 0xED, 0x7F, +0x20, 0x12, 0x7D, 0x00, 0x20, 0x22, 0xEE, 0x7F, +0x82, 0xAC, 0x6F, 0x00, 0x70, 0x00, 0x20, 0x22, +0x20, 0x22, 0x83, 0xAC, 0x84, 0xAC, 0x71, 0x00, +0x72, 0x00, 0x20, 0x22, 0x20, 0x22, 0x85, 0xAC, +0x86, 0xAC, 0x73, 0x00, 0x0D, 0x01, 0x20, 0x22, +0xE1, 0x7F, 0x20, 0x12, 0x0E, 0x01, 0x20, 0x22, +0xE2, 0x7F, 0x20, 0x12, 0x0F, 0x01, 0x20, 0x22, +0xE3, 0x7F, 0x20, 0x12, 0x10, 0x01, 0x20, 0x22, +0xE4, 0x7F, 0x20, 0x12, 0x07, 0x00, 0x20, 0x22, +0x87, 0xAC, 0x9E, 0xEA, 0x2D, 0x00, 0x10, 0x12, +0x00, 0xFC, 0x80, 0xFC, 0x41, 0x02, 0x47, 0xDD, +0x31, 0x02, 0x77, 0x01, 0x51, 0x22, 0x77, 0x01, +0xDF, 0x96, 0x75, 0x01, 0x42, 0x54, 0x5C, 0xFE, +0x88, 0x92, 0x00, 0x0F, 0x73, 0x14, 0x12, 0x42, +0x10, 0x40, 0xE3, 0x98, 0x00, 0x50, 0x76, 0x8C, +0x4B, 0x96, 0x6D, 0x01, 0x80, 0xFC, 0xB2, 0xEA, +0xF4, 0xFA, 0x20, 0xFC, 0xC0, 0x01, 0x40, 0x50, +0x44, 0xDD, 0x3C, 0xFE, 0x90, 0x0C, 0x78, 0x3E, +0x77, 0x81, 0x30, 0x02, 0x20, 0x02, 0x07, 0x98, +0x50, 0x22, 0x77, 0x81, 0x60, 0x22, 0x76, 0x81, +0x03, 0xA0, 0x35, 0x80, 0xD6, 0x18, 0x00, 0x40, +0x31, 0x54, 0x9F, 0x96, 0x68, 0x92, 0x00, 0x8F, +0x9A, 0x98, 0x14, 0xFE, 0x73, 0x94, 0x01, 0x42, +0x56, 0x08, 0x00, 0x40, 0x00, 0x38, 0x03, 0x96, +0xA0, 0xFC, 0x09, 0x91, 0x22, 0xEA, 0x43, 0xFC, +0x03, 0x02, 0x00, 0x81, 0x58, 0xC0, 0x54, 0x01, +0x7A, 0x01, 0x70, 0x44, 0x44, 0xB1, 0x20, 0x85, +0x52, 0xEA, 0x05, 0xB1, 0xF4, 0x5E, 0x4D, 0xD5, +0x05, 0xE8, 0x23, 0x80, 0x01, 0x1D, 0x23, 0x38, +0x07, 0xD5, 0x39, 0x9C, 0x14, 0x80, 0x03, 0x50, +0x01, 0x01, 0x23, 0x38, 0x15, 0x80, 0x03, 0x50, +0x01, 0x01, 0xA3, 0x38, 0x00, 0x00, 0x04, 0x02, +0x04, 0x02, 0x28, 0xAC, 0xA0, 0xAC, 0x01, 0x00, +0xA2, 0x12, 0x29, 0xAC, 0x25, 0xB4, 0x01, 0x00, +0x83, 0xF2, 0x04, 0xB4, 0x81, 0xF4, 0x7F, 0xB6, +0x2E, 0xEA, 0x82, 0xF5, 0x54, 0x01, 0x13, 0x22, +0x7F, 0xB4, 0x03, 0xF2, 0x02, 0xF5, 0x01, 0xF4, +0x24, 0xE8, 0x01, 0xE2, 0x00, 0x00, 0x04, 0x02, +0x93, 0x96, 0x82, 0x9A, 0x03, 0x00, 0x11, 0x42, +0x09, 0xE9, 0x23, 0xE4, 0x55, 0x01, 0x13, 0x22, +0x21, 0x40, 0x8C, 0xFE, 0x02, 0x9A, 0x36, 0x0C, +0x00, 0x00, 0x04, 0x12, 0x01, 0x00, 0x04, 0x02, +0x01, 0x28, 0xA0, 0x40, 0x11, 0x00, 0xA5, 0x40, +0x03, 0x00, 0x15, 0x42, 0x0A, 0xE9, 0x23, 0xE4, +0x55, 0x01, 0x13, 0x22, 0x24, 0x04, 0xA5, 0x42, +0x36, 0x0C, 0xA5, 0x40, 0x04, 0x12, 0x0A, 0x8A, +0x21, 0x8D, 0x01, 0x00, 0x03, 0x22, 0xFA, 0x9D, +0x20, 0xE1, 0x79, 0x01, 0xC3, 0xFC, 0xB1, 0xE9, +0x45, 0xDD, 0x41, 0xFC, 0xE0, 0x80, 0x60, 0x84, +0x6B, 0xEA, 0x49, 0x96, 0x4F, 0xEA, 0x81, 0xF1, +0x04, 0xD5, 0x03, 0x80, 0x09, 0x0D, 0x02, 0x38, +0x65, 0xE0, 0xD9, 0x9C, 0x5B, 0xCF, 0xFC, 0xE9, +0x03, 0x01, 0x60, 0x46, 0x04, 0x0C, 0x63, 0x58, +0x06, 0xB4, 0x46, 0xDD, 0x02, 0x01, 0x80, 0x46, +0x06, 0xB6, 0x3A, 0xEA, 0xFF, 0x0C, 0x20, 0x3C, +0xEC, 0x0C, 0x14, 0x3C, 0x7A, 0xF8, 0x10, 0x96, +0x02, 0x00, 0x14, 0x14, 0x03, 0x00, 0x14, 0x14, +0x91, 0x44, 0x06, 0xB4, 0x3A, 0xEA, 0x01, 0x00, +0x94, 0x14, 0x06, 0xB6, 0x46, 0xDD, 0x41, 0x00, +0x24, 0x1C, 0x88, 0x3E, 0x47, 0xEA, 0x49, 0xDD, +0x53, 0xDD, 0x17, 0xD5, 0x4E, 0xDD, 0x41, 0x84, +0x51, 0xDD, 0x7F, 0xB6, 0x06, 0xB4, 0x46, 0xDD, +0x3A, 0xEA, 0x43, 0xDD, 0x06, 0xB6, 0x29, 0x89, +0x41, 0x80, 0x90, 0x14, 0x00, 0x84, 0x49, 0xDD, +0x7F, 0xB4, 0x5C, 0xDD, 0x11, 0x9D, 0x01, 0x38, +0x09, 0x1D, 0x04, 0x38, 0x00, 0x3C, 0xF9, 0x9D, +0xE0, 0xE0, 0x4A, 0x00, 0x46, 0xDD, 0xE7, 0xE9, +0x03, 0x01, 0x00, 0x46, 0x61, 0xEA, 0x59, 0xDD, +0x41, 0xDD, 0x52, 0xDD, 0x2D, 0x01, 0x20, 0x22, +0xF0, 0xFF, 0x17, 0x46, 0x43, 0xDD, 0x8F, 0xFE, +0x41, 0x80, 0x20, 0x14, 0xE0, 0x01, 0x20, 0x46, +0x35, 0x01, 0x10, 0x02, 0x48, 0x96, 0xBA, 0xEA, +0xAE, 0xEA, 0x45, 0xEA, 0x57, 0xFE, 0x01, 0x96, +0x42, 0xDD, 0x47, 0xFE, 0x43, 0xA8, 0x42, 0xA8, +0xC9, 0x00, 0x00, 0x48, 0x77, 0x4C, 0xE1, 0x85, +0xC0, 0x84, 0xC6, 0xC0, 0x03, 0x01, 0xA0, 0x46, +0xA5, 0x58, 0x26, 0x81, 0xE4, 0x80, 0x04, 0x0C, +0x5F, 0x00, 0x00, 0x48, 0x14, 0x54, 0x0A, 0xB4, +0x3A, 0xEA, 0x01, 0x80, 0x04, 0x40, 0x0A, 0xB6, +0x04, 0xC1, 0x0A, 0x84, 0x28, 0x92, 0x03, 0xF8, +0x00, 0x50, 0x07, 0xD5, 0x47, 0xDD, 0x62, 0x00, +0x01, 0x01, 0x11, 0x38, 0x01, 0x84, 0xFF, 0x83, +0x0C, 0x04, 0x10, 0x40, 0x15, 0x41, 0x00, 0x44, +0x0A, 0xB6, 0x4A, 0xB4, 0x10, 0x14, 0x57, 0xDD, +0x4A, 0xB6, 0x08, 0x02, 0x46, 0xDD, 0x37, 0xEA, +0xFF, 0x0C, 0x00, 0x3C, 0xEC, 0x0C, 0x14, 0x3C, +0x44, 0xEA, 0x00, 0x96, 0x49, 0x96, 0x60, 0xEA, +0xFF, 0x83, 0x47, 0xFE, 0x42, 0xA8, 0x42, 0xDD, +0x60, 0x14, 0x43, 0xA8, 0x13, 0x50, 0x4A, 0x00, +0x10, 0x14, 0x80, 0x00, 0x46, 0xDD, 0x4B, 0x00, +0x5F, 0xDD, 0x49, 0xDD, 0x49, 0x9C, 0x40, 0x84, +0x4E, 0xDD, 0x49, 0x96, 0x20, 0x3C, 0x51, 0xDD, +0x51, 0x9E, 0x49, 0x00, 0x10, 0xE8, 0x21, 0xE1, +0x40, 0x84, 0x65, 0xEA, 0x24, 0x8C, 0x54, 0x42, +0x07, 0xD5, 0x2D, 0xEA, 0x11, 0x09, 0x02, 0x38, +0x03, 0x38, 0x55, 0x98, 0x91, 0x9C, 0x09, 0x85, +0xF9, 0xE9, 0x43, 0xE0, 0x24, 0x4C, 0x0F, 0xD5, +0x5B, 0xDD, 0x06, 0xC0, 0x4F, 0x9C, 0x54, 0xFE, +0x5F, 0xDD, 0x05, 0xD5, 0x24, 0x84, 0x14, 0x42, +0x04, 0x3C, 0x4A, 0x9C, 0x03, 0x38, 0x6C, 0x0F, +0x21, 0x8D, 0x09, 0x85, 0x00, 0x3C, 0xB4, 0x9D, +0x09, 0xE0, 0x49, 0x00, 0x6B, 0xEA, 0xA0, 0xE8, +0x00, 0x84, 0x4F, 0xEA, 0x02, 0xD5, 0x47, 0xEA, +0x05, 0xE0, 0x0B, 0xF8, 0x00, 0x84, 0xFE, 0xE9, +0x6B, 0xEA, 0x5C, 0xDD, 0x00, 0x84, 0x2D, 0xEA, +0x24, 0x1C, 0x38, 0x3E, 0x96, 0xEA, 0x06, 0xD5, +0x09, 0x81, 0x11, 0x38, 0xFF, 0x83, 0x01, 0x9C, +0xFA, 0xE9, 0x05, 0xE0, 0x0A, 0x80, 0x46, 0xDD, +0xBF, 0x84, 0x60, 0xB4, 0x00, 0x81, 0x31, 0x58, +0x30, 0x44, 0x60, 0xB6, 0x80, 0xB4, 0x15, 0x41, +0x30, 0x46, 0x60, 0xB6, 0x51, 0x14, 0x00, 0x01, +0x80, 0xB6, 0x08, 0x82, 0x37, 0xEA, 0xC0, 0x84, +0x02, 0x01, 0x00, 0x46, 0x4A, 0x00, 0x60, 0x14, +0x80, 0x00, 0x30, 0x44, 0x4B, 0x00, 0x30, 0x14, +0x08, 0x5A, 0x01, 0xF0, 0x78, 0x3E, 0x28, 0x01, +0x46, 0xDD, 0x90, 0x00, 0x01, 0xF2, 0x49, 0xDD, +0x4E, 0xDD, 0x78, 0xA4, 0x06, 0x80, 0x51, 0xDD, +0x06, 0x80, 0x5C, 0xDD, 0x83, 0x02, 0x46, 0x80, +0x7A, 0xA5, 0x01, 0x80, 0x68, 0x3E, 0x4F, 0xEA, +0x10, 0xD5, 0xC4, 0x1E, 0x92, 0x38, 0xC8, 0x98, +0x73, 0x38, 0x01, 0x0D, 0x49, 0x9C, 0x01, 0x0D, +0x01, 0x9C, 0x74, 0x40, 0x72, 0x38, 0xFB, 0x97, +0x25, 0xE0, 0x09, 0x0D, 0x91, 0x9C, 0xF4, 0xE9, +0x48, 0xE0, 0x05, 0x98, 0x20, 0x84, 0x03, 0xE8, +0xC1, 0xFC, 0xF9, 0xD5, 0x10, 0x46, 0x44, 0xFC, +0x07, 0x2E, 0x80, 0x00, 0x02, 0x4E, 0xA3, 0xFF, +0x00, 0x84, 0x95, 0x00, 0xA3, 0xFF, 0x07, 0x3E, +0x0C, 0x84, 0x22, 0xEA, 0x10, 0x00, 0x03, 0x12, +0x37, 0xEA, 0x40, 0x85, 0x00, 0x84, 0xA5, 0xEA, +0x7E, 0xEA, 0x20, 0x80, 0x4A, 0x00, 0x70, 0x3C, +0x03, 0x80, 0xAF, 0x14, 0xA6, 0x80, 0x0A, 0x80, +0x61, 0x84, 0xC8, 0xEA, 0x11, 0xD5, 0x4A, 0x80, +0x62, 0x22, 0x5D, 0xEA, 0xC4, 0xE0, 0x53, 0x81, +0x41, 0x40, 0x06, 0xE8, 0xA2, 0x40, 0x0C, 0x80, +0x71, 0xEA, 0x04, 0x28, 0x44, 0xE0, 0x5D, 0xEA, +0x20, 0x38, 0x03, 0xE8, 0x01, 0x9C, 0x11, 0x81, +0xEF, 0xE9, 0x07, 0xE0, 0x08, 0x3C, 0x0D, 0x84, +0x83, 0xF2, 0xDA, 0x0B, 0xA5, 0xEA, 0x37, 0xEA, +0x20, 0x80, 0x01, 0x84, 0x8F, 0xEA, 0x7E, 0xEA, +0x49, 0x00, 0x10, 0x3C, 0x2F, 0x50, 0x20, 0x85, +0x86, 0xF1, 0xFF, 0x7F, 0x9F, 0x14, 0x6E, 0xEA, +0x88, 0x3E, 0x02, 0x80, 0x85, 0xF2, 0x24, 0x1C, +0x04, 0x80, 0x9F, 0x14, 0x07, 0x80, 0xAF, 0x14, +0x04, 0xF3, 0x34, 0xD5, 0x73, 0xEA, 0xAB, 0x98, +0x03, 0xE8, 0x20, 0xE0, 0x11, 0x09, 0x14, 0x38, +0x07, 0x4E, 0x73, 0xEA, 0x73, 0xEA, 0x07, 0x00, +0x03, 0xE8, 0x0A, 0xE0, 0x11, 0x09, 0xA4, 0x38, +0x69, 0x9D, 0x73, 0xEA, 0xBE, 0xE0, 0xF8, 0x99, +0xFF, 0x5E, 0xED, 0xE9, 0x03, 0xE8, 0x02, 0x00, +0x05, 0xD5, 0x20, 0x84, 0x79, 0x9A, 0x05, 0xF0, +0x56, 0x80, 0x10, 0x40, 0x42, 0x0D, 0x24, 0x3C, +0x0B, 0xE8, 0x41, 0xE0, 0x0A, 0x84, 0x34, 0x40, +0x21, 0x40, 0x41, 0x84, 0x01, 0xF3, 0x0C, 0x0C, +0x04, 0x0C, 0x01, 0x40, 0x81, 0xF0, 0x01, 0x96, +0x21, 0x8D, 0x02, 0xF0, 0x00, 0x04, 0x00, 0x42, +0x82, 0xF0, 0x04, 0xF1, 0x84, 0xF1, 0x3E, 0x88, +0x22, 0xE1, 0x06, 0xF2, 0xE0, 0x84, 0x07, 0xE8, +0x30, 0x75, 0xA0, 0x44, 0xA7, 0x80, 0x27, 0x80, +0x01, 0xF1, 0xD7, 0xD5, 0x07, 0x80, 0xAF, 0x04, +0xCB, 0x96, 0x4E, 0xDD, 0x11, 0x00, 0x45, 0x40, +0xC1, 0xAC, 0x00, 0xAD, 0x9B, 0x96, 0x03, 0xF3, +0x02, 0xF2, 0x82, 0xAC, 0x43, 0xAC, 0x53, 0x96, +0x18, 0x3C, 0x2E, 0x84, 0x01, 0x84, 0xDA, 0x0B, +0x00, 0xFC, 0xC4, 0xFC, 0x49, 0xDD, 0x46, 0xDD, +0x41, 0x84, 0x53, 0xDD, 0x51, 0xDD, 0x4E, 0xDD, +0x00, 0x84, 0x48, 0xEA, 0x80, 0xFC, 0x5C, 0xDD, +0x00, 0x3C, 0x41, 0xFC, 0x4A, 0xC0, 0xE9, 0x0B, +0x19, 0xF8, 0x1A, 0xF8, 0x00, 0x84, 0x6B, 0xEA, +0x38, 0x3E, 0x2D, 0xEA, 0x28, 0x3E, 0xE0, 0x0E, +0x20, 0x80, 0xCC, 0x09, 0x62, 0x38, 0x07, 0xD5, +0x61, 0x38, 0x11, 0x01, 0xB2, 0xEA, 0x09, 0x81, +0x05, 0xE0, 0x01, 0x9C, 0xC0, 0x84, 0xF9, 0xE9, +0x44, 0x81, 0x47, 0xDD, 0xA6, 0xEA, 0x23, 0x81, +0x81, 0xF2, 0x1E, 0xD5, 0xD7, 0xFF, 0xFF, 0x49, +0x00, 0x84, 0x21, 0xEA, 0x14, 0xD5, 0x01, 0xF2, +0x11, 0x01, 0x45, 0x38, 0x11, 0x81, 0x14, 0x38, +0x44, 0x38, 0x61, 0x9A, 0x6C, 0xEA, 0x11, 0x01, +0x81, 0xE0, 0x49, 0x96, 0x4B, 0x96, 0x04, 0xE8, +0x09, 0x01, 0x14, 0x38, 0x11, 0x01, 0x15, 0x38, +0x09, 0x81, 0x14, 0x38, 0x03, 0xE0, 0x01, 0x9C, +0xB1, 0x9D, 0xEC, 0xE9, 0x1F, 0x00, 0x01, 0x22, +0xE0, 0xE9, 0xC0, 0xE0, 0x48, 0x00, 0x20, 0x3C, +0x28, 0x80, 0x00, 0x84, 0xBC, 0xEA, 0x06, 0xD5, +0x30, 0x38, 0x61, 0x90, 0x01, 0x9C, 0x09, 0x81, +0xFA, 0xE9, 0x02, 0xE0, 0x18, 0x3C, 0x20, 0x84, +0xC1, 0xFC, 0xE9, 0x0B, 0x4B, 0xEA, 0x00, 0xFC, +0x30, 0x00, 0x10, 0x04, 0xFD, 0xC9, 0x4C, 0x96, +0x00, 0xFC, 0x80, 0xFC, 0x1B, 0x3C, 0x20, 0x84, +0x4B, 0xEA, 0xEE, 0xFF, 0x44, 0xEA, 0xA0, 0xEA, +0x0A, 0x00, 0x10, 0x14, 0x00, 0xFC, 0x80, 0xFC, +0x01, 0x01, 0x00, 0x46, 0xB3, 0xEA, 0xA0, 0xEA, +0x0A, 0x00, 0x10, 0x14, 0x40, 0xFC, 0x80, 0xFC, +0xC9, 0x0C, 0x94, 0x3C, 0x07, 0x00, 0x93, 0x4E, +0xA0, 0xEA, 0x4B, 0xEA, 0xFE, 0xC9, 0x4C, 0x96, +0x70, 0x46, 0x09, 0xD5, 0x00, 0x85, 0x01, 0x01, +0x0A, 0x80, 0x03, 0x04, 0x04, 0x96, 0xC7, 0x80, +0x70, 0xEA, 0x06, 0xC8, 0xB3, 0xEA, 0x59, 0xDD, +0x0E, 0xD5, 0x52, 0xDD, 0xE8, 0x03, 0x00, 0x44, +0x00, 0x49, 0x01, 0x8D, 0x94, 0x4C, 0x26, 0x00, +0x03, 0x04, 0xF1, 0x7F, 0x00, 0x66, 0x0A, 0x00, +0x03, 0x14, 0x01, 0x00, 0xC0, 0xFC, 0x0A, 0x00, +0x81, 0xB0, 0x01, 0xFC, 0x3F, 0xB6, 0x81, 0xF0, +0x49, 0x96, 0x01, 0x96, 0x91, 0xA4, 0x41, 0x9A, +0x01, 0x80, 0x0F, 0x02, 0x90, 0x9A, 0x4C, 0xFE, +0x73, 0x08, 0x11, 0x42, 0x01, 0x80, 0x03, 0xC9, +0x40, 0x84, 0x0A, 0xD5, 0x30, 0x40, 0x01, 0x84, +0x91, 0x9C, 0x97, 0x80, 0x01, 0x92, 0x18, 0x98, +0xFB, 0x1E, 0x28, 0x5A, 0x00, 0xFC, 0x81, 0xFC, +0x06, 0x4E, 0x03, 0x96, 0x09, 0xD5, 0x09, 0x00, +0x49, 0x9E, 0x00, 0x92, 0x01, 0x9E, 0xFE, 0xC9, +0x03, 0xC0, 0x03, 0x96, 0xF9, 0xD5, 0x54, 0xDD, +0x00, 0x00, 0x80, 0xFC, 0x07, 0xC2, 0x60, 0x80, +0x40, 0x08, 0x4A, 0x99, 0x41, 0x18, 0x01, 0x80, +0xFC, 0xD9, 0x01, 0x80, 0x00, 0x92, 0x9E, 0xDD, +0x5A, 0x99, 0x60, 0x80, 0x11, 0x18, 0x04, 0xD3, +0xFD, 0xD5, 0x01, 0x80, 0x00, 0x92, 0x9E, 0xDD, +0x00, 0x01, 0x6D, 0xC0, 0x94, 0x17, 0x08, 0x3E, +0x02, 0x01, 0x00, 0x46, 0x02, 0x01, 0x10, 0x46, +0x94, 0x17, 0x18, 0x3E, 0x00, 0xFF, 0xCF, 0x3F, +0x08, 0x91, 0x00, 0x49, 0x94, 0x17, 0x28, 0x3E, +0xAF, 0xFF, 0x0F, 0x2E, 0x0E, 0x91, 0x00, 0x49, +0x6C, 0x0C, 0x08, 0x3E, 0xC1, 0x08, 0x00, 0x3C, +0x5D, 0x95, 0x00, 0x49, 0x64, 0x00, 0x00, 0x44, +0xC4, 0x1E, 0x08, 0x3E, 0x03, 0x01, 0x20, 0x46, +0xB4, 0xFF, 0x07, 0x2E, 0x98, 0x8C, 0x00, 0x49, +0x01, 0x03, 0x10, 0x14, 0x48, 0x00, 0x10, 0x3C, +0x64, 0x00, 0x10, 0x44, 0x06, 0x00, 0x00, 0x3C, +0x7C, 0x17, 0x08, 0x3E, 0x00, 0x01, 0x00, 0x46, +0x74, 0x21, 0x08, 0x3E, 0x01, 0x03, 0x10, 0x04, +0xC4, 0x9E, 0x00, 0x48, 0x4A, 0x00, 0x20, 0x3C, +0x9B, 0x87, 0x00, 0x49, 0x90, 0x0C, 0x18, 0x3E, +0xAF, 0xFF, 0x1F, 0x2E, 0x4A, 0x00, 0x10, 0x3C, +0x03, 0x00, 0x00, 0x42, 0x48, 0x00, 0x30, 0x3C, +0x94, 0x17, 0x68, 0x3E, 0xCC, 0x09, 0x48, 0x3E, +0x4A, 0x00, 0x50, 0x3C, 0x90, 0x0C, 0x08, 0x3E, +0x07, 0x00, 0x00, 0x3C, 0x77, 0x94, 0x21, 0x40, +0xB2, 0x10, 0x14, 0x3C, 0xBA, 0x0C, 0x00, 0x3C, +0x10, 0x00, 0x10, 0x22, 0x08, 0x00, 0x00, 0x3C, +0xAC, 0x0E, 0x08, 0x3E, 0xC4, 0x1E, 0x48, 0x3E, +0xA4, 0xB6, 0x00, 0x49, 0x00, 0x00, 0x63, 0x22, +0x24, 0x80, 0x04, 0x42, 0x01, 0x00, 0x00, 0x56, +0x1A, 0x01, 0xF0, 0x44, 0x00, 0x00, 0x52, 0x22, +0xC4, 0x1E, 0x28, 0x3E, 0x88, 0x84, 0x00, 0x49, +0x74, 0x21, 0x38, 0x3E, 0x16, 0x93, 0x00, 0x49, +0xDC, 0x14, 0x08, 0x3E, 0xFF, 0x7F, 0x10, 0x44, +0x00, 0x01, 0x00, 0x58, 0x00, 0x80, 0x52, 0x22, +0x69, 0x00, 0x20, 0x22, 0x13, 0x00, 0x84, 0x40, +0x04, 0x8C, 0x02, 0x3A, 0x70, 0x21, 0x00, 0x2E, +0xE4, 0xFF, 0x1B, 0x3C, 0x00, 0x80, 0x31, 0x22, +0xE4, 0xFF, 0x17, 0x3C, 0x90, 0x00, 0x08, 0x3E, +0x01, 0x80, 0x10, 0x58, 0x01, 0x00, 0x00, 0x58, +0x03, 0x01, 0x10, 0x46, 0xC4, 0x1E, 0x38, 0x3E, +0x63, 0x87, 0x00, 0x49, 0x74, 0x21, 0x18, 0x3E, +0xF4, 0x98, 0x00, 0x49, 0x01, 0x01, 0x00, 0x46, +0x20, 0x80, 0x10, 0x50, 0x00, 0x80, 0x22, 0x22, +0x38, 0x00, 0x00, 0x50, 0x24, 0x1C, 0x48, 0x3E, +0x20, 0x80, 0x61, 0x22, 0x11, 0x1D, 0x05, 0x38, +0x64, 0x00, 0x30, 0x44, 0x11, 0x05, 0x22, 0x38, +0x09, 0x81, 0x40, 0x38, 0x66, 0xB6, 0x00, 0x49, +0xCE, 0x80, 0x00, 0x22, 0x4A, 0x00, 0x40, 0x3C, +0x94, 0x17, 0x38, 0x3E, 0xB5, 0x0C, 0x44, 0x3C, +0x64, 0x00, 0x20, 0x44, 0x3D, 0x00, 0x41, 0x22, +0x56, 0x07, 0x10, 0x3C, 0x11, 0x81, 0x40, 0x38, +0x38, 0x00, 0xA0, 0x44, 0x24, 0x28, 0x33, 0x42, +0x08, 0xA0, 0x10, 0x40, 0x00, 0x81, 0x10, 0x58, +0x11, 0x81, 0xA0, 0x38, 0x20, 0x80, 0x31, 0x22, +0xB4, 0xFF, 0x17, 0x2E, 0x4A, 0x00, 0x30, 0x3C, +0x11, 0x81, 0x60, 0x38, 0x38, 0x00, 0x10, 0x44, +0x68, 0x00, 0x08, 0x3E, 0x74, 0x21, 0x28, 0x3E, +0x13, 0x80, 0x94, 0x40, 0x48, 0x00, 0x50, 0x3C, +0x03, 0x80, 0x10, 0x42, 0xCE, 0xB6, 0x00, 0x49, +0x01, 0x80, 0x9F, 0x14, 0x03, 0x00, 0x63, 0x42, +0x03, 0x01, 0x00, 0x46, 0x13, 0x00, 0xA5, 0x40, +0x7F, 0xB6, 0x00, 0x49, 0x11, 0x09, 0x04, 0x38, +0xC1, 0x08, 0x20, 0x3C, 0x88, 0x00, 0x00, 0x46, +0x00, 0x80, 0x12, 0x22, 0x00, 0x01, 0x10, 0x02, +0x24, 0x1C, 0x08, 0x3E, 0xBE, 0x0B, 0x00, 0x3C, +0x00, 0x80, 0x3F, 0x44, 0x80, 0x00, 0x10, 0x50, +0x00, 0x80, 0x83, 0x22, 0xA6, 0xFF, 0x0F, 0x2E, +0x40, 0xB4, 0x00, 0x49, 0xA4, 0x00, 0x88, 0x3E, +0xCE, 0xAF, 0x00, 0x49, 0x4C, 0x89, 0x00, 0x49, +0x90, 0x0C, 0x38, 0x3E, 0x9C, 0xFF, 0x27, 0x2E, +0xB7, 0x04, 0x42, 0x40, 0x0D, 0xBC, 0x11, 0x42, +0x90, 0x0C, 0x28, 0x3E, 0x64, 0x00, 0x40, 0x44, +0xAF, 0xFF, 0x17, 0x3E, 0x11, 0x00, 0xEF, 0x41, +0x07, 0x00, 0x10, 0x3C, 0x88, 0x00, 0x10, 0x46, +0xDC, 0x14, 0x28, 0x3E, 0x99, 0xFF, 0x17, 0x2E, +0xE2, 0xFF, 0x1B, 0x3C, 0x4A, 0x00, 0xE0, 0x3D, +0xBE, 0x0B, 0x10, 0x3C, 0x19, 0x00, 0x03, 0x10, +0x00, 0x00, 0x73, 0x22, 0x06, 0x00, 0x20, 0x3C, +0x24, 0x1C, 0x78, 0x3E, 0x11, 0x01, 0x32, 0x38, +0x11, 0x01, 0x12, 0x38, 0x4F, 0x00, 0x50, 0x3C, +0x90, 0x00, 0x68, 0x3E, 0x11, 0x01, 0x41, 0x38, +0x94, 0x1B, 0x08, 0x3E, 0x64, 0x00, 0x50, 0x44, +0xBE, 0x0B, 0x20, 0x3C, 0xB2, 0x10, 0x18, 0x3C, +0x00, 0x08, 0x21, 0x58, 0x17, 0x00, 0xF0, 0x46, +0x0A, 0x00, 0x10, 0x04, 0x03, 0x00, 0x21, 0x42, +0x80, 0x00, 0x21, 0x52, 0xA4, 0x00, 0x18, 0x3E, +0xE0, 0x95, 0x00, 0x49, 0x30, 0x8F, 0x00, 0x49, +0xCC, 0x09, 0x88, 0x3E, 0xF4, 0xFF, 0x1B, 0x3C, +0x01, 0x81, 0x50, 0x38, 0xC6, 0x0B, 0x14, 0x3C, +0x24, 0x1C, 0x28, 0x3E, 0xEA, 0xFF, 0x1B, 0x3C, +0xCA, 0x0D, 0x20, 0x3C, 0xCD, 0x88, 0x00, 0x49, +0x08, 0x20, 0x00, 0x40, 0x01, 0x80, 0x44, 0x50, +0x00, 0x80, 0x0F, 0x44, 0xBA, 0x0C, 0x10, 0x3C, +0x09, 0x01, 0x11, 0x38, 0x01, 0x80, 0x10, 0x66, +0xC8, 0x0B, 0x18, 0x3C, 0xCC, 0x09, 0x08, 0x3E, +0xF0, 0x0F, 0x50, 0x46, 0x5B, 0x07, 0x10, 0x3C, +0x24, 0x28, 0x13, 0x42, 0x00, 0x28, 0x5F, 0x40, +0x22, 0x01, 0x00, 0x22, 0xEA, 0x0B, 0x34, 0x3C, +0x11, 0x81, 0x30, 0x38, 0x01, 0x01, 0x20, 0x46, +0x04, 0xA0, 0x31, 0x40, 0x20, 0x00, 0x51, 0x22, +0x03, 0x80, 0x52, 0x42, 0x20, 0x00, 0x00, 0x2E, +0x64, 0x21, 0x18, 0x3E, 0x00, 0x00, 0x33, 0x22, +0xB4, 0xFF, 0x17, 0x3E, 0x06, 0x00, 0x10, 0x3C, +0x03, 0x80, 0x80, 0x00, 0x24, 0x0C, 0x02, 0x3A, +0x24, 0x1C, 0x18, 0x3E, 0x80, 0x00, 0xF0, 0x46, +0x81, 0x00, 0xF0, 0x46, 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, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x03, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xB4, 0x91, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x64, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x3C, 0x00, +0x3C, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, +0x50, 0x00, 0x50, 0x00, 0x1E, 0x00, 0x01, 0x00, +0xE8, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, +0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x04, 0x02, +0x10, 0x00, 0x28, 0x00, 0x19, 0x00, 0x10, 0x28, +0x03, 0x00, 0x90, 0x01, 0xF4, 0x01, 0x02, 0x00, +0x23, 0x00, 0x32, 0x00, 0x03, 0x05, 0x1B, 0x00, +0x1B, 0x00, 0x00, 0x00, 0x96, 0x00, 0x14, 0x00, +0x0A, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0xC8, 0x00, +0x0F, 0x00, 0x46, 0x00, 0x3C, 0x00, 0x96, 0x00, +0x01, 0x00, 0x02, 0x00, 0x64, 0x00, 0x96, 0x00, +0x1E, 0x00, 0x3C, 0x00, 0x0A, 0x00, 0x0A, 0x00, +0x19, 0x00, 0xF4, 0x01, 0x0A, 0x00, 0x02, 0x00, +0x1E, 0x00, 0x0A, 0x00, 0x06, 0x00, 0x01, 0x00, +0x03, 0x00, 0x03, 0x00, 0xF4, 0x01, 0x0A, 0x00, +0x13, 0x00, 0x0A, 0x00, 0x17, 0x00, 0x16, 0x01, +0x15, 0x02, 0x14, 0x03, 0x13, 0x04, 0x12, 0x05, +0x11, 0x06, 0x10, 0x07, 0x0F, 0x08, 0x0E, 0x09, +0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, +0x1C, 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x06, 0x00, 0x0F, 0x00, 0x32, 0x00, +0x05, 0x00, 0x07, 0x00, 0x32, 0x00, 0x05, 0x00, +0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 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, +0x44, 0x91, 0x20, 0x10, 0x02, 0x80, 0x00, 0x00, +0x02, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, +0x12, 0x00, 0x01, 0x00, 0x02, 0x00, 0x07, 0x00, +0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0E, 0x07, +0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x2C, 0x01, +0x1C, 0x02, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x0A, 0x00, 0x50, 0x00, 0x1E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, +0x05, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, +0x44, 0x00, 0x44, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x8C, 0x0A, 0x04, 0x00, 0x03, 0x00, 0x03, 0x00, +0x02, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, +0x64, 0x00, 0x50, 0x00, 0x64, 0x00, 0x50, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0x7C, 0x01, 0xC8, 0x00, +0x07, 0x00, 0x0F, 0x00, 0xFF, 0xFF, 0x0F, 0x00, +0x0F, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, +0x40, 0x00, 0x3C, 0x00, 0x40, 0x00, 0x40, 0x00, +0x0F, 0x80, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x01, +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, +0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, +0x32, 0x00, 0xC4, 0x09, 0xC8, 0x00, 0x00, 0x00, +0x6D, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xC4, 0x09, 0x8A, 0x00, 0xFF, 0xFF, +0xE8, 0x03, 0x3C, 0xF6, 0xDC, 0x00, 0x78, 0x00, +0x5E, 0x01, 0xC4, 0x09, 0x2C, 0x01, 0x28, 0x00, +0x00, 0x00, 0x08, 0x00, 0x04, 0x02, 0x20, 0x28, +0x14, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, +0xFF, 0xFF, 0x20, 0x40, 0x06, 0x03, 0x10, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x00, 0x07, 0x00, +0x03, 0x00, 0x8B, 0x00, 0xFF, 0xFF, 0xFF, 0x7F, +0x0F, 0x04, 0x00, 0x00, 0x3B, 0x00, 0x02, 0x00, +0xFF, 0xFF, 0xFF, 0x7F, 0x61, 0x5B, 0x00, 0x00, +0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x20, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, +0x00, 0x00, 0x49, 0x17, 0x08, 0x00, 0x00, 0x00, +0x00, 0x01, 0x60, 0x00, 0x19, 0x00, 0x01, 0x00, +0x96, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0x00, 0x00, +0x96, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x03, 0x00, +0xFF, 0xFF, 0x44, 0x06, 0x00, 0x00, 0x20, 0x00, +0x6D, 0x00, 0x0C, 0x00, 0x3C, 0x00, 0x88, 0x13, +0x19, 0x00, 0x46, 0x00, 0x05, 0x00, 0x01, 0x08, +0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, +0x1E, 0x00, 0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, +0x00, 0x00, 0x64, 0x00, 0x03, 0x00, 0x02, 0x00, +0x06, 0x00, 0x03, 0x00, 0x03, 0x00, 0xF4, 0x01, +0x4A, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x21, 0x00, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0x03, 0x04, +0x64, 0x00, 0x2D, 0x00, 0x36, 0x00, 0x35, 0x00, +0xA2, 0x00, 0x35, 0x00, 0x0E, 0x01, 0x35, 0x00, +0x7A, 0x01, 0x35, 0x00, 0xE6, 0x01, 0x35, 0x00, +0xE6, 0x01, 0xA0, 0x00, 0x7A, 0x01, 0xA0, 0x00, +0x0E, 0x01, 0xA0, 0x00, 0xA2, 0x00, 0xA0, 0x00, +0x36, 0x00, 0xA0, 0x00, 0x36, 0x00, 0x0B, 0x01, +0xA2, 0x00, 0x0B, 0x01, 0x0E, 0x01, 0x0B, 0x01, +0x7A, 0x01, 0x0B, 0x01, 0xE6, 0x01, 0x0B, 0x01, +0xE6, 0x01, 0x75, 0x01, 0x7A, 0x01, 0x75, 0x01, +0x0E, 0x01, 0x75, 0x01, 0xA2, 0x00, 0x75, 0x01, +0x36, 0x00, 0x75, 0x01, 0x36, 0x00, 0xE0, 0x01, +0xA2, 0x00, 0xE0, 0x01, 0x0E, 0x01, 0xE0, 0x01, +0x7A, 0x01, 0xE0, 0x01, 0xE6, 0x01, 0xE0, 0x01, +0xE6, 0x01, 0x4B, 0x02, 0x7A, 0x01, 0x4B, 0x02, +0x0E, 0x01, 0x4B, 0x02, 0xA2, 0x00, 0x4B, 0x02, +0x36, 0x00, 0x4B, 0x02, 0x36, 0x00, 0xB5, 0x02, +0xA2, 0x00, 0xB5, 0x02, 0x0E, 0x01, 0xB5, 0x02, +0x7A, 0x01, 0xB5, 0x02, 0xE6, 0x01, 0xB5, 0x02, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0x03, 0x02, 0x00, +0x05, 0x00, 0x03, 0x00, 0x3C, 0x00, 0x28, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xE6, 0x01, 0x20, 0x03, 0x7A, 0x01, 0x20, 0x03, +0x0E, 0x01, 0x20, 0x03, 0xA2, 0x00, 0x20, 0x03, +0x36, 0x00, 0x20, 0x03, 0x36, 0x00, 0x8B, 0x03, +0xA2, 0x00, 0x8B, 0x03, 0x0E, 0x01, 0x8B, 0x03, +0x7A, 0x01, 0x8B, 0x03, 0xE6, 0x01, 0x8B, 0x03, +0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x02, 0x00, 0x19, 0x00, 0x24, 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, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; +#endif diff --git a/drivers/input/touchscreen/zinitix_bt541_ts.c b/drivers/input/touchscreen/zinitix_bt541_ts.c new file mode 100644 index 00000000..eba65108 --- /dev/null +++ b/drivers/input/touchscreen/zinitix_bt541_ts.c @@ -0,0 +1,6284 @@ +/* + * + * Zinitix bt541 touchscreen driver + * + * Copyright (C) 2013 Samsung Electronics Co.Ltd + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + + +#define TSP_VERBOSE_DEBUG +#define SEC_FACTORY_TEST +#define SUPPORTED_TOUCH_KEY + +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#if defined(CONFIG_PM_RUNTIME) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +/* added header file */ +/* #define SUPPORTED_USE_DUAL_FW */ +#ifdef SUPPORTED_USE_DUAL_FW +#include "zinitix_bt541_firmware_00.h" +#include "zinitix_bt541_firmware_01.h" +u8 *m_firmware_data; +#else +#include "zinitix_bt541_firmware.h" +#endif + +extern void (*tsp_charger_status_cb)(int); + +#ifdef SUPPORTED_USE_DUAL_FW +#define TSP_TYPE_COUNT 2 +u8 *m_pFirmware[TSP_TYPE_COUNT] = {(u8 *)m_firmware_data_00, (u8 *)m_firmware_data_01,}; +u8 m_FirmwareIdx = 0; +#define CHECK_HWID 1 +static void bt541_firmware_check(void); +#else +#define CHECK_HWID 0 +#endif + +static bool ta_connected =0; +#define ZINITIX_DEBUG 1 +#define ZINITIX_I2C_CHECKSUM 1 +#define TOUCH_BOOSTER 0 +#define NOT_SUPPORTED_TOUCH_DUMMY_KEY +#if TOUCH_BOOSTER +#include +#include +extern int _store_cpu_num_min_limit(unsigned int input); +struct cpufreq_limit_handle *min_handle = NULL; +static const unsigned long touch_cpufreq_lock = 1200000; +#endif + +#ifdef SUPPORTED_PALM_TOUCH +#define TOUCH_POINT_MODE 2 +#else +#define TOUCH_POINT_MODE 0 +#endif + +#define MAX_SUPPORTED_FINGER_NUM 2 /* max 10 */ + +#ifdef SUPPORTED_TOUCH_KEY +#ifdef NOT_SUPPORTED_TOUCH_DUMMY_KEY +#define MAX_SUPPORTED_BUTTON_NUM 2 /* max 8 */ +#define SUPPORTED_BUTTON_NUM 2 +#else +#define MAX_SUPPORTED_BUTTON_NUM 2 /* max 8 */ +#define SUPPORTED_BUTTON_NUM 2 +#endif +#endif + +/* Upgrade Method*/ +#define TOUCH_ONESHOT_UPGRADE 1 +/* if you use isp mode, you must add i2c device : + name = "zinitix_isp" , addr 0x50*/ + +/* resolution offset */ +#define ABS_PT_OFFSET (0) + +#define TOUCH_FORCE_UPGRADE 1 +#define USE_CHECKSUM 1 + +#define CHIP_OFF_DELAY 50 /*ms*/ +#define CHIP_ON_DELAY 20 /*15*/ /*ms*/ +#define FIRMWARE_ON_DELAY 60 /*40*/ /*ms*/ + +#define DELAY_FOR_SIGNAL_DELAY 30 /*us*/ +#define DELAY_FOR_TRANSCATION 50 +#define DELAY_FOR_POST_TRANSCATION 10 + +/* PMIC Regulator based supply to TSP */ +#define TSP_REGULATOR_SUPPLY 1 +/* gpio controlled LDO based supply to TSP */ +#define TSP_LDO_SUPPLY 0 + +enum power_control { + POWER_OFF, + POWER_ON, + POWER_ON_SEQUENCE, +}; + +/* Key Enum */ +enum key_event { + ICON_BUTTON_UNCHANGE, + ICON_BUTTON_DOWN, + ICON_BUTTON_UP, +}; + +/* ESD Protection */ +/*second : if 0, no use. if you have to use, 3 is recommended*/ +#define ESD_TIMER_INTERVAL 1 +#define SCAN_RATE_HZ 100 +#define CHECK_ESD_TIMER 3 + +/*Test Mode (Monitoring Raw Data) */ +#define MAX_RAW_DATA_SZ 576 /* 32x18 */ +#define MAX_TRAW_DATA_SZ \ + (MAX_RAW_DATA_SZ + 4*MAX_SUPPORTED_FINGER_NUM + 2) +/* preriod raw data interval */ + +#define RAWDATA_DELAY_FOR_HOST 100 + +struct raw_ioctl { + u32 sz; + u32 buf; +}; + +struct reg_ioctl { + u32 addr; + u32 val; +}; + +#define TOUCH_SEC_MODE 48 +#define TOUCH_REF_MODE 10 +#define TOUCH_NORMAL_MODE 5 +#define TOUCH_DELTA_MODE 3 +#define TOUCH_SDND_MODE 6 +#define TOUCH_DND_MODE 11 + +/* Other Things */ +#define INIT_RETRY_CNT 1 +#define I2C_SUCCESS 0 +#define I2C_FAIL 1 + +/*---------------------------------------------------------------------*/ + +/* Register Map*/ +#define BT541_SWRESET_CMD 0x0000 +#define BT541_WAKEUP_CMD 0x0001 + +#define BT541_IDLE_CMD 0x0004 +#define BT541_SLEEP_CMD 0x0005 + +#define BT541_CLEAR_INT_STATUS_CMD 0x0003 +#define BT541_CALIBRATE_CMD 0x0006 +#define BT541_SAVE_STATUS_CMD 0x0007 +#define BT541_SAVE_CALIBRATION_CMD 0x0008 +#define BT541_RECALL_FACTORY_CMD 0x000f + +#define BT541_THRESHOLD 0x0020 + +#define BT541_DEBUG_REG 0x0115 /* 0~7 */ + +#define BT541_TOUCH_MODE 0x0010 +#define BT541_CHIP_REVISION 0x0011 +#define BT541_FIRMWARE_VERSION 0x0012 + +#define BT541_MINOR_FW_VERSION 0x0121 + +#define BT541_VENDOR_ID 0x001C +#define BT541_MODULE_ID 0x001E +#define BT541_HW_ID 0x0014 + +#define BT541_DATA_VERSION_REG 0x0013 +#define BT541_SUPPORTED_FINGER_NUM 0x0015 +#define BT541_EEPROM_INFO 0x0018 +#define BT541_INITIAL_TOUCH_MODE 0x0019 + +#define BT541_TOTAL_NUMBER_OF_X 0x0060 +#define BT541_TOTAL_NUMBER_OF_Y 0x0061 + +#define BT541_DELAY_RAW_FOR_HOST 0x007f + +#define BT541_BUTTON_SUPPORTED_NUM 0x00B0 +#define BT541_BUTTON_SENSITIVITY 0x00B2 +#define BT541_DUMMY_BUTTON_SENSITIVITY 0X00C8 +#define BT541_BTN_WIDTH 0x016d + + +#define BT541_X_RESOLUTION 0x00C0 +#define BT541_Y_RESOLUTION 0x00C1 + +#define BT541_POINT_STATUS_REG 0x0080 +#define BT541_ICON_STATUS_REG 0x00AA + +#define BT541_AFE_FREQUENCY 0x0100 +#define BT541_DND_N_COUNT 0x0122 +#define BT541_DND_U_COUNT 0x0135 +#define BT541_SHIFT_VALUE 0x012B + +#define BT541_RAWDATA_REG 0x0200 + +#define BT541_EEPROM_INFO_REG 0x0018 + +#define BT541_INT_ENABLE_FLAG 0x00f0 +#define BT541_PERIODICAL_INTERRUPT_INTERVAL 0x00f1 + +#define BT541_CHECKSUM_RESULT 0x012c + +#define BT541_INIT_FLASH 0x01d0 +#define BT541_WRITE_FLASH 0x01d1 +#define BT541_READ_FLASH 0x01d2 + +#define ZINITIX_INTERNAL_FLAG_02 0x011e + +#define BT541_OPTIONAL_SETTING 0x0116 + +/* Interrupt & status register flag bit + ------------------------------------------------- + */ +#define BIT_PT_CNT_CHANGE 0 +#define BIT_DOWN 1 +#define BIT_MOVE 2 +#define BIT_UP 3 +#define BIT_PALM 4 +#define BIT_PALM_REJECT 5 +#define RESERVED_0 6 +#define RESERVED_1 7 +#define BIT_WEIGHT_CHANGE 8 +#define BIT_PT_NO_CHANGE 9 +#define BIT_REJECT 10 +#define BIT_PT_EXIST 11 +#define RESERVED_2 12 +#define BIT_MUST_ZERO 13 +#define BIT_DEBUG 14 +#define BIT_ICON_EVENT 15 + +/* button */ +#define BIT_O_ICON0_DOWN 0 +#define BIT_O_ICON1_DOWN 1 +#define BIT_O_ICON2_DOWN 2 +#define BIT_O_ICON3_DOWN 3 +#define BIT_O_ICON4_DOWN 4 +#define BIT_O_ICON5_DOWN 5 +#define BIT_O_ICON6_DOWN 6 +#define BIT_O_ICON7_DOWN 7 + +#define BIT_O_ICON0_UP 8 +#define BIT_O_ICON1_UP 9 +#define BIT_O_ICON2_UP 10 +#define BIT_O_ICON3_UP 11 +#define BIT_O_ICON4_UP 12 +#define BIT_O_ICON5_UP 13 +#define BIT_O_ICON6_UP 14 +#define BIT_O_ICON7_UP 15 + + +#define SUB_BIT_EXIST 0 +#define SUB_BIT_DOWN 1 +#define SUB_BIT_MOVE 2 +#define SUB_BIT_UP 3 +#define SUB_BIT_UPDATE 4 +#define SUB_BIT_WAIT 5 + + +#define zinitix_bit_set(val, n) ((val) &= ~(1<<(n)), (val) |= (1<<(n))) +#define zinitix_bit_clr(val, n) ((val) &= ~(1<<(n))) +#define zinitix_bit_test(val, n) ((val) & (1<<(n))) +#define zinitix_swap_v(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) +#define zinitix_swap_16(s) (((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))) + +/* end header file */ + +#ifdef SEC_FACTORY_TEST +/* Touch Screen */ +#define TSP_CMD_STR_LEN 32 +#define TSP_CMD_RESULT_STR_LEN 512 +#define TSP_CMD_PARAM_NUM 8 +#define TSP_CMD_Y_NUM 18 +#define TSP_CMD_X_NUM 30 +#define TSP_CMD_NODE_NUM (TSP_CMD_Y_NUM * TSP_CMD_X_NUM) + +struct tsp_factory_info { + struct list_head cmd_list_head; + char cmd[TSP_CMD_STR_LEN]; + char cmd_param[TSP_CMD_PARAM_NUM]; + char cmd_result[TSP_CMD_RESULT_STR_LEN]; + char cmd_buff[TSP_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; + u8 cmd_state; +}; + +struct tsp_raw_data { + u16 ref_data[TSP_CMD_NODE_NUM]; + u16 pref_data[TSP_CMD_NODE_NUM]; + /*s16 scantime_data[TSP_CMD_NODE_NUM]; */ + s16 delta_data[TSP_CMD_NODE_NUM]; +}; + +enum { + WAITING = 0, + RUNNING, + OK, + FAIL, + NOT_APPLICABLE, +}; + +struct tsp_cmd { + struct list_head list; + const char *cmd_name; + void (*cmd_func)(void *device_data); +}; + +static void fw_update(void *device_data); +static void get_fw_ver_bin(void *device_data); +static void get_fw_ver_ic(void *device_data); +static void module_off_master(void *device_data); +static void module_on_master(void *device_data); +static void module_off_slave(void *device_data); +static void module_on_slave(void *device_data); +static void get_chip_vendor(void *device_data); +static void get_chip_name(void *device_data); +static void get_threshold(void *device_data); +static void get_x_num(void *device_data); +static void get_y_num(void *device_data); +static void not_support_cmd(void *device_data); + +/* Vendor dependant command */ +#ifdef SUPPORTED_USE_DUAL_FW +static void get_module_vendor(void *device_data); +#endif + +static void get_reference_DND(void *device_data); +/*static void get_reference_RxDND(void *device_data);*/ +static void get_reference_HFDND(void *device_data); +/*static void get_reference_RxHFDND(void *device_data);*/ +/*static void get_tkey_delta(void *device_data);*/ +static void get_reference_V_Diff(void *device_data); +/*static void get_reference_max_V_Diff(void *device_data);*/ +static void get_reference_H_Diff(void * device_data); +/*static void get_reference_max_H_Diff(void * device_data);*/ +/*static void get_max_dnd(void *device_data);*/ +/*static void get_min_dnd(void *device_data);*/ +/*static void get_max_hfdnd(void *device_data);*/ +/*static void get_min_hfdnd(void *device_data);*/ +/*static void get_max_hdiff(void *device_data);*/ +/*static void get_min_hdiff(void *device_data);*/ +/*static void get_max_vdiff(void *device_data);*/ +/*static void get_min_vdiff(void *device_data);*/ +/*static void get_reference(void *device_data);*/ +/*static void get_preference(void *device_data);*/ +/*static void run_preference_read(void *device_data);*/ +static void run_reference_DND(void *device_data); +static void run_reference_HFDND(void *device_data); +static void run_reference_V_Diff(void *device_data); +static void run_reference_H_Diff(void *device_data); +/*static void run_reference_read(void *device_data);*/ +static void hfdnd_spec_adjust(void *device_data); +static void clear_reference_data(void *device_data); +static void run_ref_calibration(void *device_data); + +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func +static struct tsp_cmd tsp_cmds[] = { + {TSP_CMD("fw_update", fw_update),}, + {TSP_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {TSP_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {TSP_CMD("get_threshold", get_threshold),}, + {TSP_CMD("module_off_master", module_off_master),}, + {TSP_CMD("module_on_master", module_on_master),}, + {TSP_CMD("module_off_slave", module_off_slave),}, + {TSP_CMD("module_on_slave", module_on_slave),}, + {TSP_CMD("get_chip_vendor", get_chip_vendor),}, + {TSP_CMD("get_chip_name", get_chip_name),}, + {TSP_CMD("get_x_num", get_x_num),}, + {TSP_CMD("get_y_num", get_y_num),}, + {TSP_CMD("not_support_cmd", not_support_cmd),}, + + /* vendor dependant command */ +#ifdef SUPPORTED_USE_DUAL_FW + {TSP_CMD("get_module_vendor", get_module_vendor),}, +#endif + {TSP_CMD("run_reference_read", run_reference_DND),}, + {TSP_CMD("get_reference", get_reference_DND),}, + {TSP_CMD("run_vdiff_read", run_reference_V_Diff),}, + {TSP_CMD("get_vdiff", get_reference_V_Diff),}, + {TSP_CMD("run_hdiff_read", run_reference_H_Diff),}, + {TSP_CMD("get_hdiff", get_reference_H_Diff),}, + {TSP_CMD("run_highfreq_read", run_reference_HFDND),}, + {TSP_CMD("get_highfreq", get_reference_HFDND),}, + {TSP_CMD("hfdnd_spec_adjust", hfdnd_spec_adjust),}, + {TSP_CMD("clear_reference_data", clear_reference_data),}, + {TSP_CMD("run_ref_calibration", run_ref_calibration),}, + /* + {TSP_CMD("get_reference_DND", get_reference_DND),}, + {TSP_CMD("get_reference_RxDND", get_reference_RxDND),}, + {TSP_CMD("get_reference_HFDND", get_reference_HFDND),}, + {TSP_CMD("get_reference_RxHFDND", get_reference_RxHFDND),}, + {TSP_CMD("get_reference_V_DIFF", get_reference_V_Diff),}, + {TSP_CMD("get_reference_max_V_DIFF", get_reference_max_V_Diff),}, + {TSP_CMD("get_reference_H_DIFF", get_reference_H_Diff),}, + {TSP_CMD("get_reference_max_H_DIFF", get_reference_max_H_Diff),}, + {TSP_CMD("run_reference_HFDND", run_reference_HFDND),}, + {TSP_CMD("run_reference_DND", run_reference_DND),}, + {TSP_CMD("run_reference_diff", run_reference_PDiff),}, + {TSP_CMD("get_max_dnd", get_max_dnd),}, + {TSP_CMD("get_min_dnd", get_min_dnd),}, + {TSP_CMD("get_max_hfdnd", get_max_hfdnd),}, + {TSP_CMD("get_min_hfdnd", get_min_hfdnd),}, + {TSP_CMD("get_max_hdiff", get_max_hdiff),}, + {TSP_CMD("get_min_hdiff", get_min_hdiff),}, + {TSP_CMD("get_max_vdiff", get_max_vdiff),}, + {TSP_CMD("get_min_vdiff", get_min_vdiff),}, + {TSP_CMD("get_tkey_delta", get_tkey_delta),}, + {TSP_CMD("run_reference_read", run_reference_read),}, + {TSP_CMD("get_reference", get_reference),}, + {TSP_CMD("run_dnd_read", run_preference_read),}, + {TSP_CMD("get_dnd", get_preference),}, + */ +}; +#if 0 +#ifdef SUPPORTED_TOUCH_KEY +/* Touch Key */ +static ssize_t touchkey_threshold(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t touch_sensitivity(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t touchkey_back(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t touchkey_recent(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t autocal_stat(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t touchkey_raw_back(struct device *dev, + struct device_attribute *attr, char *buf); +static ssize_t touchkey_raw_menu(struct device *dev, + struct device_attribute *attr, char *buf); +/*static ssize_t touchkey_idac_back(struct device *dev, + struct device_attribute *attr, char *buf); + static ssize_t touchkey_idac_menu(struct device *dev, + struct device_attribute *attr, char *buf); + */ +#endif +#endif +#endif + +#define TSP_NORMAL_EVENT_MSG 1 +static int m_ts_debug_mode = ZINITIX_DEBUG; + +#if ESD_TIMER_INTERVAL +static struct workqueue_struct *esd_tmr_workqueue; +#endif + +struct coord { + u16 x; + u16 y; + u8 width; + u8 sub_status; +#if (TOUCH_POINT_MODE == 2) + u8 minor_width; + u8 angle; +#endif +}; + +struct point_info { + u16 status; +#if (TOUCH_POINT_MODE == 1) + u16 event_flag; +#else + u8 finger_cnt; + u8 time_stamp; +#endif + struct coord coord[MAX_SUPPORTED_FINGER_NUM]; +}; + +#define TOUCH_V_FLIP 0x01 +#define TOUCH_H_FLIP 0x02 +#define TOUCH_XY_SWAP 0x04 + +/*Test Mode (Monitoring Raw Data) */ +/*---------------------------------------------------------------------*/ +/* GF1 */ +/*---------------------------------------------------------------------*/ +#define PDIFF_DEBUG 1 + +#define TSP_INIT_TEST_RATIO 100 + +#define SEC_DND_N_COUNT 16 +#define SEC_DND_U_COUNT 20 +#define SEC_DND_FREQUENCY 138 /*300khz*/ + +#define SEC_HFDND_N_COUNT 16 +#define SEC_HFDND_U_COUNT 20 +#define SEC_HFDND_FREQUENCY 27 /*300khz*/ +/*---------------------------------------------------------------------*/ +struct capa_info { + u16 vendor_id; + u16 ic_revision; + u16 fw_version; + u16 fw_minor_version; + u16 reg_data_version; + u16 threshold; + u16 key_threshold; + u16 dummy_threshold; + u32 ic_fw_size; + u32 MaxX; + u32 MaxY; + u32 MinX; + u32 MinY; + u8 gesture_support; + u16 multi_fingers; + u16 button_num; + u16 ic_int_mask; + u16 x_node_num; + u16 y_node_num; + u16 total_node_num; + u16 hw_id; + u16 module_id; + u16 afe_frequency; + u16 shift_value; + u16 N_cnt; + u16 U_cnt; + u16 i2s_checksum; +}; + +enum work_state { + NOTHING = 0, + NORMAL, + ESD_TIMER, + EALRY_SUSPEND, + SUSPEND, + RESUME, + LATE_RESUME, + UPGRADE, + REMOVE, + SET_MODE, + HW_CALIBRAION, + RAW_DATA, + PROBE, +}; + +enum { + BUILT_IN = 0, + UMS, + REQ_FW, +}; + +struct bt541_ts_info; + +struct bt541_ts_platform_data { + u32 gpio_int; + u32 gpio_ldo_en; + int (*tsp_power)(struct bt541_ts_info *info, int on); + u32 x_resolution; + u32 y_resolution; + u32 page_size; + u32 orientation; + u32 tsp_supply_type; +}; + +struct bt541_ts_info { + struct i2c_client *client; + struct input_dev *input_dev; + struct bt541_ts_platform_data *pdata; + char phys[32]; + /*struct task_struct *task;*/ + /*wait_queue_head_t wait;*/ + /*struct semaphore update_lock;*/ + /*u32 i2c_dev_addr;*/ + struct capa_info cap_info; + struct point_info touch_info; + struct point_info reported_touch_info; + u16 icon_event_reg; + u16 prev_icon_event; + /*u16 event_type;*/ + int irq; + u8 button[MAX_SUPPORTED_BUTTON_NUM]; + u8 work_state; + struct semaphore work_lock; + /*u16 debug_reg[8];*/ /* for debug */ +#if ESD_TIMER_INTERVAL + struct work_struct tmr_work; + struct timer_list esd_timeout_tmr; + struct timer_list *p_esd_timeout_tmr; + spinlock_t lock; +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + struct semaphore raw_data_lock; + u16 touch_mode; + s16 cur_data[MAX_TRAW_DATA_SZ]; + u8 update; +#ifdef SEC_FACTORY_TEST + struct tsp_factory_info *factory_info; + struct tsp_raw_data *raw_data; + + s16 ref_data[MAX_RAW_DATA_SZ]; + s16 normal_data[MAX_RAW_DATA_SZ]; + s16 delta_data[MAX_RAW_DATA_SZ]; + u16 pdnd_data[MAX_RAW_DATA_SZ]; + u16 hfdnd_data[MAX_RAW_DATA_SZ]; + u16 PDND2_N_cnt; + u16 PDND2_u_cnt; + u16 PDND2_freq; + + s16 ref_btn_option; + + s16 dnd_max_x; + s16 dnd_max_y; + s16 dnd_max_val; + s16 dnd_real_max_x; + s16 dnd_real_max_y; + s16 dnd_real_max_val; + s16 dnd_min_x; + s16 dnd_min_y; + s16 dnd_min_val; + s16 dnd_real_min_x; + s16 dnd_real_min_y; + s16 dnd_real_min_val; + s16 dnd_node_num; + + s16 hfdnd_max_x; + s16 hfdnd_max_y; + s16 hfdnd_max_val; + s16 hfdnd_real_max_x; + s16 hfdnd_real_max_y; + s16 hfdnd_real_max_val; + s16 hfdnd_min_x; + s16 hfdnd_min_y; + s16 hfdnd_min_val; + s16 hfdnd_real_min_x; + s16 hfdnd_real_min_y; + s16 hfdnd_real_min_val; + s16 hfdnd_node_num; + + s16 hdiff_max_x; + s16 hdiff_max_y; + s16 hdiff_max_val; + s16 hdiff_min_x; + s16 hdiff_min_y; + s16 hdiff_min_val; + s16 hdiff_diff_val; + s16 hdiff_node_num; + + s16 vdiff_max_x; + s16 vdiff_max_y; + s16 vdiff_max_val; + s16 vdiff_min_x; + s16 vdiff_min_y; + s16 vdiff_min_val; + s16 vdiff_diff_val; + s16 vdiff_node_num; + + bool dnd_done; + bool hfdnd_done; + +#endif +#if TOUCH_BOOSTER + u8 finger_cnt; +#endif +}; +/* Dummy touchkey code */ +#define KEY_DUMMY_HOME1 249 +#define KEY_DUMMY_HOME2 250 +#define KEY_DUMMY_MENU 251 +#define KEY_DUMMY_HOME 252 +#define KEY_DUMMY_BACK 253 +/*<= you must set key button mapping*/ +#ifdef NOT_SUPPORTED_TOUCH_DUMMY_KEY +u32 BUTTON_MAPPING_KEY[MAX_SUPPORTED_BUTTON_NUM] = { + KEY_APPSELECT, KEY_BACK}; +#else +u32 BUTTON_MAPPING_KEY[MAX_SUPPORTED_BUTTON_NUM] = { + KEY_DUMMY_MENU, KEY_RECENT,// KEY_DUMMY_HOME1, + /*KEY_DUMMY_HOME2,*/ KEY_BACK, KEY_DUMMY_BACK}; +#endif + + +static int cal_mode; +static int get_boot_mode(char *str) +{ + + get_option(&str, &cal_mode); + printk("get_boot_mode, uart_mode : %d\n", cal_mode); + return 1; +} +__setup("calmode=",get_boot_mode); +/* define i2c sub functions*/ +static inline s32 read_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + int count = 0; +retry: + /* select register*/ + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) { + mdelay(1); + + if (++count < 8) + goto retry; + + return ret; + } + /* for setup tx transaction. */ + udelay(DELAY_FOR_TRANSCATION); + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 write_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + int count = 0; + u8 pkt[10]; /* max packet */ + pkt[0] = (reg) & 0xff; /* reg addr */ + pkt[1] = (reg >> 8)&0xff; + memcpy((u8 *)&pkt[2], values, length); + +retry: + ret = i2c_master_send(client , pkt , length + 2); + if (ret < 0) { + mdelay(1); + + if (++count < 8) + goto retry; + printk(KERN_INFO "%s, count = %d\n", __func__, count); + + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 write_reg(struct i2c_client *client, u16 reg, u16 value) +{ + if (write_data(client, reg, (u8 *)&value, 2) < 0) + return I2C_FAIL; + + return I2C_SUCCESS; +} + +static inline s32 write_cmd(struct i2c_client *client, u16 reg) +{ + s32 ret; + int count = 0; + +retry: + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) { + mdelay(1); + + if (++count < 8) + goto retry; + + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return I2C_SUCCESS; +} + +static inline s32 read_raw_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + int count = 0; + +retry: + /* select register */ + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) { + mdelay(1); + + if (++count < 8) + goto retry; + + return ret; + } + + /* for setup tx transaction. */ + udelay(200); + + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 read_firmware_data(struct i2c_client *client, + u16 addr, u8 *values, u16 length) +{ + s32 ret; + /* select register*/ + + ret = i2c_master_send(client , (u8 *)&addr , 2); + if (ret < 0) + return ret; + + /* for setup tx transaction. */ + mdelay(1); + + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void bt541_ts_early_suspend(struct early_suspend *h); +static void bt541_ts_late_resume(struct early_suspend *h); +#endif + +static bool bt541_power_control(struct bt541_ts_info *info, u8 ctl); +static int bt541_power(struct bt541_ts_info *info, int on); + +static bool init_touch(struct bt541_ts_info *info, bool fw_oneshot_upgrade); +static bool mini_init_touch(struct bt541_ts_info *info); +static void clear_report_data(struct bt541_ts_info *info); +#if ESD_TIMER_INTERVAL +static void esd_timer_start(u16 sec, struct bt541_ts_info *info); +static void esd_timer_stop(struct bt541_ts_info *info); +static void esd_timer_init(struct bt541_ts_info *info); +static void esd_timeout_handler(unsigned long data); +#endif + +static long ts_misc_fops_ioctl(struct file *filp, unsigned int cmd, + unsigned long arg); +static int ts_misc_fops_open(struct inode *inode, struct file *filp); +static int ts_misc_fops_close(struct inode *inode, struct file *filp); + +static const struct file_operations ts_misc_fops = { + .owner = THIS_MODULE, + .open = ts_misc_fops_open, + .release = ts_misc_fops_close, + .unlocked_ioctl = ts_misc_fops_ioctl, + .compat_ioctl = ts_misc_fops_ioctl, +}; + +static struct miscdevice touch_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "zinitix_touch_misc", + .fops = &ts_misc_fops, +}; + +#define TOUCH_IOCTL_BASE 0xbc +#define TOUCH_IOCTL_GET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 0, int) +#define TOUCH_IOCTL_SET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 1, int) +#define TOUCH_IOCTL_GET_CHIP_REVISION _IOW(TOUCH_IOCTL_BASE, 2, int) +#define TOUCH_IOCTL_GET_FW_VERSION _IOW(TOUCH_IOCTL_BASE, 3, int) +#define TOUCH_IOCTL_GET_REG_DATA_VERSION _IOW(TOUCH_IOCTL_BASE, 4, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_SIZE _IOW(TOUCH_IOCTL_BASE, 5, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_DATA _IOW(TOUCH_IOCTL_BASE, 6, int) +#define TOUCH_IOCTL_START_UPGRADE _IOW(TOUCH_IOCTL_BASE, 7, int) +#define TOUCH_IOCTL_GET_X_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 8, int) +#define TOUCH_IOCTL_GET_Y_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 9, int) +#define TOUCH_IOCTL_GET_TOTAL_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 10, int) +#define TOUCH_IOCTL_SET_RAW_DATA_MODE _IOW(TOUCH_IOCTL_BASE, 11, int) +#define TOUCH_IOCTL_GET_RAW_DATA _IOW(TOUCH_IOCTL_BASE, 12, int) +#define TOUCH_IOCTL_GET_X_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 13, int) +#define TOUCH_IOCTL_GET_Y_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 14, int) +#define TOUCH_IOCTL_HW_CALIBRAION _IOW(TOUCH_IOCTL_BASE, 15, int) +#define TOUCH_IOCTL_GET_REG _IOW(TOUCH_IOCTL_BASE, 16, int) +#define TOUCH_IOCTL_SET_REG _IOW(TOUCH_IOCTL_BASE, 17, int) +#define TOUCH_IOCTL_SEND_SAVE_STATUS _IOW(TOUCH_IOCTL_BASE, 18, int) +#define TOUCH_IOCTL_DONOT_TOUCH_EVENT _IOW(TOUCH_IOCTL_BASE, 19, int) + +struct bt541_ts_info *misc_info; + +#ifdef SUPPORTED_USE_DUAL_FW +static void bt541_firmware_check(void) +{ + int i; + u16 newHWID; + + for (i = 0; i < TSP_TYPE_COUNT; i++) { + newHWID = (u16) (m_pFirmware[i][0x57d2] | (m_pFirmware[i][0x57d3]<<8)); + if (misc_info->cap_info.hw_id == newHWID) { + m_FirmwareIdx = i; + break; + } + } + if (i == TSP_TYPE_COUNT) + m_FirmwareIdx = 0; + + m_firmware_data = m_pFirmware[m_FirmwareIdx]; +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&misc_info->client->dev, "touch tsp type = %d, hw_id = %d\n", m_FirmwareIdx, misc_info->cap_info.hw_id); +#endif +} +#endif + +static u16 m_optional_mode = 0; +static u16 m_prev_optional_mode = 0; +static void bt541_set_optional_mode(struct bt541_ts_info *info, bool force) +{ + if (m_prev_optional_mode == m_optional_mode && !force) + return; + + if (write_reg(info->client, BT541_OPTIONAL_SETTING, m_optional_mode) == I2C_SUCCESS) { + m_prev_optional_mode = m_optional_mode; + dev_info(&misc_info->client->dev, "TA setting changed to %d\n", + m_optional_mode&0x1); + } +} +static void bt541_set_ta_status(struct bt541_ts_info *info) +{ + if (ta_connected) + zinitix_bit_set(m_optional_mode, 0); + else + zinitix_bit_clr(m_optional_mode, 0); +} + +void tsp_charger_enable(int status) +{ + if (status == POWER_SUPPLY_TYPE_BATTERY || + status == POWER_SUPPLY_TYPE_UNKNOWN) + status = 0; + else + status = 1; + + if (status) + ta_connected = true; + else + ta_connected = false; + + bt541_set_ta_status(misc_info); + + dev_info(&misc_info->client->dev, "TA %s\n", + status ? "connected" : "disconnected"); +} +EXPORT_SYMBOL(tsp_charger_enable); + +static bool get_raw_data(struct bt541_ts_info *info, u8 *buff, int skip_cnt) +{ + struct i2c_client *client = info->client; + struct bt541_ts_platform_data *pdata = info->pdata; + u32 total_node = info->cap_info.total_node_num; + u32 sz; + int i; + + disable_irq(info->irq); + + down(&info->work_lock); + if (info->work_state != NOTHING) { + printk(KERN_INFO "other process occupied.. (%d)\n", info->work_state); + enable_irq(info->irq); + up(&info->work_lock); + return false; + } + + info->work_state = RAW_DATA; + + for (i = 0; i < skip_cnt; i++) { + while (gpio_get_value(pdata->gpio_int)) + msleep(1); + + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + msleep(1); + } + + zinitix_debug_msg("read raw data\r\n"); + sz = total_node * 2; + + while (gpio_get_value(pdata->gpio_int)) + msleep(1); + + if (read_raw_data(client, BT541_RAWDATA_REG, (char *)buff, sz) < 0) { + zinitix_printk("error : read zinitix tc raw data\n"); + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + return false; + } + + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + + return true; +} + +static bool ts_get_raw_data(struct bt541_ts_info *info) +{ + struct i2c_client *client = info->client; + u32 total_node = info->cap_info.total_node_num; + u32 sz; + + if (down_trylock(&info->raw_data_lock)) { + dev_err(&client->dev, "Failed to occupy sema\n"); + info->touch_info.status = 0; + return true; + } + + sz = total_node * 2 + sizeof(struct point_info); + + if (read_raw_data(info->client, BT541_RAWDATA_REG, + (char *)info->cur_data, sz) < 0) { + dev_err(&client->dev, "Failed to read raw data\n"); + up(&info->raw_data_lock); + return false; + } + + info->update = 1; + memcpy((u8 *)(&info->touch_info), + (u8 *)&info->cur_data[total_node], + sizeof(struct point_info)); + up(&info->raw_data_lock); + + return true; +} + +#if ZINITIX_I2C_CHECKSUM +#define ZINITIX_I2C_CHECKSUM_WCNT 0x016a +#define ZINITIX_I2C_CHECKSUM_RESULT 0x016c +static bool i2c_checksum(struct bt541_ts_info *info, s16 *pChecksum, u16 wlength) +{ + s16 checksum_result; + s16 checksum_cur; + int i; + + checksum_cur = 0; + for (i = 0; i < wlength; i++) { + checksum_cur += (s16)pChecksum[i]; + } + if (read_data(info->client, + ZINITIX_I2C_CHECKSUM_RESULT, + (u8 *)(&checksum_result), 2) < 0) { + printk(KERN_INFO "error read i2c checksum rsult.-\n"); + return false; + } + if (checksum_cur != checksum_result) { + printk(KERN_INFO "checksum error : %d, %d\n", checksum_cur, checksum_result); + return false; + } + return true; +} + +#endif + +static bool ts_read_coord(struct bt541_ts_info *info) +{ + struct i2c_client *client = info->client; +#if (TOUCH_POINT_MODE == 1) + int i; +#endif + + /* zinitix_debug_msg("ts_read_coord+\r\n"); */ + + /* for Debugging Tool */ + + if (info->touch_mode != TOUCH_POINT_MODE) { + if (info->update == 0) { + if (ts_get_raw_data(info) == false) + return false; + } else { + info->touch_info.status = 0; + } + + dev_err(&client->dev, "status = 0x%04X\n", info->touch_info.status); + + goto out; + } + +#if (TOUCH_POINT_MODE == 1) + memset(&info->touch_info, + 0x0, sizeof(struct point_info)); + +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) + if ((write_reg(info->client, ZINITIX_I2C_CHECKSUM_WCNT, 2)) != I2C_SUCCESS) + return false; + +#endif + if (read_data(info->client, BT541_POINT_STATUS_REG, (u8 *)(&info->touch_info), 4) < 0) { + dev_err(&client->dev, "%s: Failed to read point info\n", __func__); + + return false; + } + +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) + if (i2c_checksum(info, (s16 *)(&info->touch_info), 2) == false) + return false; +#endif + dev_info(&client->dev, "status reg = 0x%x , event_flag = 0x%04x\n", + info->touch_info.status, info->touch_info.event_flag); + + bt541_set_optional_mode(info, false); + if (info->touch_info.event_flag == 0) + goto out; + +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) + if ((write_reg(info->client, ZINITIX_I2C_CHECKSUM_WCNT, sizeof(struct point_info)/2)) != I2C_SUCCESS) + return false; +#endif + for (i = 0; i < info->cap_info.multi_fingers; i++) { + if (zinitix_bit_test(info->touch_info.event_flag, i)) { + udelay(20); + + if (read_data(info->client, BT541_POINT_STATUS_REG + 2 + ( i * 4), + (u8 *)(&info->touch_info.coord[i]), + sizeof(struct coord)) < 0) { + dev_err(&client->dev, "Failed to read point info\n"); + + return false; + } +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) + if (i2c_checksum(info, (s16 *)(&info->touch_info.coord[i]), sizeof(struct point_info)/2) == false) + return false; +#endif + } + } + +#else +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) + if (write_reg(info->client, + ZINITIX_I2C_CHECKSUM_WCNT, + (sizeof(struct point_info)/2)) != I2C_SUCCESS) { + dev_err(&client->dev, "error write checksum wcnt.-\n"); + return false; + } +#endif + if (read_data(info->client, BT541_POINT_STATUS_REG, + (u8 *)(&info->touch_info), sizeof(struct point_info)) < 0) { + dev_err(&client->dev, "Failed to read point info\n"); + + return false; + } +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) + if (i2c_checksum(info, (s16 *)(&info->touch_info), sizeof(struct point_info)/2) == false) + return false; +#endif + + bt541_set_optional_mode(info, false); + +#endif + +out: + /* error */ + if (zinitix_bit_test(info->touch_info.status, BIT_MUST_ZERO)) { + dev_err(&client->dev, "Invalid must zero bit(%04x)\n", + info->touch_info.status); + + return false; + } + + write_cmd(info->client, BT541_CLEAR_INT_STATUS_CMD); + + return true; +} + +#if ESD_TIMER_INTERVAL +static void esd_timeout_handler(unsigned long data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)data; + + info->p_esd_timeout_tmr = NULL; + queue_work(esd_tmr_workqueue, &info->tmr_work); +} + +static void esd_timer_start(u16 sec, struct bt541_ts_info *info) +{ + unsigned long flags; + spin_lock_irqsave(&info->lock,flags); + if (info->p_esd_timeout_tmr != NULL) +#ifdef CONFIG_SMP + del_singleshot_timer_sync(info->p_esd_timeout_tmr); +#else + del_timer(info->p_esd_timeout_tmr); +#endif + info->p_esd_timeout_tmr = NULL; + init_timer(&(info->esd_timeout_tmr)); + info->esd_timeout_tmr.data = (unsigned long)(info); + info->esd_timeout_tmr.function = esd_timeout_handler; + info->esd_timeout_tmr.expires = jiffies + (HZ * sec); + info->p_esd_timeout_tmr = &info->esd_timeout_tmr; + add_timer(&info->esd_timeout_tmr); + spin_unlock_irqrestore(&info->lock, flags); +} + +static void esd_timer_stop(struct bt541_ts_info *info) +{ + unsigned long flags; + spin_lock_irqsave(&info->lock,flags); + if (info->p_esd_timeout_tmr) +#ifdef CONFIG_SMP + del_singleshot_timer_sync(info->p_esd_timeout_tmr); +#else + del_timer(info->p_esd_timeout_tmr); +#endif + + info->p_esd_timeout_tmr = NULL; + spin_unlock_irqrestore(&info->lock, flags); +} + +static void esd_timer_init(struct bt541_ts_info *info) +{ + unsigned long flags; + spin_lock_irqsave(&info->lock,flags); + init_timer(&(info->esd_timeout_tmr)); + info->esd_timeout_tmr.data = (unsigned long)(info); + info->esd_timeout_tmr.function = esd_timeout_handler; + info->p_esd_timeout_tmr = NULL; + spin_unlock_irqrestore(&info->lock, flags); +} + +static void ts_tmr_work(struct work_struct *work) +{ + struct bt541_ts_info *info = + container_of(work, struct bt541_ts_info, tmr_work); + struct i2c_client *client = info->client; + +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "tmr queue work ++\n"); +#endif + + if (down_trylock(&info->work_lock)) { + dev_err(&client->dev, "%s: Failed to occupy work lock\n", __func__); + esd_timer_start(CHECK_ESD_TIMER, info); + + return; + } + + if (info->work_state != NOTHING) { + dev_info(&client->dev, "%s: Other process occupied (%d)\n", + __func__, info->work_state); + up(&info->work_lock); + + return; + } + info->work_state = ESD_TIMER; + + disable_irq(info->irq); + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON_SEQUENCE); + + clear_report_data(info); + if (mini_init_touch(info) == false) + goto fail_time_out_init; + + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "tmr queue work--\n"); +#endif + + return; +fail_time_out_init: + dev_err(&client->dev, "%s: Failed to restart\n", __func__); + esd_timer_start(CHECK_ESD_TIMER, info); + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + + return; +} +#endif + +static bool bt541_power_sequence(struct bt541_ts_info *info) +{ + struct i2c_client *client = info->client; + int retry = 0; + u16 chip_code; + +retry_power_sequence: + if (write_reg(client, 0xc000, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(vendor cmd enable)\n"); + goto fail_power_sequence; + } + udelay(10); + + if (read_data(client, 0xcc00, (u8 *)&chip_code, 2) < 0) { + dev_err(&client->dev, "Failed to read chip code\n"); + goto fail_power_sequence; + } + + dev_info(&client->dev, "%s: chip code = 0x%x\n", __func__, chip_code); + udelay(10); + + if (write_cmd(client, 0xc004) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(intn clear)\n"); + goto fail_power_sequence; + } + udelay(10); + + if (write_reg(client, 0xc002, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(nvm init)\n"); + goto fail_power_sequence; + } + mdelay(2); + + if (write_reg(client, 0xc001, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(program start)\n"); + goto fail_power_sequence; + } + msleep(FIRMWARE_ON_DELAY); /* wait for checksum cal */ + + return true; + +fail_power_sequence: + if (retry++ < 3) { + msleep(CHIP_ON_DELAY); + dev_info(&client->dev, "retry = %d\n", retry); + goto retry_power_sequence; + } + + dev_err(&client->dev, "Failed to send power sequence\n"); + return false; +} + +static struct regulator *touch_regulator; +static int bt541_power(struct bt541_ts_info *info, int on) +{ + int ret = 0; + static u8 is_power_on; + if (touch_regulator == NULL) { + touch_regulator = regulator_get(&info->client->dev, "vddsim2"); + if (IS_ERR(touch_regulator)) { + touch_regulator = NULL; + pr_info("[TSP]: %s: get touch_regulator error\n", + __func__); + return -EIO; + } + } + if (on == 0) { + if (is_power_on) { + is_power_on = 0; + ret = regulator_disable(touch_regulator); + if (ret) { + is_power_on = 1; + pr_err("[TSP]: %s: touch_regulator disable " \ + "failed (%d)\n", __func__, ret); + return -EIO; + } + mdelay(CHIP_OFF_DELAY); + } + } else { + if (!is_power_on) { + is_power_on = 1; + regulator_set_voltage(touch_regulator, 3000000, 3000000); + ret = regulator_enable(touch_regulator); + if (ret) { + is_power_on = 0; + pr_err("[TSP]: %s: touch_regulator enable "\ + "failed (%d)\n", __func__, ret); + return -EIO; + } + } + } + pr_info("[TSP]: %s, expected power[%d], actural power[%d]\n", + __func__, on, is_power_on); + return 0; +} +static bool bt541_power_control(struct bt541_ts_info *info, u8 ctl) +{ + int ret=0; + pr_info("[TSP] %s, %d\n", __func__, ctl); + + if (info->pdata->tsp_supply_type == TSP_REGULATOR_SUPPLY) { + ret = info->pdata->tsp_power(info, ctl); + if (ret) + return false; + + if (ctl == POWER_ON_SEQUENCE) { + msleep(CHIP_ON_DELAY); + return bt541_power_sequence(info); + } + } + else + { + if (ctl == POWER_OFF) { + gpio_direction_output(info->pdata->gpio_ldo_en, 0); + msleep(CHIP_OFF_DELAY); + } else { + gpio_direction_output(info->pdata->gpio_ldo_en, 1); + + /* zxt power on sequence */ + if (ctl == POWER_ON_SEQUENCE) { + msleep(CHIP_ON_DELAY); + return bt541_power_sequence(info); + } + } + } + return true; +} + +#if TOUCH_ONESHOT_UPGRADE +static bool ts_check_need_upgrade(struct bt541_ts_info *info, + u16 cur_version, u16 cur_minor_version, u16 cur_reg_version, u16 cur_hw_id) +{ + u16 new_version; + u16 new_minor_version; + u16 new_reg_version; + /* u16 new_chip_code;*/ +#if CHECK_HWID + u16 new_hw_id; +#endif + new_version = (u16) (m_firmware_data[52] | (m_firmware_data[53]<<8)); + new_minor_version = (u16) (m_firmware_data[56] | (m_firmware_data[57]<<8)); + new_reg_version = (u16) (m_firmware_data[60] | (m_firmware_data[61]<<8)); + /* new_chip_code = (u16) (m_firmware_data[64] | (m_firmware_data[65]<<8));*/ + +#if CHECK_HWID + new_hw_id = (u16)(m_firmware_data[0x7528] | (m_firmware_data[0x7529]<<8)); + dev_info(&info->client->dev, "cur HW_ID = 0x%x, new HW_ID = 0x%x\n", + cur_hw_id, new_hw_id); +#endif + + dev_info(&info->client->dev, "cur version = 0x%x, new version = 0x%x\n", + cur_version, new_version); + + dev_info(&info->client->dev, "cur minor version = 0x%x, new minor version = 0x%x\n", + cur_minor_version, new_minor_version); + dev_info(&info->client->dev, "cur reg data version = 0x%x, new reg data version = 0x%x\n", + cur_reg_version, new_reg_version); + + if (cal_mode) { + dev_info(&info->client->dev, "didn't update TSP F/W!! in CAL MODE\n"); + return false; + } + + if (cur_version > 0xFF) + return true; + if (cur_version < new_version) + return true; + else if (cur_version > new_version) + return false; +#if CHECK_HWID + if (cur_hw_id != new_hw_id) + return true; +#endif + if (cur_minor_version < new_minor_version) + return true; + else if (cur_minor_version > new_minor_version) + return false; + if (cur_reg_version < new_reg_version) + return true; + + return false; +} +#endif + +#define TC_SECTOR_SZ 8 + +#ifdef SUPPORTED_USE_DUAL_FW +static void ts_check_hwid_in_fatal_state(struct bt541_ts_info *info) +{ + /*u16 flash_addr;*/ + u8 check_data[80]; + int i; + u16 hw_id0, hw_id1_1, hw_id1_2; + int retry = 0; +retry_fatal: + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON); + mdelay(10); + if (write_reg(info->client, 0xc000, 0x0001) != I2C_SUCCESS) { + dev_err(&info->client->dev, "power sequence error (vendor cmd enable)\n"); + goto fail_check_hwid; + } + udelay(10); + if (write_cmd(info->client, 0xc004) != I2C_SUCCESS) { + dev_err(&info->client->dev, "power sequence error (intn clear)\n"); + goto fail_check_hwid; + } + udelay(10); + if (write_reg(info->client, 0xc002, 0x0001) != I2C_SUCCESS) { + dev_err(&info->client->dev, "power sequence error (nvm init)\n"); + goto fail_check_hwid; + } + /*dev_err(&info->client->dev, "init flash\n");*/ + mdelay(5); + if (write_reg(info->client, 0xc003, 0x0000) != I2C_SUCCESS) { + dev_err(&info->client->dev, "fail to write nvm vpp on\n"); + goto fail_check_hwid; + } + if (write_reg(info->client, 0xc104, 0x0000) != I2C_SUCCESS) { + dev_err(&info->client->dev, "fail to write nvm wp disable\n"); + goto fail_check_hwid; + } + /*dev_err(&info->client->dev, "init flash\n");*/ + if (write_cmd(info->client, BT541_INIT_FLASH) != I2C_SUCCESS) { + dev_err(&info->client->dev, "failed to init flash\n"); + goto fail_check_hwid; + } + /*dev_err(&info->client->dev, "read firmware data\n");*/ + for (i = 0; i < 80; i += TC_SECTOR_SZ) { + if (read_firmware_data(info->client, + BT541_READ_FLASH, + (u8 *)&check_data[i], TC_SECTOR_SZ) < 0) { + dev_err(&info->client->dev, "error : read zinitix tc firmare\n"); + goto fail_check_hwid; + } + } + hw_id0 = check_data[48] + check_data[49]*256; + hw_id1_1 = check_data[70]; + hw_id1_2 = check_data[71]; + + /*dev_err(&info->client->dev, "eeprom hw id = %d, %d, %d\n", hw_id0, hw_id1_1, hw_id1_2);*/ + + if (hw_id1_1 == hw_id1_2 && hw_id0 != hw_id1_1) + info->cap_info.hw_id = hw_id1_1; + else + info->cap_info.hw_id = hw_id0; + + dev_err(&info->client->dev, "hw id = %d\n", info->cap_info.hw_id); + mdelay(5); + return; + +fail_check_hwid: + if (retry++ < 3) + goto retry_fatal; + dev_err(&info->client->dev, "fail to check hw id\n"); + mdelay(5); +} +#endif + +static u8 ts_upgrade_firmware(struct bt541_ts_info *info, + const u8 *firmware_data, u32 size) +{ + struct i2c_client *client = info->client; + u16 flash_addr; + u16 reg_val; + u8 *verify_data; + int retry_cnt = 0; + int i; + int page_sz = 0; + u16 chip_code; + + verify_data = kzalloc(size, GFP_KERNEL); + if (verify_data == NULL) { + zinitix_printk(KERN_ERR "cannot alloc verify buffer\n"); + return false; + } +#ifdef SUPPORTED_USE_DUAL_FW + if (read_data(client, BT541_MODULE_ID, (u8 *)&cap->module_id, 2) < 0) + dev_err(&client->dev, "Failed to read Modul ID\n"); +#endif +retry_upgrade: + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON); + mdelay(10); + + if (write_reg(client, 0xc000, 0x0001) != I2C_SUCCESS) { + zinitix_printk("power sequence error (vendor cmd enable)\n"); + goto fail_upgrade; + } + + udelay(10); + + if (read_data(client, 0xcc00, (u8 *)&chip_code, 2) < 0) { + zinitix_printk("failed to read chip code\n"); + goto fail_upgrade; + } + + zinitix_printk("chip code = 0x%x\n", chip_code); + page_sz = 128; + udelay(10); + + if (write_cmd(client, 0xc004) != I2C_SUCCESS) { + zinitix_printk("power sequence error (intn clear)\n"); + goto fail_upgrade; + } + + udelay(10); + + if (write_reg(client, 0xc002, 0x0001) != I2C_SUCCESS) { + zinitix_printk("power sequence error (nvm init)\n"); + goto fail_upgrade; + } + + mdelay(5); + + zinitix_printk(KERN_INFO "init flash\n"); + + if (write_reg(client, 0xc003, 0x0001) != I2C_SUCCESS) { + zinitix_printk("failed to write nvm vpp on\n"); + goto fail_upgrade; + } + + if (write_reg(client, 0xc104, 0x0001) != I2C_SUCCESS) { + zinitix_printk("failed to write nvm wp disable\n"); + goto fail_upgrade; + } + + if (write_cmd(client, BT541_INIT_FLASH) != I2C_SUCCESS) { + zinitix_printk(KERN_INFO "failed to init flash\n"); + goto fail_upgrade; + } + + zinitix_printk(KERN_INFO "writing firmware data\n"); + for (flash_addr = 0; flash_addr < size; ) { + for (i = 0; i < page_sz / TC_SECTOR_SZ; i++) { + /*zinitix_debug_msg("write :addr=%04x, len=%d\n", flash_addr, TC_SECTOR_SZ);*/ + /*zinitix_printk(KERN_INFO "writing :addr = %04x, len=%d \n", flash_addr, TC_SECTOR_SZ);*/ + if (write_data(client, + BT541_WRITE_FLASH, + (u8 *)&firmware_data[flash_addr], TC_SECTOR_SZ) < 0) { + zinitix_printk(KERN_INFO"error : write zinitix tc firmare\n"); + goto fail_upgrade; + } + flash_addr += TC_SECTOR_SZ; + udelay(100); + } + + mdelay(30); /*for fuzing delay*/ + } + + if (write_reg(client, 0xc003, 0x0000) != I2C_SUCCESS) { + zinitix_printk("nvm write vpp off\n"); + goto fail_upgrade; + } + + if (write_reg(client, 0xc104, 0x0000) != I2C_SUCCESS) { + zinitix_printk("nvm wp enable\n"); + goto fail_upgrade; + } + + zinitix_printk(KERN_INFO "init flash\n"); + + if (write_cmd(client, BT541_INIT_FLASH) != I2C_SUCCESS) { + zinitix_printk(KERN_INFO "failed to init flash\n"); + goto fail_upgrade; + } + + zinitix_printk(KERN_INFO "read firmware data\n"); + + for (flash_addr = 0; flash_addr < size; ) { + for (i = 0; i < page_sz / TC_SECTOR_SZ; i++) { + /*zinitix_debug_msg("read :addr=%04x, len=%d\n",flash_addr, TC_SECTOR_SZ);*/ + if (read_firmware_data(client, + BT541_READ_FLASH, + (u8 *)&verify_data[flash_addr], TC_SECTOR_SZ) < 0) { + dev_err(&client->dev, "Failed to read firmare\n"); + + goto fail_upgrade; + } + + flash_addr += TC_SECTOR_SZ; + } + } + /* verify */ + dev_info(&client->dev, "verify firmware data\n"); + if (memcmp((u8 *)&firmware_data[0], (u8 *)&verify_data[0], size) == 0) { + dev_info(&client->dev, "upgrade finished\n"); + kfree(verify_data); + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON_SEQUENCE); + + for (i = 0; i < 5; i++) { + if (read_data(client, BT541_CHECKSUM_RESULT, + (u8 *)®_val, 2) < 0) { + mdelay(10); + continue; + } + } + + if (reg_val != 0x55aa) { + dev_err(&client->dev, "upgrade done, but firmware checksum fail. reg_val = %x\n", reg_val); + goto fail_upgrade; + } +#ifdef SUPPORTED_USE_DUAL_FW + if (read_data(client, BT541_MODULE_ID, (u8 *)®_val, 2) < 0) + dev_err(&client->dev, "Failed to read Modul ID\n"); + else { + if (cap->module_id != reg_val) { + write_reg(client, BT541_MODULE_ID, cap->module_id); + write_reg(client, 0xc003, 0x0001); + write_reg(client, 0xc104, 0x0001); + udelay(100); + if (write_cmd(client, BT541_SAVE_STATUS_CMD) != I2C_SUCCESS) + goto fail_upgrade; + + mdelay(1000); + write_reg(client, 0xc003, 0x0000); + write_reg(client, 0xc104, 0x0000); + } + } +#endif + return true; + } + +fail_upgrade: + bt541_power_control(info, POWER_OFF); + + if (retry_cnt++ < INIT_RETRY_CNT) { + dev_err(&client->dev, "upgrade failed : so retry... (%d)\n", retry_cnt); + goto retry_upgrade; + } + + if (verify_data != NULL) + kfree(verify_data); + + dev_info(&client->dev, "Failed to upgrade\n"); + + return false; +} + +static bool ts_hw_calibration(struct bt541_ts_info *info) +{ + struct i2c_client *client = info->client; + u16 chip_eeprom_info; + int time_out = 0; + + if (write_reg(client, + BT541_TOUCH_MODE, 0x07) != I2C_SUCCESS) + return false; + mdelay(10); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + mdelay(10); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + mdelay(50); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + mdelay(10); + + if (write_cmd(client, + BT541_CALIBRATE_CMD) != I2C_SUCCESS) + return false; + + if (write_cmd(client, + BT541_CLEAR_INT_STATUS_CMD) != I2C_SUCCESS) + return false; + + mdelay(10); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + + /* wait for h/w calibration*/ + do { + mdelay(500); + write_cmd(client, + BT541_CLEAR_INT_STATUS_CMD); + + if (read_data(client, + BT541_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + return false; + + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", + chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + + if (time_out++ == 4) { + write_cmd(client, BT541_CALIBRATE_CMD); + mdelay(10); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + dev_err(&client->dev, "h/w calibration retry timeout.\n"); + } + + if (time_out++ > 10) { + dev_err(&client->dev, "h/w calibration timeout.\n"); + break; + } + + } while (1); + + if (write_reg(client, + BT541_TOUCH_MODE, TOUCH_POINT_MODE) != I2C_SUCCESS) + return false; + + if (info->cap_info.ic_int_mask != 0) { + if (write_reg(client, + BT541_INT_ENABLE_FLAG, + info->cap_info.ic_int_mask) + != I2C_SUCCESS) + return false; + } + + write_reg(client, 0xc003, 0x0001); + write_reg(client, 0xc104, 0x0001); + udelay(100); + if (write_cmd(client, + BT541_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + return false; + + mdelay(1000); + write_reg(client, 0xc003, 0x0000); + write_reg(client, 0xc104, 0x0000); + return true; +} + +static bool init_touch(struct bt541_ts_info *info, bool fw_oneshot_upgrade) +{ + struct bt541_ts_platform_data *pdata = info->pdata; + struct i2c_client *client = info->client; + struct capa_info *cap = &(info->cap_info); + u16 reg_val; + int i; + u16 chip_eeprom_info; +#if USE_CHECKSUM + u16 chip_check_sum; + u8 checksum_err; +#endif + int retry_cnt = 0; + +retry_init: + for (i = 0; i < INIT_RETRY_CNT; i++) { + if (read_data(client, BT541_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) { + dev_err(&client->dev, "Failed to read eeprom info(%d)\n", i); + mdelay(10); + continue; + } else + break; + } + + if (i == INIT_RETRY_CNT) + goto fail_init; + +#if USE_CHECKSUM + dev_info(&client->dev, "%s: Check checksum\n", __func__); + + checksum_err = 0; + + for (i = 0; i < INIT_RETRY_CNT; i++) { + if (read_data(client, BT541_CHECKSUM_RESULT, + (u8 *)&chip_check_sum, 2) < 0) { + mdelay(10); + continue; + } + +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "0x%04X\n", chip_check_sum); +#endif + + if (chip_check_sum == 0x55aa) + break; + else { + checksum_err = 1; + break; + } + } + + if (i == INIT_RETRY_CNT || checksum_err) { + dev_err(&client->dev, "Failed to check firmware data\n"); + if (checksum_err == 1 && retry_cnt < INIT_RETRY_CNT) + retry_cnt = INIT_RETRY_CNT; + + goto fail_init; + } +#endif + + if (write_cmd(client, BT541_SWRESET_CMD) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to write reset command\n"); + goto fail_init; + } + + cap->button_num = SUPPORTED_BUTTON_NUM; + + reg_val = 0; + zinitix_bit_set(reg_val, BIT_PT_CNT_CHANGE); + zinitix_bit_set(reg_val, BIT_DOWN); + zinitix_bit_set(reg_val, BIT_MOVE); + zinitix_bit_set(reg_val, BIT_UP); +#if (TOUCH_POINT_MODE == 2) + zinitix_bit_set(reg_val, BIT_PALM); + zinitix_bit_set(reg_val, BIT_PALM_REJECT); +#endif + + if (cap->button_num > 0) + zinitix_bit_set(reg_val, BIT_ICON_EVENT); + + cap->ic_int_mask = reg_val; + + if (write_reg(client, BT541_INT_ENABLE_FLAG, 0x0) != I2C_SUCCESS) + goto fail_init; + + dev_info(&client->dev, "%s: Send reset command\n", __func__); + if (write_cmd(client, BT541_SWRESET_CMD) != I2C_SUCCESS) + goto fail_init; + + /* get chip information */ + if (read_data(client, BT541_VENDOR_ID, + (u8 *)&cap->vendor_id, 2) < 0) { + zinitix_printk("failed to read chip revision\n"); + goto fail_init; + } + + + if (read_data(client, BT541_CHIP_REVISION, + (u8 *)&cap->ic_revision, 2) < 0) { + zinitix_printk("failed to read chip revision\n"); + goto fail_init; + } + + cap->ic_fw_size = 32*1024; + + if (read_data(client, BT541_HW_ID, (u8 *)&cap->hw_id, 2) < 0) { + dev_err(&client->dev, "Failed to read hw id\n"); + goto fail_init; + } +#ifdef SUPPORTED_USE_DUAL_FW + bt541_firmware_check(); +#endif + if (read_data(client, BT541_THRESHOLD, (u8 *)&cap->threshold, 2) < 0) + goto fail_init; + + if (read_data(client, BT541_BUTTON_SENSITIVITY, + (u8 *)&cap->key_threshold, 2) < 0) + goto fail_init; + + /* if (read_data(client, BT541_DUMMY_BUTTON_SENSITIVITY, + (u8 *)&cap->dummy_threshold, 2) < 0) + goto fail_init;*/ + + if (read_data(client, BT541_TOTAL_NUMBER_OF_X, + (u8 *)&cap->x_node_num, 2) < 0) + goto fail_init; + + if (read_data(client, BT541_TOTAL_NUMBER_OF_Y, + (u8 *)&cap->y_node_num, 2) < 0) + goto fail_init; + + cap->total_node_num = cap->x_node_num * cap->y_node_num; + + + if (read_data(client, BT541_SHIFT_VALUE, + (u8 *)&cap->shift_value, 2) < 0) + goto fail_init; + zinitix_debug_msg("Shift value = %d\n", cap->shift_value); + + + if (read_data(client, BT541_DND_N_COUNT, + (u8 *)&cap->N_cnt, 2) < 0) + goto fail_init; + zinitix_debug_msg("N count = %d\n", cap->N_cnt); + + if (read_data(client, BT541_DND_U_COUNT, + (u8 *)&cap->U_cnt, 2) < 0) + goto fail_init; + zinitix_debug_msg("u count = %d\n", cap->U_cnt); + + if (read_data(client, BT541_AFE_FREQUENCY, + (u8 *)&cap->afe_frequency, 2) < 0) + goto fail_init; + zinitix_debug_msg("afe frequency = %d\n", cap->afe_frequency); + + /* get chip firmware version */ + if (read_data(client, BT541_FIRMWARE_VERSION, + (u8 *)&cap->fw_version, 2) < 0) + goto fail_init; + + if (read_data(client, BT541_MINOR_FW_VERSION, + (u8 *)&cap->fw_minor_version, 2) < 0) + goto fail_init; + + if (read_data(client, BT541_DATA_VERSION_REG, + (u8 *)&cap->reg_data_version, 2) < 0) + goto fail_init; + +#if TOUCH_ONESHOT_UPGRADE + if (fw_oneshot_upgrade && (ts_check_need_upgrade(info, cap->fw_version, + cap->fw_minor_version, cap->reg_data_version, + cap->hw_id) == true)) { + zinitix_printk("start upgrade firmware\n"); + + if (ts_upgrade_firmware(info, m_firmware_data, + cap->ic_fw_size) == false) + goto fail_init; + + if (ts_hw_calibration(info) == false) + goto fail_init; + + /* disable chip interrupt */ + if (write_reg(client, BT541_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + + /* get chip firmware version */ + if (read_data(client, BT541_FIRMWARE_VERSION, + (u8 *)&cap->fw_version, 2) < 0) + goto fail_init; + + if (read_data(client, BT541_MINOR_FW_VERSION, + (u8 *)&cap->fw_minor_version, 2) < 0) + goto fail_init; + + if (read_data(client, BT541_DATA_VERSION_REG, + (u8 *)&cap->reg_data_version, 2) < 0) + goto fail_init; +#ifdef SUPPORTED_USE_DUAL_FW + if (read_data(client, BT541_HW_ID, + (u8 *)&cap->hw_id, 2) < 0) + goto fail_init; + bt541_firmware_check(); + if (read_data(client, BT541_VENDOR_ID, + (u8 *)&cap->vendor_id, 2) < 0) + goto fail_init; +#endif + } +#endif + + if (read_data(client, BT541_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_init; + + if (zinitix_bit_test(chip_eeprom_info, 0)) { /* hw calibration bit*/ + if (ts_hw_calibration(info) == false) + goto fail_init; + + /* disable chip interrupt */ + if (write_reg(client, BT541_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + } + + /* initialize */ + if (write_reg(client, BT541_X_RESOLUTION, + (u16)pdata->x_resolution) != I2C_SUCCESS) + goto fail_init; + + if (write_reg(client, BT541_Y_RESOLUTION, + (u16)pdata->y_resolution) != I2C_SUCCESS) + goto fail_init; + + cap->MinX = (u32)0; + cap->MinY = (u32)0; + cap->MaxX = (u32)pdata->x_resolution; + cap->MaxY = (u32)pdata->y_resolution; + + if (write_reg(client, BT541_BUTTON_SUPPORTED_NUM, + (u16)cap->button_num) != I2C_SUCCESS) + goto fail_init; + + if (write_reg(client, BT541_SUPPORTED_FINGER_NUM, + (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_init; + + cap->multi_fingers = MAX_SUPPORTED_FINGER_NUM; + zinitix_debug_msg("max supported finger num = %d\r\n", + cap->multi_fingers); + + cap->gesture_support = 0; + zinitix_debug_msg("set other configuration\r\n"); + + if (write_reg(client, BT541_INITIAL_TOUCH_MODE, + TOUCH_POINT_MODE) != I2C_SUCCESS) + goto fail_init; + + if (write_reg(client, BT541_TOUCH_MODE, info->touch_mode) != I2C_SUCCESS) + goto fail_init; + +#if ZINITIX_I2C_CHECKSUM + if (read_data(client, ZINITIX_INTERNAL_FLAG_02, + (u8 *)®_val, 2) < 0) + goto fail_init; + cap->i2s_checksum = !(!zinitix_bit_test(reg_val, 15)); + printk("use i2s checksum = %d\r\n", + cap->i2s_checksum); +#endif + + bt541_set_ta_status(info); + bt541_set_optional_mode(info, true); + /* soft calibration */ + /* if (write_cmd(client, BT541_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_init;*/ + + if (write_reg(client, BT541_INT_ENABLE_FLAG, + cap->ic_int_mask) != I2C_SUCCESS) + goto fail_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + udelay(10); + } + + if (info->touch_mode != TOUCH_POINT_MODE) { /* Test Mode */ + if (write_reg(client, BT541_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS) { + dev_err(&client->dev, "%s: Failed to set DELAY_RAW_FOR_HOST\n", + __func__); + + goto fail_init; + } + } +#if ESD_TIMER_INTERVAL + if (write_reg(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, + SCAN_RATE_HZ * ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_init; + + read_data(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, (u8 *)®_val, 2); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "Esd timer register = %d\n", reg_val); +#endif +#endif + tsp_charger_status_cb = tsp_charger_enable; + zinitix_debug_msg("successfully initialized\r\n"); + return true; + +fail_init: + if (cal_mode) { + dev_err(&client->dev,"didn't update TSP F/W!! in CAL MODE\n"); + return false; + } + if (++retry_cnt <= INIT_RETRY_CNT) { + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON_SEQUENCE); + + zinitix_debug_msg("retry to initiallize(retry cnt = %d)\r\n", + retry_cnt); + goto retry_init; + + } else if (retry_cnt == INIT_RETRY_CNT+1) { + cap->ic_fw_size = 32*1024; + + zinitix_debug_msg("retry to initiallize(retry cnt = %d)\r\n", retry_cnt); +#if TOUCH_FORCE_UPGRADE +#ifdef SUPPORTED_USE_DUAL_FW + ts_check_hwid_in_fatal_state(info); + bt541_firmware_check(); +#endif + if (ts_upgrade_firmware(info, m_firmware_data, + cap->ic_fw_size) == false) { + zinitix_printk("upgrade failed\n"); + return false; + } + + mdelay(100); + + /* hw calibration and make checksum */ + if (ts_hw_calibration(info) == false) { + zinitix_printk("failed to initiallize\r\n"); + return false; + } + goto retry_init; +#endif + } + + dev_err(&client->dev, "Failed to initiallize\n"); + + return false; +} + +static bool mini_init_touch(struct bt541_ts_info *info) +{ + struct bt541_ts_platform_data *pdata = info->pdata; + struct i2c_client *client = info->client; + int i; +#if USE_CHECKSUM + u16 chip_check_sum; + + /*dev_info(&client->dev, "check checksum\n");*/ + + if (read_data(client, BT541_CHECKSUM_RESULT, + (u8 *)&chip_check_sum, 2) < 0) + goto fail_mini_init; + + if (chip_check_sum != 0x55aa) { + dev_err(&client->dev, "Failed to check firmware" + " checksum(0x%04x)\n", chip_check_sum); + + goto fail_mini_init; + } +#endif + + if (write_cmd(client, BT541_SWRESET_CMD) != I2C_SUCCESS) { + dev_info(&client->dev, "Failed to write reset command\n"); + + goto fail_mini_init; + } + + /* initialize */ + if (write_reg(client, BT541_X_RESOLUTION, + (u16)(pdata->x_resolution)) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client,BT541_Y_RESOLUTION, + (u16)(pdata->y_resolution)) != I2C_SUCCESS) + goto fail_mini_init; + + /*dev_info(&client->dev, "touch max x = %d\r\n", pdata->x_resolution); + dev_info(&client->dev, "touch max y = %d\r\n", pdata->y_resolution);*/ + + if (write_reg(client, BT541_BUTTON_SUPPORTED_NUM, + (u16)info->cap_info.button_num) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, BT541_SUPPORTED_FINGER_NUM, + (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, BT541_INITIAL_TOUCH_MODE, + TOUCH_POINT_MODE) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, BT541_TOUCH_MODE, + info->touch_mode) != I2C_SUCCESS) + goto fail_mini_init; + + bt541_set_ta_status(info); + bt541_set_optional_mode(info, true); + /* soft calibration */ + if (write_cmd(client, BT541_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, BT541_INT_ENABLE_FLAG, + info->cap_info.ic_int_mask) != I2C_SUCCESS) + goto fail_mini_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + udelay(10); + } + + if (info->touch_mode != TOUCH_POINT_MODE) { + if (write_reg(client, BT541_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to set BT541_DELAY_RAW_FOR_HOST\n"); + + goto fail_mini_init; + } + } + +#if ESD_TIMER_INTERVAL + if (write_reg(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, + SCAN_RATE_HZ * ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_mini_init; + + esd_timer_start(CHECK_ESD_TIMER, info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "Started esd timer\n"); +#endif +#endif + + dev_info(&client->dev, "Successfully mini initialized\r\n"); + return true; + +fail_mini_init: + dev_err(&client->dev, "Failed to initialize mini init\n"); + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON_SEQUENCE); + + if (init_touch(info, true) == false) { + dev_err(&client->dev, "Failed to initialize\n"); + + return false; + } + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "Started esd timer\n"); +#endif +#endif + return true; +} + +static void clear_report_data(struct bt541_ts_info *info) +{ + int i; + u8 reported = 0; + u8 sub_status; + + for (i = 0; i < info->cap_info.button_num; i++) { + if (info->button[i] == ICON_BUTTON_DOWN) { + info->button[i] = ICON_BUTTON_UP; + input_report_key(info->input_dev, BUTTON_MAPPING_KEY[i], 0); + reported = true; +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + printk(KERN_INFO "Button up = %d\n", i); +#else + printk(KERN_INFO "Button up\n"); +#endif + } + } + + for (i = 0; i < info->cap_info.multi_fingers; i++) { + sub_status = info->reported_touch_info.coord[i].sub_status; + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, 0); + reported = true; + if (!m_ts_debug_mode && TSP_NORMAL_EVENT_MSG) + printk(KERN_INFO "[TSP] R %02d\r\n", i); + } + info->reported_touch_info.coord[i].sub_status = 0; + } + + if (reported) + input_sync(info->input_dev); + +} + +#define PALM_REPORT_WIDTH 200 +#define PALM_REJECT_WIDTH 255 + +static irqreturn_t bt541_touch_work(int irq, void *data) +{ + struct bt541_ts_info* info = (struct bt541_ts_info*)data; + struct bt541_ts_platform_data *pdata = info->pdata; + struct i2c_client *client = info->client; + int i; + u8 sub_status; + u8 prev_sub_status; + u32 x, y, maxX, maxY; + u32 w; + u32 tmp; + u8 palm = 0; + + if (gpio_get_value(info->pdata->gpio_int)) { + dev_err(&client->dev, "Invalid interrupt\n"); + + return IRQ_HANDLED; + } + + if (down_trylock(&info->work_lock)) { + dev_err(&client->dev, "%s: Failed to occupy work lock\n", __func__); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + + return IRQ_HANDLED; + } +#if ESD_TIMER_INTERVAL + esd_timer_stop(info); +#endif + + if (info->work_state != NOTHING) { + dev_err(&client->dev, "%s: Other process occupied\n", __func__); + udelay(DELAY_FOR_SIGNAL_DELAY); + + if (!gpio_get_value(info->pdata->gpio_int)) { + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + } + + goto out; + } + + info->work_state = NORMAL; + +#if ZINITIX_I2C_CHECKSUM + i = 0; + if (ts_read_coord(info) == false || info->touch_info.status == 0xffff + || info->touch_info.status == 0x1) { + /* more retry*/ + for (i = 1; i < 50; i++) { /* about 10ms*/ + if (!(ts_read_coord(info) == false || info->touch_info.status == 0xffff + || info->touch_info.status == 0x1)) + break; + } + + } + + if (i == 50) { + dev_err(&client->dev, "Failed to read info coord\n"); + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON_SEQUENCE); + + clear_report_data(info); + mini_init_touch(info); + + goto out; + } +#else + if (ts_read_coord(info) == false || info->touch_info.status == 0xffff + || info->touch_info.status == 0x1) { /* maybe desirable reset */ + dev_err(&client->dev, "Failed to read info coord\n"); + bt541_power_control(info, POWER_OFF); + bt541_power_control(info, POWER_ON_SEQUENCE); + + clear_report_data(info); + mini_init_touch(info); + + goto out; + } +#endif + /* invalid : maybe periodical repeated int. */ + if (info->touch_info.status == 0x0) + goto out; + + if (zinitix_bit_test(info->touch_info.status, BIT_ICON_EVENT)) { + if (read_data(info->client, BT541_ICON_STATUS_REG, + (u8 *)(&info->icon_event_reg), 2) < 0) { + dev_err(&client->dev, "Failed to read button info\n"); + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + + goto out; + } + + for (i = 0; i < info->cap_info.button_num; i++) { + if (zinitix_bit_test(info->icon_event_reg, + (BIT_O_ICON0_DOWN + i))) { + info->button[i] = ICON_BUTTON_DOWN; + input_report_key(info->input_dev, BUTTON_MAPPING_KEY[i], 1); +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Button down = %d\n", i); +#else + dev_info(&client->dev, "Button down\n"); +#endif + } + } + + for (i = 0; i < info->cap_info.button_num; i++) { + if (zinitix_bit_test(info->icon_event_reg, + (BIT_O_ICON0_UP + i))) { + info->button[i] = ICON_BUTTON_UP; + input_report_key(info->input_dev, BUTTON_MAPPING_KEY[i], 0); +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Button up = %d\n", i); +#else + dev_info(&client->dev, "Button up\n"); +#endif + } + } + } + +#ifdef SUPPORTED_PALM_TOUCH + if (zinitix_bit_test(info->touch_info.status, BIT_PALM)) { +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Palm report\n"); +#endif + palm = 1; + } + + if (zinitix_bit_test(info->touch_info.status, BIT_PALM_REJECT)) { +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Palm reject\n"); +#endif + palm = 2; + } +#endif + for (i = 0; i < info->cap_info.multi_fingers; i++) { + sub_status = info->touch_info.coord[i].sub_status; + prev_sub_status = info->reported_touch_info.coord[i].sub_status; + + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + x = info->touch_info.coord[i].x; + y = info->touch_info.coord[i].y; + w = info->touch_info.coord[i].width; + + /* transformation from touch to screen orientation */ + if (pdata->orientation & TOUCH_V_FLIP) + y = info->cap_info.MaxY + + info->cap_info.MinY - y; + + if (pdata->orientation & TOUCH_H_FLIP) + x = info->cap_info.MaxX + + info->cap_info.MinX - x; + + maxX = info->cap_info.MaxX; + maxY = info->cap_info.MaxY; + + if (pdata->orientation & TOUCH_XY_SWAP) { + zinitix_swap_v(x, y, tmp); + zinitix_swap_v(maxX, maxY, tmp); + } + + if (x > maxX || y > maxY) { +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_err(&client->dev, + "Invalid coord %d : x=%d, y=%d\n", i, x, y); +#endif + continue; + } + + info->touch_info.coord[i].x = x; + info->touch_info.coord[i].y = y; + if (zinitix_bit_test(sub_status, SUB_BIT_DOWN)) + { +#if TOUCH_BOOSTER + if (!min_handle) + { + min_handle = cpufreq_limit_min_freq(touch_cpufreq_lock, "TSP"); + if (IS_ERR(min_handle)) { + printk(KERN_ERR "[TSP] cannot get cpufreq_min lock %lu(%ld)\n", + touch_cpufreq_lock, PTR_ERR(min_handle)); + min_handle = NULL; + } + _store_cpu_num_min_limit(2); + dev_info(&client->dev, "cpu freq on\n"); + } + info->finger_cnt++; +#endif +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Finger [%02d] x = %d, y = %d," + " w = %d\n", i, x, y, w); +#else + dev_info(&client->dev, "Finger down\n"); +#endif + } + if (w == 0) + w = 1; + + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, 1); + +#if (TOUCH_POINT_MODE == 2) + if (palm == 0) { + if (w >= PALM_REPORT_WIDTH) + w = PALM_REPORT_WIDTH - 10; + } else if (palm == 1) { /*palm report*/ + w = PALM_REPORT_WIDTH; + /* info->touch_info.coord[i].minor_width = PALM_REPORT_WIDTH;*/ + } else if (palm == 2) { /* palm reject*/ + /* x = y = 0;*/ + w = PALM_REJECT_WIDTH; + /* info->touch_info.coord[i].minor_width = PALM_REJECT_WIDTH;*/ + } +#endif + + input_report_abs(info->input_dev, ABS_MT_TOUCH_MAJOR, (u32)w); + input_report_abs(info->input_dev, ABS_MT_PRESSURE, (u32)w); + input_report_abs(info->input_dev, ABS_MT_WIDTH_MAJOR, + (u32)((palm == 1) ? w-40 : w)); +#if (TOUCH_POINT_MODE == 2) + input_report_abs(info->input_dev, + ABS_MT_TOUCH_MINOR, (u32)info->touch_info.coord[i].minor_width); + /* input_report_abs(info->input_dev, + ABS_MT_WIDTH_MINOR, (u32)info->touch_info.coord[i].minor_width);*/ +#ifdef SUPPORTED_PALM_TOUCH + /*input_report_abs(info->input_dev, ABS_MT_ANGLE, + (palm > 1)?70:info->touch_info.coord[i].angle - 90);*/ + /*dev_info(&client->dev, "finger [%02d] angle = %03d\n", i, + info->touch_info.coord[i].angle);*/ + input_report_abs(info->input_dev, ABS_MT_PALM, (palm > 0)?1:0); +#endif + /* input_report_abs(info->input_dev, ABS_MT_PALM, 1);*/ +#endif + + input_report_abs(info->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(info->input_dev, ABS_MT_POSITION_Y, y); + } else if (zinitix_bit_test(sub_status, SUB_BIT_UP)|| + zinitix_bit_test(prev_sub_status, SUB_BIT_EXIST)) { +#if TOUCH_BOOSTER + info->finger_cnt--; + if (!info->finger_cnt) + { + cpufreq_limit_put(min_handle); + min_handle = NULL; + _store_cpu_num_min_limit(1); + dev_info(&client->dev, "cpu freq off\n"); + } +#endif +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Finger [%02d] up\n", i); +#else + dev_info(&client->dev, "Finger up\n"); +#endif + memset(&info->touch_info.coord[i], 0x0, sizeof(struct coord)); + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, 0); + + } else { + memset(&info->touch_info.coord[i], 0x0, sizeof(struct coord)); + } + } + memcpy((char *)&info->reported_touch_info, (char *)&info->touch_info, + sizeof(struct point_info)); + input_sync(info->input_dev); + +out: + if (info->work_state == NORMAL) { +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + info->work_state = NOTHING; + } + + up(&info->work_lock); + + return IRQ_HANDLED; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void bt541_ts_late_resume(struct early_suspend *h) +{ + struct bt541_ts_info *info = misc_info; + //info = container_of(h, struct bt541_ts_info, early_suspend); + struct capa_info *cap = &(info->cap_info); + + if (info == NULL) + return; + zinitix_printk("late resume++\r\n"); + + down(&info->work_lock); + if (info->work_state != RESUME + && info->work_state != EALRY_SUSPEND) { + zinitix_printk("invalid work proceedure (%d)\r\n", + info->work_state); + up(&info->work_lock); + return; + } +#if 0 + write_cmd(info->client, BT541_WAKEUP_CMD); + mdelay(1); +#else + bt541_power_control(info, POWER_ON_SEQUENCE); +#endif + info->work_state = RESUME; + if (mini_init_touch(info) == false) + goto fail_late_resume; + + if (read_data(info->client, BT541_FIRMWARE_VERSION, (u8 *)&cap->fw_version, 2)) + ; + if (read_data(info->client, BT541_MINOR_FW_VERSION, (u8 *)&cap->fw_minor_version, 2)) + ; + if (read_data(info->client, BT541_DATA_VERSION_REG, (u8 *)&cap->reg_data_version, 2)) + ; + if (read_data(info->client, BT541_HW_ID, (u8 *)&cap->hw_id, 2)) + ; + if (read_data(info->client, BT541_VENDOR_ID, (u8 *)&cap->vendor_id, 2)) + ; +#ifdef SUPPORTED_USE_DUAL_FW + bt541_firmware_check(); +#endif + enable_irq(info->irq); + info->work_state = NOTHING; + up(&info->work_lock); + zinitix_printk("late resume--\n"); + return; +fail_late_resume: + zinitix_printk("failed to late resume\n"); + enable_irq(info->irq); + info->work_state = NOTHING; + up(&info->work_lock); + return; +} + +static void bt541_ts_early_suspend(struct early_suspend *h) +{ + struct bt541_ts_info *info = misc_info; + /*info = container_of(h, struct bt541_ts_info, early_suspend);*/ + + if (info == NULL) + return; + + zinitix_printk("early suspend++\n"); + + disable_irq(info->irq); +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); +#endif + + down(&info->work_lock); + if (info->work_state != NOTHING) { + zinitix_printk("invalid work proceedure (%d)\r\n", + info->work_state); + up(&info->work_lock); + enable_irq(info->irq); + return; + } + info->work_state = EALRY_SUSPEND; + + zinitix_debug_msg("clear all reported points\r\n"); + clear_report_data(info); + +#if ESD_TIMER_INTERVAL + /*write_reg(info->client, BT541_PERIODICAL_INTERRUPT_INTERVAL, 0);*/ + esd_timer_stop(info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&info->client->dev, "Stopped esd timer\n"); +#endif +#endif + +#if 0 + write_reg(info->client, BT541_INT_ENABLE_FLAG, 0x0); + + udelay(100); + if (write_cmd(info->client, BT541_SLEEP_CMD) != I2C_SUCCESS) { + zinitix_printk("failed to enter into sleep mode\n"); + up(&info->work_lock); + return; + } +#else + bt541_power_control(info, POWER_OFF); +#endif +#if TOUCH_BOOSTER + if (min_handle) + { + dev_err(&info->client->dev,"[TSP] %s %d:: OOPs, Cpu was not in Normal Freq..\n", __func__, __LINE__); + + if (cpufreq_limit_put(min_handle) < 0) { + dev_err(&info->client->dev, "[TSP] Error in scaling down cpu frequency\n"); + } + + min_handle = NULL; + info->finger_cnt = 0; + dev_info(&info->client->dev, "cpu freq off\n"); + } +#endif + zinitix_printk("early suspend--\n"); + up(&info->work_lock); + return; +} +#endif /* CONFIG_HAS_EARLYSUSPEND */ + +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) +static int bt541_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bt541_ts_info *info = i2c_get_clientdata(client); + struct capa_info *cap = &(info->cap_info); + +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "resume++\n"); +#endif + down(&info->work_lock); + if (info->work_state != SUSPEND) { + dev_err(&client->dev, "%s: Invalid work proceedure (%d)\n", + __func__, info->work_state); + up(&info->work_lock); + + return 0; + } + bt541_power_control(info, POWER_ON_SEQUENCE); + +#ifdef CONFIG_HAS_EARLYSUSPEND + info->work_state = RESUME; +#else + info->work_state = NOTHING; + if (mini_init_touch(info) == false) + dev_err(&client->dev, "Failed to resume\n"); + + if (read_data(client, BT541_FIRMWARE_VERSION, (u8 *)&cap->fw_version, 2)) + ; + if (read_data(client, BT541_MINOR_FW_VERSION, (u8 *)&cap->fw_minor_version, 2)) + ; + if (read_data(client, BT541_DATA_VERSION_REG, (u8 *)&cap->reg_data_version, 2)) + ; + if (read_data(client, BT541_HW_ID, (u8 *)&cap->hw_id, 2)) + ; + if (read_data(client, BT541_VENDOR_ID, (u8 *)&cap->vendor_id, 2)) + ; +#ifdef SUPPORTED_USE_DUAL_FW + bt541_firmware_check(); +#endif + if (!gpio_get_value(info->pdata->gpio_int)) + { + write_cmd(info->client, BT541_CLEAR_INT_STATUS_CMD); + udelay(50); + write_cmd(info->client, BT541_CLEAR_INT_STATUS_CMD); + udelay(50); + write_cmd(info->client, BT541_CLEAR_INT_STATUS_CMD); + } + info->work_state = NOTHING; +#endif + +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "resume--\n"); +#endif + up(&info->work_lock); + enable_irq(info->irq); + return 0; +} + +static int bt541_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bt541_ts_info *info = i2c_get_clientdata(client); + +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "suspend++\n"); +#endif + +#ifndef CONFIG_HAS_EARLYSUSPEND + disable_irq(info->irq); +#endif +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); +#endif + + down(&info->work_lock); + if (info->work_state != NOTHING + && info->work_state != SUSPEND) { + dev_err(&client->dev,"%s: Invalid work proceedure (%d)\n", + __func__, info->work_state); + up(&info->work_lock); +#ifndef CONFIG_HAS_EARLYSUSPEND + enable_irq(info->irq); +#endif + return 0; + } + +#ifndef CONFIG_HAS_EARLYSUSPEND + clear_report_data(info); + +#if ESD_TIMER_INTERVAL + esd_timer_stop(info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "Stopped esd timer\n"); +#endif +#endif +#endif + write_cmd(info->client, BT541_SLEEP_CMD); + bt541_power_control(info, POWER_OFF); + info->work_state = SUSPEND; + +#if defined(TSP_VERBOSE_DEBUG) + zinitix_printk("suspend--\n"); +#endif + up(&info->work_lock); + + return 0; +} +#endif + +static bool ts_set_touchmode(u16 value) +{ + int i; + + disable_irq(misc_info->irq); + + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_info->work_state); + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + return -1; + } + + misc_info->work_state = SET_MODE; + + if (value == TOUCH_DND_MODE) { + if (write_reg(misc_info->client, BT541_DND_N_COUNT, + SEC_DND_N_COUNT) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set DND_N_COUNT\n"); + + if (write_reg(misc_info->client, BT541_DND_U_COUNT, + SEC_DND_U_COUNT) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set DND_U_COUNT\n"); + + if (write_reg(misc_info->client, BT541_AFE_FREQUENCY, + SEC_DND_FREQUENCY) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set AFE_FREQUENCY\n"); + + } else if (misc_info->touch_mode == TOUCH_DND_MODE) { + if (write_reg(misc_info->client, BT541_AFE_FREQUENCY, + misc_info->cap_info.afe_frequency) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set AFE_FREQUENCY\n"); + + if (write_reg(misc_info->client, BT541_DND_U_COUNT, + misc_info->cap_info.U_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set U_COUNT\n"); + + if (write_reg(misc_info->client, BT541_SHIFT_VALUE, + misc_info->cap_info.shift_value) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set Shift\n"); + } + + if (value == TOUCH_SEC_MODE) + misc_info->touch_mode = TOUCH_POINT_MODE; + else + misc_info->touch_mode = value; + + printk(KERN_INFO "[zinitix_touch] tsp_set_testmode, " + "touchkey_testmode = %d\r\n", misc_info->touch_mode); + + if (misc_info->touch_mode != TOUCH_POINT_MODE) { + if (write_reg(misc_info->client, BT541_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS) + zinitix_printk("Fail to set BT541_DELAY_RAW_FOR_HOST.\r\n"); + } + + if (write_reg(misc_info->client, BT541_TOUCH_MODE, + misc_info->touch_mode) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] TEST Mode : " + "Fail to set ZINITX_TOUCH_MODE %d.\r\n", misc_info->touch_mode); + + /* clear garbage data */ + for (i = 0; i < 10; i++) { + mdelay(20); + write_cmd(misc_info->client, BT541_CLEAR_INT_STATUS_CMD); + } + + misc_info->work_state = NOTHING; + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + return 1; +} + +static bool ts_set_touchmode2(u16 value) +{ + int i; + + disable_irq(misc_info->irq); + + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_info->work_state); + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + return -1; + } + + misc_info->work_state = SET_MODE; + + if (value == TOUCH_DND_MODE) { + if (write_reg(misc_info->client, BT541_DND_N_COUNT, + SEC_HFDND_N_COUNT) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set DND_N_COUNT\n"); + + if (write_reg(misc_info->client, BT541_DND_U_COUNT, + SEC_HFDND_U_COUNT) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set DND_U_COUNT\n"); + + if (write_reg(misc_info->client, BT541_AFE_FREQUENCY, + SEC_HFDND_FREQUENCY) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set AFE_FREQUENCY\n"); + + + } else { + if (write_reg(misc_info->client, BT541_AFE_FREQUENCY, + misc_info->cap_info.afe_frequency) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set AFE_FREQUENCY\n"); + + if (write_reg(misc_info->client, BT541_DND_U_COUNT, + misc_info->cap_info.U_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set U_COUNT\n"); + + if (write_reg(misc_info->client, BT541_SHIFT_VALUE, + misc_info->cap_info.shift_value) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set Shift\n"); + } + + if (value == TOUCH_SEC_MODE) + misc_info->touch_mode = TOUCH_POINT_MODE; + else + misc_info->touch_mode = value; + + printk(KERN_INFO "[zinitix_touch] tsp_set_testmode, " + "touchkey_testmode = %d\r\n", misc_info->touch_mode); + + if (misc_info->touch_mode != TOUCH_POINT_MODE) { + if (write_reg(misc_info->client, BT541_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS) + zinitix_printk("Fail to set BT541_DELAY_RAW_FOR_HOST.\r\n"); + } + + if (write_reg(misc_info->client, BT541_TOUCH_MODE, + misc_info->touch_mode) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] TEST Mode : " + "Fail to set ZINITX_TOUCH_MODE %d.\r\n", misc_info->touch_mode); + + /* clear garbage data */ + for (i = 0; i < 10; i++) { + mdelay(20); + write_cmd(misc_info->client, BT541_CLEAR_INT_STATUS_CMD); + } + + misc_info->work_state = NOTHING; + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + return 1; +} + +static int ts_upgrade_sequence(const u8 *firmware_data) +{ + disable_irq(misc_info->irq); + down(&misc_info->work_lock); + misc_info->work_state = UPGRADE; + +#if ESD_TIMER_INTERVAL + esd_timer_stop(misc_info); +#endif + zinitix_debug_msg("clear all reported points\r\n"); + clear_report_data(misc_info); + + printk(KERN_INFO "start upgrade firmware\n"); + if (ts_upgrade_firmware(misc_info, + firmware_data, + misc_info->cap_info.ic_fw_size) == false) { + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return -1; + } + + if (init_touch(misc_info, false) == false) { + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return -1; + } + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, misc_info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&misc_info->client->dev, "Started esd timer\n"); +#endif +#endif + + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return 0; +} + +#ifdef SEC_FACTORY_TEST +static inline void set_cmd_result(struct bt541_ts_info *info, char *buff, int len) +{ + strncat(info->factory_info->cmd_result, buff, len); +} + +static inline void set_default_result(struct bt541_ts_info *info) +{ + char delim = ':'; + memset(info->factory_info->cmd_result, 0x00, ARRAY_SIZE(info->factory_info->cmd_result)); + memcpy(info->factory_info->cmd_result, info->factory_info->cmd, strlen(info->factory_info->cmd)); + strncat(info->factory_info->cmd_result, &delim, 1); +} + +#define MAX_FW_PATH 255 +#define TSP_FW_FILENAME "zinitix_fw.bin" + +static void fw_update(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + int ret = 0; + const u8 *buff = 0; + mm_segment_t old_fs = {0}; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char fw_path[MAX_FW_PATH+1]; + char result[16] = {0}; + + set_default_result(info); + + switch (info->factory_info->cmd_param[0]) { + case BUILT_IN: + ret = ts_upgrade_sequence((u8 *)m_firmware_data); + if (ret < 0) { + info->factory_info->cmd_state = 3; + return; + } + break; + + case UMS: + old_fs = get_fs(); + set_fs(get_ds()); + + snprintf(fw_path, MAX_FW_PATH, "/sdcard/%s", TSP_FW_FILENAME); + fp = filp_open(fw_path, O_RDONLY, 0); + if (IS_ERR(fp)) { + dev_err(&client->dev, + "file %s open error:%lu\n", fw_path, (unsigned long)fp); + info->factory_info->cmd_state = 3; + goto err_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + if (fsize != info->cap_info.ic_fw_size) { + dev_err(&client->dev, "invalid fw size!!\n"); + info->factory_info->cmd_state = 3; + goto err_open; + } + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + dev_err(&client->dev, "failed to alloc buffer for fw\n"); + info->factory_info->cmd_state = 3; + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + info->factory_info->cmd_state = 3; + goto err_fw_size; + } + + filp_close(fp, current->files); + set_fs(old_fs); + dev_info(&client->dev, "ums fw is loaded!!\n"); + + ret = ts_upgrade_sequence((u8 *)buff); + if (ret < 0) { + kfree(buff); + info->factory_info->cmd_state = 3; + goto update_fail; + } + break; + + default: + dev_err(&client->dev, "invalid fw file type!!\n"); + goto update_fail; + } + + info->factory_info->cmd_state = 2; + snprintf(result, sizeof(result) , "%s", "OK"); + set_cmd_result(info, result, + strnlen(result, sizeof(result))); + kfree(buff); + + return; + + + if (fp != NULL) { +err_fw_size: + kfree(buff); +err_alloc: + filp_close(fp, NULL); +err_open: + set_fs(old_fs); + } +update_fail: + snprintf(result, sizeof(result) , "%s", "NG"); + set_cmd_result(info, result, strnlen(result, sizeof(result))); +} + +static void get_fw_ver_bin(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + u16 fw_version, fw_minor_version, reg_version, hw_id, vendor_id; + u32 version, length; + + set_default_result(info); + + /* To Do */ + /* modify m_firmware_data */ + fw_version = (u16)(m_firmware_data[52] | (m_firmware_data[53] << 8)); + fw_minor_version = (u16)(m_firmware_data[56] | (m_firmware_data[57] << 8)); + reg_version = (u16)(m_firmware_data[60] | (m_firmware_data[61] << 8)); + hw_id = (u16)(m_firmware_data[0x7528] | (m_firmware_data[0x7529]<<8)); + /* vendor_id = ntohs(*(u16 *)&m_firmware_data[0x57e2]);*/ + version = (u32)((u32)(hw_id & 0xff) << 16) | ((fw_version & 0xf ) << 12) + | ((fw_minor_version & 0xf) << 8) | (reg_version & 0xff); + + /* length = sizeof(vendor_id); + snprintf(finfo->cmd_buff, length + 1, "%s", (u8 *)&vendor_id); + snprintf(finfo->cmd_buff + length, sizeof(finfo->cmd_buff) - length, + "%06X", version);*/ + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_fw_ver_ic(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + u16 fw_version, fw_minor_version, reg_version, hw_id, vendor_id; + u32 version, length; + + set_default_result(info); + + fw_version = info->cap_info.fw_version; + fw_minor_version = info->cap_info.fw_minor_version; + reg_version = info->cap_info.reg_data_version; + hw_id = info->cap_info.hw_id; + /* vendor_id = ntohs(info->cap_info.vendor_id);*/ + version = (u32)((u32)(hw_id & 0xff) << 16) | ((fw_version & 0xf) << 12) + | ((fw_minor_version & 0xf) << 8) | (reg_version & 0xff); + + /* length = sizeof(vendor_id); + snprintf(finfo->cmd_buff, length + 1, "%s", (u8 *)&vendor_id); + snprintf(finfo->cmd_buff + length, sizeof(finfo->cmd_buff) - length, + "%06X", version);*/ + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_threshold(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%d", info->cap_info.threshold); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +/* + static void get_key_threshold(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + int ret = 0; + u16 threshold; + + set_default_result(info); + + ret = read_data(misc_info->client, BT541_BUTTON_SENSITIVITY, (u8 *)&threshold, 2); + if (ret < 0) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "fail"); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = FAIL; + return; + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", threshold); + + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + } + */ + + +static void module_off_master(void *device_data) +{ + return; +} + +static void module_on_master(void *device_data) +{ + return; +} + +static void module_off_slave(void *device_data) +{ + return; +} + +static void module_on_slave(void *device_data) +{ + return; +} + +#define BT541_VENDOR_NAME "ZINITIX" + +static void get_chip_vendor(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%s", BT541_VENDOR_NAME); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +#define BT541_CHIP_NAME "BT541" + +static void get_chip_name(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", BT541_CHIP_NAME); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +#ifdef SUPPORTED_USE_DUAL_FW +static void get_module_vendor(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + int module_vendor =0; + + set_default_result(info); + + switch (info->cap_info.hw_id) { + case 0: + module_vendor = 0; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s,%d", "OK", module_vendor); + break; + case 1: + module_vendor = 1; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s,%d", "OK", module_vendor); + break; + default: + break; + } + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} +#endif + +static void get_x_num(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%u", info->cap_info.x_node_num); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_y_num(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%u", info->cap_info.y_node_num); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void not_support_cmd(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + sprintf(finfo->cmd_buff, "%s", "NA"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = NOT_APPLICABLE; + + dev_info(&client->dev, "%s: \"%s(%d)\"\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +#if 0 +static void run_reference_read(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + u16 min, max; + s32 i,j; + +#if ESD_TIMER_INTERVAL + esd_timer_stop(misc_info); +#endif + set_default_result(info); + + ts_set_touchmode(TOUCH_DND_MODE); + get_raw_data(info, (u8 *)raw_data->ref_data, 10); + ts_set_touchmode(TOUCH_POINT_MODE); + + min = 0xFFFF; + max = 0x0000; + + for (i = 0; i < info->cap_info.x_node_num; i++) + { + for (j = 0; j < info->cap_info.y_node_num; j++) + { + /*pr_info("ref_data : %d ", + raw_data->ref_data[i * info->cap_info.y_node_num + j]);*/ + + if (raw_data->ref_data[i * info->cap_info.y_node_num + j] < min && + raw_data->ref_data[i * info->cap_info.y_node_num + j] != 0) + min = raw_data->ref_data[i * info->cap_info.y_node_num + j]; + + if (raw_data->ref_data[i * info->cap_info.y_node_num + j] > max) + max = raw_data->ref_data[i * info->cap_info.y_node_num + j]; + + } + /*pr_info("\n");*/ + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%d,%d\n", min, max); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: \"%s\"(%d)\n", __func__, finfo->cmd_buff, + (int)strlen(finfo->cmd_buff)); + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, misc_info); +#endif + return; +} +#endif +static bool run_reference_DND_read(void *device_data, int button0, int button1) //DND +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + int i, j, nButton; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + int buttons[2] = {button0,button1}; + bool result = true, item_result= true; + +#if ESD_TIMER_INTERVAL + esd_timer_stop(misc_info); +#endif + + set_default_result(info); + ts_set_touchmode(TOUCH_DND_MODE); + get_raw_data(info, (u8 *)info->pdnd_data, 5); + ts_set_touchmode(TOUCH_POINT_MODE); + + printk("DND_data =\n"); + for (i = 0; i < x_num; i++) { + for (j = 0; j < y_num; j++) { + printk("%d ", info->pdnd_data[j+i*y_num]); + } + printk("\n"); + } + + info->dnd_max_x = info->dnd_max_y = info->dnd_min_x = info->dnd_min_y = 0; + info->dnd_max_val = -32768; + info->dnd_min_val = 32767; + info->dnd_real_max_val = -32768; + info->dnd_real_min_val = 32767; + info->dnd_node_num = -1; + + for (i = 0; i < x_num-1; i++) { + for (j = 0; j < y_num; j++) { + if (info->dnd_real_min_val > info->pdnd_data[j+i*y_num]) { + info->dnd_real_min_x = i; + info->dnd_real_min_y = j; + info->dnd_real_min_val = info->pdnd_data[j+i*y_num]; + } + if (info->dnd_real_max_val < info->pdnd_data[j+i*y_num]) { + info->dnd_real_max_x = i; + info->dnd_real_max_y = j; + info->dnd_real_max_val = info->pdnd_data[j+i*y_num]; + } + + if ((info->pdnd_data[j+i*y_num] < pdnd_min[i][j]) && (info->pdnd_data[j+i*y_num] != 0)) { + printk(" DND View Min fail : NODE = %u, Raw data = %d, SPEC = %u\n", j+i*y_num, info->pdnd_data[j+i*y_num], pdnd_min[i][j]); + item_result = false; + result = false; + + if (info->dnd_node_num == -1) + info->dnd_node_num = j + (i * y_num); + } + if (info->dnd_min_val > info->pdnd_data[j+i*y_num] - pdnd_min[i][j]) { + info->dnd_min_x = i; + info->dnd_min_y = j; + info->dnd_min_val = info->pdnd_data[j+i*y_num] - pdnd_min[i][j]; + } + if (info->pdnd_data[j+i*y_num] > pdnd_max[i][j]) { + printk(" DND View Max fail : NODE = %u, Raw data = %d, SPEC = %u\n", j+i*y_num, info->pdnd_data[j+i*y_num], pdnd_max[i][j]); + item_result = false; + result = false; + + if (info->dnd_node_num == -1) + info->dnd_node_num = j + (i * y_num); + } + if (info->dnd_max_val < info->pdnd_data[j+i*y_num] - pdnd_max[i][j]) { + info->dnd_max_x = i; + info->dnd_max_y = j; + info->dnd_max_val = info->pdnd_data[j+i*y_num] - pdnd_max[i][j]; + } + } + } + + if (item_result) + printk("DND View pass\n"); + else + printk("DND View fail\n"); + + /*button*/ + item_result = true; + if (info->cap_info.button_num) { + for (i = 0; i < 2; i++) { + nButton = buttons[i]; + + if (nButton < 0) + continue; + + if (info->dnd_real_min_val > info->pdnd_data[(x_num-1)*y_num+nButton]) { + info->dnd_real_min_x = x_num-1; + info->dnd_real_min_y = nButton; + info->dnd_real_min_val = info->pdnd_data[(x_num-1)*y_num+nButton]; + } + + if (info->dnd_real_max_val < info->pdnd_data[(x_num-1)*y_num+nButton]) { + info->dnd_real_max_x = x_num-1; + info->dnd_real_max_y = nButton; + info->dnd_real_max_val = info->pdnd_data[(x_num-1)*y_num+nButton]; + } + + if (info->pdnd_data[(x_num-1)*y_num+nButton] < pdnd_min[x_num-1][nButton]) { + printk(" DND Button Min fail : NODE = %u, Raw data = %d, SPEC = %u\n", nButton, info->pdnd_data[(x_num-1)*y_num+nButton], pdnd_min[x_num-1][nButton]); + item_result = false; + result = false; + + if (info->dnd_node_num == -1) + info->dnd_node_num = ((x_num - 1) * y_num) + nButton; + } + + if (info->dnd_min_val > info->pdnd_data[(x_num-1)*y_num+nButton] - pdnd_min[x_num-1][nButton]) { + info->dnd_min_x = x_num-1; + info->dnd_min_y = nButton; + info->dnd_min_val = info->pdnd_data[(x_num-1)*y_num+nButton] - pdnd_min[x_num-1][nButton]; + } + + if (info->pdnd_data[(x_num-1)*y_num+nButton] > pdnd_max[x_num-1][nButton]) { + printk(" DND Button Max fail : NODE = %u, Raw data = %d, SPEC = %u\n", nButton, info->pdnd_data[(x_num-1)*y_num+nButton], pdnd_max[x_num-1][nButton]); + item_result = false; + result = false; + + if (info->dnd_node_num == -1) + info->dnd_node_num = ((x_num - 1) * y_num) + nButton; + } + + if (info->dnd_max_val < info->pdnd_data[(x_num-1)*y_num+nButton] - pdnd_max[x_num-1][nButton]) { + info->dnd_max_x = x_num-1; + info->dnd_max_y = nButton; + info->dnd_max_val = info->pdnd_data[(x_num-1)*y_num+nButton] - pdnd_max[x_num-1][nButton]; + } + } + } + + if (item_result) { + info->dnd_done = true; + printk("DND Button pass\n"); + } else { + info->dnd_done = false; + printk("DND Butoon fail\n"); + } + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, misc_info); +#endif + + return result; +} + +static void run_reference_DND(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + bool temp; + + set_default_result(info); + + temp = run_reference_DND_read(device_data, 4, 7); + + if (temp) { + pr_info("DND pass\n"); + sprintf(finfo->cmd_buff, "OK\n"); + } else { + int x, y, node_num; + + node_num = info->dnd_node_num; + x = node_num / info->cap_info.y_node_num; + y = node_num % info->cap_info.y_node_num; + + pr_info("DND Fail\n"); + sprintf(finfo->cmd_buff, "%d,%d,%d,%d\n", + node_num, + pdnd_min[x][y], + pdnd_max[x][y], + info->pdnd_data[node_num]); + } + + finfo->cmd_state = OK; + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + +static bool run_reference_HFDND_read(void *device_data, int button0, int button1) //DND +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + int i, j, nButton; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + int buttons[2] = {button0,button1}; + bool result = true, item_result= true; + +#if ESD_TIMER_INTERVAL + esd_timer_stop(misc_info); +#endif + + set_default_result(info); + ts_set_touchmode2(TOUCH_DND_MODE); + get_raw_data(info, (u8 *)info->hfdnd_data, 5); + ts_set_touchmode(TOUCH_POINT_MODE); + + printk("HFDND_data =\n"); + for (i = 0; i < x_num; i++) { + for (j = 0; j < y_num; j++) { + printk("%d ", info->hfdnd_data[j+i*y_num]); + } + printk("\n"); + } + + info->hfdnd_max_x = info->hfdnd_max_y = info->hfdnd_min_x = info->hfdnd_min_y = 0; + info->hfdnd_max_val = -32768; + info->hfdnd_min_val = 32767; + info->hfdnd_real_max_val = -32768; + info->hfdnd_real_min_val = 32767; + info->hfdnd_node_num = -1; + + //MAX + for (i = 0; i < x_num-1; i++) { + for (j = 0; j < y_num; j++) { + if (info->hfdnd_real_min_val > info->hfdnd_data[j+i*y_num]) { + info->hfdnd_real_min_x = i; + info->hfdnd_real_min_y = j; + info->hfdnd_real_min_val = info->hfdnd_data[j+i*y_num]; + } + + if (info->hfdnd_real_max_val < info->hfdnd_data[j+i*y_num]) { + info->hfdnd_real_max_x = i; + info->hfdnd_real_max_y = j; + info->hfdnd_real_max_val = info->hfdnd_data[j+i*y_num]; + } + + if ((info->hfdnd_data[j+i*y_num] < hfdnd_min[i][j]) && (info->hfdnd_data[j+i*y_num] != 0)) { + printk(" HFDND View Min fail : NODE = %u,Raw data = %d, SPEC = %u\n", j+i*y_num, info->hfdnd_data[j+i*y_num], hfdnd_min[i][j]); + item_result = false; + result = false; + + if (info->hfdnd_node_num == -1) + info->hfdnd_node_num = j + (i * y_num); + } + + if (info->hfdnd_min_val > info->hfdnd_data[j+i*y_num] - hfdnd_min[i][j]) { + info->hfdnd_min_x = i; + info->hfdnd_min_y = j; + info->hfdnd_min_val = info->hfdnd_data[j+i*y_num] - hfdnd_min[i][j]; + } + + if (info->hfdnd_data[j+i*y_num] > hfdnd_max[i][j]) { + printk(" HFDND View Max fail : NODE = %u, Raw data = %d, SPEC = %u\n", j+i*y_num, info->hfdnd_data[j+i*y_num], hfdnd_max[i][j]); + item_result = false; + result = false; + + if (info->hfdnd_node_num == -1) + info->hfdnd_node_num = j + (i * y_num); + } + + if (info->hfdnd_max_val < info->hfdnd_data[j+i*y_num] - hfdnd_max[i][j]) { + info->hfdnd_max_x = i; + info->hfdnd_max_y = j; + info->hfdnd_max_val = info->hfdnd_data[j+i*y_num] - hfdnd_max[i][j]; + } + } + } + + if (item_result) + printk("HFDND View pass\n"); + else + printk("HFDND View Fail\n"); + + //button + item_result = true; + if (info->cap_info.button_num) { + for (i = 0; i < 2; i++) { + nButton = buttons[i]; + if (nButton < 0) + continue; + + if (info->hfdnd_real_min_val > info->hfdnd_data[(x_num-1)*y_num+nButton]) { + info->hfdnd_real_min_x = x_num-1; + info->hfdnd_real_min_y = nButton; + info->hfdnd_real_min_val = info->hfdnd_data[(x_num-1)*y_num+nButton]; + } + + if (info->hfdnd_real_max_val < info->hfdnd_data[(x_num-1)*y_num+nButton]) { + info->hfdnd_real_max_x = x_num-1; + info->hfdnd_real_max_y = nButton; + info->hfdnd_real_max_val = info->hfdnd_data[(x_num-1)*y_num+nButton]; + } + + if (info->hfdnd_data[(x_num-1)*y_num+nButton] < hfdnd_min[x_num-1][nButton]) { + printk(" HFDND Button Min fail : NODE = %u, Raw data = %d, SPEC = %u\n", nButton, info->hfdnd_data[(x_num-1)*y_num+nButton], hfdnd_min[x_num-1][nButton]); + item_result = false; + result = false; + + if (info->hfdnd_node_num == -1) + info->hfdnd_node_num = ((x_num - 1) * y_num) + nButton; + } + if (info->hfdnd_min_val > info->hfdnd_data[(x_num-1)*y_num+nButton] - hfdnd_min[x_num-1][nButton]) { + info->hfdnd_min_x = x_num-1; + info->hfdnd_min_y = nButton; + info->hfdnd_min_val = info->hfdnd_data[(x_num-1)*y_num+nButton] - hfdnd_min[x_num-1][nButton]; + } + if (info->hfdnd_data[(x_num-1)*y_num+nButton] > hfdnd_max[x_num-1][nButton]) { + printk(" HFDND Button Max fail : NODE = %u, Raw data = %d, SPEC = %u\n", nButton, info->hfdnd_data[(x_num-1)*y_num+nButton], hfdnd_min[x_num-1][nButton]); + item_result = false; + result = false; + + if (info->hfdnd_node_num == -1) + info->hfdnd_node_num = ((x_num - 1) * y_num) + nButton; + } + if (info->hfdnd_max_val < info->hfdnd_data[(x_num-1)*y_num+nButton] - hfdnd_min[x_num-1][nButton]) { + info->hfdnd_max_x = x_num-1; + info->hfdnd_max_y = nButton; + info->hfdnd_max_val = info->hfdnd_data[(x_num-1)*y_num+nButton] - hfdnd_min[x_num-1][nButton]; + } + } + } + + if (item_result) { + info->hfdnd_done = true; + printk("HFDND Button pass\n"); + } else { + info->hfdnd_done = false; + printk("HFDND Button fail\n"); + } + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, misc_info); +#endif + + return result; +} + +static void run_reference_HFDND(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + bool temp; + + set_default_result(info); + + temp = run_reference_HFDND_read(device_data, 4, 7); + + if (temp) { + pr_info("HF DND pass\n"); + sprintf(finfo->cmd_buff, "OK\n"); + } else { + int x, y, node_num; + + node_num = info->hfdnd_node_num; + x = node_num / info->cap_info.y_node_num; + y = node_num % info->cap_info.y_node_num; + + pr_info("HF DND Fail\n"); + sprintf(finfo->cmd_buff, "%d,%d,%d,%d\n", + node_num, + hfdnd_min[x][y], + hfdnd_max[x][y], + info->hfdnd_data[node_num]); + } + + finfo->cmd_state = OK; + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + +static bool run_reference_V_Diff_read(void *device_data, int button0, int button1) //DND +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + + int print_diff[19*10]={0,}; + int buttons[2] = {button0,button1}; + int i, j, diff_val, pre_val, next_val, nButton; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + bool result = true, item_result = true; + + printk("TSP Diff test scale factor = %d\n",TSP_INIT_TEST_RATIO); + printk("V Diff start\n"); + + info->vdiff_max_x = info->vdiff_max_y = info->vdiff_min_x = info->vdiff_min_y = 0; + info->vdiff_max_val = -32768; + info->vdiff_min_val = 32767; + info->vdiff_node_num = -1; + + item_result = true; + for (i = 0; i < x_num-2; i++) { + for (j = 0; j < y_num; j++) { + //printk("%d ", info->pdnd_data[i*y_num+j]); + next_val = info->pdnd_data[(i*y_num)+j]; + pre_val = info->pdnd_data[(i*y_num)+j+y_num]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + printk(" %d ", diff_val); + + pre_val = (TSP_INIT_TEST_RATIO == 100)?((s16)dnd_v_diff[i][j]):((s16)(((s32)dnd_v_diff[i][j] * TSP_INIT_TEST_RATIO) /100)); + if (diff_val > pre_val) { + result = false; + item_result = false; + + if (info->vdiff_node_num == -1) { + info->vdiff_node_num = j + (i * y_num); + info->vdiff_diff_val = diff_val; + } + } +#if PDIFF_DEBUG + print_diff[i*y_num+j] = diff_val; +#endif + if (info->vdiff_max_val < diff_val) { + info->vdiff_max_val = diff_val; + info->vdiff_max_x = i; + info->vdiff_max_y= j; + } + if (info->vdiff_min_val > diff_val) { + info->vdiff_min_val = diff_val; + info->vdiff_min_x = i; + info->vdiff_min_y= j; + } + } + printk("\n"); + } + + if (item_result) + printk("V Diff view pass\n"); + else + printk("V Diff view fail\n"); + + item_result = true; + if ( info->cap_info.button_num) { + printk("TSP Button scale = %d\n", TSP_INIT_TEST_RATIO); + printk("TSP Button Diff Spec. = %d %d\n", + dnd_v_diff[x_num-2][buttons[0]], dnd_v_diff[x_num-2][buttons[1]]); + + for (i = 0; i < 2; i++) { + nButton = buttons[i]; + if (nButton < 0) + continue; + next_val = info->pdnd_data[(x_num-1)*y_num+nButton]; + pre_val = info->pdnd_data[(x_num-2)*y_num+nButton]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + pre_val = (TSP_INIT_TEST_RATIO == 100)?( (s16)dnd_v_diff[x_num-2][nButton]+info->ref_btn_option): \ + ((s16)(((s32)dnd_v_diff[x_num-2][nButton]*TSP_INIT_TEST_RATIO)/100)+info->ref_btn_option); + + if (diff_val > pre_val) { + item_result = false; + result = false; + + if (info->vdiff_node_num == -1) { + info->vdiff_node_num = ((x_num - 2) * y_num) + nButton; + info->vdiff_diff_val = diff_val; + } + } + if (info->vdiff_max_val < diff_val) { + info->vdiff_max_val = diff_val; + info->vdiff_max_x = x_num - 1; + info->vdiff_max_y= nButton; + } + if (info->vdiff_min_val >diff_val) { + info->vdiff_min_val = diff_val; + info->vdiff_min_x = x_num - 1; + info->vdiff_min_y= nButton; + } +#if PDIFF_DEBUG + printk("buttons[%d]'s diff_val is %d\n", i, diff_val); +#endif + } + } + + if (item_result) + printk("Button V Diff pass\n"); + else + printk("Button V Diff fail\n"); + + return result; +} + +static void run_reference_V_Diff(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + bool temp; + + set_default_result(info); + + temp = run_reference_V_Diff_read(device_data, 4, 7); + + if (temp) { + pr_info("V Diff pass\n"); + sprintf(finfo->cmd_buff, "OK\n"); + } else { + int x, y, node_num; + + node_num = info->dnd_node_num; + x = node_num / info->cap_info.y_node_num; + y = node_num % info->cap_info.y_node_num; + + pr_info("V Diff Fail\n"); + sprintf(finfo->cmd_buff, "%d,%d,%d,%d\n", + node_num, + 0, + dnd_v_diff[x][y], + info->vdiff_diff_val); + } + + finfo->cmd_state = OK; + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + +static bool run_reference_H_Diff_read(void *device_data, int button0, int button1) //DND +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + + int print_diff[19*10]={0,}; + int buttons[2] = {button0,button1}; + int i, j, diff_val, pre_val, next_val; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + bool result = true, item_result = true; + + printk("TSP Diff test scale factor = %d\n",TSP_INIT_TEST_RATIO); + printk("Diff start\n"); + //H DIff + info->hdiff_max_x = info->hdiff_max_y = info->hdiff_min_x = info->hdiff_min_y = 0; + info->hdiff_max_val = -32768; + info->hdiff_min_val = 32767; + info->hdiff_node_num = -1; + + for (i = 0; i < x_num - 1; i++) { + for (j = 0; j < y_num-1; j++) { + //printk("%d ", info->dnd_data[i*y_num+j]); + next_val = info->pdnd_data[(i*y_num)+(j+1)]; + pre_val = info->pdnd_data[(i*y_num)+j]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + printk("%d ", diff_val); + + pre_val = (TSP_INIT_TEST_RATIO== 100)?((s16)dnd_h_diff[i][j]):((s16)(((s32)dnd_h_diff[i][j] * TSP_INIT_TEST_RATIO) /100)); + if (diff_val > pre_val) { + result = false; + item_result = false; + + if (info->hdiff_node_num == -1) { + info->hdiff_node_num = j + (i * y_num); + info->hdiff_diff_val = diff_val; + } + } +#if PDIFF_DEBUG + print_diff[i*y_num+j] = diff_val; +#endif + if (info->hdiff_max_val < diff_val) { + info->hdiff_max_val = diff_val; + info->hdiff_max_x = i; + info->hdiff_max_y= j; + } + if (info->hdiff_min_val > diff_val) { + info->hdiff_min_val = diff_val; + info->hdiff_min_x = i; + info->hdiff_min_y= j; + } + } + printk("\n"); + } + + if (item_result) + printk("H Diff pass\n"); + else + printk("H Diff fail\n"); + + item_result = true; + if (info->cap_info.button_num) { + printk("TSP Button scale = %d\n", TSP_INIT_TEST_RATIO); + printk("TSP Button Diff Spec. = %d %d\n", + dnd_v_diff[x_num-2][buttons[0]], dnd_v_diff[x_num-2][buttons[1]]); + + pre_val = info->pdnd_data[(x_num-1)*y_num+button0]; + next_val = info->pdnd_data[(x_num-1)*y_num+button1]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + pre_val = (TSP_INIT_TEST_RATIO == 100)?( (s16)dnd_h_diff[x_num-1][button1]+info->ref_btn_option): \ + ((s16)(((s32)dnd_h_diff[x_num-1][button1]*TSP_INIT_TEST_RATIO)/100)+info->ref_btn_option); + + if (diff_val > pre_val) { + item_result = false; + result = false; + + if (info->hdiff_node_num == -1) { + info->hdiff_node_num = ((x_num - 1) * y_num) + button1; + info->hdiff_diff_val = diff_val; + } + } + if (info->hdiff_max_val < diff_val) { + info->hdiff_max_val = diff_val; + info->hdiff_max_x = x_num - 1; + info->hdiff_max_y= button1; + } + if (info->hdiff_min_val >diff_val) { + info->hdiff_min_val = diff_val; + info->hdiff_min_x = x_num - 1; + info->hdiff_min_y= button1; + } + } + + if (item_result) + printk("Button H Diff pass\n"); + else + printk("Button H Diff fail\n"); + + return result; +} + +static void run_reference_H_Diff(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + bool temp; + u8 *ret_string; + + set_default_result(info); + + temp = run_reference_H_Diff_read(device_data, 4, 7); + + if (temp) + ret_string = "H Diff pass"; + else + ret_string = "H Diff Fail"; + + if (temp) { + pr_info("H Diff pass\n"); + sprintf(finfo->cmd_buff, "OK\n"); + } else { + int x, y, node_num; + + node_num = info->hfdnd_node_num; + x = node_num / info->cap_info.y_node_num; + y = node_num % info->cap_info.y_node_num; + + pr_info("H Diff Fail\n"); + sprintf(finfo->cmd_buff, "%d,%d,%d,%d\n", + node_num, + 0, + dnd_h_diff[x][y], + info->hdiff_diff_val); + } + + finfo->cmd_state = OK; + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + +static void get_reference_DND(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + char buff[19*7] = {0}; + // char tmp[16] = {0}; + int x_node, y_node; + int node_num; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= x_num || y_node < 0 || y_node >= y_num) { + snprintf(buff, sizeof(buff), "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = FAIL; + return; + } + /* + for (i = 0; i < x_num-1; i++) { + node_num = i*y_num + y_node; + sprintf(tmp, "%d", info->pdnd_data[node_num]); + strcat(buff, tmp); + if (i < x_num-2) + strcat(buff, " "); + } + */ + node_num = (x_node * y_num) + y_node; + + sprintf(finfo->cmd_buff, "%d", info->pdnd_data[node_num]); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, (int)strnlen(buff, sizeof(buff))); + + return; +} + +/* + static void get_reference_max_H_Diff(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + int H_diff[19*9] = {0}; + int i, j, diff_val, pre_val, next_val; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + int max_hdiff = 0; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + printk("H Diff start\n"); +//H DIff +for (i = 0; i < x_num - 1; i++) { +for (j = 0; j pdnd_data[(i*y_num)+(j+1)]; +pre_val = info->pdnd_data[(i*y_num)+j]; +diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + +printk("%4d ", diff_val); +H_diff[i*(y_num-1)+j] = diff_val; +if ((i == 0) && (j == 0)) +max_hdiff = diff_val; +else { +if (max_hdiff < diff_val) +max_hdiff = diff_val; +} +} +printk("\n"); +} + + +sprintf(finfo->cmd_buff, "%d", max_hdiff); +set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +finfo->cmd_state = OK; + +dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, +finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + */ + +static void get_reference_H_Diff(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + int H_diff[19*9] = {0}; + //char tmp[10] = {0}; + int x_node, y_node; + int node_num; + int i, j, diff_val, pre_val, next_val; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + printk("H Diff start\n"); + //H DIff + for (i = 0; i < x_num - 1; i++) { + for (j = 0; j < y_num-1; j++) { + next_val = info->pdnd_data[(i*y_num)+(j+1)]; + pre_val = info->pdnd_data[(i*y_num)+j]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + printk("%4d ", diff_val); + H_diff[i*(y_num-1)+j] = diff_val; + } + printk("\n"); + } + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= x_num || y_node < 0 || y_node >= y_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "NG"); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = FAIL; + return; + } + /* + for (i = 0; i < x_num-1; i++) { + node_num = i*(y_num-1) + y_node; + sprintf(tmp, "%d", H_diff[node_num]); + strcat(finfo->cmd_buff, tmp); + if (i < x_num-2) + strcat(finfo->cmd_buff, " "); + } + */ + node_num = (x_node * y_num) + y_node; + + sprintf(finfo->cmd_buff, "%d", H_diff[node_num]); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + +/* + static void get_reference_max_V_Diff(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + int V_Diff[19*10] = {0}; + int buttons[2] = {4,7}; + int i, j, pre_val, next_val, nButton; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + int diff_val = 0, max_vdiff = 0; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + for (i = 0; i < x_num-2; i++) { + for (j=0; j < y_num; j++) { + next_val = info->pdnd_data[(i*y_num)+j]; + pre_val = info->pdnd_data[(i*y_num)+j+y_num]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + printk(" %4d ", diff_val); + V_Diff[i*y_num+j] = diff_val; + if ((i == 0) && (j == 0)) + max_vdiff = diff_val; + else { + if (max_vdiff < diff_val) + max_vdiff = diff_val; + } + } + printk("\n"); + } + +//V DIff button +if ( info->cap_info.button_num) { +for (i = 0; i < 2; i++) { +nButton = buttons[i]; +if (nButton < 0) +continue; +next_val = info->pdnd_data[(x_num-1)*y_num+nButton]; +pre_val = info->pdnd_data[(x_num-2)*y_num+nButton]; +diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); +V_Diff[(x_num-1)*y_num + nButton] = diff_val; +if (max_vdiff < diff_val) +max_vdiff = diff_val; +} +} + +sprintf(finfo->cmd_buff, "%d", diff_val); +set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +finfo->cmd_state = OK; + +dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, +finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + */ + +static void get_reference_V_Diff(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + /*char tmp[10] = {0};*/ + int V_Diff[19*10] = {0}; + int x_node, y_node; + int node_num; + int buttons[2] = {4,7}; + int i, j, diff_val, pre_val, next_val, nButton; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + for (i = 0; i < x_num-2; i++) { + for (j = 0; j < y_num; j++) { + next_val = info->pdnd_data[(i*y_num)+j]; + pre_val = info->pdnd_data[(i*y_num)+j+y_num]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + + printk(" %d ", diff_val); + V_Diff[i*y_num+j] = diff_val; + } + printk("\n"); + } + + //V DIff button + if ( info->cap_info.button_num) { + for (i = 0; i < 2; i++) { + nButton = buttons[i]; + if (nButton < 0) + continue; + next_val = info->pdnd_data[(x_num-1)*y_num+nButton]; + pre_val = info->pdnd_data[(x_num-2)*y_num+nButton]; + diff_val = (next_val > pre_val)?(next_val - pre_val):(pre_val - next_val); + V_Diff[(x_num-1)*y_num + nButton] = diff_val; + } + } + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= x_num || y_node < 0 || y_node >= y_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "NG"); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = FAIL; + return; + } + /* + for (i = 0; i < x_num-2; i++) { + node_num = i*y_num + y_node; + sprintf(tmp, "%d", V_Diff[node_num]); + strcat(finfo->cmd_buff, tmp); + if (i < x_num-3) + strcat(finfo->cmd_buff, " "); + } + */ + node_num = (x_node * y_num) + y_node; + + sprintf(finfo->cmd_buff, "%d", V_Diff[node_num]); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +} + +static void get_reference_HFDND(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + char buff[512] = {0}; + // char tmp[16] = {0}; + int x_node, y_node; + int node_num; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + + set_default_result(info); + + if (!info->hfdnd_done) + run_reference_HFDND_read(device_data, 4, 7); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= x_num || y_node < 0 || y_node >= y_num) { + snprintf(buff, sizeof(buff), "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = FAIL; + return; + } + /* + for (i = 0; i < x_num-1; i++) { + node_num = i*y_num + y_node; + sprintf(tmp, "%d", info->hfdnd_data[node_num]); + strcat(buff, tmp); + if (i < x_num-2) + strcat(buff, " "); + } + */ + node_num = (x_node * y_num) + y_node; + + sprintf(finfo->cmd_buff, "%d", info->hfdnd_data[node_num]); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, (int)strnlen(buff, sizeof(buff))); + + return; +} + +/* + static void get_max_dnd(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + sprintf(finfo->cmd_buff, "%d", info->dnd_real_max_val); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_min_dnd(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + if (!info->dnd_done) + run_reference_DND_read(device_data, 4, 7); + + sprintf(finfo->cmd_buff, "%d", info->dnd_real_min_val); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_max_hfdnd(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + s16 val[3] = {0}; + + set_default_result(info); + + val[0] = info->hfdnd_max_x; + val[1] = info->hfdnd_max_y; + val[2] = info->hfdnd_max_val; + + memcpy(finfo->cmd_buff, (char*)val, sizeof(finfo->cmd_buff)); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_min_hfdnd(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + s16 val[3] = {0}; + + set_default_result(info); + + val[0] = info->hfdnd_min_x; + val[1] = info->hfdnd_min_y; + val[2] = info->hfdnd_min_val; + + memcpy(finfo->cmd_buff, (char*)val, sizeof(finfo->cmd_buff)); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_max_hdiff(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + s16 val[3] = {0}; + + set_default_result(info); + + val[0] = info->hdiff_max_x; + val[1] = info->hdiff_max_y; + val[2] = info->hdiff_max_val; + + sprintf(finfo->cmd_buff, "%d", info->hdiff_max_val); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_min_hdiff(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + s16 val[3] = {0}; + + set_default_result(info); + + val[0] = info->hdiff_min_x; + val[1] = info->hdiff_min_y; + val[2] = info->hdiff_min_val; + + sprintf(finfo->cmd_buff, "%d", info->hdiff_min_val); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_max_vdiff(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + s16 val[3] = {0}; + + set_default_result(info); + + val[0] = info->vdiff_max_x; + val[1] = info->vdiff_max_y; + val[2] = info->vdiff_max_val; + + memcpy(finfo->cmd_buff, (char*)val, sizeof(finfo->cmd_buff)); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_min_vdiff(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + s16 val[3] = {0}; + + set_default_result(info); + + val[0] = info->vdiff_min_x; + val[1] = info->vdiff_min_y; + val[2] = info->vdiff_min_val; + + memcpy(finfo->cmd_buff, (char*)val, sizeof(finfo->cmd_buff)); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + } + */ + +/* + static void get_reference(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + unsigned int val; + int x_node, y_node; + int node_num; + + set_default_result(info); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= info->cap_info.x_node_num || + y_node < 0 || y_node >= info->cap_info.y_node_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "abnormal"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = FAIL; + return; + } + + node_num = x_node * info->cap_info.y_node_num + y_node; + + val = raw_data->ref_data[node_num]; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; + } + */ + +#if 0 +static void run_preference_read(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + u16 min, max; + s32 i,j; + + set_default_result(info); + + ts_set_touchmode(TOUCH_PDND_MODE); + get_raw_data(info, (u8 *)raw_data->pref_data, 10); + ts_set_touchmode(TOUCH_POINT_MODE); + + min = 0xFFFF; + max = 0x0000; + + for (i = 0; i < info->cap_info.x_node_num; i++) + { + for (j = 0; j < info->cap_info.y_node_num; j++) + { + /*pr_info("pref_data : %d ", + raw_data->pref_data[i * info->cap_info.y_node_num + j]);*/ + + if (raw_data->pref_data[i * info->cap_info.y_node_num + j] < min && + raw_data->pref_data[i * info->cap_info.y_node_num + j] != 0) + min = raw_data->pref_data[i * info->cap_info.y_node_num + j]; + + if (raw_data->pref_data[i * info->cap_info.y_node_num + j] > max) + max = raw_data->pref_data[i * info->cap_info.y_node_num + j]; + + } + /*pr_info("\n");*/ + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%d,%d\n", min, max); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: \"%s\"(%d)\n", __func__, finfo->cmd_buff, + strlen(finfo->cmd_buff)); + + return; +} + +static void get_preference(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + unsigned int val; + int x_node, y_node; + int node_num; + + set_default_result(info); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= info->cap_info.x_node_num || + y_node < 0 || y_node >= info->cap_info.y_node_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "abnormal"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = FAIL; + + return; + } + + node_num = x_node * info->cap_info.y_node_num + y_node; + + val = raw_data->pref_data[node_num]; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} +/* + static void run_scantime_read(void *device_data) + { + return; + } + + static void get_scantime(void *device_data) + { + return; + } + */ + +static void run_normal_read(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + ts_set_touchmode(TOUCH_NORMAL_MODE); + get_raw_data(info, (u8 *)info->normal_data, 5); + ts_set_touchmode(TOUCH_POINT_MODE); + finfo->cmd_state = OK; +} +#endif + +#if 0 +static void run_delta_read(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + s16 min, max; + s32 i,j; + + set_default_result(info); + + ts_set_touchmode(TOUCH_DELTA_MODE); + get_raw_data(info, (u8 *)(u8 *)raw_data->delta_data, 5); + ts_set_touchmode(TOUCH_POINT_MODE); + finfo->cmd_state = OK; + + min = (s16)0x7FFF; + max = (s16)0x8000; + + for (i = 0; i < info->cap_info.x_node_num; i++) + { + for (j = 0; j < info->cap_info.y_node_num; j++) + { + /*printk("delta_data : %d\n", raw_data->delta_data[j+i]);*/ + + if (raw_data->delta_data[i * info->cap_info.y_node_num + j] < min && + raw_data->delta_data[i * info->cap_info.y_node_num + j] != 0) + min = raw_data->delta_data[i * info->cap_info.y_node_num + j]; + + if (raw_data->delta_data[i * info->cap_info.y_node_num + j] > max) + max = raw_data->delta_data[i * info->cap_info.y_node_num + j]; + + } + /*printk("\n");*/ + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%d,%d\n", min, max); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: \"%s\"(%d)\n", __func__, finfo->cmd_buff, + (int)strlen(finfo->cmd_buff)); + + return; +} +#endif + +/* + static void get_reference_RxDND(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + int y_node, i; + int node_num; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + s16 val[20] = {0}; + char buff[40] = {0}; + + set_default_result(info); + + y_node = finfo->cmd_param[0]; + + if (y_node < 0 || y_node > y_num) { + snprintf(buff, sizeof(buff), "%s", "abnormal"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = FAIL; + return; + } + + for (i = 0; i < x_num; i++) { + node_num = i*y_num + y_node; + val[i] = info->pdnd_data[node_num]; + } + + memcpy(buff, (char*)val, sizeof(buff)); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, (int)strnlen(buff, sizeof(buff))); + } + */ + +/* + static void get_reference_RxHFDND(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + char buff[40] = {0}; + s16 val[20] = {0}; + int y_node, i; + int node_num; + int x_num = info->cap_info.x_node_num, y_num = info->cap_info.y_node_num; + + set_default_result(info); + + y_node = finfo->cmd_param[0]; + + if (y_node < 0 || y_node > y_num) { + snprintf(buff, sizeof(buff), "%s", "NG"); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = FAIL; + return; + } + + for (i = 0; i < x_num; i++) { + node_num = i*y_num + y_node; + val[i] = info->hfdnd_data[node_num]; + } + + memcpy(buff, (char*)val, sizeof(buff)); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + buff, (int)strnlen(buff, sizeof(buff))); + } + */ + +/* + static void get_delta(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + unsigned int val; + int x_node, y_node; + int node_num; + + set_default_result(info); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= info->cap_info.x_node_num || + y_node < 0 || y_node >= info->cap_info.y_node_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "abnormal"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = FAIL; + + return; + } + + node_num = x_node * info->cap_info.y_node_num + y_node; + + val = raw_data->delta_data[node_num]; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; + } + */ + +/* + static void get_tkey_delta(void *device_data) + { + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + + u16 val; + int btn_node; + int ret; + + set_default_result(info); + + btn_node = finfo->cmd_param[0]; + + if (btn_node < 0 || btn_node > MAX_SUPPORTED_BUTTON_NUM) + goto err_out; + + disable_irq(misc_info->irq); + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_info->work_state); + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + goto err_out; + } + misc_info->work_state = SET_MODE; + + ret = read_data(misc_info->client, BT541_BTN_WIDTH + btn_node, (u8 *)&val, 2); + + if (ret < 0) { + printk(KERN_INFO "read error..\n"); + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + goto err_out; + } + misc_info->work_state = NOTHING; + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&info->client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + return; + +err_out: +snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "NG"); +set_cmd_result(info, finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); +finfo->cmd_state = FAIL; +} + */ + +static void hfdnd_spec_adjust(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + int test; + + set_default_result(info); + + test = finfo->cmd_param[0]; + + if (test) { + dnd_v_diff = assy_dnd_v_diff; + dnd_h_diff = assy_dnd_h_diff; + pdnd_max = assy_pdnd_max; + pdnd_min = assy_pdnd_min; + hfdnd_max = assy_hfdnd_max; + hfdnd_min = assy_hfdnd_min; + } else { + dnd_v_diff = tsp_dnd_v_diff; + dnd_h_diff = tsp_dnd_h_diff; + pdnd_max = tsp_pdnd_max; + pdnd_min = tsp_pdnd_min; + hfdnd_max = tsp_hfdnd_max; + hfdnd_min = tsp_hfdnd_min; + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "OK"); + set_cmd_result(info, finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + return; +} + +static void clear_reference_data(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + +#if ESD_TIMER_INTERVAL + esd_timer_stop(info); + write_reg(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, 0); +#endif + + write_reg(client, BT541_EEPROM_INFO_REG, 0xffff); + + write_reg(client, 0xc003, 0x0001); + write_reg(client, 0xc104, 0x0001); + udelay(100); + if (write_cmd(client, BT541_SAVE_STATUS_CMD) != I2C_SUCCESS) + return; + + mdelay(500); + write_reg(client, 0xc003, 0x0000); + write_reg(client, 0xc104, 0x0000); + udelay(100); + +#if ESD_TIMER_INTERVAL + write_reg(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, + SCAN_RATE_HZ * ESD_TIMER_INTERVAL); + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + dev_info(&client->dev, "%s: TSP clear calibration bit\n", __func__); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "OK"); + set_cmd_result(info, finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + return; +} + +static void run_ref_calibration(void *device_data) +{ + struct bt541_ts_info *info = (struct bt541_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + int i; + + set_default_result(info); + +#if ESD_TIMER_INTERVAL + esd_timer_stop(info); + write_reg(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, 0); +#endif + + write_reg(client, 0x01CA, 1300); + if (ts_hw_calibration(info) == true) + dev_info(&client->dev, "%s: TSP calibration Pass\n", __func__); + else + dev_info(&client->dev, "%s: TSP calibration Fail\n", __func__); + + write_reg(client, 0x01CA, 0); + write_reg(client, 0x0149, 0); + + for (i = 0; i < 5; i++) { + write_cmd(client, BT541_CLEAR_INT_STATUS_CMD); + udelay(10); + } + +#if ESD_TIMER_INTERVAL + write_reg(client, BT541_PERIODICAL_INTERRUPT_INTERVAL, + SCAN_RATE_HZ * ESD_TIMER_INTERVAL); + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "OK"); + set_cmd_result(info, finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: %s(%d)\n", __func__, + finfo->cmd_buff, (int)strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + return; +} + +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct bt541_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + char *cur, *start, *end; + char buff[TSP_CMD_STR_LEN] = {0}; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + + if (finfo->cmd_is_running == true) { + dev_err(&client->dev, "%s: other cmd is running\n", __func__); + goto err_out; + } + + /* check lock */ + mutex_lock(&finfo->cmd_lock); + finfo->cmd_is_running = true; + mutex_unlock(&finfo->cmd_lock); + + finfo->cmd_state = RUNNING; + + for (i = 0; i < ARRAY_SIZE(finfo->cmd_param); i++) + finfo->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + + memset(finfo->cmd, 0x00, ARRAY_SIZE(finfo->cmd)); + memcpy(finfo->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(buff, buf, cur - buf); + else + memcpy(buff, buf, len); + + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &finfo->cmd_list_head, list) { + if (!strcmp(buff, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &finfo->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(buff, 0x00, ARRAY_SIZE(buff)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(buff, start, end - start); + *(buff + strlen(buff)) = '\0'; + finfo->cmd_param[param_cnt] = + (int)simple_strtol(buff, NULL, 10); + start = cur + 1; + memset(buff, 0x00, ARRAY_SIZE(buff)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + + dev_info(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + /* for (i = 0; i < param_cnt; i++) + dev_info(&client->dev, "cmd param %d= %d\n", i, finfo->cmd_param[i]);*/ + + tsp_cmd_ptr->cmd_func(info); + + mutex_lock(&finfo->cmd_lock); + finfo->cmd_is_running = false; + mutex_unlock(&finfo->cmd_lock); + +err_out: + return count; +} + +static ssize_t show_cmd_status(struct device *dev, + struct device_attribute *devattr, char *buf) +{ + struct bt541_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + dev_info(&client->dev, "tsp cmd: status:%d\n", finfo->cmd_state); + + if (finfo->cmd_state == WAITING) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "WAITING"); + + else if (finfo->cmd_state == RUNNING) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "RUNNING"); + + else if (finfo->cmd_state == OK) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "OK"); + + else if (finfo->cmd_state == FAIL) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "FAIL"); + + else if (finfo->cmd_state == NOT_APPLICABLE) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "NOT_APPLICABLE"); + + return snprintf(buf, sizeof(finfo->cmd_buff), + "%s\n", finfo->cmd_buff); +} + +static ssize_t show_cmd_result(struct device *dev, struct device_attribute + *devattr, char *buf) +{ + struct bt541_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + dev_info(&client->dev, "tsp cmd: result: %s\n", finfo->cmd_result); + + finfo->cmd_state = WAITING; + + return snprintf(buf, sizeof(finfo->cmd_result), + "%s\n", finfo->cmd_result); +} + +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *touchscreen_attributes[] = { + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group touchscreen_attr_group = { + .attrs = touchscreen_attributes, +}; + +#ifdef SUPPORTED_TOUCH_KEY +static ssize_t show_touchkey_threshold(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct bt541_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct capa_info *cap = &(info->cap_info); + +#ifdef NOT_SUPPORTED_TOUCH_DUMMY_KEY + dev_info(&client->dev, "%s: key threshold = %d\n", __func__, + cap->key_threshold); + + return snprintf(buf, 41, "%d", cap->key_threshold); +#else + dev_info(&client->dev, "%s: key threshold = %d %d %d %d\n", __func__, + cap->dummy_threshold, cap->key_threshold, cap->key_threshold, cap->dummy_threshold); + + return snprintf(buf, 41, "%d %d %d %d", cap->dummy_threshold, + cap->key_threshold, cap->key_threshold, + cap->dummy_threshold); +#endif +} +#if 0 +static ssize_t enable_dummy_key(struct device *dev, + struct device_attribute *attr, char *buf, size_t count) +{ + static char enable = '0'; + struct bt541_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + + if (!strcmp(buf, "")) + count = sprintf(buf, "%c", enable); + else { + if ((buf[0] - '0' <= 1) && count == 2) + enable = *buf; + else { + dev_err(&client->dev, "%s: Invalid parameter\n", __func__); + + goto err_out; + } + } + + dev_info(&client->dev, "%s: Extra button event %c\n", __func__, enable); + + return count; + +err_out: + return sprintf(buf, "NG"); + + return 0; +} +#endif + +static ssize_t show_touchkey_sensitivity(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct bt541_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + u16 val = 0; + int ret; + int i; + +#ifdef NOT_SUPPORTED_TOUCH_DUMMY_KEY + if (!strcmp(attr->attr.name, "touchkey_recent")) + i = 0; + else if (!strcmp(attr->attr.name, "touchkey_back")) + i = 1; + else { + dev_err(&client->dev, "%s: Invalid attribute\n", __func__); + + goto err_out; + } + +#else + if (!strcmp(attr->attr.name, "touchkey_dummy_btn1")) + i = 0; + else if (!strcmp(attr->attr.name, "touchkey_recent")) + i = 1; + else if (!strcmp(attr->attr.name, "touchkey_back")) + i = 2; + else if (!strcmp(attr->attr.name, "touchkey_dummy_btn4")) + i = 3; + else if (!strcmp(attr->attr.name, "touchkey_dummy_btn5")) + i = 4; + else if (!strcmp(attr->attr.name, "touchkey_dummy_btn6")) + i = 5; + else { + dev_err(&client->dev, "%s: Invalid attribute\n", __func__); + + goto err_out; + } +#endif + ret = read_data(client, BT541_BTN_WIDTH + i, (u8 *)&val, 2); + if (ret < 0) { + dev_err(&client->dev, "%s: Failed to read %d's key sensitivity\n", + __func__, i); + + goto err_out; + } + + dev_info(&client->dev, "%s: %d's key sensitivity = %d\n", + __func__, i, val); + + return snprintf(buf, 6, "%d", val); + +err_out: + return sprintf(buf, "NG"); +} + +static ssize_t show_back_key_raw_data(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return 0; +} + +static ssize_t show_menu_key_raw_data(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return 0; +} +/* + static ssize_t show_back_key_idac_data(struct device *dev, + struct device_attribute *attr, char *buf) + { + return 0; + } + + static ssize_t show_menu_key_idac_data(struct device *dev, + struct device_attribute *attr, char *buf) + { + return 0; + } + */ + +static DEVICE_ATTR(touchkey_threshold, S_IRUGO, show_touchkey_threshold, NULL); +/*static DEVICE_ATTR(touch_sensitivity, S_IRUGO, back_key_state_show, NULL);*/ +//static DEVICE_ATTR(extra_button_event, S_IWUSR | S_IWGRP | S_IRUGO, NULL, enable_dummy_key); +static DEVICE_ATTR(touchkey_recent, S_IRUGO, show_touchkey_sensitivity, NULL); +static DEVICE_ATTR(touchkey_back, S_IRUGO, show_touchkey_sensitivity, NULL); +#ifndef NOT_SUPPORTED_TOUCH_DUMMY_KEY +static DEVICE_ATTR(touchkey_dummy_btn1, S_IRUGO, + show_touchkey_sensitivity, NULL); +static DEVICE_ATTR(touchkey_dummy_btn3, S_IRUGO, + show_touchkey_sensitivity, NULL); +static DEVICE_ATTR(touchkey_dummy_btn4, S_IRUGO, + show_touchkey_sensitivity, NULL); +static DEVICE_ATTR(touchkey_dummy_btn6, S_IRUGO, + show_touchkey_sensitivity, NULL); +#endif +/*static DEVICE_ATTR(autocal_stat, S_IRUGO, show_autocal_status, NULL);*/ +static DEVICE_ATTR(touchkey_raw_back, S_IRUGO, show_back_key_raw_data, NULL); +static DEVICE_ATTR(touchkey_raw_menu, S_IRUGO, show_menu_key_raw_data, NULL); +/*static DEVICE_ATTR(touchkey_idac_back, S_IRUGO, show_back_key_idac_data, NULL); + static DEVICE_ATTR(touchkey_idac_menu, S_IRUGO, show_menu_key_idac_data, NULL);*/ + +static struct attribute *touchkey_attributes[] = { + &dev_attr_touchkey_threshold.attr, + /*&dev_attr_touch_sensitivity.attr,*/ + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_recent.attr, + //&dev_attr_autocal_stat.attr, + //&dev_attr_extra_button_event.attr, + &dev_attr_touchkey_raw_menu.attr, + &dev_attr_touchkey_raw_back.attr, +#ifndef NOT_SUPPORTED_TOUCH_DUMMY_KEY + &dev_attr_touchkey_dummy_btn1.attr, + &dev_attr_touchkey_dummy_btn3.attr, + &dev_attr_touchkey_dummy_btn4.attr, + &dev_attr_touchkey_dummy_btn6.attr, +#endif + //&dev_attr_touchkey_idac_back.attr, + //&dev_attr_touchkey_idac_menu.attr, + NULL, +}; +static struct attribute_group touchkey_attr_group = { + .attrs = touchkey_attributes, +}; +#endif + +static int init_sec_factory(struct bt541_ts_info *info) +{ + struct device *factory_ts_dev; +#ifdef SUPPORTED_TOUCH_KEY + struct device *factory_tk_dev; +#endif + struct tsp_factory_info *factory_info; + struct tsp_raw_data *raw_data; + int ret; + int i; + + factory_info = kzalloc(sizeof(struct tsp_factory_info), GFP_KERNEL); + if (unlikely(!factory_info)) { + dev_err(&info->client->dev, "%s: Failed to allocate memory\n", + __func__); + ret = -ENOMEM; + + goto err_alloc1; + } + raw_data = kzalloc(sizeof(struct tsp_raw_data), GFP_KERNEL); + if (unlikely(!raw_data)) { + dev_err(&info->client->dev, "%s: Failed to allocate memory\n", + __func__); + ret = -ENOMEM; + + goto err_alloc2; + } + + INIT_LIST_HEAD(&factory_info->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &factory_info->cmd_list_head); + + factory_ts_dev = device_create(sec_class, NULL, 0, info, "tsp"); + if (unlikely(!factory_ts_dev)) { + dev_err(&info->client->dev, "Failed to create factory dev\n"); + ret = -ENODEV; + goto err_create_device; + } + +#ifdef SUPPORTED_TOUCH_KEY + factory_tk_dev = device_create(sec_class, NULL, 0, info, "sec_touchkey"); + if (IS_ERR(factory_tk_dev)) { + dev_err(&info->client->dev, "Failed to create factory dev\n"); + ret = -ENODEV; + goto err_create_device; + } +#endif + + ret = sysfs_create_group(&factory_ts_dev->kobj, &touchscreen_attr_group); + if (unlikely(ret)) { + dev_err(&info->client->dev, "Failed to create touchscreen sysfs group\n"); + goto err_create_sysfs; + } + +#ifdef SUPPORTED_TOUCH_KEY + ret = sysfs_create_group(&factory_tk_dev->kobj, &touchkey_attr_group); + if (unlikely(ret)) { + dev_err(&info->client->dev, "Failed to create touchkey sysfs group\n"); + goto err_create_sysfs; + } +#endif + + mutex_init(&factory_info->cmd_lock); + factory_info->cmd_is_running = false; + + info->factory_info = factory_info; + info->raw_data = raw_data; + + dnd_v_diff = assy_dnd_v_diff; + dnd_h_diff = assy_dnd_h_diff; + pdnd_max = assy_pdnd_max; + pdnd_min = assy_pdnd_min; + hfdnd_max = assy_hfdnd_max; + hfdnd_min = assy_hfdnd_min; + + return ret; + +err_create_sysfs: +err_create_device: + kfree(raw_data); +err_alloc2: + kfree(factory_info); +err_alloc1: + + return ret; +} +#endif + +static int ts_misc_fops_open(struct inode *inode, struct file *filp) +{ + return 0; +} + +static int ts_misc_fops_close(struct inode *inode, struct file *filp) +{ + return 0; +} + +static long ts_misc_fops_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg) +{ + void __user *argp = (void __user *)arg; + struct raw_ioctl raw_ioctl; + u8 *u8Data; + int ret = 0; + size_t sz = 0; + u16 version; + u16 mode; + + struct reg_ioctl reg_ioctl; + u16 val; + int nval = 0; + + if (misc_info == NULL) + { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + + switch (cmd) { + + case TOUCH_IOCTL_GET_DEBUGMSG_STATE: + ret = m_ts_debug_mode; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_SET_DEBUGMSG_STATE: + if (copy_from_user(&nval, argp, 4)) { + pr_info("[zinitix_touch] error : copy_from_user\n"); + return -1; + } + if (nval) + pr_info("[zinitix_touch] on debug mode (%d)\n", + nval); + else + pr_info("[zinitix_touch] off debug mode (%d)\n", + nval); + m_ts_debug_mode = nval; + break; + + case TOUCH_IOCTL_GET_CHIP_REVISION: + ret = misc_info->cap_info.ic_revision; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_FW_VERSION: + ret = misc_info->cap_info.fw_version; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_REG_DATA_VERSION: + ret = misc_info->cap_info.reg_data_version; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_VARIFY_UPGRADE_SIZE: + if (copy_from_user(&sz, argp, sizeof(size_t))) + return -1; + + printk(KERN_INFO "[zinitix_touch]: firmware size = %d\r\n", (int)sz); + if (misc_info->cap_info.ic_fw_size != sz) { + pr_info("[zinitix_touch]: firmware size error\r\n"); + return -1; + } + break; + + case TOUCH_IOCTL_VARIFY_UPGRADE_DATA: + if (copy_from_user(m_firmware_data, + argp, misc_info->cap_info.ic_fw_size)) + return -1; + + version = (u16) (m_firmware_data[52] | (m_firmware_data[53]<<8)); + + pr_info("[zinitix_touch]: firmware version = %x\r\n", version); + + if (copy_to_user(argp, &version, sizeof(version))) + return -1; + break; + + case TOUCH_IOCTL_START_UPGRADE: + return ts_upgrade_sequence((u8 *)m_firmware_data); + + case TOUCH_IOCTL_GET_X_RESOLUTION: + ret = misc_info->pdata->x_resolution; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_Y_RESOLUTION: + ret = misc_info->pdata->y_resolution; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_X_NODE_NUM: + ret = misc_info->cap_info.x_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_Y_NODE_NUM: + ret = misc_info->cap_info.y_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_TOTAL_NODE_NUM: + ret = misc_info->cap_info.total_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_HW_CALIBRAION: + ret = -1; + disable_irq(misc_info->irq); + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + pr_info("[zinitix_touch]: other process occupied.. (%d)\r\n", + misc_info->work_state); + up(&misc_info->work_lock); + return -1; + } + misc_info->work_state = HW_CALIBRAION; + mdelay(100); + + /* h/w calibration */ + if (ts_hw_calibration(misc_info) == true) + ret = 0; + + mode = misc_info->touch_mode; + if (write_reg(misc_info->client, + BT541_TOUCH_MODE, mode) != I2C_SUCCESS) { + pr_err("[zinitix_touch]: failed to set touch mode %d.\n", + mode); + goto fail_hw_cal; + } + + if (write_cmd(misc_info->client, + BT541_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hw_cal; + + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return ret; +fail_hw_cal: + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return -1; + + case TOUCH_IOCTL_SET_RAW_DATA_MODE: + if (misc_info == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + if (copy_from_user(&nval, argp, 4)) { + pr_info("[zinitix_touch] error : copy_from_user\r\n"); + misc_info->work_state = NOTHING; + return -1; + } + ts_set_touchmode((u16)nval); + + return 0; + + case TOUCH_IOCTL_GET_REG: + if (misc_info == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + pr_info("[zinitix_touch]:other process occupied.. (%d)\n", + misc_info->work_state); + up(&misc_info->work_lock); + return -1; + } + + misc_info->work_state = SET_MODE; + + if (copy_from_user(®_ioctl, + argp, sizeof(struct reg_ioctl))) { + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + pr_info("[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (read_data(misc_info->client, + (u16)reg_ioctl.addr, (u8 *)&val, 2) < 0) + ret = -1; + + nval = (int)val; + + if (copy_to_user((void *)(unsigned long)reg_ioctl.val, (u8 *)&nval, 4)) { + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + pr_info("[zinitix_touch] error : copy_to_user\n"); + return -1; + } + + zinitix_debug_msg("read : reg addr = 0x%x, val = 0x%x\n", + reg_ioctl.addr, nval); + + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return ret; + + case TOUCH_IOCTL_SET_REG: + + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + pr_info("[zinitix_touch]: other process occupied.. (%d)\n", + misc_info->work_state); + up(&misc_info->work_lock); + return -1; + } + + misc_info->work_state = SET_MODE; + if (copy_from_user(®_ioctl, + argp, sizeof(struct reg_ioctl))) { + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + pr_info("[zinitix_touch] error : copy_from_user(1)\n"); + return -1; + } + + if (copy_from_user(&val, (void *)(unsigned long)reg_ioctl.val, 4)) { + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + pr_info("[zinitix_touch] error : copy_from_user(2)\n"); + return -1; + } + + if (write_reg(misc_info->client, + (u16)reg_ioctl.addr, val) != I2C_SUCCESS) + ret = -1; + + zinitix_debug_msg("write : reg addr = 0x%x, val = 0x%x\r\n", + reg_ioctl.addr, val); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return ret; + + case TOUCH_IOCTL_DONOT_TOUCH_EVENT: + + if (misc_info == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + pr_info("[zinitix_touch]: other process occupied.. (%d)\r\n", + misc_info->work_state); + up(&misc_info->work_lock); + return -1; + } + + misc_info->work_state = SET_MODE; + if (write_reg(misc_info->client, + BT541_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + ret = -1; + zinitix_debug_msg("write : reg addr = 0x%x, val = 0x0\r\n", + BT541_INT_ENABLE_FLAG); + + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return ret; + + case TOUCH_IOCTL_SEND_SAVE_STATUS: + if (misc_info == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + pr_info("[zinitix_touch]: other process occupied.." \ + "(%d)\r\n", misc_info->work_state); + up(&misc_info->work_lock); + return -1; + } + misc_info->work_state = SET_MODE; + ret = 0; + write_reg(misc_info->client, 0xc003, 0x0001); + write_reg(misc_info->client, 0xc104, 0x0001); + if (write_cmd(misc_info->client, + BT541_SAVE_STATUS_CMD) != I2C_SUCCESS) + ret = -1; + + mdelay(1000); /* for fusing eeprom */ + write_reg(misc_info->client, 0xc003, 0x0000); + write_reg(misc_info->client, 0xc104, 0x0000); + + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return ret; + + case TOUCH_IOCTL_GET_RAW_DATA: + if (misc_info == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + + if (misc_info->touch_mode == TOUCH_POINT_MODE) + return -1; + + down(&misc_info->raw_data_lock); + if (misc_info->update == 0) { + up(&misc_info->raw_data_lock); + return -2; + } + + if (copy_from_user(&raw_ioctl, + argp, sizeof(struct raw_ioctl))) { + up(&misc_info->raw_data_lock); + pr_info("[zinitix_touch] error : copy_from_user\r\n"); + return -1; + } + + misc_info->update = 0; + + u8Data = (u8 *)&misc_info->cur_data[0]; + if (raw_ioctl.sz > MAX_TRAW_DATA_SZ*2) + raw_ioctl.sz = MAX_TRAW_DATA_SZ*2; + if (copy_to_user((void *)(unsigned long)raw_ioctl.buf, (u8 *)u8Data, + raw_ioctl.sz)) { + up(&misc_info->raw_data_lock); + return -1; + } + + up(&misc_info->raw_data_lock); + return 0; + + default: + break; + } + return 0; +} + +#ifdef CONFIG_OF +static const struct of_device_id tsp_dt_ids[] = { + { .compatible = "Zinitix,bt541_ts", }, + {}, +}; +MODULE_DEVICE_TABLE(of, tsp_dt_ids); +#endif +static int bt541_ts_probe_dt(struct device_node *np, + struct device *dev, + struct bt541_ts_platform_data *pdata) +{ + int ret; + + if (!np) + return -EINVAL; + + pdata->gpio_int = of_get_named_gpio(np,"gpios", 0); + if (pdata->gpio_int < 0) { + pr_err("%s: of_get_named_gpio failed: %d\n", __func__, + pdata->gpio_int); + return -EINVAL; + } + ret = of_property_read_u32(np, "bt541,x_resolution", + &pdata->x_resolution); + if (ret < 0) + return ret; + ret = of_property_read_u32(np, "bt541,y_resolution", + &pdata->y_resolution); + if (ret < 0) + return ret; + ret = of_property_read_u32(np, "bt541,orientation", + &pdata->orientation); + if (ret < 0) + return ret; + + ret = of_property_read_u32(np, "bt541,page_size", &pdata->page_size); + if (ret < 0) + return ret; + + ret = of_property_read_u32(np, "tsp_vdd_supply_type", + &pdata->tsp_supply_type); + if (ret < 0) { + pr_err("%s: failed to read property tsp_vdd_supply_type\n", + __func__); + return ret; + } + + if (pdata->tsp_supply_type == TSP_LDO_SUPPLY) { + pdata->gpio_ldo_en = of_get_named_gpio(np, "gpio_ldo_en", 0); + if (pdata->gpio_ldo_en < 0) { + pr_err("%s: of_get_named_gpio failed: %d\n", __func__, + pdata->gpio_ldo_en); + return -EINVAL; + } + } + pdata->tsp_power = bt541_power; + return 0; + +} + +static int bt541_ts_probe(struct i2c_client *client, + const struct i2c_device_id *i2c_id) +{ + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + struct bt541_ts_platform_data *pdata = client->dev.platform_data; + struct bt541_ts_info *info; + struct input_dev *input_dev; + int ret = 0; + int i; + + struct device_node *np = client->dev.of_node; + + if (IS_ENABLED(CONFIG_OF)) { + if (!pdata) { + pdata = devm_kzalloc(&client->dev, + sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + } + ret = bt541_ts_probe_dt(np, &client->dev, pdata); + if (ret) + goto err_no_platform_data; + + } else if (!pdata) { + dev_err(&client->dev, "Not exist platform data\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "Not compatible i2c function\n"); + ret = -EIO; + goto err_no_platform_data; + } + + info = kzalloc(sizeof(struct bt541_ts_info), GFP_KERNEL); + if (!info) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_no_platform_data; + } + ret = gpio_request(pdata->gpio_int, "bt541_int"); + if (ret < 0) { + pr_err("%s: Request GPIO failed, gpio %d (%d)\n", BT541_TS_DEVICE, + pdata->gpio_int, ret); + goto err_gpio_alloc; + } + gpio_direction_input(pdata->gpio_int); + i2c_set_clientdata(client, info); + info->client = client; + info->pdata = pdata; + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&client->dev, "Failed to allocate input device\n"); + ret = -EPERM; + goto err_alloc; + } + + info->input_dev = input_dev; + info->work_state = PROBE; + + /* power on */ + if (bt541_power_control(info, POWER_ON_SEQUENCE) == false) { + ret = -EPERM; + goto err_power_sequence; + } + + /* To Do */ + /* FW version read from tsp */ + + memset(&info->reported_touch_info, + 0x0, sizeof(struct point_info)); + + /* init touch mode */ + info->touch_mode = TOUCH_POINT_MODE; + misc_info = info; + + if (init_touch(info, true) == false) { + ret = -EPERM; + goto err_input_unregister_device; + } + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + info->button[i] = ICON_BUTTON_UNCHANGE; + + snprintf(info->phys, sizeof(info->phys), + "%s/input0", dev_name(&client->dev)); + input_dev->name = "sec_touchscreen"; + input_dev->id.bustype = BUS_I2C; + /* input_dev->id.vendor = 0x0001; */ + input_dev->phys = info->phys; + /* input_dev->id.product = 0x0002; */ + /* input_dev->id.version = 0x0100; */ + input_dev->dev.parent = &client->dev; + + set_bit(EV_SYN, info->input_dev->evbit); + set_bit(EV_KEY, info->input_dev->evbit); + set_bit(EV_ABS, info->input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, info->input_dev->propbit); + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + set_bit(BUTTON_MAPPING_KEY[i], info->input_dev->keybit); + + if (pdata->orientation & TOUCH_XY_SWAP) { + input_set_abs_params(info->input_dev, ABS_MT_POSITION_Y, + info->cap_info.MinX, + info->cap_info.MaxX + ABS_PT_OFFSET, + 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_POSITION_X, + info->cap_info.MinY, + info->cap_info.MaxY + ABS_PT_OFFSET, + 0, 0); + } else { + input_set_abs_params(info->input_dev, ABS_MT_POSITION_X, + info->cap_info.MinX, + info->cap_info.MaxX + ABS_PT_OFFSET, + 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_POSITION_Y, + info->cap_info.MinY, + info->cap_info.MaxY + ABS_PT_OFFSET, + 0, 0); + } + + input_set_abs_params(info->input_dev, ABS_MT_TOUCH_MAJOR, + 0, 255, 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_WIDTH_MAJOR, + 0, 255, 0, 0); + +#if (TOUCH_POINT_MODE == 2) + input_set_abs_params(info->input_dev, ABS_MT_TOUCH_MINOR, + 0, 255, 0, 0); + /* input_set_abs_params(info->input_dev, ABS_MT_WIDTH_MINOR, + 0, 255, 0, 0); */ + /* input_set_abs_params(info->input_dev, ABS_MT_ORIENTATION, + -128, 127, 0, 0); */ + /* input_set_abs_params(info->input_dev, ABS_MT_ANGLE, + -90, 90, 0, 0);*/ + input_set_abs_params(info->input_dev, ABS_MT_PALM, + 0, 1, 0, 0); +#endif + + set_bit(MT_TOOL_FINGER, info->input_dev->keybit); + input_mt_init_slots(info->input_dev, info->cap_info.multi_fingers,0); + + zinitix_debug_msg("register %s input device \r\n", + info->input_dev->name); + input_set_drvdata(info->input_dev, info); + ret = input_register_device(info->input_dev); + if (ret) { + printk(KERN_ERR "unable to register %s input device\r\n", + info->input_dev->name); + goto err_input_register_device; + } + + /* configure irq */ + info->irq = gpio_to_irq(pdata->gpio_int); + if (info->irq < 0) + printk(KERN_INFO "error. gpio_to_irq(..) function is not \ + supported? you should define GPIO_TOUCH_IRQ.\r\n"); + + zinitix_debug_msg("request irq (irq = %d, pin = %d) \r\n", + info->irq, pdata->gpio_int); + + info->work_state = NOTHING; +#if TOUCH_BOOSTER + info->finger_cnt = 0; +#endif + sema_init(&info->work_lock, 1); + +#if ESD_TIMER_INTERVAL + spin_lock_init(&info->lock); + INIT_WORK(&info->tmr_work, ts_tmr_work); + esd_tmr_workqueue = + create_singlethread_workqueue("esd_tmr_workqueue"); + + if (!esd_tmr_workqueue) { + dev_err(&client->dev, "Failed to create esd tmr work queue\n"); + ret = -EPERM; + + goto err_esd_input_unregister_device; + } + + esd_timer_init(info); + esd_timer_start(CHECK_ESD_TIMER, info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "Started esd timer\n"); +#endif +#endif + ret = request_threaded_irq(info->irq, NULL, bt541_touch_work, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT , BT541_TS_DEVICE, info); + + if (ret) { + printk(KERN_ERR "unable to register irq.(%s)\r\n", + info->input_dev->name); + goto err_request_irq; + } + dev_info(&client->dev, "zinitix touch probe.\r\n"); + sprd_i2c_ctl_chg_clk(1, 400000); // up h/w i2c 1 400k +#ifdef CONFIG_HAS_EARLYSUSPEND + info->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + info->early_suspend.suspend = bt541_ts_early_suspend; + info->early_suspend.resume = bt541_ts_late_resume; + register_early_suspend(&info->early_suspend); +#endif + +#if defined(CONFIG_PM_RUNTIME) && !defined(CONFIG_HAS_EARLYSUSPEND) + pm_runtime_enable(&client->dev); +#endif + + sema_init(&info->raw_data_lock, 1); + + ret = misc_register(&touch_misc_device); + if (ret) { + dev_err(&client->dev, "Failed to register touch misc device\n"); + goto err_misc_register; + } + +#ifdef SEC_FACTORY_TEST + ret = init_sec_factory(info); + if (ret) { + dev_err(&client->dev, "Failed to init sec factory device\n"); + + goto err_kthread_create_failed; + } +#endif + + return 0; + +#ifdef SEC_FACTORY_TEST +err_kthread_create_failed: + kfree(info->factory_info); + kfree(info->raw_data); +#endif +err_misc_register: + free_irq(info->irq, info); +err_request_irq: +#if ESD_TIMER_INTERVAL +err_esd_input_unregister_device: +#endif +err_input_unregister_device: + input_unregister_device(info->input_dev); +err_input_register_device: + tsp_charger_status_cb = NULL; +err_power_sequence: + input_free_device(info->input_dev); +err_alloc: + kfree(info); +err_gpio_alloc: + gpio_free(pdata->gpio_int); +err_no_platform_data: + if (IS_ENABLED(CONFIG_OF)) + devm_kfree(&client->dev, (void *)pdata); + + dev_info(&client->dev, "Failed to probe\n"); + return ret; +} + +static int bt541_ts_remove(struct i2c_client *client) +{ + struct bt541_ts_info *info = i2c_get_clientdata(client); + struct bt541_ts_platform_data *pdata = info->pdata; + + disable_irq(info->irq); + down(&info->work_lock); + + info->work_state = REMOVE; + +#ifdef SEC_FACTORY_TEST + kfree(info->factory_info); + kfree(info->raw_data); +#endif +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); + write_reg(info->client, BT541_PERIODICAL_INTERRUPT_INTERVAL, 0); + esd_timer_stop(info); +#if defined(TSP_VERBOSE_DEBUG) + dev_info(&client->dev, "Stopped esd timer\n"); +#endif + destroy_workqueue(esd_tmr_workqueue); +#endif + + if (info->irq) + free_irq(info->irq, info); + + misc_deregister(&touch_misc_device); + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&info->early_suspend); +#endif + + if (gpio_is_valid(pdata->gpio_int) != 0) + gpio_free(pdata->gpio_int); + + tsp_charger_status_cb = NULL; + + input_unregister_device(info->input_dev); + input_free_device(info->input_dev); + up(&info->work_lock); + kfree(info); + + return 0; +} + +void bt541_ts_shutdown(struct i2c_client *client) +{ + struct bt541_ts_info *info = i2c_get_clientdata(client); + + dev_info(&client->dev, "%s++\n",__func__); + disable_irq(info->irq); + down(&info->work_lock); +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); + esd_timer_stop(info); +#endif + up(&info->work_lock); + bt541_power_control(info, POWER_OFF); + dev_info(&client->dev, "%s--\n",__func__); +} + + +static struct i2c_device_id bt541_idtable[] = { + {BT541_TS_DEVICE, 0}, + { } +}; + +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) +static const struct dev_pm_ops bt541_ts_pm_ops ={ +#if defined(CONFIG_PM_RUNTIME) + SET_RUNTIME_PM_OPS(bt541_ts_suspend, bt541_ts_resume,NULL) +#else + SET_SYSTEM_SLEEP_PM_OPS(bt541_ts_suspend, bt541_ts_resume) +#endif +}; +#endif + +static struct i2c_driver bt541_ts_driver = { + .probe = bt541_ts_probe, + .remove = bt541_ts_remove, + .shutdown = bt541_ts_shutdown, + .id_table = bt541_idtable, + .driver = { + .owner = THIS_MODULE, + .name = BT541_TS_DEVICE, + .of_match_table = tsp_dt_ids, +#if defined(CONFIG_PM) && !defined(CONFIG_HAS_EARLYSUSPEND) + .pm = &bt541_ts_pm_ops, +#endif + }, +}; + +extern unsigned int lpcharge; + +static int __init bt541_ts_init(void) +{ + pr_info("[TSP]: %s\n", __func__); + + if (!lpcharge) + return i2c_add_driver(&bt541_ts_driver); + else + return 0; +} + +static void __exit bt541_ts_exit(void) +{ + i2c_del_driver(&bt541_ts_driver); +} + +module_init(bt541_ts_init); +module_exit(bt541_ts_exit); + +MODULE_DESCRIPTION("touch-screen device driver using i2c interface"); +MODULE_AUTHOR(""); +MODULE_LICENSE("GPL"); + diff --git a/drivers/input/touchscreen/zinitix_touch.c b/drivers/input/touchscreen/zinitix_touch.c new file mode 100644 index 00000000..d4ae0dee --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch.c @@ -0,0 +1,3858 @@ +/* + * + * Zinitix touch driver + * + * Copyright (C) 2009 Zinitix, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/* +Version 2.0.0 : using reg data file (2010/11/05) +Version 2.0.1 : syntxt bug fix (2010/11/09) +Version 2.0.2 : Save status cmd delay bug (2010/11/10) +Version 2.0.3 : modify delay 10ms -> 50ms for clear hw calibration bit + : modify ZINITIX_TOTAL_NUMBER_OF_Y register (read only -> read/write ) + : modify SUPPORTED FINGER NUM register (read only -> read/write ) +Version 2.0.4 : [20101116] + Modify Firmware Upgrade routine. +Version 2.0.5 : [20101118] + add esd timer function & some bug fix. + you can select request_threaded_irq or + request_irq, setting USE_THREADED_IRQ. +Version 2.0.6 : [20101123] + add ABS_MT_WIDTH_MAJOR Report +Version 2.0.7 : [20101201] + Modify zinitix_early_suspend() / zinitix_late_resume() routine. +Version 2.0.8 : [20101216] + add using spin_lock option +Version 2.0.9 : [20101216] + Test Version +Version 2.0.10 : [20101217] + add USE_THREAD_METHOD option. + if USE_THREAD_METHOD = 0, you use workqueue +Version 2.0.11 : [20101229] + add USE_UPDATE_SYSFS option for update firmware. + && TOUCH_MODE == 1 mode. +Version 2.0.13 : [20110125] + modify esd timer routine +Version 2.0.14 : [20110217] + esd timer bug fix. (kernel panic) + sysfs bug fix. +Version 2.0.15 : [20110315] + add power off delay ,250ms +Version 2.0.16 : [20110316] + add upgrade method using isp +Version 2.0.17 : [20110406] + change naming rule : sain -> zinitix + (add) pending interrupt skip + add isp upgrade mode + remove warning message when complile +Version 3.0.2 : [20110711] + support bt4x3 series +Version 3.0.3 : [20110720] + add raw data monitoring func. + add the h/w calibration skip option. +Version 3.0.4 : [20110728] + fix using semaphore bug. +Version 3.0.5 : [20110801] + fix some bugs. +Version 3.0.6 : [20110802] + fix Bt4x3 isp upgrade bug. + add USE_TS_MISC_DEVICE option for showing info & upgrade + remove USE_UPDATE_SYSFS option +Version 3.0.7 : [201108016] + merge USE_TS_MISC_DEVICE option and USE_TEST_RAW_TH_DATA_MODE + fix work proceedure bug. +Version 3.0.8 / Version 3.0.9 : [201108017] + add ioctl func. +Version 3.0.10 : [201108030] + support REAL_SUPPORTED_FINGER_NUM +Version 3.0.11 : [201109014] + support zinitix apps. +Version 3.0.12 : [201109015] + add disable touch event func. +Version 3.0.13 : [201109015] + add USING_CHIP_SETTING option : interrupt mask/button num/finger num +Version 3.0.14 : [201109020] + support apps. above kernel version 2.6.35 +Version 3.0.15 : [201101004] + modify timing in firmware upgrade retry when failt to upgrade firmware +Version 3.0.16 : [20111024] + remove thread method. + add resume/suspend function + check code using checkpatch.pl +Version 3.0.19 : [20111124] + modify isp timing : 2ms -> 1ms +Version 3.0.20 : [20120201] + support icecream sandwich + remove bt4x2 option +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//#include + +#include "zinitix_touch.h" +#include "zinitix_touch_bt4x3_firmware.h" +#include "zinitix_touch_bt4x3_reg_data.h" + +#define PHONE_FW_VER 0x05 + +#define TSP_INT 30 +#define TSP_SDA 27 +#define TSP_SCL 26 + +#define TOUCH_ON 1 +#define TOUCH_OFF 0 + +static struct regulator *touch_regulator_2_9=NULL; +static struct regulator *touch_regulator_3_3=NULL; + +#define ZINITIX_DEBUG 0 + +static int m_ts_debug_mode = ZINITIX_DEBUG; + +static int firmware_ret_val = -1; + +#define SYSTEM_MAX_X_RESOLUTION 320 +#define SYSTEM_MAX_Y_RESOLUTION 480 +#define SYSTEM_VALUE 0xFFFB + +/* interrupt pin number*/ +#define GPIO_TOUCH_PIN_NUM 60 +/* interrupt pin IRQ number */ +#define GPIO_TOUCH_IRQ 0 + +static struct workqueue_struct *zinitix_workqueue; + +static struct workqueue_struct *zinitix_tmr_workqueue; + +#define zinitix_debug_msg(fmt, args...) \ + if (m_ts_debug_mode) \ + printk(KERN_INFO "[%-18s:%5d]" fmt, \ + __func__, __LINE__, ## args); + +struct _ts_zinitix_coord { + u16 x; + u16 y; + u8 width; + u8 sub_status; +}; + +struct _ts_zinitix_point_info { + u16 status; + u8 finger_cnt; + u8 time_stamp; + struct _ts_zinitix_coord coord[MAX_SUPPORTED_FINGER_NUM]; +}; + +#define TOUCH_V_FLIP 0x01 +#define TOUCH_H_FLIP 0x02 +#define TOUCH_XY_SWAP 0x04 + +struct _ts_capa_info { + u16 chip_revision; + u16 chip_firmware_version; + u16 chip_reg_data_version; + u16 x_resolution; + u16 y_resolution; + u32 chip_fw_size; + u32 MaxX; + u32 MaxY; + u32 MinX; + u32 MinY; + u32 Orientation; + u8 gesture_support; + u16 multi_fingers; + u16 button_num; + u16 chip_int_mask; +#if USE_TEST_RAW_TH_DATA_MODE + u16 x_node_num; + u16 y_node_num; + u16 total_node_num; + u16 max_y_node; + u16 total_cal_n; +#endif +}; + +enum _ts_work_proceedure { + TS_NO_WORK = 0, + TS_NORMAL_WORK, + TS_ESD_TIMER_WORK, + TS_IN_EALRY_SUSPEND, + TS_IN_SUSPEND, + TS_IN_RESUME, + TS_IN_LATE_RESUME, + TS_IN_UPGRADE, + TS_REMOVE_WORK, + TS_SET_MODE, + TS_HW_CALIBRAION, +}; + +struct zinitix_touch_dev { + struct input_dev *input_dev; + struct task_struct *task; + wait_queue_head_t wait; + struct work_struct work; + struct work_struct tmr_work; + struct i2c_client *client; + struct semaphore update_lock; + u32 i2c_dev_addr; + struct _ts_capa_info cap_info; + char phys[32]; + + bool is_valid_event; + struct _ts_zinitix_point_info touch_info; + struct _ts_zinitix_point_info reported_touch_info; + u16 icon_event_reg; + u16 event_type; + u32 int_gpio_num; + u32 irq; + u8 button[MAX_SUPPORTED_BUTTON_NUM]; + u8 work_proceedure; + struct semaphore work_proceedure_lock; + u8 use_esd_timer; + + bool in_esd_timer; + struct timer_list esd_timeout_tmr; + struct timer_list *p_esd_timeout_tmr; + +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + +#if USE_TEST_RAW_TH_DATA_MODE + struct semaphore raw_data_lock; + u16 raw_mode_flag; + s16 ref_data[MAX_TEST_RAW_DATA]; + s16 cur_data[MAX_RAW_DATA]; + u8 update; +#endif +}; + + +#define ZINITIX_DRIVER_NAME "Zinitix_tsp" + +#define ZINITIX_ISP_NAME "zinitix_isp" +static struct i2c_client *m_isp_client; + +static char IsfwUpdate[20]={0}; + +#define FW_DOWNLOADING "Downloading" +#define FW_DOWNLOAD_COMPLETE "Complete" +#define FW_DOWNLOAD_FAIL "FAIL" +#define FWUP_NOW -1 + +static struct i2c_device_id zinitix_idtable[] = { + {ZINITIX_ISP_NAME, 0}, + {ZINITIX_DRIVER_NAME, 0}, + { } +}; + +static int tsp_testmode = 0; + +static int tsp_check = 1; + +struct zinitix_touch_dev* g_touch_dev; + +struct regulator *tsp_regulator_18 = NULL; +struct regulator *tsp_regulator_33 = NULL; + +/* sys fs */ +struct class *touch_class; +EXPORT_SYMBOL(touch_class); +struct device *firmware_dev; +EXPORT_SYMBOL(firmware_dev); +static ssize_t firmware_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t firmware_sw_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t firmware_ret_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t zinitix_enter_testmode(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t zinitix_enter_normalmode(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t rawdata_pass_fail_zinitix(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t phone_firmware_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t part_firmware_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t threshold_firmware_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t config_firmware_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t read_node(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t read_touchkey(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t scantime_zinitix(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t firmware_update_status(struct device *dev, struct device_attribute *attr, char *buf); + +static DEVICE_ATTR(raw_enable, 0444, zinitix_enter_testmode, NULL) ; +static DEVICE_ATTR(raw_disable, 0444, zinitix_enter_normalmode, NULL) ; +static DEVICE_ATTR(raw_value, 0444, rawdata_pass_fail_zinitix, NULL) ; +static DEVICE_ATTR(firmware , S_IRUGO, firmware_show, NULL); +static DEVICE_ATTR(firmware_ver , 0444, firmware_show, NULL); +static DEVICE_ATTR(firmware_ret , S_IRUGO, firmware_ret_show, NULL); +static DEVICE_ATTR(phone_fw_ver,0444, phone_firmware_show, NULL); +static DEVICE_ATTR(part_fw_ver, 0444, part_firmware_show, NULL); +static DEVICE_ATTR(threshold_fw_ver, 0444, threshold_firmware_show, NULL); +static DEVICE_ATTR(config_fw_ver, 0444, config_firmware_show, NULL); +static DEVICE_ATTR(node_read, 0444, read_node, NULL) ; +static DEVICE_ATTR(touchkey_read, 0444, read_touchkey, NULL) ; +static DEVICE_ATTR(ncount_read, 0444, scantime_zinitix, NULL) ; +static DEVICE_ATTR(fw_upstatus, 0444, firmware_update_status, NULL); +/* sys fs */ + +/*<= you must set key button mapping*/ +u32 BUTTON_MAPPING_KEY[MAX_SUPPORTED_BUTTON_NUM] = {KEY_MENU, KEY_BACK}; + + +void touch_delay(int time) +{ + mdelay(time); +} + +/* define i2c sub functions*/ +inline s32 ts_read_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + /* select register*/ + ret = i2c_master_send(client , (u8 *)® , 2); + zinitix_debug_msg("%s, %d, ret : %d\n", __func__, __LINE__, ret ); + if (ret < 0) + return ret; + + /* for setup tx transaction. */ + udelay(DELAY_FOR_TRANSCATION); + ret = i2c_master_recv(client , values , length); + zinitix_debug_msg("%s, %d, ret : %d, value, %d\n", __func__, __LINE__, ret ); + if (ret < 0) + return ret; + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +inline s32 ts_write_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + u8 pkt[4]; + pkt[0] = (reg)&0xff; + pkt[1] = (reg >> 8)&0xff; + pkt[2] = values[0]; + pkt[3] = values[1]; + ret = i2c_master_send(client , pkt , length+2); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +inline s32 ts_write_reg(struct i2c_client *client, u16 reg, u16 value) +{ + if (ts_write_data(client, reg, (u8 *)&value, 2) < 0) + return I2C_FAIL; + return I2C_SUCCESS; +} + +inline s32 ts_write_cmd(struct i2c_client *client, u16 reg) +{ + s32 ret; + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) + return I2C_FAIL; + udelay(DELAY_FOR_POST_TRANSCATION); + return I2C_SUCCESS; +} + +inline s32 ts_read_raw_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + /* select register */ + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) + return ret; + /* for setup tx transaction. */ + udelay(200); + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + + + +inline s32 ts_read_firmware_data(struct i2c_client *client, + char *addr, u8 *values, u16 length) +{ + s32 ret; + if (addr != NULL) { + /* select register*/ + ret = i2c_master_send(client , addr , 2); + if (ret < 0) + return ret; + /* for setup tx transaction. */ + touch_delay(1); + } + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +inline s32 ts_write_firmware_data(struct i2c_client *client, + u8 *values, u16 length) +{ + s32 ret; + ret = i2c_master_send(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static int zinitix_touch_probe(struct i2c_client *client, + const struct i2c_device_id *i2c_id); +static int zinitix_touch_remove(struct i2c_client *client); +static bool ts_init_touch(struct zinitix_touch_dev *touch_dev); +static void zinitix_clear_report_data(struct zinitix_touch_dev *touch_dev); + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zinitix_early_suspend(struct early_suspend *h); +static void zinitix_late_resume(struct early_suspend *h); +#endif + + +static void ts_esd_timer_start(u16 sec, struct zinitix_touch_dev *touch_dev); +static void ts_esd_timer_stop(struct zinitix_touch_dev *touch_dev); +static void ts_esd_timer_init(struct zinitix_touch_dev *touch_dev); +static void ts_esd_timeout_handler(unsigned long data); + + +#if USE_TEST_RAW_TH_DATA_MODE +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) +static int ts_misc_fops_ioctl(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +#else +static long ts_misc_fops_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg); +#endif +static int ts_misc_fops_open(struct inode *inode, struct file *filp); +static int ts_misc_fops_close(struct inode *inode, struct file *filp); + +static const struct file_operations ts_misc_fops = { + .owner = THIS_MODULE, + .open = ts_misc_fops_open, + .release = ts_misc_fops_close, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) + .ioctl = ts_misc_fops_ioctl, +#else + .unlocked_ioctl = ts_misc_fops_ioctl, +#endif +}; + +static struct miscdevice touch_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "zinitix_touch_misc", + .fops = &ts_misc_fops, +}; + +#define TOUCH_IOCTL_BASE 0xbc +#define TOUCH_IOCTL_GET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 0, int) +#define TOUCH_IOCTL_SET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 1, int) +#define TOUCH_IOCTL_GET_CHIP_REVISION _IOW(TOUCH_IOCTL_BASE, 2, int) +#define TOUCH_IOCTL_GET_FW_VERSION _IOW(TOUCH_IOCTL_BASE, 3, int) +#define TOUCH_IOCTL_GET_REG_DATA_VERSION _IOW(TOUCH_IOCTL_BASE, 4, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_SIZE _IOW(TOUCH_IOCTL_BASE, 5, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_DATA _IOW(TOUCH_IOCTL_BASE, 6, int) +#define TOUCH_IOCTL_START_UPGRADE _IOW(TOUCH_IOCTL_BASE, 7, int) +#define TOUCH_IOCTL_GET_X_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 8, int) +#define TOUCH_IOCTL_GET_Y_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 9, int) +#define TOUCH_IOCTL_GET_TOTAL_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 10, int) +#define TOUCH_IOCTL_SET_RAW_DATA_MODE _IOW(TOUCH_IOCTL_BASE, 11, int) +#define TOUCH_IOCTL_GET_RAW_DATA _IOW(TOUCH_IOCTL_BASE, 12, int) +#define TOUCH_IOCTL_GET_X_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 13, int) +#define TOUCH_IOCTL_GET_Y_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 14, int) +#define TOUCH_IOCTL_HW_CALIBRAION _IOW(TOUCH_IOCTL_BASE, 15, int) +#define TOUCH_IOCTL_GET_REG _IOW(TOUCH_IOCTL_BASE, 16, int) +#define TOUCH_IOCTL_SET_REG _IOW(TOUCH_IOCTL_BASE, 17, int) +#define TOUCH_IOCTL_SEND_SAVE_STATUS _IOW(TOUCH_IOCTL_BASE, 18, int) +#define TOUCH_IOCTL_DONOT_TOUCH_EVENT _IOW(TOUCH_IOCTL_BASE, 19, int) + + +struct zinitix_touch_dev *misc_touch_dev; + +#endif /*USE_TEST_RAW_TH_DATA_MODE */ + + + +/* id -> include/linux/i2c-id.h */ +static struct i2c_driver zinitix_touch_driver = { + .probe = zinitix_touch_probe, + .remove = zinitix_touch_remove, +#ifndef CONFIG_HAS_EARLYSUSPEND + .suspend = zinitix_early_suspend, + .resume = zinitix_late_resume, +#endif + .id_table = zinitix_idtable, + .driver = { + .name = ZINITIX_DRIVER_NAME, + }, +}; + +#if USE_TEST_RAW_TH_DATA_MODE +static bool ts_get_raw_data(struct zinitix_touch_dev *touch_dev) +{ + u32 total_node = touch_dev->cap_info.total_node_num; + u32 sz; + u16 udata; + down(&touch_dev->raw_data_lock); + if (touch_dev->raw_mode_flag == TOUCH_TEST_RAW_MODE) { + sz = (total_node*2 + MAX_TEST_POINT_INFO*2); + + + if (ts_read_raw_data(touch_dev->client, + ZINITIX_RAWDATA_REG, + (char *)touch_dev->cur_data, sz) < 0) { + printk(KERN_INFO "[zinitix_touch] error : read zinitix tc raw data\n"); + up(&touch_dev->raw_data_lock); + return false; + } + + /* no point, so update ref_data*/ + udata = touch_dev->cur_data[total_node]; + + if (!zinitix_bit_test(udata, BIT_ICON_EVENT) + && !zinitix_bit_test(udata, BIT_PT_EXIST)) + memcpy((u8 *)touch_dev->ref_data, + (u8 *)touch_dev->cur_data, total_node*2); + + touch_dev->update = 1; + memcpy((u8 *)(&touch_dev->touch_info), + (u8 *)&touch_dev->cur_data[total_node], + sizeof(struct _ts_zinitix_point_info)); + up(&touch_dev->raw_data_lock); + return true; + } else if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { + zinitix_debug_msg("read raw data\r\n"); + sz = total_node*2 + sizeof(struct _ts_zinitix_point_info); + + + if (touch_dev->raw_mode_flag == TOUCH_ZINITIX_CAL_N_MODE) { + int total_cal_n = touch_dev->cap_info.total_cal_n; + if (total_cal_n == 0) + total_cal_n = 160; + + sz = + (total_cal_n*2 + sizeof(struct _ts_zinitix_point_info)); + + if (ts_read_raw_data(touch_dev->client, + ZINITIX_RAWDATA_REG, + (char *)touch_dev->cur_data, sz) < 0) { + printk(KERN_INFO "[zinitix_touch] error : read zinitix tc raw data\n"); + up(&touch_dev->raw_data_lock); + return false; + } + misc_touch_dev->update = 1; + memcpy((u8 *)(&touch_dev->touch_info), + (u8 *)&touch_dev->cur_data[total_cal_n], + sizeof(struct _ts_zinitix_point_info)); + up(&touch_dev->raw_data_lock); + return true; + } + + if (ts_read_raw_data(touch_dev->client, + ZINITIX_RAWDATA_REG, + (char *)touch_dev->cur_data, sz) < 0) { + printk(KERN_INFO "[zinitix_touch] error : read zinitix tc raw data\n"); + up(&touch_dev->raw_data_lock); + return false; + } + + udata = touch_dev->cur_data[total_node]; + if (!zinitix_bit_test(udata, BIT_ICON_EVENT) + && !zinitix_bit_test(udata, BIT_PT_EXIST)) + memcpy((u8 *)touch_dev->ref_data, + (u8 *)touch_dev->cur_data, total_node*2); + touch_dev->update = 1; + memcpy((u8 *)(&touch_dev->touch_info), + (u8 *)&touch_dev->cur_data[total_node], + sizeof(struct _ts_zinitix_point_info)); + } + up(&touch_dev->raw_data_lock); + return true; +} +#endif + + +static bool ts_get_samples(struct zinitix_touch_dev *touch_dev) +{ + int i; + + zinitix_debug_msg("ts_get_samples+\r\n"); + + if (gpio_get_value(touch_dev->int_gpio_num)) { + /*interrupt pin is high, not valid data.*/ + zinitix_debug_msg("woops... inturrpt pin is high\r\n"); + return false; + } + +#if USE_TEST_RAW_TH_DATA_MODE + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { + if (ts_get_raw_data(touch_dev) == false) + return false; + goto continue_check_point_data; + } +#endif + + if (ts_read_data(touch_dev->client, + ZINITIX_POINT_STATUS_REG, + (u8 *)(&touch_dev->touch_info), + sizeof(struct _ts_zinitix_point_info)) < 0) { + zinitix_debug_msg("error read point info using i2c.-\n"); + return false; + } + +continue_check_point_data: + zinitix_debug_msg("status = 0x%x , pt cnt = %d, t stamp = %d\n", + touch_dev->touch_info.status, + touch_dev->touch_info.finger_cnt, + touch_dev->touch_info.time_stamp); + + if (touch_dev->touch_info.status == 0x0 + && touch_dev->touch_info.finger_cnt == 100) { + zinitix_debug_msg("periodical esd repeated int occured\r\n"); + return true; + } + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + touch_dev->button[i] = ICON_BUTTON_UNCHANGE; + + if (zinitix_bit_test(touch_dev->touch_info.status, BIT_ICON_EVENT)) { + udelay(20); + if (ts_read_data(touch_dev->client, + ZINITIX_ICON_STATUS_REG, + (u8 *)(&touch_dev->icon_event_reg), 2) < 0) { + printk(KERN_INFO "[zinitix_touch] error read icon info using i2c.\n"); + return false; + } + } + zinitix_debug_msg("ts_get_samples-\r\n"); + + return true; +} + + +static bool ts_read_coord(struct zinitix_touch_dev *hDevice) +{ + struct zinitix_touch_dev *touch_dev = + (struct zinitix_touch_dev *)hDevice; + if (ts_get_samples(touch_dev) == false) + return false; + + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + return true; +} + +void firmware_touch_ctrl_regulator(int on_off) +{ + + if(on_off==TOUCH_OFF) +{ + // touch_ctrl_regulator(TOUCH_OFF); + printk("Tsp off\n"); + regulator_disable(tsp_regulator_33); + udelay(100); + } + else + { + // touch_ctrl_regulator(TOUCH_ON); + regulator_enable(tsp_regulator_33); + udelay(100); + printk("Tsp on\n"); + + } + +} + +void touch_ctrl_regulator(int on_off) +{ + + if(on_off==TOUCH_OFF) +{ + // touch_ctrl_regulator(TOUCH_OFF); + printk("Tsp off\n"); + regulator_disable(tsp_regulator_33); + udelay(100); + regulator_disable(tsp_regulator_18); + } + else + { + // touch_ctrl_regulator(TOUCH_ON); + regulator_enable(tsp_regulator_33); + udelay(100); + regulator_enable(tsp_regulator_18); + printk("Tsp on\n"); + + } + +} +EXPORT_SYMBOL(touch_ctrl_regulator); +static void ts_power_control(struct zinitix_touch_dev *touch_dev, u8 ctl) +{ + if (ctl == POWER_OFF) + { + // touch_ctrl_regulator(TOUCH_OFF); + printk("Tsp off\n"); + regulator_disable(tsp_regulator_33); + regulator_disable(tsp_regulator_18); + + } + else if (ctl == POWER_ON) + { + // touch_ctrl_regulator(TOUCH_ON); + regulator_enable(tsp_regulator_33); + udelay(100); + regulator_enable(tsp_regulator_18); + + printk("Tsp on\n"); + + } +} + +static bool ts_mini_init_touch(struct zinitix_touch_dev *touch_dev) +{ + u16 reg_val; + int i; +#if USE_CHECKSUM + u16 chip_check_reg0, chip_check_reg1, chip_check_reg2, chip_check_reg3; +#endif + u16 Setvaule = SYSTEM_VALUE; + + if (touch_dev == NULL) { + printk(KERN_INFO "[zinitix_touch] ts_mini_init_touch : error (touch_dev == NULL?)\r\n"); + return false; + } + + zinitix_debug_msg("check checksum\r\n"); + +#if USE_CHECKSUM + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG0, + (u8 *)&chip_check_reg0, 2) < 0) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG1, + (u8 *)&chip_check_reg1, 2) < 0) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG2, + (u8 *)&chip_check_reg2, 2) < 0) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG3, + (u8 *)&chip_check_reg3, 2) < 0) + { printk("[Zinitix] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + if( (chip_check_reg0!=chip_check_reg2) || (chip_check_reg1!=chip_check_reg3) ) { + printk(KERN_INFO "[zinitix_touch] fail to check firmware data\r\n"); + goto fail_mini_init; + } + +#endif + + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] fail to write reset command\r\n"); + goto fail_mini_init; + } + + + /* initialize */ + if (ts_write_reg(touch_dev->client, + ZINITIX_X_RESOLUTION, + (u16)(touch_dev->cap_info.x_resolution)) != I2C_SUCCESS) + { printk("[Zinitix] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + + if (ts_write_reg(touch_dev->client, + ZINITIX_Y_RESOLUTION, + (u16)( touch_dev->cap_info.y_resolution)) != I2C_SUCCESS) + { printk("[Zinitix] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + + if (ts_write_reg(touch_dev->client, + 0x00CB, (u16)(Setvaule)) != I2C_SUCCESS) + goto fail_mini_init; + + zinitix_debug_msg("touch max x = %d\r\n", touch_dev->cap_info.x_resolution); + zinitix_debug_msg("touch max y = %d\r\n", touch_dev->cap_info.y_resolution); + + if (ts_write_reg(touch_dev->client, + ZINITIX_BUTTON_SUPPORTED_NUM, + (u16)touch_dev->cap_info.button_num) != I2C_SUCCESS) + { printk("[Zinitix] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + if (ts_write_reg(touch_dev->client, + ZINITIX_SUPPORTED_FINGER_NUM, + (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + { printk("[Zinitix] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } +#if USE_TEST_RAW_TH_DATA_MODE + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + touch_dev->raw_mode_flag) != I2C_SUCCESS) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + } else +#endif +{ + reg_val = TOUCH_MODE; + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + reg_val) != I2C_SUCCESS) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } +} + /* soft calibration */ + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) != I2C_SUCCESS) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + + /* read garbage data */ + for (i = 0; i < 10; i++) { + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + } + +#if USE_TEST_RAW_TH_DATA_MODE + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + } else +#endif +{ + if (ZINITIX_ESD_TIMER_INTERVAL) { + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + { printk("[zinitix_touch] %s, %d\n", __func__, __LINE__ ); + goto fail_mini_init; + } + } +} + if (touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } + + zinitix_debug_msg("successfully mini initialized\r\n"); + return true; + +fail_mini_init: + + printk(KERN_INFO"[zinitix_touch] early mini init fail\n"); + if(ts_init_touch(touch_dev) == false) { + zinitix_debug_msg("fail initialized\r\n"); + return false; + } + + if (touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } + return true; +} + + +static void zinitix_touch_tmr_work(struct work_struct *work) +{ + struct zinitix_touch_dev *touch_dev = + container_of(work, struct zinitix_touch_dev, tmr_work); + + printk(KERN_INFO "[zinitix_touch] tmr queue work ++\r\n"); + if (touch_dev == NULL) { + printk(KERN_INFO "[zinitix_touch] touch dev == NULL ?\r\n"); + goto fail_time_out_init; + } + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "[zinitix_touch] other process occupied (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + return; + } + touch_dev->work_proceedure = TS_ESD_TIMER_WORK; + + disable_irq(touch_dev->irq); + printk(KERN_INFO "[zinitix_touch] error. timeout occured. maybe ts device dead. so reset & reinit.\r\n"); + touch_delay(CHIP_POWER_OFF_DELAY); + ts_power_control(touch_dev, POWER_OFF); + touch_delay(CHIP_POWER_OFF_DELAY); + ts_power_control(touch_dev, POWER_ON); + touch_delay(CHIP_ON_DELAY); + + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(touch_dev); + if (ts_mini_init_touch(touch_dev) == false) + goto fail_time_out_init; + + touch_dev->work_proceedure = TS_NO_WORK; + enable_irq(touch_dev->irq); + up(&touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] tmr queue work ----\r\n"); + return; +fail_time_out_init: + printk(KERN_INFO "[zinitix_touch] tmr work : restart error\r\n"); + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + touch_dev->work_proceedure = TS_NO_WORK; + enable_irq(touch_dev->irq); + up(&touch_dev->work_proceedure_lock); +} + +static void ts_esd_timer_start(u16 sec, struct zinitix_touch_dev *touch_dev) +{ + if (touch_dev->p_esd_timeout_tmr != NULL) + del_timer(touch_dev->p_esd_timeout_tmr); + touch_dev->p_esd_timeout_tmr = NULL; + + init_timer(&(touch_dev->esd_timeout_tmr)); + touch_dev->esd_timeout_tmr.data = (unsigned long)(touch_dev); + touch_dev->esd_timeout_tmr.function = ts_esd_timeout_handler; + touch_dev->esd_timeout_tmr.expires = jiffies + HZ*sec; + touch_dev->p_esd_timeout_tmr = &touch_dev->esd_timeout_tmr; + add_timer(&touch_dev->esd_timeout_tmr); +} + +static void ts_esd_timer_stop(struct zinitix_touch_dev *touch_dev) +{ + if (touch_dev->p_esd_timeout_tmr) + del_timer(touch_dev->p_esd_timeout_tmr); + touch_dev->p_esd_timeout_tmr = NULL; +} + +static void ts_esd_timer_init(struct zinitix_touch_dev *touch_dev) +{ + init_timer(&(touch_dev->esd_timeout_tmr)); + touch_dev->esd_timeout_tmr.data = (unsigned long)(touch_dev); + touch_dev->esd_timeout_tmr.function = ts_esd_timeout_handler; + touch_dev->p_esd_timeout_tmr = NULL; +} + +static void ts_esd_timeout_handler(unsigned long data) +{ + struct zinitix_touch_dev *touch_dev = (struct zinitix_touch_dev *)data; + touch_dev->p_esd_timeout_tmr = NULL; + queue_work(zinitix_tmr_workqueue, &touch_dev->tmr_work); +} + +#if TOUCH_ONESHOT_UPGRADE +static bool ts_check_need_upgrade(u16 curVersion, u16 curRegVersion) +{ + u16 newVersion; + newVersion = (u16) (m_firmware_data[0] | (m_firmware_data[1]<<8)); + + printk(KERN_INFO "[zinitix_touch] cur Version = 0x%x, new Version = 0x%x\n", + curVersion, newVersion); + + if ((curVersion < newVersion)|(curVersion == 0xFFFF)|(curVersion == 0)) + return true; + else if (curVersion > newVersion) + return false; + + + + if (m_firmware_data[FIRMWARE_VERSION_POS+2] == 0xff + && m_firmware_data[FIRMWARE_VERSION_POS+3] == 0xff) + return false; + newVersion = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] + | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + + if (curRegVersion < newVersion) + return true; + + return false; +} +#endif + +#define TC_PAGE_SZ 64 +#define TC_SECTOR_SZ 8 + +static u8 ts_upgrade_firmware(struct zinitix_touch_dev *touch_dev, + const u8 *firmware_data, u32 size) +{ + u16 flash_addr; + u8 *verify_data; + int retry_cnt = 0; + u8 i2c_buffer[TC_PAGE_SZ+2]; + zinitix_debug_msg("ts_upgrade_firmware\r\n"); + if (m_isp_client == NULL) { + printk(KERN_ERR "[zinitix_touch] i2c client for isp is not register \r\n"); + return false; + } + + verify_data = kzalloc(size, GFP_KERNEL); + if (verify_data == NULL) { + printk(KERN_ERR "[zinitix_touch] cannot alloc verify buffer\n"); + return false; + } + +retry_isp_firmware_upgrade: + firmware_touch_ctrl_regulator(POWER_OFF); + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + firmware_touch_ctrl_regulator(POWER_ON); + mdelay(1); /* under 4ms*/ + + printk(KERN_INFO "[zinitix_touch] write firmware data\n"); + + for (flash_addr = 0; flash_addr < size; flash_addr += TC_PAGE_SZ) { + +#if !USE_HW_CALIBRATION + if (flash_addr >= CALIBRATION_AREA*2) + break; +#endif + printk(KERN_INFO "."); + printk("firmware write : addr = %04x, len = %d\n", + flash_addr, TC_PAGE_SZ); + + i2c_buffer[0] = (flash_addr>>8)&0xff; /*addr_h*/ + i2c_buffer[1] = (flash_addr)&0xff; /*addr_l*/ + memcpy(&i2c_buffer[2], &firmware_data[flash_addr], TC_PAGE_SZ); + + if (ts_write_firmware_data(m_isp_client, + i2c_buffer, TC_PAGE_SZ+2) < 0) { + printk(KERN_INFO"[zinitix_touch] error : write zinitix tc firmare\n"); + goto fail_upgrade; + } + mdelay(20); + } + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + + printk(KERN_INFO "\r\n[zinitix_touch] read firmware data\n"); + + + flash_addr = 0; + i2c_buffer[0] = (flash_addr>>8)&0xff; /*addr_h*/ + i2c_buffer[1] = (flash_addr)&0xff; /*addr_l*/ + +#if !USE_HW_CALIBRATION + size = CALIBRATION_AREA*2; +#endif + if (ts_read_firmware_data(m_isp_client, + i2c_buffer, &verify_data[flash_addr], size) < 0) { + printk(KERN_INFO "[zinitix_touch] error : read zinitix tc firmare: addr = %04x, len = %d\n", + flash_addr, size); + goto fail_upgrade; + } + if (memcmp((u8 *)&firmware_data[flash_addr], + (u8 *)&verify_data[flash_addr], size) != 0) { + printk(KERN_INFO "[zinitix_touch] error : verify error : addr = %04x, len = %d\n", + flash_addr, size); + goto fail_upgrade; + } + + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + firmware_touch_ctrl_regulator(POWER_OFF); + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + firmware_touch_ctrl_regulator(POWER_ON); + mdelay(CHIP_ON_AF_FZ_DELAY); + printk(KERN_INFO "[zinitix_touch] upgrade finished\n"); + kfree(verify_data); + return true; + +fail_upgrade: + + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + firmware_touch_ctrl_regulator(POWER_OFF); + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + firmware_touch_ctrl_regulator(POWER_ON); + mdelay(CHIP_ON_AF_FZ_DELAY); + + printk(KERN_INFO "[zinitix_touch] upgrade fail : so retry... (%d)\n", ++retry_cnt); + if (retry_cnt <= ZINITIX_INIT_RETRY_CNT) + goto retry_isp_firmware_upgrade; + + if (verify_data != NULL) + kfree(verify_data); + + printk(KERN_INFO "[zinitix_touch] upgrade fail..\n"); + return false; + +} + + +static bool ts_init_touch(struct zinitix_touch_dev *touch_dev) +{ + u16 reg_val; + int i; + int j, k=0; + u16 SetMaxX = SYSTEM_MAX_X_RESOLUTION; + u16 SetMaxY = SYSTEM_MAX_Y_RESOLUTION; + u16 Setvaule = SYSTEM_VALUE; + u16 chip_revision; + u16 chip_firmware_version; + u16 chip_reg_data_version; + u16 chip_eeprom_info; + u16 irq_check; +#if USE_CHECKSUM + u16 chip_check_reg0, chip_check_reg1, chip_check_reg2, chip_check_reg3; + u8 checksum_err; +#endif +#if TOUCH_ONESHOT_UPGRADE + s16 stmp; +#endif + int retry_cnt = 0; + + if (touch_dev == NULL) { + printk(KERN_ERR "[zinitix_touch] error touch_dev == null?\r\n"); + return false; + } + + +retry_init: + zinitix_debug_msg("check checksum\r\n"); +#if 1//temp +#if USE_CHECKSUM + checksum_err = 0; + + for (i = 0; i < ZINITIX_INIT_RETRY_CNT; i++) { + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG0, + (u8 *)&chip_check_reg0, 2) < 0) { + touch_delay(50); + continue; + } + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG1, + (u8 *)&chip_check_reg1, 2) < 0){ + touch_delay(50); + continue; + } + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG2, + (u8 *)&chip_check_reg2, 2) < 0){ + touch_delay(50); + continue; + } + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG3, + (u8 *)&chip_check_reg3, 2) < 0){ + touch_delay(50); + continue; + } + if( (chip_check_reg0==chip_check_reg2) && (chip_check_reg1==chip_check_reg3) ) + break; + else { + checksum_err = 1; + break; + } + } + + if (i == ZINITIX_INIT_RETRY_CNT || checksum_err) { + printk(KERN_INFO "[zinitix_touch] fail to check firmware data\r\n"); + if(checksum_err == 1 && retry_cnt < ZINITIX_INIT_RETRY_CNT) + retry_cnt = ZINITIX_INIT_RETRY_CNT; + goto fail_init; + } +#endif + + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] fail to write reset command\r\n"); + goto fail_init; + } + +#if USING_CHIP_SETTING + if (ts_read_data(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + (u8 *)&touch_dev->cap_info.chip_int_mask, 2) < 0) + goto fail_init; + printk(KERN_INFO "[zinitix_touch] zinitix touch interrupt mask = %04x\r\n", + touch_dev->cap_info.chip_int_mask); + if (touch_dev->cap_info.chip_int_mask == 0 + || touch_dev->cap_info.chip_int_mask == 0xffff) + goto fail_init; +#else + touch_dev->cap_info.button_num = SUPPORTED_BUTTON_NUM; + + reg_val = 0; + zinitix_bit_set(reg_val, BIT_PT_CNT_CHANGE); + zinitix_bit_set(reg_val, BIT_DOWN); + zinitix_bit_set(reg_val, BIT_MOVE); + zinitix_bit_set(reg_val, BIT_UP); + if (touch_dev->cap_info.button_num > 0) + zinitix_bit_set(reg_val, BIT_ICON_EVENT); + touch_dev->cap_info.chip_int_mask = reg_val; +#endif + + + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0x0) != I2C_SUCCESS) + goto fail_init; + + zinitix_debug_msg("send reset command\r\n"); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_init; + + /* get chip revision id */ + if (ts_read_data(touch_dev->client, + ZINITIX_CHIP_REVISION, + (u8 *)&chip_revision, 2) < 0) { + printk(KERN_INFO "[zinitix_touch] fail to read chip revision\r\n"); + goto fail_init; + } + printk(KERN_INFO "[zinitix_touch] zinitix touch chip revision id = %x\r\n", + chip_revision); + + touch_dev->cap_info.chip_fw_size = 32*1024; + +#if USE_TEST_RAW_TH_DATA_MODE + if (ts_read_data(touch_dev->client, + ZINITIX_TOTAL_NUMBER_OF_X, + (u8 *)&touch_dev->cap_info.x_node_num, 2) < 0) + goto fail_init; + printk(KERN_INFO "[zinitix_touch] zinitix touch chip x node num = %d\r\n", + touch_dev->cap_info.x_node_num); + if (ts_read_data(touch_dev->client, + ZINITIX_TOTAL_NUMBER_OF_Y, + (u8 *)&touch_dev->cap_info.y_node_num, 2) < 0) + goto fail_init; + printk(KERN_INFO "[zinitix_touch] zinitix touch chip y node num = %d\r\n", + touch_dev->cap_info.y_node_num); + + touch_dev->cap_info.total_node_num = + touch_dev->cap_info.x_node_num*touch_dev->cap_info.y_node_num; + printk(KERN_INFO "[zinitix_touch] zinitix touch chip total node num = %d\r\n", + touch_dev->cap_info.total_node_num); + + if (ts_read_data(touch_dev->client, + ZINITIX_MAX_Y_NUM, + (u8 *)&touch_dev->cap_info.max_y_node, 2) < 0) + goto fail_init; + + printk(KERN_INFO "[zinitix_touch] zinitix touch chip max y node num = %d\r\n", + touch_dev->cap_info.max_y_node); + + if (ts_read_data(touch_dev->client, + ZINITIX_CAL_N_TOTAL_NUM, + (u8 *)&touch_dev->cap_info.total_cal_n, 2) < 0) + goto fail_init; + printk(KERN_INFO "[zinitix_touch] zinitix touch chip total cal n data num = %d\r\n", + touch_dev->cap_info.total_cal_n); + + +#endif + + + /* get chip firmware version */ + if (ts_read_data(touch_dev->client, + ZINITIX_FIRMWARE_VERSION, + (u8 *)&chip_firmware_version, 2) < 0) + goto fail_init; + printk(KERN_INFO "[zinitix_touch] zinitix touch chip firmware version = %x\r\n", + chip_firmware_version); +#endif//temp + + //ts_upgrade_firmware(touch_dev, &m_firmware_data[2], + // touch_dev->cap_info.chip_fw_size); + +#if TOUCH_ONESHOT_UPGRADE + chip_reg_data_version = 0xffff; + + if (ts_read_data(touch_dev->client, + ZINITIX_DATA_VERSION_REG, + (u8 *)&chip_reg_data_version, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch reg data version = %d\r\n", + chip_reg_data_version); + + if (ts_check_need_upgrade(chip_firmware_version, + chip_reg_data_version) == true) { + printk(KERN_INFO "[zinitix_touch] start upgrade firmware\n"); + + ts_upgrade_firmware(touch_dev, &m_firmware_data[2], + touch_dev->cap_info.chip_fw_size); + + /* get chip revision id */ + if (ts_read_data(touch_dev->client, + ZINITIX_CHIP_REVISION, + (u8 *)&chip_revision, 2) < 0) { + printk(KERN_INFO "[zinitix_touch] fail to read chip revision\r\n"); + goto fail_init; + } + printk(KERN_INFO "[zinitix_touch] zinitix touch chip revision id = %x\r\n", + chip_revision); + + /* get chip firmware version */ + if (ts_read_data(touch_dev->client, + ZINITIX_FIRMWARE_VERSION, + (u8 *)&chip_firmware_version, 2) < 0) + goto fail_init; + printk(KERN_INFO "[zinitix_touch] zinitix touch chip renewed firmware version = %x\r\n", + chip_firmware_version); + + } +#endif + + if (ts_read_data(touch_dev->client, + ZINITIX_DATA_VERSION_REG, + (u8 *)&chip_reg_data_version, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch reg data version = %d\r\n", + chip_reg_data_version); + +#if TOUCH_ONESHOT_UPGRADE + if (chip_reg_data_version + < m_reg_data[ZINITIX_DATA_VERSION_REG].reg_val) { + zinitix_debug_msg("write new reg data( %d < %d)\r\n", + chip_reg_data_version, + m_reg_data[ZINITIX_DATA_VERSION_REG].reg_val); + for (i = 0; i < MAX_REG_COUNT; i++) { + if (m_reg_data[i].valid == 1) { + if (ts_write_reg(touch_dev->client, + (u16)i, + (u16)(m_reg_data[i].reg_val)) + != I2C_SUCCESS) + goto fail_init; + if (i == ZINITIX_TOTAL_NUMBER_OF_X + || i == ZINITIX_TOTAL_NUMBER_OF_Y) + mdelay(50); + if (ts_read_data(touch_dev->client, + (u16)i, (u8 *)&stmp, 2) < 0) + goto fail_init; + if (memcmp((char *)&m_reg_data[i].reg_val, + (char *)&stmp, 2) < 0) + printk(KERN_WARNING "[zinitix_touch] register data is different. (addr = 0x%02X , %d != %d)\r\n", + i, m_reg_data[i].reg_val, stmp); + } + } + zinitix_debug_msg("done new reg data( %d < %d)\r\n", + chip_reg_data_version, + m_reg_data[ZINITIX_DATA_VERSION_REG].reg_val); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SAVE_STATUS_CMD) != I2C_SUCCESS) + goto fail_init; + mdelay(1000); /* for fusing eeprom */ + } + +#endif + + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", chip_eeprom_info); + +#if USE_HW_CALIBRATION + if (zinitix_bit_test(chip_eeprom_info, 0)) { /* hw calibration bit*/ + + if (touch_dev->cap_info.chip_int_mask != 0) + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) + != I2C_SUCCESS) + goto fail_init; + + /* h/w calibration */ + mdelay(100); + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, 0x07) != I2C_SUCCESS) + goto fail_init; + mdelay(250); + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_init; + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_init; + mdelay(10); + + /* wait for h/w calibration*/ + do { + ts_write_cmd(touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + touch_delay(1000); + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", + chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + } while (1); + + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + goto fail_init; + + + touch_delay(10); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_init; + + touch_delay(10); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + goto fail_init; + touch_delay(500); + + + /* disable chip interrupt */ + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + + } +#endif + + touch_dev->cap_info.chip_revision = (u16)chip_revision; + touch_dev->cap_info.chip_firmware_version = (u16)chip_firmware_version; + touch_dev->cap_info.chip_reg_data_version = (u16)chip_reg_data_version; + + + /* initialize */ + if (ts_write_reg(touch_dev->client, + ZINITIX_X_RESOLUTION, + (u16)(SetMaxX)) != I2C_SUCCESS) + goto fail_init; + + if (ts_write_reg(touch_dev->client, + ZINITIX_Y_RESOLUTION, + (u16)(SetMaxY)) != I2C_SUCCESS) + goto fail_init; + + if (ts_write_reg(touch_dev->client, + 0x00CB, + (u16)(Setvaule)) != I2C_SUCCESS) + goto fail_init; + + + if (ts_read_data(touch_dev->client, + ZINITIX_X_RESOLUTION, + (u8 *)&touch_dev->cap_info.x_resolution, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch max x = %d\r\n", + touch_dev->cap_info.x_resolution); + if (ts_read_data(touch_dev->client, + ZINITIX_Y_RESOLUTION, + (u8 *)&touch_dev->cap_info.y_resolution, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch max y = %d\r\n", + touch_dev->cap_info.y_resolution); + + touch_dev->cap_info.MinX = (u32)0; + touch_dev->cap_info.MinY = (u32)0; + touch_dev->cap_info.MaxX = (u32)touch_dev->cap_info.x_resolution; + touch_dev->cap_info.MaxY = (u32)touch_dev->cap_info.y_resolution; + +#if USING_CHIP_SETTING + if (ts_read_data(touch_dev->client, + ZINITIX_BUTTON_SUPPORTED_NUM, + (u8 *)&touch_dev->cap_info.button_num, 2) < 0) + goto fail_init; + zinitix_debug_msg("supported button num = %d\r\n", + touch_dev->cap_info.button_num); + if (ts_read_data(touch_dev->client, + ZINITIX_SUPPORTED_FINGER_NUM, + (u8 *)&touch_dev->cap_info.multi_fingers, 2) < 0) + goto fail_init; + zinitix_debug_msg("supported finger num = %d\r\n", + touch_dev->cap_info.multi_fingers); +#else + if (ts_write_reg(touch_dev->client, + ZINITIX_BUTTON_SUPPORTED_NUM, + (u16)touch_dev->cap_info.button_num) != I2C_SUCCESS) + goto fail_init; + + if (ts_write_reg(touch_dev->client, + ZINITIX_SUPPORTED_FINGER_NUM, + (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_init; + touch_dev->cap_info.multi_fingers = REAL_SUPPORTED_FINGER_NUM; +#endif + + zinitix_debug_msg("max supported finger num = %d, \ + real supported finger num = %d\r\n", + touch_dev->cap_info.multi_fingers, REAL_SUPPORTED_FINGER_NUM); + touch_dev->cap_info.gesture_support = 0; + zinitix_debug_msg("set other configuration\r\n"); + +#if USE_TEST_RAW_TH_DATA_MODE + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + touch_dev->raw_mode_flag) != I2C_SUCCESS) + goto fail_init; + } else +#endif +{ + reg_val = TOUCH_MODE; + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + reg_val) != I2C_SUCCESS) + goto fail_init; +} + /* soft calibration */ + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_init; + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) != I2C_SUCCESS) + goto fail_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + } + +#if USE_TEST_RAW_TH_DATA_MODE + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + } else +#endif +{ + if (ZINITIX_ESD_TIMER_INTERVAL) { + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_init; + if (ts_read_data(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + (u8 *)®_val, 2) < 0) + goto fail_init; + zinitix_debug_msg("esd timer register = %d\r\n", reg_val); + } +} + + if (!ts_read_data(touch_dev->client, ZINITIX_INT_ENABLE_FLAG, + (u8 *)&irq_check, 2) ) { + if(irq_check==0) + { + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) != I2C_SUCCESS) + goto fail_init; + } + } + + + zinitix_debug_msg("successfully initialized\r\n"); + return true; + +fail_init: + + if (++retry_cnt <= ZINITIX_INIT_RETRY_CNT) { + firmware_touch_ctrl_regulator(POWER_OFF); + touch_delay(CHIP_POWER_OFF_DELAY); + firmware_touch_ctrl_regulator(POWER_ON); + touch_delay(CHIP_ON_DELAY); + zinitix_debug_msg("retry to initiallize(retry cnt = %d)\r\n", + retry_cnt); + goto retry_init; + } else if(retry_cnt == ZINITIX_INIT_RETRY_CNT+1){ + touch_dev->cap_info.chip_fw_size = 32*1024; + + zinitix_debug_msg("retry to initiallize(retry cnt = %d)\r\n", retry_cnt); +#if 1//TOUCH_FORCE_UPGRADE + zinitix_debug_msg("TOUCH_FORCE_UPGRADE+++\r\n"); + if( ts_upgrade_firmware(touch_dev, &m_firmware_data[2], + touch_dev->cap_info.chip_fw_size) == false) { + printk(KERN_INFO "[zinitix_touch] Upgrade Fail\n"); + return false; + } + zinitix_debug_msg("TOUCH_FORCE_UPGRADE---\r\n"); + touch_delay(100); + // hw calibration and make checksum + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, 0x07) != I2C_SUCCESS) + goto fail_hwcal_init; + touch_delay(250); + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + touch_delay(10); + /* wait for h/w calibration*/ + do { + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + touch_delay(1000); + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_hwcal_init; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + } while (1); + + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + goto fail_hwcal_init; + touch_delay(10); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + touch_delay(10); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + touch_delay(1000); //for fuzing +fail_hwcal_init: + // to read new information + goto retry_init; +#endif + } + printk("[zinitix touch] failed to initiallize\r\n"); + return false; +} + +static void zinitix_clear_report_data(struct zinitix_touch_dev *touch_dev) +{ + int i; + u8 reported = 0; + u8 sub_status; + + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = touch_dev->reported_touch_info.coord[i].sub_status; + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { +#ifdef ABS_MT_TRACKING_ID + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, i); +#endif + + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, + touch_dev->reported_touch_info.coord[i].x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, + touch_dev->reported_touch_info.coord[i].y); + input_mt_sync(touch_dev->input_dev); + reported = 1; + } + touch_dev->reported_touch_info.coord[i].sub_status = 0; + } + if (reported) + { + input_report_key(touch_dev->input_dev, BTN_TOUCH, 0); /* ice cream */ + input_sync(touch_dev->input_dev); + } +} + + +static irqreturn_t zinitix_touch_work(int irq, void *data) +{ + struct zinitix_touch_dev* touch_dev = (struct zinitix_touch_dev*)data; + int i; + u8 reported = false; + u8 sub_status; + u32 x, y; + u32 w; + u32 tmp; + + zinitix_debug_msg("zinitix_touch_thread : semaphore signalled\r\n"); + + if (touch_dev->use_esd_timer) { + ts_esd_timer_stop(touch_dev); + zinitix_debug_msg("esd timer stop\r\n"); + } + + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK) { + zinitix_debug_msg("zinitix_touch_thread : \ + [warning] other process occupied..\r\n"); + udelay(DELAY_FOR_SIGNAL_DELAY); + if (!gpio_get_value(touch_dev->int_gpio_num)) { + ts_write_cmd(touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + } + goto continue_read_samples; + } + touch_dev->work_proceedure = TS_NORMAL_WORK; + if (ts_read_coord(touch_dev) == false) { + zinitix_debug_msg("couldn't read touch_dev sample\r\n"); + goto continue_read_samples; + } + +#if USE_TEST_RAW_TH_DATA_MODE + if (touch_dev->raw_mode_flag == TOUCH_TEST_RAW_MODE) + goto continue_read_samples; +#endif + + /* invalid : maybe periodical repeated int. */ + if (touch_dev->touch_info.status == 0x0) + { + //printk("status = %X TSP Period INT\r\n", touch_dev->touch_info.status);//temp + goto continue_read_samples; + } + + reported = false; + + if (zinitix_bit_test(touch_dev->touch_info.status, BIT_ICON_EVENT)) { + for (i = 0; i < touch_dev->cap_info.button_num; i++) { + if (zinitix_bit_test(touch_dev->icon_event_reg, + (BIT_O_ICON0_DOWN+i))) { + touch_dev->button[i] = ICON_BUTTON_DOWN; + input_report_key(touch_dev->input_dev, + BUTTON_MAPPING_KEY[i], 1); + reported = true; + zinitix_debug_msg("button down = %d \r\n", i); + //printk("status = %X button down = %d \r\n", touch_dev->touch_info.status, i);//temp + } + } + + for (i = 0; i < touch_dev->cap_info.button_num; i++) { + if (zinitix_bit_test(touch_dev->icon_event_reg, + (BIT_O_ICON0_UP+i))) { + touch_dev->button[i] = ICON_BUTTON_UP; + input_report_key(touch_dev->input_dev, + BUTTON_MAPPING_KEY[i], 0); + reported = true; + zinitix_debug_msg("button up = %d \r\n", i); + //printk("status = %X button up = %d \r\n", touch_dev->touch_info.status, i);//temp + } + } + } + + /* if button press or up event occured... */ + if (reported == true) { + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = + touch_dev->reported_touch_info.coord[i].sub_status; + x = touch_dev->reported_touch_info.coord[i].x; + y = touch_dev->reported_touch_info.coord[i].y; + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + zinitix_debug_msg("finger [%02d] up \r\n", i); + //printk("status = %X finger [%02d] up \r\n", touch_dev->touch_info.status, i);//temp +#ifdef ABS_MT_TRACKING_ID + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID,i); +#endif + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, y); + input_mt_sync(touch_dev->input_dev); + } + } + memset(&touch_dev->reported_touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); + input_report_key(touch_dev->input_dev, BTN_TOUCH, 0); /* ice cream */ + input_sync(touch_dev->input_dev); + udelay(100); + goto continue_read_samples; + } + if (touch_dev->touch_info.finger_cnt > MAX_SUPPORTED_FINGER_NUM) + touch_dev->touch_info.finger_cnt = MAX_SUPPORTED_FINGER_NUM; + + if (!zinitix_bit_test(touch_dev->touch_info.status, BIT_PT_EXIST)) { + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = + touch_dev->reported_touch_info.coord[i].sub_status; + x = touch_dev->reported_touch_info.coord[i].x; + y = touch_dev->reported_touch_info.coord[i].y; + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + zinitix_debug_msg("finger [%02d] up \r\n", i); + //printk("status = %X finger [%02d] up \r\n", touch_dev->touch_info.status, i);//temp +#ifdef ABS_MT_TRACKING_ID + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID,i); +#endif + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, y); + input_mt_sync(touch_dev->input_dev); + } + } + memset(&touch_dev->reported_touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); + input_report_key(touch_dev->input_dev, BTN_TOUCH, 0); /* ice cream */ + input_sync(touch_dev->input_dev); + goto continue_read_samples; + } + + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = touch_dev->touch_info.coord[i].sub_status; + + if (zinitix_bit_test(sub_status, SUB_BIT_DOWN) + || zinitix_bit_test(sub_status, SUB_BIT_MOVE) + || zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + ; + } else if (zinitix_bit_test(sub_status, SUB_BIT_UP)) { + zinitix_debug_msg("finger [%02d] up \r\n", i); + x = touch_dev->reported_touch_info.coord[i].x; + y = touch_dev->reported_touch_info.coord[i].y; + + memset(&touch_dev->touch_info.coord[i], + 0x0, sizeof(struct _ts_zinitix_coord)); +#ifdef ABS_MT_TRACKING_ID + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID,i); +#endif + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, y); + input_mt_sync(touch_dev->input_dev); + } + + } + + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = touch_dev->touch_info.coord[i].sub_status; + + if (zinitix_bit_test(sub_status, SUB_BIT_DOWN) + || zinitix_bit_test(sub_status, SUB_BIT_MOVE) + || zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + + x = touch_dev->touch_info.coord[i].x; + y = touch_dev->touch_info.coord[i].y; + w = touch_dev->touch_info.coord[i].width; + + /* transformation from touch to screen orientation */ + if (touch_dev->cap_info.Orientation & TOUCH_V_FLIP) + y = touch_dev->cap_info.MaxY + + touch_dev->cap_info.MinY - y; + if (touch_dev->cap_info.Orientation & TOUCH_H_FLIP) + x = touch_dev->cap_info.MaxX + + touch_dev->cap_info.MinX - x; + if (touch_dev->cap_info.Orientation & TOUCH_XY_SWAP) + zinitix_swap_v(x, y, tmp); + touch_dev->touch_info.coord[i].x = x; + touch_dev->touch_info.coord[i].y = y; + zinitix_debug_msg("finger [%02d] x = %d, y = %d \r\n", + i, x, y); + + if (w == 0) + w = 5; +#ifdef ABS_MT_TRACKING_ID + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID,i); +#endif + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, (u32)w); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, (u32)w); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, y); + input_mt_sync(touch_dev->input_dev); + } else if (zinitix_bit_test(sub_status, SUB_BIT_UP)) { + ; + } else + memset(&touch_dev->touch_info.coord[i], + 0x0, sizeof(struct _ts_zinitix_coord)); + + } + memcpy((char *)&touch_dev->reported_touch_info, + (char *)&touch_dev->touch_info, + sizeof(struct _ts_zinitix_point_info)); + input_report_key(touch_dev->input_dev, BTN_TOUCH, 1); /* ice cream */ + input_sync(touch_dev->input_dev); + +continue_read_samples: + + /* check_interrupt_pin, if high, enable int & wait signal */ + if (touch_dev->work_proceedure == TS_NORMAL_WORK) { + if (touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + zinitix_debug_msg("esd tmr start\n"); + } + touch_dev->work_proceedure = TS_NO_WORK; + } + up(&touch_dev->work_proceedure_lock); + return IRQ_HANDLED; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zinitix_late_resume(struct early_suspend *h) +{ + + struct zinitix_touch_dev *touch_dev; + touch_dev = container_of(h, struct zinitix_touch_dev, early_suspend); + printk(KERN_INFO "[zinitix_touch] resume++\r\n"); + + if (touch_dev == NULL) + return; + + + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_IN_RESUME && touch_dev->work_proceedure != TS_IN_EALRY_SUSPEND) { + printk(KERN_INFO"[zinitix_touch] zinitix_late_resume : invalid work proceedure (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + return; + } + //board_sysconfig(SYSCFG_TOUCH, SYSCFG_INIT); + + gpio_direction_input(TSP_INT); + + touch_ctrl_regulator(TOUCH_ON); + + ts_write_cmd(touch_dev->client, ZINITIX_WAKEUP_CMD); + mdelay(150); + if (ts_mini_init_touch(touch_dev) == false) + goto fail_resume; + enable_irq(touch_dev->irq); + touch_dev->work_proceedure = TS_NO_WORK; + up(&touch_dev->work_proceedure_lock); + + printk(KERN_INFO "[zinitix_touch] resume--\n"); + return; +fail_resume: + printk(KERN_ERR "[zinitix_touch] failed to resume\n"); + enable_irq(touch_dev->irq); + touch_dev->work_proceedure = TS_NO_WORK; + up(&touch_dev->work_proceedure_lock); + + return; +} + + +static void zinitix_early_suspend(struct early_suspend *h) +{ + + struct zinitix_touch_dev *touch_dev = container_of(h, struct zinitix_touch_dev, early_suspend); + + if (touch_dev == NULL) + return; + printk(KERN_INFO "[zinitix_touch] early suspend++\n"); + + flush_work(&touch_dev->tmr_work); + flush_work(&touch_dev->work); + + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"[zinitix_touch] zinitix_early_suspend : invalid work proceedure (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + return; + } + touch_dev->work_proceedure = TS_IN_EALRY_SUSPEND; + + + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(touch_dev); + + if (touch_dev->use_esd_timer) { + ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, 0); + ts_esd_timer_stop(touch_dev); + printk(KERN_INFO "[zinitix_touch] ts_esd_timer_stop\n"); + } + + disable_irq(touch_dev->irq); + + +#if !(USING_CHIP_SETTING) + ts_write_reg(touch_dev->client, ZINITIX_INT_ENABLE_FLAG, 0x0); +#endif + udelay(100); + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + #if 0 + if (ts_write_cmd(touch_dev->client, ZINITIX_SLEEP_CMD) != I2C_SUCCESS) { + printk(KERN_ERR "failed to enter into sleep mode\n"); + up(&touch_dev->work_proceedure_lock); + return; + } + #endif + gpio_direction_output( TSP_INT , 0 ); + + #if 0 + gpio_direction_output( TSP_SCL , 0 ); + gpio_direction_output( TSP_SDA , 0 ); + #endif + + msleep(20); + + touch_ctrl_regulator(TOUCH_OFF); + + up(&touch_dev->work_proceedure_lock); + + printk(KERN_INFO "[zinitix_touch] early suspend--\n"); + + return; +} + +#endif /* CONFIG_HAS_EARLYSUSPEND */ + +#if USE_TEST_RAW_TH_DATA_MODE +static ssize_t zinitix_get_test_raw_data(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int total_n_num; + if (misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + down(&misc_touch_dev->raw_data_lock); + total_n_num = misc_touch_dev->cap_info.total_node_num; + if (zinitix_bit_test( + misc_touch_dev->cur_data[total_n_num], BIT_PT_EXIST)) { + /*x_lsb*/ + buf[20] = + (misc_touch_dev->cur_data[total_n_num+1]&0xff); + /*x_msb*/ + buf[21] = + ((misc_touch_dev->cur_data[total_n_num+1]>>8)&0xff); + /*y_lsb*/ + buf[22] = + (misc_touch_dev->cur_data[total_n_num+2]&0xff); + /*y_msb*/ + buf[23] = + ((misc_touch_dev->cur_data[total_n_num+2] + >>8)&0xff); + } else { + buf[20] = 0; /*x_lsb*/ + buf[21] = 0; /*x_msb*/ + buf[22] = 0; /*y_lsb*/ + buf[23] = 0; /*y_msb*/ + } + + /*lsb*/ + buf[0] = + (char)(misc_touch_dev->ref_data[22]&0xff); + /*msb*/ + buf[1] = + (char)((misc_touch_dev->ref_data[22]>>8)&0xff); + /*delta lsb*/ + buf[2] = + (char)(((s16)(misc_touch_dev->cur_data[22] + - misc_touch_dev->ref_data[22]))&0xff); + /*delta msb*/ + buf[3] = + (char)((((s16)(misc_touch_dev->cur_data[22] + - misc_touch_dev->ref_data[22]))>>8)&0xff); + /* + buf[4] = + (char)(misc_touch_dev->ref_data[51]&0xff); + buf[5] = + (char)((misc_touch_dev->ref_data[51]>>8)&0xff); + buf[6] = + (char)(((s16)(misc_touch_dev->cur_data[51] + -misc_touch_dev->ref_data[51]))&0xff); + buf[7] = + (char)((((s16)(misc_touch_dev->cur_data[51] + -misc_touch_dev->ref_data[51]))>>8)&0xff); + + buf[8] = + (char)(misc_touch_dev->ref_data[102]&0xff); + buf[9] = + (char)((misc_touch_dev->ref_data[102]>>8)&0xff); + buf[10] = + (char)(((s16)(misc_touch_dev->cur_data[102] + -misc_touch_dev->ref_data[102]))&0xff); + buf[11] = + (char)((((s16)(misc_touch_dev->cur_data[102] + -misc_touch_dev->ref_data[102]))>>8)&0xff); + + buf[12] = + (char)(misc_touch_dev->ref_data[169]&0xff); + buf[13] = + (char)((misc_touch_dev->ref_data[169]>>8)&0xff); + buf[14] = + (char)(((s16)(misc_touch_dev->cur_data[169] + -misc_touch_dev->ref_data[169]))&0xff); + buf[15] = + (char)((((s16)(misc_touch_dev->cur_data[169] + -misc_touch_dev->ref_data[169]))>>8)&0xff); + + buf[16] = + (char)(misc_touch_dev->ref_data[178]&0xff); + buf[17] = + (char)((misc_touch_dev->ref_data[178]>>8)&0xff); + buf[18] = + (char)(((s16)(misc_touch_dev->cur_data[178] + -misc_touch_dev->ref_data[178]))&0xff); + buf[19] = + (char)((((s16)(misc_touch_dev->cur_data[178] + - misc_touch_dev->ref_data[178]))>>8)&0xff); + */ + up(&misc_touch_dev->raw_data_lock); + + + return 24; +} + + +ssize_t zinitix_set_testmode(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + unsigned char value = 0; + + printk(KERN_INFO "[zinitix_touch] zinitix_set_testmode, buf = %d\r\n", + *buf); + + if (misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + sscanf(buf, "%c", &value); + + if (value != TOUCH_TEST_RAW_MODE && value != TOUCH_NORMAL_MODE) { + printk(KERN_WARNING "[zinitix_touch] test mode setting value error. you must set %d[=normal] or %d[=raw mode]\r\n", + TOUCH_NORMAL_MODE, TOUCH_TEST_RAW_MODE); + return 1; + } + + down(&misc_touch_dev->raw_data_lock); + misc_touch_dev->raw_mode_flag = value; + + printk(KERN_INFO "[zinitix_touch] zinitix_set_testmode, touchkey_testmode = %d\r\n", + misc_touch_dev->raw_mode_flag); + + if (misc_touch_dev->raw_mode_flag == TOUCH_NORMAL_MODE) { + /* enter into normal mode */ + printk(KERN_INFO "[zinitix_touch] TEST Mode Exit\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_PERIODICAL_INTERRUPT_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set touch mode %d.\r\n", + TOUCH_MODE); + + /* clear garbage data */ + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + touch_delay(100); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } else { + /* enter into test mode */ + printk(KERN_INFO "[zinitix_touch] TEST Mode Enter\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_TEST_RAW_MODE) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set touch mode %d.\r\n", + TOUCH_TEST_RAW_MODE); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + /* clear garbage data */ + touch_delay(100); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + memset(&misc_touch_dev->reported_touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); + memset(&misc_touch_dev->touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); + } + up(&misc_touch_dev->raw_data_lock); + return 1; + +} + +static DEVICE_ATTR(get_touch_raw_data, + S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, + zinitix_get_test_raw_data, + zinitix_set_testmode); + + +static int ts_misc_fops_open(struct inode *inode, struct file *filp) +{ + return 0; +} + +static int ts_misc_fops_close(struct inode *inode, struct file *filp) +{ + return 0; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) +static int ts_misc_fops_ioctl(struct inode *inode, + struct file *filp, unsigned int cmd, + unsigned long arg) +#else +static long ts_misc_fops_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg) +#endif +{ + void __user *argp = (void __user *)arg; + struct _raw_ioctl raw_ioctl; + u8 *u8Data; + int i, j; + int ret = 0; + size_t sz = 0; + u16 version; + u8 div_node; + int total_cal_n; + + u16 mode; + u16 chip_eeprom_info; + struct _reg_ioctl reg_ioctl; + u16 val; + int nval = 0; + + if (misc_touch_dev == NULL) + return -1; + + /* zinitix_debug_msg("cmd = %d, argp = 0x%x\n", cmd, (int)argp); */ + + switch (cmd) { + + case TOUCH_IOCTL_GET_DEBUGMSG_STATE: + ret = m_ts_debug_mode; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_SET_DEBUGMSG_STATE: + if (copy_from_user(&nval, argp, 4)) { + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + if (nval) + printk(KERN_INFO "[zinitix_touch] on debug mode (%d)\n", + nval); + else + printk(KERN_INFO "[zinitix_touch] off debug mode (%d)\n", + nval); + m_ts_debug_mode = nval; + break; + + case TOUCH_IOCTL_GET_CHIP_REVISION: + ret = misc_touch_dev->cap_info.chip_revision; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_FW_VERSION: + ret = misc_touch_dev->cap_info.chip_firmware_version; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_REG_DATA_VERSION: + ret = misc_touch_dev->cap_info.chip_reg_data_version; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_VARIFY_UPGRADE_SIZE: + if (copy_from_user(&sz, argp, sizeof(size_t))) + return -1; + + printk(KERN_INFO "[zinitix_touch] firmware size = %d\r\n", sz); + if (misc_touch_dev->cap_info.chip_fw_size != sz) { + printk(KERN_INFO "[zinitix_touch] firmware size error\r\n"); + return -1; + } + break; + + case TOUCH_IOCTL_VARIFY_UPGRADE_DATA: + if (copy_from_user(&m_firmware_data[2], + argp, misc_touch_dev->cap_info.chip_fw_size)) + return -1; + + version = + (u16)(((u16)m_firmware_data[FIRMWARE_VERSION_POS+1]<<8) + |(u16)m_firmware_data[FIRMWARE_VERSION_POS]); + + printk(KERN_INFO "[zinitix_touch] firmware version = %x\r\n", version); + + if (copy_to_user(argp, &version, sizeof(version))) + return -1; + break; + + case TOUCH_IOCTL_START_UPGRADE: + disable_irq(misc_touch_dev->irq); + down(&misc_touch_dev->work_proceedure_lock); + misc_touch_dev->work_proceedure = TS_IN_UPGRADE; + + if (misc_touch_dev->use_esd_timer) + ts_esd_timer_stop(misc_touch_dev); + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(misc_touch_dev); + + printk(KERN_INFO "[zinitix_touch] start upgrade firmware\n"); + if (ts_upgrade_firmware(misc_touch_dev, + &m_firmware_data[2], + misc_touch_dev->cap_info.chip_fw_size) == false) { + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + if (ts_init_touch(misc_touch_dev) == false) { + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + + if (misc_touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, + misc_touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } + + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + break; + + case TOUCH_IOCTL_GET_X_RESOLUTION: + ret = misc_touch_dev->cap_info.x_resolution; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_Y_RESOLUTION: + ret = misc_touch_dev->cap_info.y_resolution; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_X_NODE_NUM: + ret = misc_touch_dev->cap_info.x_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_Y_NODE_NUM: + ret = misc_touch_dev->cap_info.y_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_TOTAL_NODE_NUM: + ret = misc_touch_dev->cap_info.total_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_HW_CALIBRAION: + ret = -1; + disable_irq(misc_touch_dev->irq); + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"[zinitix_touch] other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_HW_CALIBRAION; + + touch_delay(100); + /* h/w calibration */ + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 0x07) != I2C_SUCCESS) + goto fail_hw_cal; + touch_delay(250); + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_hw_cal; + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hw_cal; + touch_delay(10); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + /* wait for h/w calibration */ + do { + touch_delay(1000); + if (ts_read_data(misc_touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_hw_cal; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", + chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + } while (1); + + + touch_delay(10); + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + goto fail_hw_cal; + touch_delay(500); + + ret = 0; +fail_hw_cal: + if (misc_touch_dev->raw_mode_flag == TOUCH_NORMAL_MODE) + mode = TOUCH_MODE; + else + mode = misc_touch_dev->raw_mode_flag; + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, mode) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] fail to set touch mode %d.\n", + mode); + goto fail_hw_cal2; + } + + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hw_cal2; + + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; +fail_hw_cal2: + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return -1; + + case TOUCH_IOCTL_SET_RAW_DATA_MODE: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"[zinitix_touch] other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + + if (copy_from_user(&nval, argp, 4)) { + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\r\n"); + misc_touch_dev->work_proceedure = TS_NO_WORK; + return -1; + } + + zinitix_debug_msg("[zinitix_touch] touchkey_testmode = %d\r\n", + misc_touch_dev->raw_mode_flag); + + if (nval == TOUCH_NORMAL_MODE && + misc_touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { + /* enter into normal mode */ + misc_touch_dev->raw_mode_flag = nval; + printk(KERN_INFO "[zinitix_touch] raw data mode exit\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ*ZINITIX_ESD_TIMER_INTERVAL) + != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_PERIODICAL_INTERRUPT_INTERVAL.\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] fail to set TOUCH_MODE.\r\n"); + + /* clear garbage data */ + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + touch_delay(100); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } else if (nval != TOUCH_NORMAL_MODE) { + /* enter into test mode*/ + misc_touch_dev->raw_mode_flag = nval; + printk(KERN_INFO "[zinitix_touch] raw data mode enter\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) + != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, + misc_touch_dev->raw_mode_flag) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] raw data mode : Fail to set TOUCH_MODE %d.\n", + misc_touch_dev->raw_mode_flag); + + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + /* clear garbage data */ + touch_delay(100); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return 0; + + case TOUCH_IOCTL_GET_REG: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "[zinitix_touch] other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + + if (copy_from_user(®_ioctl, + argp, sizeof(struct _reg_ioctl))) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (ts_read_data(misc_touch_dev->client, + reg_ioctl.addr, (u8 *)&val, 2) < 0) + ret = -1; + + nval = (int)val; + + if (copy_to_user(reg_ioctl.val, (u8 *)&nval, 4)) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_to_user\n"); + return -1; + } + + zinitix_debug_msg("read : reg addr = 0x%x, val = 0x%x\n", + reg_ioctl.addr, nval); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_SET_REG: + + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "[zinitix_touch] other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + if (copy_from_user(®_ioctl, + argp, sizeof(struct _reg_ioctl))) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (copy_from_user(&val, reg_ioctl.val, 4)) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (ts_write_reg(misc_touch_dev->client, + reg_ioctl.addr, val) != I2C_SUCCESS) + ret = -1; + + zinitix_debug_msg("write : reg addr = 0x%x, val = 0x%x\r\n", + reg_ioctl.addr, val); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_DONOT_TOUCH_EVENT: + + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"[zinitix_touch] other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + ret = -1; + zinitix_debug_msg("write : reg addr = 0x%x, val = 0x0\r\n", + ZINITIX_INT_ENABLE_FLAG); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_SEND_SAVE_STATUS: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"[zinitix_touch] other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + ret = 0; + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_SAVE_STATUS_CMD) != I2C_SUCCESS) + ret = -1; + touch_delay(1000); /* for fusing eeprom */ + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_GET_RAW_DATA: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + + if (misc_touch_dev->raw_mode_flag == TOUCH_NORMAL_MODE) + return -1; + + down(&misc_touch_dev->raw_data_lock); + if (misc_touch_dev->update == 0) { + up(&misc_touch_dev->raw_data_lock); + return -2; + } + + if (copy_from_user(&raw_ioctl, + argp, sizeof(raw_ioctl))) { + up(&misc_touch_dev->raw_data_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\r\n"); + return -1; + } + + misc_touch_dev->update = 0; + + u8Data = (u8 *)&misc_touch_dev->cur_data[0]; + if (misc_touch_dev->raw_mode_flag == TOUCH_ZINITIX_CAL_N_MODE) { + + + j = 0; + total_cal_n = + misc_touch_dev->cap_info.total_cal_n; + if (total_cal_n == 0) + total_cal_n = 160; + div_node = + (u8)misc_touch_dev->cap_info.max_y_node; + if (div_node == 0) + div_node = 16; + u8Data = (u8 *)&misc_touch_dev->cur_data[0]; + for (i = 0; i < total_cal_n*2; i++) { + if (i%div_node < + misc_touch_dev->cap_info.y_node_num) { + misc_touch_dev->ref_data[j] = + (u16)u8Data[i]; + j++; + } + } + + u8Data = (u8 *)&misc_touch_dev->ref_data[0]; + } + + if (copy_to_user(raw_ioctl.buf, (u8 *)u8Data, + raw_ioctl.sz)) { + up(&misc_touch_dev->raw_data_lock); + return -1; + } + + up(&misc_touch_dev->raw_data_lock); + return 0; + + default: + break; + } + return 0; +} + +#endif /* USE_TEST_RAW_TH_DATA_MODE */ + +static int zinitix_regulator(void) +{ + int err; + + tsp_regulator_18 = regulator_get(NULL, REGU_NAME_TP1); + if (IS_ERR(tsp_regulator_18)) { + pr_err("zinitix:could not get 1.8v regulator\n"); + return -1; + } + err = regulator_set_voltage(tsp_regulator_18,1800000,1800000); + if (err) + pr_err("zinitix:could not set to 1800mv.\n"); + + + tsp_regulator_33 = regulator_get(NULL, REGU_NAME_TP); + if (IS_ERR(tsp_regulator_33)) { + pr_err("zinitix:could not get 3.3v regulator\n"); + return -1; + } + err =regulator_set_voltage(tsp_regulator_33,3000000,3000000); + if (err) + pr_err("zinitix:could not set to 3300mv.\n"); + return 0; +} + +static int zinitix_touch_probe(struct i2c_client *client, + const struct i2c_device_id *i2c_id) +{ + int ret = 0; + struct zinitix_touch_dev *touch_dev; + int i; + + zinitix_regulator(); + + zinitix_debug_msg("zinitix_touch_probe+\r\n"); + + + zinitix_debug_msg("Above BT4x3 Driver\r\n"); + + printk(KERN_INFO "[zinitix touch] driver version = %s\r\n", + TS_DRVIER_VERSION); + + +#ifdef ABS_MT_TRACKING_ID + printk(KERN_INFO "[zinitix touch] use tracking id\r\n"); +#endif + + if (strcmp(client->name, ZINITIX_ISP_NAME) == 0) { + printk(KERN_INFO "[zinitix_touch] isp client probe \r\n"); + m_isp_client = client; + return 0; + } + touch_ctrl_regulator(1); + mdelay(CHIP_ON_DELAY); + mdelay(500); + firmware_touch_ctrl_regulator(0); + mdelay(1000); + firmware_touch_ctrl_regulator(1); + mdelay(CHIP_ON_DELAY); + mdelay(500); + + zinitix_debug_msg("i2c check function \r\n"); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_ERR "[zinitix_touch] error : not compatible i2c function \r\n"); + ret = -ENODEV; + goto err_check_functionality; + } + + zinitix_debug_msg("touch data alloc \r\n"); + touch_dev = kzalloc(sizeof(struct zinitix_touch_dev), GFP_KERNEL); + if (!touch_dev) { + printk(KERN_ERR "[zinitix_touch] unabled to allocate touch data \r\n"); + ret = -ENOMEM; + goto err_alloc_dev_data; + } + touch_dev->client = client; + i2c_set_clientdata(client, touch_dev); + + g_touch_dev = touch_dev; + + + + + zinitix_debug_msg("allocate input device \r\n"); + touch_dev->input_dev = input_allocate_device(); + if (touch_dev->input_dev == 0) { + printk(KERN_ERR "[zinitix_touch] unabled to allocate input device \r\n"); + ret = -ENOMEM; + goto err_input_allocate_device; + } + + /* initialize zinitix touch ic */ + gpio_request(GPIO_TOUCH_PIN_NUM,"zinitix_irq" ); + touch_dev->int_gpio_num = GPIO_TOUCH_PIN_NUM;//client->irq; /* for upgrade */ + + memset(&touch_dev->reported_touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + +#if USE_TEST_RAW_TH_DATA_MODE + /* not test mode */ + touch_dev->raw_mode_flag = TOUCH_NORMAL_MODE; +#endif + if(ts_init_touch(touch_dev) == false) { + goto err_input_register_device; + } + touch_dev->use_esd_timer = 0; + + INIT_WORK(&touch_dev->tmr_work, zinitix_touch_tmr_work); + zinitix_tmr_workqueue = + create_singlethread_workqueue("zinitix_tmr_workqueue"); + if (!zinitix_tmr_workqueue) { + printk(KERN_ERR "[zinitix_touch] unabled to create touch tmr work queue \r\n"); + ret = -1; + goto err_kthread_create_failed; + } + + if (ZINITIX_ESD_TIMER_INTERVAL) { + touch_dev->use_esd_timer = 1; + ts_esd_timer_init(touch_dev); + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + printk(KERN_INFO " [zinitix_touch] ts_esd_timer_start\n"); + } + + + sprintf(touch_dev->phys, "input(ts)"); + touch_dev->input_dev->name = ZINITIX_DRIVER_NAME; + touch_dev->input_dev->id.bustype = BUS_I2C; + touch_dev->input_dev->id.vendor = 0x0001; + touch_dev->input_dev->phys = touch_dev->phys; + touch_dev->input_dev->id.product = 0x0002; + touch_dev->input_dev->id.version = 0x0100; + + set_bit(EV_SYN, touch_dev->input_dev->evbit); + set_bit(EV_KEY, touch_dev->input_dev->evbit); + set_bit(BTN_TOUCH, touch_dev->input_dev->keybit); + set_bit(EV_ABS, touch_dev->input_dev->evbit); + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + set_bit(BUTTON_MAPPING_KEY[i], touch_dev->input_dev->keybit); + + set_bit(KEY_POWER, touch_dev->input_dev->keybit); + + if (touch_dev->cap_info.Orientation & TOUCH_XY_SWAP) { + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_Y, + touch_dev->cap_info.MinX, + touch_dev->cap_info.MaxX + ABS_PT_OFFSET, + 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_X, + touch_dev->cap_info.MinY, + touch_dev->cap_info.MaxY + ABS_PT_OFFSET, + 0, 0); + } else { + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_X, + touch_dev->cap_info.MinX, + touch_dev->cap_info.MaxX + ABS_PT_OFFSET, + 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_Y, + touch_dev->cap_info.MinY, + touch_dev->cap_info.MaxY + ABS_PT_OFFSET, + 0, 0); + } + + input_set_abs_params(touch_dev->input_dev, ABS_TOOL_WIDTH, + 0, 255, 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_TOUCH_MAJOR, + 0, 255, 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_WIDTH_MAJOR, + 0, 255, 0, 0); + +#ifdef ABS_MT_TRACKING_ID + input_set_abs_params(touch_dev->input_dev, ABS_MT_TRACKING_ID, + 0, touch_dev->cap_info.multi_fingers, 0, 0); +#endif + + + zinitix_debug_msg("register %s input device \r\n", + touch_dev->input_dev->name); + ret = input_register_device(touch_dev->input_dev); + if (ret) { + printk(KERN_ERR "[zinitix_touch] unable to register %s input device\r\n", + touch_dev->input_dev->name); + goto err_input_register_device; + } + + /* configure touchscreen interrupt gpio */ + + touch_dev->int_gpio_num = GPIO_TOUCH_PIN_NUM; + +#if 0 //GPIO_TOUCH_IRQ + touch_dev->irq = GPIO_TOUCH_IRQ; +#else + + printk("First check : touch_dev->irq : %d, touch_dev->client->irq : %d\n",touch_dev->irq,touch_dev->client->irq); + touch_dev->irq = gpio_to_irq(GPIO_TOUCH_PIN_NUM); + touch_dev->client->irq = touch_dev->irq; + + printk("touch_dev->irq : %d, touch_dev->client->irq : %d\n",touch_dev->irq,touch_dev->client->irq); + if (touch_dev->irq <= 0) + printk(KERN_INFO "[zinitix_touch] error. gpio_to_irq(..) function is not \ + supported? you should define GPIO_TOUCH_IRQ.\r\n"); +#endif + zinitix_debug_msg("request irq (irq = %d, pin = %d) \r\n", + touch_dev->client->irq, touch_dev->int_gpio_num); + + touch_dev->work_proceedure = TS_NO_WORK; + sema_init(&touch_dev->work_proceedure_lock, 1); + + if (touch_dev->client->irq) { + ret = request_threaded_irq(touch_dev->client->irq, NULL, zinitix_touch_work, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "zinitix_ts", touch_dev); + if (ret) { + printk(KERN_ERR "[zinitix_touch] [zinitix_touch] unable to register irq.(%s)\r\n", touch_dev->input_dev->name); + goto err_request_irq; + } + } + dev_info(&client->dev, "zinitix touch probe.\r\n"); + +#ifdef CONFIG_HAS_EARLYSUSPEND + touch_dev->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + touch_dev->early_suspend.suspend = zinitix_early_suspend; + touch_dev->early_suspend.resume = zinitix_late_resume; + register_early_suspend(&touch_dev->early_suspend); +#endif + +#if USE_TEST_RAW_TH_DATA_MODE + sema_init(&touch_dev->raw_data_lock, 1); + + misc_touch_dev = touch_dev; + + ret = misc_register(&touch_misc_device); + if (ret) + zinitix_debug_msg("Fail to register touch misc device.\n"); + + if (device_create_file(touch_misc_device.this_device, + &dev_attr_get_touch_raw_data) < 0) + printk(KERN_INFO "[zinitix_touch] Failed to create device file(%s)!\n", + dev_attr_get_touch_raw_data.attr.name); + +#endif + + /* sys fs */ + touch_class = class_create(THIS_MODULE, "touch"); + if (IS_ERR(touch_class)) + pr_err("[TSP] Failed to create class(touch)!\n"); + firmware_dev = device_create(touch_class, NULL, 0, NULL, "firmware"); + if (IS_ERR(firmware_dev)) + pr_err("[TSP] Failed to create device(firmware)!\n"); + if (device_create_file(firmware_dev, &dev_attr_firmware) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_firmware.attr.name); + if (device_create_file(firmware_dev, &dev_attr_firmware_ver) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_firmware_ver.attr.name); + if (device_create_file(firmware_dev, &dev_attr_firmware_ret) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_firmware_ret.attr.name); + if (device_create_file(firmware_dev, &dev_attr_phone_fw_ver) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_phone_fw_ver.attr.name); + if (device_create_file(firmware_dev, &dev_attr_part_fw_ver) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_part_fw_ver.attr.name); + if (device_create_file(firmware_dev, &dev_attr_threshold_fw_ver) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_threshold_fw_ver.attr.name); + if (device_create_file(firmware_dev, &dev_attr_config_fw_ver) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_config_fw_ver.attr.name); + if (device_create_file(firmware_dev, &dev_attr_fw_upstatus) < 0) + pr_err("[TSP] Failed to create device file(%s)!\n", dev_attr_fw_upstatus.attr.name); + if (device_create_file(firmware_dev, &dev_attr_raw_enable) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_raw_enable.attr.name); + if (device_create_file(firmware_dev, &dev_attr_raw_disable) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_raw_disable.attr.name); + if (device_create_file(firmware_dev, &dev_attr_raw_value) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_raw_value.attr.name); + if (device_create_file(firmware_dev, &dev_attr_node_read) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_node_read.attr.name); + if (device_create_file(firmware_dev, &dev_attr_ncount_read) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_ncount_read.attr.name); + if (device_create_file(firmware_dev, &dev_attr_touchkey_read) < 0) + pr_err("Failed to create device file(%s)!\n", dev_attr_touchkey_read.attr.name); + /* sys fs */ + + return 0; + +err_request_irq: + input_unregister_device(touch_dev->input_dev); +err_input_register_device: + input_free_device(touch_dev->input_dev); +err_kthread_create_failed: +err_input_allocate_device: + kfree(touch_dev); +err_alloc_dev_data: +err_check_functionality: + + return ret; +} + + +static int zinitix_touch_remove(struct i2c_client *client) +{ + struct zinitix_touch_dev *touch_dev = i2c_get_clientdata(client); + + zinitix_debug_msg("zinitix_touch_remove+ \r\n"); + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK) + flush_work(&touch_dev->work); + + touch_dev->work_proceedure = TS_REMOVE_WORK; + + if (touch_dev->use_esd_timer != 0) { + flush_work(&touch_dev->tmr_work); + ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, 0); + ts_esd_timer_stop(touch_dev); + zinitix_debug_msg(KERN_INFO " ts_esd_timer_stop\n"); + destroy_workqueue(zinitix_tmr_workqueue); + } + + if (touch_dev->irq) + free_irq(touch_dev->irq, touch_dev); + +#if USE_TEST_RAW_TH_DATA_MODE + device_remove_file(touch_misc_device.this_device, + &dev_attr_get_touch_raw_data); + misc_deregister(&touch_misc_device); +#endif + + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&touch_dev->early_suspend); +#endif + + destroy_workqueue(zinitix_workqueue); + + if (gpio_is_valid(touch_dev->int_gpio_num) != 0) + gpio_free(touch_dev->int_gpio_num); + + input_unregister_device(touch_dev->input_dev); + input_free_device(touch_dev->input_dev); + up(&touch_dev->work_proceedure_lock); + kfree(touch_dev); + + return 0; +} + +static int __devinit zinitix_touch_init(void) +{ +#if TOUCH_USING_ISP_METHOD + m_isp_client = NULL; +#endif + + printk("[zinitix_touch] zinitix_touch_init ! \n"); +// touch_regulator_2_9 = regulator_get(NULL,"touch_vcc_2.9v"); +// touch_regulator_3_3 = regulator_get(NULL,"touch_vcc_3.3v"); + + //board_sysconfig(SYSCFG_TOUCH, SYSCFG_INIT); + + m_isp_client = NULL; + return i2c_add_driver(&zinitix_touch_driver); +} + +static void __exit zinitix_touch_exit(void) +{ + i2c_del_driver(&zinitix_touch_driver); +} + +static ssize_t phone_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + zinitix_debug_msg("[TSP] %s\n",__func__); + + int HW_ver; + int phone_ver; + int ic_ver; + + HW_ver = g_touch_dev->cap_info.chip_revision; + ic_ver = g_touch_dev->cap_info.chip_reg_data_version; + phone_ver = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + sprintf(buf, "%02x\n", phone_ver); + + return sprintf(buf, "%s", buf ); +} + +static ssize_t firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + u16 phone_version; + u16 hw_version; + u16 chip_revision; + + printk("[zinitix_touch] %s\n",__func__); + + /* get chip firmware version */ + //phone_version = g_touch_dev->cap_info.chip_firmware_version; + /* get chip revision id */ + if (ts_read_data(g_touch_dev->client, ZINITIX_CHIP_REVISION, (u8 *)&chip_revision, 2) < 0) { + printk(KERN_INFO "[zinitix_touch] fail to read chip revision\r\n"); + } + printk(KERN_INFO "[zinitix_touch] zinitix touch chip revision id = %x\r\n", chip_revision); + + if (ts_read_data(g_touch_dev->client, ZINITIX_DATA_VERSION_REG, (u8*)&phone_version, 2)<0){ + printk(KERN_INFO "[zinitix_touch] fail to read chip revision\r\n"); + } + printk(KERN_INFO "[zinitix_touch] zinitix touch chip firmware version = %x\r\n", phone_version); + + if (ts_read_data(g_touch_dev->client, ZINITIX_TSP_TYPE, (u8*)&hw_version, 2)<0){ + printk(KERN_INFO "[zinitix_touch] fail to read chip revision\r\n"); + } + printk(KERN_INFO "[zinitix_touch] zinitix touch chip firmware version = %x\r\n", hw_version); + sprintf(buf, "10%x0%x0%x\n", hw_version, phone_version, PHONE_FW_VER); + + printk("[zinitix_touch] %s\n", buf); + + return sprintf(buf, "%s", buf); +} +static ssize_t part_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + zinitix_debug_msg("[zinitix_touch] %s\n",__func__); + + int HW_ver; + int phone_ver; + int ic_ver; + + HW_ver = g_touch_dev->cap_info.chip_revision; + ic_ver = g_touch_dev->cap_info.chip_reg_data_version; + phone_ver = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + sprintf(buf, "%02x\n",ic_ver); + + return sprintf(buf, "%s", buf ); +} + +static ssize_t threshold_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + zinitix_debug_msg("[zinitix_touch] %s\n",__func__); + + int HW_ver; + int phone_ver; + int ic_ver; + + HW_ver = g_touch_dev->cap_info.chip_revision; + ic_ver = g_touch_dev->cap_info.chip_reg_data_version; + phone_ver = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + sprintf(buf, "%02x\n", 0x300); + printk("[zinitix_touch] threshold_firmware_show : %02x\n", 0x300); + return sprintf(buf, "%s", buf ); +} + +static ssize_t config_firmware_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + zinitix_debug_msg("[zinitix_touch] %s\n",__func__); + + int HW_ver; + int phone_ver; + int ic_ver; + + HW_ver = g_touch_dev->cap_info.chip_revision; + ic_ver = g_touch_dev->cap_info.chip_reg_data_version; + phone_ver = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + //zinitix_debug_msg("chip_revision : %d, HW_ver = %d\n", g_touch_dev->cap_info.chip_revision, HW_ver); // 0xb , 11 + //zinitix_debug_msg("chip_firmware_version : %d, phone_ver = %d\n", g_touch_dev->cap_info.chip_firmware_version, phone_ver); //0x102, 258 + //zinitix_debug_msg("phone(m_firmware_data[0]) = %d\n", m_firmware_data[0]); + + // sprintf(buf, "0%d\n", (HW_ver*100000) + (phone_ver*1000)+(ic_ver*10)); + sprintf(buf, "%02x\n", HW_ver); + + return sprintf(buf, "%s", buf ); +} + +static ssize_t firmware_ret_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i; + u16 chip_eeprom_info; + + printk("[zinitix_touch] %s\n",__func__); + sprintf(IsfwUpdate,"%s\n",FW_DOWNLOADING); + + + disable_irq(g_touch_dev->irq); + down(&g_touch_dev->work_proceedure_lock); + g_touch_dev->work_proceedure = TS_IN_UPGRADE; +#if ZINITIX_ESD_TIMER_INTERVAL + if(g_touch_dev->use_esd_timer) + { + ts_esd_timer_stop(g_touch_dev); + } +#endif + + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(g_touch_dev); + + g_touch_dev->cap_info.chip_fw_size = 32*1024; + + + for(i=0; i < 5; i++) { + zinitix_debug_msg("[zinitix touch] manual upgrade count = %d\r\n", i); + if( ts_upgrade_firmware(g_touch_dev, &m_firmware_data[2], + g_touch_dev->cap_info.chip_fw_size) == true) + break; + } + if(i >= 5) + { + zinitix_debug_msg("[zinitix touch] failed to manual upgrade\r\n"); + return sprintf(buf, "%d", -1 ); + //return sprintf(buf, "%s", "fail!!\n" ); + } else { + // hw calibration and make checksum + zinitix_debug_msg("HW calibration 1 !!! \r\n"); + if (ts_write_reg(g_touch_dev->client, ZINITIX_TOUCH_MODE, 0x07) != I2C_SUCCESS) + goto fail_hwcal_init; + zinitix_debug_msg("HW calibration 2 !!! \r\n"); + if (ts_write_cmd(g_touch_dev->client, ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + zinitix_debug_msg("HW calibration 3 !!! \r\n"); + if (ts_write_cmd(g_touch_dev->client, ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + mdelay(100); + ts_write_cmd(g_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(100); + ts_write_cmd(g_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(100); + ts_write_cmd(g_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(100); + /* wait for h/w calibration*/ + do { + mdelay(1000); + if (ts_read_data(g_touch_dev->client, ZINITIX_EEPROM_INFO_REG, (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_hwcal_init; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + } while (1); + zinitix_debug_msg("HW calibration 4 !!! \r\n"); + if (ts_write_reg(g_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + goto fail_hwcal_init; + mdelay(10); + zinitix_debug_msg("HW calibration 5 !!! \r\n"); + if (ts_write_cmd(g_touch_dev->client, ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + + mdelay(10); + zinitix_debug_msg("HW calibration 6 !!! \r\n"); + if (ts_write_cmd(g_touch_dev->client, ZINITIX_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + goto fail_hwcal_init; + mdelay(1000); + } + + if(ts_init_touch(g_touch_dev)==false) + { + enable_irq(g_touch_dev->irq); + g_touch_dev->work_proceedure = TS_NO_WORK; + up(&g_touch_dev->work_proceedure_lock); + zinitix_debug_msg("\n[TSP] fail firmware_update\n"); + return sprintf(buf, "%d", -1 ); + //return sprintf(buf, "%s", "fail!!\n" ); + } + + enable_irq(g_touch_dev->irq); + g_touch_dev->work_proceedure = TS_NO_WORK; + up(&g_touch_dev->work_proceedure_lock); + sprintf(IsfwUpdate,"%s\n",FW_DOWNLOAD_COMPLETE); + zinitix_debug_msg("\n[TSP] success firmware_update\n"); + return sprintf(buf, "%d", 1 ); + //return sprintf(buf, "%s", "success!!\n" ); + +fail_hwcal_init: +#if ZINITIX_ESD_TIMER_INTERVAL + if(g_touch_dev->use_esd_timer) + { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, g_touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } +#endif + enable_irq(g_touch_dev->irq); + g_touch_dev->work_proceedure = TS_NO_WORK; + up(&g_touch_dev->work_proceedure_lock); + sprintf(IsfwUpdate,"%s\n",FW_DOWNLOAD_FAIL); + zinitix_debug_msg("\n[TSP] fail firmware_update\n"); + return sprintf(buf, "%d", -1 ); + //return sprintf(buf, "%s", "fail!!\n" ); + +} +static ssize_t firmware_update_status(struct device *dev, struct device_attribute *attr, char *buf) +{ + zinitix_debug_msg("[zinitix_touch] %s\n",__func__); + + return sprintf(buf, "%s\n", IsfwUpdate); +} + +static int16_t zinitix_raw_data[X_RAW_DATA][Y_RAW_DATA] = {0}; +static int8_t zinitix_ncount_data[X_RAW_DATA][Y_RAW_DATA] = {0}; + +static ssize_t zinitix_enter_testmode(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk(KERN_INFO "[zinitix_touch] %s 111 name : %s\r\n", __FUNCTION__, misc_touch_dev->client->name); + + if(misc_touch_dev == NULL) + { + zinitix_debug_msg("device NULL : NULL\n"); + return snprintf(buf, 2, "-1"); + } + + down(&misc_touch_dev->raw_data_lock); + misc_touch_dev->raw_mode_flag = TOUCH_TEST_RAW_MODE; + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_TEST_RAW_MODE)!=I2C_SUCCESS) + { + printk(KERN_INFO "[zinitix_touch] TEST Mode : Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_TEST_RAW_MODE); + } + + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + // clear garbage data + mdelay(100); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + memset(&misc_touch_dev->reported_touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + memset(&misc_touch_dev->touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + + up(&misc_touch_dev->raw_data_lock); + return 1; +} + +static ssize_t zinitix_enter_normalmode(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk(KERN_INFO "[zinitix_touch] %s\r\n", __FUNCTION__); + + if(misc_touch_dev == NULL) +{ + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + down(&misc_touch_dev->raw_data_lock); + misc_touch_dev->raw_mode_flag = TOUCH_NORMAL_MODE; + + printk(KERN_INFO "[zinitix_touch] TEST Mode Exit\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_PERIODICAL_INTERRUPT_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_MODE)!=I2C_SUCCESS) + { + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_MODE); + } + // clear garbage data + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(100); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + + up(&misc_touch_dev->raw_data_lock); + return 1; +} + +static ssize_t rawdata_pass_fail_zinitix(struct device *dev, struct device_attribute *attr, char *buf) +{ + int time_out = 0; + int i,j; + int interrup_detecting; + int written_bytes = 0; /* error check */ + + int phone_ver; + int ic_ver; + + + int16_t raw_data[X_RAW_DATA][Y_RAW_DATA] = {{0,},}; // 2 byte + + printk(KERN_INFO "[zinitix_touch] zinitix_read_raw_data( )\r\n"); + disable_irq(misc_touch_dev->client->irq); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 7) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + udelay(10); + + for (i = 0; i < INT_WAIT_TIME; i++) { + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + time_out = 0; + interrup_detecting = 1; + + while (gpio_get_value(misc_touch_dev->int_gpio_num)) { + msleep(1); + + if (time_out++ > 20) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + interrup_detecting = 0; + break; + } + } + if (i == INT_WAIT_TIME) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + goto fail_read_raw; + } + + if ((interrup_detecting == 1) && (time_out < 20)) { + if (ts_read_raw_data(misc_touch_dev->client, + ZINITIX_RAWDATA_REG, (char *)raw_data, + MAX_TEST_RAW_DATA*2) < 0) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_RAWDATA_REG fail\r\n"); + goto fail_read_raw; + } + memcpy(zinitix_raw_data, raw_data, MAX_TEST_RAW_DATA*2); +#ifdef ZINITIX_N_TEST + for (j = 0; j < (MAX_TEST_RAW_DATA*2); j++) { + printk(KERN_INFO "[zinitix_touch] temp_buff[%d]" + "= %5d\r\n", j, zinitix_raw_data[j]); + } +#endif + break; + } + } + + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + printk(KERN_CONT "[zinitix_touch] "); + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) + printk(KERN_CONT " %5d", raw_data[i][j]); + printk(KERN_CONT "\n"); + } + + // TSP ndata + for (i = 0; i < misc_touch_dev->cap_info.x_node_num-1; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + if (raw_data[i][j] < CAL_MIN_NUM) + { + printk("[zinitix1] : returned by -> raw_data[%d][%d] %5d \n", i, j, raw_data[i][j]); + return snprintf(buf, 2, "0"); // fail + } + + if (raw_data[i][j] > CAL_MAX_NUM) + { + printk("[zinitix2] : returned by -> raw_data[%d][%d] %5d \n", i, j, raw_data[i][j]); + return snprintf(buf, 2, "0"); // fail + } + } + } + + // TOUCH KEY ndata + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + if ((j == 1) || (j == 8)) { + if (raw_data[misc_touch_dev->cap_info.x_node_num-1][j] < CAL_MIN_NUM) + { + printk("[zinitix3] : returned by -> raw_data[%d][%d] %5d \n", misc_touch_dev->cap_info.x_node_num-1, j, raw_data[misc_touch_dev->cap_info.x_node_num-1][j]); + return snprintf(buf, 2, "0"); // fail + } + + if (raw_data[misc_touch_dev->cap_info.x_node_num-1][j] > CAL_MAX_NUM) + { + printk("[zinitix4] : returned by -> raw_data[%d][%d] %5d \n", misc_touch_dev->cap_info.x_node_num-1, j, raw_data[misc_touch_dev->cap_info.x_node_num-1][j]); + return snprintf(buf, 2, "0"); // fail + } + } + } + + + ic_ver = g_touch_dev->cap_info.chip_reg_data_version; + phone_ver = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + zinitix_debug_msg("phone_ver = %d, ic_ver = %d\n",phone_ver,ic_ver); + + if(phone_ver != ic_ver) + return snprintf(buf, 2, "0"); // fail + + + return snprintf(buf, 2, "1"); // success + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + written_bytes += sprintf(buf+written_bytes, "%d,",raw_data[i][j]); + } + } + + printk("[zinitix_touch] written_bytes = %d \n",written_bytes); + if(written_bytes > 0) + return written_bytes; +fail_read_raw: + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + return snprintf(buf, 2, "-1"); + } + +static ssize_t scantime_zinitix(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int i, j; + int written_bytes = 0; /* error check */ + + u8 raw_data[20][16] = {{0,},}; + u8 scantime_data[X_RAW_DATA][Y_RAW_DATA] = {{0,},}; + + printk(KERN_INFO "[zinitix_touch] scantime_zinitix( )\r\n"); + disable_irq(misc_touch_dev->client->irq); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 8) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + msleep(100); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + + if (ts_read_raw_data(misc_touch_dev->client, + ZINITIX_RAWDATA_REG, (char *)raw_data, 320) < 0) { + printk(KERN_INFO "error : read zinitix tc Cal N raw data\n"); + goto fail_read_raw; + } + msleep(10); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + msleep(10); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + msleep(10); + + enable_irq(misc_touch_dev->client->irq); + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + printk(KERN_CONT "[TSP]"); + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + scantime_data[i][j] = raw_data[i][j]; + printk(KERN_CONT " %d", scantime_data[i][j]); + } + printk(KERN_CONT "\n"); + } + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + written_bytes += sprintf(buf+written_bytes, ",%5d", raw_data[i][j]) ; + } + } + + if (written_bytes > 0) + { + return written_bytes;} + + return snprintf(buf, 2, "-1"); + +fail_read_raw: + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + return snprintf(buf, 2, "-1"); +} + +static ssize_t read_node(struct device *dev, struct device_attribute *attr, char *buf) +{ + + int time_out = 0; + int i,j; + int interrup_detecting; + int written_bytes = 0; /* error check */ + + int16_t raw_data[X_RAW_DATA][Y_RAW_DATA] = {{0,},}; // 2 byte + + printk(KERN_INFO "[zinitix_touch] zinitix_read_raw_data( )\r\n"); + disable_irq(misc_touch_dev->client->irq); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 7) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + udelay(10); + + for (i = 0; i < INT_WAIT_TIME; i++) { + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + time_out = 0; + interrup_detecting = 1; + + while (gpio_get_value(misc_touch_dev->int_gpio_num)) { + msleep(1); + + if (time_out++ > 20) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + interrup_detecting = 0; + break; + } + } + if (i == INT_WAIT_TIME) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + goto fail_read_raw; + } + + if ((interrup_detecting == 1) && (time_out < 20)) { + if (ts_read_raw_data(misc_touch_dev->client, + ZINITIX_RAWDATA_REG, (char *)raw_data, + MAX_TEST_RAW_DATA*2) < 0) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_RAWDATA_REG fail\r\n"); + goto fail_read_raw; + } + memcpy(zinitix_raw_data, raw_data, MAX_TEST_RAW_DATA*2); +#ifdef ZINITIX_N_TEST + for (j = 0; j < (MAX_TEST_RAW_DATA*2); j++) { + printk(KERN_INFO "[zinitix_touch] temp_buff[%d]" + "= %5d\r\n", j, zinitix_raw_data[j]); + } +#endif + break; + } + } + + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + printk(KERN_CONT "[zinitix_touch] "); + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) + printk(KERN_CONT " %5d", raw_data[i][j]); + printk(KERN_CONT "\n"); + } + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + written_bytes += sprintf(buf+written_bytes, ",%5d", raw_data[i][j]) ; + } + } + + printk("[zinitix_touch] written_bytes = %d \n",written_bytes); + if(written_bytes > 0) + return written_bytes; + +fail_read_raw: + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + return 1; + +} + +static ssize_t read_touchkey(struct device *dev, struct device_attribute *attr, char *buf) +{ + + int time_out = 0; + int i,j; + int interrup_detecting; + int written_bytes = 0; /* error check */ + + int16_t raw_data[X_RAW_DATA][Y_RAW_DATA] = {{0,},}; // 2 byte + + printk(KERN_INFO "[zinitix_touch] zinitix_read_raw_data( )\r\n"); + disable_irq(misc_touch_dev->client->irq); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 7) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + udelay(10); + + for (i = 0; i < INT_WAIT_TIME; i++) { + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + time_out = 0; + interrup_detecting = 1; + + while (gpio_get_value(misc_touch_dev->int_gpio_num)) { + msleep(1); + + if (time_out++ > 20) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + interrup_detecting = 0; + break; + } + } + if (i == INT_WAIT_TIME) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + goto fail_read_raw; + } + + if ((interrup_detecting == 1) && (time_out < 20)) { + if (ts_read_raw_data(misc_touch_dev->client, + ZINITIX_RAWDATA_REG, (char *)raw_data, + MAX_TEST_RAW_DATA*2) < 0) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_RAWDATA_REG fail\r\n"); + goto fail_read_raw; + } + memcpy(zinitix_raw_data, raw_data, MAX_TEST_RAW_DATA*2); +#ifdef ZINITIX_N_TEST + for (j = 0; j < (MAX_TEST_RAW_DATA*2); j++) { + printk(KERN_INFO "[zinitix_touch] temp_buff[%d]" + "= %5d\r\n", j, zinitix_raw_data[j]); + } +#endif + break; + } + } + + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + + + // TOUCH KEY ndata + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + if ((j == 1) || (j == 8)) { + if (raw_data[misc_touch_dev->cap_info.x_node_num-1][j] < CAL_MIN_NUM) + { + printk("[zinitix3] : returned by -> raw_data[%d][%d] %5d \n", misc_touch_dev->cap_info.x_node_num-1, j, raw_data[misc_touch_dev->cap_info.x_node_num-1][j]); + written_bytes += sprintf(buf+written_bytes, "%5d", raw_data[misc_touch_dev->cap_info.x_node_num-1][j]) ; + } + else + written_bytes += sprintf(buf+written_bytes, "%5d", raw_data[misc_touch_dev->cap_info.x_node_num-1][j]) ; + if (raw_data[misc_touch_dev->cap_info.x_node_num-1][j] > CAL_MAX_NUM) + { + printk("[zinitix4] : returned by -> raw_data[%d][%d] %5d \n", misc_touch_dev->cap_info.x_node_num-1, j, raw_data[misc_touch_dev->cap_info.x_node_num-1][j]); + written_bytes += sprintf(buf+written_bytes, "%5d", raw_data[misc_touch_dev->cap_info.x_node_num-1][j]) ; + } + else + written_bytes += sprintf(buf+written_bytes, "%5d", raw_data[misc_touch_dev->cap_info.x_node_num-1][j]) ; + } + } + + printk("[zinitix_touch] written_bytes = %d \n",written_bytes); + if(written_bytes > 0) + return written_bytes; + +fail_read_raw: + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + enable_irq(misc_touch_dev->client->irq); + return 1; + +} + +module_init(zinitix_touch_init); +module_exit(zinitix_touch_exit); + +MODULE_DESCRIPTION("zinitix touch-screen device driver using i2c interface"); +MODULE_AUTHOR("sohnet "); +MODULE_LICENSE("GPL"); + + diff --git a/drivers/input/touchscreen/zinitix_touch.h b/drivers/input/touchscreen/zinitix_touch.h new file mode 100644 index 00000000..2f0c5d9c --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch.h @@ -0,0 +1,249 @@ +/* + * + * Zinitix touch driver + * + * Copyright (C) 2009 Zinitix, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef ZINITIX_HEADER + +#define ABS_MT_TRACKING_ID 1 + +#define ZINITIX_HEADER + +#define TS_DRVIER_VERSION "3.0.20" + +#define TOUCH_MODE 0 + +/* if you want to use firmware setting, set this value. +interrupt mask / button num / finger num */ +#define USING_CHIP_SETTING 0 + + +/* max 10 */ +#define MAX_SUPPORTED_FINGER_NUM 2 +#define REAL_SUPPORTED_FINGER_NUM 2 + + +/* max 8 */ +#define MAX_SUPPORTED_BUTTON_NUM 8 +#define SUPPORTED_BUTTON_NUM 2 + +/* Upgrade Method*/ +#define TOUCH_ONESHOT_UPGRADE 1 +/* if you use isp mode, you must add i2c device : +name = "zinitix_isp" , addr 0x50*/ + +#define USE_HW_CALIBRATION 1 + +/* resolution offset */ +#define ABS_PT_OFFSET 1 + +#define TOUCH_FORCE_UPGRADE 1 +#define USE_CHECKSUM 0 // BT4x3 only + +#define CHIP_POWER_OFF_DELAY 100 /*ms*/ +#define CHIP_POWER_OFF_AF_FZ_DELAY 250 /*ms*/ +#define CHIP_ON_DELAY 150 /*ms*/ +#define CHIP_ON_AF_FZ_DELAY 250 /*ms*/ +#define DELAY_FOR_SIGNAL_DELAY 30 /*us*/ +#define DELAY_FOR_TRANSCATION 50 +#define DELAY_FOR_POST_TRANSCATION 10 + + +#if !USE_HW_CALIBRATION +#define CALIBRATION_AREA 0x3800 +#endif + +#define FIRMWARE_VERSION_POS 0x6410 + +enum _zinitix_power_control { + POWER_OFF, + POWER_ON, + RESET_LOW, + RESET_HIGH, +}; + +/* Button Enum */ +enum _zinitix_button_event { + ICON_BUTTON_UNCHANGE, + ICON_BUTTON_DOWN, + ICON_BUTTON_UP, +}; + + +/* ESD Protection */ +/*second : if 0, no use. if you have to use, 3 is recommended*/ +#define ZINITIX_ESD_TIMER_INTERVAL 0 +#define ZINITIX_SCAN_RATE_HZ 70 +#define ZINITIX_CHECK_ESD_TIMER 4 + + +/*Test Mode (Monitoring Raw Data) */ +#define USE_TEST_RAW_TH_DATA_MODE 1 +#if USE_TEST_RAW_TH_DATA_MODE + +#define X_RAW_DATA 16 +#define Y_RAW_DATA 10 +#define MAX_TEST_RAW_DATA (X_RAW_DATA*Y_RAW_DATA) // 14 x 10 +#define MAX_TEST_POINT_INFO 3 /* status register + x + y*/ +#define MAX_RAW_DATA \ + (MAX_TEST_RAW_DATA + MAX_TEST_POINT_INFO*MAX_SUPPORTED_FINGER_NUM + 2) +/* preriod raw data interval*/ +#define ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL 1 +#define TOUCH_TEST_RAW_MODE 51 +#define TOUCH_NORMAL_MODE 48 +#define TOUCH_ZINITIX_BASELINED_RAW_MODE 3 +#define TOUCH_ZINITIX_PROCESSED_RAW_MODE 4 +#define TOUCH_ZINITIX_CAL_N_MODE 8 +#define ZINITIX_MENU_KEY 131 +#define ZINITIX_HOME_KEY 134 +#define ZINITIX_BACK_KEY 137 + +#define CAL_MIN_NUM 1360 +#define CAL_MAX_NUM 2040 +#define INT_WAIT_TIME 50 + +#define FULL_X_DATA 20 +#define FULL_Y_DATA 16 +#define SCANTIME_RAWDATA (FULL_X_DATA*FULL_Y_DATA) + +struct _raw_ioctl { + int sz; + u8 *buf; +}; + +struct _reg_ioctl{ + int addr; + int *val; +} ; + +#endif + +/* Other Things */ +#define ZINITIX_INIT_RETRY_CNT 3 +#define I2C_SUCCESS 0 +#define I2C_FAIL 1 + +#define INIT_RETRY_COUNT 2 + + +/*---------------------------------------------------------------------*/ + +/* Register Map*/ +#define ZINITIX_SWRESET_CMD 0x0000 +#define ZINITIX_WAKEUP_CMD 0x0001 + +#define ZINITIX_IDLE_CMD 0x0004 +#define ZINITIX_SLEEP_CMD 0x0005 + +#define ZINITIX_CLEAR_INT_STATUS_CMD 0x0003 +#define ZINITIX_CALIBRATE_CMD 0x0006 +#define ZINITIX_SAVE_STATUS_CMD 0x0007 +#define ZINITIX_SAVE_CALIBRATION_CMD 0x0008 +#define ZINITIX_RECALL_FACTORY_CMD 0x000f + + +#define ZINITIX_TOUCH_MODE 0x0010 +#define ZINITIX_CHIP_REVISION 0x0011 +#define ZINITIX_FIRMWARE_VERSION 0x0012 +#define ZINITIX_DATA_VERSION_REG 0x0013 +#define ZINITIX_TSP_TYPE 0x0014 +#define ZINITIX_SUPPORTED_FINGER_NUM 0x0015 +#define ZINITIX_MAX_Y_NUM 0x0016 +#define ZINITIX_EEPROM_INFO 0x0018 +#define ZINITIX_CAL_N_TOTAL_NUM 0x001B + +#define ZINITIX_TOTAL_NUMBER_OF_X 0x0060 +#define ZINITIX_TOTAL_NUMBER_OF_Y 0x0061 + +#define ZINITIX_BUTTON_SUPPORTED_NUM 0x00B0 + + +#define ZINITIX_X_RESOLUTION 0x00C0 +#define ZINITIX_Y_RESOLUTION 0x00C1 + + +#define ZINITIX_POINT_STATUS_REG 0x0080 +#define ZINITIX_ICON_STATUS_REG 0x00A0 + +#define ZINITIX_RAWDATA_REG 0x0200 + +#define ZINITIX_EEPROM_INFO_REG 0x0018 + +#define ZINITIX_INT_ENABLE_FLAG 0x00f0 +#define ZINITIX_PERIODICAL_INTERRUPT_INTERVAL 0x00f1 + +#define ZINITIX_CHECK_REG0 0x00AC +#define ZINITIX_CHECK_REG1 0x00AD +#define ZINITIX_CHECK_REG2 0x00AE +#define ZINITIX_CHECK_REG3 0x00AF + + +/* Interrupt & status register flag bit +------------------------------------------------- +*/ +#define BIT_PT_CNT_CHANGE 0 +#define BIT_DOWN 1 +#define BIT_MOVE 2 +#define BIT_UP 3 +#define BIT_HOLD 4 +#define BIT_LONG_HOLD 5 +#define RESERVED_0 6 +#define RESERVED_1 7 +#define BIT_WEIGHT_CHANGE 8 +#define BIT_PT_NO_CHANGE 9 +#define BIT_REJECT 10 +#define BIT_PT_EXIST 11 +#define RESERVED_2 12 +#define RESERVED_3 13 +#define RESERVED_4 14 +#define BIT_ICON_EVENT 15 + +/* button */ +#define BIT_O_ICON0_DOWN 0 +#define BIT_O_ICON1_DOWN 1 +#define BIT_O_ICON2_DOWN 2 +#define BIT_O_ICON3_DOWN 3 +#define BIT_O_ICON4_DOWN 4 +#define BIT_O_ICON5_DOWN 5 +#define BIT_O_ICON6_DOWN 6 +#define BIT_O_ICON7_DOWN 7 + +#define BIT_O_ICON0_UP 8 +#define BIT_O_ICON1_UP 9 +#define BIT_O_ICON2_UP 10 +#define BIT_O_ICON3_UP 11 +#define BIT_O_ICON4_UP 12 +#define BIT_O_ICON5_UP 13 +#define BIT_O_ICON6_UP 14 +#define BIT_O_ICON7_UP 15 + + +#define SUB_BIT_EXIST 0 +#define SUB_BIT_DOWN 1 +#define SUB_BIT_MOVE 2 +#define SUB_BIT_UP 3 +#define SUB_BIT_UPDATE 4 +#define SUB_BIT_WAIT 5 + + +#define zinitix_bit_set(val, n) ((val) &= ~(1<<(n)), (val) |= (1<<(n))) +#define zinitix_bit_clr(val, n) ((val) &= ~(1<<(n))) +#define zinitix_bit_test(val, n) ((val) & (1<<(n))) +#define zinitix_swap_v(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) +#define zinitix_swap_16(s) (((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))) + +#endif /*ZINITIX_HEADER*/ + + diff --git a/drivers/input/touchscreen/zinitix_touch_bt404.c b/drivers/input/touchscreen/zinitix_touch_bt404.c new file mode 100644 index 00000000..c58816d3 --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch_bt404.c @@ -0,0 +1,3525 @@ +/* + * + * Zinitix touch driver + * + * Copyright (C) 2009 Zinitix, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +/* +Version 2.0.0 : using reg data file (2010/11/05) +Version 2.0.1 : syntxt bug fix (2010/11/09) +Version 2.0.2 : Save status cmd delay bug (2010/11/10) +Version 2.0.3 : modify delay 10ms -> 50ms for clear hw calibration bit + : modify ZINITIX_TOTAL_NUMBER_OF_Y register (read only -> read/write ) + : modify SUPPORTED FINGER NUM register (read only -> read/write ) +Version 2.0.4 : [20101116] + Modify Firmware Upgrade routine. +Version 2.0.5 : [20101118] + add esd timer function & some bug fix. + you can select request_threaded_irq or + request_irq, setting USE_THREADED_IRQ. +Version 2.0.6 : [20101123] + add ABS_MT_WIDTH_MAJOR Report +Version 2.0.7 : [20101201] + Modify zinitix_early_suspend() / zinitix_late_resume() routine. +Version 2.0.8 : [20101216] + add using spin_lock option +Version 2.0.9 : [20101216] + Test Version +Version 2.0.10 : [20101217] + add USE_THREAD_METHOD option. + if USE_THREAD_METHOD = 0, you use workqueue +Version 2.0.11 : [20101229] + add USE_UPDATE_SYSFS option for update firmware. + && TOUCH_MODE == 1 mode. +Version 2.0.13 : [20110125] + modify esd timer routine +Version 2.0.14 : [20110217] + esd timer bug fix. (kernel panic) + sysfs bug fix. +Version 2.0.15 : [20110315] + add power off delay ,250ms +Version 2.0.16 : [20110316] + add upgrade method using isp +Version 2.0.17 : [20110406] + change naming rule : sain -> zinitix + (add) pending interrupt skip + add isp upgrade mode + remove warning message when complile +Version 3.0.2 : [20110711] + support bt4x3 series +Version 3.0.3 : [20110720] + add raw data monitoring func. + add the h/w calibration skip option. +Version 3.0.4 : [20110728] + fix using semaphore bug. +Version 3.0.5 : [20110801] + fix some bugs. +Version 3.0.6 : [20110802] + fix Bt4x3 isp upgrade bug. + add USE_TS_MISC_DEVICE option for showing info & upgrade + remove USE_UPDATE_SYSFS option +Version 3.0.7 : [201108016] + merge USE_TS_MISC_DEVICE option and USE_TEST_RAW_TH_DATA_MODE + fix work proceedure bug. +Version 3.0.8 / Version 3.0.9 : [201108017] + add ioctl func. +Version 3.0.10 : [201108030] + support REAL_SUPPORTED_FINGER_NUM +Version 3.0.11 : [201109014] + support zinitix apps. +Version 3.0.12 : [201109015] + add disable touch event func. +Version 3.0.13 : [201109015] + add USING_CHIP_SETTING option : interrupt mask/button num/finger num +Version 3.0.14 : [201109020] + support apps. above kernel version 2.6.35 +Version 3.0.15 : [201101004] + modify timing in firmware upgrade retry when failt to upgrade firmware +Version 3.0.16 : [20111024] + remove thread method. + add resume/suspend function + check code using checkpatch.pl +Version 3.0.19 : [20111124] + modify isp timing : 2ms -> 1ms +Version 3.0.20 : [20120201] + support icecream sandwich + remove bt4x2 option +Version 3.0.21~22 : [20120501] + test +Version 3.0.23 : [20120517] + support mulit touch protocol type B for ics +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "zinitix_touch_bt404.h" +#include "zinitix_touch_bt4x4_firmware.h" + + +#define ZINITIX_DEBUG 0 + +static int m_ts_debug_mode = ZINITIX_DEBUG; + +#define SYSTEM_MAX_X_RESOLUTION 480 +#define SYSTEM_MAX_Y_RESOLUTION 870 + + +/* interrupt pin number*/ +#define GPIO_TOUCH_PIN_NUM 141 +/* interrupt pin IRQ number */ +#define GPIO_TOUCH_IRQ 0 + +#if !USE_THREADED_IRQ +static struct workqueue_struct *zinitix_workqueue; +#endif + +static struct workqueue_struct *zinitix_tmr_workqueue; + +#define zinitix_debug_msg(fmt, args...) \ + if (m_ts_debug_mode) \ + printk(KERN_INFO "zinitix : [%-18s:%5d]" fmt, \ + __func__, __LINE__, ## args); + +#define zinitix_printk(fmt, args...) \ + printk(KERN_INFO "zinitix : [%-18s:%5d]" fmt, \ + __func__, __LINE__, ## args); + +struct _ts_zinitix_coord { + u16 x; + u16 y; + u8 width; + u8 sub_status; +}; + +struct _ts_zinitix_point_info { + u16 status; +#if (TOUCH_MODE == 1) + u16 event_flag; +#else + u8 finger_cnt; + u8 time_stamp; +#endif + struct _ts_zinitix_coord coord[MAX_SUPPORTED_FINGER_NUM]; +}; + +#define TOUCH_V_FLIP 0x01 +#define TOUCH_H_FLIP 0x02 +#define TOUCH_XY_SWAP 0x04 + +struct _ts_capa_info { + u16 chip_revision; + u16 chip_firmware_version; + u16 chip_reg_data_version; + u16 x_resolution; + u16 y_resolution; + u32 chip_fw_size; + u32 MaxX; + u32 MaxY; + u32 MinX; + u32 MinY; + u32 Orientation; + u8 gesture_support; + u16 multi_fingers; + u16 button_num; + u16 chip_int_mask; + + u16 x_node_num; + u16 y_node_num; + u16 total_node_num; + u16 max_y_node; + u16 total_cal_n; + +}; + +enum _ts_work_proceedure { + TS_NO_WORK = 0, + TS_NORMAL_WORK, + TS_ESD_TIMER_WORK, + TS_IN_EALRY_SUSPEND, + TS_IN_SUSPEND, + TS_IN_RESUME, + TS_IN_LATE_RESUME, + TS_IN_UPGRADE, + TS_REMOVE_WORK, + TS_SET_MODE, + TS_HW_CALIBRAION, +}; + +struct zinitix_touch_dev { + struct input_dev *input_dev; + struct task_struct *task; + wait_queue_head_t wait; +#if !USE_THREADED_IRQ + struct work_struct work; +#endif + struct work_struct tmr_work; + struct i2c_client *client; + struct semaphore update_lock; + u32 i2c_dev_addr; + struct _ts_capa_info cap_info; + char phys[32]; + + bool is_valid_event; + struct _ts_zinitix_point_info touch_info; + struct _ts_zinitix_point_info reported_touch_info; + u16 icon_event_reg; + u16 event_type; + u32 int_gpio_num; + u32 irq; + u8 button[MAX_SUPPORTED_BUTTON_NUM]; + u8 work_proceedure; + struct semaphore work_proceedure_lock; + u8 use_esd_timer; + + bool in_esd_timer; + struct timer_list esd_timeout_tmr; + struct timer_list *p_esd_timeout_tmr; + +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + + + struct semaphore raw_data_lock; + u16 raw_mode_flag; + s16 ref_data[MAX_TEST_RAW_DATA]; + s16 cur_data[MAX_RAW_DATA]; + u8 update; + +}; + + +#define ZINITIX_DRIVER_NAME "Zinitix_tsp" +#define ZINITIX_ISP_NAME "zinitix_isp" +static struct i2c_client *m_isp_client; + +static struct i2c_device_id zinitix_idtable[] = { + {ZINITIX_ISP_NAME, 0}, + {ZINITIX_DRIVER_NAME, 0}, + { } +}; + +#if SEC_TOUCH_INFO_REPORT +extern struct class *sec_class; +struct device *sec_touchscreen_dev; +struct device *sec_touchkey_dev; +#endif + + +/*<= you must set key button mapping*/ +u32 BUTTON_MAPPING_KEY[MAX_SUPPORTED_BUTTON_NUM] = { + KEY_SEARCH, KEY_BACK, KEY_HOME, KEY_MENU,}; + +#define TOUCH_VIRTUAL_KEYS +#ifdef TOUCH_VIRTUAL_KEYS + +static ssize_t virtual_keys_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) +{ + return sprintf(buf, + __stringify(EV_KEY) ":" __stringify(KEY_MENU) ":30:859:100:55" + ":" __stringify(EV_KEY) ":" __stringify(KEY_BACK) ":430:859:100:55" + "\n"); +} + +static struct kobj_attribute virtual_keys_attr = { + .attr = { + .name = "virtualkeys.Zinitix_tsp", + .mode = S_IRUGO, + }, + .show = &virtual_keys_show, +}; + +static struct attribute *properties_attrs[] = { + &virtual_keys_attr.attr, + NULL +}; + +static struct attribute_group properties_attr_group = { + .attrs = properties_attrs, +}; + + +/* zinitix_ts_virtual_keys_init -- register virutal keys to system + * @return: none + */ +static void zinitix_ts_virtual_keys_init(void) +{ + int ret; + struct kobject *properties_kobj; + + //PIXCIR_DBG("%s",__func__); + + properties_kobj = kobject_create_and_add("board_properties", NULL); + if (properties_kobj) + ret = sysfs_create_group(properties_kobj, + &properties_attr_group); + if (!properties_kobj || ret) + pr_err("failed to create board_properties\n"); +} + + +#endif + + +/* define i2c sub functions*/ +static inline s32 ts_read_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + /* select register*/ + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) + return ret; + /* for setup tx transaction. */ + udelay(DELAY_FOR_TRANSCATION); + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 ts_write_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + u8 pkt[4]; + pkt[0] = (reg)&0xff; + pkt[1] = (reg >> 8)&0xff; + pkt[2] = values[0]; + pkt[3] = values[1]; + ret = i2c_master_send(client , pkt , length+2); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 ts_write_reg(struct i2c_client *client, u16 reg, u16 value) +{ + if (ts_write_data(client, reg, (u8 *)&value, 2) < 0) + return I2C_FAIL; + return I2C_SUCCESS; +} + +static inline s32 ts_write_cmd(struct i2c_client *client, u16 reg) +{ + s32 ret; + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) + return I2C_FAIL; + udelay(DELAY_FOR_POST_TRANSCATION); + return I2C_SUCCESS; +} + +static inline s32 ts_read_raw_data(struct i2c_client *client, + u16 reg, u8 *values, u16 length) +{ + s32 ret; + /* select register */ + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) + return ret; + /* for setup tx transaction. */ + udelay(200); + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + + + +static inline s32 ts_read_firmware_data(struct i2c_client *client, + char *addr, u8 *values, u16 length) +{ + s32 ret; + if (addr != NULL) { + /* select register*/ + ret = i2c_master_send(client , addr , 2); + if (ret < 0) + return ret; + /* for setup tx transaction. */ + mdelay(1); + } + ret = i2c_master_recv(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 ts_write_firmware_data(struct i2c_client *client, + u8 *values, u16 length) +{ + s32 ret; + ret = i2c_master_send(client , values , length); + if (ret < 0) + return ret; + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static int zinitix_touch_probe(struct i2c_client *client, + const struct i2c_device_id *i2c_id); +static int zinitix_touch_remove(struct i2c_client *client); +static bool ts_init_touch(struct zinitix_touch_dev *touch_dev); +static void zinitix_clear_report_data(struct zinitix_touch_dev *touch_dev); +static void zinitix_parsing_data(struct zinitix_touch_dev *touch_dev); + +#ifdef CONFIG_PM_SLEEP +static int zinitix_resume(struct device *dev); +static int zinitix_suspend(struct device *dev); +#endif + + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zinitix_early_suspend(struct early_suspend *h); +static void zinitix_late_resume(struct early_suspend *h); +#endif + + +static void ts_esd_timer_start(u16 sec, struct zinitix_touch_dev *touch_dev); +static void ts_esd_timer_stop(struct zinitix_touch_dev *touch_dev); +static void ts_esd_timer_init(struct zinitix_touch_dev *touch_dev); +static void ts_esd_timeout_handler(unsigned long data); + + + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) +static int ts_misc_fops_ioctl(struct inode *inode, struct file *filp, + unsigned int cmd, unsigned long arg); +#else +static long ts_misc_fops_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg); +#endif +static int ts_misc_fops_open(struct inode *inode, struct file *filp); +static int ts_misc_fops_close(struct inode *inode, struct file *filp); + +static const struct file_operations ts_misc_fops = { + .owner = THIS_MODULE, + .open = ts_misc_fops_open, + .release = ts_misc_fops_close, +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) + .ioctl = ts_misc_fops_ioctl, +#else + .unlocked_ioctl = ts_misc_fops_ioctl, +#endif +}; + +static struct miscdevice touch_misc_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "zinitix_touch_misc", + .fops = &ts_misc_fops, +}; + +#define TOUCH_IOCTL_BASE 0xbc +#define TOUCH_IOCTL_GET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 0, int) +#define TOUCH_IOCTL_SET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 1, int) +#define TOUCH_IOCTL_GET_CHIP_REVISION _IOW(TOUCH_IOCTL_BASE, 2, int) +#define TOUCH_IOCTL_GET_FW_VERSION _IOW(TOUCH_IOCTL_BASE, 3, int) +#define TOUCH_IOCTL_GET_REG_DATA_VERSION _IOW(TOUCH_IOCTL_BASE, 4, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_SIZE _IOW(TOUCH_IOCTL_BASE, 5, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_DATA _IOW(TOUCH_IOCTL_BASE, 6, int) +#define TOUCH_IOCTL_START_UPGRADE _IOW(TOUCH_IOCTL_BASE, 7, int) +#define TOUCH_IOCTL_GET_X_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 8, int) +#define TOUCH_IOCTL_GET_Y_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 9, int) +#define TOUCH_IOCTL_GET_TOTAL_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 10, int) +#define TOUCH_IOCTL_SET_RAW_DATA_MODE _IOW(TOUCH_IOCTL_BASE, 11, int) +#define TOUCH_IOCTL_GET_RAW_DATA _IOW(TOUCH_IOCTL_BASE, 12, int) +#define TOUCH_IOCTL_GET_X_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 13, int) +#define TOUCH_IOCTL_GET_Y_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 14, int) +#define TOUCH_IOCTL_HW_CALIBRAION _IOW(TOUCH_IOCTL_BASE, 15, int) +#define TOUCH_IOCTL_GET_REG _IOW(TOUCH_IOCTL_BASE, 16, int) +#define TOUCH_IOCTL_SET_REG _IOW(TOUCH_IOCTL_BASE, 17, int) +#define TOUCH_IOCTL_SEND_SAVE_STATUS _IOW(TOUCH_IOCTL_BASE, 18, int) +#define TOUCH_IOCTL_DONOT_TOUCH_EVENT _IOW(TOUCH_IOCTL_BASE, 19, int) + + +struct zinitix_touch_dev *misc_touch_dev; + + + + + +//for Debugging Tol +static bool ts_get_raw_data(struct zinitix_touch_dev *touch_dev) +{ + u32 total_node = touch_dev->cap_info.total_node_num; + u32 sz; + u16 udata; + down(&touch_dev->raw_data_lock); + if (touch_dev->raw_mode_flag == TOUCH_TEST_RAW_MODE) { + sz = (total_node*2 + MAX_TEST_POINT_INFO*2); + + + if (ts_read_raw_data(touch_dev->client, + ZINITIX_RAWDATA_REG, + (char *)touch_dev->cur_data, sz) < 0) { + zinitix_printk("error : read zinitix tc raw data\n"); + up(&touch_dev->raw_data_lock); + return false; + } + + /* no point, so update ref_data*/ + udata = touch_dev->cur_data[total_node]; + + if (!zinitix_bit_test(udata, BIT_ICON_EVENT) + && !zinitix_bit_test(udata, BIT_PT_EXIST)) + memcpy((u8 *)touch_dev->ref_data, + (u8 *)touch_dev->cur_data, total_node*2); + + touch_dev->update = 1; + memcpy((u8 *)(&touch_dev->touch_info), + (u8 *)&touch_dev->cur_data[total_node], + sizeof(struct _ts_zinitix_point_info)); + up(&touch_dev->raw_data_lock); + return true; + } else if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { + zinitix_debug_msg("read raw data\r\n"); + sz = total_node*2 + sizeof(struct _ts_zinitix_point_info); + + + if (touch_dev->raw_mode_flag == TOUCH_ZINITIX_CAL_N_MODE) { + int total_cal_n = touch_dev->cap_info.total_cal_n; + if (total_cal_n == 0) + total_cal_n = 160; + + sz = + (total_cal_n*2 + sizeof(struct _ts_zinitix_point_info)); + + if (ts_read_raw_data(touch_dev->client, + ZINITIX_RAWDATA_REG, + (char *)touch_dev->cur_data, sz) < 0) { + zinitix_printk("error : read zinitix tc raw data\n"); + up(&touch_dev->raw_data_lock); + return false; + } + misc_touch_dev->update = 1; + memcpy((u8 *)(&touch_dev->touch_info), + (u8 *)&touch_dev->cur_data[total_cal_n], + sizeof(struct _ts_zinitix_point_info)); + up(&touch_dev->raw_data_lock); + return true; + } + + if (ts_read_raw_data(touch_dev->client, + ZINITIX_RAWDATA_REG, + (char *)touch_dev->cur_data, sz) < 0) { + zinitix_printk("error : read zinitix tc raw data\n"); + up(&touch_dev->raw_data_lock); + return false; + } + + udata = touch_dev->cur_data[total_node]; + if (!zinitix_bit_test(udata, BIT_ICON_EVENT) + && !zinitix_bit_test(udata, BIT_PT_EXIST)) + memcpy((u8 *)touch_dev->ref_data, + (u8 *)touch_dev->cur_data, total_node*2); + touch_dev->update = 1; + memcpy((u8 *)(&touch_dev->touch_info), + (u8 *)&touch_dev->cur_data[total_node], + sizeof(struct _ts_zinitix_point_info)); + } + up(&touch_dev->raw_data_lock); + return true; +} + + + +static bool ts_read_coord(struct zinitix_touch_dev *touch_dev) +{ +#if (TOUCH_MODE == 1) + int i; +#endif + + zinitix_debug_msg("ts_read_coord+\r\n"); + + if (gpio_get_value(touch_dev->int_gpio_num)) { + /*interrupt pin is high, not valid data.*/ + touch_dev->touch_info.status = 0; + zinitix_debug_msg("woops... inturrpt pin is high\r\n"); + return true; + } + + //for Debugging Tool + + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { + if (ts_get_raw_data(touch_dev) == false) + return false; + goto continue_check_point_data; + } + + + +#if (TOUCH_MODE == 1) + memset(&touch_dev->touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); + + if (ts_read_data(touch_dev->client, + ZINITIX_POINT_STATUS_REG, + (u8 *)(&touch_dev->touch_info), 4) < 0) { + zinitix_debug_msg("error read point info using i2c.-\r\n"); + return false; + } + zinitix_debug_msg("status reg = 0x%x , event_flag = 0x%04x\r\n", + touch_dev->touch_info.status, touch_dev->touch_info.event_flag); + + if (touch_dev->touch_info.status == 0x0) { + zinitix_debug_msg("periodical esd repeated int occured\r\n"); + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + return true; + } + + if (zinitix_bit_test(touch_dev->touch_info.status, BIT_ICON_EVENT)) { + udelay(20); + if (ts_read_data(touch_dev->client, + ZINITIX_ICON_STATUS_REG, + (u8 *)(&touch_dev->icon_event_reg), 2) < 0) { + printk(KERN_INFO "error read icon info using i2c.\n"); + return false; + } + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + return true; + } + + + + if(touch_dev->touch_info.event_flag == 0) { + zinitix_printk( "error : event flag == 0?\n"); + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + return true; + } + + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + if (zinitix_bit_test(touch_dev->touch_info.event_flag, i)) { + udelay(20); + if (ts_read_data(touch_dev->client, + ZINITIX_POINT_STATUS_REG+2+(i*3), + (u8 *)(&touch_dev->touch_info.coord[i]), + sizeof(struct _ts_zinitix_coord)) < 0) { + zinitix_debug_msg("error read point info\n"); + return false; + } + } + } + + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + return true; +#else + if (ts_read_data(touch_dev->client, + ZINITIX_POINT_STATUS_REG, + (u8 *)(&touch_dev->touch_info), + sizeof(struct _ts_zinitix_point_info)) < 0) { + zinitix_debug_msg("error read point info using i2c.-\n"); + return false; + } + +continue_check_point_data: + zinitix_debug_msg("status = 0x%x , pt cnt = %d, t stamp = %d\n", + touch_dev->touch_info.status, + touch_dev->touch_info.finger_cnt, + touch_dev->touch_info.time_stamp); + + if (touch_dev->touch_info.status == 0x0) { + zinitix_debug_msg("periodical esd repeated int occured\r\n"); + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + return true; + } + + if (zinitix_bit_test(touch_dev->touch_info.status, BIT_ICON_EVENT)) { + udelay(20); + if (ts_read_data(touch_dev->client, + ZINITIX_ICON_STATUS_REG, + (u8 *)(&touch_dev->icon_event_reg), 2) < 0) { + zinitix_printk("error read icon info using i2c.\n"); + return false; + } + } + + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + zinitix_debug_msg("ts_read_coord-\r\n"); + return true; +#endif +} + + +static irqreturn_t ts_int_handler(int irq, void *dev) +{ + + struct zinitix_touch_dev *touch_dev = (struct zinitix_touch_dev *)dev; + /* zinitix_debug_msg("interrupt occured +\r\n"); */ + if(touch_dev == NULL) return IRQ_HANDLED; + /* remove pending interrupt */ + if (gpio_get_value(touch_dev->int_gpio_num)) { + zinitix_debug_msg("invalid interrupt occured +\r\n"); + return IRQ_HANDLED; + } +#if USE_THREADED_IRQ + return IRQ_WAKE_THREAD; +#else + disable_irq_nosync(irq); + queue_work(zinitix_workqueue, &touch_dev->work); + return IRQ_HANDLED; +#endif +} + + + +static void ts_power_control(u8 ctl) +{ + if (ctl == POWER_OFF) + ; + else if (ctl == POWER_ON) + ; + +} + +static bool ts_mini_init_touch(struct zinitix_touch_dev *touch_dev) +{ + u16 reg_val; + int i; +#if USE_CHECKSUM + u16 chip_eeprom_info; + u16 chip_check_reg[4]; +#endif + + if (touch_dev == NULL) { + zinitix_printk("error (touch_dev == NULL?)\r\n"); + return false; + } + + zinitix_debug_msg("check checksum\r\n"); + +#if USE_CHECKSUM + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) { + zinitix_printk("fail to read eeprom info(%d)\r\n", i); + goto fail_mini_init; + } + + if (zinitix_bit_test(chip_eeprom_info, 0)) // not calibration + goto fail_mini_init_not_cal; + + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG0, (u8 *)chip_check_reg, 8) < 0) + goto fail_mini_init; + if( (chip_check_reg[0]!=chip_check_reg[2]) || (chip_check_reg[1]!=chip_check_reg[3]) ) { + zinitix_printk("firmware checksum error\r\n"); + goto fail_mini_init; + } +#endif + + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) { + zinitix_printk("fail to write reset command\r\n"); + goto fail_mini_init; + } + + + /* initialize */ + if (ts_write_reg(touch_dev->client, + ZINITIX_X_RESOLUTION, + (u16)(touch_dev->cap_info.x_resolution)) != I2C_SUCCESS) + goto fail_mini_init; + + if (ts_write_reg(touch_dev->client, + ZINITIX_Y_RESOLUTION, + (u16)( touch_dev->cap_info.y_resolution)) != I2C_SUCCESS) + goto fail_mini_init; + + zinitix_debug_msg("touch max x = %d\r\n", touch_dev->cap_info.x_resolution); + zinitix_debug_msg("touch max y = %d\r\n", touch_dev->cap_info.y_resolution); + + if (ts_write_reg(touch_dev->client, + ZINITIX_BUTTON_SUPPORTED_NUM, + (u16)touch_dev->cap_info.button_num) != I2C_SUCCESS) + goto fail_mini_init; + + if (ts_write_reg(touch_dev->client, + ZINITIX_SUPPORTED_FINGER_NUM, + (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_mini_init; + + + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + touch_dev->raw_mode_flag) != I2C_SUCCESS) + goto fail_mini_init; + } else + + { + reg_val = TOUCH_MODE; + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + reg_val) != I2C_SUCCESS) + goto fail_mini_init; + } + /* soft calibration */ + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_mini_init; + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) != I2C_SUCCESS) + goto fail_mini_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + } + + + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + zinitix_printk("[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + } else + { + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_mini_init; + + } + if (touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } + + zinitix_debug_msg("successfully mini initialized\r\n"); + return true; + +fail_mini_init: + + zinitix_printk("early mini init fail\n"); + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_DELAY); + ts_power_control(POWER_ON); + mdelay(CHIP_ON_DELAY); +fail_mini_init_not_cal: + if(ts_init_touch(touch_dev) == false) { + zinitix_debug_msg("fail initialized\r\n"); + return false; + } + + if (touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } + return true; +} + + +static void zinitix_touch_tmr_work(struct work_struct *work) +{ + struct zinitix_touch_dev *touch_dev = + container_of(work, struct zinitix_touch_dev, tmr_work); + + zinitix_printk("tmr queue work ++\r\n"); + if (touch_dev == NULL) { + zinitix_printk("touch dev == NULL ?\r\n"); + goto fail_time_out_init; + } + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK) { + zinitix_printk("other process occupied (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + return; + } + touch_dev->work_proceedure = TS_ESD_TIMER_WORK; + + disable_irq(touch_dev->irq); + zinitix_printk("error. timeout occured. maybe ts device dead. so reset & reinit.\r\n"); + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_DELAY); + ts_power_control(POWER_ON); + mdelay(CHIP_ON_DELAY); + + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(touch_dev); + if (ts_mini_init_touch(touch_dev) == false) + goto fail_time_out_init; + + touch_dev->work_proceedure = TS_NO_WORK; + enable_irq(touch_dev->irq); + up(&touch_dev->work_proceedure_lock); + zinitix_printk("tmr queue work ----\r\n"); + return; +fail_time_out_init: + zinitix_printk("tmr work : restart error\r\n"); + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + touch_dev->work_proceedure = TS_NO_WORK; + enable_irq(touch_dev->irq); + up(&touch_dev->work_proceedure_lock); +} + +static void ts_esd_timer_start(u16 sec, struct zinitix_touch_dev *touch_dev) +{ + if(touch_dev == NULL) return; + if (touch_dev->p_esd_timeout_tmr != NULL) + del_timer(touch_dev->p_esd_timeout_tmr); + touch_dev->p_esd_timeout_tmr = NULL; + + init_timer(&(touch_dev->esd_timeout_tmr)); + touch_dev->esd_timeout_tmr.data = (unsigned long)(touch_dev); + touch_dev->esd_timeout_tmr.function = ts_esd_timeout_handler; + touch_dev->esd_timeout_tmr.expires = jiffies + HZ*sec; + touch_dev->p_esd_timeout_tmr = &touch_dev->esd_timeout_tmr; + add_timer(&touch_dev->esd_timeout_tmr); +} + +static void ts_esd_timer_stop(struct zinitix_touch_dev *touch_dev) +{ + if(touch_dev == NULL) return; + if (touch_dev->p_esd_timeout_tmr) + del_timer(touch_dev->p_esd_timeout_tmr); + touch_dev->p_esd_timeout_tmr = NULL; +} + +static void ts_esd_timer_init(struct zinitix_touch_dev *touch_dev) +{ + if(touch_dev == NULL) return; + init_timer(&(touch_dev->esd_timeout_tmr)); + touch_dev->esd_timeout_tmr.data = (unsigned long)(touch_dev); + touch_dev->esd_timeout_tmr.function = ts_esd_timeout_handler; + touch_dev->p_esd_timeout_tmr = NULL; +} + +static void ts_esd_timeout_handler(unsigned long data) +{ + struct zinitix_touch_dev *touch_dev = (struct zinitix_touch_dev *)data; + if(touch_dev == NULL) return; + touch_dev->p_esd_timeout_tmr = NULL; + queue_work(zinitix_tmr_workqueue, &touch_dev->tmr_work); +} + +#if TOUCH_ONESHOT_UPGRADE +static bool ts_check_need_upgrade(u16 curVersion, u16 curRegVersion) +{ + u16 newVersion; + u16 newRegVersion; + newVersion = (u16) (m_firmware_data[0] | (m_firmware_data[1]<<8)); + + zinitix_printk("cur version = 0x%x, new version = 0x%x\n", + curVersion, newVersion); + + if (curVersion < newVersion) + return true; + else if (curVersion > newVersion) + return false; + + if (m_firmware_data[FIRMWARE_VERSION_POS+2] == 0xff + && m_firmware_data[FIRMWARE_VERSION_POS+3] == 0xff) + return false; + newRegVersion = (u16) (m_firmware_data[FIRMWARE_VERSION_POS+2] + | (m_firmware_data[FIRMWARE_VERSION_POS+3]<<8)); + + + if (curRegVersion < newRegVersion) + return true; + + return false; +} +#endif + +#define TC_PAGE_SZ 64 +#define TC_SECTOR_SZ 8 + +static u8 ts_upgrade_firmware(struct zinitix_touch_dev *touch_dev, + const u8 *firmware_data, u32 size) +{ + u16 flash_addr; + u8 *verify_data; + int retry_cnt = 0; + u8 i2c_buffer[TC_PAGE_SZ+2]; + + if (m_isp_client == NULL) { + zinitix_printk("i2c client for isp is not register \r\n"); + return false; + } + + verify_data = kzalloc(size, GFP_KERNEL); + if (verify_data == NULL) { + zinitix_printk("cannot alloc verify buffer\n"); + return false; + } + +retry_isp_firmware_upgrade: + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + ts_power_control(POWER_ON); + mdelay(1); /* under 4ms*/ + + zinitix_printk("write firmware data\n"); + + for (flash_addr = 0; flash_addr < size; flash_addr += TC_PAGE_SZ) { + + printk(KERN_INFO "."); + zinitix_debug_msg("firmware write : addr = %04x, len = %d\n", + flash_addr, TC_PAGE_SZ); + + i2c_buffer[0] = (flash_addr>>8)&0xff; /*addr_h*/ + i2c_buffer[1] = (flash_addr)&0xff; /*addr_l*/ + memcpy(&i2c_buffer[2], &firmware_data[flash_addr], TC_PAGE_SZ); + + if (ts_write_firmware_data(m_isp_client, + i2c_buffer, TC_PAGE_SZ+2) < 0) { + zinitix_printk("error : write zinitix tc firmare\n"); + goto fail_upgrade; + } + mdelay(20); + } + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + + zinitix_printk("\r\nread firmware data\n"); + + + flash_addr = 0; + i2c_buffer[0] = (flash_addr>>8)&0xff; /*addr_h*/ + i2c_buffer[1] = (flash_addr)&0xff; /*addr_l*/ + + if (ts_read_firmware_data(m_isp_client, + i2c_buffer, &verify_data[flash_addr], size) < 0) { + zinitix_printk("error : read zinitix tc firmare: addr = %04x, len = %d\n", + flash_addr, size); + goto fail_upgrade; + } + if (memcmp((u8 *)&firmware_data[flash_addr], + (u8 *)&verify_data[flash_addr], size) != 0) { + zinitix_printk("error : verify error : addr = %04x, len = %d\n", + flash_addr, size); + goto fail_upgrade; + } + + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + ts_power_control(POWER_ON); + mdelay(CHIP_ON_AF_FZ_DELAY); + zinitix_printk("upgrade finished\n"); + kfree(verify_data); + return true; + +fail_upgrade: + + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_AF_FZ_DELAY); + ts_power_control(POWER_ON); + mdelay(CHIP_ON_AF_FZ_DELAY); + + zinitix_printk("upgrade fail : so retry... (%d)\n", ++retry_cnt); + if (retry_cnt <= ZINITIX_INIT_RETRY_CNT) + goto retry_isp_firmware_upgrade; + + if (verify_data != NULL) + kfree(verify_data); + + zinitix_printk("upgrade fail..\n"); + return false; + +} + +static bool ts_hw_calibration(struct zinitix_touch_dev *touch_dev) +{ + u16 chip_eeprom_info; + /* h/w calibration */ + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, 0x07) != I2C_SUCCESS) + return false; + mdelay(250); + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + return false; + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + return false; + mdelay(10); + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + + /* wait for h/w calibration*/ + do { + mdelay(1000); + ts_write_cmd(touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + return false; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", + chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + } while (1); + + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + return false; + + if (touch_dev->cap_info.chip_int_mask != 0) + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) + != I2C_SUCCESS) + return false; + if (ts_write_cmd(touch_dev->client, + ZINITIX_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + return false; + mdelay(1000); + return true; + +} + +static bool ts_init_touch(struct zinitix_touch_dev *touch_dev) +{ + u16 reg_val; + int i; + u16 SetMaxX = SYSTEM_MAX_X_RESOLUTION; + u16 SetMaxY = SYSTEM_MAX_Y_RESOLUTION; + u16 chip_revision; + u16 chip_firmware_version; + u16 chip_reg_data_version; + u16 chip_eeprom_info; +#if USE_CHECKSUM + u16 chip_check_reg[4]; + u8 checksum_err; +#endif +#if TOUCH_ONESHOT_UPGRADE + s16 stmp; +#endif + int retry_cnt = 0; + + if (touch_dev == NULL) { + zinitix_printk("error touch_dev == null?\r\n"); + return false; + } + +retry_init: + +#if USE_CHECKSUM + for(i = 0; i < ZINITIX_INIT_RETRY_CNT; i++) { + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) { + zinitix_printk("fail to read eeprom info(%d)\r\n", i); + mdelay(10); + continue; + } else + break; + } + if (i == ZINITIX_INIT_RETRY_CNT) { + goto fail_init; + } + + if (!zinitix_bit_test(chip_eeprom_info, 0)) { // no exist checksum data + + zinitix_debug_msg("check checksum\r\n"); + + checksum_err = 0; + + for (i = 0; i < ZINITIX_INIT_RETRY_CNT; i++) { + if (ts_read_data(touch_dev->client, + ZINITIX_CHECK_REG0, (u8 *)chip_check_reg, 8) < 0) { + mdelay(10); + continue; + } + + zinitix_debug_msg("0x%02X, 0x%02X, 0x%02X, 0x%02X\r\n", + chip_check_reg[0], chip_check_reg[1], chip_check_reg[2], chip_check_reg[3]); + + if( (chip_check_reg[0]!=chip_check_reg[2]) && + (chip_check_reg[1]==chip_check_reg[3]) ) + break; + else { + checksum_err = 1; + break; + } + } + + if (i == ZINITIX_INIT_RETRY_CNT || checksum_err) { + zinitix_printk("fail to check firmware data\r\n"); + if(checksum_err == 1 && retry_cnt < ZINITIX_INIT_RETRY_CNT) + retry_cnt = ZINITIX_INIT_RETRY_CNT; + goto fail_init; + } + } else + zinitix_printk("not calibration, so skip checksum.\r\n"); +#endif + + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) { + zinitix_printk("fail to write reset command\r\n"); + goto fail_init; + } + + touch_dev->cap_info.button_num = SUPPORTED_BUTTON_NUM; + + reg_val = 0; + zinitix_bit_set(reg_val, BIT_PT_CNT_CHANGE); + zinitix_bit_set(reg_val, BIT_DOWN); + zinitix_bit_set(reg_val, BIT_MOVE); + zinitix_bit_set(reg_val, BIT_UP); + if (touch_dev->cap_info.button_num > 0) + zinitix_bit_set(reg_val, BIT_ICON_EVENT); + touch_dev->cap_info.chip_int_mask = reg_val; + + + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0x0) != I2C_SUCCESS) + goto fail_init; + + zinitix_debug_msg("send reset command\r\n"); + if (ts_write_cmd(touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_init; + + /* get chip revision id */ + if (ts_read_data(touch_dev->client, + ZINITIX_CHIP_REVISION, + (u8 *)&chip_revision, 2) < 0) { + zinitix_printk("fail to read chip revision\r\n"); + goto fail_init; + } + zinitix_printk("touch chip revision id = %x\r\n", + chip_revision); + + touch_dev->cap_info.chip_fw_size = 32*1024; + + //for Debugging Tool + + if (ts_read_data(touch_dev->client, + ZINITIX_TOTAL_NUMBER_OF_X, + (u8 *)&touch_dev->cap_info.x_node_num, 2) < 0) + goto fail_init; + zinitix_printk("touch chip x node num = %d\r\n", + touch_dev->cap_info.x_node_num); + if (ts_read_data(touch_dev->client, + ZINITIX_TOTAL_NUMBER_OF_Y, + (u8 *)&touch_dev->cap_info.y_node_num, 2) < 0) + goto fail_init; + zinitix_printk("touch chip y node num = %d\r\n", + touch_dev->cap_info.y_node_num); + + touch_dev->cap_info.total_node_num = + touch_dev->cap_info.x_node_num*touch_dev->cap_info.y_node_num; + zinitix_printk("touch chip total node num = %d\r\n", + touch_dev->cap_info.total_node_num); + + if (ts_read_data(touch_dev->client, + ZINITIX_MAX_Y_NUM, + (u8 *)&touch_dev->cap_info.max_y_node, 2) < 0) + goto fail_init; + + zinitix_printk("touch chip max y node num = %d\r\n", + touch_dev->cap_info.max_y_node); + + if (ts_read_data(touch_dev->client, + ZINITIX_CAL_N_TOTAL_NUM, + (u8 *)&touch_dev->cap_info.total_cal_n, 2) < 0) + goto fail_init; + zinitix_printk("touch chip total cal n data num = %d\r\n", + touch_dev->cap_info.total_cal_n); + //---- + + + /* get chip firmware version */ + if (ts_read_data(touch_dev->client, + ZINITIX_FIRMWARE_VERSION, + (u8 *)&chip_firmware_version, 2) < 0) + goto fail_init; + zinitix_printk("touch chip firmware version = %x\r\n", + chip_firmware_version); + +#if TOUCH_ONESHOT_UPGRADE + chip_reg_data_version = 0xffff; + + if (ts_read_data(touch_dev->client, + ZINITIX_DATA_VERSION_REG, + (u8 *)&chip_reg_data_version, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch reg data version = %d\r\n", + chip_reg_data_version); + + if (ts_check_need_upgrade(chip_firmware_version, + chip_reg_data_version) == true) { + zinitix_printk("start upgrade firmware\n"); + + if(ts_upgrade_firmware(touch_dev, &m_firmware_data[2], + touch_dev->cap_info.chip_fw_size) == false) + goto fail_init; + + if(ts_hw_calibration(touch_dev) == false) + goto fail_init; + + /* disable chip interrupt */ + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + goto retry_init; + } +#endif + + if (ts_read_data(touch_dev->client, + ZINITIX_DATA_VERSION_REG, + (u8 *)&chip_reg_data_version, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch reg data version = %d\r\n", + chip_reg_data_version); + + if (ts_read_data(touch_dev->client, + ZINITIX_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_init; + zinitix_debug_msg("touch eeprom info = 0x%04X\r\n", chip_eeprom_info); + + + if (zinitix_bit_test(chip_eeprom_info, 0)) { /* hw calibration bit*/ + + /* h/w calibration */ + if(ts_hw_calibration(touch_dev) == false) + goto fail_init; + + /* disable chip interrupt */ + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + + } + + + touch_dev->cap_info.chip_revision = (u16)chip_revision; + touch_dev->cap_info.chip_firmware_version = (u16)chip_firmware_version; + touch_dev->cap_info.chip_reg_data_version = (u16)chip_reg_data_version; + + + /* initialize */ + if (ts_write_reg(touch_dev->client, + ZINITIX_X_RESOLUTION, (u16)(SetMaxX)) != I2C_SUCCESS) + goto fail_init; + + if (ts_write_reg(touch_dev->client, + ZINITIX_Y_RESOLUTION, (u16)(SetMaxY)) != I2C_SUCCESS) + goto fail_init; + + touch_dev->cap_info.x_resolution = SetMaxX; + touch_dev->cap_info.y_resolution = SetMaxY; + + zinitix_debug_msg("touch max x = %d\r\n", + touch_dev->cap_info.x_resolution); + zinitix_debug_msg("touch max y = %d\r\n", + touch_dev->cap_info.y_resolution); + + touch_dev->cap_info.MinX = (u32)0; + touch_dev->cap_info.MinY = (u32)0; + touch_dev->cap_info.MaxX = (u32)touch_dev->cap_info.x_resolution; + touch_dev->cap_info.MaxY = (u32)touch_dev->cap_info.y_resolution; + + if (ts_write_reg(touch_dev->client, + ZINITIX_BUTTON_SUPPORTED_NUM, + (u16)touch_dev->cap_info.button_num) != I2C_SUCCESS) + goto fail_init; + + if (ts_write_reg(touch_dev->client, + ZINITIX_SUPPORTED_FINGER_NUM, + (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_init; + touch_dev->cap_info.multi_fingers = MAX_SUPPORTED_FINGER_NUM; + + zinitix_debug_msg("max supported finger num = %d\r\n", + touch_dev->cap_info.multi_fingers); + touch_dev->cap_info.gesture_support = 0; + zinitix_debug_msg("set other configuration\r\n"); + + + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, + touch_dev->raw_mode_flag) != I2C_SUCCESS) + goto fail_init; + } else + { + reg_val = TOUCH_MODE; + if (ts_write_reg(touch_dev->client, + ZINITIX_TOUCH_MODE, reg_val) != I2C_SUCCESS) + goto fail_init; + } + /* soft calibration */ + if (ts_write_cmd(touch_dev->client, + ZINITIX_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_init; + if (ts_write_reg(touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, + touch_dev->cap_info.chip_int_mask) != I2C_SUCCESS) + goto fail_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + ts_write_cmd(touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + } + + if (touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { /* Test Mode */ + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + zinitix_printk("fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + } else + { + if (ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_init; + zinitix_debug_msg("esd timer register = %d\r\n", reg_val); + } + + zinitix_debug_msg("successfully initialized\r\n"); + return true; + +fail_init: + + if (++retry_cnt <= ZINITIX_INIT_RETRY_CNT) { + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_DELAY); + ts_power_control(POWER_ON); + mdelay(CHIP_ON_DELAY); + zinitix_debug_msg("retry to initiallize(retry cnt = %d)\r\n", + retry_cnt); + goto retry_init; + } else if(retry_cnt == ZINITIX_INIT_RETRY_CNT+1) { + touch_dev->cap_info.chip_fw_size = 32*1024; + + zinitix_debug_msg("retry to initiallize(retry cnt = %d)\r\n", retry_cnt); +#if TOUCH_FORCE_UPGRADE + if( ts_upgrade_firmware(touch_dev, &m_firmware_data[2], + touch_dev->cap_info.chip_fw_size) == false) { + zinitix_printk("upgrade fail\n"); + return false; + } + mdelay(100); + // hw calibration and make checksum + if(ts_hw_calibration(touch_dev) == false) + goto fail_hwcal_init; + goto retry_init; +#endif + } +fail_hwcal_init: + zinitix_printk("failed to initiallize\r\n"); + return false; +} + +static void zinitix_clear_report_data(struct zinitix_touch_dev *touch_dev) +{ + int i; + u8 reported = 0; + u8 sub_status; + + + for (i = 0; i < touch_dev->cap_info.button_num; i++) { + if (touch_dev->button[i] == ICON_BUTTON_DOWN) { + touch_dev->button[i] = ICON_BUTTON_UP; + input_report_key(touch_dev->input_dev, + BUTTON_MAPPING_KEY[i], 0); + reported = true; + zinitix_debug_msg("button up = %d \r\n", i); + } + } + + + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = touch_dev->reported_touch_info.coord[i].sub_status; + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { +#if MULTI_PROTOCOL_TYPE_B + input_mt_slot(touch_dev->input_dev, i); + input_mt_report_slot_state(touch_dev->input_dev, + MT_TOOL_FINGER, 0); + + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, -1); +#else + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, i); + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, + touch_dev->reported_touch_info.coord[i].x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, + touch_dev->reported_touch_info.coord[i].y); + input_mt_sync(touch_dev->input_dev); +#endif + + reported = true; + if (!m_ts_debug_mode) + printk(KERN_INFO "[TSP] R %02d\r\n", i); + } + touch_dev->reported_touch_info.coord[i].sub_status = 0; + } + if (reported) { +#if !MULTI_PROTOCOL_TYPE_B + input_report_key(touch_dev->input_dev, BTN_TOUCH, 0); +#endif + input_sync(touch_dev->input_dev); + } + +} + + +static void zinitix_parsing_data(struct zinitix_touch_dev *touch_dev) +{ + + int i; + u8 reported = false; + u8 sub_status; + u8 prev_sub_status; + u32 x, y; + u32 w; + u32 tmp; + + if(touch_dev == NULL) { + printk(KERN_INFO "zinitix_parsing_data : touch_dev == NULL?\n"); + return; + } + + if (touch_dev->use_esd_timer) { + ts_esd_timer_stop(touch_dev); + zinitix_debug_msg("esd timer stop\r\n"); + } + +#if !USE_THREADED_IRQ + down(&touch_dev->work_proceedure_lock); +#endif + if (touch_dev->work_proceedure != TS_NO_WORK) { + zinitix_debug_msg("zinitix_touch_thread : \ + [warning] other process occupied..\r\n"); + udelay(DELAY_FOR_SIGNAL_DELAY); + if (!gpio_get_value(touch_dev->int_gpio_num)) { + ts_write_cmd(touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + } + + goto continue_parsing_data; + } + touch_dev->work_proceedure = TS_NORMAL_WORK; + if (ts_read_coord(touch_dev) == false || touch_dev->touch_info.status == 0xffff) { + zinitix_debug_msg("couldn't read touch_dev coord. maybe chip is dead\r\n"); + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_DELAY); + ts_power_control(POWER_ON); + mdelay(CHIP_ON_DELAY); + + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(touch_dev); + ts_mini_init_touch(touch_dev); + goto continue_parsing_data; + } + + + if (touch_dev->raw_mode_flag == TOUCH_TEST_RAW_MODE) + goto continue_parsing_data; + + /* invalid : maybe periodical repeated int. */ + if (touch_dev->touch_info.status == 0x0) + goto continue_parsing_data; + + reported = false; + + if (zinitix_bit_test(touch_dev->touch_info.status, BIT_ICON_EVENT)) { + for (i = 0; i < touch_dev->cap_info.button_num; i++) { + if (zinitix_bit_test(touch_dev->icon_event_reg, + (BIT_O_ICON0_DOWN+i))) { + touch_dev->button[i] = ICON_BUTTON_DOWN; + input_report_key(touch_dev->input_dev, + BUTTON_MAPPING_KEY[i], 1); + reported = true; + zinitix_debug_msg("button down = %d\r\n", i); + if (!m_ts_debug_mode) + printk(KERN_INFO "[TSP] button down = %d\r\n", i); + } + } + + for (i = 0; i < touch_dev->cap_info.button_num; i++) { + if (zinitix_bit_test(touch_dev->icon_event_reg, + (BIT_O_ICON0_UP+i))) { + touch_dev->button[i] = ICON_BUTTON_UP; + input_report_key(touch_dev->input_dev, + BUTTON_MAPPING_KEY[i], 0); + reported = true; + + zinitix_debug_msg("button up = %d\r\n", i); + if (!m_ts_debug_mode) + printk(KERN_INFO "[TSP] button down = %d\r\n", i); + } + } + } + + /* if button press or up event occured... */ + if (reported == true || !zinitix_bit_test(touch_dev->touch_info.status, BIT_PT_EXIST)) { + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + prev_sub_status = + touch_dev->reported_touch_info.coord[i].sub_status; + if (zinitix_bit_test(prev_sub_status, SUB_BIT_EXIST)) { + zinitix_debug_msg("finger [%02d] up\r\n", i); + +#if MULTI_PROTOCOL_TYPE_B + input_mt_slot(touch_dev->input_dev, i); + input_mt_report_slot_state(touch_dev->input_dev, + MT_TOOL_FINGER, 0); + + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, -1); +#else + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, i); + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, + touch_dev->reported_touch_info.coord[i].x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, + touch_dev->reported_touch_info.coord[i].y); + input_mt_sync(touch_dev->input_dev); +#endif + if (!m_ts_debug_mode) + printk(KERN_INFO "[TSP] R %02d\r\n", i); + } + } + memset(&touch_dev->reported_touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); +#if !MULTI_PROTOCOL_TYPE_B + input_report_key(touch_dev->input_dev, BTN_TOUCH, 0); +#endif + input_sync(touch_dev->input_dev); + if(reported == true) // for button event + udelay(100); + goto continue_parsing_data; + } + if (touch_dev->touch_info.finger_cnt > MAX_SUPPORTED_FINGER_NUM) + touch_dev->touch_info.finger_cnt = MAX_SUPPORTED_FINGER_NUM; + + for (i = 0; i < touch_dev->cap_info.multi_fingers; i++) { + sub_status = touch_dev->touch_info.coord[i].sub_status; + + if (zinitix_bit_test(sub_status, SUB_BIT_DOWN) + || zinitix_bit_test(sub_status, SUB_BIT_MOVE) + || zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + + x = touch_dev->touch_info.coord[i].x; + y = touch_dev->touch_info.coord[i].y; + w = touch_dev->touch_info.coord[i].width; + + /* transformation from touch to screen orientation */ + if (touch_dev->cap_info.Orientation & TOUCH_V_FLIP) + y = touch_dev->cap_info.MaxY + + touch_dev->cap_info.MinY - y; + if (touch_dev->cap_info.Orientation & TOUCH_H_FLIP) + x = touch_dev->cap_info.MaxX + + touch_dev->cap_info.MinX - x; + if (touch_dev->cap_info.Orientation & TOUCH_XY_SWAP) + zinitix_swap_v(x, y, tmp); + touch_dev->touch_info.coord[i].x = x; + touch_dev->touch_info.coord[i].y = y; + zinitix_debug_msg("finger [%02d] x = %d, y = %d\r\n", + i, x, y); + + if (w == 0) + w = 1; + + prev_sub_status = + touch_dev->reported_touch_info.coord[i].sub_status; + + if (!m_ts_debug_mode && !zinitix_bit_test(prev_sub_status, SUB_BIT_EXIST)) + printk(KERN_INFO "[TSP] P %02d\r\n", i); + +#if MULTI_PROTOCOL_TYPE_B + input_mt_slot(touch_dev->input_dev, i); + input_mt_report_slot_state(touch_dev->input_dev, + MT_TOOL_FINGER, 1); + if (!zinitix_bit_test(prev_sub_status, SUB_BIT_EXIST)) +#endif + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, i); + + + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, (u32)w); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, (u32)w); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, y); +#if !MULTI_PROTOCOL_TYPE_B + input_mt_sync(touch_dev->input_dev); +#endif + }else if (zinitix_bit_test(sub_status, SUB_BIT_UP)) { + zinitix_debug_msg("finger [%02d] up \r\n", i); + + memset(&touch_dev->touch_info.coord[i], + 0x0, sizeof(struct _ts_zinitix_coord)); +#if MULTI_PROTOCOL_TYPE_B + input_mt_slot(touch_dev->input_dev, i); + input_mt_report_slot_state(touch_dev->input_dev, + MT_TOOL_FINGER, 0); + + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, -1); +#else + input_report_abs(touch_dev->input_dev, + ABS_MT_TRACKING_ID, i); + input_report_abs(touch_dev->input_dev, + ABS_MT_TOUCH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_WIDTH_MAJOR, 0); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_X, + touch_dev->reported_touch_info.coord[i].x); + input_report_abs(touch_dev->input_dev, + ABS_MT_POSITION_Y, + touch_dev->reported_touch_info.coord[i].y); + input_mt_sync(touch_dev->input_dev); +#endif + + if (!m_ts_debug_mode) + printk(KERN_INFO "[TSP] R %02d\r\n", i); + + } else + memset(&touch_dev->touch_info.coord[i], + 0x0, sizeof(struct _ts_zinitix_coord)); + + } + memcpy((char *)&touch_dev->reported_touch_info, + (char *)&touch_dev->touch_info, + sizeof(struct _ts_zinitix_point_info)); +#if !MULTI_PROTOCOL_TYPE_B + input_report_key(touch_dev->input_dev, BTN_TOUCH, 1); +#endif + input_sync(touch_dev->input_dev); + +continue_parsing_data: + + /* check_interrupt_pin, if high, enable int & wait signal */ + if (touch_dev->work_proceedure == TS_NORMAL_WORK) { + if (touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + zinitix_debug_msg("esd tmr start\n"); + } + touch_dev->work_proceedure = TS_NO_WORK; + } +#if !USE_THREADED_IRQ + up(&touch_dev->work_proceedure_lock); +#endif +} + + +#if USE_THREADED_IRQ +static irqreturn_t zinitix_touch_work(int irq, void *data) +{ + struct zinitix_touch_dev* touch_dev = (struct zinitix_touch_dev*)data; + zinitix_debug_msg("threaded irq signalled\r\n"); + zinitix_parsing_data(touch_dev); + return IRQ_HANDLED; +} +#else +static void zinitix_touch_work(struct work_struct *work) +{ + + struct zinitix_touch_dev *touch_dev = + container_of(work, struct zinitix_touch_dev, work); + + zinitix_debug_msg("signalled\r\n"); + zinitix_parsing_data(touch_dev); + enable_irq(touch_dev->irq); +} +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zinitix_late_resume(struct early_suspend *h) +{ + + struct zinitix_touch_dev *touch_dev; + touch_dev = container_of(h, struct zinitix_touch_dev, early_suspend); + + if (touch_dev == NULL) + return; + zinitix_printk("late resume++\r\n"); + + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_IN_RESUME + && touch_dev->work_proceedure != TS_IN_EALRY_SUSPEND) { + zinitix_printk("invalid work proceedure (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + return; + } +#ifdef CONFIG_PM_SLEEP + ts_write_cmd(touch_dev->client, ZINITIX_WAKEUP_CMD); + mdelay(10); +#else + ts_power_control(POWER_ON); + mdelay(CHIP_ON_DELAY); +#endif + if (ts_mini_init_touch(touch_dev) == false) + goto fail_late_resume; + enable_irq(touch_dev->irq); + touch_dev->work_proceedure = TS_NO_WORK; + up(&touch_dev->work_proceedure_lock); + zinitix_printk("resume--\n"); + return; +fail_late_resume: + zinitix_printk("failed to resume\n"); + enable_irq(touch_dev->irq); + touch_dev->work_proceedure = TS_NO_WORK; + up(&touch_dev->work_proceedure_lock); + return; +} + + +static void zinitix_early_suspend(struct early_suspend *h) +{ + struct zinitix_touch_dev *touch_dev = + container_of(h, struct zinitix_touch_dev, early_suspend); + + if (touch_dev == NULL) + return; + + zinitix_printk("early suspend++\n"); + + disable_irq(touch_dev->irq); + if (touch_dev->use_esd_timer) + flush_work(&touch_dev->tmr_work); +#if !USE_THREADED_IRQ + flush_work(&touch_dev->work); +#endif + + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK) { + zinitix_printk("invalid work proceedure (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + enable_irq(touch_dev->irq); + return; + } + touch_dev->work_proceedure = TS_IN_EALRY_SUSPEND; + + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(touch_dev); + + if (touch_dev->use_esd_timer) { + ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, 0); + ts_esd_timer_stop(touch_dev); + zinitix_printk("ts_esd_timer_stop\n"); + } + +#ifdef CONFIG_PM_SLEEP + ts_write_reg(touch_dev->client, ZINITIX_INT_ENABLE_FLAG, 0x0); + + udelay(100); + if (ts_write_cmd(touch_dev->client, ZINITIX_SLEEP_CMD) != I2C_SUCCESS) { + zinitix_printk("failed to enter into sleep mode\n"); + up(&touch_dev->work_proceedure_lock); + return; + } +#else + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_DELAY); +#endif + zinitix_printk("early suspend--\n"); + up(&touch_dev->work_proceedure_lock); + return; +} + +#endif /* CONFIG_HAS_EARLYSUSPEND */ + + + +#ifdef CONFIG_PM_SLEEP + +static int zinitix_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct zinitix_touch_dev *touch_dev = i2c_get_clientdata(client); + if (touch_dev == NULL) + return 0; + + zinitix_debug_msg("resume++\n"); + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_IN_SUSPEND) { + zinitix_printk("invalid work proceedure (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); + return 0; + } + + ts_power_control(POWER_ON); + msleep(CHIP_ON_DELAY); + +#ifdef CONFIG_HAS_EARLYSUSPEND + touch_dev->work_proceedure = TS_IN_RESUME; +#else + touch_dev->work_proceedure = TS_NO_WORK; + if (ts_mini_init_touch(touch_dev) == false) + zinitix_printk("failed to resume\n"); + enable_irq(touch_dev->irq); +#endif + + + zinitix_debug_msg("resume--\n"); + up(&touch_dev->work_proceedure_lock); + return 0; +} + +static int zinitix_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct zinitix_touch_dev *touch_dev = i2c_get_clientdata(client); + if (touch_dev == NULL) + return 0; + + zinitix_debug_msg("suspend++\n"); + +#ifndef CONFIG_HAS_EARLYSUSPEND + disable_irq(touch_dev->irq); +#endif + if (touch_dev->use_esd_timer) + flush_work(&touch_dev->tmr_work); +#if !USE_THREADED_IRQ + flush_work(&touch_dev->work); +#endif + down(&touch_dev->work_proceedure_lock); + if (touch_dev->work_proceedure != TS_NO_WORK + && touch_dev->work_proceedure != TS_IN_EALRY_SUSPEND) { + zinitix_printk("zinitix_suspend : invalid work proceedure (%d)\r\n", + touch_dev->work_proceedure); + up(&touch_dev->work_proceedure_lock); +#ifndef CONFIG_HAS_EARLYSUSPEND + enable_irq(touch_dev->irq); +#endif + return 0; + } + +#ifndef CONFIG_HAS_EARLYSUSPEND + zinitix_clear_report_data(touch_dev); + + if (touch_dev->use_esd_timer) { + ts_esd_timer_stop(touch_dev); + zinitix_printk("ts_esd_timer_stop\n"); + } + + ts_write_cmd(touch_dev->client, ZINITIX_SLEEP_CMD); + udelay(100); +#endif + + ts_power_control(POWER_OFF); + mdelay(CHIP_POWER_OFF_DELAY); + + touch_dev->work_proceedure = TS_IN_SUSPEND; + + zinitix_debug_msg("suspend--\n"); + up(&touch_dev->work_proceedure_lock); + return 0; +} + +#endif + +static SIMPLE_DEV_PM_OPS(zinitix_dev_pm_ops, + zinitix_suspend, zinitix_resume); + + + +#if SEC_TOUCH_INFO_REPORT + +#define MAX_X_NODE_CNT 20 +#define MAX_Y_NODE_CNT 16 +#define ZINITIX_MENU_KEY 158 +#define ZINITIX_BACK_KEY 151 +#define CAL_MIN_NUM 1400 +#define CAL_MAX_NUM 2030 +#define INT_WAIT_TIME 50 + +#define CHIP_INFO "ZINITIX" + +static ssize_t zinitix_get_test_raw_data(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i,j; + int k = 0; + + int written_bytes = 0 ; /* & error check */ + + int16_t raw_data[MAX_X_NODE_CNT][MAX_Y_NODE_CNT]={{0,},}; + int16_t diff_data[MAX_X_NODE_CNT][MAX_Y_NODE_CNT]={{0,},}; + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + down(&misc_touch_dev->raw_data_lock); + + for(j = 0 ; j < misc_touch_dev->cap_info.y_node_num; j++) + { + k = j; + for(i = 0 ; i < misc_touch_dev->cap_info.x_node_num ; i++) + { + raw_data[i][j] =(int)(misc_touch_dev->ref_data[k]&0xffff); + diff_data[i][j] =(int)(((s16)(misc_touch_dev->cur_data[k]-misc_touch_dev->ref_data[k]))&0xffff); + k+=misc_touch_dev->cap_info.y_node_num; + } + } + + up(&misc_touch_dev->raw_data_lock); + + if(m_ts_debug_mode) { + for(i = 0 ; i < misc_touch_dev->cap_info.x_node_num ; i++) { + printk("[TSP]"); + for(j = 0 ; j < misc_touch_dev->cap_info.y_node_num ; j++ ) + printk(" %5d", raw_data[i][j]); + printk("\n"); + } + + for(i = 0 ; i < misc_touch_dev->cap_info.x_node_num ; i++) { + printk("[TSP]"); + for(j = 0 ; j < misc_touch_dev->cap_info.y_node_num ; j++ ) + printk(" %5d", diff_data[i][j]); + printk("\n"); + } + } + + for(j = 0 ; j < misc_touch_dev->cap_info.y_node_num ; j++) + { + for (i = 0; i < misc_touch_dev->cap_info.x_node_num ; i++) + written_bytes += sprintf(buf+written_bytes, "%d %d\n", raw_data[i][j], diff_data[i][j]); + } + + if (written_bytes > 0) + return written_bytes; + + return sprintf(buf, "-1"); +} + + +ssize_t zinitix_set_testmode(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + unsigned char value = 0; + int i; + + printk(KERN_INFO "[zinitix_touch] zinitix_set_testmode, buf = %d\r\n", *buf); + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + sscanf(buf, "%c", &value); + + if(value != TOUCH_TEST_RAW_MODE && value != TOUCH_NORMAL_MODE) + { + printk(KERN_WARNING "[zinitix ts] test mode setting value error. you must set %d[=normal] or %d[=raw mode]\r\n", TOUCH_NORMAL_MODE, TOUCH_TEST_RAW_MODE); + return 1; + } + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + + misc_touch_dev->raw_mode_flag = value; + + printk(KERN_INFO "[zinitix_touch] zinitix_set_testmode, touchkey_testmode = %d\r\n", misc_touch_dev->raw_mode_flag); + + if(misc_touch_dev->raw_mode_flag == TOUCH_NORMAL_MODE) { + printk(KERN_INFO "[zinitix_touch] TEST Mode Exit\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_PERIODICAL_INTERRUPT_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_MODE)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_MODE); + + } else { + printk(KERN_INFO "[zinitix_touch] TEST Mode Enter\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_TEST_RAW_MODE)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] TEST Mode : Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_TEST_RAW_MODE); + + memset(&misc_touch_dev->reported_touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + memset(&misc_touch_dev->touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + } + // clear garbage data + for(i=0; i<=20; i++) { + mdelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + } + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return 1; + +} + +static ssize_t zinitix_tkey_reference(struct device *dev, struct device_attribute *attr, char *buf) +{ + + printk(KERN_INFO "[zinitix_touch] %s\r\n", __FUNCTION__); + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + printk(KERN_INFO "[zinitix_touch] %s : menu(%d), back(%d)\r\n", __FUNCTION__, misc_touch_dev->ref_data[ZINITIX_MENU_KEY], misc_touch_dev->ref_data[ZINITIX_BACK_KEY]); + + return sprintf(buf, "%d %d", misc_touch_dev->ref_data[ZINITIX_MENU_KEY], misc_touch_dev->ref_data[ZINITIX_BACK_KEY]); +} + +static ssize_t zinitix_tkey_data(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk(KERN_INFO "[zinitix_touch] %s\r\n", __FUNCTION__); + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + printk(KERN_INFO "[zinitix_touch] %s : menu(%d)(%d), back(%d)(%d)\r\n", __FUNCTION__, + misc_touch_dev->ref_data[ZINITIX_MENU_KEY], misc_touch_dev->cur_data[ZINITIX_MENU_KEY], + misc_touch_dev->ref_data[ZINITIX_BACK_KEY], misc_touch_dev->cur_data[ZINITIX_BACK_KEY]); + + return sprintf(buf, "%d\n%d\n%d\n%d\n", misc_touch_dev->ref_data[ZINITIX_MENU_KEY], misc_touch_dev->cur_data[ZINITIX_MENU_KEY], + misc_touch_dev->ref_data[ZINITIX_BACK_KEY], misc_touch_dev->cur_data[ZINITIX_BACK_KEY]); +} +static int16_t zinitix_cal_ndata[MAX_X_NODE_CNT][MAX_Y_NODE_CNT] = {{0,},}; +static ssize_t zinitix_touch_cal_ndata(struct device *dev, struct device_attribute *attr, char *buf) +{ + int time_out = 0; + int i, j; + int interrup_detecting; + int node_num; + int written_bytes = 0; /* error check */ + + int16_t raw_data[MAX_X_NODE_CNT][MAX_Y_NODE_CNT] = {{0,},}; + + printk(KERN_INFO "[zinitix_touch] zinitix_read_raw_data( )\r\n"); + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + + disable_irq(misc_touch_dev->client->irq); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 7) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + udelay(10); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + + //garbage data + for(i=0; i<20; i++) { + mdelay(20); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } + + + for (i = 0; i < INT_WAIT_TIME; i++) { + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + time_out = 0; + interrup_detecting = 1; + + while (gpio_get_value(misc_touch_dev->int_gpio_num)) { + mdelay(1); + + if (time_out++ > 20) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + interrup_detecting = 0; + break; + } + } + if (i == INT_WAIT_TIME) { + printk(KERN_INFO "[zinitix_touch] interrupt disable timed out\r\n"); + goto fail_read_raw; + } + + if ((interrup_detecting == 1) && (time_out < 20)) { + if (ts_read_raw_data(misc_touch_dev->client, + ZINITIX_RAWDATA_REG, (char *)raw_data, + MAX_TEST_RAW_DATA*2) < 0) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_RAWDATA_REG fail\r\n"); + goto fail_read_raw; + } + memcpy(zinitix_cal_ndata, raw_data, MAX_TEST_RAW_DATA*2); + break; + } + } + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + + if(m_ts_debug_mode) { + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + printk(KERN_CONT "[TSP]"); + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) + printk(KERN_CONT " %5d", raw_data[i][j]); + printk(KERN_CONT "\n"); + } + } + + // check cal ndata range + for (i = 0; i < misc_touch_dev->cap_info.x_node_num-1; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + if (raw_data[i][j] < CAL_MIN_NUM) + return snprintf(buf, 2, "0"); + + if (raw_data[i][j] > CAL_MAX_NUM) + return snprintf(buf, 2, "0"); + } + } + + // check cal touch key ndata range + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + node_num = ((misc_touch_dev->cap_info.x_node_num-1)*misc_touch_dev->cap_info.y_node_num) + j; + if(node_num == ZINITIX_MENU_KEY || node_num == ZINITIX_BACK_KEY) { + if (raw_data[misc_touch_dev->cap_info.x_node_num-1][j] + < CAL_MIN_NUM) + return snprintf(buf, 2, "0"); + + if (raw_data[misc_touch_dev->cap_info.x_node_num-1][j] + > CAL_MAX_NUM) + return snprintf(buf, 2, "0"); + } + } + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + written_bytes += sprintf(buf+written_bytes, "%d,",raw_data[i][j]); + } + } + if(written_bytes > 0) + return written_bytes; +fail_read_raw: + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + udelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + + return snprintf(buf, 2, "-1"); +} + +static ssize_t zinitix_touch_ndata_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i,j,written_bytes=0; + printk("[TSP] %s\n",__func__); + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num-1; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + written_bytes += sprintf(buf+written_bytes, "%d,",zinitix_cal_ndata[i][j]); + } + } + if(written_bytes > 0) + return written_bytes; +} +static ssize_t zinitix_delta(struct device *dev, struct device_attribute *attr, char *buf) +{ + int written_bytes = 0, i; + + printk(KERN_INFO "[zinitix_touch] %s\r\n", __FUNCTION__); + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + for(i = 0 ; i < misc_touch_dev->cap_info.total_node_num; i++) { + written_bytes += sprintf(buf+written_bytes, "%d,", misc_touch_dev->cur_data[i] - misc_touch_dev->ref_data[i]) ; + } + + if(written_bytes > 0) + return written_bytes; +} + +static ssize_t zinitix_cal_ncount(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i, j; + int written_bytes = 0; /* error check */ + + u8 raw_data[MAX_X_NODE_CNT][MAX_Y_NODE_CNT] = {{0,},}; + + printk(KERN_INFO "[zinitix_touch] zinitix_cal_ncount( )\r\n"); + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + + disable_irq(misc_touch_dev->client->irq); + + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, 8) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + //clear garbage data + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + for(i=0; i<20; i++) { + mdelay(20); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } + + + if (ts_read_raw_data(misc_touch_dev->client, + ZINITIX_RAWDATA_REG, (char *)raw_data, MAX_X_NODE_CNT*MAX_Y_NODE_CNT) < 0) { + printk(KERN_INFO "[TSP] error : read zinitix tc Cal N count data\n"); + goto fail_read_raw; + } + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(20); + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + + + if(m_ts_debug_mode) { + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + printk("[TSP]"); + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + printk(" %d", raw_data[i][j]); + } + printk("\n"); + } + } + + + for (i = 0; i < misc_touch_dev->cap_info.x_node_num; i++) { + for (j = 0; j < misc_touch_dev->cap_info.y_node_num; j++) { + written_bytes +=sprintf(buf+written_bytes, "%d,",raw_data[i][j]); + + } + } + + if(written_bytes > 0) + return written_bytes; + + return snprintf(buf, 2, "-1"); + +fail_read_raw: + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) { + printk(KERN_INFO "[zinitix_touch] ZINITIX_TOUCH_MODE fail\r\n"); + goto fail_read_raw; + } + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + udelay(10); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + + return snprintf(buf, 2, "-1"); +} + +static ssize_t zinitix_enter_testmode(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i; + + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + //printk(KERN_INFO "[zinitix_touch] %s name : %s\r\n", __FUNCTION__, misc_touch_dev->client->name); + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + misc_touch_dev->raw_mode_flag = TOUCH_TEST_RAW_MODE; + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_TEST_RAW_MODE)!=I2C_SUCCESS) + { + printk(KERN_INFO "[zinitix_touch] TEST Mode : Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_TEST_RAW_MODE); + } + + ts_write_cmd(misc_touch_dev->client, ZINITIX_CLEAR_INT_STATUS_CMD); + //clear garbage data + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + for(i=0; i<20; i++) { + mdelay(20); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } + zinitix_clear_report_data(misc_touch_dev); + memset(&misc_touch_dev->reported_touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + memset(&misc_touch_dev->touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + return 1; +} + +static ssize_t zinitix_enter_ncountmode(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i; + printk(KERN_INFO "[zinitix_touch] %s 111 name : %s\r\n", __FUNCTION__, misc_touch_dev->client->name); + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + misc_touch_dev->raw_mode_flag = TOUCH_ZINITIX_CAL_N_MODE; + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_ZINITIX_CAL_N_MODE)!=I2C_SUCCESS) + { + printk(KERN_INFO "[zinitix_touch] TEST Mode : Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_ZINITIX_CAL_N_MODE); + } + + //clear garbage data + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + for(i=0; i<20; i++) { + mdelay(20); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } + zinitix_clear_report_data(misc_touch_dev); + memset(&misc_touch_dev->reported_touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + memset(&misc_touch_dev->touch_info, 0x0, sizeof(struct _ts_zinitix_point_info)); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + return 1; +} + +static ssize_t zinitix_enter_normalmode(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i; + + printk(KERN_INFO "[zinitix_touch] %s\r\n", __FUNCTION__); + + if(misc_touch_dev == NULL) { + zinitix_debug_msg("device NULL : NULL\n"); + return 0; + } + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + misc_touch_dev->raw_mode_flag = TOUCH_NORMAL_MODE; + + printk(KERN_INFO "[zinitix_touch] TEST Mode Exit\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, ZINITIX_SCAN_RATE_HZ*ZINITIX_ESD_TIMER_INTERVAL)!=I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_PERIODICAL_INTERRUPT_INTERVAL.\r\n"); + + if (ts_write_reg(misc_touch_dev->client, ZINITIX_TOUCH_MODE, TOUCH_MODE)!=I2C_SUCCESS) + { + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITX_TOUCH_MODE %d.\r\n", TOUCH_MODE); + } + //clear garbage data + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + for(i=0; i<20; i++) { + mdelay(20); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + } + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + enable_irq(misc_touch_dev->client->irq); + return 1; +} +static ssize_t zinitix_count_node(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk("[TSP] %s\n",__func__); + return sprintf(buf, "%d,%d\n", misc_touch_dev->cap_info.x_node_num,misc_touch_dev->cap_info.y_node_num); +} +static ssize_t zinitix_chip_info(struct device *dev, struct device_attribute *attr, char *buf) +{ + printk("[TSP] %s\n",__func__); + return sprintf(buf, "%s, BT%03X\n", CHIP_INFO, (misc_touch_dev->cap_info.chip_revision>>4)); +} +static ssize_t zinitix_menu_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int ret = 0; + u16 menu_sensitivity; + + ret = ts_read_data(misc_touch_dev->client, 0x00A8, (u8*)&menu_sensitivity, 2); + + if (ret<0) + return sprintf(buf, "%s\n", "fail to read menu_sensitivity."); + else + return sprintf(buf, "%d\n", menu_sensitivity); +} + +static ssize_t zinitix_back_sensitivity_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int ret = 0; + u16 back_sensitivity; + + ret = ts_read_data(misc_touch_dev->client, 0x00A9, (u8*)&back_sensitivity, 2); + + if (ret<0) + return sprintf(buf, "%s\n", "fail to read back_sensitivity."); + else + return sprintf(buf, "%d\n", back_sensitivity); +} +static DEVICE_ATTR(get_touch_raw_data, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_get_test_raw_data, zinitix_set_testmode); +static DEVICE_ATTR(tkey_reference, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_tkey_reference, NULL); +static DEVICE_ATTR(touch_cal_ndata, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_touch_cal_ndata, NULL); +static DEVICE_ATTR(delta, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_delta, NULL); +static DEVICE_ATTR(cal_ncount, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_cal_ncount, NULL); +static DEVICE_ATTR(enter_testmode, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_enter_testmode, NULL); +static DEVICE_ATTR(enter_normalmode, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_enter_normalmode, NULL); +static DEVICE_ATTR(count_node, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_count_node, NULL); +static DEVICE_ATTR(chip_info, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_chip_info, NULL); +static DEVICE_ATTR(menu_sensitivity, S_IRUGO | S_IWUSR | S_IWGRP, zinitix_menu_sensitivity_show, NULL); +static DEVICE_ATTR(back_sensitivity, S_IRUGO | S_IWUSR | S_IWGRP, zinitix_back_sensitivity_show, NULL); +static DEVICE_ATTR(touch_ndata, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_touch_ndata_show, NULL); +static DEVICE_ATTR(tkey_data, S_IRUGO | S_IWUSR | S_IWOTH | S_IXOTH, zinitix_tkey_data, NULL); + +#endif + +static int ts_misc_fops_open(struct inode *inode, struct file *filp) +{ + return 0; +} + +static int ts_misc_fops_close(struct inode *inode, struct file *filp) +{ + return 0; +} + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) +static int ts_misc_fops_ioctl(struct inode *inode, + struct file *filp, unsigned int cmd, + unsigned long arg) +#else +static long ts_misc_fops_ioctl(struct file *filp, + unsigned int cmd, unsigned long arg) +#endif +{ + void __user *argp = (void __user *)arg; + struct _raw_ioctl raw_ioctl; + u8 *u8Data; + int i, j; + int ret = 0; + size_t sz = 0; + u16 version; + u8 div_node; + int total_cal_n; + + u16 mode; + + struct _reg_ioctl reg_ioctl; + u16 val; + int nval = 0; + + if (misc_touch_dev == NULL) + return -1; + + /* zinitix_debug_msg("cmd = %d, argp = 0x%x\n", cmd, (int)argp); */ + + switch (cmd) { + + case TOUCH_IOCTL_GET_DEBUGMSG_STATE: + ret = m_ts_debug_mode; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_SET_DEBUGMSG_STATE: + if (copy_from_user(&nval, argp, 4)) { + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + if (nval) + printk(KERN_INFO "[zinitix_touch] on debug mode (%d)\n", + nval); + else + printk(KERN_INFO "[zinitix_touch] off debug mode (%d)\n", + nval); + m_ts_debug_mode = nval; + break; + + case TOUCH_IOCTL_GET_CHIP_REVISION: + ret = misc_touch_dev->cap_info.chip_revision; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_FW_VERSION: + ret = misc_touch_dev->cap_info.chip_firmware_version; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_REG_DATA_VERSION: + ret = misc_touch_dev->cap_info.chip_reg_data_version; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_VARIFY_UPGRADE_SIZE: + if (copy_from_user(&sz, argp, sizeof(size_t))) + return -1; + + printk(KERN_INFO "firmware size = %d\r\n", sz); + if (misc_touch_dev->cap_info.chip_fw_size != sz) { + printk(KERN_INFO "firmware size error\r\n"); + return -1; + } + break; + + case TOUCH_IOCTL_VARIFY_UPGRADE_DATA: + if (copy_from_user(&m_firmware_data[2], + argp, misc_touch_dev->cap_info.chip_fw_size)) + return -1; + + version = + (u16)(((u16)m_firmware_data[FIRMWARE_VERSION_POS+1]<<8) + |(u16)m_firmware_data[FIRMWARE_VERSION_POS]); + + printk(KERN_INFO "firmware version = %x\r\n", version); + + if (copy_to_user(argp, &version, sizeof(version))) + return -1; + break; + + case TOUCH_IOCTL_START_UPGRADE: + disable_irq(misc_touch_dev->irq); + down(&misc_touch_dev->work_proceedure_lock); + misc_touch_dev->work_proceedure = TS_IN_UPGRADE; + + if (misc_touch_dev->use_esd_timer) + ts_esd_timer_stop(misc_touch_dev); + zinitix_debug_msg("clear all reported points\r\n"); + zinitix_clear_report_data(misc_touch_dev); + + printk(KERN_INFO "start upgrade firmware\n"); + if (ts_upgrade_firmware(misc_touch_dev, + &m_firmware_data[2], + misc_touch_dev->cap_info.chip_fw_size) == false) { + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + if (ts_init_touch(misc_touch_dev) == false) { + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + + if (misc_touch_dev->use_esd_timer) { + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, + misc_touch_dev); + zinitix_debug_msg("esd timer start\r\n"); + } + + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + break; + + case TOUCH_IOCTL_GET_X_RESOLUTION: + ret = misc_touch_dev->cap_info.x_resolution; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_Y_RESOLUTION: + ret = misc_touch_dev->cap_info.y_resolution; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_X_NODE_NUM: + ret = misc_touch_dev->cap_info.x_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_Y_NODE_NUM: + ret = misc_touch_dev->cap_info.y_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_GET_TOTAL_NODE_NUM: + ret = misc_touch_dev->cap_info.total_node_num; + if (copy_to_user(argp, &ret, sizeof(ret))) + return -1; + break; + + case TOUCH_IOCTL_HW_CALIBRAION: + ret = -1; + disable_irq(misc_touch_dev->irq); + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_HW_CALIBRAION; + mdelay(100); + + /* h/w calibration */ + if(ts_hw_calibration(misc_touch_dev) == false) + goto fail_hw_cal; + + ret = 0; +fail_hw_cal: + if (misc_touch_dev->raw_mode_flag == TOUCH_NORMAL_MODE) + mode = TOUCH_MODE; + else + mode = misc_touch_dev->raw_mode_flag; + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, mode) != I2C_SUCCESS) { + printk(KERN_INFO "fail to set touch mode %d.\n", + mode); + goto fail_hw_cal2; + } + + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_SWRESET_CMD) != I2C_SUCCESS) + goto fail_hw_cal2; + + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; +fail_hw_cal2: + enable_irq(misc_touch_dev->irq); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return -1; + + case TOUCH_IOCTL_SET_RAW_DATA_MODE: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + + if (copy_from_user(&nval, argp, 4)) { + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\r\n"); + misc_touch_dev->work_proceedure = TS_NO_WORK; + return -1; + } + + zinitix_debug_msg("[zinitix_touch] touchkey_testmode = %d\r\n", + misc_touch_dev->raw_mode_flag); + + if (nval == TOUCH_NORMAL_MODE && + misc_touch_dev->raw_mode_flag != TOUCH_NORMAL_MODE) { + /* enter into normal mode */ + misc_touch_dev->raw_mode_flag = nval; + printk(KERN_INFO "[zinitix_touch] raw data mode exit\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ*ZINITIX_ESD_TIMER_INTERVAL) + != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_PERIODICAL_INTERRUPT_INTERVAL.\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, TOUCH_MODE) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] fail to set TOUCH_MODE.\r\n"); + + } else if (nval != TOUCH_NORMAL_MODE) { + /* enter into test mode*/ + misc_touch_dev->raw_mode_flag = nval; + printk(KERN_INFO "[zinitix_touch] raw data mode enter\r\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, + ZINITIX_SCAN_RATE_HZ + *ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL) + != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] Fail to set ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL.\n"); + + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_TOUCH_MODE, + misc_touch_dev->raw_mode_flag) != I2C_SUCCESS) + printk(KERN_INFO "[zinitix_touch] raw data mode : Fail to set TOUCH_MODE %d.\n", + misc_touch_dev->raw_mode_flag); + } + /* clear garbage data */ + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + mdelay(100); + ts_write_cmd(misc_touch_dev->client, + ZINITIX_CLEAR_INT_STATUS_CMD); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return 0; + + case TOUCH_IOCTL_GET_REG: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + + if (copy_from_user(®_ioctl, + argp, sizeof(struct _reg_ioctl))) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (ts_read_data(misc_touch_dev->client, + reg_ioctl.addr, (u8 *)&val, 2) < 0) + ret = -1; + + nval = (int)val; + + if (copy_to_user(reg_ioctl.val, (u8 *)&nval, 4)) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_to_user\n"); + return -1; + } + + zinitix_debug_msg("read : reg addr = 0x%x, val = 0x%x\n", + reg_ioctl.addr, nval); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_SET_REG: + + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO "other process occupied.. (%d)\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + if (copy_from_user(®_ioctl, + argp, sizeof(struct _reg_ioctl))) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (copy_from_user(&val, reg_ioctl.val, 4)) { + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\n"); + return -1; + } + + if (ts_write_reg(misc_touch_dev->client, + reg_ioctl.addr, val) != I2C_SUCCESS) + ret = -1; + + zinitix_debug_msg("write : reg addr = 0x%x, val = 0x%x\r\n", + reg_ioctl.addr, val); + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_DONOT_TOUCH_EVENT: + + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + + misc_touch_dev->work_proceedure = TS_SET_MODE; + if (ts_write_reg(misc_touch_dev->client, + ZINITIX_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + ret = -1; + zinitix_debug_msg("write : reg addr = 0x%x, val = 0x0\r\n", + ZINITIX_INT_ENABLE_FLAG); + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_SEND_SAVE_STATUS: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + down(&misc_touch_dev->work_proceedure_lock); + if (misc_touch_dev->work_proceedure != TS_NO_WORK) { + printk(KERN_INFO"other process occupied.. (%d)\r\n", + misc_touch_dev->work_proceedure); + up(&misc_touch_dev->work_proceedure_lock); + return -1; + } + misc_touch_dev->work_proceedure = TS_SET_MODE; + ret = 0; + if (ts_write_cmd(misc_touch_dev->client, + ZINITIX_SAVE_STATUS_CMD) != I2C_SUCCESS) + ret = -1; + mdelay(1000); /* for fusing eeprom */ + + misc_touch_dev->work_proceedure = TS_NO_WORK; + up(&misc_touch_dev->work_proceedure_lock); + return ret; + + case TOUCH_IOCTL_GET_RAW_DATA: + if (misc_touch_dev == NULL) { + zinitix_debug_msg("misc device NULL?\n"); + return -1; + } + + if (misc_touch_dev->raw_mode_flag == TOUCH_NORMAL_MODE) + return -1; + + down(&misc_touch_dev->raw_data_lock); + if (misc_touch_dev->update == 0) { + up(&misc_touch_dev->raw_data_lock); + return -2; + } + + if (copy_from_user(&raw_ioctl, + argp, sizeof(raw_ioctl))) { + up(&misc_touch_dev->raw_data_lock); + printk(KERN_INFO "[zinitix_touch] error : copy_from_user\r\n"); + return -1; + } + + misc_touch_dev->update = 0; + + u8Data = (u8 *)&misc_touch_dev->cur_data[0]; + if (misc_touch_dev->raw_mode_flag == TOUCH_ZINITIX_CAL_N_MODE) { + + + j = 0; + total_cal_n = + misc_touch_dev->cap_info.total_cal_n; + if (total_cal_n == 0) + total_cal_n = 160; + div_node = + (u8)misc_touch_dev->cap_info.max_y_node; + if (div_node == 0) + div_node = 16; + u8Data = (u8 *)&misc_touch_dev->cur_data[0]; + for (i = 0; i < total_cal_n*2; i++) { + if (i%div_node < + misc_touch_dev->cap_info.y_node_num) { + misc_touch_dev->ref_data[j] = + (u16)u8Data[i]; + j++; + } + } + + u8Data = (u8 *)&misc_touch_dev->ref_data[0]; + } + + if (copy_to_user(raw_ioctl.buf, (u8 *)u8Data, + raw_ioctl.sz)) { + up(&misc_touch_dev->raw_data_lock); + return -1; + } + + up(&misc_touch_dev->raw_data_lock); + return 0; + + default: + break; + } + return 0; +} + + + +static int zinitix_touch_probe(struct i2c_client *client, + const struct i2c_device_id *i2c_id) +{ + int ret = 0; + struct zinitix_touch_dev *touch_dev; + int i; + + zinitix_debug_msg("zinitix_touch_probe+\r\n"); + + + zinitix_debug_msg("Above BT4x3 Driver\r\n"); + + printk(KERN_INFO "[zinitix touch] driver version = %s\r\n", + TS_DRVIER_VERSION); + + + if (strcmp(client->name, ZINITIX_ISP_NAME) == 0) { + printk(KERN_INFO "isp client probe \r\n"); + m_isp_client = client; + return 0; + } + + zinitix_debug_msg("i2c check function \r\n"); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + printk(KERN_ERR "error : not compatible i2c function \r\n"); + goto err_check_functionality; + } + + zinitix_debug_msg("touch data alloc \r\n"); + touch_dev = kzalloc(sizeof(struct zinitix_touch_dev), GFP_KERNEL); + if (!touch_dev) { + printk(KERN_ERR "unabled to allocate touch data \r\n"); + goto err_alloc_dev_data; + } + touch_dev->client = client; + i2c_set_clientdata(client, touch_dev); + +#if !USE_THREADED_IRQ + INIT_WORK(&touch_dev->work, zinitix_touch_work); + zinitix_debug_msg("touch workqueue create \r\n"); + zinitix_workqueue = create_singlethread_workqueue("zinitix_workqueue"); + if (!zinitix_workqueue) { + printk(KERN_ERR "unabled to create touch thread \r\n"); + goto err_kthread_create_failed; + } +#endif + + zinitix_debug_msg("allocate input device \r\n"); + touch_dev->input_dev = input_allocate_device(); + if (touch_dev->input_dev == 0) { + printk(KERN_ERR "unabled to allocate input device \r\n"); + goto err_input_allocate_device; + } + + /* initialize zinitix touch ic */ + touch_dev->int_gpio_num = GPIO_TOUCH_PIN_NUM; /* for upgrade */ + + memset(&touch_dev->reported_touch_info, + 0x0, sizeof(struct _ts_zinitix_point_info)); + + + /* not test mode */ + touch_dev->raw_mode_flag = TOUCH_NORMAL_MODE; + + if(ts_init_touch(touch_dev) == false) { + goto err_input_register_device; + } + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + touch_dev->button[i] = ICON_BUTTON_UNCHANGE; + + touch_dev->use_esd_timer = 0; + + INIT_WORK(&touch_dev->tmr_work, zinitix_touch_tmr_work); + zinitix_tmr_workqueue = + create_singlethread_workqueue("zinitix_tmr_workqueue"); + if (!zinitix_tmr_workqueue) { + printk(KERN_ERR "unabled to create touch tmr work queue \r\n"); + goto err_kthread_create_failed; + } + + if (ZINITIX_ESD_TIMER_INTERVAL) { + touch_dev->use_esd_timer = 1; + ts_esd_timer_init(touch_dev); + ts_esd_timer_start(ZINITIX_CHECK_ESD_TIMER, touch_dev); + printk(KERN_INFO " ts_esd_timer_start\n"); + } + + + sprintf(touch_dev->phys, "input(ts)"); + touch_dev->input_dev->name = ZINITIX_DRIVER_NAME; + touch_dev->input_dev->id.bustype = BUS_I2C; + touch_dev->input_dev->id.vendor = 0x0001; + touch_dev->input_dev->phys = touch_dev->phys; + touch_dev->input_dev->id.product = 0x0002; + touch_dev->input_dev->id.version = 0x0100; + + set_bit(EV_SYN, touch_dev->input_dev->evbit); + set_bit(EV_KEY, touch_dev->input_dev->evbit); + set_bit(EV_ABS, touch_dev->input_dev->evbit); + + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + set_bit(BUTTON_MAPPING_KEY[i], touch_dev->input_dev->keybit); + + if (touch_dev->cap_info.Orientation & TOUCH_XY_SWAP) { + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_Y, + touch_dev->cap_info.MinX, + 480 + ABS_PT_OFFSET, + 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_X, + touch_dev->cap_info.MinY, + 800 + ABS_PT_OFFSET, + 0, 0); + } else { + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_X, + touch_dev->cap_info.MinX, + 480 + ABS_PT_OFFSET, + 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_POSITION_Y, + touch_dev->cap_info.MinY, + 800 + ABS_PT_OFFSET, + 0, 0); + } + + input_set_abs_params(touch_dev->input_dev, ABS_TOOL_WIDTH, + 0, 255, 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_TOUCH_MAJOR, + 0, 255, 0, 0); + input_set_abs_params(touch_dev->input_dev, ABS_MT_WIDTH_MAJOR, + 0, 255, 0, 0); + +#if MULTI_PROTOCOL_TYPE_B + set_bit(MT_TOOL_FINGER, touch_dev->input_dev->keybit); + input_mt_init_slots(touch_dev->input_dev, touch_dev->cap_info.multi_fingers); +#else + set_bit(BTN_TOUCH, touch_dev->input_dev->keybit); +#endif + + + input_set_abs_params(touch_dev->input_dev, ABS_MT_TRACKING_ID, + 0, touch_dev->cap_info.multi_fingers, 0, 0); + + + zinitix_debug_msg("register %s input device \r\n", + touch_dev->input_dev->name); + ret = input_register_device(touch_dev->input_dev); + if (ret) { + printk(KERN_ERR "unable to register %s input device\r\n", + touch_dev->input_dev->name); + goto err_input_register_device; + } + +#ifdef TOUCH_VIRTUAL_KEYS + zinitix_ts_virtual_keys_init(); +#endif + /* configure touchscreen interrupt gpio */ + ret = gpio_request(GPIO_TOUCH_PIN_NUM, "zinitix_irq_gpio"); + if (ret) { + printk(KERN_ERR "unable to request gpio.(%s)\r\n", + touch_dev->input_dev->name); + goto err_request_irq; + } + + ret = gpio_direction_input(GPIO_TOUCH_PIN_NUM); + + touch_dev->int_gpio_num = GPIO_TOUCH_PIN_NUM; + + + touch_dev->irq = gpio_to_irq(touch_dev->int_gpio_num); + if (touch_dev->irq < 0) + printk(KERN_INFO "error. gpio_to_irq(..) function is not \ + supported? you should define GPIO_TOUCH_IRQ.\r\n"); + + zinitix_debug_msg("request irq (irq = %d, pin = %d) \r\n", + touch_dev->irq, touch_dev->int_gpio_num); + + touch_dev->work_proceedure = TS_NO_WORK; + sema_init(&touch_dev->work_proceedure_lock, 1); + +#if USE_THREADED_IRQ + ret = request_threaded_irq(touch_dev->irq, ts_int_handler, zinitix_touch_work, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT , ZINITIX_DRIVER_NAME, touch_dev); +#else + ret = request_irq(touch_dev->irq, ts_int_handler, + IRQF_TRIGGER_LOW, ZINITIX_DRIVER_NAME, touch_dev); +#endif + if (ret) { + printk(KERN_ERR "unable to register irq.(%s)\r\n", + touch_dev->input_dev->name); + goto err_request_irq; + } + dev_info(&client->dev, "zinitix touch probe.\r\n"); + +#ifdef CONFIG_HAS_EARLYSUSPEND + touch_dev->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + touch_dev->early_suspend.suspend = zinitix_early_suspend; + touch_dev->early_suspend.resume = zinitix_late_resume; + register_early_suspend(&touch_dev->early_suspend); +#endif + + + sema_init(&touch_dev->raw_data_lock, 1); + + misc_touch_dev = touch_dev; + + ret = misc_register(&touch_misc_device); + if (ret) + zinitix_debug_msg("Fail to register touch misc device.\n"); + +#if SEC_TOUCH_INFO_REPORT + //sys/class/misc/touch_misc_fops/.... + sec_touchscreen_dev = device_create(sec_class, NULL, 0, NULL, "sec_touchscreen"); + + if (IS_ERR(sec_touchscreen_dev)) + pr_err("Failed to create device(sec_touchscreen)!\n"); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_get_touch_raw_data) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_get_touch_raw_data.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_touch_cal_ndata) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_touch_cal_ndata.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_delta) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_delta.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_cal_ncount) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_cal_ncount.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_enter_testmode) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_enter_testmode.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_enter_normalmode) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_enter_normalmode.attr.name); + + if (device_create_file(sec_touchscreen_dev, &dev_attr_count_node) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_count_node.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_chip_info) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_chip_info.attr.name); + + if (device_create_file(sec_touchscreen_dev, + &dev_attr_touch_ndata) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_touch_ndata.attr.name); + + sec_touchkey_dev = device_create(sec_class, NULL, 0, NULL, "sec_touchkey"); + if (IS_ERR(sec_touchkey_dev)) + pr_err("Failed to create device(sec_touchkey)!\n"); + + if (device_create_file(sec_touchkey_dev, &dev_attr_tkey_data) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_tkey_data.attr.name); + + if (device_create_file(sec_touchkey_dev, &dev_attr_menu_sensitivity) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_menu_sensitivity.attr.name); + if (device_create_file(sec_touchkey_dev, &dev_attr_back_sensitivity) < 0) + pr_err("Failed to create device file(%s)!\n", + dev_attr_back_sensitivity.attr.name); +#endif + + + return 0; + +err_request_irq: + input_unregister_device(touch_dev->input_dev); +err_input_register_device: + input_free_device(touch_dev->input_dev); +err_kthread_create_failed: +err_input_allocate_device: + kfree(touch_dev); +err_alloc_dev_data: +err_check_functionality: + touch_dev = NULL; + + misc_touch_dev = NULL; + + i2c_set_clientdata(client, touch_dev); + ts_power_control(POWER_OFF); + return -ENODEV; +} + + +static int zinitix_touch_remove(struct i2c_client *client) +{ + struct zinitix_touch_dev *touch_dev = i2c_get_clientdata(client); + if(touch_dev == NULL) return 0; + + zinitix_debug_msg("zinitix_touch_remove+ \r\n"); + down(&touch_dev->work_proceedure_lock); +#if !USE_THREADED_IRQ + if (touch_dev->work_proceedure != TS_NO_WORK) + flush_work(&touch_dev->work); +#endif + touch_dev->work_proceedure = TS_REMOVE_WORK; + + if (touch_dev->use_esd_timer != 0) { + flush_work(&touch_dev->tmr_work); + ts_write_reg(touch_dev->client, + ZINITIX_PERIODICAL_INTERRUPT_INTERVAL, 0); + ts_esd_timer_stop(touch_dev); + zinitix_debug_msg(KERN_INFO " ts_esd_timer_stop\n"); + destroy_workqueue(zinitix_tmr_workqueue); + } + + if (touch_dev->irq) + free_irq(touch_dev->irq, touch_dev); + +#if SEC_TOUCH_INFO_REPORT + //device_remove_file(touch_misc_device.this_device, &dev_attr_get_touch_raw_data); --> remove attr + //..... +#endif + misc_deregister(&touch_misc_device); + + + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&touch_dev->early_suspend); +#endif + +#if !USE_THREADED_IRQ + destroy_workqueue(zinitix_workqueue); +#endif + if (gpio_is_valid(touch_dev->int_gpio_num) != 0) + gpio_free(touch_dev->int_gpio_num); + + input_unregister_device(touch_dev->input_dev); + input_free_device(touch_dev->input_dev); + up(&touch_dev->work_proceedure_lock); + kfree(touch_dev); + + return 0; +} + + +static struct i2c_driver zinitix_touch_driver = { + .probe = zinitix_touch_probe, + .remove = zinitix_touch_remove, + .id_table = zinitix_idtable, + .driver = { + .owner = THIS_MODULE, + .name = ZINITIX_DRIVER_NAME, + .pm = &zinitix_dev_pm_ops, + }, +}; + + +static int __devinit zinitix_touch_init(void) +{ + + m_isp_client = NULL; + return i2c_add_driver(&zinitix_touch_driver); +} + +static void __exit zinitix_touch_exit(void) +{ + i2c_del_driver(&zinitix_touch_driver); +} + +module_init(zinitix_touch_init); +module_exit(zinitix_touch_exit); + +MODULE_DESCRIPTION("zinitix touch-screen device driver using i2c interface"); +MODULE_AUTHOR("sohnet "); +MODULE_LICENSE("GPL"); + + diff --git a/drivers/input/touchscreen/zinitix_touch_bt404.h b/drivers/input/touchscreen/zinitix_touch_bt404.h new file mode 100644 index 00000000..24606777 --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch_bt404.h @@ -0,0 +1,222 @@ +/* + * + * Zinitix touch driver + * + * Copyright (C) 2009 Zinitix, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef ZINITIX_HEADER +#define ZINITIX_HEADER + +#define TS_DRVIER_VERSION "3.0.24" + +#define MULTI_PROTOCOL_TYPE_B 0 + +#define USE_THREADED_IRQ 0 + +#define TOUCH_MODE 0 + +/* max 10 */ +#define MAX_SUPPORTED_FINGER_NUM 10 +#define REAL_SUPPORTED_FINGER_NUM 10 + + +/* max 8 */ +#define MAX_SUPPORTED_BUTTON_NUM 8 +#define SUPPORTED_BUTTON_NUM 0 + +/* Upgrade Method*/ +#define TOUCH_ONESHOT_UPGRADE 1 +/* if you use isp mode, you must add i2c device : +name = "zinitix_isp" , addr 0x50*/ + +/* resolution offset */ +#define ABS_PT_OFFSET 1 + +#define TOUCH_FORCE_UPGRADE 1 +#define USE_CHECKSUM 0 // BT4x3 only + +#define CHIP_POWER_OFF_DELAY 100 /*ms*/ +#define CHIP_POWER_OFF_AF_FZ_DELAY 250 /*ms*/ +#define CHIP_ON_DELAY 150 /*ms*/ +#define CHIP_ON_AF_FZ_DELAY 250 /*ms*/ +#define DELAY_FOR_SIGNAL_DELAY 30 /*us*/ +#define DELAY_FOR_TRANSCATION 50 +#define DELAY_FOR_POST_TRANSCATION 10 + + +#define FIRMWARE_VERSION_POS 0x6410 + +enum _zinitix_power_control { + POWER_OFF, + POWER_ON, + RESET_LOW, + RESET_HIGH, +}; + +/* Button Enum */ +enum _zinitix_button_event { + ICON_BUTTON_UNCHANGE, + ICON_BUTTON_DOWN, + ICON_BUTTON_UP, +}; + + +/* ESD Protection */ +/*second : if 0, no use. if you have to use, 3 is recommended*/ +#define ZINITIX_ESD_TIMER_INTERVAL 0 +#define ZINITIX_SCAN_RATE_HZ 60 +#define ZINITIX_CHECK_ESD_TIMER 2 + + +/*Test Mode (Monitoring Raw Data) */ +#define SEC_TOUCH_INFO_REPORT 0 //for samsung + +#define MAX_TEST_RAW_DATA 320 /* 20 x 16*/ +#define MAX_TEST_POINT_INFO 3 /* status register + x + y*/ +#define MAX_RAW_DATA \ + (MAX_TEST_RAW_DATA + MAX_TEST_POINT_INFO*MAX_SUPPORTED_FINGER_NUM + 2) +/* preriod raw data interval*/ +#define ZINITIX_RAW_DATA_ESD_TIMER_INTERVAL 1 +#define TOUCH_TEST_RAW_MODE 51 +#define TOUCH_NORMAL_MODE 48 +#define TOUCH_ZINITIX_BASELINED_RAW_MODE 3 +#define TOUCH_ZINITIX_PROCESSED_RAW_MODE 4 +#define TOUCH_ZINITIX_CAL_N_MODE 8 + +struct _raw_ioctl { + int sz; + u8 *buf; +}; + +struct _reg_ioctl{ + int addr; + int *val; +} ; + + +/* Other Things */ +#define ZINITIX_INIT_RETRY_CNT 5 +#define I2C_SUCCESS 0 +#define I2C_FAIL 1 + + +/*---------------------------------------------------------------------*/ + +/* Register Map*/ +#define ZINITIX_SWRESET_CMD 0x0000 +#define ZINITIX_WAKEUP_CMD 0x0001 + +#define ZINITIX_IDLE_CMD 0x0004 +#define ZINITIX_SLEEP_CMD 0x0005 + +#define ZINITIX_CLEAR_INT_STATUS_CMD 0x0003 +#define ZINITIX_CALIBRATE_CMD 0x0006 +#define ZINITIX_SAVE_STATUS_CMD 0x0007 +#define ZINITIX_SAVE_CALIBRATION_CMD 0x0008 +#define ZINITIX_RECALL_FACTORY_CMD 0x000f + + +#define ZINITIX_TOUCH_MODE 0x0010 +#define ZINITIX_CHIP_REVISION 0x0011 +#define ZINITIX_FIRMWARE_VERSION 0x0012 +#define ZINITIX_DATA_VERSION_REG 0x0013 +#define ZINITIX_TSP_TYPE 0x0014 +#define ZINITIX_SUPPORTED_FINGER_NUM 0x0015 +#define ZINITIX_MAX_Y_NUM 0x0016 +#define ZINITIX_EEPROM_INFO 0x0018 +#define ZINITIX_CAL_N_TOTAL_NUM 0x001B + +#define ZINITIX_TOTAL_NUMBER_OF_X 0x0060 +#define ZINITIX_TOTAL_NUMBER_OF_Y 0x0061 + +#define ZINITIX_BUTTON_SUPPORTED_NUM 0x00B0 + + +#define ZINITIX_X_RESOLUTION 0x00C0 +#define ZINITIX_Y_RESOLUTION 0x00C1 + + +#define ZINITIX_POINT_STATUS_REG 0x0080 +#define ZINITIX_ICON_STATUS_REG 0x00A0 + +#define ZINITIX_RAWDATA_REG 0x0200 + +#define ZINITIX_EEPROM_INFO_REG 0x0018 + +#define ZINITIX_INT_ENABLE_FLAG 0x00f0 +#define ZINITIX_PERIODICAL_INTERRUPT_INTERVAL 0x00f1 + +#define ZINITIX_CHECK_REG0 0x00AC +#define ZINITIX_CHECK_REG1 0x00AD +#define ZINITIX_CHECK_REG2 0x00AE +#define ZINITIX_CHECK_REG3 0x00AF + + +/* Interrupt & status register flag bit +------------------------------------------------- +*/ +#define BIT_PT_CNT_CHANGE 0 +#define BIT_DOWN 1 +#define BIT_MOVE 2 +#define BIT_UP 3 +#define BIT_HOLD 4 +#define BIT_LONG_HOLD 5 +#define RESERVED_0 6 +#define RESERVED_1 7 +#define BIT_WEIGHT_CHANGE 8 +#define BIT_PT_NO_CHANGE 9 +#define BIT_REJECT 10 +#define BIT_PT_EXIST 11 +#define RESERVED_2 12 +#define RESERVED_3 13 +#define RESERVED_4 14 +#define BIT_ICON_EVENT 15 + +/* button */ +#define BIT_O_ICON0_DOWN 0 +#define BIT_O_ICON1_DOWN 1 +#define BIT_O_ICON2_DOWN 2 +#define BIT_O_ICON3_DOWN 3 +#define BIT_O_ICON4_DOWN 4 +#define BIT_O_ICON5_DOWN 5 +#define BIT_O_ICON6_DOWN 6 +#define BIT_O_ICON7_DOWN 7 + +#define BIT_O_ICON0_UP 8 +#define BIT_O_ICON1_UP 9 +#define BIT_O_ICON2_UP 10 +#define BIT_O_ICON3_UP 11 +#define BIT_O_ICON4_UP 12 +#define BIT_O_ICON5_UP 13 +#define BIT_O_ICON6_UP 14 +#define BIT_O_ICON7_UP 15 + + +#define SUB_BIT_EXIST 0 +#define SUB_BIT_DOWN 1 +#define SUB_BIT_MOVE 2 +#define SUB_BIT_UP 3 +#define SUB_BIT_UPDATE 4 +#define SUB_BIT_WAIT 5 + + +#define zinitix_bit_set(val, n) ((val) &= ~(1<<(n)), (val) |= (1<<(n))) +#define zinitix_bit_clr(val, n) ((val) &= ~(1<<(n))) +#define zinitix_bit_test(val, n) ((val) & (1<<(n))) +#define zinitix_swap_v(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) +#define zinitix_swap_16(s) (((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))) + +#endif /*ZINITIX_HEADER*/ + + diff --git a/drivers/input/touchscreen/zinitix_touch_bt4x3_firmware.h b/drivers/input/touchscreen/zinitix_touch_bt4x3_firmware.h new file mode 100644 index 00000000..251dc737 --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch_bt4x3_firmware.h @@ -0,0 +1,4126 @@ +/* +* +* Zinitix touch driver +* +* Copyright (C) 2009 Zinitix, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ +/* +Release Date : 12/03/21, 10:08 + +Version Info : + Firmware Version : 0x0088 + Register Version : 7 +*/ +#ifndef _ZINITIX_BT4x3_CODE_H +#define _ZINITIX_BT4x3_CODE_H + +u8 m_firmware_data[] = { +0x88, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x0F, 0x88, 0x20, 0x00, 0x0F, 0x88, +0x00, 0x04, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0xF0, 0x1A, 0xFF, 0x0F, 0x00, 0x0E, +0x08, 0xF3, 0xA0, 0x1A, 0xFF, 0x0F, 0xA0, 0x0B, +0xA1, 0x39, 0xD5, 0x87, 0x0F, 0x98, 0x0D, 0x01, +0xC0, 0x03, 0x0D, 0x00, 0xC0, 0x51, 0x00, 0x98, +0xDC, 0x00, 0xFF, 0xFF, 0x00, 0x1A, 0xE0, 0x3F, +0x00, 0x0D, 0x05, 0xF3, 0xAF, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x0F, 0x98, 0x95, 0x01, 0x00, 0x0E, +0x2B, 0x0E, 0x00, 0x0E, 0x03, 0xF0, 0x00, 0x1A, +0xFF, 0xFF, 0x03, 0xC9, 0x00, 0x0D, 0x02, 0xF0, +0x00, 0x0E, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x03, +0x55, 0x00, 0x00, 0x4A, 0x14, 0x00, 0x2D, 0x80, +0x0F, 0x0E, 0x55, 0x00, 0x00, 0x49, 0x2A, 0x80, +0x0F, 0x0E, 0x55, 0x00, 0x00, 0x03, 0x56, 0x00, +0x00, 0x4A, 0x10, 0x00, 0x2D, 0x80, 0x08, 0x0E, +0x56, 0x00, 0x00, 0x49, 0x2A, 0x80, 0x08, 0x0E, +0x56, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x4A, +0xA0, 0x00, 0x4D, 0x80, 0x10, 0x1A, 0xA0, 0x00, +0x01, 0x0D, 0x10, 0x00, 0x00, 0x49, 0x4A, 0x80, +0x10, 0x1A, 0xA0, 0x00, 0x01, 0x0D, 0x10, 0x00, +0x90, 0x03, 0x00, 0xF2, 0x09, 0x0D, 0x0F, 0x00, +0x0F, 0x98, 0x3B, 0x04, 0x0F, 0x88, 0xE3, 0x05, +0xFF, 0xFF, 0xEF, 0x87, 0xA0, 0x4A, 0x00, 0x32, +0x01, 0x88, 0xDE, 0x05, 0xFF, 0xFF, 0xC0, 0x4A, +0x07, 0x0F, 0x21, 0x80, 0xA0, 0x1A, 0xC0, 0x3F, +0x03, 0x0E, 0x08, 0xF3, 0x0A, 0x0D, 0x05, 0xF3, +0x0C, 0x0D, 0x06, 0xF3, 0x0F, 0x98, 0x01, 0x01, +0xFF, 0xFF, 0xA0, 0x22, 0x20, 0x00, 0xC0, 0x22, +0x20, 0x00, 0xB0, 0x3A, 0x20, 0x00, 0xB0, 0x49, +0x1A, 0x87, 0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x00, 0x0E, 0x08, 0xF3, 0x0F, 0x88, +0xDE, 0x05, 0x03, 0x0E, 0x08, 0xF3, 0x0A, 0x0D, +0x05, 0xF3, 0x0C, 0x0D, 0x06, 0xF3, 0xB1, 0x39, +0x0B, 0x0D, 0x04, 0xF3, 0x0F, 0x98, 0xFE, 0x00, +0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, +0x00, 0x0E, 0x08, 0xF3, 0x0F, 0x98, 0x5B, 0x01, +0xFF, 0xA0, 0xA0, 0x1A, 0x00, 0x38, 0xC0, 0x1A, +0x75, 0x07, 0xB0, 0x03, 0x10, 0x00, 0x2F, 0x84, +0xA0, 0x4A, 0x00, 0x32, 0x01, 0x88, 0xDE, 0x05, +0xFF, 0xFF, 0x03, 0x0E, 0x0E, 0xF3, 0x95, 0x19, +0xA0, 0x1A, 0x00, 0x90, 0xB0, 0x1A, 0x00, 0x38, +0x0A, 0x0D, 0x06, 0xF3, 0x0B, 0x0D, 0x05, 0xF3, +0x0F, 0x98, 0x01, 0x01, 0xFF, 0xFF, 0xA0, 0x22, +0x20, 0x00, 0xB0, 0x22, 0x20, 0x00, 0x91, 0x39, +0x31, 0x87, 0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x02, 0x0E, 0x0E, 0xF3, 0x0F, 0x88, +0xDE, 0x05, 0xA0, 0x1A, 0x00, 0x38, 0xC0, 0x1A, +0x75, 0x07, 0xB0, 0x03, 0x10, 0x00, 0x0F, 0x88, +0xA0, 0x00, 0x03, 0x0E, 0x0E, 0xF3, 0x00, 0x1A, +0x00, 0x38, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x1A, +0x00, 0x90, 0x00, 0x0D, 0x06, 0xF3, 0x00, 0x03, +0x10, 0x00, 0xFF, 0xFF, 0x01, 0x39, 0x00, 0x0D, +0x04, 0xF3, 0x0F, 0x98, 0xFE, 0x00, 0x00, 0x1A, +0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, 0x02, 0x0E, +0x0E, 0xF3, 0x0F, 0x88, 0xDE, 0x05, 0x01, 0x0E, +0x00, 0xF3, 0x7F, 0x80, 0x00, 0x03, 0x2B, 0x0E, +0x01, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x01, 0x0E, +0x01, 0xF3, 0x00, 0x03, 0x00, 0xF3, 0x00, 0x51, +0xC1, 0x87, 0xFF, 0xA0, 0x03, 0x0E, 0x08, 0xF3, +0x00, 0x1A, 0x00, 0x32, 0x00, 0x0D, 0x05, 0xF3, +0x00, 0x19, 0x00, 0x0D, 0x06, 0xF3, 0x00, 0x19, +0x10, 0x1A, 0xE9, 0x01, 0x10, 0x38, 0x01, 0x0D, +0x04, 0xF3, 0x01, 0x0E, 0x00, 0xF3, 0x00, 0x03, +0x00, 0xF3, 0x00, 0x51, 0xC1, 0x87, 0x00, 0x1A, +0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x0E, +0x08, 0xF3, 0xB0, 0x1A, 0x14, 0x00, 0xA0, 0x1A, +0x75, 0x00, 0xA0, 0x0B, 0xA1, 0x21, 0xB1, 0x39, +0xC1, 0x87, 0x0F, 0x98, 0x33, 0x01, 0xFF, 0xA0, +0x00, 0x0E, 0x04, 0xF9, 0x00, 0x0E, 0x05, 0xF9, +0x00, 0x0E, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x40, 0x1A, 0xE9, 0x01, 0x41, 0x39, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, 0x24, 0x00, +0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x41, 0x39, 0x40, 0x49, 0x0B, 0x87, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0xA1, 0x00, 0x01, 0x0D, 0xA2, 0x00, 0x00, 0x0D, +0x03, 0x0F, 0x01, 0x0D, 0x04, 0x0F, 0xFF, 0xA0, +0x00, 0x0E, 0x04, 0xF9, 0x00, 0x0E, 0x05, 0xF9, +0x00, 0x0E, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x50, 0x1A, 0x75, 0x07, 0x40, 0x03, 0x10, 0x00, +0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, +0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, +0x25, 0x00, 0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, +0x07, 0xF9, 0x51, 0x21, 0x41, 0x39, 0x01, 0x87, +0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, +0x00, 0x0D, 0x05, 0x0F, 0x01, 0x0D, 0x06, 0x0F, +0x20, 0x03, 0xA1, 0x00, 0x30, 0x03, 0xA2, 0x00, +0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, +0x02, 0x0D, 0x06, 0xF9, 0x03, 0x0D, 0x07, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0xA1, 0x00, 0x01, 0x0D, +0xA2, 0x00, 0xFF, 0xA0, 0x00, 0x0E, 0x04, 0xF9, +0x00, 0x0E, 0x05, 0xF9, 0x00, 0x0E, 0x06, 0xF9, +0x00, 0x0E, 0x07, 0xF9, 0x90, 0x1A, 0x90, 0x01, +0x80, 0x19, 0x03, 0x0E, 0x08, 0xF3, 0x08, 0x18, +0x05, 0x7B, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x1A, +0x0D, 0x0F, 0x00, 0x0D, 0x06, 0xF3, 0x10, 0x1A, +0x1F, 0x00, 0x01, 0x0D, 0x04, 0xF3, 0x01, 0x0E, +0x00, 0xF3, 0x00, 0x03, 0x00, 0xF3, 0x00, 0x51, +0xC1, 0x87, 0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x00, 0x0E, 0x08, 0xF3, 0x40, 0x1A, +0x20, 0x00, 0x50, 0x1A, 0x0D, 0x0F, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, 0x25, 0x00, +0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x51, 0x21, 0x41, 0x39, 0x01, 0x87, 0x81, 0x21, +0x91, 0x39, 0xF1, 0x84, 0x00, 0x03, 0x03, 0xF9, +0x10, 0x03, 0x04, 0xF9, 0x20, 0x03, 0xA1, 0x00, +0x30, 0x03, 0xA2, 0x00, 0x00, 0x0D, 0x01, 0x0F, +0x01, 0x0D, 0x02, 0x0F, 0x00, 0x0D, 0x04, 0xF9, +0x01, 0x0D, 0x05, 0xF9, 0x02, 0x0D, 0x06, 0xF9, +0x03, 0x0D, 0x07, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0xA1, 0x00, 0x01, 0x0D, 0xA2, 0x00, 0x03, 0x0E, +0x08, 0xF3, 0x00, 0x1A, 0xC0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x00, 0x1A, 0x07, 0x0F, 0x00, 0x0D, +0x06, 0xF3, 0x10, 0x1A, 0x1F, 0x00, 0x01, 0x0D, +0x04, 0xF3, 0x01, 0x0E, 0x00, 0xF3, 0x00, 0x03, +0x00, 0xF3, 0x00, 0x51, 0xC1, 0x87, 0x00, 0x1A, +0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x0E, +0x08, 0xF3, 0x00, 0x03, 0x0D, 0x00, 0x00, 0x51, +0x90, 0x80, 0xA0, 0x1A, 0x07, 0x0F, 0x00, 0x03, +0x01, 0x0F, 0xA0, 0x08, 0xA1, 0x21, 0x00, 0x03, +0x02, 0x0F, 0xA0, 0x08, 0x00, 0x0E, 0x04, 0xF9, +0x00, 0x0E, 0x05, 0xF9, 0x00, 0x0E, 0x06, 0xF9, +0x00, 0x0E, 0x07, 0xF9, 0x43, 0x19, 0x50, 0x1A, +0x07, 0x0F, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, +0x05, 0xF9, 0x25, 0x00, 0x02, 0x0D, 0x06, 0xF9, +0x51, 0x21, 0x35, 0x00, 0x03, 0x0D, 0x07, 0xF9, +0x51, 0x21, 0x41, 0x39, 0xE1, 0x86, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0xA3, 0x00, 0x01, 0x0D, 0xA4, 0x00, 0xFF, 0xA0, +0x00, 0x0E, 0xA1, 0x00, 0x00, 0x0E, 0xA2, 0x00, +0x00, 0x0E, 0xA3, 0x00, 0x00, 0x0E, 0xA4, 0x00, +0x10, 0x1A, 0x20, 0x00, 0x00, 0x1A, 0x75, 0x00, +0x00, 0x0B, 0x01, 0x21, 0x11, 0x39, 0xC1, 0x87, +0xFF, 0xA0, 0x00, 0x0E, 0x04, 0xF9, 0x00, 0x0E, +0x05, 0xF9, 0x00, 0x0E, 0x06, 0xF9, 0x00, 0x0E, +0x07, 0xF9, 0x50, 0x19, 0x40, 0x1A, 0xE9, 0x01, +0x45, 0x38, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, +0x05, 0xF9, 0x25, 0x00, 0x02, 0x0D, 0x06, 0xF9, +0x00, 0x0E, 0x07, 0xF9, 0x51, 0x21, 0x41, 0x39, +0x01, 0x87, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0xA0, 0x1A, 0x07, 0x0F, 0xA2, 0x21, +0xA0, 0x08, 0xA1, 0x21, 0xA1, 0x08, 0x00, 0x0E, +0x04, 0xF9, 0x00, 0x0E, 0x05, 0xF9, 0x00, 0x0E, +0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, 0x50, 0x1A, +0x75, 0x07, 0x40, 0x03, 0x10, 0x00, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, 0x25, 0x00, +0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x51, 0x21, 0x41, 0x39, 0x01, 0x87, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0xA0, 0x1A, +0x07, 0x0F, 0xA4, 0x21, 0xA0, 0x08, 0xA1, 0x21, +0xA1, 0x08, 0xA1, 0x21, 0x90, 0x1A, 0x03, 0x0F, +0x09, 0x00, 0xA0, 0x08, 0x91, 0x21, 0xA1, 0x21, +0x09, 0x00, 0xA0, 0x08, 0x91, 0x21, 0xA1, 0x21, +0x09, 0x00, 0xA0, 0x08, 0x91, 0x21, 0xA1, 0x21, +0x09, 0x00, 0xA0, 0x08, 0xFF, 0xA0, 0x0F, 0x98, +0x61, 0x0C, 0x0F, 0x98, 0x59, 0x08, 0x0F, 0x98, +0xD7, 0x02, 0x00, 0x0E, 0x07, 0xF3, 0x02, 0x0E, +0x01, 0xFF, 0x02, 0x0E, 0x05, 0xFF, 0x01, 0x0E, +0x07, 0xF5, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x0D, +0x01, 0xF2, 0xA0, 0x1A, 0x10, 0x00, 0x01, 0x0E, +0x02, 0xFF, 0xA1, 0x39, 0xE1, 0x87, 0x00, 0x19, +0x00, 0x0D, 0x01, 0xF2, 0xA0, 0x1A, 0x00, 0x02, +0xA1, 0x39, 0xE1, 0x87, 0x01, 0x0E, 0x07, 0xF3, +0xA0, 0x1A, 0x00, 0x02, 0xA1, 0x39, 0xE1, 0x87, +0x00, 0x0E, 0x07, 0xF5, 0x0F, 0x98, 0xDE, 0x08, +0x00, 0x0E, 0xFB, 0x01, 0x0F, 0x88, 0xDE, 0x05, +0x00, 0x0E, 0x10, 0xF8, 0x00, 0x0E, 0x11, 0xF8, +0x00, 0x0E, 0x40, 0xF8, 0x00, 0x0E, 0x28, 0xF8, +0x00, 0x0E, 0x28, 0xF8, 0x00, 0x0E, 0x49, 0xF8, +0x00, 0x0E, 0x4B, 0xF8, 0x00, 0x0E, 0x29, 0xF8, +0x0F, 0x88, 0xDE, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFE, 0x10, 0xFD, 0x10, 0xFC, 0x10, +0xFB, 0x10, 0xFA, 0x10, 0xF9, 0x10, 0xF8, 0x10, +0xF7, 0x10, 0xF6, 0x10, 0xF5, 0x10, 0xF4, 0x10, +0xF3, 0x10, 0xF2, 0x10, 0xF1, 0x10, 0xF0, 0x10, +0x50, 0x03, 0x01, 0xF5, 0x50, 0x51, 0xA1, 0x80, +0x0F, 0x98, 0xFA, 0x04, 0xB1, 0x49, 0xAD, 0x80, +0xB0, 0x4A, 0x10, 0x00, 0x7A, 0x80, 0x0F, 0x98, +0x3A, 0x05, 0x4F, 0x80, 0x00, 0x1A, 0x31, 0x00, +0x00, 0x0D, 0x00, 0xF5, 0x00, 0x03, 0x03, 0xF0, +0x03, 0xC9, 0x00, 0x0D, 0x03, 0xF0, 0x0F, 0x11, +0x1F, 0x11, 0x2F, 0x11, 0x3F, 0x11, 0x4F, 0x11, +0x5F, 0x11, 0x6F, 0x11, 0x7F, 0x11, 0x8F, 0x11, +0x9F, 0x11, 0xAF, 0x11, 0xBF, 0x11, 0xCF, 0x11, +0xDF, 0x11, 0xEF, 0x11, 0xFF, 0xFF, 0x3F, 0xA8, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x1A, 0x40, 0x00, 0x00, 0x0D, 0x03, 0xF5, +0x00, 0x0E, 0x05, 0xF5, 0x00, 0x1A, 0xFF, 0x07, +0x00, 0x0D, 0x06, 0xF5, 0x00, 0x03, 0x01, 0xF5, +0x00, 0x0E, 0x01, 0xF5, 0x00, 0x1A, 0x31, 0x00, +0x00, 0x0D, 0x00, 0xF5, 0x01, 0x0E, 0x09, 0xF3, +0x01, 0x0E, 0x0A, 0xF3, 0x00, 0x19, 0x00, 0x0D, +0x0A, 0xF5, 0x00, 0x03, 0x09, 0xF5, 0x00, 0xC9, +0x00, 0x0D, 0x09, 0xF5, 0x10, 0x03, 0x08, 0xF5, +0x10, 0xC9, 0x01, 0x0D, 0x08, 0xF5, 0xFF, 0xA0, +0x00, 0x03, 0x00, 0xF5, 0x00, 0x51, 0xC1, 0x87, +0xFF, 0xA0, 0x00, 0x03, 0x09, 0xF5, 0x00, 0x51, +0xC1, 0x87, 0xFF, 0xA0, 0x00, 0x03, 0x05, 0x00, +0x00, 0x49, 0x00, 0x98, 0xF5, 0x06, 0xFF, 0xFF, +0x00, 0x0E, 0xFA, 0x01, 0x00, 0x03, 0x09, 0xF5, +0x00, 0xC1, 0x00, 0x0D, 0x09, 0xF5, 0xFF, 0xA0, +0x00, 0x03, 0x09, 0xF5, 0x00, 0xC9, 0x00, 0x0D, +0x09, 0xF5, 0xFF, 0xA0, 0x01, 0x0E, 0x09, 0xF3, +0x00, 0x1A, 0x91, 0x00, 0x00, 0x0D, 0x00, 0xF5, +0xFF, 0xA0, 0x0F, 0x98, 0x63, 0x04, 0x00, 0x0E, +0x09, 0xF3, 0xA0, 0x1A, 0x00, 0x40, 0x0B, 0x00, +0xA0, 0x08, 0xA1, 0x21, 0xB1, 0x21, 0x91, 0x39, +0xA1, 0x87, 0x01, 0x0E, 0x09, 0xF3, 0xFF, 0xA0, +0x0F, 0x98, 0x63, 0x04, 0x00, 0x0E, 0x09, 0xF3, +0xA0, 0x1A, 0x00, 0x40, 0x0B, 0x00, 0xA0, 0x08, +0xA1, 0x21, 0xB1, 0x21, 0x91, 0x39, 0xA1, 0x87, +0x93, 0x19, 0x30, 0x03, 0x0A, 0x00, 0xFF, 0xFF, +0x93, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x90, 0x1E, 0x92, 0x21, 0x00, 0x03, 0x8B, 0x0B, +0x10, 0x03, 0xE5, 0x00, 0xFF, 0xFF, 0x01, 0x60, +0x41, 0x80, 0xA0, 0x0B, 0x01, 0x0E, 0x09, 0xF3, +0xFF, 0xA0, 0xB0, 0x1A, 0x75, 0x00, 0x0B, 0x00, +0xA0, 0x08, 0xA1, 0x21, 0xB1, 0x21, 0x91, 0x39, +0xA1, 0x87, 0x01, 0x0E, 0x09, 0xF3, 0xFF, 0xA0, +0x0F, 0x98, 0x63, 0x04, 0x00, 0x0E, 0x09, 0xF3, +0xA0, 0x1A, 0x00, 0x40, 0x0B, 0x00, 0xA0, 0x08, +0xA1, 0x21, 0xB1, 0x21, 0x91, 0x39, 0xA1, 0x87, +0xB0, 0x1A, 0x8B, 0x0B, 0x0B, 0x00, 0xA0, 0x08, +0xA1, 0x21, 0xB0, 0x1A, 0x77, 0x00, 0x0B, 0x00, +0xA0, 0x08, 0xA1, 0x21, 0xB1, 0x21, 0x0B, 0x00, +0xA0, 0x08, 0x01, 0x0E, 0x09, 0xF3, 0xFF, 0xA0, +0x0F, 0x98, 0x63, 0x04, 0x00, 0x0E, 0x09, 0xF3, +0xA0, 0x1A, 0x00, 0x40, 0x0A, 0x00, 0xB0, 0x08, +0xA1, 0x21, 0xB1, 0x21, 0x91, 0x39, 0xA1, 0x87, +0x01, 0x0E, 0x09, 0xF3, 0xFF, 0xA0, 0x01, 0x0E, +0x2D, 0x0F, 0x00, 0x0E, 0xFB, 0x01, 0x00, 0x03, +0x70, 0x00, 0x00, 0x0D, 0xFC, 0x01, 0x0F, 0x98, +0xA2, 0x0F, 0x0F, 0x88, 0x7B, 0x04, 0xB0, 0x03, +0x06, 0xF5, 0x2B, 0x18, 0xB1, 0x49, 0xFD, 0xA0, +0xFF, 0xFF, 0xB0, 0x4A, 0x10, 0x00, 0xFB, 0xA0, +0xFF, 0xFF, 0x21, 0x79, 0x02, 0x0D, 0x01, 0x02, +0x10, 0x1A, 0x10, 0xF5, 0x30, 0x1A, 0xEA, 0x01, +0x41, 0x00, 0x40, 0x62, 0xFF, 0x00, 0x11, 0x21, +0x51, 0x00, 0xFF, 0xFF, 0x58, 0x7B, 0x54, 0x68, +0x35, 0x08, 0x11, 0x21, 0x31, 0x21, 0x21, 0x39, +0x31, 0x87, 0xFF, 0xA0, 0x10, 0x20, 0x30, 0x03, +0x01, 0x02, 0x31, 0x49, 0x11, 0x81, 0x30, 0x1A, +0x10, 0xF5, 0x28, 0x19, 0x01, 0x00, 0x00, 0x62, +0xFF, 0x00, 0x30, 0x08, 0x31, 0x21, 0x01, 0x00, +0xFF, 0xFF, 0x08, 0x79, 0x30, 0x08, 0x31, 0x21, +0x11, 0x21, 0x21, 0x39, 0x31, 0x87, 0xFF, 0xA0, +0x30, 0x03, 0x01, 0x02, 0x32, 0x49, 0xF1, 0xA0, +0xFF, 0xFF, 0x30, 0x1A, 0xEA, 0x01, 0x31, 0x21, +0x03, 0x00, 0x10, 0x08, 0xFF, 0xA0, 0x30, 0x1A, +0xEA, 0x01, 0x03, 0x00, 0x00, 0x4A, 0x80, 0x00, +0xDC, 0x80, 0x00, 0x4A, 0x9F, 0x00, 0xAA, 0x80, +0xA0, 0x03, 0x05, 0x00, 0xA0, 0x49, 0x00, 0x88, +0x81, 0x04, 0x10, 0x1A, 0x75, 0x00, 0x00, 0x3A, +0x80, 0x00, 0xCF, 0x84, 0x00, 0x4A, 0x00, 0x02, +0x00, 0x88, 0x81, 0x04, 0x00, 0x49, 0x00, 0x88, +0xEE, 0x04, 0x01, 0x49, 0x00, 0x88, 0xEE, 0x04, +0x03, 0x49, 0x00, 0x88, 0x7B, 0x04, 0x04, 0x49, +0x41, 0x80, 0x01, 0x0E, 0xFB, 0x01, 0x0F, 0x88, +0x7B, 0x04, 0x05, 0x49, 0x41, 0x80, 0x01, 0x0E, +0xFB, 0x01, 0x0F, 0x88, 0x7B, 0x04, 0x06, 0x49, +0x41, 0x80, 0x01, 0x0E, 0xFD, 0x01, 0x0F, 0x88, +0x7B, 0x04, 0x08, 0x49, 0xD1, 0x80, 0xA0, 0x1A, +0x00, 0x32, 0x0F, 0x98, 0xBB, 0x00, 0xA0, 0x03, +0x0D, 0x00, 0xA2, 0xC9, 0xA1, 0xC9, 0x0A, 0x0D, +0x0D, 0x00, 0x01, 0x0E, 0x2B, 0x0E, 0x7F, 0x80, +0x07, 0x49, 0xE1, 0x81, 0xC0, 0x03, 0x0D, 0x00, +0xC1, 0xC9, 0x0C, 0x0D, 0x0D, 0x00, 0xA0, 0x1A, +0x00, 0x32, 0xC0, 0x19, 0xB0, 0x1A, 0x41, 0x01, +0xBC, 0x38, 0x0F, 0x98, 0x3B, 0x02, 0x0F, 0x98, +0x7D, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0x4C, 0x02, +0xA0, 0x1A, 0x00, 0x32, 0xC0, 0x1A, 0x07, 0x0F, +0xB0, 0x1A, 0x20, 0x00, 0x0F, 0x98, 0x82, 0x00, +0x00, 0x0E, 0x2B, 0x0E, 0x0F, 0x88, 0x7B, 0x04, +0x0F, 0x49, 0x00, 0x88, 0x7B, 0x04, 0x00, 0x03, +0xEA, 0x01, 0x00, 0x4A, 0xD0, 0x01, 0xFB, 0xA0, +0xFF, 0xFF, 0x20, 0x03, 0x05, 0x00, 0x02, 0x0D, +0xFC, 0x0D, 0x15, 0x19, 0x00, 0x3A, 0x10, 0x00, +0x0F, 0x98, 0x19, 0x05, 0x90, 0x03, 0x01, 0x02, +0x91, 0x49, 0xFD, 0xA0, 0xFF, 0xFF, 0x00, 0x03, +0xEA, 0x01, 0x00, 0x4A, 0x10, 0x00, 0x11, 0x81, +0x0F, 0x98, 0x7B, 0x04, 0x00, 0x03, 0x05, 0x00, +0x05, 0x49, 0x3D, 0x80, 0x02, 0x0E, 0xFD, 0x01, +0xFF, 0xA0, 0x00, 0x03, 0xFC, 0x0D, 0x05, 0x49, +0xFD, 0xA0, 0xFF, 0xFF, 0x02, 0x0E, 0xFD, 0x01, +0xFF, 0xA0, 0x00, 0x4A, 0x60, 0x00, 0x7C, 0x80, +0x00, 0x4A, 0x7F, 0x00, 0x4A, 0x80, 0x02, 0x0E, +0xFD, 0x01, 0x0F, 0x88, 0x7B, 0x04, 0x00, 0x4A, +0x00, 0x01, 0xFC, 0xA0, 0xFF, 0xFF, 0x00, 0x4A, +0x4F, 0x01, 0xFA, 0xA0, 0xFF, 0xFF, 0x02, 0x0E, +0xFD, 0x01, 0x0F, 0x88, 0x7B, 0x04, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x0F, 0x98, 0x59, 0x08, 0x00, 0x03, 0x0E, 0x00, +0x00, 0x0D, 0x05, 0x00, 0x0F, 0x98, 0xD4, 0x0F, +0x0F, 0x98, 0x66, 0x0C, 0x0F, 0x98, 0x7B, 0x04, +0x00, 0x0E, 0xFD, 0x01, 0x0F, 0x98, 0xDE, 0x08, +0x0F, 0x98, 0x48, 0x09, 0x00, 0x03, 0x70, 0x00, +0x00, 0x0D, 0xFC, 0x01, 0x0F, 0x98, 0x3D, 0x0A, +0x00, 0x0E, 0x05, 0xF8, 0x0F, 0x98, 0x40, 0x0C, +0x0F, 0x98, 0x61, 0x0C, 0x0F, 0x98, 0xA2, 0x0F, +0xA0, 0x03, 0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, +0xBF, 0x51, 0x10, 0x80, 0xA1, 0x19, 0x0A, 0x0D, +0xFE, 0x0D, 0x0F, 0x98, 0x35, 0x0C, 0x00, 0x03, +0xFB, 0x01, 0x01, 0x49, 0x00, 0x98, 0xAA, 0x02, +0xFF, 0xFF, 0x00, 0x03, 0xFE, 0x01, 0x00, 0x49, +0x61, 0x87, 0x00, 0x03, 0xFD, 0x01, 0x01, 0x49, +0x00, 0x88, 0xC5, 0x06, 0x02, 0x49, 0xA0, 0x84, +0x00, 0x03, 0x05, 0x00, 0x05, 0x49, 0x0D, 0x81, +0x00, 0x4A, 0x33, 0x00, 0x40, 0x82, 0x09, 0x49, +0xB0, 0x80, 0x08, 0x49, 0x00, 0x82, 0x0C, 0x49, +0x00, 0x88, 0x92, 0x06, 0x0D, 0x49, 0x00, 0x88, +0x92, 0x06, 0x0A, 0x49, 0x01, 0x88, 0xB0, 0x06, +0x00, 0x03, 0x05, 0x00, 0x0A, 0x49, 0x71, 0x80, +0x00, 0x03, 0x8B, 0x0B, 0x0B, 0x51, 0x01, 0x98, +0x00, 0x07, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x03, +0x05, 0x00, 0x03, 0x49, 0x8B, 0x80, 0x00, 0x03, +0x8B, 0x0B, 0x10, 0x03, 0xE5, 0x00, 0xFF, 0xFF, +0x01, 0x60, 0x01, 0x98, 0x00, 0x07, 0xFF, 0xFF, +0x0F, 0x98, 0x87, 0x08, 0x00, 0x03, 0x05, 0x00, +0x00, 0x4A, 0x33, 0x00, 0xA1, 0x81, 0x00, 0x03, +0xE6, 0x00, 0x00, 0x49, 0x80, 0x83, 0x00, 0x03, +0xE6, 0x00, 0x10, 0x03, 0xFA, 0x01, 0xFF, 0xFF, +0x11, 0x21, 0x01, 0x0D, 0xFA, 0x01, 0x10, 0x48, +0xEC, 0x82, 0x0F, 0x98, 0x68, 0x04, 0xB0, 0x1A, +0x32, 0x06, 0x90, 0x03, 0x46, 0x02, 0xFF, 0xFF, +0x0F, 0x98, 0xC3, 0x04, 0x0F, 0x98, 0x6D, 0x04, +0x2F, 0x82, 0x00, 0x03, 0x05, 0x00, 0x03, 0x49, +0xEB, 0x81, 0x00, 0x03, 0xE6, 0x00, 0x00, 0x49, +0xA0, 0x81, 0x00, 0x03, 0xE6, 0x00, 0x10, 0x03, +0xFA, 0x01, 0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, +0xFA, 0x01, 0x10, 0x48, 0x0C, 0x81, 0x30, 0x1A, +0x75, 0x00, 0x30, 0x0B, 0x31, 0x21, 0x00, 0x1A, +0x64, 0x64, 0x30, 0x08, 0x0F, 0x98, 0x68, 0x04, +0xB0, 0x1A, 0x75, 0x00, 0x92, 0x19, 0x0F, 0x98, +0x88, 0x04, 0x0F, 0x98, 0x6D, 0x04, 0x00, 0x03, +0x05, 0x00, 0x03, 0x49, 0xD0, 0x80, 0x04, 0x49, +0xB0, 0x80, 0x05, 0x49, 0x90, 0x80, 0x08, 0x49, +0x70, 0x80, 0x09, 0x49, 0x70, 0x80, 0x0C, 0x49, +0x30, 0x80, 0x0D, 0x49, 0x10, 0x80, 0x2F, 0x80, +0x0F, 0x98, 0x14, 0x07, 0x0F, 0x98, 0x57, 0x11, +0x00, 0x03, 0x05, 0x00, 0x09, 0x49, 0x01, 0x88, +0x12, 0x06, 0x0F, 0x98, 0x14, 0x07, 0x0F, 0x88, +0x12, 0x06, 0x06, 0x49, 0x50, 0x80, 0x07, 0x49, +0x30, 0x80, 0x00, 0x4A, 0x14, 0x00, 0xE1, 0x80, +0xA0, 0x1A, 0x72, 0x02, 0x0A, 0x0D, 0x02, 0x02, +0x0F, 0x98, 0x6D, 0x0C, 0xB0, 0x1A, 0x72, 0x02, +0x0F, 0x98, 0xFF, 0x0C, 0x0F, 0x98, 0x14, 0x07, +0x0F, 0x88, 0x12, 0x06, 0x00, 0x03, 0xFD, 0x01, +0x01, 0x49, 0x01, 0x88, 0x12, 0x06, 0x00, 0x03, +0x70, 0x00, 0x00, 0x0D, 0xFC, 0x01, 0x0F, 0x98, +0xA2, 0x0F, 0x00, 0x03, 0x05, 0x00, 0x07, 0x49, +0x11, 0x81, 0x0F, 0x98, 0xF2, 0x0A, 0x0F, 0x98, +0x66, 0x0C, 0x0F, 0x98, 0x8D, 0x08, 0xA0, 0x03, +0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0x10, 0x80, 0xA1, 0x19, 0x0A, 0x0D, 0xFE, 0x0D, +0x0F, 0x98, 0x35, 0x0C, 0x00, 0x0E, 0xFD, 0x01, +0x0F, 0x88, 0x12, 0x06, 0x21, 0x19, 0x10, 0x03, +0x38, 0x0B, 0x10, 0x49, 0x11, 0x80, 0x20, 0x19, +0x00, 0x03, 0x01, 0xF8, 0x01, 0x61, 0x02, 0x48, +0xB1, 0x87, 0xFF, 0xA0, 0x00, 0x03, 0x71, 0x00, +0x00, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x39, 0xB1, 0x87, +0xFF, 0xA0, 0x0F, 0x98, 0xCF, 0x23, 0x0F, 0x98, +0x68, 0x04, 0x93, 0x19, 0x30, 0x03, 0x0A, 0x00, +0xFF, 0xFF, 0x93, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x90, 0x1E, 0x92, 0x21, 0xB0, 0x1A, +0x75, 0x00, 0x0F, 0x98, 0x88, 0x04, 0x0F, 0x88, +0x6D, 0x04, 0x00, 0x03, 0x8B, 0x0B, 0x10, 0x03, +0xE5, 0x00, 0xFF, 0xFF, 0x01, 0x60, 0x01, 0x98, +0xCF, 0x23, 0xFF, 0xFF, 0xB0, 0x1A, 0x72, 0x02, +0x00, 0x03, 0x05, 0x00, 0x0C, 0x49, 0xB0, 0x83, +0x0D, 0x49, 0x90, 0x83, 0x03, 0x49, 0x8C, 0x81, +0x03, 0x49, 0x60, 0x82, 0xB0, 0x1A, 0x32, 0x06, +0x04, 0x49, 0x20, 0x81, 0xB0, 0x19, 0x00, 0x4A, +0x14, 0x00, 0xE0, 0x80, 0xB0, 0x1A, 0x75, 0x07, +0x00, 0x03, 0x05, 0x00, 0x09, 0x49, 0x80, 0x80, +0xB0, 0x1A, 0x72, 0x02, 0x08, 0x49, 0x41, 0x80, +0x0F, 0x98, 0xAC, 0x07, 0xB0, 0x1A, 0x15, 0x08, +0x0F, 0x98, 0x68, 0x04, 0x90, 0x03, 0x46, 0x02, +0xFF, 0xFF, 0x00, 0x03, 0x05, 0x00, 0x08, 0x49, +0x21, 0x80, 0x90, 0x03, 0x10, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x97, 0x04, 0x0F, 0x88, 0x6D, 0x04, +0x0F, 0x98, 0x27, 0x14, 0x0F, 0x98, 0x68, 0x04, +0xB0, 0x1A, 0x72, 0x02, 0x90, 0x03, 0x46, 0x02, +0xFF, 0xFF, 0x0F, 0x98, 0x97, 0x04, 0x0F, 0x98, +0x6D, 0x04, 0x0F, 0x88, 0xD4, 0x14, 0x0F, 0x98, +0x63, 0x04, 0x0F, 0x98, 0x27, 0x14, 0x00, 0x0E, +0x09, 0xF3, 0x20, 0x1A, 0x00, 0x02, 0x20, 0x22, +0x00, 0x40, 0x10, 0x1A, 0x72, 0x02, 0x00, 0x03, +0x46, 0x02, 0xFF, 0xFF, 0x01, 0x79, 0x31, 0x00, +0x3F, 0x51, 0x70, 0x80, 0x30, 0x31, 0x31, 0x79, +0x30, 0x31, 0x30, 0x49, 0x40, 0x80, 0x37, 0xC1, +0x2F, 0x80, 0x31, 0x79, 0x37, 0xC9, 0x11, 0x21, +0x41, 0x00, 0x4F, 0x51, 0x70, 0x80, 0x40, 0x31, +0x41, 0x79, 0x40, 0x31, 0x40, 0x49, 0x40, 0x80, +0x47, 0xC1, 0x2F, 0x80, 0x41, 0x79, 0x47, 0xC9, +0x48, 0x7B, 0x34, 0x68, 0x11, 0x21, 0x23, 0x08, +0x21, 0x21, 0x01, 0x39, 0x01, 0x86, 0x0F, 0x98, +0xD4, 0x14, 0x00, 0x03, 0x05, 0x00, 0x0C, 0x49, +0x40, 0x81, 0x0F, 0x98, 0xCF, 0x23, 0x10, 0x1A, +0x75, 0x00, 0x03, 0x19, 0x02, 0x59, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0x02, 0x21, +0x31, 0x00, 0x23, 0x08, 0x11, 0x21, 0x21, 0x21, +0x01, 0x39, 0xA1, 0x87, 0x00, 0x03, 0xFA, 0x0A, +0x20, 0x08, 0x01, 0x0E, 0x09, 0xF3, 0x0F, 0x88, +0x6D, 0x04, 0xD0, 0x03, 0x10, 0x00, 0xC0, 0x1A, +0x15, 0x08, 0xB0, 0x1A, 0x75, 0x07, 0x0B, 0x00, +0x00, 0x62, 0xFF, 0x00, 0xC0, 0x08, 0xC1, 0x21, +0x0B, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0xC0, 0x08, +0xC1, 0x21, 0xB1, 0x21, 0xD1, 0x39, 0x31, 0x87, +0x10, 0x03, 0x56, 0x00, 0x1C, 0x49, 0x2D, 0x80, +0x0F, 0x88, 0x0A, 0x08, 0x10, 0x03, 0x56, 0x00, +0x18, 0x49, 0x1D, 0x82, 0xD0, 0x1A, 0xF0, 0x00, +0xC0, 0x1A, 0x15, 0x08, 0xB0, 0x1A, 0x15, 0x08, +0x90, 0x19, 0x80, 0x19, 0xAB, 0x18, 0xA9, 0x20, +0x0A, 0x00, 0xAC, 0x18, 0xA8, 0x20, 0xA0, 0x08, +0x91, 0x21, 0x19, 0x18, 0x13, 0x61, 0x13, 0x49, +0x11, 0x80, 0x91, 0x21, 0x81, 0x21, 0x90, 0x4A, +0x10, 0x00, 0x6C, 0x80, 0xB0, 0x22, 0x10, 0x00, +0xC0, 0x22, 0x10, 0x00, 0x90, 0x19, 0x80, 0x19, +0xD1, 0x39, 0x81, 0x86, 0x0F, 0x82, 0xD0, 0x03, +0x10, 0x00, 0xC0, 0x1A, 0x15, 0x08, 0xB0, 0x1A, +0x15, 0x08, 0x90, 0x19, 0x80, 0x19, 0xAB, 0x18, +0xA9, 0x20, 0x0A, 0x00, 0xAC, 0x18, 0xA8, 0x20, +0xA0, 0x08, 0x91, 0x21, 0x19, 0x18, 0x13, 0x61, +0x12, 0x49, 0x11, 0x80, 0x92, 0x21, 0x81, 0x21, +0x90, 0x4A, 0x10, 0x00, 0x6C, 0x80, 0xB0, 0x22, +0x10, 0x00, 0xC0, 0x22, 0x10, 0x00, 0x90, 0x19, +0x80, 0x19, 0xD1, 0x39, 0x81, 0x86, 0xB0, 0x1A, +0x15, 0x08, 0xCB, 0x18, 0x80, 0x1A, 0x3D, 0x0D, +0x20, 0x1A, 0x10, 0x00, 0x30, 0x1A, 0xE8, 0x00, +0x60, 0x1A, 0x08, 0x0E, 0x03, 0x00, 0x00, 0x62, +0xFF, 0x00, 0x60, 0x08, 0x61, 0x21, 0x03, 0x00, +0xFF, 0xFF, 0x08, 0x79, 0x60, 0x08, 0x61, 0x21, +0x31, 0x21, 0x21, 0x39, 0x31, 0x87, 0x30, 0x1A, +0x08, 0x0E, 0x60, 0x19, 0x90, 0x19, 0x50, 0x03, +0x56, 0x00, 0xD0, 0x1A, 0x40, 0x01, 0x03, 0x00, +0x00, 0x62, 0xFF, 0x00, 0x0B, 0x20, 0xA0, 0x00, +0x0C, 0x18, 0x09, 0x20, 0x0A, 0x08, 0x61, 0x21, +0x31, 0x21, 0x91, 0x21, 0x65, 0x48, 0xA1, 0x80, +0x30, 0x1A, 0x08, 0x0E, 0x60, 0x19, 0x90, 0x19, +0xB0, 0x22, 0x10, 0x00, 0xC0, 0x22, 0x10, 0x00, +0xD0, 0x3A, 0x10, 0x00, 0xD0, 0x49, 0x7A, 0x86, +0xD0, 0x03, 0x10, 0x00, 0xC0, 0x1A, 0x15, 0x08, +0xB0, 0x1A, 0x15, 0x08, 0x90, 0x19, 0x80, 0x19, +0x0B, 0x00, 0x00, 0x62, 0xFF, 0x00, 0xB1, 0x21, +0x1B, 0x00, 0xFF, 0xFF, 0x18, 0x7B, 0x01, 0x68, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0xFF, 0xA0, 0xA0, 0x03, 0x15, 0x00, +0x0A, 0x0D, 0xB0, 0x0A, 0x0A, 0x0D, 0xB1, 0x0A, +0x0A, 0x0D, 0xB3, 0x0A, 0x00, 0x0E, 0x8D, 0x0B, +0x00, 0x0E, 0x31, 0x0E, 0x00, 0x0E, 0x8C, 0x0B, +0x00, 0x0E, 0x97, 0x0A, 0x00, 0x0E, 0x98, 0x0A, +0x00, 0x0E, 0x9A, 0x0A, 0x00, 0x0E, 0x9C, 0x0A, +0x00, 0x0E, 0x9D, 0x0A, 0x00, 0x0E, 0x46, 0x00, +0x00, 0x0E, 0x99, 0x0A, 0x0F, 0x98, 0xA2, 0x0F, +0x0F, 0x98, 0x7B, 0x04, 0x0F, 0x98, 0xD4, 0x0F, +0xC0, 0x19, 0xD0, 0x1A, 0x77, 0x00, 0xD2, 0x21, +0x3A, 0x19, 0xD0, 0x0B, 0xD3, 0x21, 0xC1, 0x21, +0xC3, 0x48, 0xB1, 0x87, 0x0F, 0x88, 0x5A, 0x24, +0x00, 0x0E, 0xA2, 0x0A, 0x00, 0x0E, 0xA3, 0x0A, +0x0F, 0x88, 0xE3, 0x0E, 0x00, 0x0E, 0x0D, 0xF3, +0x00, 0x0E, 0x0B, 0xF3, 0x00, 0x0E, 0x0C, 0xF3, +0x90, 0x1A, 0x40, 0x01, 0xA0, 0x1A, 0x00, 0x80, +0xB0, 0x1A, 0x00, 0x60, 0xC0, 0x1A, 0x00, 0x70, +0x0A, 0x00, 0xB0, 0x08, 0xC0, 0x08, 0xB1, 0x21, +0xC1, 0x21, 0xA1, 0x21, 0x91, 0x39, 0x81, 0x87, +0x02, 0x0E, 0x0D, 0xF3, 0x02, 0x0E, 0x0B, 0xF3, +0x02, 0x0E, 0x0C, 0xF3, 0xFF, 0xA0, 0x00, 0x0E, +0x0D, 0xF3, 0x00, 0x0E, 0x0B, 0xF3, 0x00, 0x0E, +0x0C, 0xF3, 0x90, 0x1A, 0x40, 0x01, 0xA0, 0x1A, +0x00, 0x80, 0xB0, 0x1A, 0x00, 0x60, 0xC0, 0x1A, +0x00, 0x70, 0x80, 0x1A, 0xF2, 0x04, 0x50, 0x03, +0x20, 0x01, 0x08, 0x00, 0x40, 0x1A, 0x00, 0x20, +0x40, 0x38, 0x45, 0x7A, 0xA4, 0x08, 0xB4, 0x08, +0xC4, 0x08, 0x81, 0x21, 0xC1, 0x21, 0xB1, 0x21, +0xA1, 0x21, 0x91, 0x39, 0x21, 0x87, 0x02, 0x0E, +0x0D, 0xF3, 0x02, 0x0E, 0x0B, 0xF3, 0x02, 0x0E, +0x0C, 0xF3, 0xFF, 0xA0, 0x90, 0x1A, 0x40, 0x01, +0xB0, 0x1A, 0x72, 0x02, 0x80, 0x1A, 0xF2, 0x04, +0x48, 0x00, 0xB4, 0x08, 0x81, 0x21, 0xB1, 0x21, +0x91, 0x39, 0xA1, 0x87, 0xFF, 0xA0, 0x00, 0x03, +0x25, 0x01, 0x00, 0x0D, 0x1A, 0xF8, 0x00, 0x03, +0x26, 0x01, 0x00, 0x0D, 0x10, 0xF8, 0x00, 0x03, +0x27, 0x01, 0x00, 0x0D, 0x11, 0xF8, 0x00, 0x03, +0x28, 0x01, 0x00, 0x0D, 0x1E, 0xF8, 0x00, 0x03, +0x29, 0x01, 0x00, 0x0D, 0x1F, 0xF8, 0x00, 0x03, +0x1B, 0x01, 0x00, 0x0D, 0x0E, 0xF8, 0x00, 0x03, +0x1C, 0x01, 0x00, 0x0D, 0x0F, 0xF8, 0x00, 0x03, +0x2A, 0x01, 0x00, 0x0D, 0x1B, 0xF8, 0x00, 0x03, +0x2B, 0x01, 0x00, 0x0D, 0x40, 0xF8, 0x00, 0x1A, +0x33, 0x33, 0x00, 0x0D, 0x42, 0xF8, 0x00, 0x03, +0x2C, 0x01, 0x00, 0x0D, 0x28, 0xF8, 0x00, 0x03, +0x2D, 0x01, 0x00, 0x0D, 0x29, 0xF8, 0x00, 0x03, +0x2F, 0x01, 0x00, 0x0D, 0x2A, 0xF8, 0x00, 0x03, +0x30, 0x01, 0x00, 0x0D, 0x21, 0xF8, 0x00, 0x03, +0x31, 0x01, 0x00, 0x0D, 0x22, 0xF8, 0x00, 0x03, +0x32, 0x01, 0x00, 0x0D, 0x4A, 0xF8, 0x00, 0x03, +0x33, 0x01, 0x00, 0x0D, 0x49, 0xF8, 0x00, 0x03, +0x34, 0x01, 0x00, 0x0D, 0x4B, 0xF8, 0x00, 0x03, +0x35, 0x01, 0x00, 0x0D, 0x51, 0xF8, 0x00, 0x03, +0x36, 0x01, 0x00, 0x0D, 0x52, 0xF8, 0x00, 0x03, +0x37, 0x01, 0x00, 0x0D, 0x53, 0xF8, 0xFF, 0xA0, +0x00, 0x0E, 0x45, 0x02, 0xDA, 0x19, 0xC0, 0x1A, +0x57, 0x00, 0xB0, 0x1A, 0x60, 0xF8, 0x0C, 0x00, +0x00, 0x62, 0xFF, 0x00, 0xB0, 0x08, 0xB1, 0x21, +0x0C, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0xB0, 0x08, +0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, 0x31, 0x87, +0xFF, 0xA0, 0xB0, 0x03, 0x55, 0x00, 0xAB, 0x18, +0xC0, 0x03, 0x56, 0x00, 0xFF, 0xFF, 0xAC, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0x0A, 0x0D, 0x46, 0x02, 0xB7, 0x7B, 0xC7, 0x7B, +0x0B, 0x0D, 0xF5, 0x0A, 0x0C, 0x0D, 0xF6, 0x0A, +0x00, 0x03, 0x55, 0x00, 0xFF, 0xFF, 0x01, 0x39, +0x00, 0x0D, 0x08, 0xF8, 0x0F, 0x98, 0x33, 0x09, +0x0F, 0x98, 0x32, 0x0C, 0x10, 0x03, 0x05, 0x00, +0x16, 0x49, 0x61, 0x81, 0x00, 0x03, 0x16, 0x01, +0x00, 0x0D, 0x04, 0xF8, 0x00, 0x03, 0x17, 0x01, +0x00, 0x0D, 0x0B, 0xF8, 0x00, 0x03, 0x18, 0x01, +0x10, 0x18, 0x18, 0x7B, 0x01, 0x68, 0x00, 0x0D, +0x34, 0xF8, 0x00, 0x0D, 0x35, 0xF8, 0x00, 0x0D, +0x36, 0xF8, 0x00, 0x0D, 0x37, 0xF8, 0xCF, 0x82, +0x19, 0x49, 0x51, 0x81, 0x01, 0x19, 0x00, 0x0D, +0x04, 0xF8, 0x00, 0x03, 0x17, 0x01, 0x00, 0x0D, +0x0B, 0xF8, 0x00, 0x03, 0x18, 0x01, 0x10, 0x18, +0x18, 0x7B, 0x01, 0x68, 0x00, 0x0D, 0x34, 0xF8, +0x00, 0x0D, 0x35, 0xF8, 0x00, 0x0D, 0x36, 0xF8, +0x00, 0x0D, 0x37, 0xF8, 0x5F, 0x81, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x0D, 0x04, 0xF8, 0x00, 0x03, +0x6D, 0x00, 0x00, 0x0D, 0x0B, 0xF8, 0x00, 0x03, +0x6E, 0x00, 0x10, 0x18, 0x18, 0x7B, 0x01, 0x68, +0x00, 0x0D, 0x34, 0xF8, 0x00, 0x0D, 0x35, 0xF8, +0x00, 0x0D, 0x36, 0xF8, 0x00, 0x0D, 0x37, 0xF8, +0x00, 0x03, 0x38, 0x01, 0x00, 0x0D, 0x0A, 0xF8, +0xA0, 0x03, 0x15, 0x01, 0xA0, 0x49, 0x00, 0x98, +0x45, 0x0A, 0xFF, 0xFF, 0xA0, 0x03, 0x15, 0x01, +0xA1, 0x49, 0x00, 0x98, 0x80, 0x0A, 0xFF, 0xFF, +0x0F, 0x98, 0xCD, 0x09, 0x0F, 0x98, 0x18, 0x0A, +0x0F, 0x98, 0x97, 0x0A, 0x00, 0x03, 0x05, 0x00, +0x06, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0xC0, 0x03, +0x0D, 0x00, 0xC0, 0x51, 0xF1, 0xA0, 0xFF, 0xFF, +0x0F, 0x88, 0xAD, 0x0B, 0x00, 0x0E, 0x0F, 0xF3, +0x00, 0x03, 0xF5, 0x00, 0x00, 0x49, 0x80, 0x81, +0x90, 0x03, 0x0F, 0x00, 0x95, 0x49, 0x6C, 0x80, +0x0D, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x1E, 0x04, 0x79, 0x93, 0x49, 0x1B, 0x80, +0x01, 0x79, 0x90, 0x1A, 0x14, 0x00, 0x10, 0x1A, +0x00, 0xA0, 0x10, 0x08, 0x11, 0x21, 0x91, 0x39, +0xC1, 0x87, 0x02, 0x0E, 0x0F, 0xF3, 0xFF, 0xA0, +0x0A, 0x19, 0x10, 0x1A, 0x00, 0xA0, 0x20, 0x1A, +0xF6, 0x00, 0x90, 0x03, 0x0F, 0x00, 0x32, 0x00, +0x30, 0x62, 0xFF, 0x00, 0x95, 0x49, 0x6C, 0x80, +0x3D, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x30, 0x1E, 0x34, 0x79, 0x93, 0x49, 0x1B, 0x80, +0x31, 0x79, 0x13, 0x08, 0x11, 0x21, 0x32, 0x00, +0xFF, 0xFF, 0x38, 0x79, 0x95, 0x49, 0x6C, 0x80, +0x3D, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x30, 0x1E, 0x34, 0x79, 0x93, 0x49, 0x1B, 0x80, +0x31, 0x79, 0x13, 0x08, 0x11, 0x21, 0x21, 0x21, +0x01, 0x39, 0xD1, 0x85, 0x02, 0x0E, 0x0F, 0xF3, +0xFF, 0xA0, 0x00, 0x0E, 0x0E, 0xF3, 0x10, 0x03, +0x05, 0x00, 0x16, 0x49, 0x91, 0x80, 0x80, 0x03, +0x18, 0x01, 0x00, 0x03, 0x16, 0x01, 0x00, 0x49, +0x20, 0x80, 0x80, 0x03, 0x17, 0x01, 0x8F, 0x80, +0x80, 0x03, 0x6E, 0x00, 0x00, 0x03, 0x6C, 0x00, +0x00, 0x49, 0x20, 0x80, 0x80, 0x03, 0x6D, 0x00, +0x08, 0x18, 0x08, 0x7B, 0x80, 0x68, 0x90, 0x03, +0x10, 0x00, 0xA0, 0x1A, 0x00, 0x90, 0xA8, 0x08, +0xA1, 0x21, 0x91, 0x39, 0xC1, 0x87, 0x02, 0x0E, +0x0E, 0xF3, 0xFF, 0xA0, 0x00, 0x0E, 0x05, 0xF8, +0x01, 0x19, 0x00, 0x0D, 0x06, 0xF8, 0x00, 0x0E, +0x07, 0xF8, 0xFF, 0xA0, 0x90, 0x03, 0x0F, 0x00, +0x90, 0x49, 0x90, 0x80, 0x90, 0x03, 0x0F, 0x00, +0x91, 0x49, 0x50, 0x80, 0x90, 0x03, 0x0F, 0x00, +0x92, 0x49, 0x10, 0x80, 0x7F, 0x81, 0x00, 0x0E, +0x2C, 0xF8, 0x00, 0x0E, 0x2D, 0xF8, 0x01, 0x0E, +0x2E, 0xF8, 0x01, 0x0E, 0x2F, 0xF8, 0x00, 0x0E, +0x38, 0xF8, 0x00, 0x0E, 0x39, 0xF8, 0x08, 0x0E, +0x3A, 0xF8, 0x01, 0x0E, 0x3B, 0xF8, 0x00, 0x1A, +0x07, 0x15, 0x10, 0x1A, 0x07, 0x1C, 0x20, 0x1A, +0x06, 0x06, 0x5F, 0x82, 0x00, 0x0E, 0x2C, 0xF8, +0x00, 0x0E, 0x2D, 0xF8, 0x01, 0x0E, 0x2E, 0xF8, +0x01, 0x0E, 0x2F, 0xF8, 0x00, 0x0E, 0x38, 0xF8, +0x00, 0x0E, 0x39, 0xF8, 0x08, 0x0E, 0x3A, 0xF8, +0x01, 0x0E, 0x3B, 0xF8, 0x00, 0x1A, 0x07, 0xD5, +0x10, 0x1A, 0x07, 0xDC, 0x20, 0x1A, 0x06, 0xC6, +0xEF, 0x80, 0x00, 0x0E, 0x2C, 0xF8, 0x00, 0x0E, +0x2D, 0xF8, 0x01, 0x0E, 0x2E, 0xF8, 0x01, 0x0E, +0x2F, 0xF8, 0x00, 0x1A, 0x07, 0x07, 0x10, 0x1A, +0x07, 0x07, 0x20, 0x1A, 0x06, 0x06, 0x00, 0x0D, +0x23, 0xF8, 0x01, 0x0D, 0x24, 0xF8, 0x02, 0x0D, +0x25, 0xF8, 0x01, 0x0E, 0x20, 0xF8, 0xFF, 0xA0, +0x30, 0x1A, 0x14, 0x00, 0xB0, 0x1A, 0x3D, 0x0D, +0xB0, 0x0B, 0xB1, 0x21, 0x31, 0x39, 0xC1, 0x87, +0x60, 0x19, 0x00, 0x19, 0x70, 0x03, 0x56, 0x00, +0x06, 0xC0, 0x61, 0x21, 0x67, 0x48, 0xC1, 0x87, +0x30, 0x03, 0x55, 0x00, 0xB0, 0x1A, 0x3D, 0x0D, +0xB0, 0x08, 0xB1, 0x21, 0x31, 0x39, 0xC1, 0x87, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0xF0, 0xA0, +0xFF, 0xFF, 0x80, 0x03, 0xA5, 0x00, 0x10, 0x03, +0xA9, 0x00, 0x20, 0x1A, 0x3D, 0x0D, 0xC0, 0x03, +0xA8, 0x00, 0xC0, 0x49, 0x31, 0x80, 0x21, 0x20, +0x20, 0x0B, 0x8F, 0x80, 0x30, 0x1A, 0x14, 0x00, +0x02, 0x00, 0x01, 0xC8, 0x20, 0x08, 0x21, 0x21, +0x31, 0x39, 0xA1, 0x87, 0x70, 0x1A, 0xAB, 0x00, +0xC0, 0x49, 0x41, 0x80, 0x10, 0x03, 0xA9, 0x00, +0x07, 0x00, 0x3F, 0x80, 0x00, 0x03, 0xA9, 0x00, +0x17, 0x00, 0xB0, 0x03, 0xAA, 0x00, 0x20, 0x1A, +0x3D, 0x0D, 0x10, 0x4A, 0x14, 0x00, 0x2C, 0x80, +0x10, 0x1A, 0x13, 0x00, 0x21, 0x20, 0x32, 0x00, +0x00, 0x4A, 0x10, 0x00, 0x1C, 0x80, 0x0F, 0x19, +0x30, 0xC0, 0x23, 0x08, 0xC0, 0x49, 0x11, 0x80, +0x01, 0x21, 0xC0, 0x49, 0x10, 0x80, 0x11, 0x21, +0xB1, 0x39, 0x91, 0x86, 0x81, 0x39, 0xF0, 0xA0, +0xFF, 0xFF, 0x71, 0x21, 0x9F, 0x85, 0xA0, 0x03, +0x0D, 0x00, 0xA0, 0xC1, 0xA2, 0xC1, 0x0A, 0x0D, +0x0D, 0x00, 0x0F, 0x98, 0x97, 0x0A, 0x0F, 0x98, +0x66, 0x0C, 0x0F, 0x98, 0x59, 0x08, 0x0F, 0x98, +0x3D, 0x0A, 0xA0, 0x03, 0x10, 0x00, 0xB0, 0x1A, +0x75, 0x07, 0x00, 0x03, 0x6E, 0x00, 0x20, 0x03, +0x6C, 0x00, 0x20, 0x49, 0x20, 0x80, 0x00, 0x03, +0x6D, 0x00, 0x10, 0x18, 0x18, 0x7B, 0x01, 0x68, +0xB0, 0x08, 0xB1, 0x21, 0xA1, 0x39, 0xC1, 0x87, +0x0F, 0x98, 0x66, 0x0C, 0x0F, 0x98, 0xEF, 0x0B, +0x0F, 0x98, 0x66, 0x0C, 0x0F, 0x98, 0x3B, 0x0C, +0x0F, 0x98, 0x61, 0x0C, 0x0F, 0x98, 0x3B, 0x0C, +0x0F, 0x98, 0x61, 0x0C, 0x00, 0x0E, 0x0D, 0xF3, +0x40, 0x03, 0x6B, 0x00, 0xA0, 0x03, 0x10, 0x00, +0xB0, 0x1A, 0x00, 0x80, 0xC0, 0x1A, 0x75, 0x07, +0x70, 0x1A, 0x51, 0x0D, 0x90, 0x19, 0x01, 0x0E, +0x29, 0x0B, 0x30, 0x1A, 0x7F, 0x00, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x49, 0x10, 0x80, 0x30, 0x19, +0x2C, 0x00, 0x12, 0x18, 0x10, 0x62, 0xFF, 0x00, +0x13, 0x48, 0x00, 0x88, 0x92, 0x0B, 0x3B, 0x00, +0x00, 0x03, 0x20, 0x01, 0xFF, 0xFF, 0x30, 0x78, +0x00, 0x03, 0x6C, 0x00, 0x00, 0x49, 0x30, 0x80, +0x34, 0x48, 0xBA, 0x80, 0x1F, 0x81, 0x34, 0x48, +0xDD, 0x87, 0x00, 0x0E, 0x29, 0x0B, 0x20, 0x62, +0x00, 0xFF, 0x11, 0x21, 0x21, 0x68, 0xC2, 0x08, +0x7F, 0x80, 0x00, 0x0E, 0x29, 0x0B, 0x20, 0x62, +0x00, 0xFF, 0x11, 0x39, 0x21, 0x68, 0xC2, 0x08, +0x91, 0x21, 0xB1, 0x21, 0x30, 0x1A, 0x7F, 0x00, +0x00, 0x03, 0x6C, 0x00, 0x00, 0x49, 0x10, 0x80, +0x30, 0x19, 0x2C, 0x00, 0x12, 0x18, 0x18, 0x79, +0x13, 0x48, 0x90, 0x82, 0x3B, 0x00, 0x00, 0x03, +0x20, 0x01, 0xFF, 0xFF, 0x30, 0x78, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x49, 0x30, 0x80, 0x34, 0x48, +0xCA, 0x80, 0x3F, 0x81, 0x34, 0x48, 0xDD, 0x87, +0x00, 0x0E, 0x29, 0x0B, 0x20, 0x62, 0xFF, 0x00, +0x11, 0x21, 0x18, 0x7B, 0x21, 0x68, 0xC2, 0x08, +0x8F, 0x80, 0x00, 0x0E, 0x29, 0x0B, 0x20, 0x62, +0xFF, 0x00, 0x11, 0x39, 0x18, 0x7B, 0x21, 0x68, +0xC2, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xA1, 0x39, +0x01, 0x88, 0x30, 0x0B, 0x00, 0x03, 0x29, 0x0B, +0x00, 0x49, 0x00, 0x88, 0x13, 0x0B, 0x0F, 0x98, +0xAD, 0x0B, 0xA0, 0x03, 0x0D, 0x00, 0xA0, 0xC9, +0xA2, 0xC9, 0x0A, 0x0D, 0x0D, 0x00, 0x00, 0x03, +0xFD, 0x01, 0x01, 0x49, 0x21, 0x80, 0x01, 0x0E, +0x2B, 0x0E, 0x0F, 0x98, 0x8D, 0x08, 0xA0, 0x03, +0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0x10, 0x80, 0xA1, 0x19, 0x0A, 0x0D, 0xFE, 0x0D, +0x0F, 0x88, 0x35, 0x0C, 0x0F, 0x98, 0x66, 0x0C, +0x20, 0x03, 0x6C, 0x00, 0x20, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x00, 0x0E, 0x0E, 0xF3, 0x50, 0x03, +0x6D, 0x00, 0x90, 0x03, 0x10, 0x00, 0xC0, 0x1A, +0x75, 0x07, 0xA0, 0x1A, 0x00, 0x90, 0x80, 0x1A, +0x3D, 0x0D, 0x60, 0x03, 0x56, 0x00, 0x30, 0x19, +0x0C, 0x00, 0xFF, 0xFF, 0x00, 0x62, 0xFF, 0x00, +0x05, 0x48, 0x11, 0x80, 0x00, 0x19, 0x36, 0x48, +0x4B, 0x80, 0x28, 0x00, 0x23, 0x50, 0x11, 0x80, +0x00, 0x19, 0x31, 0x21, 0x2C, 0x00, 0x12, 0x18, +0x10, 0x62, 0x00, 0xFF, 0x28, 0x79, 0x25, 0x48, +0x11, 0x80, 0x10, 0x19, 0x36, 0x48, 0x4B, 0x80, +0x28, 0x00, 0x23, 0x50, 0x11, 0x80, 0x10, 0x19, +0x31, 0x21, 0x30, 0x4A, 0x10, 0x00, 0x2C, 0x80, +0x81, 0x21, 0x30, 0x19, 0x01, 0x68, 0xC0, 0x08, +0xA0, 0x08, 0xC1, 0x21, 0xA1, 0x21, 0x91, 0x39, +0x71, 0x85, 0x02, 0x0E, 0x0E, 0xF3, 0xFF, 0xA0, +0x00, 0x0E, 0x0E, 0xF3, 0x90, 0x03, 0x10, 0x00, +0xC0, 0x1A, 0x75, 0x07, 0xA0, 0x1A, 0x00, 0x90, +0x0C, 0x00, 0xA0, 0x08, 0xC1, 0x21, 0xA1, 0x21, +0x91, 0x39, 0xA1, 0x87, 0x02, 0x0E, 0x0E, 0xF3, +0xFF, 0xA0, 0x00, 0x0E, 0x0E, 0xF3, 0x90, 0x1A, +0x4C, 0x00, 0xC0, 0x1A, 0x75, 0x07, 0xA0, 0x1A, +0x00, 0x90, 0xC8, 0x21, 0xA8, 0x21, 0x0C, 0x00, +0xA0, 0x08, 0xA1, 0x21, 0x1C, 0x18, 0x17, 0x61, +0x16, 0x49, 0x10, 0x80, 0xA0, 0x08, 0xA1, 0x21, +0xC2, 0x21, 0x91, 0x39, 0x41, 0x87, 0x02, 0x0E, +0x0E, 0xF3, 0xFF, 0xA0, 0x00, 0x0E, 0x0E, 0xF3, +0x90, 0x1A, 0x50, 0x00, 0xC0, 0x1A, 0x75, 0x07, +0xA0, 0x1A, 0x00, 0x90, 0x0C, 0x00, 0xA0, 0x08, +0xA1, 0x21, 0xA0, 0x08, 0xA1, 0x21, 0xC2, 0x21, +0x91, 0x39, 0x81, 0x87, 0x02, 0x0E, 0x0E, 0xF3, +0xFF, 0xA0, 0x01, 0x0E, 0x09, 0xF8, 0xFF, 0xA0, +0x02, 0x0E, 0x09, 0xF8, 0xFF, 0xA0, 0x03, 0x0E, +0x09, 0xF8, 0xFF, 0xA0, 0xA0, 0x03, 0xFE, 0x0D, +0xA1, 0x49, 0x20, 0x80, 0xA2, 0x49, 0xA0, 0x80, +0x01, 0x0E, 0xFE, 0x0D, 0x00, 0x0E, 0x02, 0xF8, +0x9F, 0x80, 0x01, 0x0E, 0xFE, 0x0D, 0x01, 0x0E, +0x02, 0xF8, 0x4F, 0x80, 0x02, 0x0E, 0xFE, 0x0D, +0x02, 0x0E, 0x02, 0xF8, 0x02, 0x0E, 0x0B, 0xF3, +0x02, 0x0E, 0x0C, 0xF3, 0x02, 0x0E, 0x0D, 0xF3, +0x01, 0x0E, 0x00, 0xF8, 0xFF, 0xA0, 0x02, 0x0E, +0x01, 0xF8, 0xFF, 0xA0, 0x00, 0x03, 0x00, 0xF8, +0x01, 0x51, 0xC1, 0x87, 0x00, 0x0E, 0x0D, 0xF3, +0xFF, 0xA0, 0x02, 0x0E, 0x0D, 0xF3, 0x00, 0x0E, +0x01, 0xF8, 0xFF, 0xA0, 0x00, 0x03, 0x00, 0xF8, +0x00, 0x51, 0xC1, 0x87, 0xFF, 0xA0, 0x0F, 0x98, +0x52, 0x0C, 0x0F, 0x98, 0x55, 0x0C, 0x02, 0x0E, +0x00, 0xF8, 0xFF, 0xA0, 0xA0, 0x03, 0xFE, 0x0D, +0xA1, 0x49, 0xC1, 0x80, 0x0F, 0x98, 0x61, 0x0C, +0x0F, 0x98, 0x66, 0x0C, 0x00, 0x03, 0x01, 0xF8, +0x01, 0x61, 0x00, 0x0D, 0x38, 0x0B, 0x00, 0x0E, +0x0D, 0xF3, 0x6F, 0x80, 0x0F, 0x98, 0xE9, 0x06, +0x0F, 0x98, 0x52, 0x0C, 0x0F, 0x98, 0x55, 0x0C, +0xB0, 0x1A, 0x00, 0x80, 0xC0, 0x03, 0x02, 0x02, +0x10, 0x03, 0x56, 0x00, 0x00, 0x1A, 0x10, 0x00, +0x01, 0x38, 0x50, 0x03, 0x20, 0x01, 0x10, 0x03, +0x56, 0x00, 0x1C, 0x49, 0xBD, 0x80, 0xD0, 0x1A, +0x40, 0x01, 0x9B, 0x00, 0xFF, 0xFF, 0x95, 0x78, +0xC9, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x81, 0x87, 0x3F, 0x82, 0x10, 0x03, 0x56, 0x00, +0x18, 0x49, 0x0D, 0x81, 0xD0, 0x1A, 0x40, 0x01, +0x9B, 0x00, 0xFF, 0xFF, 0x95, 0x78, 0xC9, 0x08, +0xB1, 0x21, 0x1B, 0x18, 0x13, 0x61, 0x13, 0x49, +0x11, 0x80, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0xFF, 0x80, 0xD0, 0x1A, 0x40, 0x01, +0x9B, 0x00, 0xFF, 0xFF, 0x95, 0x78, 0xC9, 0x08, +0xB1, 0x21, 0x1B, 0x18, 0x13, 0x61, 0x12, 0x49, +0x11, 0x80, 0xB2, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0x30, 0x80, 0x0F, 0x98, 0x3D, 0x0A, 0x2F, 0x80, +0x0F, 0x98, 0xA2, 0x0F, 0x02, 0x0E, 0x0D, 0xF3, +0xA0, 0x03, 0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, +0xBF, 0x51, 0x10, 0x80, 0xA1, 0x19, 0xA1, 0x49, +0x61, 0x80, 0x01, 0x0E, 0xFE, 0x0D, 0x0F, 0x98, +0x8D, 0x08, 0x0F, 0x88, 0x3B, 0x0C, 0xA2, 0x49, +0x41, 0x80, 0x02, 0x0E, 0xFE, 0x0D, 0x0F, 0x88, +0x5C, 0x0C, 0xA0, 0x03, 0xFD, 0x0D, 0xA0, 0x49, +0xB0, 0x80, 0x00, 0x03, 0xFE, 0x0D, 0x02, 0x49, +0x00, 0x88, 0x5C, 0x0C, 0x0F, 0x98, 0x8D, 0x08, +0x02, 0x0E, 0xFE, 0x0D, 0x0F, 0x88, 0x45, 0x0C, +0xA0, 0x03, 0xFE, 0x0D, 0xA1, 0x49, 0x80, 0x80, +0x01, 0x0E, 0xFE, 0x0D, 0x0F, 0x98, 0x66, 0x0C, +0x0F, 0x98, 0x8D, 0x08, 0x0F, 0x88, 0x3B, 0x0C, +0x0F, 0x98, 0x8D, 0x08, 0x0F, 0x88, 0x3B, 0x0C, +0xCB, 0x18, 0x80, 0x1A, 0x3D, 0x0D, 0x60, 0x03, +0x56, 0x00, 0x10, 0x1A, 0x10, 0x00, 0xD0, 0x1A, +0x40, 0x01, 0x6C, 0x49, 0x8A, 0x80, 0xD0, 0x1A, +0xF0, 0x00, 0x1C, 0x19, 0x68, 0x49, 0x3A, 0x80, +0xD0, 0x1A, 0xA0, 0x00, 0x18, 0x19, 0x71, 0x18, +0x76, 0x38, 0x20, 0x1A, 0x10, 0x00, 0x30, 0x1A, +0xE8, 0x00, 0x60, 0x1A, 0x08, 0x0E, 0x03, 0x00, +0x00, 0x62, 0xFF, 0x00, 0x60, 0x08, 0x61, 0x21, +0x03, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0x60, 0x08, +0x61, 0x21, 0x31, 0x21, 0x21, 0x39, 0x31, 0x87, +0x30, 0x1A, 0x08, 0x0E, 0x60, 0x19, 0x98, 0x00, +0x50, 0x03, 0x56, 0x00, 0x40, 0x1A, 0x65, 0x0D, +0x21, 0x18, 0x7B, 0x00, 0x47, 0x08, 0xB1, 0x21, +0x41, 0x21, 0x21, 0x39, 0xA1, 0x87, 0x40, 0x1A, +0x65, 0x0D, 0x96, 0x50, 0x21, 0x80, 0xC0, 0x0B, +0x6F, 0x80, 0x03, 0x00, 0x00, 0x62, 0xFF, 0x00, +0x04, 0x20, 0xA0, 0x00, 0xCA, 0x08, 0x61, 0x21, +0x31, 0x21, 0x65, 0x48, 0x11, 0x81, 0x30, 0x1A, +0x08, 0x0E, 0x60, 0x19, 0x81, 0x21, 0x98, 0x00, +0x40, 0x1A, 0x65, 0x0D, 0x21, 0x18, 0x7B, 0x00, +0x47, 0x08, 0xB1, 0x21, 0x41, 0x21, 0x21, 0x39, +0xA1, 0x87, 0x40, 0x1A, 0x65, 0x0D, 0xFF, 0xFF, +0xC1, 0x21, 0xD1, 0x39, 0xE1, 0x85, 0xFF, 0xA0, +0x80, 0x19, 0x90, 0x19, 0x00, 0x0E, 0x37, 0x0E, +0x00, 0x0E, 0x38, 0x0E, 0xD0, 0x03, 0x46, 0x02, +0xB0, 0x1A, 0x15, 0x08, 0xC0, 0x1A, 0xF2, 0x04, +0x40, 0x03, 0x3E, 0x00, 0x50, 0x03, 0x40, 0x00, +0x20, 0x19, 0x30, 0x19, 0x00, 0x1A, 0x00, 0x20, +0x1B, 0x00, 0xFF, 0xFF, 0x01, 0x38, 0x1C, 0x00, +0xFF, 0xFF, 0x01, 0x38, 0x04, 0x48, 0x1C, 0x80, +0x21, 0x21, 0x05, 0x48, 0x1A, 0x80, 0x31, 0x21, +0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, 0xE1, 0x86, +0x10, 0x03, 0x3F, 0x00, 0x21, 0x48, 0x1C, 0x80, +0x81, 0x19, 0x10, 0x03, 0x41, 0x00, 0x31, 0x48, +0x1C, 0x80, 0x91, 0x19, 0x00, 0x03, 0x10, 0x0B, +0x00, 0x49, 0x11, 0x80, 0x90, 0x19, 0x98, 0x60, +0x90, 0x49, 0x60, 0x80, 0x00, 0x03, 0x3D, 0x00, +0x00, 0x0D, 0x2F, 0x0E, 0x05, 0x0E, 0x30, 0x0E, +0x00, 0x03, 0x2F, 0x0E, 0x00, 0x49, 0x30, 0x80, +0x01, 0x39, 0x00, 0x0D, 0x2F, 0x0E, 0xFF, 0xA0, +0x00, 0x0E, 0xA9, 0x0A, 0x00, 0x0E, 0xAB, 0x0A, +0x00, 0x0E, 0xAA, 0x0A, 0x00, 0x0E, 0x37, 0x0E, +0x00, 0x0E, 0x38, 0x0E, 0xD0, 0x03, 0x46, 0x02, +0xB0, 0x1A, 0x15, 0x08, 0xC0, 0x1A, 0x55, 0x09, +0xA0, 0x03, 0xE1, 0x00, 0x90, 0x03, 0xD8, 0x00, +0x0B, 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0x01, 0x38, +0x0F, 0x51, 0x10, 0x80, 0x00, 0x31, 0x0A, 0x48, +0xCD, 0x80, 0x10, 0x03, 0xA9, 0x0A, 0xFF, 0xFF, +0x11, 0x21, 0x01, 0x0D, 0xA9, 0x0A, 0x10, 0x03, +0xAB, 0x0A, 0xFF, 0xFF, 0x10, 0x20, 0x01, 0x0D, +0xAB, 0x0A, 0x09, 0x48, 0x6D, 0x80, 0x10, 0x03, +0xAA, 0x0A, 0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, +0xAA, 0x0A, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0xF1, 0x85, 0x00, 0x03, 0xA9, 0x0A, 0x80, 0x03, +0xE2, 0x00, 0x08, 0x48, 0x0C, 0x82, 0x00, 0x03, +0xAA, 0x0A, 0x80, 0x03, 0xD9, 0x00, 0x08, 0x48, +0xAA, 0x81, 0x00, 0x03, 0xAB, 0x0A, 0x80, 0x03, +0xE3, 0x00, 0x08, 0x48, 0x4C, 0x81, 0x00, 0x03, +0xAB, 0x0A, 0x80, 0x03, 0xE4, 0x00, 0x00, 0x0E, +0x19, 0xF9, 0x00, 0x0D, 0x18, 0xF9, 0x00, 0x0E, +0x1B, 0xF9, 0x08, 0x0D, 0x1A, 0xF9, 0x00, 0x03, +0x18, 0xF9, 0x00, 0x4A, 0xC8, 0x00, 0x4D, 0x80, +0x00, 0x1A, 0xC8, 0x00, 0x1F, 0x80, 0x00, 0x19, +0x80, 0x03, 0x13, 0x01, 0xFF, 0xFF, 0x80, 0x20, +0xFF, 0xA0, 0x0F, 0x98, 0xA2, 0x0F, 0xD0, 0x03, +0x46, 0x02, 0x60, 0x1A, 0x20, 0x00, 0x56, 0x18, +0x67, 0x38, 0x0C, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x0F, 0x51, 0x30, 0x19, 0x10, 0x80, 0x31, 0x39, +0x03, 0x0D, 0x11, 0xF9, 0xFF, 0xFF, 0x07, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, 0x11, 0xF9, +0xFF, 0xFF, 0x00, 0x0D, 0x00, 0xF9, 0x01, 0x0D, +0x01, 0xF9, 0x0B, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x0F, 0x51, 0x30, 0x19, 0x10, 0x80, 0x31, 0x39, +0x03, 0x0D, 0x11, 0xF9, 0xFF, 0xFF, 0x06, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, 0x11, 0xF9, +0xFF, 0xFF, 0x00, 0x0D, 0x02, 0xF9, 0x01, 0x0D, +0x03, 0xF9, 0xFF, 0xFF, 0x00, 0x03, 0x00, 0xF9, +0x10, 0x03, 0x01, 0xF9, 0xFF, 0xFF, 0x00, 0x0D, +0x18, 0xF9, 0x01, 0x0D, 0x19, 0xF9, 0x05, 0x0D, +0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x18, 0xF9, 0xB0, 0x08, 0xB1, 0x21, +0xC1, 0x21, 0xD1, 0x39, 0x01, 0x88, 0x08, 0x0E, +0xFF, 0xA0, 0xD0, 0x03, 0x46, 0x02, 0x0B, 0x00, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0xA1, 0x87, 0xFF, 0xA0, 0xD0, 0x03, 0x46, 0x02, +0xA0, 0x03, 0x4C, 0x00, 0x00, 0x0E, 0xA2, 0x0A, +0x00, 0x0E, 0xA3, 0x0A, 0x00, 0x0E, 0x00, 0xF9, +0x00, 0x0E, 0x01, 0xF9, 0x00, 0x0E, 0x02, 0xF9, +0x00, 0x0E, 0x03, 0xF9, 0x0B, 0x00, 0x1C, 0x00, +0xFF, 0xFF, 0xC0, 0x08, 0x01, 0x38, 0x0F, 0x51, +0x10, 0x80, 0x00, 0x31, 0x90, 0x03, 0xA2, 0x0A, +0x09, 0x48, 0x2C, 0x80, 0x00, 0x0D, 0xA2, 0x0A, +0x20, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x02, 0x0D, 0x00, 0xF9, 0x01, 0x0D, 0x01, 0xF9, +0x00, 0x0D, 0x02, 0xF9, 0x00, 0x0E, 0x03, 0xF9, +0x0A, 0x48, 0x6D, 0x80, 0x10, 0x03, 0xA3, 0x0A, +0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, 0xA3, 0x0A, +0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, 0xA1, 0x85, +0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x20, 0x03, 0x46, 0x02, 0xFF, 0xFF, 0x0F, 0x98, +0x7F, 0x15, 0x00, 0x0D, 0x52, 0x02, 0xFF, 0xA0, +0xB0, 0x03, 0x21, 0x01, 0xB2, 0x49, 0xAC, 0x82, +0xB0, 0x1A, 0x15, 0x08, 0xC0, 0x1A, 0x39, 0x0E, +0x0F, 0x98, 0x00, 0x0E, 0xB0, 0x1A, 0x15, 0x08, +0xC0, 0x1A, 0x39, 0x0E, 0x0F, 0x98, 0x50, 0x0E, +0xB0, 0x03, 0x21, 0x01, 0xA0, 0x03, 0x35, 0x0E, +0xFF, 0xFF, 0xA1, 0x21, 0xAB, 0x48, 0x4B, 0x80, +0x0A, 0x0D, 0x35, 0x0E, 0x91, 0x19, 0xFF, 0xA0, +0xB0, 0x1A, 0x15, 0x08, 0x0F, 0x98, 0x59, 0x0E, +0xA0, 0x03, 0xA2, 0x0A, 0x0A, 0x0D, 0x14, 0x00, +0xA0, 0x03, 0x52, 0x02, 0x0A, 0x0D, 0x9B, 0x00, +0xA0, 0x03, 0xA3, 0x0A, 0x0A, 0x0D, 0x13, 0x00, +0x90, 0x19, 0xFF, 0xA0, 0xB0, 0x1A, 0x15, 0x08, +0xC0, 0x1A, 0x39, 0x0E, 0x0F, 0x98, 0x00, 0x0E, +0xB0, 0x1A, 0x15, 0x08, 0xC0, 0x1A, 0x39, 0x0E, +0x0F, 0x98, 0x59, 0x0E, 0xA0, 0x03, 0xA2, 0x0A, +0x0A, 0x0D, 0x14, 0x00, 0xA0, 0x03, 0x52, 0x02, +0x0A, 0x0D, 0x9B, 0x00, 0xA0, 0x03, 0xA3, 0x0A, +0x0A, 0x0D, 0x13, 0x00, 0x90, 0x19, 0xFF, 0xA0, +0xB0, 0x1A, 0x15, 0x08, 0x0B, 0x0D, 0x02, 0x02, +0x0F, 0x98, 0x6D, 0x0C, 0xB0, 0x1A, 0x15, 0x08, +0x0F, 0x98, 0xFF, 0x0C, 0x0F, 0x98, 0x9F, 0x0D, +0xD0, 0x03, 0x46, 0x02, 0xB0, 0x1A, 0x15, 0x08, +0xC0, 0x1A, 0x55, 0x09, 0x00, 0x0E, 0x34, 0x0E, +0x00, 0x0E, 0x00, 0xF9, 0x00, 0x0E, 0x01, 0xF9, +0x00, 0x0E, 0x02, 0xF9, 0x00, 0x0E, 0x03, 0xF9, +0x0B, 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xC0, 0x08, +0x01, 0x38, 0x0F, 0x51, 0x10, 0x80, 0x00, 0x31, +0x20, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x02, 0x0D, 0x00, 0xF9, 0x01, 0x0D, 0x01, 0xF9, +0x00, 0x0D, 0x02, 0xF9, 0x00, 0x0E, 0x03, 0xF9, +0x10, 0x03, 0xA2, 0x0A, 0x01, 0x48, 0x2C, 0x80, +0x00, 0x0D, 0xA2, 0x0A, 0x0A, 0x48, 0x6D, 0x80, +0x10, 0x03, 0xA3, 0x0A, 0xFF, 0xFF, 0x11, 0x21, +0x01, 0x0D, 0xA3, 0x0A, 0x08, 0x48, 0x6D, 0x80, +0x10, 0x03, 0x34, 0x0E, 0xFF, 0xFF, 0x11, 0x21, +0x01, 0x0D, 0x34, 0x0E, 0xB1, 0x21, 0xC1, 0x21, +0xD1, 0x39, 0x21, 0x85, 0x00, 0x03, 0x00, 0xF9, +0x10, 0x03, 0x01, 0xF9, 0x20, 0x03, 0x46, 0x02, +0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, 0x00, 0x0D, +0x9A, 0x00, 0x10, 0x03, 0xA2, 0x0A, 0x01, 0x0D, +0x99, 0x00, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0xA1, 0x80, 0x00, 0x0E, 0x35, 0x0E, 0xA0, 0x03, +0xA2, 0x0A, 0x0A, 0x0D, 0x14, 0x00, 0xA0, 0x03, +0xA3, 0x0A, 0x0A, 0x0D, 0x13, 0x00, 0x00, 0x03, +0x14, 0x01, 0xA0, 0x03, 0x34, 0x0E, 0x0A, 0x0D, +0x33, 0x0E, 0xB0, 0x03, 0x0C, 0x00, 0xBE, 0x51, +0x70, 0x80, 0xA0, 0x48, 0x5C, 0x80, 0x00, 0x03, +0x11, 0x01, 0x00, 0x0D, 0x36, 0x0E, 0xFF, 0xA0, +0xA0, 0x03, 0x0C, 0x00, 0xAF, 0x51, 0x50, 0x80, +0x0F, 0x98, 0x9B, 0x0E, 0x90, 0x49, 0xF1, 0xA0, +0xFF, 0xFF, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0xA1, 0x80, 0xA0, 0x03, 0x99, 0x00, 0x0A, 0x0D, +0x14, 0x00, 0xA0, 0x03, 0x9A, 0x00, 0x0A, 0x0D, +0x52, 0x02, 0x0A, 0x0D, 0x9B, 0x00, 0x00, 0x0E, +0x34, 0x0E, 0x00, 0x0E, 0x35, 0x0E, 0xB0, 0x1A, +0x15, 0x08, 0xD0, 0x03, 0x46, 0x02, 0xC0, 0x1A, +0x72, 0x02, 0x9B, 0x00, 0x00, 0x03, 0x15, 0x01, +0x00, 0x49, 0x10, 0x80, 0x91, 0x7B, 0x40, 0x1A, +0x00, 0x20, 0x49, 0x38, 0xAC, 0x00, 0xC4, 0x08, +0x50, 0x03, 0xFC, 0x01, 0x50, 0x49, 0x21, 0x81, +0x50, 0x03, 0x46, 0x00, 0x50, 0x49, 0xE0, 0x80, +0x5A, 0x18, 0x54, 0x38, 0x45, 0x18, 0x00, 0x03, +0x47, 0x00, 0x50, 0x48, 0x1D, 0x80, 0x40, 0x18, +0x00, 0x31, 0x50, 0x48, 0x1B, 0x80, 0x40, 0x18, +0xA4, 0x38, 0xCA, 0x08, 0xB1, 0x21, 0xC1, 0x21, +0xD1, 0x39, 0xB1, 0x85, 0xFF, 0xA0, 0x00, 0x0E, +0x05, 0xF8, 0x71, 0x19, 0xA0, 0x03, 0x10, 0x0B, +0xA0, 0x49, 0xE0, 0x80, 0xA0, 0x03, 0x9D, 0x0A, +0xA0, 0x49, 0xA0, 0x80, 0xA0, 0x03, 0xF1, 0x0A, +0xA1, 0x49, 0x31, 0x80, 0x70, 0x03, 0x26, 0x00, +0xEF, 0x80, 0x70, 0x03, 0x27, 0x00, 0xBF, 0x80, +0x00, 0x03, 0x06, 0x0B, 0x00, 0x49, 0x40, 0x80, +0x01, 0x39, 0x00, 0x0D, 0x06, 0x0B, 0x5F, 0x87, +0x70, 0x03, 0x25, 0x00, 0xFF, 0xFF, 0xA0, 0x03, +0x0C, 0x00, 0xAF, 0x51, 0xF1, 0xA0, 0xFF, 0xFF, +0x70, 0x49, 0x00, 0x88, 0x3D, 0x0A, 0x60, 0x1A, +0x20, 0x00, 0x67, 0x38, 0x78, 0x7B, 0x76, 0x68, +0x07, 0x0D, 0x06, 0xF8, 0x05, 0x0E, 0x07, 0xF8, +0xFF, 0xA0, 0x00, 0x03, 0x15, 0x00, 0x00, 0x0D, +0xB3, 0x0A, 0x00, 0x03, 0x33, 0x00, 0x00, 0x0D, +0xB5, 0x0A, 0x00, 0x03, 0x31, 0x00, 0x00, 0x0D, +0xB6, 0x0A, 0x00, 0x03, 0x32, 0x00, 0x00, 0x0D, +0xB9, 0x0A, 0x00, 0x03, 0x10, 0x01, 0x00, 0x0D, +0xB8, 0x0A, 0x00, 0x03, 0x30, 0x00, 0x10, 0x03, +0x32, 0x0E, 0xFF, 0xFF, 0x01, 0x20, 0x00, 0x0D, +0x9B, 0x0A, 0x00, 0x03, 0xA6, 0x00, 0x00, 0x0D, +0x03, 0x0B, 0x00, 0x03, 0x1F, 0x00, 0x00, 0x0D, +0xA0, 0x0A, 0x00, 0x03, 0x20, 0x00, 0x00, 0x0D, +0xA1, 0x0A, 0x00, 0x03, 0x1D, 0x00, 0x00, 0x0D, +0x9E, 0x0A, 0x00, 0x03, 0x1E, 0x00, 0x00, 0x0D, +0x9F, 0x0A, 0x00, 0x03, 0x2C, 0x00, 0x10, 0x18, +0x20, 0x18, 0x00, 0x62, 0xFF, 0x00, 0x00, 0x0D, +0x6C, 0x02, 0x18, 0x79, 0x1F, 0x61, 0x01, 0x0D, +0x6D, 0x02, 0x2C, 0x79, 0x02, 0x0D, 0x6E, 0x02, +0xFF, 0xA0, 0x00, 0x0E, 0xF4, 0x0D, 0x00, 0x0E, +0xF6, 0x0D, 0x80, 0x03, 0x55, 0x00, 0xFF, 0xFF, +0x81, 0x39, 0x08, 0x0D, 0xF7, 0x0D, 0x90, 0x03, +0x56, 0x00, 0xFF, 0xFF, 0x91, 0x39, 0x09, 0x0D, +0xF5, 0x0D, 0xFF, 0xA0, 0x0F, 0x98, 0x14, 0x10, +0x10, 0x03, 0xA9, 0x00, 0x20, 0x03, 0xA8, 0x00, +0x20, 0x49, 0x91, 0x80, 0x10, 0x49, 0x31, 0x80, +0x01, 0x0E, 0xF6, 0x0D, 0xFF, 0xA0, 0x81, 0x39, +0x08, 0x0D, 0xF7, 0x0D, 0xFF, 0xA0, 0x10, 0x49, +0x31, 0x80, 0x01, 0x0E, 0xF4, 0x0D, 0xFF, 0xA0, +0x91, 0x39, 0x09, 0x0D, 0xF5, 0x0D, 0xFF, 0xA0, +0x00, 0x0E, 0x71, 0x02, 0x00, 0x03, 0xE5, 0x00, +0x0F, 0x51, 0xC0, 0x80, 0x01, 0x0E, 0x71, 0x02, +0x0F, 0x98, 0x14, 0x10, 0x0F, 0x98, 0xC8, 0x29, +0x00, 0x0E, 0x71, 0x02, 0x0F, 0x98, 0x25, 0x10, +0x0F, 0x88, 0xC8, 0x29, 0x0F, 0x98, 0x14, 0x10, +0x0F, 0x88, 0xC8, 0x29, 0x40, 0x03, 0x9B, 0x0A, +0xB0, 0x1A, 0xC6, 0x0D, 0xA0, 0x19, 0x0B, 0x00, +0x04, 0x48, 0x2C, 0x80, 0x01, 0x21, 0xB0, 0x08, +0xC3, 0x21, 0xB1, 0x21, 0xA1, 0x21, 0xAF, 0x49, +0x61, 0x87, 0xFF, 0xA0, 0xB0, 0x1A, 0xC6, 0x0D, +0xC0, 0x1A, 0xE4, 0x0D, 0xA0, 0x19, 0x40, 0x03, +0x51, 0x00, 0x50, 0x03, 0x30, 0x00, 0x00, 0x03, +0x32, 0x0E, 0xFF, 0xFF, 0x40, 0x20, 0x50, 0x20, +0x0B, 0x00, 0x05, 0x48, 0x2C, 0x80, 0xB4, 0x08, +0x2F, 0x80, 0xB0, 0x0B, 0xC0, 0x0B, 0xC1, 0x21, +0xB1, 0x21, 0xA1, 0x21, 0xAF, 0x49, 0x41, 0x87, +0xFF, 0xA0, 0xB0, 0x1A, 0xC6, 0x0D, 0xC0, 0x1A, +0xE4, 0x0D, 0xA0, 0x19, 0x50, 0x03, 0x51, 0x00, +0x40, 0x03, 0x30, 0x00, 0x00, 0x03, 0x32, 0x0E, +0xFF, 0xFF, 0x40, 0x20, 0x50, 0x20, 0x0B, 0x00, +0x04, 0x48, 0x2C, 0x80, 0xB5, 0x08, 0x2F, 0x80, +0xB0, 0x0B, 0xC0, 0x0B, 0xC1, 0x21, 0xB1, 0x21, +0xA1, 0x21, 0xAF, 0x49, 0x41, 0x87, 0xFF, 0xA0, +0xB0, 0x1A, 0x32, 0x06, 0x60, 0x1A, 0x75, 0x0D, +0xC0, 0x19, 0x80, 0x03, 0x55, 0x00, 0x90, 0x03, +0x56, 0x00, 0x30, 0x03, 0xB3, 0x0A, 0x00, 0x19, +0x10, 0x19, 0xD0, 0x19, 0xAC, 0x18, 0x4B, 0x18, +0x4A, 0x20, 0x24, 0x00, 0x23, 0x48, 0x4C, 0x80, +0xFF, 0xFF, 0xD1, 0x21, 0x0F, 0x98, 0xFF, 0x14, +0xA9, 0x20, 0x20, 0x03, 0x46, 0x02, 0xA2, 0x48, +0x2C, 0x87, 0x2D, 0x18, 0x20, 0x49, 0x40, 0x80, +0x0F, 0x98, 0x7F, 0x15, 0x60, 0x08, 0x3F, 0x80, +0x00, 0x1A, 0x10, 0x27, 0x60, 0x08, 0x61, 0x21, +0xC1, 0x21, 0xC9, 0x48, 0x0C, 0x86, 0xFF, 0xA0, +0xB0, 0x1A, 0x32, 0x06, 0x60, 0x1A, 0x85, 0x0D, +0xC0, 0x19, 0x80, 0x03, 0x55, 0x00, 0x90, 0x03, +0x56, 0x00, 0x30, 0x03, 0xB3, 0x0A, 0x00, 0x19, +0x10, 0x19, 0xA0, 0x19, 0xD0, 0x19, 0x4B, 0x18, +0x4A, 0x20, 0x24, 0x00, 0x23, 0x48, 0x4C, 0x80, +0xFF, 0xFF, 0xD1, 0x21, 0x0F, 0x98, 0xFF, 0x14, +0xA1, 0x21, 0xA9, 0x48, 0x4C, 0x87, 0x2D, 0x18, +0x20, 0x49, 0x40, 0x80, 0x0F, 0x98, 0x7F, 0x15, +0x60, 0x08, 0x3F, 0x80, 0x00, 0x1A, 0x10, 0x27, +0x60, 0x08, 0x61, 0x21, 0xC9, 0x20, 0xB9, 0x20, +0x10, 0x03, 0x46, 0x02, 0xC1, 0x48, 0xFC, 0x85, +0xFF, 0xA0, 0x00, 0x03, 0x0C, 0x00, 0x08, 0x51, +0xF0, 0xA0, 0xFF, 0xFF, 0x00, 0x03, 0x9A, 0x00, +0x20, 0x03, 0x1B, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x66, 0x15, 0x10, 0x03, 0x1C, 0x00, 0x20, 0x03, +0x9A, 0x00, 0x30, 0x03, 0x2F, 0x00, 0x23, 0x48, +0x2D, 0x80, 0xFF, 0xFF, 0x11, 0x7B, 0xFF, 0xFF, +0x0F, 0x98, 0x25, 0x15, 0xA0, 0x03, 0x43, 0x00, +0xFF, 0xFF, 0xA0, 0x20, 0x00, 0x03, 0xA2, 0x0A, +0x10, 0x03, 0xCD, 0x00, 0x10, 0x49, 0xA0, 0x81, +0x00, 0x0D, 0x18, 0xF9, 0x00, 0x0E, 0x19, 0xF9, +0x01, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x18, 0xF9, 0x10, 0x03, +0xCE, 0x00, 0x00, 0x0D, 0x10, 0xF9, 0x00, 0x0E, +0x11, 0xF9, 0x01, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xFF, 0xFF, 0x00, 0x03, 0x10, 0xF9, +0xFF, 0xFF, 0xA0, 0x20, 0x03, 0x19, 0x12, 0x19, +0xB0, 0x03, 0xB1, 0x0A, 0xAB, 0x48, 0x2B, 0x80, +0x0F, 0x19, 0x14, 0x19, 0xFF, 0xFF, 0xB0, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, 0x1E, +0xAB, 0x20, 0xA0, 0x20, 0xA1, 0x78, 0x0A, 0x0D, +0xB1, 0x0A, 0x00, 0x03, 0xB3, 0x0A, 0xA0, 0x48, +0x9B, 0x80, 0x00, 0x0E, 0xB4, 0x0A, 0xA0, 0x03, +0xB3, 0x0A, 0x0A, 0x0D, 0xB1, 0x0A, 0x0A, 0x0D, +0x44, 0x00, 0xFF, 0xA0, 0x0A, 0x0D, 0x44, 0x00, +0xA0, 0x38, 0x0A, 0x0D, 0xB4, 0x0A, 0xFF, 0xA0, +0x00, 0x0E, 0x03, 0x0E, 0x00, 0x0E, 0x14, 0x0B, +0x00, 0x0E, 0x34, 0x0B, 0x00, 0x0E, 0x8B, 0x0B, +0x00, 0x0E, 0x8C, 0x0B, 0x10, 0x03, 0x32, 0x0E, +0x00, 0x03, 0x30, 0x0E, 0x00, 0x49, 0xF1, 0x81, +0x10, 0x19, 0xB0, 0x03, 0x0C, 0x00, 0xBE, 0x51, +0x80, 0x82, 0x00, 0x03, 0x33, 0x0E, 0x00, 0x49, +0xC0, 0x80, 0x10, 0x03, 0x32, 0x0E, 0x00, 0x03, +0x12, 0x01, 0x10, 0x48, 0x3B, 0x80, 0x11, 0x21, +0x0F, 0x98, 0x55, 0x10, 0x01, 0x0D, 0x32, 0x0E, +0xFF, 0xA0, 0x10, 0x19, 0x00, 0x03, 0x36, 0x0E, +0x00, 0x49, 0x30, 0x81, 0x01, 0x39, 0x00, 0x0D, +0x36, 0x0E, 0x00, 0x49, 0xE0, 0x80, 0x10, 0x03, +0x32, 0x0E, 0x00, 0x03, 0x12, 0x01, 0x10, 0x48, +0x8B, 0x80, 0x11, 0x21, 0x0F, 0x98, 0x55, 0x10, +0x00, 0x03, 0x33, 0x0E, 0x00, 0x49, 0xF1, 0xA0, +0xFF, 0xFF, 0x01, 0x0D, 0x32, 0x0E, 0x00, 0x03, +0x35, 0x0E, 0x00, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, +0x00, 0x03, 0x05, 0x00, 0x00, 0x4A, 0x33, 0x00, +0x40, 0x80, 0x00, 0x03, 0x46, 0x00, 0x00, 0x49, +0x60, 0x80, 0x0F, 0x98, 0x27, 0x14, 0x0F, 0x98, +0x3F, 0x10, 0x0F, 0x98, 0xD4, 0x14, 0x0F, 0x98, +0xFD, 0x13, 0x0F, 0x98, 0x2C, 0x16, 0x90, 0x49, +0x00, 0x88, 0xB0, 0x15, 0xA0, 0x03, 0xA2, 0x0A, +0xB0, 0x03, 0x9F, 0x0A, 0xAB, 0x48, 0x2C, 0x80, +0x00, 0x0E, 0xAC, 0x0A, 0x0F, 0x98, 0x27, 0x14, +0xA0, 0x03, 0x45, 0x00, 0xA0, 0x49, 0x61, 0x80, +0xA0, 0x03, 0x46, 0x00, 0xA0, 0x49, 0x00, 0x88, +0x21, 0x12, 0x5F, 0x80, 0x0F, 0x98, 0x98, 0x20, +0x80, 0x49, 0x00, 0x88, 0x21, 0x12, 0x00, 0x03, +0x46, 0x00, 0x10, 0x03, 0x4E, 0x00, 0x01, 0x48, +0x30, 0x81, 0x01, 0x0D, 0x46, 0x00, 0x00, 0x03, +0xBA, 0x0A, 0x00, 0x49, 0x01, 0x88, 0xD4, 0x14, +0x01, 0x0E, 0xBA, 0x0A, 0x0F, 0x98, 0x65, 0x10, +0x00, 0x0E, 0xAC, 0x0A, 0x00, 0x0E, 0x95, 0x0A, +0x0F, 0x98, 0xD4, 0x14, 0x0F, 0x88, 0xD1, 0x08, +0x00, 0x03, 0x48, 0x00, 0x00, 0x0D, 0xB3, 0x0A, +0x00, 0x0D, 0xB0, 0x0A, 0x00, 0x03, 0x51, 0x00, +0x10, 0x03, 0x32, 0x0E, 0xFF, 0xFF, 0x01, 0x20, +0x00, 0x0D, 0x9B, 0x0A, 0x00, 0x0D, 0x03, 0x0B, +0x00, 0x03, 0x24, 0x00, 0x00, 0x0D, 0xA0, 0x0A, +0x00, 0x0D, 0xA1, 0x0A, 0x00, 0x03, 0x22, 0x00, +0x00, 0x0D, 0x9E, 0x0A, 0x00, 0x03, 0x23, 0x00, +0x00, 0x0D, 0x9F, 0x0A, 0x00, 0x03, 0x2C, 0x00, +0x10, 0x18, 0x20, 0x18, 0x00, 0x62, 0xFF, 0x00, +0x00, 0x0D, 0x6C, 0x02, 0x18, 0x79, 0x1F, 0x61, +0x01, 0x0D, 0x6D, 0x02, 0x2C, 0x79, 0x21, 0x21, +0x02, 0x0D, 0x6E, 0x02, 0xA0, 0x03, 0x0C, 0x00, +0xA5, 0x51, 0x01, 0x88, 0x93, 0x12, 0x00, 0x03, +0x4F, 0x00, 0x00, 0x0D, 0xB5, 0x0A, 0x00, 0x03, +0x50, 0x00, 0x00, 0x0D, 0xB6, 0x0A, 0x00, 0x0D, +0xB9, 0x0A, 0x4F, 0x81, 0xA0, 0x03, 0x46, 0x00, +0xA0, 0x49, 0x40, 0x80, 0xA1, 0x39, 0x0A, 0x0D, +0x46, 0x00, 0x8F, 0x86, 0x00, 0x03, 0xBA, 0x0A, +0x00, 0x49, 0x60, 0x80, 0x00, 0x0E, 0xBA, 0x0A, +0x0F, 0x98, 0x80, 0x10, 0x0F, 0x88, 0xD4, 0x14, +0x0F, 0x98, 0xD4, 0x0F, 0x00, 0x03, 0x9B, 0x0A, +0x00, 0x0D, 0x9C, 0x00, 0x00, 0x03, 0x0C, 0x00, +0x07, 0x51, 0x60, 0x80, 0x00, 0x03, 0xFD, 0x0D, +0x00, 0x49, 0x20, 0x80, 0x0F, 0x88, 0x93, 0x12, +0x0F, 0x98, 0x11, 0x14, 0x00, 0x0E, 0x17, 0x0B, +0x0F, 0x98, 0x1A, 0x17, 0x90, 0x49, 0x00, 0x88, +0x93, 0x12, 0x95, 0x49, 0x00, 0x88, 0x8F, 0x12, +0x00, 0x03, 0xFD, 0x0D, 0x00, 0x49, 0xD0, 0x80, +0x00, 0x03, 0x37, 0x00, 0x00, 0x49, 0x90, 0x80, +0x10, 0x03, 0xFF, 0x0D, 0xFF, 0xFF, 0x11, 0x21, +0x01, 0x0D, 0xFF, 0x0D, 0x10, 0x48, 0x0C, 0x88, +0xD4, 0x14, 0x00, 0x03, 0x37, 0x00, 0x00, 0x0D, +0xFF, 0x0D, 0x97, 0x49, 0x51, 0x80, 0x05, 0x0E, +0xFC, 0x01, 0x00, 0x0E, 0x17, 0x0B, 0xCF, 0x80, +0x92, 0x49, 0x01, 0x81, 0x00, 0x03, 0x2F, 0x0E, +0x00, 0x49, 0x41, 0x80, 0x00, 0x03, 0x36, 0x00, +0x00, 0x0D, 0xF8, 0x0D, 0x01, 0x0E, 0x17, 0x0B, +0x0F, 0x98, 0xD4, 0x14, 0x0F, 0x98, 0xBF, 0x16, +0x0F, 0x88, 0xB0, 0x15, 0xA0, 0x03, 0x0C, 0x00, +0xA4, 0x51, 0x80, 0x80, 0xA0, 0x03, 0xF8, 0x0D, +0xA0, 0x49, 0x40, 0x80, 0xA1, 0x39, 0x0A, 0x0D, +0xF8, 0x0D, 0xEF, 0x86, 0x0F, 0x98, 0xD4, 0x14, +0x0F, 0x98, 0xBF, 0x16, 0x0F, 0x88, 0xB0, 0x15, +0x0F, 0x98, 0xD4, 0x14, 0x0F, 0x88, 0xBF, 0x16, +0x00, 0x0E, 0xFF, 0x0D, 0xA0, 0x03, 0x0C, 0x00, +0xA4, 0x51, 0x80, 0x80, 0xA0, 0x03, 0xF8, 0x0D, +0xA0, 0x49, 0x40, 0x80, 0xA1, 0x39, 0x0A, 0x0D, +0xF8, 0x0D, 0x6F, 0x85, 0x00, 0x03, 0x05, 0x00, +0x00, 0x4A, 0x33, 0x00, 0x60, 0x80, 0x00, 0x03, +0x46, 0x00, 0x00, 0x49, 0x00, 0x98, 0x3F, 0x10, +0xFF, 0xFF, 0xA0, 0x03, 0x46, 0x02, 0xC0, 0x03, +0xF0, 0x0A, 0xB0, 0x1A, 0x32, 0x06, 0xD0, 0x19, +0x9B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x9C, 0x48, +0x1C, 0x80, 0xC9, 0x18, 0x9D, 0x48, 0x1C, 0x80, +0xD9, 0x18, 0xA1, 0x39, 0x51, 0x87, 0x0C, 0x0D, +0xF0, 0x0A, 0x0D, 0x0D, 0xF3, 0x0A, 0x0D, 0x0D, +0xF4, 0x0A, 0x20, 0x03, 0x2A, 0x00, 0x0D, 0x18, +0x0F, 0x98, 0x66, 0x15, 0x00, 0x0D, 0x2A, 0x0E, +0xA0, 0x1A, 0x2A, 0x0E, 0x0F, 0x98, 0x5A, 0x30, +0x00, 0x03, 0x0C, 0x00, 0x08, 0x51, 0x40, 0x82, +0xA0, 0x03, 0xB3, 0x0A, 0x00, 0x03, 0x46, 0x00, +0x00, 0x49, 0x01, 0x88, 0x1D, 0x13, 0x00, 0x03, +0xF0, 0x0A, 0x20, 0x03, 0x1A, 0x00, 0x20, 0x49, +0x00, 0x81, 0x0F, 0x98, 0x66, 0x15, 0xA0, 0x18, +0xB0, 0x03, 0xB1, 0x0A, 0xAB, 0x48, 0x9D, 0x80, +0x0A, 0x0D, 0xB0, 0x0A, 0x10, 0x03, 0xB3, 0x0A, +0x0A, 0x18, 0x01, 0x38, 0x00, 0x0D, 0xB4, 0x0A, +0xDF, 0x82, 0xA0, 0x03, 0xB1, 0x0A, 0x0A, 0x0D, +0xB0, 0x0A, 0x00, 0x0E, 0xB4, 0x0A, 0x6F, 0x82, +0xA0, 0x03, 0x97, 0x0A, 0xA0, 0x49, 0xA0, 0x82, +0xA0, 0x03, 0xB3, 0x0A, 0x00, 0x03, 0x46, 0x00, +0x00, 0x49, 0xC1, 0x81, 0x00, 0x03, 0xF0, 0x0A, +0x20, 0x03, 0x1A, 0x00, 0x20, 0x49, 0x00, 0x81, +0x0F, 0x98, 0x66, 0x15, 0xA0, 0x18, 0xB0, 0x03, +0xB3, 0x0A, 0xAB, 0x48, 0x9D, 0x80, 0x0A, 0x0D, +0xB0, 0x0A, 0x10, 0x03, 0xB3, 0x0A, 0x0A, 0x18, +0x01, 0x38, 0x00, 0x0D, 0xB4, 0x0A, 0x6F, 0x80, +0xA0, 0x03, 0xB3, 0x0A, 0x0A, 0x0D, 0xB0, 0x0A, +0x00, 0x0E, 0xB4, 0x0A, 0x10, 0x03, 0xB3, 0x0A, +0xA1, 0x48, 0x4A, 0x80, 0x00, 0x0E, 0xB4, 0x0A, +0x01, 0x0D, 0xB0, 0x0A, 0xA0, 0x03, 0xB0, 0x0A, +0x10, 0x03, 0x32, 0x0E, 0x10, 0x49, 0x90, 0x80, +0x10, 0x03, 0x42, 0x00, 0x00, 0x03, 0x2F, 0x0E, +0xFF, 0xFF, 0xA1, 0x20, 0xA0, 0x20, 0x0A, 0x0D, +0xB0, 0x0A, 0x0A, 0x0D, 0x12, 0x00, 0x00, 0x1A, +0x32, 0x06, 0x00, 0x0D, 0x11, 0x0B, 0x0A, 0x0D, +0xB2, 0x0A, 0x0F, 0x98, 0xF4, 0x1B, 0x00, 0x03, +0xAD, 0x0A, 0x00, 0x49, 0x00, 0x88, 0x7D, 0x12, +0x0F, 0x98, 0x28, 0x1A, 0x00, 0x03, 0xAD, 0x0A, +0x00, 0x49, 0x00, 0x88, 0x7D, 0x12, 0x00, 0x03, +0x0C, 0x00, 0x09, 0x51, 0x40, 0x80, 0x0F, 0x98, +0x9B, 0x10, 0x0F, 0x98, 0xC7, 0x10, 0x00, 0x0E, +0xAC, 0x0A, 0x80, 0x03, 0xF0, 0x0A, 0x90, 0x03, +0xBA, 0x00, 0xA0, 0x03, 0x98, 0x0A, 0xA0, 0x49, +0xA0, 0x80, 0x89, 0x48, 0x3D, 0x80, 0x00, 0x0E, +0xF1, 0x0A, 0xCF, 0x80, 0xA0, 0x03, 0xF2, 0x0A, +0x0A, 0x0D, 0xF1, 0x0A, 0x7F, 0x80, 0x89, 0x48, +0x3D, 0x80, 0x00, 0x0E, 0xF1, 0x0A, 0x2F, 0x80, +0x01, 0x0E, 0xF1, 0x0A, 0xA0, 0x03, 0xF1, 0x0A, +0x0A, 0x0D, 0xF2, 0x0A, 0x02, 0x0E, 0x10, 0x0B, +0x00, 0x03, 0xAD, 0x0A, 0x00, 0x0D, 0xAE, 0x0A, +0x0F, 0x98, 0xEA, 0x1C, 0x00, 0x03, 0x0C, 0x00, +0x0D, 0x51, 0xA0, 0x80, 0x0F, 0x98, 0x72, 0x1F, +0xD0, 0x03, 0xAD, 0x0A, 0xD0, 0x49, 0x41, 0x80, +0x0F, 0x98, 0xD4, 0x14, 0x0F, 0x88, 0xB0, 0x15, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0xF0, 0x80, +0xD0, 0x03, 0xAE, 0x0A, 0xFF, 0xFF, 0x0F, 0x98, +0xC9, 0x1A, 0x90, 0x49, 0x80, 0x80, 0x00, 0x03, +0x21, 0x00, 0x00, 0x0D, 0xFD, 0x0D, 0x0F, 0x98, +0xD4, 0x14, 0x0F, 0x88, 0xC7, 0x15, 0x00, 0x03, +0xAD, 0x0A, 0x00, 0x49, 0x4A, 0x80, 0x0F, 0x98, +0xC7, 0x15, 0x0F, 0x88, 0xD4, 0x14, 0x00, 0x03, +0xAD, 0x0A, 0x00, 0x0D, 0xAF, 0x0A, 0x0F, 0x98, +0x2F, 0x21, 0xA0, 0x03, 0xAD, 0x0A, 0xA0, 0x49, +0x00, 0x88, 0x7D, 0x12, 0x0F, 0x98, 0xD4, 0x14, +0x0F, 0x98, 0xF8, 0x25, 0xA0, 0x03, 0xAE, 0x0A, +0xA0, 0x49, 0x4A, 0x80, 0x0F, 0x98, 0x9B, 0x15, +0x0F, 0x88, 0xBF, 0x16, 0x00, 0x03, 0xAE, 0x0A, +0x00, 0x0D, 0xAD, 0x0A, 0x0F, 0x98, 0x5E, 0x1D, +0x0F, 0x98, 0xBC, 0x1E, 0xA0, 0x03, 0xAD, 0x0A, +0xA0, 0x49, 0x4A, 0x80, 0x0F, 0x98, 0xB0, 0x15, +0x0F, 0x88, 0xBF, 0x16, 0x0A, 0x0D, 0x9A, 0x0A, +0x0F, 0x98, 0x30, 0x20, 0xA0, 0x03, 0xAD, 0x0A, +0x0A, 0x0D, 0x98, 0x0A, 0xA0, 0x03, 0xAD, 0x0A, +0x0A, 0x0D, 0x97, 0x0A, 0x0F, 0x98, 0x3E, 0x29, +0x00, 0x03, 0x05, 0x00, 0x00, 0x4A, 0x33, 0x00, +0x00, 0x98, 0xFD, 0x13, 0xFF, 0xFF, 0xA0, 0x03, +0x8D, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x8D, 0x0B, 0xA0, 0x03, 0x31, 0x0E, 0xA0, 0x4A, +0x30, 0x75, 0x3B, 0x80, 0xA1, 0x21, 0x0A, 0x0D, +0x31, 0x0E, 0x00, 0x03, 0x3C, 0x00, 0xA0, 0x48, +0x2D, 0x80, 0x00, 0x0E, 0x30, 0x0E, 0xA0, 0x03, +0x49, 0x0B, 0xA0, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, +0x00, 0x0E, 0x8B, 0x0B, 0x00, 0x0E, 0x8C, 0x0B, +0x0F, 0x88, 0xBF, 0x16, 0x90, 0x1A, 0x8B, 0x0B, +0x80, 0x1A, 0x32, 0x06, 0x00, 0x03, 0x46, 0x02, +0xFF, 0xFF, 0x80, 0x20, 0x09, 0x00, 0x80, 0x08, +0x90, 0x1A, 0x4F, 0x0B, 0x81, 0x21, 0x09, 0x00, +0x80, 0x08, 0x91, 0x21, 0x81, 0x21, 0x09, 0x00, +0x80, 0x08, 0xFF, 0xA0, 0xA0, 0x03, 0x31, 0x00, +0xB0, 0x03, 0x10, 0x01, 0x00, 0x03, 0x3F, 0x00, +0x30, 0x03, 0x41, 0x00, 0xFF, 0xFF, 0x03, 0x20, +0x10, 0x03, 0xAA, 0x0A, 0x10, 0x48, 0x3C, 0x80, +0xA3, 0x7B, 0xB2, 0x7B, 0x0F, 0x80, 0x0A, 0x0D, +0xB6, 0x0A, 0x0B, 0x0D, 0xB8, 0x0A, 0xFF, 0xA0, +0x80, 0x1A, 0x00, 0x80, 0x90, 0x1A, 0xFF, 0x7F, +0xC0, 0x03, 0x46, 0x02, 0xD0, 0x1A, 0x72, 0x02, +0x40, 0x1A, 0xF2, 0x04, 0x20, 0x19, 0x30, 0x19, +0x00, 0x03, 0x3E, 0x00, 0x10, 0x03, 0x40, 0x00, +0xAD, 0x00, 0xB4, 0x00, 0xFF, 0xFF, 0xAB, 0x38, +0xDA, 0x08, 0xA0, 0x48, 0x1C, 0x80, 0x21, 0x21, +0xA1, 0x48, 0x1A, 0x80, 0x31, 0x21, 0xA8, 0x48, +0x1D, 0x80, 0x8A, 0x18, 0xA9, 0x48, 0x1B, 0x80, +0x9A, 0x18, 0xD1, 0x21, 0x41, 0x21, 0xC1, 0x39, +0xB1, 0x86, 0x08, 0x0D, 0x50, 0x02, 0x09, 0x0D, +0x51, 0x02, 0x80, 0x19, 0x90, 0x19, 0x10, 0x03, +0x3F, 0x00, 0x21, 0x48, 0x1C, 0x80, 0x81, 0x19, +0x10, 0x03, 0x41, 0x00, 0x31, 0x48, 0x1C, 0x80, +0x91, 0x19, 0x00, 0x03, 0x10, 0x0B, 0x00, 0x49, +0x11, 0x80, 0x90, 0x19, 0x98, 0x60, 0x90, 0x49, +0x60, 0x80, 0x00, 0x03, 0x3D, 0x00, 0x00, 0x0D, +0x2F, 0x0E, 0x05, 0x0E, 0x30, 0x0E, 0x00, 0x03, +0x2F, 0x0E, 0x00, 0x49, 0x30, 0x80, 0x01, 0x39, +0x00, 0x0D, 0x2F, 0x0E, 0x0F, 0x98, 0x74, 0x14, +0xFF, 0xA0, 0xC0, 0x03, 0x46, 0x02, 0xD0, 0x1A, +0x72, 0x02, 0x50, 0x1A, 0xB2, 0x03, 0xA0, 0x03, +0xB7, 0x0A, 0x30, 0x03, 0x51, 0x02, 0xFF, 0xFF, +0xA3, 0x20, 0xA1, 0x79, 0xAE, 0x51, 0xAF, 0xC5, +0x0A, 0x0D, 0xB7, 0x0A, 0xA3, 0x48, 0x1D, 0x80, +0xA3, 0x18, 0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, +0x3A, 0x18, 0xA1, 0x79, 0x3A, 0x20, 0x20, 0x03, +0x57, 0x02, 0x60, 0x03, 0x2B, 0x00, 0x60, 0x62, +0xFF, 0x00, 0x26, 0x48, 0x2A, 0x80, 0x13, 0x19, +0x9F, 0x80, 0x60, 0x03, 0x2B, 0x00, 0xFF, 0xFF, +0x68, 0x79, 0x26, 0x48, 0x2A, 0x80, 0x12, 0x19, +0x1F, 0x80, 0x11, 0x19, 0xAD, 0x00, 0x60, 0x03, +0x0C, 0x00, 0x63, 0x51, 0x61, 0x80, 0x6A, 0x18, +0x60, 0x49, 0x1B, 0x80, 0x60, 0x19, 0x56, 0x08, +0xFF, 0x81, 0x65, 0x00, 0xFF, 0xFF, 0x6A, 0x38, +0x6F, 0x51, 0x10, 0x80, 0x60, 0x31, 0x70, 0x03, +0xBE, 0x00, 0x70, 0x49, 0x60, 0x80, 0x76, 0x48, +0x4B, 0x80, 0x75, 0x00, 0x7A, 0x48, 0x1B, 0x80, +0xFF, 0x80, 0x75, 0x00, 0x5A, 0x08, 0x63, 0x48, +0xBB, 0x80, 0x61, 0x78, 0x51, 0x0B, 0xA0, 0x49, +0x7D, 0x80, 0xA7, 0x48, 0x1B, 0x80, 0x76, 0x38, +0xA7, 0x48, 0x1D, 0x80, 0x76, 0x20, 0x57, 0x08, +0x75, 0x00, 0x70, 0x49, 0x1B, 0x80, 0x51, 0x0B, +0x51, 0x21, 0xD1, 0x21, 0xC1, 0x39, 0xE1, 0x84, +0xFF, 0xA0, 0xC0, 0x03, 0x46, 0x02, 0xD0, 0x1A, +0x72, 0x02, 0x40, 0x1A, 0xF2, 0x04, 0xAD, 0x00, +0xB4, 0x00, 0xFF, 0xFF, 0xAB, 0x20, 0xDA, 0x08, +0xD1, 0x21, 0x41, 0x21, 0xC1, 0x39, 0x71, 0x87, +0xFF, 0xA0, 0x03, 0x0D, 0x4E, 0x02, 0x30, 0x19, +0x0F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x00, 0x0D, +0x00, 0xF9, 0x03, 0x0D, 0x01, 0xF9, 0x30, 0x19, +0x1F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x01, 0x0D, +0x02, 0xF9, 0x03, 0x0D, 0x03, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x30, 0x03, 0x4E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, +0x03, 0x0D, 0x4E, 0x02, 0x00, 0x0D, 0x00, 0xF9, +0x01, 0x0D, 0x01, 0xF9, 0x30, 0x19, 0x2F, 0x51, +0x10, 0x80, 0x31, 0x39, 0x02, 0x0D, 0x02, 0xF9, +0x03, 0x0D, 0x03, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, 0x30, 0x03, +0x4E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x0D, +0x00, 0xF9, 0x01, 0x0D, 0x01, 0xF9, 0x02, 0x0D, +0x02, 0xF9, 0x03, 0x0D, 0x03, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0xFF, 0xFF, 0xFF, 0xA0, 0x03, 0x0D, 0x4E, 0x02, +0x00, 0x0D, 0x10, 0xF9, 0x30, 0x19, 0x0F, 0x51, +0x10, 0x80, 0x31, 0x39, 0x03, 0x0D, 0x11, 0xF9, +0x30, 0x19, 0x1F, 0x51, 0x10, 0x80, 0x31, 0x39, +0x01, 0x0D, 0x12, 0xF9, 0x03, 0x0D, 0x13, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, +0x11, 0xF9, 0x30, 0x03, 0x4E, 0x02, 0xFF, 0xFF, +0xFF, 0xA0, 0x03, 0x0D, 0x4E, 0x02, 0x00, 0x0D, +0x10, 0xF9, 0x01, 0x0D, 0x11, 0xF9, 0x30, 0x19, +0x2F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x02, 0x0D, +0x12, 0xF9, 0x03, 0x0D, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, 0x11, 0xF9, +0x30, 0x03, 0x4E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, +0x00, 0x0D, 0x08, 0xF9, 0x01, 0x0D, 0x09, 0xF9, +0x02, 0x0D, 0x0A, 0xF9, 0x03, 0x0D, 0x0B, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x08, 0xF9, 0x10, 0x03, +0x09, 0xF9, 0xFF, 0xFF, 0xFF, 0xA0, 0x03, 0x0D, +0x4E, 0x02, 0x00, 0x0D, 0x18, 0xF9, 0x30, 0x19, +0x0F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x03, 0x0D, +0x19, 0xF9, 0x30, 0x19, 0x2F, 0x51, 0x10, 0x80, +0x31, 0x39, 0x02, 0x0D, 0x1A, 0xF9, 0x03, 0x0D, +0x1B, 0xF9, 0xFF, 0xFF, 0x00, 0x03, 0x18, 0xF9, +0x30, 0x03, 0x4E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, +0x03, 0x0D, 0x4E, 0x02, 0x00, 0x0D, 0x18, 0xF9, +0x01, 0x0D, 0x19, 0xF9, 0x30, 0x19, 0x2F, 0x51, +0x10, 0x80, 0x31, 0x39, 0x02, 0x0D, 0x1A, 0xF9, +0x03, 0x0D, 0x1B, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x18, 0xF9, 0x10, 0x03, 0x19, 0xF9, 0x30, 0x03, +0x4E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, 0xAF, 0x51, +0xF0, 0xA0, 0xFF, 0xFF, 0xA0, 0x31, 0xFF, 0xA0, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0x30, 0x80, +0xD0, 0x19, 0x0F, 0x98, 0xC9, 0x1A, 0x00, 0x03, +0xFD, 0x0D, 0x00, 0x49, 0x30, 0x80, 0x01, 0x39, +0x00, 0x0D, 0xFD, 0x0D, 0x00, 0x0E, 0xFF, 0x0D, +0x00, 0x0E, 0xB4, 0x0A, 0x00, 0x0E, 0xAD, 0x0A, +0xBF, 0x81, 0x00, 0x03, 0x10, 0x0B, 0x00, 0x49, +0x30, 0x80, 0x01, 0x39, 0x00, 0x0D, 0x10, 0x0B, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0x30, 0x80, +0xD0, 0x19, 0x0F, 0x98, 0xC9, 0x1A, 0x00, 0x03, +0xFD, 0x0D, 0x00, 0x49, 0x30, 0x80, 0x01, 0x39, +0x00, 0x0D, 0xFD, 0x0D, 0x00, 0x0E, 0xB4, 0x0A, +0x00, 0x0E, 0xAD, 0x0A, 0x0F, 0x98, 0xF8, 0x25, +0x0F, 0x98, 0x5E, 0x1D, 0x0F, 0x98, 0xBC, 0x1E, +0x0F, 0x98, 0x3E, 0x29, 0x00, 0x0E, 0x8D, 0x0B, +0x00, 0x0E, 0x31, 0x0E, 0x00, 0x0E, 0x8C, 0x0B, +0x00, 0x0E, 0x97, 0x0A, 0x00, 0x0E, 0x98, 0x0A, +0x00, 0x0E, 0x9A, 0x0A, 0x00, 0x0E, 0x9C, 0x0A, +0x00, 0x0E, 0x9D, 0x0A, 0x00, 0x0E, 0x57, 0x02, +0xA0, 0x19, 0xA0, 0x03, 0xB0, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xB0, 0x03, 0xB3, 0x0A, +0xA0, 0x1E, 0xAB, 0x20, 0xA3, 0x21, 0xA2, 0x79, +0x0A, 0x0D, 0xB0, 0x0A, 0x0A, 0x0D, 0x12, 0x00, +0xAB, 0x48, 0xCD, 0x80, 0x00, 0x03, 0xB0, 0x0A, +0x10, 0x03, 0x1A, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x25, 0x15, 0x00, 0x0D, 0xF0, 0x0A, 0x00, 0x0D, +0xF4, 0x0A, 0x4F, 0x80, 0x0A, 0x0D, 0xF0, 0x0A, +0x0A, 0x0D, 0xF4, 0x0A, 0x0F, 0x98, 0xF4, 0x10, +0x00, 0x0E, 0xF1, 0x0A, 0xA0, 0x03, 0x8B, 0x0B, +0xA3, 0x51, 0x31, 0x80, 0x0F, 0x98, 0x5A, 0x24, +0x2F, 0x80, 0x05, 0x0E, 0x06, 0x0B, 0x00, 0x03, +0x34, 0x0B, 0x00, 0x49, 0x31, 0x80, 0x00, 0x0E, +0x11, 0x00, 0xFF, 0xA0, 0xA0, 0x1A, 0x2A, 0x0E, +0x0F, 0x98, 0x5A, 0x30, 0x00, 0x0E, 0x95, 0x0A, +0x01, 0x0E, 0x97, 0x0A, 0x00, 0x03, 0x34, 0x0B, +0x02, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x00, 0x03, +0x8B, 0x0B, 0x0F, 0xC1, 0x00, 0x0D, 0x8B, 0x0B, +0xFF, 0xA0, 0x00, 0x03, 0xFC, 0x01, 0x00, 0x49, +0x90, 0x80, 0x01, 0x39, 0x00, 0x0D, 0xFC, 0x01, +0x00, 0x03, 0x15, 0x00, 0x00, 0x0D, 0xB1, 0x0A, +0x0F, 0x88, 0x9B, 0x16, 0x91, 0x19, 0xA0, 0x03, +0x17, 0x0B, 0xA0, 0x49, 0x01, 0x88, 0xB4, 0x16, +0xA0, 0x03, 0xFD, 0x0D, 0xA0, 0x49, 0xB1, 0x82, +0xA0, 0x03, 0x50, 0x02, 0xB0, 0x03, 0x53, 0x02, +0xFF, 0xFF, 0xAB, 0x38, 0xAF, 0x51, 0x10, 0x80, +0xA0, 0x31, 0xB0, 0x03, 0x9E, 0x0A, 0xAB, 0x48, +0x0B, 0x88, 0xB4, 0x16, 0xA0, 0x03, 0x51, 0x02, +0xB0, 0x03, 0x54, 0x02, 0xFF, 0xFF, 0xAB, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0xB0, 0x03, +0x9E, 0x0A, 0xAB, 0x48, 0x0B, 0x88, 0xB4, 0x16, +0xA0, 0x03, 0xA2, 0x0A, 0xB0, 0x03, 0x9E, 0x0A, +0xAB, 0x48, 0x0B, 0x88, 0xB4, 0x16, 0xA0, 0x03, +0x95, 0x0A, 0xB0, 0x03, 0xA0, 0x0A, 0xAB, 0x48, +0x0C, 0x88, 0xAD, 0x16, 0xDF, 0x82, 0x0F, 0x88, +0xB4, 0x16, 0xA0, 0x03, 0xA2, 0x0A, 0xB0, 0x03, +0x9F, 0x0A, 0xAB, 0x48, 0xEB, 0x83, 0xA0, 0x03, +0x50, 0x02, 0xB0, 0x03, 0x53, 0x02, 0xFF, 0xFF, +0xAB, 0x38, 0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, +0xB0, 0x03, 0x9F, 0x0A, 0xAB, 0x48, 0x1B, 0x83, +0xA0, 0x03, 0x51, 0x02, 0xB0, 0x03, 0x54, 0x02, +0xFF, 0xFF, 0xAB, 0x38, 0xAF, 0x51, 0x10, 0x80, +0xA0, 0x31, 0xB0, 0x03, 0x9F, 0x0A, 0xAB, 0x48, +0x4B, 0x82, 0xA0, 0x03, 0x95, 0x0A, 0xFF, 0xFF, +0xA1, 0x21, 0x0A, 0x0D, 0x95, 0x0A, 0xB0, 0x03, +0x21, 0x00, 0xAB, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, +0xC0, 0x03, 0x46, 0x02, 0x30, 0x1A, 0x72, 0x02, +0x40, 0x1A, 0xF2, 0x04, 0xA3, 0x00, 0x4A, 0x08, +0x31, 0x21, 0x41, 0x21, 0xC1, 0x39, 0xA1, 0x87, +0x0F, 0x98, 0xB0, 0x15, 0x00, 0x0E, 0x95, 0x0A, +0x90, 0x19, 0x9F, 0x80, 0xA0, 0x03, 0x95, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x95, 0x0A, +0xFF, 0xA0, 0x00, 0x0E, 0x95, 0x0A, 0x00, 0x03, +0x50, 0x02, 0x10, 0x03, 0x51, 0x02, 0x00, 0x0D, +0x53, 0x02, 0x01, 0x0D, 0x54, 0x02, 0xFF, 0xA0, +0xA0, 0x03, 0xA2, 0x0A, 0xB0, 0x03, 0x9F, 0x0A, +0xAB, 0x48, 0x0B, 0x88, 0x0F, 0x17, 0xA0, 0x03, +0x17, 0x0B, 0xA0, 0x49, 0x01, 0x88, 0x0F, 0x17, +0xA0, 0x03, 0xFD, 0x0D, 0xA0, 0x49, 0x01, 0x88, +0x0F, 0x17, 0xA0, 0x03, 0x50, 0x02, 0xB0, 0x03, +0x55, 0x02, 0xFF, 0xFF, 0xAB, 0x38, 0xAF, 0x51, +0x10, 0x80, 0xA0, 0x31, 0xB0, 0x03, 0x9F, 0x0A, +0xAB, 0x48, 0x2B, 0x83, 0xA0, 0x03, 0x51, 0x02, +0xB0, 0x03, 0x56, 0x02, 0xFF, 0xFF, 0xAB, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0xB0, 0x03, +0x9F, 0x0A, 0xAB, 0x48, 0x5B, 0x82, 0xA0, 0x03, +0xAC, 0x0A, 0xB0, 0x03, 0xA1, 0x0A, 0xAB, 0x48, +0x8C, 0x81, 0xC0, 0x03, 0x46, 0x02, 0x30, 0x1A, +0x72, 0x02, 0x40, 0x1A, 0xF2, 0x04, 0xA3, 0x00, +0xB4, 0x00, 0xAB, 0x48, 0x70, 0x80, 0xAB, 0x48, +0x3A, 0x80, 0xB1, 0x39, 0x4B, 0x08, 0x2F, 0x80, +0xB1, 0x21, 0x4B, 0x08, 0x31, 0x21, 0x41, 0x21, +0xC1, 0x39, 0x11, 0x87, 0x00, 0x0E, 0xAC, 0x0A, +0x9F, 0x80, 0xA0, 0x03, 0xAC, 0x0A, 0xFF, 0xFF, +0xA1, 0x21, 0x0A, 0x0D, 0xAC, 0x0A, 0xFF, 0xA0, +0x00, 0x0E, 0xAC, 0x0A, 0x00, 0x03, 0x50, 0x02, +0x10, 0x03, 0x51, 0x02, 0x00, 0x0D, 0x55, 0x02, +0x01, 0x0D, 0x56, 0x02, 0xFF, 0xA0, 0xC0, 0x03, +0x50, 0x02, 0xD0, 0x03, 0x51, 0x02, 0x10, 0x03, +0x0C, 0x00, 0x1C, 0x51, 0x41, 0x80, 0x91, 0x19, +0xC0, 0x49, 0xFD, 0xA0, 0xFF, 0xFF, 0x91, 0x19, +0x10, 0x03, 0x0C, 0x00, 0x1B, 0x51, 0x90, 0x83, +0xA0, 0x03, 0x2D, 0x0E, 0x1C, 0x18, 0x1A, 0x38, +0x0C, 0x0D, 0x2D, 0x0E, 0xB0, 0x03, 0x52, 0x00, +0x1B, 0x48, 0x3B, 0x80, 0x00, 0x0E, 0x2E, 0x0E, +0x0F, 0x81, 0xA0, 0x03, 0x2E, 0x0E, 0x20, 0x03, +0x98, 0x0A, 0x20, 0x49, 0x31, 0x80, 0x1B, 0x48, +0x1C, 0x80, 0xA1, 0x21, 0xB0, 0x03, 0x53, 0x00, +0x1B, 0x48, 0x1C, 0x80, 0xA1, 0x21, 0x0A, 0x0D, +0x2E, 0x0E, 0xB0, 0x03, 0x54, 0x00, 0xCB, 0x48, +0x2C, 0x80, 0x05, 0x0E, 0x2E, 0x0E, 0xA0, 0x03, +0x2E, 0x0E, 0xA2, 0x49, 0x2D, 0x81, 0x00, 0x0E, +0x2E, 0x0E, 0x90, 0x19, 0x00, 0x03, 0x30, 0x0E, +0x00, 0x49, 0x50, 0x80, 0x01, 0x0E, 0x30, 0x0E, +0x00, 0x0E, 0x31, 0x0E, 0x6A, 0x80, 0x95, 0x19, +0x01, 0x0E, 0x30, 0x0E, 0x00, 0x0E, 0x31, 0x0E, +0xFF, 0xA0, 0x0C, 0x18, 0x10, 0x03, 0xB5, 0x0A, +0x10, 0x49, 0x30, 0x81, 0x21, 0x18, 0x18, 0x79, +0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, 0x25, 0x15, +0x20, 0x03, 0xB5, 0x0A, 0x20, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0x66, 0x15, 0x00, 0x31, 0xAD, 0x18, +0xA0, 0x49, 0x3B, 0x80, 0xA0, 0x48, 0xFC, 0xA0, +0xFF, 0xFF, 0x10, 0x03, 0x34, 0x00, 0x10, 0x49, +0x00, 0x88, 0xC9, 0x17, 0xC0, 0x03, 0x50, 0x02, +0xD0, 0x03, 0x51, 0x02, 0x00, 0x1A, 0x72, 0x02, +0x00, 0x0D, 0x11, 0x0B, 0x00, 0x03, 0x35, 0x00, +0x00, 0x0D, 0xB2, 0x0A, 0x0F, 0x98, 0xF4, 0x1B, +0x00, 0x03, 0xAD, 0x0A, 0x00, 0x49, 0x60, 0x83, +0x00, 0x0E, 0x49, 0x02, 0xA0, 0x1A, 0xCC, 0x0B, +0x70, 0x03, 0x49, 0x02, 0xFF, 0xFF, 0xA7, 0x20, +0x1A, 0x00, 0x01, 0x18, 0x20, 0x03, 0x56, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x66, 0x15, 0x00, 0x0D, +0x2F, 0x0B, 0x00, 0x03, 0x1A, 0xF9, 0x00, 0x0D, +0x30, 0x0B, 0xA0, 0x1A, 0x72, 0x02, 0xA1, 0x20, +0x5A, 0x00, 0x05, 0x0D, 0x05, 0x0E, 0x10, 0x03, +0x34, 0x00, 0x01, 0x0D, 0x07, 0x0E, 0xB0, 0x1A, +0x72, 0x02, 0x0B, 0x0D, 0x28, 0x0E, 0x0F, 0x98, +0x27, 0x19, 0x00, 0x03, 0xB6, 0x0A, 0xC0, 0x48, +0xBB, 0x80, 0x70, 0x03, 0x49, 0x02, 0xFF, 0xFF, +0x71, 0x21, 0x07, 0x0D, 0x49, 0x02, 0x00, 0x03, +0xAD, 0x0A, 0x07, 0x48, 0xF1, 0x84, 0x2F, 0x80, +0x01, 0x0E, 0x17, 0x0B, 0x10, 0x03, 0x0C, 0x00, +0x1C, 0x51, 0xC1, 0x83, 0xC0, 0x03, 0x50, 0x02, +0xD0, 0x03, 0x51, 0x02, 0xFF, 0xFF, 0xCD, 0x38, +0xAC, 0x18, 0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, +0xA2, 0x49, 0x2B, 0x80, 0x91, 0x19, 0xFF, 0xA0, +0x10, 0x03, 0x34, 0x00, 0x10, 0x49, 0x81, 0x80, +0x00, 0x03, 0x35, 0x00, 0xA0, 0x48, 0x4C, 0x80, +0x62, 0x19, 0x40, 0x03, 0xB6, 0x0A, 0x3F, 0x80, +0x61, 0x19, 0x40, 0x03, 0xB9, 0x0A, 0xCF, 0x51, +0x40, 0x80, 0xC0, 0x31, 0xC1, 0x79, 0xC0, 0x31, +0x1F, 0x80, 0xC1, 0x79, 0xCD, 0x20, 0xC0, 0x4A, +0x1E, 0x00, 0x2A, 0x80, 0x90, 0x19, 0xFF, 0xA0, +0x70, 0x19, 0xA0, 0x03, 0x46, 0x02, 0xB0, 0x1A, +0x72, 0x02, 0x9B, 0x00, 0x9C, 0x48, 0x1C, 0x80, +0x71, 0x21, 0xB1, 0x21, 0xA1, 0x39, 0x91, 0x87, +0x90, 0x19, 0x74, 0x48, 0xFD, 0xA0, 0xFF, 0xFF, +0x96, 0x18, 0xFF, 0xA0, 0xC0, 0x03, 0x50, 0x02, +0x91, 0x19, 0x1F, 0x19, 0x00, 0x03, 0x10, 0x0B, +0x00, 0x49, 0x10, 0x80, 0x1A, 0x19, 0xC1, 0x48, +0xFD, 0xA0, 0xFF, 0xFF, 0x00, 0x03, 0x46, 0x00, +0x00, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x90, 0x19, +0xD0, 0x03, 0x32, 0x00, 0x00, 0x03, 0x10, 0x0B, +0x00, 0x49, 0x61, 0x81, 0xCD, 0x48, 0x4A, 0x81, +0x60, 0x03, 0xB8, 0x0A, 0xFF, 0xFF, 0x0F, 0x98, +0xBE, 0x18, 0x90, 0x49, 0xD0, 0x80, 0x92, 0x19, +0x70, 0x03, 0x46, 0x02, 0xFF, 0xFF, 0x71, 0x79, +0x67, 0x18, 0x61, 0x79, 0x76, 0x20, 0x60, 0x03, +0x18, 0x0B, 0x67, 0x48, 0x1C, 0x80, 0x97, 0x19, +0xCD, 0x48, 0x5C, 0x81, 0x60, 0x03, 0xB6, 0x0A, +0xFF, 0xFF, 0x0F, 0x98, 0xBE, 0x18, 0x90, 0x49, +0xE0, 0x80, 0x92, 0x19, 0x70, 0x03, 0x46, 0x02, +0xFF, 0xFF, 0x71, 0x79, 0x67, 0x18, 0x61, 0x79, +0x76, 0x20, 0x60, 0x03, 0x18, 0x0B, 0x67, 0x48, +0x2C, 0x80, 0x97, 0x19, 0xFF, 0xA0, 0x70, 0x03, +0x46, 0x02, 0xFF, 0xFF, 0x71, 0x79, 0x67, 0x18, +0x61, 0x79, 0x76, 0x20, 0x60, 0x03, 0x18, 0x0B, +0x67, 0x48, 0x2C, 0x80, 0x97, 0x19, 0xFF, 0xA0, +0xD0, 0x03, 0x17, 0x0B, 0xD0, 0x49, 0x20, 0x80, +0x92, 0x19, 0xFF, 0xA0, 0xD0, 0x03, 0x51, 0x02, +0xFF, 0xFF, 0xCD, 0x38, 0xAC, 0x18, 0x0F, 0x98, +0x96, 0x15, 0xA2, 0x49, 0xFB, 0xA0, 0xFF, 0xFF, +0x91, 0x19, 0xFF, 0xA0, 0x95, 0x19, 0x2C, 0x18, +0xA0, 0x03, 0x56, 0x00, 0xB0, 0x03, 0x55, 0x00, +0xD0, 0x1A, 0x72, 0x02, 0x00, 0x19, 0x1D, 0x00, +0xFF, 0xFF, 0x01, 0x20, 0xDA, 0x20, 0xB1, 0x39, +0xA1, 0x87, 0x0F, 0x98, 0x66, 0x15, 0x03, 0x49, +0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, +0xB0, 0x03, 0x55, 0x00, 0xD0, 0x1A, 0x72, 0x02, +0xDA, 0x20, 0xD1, 0x39, 0x00, 0x19, 0x1D, 0x00, +0xFF, 0xFF, 0x01, 0x20, 0xDA, 0x20, 0xB1, 0x39, +0xA1, 0x87, 0x0F, 0x98, 0x66, 0x15, 0x03, 0x49, +0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, +0xD0, 0x1A, 0x72, 0x02, 0x00, 0x19, 0x1D, 0x00, +0xFF, 0xFF, 0x01, 0x20, 0xD1, 0x21, 0xA1, 0x39, +0xA1, 0x87, 0x0F, 0x98, 0x66, 0x15, 0x03, 0x49, +0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, +0xB0, 0x03, 0x55, 0x00, 0xFF, 0xFF, 0xB1, 0x39, +0xAB, 0x58, 0xD0, 0x1A, 0x72, 0x02, 0x00, 0x19, +0x10, 0x1E, 0xD1, 0x20, 0x1D, 0x00, 0xFF, 0xFF, +0x01, 0x20, 0xD1, 0x21, 0xA1, 0x39, 0xA1, 0x87, +0x0F, 0x98, 0x66, 0x15, 0x03, 0x49, 0xFA, 0xA0, +0xFF, 0xFF, 0x90, 0x19, 0xFF, 0xA0, 0xA0, 0x03, +0x46, 0x02, 0xB0, 0x1A, 0x72, 0x02, 0x00, 0x19, +0x10, 0x19, 0x0F, 0x98, 0xE4, 0x14, 0x50, 0x19, +0x70, 0x19, 0x2B, 0x00, 0x20, 0x4A, 0x1E, 0x00, +0x1D, 0x80, 0x71, 0x21, 0x25, 0x48, 0x0B, 0x98, +0xFF, 0x14, 0xFF, 0xFF, 0xB1, 0x21, 0xA1, 0x39, +0x41, 0x87, 0x07, 0x0D, 0x18, 0x0B, 0x20, 0x03, +0x50, 0x02, 0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, +0x06, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, 0x91, 0x19, +0xFF, 0xA0, 0x90, 0x19, 0x00, 0x03, 0x0F, 0x01, +0x00, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0x80, 0x1A, +0x00, 0x80, 0x90, 0x1A, 0xFF, 0x7F, 0x60, 0x1A, +0x00, 0x80, 0x70, 0x1A, 0xFF, 0x7F, 0x50, 0x03, +0x46, 0x02, 0x30, 0x03, 0xE5, 0x00, 0x1F, 0x51, +0x40, 0x80, 0x30, 0x03, 0x56, 0x00, 0xFF, 0xFF, +0x53, 0x38, 0x30, 0x1A, 0x72, 0x02, 0x40, 0x1A, +0xF2, 0x04, 0xD0, 0x1A, 0x3D, 0x0D, 0x10, 0x19, +0x0D, 0x00, 0x01, 0x50, 0xF0, 0x80, 0xA3, 0x00, +0xB4, 0x00, 0xFF, 0xFF, 0xA8, 0x48, 0x1D, 0x80, +0x8A, 0x18, 0xA9, 0x48, 0x1B, 0x80, 0x9A, 0x18, +0xB6, 0x48, 0x1D, 0x80, 0x6B, 0x18, 0xB7, 0x48, +0x1B, 0x80, 0x7B, 0x18, 0x11, 0x21, 0x00, 0x03, +0x56, 0x00, 0x10, 0x48, 0x2C, 0x80, 0x10, 0x19, +0xD1, 0x21, 0x31, 0x21, 0x41, 0x21, 0x51, 0x39, +0x31, 0x86, 0x89, 0x38, 0x67, 0x38, 0x68, 0x38, +0x00, 0x03, 0x0F, 0x01, 0x90, 0x19, 0x60, 0x48, +0xFD, 0xA0, 0xFF, 0xFF, 0x93, 0x19, 0xFF, 0xA0, +0xC0, 0x19, 0x20, 0x03, 0x2F, 0x0B, 0x20, 0x49, +0xFC, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x55, 0x00, +0x2A, 0x48, 0xFB, 0xA0, 0xFF, 0xFF, 0x20, 0x03, +0x30, 0x0B, 0x20, 0x49, 0xFC, 0xA0, 0xFF, 0xFF, +0xA0, 0x03, 0x56, 0x00, 0x2A, 0x48, 0xFB, 0xA0, +0xFF, 0xFF, 0x00, 0x03, 0x05, 0x0E, 0x10, 0x03, +0x07, 0x0E, 0x21, 0x18, 0x18, 0x79, 0x10, 0x49, +0x60, 0x80, 0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, +0x3B, 0x00, 0x20, 0x62, 0xFF, 0x00, 0x0F, 0x98, +0x66, 0x15, 0x50, 0x18, 0xC0, 0x03, 0x28, 0x0E, +0x90, 0x03, 0x55, 0x00, 0xA0, 0x03, 0x56, 0x00, +0x20, 0x03, 0x30, 0x0B, 0x20, 0x49, 0x2A, 0x80, +0x21, 0x39, 0x6F, 0x81, 0x10, 0x19, 0x70, 0x19, +0x1A, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x30, 0x1E, 0x62, 0x18, 0x63, 0x20, 0x6C, 0x20, +0x06, 0x00, 0x05, 0x48, 0x1C, 0x80, 0x71, 0x19, +0x11, 0x21, 0x19, 0x48, 0x11, 0x87, 0x70, 0x49, +0x30, 0x80, 0x21, 0x39, 0x20, 0x49, 0xAB, 0x86, +0x21, 0x21, 0x02, 0x0D, 0x2B, 0x0B, 0xC0, 0x03, +0x28, 0x0E, 0x90, 0x03, 0x55, 0x00, 0xA0, 0x03, +0x56, 0x00, 0x00, 0x03, 0x56, 0x00, 0xFF, 0xFF, +0x01, 0x39, 0x20, 0x03, 0x30, 0x0B, 0x20, 0x48, +0x3C, 0x80, 0x20, 0x03, 0x56, 0x00, 0x6F, 0x81, +0x10, 0x19, 0x70, 0x19, 0x1A, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x1E, 0x62, 0x18, +0x63, 0x20, 0x6C, 0x20, 0x06, 0x00, 0x05, 0x48, +0x1C, 0x80, 0x71, 0x19, 0x11, 0x21, 0x19, 0x48, +0x11, 0x87, 0x70, 0x49, 0x30, 0x80, 0x21, 0x21, +0x2A, 0x48, 0xAC, 0x86, 0x02, 0x0D, 0x2C, 0x0B, +0xC0, 0x03, 0x28, 0x0E, 0x90, 0x03, 0x55, 0x00, +0xA0, 0x03, 0x56, 0x00, 0x20, 0x03, 0x2F, 0x0B, +0x20, 0x49, 0x2A, 0x80, 0x21, 0x39, 0x6F, 0x81, +0x10, 0x19, 0x70, 0x19, 0x2A, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x1E, 0x63, 0x18, +0x6C, 0x20, 0x06, 0x00, 0x05, 0x48, 0x1C, 0x80, +0x71, 0x19, 0x11, 0x21, 0x61, 0x21, 0x1A, 0x48, +0x81, 0x87, 0x70, 0x49, 0x30, 0x80, 0x21, 0x39, +0x20, 0x49, 0xAB, 0x86, 0x21, 0x21, 0x02, 0x0D, +0x2D, 0x0B, 0xC0, 0x03, 0x28, 0x0E, 0xA0, 0x03, +0x56, 0x00, 0x90, 0x03, 0x55, 0x00, 0x00, 0x03, +0x55, 0x00, 0x20, 0x03, 0x2F, 0x0B, 0xFF, 0xFF, +0x01, 0x39, 0x20, 0x48, 0x3C, 0x80, 0x20, 0x03, +0x55, 0x00, 0x6F, 0x81, 0x10, 0x19, 0x70, 0x19, +0x2A, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x30, 0x1E, 0x63, 0x18, 0x6C, 0x20, 0x06, 0x00, +0x05, 0x48, 0x1C, 0x80, 0x71, 0x19, 0x11, 0x21, +0x61, 0x21, 0x1A, 0x48, 0x81, 0x87, 0x70, 0x49, +0x30, 0x80, 0x21, 0x21, 0x29, 0x48, 0xAC, 0x86, +0x02, 0x0D, 0x2E, 0x0B, 0xC0, 0x19, 0xA0, 0x03, +0x2D, 0x0B, 0xB0, 0x03, 0x28, 0x0E, 0x00, 0x03, +0x56, 0x00, 0xFF, 0xFF, 0x0A, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0xB0, 0x20, +0x10, 0x03, 0x2B, 0x0B, 0x20, 0x03, 0x2C, 0x0B, +0xFF, 0xFF, 0xB1, 0x20, 0x0B, 0x00, 0x05, 0x48, +0x1C, 0x80, 0xC1, 0x21, 0xB1, 0x21, 0x11, 0x21, +0x12, 0x48, 0x8C, 0x87, 0xA1, 0x21, 0x00, 0x03, +0x2E, 0x0B, 0xA0, 0x48, 0x2C, 0x86, 0xFF, 0xA0, +0x81, 0x19, 0x50, 0x03, 0x05, 0x0E, 0x10, 0x03, +0xBA, 0x00, 0x51, 0x48, 0x6B, 0x80, 0x00, 0x03, +0x02, 0x0E, 0xC0, 0x48, 0xFA, 0xA0, 0xFF, 0xFF, +0x5F, 0x80, 0x00, 0x03, 0x00, 0x0E, 0xC0, 0x48, +0xFA, 0xA0, 0xFF, 0xFF, 0x00, 0x03, 0x01, 0x0E, +0xC0, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, 0x80, 0x19, +0xFF, 0xA0, 0x24, 0x48, 0x1B, 0x80, 0x24, 0x18, +0xFF, 0xA0, 0x0F, 0x98, 0x14, 0x10, 0xB0, 0x1A, +0xFF, 0xFF, 0xC0, 0x1A, 0xFF, 0xFF, 0x00, 0x03, +0xE5, 0x00, 0x0F, 0x51, 0xB0, 0x80, 0x0F, 0x98, +0x25, 0x10, 0x00, 0x03, 0xA8, 0x00, 0x00, 0x49, +0x30, 0x80, 0xC0, 0x03, 0xA9, 0x00, 0x2F, 0x80, +0xB0, 0x03, 0xA9, 0x00, 0x70, 0x19, 0xA0, 0x1A, +0xCC, 0x0B, 0xA7, 0x20, 0x1A, 0x00, 0x01, 0x18, +0x20, 0x03, 0x56, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x66, 0x15, 0x00, 0x0D, 0x24, 0x0B, 0x00, 0x03, +0x1A, 0xF9, 0x00, 0x0D, 0x25, 0x0B, 0x40, 0x19, +0x20, 0x03, 0xCF, 0x00, 0x20, 0x49, 0x60, 0x80, +0x00, 0x03, 0x16, 0x0B, 0x40, 0x18, 0x0F, 0x98, +0x66, 0x15, 0x40, 0x38, 0xA0, 0x1A, 0x32, 0x06, +0xA1, 0x20, 0x5A, 0x00, 0x00, 0x03, 0x25, 0x0B, +0x0C, 0x48, 0x30, 0x81, 0x80, 0x03, 0xF4, 0x0D, +0x08, 0x48, 0xA0, 0x81, 0x80, 0x03, 0xF5, 0x0D, +0x08, 0x48, 0x01, 0x82, 0x20, 0x03, 0x17, 0x00, +0x00, 0x03, 0xB4, 0x0A, 0xFF, 0xFF, 0x20, 0x20, +0x0F, 0x98, 0x24, 0x1A, 0x52, 0x48, 0x6B, 0x81, +0xEF, 0x83, 0x20, 0x03, 0xA7, 0x00, 0x00, 0x03, +0xB4, 0x0A, 0xFF, 0xFF, 0x20, 0x20, 0x0F, 0x98, +0x24, 0x1A, 0x52, 0x48, 0xBB, 0x80, 0x3F, 0x83, +0x20, 0x03, 0x16, 0x00, 0x00, 0x03, 0xB4, 0x0A, +0xFF, 0xFF, 0x20, 0x20, 0x0F, 0x98, 0x24, 0x1A, +0x52, 0x48, 0x9C, 0x82, 0x00, 0x03, 0x24, 0x0B, +0x0B, 0x48, 0x30, 0x81, 0x80, 0x03, 0xF6, 0x0D, +0x08, 0x48, 0xA0, 0x81, 0x80, 0x03, 0xF7, 0x0D, +0x08, 0x48, 0xB1, 0x82, 0x20, 0x03, 0x19, 0x00, +0x00, 0x03, 0xB4, 0x0A, 0xFF, 0xFF, 0x20, 0x20, +0x0F, 0x98, 0x24, 0x1A, 0x52, 0x48, 0x1B, 0x82, +0x2F, 0x81, 0x20, 0x03, 0xA7, 0x00, 0x00, 0x03, +0xB4, 0x0A, 0xFF, 0xFF, 0x20, 0x20, 0x0F, 0x98, +0x24, 0x1A, 0x52, 0x48, 0x6B, 0x81, 0x7F, 0x80, +0x20, 0x03, 0x18, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x24, 0x1A, 0x52, 0x48, 0xEB, 0x80, 0xA7, 0x18, +0x0F, 0x98, 0xB3, 0x1C, 0xD0, 0x03, 0xAD, 0x0A, +0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x0D, 0xAD, 0x0A, +0x7D, 0x48, 0xFB, 0xA0, 0xFF, 0xFF, 0x0F, 0x88, +0x3E, 0x1A, 0x10, 0x03, 0xAD, 0x0A, 0xFF, 0xFF, +0x71, 0x21, 0x71, 0x48, 0xFB, 0xA0, 0xFF, 0xFF, +0x0F, 0x88, 0x3E, 0x1A, 0x90, 0x19, 0x00, 0x0E, +0x34, 0x0B, 0x00, 0x0E, 0xFA, 0x0A, 0x00, 0x03, +0xA5, 0x00, 0x00, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0x0F, 0x98, 0xE2, 0x1B, 0xD0, 0x49, 0x11, 0x82, +0xA0, 0x1A, 0xFB, 0x0A, 0x88, 0x19, 0xA0, 0x0B, +0xA1, 0x21, 0x81, 0x39, 0xC1, 0x87, 0x70, 0x19, +0x00, 0x03, 0xA5, 0x00, 0x70, 0x48, 0x0B, 0x88, +0xDC, 0x1B, 0x00, 0x03, 0x04, 0x0B, 0x07, 0x50, +0xE0, 0x80, 0x02, 0x0E, 0x34, 0x0B, 0x00, 0x03, +0xFA, 0x0A, 0x17, 0x18, 0x18, 0x21, 0x01, 0xC0, +0x00, 0x0D, 0xFA, 0x0A, 0x00, 0x03, 0x04, 0x0B, +0x07, 0xC8, 0x00, 0x0D, 0x04, 0x0B, 0x71, 0x21, +0x7F, 0x86, 0x00, 0x03, 0x04, 0x0B, 0x00, 0x0D, +0x05, 0x0B, 0x00, 0x0E, 0x04, 0x0B, 0x70, 0x19, +0x07, 0x0D, 0x49, 0x02, 0xB0, 0x19, 0x70, 0x03, +0x49, 0x02, 0xD0, 0x03, 0xAD, 0x0A, 0x7D, 0x48, +0x0B, 0x88, 0xB2, 0x1B, 0x10, 0x1A, 0xCC, 0x0B, +0x17, 0x20, 0x01, 0x00, 0x20, 0x03, 0x56, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x66, 0x15, 0x00, 0x03, +0x18, 0xF9, 0x00, 0x0D, 0x24, 0x0B, 0x00, 0x03, +0x1A, 0xF9, 0x00, 0x0D, 0x25, 0x0B, 0x60, 0x03, +0xA9, 0x00, 0x00, 0x03, 0xA8, 0x00, 0x00, 0x49, +0x81, 0x80, 0x50, 0x03, 0x25, 0x0B, 0x20, 0x03, +0x24, 0x0B, 0x26, 0x48, 0x01, 0x88, 0x97, 0x1B, +0x7F, 0x80, 0x50, 0x03, 0x24, 0x0B, 0x20, 0x03, +0x25, 0x0B, 0x26, 0x48, 0x01, 0x88, 0x97, 0x1B, +0x60, 0x1A, 0xAB, 0x00, 0x06, 0x0D, 0x4A, 0x02, +0x80, 0x19, 0x08, 0x0D, 0x4B, 0x02, 0xB0, 0x19, +0x00, 0x03, 0xA5, 0x00, 0x80, 0x03, 0x4B, 0x02, +0x80, 0x48, 0x0B, 0x88, 0x97, 0x1B, 0x60, 0x03, +0x4A, 0x02, 0x06, 0x00, 0x50, 0x48, 0x0C, 0x88, +0x8F, 0x1B, 0xC0, 0x03, 0xAA, 0x00, 0xFF, 0xFF, +0x0C, 0x20, 0x50, 0x48, 0x0B, 0x88, 0x8F, 0x1B, +0x00, 0x03, 0x0C, 0x00, 0x09, 0x51, 0x20, 0x82, +0x00, 0x03, 0x24, 0x0B, 0x00, 0x0D, 0x2F, 0x0B, +0x00, 0x03, 0x25, 0x0B, 0x00, 0x0D, 0x30, 0x0B, +0x10, 0x1A, 0xCC, 0x0B, 0x17, 0x20, 0x01, 0x00, +0xA0, 0x1A, 0x32, 0x06, 0xA0, 0x20, 0x5A, 0x00, +0xA0, 0x1A, 0x75, 0x0D, 0x00, 0x03, 0x30, 0x0B, +0xFF, 0xFF, 0xA0, 0x20, 0x0A, 0x00, 0x50, 0x48, +0xFC, 0x82, 0xA0, 0x1A, 0x85, 0x0D, 0x00, 0x03, +0x2F, 0x0B, 0xFF, 0xFF, 0xA0, 0x20, 0x0A, 0x00, +0x50, 0x48, 0x6C, 0x82, 0xA0, 0x1A, 0xFB, 0x0A, +0xA8, 0x20, 0x0A, 0x00, 0xFF, 0xFF, 0x01, 0x21, +0xA0, 0x08, 0x10, 0x03, 0x03, 0x0B, 0x01, 0x48, +0x2B, 0x80, 0xB1, 0x19, 0x9F, 0x81, 0xA1, 0x08, +0x00, 0x03, 0xFA, 0x0A, 0x18, 0x18, 0x10, 0x21, +0x01, 0xC0, 0x00, 0x0D, 0xFA, 0x0A, 0x00, 0x03, +0x04, 0x0B, 0x08, 0xC0, 0x00, 0x0D, 0x04, 0x0B, +0x01, 0x0E, 0x34, 0x0B, 0xB1, 0x19, 0x8F, 0x80, +0x61, 0x21, 0x06, 0x0D, 0x4A, 0x02, 0x81, 0x21, +0x08, 0x0D, 0x4B, 0x02, 0x0F, 0x88, 0x37, 0x1B, +0xB0, 0x49, 0x30, 0x81, 0x70, 0x03, 0x49, 0x02, +0xA7, 0x18, 0x0F, 0x98, 0xBC, 0x1C, 0xB0, 0x03, +0xAE, 0x0A, 0xFF, 0xFF, 0xB1, 0x39, 0x0B, 0x0D, +0xAE, 0x0A, 0xB0, 0x03, 0xAD, 0x0A, 0xFF, 0xFF, +0xB1, 0x39, 0x0B, 0x0D, 0xAD, 0x0A, 0xDB, 0x18, +0x71, 0x39, 0x71, 0x21, 0x07, 0x0D, 0x49, 0x02, +0xB0, 0x19, 0x0F, 0x88, 0x01, 0x1B, 0x70, 0x19, +0x80, 0x19, 0x00, 0x03, 0xA5, 0x00, 0x70, 0x48, +0x4B, 0x82, 0x00, 0x03, 0x04, 0x0B, 0x07, 0x50, +0x80, 0x80, 0x81, 0x21, 0x00, 0x03, 0x05, 0x0B, +0x07, 0x50, 0x91, 0x81, 0x02, 0x0E, 0x34, 0x0B, +0x6F, 0x81, 0x00, 0x03, 0x05, 0x0B, 0x07, 0x50, +0x20, 0x81, 0x02, 0x0E, 0x34, 0x0B, 0x00, 0x03, +0xFA, 0x0A, 0x17, 0x18, 0x18, 0x21, 0x01, 0xC0, +0x00, 0x0D, 0xFA, 0x0A, 0x00, 0x03, 0x04, 0x0B, +0x07, 0xC8, 0x00, 0x0D, 0x04, 0x0B, 0xA0, 0x1A, +0xFB, 0x0A, 0xA7, 0x20, 0xA0, 0x0B, 0x71, 0x21, +0x8F, 0x85, 0x90, 0x03, 0x34, 0x0B, 0x08, 0x0D, +0x2C, 0x0E, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x03, +0xA5, 0x00, 0x20, 0x1A, 0xAF, 0x00, 0x10, 0x1A, +0x9D, 0x00, 0x30, 0x1A, 0x32, 0x06, 0x42, 0x00, +0xFF, 0xFF, 0x34, 0x20, 0x43, 0x00, 0x14, 0x08, +0x21, 0x21, 0x11, 0x21, 0x01, 0x39, 0x51, 0x87, +0xFF, 0xA0, 0xB0, 0x03, 0x11, 0x0B, 0x60, 0x03, +0x55, 0x00, 0x70, 0x03, 0x56, 0x00, 0x3F, 0x19, +0x00, 0x0E, 0xAD, 0x0A, 0x20, 0x03, 0xB2, 0x0A, +0x81, 0x19, 0x91, 0x19, 0xCB, 0x18, 0x1C, 0x00, +0x12, 0x48, 0x0D, 0x88, 0x8C, 0x1C, 0xC7, 0x38, +0xC1, 0x39, 0x81, 0x49, 0x20, 0x81, 0x91, 0x49, +0x40, 0x80, 0x0C, 0x00, 0x10, 0x48, 0x0D, 0x88, +0x8C, 0x1C, 0xC1, 0x21, 0x0C, 0x00, 0x10, 0x48, +0x0D, 0x88, 0x8C, 0x1C, 0x97, 0x48, 0x50, 0x80, +0xC1, 0x21, 0x0C, 0x00, 0x10, 0x48, 0x0D, 0x88, +0x8C, 0x1C, 0xCB, 0x18, 0xC1, 0x39, 0x91, 0x49, +0x40, 0x80, 0x0C, 0x00, 0x10, 0x48, 0x0D, 0x88, +0x8C, 0x1C, 0x97, 0x48, 0x50, 0x80, 0xC2, 0x21, +0x0C, 0x00, 0x10, 0x48, 0x0C, 0x88, 0x8C, 0x1C, +0xCB, 0x18, 0xC7, 0x20, 0xC1, 0x39, 0x86, 0x48, +0x20, 0x81, 0x91, 0x49, 0x40, 0x80, 0x0C, 0x00, +0x10, 0x48, 0x0C, 0x88, 0x8C, 0x1C, 0xC1, 0x21, +0x0C, 0x00, 0x10, 0x48, 0x0C, 0x88, 0x8C, 0x1C, +0x97, 0x48, 0x50, 0x80, 0xC1, 0x21, 0x0C, 0x00, +0x10, 0x48, 0x0C, 0x88, 0x8C, 0x1C, 0xA0, 0x03, +0xAD, 0x0A, 0xA3, 0x48, 0xF0, 0x80, 0xD0, 0x1A, +0xCC, 0x0B, 0xA0, 0x03, 0xAD, 0x0A, 0xFF, 0xFF, +0xDA, 0x20, 0x00, 0x03, 0x11, 0x0B, 0xCB, 0x18, +0xC0, 0x38, 0xDC, 0x08, 0xA1, 0x21, 0x0A, 0x0D, +0xAD, 0x0A, 0x7F, 0x83, 0x00, 0x0E, 0x33, 0x0B, +0x10, 0x1A, 0xCC, 0x0B, 0xA1, 0x00, 0xC0, 0x03, +0x11, 0x0B, 0xFF, 0xFF, 0xCA, 0x20, 0xDC, 0x00, +0x01, 0x0E, 0x32, 0x0B, 0x10, 0x1A, 0xCC, 0x0B, +0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, 0x1A, 0x20, +0xA1, 0x00, 0xC0, 0x03, 0x11, 0x0B, 0xFF, 0xFF, +0xCA, 0x20, 0xAC, 0x00, 0xAD, 0x48, 0x5A, 0x80, +0xDA, 0x18, 0xA0, 0x03, 0x32, 0x0B, 0x0A, 0x0D, +0x33, 0x0B, 0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, +0xA1, 0x21, 0x0A, 0x0D, 0x32, 0x0B, 0xA3, 0x48, +0x51, 0x86, 0xAB, 0x00, 0xDA, 0x48, 0xDA, 0x80, +0x10, 0x1A, 0xCC, 0x0B, 0xA0, 0x03, 0x33, 0x0B, +0xFF, 0xFF, 0x1A, 0x20, 0xC0, 0x03, 0x11, 0x0B, +0xFF, 0xFF, 0xCB, 0x38, 0xC0, 0x31, 0x1C, 0x08, +0x0F, 0x80, 0xB1, 0x21, 0x91, 0x21, 0x97, 0x48, +0x1D, 0x80, 0x91, 0x19, 0x1D, 0x80, 0x81, 0x21, +0x86, 0x48, 0x0D, 0x88, 0x01, 0x1C, 0xFF, 0xA0, +0xA0, 0x19, 0x0A, 0x0D, 0xAD, 0x0A, 0xC0, 0x03, +0xB2, 0x0A, 0xB0, 0x03, 0x11, 0x0B, 0xD0, 0x1A, +0xCC, 0x0B, 0x40, 0x19, 0x9B, 0x00, 0x9C, 0x48, +0x3C, 0x80, 0xC9, 0x18, 0xDA, 0x08, 0x41, 0x19, +0xB1, 0x21, 0xA1, 0x21, 0x90, 0x03, 0x46, 0x02, +0x9A, 0x48, 0x41, 0x87, 0x40, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x01, 0x0E, 0xAD, 0x0A, 0xFF, 0xA0, +0x00, 0x03, 0x0C, 0x00, 0x0A, 0x51, 0x51, 0x80, +0x10, 0x03, 0xAD, 0x0A, 0x11, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x10, 0x03, 0xAD, 0x0A, 0x10, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0x2A, 0x18, 0x3A, 0x18, +0x31, 0x21, 0x31, 0x48, 0xF0, 0xA0, 0xFF, 0xFF, +0x40, 0x1A, 0xCC, 0x0B, 0x42, 0x20, 0x50, 0x1A, +0xCC, 0x0B, 0x53, 0x20, 0x05, 0x00, 0x40, 0x08, +0x23, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x40, 0x1E, 0x40, 0x22, 0x8E, 0x0B, 0x33, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0x1E, +0x50, 0x22, 0x8E, 0x0B, 0x05, 0x00, 0x40, 0x08, +0x51, 0x21, 0x41, 0x21, 0x05, 0x00, 0x40, 0x08, +0x51, 0x21, 0x41, 0x21, 0x05, 0x00, 0x40, 0x08, +0x21, 0x21, 0x31, 0x21, 0xAF, 0x85, 0xD0, 0x03, +0xAE, 0x0A, 0xD1, 0x49, 0xFD, 0xA0, 0xFF, 0xFF, +0xA0, 0x19, 0x00, 0x03, 0xF3, 0x0A, 0x10, 0x03, +0x38, 0x00, 0x10, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0x21, 0x18, 0x18, 0x79, 0x10, 0x49, 0x60, 0x80, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, 0x38, 0x00, +0x20, 0x62, 0xFF, 0x00, 0x0F, 0x98, 0x66, 0x15, +0x00, 0x0D, 0xF3, 0x0A, 0x40, 0x03, 0xF3, 0x0A, +0xB0, 0x1A, 0x32, 0x06, 0xD0, 0x1A, 0xCC, 0x0B, +0xDA, 0x20, 0xCD, 0x00, 0xFF, 0xFF, 0xBC, 0x20, +0xCB, 0x00, 0xC4, 0x48, 0xDB, 0x81, 0x00, 0x03, +0x0C, 0x00, 0x0A, 0x51, 0x41, 0x81, 0x0F, 0x98, +0xB3, 0x1C, 0xA1, 0x39, 0xD0, 0x03, 0xAE, 0x0A, +0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x0D, 0xAE, 0x0A, +0xD0, 0x03, 0xAD, 0x0A, 0xFF, 0xFF, 0xD1, 0x39, +0x0D, 0x0D, 0xAD, 0x0A, 0xD1, 0x49, 0x8A, 0x80, +0x01, 0x0E, 0xAD, 0x0A, 0xFF, 0xA0, 0xD0, 0x03, +0x03, 0x0E, 0xDA, 0xC0, 0x0D, 0x0D, 0x03, 0x0E, +0x40, 0x03, 0xF3, 0x0A, 0xFF, 0xFF, 0xA1, 0x21, +0xB0, 0x03, 0xAD, 0x0A, 0xAB, 0x48, 0x0C, 0x85, +0xFF, 0xA0, 0xB0, 0x03, 0x46, 0x0B, 0xD0, 0x19, +0x30, 0x03, 0x0A, 0x00, 0xBD, 0x50, 0xF0, 0xA0, +0xFF, 0xFF, 0xD1, 0x21, 0xD3, 0x48, 0xA1, 0x87, +0xFF, 0xA0, 0x8C, 0x00, 0x80, 0x62, 0xFF, 0x00, +0x70, 0x03, 0x29, 0x00, 0xFF, 0xFF, 0x71, 0x39, +0x87, 0x58, 0xFF, 0xFF, 0x70, 0x03, 0x29, 0x00, +0x80, 0x1E, 0xA8, 0x20, 0x71, 0x79, 0xA7, 0x78, +0xA0, 0x62, 0xFF, 0x00, 0xDC, 0x00, 0xDD, 0x51, +0x10, 0x80, 0xAD, 0xC1, 0xA8, 0xC1, 0xAA, 0xC1, +0x0A, 0x0D, 0x26, 0x0B, 0xFF, 0xA0, 0x00, 0x03, +0x28, 0x00, 0x00, 0x0D, 0xF3, 0x0D, 0x00, 0x03, +0xAD, 0x0A, 0x02, 0x49, 0x81, 0x80, 0x00, 0x03, +0x74, 0x00, 0x00, 0x49, 0x21, 0x80, 0x00, 0x03, +0x28, 0x00, 0x00, 0x0D, 0xF3, 0x0D, 0x90, 0x1A, +0x6D, 0x0B, 0x92, 0x21, 0xC0, 0x19, 0xB0, 0x19, +0x3A, 0x19, 0xA9, 0x00, 0xA8, 0x51, 0x20, 0x80, +0xBC, 0xC0, 0x3F, 0x80, 0xA0, 0x62, 0xFF, 0x00, +0x9A, 0x08, 0x93, 0x21, 0xC1, 0x21, 0xC3, 0x48, +0x41, 0x87, 0x0B, 0x0D, 0x46, 0x0B, 0xD0, 0x1A, +0x99, 0x0D, 0xD2, 0x21, 0x0D, 0x0D, 0x4A, 0x0B, +0x00, 0x0E, 0x44, 0x0B, 0x00, 0x0E, 0x48, 0x0B, +0x00, 0x0E, 0x49, 0x0B, 0xD0, 0x03, 0x4A, 0x0B, +0x0D, 0x00, 0x0E, 0x51, 0x00, 0x88, 0x04, 0x1E, +0x80, 0x1A, 0xD5, 0x0D, 0xA0, 0x03, 0x48, 0x0B, +0xFF, 0xFF, 0x8A, 0x20, 0x08, 0x00, 0x10, 0x18, +0x11, 0x39, 0x01, 0x0D, 0x4B, 0x0B, 0x00, 0x49, +0x00, 0x88, 0x04, 0x1E, 0x30, 0x03, 0x0A, 0x00, +0x03, 0x48, 0x0A, 0x88, 0xFD, 0x1D, 0x00, 0x03, +0x48, 0x0B, 0x10, 0x03, 0x44, 0x0B, 0x10, 0xC0, +0x01, 0x0D, 0x44, 0x0B, 0xD0, 0x03, 0x4A, 0x0B, +0xFF, 0xFF, 0xD2, 0x39, 0x10, 0x03, 0x4B, 0x0B, +0x61, 0x18, 0x7D, 0x00, 0x07, 0x0D, 0x24, 0x0B, +0xD1, 0x21, 0x8D, 0x00, 0x08, 0x0D, 0x25, 0x0B, +0x90, 0x1A, 0x6D, 0x0B, 0x13, 0x59, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x1E, 0x91, 0x20, +0x09, 0x0D, 0x4C, 0x0B, 0x09, 0x00, 0x00, 0x0D, +0x29, 0x0B, 0x91, 0x21, 0x09, 0x00, 0x00, 0x0D, +0x2A, 0x0B, 0x0F, 0x98, 0x25, 0x25, 0x0A, 0x0D, +0x36, 0x0B, 0x0A, 0x0D, 0x2D, 0x00, 0x0F, 0x98, +0x8E, 0x24, 0x90, 0x03, 0x4C, 0x0B, 0x97, 0x08, +0x91, 0x21, 0x98, 0x08, 0x91, 0x21, 0xD0, 0x03, +0x4A, 0x0B, 0xAD, 0x00, 0x9A, 0x08, 0x00, 0x03, +0x49, 0x0B, 0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, +0x49, 0x0B, 0xD0, 0x03, 0x4A, 0x0B, 0x0D, 0x00, +0x08, 0x51, 0x50, 0x80, 0x00, 0x03, 0x21, 0x00, +0x00, 0x0D, 0xFD, 0x0D, 0x6F, 0x81, 0x10, 0x03, +0x48, 0x0B, 0x90, 0x1A, 0xC6, 0x0D, 0x80, 0x1A, +0xD5, 0x0D, 0x70, 0x1A, 0xE4, 0x0D, 0x91, 0x20, +0x81, 0x20, 0x71, 0x20, 0x90, 0x0B, 0x80, 0x0B, +0x70, 0x0B, 0x7F, 0x80, 0x00, 0x03, 0x48, 0x0B, +0x10, 0x03, 0x44, 0x0B, 0x10, 0xC0, 0x01, 0x0D, +0x44, 0x0B, 0xD0, 0x03, 0x4A, 0x0B, 0x0D, 0x00, +0x08, 0x51, 0xE1, 0x80, 0x10, 0x03, 0x48, 0x0B, +0x90, 0x1A, 0xC6, 0x0D, 0x80, 0x1A, 0xD5, 0x0D, +0x70, 0x1A, 0xE4, 0x0D, 0x91, 0x20, 0x81, 0x20, +0x71, 0x20, 0x90, 0x0B, 0x80, 0x0B, 0x70, 0x0B, +0xD0, 0x03, 0x4A, 0x0B, 0xFF, 0xFF, 0xD3, 0x21, +0x0D, 0x0D, 0x4A, 0x0B, 0xA0, 0x03, 0x48, 0x0B, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x48, 0x0B, +0xAF, 0x49, 0x01, 0x88, 0x8D, 0x1D, 0x00, 0x03, +0x49, 0x0B, 0x10, 0x03, 0x0A, 0x00, 0x01, 0x48, +0x5C, 0x81, 0xD0, 0x1A, 0x99, 0x0D, 0xD2, 0x21, +0xA0, 0x19, 0x0D, 0x00, 0x0E, 0x51, 0x90, 0x80, +0x80, 0x1A, 0xD5, 0x0D, 0x8A, 0x20, 0x08, 0x00, +0x00, 0x49, 0x31, 0x80, 0x00, 0x1A, 0xFF, 0x00, +0x80, 0x08, 0xD3, 0x21, 0xA1, 0x21, 0xAF, 0x49, +0x01, 0x87, 0xFF, 0xA0, 0xD0, 0x1A, 0x99, 0x0D, +0xD2, 0x21, 0x0D, 0x0D, 0x4A, 0x0B, 0x00, 0x0E, +0x48, 0x0B, 0xD0, 0x03, 0x4A, 0x0B, 0x0D, 0x00, +0x0E, 0x51, 0x00, 0x88, 0xAC, 0x1E, 0x00, 0x03, +0x48, 0x0B, 0x10, 0x03, 0x44, 0x0B, 0x10, 0x50, +0x01, 0x88, 0xAC, 0x1E, 0x0F, 0x98, 0x38, 0x1D, +0x30, 0x03, 0x0A, 0x00, 0xD3, 0x48, 0x10, 0x85, +0x0D, 0x0D, 0x4B, 0x0B, 0xA0, 0x03, 0x46, 0x0B, +0xAD, 0xC0, 0x0A, 0x0D, 0x46, 0x0B, 0xA0, 0x1A, +0xDD, 0x0B, 0xAD, 0x20, 0xA0, 0x0B, 0xA0, 0x1A, +0xED, 0x0B, 0xAD, 0x20, 0xA0, 0x0B, 0xA0, 0x1A, +0x62, 0x02, 0xAD, 0x20, 0xA1, 0x0B, 0xA0, 0x1A, +0x58, 0x02, 0xAD, 0x20, 0x00, 0x03, 0x6D, 0x02, +0xA0, 0x08, 0x80, 0x1A, 0xD5, 0x0D, 0xA0, 0x03, +0x48, 0x0B, 0xFF, 0xFF, 0x8A, 0x20, 0xD1, 0x21, +0x8D, 0x08, 0x00, 0x03, 0x48, 0x0B, 0x10, 0x03, +0x44, 0x0B, 0x10, 0xC0, 0x01, 0x0D, 0x44, 0x0B, +0xD0, 0x03, 0x4A, 0x0B, 0xFF, 0xFF, 0xD2, 0x39, +0x7D, 0x00, 0xFF, 0xFF, 0xD1, 0x21, 0x8D, 0x00, +0x10, 0x03, 0x4B, 0x0B, 0x90, 0x1A, 0x6D, 0x0B, +0x13, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x10, 0x1E, 0x91, 0x20, 0x97, 0x08, 0x91, 0x21, +0x98, 0x08, 0x91, 0x21, 0xD0, 0x03, 0x4A, 0x0B, +0x0D, 0x00, 0x90, 0x08, 0x00, 0x03, 0x49, 0x0B, +0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, 0x49, 0x0B, +0x10, 0x03, 0x21, 0x00, 0x01, 0x0D, 0xFD, 0x0D, +0x10, 0x03, 0x0A, 0x00, 0x01, 0x48, 0x00, 0x88, +0x2C, 0x1E, 0xD0, 0x03, 0x4A, 0x0B, 0xFF, 0xFF, +0xD3, 0x21, 0x0D, 0x0D, 0x4A, 0x0B, 0xA0, 0x03, +0x48, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x48, 0x0B, 0xAF, 0x49, 0x01, 0x88, 0x48, 0x1E, +0xFF, 0xA0, 0x00, 0x0E, 0x32, 0x0B, 0xB0, 0x1A, +0x6D, 0x0B, 0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xBA, 0x20, 0xC0, 0x1A, 0x4F, 0x0B, +0xCA, 0x20, 0xDC, 0x18, 0xD2, 0x21, 0x0D, 0x00, +0x08, 0x51, 0x00, 0x88, 0x4F, 0x1F, 0xDB, 0x18, +0xD2, 0x21, 0x0D, 0x00, 0x08, 0x51, 0x00, 0x88, +0x3D, 0x1F, 0x0B, 0x51, 0x01, 0x88, 0x3D, 0x1F, +0xAB, 0x00, 0x0A, 0x0D, 0x29, 0x0B, 0xAC, 0x00, +0x0A, 0x0D, 0x24, 0x0B, 0xB1, 0x21, 0xC1, 0x21, +0xAB, 0x00, 0x0A, 0x0D, 0x2A, 0x0B, 0xAC, 0x00, +0x0A, 0x0D, 0x25, 0x0B, 0xB1, 0x39, 0xC1, 0x39, +0x0F, 0x98, 0x25, 0x25, 0x0A, 0x0D, 0x36, 0x0B, +0x00, 0x03, 0xB8, 0x00, 0xA0, 0x03, 0x15, 0x0B, +0xD0, 0x03, 0x32, 0x0B, 0xAD, 0x50, 0x10, 0x80, +0x00, 0x19, 0xA0, 0x18, 0xD0, 0x03, 0x36, 0x0B, +0xDA, 0x48, 0x2D, 0x83, 0xA0, 0x03, 0x32, 0x0B, +0xD0, 0x03, 0x15, 0x0B, 0xDA, 0xC0, 0x0D, 0x0D, +0x15, 0x0B, 0x0B, 0x00, 0xC0, 0x08, 0xB1, 0x21, +0xC1, 0x21, 0x0B, 0x00, 0xC0, 0x08, 0xB1, 0x21, +0xC1, 0x21, 0xAB, 0x00, 0xA0, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0x44, 0x1D, 0xA0, 0x03, 0x26, 0x0B, +0xA0, 0x62, 0xFF, 0x00, 0x9C, 0x00, 0x90, 0x62, +0xFF, 0x00, 0xA9, 0x38, 0xAF, 0x51, 0x10, 0x80, +0xA0, 0x31, 0x90, 0x03, 0xB9, 0x00, 0xA9, 0x48, +0xAB, 0x80, 0xA0, 0x03, 0x26, 0x0B, 0xA0, 0x62, +0x00, 0xFF, 0x9C, 0x00, 0x90, 0x62, 0xFF, 0x00, +0xA9, 0x68, 0xCA, 0x08, 0xCF, 0x83, 0xA0, 0x03, +0x26, 0x0B, 0xAF, 0xC1, 0xCA, 0x08, 0x7F, 0x83, +0xB2, 0x21, 0xC2, 0x21, 0xAB, 0x00, 0xA0, 0x62, +0xFF, 0x00, 0x0F, 0x98, 0x44, 0x1D, 0xA0, 0x03, +0x26, 0x0B, 0xAA, 0xC9, 0xA8, 0xC1, 0x0A, 0x0D, +0x26, 0x0B, 0x4F, 0x85, 0xB2, 0x21, 0xC2, 0x21, +0x0C, 0x00, 0x0D, 0x51, 0x20, 0x80, 0xC0, 0x0B, +0x2F, 0x82, 0xA0, 0x19, 0xAB, 0xC1, 0xCA, 0x08, +0xA0, 0x03, 0x32, 0x0B, 0xD0, 0x03, 0x15, 0x0B, +0xDA, 0xC8, 0x0D, 0x0D, 0x15, 0x0B, 0x7F, 0x81, +0xDB, 0x18, 0xD2, 0x21, 0x0D, 0x00, 0x08, 0x51, +0x31, 0x80, 0xC2, 0x21, 0xC0, 0x0B, 0xFF, 0x80, +0x0B, 0x00, 0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, +0x0B, 0x00, 0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, +0x0B, 0x00, 0x00, 0x62, 0xFF, 0x00, 0x0F, 0xC1, +0x08, 0xC1, 0x09, 0xC1, 0xC0, 0x08, 0x00, 0x03, +0x32, 0x0B, 0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, +0x32, 0x0B, 0x10, 0x03, 0x0A, 0x00, 0x01, 0x48, +0x01, 0x88, 0xBE, 0x1E, 0xFF, 0xA0, 0xFF, 0xFF, +0x30, 0x19, 0x40, 0x19, 0xA0, 0x19, 0x60, 0x1A, +0x19, 0x0B, 0x50, 0x1A, 0xB2, 0x03, 0xB0, 0x1A, +0xCC, 0x0B, 0xBA, 0x20, 0x9B, 0x00, 0xC0, 0x03, +0x56, 0x00, 0xD0, 0x03, 0x55, 0x00, 0x09, 0x0D, +0x18, 0xF9, 0x00, 0x0E, 0x19, 0xF9, 0x0C, 0x0D, +0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0x20, 0x03, +0x1A, 0xF9, 0x10, 0x03, 0x18, 0xF9, 0xFF, 0xFF, +0xC1, 0x39, 0xD1, 0x39, 0x00, 0x19, 0x10, 0x49, +0x11, 0x80, 0x00, 0xC1, 0x1D, 0x48, 0x11, 0x80, +0x01, 0xC1, 0x20, 0x49, 0x11, 0x80, 0x02, 0xC1, +0x2C, 0x48, 0x11, 0x80, 0x03, 0xC1, 0xC1, 0x21, +0xD1, 0x21, 0x00, 0x49, 0x41, 0x80, 0xB0, 0x1A, +0xEF, 0x01, 0x87, 0x19, 0xFF, 0x82, 0x01, 0x49, +0x41, 0x80, 0xB0, 0x1A, 0xE8, 0x01, 0x83, 0x19, +0x9F, 0x82, 0x02, 0x49, 0x41, 0x80, 0xB0, 0x1A, +0x2F, 0x00, 0x83, 0x19, 0x3F, 0x82, 0x04, 0x49, +0x41, 0x80, 0xB0, 0x1A, 0xA6, 0x01, 0x83, 0x19, +0xDF, 0x81, 0x08, 0x49, 0x41, 0x80, 0xB0, 0x1A, +0xCB, 0x00, 0x83, 0x19, 0x7F, 0x81, 0x05, 0x49, +0x41, 0x80, 0xB0, 0x1A, 0xA0, 0x01, 0x82, 0x19, +0x1F, 0x81, 0x09, 0x49, 0x41, 0x80, 0xB0, 0x1A, +0xC8, 0x00, 0x82, 0x19, 0xBF, 0x80, 0x06, 0x49, +0x41, 0x80, 0xB0, 0x1A, 0x26, 0x00, 0x82, 0x19, +0x5F, 0x80, 0x0A, 0x49, 0x31, 0x80, 0xBB, 0x19, +0x82, 0x19, 0x0F, 0x80, 0x95, 0x20, 0x39, 0x00, +0xFF, 0xFF, 0x10, 0x1A, 0x05, 0x04, 0x03, 0x18, +0x18, 0x79, 0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, +0x25, 0x15, 0x20, 0x1A, 0x05, 0x04, 0x20, 0x62, +0xFF, 0x00, 0x0F, 0x98, 0x66, 0x15, 0x30, 0x18, +0x9C, 0x38, 0x91, 0x39, 0x49, 0x00, 0x64, 0x08, +0x61, 0x21, 0x91, 0x21, 0x49, 0x00, 0x64, 0x08, +0x61, 0x21, 0x91, 0x21, 0x49, 0x00, 0x64, 0x08, +0x61, 0x21, 0x9C, 0x20, 0x92, 0x39, 0x49, 0x00, +0x64, 0x08, 0x61, 0x21, 0x91, 0x21, 0x49, 0x00, +0x64, 0x08, 0x61, 0x21, 0x91, 0x21, 0x49, 0x00, +0x64, 0x08, 0x61, 0x21, 0x9C, 0x20, 0x92, 0x39, +0x49, 0x00, 0x64, 0x08, 0x61, 0x21, 0x91, 0x21, +0x49, 0x00, 0x64, 0x08, 0x61, 0x21, 0x91, 0x21, +0x49, 0x00, 0x64, 0x08, 0x60, 0x1A, 0x19, 0x0B, +0x70, 0x19, 0x20, 0x19, 0xB7, 0x50, 0x40, 0x80, +0x46, 0x00, 0x43, 0x48, 0x1C, 0x80, 0x21, 0x21, +0x61, 0x21, 0x71, 0x21, 0x79, 0x49, 0x61, 0x87, +0x28, 0x48, 0xCD, 0x80, 0x0F, 0x98, 0xB3, 0x1C, +0xA1, 0x39, 0x10, 0x03, 0xAD, 0x0A, 0xFF, 0xFF, +0x11, 0x39, 0x01, 0x0D, 0xAD, 0x0A, 0x10, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0xA1, 0x21, 0xB0, 0x03, +0xAD, 0x0A, 0xAB, 0x48, 0x0C, 0x88, 0x76, 0x1F, +0xFF, 0xA0, 0x20, 0x03, 0x39, 0x00, 0x20, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0xA0, 0x19, 0xB0, 0x19, +0xC0, 0x1A, 0x4F, 0x0B, 0xC2, 0x21, 0x30, 0x03, +0x0A, 0x00, 0x0C, 0x00, 0x08, 0x51, 0x50, 0x80, +0x00, 0x62, 0xFF, 0x00, 0x0B, 0x48, 0x1C, 0x80, +0xB0, 0x18, 0xC3, 0x21, 0xA1, 0x21, 0xA3, 0x48, +0x41, 0x87, 0x0B, 0x0D, 0xF3, 0x0A, 0xA0, 0x19, +0x00, 0x03, 0xF3, 0x0A, 0x10, 0x03, 0x39, 0x00, +0x21, 0x18, 0x18, 0x79, 0x10, 0x49, 0x60, 0x80, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, 0x39, 0x00, +0x20, 0x62, 0xFF, 0x00, 0x0F, 0x98, 0x66, 0x15, +0x00, 0x0D, 0xF3, 0x0A, 0x40, 0x03, 0xF3, 0x0A, +0xC0, 0x1A, 0x4F, 0x0B, 0xC2, 0x21, 0xD0, 0x1A, +0x77, 0x00, 0xD2, 0x21, 0x30, 0x03, 0x0A, 0x00, +0x0C, 0x00, 0x10, 0x18, 0x18, 0x51, 0x41, 0x80, +0x1D, 0xC9, 0x1A, 0xC9, 0xC1, 0x08, 0x0F, 0x82, +0x00, 0x62, 0xFF, 0x00, 0x04, 0x48, 0x7B, 0x80, +0x0D, 0x00, 0x08, 0x51, 0x61, 0x80, 0x1D, 0xC1, +0x1A, 0xC9, 0xC1, 0x08, 0x5F, 0x81, 0x1D, 0x51, +0x91, 0x80, 0x1D, 0xC9, 0xC1, 0x08, 0x00, 0x03, +0xAE, 0x0A, 0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, +0xAE, 0x0A, 0xAF, 0x80, 0x1D, 0xC9, 0x1A, 0xC9, +0x19, 0xC1, 0xC1, 0x08, 0x00, 0x03, 0xAE, 0x0A, +0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, 0xAE, 0x0A, +0x40, 0x03, 0xF3, 0x0A, 0xFF, 0xFF, 0xC3, 0x21, +0xD3, 0x21, 0xA1, 0x21, 0xA3, 0x48, 0x01, 0x85, +0xFF, 0xA0, 0x00, 0x03, 0xBA, 0x0A, 0x00, 0x49, +0xA0, 0x80, 0x80, 0x19, 0x00, 0x03, 0xA2, 0x0A, +0x10, 0x03, 0x49, 0x00, 0x01, 0x48, 0xFD, 0xA0, +0xFF, 0xFF, 0x81, 0x19, 0xFF, 0xA0, 0x81, 0x19, +0x90, 0x03, 0xA2, 0x0A, 0x00, 0x03, 0x4A, 0x00, +0x90, 0x48, 0xFB, 0xA0, 0xFF, 0xFF, 0x80, 0x19, +0x90, 0x19, 0x60, 0x19, 0xB0, 0x03, 0x46, 0x02, +0xC0, 0x1A, 0x72, 0x02, 0x70, 0x03, 0x50, 0x02, +0x7F, 0x51, 0xF1, 0xA0, 0xFF, 0xFF, 0x07, 0x18, +0x10, 0x03, 0x4B, 0x00, 0x10, 0x49, 0x21, 0x80, +0x80, 0x19, 0xFF, 0xA0, 0x21, 0x18, 0x18, 0x79, +0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, 0x25, 0x15, +0x20, 0x03, 0x4B, 0x00, 0x20, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0x66, 0x15, 0x70, 0x18, 0x70, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0x70, 0x31, 0x00, 0x03, +0x51, 0x02, 0x07, 0x48, 0xFA, 0xA0, 0xFF, 0xFF, +0xA0, 0x03, 0xA3, 0x0A, 0x50, 0x03, 0x4D, 0x00, +0xA5, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, 0x81, 0x19, +0xFF, 0xA0, 0x00, 0x03, 0x2F, 0x0B, 0x10, 0x03, +0x30, 0x0B, 0x40, 0x03, 0x55, 0x00, 0x50, 0x03, +0x56, 0x00, 0xFF, 0xFF, 0x41, 0x39, 0x51, 0x39, +0x30, 0x19, 0x20, 0x19, 0x60, 0x03, 0xE5, 0x00, +0x6F, 0x51, 0x30, 0x81, 0x60, 0x03, 0xA8, 0x00, +0x60, 0x49, 0x80, 0x80, 0x31, 0x19, 0x60, 0x03, +0xA9, 0x00, 0x60, 0x49, 0xA0, 0x80, 0x30, 0x19, +0x51, 0x39, 0x7F, 0x80, 0x21, 0x19, 0x60, 0x03, +0xA9, 0x00, 0x60, 0x49, 0x20, 0x80, 0x20, 0x19, +0x41, 0x39, 0x02, 0x48, 0xF0, 0x80, 0x04, 0x48, +0xA0, 0x81, 0x13, 0x48, 0x31, 0x80, 0x03, 0x0E, +0x09, 0x0B, 0xFF, 0xA0, 0x15, 0x48, 0x20, 0x80, +0x00, 0x0E, 0x09, 0x0B, 0x21, 0x80, 0x04, 0x0E, +0x09, 0x0B, 0xFF, 0xA0, 0x13, 0x48, 0x31, 0x80, +0x05, 0x0E, 0x09, 0x0B, 0xFF, 0xA0, 0x15, 0x48, +0x20, 0x80, 0x01, 0x0E, 0x09, 0x0B, 0x21, 0x80, +0x06, 0x0E, 0x09, 0x0B, 0xFF, 0xA0, 0x13, 0x48, +0x31, 0x80, 0x07, 0x0E, 0x09, 0x0B, 0xFF, 0xA0, +0x15, 0x48, 0x20, 0x80, 0x02, 0x0E, 0x09, 0x0B, +0x21, 0x80, 0x08, 0x0E, 0x09, 0x0B, 0xFF, 0xA0, +0x00, 0x0E, 0x49, 0x02, 0xA0, 0x03, 0x49, 0x02, +0xB0, 0x1A, 0xCC, 0x0B, 0xBA, 0x20, 0x9B, 0x00, +0x0A, 0x0D, 0x07, 0x0B, 0x09, 0x0D, 0x08, 0x0B, +0xA0, 0x03, 0x56, 0x00, 0x09, 0x0D, 0x18, 0xF9, +0x00, 0x0E, 0x19, 0xF9, 0x0A, 0x0D, 0x1A, 0xF9, +0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, 0xA0, 0x03, +0x1A, 0xF9, 0x0A, 0x0D, 0x30, 0x0B, 0xA0, 0x03, +0x18, 0xF9, 0x0A, 0x0D, 0x2F, 0x0B, 0x60, 0x03, +0x0C, 0x00, 0x69, 0x51, 0xE0, 0x81, 0x60, 0x03, +0x98, 0x0A, 0x61, 0x49, 0xAD, 0x81, 0x60, 0x03, +0xAF, 0x0A, 0x61, 0x49, 0x6D, 0x81, 0x60, 0x1A, +0x32, 0x06, 0x69, 0x20, 0x26, 0x00, 0x60, 0x1A, +0x75, 0x0D, 0x00, 0x03, 0x30, 0x0B, 0xFF, 0xFF, +0x60, 0x20, 0x16, 0x00, 0x21, 0x48, 0x2C, 0x82, +0x60, 0x1A, 0x85, 0x0D, 0x00, 0x03, 0x2F, 0x0B, +0xFF, 0xFF, 0x60, 0x20, 0x16, 0x00, 0x21, 0x48, +0x9C, 0x81, 0xA0, 0x03, 0x56, 0x00, 0xFF, 0xFF, +0x9A, 0x38, 0x91, 0x39, 0x09, 0x0D, 0x36, 0x0B, +0x50, 0x1A, 0xBC, 0x0A, 0x60, 0x1A, 0x32, 0x06, +0x0F, 0x98, 0x9A, 0x23, 0x0F, 0x98, 0xE0, 0x20, +0xA0, 0x03, 0x09, 0x0B, 0xA0, 0x49, 0x31, 0x80, +0x0F, 0x98, 0x99, 0x2D, 0xFF, 0x81, 0x0F, 0x98, +0x97, 0x2E, 0xCF, 0x81, 0xA0, 0x03, 0x49, 0x02, +0xFF, 0xFF, 0x0F, 0x98, 0xB3, 0x1C, 0xD0, 0x03, +0xAD, 0x0A, 0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x0D, +0xAD, 0x0A, 0xD0, 0x03, 0xAE, 0x0A, 0xFF, 0xFF, +0xD1, 0x39, 0x0D, 0x0D, 0xAE, 0x0A, 0xD0, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x49, 0x02, +0xFF, 0xFF, 0xA1, 0x39, 0x0A, 0x0D, 0x49, 0x02, +0x0F, 0x88, 0x3D, 0x23, 0xD0, 0x03, 0x2F, 0x0B, +0xFF, 0xFF, 0xD7, 0x7B, 0xC0, 0x03, 0xF7, 0x0A, +0xFF, 0xFF, 0xDC, 0x20, 0xD0, 0x22, 0x40, 0x00, +0x0D, 0x0D, 0xF7, 0x0A, 0xD0, 0x03, 0x30, 0x0B, +0xFF, 0xFF, 0xD7, 0x7B, 0xC0, 0x03, 0xF8, 0x0A, +0xFF, 0xFF, 0xDC, 0x20, 0xD0, 0x22, 0x40, 0x00, +0x0D, 0x0D, 0xF8, 0x0A, 0xC0, 0x03, 0xF7, 0x0A, +0xC0, 0x49, 0x3B, 0x80, 0x00, 0x0E, 0xF7, 0x0A, +0x6F, 0x80, 0xB0, 0x03, 0xF5, 0x0A, 0xCB, 0x48, +0x2C, 0x80, 0x0B, 0x0D, 0xF7, 0x0A, 0xC0, 0x03, +0xF8, 0x0A, 0xC0, 0x49, 0x3B, 0x80, 0x00, 0x0E, +0xF8, 0x0A, 0x6F, 0x80, 0xB0, 0x03, 0xF6, 0x0A, +0xCB, 0x48, 0x2C, 0x80, 0x0B, 0x0D, 0xF8, 0x0A, +0xA0, 0x03, 0xF9, 0x0A, 0x90, 0x03, 0x2A, 0x00, +0x0A, 0x0D, 0x18, 0xF9, 0x00, 0x0E, 0x19, 0xF9, +0x09, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, +0xFF, 0xFF, 0xA0, 0x03, 0x18, 0xF9, 0xA0, 0x4A, +0xFF, 0x00, 0x2C, 0x80, 0xA0, 0x1A, 0xFF, 0x00, +0xA5, 0x49, 0x1B, 0x80, 0xA5, 0x19, 0x0A, 0x0D, +0xF9, 0x0A, 0xA0, 0x03, 0xF7, 0x0A, 0xB0, 0x03, +0xBF, 0x00, 0xAB, 0x48, 0x2B, 0x80, 0x0B, 0x0D, +0xF7, 0x0A, 0xA0, 0x03, 0xF7, 0x0A, 0x00, 0x03, +0xC0, 0x00, 0xB0, 0x03, 0xF5, 0x0A, 0xFF, 0xFF, +0xB0, 0x38, 0xAB, 0x48, 0x2D, 0x80, 0x0B, 0x0D, +0xF7, 0x0A, 0xA0, 0x03, 0xF8, 0x0A, 0xB0, 0x03, +0xC1, 0x00, 0xAB, 0x48, 0x2B, 0x80, 0x0B, 0x0D, +0xF8, 0x0A, 0xA0, 0x03, 0xF8, 0x0A, 0x00, 0x03, +0xC2, 0x00, 0xB0, 0x03, 0xF6, 0x0A, 0xFF, 0xFF, +0xB0, 0x38, 0xAB, 0x48, 0x2D, 0x80, 0x0B, 0x0D, +0xF8, 0x0A, 0xA0, 0x03, 0xF7, 0x0A, 0xB0, 0x03, +0xBF, 0x00, 0xFF, 0xFF, 0xAB, 0x38, 0x0A, 0x0D, +0xF7, 0x0A, 0xA0, 0x03, 0xF8, 0x0A, 0xB0, 0x03, +0xC1, 0x00, 0xFF, 0xFF, 0xAB, 0x38, 0x0A, 0x0D, +0xF8, 0x0A, 0x80, 0x03, 0xB5, 0x00, 0x90, 0x03, +0xB6, 0x00, 0x00, 0x03, 0xB7, 0x00, 0x02, 0x51, +0x40, 0x80, 0x90, 0x03, 0xB5, 0x00, 0x80, 0x03, +0xB6, 0x00, 0xC0, 0x03, 0xF8, 0x0A, 0xD0, 0x03, +0xF6, 0x0A, 0x00, 0x03, 0xC1, 0x00, 0xFF, 0xFF, +0xD0, 0x38, 0x00, 0x03, 0xC2, 0x00, 0xFF, 0xFF, +0xD0, 0x38, 0x00, 0x03, 0xA8, 0x00, 0x00, 0x49, +0xC0, 0x80, 0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, +0x80, 0x80, 0xD0, 0x3A, 0x80, 0x00, 0x10, 0x03, +0xA9, 0x00, 0x10, 0x49, 0x21, 0x80, 0xC0, 0x3A, +0x80, 0x00, 0xC0, 0x49, 0x1B, 0x80, 0xC0, 0x19, +0xCD, 0x48, 0x1D, 0x80, 0xCD, 0x18, 0x08, 0x0D, +0x14, 0xF9, 0x00, 0x0E, 0x15, 0xF9, 0x0C, 0x0D, +0x16, 0xF9, 0x00, 0x0E, 0x17, 0xF9, 0xB0, 0x03, +0x14, 0xF9, 0xC0, 0x03, 0x15, 0xF9, 0x0B, 0x0D, +0x18, 0xF9, 0x0C, 0x0D, 0x19, 0xF9, 0x0D, 0x0D, +0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, +0xA0, 0x03, 0x18, 0xF9, 0x0A, 0x0D, 0xF8, 0x0A, +0xC0, 0x03, 0xF7, 0x0A, 0xD0, 0x03, 0xF5, 0x0A, +0x00, 0x03, 0xBF, 0x00, 0xFF, 0xFF, 0xD0, 0x38, +0x00, 0x03, 0xC0, 0x00, 0xFF, 0xFF, 0xD0, 0x38, +0x00, 0x03, 0xA8, 0x00, 0x01, 0x49, 0xC0, 0x80, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0x80, 0x80, +0xD0, 0x3A, 0x80, 0x00, 0x10, 0x03, 0xA9, 0x00, +0x10, 0x49, 0x21, 0x80, 0xC0, 0x3A, 0x80, 0x00, +0xC0, 0x49, 0x1B, 0x80, 0xC0, 0x19, 0xCD, 0x48, +0x1D, 0x80, 0xCD, 0x18, 0x09, 0x0D, 0x14, 0xF9, +0x00, 0x0E, 0x15, 0xF9, 0x0C, 0x0D, 0x16, 0xF9, +0x00, 0x0E, 0x17, 0xF9, 0xB0, 0x03, 0x14, 0xF9, +0xC0, 0x03, 0x15, 0xF9, 0x0B, 0x0D, 0x18, 0xF9, +0x0C, 0x0D, 0x19, 0xF9, 0x0D, 0x0D, 0x1A, 0xF9, +0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, 0xA0, 0x03, +0x18, 0xF9, 0x0A, 0x0D, 0xF7, 0x0A, 0x00, 0x03, +0xB7, 0x00, 0x02, 0x51, 0x80, 0x80, 0x00, 0x03, +0xF8, 0x0A, 0x10, 0x03, 0xF7, 0x0A, 0x00, 0x0D, +0xF7, 0x0A, 0x01, 0x0D, 0xF8, 0x0A, 0x00, 0x03, +0xB7, 0x00, 0x01, 0x51, 0xB0, 0x80, 0xB0, 0x03, +0xB6, 0x00, 0xA0, 0x03, 0xF7, 0x0A, 0xFF, 0xFF, +0xBA, 0x38, 0xB0, 0x49, 0x1B, 0x80, 0xB0, 0x19, +0x0B, 0x0D, 0xF7, 0x0A, 0x00, 0x03, 0xB7, 0x00, +0x00, 0x51, 0xB0, 0x80, 0xB0, 0x03, 0xB5, 0x00, +0xA0, 0x03, 0xF8, 0x0A, 0xFF, 0xFF, 0xBA, 0x38, +0xB0, 0x49, 0x1B, 0x80, 0xB0, 0x19, 0x0B, 0x0D, +0xF8, 0x0A, 0xD0, 0x03, 0xB5, 0x00, 0xA0, 0x03, +0xF8, 0x0A, 0xAD, 0x48, 0x2D, 0x80, 0x0D, 0x0D, +0xF8, 0x0A, 0xA0, 0x49, 0x2B, 0x80, 0x00, 0x0E, +0xF8, 0x0A, 0xD0, 0x03, 0xB6, 0x00, 0xA0, 0x03, +0xF7, 0x0A, 0xAD, 0x48, 0x2D, 0x80, 0x0D, 0x0D, +0xF7, 0x0A, 0xA0, 0x49, 0x2B, 0x80, 0x00, 0x0E, +0xF7, 0x0A, 0x00, 0x1A, 0x40, 0x00, 0x10, 0x1A, +0xA9, 0x01, 0x20, 0x03, 0xF8, 0x0A, 0x30, 0x03, +0xF7, 0x0A, 0xA0, 0x03, 0x97, 0x00, 0x41, 0x00, +0x84, 0x18, 0x54, 0x18, 0x4A, 0x20, 0xB0, 0x03, +0xB5, 0x00, 0x4B, 0x48, 0x0D, 0xB0, 0x4B, 0x18, +0x5A, 0x38, 0x50, 0x49, 0x0B, 0xB0, 0x50, 0x19, +0x11, 0x21, 0x61, 0x00, 0x96, 0x18, 0x76, 0x18, +0x6A, 0x20, 0xB0, 0x03, 0xB6, 0x00, 0x6B, 0x48, +0x0D, 0xB0, 0x6B, 0x18, 0x7A, 0x38, 0x70, 0x49, +0x0B, 0xB0, 0x70, 0x19, 0x11, 0x21, 0x24, 0x48, +0x3A, 0x81, 0x25, 0x48, 0x1C, 0x81, 0x36, 0x48, +0xFA, 0x80, 0x37, 0x48, 0xDC, 0x80, 0xC0, 0x03, +0xF9, 0x0A, 0xD0, 0x03, 0x98, 0x00, 0xCD, 0x48, +0x0A, 0xB0, 0x0F, 0x98, 0x49, 0x23, 0x02, 0x0D, +0xF8, 0x0A, 0x03, 0x0D, 0xF7, 0x0A, 0x2F, 0x80, +0x01, 0x39, 0xD1, 0x84, 0xA0, 0x03, 0x49, 0x02, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xB0, 0x1A, +0x8E, 0x0B, 0xA0, 0x1E, 0xBA, 0x20, 0xA0, 0x03, +0xF8, 0x0A, 0xBA, 0x08, 0xB1, 0x21, 0xA0, 0x03, +0xF7, 0x0A, 0xBA, 0x08, 0xB1, 0x21, 0xA0, 0x03, +0xF9, 0x0A, 0xBA, 0x08, 0xA0, 0x03, 0x49, 0x02, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x49, 0x02, +0xB0, 0x03, 0xAD, 0x0A, 0xAB, 0x48, 0x01, 0x88, +0x31, 0x21, 0xFF, 0xA0, 0x40, 0x03, 0x96, 0x00, +0x50, 0x1A, 0x64, 0x00, 0x82, 0x38, 0xC8, 0x18, +0xCF, 0x51, 0x20, 0x80, 0xFF, 0xFF, 0xC0, 0x31, +0xC2, 0x49, 0xED, 0x81, 0x08, 0x0D, 0x10, 0xF9, +0x8F, 0x51, 0xA0, 0x19, 0x10, 0x80, 0xA1, 0x39, +0x0A, 0x0D, 0x11, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x04, 0x0D, 0x12, 0xF9, 0x80, 0x03, 0x10, 0xF9, +0x08, 0x0D, 0x18, 0xF9, 0x8F, 0x51, 0xA0, 0x19, +0x10, 0x80, 0xA1, 0x39, 0x0A, 0x0D, 0x19, 0xF9, +0x00, 0x0E, 0x1B, 0xF9, 0x05, 0x0D, 0x1A, 0xF9, +0x80, 0x03, 0x18, 0xF9, 0xFF, 0xFF, 0x28, 0x20, +0x93, 0x38, 0xD9, 0x18, 0xDF, 0x51, 0x20, 0x80, +0xFF, 0xFF, 0xD0, 0x31, 0xD2, 0x49, 0xED, 0x81, +0x09, 0x0D, 0x10, 0xF9, 0x9F, 0x51, 0xA0, 0x19, +0x10, 0x80, 0xA1, 0x39, 0x0A, 0x0D, 0x11, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0x04, 0x0D, 0x12, 0xF9, +0x90, 0x03, 0x10, 0xF9, 0x09, 0x0D, 0x18, 0xF9, +0x9F, 0x51, 0xA0, 0x19, 0x10, 0x80, 0xA1, 0x39, +0x0A, 0x0D, 0x19, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, +0x05, 0x0D, 0x1A, 0xF9, 0x90, 0x03, 0x18, 0xF9, +0xFF, 0xFF, 0x39, 0x20, 0xFF, 0xA0, 0x00, 0x0E, +0x32, 0x0B, 0x00, 0x0E, 0x33, 0x0B, 0xA0, 0x03, +0x32, 0x0B, 0xB0, 0x03, 0x33, 0x0B, 0xD3, 0x19, +0xDA, 0x58, 0xFF, 0xFF, 0x40, 0x03, 0x56, 0x00, +0xD0, 0x1E, 0xDB, 0x20, 0xA0, 0x03, 0x32, 0x0B, +0xB0, 0x03, 0x33, 0x0B, 0xFF, 0xFF, 0x4A, 0x58, +0xFF, 0xFF, 0xA0, 0x03, 0x36, 0x0B, 0x40, 0x1E, +0x4B, 0x20, 0x4A, 0x20, 0xB5, 0x18, 0xBD, 0x20, +0xC6, 0x18, 0xC4, 0x20, 0xAC, 0x00, 0xA0, 0x49, +0x1B, 0x80, 0xA0, 0x19, 0xBA, 0x08, 0xA0, 0x03, +0x33, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x33, 0x0B, 0xA3, 0x49, 0x81, 0x85, 0xA0, 0x03, +0x32, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x32, 0x0B, 0xA3, 0x49, 0xE1, 0x84, 0xFF, 0xA0, +0xB0, 0x1A, 0x77, 0x00, 0xC0, 0x1A, 0x4F, 0x0B, +0x00, 0x03, 0x05, 0x00, 0x00, 0x49, 0x00, 0x88, +0x1D, 0x24, 0x00, 0x0E, 0x32, 0x0B, 0x00, 0x0E, +0x33, 0x0B, 0xD0, 0x19, 0x9C, 0x18, 0x8B, 0x18, +0xA9, 0x00, 0x8A, 0x08, 0x91, 0x21, 0x81, 0x21, +0xA9, 0x00, 0x8A, 0x08, 0x91, 0x21, 0x81, 0x21, +0x59, 0x00, 0x48, 0x00, 0x80, 0x0B, 0xA9, 0x00, +0xA8, 0x51, 0x00, 0x81, 0xAD, 0x51, 0x81, 0x80, +0x85, 0x08, 0x00, 0x03, 0x33, 0x0B, 0xFF, 0xFF, +0x01, 0x21, 0x00, 0x0D, 0x33, 0x0B, 0x9F, 0x80, +0x48, 0x51, 0xC0, 0x80, 0x50, 0x19, 0x5B, 0xC1, +0x85, 0x08, 0x3F, 0x80, 0xAB, 0x51, 0x60, 0x80, +0x85, 0x08, 0xA0, 0x03, 0x32, 0x0B, 0xAD, 0xC0, +0x0A, 0x0D, 0x32, 0x0B, 0xB3, 0x21, 0xC3, 0x21, +0xD1, 0x21, 0xA0, 0x03, 0x0A, 0x00, 0xDA, 0x48, +0x11, 0x85, 0xA0, 0x03, 0x32, 0x0B, 0x0A, 0x0D, +0x76, 0x00, 0xB0, 0x03, 0x8B, 0x0B, 0x0B, 0x0D, +0x75, 0x00, 0xA0, 0x03, 0x33, 0x0B, 0x0A, 0x0D, +0x99, 0x0A, 0x00, 0x03, 0xFA, 0x0A, 0x00, 0x0D, +0x95, 0x00, 0xFF, 0xA0, 0xD0, 0x03, 0x0A, 0x00, +0x00, 0x0E, 0x32, 0x0B, 0x9C, 0x18, 0x92, 0x21, +0x89, 0x00, 0x9C, 0x18, 0xA9, 0x00, 0xBA, 0x08, +0x91, 0x21, 0xB1, 0x21, 0xA9, 0x00, 0xBA, 0x08, +0x91, 0x21, 0xB1, 0x21, 0x4B, 0x00, 0x8D, 0x51, +0x80, 0x80, 0xB0, 0x0B, 0x48, 0x51, 0x30, 0x80, +0x40, 0x19, 0x4B, 0xC1, 0xB4, 0x08, 0xB1, 0x21, +0xBF, 0x80, 0x88, 0x51, 0x60, 0x80, 0x00, 0x03, +0x32, 0x0B, 0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, +0x32, 0x0B, 0xA9, 0x00, 0xBA, 0x08, 0xB1, 0x21, +0xC3, 0x21, 0xD1, 0x39, 0xB1, 0x85, 0xB0, 0x03, +0x8B, 0x0B, 0x0B, 0x0D, 0x75, 0x00, 0xA0, 0x03, +0x32, 0x0B, 0x0A, 0x0D, 0x99, 0x0A, 0xB0, 0x03, +0x8D, 0x0B, 0xFF, 0xFF, 0xB8, 0x7B, 0xAB, 0x68, +0x0A, 0x0D, 0x76, 0x00, 0x00, 0x03, 0xFA, 0x0A, +0x00, 0x0D, 0x95, 0x00, 0xFF, 0xA0, 0xD0, 0x1A, +0x4F, 0x0B, 0xD2, 0x21, 0xB0, 0x1A, 0x6D, 0x0B, +0xB2, 0x21, 0x40, 0x1A, 0xDD, 0x0B, 0x50, 0x1A, +0xED, 0x0B, 0xC0, 0x19, 0x10, 0x19, 0x3A, 0x19, +0xD0, 0x0B, 0xB0, 0x0B, 0x40, 0x0B, 0x50, 0x0B, +0x41, 0x21, 0x51, 0x21, 0xD3, 0x21, 0xB3, 0x21, +0xC1, 0x21, 0xC3, 0x48, 0x51, 0x87, 0x90, 0x1A, +0x99, 0x0D, 0x92, 0x21, 0xA0, 0x1A, 0xC6, 0x0D, +0x80, 0x1A, 0xD5, 0x0D, 0x70, 0x1A, 0xE4, 0x0D, +0xC0, 0x19, 0x10, 0x19, 0x3F, 0x19, 0x90, 0x0B, +0xA0, 0x0B, 0x80, 0x0B, 0x70, 0x0B, 0x71, 0x21, +0x81, 0x21, 0xA1, 0x21, 0x93, 0x21, 0xC1, 0x21, +0xC3, 0x48, 0x51, 0x87, 0x00, 0x0E, 0x15, 0x0B, +0x00, 0x0E, 0x9A, 0x0A, 0xFF, 0xA0, 0x56, 0x18, +0x20, 0x1A, 0xDD, 0x0B, 0x26, 0x20, 0x30, 0x1A, +0xED, 0x0B, 0x36, 0x20, 0x00, 0x1A, 0xFD, 0x0B, +0x10, 0x1A, 0x9D, 0x0C, 0x64, 0x7B, 0x06, 0x20, +0x16, 0x20, 0x42, 0x00, 0xFF, 0xFF, 0x04, 0x20, +0x14, 0x20, 0x07, 0x08, 0x18, 0x08, 0x41, 0x21, +0x40, 0x4A, 0x10, 0x00, 0x1C, 0x80, 0x40, 0x19, +0x24, 0x08, 0x80, 0x19, 0x40, 0x1A, 0x58, 0x02, +0x45, 0x20, 0xA0, 0x03, 0x36, 0x0B, 0x00, 0x03, +0x6C, 0x02, 0xA0, 0x48, 0x4D, 0x80, 0x00, 0x03, +0x6D, 0x02, 0x40, 0x08, 0x81, 0x19, 0x74, 0x00, +0xFF, 0xFF, 0x71, 0x39, 0x1C, 0x80, 0x47, 0x08, +0xA1, 0x21, 0x00, 0x03, 0x6E, 0x02, 0xFF, 0xFF, +0xA0, 0x78, 0x40, 0x03, 0xF3, 0x0D, 0x40, 0x62, +0xFF, 0x00, 0x41, 0x21, 0x4A, 0x38, 0x1A, 0x80, +0x41, 0x19, 0x10, 0x1A, 0x62, 0x02, 0x15, 0x20, +0xA1, 0x00, 0x4A, 0x48, 0x3A, 0x80, 0x50, 0x80, +0xA1, 0x39, 0x3F, 0x80, 0x81, 0x49, 0x10, 0x80, +0xA1, 0x21, 0x00, 0x03, 0xF3, 0x0D, 0xFF, 0xFF, +0x08, 0x79, 0x00, 0x49, 0x11, 0x80, 0x01, 0x19, +0xA0, 0x48, 0x1B, 0x80, 0xA0, 0x18, 0x1A, 0x08, +0x43, 0x00, 0xFF, 0xFF, 0x41, 0x21, 0x4A, 0x48, +0x1C, 0x80, 0x4A, 0x18, 0x34, 0x08, 0x00, 0x1A, +0xFD, 0x0B, 0x10, 0x1A, 0x9D, 0x0C, 0x06, 0x20, +0x16, 0x20, 0xA0, 0x19, 0x70, 0x19, 0x80, 0x19, +0x34, 0x18, 0x42, 0x00, 0xFF, 0xFF, 0x41, 0x39, +0x40, 0x49, 0x2B, 0x80, 0x40, 0x22, 0x10, 0x00, +0x04, 0x20, 0x14, 0x20, 0x20, 0x00, 0xFF, 0xFF, +0x72, 0x20, 0x21, 0x00, 0xFF, 0xFF, 0x82, 0x20, +0x04, 0x38, 0x14, 0x38, 0xA1, 0x21, 0xA3, 0x48, +0xE1, 0x86, 0x00, 0x1A, 0x62, 0x02, 0x05, 0x20, +0x40, 0x00, 0xA4, 0x48, 0x1B, 0x80, 0x4A, 0x18, +0x00, 0x0E, 0x19, 0xF9, 0x07, 0x0D, 0x18, 0xF9, +0x04, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, +0xFF, 0xFF, 0x70, 0x03, 0x18, 0xF9, 0x00, 0x0E, +0x19, 0xF9, 0x08, 0x0D, 0x18, 0xF9, 0x04, 0x0D, +0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, +0x80, 0x03, 0x18, 0xF9, 0x04, 0x0D, 0x2E, 0x00, +0xFF, 0xFF, 0xFF, 0xA0, 0xA0, 0x03, 0x29, 0x0B, +0xD0, 0x03, 0x24, 0x0B, 0xFF, 0xFF, 0xAD, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0x0A, 0x0D, +0x2F, 0x0B, 0xA0, 0x03, 0x2A, 0x0B, 0xD0, 0x03, +0x25, 0x0B, 0xFF, 0xFF, 0xAD, 0x38, 0xAF, 0x51, +0x10, 0x80, 0xA0, 0x31, 0x0A, 0x0D, 0x30, 0x0B, +0x0F, 0x98, 0x40, 0x25, 0x0A, 0x0D, 0x31, 0x0B, +0xFF, 0xA0, 0xA0, 0x03, 0x2F, 0x0B, 0xD0, 0x03, +0x30, 0x0B, 0xA0, 0x49, 0x21, 0x80, 0xAD, 0x18, +0xFF, 0xA0, 0xD0, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0xAD, 0x48, 0x1B, 0x80, 0xAD, 0x18, 0x00, 0x03, +0x2F, 0x0B, 0x10, 0x18, 0x0F, 0x98, 0x25, 0x15, +0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, +0x00, 0x03, 0x30, 0x0B, 0x10, 0x18, 0x0F, 0x98, +0x25, 0x15, 0x00, 0x0D, 0x06, 0xF9, 0x01, 0x0D, +0x07, 0xF9, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0x18, 0xF9, 0x01, 0x0D, +0x19, 0xF9, 0xD0, 0x19, 0x26, 0x19, 0x0A, 0x0D, +0x1A, 0xF9, 0x0D, 0x0D, 0x1B, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x18, 0xF9, 0x10, 0x03, 0x19, 0xF9, +0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, +0x0A, 0x0D, 0x06, 0xF9, 0x0D, 0x0D, 0x07, 0xF9, +0xA0, 0x03, 0x03, 0xF9, 0xD0, 0x03, 0x04, 0xF9, +0xFF, 0xFF, 0xA1, 0x79, 0xD0, 0x51, 0xAF, 0xC5, +0xD1, 0x79, 0x21, 0x39, 0x41, 0x86, 0xFF, 0xA0, +0xB0, 0x03, 0x46, 0x0B, 0xD0, 0x19, 0xBD, 0x50, +0xF0, 0xA0, 0xFF, 0xFF, 0xD1, 0x21, 0xDF, 0x49, +0xA1, 0x87, 0xFF, 0xA0, 0x0F, 0x98, 0x87, 0x25, +0xDF, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, +0xAE, 0x0A, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0xAE, 0x0A, 0xA0, 0x03, 0x46, 0x0B, 0xA9, 0xC0, +0xAD, 0xC0, 0x0A, 0x0D, 0x46, 0x0B, 0x70, 0x4A, +0xFF, 0x00, 0x70, 0x80, 0xA0, 0x03, 0x44, 0x0B, +0xA9, 0xC0, 0xAD, 0xC0, 0x0A, 0x0D, 0x44, 0x0B, +0x6F, 0x80, 0xA0, 0x03, 0x45, 0x0B, 0xA9, 0xC0, +0xAD, 0xC0, 0x0A, 0x0D, 0x45, 0x0B, 0x90, 0x1A, +0x99, 0x0D, 0xAD, 0x18, 0xA3, 0x59, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, 0x9A, 0x20, +0xC0, 0x1A, 0x8E, 0x0B, 0xA8, 0x18, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0xCA, 0x20, 0x0C, 0x00, 0x90, 0x08, 0xC1, 0x21, +0x91, 0x21, 0x0C, 0x00, 0x90, 0x08, 0x91, 0x21, +0xA0, 0x03, 0x26, 0x0B, 0xA0, 0x62, 0xFF, 0x00, +0x80, 0x1A, 0xD5, 0x0D, 0x8D, 0x20, 0x80, 0x0B, +0x80, 0x1A, 0xC6, 0x0D, 0x8D, 0x20, 0x08, 0x00, +0xFF, 0xFF, 0x01, 0x21, 0x80, 0x08, 0x10, 0x03, +0x9B, 0x0A, 0x81, 0x08, 0xAE, 0xC1, 0xA8, 0xC1, +0xAA, 0xC1, 0xA9, 0xC1, 0x9A, 0x08, 0x80, 0x1A, +0xE4, 0x0D, 0x8D, 0x20, 0x80, 0x0B, 0xFF, 0xA0, +0x0F, 0x98, 0xB3, 0x1C, 0xA0, 0x03, 0xAD, 0x0A, +0xFF, 0xFF, 0xA1, 0x39, 0x0A, 0x0D, 0xAD, 0x0A, +0xA0, 0x03, 0xAE, 0x0A, 0xFF, 0xFF, 0xA1, 0x39, +0x0A, 0x0D, 0xAE, 0x0A, 0xA0, 0x49, 0xFC, 0xA0, +0xFF, 0xFF, 0xB0, 0x03, 0xAD, 0x0A, 0xB0, 0x49, +0x3B, 0x80, 0x00, 0x0E, 0xAE, 0x0A, 0xFF, 0xA0, +0xA0, 0x03, 0x9A, 0x0A, 0xB0, 0x03, 0xAD, 0x0A, +0xBA, 0x68, 0xB0, 0x49, 0x00, 0x88, 0x5A, 0x24, +0x90, 0x1A, 0x99, 0x0D, 0x92, 0x21, 0xC0, 0x19, +0xB0, 0x19, 0x3F, 0x19, 0xA9, 0x00, 0xA8, 0x51, +0x20, 0x80, 0xBC, 0xC0, 0x3F, 0x80, 0xA0, 0x62, +0xFF, 0x00, 0x9A, 0x08, 0x93, 0x21, 0xC1, 0x21, +0xC3, 0x48, 0x41, 0x87, 0x0B, 0x0D, 0x46, 0x0B, +0x00, 0x0E, 0x32, 0x0B, 0x00, 0x0E, 0x44, 0x0B, +0x00, 0x0E, 0x27, 0x0B, 0x00, 0x0E, 0x8B, 0x0B, +0x00, 0x0E, 0x45, 0x0B, 0xA0, 0x03, 0x9A, 0x0A, +0xA0, 0x49, 0x00, 0x88, 0x92, 0x28, 0xA0, 0x03, +0x9A, 0x0A, 0xB0, 0x03, 0xAD, 0x0A, 0xAB, 0x48, +0x0A, 0x88, 0x5D, 0x27, 0xA0, 0x03, 0x32, 0x0B, +0x3F, 0x19, 0xA3, 0x48, 0x0B, 0x88, 0x92, 0x28, +0xB0, 0x03, 0x46, 0x0B, 0xBA, 0x50, 0x00, 0x88, +0x55, 0x27, 0xB0, 0x03, 0x45, 0x0B, 0xBA, 0x50, +0x01, 0x88, 0x55, 0x27, 0xB0, 0x1A, 0x99, 0x0D, +0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, 0x24, 0x0B, +0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, 0x25, 0x0B, +0x00, 0x0E, 0x33, 0x0B, 0xA0, 0x1A, 0x10, 0x27, +0x0A, 0x0D, 0x36, 0x0B, 0x0A, 0x0D, 0x47, 0x0B, +0x90, 0x03, 0x33, 0x0B, 0xA0, 0x03, 0xAD, 0x0A, +0x9A, 0x48, 0xBB, 0x82, 0xA0, 0x03, 0x44, 0x0B, +0xA9, 0x50, 0x01, 0x82, 0xB0, 0x1A, 0x8E, 0x0B, +0xA0, 0x03, 0x33, 0x0B, 0xFF, 0xFF, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, 0x29, 0x0B, +0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, 0x2A, 0x0B, +0x0F, 0x98, 0x25, 0x25, 0xB0, 0x03, 0x36, 0x0B, +0xAB, 0x48, 0x8B, 0x80, 0xA0, 0x03, 0x31, 0x0B, +0x0A, 0x0D, 0x36, 0x0B, 0xA0, 0x03, 0x33, 0x0B, +0x0A, 0x0D, 0x47, 0x0B, 0x90, 0x03, 0x33, 0x0B, +0xFF, 0xFF, 0x91, 0x21, 0x09, 0x0D, 0x33, 0x0B, +0xFF, 0x84, 0xA0, 0x03, 0x47, 0x0B, 0xA0, 0x4A, +0x10, 0x27, 0x00, 0x88, 0x55, 0x27, 0xA0, 0x03, +0x44, 0x0B, 0x90, 0x03, 0x47, 0x0B, 0xA9, 0xC0, +0x0A, 0x0D, 0x44, 0x0B, 0xA0, 0x03, 0x45, 0x0B, +0x90, 0x03, 0x32, 0x0B, 0xA9, 0xC0, 0x0A, 0x0D, +0x45, 0x0B, 0x00, 0x03, 0x9B, 0x0A, 0x90, 0x1A, +0xC6, 0x0D, 0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, +0x9A, 0x20, 0x19, 0x00, 0x10, 0x48, 0x0B, 0x88, +0xED, 0x26, 0x10, 0x03, 0x03, 0x0E, 0x00, 0x03, +0x47, 0x0B, 0x10, 0x50, 0x70, 0x82, 0x90, 0x0B, +0xA0, 0x03, 0xAE, 0x0A, 0xFF, 0xFF, 0xA1, 0x39, +0x0A, 0x0D, 0xAE, 0x0A, 0x90, 0x1A, 0x99, 0x0D, +0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0xA9, 0x20, 0xA2, 0x21, 0xA0, 0x0B, 0x70, 0x1A, +0xC6, 0x0D, 0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, +0x7A, 0x20, 0x70, 0x0B, 0x70, 0x1A, 0xE4, 0x0D, +0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, 0x7A, 0x20, +0x70, 0x0B, 0xA0, 0x03, 0x47, 0x0B, 0xFF, 0xFF, +0x0F, 0x88, 0xE7, 0x25, 0xB0, 0x03, 0x36, 0x0B, +0xA0, 0x03, 0x3A, 0x00, 0xBA, 0x48, 0x5B, 0x80, +0xA9, 0x00, 0xFF, 0xFF, 0xA1, 0x21, 0x9A, 0x08, +0x6F, 0x82, 0x90, 0x0B, 0x70, 0x1A, 0xE4, 0x0D, +0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, 0x7A, 0x20, +0x70, 0x0B, 0xDF, 0x81, 0xB0, 0x03, 0x36, 0x0B, +0xA0, 0x03, 0x57, 0x02, 0xBA, 0x48, 0x2D, 0x80, +0x0B, 0x0D, 0x57, 0x02, 0x70, 0x1A, 0xE4, 0x0D, +0xA0, 0x03, 0x32, 0x0B, 0xFF, 0xFF, 0x7A, 0x20, +0xA7, 0x00, 0xAB, 0x48, 0x1B, 0x80, 0x7B, 0x08, +0xB0, 0x03, 0xBC, 0x00, 0xAB, 0x48, 0x7B, 0x80, +0xB0, 0x03, 0x36, 0x0B, 0xA0, 0x03, 0xBB, 0x00, +0xBA, 0x48, 0x0B, 0x88, 0x4D, 0x27, 0xA0, 0x03, +0x47, 0x0B, 0x0A, 0x0D, 0xDB, 0x0B, 0xA0, 0x03, +0x32, 0x0B, 0x0A, 0x0D, 0xDC, 0x0B, 0xC0, 0x1A, +0x8E, 0x0B, 0xA0, 0x03, 0xDB, 0x0B, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xCA, 0x20, 0x90, 0x1A, 0x99, 0x0D, +0xA0, 0x03, 0xDC, 0x0B, 0xFF, 0xFF, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0x9A, 0x20, 0x7C, 0x00, 0x97, 0x08, 0xC1, 0x21, +0x91, 0x21, 0x8C, 0x00, 0x98, 0x08, 0xC1, 0x21, +0x91, 0x21, 0xAC, 0x00, 0xA0, 0x62, 0xFF, 0x00, +0x20, 0x03, 0x9B, 0x0A, 0x70, 0x1A, 0xC6, 0x0D, +0x00, 0x03, 0xDC, 0x0B, 0xFF, 0xFF, 0x70, 0x20, +0x07, 0x00, 0x02, 0x48, 0x9B, 0x80, 0x80, 0x1A, +0xD5, 0x0D, 0x00, 0x03, 0x32, 0x0B, 0xFF, 0xFF, +0x80, 0x20, 0x80, 0x0B, 0xAE, 0xC9, 0x2F, 0x80, +0x72, 0x08, 0xAE, 0xC1, 0xA8, 0xC1, 0xA9, 0xC1, +0x9A, 0x08, 0x8F, 0x80, 0x80, 0x03, 0x47, 0x0B, +0x90, 0x03, 0x32, 0x0B, 0x70, 0x1A, 0xFF, 0x00, +0x0F, 0x98, 0x91, 0x25, 0xA0, 0x03, 0x32, 0x0B, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x32, 0x0B, +0x0F, 0x88, 0x31, 0x26, 0x00, 0x0E, 0x44, 0x0B, +0xB0, 0x03, 0xAD, 0x0A, 0xB0, 0x49, 0x00, 0x88, +0x9B, 0x28, 0x00, 0x0E, 0x33, 0x0B, 0x00, 0x0E, +0x57, 0x02, 0xA0, 0x03, 0x32, 0x0B, 0x90, 0x03, +0xAD, 0x0A, 0xA9, 0x48, 0x0B, 0x88, 0x92, 0x28, +0xB0, 0x1A, 0x8E, 0x0B, 0xA0, 0x03, 0x32, 0x0B, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0xBA, 0x20, 0xAB, 0x00, +0x0A, 0x0D, 0x24, 0x0B, 0xB1, 0x21, 0xAB, 0x00, +0x0A, 0x0D, 0x25, 0x0B, 0x00, 0x0E, 0x33, 0x0B, +0xA0, 0x1A, 0x10, 0x27, 0x0A, 0x0D, 0x36, 0x0B, +0x0A, 0x0D, 0x47, 0x0B, 0xA0, 0x03, 0x33, 0x0B, +0x3F, 0x19, 0xA3, 0x48, 0xFB, 0x82, 0x90, 0x03, +0x44, 0x0B, 0x9A, 0x50, 0x41, 0x82, 0xB0, 0x03, +0x46, 0x0B, 0xBA, 0x50, 0x00, 0x82, 0xB0, 0x1A, +0x99, 0x0D, 0xA0, 0x03, 0x33, 0x0B, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, +0x29, 0x0B, 0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, +0x2A, 0x0B, 0x0F, 0x98, 0x25, 0x25, 0xB0, 0x03, +0x36, 0x0B, 0xAB, 0x48, 0x8B, 0x80, 0xA0, 0x03, +0x31, 0x0B, 0x0A, 0x0D, 0x36, 0x0B, 0xA0, 0x03, +0x33, 0x0B, 0x0A, 0x0D, 0x47, 0x0B, 0x90, 0x03, +0x33, 0x0B, 0xFF, 0xFF, 0x91, 0x21, 0x09, 0x0D, +0x33, 0x0B, 0xCF, 0x84, 0xA0, 0x03, 0x47, 0x0B, +0xA0, 0x4A, 0x10, 0x27, 0x00, 0x88, 0x8A, 0x28, +0xA0, 0x03, 0x44, 0x0B, 0x90, 0x03, 0x47, 0x0B, +0xA9, 0xC0, 0x0A, 0x0D, 0x44, 0x0B, 0xB0, 0x03, +0x36, 0x0B, 0x70, 0x1A, 0xE4, 0x0D, 0xA0, 0x03, +0x47, 0x0B, 0xFF, 0xFF, 0x7A, 0x20, 0xA7, 0x00, +0xAB, 0x48, 0x1B, 0x80, 0x7B, 0x08, 0x00, 0x03, +0x9B, 0x0A, 0x90, 0x1A, 0xC6, 0x0D, 0xA0, 0x03, +0x47, 0x0B, 0xFF, 0xFF, 0x9A, 0x20, 0x19, 0x00, +0x10, 0x48, 0x0B, 0x88, 0x23, 0x28, 0x10, 0x03, +0x03, 0x0E, 0x00, 0x03, 0x32, 0x0B, 0x10, 0x50, +0x70, 0x82, 0x90, 0x0B, 0xA0, 0x03, 0xAE, 0x0A, +0xFF, 0xFF, 0xA1, 0x39, 0x0A, 0x0D, 0xAE, 0x0A, +0x90, 0x1A, 0x99, 0x0D, 0xA0, 0x03, 0x47, 0x0B, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0xA9, 0x20, 0xA2, 0x21, +0xA0, 0x0B, 0x70, 0x1A, 0xC6, 0x0D, 0xA0, 0x03, +0x47, 0x0B, 0xFF, 0xFF, 0x7A, 0x20, 0x70, 0x0B, +0x70, 0x1A, 0xE4, 0x0D, 0xA0, 0x03, 0x47, 0x0B, +0xFF, 0xFF, 0x7A, 0x20, 0x70, 0x0B, 0xA0, 0x03, +0x32, 0x0B, 0xFF, 0xFF, 0x0F, 0x88, 0xE7, 0x25, +0xB0, 0x03, 0x36, 0x0B, 0xA0, 0x03, 0x3A, 0x00, +0xBA, 0x48, 0x5B, 0x80, 0xA9, 0x00, 0xFF, 0xFF, +0xA1, 0x21, 0x9A, 0x08, 0x6F, 0x82, 0x90, 0x0B, +0x70, 0x1A, 0xE4, 0x0D, 0xA0, 0x03, 0x47, 0x0B, +0xFF, 0xFF, 0x7A, 0x20, 0x70, 0x0B, 0xDF, 0x81, +0xB0, 0x03, 0x36, 0x0B, 0xA0, 0x03, 0x57, 0x02, +0xBA, 0x48, 0x2D, 0x80, 0x0B, 0x0D, 0x57, 0x02, +0x70, 0x1A, 0xE4, 0x0D, 0xA0, 0x03, 0x47, 0x0B, +0xFF, 0xFF, 0x7A, 0x20, 0xA7, 0x00, 0xAB, 0x48, +0x1B, 0x80, 0x7B, 0x08, 0xB0, 0x03, 0xBC, 0x00, +0xAB, 0x48, 0x7B, 0x80, 0xB0, 0x03, 0x36, 0x0B, +0xA0, 0x03, 0xBB, 0x00, 0xBA, 0x48, 0x0B, 0x88, +0x83, 0x28, 0xA0, 0x03, 0x32, 0x0B, 0x0A, 0x0D, +0xDB, 0x0B, 0xA0, 0x03, 0x47, 0x0B, 0x0A, 0x0D, +0xDC, 0x0B, 0xC0, 0x1A, 0x8E, 0x0B, 0xA0, 0x03, +0xDB, 0x0B, 0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, 0xCA, 0x20, +0x90, 0x1A, 0x99, 0x0D, 0xA0, 0x03, 0xDC, 0x0B, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0x9A, 0x20, 0x7C, 0x00, +0x97, 0x08, 0xC1, 0x21, 0x91, 0x21, 0x8C, 0x00, +0x98, 0x08, 0xC1, 0x21, 0x91, 0x21, 0xAC, 0x00, +0xA0, 0x62, 0xFF, 0x00, 0x20, 0x03, 0x9B, 0x0A, +0x70, 0x1A, 0xC6, 0x0D, 0x00, 0x03, 0x47, 0x0B, +0xFF, 0xFF, 0x70, 0x20, 0x07, 0x00, 0x02, 0x48, +0x9B, 0x80, 0x80, 0x1A, 0xD5, 0x0D, 0x00, 0x03, +0x47, 0x0B, 0xFF, 0xFF, 0x80, 0x20, 0x80, 0x0B, +0xAE, 0xC9, 0x2F, 0x80, 0x72, 0x08, 0xAE, 0xC1, +0xA8, 0xC1, 0xA9, 0xC1, 0x9A, 0x08, 0x7F, 0x80, +0x90, 0x03, 0x47, 0x0B, 0x80, 0x03, 0x32, 0x0B, +0x70, 0x19, 0x0F, 0x98, 0x91, 0x25, 0xA0, 0x03, +0x32, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x32, 0x0B, 0x0F, 0x88, 0x68, 0x27, 0xA0, 0x03, +0x9A, 0x0A, 0xB0, 0x03, 0xAD, 0x0A, 0xAB, 0x48, +0xF0, 0xA0, 0xFF, 0xFF, 0xBA, 0x48, 0xDA, 0x82, +0xD0, 0x03, 0x44, 0x0B, 0xC0, 0x19, 0xB0, 0x03, +0x46, 0x0B, 0xBC, 0x50, 0x20, 0x82, 0xDC, 0x50, +0x01, 0x82, 0x90, 0x1A, 0x99, 0x0D, 0xAC, 0x18, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0x9A, 0x20, 0x92, 0x21, 0xA9, 0x00, +0xA0, 0x62, 0xFF, 0x00, 0x70, 0x1A, 0xC6, 0x0D, +0x7C, 0x20, 0x87, 0x00, 0x70, 0x0B, 0x20, 0x03, +0x9B, 0x0A, 0x82, 0x48, 0x2B, 0x80, 0xAE, 0xC9, +0x1F, 0x80, 0xAE, 0xC1, 0xAB, 0xC1, 0x9A, 0x08, +0xB0, 0x03, 0x46, 0x0B, 0xBC, 0xC8, 0x0B, 0x0D, +0x46, 0x0B, 0xC1, 0x21, 0xCF, 0x49, 0x71, 0x85, +0xFF, 0xA0, 0x00, 0x0E, 0x32, 0x0B, 0xA0, 0x03, +0x32, 0x0B, 0xB0, 0x03, 0xAD, 0x0A, 0xAB, 0x48, +0xFB, 0xA0, 0xFF, 0xFF, 0x90, 0x03, 0x32, 0x0B, +0xA0, 0x03, 0x44, 0x0B, 0xA9, 0x50, 0x01, 0x88, +0x36, 0x29, 0xA0, 0x03, 0x03, 0x0E, 0xA9, 0x50, +0x80, 0x80, 0xA0, 0x03, 0xAE, 0x0A, 0xFF, 0xFF, +0xA1, 0x39, 0x0A, 0x0D, 0xAE, 0x0A, 0x0F, 0x88, +0x36, 0x29, 0x00, 0x0E, 0x33, 0x0B, 0xA0, 0x1A, +0xFF, 0xFF, 0x0A, 0x0D, 0x36, 0x0B, 0x0F, 0x98, +0x87, 0x25, 0xD3, 0x48, 0xF0, 0xA0, 0xFF, 0xFF, +0xA0, 0x03, 0x46, 0x0B, 0xAD, 0xC0, 0x0A, 0x0D, +0x46, 0x0B, 0x90, 0x03, 0x32, 0x0B, 0xA0, 0x03, +0x44, 0x0B, 0xA9, 0xC0, 0x0A, 0x0D, 0x44, 0x0B, +0xC0, 0x1A, 0x8E, 0x0B, 0xA0, 0x03, 0x32, 0x0B, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0xCA, 0x20, 0x90, 0x1A, +0x99, 0x0D, 0xAD, 0x18, 0xA3, 0x59, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, 0x9A, 0x20, +0xAC, 0x00, 0x9A, 0x08, 0xC1, 0x21, 0x91, 0x21, +0xAC, 0x00, 0x9A, 0x08, 0xC1, 0x21, 0x91, 0x21, +0x70, 0x1A, 0xC6, 0x0D, 0x7D, 0x20, 0x87, 0x00, +0xFF, 0xFF, 0x81, 0x21, 0x78, 0x08, 0xAC, 0x00, +0xA0, 0x62, 0xFF, 0x00, 0x20, 0x03, 0x9B, 0x0A, +0x82, 0x48, 0x8B, 0x80, 0x80, 0x1A, 0xD5, 0x0D, +0x0D, 0x18, 0xFF, 0xFF, 0x80, 0x20, 0x80, 0x0B, +0xAE, 0xC9, 0x2F, 0x80, 0x72, 0x08, 0xAE, 0xC1, +0xA8, 0xC1, 0xA9, 0xC1, 0x9A, 0x08, 0x70, 0x1A, +0xE4, 0x0D, 0x7D, 0x20, 0x70, 0x0B, 0xA0, 0x03, +0x32, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x32, 0x0B, 0x0F, 0x88, 0xCA, 0x28, 0x00, 0x0E, +0x8C, 0x0B, 0xD0, 0x03, 0x0A, 0x00, 0xB0, 0x1A, +0x77, 0x00, 0xC0, 0x1A, 0x4F, 0x0B, 0x50, 0x19, +0x9C, 0x18, 0x92, 0x21, 0x89, 0x00, 0x88, 0x51, +0x70, 0x81, 0x8D, 0x51, 0x51, 0x81, 0xA0, 0x03, +0x8C, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x8C, 0x0B, 0x8F, 0x51, 0x50, 0x80, 0xA0, 0x03, +0x8B, 0x0B, 0xA8, 0xC1, 0x0A, 0x0D, 0x8B, 0x0B, +0x8A, 0x51, 0xF0, 0x80, 0xA0, 0x03, 0x8B, 0x0B, +0xA2, 0xC1, 0x0A, 0x0D, 0x8B, 0x0B, 0x9F, 0x80, +0x8B, 0x51, 0x10, 0x80, 0x51, 0x19, 0x9B, 0x18, +0x92, 0x21, 0x89, 0x00, 0x88, 0x51, 0x10, 0x80, +0x51, 0x19, 0xB3, 0x21, 0xC3, 0x21, 0xD1, 0x39, +0x71, 0x85, 0xB0, 0x03, 0x99, 0x0A, 0xA0, 0x03, +0x8C, 0x0B, 0xBA, 0x48, 0xF0, 0x80, 0xBA, 0x48, +0x7C, 0x80, 0xA0, 0x03, 0x8B, 0x0B, 0xA3, 0xC1, +0xA0, 0xC1, 0x0A, 0x0D, 0x8B, 0x0B, 0x6F, 0x80, +0xA0, 0x03, 0x8B, 0x0B, 0xAB, 0xC1, 0xA1, 0xC1, +0x0A, 0x0D, 0x8B, 0x0B, 0xA0, 0x03, 0x8B, 0x0B, +0xAB, 0xC9, 0xB0, 0x03, 0x8C, 0x0B, 0xB0, 0x49, +0x10, 0x80, 0xAB, 0xC1, 0x50, 0x49, 0x20, 0x80, +0xA3, 0xC1, 0xA0, 0xC1, 0x0A, 0x0D, 0x8B, 0x0B, +0xA2, 0x51, 0x91, 0x80, 0xA0, 0x03, 0x9D, 0x0A, +0xA0, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0xA1, 0x39, +0x0A, 0x0D, 0x9D, 0x0A, 0xFF, 0xA0, 0x03, 0x0E, +0x9D, 0x0A, 0xFF, 0xA0, 0x70, 0x03, 0x46, 0x00, +0x70, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0x70, 0x03, +0x0C, 0x00, 0x76, 0x51, 0xF0, 0xA0, 0xFF, 0xFF, +0x70, 0x03, 0x71, 0x02, 0x71, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x50, 0x18, 0x14, 0x00, 0x01, 0x19, +0x0F, 0x98, 0x25, 0x15, 0x5F, 0x51, 0x20, 0x19, +0x10, 0x80, 0x21, 0x39, 0x05, 0x0D, 0x00, 0xF9, +0x02, 0x0D, 0x01, 0xF9, 0x00, 0x0D, 0x02, 0xF9, +0x01, 0x0D, 0x03, 0xF9, 0x00, 0x03, 0x00, 0xF9, +0x10, 0x03, 0x01, 0xF9, 0x22, 0x19, 0x0F, 0x88, +0x7F, 0x15, 0x00, 0x0E, 0x10, 0xF9, 0x00, 0x0E, +0x11, 0xF9, 0x00, 0x0E, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xA0, 0x03, 0x55, 0x00, 0xB0, 0x03, +0x56, 0x00, 0x00, 0x1A, 0x72, 0x02, 0x10, 0x03, +0x0C, 0x00, 0x12, 0x51, 0x20, 0x80, 0x00, 0x1A, +0xB2, 0x03, 0x00, 0x0D, 0x70, 0x02, 0xD0, 0x03, +0x70, 0x02, 0xC0, 0x03, 0xF6, 0x0D, 0xFF, 0xFF, +0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x1E, 0x00, 0x03, 0xF4, 0x0D, 0xFF, 0xFF, +0xC0, 0x20, 0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xDA, 0x00, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0xD1, 0x21, 0x3D, 0x00, 0xFF, 0xFF, 0xDB, 0x20, +0x1D, 0x00, 0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x00, +0xFF, 0xFF, 0x30, 0x20, 0x20, 0x03, 0x10, 0xF9, +0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xDB, 0x00, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xDC, 0x00, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, +0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, 0x32, 0x06, +0x4C, 0x20, 0x0F, 0x98, 0xA1, 0x29, 0x40, 0x08, +0xD0, 0x03, 0x70, 0x02, 0xC0, 0x03, 0xF6, 0x0D, +0xFF, 0xFF, 0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xC0, 0x1E, 0x00, 0x03, 0xF5, 0x0D, +0xFF, 0xFF, 0xC0, 0x20, 0xDC, 0x20, 0x0D, 0x00, +0x00, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xDA, 0x00, +0xFF, 0xFF, 0x04, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xD1, 0x39, +0x3D, 0x00, 0xFF, 0xFF, 0xDB, 0x20, 0x1D, 0x00, +0xFF, 0xFF, 0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, +0x30, 0x20, 0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xDB, 0x00, 0xFF, 0xFF, +0x04, 0x79, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, +0xFF, 0xFF, 0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xDC, 0x00, 0xFF, 0xFF, 0x04, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x02, 0x20, 0x40, 0x1A, 0x32, 0x06, 0x4C, 0x20, +0x0F, 0x98, 0xA1, 0x29, 0x40, 0x08, 0xD0, 0x03, +0x70, 0x02, 0xC0, 0x03, 0xF7, 0x0D, 0xFF, 0xFF, +0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x1E, 0x00, 0x03, 0xF4, 0x0D, 0xFF, 0xFF, +0xC0, 0x20, 0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xDA, 0x00, 0xFF, 0xFF, +0x08, 0x79, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0xD1, 0x21, 0x3D, 0x00, +0xFF, 0xFF, 0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, +0xD1, 0x39, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xDB, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xDC, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0x32, 0x06, 0x4C, 0x20, 0x0F, 0x98, +0xA1, 0x29, 0x40, 0x08, 0xD0, 0x03, 0x70, 0x02, +0xC0, 0x03, 0xF7, 0x0D, 0xFF, 0xFF, 0xCB, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, +0x00, 0x03, 0xF5, 0x0D, 0xFF, 0xFF, 0xC0, 0x20, +0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xDA, 0x00, 0xFF, 0xFF, 0x0C, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xD1, 0x39, 0x3D, 0x00, 0xFF, 0xFF, +0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, 0xD1, 0x21, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0x20, 0x03, +0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xDB, 0x00, 0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x23, 0x20, +0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xDC, 0x00, +0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, +0x32, 0x06, 0x4C, 0x20, 0x0F, 0x98, 0xA1, 0x29, +0x40, 0x08, 0x90, 0x03, 0xF4, 0x0D, 0xFF, 0xFF, +0x91, 0x21, 0xD0, 0x03, 0x70, 0x02, 0xC0, 0x03, +0xF6, 0x0D, 0xFF, 0xFF, 0xCB, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, 0xC9, 0x20, +0xDC, 0x20, 0x6D, 0x00, 0x76, 0x18, 0x73, 0x79, +0x67, 0x20, 0x70, 0x19, 0x0D, 0x00, 0x00, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xD1, 0x00, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0xD1, 0x21, 0x3D, 0x00, 0x36, 0x48, 0x1D, 0x80, +0x70, 0xC1, 0xFF, 0xFF, 0xD2, 0x39, 0x0D, 0x00, +0x06, 0x48, 0x1D, 0x80, 0x71, 0xC1, 0xFF, 0xFF, +0x30, 0x20, 0xDB, 0x20, 0x1D, 0x00, 0xFF, 0xFF, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD2, 0x00, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x30, 0x03, +0x10, 0xF9, 0x73, 0x18, 0x23, 0x20, 0x01, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xD3, 0x00, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0x32, 0x06, 0x4C, 0x20, 0x73, 0x49, +0x41, 0x80, 0x01, 0x79, 0x70, 0x18, 0x71, 0x79, +0x07, 0x20, 0x0F, 0x98, 0xA1, 0x29, 0x40, 0x08, +0x00, 0x03, 0xF5, 0x0D, 0xFF, 0xFF, 0x91, 0x21, +0x90, 0x48, 0x0C, 0x88, 0x08, 0x2B, 0x90, 0x03, +0xF4, 0x0D, 0xFF, 0xFF, 0x91, 0x21, 0xD0, 0x03, +0x70, 0x02, 0xC0, 0x03, 0xF7, 0x0D, 0xFF, 0xFF, +0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x1E, 0xC9, 0x20, 0xDC, 0x20, 0x6D, 0x00, +0x76, 0x18, 0x73, 0x79, 0x67, 0x20, 0x70, 0x19, +0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD1, 0x00, 0xFF, 0xFF, 0x04, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0xD1, 0x21, 0x3D, 0x00, 0x36, 0x48, 0x1D, 0x80, +0x70, 0xC1, 0xFF, 0xFF, 0xD2, 0x39, 0x0D, 0x00, +0x06, 0x48, 0x1D, 0x80, 0x71, 0xC1, 0xFF, 0xFF, +0x30, 0x20, 0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, +0xD2, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, +0xD1, 0x39, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD2, 0x00, 0xFF, 0xFF, 0x04, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, 0x70, 0x18, +0x20, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD3, 0x00, 0xFF, 0xFF, 0x04, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0x32, 0x06, 0x4C, 0x20, 0x73, 0x49, +0x41, 0x80, 0x01, 0x79, 0x70, 0x18, 0x71, 0x79, +0x07, 0x20, 0x0F, 0x98, 0xA1, 0x29, 0x40, 0x08, +0x00, 0x03, 0xF5, 0x0D, 0xFF, 0xFF, 0x91, 0x21, +0x90, 0x48, 0x0C, 0x88, 0x6E, 0x2B, 0x90, 0x03, +0xF6, 0x0D, 0xFF, 0xFF, 0x91, 0x21, 0xD0, 0x03, +0x70, 0x02, 0xC9, 0x18, 0xCB, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, 0x00, 0x03, +0xF4, 0x0D, 0xFF, 0xFF, 0xC0, 0x20, 0xDC, 0x20, +0x6D, 0x00, 0x76, 0x18, 0x73, 0x79, 0x67, 0x20, +0x70, 0x19, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD1, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xD1, 0x21, 0x3D, 0x00, 0xFF, 0xFF, +0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, 0xD1, 0x39, +0x0D, 0x00, 0x06, 0x48, 0x1D, 0x80, 0x70, 0xC1, +0xFF, 0xFF, 0x30, 0x20, 0xDB, 0x20, 0xDB, 0x20, +0x0D, 0x00, 0x06, 0x48, 0x1D, 0x80, 0x71, 0xC1, +0xFF, 0xFF, 0x30, 0x20, 0xD1, 0x21, 0x0D, 0x00, +0xFF, 0xFF, 0x10, 0x20, 0x20, 0x03, 0x10, 0xF9, +0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xD2, 0x00, +0xFF, 0xFF, 0x08, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x30, 0x03, +0x10, 0xF9, 0x73, 0x18, 0x23, 0x20, 0x01, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xD3, 0x00, 0xFF, 0xFF, +0x08, 0x79, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, +0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, 0x32, 0x06, +0x4C, 0x20, 0x73, 0x49, 0x41, 0x80, 0x01, 0x79, +0x70, 0x18, 0x71, 0x79, 0x07, 0x20, 0x0F, 0x98, +0xA1, 0x29, 0x40, 0x08, 0x00, 0x03, 0xF7, 0x0D, +0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, 0x0C, 0x88, +0xDA, 0x2B, 0x90, 0x03, 0xF6, 0x0D, 0xFF, 0xFF, +0x91, 0x21, 0xD0, 0x03, 0x70, 0x02, 0xC9, 0x18, +0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x1E, 0x00, 0x03, 0xF5, 0x0D, 0xFF, 0xFF, +0xC0, 0x20, 0xDC, 0x20, 0x6D, 0x00, 0x76, 0x18, +0x73, 0x79, 0x67, 0x20, 0x70, 0x19, 0x0D, 0x00, +0x00, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xD1, 0x00, +0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xDB, 0x38, +0x3D, 0x00, 0x36, 0x48, 0x1D, 0x80, 0x70, 0xC1, +0xFF, 0xFF, 0xD1, 0x39, 0x1D, 0x00, 0xFF, 0xFF, +0xDB, 0x20, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0xDB, 0x20, 0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, +0xD1, 0x21, 0x0D, 0x00, 0x06, 0x48, 0x1D, 0x80, +0x71, 0xC1, 0xFF, 0xFF, 0x30, 0x20, 0x20, 0x03, +0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD2, 0x00, 0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x30, 0x03, 0x10, 0xF9, 0x73, 0x18, 0x23, 0x20, +0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xD3, 0x00, +0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, +0x32, 0x06, 0x4C, 0x20, 0x73, 0x49, 0x41, 0x80, +0x01, 0x79, 0x70, 0x18, 0x71, 0x79, 0x07, 0x20, +0x0F, 0x98, 0xA1, 0x29, 0x40, 0x08, 0x00, 0x03, +0xF7, 0x0D, 0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, +0x0C, 0x88, 0x48, 0x2C, 0x70, 0x03, 0x71, 0x02, +0x71, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0x80, 0x03, +0xF6, 0x0D, 0xFF, 0xFF, 0x81, 0x21, 0x90, 0x03, +0xF4, 0x0D, 0xFF, 0xFF, 0x91, 0x21, 0x08, 0x0D, +0x10, 0xF9, 0x0B, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xC0, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0xC9, 0x20, 0xD0, 0x03, 0x70, 0x02, 0xFF, 0xFF, +0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xCA, 0x00, 0x6D, 0x00, 0x76, 0x18, +0x73, 0x79, 0x67, 0x20, 0x70, 0x19, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xDB, 0x38, +0x3D, 0x00, 0x36, 0x48, 0x1D, 0x80, 0x70, 0xC1, +0xFF, 0xFF, 0xD1, 0x39, 0x1D, 0x00, 0x16, 0x48, +0x1D, 0x80, 0x74, 0xC1, 0xFF, 0xFF, 0xDB, 0x20, +0x0D, 0x00, 0xFF, 0xFF, 0x06, 0x48, 0x1D, 0x80, +0x72, 0xC1, 0x30, 0x20, 0xDB, 0x20, 0x0D, 0x00, +0xFF, 0xFF, 0x06, 0x48, 0x1D, 0x80, 0x76, 0xC1, +0x10, 0x20, 0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, +0x06, 0x48, 0x1D, 0x80, 0x71, 0xC1, 0x30, 0x20, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x06, 0x48, +0x1D, 0x80, 0x75, 0xC1, 0x10, 0x20, 0xDB, 0x38, +0x0D, 0x00, 0xFF, 0xFF, 0x06, 0x48, 0x1D, 0x80, +0x73, 0xC1, 0x30, 0x20, 0xDB, 0x38, 0x0D, 0x00, +0x06, 0x48, 0x1D, 0x80, 0x77, 0xC1, 0xFF, 0xFF, +0x10, 0x20, 0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xCB, 0x00, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x30, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x23, 0x20, 0x01, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xCC, 0x00, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, +0x32, 0x06, 0x4C, 0x20, 0x63, 0x19, 0x17, 0x18, +0x16, 0x60, 0x16, 0x48, 0x51, 0x80, 0x01, 0x79, +0x70, 0x18, 0x71, 0x79, 0x07, 0x20, 0x4F, 0x83, +0x62, 0x7B, 0x60, 0x4A, 0x00, 0x03, 0x31, 0x87, +0x17, 0x18, 0x10, 0x62, 0x21, 0x00, 0x10, 0x4A, +0x21, 0x00, 0x10, 0x87, 0x17, 0x18, 0x10, 0x62, +0x41, 0x00, 0x10, 0x4A, 0x41, 0x00, 0xB0, 0x86, +0x17, 0x18, 0x10, 0x62, 0x12, 0x00, 0x10, 0x4A, +0x12, 0x00, 0x50, 0x86, 0x17, 0x18, 0x10, 0x62, +0x82, 0x00, 0x10, 0x4A, 0x82, 0x00, 0xF0, 0x85, +0x17, 0x18, 0x10, 0x62, 0x24, 0x00, 0x10, 0x4A, +0x24, 0x00, 0x90, 0x85, 0x17, 0x18, 0x10, 0x62, +0x84, 0x00, 0x10, 0x4A, 0x84, 0x00, 0x30, 0x85, +0x17, 0x18, 0x10, 0x62, 0x18, 0x00, 0x10, 0x4A, +0x18, 0x00, 0xD0, 0x84, 0x17, 0x18, 0x10, 0x62, +0x48, 0x00, 0x10, 0x4A, 0x48, 0x00, 0x70, 0x84, +0x0F, 0x98, 0xA1, 0x29, 0x40, 0x08, 0x00, 0x03, +0xF5, 0x0D, 0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, +0x0C, 0x88, 0xBE, 0x2C, 0x00, 0x03, 0xF7, 0x0D, +0x90, 0x03, 0xF4, 0x0D, 0xFF, 0xFF, 0x91, 0x21, +0x81, 0x21, 0x80, 0x48, 0x0C, 0x88, 0xBE, 0x2C, +0xFF, 0xA0, 0xB0, 0x1A, 0x39, 0x0B, 0xA0, 0x1A, +0xBC, 0x0A, 0x93, 0x19, 0x0A, 0x00, 0xFF, 0xFF, +0xA1, 0x21, 0x1A, 0x00, 0xFF, 0xFF, 0xA1, 0x21, +0x0F, 0x98, 0xE4, 0x14, 0x2A, 0x00, 0xFF, 0xFF, +0xA1, 0x21, 0x0F, 0x98, 0xFF, 0x14, 0xB0, 0x08, +0xB1, 0x21, 0xB1, 0x08, 0xB1, 0x21, 0x91, 0x39, +0xD1, 0x86, 0xFF, 0xA0, 0x00, 0x0E, 0xDE, 0x0A, +0x0F, 0x98, 0x80, 0x2D, 0xB0, 0x1A, 0x39, 0x0B, +0x4B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x5B, 0x00, +0xFF, 0xFF, 0xB1, 0x21, 0x6B, 0x00, 0xFF, 0xFF, +0xB1, 0x21, 0x7B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, +0x8B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x9B, 0x00, +0x06, 0x18, 0x17, 0x18, 0x26, 0x18, 0x37, 0x18, +0x0F, 0x98, 0x16, 0x15, 0x24, 0x18, 0x35, 0x18, +0x0F, 0x98, 0x57, 0x15, 0x28, 0x18, 0x39, 0x18, +0x0F, 0x98, 0x57, 0x15, 0x00, 0x0D, 0x3F, 0x0B, +0x01, 0x0D, 0x40, 0x0B, 0x08, 0x18, 0x19, 0x18, +0x24, 0x18, 0x35, 0x18, 0x0F, 0x98, 0x57, 0x15, +0x20, 0x03, 0xC5, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x40, 0x15, 0x20, 0x03, 0x3F, 0x0B, 0x30, 0x03, +0x40, 0x0B, 0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, +0x00, 0x4A, 0x40, 0x00, 0x2C, 0x80, 0x00, 0x1A, +0x40, 0x00, 0x00, 0x4A, 0xC0, 0xFF, 0x2A, 0x80, +0x00, 0x1A, 0xC0, 0xFF, 0x00, 0x0D, 0xF7, 0x0A, +0x0F, 0x98, 0x7E, 0x2E, 0x0F, 0x98, 0x80, 0x2D, +0xB0, 0x1A, 0x39, 0x0B, 0x4B, 0x00, 0xFF, 0xFF, +0xB1, 0x21, 0x5B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, +0x6B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x7B, 0x00, +0xFF, 0xFF, 0xB1, 0x21, 0x8B, 0x00, 0xFF, 0xFF, +0xB1, 0x21, 0x9B, 0x00, 0x06, 0x18, 0x17, 0x18, +0x26, 0x18, 0x37, 0x18, 0x0F, 0x98, 0x16, 0x15, +0x24, 0x18, 0x35, 0x18, 0x0F, 0x98, 0x57, 0x15, +0x28, 0x18, 0x39, 0x18, 0x0F, 0x98, 0x57, 0x15, +0x00, 0x0D, 0x41, 0x0B, 0x01, 0x0D, 0x42, 0x0B, +0x08, 0x18, 0x19, 0x18, 0x24, 0x18, 0x35, 0x18, +0x0F, 0x98, 0x57, 0x15, 0x20, 0x03, 0xC5, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x40, 0x15, 0x20, 0x03, +0x41, 0x0B, 0x30, 0x03, 0x42, 0x0B, 0xFF, 0xFF, +0x0F, 0x98, 0x7F, 0x15, 0x00, 0x4A, 0x40, 0x00, +0x2C, 0x80, 0x00, 0x1A, 0x40, 0x00, 0x00, 0x4A, +0xC0, 0xFF, 0x2A, 0x80, 0x00, 0x1A, 0xC0, 0xFF, +0x00, 0x0D, 0xF8, 0x0A, 0xA0, 0x03, 0x09, 0x0B, +0xA0, 0x49, 0x00, 0x82, 0xA0, 0x03, 0xDF, 0x0A, +0xA1, 0x49, 0xC0, 0x81, 0xA0, 0x03, 0xF1, 0x0A, +0xA1, 0x49, 0x20, 0x80, 0xB0, 0x03, 0xC6, 0x00, +0xFF, 0xFF, 0x21, 0x80, 0xB0, 0x03, 0xC7, 0x00, +0x00, 0x03, 0x3F, 0x0B, 0x10, 0x03, 0x40, 0x0B, +0x20, 0x03, 0x41, 0x0B, 0x30, 0x03, 0x42, 0x0B, +0x90, 0x19, 0x10, 0x49, 0x1C, 0x81, 0x0B, 0x48, +0xFC, 0x80, 0x90, 0x19, 0x30, 0x49, 0xCC, 0x80, +0x2B, 0x48, 0xAC, 0x80, 0x00, 0x0E, 0xDF, 0x0A, +0xA0, 0x1A, 0xBC, 0x0A, 0xA4, 0x21, 0xBA, 0x00, +0x0B, 0x0D, 0xF9, 0x0A, 0x91, 0x19, 0xFF, 0xA0, +0x0F, 0x98, 0x7E, 0x2E, 0x01, 0x0E, 0xDF, 0x0A, +0x00, 0x03, 0x09, 0x0B, 0x00, 0x49, 0x00, 0x88, +0x99, 0x2D, 0x01, 0x0E, 0xDE, 0x0A, 0x04, 0x49, +0x0D, 0x98, 0x29, 0x2F, 0xFF, 0xFF, 0x00, 0x03, +0x09, 0x0B, 0x04, 0x49, 0x0A, 0x98, 0xA4, 0x2F, +0xFF, 0xFF, 0x0F, 0x88, 0x99, 0x2D, 0x90, 0x1A, +0xCE, 0x0A, 0x29, 0x19, 0x0A, 0x00, 0x10, 0x18, +0x00, 0x62, 0xFF, 0x00, 0x90, 0x08, 0x91, 0x21, +0x21, 0x39, 0xF0, 0xA0, 0xFF, 0xFF, 0x18, 0x79, +0x91, 0x08, 0x91, 0x21, 0x21, 0x39, 0xF0, 0xA0, +0xFF, 0xFF, 0xA1, 0x21, 0xFF, 0x86, 0x00, 0x03, +0xBD, 0x0A, 0x10, 0x03, 0xBF, 0x0A, 0x00, 0x0D, +0xBF, 0x0A, 0x01, 0x0D, 0xBD, 0x0A, 0x00, 0x03, +0xBE, 0x0A, 0x10, 0x03, 0xC2, 0x0A, 0x00, 0x0D, +0xC2, 0x0A, 0x01, 0x0D, 0xBE, 0x0A, 0x00, 0x03, +0xC1, 0x0A, 0x10, 0x03, 0xC3, 0x0A, 0x00, 0x0D, +0xC3, 0x0A, 0x01, 0x0D, 0xC1, 0x0A, 0xFF, 0xA0, +0xA0, 0x03, 0x09, 0x0B, 0xA1, 0x49, 0x10, 0x81, +0xA2, 0x49, 0xB0, 0x81, 0xA3, 0x49, 0x50, 0x82, +0xA4, 0x49, 0xF0, 0x82, 0xA5, 0x49, 0x90, 0x83, +0xA6, 0x49, 0x00, 0x88, 0xEF, 0x2E, 0xA7, 0x49, +0x00, 0x88, 0x02, 0x2F, 0xA8, 0x49, 0x00, 0x88, +0x15, 0x2F, 0xA0, 0x1A, 0x41, 0x01, 0x0F, 0x98, +0x6A, 0x2E, 0x20, 0x03, 0xD4, 0x00, 0x02, 0x0D, +0xD7, 0x0A, 0x0F, 0x98, 0x29, 0x2F, 0x0F, 0x88, +0x27, 0x2F, 0xA0, 0x1A, 0x46, 0x01, 0x0F, 0x98, +0x6A, 0x2E, 0x20, 0x03, 0xD5, 0x00, 0x02, 0x0D, +0xD7, 0x0A, 0x0F, 0x98, 0x29, 0x2F, 0x0F, 0x88, +0x27, 0x2F, 0xA0, 0x1A, 0x4B, 0x01, 0x0F, 0x98, +0x6A, 0x2E, 0x20, 0x03, 0xD6, 0x00, 0x02, 0x0D, +0xD7, 0x0A, 0x0F, 0x98, 0x29, 0x2F, 0x0F, 0x88, +0x27, 0x2F, 0xA0, 0x1A, 0x50, 0x01, 0x0F, 0x98, +0x6A, 0x2E, 0x20, 0x03, 0xD7, 0x00, 0x02, 0x0D, +0xD7, 0x0A, 0x0F, 0x98, 0x29, 0x2F, 0x0F, 0x88, +0x27, 0x2F, 0xA0, 0x1A, 0x55, 0x01, 0x0F, 0x98, +0x6A, 0x2E, 0x20, 0x03, 0xDD, 0x00, 0x02, 0x0D, +0xD7, 0x0A, 0x20, 0x03, 0xD4, 0x00, 0x02, 0x0D, +0xD8, 0x0A, 0x20, 0x03, 0xD6, 0x00, 0x02, 0x0D, +0xD9, 0x0A, 0x0F, 0x98, 0xA4, 0x2F, 0x8F, 0x83, +0xA0, 0x1A, 0x5A, 0x01, 0x0F, 0x98, 0x6A, 0x2E, +0x20, 0x03, 0xDE, 0x00, 0x02, 0x0D, 0xD7, 0x0A, +0x20, 0x03, 0xD4, 0x00, 0x02, 0x0D, 0xD8, 0x0A, +0x20, 0x03, 0xD7, 0x00, 0x02, 0x0D, 0xD9, 0x0A, +0x0F, 0x98, 0xA4, 0x2F, 0x5F, 0x82, 0xA0, 0x1A, +0x5F, 0x01, 0x0F, 0x98, 0x6A, 0x2E, 0x20, 0x03, +0xDF, 0x00, 0x02, 0x0D, 0xD7, 0x0A, 0x20, 0x03, +0xD5, 0x00, 0x02, 0x0D, 0xD8, 0x0A, 0x20, 0x03, +0xD6, 0x00, 0x02, 0x0D, 0xD9, 0x0A, 0x0F, 0x98, +0xA4, 0x2F, 0x2F, 0x81, 0xA0, 0x1A, 0x64, 0x01, +0x0F, 0x98, 0x6A, 0x2E, 0x20, 0x03, 0xE0, 0x00, +0x02, 0x0D, 0xD7, 0x0A, 0x20, 0x03, 0xD5, 0x00, +0x02, 0x0D, 0xD8, 0x0A, 0x20, 0x03, 0xD7, 0x00, +0x02, 0x0D, 0xD9, 0x0A, 0x0F, 0x98, 0xA4, 0x2F, +0x0F, 0x88, 0x99, 0x2D, 0x90, 0x1A, 0xCE, 0x0A, +0xA0, 0x1A, 0xBC, 0x0A, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x5B, 0x00, 0xFF, 0xFF, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0x6B, 0x00, +0xFF, 0xFF, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x7B, 0x00, 0x85, 0x18, 0x86, 0x20, +0x87, 0x20, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x2B, 0x00, 0xFF, 0xFF, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0x3B, 0x00, +0xFF, 0xFF, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x4B, 0x00, 0xFF, 0xFF, 0x42, 0x20, +0x43, 0x20, 0x04, 0x18, 0x10, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, 0x28, 0x18, +0x0F, 0x98, 0x7F, 0x15, 0x80, 0x03, 0xD7, 0x0A, +0xFF, 0xFF, 0x80, 0x38, 0x15, 0x18, 0x00, 0x03, +0xDE, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0x16, 0x18, 0x00, 0x03, 0xDE, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x7F, 0x15, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0x17, 0x18, 0x00, 0x03, +0xDE, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0xFF, 0xA0, 0x90, 0x1A, 0xCE, 0x0A, 0xA0, 0x1A, +0xBC, 0x0A, 0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, +0x5B, 0x00, 0xFF, 0xFF, 0x91, 0x21, 0xB9, 0x00, +0xFF, 0xFF, 0xBA, 0x20, 0x6B, 0x00, 0x85, 0x18, +0x86, 0x20, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x7B, 0x00, 0xFF, 0xFF, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0x4B, 0x00, +0x04, 0x18, 0x07, 0x20, 0x10, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, 0x28, 0x18, +0x0F, 0x98, 0x7F, 0x15, 0x80, 0x03, 0xD8, 0x0A, +0xFF, 0xFF, 0x80, 0x38, 0x15, 0x18, 0x00, 0x03, +0xDE, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0x16, 0x18, 0x00, 0x03, 0xDE, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x7F, 0x15, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0x85, 0x18, 0x87, 0x20, +0x06, 0x18, 0x04, 0x20, 0x10, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, 0x28, 0x18, +0x0F, 0x98, 0x7F, 0x15, 0x80, 0x03, 0xD9, 0x0A, +0xFF, 0xFF, 0x80, 0x38, 0x15, 0x18, 0x00, 0x03, +0xDE, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x7F, 0x15, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0x17, 0x18, 0x00, 0x03, 0xDE, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x7F, 0x15, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0x85, 0x18, 0x04, 0x18, +0x10, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x25, 0x15, 0x28, 0x18, 0x0F, 0x98, 0x7F, 0x15, +0x80, 0x03, 0xD7, 0x0A, 0xFF, 0xFF, 0x80, 0x38, +0x15, 0x18, 0x00, 0x03, 0xDE, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0x25, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x7F, 0x15, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0xFF, 0xA0, 0x00, 0x03, +0x0D, 0x01, 0x80, 0x03, 0x0E, 0x01, 0x18, 0x18, +0x18, 0x79, 0x91, 0x18, 0x80, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0x25, 0x15, 0x20, 0x18, 0x31, 0x18, +0x0A, 0x00, 0x18, 0x18, 0x0F, 0x98, 0x25, 0x15, +0x0F, 0x98, 0xFF, 0x14, 0x89, 0x20, 0x28, 0x18, +0x0F, 0x98, 0x7F, 0x15, 0x00, 0x0D, 0x11, 0x00, +0xFF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x88, 0x00, 0xFF, 0xFF, 0x00, 0x00, +0xAA, 0xAA, 0x55, 0x55, 0x00, 0x00, 0x30, 0x40, +0x88, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, +0x10, 0x00, 0x2C, 0x58, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xF4, 0x01, 0xF4, 0x01, +0xF4, 0x01, 0xF4, 0x01, 0xF4, 0x01, 0x03, 0x00, +0x02, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x28, 0x00, +0x1E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1E, 0x00, +0x32, 0x00, 0x28, 0x00, 0x10, 0x00, 0x10, 0x00, +0x10, 0x00, 0x10, 0x04, 0x02, 0x00, 0x64, 0x00, +0x05, 0x1E, 0x20, 0x14, 0x00, 0x00, 0x00, 0x00, +0x19, 0x00, 0x04, 0x00, 0x14, 0x00, 0x1E, 0x00, +0x00, 0x00, 0x02, 0x01, 0x64, 0x00, 0x0A, 0x00, +0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x00, 0x01, +0x03, 0x02, 0x05, 0x00, 0xC8, 0x00, 0x14, 0x00, +0x0A, 0x00, 0xEC, 0xFF, 0x0A, 0x00, 0xC8, 0x00, +0x2C, 0x01, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, +0x0F, 0x00, 0xE8, 0x03, 0x2D, 0x00, 0xC8, 0x00, +0x03, 0x01, 0x50, 0x00, 0x0A, 0x00, 0x0A, 0x00, +0x00, 0x00, 0x50, 0x00, 0x0A, 0x00, 0x50, 0x00, +0x96, 0x00, 0x5E, 0x01, 0x10, 0x00, 0x0A, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x10, 0x11, 0x12, 0x13, 0x08, 0x09, 0x0A, 0x0B, +0x0C, 0x0D, 0x0E, 0x0F, 0x14, 0x15, 0x16, 0x17, +0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, +0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, +0xA4, 0x06, 0x01, 0x00, 0x96, 0x00, 0x64, 0x00, +0x20, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 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, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x19, 0x00, 0x96, 0x00, 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, 0x00, 0x03, 0x00, +0x26, 0x02, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x00, +0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9E, 0x00, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0xE0, 0x01, +0x01, 0x00, 0x0A, 0x00, 0x04, 0x00, 0xE8, 0x03, +0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0xC8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, +0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x04, 0x00, +0x0A, 0x00, 0x64, 0x00, 0x77, 0x77, 0x33, 0x33, +0x33, 0x33, 0xA4, 0x00, 0xA4, 0x00, 0xA4, 0x00, +0xA4, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x88, 0x88, +0x33, 0x33, 0x33, 0x33, 0x76, 0x00, 0x76, 0x00, +0x76, 0x00, 0x76, 0x00, 0x3C, 0x00, 0x04, 0x00, +0x2C, 0x01, 0x06, 0x00, 0x0F, 0x88, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x03, 0x04, 0x05, 0x06, +0x07, 0x08, 0x09, 0x0A, 0x02, 0x0B, 0x0C, 0x0D, +0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, +0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x09, 0x0C, +0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, +0x19, 0x19, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x64, 0x00, 0x12, 0x00, 0xC8, 0x00, 0x04, 0x00, +0xFA, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x19, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x77, 0x33, 0xFF, 0xFF, +0xFF, 0xFF, 0x05, 0x33, 0x11, 0x00, 0x33, 0x01, +0x01, 0x00, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x20, +0x70, 0x70, 0x7F, 0x00, 0x7F, 0x00, 0x08, 0x08, +0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, +0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, +0x07, 0x08, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, +0x05, 0x00, 0x01, 0x02, 0x06, 0x07, 0x08, 0x00, +0x01, 0x04, 0x07, 0x02, 0x05, 0x08, 0x00, 0x03, +0x06, 0x00, 0x01, 0x04, 0x07, 0x00, 0x03, 0x06, +0x02, 0x05, 0x08, 0x00, 0x04, 0x05, 0x07, 0x08, +0x01, 0x02, 0x03, 0x06, 0x00, 0x00, 0x04, 0x03, +0x07, 0x06, 0x01, 0x00, 0x05, 0x08, 0x02, 0x00, +0x04, 0x05, 0x01, 0x02, 0x07, 0x08, 0x03, 0x00, +0x06, 0x00, 0x04, 0x03, 0x01, 0x00, 0x07, 0x06, +0x05, 0x02, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, +0x08, 0x00, 0x09, 0x00, 0x02, 0x00, 0x03, 0x00, +0x0A, 0x00, 0x0B, 0x00, 0x04, 0x00, 0x05, 0x00, +0x0C, 0x00, 0x0D, 0x00, 0x06, 0x00, 0x07, 0x00, +0x0E, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x01, 0x00, +0x02, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x04, 0x00, +0x05, 0x00, 0x0F, 0x00, 0x06, 0x00, 0x07, 0x00, +0x08, 0x00, 0x12, 0x00, 0x09, 0x00, 0x0A, 0x00, +0x0B, 0x00, 0x15, 0x00, 0x0D, 0x00, 0x0E, 0x00, +0x18, 0x00, 0x19, 0x00, 0x10, 0x00, 0x11, 0x00, +0x1B, 0x00, 0x1C, 0x00, 0x13, 0x00, 0x14, 0x00, +0x1E, 0x00, 0x1F, 0x00, 0x16, 0x00, 0x17, 0x00, +0x21, 0x00, 0x22, 0x00, 0x1A, 0x00, 0x24, 0x00, +0x25, 0x00, 0x26, 0x00, 0x1D, 0x00, 0x27, 0x00, +0x28, 0x00, 0x29, 0x00, 0x20, 0x00, 0x2A, 0x00, +0x2B, 0x00, 0x2C, 0x00, 0x23, 0x00, 0x2D, 0x00, +0x2E, 0x00, 0x2F, 0x00, 0x0D, 0x00, 0x0D, 0x00, +0xA0, 0x00, 0x0D, 0x00, 0x33, 0x01, 0x0D, 0x00, +0x1A, 0x01, 0x26, 0x00, 0x33, 0x01, 0x46, 0x00, +0x1A, 0x01, 0x62, 0x00, 0x56, 0x00, 0x7E, 0x00, +0xEA, 0x00, 0x7E, 0x00, 0x33, 0x01, 0x7E, 0x00, +0x1A, 0x01, 0x9B, 0x00, 0x33, 0x01, 0xB7, 0x00, +0x1A, 0x01, 0xD4, 0x00, 0x0D, 0x00, 0xF0, 0x00, +0xA0, 0x00, 0xF0, 0x00, 0x33, 0x01, 0xF0, 0x00, +0x26, 0x00, 0x0C, 0x01, 0x0D, 0x00, 0x29, 0x01, +0x26, 0x00, 0x45, 0x01, 0x0D, 0x00, 0x62, 0x01, +0x56, 0x00, 0x62, 0x01, 0xEA, 0x00, 0x62, 0x01, +0x26, 0x00, 0x7E, 0x01, 0x0D, 0x00, 0x9A, 0x01, +0x31, 0x00, 0xBA, 0x01, 0x7B, 0x00, 0xBA, 0x01, +0xC5, 0x00, 0xBA, 0x01, 0x0F, 0x01, 0xBA, 0x01, +0x0D, 0x00, 0xD3, 0x01, 0x56, 0x00, 0xD3, 0x01, +0xA0, 0x00, 0xD3, 0x01, 0xEA, 0x00, 0xD3, 0x01, +0x33, 0x01, 0xD3, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, +}; +#endif diff --git a/drivers/input/touchscreen/zinitix_touch_bt4x3_reg_data.h b/drivers/input/touchscreen/zinitix_touch_bt4x3_reg_data.h new file mode 100644 index 00000000..0b4d1245 --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch_bt4x3_reg_data.h @@ -0,0 +1,366 @@ +/* +* +* Zinitix touch driver +* +* Copyright (C) 2009 Zinitix, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ +#ifndef _ZINITIX_BT4X3_REG_DATA_H +#define _ZINITIX_BT4X3_REG_DATA_H + +#define MAX_REG_COUNT 0x1D0 + +struct _zinitix_reg_data { + s16 reg_val; + u8 valid; +}; +const struct _zinitix_reg_data m_reg_data[MAX_REG_COUNT] = { + /*{value, valid}*/ + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 1}, + {0, 1}, + {0, 0}, + {0, 1}, + {0, 1}, + {10, 1}, + {16, 0}, + {0x022C, 1}, + {0xFFF8, 0}, + {0, 1}, + {0x0001, 0}, + {160, 0}, + {0, 0}, + {203, 0}, + {0, 0}, + {7, 0}, + {200, 1}, + {200, 1}, + {200, 1}, + {200, 1}, + {200, 1}, + {4, 1}, + {5, 1}, + {50, 1}, + {10, 1}, + {20, 1}, + {40, 1}, + {10, 1}, + {1000, 1}, + {20, 1}, + {40, 1}, + {40, 1}, + {16, 1}, + {16, 1}, + {16, 1}, + {0x0210, 1}, + {2, 1}, + {80, 1}, + {0x1E05, 1}, + {0x0410, 1}, + {6, 0}, + {9, 0}, + {0, 0}, + {2, 1}, + {25, 1}, + {160, 1}, + {0x0203, 1}, + {0x0203, 1}, + {80, 1}, + {10, 1}, + {5, 1}, + {0x010A, 1}, + {0x010A, 1}, + {256, 1}, + {0x0203, 1}, + {12, 1}, + {2, 1}, + {12, 1}, + {9, 1}, + {6, 1}, + {12, 1}, + {9, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {15, 1}, + {1000, 1}, + {20, 1}, + {200, 1}, + {0x0103, 1}, + {80, 1}, + {10, 1}, + {10, 1}, + {0, 1}, + {80, 1}, + {10, 1}, + {0, 0}, + {0, 0}, + {0, 0}, + {16, 1}, + {10, 1}, + {0x0100, 1}, + {0x0302, 1}, + {0x0504, 1}, + {0x0706, 1}, + {0x1110, 1}, + {0x1312, 1}, + {0x0908, 1}, + {0x0B0A, 1}, + {0x0D0C, 1}, + {0x0F0E, 1}, + {0x1514, 1}, + {0x1716, 1}, + {0x1918, 1}, + {0x1B1A, 1}, + {0x1D1C, 1}, + {0x1F1E, 1}, + {0x2120, 1}, + {0x2322, 1}, + {0x2524, 1}, + {0x2726, 1}, + {1700, 1}, + {1, 1}, + {128, 1}, + {63, 1}, + {32, 1}, + {20, 1}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {2, 1}, + {2, 1}, + {200, 1}, + {0, 1}, + {15, 1}, + {1, 1}, + {1, 1}, + {8, 1}, + {11, 1}, + {15, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 0}, + {480, 1}, + {800, 1}, + {0x0001, 1}, + {2, 1}, + {4, 1}, + {1200, 1}, + {170, 1}, + {64, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 1}, + {0, 0}, + {0, 0}, + {69, 1}, + {50, 1}, + {50, 1}, + {0, 0}, + {0, 0}, + {0x0005, 1}, + {0x0003, 1}, + {0x0003, 1}, + {0, 0}, + {0, 0}, + {2, 1}, + {100, 0}, + {0x5555, 1}, + {0x4444, 1}, + {0x3333, 1}, + {169, 1}, + {169, 1}, + {171, 1}, + {170, 1}, + {0, 0}, + {0, 0}, + {0x7777, 1}, + {0x4444, 1}, + {0x4444, 1}, + {137, 1}, + {136, 1}, + {139, 1}, + {138, 1}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + {0x880F, 1}, + {0, 1}, + {0, 0}, + {0x0100, 1}, + {0x0403, 1}, + {0x0605, 1}, + {0x0807, 1}, + {0x0A09, 1}, + {0x0B02, 1}, + {0x0D0C, 1}, + {0x0F0E, 1}, + {0x1110, 1}, + {0x1312, 1}, + {0x1514, 1}, + {0x1716, 1}, + {0x1918, 1}, + {40, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x2828, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0, 1}, + {0, 1}, + {10, 1}, + {63, 1}, + {0x0000, 1}, + {0x0000, 0}, + {0x0000, 1}, + {0x0000, 1}, + {0x0000, 0}, + {0x0000, 0}, + {0, 0}, + {2, 1}, + {1, 1}, + {0, 0}, + {0, 0}, + {0, 0}, + {0x3333, 1}, + {0xFFFF, 1}, + {0xFFFF, 1}, + {0x3305, 1}, + {0x0011, 1}, + {0x0133, 1}, + {0x0001, 1}, + {0x00FF, 1}, + {0x0011, 1}, + {0x0000, 1}, + {0x0002, 1}, + {0x007F, 1}, + {0x007F, 1}, + {0x0808, 1}, + {0x0001, 1}, + {0x0000, 1}, + {0x0300, 1}, + {0x0800, 1}, + {0x0800, 1}, + {0x0004, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0001, 1}, + {0x0001, 1}, + {0x0000, 1}, + {0x0000, 1}, + {0x0008, 1}, + {0x0001, 1}, + {0, 0}, + {0, 0}, + {0, 0}, + {0, 0}, + +}; +#endif diff --git a/drivers/input/touchscreen/zinitix_touch_bt4x4_firmware.h b/drivers/input/touchscreen/zinitix_touch_bt4x4_firmware.h new file mode 100644 index 00000000..31de784f --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch_bt4x4_firmware.h @@ -0,0 +1,4126 @@ +/* +* +* Zinitix touch driver +* +* Copyright (C) 2009 Zinitix, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ +/* +Release Date : 12/11/19, 17:34 + +Version Info : + Firmware Version : 0x0086 + Register Version : 10 +*/ +#ifndef _ZINITIX_BT4x3_CODE_H +#define _ZINITIX_BT4x3_CODE_H + +u8 m_firmware_data[] = { +0x86, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x0F, 0x88, 0x20, 0x00, 0x0F, 0x88, +0x00, 0x04, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0x0F, 0x88, 0x7B, 0x00, 0x0F, 0x88, +0x7B, 0x00, 0xF0, 0x1A, 0xFF, 0x0F, 0x00, 0x0E, +0x08, 0xF3, 0xA0, 0x1A, 0xFF, 0x0F, 0xA0, 0x0B, +0xA1, 0x39, 0xD5, 0x87, 0x0F, 0x98, 0x0D, 0x01, +0xC0, 0x03, 0x0D, 0x00, 0xC0, 0x51, 0x00, 0x98, +0xDC, 0x00, 0xFF, 0xFF, 0x00, 0x1A, 0xE0, 0x3F, +0x00, 0x0D, 0x05, 0xF3, 0xAF, 0x80, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x0F, 0x98, 0x95, 0x01, 0x00, 0x0E, +0xEA, 0x0D, 0x00, 0x0E, 0x03, 0xF0, 0x00, 0x1A, +0xFF, 0xFF, 0x03, 0xC9, 0x00, 0x0D, 0x02, 0xF0, +0x00, 0x0E, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x03, +0x55, 0x00, 0x00, 0x4A, 0x14, 0x00, 0x2D, 0x80, +0x0F, 0x0E, 0x55, 0x00, 0x00, 0x49, 0x2A, 0x80, +0x0F, 0x0E, 0x55, 0x00, 0x00, 0x03, 0x56, 0x00, +0x00, 0x4A, 0x10, 0x00, 0x2D, 0x80, 0x08, 0x0E, +0x56, 0x00, 0x00, 0x49, 0x2A, 0x80, 0x08, 0x0E, +0x56, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x4A, +0xA0, 0x00, 0x4D, 0x80, 0x10, 0x1A, 0xA0, 0x00, +0x01, 0x0D, 0x10, 0x00, 0x00, 0x49, 0x4A, 0x80, +0x10, 0x1A, 0xA0, 0x00, 0x01, 0x0D, 0x10, 0x00, +0x90, 0x03, 0x00, 0xF2, 0x09, 0x0D, 0x0F, 0x00, +0x0F, 0x98, 0x3B, 0x04, 0x0F, 0x88, 0xDD, 0x05, +0xFF, 0xFF, 0xEF, 0x87, 0xA0, 0x4A, 0x00, 0x32, +0x01, 0x88, 0xD8, 0x05, 0xFF, 0xFF, 0xC0, 0x4A, +0xC6, 0x0E, 0x21, 0x80, 0xA0, 0x1A, 0xC0, 0x3F, +0x03, 0x0E, 0x08, 0xF3, 0x0A, 0x0D, 0x05, 0xF3, +0x0C, 0x0D, 0x06, 0xF3, 0x0F, 0x98, 0x01, 0x01, +0xFF, 0xFF, 0xA0, 0x22, 0x20, 0x00, 0xC0, 0x22, +0x20, 0x00, 0xB0, 0x3A, 0x20, 0x00, 0xB0, 0x49, +0x1A, 0x87, 0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x00, 0x0E, 0x08, 0xF3, 0x0F, 0x88, +0xD8, 0x05, 0x03, 0x0E, 0x08, 0xF3, 0x0A, 0x0D, +0x05, 0xF3, 0x0C, 0x0D, 0x06, 0xF3, 0xB1, 0x39, +0x0B, 0x0D, 0x04, 0xF3, 0x0F, 0x98, 0xFE, 0x00, +0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, +0x00, 0x0E, 0x08, 0xF3, 0x0F, 0x98, 0x5B, 0x01, +0xFF, 0xA0, 0xA0, 0x1A, 0x00, 0x38, 0xC0, 0x1A, +0x35, 0x07, 0xB0, 0x03, 0x10, 0x00, 0x2F, 0x84, +0xA0, 0x4A, 0x00, 0x32, 0x01, 0x88, 0xD8, 0x05, +0xFF, 0xFF, 0x03, 0x0E, 0x0E, 0xF3, 0x95, 0x19, +0xA0, 0x1A, 0x00, 0x90, 0xB0, 0x1A, 0x00, 0x38, +0x0A, 0x0D, 0x06, 0xF3, 0x0B, 0x0D, 0x05, 0xF3, +0x0F, 0x98, 0x01, 0x01, 0xFF, 0xFF, 0xA0, 0x22, +0x20, 0x00, 0xB0, 0x22, 0x20, 0x00, 0x91, 0x39, +0x31, 0x87, 0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x02, 0x0E, 0x0E, 0xF3, 0x0F, 0x88, +0xD8, 0x05, 0xA0, 0x1A, 0x00, 0x38, 0xC0, 0x1A, +0x35, 0x07, 0xB0, 0x03, 0x10, 0x00, 0x0F, 0x88, +0xA0, 0x00, 0x03, 0x0E, 0x0E, 0xF3, 0x00, 0x1A, +0x00, 0x38, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x1A, +0x00, 0x90, 0x00, 0x0D, 0x06, 0xF3, 0x00, 0x03, +0x10, 0x00, 0xFF, 0xFF, 0x01, 0x39, 0x00, 0x0D, +0x04, 0xF3, 0x0F, 0x98, 0xFE, 0x00, 0x00, 0x1A, +0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, 0x02, 0x0E, +0x0E, 0xF3, 0x0F, 0x88, 0xD8, 0x05, 0x01, 0x0E, +0x00, 0xF3, 0x7F, 0x80, 0x00, 0x03, 0xEA, 0x0D, +0x01, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x01, 0x0E, +0x01, 0xF3, 0x00, 0x03, 0x00, 0xF3, 0x00, 0x51, +0xC1, 0x87, 0xFF, 0xA0, 0x03, 0x0E, 0x08, 0xF3, +0x00, 0x1A, 0x00, 0x32, 0x00, 0x0D, 0x05, 0xF3, +0x00, 0x19, 0x00, 0x0D, 0x06, 0xF3, 0x00, 0x19, +0x10, 0x1A, 0xA9, 0x01, 0x10, 0x38, 0x01, 0x0D, +0x04, 0xF3, 0x01, 0x0E, 0x00, 0xF3, 0x00, 0x03, +0x00, 0xF3, 0x00, 0x51, 0xC1, 0x87, 0x00, 0x1A, +0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x0E, +0x08, 0xF3, 0xB0, 0x1A, 0x14, 0x00, 0xA0, 0x1A, +0x75, 0x00, 0xA0, 0x0B, 0xA1, 0x21, 0xB1, 0x39, +0xC1, 0x87, 0x0F, 0x98, 0x33, 0x01, 0xFF, 0xA0, +0x00, 0x0E, 0x04, 0xF9, 0x00, 0x0E, 0x05, 0xF9, +0x00, 0x0E, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x40, 0x1A, 0xA9, 0x01, 0x41, 0x39, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, 0x24, 0x00, +0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x41, 0x39, 0x40, 0x49, 0x0B, 0x87, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0xA1, 0x00, 0x01, 0x0D, 0xA2, 0x00, 0x00, 0x0D, +0xC2, 0x0E, 0x01, 0x0D, 0xC3, 0x0E, 0xFF, 0xA0, +0x00, 0x0E, 0x04, 0xF9, 0x00, 0x0E, 0x05, 0xF9, +0x00, 0x0E, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x50, 0x1A, 0x35, 0x07, 0x40, 0x03, 0x10, 0x00, +0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, +0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, +0x25, 0x00, 0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, +0x07, 0xF9, 0x51, 0x21, 0x41, 0x39, 0x01, 0x87, +0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, +0x00, 0x0D, 0xC4, 0x0E, 0x01, 0x0D, 0xC5, 0x0E, +0x20, 0x03, 0xA1, 0x00, 0x30, 0x03, 0xA2, 0x00, +0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, +0x02, 0x0D, 0x06, 0xF9, 0x03, 0x0D, 0x07, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0xA1, 0x00, 0x01, 0x0D, +0xA2, 0x00, 0xFF, 0xA0, 0x00, 0x0E, 0x04, 0xF9, +0x00, 0x0E, 0x05, 0xF9, 0x00, 0x0E, 0x06, 0xF9, +0x00, 0x0E, 0x07, 0xF9, 0x90, 0x1A, 0x90, 0x01, +0x80, 0x19, 0x03, 0x0E, 0x08, 0xF3, 0x08, 0x18, +0x05, 0x7B, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x1A, +0xCC, 0x0E, 0x00, 0x0D, 0x06, 0xF3, 0x10, 0x1A, +0x1F, 0x00, 0x01, 0x0D, 0x04, 0xF3, 0x01, 0x0E, +0x00, 0xF3, 0x00, 0x03, 0x00, 0xF3, 0x00, 0x51, +0xC1, 0x87, 0x00, 0x1A, 0xE0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x00, 0x0E, 0x08, 0xF3, 0x40, 0x1A, +0x20, 0x00, 0x50, 0x1A, 0xCC, 0x0E, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, 0x25, 0x00, +0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x51, 0x21, 0x41, 0x39, 0x01, 0x87, 0x81, 0x21, +0x91, 0x39, 0xF1, 0x84, 0x00, 0x03, 0x03, 0xF9, +0x10, 0x03, 0x04, 0xF9, 0x20, 0x03, 0xA1, 0x00, +0x30, 0x03, 0xA2, 0x00, 0x00, 0x0D, 0xC0, 0x0E, +0x01, 0x0D, 0xC1, 0x0E, 0x00, 0x0D, 0x04, 0xF9, +0x01, 0x0D, 0x05, 0xF9, 0x02, 0x0D, 0x06, 0xF9, +0x03, 0x0D, 0x07, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0xA1, 0x00, 0x01, 0x0D, 0xA2, 0x00, 0x03, 0x0E, +0x08, 0xF3, 0x00, 0x1A, 0xC0, 0x3F, 0x00, 0x0D, +0x05, 0xF3, 0x00, 0x1A, 0xC6, 0x0E, 0x00, 0x0D, +0x06, 0xF3, 0x10, 0x1A, 0x1F, 0x00, 0x01, 0x0D, +0x04, 0xF3, 0x01, 0x0E, 0x00, 0xF3, 0x00, 0x03, +0x00, 0xF3, 0x00, 0x51, 0xC1, 0x87, 0x00, 0x1A, +0xE0, 0x3F, 0x00, 0x0D, 0x05, 0xF3, 0x00, 0x0E, +0x08, 0xF3, 0x00, 0x03, 0x0D, 0x00, 0x00, 0x51, +0x90, 0x80, 0xA0, 0x1A, 0xC6, 0x0E, 0x00, 0x03, +0xC0, 0x0E, 0xA0, 0x08, 0xA1, 0x21, 0x00, 0x03, +0xC1, 0x0E, 0xA0, 0x08, 0x00, 0x0E, 0x04, 0xF9, +0x00, 0x0E, 0x05, 0xF9, 0x00, 0x0E, 0x06, 0xF9, +0x00, 0x0E, 0x07, 0xF9, 0x43, 0x19, 0x50, 0x1A, +0xC6, 0x0E, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, +0x05, 0xF9, 0x25, 0x00, 0x02, 0x0D, 0x06, 0xF9, +0x51, 0x21, 0x35, 0x00, 0x03, 0x0D, 0x07, 0xF9, +0x51, 0x21, 0x41, 0x39, 0xE1, 0x86, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0xA3, 0x00, 0x01, 0x0D, 0xA4, 0x00, 0xFF, 0xA0, +0x00, 0x0E, 0xA1, 0x00, 0x00, 0x0E, 0xA2, 0x00, +0x00, 0x0E, 0xA3, 0x00, 0x00, 0x0E, 0xA4, 0x00, +0x10, 0x1A, 0x20, 0x00, 0x00, 0x1A, 0x75, 0x00, +0x00, 0x0B, 0x01, 0x21, 0x11, 0x39, 0xC1, 0x87, +0xFF, 0xA0, 0x00, 0x0E, 0x04, 0xF9, 0x00, 0x0E, +0x05, 0xF9, 0x00, 0x0E, 0x06, 0xF9, 0x00, 0x0E, +0x07, 0xF9, 0x50, 0x19, 0x40, 0x1A, 0xA9, 0x01, +0x45, 0x38, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, +0x05, 0xF9, 0x25, 0x00, 0x02, 0x0D, 0x06, 0xF9, +0x00, 0x0E, 0x07, 0xF9, 0x51, 0x21, 0x41, 0x39, +0x01, 0x87, 0x00, 0x03, 0x03, 0xF9, 0x10, 0x03, +0x04, 0xF9, 0xA0, 0x1A, 0xC6, 0x0E, 0xA2, 0x21, +0xA0, 0x08, 0xA1, 0x21, 0xA1, 0x08, 0x00, 0x0E, +0x04, 0xF9, 0x00, 0x0E, 0x05, 0xF9, 0x00, 0x0E, +0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, 0x50, 0x1A, +0x35, 0x07, 0x40, 0x03, 0x10, 0x00, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, +0x04, 0xF9, 0x01, 0x0D, 0x05, 0xF9, 0x25, 0x00, +0x02, 0x0D, 0x06, 0xF9, 0x00, 0x0E, 0x07, 0xF9, +0x51, 0x21, 0x41, 0x39, 0x01, 0x87, 0x00, 0x03, +0x03, 0xF9, 0x10, 0x03, 0x04, 0xF9, 0xA0, 0x1A, +0xC6, 0x0E, 0xA4, 0x21, 0xA0, 0x08, 0xA1, 0x21, +0xA1, 0x08, 0xA1, 0x21, 0x90, 0x1A, 0xC2, 0x0E, +0x09, 0x00, 0xA0, 0x08, 0x91, 0x21, 0xA1, 0x21, +0x09, 0x00, 0xA0, 0x08, 0x91, 0x21, 0xA1, 0x21, +0x09, 0x00, 0xA0, 0x08, 0x91, 0x21, 0xA1, 0x21, +0x09, 0x00, 0xA0, 0x08, 0xFF, 0xA0, 0x0F, 0x98, +0xCD, 0x0C, 0x0F, 0x98, 0x4A, 0x08, 0x0F, 0x98, +0xD7, 0x02, 0x00, 0x0E, 0x07, 0xF3, 0x02, 0x0E, +0x01, 0xFF, 0x02, 0x0E, 0x05, 0xFF, 0x01, 0x0E, +0x07, 0xF5, 0x00, 0x1A, 0x00, 0x20, 0x00, 0x0D, +0x01, 0xF2, 0xA0, 0x1A, 0x10, 0x00, 0x01, 0x0E, +0x02, 0xFF, 0xA1, 0x39, 0xE1, 0x87, 0x00, 0x19, +0x00, 0x0D, 0x01, 0xF2, 0xA0, 0x1A, 0x00, 0x02, +0xA1, 0x39, 0xE1, 0x87, 0x01, 0x0E, 0x07, 0xF3, +0xA0, 0x1A, 0x00, 0x02, 0xA1, 0x39, 0xE1, 0x87, +0x00, 0x0E, 0x07, 0xF5, 0x0F, 0x98, 0xCF, 0x08, +0x00, 0x0E, 0xBB, 0x01, 0x0F, 0x88, 0xD8, 0x05, +0x00, 0x0E, 0x10, 0xF8, 0x00, 0x0E, 0x11, 0xF8, +0x00, 0x0E, 0x40, 0xF8, 0x00, 0x0E, 0x28, 0xF8, +0x00, 0x0E, 0x28, 0xF8, 0x00, 0x0E, 0x49, 0xF8, +0x00, 0x0E, 0x4B, 0xF8, 0x00, 0x0E, 0x29, 0xF8, +0x0F, 0x88, 0xD8, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFE, 0x10, 0xFD, 0x10, 0xFC, 0x10, +0xFB, 0x10, 0xFA, 0x10, 0xF9, 0x10, 0xF8, 0x10, +0xF7, 0x10, 0xF6, 0x10, 0xF5, 0x10, 0xF4, 0x10, +0xF3, 0x10, 0xF2, 0x10, 0xF1, 0x10, 0xF0, 0x10, +0x50, 0x03, 0x01, 0xF5, 0x50, 0x51, 0xA1, 0x80, +0x0F, 0x98, 0xF4, 0x04, 0xB1, 0x49, 0xAD, 0x80, +0xB0, 0x4A, 0x10, 0x00, 0x7A, 0x80, 0x0F, 0x98, +0x34, 0x05, 0x4F, 0x80, 0x00, 0x1A, 0x31, 0x00, +0x00, 0x0D, 0x00, 0xF5, 0x00, 0x03, 0x03, 0xF0, +0x03, 0xC9, 0x00, 0x0D, 0x03, 0xF0, 0x0F, 0x11, +0x1F, 0x11, 0x2F, 0x11, 0x3F, 0x11, 0x4F, 0x11, +0x5F, 0x11, 0x6F, 0x11, 0x7F, 0x11, 0x8F, 0x11, +0x9F, 0x11, 0xAF, 0x11, 0xBF, 0x11, 0xCF, 0x11, +0xDF, 0x11, 0xEF, 0x11, 0xFF, 0xFF, 0x3F, 0xA8, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x1A, 0x40, 0x00, 0x00, 0x0D, 0x03, 0xF5, +0x00, 0x0E, 0x05, 0xF5, 0x00, 0x1A, 0xFF, 0x07, +0x00, 0x0D, 0x06, 0xF5, 0x00, 0x03, 0x01, 0xF5, +0x00, 0x0E, 0x01, 0xF5, 0x00, 0x1A, 0x31, 0x00, +0x00, 0x0D, 0x00, 0xF5, 0x01, 0x0E, 0x09, 0xF3, +0x01, 0x0E, 0x0A, 0xF3, 0x00, 0x19, 0x00, 0x0D, +0x0A, 0xF5, 0x00, 0x03, 0x09, 0xF5, 0x00, 0xC9, +0x00, 0x0D, 0x09, 0xF5, 0x10, 0x03, 0x08, 0xF5, +0x10, 0xC9, 0x01, 0x0D, 0x08, 0xF5, 0xFF, 0xA0, +0x00, 0x03, 0x00, 0xF5, 0x00, 0x51, 0xC1, 0x87, +0xFF, 0xA0, 0x00, 0x03, 0x09, 0xF5, 0x00, 0x51, +0xC1, 0x87, 0xFF, 0xA0, 0x00, 0x0E, 0xBA, 0x01, +0x00, 0x03, 0x09, 0xF5, 0x00, 0xC1, 0x00, 0x0D, +0x09, 0xF5, 0xFF, 0xA0, 0x00, 0x03, 0x09, 0xF5, +0x00, 0xC9, 0x00, 0x0D, 0x09, 0xF5, 0xFF, 0xA0, +0x01, 0x0E, 0x09, 0xF3, 0x00, 0x1A, 0x91, 0x00, +0x00, 0x0D, 0x00, 0xF5, 0xFF, 0xA0, 0x0F, 0x98, +0x63, 0x04, 0x00, 0x0E, 0x09, 0xF3, 0xA0, 0x1A, +0x00, 0x40, 0x0B, 0x00, 0xA0, 0x08, 0xA1, 0x21, +0xB1, 0x21, 0x91, 0x39, 0xA1, 0x87, 0x01, 0x0E, +0x09, 0xF3, 0xFF, 0xA0, 0x0F, 0x98, 0x63, 0x04, +0x00, 0x0E, 0x09, 0xF3, 0xA0, 0x1A, 0x00, 0x40, +0x0B, 0x00, 0xA0, 0x08, 0xA1, 0x21, 0xB1, 0x21, +0x91, 0x39, 0xA1, 0x87, 0x93, 0x19, 0x30, 0x03, +0x0A, 0x00, 0xFF, 0xFF, 0x93, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x1E, 0x92, 0x21, +0x00, 0x03, 0x4A, 0x0B, 0x10, 0x03, 0xE5, 0x00, +0xFF, 0xFF, 0x01, 0x60, 0x41, 0x80, 0xA0, 0x0B, +0x01, 0x0E, 0x09, 0xF3, 0xFF, 0xA0, 0xB0, 0x1A, +0x75, 0x00, 0x0B, 0x00, 0xA0, 0x08, 0xA1, 0x21, +0xB1, 0x21, 0x91, 0x39, 0xA1, 0x87, 0x01, 0x0E, +0x09, 0xF3, 0xFF, 0xA0, 0x0F, 0x98, 0x63, 0x04, +0x00, 0x0E, 0x09, 0xF3, 0xA0, 0x1A, 0x00, 0x40, +0x0B, 0x00, 0xA0, 0x08, 0xA1, 0x21, 0xB1, 0x21, +0x91, 0x39, 0xA1, 0x87, 0xB0, 0x1A, 0x4A, 0x0B, +0x0B, 0x00, 0xA0, 0x08, 0xA1, 0x21, 0xB0, 0x1A, +0x77, 0x00, 0x0B, 0x00, 0xA0, 0x08, 0xA1, 0x21, +0xB1, 0x21, 0x0B, 0x00, 0xA0, 0x08, 0x01, 0x0E, +0x09, 0xF3, 0xFF, 0xA0, 0x0F, 0x98, 0x63, 0x04, +0x00, 0x0E, 0x09, 0xF3, 0xA0, 0x1A, 0x00, 0x40, +0x0A, 0x00, 0xB0, 0x08, 0xA1, 0x21, 0xB1, 0x21, +0x91, 0x39, 0xA1, 0x87, 0x01, 0x0E, 0x09, 0xF3, +0xFF, 0xA0, 0x01, 0x0E, 0xEC, 0x0E, 0x00, 0x0E, +0xBB, 0x01, 0x00, 0x03, 0x70, 0x00, 0x00, 0x0D, +0xBC, 0x01, 0x0F, 0x98, 0x18, 0x10, 0x0F, 0x88, +0x75, 0x04, 0xB0, 0x03, 0x06, 0xF5, 0x2B, 0x18, +0xB1, 0x49, 0xFD, 0xA0, 0xFF, 0xFF, 0xB0, 0x4A, +0x10, 0x00, 0xFB, 0xA0, 0xFF, 0xFF, 0x21, 0x79, +0x02, 0x0D, 0xC1, 0x01, 0x10, 0x1A, 0x10, 0xF5, +0x30, 0x1A, 0xAA, 0x01, 0x41, 0x00, 0x40, 0x62, +0xFF, 0x00, 0x11, 0x21, 0x51, 0x00, 0xFF, 0xFF, +0x58, 0x7B, 0x54, 0x68, 0x35, 0x08, 0x11, 0x21, +0x31, 0x21, 0x21, 0x39, 0x31, 0x87, 0xFF, 0xA0, +0x10, 0x20, 0x30, 0x03, 0xC1, 0x01, 0x31, 0x49, +0x11, 0x81, 0x30, 0x1A, 0x10, 0xF5, 0x28, 0x19, +0x01, 0x00, 0x00, 0x62, 0xFF, 0x00, 0x30, 0x08, +0x31, 0x21, 0x01, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0x30, 0x08, 0x31, 0x21, 0x11, 0x21, 0x21, 0x39, +0x31, 0x87, 0xFF, 0xA0, 0x30, 0x03, 0xC1, 0x01, +0x32, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x30, 0x1A, +0xAA, 0x01, 0x31, 0x21, 0x03, 0x00, 0x10, 0x08, +0xFF, 0xA0, 0x30, 0x1A, 0xAA, 0x01, 0x03, 0x00, +0x00, 0x4A, 0x80, 0x00, 0xDC, 0x80, 0x00, 0x4A, +0x9F, 0x00, 0xAA, 0x80, 0xA0, 0x03, 0x05, 0x00, +0xA0, 0x49, 0x00, 0x88, 0x7B, 0x04, 0x10, 0x1A, +0x75, 0x00, 0x00, 0x3A, 0x80, 0x00, 0xCF, 0x84, +0x00, 0x4A, 0x00, 0x02, 0x00, 0x88, 0x7B, 0x04, +0x00, 0x49, 0x00, 0x88, 0xE8, 0x04, 0x01, 0x49, +0x00, 0x88, 0xE8, 0x04, 0x03, 0x49, 0x00, 0x88, +0x75, 0x04, 0x04, 0x49, 0x41, 0x80, 0x01, 0x0E, +0xBB, 0x01, 0x0F, 0x88, 0x75, 0x04, 0x05, 0x49, +0x41, 0x80, 0x01, 0x0E, 0xBB, 0x01, 0x0F, 0x88, +0x75, 0x04, 0x06, 0x49, 0x41, 0x80, 0x01, 0x0E, +0xBD, 0x01, 0x0F, 0x88, 0x75, 0x04, 0x08, 0x49, +0xD1, 0x80, 0xA0, 0x1A, 0x00, 0x32, 0x0F, 0x98, +0xBB, 0x00, 0xA0, 0x03, 0x0D, 0x00, 0xA2, 0xC9, +0xA1, 0xC9, 0x0A, 0x0D, 0x0D, 0x00, 0x01, 0x0E, +0xEA, 0x0D, 0x7F, 0x80, 0x07, 0x49, 0xE1, 0x81, +0xC0, 0x03, 0x0D, 0x00, 0xC1, 0xC9, 0x0C, 0x0D, +0x0D, 0x00, 0xA0, 0x1A, 0x00, 0x32, 0xC0, 0x19, +0xB0, 0x1A, 0x41, 0x01, 0xBC, 0x38, 0x0F, 0x98, +0x3B, 0x02, 0x0F, 0x98, 0x7D, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x4C, 0x02, 0xA0, 0x1A, 0x00, 0x32, +0xC0, 0x1A, 0xC6, 0x0E, 0xB0, 0x1A, 0x20, 0x00, +0x0F, 0x98, 0x82, 0x00, 0x00, 0x0E, 0xEA, 0x0D, +0x0F, 0x88, 0x75, 0x04, 0x0F, 0x49, 0x00, 0x88, +0x75, 0x04, 0x00, 0x03, 0xAA, 0x01, 0x00, 0x4A, +0xD0, 0x01, 0xFB, 0xA0, 0xFF, 0xFF, 0x20, 0x03, +0x05, 0x00, 0x02, 0x0D, 0xBB, 0x0D, 0x15, 0x19, +0x00, 0x3A, 0x10, 0x00, 0x0F, 0x98, 0x13, 0x05, +0x90, 0x03, 0xC1, 0x01, 0x91, 0x49, 0xFD, 0xA0, +0xFF, 0xFF, 0x00, 0x03, 0xAA, 0x01, 0x00, 0x4A, +0x10, 0x00, 0x11, 0x81, 0x0F, 0x98, 0x75, 0x04, +0x00, 0x03, 0x05, 0x00, 0x05, 0x49, 0x3D, 0x80, +0x02, 0x0E, 0xBD, 0x01, 0xFF, 0xA0, 0x00, 0x03, +0xBB, 0x0D, 0x05, 0x49, 0xFD, 0xA0, 0xFF, 0xFF, +0x02, 0x0E, 0xBD, 0x01, 0xFF, 0xA0, 0x00, 0x4A, +0x60, 0x00, 0x7C, 0x80, 0x00, 0x4A, 0x7F, 0x00, +0x4A, 0x80, 0x02, 0x0E, 0xBD, 0x01, 0x0F, 0x88, +0x75, 0x04, 0x00, 0x4A, 0x00, 0x01, 0xFC, 0xA0, +0xFF, 0xFF, 0x00, 0x4A, 0x4F, 0x01, 0xFA, 0xA0, +0xFF, 0xFF, 0x02, 0x0E, 0xBD, 0x01, 0x0F, 0x88, +0x75, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x98, 0x4A, 0x08, +0x00, 0x03, 0x0E, 0x00, 0x00, 0x0D, 0x05, 0x00, +0x0F, 0x98, 0x4A, 0x10, 0x0F, 0x98, 0xD2, 0x0C, +0x0F, 0x98, 0x75, 0x04, 0x00, 0x0E, 0xBD, 0x01, +0x0F, 0x98, 0xCF, 0x08, 0x0F, 0x98, 0x39, 0x09, +0x00, 0x03, 0x70, 0x00, 0x00, 0x0D, 0xBC, 0x01, +0x0F, 0x98, 0x2E, 0x0A, 0x00, 0x0E, 0x05, 0xF8, +0x0F, 0x98, 0xAC, 0x0C, 0x0F, 0x98, 0xCD, 0x0C, +0x0F, 0x98, 0x18, 0x10, 0xA0, 0x03, 0x21, 0x01, +0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, 0x10, 0x80, +0xA1, 0x19, 0x0A, 0x0D, 0xBD, 0x0D, 0x0F, 0x98, +0xA1, 0x0C, 0x0F, 0x98, 0xE3, 0x0A, 0x00, 0x03, +0xBB, 0x01, 0x01, 0x49, 0x00, 0x98, 0xAA, 0x02, +0xFF, 0xFF, 0x00, 0x03, 0xBE, 0x01, 0x00, 0x49, +0x41, 0x87, 0x00, 0x03, 0xBD, 0x01, 0x01, 0x49, +0x00, 0x88, 0xC1, 0x06, 0x02, 0x49, 0x80, 0x84, +0x00, 0x03, 0x05, 0x00, 0x05, 0x49, 0x0D, 0x81, +0x00, 0x4A, 0x33, 0x00, 0x40, 0x82, 0x09, 0x49, +0xB0, 0x80, 0x08, 0x49, 0x00, 0x82, 0x0C, 0x49, +0x00, 0x88, 0x8E, 0x06, 0x0D, 0x49, 0x00, 0x88, +0x8E, 0x06, 0x0A, 0x49, 0x01, 0x88, 0xAC, 0x06, +0x00, 0x03, 0x05, 0x00, 0x0A, 0x49, 0x71, 0x80, +0x00, 0x03, 0x4A, 0x0B, 0x0B, 0x51, 0x01, 0x98, +0xF1, 0x06, 0xFF, 0xFF, 0xCF, 0x80, 0x00, 0x03, +0x05, 0x00, 0x03, 0x49, 0x8B, 0x80, 0x00, 0x03, +0x4A, 0x0B, 0x10, 0x03, 0xE5, 0x00, 0xFF, 0xFF, +0x01, 0x60, 0x01, 0x98, 0xF1, 0x06, 0xFF, 0xFF, +0x0F, 0x98, 0x78, 0x08, 0x00, 0x03, 0x05, 0x00, +0x00, 0x4A, 0x33, 0x00, 0xA1, 0x81, 0x00, 0x03, +0xE6, 0x00, 0x00, 0x49, 0x80, 0x83, 0x00, 0x03, +0xE6, 0x00, 0x10, 0x03, 0xBA, 0x01, 0xFF, 0xFF, +0x11, 0x21, 0x01, 0x0D, 0xBA, 0x01, 0x10, 0x48, +0xEC, 0x82, 0x0F, 0x98, 0x68, 0x04, 0xB0, 0x1A, +0xF2, 0x05, 0x90, 0x03, 0x06, 0x02, 0xFF, 0xFF, +0x0F, 0x98, 0xBD, 0x04, 0x0F, 0x98, 0x6D, 0x04, +0x2F, 0x82, 0x00, 0x03, 0x05, 0x00, 0x03, 0x49, +0xEB, 0x81, 0x00, 0x03, 0xE6, 0x00, 0x00, 0x49, +0xA0, 0x81, 0x00, 0x03, 0xE6, 0x00, 0x10, 0x03, +0xBA, 0x01, 0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, +0xBA, 0x01, 0x10, 0x48, 0x0C, 0x81, 0x30, 0x1A, +0x75, 0x00, 0x30, 0x0B, 0x31, 0x21, 0x00, 0x1A, +0x64, 0x64, 0x30, 0x08, 0x0F, 0x98, 0x68, 0x04, +0xB0, 0x1A, 0x75, 0x00, 0x92, 0x19, 0x0F, 0x98, +0x82, 0x04, 0x0F, 0x98, 0x6D, 0x04, 0x00, 0x03, +0x05, 0x00, 0x03, 0x49, 0xD0, 0x80, 0x04, 0x49, +0xB0, 0x80, 0x05, 0x49, 0x90, 0x80, 0x08, 0x49, +0x70, 0x80, 0x09, 0x49, 0x70, 0x80, 0x0C, 0x49, +0x30, 0x80, 0x0D, 0x49, 0x10, 0x80, 0x2F, 0x80, +0x0F, 0x98, 0x05, 0x07, 0x0F, 0x98, 0xCD, 0x11, +0x00, 0x03, 0x05, 0x00, 0x09, 0x49, 0x01, 0x88, +0x0C, 0x06, 0x0F, 0x98, 0x05, 0x07, 0x0F, 0x88, +0x0C, 0x06, 0x06, 0x49, 0x50, 0x80, 0x07, 0x49, +0x30, 0x80, 0x00, 0x4A, 0x14, 0x00, 0xE1, 0x80, +0xA0, 0x1A, 0x32, 0x02, 0x0A, 0x0D, 0xC2, 0x01, +0x0F, 0x98, 0xD9, 0x0C, 0xB0, 0x1A, 0x32, 0x02, +0x0F, 0x98, 0x6B, 0x0D, 0x0F, 0x98, 0x05, 0x07, +0x0F, 0x88, 0x0C, 0x06, 0x00, 0x03, 0xBD, 0x01, +0x01, 0x49, 0x01, 0x88, 0x0C, 0x06, 0x00, 0x03, +0x70, 0x00, 0x00, 0x0D, 0xBC, 0x01, 0x0F, 0x98, +0x18, 0x10, 0x00, 0x03, 0x05, 0x00, 0x07, 0x49, +0x11, 0x81, 0x0F, 0x98, 0x76, 0x0B, 0x0F, 0x98, +0xD2, 0x0C, 0x0F, 0x98, 0x7E, 0x08, 0xA0, 0x03, +0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0x10, 0x80, 0xA1, 0x19, 0x0A, 0x0D, 0xBD, 0x0D, +0x0F, 0x98, 0xA1, 0x0C, 0x00, 0x0E, 0xBD, 0x01, +0x0F, 0x88, 0x0C, 0x06, 0x21, 0x19, 0x10, 0x03, +0xF7, 0x0A, 0x10, 0x49, 0x11, 0x80, 0x20, 0x19, +0x00, 0x03, 0x01, 0xF8, 0x01, 0x61, 0x02, 0x48, +0xB1, 0x87, 0xFF, 0xA0, 0x0F, 0x98, 0x2A, 0x24, +0x0F, 0x98, 0x68, 0x04, 0x93, 0x19, 0x30, 0x03, +0x0A, 0x00, 0xFF, 0xFF, 0x93, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x90, 0x1E, 0x92, 0x21, +0xB0, 0x1A, 0x75, 0x00, 0x0F, 0x98, 0x82, 0x04, +0x0F, 0x88, 0x6D, 0x04, 0x00, 0x03, 0x4A, 0x0B, +0x10, 0x03, 0xE5, 0x00, 0xFF, 0xFF, 0x01, 0x60, +0x01, 0x98, 0x2A, 0x24, 0xFF, 0xFF, 0xB0, 0x1A, +0x32, 0x02, 0x00, 0x03, 0x05, 0x00, 0x0C, 0x49, +0xB0, 0x83, 0x0D, 0x49, 0x90, 0x83, 0x03, 0x49, +0x8C, 0x81, 0x03, 0x49, 0x60, 0x82, 0xB0, 0x1A, +0xF2, 0x05, 0x04, 0x49, 0x20, 0x81, 0xB0, 0x19, +0x00, 0x4A, 0x14, 0x00, 0xE0, 0x80, 0xB0, 0x1A, +0x35, 0x07, 0x00, 0x03, 0x05, 0x00, 0x09, 0x49, +0x80, 0x80, 0xB0, 0x1A, 0x32, 0x02, 0x08, 0x49, +0x41, 0x80, 0x0F, 0x98, 0x9D, 0x07, 0xB0, 0x1A, +0xD5, 0x07, 0x0F, 0x98, 0x68, 0x04, 0x90, 0x03, +0x06, 0x02, 0xFF, 0xFF, 0x00, 0x03, 0x05, 0x00, +0x08, 0x49, 0x21, 0x80, 0x90, 0x03, 0x10, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x91, 0x04, 0x0F, 0x88, +0x6D, 0x04, 0x0F, 0x98, 0xE4, 0x14, 0x0F, 0x98, +0x68, 0x04, 0xB0, 0x1A, 0x32, 0x02, 0x90, 0x03, +0x06, 0x02, 0xFF, 0xFF, 0x0F, 0x98, 0x91, 0x04, +0x0F, 0x98, 0x6D, 0x04, 0x0F, 0x88, 0x6C, 0x15, +0x0F, 0x98, 0x63, 0x04, 0x0F, 0x98, 0xE4, 0x14, +0x00, 0x0E, 0x09, 0xF3, 0x20, 0x1A, 0x00, 0x02, +0x20, 0x22, 0x00, 0x40, 0x10, 0x1A, 0x32, 0x02, +0x00, 0x03, 0x06, 0x02, 0xFF, 0xFF, 0x01, 0x79, +0x31, 0x00, 0x3F, 0x51, 0x70, 0x80, 0x30, 0x31, +0x31, 0x79, 0x30, 0x31, 0x30, 0x49, 0x40, 0x80, +0x37, 0xC1, 0x2F, 0x80, 0x31, 0x79, 0x37, 0xC9, +0x11, 0x21, 0x41, 0x00, 0x4F, 0x51, 0x70, 0x80, +0x40, 0x31, 0x41, 0x79, 0x40, 0x31, 0x40, 0x49, +0x40, 0x80, 0x47, 0xC1, 0x2F, 0x80, 0x41, 0x79, +0x47, 0xC9, 0x48, 0x7B, 0x34, 0x68, 0x11, 0x21, +0x23, 0x08, 0x21, 0x21, 0x01, 0x39, 0x01, 0x86, +0x0F, 0x98, 0x6C, 0x15, 0x00, 0x03, 0x05, 0x00, +0x0C, 0x49, 0x40, 0x81, 0x0F, 0x98, 0x2A, 0x24, +0x10, 0x1A, 0x75, 0x00, 0x03, 0x19, 0x02, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, +0x02, 0x21, 0x31, 0x00, 0x23, 0x08, 0x11, 0x21, +0x21, 0x21, 0x01, 0x39, 0xA1, 0x87, 0x00, 0x03, +0xBA, 0x0A, 0x20, 0x08, 0x01, 0x0E, 0x09, 0xF3, +0x0F, 0x88, 0x6D, 0x04, 0xD0, 0x03, 0x10, 0x00, +0xC0, 0x1A, 0xD5, 0x07, 0xB0, 0x1A, 0x35, 0x07, +0x0B, 0x00, 0x00, 0x62, 0xFF, 0x00, 0xC0, 0x08, +0xC1, 0x21, 0x0B, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0xC0, 0x08, 0xC1, 0x21, 0xB1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0x10, 0x03, 0x56, 0x00, 0x1C, 0x49, +0x2D, 0x80, 0x0F, 0x88, 0xFB, 0x07, 0x10, 0x03, +0x56, 0x00, 0x18, 0x49, 0x1D, 0x82, 0xD0, 0x1A, +0xF0, 0x00, 0xC0, 0x1A, 0xD5, 0x07, 0xB0, 0x1A, +0xD5, 0x07, 0x90, 0x19, 0x80, 0x19, 0xAB, 0x18, +0xA9, 0x20, 0x0A, 0x00, 0xAC, 0x18, 0xA8, 0x20, +0xA0, 0x08, 0x91, 0x21, 0x19, 0x18, 0x13, 0x61, +0x13, 0x49, 0x11, 0x80, 0x91, 0x21, 0x81, 0x21, +0x90, 0x4A, 0x10, 0x00, 0x6C, 0x80, 0xB0, 0x22, +0x10, 0x00, 0xC0, 0x22, 0x10, 0x00, 0x90, 0x19, +0x80, 0x19, 0xD1, 0x39, 0x81, 0x86, 0x0F, 0x82, +0xD0, 0x03, 0x10, 0x00, 0xC0, 0x1A, 0xD5, 0x07, +0xB0, 0x1A, 0xD5, 0x07, 0x90, 0x19, 0x80, 0x19, +0xAB, 0x18, 0xA9, 0x20, 0x0A, 0x00, 0xAC, 0x18, +0xA8, 0x20, 0xA0, 0x08, 0x91, 0x21, 0x19, 0x18, +0x13, 0x61, 0x12, 0x49, 0x11, 0x80, 0x92, 0x21, +0x81, 0x21, 0x90, 0x4A, 0x10, 0x00, 0x6C, 0x80, +0xB0, 0x22, 0x10, 0x00, 0xC0, 0x22, 0x10, 0x00, +0x90, 0x19, 0x80, 0x19, 0xD1, 0x39, 0x81, 0x86, +0xB0, 0x1A, 0xD5, 0x07, 0xCB, 0x18, 0x80, 0x1A, +0xFC, 0x0C, 0x20, 0x1A, 0x10, 0x00, 0x30, 0x1A, +0xE8, 0x00, 0x60, 0x1A, 0xC7, 0x0D, 0x03, 0x00, +0x00, 0x62, 0xFF, 0x00, 0x60, 0x08, 0x61, 0x21, +0x03, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0x60, 0x08, +0x61, 0x21, 0x31, 0x21, 0x21, 0x39, 0x31, 0x87, +0x30, 0x1A, 0xC7, 0x0D, 0x60, 0x19, 0x90, 0x19, +0x50, 0x03, 0x56, 0x00, 0xD0, 0x1A, 0x40, 0x01, +0x03, 0x00, 0x00, 0x62, 0xFF, 0x00, 0x0B, 0x20, +0xA0, 0x00, 0x0C, 0x18, 0x09, 0x20, 0x0A, 0x08, +0x61, 0x21, 0x31, 0x21, 0x91, 0x21, 0x65, 0x48, +0xA1, 0x80, 0x30, 0x1A, 0xC7, 0x0D, 0x60, 0x19, +0x90, 0x19, 0xB0, 0x22, 0x10, 0x00, 0xC0, 0x22, +0x10, 0x00, 0xD0, 0x3A, 0x10, 0x00, 0xD0, 0x49, +0x7A, 0x86, 0xD0, 0x03, 0x10, 0x00, 0xC0, 0x1A, +0xD5, 0x07, 0xB0, 0x1A, 0xD5, 0x07, 0x90, 0x19, +0x80, 0x19, 0x0B, 0x00, 0x00, 0x62, 0xFF, 0x00, +0xB1, 0x21, 0x1B, 0x00, 0xFF, 0xFF, 0x18, 0x7B, +0x01, 0x68, 0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, +0xD1, 0x39, 0x31, 0x87, 0xFF, 0xA0, 0xA0, 0x03, +0x15, 0x00, 0x0A, 0x0D, 0x70, 0x0A, 0x0A, 0x0D, +0x71, 0x0A, 0x0A, 0x0D, 0x73, 0x0A, 0x00, 0x0E, +0x4C, 0x0B, 0x00, 0x0E, 0xF0, 0x0D, 0x00, 0x0E, +0x4B, 0x0B, 0x00, 0x0E, 0x57, 0x0A, 0x00, 0x0E, +0x58, 0x0A, 0x00, 0x0E, 0x5A, 0x0A, 0x00, 0x0E, +0x5C, 0x0A, 0x00, 0x0E, 0x5D, 0x0A, 0x00, 0x0E, +0x46, 0x00, 0x00, 0x0E, 0x59, 0x0A, 0x0F, 0x98, +0x18, 0x10, 0x0F, 0x98, 0x75, 0x04, 0x0F, 0x98, +0x4A, 0x10, 0xC0, 0x19, 0xD0, 0x1A, 0x77, 0x00, +0xD2, 0x21, 0x3A, 0x19, 0xD0, 0x0B, 0xD3, 0x21, +0xC1, 0x21, 0xC3, 0x48, 0xB1, 0x87, 0x0F, 0x88, +0xB5, 0x24, 0x00, 0x0E, 0x62, 0x0A, 0x00, 0x0E, +0x63, 0x0A, 0x0F, 0x88, 0x4F, 0x0F, 0x00, 0x0E, +0x0D, 0xF3, 0x00, 0x0E, 0x0B, 0xF3, 0x00, 0x0E, +0x0C, 0xF3, 0x90, 0x1A, 0x40, 0x01, 0xA0, 0x1A, +0x00, 0x80, 0xB0, 0x1A, 0x00, 0x60, 0xC0, 0x1A, +0x00, 0x70, 0x0A, 0x00, 0xB0, 0x08, 0xC0, 0x08, +0xB1, 0x21, 0xC1, 0x21, 0xA1, 0x21, 0x91, 0x39, +0x81, 0x87, 0x02, 0x0E, 0x0D, 0xF3, 0x02, 0x0E, +0x0B, 0xF3, 0x02, 0x0E, 0x0C, 0xF3, 0xFF, 0xA0, +0x00, 0x0E, 0x0D, 0xF3, 0x00, 0x0E, 0x0B, 0xF3, +0x00, 0x0E, 0x0C, 0xF3, 0x90, 0x1A, 0x40, 0x01, +0xA0, 0x1A, 0x00, 0x80, 0xB0, 0x1A, 0x00, 0x60, +0xC0, 0x1A, 0x00, 0x70, 0x80, 0x1A, 0xB2, 0x04, +0x50, 0x03, 0x20, 0x01, 0x08, 0x00, 0x40, 0x1A, +0x00, 0x20, 0x40, 0x38, 0x45, 0x7A, 0xA4, 0x08, +0xB4, 0x08, 0xC4, 0x08, 0x81, 0x21, 0xC1, 0x21, +0xB1, 0x21, 0xA1, 0x21, 0x91, 0x39, 0x21, 0x87, +0x02, 0x0E, 0x0D, 0xF3, 0x02, 0x0E, 0x0B, 0xF3, +0x02, 0x0E, 0x0C, 0xF3, 0xFF, 0xA0, 0x90, 0x1A, +0x40, 0x01, 0xB0, 0x1A, 0x32, 0x02, 0x80, 0x1A, +0xB2, 0x04, 0x48, 0x00, 0xB4, 0x08, 0x81, 0x21, +0xB1, 0x21, 0x91, 0x39, 0xA1, 0x87, 0xFF, 0xA0, +0x00, 0x03, 0x25, 0x01, 0x00, 0x0D, 0x1A, 0xF8, +0x00, 0x03, 0x26, 0x01, 0x00, 0x0D, 0x10, 0xF8, +0x00, 0x03, 0x27, 0x01, 0x00, 0x0D, 0x11, 0xF8, +0x00, 0x03, 0x28, 0x01, 0x00, 0x0D, 0x1E, 0xF8, +0x00, 0x03, 0x29, 0x01, 0x00, 0x0D, 0x1F, 0xF8, +0x00, 0x03, 0x1B, 0x01, 0x00, 0x0D, 0x0E, 0xF8, +0x00, 0x03, 0x1C, 0x01, 0x00, 0x0D, 0x0F, 0xF8, +0x00, 0x03, 0x2A, 0x01, 0x00, 0x0D, 0x1B, 0xF8, +0x00, 0x03, 0x2B, 0x01, 0x00, 0x0D, 0x40, 0xF8, +0x00, 0x1A, 0x33, 0x33, 0x00, 0x0D, 0x42, 0xF8, +0x00, 0x03, 0x2C, 0x01, 0x00, 0x0D, 0x28, 0xF8, +0x00, 0x03, 0x2D, 0x01, 0x00, 0x0D, 0x29, 0xF8, +0x00, 0x03, 0x2F, 0x01, 0x00, 0x0D, 0x2A, 0xF8, +0x00, 0x03, 0x30, 0x01, 0x00, 0x0D, 0x21, 0xF8, +0x00, 0x03, 0x31, 0x01, 0x00, 0x0D, 0x22, 0xF8, +0x00, 0x03, 0x32, 0x01, 0x00, 0x0D, 0x4A, 0xF8, +0x00, 0x03, 0x33, 0x01, 0x00, 0x0D, 0x49, 0xF8, +0x00, 0x03, 0x34, 0x01, 0x00, 0x0D, 0x4B, 0xF8, +0x00, 0x03, 0x35, 0x01, 0x00, 0x0D, 0x51, 0xF8, +0x00, 0x03, 0x36, 0x01, 0x00, 0x0D, 0x52, 0xF8, +0x00, 0x03, 0x37, 0x01, 0x00, 0x0D, 0x53, 0xF8, +0xFF, 0xA0, 0x00, 0x0E, 0x05, 0x02, 0xDA, 0x19, +0xC0, 0x1A, 0x57, 0x00, 0xB0, 0x1A, 0x60, 0xF8, +0x0C, 0x00, 0x00, 0x62, 0xFF, 0x00, 0xB0, 0x08, +0xB1, 0x21, 0x0C, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0xB0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0xFF, 0xA0, 0xB0, 0x03, 0x55, 0x00, +0xAB, 0x18, 0xC0, 0x03, 0x56, 0x00, 0xFF, 0xFF, +0xAC, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0x0A, 0x0D, 0x06, 0x02, 0xB7, 0x7B, +0xC7, 0x7B, 0x0B, 0x0D, 0xB5, 0x0A, 0x0C, 0x0D, +0xB6, 0x0A, 0x00, 0x03, 0x55, 0x00, 0xFF, 0xFF, +0x01, 0x39, 0x00, 0x0D, 0x08, 0xF8, 0x0F, 0x98, +0x24, 0x09, 0x0F, 0x98, 0x9E, 0x0C, 0x10, 0x03, +0x05, 0x00, 0x16, 0x49, 0x61, 0x81, 0x00, 0x03, +0x16, 0x01, 0x00, 0x0D, 0x04, 0xF8, 0x00, 0x03, +0x17, 0x01, 0x00, 0x0D, 0x0B, 0xF8, 0x00, 0x03, +0x18, 0x01, 0x10, 0x18, 0x18, 0x7B, 0x01, 0x68, +0x00, 0x0D, 0x34, 0xF8, 0x00, 0x0D, 0x35, 0xF8, +0x00, 0x0D, 0x36, 0xF8, 0x00, 0x0D, 0x37, 0xF8, +0xCF, 0x82, 0x19, 0x49, 0x51, 0x81, 0x01, 0x19, +0x00, 0x0D, 0x04, 0xF8, 0x00, 0x03, 0x17, 0x01, +0x00, 0x0D, 0x0B, 0xF8, 0x00, 0x03, 0x18, 0x01, +0x10, 0x18, 0x18, 0x7B, 0x01, 0x68, 0x00, 0x0D, +0x34, 0xF8, 0x00, 0x0D, 0x35, 0xF8, 0x00, 0x0D, +0x36, 0xF8, 0x00, 0x0D, 0x37, 0xF8, 0x5F, 0x81, +0x00, 0x03, 0x6C, 0x00, 0x00, 0x0D, 0x04, 0xF8, +0x00, 0x03, 0x6D, 0x00, 0x00, 0x0D, 0x0B, 0xF8, +0x00, 0x03, 0x6E, 0x00, 0x10, 0x18, 0x18, 0x7B, +0x01, 0x68, 0x00, 0x0D, 0x34, 0xF8, 0x00, 0x0D, +0x35, 0xF8, 0x00, 0x0D, 0x36, 0xF8, 0x00, 0x0D, +0x37, 0xF8, 0x00, 0x03, 0x38, 0x01, 0x00, 0x0D, +0x0A, 0xF8, 0xA0, 0x03, 0x15, 0x01, 0xA0, 0x49, +0x00, 0x98, 0x36, 0x0A, 0xFF, 0xFF, 0xA0, 0x03, +0x15, 0x01, 0xA1, 0x49, 0x00, 0x98, 0x71, 0x0A, +0xFF, 0xFF, 0x0F, 0x98, 0xBE, 0x09, 0x0F, 0x98, +0x09, 0x0A, 0x0F, 0x98, 0x88, 0x0A, 0x00, 0x03, +0x05, 0x00, 0x06, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0xC0, 0x03, 0x0D, 0x00, 0xC0, 0x51, 0xF1, 0xA0, +0xFF, 0xFF, 0x0F, 0x88, 0x31, 0x0C, 0x00, 0x0E, +0x0F, 0xF3, 0x00, 0x03, 0xF5, 0x00, 0x00, 0x49, +0x80, 0x81, 0x90, 0x03, 0x0F, 0x00, 0x95, 0x49, +0x6C, 0x80, 0x0D, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x1E, 0x04, 0x79, 0x93, 0x49, +0x1B, 0x80, 0x01, 0x79, 0x90, 0x1A, 0x14, 0x00, +0x10, 0x1A, 0x00, 0xA0, 0x10, 0x08, 0x11, 0x21, +0x91, 0x39, 0xC1, 0x87, 0x02, 0x0E, 0x0F, 0xF3, +0xFF, 0xA0, 0x0A, 0x19, 0x10, 0x1A, 0x00, 0xA0, +0x20, 0x1A, 0xF6, 0x00, 0x90, 0x03, 0x0F, 0x00, +0x32, 0x00, 0x30, 0x62, 0xFF, 0x00, 0x95, 0x49, +0x6C, 0x80, 0x3D, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x30, 0x1E, 0x34, 0x79, 0x93, 0x49, +0x1B, 0x80, 0x31, 0x79, 0x13, 0x08, 0x11, 0x21, +0x32, 0x00, 0xFF, 0xFF, 0x38, 0x79, 0x95, 0x49, +0x6C, 0x80, 0x3D, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x30, 0x1E, 0x34, 0x79, 0x93, 0x49, +0x1B, 0x80, 0x31, 0x79, 0x13, 0x08, 0x11, 0x21, +0x21, 0x21, 0x01, 0x39, 0xD1, 0x85, 0x02, 0x0E, +0x0F, 0xF3, 0xFF, 0xA0, 0x00, 0x0E, 0x0E, 0xF3, +0x10, 0x03, 0x05, 0x00, 0x16, 0x49, 0x91, 0x80, +0x80, 0x03, 0x18, 0x01, 0x00, 0x03, 0x16, 0x01, +0x00, 0x49, 0x20, 0x80, 0x80, 0x03, 0x17, 0x01, +0x8F, 0x80, 0x80, 0x03, 0x6E, 0x00, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x49, 0x20, 0x80, 0x80, 0x03, +0x6D, 0x00, 0x08, 0x18, 0x08, 0x7B, 0x80, 0x68, +0x90, 0x03, 0x10, 0x00, 0xA0, 0x1A, 0x00, 0x90, +0xA8, 0x08, 0xA1, 0x21, 0x91, 0x39, 0xC1, 0x87, +0x02, 0x0E, 0x0E, 0xF3, 0xFF, 0xA0, 0x00, 0x0E, +0x05, 0xF8, 0x01, 0x19, 0x00, 0x0D, 0x06, 0xF8, +0x00, 0x0E, 0x07, 0xF8, 0xFF, 0xA0, 0x90, 0x03, +0x0F, 0x00, 0x90, 0x49, 0x90, 0x80, 0x90, 0x03, +0x0F, 0x00, 0x91, 0x49, 0x50, 0x80, 0x90, 0x03, +0x0F, 0x00, 0x92, 0x49, 0x10, 0x80, 0x7F, 0x81, +0x00, 0x0E, 0x2C, 0xF8, 0x00, 0x0E, 0x2D, 0xF8, +0x01, 0x0E, 0x2E, 0xF8, 0x01, 0x0E, 0x2F, 0xF8, +0x00, 0x0E, 0x38, 0xF8, 0x00, 0x0E, 0x39, 0xF8, +0x08, 0x0E, 0x3A, 0xF8, 0x01, 0x0E, 0x3B, 0xF8, +0x00, 0x1A, 0x07, 0x15, 0x10, 0x1A, 0x07, 0x1C, +0x20, 0x1A, 0x06, 0x06, 0x5F, 0x82, 0x00, 0x0E, +0x2C, 0xF8, 0x00, 0x0E, 0x2D, 0xF8, 0x01, 0x0E, +0x2E, 0xF8, 0x01, 0x0E, 0x2F, 0xF8, 0x00, 0x0E, +0x38, 0xF8, 0x00, 0x0E, 0x39, 0xF8, 0x08, 0x0E, +0x3A, 0xF8, 0x01, 0x0E, 0x3B, 0xF8, 0x00, 0x1A, +0x07, 0xD5, 0x10, 0x1A, 0x07, 0xDC, 0x20, 0x1A, +0x06, 0xC6, 0xEF, 0x80, 0x00, 0x0E, 0x2C, 0xF8, +0x00, 0x0E, 0x2D, 0xF8, 0x01, 0x0E, 0x2E, 0xF8, +0x01, 0x0E, 0x2F, 0xF8, 0x00, 0x1A, 0x07, 0x07, +0x10, 0x1A, 0x07, 0x07, 0x20, 0x1A, 0x06, 0x06, +0x00, 0x0D, 0x23, 0xF8, 0x01, 0x0D, 0x24, 0xF8, +0x02, 0x0D, 0x25, 0xF8, 0x01, 0x0E, 0x20, 0xF8, +0xFF, 0xA0, 0x30, 0x1A, 0x14, 0x00, 0xB0, 0x1A, +0xFC, 0x0C, 0xB0, 0x0B, 0xB1, 0x21, 0x31, 0x39, +0xC1, 0x87, 0x60, 0x19, 0x00, 0x19, 0x70, 0x03, +0x56, 0x00, 0x06, 0xC0, 0x61, 0x21, 0x67, 0x48, +0xC1, 0x87, 0x30, 0x03, 0x55, 0x00, 0xB0, 0x1A, +0xFC, 0x0C, 0xB0, 0x08, 0xB1, 0x21, 0x31, 0x39, +0xC1, 0x87, 0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, +0xF0, 0xA0, 0xFF, 0xFF, 0x80, 0x03, 0xA5, 0x00, +0x10, 0x03, 0xA9, 0x00, 0x20, 0x1A, 0xFC, 0x0C, +0xC0, 0x03, 0xA8, 0x00, 0xC0, 0x49, 0x31, 0x80, +0x21, 0x20, 0x20, 0x0B, 0x8F, 0x80, 0x30, 0x1A, +0x14, 0x00, 0x02, 0x00, 0x01, 0xC8, 0x20, 0x08, +0x21, 0x21, 0x31, 0x39, 0xA1, 0x87, 0x70, 0x1A, +0xAB, 0x00, 0xC0, 0x49, 0x41, 0x80, 0x10, 0x03, +0xA9, 0x00, 0x07, 0x00, 0x3F, 0x80, 0x00, 0x03, +0xA9, 0x00, 0x17, 0x00, 0xB0, 0x03, 0xAA, 0x00, +0x20, 0x1A, 0xFC, 0x0C, 0x10, 0x4A, 0x14, 0x00, +0x2C, 0x80, 0x10, 0x1A, 0x13, 0x00, 0x21, 0x20, +0x32, 0x00, 0x00, 0x4A, 0x10, 0x00, 0x1C, 0x80, +0x0F, 0x19, 0x30, 0xC0, 0x23, 0x08, 0xC0, 0x49, +0x11, 0x80, 0x01, 0x21, 0xC0, 0x49, 0x10, 0x80, +0x11, 0x21, 0xB1, 0x39, 0x91, 0x86, 0x81, 0x39, +0xF0, 0xA0, 0xFF, 0xFF, 0x71, 0x21, 0x9F, 0x85, +0x00, 0x03, 0xE7, 0x0A, 0x01, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x0F, 0x98, 0x88, 0x0A, 0x0F, 0x98, +0xD2, 0x0C, 0x0F, 0x98, 0x4A, 0x08, 0x0F, 0x98, +0x2E, 0x0A, 0x0F, 0x98, 0xD2, 0x0C, 0x0F, 0x98, +0x5B, 0x0C, 0x0F, 0x98, 0xD2, 0x0C, 0x0F, 0x98, +0xA7, 0x0C, 0x0F, 0x98, 0xCD, 0x0C, 0x0F, 0x98, +0xA7, 0x0C, 0x0F, 0x98, 0xCD, 0x0C, 0x00, 0x0E, +0x0D, 0xF3, 0x50, 0x03, 0x6D, 0x00, 0x40, 0x1A, +0x9E, 0x07, 0xA0, 0x03, 0x10, 0x00, 0xB0, 0x1A, +0x00, 0x80, 0xC0, 0x1A, 0x35, 0x07, 0x70, 0x1A, +0x10, 0x0D, 0x90, 0x19, 0x01, 0x0E, 0xE8, 0x0A, +0x2C, 0x00, 0x12, 0x18, 0x10, 0x62, 0xFF, 0x00, +0x15, 0x48, 0xEB, 0x81, 0x3B, 0x00, 0x00, 0x03, +0x20, 0x01, 0xFF, 0xFF, 0x30, 0x78, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x49, 0x30, 0x80, 0x34, 0x48, +0xCA, 0x80, 0x2F, 0x81, 0x34, 0x48, 0x0D, 0x88, +0xCD, 0x0B, 0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, +0x00, 0xFF, 0x11, 0x21, 0x21, 0x68, 0xC2, 0x08, +0x7F, 0x80, 0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, +0x00, 0xFF, 0x11, 0x39, 0x21, 0x68, 0xC2, 0x08, +0x91, 0x21, 0xB1, 0x21, 0x2C, 0x00, 0x12, 0x18, +0x18, 0x79, 0x15, 0x48, 0xFB, 0x81, 0x3B, 0x00, +0x00, 0x03, 0x20, 0x01, 0xFF, 0xFF, 0x30, 0x78, +0x00, 0x03, 0x6C, 0x00, 0x00, 0x49, 0x30, 0x80, +0x34, 0x48, 0xCA, 0x80, 0x3F, 0x81, 0x34, 0x48, +0xDD, 0x87, 0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, +0xFF, 0x00, 0x11, 0x21, 0x18, 0x7B, 0x21, 0x68, +0xC2, 0x08, 0x8F, 0x80, 0x00, 0x0E, 0xE8, 0x0A, +0x20, 0x62, 0xFF, 0x00, 0x11, 0x39, 0x18, 0x7B, +0x21, 0x68, 0xC2, 0x08, 0xB1, 0x21, 0xC1, 0x21, +0xA1, 0x39, 0x01, 0x88, 0x0F, 0x0B, 0x00, 0x03, +0xE8, 0x0A, 0x00, 0x49, 0x00, 0x88, 0xF0, 0x0A, +0x0A, 0x0E, 0xBC, 0x01, 0x01, 0x0E, 0xE7, 0x0A, +0x0F, 0x98, 0x31, 0x0C, 0x0F, 0x98, 0x7E, 0x08, +0xA0, 0x03, 0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, +0xBF, 0x51, 0x10, 0x80, 0xA1, 0x19, 0x0A, 0x0D, +0xBD, 0x0D, 0x0F, 0x88, 0xA1, 0x0C, 0xA0, 0x03, +0x0D, 0x00, 0xA0, 0xC1, 0xA2, 0xC1, 0x0A, 0x0D, +0x0D, 0x00, 0x0F, 0x98, 0x88, 0x0A, 0x0F, 0x98, +0xD2, 0x0C, 0x0F, 0x98, 0x4A, 0x08, 0x0F, 0x98, +0x2E, 0x0A, 0xA0, 0x03, 0x10, 0x00, 0xB0, 0x1A, +0x35, 0x07, 0x00, 0x03, 0x6E, 0x00, 0x20, 0x03, +0x6C, 0x00, 0x20, 0x49, 0x20, 0x80, 0x00, 0x03, +0x6D, 0x00, 0x10, 0x18, 0x18, 0x7B, 0x01, 0x68, +0xB0, 0x08, 0xB1, 0x21, 0xA1, 0x39, 0xC1, 0x87, +0x0F, 0x98, 0xD2, 0x0C, 0x0F, 0x98, 0x5B, 0x0C, +0x0F, 0x98, 0xD2, 0x0C, 0x0F, 0x98, 0xA7, 0x0C, +0x0F, 0x98, 0xCD, 0x0C, 0x0F, 0x98, 0xA7, 0x0C, +0x0F, 0x98, 0xCD, 0x0C, 0x00, 0x0E, 0x0D, 0xF3, +0x40, 0x03, 0x6B, 0x00, 0xA0, 0x03, 0x10, 0x00, +0xB0, 0x1A, 0x00, 0x80, 0xC0, 0x1A, 0x35, 0x07, +0x70, 0x1A, 0x10, 0x0D, 0x90, 0x19, 0x01, 0x0E, +0xE8, 0x0A, 0x30, 0x1A, 0x7F, 0x00, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x49, 0x10, 0x80, 0x30, 0x19, +0x2C, 0x00, 0x12, 0x18, 0x10, 0x62, 0xFF, 0x00, +0x13, 0x48, 0x00, 0x88, 0x16, 0x0C, 0x3B, 0x00, +0x00, 0x03, 0x20, 0x01, 0xFF, 0xFF, 0x30, 0x78, +0x00, 0x03, 0x6C, 0x00, 0x00, 0x49, 0x30, 0x80, +0x34, 0x48, 0xBA, 0x80, 0x1F, 0x81, 0x34, 0x48, +0xDD, 0x87, 0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, +0x00, 0xFF, 0x11, 0x21, 0x21, 0x68, 0xC2, 0x08, +0x7F, 0x80, 0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, +0x00, 0xFF, 0x11, 0x39, 0x21, 0x68, 0xC2, 0x08, +0x91, 0x21, 0xB1, 0x21, 0x30, 0x1A, 0x7F, 0x00, +0x00, 0x03, 0x6C, 0x00, 0x00, 0x49, 0x10, 0x80, +0x30, 0x19, 0x2C, 0x00, 0x12, 0x18, 0x18, 0x79, +0x13, 0x48, 0x90, 0x82, 0x3B, 0x00, 0x00, 0x03, +0x20, 0x01, 0xFF, 0xFF, 0x30, 0x78, 0x00, 0x03, +0x6C, 0x00, 0x00, 0x49, 0x30, 0x80, 0x34, 0x48, +0xCA, 0x80, 0x3F, 0x81, 0x34, 0x48, 0xDD, 0x87, +0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, 0xFF, 0x00, +0x11, 0x21, 0x18, 0x7B, 0x21, 0x68, 0xC2, 0x08, +0x8F, 0x80, 0x00, 0x0E, 0xE8, 0x0A, 0x20, 0x62, +0xFF, 0x00, 0x11, 0x39, 0x18, 0x7B, 0x21, 0x68, +0xC2, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xA1, 0x39, +0x01, 0x88, 0xB4, 0x0B, 0x00, 0x03, 0xE8, 0x0A, +0x00, 0x49, 0x00, 0x88, 0x97, 0x0B, 0x0F, 0x98, +0x31, 0x0C, 0xA0, 0x03, 0x0D, 0x00, 0xA0, 0xC9, +0xA2, 0xC9, 0x0A, 0x0D, 0x0D, 0x00, 0x00, 0x03, +0xBD, 0x01, 0x01, 0x49, 0x21, 0x80, 0x01, 0x0E, +0xEA, 0x0D, 0x0F, 0x98, 0x7E, 0x08, 0xA0, 0x03, +0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0x10, 0x80, 0xA1, 0x19, 0x0A, 0x0D, 0xBD, 0x0D, +0x0F, 0x88, 0xA1, 0x0C, 0x0F, 0x98, 0xD2, 0x0C, +0x20, 0x03, 0x6C, 0x00, 0x20, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x00, 0x0E, 0x0E, 0xF3, 0x50, 0x03, +0x6D, 0x00, 0x90, 0x03, 0x10, 0x00, 0xC0, 0x1A, +0x35, 0x07, 0xA0, 0x1A, 0x00, 0x90, 0x0C, 0x00, +0xFF, 0xFF, 0x00, 0x62, 0xFF, 0x00, 0x05, 0x48, +0x11, 0x80, 0x00, 0x19, 0x2C, 0x00, 0x12, 0x18, +0x10, 0x62, 0x00, 0xFF, 0x28, 0x79, 0x25, 0x48, +0x11, 0x80, 0x10, 0x19, 0x01, 0x68, 0xC0, 0x08, +0xA0, 0x08, 0xC1, 0x21, 0xA1, 0x21, 0x91, 0x39, +0xA1, 0x86, 0x02, 0x0E, 0x0E, 0xF3, 0xFF, 0xA0, +0x00, 0x0E, 0x0E, 0xF3, 0x90, 0x03, 0x10, 0x00, +0xC0, 0x1A, 0x35, 0x07, 0xA0, 0x1A, 0x00, 0x90, +0x0C, 0x00, 0xA0, 0x08, 0xC1, 0x21, 0xA1, 0x21, +0x91, 0x39, 0xA1, 0x87, 0x02, 0x0E, 0x0E, 0xF3, +0xFF, 0xA0, 0x00, 0x0E, 0x0E, 0xF3, 0x90, 0x1A, +0x4C, 0x00, 0xC0, 0x1A, 0x35, 0x07, 0xA0, 0x1A, +0x00, 0x90, 0xC8, 0x21, 0xA8, 0x21, 0x0C, 0x00, +0xA0, 0x08, 0xA1, 0x21, 0x1C, 0x18, 0x17, 0x61, +0x16, 0x49, 0x10, 0x80, 0xA0, 0x08, 0xA1, 0x21, +0xC2, 0x21, 0x91, 0x39, 0x41, 0x87, 0x02, 0x0E, +0x0E, 0xF3, 0xFF, 0xA0, 0x00, 0x0E, 0x0E, 0xF3, +0x90, 0x1A, 0x50, 0x00, 0xC0, 0x1A, 0x35, 0x07, +0xA0, 0x1A, 0x00, 0x90, 0x0C, 0x00, 0xA0, 0x08, +0xA1, 0x21, 0xA0, 0x08, 0xA1, 0x21, 0xC2, 0x21, +0x91, 0x39, 0x81, 0x87, 0x02, 0x0E, 0x0E, 0xF3, +0xFF, 0xA0, 0x01, 0x0E, 0x09, 0xF8, 0xFF, 0xA0, +0x02, 0x0E, 0x09, 0xF8, 0xFF, 0xA0, 0x03, 0x0E, +0x09, 0xF8, 0xFF, 0xA0, 0xA0, 0x03, 0xBD, 0x0D, +0xA1, 0x49, 0x20, 0x80, 0xA2, 0x49, 0xA0, 0x80, +0x01, 0x0E, 0xBD, 0x0D, 0x00, 0x0E, 0x02, 0xF8, +0x9F, 0x80, 0x01, 0x0E, 0xBD, 0x0D, 0x01, 0x0E, +0x02, 0xF8, 0x4F, 0x80, 0x02, 0x0E, 0xBD, 0x0D, +0x02, 0x0E, 0x02, 0xF8, 0x02, 0x0E, 0x0B, 0xF3, +0x02, 0x0E, 0x0C, 0xF3, 0x02, 0x0E, 0x0D, 0xF3, +0x01, 0x0E, 0x00, 0xF8, 0xFF, 0xA0, 0x02, 0x0E, +0x01, 0xF8, 0xFF, 0xA0, 0x00, 0x03, 0x00, 0xF8, +0x01, 0x51, 0xC1, 0x87, 0x00, 0x0E, 0x0D, 0xF3, +0xFF, 0xA0, 0x02, 0x0E, 0x0D, 0xF3, 0x00, 0x0E, +0x01, 0xF8, 0xFF, 0xA0, 0x00, 0x03, 0x00, 0xF8, +0x00, 0x51, 0xC1, 0x87, 0xFF, 0xA0, 0x0F, 0x98, +0xBE, 0x0C, 0x0F, 0x98, 0xC1, 0x0C, 0x02, 0x0E, +0x00, 0xF8, 0xFF, 0xA0, 0xA0, 0x03, 0xBD, 0x0D, +0xA1, 0x49, 0xC1, 0x80, 0x0F, 0x98, 0xCD, 0x0C, +0x0F, 0x98, 0xD2, 0x0C, 0x00, 0x03, 0x01, 0xF8, +0x01, 0x61, 0x00, 0x0D, 0xF7, 0x0A, 0x00, 0x0E, +0x0D, 0xF3, 0x6F, 0x80, 0x0F, 0x98, 0xE5, 0x06, +0x0F, 0x98, 0xBE, 0x0C, 0x0F, 0x98, 0xC1, 0x0C, +0xB0, 0x1A, 0x00, 0x80, 0xC0, 0x03, 0xC2, 0x01, +0x10, 0x03, 0x56, 0x00, 0x00, 0x1A, 0x10, 0x00, +0x01, 0x38, 0x50, 0x03, 0x20, 0x01, 0x10, 0x03, +0x56, 0x00, 0x1C, 0x49, 0xBD, 0x80, 0xD0, 0x1A, +0x40, 0x01, 0x9B, 0x00, 0xFF, 0xFF, 0x95, 0x78, +0xC9, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x81, 0x87, 0x3F, 0x82, 0x10, 0x03, 0x56, 0x00, +0x18, 0x49, 0x0D, 0x81, 0xD0, 0x1A, 0x40, 0x01, +0x9B, 0x00, 0xFF, 0xFF, 0x95, 0x78, 0xC9, 0x08, +0xB1, 0x21, 0x1B, 0x18, 0x13, 0x61, 0x13, 0x49, +0x11, 0x80, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0xFF, 0x80, 0xD0, 0x1A, 0x40, 0x01, +0x9B, 0x00, 0xFF, 0xFF, 0x95, 0x78, 0xC9, 0x08, +0xB1, 0x21, 0x1B, 0x18, 0x13, 0x61, 0x12, 0x49, +0x11, 0x80, 0xB2, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0x31, 0x87, 0xB0, 0x03, 0x0C, 0x00, 0xBF, 0x51, +0x30, 0x80, 0x0F, 0x98, 0x2E, 0x0A, 0x2F, 0x80, +0x0F, 0x98, 0x18, 0x10, 0x02, 0x0E, 0x0D, 0xF3, +0xA0, 0x03, 0x21, 0x01, 0xB0, 0x03, 0x0C, 0x00, +0xBF, 0x51, 0x10, 0x80, 0xA1, 0x19, 0xA1, 0x49, +0x61, 0x80, 0x01, 0x0E, 0xBD, 0x0D, 0x0F, 0x98, +0x7E, 0x08, 0x0F, 0x88, 0xA7, 0x0C, 0xA2, 0x49, +0x41, 0x80, 0x02, 0x0E, 0xBD, 0x0D, 0x0F, 0x88, +0xC8, 0x0C, 0xA0, 0x03, 0xBC, 0x0D, 0xA0, 0x49, +0xB0, 0x80, 0x00, 0x03, 0xBD, 0x0D, 0x02, 0x49, +0x00, 0x88, 0xC8, 0x0C, 0x0F, 0x98, 0x7E, 0x08, +0x02, 0x0E, 0xBD, 0x0D, 0x0F, 0x88, 0xB1, 0x0C, +0xA0, 0x03, 0xBD, 0x0D, 0xA1, 0x49, 0x80, 0x80, +0x01, 0x0E, 0xBD, 0x0D, 0x0F, 0x98, 0xD2, 0x0C, +0x0F, 0x98, 0x7E, 0x08, 0x0F, 0x88, 0xA7, 0x0C, +0x0F, 0x98, 0x7E, 0x08, 0x0F, 0x88, 0xA7, 0x0C, +0xCB, 0x18, 0x80, 0x1A, 0xFC, 0x0C, 0x60, 0x03, +0x56, 0x00, 0x10, 0x1A, 0x10, 0x00, 0xD0, 0x1A, +0x40, 0x01, 0x6C, 0x49, 0x8A, 0x80, 0xD0, 0x1A, +0xF0, 0x00, 0x1C, 0x19, 0x68, 0x49, 0x3A, 0x80, +0xD0, 0x1A, 0xA0, 0x00, 0x18, 0x19, 0x71, 0x18, +0x76, 0x38, 0x20, 0x1A, 0x10, 0x00, 0x30, 0x1A, +0xE8, 0x00, 0x60, 0x1A, 0xC7, 0x0D, 0x03, 0x00, +0x00, 0x62, 0xFF, 0x00, 0x60, 0x08, 0x61, 0x21, +0x03, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0x60, 0x08, +0x61, 0x21, 0x31, 0x21, 0x21, 0x39, 0x31, 0x87, +0x30, 0x1A, 0xC7, 0x0D, 0x60, 0x19, 0x98, 0x00, +0x50, 0x03, 0x56, 0x00, 0x40, 0x1A, 0x24, 0x0D, +0x21, 0x18, 0x7B, 0x00, 0x47, 0x08, 0xB1, 0x21, +0x41, 0x21, 0x21, 0x39, 0xA1, 0x87, 0x40, 0x1A, +0x24, 0x0D, 0x96, 0x50, 0x21, 0x80, 0xC0, 0x0B, +0x6F, 0x80, 0x03, 0x00, 0x00, 0x62, 0xFF, 0x00, +0x04, 0x20, 0xA0, 0x00, 0xCA, 0x08, 0x61, 0x21, +0x31, 0x21, 0x65, 0x48, 0x11, 0x81, 0x30, 0x1A, +0xC7, 0x0D, 0x60, 0x19, 0x81, 0x21, 0x98, 0x00, +0x40, 0x1A, 0x24, 0x0D, 0x21, 0x18, 0x7B, 0x00, +0x47, 0x08, 0xB1, 0x21, 0x41, 0x21, 0x21, 0x39, +0xA1, 0x87, 0x40, 0x1A, 0x24, 0x0D, 0xFF, 0xFF, +0xC1, 0x21, 0xD1, 0x39, 0xE1, 0x85, 0xFF, 0xA0, +0x80, 0x19, 0x90, 0x19, 0x00, 0x0E, 0xF6, 0x0D, +0x00, 0x0E, 0xF7, 0x0D, 0xD0, 0x03, 0x06, 0x02, +0xB0, 0x1A, 0xD5, 0x07, 0xC0, 0x1A, 0xB2, 0x04, +0x40, 0x03, 0x3E, 0x00, 0x50, 0x03, 0x40, 0x00, +0x20, 0x19, 0x30, 0x19, 0x00, 0x1A, 0x00, 0x20, +0x1B, 0x00, 0xFF, 0xFF, 0x01, 0x38, 0x1C, 0x00, +0xFF, 0xFF, 0x01, 0x38, 0x04, 0x48, 0x1C, 0x80, +0x21, 0x21, 0x05, 0x48, 0x1A, 0x80, 0x31, 0x21, +0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, 0xE1, 0x86, +0x10, 0x03, 0x3F, 0x00, 0x21, 0x48, 0x1C, 0x80, +0x81, 0x19, 0x10, 0x03, 0x41, 0x00, 0x31, 0x48, +0x1C, 0x80, 0x91, 0x19, 0x00, 0x03, 0xD0, 0x0A, +0x00, 0x49, 0x11, 0x80, 0x90, 0x19, 0x98, 0x60, +0x90, 0x49, 0x60, 0x80, 0x00, 0x03, 0x3D, 0x00, +0x00, 0x0D, 0xEE, 0x0D, 0x05, 0x0E, 0xEF, 0x0D, +0x00, 0x03, 0xEE, 0x0D, 0x00, 0x49, 0x30, 0x80, +0x01, 0x39, 0x00, 0x0D, 0xEE, 0x0D, 0xFF, 0xA0, +0x00, 0x0E, 0x69, 0x0A, 0x00, 0x0E, 0x6B, 0x0A, +0x00, 0x0E, 0x6A, 0x0A, 0x00, 0x0E, 0xF6, 0x0D, +0x00, 0x0E, 0xF7, 0x0D, 0xD0, 0x03, 0x06, 0x02, +0xB0, 0x1A, 0xD5, 0x07, 0xC0, 0x1A, 0x15, 0x09, +0xA0, 0x03, 0xE1, 0x00, 0x90, 0x03, 0xD8, 0x00, +0x0B, 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0x01, 0x38, +0x0F, 0x51, 0x10, 0x80, 0x00, 0x31, 0x0A, 0x48, +0xCD, 0x80, 0x10, 0x03, 0x69, 0x0A, 0xFF, 0xFF, +0x11, 0x21, 0x01, 0x0D, 0x69, 0x0A, 0x10, 0x03, +0x6B, 0x0A, 0xFF, 0xFF, 0x10, 0x20, 0x01, 0x0D, +0x6B, 0x0A, 0x09, 0x48, 0x6D, 0x80, 0x10, 0x03, +0x6A, 0x0A, 0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, +0x6A, 0x0A, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0xF1, 0x85, 0x00, 0x03, 0x69, 0x0A, 0x80, 0x03, +0xE2, 0x00, 0x08, 0x48, 0x0C, 0x82, 0x00, 0x03, +0x6A, 0x0A, 0x80, 0x03, 0xD9, 0x00, 0x08, 0x48, +0xAA, 0x81, 0x00, 0x03, 0x6B, 0x0A, 0x80, 0x03, +0xE3, 0x00, 0x08, 0x48, 0x4C, 0x81, 0x00, 0x03, +0x6B, 0x0A, 0x80, 0x03, 0xE4, 0x00, 0x00, 0x0E, +0x19, 0xF9, 0x00, 0x0D, 0x18, 0xF9, 0x00, 0x0E, +0x1B, 0xF9, 0x08, 0x0D, 0x1A, 0xF9, 0x00, 0x03, +0x18, 0xF9, 0x00, 0x4A, 0xC8, 0x00, 0x4D, 0x80, +0x00, 0x1A, 0xC8, 0x00, 0x1F, 0x80, 0x00, 0x19, +0x80, 0x03, 0x13, 0x01, 0xFF, 0xFF, 0x80, 0x20, +0xFF, 0xA0, 0x0F, 0x98, 0x18, 0x10, 0xD0, 0x03, +0x06, 0x02, 0x60, 0x1A, 0x20, 0x00, 0x56, 0x18, +0x67, 0x38, 0x0C, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x0F, 0x51, 0x30, 0x19, 0x10, 0x80, 0x31, 0x39, +0x03, 0x0D, 0x11, 0xF9, 0xFF, 0xFF, 0x07, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, 0x11, 0xF9, +0xFF, 0xFF, 0x00, 0x0D, 0x00, 0xF9, 0x01, 0x0D, +0x01, 0xF9, 0x0B, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x0F, 0x51, 0x30, 0x19, 0x10, 0x80, 0x31, 0x39, +0x03, 0x0D, 0x11, 0xF9, 0xFF, 0xFF, 0x06, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, 0x11, 0xF9, +0xFF, 0xFF, 0x00, 0x0D, 0x02, 0xF9, 0x01, 0x0D, +0x03, 0xF9, 0xFF, 0xFF, 0x00, 0x03, 0x00, 0xF9, +0x10, 0x03, 0x01, 0xF9, 0xFF, 0xFF, 0x00, 0x0D, +0x18, 0xF9, 0x01, 0x0D, 0x19, 0xF9, 0x05, 0x0D, +0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x18, 0xF9, 0xB0, 0x08, 0xB1, 0x21, +0xC1, 0x21, 0xD1, 0x39, 0x01, 0x88, 0x74, 0x0E, +0xFF, 0xA0, 0xD0, 0x03, 0x06, 0x02, 0x0B, 0x00, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, +0xA1, 0x87, 0xFF, 0xA0, 0xD0, 0x03, 0x06, 0x02, +0xA0, 0x03, 0x4C, 0x00, 0x00, 0x0E, 0x62, 0x0A, +0x00, 0x0E, 0x63, 0x0A, 0x00, 0x0E, 0x00, 0xF9, +0x00, 0x0E, 0x01, 0xF9, 0x00, 0x0E, 0x02, 0xF9, +0x00, 0x0E, 0x03, 0xF9, 0x0B, 0x00, 0x1C, 0x00, +0xFF, 0xFF, 0xC0, 0x08, 0x01, 0x38, 0x0F, 0x51, +0x10, 0x80, 0x00, 0x31, 0x90, 0x03, 0x62, 0x0A, +0x09, 0x48, 0x2C, 0x80, 0x00, 0x0D, 0x62, 0x0A, +0x20, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x02, 0x0D, 0x00, 0xF9, 0x01, 0x0D, 0x01, 0xF9, +0x00, 0x0D, 0x02, 0xF9, 0x00, 0x0E, 0x03, 0xF9, +0x0A, 0x48, 0x6D, 0x80, 0x10, 0x03, 0x63, 0x0A, +0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, 0x63, 0x0A, +0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, 0xA1, 0x85, +0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x20, 0x03, 0x06, 0x02, 0xFF, 0xFF, 0x0F, 0x98, +0x17, 0x16, 0x00, 0x0D, 0x12, 0x02, 0xFF, 0xA0, +0xB0, 0x03, 0x21, 0x01, 0xB2, 0x49, 0xAC, 0x82, +0xB0, 0x1A, 0xD5, 0x07, 0xC0, 0x1A, 0xF8, 0x0D, +0x0F, 0x98, 0x6C, 0x0E, 0xB0, 0x1A, 0xD5, 0x07, +0xC0, 0x1A, 0xF8, 0x0D, 0x0F, 0x98, 0xBC, 0x0E, +0xB0, 0x03, 0x21, 0x01, 0xA0, 0x03, 0xF4, 0x0D, +0xFF, 0xFF, 0xA1, 0x21, 0xAB, 0x48, 0x4B, 0x80, +0x0A, 0x0D, 0xF4, 0x0D, 0x91, 0x19, 0xFF, 0xA0, +0xB0, 0x1A, 0xD5, 0x07, 0x0F, 0x98, 0xC5, 0x0E, +0xA0, 0x03, 0x62, 0x0A, 0x0A, 0x0D, 0x14, 0x00, +0xA0, 0x03, 0x12, 0x02, 0x0A, 0x0D, 0x9B, 0x00, +0xA0, 0x03, 0x63, 0x0A, 0x0A, 0x0D, 0x13, 0x00, +0x90, 0x19, 0xFF, 0xA0, 0xB0, 0x1A, 0xD5, 0x07, +0xC0, 0x1A, 0xF8, 0x0D, 0x0F, 0x98, 0x6C, 0x0E, +0xB0, 0x1A, 0xD5, 0x07, 0xC0, 0x1A, 0xF8, 0x0D, +0x0F, 0x98, 0xC5, 0x0E, 0xA0, 0x03, 0x62, 0x0A, +0x0A, 0x0D, 0x14, 0x00, 0xA0, 0x03, 0x12, 0x02, +0x0A, 0x0D, 0x9B, 0x00, 0xA0, 0x03, 0x63, 0x0A, +0x0A, 0x0D, 0x13, 0x00, 0x90, 0x19, 0xFF, 0xA0, +0xB0, 0x1A, 0xD5, 0x07, 0x0B, 0x0D, 0xC2, 0x01, +0x0F, 0x98, 0xD9, 0x0C, 0xB0, 0x1A, 0xD5, 0x07, +0x0F, 0x98, 0x6B, 0x0D, 0xA0, 0x1A, 0xD5, 0x07, +0x0F, 0x98, 0x88, 0x14, 0xA0, 0x1A, 0x15, 0x09, +0x0F, 0x98, 0x88, 0x14, 0x0F, 0x98, 0x0B, 0x0E, +0xD0, 0x03, 0x06, 0x02, 0xB0, 0x1A, 0xD5, 0x07, +0xC0, 0x1A, 0x15, 0x09, 0x00, 0x0E, 0xF3, 0x0D, +0x00, 0x0E, 0x00, 0xF9, 0x00, 0x0E, 0x01, 0xF9, +0x00, 0x0E, 0x02, 0xF9, 0x00, 0x0E, 0x03, 0xF9, +0x0B, 0x00, 0x1C, 0x00, 0xFF, 0xFF, 0xC0, 0x08, +0x01, 0x38, 0x0F, 0x51, 0x10, 0x80, 0x00, 0x31, +0x20, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x02, 0x0D, 0x00, 0xF9, 0x01, 0x0D, 0x01, 0xF9, +0x00, 0x0D, 0x02, 0xF9, 0x00, 0x0E, 0x03, 0xF9, +0x10, 0x03, 0x62, 0x0A, 0x01, 0x48, 0x2C, 0x80, +0x00, 0x0D, 0x62, 0x0A, 0x0A, 0x48, 0x6D, 0x80, +0x10, 0x03, 0x63, 0x0A, 0xFF, 0xFF, 0x11, 0x21, +0x01, 0x0D, 0x63, 0x0A, 0x08, 0x48, 0x6D, 0x80, +0x10, 0x03, 0xF3, 0x0D, 0xFF, 0xFF, 0x11, 0x21, +0x01, 0x0D, 0xF3, 0x0D, 0xB1, 0x21, 0xC1, 0x21, +0xD1, 0x39, 0x21, 0x85, 0x00, 0x03, 0x00, 0xF9, +0x10, 0x03, 0x01, 0xF9, 0x20, 0x03, 0x06, 0x02, +0xFF, 0xFF, 0x0F, 0x98, 0x17, 0x16, 0x00, 0x0D, +0x9A, 0x00, 0x10, 0x03, 0x62, 0x0A, 0x01, 0x0D, +0x99, 0x00, 0x0F, 0x98, 0xC7, 0x0D, 0xB0, 0x03, +0x0C, 0x00, 0xBF, 0x51, 0xA1, 0x80, 0x00, 0x0E, +0xF4, 0x0D, 0xA0, 0x03, 0x62, 0x0A, 0x0A, 0x0D, +0x14, 0x00, 0xA0, 0x03, 0x63, 0x0A, 0x0A, 0x0D, +0x13, 0x00, 0x00, 0x03, 0x14, 0x01, 0xA0, 0x03, +0xF3, 0x0D, 0x0A, 0x0D, 0xF2, 0x0D, 0xB0, 0x03, +0x0C, 0x00, 0xBE, 0x51, 0x70, 0x80, 0xA0, 0x48, +0x5C, 0x80, 0x00, 0x03, 0x11, 0x01, 0x00, 0x0D, +0xF5, 0x0D, 0xFF, 0xA0, 0xA0, 0x03, 0x0C, 0x00, +0xAF, 0x51, 0x50, 0x80, 0x0F, 0x98, 0x07, 0x0F, +0x90, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0xB0, 0x03, +0x0C, 0x00, 0xBF, 0x51, 0xA1, 0x80, 0xA0, 0x03, +0x99, 0x00, 0x0A, 0x0D, 0x14, 0x00, 0xA0, 0x03, +0x9A, 0x00, 0x0A, 0x0D, 0x12, 0x02, 0x0A, 0x0D, +0x9B, 0x00, 0x00, 0x0E, 0xF3, 0x0D, 0x00, 0x0E, +0xF4, 0x0D, 0xB0, 0x1A, 0xD5, 0x07, 0xD0, 0x03, +0x06, 0x02, 0xC0, 0x1A, 0x32, 0x02, 0x9B, 0x00, +0x00, 0x03, 0x15, 0x01, 0x00, 0x49, 0x10, 0x80, +0x91, 0x7B, 0x40, 0x1A, 0x00, 0x20, 0x49, 0x38, +0xAC, 0x00, 0xC4, 0x08, 0x50, 0x03, 0xBC, 0x01, +0x50, 0x49, 0x21, 0x81, 0x50, 0x03, 0x46, 0x00, +0x50, 0x49, 0xE0, 0x80, 0x5A, 0x18, 0x54, 0x38, +0x45, 0x18, 0x00, 0x03, 0x47, 0x00, 0x50, 0x48, +0x1D, 0x80, 0x40, 0x18, 0x00, 0x31, 0x50, 0x48, +0x1B, 0x80, 0x40, 0x18, 0xA4, 0x38, 0xCA, 0x08, +0xB1, 0x21, 0xC1, 0x21, 0xD1, 0x39, 0xB1, 0x85, +0xFF, 0xA0, 0x00, 0x0E, 0x05, 0xF8, 0x71, 0x19, +0xA0, 0x03, 0xD0, 0x0A, 0xA0, 0x49, 0xE0, 0x80, +0xA0, 0x03, 0x5D, 0x0A, 0xA0, 0x49, 0xA0, 0x80, +0xA0, 0x03, 0xB1, 0x0A, 0xA1, 0x49, 0x31, 0x80, +0x70, 0x03, 0x26, 0x00, 0xEF, 0x80, 0x70, 0x03, +0x27, 0x00, 0xBF, 0x80, 0x00, 0x03, 0xC6, 0x0A, +0x00, 0x49, 0x40, 0x80, 0x01, 0x39, 0x00, 0x0D, +0xC6, 0x0A, 0x5F, 0x87, 0x70, 0x03, 0x25, 0x00, +0xFF, 0xFF, 0xA0, 0x03, 0x0C, 0x00, 0xAF, 0x51, +0xF1, 0xA0, 0xFF, 0xFF, 0x70, 0x49, 0x00, 0x88, +0x2E, 0x0A, 0x60, 0x1A, 0x20, 0x00, 0x67, 0x38, +0x78, 0x7B, 0x76, 0x68, 0x07, 0x0D, 0x06, 0xF8, +0x05, 0x0E, 0x07, 0xF8, 0xFF, 0xA0, 0x00, 0x03, +0x15, 0x00, 0x00, 0x0D, 0x73, 0x0A, 0x00, 0x03, +0x33, 0x00, 0x00, 0x0D, 0x75, 0x0A, 0x00, 0x03, +0x31, 0x00, 0x00, 0x0D, 0x76, 0x0A, 0x00, 0x03, +0x32, 0x00, 0x00, 0x0D, 0x79, 0x0A, 0x00, 0x03, +0x10, 0x01, 0x00, 0x0D, 0x78, 0x0A, 0x00, 0x03, +0x30, 0x00, 0x10, 0x03, 0xF1, 0x0D, 0xFF, 0xFF, +0x01, 0x20, 0x00, 0x0D, 0x5B, 0x0A, 0x00, 0x03, +0xA6, 0x00, 0x00, 0x0D, 0xC3, 0x0A, 0x00, 0x03, +0x1F, 0x00, 0x00, 0x0D, 0x60, 0x0A, 0x00, 0x03, +0x20, 0x00, 0x00, 0x0D, 0x61, 0x0A, 0x00, 0x03, +0x1D, 0x00, 0x00, 0x0D, 0x5E, 0x0A, 0x00, 0x03, +0x1E, 0x00, 0x00, 0x0D, 0x5F, 0x0A, 0x00, 0x03, +0x2C, 0x00, 0x10, 0x18, 0x20, 0x18, 0x00, 0x62, +0xFF, 0x00, 0x00, 0x0D, 0x2C, 0x02, 0x18, 0x79, +0x1F, 0x61, 0x01, 0x0D, 0x2D, 0x02, 0x2C, 0x79, +0x02, 0x0D, 0x2E, 0x02, 0xFF, 0xA0, 0x00, 0x0E, +0xB3, 0x0D, 0x00, 0x0E, 0xB5, 0x0D, 0x80, 0x03, +0x55, 0x00, 0xFF, 0xFF, 0x81, 0x39, 0x08, 0x0D, +0xB6, 0x0D, 0x90, 0x03, 0x56, 0x00, 0xFF, 0xFF, +0x91, 0x39, 0x09, 0x0D, 0xB4, 0x0D, 0xFF, 0xA0, +0x0F, 0x98, 0x8A, 0x10, 0x10, 0x03, 0xA9, 0x00, +0x20, 0x03, 0xA8, 0x00, 0x20, 0x49, 0x91, 0x80, +0x10, 0x49, 0x31, 0x80, 0x01, 0x0E, 0xB5, 0x0D, +0xFF, 0xA0, 0x81, 0x39, 0x08, 0x0D, 0xB6, 0x0D, +0xFF, 0xA0, 0x10, 0x49, 0x31, 0x80, 0x01, 0x0E, +0xB3, 0x0D, 0xFF, 0xA0, 0x91, 0x39, 0x09, 0x0D, +0xB4, 0x0D, 0xFF, 0xA0, 0x00, 0x0E, 0x31, 0x02, +0x00, 0x03, 0xE5, 0x00, 0x0F, 0x51, 0xC0, 0x80, +0x01, 0x0E, 0x31, 0x02, 0x0F, 0x98, 0x8A, 0x10, +0x0F, 0x98, 0x1F, 0x2A, 0x00, 0x0E, 0x31, 0x02, +0x0F, 0x98, 0x9B, 0x10, 0x0F, 0x88, 0x1F, 0x2A, +0x0F, 0x98, 0x8A, 0x10, 0x0F, 0x88, 0x1F, 0x2A, +0x40, 0x03, 0x5B, 0x0A, 0xB0, 0x1A, 0x85, 0x0D, +0xA0, 0x19, 0x0B, 0x00, 0x04, 0x48, 0x2C, 0x80, +0x01, 0x21, 0xB0, 0x08, 0xC3, 0x21, 0xB1, 0x21, +0xA1, 0x21, 0xAF, 0x49, 0x61, 0x87, 0xFF, 0xA0, +0xB0, 0x1A, 0x85, 0x0D, 0xC0, 0x1A, 0xA3, 0x0D, +0xA0, 0x19, 0x40, 0x03, 0x51, 0x00, 0x50, 0x03, +0x30, 0x00, 0x00, 0x03, 0xF1, 0x0D, 0xFF, 0xFF, +0x40, 0x20, 0x50, 0x20, 0x0B, 0x00, 0x05, 0x48, +0x2C, 0x80, 0xB4, 0x08, 0x2F, 0x80, 0xB0, 0x0B, +0xC0, 0x0B, 0xC1, 0x21, 0xB1, 0x21, 0xA1, 0x21, +0xAF, 0x49, 0x41, 0x87, 0xFF, 0xA0, 0xB0, 0x1A, +0x85, 0x0D, 0xC0, 0x1A, 0xA3, 0x0D, 0xA0, 0x19, +0x50, 0x03, 0x51, 0x00, 0x40, 0x03, 0x30, 0x00, +0x00, 0x03, 0xF1, 0x0D, 0xFF, 0xFF, 0x40, 0x20, +0x50, 0x20, 0x0B, 0x00, 0x04, 0x48, 0x2C, 0x80, +0xB5, 0x08, 0x2F, 0x80, 0xB0, 0x0B, 0xC0, 0x0B, +0xC1, 0x21, 0xB1, 0x21, 0xA1, 0x21, 0xAF, 0x49, +0x41, 0x87, 0xFF, 0xA0, 0xB0, 0x1A, 0xF2, 0x05, +0x60, 0x1A, 0x34, 0x0D, 0xC0, 0x19, 0x80, 0x03, +0x55, 0x00, 0x90, 0x03, 0x56, 0x00, 0x30, 0x03, +0x73, 0x0A, 0x00, 0x19, 0x10, 0x19, 0xD0, 0x19, +0xAC, 0x18, 0x4B, 0x18, 0x4A, 0x20, 0x24, 0x00, +0x23, 0x48, 0x4C, 0x80, 0xFF, 0xFF, 0xD1, 0x21, +0x0F, 0x98, 0x97, 0x15, 0xA9, 0x20, 0x20, 0x03, +0x06, 0x02, 0xA2, 0x48, 0x2C, 0x87, 0x2D, 0x18, +0x20, 0x49, 0x40, 0x80, 0x0F, 0x98, 0x17, 0x16, +0x60, 0x08, 0x3F, 0x80, 0x00, 0x1A, 0x10, 0x27, +0x60, 0x08, 0x61, 0x21, 0xC1, 0x21, 0xC9, 0x48, +0x0C, 0x86, 0xFF, 0xA0, 0xB0, 0x1A, 0xF2, 0x05, +0x60, 0x1A, 0x44, 0x0D, 0xC0, 0x19, 0x80, 0x03, +0x55, 0x00, 0x90, 0x03, 0x56, 0x00, 0x30, 0x03, +0x73, 0x0A, 0x00, 0x19, 0x10, 0x19, 0xA0, 0x19, +0xD0, 0x19, 0x4B, 0x18, 0x4A, 0x20, 0x24, 0x00, +0x23, 0x48, 0x4C, 0x80, 0xFF, 0xFF, 0xD1, 0x21, +0x0F, 0x98, 0x97, 0x15, 0xA1, 0x21, 0xA9, 0x48, +0x4C, 0x87, 0x2D, 0x18, 0x20, 0x49, 0x40, 0x80, +0x0F, 0x98, 0x17, 0x16, 0x60, 0x08, 0x3F, 0x80, +0x00, 0x1A, 0x10, 0x27, 0x60, 0x08, 0x61, 0x21, +0xC9, 0x20, 0xB9, 0x20, 0x10, 0x03, 0x06, 0x02, +0xC1, 0x48, 0xFC, 0x85, 0xFF, 0xA0, 0x00, 0x03, +0x0C, 0x00, 0x08, 0x51, 0xF0, 0xA0, 0xFF, 0xFF, +0x00, 0x03, 0x9A, 0x00, 0x20, 0x03, 0x1B, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0xFE, 0x15, 0x10, 0x03, +0x1C, 0x00, 0x20, 0x03, 0x9A, 0x00, 0x30, 0x03, +0x2F, 0x00, 0x23, 0x48, 0x2D, 0x80, 0xFF, 0xFF, +0x11, 0x7B, 0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, +0xA0, 0x03, 0x43, 0x00, 0xFF, 0xFF, 0xA0, 0x20, +0x00, 0x03, 0x62, 0x0A, 0x10, 0x03, 0xCD, 0x00, +0x10, 0x49, 0xA0, 0x81, 0x00, 0x0D, 0x18, 0xF9, +0x00, 0x0E, 0x19, 0xF9, 0x01, 0x0D, 0x1A, 0xF9, +0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x18, 0xF9, 0x10, 0x03, 0xCE, 0x00, 0x00, 0x0D, +0x10, 0xF9, 0x00, 0x0E, 0x11, 0xF9, 0x01, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0xA0, 0x20, +0x03, 0x19, 0x12, 0x19, 0xB0, 0x03, 0x71, 0x0A, +0xAB, 0x48, 0x2B, 0x80, 0x0F, 0x19, 0x14, 0x19, +0xFF, 0xFF, 0xB0, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xB0, 0x1E, 0xAB, 0x20, 0xA0, 0x20, +0xA1, 0x78, 0x0A, 0x0D, 0x71, 0x0A, 0x00, 0x03, +0x73, 0x0A, 0xA0, 0x48, 0x9B, 0x80, 0x00, 0x0E, +0x74, 0x0A, 0xA0, 0x03, 0x73, 0x0A, 0x0A, 0x0D, +0x71, 0x0A, 0x0A, 0x0D, 0x44, 0x00, 0xFF, 0xA0, +0x0A, 0x0D, 0x44, 0x00, 0xA0, 0x38, 0x0A, 0x0D, +0x74, 0x0A, 0xFF, 0xA0, 0x00, 0x0E, 0xC2, 0x0D, +0x00, 0x0E, 0xD4, 0x0A, 0x00, 0x0E, 0xF3, 0x0A, +0x00, 0x0E, 0x4A, 0x0B, 0x00, 0x0E, 0x4B, 0x0B, +0x10, 0x03, 0xF1, 0x0D, 0x00, 0x03, 0xEF, 0x0D, +0x00, 0x49, 0xF1, 0x81, 0x10, 0x19, 0xB0, 0x03, +0x0C, 0x00, 0xBE, 0x51, 0x80, 0x82, 0x00, 0x03, +0xF2, 0x0D, 0x00, 0x49, 0xC0, 0x80, 0x10, 0x03, +0xF1, 0x0D, 0x00, 0x03, 0x12, 0x01, 0x10, 0x48, +0x3B, 0x80, 0x11, 0x21, 0x0F, 0x98, 0xCB, 0x10, +0x01, 0x0D, 0xF1, 0x0D, 0xFF, 0xA0, 0x10, 0x19, +0x00, 0x03, 0xF5, 0x0D, 0x00, 0x49, 0x30, 0x81, +0x01, 0x39, 0x00, 0x0D, 0xF5, 0x0D, 0x00, 0x49, +0xE0, 0x80, 0x10, 0x03, 0xF1, 0x0D, 0x00, 0x03, +0x12, 0x01, 0x10, 0x48, 0x8B, 0x80, 0x11, 0x21, +0x0F, 0x98, 0xCB, 0x10, 0x00, 0x03, 0xF2, 0x0D, +0x00, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x01, 0x0D, +0xF1, 0x0D, 0x00, 0x03, 0xF4, 0x0D, 0x00, 0x49, +0xF1, 0xA0, 0xFF, 0xFF, 0x00, 0x03, 0x05, 0x00, +0x00, 0x4A, 0x33, 0x00, 0x40, 0x80, 0x00, 0x03, +0x46, 0x00, 0x00, 0x49, 0x60, 0x80, 0x0F, 0x98, +0xE4, 0x14, 0x0F, 0x98, 0xB5, 0x10, 0x0F, 0x98, +0x6C, 0x15, 0x0F, 0x98, 0x74, 0x14, 0x0F, 0x98, +0xC4, 0x16, 0x90, 0x49, 0x00, 0x88, 0x48, 0x16, +0xA0, 0x03, 0x62, 0x0A, 0xB0, 0x03, 0x5F, 0x0A, +0xAB, 0x48, 0x2C, 0x80, 0x00, 0x0E, 0x6C, 0x0A, +0x0F, 0x98, 0x51, 0x19, 0x90, 0x49, 0x30, 0x80, +0x05, 0x0E, 0xBC, 0x01, 0xFF, 0xA0, 0x0F, 0x98, +0xE4, 0x14, 0xA0, 0x03, 0x45, 0x00, 0xA0, 0x49, +0x61, 0x80, 0xA0, 0x03, 0x46, 0x00, 0xA0, 0x49, +0x00, 0x88, 0x9E, 0x12, 0x5F, 0x80, 0x0F, 0x98, +0xF3, 0x20, 0x80, 0x49, 0x00, 0x88, 0x9E, 0x12, +0x00, 0x03, 0x46, 0x00, 0x10, 0x03, 0x4E, 0x00, +0x01, 0x48, 0x30, 0x81, 0x01, 0x0D, 0x46, 0x00, +0x00, 0x03, 0x7A, 0x0A, 0x00, 0x49, 0x01, 0x88, +0x6C, 0x15, 0x01, 0x0E, 0x7A, 0x0A, 0x0F, 0x98, +0xDB, 0x10, 0x00, 0x0E, 0x6C, 0x0A, 0x00, 0x0E, +0x55, 0x0A, 0x0F, 0x98, 0x6C, 0x15, 0x0F, 0x88, +0xC2, 0x08, 0x00, 0x03, 0x48, 0x00, 0x00, 0x0D, +0x73, 0x0A, 0x00, 0x0D, 0x70, 0x0A, 0x00, 0x03, +0x51, 0x00, 0x10, 0x03, 0xF1, 0x0D, 0xFF, 0xFF, +0x01, 0x20, 0x00, 0x0D, 0x5B, 0x0A, 0x00, 0x0D, +0xC3, 0x0A, 0x00, 0x03, 0x24, 0x00, 0x00, 0x0D, +0x60, 0x0A, 0x00, 0x0D, 0x61, 0x0A, 0x00, 0x03, +0x22, 0x00, 0x00, 0x0D, 0x5E, 0x0A, 0x00, 0x03, +0x23, 0x00, 0x00, 0x0D, 0x5F, 0x0A, 0x00, 0x03, +0x2C, 0x00, 0x10, 0x18, 0x20, 0x18, 0x00, 0x62, +0xFF, 0x00, 0x00, 0x0D, 0x2C, 0x02, 0x18, 0x79, +0x1F, 0x61, 0x01, 0x0D, 0x2D, 0x02, 0x2C, 0x79, +0x21, 0x21, 0x02, 0x0D, 0x2E, 0x02, 0xA0, 0x03, +0x0C, 0x00, 0xA5, 0x51, 0x01, 0x88, 0x08, 0x13, +0x00, 0x03, 0x4F, 0x00, 0x00, 0x0D, 0x75, 0x0A, +0x00, 0x03, 0x50, 0x00, 0x00, 0x0D, 0x76, 0x0A, +0x00, 0x0D, 0x79, 0x0A, 0x4F, 0x81, 0xA0, 0x03, +0x46, 0x00, 0xA0, 0x49, 0x40, 0x80, 0xA1, 0x39, +0x0A, 0x0D, 0x46, 0x00, 0x8F, 0x86, 0x00, 0x03, +0x7A, 0x0A, 0x00, 0x49, 0x60, 0x80, 0x00, 0x0E, +0x7A, 0x0A, 0x0F, 0x98, 0xF6, 0x10, 0x0F, 0x88, +0x6C, 0x15, 0x0F, 0x98, 0x4A, 0x10, 0x00, 0x03, +0x5B, 0x0A, 0x00, 0x0D, 0x9C, 0x00, 0x00, 0x03, +0x0C, 0x00, 0x07, 0x51, 0x60, 0x80, 0x00, 0x03, +0xBC, 0x0D, 0x00, 0x49, 0x20, 0x80, 0x0F, 0x88, +0x08, 0x13, 0x0F, 0x98, 0xCB, 0x14, 0x0F, 0x98, +0xB2, 0x17, 0x90, 0x49, 0x00, 0x88, 0x08, 0x13, +0x95, 0x49, 0xB0, 0x83, 0x00, 0x03, 0xBC, 0x0D, +0x00, 0x49, 0xD0, 0x80, 0x00, 0x03, 0x37, 0x00, +0x00, 0x49, 0x90, 0x80, 0x10, 0x03, 0xBE, 0x0D, +0xFF, 0xFF, 0x11, 0x21, 0x01, 0x0D, 0xBE, 0x0D, +0x10, 0x48, 0x0C, 0x88, 0x6C, 0x15, 0x00, 0x03, +0x37, 0x00, 0x00, 0x0D, 0xBE, 0x0D, 0x92, 0x49, +0x01, 0x81, 0x00, 0x03, 0xEE, 0x0D, 0x00, 0x49, +0x41, 0x80, 0x00, 0x03, 0x36, 0x00, 0x00, 0x0D, +0xB7, 0x0D, 0x01, 0x0E, 0xD6, 0x0A, 0x0F, 0x98, +0x6C, 0x15, 0x0F, 0x98, 0x57, 0x17, 0x0F, 0x88, +0x48, 0x16, 0xA0, 0x03, 0x0C, 0x00, 0xA4, 0x51, +0x80, 0x80, 0xA0, 0x03, 0xB7, 0x0D, 0xA0, 0x49, +0x40, 0x80, 0xA1, 0x39, 0x0A, 0x0D, 0xB7, 0x0D, +0xEF, 0x86, 0x00, 0x0E, 0xD6, 0x0A, 0x0F, 0x98, +0x6C, 0x15, 0x0F, 0x98, 0x57, 0x17, 0x0F, 0x88, +0x48, 0x16, 0x0F, 0x98, 0x6C, 0x15, 0x0F, 0x88, +0x57, 0x17, 0x00, 0x0E, 0xBE, 0x0D, 0x00, 0x0E, +0xD6, 0x0A, 0xA0, 0x03, 0x0C, 0x00, 0xA4, 0x51, +0x80, 0x80, 0xA0, 0x03, 0xB7, 0x0D, 0xA0, 0x49, +0x40, 0x80, 0xA1, 0x39, 0x0A, 0x0D, 0xB7, 0x0D, +0x2F, 0x85, 0x00, 0x03, 0x05, 0x00, 0x00, 0x4A, +0x33, 0x00, 0x60, 0x80, 0x00, 0x03, 0x46, 0x00, +0x00, 0x49, 0x00, 0x98, 0xB5, 0x10, 0xFF, 0xFF, +0xA0, 0x03, 0x06, 0x02, 0xC0, 0x03, 0xB0, 0x0A, +0xB0, 0x1A, 0xF2, 0x05, 0xD0, 0x19, 0x9B, 0x00, +0xFF, 0xFF, 0xB1, 0x21, 0x9C, 0x48, 0x1C, 0x80, +0xC9, 0x18, 0x9D, 0x48, 0x1C, 0x80, 0xD9, 0x18, +0xA1, 0x39, 0x51, 0x87, 0x0C, 0x0D, 0xB0, 0x0A, +0x0D, 0x0D, 0xB3, 0x0A, 0x0D, 0x0D, 0xB4, 0x0A, +0x20, 0x03, 0x2A, 0x00, 0x0D, 0x18, 0x0F, 0x98, +0xFE, 0x15, 0x00, 0x0D, 0xE9, 0x0D, 0xA0, 0x1A, +0xE9, 0x0D, 0x0F, 0x98, 0x12, 0x30, 0x00, 0x03, +0x0C, 0x00, 0x08, 0x51, 0x40, 0x82, 0xA0, 0x03, +0x73, 0x0A, 0x00, 0x03, 0x46, 0x00, 0x00, 0x49, +0x01, 0x88, 0x94, 0x13, 0x00, 0x03, 0xB0, 0x0A, +0x20, 0x03, 0x1A, 0x00, 0x20, 0x49, 0x00, 0x81, +0x0F, 0x98, 0xFE, 0x15, 0xA0, 0x18, 0xB0, 0x03, +0x71, 0x0A, 0xAB, 0x48, 0x9D, 0x80, 0x0A, 0x0D, +0x70, 0x0A, 0x10, 0x03, 0x73, 0x0A, 0x0A, 0x18, +0x01, 0x38, 0x00, 0x0D, 0x74, 0x0A, 0xDF, 0x82, +0xA0, 0x03, 0x71, 0x0A, 0x0A, 0x0D, 0x70, 0x0A, +0x00, 0x0E, 0x74, 0x0A, 0x6F, 0x82, 0xA0, 0x03, +0x57, 0x0A, 0xA0, 0x49, 0xA0, 0x82, 0xA0, 0x03, +0x73, 0x0A, 0x00, 0x03, 0x46, 0x00, 0x00, 0x49, +0xC1, 0x81, 0x00, 0x03, 0xB0, 0x0A, 0x20, 0x03, +0x1A, 0x00, 0x20, 0x49, 0x00, 0x81, 0x0F, 0x98, +0xFE, 0x15, 0xA0, 0x18, 0xB0, 0x03, 0x73, 0x0A, +0xAB, 0x48, 0x9D, 0x80, 0x0A, 0x0D, 0x70, 0x0A, +0x10, 0x03, 0x73, 0x0A, 0x0A, 0x18, 0x01, 0x38, +0x00, 0x0D, 0x74, 0x0A, 0x6F, 0x80, 0xA0, 0x03, +0x73, 0x0A, 0x0A, 0x0D, 0x70, 0x0A, 0x00, 0x0E, +0x74, 0x0A, 0x10, 0x03, 0x73, 0x0A, 0xA1, 0x48, +0x4A, 0x80, 0x00, 0x0E, 0x74, 0x0A, 0x01, 0x0D, +0x70, 0x0A, 0xA0, 0x03, 0x70, 0x0A, 0x10, 0x03, +0xF1, 0x0D, 0x10, 0x49, 0x90, 0x80, 0x10, 0x03, +0x42, 0x00, 0x00, 0x03, 0xEE, 0x0D, 0xFF, 0xFF, +0xA1, 0x20, 0xA0, 0x20, 0x0A, 0x0D, 0x70, 0x0A, +0x0A, 0x0D, 0x12, 0x00, 0x00, 0x1A, 0xF2, 0x05, +0x00, 0x0D, 0xD1, 0x0A, 0x0A, 0x0D, 0x72, 0x0A, +0x0F, 0x98, 0x65, 0x1C, 0x00, 0x03, 0x6D, 0x0A, +0x00, 0x49, 0x00, 0x88, 0xF0, 0x12, 0x0F, 0x98, +0x99, 0x1A, 0x00, 0x03, 0x6D, 0x0A, 0x00, 0x49, +0x00, 0x88, 0xF0, 0x12, 0x00, 0x03, 0x0C, 0x00, +0x09, 0x51, 0x40, 0x80, 0x0F, 0x98, 0x11, 0x11, +0x0F, 0x98, 0x3D, 0x11, 0x00, 0x0E, 0x6C, 0x0A, +0x80, 0x03, 0xB0, 0x0A, 0x90, 0x03, 0xBA, 0x00, +0xA0, 0x03, 0x58, 0x0A, 0xA0, 0x49, 0xA0, 0x80, +0x89, 0x48, 0x3D, 0x80, 0x00, 0x0E, 0xB1, 0x0A, +0xCF, 0x80, 0xA0, 0x03, 0xB2, 0x0A, 0x0A, 0x0D, +0xB1, 0x0A, 0x7F, 0x80, 0x89, 0x48, 0x3D, 0x80, +0x00, 0x0E, 0xB1, 0x0A, 0x2F, 0x80, 0x01, 0x0E, +0xB1, 0x0A, 0xA0, 0x03, 0xB1, 0x0A, 0x0A, 0x0D, +0xB2, 0x0A, 0x02, 0x0E, 0xD0, 0x0A, 0x00, 0x03, +0x6D, 0x0A, 0x00, 0x0D, 0x6E, 0x0A, 0x0F, 0x98, +0x5B, 0x1D, 0x00, 0x03, 0x0C, 0x00, 0x0D, 0x51, +0xA0, 0x80, 0x0F, 0x98, 0xCD, 0x1F, 0xD0, 0x03, +0x6D, 0x0A, 0xD0, 0x49, 0x41, 0x80, 0x0F, 0x98, +0x6C, 0x15, 0x0F, 0x88, 0x48, 0x16, 0x10, 0x03, +0xE5, 0x00, 0x1F, 0x51, 0xF0, 0x80, 0xD0, 0x03, +0x6E, 0x0A, 0xFF, 0xFF, 0x0F, 0x98, 0x3A, 0x1B, +0x90, 0x49, 0x80, 0x80, 0x00, 0x03, 0x21, 0x00, +0x00, 0x0D, 0xBC, 0x0D, 0x0F, 0x98, 0x6C, 0x15, +0x0F, 0x88, 0x5F, 0x16, 0x00, 0x03, 0x6D, 0x0A, +0x00, 0x49, 0x4A, 0x80, 0x0F, 0x98, 0x5F, 0x16, +0x0F, 0x88, 0x6C, 0x15, 0x00, 0x03, 0x6D, 0x0A, +0x00, 0x0D, 0x6F, 0x0A, 0x0F, 0x98, 0x8A, 0x21, +0xA0, 0x03, 0x6D, 0x0A, 0xA0, 0x49, 0x00, 0x88, +0xF0, 0x12, 0x0F, 0x98, 0x6C, 0x15, 0x0F, 0x98, +0x51, 0x26, 0xA0, 0x03, 0x6E, 0x0A, 0xA0, 0x49, +0x4A, 0x80, 0x0F, 0x98, 0x33, 0x16, 0x0F, 0x88, +0x57, 0x17, 0x00, 0x03, 0x6E, 0x0A, 0x00, 0x0D, +0x6D, 0x0A, 0x0F, 0x98, 0xCF, 0x1D, 0x0F, 0x98, +0x2D, 0x1F, 0xA0, 0x03, 0x6D, 0x0A, 0xA0, 0x49, +0x4A, 0x80, 0x0F, 0x98, 0x48, 0x16, 0x0F, 0x88, +0x57, 0x17, 0x0A, 0x0D, 0x5A, 0x0A, 0x0F, 0x98, +0x8B, 0x20, 0xA0, 0x03, 0x6D, 0x0A, 0x0A, 0x0D, +0x58, 0x0A, 0xA0, 0x03, 0x6D, 0x0A, 0x0A, 0x0D, +0x57, 0x0A, 0x0F, 0x98, 0x95, 0x29, 0x00, 0x03, +0x05, 0x00, 0x00, 0x4A, 0x33, 0x00, 0x00, 0x98, +0x74, 0x14, 0xFF, 0xFF, 0xA0, 0x03, 0x4C, 0x0B, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x4C, 0x0B, +0xA0, 0x03, 0xF0, 0x0D, 0xA0, 0x4A, 0x30, 0x75, +0x3B, 0x80, 0xA1, 0x21, 0x0A, 0x0D, 0xF0, 0x0D, +0x00, 0x03, 0x3C, 0x00, 0xA0, 0x48, 0x2D, 0x80, +0x00, 0x0E, 0xEF, 0x0D, 0xA0, 0x03, 0x08, 0x0B, +0xA0, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x00, 0x0E, +0x4A, 0x0B, 0x00, 0x0E, 0x4B, 0x0B, 0x0F, 0x88, +0x57, 0x17, 0x90, 0x1A, 0x4A, 0x0B, 0x80, 0x1A, +0xF2, 0x05, 0x00, 0x03, 0x06, 0x02, 0xFF, 0xFF, +0x80, 0x20, 0x09, 0x00, 0x80, 0x08, 0x90, 0x1A, +0x0E, 0x0B, 0x81, 0x21, 0x09, 0x00, 0x80, 0x08, +0x91, 0x21, 0x81, 0x21, 0x09, 0x00, 0x80, 0x08, +0xFF, 0xA0, 0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, +0xF0, 0xA0, 0xFF, 0xFF, 0xB0, 0x03, 0x56, 0x00, +0xC0, 0x03, 0x55, 0x00, 0x10, 0x03, 0xA9, 0x00, +0x00, 0x03, 0xA8, 0x00, 0x00, 0x49, 0x91, 0x80, +0x0B, 0x18, 0x0F, 0x98, 0xBD, 0x15, 0xA0, 0x20, +0x4B, 0x18, 0x20, 0x03, 0xAA, 0x00, 0x11, 0x19, +0xAF, 0x80, 0xA1, 0x20, 0x4C, 0x18, 0x0B, 0x18, +0x10, 0x03, 0xAA, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0xBD, 0x15, 0x20, 0x18, 0x1B, 0x18, 0x70, 0x03, +0xA5, 0x00, 0x80, 0x19, 0x90, 0x19, 0x87, 0x48, +0xAB, 0x80, 0xB0, 0x19, 0x60, 0x1A, 0xAB, 0x00, +0x6B, 0x20, 0x36, 0x00, 0x39, 0x48, 0x80, 0x80, +0xB1, 0x21, 0xB7, 0x48, 0x71, 0x87, 0xA0, 0x0B, +0x51, 0x18, 0x41, 0x39, 0x91, 0x21, 0x8F, 0x80, +0x61, 0x21, 0x81, 0x21, 0x52, 0x18, 0x30, 0x03, +0xAA, 0x00, 0xFF, 0xFF, 0x43, 0x38, 0x93, 0x20, +0xA5, 0x20, 0x40, 0x49, 0x41, 0x86, 0xFF, 0xA0, +0xA0, 0x03, 0x31, 0x00, 0xB0, 0x03, 0x10, 0x01, +0x00, 0x03, 0xEE, 0x0D, 0x10, 0x03, 0xF5, 0x0D, +0xFF, 0xFF, 0x10, 0x68, 0x00, 0x03, 0xF2, 0x0D, +0xFF, 0xFF, 0x10, 0x68, 0x10, 0x49, 0x40, 0x80, +0x39, 0xC1, 0xA3, 0x7B, 0xB2, 0x7B, 0x0F, 0x80, +0x0A, 0x0D, 0x76, 0x0A, 0x0B, 0x0D, 0x78, 0x0A, +0xFF, 0xA0, 0xA0, 0x1A, 0x32, 0x02, 0x0F, 0x98, +0x88, 0x14, 0xA0, 0x1A, 0xB2, 0x04, 0x0F, 0x98, +0x88, 0x14, 0x80, 0x1A, 0x00, 0x80, 0x90, 0x1A, +0xFF, 0x7F, 0xC0, 0x03, 0x06, 0x02, 0xD0, 0x1A, +0x32, 0x02, 0x40, 0x1A, 0xB2, 0x04, 0xAD, 0x00, +0xB4, 0x00, 0xFF, 0xFF, 0xAB, 0x38, 0xDA, 0x08, +0xA8, 0x48, 0x1D, 0x80, 0x8A, 0x18, 0xA9, 0x48, +0x1B, 0x80, 0x9A, 0x18, 0xD1, 0x21, 0x41, 0x21, +0xC1, 0x39, 0x11, 0x87, 0x08, 0x0D, 0x10, 0x02, +0x09, 0x0D, 0x11, 0x02, 0x0F, 0x98, 0x0C, 0x15, +0xFF, 0xA0, 0xC0, 0x03, 0x06, 0x02, 0xD0, 0x1A, +0x32, 0x02, 0x50, 0x1A, 0x72, 0x03, 0xA0, 0x03, +0x77, 0x0A, 0x30, 0x03, 0x11, 0x02, 0xFF, 0xFF, +0xA3, 0x20, 0xA1, 0x79, 0xAE, 0x51, 0xAF, 0xC5, +0x0A, 0x0D, 0x77, 0x0A, 0xA3, 0x48, 0x1D, 0x80, +0xA3, 0x18, 0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, +0x3A, 0x18, 0xA1, 0x79, 0x3A, 0x20, 0x20, 0x03, +0x17, 0x02, 0x60, 0x03, 0x2B, 0x00, 0x60, 0x62, +0xFF, 0x00, 0x26, 0x48, 0x2A, 0x80, 0x13, 0x19, +0x9F, 0x80, 0x60, 0x03, 0x2B, 0x00, 0xFF, 0xFF, +0x68, 0x79, 0x26, 0x48, 0x2A, 0x80, 0x12, 0x19, +0x1F, 0x80, 0x11, 0x19, 0xAD, 0x00, 0x60, 0x03, +0x0C, 0x00, 0x63, 0x51, 0x61, 0x80, 0x6A, 0x18, +0x60, 0x49, 0x1B, 0x80, 0x60, 0x19, 0x56, 0x08, +0xFF, 0x81, 0x65, 0x00, 0xFF, 0xFF, 0x6A, 0x38, +0x6F, 0x51, 0x10, 0x80, 0x60, 0x31, 0x70, 0x03, +0xBE, 0x00, 0x70, 0x49, 0x60, 0x80, 0x76, 0x48, +0x4B, 0x80, 0x75, 0x00, 0x7A, 0x48, 0x1B, 0x80, +0xFF, 0x80, 0x75, 0x00, 0x5A, 0x08, 0x63, 0x48, +0xBB, 0x80, 0x61, 0x78, 0x51, 0x0B, 0xA0, 0x49, +0x7D, 0x80, 0xA7, 0x48, 0x1B, 0x80, 0x76, 0x38, +0xA7, 0x48, 0x1D, 0x80, 0x76, 0x20, 0x57, 0x08, +0x75, 0x00, 0x70, 0x49, 0x1B, 0x80, 0x51, 0x0B, +0x51, 0x21, 0xD1, 0x21, 0xC1, 0x39, 0xE1, 0x84, +0xFF, 0xA0, 0xC0, 0x03, 0x06, 0x02, 0xD0, 0x1A, +0x32, 0x02, 0x40, 0x1A, 0xB2, 0x04, 0xAD, 0x00, +0xB4, 0x00, 0xFF, 0xFF, 0xAB, 0x20, 0xDA, 0x08, +0xD1, 0x21, 0x41, 0x21, 0xC1, 0x39, 0x71, 0x87, +0xFF, 0xA0, 0x03, 0x0D, 0x0E, 0x02, 0x30, 0x19, +0x0F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x00, 0x0D, +0x00, 0xF9, 0x03, 0x0D, 0x01, 0xF9, 0x30, 0x19, +0x1F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x01, 0x0D, +0x02, 0xF9, 0x03, 0x0D, 0x03, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0x30, 0x03, 0x0E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, +0x03, 0x0D, 0x0E, 0x02, 0x00, 0x0D, 0x00, 0xF9, +0x01, 0x0D, 0x01, 0xF9, 0x30, 0x19, 0x2F, 0x51, +0x10, 0x80, 0x31, 0x39, 0x02, 0x0D, 0x02, 0xF9, +0x03, 0x0D, 0x03, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, 0x30, 0x03, +0x0E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, 0x00, 0x0D, +0x00, 0xF9, 0x01, 0x0D, 0x01, 0xF9, 0x02, 0x0D, +0x02, 0xF9, 0x03, 0x0D, 0x03, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, 0x01, 0xF9, +0xFF, 0xFF, 0xFF, 0xA0, 0x03, 0x0D, 0x0E, 0x02, +0x00, 0x0D, 0x10, 0xF9, 0x30, 0x19, 0x0F, 0x51, +0x10, 0x80, 0x31, 0x39, 0x03, 0x0D, 0x11, 0xF9, +0x30, 0x19, 0x1F, 0x51, 0x10, 0x80, 0x31, 0x39, +0x01, 0x0D, 0x12, 0xF9, 0x03, 0x0D, 0x13, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, +0x11, 0xF9, 0x30, 0x03, 0x0E, 0x02, 0xFF, 0xFF, +0xFF, 0xA0, 0x03, 0x0D, 0x0E, 0x02, 0x00, 0x0D, +0x10, 0xF9, 0x01, 0x0D, 0x11, 0xF9, 0x30, 0x19, +0x2F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x02, 0x0D, +0x12, 0xF9, 0x03, 0x0D, 0x13, 0xF9, 0xFF, 0xFF, +0x00, 0x03, 0x10, 0xF9, 0x10, 0x03, 0x11, 0xF9, +0x30, 0x03, 0x0E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, +0x00, 0x0D, 0x08, 0xF9, 0x01, 0x0D, 0x09, 0xF9, +0x02, 0x0D, 0x0A, 0xF9, 0x03, 0x0D, 0x0B, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x08, 0xF9, 0x10, 0x03, +0x09, 0xF9, 0xFF, 0xFF, 0xFF, 0xA0, 0x03, 0x0D, +0x0E, 0x02, 0x00, 0x0D, 0x18, 0xF9, 0x30, 0x19, +0x0F, 0x51, 0x10, 0x80, 0x31, 0x39, 0x03, 0x0D, +0x19, 0xF9, 0x30, 0x19, 0x2F, 0x51, 0x10, 0x80, +0x31, 0x39, 0x02, 0x0D, 0x1A, 0xF9, 0x03, 0x0D, +0x1B, 0xF9, 0xFF, 0xFF, 0x00, 0x03, 0x18, 0xF9, +0x30, 0x03, 0x0E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, +0x03, 0x0D, 0x0E, 0x02, 0x00, 0x0D, 0x18, 0xF9, +0x01, 0x0D, 0x19, 0xF9, 0x30, 0x19, 0x2F, 0x51, +0x10, 0x80, 0x31, 0x39, 0x02, 0x0D, 0x1A, 0xF9, +0x03, 0x0D, 0x1B, 0xF9, 0xFF, 0xFF, 0x00, 0x03, +0x18, 0xF9, 0x10, 0x03, 0x19, 0xF9, 0x30, 0x03, +0x0E, 0x02, 0xFF, 0xFF, 0xFF, 0xA0, 0xAF, 0x51, +0xF0, 0xA0, 0xFF, 0xFF, 0xA0, 0x31, 0xFF, 0xA0, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0x30, 0x80, +0xD0, 0x19, 0x0F, 0x98, 0x3A, 0x1B, 0x00, 0x03, +0xBC, 0x0D, 0x00, 0x49, 0x30, 0x80, 0x01, 0x39, +0x00, 0x0D, 0xBC, 0x0D, 0x00, 0x0E, 0xBE, 0x0D, +0x00, 0x0E, 0x74, 0x0A, 0x00, 0x0E, 0x6D, 0x0A, +0xBF, 0x81, 0x00, 0x03, 0xD0, 0x0A, 0x00, 0x49, +0x30, 0x80, 0x01, 0x39, 0x00, 0x0D, 0xD0, 0x0A, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0x30, 0x80, +0xD0, 0x19, 0x0F, 0x98, 0x3A, 0x1B, 0x00, 0x03, +0xBC, 0x0D, 0x00, 0x49, 0x30, 0x80, 0x01, 0x39, +0x00, 0x0D, 0xBC, 0x0D, 0x00, 0x0E, 0x74, 0x0A, +0x00, 0x0E, 0x6D, 0x0A, 0x0F, 0x98, 0x51, 0x26, +0x0F, 0x98, 0xCF, 0x1D, 0x0F, 0x98, 0x2D, 0x1F, +0x0F, 0x98, 0x95, 0x29, 0x00, 0x0E, 0x4C, 0x0B, +0x00, 0x0E, 0xF0, 0x0D, 0x00, 0x0E, 0x4B, 0x0B, +0x00, 0x0E, 0x57, 0x0A, 0x00, 0x0E, 0x58, 0x0A, +0x00, 0x0E, 0x5A, 0x0A, 0x00, 0x0E, 0x5C, 0x0A, +0x00, 0x0E, 0x5D, 0x0A, 0x00, 0x0E, 0x17, 0x02, +0xA0, 0x19, 0xA0, 0x03, 0x70, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xB0, 0x03, 0x73, 0x0A, +0xA0, 0x1E, 0xAB, 0x20, 0xA3, 0x21, 0xA2, 0x79, +0x0A, 0x0D, 0x70, 0x0A, 0x0A, 0x0D, 0x12, 0x00, +0xAB, 0x48, 0xCD, 0x80, 0x00, 0x03, 0x70, 0x0A, +0x10, 0x03, 0x1A, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0xBD, 0x15, 0x00, 0x0D, 0xB0, 0x0A, 0x00, 0x0D, +0xB4, 0x0A, 0x4F, 0x80, 0x0A, 0x0D, 0xB0, 0x0A, +0x0A, 0x0D, 0xB4, 0x0A, 0x0F, 0x98, 0x6A, 0x11, +0x00, 0x0E, 0xB1, 0x0A, 0xA0, 0x03, 0x4A, 0x0B, +0xA3, 0x51, 0x31, 0x80, 0x0F, 0x98, 0xB5, 0x24, +0x2F, 0x80, 0x05, 0x0E, 0xC6, 0x0A, 0x00, 0x03, +0xF3, 0x0A, 0x00, 0x49, 0x31, 0x80, 0x00, 0x0E, +0x11, 0x00, 0xFF, 0xA0, 0xA0, 0x1A, 0xE9, 0x0D, +0x0F, 0x98, 0x12, 0x30, 0x00, 0x0E, 0x55, 0x0A, +0x01, 0x0E, 0x57, 0x0A, 0x00, 0x03, 0xF3, 0x0A, +0x02, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, 0x00, 0x03, +0x4A, 0x0B, 0x0F, 0xC1, 0x00, 0x0D, 0x4A, 0x0B, +0xFF, 0xA0, 0x00, 0x03, 0xBC, 0x01, 0x00, 0x49, +0x90, 0x80, 0x01, 0x39, 0x00, 0x0D, 0xBC, 0x01, +0x00, 0x03, 0x15, 0x00, 0x00, 0x0D, 0x71, 0x0A, +0x0F, 0x88, 0x33, 0x17, 0x91, 0x19, 0xA0, 0x03, +0xD6, 0x0A, 0xA0, 0x49, 0x01, 0x88, 0x4C, 0x17, +0xA0, 0x03, 0xBC, 0x0D, 0xA0, 0x49, 0xB1, 0x82, +0xA0, 0x03, 0x10, 0x02, 0xB0, 0x03, 0x13, 0x02, +0xFF, 0xFF, 0xAB, 0x38, 0xAF, 0x51, 0x10, 0x80, +0xA0, 0x31, 0xB0, 0x03, 0x5E, 0x0A, 0xAB, 0x48, +0x0B, 0x88, 0x4C, 0x17, 0xA0, 0x03, 0x11, 0x02, +0xB0, 0x03, 0x14, 0x02, 0xFF, 0xFF, 0xAB, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0xB0, 0x03, +0x5E, 0x0A, 0xAB, 0x48, 0x0B, 0x88, 0x4C, 0x17, +0xA0, 0x03, 0x62, 0x0A, 0xB0, 0x03, 0x5E, 0x0A, +0xAB, 0x48, 0x0B, 0x88, 0x4C, 0x17, 0xA0, 0x03, +0x55, 0x0A, 0xB0, 0x03, 0x60, 0x0A, 0xAB, 0x48, +0x0C, 0x88, 0x45, 0x17, 0xDF, 0x82, 0x0F, 0x88, +0x4C, 0x17, 0xA0, 0x03, 0x62, 0x0A, 0xB0, 0x03, +0x5F, 0x0A, 0xAB, 0x48, 0xEB, 0x83, 0xA0, 0x03, +0x10, 0x02, 0xB0, 0x03, 0x13, 0x02, 0xFF, 0xFF, +0xAB, 0x38, 0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, +0xB0, 0x03, 0x5F, 0x0A, 0xAB, 0x48, 0x1B, 0x83, +0xA0, 0x03, 0x11, 0x02, 0xB0, 0x03, 0x14, 0x02, +0xFF, 0xFF, 0xAB, 0x38, 0xAF, 0x51, 0x10, 0x80, +0xA0, 0x31, 0xB0, 0x03, 0x5F, 0x0A, 0xAB, 0x48, +0x4B, 0x82, 0xA0, 0x03, 0x55, 0x0A, 0xFF, 0xFF, +0xA1, 0x21, 0x0A, 0x0D, 0x55, 0x0A, 0xB0, 0x03, +0x21, 0x00, 0xAB, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, +0xC0, 0x03, 0x06, 0x02, 0x30, 0x1A, 0x32, 0x02, +0x40, 0x1A, 0xB2, 0x04, 0xA3, 0x00, 0x4A, 0x08, +0x31, 0x21, 0x41, 0x21, 0xC1, 0x39, 0xA1, 0x87, +0x0F, 0x98, 0x48, 0x16, 0x00, 0x0E, 0x55, 0x0A, +0x90, 0x19, 0x9F, 0x80, 0xA0, 0x03, 0x55, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x55, 0x0A, +0xFF, 0xA0, 0x00, 0x0E, 0x55, 0x0A, 0x00, 0x03, +0x10, 0x02, 0x10, 0x03, 0x11, 0x02, 0x00, 0x0D, +0x13, 0x02, 0x01, 0x0D, 0x14, 0x02, 0xFF, 0xA0, +0xA0, 0x03, 0x62, 0x0A, 0xB0, 0x03, 0x5F, 0x0A, +0xAB, 0x48, 0x0B, 0x88, 0xA7, 0x17, 0xA0, 0x03, +0xD6, 0x0A, 0xA0, 0x49, 0x01, 0x88, 0xA7, 0x17, +0xA0, 0x03, 0xBC, 0x0D, 0xA0, 0x49, 0x01, 0x88, +0xA7, 0x17, 0xA0, 0x03, 0x10, 0x02, 0xB0, 0x03, +0x15, 0x02, 0xFF, 0xFF, 0xAB, 0x38, 0xAF, 0x51, +0x10, 0x80, 0xA0, 0x31, 0xB0, 0x03, 0x5F, 0x0A, +0xAB, 0x48, 0x2B, 0x83, 0xA0, 0x03, 0x11, 0x02, +0xB0, 0x03, 0x16, 0x02, 0xFF, 0xFF, 0xAB, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0xB0, 0x03, +0x5F, 0x0A, 0xAB, 0x48, 0x5B, 0x82, 0xA0, 0x03, +0x6C, 0x0A, 0xB0, 0x03, 0x61, 0x0A, 0xAB, 0x48, +0x8C, 0x81, 0xC0, 0x03, 0x06, 0x02, 0x30, 0x1A, +0x32, 0x02, 0x40, 0x1A, 0xB2, 0x04, 0xA3, 0x00, +0xB4, 0x00, 0xAB, 0x48, 0x70, 0x80, 0xAB, 0x48, +0x3A, 0x80, 0xB1, 0x39, 0x4B, 0x08, 0x2F, 0x80, +0xB1, 0x21, 0x4B, 0x08, 0x31, 0x21, 0x41, 0x21, +0xC1, 0x39, 0x11, 0x87, 0x00, 0x0E, 0x6C, 0x0A, +0x9F, 0x80, 0xA0, 0x03, 0x6C, 0x0A, 0xFF, 0xFF, +0xA1, 0x21, 0x0A, 0x0D, 0x6C, 0x0A, 0xFF, 0xA0, +0x00, 0x0E, 0x6C, 0x0A, 0x00, 0x03, 0x10, 0x02, +0x10, 0x03, 0x11, 0x02, 0x00, 0x0D, 0x15, 0x02, +0x01, 0x0D, 0x16, 0x02, 0xFF, 0xA0, 0xC0, 0x03, +0x10, 0x02, 0xD0, 0x03, 0x11, 0x02, 0x10, 0x03, +0x0C, 0x00, 0x1C, 0x51, 0x41, 0x80, 0x91, 0x19, +0xC0, 0x49, 0xFD, 0xA0, 0xFF, 0xFF, 0x91, 0x19, +0x10, 0x03, 0x0C, 0x00, 0x1B, 0x51, 0x90, 0x83, +0xA0, 0x03, 0xEC, 0x0D, 0x1C, 0x18, 0x1A, 0x38, +0x0C, 0x0D, 0xEC, 0x0D, 0xB0, 0x03, 0x52, 0x00, +0x1B, 0x48, 0x3B, 0x80, 0x00, 0x0E, 0xED, 0x0D, +0x0F, 0x81, 0xA0, 0x03, 0xED, 0x0D, 0x20, 0x03, +0x58, 0x0A, 0x20, 0x49, 0x31, 0x80, 0x1B, 0x48, +0x1C, 0x80, 0xA1, 0x21, 0xB0, 0x03, 0x53, 0x00, +0x1B, 0x48, 0x1C, 0x80, 0xA1, 0x21, 0x0A, 0x0D, +0xED, 0x0D, 0xB0, 0x03, 0x54, 0x00, 0xCB, 0x48, +0x2C, 0x80, 0x05, 0x0E, 0xED, 0x0D, 0xA0, 0x03, +0xED, 0x0D, 0xA2, 0x49, 0x2D, 0x81, 0x00, 0x0E, +0xED, 0x0D, 0x90, 0x19, 0x00, 0x03, 0xEF, 0x0D, +0x00, 0x49, 0x50, 0x80, 0x01, 0x0E, 0xEF, 0x0D, +0x00, 0x0E, 0xF0, 0x0D, 0x6A, 0x80, 0x95, 0x19, +0x01, 0x0E, 0xEF, 0x0D, 0x00, 0x0E, 0xF0, 0x0D, +0xFF, 0xA0, 0x0C, 0x18, 0x10, 0x03, 0x75, 0x0A, +0x10, 0x49, 0x30, 0x81, 0x21, 0x18, 0x18, 0x79, +0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x03, 0x75, 0x0A, 0x20, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0xFE, 0x15, 0x00, 0x31, 0xAD, 0x18, +0xA0, 0x49, 0x3B, 0x80, 0xA0, 0x48, 0xFC, 0xA0, +0xFF, 0xFF, 0x10, 0x03, 0x34, 0x00, 0x10, 0x49, +0x00, 0x88, 0x62, 0x18, 0xC0, 0x03, 0x10, 0x02, +0xD0, 0x03, 0x11, 0x02, 0x00, 0x1A, 0x32, 0x02, +0x00, 0x0D, 0xD1, 0x0A, 0x00, 0x03, 0x35, 0x00, +0x00, 0x0D, 0x72, 0x0A, 0x0F, 0x98, 0x65, 0x1C, +0x00, 0x03, 0x6D, 0x0A, 0x00, 0x49, 0x70, 0x83, +0x00, 0x0E, 0x09, 0x02, 0xA0, 0x1A, 0x8B, 0x0B, +0x70, 0x03, 0x09, 0x02, 0xFF, 0xFF, 0xA7, 0x20, +0x1A, 0x00, 0x01, 0x18, 0x20, 0x03, 0x56, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0xFE, 0x15, 0x00, 0x0D, +0xEE, 0x0A, 0x00, 0x03, 0x1A, 0xF9, 0x00, 0x0D, +0xEF, 0x0A, 0xA0, 0x1A, 0x32, 0x02, 0xA1, 0x20, +0x5A, 0x00, 0x05, 0x0D, 0xC4, 0x0D, 0x10, 0x03, +0x34, 0x00, 0x01, 0x0D, 0xC6, 0x0D, 0xB0, 0x1A, +0x32, 0x02, 0x0B, 0x0D, 0xE7, 0x0D, 0x0F, 0x98, +0x98, 0x19, 0x00, 0x03, 0x76, 0x0A, 0xC0, 0x48, +0xCB, 0x80, 0x70, 0x03, 0x09, 0x02, 0xFF, 0xFF, +0x71, 0x21, 0x07, 0x0D, 0x09, 0x02, 0x00, 0x03, +0x6D, 0x0A, 0x07, 0x48, 0xF1, 0x84, 0x90, 0x19, +0xFF, 0xA0, 0x92, 0x19, 0xFF, 0xA0, 0x10, 0x03, +0x0C, 0x00, 0x1C, 0x51, 0xC1, 0x83, 0xC0, 0x03, +0x10, 0x02, 0xD0, 0x03, 0x11, 0x02, 0xFF, 0xFF, +0xCD, 0x38, 0xAC, 0x18, 0xAF, 0x51, 0x10, 0x80, +0xA0, 0x31, 0xA2, 0x49, 0x2B, 0x80, 0x91, 0x19, +0xFF, 0xA0, 0x10, 0x03, 0x34, 0x00, 0x10, 0x49, +0x81, 0x80, 0x00, 0x03, 0x35, 0x00, 0xA0, 0x48, +0x4C, 0x80, 0x62, 0x19, 0x40, 0x03, 0x76, 0x0A, +0x3F, 0x80, 0x61, 0x19, 0x40, 0x03, 0x79, 0x0A, +0xCF, 0x51, 0x40, 0x80, 0xC0, 0x31, 0xC1, 0x79, +0xC0, 0x31, 0x1F, 0x80, 0xC1, 0x79, 0xCD, 0x20, +0xC0, 0x4A, 0x1E, 0x00, 0x2A, 0x80, 0x90, 0x19, +0xFF, 0xA0, 0x70, 0x19, 0xA0, 0x03, 0x06, 0x02, +0xB0, 0x1A, 0x32, 0x02, 0x9B, 0x00, 0x9C, 0x48, +0x1C, 0x80, 0x71, 0x21, 0xB1, 0x21, 0xA1, 0x39, +0x91, 0x87, 0x90, 0x19, 0x74, 0x48, 0xFD, 0xA0, +0xFF, 0xFF, 0x96, 0x18, 0xFF, 0xA0, 0xC0, 0x03, +0x10, 0x02, 0x91, 0x19, 0x1F, 0x19, 0x00, 0x03, +0xD0, 0x0A, 0x00, 0x49, 0x10, 0x80, 0x1A, 0x19, +0xC1, 0x48, 0xFD, 0xA0, 0xFF, 0xFF, 0x00, 0x03, +0x46, 0x00, 0x00, 0x49, 0xF1, 0xA0, 0xFF, 0xFF, +0x90, 0x19, 0x00, 0x03, 0x35, 0x00, 0xC0, 0x48, +0x0D, 0x98, 0xE5, 0x18, 0xFF, 0xFF, 0x90, 0x49, +0x10, 0x80, 0xFF, 0xA0, 0xD0, 0x03, 0x32, 0x00, +0x00, 0x03, 0xD0, 0x0A, 0x00, 0x49, 0xB1, 0x80, +0xCD, 0x48, 0x9A, 0x80, 0x60, 0x03, 0x78, 0x0A, +0xFF, 0xFF, 0x0F, 0x98, 0x36, 0x19, 0x90, 0x49, +0x20, 0x80, 0x92, 0x19, 0xFF, 0xA0, 0xCD, 0x48, +0x9C, 0x80, 0x60, 0x03, 0x76, 0x0A, 0xFF, 0xFF, +0x0F, 0x98, 0x36, 0x19, 0x90, 0x49, 0x20, 0x80, +0x92, 0x19, 0xFF, 0xA0, 0xD0, 0x03, 0x11, 0x02, +0xFF, 0xFF, 0xCD, 0x38, 0xAC, 0x18, 0x0F, 0x98, +0x2E, 0x16, 0xA2, 0x49, 0xFB, 0xA0, 0xFF, 0xFF, +0x91, 0x19, 0xFF, 0xA0, 0x95, 0x19, 0x2C, 0x18, +0xA0, 0x03, 0x56, 0x00, 0xB0, 0x03, 0x55, 0x00, +0xD0, 0x1A, 0x32, 0x02, 0x00, 0x19, 0x1D, 0x00, +0xFF, 0xFF, 0x01, 0x20, 0xDA, 0x20, 0xB1, 0x39, +0xA1, 0x87, 0x0F, 0x98, 0xFE, 0x15, 0x03, 0x49, +0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, +0xB0, 0x03, 0x55, 0x00, 0xD0, 0x1A, 0x32, 0x02, +0xDA, 0x20, 0xD1, 0x39, 0x00, 0x19, 0x1D, 0x00, +0xFF, 0xFF, 0x01, 0x20, 0xDA, 0x20, 0xB1, 0x39, +0xA1, 0x87, 0x0F, 0x98, 0xFE, 0x15, 0x03, 0x49, +0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, +0xD0, 0x1A, 0x32, 0x02, 0x00, 0x19, 0x1D, 0x00, +0xFF, 0xFF, 0x01, 0x20, 0xD1, 0x21, 0xA1, 0x39, +0xA1, 0x87, 0x0F, 0x98, 0xFE, 0x15, 0x03, 0x49, +0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, +0xB0, 0x03, 0x55, 0x00, 0xFF, 0xFF, 0xB1, 0x39, +0xAB, 0x58, 0xD0, 0x1A, 0x32, 0x02, 0x00, 0x19, +0x10, 0x1E, 0xD1, 0x20, 0x1D, 0x00, 0xFF, 0xFF, +0x01, 0x20, 0xD1, 0x21, 0xA1, 0x39, 0xA1, 0x87, +0x0F, 0x98, 0xFE, 0x15, 0x03, 0x49, 0xFA, 0xA0, +0xFF, 0xFF, 0x90, 0x19, 0xFF, 0xA0, 0xA0, 0x03, +0x06, 0x02, 0xB0, 0x1A, 0x32, 0x02, 0x00, 0x19, +0x10, 0x19, 0x0F, 0x98, 0x7C, 0x15, 0x50, 0x19, +0x2B, 0x00, 0x25, 0x48, 0x0B, 0x98, 0x97, 0x15, +0xFF, 0xFF, 0xB1, 0x21, 0xA1, 0x39, 0x81, 0x87, +0x20, 0x03, 0x10, 0x02, 0xFF, 0xFF, 0x0F, 0x98, +0x17, 0x16, 0x06, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, +0x91, 0x19, 0xFF, 0xA0, 0x90, 0x19, 0x00, 0x03, +0x0F, 0x01, 0x00, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0x80, 0x1A, 0x00, 0x80, 0x90, 0x1A, 0xFF, 0x7F, +0x60, 0x1A, 0x00, 0x80, 0x70, 0x1A, 0xFF, 0x7F, +0x50, 0x03, 0x06, 0x02, 0x30, 0x03, 0xE5, 0x00, +0x1F, 0x51, 0x40, 0x80, 0x30, 0x03, 0x56, 0x00, +0xFF, 0xFF, 0x53, 0x38, 0x30, 0x1A, 0x32, 0x02, +0x40, 0x1A, 0xB2, 0x04, 0xD0, 0x1A, 0xFC, 0x0C, +0x10, 0x19, 0x0D, 0x00, 0x01, 0x50, 0xF0, 0x80, +0xA3, 0x00, 0xB4, 0x00, 0xFF, 0xFF, 0xA8, 0x48, +0x1D, 0x80, 0x8A, 0x18, 0xA9, 0x48, 0x1B, 0x80, +0x9A, 0x18, 0xB6, 0x48, 0x1D, 0x80, 0x6B, 0x18, +0xB7, 0x48, 0x1B, 0x80, 0x7B, 0x18, 0x11, 0x21, +0x00, 0x03, 0x56, 0x00, 0x10, 0x48, 0x2C, 0x80, +0x10, 0x19, 0xD1, 0x21, 0x31, 0x21, 0x41, 0x21, +0x51, 0x39, 0x31, 0x86, 0x89, 0x38, 0x67, 0x38, +0x68, 0x38, 0x00, 0x03, 0x0F, 0x01, 0x90, 0x19, +0x60, 0x48, 0xFD, 0xA0, 0xFF, 0xFF, 0x93, 0x19, +0xFF, 0xA0, 0xC0, 0x19, 0x20, 0x03, 0xEE, 0x0A, +0x20, 0x49, 0xFC, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, +0x55, 0x00, 0x2A, 0x48, 0xFB, 0xA0, 0xFF, 0xFF, +0x20, 0x03, 0xEF, 0x0A, 0x20, 0x49, 0xFC, 0xA0, +0xFF, 0xFF, 0xA0, 0x03, 0x56, 0x00, 0x2A, 0x48, +0xFB, 0xA0, 0xFF, 0xFF, 0x00, 0x03, 0xC4, 0x0D, +0x10, 0x03, 0xC6, 0x0D, 0x21, 0x18, 0x18, 0x79, +0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x03, 0x3B, 0x00, 0x20, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0xFE, 0x15, 0x50, 0x18, 0xC0, 0x03, +0xE7, 0x0D, 0x90, 0x03, 0x55, 0x00, 0xA0, 0x03, +0x56, 0x00, 0x20, 0x03, 0xEF, 0x0A, 0x20, 0x49, +0x2A, 0x80, 0x21, 0x39, 0x6F, 0x81, 0x10, 0x19, +0x70, 0x19, 0x1A, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x30, 0x1E, 0x62, 0x18, 0x63, 0x20, +0x6C, 0x20, 0x06, 0x00, 0x05, 0x48, 0x1C, 0x80, +0x71, 0x19, 0x11, 0x21, 0x19, 0x48, 0x11, 0x87, +0x70, 0x49, 0x30, 0x80, 0x21, 0x39, 0x20, 0x49, +0xAB, 0x86, 0x21, 0x21, 0x02, 0x0D, 0xEA, 0x0A, +0xC0, 0x03, 0xE7, 0x0D, 0x90, 0x03, 0x55, 0x00, +0xA0, 0x03, 0x56, 0x00, 0x00, 0x03, 0x56, 0x00, +0xFF, 0xFF, 0x01, 0x39, 0x20, 0x03, 0xEF, 0x0A, +0x20, 0x48, 0x3C, 0x80, 0x20, 0x03, 0x56, 0x00, +0x6F, 0x81, 0x10, 0x19, 0x70, 0x19, 0x1A, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x1E, +0x62, 0x18, 0x63, 0x20, 0x6C, 0x20, 0x06, 0x00, +0x05, 0x48, 0x1C, 0x80, 0x71, 0x19, 0x11, 0x21, +0x19, 0x48, 0x11, 0x87, 0x70, 0x49, 0x30, 0x80, +0x21, 0x21, 0x2A, 0x48, 0xAC, 0x86, 0x02, 0x0D, +0xEB, 0x0A, 0xC0, 0x03, 0xE7, 0x0D, 0x90, 0x03, +0x55, 0x00, 0xA0, 0x03, 0x56, 0x00, 0x20, 0x03, +0xEE, 0x0A, 0x20, 0x49, 0x2A, 0x80, 0x21, 0x39, +0x6F, 0x81, 0x10, 0x19, 0x70, 0x19, 0x2A, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x1E, +0x63, 0x18, 0x6C, 0x20, 0x06, 0x00, 0x05, 0x48, +0x1C, 0x80, 0x71, 0x19, 0x11, 0x21, 0x61, 0x21, +0x1A, 0x48, 0x81, 0x87, 0x70, 0x49, 0x30, 0x80, +0x21, 0x39, 0x20, 0x49, 0xAB, 0x86, 0x21, 0x21, +0x02, 0x0D, 0xEC, 0x0A, 0xC0, 0x03, 0xE7, 0x0D, +0xA0, 0x03, 0x56, 0x00, 0x90, 0x03, 0x55, 0x00, +0x00, 0x03, 0x55, 0x00, 0x20, 0x03, 0xEE, 0x0A, +0xFF, 0xFF, 0x01, 0x39, 0x20, 0x48, 0x3C, 0x80, +0x20, 0x03, 0x55, 0x00, 0x6F, 0x81, 0x10, 0x19, +0x70, 0x19, 0x2A, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x30, 0x1E, 0x63, 0x18, 0x6C, 0x20, +0x06, 0x00, 0x05, 0x48, 0x1C, 0x80, 0x71, 0x19, +0x11, 0x21, 0x61, 0x21, 0x1A, 0x48, 0x81, 0x87, +0x70, 0x49, 0x30, 0x80, 0x21, 0x21, 0x29, 0x48, +0xAC, 0x86, 0x02, 0x0D, 0xED, 0x0A, 0xC0, 0x19, +0xA0, 0x03, 0xEC, 0x0A, 0xB0, 0x03, 0xE7, 0x0D, +0x00, 0x03, 0x56, 0x00, 0xFF, 0xFF, 0x0A, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, +0xB0, 0x20, 0x10, 0x03, 0xEA, 0x0A, 0x20, 0x03, +0xEB, 0x0A, 0xFF, 0xFF, 0xB1, 0x20, 0x0B, 0x00, +0x05, 0x48, 0x1C, 0x80, 0xC1, 0x21, 0xB1, 0x21, +0x11, 0x21, 0x12, 0x48, 0x8C, 0x87, 0xA1, 0x21, +0x00, 0x03, 0xED, 0x0A, 0xA0, 0x48, 0x2C, 0x86, +0xFF, 0xA0, 0x81, 0x19, 0x50, 0x03, 0xC4, 0x0D, +0x10, 0x03, 0xBA, 0x00, 0x51, 0x48, 0x6B, 0x80, +0x00, 0x03, 0xC1, 0x0D, 0xC0, 0x48, 0xFA, 0xA0, +0xFF, 0xFF, 0x5F, 0x80, 0x00, 0x03, 0xBF, 0x0D, +0xC0, 0x48, 0xFA, 0xA0, 0xFF, 0xFF, 0x00, 0x03, +0xC0, 0x0D, 0xC0, 0x48, 0xFC, 0xA0, 0xFF, 0xFF, +0x80, 0x19, 0xFF, 0xA0, 0x24, 0x48, 0x1B, 0x80, +0x24, 0x18, 0xFF, 0xA0, 0x0F, 0x98, 0x8A, 0x10, +0xB0, 0x1A, 0xFF, 0xFF, 0xC0, 0x1A, 0xFF, 0xFF, +0x00, 0x03, 0xE5, 0x00, 0x0F, 0x51, 0xB0, 0x80, +0x0F, 0x98, 0x9B, 0x10, 0x00, 0x03, 0xA8, 0x00, +0x00, 0x49, 0x30, 0x80, 0xC0, 0x03, 0xA9, 0x00, +0x2F, 0x80, 0xB0, 0x03, 0xA9, 0x00, 0x70, 0x19, +0xA0, 0x1A, 0x8B, 0x0B, 0xA7, 0x20, 0x1A, 0x00, +0x01, 0x18, 0x20, 0x03, 0x56, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0xFE, 0x15, 0x00, 0x0D, 0xE2, 0x0A, +0x00, 0x03, 0x1A, 0xF9, 0x00, 0x0D, 0xE3, 0x0A, +0x40, 0x19, 0x20, 0x03, 0xCF, 0x00, 0x20, 0x49, +0x60, 0x80, 0x00, 0x03, 0xD5, 0x0A, 0x40, 0x18, +0x0F, 0x98, 0xFE, 0x15, 0x40, 0x38, 0xA0, 0x1A, +0xF2, 0x05, 0xA1, 0x20, 0x5A, 0x00, 0x00, 0x03, +0xE3, 0x0A, 0x0C, 0x48, 0x30, 0x81, 0x80, 0x03, +0xB3, 0x0D, 0x08, 0x48, 0xA0, 0x81, 0x80, 0x03, +0xB4, 0x0D, 0x08, 0x48, 0x01, 0x82, 0x20, 0x03, +0x17, 0x00, 0x00, 0x03, 0x74, 0x0A, 0xFF, 0xFF, +0x20, 0x20, 0x0F, 0x98, 0x95, 0x1A, 0x52, 0x48, +0x6B, 0x81, 0xEF, 0x83, 0x20, 0x03, 0xA7, 0x00, +0x00, 0x03, 0x74, 0x0A, 0xFF, 0xFF, 0x20, 0x20, +0x0F, 0x98, 0x95, 0x1A, 0x52, 0x48, 0xBB, 0x80, +0x3F, 0x83, 0x20, 0x03, 0x16, 0x00, 0x00, 0x03, +0x74, 0x0A, 0xFF, 0xFF, 0x20, 0x20, 0x0F, 0x98, +0x95, 0x1A, 0x52, 0x48, 0x9C, 0x82, 0x00, 0x03, +0xE2, 0x0A, 0x0B, 0x48, 0x30, 0x81, 0x80, 0x03, +0xB5, 0x0D, 0x08, 0x48, 0xA0, 0x81, 0x80, 0x03, +0xB6, 0x0D, 0x08, 0x48, 0xB1, 0x82, 0x20, 0x03, +0x19, 0x00, 0x00, 0x03, 0x74, 0x0A, 0xFF, 0xFF, +0x20, 0x20, 0x0F, 0x98, 0x95, 0x1A, 0x52, 0x48, +0x1B, 0x82, 0x2F, 0x81, 0x20, 0x03, 0xA7, 0x00, +0x00, 0x03, 0x74, 0x0A, 0xFF, 0xFF, 0x20, 0x20, +0x0F, 0x98, 0x95, 0x1A, 0x52, 0x48, 0x6B, 0x81, +0x7F, 0x80, 0x20, 0x03, 0x18, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0x95, 0x1A, 0x52, 0x48, 0xEB, 0x80, +0xA7, 0x18, 0x0F, 0x98, 0x24, 0x1D, 0xD0, 0x03, +0x6D, 0x0A, 0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x0D, +0x6D, 0x0A, 0x7D, 0x48, 0xFB, 0xA0, 0xFF, 0xFF, +0x0F, 0x88, 0xAF, 0x1A, 0x10, 0x03, 0x6D, 0x0A, +0xFF, 0xFF, 0x71, 0x21, 0x71, 0x48, 0xFB, 0xA0, +0xFF, 0xFF, 0x0F, 0x88, 0xAF, 0x1A, 0x90, 0x19, +0x00, 0x0E, 0xF3, 0x0A, 0x00, 0x0E, 0xBA, 0x0A, +0x00, 0x03, 0xA5, 0x00, 0x00, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x0F, 0x98, 0x53, 0x1C, 0xD0, 0x49, +0x11, 0x82, 0xA0, 0x1A, 0xBB, 0x0A, 0x88, 0x19, +0xA0, 0x0B, 0xA1, 0x21, 0x81, 0x39, 0xC1, 0x87, +0x70, 0x19, 0x00, 0x03, 0xA5, 0x00, 0x70, 0x48, +0x0B, 0x88, 0x4D, 0x1C, 0x00, 0x03, 0xC4, 0x0A, +0x07, 0x50, 0xE0, 0x80, 0x02, 0x0E, 0xF3, 0x0A, +0x00, 0x03, 0xBA, 0x0A, 0x17, 0x18, 0x18, 0x21, +0x01, 0xC0, 0x00, 0x0D, 0xBA, 0x0A, 0x00, 0x03, +0xC4, 0x0A, 0x07, 0xC8, 0x00, 0x0D, 0xC4, 0x0A, +0x71, 0x21, 0x7F, 0x86, 0x00, 0x03, 0xC4, 0x0A, +0x00, 0x0D, 0xC5, 0x0A, 0x00, 0x0E, 0xC4, 0x0A, +0x70, 0x19, 0x07, 0x0D, 0x09, 0x02, 0xB0, 0x19, +0x70, 0x03, 0x09, 0x02, 0xD0, 0x03, 0x6D, 0x0A, +0x7D, 0x48, 0x0B, 0x88, 0x23, 0x1C, 0x10, 0x1A, +0x8B, 0x0B, 0x17, 0x20, 0x01, 0x00, 0x20, 0x03, +0x56, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0xFE, 0x15, +0x00, 0x03, 0x18, 0xF9, 0x00, 0x0D, 0xE2, 0x0A, +0x00, 0x03, 0x1A, 0xF9, 0x00, 0x0D, 0xE3, 0x0A, +0x60, 0x03, 0xA9, 0x00, 0x00, 0x03, 0xA8, 0x00, +0x00, 0x49, 0x81, 0x80, 0x50, 0x03, 0xE3, 0x0A, +0x20, 0x03, 0xE2, 0x0A, 0x26, 0x48, 0x01, 0x88, +0x08, 0x1C, 0x7F, 0x80, 0x50, 0x03, 0xE2, 0x0A, +0x20, 0x03, 0xE3, 0x0A, 0x26, 0x48, 0x01, 0x88, +0x08, 0x1C, 0x60, 0x1A, 0xAB, 0x00, 0x06, 0x0D, +0x0A, 0x02, 0x80, 0x19, 0x08, 0x0D, 0x0B, 0x02, +0xB0, 0x19, 0x00, 0x03, 0xA5, 0x00, 0x80, 0x03, +0x0B, 0x02, 0x80, 0x48, 0x0B, 0x88, 0x08, 0x1C, +0x60, 0x03, 0x0A, 0x02, 0x06, 0x00, 0x50, 0x48, +0x0C, 0x88, 0x00, 0x1C, 0xC0, 0x03, 0xAA, 0x00, +0xFF, 0xFF, 0x0C, 0x20, 0x50, 0x48, 0x0B, 0x88, +0x00, 0x1C, 0x00, 0x03, 0x0C, 0x00, 0x09, 0x51, +0x20, 0x82, 0x00, 0x03, 0xE2, 0x0A, 0x00, 0x0D, +0xEE, 0x0A, 0x00, 0x03, 0xE3, 0x0A, 0x00, 0x0D, +0xEF, 0x0A, 0x10, 0x1A, 0x8B, 0x0B, 0x17, 0x20, +0x01, 0x00, 0xA0, 0x1A, 0xF2, 0x05, 0xA0, 0x20, +0x5A, 0x00, 0xA0, 0x1A, 0x34, 0x0D, 0x00, 0x03, +0xEF, 0x0A, 0xFF, 0xFF, 0xA0, 0x20, 0x0A, 0x00, +0x50, 0x48, 0xFC, 0x82, 0xA0, 0x1A, 0x44, 0x0D, +0x00, 0x03, 0xEE, 0x0A, 0xFF, 0xFF, 0xA0, 0x20, +0x0A, 0x00, 0x50, 0x48, 0x6C, 0x82, 0xA0, 0x1A, +0xBB, 0x0A, 0xA8, 0x20, 0x0A, 0x00, 0xFF, 0xFF, +0x01, 0x21, 0xA0, 0x08, 0x10, 0x03, 0xC3, 0x0A, +0x01, 0x48, 0x2B, 0x80, 0xB1, 0x19, 0x9F, 0x81, +0xA1, 0x08, 0x00, 0x03, 0xBA, 0x0A, 0x18, 0x18, +0x10, 0x21, 0x01, 0xC0, 0x00, 0x0D, 0xBA, 0x0A, +0x00, 0x03, 0xC4, 0x0A, 0x08, 0xC0, 0x00, 0x0D, +0xC4, 0x0A, 0x01, 0x0E, 0xF3, 0x0A, 0xB1, 0x19, +0x8F, 0x80, 0x61, 0x21, 0x06, 0x0D, 0x0A, 0x02, +0x81, 0x21, 0x08, 0x0D, 0x0B, 0x02, 0x0F, 0x88, +0xA8, 0x1B, 0xB0, 0x49, 0x30, 0x81, 0x70, 0x03, +0x09, 0x02, 0xA7, 0x18, 0x0F, 0x98, 0x2D, 0x1D, +0xB0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, 0xB1, 0x39, +0x0B, 0x0D, 0x6E, 0x0A, 0xB0, 0x03, 0x6D, 0x0A, +0xFF, 0xFF, 0xB1, 0x39, 0x0B, 0x0D, 0x6D, 0x0A, +0xDB, 0x18, 0x71, 0x39, 0x71, 0x21, 0x07, 0x0D, +0x09, 0x02, 0xB0, 0x19, 0x0F, 0x88, 0x72, 0x1B, +0x70, 0x19, 0x80, 0x19, 0x00, 0x03, 0xA5, 0x00, +0x70, 0x48, 0x4B, 0x82, 0x00, 0x03, 0xC4, 0x0A, +0x07, 0x50, 0x80, 0x80, 0x81, 0x21, 0x00, 0x03, +0xC5, 0x0A, 0x07, 0x50, 0x91, 0x81, 0x02, 0x0E, +0xF3, 0x0A, 0x6F, 0x81, 0x00, 0x03, 0xC5, 0x0A, +0x07, 0x50, 0x20, 0x81, 0x02, 0x0E, 0xF3, 0x0A, +0x00, 0x03, 0xBA, 0x0A, 0x17, 0x18, 0x18, 0x21, +0x01, 0xC0, 0x00, 0x0D, 0xBA, 0x0A, 0x00, 0x03, +0xC4, 0x0A, 0x07, 0xC8, 0x00, 0x0D, 0xC4, 0x0A, +0xA0, 0x1A, 0xBB, 0x0A, 0xA7, 0x20, 0xA0, 0x0B, +0x71, 0x21, 0x8F, 0x85, 0x90, 0x03, 0xF3, 0x0A, +0x08, 0x0D, 0xEB, 0x0D, 0xFF, 0xFF, 0xFF, 0xA0, +0x00, 0x03, 0xA5, 0x00, 0x20, 0x1A, 0xAF, 0x00, +0x10, 0x1A, 0x9D, 0x00, 0x30, 0x1A, 0xF2, 0x05, +0x42, 0x00, 0xFF, 0xFF, 0x34, 0x20, 0x43, 0x00, +0x14, 0x08, 0x21, 0x21, 0x11, 0x21, 0x01, 0x39, +0x51, 0x87, 0xFF, 0xA0, 0xB0, 0x03, 0xD1, 0x0A, +0x60, 0x03, 0x55, 0x00, 0x70, 0x03, 0x56, 0x00, +0x3F, 0x19, 0x00, 0x0E, 0x6D, 0x0A, 0x20, 0x03, +0x72, 0x0A, 0x81, 0x19, 0x91, 0x19, 0xCB, 0x18, +0x1C, 0x00, 0x12, 0x48, 0x0D, 0x88, 0xFD, 0x1C, +0xC7, 0x38, 0xC1, 0x39, 0x81, 0x49, 0x20, 0x81, +0x91, 0x49, 0x40, 0x80, 0x0C, 0x00, 0x10, 0x48, +0x0D, 0x88, 0xFD, 0x1C, 0xC1, 0x21, 0x0C, 0x00, +0x10, 0x48, 0x0D, 0x88, 0xFD, 0x1C, 0x97, 0x48, +0x50, 0x80, 0xC1, 0x21, 0x0C, 0x00, 0x10, 0x48, +0x0D, 0x88, 0xFD, 0x1C, 0xCB, 0x18, 0xC1, 0x39, +0x91, 0x49, 0x40, 0x80, 0x0C, 0x00, 0x10, 0x48, +0x0D, 0x88, 0xFD, 0x1C, 0x97, 0x48, 0x50, 0x80, +0xC2, 0x21, 0x0C, 0x00, 0x10, 0x48, 0x0C, 0x88, +0xFD, 0x1C, 0xCB, 0x18, 0xC7, 0x20, 0xC1, 0x39, +0x86, 0x48, 0x20, 0x81, 0x91, 0x49, 0x40, 0x80, +0x0C, 0x00, 0x10, 0x48, 0x0C, 0x88, 0xFD, 0x1C, +0xC1, 0x21, 0x0C, 0x00, 0x10, 0x48, 0x0C, 0x88, +0xFD, 0x1C, 0x97, 0x48, 0x50, 0x80, 0xC1, 0x21, +0x0C, 0x00, 0x10, 0x48, 0x0C, 0x88, 0xFD, 0x1C, +0xA0, 0x03, 0x6D, 0x0A, 0xA3, 0x48, 0xF0, 0x80, +0xD0, 0x1A, 0x8B, 0x0B, 0xA0, 0x03, 0x6D, 0x0A, +0xFF, 0xFF, 0xDA, 0x20, 0x00, 0x03, 0xD1, 0x0A, +0xCB, 0x18, 0xC0, 0x38, 0xDC, 0x08, 0xA1, 0x21, +0x0A, 0x0D, 0x6D, 0x0A, 0x7F, 0x83, 0x00, 0x0E, +0xF2, 0x0A, 0x10, 0x1A, 0x8B, 0x0B, 0xA1, 0x00, +0xC0, 0x03, 0xD1, 0x0A, 0xFF, 0xFF, 0xCA, 0x20, +0xDC, 0x00, 0x01, 0x0E, 0xF1, 0x0A, 0x10, 0x1A, +0x8B, 0x0B, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0x1A, 0x20, 0xA1, 0x00, 0xC0, 0x03, 0xD1, 0x0A, +0xFF, 0xFF, 0xCA, 0x20, 0xAC, 0x00, 0xAD, 0x48, +0x5A, 0x80, 0xDA, 0x18, 0xA0, 0x03, 0xF1, 0x0A, +0x0A, 0x0D, 0xF2, 0x0A, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0xF1, 0x0A, +0xA3, 0x48, 0x51, 0x86, 0xAB, 0x00, 0xDA, 0x48, +0xDA, 0x80, 0x10, 0x1A, 0x8B, 0x0B, 0xA0, 0x03, +0xF2, 0x0A, 0xFF, 0xFF, 0x1A, 0x20, 0xC0, 0x03, +0xD1, 0x0A, 0xFF, 0xFF, 0xCB, 0x38, 0xC0, 0x31, +0x1C, 0x08, 0x0F, 0x80, 0xB1, 0x21, 0x91, 0x21, +0x97, 0x48, 0x1D, 0x80, 0x91, 0x19, 0x1D, 0x80, +0x81, 0x21, 0x86, 0x48, 0x0D, 0x88, 0x72, 0x1C, +0xFF, 0xA0, 0xA0, 0x19, 0x0A, 0x0D, 0x6D, 0x0A, +0xC0, 0x03, 0x72, 0x0A, 0xB0, 0x03, 0xD1, 0x0A, +0xD0, 0x1A, 0x8B, 0x0B, 0x40, 0x19, 0x9B, 0x00, +0x9C, 0x48, 0x3C, 0x80, 0xC9, 0x18, 0xDA, 0x08, +0x41, 0x19, 0xB1, 0x21, 0xA1, 0x21, 0x90, 0x03, +0x06, 0x02, 0x9A, 0x48, 0x41, 0x87, 0x40, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0x01, 0x0E, 0x6D, 0x0A, +0xFF, 0xA0, 0x00, 0x03, 0x0C, 0x00, 0x0A, 0x51, +0x51, 0x80, 0x10, 0x03, 0x6D, 0x0A, 0x11, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0x10, 0x03, 0x6D, 0x0A, +0x10, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, 0x2A, 0x18, +0x3A, 0x18, 0x31, 0x21, 0x31, 0x48, 0xF0, 0xA0, +0xFF, 0xFF, 0x40, 0x1A, 0x8B, 0x0B, 0x42, 0x20, +0x50, 0x1A, 0x8B, 0x0B, 0x53, 0x20, 0x05, 0x00, +0x40, 0x08, 0x23, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x40, 0x1E, 0x40, 0x22, 0x4D, 0x0B, +0x33, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x50, 0x1E, 0x50, 0x22, 0x4D, 0x0B, 0x05, 0x00, +0x40, 0x08, 0x51, 0x21, 0x41, 0x21, 0x05, 0x00, +0x40, 0x08, 0x51, 0x21, 0x41, 0x21, 0x05, 0x00, +0x40, 0x08, 0x21, 0x21, 0x31, 0x21, 0xAF, 0x85, +0xD0, 0x03, 0x6E, 0x0A, 0xD1, 0x49, 0xFD, 0xA0, +0xFF, 0xFF, 0xA0, 0x19, 0x00, 0x03, 0xB3, 0x0A, +0x10, 0x03, 0x38, 0x00, 0x10, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x21, 0x18, 0x18, 0x79, 0x10, 0x49, +0x60, 0x80, 0x0F, 0x98, 0xBD, 0x15, 0x20, 0x03, +0x38, 0x00, 0x20, 0x62, 0xFF, 0x00, 0x0F, 0x98, +0xFE, 0x15, 0x00, 0x0D, 0xB3, 0x0A, 0x40, 0x03, +0xB3, 0x0A, 0xB0, 0x1A, 0xF2, 0x05, 0xD0, 0x1A, +0x8B, 0x0B, 0xDA, 0x20, 0xCD, 0x00, 0xFF, 0xFF, +0xBC, 0x20, 0xCB, 0x00, 0xC4, 0x48, 0xDB, 0x81, +0x00, 0x03, 0x0C, 0x00, 0x0A, 0x51, 0x41, 0x81, +0x0F, 0x98, 0x24, 0x1D, 0xA1, 0x39, 0xD0, 0x03, +0x6E, 0x0A, 0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x0D, +0x6E, 0x0A, 0xD0, 0x03, 0x6D, 0x0A, 0xFF, 0xFF, +0xD1, 0x39, 0x0D, 0x0D, 0x6D, 0x0A, 0xD1, 0x49, +0x8A, 0x80, 0x01, 0x0E, 0x6D, 0x0A, 0xFF, 0xA0, +0xD0, 0x03, 0xC2, 0x0D, 0xDA, 0xC0, 0x0D, 0x0D, +0xC2, 0x0D, 0x40, 0x03, 0xB3, 0x0A, 0xFF, 0xFF, +0xA1, 0x21, 0xB0, 0x03, 0x6D, 0x0A, 0xAB, 0x48, +0x0C, 0x85, 0xFF, 0xA0, 0xB0, 0x03, 0x05, 0x0B, +0xD0, 0x19, 0x30, 0x03, 0x0A, 0x00, 0xBD, 0x50, +0xF0, 0xA0, 0xFF, 0xFF, 0xD1, 0x21, 0xD3, 0x48, +0xA1, 0x87, 0xFF, 0xA0, 0x8C, 0x00, 0x80, 0x62, +0xFF, 0x00, 0x70, 0x03, 0x29, 0x00, 0xFF, 0xFF, +0x71, 0x39, 0x87, 0x58, 0xFF, 0xFF, 0x70, 0x03, +0x29, 0x00, 0x80, 0x1E, 0xA8, 0x20, 0x71, 0x79, +0xA7, 0x78, 0xA0, 0x62, 0xFF, 0x00, 0xDC, 0x00, +0xDD, 0x51, 0x10, 0x80, 0xAD, 0xC1, 0xA8, 0xC1, +0xAA, 0xC1, 0x0A, 0x0D, 0xE4, 0x0A, 0xFF, 0xA0, +0x00, 0x03, 0x28, 0x00, 0x00, 0x0D, 0xB2, 0x0D, +0x00, 0x03, 0x6D, 0x0A, 0x02, 0x49, 0x81, 0x80, +0x00, 0x03, 0x74, 0x00, 0x00, 0x49, 0x21, 0x80, +0x00, 0x03, 0x28, 0x00, 0x00, 0x0D, 0xB2, 0x0D, +0x90, 0x1A, 0x2C, 0x0B, 0x92, 0x21, 0xC0, 0x19, +0xB0, 0x19, 0x3A, 0x19, 0xA9, 0x00, 0xA8, 0x51, +0x20, 0x80, 0xBC, 0xC0, 0x3F, 0x80, 0xA0, 0x62, +0xFF, 0x00, 0x9A, 0x08, 0x93, 0x21, 0xC1, 0x21, +0xC3, 0x48, 0x41, 0x87, 0x0B, 0x0D, 0x05, 0x0B, +0xD0, 0x1A, 0x58, 0x0D, 0xD2, 0x21, 0x0D, 0x0D, +0x09, 0x0B, 0x00, 0x0E, 0x03, 0x0B, 0x00, 0x0E, +0x07, 0x0B, 0x00, 0x0E, 0x08, 0x0B, 0xD0, 0x03, +0x09, 0x0B, 0x0D, 0x00, 0x0E, 0x51, 0x00, 0x88, +0x75, 0x1E, 0x80, 0x1A, 0x94, 0x0D, 0xA0, 0x03, +0x07, 0x0B, 0xFF, 0xFF, 0x8A, 0x20, 0x08, 0x00, +0x10, 0x18, 0x11, 0x39, 0x01, 0x0D, 0x0A, 0x0B, +0x00, 0x49, 0x00, 0x88, 0x75, 0x1E, 0x30, 0x03, +0x0A, 0x00, 0x03, 0x48, 0x0A, 0x88, 0x6E, 0x1E, +0x00, 0x03, 0x07, 0x0B, 0x10, 0x03, 0x03, 0x0B, +0x10, 0xC0, 0x01, 0x0D, 0x03, 0x0B, 0xD0, 0x03, +0x09, 0x0B, 0xFF, 0xFF, 0xD2, 0x39, 0x10, 0x03, +0x0A, 0x0B, 0x61, 0x18, 0x7D, 0x00, 0x07, 0x0D, +0xE2, 0x0A, 0xD1, 0x21, 0x8D, 0x00, 0x08, 0x0D, +0xE3, 0x0A, 0x90, 0x1A, 0x2C, 0x0B, 0x13, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x10, 0x1E, +0x91, 0x20, 0x09, 0x0D, 0x0B, 0x0B, 0x09, 0x00, +0x00, 0x0D, 0xE8, 0x0A, 0x91, 0x21, 0x09, 0x00, +0x00, 0x0D, 0xE9, 0x0A, 0x0F, 0x98, 0x7E, 0x25, +0x0A, 0x0D, 0xF5, 0x0A, 0x0A, 0x0D, 0x2D, 0x00, +0x0F, 0x98, 0xE7, 0x24, 0x90, 0x03, 0x0B, 0x0B, +0x97, 0x08, 0x91, 0x21, 0x98, 0x08, 0x91, 0x21, +0xD0, 0x03, 0x09, 0x0B, 0xAD, 0x00, 0x9A, 0x08, +0x00, 0x03, 0x08, 0x0B, 0xFF, 0xFF, 0x01, 0x21, +0x00, 0x0D, 0x08, 0x0B, 0xD0, 0x03, 0x09, 0x0B, +0x0D, 0x00, 0x08, 0x51, 0x50, 0x80, 0x00, 0x03, +0x21, 0x00, 0x00, 0x0D, 0xBC, 0x0D, 0x6F, 0x81, +0x10, 0x03, 0x07, 0x0B, 0x90, 0x1A, 0x85, 0x0D, +0x80, 0x1A, 0x94, 0x0D, 0x70, 0x1A, 0xA3, 0x0D, +0x91, 0x20, 0x81, 0x20, 0x71, 0x20, 0x90, 0x0B, +0x80, 0x0B, 0x70, 0x0B, 0x7F, 0x80, 0x00, 0x03, +0x07, 0x0B, 0x10, 0x03, 0x03, 0x0B, 0x10, 0xC0, +0x01, 0x0D, 0x03, 0x0B, 0xD0, 0x03, 0x09, 0x0B, +0x0D, 0x00, 0x08, 0x51, 0xE1, 0x80, 0x10, 0x03, +0x07, 0x0B, 0x90, 0x1A, 0x85, 0x0D, 0x80, 0x1A, +0x94, 0x0D, 0x70, 0x1A, 0xA3, 0x0D, 0x91, 0x20, +0x81, 0x20, 0x71, 0x20, 0x90, 0x0B, 0x80, 0x0B, +0x70, 0x0B, 0xD0, 0x03, 0x09, 0x0B, 0xFF, 0xFF, +0xD3, 0x21, 0x0D, 0x0D, 0x09, 0x0B, 0xA0, 0x03, +0x07, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0x07, 0x0B, 0xAF, 0x49, 0x01, 0x88, 0xFE, 0x1D, +0x00, 0x03, 0x08, 0x0B, 0x10, 0x03, 0x0A, 0x00, +0x01, 0x48, 0x5C, 0x81, 0xD0, 0x1A, 0x58, 0x0D, +0xD2, 0x21, 0xA0, 0x19, 0x0D, 0x00, 0x0E, 0x51, +0x90, 0x80, 0x80, 0x1A, 0x94, 0x0D, 0x8A, 0x20, +0x08, 0x00, 0x00, 0x49, 0x31, 0x80, 0x00, 0x1A, +0xFF, 0x00, 0x80, 0x08, 0xD3, 0x21, 0xA1, 0x21, +0xAF, 0x49, 0x01, 0x87, 0xFF, 0xA0, 0xD0, 0x1A, +0x58, 0x0D, 0xD2, 0x21, 0x0D, 0x0D, 0x09, 0x0B, +0x00, 0x0E, 0x07, 0x0B, 0xD0, 0x03, 0x09, 0x0B, +0x0D, 0x00, 0x0E, 0x51, 0x00, 0x88, 0x1D, 0x1F, +0x00, 0x03, 0x07, 0x0B, 0x10, 0x03, 0x03, 0x0B, +0x10, 0x50, 0x01, 0x88, 0x1D, 0x1F, 0x0F, 0x98, +0xA9, 0x1D, 0x30, 0x03, 0x0A, 0x00, 0xD3, 0x48, +0x10, 0x85, 0x0D, 0x0D, 0x0A, 0x0B, 0xA0, 0x03, +0x05, 0x0B, 0xAD, 0xC0, 0x0A, 0x0D, 0x05, 0x0B, +0xA0, 0x1A, 0x9C, 0x0B, 0xAD, 0x20, 0xA0, 0x0B, +0xA0, 0x1A, 0xAC, 0x0B, 0xAD, 0x20, 0xA0, 0x0B, +0xA0, 0x1A, 0x22, 0x02, 0xAD, 0x20, 0xA1, 0x0B, +0xA0, 0x1A, 0x18, 0x02, 0xAD, 0x20, 0x00, 0x03, +0x2D, 0x02, 0xA0, 0x08, 0x80, 0x1A, 0x94, 0x0D, +0xA0, 0x03, 0x07, 0x0B, 0xFF, 0xFF, 0x8A, 0x20, +0xD1, 0x21, 0x8D, 0x08, 0x00, 0x03, 0x07, 0x0B, +0x10, 0x03, 0x03, 0x0B, 0x10, 0xC0, 0x01, 0x0D, +0x03, 0x0B, 0xD0, 0x03, 0x09, 0x0B, 0xFF, 0xFF, +0xD2, 0x39, 0x7D, 0x00, 0xFF, 0xFF, 0xD1, 0x21, +0x8D, 0x00, 0x10, 0x03, 0x0A, 0x0B, 0x90, 0x1A, +0x2C, 0x0B, 0x13, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x10, 0x1E, 0x91, 0x20, 0x97, 0x08, +0x91, 0x21, 0x98, 0x08, 0x91, 0x21, 0xD0, 0x03, +0x09, 0x0B, 0x0D, 0x00, 0x90, 0x08, 0x00, 0x03, +0x08, 0x0B, 0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, +0x08, 0x0B, 0x10, 0x03, 0x21, 0x00, 0x01, 0x0D, +0xBC, 0x0D, 0x10, 0x03, 0x0A, 0x00, 0x01, 0x48, +0x00, 0x88, 0x9D, 0x1E, 0xD0, 0x03, 0x09, 0x0B, +0xFF, 0xFF, 0xD3, 0x21, 0x0D, 0x0D, 0x09, 0x0B, +0xA0, 0x03, 0x07, 0x0B, 0xFF, 0xFF, 0xA1, 0x21, +0x0A, 0x0D, 0x07, 0x0B, 0xAF, 0x49, 0x01, 0x88, +0xB9, 0x1E, 0xFF, 0xA0, 0x00, 0x0E, 0xF1, 0x0A, +0xB0, 0x1A, 0x2C, 0x0B, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0xBA, 0x20, 0xC0, 0x1A, +0x0E, 0x0B, 0xCA, 0x20, 0xDC, 0x18, 0xD2, 0x21, +0x0D, 0x00, 0x08, 0x51, 0x00, 0x88, 0xAA, 0x1F, +0xDB, 0x18, 0xD2, 0x21, 0x0D, 0x00, 0x08, 0x51, +0x00, 0x88, 0x9F, 0x1F, 0x0B, 0x51, 0x01, 0x88, +0x9F, 0x1F, 0xAB, 0x00, 0x0A, 0x0D, 0xE8, 0x0A, +0xAC, 0x00, 0x0A, 0x0D, 0xE2, 0x0A, 0xB1, 0x21, +0xC1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, 0xE9, 0x0A, +0xAC, 0x00, 0x0A, 0x0D, 0xE3, 0x0A, 0xB1, 0x39, +0xC1, 0x39, 0x0F, 0x98, 0x7E, 0x25, 0x0A, 0x0D, +0xF5, 0x0A, 0xA0, 0x03, 0xB8, 0x00, 0xD0, 0x03, +0xF5, 0x0A, 0xDA, 0x48, 0xBD, 0x82, 0x0B, 0x00, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0x0B, 0x00, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0xAB, 0x00, +0xA0, 0x62, 0xFF, 0x00, 0x0F, 0x98, 0xB5, 0x1D, +0xA0, 0x03, 0xE4, 0x0A, 0xA0, 0x62, 0xFF, 0x00, +0x9C, 0x00, 0x90, 0x62, 0xFF, 0x00, 0xA9, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0x90, 0x03, +0xB9, 0x00, 0xA9, 0x48, 0xAB, 0x80, 0xA0, 0x03, +0xE4, 0x0A, 0xA0, 0x62, 0x00, 0xFF, 0x9C, 0x00, +0x90, 0x62, 0xFF, 0x00, 0xA9, 0x68, 0xCA, 0x08, +0x5F, 0x83, 0xA0, 0x03, 0xE4, 0x0A, 0xAF, 0xC1, +0xCA, 0x08, 0x0F, 0x83, 0xB2, 0x21, 0xC2, 0x21, +0xAB, 0x00, 0xA0, 0x62, 0xFF, 0x00, 0x0F, 0x98, +0xB5, 0x1D, 0xA0, 0x03, 0xE4, 0x0A, 0xAA, 0xC9, +0xA8, 0xC1, 0x0A, 0x0D, 0xE4, 0x0A, 0x4F, 0x85, +0xB2, 0x21, 0xC2, 0x21, 0x0C, 0x00, 0x0D, 0x51, +0x20, 0x80, 0xC0, 0x0B, 0xBF, 0x81, 0xA0, 0x19, +0xAB, 0xC1, 0xCA, 0x08, 0x7F, 0x81, 0xDB, 0x18, +0xD2, 0x21, 0x0D, 0x00, 0x08, 0x51, 0x31, 0x80, +0xC2, 0x21, 0xC0, 0x0B, 0xFF, 0x80, 0x0B, 0x00, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0x0B, 0x00, +0xC0, 0x08, 0xB1, 0x21, 0xC1, 0x21, 0x0B, 0x00, +0x00, 0x62, 0xFF, 0x00, 0x0F, 0xC1, 0x08, 0xC1, +0x09, 0xC1, 0xC0, 0x08, 0x00, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, 0xF1, 0x0A, +0x10, 0x03, 0x0A, 0x00, 0x01, 0x48, 0x01, 0x88, +0x2F, 0x1F, 0xFF, 0xA0, 0xFF, 0xFF, 0x30, 0x19, +0x40, 0x19, 0xA0, 0x19, 0x60, 0x1A, 0xD7, 0x0A, +0x50, 0x1A, 0x72, 0x03, 0xB0, 0x1A, 0x8B, 0x0B, +0xBA, 0x20, 0x9B, 0x00, 0xC0, 0x03, 0x56, 0x00, +0xD0, 0x03, 0x55, 0x00, 0x09, 0x0D, 0x18, 0xF9, +0x00, 0x0E, 0x19, 0xF9, 0x0C, 0x0D, 0x1A, 0xF9, +0x00, 0x0E, 0x1B, 0xF9, 0x20, 0x03, 0x1A, 0xF9, +0x10, 0x03, 0x18, 0xF9, 0xFF, 0xFF, 0xC1, 0x39, +0xD1, 0x39, 0x00, 0x19, 0x10, 0x49, 0x11, 0x80, +0x00, 0xC1, 0x1D, 0x48, 0x11, 0x80, 0x01, 0xC1, +0x20, 0x49, 0x11, 0x80, 0x02, 0xC1, 0x2C, 0x48, +0x11, 0x80, 0x03, 0xC1, 0xC1, 0x21, 0xD1, 0x21, +0x00, 0x49, 0x41, 0x80, 0xB0, 0x1A, 0xEF, 0x01, +0x87, 0x19, 0xFF, 0x82, 0x01, 0x49, 0x41, 0x80, +0xB0, 0x1A, 0xE8, 0x01, 0x83, 0x19, 0x9F, 0x82, +0x02, 0x49, 0x41, 0x80, 0xB0, 0x1A, 0x2F, 0x00, +0x83, 0x19, 0x3F, 0x82, 0x04, 0x49, 0x41, 0x80, +0xB0, 0x1A, 0xA6, 0x01, 0x83, 0x19, 0xDF, 0x81, +0x08, 0x49, 0x41, 0x80, 0xB0, 0x1A, 0xCB, 0x00, +0x83, 0x19, 0x7F, 0x81, 0x05, 0x49, 0x41, 0x80, +0xB0, 0x1A, 0xA0, 0x01, 0x82, 0x19, 0x1F, 0x81, +0x09, 0x49, 0x41, 0x80, 0xB0, 0x1A, 0xC8, 0x00, +0x82, 0x19, 0xBF, 0x80, 0x06, 0x49, 0x41, 0x80, +0xB0, 0x1A, 0x26, 0x00, 0x82, 0x19, 0x5F, 0x80, +0x0A, 0x49, 0x31, 0x80, 0xBB, 0x19, 0x82, 0x19, +0x0F, 0x80, 0x95, 0x20, 0x39, 0x00, 0xFF, 0xFF, +0x10, 0x1A, 0x05, 0x04, 0x03, 0x18, 0x18, 0x79, +0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x1A, 0x05, 0x04, 0x20, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0xFE, 0x15, 0x30, 0x18, 0x9C, 0x38, +0x91, 0x39, 0x49, 0x00, 0x64, 0x08, 0x61, 0x21, +0x91, 0x21, 0x49, 0x00, 0x64, 0x08, 0x61, 0x21, +0x91, 0x21, 0x49, 0x00, 0x64, 0x08, 0x61, 0x21, +0x9C, 0x20, 0x92, 0x39, 0x49, 0x00, 0x64, 0x08, +0x61, 0x21, 0x91, 0x21, 0x49, 0x00, 0x64, 0x08, +0x61, 0x21, 0x91, 0x21, 0x49, 0x00, 0x64, 0x08, +0x61, 0x21, 0x9C, 0x20, 0x92, 0x39, 0x49, 0x00, +0x64, 0x08, 0x61, 0x21, 0x91, 0x21, 0x49, 0x00, +0x64, 0x08, 0x61, 0x21, 0x91, 0x21, 0x49, 0x00, +0x64, 0x08, 0x60, 0x1A, 0xD7, 0x0A, 0x70, 0x19, +0x20, 0x19, 0xB7, 0x50, 0x40, 0x80, 0x46, 0x00, +0x43, 0x48, 0x1C, 0x80, 0x21, 0x21, 0x61, 0x21, +0x71, 0x21, 0x79, 0x49, 0x61, 0x87, 0x28, 0x48, +0xCD, 0x80, 0x0F, 0x98, 0x24, 0x1D, 0xA1, 0x39, +0x10, 0x03, 0x6D, 0x0A, 0xFF, 0xFF, 0x11, 0x39, +0x01, 0x0D, 0x6D, 0x0A, 0x10, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0xA1, 0x21, 0xB0, 0x03, 0x6D, 0x0A, +0xAB, 0x48, 0x0C, 0x88, 0xD1, 0x1F, 0xFF, 0xA0, +0x20, 0x03, 0x39, 0x00, 0x20, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0xA0, 0x19, 0xB0, 0x19, 0xC0, 0x1A, +0x0E, 0x0B, 0xC2, 0x21, 0x30, 0x03, 0x0A, 0x00, +0x0C, 0x00, 0x08, 0x51, 0x50, 0x80, 0x00, 0x62, +0xFF, 0x00, 0x0B, 0x48, 0x1C, 0x80, 0xB0, 0x18, +0xC3, 0x21, 0xA1, 0x21, 0xA3, 0x48, 0x41, 0x87, +0x0B, 0x0D, 0xB3, 0x0A, 0xA0, 0x19, 0x00, 0x03, +0xB3, 0x0A, 0x10, 0x03, 0x39, 0x00, 0x21, 0x18, +0x18, 0x79, 0x10, 0x49, 0x60, 0x80, 0x0F, 0x98, +0xBD, 0x15, 0x20, 0x03, 0x39, 0x00, 0x20, 0x62, +0xFF, 0x00, 0x0F, 0x98, 0xFE, 0x15, 0x00, 0x0D, +0xB3, 0x0A, 0x40, 0x03, 0xB3, 0x0A, 0xC0, 0x1A, +0x0E, 0x0B, 0xC2, 0x21, 0xD0, 0x1A, 0x77, 0x00, +0xD2, 0x21, 0x30, 0x03, 0x0A, 0x00, 0x0C, 0x00, +0x10, 0x18, 0x18, 0x51, 0x41, 0x80, 0x1D, 0xC9, +0x1A, 0xC9, 0xC1, 0x08, 0x0F, 0x82, 0x00, 0x62, +0xFF, 0x00, 0x04, 0x48, 0x7B, 0x80, 0x0D, 0x00, +0x08, 0x51, 0x61, 0x80, 0x1D, 0xC1, 0x1A, 0xC9, +0xC1, 0x08, 0x5F, 0x81, 0x1D, 0x51, 0x91, 0x80, +0x1D, 0xC9, 0xC1, 0x08, 0x00, 0x03, 0x6E, 0x0A, +0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, 0x6E, 0x0A, +0xAF, 0x80, 0x1D, 0xC9, 0x1A, 0xC9, 0x19, 0xC1, +0xC1, 0x08, 0x00, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, +0x01, 0x21, 0x00, 0x0D, 0x6E, 0x0A, 0x40, 0x03, +0xB3, 0x0A, 0xFF, 0xFF, 0xC3, 0x21, 0xD3, 0x21, +0xA1, 0x21, 0xA3, 0x48, 0x01, 0x85, 0xFF, 0xA0, +0x00, 0x03, 0x7A, 0x0A, 0x00, 0x49, 0xA0, 0x80, +0x80, 0x19, 0x00, 0x03, 0x62, 0x0A, 0x10, 0x03, +0x49, 0x00, 0x01, 0x48, 0xFD, 0xA0, 0xFF, 0xFF, +0x81, 0x19, 0xFF, 0xA0, 0x81, 0x19, 0x90, 0x03, +0x62, 0x0A, 0x00, 0x03, 0x4A, 0x00, 0x90, 0x48, +0xFB, 0xA0, 0xFF, 0xFF, 0x80, 0x19, 0x90, 0x19, +0x60, 0x19, 0xB0, 0x03, 0x06, 0x02, 0xC0, 0x1A, +0x32, 0x02, 0x70, 0x03, 0x10, 0x02, 0x7F, 0x51, +0xF1, 0xA0, 0xFF, 0xFF, 0x07, 0x18, 0x10, 0x03, +0x4B, 0x00, 0x10, 0x49, 0x21, 0x80, 0x80, 0x19, +0xFF, 0xA0, 0x21, 0x18, 0x18, 0x79, 0x10, 0x49, +0x60, 0x80, 0x0F, 0x98, 0xBD, 0x15, 0x20, 0x03, +0x4B, 0x00, 0x20, 0x62, 0xFF, 0x00, 0x0F, 0x98, +0xFE, 0x15, 0x70, 0x18, 0x70, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0x70, 0x31, 0x00, 0x03, 0x11, 0x02, +0x07, 0x48, 0xFA, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, +0x63, 0x0A, 0x50, 0x03, 0x4D, 0x00, 0xA5, 0x48, +0xFC, 0xA0, 0xFF, 0xFF, 0x81, 0x19, 0xFF, 0xA0, +0x00, 0x03, 0xEE, 0x0A, 0x10, 0x03, 0xEF, 0x0A, +0x40, 0x03, 0x55, 0x00, 0x50, 0x03, 0x56, 0x00, +0xFF, 0xFF, 0x41, 0x39, 0x51, 0x39, 0x30, 0x19, +0x20, 0x19, 0x60, 0x03, 0xE5, 0x00, 0x6F, 0x51, +0x30, 0x81, 0x60, 0x03, 0xA8, 0x00, 0x60, 0x49, +0x80, 0x80, 0x31, 0x19, 0x60, 0x03, 0xA9, 0x00, +0x60, 0x49, 0xA0, 0x80, 0x30, 0x19, 0x51, 0x39, +0x7F, 0x80, 0x21, 0x19, 0x60, 0x03, 0xA9, 0x00, +0x60, 0x49, 0x20, 0x80, 0x20, 0x19, 0x41, 0x39, +0x02, 0x48, 0xF0, 0x80, 0x04, 0x48, 0xA0, 0x81, +0x13, 0x48, 0x31, 0x80, 0x03, 0x0E, 0xC9, 0x0A, +0xFF, 0xA0, 0x15, 0x48, 0x20, 0x80, 0x00, 0x0E, +0xC9, 0x0A, 0x21, 0x80, 0x04, 0x0E, 0xC9, 0x0A, +0xFF, 0xA0, 0x13, 0x48, 0x31, 0x80, 0x05, 0x0E, +0xC9, 0x0A, 0xFF, 0xA0, 0x15, 0x48, 0x20, 0x80, +0x01, 0x0E, 0xC9, 0x0A, 0x21, 0x80, 0x06, 0x0E, +0xC9, 0x0A, 0xFF, 0xA0, 0x13, 0x48, 0x31, 0x80, +0x07, 0x0E, 0xC9, 0x0A, 0xFF, 0xA0, 0x15, 0x48, +0x20, 0x80, 0x02, 0x0E, 0xC9, 0x0A, 0x21, 0x80, +0x08, 0x0E, 0xC9, 0x0A, 0xFF, 0xA0, 0x00, 0x0E, +0x09, 0x02, 0xA0, 0x03, 0x09, 0x02, 0xB0, 0x1A, +0x8B, 0x0B, 0xBA, 0x20, 0x9B, 0x00, 0x0A, 0x0D, +0xC7, 0x0A, 0x09, 0x0D, 0xC8, 0x0A, 0xA0, 0x03, +0x56, 0x00, 0x09, 0x0D, 0x18, 0xF9, 0x00, 0x0E, +0x19, 0xF9, 0x0A, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, +0x1B, 0xF9, 0xFF, 0xFF, 0xA0, 0x03, 0x1A, 0xF9, +0x0A, 0x0D, 0xEF, 0x0A, 0xA0, 0x03, 0x18, 0xF9, +0x0A, 0x0D, 0xEE, 0x0A, 0x60, 0x03, 0x0C, 0x00, +0x69, 0x51, 0xE0, 0x81, 0x60, 0x03, 0x58, 0x0A, +0x61, 0x49, 0xAD, 0x81, 0x60, 0x03, 0x6F, 0x0A, +0x61, 0x49, 0x6D, 0x81, 0x60, 0x1A, 0xF2, 0x05, +0x69, 0x20, 0x26, 0x00, 0x60, 0x1A, 0x34, 0x0D, +0x00, 0x03, 0xEF, 0x0A, 0xFF, 0xFF, 0x60, 0x20, +0x16, 0x00, 0x21, 0x48, 0x2C, 0x82, 0x60, 0x1A, +0x44, 0x0D, 0x00, 0x03, 0xEE, 0x0A, 0xFF, 0xFF, +0x60, 0x20, 0x16, 0x00, 0x21, 0x48, 0x9C, 0x81, +0xA0, 0x03, 0x56, 0x00, 0xFF, 0xFF, 0x9A, 0x38, +0x91, 0x39, 0x09, 0x0D, 0xF5, 0x0A, 0x50, 0x1A, +0x7C, 0x0A, 0x60, 0x1A, 0xF2, 0x05, 0x0F, 0x98, +0xF5, 0x23, 0x0F, 0x98, 0x3B, 0x21, 0xA0, 0x03, +0xC9, 0x0A, 0xA0, 0x49, 0x31, 0x80, 0x0F, 0x98, +0x51, 0x2D, 0xFF, 0x81, 0x0F, 0x98, 0x4F, 0x2E, +0xCF, 0x81, 0xA0, 0x03, 0x09, 0x02, 0xFF, 0xFF, +0x0F, 0x98, 0x24, 0x1D, 0xD0, 0x03, 0x6D, 0x0A, +0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x0D, 0x6D, 0x0A, +0xD0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, 0xD1, 0x39, +0x0D, 0x0D, 0x6E, 0x0A, 0xD0, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0xA0, 0x03, 0x09, 0x02, 0xFF, 0xFF, +0xA1, 0x39, 0x0A, 0x0D, 0x09, 0x02, 0x0F, 0x88, +0x98, 0x23, 0xD0, 0x03, 0xEE, 0x0A, 0xFF, 0xFF, +0xD7, 0x7B, 0xC0, 0x03, 0xB7, 0x0A, 0xFF, 0xFF, +0xDC, 0x20, 0xD0, 0x22, 0x40, 0x00, 0x0D, 0x0D, +0xB7, 0x0A, 0xD0, 0x03, 0xEF, 0x0A, 0xFF, 0xFF, +0xD7, 0x7B, 0xC0, 0x03, 0xB8, 0x0A, 0xFF, 0xFF, +0xDC, 0x20, 0xD0, 0x22, 0x40, 0x00, 0x0D, 0x0D, +0xB8, 0x0A, 0xC0, 0x03, 0xB7, 0x0A, 0xC0, 0x49, +0x3B, 0x80, 0x00, 0x0E, 0xB7, 0x0A, 0x6F, 0x80, +0xB0, 0x03, 0xB5, 0x0A, 0xCB, 0x48, 0x2C, 0x80, +0x0B, 0x0D, 0xB7, 0x0A, 0xC0, 0x03, 0xB8, 0x0A, +0xC0, 0x49, 0x3B, 0x80, 0x00, 0x0E, 0xB8, 0x0A, +0x6F, 0x80, 0xB0, 0x03, 0xB6, 0x0A, 0xCB, 0x48, +0x2C, 0x80, 0x0B, 0x0D, 0xB8, 0x0A, 0xA0, 0x03, +0xB9, 0x0A, 0x90, 0x03, 0x2A, 0x00, 0x0A, 0x0D, +0x18, 0xF9, 0x00, 0x0E, 0x19, 0xF9, 0x09, 0x0D, +0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, +0xA0, 0x03, 0x18, 0xF9, 0xA0, 0x4A, 0xFF, 0x00, +0x2C, 0x80, 0xA0, 0x1A, 0xFF, 0x00, 0xA5, 0x49, +0x1B, 0x80, 0xA5, 0x19, 0x0A, 0x0D, 0xB9, 0x0A, +0xA0, 0x03, 0xB7, 0x0A, 0xB0, 0x03, 0xBF, 0x00, +0xAB, 0x48, 0x2B, 0x80, 0x0B, 0x0D, 0xB7, 0x0A, +0xA0, 0x03, 0xB7, 0x0A, 0x00, 0x03, 0xC0, 0x00, +0xB0, 0x03, 0xB5, 0x0A, 0xFF, 0xFF, 0xB0, 0x38, +0xAB, 0x48, 0x2D, 0x80, 0x0B, 0x0D, 0xB7, 0x0A, +0xA0, 0x03, 0xB8, 0x0A, 0xB0, 0x03, 0xC1, 0x00, +0xAB, 0x48, 0x2B, 0x80, 0x0B, 0x0D, 0xB8, 0x0A, +0xA0, 0x03, 0xB8, 0x0A, 0x00, 0x03, 0xC2, 0x00, +0xB0, 0x03, 0xB6, 0x0A, 0xFF, 0xFF, 0xB0, 0x38, +0xAB, 0x48, 0x2D, 0x80, 0x0B, 0x0D, 0xB8, 0x0A, +0xA0, 0x03, 0xB7, 0x0A, 0xB0, 0x03, 0xBF, 0x00, +0xFF, 0xFF, 0xAB, 0x38, 0x0A, 0x0D, 0xB7, 0x0A, +0xA0, 0x03, 0xB8, 0x0A, 0xB0, 0x03, 0xC1, 0x00, +0xFF, 0xFF, 0xAB, 0x38, 0x0A, 0x0D, 0xB8, 0x0A, +0x80, 0x03, 0xB5, 0x00, 0x90, 0x03, 0xB6, 0x00, +0x00, 0x03, 0xB7, 0x00, 0x02, 0x51, 0x40, 0x80, +0x90, 0x03, 0xB5, 0x00, 0x80, 0x03, 0xB6, 0x00, +0xC0, 0x03, 0xB8, 0x0A, 0xD0, 0x03, 0xB6, 0x0A, +0x00, 0x03, 0xC1, 0x00, 0xFF, 0xFF, 0xD0, 0x38, +0x00, 0x03, 0xC2, 0x00, 0xFF, 0xFF, 0xD0, 0x38, +0x00, 0x03, 0xA8, 0x00, 0x00, 0x49, 0xC0, 0x80, +0x10, 0x03, 0xE5, 0x00, 0x1F, 0x51, 0x80, 0x80, +0xD0, 0x3A, 0x80, 0x00, 0x10, 0x03, 0xA9, 0x00, +0x10, 0x49, 0x21, 0x80, 0xC0, 0x3A, 0x80, 0x00, +0xC0, 0x49, 0x1B, 0x80, 0xC0, 0x19, 0xCD, 0x48, +0x1D, 0x80, 0xCD, 0x18, 0x08, 0x0D, 0x14, 0xF9, +0x00, 0x0E, 0x15, 0xF9, 0x0C, 0x0D, 0x16, 0xF9, +0x00, 0x0E, 0x17, 0xF9, 0xB0, 0x03, 0x14, 0xF9, +0xC0, 0x03, 0x15, 0xF9, 0x0B, 0x0D, 0x18, 0xF9, +0x0C, 0x0D, 0x19, 0xF9, 0x0D, 0x0D, 0x1A, 0xF9, +0x00, 0x0E, 0x1B, 0xF9, 0xFF, 0xFF, 0xA0, 0x03, +0x18, 0xF9, 0x0A, 0x0D, 0xB8, 0x0A, 0xC0, 0x03, +0xB7, 0x0A, 0xD0, 0x03, 0xB5, 0x0A, 0x00, 0x03, +0xBF, 0x00, 0xFF, 0xFF, 0xD0, 0x38, 0x00, 0x03, +0xC0, 0x00, 0xFF, 0xFF, 0xD0, 0x38, 0x00, 0x03, +0xA8, 0x00, 0x01, 0x49, 0xC0, 0x80, 0x10, 0x03, +0xE5, 0x00, 0x1F, 0x51, 0x80, 0x80, 0xD0, 0x3A, +0x80, 0x00, 0x10, 0x03, 0xA9, 0x00, 0x10, 0x49, +0x21, 0x80, 0xC0, 0x3A, 0x80, 0x00, 0xC0, 0x49, +0x1B, 0x80, 0xC0, 0x19, 0xCD, 0x48, 0x1D, 0x80, +0xCD, 0x18, 0x09, 0x0D, 0x14, 0xF9, 0x00, 0x0E, +0x15, 0xF9, 0x0C, 0x0D, 0x16, 0xF9, 0x00, 0x0E, +0x17, 0xF9, 0xB0, 0x03, 0x14, 0xF9, 0xC0, 0x03, +0x15, 0xF9, 0x0B, 0x0D, 0x18, 0xF9, 0x0C, 0x0D, +0x19, 0xF9, 0x0D, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, +0x1B, 0xF9, 0xFF, 0xFF, 0xA0, 0x03, 0x18, 0xF9, +0x0A, 0x0D, 0xB7, 0x0A, 0x00, 0x03, 0xB7, 0x00, +0x02, 0x51, 0x80, 0x80, 0x00, 0x03, 0xB8, 0x0A, +0x10, 0x03, 0xB7, 0x0A, 0x00, 0x0D, 0xB7, 0x0A, +0x01, 0x0D, 0xB8, 0x0A, 0x00, 0x03, 0xB7, 0x00, +0x01, 0x51, 0xB0, 0x80, 0xB0, 0x03, 0xB6, 0x00, +0xA0, 0x03, 0xB7, 0x0A, 0xFF, 0xFF, 0xBA, 0x38, +0xB0, 0x49, 0x1B, 0x80, 0xB0, 0x19, 0x0B, 0x0D, +0xB7, 0x0A, 0x00, 0x03, 0xB7, 0x00, 0x00, 0x51, +0xB0, 0x80, 0xB0, 0x03, 0xB5, 0x00, 0xA0, 0x03, +0xB8, 0x0A, 0xFF, 0xFF, 0xBA, 0x38, 0xB0, 0x49, +0x1B, 0x80, 0xB0, 0x19, 0x0B, 0x0D, 0xB8, 0x0A, +0xD0, 0x03, 0xB5, 0x00, 0xA0, 0x03, 0xB8, 0x0A, +0xAD, 0x48, 0x2D, 0x80, 0x0D, 0x0D, 0xB8, 0x0A, +0xA0, 0x49, 0x2B, 0x80, 0x00, 0x0E, 0xB8, 0x0A, +0xD0, 0x03, 0xB6, 0x00, 0xA0, 0x03, 0xB7, 0x0A, +0xAD, 0x48, 0x2D, 0x80, 0x0D, 0x0D, 0xB7, 0x0A, +0xA0, 0x49, 0x2B, 0x80, 0x00, 0x0E, 0xB7, 0x0A, +0x00, 0x1A, 0x40, 0x00, 0x10, 0x1A, 0x69, 0x01, +0x20, 0x03, 0xB8, 0x0A, 0x30, 0x03, 0xB7, 0x0A, +0xA0, 0x03, 0x97, 0x00, 0x41, 0x00, 0x84, 0x18, +0x54, 0x18, 0x4A, 0x20, 0xB0, 0x03, 0xB5, 0x00, +0x4B, 0x48, 0x0D, 0xB0, 0x4B, 0x18, 0x5A, 0x38, +0x50, 0x49, 0x0B, 0xB0, 0x50, 0x19, 0x11, 0x21, +0x61, 0x00, 0x96, 0x18, 0x76, 0x18, 0x6A, 0x20, +0xB0, 0x03, 0xB6, 0x00, 0x6B, 0x48, 0x0D, 0xB0, +0x6B, 0x18, 0x7A, 0x38, 0x70, 0x49, 0x0B, 0xB0, +0x70, 0x19, 0x11, 0x21, 0x24, 0x48, 0x3A, 0x81, +0x25, 0x48, 0x1C, 0x81, 0x36, 0x48, 0xFA, 0x80, +0x37, 0x48, 0xDC, 0x80, 0xC0, 0x03, 0xB9, 0x0A, +0xD0, 0x03, 0x98, 0x00, 0xCD, 0x48, 0x0A, 0xB0, +0x0F, 0x98, 0xA4, 0x23, 0x02, 0x0D, 0xB8, 0x0A, +0x03, 0x0D, 0xB7, 0x0A, 0x2F, 0x80, 0x01, 0x39, +0xD1, 0x84, 0xA0, 0x03, 0x09, 0x02, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xB0, 0x1A, 0x4D, 0x0B, +0xA0, 0x1E, 0xBA, 0x20, 0xA0, 0x03, 0xB8, 0x0A, +0xBA, 0x08, 0xB1, 0x21, 0xA0, 0x03, 0xB7, 0x0A, +0xBA, 0x08, 0xB1, 0x21, 0xA0, 0x03, 0xB9, 0x0A, +0xBA, 0x08, 0xA0, 0x03, 0x09, 0x02, 0xFF, 0xFF, +0xA1, 0x21, 0x0A, 0x0D, 0x09, 0x02, 0xB0, 0x03, +0x6D, 0x0A, 0xAB, 0x48, 0x01, 0x88, 0x8C, 0x21, +0xFF, 0xA0, 0x40, 0x03, 0x96, 0x00, 0x50, 0x1A, +0x64, 0x00, 0x82, 0x38, 0xC8, 0x18, 0xCF, 0x51, +0x20, 0x80, 0xFF, 0xFF, 0xC0, 0x31, 0xC2, 0x49, +0xED, 0x81, 0x08, 0x0D, 0x10, 0xF9, 0x8F, 0x51, +0xA0, 0x19, 0x10, 0x80, 0xA1, 0x39, 0x0A, 0x0D, +0x11, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x04, 0x0D, +0x12, 0xF9, 0x80, 0x03, 0x10, 0xF9, 0x08, 0x0D, +0x18, 0xF9, 0x8F, 0x51, 0xA0, 0x19, 0x10, 0x80, +0xA1, 0x39, 0x0A, 0x0D, 0x19, 0xF9, 0x00, 0x0E, +0x1B, 0xF9, 0x05, 0x0D, 0x1A, 0xF9, 0x80, 0x03, +0x18, 0xF9, 0xFF, 0xFF, 0x28, 0x20, 0x93, 0x38, +0xD9, 0x18, 0xDF, 0x51, 0x20, 0x80, 0xFF, 0xFF, +0xD0, 0x31, 0xD2, 0x49, 0xED, 0x81, 0x09, 0x0D, +0x10, 0xF9, 0x9F, 0x51, 0xA0, 0x19, 0x10, 0x80, +0xA1, 0x39, 0x0A, 0x0D, 0x11, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x04, 0x0D, 0x12, 0xF9, 0x90, 0x03, +0x10, 0xF9, 0x09, 0x0D, 0x18, 0xF9, 0x9F, 0x51, +0xA0, 0x19, 0x10, 0x80, 0xA1, 0x39, 0x0A, 0x0D, +0x19, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, 0x05, 0x0D, +0x1A, 0xF9, 0x90, 0x03, 0x18, 0xF9, 0xFF, 0xFF, +0x39, 0x20, 0xFF, 0xA0, 0x00, 0x0E, 0xF1, 0x0A, +0x00, 0x0E, 0xF2, 0x0A, 0xA0, 0x03, 0xF1, 0x0A, +0xB0, 0x03, 0xF2, 0x0A, 0xD3, 0x19, 0xDA, 0x58, +0xFF, 0xFF, 0x40, 0x03, 0x56, 0x00, 0xD0, 0x1E, +0xDB, 0x20, 0xA0, 0x03, 0xF1, 0x0A, 0xB0, 0x03, +0xF2, 0x0A, 0xFF, 0xFF, 0x4A, 0x58, 0xFF, 0xFF, +0xA0, 0x03, 0xF5, 0x0A, 0x40, 0x1E, 0x4B, 0x20, +0x4A, 0x20, 0xB5, 0x18, 0xBD, 0x20, 0xC6, 0x18, +0xC4, 0x20, 0xAC, 0x00, 0xA0, 0x49, 0x1B, 0x80, +0xA0, 0x19, 0xBA, 0x08, 0xA0, 0x03, 0xF2, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0xF2, 0x0A, +0xA3, 0x49, 0x81, 0x85, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0xF1, 0x0A, +0xA3, 0x49, 0xE1, 0x84, 0xFF, 0xA0, 0xB0, 0x1A, +0x77, 0x00, 0xC0, 0x1A, 0x0E, 0x0B, 0x00, 0x03, +0x05, 0x00, 0x00, 0x49, 0x00, 0x88, 0x78, 0x24, +0x00, 0x0E, 0xF1, 0x0A, 0x00, 0x0E, 0xF2, 0x0A, +0xD0, 0x19, 0x9C, 0x18, 0x8B, 0x18, 0xA9, 0x00, +0x8A, 0x08, 0x91, 0x21, 0x81, 0x21, 0xA9, 0x00, +0x8A, 0x08, 0x91, 0x21, 0x81, 0x21, 0x59, 0x00, +0x48, 0x00, 0x80, 0x0B, 0xA9, 0x00, 0xA8, 0x51, +0x00, 0x81, 0xAD, 0x51, 0x81, 0x80, 0x85, 0x08, +0x00, 0x03, 0xF2, 0x0A, 0xFF, 0xFF, 0x01, 0x21, +0x00, 0x0D, 0xF2, 0x0A, 0x9F, 0x80, 0x48, 0x51, +0xC0, 0x80, 0x50, 0x19, 0x5B, 0xC1, 0x85, 0x08, +0x3F, 0x80, 0xAB, 0x51, 0x60, 0x80, 0x85, 0x08, +0xA0, 0x03, 0xF1, 0x0A, 0xAD, 0xC0, 0x0A, 0x0D, +0xF1, 0x0A, 0xB3, 0x21, 0xC3, 0x21, 0xD1, 0x21, +0xA0, 0x03, 0x0A, 0x00, 0xDA, 0x48, 0x11, 0x85, +0xA0, 0x03, 0xF1, 0x0A, 0x0A, 0x0D, 0x76, 0x00, +0xB0, 0x03, 0x4A, 0x0B, 0x0B, 0x0D, 0x75, 0x00, +0xA0, 0x03, 0xF2, 0x0A, 0x0A, 0x0D, 0x59, 0x0A, +0x00, 0x03, 0xBA, 0x0A, 0x00, 0x0D, 0x95, 0x00, +0xFF, 0xA0, 0xD0, 0x03, 0x0A, 0x00, 0x00, 0x0E, +0xF1, 0x0A, 0x9C, 0x18, 0x92, 0x21, 0x89, 0x00, +0x9C, 0x18, 0xA9, 0x00, 0xBA, 0x08, 0x91, 0x21, +0xB1, 0x21, 0xA9, 0x00, 0xBA, 0x08, 0x91, 0x21, +0xB1, 0x21, 0x4B, 0x00, 0x8D, 0x51, 0x80, 0x80, +0xB0, 0x0B, 0x48, 0x51, 0x30, 0x80, 0x40, 0x19, +0x4B, 0xC1, 0xB4, 0x08, 0xB1, 0x21, 0xBF, 0x80, +0x88, 0x51, 0x60, 0x80, 0x00, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0x01, 0x21, 0x00, 0x0D, 0xF1, 0x0A, +0xA9, 0x00, 0xBA, 0x08, 0xB1, 0x21, 0xC3, 0x21, +0xD1, 0x39, 0xB1, 0x85, 0xB0, 0x03, 0x4A, 0x0B, +0x0B, 0x0D, 0x75, 0x00, 0xA0, 0x03, 0xF1, 0x0A, +0x0A, 0x0D, 0x59, 0x0A, 0xB0, 0x03, 0x4C, 0x0B, +0xFF, 0xFF, 0xB8, 0x7B, 0xAB, 0x68, 0x0A, 0x0D, +0x76, 0x00, 0x00, 0x03, 0xBA, 0x0A, 0x00, 0x0D, +0x95, 0x00, 0xFF, 0xA0, 0xD0, 0x1A, 0x0E, 0x0B, +0xD2, 0x21, 0xB0, 0x1A, 0x2C, 0x0B, 0xB2, 0x21, +0x40, 0x1A, 0x9C, 0x0B, 0x50, 0x1A, 0xAC, 0x0B, +0xC0, 0x19, 0x10, 0x19, 0x3A, 0x19, 0xD0, 0x0B, +0xB0, 0x0B, 0x40, 0x0B, 0x50, 0x0B, 0x41, 0x21, +0x51, 0x21, 0xD3, 0x21, 0xB3, 0x21, 0xC1, 0x21, +0xC3, 0x48, 0x51, 0x87, 0x90, 0x1A, 0x58, 0x0D, +0x92, 0x21, 0xA0, 0x1A, 0x85, 0x0D, 0x80, 0x1A, +0x94, 0x0D, 0x70, 0x1A, 0xA3, 0x0D, 0xC0, 0x19, +0x10, 0x19, 0x3F, 0x19, 0x90, 0x0B, 0xA0, 0x0B, +0x80, 0x0B, 0x70, 0x0B, 0x71, 0x21, 0x81, 0x21, +0xA1, 0x21, 0x93, 0x21, 0xC1, 0x21, 0xC3, 0x48, +0x51, 0x87, 0x00, 0x0E, 0x5A, 0x0A, 0xFF, 0xA0, +0x56, 0x18, 0x20, 0x1A, 0x9C, 0x0B, 0x26, 0x20, +0x30, 0x1A, 0xAC, 0x0B, 0x36, 0x20, 0x00, 0x1A, +0xBC, 0x0B, 0x10, 0x1A, 0x5C, 0x0C, 0x64, 0x7B, +0x06, 0x20, 0x16, 0x20, 0x42, 0x00, 0xFF, 0xFF, +0x04, 0x20, 0x14, 0x20, 0x07, 0x08, 0x18, 0x08, +0x41, 0x21, 0x40, 0x4A, 0x10, 0x00, 0x1C, 0x80, +0x40, 0x19, 0x24, 0x08, 0x80, 0x19, 0x40, 0x1A, +0x18, 0x02, 0x45, 0x20, 0xA0, 0x03, 0xF5, 0x0A, +0x00, 0x03, 0x2C, 0x02, 0xA0, 0x48, 0x4D, 0x80, +0x00, 0x03, 0x2D, 0x02, 0x40, 0x08, 0x81, 0x19, +0x74, 0x00, 0xFF, 0xFF, 0x71, 0x39, 0x1C, 0x80, +0x47, 0x08, 0xA1, 0x21, 0x00, 0x03, 0x2E, 0x02, +0xFF, 0xFF, 0xA0, 0x78, 0x40, 0x03, 0xB2, 0x0D, +0x40, 0x62, 0xFF, 0x00, 0x41, 0x21, 0x4A, 0x38, +0x1A, 0x80, 0x41, 0x19, 0x10, 0x1A, 0x22, 0x02, +0x15, 0x20, 0xA1, 0x00, 0x4A, 0x48, 0x3A, 0x80, +0x50, 0x80, 0xA1, 0x39, 0x3F, 0x80, 0x81, 0x49, +0x10, 0x80, 0xA1, 0x21, 0x00, 0x03, 0xB2, 0x0D, +0xFF, 0xFF, 0x08, 0x79, 0x00, 0x49, 0x11, 0x80, +0x01, 0x19, 0xA0, 0x48, 0x1B, 0x80, 0xA0, 0x18, +0x1A, 0x08, 0x43, 0x00, 0xFF, 0xFF, 0x41, 0x21, +0x4A, 0x48, 0x1C, 0x80, 0x4A, 0x18, 0x34, 0x08, +0x00, 0x1A, 0xBC, 0x0B, 0x10, 0x1A, 0x5C, 0x0C, +0x06, 0x20, 0x16, 0x20, 0xA0, 0x19, 0x70, 0x19, +0x80, 0x19, 0x34, 0x18, 0x42, 0x00, 0xFF, 0xFF, +0x41, 0x39, 0x40, 0x49, 0x2B, 0x80, 0x40, 0x22, +0x10, 0x00, 0x04, 0x20, 0x14, 0x20, 0x20, 0x00, +0xFF, 0xFF, 0x72, 0x20, 0x21, 0x00, 0xFF, 0xFF, +0x82, 0x20, 0x04, 0x38, 0x14, 0x38, 0xA1, 0x21, +0xA3, 0x48, 0xE1, 0x86, 0x00, 0x1A, 0x22, 0x02, +0x05, 0x20, 0x40, 0x00, 0xA4, 0x48, 0x1B, 0x80, +0x4A, 0x18, 0x00, 0x0E, 0x19, 0xF9, 0x07, 0x0D, +0x18, 0xF9, 0x04, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, +0x1B, 0xF9, 0xFF, 0xFF, 0x70, 0x03, 0x18, 0xF9, +0x00, 0x0E, 0x19, 0xF9, 0x08, 0x0D, 0x18, 0xF9, +0x04, 0x0D, 0x1A, 0xF9, 0x00, 0x0E, 0x1B, 0xF9, +0xFF, 0xFF, 0x80, 0x03, 0x18, 0xF9, 0x04, 0x0D, +0x2E, 0x00, 0xFF, 0xFF, 0xFF, 0xA0, 0xA0, 0x03, +0xE8, 0x0A, 0xD0, 0x03, 0xE2, 0x0A, 0xFF, 0xFF, +0xAD, 0x38, 0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, +0x0A, 0x0D, 0xEE, 0x0A, 0xA0, 0x03, 0xE9, 0x0A, +0xD0, 0x03, 0xE3, 0x0A, 0xFF, 0xFF, 0xAD, 0x38, +0xAF, 0x51, 0x10, 0x80, 0xA0, 0x31, 0x0A, 0x0D, +0xEF, 0x0A, 0x0F, 0x98, 0x99, 0x25, 0x0A, 0x0D, +0xF0, 0x0A, 0xFF, 0xA0, 0xA0, 0x03, 0xEE, 0x0A, +0xD0, 0x03, 0xEF, 0x0A, 0xA0, 0x49, 0x21, 0x80, +0xAD, 0x18, 0xFF, 0xA0, 0xD0, 0x49, 0xF0, 0xA0, +0xFF, 0xFF, 0xAD, 0x48, 0x1B, 0x80, 0xAD, 0x18, +0x00, 0x03, 0xEE, 0x0A, 0x10, 0x18, 0x0F, 0x98, +0xBD, 0x15, 0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, +0x05, 0xF9, 0x00, 0x03, 0xEF, 0x0A, 0x10, 0x18, +0x0F, 0x98, 0xBD, 0x15, 0x00, 0x0D, 0x06, 0xF9, +0x01, 0x0D, 0x07, 0xF9, 0x00, 0x03, 0x03, 0xF9, +0x10, 0x03, 0x04, 0xF9, 0x00, 0x0D, 0x18, 0xF9, +0x01, 0x0D, 0x19, 0xF9, 0xD0, 0x19, 0x26, 0x19, +0x0A, 0x0D, 0x1A, 0xF9, 0x0D, 0x0D, 0x1B, 0xF9, +0xFF, 0xFF, 0x00, 0x03, 0x18, 0xF9, 0x10, 0x03, +0x19, 0xF9, 0x00, 0x0D, 0x04, 0xF9, 0x01, 0x0D, +0x05, 0xF9, 0x0A, 0x0D, 0x06, 0xF9, 0x0D, 0x0D, +0x07, 0xF9, 0xA0, 0x03, 0x03, 0xF9, 0xD0, 0x03, +0x04, 0xF9, 0xFF, 0xFF, 0xA1, 0x79, 0xD0, 0x51, +0xAF, 0xC5, 0xD1, 0x79, 0x21, 0x39, 0x41, 0x86, +0xFF, 0xA0, 0xB0, 0x03, 0x05, 0x0B, 0xD0, 0x19, +0xBD, 0x50, 0xF0, 0xA0, 0xFF, 0xFF, 0xD1, 0x21, +0xDF, 0x49, 0xA1, 0x87, 0xFF, 0xA0, 0x0F, 0x98, +0xE0, 0x25, 0xDF, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0xA0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, 0xA1, 0x21, +0x0A, 0x0D, 0x6E, 0x0A, 0xA0, 0x03, 0x05, 0x0B, +0xA9, 0xC0, 0xAD, 0xC0, 0x0A, 0x0D, 0x05, 0x0B, +0x70, 0x4A, 0xFF, 0x00, 0x70, 0x80, 0xA0, 0x03, +0x03, 0x0B, 0xA9, 0xC0, 0xAD, 0xC0, 0x0A, 0x0D, +0x03, 0x0B, 0x6F, 0x80, 0xA0, 0x03, 0x04, 0x0B, +0xA9, 0xC0, 0xAD, 0xC0, 0x0A, 0x0D, 0x04, 0x0B, +0x90, 0x1A, 0x58, 0x0D, 0xAD, 0x18, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0x9A, 0x20, 0xC0, 0x1A, 0x4D, 0x0B, 0xA8, 0x18, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xCA, 0x20, 0x0C, 0x00, 0x90, 0x08, +0xC1, 0x21, 0x91, 0x21, 0x0C, 0x00, 0x90, 0x08, +0x91, 0x21, 0xA0, 0x03, 0xE4, 0x0A, 0xA0, 0x62, +0xFF, 0x00, 0x80, 0x1A, 0x94, 0x0D, 0x8D, 0x20, +0x80, 0x0B, 0x80, 0x1A, 0x85, 0x0D, 0x8D, 0x20, +0x08, 0x00, 0xFF, 0xFF, 0x01, 0x21, 0x80, 0x08, +0x10, 0x03, 0x5B, 0x0A, 0x81, 0x08, 0xAE, 0xC1, +0xA8, 0xC1, 0xAA, 0xC1, 0xA9, 0xC1, 0x9A, 0x08, +0x80, 0x1A, 0xA3, 0x0D, 0x8D, 0x20, 0x80, 0x0B, +0xFF, 0xA0, 0x0F, 0x98, 0x24, 0x1D, 0xA0, 0x03, +0x6D, 0x0A, 0xFF, 0xFF, 0xA1, 0x39, 0x0A, 0x0D, +0x6D, 0x0A, 0xA0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, +0xA1, 0x39, 0x0A, 0x0D, 0x6E, 0x0A, 0xA0, 0x49, +0xFC, 0xA0, 0xFF, 0xFF, 0xB0, 0x03, 0x6D, 0x0A, +0xB0, 0x49, 0x3B, 0x80, 0x00, 0x0E, 0x6E, 0x0A, +0xFF, 0xA0, 0xA0, 0x03, 0x5A, 0x0A, 0xB0, 0x03, +0x6D, 0x0A, 0xBA, 0x68, 0xB0, 0x49, 0x00, 0x88, +0xB5, 0x24, 0x90, 0x1A, 0x58, 0x0D, 0x92, 0x21, +0xC0, 0x19, 0xB0, 0x19, 0x3F, 0x19, 0xA9, 0x00, +0xA8, 0x51, 0x20, 0x80, 0xBC, 0xC0, 0x3F, 0x80, +0xA0, 0x62, 0xFF, 0x00, 0x9A, 0x08, 0x93, 0x21, +0xC1, 0x21, 0xC3, 0x48, 0x41, 0x87, 0x0B, 0x0D, +0x05, 0x0B, 0x00, 0x0E, 0xF1, 0x0A, 0x00, 0x0E, +0x03, 0x0B, 0x00, 0x0E, 0xE5, 0x0A, 0x00, 0x0E, +0x4A, 0x0B, 0x00, 0x0E, 0x04, 0x0B, 0xA0, 0x03, +0x5A, 0x0A, 0xA0, 0x49, 0x00, 0x88, 0xE9, 0x28, +0xA0, 0x03, 0x5A, 0x0A, 0xB0, 0x03, 0x6D, 0x0A, +0xAB, 0x48, 0x0A, 0x88, 0xB6, 0x27, 0xA0, 0x03, +0xF1, 0x0A, 0x3F, 0x19, 0xA3, 0x48, 0x0B, 0x88, +0xE9, 0x28, 0xB0, 0x03, 0x05, 0x0B, 0xBA, 0x50, +0x00, 0x88, 0xAE, 0x27, 0xB0, 0x03, 0x04, 0x0B, +0xBA, 0x50, 0x01, 0x88, 0xAE, 0x27, 0xB0, 0x1A, +0x58, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, +0xE2, 0x0A, 0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, +0xE3, 0x0A, 0x00, 0x0E, 0xF2, 0x0A, 0xA0, 0x1A, +0x10, 0x27, 0x0A, 0x0D, 0xF5, 0x0A, 0x0A, 0x0D, +0x06, 0x0B, 0x90, 0x03, 0xF2, 0x0A, 0xA0, 0x03, +0x6D, 0x0A, 0x9A, 0x48, 0xBB, 0x82, 0xA0, 0x03, +0x03, 0x0B, 0xA9, 0x50, 0x01, 0x82, 0xB0, 0x1A, +0x4D, 0x0B, 0xA0, 0x03, 0xF2, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, +0xE8, 0x0A, 0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, +0xE9, 0x0A, 0x0F, 0x98, 0x7E, 0x25, 0xB0, 0x03, +0xF5, 0x0A, 0xAB, 0x48, 0x8B, 0x80, 0xA0, 0x03, +0xF0, 0x0A, 0x0A, 0x0D, 0xF5, 0x0A, 0xA0, 0x03, +0xF2, 0x0A, 0x0A, 0x0D, 0x06, 0x0B, 0x90, 0x03, +0xF2, 0x0A, 0xFF, 0xFF, 0x91, 0x21, 0x09, 0x0D, +0xF2, 0x0A, 0xFF, 0x84, 0xA0, 0x03, 0x06, 0x0B, +0xA0, 0x4A, 0x10, 0x27, 0x00, 0x88, 0xAE, 0x27, +0xA0, 0x03, 0x03, 0x0B, 0x90, 0x03, 0x06, 0x0B, +0xA9, 0xC0, 0x0A, 0x0D, 0x03, 0x0B, 0xA0, 0x03, +0x04, 0x0B, 0x90, 0x03, 0xF1, 0x0A, 0xA9, 0xC0, +0x0A, 0x0D, 0x04, 0x0B, 0x00, 0x03, 0x5B, 0x0A, +0x90, 0x1A, 0x85, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0x9A, 0x20, 0x19, 0x00, 0x10, 0x48, +0x0B, 0x88, 0x46, 0x27, 0x10, 0x03, 0xC2, 0x0D, +0x00, 0x03, 0x06, 0x0B, 0x10, 0x50, 0x70, 0x82, +0x90, 0x0B, 0xA0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, +0xA1, 0x39, 0x0A, 0x0D, 0x6E, 0x0A, 0x90, 0x1A, +0x58, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xA9, 0x20, 0xA2, 0x21, 0xA0, 0x0B, +0x70, 0x1A, 0x85, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0x7A, 0x20, 0x70, 0x0B, 0x70, 0x1A, +0xA3, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0x7A, 0x20, 0x70, 0x0B, 0xA0, 0x03, 0x06, 0x0B, +0xFF, 0xFF, 0x0F, 0x88, 0x40, 0x26, 0xB0, 0x03, +0xF5, 0x0A, 0xA0, 0x03, 0x3A, 0x00, 0xBA, 0x48, +0x5B, 0x80, 0xA9, 0x00, 0xFF, 0xFF, 0xA1, 0x21, +0x9A, 0x08, 0x6F, 0x82, 0x90, 0x0B, 0x70, 0x1A, +0xA3, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0x7A, 0x20, 0x70, 0x0B, 0xDF, 0x81, 0xB0, 0x03, +0xF5, 0x0A, 0xA0, 0x03, 0x17, 0x02, 0xBA, 0x48, +0x2D, 0x80, 0x0B, 0x0D, 0x17, 0x02, 0x70, 0x1A, +0xA3, 0x0D, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0x7A, 0x20, 0xA7, 0x00, 0xAB, 0x48, 0x1B, 0x80, +0x7B, 0x08, 0xB0, 0x03, 0xBC, 0x00, 0xAB, 0x48, +0x7B, 0x80, 0xB0, 0x03, 0xF5, 0x0A, 0xA0, 0x03, +0xBB, 0x00, 0xBA, 0x48, 0x0B, 0x88, 0xA6, 0x27, +0xA0, 0x03, 0x06, 0x0B, 0x0A, 0x0D, 0x9A, 0x0B, +0xA0, 0x03, 0xF1, 0x0A, 0x0A, 0x0D, 0x9B, 0x0B, +0xC0, 0x1A, 0x4D, 0x0B, 0xA0, 0x03, 0x9A, 0x0B, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0xCA, 0x20, 0x90, 0x1A, +0x58, 0x0D, 0xA0, 0x03, 0x9B, 0x0B, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0x9A, 0x20, 0x7C, 0x00, 0x97, 0x08, +0xC1, 0x21, 0x91, 0x21, 0x8C, 0x00, 0x98, 0x08, +0xC1, 0x21, 0x91, 0x21, 0xAC, 0x00, 0xA0, 0x62, +0xFF, 0x00, 0x20, 0x03, 0x5B, 0x0A, 0x70, 0x1A, +0x85, 0x0D, 0x00, 0x03, 0x9B, 0x0B, 0xFF, 0xFF, +0x70, 0x20, 0x07, 0x00, 0x02, 0x48, 0x9B, 0x80, +0x80, 0x1A, 0x94, 0x0D, 0x00, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0x80, 0x20, 0x80, 0x0B, 0xAE, 0xC9, +0x2F, 0x80, 0x72, 0x08, 0xAE, 0xC1, 0xA8, 0xC1, +0xA9, 0xC1, 0x9A, 0x08, 0x8F, 0x80, 0x80, 0x03, +0x06, 0x0B, 0x90, 0x03, 0xF1, 0x0A, 0x70, 0x1A, +0xFF, 0x00, 0x0F, 0x98, 0xEA, 0x25, 0xA0, 0x03, +0xF1, 0x0A, 0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, +0xF1, 0x0A, 0x0F, 0x88, 0x8A, 0x26, 0x00, 0x0E, +0x03, 0x0B, 0xB0, 0x03, 0x6D, 0x0A, 0xB0, 0x49, +0x00, 0x88, 0xF2, 0x28, 0x00, 0x0E, 0xF2, 0x0A, +0xA0, 0x03, 0xF1, 0x0A, 0x90, 0x03, 0x6D, 0x0A, +0xA9, 0x48, 0x0B, 0x88, 0xE9, 0x28, 0xB0, 0x1A, +0x4D, 0x0B, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, +0xE2, 0x0A, 0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, +0xE3, 0x0A, 0x00, 0x0E, 0xF2, 0x0A, 0xA0, 0x1A, +0x10, 0x27, 0x0A, 0x0D, 0xF5, 0x0A, 0x0A, 0x0D, +0x06, 0x0B, 0xA0, 0x03, 0xF2, 0x0A, 0x3F, 0x19, +0xA3, 0x48, 0xFB, 0x82, 0x90, 0x03, 0x03, 0x0B, +0x9A, 0x50, 0x41, 0x82, 0xB0, 0x03, 0x05, 0x0B, +0xBA, 0x50, 0x00, 0x82, 0xB0, 0x1A, 0x58, 0x0D, +0xA0, 0x03, 0xF2, 0x0A, 0xFF, 0xFF, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0xBA, 0x20, 0xAB, 0x00, 0x0A, 0x0D, 0xE8, 0x0A, +0xB1, 0x21, 0xAB, 0x00, 0x0A, 0x0D, 0xE9, 0x0A, +0x0F, 0x98, 0x7E, 0x25, 0xB0, 0x03, 0xF5, 0x0A, +0xAB, 0x48, 0x8B, 0x80, 0xA0, 0x03, 0xF0, 0x0A, +0x0A, 0x0D, 0xF5, 0x0A, 0xA0, 0x03, 0xF2, 0x0A, +0x0A, 0x0D, 0x06, 0x0B, 0x90, 0x03, 0xF2, 0x0A, +0xFF, 0xFF, 0x91, 0x21, 0x09, 0x0D, 0xF2, 0x0A, +0xCF, 0x84, 0xA0, 0x03, 0x06, 0x0B, 0xA0, 0x4A, +0x10, 0x27, 0x00, 0x88, 0xE1, 0x28, 0xA0, 0x03, +0x03, 0x0B, 0x90, 0x03, 0x06, 0x0B, 0xA9, 0xC0, +0x0A, 0x0D, 0x03, 0x0B, 0xB0, 0x03, 0xF5, 0x0A, +0x70, 0x1A, 0xA3, 0x0D, 0xA0, 0x03, 0x06, 0x0B, +0xFF, 0xFF, 0x7A, 0x20, 0xA7, 0x00, 0xAB, 0x48, +0x1B, 0x80, 0x7B, 0x08, 0x00, 0x03, 0x5B, 0x0A, +0x90, 0x1A, 0x85, 0x0D, 0xA0, 0x03, 0x06, 0x0B, +0xFF, 0xFF, 0x9A, 0x20, 0x19, 0x00, 0x10, 0x48, +0x0B, 0x88, 0x7A, 0x28, 0x10, 0x03, 0xC2, 0x0D, +0x00, 0x03, 0xF1, 0x0A, 0x10, 0x50, 0x70, 0x82, +0x90, 0x0B, 0xA0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, +0xA1, 0x39, 0x0A, 0x0D, 0x6E, 0x0A, 0x90, 0x1A, +0x58, 0x0D, 0xA0, 0x03, 0x06, 0x0B, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xA9, 0x20, 0xA2, 0x21, 0xA0, 0x0B, +0x70, 0x1A, 0x85, 0x0D, 0xA0, 0x03, 0x06, 0x0B, +0xFF, 0xFF, 0x7A, 0x20, 0x70, 0x0B, 0x70, 0x1A, +0xA3, 0x0D, 0xA0, 0x03, 0x06, 0x0B, 0xFF, 0xFF, +0x7A, 0x20, 0x70, 0x0B, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0x0F, 0x88, 0x40, 0x26, 0xB0, 0x03, +0xF5, 0x0A, 0xA0, 0x03, 0x3A, 0x00, 0xBA, 0x48, +0x5B, 0x80, 0xA9, 0x00, 0xFF, 0xFF, 0xA1, 0x21, +0x9A, 0x08, 0x6F, 0x82, 0x90, 0x0B, 0x70, 0x1A, +0xA3, 0x0D, 0xA0, 0x03, 0x06, 0x0B, 0xFF, 0xFF, +0x7A, 0x20, 0x70, 0x0B, 0xDF, 0x81, 0xB0, 0x03, +0xF5, 0x0A, 0xA0, 0x03, 0x17, 0x02, 0xBA, 0x48, +0x2D, 0x80, 0x0B, 0x0D, 0x17, 0x02, 0x70, 0x1A, +0xA3, 0x0D, 0xA0, 0x03, 0x06, 0x0B, 0xFF, 0xFF, +0x7A, 0x20, 0xA7, 0x00, 0xAB, 0x48, 0x1B, 0x80, +0x7B, 0x08, 0xB0, 0x03, 0xBC, 0x00, 0xAB, 0x48, +0x7B, 0x80, 0xB0, 0x03, 0xF5, 0x0A, 0xA0, 0x03, +0xBB, 0x00, 0xBA, 0x48, 0x0B, 0x88, 0xDA, 0x28, +0xA0, 0x03, 0xF1, 0x0A, 0x0A, 0x0D, 0x9A, 0x0B, +0xA0, 0x03, 0x06, 0x0B, 0x0A, 0x0D, 0x9B, 0x0B, +0xC0, 0x1A, 0x4D, 0x0B, 0xA0, 0x03, 0x9A, 0x0B, +0xFF, 0xFF, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0xCA, 0x20, 0x90, 0x1A, +0x58, 0x0D, 0xA0, 0x03, 0x9B, 0x0B, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0x9A, 0x20, 0x7C, 0x00, 0x97, 0x08, +0xC1, 0x21, 0x91, 0x21, 0x8C, 0x00, 0x98, 0x08, +0xC1, 0x21, 0x91, 0x21, 0xAC, 0x00, 0xA0, 0x62, +0xFF, 0x00, 0x20, 0x03, 0x5B, 0x0A, 0x70, 0x1A, +0x85, 0x0D, 0x00, 0x03, 0x06, 0x0B, 0xFF, 0xFF, +0x70, 0x20, 0x07, 0x00, 0x02, 0x48, 0x9B, 0x80, +0x80, 0x1A, 0x94, 0x0D, 0x00, 0x03, 0x06, 0x0B, +0xFF, 0xFF, 0x80, 0x20, 0x80, 0x0B, 0xAE, 0xC9, +0x2F, 0x80, 0x72, 0x08, 0xAE, 0xC1, 0xA8, 0xC1, +0xA9, 0xC1, 0x9A, 0x08, 0x7F, 0x80, 0x90, 0x03, +0x06, 0x0B, 0x80, 0x03, 0xF1, 0x0A, 0x70, 0x19, +0x0F, 0x98, 0xEA, 0x25, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0xF1, 0x0A, +0x0F, 0x88, 0xBF, 0x27, 0xA0, 0x03, 0x5A, 0x0A, +0xB0, 0x03, 0x6D, 0x0A, 0xAB, 0x48, 0xF0, 0xA0, +0xFF, 0xFF, 0xBA, 0x48, 0xDA, 0x82, 0xD0, 0x03, +0x03, 0x0B, 0xC0, 0x19, 0xB0, 0x03, 0x05, 0x0B, +0xBC, 0x50, 0x20, 0x82, 0xDC, 0x50, 0x01, 0x82, +0x90, 0x1A, 0x58, 0x0D, 0xAC, 0x18, 0xA3, 0x59, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA0, 0x1E, +0x9A, 0x20, 0x92, 0x21, 0xA9, 0x00, 0xA0, 0x62, +0xFF, 0x00, 0x70, 0x1A, 0x85, 0x0D, 0x7C, 0x20, +0x87, 0x00, 0x70, 0x0B, 0x20, 0x03, 0x5B, 0x0A, +0x82, 0x48, 0x2B, 0x80, 0xAE, 0xC9, 0x1F, 0x80, +0xAE, 0xC1, 0xAB, 0xC1, 0x9A, 0x08, 0xB0, 0x03, +0x05, 0x0B, 0xBC, 0xC8, 0x0B, 0x0D, 0x05, 0x0B, +0xC1, 0x21, 0xCF, 0x49, 0x71, 0x85, 0xFF, 0xA0, +0x00, 0x0E, 0xF1, 0x0A, 0xA0, 0x03, 0xF1, 0x0A, +0xB0, 0x03, 0x6D, 0x0A, 0xAB, 0x48, 0xFB, 0xA0, +0xFF, 0xFF, 0x90, 0x03, 0xF1, 0x0A, 0xA0, 0x03, +0x03, 0x0B, 0xA9, 0x50, 0x01, 0x88, 0x8D, 0x29, +0xA0, 0x03, 0xC2, 0x0D, 0xA9, 0x50, 0x80, 0x80, +0xA0, 0x03, 0x6E, 0x0A, 0xFF, 0xFF, 0xA1, 0x39, +0x0A, 0x0D, 0x6E, 0x0A, 0x0F, 0x88, 0x8D, 0x29, +0x00, 0x0E, 0xF2, 0x0A, 0xA0, 0x1A, 0xFF, 0xFF, +0x0A, 0x0D, 0xF5, 0x0A, 0x0F, 0x98, 0xE0, 0x25, +0xD3, 0x48, 0xF0, 0xA0, 0xFF, 0xFF, 0xA0, 0x03, +0x05, 0x0B, 0xAD, 0xC0, 0x0A, 0x0D, 0x05, 0x0B, +0x90, 0x03, 0xF1, 0x0A, 0xA0, 0x03, 0x03, 0x0B, +0xA9, 0xC0, 0x0A, 0x0D, 0x03, 0x0B, 0xC0, 0x1A, +0x4D, 0x0B, 0xA0, 0x03, 0xF1, 0x0A, 0xFF, 0xFF, +0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA0, 0x1E, 0xCA, 0x20, 0x90, 0x1A, 0x58, 0x0D, +0xAD, 0x18, 0xA3, 0x59, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xA0, 0x1E, 0x9A, 0x20, 0xAC, 0x00, +0x9A, 0x08, 0xC1, 0x21, 0x91, 0x21, 0xAC, 0x00, +0x9A, 0x08, 0xC1, 0x21, 0x91, 0x21, 0x70, 0x1A, +0x85, 0x0D, 0x7D, 0x20, 0x87, 0x00, 0xFF, 0xFF, +0x81, 0x21, 0x78, 0x08, 0xAC, 0x00, 0xA0, 0x62, +0xFF, 0x00, 0x20, 0x03, 0x5B, 0x0A, 0x82, 0x48, +0x8B, 0x80, 0x80, 0x1A, 0x94, 0x0D, 0x0D, 0x18, +0xFF, 0xFF, 0x80, 0x20, 0x80, 0x0B, 0xAE, 0xC9, +0x2F, 0x80, 0x72, 0x08, 0xAE, 0xC1, 0xA8, 0xC1, +0xA9, 0xC1, 0x9A, 0x08, 0x70, 0x1A, 0xA3, 0x0D, +0x7D, 0x20, 0x70, 0x0B, 0xA0, 0x03, 0xF1, 0x0A, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0xF1, 0x0A, +0x0F, 0x88, 0x21, 0x29, 0x00, 0x0E, 0x4B, 0x0B, +0xD0, 0x03, 0x0A, 0x00, 0xB0, 0x1A, 0x77, 0x00, +0xC0, 0x1A, 0x0E, 0x0B, 0x50, 0x19, 0x9C, 0x18, +0x92, 0x21, 0x89, 0x00, 0x88, 0x51, 0x70, 0x81, +0x8D, 0x51, 0x51, 0x81, 0xA0, 0x03, 0x4B, 0x0B, +0xFF, 0xFF, 0xA1, 0x21, 0x0A, 0x0D, 0x4B, 0x0B, +0x8F, 0x51, 0x50, 0x80, 0xA0, 0x03, 0x4A, 0x0B, +0xA8, 0xC1, 0x0A, 0x0D, 0x4A, 0x0B, 0x8A, 0x51, +0xF0, 0x80, 0xA0, 0x03, 0x4A, 0x0B, 0xA2, 0xC1, +0x0A, 0x0D, 0x4A, 0x0B, 0x9F, 0x80, 0x8B, 0x51, +0x10, 0x80, 0x51, 0x19, 0x9B, 0x18, 0x92, 0x21, +0x89, 0x00, 0x88, 0x51, 0x10, 0x80, 0x51, 0x19, +0xB3, 0x21, 0xC3, 0x21, 0xD1, 0x39, 0x71, 0x85, +0xB0, 0x03, 0x59, 0x0A, 0xA0, 0x03, 0x4B, 0x0B, +0xBA, 0x48, 0xF0, 0x80, 0xBA, 0x48, 0x7C, 0x80, +0xA0, 0x03, 0x4A, 0x0B, 0xA3, 0xC1, 0xA0, 0xC1, +0x0A, 0x0D, 0x4A, 0x0B, 0x6F, 0x80, 0xA0, 0x03, +0x4A, 0x0B, 0xAB, 0xC1, 0xA1, 0xC1, 0x0A, 0x0D, +0x4A, 0x0B, 0xA0, 0x03, 0x4A, 0x0B, 0xAB, 0xC9, +0xB0, 0x03, 0x4B, 0x0B, 0xB0, 0x49, 0x10, 0x80, +0xAB, 0xC1, 0x50, 0x49, 0x20, 0x80, 0xA3, 0xC1, +0xA0, 0xC1, 0x0A, 0x0D, 0x4A, 0x0B, 0xA2, 0x51, +0x91, 0x80, 0xA0, 0x03, 0x5D, 0x0A, 0xA0, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0xA1, 0x39, 0x0A, 0x0D, +0x5D, 0x0A, 0xFF, 0xA0, 0x03, 0x0E, 0x5D, 0x0A, +0xFF, 0xA0, 0x70, 0x03, 0x46, 0x00, 0x70, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0x70, 0x03, 0x0C, 0x00, +0x76, 0x51, 0xF0, 0xA0, 0xFF, 0xFF, 0x70, 0x03, +0x31, 0x02, 0x71, 0x49, 0xF0, 0xA0, 0xFF, 0xFF, +0x50, 0x18, 0x14, 0x00, 0x01, 0x19, 0x0F, 0x98, +0xBD, 0x15, 0x5F, 0x51, 0x20, 0x19, 0x10, 0x80, +0x21, 0x39, 0x05, 0x0D, 0x00, 0xF9, 0x02, 0x0D, +0x01, 0xF9, 0x00, 0x0D, 0x02, 0xF9, 0x01, 0x0D, +0x03, 0xF9, 0x00, 0x03, 0x00, 0xF9, 0x10, 0x03, +0x01, 0xF9, 0x22, 0x19, 0x0F, 0x88, 0x17, 0x16, +0x00, 0x0E, 0x10, 0xF9, 0x00, 0x0E, 0x11, 0xF9, +0x00, 0x0E, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0xA0, 0x03, 0x55, 0x00, 0xB0, 0x03, 0x56, 0x00, +0x00, 0x1A, 0x32, 0x02, 0x10, 0x03, 0x0C, 0x00, +0x12, 0x51, 0x20, 0x80, 0x00, 0x1A, 0x72, 0x03, +0x00, 0x0D, 0x30, 0x02, 0xD0, 0x03, 0x30, 0x02, +0xC0, 0x03, 0xB5, 0x0D, 0xFF, 0xFF, 0xCB, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, +0x00, 0x03, 0xB3, 0x0D, 0xFF, 0xFF, 0xC0, 0x20, +0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xDA, 0x00, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0xD1, 0x21, +0x3D, 0x00, 0xFF, 0xFF, 0xDB, 0x20, 0x1D, 0x00, +0xFF, 0xFF, 0xD1, 0x39, 0x0D, 0x00, 0xFF, 0xFF, +0x30, 0x20, 0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xDB, 0x00, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x23, 0x20, +0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xDC, 0x00, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x02, 0x20, 0x40, 0x1A, 0xF2, 0x05, 0x4C, 0x20, +0x0F, 0x98, 0xF8, 0x29, 0x40, 0x08, 0xD0, 0x03, +0x30, 0x02, 0xC0, 0x03, 0xB5, 0x0D, 0xFF, 0xFF, +0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x1E, 0x00, 0x03, 0xB4, 0x0D, 0xFF, 0xFF, +0xC0, 0x20, 0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xDA, 0x00, 0xFF, 0xFF, +0x04, 0x79, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0xD1, 0x39, 0x3D, 0x00, +0xFF, 0xFF, 0xDB, 0x20, 0x1D, 0x00, 0xFF, 0xFF, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xDB, 0x00, 0xFF, 0xFF, 0x04, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xDC, 0x00, 0xFF, 0xFF, 0x04, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0xF2, 0x05, 0x4C, 0x20, 0x0F, 0x98, +0xF8, 0x29, 0x40, 0x08, 0xD0, 0x03, 0x30, 0x02, +0xC0, 0x03, 0xB6, 0x0D, 0xFF, 0xFF, 0xCB, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, +0x00, 0x03, 0xB3, 0x0D, 0xFF, 0xFF, 0xC0, 0x20, +0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xDA, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xD1, 0x21, 0x3D, 0x00, 0xFF, 0xFF, +0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, 0xD1, 0x39, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0x20, 0x03, +0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xDB, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x23, 0x20, +0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xDC, 0x00, +0xFF, 0xFF, 0x08, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, +0xF2, 0x05, 0x4C, 0x20, 0x0F, 0x98, 0xF8, 0x29, +0x40, 0x08, 0xD0, 0x03, 0x30, 0x02, 0xC0, 0x03, +0xB6, 0x0D, 0xFF, 0xFF, 0xCB, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, 0x00, 0x03, +0xB4, 0x0D, 0xFF, 0xFF, 0xC0, 0x20, 0xDC, 0x20, +0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xDA, 0x00, 0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0xD1, 0x39, 0x3D, 0x00, 0xFF, 0xFF, 0xDB, 0x38, +0x1D, 0x00, 0xFF, 0xFF, 0xD1, 0x21, 0x0D, 0x00, +0xFF, 0xFF, 0x30, 0x20, 0x20, 0x03, 0x10, 0xF9, +0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xDB, 0x00, +0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x30, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x23, 0x20, 0x01, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xDC, 0x00, 0xFF, 0xFF, +0x0C, 0x79, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, +0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, 0xF2, 0x05, +0x4C, 0x20, 0x0F, 0x98, 0xF8, 0x29, 0x40, 0x08, +0x90, 0x03, 0xB3, 0x0D, 0xFF, 0xFF, 0x91, 0x21, +0xD0, 0x03, 0x30, 0x02, 0xC0, 0x03, 0xB5, 0x0D, +0xFF, 0xFF, 0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xC0, 0x1E, 0xC9, 0x20, 0xDC, 0x20, +0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD1, 0x00, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0xD1, 0x21, 0x3D, 0x00, +0xFF, 0xFF, 0xD2, 0x39, 0x0D, 0x00, 0xFF, 0xFF, +0x30, 0x20, 0xDB, 0x20, 0x1D, 0x00, 0xFF, 0xFF, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD2, 0x00, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x30, 0x03, +0x10, 0xF9, 0x73, 0x18, 0x23, 0x20, 0x01, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xD3, 0x00, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0xF2, 0x05, 0x4C, 0x20, 0x0F, 0x98, +0xF8, 0x29, 0x40, 0x08, 0x00, 0x03, 0xB4, 0x0D, +0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, 0x0C, 0x88, +0x5F, 0x2B, 0x90, 0x03, 0xB3, 0x0D, 0xFF, 0xFF, +0x91, 0x21, 0xD0, 0x03, 0x30, 0x02, 0xC0, 0x03, +0xB6, 0x0D, 0xFF, 0xFF, 0xCB, 0x58, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, 0xC9, 0x20, +0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD1, 0x00, 0xFF, 0xFF, 0x04, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xD1, 0x21, 0x3D, 0x00, 0xFF, 0xFF, +0xD2, 0x39, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, 0xD2, 0x21, +0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, 0xD1, 0x39, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0x20, 0x03, +0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD2, 0x00, 0xFF, 0xFF, 0x04, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0x70, 0x18, 0x20, 0x20, +0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, 0xD3, 0x00, +0xFF, 0xFF, 0x04, 0x79, 0x0F, 0x61, 0x00, 0x0D, +0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, 0x00, 0x03, +0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, 0x40, 0x1A, +0xF2, 0x05, 0x4C, 0x20, 0x0F, 0x98, 0xF8, 0x29, +0x40, 0x08, 0x00, 0x03, 0xB4, 0x0D, 0xFF, 0xFF, +0x91, 0x21, 0x90, 0x48, 0x0C, 0x88, 0xB4, 0x2B, +0x90, 0x03, 0xB5, 0x0D, 0xFF, 0xFF, 0x91, 0x21, +0xD0, 0x03, 0x30, 0x02, 0xC9, 0x18, 0xCB, 0x58, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x1E, +0x00, 0x03, 0xB3, 0x0D, 0xFF, 0xFF, 0xC0, 0x20, +0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD1, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xD1, 0x21, 0x3D, 0x00, 0xFF, 0xFF, +0xDB, 0x38, 0x1D, 0x00, 0xFF, 0xFF, 0xD1, 0x39, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0xDB, 0x20, +0xDB, 0x20, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD2, 0x00, 0xFF, 0xFF, 0x08, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, 0x73, 0x18, +0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD3, 0x00, 0xFF, 0xFF, 0x08, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0xF2, 0x05, 0x4C, 0x20, 0x0F, 0x98, +0xF8, 0x29, 0x40, 0x08, 0x00, 0x03, 0xB6, 0x0D, +0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, 0x0C, 0x88, +0x0F, 0x2C, 0x90, 0x03, 0xB5, 0x0D, 0xFF, 0xFF, +0x91, 0x21, 0xD0, 0x03, 0x30, 0x02, 0xC9, 0x18, +0xCB, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC0, 0x1E, 0x00, 0x03, 0xB4, 0x0D, 0xFF, 0xFF, +0xC0, 0x20, 0xDC, 0x20, 0x0D, 0x00, 0x00, 0x0D, +0x10, 0xF9, 0x00, 0x03, 0xD1, 0x00, 0xFF, 0xFF, +0x0C, 0x79, 0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, +0x00, 0x0E, 0x13, 0xF9, 0xDB, 0x38, 0x3D, 0x00, +0xFF, 0xFF, 0xD1, 0x39, 0x1D, 0x00, 0xFF, 0xFF, +0xDB, 0x20, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0xDB, 0x20, 0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, +0xD1, 0x21, 0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, +0x20, 0x03, 0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, +0x00, 0x03, 0xD2, 0x00, 0xFF, 0xFF, 0x0C, 0x79, +0x0F, 0x61, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, 0x73, 0x18, +0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xD3, 0x00, 0xFF, 0xFF, 0x0C, 0x79, 0x0F, 0x61, +0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0x02, 0x20, +0x40, 0x1A, 0xF2, 0x05, 0x4C, 0x20, 0x0F, 0x98, +0xF8, 0x29, 0x40, 0x08, 0x00, 0x03, 0xB6, 0x0D, +0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, 0x0C, 0x88, +0x6C, 0x2C, 0x70, 0x03, 0x31, 0x02, 0x71, 0x49, +0xF0, 0xA0, 0xFF, 0xFF, 0x80, 0x03, 0xB5, 0x0D, +0xFF, 0xFF, 0x81, 0x21, 0x90, 0x03, 0xB3, 0x0D, +0xFF, 0xFF, 0x91, 0x21, 0x08, 0x0D, 0x10, 0xF9, +0x0B, 0x0D, 0x12, 0xF9, 0x00, 0x0E, 0x13, 0xF9, +0xC0, 0x03, 0x10, 0xF9, 0xFF, 0xFF, 0xC9, 0x20, +0xD0, 0x03, 0x30, 0x02, 0xFF, 0xFF, 0xDC, 0x20, +0x0D, 0x00, 0x00, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xCA, 0x00, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0xDB, 0x38, 0x3D, 0x00, 0xFF, 0xFF, +0xD1, 0x39, 0x1D, 0x00, 0xFF, 0xFF, 0xDB, 0x20, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0xDB, 0x20, +0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, 0xD1, 0x21, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0xD1, 0x21, +0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, 0xDB, 0x38, +0x0D, 0x00, 0xFF, 0xFF, 0x30, 0x20, 0xDB, 0x38, +0x0D, 0x00, 0xFF, 0xFF, 0x10, 0x20, 0x20, 0x03, +0x10, 0xF9, 0x03, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xCB, 0x00, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x30, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x23, 0x20, 0x01, 0x0D, 0x10, 0xF9, 0x00, 0x03, +0xCC, 0x00, 0x00, 0x0D, 0x12, 0xF9, 0x00, 0x0E, +0x13, 0xF9, 0x00, 0x03, 0x10, 0xF9, 0xFF, 0xFF, +0x02, 0x20, 0x40, 0x1A, 0xF2, 0x05, 0x4C, 0x20, +0x0F, 0x98, 0xF8, 0x29, 0x40, 0x08, 0x00, 0x03, +0xB4, 0x0D, 0xFF, 0xFF, 0x91, 0x21, 0x90, 0x48, +0x0C, 0x88, 0xD1, 0x2C, 0x00, 0x03, 0xB6, 0x0D, +0x90, 0x03, 0xB3, 0x0D, 0xFF, 0xFF, 0x91, 0x21, +0x81, 0x21, 0x80, 0x48, 0x0C, 0x88, 0xD1, 0x2C, +0xFF, 0xA0, 0xB0, 0x1A, 0xF8, 0x0A, 0xA0, 0x1A, +0x7C, 0x0A, 0x93, 0x19, 0x0A, 0x00, 0xFF, 0xFF, +0xA1, 0x21, 0x1A, 0x00, 0xFF, 0xFF, 0xA1, 0x21, +0x0F, 0x98, 0x7C, 0x15, 0x2A, 0x00, 0xFF, 0xFF, +0xA1, 0x21, 0x0F, 0x98, 0x97, 0x15, 0xB0, 0x08, +0xB1, 0x21, 0xB1, 0x08, 0xB1, 0x21, 0x91, 0x39, +0xD1, 0x86, 0xFF, 0xA0, 0x00, 0x0E, 0x9E, 0x0A, +0x0F, 0x98, 0x38, 0x2D, 0xB0, 0x1A, 0xF8, 0x0A, +0x4B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x5B, 0x00, +0xFF, 0xFF, 0xB1, 0x21, 0x6B, 0x00, 0xFF, 0xFF, +0xB1, 0x21, 0x7B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, +0x8B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x9B, 0x00, +0x06, 0x18, 0x17, 0x18, 0x26, 0x18, 0x37, 0x18, +0x0F, 0x98, 0xAE, 0x15, 0x24, 0x18, 0x35, 0x18, +0x0F, 0x98, 0xEF, 0x15, 0x28, 0x18, 0x39, 0x18, +0x0F, 0x98, 0xEF, 0x15, 0x00, 0x0D, 0xFE, 0x0A, +0x01, 0x0D, 0xFF, 0x0A, 0x08, 0x18, 0x19, 0x18, +0x24, 0x18, 0x35, 0x18, 0x0F, 0x98, 0xEF, 0x15, +0x20, 0x03, 0xC5, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0xD8, 0x15, 0x20, 0x03, 0xFE, 0x0A, 0x30, 0x03, +0xFF, 0x0A, 0xFF, 0xFF, 0x0F, 0x98, 0x17, 0x16, +0x00, 0x4A, 0x40, 0x00, 0x2C, 0x80, 0x00, 0x1A, +0x40, 0x00, 0x00, 0x4A, 0xC0, 0xFF, 0x2A, 0x80, +0x00, 0x1A, 0xC0, 0xFF, 0x00, 0x0D, 0xB7, 0x0A, +0x0F, 0x98, 0x36, 0x2E, 0x0F, 0x98, 0x38, 0x2D, +0xB0, 0x1A, 0xF8, 0x0A, 0x4B, 0x00, 0xFF, 0xFF, +0xB1, 0x21, 0x5B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, +0x6B, 0x00, 0xFF, 0xFF, 0xB1, 0x21, 0x7B, 0x00, +0xFF, 0xFF, 0xB1, 0x21, 0x8B, 0x00, 0xFF, 0xFF, +0xB1, 0x21, 0x9B, 0x00, 0x06, 0x18, 0x17, 0x18, +0x26, 0x18, 0x37, 0x18, 0x0F, 0x98, 0xAE, 0x15, +0x24, 0x18, 0x35, 0x18, 0x0F, 0x98, 0xEF, 0x15, +0x28, 0x18, 0x39, 0x18, 0x0F, 0x98, 0xEF, 0x15, +0x00, 0x0D, 0x00, 0x0B, 0x01, 0x0D, 0x01, 0x0B, +0x08, 0x18, 0x19, 0x18, 0x24, 0x18, 0x35, 0x18, +0x0F, 0x98, 0xEF, 0x15, 0x20, 0x03, 0xC5, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0xD8, 0x15, 0x20, 0x03, +0x00, 0x0B, 0x30, 0x03, 0x01, 0x0B, 0xFF, 0xFF, +0x0F, 0x98, 0x17, 0x16, 0x00, 0x4A, 0x40, 0x00, +0x2C, 0x80, 0x00, 0x1A, 0x40, 0x00, 0x00, 0x4A, +0xC0, 0xFF, 0x2A, 0x80, 0x00, 0x1A, 0xC0, 0xFF, +0x00, 0x0D, 0xB8, 0x0A, 0xA0, 0x03, 0xC9, 0x0A, +0xA0, 0x49, 0x00, 0x82, 0xA0, 0x03, 0x9F, 0x0A, +0xA1, 0x49, 0xC0, 0x81, 0xA0, 0x03, 0xB1, 0x0A, +0xA1, 0x49, 0x20, 0x80, 0xB0, 0x03, 0xC6, 0x00, +0xFF, 0xFF, 0x21, 0x80, 0xB0, 0x03, 0xC7, 0x00, +0x00, 0x03, 0xFE, 0x0A, 0x10, 0x03, 0xFF, 0x0A, +0x20, 0x03, 0x00, 0x0B, 0x30, 0x03, 0x01, 0x0B, +0x90, 0x19, 0x10, 0x49, 0x1C, 0x81, 0x0B, 0x48, +0xFC, 0x80, 0x90, 0x19, 0x30, 0x49, 0xCC, 0x80, +0x2B, 0x48, 0xAC, 0x80, 0x00, 0x0E, 0x9F, 0x0A, +0xA0, 0x1A, 0x7C, 0x0A, 0xA4, 0x21, 0xBA, 0x00, +0x0B, 0x0D, 0xB9, 0x0A, 0x91, 0x19, 0xFF, 0xA0, +0x0F, 0x98, 0x36, 0x2E, 0x01, 0x0E, 0x9F, 0x0A, +0x00, 0x03, 0xC9, 0x0A, 0x00, 0x49, 0x00, 0x88, +0x51, 0x2D, 0x01, 0x0E, 0x9E, 0x0A, 0x04, 0x49, +0x0D, 0x98, 0xE1, 0x2E, 0xFF, 0xFF, 0x00, 0x03, +0xC9, 0x0A, 0x04, 0x49, 0x0A, 0x98, 0x5C, 0x2F, +0xFF, 0xFF, 0x0F, 0x88, 0x51, 0x2D, 0x90, 0x1A, +0x8E, 0x0A, 0x29, 0x19, 0x0A, 0x00, 0x10, 0x18, +0x00, 0x62, 0xFF, 0x00, 0x90, 0x08, 0x91, 0x21, +0x21, 0x39, 0xF0, 0xA0, 0xFF, 0xFF, 0x18, 0x79, +0x91, 0x08, 0x91, 0x21, 0x21, 0x39, 0xF0, 0xA0, +0xFF, 0xFF, 0xA1, 0x21, 0xFF, 0x86, 0x00, 0x03, +0x7D, 0x0A, 0x10, 0x03, 0x7F, 0x0A, 0x00, 0x0D, +0x7F, 0x0A, 0x01, 0x0D, 0x7D, 0x0A, 0x00, 0x03, +0x7E, 0x0A, 0x10, 0x03, 0x82, 0x0A, 0x00, 0x0D, +0x82, 0x0A, 0x01, 0x0D, 0x7E, 0x0A, 0x00, 0x03, +0x81, 0x0A, 0x10, 0x03, 0x83, 0x0A, 0x00, 0x0D, +0x83, 0x0A, 0x01, 0x0D, 0x81, 0x0A, 0xFF, 0xA0, +0xA0, 0x03, 0xC9, 0x0A, 0xA1, 0x49, 0x10, 0x81, +0xA2, 0x49, 0xB0, 0x81, 0xA3, 0x49, 0x50, 0x82, +0xA4, 0x49, 0xF0, 0x82, 0xA5, 0x49, 0x90, 0x83, +0xA6, 0x49, 0x00, 0x88, 0xA7, 0x2E, 0xA7, 0x49, +0x00, 0x88, 0xBA, 0x2E, 0xA8, 0x49, 0x00, 0x88, +0xCD, 0x2E, 0xA0, 0x1A, 0x41, 0x01, 0x0F, 0x98, +0x22, 0x2E, 0x20, 0x03, 0xD4, 0x00, 0x02, 0x0D, +0x97, 0x0A, 0x0F, 0x98, 0xE1, 0x2E, 0x0F, 0x88, +0xDF, 0x2E, 0xA0, 0x1A, 0x46, 0x01, 0x0F, 0x98, +0x22, 0x2E, 0x20, 0x03, 0xD5, 0x00, 0x02, 0x0D, +0x97, 0x0A, 0x0F, 0x98, 0xE1, 0x2E, 0x0F, 0x88, +0xDF, 0x2E, 0xA0, 0x1A, 0x4B, 0x01, 0x0F, 0x98, +0x22, 0x2E, 0x20, 0x03, 0xD6, 0x00, 0x02, 0x0D, +0x97, 0x0A, 0x0F, 0x98, 0xE1, 0x2E, 0x0F, 0x88, +0xDF, 0x2E, 0xA0, 0x1A, 0x50, 0x01, 0x0F, 0x98, +0x22, 0x2E, 0x20, 0x03, 0xD7, 0x00, 0x02, 0x0D, +0x97, 0x0A, 0x0F, 0x98, 0xE1, 0x2E, 0x0F, 0x88, +0xDF, 0x2E, 0xA0, 0x1A, 0x55, 0x01, 0x0F, 0x98, +0x22, 0x2E, 0x20, 0x03, 0xDD, 0x00, 0x02, 0x0D, +0x97, 0x0A, 0x20, 0x03, 0xD4, 0x00, 0x02, 0x0D, +0x98, 0x0A, 0x20, 0x03, 0xD6, 0x00, 0x02, 0x0D, +0x99, 0x0A, 0x0F, 0x98, 0x5C, 0x2F, 0x8F, 0x83, +0xA0, 0x1A, 0x5A, 0x01, 0x0F, 0x98, 0x22, 0x2E, +0x20, 0x03, 0xDE, 0x00, 0x02, 0x0D, 0x97, 0x0A, +0x20, 0x03, 0xD4, 0x00, 0x02, 0x0D, 0x98, 0x0A, +0x20, 0x03, 0xD7, 0x00, 0x02, 0x0D, 0x99, 0x0A, +0x0F, 0x98, 0x5C, 0x2F, 0x5F, 0x82, 0xA0, 0x1A, +0x5F, 0x01, 0x0F, 0x98, 0x22, 0x2E, 0x20, 0x03, +0xDF, 0x00, 0x02, 0x0D, 0x97, 0x0A, 0x20, 0x03, +0xD5, 0x00, 0x02, 0x0D, 0x98, 0x0A, 0x20, 0x03, +0xD6, 0x00, 0x02, 0x0D, 0x99, 0x0A, 0x0F, 0x98, +0x5C, 0x2F, 0x2F, 0x81, 0xA0, 0x1A, 0x64, 0x01, +0x0F, 0x98, 0x22, 0x2E, 0x20, 0x03, 0xE0, 0x00, +0x02, 0x0D, 0x97, 0x0A, 0x20, 0x03, 0xD5, 0x00, +0x02, 0x0D, 0x98, 0x0A, 0x20, 0x03, 0xD7, 0x00, +0x02, 0x0D, 0x99, 0x0A, 0x0F, 0x98, 0x5C, 0x2F, +0x0F, 0x88, 0x51, 0x2D, 0x90, 0x1A, 0x8E, 0x0A, +0xA0, 0x1A, 0x7C, 0x0A, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x5B, 0x00, 0xFF, 0xFF, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0x6B, 0x00, +0xFF, 0xFF, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x7B, 0x00, 0x85, 0x18, 0x86, 0x20, +0x87, 0x20, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x2B, 0x00, 0xFF, 0xFF, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0x3B, 0x00, +0xFF, 0xFF, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x4B, 0x00, 0xFF, 0xFF, 0x42, 0x20, +0x43, 0x20, 0x04, 0x18, 0x10, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, 0x28, 0x18, +0x0F, 0x98, 0x17, 0x16, 0x80, 0x03, 0x97, 0x0A, +0xFF, 0xFF, 0x80, 0x38, 0x15, 0x18, 0x00, 0x03, +0x9E, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0xBD, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x17, 0x16, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0x16, 0x18, 0x00, 0x03, 0x9E, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x17, 0x16, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0x17, 0x18, 0x00, 0x03, +0x9E, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0xBD, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x17, 0x16, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0xFF, 0xA0, 0x90, 0x1A, 0x8E, 0x0A, 0xA0, 0x1A, +0x7C, 0x0A, 0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, +0x5B, 0x00, 0xFF, 0xFF, 0x91, 0x21, 0xB9, 0x00, +0xFF, 0xFF, 0xBA, 0x20, 0x6B, 0x00, 0x85, 0x18, +0x86, 0x20, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0x7B, 0x00, 0xFF, 0xFF, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0x4B, 0x00, +0x04, 0x18, 0x07, 0x20, 0x10, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, 0x28, 0x18, +0x0F, 0x98, 0x17, 0x16, 0x80, 0x03, 0x98, 0x0A, +0xFF, 0xFF, 0x80, 0x38, 0x15, 0x18, 0x00, 0x03, +0x9E, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0xBD, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x17, 0x16, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0x16, 0x18, 0x00, 0x03, 0x9E, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x17, 0x16, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0x85, 0x18, 0x87, 0x20, +0x06, 0x18, 0x04, 0x20, 0x10, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, 0x28, 0x18, +0x0F, 0x98, 0x17, 0x16, 0x80, 0x03, 0x99, 0x0A, +0xFF, 0xFF, 0x80, 0x38, 0x15, 0x18, 0x00, 0x03, +0x9E, 0x0A, 0x00, 0x49, 0x11, 0x80, 0x08, 0x18, +0x20, 0x80, 0x00, 0x03, 0xD0, 0x00, 0xFF, 0xFF, +0x0F, 0x98, 0xBD, 0x15, 0x20, 0x03, 0xD0, 0x00, +0xFF, 0xFF, 0x0F, 0x98, 0x17, 0x16, 0x91, 0x21, +0xB9, 0x00, 0xFF, 0xFF, 0xBA, 0x20, 0xB0, 0x08, +0x17, 0x18, 0x00, 0x03, 0x9E, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x17, 0x16, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0x85, 0x18, 0x04, 0x18, +0x10, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0xBD, 0x15, 0x28, 0x18, 0x0F, 0x98, 0x17, 0x16, +0x80, 0x03, 0x97, 0x0A, 0xFF, 0xFF, 0x80, 0x38, +0x15, 0x18, 0x00, 0x03, 0x9E, 0x0A, 0x00, 0x49, +0x11, 0x80, 0x08, 0x18, 0x20, 0x80, 0x00, 0x03, +0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, 0xBD, 0x15, +0x20, 0x03, 0xD0, 0x00, 0xFF, 0xFF, 0x0F, 0x98, +0x17, 0x16, 0x91, 0x21, 0xB9, 0x00, 0xFF, 0xFF, +0xBA, 0x20, 0xB0, 0x08, 0xFF, 0xA0, 0x00, 0x03, +0x0D, 0x01, 0x80, 0x03, 0x0E, 0x01, 0x18, 0x18, +0x18, 0x79, 0x91, 0x18, 0x80, 0x62, 0xFF, 0x00, +0x0F, 0x98, 0xBD, 0x15, 0x20, 0x18, 0x31, 0x18, +0x0A, 0x00, 0x18, 0x18, 0x0F, 0x98, 0xBD, 0x15, +0x0F, 0x98, 0x97, 0x15, 0x89, 0x20, 0x28, 0x18, +0x0F, 0x98, 0x17, 0x16, 0x00, 0x0D, 0x11, 0x00, +0xFF, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x86, 0x00, 0xFF, 0xFF, 0x00, 0x00, +0xAA, 0xAA, 0x55, 0x55, 0x00, 0x00, 0x40, 0x40, +0x86, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x05, 0x00, +0x10, 0x00, 0x2C, 0x7A, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0x01, 0x90, 0x01, +0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x03, 0x00, +0x01, 0x00, 0x0F, 0x00, 0x1E, 0x00, 0x28, 0x00, +0x1E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1E, 0x00, +0x32, 0x00, 0x28, 0x00, 0x14, 0x00, 0x10, 0x00, +0x10, 0x00, 0x10, 0x04, 0x02, 0x00, 0x64, 0x00, +0x05, 0x1E, 0x20, 0x14, 0x00, 0x00, 0x00, 0x00, +0x19, 0x00, 0x04, 0x00, 0x10, 0x00, 0x1E, 0x00, +0x01, 0x01, 0x02, 0x01, 0x64, 0x00, 0x0A, 0x00, +0x00, 0x00, 0x03, 0x01, 0x04, 0x01, 0x00, 0x01, +0x03, 0x02, 0x05, 0x00, 0xC8, 0x00, 0x14, 0x00, +0x0A, 0x00, 0xEC, 0xFF, 0x0A, 0x00, 0xC8, 0x00, +0x2C, 0x01, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, +0x0F, 0x00, 0xE8, 0x03, 0x2D, 0x00, 0xC8, 0x00, +0x03, 0x01, 0x50, 0x00, 0x0A, 0x00, 0x0A, 0x00, +0x00, 0x00, 0x50, 0x00, 0x0A, 0x00, 0x64, 0x00, +0xC8, 0x00, 0xCC, 0x01, 0x12, 0x00, 0x0A, 0x00, +0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, +0x11, 0x12, 0x09, 0x00, 0x01, 0x02, 0x03, 0x04, +0x05, 0x06, 0x07, 0x08, 0x14, 0x15, 0x16, 0x17, +0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, +0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, +0xA4, 0x06, 0x01, 0x00, 0x96, 0x00, 0x64, 0x00, +0x20, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 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, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x19, 0x00, 0x96, 0x00, 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, 0x00, 0x03, 0x00, +0x26, 0x02, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, +0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xDF, 0x01, 0x1F, 0x03, +0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0xE8, 0x03, +0xFA, 0x00, 0x40, 0x00, 0x00, 0x00, 0x2C, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x64, 0x00, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, +0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, +0x0A, 0x00, 0x64, 0x00, 0x77, 0x77, 0x44, 0x44, +0x33, 0x33, 0xA3, 0x00, 0xA2, 0x00, 0xA0, 0x00, +0xA4, 0x00, 0x1E, 0x00, 0x20, 0x00, 0x88, 0x88, +0x33, 0x33, 0x33, 0x43, 0x8C, 0x00, 0x8C, 0x00, +0x8C, 0x00, 0x8C, 0x00, 0x3C, 0x00, 0x04, 0x00, +0x2C, 0x01, 0x06, 0x00, 0x0F, 0x88, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, +0x06, 0x07, 0x09, 0x0A, 0x08, 0x0B, 0x0C, 0x0D, +0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, +0x16, 0x17, 0x18, 0x19, 0x0B, 0x00, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, +0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x64, 0x00, 0x12, 0x00, 0xC8, 0x00, 0x04, 0x00, +0x90, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x25, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x49, 0x5A, 0x77, 0x33, 0xFF, 0xFF, +0xFF, 0xFF, 0x05, 0x33, 0x11, 0x00, 0x33, 0x01, +0x01, 0x00, 0xFF, 0x00, 0x11, 0x00, 0x00, 0x20, +0x70, 0x70, 0x7F, 0x00, 0x7F, 0x00, 0x08, 0x08, +0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, +0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, +0x07, 0x08, 0x00, 0x01, 0x02, 0x00, 0x03, 0x04, +0x05, 0x00, 0x01, 0x02, 0x06, 0x07, 0x08, 0x00, +0x01, 0x04, 0x07, 0x02, 0x05, 0x08, 0x00, 0x03, +0x06, 0x00, 0x01, 0x04, 0x07, 0x00, 0x03, 0x06, +0x02, 0x05, 0x08, 0x00, 0x04, 0x05, 0x07, 0x08, +0x01, 0x02, 0x03, 0x06, 0x00, 0x00, 0x04, 0x03, +0x07, 0x06, 0x01, 0x00, 0x05, 0x08, 0x02, 0x00, +0x04, 0x05, 0x01, 0x02, 0x07, 0x08, 0x03, 0x00, +0x06, 0x00, 0x04, 0x03, 0x01, 0x00, 0x07, 0x06, +0x05, 0x02, 0x08, 0x00, 0x13, 0x00, 0x13, 0x00, +0xF0, 0x00, 0x13, 0x00, 0xCD, 0x01, 0x13, 0x00, +0xA8, 0x01, 0x43, 0x00, 0xCD, 0x01, 0x72, 0x00, +0xA8, 0x01, 0xA2, 0x00, 0x81, 0x00, 0xD1, 0x00, +0x5F, 0x01, 0xD1, 0x00, 0xCD, 0x01, 0xD1, 0x00, +0xA8, 0x01, 0x01, 0x01, 0xCD, 0x01, 0x31, 0x01, +0xA8, 0x01, 0x60, 0x01, 0x13, 0x00, 0x8E, 0x01, +0xF0, 0x00, 0x8E, 0x01, 0xCD, 0x01, 0x8E, 0x01, +0x38, 0x00, 0xC0, 0x01, 0x13, 0x00, 0xEF, 0x01, +0x38, 0x00, 0x1F, 0x02, 0x13, 0x00, 0x4F, 0x02, +0x81, 0x00, 0x4F, 0x02, 0x5F, 0x01, 0x4F, 0x02, +0x38, 0x00, 0x7E, 0x02, 0x13, 0x00, 0xAE, 0x02, +0x4A, 0x00, 0xE7, 0x02, 0xB9, 0x00, 0xE7, 0x02, +0x27, 0x01, 0xE7, 0x02, 0x96, 0x01, 0xE7, 0x02, +0x13, 0x00, 0x0D, 0x03, 0x81, 0x00, 0x0D, 0x03, +0xF0, 0x00, 0x0D, 0x03, 0x5F, 0x01, 0x0D, 0x03, +0xCD, 0x01, 0x0D, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, +}; +#endif diff --git a/drivers/input/touchscreen/zinitix_touch_zxt_firmware.h b/drivers/input/touchscreen/zinitix_touch_zxt_firmware.h new file mode 100755 index 00000000..97fc8d56 --- /dev/null +++ b/drivers/input/touchscreen/zinitix_touch_zxt_firmware.h @@ -0,0 +1,8223 @@ +/* +* +* Zinitix touch driver +* +* Copyright (C) 2009 Zinitix, Inc. +* +* This software is licensed under the terms of the GNU General Public +* License version 2, as published by the Free Software Foundation, and +* may be copied, distributed, and modified under those terms. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +*/ +/* +Release Date : 15/02/14, 19:42 + +Version Info : + Chip Code : 0xE700 + Firmware Version : 0x0005 + Firmware Minor Version : 0x0001 + Register Version : 2 +*/ +#ifndef _ZINITIX_ZXT_CODE_H +#define _ZINITIX_ZXT_CODE_H + +u8 m_firmware_data[] = { +0x48, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x80, 0x05, 0x05, 0x00, 0x00, 0x00, +0x01, 0x00, 0x80, 0x01, 0x02, 0x00, 0x00, 0x00, +0x00, 0xE7, 0xE7, 0x00, 0x44, 0x00, 0x00, 0x00, +0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x47, 0xD0, 0x00, 0x82, 0x59, 0xDE, 0x84, 0xE8, +0x64, 0x00, 0x80, 0x02, 0x46, 0x10, 0x10, 0x00, +0x40, 0x20, 0x04, 0x02, 0x4E, 0x22, 0x00, 0x00, +0x46, 0x10, 0x00, 0x80, 0x40, 0x20, 0x04, 0x02, +0x4E, 0x22, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, +0x42, 0x0E, 0x00, 0x21, 0x3F, 0xC8, 0x00, 0x00, +0x47, 0xF0, 0x00, 0x8E, 0x59, 0xFF, 0x8F, 0xF0, +0x49, 0x00, 0x41, 0xC8, 0x48, 0x00, 0x10, 0x8D, +0xFC, 0x68, 0x80, 0xE0, 0x3C, 0x03, 0xF6, 0x81, +0x84, 0x20, 0x3C, 0x1B, 0xED, 0x8C, 0x3E, 0x17, +0xDB, 0x1A, 0x3E, 0x10, 0x03, 0x23, 0x3E, 0x17, +0xF3, 0xB6, 0x3E, 0x17, 0xF3, 0xC2, 0x3C, 0x1B, +0xF9, 0xD2, 0x3C, 0x1B, 0xF9, 0xD3, 0x3C, 0x1B, +0xF9, 0xD4, 0x3C, 0x18, 0x05, 0x02, 0x3E, 0x17, +0xF3, 0xD9, 0x3E, 0x17, 0xF3, 0xD8, 0xC8, 0x05, +0x49, 0x00, 0x4F, 0x76, 0x48, 0x00, 0x00, 0xD5, +0x3C, 0x20, 0x0E, 0x94, 0x3C, 0x30, 0x0F, 0x83, +0x3C, 0x50, 0x0E, 0x95, 0x3C, 0x60, 0x0F, 0x83, +0x3C, 0x80, 0x0E, 0x97, 0x3C, 0x90, 0x0F, 0x83, +0x3C, 0xA0, 0x0E, 0x96, 0x3C, 0xB0, 0x0F, 0x83, +0x3D, 0x00, 0x0E, 0x98, 0x3C, 0xC0, 0x0F, 0x83, +0x3D, 0x10, 0x0F, 0x26, 0x3C, 0xD0, 0x0F, 0x83, +0x88, 0x43, 0x2E, 0x17, 0xE1, 0x60, 0x97, 0x11, +0x88, 0xA6, 0x89, 0x09, 0x89, 0x4B, 0x89, 0x8C, +0x89, 0xAD, 0x3C, 0xE0, 0x0E, 0xB6, 0x3C, 0x48, +0x05, 0x12, 0x3C, 0x58, 0x05, 0x13, 0x3C, 0x88, +0x05, 0x14, 0x3C, 0xA8, 0x05, 0x15, 0x3D, 0x08, +0x05, 0x16, 0x3D, 0x18, 0x05, 0x17, 0x3C, 0xE8, +0x05, 0x2F, 0x3C, 0x48, 0x05, 0x2A, 0x3C, 0x48, +0x05, 0x2B, 0x3C, 0x48, 0x05, 0x2C, 0xC1, 0x2B, +0x3C, 0xF0, 0x10, 0xA0, 0x3D, 0x20, 0x10, 0xA1, +0x3D, 0x30, 0x10, 0xAF, 0x3D, 0x40, 0x10, 0x9A, +0x3C, 0x00, 0x0F, 0x83, 0x3D, 0x60, 0x0F, 0xE8, +0x3C, 0x50, 0x0F, 0x83, 0x86, 0xA3, 0x96, 0x83, +0x40, 0x31, 0x54, 0x76, 0x97, 0xAB, 0x40, 0x83, +0x55, 0x16, 0x88, 0x74, 0x97, 0x19, 0x89, 0x16, +0x3C, 0xF8, 0x05, 0x2A, 0x3D, 0x28, 0x05, 0x2B, +0x3D, 0x38, 0x05, 0x2F, 0x3C, 0x48, 0x05, 0x16, +0x3C, 0x48, 0x05, 0x15, 0x3C, 0x48, 0x05, 0x14, +0x3C, 0x48, 0x05, 0x13, 0x3C, 0x48, 0x05, 0x12, +0x3C, 0x88, 0x05, 0x17, 0x3C, 0x10, 0x05, 0x09, +0x3D, 0x70, 0x0F, 0x88, 0x85, 0x80, 0x3D, 0x80, +0x0F, 0xDF, 0x85, 0xA0, 0x3D, 0x90, 0x0F, 0x37, +0x96, 0x6E, 0x3D, 0xE0, 0x0F, 0x86, 0x3C, 0x90, +0x0F, 0x87, 0x3C, 0xA0, 0x0E, 0xA8, 0x3C, 0xB0, +0x10, 0x73, 0x3D, 0x00, 0x10, 0x72, 0x3D, 0x10, +0x0E, 0xB1, 0x3C, 0xE0, 0x0E, 0x89, 0x3D, 0x78, +0x05, 0x1B, 0x3D, 0x88, 0x05, 0x1C, 0x3D, 0x98, +0x05, 0x1F, 0x3D, 0xE8, 0x05, 0x20, 0x3C, 0x98, +0x05, 0x21, 0x3C, 0xA8, 0x05, 0x22, 0x3C, 0xB8, +0x05, 0x25, 0x3D, 0x08, 0x05, 0x26, 0x3E, 0xC0, +0x0A, 0x3B, 0x3D, 0x18, 0x05, 0x29, 0x3C, 0xD8, +0x05, 0x2D, 0x3C, 0xE8, 0x05, 0x2E, 0xC1, 0x40, +0x3C, 0xF0, 0x10, 0xF4, 0x5A, 0xF0, 0x01, 0x06, +0x3D, 0x20, 0x10, 0xF4, 0x5B, 0x28, 0x03, 0x1A, +0x3D, 0x30, 0x10, 0xFD, 0x3D, 0x40, 0x10, 0xFD, +0x3C, 0x00, 0x10, 0xFE, 0x3C, 0x20, 0x11, 0x03, +0x3D, 0x38, 0x05, 0x16, 0x3D, 0x38, 0x05, 0x15, +0x3D, 0x38, 0x05, 0x14, 0x3D, 0x38, 0x05, 0x13, +0x3D, 0x38, 0x05, 0x12, 0x3D, 0x48, 0x05, 0x17, +0x3C, 0x08, 0x05, 0x1B, 0x3C, 0x28, 0x05, 0x1C, +0x3C, 0x30, 0x10, 0xF4, 0xC3, 0x1D, 0x3D, 0x50, +0x11, 0x08, 0x3C, 0x40, 0x11, 0x09, 0x3D, 0x60, +0x11, 0x0C, 0x3C, 0x50, 0x11, 0x0A, 0x3C, 0x60, +0x11, 0x06, 0x3C, 0x80, 0x11, 0x12, 0x3D, 0x70, +0x11, 0x11, 0x3D, 0x58, 0x05, 0x2A, 0x3C, 0x48, +0x05, 0x2B, 0x3D, 0x68, 0x05, 0x2D, 0x3C, 0x58, +0x05, 0x2C, 0x3C, 0x68, 0x05, 0x2E, 0x3C, 0x88, +0x05, 0x25, 0x3D, 0x78, 0x05, 0x26, 0x2E, 0x07, +0xE1, 0x60, 0x2E, 0x27, 0xE1, 0x63, 0xC8, 0x02, +0xC2, 0x10, 0x3C, 0xA0, 0x10, 0x96, 0x3C, 0xB0, +0x10, 0x97, 0x3D, 0x00, 0x10, 0x98, 0x3C, 0xA8, +0x05, 0x06, 0x3C, 0xB8, 0x05, 0x07, 0x3D, 0x08, +0x05, 0x08, 0x3C, 0x90, 0x10, 0x99, 0xD5, 0x0F, +0x3D, 0x80, 0x0E, 0x8B, 0x3D, 0x90, 0x0F, 0x91, +0x3D, 0xE0, 0x0F, 0x92, 0x3D, 0x88, 0x05, 0x06, +0x3D, 0x98, 0x05, 0x07, 0x3D, 0xE8, 0x05, 0x08, +0x3C, 0x90, 0x0F, 0x93, 0x2E, 0x57, 0xE1, 0x64, +0x3C, 0x98, 0x05, 0x09, 0xD0, 0x0F, 0x5A, 0x08, +0x01, 0x0E, 0x3C, 0xC0, 0x10, 0xA7, 0x3C, 0xC8, +0x05, 0x16, 0x3C, 0xC8, 0x05, 0x15, 0x3C, 0xC8, +0x05, 0x14, 0x3C, 0xC8, 0x05, 0x13, 0x3C, 0xC8, +0x05, 0x12, 0xC2, 0x15, 0x3D, 0x10, 0x10, 0xA0, +0x3C, 0xD0, 0x10, 0xA1, 0x3C, 0xE0, 0x10, 0x9E, +0x3D, 0x18, 0x05, 0x2A, 0x3C, 0xD8, 0x05, 0x2B, +0x3C, 0xE8, 0x05, 0x16, 0x3C, 0xE8, 0x05, 0x15, +0x3C, 0xE8, 0x05, 0x14, 0x3C, 0xE8, 0x05, 0x13, +0x3C, 0xE8, 0x05, 0x12, 0x3C, 0x10, 0x10, 0xF4, +0x5A, 0x10, 0x01, 0x06, 0x3C, 0xF0, 0x10, 0xF4, +0x5A, 0xF8, 0x03, 0x0E, 0x3D, 0x20, 0x05, 0x06, +0x3D, 0x40, 0x05, 0x07, 0x67, 0x39, 0x40, 0x00, +0x66, 0x3A, 0x00, 0x04, 0x3D, 0x38, 0x05, 0x06, +0x3C, 0x38, 0x05, 0x07, 0x3D, 0x50, 0x10, 0xF4, +0x5B, 0x58, 0x02, 0x08, 0x3C, 0x40, 0x05, 0x06, +0x67, 0x62, 0x00, 0x44, 0x3D, 0x68, 0x05, 0x06, +0x3C, 0x60, 0x05, 0x09, 0x96, 0x34, 0xC0, 0x2E, +0x2E, 0x87, 0xE1, 0x5D, 0x5A, 0x88, 0x02, 0x2B, +0x3D, 0x70, 0x05, 0x06, 0x87, 0x20, 0xFB, 0x2E, +0x58, 0x2B, 0x80, 0x04, 0x45, 0x80, 0x27, 0x10, +0x87, 0xC5, 0x3C, 0xA0, 0x0E, 0x9E, 0x3C, 0x28, +0x05, 0x06, 0x3D, 0x88, 0x05, 0x23, 0x3D, 0x98, +0x05, 0x20, 0x3D, 0x98, 0x05, 0x21, 0x3D, 0x98, +0x05, 0x24, 0x3C, 0x98, 0x05, 0x1B, 0x3C, 0x98, +0x05, 0x1C, 0x3D, 0xE8, 0x05, 0x1F, 0x3D, 0x98, +0x05, 0x27, 0x3F, 0x97, 0xE1, 0x60, 0x3F, 0x97, +0xE1, 0x64, 0x3D, 0x9B, 0xF0, 0xB5, 0x3D, 0x9B, +0xF0, 0xB6, 0x3F, 0x97, 0xE1, 0x62, 0x3C, 0xAB, +0xF6, 0x75, 0x2E, 0x50, 0x03, 0x22, 0xCD, 0x05, +0x3C, 0xB7, 0xF9, 0xD8, 0x4E, 0xB7, 0x00, 0x04, +0x86, 0x03, 0xD5, 0x04, 0x3D, 0x00, 0x01, 0x95, +0x8F, 0x81, 0x3D, 0x08, 0x01, 0x95, 0x3C, 0xC4, +0x01, 0x95, 0x4E, 0xC6, 0x00, 0x07, 0x85, 0xA0, +0x3C, 0xD8, 0x01, 0x95, 0x86, 0x21, 0xD5, 0x02, +0x86, 0x20, 0x3C, 0xE7, 0xF6, 0x74, 0x3F, 0x10, +0x03, 0x2C, 0x4E, 0xE7, 0x00, 0x14, 0x3C, 0x10, +0x05, 0x08, 0x96, 0x5E, 0xC1, 0x0F, 0x2E, 0xF7, +0xEC, 0xFB, 0x5A, 0xF8, 0x01, 0x0C, 0x3C, 0x30, +0x0E, 0x9C, 0x3D, 0x20, 0x0E, 0x4C, 0x97, 0x1B, +0xE0, 0x92, 0xE8, 0x04, 0x86, 0x60, 0x3D, 0x3B, +0xF6, 0x74, 0x3D, 0x47, 0xF6, 0x74, 0x4F, 0x46, +0x00, 0x05, 0x2E, 0x67, 0xEC, 0xFA, 0xC6, 0x12, +0x84, 0x01, 0x49, 0x00, 0x4E, 0xB1, 0x5A, 0x00, +0x01, 0x04, 0x48, 0x00, 0x0B, 0xCC, 0x84, 0x60, +0x84, 0x00, 0x3E, 0x37, 0xEC, 0xFA, 0x49, 0x00, +0x4B, 0xB8, 0x49, 0x00, 0x4F, 0x4A, 0x48, 0x00, +0x0B, 0xC2, 0x86, 0xA1, 0x3F, 0x50, 0x1C, 0xB8, +0xCF, 0x0D, 0x3C, 0x7B, 0xF6, 0x7C, 0x3C, 0x7B, +0xF6, 0x7B, 0x3C, 0x7B, 0xF6, 0x7A, 0x3C, 0x7B, +0xF6, 0x76, 0x3C, 0x7B, 0xF6, 0x75, 0x48, 0x00, +0x0B, 0xB2, 0x80, 0x06, 0x49, 0x00, 0x4E, 0x90, +0x5A, 0x08, 0x01, 0x04, 0x48, 0x00, 0x0B, 0xAB, +0x49, 0x00, 0x1A, 0xD1, 0x49, 0x00, 0x4D, 0x5E, +0x3C, 0x40, 0x05, 0x06, 0x54, 0x72, 0x04, 0x00, +0xCF, 0x06, 0x84, 0xE0, 0x3E, 0x08, 0x03, 0x4C, +0x82, 0xC7, 0xD5, 0x61, 0x3C, 0x00, 0x0F, 0xC3, +0x96, 0x83, 0xC2, 0xF8, 0x82, 0x46, 0x82, 0x66, +0x3C, 0xD0, 0x0E, 0x61, 0x3E, 0x68, 0x0A, 0x60, +0xE1, 0xED, 0xE8, 0x0C, 0x41, 0x43, 0x4C, 0x20, +0x23, 0x5A, 0x08, 0xCC, 0x4F, 0x56, 0x00, 0x04, +0x4E, 0x24, 0x00, 0x03, 0x89, 0xD5, 0x8D, 0xE1, +0xD5, 0xF4, 0x40, 0x59, 0x34, 0xB6, 0x42, 0x11, +0x00, 0x03, 0xFF, 0x4C, 0x45, 0x60, 0x00, 0x64, +0x86, 0x20, 0x40, 0xC2, 0xD9, 0x96, 0x3E, 0x08, +0x09, 0x0C, 0x81, 0xD1, 0xE1, 0xAD, 0xE8, 0x0E, +0x2A, 0x50, 0x00, 0x01, 0x8A, 0xAC, 0x96, 0xEB, +0x4E, 0x35, 0x00, 0x05, 0x12, 0x30, 0x7F, 0xFF, +0xD5, 0x03, 0x12, 0xE0, 0x7F, 0xFF, 0x8D, 0xA1, +0xD5, 0xF2, 0x85, 0x40, 0x3D, 0x80, 0x0E, 0x60, +0x81, 0x6A, 0x3E, 0x78, 0x0A, 0x60, 0xE1, 0x78, +0xE8, 0x0C, 0x41, 0xE3, 0xAC, 0x20, 0x23, 0x0F, +0x08, 0xAC, 0x4F, 0x06, 0x00, 0x04, 0x4E, 0x24, +0x00, 0x03, 0x89, 0x50, 0x8D, 0x61, 0xD5, 0xF4, +0x40, 0x25, 0x60, 0x56, 0xFE, 0x8C, 0x44, 0x80, +0x00, 0x64, 0x85, 0x20, 0x41, 0x71, 0x22, 0xF6, +0x3E, 0x38, 0x08, 0xCC, 0x83, 0x29, 0xE1, 0x38, +0xE8, 0xA9, 0x2A, 0x11, 0x80, 0x01, 0x8A, 0x37, +0x97, 0x8B, 0x4E, 0x65, 0x00, 0x05, 0x12, 0x61, +0xFF, 0xFF, 0xD5, 0x03, 0x13, 0x91, 0xFF, 0xFF, +0x8D, 0x21, 0xD5, 0xF2, 0x98, 0x78, 0x8C, 0xE2, +0x13, 0x60, 0x83, 0x2C, 0x3E, 0x38, 0x03, 0x4C, +0x5A, 0x78, 0x40, 0xFA, 0x97, 0x36, 0xCC, 0x0D, +0x84, 0x80, 0x3C, 0x7C, 0x02, 0x79, 0x3E, 0x58, +0x0A, 0x60, 0x45, 0xE0, 0x00, 0x64, 0x3F, 0x08, +0x03, 0x4C, 0x83, 0x24, 0x48, 0x00, 0x00, 0x98, +0x3C, 0x40, 0x0E, 0xEE, 0xC4, 0xF2, 0x3C, 0x20, +0x0E, 0xEE, 0x3C, 0x40, 0x0E, 0x5F, 0x97, 0x53, +0x42, 0x62, 0x80, 0x03, 0x44, 0x70, 0x00, 0x64, +0x85, 0x20, 0x96, 0xB3, 0x3D, 0x70, 0x0E, 0x5E, +0xFF, 0xE4, 0x81, 0x09, 0x3F, 0x88, 0x0A, 0x60, +0xE1, 0x17, 0xE8, 0xDF, 0x84, 0x00, 0x81, 0x40, +0xE1, 0x44, 0xE8, 0x35, 0x41, 0xE5, 0x24, 0x00, +0x41, 0x0C, 0x78, 0x20, 0x23, 0x98, 0x05, 0xEC, +0x4F, 0x95, 0x00, 0x15, 0x3D, 0x50, 0x10, 0x54, +0x41, 0x6A, 0x80, 0x11, 0x4F, 0x67, 0x00, 0x0C, +0x3C, 0x10, 0x10, 0x54, 0x38, 0x61, 0xF9, 0x11, +0x97, 0x4B, 0xE0, 0xC5, 0xE9, 0x04, 0x3D, 0x40, +0x10, 0x54, 0xD5, 0x18, 0x39, 0x91, 0xF9, 0x11, +0xD5, 0x17, 0x3C, 0xC0, 0x0E, 0xEE, 0x41, 0x16, +0x00, 0x11, 0x4F, 0x14, 0x00, 0x13, 0x3C, 0xD0, +0x10, 0x55, 0x40, 0xE6, 0x80, 0x11, 0x4E, 0xE4, +0x00, 0x0C, 0x3D, 0x20, 0x10, 0x55, 0x41, 0x39, +0x00, 0x11, 0xE1, 0xF9, 0xE9, 0x05, 0x3D, 0x40, +0x10, 0x55, 0x41, 0x9A, 0x00, 0x11, 0x88, 0x19, +0x8D, 0x41, 0xD5, 0xCB, 0xFE, 0x14, 0x41, 0x91, +0xA0, 0x20, 0x40, 0xB0, 0x1D, 0x76, 0x12, 0xBC, +0x83, 0x2C, 0x8D, 0x01, 0x89, 0x24, 0xD5, 0xBD, +0x41, 0x2C, 0x2C, 0x00, 0x89, 0xC5, 0x40, 0xD1, +0xA4, 0x20, 0x22, 0xC9, 0x05, 0xEC, 0x23, 0x56, +0x83, 0x2C, 0x40, 0x06, 0x54, 0x01, 0x4E, 0x04, +0x00, 0x48, 0xFE, 0x82, 0xE1, 0x42, 0xE8, 0x03, +0x40, 0xA1, 0x00, 0x11, 0x8D, 0x21, 0x89, 0x77, +0xE1, 0x36, 0xE9, 0xEB, 0x3C, 0x20, 0x05, 0x06, +0x96, 0x96, 0x96, 0x11, 0xC0, 0x09, 0x3C, 0x00, +0x0E, 0xC5, 0x96, 0x43, 0x43, 0x25, 0x04, 0x24, +0x40, 0x29, 0x78, 0x57, 0x96, 0x13, 0x3C, 0x10, +0x0E, 0xDA, 0x96, 0x8B, 0x4E, 0x25, 0x00, 0x33, +0x3C, 0xC0, 0x05, 0x07, 0x54, 0x26, 0x08, 0x00, +0x96, 0x51, 0xC1, 0x09, 0x3C, 0x10, 0x0F, 0x66, +0x96, 0x8B, 0x42, 0xD4, 0x08, 0x24, 0x40, 0x16, +0xF8, 0x37, 0x96, 0x4B, 0x81, 0x64, 0x86, 0x20, +0x88, 0x01, 0x3D, 0x50, 0x0E, 0x5E, 0xE1, 0xB5, +0xE9, 0x28, 0x8C, 0x81, 0x3C, 0x20, 0x0E, 0x5F, +0xE0, 0x82, 0xE9, 0x07, 0x3D, 0xE0, 0x0E, 0x61, +0x3E, 0x58, 0x09, 0x0C, 0x86, 0x60, 0xD5, 0x4B, +0x85, 0x60, 0x3D, 0x60, 0x0E, 0x5E, 0x41, 0x71, +0x04, 0x08, 0x41, 0x82, 0x04, 0x08, 0x81, 0x0B, +0x81, 0x4B, 0x81, 0x2B, 0xD5, 0xC2, 0xC0, 0xBF, +0xE1, 0x00, 0xE8, 0xBD, 0x40, 0x80, 0x00, 0x11, +0xD5, 0xBA, 0x3C, 0x10, 0x0E, 0xDA, 0xFE, 0x82, +0x96, 0x4B, 0xE0, 0x41, 0xE8, 0xCA, 0x3C, 0x00, +0x0E, 0xDA, 0xFE, 0x42, 0x96, 0x0B, 0xD5, 0xC5, +0x3C, 0x60, 0x0E, 0xEE, 0x96, 0xB3, 0x4E, 0x24, +0x00, 0x11, 0x50, 0xE5, 0x85, 0xEC, 0x38, 0x82, +0xB9, 0x11, 0x3D, 0x30, 0x05, 0x12, 0x8B, 0x00, +0xE1, 0xE8, 0xE8, 0x0A, 0x41, 0x41, 0xC4, 0x20, +0x03, 0x6A, 0x03, 0x2C, 0x8B, 0x16, 0xD5, 0x04, +0x38, 0x81, 0xAD, 0x01, 0x8B, 0x00, 0x38, 0x81, +0xAD, 0x09, 0x39, 0x71, 0xAD, 0x11, 0x4F, 0x74, +0x00, 0x04, 0x39, 0x98, 0x2D, 0x09, 0x3C, 0x10, +0x05, 0x08, 0x97, 0x8C, 0xC6, 0x07, 0x41, 0x83, +0xAC, 0x20, 0x38, 0xA1, 0xAD, 0x11, 0x12, 0xAC, +0x00, 0x00, 0x3C, 0x90, 0x0E, 0x5F, 0x8D, 0xA1, +0x89, 0x69, 0xD5, 0xA8, 0xE1, 0xFE, 0xE8, 0x07, +0x2B, 0x42, 0x80, 0x01, 0x13, 0x42, 0x80, 0x35, +0x8D, 0xE1, 0xD5, 0xF9, 0x3C, 0xD0, 0x0E, 0x60, +0x3E, 0x68, 0x08, 0xCC, 0x85, 0x40, 0xE1, 0x4D, +0xE8, 0x07, 0x2A, 0x83, 0x00, 0x01, 0x12, 0x83, +0x00, 0x35, 0x8D, 0x41, 0xD5, 0xF9, 0x44, 0x90, +0x7F, 0xFF, 0x44, 0x8F, 0x80, 0x00, 0x3C, 0x98, +0x04, 0xFD, 0x3C, 0x98, 0x05, 0x00, 0x3C, 0x88, +0x04, 0xFC, 0x3C, 0x88, 0x04, 0xFF, 0x44, 0x9F, +0x80, 0x00, 0x3C, 0x14, 0x04, 0xFE, 0x44, 0xE0, +0x7F, 0xFF, 0x3E, 0x08, 0x1B, 0xF8, 0x84, 0xE0, +0xE0, 0xFE, 0xE8, 0x11, 0x41, 0x91, 0x9C, 0x20, +0x23, 0x1C, 0x82, 0xE0, 0xE1, 0x31, 0xE8, 0x04, +0x22, 0x90, 0x00, 0x00, 0x96, 0x7B, 0xE1, 0xAE, +0xE8, 0x03, 0x22, 0xE0, 0x00, 0x00, 0x8C, 0xE1, +0x8C, 0x02, 0xD5, 0xEF, 0x3C, 0x18, 0x04, 0xFE, +0x3C, 0xE8, 0x04, 0xFD, 0x3C, 0x98, 0x04, 0xFC, +0x3C, 0x44, 0x04, 0xFF, 0x3C, 0x64, 0x05, 0x01, +0x3C, 0x54, 0x05, 0x00, 0x3E, 0x18, 0x1B, 0xB8, +0x84, 0x00, 0xE0, 0x0D, 0xE8, 0x11, 0x41, 0x51, +0x80, 0x20, 0x23, 0x0A, 0x82, 0xC0, 0xE0, 0x90, +0xE8, 0x04, 0x22, 0x40, 0x80, 0x00, 0x97, 0x83, +0xE1, 0x85, 0xE8, 0x03, 0x22, 0x50, 0x80, 0x00, +0x8C, 0x01, 0x8C, 0x22, 0xD5, 0xEF, 0x44, 0x7F, +0x80, 0x00, 0x3C, 0x48, 0x04, 0xFF, 0x44, 0x40, +0x7F, 0xFF, 0x3C, 0x58, 0x05, 0x00, 0x3C, 0x78, +0x04, 0xF9, 0x3C, 0x68, 0x05, 0x01, 0x3C, 0x48, +0x04, 0xFA, 0x3C, 0x50, 0x0E, 0x5D, 0x3C, 0x70, +0x04, 0xFB, 0x44, 0xC0, 0x7F, 0xFF, 0x45, 0x2F, +0x80, 0x00, 0x84, 0x00, 0xE0, 0x05, 0xE8, 0x0B, +0x38, 0xB1, 0x81, 0x11, 0xE1, 0xCB, 0xE8, 0x03, +0x97, 0xC1, 0x82, 0x4B, 0x42, 0xC6, 0x2C, 0x01, +0x8C, 0x01, 0xD5, 0xF5, 0x2E, 0x07, 0xF3, 0xC3, +0x86, 0xE0, 0x3D, 0x28, 0x04, 0xF9, 0x3C, 0xC8, +0x04, 0xFA, 0x3C, 0x78, 0x04, 0xFB, 0x3D, 0x78, +0x05, 0x18, 0xC8, 0x03, 0x3C, 0x08, 0x05, 0x19, +0x2E, 0x60, 0x03, 0x22, 0x3D, 0x78, 0x05, 0x1A, +0x96, 0x34, 0x3D, 0x80, 0x05, 0x12, 0x3C, 0x70, +0x05, 0x13, 0x3C, 0x40, 0x05, 0x14, 0x3C, 0x10, +0x05, 0x15, 0x3C, 0xA0, 0x05, 0x16, 0xC0, 0x21, +0x3C, 0x00, 0x05, 0x29, 0x45, 0xE0, 0x00, 0x64, +0x42, 0xB0, 0x60, 0x24, 0xFF, 0xC4, 0xFF, 0x04, +0xFE, 0x44, 0x42, 0xE5, 0x00, 0x24, 0x41, 0x05, +0xFA, 0x17, 0x40, 0xC3, 0xF9, 0x97, 0x41, 0x12, +0x7A, 0x37, 0x40, 0xD0, 0xF9, 0xB7, 0x41, 0x27, +0x7A, 0x57, 0x3D, 0x08, 0x05, 0x0B, 0x3C, 0xC8, +0x05, 0x0C, 0x3D, 0x18, 0x05, 0x0D, 0x3C, 0xD8, +0x05, 0x0E, 0x3D, 0x28, 0x05, 0x0F, 0xD5, 0x0B, +0x3D, 0x88, 0x05, 0x0B, 0x3C, 0x78, 0x05, 0x0C, +0x3C, 0x48, 0x05, 0x0D, 0x3C, 0x18, 0x05, 0x0E, +0x3C, 0xA8, 0x05, 0x0F, 0x3C, 0x74, 0x0E, 0x58, +0x4E, 0x77, 0x00, 0x3A, 0x3C, 0x40, 0x0F, 0x24, +0x96, 0x63, 0x4E, 0x17, 0x00, 0x35, 0x3C, 0x00, +0x0F, 0x64, 0x97, 0x03, 0x4E, 0x44, 0x00, 0x30, +0x3C, 0x10, 0x0F, 0x33, 0x45, 0x30, 0x00, 0x64, +0x96, 0x0B, 0xFF, 0xC4, 0x41, 0x43, 0xCE, 0x97, +0x3C, 0x70, 0x0F, 0x27, 0x41, 0x5A, 0x00, 0x11, +0xCF, 0x12, 0x3C, 0x10, 0x0F, 0x28, 0xC9, 0x08, +0x3C, 0xB0, 0x05, 0x0C, 0xE1, 0x75, 0xE8, 0x1B, +0x3D, 0x48, 0x05, 0x0C, 0xD5, 0x18, 0x3C, 0xA0, +0x05, 0x0E, 0xE1, 0x55, 0xE8, 0x14, 0x3D, 0x48, +0x05, 0x0E, 0xD5, 0x11, 0x3C, 0x40, 0x0F, 0x28, +0xCC, 0x08, 0x3C, 0x90, 0x05, 0x0F, 0xE1, 0x35, +0xE8, 0x0A, 0x3D, 0x48, 0x05, 0x0F, 0xD5, 0x07, +0x3C, 0x80, 0x05, 0x0D, 0xE1, 0x15, 0xE8, 0x03, +0x3D, 0x48, 0x05, 0x0D, 0x3C, 0x00, 0x05, 0x17, +0x54, 0x73, 0x00, 0x02, 0x3C, 0x08, 0x05, 0x10, +0xC7, 0x0A, 0x3C, 0x40, 0x05, 0x29, 0x45, 0x60, +0x00, 0x64, 0xFE, 0x24, 0x41, 0x90, 0x5B, 0x37, +0x3D, 0x98, 0x05, 0x10, 0x2E, 0x17, 0xE1, 0x63, +0xC1, 0x03, 0x3D, 0x88, 0x05, 0x11, 0x3D, 0x70, +0x05, 0x11, 0x3D, 0x00, 0x05, 0x0B, 0xE3, 0x97, +0xE8, 0x03, 0x3D, 0x78, 0x05, 0x0B, 0x3D, 0x10, +0x05, 0x10, 0xE3, 0xB7, 0xE8, 0x03, 0x3D, 0x78, +0x05, 0x10, 0x3C, 0x00, 0x0E, 0x99, 0x3C, 0x44, +0x05, 0x02, 0x97, 0xC3, 0xFF, 0xE4, 0x45, 0x80, +0x00, 0x64, 0x3C, 0x13, 0xF9, 0xD8, 0x41, 0xE3, +0xE3, 0xD6, 0x85, 0x83, 0x43, 0xEB, 0xB0, 0x73, +0x85, 0xA4, 0x8E, 0x21, 0x40, 0xEF, 0x35, 0xD6, +0x96, 0x0B, 0x3C, 0xE8, 0x05, 0x11, 0x3C, 0x0B, +0xF9, 0xD8, 0x4E, 0x05, 0x00, 0x0E, 0x3D, 0x24, +0x0E, 0x4F, 0x3D, 0x30, 0x05, 0x0B, 0xE1, 0xF2, +0x4E, 0xF3, 0x04, 0xCB, 0x3C, 0x80, 0x05, 0x10, +0xE1, 0x12, 0x4E, 0xF3, 0x04, 0xC6, 0x3D, 0x50, +0x0E, 0x8B, 0x86, 0x80, 0x54, 0x7A, 0x88, 0x00, +0x3D, 0x4B, 0xF9, 0xD8, 0xCF, 0x62, 0x3C, 0x90, +0x05, 0x07, 0x54, 0x44, 0x81, 0x00, 0xC4, 0x38, +0x2E, 0xA7, 0xE1, 0x5D, 0x5A, 0xA0, 0x02, 0x35, +0xCE, 0x07, 0x3C, 0x40, 0x10, 0xE0, 0x3C, 0x10, +0x10, 0xE1, 0x97, 0xE3, 0xD5, 0x06, 0x3C, 0x60, +0x10, 0xD5, 0x3C, 0x10, 0x10, 0xD6, 0x97, 0xF3, +0x96, 0x4B, 0x4E, 0x17, 0x00, 0x12, 0x3C, 0x00, +0x05, 0x27, 0x96, 0x0E, 0xC0, 0x0D, 0x3C, 0x64, +0x0E, 0x4F, 0x45, 0x60, 0x00, 0x64, 0xFE, 0x74, +0x3C, 0xB4, 0x0E, 0x55, 0x41, 0x90, 0xDB, 0x36, +0x40, 0x0C, 0xAC, 0x07, 0xD5, 0x02, 0x84, 0x01, +0x4E, 0x77, 0x00, 0x14, 0x3C, 0x40, 0x05, 0x27, +0x96, 0x64, 0xC1, 0x0F, 0x3C, 0x64, 0x0E, 0x4F, +0x45, 0x00, 0x00, 0x64, 0xFF, 0xBC, 0x3D, 0x74, +0x0E, 0x52, 0x41, 0x13, 0x42, 0x36, 0x40, 0x78, +0xDC, 0x07, 0xFE, 0x3E, 0xD5, 0x02, 0x84, 0x01, +0x3C, 0x43, 0xF6, 0x81, 0xC4, 0x04, 0x2E, 0x17, +0xED, 0x12, 0xC1, 0x09, 0x3C, 0x60, 0x0F, 0x70, +0x3D, 0x80, 0x0E, 0x4A, 0x97, 0xF3, 0xE0, 0xF8, +0xE9, 0x02, 0xC0, 0x0B, 0x3D, 0x24, 0x04, 0xF9, +0x3D, 0xE0, 0x05, 0x0B, 0xE1, 0xDE, 0xE8, 0x11, +0x3C, 0xC0, 0x05, 0x10, 0xE1, 0xCC, 0xE8, 0x0D, +0x2E, 0x57, 0xF3, 0xB7, 0x84, 0x60, 0x84, 0x40, +0x3E, 0x37, 0xF3, 0xC3, 0x3C, 0x28, 0x05, 0x04, +0x4E, 0x52, 0x07, 0x45, 0x48, 0x00, 0x04, 0x5D, +0x3C, 0xD0, 0x0E, 0x8B, 0x54, 0x06, 0x88, 0x00, +0xC0, 0x04, 0x85, 0xC2, 0x3C, 0xE8, 0x10, 0xF4, +0x3D, 0x30, 0x10, 0xF4, 0x5B, 0x38, 0x02, 0x04, +0x48, 0x00, 0x06, 0xC0, 0x3C, 0xB0, 0x0E, 0x64, +0x3C, 0xC0, 0x0E, 0x66, 0x43, 0x45, 0x88, 0x24, +0x3C, 0xD0, 0x0E, 0x67, 0x44, 0x8F, 0x80, 0x00, +0x3C, 0x88, 0x05, 0x02, 0x41, 0x6A, 0x30, 0x00, +0x3D, 0x50, 0x0E, 0x65, 0x3D, 0x80, 0x05, 0x03, +0x41, 0x4A, 0x34, 0x00, 0x80, 0xEB, 0x85, 0x00, +0x44, 0x6F, 0x80, 0x00, 0x40, 0xFA, 0x9C, 0x07, +0xE9, 0x13, 0x40, 0xA4, 0x58, 0x00, 0x41, 0x34, +0x50, 0x00, 0xE1, 0xEA, 0xE9, 0x0A, 0x39, 0x71, +0xA9, 0x11, 0xE0, 0xD7, 0xE8, 0x04, 0x41, 0x85, +0x00, 0x13, 0x80, 0xD7, 0x8D, 0x41, 0xD5, 0xF6, +0x8C, 0xE1, 0x89, 0x02, 0xD5, 0xEC, 0x2E, 0x97, +0xE1, 0x5D, 0x3C, 0x68, 0x05, 0x02, 0x3D, 0x88, +0x05, 0x03, 0x5A, 0x98, 0x02, 0x09, 0x3C, 0x80, +0x05, 0x0B, 0x96, 0x73, 0xE0, 0x28, 0xE8, 0x79, +0x48, 0x00, 0x04, 0x13, 0x3C, 0x40, 0x05, 0x06, +0x97, 0x3E, 0xC4, 0x6C, 0x3C, 0x10, 0x0E, 0xBF, +0x2E, 0x37, 0xE1, 0x60, 0x3C, 0x70, 0x0E, 0xC0, +0x97, 0x8B, 0x96, 0x3B, 0xC3, 0x05, 0x3C, 0x00, +0x10, 0xA8, 0x97, 0x83, 0xD5, 0x04, 0x2E, 0x47, +0xE1, 0x62, 0xC4, 0x04, 0x3C, 0x10, 0x10, 0xA9, +0x96, 0x0B, 0x3C, 0x74, 0x0E, 0x4F, 0xE0, 0xC7, +0xE9, 0x55, 0x3C, 0xA4, 0x05, 0x04, 0xE0, 0xCA, +0xE9, 0x51, 0x3C, 0x60, 0x0E, 0xBE, 0x3C, 0xE0, +0x0E, 0x51, 0x97, 0x33, 0xFF, 0x3C, 0x45, 0x70, +0x00, 0x64, 0x41, 0x67, 0x0B, 0x37, 0x40, 0x32, +0x5C, 0x76, 0x85, 0x40, 0x41, 0x4B, 0x00, 0x13, +0x41, 0x3C, 0x80, 0x13, 0x96, 0x5B, 0x81, 0x0A, +0x3F, 0xE8, 0x0A, 0x60, 0xE1, 0x05, 0xE8, 0x1D, +0x4C, 0xE4, 0x00, 0x1A, 0x40, 0x9F, 0x20, 0x20, +0x22, 0x34, 0x85, 0xEC, 0xE0, 0x61, 0xE9, 0x13, +0x41, 0x64, 0x0B, 0x36, 0x3D, 0x10, 0x0E, 0xC1, +0x41, 0x7A, 0x58, 0x01, 0x41, 0x09, 0xE4, 0x01, +0x43, 0x8B, 0x80, 0x03, 0x42, 0x68, 0x00, 0x03, +0x41, 0x28, 0x80, 0x11, 0x88, 0xD8, 0xE1, 0xC6, +0xE8, 0x02, 0x8D, 0x41, 0x8D, 0x01, 0xD5, 0xE3, +0xE1, 0x40, 0xE9, 0x1C, 0x3C, 0x20, 0x0E, 0xB9, +0x45, 0x00, 0x00, 0x64, 0x97, 0x53, 0xFF, 0x7C, +0x3C, 0xB0, 0x05, 0x19, 0x41, 0x12, 0xC2, 0x36, +0x86, 0xA1, 0xE1, 0x71, 0x3F, 0x57, 0xF3, 0xC3, +0x4E, 0xF2, 0x07, 0x3E, 0x3C, 0x00, 0x0E, 0xB9, +0x96, 0x43, 0x43, 0x83, 0x84, 0x24, 0x41, 0x2C, +0x42, 0x56, 0x3D, 0x28, 0x05, 0x19, 0x48, 0x00, +0x07, 0x33, 0x3C, 0x44, 0x05, 0x02, 0x3C, 0x00, +0x05, 0x0B, 0xE0, 0x80, 0x4E, 0xF3, 0x06, 0x83, +0x3C, 0x70, 0x05, 0x0B, 0xF7, 0x81, 0x3C, 0xA4, +0x05, 0x02, 0xF6, 0x01, 0x84, 0xA0, 0xE1, 0x46, +0x3C, 0x5B, 0xF6, 0x7C, 0x3E, 0x38, 0x03, 0x4C, +0x4E, 0xF3, 0x06, 0x75, 0x42, 0x46, 0x2C, 0x24, +0x3D, 0xE0, 0x05, 0x07, 0x96, 0x61, 0x54, 0x0F, +0x01, 0x00, 0x3C, 0x44, 0x04, 0xF9, 0x3C, 0x74, +0x05, 0x27, 0x40, 0x66, 0x80, 0x10, 0x3C, 0x5B, +0xF9, 0xD4, 0x3C, 0x5B, 0xF9, 0xD2, 0x3C, 0x5B, +0xF9, 0xD3, 0x3C, 0x5B, 0xF9, 0xD9, 0x3C, 0x58, +0x01, 0x8D, 0x46, 0xE7, 0xFF, 0xFF, 0x97, 0x41, +0xF5, 0x83, 0xF7, 0x84, 0xF6, 0x85, 0x90, 0x81, +0x40, 0x06, 0x00, 0x10, 0x40, 0x5A, 0x80, 0x10, +0x40, 0x75, 0x80, 0x10, 0x50, 0x67, 0x0F, 0xFF, +0x3C, 0x3E, 0x02, 0x7A, 0xF4, 0x82, 0x3D, 0x7D, +0xF6, 0xD7, 0x3D, 0x6D, 0xF6, 0xD6, 0x81, 0x2B, +0x85, 0x00, 0x81, 0x43, 0x45, 0xE0, 0x00, 0x64, +0xF0, 0x86, 0xF5, 0x87, 0xF7, 0x88, 0x51, 0x41, +0xFF, 0xFE, 0x51, 0x31, 0x80, 0x02, 0xF6, 0x89, +0x40, 0xFA, 0xA4, 0x06, 0x4E, 0xF3, 0x01, 0x70, +0x80, 0xAC, 0x55, 0x84, 0x80, 0xFF, 0x40, 0xF6, +0x94, 0x06, 0x4E, 0xF3, 0x01, 0x55, 0x95, 0x09, +0x38, 0x01, 0x90, 0x11, 0xF6, 0x01, 0xE0, 0x06, +0x4E, 0xF3, 0x01, 0x48, 0x4C, 0x95, 0x80, 0x3D, +0x4C, 0x56, 0x00, 0x6E, 0x4C, 0x9A, 0x80, 0x5A, +0x4C, 0x56, 0x80, 0xA2, 0x9F, 0x89, 0x9B, 0xF2, +0x38, 0xE1, 0x9D, 0x11, 0x9D, 0xC9, 0xE0, 0x0E, +0xE9, 0x25, 0x41, 0x90, 0x88, 0x01, 0x39, 0x01, +0xE5, 0x11, 0xE0, 0x10, 0xE9, 0x1F, 0x41, 0x13, +0x88, 0x01, 0x39, 0x21, 0xC5, 0x11, 0xE1, 0xC0, +0xE8, 0x19, 0x38, 0xEA, 0x10, 0x11, 0xE0, 0x0E, +0xE9, 0x15, 0x39, 0x09, 0x90, 0x11, 0xE1, 0x80, +0xE8, 0x11, 0x88, 0xC2, 0x38, 0x65, 0x19, 0x11, +0xE0, 0x06, 0xE9, 0x0C, 0x99, 0x8A, 0x39, 0x11, +0x99, 0x11, 0xE1, 0xA0, 0xE8, 0x07, 0x99, 0xBA, +0x39, 0x21, 0x99, 0x11, 0xE1, 0xC0, 0x4E, 0xF3, +0x00, 0xB1, 0x38, 0x49, 0x90, 0x11, 0xE0, 0x80, +0x4E, 0xF2, 0x01, 0x10, 0x8C, 0xA1, 0x97, 0x69, +0x96, 0x79, 0x48, 0x00, 0x01, 0x0B, 0x4C, 0x56, +0x40, 0x10, 0x39, 0x19, 0x90, 0x11, 0xE1, 0xA0, +0x4E, 0xF2, 0x01, 0x04, 0x99, 0x0A, 0x39, 0x21, +0x91, 0x11, 0xE1, 0xC0, 0x4E, 0xF2, 0x00, 0xFE, +0x39, 0x29, 0x91, 0x11, 0xD5, 0x77, 0x4C, 0x56, +0xC0, 0x27, 0x39, 0x9A, 0x10, 0x11, 0xE0, 0x19, +0x4E, 0xF3, 0x00, 0xF4, 0x99, 0xCA, 0x39, 0x01, +0x9D, 0x11, 0xE1, 0x80, 0x4E, 0xF2, 0x00, 0xEE, +0x39, 0x1A, 0x1D, 0x11, 0x48, 0x00, 0x00, 0x84, +0x4C, 0x56, 0xC0, 0x2E, 0xF7, 0x09, 0x9B, 0x8A, +0x88, 0xC7, 0x39, 0x11, 0x99, 0x11, 0xE0, 0x11, +0x4E, 0xF3, 0x00, 0xE0, 0x39, 0x29, 0x99, 0x11, +0xE0, 0x12, 0x4E, 0xF3, 0x00, 0xDB, 0x39, 0x1A, +0x10, 0x11, 0xD5, 0x71, 0x4C, 0x9A, 0x86, 0xF1, +0x4C, 0x95, 0xC0, 0x36, 0x38, 0xEA, 0x10, 0x11, +0xE0, 0x0E, 0x4E, 0xF3, 0x00, 0xCF, 0x38, 0x69, +0x90, 0x11, 0xE0, 0xC0, 0x4E, 0xF2, 0x00, 0xCA, +0x99, 0x11, 0x9F, 0xE1, 0x39, 0x95, 0x1D, 0x11, +0xE0, 0x19, 0x4E, 0xF3, 0x00, 0xC3, 0x39, 0x01, +0x91, 0x11, 0xE1, 0x80, 0x4E, 0xF2, 0x00, 0xBE, +0x8C, 0x81, 0xD5, 0x36, 0x39, 0x2A, 0x10, 0x11, +0xE0, 0x12, 0x4E, 0xF3, 0x00, 0xB7, 0x9F, 0xC9, +0x8A, 0xE2, 0x38, 0xE1, 0x9D, 0x11, 0xE0, 0x0E, +0x4E, 0xF3, 0x00, 0xB0, 0x9B, 0x8A, 0x39, 0x91, +0x99, 0x11, 0xE0, 0x19, 0x4E, 0xF3, 0x00, 0xAA, +0x9D, 0xC9, 0x8A, 0xE2, 0x39, 0x05, 0x1D, 0x11, +0xE1, 0x80, 0x4E, 0xF2, 0x00, 0xA3, 0x39, 0x29, +0x90, 0x11, 0xD5, 0x1C, 0x4C, 0x56, 0x40, 0x1F, +0x9B, 0x8A, 0x39, 0x25, 0x19, 0x11, 0xE0, 0x12, +0x4E, 0xF3, 0x00, 0x98, 0x39, 0x09, 0x99, 0x11, +0xE1, 0x80, 0x4E, 0xF2, 0x00, 0x93, 0x38, 0x79, +0x90, 0x11, 0xE0, 0xE0, 0x4E, 0xF2, 0x00, 0x8E, +0x99, 0x11, 0x9D, 0xA1, 0x39, 0x11, 0x99, 0x11, +0xE1, 0xA0, 0x4E, 0xF2, 0x00, 0x87, 0x39, 0x21, +0x91, 0x11, 0xE1, 0xC0, 0xE9, 0x1E, 0x48, 0x00, +0x00, 0x81, 0x4C, 0x56, 0xC0, 0x7F, 0x9B, 0x8A, +0x38, 0xE5, 0x19, 0x11, 0xE0, 0x0E, 0xE9, 0x79, +0x99, 0xCA, 0x39, 0x01, 0x9D, 0x11, 0xE1, 0x80, +0xE8, 0x74, 0x9F, 0x89, 0x9B, 0xF2, 0x39, 0x91, +0x9D, 0x11, 0xE0, 0x19, 0xE9, 0x6E, 0x38, 0x4A, +0x10, 0x11, 0xE0, 0x04, 0xE9, 0x6A, 0x88, 0xC2, +0x39, 0x11, 0x99, 0x11, 0xE0, 0x11, 0xE9, 0x65, +0x3C, 0x70, 0x10, 0xDF, 0xF6, 0x03, 0x97, 0x3B, +0x4E, 0x62, 0x06, 0x2A, 0x4E, 0x45, 0x06, 0x28, +0x3C, 0x70, 0x10, 0xF4, 0x4E, 0x73, 0x05, 0xF0, +0x3C, 0x60, 0x10, 0xD7, 0x05, 0x1F, 0x80, 0x04, +0x97, 0xF3, 0x3C, 0x60, 0x10, 0xD8, 0x97, 0xB3, +0x41, 0x18, 0x80, 0x13, 0x54, 0xF8, 0x80, 0x0C, +0x4E, 0xF2, 0x06, 0x16, 0x97, 0x20, 0x41, 0x9C, +0x10, 0x01, 0x41, 0x2C, 0x80, 0x10, 0x54, 0xF2, +0x80, 0xFF, 0x05, 0x9F, 0x80, 0x08, 0x41, 0x07, +0x90, 0x01, 0x40, 0xEC, 0x10, 0x00, 0x88, 0x8F, +0xE1, 0xCB, 0x40, 0xE7, 0x00, 0x10, 0x41, 0x2C, +0xBC, 0x1B, 0x05, 0x9F, 0x80, 0x07, 0x40, 0xFA, +0xB8, 0x07, 0x41, 0x08, 0x00, 0x10, 0x40, 0xEC, +0xBC, 0x1B, 0x05, 0x9F, 0x80, 0x06, 0xE1, 0x8C, +0x97, 0x22, 0x41, 0x0C, 0xBC, 0x1B, 0x05, 0x9F, +0x80, 0x05, 0x40, 0xF6, 0x90, 0x07, 0x40, 0x4C, +0xBC, 0x1B, 0x54, 0xF8, 0x80, 0x04, 0xE8, 0x0D, +0xFF, 0xC4, 0x41, 0x29, 0x00, 0x11, 0x40, 0x73, +0xF8, 0xF6, 0x40, 0xE7, 0x00, 0x11, 0x97, 0xFB, +0x40, 0xF7, 0x48, 0x07, 0x4E, 0xF2, 0x05, 0xCA, +0x54, 0x78, 0x80, 0x08, 0xC7, 0x0B, 0xFF, 0x84, +0x40, 0x78, 0x00, 0x11, 0x40, 0x63, 0x78, 0xD6, +0x97, 0x23, 0x97, 0xB3, 0xE0, 0x87, 0x4E, 0xF2, +0x05, 0xC9, 0xF4, 0x02, 0xE0, 0x80, 0xE8, 0x05, +0x51, 0x7B, 0x80, 0x01, 0x43, 0x6B, 0x00, 0x00, +0x8C, 0xA1, 0x8C, 0x21, 0x97, 0x69, 0x96, 0x49, +0x48, 0xFF, 0xFE, 0xAB, 0x3C, 0x50, 0x0F, 0x24, +0x96, 0x2B, 0x4E, 0x07, 0x00, 0x0C, 0x3C, 0x60, +0x0F, 0x64, 0x97, 0xF3, 0x4E, 0x74, 0x00, 0x07, +0x3C, 0x40, 0x0F, 0x27, 0xC4, 0x03, 0x8C, 0x21, +0x96, 0x49, 0x8D, 0x21, 0x40, 0x94, 0x80, 0x13, +0x48, 0xFF, 0xFE, 0x90, 0x3D, 0x7F, 0xF6, 0xD7, +0x3D, 0x6F, 0xF6, 0xD6, 0x3E, 0x80, 0x03, 0x1D, +0x4E, 0x82, 0x00, 0x04, 0x49, 0x00, 0x3A, 0x36, +0x3C, 0x03, 0xF6, 0x81, 0xC8, 0x3F, 0x2E, 0xC8, +0x03, 0x23, 0x4E, 0xC7, 0x00, 0x3C, 0x2E, 0x27, +0xE1, 0x62, 0xC2, 0x38, 0x2E, 0x37, 0xF3, 0xB4, +0x3C, 0xB7, 0xF9, 0xD2, 0xCB, 0x08, 0x3C, 0x00, +0x10, 0xAB, 0x97, 0x43, 0xE1, 0x65, 0x84, 0x01, +0xE9, 0x0E, 0xD5, 0x06, 0x3C, 0x10, 0x10, 0xAB, +0x97, 0x0B, 0xE1, 0x64, 0xE8, 0x08, 0x3C, 0x70, +0x10, 0xAB, 0x3C, 0xD7, 0xF9, 0xD3, 0x97, 0xBB, +0x40, 0x06, 0x98, 0x07, 0x3C, 0x30, 0x10, 0xB3, +0x3D, 0x57, 0xF9, 0xD4, 0x96, 0x5B, 0xE0, 0x35, +0x96, 0x80, 0xE9, 0x15, 0xCA, 0x14, 0x3C, 0x40, +0x10, 0xAC, 0x97, 0x63, 0xE0, 0xAB, 0xE9, 0x0F, +0x3C, 0x70, 0x10, 0xAC, 0x3D, 0x47, 0xF9, 0xD3, +0x97, 0xBB, 0xE0, 0xD4, 0xE9, 0x08, 0x3C, 0x00, +0x10, 0xAE, 0x3D, 0x37, 0xF9, 0xD9, 0x96, 0x83, +0xE1, 0xE2, 0xE8, 0x04, 0x85, 0x20, 0x3E, 0x97, +0xE1, 0x62, 0x3D, 0x70, 0x0E, 0x5D, 0x3D, 0x5C, +0x02, 0x79, 0x86, 0x40, 0x3E, 0x28, 0x03, 0x4C, +0xE1, 0xD7, 0xE8, 0x08, 0x40, 0x1A, 0xC8, 0x20, +0xA4, 0xC8, 0x38, 0x31, 0x49, 0x09, 0x8D, 0xC1, +0xD5, 0xF8, 0x2F, 0x67, 0xE1, 0x5D, 0x5B, 0x68, +0x02, 0x04, 0x48, 0x00, 0x02, 0x07, 0x2F, 0x97, +0xF3, 0xB7, 0x84, 0xC0, 0x5B, 0x98, 0x01, 0x08, +0x3C, 0x30, 0x0F, 0x64, 0x96, 0xE6, 0x97, 0x99, +0x4E, 0x63, 0x01, 0xFC, 0x81, 0xC6, 0x81, 0x66, +0x81, 0x06, 0x3E, 0xCF, 0xFF, 0x08, 0x44, 0xD0, +0x00, 0x38, 0x84, 0xE0, 0x81, 0x27, 0x85, 0x41, +0x2F, 0x78, 0x03, 0x23, 0xE1, 0x37, 0xE8, 0x11, +0x82, 0x2C, 0x43, 0x14, 0xB4, 0x73, 0x3D, 0x00, +0x05, 0x19, 0x04, 0x18, 0x80, 0x05, 0xE0, 0x30, +0xE8, 0x0C, 0x80, 0x09, 0x49, 0x00, 0x45, 0x54, +0x2E, 0x48, 0x03, 0x23, 0x8F, 0x21, 0xCC, 0x05, +0x4E, 0xE2, 0x00, 0x65, 0x48, 0x00, 0x00, 0x82, +0x3E, 0x5F, 0xFF, 0x08, 0x42, 0x54, 0xB4, 0x73, +0x3D, 0x80, 0x05, 0x2F, 0x51, 0x22, 0x80, 0x08, +0x20, 0x09, 0x00, 0x05, 0x20, 0x29, 0x00, 0x04, +0x20, 0x19, 0x00, 0x07, 0x20, 0x49, 0x00, 0x06, +0xA1, 0x6D, 0x9A, 0xC2, 0x9A, 0x8C, 0x8C, 0x61, +0x8C, 0x41, 0xE0, 0xB8, 0x43, 0x31, 0x88, 0x24, +0x3C, 0x00, 0x05, 0x06, 0xE8, 0x24, 0x96, 0x26, +0xC0, 0x43, 0x2E, 0x47, 0xE1, 0x62, 0xCC, 0x40, +0x3C, 0x03, 0xF6, 0x81, 0xC8, 0x10, 0x3C, 0x10, +0x0E, 0xCE, 0x97, 0x0B, 0xE0, 0x83, 0xE9, 0x0F, +0x3C, 0x30, 0x0E, 0xCE, 0x96, 0x1B, 0xE0, 0x02, +0xE9, 0x0A, 0x3D, 0x10, 0x05, 0x26, 0xE1, 0xB3, +0xE9, 0x06, 0xD5, 0x2E, 0x3D, 0xE0, 0x05, 0x26, +0xE1, 0xFE, 0xE9, 0x2A, 0xE1, 0x05, 0xE8, 0x03, +0x40, 0x82, 0x80, 0x11, 0x3E, 0xA7, 0xF3, 0xC2, +0x8C, 0xC1, 0xD5, 0x22, 0x96, 0x2E, 0xC0, 0x20, +0x3D, 0x00, 0x05, 0x25, 0xE1, 0x93, 0xE8, 0x08, +0x85, 0x01, 0x3E, 0x87, 0xF3, 0xB6, 0x3E, 0x87, +0xF3, 0xB9, 0x48, 0x00, 0x00, 0xA6, 0x3C, 0x10, +0x0E, 0xE9, 0x97, 0x0B, 0xE0, 0x64, 0xE8, 0x0B, +0x3C, 0x30, 0x0E, 0xE9, 0x96, 0x1B, 0xE0, 0x40, +0xE8, 0x06, 0x3C, 0x20, 0x0E, 0xB2, 0x96, 0x53, +0xE1, 0xE1, 0xE9, 0x06, 0xE1, 0x65, 0xE8, 0x03, +0x40, 0xB2, 0x80, 0x11, 0x84, 0xE1, 0x8D, 0x21, +0xD5, 0x88, 0x2F, 0x57, 0xF3, 0xC2, 0x5B, 0x58, +0x01, 0x1D, 0xCF, 0x1B, 0x3C, 0x40, 0x0E, 0xB9, +0x45, 0xE0, 0x00, 0x64, 0x97, 0x63, 0x43, 0x84, +0x14, 0x24, 0x3D, 0x10, 0x05, 0x19, 0x40, 0xAC, +0x79, 0x56, 0xE1, 0xAA, 0xE9, 0x04, 0x85, 0xC1, +0x48, 0xFF, 0xFF, 0x71, 0x3C, 0x10, 0x0E, 0xB9, +0x97, 0xCB, 0x43, 0x54, 0x1C, 0x24, 0x41, 0x2A, +0xFA, 0x56, 0x3D, 0x28, 0x05, 0x19, 0xD5, 0xF4, +0x3C, 0x50, 0x10, 0xF4, 0x81, 0x27, 0xCD, 0x6C, +0x3C, 0x20, 0x0F, 0xD9, 0x3C, 0xA4, 0x04, 0xFF, +0x97, 0x13, 0xE1, 0x44, 0xE8, 0x08, 0x3C, 0x10, +0x0F, 0xD9, 0x3D, 0x24, 0x04, 0xFC, 0x96, 0xCB, +0xE1, 0xC3, 0xE9, 0x5E, 0x3C, 0x00, 0x0E, 0xB2, +0x3D, 0x47, 0xF9, 0xD4, 0x97, 0x43, 0xE0, 0xB4, +0xE9, 0x05, 0xE4, 0xC2, 0xE8, 0x03, 0xC7, 0x54, +0xD5, 0x02, 0x85, 0x21, 0x3C, 0x60, 0x0E, 0xBA, +0x45, 0x90, 0x00, 0x64, 0x97, 0xF3, 0x43, 0x65, +0x9C, 0x24, 0x3C, 0x20, 0x0F, 0x5E, 0x41, 0x7B, +0x66, 0xF6, 0x3C, 0x10, 0x0E, 0x54, 0x3C, 0x30, +0x0E, 0x64, 0x3C, 0x40, 0x0E, 0x65, 0x3E, 0x08, +0x1B, 0xB8, 0x3D, 0x78, 0x05, 0x1A, 0x49, 0x00, +0x1A, 0x2A, 0x81, 0x80, 0x3C, 0x20, 0x0F, 0x5E, +0x3C, 0x40, 0x0E, 0x67, 0x3E, 0x08, 0x1B, 0xF8, +0x3C, 0x10, 0x0E, 0x57, 0x3C, 0x30, 0x0E, 0x66, +0x49, 0x00, 0x1A, 0x1D, 0x3C, 0x20, 0x0F, 0xC0, +0x97, 0x13, 0x90, 0x88, 0xE0, 0x8C, 0xE8, 0x0C, +0x3C, 0x10, 0x0F, 0xC0, 0x96, 0xC8, 0xE0, 0x60, +0xE8, 0x07, 0x85, 0xC1, 0x3E, 0xE7, 0xF3, 0xB9, +0x3E, 0xE7, 0xF3, 0xB6, 0xD5, 0x1D, 0x5A, 0x98, +0x01, 0x1C, 0x3C, 0x50, 0x0F, 0xC0, 0x97, 0xAB, +0x90, 0xC8, 0xE0, 0xCC, 0xE9, 0x06, 0x3C, 0x70, +0x0F, 0xC0, 0x96, 0xB8, 0xE0, 0x40, 0xE8, 0x10, +0x3C, 0x00, 0x0F, 0x64, 0x85, 0xA1, 0x96, 0x26, +0x97, 0x01, 0x3E, 0xD7, 0xF3, 0xB6, 0xC4, 0x04, +0x3E, 0xD7, 0xF3, 0xB8, 0xD5, 0x05, 0x3E, 0xD7, +0xF3, 0xB9, 0x3E, 0x47, 0xF3, 0xB8, 0x3D, 0x33, +0xF9, 0xDC, 0x5B, 0x39, 0x01, 0x05, 0x87, 0x00, +0x3F, 0x87, 0xF3, 0xB8, 0x3C, 0x30, 0x05, 0x06, +0x54, 0x11, 0x80, 0x10, 0x97, 0x49, 0xCD, 0x05, +0x3E, 0x57, 0xF3, 0xC3, 0x3E, 0x57, 0xF3, 0xC2, +0x96, 0xEE, 0x97, 0x99, 0xCE, 0x09, 0x3E, 0x67, +0xF3, 0xB7, 0x3E, 0x67, 0xF3, 0xB6, 0x3E, 0x67, +0xF3, 0xB9, 0x3E, 0x67, 0xF3, 0xB8, 0x3C, 0x70, +0x05, 0x07, 0x97, 0xE6, 0xC7, 0x0E, 0x3D, 0x03, +0xF6, 0x81, 0xE7, 0x82, 0xE9, 0x0A, 0x85, 0x60, +0x3E, 0xB7, 0xF3, 0xB7, 0x3E, 0xB7, 0xF3, 0xB6, +0x3E, 0xB7, 0xF3, 0xB9, 0x3E, 0xB7, 0xF3, 0xB8, +0x3C, 0x20, 0x0F, 0x64, 0x96, 0xA6, 0x96, 0x11, +0xC8, 0x05, 0x3E, 0x07, 0xF3, 0xB9, 0x3E, 0x07, +0xF3, 0xB8, 0x3C, 0x83, 0xF9, 0xDB, 0x5A, 0x88, +0x01, 0x1C, 0x3C, 0x40, 0x0F, 0x64, 0x86, 0x20, +0x87, 0xC0, 0x97, 0x26, 0x3F, 0xE7, 0xF3, 0xC3, +0x3D, 0x1B, 0xF9, 0xDE, 0x3D, 0x1B, 0xF6, 0x7A, +0xC4, 0x04, 0x3E, 0x87, 0xF3, 0xB7, 0xD5, 0x0C, +0x2E, 0x07, 0xF3, 0xDF, 0xC0, 0x04, 0x49, 0x00, +0x13, 0x32, 0xD5, 0x03, 0x49, 0x00, 0x44, 0xA7, +0x3E, 0x87, 0xF3, 0xB7, 0xD5, 0x61, 0x2E, 0x37, +0xF3, 0xB7, 0xC3, 0x7A, 0x3C, 0x10, 0x0F, 0x64, +0x96, 0x66, 0xC9, 0x0D, 0x2E, 0x57, 0xF3, 0xB6, +0xCD, 0x0A, 0x2E, 0x67, 0xF3, 0xC2, 0xCE, 0x07, +0x2E, 0x78, 0x03, 0x23, 0xCF, 0x04, 0x84, 0x00, +0x48, 0x00, 0x03, 0x59, 0x3C, 0x20, 0x0E, 0x9C, +0x3C, 0xA0, 0x0E, 0x4C, 0x96, 0x13, 0xE1, 0x40, +0xE8, 0x20, 0x3C, 0x10, 0x0E, 0xC2, 0x3C, 0x43, +0xF6, 0x7A, 0x97, 0x4B, 0x9C, 0xE1, 0xE0, 0xA4, +0x3C, 0x3B, 0xF6, 0x7A, 0xE8, 0x19, 0x84, 0x00, +0x49, 0x00, 0x44, 0x7D, 0x3D, 0x70, 0x0E, 0x5D, +0x86, 0x00, 0x3E, 0x0F, 0xE6, 0xFC, 0x3E, 0x38, +0x0A, 0x60, 0xE1, 0x97, 0x4E, 0xF2, 0x04, 0x0B, +0x40, 0xD1, 0xC0, 0x20, 0x02, 0xE6, 0x85, 0xEC, +0x38, 0xE0, 0x41, 0x09, 0x8D, 0x81, 0xD5, 0xF6, +0x86, 0xA0, 0x3D, 0x5B, 0xF6, 0x7A, 0x3C, 0x60, +0x0F, 0x64, 0x97, 0xA6, 0xCE, 0x35, 0x2E, 0x47, +0xF3, 0xB6, 0xCC, 0x28, 0x2E, 0x37, 0xF3, 0xB8, +0xCB, 0x25, 0x2E, 0x67, 0xF3, 0xC2, 0xCE, 0x22, +0x3C, 0x70, 0x0E, 0xBC, 0x3C, 0x17, 0xF9, 0xDE, +0x96, 0xBB, 0x9D, 0x49, 0xE0, 0x22, 0x3C, 0x5B, +0xF9, 0xDE, 0xE9, 0x0A, 0x3E, 0x67, 0xF3, 0xB7, +0x3E, 0x67, 0xF3, 0xC3, 0x3C, 0x6B, 0xF9, 0xDE, +0x3E, 0x60, 0x03, 0x22, 0xD5, 0x3A, 0x49, 0x00, +0x12, 0xCE, 0x3E, 0x67, 0xF3, 0xC3, 0x3D, 0x33, +0xF9, 0xDD, 0x8D, 0xE1, 0x3D, 0x3B, 0xF9, 0xDD, +0x87, 0x07, 0x3F, 0x80, 0x03, 0x22, 0x48, 0x00, +0x03, 0xD2, 0x85, 0x80, 0x3C, 0xCB, 0xF9, 0xDE, +0x3E, 0xC7, 0xF3, 0xC3, 0x49, 0x00, 0x12, 0xBB, +0x3C, 0xCB, 0xF9, 0xDD, 0xD5, 0xF2, 0x86, 0x40, +0x86, 0x87, 0x3F, 0x27, 0xF3, 0xC3, 0x3F, 0x27, +0xF3, 0xC2, 0x3F, 0x40, 0x03, 0x22, 0x3C, 0x93, +0xF9, 0xE1, 0x5A, 0x98, 0x01, 0x04, 0x3E, 0x97, +0xF3, 0xC3, 0x2E, 0x77, 0xF3, 0xC3, 0xC7, 0x0B, +0x2E, 0x28, 0x03, 0x23, 0xCA, 0x08, 0x2E, 0x07, +0xF3, 0xC2, 0x3C, 0x2B, 0xF9, 0xE2, 0xC8, 0x09, +0x48, 0xFF, 0xFF, 0x83, 0x86, 0xC0, 0x87, 0x20, +0x3F, 0x67, 0xF3, 0xC3, 0x3D, 0x9B, 0xF9, 0xE2, +0x2E, 0x67, 0xE1, 0x62, 0x3C, 0x00, 0x05, 0x1B, +0xC6, 0x04, 0x3C, 0x20, 0x10, 0x9D, 0x96, 0x13, +0x3C, 0xB0, 0x05, 0x06, 0x54, 0x35, 0xC0, 0x00, +0xC3, 0x07, 0x3C, 0x60, 0x05, 0x07, 0x97, 0x96, +0x96, 0x31, 0xC0, 0x2E, 0xD5, 0x31, 0x3C, 0x44, +0x04, 0xF9, 0x44, 0x80, 0x00, 0x64, 0xFE, 0x24, +0x3C, 0x90, 0x05, 0x0B, 0x41, 0x40, 0x22, 0x96, +0xE1, 0x34, 0xE8, 0x03, 0x3D, 0x48, 0x05, 0x0B, +0x2F, 0x68, 0x03, 0x23, 0x4F, 0x67, 0xFF, 0xEB, +0x85, 0x40, 0x3E, 0x7F, 0xFF, 0x08, 0x44, 0xC0, +0x00, 0x38, 0x2F, 0x98, 0x03, 0x23, 0xE1, 0x59, +0xE8, 0xE1, 0x82, 0x07, 0x43, 0x05, 0x30, 0x73, +0x3D, 0x30, 0x05, 0x0B, 0x04, 0x58, 0x00, 0x05, +0xE0, 0xB3, 0xE8, 0x08, 0x80, 0x0A, 0x49, 0x00, +0x43, 0x3B, 0x2E, 0x18, 0x03, 0x23, 0x8F, 0x41, +0xC1, 0xD1, 0x8D, 0x41, 0xD5, 0xEB, 0x2F, 0x18, +0x03, 0x23, 0xE5, 0xA2, 0xE8, 0x06, 0x2E, 0x78, +0x03, 0x23, 0xE4, 0xE2, 0xE8, 0x34, 0xD5, 0x38, +0x3C, 0x30, 0x05, 0x1C, 0xC3, 0xF9, 0x82, 0x40, +0x3E, 0x2F, 0xFF, 0x08, 0x45, 0x70, 0x00, 0x38, +0xE1, 0xD1, 0xE8, 0x0A, 0x83, 0x02, 0x43, 0x89, +0x5C, 0x73, 0x8D, 0xC1, 0x02, 0x4C, 0x00, 0x04, +0x42, 0x00, 0x10, 0x00, 0xD5, 0xF6, 0xFE, 0x1C, +0x44, 0xD0, 0x00, 0x64, 0x40, 0x80, 0x35, 0x16, +0x85, 0x60, 0x3E, 0x9F, 0xFF, 0x08, 0x44, 0xA0, +0x00, 0x38, 0x2E, 0xE8, 0x03, 0x23, 0xE1, 0x6E, +0xE8, 0xDB, 0x83, 0x09, 0x43, 0x85, 0xA8, 0x73, +0x02, 0x4C, 0x00, 0x04, 0xE0, 0x88, 0xE8, 0x09, +0x80, 0x0B, 0x49, 0x00, 0x43, 0x01, 0x2F, 0x58, +0x03, 0x23, 0x8F, 0x61, 0x5B, 0x50, 0x01, 0xCD, +0x8D, 0x61, 0xD5, 0xEC, 0x3C, 0x50, 0x0F, 0xC5, +0x96, 0x6B, 0x90, 0x28, 0xC9, 0x07, 0x2E, 0x48, +0x03, 0x23, 0x4E, 0x46, 0x00, 0x69, 0x48, 0x00, +0x00, 0xAC, 0x3C, 0x60, 0x0F, 0xC5, 0x96, 0x30, +0xC0, 0xF7, 0x3C, 0x30, 0x0F, 0x34, 0x3C, 0x40, +0x0F, 0x35, 0x3D, 0xE0, 0x0E, 0x5F, 0x3D, 0x40, +0x0E, 0x5E, 0x96, 0x9B, 0x97, 0xE3, 0x40, 0x61, +0x78, 0xD6, 0x41, 0x33, 0xD2, 0x76, 0xE1, 0xE6, +0xE8, 0x06, 0x3C, 0x50, 0x0F, 0x35, 0x96, 0x6B, +0x40, 0x60, 0xD0, 0xD6, 0x3C, 0x00, 0x0F, 0xC5, +0x3C, 0x20, 0x0F, 0xC5, 0x96, 0xC3, 0x90, 0x68, +0xFF, 0x9C, 0x3C, 0x70, 0x10, 0xF4, 0x97, 0x10, +0x40, 0x93, 0x11, 0x36, 0xC7, 0x04, 0x86, 0xC3, +0x42, 0x94, 0xD8, 0x24, 0x3E, 0x6F, 0xFF, 0x08, +0x84, 0x00, 0x81, 0x46, 0x44, 0xB0, 0x00, 0x38, +0x85, 0x82, 0x2F, 0x98, 0x03, 0x23, 0xE0, 0x19, +0xE8, 0xC7, 0x50, 0xD0, 0x00, 0x01, 0x81, 0xCA, +0x80, 0xED, 0x42, 0xE0, 0x2C, 0x73, 0x2F, 0x08, +0x03, 0x23, 0xE0, 0xF0, 0xE8, 0x24, 0x81, 0x0A, +0x42, 0x83, 0xAC, 0x73, 0xB4, 0x0E, 0xB4, 0x28, +0x49, 0x00, 0x04, 0x0F, 0xE0, 0x09, 0xE8, 0x19, +0x23, 0x24, 0x00, 0x00, 0x23, 0x13, 0x00, 0x00, +0x23, 0x73, 0x00, 0x01, 0x89, 0xD1, 0x40, 0x59, +0x30, 0xB6, 0xAD, 0x70, 0x23, 0x34, 0x00, 0x01, +0x80, 0x07, 0x89, 0xF7, 0x40, 0x19, 0xB0, 0x36, +0xAC, 0x71, 0x49, 0x00, 0x42, 0x95, 0x2F, 0x88, +0x03, 0x23, 0x8E, 0xE1, 0x5B, 0x80, 0x01, 0x04, +0x8C, 0xE1, 0xD5, 0xDA, 0x50, 0x63, 0x00, 0x38, +0x80, 0x0D, 0xD5, 0xCC, 0x2E, 0x37, 0xF3, 0xD8, +0xCB, 0x04, 0x3D, 0x50, 0x05, 0x03, 0xD5, 0x41, +0x3C, 0x20, 0x05, 0x09, 0x96, 0xAE, 0xC2, 0x3F, +0x3C, 0x70, 0x10, 0xF2, 0x3D, 0xE4, 0x05, 0x02, +0x97, 0x7B, 0xE0, 0xBE, 0xE8, 0x38, 0x3C, 0x10, +0x10, 0xF4, 0xC9, 0x35, 0x3C, 0x57, 0xF9, 0xEB, +0x3C, 0x60, 0x05, 0x03, 0xD6, 0x30, 0x3D, 0x40, +0x0E, 0x5F, 0x40, 0x72, 0xD0, 0x76, 0x40, 0x03, +0x50, 0x57, 0x3C, 0x60, 0x10, 0xF3, 0x8A, 0xE0, +0x96, 0x3B, 0x9A, 0x5A, 0x43, 0x90, 0x00, 0x03, +0x96, 0xF3, 0x97, 0x4B, 0xE0, 0x79, 0x43, 0x62, +0x80, 0x03, 0xE9, 0x06, 0x3C, 0x20, 0x10, 0xF3, +0x96, 0x53, 0xE0, 0x36, 0xE8, 0x18, 0xE4, 0x83, +0xE8, 0x07, 0x85, 0x43, 0x3C, 0xA8, 0x10, 0xF4, +0x3C, 0x90, 0x10, 0xFB, 0xD5, 0x06, 0x86, 0x01, +0x3D, 0x08, 0x10, 0xF4, 0x3C, 0x90, 0x11, 0x13, +0x85, 0x60, 0x3C, 0x9B, 0xF9, 0xE8, 0x3C, 0xBB, +0xF9, 0xE4, 0x48, 0x00, 0x01, 0x9D, 0x86, 0xBF, +0x3D, 0x5B, 0xF9, 0xEB, 0x3C, 0xC0, 0x10, 0xF4, +0x5A, 0xC0, 0x01, 0x08, 0x3C, 0xD0, 0x10, 0xF4, +0x5A, 0xD0, 0x03, 0x04, 0x48, 0x00, 0x01, 0x0B, +0x3C, 0x40, 0x10, 0xFC, 0x97, 0x63, 0xE4, 0xA2, +0x4E, 0xF3, 0x00, 0xAC, 0x3C, 0x00, 0x10, 0xF0, +0x49, 0x00, 0x49, 0x84, 0x2E, 0x68, 0x03, 0x23, +0x3E, 0x00, 0x03, 0x1E, 0xC6, 0x02, 0xC8, 0x08, +0x84, 0xE0, 0x3E, 0x70, 0x03, 0x1C, 0x3E, 0x70, +0x03, 0x23, 0x48, 0x00, 0x00, 0xF4, 0x5A, 0x08, +0x01, 0x04, 0x48, 0x00, 0x00, 0x97, 0x5A, 0x68, +0x01, 0x04, 0x48, 0x00, 0x00, 0x93, 0x3C, 0x30, +0x10, 0xF5, 0x96, 0xEE, 0x4E, 0x32, 0x00, 0xE7, +0x85, 0x60, 0x3E, 0x7F, 0xFF, 0x08, 0x81, 0xA7, +0x81, 0x4B, 0x81, 0x8B, 0x80, 0xAB, 0x81, 0x2B, +0x82, 0x6B, 0x50, 0x8F, 0x80, 0x38, 0x2E, 0xE8, +0x03, 0x23, 0xE1, 0xEE, 0xE8, 0x5E, 0x85, 0xC1, +0x41, 0x57, 0x4C, 0x0C, 0x41, 0x4A, 0x80, 0x11, +0x84, 0xC0, 0x2F, 0xE0, 0x03, 0x1E, 0xE0, 0xDE, +0xE8, 0x50, 0x3E, 0x3F, 0xFF, 0x08, 0x15, 0x3F, +0x80, 0x01, 0x41, 0x31, 0x98, 0x20, 0x23, 0x09, +0x81, 0xCC, 0x3C, 0x00, 0x0E, 0x5F, 0x3D, 0x10, +0x0E, 0x66, 0x3D, 0x20, 0x0E, 0x67, 0xF5, 0x82, +0x3D, 0x60, 0x0E, 0x64, 0x40, 0x58, 0x00, 0x96, +0x3D, 0x90, 0x0E, 0x65, 0x11, 0x14, 0x00, 0x02, +0x11, 0x24, 0x00, 0x03, 0x11, 0x64, 0x00, 0x00, +0x11, 0x94, 0x00, 0x01, 0x96, 0xE9, 0x3A, 0x04, +0x04, 0x00, 0xB0, 0x8C, 0x97, 0x21, 0x15, 0x4F, +0x80, 0x03, 0x49, 0x00, 0x16, 0x27, 0x21, 0x5F, +0x80, 0x30, 0x21, 0x26, 0x80, 0x0D, 0x21, 0x76, +0x80, 0x0C, 0xE1, 0xD5, 0x21, 0x86, 0x80, 0x0E, +0x21, 0x16, 0x80, 0x0F, 0x20, 0x3F, 0x80, 0x31, +0x20, 0x2F, 0x80, 0x32, 0x20, 0x1F, 0x80, 0x33, +0x05, 0x3F, 0x80, 0x01, 0xF5, 0x02, 0x05, 0x4F, +0x80, 0x03, 0xE9, 0x11, 0xE0, 0x77, 0xE9, 0x0F, +0xE1, 0xA2, 0xE9, 0x0D, 0xE0, 0x38, 0xE9, 0x0B, +0x40, 0x06, 0x18, 0x0E, 0x97, 0x04, 0x40, 0x32, +0x98, 0x0E, 0x4E, 0x42, 0x01, 0xBA, 0x96, 0x9C, +0x4E, 0x22, 0x01, 0xB7, 0x8C, 0xC1, 0xD5, 0xAE, +0x8D, 0xE1, 0x50, 0xD6, 0x80, 0x38, 0xD5, 0xA0, +0x84, 0xC0, 0x2E, 0x88, 0x03, 0x23, 0xE0, 0xC8, +0xE8, 0x0C, 0x40, 0x04, 0x98, 0x0E, 0x96, 0x84, +0xCA, 0x13, 0x80, 0x06, 0x49, 0x00, 0x41, 0x9C, +0x2E, 0x18, 0x03, 0x23, 0x8E, 0xC1, 0xC9, 0x0C, +0x2E, 0x48, 0x03, 0x23, 0xCC, 0x0B, 0x49, 0x00, +0x10, 0xB6, 0x2F, 0x70, 0x03, 0x22, 0x59, 0x8B, +0x80, 0x01, 0x48, 0xFF, 0xFD, 0xEC, 0x8C, 0xC1, +0xD5, 0xE5, 0x85, 0x20, 0x5A, 0x48, 0x01, 0x26, +0x49, 0x00, 0x08, 0xE6, 0x48, 0x00, 0x01, 0xB7, +0x20, 0x53, 0x80, 0x0D, 0x20, 0x33, 0x80, 0x0C, +0x2A, 0xC6, 0x80, 0x01, 0x9B, 0xAB, 0x8C, 0xC1, +0x43, 0x33, 0x00, 0x03, 0xE5, 0xE4, 0x3C, 0xE0, +0x0E, 0x5F, 0xE8, 0x1B, 0x20, 0x23, 0x80, 0x0F, +0x20, 0x33, 0x80, 0x0E, 0x9B, 0x93, 0x8C, 0xC1, +0x43, 0x03, 0x00, 0x03, 0xE5, 0x84, 0xE8, 0x27, +0x8D, 0x01, 0x2F, 0x20, 0x03, 0x1E, 0xE1, 0x12, +0xE9, 0xE4, 0x8D, 0x21, 0x50, 0x73, 0x80, 0x38, +0x2F, 0x18, 0x03, 0x23, 0xE1, 0x31, 0xE8, 0x32, +0x3E, 0xD8, 0x02, 0xA0, 0x85, 0x00, 0xD5, 0xF2, +0x40, 0x05, 0x20, 0x0E, 0x96, 0x84, 0xCA, 0xE3, +0x40, 0x16, 0x38, 0x36, 0x97, 0x09, 0xE0, 0x83, +0xE9, 0xDE, 0xE0, 0xA4, 0xE9, 0xDC, 0x80, 0x0C, +0xB0, 0x4B, 0x49, 0x00, 0x16, 0x1A, 0xB0, 0x0B, +0x49, 0x00, 0x3C, 0x53, 0x02, 0x5F, 0x80, 0x17, +0xAD, 0x79, 0xD5, 0xD1, 0x40, 0x05, 0xA0, 0x0E, +0x96, 0x44, 0xC9, 0xD7, 0x40, 0x06, 0x38, 0x96, +0x97, 0x61, 0xE0, 0xA3, 0xE9, 0xD2, 0xE0, 0x45, +0xE9, 0xD0, 0x22, 0x06, 0xFF, 0xFF, 0xB0, 0x4B, +0x49, 0x00, 0x16, 0x03, 0xB0, 0x0B, 0x49, 0x00, +0x3C, 0x3C, 0x02, 0x2F, 0x80, 0x16, 0xAC, 0xB8, +0xD5, 0xC4, 0x2E, 0xB7, 0xE1, 0x5D, 0x5A, 0xB0, +0x02, 0x57, 0x2E, 0xE7, 0xF3, 0xB6, 0x5A, 0xE8, +0x01, 0x06, 0x3C, 0x60, 0x0F, 0x64, 0x97, 0xA6, +0xCE, 0x4E, 0x3D, 0x40, 0x05, 0x19, 0x3D, 0x00, +0x05, 0x10, 0xE3, 0x94, 0xE8, 0x03, 0x3D, 0x48, +0x05, 0x10, 0x3C, 0xD0, 0x05, 0x1A, 0x3D, 0x10, +0x05, 0x10, 0xE3, 0xAD, 0xE8, 0x03, 0x3C, 0xD8, +0x05, 0x10, 0x84, 0xE0, 0x3C, 0x10, 0x0F, 0x33, +0x3C, 0x34, 0x05, 0x02, 0x96, 0x8B, 0xFE, 0x9C, +0x44, 0x50, 0x00, 0x64, 0x40, 0x91, 0x15, 0x37, +0x3C, 0xA0, 0x05, 0x10, 0xE1, 0x49, 0xE8, 0x03, +0x3C, 0x98, 0x05, 0x10, 0x2E, 0x60, 0x03, 0x22, +0x97, 0x8E, 0xC6, 0x0C, 0x3E, 0x08, 0x03, 0x4C, +0x84, 0x20, 0x49, 0x00, 0x3B, 0x20, 0xC8, 0x24, +0x2F, 0x50, 0x03, 0x22, 0x67, 0x4A, 0x80, 0x02, +0xD5, 0x1B, 0x2E, 0x48, 0x03, 0x23, 0x3C, 0xB0, +0x05, 0x10, 0xC4, 0x05, 0x3D, 0x34, 0x04, 0xF9, +0xE1, 0xEB, 0xE9, 0x16, 0x3C, 0xC0, 0x05, 0x18, +0xE3, 0x6C, 0xE8, 0x03, 0x3C, 0xC8, 0x05, 0x10, +0x3E, 0x08, 0x03, 0x4C, 0x84, 0x20, 0x49, 0x00, +0x3B, 0x06, 0x5A, 0x08, 0x01, 0x0A, 0x2E, 0xD0, +0x03, 0x22, 0x59, 0x46, 0x80, 0x02, 0x3F, 0x40, +0x03, 0x22, 0xD5, 0x02, 0x84, 0xE0, 0x3C, 0x03, +0xF6, 0x81, 0x2E, 0x18, 0x03, 0x23, 0x2E, 0x58, +0x03, 0x26, 0xC0, 0x20, 0x4E, 0x57, 0x00, 0x1F, +0xE0, 0xA1, 0xE8, 0x1C, 0x3C, 0x20, 0x0F, 0x3B, +0x2F, 0x60, 0x03, 0x22, 0x96, 0xD3, 0x3D, 0x8C, +0x00, 0xCD, 0x90, 0x61, 0x59, 0x7B, 0x00, 0x01, +0xE0, 0x78, 0x3F, 0x70, 0x03, 0x22, 0xE8, 0x0E, +0x3C, 0x8C, 0x00, 0xCC, 0xE5, 0x03, 0xE8, 0x0A, +0x49, 0x00, 0x0F, 0xD9, 0x3C, 0x9C, 0x00, 0xCC, +0x8D, 0x21, 0x3C, 0x9E, 0x00, 0xCC, 0x48, 0x00, +0x00, 0xE2, 0xD9, 0x04, 0x87, 0xC0, 0x3D, 0xEE, +0x00, 0xCC, 0xC7, 0x05, 0x49, 0x00, 0x0F, 0xCB, +0x48, 0x00, 0x00, 0xD9, 0x2E, 0x60, 0x03, 0x22, +0xC9, 0x09, 0x97, 0x8E, 0x4E, 0x62, 0xFC, 0xA9, +0x84, 0x01, 0x49, 0x00, 0x41, 0x38, 0x48, 0x00, +0x00, 0xCE, 0x59, 0x93, 0x00, 0x01, 0x3F, 0x90, +0x03, 0x22, 0x49, 0x00, 0x0F, 0xB8, 0x49, 0x00, +0x21, 0x1C, 0x2F, 0x20, 0x03, 0x23, 0x3F, 0x20, +0x03, 0x26, 0x4E, 0x02, 0x00, 0xC0, 0x3E, 0x70, +0x03, 0x38, 0x3C, 0x7B, 0xF9, 0xDD, 0x49, 0x00, +0x1F, 0x32, 0x2E, 0x77, 0xF3, 0xB7, 0x4E, 0x72, +0x00, 0xB6, 0x3C, 0x40, 0x0F, 0x64, 0x97, 0x26, +0x4E, 0x42, 0x00, 0xB1, 0x2E, 0x07, 0xF3, 0xB9, +0xC0, 0x06, 0x3D, 0x13, 0xED, 0x8C, 0x59, 0x08, +0x80, 0x20, 0xD5, 0x09, 0x2E, 0x17, 0xF3, 0xB8, +0x4E, 0x12, 0x00, 0xA5, 0x3C, 0xE3, 0xED, 0x8C, +0x59, 0x07, 0x00, 0x10, 0x3D, 0x0B, 0xED, 0x8C, +0x48, 0x00, 0x00, 0x9D, 0x2E, 0x77, 0xF3, 0xDF, +0x4E, 0x72, 0xFC, 0x6F, 0x3C, 0x60, 0x05, 0x02, +0x84, 0xE1, 0x95, 0x31, 0x3C, 0x48, 0x05, 0x02, +0x48, 0xFF, 0xFF, 0x4E, 0x3D, 0x90, 0x10, 0xF4, +0x5B, 0x90, 0x01, 0x06, 0x3C, 0xE0, 0x10, 0xF4, +0x5A, 0xE8, 0x03, 0x0C, 0x3D, 0x20, 0x11, 0x00, +0x3C, 0x70, 0x11, 0x01, 0x41, 0x19, 0x00, 0x11, +0x97, 0xFB, 0x3C, 0x60, 0x11, 0x02, 0xD5, 0x0A, +0x3D, 0x00, 0x11, 0x0E, 0x3C, 0x60, 0x11, 0x0F, +0x41, 0x18, 0x00, 0x11, 0x97, 0xF3, 0x3C, 0x60, +0x11, 0x10, 0x97, 0xB3, 0x48, 0xFF, 0xF9, 0xFE, +0x51, 0x99, 0x02, 0xC0, 0x38, 0xF5, 0x65, 0x11, +0x40, 0xF7, 0x9C, 0x07, 0xE8, 0x10, 0x8D, 0xC1, +0x41, 0x29, 0x00, 0x11, 0x48, 0xFF, 0xFA, 0x2A, +0x51, 0x13, 0x82, 0xE0, 0x39, 0x25, 0x45, 0x11, +0xE1, 0xC6, 0xE8, 0x05, 0x8C, 0xE1, 0x97, 0xFB, +0x48, 0xFF, 0xFA, 0x2E, 0x3C, 0x44, 0x01, 0x8D, +0xE0, 0x80, 0xE8, 0x05, 0x3C, 0x08, 0x01, 0x8D, +0x3C, 0x18, 0x01, 0x8C, 0x5A, 0x88, 0x14, 0x20, +0x3C, 0x64, 0x01, 0x3C, 0x3E, 0xE8, 0x02, 0x7A, +0x39, 0x25, 0x19, 0x11, 0x84, 0xE0, 0x84, 0x81, +0x2B, 0x07, 0x00, 0x01, 0x39, 0x15, 0x41, 0x11, +0xE1, 0xB2, 0x40, 0x72, 0x3C, 0x1B, 0x8C, 0x81, +0x97, 0x20, 0x41, 0x28, 0xBC, 0x1B, 0x5A, 0x48, +0x14, 0xF5, 0xE1, 0xC0, 0x4E, 0xF2, 0xFA, 0x16, +0x3E, 0x08, 0x02, 0x78, 0x38, 0x10, 0x1D, 0x09, +0x48, 0xFF, 0xFA, 0x10, 0x3E, 0x08, 0x02, 0x78, +0x38, 0x10, 0x21, 0x09, 0x8D, 0x01, 0x54, 0x84, +0x00, 0xFF, 0x48, 0xFF, 0xFA, 0x07, 0x96, 0x5C, +0xC1, 0x07, 0x41, 0xE7, 0x18, 0x0C, 0x40, 0xAF, +0x28, 0x04, 0x40, 0xA5, 0x00, 0x13, 0x40, 0x37, +0x18, 0x0C, 0xFF, 0x5F, 0x40, 0x0A, 0x24, 0x04, +0x97, 0x69, 0x96, 0x03, 0xC4, 0x05, 0x40, 0x91, +0xAC, 0x04, 0x40, 0xB4, 0x80, 0x13, 0x41, 0x67, +0x18, 0x0C, 0x40, 0xCB, 0x30, 0x04, 0x41, 0x90, +0x50, 0x04, 0x40, 0xC6, 0x00, 0x13, 0x40, 0x9C, +0x80, 0x13, 0x48, 0xFF, 0xFE, 0x2D, 0x9B, 0x8A, +0x39, 0x11, 0x99, 0x11, 0xE0, 0x11, 0x4E, 0xF3, +0xF9, 0xE1, 0x39, 0x09, 0x99, 0x11, 0x48, 0xFF, +0xF9, 0x39, 0xFC, 0xE8, 0xFC, 0x00, 0x49, 0x00, +0x0A, 0x79, 0x84, 0x20, 0x80, 0x41, 0x3E, 0x4F, +0xED, 0x24, 0xE0, 0x40, 0xE8, 0x11, 0x38, 0x32, +0x08, 0x00, 0x5A, 0x10, 0x01, 0x09, 0x5A, 0x10, +0x02, 0x0E, 0xC9, 0x08, 0x84, 0x21, 0x5A, 0x38, +0x80, 0x05, 0xD5, 0x04, 0x5A, 0x30, 0x80, 0x03, +0x84, 0x22, 0x8C, 0x41, 0xD5, 0xEF, 0x5A, 0x10, +0x01, 0x0A, 0x3C, 0x13, 0xF9, 0xBB, 0x5A, 0x18, +0x0A, 0x10, 0x2E, 0x17, 0xED, 0x24, 0x5A, 0x18, +0x01, 0x04, 0x80, 0x01, 0xD5, 0x1B, 0x84, 0x01, +0x5A, 0x10, 0x40, 0x19, 0x50, 0x00, 0xFF, 0x80, +0x5C, 0x00, 0x00, 0x01, 0xD5, 0x13, 0x84, 0xC0, +0x82, 0x06, 0x82, 0x26, 0x3E, 0x2F, 0xED, 0x24, +0xE1, 0xA0, 0xE8, 0x0A, 0x38, 0x51, 0x44, 0x00, +0x5A, 0x58, 0x80, 0x04, 0x8D, 0x81, 0xD5, 0x02, +0x8C, 0xC1, 0x8D, 0xA1, 0xD5, 0xF6, 0x40, 0x03, +0x40, 0x07, 0xFC, 0x80, 0xFC, 0x23, 0x49, 0x00, +0x0A, 0x39, 0x84, 0x80, 0xB6, 0x9F, 0xF4, 0x81, +0xF4, 0x82, 0xF4, 0x83, 0x80, 0xA4, 0x84, 0x21, +0x44, 0x20, 0x00, 0xE0, 0x44, 0x30, 0x00, 0x40, +0xF0, 0x85, 0x49, 0x00, 0x09, 0x96, 0x80, 0x80, +0x84, 0x01, 0x4E, 0x43, 0x00, 0x80, 0xB6, 0x9F, +0xF4, 0x81, 0xF4, 0x82, 0xF4, 0x83, 0x80, 0xA4, +0xF0, 0x05, 0x84, 0x21, 0x84, 0x4E, 0x84, 0x64, +0x49, 0x00, 0x09, 0x87, 0x80, 0x80, 0x84, 0x02, +0xCC, 0x71, 0xB6, 0x9F, 0xF4, 0x81, 0xF4, 0x82, +0xF4, 0x83, 0x80, 0xA4, 0xF0, 0x05, 0x84, 0x21, +0x44, 0x20, 0x00, 0x38, 0xFA, 0x60, 0x49, 0x00, +0x09, 0x78, 0x80, 0x80, 0x84, 0x03, 0xCC, 0x62, +0x84, 0x21, 0xB6, 0x9F, 0xF4, 0x81, 0xF4, 0x82, +0xF4, 0x83, 0xF0, 0x05, 0x44, 0x20, 0x00, 0x83, +0x80, 0x61, 0x80, 0xA4, 0x49, 0x00, 0x09, 0x69, +0xC8, 0x4C, 0x44, 0x20, 0x00, 0x83, 0x84, 0x61, +0xF0, 0x82, 0xF0, 0x83, 0xB6, 0x5F, 0xF3, 0x81, +0xF0, 0x05, 0x84, 0x23, 0xFA, 0x8C, 0x84, 0xA8, +0x49, 0x00, 0x09, 0x5B, 0xC8, 0x40, 0xFA, 0x2F, +0x44, 0x00, 0x00, 0x80, 0x44, 0x20, 0x00, 0xF1, +0x44, 0x70, 0x00, 0xC1, 0xF0, 0x81, 0xF1, 0x82, +0xF1, 0x83, 0xB6, 0xFF, 0xF0, 0x05, 0x84, 0x24, +0x80, 0x62, 0x84, 0x87, 0x84, 0xA2, 0x49, 0x00, +0x09, 0x48, 0x84, 0xC7, 0xC8, 0x2E, 0xB6, 0xDF, +0xF6, 0x81, 0xF7, 0x82, 0xF7, 0x83, 0xF0, 0x05, +0x84, 0x24, 0x80, 0x46, 0x80, 0x66, 0x80, 0x87, +0x80, 0xA7, 0x49, 0x00, 0x09, 0x3A, 0xC8, 0x23, +0x84, 0x22, 0xB6, 0x1F, 0xF0, 0x81, 0xF0, 0x82, +0xF0, 0x83, 0xFA, 0x4C, 0xF0, 0x05, 0x84, 0x68, +0x80, 0x86, 0x80, 0xA1, 0x49, 0x00, 0x09, 0x2D, +0xC8, 0x18, 0xF0, 0x05, 0x49, 0x00, 0x0D, 0x0E, +0xC8, 0x09, 0xF0, 0x05, 0x49, 0x00, 0x0D, 0x0A, +0xC8, 0x05, 0xF0, 0x05, 0x49, 0x00, 0x0D, 0x06, +0xC0, 0x0D, 0x3C, 0x03, 0xF9, 0xBA, 0xD5, 0x0A, +0x84, 0x04, 0xD5, 0x08, 0x84, 0x06, 0xD5, 0x06, +0x80, 0x06, 0xD5, 0x04, 0x84, 0x08, 0xD5, 0x02, +0x84, 0x05, 0xFC, 0xA3, 0x80, 0x62, 0x9B, 0x1A, +0x97, 0x61, 0xE2, 0xA0, 0xE8, 0x08, 0xB4, 0x81, +0x8C, 0x61, 0x97, 0x60, 0x10, 0x51, 0xFF, 0xFF, +0x8C, 0x24, 0xD5, 0xF6, 0xDD, 0x9E, 0x80, 0x61, +0x9B, 0x19, 0x97, 0x61, 0xE2, 0xA2, 0xE8, 0x08, +0xA7, 0x18, 0x8C, 0x04, 0x97, 0x60, 0x14, 0x50, +0x7F, 0xFF, 0x8C, 0x61, 0xD5, 0xF6, 0xDD, 0x9E, +0xFC, 0x02, 0x12, 0x0F, 0x80, 0x03, 0x22, 0x0F, +0x80, 0x03, 0x4E, 0x07, 0x00, 0x1B, 0xD5, 0x15, +0x84, 0x0A, 0x14, 0x0F, 0x80, 0x03, 0xD5, 0x06, +0x40, 0x00, 0x00, 0x09, 0xF0, 0x03, 0x8E, 0x01, +0xF0, 0x83, 0xF0, 0x03, 0x4E, 0x06, 0xFF, 0xFA, +0x22, 0x0F, 0x80, 0x03, 0x96, 0x01, 0x8E, 0x01, +0x40, 0x00, 0x00, 0x13, 0x12, 0x0F, 0x80, 0x03, +0x22, 0x0F, 0x80, 0x03, 0x4E, 0x06, 0xFF, 0xEA, +0xFC, 0x82, 0xFC, 0x02, 0x12, 0x0F, 0x80, 0x03, +0x22, 0x0F, 0x80, 0x03, 0x4E, 0x07, 0x00, 0x1C, +0xD5, 0x16, 0x92, 0x00, 0x44, 0x00, 0x00, 0x64, +0xF0, 0x83, 0xD5, 0x06, 0x40, 0x00, 0x00, 0x09, +0xF0, 0x03, 0x8E, 0x01, 0xF0, 0x83, 0xF0, 0x03, +0x4E, 0x06, 0xFF, 0xFA, 0x22, 0x0F, 0x80, 0x03, +0x96, 0x01, 0x8E, 0x01, 0x40, 0x00, 0x00, 0x13, +0x12, 0x0F, 0x80, 0x03, 0x22, 0x0F, 0x80, 0x03, +0x4E, 0x06, 0xFF, 0xEA, 0xFC, 0x82, 0xFC, 0x01, +0x96, 0xCB, 0x96, 0x83, 0x90, 0x30, 0x90, 0x10, +0x8A, 0x43, 0x8A, 0x01, 0x42, 0x00, 0x00, 0x03, +0x42, 0x11, 0x00, 0x03, 0x88, 0x01, 0xFC, 0x81, +0xE6, 0x02, 0xE9, 0x14, 0x44, 0x30, 0x00, 0x64, +0x84, 0x21, 0x40, 0x20, 0x04, 0x57, 0x88, 0x41, +0x40, 0x11, 0x04, 0x09, 0x42, 0x50, 0x84, 0x24, +0x9F, 0x29, 0xE2, 0x04, 0xE9, 0x04, 0x8C, 0xA1, +0xE2, 0xA0, 0xE8, 0x03, 0x8E, 0x61, 0xCB, 0xF2, +0x80, 0x01, 0xDD, 0x9E, 0xFC, 0x61, 0x3C, 0x93, +0xF9, 0xBB, 0x5A, 0x98, 0x0A, 0x06, 0x3C, 0x0D, +0xFC, 0xDB, 0x12, 0x90, 0x00, 0xFC, 0x84, 0xE0, +0x81, 0x67, 0x3E, 0x5F, 0xDB, 0x18, 0x87, 0x06, +0x3C, 0x10, 0x0E, 0x89, 0x97, 0x0B, 0xE1, 0x64, +0xE8, 0x0C, 0x83, 0x25, 0x43, 0x95, 0xE0, 0x73, +0x02, 0x4C, 0x80, 0x04, 0x42, 0x12, 0x20, 0x0B, +0xC1, 0x02, 0x8C, 0xE1, 0x8D, 0x61, 0xD5, 0xF1, +0xE4, 0xE2, 0xE9, 0x04, 0x84, 0x40, 0x3E, 0x27, +0xF3, 0x9D, 0x2E, 0x37, 0xF3, 0x9D, 0xCB, 0x04, +0x4E, 0x73, 0x01, 0x23, 0xD5, 0x07, 0x5A, 0x70, +0x01, 0x0A, 0xCF, 0x10, 0x3C, 0x5D, 0xFC, 0xE3, +0xCD, 0x0D, 0x49, 0x00, 0x2E, 0x50, 0x48, 0x00, +0x01, 0x18, 0x3C, 0x6D, 0xFC, 0xE3, 0xCE, 0x06, +0x3C, 0x00, 0x0F, 0xB1, 0x96, 0x43, 0x3C, 0x1F, +0xFC, 0xE1, 0x3C, 0x40, 0x0F, 0x64, 0x3C, 0x33, +0xED, 0x8C, 0x96, 0xA3, 0xFE, 0x9E, 0x4E, 0x22, +0x01, 0x08, 0x85, 0x00, 0x3E, 0x0F, 0xDB, 0x18, +0x85, 0x46, 0x3C, 0x50, 0x0E, 0x89, 0x97, 0xAB, +0xE1, 0x06, 0xE8, 0x10, 0x81, 0x60, 0x42, 0xB4, +0x28, 0x73, 0x02, 0x15, 0x80, 0x04, 0x42, 0x40, +0xA0, 0x0B, 0xC4, 0x06, 0x22, 0xE5, 0x80, 0x02, +0x22, 0xD5, 0x80, 0x03, 0xD5, 0x03, 0x8D, 0x01, +0xD5, 0xED, 0x5A, 0x78, 0x01, 0x4E, 0x3D, 0xCD, +0xFC, 0xE3, 0x3C, 0xAD, 0xFC, 0xDB, 0x5E, 0xFE, +0x00, 0x78, 0xE9, 0x37, 0x81, 0x6A, 0x84, 0xC0, +0x44, 0xC0, 0x7F, 0xFF, 0x81, 0x07, 0x0B, 0x05, +0x80, 0x01, 0x03, 0x15, 0x80, 0x77, 0x03, 0x25, +0x80, 0x00, 0x03, 0x35, 0x80, 0x78, 0x13, 0x0F, +0x80, 0x00, 0x13, 0x1F, 0x80, 0x01, 0x13, 0x2F, +0x80, 0x02, 0x13, 0x3F, 0x80, 0x03, 0xB4, 0x1F, +0xF1, 0x01, 0x49, 0xFF, 0xFF, 0x62, 0xE0, 0x0C, +0x40, 0x64, 0x3C, 0x1B, 0x8D, 0x01, 0x40, 0xC0, +0x3C, 0x1B, 0x4C, 0x8E, 0x7F, 0xE6, 0x41, 0x65, +0x18, 0x20, 0x5E, 0xF3, 0x00, 0x77, 0xE8, 0x0B, +0x02, 0x3B, 0x00, 0x01, 0x1A, 0x3B, 0x00, 0x01, +0x03, 0x7B, 0x00, 0x78, 0x8C, 0xC1, 0x13, 0x7B, +0x00, 0x77, 0xD5, 0xF4, 0x45, 0x40, 0x00, 0x77, +0x3D, 0x4F, 0xFC, 0xE3, 0x15, 0x45, 0x00, 0x7A, +0x3C, 0x2D, 0xFC, 0xE3, 0x83, 0x8A, 0x41, 0x55, +0x08, 0x20, 0x8C, 0x41, 0x12, 0xEA, 0x80, 0x00, +0x12, 0xDA, 0x80, 0x78, 0x3C, 0x2F, 0xFC, 0xE3, +0xBB, 0x7C, 0x8C, 0x61, 0xBB, 0xFC, 0x3C, 0xDD, +0xFC, 0xE3, 0x4E, 0xD7, 0x00, 0x9E, 0x4E, 0x73, +0x00, 0x9C, 0x3D, 0xCD, 0xFC, 0xDB, 0x41, 0x6E, +0x34, 0x20, 0x02, 0x5E, 0x00, 0x00, 0x02, 0xEE, +0x00, 0x78, 0x14, 0xDE, 0x00, 0x7A, 0x12, 0x5E, +0x00, 0xF0, 0x12, 0xEE, 0x00, 0xF2, 0x03, 0x7B, +0x7F, 0xFF, 0x13, 0x7E, 0x00, 0xF1, 0x03, 0x8B, +0x00, 0x77, 0x13, 0x8E, 0x00, 0xF3, 0x5A, 0xD0, +0x01, 0x13, 0x02, 0x7B, 0x7F, 0xFF, 0x02, 0xAB, +0x00, 0x77, 0x8A, 0xE5, 0x42, 0x03, 0x80, 0x03, +0x8B, 0x4E, 0x43, 0x95, 0x00, 0x03, 0xFE, 0x04, +0x42, 0x0C, 0xE4, 0x73, 0x49, 0xFF, 0xFF, 0x16, +0xB8, 0xFD, 0xD5, 0x02, 0xBF, 0xFD, 0x3C, 0x00, +0x0F, 0xAE, 0x87, 0xC0, 0x3D, 0xEF, 0xFC, 0xE3, +0x5A, 0x08, 0x01, 0x0C, 0x80, 0x1C, 0x50, 0x1E, +0x00, 0xF0, 0xBA, 0x7A, 0x49, 0xFF, 0xFE, 0x08, +0x3C, 0x0F, 0xFC, 0xDC, 0x48, 0x00, 0x00, 0x9A, +0xB9, 0x7D, 0x97, 0x0B, 0x3C, 0x48, 0x0F, 0x9E, +0x3C, 0x20, 0x0F, 0x9E, 0x3C, 0x50, 0x0F, 0xA1, +0x96, 0xD3, 0x97, 0xEB, 0xE0, 0xE3, 0xE8, 0x54, +0x3C, 0x00, 0x0F, 0x9C, 0x96, 0x83, 0x8E, 0x41, +0xE6, 0x45, 0x4E, 0xF2, 0x00, 0x86, 0x44, 0xF4, +0x20, 0x9C, 0x38, 0x07, 0x88, 0x00, 0x40, 0xF0, +0x3C, 0x00, 0xDD, 0x0F, 0x06, 0x22, 0x8E, 0xCA, +0xE2, 0x00, 0x80, 0x1C, 0x50, 0x1E, 0x00, 0xF0, +0xBA, 0x7A, 0x49, 0xFF, 0xFD, 0xA1, 0x3C, 0x0F, +0xFC, 0xDC, 0x5A, 0x08, 0x01, 0x3A, 0x85, 0xA3, +0x3C, 0xD8, 0x0F, 0x9B, 0xD5, 0x6E, 0x4E, 0x93, +0x00, 0x0A, 0x80, 0x1C, 0x50, 0x1E, 0x00, 0xF0, +0xBA, 0x7A, 0x49, 0xFF, 0xFD, 0x91, 0x3C, 0x0B, +0xF9, 0xBB, 0x3C, 0x83, 0xF9, 0xBB, 0x5A, 0x88, +0x01, 0x0F, 0x3C, 0x10, 0x0F, 0x9D, 0x3D, 0x4D, +0xFC, 0xDB, 0x86, 0xAA, 0x97, 0x4B, 0x14, 0x8A, +0x00, 0x7B, 0x3D, 0x5B, 0xF9, 0xBB, 0x3C, 0x5F, +0xFC, 0xE0, 0xD5, 0x1A, 0x5A, 0x88, 0x0A, 0x16, +0x3D, 0x1D, 0xFC, 0xDB, 0x84, 0x42, 0x14, 0x28, +0x80, 0x7B, 0x50, 0x08, 0x81, 0xE0, 0x50, 0x18, +0x81, 0xE4, 0x49, 0xFF, 0xFD, 0x71, 0x86, 0x40, +0x86, 0x60, 0x3C, 0x0F, 0xFC, 0xDC, 0x3D, 0x2B, +0xF9, 0xBB, 0x3D, 0x3F, 0xFC, 0xE0, 0xD5, 0x3D, +0x86, 0x00, 0x3D, 0x0B, 0xF9, 0xBB, 0x84, 0x00, +0xD5, 0x38, 0x50, 0x1E, 0x00, 0xF0, 0x04, 0x9E, +0x00, 0x7A, 0x84, 0x80, 0xE0, 0x89, 0xE8, 0x0B, +0x3C, 0x60, 0x0F, 0xA6, 0x38, 0xB0, 0x91, 0x01, +0x96, 0xF3, 0xE1, 0x63, 0xE8, 0x03, 0x8C, 0x81, +0xD5, 0xF6, 0x84, 0x80, 0x3C, 0x4F, 0xFC, 0xDC, +0xC4, 0xEB, 0x85, 0x83, 0x80, 0x1C, 0xBA, 0x7A, +0x3C, 0xC8, 0x0F, 0x9B, 0x49, 0xFF, 0xFD, 0x88, +0x3C, 0x0F, 0xFC, 0xDC, 0xD5, 0x0B, 0x3C, 0x70, +0x0F, 0xA5, 0x96, 0x3B, 0xE2, 0x01, 0xE8, 0xDC, +0x85, 0xC3, 0x3C, 0x48, 0x0F, 0xB0, 0x3C, 0xE8, +0x0F, 0x9B, 0x84, 0x01, 0xD5, 0x0E, 0xBA, 0x7A, +0x80, 0x1C, 0x50, 0x1E, 0x00, 0xF0, 0x49, 0xFF, +0xFD, 0x73, 0x96, 0x83, 0x3C, 0x0F, 0xFC, 0xDC, +0x3C, 0x28, 0x0F, 0x9A, 0xD5, 0x02, 0x80, 0x1E, +0xFC, 0xE1, 0xFC, 0x01, 0x3A, 0x1F, 0x88, 0x20, +0x4E, 0x05, 0x00, 0x19, 0x3C, 0x10, 0x0E, 0x5F, +0x20, 0xFF, 0x80, 0x00, 0x40, 0x40, 0x04, 0x16, +0xE0, 0x8F, 0xE9, 0x10, 0x20, 0x2F, 0x80, 0x01, +0xE0, 0x44, 0xE9, 0x0C, 0x20, 0x6F, 0x80, 0x02, +0x97, 0x41, 0xE0, 0xA6, 0xE9, 0x07, 0x21, 0x0F, +0x80, 0x03, 0xE1, 0x85, 0x56, 0x07, 0x80, 0x01, +0xD5, 0x02, 0x84, 0x00, 0xFC, 0x81, 0xFC, 0x60, +0x3C, 0x00, 0x0E, 0xD4, 0x96, 0x43, 0x4E, 0x17, +0x00, 0x08, 0x3C, 0x20, 0x0E, 0xD4, 0x96, 0xD3, +0x5E, 0xF1, 0x80, 0x21, 0xE9, 0x04, 0xFA, 0x90, +0x3C, 0x48, 0x0E, 0xD4, 0x3C, 0x50, 0x0E, 0xD5, +0x97, 0xAB, 0x4E, 0x67, 0x00, 0x07, 0x3C, 0x70, +0x0E, 0xD5, 0x96, 0x3B, 0xE4, 0x17, 0xE9, 0x04, +0xFB, 0x06, 0x3C, 0x88, 0x0E, 0xD5, 0x3C, 0x10, +0x0F, 0x34, 0x96, 0x8B, 0x4E, 0x26, 0x00, 0x06, +0x44, 0x90, 0x02, 0xD0, 0x3C, 0x98, 0x0F, 0x34, +0x3C, 0x30, 0x0F, 0x35, 0x97, 0x1B, 0x4E, 0x46, +0x00, 0x06, 0x44, 0xA0, 0x04, 0x00, 0x3C, 0xA8, +0x0F, 0x35, 0x3C, 0x50, 0x0E, 0x89, 0x97, 0xAB, +0xE4, 0xCB, 0xE8, 0x06, 0x3C, 0x70, 0x0E, 0x89, +0x96, 0x3B, 0x4E, 0x04, 0x00, 0x05, 0x85, 0x6A, +0x3C, 0xB8, 0x0E, 0x89, 0x3C, 0x10, 0x0E, 0x8D, +0x45, 0x00, 0x5A, 0x49, 0x96, 0x8B, 0x87, 0x80, +0x44, 0xCF, 0xE7, 0x00, 0x85, 0xA5, 0x85, 0xC1, +0x3C, 0x28, 0x0E, 0x84, 0x3C, 0xC8, 0x0F, 0x94, +0x3C, 0xD8, 0x0E, 0x86, 0x3C, 0xE8, 0x0F, 0x95, +0x3D, 0x08, 0x0E, 0x90, 0x3D, 0xC8, 0x0F, 0xDE, +0x49, 0x00, 0x40, 0x52, 0x3D, 0xC8, 0x0F, 0x8A, +0x84, 0x60, 0x3E, 0x4F, 0xDB, 0x18, 0x99, 0x5C, +0x8C, 0x66, 0x11, 0xC2, 0x80, 0x09, 0x5A, 0x38, +0x3C, 0xFC, 0x3E, 0x68, 0x0A, 0x60, 0x46, 0x90, +0x01, 0x00, 0x81, 0x46, 0x49, 0x00, 0x27, 0xC2, +0x49, 0x00, 0x40, 0x3E, 0x3C, 0x70, 0x05, 0x08, +0x97, 0xCE, 0xC7, 0x09, 0x3C, 0x00, 0x10, 0x3E, +0x96, 0x43, 0x4E, 0x17, 0x00, 0x05, 0x86, 0x21, +0x3F, 0x17, 0xED, 0x16, 0x86, 0x40, 0x3F, 0x27, +0xF3, 0xDE, 0x50, 0xB4, 0x80, 0x02, 0x49, 0x00, +0x24, 0x7B, 0x3C, 0x20, 0x10, 0xF4, 0xCA, 0x07, +0x3C, 0x50, 0x0F, 0x8A, 0x97, 0xEB, 0x67, 0x33, +0x80, 0x08, 0xD5, 0x06, 0x3C, 0x30, 0x0F, 0x8A, +0x97, 0x1B, 0x59, 0x32, 0x00, 0x08, 0x3C, 0x03, +0xF6, 0x81, 0x3D, 0x38, 0x0F, 0x8A, 0xC8, 0x07, +0x3C, 0x30, 0x0F, 0x8A, 0x97, 0x1B, 0x67, 0x42, +0x00, 0x10, 0xD5, 0x06, 0x3C, 0x10, 0x0F, 0x8A, +0x96, 0x8B, 0x59, 0x41, 0x00, 0x10, 0x2E, 0x57, +0xE1, 0x62, 0x3D, 0x48, 0x0F, 0x8A, 0xCD, 0x07, +0x3C, 0x10, 0x0F, 0x8A, 0x96, 0x8B, 0x67, 0x51, +0x00, 0x80, 0xD5, 0x06, 0x3C, 0x70, 0x0F, 0x8A, +0x96, 0x3B, 0x59, 0x50, 0x00, 0x80, 0x2E, 0x37, +0xF3, 0xB7, 0x3D, 0x58, 0x0F, 0x8A, 0xCB, 0x07, +0x3C, 0x70, 0x0F, 0x8A, 0x96, 0x3B, 0x67, 0x60, +0x01, 0x00, 0xD5, 0x06, 0x3C, 0x40, 0x0F, 0x8A, +0x97, 0x63, 0x59, 0x62, 0x81, 0x00, 0x2E, 0x17, +0xF3, 0xC3, 0x3D, 0x68, 0x0F, 0x8A, 0xC9, 0x07, +0x3C, 0x40, 0x0F, 0x8A, 0x97, 0x63, 0x67, 0x72, +0x82, 0x00, 0xD5, 0x06, 0x3C, 0x20, 0x0F, 0x8A, +0x96, 0xD3, 0x59, 0x71, 0x82, 0x00, 0x3D, 0x78, +0x0F, 0x8A, 0x49, 0x00, 0x2D, 0x50, 0x97, 0xC0, +0x5A, 0x70, 0x01, 0x96, 0x5A, 0x70, 0x02, 0xAB, +0x2E, 0x77, 0xF3, 0xDD, 0x4E, 0x72, 0x00, 0x9C, +0x84, 0xE0, 0x3C, 0x78, 0x0E, 0x8D, 0x3C, 0x40, +0x11, 0x74, 0x85, 0x60, 0x96, 0x63, 0x3C, 0x18, +0x0F, 0x74, 0x3C, 0x20, 0x11, 0x75, 0x87, 0x81, +0x96, 0x13, 0x3C, 0x08, 0x0E, 0x8B, 0x3C, 0x50, +0x11, 0x7B, 0x3E, 0xB7, 0xF3, 0xDD, 0x96, 0xEB, +0x3C, 0x38, 0x0F, 0x91, 0x3C, 0x40, 0x12, 0x18, +0x3F, 0xC0, 0x1C, 0xB9, 0x96, 0x63, 0x3C, 0x18, +0x0F, 0x92, 0x3C, 0x20, 0x12, 0x19, 0x96, 0x13, +0x3C, 0x08, 0x0F, 0x93, 0x3C, 0x50, 0x11, 0x76, +0x96, 0xEB, 0x3C, 0x38, 0x0E, 0x94, 0x3C, 0x40, +0x11, 0x76, 0x96, 0x63, 0x3C, 0x18, 0x0E, 0x95, +0x3C, 0x20, 0x11, 0x76, 0x96, 0x13, 0x3C, 0x08, +0x0E, 0x96, 0x3C, 0x50, 0x11, 0x76, 0x96, 0xEB, +0x3C, 0x38, 0x0E, 0x97, 0x3C, 0x40, 0x11, 0x76, +0x96, 0x63, 0x3C, 0x18, 0x0E, 0x98, 0x3C, 0x20, +0x11, 0x84, 0x96, 0x13, 0x3C, 0x08, 0x0F, 0x26, +0x3C, 0xD0, 0x11, 0x81, 0x3C, 0x50, 0x11, 0x83, +0x3C, 0xD8, 0x05, 0x24, 0x96, 0xEB, 0x3C, 0x38, +0x0E, 0xA9, 0x3C, 0x40, 0x11, 0x85, 0x96, 0x63, +0x3C, 0x18, 0x0E, 0xAF, 0x3C, 0x20, 0x11, 0x86, +0x96, 0x13, 0x3C, 0x08, 0x0F, 0x25, 0x3C, 0x50, +0x11, 0x87, 0x96, 0xEB, 0x3C, 0x38, 0x0F, 0x49, +0x3C, 0x40, 0x11, 0x88, 0x96, 0x63, 0x3C, 0x18, +0x0F, 0x4A, 0x3C, 0x20, 0x11, 0x89, 0x96, 0x13, +0x3C, 0x08, 0x0F, 0x4B, 0x3C, 0x50, 0x11, 0x7C, +0x96, 0xEB, 0x3C, 0x38, 0x0F, 0x5F, 0x3C, 0x40, +0x11, 0x7D, 0x96, 0x63, 0x3C, 0x18, 0x0F, 0x60, +0x3C, 0x20, 0x11, 0x7E, 0x96, 0x13, 0x3C, 0x08, +0x0F, 0x61, 0x3C, 0x50, 0x11, 0x7F, 0x96, 0xEB, +0x3C, 0x38, 0x0F, 0x62, 0x3C, 0x40, 0x11, 0x80, +0x96, 0x63, 0x3C, 0x18, 0x0F, 0x63, 0x3C, 0x20, +0x12, 0x14, 0x96, 0x13, 0x3C, 0x08, 0x0F, 0x3E, +0x3C, 0x50, 0x12, 0x15, 0x96, 0xEB, 0x3C, 0x38, +0x0F, 0x3F, 0x3C, 0x40, 0x12, 0x16, 0x96, 0x63, +0x3C, 0x18, 0x0F, 0x40, 0x3C, 0x20, 0x12, 0x17, +0x96, 0x13, 0x3C, 0x08, 0x0F, 0x41, 0x3C, 0x50, +0x0F, 0x64, 0x96, 0xEB, 0x59, 0x71, 0x88, 0x00, +0x3D, 0x78, 0x0F, 0x64, 0x3C, 0x78, 0x0F, 0x8A, +0x48, 0xFF, 0xFE, 0xF6, 0x2F, 0x87, 0xF3, 0xDE, +0x5B, 0x88, 0x02, 0x04, 0x48, 0xFF, 0xFE, 0xF0, +0x5B, 0x80, 0x03, 0x04, 0x48, 0x00, 0x00, 0xCD, +0x3C, 0x10, 0x0E, 0x8C, 0x3F, 0xCF, 0xDB, 0x60, +0x97, 0x4B, 0x58, 0xD2, 0x80, 0x01, 0x3C, 0xD8, +0x0E, 0x8C, 0x49, 0x00, 0x23, 0x6B, 0x81, 0xBC, +0x49, 0x00, 0x26, 0xA0, 0x3C, 0x00, 0x0E, 0x5D, +0x49, 0x00, 0x41, 0x46, 0x49, 0x00, 0x23, 0x68, +0x3C, 0x00, 0x0E, 0x5D, 0x49, 0x00, 0x41, 0x40, +0x49, 0x00, 0x23, 0x62, 0x3D, 0x50, 0x0E, 0x5D, +0x86, 0x20, 0xE1, 0xB5, 0xE8, 0x07, 0x39, 0x63, +0x45, 0x11, 0x39, 0x6E, 0x45, 0x09, 0x8D, 0xA1, +0xD5, 0xF9, 0x3C, 0x20, 0x0E, 0x60, 0x84, 0xA0, +0x94, 0x11, 0xD0, 0x0A, 0x98, 0xEE, 0x40, 0x86, +0x94, 0x00, 0x02, 0xC1, 0x85, 0x80, 0x12, 0xC4, +0x02, 0xC0, 0x8C, 0xA2, 0xD5, 0xF7, 0x3C, 0x30, +0x0E, 0x61, 0x84, 0xA0, 0x95, 0x19, 0xD4, 0x0A, +0x98, 0xAE, 0x40, 0x16, 0x94, 0x00, 0x03, 0x41, +0x05, 0xA0, 0x13, 0x40, 0x82, 0xE0, 0x8C, 0xA2, +0xD5, 0xF7, 0x85, 0x00, 0x85, 0x82, 0x3C, 0x40, +0x0E, 0xEB, 0x96, 0x23, 0xE1, 0x00, 0xE8, 0x44, +0x3C, 0x00, 0x0E, 0x5D, 0x49, 0x00, 0x41, 0x0C, +0x81, 0xDC, 0x49, 0x00, 0x40, 0x64, 0x49, 0x00, +0x23, 0x2B, 0x3C, 0x30, 0x0E, 0x5D, 0x86, 0x60, +0xE1, 0xE3, 0xE8, 0x0C, 0x39, 0x03, 0x4D, 0x11, +0x22, 0x57, 0x00, 0x00, 0x8D, 0xE1, 0x89, 0x85, +0x40, 0xF8, 0x31, 0xF6, 0x1A, 0xF7, 0x00, 0x01, +0xD5, 0xF4, 0x3D, 0x80, 0x0E, 0x60, 0x3E, 0x2F, +0xE0, 0xE0, 0x86, 0x20, 0xE1, 0xB8, 0xE8, 0x0E, +0x40, 0x03, 0x44, 0x20, 0x23, 0x91, 0x00, 0x00, +0x23, 0x20, 0x05, 0x80, 0x8D, 0xA1, 0x89, 0xD9, +0x41, 0xE9, 0x33, 0xD6, 0x1B, 0xE1, 0x00, 0x01, +0xD5, 0xF2, 0x3D, 0x40, 0x0E, 0x61, 0x3E, 0x1F, +0xE1, 0x20, 0x86, 0x00, 0xE1, 0x94, 0xE8, 0x0E, +0x41, 0x63, 0x40, 0x20, 0x23, 0x50, 0x80, 0x00, +0x22, 0x4B, 0x05, 0xA0, 0x8D, 0x81, 0x88, 0x95, +0x41, 0x72, 0x32, 0xF6, 0x1B, 0x70, 0x80, 0x01, +0xD5, 0xF2, 0x8D, 0x01, 0xD5, 0xB9, 0x49, 0x00, +0x3F, 0xEE, 0x44, 0x00, 0x7F, 0xFF, 0x49, 0x00, +0x20, 0x71, 0x3C, 0xE0, 0x0E, 0x5D, 0x86, 0x60, +0x44, 0x30, 0x7F, 0xFF, 0xE1, 0xEE, 0xE8, 0x08, +0x38, 0x53, 0x4D, 0x11, 0xDB, 0x03, 0x38, 0x3E, +0x4D, 0x09, 0x8D, 0xE1, 0xD5, 0xF8, 0x3C, 0x10, +0x0F, 0x92, 0x96, 0x4E, 0xC1, 0x17, 0xCF, 0x16, +0x49, 0x00, 0x22, 0xD0, 0x3C, 0x00, 0x0F, 0xDC, +0x49, 0x00, 0x25, 0x6C, 0x3C, 0x20, 0x11, 0x67, +0x3D, 0x20, 0x0F, 0xDD, 0x3F, 0xC8, 0x16, 0x38, +0x88, 0x52, 0x96, 0x11, 0x49, 0x00, 0x25, 0x9F, +0x84, 0xE1, 0x49, 0x00, 0x22, 0xC5, 0x48, 0xFF, +0xFF, 0x57, 0x3C, 0x70, 0x0E, 0x8C, 0x97, 0x7B, +0x66, 0xC2, 0x80, 0x01, 0x3C, 0xC8, 0x0E, 0x8C, +0x49, 0x00, 0x22, 0xB4, 0x86, 0x20, 0x3F, 0x17, +0xF3, 0xDE, 0x3D, 0xE0, 0x0E, 0x84, 0x5B, 0xE0, +0x07, 0xFE, 0x48, 0xFF, 0xFE, 0x38, 0x5B, 0x88, +0x01, 0x12, 0x3D, 0x90, 0x0E, 0x84, 0x5B, 0x90, +0x07, 0x0E, 0x3C, 0x00, 0x0E, 0xEF, 0x96, 0x03, +0x49, 0x00, 0x3E, 0x22, 0x80, 0x07, 0x3E, 0x77, +0xF3, 0xDE, 0x3C, 0x7B, 0xED, 0x8C, 0x49, 0x00, +0x3A, 0xA8, 0x3C, 0x10, 0x0E, 0x84, 0x96, 0x8B, +0xE4, 0x43, 0x4E, 0xF3, 0x01, 0x03, 0x3C, 0x80, +0x0E, 0x84, 0x5A, 0x80, 0x07, 0x0E, 0x3D, 0xE0, +0x0E, 0x84, 0x5B, 0xE0, 0x06, 0x0A, 0x3C, 0xC0, +0x0E, 0x84, 0x5A, 0xC0, 0x09, 0x06, 0x3C, 0xD0, +0x0E, 0x84, 0x5A, 0xD8, 0x0B, 0x15, 0x3C, 0x00, +0x0E, 0x5D, 0x49, 0x00, 0x40, 0x61, 0x49, 0x00, +0x22, 0x83, 0x3D, 0x90, 0x0E, 0x84, 0x5B, 0x98, +0x09, 0x04, 0x48, 0x00, 0x00, 0xDA, 0x49, 0x00, +0x3F, 0x7A, 0x84, 0x00, 0x49, 0x00, 0x1F, 0xFE, +0x48, 0x00, 0x00, 0xD3, 0x3C, 0xE0, 0x0E, 0x84, +0x5A, 0xE8, 0x11, 0x07, 0x84, 0x80, 0x3D, 0x70, +0x0E, 0x5D, 0x83, 0x04, 0xD5, 0x06, 0x3D, 0x00, +0x0E, 0x84, 0x5B, 0x08, 0x12, 0x2D, 0xD5, 0xF7, +0xE0, 0x97, 0xE8, 0x05, 0x39, 0x83, 0x11, 0x09, +0x8C, 0x81, 0xD5, 0xFB, 0x49, 0x00, 0x3F, 0x97, +0x3C, 0x50, 0x0E, 0x5F, 0x3E, 0x38, 0x0A, 0x60, +0x80, 0xE5, 0x86, 0x00, 0xE1, 0x85, 0xE8, 0x07, +0x03, 0x61, 0x85, 0xA0, 0x1B, 0x61, 0x80, 0x01, +0x8D, 0x81, 0xD5, 0xF9, 0x3C, 0x80, 0x0E, 0x5E, +0x89, 0x05, 0xE0, 0xE8, 0xE8, 0x0A, 0x9A, 0xBD, +0x41, 0x45, 0x08, 0x20, 0x23, 0x5A, 0x05, 0x80, +0x39, 0x55, 0x1D, 0x09, 0x8C, 0xE1, 0xD5, 0xF6, +0x49, 0x00, 0x22, 0x3C, 0x49, 0x00, 0x22, 0x40, +0x48, 0x00, 0x00, 0x9B, 0x3D, 0xC0, 0x0E, 0x84, +0x5B, 0xC8, 0x08, 0x04, 0x48, 0x00, 0x00, 0x95, +0x3D, 0x10, 0x0E, 0x84, 0x5B, 0x18, 0x0C, 0x06, +0x84, 0x00, 0x80, 0x20, 0x80, 0x40, 0xD5, 0x09, +0x3D, 0x20, 0x0E, 0x84, 0x5B, 0x28, 0x0D, 0x0A, +0x3C, 0x10, 0x11, 0x82, 0x84, 0x01, 0x84, 0x5F, +0x49, 0x00, 0x28, 0x05, 0x48, 0x00, 0x00, 0x81, +0x3D, 0x30, 0x0E, 0x84, 0x5B, 0x38, 0x0E, 0x06, +0x49, 0x00, 0x29, 0x54, 0x48, 0x00, 0x00, 0x79, +0x3D, 0x40, 0x0E, 0x84, 0x5B, 0x48, 0x0F, 0x60, +0x3C, 0x00, 0x0E, 0x93, 0xC0, 0x71, 0x49, 0x00, +0x29, 0xE6, 0x49, 0x00, 0x29, 0xE4, 0x86, 0x40, +0x3C, 0xE0, 0x0E, 0x5D, 0x3E, 0x08, 0x0A, 0x60, +0x3E, 0x18, 0x03, 0x4C, 0x83, 0x92, 0xE1, 0xCE, +0xE8, 0x09, 0x2B, 0x30, 0x00, 0x01, 0x39, 0xC0, +0xC9, 0x09, 0x13, 0x30, 0x02, 0xBF, 0x8D, 0xC1, +0xD5, 0xF7, 0x84, 0xE0, 0x3E, 0xC8, 0x03, 0x4C, +0x3C, 0x10, 0x0E, 0x93, 0x96, 0x8B, 0xE0, 0xE2, +0xE8, 0x1C, 0x49, 0x00, 0x29, 0xC8, 0x3C, 0xD0, +0x0E, 0x5D, 0x3E, 0x28, 0x0A, 0x60, 0x86, 0x00, +0xE1, 0x8D, 0xE8, 0x11, 0x2A, 0x41, 0x00, 0x01, +0x22, 0x31, 0x02, 0xBF, 0x39, 0xE6, 0x41, 0x01, +0x9B, 0x63, 0x43, 0x12, 0x80, 0x03, 0x89, 0xBE, +0x39, 0x16, 0x41, 0x09, 0x12, 0x41, 0x02, 0xBF, +0x8D, 0x81, 0xD5, 0xEF, 0x8C, 0xE1, 0xD5, 0xE1, +0x3D, 0x70, 0x0E, 0x5D, 0x85, 0x00, 0x3E, 0x58, +0x03, 0x4C, 0xE1, 0x17, 0xE8, 0x0C, 0x3C, 0x00, +0x0E, 0x93, 0x39, 0x82, 0xA1, 0x11, 0x96, 0x43, +0x41, 0x9C, 0x07, 0x36, 0x39, 0x92, 0xA1, 0x09, +0x8D, 0x01, 0xD5, 0xF4, 0x84, 0x80, 0x3E, 0x78, +0x03, 0x4C, 0xE0, 0x97, 0xE8, 0x08, 0x38, 0x33, +0x91, 0x11, 0x90, 0x61, 0x38, 0x33, 0x91, 0x09, +0x8C, 0x81, 0xD5, 0xF8, 0x86, 0xC0, 0x3D, 0x68, +0x0E, 0x93, 0xD5, 0x16, 0x49, 0x00, 0x2A, 0xDF, +0x49, 0x00, 0x0F, 0xF5, 0x80, 0xE0, 0x49, 0xFF, +0xEC, 0x35, 0xCF, 0x06, 0x3C, 0x53, 0xF6, 0x85, +0x8C, 0xA1, 0x3C, 0x5B, 0xF6, 0x85, 0x3D, 0x54, +0x05, 0x0B, 0x3D, 0x58, 0x0E, 0x91, 0x49, 0x00, +0x1D, 0xEA, 0x48, 0xFF, 0xFD, 0x2C, 0x44, 0x00, +0x00, 0x64, 0x49, 0x00, 0x29, 0x83, 0x49, 0x00, +0x1D, 0xE2, 0x3C, 0x00, 0x0E, 0xF3, 0x96, 0x03, +0x49, 0xFF, 0xFA, 0xC1, 0x48, 0xFF, 0xFD, 0x1F, +0x49, 0x00, 0x0F, 0xD5, 0x80, 0xE0, 0x49, 0xFF, +0xEC, 0x15, 0xCF, 0x06, 0x3C, 0x83, 0xF6, 0x85, +0x8D, 0x01, 0x3C, 0x8B, 0xF6, 0x85, 0x3C, 0xC7, +0xF6, 0x74, 0x3D, 0xE4, 0x05, 0x0B, 0x3D, 0xE8, +0x0E, 0x91, 0x4E, 0xC6, 0xFD, 0x0C, 0x3C, 0x30, +0x0F, 0x93, 0x97, 0x1C, 0xC4, 0x05, 0x2E, 0xD7, +0xE1, 0x5D, 0x5A, 0xD0, 0x02, 0x05, 0x3C, 0x50, +0x0F, 0xAE, 0xC5, 0x5E, 0x3C, 0x00, 0x0F, 0xAE, +0x97, 0xC3, 0x5A, 0x78, 0x01, 0x12, 0x3C, 0x10, +0x0F, 0x93, 0x96, 0x8C, 0xC2, 0x0D, 0x2E, 0xE7, +0xE1, 0x5D, 0x5A, 0xE0, 0x02, 0x0A, 0x49, 0xFF, +0xFA, 0xD7, 0x5A, 0x08, 0x06, 0x06, 0x3E, 0x77, +0xF3, 0xDC, 0x48, 0xFF, 0xFC, 0xEC, 0x3C, 0x30, +0x0F, 0x93, 0x97, 0x1C, 0xC4, 0x45, 0x2F, 0x07, +0xE1, 0x5D, 0x5B, 0x08, 0x02, 0x42, 0x3C, 0x5D, +0xFC, 0xE0, 0x4E, 0x57, 0x00, 0x0C, 0x3D, 0xC0, +0x0F, 0x9C, 0x5B, 0xC8, 0x02, 0x08, 0x8E, 0xA1, +0x3C, 0x5F, 0xFC, 0xE0, 0xCD, 0x03, 0x3C, 0x5B, +0xF9, 0xBB, 0x49, 0xFF, 0xFA, 0xB9, 0xC0, 0x2B, +0x84, 0x00, 0x49, 0x00, 0x29, 0x2B, 0x3C, 0x7D, +0xFC, 0xDC, 0x85, 0x60, 0x8C, 0xE1, 0x96, 0x7B, +0x3C, 0x18, 0x0F, 0x9A, 0x3C, 0x20, 0x0F, 0x9A, +0x97, 0xD3, 0x49, 0x00, 0x29, 0x48, 0x49, 0x00, +0x26, 0x3F, 0x3D, 0x1C, 0x07, 0x39, 0x3D, 0x2D, +0xFE, 0x58, 0x45, 0x30, 0x00, 0x40, 0x96, 0xF8, +0x14, 0xB8, 0x80, 0x02, 0x14, 0xB9, 0x00, 0x05, +0x13, 0x34, 0x80, 0x00, 0x12, 0x34, 0x80, 0x01, +0x49, 0x00, 0x26, 0x22, 0x49, 0x00, 0x29, 0x33, +0x3E, 0xB7, 0xF3, 0xDC, 0x3C, 0xBB, 0xF9, 0xBB, +0x48, 0xFF, 0xFC, 0x92, 0x2E, 0x00, 0x03, 0x22, +0xC8, 0x03, 0x49, 0x00, 0x29, 0x08, 0x3C, 0x40, +0x05, 0x09, 0x97, 0x64, 0xC5, 0x07, 0x2F, 0x47, +0xE1, 0x5D, 0x5B, 0x48, 0x02, 0x04, 0x48, 0xFF, +0xFC, 0x9A, 0x2E, 0x00, 0x03, 0x22, 0xC8, 0x03, +0x3E, 0x07, 0xF3, 0xDF, 0x2F, 0x57, 0xED, 0x1E, +0x5B, 0x58, 0x01, 0x03, 0xC8, 0x23, 0x3C, 0x10, +0x0F, 0x64, 0x3C, 0x73, 0xED, 0x8C, 0x96, 0x8B, +0xFE, 0xBE, 0xC2, 0x1C, 0x49, 0x00, 0x29, 0x0B, +0x84, 0x01, 0x49, 0x00, 0x1C, 0x6E, 0x49, 0x00, +0x25, 0xF3, 0x3C, 0x30, 0x05, 0x07, 0x2F, 0x60, +0x03, 0x22, 0x97, 0x1C, 0x3F, 0x67, 0xF3, 0xDF, +0xC4, 0x0D, 0x3C, 0x50, 0x0E, 0xF0, 0x84, 0x20, +0x96, 0x2B, 0x49, 0x00, 0x29, 0x13, 0x96, 0x00, +0xC0, 0x05, 0x44, 0x00, 0x00, 0x64, 0x49, 0x00, +0x28, 0xC9, 0x3C, 0x70, 0x05, 0x0A, 0x4E, 0x72, +0xFC, 0x6A, 0x3C, 0x13, 0xF9, 0xF1, 0x9C, 0x89, +0xE2, 0x27, 0x3C, 0x2B, 0xF9, 0xF1, 0x4E, 0xF3, +0xFC, 0x62, 0x49, 0x00, 0x28, 0xE4, 0x49, 0x00, +0x25, 0xDB, 0x3D, 0x8C, 0x07, 0x39, 0x84, 0x60, +0x86, 0xE0, 0x80, 0x18, 0x3D, 0x78, 0x0E, 0xF4, +0x3D, 0x78, 0x0E, 0xF5, 0xA8, 0xC2, 0x3D, 0x9D, +0xFE, 0x58, 0x84, 0x81, 0x14, 0x3C, 0x80, 0x05, +0x12, 0x34, 0x80, 0x00, 0x12, 0x35, 0x80, 0x00, +0xA9, 0x02, 0x49, 0x00, 0x25, 0xB9, 0x48, 0xFF, +0xFC, 0x46, 0x92, 0x00, 0xFC, 0x6A, 0x3C, 0x00, +0x05, 0x2E, 0xE6, 0x02, 0xE9, 0x04, 0x84, 0x21, +0x3C, 0x18, 0x05, 0x2E, 0x3C, 0x24, 0x0E, 0x55, +0x3C, 0x30, 0x05, 0x2B, 0x85, 0x20, 0xE0, 0x43, +0x3C, 0x9B, 0xF9, 0xE9, 0x3E, 0x90, 0x03, 0x23, +0x3E, 0x6F, 0xFF, 0x08, 0xE9, 0x07, 0x3C, 0x44, +0x0E, 0x52, 0x3C, 0x50, 0x05, 0x2A, 0xE0, 0x85, +0xE8, 0x08, 0x3C, 0x00, 0x10, 0xF4, 0x49, 0x00, +0x0B, 0x50, 0x84, 0x00, 0x48, 0x00, 0x01, 0x99, +0x3C, 0xA4, 0x05, 0x01, 0x3C, 0xB0, 0x0E, 0x64, +0x3E, 0x78, 0x03, 0x4C, 0x85, 0x01, 0xE1, 0x4B, +0x3C, 0x9B, 0xF9, 0xD4, 0x3C, 0x9B, 0xF9, 0xD2, +0x3C, 0x9B, 0xF9, 0xD3, 0x3C, 0x9B, 0xF9, 0xD9, +0x3C, 0x7E, 0x02, 0x7A, 0x3E, 0x87, 0xF3, 0xD9, +0x4E, 0xF3, 0x01, 0x73, 0x3D, 0x00, 0x0E, 0x65, +0xE1, 0x8A, 0x4E, 0xF3, 0x01, 0x6E, 0x3D, 0x14, +0x04, 0xFE, 0x3C, 0xC0, 0x0E, 0x66, 0xE1, 0xAC, +0x4E, 0xF3, 0x01, 0x67, 0x3D, 0x20, 0x0E, 0x67, +0xE1, 0xD1, 0x4E, 0xF3, 0x01, 0x62, 0x3C, 0x00, +0x10, 0xF0, 0x49, 0x00, 0x3F, 0xAB, 0x3E, 0x00, +0x03, 0x1E, 0xC8, 0x05, 0x3E, 0x90, 0x03, 0x1C, +0x48, 0x00, 0x01, 0x57, 0x3C, 0xD0, 0x10, 0xF5, +0x54, 0x16, 0x81, 0x00, 0xC1, 0x6A, 0x3C, 0x20, +0x05, 0x2E, 0xC2, 0x67, 0x2E, 0xA0, 0x03, 0x1C, +0x4E, 0xA2, 0x00, 0x64, 0xE2, 0x0A, 0xE9, 0x61, +0x84, 0xA0, 0x3C, 0xB0, 0x0E, 0x5F, 0x81, 0x25, +0x50, 0xCF, 0x80, 0x18, 0x85, 0xA1, 0xE1, 0x2A, +0x82, 0x2A, 0xE8, 0x33, 0x40, 0x83, 0x24, 0x20, +0x45, 0x20, 0x7F, 0xFF, 0x86, 0x1F, 0x86, 0x60, +0xE1, 0xE0, 0xE8, 0x1D, 0x40, 0x22, 0xCC, 0x0E, +0x97, 0x14, 0xCC, 0x17, 0x41, 0x53, 0x4C, 0x20, +0x23, 0x1A, 0x81, 0xCC, 0x23, 0x44, 0x01, 0xA4, +0x40, 0x38, 0xAC, 0x36, 0x40, 0x4A, 0x2C, 0x56, +0x8A, 0x83, 0x9A, 0xD1, 0x43, 0x62, 0x00, 0x03, +0x43, 0x11, 0x80, 0x03, 0x89, 0xB6, 0xE1, 0xB2, +0x41, 0x28, 0xBC, 0x1B, 0x41, 0x09, 0xBC, 0x1B, +0x8D, 0xE1, 0xD5, 0xE3, 0x5B, 0x07, 0xFF, 0x0C, +0x51, 0xC8, 0x01, 0xCC, 0x39, 0xE3, 0x71, 0x01, +0x40, 0xE6, 0xC0, 0x0C, 0x39, 0xE6, 0x25, 0x09, +0x40, 0x52, 0xB8, 0x04, 0x8D, 0x21, 0xD5, 0xCC, +0x86, 0xC1, 0x51, 0x7F, 0x80, 0x18, 0xE1, 0xA0, +0x86, 0x60, 0xE8, 0x14, 0x40, 0x42, 0xCC, 0x0E, +0x96, 0xE4, 0xCB, 0x0B, 0x51, 0x89, 0x81, 0xCC, +0x40, 0x1B, 0x4C, 0x0C, 0x39, 0x93, 0x61, 0x01, +0xFF, 0x4F, 0x39, 0x9B, 0xC5, 0x09, 0xD5, 0x04, +0x8D, 0xE1, 0xE1, 0xE0, 0xE9, 0xF0, 0x8D, 0xA1, +0xD5, 0xEB, 0xB0, 0x86, 0xE1, 0xE0, 0xE8, 0x09, +0x41, 0x43, 0x4C, 0x20, 0x39, 0x51, 0x4D, 0x01, +0x13, 0x5A, 0x01, 0xCC, 0x8D, 0xE1, 0xD5, 0xF7, +0x3F, 0xC8, 0x02, 0xA0, 0x85, 0x00, 0x50, 0xCF, +0x80, 0x10, 0x50, 0xBF, 0x80, 0x08, 0x44, 0x90, +0x00, 0x38, 0x85, 0x41, 0x2E, 0xE0, 0x03, 0x1E, +0x2F, 0xE8, 0x03, 0x23, 0xE1, 0x0E, 0x4E, 0xF2, +0x00, 0x90, 0x3D, 0x30, 0x05, 0x2E, 0x40, 0xFF, +0x4C, 0x07, 0xE9, 0x05, 0x5B, 0x38, 0x01, 0x04, +0x48, 0x00, 0x00, 0x87, 0x23, 0x8E, 0x00, 0x00, +0x3D, 0x90, 0x0E, 0x5F, 0x3D, 0x40, 0x0E, 0x64, +0x40, 0x3C, 0x64, 0x96, 0x3D, 0x50, 0x0E, 0x65, +0x3D, 0x60, 0x0E, 0x66, 0x3D, 0x70, 0x0E, 0x67, +0x11, 0x46, 0x00, 0x00, 0x11, 0x56, 0x00, 0x01, +0x11, 0x66, 0x00, 0x02, 0x11, 0x76, 0x00, 0x03, +0x3A, 0x06, 0x04, 0x00, 0x96, 0xD9, 0x80, 0x4B, +0x97, 0x21, 0x49, 0x00, 0x0B, 0xFB, 0x20, 0x35, +0x80, 0x01, 0x21, 0x15, 0x80, 0x00, 0x2E, 0x08, +0x03, 0x23, 0x3D, 0x27, 0xF9, 0xD2, 0x8A, 0x71, +0x22, 0x5E, 0x00, 0x00, 0x51, 0x00, 0x01, 0xA4, +0xE0, 0x72, 0x38, 0x53, 0x41, 0x09, 0xE9, 0x04, +0x9C, 0x59, 0x3C, 0x1B, 0xF9, 0xD2, 0x20, 0x45, +0x80, 0x03, 0x21, 0xE5, 0x80, 0x02, 0x3C, 0xD7, +0xF9, 0xD3, 0x8A, 0x9E, 0xE0, 0x8D, 0xE9, 0x04, +0x9C, 0xA1, 0x3C, 0x2B, 0xF9, 0xD3, 0x8C, 0x81, +0x8C, 0x61, 0xFE, 0xE4, 0x3D, 0x37, 0xF9, 0xD4, +0x97, 0x59, 0xE1, 0xE5, 0xE8, 0x03, 0x3C, 0x5B, +0xF9, 0xD4, 0x3A, 0x05, 0x84, 0x00, 0x80, 0x5F, +0xB0, 0xC1, 0x49, 0x00, 0x0A, 0xDF, 0x2A, 0x3E, +0x00, 0x01, 0x3C, 0xE0, 0x0E, 0x5F, 0x2F, 0x68, +0x03, 0x23, 0x82, 0xE6, 0x41, 0x41, 0xBA, 0xB6, +0x3D, 0x9C, 0x02, 0x7A, 0x43, 0x7B, 0x24, 0x73, +0x13, 0x4F, 0x80, 0x02, 0x13, 0x5F, 0x80, 0x03, +0x38, 0x0C, 0x8D, 0x11, 0x80, 0x57, 0xA8, 0x15, +0x51, 0x0A, 0x82, 0xE0, 0x38, 0x13, 0xC1, 0x11, +0x12, 0x3B, 0x80, 0x05, 0x51, 0x1A, 0x02, 0xC0, +0xA8, 0x57, 0x38, 0x43, 0xC5, 0x11, 0xA9, 0x16, +0x80, 0x1F, 0x49, 0x00, 0x33, 0xDF, 0x2F, 0x28, +0x03, 0x23, 0x81, 0xA6, 0x42, 0xD9, 0x24, 0x73, +0x84, 0x60, 0x50, 0x26, 0x80, 0x30, 0xB4, 0xAD, +0x8D, 0xC1, 0x10, 0xA6, 0x80, 0x30, 0x14, 0x56, +0x80, 0x01, 0xAC, 0xD2, 0x3F, 0x20, 0x03, 0x23, +0x8D, 0x01, 0x48, 0xFF, 0xFF, 0x6D, 0x2E, 0x60, +0x03, 0x1C, 0xE0, 0xDE, 0xE8, 0x3B, 0x44, 0x70, +0x00, 0x38, 0x3E, 0x0F, 0xFF, 0x08, 0x42, 0x03, +0x1C, 0x73, 0x50, 0x9F, 0x7F, 0xFF, 0xB0, 0x86, +0xE0, 0xC9, 0xE8, 0x30, 0x8C, 0xC1, 0x51, 0xC0, +0x00, 0x38, 0x80, 0x3C, 0x80, 0xE6, 0xE0, 0xFE, +0xE8, 0x27, 0xA1, 0x05, 0xA1, 0x4D, 0xE0, 0x85, +0xE8, 0x1F, 0x81, 0x40, 0x81, 0x82, 0x3B, 0x05, +0x64, 0x04, 0x3B, 0x06, 0x64, 0x24, 0x3B, 0x05, +0x4C, 0x00, 0x3B, 0x06, 0x4C, 0x20, 0x81, 0xC1, +0x81, 0x60, 0x3B, 0x07, 0x64, 0x04, 0x3B, 0x05, +0xE4, 0x24, 0x3B, 0x07, 0x4C, 0x00, 0x3B, 0x05, +0x4C, 0x20, 0x81, 0xA2, 0x80, 0x61, 0x3B, 0x06, +0xE4, 0x04, 0x3B, 0x01, 0xE4, 0x24, 0x3B, 0x06, +0x4C, 0x00, 0x3B, 0x07, 0x4C, 0x20, 0x8C, 0xE1, +0x50, 0x10, 0x80, 0x38, 0xD5, 0xD9, 0x80, 0x1C, +0xD5, 0xD0, 0x3C, 0x60, 0x05, 0x2E, 0xE0, 0xDE, +0xE8, 0x03, 0x3E, 0x60, 0x03, 0x23, 0x2E, 0x80, +0x03, 0x23, 0x3E, 0x80, 0x03, 0x1C, 0x2E, 0x68, +0x03, 0x23, 0x3C, 0x00, 0x10, 0xF4, 0xCE, 0x0F, +0x49, 0x00, 0x09, 0xBF, 0x5A, 0x08, 0x01, 0x06, +0x86, 0xE2, 0x3F, 0x70, 0x03, 0x22, 0xD5, 0x04, +0x3E, 0x60, 0x03, 0x22, 0x80, 0x06, 0x49, 0x00, +0x37, 0x82, 0xD5, 0x14, 0x49, 0x00, 0x09, 0xB1, +0x49, 0x00, 0x06, 0x05, 0x49, 0x00, 0x17, 0x69, +0x2E, 0x70, 0x03, 0x23, 0x3E, 0x70, 0x03, 0x26, +0xC0, 0x09, 0x49, 0x00, 0x15, 0x84, 0x2E, 0x00, +0x03, 0x22, 0x58, 0x50, 0x00, 0x01, 0x3E, 0x50, +0x03, 0x22, 0xFC, 0xEA, 0xFC, 0x40, 0x51, 0xFF, +0xFC, 0x40, 0x84, 0x20, 0x46, 0x46, 0xA3, 0xDB, +0x46, 0x30, 0x49, 0xDB, 0x47, 0x07, 0xFF, 0xFF, +0xB6, 0x3F, 0xF1, 0x81, 0xF1, 0xA8, 0xF1, 0xA9, +0x50, 0x42, 0x09, 0x21, 0x50, 0x31, 0x8C, 0x57, +0x80, 0x41, 0x50, 0x7F, 0x82, 0x80, 0x50, 0x6F, +0x83, 0x20, 0x86, 0x3F, 0x50, 0x88, 0x0F, 0xFF, +0x5A, 0x08, 0x01, 0x13, 0x51, 0x4F, 0x80, 0xA0, +0x41, 0x30, 0x08, 0x0C, 0x41, 0x2F, 0x84, 0x00, +0x41, 0x5A, 0x04, 0x00, 0x15, 0x39, 0x00, 0x02, +0x15, 0x3A, 0x80, 0x02, 0x39, 0x33, 0x8A, 0x0A, +0x39, 0x33, 0x0A, 0x0A, 0xD5, 0x17, 0x40, 0x5F, +0x84, 0x00, 0xA8, 0xEA, 0x95, 0x59, 0x40, 0xA2, +0x8F, 0xD5, 0x50, 0x9F, 0x80, 0xA0, 0x95, 0x61, +0x89, 0x21, 0x40, 0xF2, 0x93, 0xD5, 0x38, 0x43, +0x8A, 0x0A, 0x15, 0x14, 0x80, 0x02, 0x38, 0x83, +0x0A, 0x0A, 0x42, 0x35, 0x7C, 0x09, 0x42, 0x47, +0xFC, 0x09, 0x8C, 0x41, 0x8C, 0x24, 0x5A, 0x28, +0x1F, 0xD5, 0x5A, 0x08, 0x01, 0x09, 0x46, 0x18, +0x00, 0x00, 0xF1, 0xA1, 0xF1, 0xC9, 0x14, 0x13, +0x80, 0x1F, 0xD5, 0x0A, 0x84, 0x00, 0x47, 0x67, +0xFF, 0xFF, 0xF0, 0xA1, 0xF0, 0xC9, 0x14, 0x03, +0x80, 0x1F, 0x50, 0x1B, 0x0F, 0xFF, 0x50, 0x8F, +0x81, 0x40, 0x14, 0x13, 0x00, 0x1F, 0x80, 0x1F, +0x80, 0x28, 0x50, 0x9F, 0x81, 0xE0, 0x49, 0x00, +0x1E, 0x96, 0x50, 0x0F, 0x80, 0xA0, 0x80, 0x29, +0x49, 0x00, 0x1E, 0x91, 0x3D, 0x7C, 0x07, 0x39, +0x84, 0xA0, 0x14, 0x5B, 0x80, 0x01, 0x3D, 0x8C, +0x07, 0x38, 0x41, 0xEC, 0x14, 0x40, 0x39, 0x94, +0x16, 0x02, 0x38, 0x24, 0x96, 0x02, 0x39, 0x13, +0x96, 0x02, 0x39, 0x03, 0x16, 0x02, 0x8C, 0xA1, +0x15, 0x9F, 0x00, 0x80, 0x14, 0x2F, 0x00, 0xC0, +0x15, 0x1F, 0x01, 0x00, 0x15, 0x0F, 0x01, 0x40, +0x5A, 0x58, 0x28, 0xED, 0x3C, 0x7D, 0xFC, 0xE8, +0x84, 0xC0, 0xFB, 0x47, 0x84, 0x61, 0xFA, 0x86, +0x85, 0xE2, 0xFB, 0xE8, 0x86, 0x43, 0xFA, 0x09, +0x86, 0x84, 0xFA, 0x2A, 0x86, 0xA5, 0x86, 0xCB, +0x85, 0x06, 0x10, 0x63, 0x81, 0x20, 0x85, 0x2A, +0x10, 0xA3, 0x81, 0x21, 0x84, 0xA7, 0x10, 0x33, +0x81, 0x22, 0x86, 0xEC, 0x10, 0x43, 0x81, 0x23, +0x87, 0x08, 0x10, 0xF3, 0x81, 0x24, 0x87, 0x2D, +0x11, 0x33, 0x81, 0x25, 0x87, 0xC9, 0x11, 0x23, +0x81, 0x26, 0x84, 0x4E, 0x10, 0x03, 0x81, 0x27, +0xFB, 0xA4, 0x11, 0x43, 0x81, 0x28, 0xFB, 0x8F, +0x10, 0x13, 0x81, 0x29, 0xFA, 0xC5, 0x11, 0x53, +0x81, 0x2A, 0xFB, 0x4E, 0x11, 0x63, 0x81, 0x2B, +0xFA, 0x61, 0x10, 0x83, 0x81, 0x2C, 0xFA, 0x8B, +0xFB, 0xE2, 0xFB, 0xCC, 0xFA, 0x03, 0xFA, 0x2D, +0x85, 0xEF, 0xFB, 0x00, 0x10, 0x93, 0x81, 0x2D, +0x10, 0x53, 0x81, 0x2E, 0x11, 0x73, 0x81, 0x2F, +0x11, 0x83, 0x81, 0x30, 0x11, 0x93, 0x81, 0x31, +0x11, 0xE3, 0x81, 0x32, 0x10, 0x23, 0x81, 0x33, +0x11, 0x13, 0x81, 0x34, 0x11, 0x03, 0x81, 0x35, +0x10, 0x63, 0x81, 0x36, 0x10, 0xA3, 0x81, 0x37, +0x10, 0x33, 0x81, 0x38, 0x10, 0x43, 0x81, 0x39, +0x11, 0x33, 0x81, 0x3A, 0x11, 0x23, 0x81, 0x3B, +0x10, 0x03, 0x81, 0x3C, 0x10, 0x13, 0x81, 0x3D, +0x10, 0xF3, 0x81, 0x3E, 0x10, 0x83, 0x81, 0x3F, +0x51, 0xFF, 0x83, 0xC0, 0xFC, 0xC0, 0xFC, 0x60, +0x86, 0x20, 0x00, 0xBF, 0x80, 0x30, 0x00, 0x8F, +0x80, 0x34, 0x00, 0xCF, 0x80, 0x38, 0x00, 0xDF, +0x80, 0x3C, 0x81, 0x31, 0x82, 0x71, 0x82, 0x51, +0x83, 0x11, 0x81, 0x51, 0x3E, 0xEF, 0xED, 0x24, +0xE1, 0x40, 0xE8, 0x5D, 0x51, 0x0C, 0x7F, 0xFF, +0xE7, 0x85, 0x38, 0x67, 0x28, 0x00, 0xE8, 0x0C, +0x44, 0xF4, 0x2F, 0xF8, 0x39, 0x07, 0xC0, 0x00, +0x40, 0xF8, 0x3C, 0x00, 0x4A, 0x00, 0x3C, 0x00, +0x14, 0x32, 0x52, 0x74, 0xE4, 0x00, 0x40, 0x73, +0x08, 0x02, 0xC7, 0x46, 0xFF, 0x9E, 0xC6, 0x3C, +0x86, 0x41, 0xD5, 0x3A, 0x41, 0x63, 0x08, 0x02, +0x4F, 0x62, 0x00, 0x06, 0xFF, 0x9E, 0xC6, 0x3D, +0x86, 0x41, 0xD5, 0x3B, 0x40, 0x73, 0x10, 0x02, +0xC7, 0x37, 0xFF, 0xAE, 0xC6, 0x2F, 0x86, 0x61, +0xD5, 0x2D, 0x41, 0x53, 0x10, 0x02, 0x4F, 0x52, +0x00, 0x06, 0xFF, 0xAE, 0xC6, 0x2E, 0x86, 0x61, +0xD5, 0x2C, 0x40, 0x73, 0x2C, 0x02, 0xC7, 0x28, +0x40, 0x63, 0x20, 0x02, 0xC6, 0x21, 0x85, 0x21, +0xD5, 0x1F, 0x41, 0x43, 0x2C, 0x02, 0x4F, 0x42, +0x00, 0x07, 0x40, 0x63, 0x20, 0x02, 0xC6, 0x1D, +0x85, 0x21, 0xD5, 0x1B, 0x40, 0x73, 0x30, 0x02, +0xC7, 0x17, 0x40, 0x63, 0x34, 0x02, 0xC6, 0x12, +0x86, 0x21, 0xD5, 0x10, 0x41, 0x73, 0x30, 0x02, +0x4F, 0x72, 0x00, 0x0F, 0x40, 0x63, 0x34, 0x02, +0xC6, 0x0C, 0x86, 0x21, 0xD5, 0x0A, 0x87, 0x01, +0xD5, 0x08, 0x87, 0x02, 0xD5, 0x06, 0x87, 0x03, +0xD5, 0x04, 0x87, 0x04, 0xD5, 0x02, 0x87, 0x05, +0x8D, 0x41, 0xD5, 0xA3, 0x5A, 0x18, 0x01, 0x06, +0x5B, 0x88, 0x01, 0x22, 0x80, 0x12, 0xD5, 0x20, +0x5A, 0x18, 0x02, 0x08, 0x5B, 0x88, 0x02, 0x1C, +0x5B, 0x28, 0x01, 0x1A, 0x80, 0x13, 0xD5, 0x18, +0x5A, 0x18, 0x03, 0x0A, 0x5B, 0x88, 0x03, 0x14, +0x5B, 0x28, 0x01, 0x12, 0x5B, 0x38, 0x01, 0x10, +0x80, 0x09, 0xD5, 0x0E, 0x5A, 0x18, 0x04, 0x0C, +0x5B, 0x88, 0x04, 0x0A, 0x5B, 0x28, 0x01, 0x08, +0x5B, 0x38, 0x01, 0x06, 0x5A, 0x98, 0x01, 0x04, +0x80, 0x11, 0xD5, 0x02, 0x84, 0x00, 0xFC, 0xE0, +0xFC, 0x60, 0x86, 0x01, 0x44, 0x91, 0x40, 0x00, +0x44, 0xAE, 0xC0, 0x00, 0x82, 0x60, 0x03, 0x90, +0x00, 0x00, 0x03, 0xC0, 0x80, 0x00, 0x84, 0x00, +0x3E, 0x5F, 0xED, 0x24, 0x81, 0x70, 0x81, 0x89, +0x85, 0x04, 0x44, 0xD0, 0x00, 0x10, 0x81, 0xCA, +0x45, 0x40, 0x00, 0x40, 0x45, 0x50, 0x00, 0x20, +0x86, 0xC8, 0x45, 0x7F, 0xFF, 0x80, 0x87, 0x02, +0xE1, 0x82, 0xE8, 0x5C, 0x39, 0x19, 0xC1, 0x01, +0x39, 0x20, 0xC1, 0x01, 0x40, 0x48, 0xE4, 0x01, +0x40, 0x39, 0x70, 0x01, 0x42, 0x62, 0x00, 0x03, +0x42, 0x71, 0x80, 0x03, 0x43, 0xE3, 0x98, 0x00, +0x5E, 0xFF, 0x00, 0x0F, 0xE9, 0x45, 0x4E, 0x47, +0x00, 0x03, 0xC3, 0x07, 0x43, 0x93, 0xA4, 0x24, +0x41, 0xCC, 0xBC, 0x0A, 0xE0, 0x9C, 0xE9, 0x04, +0x38, 0xB2, 0x80, 0x08, 0xD5, 0x37, 0x4E, 0x37, +0x00, 0x03, 0xC4, 0x07, 0x43, 0xE3, 0x30, 0x24, +0x41, 0x9F, 0x3C, 0x0A, 0xE0, 0x79, 0xE9, 0x04, +0x38, 0x82, 0x80, 0x08, 0xD5, 0x2B, 0x4E, 0x44, +0x00, 0x03, 0xC3, 0x06, 0x42, 0x73, 0xA8, 0x24, +0x90, 0xEF, 0xE0, 0xE4, 0xE9, 0x04, 0x38, 0xD2, +0x80, 0x08, 0xD5, 0x20, 0x4E, 0x34, 0x00, 0x03, +0xC4, 0x06, 0x42, 0x63, 0x38, 0x24, 0x90, 0xCF, +0xE0, 0xC3, 0xE9, 0x04, 0x39, 0x42, 0x80, 0x08, +0xD5, 0x15, 0x4E, 0x47, 0x00, 0x07, 0x4E, 0x37, +0x00, 0x0F, 0x39, 0x82, 0x80, 0x08, 0xD5, 0x0E, +0xC4, 0x11, 0x4E, 0x37, 0x00, 0x05, 0x39, 0x62, +0x80, 0x08, 0xD5, 0x08, 0xC3, 0x0B, 0x39, 0x52, +0x80, 0x08, 0xD5, 0x04, 0xC3, 0x07, 0x39, 0x72, +0x80, 0x08, 0x8C, 0x01, 0xD5, 0x03, 0x82, 0x5C, +0x82, 0x39, 0x8D, 0x81, 0x83, 0x92, 0x83, 0x31, +0xD5, 0xA4, 0xFC, 0xE0, 0xFC, 0x20, 0x3C, 0x50, +0x0E, 0x69, 0xD8, 0x03, 0x84, 0x40, 0xD5, 0x08, +0x2E, 0x60, 0x03, 0x22, 0xCE, 0x04, 0x2E, 0x10, +0x03, 0x2C, 0xC9, 0x06, 0x84, 0x41, 0x3E, 0x27, +0xED, 0x1E, 0x84, 0xC1, 0xD5, 0x0F, 0x80, 0xE0, +0x49, 0x00, 0x1C, 0xDC, 0x80, 0x07, 0x49, 0x00, +0x1F, 0x79, 0x3C, 0x00, 0x10, 0x42, 0x3C, 0x6B, +0xF6, 0x8E, 0x3C, 0x0B, 0xF6, 0x8C, 0x3E, 0x67, +0xED, 0x1E, 0x80, 0x06, 0xFC, 0xA0, 0xFC, 0x01, +0xC0, 0x04, 0x3C, 0x00, 0x0E, 0x68, 0xD5, 0x20, +0x2E, 0x07, 0xED, 0x14, 0x5A, 0x00, 0x02, 0x07, +0x5A, 0x08, 0x03, 0x08, 0x3C, 0x00, 0x0F, 0x8C, +0xD5, 0x06, 0x3C, 0x00, 0x0F, 0x8B, 0xD5, 0x03, +0x3C, 0x00, 0x0F, 0xDC, 0x2E, 0x17, 0xED, 0x16, +0x5A, 0x18, 0x01, 0x0F, 0x3C, 0x20, 0x05, 0x08, +0x96, 0x96, 0xC2, 0x08, 0x2E, 0x37, 0xED, 0x20, +0x5A, 0x30, 0x01, 0x05, 0x3C, 0x00, 0x0F, 0x8C, +0xD5, 0x03, 0x3C, 0x00, 0x0F, 0xDC, 0x49, 0xFF, +0xFF, 0xBB, 0xF0, 0x81, 0xF0, 0x01, 0xFC, 0x81, +0xFC, 0x20, 0x44, 0x1F, 0x80, 0x00, 0x84, 0x40, +0x44, 0x00, 0x7F, 0xFF, 0x3C, 0x18, 0x0E, 0x52, +0x3C, 0x18, 0x0E, 0x55, 0x84, 0x20, 0x3C, 0x28, +0x0E, 0x4E, 0x3C, 0x28, 0x0E, 0x4D, 0x3C, 0x08, +0x0E, 0x53, 0x3C, 0x08, 0x0E, 0x56, 0x3D, 0xE0, +0x0E, 0x61, 0x44, 0x8F, 0x80, 0x00, 0x3C, 0x70, +0x0E, 0x57, 0x45, 0x40, 0x7F, 0xFF, 0x3E, 0x38, +0x16, 0x0C, 0x80, 0x41, 0x3F, 0x1F, 0xE6, 0xFC, +0xE0, 0x5E, 0xE8, 0x20, 0x41, 0x38, 0x88, 0x20, +0x22, 0x61, 0xFF, 0xCA, 0x02, 0x09, 0x82, 0xE0, +0x9A, 0x30, 0x96, 0x03, 0xE1, 0x00, 0x12, 0x01, +0x83, 0x2C, 0xE8, 0x03, 0x97, 0xD1, 0x81, 0x00, +0x22, 0x41, 0x80, 0x00, 0x43, 0x4A, 0x00, 0x01, +0x9B, 0x74, 0x43, 0x22, 0x80, 0x03, 0x41, 0x59, +0x00, 0x13, 0xE2, 0x35, 0x40, 0x19, 0x3C, 0x1B, +0x96, 0x49, 0x1A, 0x61, 0x80, 0x01, 0x8C, 0x41, +0xD5, 0xE0, 0x3C, 0x18, 0x0E, 0x4D, 0x3C, 0x78, +0x0E, 0x57, 0x3D, 0x48, 0x0E, 0x56, 0x3C, 0x88, +0x0E, 0x55, 0x3D, 0x50, 0x0E, 0x60, 0x3D, 0x04, +0x0E, 0x52, 0x3C, 0x70, 0x0E, 0x54, 0x3D, 0x84, +0x0E, 0x53, 0x3C, 0x10, 0x0E, 0x4E, 0x3E, 0x38, +0x15, 0xCC, 0x84, 0x40, 0x3F, 0x6F, 0xE6, 0xFC, +0xE0, 0x55, 0xE8, 0x20, 0x41, 0x7B, 0x08, 0x20, +0x22, 0x61, 0xFF, 0xCA, 0x02, 0x0B, 0x82, 0xC0, +0x9A, 0x30, 0x96, 0x03, 0xE1, 0x80, 0x12, 0x01, +0x83, 0x2C, 0xE8, 0x03, 0x97, 0xD1, 0x82, 0x00, +0x22, 0x41, 0x80, 0x00, 0x43, 0x8C, 0x00, 0x01, +0x9B, 0x74, 0x43, 0x92, 0x80, 0x03, 0x41, 0xCC, +0x80, 0x13, 0xE2, 0x3C, 0x40, 0x1C, 0xBC, 0x1B, +0x96, 0x49, 0x1A, 0x61, 0x80, 0x01, 0x8C, 0x41, +0xD5, 0xE0, 0x44, 0x40, 0x7F, 0xFF, 0x84, 0xA0, +0x44, 0x3F, 0x80, 0x00, 0x3D, 0x08, 0x0E, 0x52, +0x3C, 0x18, 0x0E, 0x4E, 0x3C, 0x48, 0x0E, 0x50, +0x3C, 0x58, 0x0E, 0x4C, 0x3D, 0x88, 0x0E, 0x53, +0x3C, 0x78, 0x0E, 0x54, 0x3C, 0x38, 0x0E, 0x4F, +0x3D, 0x1C, 0x07, 0x24, 0x3E, 0x18, 0x0A, 0x60, +0x86, 0x00, 0x44, 0x40, 0x7F, 0xFF, 0x3E, 0x5F, +0xE6, 0xFC, 0x3C, 0x70, 0x0E, 0x5D, 0xE1, 0x87, +0xE8, 0x35, 0xA5, 0xC8, 0x39, 0x32, 0xC1, 0x01, +0x9B, 0xA7, 0x8A, 0xD3, 0x41, 0x28, 0xC0, 0x20, +0x96, 0x33, 0x12, 0x09, 0x00, 0x00, 0x02, 0x29, +0x00, 0x00, 0x3C, 0x84, 0x0E, 0x4F, 0x96, 0xD3, +0xE1, 0x03, 0xE8, 0x07, 0x02, 0x79, 0x00, 0x00, +0x3C, 0x78, 0x0E, 0x4F, 0x3D, 0x08, 0x0E, 0x51, +0x02, 0x69, 0x00, 0x00, 0x3D, 0x44, 0x0E, 0x50, +0x96, 0x33, 0xE0, 0x14, 0xE8, 0x05, 0x02, 0x29, +0x00, 0x00, 0x3C, 0x28, 0x0E, 0x50, 0x2A, 0x30, +0x80, 0x01, 0x22, 0x70, 0x82, 0xBF, 0x3D, 0x20, +0x0E, 0x4C, 0x9B, 0x9F, 0x42, 0x03, 0x00, 0x03, +0x96, 0x81, 0xE3, 0xC2, 0xE8, 0x03, 0x3C, 0x28, +0x0E, 0x4C, 0x12, 0x30, 0x82, 0xBF, 0x8D, 0x81, +0xD5, 0xC9, 0x3C, 0x63, 0xF6, 0x81, 0xC6, 0x13, +0x3C, 0x10, 0x05, 0x08, 0x96, 0x56, 0xC1, 0x0A, +0x2E, 0x87, 0xED, 0x20, 0x5A, 0x88, 0x01, 0x07, +0x3C, 0x30, 0x0F, 0x85, 0x96, 0x9B, 0x90, 0x48, +0xD5, 0x04, 0x3C, 0x00, 0x0F, 0x85, 0x96, 0x80, +0x3C, 0x2B, 0xF6, 0x87, 0xFC, 0xA0, 0xFC, 0x20, +0x2E, 0x58, 0x0A, 0x3A, 0xD0, 0x1E, 0x3E, 0x3F, +0xE1, 0x98, 0x84, 0x40, 0x50, 0x61, 0x80, 0x08, +0x44, 0x70, 0x00, 0x5C, 0x82, 0x02, 0x80, 0x86, +0x42, 0x41, 0x1C, 0x73, 0xA1, 0x21, 0x97, 0x24, +0xC4, 0x09, 0x20, 0x81, 0x80, 0x1C, 0x82, 0x20, +0xE1, 0x05, 0x41, 0x18, 0x3C, 0x1B, 0x11, 0x11, +0x80, 0x1C, 0x8C, 0x41, 0x50, 0x31, 0x80, 0x5C, +0x5A, 0x28, 0x0F, 0xEF, 0x3E, 0x00, 0x0A, 0x3A, +0x2E, 0x58, 0x0A, 0x3C, 0xD1, 0x17, 0x84, 0x00, +0x3E, 0x2F, 0xE1, 0x78, 0x82, 0x40, 0x3C, 0x60, +0x0F, 0x24, 0x97, 0xF3, 0xE0, 0x07, 0xE8, 0x0C, +0x29, 0x31, 0x00, 0x01, 0xE1, 0xE5, 0xE9, 0x04, +0x10, 0x11, 0x7F, 0xFF, 0xD5, 0x03, 0x11, 0x21, +0x7F, 0xFF, 0x8C, 0x01, 0xD5, 0xF1, 0x3E, 0x10, +0x0A, 0x3C, 0xFC, 0xA0, 0xFC, 0x00, 0x3E, 0x28, +0x1C, 0xE8, 0x02, 0x31, 0x01, 0x08, 0x02, 0x41, +0x00, 0x3B, 0x02, 0x51, 0x01, 0x10, 0x02, 0x61, +0x00, 0xB1, 0x02, 0xF1, 0x01, 0x10, 0x3E, 0x1F, +0xED, 0x00, 0x10, 0x00, 0x80, 0x14, 0x88, 0x85, +0x88, 0xCF, 0x84, 0x01, 0xAC, 0xCA, 0xAC, 0x09, +0x96, 0x21, 0x96, 0x71, 0x49, 0xFF, 0xFF, 0xAD, +0xFC, 0x80, 0xFC, 0x00, 0x2E, 0x07, 0xED, 0x20, +0x5A, 0x00, 0x01, 0x19, 0x3C, 0x00, 0x0F, 0x8F, +0x3C, 0x10, 0x0E, 0x4A, 0x96, 0x83, 0xE0, 0x41, +0x84, 0x03, 0xE9, 0x0A, 0x3C, 0x30, 0x0F, 0x8E, +0x3C, 0x50, 0x0E, 0x4B, 0x97, 0x1B, 0xE0, 0x85, +0x84, 0x03, 0xE8, 0x08, 0x84, 0x02, 0x84, 0xC0, +0x49, 0xFF, 0xFF, 0xCE, 0x3C, 0x6B, 0xF6, 0x86, +0xD5, 0x03, 0x49, 0xFF, 0xFF, 0xC9, 0xFC, 0x80, +0x3C, 0x00, 0x10, 0x70, 0x96, 0x43, 0xE4, 0x23, +0xE8, 0x1B, 0xFC, 0x00, 0x3C, 0x20, 0x10, 0x70, +0x3C, 0x43, 0xF6, 0x81, 0x96, 0xD3, 0xE0, 0x64, +0xE8, 0x09, 0x3C, 0x57, 0xF6, 0x74, 0x4E, 0x56, +0x00, 0x06, 0x2E, 0x67, 0xEC, 0xFA, 0x5A, 0x68, +0x01, 0x06, 0x3C, 0x10, 0x0F, 0x98, 0x84, 0x00, +0xD5, 0x04, 0x3C, 0x10, 0x0F, 0x98, 0x84, 0x01, +0x49, 0x00, 0x1D, 0xB0, 0xFC, 0x80, 0xDD, 0x9E, +0x3C, 0x00, 0x0F, 0x4D, 0x3C, 0x10, 0x0E, 0x4C, +0x96, 0x83, 0xE0, 0x41, 0xE8, 0x06, 0x84, 0x80, +0x3C, 0x4B, 0xF6, 0x7F, 0x48, 0x00, 0x01, 0x06, +0x3C, 0x37, 0xF6, 0x74, 0x4E, 0x33, 0x01, 0x01, +0x2E, 0x07, 0xEC, 0xFA, 0x4E, 0x03, 0x00, 0xFD, +0x2E, 0x50, 0x03, 0x22, 0xCD, 0x05, 0x2E, 0x20, +0x03, 0x2C, 0xC2, 0x06, 0xDD, 0x9E, 0x5A, 0x58, +0x07, 0x04, 0x48, 0x00, 0x00, 0xF6, 0x2E, 0x17, +0xE1, 0x63, 0x4E, 0x13, 0x00, 0xF2, 0xFC, 0x60, +0x3C, 0x40, 0x05, 0x06, 0x2E, 0x87, 0xE1, 0x5D, +0x54, 0x62, 0x01, 0x00, 0xC6, 0x45, 0x3C, 0x54, +0x0E, 0x4F, 0x4E, 0x57, 0x00, 0x20, 0x3C, 0x94, +0x0E, 0x50, 0x4E, 0x94, 0x00, 0x1C, 0x3C, 0x70, +0x0F, 0x4E, 0x44, 0xA0, 0x00, 0x64, 0x96, 0xFB, +0xE0, 0x65, 0xE8, 0x08, 0x3C, 0x70, 0x0F, 0x50, +0x96, 0xFB, 0xFE, 0xEC, 0x40, 0x51, 0xA8, 0xB7, +0xD5, 0x07, 0x3C, 0x20, 0x0F, 0x4F, 0x97, 0x93, +0xFF, 0x74, 0x40, 0x52, 0xA8, 0xB7, 0xFE, 0xAA, +0x97, 0x93, 0xE1, 0x26, 0xE9, 0x26, 0x5A, 0x80, +0x02, 0x24, 0x3C, 0x14, 0x0E, 0x55, 0x4E, 0x17, +0x00, 0x20, 0x3C, 0xB4, 0x0E, 0x56, 0x4E, 0xB4, +0x00, 0x1C, 0x3C, 0x50, 0x0F, 0x4E, 0x44, 0xC0, +0x00, 0x64, 0x97, 0xEB, 0xE0, 0xE1, 0xE8, 0x08, +0x3C, 0x50, 0x0F, 0x50, 0x97, 0xEB, 0xFF, 0xCC, +0x40, 0x63, 0xB0, 0xD7, 0xD5, 0x07, 0x3C, 0x30, +0x0F, 0x4F, 0x96, 0x9B, 0xFE, 0x54, 0x40, 0x60, +0xB0, 0xD7, 0xFE, 0x72, 0x96, 0xCB, 0xE1, 0x63, +0x56, 0x17, 0x80, 0x01, 0xD5, 0x02, 0x84, 0x21, +0x56, 0x10, 0x80, 0x01, 0x5A, 0x80, 0x02, 0x6D, +0x3C, 0x20, 0x0F, 0xB8, 0x3D, 0x04, 0x0E, 0x4F, +0x97, 0x93, 0xE1, 0x86, 0xE8, 0x03, 0x84, 0x40, +0xD5, 0x62, 0x3D, 0x50, 0x05, 0x07, 0x54, 0x5A, +0x90, 0x00, 0xC5, 0x4E, 0x3C, 0xD0, 0x0E, 0x64, +0x3D, 0x20, 0x0E, 0x5F, 0x51, 0x16, 0x80, 0x01, +0x3C, 0xE0, 0x0E, 0x65, 0x43, 0x39, 0x44, 0x24, +0x3C, 0xA0, 0x0E, 0x66, 0x3C, 0x80, 0x0E, 0x67, +0x51, 0x67, 0x7F, 0xFF, 0x41, 0xC9, 0x80, 0x13, +0x44, 0x7F, 0x80, 0x00, 0x3F, 0x78, 0x0A, 0x60, +0x87, 0x22, 0xE1, 0x0A, 0xE9, 0x2E, 0x41, 0x4E, +0x28, 0x00, 0x41, 0x8A, 0x00, 0x13, 0x81, 0x31, +0x84, 0xA0, 0xE1, 0x36, 0xE8, 0x24, 0x40, 0x62, +0xE0, 0x00, 0x96, 0xB3, 0x41, 0xEB, 0x88, 0x20, +0x40, 0xB1, 0x48, 0x01, 0x88, 0x52, 0x40, 0xEB, +0x88, 0x20, 0x40, 0xCB, 0xAC, 0x20, 0x02, 0x3F, +0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x02, 0x67, +0x00, 0x00, 0x40, 0xD8, 0x00, 0x11, 0x96, 0xB3, +0x88, 0x4D, 0x40, 0x61, 0x64, 0xD6, 0x8A, 0x66, +0x96, 0x9B, 0x42, 0x61, 0x00, 0x03, 0xE0, 0xE6, +0xE8, 0x02, 0x97, 0xF3, 0x88, 0xB2, 0x8D, 0x21, +0x97, 0x69, 0xD5, 0xDC, 0x8D, 0x41, 0xD5, 0xD2, +0x3C, 0x78, 0x0F, 0x54, 0x3C, 0x30, 0x0F, 0x52, +0x96, 0x9B, 0xE0, 0xE2, 0xE9, 0x0F, 0x2E, 0x37, +0xE1, 0x52, 0xC3, 0xAA, 0x97, 0x23, 0x4E, 0x44, +0xFF, 0xA8, 0x3C, 0x20, 0x0F, 0x55, 0x3C, 0x70, +0x0F, 0xC2, 0x97, 0x93, 0x97, 0x7B, 0xE0, 0xC5, +0xE8, 0x1B, 0x84, 0x41, 0xFE, 0x57, 0xC1, 0x13, +0x3C, 0x50, 0x0F, 0x4C, 0x3C, 0x77, 0xF6, 0x7E, +0x96, 0xEB, 0x9C, 0x79, 0xE0, 0x67, 0x3C, 0x1B, +0xF6, 0x7E, 0xE8, 0x25, 0x86, 0x61, 0x86, 0x80, +0x3F, 0x37, 0xEC, 0xFA, 0x3D, 0x4B, 0xF6, 0x7E, +0x84, 0x01, 0xD5, 0x1D, 0x84, 0x00, 0x3C, 0x0B, +0xF6, 0x7E, 0x84, 0x00, 0xD5, 0x18, 0x54, 0x3A, +0x81, 0x00, 0x4E, 0x32, 0xFF, 0x82, 0x3C, 0x40, +0x10, 0xDB, 0x3C, 0x20, 0x0F, 0xB9, 0x97, 0xA3, +0x97, 0xD3, 0xE0, 0xC7, 0x4E, 0xF2, 0xFF, 0x79, +0x3C, 0x50, 0x10, 0xDC, 0x3C, 0x40, 0x0F, 0xB9, +0x96, 0xEB, 0x97, 0xA3, 0xE0, 0x66, 0x4E, 0xF2, +0xFF, 0x70, 0xD5, 0xD0, 0xFC, 0xE0, 0x84, 0x80, +0x3C, 0x4B, 0xF6, 0x7E, 0x84, 0x00, 0xDD, 0x9E, +0xFC, 0x20, 0x84, 0x20, 0x3C, 0x1B, 0xF9, 0xBA, +0x2E, 0x37, 0xED, 0x24, 0x84, 0xA0, 0x40, 0x21, +0x94, 0x0E, 0x8C, 0xA1, 0x5A, 0x28, 0x01, 0x08, +0x97, 0x68, 0x86, 0x60, 0x86, 0x01, 0x3E, 0x3F, +0xED, 0x24, 0xD5, 0x11, 0x5A, 0x58, 0x08, 0xF5, +0x84, 0xA0, 0xD5, 0xF8, 0x41, 0x28, 0x84, 0x0E, +0x8C, 0x21, 0x5B, 0x28, 0x01, 0x11, 0x97, 0x88, +0x9D, 0x29, 0x4C, 0x43, 0x40, 0x11, 0x8D, 0xE1, +0x8D, 0x81, 0x80, 0xA6, 0xE1, 0x80, 0x3E, 0x4F, +0xED, 0x24, 0xE8, 0x17, 0x39, 0x11, 0xC0, 0x00, +0x84, 0x20, 0xD5, 0xED, 0x5A, 0x18, 0x08, 0xEC, +0x84, 0xC0, 0xD5, 0xEF, 0x9F, 0xEF, 0x4C, 0x73, +0x3F, 0xF0, 0x9E, 0x69, 0x4C, 0x13, 0x00, 0x05, +0x9D, 0x2F, 0x4C, 0x43, 0x40, 0x04, 0x8F, 0xE1, +0xD5, 0xE8, 0xD6, 0xE7, 0x86, 0x60, 0xD5, 0xE5, +0x84, 0x00, 0x80, 0xC0, 0x38, 0x72, 0x18, 0x00, +0x5A, 0x70, 0x01, 0x04, 0x5A, 0x78, 0x80, 0x04, +0x8C, 0x01, 0xD5, 0x02, 0x84, 0x00, 0x8C, 0xC1, +0x5A, 0x68, 0x04, 0xF6, 0xE4, 0x03, 0xE9, 0x06, +0x8D, 0xE5, 0xE7, 0xEB, 0x85, 0x09, 0xE8, 0x0C, +0xD5, 0x0F, 0x5B, 0x30, 0x05, 0x04, 0x5B, 0x3F, +0xFB, 0x04, 0x85, 0x05, 0xD5, 0x05, 0x8D, 0xE5, +0xE7, 0xEB, 0xE9, 0x06, 0x85, 0x0A, 0x3C, 0x8B, +0xF9, 0xBA, 0x84, 0x01, 0xD5, 0x02, 0x84, 0x00, +0xFC, 0xA0, 0xE2, 0x20, 0x3C, 0x20, 0x0F, 0x42, +0xE8, 0x0D, 0x96, 0x90, 0xC2, 0x22, 0x3C, 0x40, +0x0F, 0x42, 0x3C, 0x30, 0x0F, 0x42, 0x97, 0x60, +0x8E, 0xA1, 0x42, 0x02, 0x84, 0x73, 0x96, 0x58, +0xD5, 0x16, 0x96, 0xD3, 0x90, 0x68, 0x4E, 0x37, +0x00, 0x07, 0x3C, 0x40, 0x0F, 0x42, 0x97, 0x63, +0x90, 0xA8, 0xC5, 0x0F, 0x3C, 0x20, 0x0F, 0x42, +0x3C, 0x30, 0x0F, 0x42, 0x97, 0x13, 0x90, 0x88, +0x97, 0x5B, 0x8E, 0x81, 0x42, 0x02, 0x04, 0x73, +0x40, 0x12, 0xA0, 0x0A, 0x40, 0x00, 0x04, 0x16, +0xDD, 0x9E, 0xC0, 0x1B, 0xC1, 0x18, 0x4C, 0x00, +0x80, 0x17, 0x5A, 0x08, 0x01, 0x07, 0x5A, 0x10, +0x0C, 0x18, 0x5A, 0x18, 0x02, 0x15, 0xDD, 0x9E, +0x5A, 0x08, 0x0C, 0x07, 0x5A, 0x10, 0x0B, 0x0E, +0x5A, 0x10, 0x01, 0x0C, 0xD5, 0x0C, 0x9E, 0x81, +0x4C, 0x11, 0x00, 0x08, 0x8C, 0x01, 0x4C, 0x10, +0x00, 0x05, 0xD5, 0x05, 0x84, 0x00, 0xDD, 0x9E, +0x84, 0x01, 0xDD, 0x9E, 0x84, 0x1F, 0xDD, 0x9E, +0x3C, 0x40, 0x05, 0x21, 0x3C, 0x20, 0x05, 0x20, +0x40, 0x52, 0x20, 0x09, 0xE2, 0xA1, 0xE8, 0x03, +0x84, 0x80, 0xD5, 0x1D, 0x97, 0x20, 0xE2, 0x81, +0x40, 0x31, 0x20, 0x09, 0xE8, 0x0B, 0x9A, 0x8C, +0xFE, 0x9C, 0x8A, 0xA4, 0x40, 0x11, 0x14, 0x37, +0x9B, 0x19, 0xE2, 0x64, 0x40, 0x41, 0xBC, 0x1B, +0xD5, 0x0E, 0x96, 0x90, 0x9B, 0x53, 0xFE, 0x6C, +0x40, 0x10, 0x90, 0x37, 0x9B, 0x11, 0xE2, 0x83, +0xE8, 0x03, 0xB6, 0x60, 0xDD, 0x9E, 0xE2, 0x44, +0x40, 0x41, 0x3C, 0x1B, 0xB6, 0x80, 0xDD, 0x9E, +0xFC, 0x01, 0x96, 0x8B, 0x96, 0xC3, 0x90, 0x30, +0x90, 0x10, 0x8A, 0x43, 0x8A, 0x20, 0x4E, 0x25, +0x00, 0x06, 0x84, 0xC0, 0x4E, 0x14, 0x00, 0x06, +0xD5, 0x07, 0x4E, 0x15, 0x00, 0x45, 0x84, 0xC3, +0xC9, 0x0D, 0xCA, 0x05, 0xD5, 0x09, 0x84, 0xC1, +0xC2, 0x3C, 0xC9, 0x09, 0xE4, 0xC2, 0x84, 0x04, +0xE9, 0x3C, 0x84, 0x0A, 0xD5, 0x3A, 0x80, 0x02, +0xD5, 0x38, 0xC2, 0x16, 0x44, 0x00, 0x00, 0x64, +0xFE, 0x14, 0x40, 0x10, 0x04, 0x36, 0xFE, 0x4C, +0x50, 0x00, 0xA7, 0x10, 0x49, 0xFF, 0xF2, 0x7E, +0xC0, 0x2C, 0x44, 0x41, 0x86, 0xA0, 0x40, 0x52, +0x00, 0xB6, 0x5E, 0xF2, 0x81, 0x03, 0xE9, 0xE7, +0x5E, 0xF2, 0x83, 0xC5, 0xE9, 0x05, 0xC6, 0x1B, +0x5A, 0x68, 0x03, 0x1C, 0xD5, 0x18, 0x5E, 0xF2, +0x82, 0xC3, 0xE9, 0x0B, 0x84, 0x02, 0xC6, 0x19, +0x84, 0x06, 0x5A, 0x60, 0x01, 0x17, 0x84, 0x0C, +0x5A, 0x68, 0x02, 0x14, 0x84, 0x08, 0xD5, 0x11, +0x84, 0x03, 0xC6, 0x0F, 0x84, 0x05, 0x5A, 0x60, +0x01, 0x0D, 0x84, 0x0B, 0x5A, 0x68, 0x02, 0x0A, +0x84, 0x09, 0xD5, 0x07, 0x84, 0x01, 0xD5, 0x05, +0x84, 0x07, 0xD5, 0x03, 0x84, 0xC2, 0xD5, 0xC2, +0xFC, 0x81, 0x3D, 0x40, 0x0E, 0x5D, 0x3E, 0x08, +0x16, 0x38, 0x86, 0x00, 0x3E, 0x4F, 0xE6, 0xFC, +0xE1, 0x94, 0xE8, 0x09, 0x39, 0x52, 0x41, 0x01, +0xA5, 0x40, 0x8D, 0x81, 0x88, 0xB5, 0x1A, 0x50, +0x00, 0x01, 0xD5, 0xF7, 0x3D, 0x10, 0x0E, 0x60, +0x3E, 0x08, 0x1B, 0xB8, 0x86, 0x00, 0x3E, 0x1F, +0xE6, 0xFC, 0xE1, 0x91, 0xE8, 0x0B, 0x41, 0x20, +0xC0, 0x20, 0xA4, 0xC0, 0x03, 0x39, 0x02, 0xC0, +0x8D, 0x81, 0x88, 0x73, 0x1A, 0x30, 0x00, 0x01, +0xD5, 0xF5, 0x3C, 0x30, 0x0E, 0x61, 0x3E, 0x18, +0x1B, 0xF8, 0x84, 0x00, 0x3E, 0x4F, 0xE6, 0xFC, +0xE0, 0x03, 0xE8, 0x0B, 0x40, 0x22, 0x00, 0x20, +0x02, 0x51, 0x02, 0xE0, 0xA4, 0x88, 0x8C, 0x01, +0x88, 0x45, 0x1A, 0x20, 0x80, 0x01, 0xD5, 0xF5, +0xDD, 0x9E, 0xFC, 0x20, 0x3C, 0x10, 0x0E, 0x61, +0x84, 0xA0, 0x3E, 0x28, 0x1B, 0xF8, 0x94, 0x49, +0x3E, 0x6F, 0xE6, 0xFC, 0x3E, 0x48, 0x03, 0x4C, +0x82, 0x85, 0xD1, 0x14, 0x98, 0xEE, 0xA4, 0x10, +0x03, 0x51, 0x82, 0xE0, 0x8A, 0x15, 0x97, 0xC3, +0x1A, 0x71, 0x00, 0x01, 0x4E, 0x77, 0x00, 0x06, +0x98, 0x25, 0x12, 0x70, 0x02, 0xE0, 0xD5, 0x04, +0x98, 0xE5, 0x13, 0x41, 0x82, 0xE0, 0x8C, 0xA2, +0xD5, 0xED, 0x3C, 0x00, 0x0E, 0x60, 0x84, 0xA0, +0x3E, 0x28, 0x1B, 0xB8, 0x94, 0x41, 0x3E, 0x6F, +0xE6, 0xFC, 0x3E, 0x48, 0x03, 0x4C, 0x82, 0x45, +0xD1, 0x14, 0x98, 0xEE, 0xA5, 0xD0, 0x03, 0x31, +0x82, 0xC0, 0x8A, 0xF3, 0x96, 0x3B, 0x1A, 0x01, +0x00, 0x01, 0x4E, 0x07, 0x00, 0x06, 0x99, 0xE5, +0x12, 0x03, 0x82, 0xC0, 0xD5, 0x04, 0x98, 0xE5, +0x13, 0x21, 0x82, 0xC0, 0x8C, 0xA2, 0xD5, 0xED, +0x85, 0x00, 0x3C, 0x6C, 0x02, 0x79, 0x3E, 0x28, +0x16, 0x38, 0x3E, 0x7F, 0xE6, 0xFC, 0x3E, 0x38, +0x03, 0x4C, 0x80, 0x88, 0x3C, 0x50, 0x0E, 0x5D, +0xE1, 0x05, 0xE8, 0x17, 0xA4, 0x50, 0x39, 0x03, +0xA1, 0x01, 0x41, 0x13, 0x20, 0x20, 0x8A, 0x30, +0x96, 0x0B, 0x1A, 0x01, 0x00, 0x01, 0x4E, 0x05, +0x00, 0x07, 0x12, 0x08, 0x80, 0x00, 0x38, 0x01, +0xA1, 0x09, 0xD5, 0x05, 0x12, 0x48, 0x80, 0x00, +0x38, 0x41, 0xA1, 0x09, 0x8D, 0x01, 0xD5, 0xE7, +0xFC, 0xA0, 0xFC, 0x68, 0x3C, 0x20, 0x0F, 0x93, +0x96, 0xD4, 0xC3, 0x08, 0x2E, 0x47, 0xE1, 0x5D, +0x5A, 0x48, 0x02, 0x05, 0x84, 0xA0, 0x3C, 0x58, +0x05, 0x20, 0x44, 0x60, 0x00, 0x5C, 0x42, 0x70, +0x18, 0x24, 0x3E, 0x2F, 0xE1, 0x98, 0x40, 0xB1, +0x1C, 0x00, 0x00, 0x35, 0x80, 0x20, 0x50, 0x85, +0x80, 0x20, 0x81, 0x22, 0xCB, 0x21, 0x51, 0x01, +0x00, 0x40, 0x50, 0x91, 0x00, 0x28, 0x89, 0x87, +0x50, 0x61, 0x00, 0x48, 0x3B, 0x08, 0x44, 0x00, +0x50, 0x01, 0x00, 0x30, 0x89, 0x27, 0x98, 0xB7, +0x3B, 0x04, 0xC4, 0x20, 0x88, 0x07, 0x3B, 0x01, +0x44, 0x00, 0x2E, 0x50, 0x0A, 0x40, 0x86, 0x81, +0x3B, 0x00, 0x44, 0x20, 0x12, 0x54, 0x00, 0x01, +0x12, 0x35, 0x80, 0x1C, 0x11, 0x45, 0x80, 0x20, +0x14, 0x35, 0x80, 0x0F, 0xD5, 0x2E, 0x3C, 0x40, +0x05, 0x21, 0xC4, 0x04, 0x3C, 0x50, 0x05, 0x20, +0xCD, 0x2B, 0x44, 0x30, 0x00, 0x5C, 0x3E, 0x7F, +0xE1, 0xC8, 0xFE, 0x1C, 0x50, 0xA3, 0x80, 0x18, +0x50, 0x23, 0xFF, 0xF8, 0x50, 0x53, 0x80, 0x10, +0x99, 0xB8, 0x89, 0x40, 0x88, 0xA0, 0x88, 0x40, +0x88, 0x09, 0x22, 0x10, 0x00, 0x00, 0x3B, 0x05, +0x44, 0x00, 0x44, 0x70, 0x00, 0x64, 0x3B, 0x03, +0x44, 0x20, 0xFE, 0x7C, 0x3B, 0x02, 0xC4, 0x00, +0x83, 0x80, 0x3B, 0x01, 0x44, 0x20, 0xB9, 0x90, +0x22, 0x40, 0x00, 0x01, 0xFF, 0xE4, 0xBF, 0x91, +0x3B, 0x02, 0xC4, 0x00, 0x3B, 0x05, 0x44, 0x20, +0x84, 0x01, 0x48, 0x00, 0x02, 0xA5, 0x05, 0x35, +0x80, 0x12, 0x44, 0x30, 0x00, 0x64, 0x40, 0x89, +0x8D, 0x16, 0x22, 0xD5, 0x80, 0x00, 0x50, 0xA5, +0x80, 0x48, 0x4C, 0x86, 0xC0, 0x28, 0x04, 0x65, +0x00, 0x01, 0x22, 0xC5, 0x80, 0x01, 0x40, 0x43, +0x0C, 0x96, 0x4C, 0x46, 0x40, 0x20, 0x51, 0x31, +0x00, 0x40, 0x89, 0xE7, 0x42, 0x84, 0x0C, 0x24, +0x51, 0x21, 0x00, 0x28, 0xFE, 0xE4, 0x3B, 0x09, +0xC4, 0x00, 0x89, 0xC7, 0x3B, 0x09, 0x44, 0x20, +0x50, 0xC4, 0x00, 0x32, 0x51, 0x11, 0x80, 0x32, +0x14, 0xC5, 0x80, 0x10, 0x15, 0x15, 0x80, 0x11, +0x50, 0xB1, 0x00, 0x48, 0x89, 0x67, 0x3B, 0x09, +0xC4, 0x00, 0x3B, 0x05, 0xC4, 0x20, 0x48, 0x00, +0x00, 0xB6, 0x80, 0xE0, 0x44, 0x00, 0x00, 0x5C, +0x43, 0xC3, 0x80, 0x24, 0x80, 0xC1, 0x40, 0xE4, +0xF0, 0x00, 0x04, 0x27, 0x00, 0x10, 0x04, 0x57, +0x00, 0x11, 0x05, 0x07, 0x00, 0x0B, 0x04, 0x17, +0x00, 0x0A, 0x44, 0xC0, 0x00, 0x64, 0x40, 0xF0, +0xB1, 0xF6, 0x41, 0x21, 0x32, 0x56, 0x41, 0x42, +0xB2, 0x96, 0x41, 0x18, 0x32, 0x36, 0xB4, 0x2E, +0x04, 0x07, 0x00, 0x01, 0x12, 0xFF, 0x80, 0x1A, +0xF2, 0x88, 0xF5, 0x87, 0x15, 0x3F, 0x80, 0x09, +0x13, 0x1F, 0x80, 0x1B, 0x13, 0x2F, 0x80, 0x18, +0x13, 0x4F, 0x80, 0x19, 0x49, 0xFF, 0xF0, 0xE1, +0xB6, 0x1F, 0x04, 0x17, 0x00, 0x01, 0xF0, 0x0C, +0x49, 0xFF, 0xF0, 0xDB, 0xF0, 0x81, 0xB4, 0x2E, +0xF0, 0x0C, 0x49, 0xFF, 0xF0, 0xD6, 0xF0, 0x82, +0xF1, 0x0D, 0xF0, 0x0C, 0x49, 0xFF, 0xF0, 0xD1, +0xF0, 0x83, 0x51, 0x5E, 0x00, 0x48, 0xF0, 0x0D, +0xF1, 0x0C, 0x40, 0xA4, 0xD4, 0x00, 0x83, 0x8E, +0x49, 0xFF, 0xFE, 0x30, 0xF0, 0x84, 0x0C, 0x1E, +0x00, 0x0C, 0xF0, 0x0C, 0x49, 0xFF, 0xFE, 0x2A, +0xF0, 0x85, 0xF1, 0x05, 0xF0, 0x04, 0x49, 0xFF, +0xFD, 0xDE, 0x05, 0x67, 0x00, 0x0C, 0x04, 0xB5, +0x00, 0x01, 0x40, 0x3B, 0x30, 0x76, 0xF0, 0x84, +0xB8, 0x01, 0x97, 0x1B, 0x41, 0x70, 0x32, 0xF6, +0x41, 0xC5, 0xB3, 0x96, 0x12, 0x4F, 0x80, 0x1A, +0xF4, 0x86, 0x13, 0x7F, 0x80, 0x1B, 0x12, 0x8F, +0x80, 0x18, 0x13, 0xCF, 0x80, 0x19, 0xF1, 0x0C, +0xF0, 0x0D, 0x49, 0xFF, 0xFE, 0x0B, 0xF0, 0x85, +0xB4, 0x2E, 0xF0, 0x0C, 0x49, 0xFF, 0xFE, 0x06, +0x81, 0xC0, 0x80, 0x2E, 0xF0, 0x05, 0x49, 0xFF, +0xFD, 0xBA, 0x3C, 0x10, 0x0E, 0xD7, 0xB4, 0x5F, +0x97, 0x4B, 0xE0, 0x45, 0xF3, 0x06, 0xF2, 0x07, +0xF5, 0x08, 0x05, 0x8F, 0x80, 0x09, 0xE8, 0x6C, +0x3C, 0x40, 0x0E, 0xD7, 0x96, 0x63, 0xF4, 0x01, +0xE0, 0x81, 0xE8, 0x66, 0x3C, 0x10, 0x0E, 0xD7, +0xF4, 0x02, 0x96, 0x4B, 0xE0, 0x81, 0xE8, 0x60, +0x3C, 0x10, 0x0E, 0xD7, 0xF4, 0x03, 0x96, 0x4B, +0xE0, 0x81, 0xE8, 0x5A, 0x41, 0x95, 0x88, 0x01, +0x41, 0xEC, 0x14, 0x01, 0x43, 0x3F, 0x00, 0x03, +0x43, 0x0C, 0x80, 0x03, 0x3C, 0x10, 0x0E, 0xD7, +0x89, 0xF0, 0x41, 0x19, 0xB2, 0x36, 0x97, 0x0B, +0xE1, 0xA4, 0xE8, 0x4A, 0x5A, 0x07, 0xFF, 0x06, +0xF2, 0x04, 0x85, 0x80, 0x5A, 0x2F, 0xFF, 0x48, +0xC6, 0x10, 0x44, 0x10, 0x00, 0x5C, 0xFF, 0xCC, +0x3E, 0x5F, 0xE1, 0xC8, 0x99, 0x2F, 0x8C, 0xB8, +0x88, 0xE5, 0x3B, 0x03, 0xC4, 0x00, 0x3B, 0x02, +0x44, 0x20, 0x84, 0x00, 0x48, 0x00, 0x01, 0xBC, +0x44, 0x20, 0x00, 0x5C, 0xFE, 0xBC, 0x3E, 0x5F, +0xE1, 0xC0, 0x41, 0x24, 0x88, 0x00, 0x41, 0x62, +0x88, 0x00, 0x22, 0x49, 0x00, 0x01, 0x8C, 0xB8, +0x44, 0x10, 0x00, 0x64, 0x88, 0x45, 0x3C, 0x50, +0x0E, 0xD6, 0x3B, 0x01, 0x44, 0x00, 0xFF, 0x0C, +0x22, 0x29, 0x00, 0x1C, 0x42, 0x84, 0x04, 0x24, +0x43, 0x5E, 0x04, 0x24, 0x14, 0x49, 0x00, 0x11, +0x97, 0x2B, 0x42, 0xD6, 0x84, 0x24, 0x51, 0x44, +0x00, 0x32, 0x50, 0xBA, 0x80, 0x32, 0x9C, 0x51, +0xE0, 0x44, 0x15, 0x49, 0x00, 0x12, 0x14, 0xB9, +0x00, 0x13, 0x3B, 0x0B, 0x44, 0x20, 0x14, 0xD9, +0x00, 0x10, 0x12, 0x19, 0x00, 0x1C, 0x85, 0x81, +0xE8, 0x06, 0x48, 0x00, 0x01, 0x81, 0x4E, 0x63, +0x01, 0x81, 0x81, 0x86, 0x44, 0x20, 0x00, 0x5C, +0xFE, 0xBC, 0x3E, 0x1F, 0xE1, 0xC0, 0x51, 0x80, +0x80, 0x18, 0x3D, 0x90, 0x05, 0x06, 0x41, 0x74, +0x88, 0x00, 0x99, 0x4A, 0x88, 0x58, 0x87, 0x80, +0x3B, 0x01, 0x44, 0x00, 0x54, 0x4C, 0x90, 0x00, +0x13, 0xCB, 0x80, 0x1C, 0x3B, 0x02, 0xC4, 0x20, +0x81, 0x78, 0xC4, 0x5D, 0x3C, 0x23, 0xF6, 0x81, +0xC2, 0x5A, 0x2E, 0x17, 0xED, 0x12, 0xC9, 0x57, +0xC8, 0x56, 0x5A, 0xE0, 0x01, 0x08, 0x5A, 0xE0, +0x04, 0x06, 0x5A, 0xE0, 0x07, 0x04, 0x5A, 0xE8, +0x0A, 0x4F, 0x45, 0x90, 0x00, 0x5C, 0x81, 0xA9, +0x42, 0xD3, 0xE4, 0x73, 0x44, 0xE0, 0x00, 0x64, +0x05, 0xE6, 0x80, 0x12, 0x51, 0xC6, 0x80, 0x48, +0x40, 0x4F, 0x38, 0x96, 0xB9, 0x01, 0x96, 0x23, +0x40, 0x20, 0xB8, 0x56, 0x8A, 0x60, 0x97, 0x53, +0x42, 0x11, 0x80, 0x03, 0xB0, 0x0E, 0x50, 0xC6, +0x80, 0x20, 0xB6, 0xBF, 0x49, 0xFF, 0xFD, 0x1E, +0x02, 0x16, 0x00, 0x01, 0xF0, 0x0E, 0x49, 0xFF, +0xFC, 0xD2, 0x23, 0x06, 0x80, 0x00, 0x04, 0x16, +0x80, 0x12, 0x43, 0x18, 0x38, 0x24, 0x53, 0x20, +0x00, 0x20, 0xB4, 0x5F, 0xF0, 0x8E, 0x23, 0x36, +0x80, 0x01, 0xFE, 0x0C, 0x42, 0x08, 0xC8, 0x73, +0x8B, 0xE2, 0x42, 0x19, 0x80, 0x03, 0x40, 0x80, +0x14, 0x09, 0xB0, 0x0F, 0x49, 0xFF, 0xFD, 0x02, +0x02, 0x16, 0x00, 0x01, 0xF0, 0x0F, 0x49, 0xFF, +0xFC, 0xB6, 0x23, 0x46, 0x80, 0x01, 0xB9, 0x01, +0x43, 0x5A, 0x38, 0x24, 0xF5, 0x0E, 0x53, 0x60, +0x00, 0x20, 0xFE, 0x44, 0x42, 0x1A, 0xD8, 0x73, +0x88, 0x05, 0x92, 0x01, 0x92, 0x25, 0xF0, 0x8B, +0x48, 0x00, 0x00, 0xB8, 0x44, 0x00, 0x00, 0x5C, +0x83, 0xC9, 0x43, 0xE3, 0x80, 0x73, 0x45, 0x10, +0x00, 0x64, 0x05, 0x0F, 0x00, 0x12, 0x04, 0xEF, +0x00, 0x13, 0x40, 0x38, 0x44, 0x76, 0x41, 0x27, +0x46, 0x56, 0x12, 0x3F, 0x80, 0x18, 0x13, 0x2F, +0x80, 0x19, 0xF1, 0x0C, 0xB4, 0x1E, 0x49, 0xFF, +0xEF, 0x94, 0xB6, 0x1F, 0xB4, 0x3F, 0xB0, 0x0B, +0x49, 0xFF, 0xFC, 0xD0, 0x5A, 0x68, 0x01, 0x08, +0x3C, 0x50, 0x0F, 0xEB, 0xF2, 0x0B, 0x97, 0x2B, +0xFF, 0x14, 0xF4, 0x8B, 0x4E, 0xC2, 0x00, 0x04, +0xFA, 0x0F, 0xD5, 0x06, 0x2E, 0x00, 0x0A, 0x40, +0xF1, 0x0B, 0xE2, 0x01, 0xE8, 0x02, 0xF0, 0x8B, +0x2E, 0x37, 0xE1, 0x62, 0xC3, 0x19, 0x3C, 0x50, +0x10, 0x9C, 0x97, 0x2B, 0x90, 0x88, 0x4E, 0x47, +0x00, 0x14, 0x3C, 0x20, 0x10, 0x9C, 0x96, 0x13, +0x4E, 0x07, 0x00, 0x0F, 0x3C, 0x10, 0x10, 0x9C, +0xF2, 0x0B, 0x96, 0xCB, 0x3C, 0x50, 0x10, 0x9C, +0x40, 0x41, 0xA0, 0x0A, 0xFE, 0xA4, 0x96, 0x28, +0x40, 0x11, 0x00, 0x37, 0xF1, 0x8B, 0x44, 0xC0, +0x00, 0x5C, 0x81, 0x09, 0x42, 0x83, 0xB0, 0x73, +0xF0, 0x0B, 0x02, 0x14, 0x00, 0x11, 0x49, 0xFF, +0xFC, 0x52, 0x3D, 0x40, 0x10, 0xF4, 0xF0, 0x8B, +0x5B, 0x48, 0x02, 0x18, 0x3C, 0x30, 0x11, 0x0D, +0x97, 0x5B, 0x90, 0xA8, 0x4E, 0x57, 0x00, 0x37, +0x3C, 0x40, 0x11, 0x0D, 0x96, 0xA3, 0x4E, 0x27, +0x00, 0x32, 0x3C, 0x10, 0x11, 0x0D, 0x3C, 0x50, +0x11, 0x0D, 0x96, 0xCB, 0x90, 0x68, 0xFE, 0x1C, +0x97, 0x28, 0x40, 0x10, 0x10, 0x37, 0xD5, 0x25, +0x3D, 0x50, 0x10, 0xF4, 0x5B, 0x50, 0x01, 0x06, +0x3D, 0x60, 0x10, 0xF4, 0x5B, 0x68, 0x03, 0x1F, +0x3C, 0x30, 0x10, 0xFF, 0x97, 0x5B, 0x90, 0xA8, +0x4E, 0x57, 0x00, 0x12, 0x3C, 0x40, 0x10, 0xFF, +0x96, 0xA3, 0x4E, 0x27, 0x00, 0x0D, 0x3C, 0x10, +0x10, 0xFF, 0x3C, 0x50, 0x10, 0xFF, 0x96, 0xCB, +0x90, 0x68, 0xFE, 0x1C, 0x97, 0x28, 0x40, 0x00, +0x10, 0x17, 0xF0, 0x8B, 0x2F, 0x38, 0x03, 0x23, +0xE5, 0xE2, 0xE9, 0x04, 0xF2, 0x0B, 0x94, 0x51, +0xF1, 0x8B, 0xF0, 0x0B, 0x5C, 0xF0, 0x00, 0x20, +0xE9, 0x03, 0xFA, 0x4F, 0xF2, 0x8B, 0x44, 0xD0, +0x00, 0x5C, 0x82, 0xE9, 0x43, 0x73, 0xB4, 0x73, +0xF1, 0x0B, 0x83, 0x97, 0x2A, 0x3E, 0x00, 0x24, +0x22, 0x4B, 0x80, 0x01, 0x52, 0x20, 0x80, 0x20, +0x04, 0x5B, 0x80, 0x12, 0xB8, 0x01, 0xFE, 0xD4, +0xFE, 0xA4, 0x45, 0x80, 0x00, 0x64, 0xFF, 0x4C, +0xFE, 0x44, 0x42, 0x51, 0xE0, 0x73, 0x42, 0x11, +0x60, 0x73, 0x40, 0x82, 0x94, 0x09, 0x92, 0x25, +0x44, 0x30, 0x00, 0x5C, 0xFE, 0xFC, 0xF4, 0x0B, +0x50, 0x01, 0x80, 0x40, 0x88, 0x09, 0x40, 0xF4, +0x8C, 0x00, 0x12, 0x47, 0x80, 0x11, 0xB7, 0x00, +0xA8, 0x41, 0xB4, 0xAA, 0x04, 0x25, 0x00, 0x01, +0xCE, 0x15, 0x9B, 0x91, 0x40, 0xA2, 0xA0, 0x01, +0x43, 0x75, 0x00, 0x03, 0x43, 0x03, 0x00, 0x03, +0x51, 0x97, 0x80, 0x38, 0x89, 0x97, 0x45, 0x80, +0x00, 0x64, 0x40, 0x48, 0x60, 0x96, 0x04, 0x3C, +0x80, 0x01, 0xE0, 0x64, 0xE8, 0x03, 0x14, 0x4C, +0x80, 0x01, 0x44, 0xD0, 0x00, 0x5C, 0x42, 0x93, +0xB4, 0x73, 0x45, 0xE0, 0x00, 0x64, 0x04, 0xE4, +0x80, 0x12, 0x40, 0x04, 0x78, 0x16, 0x40, 0x57, +0x78, 0xB6, 0x51, 0xC4, 0x80, 0x48, 0x3E, 0x2F, +0xE1, 0xE0, 0xD8, 0x08, 0xBE, 0x01, 0x40, 0x10, +0xF8, 0x36, 0x40, 0x53, 0x78, 0xB6, 0x84, 0xC1, +0xD1, 0x0D, 0x44, 0x40, 0x00, 0x5C, 0xFF, 0x3C, +0x3E, 0x3F, 0xE1, 0xC8, 0x88, 0x64, 0x88, 0x82, +0x3B, 0x02, 0x44, 0x00, 0x3B, 0x01, 0xC4, 0x20, +0x84, 0xC0, 0x44, 0x00, 0x00, 0x5C, 0xFF, 0xC4, +0x89, 0x67, 0x88, 0x47, 0x3B, 0x05, 0xC4, 0x00, +0x3B, 0x01, 0x44, 0x20, 0x80, 0x06, 0xD5, 0x07, +0x5A, 0x07, 0xFF, 0x04, 0x48, 0xFF, 0xFE, 0x36, +0x48, 0xFF, 0xFE, 0x39, 0xFC, 0xE8, 0x3C, 0x10, +0x0F, 0x24, 0x84, 0x00, 0x3C, 0x0B, 0xF0, 0xBA, +0x96, 0x0B, 0x4E, 0x02, 0x00, 0x92, 0x3C, 0x20, +0x0F, 0x64, 0x96, 0xD3, 0x4E, 0x34, 0x00, 0x8B, +0xFC, 0x60, 0x3E, 0x78, 0x03, 0x4C, 0x44, 0xA0, +0x00, 0xB6, 0x84, 0xC0, 0x81, 0x27, 0x3E, 0xB8, +0x1C, 0xE8, 0x3C, 0x40, 0x0F, 0x24, 0x50, 0x15, +0x7F, 0x4A, 0x97, 0x63, 0xE0, 0x25, 0xE8, 0x78, +0x2E, 0x08, 0x03, 0x23, 0xC8, 0x6D, 0x3C, 0x20, +0x0F, 0x27, 0xCA, 0x3F, 0x3D, 0x50, 0x0E, 0xD9, +0x5B, 0x50, 0x01, 0x06, 0x3D, 0x60, 0x0E, 0xD9, +0x5B, 0x68, 0x02, 0x07, 0x3C, 0x40, 0x0F, 0x28, +0x96, 0xA3, 0x88, 0x41, 0xD5, 0x04, 0x3C, 0x00, +0x0F, 0x28, 0x96, 0x83, 0x51, 0x71, 0x02, 0xC0, +0x38, 0x83, 0xDD, 0x11, 0x3D, 0x80, 0x05, 0x2C, +0xE1, 0x18, 0xE9, 0x52, 0x84, 0x00, 0x3D, 0x90, +0x0E, 0x5F, 0x80, 0x40, 0x82, 0x40, 0x3C, 0x30, +0x0F, 0x29, 0x96, 0xDB, 0xE1, 0xC3, 0xE8, 0x4A, +0x38, 0x45, 0xA9, 0x01, 0x88, 0x92, 0xE0, 0x99, +0xE8, 0x45, 0x3D, 0xC0, 0x0E, 0xD9, 0x5B, 0xC0, +0x01, 0x06, 0x3D, 0xE0, 0x0E, 0xD9, 0x5B, 0xE8, +0x02, 0x05, 0x3C, 0x50, 0x0F, 0xD8, 0x97, 0x2B, +0x50, 0xC2, 0x02, 0xE0, 0x38, 0x33, 0xB1, 0x11, +0xE0, 0x78, 0xE9, 0x05, 0xE0, 0x43, 0xE8, 0x02, +0x96, 0x99, 0x84, 0x01, 0x8D, 0xC1, 0xD5, 0xE0, +0x3C, 0x80, 0x0F, 0x27, 0x5A, 0x88, 0x01, 0x2A, +0x3C, 0x30, 0x0F, 0x28, 0x3C, 0xD0, 0x05, 0x2C, +0x97, 0x1B, 0x50, 0xC2, 0x02, 0xE0, 0x39, 0x03, +0xB1, 0x11, 0xE1, 0x8D, 0xE9, 0x1E, 0x3C, 0xE0, +0x0E, 0x5E, 0x3D, 0x20, 0x05, 0x10, 0x80, 0x40, +0x82, 0x20, 0x3C, 0x30, 0x0F, 0x29, 0x96, 0xDB, +0xE1, 0xA3, 0xE8, 0x14, 0x39, 0x35, 0xA9, 0x01, +0x89, 0xF1, 0xE1, 0xEE, 0xE8, 0x0F, 0x51, 0x49, +0x82, 0xC0, 0x38, 0x54, 0xD1, 0x11, 0xE0, 0xB2, +0xE9, 0x05, 0xE0, 0x45, 0xE8, 0x02, 0x96, 0xA9, +0x84, 0x01, 0x8D, 0xA1, 0xD5, 0xEB, 0x84, 0x00, +0x80, 0x40, 0x49, 0x00, 0x26, 0x57, 0xFE, 0x37, +0x97, 0x80, 0x8D, 0x41, 0xD5, 0x83, 0x80, 0x06, +0xFC, 0xE0, 0x84, 0x00, 0xDD, 0x9E, 0xDD, 0x9E, +0xFC, 0x61, 0x3E, 0x5F, 0xFF, 0x08, 0x2F, 0x88, +0x03, 0x23, 0x3A, 0x0F, 0x84, 0x20, 0x44, 0x00, +0x00, 0x38, 0x80, 0x25, 0x42, 0x1C, 0x00, 0x73, +0x20, 0x7F, 0x80, 0x00, 0x44, 0x4F, 0x80, 0x00, +0x51, 0x10, 0x80, 0x10, 0x44, 0x80, 0x7F, 0xFF, +0x97, 0xF9, 0x14, 0x48, 0x80, 0x01, 0x81, 0xDF, +0x20, 0x9F, 0x80, 0x01, 0x20, 0x6F, 0x80, 0x02, +0x21, 0x3F, 0x80, 0x03, 0x14, 0x80, 0x80, 0x08, +0x80, 0x87, 0x86, 0x40, 0x3E, 0xC8, 0x03, 0x4C, +0x50, 0xD0, 0x80, 0x20, 0xE1, 0x24, 0xE9, 0x15, +0x51, 0x42, 0x02, 0xC0, 0x38, 0x16, 0x51, 0x11, +0x4E, 0x17, 0x00, 0x03, 0x89, 0xC1, 0x04, 0xA8, +0x80, 0x01, 0xE1, 0x41, 0xE8, 0x03, 0x14, 0x18, +0x80, 0x01, 0xB5, 0x0D, 0xE0, 0x28, 0xE8, 0x02, +0xB6, 0x2D, 0x8C, 0x81, 0x97, 0x21, 0xD5, 0xEB, +0x44, 0xB0, 0x00, 0x38, 0x81, 0xA5, 0x42, 0xDC, +0x2C, 0x73, 0x97, 0xB1, 0x80, 0x06, 0x86, 0x20, +0x3F, 0xE8, 0x03, 0x4C, 0x51, 0xC6, 0x80, 0x10, +0x51, 0x96, 0x80, 0x20, 0xE1, 0xE0, 0xE9, 0x14, +0x50, 0x10, 0x02, 0xE0, 0x38, 0x4F, 0x05, 0x11, +0x4E, 0x47, 0x00, 0x03, 0x89, 0xA4, 0x04, 0xBE, +0x00, 0x01, 0xE1, 0x64, 0xE8, 0x02, 0xBC, 0x81, +0xB5, 0x99, 0xE0, 0x90, 0xE8, 0x02, 0xB6, 0x99, +0x8C, 0x01, 0x96, 0x01, 0xD5, 0xEC, 0x44, 0xC0, +0x00, 0x38, 0x42, 0x4C, 0x30, 0x24, 0x3E, 0x1F, +0xFF, 0x14, 0x3B, 0x07, 0x40, 0x04, 0x88, 0x24, +0x3B, 0x00, 0xC0, 0x24, 0x02, 0x07, 0x00, 0x00, +0x41, 0x58, 0xC8, 0x00, 0x45, 0x60, 0x7F, 0xFF, +0xAC, 0x08, 0x88, 0x85, 0x42, 0x1A, 0xD8, 0x01, +0xAC, 0x64, 0x51, 0x52, 0x00, 0x20, 0x84, 0x20, +0x14, 0x1A, 0x80, 0x01, 0x3F, 0x68, 0x03, 0x4C, +0xE1, 0x27, 0xE9, 0x12, 0x51, 0x73, 0x82, 0xC0, +0x38, 0x0B, 0x5D, 0x11, 0x8C, 0xE1, 0x4E, 0x07, +0x00, 0x04, 0x42, 0x10, 0x1C, 0x73, 0x04, 0x8A, +0x80, 0x01, 0xE1, 0x00, 0xE8, 0x03, 0x14, 0x0A, +0x80, 0x01, 0x97, 0xF9, 0xD5, 0xEE, 0x44, 0xA0, +0x00, 0x38, 0x82, 0xE5, 0x43, 0x7C, 0x28, 0x73, +0x87, 0x00, 0x15, 0x8B, 0x80, 0x0A, 0x3F, 0x08, +0x03, 0x4C, 0x50, 0xEB, 0x80, 0x28, 0xE1, 0xE6, +0xE9, 0x10, 0x51, 0x43, 0x02, 0xE0, 0x38, 0x48, +0x51, 0x11, 0x8C, 0xC1, 0x4E, 0x47, 0x00, 0x04, +0x43, 0x82, 0x18, 0x73, 0xB5, 0x4E, 0xE1, 0x44, +0xE8, 0x02, 0xB6, 0x8E, 0x97, 0xB1, 0xD5, 0xF0, +0x4F, 0x22, 0x00, 0x09, 0x4F, 0x13, 0x00, 0x0B, +0x83, 0x11, 0x80, 0x31, 0x86, 0x21, 0x82, 0x51, +0xD5, 0x05, 0x83, 0x12, 0x80, 0x32, 0x86, 0x41, +0x82, 0x32, 0x44, 0x60, 0x00, 0x64, 0xFE, 0x74, +0x43, 0xCC, 0x18, 0x24, 0x40, 0x90, 0xC9, 0x37, +0x41, 0xEE, 0x47, 0xD7, 0x50, 0x04, 0xFF, 0x9C, +0x51, 0x34, 0x80, 0x32, 0x50, 0x8F, 0x00, 0x32, +0x40, 0x79, 0x98, 0xF6, 0x94, 0x47, 0x40, 0x04, +0x18, 0x16, 0x41, 0x90, 0x9B, 0x36, 0x8E, 0xE1, +0x8E, 0x01, 0x97, 0x39, 0x96, 0x41, 0x50, 0x7C, +0x80, 0x40, 0xAD, 0x18, 0xAD, 0xD0, 0xAC, 0x59, +0x50, 0x3F, 0x7F, 0x9C, 0x95, 0xDF, 0x40, 0xB3, +0x99, 0x76, 0x50, 0x65, 0x80, 0x40, 0xAD, 0x91, +0x2E, 0x28, 0x03, 0x23, 0x44, 0xD0, 0x00, 0x38, +0x3C, 0xC0, 0x0E, 0x5F, 0x42, 0x51, 0x34, 0x73, +0x42, 0x12, 0x30, 0x73, 0xAC, 0x6D, 0xFC, 0xE1, +0xFC, 0x21, 0x3A, 0x0F, 0x84, 0x20, 0x80, 0x3F, +0x3B, 0x00, 0xC0, 0x04, 0x80, 0x02, 0x3B, 0x00, +0x40, 0x24, 0xA5, 0x48, 0xAD, 0x40, 0x3E, 0x58, +0x03, 0x4C, 0x40, 0x72, 0x8C, 0x20, 0x23, 0x03, +0x82, 0xF6, 0xFB, 0x0E, 0x42, 0xF8, 0x20, 0x24, +0x45, 0x10, 0x00, 0x64, 0x40, 0x17, 0xC4, 0x36, +0x80, 0xDF, 0x96, 0x4B, 0x21, 0x2F, 0x80, 0x00, +0x84, 0xE1, 0x9A, 0x1F, 0xE0, 0x12, 0xE9, 0x0E, +0x41, 0x32, 0x80, 0x20, 0x22, 0x89, 0x82, 0xF6, +0xE1, 0x01, 0xE9, 0x06, 0x5A, 0x70, 0x05, 0x05, +0xE1, 0x88, 0x8C, 0xE1, 0xE8, 0xF3, 0x8C, 0x01, +0xAE, 0x10, 0x9C, 0x19, 0x21, 0x23, 0x00, 0x01, +0x94, 0xD9, 0x84, 0xE0, 0xE1, 0xC0, 0xE9, 0x12, +0x41, 0x11, 0x9C, 0x00, 0x89, 0xA5, 0x23, 0x38, +0x82, 0xF7, 0xE1, 0xE1, 0xE9, 0x06, 0x5A, 0x70, +0x08, 0x05, 0xE1, 0x93, 0x8C, 0xE2, 0xE8, 0x04, +0x8E, 0x01, 0xAE, 0x11, 0xD5, 0x03, 0x8C, 0x01, +0xD5, 0xEE, 0x41, 0x42, 0x90, 0x20, 0x22, 0x7A, +0x03, 0x16, 0xFA, 0x2E, 0xFE, 0x7C, 0x45, 0x50, +0x00, 0x64, 0x40, 0x00, 0xD4, 0x16, 0x21, 0x63, +0x00, 0x02, 0x96, 0x43, 0x84, 0x61, 0x9A, 0x23, +0xE0, 0x16, 0xE9, 0x0E, 0x41, 0x72, 0x80, 0x20, +0x22, 0x8B, 0x83, 0x16, 0xE1, 0x01, 0xE9, 0x06, +0x5A, 0x30, 0x05, 0x05, 0xE0, 0xE8, 0x8C, 0x61, +0xE8, 0xF3, 0x8C, 0x01, 0xAE, 0x12, 0x9C, 0x21, +0x21, 0x03, 0x00, 0x03, 0x95, 0x21, 0x84, 0x60, +0xE1, 0x80, 0xE9, 0x11, 0x99, 0xA3, 0x88, 0xC5, +0x23, 0x23, 0x03, 0x17, 0xE1, 0xC1, 0xE9, 0x06, +0x5A, 0x30, 0x08, 0x05, 0xE0, 0xF2, 0x8C, 0x62, +0xE8, 0x04, 0x8E, 0x01, 0xAE, 0x13, 0xD5, 0x03, +0x8C, 0x01, 0xD5, 0xEF, 0xFC, 0xA1, 0xFC, 0x04, +0x3E, 0x28, 0x1C, 0xB4, 0x02, 0x51, 0x00, 0x0C, +0x02, 0x31, 0x00, 0x0A, 0x02, 0x41, 0x00, 0x0B, +0x02, 0x61, 0x00, 0x0D, 0xA4, 0x95, 0xF1, 0x81, +0xB0, 0x46, 0x10, 0x3F, 0x80, 0x18, 0xAF, 0x09, +0x40, 0x30, 0x08, 0x96, 0xAF, 0x4A, 0xAF, 0x8B, +0xB1, 0x84, 0x80, 0x46, 0x97, 0x21, 0x3A, 0x00, +0x84, 0x00, 0x96, 0xD9, 0x49, 0xFF, 0xFF, 0x6A, +0x3A, 0x03, 0x04, 0x00, 0xF2, 0x01, 0xB0, 0xC3, +0x49, 0xFF, 0xFE, 0x78, 0xFC, 0x84, 0xFC, 0x60, +0x41, 0x00, 0x84, 0x08, 0x41, 0x50, 0x40, 0x00, +0x22, 0x6A, 0x80, 0x00, 0x02, 0x9F, 0x80, 0x18, +0xE0, 0xC5, 0x4E, 0xF3, 0x00, 0x96, 0x9F, 0xC9, +0xE0, 0x47, 0xAC, 0x60, 0xE8, 0x48, 0x22, 0xAA, +0x80, 0x00, 0x45, 0x20, 0x00, 0x64, 0x42, 0x85, +0x24, 0x24, 0x50, 0xB8, 0x7F, 0xFC, 0x40, 0x74, +0x48, 0xF6, 0x51, 0x30, 0xFF, 0xFE, 0x41, 0x60, +0x2C, 0x00, 0x84, 0xC0, 0x82, 0x92, 0xE1, 0xE2, +0xE9, 0x34, 0x2B, 0x7B, 0x7F, 0xFF, 0xE0, 0xF7, +0xE8, 0x06, 0xC6, 0x2D, 0xE1, 0x57, 0xE8, 0x2B, +0x8E, 0xC1, 0xD5, 0x25, 0xE0, 0xB7, 0x4D, 0x31, +0x40, 0x0B, 0xE8, 0x21, 0x23, 0x2B, 0x00, 0x02, +0xE1, 0xD7, 0xE8, 0x1D, 0x9D, 0xF1, 0x39, 0x32, +0x1D, 0x09, 0xD5, 0x19, 0xE8, 0x18, 0x23, 0x1B, +0x00, 0x02, 0xE1, 0xB7, 0xE8, 0x14, 0x22, 0x8B, +0x00, 0x00, 0xE1, 0x17, 0xE8, 0x10, 0x51, 0x83, +0x00, 0x01, 0x39, 0x32, 0x61, 0x09, 0x22, 0xAB, +0x00, 0x01, 0xE4, 0xD2, 0x43, 0x95, 0x24, 0x24, +0x40, 0x7C, 0xD0, 0xF6, 0xE9, 0x07, 0x50, 0x6C, +0x00, 0x01, 0xD5, 0x50, 0x44, 0x70, 0x7F, 0xFF, +0xD5, 0x02, 0x80, 0xD8, 0x8F, 0xE1, 0xD5, 0xCC, +0x8C, 0xC1, 0xD5, 0x02, 0x84, 0xC1, 0x9C, 0x89, +0xE0, 0x43, 0xE8, 0x44, 0x23, 0x1A, 0x80, 0x00, +0x44, 0xD0, 0x00, 0x64, 0x42, 0xA8, 0xA4, 0x24, +0x8D, 0x84, 0x40, 0xC0, 0x40, 0x00, 0x40, 0xB5, +0x35, 0x76, 0x8C, 0x22, 0x84, 0x00, 0xE0, 0x61, +0xE9, 0x34, 0x2B, 0x06, 0x00, 0x01, 0xE1, 0x70, +0xE8, 0x06, 0xC0, 0x2D, 0xE1, 0xB0, 0xE8, 0x2B, +0x8E, 0x01, 0xD5, 0x27, 0xE0, 0xB0, 0x4C, 0x11, +0xC0, 0x0B, 0xE8, 0x23, 0x23, 0x26, 0x7F, 0xFE, +0xE1, 0xD0, 0xE8, 0x1F, 0x99, 0xF0, 0x38, 0x12, +0x1D, 0x09, 0xD5, 0x1B, 0xE8, 0x1A, 0x23, 0x36, +0x00, 0x00, 0xE1, 0xF0, 0xE8, 0x16, 0x22, 0x76, +0x7F, 0xFE, 0xE0, 0xF0, 0xE8, 0x12, 0x98, 0xB0, +0x38, 0x12, 0x09, 0x09, 0x23, 0x16, 0x7F, 0xFF, +0x8C, 0x01, 0x42, 0xE8, 0xA4, 0x24, 0x40, 0x83, +0x00, 0x00, 0xE5, 0x14, 0x40, 0xB7, 0x35, 0x76, +0xE9, 0x06, 0x54, 0x04, 0x00, 0xFF, 0xD5, 0x09, +0x44, 0xB0, 0x7F, 0xFF, 0x8C, 0x21, 0xD5, 0xCC, +0x88, 0xC0, 0x96, 0x30, 0xD5, 0x02, 0x84, 0x00, +0xFC, 0xE0, 0xFC, 0x20, 0x38, 0x70, 0x05, 0x11, +0x44, 0x60, 0x00, 0x64, 0xFE, 0xBC, 0xE0, 0x61, +0x80, 0xA1, 0x40, 0x21, 0x18, 0x56, 0xE8, 0x0F, +0x9F, 0x89, 0xE0, 0xC3, 0xE9, 0x09, 0x38, 0x80, +0x19, 0x11, 0xE1, 0x02, 0xE8, 0x03, 0x8C, 0xC1, +0xD5, 0x03, 0x8E, 0xC1, 0xD5, 0xF7, 0x43, 0x03, +0x0C, 0x00, 0xD5, 0x02, 0x82, 0x01, 0xE0, 0x24, +0xE8, 0x0B, 0x8C, 0x21, 0xE0, 0x81, 0xE9, 0x06, +0x38, 0x30, 0x05, 0x11, 0xE0, 0x62, 0xE8, 0xFA, +0x8E, 0x21, 0x42, 0x50, 0x90, 0x01, 0x52, 0x08, +0x00, 0x01, 0x98, 0x45, 0x96, 0x09, 0xFC, 0xA0, +0x3E, 0x2F, 0xED, 0x00, 0x00, 0x11, 0x00, 0x14, +0x3E, 0x48, 0x0A, 0x60, 0x3E, 0x08, 0x1C, 0xE8, +0x96, 0xCB, 0x22, 0x52, 0x09, 0x1F, 0x22, 0xF2, +0x09, 0x20, 0x23, 0x02, 0x09, 0x1C, 0x23, 0x12, +0x09, 0x25, 0x23, 0x22, 0x09, 0x26, 0x23, 0x32, +0x09, 0x1D, 0x23, 0x42, 0x09, 0x22, 0x23, 0x52, +0x09, 0x23, 0x23, 0x62, 0x09, 0x1E, 0x23, 0x71, +0x00, 0x01, 0x23, 0x81, 0x00, 0x02, 0x12, 0x30, +0x01, 0x19, 0x12, 0x50, 0x00, 0x73, 0x12, 0xF0, +0x00, 0x74, 0x13, 0x00, 0x00, 0x72, 0x13, 0x10, +0x02, 0x70, 0x13, 0x20, 0x02, 0x71, 0x13, 0x30, +0x02, 0x72, 0x13, 0x40, 0x02, 0x73, 0x13, 0x50, +0x02, 0x74, 0x13, 0x60, 0x02, 0x75, 0x13, 0x70, +0x01, 0x01, 0x13, 0x80, 0x01, 0x02, 0xDD, 0x9E, +0x3C, 0x00, 0x0F, 0x4D, 0x3C, 0x10, 0x0E, 0x4C, +0x96, 0x83, 0xE0, 0x22, 0xE8, 0x1A, 0x3C, 0x37, +0xF6, 0x74, 0xCB, 0x17, 0x2E, 0x47, 0xEC, 0xFA, +0xCC, 0x14, 0x3C, 0x20, 0x0F, 0x4C, 0x3C, 0x57, +0xF6, 0x7F, 0x96, 0x53, 0x9C, 0x29, 0xE0, 0x25, +0x3C, 0x0B, 0xF6, 0x7F, 0xE8, 0x0A, 0xFC, 0x00, +0x84, 0xC1, 0x3E, 0x67, 0xEC, 0xFA, 0x3C, 0x4B, +0xF6, 0x7F, 0x49, 0x00, 0x0F, 0x3F, 0xFC, 0x80, +0xDD, 0x9E, 0xFC, 0x00, 0x3C, 0x00, 0x0E, 0x5D, +0x49, 0x00, 0x2F, 0xDE, 0x49, 0x00, 0x2F, 0x37, +0x3E, 0x18, 0x0A, 0x60, 0x22, 0x20, 0x89, 0x1A, +0x3E, 0x08, 0x1C, 0xE8, 0x22, 0x30, 0x89, 0x1B, +0x12, 0x20, 0x01, 0x04, 0x12, 0x30, 0x01, 0x03, +0x49, 0x00, 0x2E, 0xF1, 0x44, 0x00, 0x7F, 0xFF, +0x49, 0x00, 0x0F, 0x74, 0xFC, 0x80, 0x3C, 0x13, +0xF6, 0x81, 0x2E, 0x07, 0xE1, 0x60, 0xC1, 0x14, +0xC0, 0x0C, 0x3C, 0x40, 0x11, 0x67, 0x3C, 0x10, +0x0F, 0xDD, 0x97, 0x63, 0x96, 0xCB, 0x3C, 0xF0, +0x10, 0x95, 0x88, 0x65, 0x88, 0x6F, 0xD5, 0x06, +0x3C, 0x30, 0x11, 0x67, 0x3C, 0x20, 0x0F, 0xDD, +0x88, 0x62, 0x96, 0x19, 0xD5, 0x09, 0xC0, 0x06, +0x3C, 0x30, 0x11, 0x67, 0x3C, 0x20, 0x10, 0x95, +0xD5, 0xF8, 0x3C, 0x00, 0x11, 0x67, 0x3C, 0x50, +0x0E, 0x6B, 0xD0, 0x06, 0xFC, 0x00, 0x49, 0x00, +0x14, 0x9E, 0x84, 0x00, 0xFC, 0x80, 0x84, 0x01, +0xDD, 0x9E, 0xFC, 0x62, 0x2E, 0x07, 0xE1, 0x5D, +0x5A, 0x08, 0x02, 0x2E, 0x85, 0x40, 0x3C, 0xAB, +0xF6, 0x81, 0x49, 0xFF, 0xFF, 0xB4, 0x3D, 0x97, +0xF6, 0x74, 0x4F, 0x96, 0x00, 0x07, 0x3C, 0x30, +0x0E, 0x84, 0x97, 0x9B, 0xE4, 0xC3, 0xE9, 0x07, +0x85, 0xC1, 0x49, 0x00, 0x11, 0xAD, 0x3E, 0xE7, +0xF3, 0x9E, 0xD5, 0x03, 0x3E, 0xA7, 0xF3, 0x9E, +0x49, 0xFF, 0xF4, 0xFC, 0x49, 0xFF, 0xFF, 0x46, +0x49, 0x00, 0x0E, 0xD8, 0x49, 0xFF, 0xF6, 0x6E, +0x4E, 0x02, 0x03, 0x7A, 0x49, 0x00, 0x11, 0x9C, +0x3D, 0x40, 0x0E, 0xEF, 0x86, 0x21, 0x3D, 0x4B, +0xF9, 0xC4, 0x3F, 0x17, 0xF3, 0x9E, 0x85, 0x80, +0x48, 0x00, 0x06, 0x72, 0x3C, 0x10, 0x05, 0x08, +0x96, 0x4E, 0xC1, 0x2F, 0x2E, 0x27, 0xED, 0x16, +0x5A, 0x28, 0x01, 0x2C, 0x3C, 0x50, 0x10, 0x3E, +0x84, 0x00, 0x97, 0x2B, 0x95, 0xE1, 0x3C, 0x2B, +0xF6, 0x81, 0x3E, 0x27, 0xED, 0x12, 0x3C, 0x4B, +0xF6, 0x82, 0x3C, 0x7B, 0xF6, 0x88, 0x3E, 0x20, +0x03, 0x2C, 0x49, 0xFF, 0xF4, 0xA6, 0xC8, 0x03, +0x3E, 0x07, 0xED, 0x16, 0x49, 0xFF, 0xFF, 0x89, +0x49, 0x00, 0x11, 0x72, 0x49, 0xFF, 0xFF, 0x6B, +0x49, 0xFF, 0xF4, 0xC4, 0x49, 0x00, 0x0E, 0xA2, +0x49, 0x00, 0x11, 0x6A, 0x3C, 0x20, 0x0F, 0x8A, +0x85, 0xA1, 0x96, 0x53, 0x59, 0x80, 0x80, 0x40, +0x3D, 0x88, 0x0F, 0x8A, 0x48, 0x00, 0x03, 0x09, +0x3C, 0x43, 0xF6, 0x81, 0x84, 0x60, 0x3E, 0x37, +0xED, 0x16, 0xCC, 0x08, 0x84, 0xE0, 0x85, 0x00, +0x3E, 0x77, 0xED, 0x12, 0x3C, 0x8B, 0xF6, 0x88, +0xD5, 0x08, 0x3C, 0x57, 0xF6, 0x88, 0x9F, 0xA9, +0x3C, 0x6B, 0xF6, 0x88, 0x4E, 0x57, 0xFF, 0xF4, +0x3C, 0x00, 0x0F, 0x8A, 0x2E, 0x57, 0xED, 0x21, +0x85, 0x20, 0x96, 0x84, 0x3C, 0x9B, 0xF6, 0x87, +0x3E, 0x27, 0xED, 0x22, 0xD2, 0x07, 0x85, 0x82, +0x3E, 0xC7, 0xED, 0x23, 0x3E, 0x27, 0xED, 0x21, +0xD5, 0x0D, 0x2E, 0x17, 0xED, 0x23, 0xC9, 0x07, +0x85, 0x41, 0x40, 0xA4, 0x94, 0x1A, 0x3E, 0xA7, +0xED, 0x20, 0xD5, 0x04, 0x8E, 0x21, 0x3E, 0x17, +0xED, 0x23, 0x49, 0xFF, 0xFF, 0x28, 0x3C, 0x17, +0xF0, 0xAA, 0x3E, 0x9F, 0xDB, 0x60, 0xC9, 0x07, +0x2E, 0xD7, 0xE1, 0x52, 0x5A, 0xD8, 0x01, 0x04, +0x48, 0x00, 0x00, 0xA0, 0x3C, 0x20, 0x0E, 0x69, +0x3C, 0x53, 0xF0, 0xA7, 0xDA, 0x07, 0x3C, 0x53, +0xF0, 0xA8, 0x3C, 0x30, 0x0E, 0x6B, 0x4C, 0x51, +0x80, 0x95, 0x3C, 0x40, 0x0E, 0x8C, 0x97, 0xA4, +0xCE, 0x15, 0x3C, 0x50, 0x0E, 0x6B, 0x3C, 0x70, +0x0E, 0x6A, 0xDF, 0x10, 0x3C, 0x50, 0x0E, 0x68, +0xDA, 0x0D, 0x3C, 0x00, 0x0F, 0x74, 0x96, 0xC3, +0x4C, 0x21, 0xC0, 0x09, 0x2E, 0x67, 0xE1, 0x4D, +0xCE, 0x05, 0x84, 0x01, 0x49, 0x00, 0x0F, 0xC6, +0xD5, 0x2E, 0x3C, 0x40, 0x05, 0x07, 0x97, 0x2E, +0xC4, 0x08, 0x3C, 0x60, 0x0F, 0x70, 0x3C, 0xE0, +0x0E, 0x4A, 0x97, 0xF3, 0xE0, 0xEE, 0xE9, 0x71, +0x3C, 0x50, 0x0E, 0x8C, 0x97, 0xAC, 0xCE, 0x22, +0x3C, 0x00, 0x0F, 0x92, 0x96, 0x0E, 0xC0, 0x1E, +0x3C, 0x30, 0x0F, 0xDC, 0x97, 0x1B, 0x4C, 0x22, +0x40, 0x1A, 0x3C, 0x70, 0x11, 0x67, 0x3C, 0x50, +0x0F, 0xDD, 0x96, 0xFB, 0x96, 0x2B, 0x3C, 0x50, +0x0E, 0x6B, 0x88, 0x03, 0xD8, 0x0F, 0x80, 0x06, +0x49, 0x00, 0x0F, 0xA0, 0x3C, 0xA0, 0x0E, 0x69, +0x3C, 0xB0, 0x0E, 0x6B, 0x3C, 0xAB, 0xF0, 0xA7, +0x3C, 0xBB, 0xF0, 0xA8, 0x3C, 0x6B, 0xF0, 0xAA, +0xD5, 0x4C, 0x3C, 0x60, 0x0E, 0x9C, 0x3D, 0x00, +0x0E, 0x4C, 0x97, 0x33, 0xE0, 0x90, 0xE9, 0x45, +0x3D, 0x80, 0x0E, 0x5D, 0x85, 0x00, 0x3E, 0x38, +0x0A, 0x60, 0xE1, 0x18, 0xE8, 0x07, 0x39, 0x91, +0xA1, 0x01, 0x39, 0x94, 0xA1, 0x09, 0x8D, 0x01, +0xD5, 0xF9, 0x3C, 0x70, 0x0E, 0x8C, 0x96, 0xFC, +0xCB, 0x14, 0x8E, 0x21, 0x96, 0x4B, 0x3C, 0x1B, +0xF0, 0xAA, 0x4E, 0x16, 0x00, 0x2F, 0x3D, 0x10, +0x0E, 0x6B, 0x86, 0x40, 0x86, 0x61, 0x3C, 0x2B, +0xF0, 0xA7, 0x3D, 0x1B, 0xF0, 0xA8, 0x3D, 0x2B, +0xF0, 0xAA, 0x3F, 0x37, 0xE1, 0x52, 0xD5, 0x21, +0x3C, 0x00, 0x0E, 0x60, 0x84, 0xA0, 0x94, 0x01, +0x3E, 0x78, 0x0A, 0x60, 0xD0, 0x0A, 0x99, 0x2F, +0x41, 0x64, 0x94, 0x00, 0x03, 0x72, 0x05, 0x80, +0x13, 0x7B, 0x02, 0xC0, 0x8C, 0xA2, 0xD5, 0xF7, +0x3C, 0x50, 0x0E, 0x61, 0x3E, 0x38, 0x0A, 0x60, +0x95, 0xE9, 0x84, 0xA0, 0xD7, 0xD7, 0x99, 0xAB, +0x41, 0x44, 0x94, 0x00, 0x03, 0x53, 0x05, 0xA0, +0x13, 0x5A, 0x02, 0xE0, 0x8C, 0xA2, 0xD5, 0xF7, +0x49, 0xFF, 0xF3, 0xD8, 0x49, 0xFF, 0xFE, 0x22, +0x3C, 0x10, 0x05, 0x07, 0x96, 0x6E, 0x96, 0x89, +0x4E, 0x22, 0x00, 0xA9, 0x3C, 0x67, 0xF6, 0x74, +0x4E, 0x63, 0x00, 0xA7, 0x2E, 0x07, 0xEC, 0xFA, +0x4E, 0x03, 0x00, 0xA3, 0x3C, 0x70, 0x05, 0x08, +0x3C, 0x03, 0xF6, 0x81, 0x97, 0xD6, 0x3D, 0xE0, +0x0E, 0x4B, 0xC7, 0x04, 0x2E, 0x57, 0xED, 0x20, +0xC5, 0x2C, 0x3C, 0x40, 0x0E, 0xAE, 0x96, 0xE3, +0xE0, 0x7E, 0xE9, 0x08, 0x3C, 0x10, 0x0E, 0xAD, +0x3C, 0xC0, 0x0E, 0x4A, 0x96, 0x8B, 0xE0, 0x4C, +0xE8, 0x20, 0x5A, 0x08, 0x01, 0x1F, 0x3C, 0xD0, +0x0F, 0x7C, 0x3C, 0xDB, 0xF6, 0x82, 0x49, 0xFF, +0xF4, 0xC7, 0x49, 0xFF, 0xF4, 0xFF, 0x3C, 0x60, +0x0E, 0xAF, 0x3D, 0x10, 0x0F, 0x84, 0x3C, 0x70, +0x0F, 0x25, 0x3D, 0x20, 0x0F, 0x84, 0x88, 0xD1, +0x88, 0xF2, 0x85, 0xC2, 0x86, 0x00, 0x96, 0x31, +0x96, 0x79, 0x3C, 0xEB, 0xF6, 0x81, 0x3D, 0x0B, +0xF6, 0x86, 0x49, 0xFF, 0xF4, 0x76, 0xD5, 0x6E, +0x5A, 0x08, 0x02, 0x0A, 0x3C, 0x40, 0x0F, 0xBC, +0x96, 0xE3, 0xE0, 0x7E, 0xE9, 0x67, 0x3C, 0x50, +0x0F, 0x72, 0xD5, 0x0A, 0x5A, 0x08, 0x01, 0x0F, +0x3C, 0x60, 0x0F, 0x82, 0x97, 0xF3, 0xE0, 0xFE, +0xE9, 0x5D, 0x3C, 0x50, 0x0F, 0x80, 0x3D, 0x50, +0x0E, 0x4A, 0x96, 0x2B, 0xE0, 0x15, 0xE8, 0x29, +0xD5, 0x55, 0x3C, 0x50, 0x0F, 0x7E, 0x97, 0x2B, +0xE0, 0x9E, 0xE9, 0x08, 0x3C, 0x30, 0x0F, 0x7F, +0x3D, 0x30, 0x0E, 0x4A, 0x96, 0x5B, 0xE0, 0x33, +0xE8, 0x1B, 0x3D, 0x40, 0x0F, 0x7C, 0x3D, 0x4B, +0xF6, 0x82, 0x49, 0xFF, 0xF4, 0xBF, 0x3C, 0x00, +0x05, 0x08, 0x96, 0x16, 0x97, 0xC1, 0xC7, 0x0A, +0x2E, 0x27, 0xED, 0x20, 0xCA, 0x04, 0xFB, 0x04, +0x3C, 0x8B, 0xF6, 0x86, 0x49, 0xFF, 0xF4, 0x93, +0xD5, 0x35, 0x84, 0x01, 0x49, 0xFF, 0xF4, 0x74, +0x3C, 0x7B, 0xF6, 0x86, 0xD5, 0x30, 0xC0, 0x1E, +0x3C, 0x10, 0x0F, 0x70, 0x3C, 0xA0, 0x0E, 0x4A, +0x96, 0x8B, 0xE1, 0x42, 0xE8, 0x17, 0x3C, 0x57, +0xF6, 0x82, 0x9F, 0x29, 0x3C, 0x4B, 0xF6, 0x82, +0x4E, 0x56, 0x00, 0x1F, 0x3C, 0x00, 0x0E, 0xAF, +0x3C, 0x10, 0x0F, 0x25, 0x49, 0xFF, 0xF4, 0x21, +0x87, 0x00, 0x3F, 0x87, 0xED, 0x14, 0x49, 0xFF, +0xF4, 0x91, 0x86, 0xE0, 0x3D, 0x7B, 0xF6, 0x81, +0xD5, 0x0A, 0x3C, 0x60, 0x0F, 0x70, 0x3D, 0x60, +0x0E, 0x4A, 0x97, 0xF3, 0xE0, 0xF6, 0xE8, 0x08, +0x3D, 0x70, 0x0F, 0x7C, 0x3D, 0x7B, 0xF6, 0x82, +0xD5, 0x03, 0x3C, 0x2B, 0xF6, 0x81, 0x84, 0xE1, +0xD5, 0x02, 0x84, 0xE0, 0x3C, 0x80, 0x05, 0x08, +0x54, 0x34, 0x00, 0x04, 0xC3, 0x18, 0x2E, 0x07, +0xED, 0x20, 0xC8, 0x15, 0x3C, 0xB7, 0xF6, 0x86, +0x4E, 0xB7, 0x00, 0x12, 0x3C, 0x17, 0xF6, 0x74, +0xC9, 0x0E, 0x2E, 0xC7, 0xEC, 0xFA, 0x4E, 0xC3, +0x00, 0x0B, 0x8F, 0x61, 0x3C, 0xBB, 0xF6, 0x86, +0x49, 0xFF, 0xF4, 0x45, 0x49, 0x00, 0x0F, 0xB4, +0x48, 0x00, 0x01, 0x51, 0x87, 0x20, 0x54, 0x24, +0x00, 0x08, 0x3D, 0x9B, 0xF6, 0x86, 0x3F, 0x97, +0xE1, 0x63, 0x3F, 0x97, 0xE1, 0x61, 0x2E, 0x50, +0x03, 0x22, 0xCA, 0x06, 0x3F, 0x97, 0xE1, 0x60, +0x3F, 0x97, 0xE1, 0x64, 0xD5, 0x0C, 0x3C, 0x60, +0x10, 0xF4, 0xC6, 0x0D, 0x3F, 0x97, 0xE1, 0x60, +0x3F, 0x97, 0xE1, 0x64, 0x3D, 0x9B, 0xF0, 0xB5, +0x3D, 0x9B, 0xF0, 0xB6, 0x3F, 0x97, 0xE1, 0x62, +0x48, 0x00, 0x01, 0x81, 0xCD, 0x0F, 0x2E, 0x40, +0x03, 0x2C, 0xC4, 0x0C, 0x3C, 0xE0, 0x0E, 0x4F, +0x3D, 0x30, 0x0E, 0x52, 0x3C, 0xEB, 0xF0, 0xB7, +0x3D, 0x3B, 0xF0, 0xB8, 0x3C, 0xD0, 0x0E, 0x55, +0xD5, 0x17, 0x3D, 0xE4, 0x0E, 0x4F, 0x3D, 0x07, +0xF0, 0xB7, 0xE1, 0x9E, 0xE8, 0x03, 0x3D, 0xEB, +0xF0, 0xB7, 0x3C, 0xC4, 0x0E, 0x52, 0x3D, 0x17, +0xF0, 0xB8, 0xE1, 0xAC, 0xE8, 0x03, 0x3C, 0xCB, +0xF0, 0xB8, 0x3C, 0xD4, 0x0E, 0x55, 0x3D, 0x27, +0xF0, 0xB9, 0xE1, 0xCD, 0xE8, 0x03, 0x3C, 0xDB, +0xF0, 0xB9, 0x2E, 0xB7, 0xE1, 0x60, 0x4E, 0xB3, +0x00, 0x1D, 0x3C, 0x00, 0x10, 0x9E, 0x3D, 0x17, +0xF0, 0xB7, 0x96, 0x43, 0xE1, 0xA1, 0xE9, 0x30, +0x3C, 0x20, 0x10, 0x9F, 0x97, 0x93, 0xE1, 0xA6, +0xE8, 0x2B, 0x3C, 0x30, 0x10, 0xA0, 0x3D, 0x27, +0xF0, 0xB8, 0x96, 0x1B, 0xE1, 0xC0, 0x84, 0x81, +0xE8, 0x24, 0x3C, 0x10, 0x10, 0xA1, 0x3D, 0x37, +0xF0, 0xB9, 0x96, 0x8B, 0xE1, 0xE2, 0xD5, 0x19, +0x84, 0xC0, 0x5A, 0xB8, 0x01, 0x1C, 0x3C, 0x30, +0x10, 0xA5, 0x3C, 0xA7, 0xF0, 0xB7, 0x96, 0x1B, +0xE1, 0x40, 0x84, 0x80, 0xE8, 0x12, 0x3C, 0x10, +0x10, 0xA0, 0x3C, 0x67, 0xF0, 0xB8, 0x96, 0x8B, +0xE0, 0xC2, 0xE8, 0x0A, 0x3C, 0x40, 0x10, 0xA1, +0x3D, 0x07, 0xF0, 0xB9, 0x96, 0xE3, 0xE1, 0x83, +0x56, 0x47, 0x80, 0x01, 0xD5, 0x02, 0x80, 0x8B, +0x97, 0xA0, 0x3C, 0xE0, 0x0E, 0x54, 0x3C, 0x20, +0x10, 0xA2, 0x80, 0x2E, 0x3C, 0x30, 0x0E, 0x64, +0x3C, 0x40, 0x0E, 0x65, 0x3E, 0x08, 0x1C, 0x24, +0xF5, 0x81, 0x49, 0xFF, 0xFC, 0x98, 0x3C, 0xD0, +0x0E, 0x57, 0x3C, 0x20, 0x10, 0xA2, 0x80, 0x2D, +0x3C, 0x30, 0x0E, 0x66, 0x3C, 0x40, 0x0E, 0x67, +0x81, 0x80, 0x3E, 0x08, 0x1C, 0x64, 0x49, 0xFF, +0xFC, 0x8A, 0x12, 0xEF, 0x80, 0x06, 0x12, 0xDF, +0x80, 0x07, 0x81, 0x40, 0xF0, 0x03, 0x49, 0x00, +0x05, 0x5A, 0x80, 0x40, 0xF5, 0x01, 0xC8, 0x18, +0x3C, 0x40, 0x10, 0xA3, 0x96, 0xE3, 0x40, 0xF6, +0x0C, 0x07, 0xE9, 0x2C, 0x3C, 0x00, 0x10, 0xA4, +0x96, 0x43, 0x40, 0xF6, 0x04, 0x07, 0xE8, 0x26, +0x3C, 0x40, 0x10, 0xA3, 0x96, 0xE3, 0xE1, 0x43, +0xE9, 0x21, 0x3C, 0x20, 0x10, 0xA4, 0x96, 0x13, +0x40, 0x25, 0x00, 0x07, 0xD5, 0x1B, 0x3C, 0x40, +0x10, 0xA4, 0x96, 0xE3, 0x40, 0xF6, 0x0C, 0x07, +0xE8, 0x14, 0x3C, 0x00, 0x10, 0xA4, 0x96, 0x43, +0xE1, 0x41, 0xE8, 0x0F, 0x3C, 0x40, 0x10, 0xA3, +0x84, 0x41, 0x96, 0xE3, 0x40, 0xF6, 0x0C, 0x07, +0xE8, 0x09, 0x3C, 0x00, 0x10, 0xA3, 0x96, 0x43, +0xE1, 0x41, 0x56, 0x27, 0x80, 0x01, 0xD5, 0x02, +0x84, 0x40, 0x96, 0x50, 0xC6, 0x08, 0x4E, 0x12, +0x03, 0xAF, 0x86, 0x81, 0x3F, 0x47, 0xE1, 0x61, +0x48, 0x00, 0x03, 0xAA, 0x4E, 0x53, 0x03, 0x34, +0x2E, 0x40, 0x03, 0x2C, 0x4E, 0x43, 0x03, 0x2D, +0x4E, 0x62, 0x03, 0x2E, 0x2E, 0x67, 0xE1, 0x61, +0x4E, 0x63, 0x03, 0x2D, 0x3C, 0x00, 0x0E, 0x9E, +0x84, 0xC3, 0x96, 0x43, 0xE4, 0x24, 0xE8, 0x05, +0x3C, 0x40, 0x0E, 0x9E, 0x97, 0xA3, 0x8E, 0xC1, +0x4E, 0xB3, 0x03, 0x2F, 0x3C, 0x10, 0x10, 0x9F, +0x3D, 0x07, 0xF0, 0xB7, 0x97, 0x0B, 0xE1, 0x84, +0xE9, 0x05, 0x3E, 0xB7, 0xE1, 0x64, 0x3E, 0xB7, +0xE1, 0x62, 0x2E, 0x37, 0xE1, 0x62, 0x4E, 0x32, +0x03, 0x59, 0x3C, 0x23, 0xF0, 0xB6, 0x8C, 0x41, +0x96, 0x13, 0xE0, 0xC0, 0x3C, 0x0B, 0xF0, 0xB6, +0x4E, 0xF2, 0x03, 0x13, 0x86, 0x21, 0x3C, 0x6B, +0xF0, 0xB6, 0x3F, 0x17, 0xE1, 0x64, 0x3C, 0x60, +0x10, 0x94, 0xCE, 0x74, 0x3C, 0x40, 0x0F, 0x8A, +0x97, 0x16, 0x96, 0xE1, 0x4E, 0x32, 0x03, 0x49, +0x85, 0x81, 0x3E, 0xC7, 0xE1, 0x60, 0x2E, 0xD7, +0xE1, 0x60, 0x3E, 0xD7, 0xE1, 0x64, 0x4E, 0x53, +0x00, 0x8C, 0x2E, 0x60, 0x03, 0x2C, 0x4E, 0x62, +0x00, 0x88, 0x3C, 0x17, 0xF6, 0x74, 0x4E, 0x13, +0x00, 0x84, 0x2E, 0xC7, 0xEC, 0xFA, 0x4E, 0xC3, +0x00, 0x80, 0x54, 0x44, 0x00, 0x02, 0x84, 0xC1, +0xCC, 0x6E, 0x49, 0xFF, 0xFC, 0x8A, 0xFE, 0x36, +0x97, 0x40, 0xCD, 0x76, 0x86, 0xC2, 0x3D, 0x68, +0x0F, 0x7B, 0x3C, 0x00, 0x10, 0x40, 0x49, 0x00, +0x29, 0xE7, 0x49, 0x00, 0x0E, 0x69, 0x49, 0xFF, +0xFC, 0x62, 0x49, 0xFF, 0xF1, 0xBB, 0x49, 0x00, +0x0B, 0x99, 0x3C, 0x60, 0x0F, 0x8A, 0x96, 0x33, +0x59, 0x70, 0x00, 0x40, 0x3D, 0x78, 0x0F, 0x8A, +0x48, 0x00, 0x03, 0x3A, 0x85, 0xA5, 0x3C, 0xD8, +0x0F, 0x7B, 0x48, 0xFF, 0xFC, 0xC2, 0x44, 0xE0, +0x7F, 0xFF, 0x3C, 0xE8, 0x0F, 0x55, 0x3C, 0xE8, +0x10, 0xDB, 0x3C, 0xE8, 0x10, 0xDC, 0x3C, 0x43, +0xF6, 0x81, 0x4E, 0x43, 0x01, 0x6F, 0x3C, 0x60, +0x05, 0x09, 0x97, 0xAE, 0x97, 0x31, 0x4E, 0x42, +0x01, 0x6D, 0x3C, 0x27, 0xF6, 0x74, 0x4E, 0x27, +0x01, 0x6D, 0x2F, 0x47, 0xEC, 0xFA, 0x5B, 0x40, +0x01, 0x04, 0x48, 0x00, 0x01, 0x67, 0x85, 0x00, +0x3C, 0x88, 0x10, 0xF4, 0x3C, 0x8B, 0xF9, 0xE7, +0x3C, 0x8B, 0xF9, 0xEA, 0x49, 0xFF, 0xF2, 0xFE, +0x5C, 0x20, 0x00, 0x01, 0xFF, 0xD6, 0x97, 0xFA, +0x49, 0x00, 0x0B, 0x60, 0xC7, 0xD0, 0x86, 0xA0, +0x3D, 0x58, 0x0F, 0x7B, 0x85, 0x81, 0x48, 0x00, +0x03, 0x03, 0x2F, 0x27, 0xE1, 0x64, 0x2F, 0x37, +0xE1, 0x60, 0x4D, 0x39, 0x42, 0xDC, 0x2E, 0x27, +0xE1, 0x60, 0x4E, 0x23, 0x02, 0xEE, 0x2E, 0x17, +0xE1, 0x62, 0xC1, 0x04, 0x85, 0xC1, 0x3E, 0xE7, +0xE1, 0x63, 0x3C, 0x20, 0x0F, 0x8A, 0x96, 0x13, +0x67, 0x40, 0x00, 0x04, 0x3D, 0x48, 0x0F, 0x8A, +0x48, 0xFF, 0xFF, 0x83, 0x3C, 0x33, 0xF6, 0x81, +0xC3, 0x05, 0x80, 0x05, 0x49, 0xFF, 0xF1, 0x31, +0xD5, 0x05, 0x3C, 0x00, 0x0E, 0x68, 0x49, 0xFF, +0xF1, 0x0B, 0x80, 0xC0, 0xD5, 0x87, 0x3C, 0x20, +0x0F, 0x8A, 0x96, 0x13, 0x66, 0x80, 0x00, 0x40, +0x3C, 0x88, 0x0F, 0x8A, 0x49, 0x00, 0x0D, 0xF4, +0xCF, 0x0C, 0x3C, 0x17, 0xF6, 0x74, 0xC9, 0x09, +0x2E, 0xC7, 0xEC, 0xFA, 0x4E, 0xC3, 0x00, 0x06, +0x49, 0xFF, 0xFB, 0xC4, 0x85, 0x63, 0xD5, 0x2B, +0x3C, 0x40, 0x05, 0x07, 0x97, 0x2E, 0xC4, 0x2B, +0x3C, 0x37, 0xF6, 0x74, 0xCB, 0x28, 0x2E, 0xC7, +0xEC, 0xFA, 0x4E, 0xC3, 0x00, 0x25, 0x3C, 0x60, +0x0F, 0x71, 0x3D, 0x54, 0x0E, 0x4F, 0x97, 0x73, +0xE0, 0xB5, 0xE9, 0x0F, 0x3C, 0x20, 0x0F, 0x7D, +0x3D, 0x04, 0x0E, 0x50, 0x96, 0x13, 0xE1, 0x80, +0xE9, 0x08, 0x3C, 0x10, 0x0F, 0x79, 0x3D, 0x60, +0x0E, 0x4C, 0x97, 0x0B, 0xE0, 0x96, 0xE8, 0x0F, +0x3C, 0x10, 0x0F, 0x8A, 0x85, 0x64, 0x96, 0xCB, +0x59, 0x01, 0x80, 0x20, 0x3D, 0x08, 0x0F, 0x8A, +0x49, 0xFF, 0xFB, 0x98, 0x3C, 0xB8, 0x0F, 0x7B, +0x48, 0x00, 0x02, 0x9A, 0x3C, 0x30, 0x0F, 0x8A, +0x2E, 0x57, 0xE1, 0x52, 0x97, 0x9B, 0x67, 0x73, +0x00, 0x20, 0x3D, 0x78, 0x0F, 0x8A, 0x4E, 0x52, +0xFF, 0x5C, 0x3C, 0x80, 0x0E, 0x61, 0x44, 0x5F, +0x80, 0x00, 0x8F, 0x01, 0x84, 0x81, 0x3E, 0xD8, +0x0A, 0x60, 0x86, 0xA2, 0xE0, 0x88, 0xE8, 0x2E, +0x96, 0xA1, 0x9E, 0x11, 0x8C, 0x41, 0x96, 0xC3, +0x97, 0x93, 0x50, 0xB1, 0x85, 0xA0, 0x51, 0x81, +0x82, 0xE0, 0x50, 0xF3, 0x05, 0xA0, 0x50, 0xA3, +0x02, 0xE0, 0x96, 0x63, 0x38, 0x36, 0xBD, 0x11, +0x38, 0x04, 0xA9, 0x11, 0x39, 0x76, 0xAD, 0x11, +0x39, 0x94, 0xE1, 0x11, 0x51, 0x00, 0x85, 0xA0, +0x51, 0x60, 0x82, 0xE0, 0x9B, 0x98, 0x38, 0x26, +0xC1, 0x11, 0x38, 0x14, 0xD9, 0x11, 0x41, 0xEB, +0xE4, 0x01, 0x88, 0xDE, 0x9A, 0x51, 0x40, 0x23, +0x54, 0x56, 0x8A, 0x22, 0x42, 0x30, 0x80, 0x03, +0x96, 0x1B, 0x42, 0x50, 0x14, 0x00, 0x8C, 0x81, +0xD5, 0xD2, 0x3C, 0xB0, 0x0E, 0x60, 0x3C, 0x58, +0x10, 0xDB, 0x8F, 0x61, 0x44, 0xCF, 0x80, 0x00, +0x84, 0x81, 0x3F, 0x78, 0x0A, 0x60, 0x87, 0x02, +0xE0, 0x8B, 0xE8, 0x2E, 0x96, 0x21, 0x9E, 0xC1, +0x8C, 0x01, 0x97, 0x9B, 0x96, 0x83, 0x50, 0xF3, +0x05, 0x80, 0x50, 0xE3, 0x02, 0xC0, 0x51, 0x21, +0x05, 0x80, 0x51, 0x31, 0x02, 0xC0, 0x96, 0x63, +0x38, 0x3B, 0xC9, 0x11, 0x38, 0x64, 0xCD, 0x11, +0x38, 0xAB, 0xBD, 0x11, 0x39, 0x44, 0xB9, 0x11, +0x51, 0x90, 0x85, 0x80, 0x51, 0xE0, 0x82, 0xC0, +0x9A, 0x9E, 0x38, 0x0B, 0xE5, 0x11, 0x38, 0x14, +0xF9, 0x11, 0x41, 0x15, 0x50, 0x01, 0x88, 0x51, +0x9A, 0x41, 0x40, 0x01, 0x60, 0x16, 0x8A, 0x20, +0x42, 0x30, 0x80, 0x03, 0x97, 0x9B, 0x42, 0xC3, +0x30, 0x00, 0x8C, 0x81, 0xD5, 0xD2, 0x2E, 0x20, +0x03, 0x22, 0x3C, 0xC8, 0x10, 0xDC, 0xCA, 0x04, +0x2E, 0x00, 0x03, 0x2C, 0xC8, 0x08, 0x3C, 0x10, +0x0F, 0x4D, 0x3D, 0x80, 0x0E, 0x4C, 0x97, 0x0B, +0xE0, 0x98, 0xE9, 0x4D, 0x3D, 0x97, 0xF6, 0x74, +0x4F, 0x96, 0x00, 0x4A, 0x2F, 0xE7, 0xEC, 0xFA, +0x5B, 0xE0, 0x01, 0x46, 0x3C, 0xB0, 0x0E, 0x5E, +0x3D, 0x40, 0x0E, 0x5F, 0x51, 0x15, 0xFF, 0xFF, +0x45, 0x0F, 0x80, 0x00, 0x84, 0x80, 0x3F, 0x28, +0x0A, 0x60, 0x45, 0x30, 0x7F, 0xFF, 0x85, 0xC2, +0xE0, 0x94, 0xE8, 0x31, 0x97, 0xA3, 0x85, 0x41, +0xE1, 0x51, 0xE8, 0x2B, 0x40, 0x3A, 0x18, 0x00, +0x96, 0x99, 0x38, 0x39, 0x19, 0x11, 0x40, 0xC1, +0x00, 0x11, 0x40, 0xD3, 0x04, 0x08, 0x4C, 0x39, +0x80, 0x1E, 0x38, 0x59, 0x31, 0x11, 0x4C, 0x59, +0x80, 0x1A, 0x88, 0x54, 0x96, 0x53, 0x38, 0x89, +0x05, 0x11, 0x4C, 0x89, 0x80, 0x14, 0x38, 0x04, +0xB1, 0x11, 0x39, 0x54, 0x85, 0x11, 0x9A, 0xA8, +0x38, 0x54, 0xB4, 0x11, 0x8B, 0x15, 0x8A, 0x65, +0x88, 0x68, 0x40, 0x11, 0xB8, 0x36, 0x9A, 0x11, +0x42, 0x20, 0x00, 0x03, 0x97, 0x53, 0x43, 0x02, +0xC0, 0x00, 0x8D, 0x41, 0x80, 0xCC, 0xD5, 0xD5, +0x8C, 0x81, 0xD5, 0xCF, 0x3D, 0x08, 0x0F, 0x55, +0x48, 0xFF, 0xFE, 0x97, 0x45, 0x60, 0x7F, 0xFF, +0x3D, 0x68, 0x0F, 0x55, 0x48, 0xFF, 0xFE, 0x91, +0x2E, 0x47, 0xED, 0x12, 0x4E, 0x43, 0xFE, 0x91, +0x3C, 0x48, 0x10, 0xF4, 0x48, 0x00, 0x00, 0x99, +0x3C, 0x10, 0x10, 0xF5, 0x96, 0xCB, 0x4E, 0x34, +0x00, 0x07, 0x85, 0x21, 0x3C, 0x98, 0x10, 0xF4, +0x48, 0xFF, 0xFE, 0x9A, 0x3C, 0x00, 0x10, 0xF6, +0x3D, 0x20, 0x0E, 0x4C, 0x97, 0x43, 0x86, 0x20, +0xE0, 0xB2, 0x3D, 0x1B, 0xF9, 0xEA, 0xE9, 0x07, +0x2E, 0x40, 0x03, 0x22, 0xCC, 0x04, 0x2E, 0x60, +0x03, 0x2C, 0xCE, 0x04, 0x86, 0x20, 0x48, 0x00, +0x01, 0x16, 0x4E, 0x23, 0x01, 0x10, 0x3C, 0x20, +0x10, 0xF5, 0x96, 0xA6, 0xC2, 0x23, 0x2E, 0x17, +0xE1, 0x4C, 0xC9, 0x20, 0x3C, 0x30, 0x0E, 0x8C, +0x96, 0x1C, 0xC0, 0x1C, 0x3C, 0x50, 0x0F, 0x55, +0x3C, 0x60, 0x11, 0x04, 0x97, 0x2B, 0x96, 0xB3, +0xE0, 0x44, 0xE8, 0x14, 0x3C, 0x10, 0x10, 0xDB, +0x3C, 0x00, 0x10, 0xF9, 0x96, 0xCB, 0x97, 0x43, +0xE0, 0x65, 0xE8, 0x0C, 0x86, 0x41, 0x86, 0x60, +0x85, 0x80, 0x3F, 0x27, 0xE1, 0x4D, 0x3F, 0x37, +0xE1, 0x52, 0x3C, 0xCB, 0xF0, 0xA7, 0x48, 0xFF, +0xFE, 0x5F, 0x3C, 0x40, 0x0F, 0x55, 0x3C, 0x20, +0x11, 0x04, 0x97, 0xA3, 0x96, 0x53, 0x86, 0x61, +0xE0, 0x26, 0x3F, 0x37, 0xE1, 0x4C, 0xE8, 0x17, +0x3C, 0x30, 0x10, 0xDB, 0x3C, 0x00, 0x10, 0xF9, +0x97, 0x5B, 0x97, 0x03, 0xE0, 0xA4, 0xE8, 0x0F, +0x3C, 0xA7, 0xF9, 0xE4, 0x87, 0xC0, 0x3D, 0xEB, +0xF9, 0xE6, 0x86, 0x82, 0x5A, 0xA8, 0x02, 0x20, +0x3D, 0x10, 0x10, 0xF4, 0x5B, 0x18, 0x02, 0x23, +0x87, 0x00, 0xD5, 0x56, 0x3C, 0x60, 0x0F, 0x55, +0x3C, 0x10, 0x10, 0xFA, 0x96, 0xB3, 0x96, 0xCB, +0xE0, 0x62, 0xE8, 0x2E, 0x3C, 0x50, 0x10, 0xDB, +0x3C, 0x00, 0x10, 0xF9, 0x97, 0x2B, 0x97, 0x83, +0xE0, 0x86, 0xE8, 0x26, 0x3C, 0xA7, 0xF9, 0xE4, +0x87, 0xC0, 0x3D, 0xEB, 0xF9, 0xE6, 0x5A, 0xA0, +0x01, 0x06, 0x86, 0x81, 0x3D, 0x4B, 0xF9, 0xE4, +0xD5, 0x60, 0x3C, 0xE0, 0x10, 0xF4, 0x5A, 0xE0, +0x01, 0xE1, 0x3C, 0x33, 0xF9, 0xE5, 0x3C, 0x00, +0x11, 0x07, 0x8C, 0x61, 0x97, 0x9B, 0x97, 0x43, +0xE0, 0xA6, 0x3C, 0x6B, 0xF9, 0xE5, 0x4E, 0xF2, +0xFE, 0x13, 0x3C, 0xA8, 0x10, 0xF4, 0x3D, 0xEB, +0xF9, 0xE5, 0x3C, 0x40, 0x11, 0x13, 0x3C, 0x4B, +0xF9, 0xE7, 0x48, 0xFF, 0xFE, 0x09, 0x3C, 0x20, +0x0F, 0x55, 0x3C, 0x30, 0x10, 0xF8, 0x96, 0x53, +0x97, 0x5B, 0xE0, 0x25, 0xE8, 0x42, 0x3C, 0x40, +0x10, 0xDB, 0x3C, 0x00, 0x10, 0xF9, 0x97, 0xA3, +0x96, 0x83, 0xE0, 0xC2, 0xE9, 0x09, 0x3C, 0x10, +0x10, 0xDC, 0x3C, 0x50, 0x10, 0xF9, 0x96, 0xCB, +0x97, 0x2B, 0xE0, 0x64, 0xE8, 0x32, 0x3C, 0x17, +0xF9, 0xE4, 0x87, 0x00, 0x3D, 0x8B, 0xF9, 0xE6, +0xC1, 0x07, 0x3D, 0x8B, 0xF9, 0xE4, 0x3D, 0x8B, +0xF9, 0xE5, 0x48, 0xFF, 0xFD, 0xE5, 0x3D, 0x90, +0x10, 0xF4, 0x5B, 0x90, 0x02, 0x09, 0x3C, 0x00, +0x10, 0xF4, 0x87, 0xC0, 0x3D, 0xEB, 0xF9, 0xE7, +0xC8, 0x0A, 0xD5, 0x9B, 0x3C, 0x37, 0xF9, 0xE7, +0x9F, 0x99, 0x3C, 0x6B, 0xF9, 0xE7, 0x4E, 0x36, +0xFD, 0xD3, 0xD5, 0xF2, 0x3C, 0x53, 0xF9, 0xE5, +0x3C, 0x20, 0x11, 0x07, 0x8C, 0xA1, 0x97, 0x2B, +0x96, 0x53, 0xE0, 0x24, 0x3C, 0x4B, 0xF9, 0xE5, +0x4E, 0xF2, 0xFD, 0xC6, 0x3D, 0xE8, 0x10, 0xF4, +0x3D, 0xEB, 0xF9, 0xE5, 0x48, 0xFF, 0xFD, 0xC0, +0x3C, 0x60, 0x10, 0xDB, 0x3C, 0x20, 0x10, 0xF9, +0x96, 0x33, 0x96, 0x53, 0xE0, 0x20, 0x4E, 0xF2, +0xFD, 0xB7, 0x3C, 0x40, 0x11, 0x13, 0x3C, 0x37, +0xF9, 0xE6, 0x97, 0xA3, 0x9D, 0x59, 0xE0, 0xC3, +0x3C, 0x5B, 0xF9, 0xE6, 0x4E, 0xF2, 0xFD, 0xAC, +0x85, 0x80, 0x3C, 0xC8, 0x10, 0xF4, 0x3C, 0xCB, +0xF9, 0xE5, 0x3C, 0xCB, 0xF9, 0xE6, 0x3D, 0x60, +0x0E, 0x5D, 0x85, 0x60, 0x3E, 0x48, 0x0A, 0x60, +0xE1, 0x76, 0xE8, 0x07, 0x39, 0x72, 0x2D, 0x01, +0x39, 0x74, 0xAD, 0x09, 0x8D, 0x61, 0xD5, 0xF9, +0x3C, 0x00, 0x0E, 0x5E, 0x84, 0xA0, 0x95, 0x81, +0x3E, 0x08, 0x0A, 0x60, 0xD6, 0x0A, 0x98, 0xA8, +0x41, 0x54, 0x94, 0x00, 0x03, 0x01, 0x05, 0x80, +0x13, 0x0A, 0x82, 0xC0, 0x8C, 0xA2, 0xD5, 0xF7, +0x3C, 0x20, 0x0E, 0x5F, 0x84, 0xA0, 0x95, 0x11, +0x3E, 0x18, 0x0A, 0x60, 0x4C, 0x52, 0x3D, 0x80, +0x98, 0xE9, 0x40, 0x84, 0x94, 0x00, 0x02, 0xD1, +0x85, 0xA0, 0x12, 0xD4, 0x02, 0xE0, 0x8C, 0xA2, +0xD5, 0xF6, 0x3C, 0x4B, 0xF9, 0xE4, 0x3D, 0x18, +0x10, 0xF4, 0x3D, 0x1B, 0xF9, 0xE5, 0x3D, 0x1B, +0xF9, 0xE6, 0x48, 0xFF, 0xFD, 0x6D, 0x2E, 0x37, +0xE1, 0x61, 0xCB, 0x03, 0x86, 0xA0, 0xD5, 0x08, +0xC6, 0xFE, 0x2E, 0x27, 0xF3, 0xDF, 0xC2, 0x03, +0x4E, 0x53, 0xFC, 0xD2, 0x86, 0xA1, 0x3F, 0x57, +0xE1, 0x62, 0x48, 0xFF, 0xFC, 0xCD, 0x84, 0x00, +0x3C, 0x0B, 0xF0, 0xB4, 0xD5, 0x18, 0x5A, 0xB8, +0x01, 0x39, 0x3C, 0x30, 0x10, 0xA5, 0x3D, 0x67, +0xF0, 0xB7, 0x96, 0x9B, 0xE0, 0x56, 0xE8, 0x1A, +0x3C, 0x23, 0xF0, 0xB5, 0x87, 0x20, 0x8C, 0x41, +0x96, 0x13, 0x87, 0x00, 0xE4, 0x0B, 0x3F, 0x87, +0xE1, 0x62, 0x3D, 0x9B, 0xF0, 0xB6, 0x3D, 0x9B, +0xF0, 0xB4, 0xE8, 0x05, 0x3C, 0x0B, 0xF0, 0xB5, +0x48, 0xFF, 0xFC, 0xD7, 0x87, 0xCA, 0x3D, 0xEB, +0xF0, 0xB5, 0x3F, 0x97, 0xE1, 0x64, 0x48, 0xFF, +0xFC, 0xD0, 0xCD, 0x14, 0x2E, 0x00, 0x03, 0x2C, +0xC0, 0x11, 0x3C, 0x13, 0xF0, 0xB4, 0x3C, 0x60, +0x10, 0xA6, 0x8C, 0x21, 0x97, 0x0B, 0x96, 0xF3, +0xE0, 0x64, 0x3C, 0x4B, 0xF0, 0xB4, 0xE8, 0x09, +0x3E, 0x57, 0xE1, 0x60, 0x3E, 0x57, 0xE1, 0x64, +0xD5, 0x04, 0x86, 0xE0, 0x3D, 0x7B, 0xF0, 0xB4, +0x85, 0x60, 0x3C, 0xBB, 0xF0, 0xB5, 0x3C, 0xBB, +0xF0, 0xB6, 0x48, 0xFF, 0xFC, 0xB2, 0x3E, 0x37, +0xE1, 0x60, 0x3E, 0x37, 0xE1, 0x62, 0x48, 0xFF, +0xFC, 0xB8, 0x4E, 0x53, 0xFD, 0x26, 0x2E, 0x10, +0x03, 0x2C, 0x4E, 0x12, 0xFD, 0x22, 0x3C, 0x40, +0x10, 0xA5, 0x3C, 0xA7, 0xF0, 0xB7, 0x96, 0xE3, +0xE1, 0x43, 0x4E, 0xF2, 0xFD, 0x1A, 0x3F, 0x27, +0xE1, 0x60, 0x3C, 0x5B, 0xF0, 0xB5, 0x3C, 0x5B, +0xF0, 0xB6, 0x48, 0xFF, 0xFD, 0x12, 0x3C, 0x00, +0x0F, 0x8A, 0x97, 0x83, 0x59, 0x43, 0x00, 0x04, +0x48, 0xFF, 0xFD, 0x1A, 0x4E, 0x52, 0xFC, 0x5A, +0x48, 0xFF, 0xFC, 0x5E, 0x80, 0x0C, 0xFC, 0xE2, +0x80, 0x80, 0xCA, 0x0C, 0x45, 0x00, 0x00, 0x5C, +0x3E, 0x0F, 0xE1, 0x98, 0x42, 0x02, 0x40, 0x73, +0x3B, 0x10, 0x44, 0x00, 0x3B, 0x10, 0xC4, 0x20, +0xDD, 0x9E, 0x5A, 0x28, 0x01, 0x1C, 0x44, 0x00, +0x00, 0x5C, 0x3E, 0x3F, 0xE1, 0x98, 0x42, 0x32, +0x00, 0x73, 0x44, 0xF0, 0x00, 0x64, 0x04, 0x21, +0x80, 0x12, 0x04, 0x51, 0x80, 0x0C, 0x9B, 0x15, +0x04, 0x51, 0x80, 0x13, 0x04, 0x31, 0x80, 0x0D, +0x88, 0x44, 0x40, 0x01, 0x3C, 0x16, 0x9A, 0xAB, +0x88, 0xA2, 0x40, 0x42, 0xBC, 0x96, 0xAC, 0x08, +0xAD, 0x09, 0xDD, 0x9E, 0xFC, 0x20, 0x3E, 0x2F, +0xFF, 0x08, 0x44, 0x30, 0x00, 0x38, 0x80, 0x82, +0x42, 0x40, 0x8C, 0x73, 0x3E, 0x3F, 0xE1, 0x98, +0x00, 0x42, 0x00, 0x30, 0x44, 0x70, 0x00, 0x5C, +0x80, 0xC3, 0x42, 0x60, 0x1C, 0x73, 0xCC, 0x0D, +0x86, 0x21, 0x51, 0x03, 0x00, 0x50, 0x11, 0x13, +0x00, 0x50, 0x2E, 0x67, 0xE1, 0x62, 0xCE, 0x02, +0x84, 0x8A, 0x12, 0x48, 0x00, 0x01, 0xD5, 0x11, +0x50, 0x83, 0x00, 0x50, 0x02, 0x44, 0x00, 0x01, +0x8E, 0x81, 0x97, 0x63, 0x12, 0x54, 0x00, 0x01, +0x4E, 0x54, 0x00, 0x08, 0x85, 0xE0, 0x84, 0xE0, +0x10, 0xF3, 0x00, 0x50, 0x12, 0x74, 0x00, 0x01, +0x45, 0x20, 0x00, 0x5C, 0x42, 0x30, 0x48, 0x73, +0x45, 0x40, 0x00, 0x38, 0x01, 0x31, 0x80, 0x50, +0x80, 0x03, 0x42, 0x20, 0xD0, 0x73, 0x5B, 0x38, +0x01, 0x04, 0xA0, 0x51, 0xD5, 0x02, 0xB4, 0x22, +0xB6, 0x20, 0xFC, 0xA0, 0xFC, 0x60, 0x44, 0x70, +0x00, 0x5C, 0xFF, 0xC4, 0x3E, 0x9F, 0xE1, 0x98, +0x40, 0x64, 0x9C, 0x00, 0x50, 0xA3, 0x00, 0x50, +0x84, 0x40, 0x85, 0x60, 0x10, 0x23, 0x00, 0x50, +0x12, 0xB5, 0x00, 0x01, 0x81, 0x81, 0x49, 0xFF, +0xFF, 0xAF, 0x44, 0x10, 0x00, 0x38, 0x3E, 0x0F, +0xFF, 0x08, 0x42, 0x06, 0x04, 0x73, 0x83, 0x86, +0xA1, 0x45, 0x22, 0x20, 0x00, 0x00, 0xA9, 0x75, +0xA9, 0x76, 0x44, 0x50, 0x00, 0x64, 0xA4, 0xC4, +0xB4, 0x20, 0xFE, 0xAC, 0x50, 0x84, 0x80, 0x08, +0x38, 0x14, 0x1C, 0x0A, 0x10, 0xB3, 0x00, 0x20, +0xAC, 0xF7, 0x12, 0x33, 0x00, 0x08, 0xA8, 0x71, +0xBA, 0x90, 0xBA, 0x92, 0x22, 0x00, 0x00, 0x01, +0x51, 0x24, 0x80, 0x30, 0xFE, 0x2C, 0x50, 0xD4, +0x80, 0x48, 0xB8, 0x91, 0xB8, 0x93, 0x89, 0xC7, +0x88, 0xED, 0x3B, 0x03, 0xC4, 0x00, 0x50, 0x43, +0x00, 0x20, 0x84, 0xE0, 0xFF, 0x5C, 0x3B, 0x09, +0x44, 0x20, 0xA9, 0xE1, 0x14, 0x55, 0x00, 0x01, +0xFC, 0xE0, 0x4E, 0x05, 0x00, 0x2B, 0xFC, 0x61, +0x46, 0x97, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x42, +0xB0, 0x41, 0x96, 0x98, 0x49, 0xFF, 0xFF, 0x46, +0x84, 0xFF, 0x2E, 0xB8, 0x03, 0x23, 0x50, 0x84, +0x8F, 0xFF, 0x84, 0xC0, 0x3E, 0xDF, 0xFF, 0x08, +0x44, 0xE0, 0x00, 0x38, 0xE0, 0xCB, 0xE8, 0x12, +0x40, 0x06, 0x18, 0x0E, 0x96, 0x44, 0xC9, 0x0C, +0x80, 0x4D, 0x42, 0x23, 0x38, 0x73, 0xF1, 0x01, +0xB4, 0x02, 0x49, 0xFF, 0xE3, 0x96, 0xE0, 0x08, +0xE8, 0x03, 0x97, 0xF2, 0x81, 0x00, 0x8C, 0xC1, +0xD5, 0xEE, 0x80, 0x07, 0xB7, 0x0A, 0xFC, 0xE1, +0x84, 0x1F, 0xDD, 0x9E, 0xFC, 0x40, 0x81, 0x40, +0x83, 0x81, 0x81, 0x22, 0x80, 0xC3, 0x49, 0x00, +0x0F, 0x3F, 0x3D, 0x0C, 0x07, 0x39, 0x3C, 0x0D, +0xFE, 0x58, 0x84, 0xE0, 0x14, 0x78, 0x00, 0x02, +0x47, 0x10, 0x01, 0x00, 0xA9, 0xC5, 0x3C, 0x10, +0x0E, 0x5D, 0xE0, 0xE1, 0xE8, 0x09, 0x41, 0x28, +0x9C, 0x20, 0x38, 0x15, 0x1D, 0x01, 0x12, 0x19, +0x00, 0x00, 0x8C, 0xE1, 0xD5, 0xF5, 0x80, 0x87, +0x46, 0xA0, 0x01, 0x00, 0x84, 0xA0, 0x3C, 0x80, +0x0E, 0x5F, 0x9A, 0x3C, 0xE0, 0x08, 0xE8, 0x07, +0x40, 0x85, 0x1C, 0x20, 0x12, 0x54, 0x00, 0x00, +0x8C, 0xE1, 0xD5, 0xF6, 0x84, 0x00, 0x47, 0x90, +0x01, 0x00, 0x3C, 0x30, 0x0E, 0x5F, 0x98, 0x47, +0xE0, 0x03, 0xE8, 0x09, 0x38, 0x24, 0x81, 0x01, +0x41, 0xEC, 0x84, 0x20, 0x12, 0x2F, 0x00, 0x00, +0x8C, 0x01, 0xD5, 0xF4, 0x84, 0x80, 0x47, 0x60, +0x01, 0x00, 0x82, 0xE4, 0x3C, 0x20, 0x0E, 0x5F, +0x98, 0xE1, 0x94, 0x11, 0xE0, 0x80, 0x46, 0xA0, +0x01, 0x00, 0x94, 0x19, 0xE8, 0x0E, 0x3D, 0x80, +0x0E, 0x5E, 0x88, 0x16, 0xE0, 0x98, 0xE8, 0x05, +0x38, 0x3E, 0x11, 0x01, 0xAC, 0xC0, 0xD5, 0x03, +0x13, 0x70, 0x00, 0x00, 0x8C, 0x81, 0xD5, 0xEB, +0x9D, 0x59, 0x88, 0x0A, 0xC6, 0x2F, 0x3C, 0x60, +0x0E, 0xF4, 0xAD, 0x80, 0x40, 0x75, 0x14, 0x20, +0x3C, 0x10, 0x0E, 0xF5, 0x9C, 0x1A, 0xAC, 0x78, +0x44, 0x30, 0x00, 0x82, 0x86, 0x20, 0x3E, 0x28, +0x1C, 0xE8, 0x3C, 0x60, 0x0E, 0x89, 0x97, 0xF3, +0xE1, 0xA7, 0xE8, 0x20, 0x38, 0x51, 0x0D, 0x01, +0x41, 0x35, 0x00, 0x20, 0x12, 0x59, 0x80, 0x00, +0x9D, 0x01, 0x9C, 0x59, 0x38, 0x61, 0x05, 0x01, +0x82, 0x40, 0x41, 0x45, 0x10, 0x20, 0x12, 0x6A, +0x00, 0x00, 0x9D, 0xDA, 0x8D, 0xC2, 0x41, 0x55, +0x48, 0x20, 0x38, 0x51, 0x1D, 0x01, 0x8C, 0x03, +0x12, 0x5A, 0x80, 0x00, 0x8D, 0xA1, 0x8C, 0x64, +0xD5, 0xE1, 0x40, 0x45, 0x14, 0x20, 0xAD, 0x80, +0xAD, 0xA0, 0x85, 0x21, 0x14, 0x98, 0x00, 0x02, +0xFC, 0xC0, 0xFC, 0x01, 0x3C, 0x20, 0x0E, 0x64, +0x96, 0x41, 0x3C, 0x50, 0x0E, 0x66, 0x92, 0x10, +0x4C, 0x20, 0xC0, 0x08, 0xD0, 0x16, 0x3C, 0x50, +0x0E, 0x67, 0xD0, 0x15, 0x84, 0x02, 0xD5, 0x1C, +0x3C, 0x30, 0x0E, 0x65, 0x4C, 0x30, 0xC0, 0x08, +0xD0, 0x10, 0x3C, 0x50, 0x0E, 0x67, 0xD0, 0x0F, +0x84, 0x06, 0xD5, 0x12, 0xD0, 0x0E, 0x3C, 0x50, +0x0E, 0x67, 0xD8, 0x0D, 0x84, 0x04, 0xD5, 0x0C, +0x84, 0x01, 0xD5, 0x0A, 0x84, 0x03, 0xD5, 0x08, +0x84, 0x07, 0xD5, 0x06, 0x84, 0x05, 0xD5, 0x04, +0x84, 0x08, 0xD5, 0x02, 0x84, 0x00, 0xFC, 0x81, +0x44, 0x20, 0x00, 0x5C, 0x3E, 0x1F, 0xE1, 0x98, +0x42, 0x10, 0x08, 0x73, 0x84, 0x80, 0x50, 0x50, +0x80, 0x18, 0x80, 0x01, 0x50, 0x30, 0x80, 0x08, +0x84, 0x5F, 0x84, 0x20, 0xAF, 0x1C, 0xAF, 0x2C, +0xAE, 0xAD, 0xAC, 0x6B, 0x12, 0x10, 0x00, 0x2C, +0xDD, 0x9E, 0xFC, 0x63, 0x3F, 0xCF, 0xF3, 0xE8, +0x3C, 0x00, 0x0E, 0x89, 0x3C, 0x10, 0x10, 0xF4, +0x96, 0x83, 0xBA, 0x80, 0x3E, 0xB8, 0x1C, 0xE8, +0x5A, 0x10, 0x01, 0x06, 0x3C, 0x30, 0x10, 0xF4, +0x5A, 0x38, 0x03, 0x0C, 0x3C, 0x40, 0x10, 0xFC, +0x97, 0x63, 0xE0, 0xA2, 0xE8, 0x06, 0x3C, 0x00, +0x10, 0xFC, 0x96, 0x83, 0xBA, 0x80, 0xD5, 0x0A, +0x3C, 0x60, 0x10, 0xF4, 0x5A, 0x68, 0x02, 0x07, +0x3C, 0x70, 0x05, 0x2E, 0xE0, 0xE2, 0xE8, 0x02, +0xBF, 0x80, 0x3C, 0x10, 0x0E, 0xA9, 0x96, 0xCB, +0x4E, 0x36, 0x00, 0x05, 0x85, 0x01, 0x3C, 0x88, +0x0E, 0xA9, 0x3E, 0x6F, 0xE1, 0x98, 0x85, 0x20, +0x81, 0x49, 0x50, 0xE3, 0x00, 0x08, 0x3E, 0xCF, +0xDB, 0x18, 0x85, 0xA6, 0x45, 0x00, 0x00, 0x5C, +0x82, 0x2E, 0x43, 0x15, 0x40, 0x73, 0x04, 0x48, +0x80, 0x01, 0x97, 0x64, 0xCD, 0x07, 0x42, 0x72, +0x18, 0x0B, 0xC7, 0x04, 0x80, 0x0A, 0x49, 0xFF, +0xFF, 0xA9, 0x45, 0x30, 0x00, 0x5C, 0x3E, 0x0F, +0xE1, 0xA0, 0x42, 0x05, 0x4C, 0x73, 0xA0, 0x81, +0x96, 0x54, 0x4E, 0x12, 0x00, 0xC5, 0x42, 0x31, +0x18, 0x0B, 0x4E, 0x32, 0x00, 0xC1, 0x05, 0x53, +0x00, 0x15, 0x3C, 0x40, 0x0E, 0xA9, 0x45, 0x60, +0x00, 0x64, 0x41, 0x7A, 0xDA, 0xF7, 0x97, 0x63, +0x40, 0x2B, 0x94, 0x57, 0x5C, 0xF1, 0x01, 0x00, +0x20, 0x83, 0x00, 0x1D, 0xE8, 0x04, 0xCA, 0x05, +0x84, 0x41, 0xD5, 0x03, 0x44, 0x20, 0x00, 0xFF, +0x5A, 0x8F, 0xFF, 0x06, 0x3D, 0x8D, 0xFC, 0xFA, +0x84, 0xE0, 0xD5, 0x64, 0xF2, 0x83, 0x5A, 0x8F, +0x80, 0x04, 0x48, 0x00, 0x00, 0xA1, 0x3C, 0x73, +0xED, 0x8C, 0xF7, 0x82, 0x59, 0x93, 0x89, 0x00, +0x80, 0xEC, 0x42, 0x74, 0x34, 0x73, 0x04, 0x13, +0x00, 0x12, 0x05, 0x03, 0x00, 0x13, 0x45, 0xE0, +0x00, 0x64, 0x40, 0x30, 0xF8, 0x76, 0x40, 0x48, +0x78, 0x96, 0xA5, 0x7A, 0xA4, 0xBB, 0x12, 0x3F, +0x80, 0x08, 0x12, 0x4F, 0x80, 0x09, 0x84, 0x01, +0x12, 0x5F, 0x80, 0x0A, 0x12, 0x2F, 0x80, 0x0B, +0x10, 0x03, 0x80, 0x09, 0xF1, 0x05, 0xF0, 0x04, +0xF3, 0x81, 0xB6, 0x9F, 0x3D, 0x9B, 0xED, 0x8C, +0x49, 0xFF, 0xE2, 0x23, 0x3D, 0x10, 0x05, 0x1F, +0xB4, 0x3F, 0xE1, 0xA0, 0xF4, 0x01, 0xF0, 0x02, +0xF3, 0x03, 0xE8, 0x0C, 0x59, 0x20, 0x09, 0x04, +0x86, 0x65, 0x3D, 0x2B, 0xED, 0x8C, 0x11, 0x33, +0x80, 0x09, 0xAD, 0x3A, 0xAC, 0x7B, 0x10, 0x33, +0x80, 0x08, 0x2F, 0x40, 0x1C, 0xB9, 0x5B, 0x48, +0x01, 0x06, 0x80, 0x08, 0x49, 0x00, 0x0E, 0x78, +0xD5, 0x07, 0x51, 0x54, 0x03, 0xA6, 0x23, 0x63, +0x00, 0x0A, 0x39, 0x65, 0xD5, 0x09, 0x2E, 0x77, +0xDB, 0x1A, 0x86, 0xE1, 0x40, 0x8B, 0xA0, 0x0C, +0x8C, 0xE1, 0x40, 0x94, 0x24, 0x04, 0x3E, 0x77, +0xDB, 0x1A, 0x40, 0x94, 0x80, 0x13, 0xD5, 0x4B, +0x83, 0x2C, 0x43, 0x93, 0xB4, 0x73, 0x02, 0x0C, +0x80, 0x04, 0x42, 0x10, 0x20, 0x0B, 0xC1, 0x04, +0x8C, 0xE1, 0xE0, 0xF8, 0xE9, 0xF6, 0x4C, 0x7C, +0x40, 0x07, 0x45, 0x8F, 0xFF, 0x80, 0x11, 0x83, +0x00, 0x1D, 0xD5, 0x39, 0x3D, 0xE3, 0xED, 0x8C, +0x82, 0x4C, 0x05, 0x33, 0x00, 0x12, 0x04, 0x83, +0x00, 0x13, 0x43, 0x23, 0xB4, 0x73, 0x45, 0x40, +0x00, 0x64, 0x2E, 0x50, 0x1C, 0xB9, 0x59, 0x0F, +0x08, 0x03, 0x86, 0x23, 0x40, 0x39, 0xD0, 0x76, +0x40, 0x44, 0x50, 0x96, 0x3D, 0x0B, 0xED, 0x8C, +0x10, 0x73, 0x00, 0x1D, 0x11, 0x19, 0x00, 0x09, +0x12, 0x39, 0x00, 0x02, 0x12, 0x49, 0x00, 0x03, +0x10, 0x29, 0x00, 0x08, 0x5A, 0x58, 0x01, 0x06, +0x80, 0x07, 0x49, 0x00, 0x0E, 0x2D, 0xD5, 0x07, +0x51, 0x53, 0x83, 0xA6, 0x23, 0x63, 0x00, 0x0A, +0x39, 0x65, 0xD5, 0x09, 0x2E, 0x27, 0xDB, 0x1A, +0x86, 0xE1, 0x40, 0xFB, 0x9C, 0x0C, 0x8C, 0x41, +0x40, 0x97, 0xA4, 0x04, 0x3E, 0x27, 0xDB, 0x1A, +0x40, 0x94, 0x80, 0x13, 0x8D, 0x41, 0x50, 0x63, +0x00, 0x5C, 0x5A, 0xA0, 0x0F, 0x04, 0x48, 0xFF, +0xFF, 0x1F, 0x3E, 0x2F, 0xDB, 0x18, 0x3D, 0x93, +0xED, 0x8C, 0x85, 0x40, 0x81, 0x82, 0x85, 0xA6, +0x40, 0x54, 0xA8, 0x0E, 0x96, 0x6C, 0xC9, 0x1A, +0x81, 0xCC, 0x42, 0xE5, 0x34, 0x73, 0x02, 0x47, +0x00, 0x04, 0x42, 0x32, 0x20, 0x0B, 0xCB, 0x04, +0x10, 0x31, 0x00, 0x09, 0xD5, 0x0F, 0x10, 0x11, +0x00, 0x09, 0x01, 0xE7, 0x00, 0x09, 0x51, 0x85, +0x03, 0xA6, 0x59, 0x0F, 0x00, 0x08, 0x38, 0x15, +0xE1, 0x09, 0x59, 0x9C, 0x80, 0x09, 0x11, 0x07, +0x00, 0x09, 0x8D, 0x41, 0x8C, 0x46, 0x5A, 0xA8, +0x0A, 0xE1, 0x54, 0x0C, 0x88, 0x00, 0x97, 0xC1, +0x3D, 0x9B, 0xED, 0x8C, 0xC7, 0x06, 0x2E, 0x77, +0xDB, 0x1B, 0x5A, 0x70, 0xFF, 0x05, 0x8C, 0xE1, +0x3E, 0x77, 0xDB, 0x1B, 0xFC, 0xE3, 0xFC, 0x61, +0x3C, 0x60, 0x10, 0xF4, 0x97, 0xB3, 0xC6, 0x25, +0x84, 0xC0, 0x2F, 0x88, 0x03, 0x23, 0x80, 0xE6, +0xE0, 0xF8, 0xE8, 0x09, 0xA5, 0x40, 0x40, 0x22, +0x9C, 0x0E, 0x96, 0xD4, 0xC3, 0x02, 0x8C, 0xC1, +0x8C, 0xE1, 0xD5, 0xF7, 0x3C, 0x20, 0x10, 0xF4, +0x5A, 0x20, 0x01, 0x06, 0x3C, 0x30, 0x10, 0xF4, +0x5A, 0x38, 0x03, 0x06, 0x3C, 0x70, 0x10, 0xFC, +0x97, 0xFB, 0xD5, 0x08, 0x3C, 0x40, 0x10, 0xF4, +0x84, 0xE0, 0x5A, 0x48, 0x02, 0x04, 0x3C, 0x70, +0x05, 0x2E, 0xE0, 0xC7, 0xE9, 0x03, 0xD5, 0x67, +0x80, 0xE6, 0x3E, 0x4F, 0xE1, 0xA0, 0x81, 0xC1, +0x81, 0x80, 0x85, 0x40, 0x45, 0xC0, 0x00, 0x5C, +0x50, 0x52, 0x7F, 0xF8, 0x2E, 0x08, 0x03, 0x23, +0xE1, 0x40, 0xE8, 0x59, 0x02, 0x16, 0x00, 0x00, +0x40, 0x20, 0xA8, 0x0E, 0x96, 0xD4, 0xCB, 0x51, +0x3C, 0x00, 0x10, 0xF4, 0xC0, 0x04, 0x8C, 0xC1, +0xE0, 0xE6, 0xE9, 0x4D, 0x85, 0x20, 0x42, 0xB4, +0xF0, 0x24, 0x86, 0x01, 0x40, 0xD2, 0x2C, 0x00, +0x04, 0x86, 0x80, 0x01, 0x54, 0x84, 0x00, 0x01, +0x4E, 0x82, 0x00, 0x06, 0x89, 0x30, 0x5A, 0x98, +0x0F, 0xF4, 0xD5, 0x3D, 0xF5, 0x81, 0x40, 0x58, +0x28, 0x0C, 0xFE, 0x6F, 0x12, 0x16, 0x00, 0x00, +0x02, 0x17, 0x00, 0x00, 0xB6, 0x9F, 0x40, 0x48, +0x24, 0x0C, 0xFF, 0x0F, 0x12, 0x47, 0x00, 0x00, +0x80, 0x09, 0x49, 0xFF, 0xFE, 0x3B, 0x01, 0x16, +0x80, 0x04, 0x80, 0x09, 0x59, 0x28, 0x80, 0x01, +0x11, 0x26, 0x80, 0x04, 0x80, 0x2A, 0x49, 0xFF, +0xFD, 0x03, 0xF5, 0x01, 0x2E, 0x08, 0x0A, 0x3A, +0x41, 0x32, 0xAC, 0x00, 0x51, 0x49, 0x80, 0x18, +0x00, 0x2A, 0x00, 0x04, 0xB4, 0x9F, 0x8C, 0x41, +0x96, 0xD2, 0xE0, 0x60, 0x10, 0x3A, 0x00, 0x04, +0xE9, 0x0E, 0x01, 0x56, 0x80, 0x04, 0x2F, 0x78, +0x0A, 0x3B, 0x59, 0x6A, 0x80, 0x40, 0x10, 0x0A, +0x00, 0x04, 0x11, 0x66, 0x80, 0x04, 0x13, 0x79, +0x80, 0x2C, 0xD5, 0x03, 0x12, 0x89, 0x80, 0x2C, +0x8D, 0x41, 0xD5, 0xA5, 0xFC, 0xE1, 0xFC, 0x65, +0x2E, 0x17, 0xF3, 0xD9, 0x84, 0x00, 0x3C, 0x0F, +0xFE, 0x54, 0xC9, 0x03, 0x3E, 0x10, 0x03, 0x1C, +0x84, 0x40, 0x84, 0x60, 0x3E, 0x5F, 0xE1, 0xA0, +0x44, 0x90, 0x00, 0x5C, 0x12, 0x2F, 0x80, 0x0E, +0x12, 0x2F, 0x80, 0x0F, 0x80, 0x83, 0x81, 0x89, +0x3E, 0xBF, 0xF3, 0xEC, 0x50, 0xA2, 0xFF, 0xF8, +0x80, 0xC5, 0x42, 0x62, 0x24, 0x73, 0xA1, 0xF1, +0x3E, 0x6F, 0xE1, 0xA0, 0x96, 0x3C, 0xC0, 0x03, +0x8C, 0x61, 0x96, 0xD8, 0x42, 0x82, 0x30, 0x24, +0x8C, 0x81, 0x40, 0xD5, 0xA0, 0x00, 0x81, 0xCD, +0x89, 0x0A, 0x3B, 0x04, 0x64, 0x04, 0x3B, 0x07, +0x64, 0x24, 0x3B, 0x04, 0x64, 0x04, 0x3B, 0x07, +0x64, 0x24, 0x3B, 0x04, 0x48, 0x00, 0x3B, 0x07, +0x48, 0x20, 0x3E, 0x7F, 0xE1, 0x98, 0x5A, 0x48, +0x0F, 0xE1, 0x2E, 0x18, 0x03, 0x23, 0xCB, 0x0F, +0x4E, 0x17, 0x00, 0x0E, 0x50, 0x0F, 0x80, 0x1E, +0xB0, 0x47, 0x49, 0xFF, 0xFF, 0x2E, 0x3E, 0xEF, +0xE1, 0x98, 0x85, 0x60, 0x44, 0xC0, 0x00, 0x5C, +0x48, 0x00, 0x01, 0x30, 0xC9, 0x0C, 0xCB, 0x0B, +0x80, 0xC3, 0x80, 0x06, 0x8C, 0xC1, 0x49, 0xFF, +0xFD, 0xBD, 0x5A, 0x68, 0x0F, 0xFC, 0x87, 0xC1, +0x48, 0x00, 0x02, 0xAD, 0x47, 0x07, 0xFF, 0xFF, +0x3E, 0xBF, 0xFF, 0x08, 0x50, 0xC8, 0x0F, 0xFF, +0x03, 0x1F, 0x80, 0x0E, 0x85, 0x40, 0x45, 0x20, +0x00, 0x5C, 0x40, 0x28, 0xA8, 0x0E, 0x97, 0x14, +0xCC, 0x08, 0x82, 0x66, 0x43, 0x35, 0x48, 0x73, +0x04, 0x59, 0x80, 0x01, 0x96, 0x2C, 0xC8, 0x05, +0x8D, 0x41, 0x5A, 0xA8, 0x0F, 0xF4, 0xD5, 0xCF, +0x83, 0x84, 0x80, 0x0A, 0x02, 0x1F, 0x80, 0x0F, +0xB0, 0x88, 0x80, 0x7C, 0x49, 0xFF, 0xFC, 0xAF, +0x81, 0x00, 0x5A, 0x07, 0xFF, 0xC5, 0x80, 0xAA, +0x44, 0xD0, 0x00, 0x5C, 0x02, 0x4F, 0x80, 0x0E, +0x85, 0xDF, 0x4E, 0x85, 0x00, 0x2C, 0x45, 0x40, +0x00, 0x38, 0x81, 0x4B, 0x80, 0x6C, 0x85, 0x20, +0x42, 0xA4, 0x50, 0x73, 0x82, 0xA6, 0x43, 0x54, +0xB4, 0x73, 0x04, 0x1A, 0x80, 0x01, 0x96, 0x8C, +0xC2, 0x19, 0x40, 0x02, 0x24, 0x0E, 0x96, 0x44, +0xC9, 0x15, 0x80, 0x09, 0xB0, 0x49, 0x80, 0x5C, +0xF3, 0x83, 0xF4, 0x82, 0xF5, 0x81, 0x49, 0xFF, +0xFB, 0xD9, 0xB4, 0x0A, 0xF1, 0x09, 0x49, 0xFF, +0xE0, 0x3C, 0xF3, 0x03, 0xF5, 0x01, 0xE0, 0x03, +0xF4, 0x02, 0xE8, 0x04, 0x40, 0xE4, 0x80, 0x10, +0x80, 0x60, 0x8D, 0x21, 0x5A, 0x98, 0x0F, 0xE0, +0xF3, 0x88, 0x81, 0x4E, 0x4C, 0x57, 0x00, 0x15, +0x5A, 0xE7, 0xFF, 0x8E, 0x80, 0x0E, 0x02, 0x1F, +0x80, 0x0F, 0xB0, 0x88, 0x80, 0x7C, 0x49, 0xFF, +0xFC, 0x6E, 0x81, 0x20, 0x4C, 0x80, 0x00, 0x0A, +0x5A, 0x0F, 0xFF, 0x04, 0x48, 0xFF, 0xFF, 0x80, +0x81, 0x00, 0x80, 0xAE, 0xD5, 0xBC, 0x81, 0x28, +0x5A, 0x9F, 0xFF, 0x04, 0x48, 0xFF, 0xFF, 0x78, +0x4F, 0xC2, 0x00, 0x08, 0x5B, 0xC8, 0x01, 0x04, +0x48, 0x00, 0x00, 0xB7, 0x87, 0x81, 0xD5, 0xA2, +0x02, 0x8F, 0x80, 0x0F, 0x02, 0xDF, 0x80, 0x0E, +0x80, 0xBC, 0x45, 0x30, 0x00, 0x5C, 0x2F, 0x68, +0x03, 0x23, 0xE0, 0xB6, 0xE8, 0x3A, 0x40, 0x04, +0x14, 0x0E, 0x96, 0xC4, 0xCB, 0x34, 0x4C, 0x54, +0x80, 0x33, 0x45, 0x80, 0x00, 0x38, 0x83, 0x8B, +0x84, 0x9F, 0x82, 0x2C, 0x43, 0xC2, 0xE0, 0x73, +0x83, 0x26, 0x43, 0x91, 0xCC, 0x73, 0x04, 0x2C, +0x80, 0x01, 0x96, 0x54, 0xC1, 0x1F, 0x40, 0x06, +0x8C, 0x0E, 0x96, 0x84, 0xCA, 0x1B, 0x80, 0x03, +0xB0, 0x49, 0x15, 0x3F, 0x80, 0x05, 0xF4, 0x84, +0x15, 0x1F, 0x80, 0x03, 0xF5, 0x82, 0xF3, 0x81, +0x49, 0xFF, 0xFB, 0x78, 0xB4, 0x1C, 0xF1, 0x09, +0x49, 0xFF, 0xDF, 0xDB, 0x05, 0x1F, 0x80, 0x03, +0xF3, 0x01, 0xE0, 0x11, 0xF5, 0x02, 0xF4, 0x04, +0x05, 0x3F, 0x80, 0x05, 0xE8, 0x03, 0x97, 0x1A, +0x82, 0x20, 0x8C, 0x61, 0x5A, 0x38, 0x0F, 0xDA, +0x4C, 0x47, 0x3F, 0xBE, 0x8C, 0xA1, 0xD5, 0xC4, +0x87, 0x80, 0x45, 0x70, 0x00, 0x5C, 0x83, 0x06, +0x43, 0x8E, 0x5C, 0x73, 0x04, 0x2C, 0x00, 0x01, +0x96, 0x14, 0xC8, 0x06, 0x51, 0xCE, 0x00, 0x01, +0x5B, 0xC8, 0x0F, 0xF5, 0xD5, 0x61, 0x40, 0x16, +0xF0, 0x0E, 0x97, 0x4C, 0xCD, 0xF8, 0x4D, 0xC7, +0x3F, 0xF7, 0x80, 0x45, 0x80, 0x1C, 0xB0, 0x49, +0xF5, 0x81, 0x49, 0xFF, 0xFB, 0x47, 0xF3, 0x01, +0x2F, 0x28, 0x03, 0x23, 0x84, 0x9F, 0x82, 0x2C, +0x80, 0x43, 0xE0, 0x52, 0xE8, 0x20, 0x40, 0x04, +0x08, 0x0E, 0x96, 0x44, 0xC9, 0x1A, 0x45, 0x00, +0x00, 0x38, 0x83, 0xCB, 0x43, 0xE1, 0x40, 0x73, +0xF1, 0x09, 0xB4, 0x1E, 0xF4, 0x84, 0x15, 0x2F, +0x80, 0x03, 0x15, 0x1F, 0x80, 0x02, 0xF2, 0x81, +0x49, 0xFF, 0xDF, 0x93, 0x05, 0x1F, 0x80, 0x02, +0xF2, 0x01, 0xE0, 0x11, 0x05, 0x2F, 0x80, 0x03, +0xF4, 0x04, 0xE8, 0x03, 0x97, 0x12, 0x82, 0x20, +0x8C, 0x41, 0xD5, 0xE0, 0x4C, 0x44, 0xFF, 0xC8, +0x48, 0xFF, 0xFF, 0x76, 0x81, 0xA6, 0x42, 0xD5, +0xB0, 0x73, 0x04, 0x06, 0x80, 0x01, 0x42, 0x30, +0x18, 0x0B, 0xC3, 0x1E, 0x97, 0x44, 0xC5, 0x1C, +0x02, 0x47, 0x00, 0x2C, 0x8E, 0x81, 0x97, 0xE3, +0x12, 0x77, 0x00, 0x2C, 0x4E, 0x77, 0x00, 0x15, +0x2E, 0xA0, 0x03, 0x23, 0x8D, 0x41, 0x3E, 0xA0, +0x03, 0x23, 0x8D, 0x61, 0x50, 0xE7, 0x00, 0x5C, +0x5A, 0xB8, 0x0F, 0x04, 0x48, 0xFF, 0xFE, 0xDD, +0x02, 0x7F, 0x80, 0x0E, 0x40, 0x23, 0xAC, 0x0E, +0x96, 0x54, 0xC9, 0xF4, 0xD5, 0xDC, 0x80, 0x0B, +0x49, 0xFF, 0xFC, 0x8C, 0xD5, 0xEF, 0x45, 0x40, +0x00, 0x5C, 0x42, 0xD7, 0x50, 0x24, 0x45, 0x30, +0x00, 0x38, 0x81, 0x0B, 0x40, 0xA3, 0xB4, 0x00, +0x42, 0x84, 0xCC, 0x73, 0x83, 0x8A, 0x0C, 0x1E, +0x00, 0x02, 0xB4, 0x08, 0x49, 0xFF, 0xDF, 0x49, +0x86, 0xA1, 0x02, 0x3F, 0x80, 0x0F, 0x40, 0x5A, +0xA4, 0x0C, 0x84, 0x20, 0xFF, 0x5F, 0x10, 0x1E, +0x00, 0x04, 0x41, 0x03, 0x34, 0x00, 0x51, 0x25, +0x00, 0x18, 0x00, 0x28, 0x00, 0x04, 0x12, 0x5F, +0x80, 0x0F, 0x00, 0x59, 0x00, 0x04, 0x03, 0x7F, +0x80, 0x0E, 0x66, 0x41, 0x00, 0x40, 0x41, 0x6A, +0xB8, 0x0C, 0x8C, 0xA1, 0x2E, 0x28, 0x0A, 0x3A, +0x97, 0x6A, 0x41, 0x8B, 0x5C, 0x04, 0x41, 0x9C, +0x00, 0x11, 0xE0, 0xA2, 0xF0, 0x88, 0x13, 0x9F, +0x80, 0x0E, 0x10, 0x48, 0x00, 0x04, 0x10, 0x59, +0x00, 0x04, 0x4E, 0xF3, 0x00, 0xE5, 0x2E, 0x17, +0xF3, 0xD9, 0xC9, 0x0C, 0x2F, 0x10, 0x03, 0x1C, +0x03, 0x34, 0x00, 0x05, 0x51, 0xE8, 0x81, 0xA4, +0x8D, 0xA1, 0x39, 0x35, 0xF9, 0x09, 0x3F, 0x10, +0x03, 0x1C, 0x44, 0x80, 0x00, 0x5C, 0x42, 0x17, +0x20, 0x24, 0x2E, 0xD8, 0x0A, 0x3B, 0x99, 0x39, +0x88, 0x26, 0xA6, 0xCC, 0x51, 0x42, 0x00, 0x18, +0x10, 0x2A, 0x00, 0x04, 0x58, 0xA1, 0x80, 0x40, +0x8C, 0x41, 0x12, 0xD2, 0x00, 0x2C, 0x10, 0xA0, +0x80, 0x04, 0x4C, 0x51, 0x40, 0xC7, 0x3C, 0x20, +0x0F, 0x3B, 0x02, 0x5A, 0x00, 0x03, 0x96, 0x53, +0xE0, 0xA1, 0x4E, 0xF2, 0x00, 0xBF, 0x3C, 0x40, +0x0F, 0xBF, 0x3D, 0xC7, 0xF6, 0x85, 0x96, 0xE3, +0xE0, 0x7C, 0x4E, 0xF3, 0x00, 0xB7, 0x3C, 0x20, +0x0F, 0xBF, 0x3D, 0x57, 0xF9, 0xDD, 0x96, 0x53, +0xE0, 0x35, 0x4E, 0xF3, 0x00, 0xAF, 0x3D, 0x60, +0x05, 0x23, 0xE0, 0x16, 0x4E, 0xF3, 0x00, 0x9F, +0x3C, 0x43, 0xF6, 0x81, 0xC4, 0x4D, 0x2F, 0xE0, +0x03, 0x38, 0x4F, 0xE3, 0x00, 0x23, 0x80, 0xBE, +0x44, 0x60, 0x05, 0x64, 0x98, 0xBD, 0x3E, 0x1F, +0xF3, 0xEC, 0x88, 0x25, 0x81, 0x62, 0x3B, 0x00, +0xE4, 0x04, 0x50, 0x52, 0x80, 0x5C, 0x3B, 0x05, +0xE4, 0x24, 0x3B, 0x00, 0xE4, 0x04, 0x3B, 0x05, +0xE4, 0x24, 0x3B, 0x00, 0xC8, 0x00, 0x3B, 0x05, +0xC8, 0x20, 0xDE, 0xED, 0x84, 0xE1, 0x87, 0x20, +0x3E, 0x70, 0x03, 0x38, 0x3C, 0x0E, 0x00, 0xCF, +0x3D, 0x9E, 0x00, 0xD0, 0x48, 0x00, 0x00, 0xDB, +0x3C, 0x30, 0x0F, 0x3B, 0x3D, 0x7C, 0x00, 0xCF, +0x96, 0x5B, 0x41, 0x0B, 0x88, 0x0A, 0xE0, 0x30, +0xE8, 0x05, 0x89, 0x97, 0x3D, 0x0E, 0x00, 0xCF, +0xD5, 0x07, 0x3C, 0x20, 0x0F, 0x3B, 0x97, 0x13, +0x88, 0x97, 0x3C, 0x4E, 0x00, 0xCF, 0x3D, 0x2C, +0x00, 0xCF, 0xE1, 0xC0, 0xE8, 0x0B, 0xE0, 0xA0, +0xE8, 0x68, 0x45, 0x90, 0x00, 0x5C, 0x82, 0x27, +0x43, 0x17, 0x64, 0x73, 0x12, 0x08, 0x80, 0x0F, +0xD5, 0x60, 0x84, 0x00, 0x87, 0x00, 0x3E, 0x00, +0x03, 0x38, 0x3D, 0x8E, 0x00, 0xCD, 0x84, 0x00, +0x45, 0x10, 0x00, 0x5C, 0x43, 0x30, 0x44, 0x24, +0x40, 0xD3, 0x4C, 0x00, 0x04, 0x36, 0x80, 0x01, +0x96, 0x9C, 0xC2, 0x06, 0x8C, 0x01, 0x5A, 0x08, +0x0F, 0xF7, 0x48, 0xFF, 0xFD, 0xFF, 0x44, 0x80, +0x00, 0x5C, 0x42, 0xA7, 0x20, 0x24, 0x3E, 0x4F, +0xE1, 0xA0, 0x88, 0x8A, 0xA6, 0x64, 0x40, 0xE3, +0xCC, 0x00, 0x58, 0x50, 0x80, 0x08, 0xAF, 0x64, +0x10, 0x27, 0x00, 0x0C, 0x01, 0x66, 0x80, 0x04, +0x89, 0x47, 0x86, 0x81, 0x12, 0x25, 0x00, 0x2C, +0x50, 0x87, 0x00, 0x18, 0x8D, 0x58, 0x41, 0xCA, +0x00, 0x0C, 0x85, 0xFF, 0x59, 0xEB, 0x00, 0x01, +0x12, 0x25, 0x00, 0x03, 0x41, 0x5C, 0xF0, 0x04, +0x80, 0x29, 0x10, 0x25, 0x00, 0x04, 0x10, 0xF4, +0x00, 0x05, 0x12, 0x24, 0x00, 0x03, 0x11, 0xE6, +0x80, 0x04, 0x13, 0x5F, 0x80, 0x0E, 0x49, 0xFF, +0xFA, 0x53, 0x01, 0x06, 0x80, 0x04, 0x2E, 0x90, +0x0A, 0x3A, 0x2F, 0x78, 0x0A, 0x3B, 0x59, 0x28, +0x00, 0x40, 0x10, 0x94, 0x00, 0x04, 0x13, 0x77, +0x00, 0x2C, 0x11, 0x26, 0x80, 0x04, 0x48, 0xFF, +0xFD, 0xC1, 0xE0, 0xA0, 0xE8, 0x0A, 0x12, 0x0A, +0x00, 0x03, 0xD5, 0x07, 0x02, 0x39, 0x00, 0x03, +0xE0, 0x60, 0xE8, 0x03, 0x12, 0x09, 0x00, 0x03, +0x44, 0x80, 0x00, 0x5C, 0x82, 0x87, 0x43, 0x47, +0x20, 0x73, 0x3C, 0xAC, 0x00, 0xCD, 0x02, 0xDA, +0x00, 0x0F, 0xE1, 0x4D, 0xE8, 0x03, 0x3C, 0xDE, +0x00, 0xCD, 0x43, 0xC7, 0x20, 0x24, 0x80, 0x0E, +0x40, 0x53, 0x70, 0x00, 0xA6, 0xEC, 0x58, 0x11, +0x80, 0x01, 0xAE, 0x6C, 0x80, 0x29, 0x49, 0xFF, +0xF9, 0xDF, 0x45, 0x50, 0x00, 0x38, 0x3E, 0x4F, +0xFF, 0x08, 0x42, 0x44, 0xD4, 0x73, 0x40, 0x93, +0xF0, 0x00, 0xA4, 0xA4, 0x12, 0x24, 0x80, 0x07, +0x12, 0x24, 0x80, 0x08, 0x80, 0x29, 0xA0, 0x25, +0xA1, 0x4E, 0xA8, 0x0D, 0xE0, 0xA0, 0xE8, 0x03, +0x14, 0x04, 0x80, 0x06, 0x54, 0x07, 0x00, 0xFF, +0x84, 0x20, 0x49, 0xFF, 0xEC, 0x5C, 0x5A, 0x08, +0x01, 0x0C, 0x45, 0x60, 0x00, 0x5C, 0x42, 0x37, +0x58, 0x24, 0x98, 0x7B, 0xA1, 0x09, 0xB4, 0x41, +0x38, 0x43, 0x0C, 0x0A, 0xA8, 0x89, 0x54, 0xE7, +0x00, 0xFF, 0x45, 0xE0, 0x00, 0x5C, 0x82, 0xE7, +0x43, 0x77, 0x78, 0x73, 0x3C, 0x50, 0x05, 0x22, +0x51, 0x2B, 0x80, 0x50, 0x80, 0x52, 0xA0, 0x11, +0x02, 0x1B, 0x80, 0x07, 0x9E, 0xE9, 0xFE, 0x1C, +0x45, 0x80, 0x00, 0x64, 0x42, 0x00, 0xE0, 0x73, +0x40, 0x40, 0x14, 0x96, 0xA9, 0x11, 0x48, 0xFF, +0xFD, 0x5D, 0x80, 0x1E, 0xFC, 0xE5, 0xFC, 0x20, +0x3C, 0x17, 0xED, 0x8C, 0x3C, 0x18, 0x0E, 0xF4, +0x3C, 0x20, 0x0E, 0x8D, 0x3F, 0x0F, 0xDB, 0x18, +0xC2, 0x07, 0x3C, 0x30, 0x0E, 0x8D, 0x5A, 0x30, +0x02, 0x04, 0x48, 0x00, 0x00, 0x84, 0x2F, 0x87, +0xDB, 0x1B, 0x2F, 0x9F, 0xDB, 0x1A, 0x40, 0x1C, +0xE1, 0x04, 0x97, 0x4B, 0x80, 0xC0, 0x3C, 0x58, +0x0E, 0xF5, 0xC0, 0x18, 0x49, 0x00, 0x09, 0x78, +0x3C, 0x8D, 0xFE, 0x58, 0x3D, 0x3C, 0x07, 0x39, +0x84, 0x60, 0x14, 0x34, 0x00, 0x05, 0x14, 0x39, +0x80, 0x02, 0x3C, 0x70, 0x0E, 0xF4, 0x47, 0x00, +0x01, 0x00, 0x12, 0x78, 0x00, 0x00, 0x3C, 0x20, +0x0E, 0xF5, 0x12, 0x28, 0x00, 0x01, 0x84, 0x42, +0xD5, 0x02, 0x80, 0x40, 0x3E, 0x1F, 0xDB, 0x18, +0x44, 0x00, 0x00, 0x82, 0x85, 0x00, 0x3E, 0x58, +0x1C, 0xE8, 0x47, 0x40, 0x01, 0x00, 0x3C, 0x40, +0x0E, 0x89, 0x96, 0xE3, 0xE1, 0x03, 0xE8, 0x4B, +0x01, 0x90, 0x80, 0x09, 0x03, 0x20, 0x80, 0x02, +0x01, 0x80, 0x80, 0x08, 0x40, 0x4C, 0x65, 0x04, +0x41, 0x59, 0x00, 0x11, 0x9D, 0xC1, 0x23, 0x60, +0x80, 0x03, 0x51, 0x70, 0x00, 0x02, 0x96, 0xE3, +0x39, 0x52, 0x81, 0x09, 0x39, 0x62, 0x9D, 0x09, +0x38, 0x32, 0xDD, 0x09, 0x3D, 0x30, 0x0E, 0x8D, +0x5B, 0x38, 0x02, 0x08, 0x40, 0x4C, 0x20, 0x08, +0x9D, 0xC3, 0x96, 0xE3, 0x38, 0x32, 0x9D, 0x09, +0xC6, 0x26, 0x41, 0x0A, 0x08, 0x20, 0x13, 0x28, +0x00, 0x00, 0x9D, 0xD1, 0x40, 0xFA, 0x1C, 0x20, +0xA5, 0x0B, 0x12, 0x47, 0x80, 0x00, 0x01, 0x10, +0x80, 0x09, 0x01, 0x20, 0x80, 0x08, 0x9D, 0xD2, +0x41, 0xEA, 0x1C, 0x20, 0x41, 0x59, 0x45, 0x04, +0x13, 0x5F, 0x00, 0x00, 0x3D, 0x60, 0x0E, 0x8D, +0x9C, 0xD3, 0x5B, 0x68, 0x02, 0x0C, 0x01, 0x80, +0x80, 0x08, 0x41, 0x7A, 0x0C, 0x20, 0x40, 0x4C, +0x20, 0x08, 0x8C, 0x44, 0x12, 0x4B, 0x80, 0x00, +0xD5, 0x02, 0x80, 0x43, 0x8D, 0x01, 0x8C, 0x26, +0x8C, 0x04, 0xD5, 0xB2, 0xC6, 0x42, 0x3D, 0xEC, +0x07, 0x39, 0x84, 0xC1, 0x14, 0x6F, 0x00, 0x02, +0xD5, 0x3C, 0x3C, 0x00, 0x0E, 0x8D, 0x96, 0x43, +0x5A, 0x18, 0x01, 0x38, 0x84, 0x00, 0x82, 0x70, +0x44, 0x50, 0x00, 0x82, 0x81, 0x00, 0x3E, 0x68, +0x1C, 0xE8, 0x86, 0x26, 0x3C, 0x70, 0x0E, 0x89, +0x96, 0xBB, 0xE1, 0x02, 0xE8, 0x27, 0x01, 0x59, +0x80, 0x09, 0x01, 0x69, 0x80, 0x08, 0x40, 0x2B, +0x55, 0x04, 0x82, 0xF0, 0x9C, 0xE9, 0x9D, 0xEA, +0x23, 0x29, 0x80, 0x02, 0x23, 0x49, 0x80, 0x03, +0x97, 0x13, 0x43, 0x74, 0x44, 0x73, 0x39, 0x23, +0x15, 0x09, 0x39, 0x43, 0x0D, 0x09, 0x38, 0x43, +0x1D, 0x09, 0x02, 0x3B, 0x80, 0x04, 0x42, 0x71, +0xA0, 0x0B, 0xCF, 0x04, 0x42, 0x21, 0xAC, 0x0B, +0xC2, 0x05, 0x40, 0x40, 0xA0, 0x0C, 0xFE, 0x27, +0x96, 0x01, 0x8D, 0x01, 0x8D, 0xE6, 0x8C, 0xA4, +0xD5, 0xD6, 0x97, 0x03, 0x3C, 0x48, 0x0E, 0xF5, +0x3D, 0x17, 0xF0, 0xBA, 0x3D, 0x18, 0x0F, 0x1E, +0xFC, 0xA0, 0xFC, 0x00, 0x49, 0x00, 0x0B, 0xC7, +0x3C, 0x00, 0x0F, 0x64, 0x3C, 0x13, 0xED, 0x8C, +0x96, 0x83, 0xFE, 0x8E, 0xC2, 0x04, 0x84, 0x00, +0x49, 0xFF, 0xFF, 0x23, 0x3C, 0x30, 0x0E, 0x84, +0x5A, 0x38, 0x03, 0x0C, 0x49, 0xFF, 0xEA, 0xEB, +0x3C, 0x30, 0x0F, 0x64, 0x3C, 0x63, 0xED, 0x8C, +0x96, 0x9B, 0x3E, 0x08, 0x16, 0x38, 0xD5, 0x3E, +0x3C, 0x40, 0x0E, 0x84, 0x5A, 0x48, 0x10, 0x41, +0x49, 0xFF, 0xEA, 0xDD, 0x86, 0x00, 0x3C, 0x6C, +0x07, 0x24, 0x80, 0x10, 0x3D, 0xE0, 0x0E, 0x5D, +0xE1, 0x9E, 0xE8, 0x07, 0x41, 0x53, 0x40, 0x20, +0x12, 0x0A, 0x80, 0x00, 0x8D, 0x81, 0xD5, 0xF7, +0x84, 0x00, 0x3E, 0x48, 0x0A, 0x60, 0x3D, 0x10, +0x0E, 0x5F, 0x94, 0x41, 0xE0, 0x11, 0xE8, 0x08, +0x98, 0xA1, 0x99, 0x71, 0x22, 0x11, 0x08, 0xCC, +0xAC, 0x68, 0x8C, 0x01, 0xD5, 0xF5, 0x88, 0x26, +0x3E, 0x48, 0x0A, 0x60, 0x3C, 0x20, 0x0E, 0x5F, +0x3D, 0x20, 0x0E, 0x5E, 0x89, 0xC2, 0xE0, 0x12, +0xE8, 0x0A, 0x9A, 0xC2, 0x51, 0x31, 0x88, 0xAC, +0x39, 0x42, 0x4D, 0x11, 0x1B, 0x40, 0x80, 0x01, +0x8C, 0x01, 0xD5, 0xF1, 0x3C, 0x10, 0x0F, 0x64, +0x3C, 0x63, 0xED, 0x8C, 0x96, 0x8B, 0x3C, 0x0C, +0x07, 0x24, 0x3C, 0x10, 0x0E, 0x5D, 0xFE, 0xB6, +0x49, 0x00, 0x08, 0x6D, 0xD5, 0x15, 0x3C, 0x50, +0x0E, 0x84, 0x5A, 0x58, 0x14, 0x16, 0x49, 0xFF, +0xEA, 0x9A, 0x3C, 0x30, 0x0F, 0x64, 0x3C, 0x53, +0xED, 0x8C, 0x3E, 0x08, 0x16, 0x38, 0x96, 0xDB, +0x50, 0x10, 0x05, 0x80, 0x50, 0x20, 0x05, 0xC0, +0xFE, 0xEE, 0x49, 0xFF, 0xF9, 0x0D, 0x49, 0xFF, +0xEA, 0x52, 0x48, 0x00, 0x00, 0x7C, 0x3C, 0x60, +0x0E, 0x84, 0x5A, 0x68, 0x04, 0x11, 0x3C, 0x00, +0x0F, 0x64, 0x3C, 0x43, 0xED, 0x8C, 0x96, 0xC3, +0x3E, 0x08, 0x03, 0x4C, 0x50, 0x10, 0x05, 0x80, +0x50, 0x20, 0x05, 0xC0, 0xFE, 0xE6, 0x49, 0xFF, +0xF8, 0xF7, 0xD5, 0x68, 0x3C, 0xF0, 0x0E, 0x84, +0x5A, 0xF0, 0x05, 0x4D, 0x3D, 0x00, 0x0E, 0x84, +0x5B, 0x00, 0x08, 0x4C, 0x3D, 0x10, 0x0E, 0x84, +0x5B, 0x10, 0x0A, 0x4B, 0x3D, 0x20, 0x0E, 0x84, +0x5B, 0x20, 0x0D, 0x06, 0x3D, 0x30, 0x0E, 0x84, +0x5B, 0x38, 0x0C, 0x05, 0x3C, 0x0C, 0x07, 0x24, +0xD5, 0x47, 0x3D, 0x40, 0x0E, 0x84, 0x5B, 0x40, +0x0F, 0x3F, 0x3D, 0x50, 0x0E, 0x84, 0x5B, 0x58, +0x13, 0x3E, 0x86, 0x00, 0x3C, 0x0C, 0x07, 0x24, +0x80, 0x30, 0x3D, 0x60, 0x0E, 0x5D, 0xE1, 0x96, +0xE8, 0x07, 0x41, 0xC0, 0x40, 0x20, 0x12, 0x1E, +0x00, 0x00, 0x8D, 0x81, 0xD5, 0xF7, 0x84, 0x20, +0x3E, 0x3F, 0xDB, 0x60, 0x3D, 0x70, 0x0E, 0x5F, +0x94, 0x89, 0xE0, 0x37, 0xE8, 0x08, 0x99, 0x02, +0x88, 0x43, 0x22, 0x21, 0x02, 0xE0, 0xAC, 0xA0, +0x8C, 0x21, 0xD5, 0xF5, 0x88, 0x40, 0x3E, 0x5F, +0xDB, 0x60, 0x3C, 0x30, 0x0E, 0x5F, 0x3C, 0x40, +0x0E, 0x5E, 0x88, 0x83, 0xE0, 0x24, 0xE8, 0x18, +0x9B, 0x8B, 0x51, 0x83, 0x02, 0xC0, 0x39, 0x92, +0xE1, 0x11, 0x1B, 0x91, 0x00, 0x01, 0x8C, 0x21, +0xD5, 0xF1, 0x3E, 0x08, 0x16, 0x38, 0xD5, 0x0C, +0x3E, 0x0F, 0xDB, 0x60, 0xD5, 0x09, 0x3E, 0x0F, +0xE6, 0xFC, 0xD5, 0x06, 0x3E, 0x08, 0x03, 0x4C, +0xD5, 0x03, 0x3E, 0x08, 0x0A, 0x60, 0x3C, 0x50, +0x0F, 0x64, 0x3C, 0x63, 0xED, 0x8C, 0x96, 0xAB, +0x3C, 0x10, 0x0E, 0x5D, 0xFE, 0xB6, 0x49, 0x00, +0x07, 0xDA, 0x49, 0x00, 0x07, 0xC5, 0xFC, 0x80, +0xFC, 0x20, 0x3C, 0x03, 0xF6, 0x81, 0xC8, 0x04, +0x2E, 0x10, 0x0A, 0x48, 0xD5, 0x03, 0x3C, 0x13, +0xF6, 0x87, 0x2E, 0x20, 0x03, 0x22, 0xCA, 0x07, +0x2E, 0x30, 0x03, 0x2C, 0xC3, 0x04, 0x3C, 0x10, +0x05, 0x24, 0x92, 0x28, 0x3D, 0x30, 0x0E, 0x5D, +0x3C, 0x47, 0xF6, 0x74, 0x2E, 0x57, 0xEC, 0xFA, +0x3E, 0x28, 0x0A, 0x60, 0x86, 0x40, 0x44, 0x30, +0x7F, 0xFF, 0x51, 0x40, 0xFF, 0xFF, 0xE1, 0xD3, +0xE8, 0x15, 0xCC, 0x03, 0xCD, 0x02, 0xC9, 0x04, +0xA5, 0xD0, 0x9B, 0x9F, 0xD5, 0x0A, 0xA5, 0x90, +0x23, 0x11, 0x05, 0xEC, 0x9B, 0xDE, 0x96, 0x3B, +0x42, 0x0A, 0x44, 0x73, 0x40, 0x60, 0x04, 0xD6, +0x12, 0x61, 0x05, 0xEC, 0x8D, 0xC1, 0x8C, 0x42, +0xD5, 0xEB, 0x3C, 0x80, 0x0E, 0x60, 0x3E, 0x08, +0x15, 0x60, 0x84, 0xE0, 0xE0, 0xE8, 0xE8, 0x07, +0x2B, 0x00, 0x00, 0x01, 0x13, 0x00, 0x03, 0x2B, +0x8C, 0xE1, 0xD5, 0xF9, 0x3C, 0x50, 0x0E, 0x61, +0x3E, 0x18, 0x15, 0xA0, 0x84, 0x80, 0xE0, 0x85, +0xE8, 0x07, 0x2A, 0x60, 0x80, 0x01, 0x12, 0x60, +0x83, 0x2B, 0x8C, 0x81, 0xD5, 0xF9, 0xFC, 0xA0, +0x3C, 0x20, 0x0F, 0x24, 0x44, 0x1F, 0x80, 0x00, +0x3C, 0x18, 0x0E, 0x58, 0x4E, 0x22, 0x00, 0xD1, +0x3C, 0x30, 0x0F, 0x64, 0x97, 0x1B, 0x4E, 0x44, +0x00, 0xCC, 0xFC, 0x60, 0x3C, 0x50, 0x0F, 0x27, +0x3C, 0x60, 0x0E, 0x5F, 0x96, 0x6B, 0xC9, 0x61, +0x3C, 0x50, 0x0F, 0x28, 0x44, 0xAF, 0x80, 0x00, +0x97, 0xEB, 0xFF, 0xF4, 0x3F, 0xE8, 0x1C, 0xE8, +0x3F, 0xC8, 0x0A, 0x60, 0x44, 0xB0, 0x00, 0x64, +0x3F, 0x9F, 0xE6, 0xFC, 0x44, 0x90, 0x7F, 0xFF, +0xE0, 0x26, 0xE8, 0x4C, 0x84, 0x40, 0x82, 0x02, +0x3C, 0x30, 0x0F, 0x24, 0x97, 0x1B, 0xE1, 0x84, +0xE8, 0x14, 0x50, 0xD8, 0x00, 0xB6, 0x38, 0x4F, +0x35, 0x01, 0x97, 0x63, 0xE0, 0x25, 0xE9, 0x0B, +0x38, 0x3F, 0x35, 0x01, 0x3C, 0x40, 0x0F, 0x29, +0x97, 0x5B, 0x96, 0xE3, 0x88, 0x65, 0xE0, 0x23, +0xE8, 0x02, 0x84, 0x41, 0x8D, 0x81, 0xD5, 0xE9, +0xCA, 0x05, 0x98, 0x8F, 0x38, 0x0E, 0x09, 0x09, +0xD5, 0x2B, 0x3C, 0xC0, 0x0E, 0x84, 0x5A, 0xC0, +0x06, 0x28, 0x3C, 0x50, 0x0E, 0x84, 0x96, 0xAB, +0xE4, 0x4B, 0xE9, 0x06, 0x3C, 0x30, 0x0E, 0x84, +0x97, 0x1B, 0xE4, 0x8F, 0xE9, 0x1D, 0x99, 0x4F, +0x3C, 0x20, 0x0F, 0x32, 0x38, 0x4E, 0x15, 0x11, +0x96, 0xD3, 0xFE, 0xE4, 0x3C, 0x20, 0x10, 0x69, +0x41, 0x11, 0xAE, 0x36, 0x88, 0x51, 0x96, 0x91, +0x97, 0x13, 0x39, 0x2C, 0x95, 0x11, 0x41, 0x34, +0x90, 0x01, 0x8B, 0xF2, 0xE1, 0x53, 0x38, 0x4E, +0x15, 0x09, 0xE8, 0x06, 0x40, 0x54, 0xC8, 0x01, +0x9A, 0xEA, 0x40, 0xA1, 0x80, 0x11, 0x8C, 0x21, +0xD5, 0xB4, 0x3C, 0xA8, 0x0E, 0x58, 0xD5, 0x63, +0x3C, 0x70, 0x0F, 0x28, 0x3C, 0x90, 0x0E, 0x5E, +0x96, 0x7B, 0x84, 0xE0, 0x95, 0xB1, 0x95, 0x49, +0x82, 0x27, 0x44, 0x8F, 0x80, 0x00, 0x82, 0x07, +0x3E, 0xA8, 0x1C, 0xE8, 0x3F, 0x28, 0x0A, 0x60, +0x44, 0xB0, 0x00, 0x64, 0x3E, 0xCF, 0xE6, 0xFC, +0x45, 0x30, 0x7F, 0xFF, 0xE1, 0x89, 0xE8, 0x49, +0x84, 0x80, 0x80, 0x64, 0x3C, 0x20, 0x0F, 0x24, +0x96, 0x53, 0xE0, 0x61, 0xE8, 0x0B, 0x51, 0x81, +0x80, 0xB6, 0x38, 0x15, 0x61, 0x01, 0x96, 0x8B, +0x4D, 0x01, 0x40, 0x03, 0x84, 0x81, 0x8C, 0x61, +0xD5, 0xF2, 0xCC, 0x06, 0x41, 0x78, 0xC8, 0x00, +0x38, 0x0B, 0x94, 0x09, 0xD5, 0x2E, 0x3C, 0xD0, +0x0E, 0x84, 0x5A, 0xD0, 0x06, 0x2B, 0x3C, 0x40, +0x0E, 0x84, 0x96, 0xE3, 0xE4, 0x6B, 0xE9, 0x06, +0x3C, 0x20, 0x0E, 0x84, 0x96, 0x53, 0xE4, 0x2F, +0xE9, 0x20, 0x3C, 0x40, 0x0F, 0x32, 0x40, 0xE3, +0xC8, 0x00, 0x38, 0x37, 0x14, 0x11, 0x96, 0xA3, +0xFE, 0x9C, 0x3C, 0x10, 0x10, 0x69, 0x41, 0x41, +0x2E, 0x97, 0x88, 0x34, 0x97, 0x09, 0x41, 0x53, +0xB0, 0x00, 0x96, 0x63, 0x39, 0x6A, 0x94, 0x11, +0x40, 0x29, 0x84, 0x01, 0x8A, 0x56, 0xE1, 0x02, +0x38, 0x17, 0x14, 0x09, 0xE8, 0x06, 0x40, 0x39, +0xD8, 0x01, 0x9B, 0x1C, 0x40, 0x82, 0x00, 0x11, +0x8D, 0x81, 0x89, 0xA6, 0x88, 0xE6, 0xD5, 0xB7, +0x3C, 0x88, 0x0E, 0x58, 0xFC, 0xE0, 0xDD, 0x9E, +0xFC, 0x01, 0x3C, 0x0D, 0xFF, 0xB9, 0x84, 0x21, +0xA8, 0x47, 0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, +0x00, 0x1E, 0x3E, 0x0F, 0xDB, 0x60, 0x44, 0x14, +0xF0, 0x00, 0x44, 0x20, 0x05, 0x80, 0xDD, 0x23, +0x3C, 0x00, 0x0F, 0x92, 0x96, 0x03, 0x96, 0x01, +0x96, 0x0E, 0xC0, 0x0C, 0x3C, 0x0D, 0xFF, 0xC0, +0x04, 0x30, 0x00, 0x1E, 0x3E, 0x08, 0x16, 0x38, +0x44, 0x14, 0xF5, 0x80, 0x44, 0x20, 0x05, 0x80, +0xDD, 0x23, 0x84, 0x00, 0xF0, 0x81, 0xD5, 0x14, +0xF0, 0x01, 0x50, 0x00, 0x02, 0xE0, 0x94, 0x41, +0x3E, 0x0F, 0xDB, 0x60, 0x88, 0x01, 0x22, 0x20, +0x00, 0x00, 0xF0, 0x01, 0x94, 0x41, 0x3E, 0x0F, +0xF9, 0x64, 0x88, 0x01, 0x80, 0x22, 0xAC, 0x40, +0xF0, 0x01, 0x8C, 0x01, 0xF0, 0x81, 0xF0, 0x01, +0x5E, 0x00, 0x00, 0x16, 0xC8, 0xEA, 0xD5, 0x15, +0xF0, 0x01, 0x8E, 0x16, 0x50, 0x00, 0x02, 0xC0, +0x94, 0x41, 0x3E, 0x0F, 0xDB, 0x60, 0x88, 0x01, +0x22, 0x20, 0x00, 0x00, 0xF0, 0x01, 0x94, 0x41, +0x3E, 0x0F, 0xF9, 0x64, 0x88, 0x01, 0x80, 0x22, +0xAC, 0x40, 0xF0, 0x01, 0x8C, 0x01, 0xF0, 0x81, +0xF0, 0x01, 0x5E, 0x00, 0x00, 0x36, 0xC8, 0xE9, +0x3C, 0x0D, 0xFF, 0xB9, 0x84, 0x21, 0xA8, 0x47, +0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, 0x00, 0x1E, +0x3E, 0x0F, 0xF9, 0x64, 0x44, 0x14, 0xFB, 0x00, +0x44, 0x20, 0x00, 0x6C, 0xDD, 0x23, 0x3C, 0x0D, +0xFF, 0xB9, 0x84, 0x20, 0xA8, 0x47, 0xFC, 0x81, +0xFC, 0x02, 0x10, 0x0F, 0x80, 0x07, 0x3C, 0x00, +0x0E, 0x8C, 0x96, 0x03, 0x96, 0x01, 0x96, 0x04, +0xC0, 0x0C, 0x84, 0x00, 0x3C, 0x0B, 0xF0, 0xA7, +0x84, 0x00, 0x3C, 0x0B, 0xF0, 0xA8, 0x84, 0x00, +0x3E, 0x07, 0xE1, 0x52, 0x48, 0x00, 0x00, 0x6C, +0x00, 0x0F, 0x80, 0x07, 0xC0, 0x0E, 0x3C, 0x0D, +0xFF, 0xC0, 0x04, 0x30, 0x00, 0x1F, 0x3E, 0x1F, +0xDB, 0x60, 0x44, 0x04, 0xF0, 0x00, 0x44, 0x20, +0x05, 0x80, 0x4B, 0xE0, 0x0C, 0x01, 0xD5, 0x0D, +0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, 0x00, 0x1F, +0x3E, 0x1F, 0xDB, 0x60, 0x44, 0x04, 0xF5, 0x80, +0x44, 0x20, 0x05, 0x80, 0x4B, 0xE0, 0x0C, 0x01, +0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, 0x00, 0x1F, +0x3E, 0x1F, 0xF9, 0x64, 0x44, 0x04, 0xFB, 0x00, +0x44, 0x20, 0x00, 0x6C, 0xDD, 0x23, 0x84, 0x00, +0xF0, 0x83, 0xD5, 0x14, 0xF0, 0x03, 0x94, 0x41, +0x3E, 0x0F, 0xF9, 0x64, 0x88, 0x01, 0x22, 0x20, +0x00, 0x00, 0xF0, 0x03, 0x50, 0x00, 0x02, 0xE0, +0x94, 0x41, 0x3E, 0x0F, 0xDB, 0x60, 0x88, 0x01, +0x80, 0x22, 0xAC, 0x40, 0xF0, 0x03, 0x8C, 0x01, +0xF0, 0x83, 0xF0, 0x03, 0x5E, 0x00, 0x00, 0x16, +0xC8, 0xEA, 0xD5, 0x15, 0xF0, 0x03, 0x8E, 0x16, +0xF1, 0x03, 0x94, 0x89, 0x3E, 0x1F, 0xF9, 0x64, +0x88, 0x22, 0x22, 0x20, 0x80, 0x00, 0x50, 0x00, +0x02, 0xC0, 0x94, 0x41, 0x3E, 0x0F, 0xDB, 0x60, +0x88, 0x01, 0x80, 0x22, 0xAC, 0x40, 0xF0, 0x03, +0x8C, 0x01, 0xF0, 0x83, 0xF0, 0x03, 0x5E, 0x00, +0x00, 0x36, 0xC8, 0xE9, 0x3C, 0x00, 0x0F, 0x74, +0x96, 0x03, 0x96, 0x01, 0x3C, 0x0B, 0xF0, 0xA7, +0x3C, 0x00, 0x11, 0x67, 0x96, 0x03, 0x96, 0x01, +0x3C, 0x0B, 0xF0, 0xA8, 0x44, 0x00, 0x00, 0x01, +0x3E, 0x07, 0xE1, 0x52, 0xFC, 0x82, 0xFC, 0x00, +0x3C, 0x0D, 0xFF, 0xB9, 0x84, 0x21, 0xA8, 0x47, +0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, 0x00, 0x1E, +0x3E, 0x08, 0x1C, 0xE8, 0x44, 0x14, 0xE8, 0x00, +0x44, 0x20, 0x08, 0x00, 0xDD, 0x23, 0x3C, 0x0D, +0xFF, 0xB9, 0x84, 0x20, 0xA8, 0x47, 0xFC, 0x80, +0xFC, 0x00, 0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, +0x00, 0x1F, 0x3E, 0x18, 0x1C, 0xE8, 0x44, 0x04, +0xE8, 0x00, 0x44, 0x20, 0x08, 0x00, 0xDD, 0x23, +0xFC, 0x80, 0xFC, 0x02, 0x84, 0x00, 0x12, 0x0F, +0x80, 0x07, 0x84, 0x00, 0xF0, 0x82, 0xD5, 0x26, +0x3C, 0x0D, 0xFF, 0xC0, 0x04, 0x30, 0x00, 0x1F, +0xF0, 0x02, 0x3E, 0x18, 0x0A, 0x60, 0x44, 0x20, +0x01, 0x00, 0xDD, 0x23, 0x84, 0x00, 0xF0, 0x81, +0xD5, 0x11, 0xF0, 0x01, 0x94, 0x41, 0x3E, 0x08, +0x0A, 0x60, 0x88, 0x01, 0x22, 0x00, 0x00, 0x00, +0x96, 0x41, 0x02, 0x0F, 0x80, 0x07, 0x88, 0x01, +0x12, 0x0F, 0x80, 0x07, 0xF0, 0x01, 0x8C, 0x01, +0xF0, 0x81, 0xF0, 0x01, 0x5E, 0x00, 0x01, 0x00, +0xC8, 0xED, 0xF0, 0x02, 0x50, 0x00, 0x01, 0x00, +0xF0, 0x82, 0xF0, 0x02, 0x44, 0x10, 0x7F, 0xFF, +0x40, 0x00, 0x80, 0x07, 0xC0, 0xD6, 0x02, 0x0F, +0x80, 0x07, 0xFC, 0x82, 0xFC, 0x01, 0x84, 0x00, +0x12, 0x0F, 0x80, 0x03, 0x49, 0xFF, 0xFF, 0xC7, +0x12, 0x0F, 0x80, 0x03, 0x02, 0x0F, 0x80, 0x03, +0xC8, 0x06, 0x44, 0x00, 0x55, 0xAA, 0x3C, 0x08, +0x0F, 0xA0, 0xD5, 0x05, 0x44, 0x00, 0x00, 0x00, +0x3C, 0x08, 0x0F, 0xA0, 0xFC, 0x81, 0x3C, 0x0D, +0xFF, 0xBF, 0x44, 0x14, 0x7F, 0xF0, 0xA8, 0x41, +0xDD, 0x9E, 0x46, 0x00, 0x01, 0xC0, 0x3C, 0x0E, +0x07, 0x39, 0x46, 0x00, 0x01, 0x90, 0x3C, 0x0F, +0xFE, 0x58, 0x46, 0x00, 0x01, 0x98, 0x3C, 0x0F, +0xFF, 0xBE, 0x46, 0x00, 0x00, 0x8F, 0x50, 0x00, +0x06, 0x00, 0x3C, 0x0F, 0xFE, 0x57, 0x46, 0x00, +0x01, 0xC8, 0x3C, 0x0F, 0xFF, 0xB9, 0x44, 0x04, +0x00, 0x00, 0x3C, 0x0F, 0xFF, 0xBD, 0x46, 0x00, +0x01, 0xF8, 0x3C, 0x0F, 0xFE, 0x56, 0x46, 0x00, +0x01, 0x80, 0x3C, 0x0F, 0xFC, 0xE8, 0x46, 0x00, +0x00, 0xC0, 0x3C, 0x0E, 0x07, 0x38, 0x46, 0x00, +0x01, 0xE8, 0x3C, 0x0F, 0xFF, 0xBC, 0x46, 0x00, +0x01, 0xF0, 0x3C, 0x0F, 0xFF, 0xBB, 0x46, 0x00, +0x01, 0xE0, 0x3C, 0x0F, 0xFE, 0x55, 0x46, 0x00, +0x01, 0xD0, 0x3C, 0x0F, 0xFF, 0xBA, 0x46, 0x00, +0x00, 0x8F, 0x50, 0x00, 0x0A, 0x38, 0x3C, 0x0F, +0xFF, 0xC0, 0x46, 0x00, 0x00, 0x8F, 0x50, 0x00, +0x0A, 0xC0, 0x3C, 0x0F, 0xFF, 0xBF, 0xDD, 0x9E, +0x3C, 0x1D, 0xFC, 0xE8, 0xB4, 0x01, 0x96, 0x84, +0xCA, 0xFE, 0xDD, 0x9E, 0xFC, 0x00, 0x49, 0xFF, +0xFF, 0xF9, 0x3C, 0x1C, 0x07, 0x39, 0x3C, 0x2D, +0xFC, 0xE8, 0x84, 0x01, 0xA8, 0x09, 0xB6, 0x02, +0xFC, 0x80, 0xFC, 0x20, 0x84, 0xA0, 0x84, 0xC1, +0x3F, 0x18, 0x1C, 0xE8, 0x84, 0x60, 0x41, 0x00, +0x14, 0x00, 0x80, 0x43, 0xB4, 0x90, 0x40, 0x73, +0x08, 0x0C, 0xFF, 0x3E, 0xC4, 0x0A, 0x40, 0x81, +0x04, 0x0A, 0x50, 0xF4, 0x02, 0x40, 0x39, 0x28, +0xBD, 0x01, 0x40, 0x43, 0x48, 0x0C, 0xFE, 0xE7, +0x9D, 0x11, 0xB4, 0xF0, 0x41, 0x33, 0x10, 0x0C, +0x40, 0x79, 0x9C, 0x02, 0xC7, 0x0A, 0x90, 0x81, +0x51, 0x42, 0x02, 0x40, 0x38, 0x88, 0xD1, 0x01, +0x93, 0x08, 0x40, 0x43, 0x20, 0x0C, 0xFE, 0xE7, +0x8C, 0x42, 0x5A, 0x28, 0x20, 0xE1, 0x98, 0x8D, +0x8C, 0xA4, 0xB6, 0x62, 0x5A, 0x58, 0xA0, 0xD8, +0xFC, 0xA0, 0xFC, 0x68, 0xF3, 0x8F, 0x2E, 0x37, +0xE1, 0x5D, 0x81, 0x40, 0xF1, 0x8D, 0xF2, 0x8E, +0x5A, 0x38, 0x02, 0x0F, 0xC8, 0x06, 0x3C, 0x10, +0x11, 0x52, 0x3C, 0x70, 0x11, 0x5F, 0xD5, 0x04, +0x44, 0x70, 0x04, 0x04, 0x80, 0x27, 0x3C, 0x00, +0x11, 0x67, 0x85, 0x21, 0xD5, 0x04, 0x84, 0xE0, +0x80, 0x27, 0x81, 0x27, 0x3C, 0x2D, 0xFC, 0xE8, +0x46, 0x01, 0xE0, 0x01, 0x50, 0x40, 0x0E, 0x00, +0x14, 0x41, 0x00, 0x1C, 0x3C, 0x50, 0x11, 0x25, +0x3C, 0x60, 0x11, 0x26, 0x40, 0x83, 0x16, 0x04, +0x14, 0x81, 0x00, 0x28, 0x3C, 0xB0, 0x11, 0x2C, +0x3C, 0xC0, 0x11, 0x2D, 0x40, 0xD6, 0x2E, 0x04, +0x14, 0xD1, 0x00, 0x30, 0x3C, 0xE0, 0x11, 0x30, +0x3C, 0xF0, 0x11, 0x31, 0x41, 0x07, 0xBA, 0x04, +0x15, 0x01, 0x00, 0x32, 0x3C, 0x20, 0x11, 0x48, +0x97, 0x94, 0xC6, 0x68, 0x3C, 0x20, 0x11, 0x56, +0x3C, 0x50, 0x11, 0x4A, 0x3C, 0x40, 0x11, 0x4B, +0x5A, 0x38, 0x02, 0x24, 0x3C, 0x30, 0x11, 0x4C, +0x85, 0x03, 0x3D, 0x80, 0x11, 0x4E, 0x97, 0x20, +0x3D, 0x90, 0x11, 0x4F, 0x96, 0xD8, 0x3D, 0xE0, +0x11, 0x50, 0x3C, 0xB0, 0x11, 0x51, 0xB7, 0x1F, +0x3D, 0x60, 0x11, 0x53, 0xF4, 0x81, 0x3C, 0x60, +0x11, 0x54, 0xF3, 0x82, 0x3C, 0x00, 0x11, 0x55, +0x14, 0x9F, 0x80, 0x03, 0x15, 0x8F, 0x80, 0x04, +0x15, 0x9F, 0x80, 0x05, 0x15, 0xEF, 0x80, 0x06, +0x14, 0xBF, 0x80, 0x07, 0xF1, 0x88, 0xD5, 0x28, +0x3C, 0x30, 0x11, 0x4C, 0x3C, 0x10, 0x11, 0x4D, +0x86, 0xE3, 0x3D, 0x40, 0x11, 0x4E, 0x97, 0x20, +0x3D, 0x50, 0x11, 0x4F, 0x96, 0xD8, 0x3D, 0x30, +0x11, 0x50, 0x96, 0x48, 0x3D, 0x20, 0x11, 0x51, +0x3D, 0x10, 0x11, 0x52, 0x15, 0x7F, 0x80, 0x00, +0x3D, 0x60, 0x11, 0x53, 0xF4, 0x81, 0x3C, 0x60, +0x11, 0x54, 0xF3, 0x82, 0x3C, 0x00, 0x11, 0x55, +0xF1, 0x83, 0x15, 0x4F, 0x80, 0x04, 0x15, 0x5F, +0x80, 0x05, 0x15, 0x3F, 0x80, 0x06, 0x15, 0x2F, +0x80, 0x07, 0x15, 0x1F, 0x80, 0x08, 0xF6, 0x8A, +0x97, 0x80, 0x84, 0x00, 0xF6, 0x8B, 0x15, 0x6F, +0x80, 0x09, 0x80, 0x20, 0x96, 0x90, 0x80, 0x60, +0xF4, 0x0D, 0x97, 0x68, 0x49, 0x00, 0x1B, 0x6D, +0x3C, 0xCD, 0xFC, 0xE8, 0x84, 0xC8, 0x04, 0xD6, +0x00, 0x1C, 0x50, 0xE6, 0x80, 0x40, 0x14, 0xE6, +0x00, 0x1C, 0x3C, 0x20, 0x11, 0x48, 0x96, 0x8E, +0xC2, 0x74, 0x2E, 0xF7, 0xE1, 0x5D, 0x3C, 0x20, +0x11, 0x63, 0x3C, 0x50, 0x11, 0x57, 0x5A, 0xF8, +0x02, 0x2F, 0x3C, 0x30, 0x11, 0x58, 0x3C, 0x00, +0x11, 0x59, 0x3D, 0x60, 0x11, 0x5B, 0x3D, 0x70, +0x11, 0x5C, 0x3D, 0x80, 0x11, 0x5D, 0x3D, 0x90, +0x11, 0x5E, 0x3D, 0xE0, 0x11, 0x60, 0x3C, 0x40, +0x11, 0x61, 0x3C, 0x10, 0x11, 0x62, 0x96, 0xD8, +0x96, 0x00, 0x85, 0x64, 0xF7, 0x88, 0x97, 0xC8, +0xF3, 0x81, 0xF0, 0x82, 0xB7, 0x7F, 0x14, 0x9F, +0x80, 0x03, 0x15, 0x6F, 0x80, 0x04, 0x15, 0x7F, +0x80, 0x05, 0x15, 0x8F, 0x80, 0x06, 0x15, 0x9F, +0x80, 0x07, 0x15, 0xEF, 0x80, 0x09, 0xF4, 0x8A, +0xF7, 0x8B, 0x80, 0x06, 0x84, 0x20, 0x96, 0x90, +0x80, 0x6A, 0xD5, 0x32, 0x3C, 0x40, 0x11, 0x58, +0x3C, 0x30, 0x11, 0x59, 0x3C, 0x10, 0x11, 0x5A, +0x3D, 0x40, 0x11, 0x5B, 0x3C, 0xA0, 0x11, 0x5C, +0x3D, 0x50, 0x11, 0x5D, 0x3D, 0x30, 0x11, 0x5E, +0x3D, 0x20, 0x11, 0x5F, 0x3D, 0x00, 0x11, 0x60, +0x3C, 0x70, 0x11, 0x61, 0x3C, 0x00, 0x11, 0x62, +0x96, 0x48, 0x96, 0xD8, 0x86, 0x24, 0x97, 0x20, +0xF1, 0x83, 0xF7, 0x8A, 0x84, 0x20, 0x97, 0xC0, +0xF3, 0x82, 0xB7, 0xBF, 0xF4, 0x81, 0x15, 0x4F, +0x80, 0x04, 0x14, 0xAF, 0x80, 0x05, 0x15, 0x5F, +0x80, 0x06, 0x15, 0x3F, 0x80, 0x07, 0x15, 0x2F, +0x80, 0x08, 0x15, 0x0F, 0x80, 0x09, 0xF7, 0x8B, +0x80, 0x06, 0x96, 0x90, 0x80, 0x61, 0xF4, 0x0E, +0x97, 0x68, 0x49, 0x00, 0x1A, 0xF6, 0x3C, 0x8D, +0xFC, 0xE8, 0x8C, 0xC8, 0x04, 0xC4, 0x00, 0x1C, +0x50, 0xD6, 0x00, 0x2C, 0x14, 0xD4, 0x00, 0x1C, +0x2E, 0x87, 0xE1, 0x5D, 0x3C, 0x20, 0x11, 0x70, +0x50, 0xE3, 0x00, 0x08, 0x3C, 0x50, 0x11, 0x64, +0x5A, 0x88, 0x02, 0x5F, 0x3C, 0x10, 0x11, 0x66, +0x3D, 0xE0, 0x0F, 0x74, 0x3C, 0xD0, 0x11, 0x69, +0x3C, 0xF0, 0x11, 0x6A, 0x3D, 0x40, 0x11, 0x6B, +0x3C, 0xA0, 0x11, 0x6C, 0x3C, 0x40, 0x11, 0x6D, +0x3C, 0x30, 0x11, 0x6E, 0x3C, 0x00, 0x11, 0x6F, +0x84, 0xE0, 0x54, 0xC4, 0x80, 0xFF, 0x96, 0x48, +0xF4, 0x89, 0x97, 0x00, 0xF1, 0x82, 0x80, 0x06, +0xF3, 0x8A, 0xF4, 0x8B, 0x84, 0x21, 0x96, 0x90, +0x80, 0x67, 0xF4, 0x0F, 0x97, 0x68, 0xF7, 0x81, +0x14, 0xCF, 0x80, 0x03, 0x15, 0xEF, 0x80, 0x04, +0x14, 0xDF, 0x80, 0x05, 0x14, 0xFF, 0x80, 0x06, +0x15, 0x4F, 0x80, 0x07, 0x14, 0xAF, 0x80, 0x08, +0xB6, 0xFF, 0x49, 0x00, 0x1A, 0xB2, 0x3C, 0x20, +0x11, 0x70, 0x3C, 0x98, 0x0E, 0x6B, 0x3C, 0x50, +0x11, 0x64, 0x3C, 0x10, 0x11, 0x66, 0x3C, 0x90, +0x0F, 0x74, 0x3D, 0x50, 0x11, 0x69, 0x3D, 0x30, +0x11, 0x6A, 0x3D, 0x20, 0x11, 0x6B, 0x3C, 0x60, +0x11, 0x6C, 0x3C, 0x40, 0x11, 0x6D, 0x3C, 0x30, +0x11, 0x6E, 0x3C, 0x00, 0x11, 0x6F, 0x96, 0x48, +0xF6, 0x88, 0x97, 0x80, 0xB7, 0x1F, 0xF7, 0x81, +0xF1, 0x82, 0x14, 0xCF, 0x80, 0x03, 0x14, 0x9F, +0x80, 0x04, 0x15, 0x5F, 0x80, 0x05, 0x15, 0x3F, +0x80, 0x06, 0x15, 0x2F, 0x80, 0x07, 0xF4, 0x89, +0xF3, 0x8A, 0xF6, 0x8B, 0xD5, 0x6C, 0x3C, 0x40, +0x11, 0x65, 0x3C, 0x30, 0x11, 0x66, 0x3C, 0x10, +0x11, 0x67, 0x3C, 0xF0, 0x0F, 0x74, 0x3D, 0x40, +0x11, 0x69, 0x3C, 0x90, 0x11, 0x6A, 0x3C, 0xA0, +0x11, 0x6B, 0x3D, 0x50, 0x11, 0x6C, 0x3D, 0x30, +0x11, 0x6D, 0x3D, 0x20, 0x11, 0x6E, 0x3C, 0x00, +0x11, 0x6F, 0x84, 0xE0, 0x97, 0x20, 0x96, 0xD8, +0x96, 0x48, 0x96, 0x00, 0xF4, 0x81, 0xF3, 0x82, +0xF1, 0x83, 0xF0, 0x8B, 0x84, 0x21, 0x80, 0x06, +0x96, 0x90, 0x80, 0x67, 0xF4, 0x0F, 0x97, 0x68, +0x14, 0xFF, 0x80, 0x04, 0x15, 0x4F, 0x80, 0x05, +0x14, 0x9F, 0x80, 0x06, 0x14, 0xAF, 0x80, 0x07, +0x15, 0x5F, 0x80, 0x08, 0x15, 0x3F, 0x80, 0x09, +0x15, 0x2F, 0x80, 0x0A, 0xB6, 0xFF, 0x49, 0x00, +0x1A, 0x50, 0x3C, 0x60, 0x11, 0x67, 0x3C, 0x68, +0x0E, 0x6B, 0x3C, 0x20, 0x11, 0x70, 0x3C, 0x50, +0x11, 0x64, 0x3C, 0x40, 0x11, 0x65, 0x3C, 0x00, +0x11, 0x66, 0x3C, 0x30, 0x11, 0x67, 0x3D, 0x60, +0x0F, 0x74, 0x3D, 0x70, 0x11, 0x69, 0x3D, 0x80, +0x11, 0x6A, 0x3D, 0x90, 0x11, 0x6B, 0x3D, 0x10, +0x11, 0x6C, 0x3D, 0x00, 0x11, 0x6D, 0x3C, 0x60, +0x11, 0x6E, 0x3C, 0x10, 0x11, 0x6F, 0x85, 0x62, +0x97, 0x20, 0x96, 0x00, 0x96, 0xD8, 0xF6, 0x8A, +0x97, 0x88, 0xB7, 0x7F, 0xF4, 0x81, 0xF0, 0x82, +0xF3, 0x83, 0x15, 0x6F, 0x80, 0x04, 0x15, 0x7F, +0x80, 0x05, 0x15, 0x8F, 0x80, 0x06, 0x15, 0x9F, +0x80, 0x07, 0x15, 0x1F, 0x80, 0x08, 0x15, 0x0F, +0x80, 0x09, 0xF6, 0x8B, 0x80, 0x0E, 0x84, 0x21, +0x96, 0x90, 0x80, 0x67, 0x80, 0x87, 0x97, 0x68, +0x49, 0x00, 0x1A, 0x13, 0x2E, 0x87, 0xE1, 0x5D, +0x3C, 0xED, 0xFC, 0xE8, 0x5A, 0x88, 0x02, 0x20, +0x3C, 0xD0, 0x11, 0x14, 0x86, 0x80, 0x40, 0xF6, +0xC0, 0x08, 0x58, 0x07, 0x80, 0x05, 0x14, 0x07, +0x00, 0x03, 0x15, 0x47, 0x00, 0x24, 0x3C, 0xA0, +0x11, 0x25, 0x45, 0xE7, 0x1F, 0x73, 0x40, 0x95, +0x40, 0x08, 0x59, 0x54, 0x80, 0x51, 0x15, 0x57, +0x00, 0x28, 0x3D, 0x30, 0x11, 0x2C, 0x41, 0x29, +0xC0, 0x08, 0x58, 0x19, 0x00, 0x04, 0x14, 0x17, +0x00, 0x30, 0xD5, 0x24, 0x3C, 0x70, 0x11, 0x14, +0x3C, 0x20, 0x11, 0x15, 0x40, 0x51, 0x1E, 0x04, +0x14, 0x57, 0x00, 0x03, 0x3C, 0x40, 0x11, 0x1F, +0x96, 0xE3, 0x14, 0x37, 0x00, 0x24, 0x3D, 0x60, +0x11, 0x25, 0x3D, 0x70, 0x11, 0x26, 0x41, 0x8B, +0xDA, 0x04, 0x15, 0x87, 0x00, 0x28, 0x3D, 0x90, +0x11, 0x2C, 0x3D, 0x10, 0x11, 0x2D, 0x41, 0x08, +0xE6, 0x04, 0x15, 0x07, 0x00, 0x30, 0x3C, 0xB0, +0x11, 0x30, 0x3C, 0xC0, 0x11, 0x31, 0x41, 0xE6, +0x2E, 0x04, 0x15, 0xE7, 0x00, 0x32, 0xFC, 0xE8, +0x3C, 0x2C, 0x07, 0x39, 0x84, 0x60, 0xA8, 0xD1, +0x3C, 0x40, 0x11, 0x48, 0x97, 0x64, 0xC5, 0x02, +0x84, 0xA8, 0x3C, 0x30, 0x11, 0x48, 0x96, 0xCE, +0xC3, 0x02, 0x8C, 0xA8, 0x3C, 0xFC, 0x07, 0x38, +0x41, 0x07, 0x94, 0x40, 0x04, 0x28, 0x00, 0x05, +0x66, 0x41, 0x0F, 0xFF, 0xFE, 0x67, 0xC0, 0x04, +0x58, 0x10, 0xC0, 0x00, 0xD5, 0x03, 0x66, 0x10, +0xC0, 0x00, 0x14, 0x18, 0x00, 0x05, 0xDD, 0x9E, +0x3C, 0x3C, 0x07, 0x39, 0x96, 0x43, 0x84, 0x40, +0x3C, 0x18, 0x0F, 0xD3, 0x3C, 0x08, 0x0E, 0x69, +0xA8, 0x99, 0x3C, 0x40, 0x11, 0x48, 0x97, 0x64, +0xC5, 0x02, 0x84, 0xA8, 0x3C, 0x10, 0x11, 0x48, +0x96, 0x4E, 0xC1, 0x02, 0x8C, 0xA8, 0x3C, 0xFC, +0x07, 0x38, 0x41, 0x07, 0x94, 0x40, 0xB4, 0x50, +0x96, 0xD1, 0xB6, 0x70, 0xB4, 0x90, 0x40, 0x02, +0x02, 0x04, 0xB6, 0x10, 0xDD, 0x9E, 0xFC, 0x01, +0x3C, 0x2C, 0x07, 0x39, 0x84, 0x20, 0xA8, 0x51, +0x3C, 0x3C, 0x07, 0x38, 0xF1, 0x81, 0x40, 0x00, +0x40, 0x08, 0xF4, 0x01, 0xE4, 0x85, 0xE8, 0x11, +0xF5, 0x01, 0x40, 0x61, 0x94, 0xA0, 0xB4, 0x26, +0x96, 0x89, 0xB6, 0x46, 0xF4, 0x01, 0x41, 0x01, +0x90, 0xA0, 0xB4, 0xB0, 0xFF, 0x47, 0xB6, 0xB0, +0xF6, 0x01, 0x8C, 0xC1, 0xF6, 0x81, 0xD5, 0xEE, +0xFC, 0x81, 0x3C, 0x1C, 0x07, 0x39, 0x84, 0x40, +0x3C, 0x08, 0x0E, 0x6B, 0xA8, 0x89, 0x3C, 0x30, +0x11, 0x48, 0x97, 0x1C, 0xC4, 0x02, 0x84, 0x88, +0x3C, 0x50, 0x11, 0x48, 0x97, 0x4E, 0xC5, 0x02, +0x8C, 0x88, 0x3C, 0xFC, 0x07, 0x38, 0x41, 0x07, +0x90, 0x40, 0xB4, 0x30, 0x44, 0x2F, 0x00, 0xFF, +0xFE, 0x8E, 0xB6, 0x50, 0xB4, 0x70, 0x40, 0x01, +0x81, 0x04, 0xB6, 0x10, 0xDD, 0x9E, 0xFC, 0x01, +0x3C, 0x2C, 0x07, 0x39, 0x84, 0x20, 0xA8, 0x51, +0x3C, 0x3C, 0x07, 0x38, 0xF1, 0x81, 0x40, 0x00, +0x20, 0x08, 0x44, 0x4F, 0x00, 0xFF, 0xF5, 0x01, +0xE4, 0xA5, 0xE8, 0x11, 0xF6, 0x01, 0x41, 0x01, +0x98, 0xA0, 0xB4, 0x30, 0xFE, 0x66, 0xB6, 0x30, +0xF2, 0x01, 0x41, 0x11, 0x88, 0xA0, 0xB4, 0xB1, +0xFF, 0x47, 0xB6, 0xB1, 0xF6, 0x01, 0x8C, 0xC1, +0xF6, 0x81, 0xD5, 0xEE, 0xFC, 0x81, 0xFC, 0x01, +0x3C, 0x2C, 0x07, 0x39, 0x84, 0x20, 0xA8, 0x51, +0x3C, 0x3C, 0x07, 0x38, 0xF1, 0x81, 0xF4, 0x01, +0xE4, 0x85, 0xE8, 0x12, 0xF5, 0x01, 0x40, 0x61, +0x94, 0xA0, 0xB4, 0x26, 0x66, 0x20, 0x80, 0xFF, +0xB6, 0x46, 0xF4, 0x01, 0x41, 0x01, 0x90, 0xA0, +0xB4, 0xB0, 0xFF, 0x47, 0xB6, 0xB0, 0xF6, 0x01, +0x8C, 0xC1, 0xF6, 0x81, 0xD5, 0xED, 0xFC, 0x81, +0xFC, 0x01, 0x49, 0xFF, 0xFC, 0xC7, 0x46, 0x61, +0x20, 0x00, 0x3C, 0x1D, 0xFC, 0xE8, 0x46, 0x40, +0x50, 0x00, 0x46, 0x20, 0x30, 0x00, 0x84, 0x00, +0x50, 0x31, 0x02, 0x00, 0x50, 0x52, 0x04, 0x00, +0x51, 0x03, 0x06, 0x00, 0x45, 0x10, 0x2A, 0x00, +0x45, 0x20, 0x3F, 0x00, 0x14, 0x00, 0x80, 0x18, +0x14, 0x30, 0x80, 0x19, 0x14, 0x50, 0x80, 0x1A, +0x15, 0x00, 0x80, 0x1B, 0x15, 0x10, 0x80, 0x1E, +0x15, 0x20, 0x80, 0x1D, 0x3C, 0x20, 0x11, 0x47, +0x3D, 0x3D, 0xFE, 0x57, 0x47, 0x50, 0x49, 0xDB, +0x96, 0xD3, 0x86, 0x81, 0x51, 0x6A, 0x8C, 0x57, +0xA8, 0xCF, 0x80, 0x40, 0x80, 0x20, 0x15, 0x49, +0x80, 0x29, 0x80, 0x60, 0x15, 0x69, 0x80, 0xBB, +0x49, 0xFF, 0xFC, 0xD5, 0x3C, 0x00, 0x11, 0x67, +0x3C, 0x10, 0x0F, 0x74, 0x3D, 0x70, 0x0F, 0x74, +0x97, 0x0B, 0x3C, 0x48, 0x0F, 0xD3, 0x3D, 0x80, +0x0E, 0x84, 0x3C, 0x08, 0x0E, 0x6A, 0x3C, 0x48, +0x0E, 0x68, 0x3D, 0x78, 0x0E, 0x69, 0x5B, 0x88, +0x06, 0x04, 0x48, 0x00, 0x00, 0xEA, 0x3C, 0x50, +0x0E, 0x84, 0x97, 0xAB, 0xE4, 0xCB, 0xE9, 0x07, +0x3C, 0x20, 0x0E, 0x84, 0x96, 0xD3, 0xE4, 0x6F, +0x4E, 0xF3, 0x00, 0xDF, 0x3D, 0x90, 0x0E, 0x84, +0x5B, 0x98, 0x11, 0x04, 0x48, 0x00, 0x00, 0xD9, +0x3D, 0xEC, 0x07, 0x39, 0x84, 0x20, 0x14, 0x1F, +0x00, 0x01, 0x3D, 0x40, 0x11, 0x14, 0x3D, 0x3D, +0xFC, 0xE8, 0x3D, 0x50, 0x11, 0x15, 0x40, 0x4A, +0xD2, 0x04, 0x14, 0x49, 0x80, 0x03, 0x3D, 0x60, +0x11, 0x16, 0x3D, 0x70, 0x11, 0x17, 0x40, 0x6B, +0xDA, 0x04, 0x14, 0x69, 0x80, 0x04, 0x3D, 0x80, +0x11, 0x18, 0x3C, 0x20, 0x11, 0x19, 0x40, 0x31, +0x62, 0x04, 0x14, 0x39, 0x80, 0x05, 0x3D, 0x90, +0x11, 0x1A, 0x15, 0x99, 0x80, 0x20, 0x3D, 0x00, +0x11, 0x1B, 0x3C, 0x00, 0x11, 0x1C, 0x41, 0x10, +0x42, 0x04, 0x15, 0x19, 0x80, 0x21, 0x3D, 0x20, +0x11, 0x1D, 0x3C, 0x50, 0x11, 0x1E, 0x40, 0xF2, +0xCA, 0x04, 0x14, 0xF9, 0x80, 0x22, 0x3C, 0x10, +0x11, 0x1F, 0x97, 0x0B, 0x14, 0x49, 0x80, 0x24, +0x3D, 0xE0, 0x11, 0x20, 0x3D, 0x40, 0x11, 0x21, +0x41, 0x5A, 0x7A, 0x04, 0x15, 0x59, 0x80, 0x25, +0x3D, 0x60, 0x11, 0x22, 0x3D, 0x70, 0x11, 0x23, +0x40, 0x6B, 0xDA, 0x04, 0x14, 0x69, 0x80, 0x26, +0x3D, 0x80, 0x11, 0x24, 0x15, 0x89, 0x80, 0x27, +0x3C, 0x30, 0x11, 0x25, 0x3C, 0x20, 0x11, 0x26, +0x41, 0x91, 0x0E, 0x04, 0x15, 0x99, 0x80, 0x28, +0x3D, 0x00, 0x11, 0x27, 0x3C, 0x00, 0x11, 0x28, +0x41, 0x10, 0x42, 0x04, 0x15, 0x19, 0x80, 0x29, +0x3D, 0x20, 0x11, 0x29, 0x3C, 0x50, 0x11, 0x2A, +0x40, 0xF2, 0xCA, 0x04, 0x14, 0xF9, 0x80, 0x2A, +0x3C, 0x10, 0x11, 0x2B, 0x14, 0x19, 0x80, 0x2B, +0x3C, 0x40, 0x11, 0x2C, 0x3D, 0xE0, 0x11, 0x2D, +0x41, 0x4F, 0x12, 0x04, 0x15, 0x49, 0x80, 0x30, +0x3D, 0x50, 0x11, 0x2E, 0x3D, 0x60, 0x11, 0x2F, +0x41, 0x7B, 0x56, 0x04, 0x15, 0x79, 0x80, 0x31, +0x3C, 0x60, 0x11, 0x30, 0x3D, 0x80, 0x11, 0x31, +0x40, 0x3C, 0x1A, 0x04, 0x14, 0x39, 0x80, 0x32, +0x3C, 0x20, 0x11, 0x32, 0x14, 0x29, 0x80, 0x33, +0x3D, 0x90, 0x11, 0x33, 0x3D, 0x00, 0x11, 0x34, +0x40, 0x08, 0x66, 0x04, 0x14, 0x09, 0x80, 0x3C, +0x3D, 0x10, 0x11, 0x35, 0x3D, 0x20, 0x11, 0x36, +0x40, 0x59, 0x46, 0x04, 0x14, 0x59, 0x80, 0x3D, +0x3C, 0xF0, 0x11, 0x37, 0x14, 0xF9, 0x80, 0x3F, +0x3C, 0x10, 0x11, 0x38, 0x3C, 0x40, 0x11, 0x39, +0x41, 0xE2, 0x06, 0x04, 0x15, 0xE9, 0x80, 0x50, +0x3D, 0x40, 0x11, 0x41, 0x3D, 0x50, 0x11, 0x42, +0x41, 0x6A, 0xD2, 0x04, 0x15, 0x69, 0x80, 0x58, +0x3D, 0x70, 0x11, 0x3E, 0x15, 0x79, 0x80, 0x54, +0x3C, 0x60, 0x11, 0x15, 0x97, 0x8E, 0xC6, 0x5A, +0x3D, 0x50, 0x11, 0x3C, 0x3D, 0x60, 0x11, 0x3D, +0x41, 0x7B, 0x56, 0x04, 0x15, 0x79, 0x80, 0x51, +0x3C, 0x60, 0x11, 0x3A, 0x3D, 0x80, 0x11, 0x3B, +0x40, 0x3C, 0x1A, 0x04, 0x14, 0x39, 0x80, 0x52, +0x3D, 0x90, 0x11, 0x45, 0x3C, 0x20, 0x11, 0x46, +0x41, 0x01, 0x66, 0x04, 0x15, 0x09, 0x80, 0x59, +0x3C, 0x00, 0x11, 0x43, 0x3D, 0x10, 0x11, 0x44, +0x41, 0x28, 0x82, 0x04, 0x15, 0x29, 0x80, 0x5A, +0x3C, 0x50, 0x11, 0x40, 0x14, 0x59, 0x80, 0x55, +0x3D, 0x40, 0x11, 0x3F, 0xD5, 0x59, 0x3C, 0x00, +0x0F, 0x74, 0x49, 0xFF, 0xFE, 0x52, 0x3C, 0x00, +0x0F, 0xA9, 0x49, 0xFF, 0xFE, 0xAA, 0x3C, 0x00, +0x0F, 0x96, 0x49, 0xFF, 0xFE, 0x86, 0x3D, 0x00, +0x0F, 0x97, 0x3D, 0x1C, 0x07, 0x39, 0x84, 0x00, +0x47, 0x20, 0x0F, 0xFF, 0x14, 0x08, 0x80, 0x01, +0x3D, 0x3C, 0x07, 0x38, 0xF0, 0x81, 0x40, 0x18, +0x70, 0x08, 0x50, 0x69, 0x0F, 0xFF, 0xF5, 0x01, +0xE4, 0xA5, 0x4E, 0xF2, 0xFF, 0x0B, 0xF5, 0x01, +0x41, 0xE9, 0x94, 0xA0, 0x80, 0x1E, 0xA1, 0x05, +0xFF, 0x36, 0xA9, 0x05, 0xF3, 0x01, 0x41, 0x49, +0x8C, 0xA0, 0x80, 0x14, 0xA0, 0x85, 0xFE, 0x8F, +0xA8, 0x85, 0xF0, 0x01, 0x8C, 0x01, 0xF0, 0x81, +0xD5, 0xEB, 0x3D, 0x80, 0x11, 0x3A, 0x3C, 0x30, +0x11, 0x3B, 0x40, 0x21, 0xE2, 0x04, 0x14, 0x29, +0x80, 0x51, 0x3D, 0x90, 0x11, 0x3C, 0x3D, 0x00, +0x11, 0x3D, 0x40, 0x08, 0x66, 0x04, 0x14, 0x09, +0x80, 0x52, 0x3D, 0x10, 0x11, 0x43, 0x3D, 0x20, +0x11, 0x44, 0x40, 0x59, 0x46, 0x04, 0x14, 0x59, +0x80, 0x59, 0x3C, 0xF0, 0x11, 0x45, 0x3C, 0x10, +0x11, 0x46, 0x40, 0x40, 0xBE, 0x04, 0x14, 0x49, +0x80, 0x5A, 0x3D, 0xE0, 0x11, 0x3F, 0x15, 0xE9, +0x80, 0x55, 0x3D, 0x40, 0x11, 0x40, 0x15, 0x49, +0x80, 0x56, 0x3C, 0x10, 0x11, 0x2C, 0x3C, 0x60, +0x0E, 0x84, 0x97, 0x0B, 0x96, 0xF3, 0xE4, 0x6B, +0x3C, 0x4E, 0x07, 0x37, 0x84, 0x00, 0xE9, 0x06, +0x3C, 0x20, 0x0E, 0x84, 0x96, 0x13, 0x5E, 0x00, +0x00, 0x0F, 0x49, 0xFF, 0xDC, 0x45, 0xFC, 0x81, +0x3C, 0x1D, 0xFE, 0x58, 0x04, 0x00, 0x80, 0x0A, +0x66, 0x20, 0x00, 0x01, 0x14, 0x20, 0x80, 0x0A, +0xDD, 0x9E, 0x3C, 0x1C, 0x07, 0x39, 0x3C, 0x3D, +0xFE, 0x58, 0x84, 0x41, 0x94, 0x05, 0xFA, 0x91, +0xA8, 0x8A, 0xA8, 0x1D, 0xB6, 0x83, 0xDD, 0x9E, +0x3C, 0x00, 0x0F, 0x92, 0x3C, 0x3D, 0xFE, 0x58, +0x3C, 0x0C, 0x07, 0x39, 0x84, 0x21, 0xFA, 0x51, +0xA8, 0x42, 0xB6, 0x43, 0xDD, 0x9E, 0x3C, 0x0D, +0xFE, 0x57, 0xA0, 0x47, 0x8E, 0x24, 0x5C, 0x00, +0x80, 0x01, 0xDD, 0x9E, 0x3C, 0x1D, 0xFE, 0x58, +0x84, 0x00, 0x04, 0x20, 0x80, 0x0A, 0x3C, 0x0B, +0xF9, 0xF1, 0x58, 0x31, 0x00, 0x01, 0x14, 0x30, +0x80, 0x0A, 0xDD, 0x9E, 0x3C, 0x1D, 0xFE, 0x58, +0x04, 0x00, 0x80, 0x32, 0x96, 0x84, 0xCA, 0xFD, +0xDD, 0x9E, 0xFC, 0x40, 0x81, 0x00, 0x83, 0x81, +0x80, 0xE2, 0x49, 0xFF, 0xFF, 0xF5, 0x3D, 0x0C, +0x07, 0x39, 0x3C, 0x0D, 0xFE, 0x58, 0x84, 0x80, +0x14, 0x48, 0x00, 0x02, 0x47, 0x40, 0x01, 0x00, +0xA9, 0x05, 0xE0, 0x9C, 0x46, 0xA0, 0x01, 0x00, +0xE8, 0x09, 0x41, 0x5A, 0x10, 0x20, 0x38, 0x14, +0x11, 0x01, 0x12, 0x1A, 0x80, 0x00, 0x8C, 0x81, +0xD5, 0xF5, 0x84, 0xA0, 0x42, 0x1E, 0x14, 0x00, +0x95, 0x09, 0x9D, 0x89, 0x88, 0x8A, 0xC7, 0x2F, +0x3C, 0x20, 0x0E, 0xF4, 0xAC, 0xA0, 0x40, 0x75, +0x18, 0x20, 0x3C, 0x00, 0x0E, 0xF5, 0x81, 0x05, +0x8C, 0x22, 0xAC, 0x38, 0x44, 0x40, 0x00, 0x82, +0x3E, 0x58, 0x1C, 0xE8, 0x3C, 0x60, 0x0E, 0x89, +0x97, 0xF3, 0xE1, 0x07, 0xE8, 0x20, 0x38, 0x32, +0x91, 0x01, 0x41, 0x15, 0x04, 0x20, 0x12, 0x38, +0x80, 0x00, 0x9C, 0x89, 0x9C, 0x21, 0x38, 0x62, +0x81, 0x01, 0x81, 0x21, 0x41, 0x25, 0x08, 0x20, +0x12, 0x69, 0x00, 0x00, 0x9D, 0xE2, 0x8D, 0x22, +0x41, 0x35, 0x24, 0x20, 0x38, 0x32, 0x9D, 0x01, +0x8C, 0x23, 0x12, 0x39, 0x80, 0x00, 0x8D, 0x01, +0x8C, 0x84, 0xD5, 0xE1, 0x40, 0x35, 0x18, 0x20, +0xAD, 0xE0, 0xAD, 0xD8, 0x84, 0x21, 0x14, 0x18, +0x00, 0x02, 0xFC, 0xC0, 0xFC, 0x00, 0x49, 0xFF, +0xFF, 0x8C, 0xC0, 0x15, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x80, 0x20, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x55, +0x96, 0x01, 0x96, 0x83, 0x94, 0x49, 0x3E, 0x08, +0x1C, 0xE8, 0x88, 0x01, 0x80, 0x22, 0x12, 0x10, +0x00, 0x00, 0xD5, 0x15, 0x3C, 0x00, 0x0F, 0x92, +0x3C, 0x0D, 0xFE, 0x58, 0x50, 0x20, 0x00, 0x40, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x94, 0x41, 0x3E, 0x08, 0x1C, 0xE8, +0x88, 0x20, 0x80, 0x02, 0x44, 0x20, 0x00, 0x10, +0x49, 0xFF, 0xD3, 0x6B, 0xFC, 0x80, 0xFC, 0x01, +0x12, 0x0F, 0x80, 0x03, 0x22, 0x0F, 0x80, 0x03, +0x5E, 0x00, 0x01, 0x00, 0xC8, 0x06, 0x44, 0x00, +0x00, 0xFF, 0x12, 0x0F, 0x80, 0x03, 0xD5, 0x09, +0x22, 0x0F, 0x80, 0x03, 0x4E, 0x04, 0x00, 0x06, +0x44, 0x00, 0x00, 0xFF, 0x12, 0x0F, 0x80, 0x03, +0x3C, 0x0D, 0xFE, 0x56, 0x22, 0x1F, 0x80, 0x03, +0xA8, 0x43, 0x3C, 0x0D, 0xFE, 0x56, 0x84, 0x21, +0xA8, 0x44, 0x3C, 0x0D, 0xFE, 0x56, 0x84, 0x20, +0xA8, 0x44, 0x3C, 0x0D, 0xFF, 0xB9, 0x84, 0x20, +0xA8, 0x47, 0xFC, 0x81, 0xFC, 0x20, 0x45, 0x00, +0x00, 0x38, 0x3E, 0x2F, 0xFF, 0x08, 0x3E, 0x48, +0x1C, 0xE8, 0x42, 0x20, 0x40, 0x73, 0x02, 0x32, +0x03, 0x20, 0x02, 0x52, 0x03, 0x20, 0x02, 0x62, +0x03, 0x1F, 0x02, 0x12, 0x00, 0x35, 0xA0, 0x95, +0x96, 0x4B, 0x40, 0x81, 0x05, 0x16, 0x97, 0x5F, +0x54, 0x31, 0x8F, 0x00, 0x42, 0xF4, 0x14, 0x24, +0x90, 0x68, 0x97, 0xB3, 0x42, 0xF3, 0x0C, 0x73, +0x98, 0xEB, 0x40, 0x57, 0x8C, 0xB6, 0x50, 0x70, +0x03, 0xA6, 0x97, 0xAB, 0x38, 0x62, 0x1D, 0x09, +0xFC, 0xA0, 0xFC, 0x60, 0x80, 0xC0, 0x49, 0xFF, +0xFA, 0x19, 0x3C, 0x00, 0x0F, 0xA9, 0x49, 0xFF, +0xFD, 0x30, 0x3C, 0x00, 0x0F, 0x96, 0x49, 0xFF, +0xFD, 0x0C, 0x84, 0x00, 0x49, 0xFF, 0xFC, 0xEB, +0x86, 0x20, 0x3D, 0x9C, 0x07, 0x24, 0x80, 0x11, +0x3C, 0x10, 0x0E, 0x5D, 0xE1, 0xA1, 0xE8, 0x07, +0x41, 0xEC, 0xC4, 0x20, 0x12, 0x0F, 0x00, 0x00, +0x8D, 0xA1, 0xD5, 0xF7, 0xCE, 0x57, 0x3C, 0x00, +0x11, 0x73, 0x49, 0xFF, 0xFC, 0xBA, 0x84, 0x0A, +0x49, 0xFF, 0xFC, 0x98, 0x84, 0xE1, 0x3E, 0xB8, +0x0A, 0x60, 0x3D, 0x40, 0x0E, 0x5F, 0xE0, 0xD4, +0xE8, 0x1A, 0x3D, 0x8D, 0xFC, 0xE8, 0x14, 0x7C, +0x00, 0x58, 0x49, 0xFF, 0xF9, 0xF1, 0x49, 0xFF, +0xF9, 0xE9, 0x49, 0x00, 0x17, 0x24, 0x84, 0x00, +0x49, 0xFF, 0xF7, 0x70, 0x3D, 0x0C, 0x07, 0x24, +0x95, 0x71, 0x89, 0x85, 0x88, 0xAB, 0x22, 0x32, +0x85, 0xA0, 0x12, 0x38, 0x00, 0x00, 0x95, 0xF9, +0x8C, 0xC1, 0xD5, 0xE4, 0x3C, 0x00, 0x11, 0x72, +0x49, 0xFF, 0xFC, 0x93, 0x84, 0x0A, 0x49, 0xFF, +0xFC, 0x71, 0x84, 0xC0, 0x84, 0xE1, 0x3E, 0x88, +0x0A, 0x60, 0x3D, 0x50, 0x0E, 0x5F, 0xE0, 0xD5, +0xE8, 0x53, 0x3D, 0x6D, 0xFC, 0xE8, 0x14, 0x7B, +0x00, 0x58, 0x49, 0xFF, 0xF9, 0xC9, 0x49, 0xFF, +0xF9, 0xC1, 0x49, 0x00, 0x16, 0xFC, 0x84, 0x00, +0x49, 0xFF, 0xF7, 0x48, 0x3C, 0xAC, 0x07, 0x24, +0x94, 0xF1, 0x89, 0x43, 0x02, 0x15, 0x00, 0x00, +0x88, 0x68, 0x23, 0x71, 0x85, 0xA0, 0x96, 0x0B, +0x8A, 0x17, 0x42, 0x20, 0x00, 0x03, 0x97, 0x13, +0x12, 0x45, 0x00, 0x00, 0x95, 0xF9, 0x8C, 0xC1, +0xD5, 0xDD, 0x5A, 0x68, 0x01, 0x32, 0x3C, 0x00, +0x11, 0x73, 0x49, 0xFF, 0xFC, 0x62, 0x46, 0x70, +0x03, 0xE8, 0x84, 0x0A, 0x46, 0x9F, 0xFC, 0x17, +0x49, 0xFF, 0xFC, 0x3C, 0x84, 0xC0, 0x3E, 0xA8, +0x1C, 0xE8, 0x50, 0x73, 0x83, 0xFF, 0x50, 0x84, +0x8C, 0x00, 0x3E, 0xB8, 0x0A, 0x60, 0x3C, 0x00, +0x0E, 0x5E, 0xE0, 0xC0, 0xE9, 0x1C, 0x3C, 0x00, +0x11, 0x72, 0x49, 0xFF, 0xFC, 0x4A, 0x84, 0x0A, +0x49, 0xFF, 0xFC, 0x28, 0x46, 0x20, 0x03, 0xE8, +0x46, 0x3F, 0xFC, 0x17, 0x84, 0xC0, 0x3E, 0xA8, +0x1C, 0xE8, 0x50, 0x71, 0x03, 0xFF, 0x50, 0x81, +0x8C, 0x00, 0x3E, 0xB8, 0x0A, 0x60, 0x3C, 0x40, +0x0E, 0x5E, 0xE0, 0xC4, 0xE9, 0x57, 0x49, 0xFF, +0xFC, 0xAD, 0xFC, 0xE0, 0x41, 0x83, 0x04, 0x0A, +0x97, 0x34, 0x51, 0x9C, 0x02, 0x40, 0xC4, 0x05, +0x38, 0x15, 0x65, 0x01, 0x92, 0x28, 0xD5, 0x04, +0x38, 0x55, 0x65, 0x01, 0x96, 0x68, 0x3D, 0xED, +0xFC, 0xE8, 0x85, 0x80, 0xE6, 0x36, 0x14, 0xCF, +0x00, 0x55, 0x14, 0xCF, 0x00, 0x56, 0x14, 0xCF, +0x00, 0x51, 0x14, 0xCF, 0x00, 0x52, 0xE9, 0x11, +0x3C, 0x20, 0x11, 0x15, 0x53, 0x10, 0x80, 0x1F, +0x45, 0x20, 0x02, 0x00, 0x96, 0x8E, 0x41, 0x39, +0x44, 0x0E, 0xC2, 0x04, 0x15, 0x3F, 0x00, 0x55, +0xD5, 0x19, 0x15, 0x3F, 0x00, 0x56, 0xD5, 0x16, +0x3C, 0x00, 0x11, 0x15, 0x85, 0xA1, 0x96, 0x0E, +0x40, 0x36, 0x84, 0x0C, 0xC0, 0x08, 0x41, 0x01, +0x9C, 0x02, 0x15, 0x0F, 0x00, 0x52, 0x40, 0x31, +0xA0, 0x02, 0xD5, 0x06, 0x40, 0xE1, 0xA0, 0x02, +0x14, 0xEF, 0x00, 0x52, 0xFE, 0xFE, 0x14, 0x3F, +0x00, 0x51, 0x49, 0xFF, 0xF9, 0x39, 0x49, 0xFF, +0xF9, 0x31, 0x49, 0x00, 0x16, 0x6C, 0x84, 0x00, +0x49, 0xFF, 0xF6, 0xB8, 0x3C, 0x9C, 0x07, 0x24, +0x95, 0x31, 0x89, 0x24, 0x88, 0x8B, 0x22, 0x52, +0x05, 0x80, 0x12, 0x54, 0x80, 0x00, 0x8C, 0xC1, +0xD5, 0x8F, 0x40, 0xC3, 0x04, 0x0A, 0x97, 0x74, +0x50, 0xD6, 0x02, 0x40, 0xC5, 0x05, 0x38, 0x35, +0x35, 0x01, 0x92, 0x68, 0xD5, 0x04, 0x38, 0x15, +0x35, 0x01, 0x96, 0xC8, 0x3C, 0xED, 0xFC, 0xE8, +0x86, 0x00, 0xE6, 0x76, 0x15, 0x07, 0x00, 0x55, +0x15, 0x07, 0x00, 0x56, 0x15, 0x07, 0x00, 0x51, +0x15, 0x07, 0x00, 0x52, 0xE9, 0x11, 0x3C, 0x40, +0x11, 0x15, 0x53, 0x41, 0x80, 0x1F, 0x45, 0x50, +0x02, 0x00, 0x97, 0x0E, 0x41, 0x6A, 0xD0, 0x0E, +0xC4, 0x04, 0x15, 0x67, 0x00, 0x55, 0xD5, 0x19, +0x15, 0x67, 0x00, 0x56, 0xD5, 0x16, 0x3C, 0x20, +0x11, 0x15, 0x86, 0x21, 0x96, 0x8E, 0x40, 0x08, +0x8C, 0x0C, 0xC2, 0x08, 0x41, 0x30, 0x1C, 0x02, +0x15, 0x37, 0x00, 0x52, 0x40, 0x00, 0x20, 0x02, +0xD5, 0x06, 0x41, 0x20, 0x20, 0x02, 0x15, 0x27, +0x00, 0x52, 0xFE, 0x3E, 0x14, 0x07, 0x00, 0x51, +0x49, 0xFF, 0xF8, 0xE6, 0x49, 0xFF, 0xF8, 0xDE, +0x49, 0x00, 0x16, 0x19, 0x84, 0x00, 0x49, 0xFF, +0xF6, 0x65, 0x3C, 0x9C, 0x07, 0x24, 0x95, 0x71, +0x89, 0x25, 0x02, 0x14, 0x80, 0x00, 0x88, 0xAB, +0x23, 0x72, 0x85, 0x80, 0x96, 0xCB, 0x8A, 0x77, +0x42, 0x01, 0x80, 0x03, 0x96, 0x83, 0x12, 0x24, +0x80, 0x00, 0x8C, 0xC1, 0x48, 0xFF, 0xFF, 0x4D, +0x2E, 0x07, 0xF3, 0xE4, 0x4E, 0x02, 0x00, 0x9A, +0xFC, 0x60, 0x84, 0x00, 0x84, 0x2C, 0x3E, 0x07, +0xF3, 0xE4, 0x3C, 0x18, 0x0E, 0x84, 0x49, 0xFF, +0xFB, 0xF1, 0x84, 0x00, 0x85, 0x20, 0x80, 0x20, +0x80, 0x40, 0x49, 0xFF, 0xFE, 0x98, 0x80, 0xE9, +0x3D, 0x60, 0x0E, 0x5F, 0x3D, 0x7C, 0x07, 0x24, +0x81, 0x49, 0x87, 0x01, 0xE1, 0x56, 0xE8, 0x1B, +0x41, 0x9B, 0xA8, 0x20, 0x02, 0x6C, 0x80, 0x00, +0x3C, 0x30, 0x11, 0x77, 0x96, 0x73, 0x97, 0x5B, +0xE0, 0xA1, 0xE8, 0x07, 0x41, 0xCC, 0x28, 0x0C, +0x41, 0xEE, 0x24, 0x04, 0x40, 0x9F, 0x00, 0x13, +0x02, 0x4C, 0x80, 0x00, 0x96, 0x23, 0xE0, 0xE0, +0xE8, 0x04, 0x02, 0x7C, 0x80, 0x00, 0x97, 0xFB, +0x8D, 0x41, 0xD5, 0xE5, 0x84, 0x4D, 0x84, 0xC0, +0x3C, 0x28, 0x0E, 0x84, 0x49, 0xFF, 0xFB, 0xC2, +0x3D, 0x40, 0x0E, 0x5E, 0x82, 0x06, 0x86, 0xA1, +0xE1, 0x94, 0xE8, 0x06, 0x40, 0x2A, 0xC0, 0x0C, +0xFF, 0x97, 0x8D, 0x81, 0xD5, 0xFA, 0x85, 0x05, +0x85, 0xC1, 0x84, 0x01, 0x80, 0x20, 0x80, 0x46, +0x49, 0xFF, 0xFE, 0x5D, 0x84, 0x00, 0x3D, 0x00, +0x0E, 0x5E, 0x3C, 0xDC, 0x07, 0x24, 0x82, 0x20, +0xE1, 0xB0, 0xE8, 0x19, 0x41, 0x26, 0xC4, 0x20, +0x02, 0x49, 0x00, 0x00, 0x3C, 0x30, 0x11, 0x95, +0x96, 0xA3, 0x96, 0x5B, 0xE0, 0x41, 0xE8, 0x05, +0x41, 0x37, 0x44, 0x0C, 0x40, 0x63, 0x4C, 0x12, +0x02, 0x59, 0x00, 0x00, 0x97, 0x2B, 0xE0, 0x04, +0xE8, 0x04, 0x02, 0x09, 0x00, 0x00, 0x96, 0x03, +0x8D, 0xA1, 0xD5, 0xE7, 0xC6, 0x04, 0x8F, 0x01, +0x4E, 0x83, 0xFF, 0xD9, 0x85, 0x40, 0x3C, 0xB0, +0x0E, 0x5D, 0x3E, 0x58, 0x0A, 0x60, 0x81, 0x8A, +0xE1, 0x4B, 0xE8, 0x05, 0x38, 0xC2, 0xA9, 0x09, +0x8D, 0x41, 0xD5, 0xFB, 0x84, 0x20, 0x3C, 0x98, +0x05, 0x30, 0x80, 0xA1, 0x84, 0x81, 0x4C, 0x58, +0x00, 0x0E, 0x40, 0x22, 0x14, 0x0C, 0xFE, 0xB6, +0xC2, 0x07, 0x40, 0x82, 0x84, 0x0A, 0x40, 0x32, +0x20, 0x0C, 0xFE, 0x5F, 0x96, 0x49, 0x8C, 0xA1, +0xD5, 0xF3, 0x84, 0x6E, 0x3C, 0x08, 0x05, 0x33, +0x3C, 0x18, 0x05, 0x31, 0x84, 0x01, 0x3C, 0x78, +0x05, 0x32, 0x3C, 0x38, 0x0E, 0x84, 0xFC, 0xE0, +0xDD, 0x9E, 0xFC, 0x00, 0x49, 0xFF, 0xF8, 0x26, +0x49, 0xFF, 0xF8, 0x2A, 0x3C, 0x00, 0x0E, 0x5D, +0x49, 0x00, 0x16, 0x02, 0x49, 0x00, 0x15, 0x23, +0x84, 0x00, 0x49, 0xFF, 0xF5, 0xA7, 0xFC, 0x80, +0x3E, 0x1F, 0xE1, 0x58, 0xAC, 0x08, 0x84, 0x40, +0x84, 0x00, 0xAE, 0x0E, 0xAE, 0x0D, 0xAC, 0x89, +0xDD, 0x9E, 0x3E, 0x0F, 0xED, 0xEC, 0x84, 0x20, +0x3E, 0x28, 0x1C, 0xE8, 0x84, 0x60, 0x84, 0x81, +0x12, 0x31, 0x01, 0x26, 0x14, 0x00, 0x01, 0x60, +0x12, 0x11, 0x01, 0x27, 0x14, 0x10, 0x01, 0x68, +0x14, 0x10, 0x01, 0x61, 0x14, 0x10, 0x00, 0x7A, +0x12, 0x10, 0x02, 0xC5, 0x14, 0x10, 0x00, 0x7B, +0x12, 0x30, 0x00, 0xFC, 0x14, 0x10, 0x00, 0x7C, +0x12, 0x31, 0x01, 0x2A, 0x10, 0x40, 0x05, 0xB1, +0xDD, 0x9E, 0xFC, 0x00, 0x3C, 0x60, 0x0F, 0x73, +0x97, 0xB3, 0xCE, 0x08, 0x3C, 0x3D, 0xFE, 0x58, +0x04, 0x41, 0x80, 0x0A, 0x97, 0x64, 0xCD, 0xFD, +0xD5, 0x0F, 0x3C, 0x0D, 0xFE, 0x58, 0x04, 0x10, +0x00, 0x0A, 0x96, 0x8C, 0xC2, 0x09, 0x44, 0x00, +0x03, 0xE8, 0x8E, 0xC1, 0x49, 0xFF, 0xD1, 0x07, +0xCE, 0xF5, 0x49, 0xFF, 0xFC, 0xAF, 0xFC, 0x80, +0xFC, 0x02, 0xF0, 0x81, 0x80, 0x01, 0x10, 0x0F, +0x80, 0x03, 0xF0, 0x01, 0xC8, 0x0A, 0x2E, 0x07, +0xE1, 0x5D, 0x5A, 0x08, 0x02, 0x04, 0x49, 0xFF, +0xF7, 0xCF, 0x84, 0x00, 0x48, 0x00, 0x00, 0xF2, +0xF0, 0x01, 0x5C, 0x00, 0x05, 0xDC, 0xC0, 0x05, +0x44, 0x00, 0x05, 0xDC, 0x14, 0x0F, 0x80, 0x01, +0x49, 0xFF, 0xF7, 0xBC, 0x49, 0xFF, 0xFF, 0xCB, +0x49, 0xFF, 0xFC, 0xC2, 0x00, 0x0F, 0x80, 0x03, +0xC0, 0x10, 0x3C, 0x00, 0x0F, 0xA8, 0x96, 0x03, +0x96, 0x40, 0x3C, 0x00, 0x0F, 0xAC, 0x96, 0x03, +0x96, 0x80, 0x44, 0x00, 0x00, 0x01, 0x44, 0x30, +0x00, 0xFF, 0x49, 0xFF, 0xF7, 0xE8, 0xD5, 0x17, +0x2E, 0x07, 0xE1, 0x5D, 0x5A, 0x08, 0x01, 0x0E, +0x3C, 0x00, 0x0F, 0xAD, 0x96, 0x03, 0x96, 0xC0, +0x84, 0x01, 0x44, 0x10, 0x00, 0xFF, 0x44, 0x20, +0x00, 0xFF, 0x49, 0xFF, 0xF7, 0xD8, 0xD5, 0x07, +0x84, 0x00, 0x84, 0x20, 0x84, 0x40, 0x84, 0x60, +0x49, 0xFF, 0xF7, 0xD1, 0x3C, 0x0C, 0x07, 0x39, +0x84, 0x21, 0xA8, 0x41, 0x3C, 0x0D, 0xFE, 0x58, +0x84, 0x21, 0x14, 0x10, 0x00, 0x08, 0x3C, 0x0D, +0xFE, 0x58, 0x84, 0x20, 0xA8, 0x42, 0x84, 0x00, +0x3E, 0x07, 0xE1, 0x5F, 0x3C, 0x0D, 0xFC, 0xE8, +0x84, 0x28, 0xA8, 0x44, 0x2E, 0x07, 0xE1, 0x5D, +0x5A, 0x08, 0x02, 0x08, 0x3C, 0x0D, 0xFC, 0xE8, +0x84, 0x21, 0x14, 0x10, 0x00, 0x05, 0xD5, 0x07, +0x3C, 0x0D, 0xFC, 0xE8, 0x44, 0x10, 0xF0, 0x01, +0x14, 0x10, 0x00, 0x05, 0x3C, 0x0D, 0xFC, 0xE8, +0x84, 0x22, 0xA8, 0x41, 0x3C, 0x0D, 0xFC, 0xE8, +0x84, 0x22, 0xA8, 0x42, 0x3C, 0x0D, 0xFE, 0x56, +0x84, 0x20, 0xA8, 0x45, 0x3C, 0x0D, 0xFE, 0x55, +0xF1, 0x01, 0xA8, 0x42, 0x3C, 0x0D, 0xFE, 0x55, +0x84, 0x21, 0x14, 0x10, 0x00, 0x10, 0x3C, 0x0D, +0xFE, 0x55, 0x84, 0x21, 0xB6, 0x20, 0x3C, 0x0D, +0xFE, 0x56, 0x84, 0x21, 0xA8, 0x45, 0x3C, 0x0D, +0xFE, 0x56, 0x84, 0x23, 0xA8, 0x46, 0x3C, 0x0D, +0xFE, 0x56, 0xFA, 0x2B, 0xA8, 0x41, 0x3C, 0x0D, +0xFE, 0x56, 0x44, 0x10, 0x00, 0x83, 0xA8, 0x42, +0x64, 0x00, 0x00, 0x40, 0x3C, 0x0D, 0xFE, 0x56, +0x44, 0x10, 0x00, 0xFF, 0xA8, 0x41, 0x3C, 0x0D, +0xFE, 0x56, 0x44, 0x10, 0x00, 0xFF, 0xA8, 0x42, +0x3C, 0x0D, 0xFE, 0x56, 0x84, 0x20, 0xA8, 0x46, +0x3C, 0x0D, 0xFE, 0x55, 0x84, 0x20, 0xB6, 0x20, +0x3C, 0x0D, 0xFE, 0x55, 0x84, 0x20, 0x14, 0x10, +0x00, 0x10, 0x3C, 0x0D, 0xFE, 0x55, 0x84, 0x21, +0xA8, 0x41, 0x3C, 0x0D, 0xFE, 0x55, 0x84, 0x20, +0xA8, 0x41, 0x3C, 0x0D, 0xFC, 0xE8, 0xB4, 0x00, +0x96, 0x00, 0x96, 0x0E, 0x10, 0x0F, 0x80, 0x0B, +0x49, 0xFF, 0xF7, 0x18, 0x3C, 0x0D, 0xFC, 0xE8, +0x84, 0x20, 0xA8, 0x44, 0x3C, 0x0D, 0xFC, 0xE8, +0x84, 0x20, 0xA8, 0x42, 0x3C, 0x0D, 0xFC, 0xE8, +0x44, 0x10, 0x01, 0x00, 0xA8, 0x45, 0x3C, 0x0D, +0xFC, 0xE8, 0x84, 0x23, 0xA8, 0x41, 0x3C, 0x0D, +0xFC, 0xE8, 0x44, 0x10, 0x00, 0x80, 0xB6, 0x20, +0x00, 0x0F, 0x80, 0x03, 0xC0, 0x08, 0x84, 0x00, +0x84, 0x20, 0x84, 0x40, 0x44, 0x30, 0x00, 0x00, +0x49, 0xFF, 0xF7, 0x39, 0x00, 0x0F, 0x80, 0x0B, +0xC0, 0x06, 0x3C, 0x0D, 0xFE, 0x58, 0xFA, 0x30, +0x14, 0x10, 0x00, 0x02, 0x3C, 0x0D, 0xFE, 0x58, +0x84, 0x20, 0x14, 0x10, 0x00, 0x08, 0x84, 0x00, +0xF0, 0x83, 0xD5, 0x06, 0x40, 0x00, 0x00, 0x09, +0xF0, 0x03, 0x8C, 0x01, 0xF0, 0x83, 0xF0, 0x03, +0x5E, 0x00, 0x00, 0x0A, 0xC8, 0xF8, 0x84, 0x00, +0x3E, 0x07, 0xF3, 0x9E, 0x2E, 0x07, 0xE1, 0x5F, +0xC0, 0x03, 0x84, 0x01, 0xD5, 0x02, 0x84, 0x00, +0xFC, 0x82, 0xFC, 0x00, 0x3C, 0x07, 0xF6, 0x74, +0x4E, 0x07, 0x00, 0x06, 0x49, 0xFF, 0xFE, 0xBF, +0x48, 0x00, 0x00, 0xEA, 0x2E, 0x10, 0x03, 0x22, +0xC9, 0x04, 0x2E, 0x20, 0x03, 0x2C, 0xCA, 0x0D, +0x2E, 0x37, 0xE1, 0x5D, 0x5A, 0x38, 0x01, 0x07, +0x84, 0x00, 0x49, 0xFF, 0xFE, 0xA7, 0x48, 0x00, +0x00, 0xC6, 0x84, 0x80, 0x3C, 0x4B, 0xF0, 0xAD, +0x2E, 0x57, 0xF3, 0xDC, 0xC5, 0x2F, 0x3C, 0x50, +0x0F, 0x93, 0x97, 0xAC, 0xC6, 0x13, 0x2F, 0x37, +0xE1, 0x5D, 0x5B, 0x30, 0x02, 0x10, 0x49, 0xFF, +0xFE, 0x9E, 0x87, 0x80, 0x86, 0x00, 0x87, 0x22, +0x3F, 0x97, 0xE1, 0x5D, 0x3F, 0xC7, 0xF3, 0x9C, +0x3D, 0x0F, 0xFC, 0xE5, 0x3D, 0x0F, 0xFC, 0xE6, +0xD5, 0x21, 0x3C, 0x00, 0x0F, 0x93, 0x97, 0x84, +0xCE, 0x60, 0x3C, 0x50, 0x0F, 0xDB, 0x87, 0x02, +0x96, 0x2B, 0x80, 0x26, 0x3F, 0x87, 0xE1, 0x5D, +0x49, 0xFF, 0xFE, 0xC0, 0xC8, 0x04, 0x84, 0x02, +0x48, 0x00, 0x00, 0xAF, 0x44, 0x00, 0x00, 0x64, +0x49, 0xFF, 0xFE, 0x74, 0x3E, 0x67, 0xF3, 0xDC, +0xD5, 0x09, 0x2E, 0x67, 0xE1, 0x5D, 0x5A, 0x68, +0x02, 0x09, 0x44, 0x00, 0x00, 0x64, 0x49, 0xFF, +0xFE, 0x69, 0x84, 0x01, 0x48, 0x00, 0x00, 0x9D, +0x3C, 0xF0, 0x05, 0x07, 0x54, 0x07, 0xC0, 0x00, +0xC0, 0x3C, 0x3C, 0x10, 0x0E, 0xF2, 0x96, 0x5F, +0xC9, 0x05, 0x84, 0x00, 0x49, 0xFF, 0xFE, 0x5A, +0xD5, 0x34, 0x3C, 0x20, 0x0E, 0xF2, 0x96, 0x9F, +0x5A, 0x28, 0x01, 0x07, 0x3E, 0x27, 0xE1, 0x5D, +0x3C, 0x5B, 0xF0, 0xAD, 0xD5, 0x2A, 0x3C, 0x30, +0x0E, 0xF2, 0x96, 0xDF, 0x5A, 0x38, 0x03, 0x26, +0xCE, 0x1E, 0x3C, 0x50, 0x0E, 0x84, 0x97, 0xAB, +0xE4, 0xC6, 0xE8, 0x04, 0x3C, 0x03, 0xF6, 0x81, +0xC0, 0x05, 0x86, 0x40, 0x3D, 0x2B, 0xF0, 0xAD, +0xD5, 0x18, 0x3C, 0x30, 0x0F, 0x48, 0x3C, 0x17, +0xF0, 0xAD, 0x97, 0x1B, 0x9C, 0x89, 0xE0, 0x81, +0x3C, 0x2B, 0xF0, 0xAD, 0xE8, 0x0E, 0x86, 0x00, +0x86, 0x21, 0x3D, 0x0B, 0xF0, 0xAD, 0x3F, 0x17, +0xE1, 0x5D, 0xD5, 0x07, 0x5A, 0x68, 0x01, 0xEB, +0x3C, 0x43, 0xF6, 0x81, 0xC4, 0xE7, 0xD5, 0xCA, +0x2F, 0x47, 0xE1, 0x5D, 0x5B, 0x48, 0x01, 0x10, +0x3C, 0x20, 0x0F, 0x65, 0x96, 0xD3, 0x4E, 0x37, +0x00, 0x06, 0x3D, 0x60, 0x0F, 0xB6, 0x3D, 0x68, +0x05, 0x0A, 0x3C, 0x40, 0x0F, 0x56, 0x84, 0x20, +0x96, 0x23, 0xD5, 0x17, 0x5B, 0x48, 0x02, 0x33, +0x2F, 0x57, 0xF3, 0x9E, 0x5B, 0x50, 0x01, 0x44, +0x2E, 0x10, 0x03, 0x22, 0x3C, 0x2D, 0xFC, 0xE1, +0xC9, 0x10, 0x2E, 0x30, 0x03, 0x2C, 0xC3, 0x0D, +0xCA, 0x0C, 0x3C, 0x47, 0xF9, 0xC4, 0xCC, 0x09, +0x3C, 0x10, 0x0F, 0xDB, 0x96, 0x0B, 0x84, 0x21, +0x49, 0xFF, 0xFE, 0x40, 0xC8, 0x20, 0xD5, 0x30, +0x8E, 0x41, 0x3C, 0x2F, 0xFC, 0xE1, 0x4E, 0x27, +0x00, 0x05, 0x49, 0xFF, 0xF6, 0x11, 0xD5, 0x27, +0x3C, 0x53, 0xF9, 0xC4, 0x8E, 0xA1, 0x96, 0x2B, +0x3C, 0x0B, 0xF9, 0xC4, 0x4E, 0x06, 0xFF, 0xF7, +0x3C, 0x60, 0x0F, 0xA7, 0x84, 0x20, 0x3C, 0x1F, +0xFC, 0xE1, 0x3C, 0x1B, 0xF9, 0xC4, 0x96, 0x33, +0xD5, 0xE4, 0x3D, 0xE0, 0x0F, 0x65, 0x3D, 0xE8, +0x05, 0x0A, 0xD5, 0x11, 0x2E, 0x07, 0xE1, 0x5D, +0xC0, 0x0F, 0x86, 0xE0, 0x3D, 0x7B, 0xF0, 0xAD, +0x3F, 0x77, 0xF3, 0xDC, 0x5A, 0x08, 0x02, 0x04, +0x48, 0xFF, 0xFF, 0x57, 0x44, 0x00, 0x00, 0x64, +0x49, 0xFF, 0xFD, 0xCC, 0x84, 0x00, 0xFC, 0x80, +0xFC, 0x01, 0x3C, 0x0D, 0xFE, 0x57, 0xA0, 0x47, +0x3C, 0x0D, 0xFE, 0x58, 0x50, 0x00, 0x00, 0x40, +0x80, 0x60, 0x3C, 0x0D, 0xFE, 0x57, 0x50, 0x00, +0x00, 0xA8, 0x80, 0x40, 0x80, 0x01, 0x80, 0x23, +0x49, 0xFF, 0xCE, 0xC2, 0x84, 0x01, 0x3E, 0x07, +0xE1, 0x5F, 0x3C, 0x0D, 0xFE, 0x57, 0xA0, 0x07, +0x4E, 0x02, 0x01, 0xA6, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, +0x04, 0x00, 0x4E, 0x02, 0x01, 0x9D, 0x3C, 0x0D, +0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, 0x96, 0x01, +0x5C, 0x00, 0x00, 0x10, 0x4E, 0x02, 0x00, 0x8C, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5C, 0x10, 0x00, 0x10, 0x4E, 0x12, +0x01, 0x8B, 0x44, 0xF4, 0x80, 0x64, 0x38, 0x07, +0x82, 0x02, 0xDD, 0x00, 0xA4, 0x80, 0x04, 0x00, +0xAA, 0x80, 0x04, 0x00, 0x6C, 0x83, 0x04, 0x00, +0x68, 0x83, 0x04, 0x00, 0xB4, 0x80, 0x04, 0x00, +0xBE, 0x80, 0x04, 0x00, 0xC8, 0x80, 0x04, 0x00, +0xE8, 0x80, 0x04, 0x00, 0x24, 0x81, 0x04, 0x00, +0x50, 0x81, 0x04, 0x00, 0x6C, 0x83, 0x04, 0x00, +0x6C, 0x83, 0x04, 0x00, 0x6C, 0x83, 0x04, 0x00, +0x6C, 0x83, 0x04, 0x00, 0x6C, 0x83, 0x04, 0x00, +0x68, 0x83, 0x04, 0x00, 0x84, 0x02, 0x3E, 0x07, +0xF3, 0xDE, 0x84, 0x00, 0x3E, 0x07, 0xF3, 0xDC, +0x48, 0x00, 0x01, 0x5C, 0x84, 0x01, 0x3E, 0x07, +0xF3, 0xDC, 0x48, 0x00, 0x01, 0x57, 0x84, 0x01, +0x3E, 0x07, 0xF3, 0xDC, 0x48, 0x00, 0x01, 0x52, +0x3C, 0x00, 0x0E, 0x84, 0x96, 0x03, 0x5A, 0x08, +0x07, 0x07, 0x84, 0x03, 0x3E, 0x07, 0xF3, 0xDE, +0x48, 0x00, 0x01, 0x48, 0x44, 0x00, 0x00, 0x01, +0x3E, 0x07, 0xF3, 0xDE, 0x48, 0x00, 0x01, 0x42, +0x49, 0xFF, 0xF5, 0x64, 0x3C, 0x00, 0x0E, 0x8C, +0x96, 0x03, 0x66, 0x00, 0x00, 0x02, 0x96, 0x03, +0x3C, 0x08, 0x0E, 0x8C, 0x84, 0x00, 0x3C, 0x08, +0x0F, 0xA2, 0x49, 0xFF, 0xF4, 0xA2, 0x49, 0xFF, +0xF4, 0xC2, 0x12, 0x0F, 0x80, 0x03, 0x02, 0x0F, +0x80, 0x03, 0xFE, 0x02, 0x96, 0x01, 0x96, 0x03, +0x3C, 0x08, 0x0F, 0xA2, 0x49, 0xFF, 0xF4, 0x95, +0x48, 0x00, 0x01, 0x24, 0x49, 0xFF, 0xF3, 0xAA, +0x84, 0x00, 0x3C, 0x08, 0x0F, 0xA2, 0x49, 0xFF, +0xF4, 0x8C, 0x49, 0xFF, 0xF4, 0xAC, 0x12, 0x0F, +0x80, 0x03, 0x02, 0x0F, 0x80, 0x03, 0xFE, 0x02, +0x96, 0x01, 0x96, 0x03, 0x3C, 0x08, 0x0F, 0xA2, +0x49, 0xFF, 0xF4, 0x7F, 0x48, 0x00, 0x01, 0x0E, +0x44, 0x00, 0x00, 0x01, 0x3E, 0x07, 0xF3, 0xDD, +0x48, 0x00, 0x01, 0x08, 0x49, 0xFF, 0xFA, 0x21, +0xC8, 0x1E, 0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, +0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, 0x00, 0x80, +0xC8, 0x16, 0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, +0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, 0x00, 0xA0, +0xC0, 0x0E, 0x3C, 0x00, 0x0E, 0x8D, 0x96, 0x03, +0x5A, 0x08, 0x01, 0x06, 0x49, 0xFF, 0xFA, 0x7C, +0x48, 0x00, 0x00, 0xEE, 0x49, 0xFF, 0xF9, 0xFA, +0x48, 0x00, 0x00, 0xEA, 0x49, 0xFF, 0xFA, 0x01, +0xC8, 0x20, 0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, +0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, 0x02, 0x00, +0xC8, 0x18, 0x49, 0xFF, 0xF9, 0xF6, 0xC8, 0x15, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5C, 0x00, 0x02, 0x20, 0xC0, 0x0D, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x40, 0x00, 0x00, 0x13, 0x50, 0x00, 0x7E, 0x00, +0x49, 0xFF, 0xF9, 0xCD, 0x48, 0x00, 0x00, 0xC8, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5C, 0x00, 0x04, 0x00, 0x4E, 0x02, +0x00, 0xBF, 0x49, 0xFF, 0xF9, 0xD6, 0xC0, 0x39, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5A, 0x08, 0x10, 0x33, 0x3C, 0x0D, +0xFE, 0x57, 0x02, 0x00, 0x00, 0x55, 0x12, 0x0F, +0x80, 0x03, 0x02, 0x0F, 0x80, 0x03, 0x3C, 0x10, +0x0E, 0x84, 0x96, 0x4B, 0x4C, 0x00, 0x80, 0x06, +0x44, 0x00, 0x00, 0x01, 0x3E, 0x07, 0xF3, 0xE4, +0x49, 0xFF, 0xFA, 0x2E, 0x02, 0x0F, 0x80, 0x03, +0x5C, 0x00, 0x00, 0x06, 0x4E, 0x03, 0x00, 0x9A, +0x02, 0x0F, 0x80, 0x03, 0x5A, 0x08, 0x10, 0x04, +0x48, 0x00, 0x00, 0x94, 0x02, 0x0F, 0x80, 0x03, +0x5A, 0x08, 0x14, 0x04, 0x48, 0x00, 0x00, 0x8E, +0x02, 0x0F, 0x80, 0x03, 0x5A, 0x08, 0x0A, 0x04, +0x48, 0x00, 0x00, 0x88, 0x44, 0x00, 0x00, 0x02, +0x3E, 0x07, 0xF3, 0xDE, 0x48, 0x00, 0x00, 0x82, +0x49, 0xFF, 0xFA, 0x0E, 0x49, 0xFF, 0xF9, 0x99, +0x4E, 0x02, 0x00, 0x7E, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5A, 0x08, +0x60, 0x04, 0x48, 0x00, 0x00, 0x6C, 0x3C, 0x0D, +0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, 0x96, 0x01, +0x5A, 0x08, 0x61, 0x04, 0x48, 0x00, 0x00, 0x63, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5A, 0x08, 0xB0, 0x04, 0x48, 0x00, +0x00, 0x5A, 0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, +0x00, 0x54, 0x96, 0x01, 0x5A, 0x00, 0xF0, 0x53, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5A, 0x01, 0x22, 0x4C, 0x3C, 0x0D, +0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, 0x96, 0x01, +0x5A, 0x01, 0x23, 0x45, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5A, 0x01, +0x25, 0x3E, 0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, +0x00, 0x54, 0x96, 0x01, 0x5A, 0x01, 0x00, 0x37, +0x3C, 0x0D, 0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, +0x96, 0x01, 0x5A, 0x01, 0x06, 0x30, 0x3C, 0x0D, +0xFE, 0x57, 0x02, 0x00, 0x00, 0x54, 0x96, 0x01, +0x5A, 0x01, 0x35, 0x29, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, +0x02, 0x40, 0xC8, 0x09, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, +0x02, 0x5B, 0xC8, 0x18, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, +0x02, 0xA0, 0xC8, 0x09, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5C, 0x00, +0x03, 0x00, 0xC8, 0x08, 0x3C, 0x0D, 0xFE, 0x57, +0x02, 0x00, 0x00, 0x54, 0x96, 0x01, 0x5A, 0x0B, +0x00, 0x0B, 0x44, 0x00, 0x00, 0x02, 0x3E, 0x07, +0xF3, 0xDE, 0x49, 0xFF, 0xF8, 0xFF, 0xD5, 0x03, +0x49, 0xFF, 0xF8, 0xFC, 0xFC, 0x81, 0xFC, 0x00, +0x49, 0xFF, 0xF3, 0xDD, 0x49, 0xFF, 0xF3, 0x7E, +0x84, 0x00, 0x3E, 0x07, 0xE1, 0x4C, 0x84, 0x00, +0x3E, 0x07, 0xE1, 0x4D, 0x84, 0x00, 0x3C, 0x0E, +0x07, 0x2D, 0x84, 0x00, 0x3E, 0x00, 0x1C, 0xB8, +0x84, 0x00, 0x3E, 0x00, 0x1C, 0xB9, 0x84, 0x00, +0x3E, 0x07, 0xF3, 0xDC, 0x84, 0x00, 0x3E, 0x07, +0xE1, 0x5D, 0x3C, 0x00, 0x0E, 0xD4, 0x96, 0x03, +0x4E, 0x06, 0x00, 0x06, 0xFA, 0x10, 0x3C, 0x08, +0x0E, 0xD4, 0xD5, 0x0B, 0x3C, 0x00, 0x0E, 0xD4, +0x96, 0x03, 0x5E, 0x00, 0x00, 0x21, 0xC8, 0x05, +0x44, 0x00, 0x00, 0x20, 0x3C, 0x08, 0x0E, 0xD4, +0x3C, 0x00, 0x0E, 0xD5, 0x96, 0x03, 0x4E, 0x06, +0x00, 0x07, 0x44, 0x00, 0x00, 0x16, 0x3C, 0x08, +0x0E, 0xD5, 0xD5, 0x0B, 0x3C, 0x00, 0x0E, 0xD5, +0x96, 0x03, 0x5E, 0x00, 0x00, 0x17, 0xC8, 0x05, +0x44, 0x00, 0x00, 0x16, 0x3C, 0x08, 0x0E, 0xD5, +0x49, 0xFF, 0xF3, 0x82, 0x84, 0x01, 0x49, 0xFF, +0xF2, 0xA9, 0x3C, 0x00, 0x0F, 0x99, 0x96, 0x03, +0x49, 0xFF, 0xF9, 0x6F, 0x49, 0xFF, 0xF3, 0x8D, +0x3E, 0x0F, 0xF9, 0x64, 0x3C, 0x0E, 0x07, 0x24, +0x3E, 0x0F, 0xF9, 0x64, 0x3C, 0x0E, 0x02, 0x79, +0xFC, 0x80, 0xFC, 0x01, 0x46, 0x10, 0x00, 0x84, +0x58, 0x10, 0x89, 0xD0, 0x46, 0x00, 0x00, 0x80, +0x58, 0x00, 0x00, 0x00, 0x9A, 0x08, 0xF0, 0x81, +0xF1, 0x01, 0x46, 0x00, 0x00, 0x80, 0x58, 0x00, +0x00, 0x00, 0x80, 0x41, 0x84, 0x20, 0x49, 0x00, +0x13, 0x75, 0x49, 0xFF, 0xFF, 0x96, 0xFC, 0x81, +0xFC, 0x00, 0x49, 0xFF, 0xFF, 0xE8, 0xFC, 0x80, +0xFC, 0x6D, 0x3C, 0x00, 0x05, 0x08, 0x97, 0xC4, +0xC7, 0x09, 0x2E, 0x28, 0x03, 0x26, 0xE4, 0x42, +0xE8, 0x15, 0x84, 0x60, 0x3E, 0x30, 0x0A, 0x3D, +0xD5, 0x11, 0x3C, 0x9C, 0x02, 0x7A, 0x3C, 0xDC, +0x02, 0x79, 0x3C, 0x10, 0x0E, 0x5D, 0xE0, 0xE1, +0xE8, 0xF1, 0x40, 0xE6, 0x9C, 0x20, 0x02, 0x67, +0x00, 0x00, 0x38, 0x64, 0x9D, 0x09, 0x8C, 0xE1, +0xD5, 0xF5, 0x44, 0x90, 0x00, 0x64, 0x3E, 0x7F, +0xFF, 0x08, 0x2E, 0x48, 0x1C, 0xC8, 0x2F, 0x18, +0x1C, 0xCA, 0x2F, 0x08, 0x1C, 0xCE, 0x2F, 0xC8, +0x1C, 0xCC, 0x02, 0x5F, 0x80, 0x02, 0x10, 0x4F, +0x80, 0x40, 0x11, 0x1F, 0x80, 0x41, 0x11, 0xCF, +0x80, 0x42, 0x11, 0x0F, 0x80, 0x43, 0x12, 0x5F, +0x80, 0x22, 0x50, 0x6F, 0x80, 0x40, 0x3A, 0x13, +0x08, 0x00, 0x2E, 0x00, 0x03, 0x1D, 0x3C, 0x30, +0x05, 0x0B, 0xF4, 0x84, 0x15, 0x1F, 0x80, 0x03, +0x15, 0x0F, 0x80, 0x02, 0x49, 0x00, 0x12, 0x7D, +0x80, 0xC0, 0x5A, 0x0F, 0xFF, 0x04, 0x48, 0x00, +0x05, 0x03, 0x3C, 0x10, 0x0E, 0x5F, 0xB6, 0x3F, +0x40, 0xA0, 0x05, 0x76, 0x12, 0xAF, 0x80, 0x1A, +0x12, 0xBF, 0x80, 0x1B, 0xF0, 0x0D, 0x49, 0xFF, +0xE9, 0xB2, 0x3C, 0x3C, 0x02, 0x7A, 0xB4, 0x3F, +0x05, 0x0F, 0x80, 0x02, 0x05, 0x1F, 0x80, 0x03, +0xF4, 0x04, 0xC0, 0x1F, 0xE6, 0x03, 0xE8, 0x06, +0x39, 0x21, 0x99, 0x11, 0x3C, 0xC0, 0x05, 0x0C, +0xD5, 0x07, 0xE6, 0x05, 0xE8, 0x08, 0x39, 0x21, +0x99, 0x11, 0x3C, 0xC0, 0x05, 0x0D, 0xE1, 0xCC, +0xE9, 0xB5, 0xD5, 0x0F, 0xE6, 0x07, 0xE8, 0x06, +0x39, 0x21, 0x99, 0x11, 0x3C, 0xC0, 0x05, 0x0E, +0xD5, 0xF7, 0xE6, 0x09, 0xE8, 0x06, 0x39, 0x21, +0x99, 0x11, 0x3C, 0xC0, 0x05, 0x0F, 0xD5, 0xF0, +0x3C, 0x54, 0x01, 0x8C, 0xDE, 0x03, 0x3E, 0x07, +0xF3, 0xB4, 0x3C, 0x00, 0x0E, 0xCA, 0x2E, 0xD0, +0x0A, 0x3D, 0x96, 0x83, 0xB6, 0x5F, 0x5A, 0xD8, +0x01, 0x06, 0x3C, 0x50, 0x0F, 0x39, 0x96, 0x2B, +0xB6, 0x1F, 0x3C, 0x20, 0x10, 0xF4, 0xC2, 0x05, +0x3C, 0x50, 0x10, 0xF1, 0x96, 0x2B, 0xB6, 0x1F, +0x3C, 0xAC, 0x02, 0x79, 0x94, 0xB1, 0x89, 0x42, +0x02, 0x55, 0x00, 0x00, 0x3C, 0x00, 0x0E, 0xC4, +0xF2, 0x82, 0x96, 0xAB, 0x97, 0x43, 0xFF, 0x54, +0x3D, 0x30, 0x05, 0x12, 0x40, 0x22, 0xA4, 0x56, +0x3C, 0x50, 0x0E, 0xC4, 0x96, 0x13, 0x96, 0xAB, +0x42, 0xE9, 0x88, 0x24, 0x41, 0x47, 0x26, 0x96, +0xE0, 0x14, 0xE8, 0x09, 0x3C, 0x00, 0x0E, 0xC4, +0x97, 0x43, 0x43, 0x59, 0x94, 0x24, 0x40, 0x2A, +0xA4, 0x56, 0x96, 0x13, 0x02, 0x55, 0x00, 0x00, +0x3C, 0x20, 0x0E, 0xCC, 0x97, 0x6B, 0x96, 0x93, +0xFE, 0xAC, 0x3D, 0x60, 0x05, 0x0B, 0x40, 0x51, +0x24, 0xB6, 0x96, 0xA9, 0xE2, 0x56, 0x40, 0x2B, +0x3C, 0x1B, 0x97, 0x71, 0xF2, 0x86, 0x40, 0x22, +0x86, 0xF7, 0x41, 0x8B, 0x80, 0x13, 0x54, 0xFC, +0x00, 0xFF, 0x96, 0x91, 0x3D, 0x90, 0x0E, 0x66, +0x3D, 0x30, 0x0E, 0x64, 0x3D, 0x40, 0x0E, 0x65, +0x50, 0x57, 0xFF, 0xFF, 0x40, 0xA1, 0x00, 0x10, +0x3D, 0xE0, 0x0E, 0x67, 0x96, 0x90, 0x86, 0x5E, +0x40, 0xCC, 0xBC, 0x06, 0x43, 0x50, 0xC8, 0x24, +0x41, 0x99, 0x88, 0x06, 0x41, 0x22, 0x80, 0x11, +0x51, 0x31, 0x7F, 0xFF, 0x40, 0x51, 0x50, 0x06, +0x8C, 0x41, 0x41, 0x77, 0xF8, 0x06, 0x40, 0xBC, +0x00, 0x10, 0x96, 0x93, 0x51, 0x87, 0x80, 0x01, +0x40, 0xF9, 0x80, 0x11, 0x14, 0xCF, 0x80, 0x03, +0x41, 0x60, 0x84, 0x08, 0x81, 0xAB, 0x81, 0xCA, +0x15, 0x7F, 0x80, 0x04, 0x41, 0xEC, 0x00, 0x11, +0x15, 0x9F, 0x80, 0x05, 0x14, 0xFF, 0x80, 0x07, +0xF5, 0x88, 0xF2, 0x89, 0x50, 0xCF, 0x80, 0x38, +0xF5, 0x03, 0xC5, 0x28, 0x80, 0x52, 0x43, 0x72, +0x04, 0x24, 0x84, 0xA0, 0x41, 0xCE, 0x00, 0x11, +0x41, 0x82, 0x00, 0x11, 0x41, 0x98, 0x80, 0x11, +0xE0, 0x5C, 0xE9, 0x1A, 0x41, 0x4B, 0x88, 0x00, +0x80, 0xB8, 0x41, 0x41, 0xD0, 0x20, 0x40, 0xFC, +0x94, 0x07, 0xE9, 0x0A, 0x41, 0x4A, 0x58, 0x00, +0x39, 0x3A, 0x54, 0x11, 0xE1, 0xE0, 0xE8, 0x08, +0x8C, 0xA1, 0x97, 0x6B, 0xD5, 0xF5, 0x8C, 0x41, +0x41, 0xC1, 0x00, 0x10, 0xD5, 0x07, 0x8E, 0x41, +0x96, 0x93, 0x84, 0xA2, 0xD5, 0xE6, 0xCD, 0xF8, +0x83, 0x8D, 0xF2, 0x04, 0xC2, 0x28, 0x80, 0x5E, +0x43, 0x72, 0x04, 0x24, 0x84, 0xA0, 0x41, 0x48, +0x00, 0x11, 0x41, 0x82, 0x00, 0x11, 0x41, 0x98, +0x80, 0x11, 0x40, 0xFA, 0x08, 0x07, 0xE9, 0x19, +0x41, 0x0B, 0x88, 0x00, 0x80, 0xB8, 0x41, 0x01, +0xC0, 0x20, 0x40, 0xFC, 0x94, 0x07, 0xE9, 0x09, +0x89, 0x96, 0x39, 0x38, 0x54, 0x11, 0xE1, 0xE0, +0xE8, 0x08, 0x8C, 0xA1, 0x97, 0x6B, 0xD5, 0xF6, +0x8E, 0x41, 0x41, 0x01, 0x00, 0x10, 0xD5, 0x07, +0x8C, 0x41, 0x96, 0x93, 0x84, 0xA2, 0xD5, 0xE6, +0xCD, 0xF8, 0x82, 0x0B, 0xF5, 0x05, 0xC5, 0x24, +0xF2, 0x07, 0x84, 0xA0, 0x41, 0x42, 0x00, 0x11, +0x41, 0x7E, 0x00, 0x11, 0x41, 0x88, 0x00, 0x11, +0xE0, 0x54, 0xE9, 0x18, 0x83, 0x3C, 0x43, 0x91, +0x04, 0x73, 0x80, 0x97, 0x41, 0x91, 0xE4, 0x20, +0x40, 0xFC, 0x10, 0x07, 0xE9, 0x08, 0x2B, 0x3C, +0x80, 0x01, 0xE1, 0xE0, 0xE8, 0x07, 0x8C, 0x81, +0x97, 0x23, 0xD5, 0xF7, 0x9D, 0x11, 0x97, 0x22, +0xD5, 0x07, 0x8E, 0x41, 0x96, 0x93, 0x84, 0xA2, +0xD5, 0xE8, 0xCD, 0xF9, 0x80, 0x8E, 0xF2, 0x08, +0xC2, 0x25, 0xF2, 0x09, 0x84, 0xA0, 0x41, 0x18, +0x80, 0x11, 0x41, 0x7E, 0x00, 0x11, 0x41, 0x88, +0x00, 0x11, 0xE1, 0xA2, 0xE9, 0x19, 0x82, 0x7C, +0x43, 0x31, 0x04, 0x73, 0x80, 0xB7, 0x41, 0x41, +0xCC, 0x20, 0x40, 0xFC, 0x14, 0x07, 0xE9, 0x08, +0x2B, 0x3A, 0x00, 0x01, 0xE1, 0xE0, 0xE8, 0x08, +0x8C, 0xA1, 0x97, 0x6B, 0xD5, 0xF7, 0x8E, 0x41, +0x41, 0x11, 0x00, 0x10, 0xD5, 0x07, 0x8C, 0x41, +0x96, 0x93, 0x84, 0xA2, 0xD5, 0xE7, 0xCD, 0xF8, +0x82, 0x2A, 0x10, 0xEF, 0x80, 0x38, 0x10, 0xAF, +0x80, 0x39, 0x10, 0x4F, 0x80, 0x50, 0x11, 0x1F, +0x80, 0x51, 0x22, 0x26, 0x00, 0x00, 0x22, 0x5F, +0x80, 0x28, 0xD2, 0x09, 0x04, 0x8F, 0x80, 0x01, +0x81, 0x70, 0x81, 0xBC, 0x81, 0x51, 0x81, 0xC4, +0x48, 0xFF, 0xFF, 0x50, 0x10, 0xDF, 0x80, 0x3A, +0x10, 0xBF, 0x80, 0x3B, 0x11, 0xCF, 0x80, 0x52, +0x11, 0x0F, 0x80, 0x53, 0x22, 0x26, 0x00, 0x01, +0x22, 0x5F, 0x80, 0x29, 0xDA, 0xEC, 0x3C, 0x07, +0xF9, 0xEB, 0x4E, 0x05, 0x00, 0x0F, 0x3C, 0x50, +0x05, 0x03, 0xDE, 0x0B, 0x12, 0x8F, 0x80, 0x1E, +0x3A, 0x16, 0x08, 0x00, 0x49, 0xFF, 0xCC, 0xD7, +0x5A, 0x08, 0x01, 0x04, 0x3E, 0x07, 0xF3, 0xD8, +0x40, 0x35, 0x38, 0x01, 0x41, 0x25, 0xB4, 0x01, +0x9C, 0x59, 0x51, 0xC9, 0x00, 0x01, 0x42, 0x0E, +0x04, 0x24, 0x3D, 0x07, 0xF9, 0xD4, 0x97, 0x01, +0xE1, 0x84, 0x10, 0xEF, 0x80, 0x48, 0x10, 0xAF, +0x80, 0x49, 0x10, 0xDF, 0x80, 0x4A, 0x10, 0xBF, +0x80, 0x4B, 0x12, 0x8F, 0x80, 0x26, 0xF1, 0x81, +0xE8, 0x03, 0x3C, 0x4B, 0xF9, 0xD4, 0x3C, 0x20, +0x10, 0xF4, 0x3D, 0x3C, 0x02, 0x7A, 0xC2, 0x03, +0xB4, 0xBF, 0xC5, 0x0C, 0x3C, 0x10, 0x0E, 0xC6, +0x96, 0x0B, 0xE0, 0x60, 0xE8, 0x07, 0x3C, 0x30, +0x0E, 0xC7, 0x96, 0x9B, 0xE1, 0xC2, 0x4E, 0xF3, +0x03, 0x35, 0x84, 0x61, 0x2E, 0x40, 0x03, 0x1D, +0x10, 0xEF, 0x80, 0x58, 0x10, 0xAF, 0x80, 0x59, +0x10, 0xDF, 0x80, 0x5A, 0x10, 0xBF, 0x80, 0x5B, +0x12, 0x8F, 0x80, 0x2E, 0x86, 0x41, 0x86, 0x00, +0x51, 0x1F, 0x80, 0x58, 0xE1, 0x84, 0xE8, 0x2E, +0x41, 0x53, 0xC0, 0x20, 0x23, 0x4A, 0x81, 0xB8, +0x5B, 0x47, 0xFF, 0x27, 0x3A, 0x18, 0x88, 0x00, +0x80, 0x14, 0x15, 0x3F, 0x80, 0x09, 0x15, 0x2F, +0x80, 0x08, 0x15, 0x0F, 0x80, 0x07, 0xF3, 0x85, +0xF4, 0x84, 0x15, 0x1F, 0x80, 0x02, 0x15, 0x4F, +0x80, 0x03, 0x49, 0xFF, 0xCC, 0x7C, 0x05, 0x1F, +0x80, 0x02, 0x05, 0x9F, 0x80, 0x03, 0xF4, 0x04, +0xF3, 0x05, 0x05, 0x0F, 0x80, 0x07, 0x05, 0x2F, +0x80, 0x08, 0x05, 0x3F, 0x80, 0x09, 0x5A, 0x08, +0x01, 0x08, 0x38, 0x09, 0xE5, 0x11, 0xF1, 0x06, +0xE0, 0x01, 0xE9, 0x02, 0x8D, 0xC1, 0x8D, 0x81, +0xD5, 0xD2, 0xCB, 0x06, 0x5B, 0x20, 0x01, 0x05, +0xB4, 0x3F, 0x4E, 0x13, 0x00, 0xD0, 0x3C, 0x10, +0x10, 0xF4, 0x86, 0x00, 0x3F, 0x07, 0xFF, 0x04, +0x97, 0x33, 0x10, 0xEF, 0x80, 0x38, 0x10, 0xAF, +0x80, 0x39, 0x10, 0xDF, 0x80, 0x3A, 0x10, 0xBF, +0x80, 0x3B, 0x12, 0x8F, 0x80, 0x1E, 0xC1, 0x2A, +0x3A, 0x06, 0x04, 0x00, 0xB0, 0x8A, 0xB0, 0xCC, +0x49, 0x00, 0x08, 0x04, 0x3D, 0x90, 0x0E, 0x5F, +0xB0, 0xCB, 0x41, 0x63, 0x66, 0xF6, 0x13, 0x6F, +0x80, 0x18, 0x13, 0x7F, 0x80, 0x19, 0xF2, 0x0C, +0x3A, 0x06, 0x04, 0x00, 0x49, 0x00, 0x06, 0x49, +0x2F, 0x88, 0x03, 0x23, 0x45, 0x00, 0x00, 0x38, +0x81, 0x47, 0x3C, 0x30, 0x0E, 0x5F, 0x3C, 0x40, +0x01, 0xA2, 0x42, 0xAC, 0x40, 0x73, 0x3C, 0x00, +0x01, 0xA3, 0x84, 0x41, 0x42, 0x01, 0x90, 0x73, +0x10, 0x25, 0x00, 0x30, 0x12, 0x05, 0x00, 0x05, +0xD5, 0x37, 0x3A, 0x06, 0x04, 0x00, 0xB0, 0x8A, +0xB0, 0xCC, 0x49, 0x00, 0x07, 0xDB, 0x3A, 0x06, +0x04, 0x00, 0xF2, 0x0C, 0xB0, 0xCB, 0x49, 0x00, +0x06, 0x28, 0x2E, 0xA8, 0x03, 0x23, 0xC8, 0x0D, +0x3C, 0x20, 0x0E, 0xD0, 0xF0, 0x01, 0x96, 0xD3, +0xE0, 0x03, 0xE8, 0x07, 0x3C, 0x50, 0x0E, 0xD1, +0x97, 0x2B, 0x40, 0xFE, 0x10, 0x07, 0xE9, 0x0A, +0x45, 0x30, 0x00, 0x38, 0x82, 0xA7, 0x43, 0x55, +0x4C, 0x73, 0x86, 0x80, 0x11, 0x4A, 0x80, 0x30, +0xD5, 0x13, 0x45, 0xC0, 0x00, 0x38, 0x81, 0x67, +0x3C, 0xD0, 0x0E, 0x5F, 0x3C, 0xE0, 0x01, 0xA2, +0x42, 0xB5, 0x70, 0x73, 0x3C, 0x10, 0x01, 0xA3, +0x42, 0x16, 0xB8, 0x73, 0x86, 0x41, 0x12, 0x15, +0x80, 0x05, 0x11, 0x25, 0x80, 0x30, 0x3C, 0xF0, +0x0E, 0x5F, 0x2F, 0xE8, 0x03, 0x23, 0x40, 0x63, +0x3D, 0xB6, 0x45, 0xC0, 0x00, 0x38, 0x81, 0x67, +0x42, 0xBF, 0x70, 0x73, 0x3E, 0x18, 0x03, 0x4C, +0x50, 0xE6, 0x82, 0xE0, 0x38, 0x50, 0xB9, 0x11, +0x80, 0x0B, 0xA9, 0x47, 0x51, 0x23, 0x02, 0xC0, +0x38, 0x20, 0xC9, 0x11, 0xA8, 0x86, 0x2E, 0x37, +0xE1, 0x62, 0xC3, 0x0C, 0x03, 0x3F, 0x80, 0x14, +0x03, 0x5F, 0x80, 0x15, 0x86, 0x20, 0x13, 0x3F, +0x80, 0x16, 0x13, 0x5F, 0x80, 0x17, 0x11, 0x15, +0x80, 0x30, 0xB0, 0x0B, 0x49, 0x00, 0x05, 0x46, +0x3C, 0x40, 0x10, 0xF4, 0xC4, 0x0B, 0x2F, 0x88, +0x03, 0x23, 0x45, 0x00, 0x00, 0x38, 0x81, 0x47, +0x42, 0xAC, 0x40, 0x73, 0x82, 0xEA, 0xB4, 0x0A, +0xD5, 0x0D, 0xB0, 0x0A, 0x49, 0x00, 0x03, 0xB5, +0x2F, 0x48, 0x03, 0x23, 0x45, 0x90, 0x00, 0x38, +0x82, 0xC7, 0x43, 0x6A, 0x64, 0x73, 0xF0, 0x0A, +0x82, 0xF6, 0x14, 0x0B, 0x80, 0x01, 0x51, 0xEF, +0x80, 0x48, 0x3A, 0x0F, 0x04, 0x00, 0x49, 0x00, +0x05, 0x8F, 0x2E, 0x68, 0x03, 0x23, 0x45, 0xC0, +0x00, 0x38, 0x81, 0x67, 0x42, 0xB3, 0x70, 0x73, +0x8C, 0xC1, 0x96, 0xB2, 0x50, 0x15, 0x80, 0x30, +0x84, 0xA0, 0xE4, 0x4F, 0xAD, 0x4A, 0x3E, 0x20, +0x03, 0x23, 0x4E, 0xF3, 0x02, 0x1F, 0x48, 0x00, +0x02, 0x37, 0xB4, 0x1F, 0x87, 0x81, 0x90, 0x02, +0x3F, 0xC7, 0xFF, 0x04, 0xF0, 0x83, 0x50, 0xCF, +0x80, 0x38, 0x3C, 0x20, 0x0E, 0x5F, 0x96, 0xF1, +0x41, 0x61, 0x88, 0x97, 0x55, 0x2B, 0x00, 0xFF, +0x42, 0x59, 0x08, 0x24, 0x87, 0xDE, 0x96, 0x69, +0xF1, 0x85, 0x8A, 0x22, 0x96, 0x09, 0xF0, 0x84, +0xF3, 0x04, 0x42, 0x31, 0x78, 0x75, 0x97, 0x20, +0x96, 0x59, 0x3D, 0x5C, 0x02, 0x7A, 0x3D, 0x30, +0x0E, 0x5D, 0xF1, 0x88, 0x14, 0xBF, 0x80, 0x02, +0x14, 0xDF, 0x80, 0x01, 0x83, 0x8A, 0x82, 0x0E, +0xF4, 0x87, 0x41, 0x48, 0x00, 0x13, 0x43, 0x7A, +0x08, 0x24, 0x05, 0x1F, 0x80, 0x07, 0x41, 0x9B, +0x80, 0x13, 0x80, 0x31, 0x51, 0xEC, 0xFF, 0xFF, +0xF0, 0x01, 0xE0, 0x01, 0xE8, 0x34, 0x40, 0x30, +0xF8, 0x00, 0x97, 0x19, 0x84, 0x60, 0x82, 0xC3, +0x40, 0x5A, 0x58, 0x00, 0x96, 0x29, 0x40, 0xFE, +0x00, 0x07, 0xE9, 0x1D, 0x9C, 0x21, 0x97, 0x41, +0x38, 0x0A, 0x95, 0x11, 0x51, 0x6B, 0x00, 0x01, +0xC0, 0x04, 0x38, 0x5A, 0x91, 0x11, 0xCD, 0x03, +0xF0, 0x03, 0xD5, 0x0D, 0xE0, 0x05, 0xE8, 0x07, +0x43, 0x80, 0x24, 0x24, 0x40, 0x5C, 0x14, 0xB6, +0x88, 0x65, 0xD5, 0x06, 0x43, 0x72, 0xA4, 0x24, +0x40, 0x0B, 0x80, 0x16, 0x88, 0x60, 0x88, 0x82, +0x97, 0x21, 0xD5, 0xDF, 0x4F, 0x63, 0x00, 0x04, +0x96, 0x4A, 0xD5, 0x0A, 0xB4, 0x9F, 0x42, 0x5B, +0x10, 0x24, 0xE0, 0xA3, 0xE8, 0xFA, 0x8E, 0x21, +0x96, 0x49, 0xD5, 0xCB, 0x80, 0x20, 0x51, 0x9C, +0x80, 0x01, 0xF0, 0x02, 0xE1, 0xA0, 0xE8, 0x3B, +0x40, 0x38, 0xE4, 0x00, 0x84, 0x80, 0x96, 0xD9, +0x83, 0x14, 0x82, 0xC4, 0x40, 0xFE, 0x60, 0x07, +0xE9, 0x23, 0x9E, 0x19, 0xE2, 0x73, 0x97, 0x41, +0xE8, 0x18, 0x38, 0x0A, 0x95, 0x11, 0x51, 0x6B, +0x00, 0x01, 0xC0, 0x04, 0x38, 0x5A, 0x8D, 0x11, +0xCD, 0x03, 0xF0, 0x03, 0xD5, 0x0D, 0xE0, 0x05, +0xE8, 0x07, 0x43, 0x70, 0x24, 0x24, 0x40, 0x5B, +0x94, 0xB6, 0x88, 0x85, 0xD5, 0x06, 0x43, 0xE2, +0xA4, 0x24, 0x40, 0x0F, 0x00, 0x16, 0x88, 0x80, +0x51, 0x8C, 0x00, 0x01, 0x88, 0x62, 0x41, 0x8C, +0x00, 0x13, 0x96, 0xD9, 0xD5, 0xDC, 0x4F, 0x63, +0x00, 0x05, 0x40, 0x08, 0x80, 0x10, 0xD5, 0x0B, +0xB4, 0x1F, 0x42, 0x5B, 0x00, 0x24, 0xE0, 0xA4, +0xE8, 0xF9, 0x51, 0x88, 0x80, 0x01, 0x41, 0x1C, +0x00, 0x13, 0xD5, 0xC4, 0x82, 0x92, 0x86, 0xC0, +0x41, 0xE0, 0x80, 0x13, 0xE1, 0x94, 0xE8, 0x42, +0xF3, 0x04, 0xF4, 0x05, 0x88, 0x76, 0x88, 0x96, +0x41, 0x81, 0x80, 0x13, 0x84, 0x60, 0x82, 0x3E, +0x41, 0x92, 0x00, 0x13, 0x82, 0xE3, 0xE0, 0x11, +0xE9, 0x22, 0x40, 0x58, 0xE4, 0x00, 0x97, 0x29, +0x38, 0x5A, 0x91, 0x11, 0x51, 0x7B, 0x80, 0x01, +0xC5, 0x07, 0x40, 0x48, 0xE0, 0x00, 0x97, 0x21, +0x38, 0x4A, 0x91, 0x11, 0xCC, 0x03, 0xF4, 0x03, +0xD5, 0x07, 0xE0, 0xA4, 0xE8, 0x07, 0x42, 0xF2, +0xA4, 0x24, 0x40, 0x47, 0x90, 0x96, 0x88, 0x64, +0xD5, 0x06, 0x42, 0x42, 0x24, 0x24, 0x40, 0x52, +0x14, 0xB6, 0x88, 0x65, 0x8D, 0xA1, 0x41, 0x18, +0x80, 0x13, 0xD5, 0xDE, 0x4F, 0x73, 0x00, 0x05, +0x40, 0x4A, 0x00, 0x10, 0xD5, 0x10, 0xB4, 0xBF, +0x41, 0x9B, 0x08, 0x01, 0x43, 0x1B, 0x94, 0x24, +0x41, 0x6C, 0x80, 0x13, 0xE1, 0xA3, 0xE8, 0xF5, +0x51, 0x4A, 0x7F, 0xFF, 0x41, 0x4A, 0x00, 0x13, +0xD5, 0xBE, 0x80, 0x90, 0x05, 0x7F, 0x80, 0x08, +0x80, 0xB2, 0x41, 0xE0, 0x80, 0x13, 0xE0, 0xBC, +0xE8, 0x41, 0x41, 0x8B, 0x88, 0x01, 0x86, 0x20, +0x41, 0x9C, 0x00, 0x13, 0x82, 0xDE, 0x83, 0x11, +0xE0, 0x16, 0xE9, 0x28, 0x40, 0x3B, 0x5C, 0x00, +0x96, 0xD9, 0x41, 0x4B, 0x64, 0x00, 0xE2, 0x73, +0x41, 0x4A, 0x00, 0x13, 0xE8, 0x1A, 0x39, 0x4A, +0xD1, 0x11, 0x51, 0x8C, 0x00, 0x01, 0x4F, 0x42, +0x00, 0x05, 0x38, 0x3A, 0x8D, 0x11, 0xCB, 0x03, +0xF3, 0x03, 0xD5, 0x08, 0x40, 0xFA, 0x0C, 0x07, +0xE8, 0x07, 0x42, 0xFA, 0x24, 0x24, 0x40, 0x37, +0x8C, 0x76, 0x89, 0xA3, 0xD5, 0x06, 0x42, 0x31, +0xA4, 0x24, 0x41, 0x41, 0xD2, 0x96, 0x89, 0xB4, +0x51, 0x6B, 0x00, 0x01, 0x41, 0x6B, 0x00, 0x13, +0xD5, 0xD8, 0x4F, 0x83, 0x00, 0x04, 0x97, 0x6A, +0xD5, 0x0E, 0xB4, 0x7F, 0x41, 0x7B, 0x88, 0x00, +0x42, 0x3C, 0x0C, 0x24, 0x41, 0x7B, 0x80, 0x13, +0xE0, 0x71, 0xE8, 0xF6, 0x8C, 0xA1, 0x97, 0x69, +0xD5, 0xBF, 0x80, 0xBC, 0x11, 0x0F, 0x80, 0x38, +0x11, 0xCF, 0x80, 0x39, 0x10, 0x4F, 0x80, 0x60, +0x10, 0x5F, 0x80, 0x61, 0x23, 0xE6, 0x00, 0x00, +0x23, 0x9F, 0x80, 0x30, 0x4D, 0x9F, 0x00, 0x08, +0xF0, 0x82, 0xF1, 0x81, 0x83, 0x85, 0x82, 0x04, +0x48, 0xFF, 0xFE, 0xDD, 0x15, 0x0F, 0x80, 0x09, +0x01, 0x6F, 0x80, 0x08, 0x01, 0x0F, 0x80, 0x04, +0x11, 0x0F, 0x80, 0x3A, 0x11, 0x6F, 0x80, 0x3B, +0x10, 0x1F, 0x80, 0x62, 0x10, 0x0F, 0x80, 0x63, +0x23, 0x46, 0x00, 0x01, 0x23, 0x1F, 0x80, 0x31, +0x4D, 0x1A, 0x7F, 0xE8, 0x12, 0x8F, 0x80, 0x1E, +0x3A, 0x06, 0x04, 0x00, 0xB0, 0x8A, 0xB0, 0xCC, +0x97, 0x33, 0x49, 0x00, 0x05, 0xE3, 0xF2, 0x0C, +0x3A, 0x06, 0x04, 0x00, 0xB0, 0xCB, 0x49, 0x00, +0x04, 0x30, 0x3D, 0x30, 0x0E, 0x5F, 0x2F, 0x28, +0x03, 0x23, 0xF2, 0x09, 0xC8, 0x12, 0x3C, 0x10, +0x0E, 0xD0, 0x40, 0x4E, 0x08, 0x01, 0x96, 0x0B, +0x8C, 0x81, 0xE0, 0x80, 0xE8, 0x0A, 0xF1, 0x02, +0xF0, 0x01, 0x3C, 0x30, 0x0E, 0xD1, 0x8A, 0x20, +0x97, 0x5B, 0x8C, 0x21, 0xE0, 0x25, 0xE9, 0x0A, +0x45, 0x90, 0x00, 0x38, 0x82, 0xC7, 0x43, 0x69, +0x64, 0x73, 0x86, 0x20, 0x11, 0x1B, 0x00, 0x30, +0xD5, 0x11, 0x45, 0x50, 0x00, 0x38, 0x83, 0x07, +0x3D, 0x70, 0x01, 0xA2, 0x43, 0x89, 0x54, 0x73, +0x3C, 0x40, 0x01, 0xA3, 0x42, 0x49, 0xDC, 0x73, +0x87, 0xC1, 0x12, 0x4C, 0x00, 0x05, 0x11, 0xEC, +0x00, 0x30, 0x2E, 0x37, 0xE1, 0x62, 0xC3, 0x11, +0x44, 0x10, 0x00, 0x38, 0x80, 0x07, 0x42, 0x09, +0x04, 0x73, 0x03, 0x0F, 0x80, 0x14, 0x02, 0x5F, +0x80, 0x15, 0x86, 0xA0, 0x13, 0x0F, 0x80, 0x16, +0x12, 0x5F, 0x80, 0x17, 0x11, 0x50, 0x00, 0x30, +0x40, 0x63, 0x4E, 0x76, 0xF2, 0x85, 0x83, 0x07, +0x44, 0x20, 0x00, 0x38, 0x43, 0x89, 0x08, 0x73, +0x3E, 0x48, 0x0A, 0x60, 0x51, 0x29, 0x88, 0xCC, +0x80, 0x18, 0x38, 0x32, 0x49, 0x11, 0xF2, 0x84, +0x51, 0x73, 0x08, 0xAC, 0xA8, 0xC7, 0x38, 0x52, +0x5D, 0x11, 0xA9, 0x46, 0xB0, 0x0B, 0x49, 0x00, +0x03, 0x45, 0xB0, 0x0A, 0x49, 0x00, 0x01, 0xC1, +0xF1, 0x04, 0x2F, 0x98, 0x03, 0x23, 0x82, 0xC7, +0x43, 0x6C, 0x84, 0x73, 0xF0, 0x0A, 0x11, 0xCF, +0x80, 0x39, 0x05, 0x1F, 0x80, 0x05, 0x01, 0xCF, +0x80, 0x04, 0x01, 0x0F, 0x80, 0x08, 0x14, 0x0B, +0x00, 0x01, 0x11, 0x1F, 0x80, 0x38, 0x11, 0xCF, +0x80, 0x3A, 0x11, 0x0F, 0x80, 0x3B, 0x12, 0x8F, +0x80, 0x1E, 0x3A, 0x06, 0x04, 0x00, 0x49, 0x00, +0x03, 0x8F, 0x2E, 0x48, 0x03, 0x23, 0xF2, 0x04, +0x82, 0xA7, 0x43, 0x52, 0x08, 0x73, 0x8C, 0x81, +0x96, 0xE2, 0x51, 0x8A, 0x80, 0x30, 0x84, 0xC0, +0xE4, 0x6F, 0x12, 0x6C, 0x00, 0x02, 0x3E, 0x30, +0x03, 0x23, 0xE8, 0x39, 0x10, 0xEF, 0x80, 0x40, +0x10, 0xAF, 0x80, 0x41, 0x10, 0xDF, 0x80, 0x42, +0x10, 0xBF, 0x80, 0x43, 0x12, 0x8F, 0x80, 0x22, +0x51, 0xEF, 0x80, 0x40, 0x2E, 0x00, 0x03, 0x1D, +0x3A, 0x1F, 0x08, 0x00, 0xF3, 0x06, 0x49, 0x00, +0x0D, 0x9C, 0x80, 0xC0, 0x5A, 0x07, 0xFF, 0x04, +0x48, 0xFF, 0xFD, 0xF5, 0x50, 0xBF, 0x80, 0x48, +0x3A, 0x05, 0x84, 0x00, 0x49, 0x00, 0x03, 0x60, +0x14, 0x8F, 0x80, 0x01, 0x48, 0xFF, 0xFA, 0xEF, +0x3C, 0x50, 0x0E, 0xC8, 0x96, 0x6B, 0xE0, 0x24, +0x4E, 0xF3, 0xFC, 0xC9, 0x3C, 0x00, 0x0E, 0xCB, +0x96, 0xC3, 0xE0, 0x83, 0x4E, 0xF3, 0xFC, 0xC3, +0xF5, 0x02, 0x3C, 0x40, 0x0E, 0xC9, 0x39, 0x59, +0x94, 0x11, 0x96, 0xA3, 0x40, 0x3A, 0x88, 0x07, +0x48, 0xFF, 0xFC, 0xBA, 0x84, 0x00, 0xFC, 0xED, +0x3E, 0x4F, 0xE1, 0x74, 0x5A, 0x08, 0x01, 0x4B, +0xFC, 0x20, 0x99, 0xE1, 0xA7, 0xBC, 0x2E, 0x38, +0x0A, 0x3C, 0x8C, 0xC1, 0x97, 0x72, 0xE0, 0xA3, +0xAF, 0x7C, 0xE9, 0x66, 0xAE, 0xFC, 0x3C, 0x73, +0xF0, 0xBA, 0x40, 0x00, 0x04, 0x0C, 0x2E, 0x80, +0x1C, 0xB9, 0xFE, 0x3F, 0x3C, 0x0B, 0xF0, 0xBA, +0x3E, 0x78, 0x1C, 0xE8, 0x51, 0x00, 0x83, 0x16, +0x5A, 0x88, 0x01, 0x18, 0x3D, 0x10, 0x11, 0x94, +0x3D, 0x30, 0x11, 0x94, 0x3C, 0x30, 0x11, 0x92, +0x55, 0x28, 0x8F, 0x00, 0x40, 0x69, 0x20, 0x0A, +0x96, 0x1B, 0x54, 0x59, 0x80, 0x0F, 0x43, 0x40, +0x18, 0x24, 0x43, 0x41, 0x14, 0x73, 0x88, 0xC5, +0x40, 0x5A, 0x18, 0xB6, 0x97, 0xAB, 0xD5, 0x02, +0x97, 0x93, 0x38, 0x63, 0xC1, 0x09, 0x99, 0xE1, +0x01, 0x63, 0x80, 0x1C, 0x5B, 0x60, 0x01, 0x09, +0x3C, 0x33, 0xED, 0x8C, 0x44, 0x0F, 0x80, 0x00, +0xFE, 0x1F, 0x3C, 0x0B, 0xED, 0x8C, 0x99, 0xA1, +0x86, 0xE1, 0x41, 0x82, 0x04, 0x20, 0x11, 0x73, +0x00, 0x1C, 0x12, 0x2C, 0x00, 0x06, 0x84, 0x01, +0xD5, 0x28, 0x98, 0x21, 0x00, 0x30, 0x00, 0x1C, +0x5A, 0x38, 0x01, 0x12, 0x50, 0x20, 0x80, 0x08, +0x40, 0x51, 0x88, 0x0C, 0x3C, 0x03, 0xF0, 0xBA, +0x3C, 0x33, 0xED, 0x8C, 0x44, 0x2F, 0x80, 0x00, +0xFF, 0x47, 0xFE, 0x9F, 0x3C, 0x5B, 0xF0, 0xBA, +0x3C, 0x2B, 0xED, 0x8C, 0x98, 0xE1, 0x50, 0xF0, +0x83, 0x16, 0x8C, 0x24, 0x84, 0xA0, 0x3E, 0x08, +0x1C, 0xE8, 0x40, 0x12, 0x04, 0x20, 0x38, 0x50, +0x3D, 0x09, 0x10, 0x51, 0x80, 0x1C, 0xAF, 0x5C, +0xAD, 0x4A, 0x84, 0x00, 0xDD, 0x9E, 0x84, 0x00, +0xFC, 0xA0, 0xFC, 0x60, 0x81, 0x80, 0x3C, 0x00, +0x10, 0xF4, 0xC8, 0x02, 0xC1, 0x05, 0x49, 0xFF, +0xD8, 0xA0, 0x48, 0x00, 0x00, 0xB9, 0x3C, 0x20, +0x0F, 0x24, 0x3C, 0x1B, 0xF0, 0xBA, 0x96, 0x13, +0x4E, 0x02, 0x00, 0xB2, 0x3C, 0x30, 0x0F, 0x64, +0x97, 0x1B, 0x4E, 0x44, 0x00, 0xAC, 0x3C, 0x1B, +0xF0, 0xBB, 0x44, 0xA0, 0x00, 0xB6, 0x80, 0xE1, +0x3E, 0xB8, 0x1C, 0xE8, 0x3C, 0x10, 0x0F, 0x24, +0x50, 0x85, 0x7F, 0x4A, 0x97, 0x4B, 0xE1, 0x05, +0x4E, 0xF2, 0x00, 0x9B, 0x3C, 0x60, 0x0F, 0x27, +0x97, 0xB3, 0xCE, 0x44, 0x3D, 0x40, 0x0F, 0x28, +0x3D, 0x60, 0x0E, 0x5F, 0x39, 0x55, 0xA9, 0x01, +0x43, 0x5A, 0x58, 0x73, 0x81, 0x26, 0x40, 0xEA, +0x80, 0x13, 0x81, 0xA6, 0x3C, 0x30, 0x0F, 0x29, +0x97, 0x1B, 0x40, 0xF6, 0x90, 0x07, 0xE8, 0x74, +0x38, 0x55, 0xA9, 0x01, 0x3D, 0x70, 0x0E, 0x5F, +0x96, 0xAB, 0x88, 0x4D, 0xE0, 0x57, 0xE8, 0x6C, +0x40, 0x06, 0xB8, 0x00, 0x41, 0xC6, 0x00, 0x20, +0x02, 0x1E, 0x00, 0x00, 0x3D, 0x80, 0x05, 0x10, +0x96, 0xCB, 0xE0, 0x78, 0xE9, 0x1C, 0x3D, 0x90, +0x05, 0x07, 0x02, 0x4E, 0x00, 0x00, 0x54, 0x2C, +0x81, 0x00, 0x97, 0x63, 0xCA, 0x0A, 0x02, 0x6E, +0x00, 0x00, 0x96, 0x33, 0xE1, 0x20, 0xE8, 0x0E, +0x03, 0xEE, 0x00, 0x00, 0x81, 0x3E, 0xD5, 0x0A, +0x3C, 0x13, 0xF6, 0x81, 0xC9, 0xF5, 0x96, 0x01, +0x96, 0x69, 0x49, 0x00, 0x0C, 0x3A, 0xC0, 0x03, +0xD5, 0xEF, 0x84, 0xC1, 0x50, 0xD6, 0x80, 0x01, +0xD5, 0xCA, 0x84, 0xC0, 0x81, 0x26, 0x81, 0xA6, +0x3C, 0x00, 0x0F, 0x29, 0x96, 0x83, 0x40, 0xF6, +0x88, 0x07, 0xE8, 0x3A, 0x38, 0x35, 0xA9, 0x01, +0x3C, 0xE0, 0x0E, 0x5E, 0x97, 0x1B, 0x88, 0x8D, +0xE0, 0x8E, 0xE8, 0x32, 0x3C, 0x50, 0x0F, 0x28, +0x38, 0x15, 0xA9, 0x01, 0x3D, 0x00, 0x0E, 0x5F, +0x96, 0x0B, 0x88, 0x0D, 0x42, 0x50, 0x40, 0x73, +0x3D, 0x10, 0x05, 0x10, 0x96, 0x29, 0x41, 0xC6, +0x00, 0x20, 0x02, 0x2E, 0x00, 0x00, 0x96, 0xD3, +0xE0, 0x71, 0xE9, 0x1B, 0x3D, 0x20, 0x05, 0x07, +0x02, 0x4E, 0x00, 0x00, 0x54, 0x19, 0x01, 0x00, +0x97, 0x63, 0xC9, 0x0A, 0x02, 0x6E, 0x00, 0x00, +0x96, 0x33, 0xE1, 0x20, 0xE8, 0x0D, 0x03, 0x3E, +0x00, 0x00, 0x81, 0x33, 0xD5, 0x09, 0x3C, 0x23, +0xF6, 0x81, 0xCA, 0xF5, 0x96, 0x69, 0x49, 0x00, +0x0B, 0xF8, 0xC0, 0x03, 0xD5, 0xF0, 0x84, 0xC1, +0x50, 0xD6, 0x80, 0x01, 0xD5, 0xC2, 0x3D, 0x03, +0xF0, 0xBB, 0xE3, 0x89, 0xE8, 0x03, 0x3C, 0x9B, +0xF0, 0xBB, 0x80, 0x06, 0x80, 0x28, 0x80, 0x49, +0x49, 0xFF, 0xFE, 0xD4, 0xFE, 0x3F, 0x97, 0xC0, +0x8D, 0x41, 0x48, 0xFF, 0xFF, 0x61, 0x80, 0x07, +0xD5, 0x02, 0x80, 0x01, 0xFC, 0xE0, 0xFC, 0x20, +0xB4, 0xC0, 0xC1, 0x1D, 0xC6, 0x1C, 0x80, 0xE0, +0x4E, 0x67, 0x00, 0x07, 0x4E, 0x16, 0x00, 0x10, +0xFE, 0x4A, 0xFE, 0x74, 0xD5, 0x05, 0x4E, 0x17, +0x00, 0x0B, 0xFE, 0x32, 0xFE, 0x44, 0x84, 0x4A, +0x40, 0x00, 0x88, 0x16, 0x49, 0xFF, 0xC6, 0x76, +0x9A, 0x30, 0xD5, 0x08, 0xFE, 0x74, 0x84, 0x6A, +0x40, 0x00, 0x8C, 0x16, 0x49, 0xFF, 0xC6, 0x6E, +0x88, 0x06, 0xB6, 0x07, 0xFC, 0xA0, 0xFC, 0x21, +0x80, 0xC0, 0x3C, 0x00, 0x0F, 0x24, 0x96, 0x43, +0x4E, 0x17, 0x00, 0x24, 0x3C, 0x20, 0x0F, 0x64, +0x96, 0xD3, 0x4E, 0x34, 0x00, 0x1F, 0x3C, 0x40, +0x0F, 0x28, 0x97, 0x63, 0xCD, 0x1A, 0x3C, 0x70, +0x0F, 0x27, 0x96, 0x7B, 0xC9, 0x0C, 0x23, 0x03, +0x00, 0x00, 0x5E, 0xF8, 0x00, 0x80, 0xE8, 0x03, +0xAC, 0x70, 0xD5, 0x0F, 0x50, 0x28, 0x7F, 0x80, +0xAC, 0xB0, 0xD5, 0x0B, 0x22, 0x83, 0x00, 0x01, +0x5E, 0xF4, 0x00, 0x80, 0xE8, 0x03, 0xAD, 0x71, +0xD5, 0x04, 0x50, 0x04, 0x7F, 0x80, 0xAC, 0x31, +0x3C, 0x70, 0x0E, 0x62, 0x23, 0x13, 0x00, 0x00, +0xE0, 0xF1, 0xE8, 0x02, 0xAD, 0xF0, 0x3C, 0x30, +0x0E, 0x63, 0x23, 0x23, 0x00, 0x01, 0xE0, 0x72, +0xE8, 0x02, 0xAC, 0xF1, 0x3C, 0x40, 0x0F, 0x60, +0x23, 0x33, 0x00, 0x00, 0x97, 0x63, 0xE1, 0xE5, +0xE8, 0x04, 0x3C, 0x50, 0x0F, 0x60, 0xD5, 0x0A, +0x3C, 0x10, 0x0F, 0x61, 0x96, 0x0B, 0x9A, 0xB8, +0xE0, 0x53, 0xE8, 0x05, 0x3C, 0x40, 0x0F, 0x61, +0x9B, 0x7C, 0xAD, 0x70, 0x3C, 0x10, 0x0F, 0x62, +0x22, 0x83, 0x00, 0x01, 0x96, 0x0B, 0xE1, 0x00, +0xE8, 0x04, 0x3C, 0x00, 0x0F, 0x62, 0xD5, 0x0A, +0x3C, 0x20, 0x0F, 0x63, 0x97, 0x13, 0x9B, 0x5C, +0xE0, 0xA8, 0xE8, 0x05, 0x3C, 0x10, 0x0F, 0x63, +0x9A, 0x19, 0xAC, 0x31, 0x23, 0x03, 0x00, 0x00, +0x5E, 0xF8, 0x00, 0x80, 0xE8, 0x14, 0x3C, 0x20, +0x0F, 0x5F, 0x3C, 0x00, 0x0F, 0x60, 0x96, 0x53, +0x52, 0x28, 0x00, 0x80, 0x52, 0x50, 0x80, 0x80, +0x96, 0x51, 0x97, 0x03, 0xFE, 0x6C, 0x53, 0x72, +0x00, 0x80, 0x41, 0x80, 0xDF, 0x17, 0x52, 0x4C, +0x00, 0x80, 0xD5, 0x19, 0x51, 0x43, 0xFF, 0x81, +0xE1, 0x94, 0xE9, 0x16, 0x3C, 0x20, 0x0F, 0x5F, +0x8B, 0x87, 0x97, 0x53, 0x3C, 0x40, 0x0F, 0x61, +0x50, 0x18, 0x00, 0x80, 0x96, 0x09, 0x52, 0x52, +0x80, 0x80, 0x96, 0xA3, 0xFE, 0x2C, 0x53, 0x51, +0x00, 0x80, 0x40, 0x40, 0x54, 0x97, 0x51, 0x63, +0xFF, 0x80, 0x88, 0x96, 0xAD, 0x30, 0x23, 0x13, +0x00, 0x01, 0x5E, 0xF8, 0x80, 0x80, 0xE8, 0x14, +0x3C, 0x20, 0x0F, 0x5F, 0x3C, 0x00, 0x0F, 0x62, +0x96, 0x53, 0x52, 0x28, 0x80, 0x80, 0x52, 0x50, +0x80, 0x80, 0x96, 0x51, 0x97, 0x03, 0xFE, 0x6C, +0x53, 0x22, 0x00, 0x80, 0x41, 0x30, 0xCA, 0x77, +0x52, 0x49, 0x80, 0x80, 0xD5, 0x19, 0x51, 0x91, +0xFF, 0x81, 0xE1, 0xB9, 0xE9, 0x16, 0x3C, 0x00, +0x0F, 0x5F, 0x8B, 0xA3, 0x97, 0x43, 0x3C, 0x40, +0x0F, 0x63, 0x50, 0x18, 0x80, 0x80, 0x96, 0x09, +0x52, 0x52, 0x80, 0x80, 0x96, 0xA3, 0xFE, 0x2C, +0x53, 0xC1, 0x00, 0x80, 0x40, 0x40, 0x70, 0x97, +0x51, 0xE1, 0xFF, 0x80, 0x88, 0x9E, 0xAD, 0x31, +0x22, 0x03, 0x00, 0x00, 0x40, 0x43, 0x84, 0x09, +0x50, 0x82, 0x7F, 0xE0, 0xE0, 0x08, 0xE8, 0x0C, +0x3C, 0x20, 0x0F, 0x3E, 0xC2, 0x18, 0x3C, 0x10, +0x0F, 0x3E, 0x97, 0x4B, 0x88, 0xA4, 0xFF, 0x44, +0x40, 0x02, 0x90, 0x16, 0xD5, 0x0F, 0x51, 0x02, +0x00, 0x20, 0xE1, 0x80, 0xE8, 0x0C, 0x3C, 0x50, +0x0F, 0x3F, 0xC5, 0x09, 0x3C, 0x20, 0x0F, 0x3F, +0x96, 0x53, 0x9B, 0x61, 0xFE, 0x2C, 0x40, 0x00, +0x10, 0x16, 0xAC, 0x30, 0x22, 0x03, 0x00, 0x01, +0x40, 0x41, 0x84, 0x09, 0x51, 0x42, 0x7F, 0xE0, +0xE0, 0x14, 0xE8, 0x0C, 0x3C, 0x10, 0x0F, 0x40, +0xC1, 0x18, 0x3C, 0x50, 0x0F, 0x40, 0x96, 0xAB, +0x88, 0x44, 0xFE, 0x84, 0x40, 0x01, 0x10, 0x16, +0xD5, 0x0F, 0x51, 0x12, 0x00, 0x20, 0xE1, 0xA0, +0xE8, 0x0C, 0x3C, 0x20, 0x0F, 0x41, 0xC2, 0x09, +0x3C, 0x10, 0x0F, 0x41, 0x97, 0x4B, 0x9A, 0xA5, +0xFE, 0x14, 0x40, 0x00, 0x10, 0x16, 0xAC, 0x31, +0x22, 0x13, 0x00, 0x00, 0x22, 0x03, 0x00, 0x01, +0xAC, 0x30, 0xAC, 0x71, 0x3C, 0x40, 0x0F, 0x34, +0x87, 0x82, 0x97, 0x63, 0xFE, 0x2C, 0x40, 0x30, +0x0C, 0x77, 0x97, 0x1B, 0xAD, 0x30, 0x3C, 0x20, +0x0F, 0x35, 0x96, 0x13, 0xFE, 0x44, 0xB0, 0x01, +0x40, 0x70, 0x9C, 0xF7, 0xAD, 0xF1, 0x3C, 0x10, +0x0F, 0x34, 0x3C, 0x30, 0x0F, 0xC8, 0x97, 0x4B, +0x41, 0x52, 0xF2, 0xB6, 0x96, 0x5B, 0x8A, 0x95, +0xF4, 0x81, 0x49, 0xFF, 0xFE, 0xBA, 0x3C, 0x40, +0x0F, 0x34, 0xF7, 0x01, 0x96, 0xA3, 0x40, 0x01, +0x70, 0x16, 0x88, 0x07, 0x4E, 0x04, 0x00, 0x03, +0x84, 0x00, 0xF0, 0x81, 0x3C, 0x10, 0x0F, 0x34, +0xF3, 0x01, 0x97, 0x4B, 0xE0, 0xA3, 0xE8, 0x05, +0x3C, 0x40, 0x0F, 0x34, 0x96, 0xA3, 0xF2, 0x81, +0xF7, 0x01, 0xAD, 0xF0, 0x3C, 0x00, 0x0F, 0x35, +0x85, 0x02, 0x96, 0x43, 0x22, 0x53, 0x00, 0x01, +0x40, 0x30, 0xA0, 0x76, 0x3C, 0x20, 0x0F, 0xC9, +0x9B, 0x2B, 0xB0, 0x01, 0x96, 0x53, 0xF4, 0x81, +0x49, 0xFF, 0xFE, 0x93, 0x3C, 0x70, 0x0F, 0x35, +0xF1, 0x01, 0x96, 0x3B, 0x40, 0x50, 0x20, 0xB6, +0x88, 0xA1, 0x4E, 0x54, 0x00, 0x03, 0x84, 0xA0, +0xF5, 0x81, 0x3C, 0x30, 0x0F, 0x35, 0xF2, 0x01, +0x97, 0x1B, 0xE0, 0x82, 0xE8, 0x05, 0x3C, 0x70, +0x0F, 0x35, 0x96, 0x3B, 0xF0, 0x81, 0xF5, 0x01, +0xAD, 0x71, 0x3C, 0x10, 0x0F, 0x36, 0x96, 0xCC, +0xC3, 0x06, 0x3C, 0x40, 0x0F, 0x34, 0xA4, 0xB0, +0x8A, 0x82, 0xAD, 0x30, 0x3C, 0x70, 0x0F, 0x36, +0x97, 0xCE, 0xC7, 0x05, 0x3C, 0x00, 0x0F, 0x35, +0x8A, 0x05, 0xAC, 0x31, 0x3C, 0x50, 0x0F, 0x36, +0x97, 0x56, 0xC5, 0x06, 0x22, 0x33, 0x00, 0x00, +0xA4, 0x71, 0xAC, 0x70, 0xAC, 0xF1, 0xFC, 0xA1, +0xFC, 0x61, 0x81, 0x20, 0x49, 0xFF, 0xFE, 0x7D, +0x2E, 0x00, 0x1C, 0xB9, 0x5A, 0x08, 0x01, 0x57, +0x3C, 0x10, 0x11, 0x78, 0xC1, 0x53, 0x44, 0x80, +0x03, 0x23, 0x85, 0x80, 0x3E, 0xD8, 0x1C, 0xE8, +0x44, 0xE0, 0x00, 0x64, 0x3C, 0x20, 0x11, 0x96, +0x96, 0xD3, 0x40, 0xF6, 0x0C, 0x07, 0xE8, 0x46, +0x50, 0xA4, 0x00, 0x01, 0x38, 0x06, 0xA1, 0x01, +0x38, 0x16, 0xA9, 0x01, 0x97, 0xC3, 0x97, 0x8B, +0x22, 0xB4, 0x80, 0x00, 0x23, 0xC4, 0x80, 0x01, +0x12, 0xBF, 0x80, 0x02, 0x13, 0xCF, 0x80, 0x03, +0x12, 0x7F, 0x80, 0x00, 0x12, 0x6F, 0x80, 0x01, +0xB4, 0x1F, 0xF1, 0x01, 0x49, 0xFF, 0xC4, 0xAD, +0x3C, 0x20, 0x11, 0x78, 0x96, 0xD3, 0xE2, 0x03, +0xE8, 0x25, 0x40, 0x45, 0x80, 0x13, 0x9B, 0x67, +0x96, 0x2B, 0x43, 0x00, 0x00, 0x03, 0xE5, 0x83, +0xE9, 0x0B, 0x3C, 0x70, 0x11, 0x79, 0x96, 0x7B, +0xFE, 0x0C, 0x41, 0x10, 0x3A, 0x36, 0x41, 0x22, +0x44, 0x01, 0x13, 0x24, 0x80, 0x00, 0x40, 0x2E, +0x00, 0x13, 0x9B, 0x96, 0x96, 0xF3, 0x43, 0x31, +0x80, 0x03, 0xE5, 0xE3, 0xE9, 0x0B, 0x3C, 0x40, +0x11, 0x79, 0x97, 0x63, 0xFE, 0xEC, 0x41, 0x41, +0xBA, 0x96, 0x41, 0x51, 0x50, 0x01, 0x13, 0x54, +0x80, 0x01, 0x50, 0xC6, 0x00, 0x01, 0x8D, 0x02, +0xD5, 0xB6, 0x2E, 0x48, 0x03, 0x23, 0x44, 0x50, +0x00, 0x38, 0x3E, 0x6F, 0xFF, 0x08, 0x42, 0x62, +0x14, 0x73, 0x3A, 0x74, 0x9C, 0x00, 0x3A, 0x73, +0x1C, 0x20, 0xFC, 0xE1, 0xFC, 0x21, 0x3A, 0x0F, +0x84, 0x20, 0x20, 0x3F, 0x80, 0x02, 0x20, 0x0F, +0x80, 0x00, 0x20, 0x4F, 0x80, 0x01, 0x96, 0x01, +0x20, 0x5F, 0x80, 0x03, 0x3C, 0x6C, 0x02, 0x7A, +0x97, 0xD9, 0x86, 0x00, 0xE0, 0x80, 0xE9, 0x13, +0x3C, 0x80, 0x0E, 0x5F, 0x82, 0x23, 0x43, 0x10, +0x20, 0x73, 0x80, 0x27, 0x41, 0x33, 0x44, 0x20, +0xE0, 0xA1, 0xE9, 0x06, 0x8C, 0x21, 0x1B, 0x09, +0x80, 0x01, 0x96, 0x49, 0xD5, 0xFA, 0x8C, 0x01, +0x96, 0x01, 0xD5, 0xED, 0xFC, 0xA1, 0xFC, 0x73, +0x3C, 0x50, 0x05, 0x06, 0xB1, 0x0C, 0x3A, 0x02, +0x04, 0x20, 0x97, 0x5E, 0x3C, 0x00, 0x0E, 0x64, +0x97, 0xA9, 0x81, 0x83, 0x40, 0x91, 0x00, 0x13, +0x40, 0x71, 0x40, 0x09, 0xF0, 0x84, 0x3C, 0x10, +0x0E, 0x65, 0x3C, 0x20, 0x0E, 0x66, 0x3C, 0x30, +0x0E, 0x67, 0x2E, 0x07, 0xFF, 0x04, 0x20, 0xE2, +0x00, 0x02, 0x20, 0xA2, 0x00, 0x01, 0x85, 0x60, +0x20, 0x42, 0x00, 0x03, 0xF6, 0x83, 0xF1, 0x85, +0xF2, 0x86, 0xF3, 0x87, 0x3C, 0x8C, 0x02, 0x79, +0x3D, 0x20, 0x0E, 0x5F, 0xF0, 0x81, 0x21, 0xCF, +0x80, 0x30, 0xF4, 0x82, 0x50, 0xDF, 0x80, 0x64, +0x80, 0xCB, 0x86, 0xCA, 0x86, 0xEC, 0x12, 0x9F, +0x80, 0x16, 0x12, 0x7F, 0x80, 0x17, 0xF0, 0x0B, +0x15, 0x7F, 0x80, 0x0A, 0x15, 0x6F, 0x80, 0x09, +0x15, 0x2F, 0x80, 0x08, 0x49, 0xFF, 0xE1, 0x17, +0x86, 0x00, 0x05, 0x7F, 0x80, 0x0A, 0x05, 0x6F, +0x80, 0x09, 0x05, 0x2F, 0x80, 0x08, 0x85, 0xE0, +0x38, 0xF6, 0xC1, 0x09, 0x8D, 0x81, 0x5B, 0x08, +0x19, 0xFC, 0x51, 0x34, 0xFF, 0xFE, 0x82, 0x27, +0x43, 0x19, 0xC8, 0x73, 0x84, 0x60, 0x84, 0x5E, +0xF5, 0x04, 0x40, 0x11, 0x24, 0x00, 0xE0, 0x25, +0xE8, 0x06, 0x8C, 0x41, 0x88, 0x72, 0x5A, 0x28, +0x03, 0xF9, 0xD5, 0x22, 0xF4, 0x05, 0xE0, 0x81, +0xE9, 0xF9, 0x43, 0x31, 0x58, 0x24, 0x41, 0x41, +0xC4, 0x00, 0x8D, 0xF4, 0x84, 0x3E, 0x05, 0x5F, +0x80, 0x06, 0x99, 0x4F, 0xE0, 0xB5, 0xE9, 0x10, +0x05, 0x0F, 0x80, 0x07, 0xE1, 0x85, 0xE9, 0x0C, +0x41, 0x80, 0xD0, 0x00, 0x41, 0x94, 0x60, 0x20, +0x40, 0x49, 0x84, 0x20, 0x03, 0xEC, 0x80, 0x00, +0x88, 0x8D, 0x13, 0xE2, 0x00, 0x02, 0x8C, 0x21, +0x5A, 0x18, 0x03, 0xEB, 0xD5, 0xDB, 0xC0, 0x24, +0x12, 0x6F, 0x80, 0x32, 0x12, 0x6F, 0x80, 0x46, +0x12, 0x6F, 0x80, 0x36, 0x12, 0x6F, 0x80, 0x33, +0x12, 0x6F, 0x80, 0x47, 0x12, 0x6F, 0x80, 0x37, +0x12, 0x6F, 0x80, 0x3B, 0x12, 0x6F, 0x80, 0x34, +0x12, 0x6F, 0x80, 0x48, 0x12, 0x6F, 0x80, 0x3C, +0x12, 0x6F, 0x80, 0x40, 0x12, 0x6F, 0x80, 0x35, +0x12, 0x6F, 0x80, 0x49, 0x12, 0x6F, 0x80, 0x41, +0x12, 0x6F, 0x80, 0x45, 0x12, 0x6F, 0x80, 0x4A, +0x80, 0x2D, 0x84, 0xA0, 0xD5, 0x06, 0xF0, 0x03, +0xC8, 0xDC, 0xF3, 0x01, 0xCB, 0xDA, 0xD5, 0xF9, +0x51, 0x40, 0x80, 0x0A, 0x51, 0x1F, 0x80, 0x40, +0x50, 0x40, 0x80, 0x14, 0x80, 0x54, 0x84, 0x60, +0x41, 0x58, 0x94, 0x00, 0x3D, 0x30, 0x0F, 0x49, +0x3D, 0x00, 0x0F, 0x4A, 0x41, 0x89, 0x80, 0x11, +0x22, 0x02, 0x00, 0x01, 0x23, 0x30, 0x80, 0x01, +0x40, 0xF8, 0x00, 0x11, 0x23, 0x01, 0x00, 0x00, +0x89, 0xE0, 0x22, 0x01, 0x00, 0x02, 0x89, 0xF0, +0x23, 0xE1, 0x00, 0x01, 0x88, 0x13, 0x3D, 0x90, +0x0F, 0x4B, 0x42, 0xF7, 0x80, 0x24, 0x42, 0xFC, +0x78, 0x73, 0x23, 0x00, 0x80, 0x00, 0x23, 0x80, +0x80, 0x02, 0x41, 0x1C, 0x80, 0x11, 0x23, 0x92, +0x00, 0x00, 0x23, 0x32, 0x00, 0x02, 0x89, 0x98, +0x89, 0x99, 0x89, 0xF0, 0x42, 0xF8, 0xCC, 0x73, +0x38, 0xFA, 0x8D, 0x0A, 0x8C, 0x62, 0x8C, 0x42, +0x8C, 0x22, 0x8C, 0x82, 0x5A, 0x38, 0x06, 0xD0, +0x8C, 0xAC, 0x80, 0x34, 0x5A, 0x58, 0x24, 0xC2, +0x84, 0x01, 0x84, 0x80, 0x80, 0x40, 0x82, 0x04, +0x51, 0x4F, 0x80, 0x40, 0x43, 0x48, 0x5C, 0x73, +0x84, 0x60, 0x82, 0xB4, 0x41, 0x18, 0x00, 0x11, +0x38, 0x5A, 0x8E, 0x02, 0xE0, 0x85, 0xE8, 0x04, +0x80, 0x11, 0x96, 0x9B, 0x80, 0x85, 0x8C, 0x61, +0x5A, 0x38, 0x03, 0xF8, 0x8D, 0x81, 0x5B, 0x08, +0x03, 0xED, 0x8E, 0x01, 0x8E, 0x41, 0x97, 0x41, +0x96, 0xD1, 0x3C, 0x58, 0x01, 0xA4, 0x3C, 0x38, +0x01, 0xA5, 0x3C, 0x1C, 0x00, 0xD2, 0xC1, 0x1E, +0x3C, 0x00, 0x10, 0xF4, 0xC0, 0x04, 0x5A, 0xB0, +0x01, 0x1A, 0x85, 0x61, 0x89, 0x25, 0x40, 0x94, +0x80, 0x13, 0x88, 0xE3, 0xE1, 0x3C, 0x97, 0xF9, +0xE8, 0x08, 0x41, 0xE4, 0x94, 0x01, 0x8A, 0xE3, +0x40, 0x9F, 0x00, 0x13, 0x97, 0xF9, 0xD5, 0x0A, +0xE0, 0xEE, 0xE9, 0xF8, 0xE1, 0x49, 0xE9, 0xF6, +0xF2, 0x02, 0xE0, 0x47, 0x4E, 0xF2, 0xFF, 0x0D, +0xD5, 0xF1, 0xF4, 0x10, 0xF1, 0x11, 0xF2, 0x12, +0xF0, 0x15, 0x05, 0x8F, 0x80, 0x16, 0xF3, 0x17, +0x88, 0x24, 0xF5, 0x18, 0x88, 0x22, 0x88, 0x78, +0x88, 0x40, 0x88, 0x65, 0xF6, 0x13, 0x88, 0xA2, +0xF2, 0x14, 0x88, 0x86, 0x88, 0x46, 0x88, 0x02, +0x88, 0x01, 0x88, 0x03, 0x84, 0xDE, 0xFE, 0x34, +0x3C, 0x20, 0x0F, 0x44, 0x9B, 0x99, 0x87, 0x23, +0x88, 0x23, 0x82, 0x60, 0x96, 0x93, 0xFE, 0xB4, +0x43, 0x30, 0xE4, 0x73, 0x3C, 0x30, 0x0F, 0x45, +0x40, 0x11, 0x4C, 0x36, 0x88, 0x98, 0xFE, 0x8A, +0x97, 0x9B, 0x9A, 0x6C, 0x99, 0x2C, 0xFF, 0x8C, +0x42, 0x02, 0x64, 0x73, 0x3C, 0x30, 0x0F, 0x44, +0x40, 0x03, 0x00, 0x16, 0x97, 0x9B, 0xFF, 0x42, +0xE0, 0xC2, 0xF2, 0x8E, 0xF5, 0x8F, 0x85, 0x01, +0xE9, 0x07, 0x3C, 0x10, 0x0F, 0x44, 0x97, 0x0B, +0xFE, 0x22, 0x40, 0x81, 0x00, 0x07, 0x3C, 0x20, +0x0F, 0x45, 0x96, 0xD3, 0xE0, 0x65, 0xE9, 0x07, +0x3C, 0x10, 0x0F, 0x44, 0x97, 0x0B, 0xFE, 0x22, +0xE0, 0xA0, 0xE8, 0x03, 0x58, 0x84, 0x00, 0x02, +0x3C, 0x50, 0x0F, 0xC6, 0xB0, 0x0F, 0x96, 0x6B, +0x49, 0xFF, 0xFC, 0x5B, 0x3C, 0x60, 0x0F, 0xC7, +0xB0, 0x0E, 0x96, 0x73, 0x49, 0xFF, 0xFC, 0x55, +0xF2, 0x0E, 0x5E, 0xF1, 0x00, 0x41, 0xE9, 0x04, +0x44, 0x30, 0x00, 0x40, 0xF3, 0x8E, 0xF1, 0x0E, +0x5E, 0xF0, 0xFF, 0xC0, 0xE8, 0x04, 0x44, 0x4F, +0xFF, 0xC0, 0xF4, 0x8E, 0xF0, 0x0F, 0x5E, 0xF0, +0x00, 0x41, 0xE9, 0x04, 0x44, 0x50, 0x00, 0x40, +0xF5, 0x8F, 0xF6, 0x0F, 0x5E, 0xF3, 0x7F, 0xC0, +0xE8, 0x04, 0x44, 0x2F, 0xFF, 0xC0, 0xF2, 0x8F, +0xF3, 0x0E, 0xF1, 0x0F, 0x51, 0x41, 0x80, 0x40, +0x51, 0x10, 0x80, 0x40, 0x41, 0x5A, 0x24, 0xE0, +0x41, 0x08, 0x9C, 0xE0, 0x13, 0x56, 0x00, 0x00, +0x13, 0x06, 0x00, 0x01, 0x80, 0x08, 0x3C, 0x98, +0x01, 0xA2, 0x3C, 0x78, 0x01, 0xA3, 0xFC, 0xF3, +0xFC, 0x7C, 0x3A, 0x0F, 0x84, 0x20, 0x84, 0x00, +0x82, 0x1F, 0x20, 0xCF, 0x80, 0x00, 0x20, 0x8F, +0x80, 0x01, 0x21, 0x4F, 0x80, 0x02, 0x21, 0xEF, +0x80, 0x03, 0x50, 0xAF, 0x80, 0x60, 0x80, 0x20, +0x38, 0x15, 0x02, 0x0A, 0x8C, 0x01, 0x5A, 0x08, +0x20, 0xFD, 0x84, 0xA0, 0x51, 0x3F, 0x80, 0x08, +0x80, 0xC5, 0x38, 0x69, 0x96, 0x0A, 0x8C, 0xA1, +0x5A, 0x58, 0x16, 0xFD, 0x3E, 0x5F, 0xFF, 0x08, +0x2E, 0x98, 0x03, 0x23, 0x44, 0xB0, 0x00, 0x38, +0x82, 0xA5, 0x43, 0x54, 0xAC, 0x73, 0x44, 0xDF, +0x80, 0x00, 0x51, 0xCA, 0x80, 0x10, 0x44, 0xE0, +0x7F, 0xFF, 0x41, 0x96, 0x00, 0x13, 0x14, 0xDE, +0x00, 0x01, 0x14, 0xEA, 0x80, 0x08, 0x3C, 0x60, +0x0E, 0x5F, 0x3C, 0xDC, 0x02, 0x7A, 0x80, 0x19, +0x86, 0x20, 0x41, 0x7A, 0x00, 0x13, 0x50, 0x7A, +0x80, 0x20, 0xE1, 0x00, 0xE9, 0x26, 0x43, 0x80, +0x18, 0x24, 0x80, 0x37, 0x40, 0xFF, 0x04, 0x07, +0xE9, 0x1D, 0x40, 0xBC, 0x04, 0x00, 0x39, 0x26, +0xAD, 0x11, 0x38, 0xB5, 0x02, 0x02, 0x89, 0xB2, +0x89, 0x72, 0x38, 0xB5, 0x02, 0x0A, 0x38, 0xB9, +0x86, 0x02, 0x89, 0x72, 0x38, 0xB9, 0x86, 0x0A, +0x04, 0xBE, 0x00, 0x01, 0xE1, 0x72, 0xE8, 0x03, +0x15, 0x2E, 0x00, 0x01, 0xB5, 0x67, 0xE1, 0xCB, +0xE8, 0x02, 0xB7, 0xC7, 0x8C, 0x21, 0x96, 0x49, +0xD5, 0xE2, 0x8C, 0x01, 0x96, 0x01, 0xD5, 0xDA, +0x3D, 0x64, 0x01, 0x8C, 0x4D, 0x62, 0x40, 0x47, +0x44, 0x40, 0x00, 0x38, 0x3E, 0x0F, 0xFF, 0x08, +0x42, 0x04, 0x90, 0x73, 0xFA, 0x8E, 0xA0, 0x45, +0x41, 0x54, 0x30, 0x01, 0xFE, 0x64, 0x40, 0xBF, +0x50, 0x01, 0x50, 0x7A, 0x80, 0x01, 0x45, 0x70, +0x00, 0x64, 0x50, 0x45, 0x80, 0x01, 0x40, 0x00, +0xDC, 0x16, 0xFF, 0x3C, 0x96, 0x43, 0x97, 0xE3, +0x84, 0x00, 0x41, 0xCA, 0x00, 0x13, 0xE1, 0x19, +0xE9, 0x17, 0x43, 0x2C, 0x98, 0x24, 0x80, 0x9C, +0x40, 0xFF, 0x10, 0x07, 0xE9, 0x0C, 0x40, 0xE9, +0x10, 0x00, 0x39, 0x66, 0xB9, 0x11, 0xE0, 0x36, +0xE8, 0x03, 0x8C, 0x01, 0x96, 0x03, 0x8C, 0x81, +0x97, 0x21, 0xD5, 0xF3, 0x51, 0x8C, 0x80, 0x01, +0x41, 0x9C, 0x00, 0x13, 0xD5, 0xE9, 0x44, 0x10, +0x00, 0x64, 0xFE, 0x0C, 0x50, 0x8A, 0x80, 0x01, +0x40, 0x00, 0x1C, 0x16, 0x50, 0xC5, 0x80, 0x01, +0x97, 0xC3, 0x3C, 0x7B, 0xF9, 0xD9, 0x3C, 0x78, +0x0F, 0xE9, 0x3C, 0x8B, 0xF9, 0xD2, 0x3C, 0xCB, +0xF9, 0xD3, 0x45, 0x20, 0x00, 0x38, 0x42, 0xB4, +0xC8, 0x24, 0x3E, 0x4F, 0xFF, 0x14, 0x82, 0x90, +0x3B, 0x0A, 0x40, 0x04, 0x88, 0x8B, 0x3B, 0x02, +0x40, 0x24, 0x89, 0x65, 0x45, 0x90, 0x7F, 0xFF, +0x02, 0x1A, 0x00, 0x00, 0x84, 0xE0, 0x42, 0x08, +0xE4, 0x01, 0x51, 0xC5, 0x80, 0x20, 0xAC, 0x60, +0x12, 0x05, 0x80, 0x04, 0xBF, 0x81, 0x80, 0x27, +0x38, 0x45, 0x1E, 0x02, 0x04, 0x8E, 0x00, 0x01, +0x8C, 0xE1, 0xE3, 0x04, 0x42, 0x13, 0x90, 0x73, +0xE8, 0x02, 0xBC, 0x81, 0x5A, 0x78, 0x20, 0xF6, +0x44, 0xA0, 0x00, 0x38, 0x83, 0xC5, 0x43, 0xE4, +0xA8, 0x73, 0x85, 0x20, 0x14, 0x9F, 0x00, 0x0A, +0x82, 0xA9, 0x50, 0xDF, 0x00, 0x28, 0x38, 0xB9, +0xA6, 0x02, 0xB5, 0xCD, 0x8D, 0x21, 0xE3, 0xCB, +0x43, 0x54, 0xAC, 0x73, 0xE8, 0x02, 0xB7, 0x6D, +0x5A, 0x98, 0x16, 0xF7, 0x44, 0x70, 0x00, 0x64, +0xFE, 0x7C, 0x43, 0x7A, 0x9C, 0x24, 0x41, 0x30, +0xC6, 0x77, 0x50, 0xE9, 0x80, 0x32, 0x40, 0x07, +0x1C, 0x16, 0x41, 0x1B, 0xC6, 0x37, 0x50, 0x19, +0xFF, 0x9C, 0x8E, 0x01, 0x97, 0x01, 0x50, 0xC8, +0x80, 0x32, 0x94, 0x0F, 0x41, 0x60, 0x1E, 0xD6, +0x40, 0x06, 0x1C, 0x16, 0x50, 0x1B, 0x00, 0x40, +0x8E, 0x01, 0xAD, 0x18, 0xAC, 0x50, 0x96, 0x41, +0xAC, 0x59, 0x50, 0x38, 0xFF, 0x9C, 0x94, 0x1F, +0x41, 0x40, 0x1E, 0x96, 0x50, 0x7A, 0x00, 0x40, +0xAD, 0xD1, 0x2E, 0x28, 0x03, 0x23, 0x45, 0x00, +0x00, 0x38, 0x42, 0x51, 0x40, 0x73, 0x42, 0x12, +0x18, 0x73, 0xAC, 0x6D, 0xFC, 0xFC, 0x3C, 0x30, +0x0E, 0xA1, 0x22, 0x20, 0x00, 0x00, 0x97, 0x1B, +0x88, 0x81, 0xE0, 0x82, 0xE8, 0x05, 0x3D, 0x00, +0x0E, 0xA1, 0x8A, 0x50, 0xD5, 0x12, 0x3C, 0x50, +0x0E, 0xA1, 0x96, 0xEB, 0x9B, 0x0B, 0xE0, 0x44, +0xE8, 0x05, 0x3C, 0x10, 0x0E, 0xA1, 0x88, 0x41, +0xD5, 0x08, 0xE0, 0x22, 0xE8, 0x03, 0x8E, 0x41, +0xD5, 0x04, 0xE0, 0x41, 0xE8, 0x03, 0x8C, 0x41, +0xAC, 0x80, 0xDD, 0x9E, 0x3E, 0x3F, 0xFF, 0x08, +0x44, 0x10, 0x00, 0x38, 0x42, 0x30, 0x04, 0x73, +0x84, 0x40, 0x2E, 0x48, 0x03, 0x23, 0x50, 0x51, +0x00, 0x38, 0x8E, 0x81, 0xE0, 0x04, 0xE8, 0x0E, +0x88, 0x43, 0x98, 0x5D, 0x3B, 0x00, 0xE4, 0x04, +0x3B, 0x01, 0x64, 0x24, 0x3B, 0x00, 0xCC, 0x00, +0x3B, 0x01, 0x4C, 0x20, 0x8C, 0x01, 0x80, 0x45, +0xD5, 0xED, 0x96, 0x22, 0x4E, 0x05, 0x00, 0x05, +0x3E, 0x00, 0x03, 0x23, 0xDD, 0x9E, 0x84, 0x40, +0x3E, 0x20, 0x03, 0x23, 0xDD, 0x9E, 0xFC, 0x60, +0x3E, 0x9F, 0xE1, 0x98, 0x81, 0x40, 0x84, 0xE0, +0x84, 0x00, 0x3E, 0x00, 0x0A, 0x3D, 0x3E, 0x00, +0x03, 0x1C, 0x80, 0xC7, 0x50, 0xB4, 0x80, 0x08, +0x44, 0xC0, 0x00, 0x5C, 0x3C, 0x17, 0xF6, 0x74, +0xC9, 0x17, 0x2E, 0x27, 0xEC, 0xFA, 0xCA, 0x14, +0x80, 0x6B, 0x42, 0x33, 0xB0, 0x73, 0xA1, 0x19, +0x97, 0x64, 0xC5, 0x0E, 0x42, 0x02, 0x18, 0x0B, +0xC0, 0x0B, 0x02, 0x14, 0x80, 0x2C, 0x8E, 0x21, +0x96, 0x8B, 0x12, 0x24, 0x80, 0x2C, 0x4E, 0x27, +0x00, 0x04, 0x8C, 0xC1, 0xD5, 0x04, 0x80, 0x07, +0x49, 0xFF, 0xDE, 0x48, 0x8C, 0xE1, 0x50, 0x94, +0x80, 0x5C, 0x5A, 0x78, 0x0F, 0xE1, 0xC6, 0x07, +0x49, 0xFF, 0xDE, 0x55, 0x3E, 0x60, 0x03, 0x26, +0x80, 0x06, 0xD5, 0x3F, 0x3E, 0x60, 0x03, 0x25, +0x3E, 0x60, 0x03, 0x24, 0x3E, 0x60, 0x03, 0x23, +0x3E, 0x60, 0x03, 0x26, 0x3E, 0x60, 0x03, 0x1C, +0x3C, 0x6B, 0xF6, 0x85, 0x3C, 0x6B, 0xF9, 0xDD, +0x3C, 0x6E, 0x00, 0xCC, 0x3C, 0x6E, 0x00, 0xCD, +0x3E, 0x60, 0x03, 0x38, 0x4E, 0xA3, 0x00, 0x04, +0x3E, 0xA0, 0x03, 0x22, 0x3C, 0xD0, 0x05, 0x11, +0x3C, 0x80, 0x05, 0x12, 0x85, 0xC3, 0x42, 0x86, +0xB8, 0x73, 0x91, 0x02, 0x3C, 0x88, 0x05, 0x11, +0x49, 0xFF, 0xDE, 0x2D, 0x3D, 0x20, 0x10, 0xF4, +0x86, 0x1F, 0x86, 0x20, 0x3D, 0x0B, 0xF9, 0xEB, +0x3F, 0x17, 0xF3, 0xD8, 0x5B, 0x28, 0x03, 0x0E, +0x3C, 0x73, 0xF9, 0xE8, 0x8E, 0xE1, 0x97, 0xBB, +0x3C, 0x6B, 0xF9, 0xE8, 0x4E, 0x66, 0x00, 0x09, +0x85, 0xE0, 0x3C, 0xF8, 0x10, 0xF4, 0xD5, 0x02, +0x85, 0xE0, 0x3C, 0xFB, 0xF9, 0xE8, 0x84, 0x00, +0xFC, 0xE0, 0xFC, 0x60, 0x80, 0xE0, 0x49, 0xFF, +0xCE, 0x86, 0x3C, 0x00, 0x05, 0x09, 0x96, 0x16, +0x4E, 0x02, 0x00, 0xA4, 0x4E, 0x73, 0x00, 0xA2, +0x2E, 0x17, 0xF3, 0xB7, 0xC9, 0x0C, 0x3E, 0x6F, +0xE1, 0xC8, 0x85, 0x60, 0x81, 0x4B, 0x50, 0xC3, +0x7F, 0xD8, 0x44, 0xD0, 0x00, 0x5C, 0x44, 0x90, +0x00, 0x64, 0xD5, 0x0F, 0x3C, 0x20, 0x0F, 0x64, +0x96, 0xA6, 0xCA, 0xF2, 0x48, 0x00, 0x00, 0x8E, +0x42, 0x02, 0x18, 0x0B, 0xC8, 0x0D, 0x8D, 0x41, +0x50, 0x63, 0x00, 0x5C, 0x5A, 0xA0, 0x0F, 0x49, +0x80, 0x6C, 0x42, 0x35, 0x34, 0x73, 0xA1, 0x19, +0x97, 0x64, 0xC5, 0xF6, 0xD5, 0xF2, 0x84, 0x21, +0x54, 0x05, 0x00, 0xFF, 0x49, 0xFF, 0xCE, 0xF3, +0xB4, 0x06, 0xA0, 0x76, 0x40, 0x50, 0x24, 0xB6, +0x40, 0x20, 0xA4, 0x56, 0x2E, 0x80, 0x03, 0x23, +0xDA, 0x08, 0xA0, 0xF1, 0xA1, 0x37, 0x40, 0x51, +0xA4, 0xB6, 0x40, 0x22, 0x24, 0x56, 0xD2, 0x28, +0x3C, 0x40, 0x0E, 0xD8, 0xA1, 0x73, 0x96, 0xA3, +0xE0, 0xA2, 0xA0, 0xF1, 0x05, 0x03, 0x00, 0x07, +0xE9, 0x17, 0x8A, 0x70, 0x8A, 0x01, 0x42, 0xE1, +0x80, 0x03, 0x43, 0x10, 0x00, 0x03, 0x89, 0xAE, +0x3C, 0x10, 0x0E, 0xD8, 0x41, 0x28, 0xA6, 0x56, +0x96, 0xCB, 0xE1, 0xC3, 0xE9, 0x09, 0x3C, 0x40, +0x0F, 0xEC, 0x96, 0xA3, 0xFE, 0xAC, 0x41, 0x31, +0x26, 0x76, 0xE1, 0xF2, 0xE9, 0x08, 0x51, 0x43, +0x00, 0x18, 0x3B, 0x03, 0x44, 0x00, 0x3B, 0x0A, +0x44, 0x20, 0xD5, 0x02, 0x85, 0x61, 0x8D, 0x01, +0x3E, 0x80, 0x03, 0x23, 0xD5, 0xB5, 0x2F, 0x58, +0x03, 0x23, 0x4F, 0x57, 0x00, 0x3B, 0x5A, 0xB8, +0x01, 0x39, 0x49, 0xFF, 0xDD, 0x9C, 0x2E, 0x77, +0xF3, 0xB7, 0xC7, 0x0E, 0x3C, 0x60, 0x0F, 0x64, +0x97, 0xA6, 0xC6, 0x0A, 0x2E, 0x27, 0xF3, 0xB9, +0xC2, 0x09, 0x3C, 0xA3, 0xED, 0x8C, 0x59, 0xE5, +0x00, 0x20, 0x3D, 0xEB, 0xED, 0x8C, 0x85, 0x20, +0xD5, 0x09, 0x2E, 0x57, 0xF3, 0xB8, 0xC5, 0xFC, +0x3D, 0x93, 0xED, 0x8C, 0x59, 0xEC, 0x80, 0x10, +0xD5, 0xF5, 0x80, 0x09, 0x8D, 0x21, 0x49, 0xFF, +0xDD, 0x69, 0x5A, 0x98, 0x0F, 0xFC, 0x85, 0x80, +0x85, 0xE0, 0x85, 0xA0, 0x3E, 0xC0, 0x03, 0x26, +0x3E, 0xC0, 0x03, 0x23, 0x3E, 0xC0, 0x03, 0x22, +0x3C, 0xFB, 0xF6, 0x85, 0x3C, 0xFB, 0xF9, 0xDD, +0x3C, 0xDE, 0x00, 0xCC, 0x3C, 0xDE, 0x00, 0xCD, +0x3E, 0xF0, 0x03, 0x38, 0x48, 0x00, 0x00, 0xA5, +0x86, 0xC0, 0x80, 0x07, 0x3F, 0x60, 0x03, 0x23, +0x49, 0xFF, 0xFE, 0xDB, 0x4E, 0x06, 0x00, 0x9D, +0x3C, 0x70, 0x05, 0x06, 0x97, 0xCE, 0xCF, 0x6E, +0x3C, 0x50, 0x0E, 0x9D, 0x3D, 0x70, 0x0E, 0x4C, +0x96, 0x2B, 0xE0, 0x17, 0xE9, 0x04, 0x2E, 0x60, +0x03, 0x22, 0xC6, 0x05, 0x86, 0x40, 0x3D, 0x2B, +0xF6, 0x78, 0xD5, 0x60, 0x3C, 0x13, 0xF6, 0x78, +0x3C, 0x40, 0x0E, 0x9F, 0x8C, 0x21, 0x96, 0xC9, +0x96, 0xA3, 0xE0, 0x43, 0x3C, 0x3B, 0xF6, 0x78, +0xE8, 0x2D, 0x3E, 0x7F, 0xE6, 0xFC, 0x3F, 0xC8, +0x0A, 0x60, 0x3D, 0x80, 0x0E, 0x60, 0xE0, 0xD8, +0xE8, 0x0D, 0x50, 0x53, 0x02, 0xC0, 0x94, 0x29, +0x41, 0x1E, 0x00, 0x00, 0x22, 0x18, 0x85, 0xEC, +0x88, 0x07, 0x49, 0xFF, 0xFE, 0x66, 0x8C, 0xC1, +0xD5, 0xF1, 0x85, 0x00, 0x3E, 0x6F, 0xE6, 0xFC, +0x3E, 0xE8, 0x0A, 0x60, 0x3D, 0x90, 0x0E, 0x61, +0xE1, 0x19, 0xE8, 0x0D, 0x50, 0x24, 0x02, 0xE0, +0x94, 0x11, 0x41, 0x07, 0x00, 0x00, 0x22, 0x18, +0x05, 0xEC, 0x88, 0x06, 0x49, 0xFF, 0xFE, 0x51, +0x8D, 0x01, 0xD5, 0xF1, 0x87, 0xC0, 0x3D, 0xEB, +0xF6, 0x78, 0x3C, 0x50, 0x05, 0x06, 0x97, 0x66, +0xC5, 0x04, 0x2E, 0x07, 0xF3, 0xC3, 0xC8, 0xBF, +0x3C, 0x63, 0xF6, 0x76, 0x3C, 0x10, 0x0E, 0x9F, +0x8C, 0xC1, 0x96, 0xF1, 0x97, 0x0B, 0xE0, 0x83, +0x3C, 0x3B, 0xF6, 0x76, 0xE8, 0x17, 0x84, 0xC0, +0x3E, 0x7F, 0xE6, 0xFC, 0x3E, 0xA8, 0x0A, 0x60, +0x3C, 0xC0, 0x0E, 0x5D, 0xE0, 0xCC, 0xE8, 0x0B, +0x94, 0x31, 0x40, 0x90, 0x28, 0x00, 0x22, 0x14, +0x85, 0xEC, 0x88, 0x07, 0x49, 0xFF, 0xFE, 0x29, +0x8C, 0xC1, 0xD5, 0xF3, 0x85, 0xA0, 0x3C, 0xDB, +0xF6, 0x76, 0x2E, 0x07, 0xF3, 0xB7, 0x86, 0x60, +0x3F, 0x30, 0x03, 0x26, 0xC0, 0x1D, 0x3C, 0x30, +0x0F, 0x64, 0x96, 0xE6, 0xC3, 0x12, 0x2E, 0x17, +0xF3, 0xB9, 0xC1, 0x06, 0x3D, 0x53, 0xED, 0x8C, +0x59, 0x4A, 0x80, 0x20, 0xD5, 0x08, 0x2E, 0x47, +0xF3, 0xB8, 0xC4, 0x07, 0x3C, 0xB3, 0xED, 0x8C, +0x59, 0x45, 0x80, 0x10, 0x3D, 0x4B, 0xED, 0x8C, +0x3D, 0x60, 0x0E, 0xB5, 0x86, 0xE0, 0x3D, 0x6B, +0xF9, 0xD8, 0x3F, 0x77, 0xF3, 0xB7, 0x87, 0x80, +0x87, 0x00, 0x3F, 0xC7, 0xF3, 0xB9, 0x3F, 0xC7, +0xF3, 0xB8, 0x3D, 0x8B, 0xF9, 0xDE, 0xFC, 0xE0, +0x84, 0x00, 0x3C, 0x08, 0x0E, 0x64, 0x3C, 0x10, +0x0E, 0x5E, 0x3C, 0x08, 0x0E, 0x66, 0x3C, 0x00, +0x0E, 0x5F, 0x3C, 0x40, 0x0F, 0x24, 0x9E, 0x89, +0x9E, 0xC1, 0x3C, 0x28, 0x0E, 0x65, 0x3C, 0x38, +0x0E, 0x67, 0xC4, 0x06, 0x3C, 0x50, 0x0F, 0x64, +0x96, 0xAB, 0x4E, 0x25, 0x00, 0x06, 0x94, 0x8F, +0x3C, 0x28, 0x0E, 0x62, 0xD5, 0x28, 0x3C, 0x30, +0x0F, 0x27, 0xCB, 0x0C, 0x3C, 0x00, 0x0F, 0x28, +0xC8, 0x05, 0x86, 0x01, 0x3D, 0x08, 0x0E, 0x64, +0xD5, 0x0F, 0x8E, 0x22, 0x3C, 0x18, 0x0E, 0x65, +0xD5, 0x0B, 0x3C, 0x10, 0x0F, 0x28, 0xC9, 0x05, +0x85, 0xE1, 0x3C, 0xF8, 0x0E, 0x66, 0xD5, 0x04, +0x8E, 0x02, 0x3C, 0x08, 0x0E, 0x67, 0x3C, 0x40, +0x0E, 0x65, 0x3D, 0x10, 0x0E, 0x64, 0x8C, 0x81, +0x3C, 0x00, 0x0E, 0x67, 0x8A, 0x91, 0x3D, 0x20, +0x0E, 0x66, 0x95, 0x67, 0x8C, 0x01, 0x3C, 0x58, +0x0E, 0x62, 0x8A, 0x12, 0x94, 0xC7, 0x3C, 0x38, +0x0E, 0x63, 0xDD, 0x9E, 0x3C, 0x00, 0x0E, 0x94, +0x84, 0x40, 0x3C, 0x10, 0x0E, 0xAF, 0x3C, 0x30, +0x0E, 0x95, 0x3C, 0x40, 0x0E, 0x97, 0x3C, 0x50, +0x0E, 0x96, 0x3C, 0xF0, 0x0E, 0x98, 0x3D, 0x00, +0x0F, 0x26, 0x3D, 0x10, 0x0E, 0xB7, 0x3D, 0x20, +0x0E, 0xB8, 0x3D, 0x30, 0x0F, 0x25, 0x3D, 0x40, +0x0F, 0x37, 0x3D, 0x50, 0x0E, 0xA7, 0x3D, 0x60, +0x0E, 0xAB, 0x3D, 0x70, 0x0E, 0xA8, 0x3D, 0x80, +0x0F, 0x3A, 0x3D, 0x90, 0x0E, 0xA4, 0x3C, 0x08, +0x05, 0x12, 0x3E, 0x20, 0x0A, 0x3B, 0x3C, 0x38, +0x05, 0x13, 0x3C, 0x48, 0x05, 0x14, 0x3C, 0x58, +0x05, 0x15, 0x3C, 0xF8, 0x05, 0x16, 0x3D, 0x08, +0x05, 0x17, 0x3E, 0x10, 0x0A, 0x3A, 0x3D, 0x18, +0x05, 0x1B, 0x3D, 0x28, 0x05, 0x1C, 0x3F, 0x30, +0x0A, 0x3C, 0x3D, 0x48, 0x05, 0x1F, 0x3D, 0x58, +0x05, 0x20, 0x3D, 0x68, 0x05, 0x21, 0x3D, 0x78, +0x05, 0x22, 0x3D, 0x88, 0x05, 0x23, 0x3D, 0x98, +0x05, 0x24, 0x3C, 0x10, 0x0E, 0xB6, 0x2F, 0x07, +0xE1, 0x5D, 0x3C, 0x20, 0x0F, 0xC1, 0x3C, 0x08, +0x05, 0x2A, 0x3C, 0x30, 0x0E, 0xB0, 0x3C, 0x08, +0x05, 0x2B, 0x3C, 0x40, 0x10, 0xD4, 0x3C, 0x08, +0x05, 0x2C, 0x3C, 0x50, 0x0E, 0xB1, 0x84, 0x00, +0x3C, 0xF0, 0x0E, 0x89, 0x3C, 0x18, 0x05, 0x2F, +0x3C, 0x28, 0x05, 0x25, 0x3C, 0x38, 0x05, 0x26, +0x3C, 0x48, 0x05, 0x27, 0x3C, 0x58, 0x05, 0x29, +0x3C, 0x08, 0x05, 0x2D, 0x3C, 0xF8, 0x05, 0x2E, +0x5B, 0x00, 0x02, 0x21, 0x2E, 0x17, 0xE1, 0x60, +0xC1, 0x1D, 0x3D, 0x10, 0x10, 0xA0, 0x3D, 0x20, +0x10, 0xA1, 0x3D, 0x30, 0x10, 0xAF, 0x3D, 0x40, +0x10, 0x9A, 0x3D, 0x50, 0x0F, 0xE8, 0x3D, 0x18, +0x05, 0x2A, 0x3D, 0x28, 0x05, 0x2B, 0x3D, 0x38, +0x05, 0x2F, 0x3D, 0x48, 0x05, 0x16, 0x3D, 0x48, +0x05, 0x15, 0x3D, 0x48, 0x05, 0x14, 0x3D, 0x48, +0x05, 0x13, 0x3D, 0x48, 0x05, 0x12, 0x3D, 0x58, +0x05, 0x17, 0x3C, 0x20, 0x05, 0x09, 0x96, 0xAE, +0xC2, 0x48, 0x3D, 0x60, 0x10, 0xF4, 0x5B, 0x60, +0x01, 0x06, 0x3D, 0x70, 0x10, 0xF4, 0x5B, 0x78, +0x03, 0x22, 0x3D, 0x80, 0x10, 0xFD, 0x3D, 0x90, +0x10, 0xFD, 0x3C, 0x30, 0x10, 0xFE, 0x3C, 0x40, +0x11, 0x03, 0x3C, 0x50, 0x11, 0x12, 0x3C, 0x00, +0x11, 0x11, 0x3D, 0x88, 0x05, 0x16, 0x3D, 0x88, +0x05, 0x15, 0x3D, 0x88, 0x05, 0x14, 0x3D, 0x88, +0x05, 0x13, 0x3D, 0x88, 0x05, 0x12, 0x3D, 0x98, +0x05, 0x17, 0x3C, 0x38, 0x05, 0x1B, 0x3C, 0x48, +0x05, 0x1C, 0x3C, 0x58, 0x05, 0x25, 0x3C, 0x08, +0x05, 0x26, 0x3C, 0x10, 0x10, 0xF4, 0xC1, 0x1D, +0x3C, 0xF0, 0x11, 0x08, 0x3D, 0x10, 0x11, 0x09, +0x3D, 0x20, 0x11, 0x0C, 0x3D, 0x30, 0x11, 0x0A, +0x3D, 0x40, 0x11, 0x06, 0x3D, 0x50, 0x11, 0x12, +0x3C, 0x20, 0x11, 0x11, 0x3C, 0xF8, 0x05, 0x2A, +0x3D, 0x18, 0x05, 0x2B, 0x3D, 0x28, 0x05, 0x2D, +0x3D, 0x38, 0x05, 0x2C, 0x3D, 0x48, 0x05, 0x2E, +0x3D, 0x58, 0x05, 0x25, 0x3C, 0x28, 0x05, 0x26, +0x5B, 0x08, 0x02, 0x11, 0x3D, 0x60, 0x0F, 0xB7, +0x86, 0x00, 0x3D, 0x08, 0x05, 0x27, 0x3D, 0x68, +0x05, 0x16, 0x3D, 0x68, 0x05, 0x15, 0x3D, 0x68, +0x05, 0x14, 0x3D, 0x68, 0x05, 0x13, 0x3D, 0x68, +0x05, 0x12, 0xDD, 0x9E, 0xFC, 0x20, 0x3C, 0x27, +0xF6, 0x74, 0xCA, 0x05, 0x3C, 0x10, 0x05, 0x06, +0x96, 0xCC, 0xCB, 0x12, 0x3C, 0x40, 0x0E, 0x9C, +0x3C, 0x60, 0x0E, 0x4C, 0x97, 0x63, 0xE0, 0xA6, +0xE9, 0x07, 0x2E, 0x70, 0x03, 0x22, 0xCF, 0x04, +0x2E, 0x10, 0x03, 0x2C, 0xC9, 0x07, 0xC8, 0x06, +0x86, 0xC0, 0x3D, 0x6B, 0xF6, 0x75, 0x84, 0x00, +0xD5, 0x69, 0x3C, 0x33, 0xF6, 0x77, 0x3C, 0x50, +0x0E, 0x9E, 0x8C, 0x61, 0x97, 0x19, 0x97, 0xAB, +0xE0, 0xC4, 0x3C, 0x4B, 0xF6, 0x77, 0xE8, 0x0A, +0x3C, 0x70, 0x0E, 0x60, 0x84, 0xA0, 0x94, 0x79, +0x3E, 0x3F, 0xE6, 0xFC, 0x3E, 0x48, 0x0A, 0x60, +0xD5, 0x04, 0x5A, 0x08, 0x01, 0x20, 0xD5, 0xF5, +0xD1, 0x09, 0x99, 0xEC, 0x99, 0xAB, 0x03, 0x53, +0x88, 0xAC, 0x13, 0x53, 0x02, 0xC0, 0x8C, 0xA2, +0xD5, 0xF8, 0x3C, 0x10, 0x0E, 0x61, 0x84, 0xA0, +0x94, 0x49, 0x3E, 0x3F, 0xE6, 0xFC, 0x3E, 0x48, +0x0A, 0x60, 0xD1, 0x09, 0x99, 0xEC, 0x99, 0xAB, +0x03, 0x43, 0x88, 0xCC, 0x13, 0x43, 0x02, 0xE0, +0x8C, 0xA2, 0xD5, 0xF8, 0x85, 0x00, 0x3C, 0x8B, +0xF6, 0x77, 0x3C, 0x30, 0x05, 0x06, 0x96, 0xE6, +0xC3, 0x05, 0x2E, 0x47, 0xF3, 0xC3, 0xC4, 0x02, +0xC0, 0xC0, 0x3C, 0x53, 0xF6, 0x75, 0x3C, 0x70, +0x0E, 0x9E, 0x8C, 0xA1, 0x97, 0xA9, 0x96, 0x7B, +0xE0, 0x26, 0x3C, 0x6B, 0xF6, 0x75, 0xE8, 0x09, +0x3D, 0x10, 0x0E, 0x5D, 0x86, 0x00, 0x3E, 0x3F, +0xE6, 0xFC, 0x3E, 0x48, 0x0A, 0x60, 0xD5, 0x04, +0x5A, 0x08, 0x01, 0xAF, 0xD5, 0xF6, 0xE1, 0x91, +0xE8, 0x09, 0x41, 0x22, 0x40, 0x20, 0x03, 0x39, +0x05, 0xEC, 0x39, 0x31, 0xC1, 0x09, 0x8D, 0x81, +0xD5, 0xF7, 0x84, 0x00, 0x3C, 0x0B, 0xF6, 0x75, +0x4E, 0x27, 0x00, 0x05, 0x8E, 0x41, 0x3C, 0x2B, +0xF6, 0x74, 0x84, 0x41, 0x3E, 0x27, 0xEC, 0xFB, +0x84, 0x01, 0xFC, 0xA0, 0x96, 0x03, 0x3C, 0x53, +0xF0, 0xA7, 0x3C, 0x30, 0x0E, 0x69, 0x84, 0x40, +0x9C, 0x41, 0x3C, 0x0B, 0xF6, 0x74, 0x3C, 0x1F, +0xFC, 0xE1, 0x3C, 0x2B, 0xF9, 0xC4, 0x3E, 0x27, +0xEC, 0xFB, 0xDB, 0x09, 0x3C, 0x53, 0xF0, 0xA8, +0x3C, 0x40, 0x0E, 0x6B, 0xDC, 0x04, 0x2E, 0x17, +0xE1, 0x52, 0xC9, 0x09, 0x85, 0xE0, 0x86, 0x00, +0x3E, 0xF7, 0xE1, 0x52, 0x3D, 0x0B, 0xF0, 0xA7, +0x3C, 0x0B, 0xF0, 0xAA, 0xDD, 0x9E, 0x3E, 0x0F, +0xF3, 0xA4, 0x84, 0x20, 0x84, 0x40, 0x10, 0x10, +0x00, 0x13, 0x10, 0x10, 0x00, 0x15, 0x10, 0x10, +0x00, 0x14, 0x10, 0x10, 0x00, 0x12, 0x10, 0x10, +0x00, 0x1F, 0x10, 0x10, 0x00, 0x1E, 0x3C, 0x28, +0x05, 0x19, 0xDD, 0x9E, 0xFC, 0x00, 0x3C, 0x00, +0x0E, 0x8B, 0x3C, 0x10, 0x0F, 0x91, 0x3C, 0x20, +0x0F, 0x92, 0x3C, 0x30, 0x0F, 0x93, 0x3C, 0x08, +0x05, 0x06, 0x3C, 0x18, 0x05, 0x07, 0x3C, 0x28, +0x05, 0x08, 0x3C, 0x38, 0x05, 0x09, 0x84, 0xC0, +0x80, 0x06, 0x8C, 0xC1, 0x49, 0xFF, 0xDA, 0xB6, +0x5A, 0x68, 0x0F, 0xFC, 0x3C, 0x40, 0x0E, 0xD4, +0x3C, 0x50, 0x0E, 0xD5, 0x3C, 0xF0, 0x0E, 0xD9, +0x3C, 0x48, 0x0E, 0x60, 0x3C, 0x48, 0x0E, 0x5E, +0x3C, 0x58, 0x0E, 0x61, 0x3C, 0x58, 0x0E, 0x5F, +0x5A, 0xF8, 0x01, 0x08, 0x9C, 0x21, 0x9C, 0x69, +0x3C, 0x08, 0x0E, 0x60, 0x3C, 0x18, 0x0E, 0x61, +0x3D, 0x00, 0x0E, 0xD9, 0x5B, 0x08, 0x02, 0x07, +0x9C, 0xA1, 0x3C, 0x28, 0x0E, 0x60, 0x3C, 0x58, +0x0E, 0x61, 0xFF, 0x2C, 0x3C, 0x48, 0x0E, 0x5D, +0x87, 0x80, 0x49, 0xFF, 0xFD, 0xE3, 0x84, 0x00, +0x3D, 0xCB, 0xED, 0x8C, 0x49, 0xFF, 0xFC, 0x19, +0x3C, 0x30, 0x0E, 0xEF, 0x3D, 0xCB, 0xF9, 0xF1, +0x97, 0x9B, 0x4E, 0x66, 0x00, 0x04, 0x84, 0x01, +0xD5, 0x04, 0x3C, 0x40, 0x0E, 0xEF, 0x96, 0x23, +0x87, 0x80, 0x49, 0xFF, 0xFF, 0x7D, 0x3F, 0xC7, +0xEC, 0xFA, 0x49, 0xFF, 0xFF, 0x9A, 0x3D, 0x30, +0x0F, 0x65, 0x3C, 0x50, 0x0F, 0x46, 0x86, 0x20, +0x86, 0x41, 0x3D, 0x1B, 0xF9, 0xD8, 0x3F, 0x20, +0x03, 0x2C, 0x3D, 0x18, 0x01, 0x95, 0x3D, 0x1B, +0xF6, 0x81, 0x3D, 0x1B, 0xF6, 0x82, 0x3F, 0x17, +0xED, 0x16, 0x3D, 0x1B, 0xF0, 0xAD, 0x3F, 0xC7, +0xF3, 0xDF, 0x3F, 0xC7, 0xF3, 0xE0, 0x3D, 0x18, +0x05, 0x11, 0x3D, 0x1B, 0xF6, 0x86, 0x3D, 0x38, +0x05, 0x0A, 0xCD, 0x06, 0x3C, 0x00, 0x0F, 0x34, +0x96, 0x43, 0x3C, 0x18, 0x0F, 0x46, 0x3C, 0x20, +0x0E, 0xE5, 0xCA, 0x06, 0x3C, 0x30, 0x0F, 0x35, +0x97, 0x9B, 0x3C, 0x68, 0x0E, 0xE5, 0x86, 0x80, +0x86, 0xC0, 0x86, 0xA2, 0x3F, 0x47, 0xED, 0x22, +0x3F, 0x57, 0xED, 0x23, 0x3F, 0x47, 0xED, 0x20, +0x3D, 0x68, 0x10, 0xF4, 0x3D, 0x6B, 0xF9, 0xE5, +0x49, 0xFF, 0xFD, 0xD6, 0xFC, 0x80, 0xFC, 0x60, +0x3C, 0x70, 0x0E, 0x84, 0x00, 0x6F, 0x80, 0x30, +0x97, 0xFB, 0xE4, 0xEB, 0x01, 0x1F, 0x80, 0x34, +0x02, 0xAF, 0x80, 0x2A, 0x02, 0x9F, 0x80, 0x2C, +0xE9, 0x0C, 0x3C, 0x70, 0x0E, 0x84, 0x97, 0xFB, +0xE4, 0xEF, 0xE8, 0x07, 0x9F, 0xF3, 0xE6, 0xE2, +0xE9, 0x0E, 0x44, 0xA0, 0x04, 0x44, 0x86, 0x20, +0xCE, 0x03, 0xE2, 0xC5, 0xD5, 0x3E, 0x5A, 0x68, +0x01, 0x0C, 0x84, 0xC0, 0xE2, 0xC5, 0x82, 0x46, +0x80, 0xA6, 0xD5, 0x0C, 0x44, 0xA0, 0x01, 0x41, +0x86, 0x20, 0x44, 0x90, 0x00, 0x55, 0x5A, 0x68, +0x02, 0x0C, 0x84, 0xC0, 0xE2, 0xC5, 0xFA, 0xAF, +0x82, 0x45, 0x47, 0x50, 0x20, 0x40, 0x50, 0xCA, +0x84, 0x0C, 0x85, 0xCA, 0xD5, 0x38, 0x86, 0x00, +0x5A, 0x68, 0x03, 0x11, 0x51, 0x34, 0xFF, 0xAB, +0x47, 0x41, 0x21, 0x21, 0x40, 0x68, 0x4C, 0x06, +0x50, 0xCA, 0x03, 0x13, 0xC5, 0x23, 0x80, 0xB0, +0x82, 0x50, 0x44, 0xE0, 0x00, 0xD7, 0x85, 0xEA, +0xD5, 0x26, 0x5A, 0x68, 0x04, 0x11, 0x50, 0xB4, +0xFF, 0xAB, 0x46, 0xD1, 0x21, 0x21, 0x40, 0x68, +0x2C, 0x06, 0x50, 0xC6, 0x83, 0x13, 0xC5, 0x17, +0x80, 0xB0, 0x82, 0x50, 0x44, 0xE0, 0x00, 0xD7, +0x85, 0xEF, 0xD5, 0x15, 0xE3, 0x85, 0x80, 0xD0, +0x46, 0x80, 0x20, 0x40, 0x80, 0xA6, 0xFB, 0xCF, +0x50, 0xC4, 0x04, 0x05, 0x44, 0xE0, 0x00, 0xEA, +0xD5, 0x0A, 0x82, 0x45, 0x44, 0xE0, 0x00, 0xD7, +0x85, 0xEB, 0xD5, 0x05, 0x82, 0x45, 0x44, 0xE0, +0x00, 0xD7, 0x85, 0xEE, 0x86, 0xC7, 0x4F, 0x12, +0x00, 0x09, 0x86, 0xC3, 0x5B, 0x10, 0x01, 0x06, +0x86, 0xC6, 0x5B, 0x18, 0x02, 0x03, 0x86, 0xC1, +0x3D, 0x1C, 0x07, 0x38, 0x01, 0x9F, 0x80, 0x3C, +0x40, 0x88, 0x80, 0x40, 0x01, 0xCF, 0x80, 0x38, +0x02, 0x7F, 0x80, 0x20, 0x02, 0x0F, 0x80, 0x24, +0x3D, 0x8C, 0x07, 0x39, 0x41, 0xEE, 0x65, 0x04, +0x02, 0xBF, 0x80, 0x22, 0x03, 0x3F, 0x80, 0x26, +0x86, 0xE0, 0x41, 0x0F, 0x1E, 0x04, 0x40, 0xD5, +0x82, 0x04, 0x40, 0xE9, 0xBA, 0x04, 0x40, 0x63, +0x60, 0x08, 0x15, 0x7C, 0x00, 0x01, 0x40, 0xF3, +0x3F, 0x84, 0xB7, 0x88, 0x14, 0xD4, 0x00, 0x01, +0x14, 0xE4, 0x00, 0x02, 0x14, 0xC4, 0x00, 0x03, +0x02, 0xCF, 0x80, 0x28, 0x40, 0x21, 0x3C, 0x08, +0x01, 0x4F, 0x80, 0x5C, 0x41, 0x27, 0xC8, 0x04, +0x40, 0xA5, 0x32, 0x84, 0x40, 0x41, 0x12, 0x04, +0x40, 0x59, 0x15, 0x04, 0x40, 0x31, 0xF4, 0x08, +0x40, 0x95, 0x25, 0x84, 0x41, 0x52, 0x53, 0x84, +0x41, 0x62, 0xDB, 0x24, 0x40, 0x11, 0x87, 0xE4, +0x14, 0x94, 0x00, 0x04, 0x15, 0x54, 0x00, 0x05, +0x15, 0x64, 0x00, 0x06, 0x14, 0x14, 0x00, 0x07, +0xFC, 0xE0, 0xFC, 0x26, 0x84, 0x40, 0x3D, 0x00, +0x0E, 0x5E, 0x3C, 0x40, 0x0E, 0x5F, 0x80, 0x62, +0x3F, 0x18, 0x1C, 0xE8, 0x3E, 0x78, 0x0A, 0x60, +0xE0, 0x70, 0xE8, 0x2B, 0x84, 0x20, 0xE0, 0x24, +0xE8, 0x19, 0x40, 0x80, 0x84, 0x0A, 0x51, 0x24, +0x02, 0x50, 0x97, 0x8C, 0x38, 0x08, 0xC9, 0x01, +0xC6, 0x04, 0x96, 0x03, 0x90, 0x08, 0xD5, 0x02, +0x96, 0x00, 0xE4, 0x16, 0xE8, 0x09, 0x99, 0x4A, +0x41, 0x33, 0x94, 0x20, 0x02, 0x59, 0x80, 0x00, +0xB1, 0x81, 0x38, 0x53, 0x01, 0x09, 0x8C, 0x21, +0xD5, 0xE7, 0x84, 0x00, 0xE0, 0x04, 0xE8, 0x0A, +0x99, 0x42, 0xB0, 0x41, 0x40, 0x63, 0x94, 0x20, +0x38, 0x50, 0x81, 0x11, 0xAD, 0x70, 0x8C, 0x01, +0xD5, 0xF6, 0x8C, 0x61, 0x88, 0x44, 0xD5, 0xD5, +0xFC, 0xA6, 0xFC, 0x28, 0x49, 0xFF, 0xE2, 0xC2, +0x3C, 0x0C, 0x07, 0x39, 0x84, 0x20, 0xA8, 0x41, +0x3C, 0x20, 0x11, 0x48, 0x3E, 0x38, 0x1C, 0xE8, +0x96, 0x8E, 0x97, 0x51, 0x3E, 0x18, 0x0A, 0x60, +0xC5, 0x1E, 0x3C, 0x70, 0x11, 0x48, 0x96, 0x3C, +0xC0, 0x02, 0xFA, 0x10, 0x3C, 0x8C, 0x07, 0x38, +0x84, 0x40, 0x99, 0x50, 0x51, 0x12, 0x8F, 0x00, +0x39, 0x24, 0x45, 0x01, 0x3D, 0x30, 0x0F, 0xDA, +0x50, 0xF1, 0x05, 0xA0, 0x40, 0x49, 0x4C, 0x0D, +0x41, 0x00, 0xBC, 0x20, 0x97, 0xA1, 0x8C, 0x41, +0x12, 0x68, 0x00, 0x00, 0x5A, 0x28, 0x16, 0xEF, +0x84, 0xE0, 0xD5, 0x0A, 0x80, 0x85, 0x50, 0x62, +0x8B, 0x40, 0x88, 0xC1, 0x8C, 0xA2, 0xAD, 0x30, +0x5A, 0x58, 0x2C, 0xFB, 0xD5, 0xF6, 0x41, 0x43, +0x84, 0x0A, 0x51, 0x5A, 0x02, 0x50, 0x96, 0xBC, +0x38, 0x01, 0xD5, 0x01, 0xC2, 0x04, 0x97, 0x43, +0x90, 0xA8, 0xD5, 0x02, 0x97, 0x40, 0xE4, 0xB6, +0xE8, 0x09, 0x51, 0x63, 0x85, 0xA0, 0x41, 0x70, +0xD8, 0x20, 0x02, 0x4B, 0x80, 0x00, 0x38, 0x4F, +0x95, 0x09, 0x8C, 0xE1, 0x5A, 0x78, 0x16, 0xE9, +0x85, 0x00, 0x51, 0x04, 0x0B, 0x40, 0x38, 0x64, +0x7C, 0x11, 0x89, 0x81, 0x8D, 0x02, 0x12, 0x68, +0x00, 0x00, 0x5A, 0x88, 0x2C, 0xF8, 0x3C, 0x70, +0x11, 0x48, 0x96, 0x3C, 0xC0, 0x1A, 0x3D, 0x8C, +0x07, 0x38, 0x86, 0x40, 0x51, 0x39, 0x0F, 0x00, +0x38, 0x2C, 0x4D, 0x01, 0x3D, 0x40, 0x0F, 0xC4, +0x51, 0x99, 0x05, 0x80, 0x40, 0x41, 0x50, 0x0D, +0x41, 0xE0, 0xE4, 0x20, 0x97, 0xA1, 0x8D, 0xC1, +0x12, 0x6F, 0x00, 0x00, 0x5B, 0x28, 0x20, 0xF0, +0x84, 0xE0, 0x3E, 0x58, 0x15, 0x60, 0xD5, 0x0B, +0x80, 0xA0, 0x51, 0x10, 0x0B, 0x00, 0x89, 0xA1, +0x8C, 0x02, 0x12, 0x58, 0x80, 0x00, 0x5A, 0x08, +0x40, 0xFA, 0xD5, 0xF3, 0x41, 0x53, 0x84, 0x0A, +0x50, 0xFA, 0x82, 0x40, 0x96, 0xBC, 0x38, 0x01, +0xBD, 0x01, 0xC2, 0x04, 0x97, 0x03, 0x90, 0x88, +0xD5, 0x02, 0x97, 0x00, 0x5E, 0xF2, 0x00, 0x20, +0xE8, 0x07, 0x41, 0x62, 0x90, 0x20, 0x02, 0x6B, +0x00, 0x00, 0x38, 0x6F, 0x9D, 0x09, 0x8C, 0xE1, +0x5A, 0x78, 0x20, 0xEA, 0x85, 0x00, 0x51, 0x04, +0x0B, 0x00, 0x38, 0x3F, 0xA0, 0x11, 0x89, 0x81, +0x8D, 0x02, 0x12, 0x38, 0x00, 0x00, 0x5A, 0x88, +0x40, 0xF8, 0xFC, 0xA8, 0xFC, 0x20, 0x80, 0xC0, +0x49, 0xFF, 0xE2, 0x1C, 0x3C, 0x0C, 0x07, 0x39, +0x84, 0xA0, 0xA9, 0x41, 0x3C, 0x10, 0x0E, 0x84, +0x3D, 0x8C, 0x07, 0x38, 0x5A, 0x18, 0x09, 0x1A, +0x3C, 0x10, 0x0E, 0x5F, 0x81, 0x05, 0x9E, 0xC9, +0x53, 0xC0, 0x80, 0x16, 0x3E, 0x48, 0x0A, 0x60, +0xE1, 0x06, 0x4E, 0xF2, 0x00, 0xB5, 0x51, 0xE2, +0x8F, 0x36, 0x39, 0x0C, 0x79, 0x01, 0x39, 0x02, +0x21, 0x09, 0xDB, 0x04, 0x50, 0x32, 0x80, 0x16, +0x88, 0xBC, 0x8C, 0xA1, 0x8D, 0x01, 0xD5, 0xF1, +0x3C, 0x20, 0x0E, 0xD9, 0x5A, 0x28, 0x01, 0x0A, +0x3C, 0x60, 0x0E, 0x5E, 0x3C, 0x30, 0x0E, 0x5F, +0x8C, 0xC1, 0x8C, 0x61, 0xFF, 0x9C, 0x97, 0xB1, +0x3C, 0x50, 0x0E, 0xD9, 0x5A, 0x58, 0x02, 0x09, +0x3C, 0x70, 0x0E, 0x5E, 0x3C, 0x00, 0x0E, 0x5F, +0x8C, 0xE1, 0xFF, 0xC4, 0x97, 0xB9, 0x3C, 0x10, +0x0E, 0x61, 0x84, 0xA0, 0x9F, 0xC9, 0x53, 0x20, +0x80, 0x16, 0x81, 0x05, 0x3F, 0x08, 0x0A, 0x60, +0xE1, 0x06, 0xE8, 0x26, 0x3C, 0x40, 0x0E, 0x84, +0x41, 0x44, 0x04, 0x08, 0x96, 0xE3, 0xE4, 0x6B, +0xE9, 0x0B, 0x3C, 0x00, 0x0E, 0x84, 0x96, 0x83, +0xE4, 0x4F, 0xE8, 0x06, 0x51, 0x92, 0x8F, 0x36, +0x39, 0x1C, 0x65, 0x01, 0xD5, 0x0C, 0x51, 0x32, +0x8A, 0x80, 0x39, 0x5C, 0x4E, 0x02, 0x3D, 0x60, +0x0F, 0x9F, 0x3D, 0x70, 0x10, 0x68, 0x41, 0x1A, +0xD8, 0x0D, 0x89, 0xB7, 0x39, 0x18, 0x50, 0x09, +0xDF, 0x04, 0x50, 0x72, 0x80, 0x16, 0x88, 0xB2, +0x8C, 0xA1, 0x8D, 0x01, 0xD5, 0xDA, 0x3C, 0x80, +0x0E, 0xD9, 0x5A, 0x80, 0x01, 0x1F, 0x3D, 0x00, +0x0E, 0xD9, 0x5B, 0x08, 0x02, 0x46, 0x3C, 0x60, +0x0E, 0x5E, 0x3C, 0x00, 0x0F, 0xD8, 0x8E, 0xC1, +0xFF, 0x8C, 0x96, 0xC3, 0x3C, 0x50, 0x0F, 0xD8, +0x3E, 0x28, 0x0A, 0x60, 0x88, 0x66, 0x39, 0x31, +0x0D, 0x01, 0x97, 0xEB, 0x88, 0x26, 0x39, 0x31, +0x19, 0x09, 0x88, 0x27, 0x39, 0x41, 0x05, 0x01, +0x8C, 0x42, 0x39, 0x41, 0x19, 0x09, 0xD5, 0x2C, +0x3D, 0x90, 0x0E, 0x5E, 0x3C, 0x60, 0x0E, 0x5F, +0x50, 0x2C, 0xFF, 0xFF, 0xFE, 0x8C, 0x3E, 0x08, +0x0A, 0x60, 0x98, 0xD6, 0x39, 0x10, 0x0D, 0x01, +0x99, 0x4A, 0x39, 0x10, 0x09, 0x09, 0x88, 0xA6, +0x39, 0x20, 0x15, 0x01, 0x9D, 0xC2, 0x39, 0x23, +0x89, 0x09, 0x84, 0x40, 0x41, 0xC3, 0x04, 0x08, +0x82, 0x22, 0xE1, 0xB9, 0xE8, 0xC9, 0x80, 0x62, +0x84, 0xE0, 0x41, 0x70, 0x44, 0x20, 0xE0, 0xE6, +0xE8, 0x08, 0x39, 0xEB, 0x8C, 0x01, 0x39, 0xE0, +0x0C, 0x09, 0x8C, 0xE1, 0x8C, 0x62, 0xD5, 0xF8, +0x8D, 0xA1, 0x88, 0x5C, 0xD5, 0xEF, 0x84, 0x20, +0x85, 0x02, 0x41, 0x5C, 0x20, 0x40, 0x05, 0x6A, +0x8F, 0xC0, 0xE2, 0x36, 0xE8, 0x03, 0x04, 0x1A, +0x8F, 0xC0, 0x8D, 0x01, 0x5A, 0x88, 0x21, 0xF7, +0x04, 0x4C, 0x0F, 0xE1, 0x3C, 0x18, 0x0E, 0x4B, +0x3C, 0x48, 0x0E, 0x4A, 0xFC, 0xA0, 0xFC, 0x20, +0x80, 0xC0, 0x3C, 0x00, 0x10, 0xF4, 0xC8, 0x04, +0x3C, 0x50, 0x05, 0x27, 0xD5, 0x0E, 0x3C, 0x20, +0x10, 0xF4, 0x5A, 0x20, 0x01, 0x06, 0x3C, 0x30, +0x10, 0xF4, 0x5A, 0x38, 0x03, 0x05, 0x3C, 0x50, +0x11, 0x00, 0xD5, 0x03, 0x3C, 0x50, 0x11, 0x0E, +0xC5, 0x49, 0x3C, 0x40, 0x10, 0xD9, 0x3C, 0x70, +0x10, 0xDA, 0x3C, 0x00, 0x0E, 0xD9, 0x96, 0xE3, +0x96, 0x83, 0x3D, 0x00, 0x0E, 0x5F, 0x97, 0x3B, +0x5A, 0x20, 0x01, 0x3B, 0x3C, 0x80, 0x0E, 0xD9, +0x5A, 0x80, 0x02, 0x39, 0x97, 0x21, 0xC4, 0x1A, +0x54, 0x72, 0x80, 0x10, 0xC7, 0x17, 0x40, 0x03, +0x40, 0x57, 0xFF, 0x0C, 0x96, 0x11, 0x50, 0xF0, +0x02, 0xE0, 0x3E, 0x78, 0x03, 0x4C, 0x45, 0x20, +0x00, 0x64, 0x39, 0x13, 0xBD, 0x11, 0x41, 0x32, +0x4A, 0x76, 0x86, 0xA0, 0x41, 0x49, 0xC4, 0x07, +0x41, 0x6A, 0xC4, 0x07, 0x40, 0x0A, 0x58, 0x02, +0xD5, 0x02, 0x84, 0x01, 0x97, 0x19, 0xC4, 0x1B, +0x97, 0x6E, 0xC5, 0x19, 0x41, 0x73, 0x42, 0xF7, +0xFF, 0x0C, 0x51, 0x8B, 0x82, 0xC0, 0x3E, 0x68, +0x03, 0x4C, 0x44, 0x10, 0x00, 0x64, 0x39, 0x93, +0x61, 0x11, 0x41, 0xC2, 0x07, 0x96, 0x87, 0xC0, +0x40, 0x5E, 0x64, 0x07, 0x40, 0x3F, 0x64, 0x07, +0xFF, 0x5E, 0xFE, 0x2E, 0xD5, 0x04, 0x80, 0x02, +0xD5, 0x02, 0x84, 0x01, 0xFC, 0xA0, 0xFC, 0x61, +0x84, 0xFF, 0x81, 0xA0, 0x81, 0x3F, 0x3A, 0x1F, +0x88, 0x20, 0x81, 0xC3, 0x3C, 0x8C, 0x02, 0x7A, +0x81, 0x67, 0x81, 0x87, 0x84, 0xC0, 0x3F, 0xCF, +0xFF, 0x08, 0xE0, 0xCD, 0xE8, 0x19, 0x40, 0x2E, +0x18, 0x20, 0x22, 0xA1, 0x01, 0xB8, 0x4E, 0xA5, +0x00, 0x12, 0x80, 0x0A, 0x3A, 0x14, 0x88, 0x00, +0x49, 0xFF, 0xBB, 0xCD, 0x5A, 0x08, 0x01, 0x0B, +0x38, 0x34, 0x29, 0x11, 0xE0, 0xE3, 0xE8, 0x06, +0xE0, 0x6E, 0xE9, 0x04, 0x81, 0x8A, 0x80, 0xE3, +0x81, 0x66, 0x8C, 0xC1, 0xD5, 0xE7, 0x5A, 0xB7, +0xFF, 0x07, 0x84, 0x3F, 0x3E, 0x08, 0x02, 0x78, +0x38, 0x10, 0x2D, 0x09, 0x80, 0x0C, 0xFC, 0xE1, +0xFC, 0x41, 0x3C, 0x70, 0x05, 0x06, 0x81, 0x20, +0x54, 0x03, 0xC0, 0x00, 0x97, 0xC1, 0x85, 0x40, +0xCF, 0x0A, 0x3C, 0x64, 0x04, 0xFF, 0x3C, 0x10, +0x05, 0x2D, 0x44, 0x50, 0x00, 0x64, 0xFF, 0x8C, +0x40, 0xA3, 0x15, 0x56, 0x3C, 0x40, 0x05, 0x2A, +0x3C, 0x14, 0x05, 0x01, 0x42, 0x55, 0x10, 0x00, +0x3C, 0x24, 0x0E, 0x64, 0x3C, 0x34, 0x0E, 0x65, +0xB7, 0x3F, 0x3E, 0x08, 0x09, 0x38, 0x3E, 0x48, +0x02, 0xC8, 0x97, 0x69, 0x49, 0xFF, 0xCD, 0x79, +0x3E, 0x00, 0x03, 0x1F, 0xCF, 0x0A, 0x3C, 0x24, +0x04, 0xFC, 0x3C, 0x30, 0x05, 0x2D, 0x44, 0x80, +0x00, 0x64, 0xFE, 0x9C, 0x40, 0xA1, 0x21, 0x56, +0x3C, 0xF0, 0x05, 0x2B, 0x3C, 0x14, 0x04, 0xFE, +0x42, 0x75, 0x3C, 0x00, 0x3C, 0x24, 0x0E, 0x66, +0x3C, 0x34, 0x0E, 0x67, 0xB7, 0x3F, 0x3E, 0x08, +0x09, 0x78, 0x3E, 0x48, 0x02, 0xF0, 0x97, 0x79, +0x49, 0xFF, 0xCD, 0x5B, 0x3E, 0x00, 0x03, 0x20, +0xC0, 0x36, 0x2E, 0x00, 0x03, 0x1F, 0xC0, 0x33, +0x3D, 0x04, 0x04, 0xFE, 0x3D, 0x64, 0x05, 0x01, +0x3D, 0x70, 0x0E, 0x5F, 0x82, 0x30, 0x43, 0x1B, +0xD8, 0x73, 0x3E, 0x5F, 0xFF, 0x08, 0x3D, 0x18, +0x01, 0x50, 0x84, 0x20, 0x84, 0x01, 0x51, 0x32, +0x83, 0x98, 0x2F, 0x20, 0x03, 0x1F, 0xE0, 0x32, +0xE8, 0x1D, 0x3E, 0x28, 0x02, 0xF0, 0x41, 0x42, +0x84, 0x20, 0x85, 0x20, 0x2F, 0x50, 0x03, 0x20, +0xE1, 0x35, 0xE8, 0x12, 0x23, 0x8A, 0x01, 0xE0, +0x4D, 0x6C, 0x40, 0x06, 0x23, 0x91, 0x00, 0x00, +0x4D, 0x98, 0x00, 0x08, 0xA5, 0x90, 0x42, 0x6B, +0xE0, 0x73, 0x38, 0x69, 0x81, 0x09, 0x8C, 0x01, +0x8D, 0x21, 0x8C, 0x42, 0xD5, 0xEC, 0x8C, 0x21, +0xD5, 0xE1, 0x96, 0x00, 0xFC, 0xC1, 0x00, 0x00, +0x80, 0x60, 0x99, 0x5A, 0xD3, 0x04, 0x18, 0x11, +0x80, 0x01, 0xD5, 0xFD, 0xDD, 0x9E, 0x92, 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, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x01, 0x00, 0xFF, 0xFF, 0x02, 0x00, +0x00, 0x00, 0x05, 0x00, 0x19, 0x00, 0xF4, 0x91, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, +0x49, 0x5A, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x50, 0x00, 0x50, 0x00, 0x50, 0x00, 0x50, 0x00, +0x50, 0x00, 0x0A, 0x00, 0x19, 0x00, 0x00, 0x00, +0x1E, 0x00, 0x23, 0x00, 0x1E, 0x00, 0x01, 0x00, +0xE8, 0x03, 0x02, 0x00, 0x00, 0x00, 0x64, 0x00, +0x00, 0x02, 0x64, 0x00, 0x64, 0x00, 0x1C, 0x08, +0x0F, 0x00, 0xF4, 0x01, 0x24, 0x00, 0x20, 0x80, +0x2D, 0x00, 0xC8, 0x00, 0xD0, 0x07, 0x02, 0x00, +0x09, 0x00, 0x64, 0x00, 0x19, 0x00, 0xF4, 0x01, +0x00, 0x00, 0x05, 0x00, 0x96, 0x00, 0x00, 0x00, +0x00, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0x96, 0x00, +0x2C, 0x01, 0xE8, 0x03, 0x50, 0x00, 0x96, 0x00, +0x02, 0x00, 0x04, 0x00, 0x2C, 0x01, 0x64, 0x00, +0x1E, 0x00, 0x32, 0x00, 0x96, 0x00, 0x96, 0x00, +0xC0, 0x12, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, +0x1E, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x01, 0x00, +0x05, 0x00, 0x05, 0x00, 0xE8, 0x03, 0x32, 0x00, +0x20, 0x00, 0x16, 0x00, 0x03, 0x00, 0x20, 0x00, +0x20, 0x00, 0x00, 0x00, 0x6A, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x0A, 0x00, 0xAC, 0x0D, 0x14, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0x9C, 0xFF, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 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, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x00, +0x1F, 0x00, 0x01, 0x00, 0x06, 0x00, 0x0F, 0x00, +0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, +0x20, 0x03, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, +0x04, 0x00, 0x32, 0x00, 0x78, 0x00, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, +0x44, 0x00, 0x40, 0x00, 0xD0, 0x02, 0x0F, 0x00, +0xB8, 0x0B, 0x05, 0x00, 0x04, 0x00, 0x03, 0x00, +0x03, 0x00, 0x3C, 0x00, 0x2C, 0x01, 0x64, 0x00, +0x64, 0x00, 0x28, 0x00, 0x23, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x70, 0x17, 0x64, 0x00, +0x3C, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0xD8, 0xFF, +0x28, 0x00, 0xFF, 0xFF, 0x1E, 0x00, 0x00, 0x00, +0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0x41, 0x00, +0x0F, 0x80, 0x00, 0x00, 0x19, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x0F, 0x00, 0xB8, 0x0B, 0x32, 0x00, 0xD0, 0x07, +0xE6, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xB8, 0x0B, 0x5C, 0x00, 0xFF, 0xFF, +0xB8, 0x0B, 0x48, 0xF4, 0xE8, 0x03, 0x19, 0x00, +0x64, 0x00, 0xB8, 0x0B, 0x64, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1F, 0x12, 0x20, 0x80, +0x1E, 0x00, 0xFF, 0xFF, 0x10, 0x00, 0x44, 0x00, +0x4D, 0x00, 0xFF, 0xFF, 0x90, 0x01, 0x64, 0x00, +0xFF, 0xFF, 0x20, 0x01, 0x02, 0x00, 0x04, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0x09, 0x00, 0x07, 0x00, +0x0F, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, +0x05, 0x00, 0x30, 0x75, 0x00, 0x00, 0x01, 0x00, +0xFF, 0xFF, 0x0F, 0x00, 0xCE, 0x20, 0x30, 0x75, +0x30, 0x75, 0xFA, 0x00, 0xFF, 0xFF, 0xDC, 0x05, +0x0A, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0x0A, 0x00, 0x30, 0x75, 0x01, 0x00, 0x30, 0x75, +0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, +0x00, 0x01, 0x60, 0x00, 0x0A, 0x00, 0x28, 0x00, +0x50, 0x00, 0x1E, 0x00, 0xFF, 0xFF, 0x00, 0x00, +0x32, 0x00, 0xFF, 0xFF, 0xE8, 0x03, 0x01, 0x00, +0x08, 0x08, 0x30, 0x00, 0x28, 0x00, 0x64, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0xFF, 0xFF, +0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x0F, 0x00, +0x10, 0x00, 0xDC, 0x05, 0x00, 0x00, 0xE0, 0x2E, +0x7D, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x05, 0x00, +0xFF, 0xFF, 0x5F, 0x00, 0xBF, 0x00, 0x02, 0x00, +0x03, 0x00, 0x19, 0x00, 0x19, 0x00, 0x00, 0x00, +0x96, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x00, +0x1E, 0x00, 0x64, 0x00, 0x11, 0x00, 0x53, 0x00, +0x08, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x15, 0x00, +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, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x2C, 0x01, 0x0A, 0x00, +0x03, 0x00, 0x03, 0x00, 0xB8, 0x0B, 0x28, 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, +0xC8, 0x00, 0x38, 0xFF, 0x12, 0x00, 0x13, 0x00, +0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, +0x18, 0x00, 0x19, 0x00, 0x1A, 0x00, 0x1B, 0x00, +0x1C, 0x00, 0x1D, 0x00, 0x1E, 0x00, 0x1F, 0x00, +0x20, 0x00, 0x21, 0x00, 0x0A, 0x00, 0x23, 0x01, +0x10, 0x27, 0x98, 0x3A, 0x26, 0x00, 0x27, 0x00, +0x28, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x02, 0x00, 0x24, 0x00, 0x40, 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, +0x01, 0x00, 0x04, 0x00, 0xA4, 0x91, 0x20, 0x01, +0x0A, 0x00, 0x04, 0x00, 0x28, 0x00, 0x5A, 0x00, +0x02, 0x03, 0x0A, 0x00, 0x28, 0x00, 0x96, 0x00, +0x50, 0x00, 0x50, 0x00, 0x1E, 0x00, 0x03, 0x00, +0x08, 0x00, 0x5E, 0x01, 0xB8, 0x0B, 0x96, 0x00, +0x64, 0x00, 0x05, 0x00, 0xFA, 0x00, 0x02, 0x00, +0x07, 0x00, 0x96, 0x00, 0x32, 0x00, 0x2C, 0x01, +0x66, 0xBC, 0x27, 0xA4, 0x1F, 0xDE, 0x31, 0x00, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, +0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x0B, 0x0C, 0x0D, +0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, +0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, +0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, +0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x60, 0x46, +0x8A, 0x03, 0xC6, 0x97, 0xDD, 0xBB, 0xA0, 0x85, +0x33, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x14, 0x00, +0x14, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0xFF, 0xFF, +0xFF, 0xFF, 0x64, 0x00, 0xFE, 0x07, 0x06, 0x00, +0x1E, 0x00, 0x1E, 0x00, 0x84, 0x85, 0xC4, 0x5C, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xB2, 0x26, 0xF4, 0xD4, +0x18, 0x87, 0x75, 0x36, 0x27, 0x2C, 0x5D, 0xB2, +0x46, 0x00, 0x00, 0x00, 0xFA, 0x00, 0x04, 0x00, +0xFF, 0xFF, 0x20, 0x01, 0x32, 0x00, 0x03, 0x00, +0x3C, 0x00, 0x64, 0x00, 0x46, 0x00, 0xC8, 0x00, +0x02, 0x00, 0x96, 0x00, 0x32, 0x00, 0x02, 0x03, +0x33, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x14, 0x00, +0xB8, 0x0B, 0x50, 0x00, 0x01, 0x00, 0x78, 0x00, +0x64, 0x00, 0x64, 0x00, 0xC8, 0x00, 0x1E, 0x00, +0x1E, 0x00, 0x02, 0x03, 0x03, 0x00, 0x0A, 0x00, +0x0A, 0x00, 0x40, 0x00, 0xE8, 0x03, 0x70, 0x17, +0xFF, 0x3F, 0x07, 0x00, 0xFF, 0x03, 0x00, 0x07, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0xFF, 0x0F, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x07, 0x07, 0x5D, 0x00, 0x3F, 0x00, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x3F, 0x01, 0x00, 0xA0, 0x00, 0xB3, 0x1F, +0x01, 0x00, 0xB3, 0x07, 0x00, 0x00, 0x00, 0x00, +0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0xFF, 0x83, +0xC1, 0xFF, 0x00, 0x7C, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, +0xFF, 0x83, 0xC1, 0xFF, 0x00, 0x7C, 0x01, 0x00, +0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x03, 0x00, 0x1F, 0x00, 0xFA, 0x00, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x41, 0x01, +0x11, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0x00, 0x1F, 0x00, 0xC8, 0x00, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, +0x41, 0x01, 0x11, 0x00, 0x07, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x04, 0x04, 0x44, 0x04, 0x55, 0x00, 0x07, 0x00, +0x00, 0x00, 0x98, 0x37, 0xF9, 0x00, 0x87, 0x13, +0xE6, 0x00, 0x08, 0x00, 0x50, 0x00, 0x00, 0x00, +0x19, 0x00, 0x46, 0x00, 0x0A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x1E, 0x00, +0x1E, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, +0x64, 0x00, 0x02, 0x00, 0x02, 0x00, 0x06, 0x00, +0x03, 0x00, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xC8, 0x00, 0xC8, 0x00, +0x01, 0x01, 0x02, 0x00, 0x39, 0x00, 0x90, 0x01, +0x12, 0x00, 0x0C, 0x00, 0x12, 0x00, 0x31, 0x00, +0x3B, 0x00, 0x0C, 0x00, 0x65, 0x00, 0x31, 0x00, +0x8E, 0x00, 0x0C, 0x00, 0xB8, 0x00, 0x31, 0x00, +0xE1, 0x00, 0x0C, 0x00, 0x0B, 0x01, 0x90, 0x01, +0x34, 0x01, 0xC5, 0x00, 0x34, 0x01, 0x31, 0x00, +0x34, 0x01, 0x0C, 0x00, 0x5E, 0x01, 0x31, 0x00, +0x87, 0x01, 0x0C, 0x00, 0xB1, 0x01, 0x31, 0x00, +0xDA, 0x01, 0x0C, 0x00, 0x04, 0x02, 0x31, 0x00, +0x2D, 0x02, 0x0C, 0x00, 0x57, 0x02, 0x90, 0x01, +0x80, 0x02, 0x31, 0x00, 0x80, 0x02, 0x0C, 0x00, +0xA9, 0x02, 0x31, 0x00, 0xD3, 0x02, 0x0C, 0x00, +0xFC, 0x02, 0x31, 0x00, 0x26, 0x03, 0x0C, 0x00, +0x4F, 0x03, 0x31, 0x00, 0x79, 0x03, 0x0C, 0x00, +0xA2, 0x03, 0x5B, 0x02, 0xCC, 0x03, 0x90, 0x01, +0xCC, 0x03, 0x31, 0x00, 0xCC, 0x03, 0x0C, 0x00, +0xF5, 0x03, 0x31, 0x00, 0x1F, 0x04, 0x0C, 0x00, +0x48, 0x04, 0x31, 0x00, 0x72, 0x04, 0x0C, 0x00, +0x9B, 0x04, 0x31, 0x00, 0xC5, 0x04, 0x7B, 0x00, +0xC5, 0x04, 0xC5, 0x00, 0xC5, 0x04, 0x0F, 0x01, +0xC5, 0x04, 0x59, 0x01, 0xC5, 0x04, 0xA2, 0x01, +0xC5, 0x04, 0xEC, 0x01, 0xC5, 0x04, 0x36, 0x02, +0xC5, 0x04, 0x80, 0x02, 0xC5, 0x04, 0xCA, 0x02, +0xC5, 0x04, 0x14, 0x03, 0xC5, 0x04, 0xEF, 0x02, +0xEE, 0x04, 0xA5, 0x02, 0xEE, 0x04, 0x5B, 0x02, +0xEE, 0x04, 0x11, 0x02, 0xEE, 0x04, 0xC7, 0x01, +0xEE, 0x04, 0x7E, 0x01, 0xEE, 0x04, 0x34, 0x01, +0xEE, 0x04, 0xEA, 0x00, 0xEE, 0x04, 0xA0, 0x00, +0xEE, 0x04, 0x56, 0x00, 0xEE, 0x04, 0x0C, 0x00, +0xEE, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +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, +0xE9, 0x9D, 0x73, 0xB6, 0xE5, 0x8E, 0x1E, 0xF9, +0xC1, 0xCA, 0x6A, 0x38, 0x6B, 0x6E, 0x90, 0x58, +0x1E, 0xEE, 0x80, 0xBE, 0x28, 0x93, 0x84, 0x97, +0xF3, 0x01, 0x07, 0xD9, 0x77, 0x95, 0x49, 0x69, +0x8A, 0x89, 0x58, 0xD0, 0xA2, 0x0B, 0x9D, 0x3D, +0xD6, 0xFF, 0xEA, 0x5E, 0xE0, 0x23, 0xDA, 0x60, +0x19, 0x0B, 0xD5, 0xEC, 0xF7, 0x50, 0xF8, 0xB0, +0x5F, 0x73, 0x24, 0xE3, 0x18, 0x77, 0xF6, 0x6E, +0x46, 0x81, 0x90, 0x25, 0xEE, 0xB1, 0xE7, 0x20, +0x50, 0x63, 0x69, 0x52, 0x64, 0xFB, 0x55, 0xB1, +0x92, 0xF1, 0xF6, 0xFA, 0x62, 0x9D, 0x0F, 0x7F, +0xF8, 0xC7, 0x6A, 0xAA, 0x9D, 0x99, 0x56, 0x13, +0xCA, 0x59, 0xF1, 0xCF, 0xDF, 0xB7, 0x4D, 0xD7, +0x73, 0xEF, 0x78, 0x32, 0x4B, 0x00, 0x93, 0xD3, +0xAC, 0xB6, 0x91, 0xCA, 0x5F, 0x0E, 0xCB, 0xC0, +0x37, 0xD0, 0xB6, 0x14, 0xD6, 0x81, 0xAA, 0x27, +0xBD, 0xF0, 0xE7, 0x55, 0x56, 0x0C, 0x0D, 0xE1, +0x44, 0x07, 0x35, 0xE4, 0xA3, 0x35, 0x67, 0xB2, +0xFE, 0x3A, 0xE4, 0xF8, 0x46, 0x23, 0x09, 0x23, +0xE3, 0x65, 0x87, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +}; +#endif diff --git a/drivers/input/touchscreen/zt7554_ts.c b/drivers/input/touchscreen/zt7554_ts.c new file mode 100755 index 00000000..7dccb32a --- /dev/null +++ b/drivers/input/touchscreen/zt7554_ts.c @@ -0,0 +1,3187 @@ +/* + * + * Zinitix zt7554 touchscreen driver + * + * Copyright (C) 2013 Samsung Electronics Co.Ltd + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ +#include "zt7554_ts.h" +#include "zt7554_ts_spec.h" + +//#include "zinitix_touch_t560.h" +#include "zinitix_touch_zxt_firmware.h" +#include +u32 BUTTON_MAPPING_KEY[MAX_SUPPORTED_BUTTON_NUM] = {KEY_MENU, KEY_BACK}; + +static int cal_mode; +static int get_boot_mode(char *str) +{ + + get_option(&str, &cal_mode); + printk(KERN_DEBUG "get_boot_mode, uart_mode : %d\n", cal_mode); + return 1; +} +__setup("calmode=", get_boot_mode); + +s32 read_data(struct i2c_client *client, u16 reg, u8 *values, u16 length) +{ + s32 ret; + int count = 0; +retry: + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to send. ret:%d, try:%d\n", + __func__, ret, count + 1); + mdelay(1); + if (++count < I2C_RETRY_TIMES) + goto retry; + return ret; + } + + udelay(DELAY_FOR_TRANSCATION); + ret = i2c_master_recv(client , values , length); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to recv. ret:%d\n", __func__, ret); + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 write_data(struct i2c_client *client, u16 reg, u8 *values, u16 length) +{ + s32 ret; + int count = 0; + u8 pkt[10]; + + pkt[0] = (reg) & 0xff; + pkt[1] = (reg >> 8) & 0xff; + memcpy((u8 *)&pkt[2], values, length); + +retry: + ret = i2c_master_send(client , pkt , length + 2); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to send. ret:%d, try:%d\n", + __func__, ret, count + 1); + mdelay(1); + if (++count < I2C_RETRY_TIMES) + goto retry; + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +s32 write_reg(struct i2c_client *client, u16 reg, u16 value) +{ + if (write_data(client, reg, (u8 *)&value, 2) < 0) + return I2C_FAIL; + + return I2C_SUCCESS; +} + +s32 write_cmd(struct i2c_client *client, u16 reg) +{ + s32 ret; + int count = 0; + +retry: + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to send. ret:%d, try:%d\n", + __func__, ret, count + 1); + mdelay(1); + if (++count < I2C_RETRY_TIMES) + goto retry; + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return I2C_SUCCESS; +} + +static inline s32 read_raw_data(struct i2c_client *client, u16 reg, u8 *values, u16 length) +{ + s32 ret; + int count = 0; + +retry: + /* select register */ + ret = i2c_master_send(client , (u8 *)® , 2); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to send. ret:%d, try:%d\n", + __func__, ret, count + 1); + mdelay(1); + if (++count < I2C_RETRY_TIMES) + goto retry; + return ret; + } + + /* for setup tx transaction. */ + udelay(200); + + ret = i2c_master_recv(client , values , length); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to recv. ret:%d\n", __func__, ret); + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static inline s32 read_firmware_data(struct i2c_client *client, u16 addr, u8 *values, u16 length) +{ + s32 ret; + + ret = i2c_master_send(client , (u8 *)&addr , 2); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to send. ret:%d\n", __func__, ret); + return ret; + } + + /* for setup tx transaction. */ + mdelay(1); + + ret = i2c_master_recv(client , values , length); + if (ret < 0) { + dev_err(&client->dev, "%s: failed to recv. ret:%d\n", __func__, ret); + return ret; + } + + udelay(DELAY_FOR_POST_TRANSCATION); + return length; +} + +static void zt7554_set_optional_mode(struct zt7554_ts_info *info, bool force) +{ + if (m_prev_optional_mode == m_optional_mode && !force) + return; + + if (write_reg(info->client, ZT7554_OPTIONAL_SETTING, m_optional_mode) == I2C_SUCCESS) { + m_prev_optional_mode = m_optional_mode; + dev_info(&misc_info->client->dev, "TA setting changed to %d\n", + m_optional_mode & 0x1); + } +} +static void zt7554_set_ta_status(struct zt7554_ts_info *info) +{ + if (ta_connected) + zinitix_bit_set(m_optional_mode, 0); + else + zinitix_bit_clr(m_optional_mode, 0); +} + +void tsp_charger_enable(int status) +{ + status = (status != POWER_SUPPLY_TYPE_BATTERY); + + if (status) + ta_connected = true; + else + ta_connected = false; + + zt7554_set_ta_status(misc_info); + + dev_info(&misc_info->client->dev, "TA %s\n", + status ? "connected" : "disconnected"); +} +EXPORT_SYMBOL(tsp_charger_enable); + +static bool get_raw_data(struct zt7554_ts_info *info, u8 *buff, int skip_cnt) +{ + struct i2c_client *client = info->client; + struct zt7554_ts_platform_data *pdata = info->pdata; + u32 total_node = info->cap_info.total_node_num; + u32 sz; + int i; + + disable_irq(info->irq); + + down(&info->work_lock); + if (info->work_state != NOTHING) { + dev_err(&client->dev, "%s: other process occupied.\n", __func__); + enable_irq(info->irq); + up(&info->work_lock); + return false; + } + + info->work_state = RAW_DATA; + + for (i = 0; i < skip_cnt; i++) { + while (gpio_get_value(pdata->gpio_int)) + msleep(1); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + msleep(1); + } + + sz = total_node * 2; + + while (gpio_get_value(pdata->gpio_int)) + msleep(1); + + if (read_raw_data(client, ZT7554_RAWDATA_REG, (char *)buff, sz) < 0) { + dev_err(&info->client->dev, "error : read zinitix tc raw data\n"); + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + return false; + } + + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + + return true; +} + +static bool ts_get_raw_data(struct zt7554_ts_info *info) +{ + struct i2c_client *client = info->client; + u32 total_node = info->cap_info.total_node_num; + u32 sz; + + if (down_trylock(&info->raw_data_lock)) { + dev_err(&client->dev, "Failed to occupy sema\n"); + info->touch_info.status = 0; + return true; + } + + sz = total_node * 2 + sizeof(struct point_info); + + if (read_raw_data(info->client, ZT7554_RAWDATA_REG, (char *)info->cur_data, sz) < 0) { + dev_err(&client->dev, "Failed to read raw data\n"); + up(&info->raw_data_lock); + return false; + } + + info->update = 1; + memcpy((u8 *)(&info->touch_info), + (u8 *)&info->cur_data[total_node], sizeof(struct point_info)); + up(&info->raw_data_lock); + + return true; +} + +#if ZINITIX_I2C_CHECKSUM +#define ZINITIX_I2C_CHECKSUM_WCNT 0x016a +#define ZINITIX_I2C_CHECKSUM_RESULT 0x016c +static bool i2c_checksum(struct zt7554_ts_info *info, s16 *pChecksum, u16 wlength) +{ + s16 checksum_result; + s16 checksum_cur; + int i; + + checksum_cur = 0; + for (i = 0; i < wlength; i++) + checksum_cur += (s16)pChecksum[i]; + + if (read_data(info->client, ZINITIX_I2C_CHECKSUM_RESULT, (u8 *)(&checksum_result), 2) < 0) { + dev_err(&info->client->dev, "error read i2c checksum rsult.\n"); + return false; + } + if (checksum_cur != checksum_result) { + dev_err(&info->client->dev, "checksum error : %d, %d\n", checksum_cur, checksum_result); + return false; + } + return true; +} + +#endif + +static bool ts_read_coord(struct zt7554_ts_info *info) +{ + struct i2c_client *client = info->client; + + /* for Debugging Tool */ + if (info->touch_mode != TOUCH_POINT_MODE) { + if (info->update == 0) { + if (!ts_get_raw_data(info)) + return false; + } else + info->touch_info.status = 0; + dev_err(&client->dev, "status = 0x%04X\n", info->touch_info.status); + goto out; + } + +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) { + if (write_reg(info->client, ZINITIX_I2C_CHECKSUM_WCNT, + (sizeof(struct point_info)/2)) != I2C_SUCCESS) { + dev_err(&client->dev, "error write checksum wcnt.-\n"); + return false; + } + } +#endif + if (read_data(info->client, ZT7554_POINT_STATUS_REG, + (u8 *)(&info->touch_info), sizeof(struct point_info)) < 0) { + dev_err(&client->dev, "Failed to read point info\n"); + return false; + } +#if ZINITIX_I2C_CHECKSUM + if (info->cap_info.i2s_checksum) { + if (i2c_checksum(info, (s16 *)(&info->touch_info), + sizeof(struct point_info)/2) == false) + return false; + } +#endif + zt7554_set_optional_mode(info, false); +out: + if (zinitix_bit_test(info->touch_info.status, BIT_MUST_ZERO)) { + dev_err(&client->dev, "Invalid must zero bit(%04x)\n", info->touch_info.status); + return false; + } + write_cmd(info->client, ZT7554_CLEAR_INT_STATUS_CMD); + + return true; +} + +#if ESD_TIMER_INTERVAL +static void esd_timeout_handler(unsigned long data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)data; + + info->p_esd_timeout_tmr = NULL; + queue_work(esd_tmr_workqueue, &info->tmr_work); +} + +static void esd_timer_start(u16 sec, struct zt7554_ts_info *info) +{ + unsigned long flags; + spin_lock_irqsave(&info->lock, flags); + if (info->p_esd_timeout_tmr) +#ifdef CONFIG_SMP + del_singleshot_timer_sync(info->p_esd_timeout_tmr); +#else + del_timer(info->p_esd_timeout_tmr); +#endif + info->p_esd_timeout_tmr = NULL; + init_timer(&(info->esd_timeout_tmr)); + info->esd_timeout_tmr.data = (unsigned long)(info); + info->esd_timeout_tmr.function = esd_timeout_handler; + info->esd_timeout_tmr.expires = jiffies + (HZ * sec); + info->p_esd_timeout_tmr = &info->esd_timeout_tmr; + add_timer(&info->esd_timeout_tmr); + spin_unlock_irqrestore(&info->lock, flags); +} + +static void esd_timer_stop(struct zt7554_ts_info *info) +{ + unsigned long flags; + spin_lock_irqsave(&info->lock, flags); + if (info->p_esd_timeout_tmr) +#ifdef CONFIG_SMP + del_singleshot_timer_sync(info->p_esd_timeout_tmr); +#else + del_timer(info->p_esd_timeout_tmr); +#endif + + info->p_esd_timeout_tmr = NULL; + spin_unlock_irqrestore(&info->lock, flags); +} + +static void esd_timer_init(struct zt7554_ts_info *info) +{ + unsigned long flags; + spin_lock_irqsave(&info->lock, flags); + init_timer(&(info->esd_timeout_tmr)); + info->esd_timeout_tmr.data = (unsigned long)(info); + info->esd_timeout_tmr.function = esd_timeout_handler; + info->p_esd_timeout_tmr = NULL; + spin_unlock_irqrestore(&info->lock, flags); +} + +static void ts_tmr_work(struct work_struct *work) +{ + struct zt7554_ts_info *info = + container_of(work, struct zt7554_ts_info, tmr_work); + struct i2c_client *client = info->client; + + if (down_trylock(&info->work_lock)) { + dev_err(&client->dev, "%s: Failed to occupy work lock\n", __func__); + esd_timer_start(CHECK_ESD_TIMER, info); + return; + } + + if (info->work_state != NOTHING) { + dev_info(&client->dev, "%s: Other process occupied\n", __func__); + up(&info->work_lock); + return; + } + info->work_state = ESD_TIMER; + + disable_irq(info->irq); + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON_SEQUENCE); + + clear_report_data(info); + if (!mini_init_touch(info)) + goto fail_time_out_init; + + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + + return; +fail_time_out_init: + dev_err(&client->dev, "%s: Failed to restart\n", __func__); + esd_timer_start(CHECK_ESD_TIMER, info); + info->work_state = NOTHING; + enable_irq(info->irq); + up(&info->work_lock); + + return; +} +#endif + +static bool zt7554_power_sequence(struct zt7554_ts_info *info) +{ + struct i2c_client *client = info->client; + int retry = 0; + u16 chip_code; + +retry_power_sequence: + if (write_reg(client, 0xc000, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(vendor cmd enable)\n"); + goto fail_power_sequence; + } + udelay(10); + + if (read_data(client, 0xcc00, (u8 *)&chip_code, 2) < 0) { + dev_err(&client->dev, "Failed to read chip code\n"); + goto fail_power_sequence; + } + + dev_dbg(&client->dev, "%s: chip code = 0x%x\n", __func__, chip_code); + udelay(10); + + if (write_cmd(client, 0xc004) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(intn clear)\n"); + goto fail_power_sequence; + } + udelay(10); + + if (write_reg(client, 0xc002, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(nvm init)\n"); + goto fail_power_sequence; + } + mdelay(2); + + if (write_reg(client, 0xc001, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to send power sequence(program start)\n"); + goto fail_power_sequence; + } +#if 1 /* FIXME: temporary bringup code */ + msleep(FIRMWARE_ON_DELAY + 100); /* wait for checksum cal */ + //msleep(FIRMWARE_ON_DELAY); /* wait for checksum cal */ +#endif + + return true; + +fail_power_sequence: + if (retry++ < 3) { + msleep(CHIP_ON_DELAY); + dev_info(&client->dev, "retry = %d\n", retry); + goto retry_power_sequence; + } + + dev_err(&client->dev, "Failed to send power sequence\n"); + return false; +} + +static int zt7554_power(struct i2c_client *client, int on, int gpio_ctrl_pin) +{ + int ret; + static bool is_power_on; +#if 0 + if (!touch_regulator) { + //touch_regulator = regulator_get(&client->dev, "tsp_vdd"); + touch_regulator = regulator_get(NULL, "vddvibr"); + //touch_regulator = regulator_get(NULL, "vdd28"); + if (IS_ERR(touch_regulator)) { + touch_regulator = NULL; + dev_err(&client->dev, "regulator_get error!\n"); + return -EIO; + } + } + + if (on == POWER_OFF) { + //if (is_power_on && regulator_is_enabled(touch_regulator)) { + if (is_power_on) { + is_power_on = false; + ret = regulator_disable(touch_regulator); + dev_info(&client->dev, "power off!\n"); + if (ret) { + is_power_on = true; + dev_err(&client->dev, "power off error!\n"); + return -EIO; + } + mdelay(CHIP_OFF_DELAY); + } else + dev_err(&client->dev, "already power off!\n"); + } else { + //if (!is_power_on && !regulator_is_enabled(touch_regulator)) { + if (!is_power_on) { + is_power_on = true; + regulator_set_voltage(touch_regulator, 3300000, 3300000); + ret = regulator_enable(touch_regulator); + dev_info(&client->dev, "power on!\n"); + if (ret) { + is_power_on = false; + dev_err(&client->dev, "power on error!\n"); + return -EIO; + } + mdelay(CHIP_ON_DELAY + 100); + } else + dev_err(&client->dev, "already power on!\n"); + } +#else + if (on == POWER_OFF) { + if (is_power_on) { + is_power_on = false; + dev_info(&client->dev, "power off!\n"); + gpio_request(gpio_ctrl_pin,"tsp_enable"); + gpio_direction_output(gpio_ctrl_pin,1); + gpio_set_value(gpio_ctrl_pin,0); + mdelay(CHIP_OFF_DELAY); + } else + dev_err(&client->dev, "already power off!\n"); + } else { + if (!is_power_on) { + is_power_on = true; + dev_info(&client->dev, "power on!\n"); + gpio_request(gpio_ctrl_pin,"tsp_enable"); + gpio_direction_output(gpio_ctrl_pin,1); + gpio_set_value(gpio_ctrl_pin,1); + mdelay(CHIP_ON_DELAY + 100); + } else + dev_err(&client->dev, "already power on!\n"); + } +#endif + + return 0; +} +static bool zt7554_power_control(struct zt7554_ts_info *info, u8 ctl) +{ + int ret = 0; + + if (info->pdata->tsp_supply_type == TSP_REGULATOR_SUPPLY) { + ret = info->pdata->tsp_power(info->client, ctl, info->pdata->gpio_ctrl_pin); + if (ret) + return false; + if (ctl == POWER_ON_SEQUENCE) { + msleep(CHIP_ON_DELAY); + return zt7554_power_sequence(info); + } + } else { + if (ctl == POWER_OFF) { + gpio_direction_output(info->pdata->gpio_ldo_en, 0); + msleep(CHIP_OFF_DELAY); + } else { + gpio_direction_output(info->pdata->gpio_ldo_en, 1); + msleep(CHIP_ON_DELAY); + if (ctl == POWER_ON_SEQUENCE) + return zt7554_power_sequence(info); + } + } + return true; +} + +#if TOUCH_ONESHOT_UPGRADE +static bool ts_check_need_upgrade(struct zt7554_ts_info *info, + u16 cur_version, u16 cur_minor_version, u16 cur_reg_version, u16 cur_hw_id) +{ + u16 new_version; + u16 new_minor_version; + u16 new_reg_version; +#if CHECK_HWID + u16 new_hw_id; +#endif + new_version = (u16) (m_firmware_data[52] | (m_firmware_data[53]<<8)); + new_minor_version = (u16) (m_firmware_data[56] | (m_firmware_data[57]<<8)); + new_reg_version = (u16) (m_firmware_data[60] | (m_firmware_data[61]<<8)); + +#if CHECK_HWID + new_hw_id = (u16) (m_firmware_data[48] | (m_firmware_data[49]<<8)); + dev_dbg(&info->client->dev, "cur HW_ID = 0x%x, new HW_ID = 0x%x\n", + cur_hw_id, new_hw_id); +#endif + + dev_info(&info->client->dev, "cur version = 0x%x, new version = 0x%x\n", + cur_version, new_version); + dev_info(&info->client->dev, "cur minor version = 0x%x, new minor version = 0x%x\n", + cur_minor_version, new_minor_version); + dev_info(&info->client->dev, "cur reg data version = 0x%x, new reg data version = 0x%x\n", + cur_reg_version, new_reg_version); +#if 0 /* FIXME: temporary bringup code */ + return true; +#endif + + if (cal_mode) { + dev_info(&info->client->dev, "didn't update TSP F/W!! in CAL MODE\n"); + return false; + } + + if (cur_version > 0xFF) + return true; + if (cur_version < new_version) + return true; + else if (cur_version > new_version) + return false; +#if CHECK_HWID + if (cur_hw_id != new_hw_id) + return true; +#endif + if (cur_minor_version < new_minor_version) + return true; + else if (cur_minor_version > new_minor_version) + return false; + if (cur_reg_version < new_reg_version) + return true; + + return false; +} +#endif + +#define TC_SECTOR_SZ 8 + +static bool ts_upgrade_firmware(struct zt7554_ts_info *info, const u8 *firmware_data, u32 size) +{ + struct i2c_client *client = info->client; + u32 flash_addr; + u8 *verify_data; + int retry_cnt = 0; + int i; + int page_sz = 128; + u16 chip_code; + + verify_data = kzalloc(size, GFP_KERNEL); + if (!verify_data) { + dev_err(&client->dev, "cannot alloc verify buffer\n"); + return false; + } + +retry_upgrade: + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON); +#if 1 /* FIXME: temporary bringup code */ + mdelay(100); + //mdelay(10); +#endif + + if (write_reg(client, 0xc000, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "power sequence error (vendor cmd enable)\n"); + goto fail_upgrade; + } + + udelay(10); + + if (read_data(client, 0xcc00, (u8 *)&chip_code, 2) < 0) { + dev_err(&client->dev, "failed to read chip code\n"); + goto fail_upgrade; + } + + dev_info(&client->dev, "chip code = 0x%x\n", chip_code); + + udelay(10); + + if (write_cmd(client, 0xc004) != I2C_SUCCESS) { + dev_err(&client->dev, "power sequence error (intn clear)\n"); + goto fail_upgrade; + } + + udelay(10); + + if (write_reg(client, 0xc002, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "power sequence error (nvm init)\n"); + goto fail_upgrade; + } + + mdelay(5); + + dev_dbg(&client->dev, "init flash\n"); + + if (write_reg(client, 0xc003, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "failed to write nvm vpp on\n"); + goto fail_upgrade; + } + + if (write_reg(client, 0xc104, 0x0001) != I2C_SUCCESS) { + dev_err(&client->dev, "failed to write nvm wp disable\n"); + goto fail_upgrade; + } + + if (write_cmd(client, ZT7554_INIT_FLASH) != I2C_SUCCESS) { + dev_err(&client->dev, "failed to init flash\n"); + goto fail_upgrade; + } + + dev_info(&client->dev, "writing firmware data\n"); + for (flash_addr = 0; flash_addr < size; ) { + for (i = 0; i < page_sz/TC_SECTOR_SZ; i++) { + if (write_data(client, ZT7554_WRITE_FLASH, + (u8 *)&firmware_data[flash_addr], TC_SECTOR_SZ) < 0) { + dev_err(&client->dev, "error : write zinitix tc firmare\n"); + goto fail_upgrade; + } + flash_addr += TC_SECTOR_SZ; + udelay(100); + } + mdelay(10); /* for fuzing delay */ + } + + if (write_reg(client, 0xc003, 0x0000) != I2C_SUCCESS) { + dev_err(&client->dev, "nvm write vpp off\n"); + goto fail_upgrade; + } + + if (write_reg(client, 0xc104, 0x0000) != I2C_SUCCESS) { + dev_err(&client->dev, "nvm wp enable\n"); + goto fail_upgrade; + } + + dev_info(&client->dev, "init flash\n"); + + if (write_cmd(client, ZT7554_INIT_FLASH) != I2C_SUCCESS) { + dev_err(&client->dev, "failed to init flash\n"); + goto fail_upgrade; + } + + dev_info(&client->dev, "read firmware data\n"); + + for (flash_addr = 0; flash_addr < size; ) { + for (i = 0; i < page_sz/TC_SECTOR_SZ; i++) { + if (read_firmware_data(client, ZT7554_READ_FLASH, + (u8 *)&verify_data[flash_addr], TC_SECTOR_SZ) < 0) { + dev_err(&client->dev, "Failed to read firmare\n"); + goto fail_upgrade; + } + flash_addr += TC_SECTOR_SZ; + udelay(100); + } + } + + /* verify */ + dev_info(&client->dev, "verify firmware data\n"); + if (memcmp((u8 *)&firmware_data[0], (u8 *)&verify_data[0], size) == 0) { + dev_info(&client->dev, "upgrade finished\n"); + kfree(verify_data); + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON_SEQUENCE); + return true; + } + +fail_upgrade: + zt7554_power_control(info, POWER_OFF); + if (retry_cnt++ < INIT_RETRY_CNT) { + dev_err(&client->dev, "upgrade failed : so retry... (%d)\n", retry_cnt); + goto retry_upgrade; + } + + if (verify_data) + kfree(verify_data); + + dev_info(&client->dev, "Failed to upgrade\n"); + + return false; +} + +bool ts_hw_calibration(struct zt7554_ts_info *info) +{ + struct i2c_client *client = info->client; + u16 chip_eeprom_info; + int time_out = 0; + +#if 1 /* FIXME: temporary bringup code */ + return true; +#endif + + if (write_reg(client, ZT7554_TOUCH_MODE, 0x07) != I2C_SUCCESS) + return false; + mdelay(10); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + mdelay(10); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + mdelay(50); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + mdelay(10); + + if (write_cmd(client, ZT7554_CALIBRATE_CMD) != I2C_SUCCESS) + return false; + + if (write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD) != I2C_SUCCESS) + return false; + + mdelay(10); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + + /* wait for h/w calibration*/ + do { + mdelay(500); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + + if (read_data(client, ZT7554_EEPROM_INFO_REG, (u8 *)&chip_eeprom_info, 2) < 0) + return false; + + dev_dbg(&client->dev, "touch eeprom info = 0x%04X\n", chip_eeprom_info); + if (!zinitix_bit_test(chip_eeprom_info, 0)) + break; + + if (time_out++ == 4) { + write_cmd(client, ZT7554_CALIBRATE_CMD); + mdelay(10); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + dev_err(&client->dev, "h/w calibration retry timeout.\n"); + } + + if (time_out++ > 10) { + dev_err(&client->dev, "h/w calibration timeout.\n"); + break; + } + + } while (true); + + if (write_reg(client, ZT7554_TOUCH_MODE, TOUCH_POINT_MODE) != I2C_SUCCESS) + return false; + + if (info->cap_info.ic_int_mask) { + if (write_reg(client, ZT7554_INT_ENABLE_FLAG, info->cap_info.ic_int_mask) != I2C_SUCCESS) + return false; + } + + write_reg(client, 0xc003, 0x0001); + write_reg(client, 0xc104, 0x0001); + udelay(100); + if (write_cmd(client, ZT7554_SAVE_CALIBRATION_CMD) != I2C_SUCCESS) + return false; + + mdelay(1000); + write_reg(client, 0xc003, 0x0000); + write_reg(client, 0xc104, 0x0000); + return true; +} + +static bool init_touch(struct zt7554_ts_info *info) +{ + struct zt7554_ts_platform_data *pdata = info->pdata; + struct i2c_client *client = info->client; + struct capa_info *cap = &(info->cap_info); + u16 reg_val; + int i; + u16 chip_eeprom_info; +#if USE_CHECKSUM + u16 chip_check_sum; + bool checksum_err; +#endif + int retry_cnt = 0; + + info->ref_scale_factor = TSP_INIT_TEST_RATIO; +retry_init: + for (i = 0; i < INIT_RETRY_CNT; i++) { + if (read_data(client, ZT7554_EEPROM_INFO_REG, + (u8 *)&chip_eeprom_info, 2) < 0) { + dev_err(&client->dev, "Failed to read eeprom info(%d)\n", i); + mdelay(10); + continue; + } else + break; + } + + if (i == INIT_RETRY_CNT) + goto fail_init; + +#if USE_CHECKSUM + checksum_err = false; + + for (i = 0; i < INIT_RETRY_CNT; i++) { + if (read_data(client, ZT7554_CHECKSUM_RESULT, + (u8 *)&chip_check_sum, 2) < 0) { + mdelay(10); + continue; + } + + if (chip_check_sum != 0x55aa) + checksum_err = true; + break; + } + + if (i == INIT_RETRY_CNT || checksum_err) { + dev_err(&client->dev, "Failed to check firmware data\n"); + if (checksum_err && retry_cnt < INIT_RETRY_CNT) + retry_cnt = INIT_RETRY_CNT; + goto fail_init; + } +#endif + if (write_cmd(client, ZT7554_SWRESET_CMD) != I2C_SUCCESS) { + dev_err(&client->dev, "Failed to write reset command\n"); + goto fail_init; + } + + cap->button_num = SUPPORTED_BUTTON_NUM; + + reg_val = 0; + zinitix_bit_set(reg_val, BIT_PT_CNT_CHANGE); + zinitix_bit_set(reg_val, BIT_DOWN); + zinitix_bit_set(reg_val, BIT_MOVE); + zinitix_bit_set(reg_val, BIT_UP); + + if (cap->button_num > 0) + zinitix_bit_set(reg_val, BIT_ICON_EVENT); + + cap->ic_int_mask = reg_val; + + if (write_reg(client, ZT7554_INT_ENABLE_FLAG, 0x0) != I2C_SUCCESS) + goto fail_init; + + dev_dbg(&client->dev, "%s: Send reset command\n", __func__); + if (write_cmd(client, ZT7554_SWRESET_CMD) != I2C_SUCCESS) + goto fail_init; + + /* get chip information */ + if (read_data(client, ZT7554_VENDOR_ID, (u8 *)&cap->vendor_id, 2) < 0) { + dev_err(&client->dev, "failed to read vendor id\n"); + goto fail_init; + } + + if (read_data(client, ZT7554_CHIP_REVISION, (u8 *)&cap->ic_revision, 2) < 0) { + dev_err(&client->dev, "failed to read chip revision\n"); + goto fail_init; + } + + cap->ic_fw_size = 64 * 1024; + + if (read_data(client, ZT7554_HW_ID, (u8 *)&cap->hw_id, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_THRESHOLD, (u8 *)&cap->threshold, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_BUTTON_SENSITIVITY, (u8 *)&cap->key_threshold, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_DUMMY_BUTTON_SENSITIVITY, (u8 *)&cap->dummy_threshold, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_TOTAL_NUMBER_OF_X, (u8 *)&cap->x_node_num, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_TOTAL_NUMBER_OF_Y, (u8 *)&cap->y_node_num, 2) < 0) + goto fail_init; + + cap->total_node_num = cap->x_node_num * cap->y_node_num; + + if (read_data(client, ZT7554_DND_N_COUNT, (u8 *)&cap->N_cnt, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_DND_U_COUNT, (u8 *)&cap->u_cnt, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_AFE_FREQUENCY, (u8 *)&cap->afe_frequency, 2) < 0) + goto fail_init; + +#ifdef SUPPORTED_DND_SHIFT_VALUE + if (read_data(client, ZT7554_DND_SHIFT_VALUE, (u8 *)&cap->shift_value, 2) < 0) + goto fail_init; +#endif + + /* get chip firmware version */ + if (read_data(client, ZT7554_FIRMWARE_VERSION, (u8 *)&cap->fw_version, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_MINOR_FW_VERSION, (u8 *)&cap->fw_minor_version, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_DATA_VERSION_REG, (u8 *)&cap->reg_data_version, 2) < 0) + goto fail_init; + +#if TOUCH_ONESHOT_UPGRADE + if (ts_check_need_upgrade(info, cap->fw_version, + cap->fw_minor_version, cap->reg_data_version, cap->hw_id)) { + dev_info(&client->dev, "%s: start upgrade firmware\n", __func__); + + if (!ts_upgrade_firmware(info, m_firmware_data, cap->ic_fw_size)) + goto fail_init; + + if (!ts_hw_calibration(info)) + goto fail_init; + + /* disable chip interrupt */ + if (write_reg(client, ZT7554_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + + /* get chip firmware version */ + if (read_data(client, ZT7554_FIRMWARE_VERSION, (u8 *)&cap->fw_version, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_MINOR_FW_VERSION, (u8 *)&cap->fw_minor_version, 2) < 0) + goto fail_init; + + if (read_data(client, ZT7554_DATA_VERSION_REG, (u8 *)&cap->reg_data_version, 2) < 0) + goto fail_init; + } +#endif + + if (read_data(client, ZT7554_EEPROM_INFO_REG, (u8 *)&chip_eeprom_info, 2) < 0) + goto fail_init; + + if (zinitix_bit_test(chip_eeprom_info, 0)) { + if (!ts_hw_calibration(info)) + goto fail_init; + + /* disable chip interrupt */ + if (write_reg(client, ZT7554_INT_ENABLE_FLAG, 0) != I2C_SUCCESS) + goto fail_init; + } + + /* initialize */ + if (write_reg(client, ZT7554_X_RESOLUTION, (u16)pdata->x_resolution) != I2C_SUCCESS) + goto fail_init; + + if (write_reg(client, ZT7554_Y_RESOLUTION, (u16)pdata->y_resolution) != I2C_SUCCESS) + goto fail_init; + + cap->MinX = (u32)0; + cap->MinY = (u32)0; + cap->MaxX = (u32)pdata->x_resolution; + cap->MaxY = (u32)pdata->y_resolution; + + if (write_reg(client, ZT7554_BUTTON_SUPPORTED_NUM, (u16)cap->button_num) != I2C_SUCCESS) + goto fail_init; + + if (write_reg(client, ZT7554_SUPPORTED_FINGER_NUM, (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_init; + + cap->multi_fingers = MAX_SUPPORTED_FINGER_NUM; + cap->gesture_support = 0; + + if (write_reg(client, ZT7554_INITIAL_TOUCH_MODE, TOUCH_POINT_MODE) != I2C_SUCCESS) + goto fail_init; + + if (write_reg(client, ZT7554_TOUCH_MODE, info->touch_mode) != I2C_SUCCESS) + goto fail_init; + +#if ZINITIX_I2C_CHECKSUM + if (read_data(client, ZINITIX_INTERNAL_FLAG_02, (u8 *)®_val, 2) < 0) + goto fail_init; + cap->i2s_checksum = !(!zinitix_bit_test(reg_val, 15)); + dev_dbg(&client->dev, "use i2s checksum = %d\n", cap->i2s_checksum); +#endif + + zt7554_set_ta_status(info); + zt7554_set_optional_mode(info, true); + + if (write_reg(client, ZT7554_INT_ENABLE_FLAG, cap->ic_int_mask) != I2C_SUCCESS) + goto fail_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + udelay(10); + } + + if (info->touch_mode != TOUCH_POINT_MODE) { /* Test Mode */ + if (write_reg(client, ZT7554_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS) { + dev_err(&client->dev, "%s: Failed to set DELAY_RAW_FOR_HOST\n", __func__); + goto fail_init; + } + } +#if ESD_TIMER_INTERVAL + if (write_reg(client, ZT7554_PERIODICAL_INTERRUPT_INTERVAL, + SCAN_RATE_HZ * ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_init; + + read_data(client, ZT7554_PERIODICAL_INTERRUPT_INTERVAL, (u8 *)®_val, 2); +#endif + tsp_charger_status_cb = tsp_charger_enable; + + dev_info(&client->dev, "%s: initialize done!\n", __func__); + + return true; + +fail_init: + if (cal_mode) { + dev_err(&client->dev, "didn't update TSP F/W!! in CAL MODE\n"); + return false; + } + if (++retry_cnt <= INIT_RETRY_CNT) { + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON_SEQUENCE); + goto retry_init; + + } else if (retry_cnt == INIT_RETRY_CNT + 1) { + cap->ic_fw_size = 64 * 1024; +#if TOUCH_FORCE_UPGRADE + if (!ts_upgrade_firmware(info, m_firmware_data, cap->ic_fw_size)) { + dev_err(&client->dev, "firmware upgrade fail!\n"); + return false; + } + mdelay(100); + + /* hw calibration and make checksum */ + if (!ts_hw_calibration(info)) { + dev_err(&client->dev, "failed to initiallize\n"); + return false; + } + goto retry_init; +#endif + } + dev_err(&client->dev, "Failed to initiallize\n"); + + return false; +} + +static bool mini_init_touch(struct zt7554_ts_info *info) +{ + struct zt7554_ts_platform_data *pdata = info->pdata; + struct i2c_client *client = info->client; + int i; +#if USE_CHECKSUM + u16 chip_check_sum; + if (read_data(client, ZT7554_CHECKSUM_RESULT, (u8 *)&chip_check_sum, 2) < 0) + goto fail_mini_init; + + if (chip_check_sum != 0x55aa) { + dev_err(&client->dev, "Failed to check firmware\n"); + goto fail_mini_init; + } +#endif + info->ref_scale_factor = TSP_INIT_TEST_RATIO; + + if (write_cmd(client, ZT7554_SWRESET_CMD) != I2C_SUCCESS) { + dev_info(&client->dev, "Failed to write reset command\n"); + goto fail_mini_init; + } + + /* initialize */ + if (write_reg(client, ZT7554_X_RESOLUTION, (u16)(pdata->x_resolution)) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, ZT7554_Y_RESOLUTION, (u16)(pdata->y_resolution)) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, ZT7554_BUTTON_SUPPORTED_NUM, (u16)info->cap_info.button_num) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, ZT7554_SUPPORTED_FINGER_NUM, (u16)MAX_SUPPORTED_FINGER_NUM) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, ZT7554_INITIAL_TOUCH_MODE, TOUCH_POINT_MODE) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, ZT7554_TOUCH_MODE, info->touch_mode) != I2C_SUCCESS) + goto fail_mini_init; + + zt7554_set_ta_status(info); + zt7554_set_optional_mode(info, true); + + /* soft calibration */ + if (write_cmd(client, ZT7554_CALIBRATE_CMD) != I2C_SUCCESS) + goto fail_mini_init; + + if (write_reg(client, ZT7554_INT_ENABLE_FLAG, info->cap_info.ic_int_mask) != I2C_SUCCESS) + goto fail_mini_init; + + /* read garbage data */ + for (i = 0; i < 10; i++) { + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + udelay(10); + } + + if (info->touch_mode != TOUCH_POINT_MODE) { + if (write_reg(client, ZT7554_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS){ + dev_err(&client->dev, "Failed to set ZT7554_DELAY_RAW_FOR_HOST\n"); + goto fail_mini_init; + } + } + +#if ESD_TIMER_INTERVAL + if (write_reg(client, ZT7554_PERIODICAL_INTERRUPT_INTERVAL, + SCAN_RATE_HZ * ESD_TIMER_INTERVAL) != I2C_SUCCESS) + goto fail_mini_init; + + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + + dev_info(&client->dev, "Successfully mini initialized\r\n"); + return true; + +fail_mini_init: + dev_err(&client->dev, "Failed to initialize mini init\n"); + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON_SEQUENCE); + + if (!init_touch(info)) { + dev_err(&client->dev, "Failed to initialize\n"); + return false; + } + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + return true; +} + +static void clear_report_data(struct zt7554_ts_info *info) +{ + int i; + bool reported = false; + u8 sub_status; + + for (i = 0; i < info->cap_info.button_num; i++) { + if (info->button[i] == ICON_BUTTON_DOWN) { + info->button[i] = ICON_BUTTON_UP; + input_report_key(info->input_dev, BUTTON_MAPPING_KEY[i], 0); + reported = true; + } + } + + for (i = 0; i < info->cap_info.multi_fingers; i++) { + sub_status = info->reported_touch_info.coord[i].sub_status; + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, 0); + reported = true; + } + info->reported_touch_info.coord[i].sub_status = 0; + } + + if (reported) + input_sync(info->input_dev); + +} + +static irqreturn_t zt7554_touch_work(int irq, void *data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)data; + struct zt7554_ts_platform_data *pdata = info->pdata; + struct i2c_client *client = info->client; + int i; + u8 sub_status; + u8 prev_sub_status; + u32 x, y, maxX, maxY; + u32 w; + u32 tmp; + u8 palm = 0; + + + if (gpio_get_value(info->pdata->gpio_int)) { + dev_err(&client->dev, "Invalid interrupt\n"); + return IRQ_HANDLED; + } + + if (down_trylock(&info->work_lock)) { + dev_err(&client->dev, "%s: Failed to occupy work lock\n", __func__); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + return IRQ_HANDLED; + } +#if ESD_TIMER_INTERVAL + esd_timer_stop(info); +#endif + + if (info->work_state != NOTHING) { + dev_err(&client->dev, "%s: Other process occupied\n", __func__); + udelay(DELAY_FOR_SIGNAL_DELAY); + if (!gpio_get_value(info->pdata->gpio_int)) { + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + udelay(DELAY_FOR_SIGNAL_DELAY); + } + goto out; + } + info->work_state = NORMAL; + +#if ZINITIX_I2C_CHECKSUM + i = 0; + if (!ts_read_coord(info) || info->touch_info.status == 0xffff || info->touch_info.status == 0x1) { + for (i = 1; i < 50; i++) { + if (!(!ts_read_coord(info) || info->touch_info.status == 0xffff + || info->touch_info.status == 0x1)) + break; + } + } + + if (i == 50) { + dev_err(&client->dev, "Failed to read info coord\n"); + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON_SEQUENCE); + clear_report_data(info); + mini_init_touch(info); + goto out; + } +#else + if (!ts_read_coord(info) || info->touch_info.status == 0xffff || info->touch_info.status == 0x1) { + dev_err(&client->dev, "Failed to read info coord\n"); + zt7554_power_control(info, POWER_OFF); + zt7554_power_control(info, POWER_ON_SEQUENCE); + clear_report_data(info); + mini_init_touch(info); + goto out; + } +#endif + /* invalid : maybe periodical repeated int. */ + if (info->touch_info.status == 0x0) + goto out; + + if (zinitix_bit_test(info->touch_info.status, BIT_ICON_EVENT)) { + if (read_data(info->client, ZT7554_ICON_STATUS_REG, + (u8 *)(&info->icon_event_reg), 2) < 0) { + dev_err(&client->dev, "Failed to read button info\n"); + write_cmd(client, ZT7554_CLEAR_INT_STATUS_CMD); + goto out; + } + + for (i = 0; i < info->cap_info.button_num; i++) { + if (zinitix_bit_test(info->icon_event_reg, (BIT_O_ICON0_DOWN + i))) { + info->button[i] = ICON_BUTTON_DOWN; + input_report_key(info->input_dev, BUTTON_MAPPING_KEY[i], 1); + dev_info(&client->dev, "Button down\n"); + } + } + + for (i = 0; i < info->cap_info.button_num; i++) { + if (zinitix_bit_test(info->icon_event_reg, (BIT_O_ICON0_UP + i))) { + info->button[i] = ICON_BUTTON_UP; + input_report_key(info->input_dev, BUTTON_MAPPING_KEY[i], 0); + dev_info(&client->dev, "Button up\n"); + } + } + } + + for (i = 0; i < info->cap_info.multi_fingers; i++) { + sub_status = info->touch_info.coord[i].sub_status; + prev_sub_status = info->reported_touch_info.coord[i].sub_status; + + if (zinitix_bit_test(sub_status, SUB_BIT_EXIST)) { + x = info->touch_info.coord[i].x; + y = info->touch_info.coord[i].y; + w = info->touch_info.coord[i].width; + + /* transformation from touch to screen orientation */ + //if (pdata->orientation & TOUCH_V_FLIP) + // y = info->cap_info.MaxY + info->cap_info.MinY - y; + + //if (pdata->orientation & TOUCH_H_FLIP) + // x = info->cap_info.MaxX + info->cap_info.MinX - x; + + maxX = info->cap_info.MaxX; + maxY = info->cap_info.MaxY; +/* + if (pdata->orientation & TOUCH_XY_SWAP) { + zinitix_swap_v(x, y, tmp); + zinitix_swap_v(maxX, maxY, tmp); + } +*/ + info->touch_info.coord[i].x = x; + info->touch_info.coord[i].y = y; + if (zinitix_bit_test(sub_status, SUB_BIT_DOWN)) { +#if TOUCH_BOOSTER + if (!min_handle) { + min_handle = cpufreq_limit_min_freq(touch_cpufreq_lock, "TSP"); + if (IS_ERR(min_handle)) { + dev_err(&client->dev, "cannot get cpufreq_min lock\n"); + min_handle = NULL; + } + _store_cpu_num_min_limit(2); + dev_dbg(&client->dev, "cpu freq on\n"); + } + info->finger_cnt++; +#endif +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Finger [%02d] x = %d, y = %d," + " w = %d\n", i, x, y, w); +#else + dev_info(&client->dev, "Finger down\n"); +#endif + } + if (w == 0) + w = 1; + + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, 1); + + input_report_abs(info->input_dev, ABS_MT_TOUCH_MAJOR, (u32)w); + input_report_abs(info->input_dev, ABS_MT_PRESSURE, (u32)w); + input_report_abs(info->input_dev, ABS_MT_WIDTH_MAJOR, + (u32)((palm == 1) ? (w - 40) : w)); + input_report_abs(info->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(info->input_dev, ABS_MT_POSITION_Y, y); + } else if (zinitix_bit_test(sub_status, SUB_BIT_UP) || + zinitix_bit_test(prev_sub_status, SUB_BIT_EXIST)) { +#if TOUCH_BOOSTER + info->finger_cnt--; + if (!info->finger_cnt) { + cpufreq_limit_put(min_handle); + min_handle = NULL; + _store_cpu_num_min_limit(1); + dev_dbg(&client->dev, "cpu freq off\n"); + } +#endif + +#if !defined(CONFIG_SAMSUNG_PRODUCT_SHIP) + dev_info(&client->dev, "Finger [%02d] up\n", i); +#else + dev_info(&client->dev, "Finger up\n"); +#endif + memset(&info->touch_info.coord[i], 0x0, sizeof(struct coord)); + input_mt_slot(info->input_dev, i); + input_mt_report_slot_state(info->input_dev, MT_TOOL_FINGER, 0); + + } else + memset(&info->touch_info.coord[i], 0x0, sizeof(struct coord)); + } + memcpy((char *)&info->reported_touch_info, (char *)&info->touch_info, + sizeof(struct point_info)); + input_sync(info->input_dev); + +out: + if (info->work_state == NORMAL) { +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + info->work_state = NOTHING; + } + + up(&info->work_lock); + + return IRQ_HANDLED; +} + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zt7554_ts_late_resume(struct early_suspend *h) +{ + struct zt7554_ts_info *info = misc_info; + //struct capa_info *cap = &(info->cap_info); + + if (!info) + return; + + down(&info->work_lock); + if (info->work_state != RESUME && info->work_state != EALRY_SUSPEND) { + dev_err(&info->client->dev, "%s: invalid work proceedure\n", __func__); + up(&info->work_lock); + return; + } + zt7554_power_control(info, POWER_ON_SEQUENCE); + info->work_state = RESUME; + if (!mini_init_touch(info)) + goto fail_late_resume; + +#if 0 /* FIXME: below codes are not necessary */ + if (read_data(info->client, ZT7554_FIRMWARE_VERSION, (u8 *)&cap->fw_version, 2)); + if (read_data(info->client, ZT7554_MINOR_FW_VERSION, (u8 *)&cap->fw_minor_version, 2)); + if (read_data(info->client, ZT7554_DATA_VERSION_REG, (u8 *)&cap->reg_data_version, 2)); + if (read_data(info->client, ZT7554_HW_ID, (u8 *)&cap->hw_id, 2)); + if (read_data(info->client, ZT7554_VENDOR_ID, (u8 *)&cap->vendor_id, 2)); +#endif + + enable_irq(info->irq); + info->work_state = NOTHING; + up(&info->work_lock); + return; + +fail_late_resume: + dev_err(&info->client->dev, "failed to late resume\n"); + enable_irq(info->irq); + info->work_state = NOTHING; + up(&info->work_lock); + return; +} + +static void zt7554_ts_early_suspend(struct early_suspend *h) +{ + struct zt7554_ts_info *info = misc_info; + + if (!info) + return; + + disable_irq(info->irq); +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); +#endif + + down(&info->work_lock); + if (info->work_state != NOTHING) { + dev_err(&info->client->dev, "%s: invalid work proceedure\n", __func__); + up(&info->work_lock); + enable_irq(info->irq); + return; + } + info->work_state = EALRY_SUSPEND; + + clear_report_data(info); +#if ESD_TIMER_INTERVAL + write_reg(info->client, ZT7554_PERIODICAL_INTERRUPT_INTERVAL, 0); + esd_timer_stop(info); +#endif + + zt7554_power_control(info, POWER_OFF); +#if TOUCH_BOOSTER + if (min_handle) { + dev_err(&info->client->dev, "%s: Cpu was not in Normal Freq..\n", __func__); + if (cpufreq_limit_put(min_handle) < 0) + dev_err(&info->client->dev, "Error in scaling down cpu frequency\n"); + min_handle = NULL; + info->finger_cnt = 0; + dev_dbg(&info->client->dev, "cpu freq off\n"); + } +#endif + up(&info->work_lock); + return; +} +#endif /* CONFIG_HAS_EARLYSUSPEND */ + +#if defined(CONFIG_PM) +static int zt7554_ts_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct zt7554_ts_info *info = i2c_get_clientdata(client); + //struct capa_info *cap = &(info->cap_info); + + down(&info->work_lock); + if (info->work_state != SUSPEND) { + dev_err(&client->dev, "%s: Invalid work proceedure\n", __func__); + up(&info->work_lock); + return 0; + } + zt7554_power_control(info, POWER_ON_SEQUENCE); + +#ifdef CONFIG_HAS_EARLYSUSPEND + info->work_state = RESUME; +#else + info->work_state = NOTHING; + if (!mini_init_touch(info)) + dev_err(&client->dev, "Failed to resume\n"); +#if 0 /* FIXME: below codes are not necessary */ + if (read_data(client, ZT7554_FIRMWARE_VERSION, (u8 *)&cap->fw_version, 2)); + if (read_data(client, ZT7554_MINOR_FW_VERSION, (u8 *)&cap->fw_minor_version, 2)); + if (read_data(client, ZT7554_DATA_VERSION_REG, (u8 *)&cap->reg_data_version, 2)); + if (read_data(client, ZT7554_HW_ID, (u8 *)&cap->hw_id, 2)); + if (read_data(client, ZT7554_VENDOR_ID, (u8 *)&cap->vendor_id, 2)); +#endif + enable_irq(info->irq); +#endif + + up(&info->work_lock); + + return 0; +} + +static int zt7554_ts_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct zt7554_ts_info *info = i2c_get_clientdata(client); + +#ifndef CONFIG_HAS_EARLYSUSPEND + disable_irq(info->irq); +#endif +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); +#endif + + down(&info->work_lock); + if (info->work_state != NOTHING && info->work_state != SUSPEND) { + dev_err(&client->dev, "%s: Invalid work proceedure\n", __func__); + up(&info->work_lock); +#ifndef CONFIG_HAS_EARLYSUSPEND + enable_irq(info->irq); +#endif + return 0; + } + +#ifndef CONFIG_HAS_EARLYSUSPEND + clear_report_data(info); +#if ESD_TIMER_INTERVAL + esd_timer_stop(info); +#endif +#endif + write_cmd(info->client, ZT7554_SLEEP_CMD); + zt7554_power_control(info, POWER_OFF); + info->work_state = SUSPEND; + + up(&info->work_lock); + + return 0; +} +#endif + +bool ts_set_touchmode(u16 value) +{ + int i; + u16 N_cnt; + u16 U_cnt; + u16 freq; + u16 reg_val; + + disable_irq(misc_info->irq); + + down(&misc_info->work_lock); + if (misc_info->work_state != NOTHING) { + dev_err(&misc_info->client->dev, "other process occupied.\n"); + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + return -1; + } + + misc_info->work_state = SET_MODE; + + /* SDND mode */ + if (value == TOUCH_DND_MODE) { + N_cnt = SEC_SDND_N_COUNT; + U_cnt = SEC_SDND_U_COUNT; + freq = SEC_SDND_FREQUENCY; + read_data(misc_info->client, 0x011e, (u8 *)®_val, 2); + zinitix_bit_clr(reg_val, 1); + write_reg(misc_info->client, 0x011e, reg_val); +#ifdef SUPPORTED_DND_SHIFT_VALUE + if (write_reg(misc_info->client, ZT7554_DND_SHIFT_VALUE, + SEC_DND_SHIFT_VALUE) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set SDND_SHIFT_VALUE\n"); +#endif + if (write_reg(misc_info->client, ZT7554_DND_N_COUNT, N_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_SDND_N_COUNT %d.\n", N_cnt); + if (write_reg(misc_info->client, ZT7554_DND_U_COUNT, U_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_SDND_U_COUNT %d.\n", U_cnt); + if (write_reg(misc_info->client, ZT7554_AFE_FREQUENCY, freq) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_SAFE_FREQUENCY %d.\n", freq); + } else if (value == TOUCH_PDND_MODE) { /* DND mode */ + N_cnt = SEC_SDND_N_COUNT; + U_cnt = SEC_SDND_U_COUNT; + freq = SEC_SDND_FREQUENCY; + read_data(misc_info->client, 0x011e, (u8 *)®_val, 2); + zinitix_bit_clr(reg_val, 1); + write_reg(misc_info->client, 0x011e, reg_val); + + if (write_reg(misc_info->client, ZT7554_DND_N_COUNT, N_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_DND_N_COUNT %d.\n", N_cnt); + if (write_reg(misc_info->client, ZT7554_DND_U_COUNT, U_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_DND_U_COUNT %d.\n", U_cnt); + if (write_reg(misc_info->client, ZT7554_AFE_FREQUENCY, freq) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_AFE_FREQUENCY %d.\n", freq); + } + + else if (misc_info->touch_mode == TOUCH_DND_MODE || misc_info->touch_mode == TOUCH_PDND_MODE) { +#ifdef SUPPORTED_DND_SHIFT_VALUE + if (write_reg(misc_info->client, ZT7554_DND_SHIFT_VALUE, + misc_info->cap_info.shift_value) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Failed to set DND_SHIFT_VALUE\n"); +#endif + if (write_reg(misc_info->client, ZT7554_DND_N_COUNT, + misc_info->cap_info.N_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to reset ZT7554_AFE_FREQUENCY %d.\n", + misc_info->cap_info.N_cnt); + if (write_reg(misc_info->client, ZT7554_DND_U_COUNT, + misc_info->cap_info.u_cnt) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to reset ZT7554_DND_U_COUNT %d.\n", + misc_info->cap_info.u_cnt); + if (write_reg(misc_info->client, ZT7554_AFE_FREQUENCY, + misc_info->cap_info.afe_frequency) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to reset ZT7554_AFE_FREQUENCY %d.\n", + misc_info->cap_info.afe_frequency); + } + + if (value == TOUCH_SEC_MODE) + misc_info->touch_mode = TOUCH_POINT_MODE; + else + misc_info->touch_mode = value; + + if (misc_info->touch_mode != TOUCH_POINT_MODE) { + if (write_reg(misc_info->client, ZT7554_DELAY_RAW_FOR_HOST, + RAWDATA_DELAY_FOR_HOST) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZT7554_DELAY_RAW_FOR_HOST\n"); + } + + if (write_reg(misc_info->client, ZT7554_TOUCH_MODE, + misc_info->touch_mode) != I2C_SUCCESS) + dev_err(&misc_info->client->dev, "Fail to set ZINITX_TOUCH_MODE\n"); + + /* clear garbage data */ + for (i = 0; i < 10; i++) { + mdelay(20); + write_cmd(misc_info->client, ZT7554_CLEAR_INT_STATUS_CMD); + } + + misc_info->work_state = NOTHING; + enable_irq(misc_info->irq); + up(&misc_info->work_lock); + + return 1; +} + +int ts_upgrade_sequence(const u8 *firmware_data) +{ + disable_irq(misc_info->irq); + down(&misc_info->work_lock); + misc_info->work_state = UPGRADE; + +#if ESD_TIMER_INTERVAL + esd_timer_stop(misc_info); +#endif + clear_report_data(misc_info); + + dev_info(&misc_info->client->dev, "start upgrade firmware\n"); + if (!ts_upgrade_firmware(misc_info, firmware_data, misc_info->cap_info.ic_fw_size)) { + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return -1; + } + + if (!init_touch(misc_info)) { + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + return -1; + } + +#if ESD_TIMER_INTERVAL + esd_timer_start(CHECK_ESD_TIMER, misc_info); +#endif + enable_irq(misc_info->irq); + misc_info->work_state = NOTHING; + up(&misc_info->work_lock); + + return 0; +} + +#ifdef SEC_FACTORY_TEST +#define TSP_CMD(name, func) .cmd_name = name, .cmd_func = func + +static struct tsp_cmd tsp_cmds[] = { + {TSP_CMD("fw_update", fw_update),}, + {TSP_CMD("get_fw_ver_bin", get_fw_ver_bin),}, + {TSP_CMD("get_fw_ver_ic", get_fw_ver_ic),}, + {TSP_CMD("get_threshold", get_threshold),}, + {TSP_CMD("get_chip_vendor", get_chip_vendor),}, + {TSP_CMD("get_chip_name", get_chip_name),}, + {TSP_CMD("get_x_num", get_x_num),}, + {TSP_CMD("get_y_num", get_y_num),}, + {TSP_CMD("not_support_cmd", not_support_cmd),}, + + /* vendor dependant command */ + {TSP_CMD("run_reference_read", run_reference_read),}, + {TSP_CMD("run_reference_diff", run_reference_PDiff),}, + {TSP_CMD("get_reference", get_reference),}, + {TSP_CMD("run_dnd_read", run_preference_read),}, + {TSP_CMD("get_dnd", get_preference),}, + {TSP_CMD("run_delta_read", run_delta_read),}, + {TSP_CMD("get_delta", get_delta),}, +}; + +static inline void set_cmd_result(struct zt7554_ts_info *info, char *buff, int len) +{ + strncat(info->factory_info->cmd_result, buff, len); +} + +static inline void set_default_result(struct zt7554_ts_info *info) +{ + char delim = ':'; + memset(info->factory_info->cmd_result, 0x00, ARRAY_SIZE(info->factory_info->cmd_result)); + memcpy(info->factory_info->cmd_result, info->factory_info->cmd, strlen(info->factory_info->cmd)); + strncat(info->factory_info->cmd_result, &delim, 1); +} + +static void fw_update(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + int ret = 0; + const u8 *buff = 0; + mm_segment_t old_fs = {0}; + struct file *fp = NULL; + long fsize = 0, nread = 0; + char result[16] = {0}; + + set_default_result(info); + + switch (info->factory_info->cmd_param[0]) { + case BUILT_IN: + ret = ts_upgrade_sequence((u8 *)m_firmware_data); + if (ret < 0) { + info->factory_info->cmd_state = FAIL; + return; + } + break; + case UMS: + old_fs = get_fs(); + set_fs(KERNEL_DS); + + fp = filp_open(info->pdata->ext_fw_name, O_RDONLY, S_IRUSR); + if (IS_ERR(fp)) { + dev_err(&client->dev, "file open error:%d\n", (s32)fp); + info->factory_info->cmd_state = FAIL; + goto err_open; + } + + fsize = fp->f_path.dentry->d_inode->i_size; + + if (fsize != info->cap_info.ic_fw_size) { + dev_err(&client->dev, "invalid fw size!!\n"); + info->factory_info->cmd_state = FAIL; + goto err_open; + } + + buff = kzalloc((size_t)fsize, GFP_KERNEL); + if (!buff) { + dev_err(&client->dev, "failed to alloc buffer for fw\n"); + info->factory_info->cmd_state = FAIL; + goto err_alloc; + } + + nread = vfs_read(fp, (char __user *)buff, fsize, &fp->f_pos); + if (nread != fsize) { + info->factory_info->cmd_state = FAIL; + goto err_fw_size; + } + + filp_close(fp, current->files); + set_fs(old_fs); + dev_info(&client->dev, "ums fw is loaded!!\n"); + + ret = ts_upgrade_sequence((u8 *)buff); + if (ret < 0) { + kfree(buff); + info->factory_info->cmd_state = FAIL; + goto update_fail; + } + break; + + default: + dev_err(&client->dev, "invalid fw file type!!\n"); + goto update_fail; + } + + info->factory_info->cmd_state = OK; + snprintf(result, sizeof(result) , "%s", "OK"); + set_cmd_result(info, result, strnlen(result, sizeof(result))); + kfree(buff); + + return; + + +if (fp != NULL) { +err_fw_size: + kfree(buff); +err_alloc: + filp_close(fp, NULL); +err_open: + set_fs(old_fs); +} +update_fail: + snprintf(result, sizeof(result) , "%s", "NG"); + set_cmd_result(info, result, strnlen(result, sizeof(result))); +} + +static void get_fw_ver_bin(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + u16 fw_version, fw_minor_version, reg_version, hw_id, vendor_id; + u32 version, length; + + set_default_result(info); + + fw_version = (u16)(m_firmware_data[52] | (m_firmware_data[53] << 8)); + fw_minor_version = (u16)(m_firmware_data[56] | (m_firmware_data[57] << 8)); + reg_version = (u16)(m_firmware_data[60] | (m_firmware_data[61] << 8)); + hw_id = (u16)(m_firmware_data[48] | (m_firmware_data[49] << 8)); + version = (u32)((u32)(hw_id & 0xff) << 16) | ((fw_version & 0xf) << 12) + | ((fw_minor_version & 0xf) << 8) | (reg_version & 0xff); + + length = sizeof(vendor_id); + snprintf(finfo->cmd_buff, length + 1, "%s", "ZI"); + snprintf(finfo->cmd_buff + length, sizeof(finfo->cmd_buff) - length, "%06X", version); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_fw_ver_ic(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + u16 fw_version, fw_minor_version, reg_version, hw_id, vendor_id; + u32 version, length; + + set_default_result(info); + + fw_version = info->cap_info.fw_version; + fw_minor_version = info->cap_info.fw_minor_version; + reg_version = info->cap_info.reg_data_version; + hw_id = info->cap_info.hw_id; + vendor_id = ntohs(info->cap_info.vendor_id); + version = (u32)((u32)(hw_id & 0xff) << 16) | ((fw_version & 0xf) << 12) + | ((fw_minor_version & 0xf) << 8) | (reg_version & 0xff); + + length = sizeof(vendor_id); + snprintf(finfo->cmd_buff, length + 1, "%s", (u8 *)&vendor_id); + snprintf(finfo->cmd_buff + length, sizeof(finfo->cmd_buff) - length, "%06X", version); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_threshold(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%d", info->cap_info.threshold); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +#define ZT7554_VENDOR_NAME "ZINITIX" + +static void get_chip_vendor(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", ZT7554_VENDOR_NAME); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +#define ZT7554_CHIP_NAME "ZT7554" + +static void get_chip_name(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", ZT7554_CHIP_NAME); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_x_num(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%u", info->cap_info.x_node_num); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void get_y_num(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), + "%u", info->cap_info.y_node_num); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void not_support_cmd(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + set_default_result(info); + + sprintf(finfo->cmd_buff, "%s", "NA"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = NOT_APPLICABLE; + + dev_dbg(&client->dev, "%s: \"%s(%d)\"\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void run_reference_read(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + u32 min, max; + s32 i, j; + + set_default_result(info); + + ts_set_touchmode(TOUCH_DND_MODE); + get_raw_data(info, (u8 *)raw_data->ref_data, 10); + ts_set_touchmode(TOUCH_POINT_MODE); + + min = raw_data->ref_data[0]; + max = raw_data->ref_data[0]; + + for (i = 0; i < info->cap_info.x_node_num; i++) { + for (j = 0; j < info->cap_info.y_node_num; j++) { + dev_dbg(&client->dev, "ref_data[%d] : %d\n", i * info->cap_info.y_node_num + j, + raw_data->ref_data[i * info->cap_info.y_node_num + j]); + + if (raw_data->ref_data[i * info->cap_info.y_node_num + j] < min && + raw_data->ref_data[i * info->cap_info.y_node_num + j] != 0) + min = raw_data->ref_data[i * info->cap_info.y_node_num + j]; + + if (raw_data->ref_data[i * info->cap_info.y_node_num + j] > max) + max = raw_data->ref_data[i * info->cap_info.y_node_num + j]; + + } + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%d,%d\n", min, max); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: \"%s\"(%d)\n", __func__, finfo->cmd_buff, + strlen(finfo->cmd_buff)); + + return; +} + +#define PDIFF_DEBUG 1 +#if PDIFF_DEBUG +int print_diff[29*18] = {0,}; +#endif + +static bool run_reference_PDiff_read(void *device_data, const u16 h_diff[][17], + const u16 v_diff[][18], int bHidden1, int bMenu, int bBack, int bHidden2) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + int i, j, diff_val, pre_val, next_val, x_num, y_num; + bool pass = true; + int buttons[4] = {bHidden1, bMenu, bBack, bHidden2}; + + ts_set_touchmode(TOUCH_PDND_MODE); + get_raw_data(info, (u8 *)info->dnd_data, 10); + ts_set_touchmode(TOUCH_POINT_MODE); + + x_num = info->cap_info.x_node_num; + y_num = info->cap_info.y_node_num; +#if PDIFF_DEBUG + printk(KERN_DEBUG "%s : ++++++ DND SPEC +++++++++\n", __func__); + for (i = 0; i < x_num; i++) { + printk(KERN_DEBUG "%s : ", __func__); + for (j = 0; j < y_num; j++) + printk(KERN_DEBUG "%5d ", info->dnd_data[i*y_num+j]); + printk(KERN_DEBUG "\n"); + } +#endif + printk(KERN_DEBUG "%s : ------- DND SPEC ----------\n", __func__); + printk(KERN_DEBUG "%s : TSP Diff test scale factor = %d\n", __func__, info->ref_scale_factor); + printk(KERN_DEBUG "%s : H Diff start\n", __func__); + + /* H DIff */ + info->hdiff_max_x = info->hdiff_max_y = info->hdiff_min_x = info->hdiff_min_y = 0; + info->hdiff_max_val = -32768; + info->hdiff_min_val = 32767; + + for (i = 0; i < x_num - 1; i++) { + for (j = 0; j < y_num - 1; j++) { + printk(KERN_DEBUG "%d ", info->dnd_data[i*info->cap_info.y_node_num+j]); + next_val = info->dnd_data[(i*y_num)+(j+1)]; + pre_val = info->dnd_data[(i*y_num)+j]; + diff_val = (next_val > pre_val) ? (next_val - pre_val) : (pre_val - next_val); + pre_val = (info->ref_scale_factor == 100) ? ((s16)h_diff[i][j]) : + ((s16)(((s32)h_diff[i][j] * info->ref_scale_factor) / 100)); + if (diff_val > pre_val) + pass = false; +#if PDIFF_DEBUG + print_diff[i * y_num + j] = diff_val; +#endif + if (info->hdiff_max_val < diff_val) { + info->hdiff_max_val = diff_val; + info->hdiff_max_x = i; + info->hdiff_max_y = j + 1; + } + if (info->hdiff_min_val > diff_val) { + info->hdiff_min_val = diff_val; + info->hdiff_min_x = i; + info->hdiff_min_y = j + 1; + } + } + printk(KERN_DEBUG "\n"); + } +#if PDIFF_DEBUG + printk(KERN_DEBUG "%s : ++++++ h_diff SPEC +++++++++\n", __func__); + for (i = 0; i < x_num - 1; i++) { + printk(KERN_DEBUG "%s : ", __func__); + for (j = 0; j < y_num - 1; j++) + printk(KERN_DEBUG "%5d ", (u16)h_diff[i][j]); + printk(KERN_DEBUG "\n"); + } + printk(KERN_DEBUG "%s : ------- h_diff SPEC ----------\n", __func__); + printk(KERN_DEBUG "%s : ++++++ calculated h_diff SPEC +++++++++\n", __func__); + for (i = 0; i < x_num-1; i++) { + printk(KERN_DEBUG "%s : ", __func__); + for (j = 0; j < y_num-1; j++) + printk(KERN_DEBUG "%5d ", print_diff[i * y_num + j]); + printk(KERN_DEBUG "\n"); + } + printk(KERN_DEBUG "%s : ------- calculated h_diff SPEC ----------\n", __func__); +#endif + printk(KERN_DEBUG "%s :", __func__); + printk(KERN_DEBUG "H diff %s\n", pass ? "pass" : "fail"); + + printk(KERN_DEBUG "%s : V Diff start\n", __func__); + info->vdiff_max_x = info->vdiff_max_y = info->vdiff_min_x = info->vdiff_min_y = 0; + info->vdiff_max_val = -32768; + info->vdiff_min_val = 32767; + + /* V DIff View */ + for (i = 0; i < x_num - 2; i++) { + for (j = 0; j < y_num; j++) { + printk(KERN_DEBUG "%d ", info->dnd_data[i * info->cap_info.y_node_num + j]); + next_val = info->dnd_data[(i * y_num) + j]; + pre_val = info->dnd_data[(i * y_num) + j + y_num]; + diff_val = (next_val > pre_val) ? (next_val - pre_val) : (pre_val - next_val); + pre_val = (info->ref_scale_factor == 100) ? ((s16)v_diff[i][j]) : + ((s16)(((s32)v_diff[i][j] * info->ref_scale_factor) / 100)); + if (diff_val > pre_val) + pass = false; +#if PDIFF_DEBUG + print_diff[i * y_num + j] = diff_val; +#endif + if (info->vdiff_max_val < diff_val) { + info->vdiff_max_val = diff_val; + info->vdiff_max_x = i; + info->vdiff_max_y = j + 1; + } + if (info->vdiff_min_val > diff_val) { + info->vdiff_min_val = diff_val; + info->vdiff_min_x = i; + info->vdiff_min_y = j + 1; + } + } + printk(KERN_DEBUG "\n"); + } + printk(KERN_DEBUG "%s : ", __func__); + printk(KERN_DEBUG "V Diff view %s\n", pass ? "pass" : "fail"); + +#if PDIFF_DEBUG + printk(KERN_DEBUG "%s : ++++++ v_diff SPEC +++++++++\n", __func__); + for (i = 0; i < x_num - 2; i++) { + printk(KERN_DEBUG "%s : ", __func__); + for (j = 0; j < y_num; j++) + printk(KERN_DEBUG "%5d ", (u16)v_diff[i][j]); + printk(KERN_DEBUG "\n"); + } + printk(KERN_DEBUG "%s : ------- v_diff SPEC ----------\n", __func__); + printk(KERN_DEBUG "%s : ++++++ calculated v_diff SPEC +++++++++\n", __func__); + for (i = 0; i < x_num - 2; i++) { + printk(KERN_DEBUG "%s : ", __func__); + for (j = 0; j < y_num; j++) + printk(KERN_DEBUG "%5d ", print_diff[i * y_num + j]); + printk(KERN_DEBUG "\n"); + } + printk(KERN_DEBUG "%s : ------- calculated v_diff SPEC ----------\n", __func__); +#endif + + /* V DIff button */ + if (info->cap_info.button_num) { + printk(KERN_DEBUG "%s : TSP Button scale = %d\n", __func__, info->ref_scale_factor); + printk(KERN_DEBUG "%s : TSP Button Diff Spec. = %d %d %d %d\n", __func__, + v_diff[x_num-2][buttons[0]], v_diff[x_num-2][buttons[1]], + v_diff[x_num-2][buttons[2]], v_diff[x_num-2][buttons[3]]); + + for (i = 0; i < 4; i++) { + int nButton = buttons[i]; + if (nButton < 0) + continue; + next_val = info->dnd_data[(x_num - 1) * y_num + nButton]; + pre_val = info->dnd_data[(x_num - 2) * y_num + nButton]; + diff_val = (next_val > pre_val) ? (next_val - pre_val) : (pre_val - next_val); + pre_val = (info->ref_scale_factor == 100) ? + ((s16)v_diff[x_num - 2][nButton] + info->ref_btn_option) : + ((s16)(((s32)v_diff[x_num - 2][nButton] * info->ref_scale_factor) / 100) + + info->ref_btn_option); + + if (diff_val > pre_val) { + pass = false; + if (info->vdiff_max_val < diff_val) { + info->vdiff_max_val = diff_val; + info->vdiff_max_x = x_num - 1; + info->vdiff_max_y = nButton; + } + if (info->vdiff_min_val > diff_val) { + info->vdiff_min_val = diff_val; + info->vdiff_min_x = x_num - 1; + info->vdiff_min_y = nButton; + } + } +#if PDIFF_DEBUG + printk(KERN_DEBUG "%s : ", __func__); + printk(KERN_DEBUG "buttons[%d]'s diff_val is %d\n", i, diff_val); +#endif + } + } + printk(KERN_DEBUG "%s : ", __func__); + printk(KERN_DEBUG "Button Diff %s\n", pass ? "pass" : "fail"); + + return pass; +} + + + +static void run_reference_PDiff(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct tsp_factory_info *finfo = info->factory_info; + char buff[40] = {0}; + bool check; + + finfo->cmd_state = RUNNING; + set_default_result(info); + + dev_dbg(&info->client->dev, "run_ref_diff check hw_id = 0x%04X\n", info->cap_info.hw_id); + + check = run_reference_PDiff_read(device_data, dnd_h_diff_00, dnd_v_diff_00, -1, 4, 13, -1); + if (check) { + dev_dbg(&info->client->dev, "diff pass\n"); + sprintf(buff, "%d,%d,%d,%d,pass\n", info->hdiff_min_val, + info->hdiff_max_val, info->vdiff_min_val, info->vdiff_max_val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = OK; + } else { + dev_dbg(&info->client->dev, "diff fail\n"); + sprintf(buff, "%d,%d,%d,%d,fail\n", info->vdiff_min_val, + info->vdiff_max_val, info->vdiff_min_val, info->vdiff_max_val); + set_cmd_result(info, buff, strnlen(buff, sizeof(buff))); + finfo->cmd_state = FAIL; + } + +} +static void get_reference(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + unsigned int val; + int x_node, y_node; + int node_num; + + set_default_result(info); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= info->cap_info.x_node_num || + y_node < 0 || y_node >= info->cap_info.y_node_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "abnormal"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = FAIL; + return; + } + + node_num = x_node * info->cap_info.y_node_num + y_node; + + val = raw_data->ref_data[node_num]; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void run_preference_read(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + u16 min, max; + s32 i, j; + + set_default_result(info); + + ts_set_touchmode(TOUCH_PDND_MODE); + get_raw_data(info, (u8 *)raw_data->pref_data, 10); + ts_set_touchmode(TOUCH_POINT_MODE); + + min = 0xFFFF; + max = 0x0000; + + for (i = 0; i < info->cap_info.x_node_num; i++) { + for (j = 0; j < info->cap_info.y_node_num; j++) { + dev_dbg(&client->dev, "pref_data[%d]: %d\n", + i * info->cap_info.y_node_num + j, + raw_data->pref_data[i * info->cap_info.y_node_num + j]); + if (raw_data->pref_data[i * info->cap_info.y_node_num + j] < min && + raw_data->pref_data[i * info->cap_info.y_node_num + j] != 0) + min = raw_data->pref_data[i * info->cap_info.y_node_num + j]; + + if (raw_data->pref_data[i * info->cap_info.y_node_num + j] > max) + max = raw_data->pref_data[i * info->cap_info.y_node_num + j]; + + } + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%d,%d\n", min, max); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: \"%s\"(%d)\n", __func__, finfo->cmd_buff, + strlen(finfo->cmd_buff)); + + return; +} + +static void get_preference(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + unsigned int val; + int x_node, y_node; + int node_num; + + set_default_result(info); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= info->cap_info.x_node_num || + y_node < 0 || y_node >= info->cap_info.y_node_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "abnormal"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = FAIL; + return; + } + + node_num = x_node * info->cap_info.y_node_num + y_node; + + val = raw_data->pref_data[node_num]; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static void run_delta_read(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + s16 min, max; + s32 i, j; + + set_default_result(info); + + ts_set_touchmode(TOUCH_DELTA_MODE); + get_raw_data(info, (u8 *)(u8 *)raw_data->delta_data, 10); + ts_set_touchmode(TOUCH_POINT_MODE); + finfo->cmd_state = OK; + + min = (s16)0x7FFF; + max = (s16)0x8000; + + for (i = 0; i < info->cap_info.x_node_num; i++) { + for (j = 0; j < info->cap_info.y_node_num; j++) { + dev_dbg(&client->dev, "delta_data[%d]: %d\n", + j + i, raw_data->delta_data[j + i]); + if (raw_data->delta_data[i * info->cap_info.y_node_num + j] < min && + raw_data->delta_data[i * info->cap_info.y_node_num + j] != 0) + min = raw_data->delta_data[i * info->cap_info.y_node_num + j]; + if (raw_data->delta_data[i * info->cap_info.y_node_num + j] > max) + max = raw_data->delta_data[i * info->cap_info.y_node_num + j]; + + } + } + + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%d,%d\n", min, max); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + finfo->cmd_state = OK; + + dev_info(&client->dev, "%s: \"%s\"(%d)\n", __func__, finfo->cmd_buff, + strlen(finfo->cmd_buff)); + + return; +} + +static void get_delta(void *device_data) +{ + struct zt7554_ts_info *info = (struct zt7554_ts_info *)device_data; + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + struct tsp_raw_data *raw_data = info->raw_data; + unsigned int val; + int x_node, y_node; + int node_num; + + set_default_result(info); + + x_node = finfo->cmd_param[0]; + y_node = finfo->cmd_param[1]; + + if (x_node < 0 || x_node >= info->cap_info.x_node_num || + y_node < 0 || y_node >= info->cap_info.y_node_num) { + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%s", "abnormal"); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = FAIL; + return; + } + + node_num = x_node * info->cap_info.y_node_num + y_node; + + val = raw_data->delta_data[node_num]; + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "%u", val); + set_cmd_result(info, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + info->factory_info->cmd_state = OK; + + dev_dbg(&client->dev, "%s: %s(%d)\n", __func__, finfo->cmd_buff, + strnlen(finfo->cmd_buff, sizeof(finfo->cmd_buff))); + + return; +} + +static ssize_t store_cmd(struct device *dev, struct device_attribute + *devattr, const char *buf, size_t count) +{ + struct zt7554_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + char *cur, *start, *end; + char buff[TSP_CMD_STR_LEN] = {0}; + int len, i; + struct tsp_cmd *tsp_cmd_ptr = NULL; + char delim = ','; + bool cmd_found = false; + int param_cnt = 0; + + if (finfo->cmd_is_running == true) { + dev_err(&client->dev, "%s: other cmd is running\n", __func__); + goto err_out; + } + + /* check lock */ + mutex_lock(&finfo->cmd_lock); + finfo->cmd_is_running = true; + mutex_unlock(&finfo->cmd_lock); + + finfo->cmd_state = RUNNING; + + for (i = 0; i < ARRAY_SIZE(finfo->cmd_param); i++) + finfo->cmd_param[i] = 0; + + len = (int)count; + if (*(buf + len - 1) == '\n') + len--; + + memset(finfo->cmd, 0x00, ARRAY_SIZE(finfo->cmd)); + memcpy(finfo->cmd, buf, len); + + cur = strchr(buf, (int)delim); + if (cur) + memcpy(buff, buf, cur - buf); + else + memcpy(buff, buf, len); + + /* find command */ + list_for_each_entry(tsp_cmd_ptr, &finfo->cmd_list_head, list) { + if (!strcmp(buff, tsp_cmd_ptr->cmd_name)) { + cmd_found = true; + break; + } + } + + /* set not_support_cmd */ + if (!cmd_found) { + list_for_each_entry(tsp_cmd_ptr, &finfo->cmd_list_head, list) { + if (!strcmp("not_support_cmd", tsp_cmd_ptr->cmd_name)) + break; + } + } + + /* parsing parameters */ + if (cur && cmd_found) { + cur++; + start = cur; + memset(buff, 0x00, ARRAY_SIZE(buff)); + do { + if (*cur == delim || cur - buf == len) { + end = cur; + memcpy(buff, start, end - start); + *(buff + strlen(buff)) = '\0'; + finfo->cmd_param[param_cnt] = (int)simple_strtol(buff, NULL, 10); + start = cur + 1; + memset(buff, 0x00, ARRAY_SIZE(buff)); + param_cnt++; + } + cur++; + } while (cur - buf <= len); + } + + dev_dbg(&client->dev, "cmd = %s\n", tsp_cmd_ptr->cmd_name); + + tsp_cmd_ptr->cmd_func(info); + + mutex_lock(&finfo->cmd_lock); + finfo->cmd_is_running = false; + mutex_unlock(&finfo->cmd_lock); + +err_out: + return count; +} + +static ssize_t show_cmd_status(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct zt7554_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + dev_dbg(&client->dev, "tsp cmd: status:%d\n", finfo->cmd_state); + + if (finfo->cmd_state == WAITING) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "WAITING"); + else if (finfo->cmd_state == RUNNING) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "RUNNING"); + else if (finfo->cmd_state == OK) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "OK"); + else if (finfo->cmd_state == FAIL) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "FAIL"); + else if (finfo->cmd_state == NOT_APPLICABLE) + snprintf(finfo->cmd_buff, sizeof(finfo->cmd_buff), "NOT_APPLICABLE"); + + return snprintf(buf, sizeof(finfo->cmd_buff), "%s\n", finfo->cmd_buff); +} + +static ssize_t show_cmd_result(struct device *dev, struct device_attribute *devattr, char *buf) +{ + struct zt7554_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct tsp_factory_info *finfo = info->factory_info; + + dev_dbg(&client->dev, "tsp cmd: result: %s\n", finfo->cmd_result); + + finfo->cmd_state = WAITING; + + return snprintf(buf, sizeof(finfo->cmd_result), "%s\n", finfo->cmd_result); +} + +static DEVICE_ATTR(cmd, S_IWUSR | S_IWGRP, NULL, store_cmd); +static DEVICE_ATTR(cmd_status, S_IRUGO, show_cmd_status, NULL); +static DEVICE_ATTR(cmd_result, S_IRUGO, show_cmd_result, NULL); + +static struct attribute *touchscreen_attributes[] = { + &dev_attr_cmd.attr, + &dev_attr_cmd_status.attr, + &dev_attr_cmd_result.attr, + NULL, +}; + +static struct attribute_group touchscreen_attr_group = { + .attrs = touchscreen_attributes, +}; + +#ifdef SUPPORTED_TOUCH_KEY +static ssize_t show_touchkey_threshold(struct device *dev, struct device_attribute *attr, char *buf) +{ + struct zt7554_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + struct capa_info *cap = &(info->cap_info); + + dev_dbg(&client->dev, "%s: key threshold = %d\n", __func__, cap->key_threshold); + + return snprintf(buf, 41, "%d", cap->key_threshold); +#endif +} + +static ssize_t show_touchkey_sensitivity(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct zt7554_ts_info *info = dev_get_drvdata(dev); + struct i2c_client *client = info->client; + u16 val; + int ret; + int i; + + if (!strcmp(attr->attr.name, "touchkey_recent")) + i = 0; + else if (!strcmp(attr->attr.name, "touchkey_back")) + i = 1; + else { + dev_err(&client->dev, "%s: Invalid attribute\n", __func__); + goto err_out; + } + ret = read_data(client, ZT7554_BTN_WIDTH + i, (u8 *)&val, 2); + if (ret < 0) { + dev_err(&client->dev, "failed to read %d's key sensitivity\n", i); + goto err_out; + } + + dev_info(&client->dev, "%d's key sensitivity = %d\n", i, val); + + return snprintf(buf, 6, "%d", val); + +err_out: + return sprintf(buf, "NG"); +} + +static DEVICE_ATTR(touchkey_threshold, S_IRUGO, show_touchkey_threshold, NULL); +static DEVICE_ATTR(touchkey_recent, S_IRUGO, show_touchkey_sensitivity, NULL); +static DEVICE_ATTR(touchkey_back, S_IRUGO, show_touchkey_sensitivity, NULL); +static struct attribute *touchkey_attributes[] = { + &dev_attr_touchkey_threshold.attr, + &dev_attr_touchkey_back.attr, + &dev_attr_touchkey_recent.attr, + NULL, +}; +static struct attribute_group touchkey_attr_group = { + .attrs = touchkey_attributes, +}; + +static int init_sec_factory(struct zt7554_ts_info *info) +{ + struct device *factory_ts_dev; +#ifdef SUPPORTED_TOUCH_KEY + struct device *factory_tk_dev; +#endif + struct tsp_factory_info *factory_info; + struct tsp_raw_data *raw_data; + int ret; + int i; + + factory_info = kzalloc(sizeof(struct tsp_factory_info), GFP_KERNEL); + if (unlikely(!factory_info)) { + dev_err(&info->client->dev, "failed to allocate factory_info\n"); + ret = -ENOMEM; + goto err_alloc1; + } + + raw_data = kzalloc(sizeof(struct tsp_raw_data), GFP_KERNEL); + if (unlikely(!raw_data)) { + dev_err(&info->client->dev, "failed to allocate raw_data\n"); + ret = -ENOMEM; + goto err_alloc2; + } + + INIT_LIST_HEAD(&factory_info->cmd_list_head); + for (i = 0; i < ARRAY_SIZE(tsp_cmds); i++) + list_add_tail(&tsp_cmds[i].list, &factory_info->cmd_list_head); + + factory_ts_dev = device_create(sec_class, NULL, 0, info, "tsp"); + if (unlikely(!factory_ts_dev)) { + dev_err(&info->client->dev, "ailed to create factory dev\n"); + ret = -ENODEV; + goto err_create_device; + } + +#ifdef SUPPORTED_TOUCH_KEY + factory_tk_dev = device_create(sec_class, NULL, 0, info, "sec_touchkey"); + if (IS_ERR(factory_tk_dev)) { + dev_err(&info->client->dev, "failed to create factory dev\n"); + ret = -ENODEV; + goto err_create_device; + } +#endif + + ret = sysfs_create_group(&factory_ts_dev->kobj, &touchscreen_attr_group); + if (unlikely(ret)) { + dev_err(&info->client->dev, "Failed to create touchscreen sysfs group\n"); + goto err_create_sysfs; + } + +#ifdef SUPPORTED_TOUCH_KEY + ret = sysfs_create_group(&factory_tk_dev->kobj, &touchkey_attr_group); + if (unlikely(ret)) { + dev_err(&info->client->dev, "Failed to create touchkey sysfs group\n"); + goto err_create_sysfs; + } +#endif + + mutex_init(&factory_info->cmd_lock); + factory_info->cmd_is_running = false; + + info->factory_info = factory_info; + info->raw_data = raw_data; + + return ret; + +err_create_sysfs: +err_create_device: + kfree(raw_data); +err_alloc2: + kfree(factory_info); +err_alloc1: + + return ret; +} +#endif /* end of SEC_FACTORY_TEST */ + +#ifdef CONFIG_OF +static const struct of_device_id tsp_dt_ids[] = { + { .compatible = "Zinitix,zt7554_ts", }, + {}, +}; +MODULE_DEVICE_TABLE(of, tsp_dt_ids); +#else +#define tsp_dt_ids NULL +#endif + +static int zt7554_ts_probe_dt(struct device_node *np, struct device *dev, + struct zt7554_ts_platform_data *pdata) +{ + int ret; + + if (!np) + return -EINVAL; + + /* gpio irq */ + pdata->gpio_int = of_get_named_gpio(np, "gpios", 0); + if (pdata->gpio_int < 0) { + dev_err(dev, "failed to get irq number\n"); + return -EINVAL; + } + ret = gpio_request(pdata->gpio_int, "zt7554_irq"); + if (ret < 0) { + dev_err(dev, "failed to request gpio_irq\n"); + return -EINVAL; + } + gpio_direction_input(pdata->gpio_int); + +#if 0 /* FIXME: use *.h format firmware file */ + /* built-in firmware */ + ret = of_property_read_string(np, "zt7554,fw_name", &pdata->fw_name); + if (ret < 0) { + dev_err(dev, "failed to get built-in firmware path\n"); + return -EINVAL; + } +#endif + + /* external firmware */ + ret = of_property_read_string(np, "zt7554,ext_fw_name", &pdata->ext_fw_name); + if (ret < 0) { + dev_err(dev, "failed to get external firmware path!\n"); + return -EINVAL; + } + + ret = of_property_read_u32(np, "zt7554,x_resolution", &pdata->x_resolution); + if (ret < 0) { + dev_err(dev, "failed to get x_resolution\n"); + return ret; + } + + ret = of_property_read_u32(np, "zt7554,y_resolution", &pdata->y_resolution); + if (ret < 0) { + dev_err(dev, "failed to get y_resolution\n"); + return ret; + } + + ret = of_property_read_u32(np, "zt7554,supply_type", &pdata->tsp_supply_type); + if (ret < 0) { + dev_err(dev, "failed to get tsp supply type. default: regulator\n"); + pdata->tsp_supply_type = TSP_REGULATOR_SUPPLY; + } + + ret = of_property_read_u32(np, "gpio_ctrl_pin", &pdata->gpio_ctrl_pin); + if (ret < 0) { + dev_err(dev, "failed to get tsp control pin\n"); + pdata->gpio_ctrl_pin = -1; + } + +// pdata->orientation = 4; + pdata->tsp_power = zt7554_power; + return 0; + +} +static int zt7554_ts_probe(struct i2c_client *client, const struct i2c_device_id *i2c_id) +{ + struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); + struct zt7554_ts_platform_data *pdata = client->dev.platform_data; + struct zt7554_ts_info *info; + struct input_dev *input_dev; + int ret = -1; + int i; + struct device_node *np = client->dev.of_node; + + if (IS_ENABLED(CONFIG_OF)) { + if (!pdata) { + pdata = devm_kzalloc(&client->dev, + sizeof(*pdata), GFP_KERNEL); + if (!pdata) + return -ENOMEM; + } + ret = zt7554_ts_probe_dt(np, &client->dev, pdata); + if (ret) + goto err_no_platform_data; + + } else if (!pdata) { + dev_err(&client->dev, "Not exist platform data\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "Not compatible i2c function\n"); + ret = -EIO; + goto err_no_platform_data; + } + + info = kzalloc(sizeof(struct zt7554_ts_info), GFP_KERNEL); + if (!info) { + dev_err(&client->dev, "Failed to allocate memory\n"); + ret = -ENOMEM; + goto err_no_platform_data; + } + + i2c_set_clientdata(client, info); + info->client = client; + info->pdata = pdata; + + input_dev = input_allocate_device(); + if (!input_dev) { + dev_err(&client->dev, "Failed to allocate input device\n"); + goto err_alloc; + } + + info->input_dev = input_dev; + info->work_state = PROBE; + + /* power on */ + if (!zt7554_power_control(info, POWER_ON_SEQUENCE)) { + ret = -EPERM; + goto err_power_sequence; + } + + memset(&info->reported_touch_info, 0x0, sizeof(struct point_info)); + + /* init touch mode */ + info->touch_mode = TOUCH_POINT_MODE; + misc_info = info; + + if (!init_touch(info)) + goto err_input_unregister_device; + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + info->button[i] = ICON_BUTTON_UNCHANGE; + + snprintf(info->phys, sizeof(info->phys), "%s/input0", dev_name(&client->dev)); + input_dev->name = "sec_touchscreen"; + input_dev->id.bustype = BUS_I2C; + input_dev->phys = info->phys; + input_dev->dev.parent = &client->dev; + + set_bit(EV_SYN, info->input_dev->evbit); + set_bit(EV_KEY, info->input_dev->evbit); + set_bit(EV_ABS, info->input_dev->evbit); + set_bit(INPUT_PROP_DIRECT, info->input_dev->propbit); + + for (i = 0; i < MAX_SUPPORTED_BUTTON_NUM; i++) + set_bit(BUTTON_MAPPING_KEY[i], info->input_dev->keybit); + + if (pdata->orientation & TOUCH_XY_SWAP) { + input_set_abs_params(info->input_dev, ABS_MT_POSITION_Y, + info->cap_info.MinX, info->cap_info.MaxX + ABS_PT_OFFSET, 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_POSITION_X, + info->cap_info.MinY, info->cap_info.MaxY + ABS_PT_OFFSET, 0, 0); + } else { + input_set_abs_params(info->input_dev, ABS_MT_POSITION_X, + info->cap_info.MinX, info->cap_info.MaxX + ABS_PT_OFFSET, 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_POSITION_Y, + info->cap_info.MinY, info->cap_info.MaxY + ABS_PT_OFFSET, 0, 0); + } + + input_set_abs_params(info->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(info->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + + set_bit(MT_TOOL_FINGER, info->input_dev->keybit); + input_mt_init_slots(info->input_dev, info->cap_info.multi_fingers, 0); + + input_set_drvdata(info->input_dev, info); + ret = input_register_device(info->input_dev); + if (ret) { + dev_err(&info->client->dev, "unable to register input device\n"); + goto err_input_register_device; + } + + info->work_state = NOTHING; +#if TOUCH_BOOSTER + info->finger_cnt = 0; +#endif + sema_init(&info->work_lock, 1); + +#if ESD_TIMER_INTERVAL + spin_lock_init(&info->lock); + INIT_WORK(&info->tmr_work, ts_tmr_work); + esd_tmr_workqueue = + create_singlethread_workqueue("esd_tmr_workqueue"); + + if (!esd_tmr_workqueue) { + dev_err(&client->dev, "Failed to create esd tmr work queue\n"); + ret = -EPERM; + goto err_esd_input_unregister_device; + } + + esd_timer_init(info); + esd_timer_start(CHECK_ESD_TIMER, info); +#endif + info->irq = gpio_to_irq(pdata->gpio_int); + if (info->irq < 0) { + dev_err(&client->dev, "failed to get gpio_to_irq\n"); + goto err_gpio_irq; + } + ret = request_threaded_irq(info->irq, NULL, zt7554_touch_work, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT , ZT7554_TS_DEVICE, info); + + if (ret) { + dev_err(&client->dev, "failed to request irq.\n"); + goto err_request_irq; + } + sprd_i2c_ctl_chg_clk(1, 400000); /* up h/w i2c 1 400k */ +#ifdef CONFIG_HAS_EARLYSUSPEND + info->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + info->early_suspend.suspend = zt7554_ts_early_suspend; + info->early_suspend.resume = zt7554_ts_late_resume; + register_early_suspend(&info->early_suspend); +#endif + +#if defined(CONFIG_PM_RUNTIME) + pm_runtime_enable(&client->dev); +#endif + + sema_init(&info->raw_data_lock, 1); + +#if ZINITIX_MISC_DEBUG + ret = misc_register(&touch_misc_device); + if (ret) { + dev_err(&client->dev, "Failed to register touch misc device\n"); + goto err_misc_register; + } +#endif + +#ifdef SEC_FACTORY_TEST + ret = init_sec_factory(info); + if (ret) { + dev_err(&client->dev, "Failed to init sec factory device\n"); + + goto err_kthread_create_failed; + } +#endif + dev_info(&client->dev, "zinitix touch probe done.\n"); + + return 0; + +#ifdef SEC_FACTORY_TEST +err_kthread_create_failed: + kfree(info->factory_info); + kfree(info->raw_data); +#endif +#if ZINITIX_MISC_DEBUG +err_misc_register: +#endif + free_irq(info->irq, info); +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&info->early_suspend); +#endif +err_request_irq: +err_gpio_irq: +#if ESD_TIMER_INTERVAL +err_esd_input_unregister_device: +#endif +err_input_unregister_device: + input_unregister_device(info->input_dev); +err_input_register_device: + tsp_charger_status_cb = NULL; +err_power_sequence: + input_free_device(info->input_dev); +err_alloc: + kfree(info); +err_no_platform_data: + if (IS_ENABLED(CONFIG_OF)) + devm_kfree(&client->dev, (void *)pdata); + + dev_info(&client->dev, "Failed to probe\n"); + return ret; +} + +static int zt7554_ts_remove(struct i2c_client *client) +{ + struct zt7554_ts_info *info = i2c_get_clientdata(client); + struct zt7554_ts_platform_data *pdata = info->pdata; + + disable_irq(info->irq); + down(&info->work_lock); + + info->work_state = REMOVE; + +#ifdef SEC_FACTORY_TEST + kfree(info->factory_info); + kfree(info->raw_data); +#endif +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); + write_reg(info->client, ZT7554_PERIODICAL_INTERRUPT_INTERVAL, 0); + esd_timer_stop(info); + destroy_workqueue(esd_tmr_workqueue); +#endif + + if (info->irq) + free_irq(info->irq, info); + +#if ZINITIX_MISC_DEBUG + misc_deregister(&touch_misc_device); +#endif + +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&info->early_suspend); +#endif + + if (gpio_is_valid(pdata->gpio_int) != 0) + gpio_free(pdata->gpio_int); + + tsp_charger_status_cb = NULL; + + input_unregister_device(info->input_dev); + input_free_device(info->input_dev); + up(&info->work_lock); + kfree(info); + + return 0; +} + +void zt7554_ts_shutdown(struct i2c_client *client) +{ + struct zt7554_ts_info *info = i2c_get_clientdata(client); + + disable_irq(info->irq); + down(&info->work_lock); +#if ESD_TIMER_INTERVAL + flush_work(&info->tmr_work); + esd_timer_stop(info); +#endif + up(&info->work_lock); + zt7554_power_control(info, POWER_OFF); +} + +static struct i2c_device_id zt7554_idtable[] = { + {ZT7554_TS_DEVICE, 0}, + { } +}; + +static const struct dev_pm_ops zt7554_ts_pm_ops = { +#if defined(CONFIG_PM_RUNTIME) + SET_RUNTIME_PM_OPS(zt7554_ts_suspend, zt7554_ts_resume, NULL) +#else + .suspend = zt7554_ts_suspend, + .resume = zt7554_ts_resume, +#endif +}; + +static struct i2c_driver zt7554_ts_driver = { + .probe = zt7554_ts_probe, + .remove = zt7554_ts_remove, + .shutdown = zt7554_ts_shutdown, + .id_table = zt7554_idtable, + .driver = { + .owner = THIS_MODULE, + .name = ZT7554_TS_DEVICE, + .of_match_table = tsp_dt_ids, +#ifndef CONFIG_HAS_EARLYSUSPEND + .pm = &zt7554_ts_pm_ops, +#endif + }, +}; + +static int __init zt7554_ts_init(void) +{ + return i2c_add_driver(&zt7554_ts_driver); +} + +static void __exit zt7554_ts_exit(void) +{ + i2c_del_driver(&zt7554_ts_driver); +} + +module_init(zt7554_ts_init); +module_exit(zt7554_ts_exit); + +MODULE_DESCRIPTION("touch-screen device driver using i2c interface"); +MODULE_AUTHOR(""); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/zt7554_ts.h b/drivers/input/touchscreen/zt7554_ts.h new file mode 100755 index 00000000..398fb135 --- /dev/null +++ b/drivers/input/touchscreen/zt7554_ts.h @@ -0,0 +1,516 @@ +/* + * + * Zinitix zt7554 touch driver + * + * Copyright (C) 2013 Samsung Electronics Co.Ltd + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif +#if defined(CONFIG_PM_RUNTIME) +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define TOUCH_BOOSTER 0 + +#if TOUCH_BOOSTER +#include +#include +extern int _store_cpu_num_min_limit(unsigned int input); +struct cpufreq_limit_handle *min_handle = NULL; +static const unsigned long touch_cpufreq_lock = 1200000; +#endif + + +#define SEC_FACTORY_TEST +#define SUPPORTED_TOUCH_KEY + +#define TS_DRVIER_VERSION "1.0.18_1" +#define ZT7554_TS_DEVICE "zt7554_ts" + +#define TOUCH_POINT_MODE 0 +#define ZINITIX_MISC_DEBUG 0 +#define CHECK_HWID 0 +#define ZINITIX_DEBUG 0 +#define ZINITIX_I2C_CHECKSUM 1 +#define TSP_INIT_TEST_RATIO 100 +#define MAX_SUPPORTED_FINGER_NUM 5 /* max 10 */ + +#ifdef SUPPORTED_TOUCH_KEY +#ifdef NOT_SUPPORTED_TOUCH_DUMMY_KEY +#define MAX_SUPPORTED_BUTTON_NUM 2 /* max 8 */ +#define SUPPORTED_BUTTON_NUM 2 +#else +#define MAX_SUPPORTED_BUTTON_NUM 6 /* max 8 */ +#define SUPPORTED_BUTTON_NUM 4 +#endif +#endif + +/* Upgrade Method*/ +#define TOUCH_ONESHOT_UPGRADE 1 +/* resolution offset */ +#define ABS_PT_OFFSET (-1) +#define TOUCH_FORCE_UPGRADE 1 +#define USE_CHECKSUM 1 +#define CHIP_OFF_DELAY 50 /*ms*/ +#define CHIP_ON_DELAY 100 /*ms*/ +#define FIRMWARE_ON_DELAY 150 /*ms*/ +#define DELAY_FOR_SIGNAL_DELAY 30 /*us*/ +#define DELAY_FOR_TRANSCATION 50 +#define DELAY_FOR_POST_TRANSCATION 10 +#define RAWDATA_DELAY_FOR_HOST 100 + +/* PMIC Regulator based supply to TSP */ +#define TSP_REGULATOR_SUPPLY 1 +/* gpio controlled LDO based supply to TSP */ +#define TSP_LDO_SUPPLY 0 + +/* ESD Protection */ +/*second : if 0, no use. if you have to use, 3 is recommended*/ +#define ESD_TIMER_INTERVAL 1 +#define SCAN_RATE_HZ 100 +#define CHECK_ESD_TIMER 3 + +/*Test Mode (Monitoring Raw Data) */ +#ifdef SUPPORTED_DND_SHIFT_VALUE +#define SEC_DND_SHIFT_VALUE 3 +#endif + +//SDND +#define SEC_SDND_N_COUNT 20 +#define SEC_SDND_U_COUNT 1 +#define SEC_SDND_FREQUENCY 77 /* 307khz */ + +//PDND +#define SEC_PDND_N_COUNT 16 +#define SEC_PDND_U_COUNT 14 +#define SEC_PDND_FREQUENCY 79 + +#define MAX_RAW_DATA_SZ 32*22 +#define MAX_TRAW_DATA_SZ \ + (MAX_RAW_DATA_SZ + 4*MAX_SUPPORTED_FINGER_NUM + 2) + + +#define TOUCH_SEC_MODE 48 +#define TOUCH_REF_MODE 10 +#define TOUCH_NORMAL_MODE 5 +#define TOUCH_DELTA_MODE 3 +#define TOUCH_DND_MODE 6 +#define TOUCH_PDND_MODE 11 + +#define PALM_REPORT_WIDTH 200 +#define PALM_REJECT_WIDTH 255 + +#define TOUCH_V_FLIP 0x01 +#define TOUCH_H_FLIP 0x02 +#define TOUCH_XY_SWAP 0x04 + +#define TSP_NORMAL_EVENT_MSG 1 +#define I2C_RETRY_TIMES 8 + +/* Other Things */ +#define INIT_RETRY_CNT 1 +#define I2C_SUCCESS 0 +#define I2C_FAIL 1 + +#define TOUCH_IOCTL_BASE 0xbc +#define TOUCH_IOCTL_GET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 0, int) +#define TOUCH_IOCTL_SET_DEBUGMSG_STATE _IOW(TOUCH_IOCTL_BASE, 1, int) +#define TOUCH_IOCTL_GET_CHIP_REVISION _IOW(TOUCH_IOCTL_BASE, 2, int) +#define TOUCH_IOCTL_GET_FW_VERSION _IOW(TOUCH_IOCTL_BASE, 3, int) +#define TOUCH_IOCTL_GET_REG_DATA_VERSION _IOW(TOUCH_IOCTL_BASE, 4, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_SIZE _IOW(TOUCH_IOCTL_BASE, 5, int) +#define TOUCH_IOCTL_VARIFY_UPGRADE_DATA _IOW(TOUCH_IOCTL_BASE, 6, int) +#define TOUCH_IOCTL_START_UPGRADE _IOW(TOUCH_IOCTL_BASE, 7, int) +#define TOUCH_IOCTL_GET_X_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 8, int) +#define TOUCH_IOCTL_GET_Y_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 9, int) +#define TOUCH_IOCTL_GET_TOTAL_NODE_NUM _IOW(TOUCH_IOCTL_BASE, 10, int) +#define TOUCH_IOCTL_SET_RAW_DATA_MODE _IOW(TOUCH_IOCTL_BASE, 11, int) +#define TOUCH_IOCTL_GET_RAW_DATA _IOW(TOUCH_IOCTL_BASE, 12, int) +#define TOUCH_IOCTL_GET_X_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 13, int) +#define TOUCH_IOCTL_GET_Y_RESOLUTION _IOW(TOUCH_IOCTL_BASE, 14, int) +#define TOUCH_IOCTL_HW_CALIBRAION _IOW(TOUCH_IOCTL_BASE, 15, int) +#define TOUCH_IOCTL_GET_REG _IOW(TOUCH_IOCTL_BASE, 16, int) +#define TOUCH_IOCTL_SET_REG _IOW(TOUCH_IOCTL_BASE, 17, int) +#define TOUCH_IOCTL_SEND_SAVE_STATUS _IOW(TOUCH_IOCTL_BASE, 18, int) +#define TOUCH_IOCTL_DONOT_TOUCH_EVENT _IOW(TOUCH_IOCTL_BASE, 19, int) + +/* Register Map*/ +#define ZT7554_SWRESET_CMD 0x0000 +#define ZT7554_WAKEUP_CMD 0x0001 +#define ZT7554_IDLE_CMD 0x0004 +#define ZT7554_SLEEP_CMD 0x0005 +#define ZT7554_CLEAR_INT_STATUS_CMD 0x0003 +#define ZT7554_CALIBRATE_CMD 0x0006 +#define ZT7554_SAVE_STATUS_CMD 0x0007 +#define ZT7554_SAVE_CALIBRATION_CMD 0x0008 +#define ZT7554_RECALL_FACTORY_CMD 0x000f +#define ZT7554_THRESHOLD 0x0020 +#define ZT7554_DEBUG_REG 0x0115 /* 0~7 */ +#define ZT7554_TOUCH_MODE 0x0010 +#define ZT7554_CHIP_REVISION 0x0011 +#define ZT7554_FIRMWARE_VERSION 0x0012 +#define ZT7554_MINOR_FW_VERSION 0x0121 +#define ZT7554_VENDOR_ID 0x001C +#define ZT7554_HW_ID 0x0014 +#define ZT7554_DATA_VERSION_REG 0x0013 +#define ZT7554_SUPPORTED_FINGER_NUM 0x0015 +#define ZT7554_EEPROM_INFO 0x0018 +#define ZT7554_INITIAL_TOUCH_MODE 0x0019 +#define ZT7554_TOTAL_NUMBER_OF_X 0x0060 +#define ZT7554_TOTAL_NUMBER_OF_Y 0x0061 +#define ZT7554_DELAY_RAW_FOR_HOST 0x007f +#define ZT7554_BUTTON_SUPPORTED_NUM 0x00B0 +#define ZT7554_BUTTON_SENSITIVITY 0x00B2 +#define ZT7554_DUMMY_BUTTON_SENSITIVITY 0X00C8 +#define ZT7554_X_RESOLUTION 0x00C0 +#define ZT7554_Y_RESOLUTION 0x00C1 +#define ZT7554_POINT_STATUS_REG 0x0080 +#define ZT7554_ICON_STATUS_REG 0x00AA +#ifdef SUPPORTED_DND_SHIFT_VALUE +#define ZT7554_DND_SHIFT_VALUE 0x012B +#endif +#define ZT7554_AFE_FREQUENCY 0x0100 +#define ZT7554_DND_N_COUNT 0x0122 +#define ZT7554_DND_U_COUNT 0x0135 +#define ZT7554_RAWDATA_REG 0x0200 +#define ZT7554_EEPROM_INFO_REG 0x0018 +#define ZT7554_INT_ENABLE_FLAG 0x00f0 +#define ZT7554_PERIODICAL_INTERRUPT_INTERVAL 0x00f1 +#define ZT7554_BTN_WIDTH 0x016d +#define ZT7554_CHECKSUM_RESULT 0x012c +#define ZT7554_INIT_FLASH 0x01d0 +#define ZT7554_WRITE_FLASH 0x01d1 +#define ZT7554_READ_FLASH 0x01d2 +#define ZINITIX_INTERNAL_FLAG_02 0x011e +#define ZT7554_OPTIONAL_SETTING 0x0116 + +/* Interrupt & status register flag bit +------------------------------------------------- +*/ +#define BIT_PT_CNT_CHANGE 0 +#define BIT_DOWN 1 +#define BIT_MOVE 2 +#define BIT_UP 3 +#define BIT_PALM 4 +#define BIT_PALM_REJECT 5 +#define RESERVED_0 6 +#define RESERVED_1 7 +#define BIT_WEIGHT_CHANGE 8 +#define BIT_PT_NO_CHANGE 9 +#define BIT_REJECT 10 +#define BIT_PT_EXIST 11 +#define RESERVED_2 12 +#define BIT_MUST_ZERO 13 +#define BIT_DEBUG 14 +#define BIT_ICON_EVENT 15 + +/* button */ +#define BIT_O_ICON0_DOWN 0 +#define BIT_O_ICON1_DOWN 1 +#define BIT_O_ICON2_DOWN 2 +#define BIT_O_ICON3_DOWN 3 +#define BIT_O_ICON4_DOWN 4 +#define BIT_O_ICON5_DOWN 5 +#define BIT_O_ICON6_DOWN 6 +#define BIT_O_ICON7_DOWN 7 + +#define BIT_O_ICON0_UP 8 +#define BIT_O_ICON1_UP 9 +#define BIT_O_ICON2_UP 10 +#define BIT_O_ICON3_UP 11 +#define BIT_O_ICON4_UP 12 +#define BIT_O_ICON5_UP 13 +#define BIT_O_ICON6_UP 14 +#define BIT_O_ICON7_UP 15 + +#define SUB_BIT_EXIST 0 +#define SUB_BIT_DOWN 1 +#define SUB_BIT_MOVE 2 +#define SUB_BIT_UP 3 +#define SUB_BIT_UPDATE 4 +#define SUB_BIT_WAIT 5 + +#define zinitix_bit_set(val, n) ((val) &= ~(1<<(n)), (val) |= (1<<(n))) +#define zinitix_bit_clr(val, n) ((val) &= ~(1<<(n))) +#define zinitix_bit_test(val, n) ((val) & (1<<(n))) +#define zinitix_swap_v(a, b, t) ((t) = (a), (a) = (b), (b) = (t)) +#define zinitix_swap_16(s) (((((s) & 0xff) << 8) | (((s) >> 8) & 0xff))) + +#ifdef SEC_FACTORY_TEST +/* Touch Screen */ +#define TSP_CMD_STR_LEN 32 +#define TSP_CMD_RESULT_STR_LEN 512 +#define TSP_CMD_PARAM_NUM 8 +#define TSP_CMD_Y_NUM 22 +#define TSP_CMD_X_NUM 32 +#define TSP_CMD_NODE_NUM (TSP_CMD_Y_NUM * TSP_CMD_X_NUM) + +enum { + WAITING = 0, + RUNNING, + OK, + FAIL, + NOT_APPLICABLE, +}; +#endif + +enum power_control { + POWER_OFF, + POWER_ON, + POWER_ON_SEQUENCE, +}; + +enum key_event { + ICON_BUTTON_UNCHANGE, + ICON_BUTTON_DOWN, + ICON_BUTTON_UP, +}; + +enum work_state { + NOTHING = 0, + NORMAL, + ESD_TIMER, + EALRY_SUSPEND, + SUSPEND, + RESUME, + LATE_RESUME, + UPGRADE, + REMOVE, + SET_MODE, + HW_CALIBRAION, + RAW_DATA, + PROBE, +}; + +enum { + BUILT_IN = 0, + UMS, + REQ_FW, +}; + +struct raw_ioctl { + u32 sz; + u32 buf; +}; + +struct reg_ioctl { + u32 addr; + u32 *val; +}; + +struct coord { + u16 x; + u16 y; + u8 width; + u8 sub_status; +}; + +struct point_info { + u16 status; + u8 finger_cnt; + u8 time_stamp; + struct coord coord[MAX_SUPPORTED_FINGER_NUM]; +}; + +struct capa_info { + u16 vendor_id; + u16 ic_revision; + u16 fw_version; + u16 fw_minor_version; + u16 reg_data_version; + u16 threshold; + u16 key_threshold; + u16 dummy_threshold; + u32 ic_fw_size; + u32 MaxX; + u32 MaxY; + u32 MinX; + u32 MinY; + u8 gesture_support; + u16 multi_fingers; + u16 button_num; + u16 ic_int_mask; + u16 x_node_num; + u16 y_node_num; + u16 total_node_num; + u16 hw_id; + u16 afe_frequency; +#ifdef SUPPORTED_DND_SHIFT_VALUE + u16 shift_value; +#endif + u16 N_cnt; + u16 u_cnt; + u16 i2s_checksum; +}; +//struct zt7554_ts_info; + +struct zt7554_ts_info { + struct i2c_client *client; + struct input_dev *input_dev; + struct zt7554_ts_platform_data *pdata; + char phys[32]; + struct capa_info cap_info; + struct point_info touch_info; + struct point_info reported_touch_info; + u16 icon_event_reg; + u16 prev_icon_event; + int irq; + u8 button[MAX_SUPPORTED_BUTTON_NUM]; + u8 work_state; + struct semaphore work_lock; +#if ESD_TIMER_INTERVAL + struct work_struct tmr_work; + struct timer_list esd_timeout_tmr; + struct timer_list *p_esd_timeout_tmr; + spinlock_t lock; +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND + struct early_suspend early_suspend; +#endif + struct semaphore raw_data_lock; + u16 touch_mode; + s16 cur_data[MAX_TRAW_DATA_SZ]; + u8 update; +#ifdef SEC_FACTORY_TEST + struct tsp_factory_info *factory_info; + struct tsp_raw_data *raw_data; +#endif + u16 dnd_data[MAX_RAW_DATA_SZ]; + s16 ref_data[MAX_RAW_DATA_SZ]; + + s16 ref_scale_factor; + s16 ref_btn_option; + s16 hdiff_max_x; + s16 hdiff_max_y; + s16 hdiff_max_val; + s16 hdiff_min_x; + s16 hdiff_min_y; + s16 hdiff_min_val; + + s16 vdiff_max_x; + s16 vdiff_max_y; + s16 vdiff_max_val; + s16 vdiff_min_x; + s16 vdiff_min_y; + s16 vdiff_min_val; +#if TOUCH_BOOSTER + u8 finger_cnt; +#endif +}; + +#ifdef SEC_FACTORY_TEST +struct tsp_factory_info { + struct list_head cmd_list_head; + char cmd[TSP_CMD_STR_LEN]; + char cmd_param[TSP_CMD_PARAM_NUM]; + char cmd_result[TSP_CMD_RESULT_STR_LEN]; + char cmd_buff[TSP_CMD_RESULT_STR_LEN]; + struct mutex cmd_lock; + bool cmd_is_running; + u8 cmd_state; +}; + +struct tsp_raw_data { + u16 ref_data[TSP_CMD_NODE_NUM]; + u16 pref_data[TSP_CMD_NODE_NUM]; + s16 delta_data[TSP_CMD_NODE_NUM]; +}; + +struct tsp_cmd { + struct list_head list; + const char *cmd_name; + void (*cmd_func)(void *device_data); +}; +#endif /* SEC_FACTORY_TEST */ + +struct zt7554_ts_info *misc_info; +//static int m_ts_debug_mode = ZINITIX_DEBUG; +#if ESD_TIMER_INTERVAL +static struct workqueue_struct *esd_tmr_workqueue; +#endif +extern void (*tsp_charger_status_cb)(int); +static bool ta_connected; +#if ZINITIX_MISC_DEBUG +static struct miscdevice touch_misc_device; +#endif +static u16 m_optional_mode; +static u16 m_prev_optional_mode; + +extern struct class *sec_class; + + +#ifdef CONFIG_HAS_EARLYSUSPEND +static void zt7554_ts_early_suspend(struct early_suspend *h); +static void zt7554_ts_late_resume(struct early_suspend *h); +#endif +static bool zt7554_power_control(struct zt7554_ts_info *info, u8 ctl); +static int zt7554_power(struct i2c_client *client, int on, int gpio_ctrl_pin); +static bool init_touch(struct zt7554_ts_info *info); +static bool mini_init_touch(struct zt7554_ts_info *info); +static void clear_report_data(struct zt7554_ts_info *info); +#if ESD_TIMER_INTERVAL +static void esd_timer_start(u16 sec, struct zt7554_ts_info *info); +static void esd_timer_stop(struct zt7554_ts_info *info); +static void esd_timer_init(struct zt7554_ts_info *info); +static void esd_timeout_handler(unsigned long data); +#endif +//long ts_misc_fops_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); +//int ts_misc_fops_open(struct inode *inode, struct file *filp); +//int ts_misc_fops_close(struct inode *inode, struct file *filp); + +#ifdef SEC_FACTORY_TEST +static void fw_update(void *device_data); +static void get_fw_ver_bin(void *device_data); +static void get_fw_ver_ic(void *device_data); +static void get_threshold(void *device_data); +static void get_chip_vendor(void *device_data); +static void get_chip_name(void *device_data); +static void get_x_num(void *device_data); +static void get_y_num(void *device_data); +static void not_support_cmd(void *device_data); +/* Vendor dependant command */ +static void run_reference_read(void *device_data); +static void run_reference_PDiff(void *device_data); +static void get_reference(void *device_data); +static void run_preference_read(void *device_data); +static void get_preference(void *device_data); +static void run_delta_read(void *device_data); +static void get_delta(void *device_data); +#endif + +int ts_upgrade_sequence(const u8 *firmware_data); +bool ts_hw_calibration(struct zt7554_ts_info *info); +s32 write_reg(struct i2c_client *client, u16 reg, u16 value); +s32 write_cmd(struct i2c_client *client, u16 reg); +bool ts_set_touchmode(u16 value); +s32 read_data(struct i2c_client *client, u16 reg, u8 *values, u16 length); diff --git a/drivers/input/touchscreen/zt7554_ts_spec.h b/drivers/input/touchscreen/zt7554_ts_spec.h new file mode 100755 index 00000000..c9abcae6 --- /dev/null +++ b/drivers/input/touchscreen/zt7554_ts_spec.h @@ -0,0 +1,132 @@ +////////////////////////////////////////////////////spec/////////////////////////////////////////////////// +//HW_ID 0x0 ITO +const u16 dnd_v_diff_00[29][18]={ + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + { 0, 0, 4000, 0 , 4000, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4000, 0 , 4000, 0 , 0 }}; + +const u16 dnd_h_diff_00[29][17]={ + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}, + {3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500, 3500}}; + + + + + +//HW_ID 0x03 MI +const u16 dnd_v_diff_03[29][18]={ + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + { 0, 0, 4000, 0 , 4000, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 4000, 0 , 4000, 0 , 0 }}; + + + +const u16 dnd_h_diff_03[29][17]={ + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}, + {4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000, 4000}}; diff --git a/drivers/input/touchscreen/zylonite-wm97xx.c b/drivers/input/touchscreen/zylonite-wm97xx.c new file mode 100644 index 00000000..bf0869a7 --- /dev/null +++ b/drivers/input/touchscreen/zylonite-wm97xx.c @@ -0,0 +1,232 @@ +/* + * zylonite-wm97xx.c -- Zylonite Continuous Touch screen driver + * + * Copyright 2004, 2007, 2008 Wolfson Microelectronics PLC. + * Author: Mark Brown + * Parts Copyright : Ian Molton + * Andrew Zabolotny + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * Notes: + * This is a wm97xx extended touch driver supporting interrupt driven + * and continuous operation on Marvell Zylonite development systems + * (which have a WM9713 on board). + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +struct continuous { + u16 id; /* codec id */ + u8 code; /* continuous code */ + u8 reads; /* number of coord reads per read cycle */ + u32 speed; /* number of coords per second */ +}; + +#define WM_READS(sp) ((sp / HZ) + 1) + +static const struct continuous cinfo[] = { + { WM9713_ID2, 0, WM_READS(94), 94 }, + { WM9713_ID2, 1, WM_READS(120), 120 }, + { WM9713_ID2, 2, WM_READS(154), 154 }, + { WM9713_ID2, 3, WM_READS(188), 188 }, +}; + +/* continuous speed index */ +static int sp_idx; + +/* + * Pen sampling frequency (Hz) in continuous mode. + */ +static int cont_rate = 200; +module_param(cont_rate, int, 0); +MODULE_PARM_DESC(cont_rate, "Sampling rate in continuous mode (Hz)"); + +/* + * Pressure readback. + * + * Set to 1 to read back pen down pressure + */ +static int pressure; +module_param(pressure, int, 0); +MODULE_PARM_DESC(pressure, "Pressure readback (1 = pressure, 0 = no pressure)"); + +/* + * AC97 touch data slot. + * + * Touch screen readback data ac97 slot + */ +static int ac97_touch_slot = 5; +module_param(ac97_touch_slot, int, 0); +MODULE_PARM_DESC(ac97_touch_slot, "Touch screen data slot AC97 number"); + + +/* flush AC97 slot 5 FIFO machines */ +static void wm97xx_acc_pen_up(struct wm97xx *wm) +{ + int i; + + msleep(1); + + for (i = 0; i < 16; i++) + MODR; +} + +static int wm97xx_acc_pen_down(struct wm97xx *wm) +{ + u16 x, y, p = 0x100 | WM97XX_ADCSEL_PRES; + int reads = 0; + static u16 last, tries; + + /* When the AC97 queue has been drained we need to allow time + * to buffer up samples otherwise we end up spinning polling + * for samples. The controller can't have a suitably low + * threshold set to use the notifications it gives. + */ + msleep(1); + + if (tries > 5) { + tries = 0; + return RC_PENUP; + } + + x = MODR; + if (x == last) { + tries++; + return RC_AGAIN; + } + last = x; + do { + if (reads) + x = MODR; + y = MODR; + if (pressure) + p = MODR; + + dev_dbg(wm->dev, "Raw coordinates: x=%x, y=%x, p=%x\n", + x, y, p); + + /* are samples valid */ + if ((x & WM97XX_ADCSEL_MASK) != WM97XX_ADCSEL_X || + (y & WM97XX_ADCSEL_MASK) != WM97XX_ADCSEL_Y || + (p & WM97XX_ADCSEL_MASK) != WM97XX_ADCSEL_PRES) + goto up; + + /* coordinate is good */ + tries = 0; + input_report_abs(wm->input_dev, ABS_X, x & 0xfff); + input_report_abs(wm->input_dev, ABS_Y, y & 0xfff); + input_report_abs(wm->input_dev, ABS_PRESSURE, p & 0xfff); + input_report_key(wm->input_dev, BTN_TOUCH, (p != 0)); + input_sync(wm->input_dev); + reads++; + } while (reads < cinfo[sp_idx].reads); +up: + return RC_PENDOWN | RC_AGAIN; +} + +static int wm97xx_acc_startup(struct wm97xx *wm) +{ + int idx; + + /* check we have a codec */ + if (wm->ac97 == NULL) + return -ENODEV; + + /* Go you big red fire engine */ + for (idx = 0; idx < ARRAY_SIZE(cinfo); idx++) { + if (wm->id != cinfo[idx].id) + continue; + sp_idx = idx; + if (cont_rate <= cinfo[idx].speed) + break; + } + wm->acc_rate = cinfo[sp_idx].code; + wm->acc_slot = ac97_touch_slot; + dev_info(wm->dev, + "zylonite accelerated touchscreen driver, %d samples/sec\n", + cinfo[sp_idx].speed); + + return 0; +} + +static void wm97xx_irq_enable(struct wm97xx *wm, int enable) +{ + if (enable) + enable_irq(wm->pen_irq); + else + disable_irq_nosync(wm->pen_irq); +} + +static struct wm97xx_mach_ops zylonite_mach_ops = { + .acc_enabled = 1, + .acc_pen_up = wm97xx_acc_pen_up, + .acc_pen_down = wm97xx_acc_pen_down, + .acc_startup = wm97xx_acc_startup, + .irq_enable = wm97xx_irq_enable, + .irq_gpio = WM97XX_GPIO_2, +}; + +static int zylonite_wm97xx_probe(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + int gpio_touch_irq; + + if (cpu_is_pxa320()) + gpio_touch_irq = mfp_to_gpio(MFP_PIN_GPIO15); + else + gpio_touch_irq = mfp_to_gpio(MFP_PIN_GPIO26); + + wm->pen_irq = gpio_to_irq(gpio_touch_irq); + irq_set_irq_type(wm->pen_irq, IRQ_TYPE_EDGE_BOTH); + + wm97xx_config_gpio(wm, WM97XX_GPIO_13, WM97XX_GPIO_IN, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_STICKY, + WM97XX_GPIO_WAKE); + wm97xx_config_gpio(wm, WM97XX_GPIO_2, WM97XX_GPIO_OUT, + WM97XX_GPIO_POL_HIGH, + WM97XX_GPIO_NOTSTICKY, + WM97XX_GPIO_NOWAKE); + + return wm97xx_register_mach_ops(wm, &zylonite_mach_ops); +} + +static int zylonite_wm97xx_remove(struct platform_device *pdev) +{ + struct wm97xx *wm = platform_get_drvdata(pdev); + + wm97xx_unregister_mach_ops(wm); + + return 0; +} + +static struct platform_driver zylonite_wm97xx_driver = { + .probe = zylonite_wm97xx_probe, + .remove = zylonite_wm97xx_remove, + .driver = { + .name = "wm97xx-touch", + }, +}; +module_platform_driver(zylonite_wm97xx_driver); + +/* Module information */ +MODULE_AUTHOR("Mark Brown "); +MODULE_DESCRIPTION("wm97xx continuous touch driver for Zylonite"); +MODULE_LICENSE("GPL"); -- cgit v1.3.1